ZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvLmNsYXNzcGF0aCBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLy5jdnNpZ25vcmUgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLy5vcHRpb25zIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkxODFhZS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIERlYnVnZ2luZyBvcHRpb25zIGZvciB0aGUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIHBsdWctaW4NCi0NCi0jIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcgZm9yIHRoZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcgcGx1Zy1pbg0KLW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9kZWJ1Zz1mYWxzZQ0KLQ0KLSMgVHVybiBvbiBkZWJ1Z2dpbmcgb2YgdmlzdWFsSUQgcHJvY2Vzc2luZw0KLW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9kZWJ1Zy92aXN1YWxJRD10cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy8ucHJvamVjdCBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwN2EyOTEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzYxZTAuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmc7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuRVBGRGlhZ3JhbUVkaXRvclBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuY29tbWFuZHMsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGFydHMsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2UsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cywKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmpmYWNlLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS51aS52aWV3cywKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWksCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWksCi0gb3JnLmVjbGlwc2UuZ2VmO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5wcm9wZXJ0aWVzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuaWRlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVuZGVyO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvcjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLnByb3ZpZGVyczt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS51bWwyLnVtbDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS51bWwyLnVtbC5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZHJhdzJkO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi51bWEsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnksCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5nZW9zaGFwZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2J1aWxkLnByb3BlcnRpZXMgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOTJkYjkuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2RpYWdyYW0vYWN0aXZpdHkuZ2lmIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9kaWFncmFtL2FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczOTNlNi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2RpYWdyYW0vYWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9kaWFncmFtL2l0ZXJhdGlvbi5naWYgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2RpYWdyYW0vaXRlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjOGExNC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2RpYWdyYW0vaXRlcmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZGlhZ3JhbS9taWxlc3RvbmUuZ2lmIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9kaWFncmFtL21pbGVzdG9uZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NmZmOTQuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9kaWFncmFtL21pbGVzdG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2RpYWdyYW0vcGhhc2UuZ2lmIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9kaWFncmFtL3BoYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVjYjNjZC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2RpYWdyYW0vcGhhc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9kaWFncmFtL3Rhc2tkZXNjcmlwdG9yLmdpZiBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZGlhZ3JhbS90YXNrZGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NWQ2NTEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9kaWFncmFtL3Rhc2tkZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZGlhZ3JhbS90YXNrZGVzY3JpcHRvcjEuZ2lmIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9kaWFncmFtL3Rhc2tkZXNjcmlwdG9yMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NWQ2NTEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9kaWFncmFtL3Rhc2tkZXNjcmlwdG9yMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RmluYWxOb2RlLmdpZiBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eUZpbmFsTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNDk3MjguLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RmluYWxOb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eVBhcnRpdGlvbi5naWYgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlQYXJ0aXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDFiMDllLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eVBhcnRpdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQ29udHJvbEZsb3cuZ2lmIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0NvbnRyb2xGbG93LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwYzIyMy4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQ29udHJvbEZsb3cuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0RlY2lzaW9uTm9kZS5naWYgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvRGVjaXNpb25Ob2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhNjAxYy4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvRGVjaXNpb25Ob2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Gb3JrTm9kZS5naWYgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvRm9ya05vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2MyMGIzLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Gb3JrTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSW5pdGlhbE5vZGUuZ2lmIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0luaXRpYWxOb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc1Y2Y3OC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSW5pdGlhbE5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0l0ZXJhdGlvbi5naWYgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxMWU0Ni4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Kb2luTm9kZS5naWYgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSm9pbk5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGMzYTM5Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Kb2luTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvTWVyZ2VOb2RlLmdpZiBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9NZXJnZU5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzRjYjk2Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9NZXJnZU5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZS5naWYgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvTWlsZXN0b25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2MTVlYi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvTWlsZXN0b25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9QaGFzZS5naWYgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvUGhhc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDYwYmQ5Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9QaGFzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS5naWYgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MGZiMjkuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yLmdpZiBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NGUyNmUuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9kZWxldGUuZ2lmIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L2RlbGV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OTIyYWMuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L2RlbGV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL29iajE2L1VNTERpYWdyYW1GaWxlLmdpZiBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvb2JqMTYvVU1MRGlhZ3JhbUZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTkzODA3Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvb2JqMTYvVU1MRGlhZ3JhbUZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy93aXpiYW4vTmV3VU1MV2l6YXJkLmdpZiBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvd2l6YmFuL05ld1VNTFdpemFyZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZTAzYmYuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy93aXpiYW4vTmV3VU1MV2l6YXJkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvbW9kZWwvZXBmZGlhZ3JhbS5nbWZnZW4gYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL21vZGVsL2VwZmRpYWdyYW0uZ21mZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjQ5YjgzLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvbW9kZWwvZXBmZGlhZ3JhbS5nbWZnZW4KKysrIC9kZXYvbnVsbApAQCAtMSw5MTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6Z21mZ2VuPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L0dlbk1vZGVsIiBwYWNrYWdlTmFtZVByZWZpeD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIgotICAgIG1vZGVsSUQ9IkFEIgotICAgIHNhbWVGaWxlRm9yRGlhZ3JhbUFuZE1vZGVsPSJ0cnVlIgotICAgIGRpYWdyYW1GaWxlRXh0ZW5zaW9uPSJ4bWkiCi0gICAgdGVtcGxhdGVEaXJlY3Rvcnk9IiIKLSAgICBjb3B5cmlnaHRUZXh0PSIgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiYjeEQ7JiN4QTsgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyYjeEQ7JiN4QTsgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wJiN4RDsmI3hBOyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCYjeEQ7JiN4QTsgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmI3hEOyYjeEE7JiN4RDsmI3hBOyBDb250cmlidXRvcnM6JiN4RDsmI3hBOyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uJiN4RDsmI3hBOyI+Ci0gIDxkaWFncmFtCi0gICAgICB2aXN1YWxJRD0iNzkiCi0gICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlFZGl0UGFydCIKLSAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5SXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5Vmlld0ZhY3RvcnkiCi0gICAgICBpY29uUHJvdmlkZXJQcmlvcml0eT0iTG93IgotICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgdmFsaWRhdGlvblByb3ZpZGVyQ2xhc3NOYW1lPSJWYWxpZGF0aW9uUHJvdmlkZXIiCi0gICAgICBtZXRyaWNQcm92aWRlckNsYXNzTmFtZT0iTWV0cmljUHJvdmlkZXIiCi0gICAgICB2YWxpZGF0aW9uRGVjb3JhdG9yUHJvdmlkZXJDbGFzc05hbWU9IlZhbGlkYXRpb25EZWNvcmF0b3JQcm92aWRlciI+Ci0gICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRGlhZ3JhbSIvPgotICAgIDxlbGVtZW50VHlwZQotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkFjdGl2aXR5RWRpdEhlbHBlciIvPgotICAgIDx2aWV3bWFwCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllciIvPgotICAgIDxkb21haW5EaWFncmFtRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkiLz4KLSAgICA8Y2hpbGROb2RlcwotICAgICAgICB2aXN1YWxJRD0iMjAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbjJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbjJWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb24yQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgY29tcGFydG1lbnRzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IgotICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIgotICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNy9AZWxlbWVudFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckFkdmljZUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyQWR2aWNlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgbGF5b3V0VHlwZT0iWFlfTEFZT1VUIgotICAgICAgICAgIGNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQgbXlHZW5MYXlvdXRNYW5hZ2VyID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0TGF5b3V0TWFuYWdlcihteUdlbkxheW91dE1hbmFnZXIpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuYmxhY2smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNDAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4MDApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMjAwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJvcmRlcigmI3hEOyYjeEE7bmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyKCkmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmUGFydGl0aW9uTGFiZWxGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmUGFydGl0aW9uTGFiZWxGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmUGFydGl0aW9uTGFiZWxGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMjU1KTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlQYXJ0aXRpb24iLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eVBhcnRpdGlvbi9zdWJwYXJ0aXRpb24iLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eVBhcnRpdGlvbi9zdWJwYXJ0aXRpb24iLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwNiIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25OYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbk5hbWVWaWV3RmFjdG9yeSIKLSAgICAgICAgICBlbGVtZW50SWNvbj0idHJ1ZSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmUKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvY2hpbGROb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkVuZE5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgRW5kTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5nbWYudW1sLm1vZGVsLkVuZE5vZGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEVuZE5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUmI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihFTkROT0RFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIEVORE5PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgNDUsIDg1LCAxMzApOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEZvcmVncm91bmQ9InRydWUiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eUZpbmFsTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5FeHRlcm5hbE5vZGVMYWJlbCIKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMSIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmUKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9Ik1lcmdlTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNZXJnZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJNZXJnZU5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iTWVyZ2VOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9Ik1lcmdlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9Ik1lcmdlTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkRlY2lzaW9uRGlhbW9uZEZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmdlb3NoYXBlcy5pbnRlcm5hbC5kcmF3MmQuZmlndXJlcy5HZW9TaGFwZURpYW1vbmRGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5kYXJrQmx1ZSYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKERFQ0lTSU9ORElBTU9OREZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVEaWFtb25kTGFiZWwoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZEaWFtb25kTGFiZWw7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVEaWFtb25kTGFiZWwoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkRpYW1vbmRMYWJlbDsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVEaWFtb25kTGFiZWwob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmRGlhbW9uZExhYmVsID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgREVDSVNJT05ESUFNT05ERklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDE4NSwgMjA1LCAyMzApOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEZvcmVncm91bmQ9InRydWUiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9NZXJnZU5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDAyIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJNZXJnZU5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTWVyZ2VOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTWVyZ2VOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgICBjbGFzc05hbWU9Ik5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgTm9kZU5hbWVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIE5vZGVOYW1lRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFRleHQoJnF1b3Q7Jmx0Oy4uLj4mcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZQotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDAzIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iRm9ya05vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iRm9ya05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJGb3JrTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJGb3JrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJGb3JrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkZvcmtOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iRm9ya05vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgRm9ya05vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBGb3JrTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihGT1JLTk9ERUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBGT1JLTk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCA1MSwgMTAyLCAxMDIpOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UmVzaXplQ29uc3RyYWludHMiCi0gICAgICAgICAgICByZXNpemVIYW5kbGVzPSIyNCIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0ZvcmtOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDQiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJJbml0aWFsTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJJbml0aWFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkluaXRpYWxOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkluaXRpYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkluaXRpYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iSW5pdGlhbE5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJJbml0aWFsTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBJbml0aWFsTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5FbGxpcHNlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBJbml0aWFsTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5kYXJrQmx1ZSYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKElOSVRJQUxOT0RFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMjApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBJTklUSUFMTk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAxODUsIDIwNSwgMjMwKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvSW5pdGlhbE5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRXh0ZXJuYWxOb2RlTGFiZWwiCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDMiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkluaXRpYWxOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iSW5pdGlhbE5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iIgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDUiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iRGVjaXNpb25Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iRGVjaXNpb25Ob2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkRlY2lzaW9uTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJEZWNpc2lvbkRpYW1vbmRGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgRGVjaXNpb25EaWFtb25kRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5nZW9zaGFwZXMuaW50ZXJuYWwuZHJhdzJkLmZpZ3VyZXMuR2VvU2hhcGVEaWFtb25kRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUmI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihERUNJU0lPTkRJQU1PTkRGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlRGlhbW9uZExhYmVsKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmRGlhbW9uZExhYmVsOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlRGlhbW9uZExhYmVsKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZEaWFtb25kTGFiZWw7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlRGlhbW9uZExhYmVsKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZkRpYW1vbmRMYWJlbCA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIERFQ0lTSU9ORElBTU9OREZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAxODUsIDIwNSwgMjMwKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvRGVjaXNpb25Ob2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwNCIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkRlY2lzaW9uTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkRlY2lzaW9uTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIE5vZGVOYW1lRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBOb2RlTmFtZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRUZXh0KCZxdW90OyZsdDsuLi4+JnF1b3Q7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmUKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwNiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkpvaW5Ob2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkpvaW5Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iSm9pbk5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iSm9pbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iSm9pbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJKb2luTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkZvcmtOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEZvcmtOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgRm9ya05vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRk9SS05PREVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoOCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgRk9SS05PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgNTEsIDEwMiwgMTAyKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlJlc2l6ZUNvbnN0cmFpbnRzIgotICAgICAgICAgICAgcmVzaXplSGFuZGxlcz0iMjQiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9Kb2luTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDA3IgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBO2ZpZ18wLnNldFRleHQoJnF1b3Q7Jmx0Oy4uLj4mcXVvdDspOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZOb2RlTmFtZUZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZOb2RlTmFtZUZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZOb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRTZWxlY3RvcgotICAgICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9BY3Rpdml0eSIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRJbml0aWFsaXplcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9BY3Rpdml0eSYjeEQ7JiN4QTsiCi0gICAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5nZW5tb2RlbCMvL2Vjb3JlL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICAgIDwvbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXI+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDUiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIi8+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZQotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDA4IgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25JdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjAiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGxheW91dFR5cGU9IlhZX0xBWU9VVCIKLSAgICAgICAgICBjbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0IG15R2VuTGF5b3V0TWFuYWdlciA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQoKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldExheW91dE1hbmFnZXIobXlHZW5MYXlvdXRNYW5hZ2VyKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmJsYWNrJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQUNUSVZJVFlQQVJUSVRJT05GSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDQwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoODAwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDIwMCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCb3JkZXIoJiN4RDsmI3hBO25ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcigpJiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZlBhcnRpdGlvbkxhYmVsRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlBhcnRpdGlvbkxhYmVsRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZlBhcnRpdGlvbkxhYmVsRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgQUNUSVZJVFlQQVJUSVRJT05GSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDI1NSk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5UGFydGl0aW9uIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvZ3JvdXAiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ncm91cCIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA3IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25OYW1lMlZpZXdGYWN0b3J5IgotICAgICAgICAgIGVsZW1lbnRJY29uPSJ0cnVlIj4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZQotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDA5IgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWw7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudFNlbGVjdG9yCi0gICAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX1Rhc2tEZXNjcmlwdG9yIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudEluaXRpYWxpemVyCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX1Rhc2tEZXNjcmlwdG9yIgotICAgICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZS9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgICA8L21vZGVsRWxlbWVudEluaXRpYWxpemVyPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA4IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMTAiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSIKLSAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjYvQGVsZW1lbnRUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJBZHZpY2VDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyQWR2aWNlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7ZmlnXzAuc2V0VGV4dCgmcXVvdDsmbHQ7Li4uPiZxdW90Oyk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZk5vZGVOYW1lRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZk5vZGVOYW1lRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZU5vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7Zk5vZGVOYW1lRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudFNlbGVjdG9yCi0gICAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX1BoYXNlIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudEluaXRpYWxpemVyCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX1BoYXNlIgotICAgICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZS9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgICA8L21vZGVsRWxlbWVudEluaXRpYWxpemVyPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA5IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMlZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmUKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAxMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIgotICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNi9AZWxlbWVudFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckFkdmljZUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0SGVscGVyQWR2aWNlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7ZmlnXzAuc2V0VGV4dCgmcXVvdDsmbHQ7Li4uPiZxdW90Oyk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZk5vZGVOYW1lRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZk5vZGVOYW1lRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZU5vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7Zk5vZGVOYW1lRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudFNlbGVjdG9yCi0gICAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX0l0ZXJhdGlvbiIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRJbml0aWFsaXplcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9JdGVyYXRpb24iCi0gICAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5nZW5tb2RlbCMvL2Vjb3JlL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICAgIDwvbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXI+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMTAiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIi8+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZQotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDEyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMlZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIgotICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOC9AZWxlbWVudFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckFkdmljZUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlckFkdmljZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWw7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudFNlbGVjdG9yCi0gICAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX01pbGVzdG9uZSIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRJbml0aWFsaXplcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9NaWxlc3RvbmUiCi0gICAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5nZW5tb2RlbCMvL2Vjb3JlL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICAgIDwvbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXI+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMTEiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmUKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8bGlua3MKLSAgICAgICAgdmlzdWFsSUQ9IjMwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDb250cm9sRmxvd0VkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb250cm9sRmxvd0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbnRyb2xGbG93Vmlld0ZhY3RvcnkiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9FZGdlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iQ29udHJvbEZsb3dFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJDb250cm9sRmxvd0ZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBDb250cm9sRmxvd0ZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLlBvbHlsaW5lQ29ubmVjdGlvbkV4IHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBDb250cm9sRmxvd0ZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRUYXJnZXREZWNvcmF0aW9uKGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbiBjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkgeyYjeEQ7JiN4QTtvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uIGRmID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24oKTsmI3hEOyYjeEE7Ly8gZGlzcGF0Y2hOZXh0PyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QgcGwgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoLTEsIDEpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoMCwgMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgtMSwgLTEpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZGYuc2V0VGVtcGxhdGUocGwpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZGYuc2V0U2NhbGUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg3KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgzKSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGRmOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlR5cGVMaW5rTW9kZWxGYWNldCI+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9Db250cm9sRmxvdyIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUvZWRnZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUvZWRnZSIvPgotICAgICAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eUVkZ2Uvc291cmNlIi8+Ci0gICAgICAgIDx0YXJnZXRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5RWRnZS90YXJnZXQiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAxMiIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29udHJvbEZsb3dOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDb250cm9sRmxvd05hbWVWaWV3RmFjdG9yeSIKLSAgICAgICAgICBlbGVtZW50SWNvbj0idHJ1ZSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJDb250cm9sRmxvd0xhYmVsRmlndXJlIgotICAgICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dMYWJlbEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgQ29udHJvbEZsb3dMYWJlbEZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRUZXh0KCZxdW90OyZxdW90Oyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkxhYmVsT2Zmc2V0QXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgeT0iNDAiLz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZQotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9saW5rcz4KLSAgICA8Y29tcGFydG1lbnRzCi0gICAgICAgIHZpc3VhbElEPSI1MDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudFZpZXdGYWN0b3J5IgotICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICB0aXRsZT0iUGFydGl0aW9uQ2FtcGFydG1lbnQiCi0gICAgICAgIGNhbkNvbGxhcHNlPSJmYWxzZSIKLSAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiCi0gICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNyIKLSAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8Y29tcGFydG1lbnRzCi0gICAgICAgIHZpc3VhbElEPSI1MDAyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MlZpZXdGYWN0b3J5IgotICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgdGl0bGU9IlBhcnRpdGlvbkNhbXBhcnRtZW50IgotICAgICAgICBjYW5Db2xsYXBzZT0iZmFsc2UiCi0gICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIgotICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiCi0gICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPHBhbGV0dGU+Ci0gICAgICA8Z3JvdXBzCi0gICAgICAgICAgdGl0bGU9IkZsb3dzIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGlvbiB0b29sIGZvciBmbG93cyIKLSAgICAgICAgICBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJMaW5rIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgTGluayIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Db250cm9sRmxvdy5naWYiCi0gICAgICAgICAgICBnZW5MaW5rcz0iLy9AZGlhZ3JhbS9AbGlua3MuMCIvPgotICAgICAgPC9ncm91cHM+Ci0gICAgICA8Z3JvdXBzCi0gICAgICAgICAgdGl0bGU9Ik5vZGVzIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGlvbiB0b29sIGdyb3VwIGZvciBub2RlcyIKLSAgICAgICAgICBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJBY3Rpdml0eSBQYXJ0aXRpb24iCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBBY3Rpdml0eSBQYXJ0aXRpb24iCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlQYXJ0aXRpb24uZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IlN0YXJ0IE5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBTdGFydCBOb2RlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0luaXRpYWxOb2RlLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjMiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkZvcmsgTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEZvcmsgTm9kZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Gb3JrTm9kZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4yIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJNZXJnZSBOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgTWVyZ2UgTm9kZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9NZXJnZU5vZGUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iRGVjaXNpb24gTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IERlY2lzaW9uIE5vZGUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvRGVjaXNpb25Ob2RlLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjQiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkVuZCBOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgRW5kIE5vZGUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlGaW5hbE5vZGUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iSm9pbiBOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgSm9pbiBOb2RlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0pvaW5Ob2RlLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjUiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U2VwYXJhdG9yIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJBY3Rpdml0eSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEFjdGl2aXR5IgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjYiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IlBoYXNlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgUGhhc2UiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvUGhhc2UuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOSIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iSXRlcmF0aW9uIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgSXRlcmF0aW9uIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0l0ZXJhdGlvbi5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xMCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iVGFzayBEZXNjcmlwdG9yIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgVGFzayBEZXNjcmlwdG9yIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjgiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9Ik1pbGVzdG9uZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IE1pbGVzdG9uZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9NaWxlc3RvbmUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMTEiLz4KLSAgICAgIDwvZ3JvdXBzPgotICAgIDwvcGFsZXR0ZT4KLSAgPC9kaWFncmFtPgotICA8cGx1Z2luCi0gICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIgotICAgICAgbmFtZT0iRVBGIERpYWdyYW1taW5nIFBsdWdpbiIKLSAgICAgIHByb3ZpZGVyPSJJQk0gUmF0aW9uYWwiCi0gICAgICBhY3RpdmF0b3JDbGFzc05hbWU9IkVQRkRpYWdyYW1FZGl0b3JQbHVnaW4iLz4KLSAgPGVkaXRvcgotICAgICAgY2xhc3NOYW1lPSJEaWFncmFtRWRpdG9yIi8+Ci0gIDxkb21haW5HZW5Nb2RlbAotICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8iLz4KLSAgPGV4cHJlc3Npb25Qcm92aWRlcnM+Ci0gICAgPHByb3ZpZGVycwotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkphdmFFeHByZXNzaW9uUHJvdmlkZXIiCi0gICAgICAgIGV4cHJlc3Npb25zPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjYvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudFNlbGVjdG9yIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNi9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIvQGluaXRpYWxpemVycy4wIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOC9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50U2VsZWN0b3IgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy44L0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRJbml0aWFsaXplci9AaW5pdGlhbGl6ZXJzLjAgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy45L0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRTZWxlY3RvciAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjkvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudEluaXRpYWxpemVyL0Bpbml0aWFsaXplcnMuMCAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEwL0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRTZWxlY3RvciAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEwL0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRJbml0aWFsaXplci9AaW5pdGlhbGl6ZXJzLjAgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xMS9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50U2VsZWN0b3IgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xMS9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIvQGluaXRpYWxpemVycy4wIi8+Ci0gIDwvZXhwcmVzc2lvblByb3ZpZGVycz4KLTwvZ21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvcj4KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvbW9kZWwvZXBmZGlhZ3JhbS5nbWZncmFwaCBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvbW9kZWwvZXBmZGlhZ3JhbS5nbWZncmFwaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA5OGI5My4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL21vZGVsL2VwZmRpYWdyYW0uZ21mZ3JhcGgKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZncmFwaDpDYW52YXMgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczpnbWZncmFwaD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9HcmFwaGljYWxEZWZpbml0aW9uIiBuYW1lPSJ1bWwiPgotICA8ZmlndXJlcwotICAgICAgbmFtZT0iRGVmYXVsdCI+Ci0gICAgPGZpZ3VyZXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJlY3RhbmdsZSIKLSAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIKLSAgICAgICAgbmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIKLSAgICAgICAgb3V0bGluZT0iZmFsc2UiPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIgotICAgICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9Ik5vZGVOYW1lIEFjdGl2aXR5Tm9kZU5hbWUgSW5pdGlhbE5vZGVOYW1lIEZvcmtOb2RlTmFtZSBEZWNpc2lvbk5vZGVOYW1lIgotICAgICAgICAgIG5hbWU9Ik5vZGVOYW1lRmlndXJlIgotICAgICAgICAgIHRleHQ9IiZsdDsuLi4+Ii8+Ci0gICAgPC9maWd1cmVzPgotICAgIDxmaWd1cmVzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiCi0gICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IkFjdGl2aXR5UGFydGl0aW9uIgotICAgICAgICBuYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSI+Ci0gICAgICA8bGF5b3V0RGF0YQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpYWUxheW91dERhdGEiPgotICAgICAgICA8c2l6ZQotICAgICAgICAgICAgZHg9IjEwMCIKLSAgICAgICAgICAgIGR5PSIyMDAiLz4KLSAgICAgIDwvbGF5b3V0RGF0YT4KLSAgICAgIDxsYXlvdXQKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6WFlMYXlvdXQiLz4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCIKLSAgICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJQYXJ0aXRpb25OYW1lIgotICAgICAgICAgIG5hbWU9IlBhcnRpdGlvbkxhYmVsRmlndXJlIi8+Ci0gICAgICA8Zm9yZWdyb3VuZENvbG9yCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkNvbnN0YW50Q29sb3IiCi0gICAgICAgICAgdmFsdWU9ImJsYWNrIi8+Ci0gICAgICA8YmFja2dyb3VuZENvbG9yCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJHQkNvbG9yIgotICAgICAgICAgIHJlZD0iMjU1IgotICAgICAgICAgIGdyZWVuPSIyNTUiCi0gICAgICAgICAgYmx1ZT0iMjU1Ii8+Ci0gICAgICA8cHJlZmVycmVkU2l6ZQotICAgICAgICAgIGR4PSI0MDAiCi0gICAgICAgICAgZHk9IjgwMCIvPgotICAgICAgPGJvcmRlcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMaW5lQm9yZGVyIi8+Ci0gICAgICA8c2l6ZQotICAgICAgICAgIHg9IjEwMCIKLSAgICAgICAgICB5PSIyMDAiLz4KLSAgICA8L2ZpZ3VyZXM+Ci0gICAgPGZpZ3VyZXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlBvbHlsaW5lQ29ubmVjdGlvbiIKLSAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iQ29udHJvbEZsb3ciCi0gICAgICAgIG5hbWU9IkNvbnRyb2xGbG93RmlndXJlIgotICAgICAgICB0YXJnZXREZWNvcmF0aW9uPSJPcGVuQXJyb3ciPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlBvbHlsaW5lRGVjb3JhdGlvbiIKLSAgICAgICAgICBuYW1lPSJPcGVuQXJyb3ciPgotICAgICAgICA8dGVtcGxhdGUKLSAgICAgICAgICAgIHg9Ii0xIgotICAgICAgICAgICAgeT0iMSIvPgotICAgICAgICA8dGVtcGxhdGUvPgotICAgICAgICA8dGVtcGxhdGUKLSAgICAgICAgICAgIHg9Ii0xIgotICAgICAgICAgICAgeT0iLTEiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iQ29udHJvbEZsb3dMYWJlbCIKLSAgICAgICAgICBuYW1lPSJDb250cm9sRmxvd0xhYmVsRmlndXJlIgotICAgICAgICAgIHRleHQ9IiIvPgotICAgIDwvZmlndXJlcz4KLSAgICA8ZmlndXJlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UmVjdGFuZ2xlIgotICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJGb3JrTm9kZSBKb2luTm9kZSIKLSAgICAgICAgbmFtZT0iRm9ya05vZGVGaWd1cmUiPgotICAgICAgPGJhY2tncm91bmRDb2xvcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSR0JDb2xvciIKLSAgICAgICAgICByZWQ9IjUxIgotICAgICAgICAgIGdyZWVuPSIxMDIiCi0gICAgICAgICAgYmx1ZT0iMTAyIi8+Ci0gICAgICA8cHJlZmVycmVkU2l6ZQotICAgICAgICAgIGR4PSIxMDAiCi0gICAgICAgICAgZHk9IjgiLz4KLSAgICAgIDxzaXplCi0gICAgICAgICAgeD0iMTAwIgotICAgICAgICAgIHk9IjgiLz4KLSAgICA8L2ZpZ3VyZXM+Ci0gICAgPGZpZ3VyZXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlBvbHlnb24iCi0gICAgICAgIG5hbWU9IkRlY2lzaW9uRGlhbW9uZFBvbHlnb25GaWd1cmVfb2xkIj4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCIKLSAgICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJNZXJnZU5vZGVQb2x5Z29uTGFiZWwiCi0gICAgICAgICAgbmFtZT0iTWVyZ2VOb2RlUG9seWdvbkxhYmVsRmlndXJlIgotICAgICAgICAgIHRleHQ9Ik1lcmdlTm9kZSIvPgotICAgICAgPGZvcmVncm91bmRDb2xvcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSR0JDb2xvciIKLSAgICAgICAgICBncmVlbj0iMjAwIgotICAgICAgICAgIGJsdWU9IjEwMCIvPgotICAgICAgPGJhY2tncm91bmRDb2xvcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpDb25zdGFudENvbG9yIgotICAgICAgICAgIHZhbHVlPSJsaWdodEdyYXkiLz4KLSAgICAgIDxib3JkZXIKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGluZUJvcmRlciIvPgotICAgICAgPHRlbXBsYXRlCi0gICAgICAgICAgeD0iMjAiCi0gICAgICAgICAgeT0iNjAiLz4KLSAgICAgIDx0ZW1wbGF0ZQotICAgICAgICAgIHg9IjMwIgotICAgICAgICAgIHk9IjYwIi8+Ci0gICAgICA8dGVtcGxhdGUKLSAgICAgICAgICB4PSI2MCIKLSAgICAgICAgICB5PSIzMCIvPgotICAgICAgPHRlbXBsYXRlCi0gICAgICAgICAgeD0iMzAiCi0gICAgICAgICAgeT0iMjAiLz4KLSAgICA8L2ZpZ3VyZXM+Ci0gICAgPGZpZ3VyZXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkN1c3RvbUZpZ3VyZSIKLSAgICAgICAgbmFtZT0iRGVjaXNpb25EaWFtb25kRmlndXJlX29sZCIKLSAgICAgICAgcXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuTGF5ZXIiCi0gICAgICAgIGJ1bmRsZU5hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZCI+Ci0gICAgICA8bGF5b3V0Ci0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlN0YWNrTGF5b3V0Ii8+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UG9seWdvbiIKLSAgICAgICAgICBuYW1lPSJEaWFtb25kUG9seWdvbiI+Ci0gICAgICAgIDxmb3JlZ3JvdW5kQ29sb3IKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpDb25zdGFudENvbG9yIgotICAgICAgICAgICAgdmFsdWU9ImJsYWNrIi8+Ci0gICAgICAgIDxiYWNrZ3JvdW5kQ29sb3IKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpDb25zdGFudENvbG9yIgotICAgICAgICAgICAgdmFsdWU9ImxpZ2h0R3JheSIvPgotICAgICAgICA8bWF4aW11bVNpemUKLSAgICAgICAgICAgIGR4PSI4MCIKLSAgICAgICAgICAgIGR5PSI4MCIvPgotICAgICAgICA8c2l6ZQotICAgICAgICAgICAgeD0iODAiCi0gICAgICAgICAgICB5PSI4MCIvPgotICAgICAgICA8dGVtcGxhdGUKLSAgICAgICAgICAgIHg9IjQwIi8+Ci0gICAgICAgIDx0ZW1wbGF0ZQotICAgICAgICAgICAgeD0iODAiCi0gICAgICAgICAgICB5PSI0MCIvPgotICAgICAgICA8dGVtcGxhdGUKLSAgICAgICAgICAgIHg9IjQwIgotICAgICAgICAgICAgeT0iODAiLz4KLSAgICAgICAgPHRlbXBsYXRlCi0gICAgICAgICAgICB5PSI0MCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCIKLSAgICAgICAgICBuYW1lPSJEZWNpc2lvbk1lcmdlTGFiZWxfMSIKLSAgICAgICAgICB0ZXh0PSIiLz4KLSAgICAgIDxwcmVmZXJyZWRTaXplCi0gICAgICAgICAgZHg9IjgwIgotICAgICAgICAgIGR5PSI4MCIvPgotICAgICAgPHNpemUKLSAgICAgICAgICB4PSI4MCIKLSAgICAgICAgICB5PSI4MCIvPgotICAgIDwvZmlndXJlcz4KLSAgICA8ZmlndXJlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6Q3VzdG9tRmlndXJlIgotICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJBY3Rpdml0eUZpbmFsTm9kZSIKLSAgICAgICAgbmFtZT0iRW5kTm9kZUZpZ3VyZSIKLSAgICAgICAgcXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5lcGYuZ21mLnVtbC5tb2RlbC5FbmROb2RlRmlndXJlIgotICAgICAgICBidW5kbGVOYW1lPSJvcmcuZWNsaXBzZS5lcGYuZ21mLnVtbC5tb2RlbCI+Ci0gICAgICA8Zm9yZWdyb3VuZENvbG9yCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkNvbnN0YW50Q29sb3IiCi0gICAgICAgICAgdmFsdWU9ImRhcmtCbHVlIi8+Ci0gICAgICA8YmFja2dyb3VuZENvbG9yCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJHQkNvbG9yIgotICAgICAgICAgIHJlZD0iNDUiCi0gICAgICAgICAgZ3JlZW49Ijg1IgotICAgICAgICAgIGJsdWU9IjEzMCIvPgotICAgICAgPHByZWZlcnJlZFNpemUKLSAgICAgICAgICBkeD0iMjQiCi0gICAgICAgICAgZHk9IjI0Ii8+Ci0gICAgICA8c2l6ZQotICAgICAgICAgIHg9IjI0IgotICAgICAgICAgIHk9IjI0Ii8+Ci0gICAgPC9maWd1cmVzPgotICAgIDxmaWd1cmVzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpDdXN0b21GaWd1cmUiCi0gICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IkRlY2lzaW9uTm9kZSBNZXJnZU5vZGUiCi0gICAgICAgIG5hbWU9IkRlY2lzaW9uRGlhbW9uZEZpZ3VyZSIKLSAgICAgICAgcXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmdlb3NoYXBlcy5pbnRlcm5hbC5kcmF3MmQuZmlndXJlcy5HZW9TaGFwZURpYW1vbmRGaWd1cmUiCi0gICAgICAgIGJ1bmRsZU5hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZ2Vvc2hhcGVzIj4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCIKLSAgICAgICAgICBuYW1lPSJEaWFtb25kTGFiZWwiLz4KLSAgICAgIDxmb3JlZ3JvdW5kQ29sb3IKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6Q29uc3RhbnRDb2xvciIKLSAgICAgICAgICB2YWx1ZT0iZGFya0JsdWUiLz4KLSAgICAgIDxiYWNrZ3JvdW5kQ29sb3IKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UkdCQ29sb3IiCi0gICAgICAgICAgcmVkPSIxODUiCi0gICAgICAgICAgZ3JlZW49IjIwNSIKLSAgICAgICAgICBibHVlPSIyMzAiLz4KLSAgICAgIDxwcmVmZXJyZWRTaXplCi0gICAgICAgICAgZHg9IjUwIgotICAgICAgICAgIGR5PSI1MCIvPgotICAgICAgPHNpemUKLSAgICAgICAgICB4PSI1MCIKLSAgICAgICAgICB5PSI1MCIvPgotICAgIDwvZmlndXJlcz4KLSAgICA8ZmlndXJlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6RWxsaXBzZSIKLSAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iSW5pdGlhbE5vZGUiCi0gICAgICAgIG5hbWU9IkluaXRpYWxOb2RlRmlndXJlIj4KLSAgICAgIDxmb3JlZ3JvdW5kQ29sb3IKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6Q29uc3RhbnRDb2xvciIKLSAgICAgICAgICB2YWx1ZT0iZGFya0JsdWUiLz4KLSAgICAgIDxiYWNrZ3JvdW5kQ29sb3IKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UkdCQ29sb3IiCi0gICAgICAgICAgcmVkPSIxODUiCi0gICAgICAgICAgZ3JlZW49IjIwNSIKLSAgICAgICAgICBibHVlPSIyMzAiLz4KLSAgICAgIDxwcmVmZXJyZWRTaXplCi0gICAgICAgICAgZHg9IjIwIgotICAgICAgICAgIGR5PSIyMCIvPgotICAgICAgPHNpemUKLSAgICAgICAgICB4PSIyMCIKLSAgICAgICAgICB5PSIyMCIvPgotICAgIDwvZmlndXJlcz4KLSAgICA8ZmlndXJlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IkdlbmVyaWNMYWJlbCIKLSAgICAgICAgbmFtZT0iR2VuZXJpY0xhYmVsRmlndXJlIi8+Ci0gICAgPGZpZ3VyZXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkN1c3RvbUZpZ3VyZSIKLSAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iUGFydGl0aW9uQ2FtcGFydG1lbnQiCi0gICAgICAgIG5hbWU9IlJlc2l6ZWFibGVDb21wYXJ0bWVudEZpZ3VyZUV4IgotICAgICAgICBxdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSIKLSAgICAgICAgYnVuZGxlTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzIi8+Ci0gICAgPGZpZ3VyZXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJlY3RhbmdsZSIKLSAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIgotICAgICAgICBuYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUiCi0gICAgICAgIG91dGxpbmU9ImZhbHNlIj4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCIKLSAgICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lIgotICAgICAgICAgIG5hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCIvPgotICAgIDwvZmlndXJlcz4KLSAgPC9maWd1cmVzPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiCi0gICAgICBmaWd1cmU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJBY3Rpdml0eVBhcnRpdGlvbiIKLSAgICAgIGZpZ3VyZT0iQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJJbml0aWFsTm9kZSIKLSAgICAgIGZpZ3VyZT0iSW5pdGlhbE5vZGVGaWd1cmUiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJGb3JrTm9kZSIKLSAgICAgIGZpZ3VyZT0iRm9ya05vZGVGaWd1cmUiCi0gICAgICByZXNpemVDb25zdHJhaW50PSJFQVNUX1dFU1QiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJNZXJnZU5vZGUiCi0gICAgICBmaWd1cmU9IkRlY2lzaW9uRGlhbW9uZEZpZ3VyZSIvPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IkRlY2lzaW9uTm9kZSIKLSAgICAgIGZpZ3VyZT0iRGVjaXNpb25EaWFtb25kRmlndXJlIi8+Ci0gIDxub2RlcwotICAgICAgbmFtZT0iQWN0aXZpdHlGaW5hbE5vZGUiCi0gICAgICBmaWd1cmU9IkVuZE5vZGVGaWd1cmUiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJKb2luTm9kZSIKLSAgICAgIGZpZ3VyZT0iRm9ya05vZGVGaWd1cmUiCi0gICAgICByZXNpemVDb25zdHJhaW50PSJFQVNUX1dFU1QiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUiCi0gICAgICBmaWd1cmU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSIvPgotICA8Y29ubmVjdGlvbnMKLSAgICAgIG5hbWU9IkNvbnRyb2xGbG93IgotICAgICAgZmlndXJlPSJDb250cm9sRmxvd0ZpZ3VyZSIvPgotICA8Y29tcGFydG1lbnRzCi0gICAgICBuYW1lPSJQYXJ0aXRpb25DYW1wYXJ0bWVudCIKLSAgICAgIGZpZ3VyZT0iUmVzaXplYWJsZUNvbXBhcnRtZW50RmlndXJlRXgiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iTm9kZU5hbWUiCi0gICAgICBmaWd1cmU9Ik5vZGVOYW1lRmlndXJlIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IlBhcnRpdGlvbk5hbWUiCi0gICAgICBmaWd1cmU9IlBhcnRpdGlvbkxhYmVsRmlndXJlIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IkNvbnRyb2xGbG93TGFiZWwiCi0gICAgICBmaWd1cmU9IkNvbnRyb2xGbG93TGFiZWxGaWd1cmUiCi0gICAgICByZXNpemVDb25zdHJhaW50PSJFQVNUX1dFU1QiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iTWVyZ2VOb2RlUG9seWdvbkxhYmVsIgotICAgICAgZmlndXJlPSJNZXJnZU5vZGVQb2x5Z29uTGFiZWxGaWd1cmUiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iR2VuZXJpY0xhYmVsIgotICAgICAgZmlndXJlPSJHZW5lcmljTGFiZWxGaWd1cmUiCi0gICAgICByZXNpemVDb25zdHJhaW50PSJFQVNUX1dFU1QiCi0gICAgICBlbGVtZW50SWNvbj0iZmFsc2UiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iQWN0aXZpdHlOb2RlTmFtZSIKLSAgICAgIGZpZ3VyZT0iTm9kZU5hbWVGaWd1cmUiCi0gICAgICBlbGVtZW50SWNvbj0iZmFsc2UiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iSW5pdGlhbE5vZGVOYW1lIgotICAgICAgZmlndXJlPSJOb2RlTmFtZUZpZ3VyZSIKLSAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJGb3JrTm9kZU5hbWUiCi0gICAgICBmaWd1cmU9Ik5vZGVOYW1lRmlndXJlIgotICAgICAgZWxlbWVudEljb249ImZhbHNlIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IkRlY2lzaW9uTm9kZU5hbWUiCi0gICAgICBmaWd1cmU9Ik5vZGVOYW1lRmlndXJlIgotICAgICAgZWxlbWVudEljb249ImZhbHNlIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUiCi0gICAgICBmaWd1cmU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCIKLSAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSIvPgotPC9nbWZncmFwaDpDYW52YXM+CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL21vZGVsL2VwZmRpYWdyYW0uZ21mbWFwIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9tb2RlbC9lcGZkaWFncmFtLmdtZm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZmOGUzYi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL21vZGVsL2VwZmRpYWdyYW0uZ21mbWFwCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mbWFwOk1hcHBpbmcgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnbWZtYXA9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvbWFwcGluZ3MiCi0gICAgeG1sbnM6Z21mdG9vbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9Ub29sRGVmaW5pdGlvbiI+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5RmluYWxOb2RlIi8+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjR2VuZXJpY0xhYmVsIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy41Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5RmluYWxOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9NZXJnZU5vZGUiLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgdmlld1BhdHRlcm49IiI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjRGVjaXNpb25Ob2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMyIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNNZXJnZU5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0ZvcmtOb2RlIi8+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMiIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNGb3JrTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vSW5pdGlhbE5vZGUiLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNHZW5lcmljTGFiZWwiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjEiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjSW5pdGlhbE5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0RlY2lzaW9uTm9kZSIvPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNEZWNpc2lvbk5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy40Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0RlY2lzaW9uTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vSm9pbk5vZGUiLz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy42Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0pvaW5Ob2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgICA8ZG9tYWluU3BlY2lhbGl6YXRpb24KLSAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX0FjdGl2aXR5IgotICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICA8ZG9tYWluSW5pdGlhbGl6ZXIKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfQWN0aXZpdHkmI3hEOyYjeEE7IgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICA8L2RvbWFpbkluaXRpYWxpemVyPgotICAgICAgPGxhYmVsTWFwcGluZ3M+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlOb2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuOCIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ncm91cCIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlQYXJ0aXRpb24iLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNQYXJ0aXRpb25OYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy4wIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5UGFydGl0aW9uIi8+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuNy9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjAiCi0gICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy43L0Bvd25lZENoaWxkIj4KLSAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlQYXJ0aXRpb24vc3VicGFydGl0aW9uIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNvbXBhcnRtZW50cwotICAgICAgICAgIGNoaWxkcmVuPSIvL0Bub2Rlcy43L0Bvd25lZENoaWxkL0BjaGlsZHJlbi4wIj4KLSAgICAgICAgPGNvbXBhcnRtZW50Ci0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI1BhcnRpdGlvbkNhbXBhcnRtZW50Ii8+Ci0gICAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5UGFyYW1ldGVyTm9kZSIvPgotICAgICAgPGRvbWFpblNwZWNpYWxpemF0aW9uCi0gICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9UYXNrRGVzY3JpcHRvciIKLSAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgPGRvbWFpbkluaXRpYWxpemVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX1Rhc2tEZXNjcmlwdG9yIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICA8L2RvbWFpbkluaXRpYWxpemVyPgotICAgICAgPGxhYmVsTWFwcGluZ3M+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMTEiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgICA8ZG9tYWluU3BlY2lhbGl6YXRpb24KLSAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX1BoYXNlIgotICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICA8ZG9tYWluSW5pdGlhbGl6ZXIKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfUGhhc2UiCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgIDwvZG9tYWluSW5pdGlhbGl6ZXI+Ci0gICAgICA8bGFiZWxNYXBwaW5ncz4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eU5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy45Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICAgIDxkb21haW5TcGVjaWFsaXphdGlvbgotICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfSXRlcmF0aW9uIgotICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICA8ZG9tYWluSW5pdGlhbGl6ZXIKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfSXRlcmF0aW9uIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICA8L2RvbWFpbkluaXRpYWxpemVyPgotICAgICAgPGxhYmVsTWFwcGluZ3M+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlOb2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMTAiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIi8+Ci0gICAgICA8ZG9tYWluU3BlY2lhbGl6YXRpb24KLSAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX01pbGVzdG9uZSIKLSAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgPGRvbWFpbkluaXRpYWxpemVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX01pbGVzdG9uZSIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgPC9kb21haW5Jbml0aWFsaXplcj4KLSAgICAgIDxsYWJlbE1hcHBpbmdzPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjEyIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5UGFyYW1ldGVyTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPGxpbmtzPgotICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9Db250cm9sRmxvdyIvPgotICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQ29udHJvbEZsb3dMYWJlbCIvPgotICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlL2VkZ2UiLz4KLSAgICA8dG9vbAotICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4wIi8+Ci0gICAgPGRpYWdyYW1MaW5rCi0gICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQ29udHJvbEZsb3ciLz4KLSAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5RWRnZS9zb3VyY2UiLz4KLSAgICA8bGlua01ldGFGZWF0dXJlCi0gICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eUVkZ2UvdGFyZ2V0Ii8+Ci0gIDwvbGlua3M+Ci0gIDxkaWFncmFtPgotICAgIDxkaWFncmFtQ2FudmFzCi0gICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjdW1sIi8+Ci0gICAgPGRvbWFpbk1vZGVsCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvIi8+Ci0gICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5Ii8+Ci0gICAgPHBhbGV0dGUKLSAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUiLz4KLSAgPC9kaWFncmFtPgotPC9nbWZtYXA6TWFwcGluZz4KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvbW9kZWwvZXBmZGlhZ3JhbS5nbWZ0b29sIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9tb2RlbC9lcGZkaWFncmFtLmdtZnRvb2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhOTZiMGYuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9tb2RlbC9lcGZkaWFncmFtLmdtZnRvb2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZ0b29sOlRvb2xSZWdpc3RyeSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZnRvb2w9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvVG9vbERlZmluaXRpb24iPgotICA8cGFsZXR0ZT4KLSAgICA8dG9vbHMKLSAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6VG9vbEdyb3VwIgotICAgICAgICB0aXRsZT0iRmxvd3MiCi0gICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGlvbiB0b29sIGZvciBmbG93cyIKLSAgICAgICAgY29sbGFwc2libGU9InRydWUiPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJMaW5rIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IExpbmsiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvQ29udHJvbEZsb3cuZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgIDwvdG9vbHM+Ci0gICAgPHRvb2xzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOlRvb2xHcm91cCIKLSAgICAgICAgdGl0bGU9Ik5vZGVzIgotICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRpb24gdG9vbCBncm91cCBmb3Igbm9kZXMiCi0gICAgICAgIGNvbGxhcHNpYmxlPSJ0cnVlIgotICAgICAgICBhY3RpdmU9Ii8vQHBhbGV0dGUvQHRvb2xzLjEiPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJBY3Rpdml0eSBQYXJ0aXRpb24iCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQWN0aXZpdHkgUGFydGl0aW9uIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L0FjdGl2aXR5UGFydGl0aW9uLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iU3RhcnQgTm9kZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBTdGFydCBOb2RlIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L0luaXRpYWxOb2RlLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iRm9yayBOb2RlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEZvcmsgTm9kZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9Gb3JrTm9kZS5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9Ik1lcmdlIE5vZGUiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgTWVyZ2UgTm9kZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9NZXJnZU5vZGUuZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJEZWNpc2lvbiBOb2RlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IERlY2lzaW9uIE5vZGUiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvRGVjaXNpb25Ob2RlLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iRW5kIE5vZGUiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgRW5kIE5vZGUiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlGaW5hbE5vZGUuZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJKb2luIE5vZGUiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgSm9pbiBOb2RlIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L0pvaW5Ob2RlLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOlBhbGV0dGVTZXBhcmF0b3IiLz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iQWN0aXZpdHkiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQWN0aXZpdHkiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJQaGFzZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBQaGFzZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9QaGFzZS5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9Ikl0ZXJhdGlvbiIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBJdGVyYXRpb24iPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJUYXNrIERlc2NyaXB0b3IiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgVGFzayBEZXNjcmlwdG9yIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iTWlsZXN0b25lIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IE1pbGVzdG9uZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9NaWxlc3RvbmUuZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgIDwvdG9vbHM+Ci0gIDwvcGFsZXR0ZT4KLTwvZ21mdG9vbDpUb29sUmVnaXN0cnk+CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY1YTQwYi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGx1Z2luTmFtZT1FUEYgRGlhZ3JhbW1pbmcgUGx1Z2luCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotI05lZWRzIFRyYW5zbGF0aW9uCi1EZWxldGVEaWFncmFtX3RleHQ9RGVsZXRlIERpYWdyYW0KLXJlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQ9UmVmcmVzaCBmcm9tIEJhc2UgQWN0aXZpdHkKLXJlZnJlc2hfdGV4dD1SZWZyZXNoCi1vcGVuX2FkZF90ZXh0PU9wZW4gQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0KLWRlbGV0ZV90ZXh0PURlbGV0ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvcGx1Z2luLnhtbCBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEzMjEwYy4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPCEtLQotIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotCi0gQ29udHJpYnV0b3JzOgotIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLQotLS0+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotICAgICAgPGluaXRpYWxpemVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxEaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUuZmlsZVR5cGVzIj4KLSAgICAgIDxmaWxlVHlwZXMKLSAgICAgICAgIHR5cGU9InRleHQiCi0gICAgICAgICBleHRlbnNpb249InhtaSI+Ci0gICAgICA8L2ZpbGVUeXBlcz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5leHRlbnNpb25fcGFyc2VyIj4KLSAgICAgIDxwYXJzZXIKLSAgICAgICAgIHR5cGU9InhtaSIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5yZXNvdXJjZXMuR01GUmVzb3VyY2VGYWN0b3J5Ij4KLSAgICAgIDwvcGFyc2VyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotICAgICA8ZWRpdG9yCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5EaWFncmFtRWRpdG9ySUQiCi0gICAgICAgIG5hbWU9IkFjdGl2aXR5IERpYWdyYW0gRWRpdG9yIgotICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9VTUxEaWFncmFtRmlsZS5naWYiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5EaWFncmFtRWRpdG9yIgotICAgICAgICBtYXRjaGluZ1N0cmF0ZWd5PSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxNYXRjaGluZ1N0cmF0ZWd5IgotICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxEaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IiPgotICAgICA8L2VkaXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gIDwhLS0gPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gIAkgIDx3aXphcmQKLSAgCSAgICAgbmFtZT0iQWN0aXZpdHkgRGlhZ3JhbSIKLSAgCSAgICAgaWNvbj0iaWNvbnMvb2JqMTYvVU1MRGlhZ3JhbUZpbGUuZ2lmIgotICAJICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkuRXhhbXBsZXMiCi0gIAkgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxDcmVhdGlvbldpemFyZCIKLSAgCSAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTENyZWF0aW9uV2l6YXJkSUQiPgotICAJICAJIDxkZXNjcmlwdGlvbj4KLSAgCSAgCQlDcmVhdGVzIEFjdGl2aXR5IGRpYWdyYW0uCi0gIAkgIAkgPC9kZXNjcmlwdGlvbj4gIAotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4gLS0+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAgICAJPCEtLSA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnVpLm9iamVjdENvbnRyaWJ1dGlvbi5JRmlsZTEiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLnVtbCIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iSW5pdGlhbGl6ZSB4bWkgZGlhZ3JhbSBmaWxlIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTEluaXREaWFncmFtRmlsZUFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTEluaXREaWFncmFtRmlsZUFjdGlvbklEIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAKLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnVpLm9iamVjdENvbnRyaWJ1dGlvbi5BY3Rpdml0eUVkaXRQYXJ0MiIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxMb2FkUmVzb3VyY2VBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTExvYWRSZXNvdXJjZUFjdGlvbklEIgotICAgICAgICAgICAgICAgbGFiZWw9IkxvYWQgUmVzb3VyY2UuLi4iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+IC0tPgotCSA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkRlbGV0ZURpYWdyYW0iCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLkRlbGV0ZURpYWdyYW1BY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EZWxldGVEaWFncmFtQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVEZWxldGVEaWFncmFtX3RleHQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlRGVsZXRlRGlhZ3JhbV90ZXh0Ii8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9ImZhbHNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5SZWZyZXNoRnJvbUJhc2VBY3Rpb24iCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLlJlZnJlc2hGcm9tQmFzZUFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLlJlZnJlc2hGcm9tQmFzZUFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVyZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0Ii8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLlJlZnJlc2hBY3Rpb24iCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLlJlZnJlc2hBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5SZWZyZXNoQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVyZWZyZXNoX3RleHQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlcmVmcmVzaF90ZXh0Ii8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLk9wZW5BREQiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5hY3Rpb25zLk9wZW5BY3Rpdml0eURldGFpbERpYWdyYW1BY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLmFjdGlvbnMuT3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlb3Blbl9hZGRfdGV4dCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVvcGVuX2FkZF90ZXh0Ii8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLk9wZW5BREQyIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLmFjdGlvbnMuT3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuYWN0aW9ucy5PcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVvcGVuX2FkZF90ZXh0IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJW9wZW5fYWRkX3RleHQiLz4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgYWRhcHRhYmxlPSJmYWxzZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuT3BlbkFERDMiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuYWN0aW9ucy5PcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5hY3Rpb25zLk9wZW5BY3Rpdml0eURldGFpbERpYWdyYW1BY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJW9wZW5fYWRkX3RleHQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlb3Blbl9hZGRfdGV4dCIvPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkRlbGV0ZURpYWdyYW1FbGVtZW50QWN0aW9uIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuRGVsZXRlRGlhZ3JhbUVsZW1lbnRBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIqIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9kZWxldGUuZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EZWxldGVEaWFncmFtRWxlbWVudEFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlZGVsZXRlX3RleHQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgb3ZlcnJpZGVBY3Rpb25JZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVkZWxldGVfdGV4dCIvPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuYWN0aW9uLmNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcnMiPgotICAgICAgPGNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIiCi0gICAgICAgICAgICBjaGVja1BsdWdpbkxvYWRlZD0iZmFsc2UiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9IkxvdyIvPgotICAgICAgICAgPCEtLQotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbU1vZGVsQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuTWVyZ2VOb2RlRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLk1lcmdlTm9kZU5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuRm9ya05vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuSW5pdGlhbE5vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbU1vZGVsQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkRlY2lzaW9uTm9kZU5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuSm9pbk5vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5Db250cm9sRmxvd05hbWVFZGl0UGFydCIvPgotCQkJPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4gCi0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbU1vZGVsQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICAtLT4KLSAgICAgIDwvY29udHJpYnV0aW9uSXRlbVByb3ZpZGVyPiAKLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuYWN0aW9uLmdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcnMiPgotICAgICAgPEdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIiCi0gICAgICAgICBpZD0iQURQcmVzZW50YXRpb24iPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPFZpZXdJZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuRGlhZ3JhbUVkaXRvcklEIj4KLSAgICAgICAgICAgIDxFbGVtZW50VHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ij4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0iZGVsZXRlIi8+Ci0gICAgICAgICAgICA8L0VsZW1lbnRUeXBlPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJzYXZlIi8+Ci0gICAgICAgICAgICA8L0VsZW1lbnRUeXBlPgotICAgICAgICAgPC9WaWV3SWQ+Ci0gICAgICA8L0dsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcj4KLSAgICAgIDxHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5pZGUucHJvdmlkZXJzLkRpYWdyYW1JREVHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIiCi0gICAgICAgICBpZD0iQURQcmVzZW50YXRpb25JREUiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPFZpZXdJZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuRGlhZ3JhbUVkaXRvcklEIj4KLSAgICAgICAgICAgIDxFbGVtZW50VHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ij4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0iYm9va21hcmsiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICA8L1ZpZXdJZD4KLSAgICAgIDwvR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyPgotICAgICAgPEdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVuZGVyLnByb3ZpZGVycy5EaWFncmFtVUlSZW5kZXJHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIiCi0gICAgICAgICAgICBpZD0iQURSZW5kZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPFZpZXdJZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuRGlhZ3JhbUVkaXRvcklEIj4KLSAgICAgICAgICAgIDxFbGVtZW50VHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ij4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0iY3V0Ii8+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9ImNvcHkiLz4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0icGFzdGUiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICA8L1ZpZXdJZD4KLSAgICAgIDwvR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS52aWV3UHJvdmlkZXJzIj4KLSAgICAgIDx2aWV3UHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MVmlld1Byb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxjb250ZXh0IHZpZXdDbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSIgc2VtYW50aWNIaW50cz0iQUQiLz4KLSAgICAgICAgIDxjb250ZXh0IHZpZXdDbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSIgc2VtYW50aWNIaW50cz0iIi8+Ci0gICAgICAgICA8Y29udGV4dCB2aWV3Q2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2UiIHNlbWFudGljSGludHM9IiIvPgotICAgICAgPC92aWV3UHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydFByb3ZpZGVycyI+Ci0gICAgICA8ZWRpdHBhcnRQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFZGl0UGFydFByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgIDwvZWRpdHBhcnRQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhbGV0dGVQcm92aWRlcnMiPgotICAgICAgPHBhbGV0dGVQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxQYWxldHRlUHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPGVkaXRvciBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuRGlhZ3JhbUVkaXRvcklEIi8+Ci0gICAgICA8L3BhbGV0dGVQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkubW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlcnMiPgotICAgICAgPG1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICA8L21vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnByb3BlcnRpZXMucHJvcGVydGllc1Byb3ZpZGVycyI+Ci0gICAgICA8UHJvcGVydGllc1Byb3ZpZGVyCi0gICAgICAgICAgICB2ZXJpZnlQbHVnaW5Mb2FkZWQ9ImZhbHNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MUHJvcGVydHlQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICA8L1Byb3BlcnRpZXNQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuaWNvblByb3ZpZGVycyI+Ci0gICAgICA8SWNvblByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzLlVNTEljb25Qcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93Ii8+Ci0gICAgICA8L0ljb25Qcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyUHJvdmlkZXJzIj4KLSAgICAgIDxQYXJzZXJQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxQYXJzZXJQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICA8L1BhcnNlclByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWxlbWVudFR5cGVzIj4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5BY3Rpdml0eV83OSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IkFjdGl2aXR5IgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVycy5BY3Rpdml0eUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9Ijc5Ii8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEiCi0gICAgICAgICAgICAgICBuYW1lPSJBY3Rpdml0eSBQYXJ0aXRpb24iCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcmFkdmljZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVycy5BY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXJBZHZpY2UiPgotICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjIwMDEiLz4KLSAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSIKLSAgICAgICAgICAgICAgIG5hbWU9IkVuZCBOb2RlIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iQWN0aXZpdHlGaW5hbE5vZGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5oZWxwZXJzLkFjdGl2aXR5RmluYWxOb2RlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAwMSIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuTWVyZ2VOb2RlXzEwMDIiCi0gICAgICAgICAgICAgICBuYW1lPSJNZXJnZSBOb2RlIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iTWVyZ2VOb2RlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVycy5NZXJnZU5vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDAyIi8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5Gb3JrTm9kZV8xMDAzIgotICAgICAgICAgICAgICAgbmFtZT0iRm9yayBOb2RlIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iRm9ya05vZGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5oZWxwZXJzLkZvcmtOb2RlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAwMyIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuSW5pdGlhbE5vZGVfMTAwNCIKLSAgICAgICAgICAgICAgIG5hbWU9IlN0YXJ0IE5vZGUiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJJbml0aWFsTm9kZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmhlbHBlcnMuSW5pdGlhbE5vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDA0Ii8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5EZWNpc2lvbk5vZGVfMTAwNSIKLSAgICAgICAgICAgICAgIG5hbWU9IkRlY2lzaW9uIE5vZGUiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJEZWNpc2lvbk5vZGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5oZWxwZXJzLkRlY2lzaW9uTm9kZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMDUiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkpvaW5Ob2RlXzEwMDYiCi0gICAgICAgICAgICAgICBuYW1lPSJKb2luIE5vZGUiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJKb2luTm9kZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmhlbHBlcnMuSm9pbk5vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDA2Ii8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDciCi0gICAgICAgICAgICAgICBuYW1lPSJBY3Rpdml0eSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5oZWxwZXJzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDA3Ii8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5BY3Rpdml0eVBhcnRpdGlvbl8xMDA4IgotICAgICAgICAgICAgICAgbmFtZT0iQWN0aXZpdHkgUGFydGl0aW9uIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iQWN0aXZpdHlQYXJ0aXRpb24iCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5oZWxwZXJzLkFjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAwOCIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkiCi0gICAgICAgICAgICAgICBuYW1lPSJUYXNrIERlc2NyaXB0b3IiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5oZWxwZXJzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMDkiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwIgotICAgICAgICAgICAgICAgbmFtZT0iUGhhc2UiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcmFkdmljZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVycy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlckFkdmljZSI+Ci0gICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDciLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDEwIi8+Ci0gICAgICAgICA8L3NwZWNpYWxpemF0aW9uVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExIgotICAgICAgICAgICAgICAgbmFtZT0iSXRlcmF0aW9uIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXJhZHZpY2U9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmhlbHBlcnMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0SGVscGVyQWR2aWNlIj4KLSAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMTEiLz4KLSAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICAgPHNwZWNpYWxpemF0aW9uVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMiIKLSAgICAgICAgICAgICAgIG5hbWU9Ik1pbGVzdG9uZSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyYWR2aWNlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5oZWxwZXJzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXJBZHZpY2UiPgotICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkiLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDEyIi8+Ci0gICAgICAgICA8L3NwZWNpYWxpemF0aW9uVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkNvbnRyb2xGbG93XzMwMDEiCi0gICAgICAgICAgICAgICBuYW1lPSJMaW5rIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iQ29udHJvbEZsb3ciCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5oZWxwZXJzLkNvbnRyb2xGbG93RWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzAwMSIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lbGVtZW50VHlwZUJpbmRpbmdzIj4KLSAgICAgIDxjbGllbnRDb250ZXh0IGlkPSJBRENsaWVudENvbnRleHQiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLmVkaXRpbmdEb21haW4iCi0gICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkVkaXRpbmdEb21haW4iLz4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvY2xpZW50Q29udGV4dD4gCi0gICAgICA8YmluZGluZyBjb250ZXh0PSJBRENsaWVudENvbnRleHQiPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkFjdGl2aXR5Xzc5Ii8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuQWN0aXZpdHlQYXJ0aXRpb25fMjAwMSIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkFjdGl2aXR5RmluYWxOb2RlXzEwMDEiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5NZXJnZU5vZGVfMTAwMiIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkZvcmtOb2RlXzEwMDMiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5Jbml0aWFsTm9kZV8xMDA0Ii8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuRGVjaXNpb25Ob2RlXzEwMDUiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5Kb2luTm9kZV8xMDA2Ii8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3Ii8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5Ii8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5Db250cm9sRmxvd18zMDAxIi8+Ci0gICAgICAgICA8YWR2aWNlIHJlZj0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmFkdmljZS5ub3RhdGlvbkRlcGRlbmRlbnRzIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcGF0dGVybj0iLioiLz4KLSAgICAgIDwvYmluZGluZz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgIDwhLS0gPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmVzdGVkQ29tbWFuZFByb3ZpZGVycyI+Ci0gICAgICA8bmVzdGVkQ29tbWFuZFByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5jb21tYW5kcy5OZXN0ZWRDb21tYW5kUHJvdmlkZXIiLz4KLSAgCTwvZXh0ZW5zaW9uPiAtLT4KLTwvcGx1Z2luPgotCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvRVBGRGlhZ3JhbVBsdWdpbi5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL0VQRkRpYWdyYW1QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZkMjZlOC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvRVBGRGlhZ3JhbVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEVQRkRpYWdyYW1QbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEVQRkRpYWdyYW1QbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBFUEZEaWFncmFtUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVBGRGlhZ3JhbVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gaW1hZ2UgYmFzZWQgb24gZ2l2ZW4gcGF0aAotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVQYXRoCi0JICogQHJldHVybiBpbWFnZQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgaW1hZ2VGaWxlUGF0aCkgewotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgaW1hZ2VGaWxlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoZmFsc2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKXsKLQkJcmV0dXJuIFBMVUdJTl9JRDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9Db25zdGFudHMuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjJkNzJhLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFfU09VUkNFID0gInVtYV9zcmMiOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFfRURJVE9SX0lOUFVUID0gInVtYV9lZGl0b3JfaW5wdXQiOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFfRUxFTUVOVCA9ICJ1bWFfZWxlbWVudCI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVNQV9FTEVNRU5UX0dVSUQgPSAidW1hX2d1aWQiOwotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvRGlhZ3JhbW1pbmdSZXNvdXJjZXMuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL0RpYWdyYW1taW5nUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYTE4NzcuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvRGlhZ3JhbW1pbmdSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uRGlhZ3JhbVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1taW5nUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERpYWdyYW1taW5nUmVzb3VyY2VzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRGlhZ3JhbVJlc291cmNlcy5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVEb2N1bWVudFByb3ZpZGVyX2NyZWF0ZUVsZW1lbnRJbmZvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVEb2N1bWVudFByb3ZpZGVyX2Vycm9yX291dF9vZl9zeW5jOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVEb2N1bWVudFByb3ZpZGVyX3Rhc2tfc2F2aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVEb2N1bWVudFByb3ZpZGVyX3Jlc2V0RG9jdW1lbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZURvY3VtZW50UHJvdmlkZXJfcmVzb3VyY2VDaGFuZ2VkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVEb2N1bWVudFByb3ZpZGVyX2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdG9yYWdlRG9jdW1lbnRQcm92aWRlcl9jcmVhdGVFbGVtZW50SW5mbzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdG9yYWdlRG9jdW1lbnRQcm92aWRlcl91cGRhdGVDYWNoZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdG9yYWdlRG9jdW1lbnRQcm92aWRlcl9pc1JlYWRPbmx5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRQYWdlX0RJQUdSQU1fQ1JFQVRJT05fRkFJTF9FWENfOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkUGFnZV9NZXNzYWdlX0ZpbGVFeGlzdHNfRVJST1JfOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZUNyZWF0b3JfVGFza1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcldpemFyZFBhZ2VfRGlhbG9nSW50ZXJuYWxFcnJvclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcldpemFyZFBhZ2VfSW52YWxpZEZpbGVuYW1lOyAKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlU2F2ZUFzX0RpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVTYXZlQXNfRGlhbG9nTWVzc2FnZVRleHQ7Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9FcGZEaWFncmFtQWN0aW9uUHJvdmlkZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL0VwZkRpYWdyYW1BY3Rpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWM1ZDcyLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL0VwZkRpYWdyYW1BY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5hY3Rpb25zLkFjdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5hY3Rpb25zLk9yaWVudGF0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5hY3Rpb24uY29udHJpYnV0aW9uaXRlbS5BYnN0cmFjdENvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkudXRpbC5JV29ya2JlbmNoUGFydERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRXBmRGlhZ3JhbUFjdGlvblByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RDb250cmlidXRpb25JdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEVwZkRpYWdyYW1BY3Rpb25Qcm92aWRlcigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmFjdGlvbi5jb250cmlidXRpb25pdGVtLkFic3RyYWN0Q29udHJpYnV0aW9uSXRlbVByb3ZpZGVyI2NyZWF0ZUFjdGlvbihqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkudXRpbC5JV29ya2JlbmNoUGFydERlc2NyaXB0b3IpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIElBY3Rpb24gY3JlYXRlQWN0aW9uKFN0cmluZyBhY3Rpb25JZCwgSVdvcmtiZW5jaFBhcnREZXNjcmlwdG9yIHBhcnREZXNjcmlwdG9yKSB7Ci0JCQotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gcGFydERlc2NyaXB0b3IuZ2V0UGFydFBhZ2UoKTsKLQkJaWYoYWN0aW9uSWQuZXF1YWxzKEFjdGlvbklkcy5BQ1RJT05fVl9PUklFTlRBVElPTikpewotCQkJT3JpZW50YXRpb25BY3Rpb24gYWN0aW9uID0gbmV3IE9yaWVudGF0aW9uQWN0aW9uKHBhZ2UsCi0JCQkJCWFjdGlvbklkKTsKLQkJCWFjdGlvbi5zZXRJZChhY3Rpb25JZCk7Ci0JCQlhY3Rpb24uc2V0VGV4dCgidk9yaWVudGF0aW9uIik7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInZPcmllbnRhdGlvbiIpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jcmVhdGVBY3Rpb24oYWN0aW9uSWQsIHBhcnREZXNjcmlwdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9SZXNvdXJjZXMucHJvcGVydGllcyBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmM5YWUwLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMqKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSMqfCBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgICBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gICAgICAgICAgICAgICAgIHwKLSMqfCBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgIHwKLSMqfCBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgIHwKLSMqfCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgIHwKLSMqfCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSMqfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSMqfCBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSMqfCAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gICAgICAgICAgICAgICAgICAgIHwKLSMqKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotIyMgRXJyb3JzICMjCi0KLUZpbGVEb2N1bWVudFByb3ZpZGVyX2NyZWF0ZUVsZW1lbnRJbmZvPUZpbGVEb2N1bWVudFByb3ZpZGVyLmNyZWF0ZUVsZW1lbnRJbmZvCi1GaWxlRG9jdW1lbnRQcm92aWRlcl9lcnJvcl9vdXRfb2Zfc3luYz1UaGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIG9uIHRoZSBmaWxlIHN5c3RlbQotRmlsZURvY3VtZW50UHJvdmlkZXJfdGFza19zYXZpbmc9U2F2aW5nCi1GaWxlRG9jdW1lbnRQcm92aWRlcl9yZXNldERvY3VtZW50PUZpbGVEb2N1bWVudFByb3ZpZGVyLnJlc2V0RG9jdW1lbnQKLUZpbGVEb2N1bWVudFByb3ZpZGVyX3Jlc291cmNlQ2hhbmdlZD1GaWxlRG9jdW1lbnRQcm92aWRlci5yZXNvdXJjZUNoYW5nZWQKLUZpbGVEb2N1bWVudFByb3ZpZGVyX2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZD1GaWxlRG9jdW1lbnRQcm92aWRlci5oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQKLQotU3RvcmFnZURvY3VtZW50UHJvdmlkZXJfY3JlYXRlRWxlbWVudEluZm89U3RvcmFnZURvY3VtZW50UHJvdmlkZXIuY3JlYXRlRWxlbWVudEluZm8KLVN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyX3VwZGF0ZUNhY2hlPVN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyLnVwZGF0ZUNhY2hlCi1TdG9yYWdlRG9jdW1lbnRQcm92aWRlcl9pc1JlYWRPbmx5PVN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyLmlzUmVhZE9ubHkKLVN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZT1TdG9yYWdlRG9jdW1lbnRQcm92aWRlci5pc01vZGlmaWFibGUKLQotIy0tLSBFeGNlcHRpb25zIC0tLQotV2l6YXJkUGFnZV9ESUFHUkFNX0NSRUFUSU9OX0ZBSUxfRVhDXz1VbmFibGUgdG8gY3JlYXRlIGRpYWdyYW0gZmlsZQotCi0jLS0tIEVycm9ycyAtLS0KLVdpemFyZFBhZ2VfTWVzc2FnZV9GaWxlRXhpc3RzX0VSUk9SXz1UaGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLgotCi0jLS0tLSBGaWxlIGNyZWF0aW9uCi1GaWxlQ3JlYXRvcl9UYXNrVGl0bGUgPSBDcmVhdGluZwotRWRpdG9yV2l6YXJkUGFnZV9EaWFsb2dJbnRlcm5hbEVycm9yVGl0bGU9Q3JlYXRpb24gUHJvYmxlbXMKLUVkaXRvcldpemFyZFBhZ2VfSW52YWxpZEZpbGVuYW1lID0gJyd7MH0nJyBpcyBub3QgYSB2YWxpZCBmaWxlIG5hbWUuIAotCi0jLS0tLSBGaWxlIFNhdmUgQXMKLUZpbGVTYXZlQXNfRGlhbG9nVGl0bGUgPVByb2JsZW0gRHVyaW5nIFNhdmUgQXMuLi4KLUZpbGVTYXZlQXNfRGlhbG9nTWVzc2FnZVRleHQgPVNhdmUgY291bGQgbm90IGJlIGNvbXBsZXRlZC4gVGFyZ2V0IGZpbGUgaXMgYWxyZWFkeSBvcGVuIGluIGFub3RoZXIgZWRpdG9yLgotCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9hY3Rpb25zL0FjdGlvbklkcy5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvYWN0aW9ucy9BY3Rpb25JZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjMTI2MS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9hY3Rpb25zL0FjdGlvbklkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuYWN0aW9uczsKLQotLyoqCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aW9uSWRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fVl9PUklFTlRBVElPTiA9ICJ2T3JpZW50YXRpb25BY3Rpb24iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9IX09SSUVOVEFUSU9OID0gImhPcmllbnRhdGlvbkFjdGlvbiI7Ci0JCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9hY3Rpb25zL09wZW5BY3Rpdml0eURldGFpbERpYWdyYW1BY3Rpb24uamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2FjdGlvbnMvT3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTlkYjBkLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2FjdGlvbnMvT3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkRpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLk5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuRVBGRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBBY3Rpb24gdG8gb3BlbiBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbSBmb3Igc2VsZWN0ZWQgQWN0aXZpdHkuCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIE9wZW5BY3Rpdml0eURldGFpbERpYWdyYW1BY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JcHJpdmF0ZSBFZGl0UGFydCBzZWxlY3RlZFBhcnQ7Ci0JcHJpdmF0ZSBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0OwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlI3NldEFjdGl2ZVBhcnQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJdGhpcy50YXJnZXRQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQkKLQkJCi0JCWlmKHNlbGVjdGVkUGFydCAhPSBudWxsKXsKLQkJCU5vZGUgdmlldyA9IChOb2RlKXNlbGVjdGVkUGFydC5nZXRNb2RlbCgpOwotCQkJRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCA9IChEaWFncmFtRWRpdFBhcnQpc2VsZWN0ZWRQYXJ0LmdldFBhcmVudCgpOwotCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pZGlhZ3JhbUVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQlEaWFncmFtQWRhcHRlciBkaWFncmFtQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXREaWFncmFtQWRhcHRlcihkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQkKLQkJCU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIodmlldy5nZXRFbGVtZW50KCkpOwotCQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gYWRhcHRlci5nZXRXcmFwcGVyKCk7Ci0JCQlpZihzZWxlY3RlZE9iamVjdCA9PSBudWxsKXsKLQkJCQlzZWxlY3RlZE9iamVjdCA9IGFkYXB0ZXIuZ2V0RWxlbWVudCgpOwotCQkJfQotCQkJLy9JRWRpdG9yUGFydCBwYXJlbnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0KAotCQkJCQlzZWxlY3RlZE9iamVjdCwgZGlhZ3JhbUFkYXB0ZXIuZ2V0U3VwcHJlc3Npb24oKSwgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0pOwotCQkJRGlhZ3JhbUVkaXRvclV0aWwub3BlbkRpYWdyYW1FZGl0b3IodGFyZ2V0UGFydC5nZXRTaXRlKCkuZ2V0UGFnZSgpLCBpbnB1dCwgCi0JCQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5ULCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPT0gMQotCQkJCQkmJiBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgRWRpdFBhcnQpIHsKLQkJCQlzZWxlY3RlZFBhcnQgPSAoRWRpdFBhcnQpIHN0cnVjdHVyZWRTZWxlY3Rpb24KLQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2FjdGlvbnMvT3JpZW50YXRpb25BY3Rpb24uamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2FjdGlvbnMvT3JpZW50YXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY1NjhiOC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9hY3Rpb25zL09yaWVudGF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLkRpYWdyYW1BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgT3JpZW50YXRpb25BY3Rpb24gZXh0ZW5kcyBEaWFncmFtQWN0aW9uIHsKLQkKLQlwdWJsaWMgT3JpZW50YXRpb25BY3Rpb24oSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSwgU3RyaW5nIG9yaWVuYXRpb24pIHsKLQkJc3VwZXIod29ya2JlbmNoUGFnZSk7Ci0JCXNldElkKG9yaWVuYXRpb24pOwotCX0KLQkKLQlwdWJsaWMgT3JpZW50YXRpb25BY3Rpb24oSVdvcmtiZW5jaFBhcnQgd29ya2JlbmNocGFydCwgU3RyaW5nIG9yaWllbnRhdGlvbikgewotCQlzdXBlcih3b3JrYmVuY2hwYXJ0KTsKLQkJc2V0SWQob3JpaWVudGF0aW9uKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHdvcmtiZW5jaFBhZ2UKLQkgKi8KLQlwdWJsaWMgT3JpZW50YXRpb25BY3Rpb24oSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSkgewotCQlzdXBlcih3b3JrYmVuY2hQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gd29ya2JlbmNocGFydAotCSAqLwotCXB1YmxpYyBPcmllbnRhdGlvbkFjdGlvbihJV29ya2JlbmNoUGFydCB3b3JrYmVuY2hwYXJ0KSB7Ci0JCXN1cGVyKHdvcmtiZW5jaHBhcnQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9ucy5EaWFncmFtQWN0aW9uI2NyZWF0ZVRhcmdldFJlcXVlc3QoKQotCSAqLwotCXByb3RlY3RlZCBSZXF1ZXN0IGNyZWF0ZVRhcmdldFJlcXVlc3QoKSB7Ci0JCXJldHVybiBuZXcgT3JpZW50YXRpb25SZXF1ZXN0KGdldElkKCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9ucy5EaWFncmFtQWN0aW9uI2lzU2VsZWN0aW9uTGlzdGVuZXIoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2FjdGlvbnMvT3JpZW50YXRpb25SZXF1ZXN0LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9hY3Rpb25zL09yaWVudGF0aW9uUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGRiOWI3Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2FjdGlvbnMvT3JpZW50YXRpb25SZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuTG9jYXRpb25SZXF1ZXN0OwotCi0vKioKLSAqIFJlcXVlc3QgaXMgY29tbXVuaWNhdGlvbiBvYmplY3QgZm9yIGNvbW1hbmQgYW5kIHVpLiBPcmllbnRhdGlvbiBSZXF1ZXN0IGlzIAotICogZm9yIHZlcnRpY2FsIG9yIGhvcml6b250YWwgb3JpZW50YXRpb24gb2YgRWRpdFBhcnQgCi0gKi8KLXB1YmxpYyBjbGFzcyBPcmllbnRhdGlvblJlcXVlc3QgZXh0ZW5kcyBMb2NhdGlvblJlcXVlc3QgewotCi0JcHJvdGVjdGVkIExpc3QgZWRpdFBhcnRzOwotCQotCXB1YmxpYyBPcmllbnRhdGlvblJlcXVlc3QoU3RyaW5nIHR5cGUpIHsKLQkJc3VwZXIodHlwZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKExpc3QgZWRpdFBhcnRzKXsKLQkJdGhpcy5lZGl0UGFydHMgPSBuZXcgQXJyYXlMaXN0KGVkaXRQYXJ0cyk7Ci0JfQotCXB1YmxpYyBMaXN0IGdldFNlbGVjdGVkKCl7Ci0JCXJldHVybiBlZGl0UGFydHM7Ci0JfQotfQkKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2NvbW1hbmRzL0FjdGl2aXR5UGFydGl0aW9uRGVzdHJveUNvbW1hbmQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2NvbW1hbmRzL0FjdGl2aXR5UGFydGl0aW9uRGVzdHJveUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc4ZTY0MC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9jb21tYW5kcy9BY3Rpdml0eVBhcnRpdGlvbkRlc3Ryb3lDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuQ3Jvc3NSZWZlcmVuY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogRGVzdHJveUNvbW1hbmQgdG8gZGVzdHJveSBBY3Rpdml0eVBhcnRpdGlvbiBhbmQgYWxsIHRoZSBlbGVtZW50cyBpbnNpZGUgdGhlIHBhcnRpdGlvbnMuCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkRlc3Ryb3lDb21tYW5kIGV4dGVuZHMgRGVzdHJveUVsZW1lbnRDb21tYW5kIHsKLQotCQotCXByaXZhdGUgRWRpdFBhcnQgaG9zdDsKLQotCS8qKgotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICovCi0JcHVibGljIEFjdGl2aXR5UGFydGl0aW9uRGVzdHJveUNvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QsIEVkaXRQYXJ0IGhvc3QpIHsKLQkJc3VwZXIocmVxdWVzdCk7Ci0JCXRoaXMuaG9zdCA9IGhvc3Q7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQkKLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9EZXN0cm95KCkgewotCQlWaWV3IHZpZXcgPSAoVmlldykgaG9zdC5nZXRNb2RlbCgpOwotCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdmlldzsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RWxlbWVudFRvRGVzdHJveSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bkluY29taW5nUmVmZXJlbmNlcyhFT2JqZWN0IGRlc3RydWN0ZWUpIHsKLQkJQ3Jvc3NSZWZlcmVuY2VBZGFwdGVyIGNyb3NzUmVmZXJlbmNlciA9IENyb3NzUmVmZXJlbmNlQWRhcHRlcgotCQkJCS5nZXRFeGlzdGluZ0Nyb3NzUmVmZXJlbmNlQWRhcHRlcihkZXN0cnVjdGVlKTsKLQkJaWYgKGNyb3NzUmVmZXJlbmNlciAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGludmVyc2VSZWZlcmVuY2VzID0gY3Jvc3NSZWZlcmVuY2VyCi0JCQkJCS5nZXRJbnZlcnNlUmVmZXJlbmNlcyhkZXN0cnVjdGVlKTsKLQkJCWlmIChpbnZlcnNlUmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJaW50IHNpemUgPSBpbnZlcnNlUmVmZXJlbmNlcy5zaXplKCk7Ci0JCQkJaWYgKHNpemUgPiAwKSB7Ci0JCQkJCVNldHRpbmcgc2V0dGluZzsKLQkJCQkJRVJlZmVyZW5jZSBlUmVmOwotCQkJCQlTZXR0aW5nW10gc2V0dGluZ3MgPSAoU2V0dGluZ1tdKSBpbnZlcnNlUmVmZXJlbmNlcwotCQkJCQkJCS50b0FycmF5KG5ldyBTZXR0aW5nW3NpemVdKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLQkJCQkJCXNldHRpbmcgPSBzZXR0aW5nc1tpXTsKLQkJCQkJCWVSZWYgPSAoRVJlZmVyZW5jZSkgc2V0dGluZwotCQkJCQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCQkJCQlpZiAoZVJlZi5pc0NoYW5nZWFibGUoKQotCQkJCQkJCQkmJiAoZVJlZi5pc0Rlcml2ZWQoKSA9PSBmYWxzZSkKLQkJCQkJCQkJJiYgKGVSZWYuaXNDb250YWlubWVudCgpID09IGZhbHNlKQotCQkJCQkJCQkmJiAoZVJlZi5pc0NvbnRhaW5lcigpID09IGZhbHNlKSkgewotCQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoc2V0dGluZy5nZXRFT2JqZWN0KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9jb21tYW5kcy9Db3B5RGlhZ3JhbUNvbW1hbmQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2NvbW1hbmRzL0NvcHlEaWFncmFtQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWU4NjY4Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2NvbW1hbmRzL0NvcHlEaWFncmFtQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLkludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci0KLS8qKgotICogCi0gKiBJdCBkb2VzIGNvcHkgdGhlIGRpYWdyYW0gZm9yIHRoZSBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQ29weURpYWdyYW1Db21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBlbGVtZW50czsKLQotCXByaXZhdGUgTWFwIGNvcHlUb09yaWdpbmFsTWFwOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPERpYWdyYW0+IGNvcGllZEVsZW1lbnRzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IERpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmlzRGVidWdnaW5nKCk7Ci0KLQlwcml2YXRlIFByb2Nlc3MgdGFyZ2V0UHJvY2VzczsKLQotCXByaXZhdGUgRGlhZ3JhbU1hbmFnZXIgbWdyOwotCXByaXZhdGUgSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW47Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ29weURpYWdyYW1Db21tYW5kKENvbGxlY3Rpb24gZWxlbWVudHMsIE1hcCBjb3B5VG9PcmlnaW5hbE1hcCwKLQkJCVByb2Nlc3MgdGFyZ2V0UHJvY2VzcykgewotCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7Ci0JCXRoaXMuY29weVRvT3JpZ2luYWxNYXAgPSBjb3B5VG9PcmlnaW5hbE1hcDsKLQkJdGhpcy50YXJnZXRQcm9jZXNzID0gdGFyZ2V0UHJvY2VzczsKLQotCQkvLyBnZXQgZGlhZ3JhbSBtYW5hZ2VyIGFuZCBkb21haW4KLQkJbWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UodGFyZ2V0UHJvY2Vzcyk7Ci0JCWRvbWFpbiA9IG1nci5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQkKLQkJaWYgKGNvcGllZEVsZW1lbnRzID09IG51bGwpIHsKLQkJCWNvcGllZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxEaWFncmFtPigpOwotCQl9IGVsc2UgewotCQkJY29waWVkRWxlbWVudHMuY2xlYXIoKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBvcmlnID0gY29weVRvT3JpZ2luYWxNYXAuZ2V0KGUpOwotCQkJCWlmIChvcmlnICE9IG51bGwgJiYgb3JpZyBpbnN0YW5jZW9mIEFjdGl2aXR5ICYmIGUgIT0gbnVsbAotCQkJCQkJJiYgZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUFjdGl2aXR5IGNvcHlBY3Rpdml0eSA9IChBY3Rpdml0eSkgZTsKLQkJCQkJQWN0aXZpdHkgb3JpZ0FjdGl2aXR5ID0gKEFjdGl2aXR5KSBvcmlnOwotCi0JCQkJCUNvbGxlY3Rpb24gZGlhZ3JhbXMgPSBEaWFncmFtSGVscGVyCi0JCQkJCQkJLmdldERpYWdyYW1zKG9yaWdBY3Rpdml0eSk7Ci0JCQkJCWlmIChkaWFncmFtcyAhPSBudWxsICYmICFkaWFncmFtcy5pc0VtcHR5KCkpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGRpYWdyYW1zLml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJCQkvLyBjb3B5IHRoZSBkaWFncmFtCi0JCQkJCQkJCURpYWdyYW0gZGlhZ3JhbUNvcHkgPSAoRGlhZ3JhbSkgRGlhZ3JhbUhlbHBlcgotCQkJCQkJCQkJCS5jb3B5RGlhZ3JhbShkb21haW4sIGRpYWdyYW0pOwotCi0JCQkJCQkJCS8vIHVwZGF0ZSBjaGlsZHJlbiByZWZlcmVuY2VzCi0JCQkJCQkJCXVwZGF0ZVJlZmVyZW5jZXMoZGlhZ3JhbUNvcHkpOwotCi0JCQkJCQkJCVRyYW5zYWN0aW9uIHR4ID0gZG9tYWluLnN0YXJ0VHJhbnNhY3Rpb24oZmFsc2UsCi0JCQkJCQkJCQkJQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQotCQkJCQkJCQkvLyBhc3NvY2lhdGUgd2l0aCB0aGUgYWN0aXZpdHkKLQkJCQkJCQkJaW50IGRpYWdyYW1UeXBlID0gRGlhZ3JhbUhlbHBlcgotCQkJCQkJCQkJCS5nZXREaWFncmFtVHlwZShkaWFncmFtQ29weSk7Ci0JCQkJCQkJCW1nci5hc3NvY2lhdGUoZGlhZ3JhbUNvcHksIGRpYWdyYW1UeXBlLAotCQkJCQkJCQkJCShBY3Rpdml0eSkgY29weUFjdGl2aXR5KTsKLQotCQkJCQkJCQl0eC5jb21taXQoKTsKLQotCQkJCQkJCQljb3BpZWRFbGVtZW50cy5hZGQoZGlhZ3JhbUNvcHkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCWlmIChERUJVRykgewotCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGVBbm5vdGF0aW9ucyByZWZlcmVuY2VzCi0JICogCi0JICogQHBhcmFtIGNvcHkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVSZWZlcmVuY2VzKERpYWdyYW0gY29weSkgewotCQlpbnQgZGlhZ3JhbVR5cGUgPSBEaWFncmFtSGVscGVyLmdldERpYWdyYW1UeXBlKGNvcHkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjb3B5LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0KLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdG9yLm5leHQoKTsKLQkJCUVPYmplY3Qgb2JqID0gbm9kZS5nZXRFbGVtZW50KCk7Ci0KLQkJCWlmIChkaWFncmFtVHlwZSA9PSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSkgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlCi0JCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBBY3Rpdml0eVBhcmFtZXRlck5vZGUpIHsKLQkJCQkJRU1vZGVsRWxlbWVudCBtb2RlbEVsZW1lbnQgPSAoRU1vZGVsRWxlbWVudCkgb2JqOwotCQkJCQlNZXRob2RFbGVtZW50IG1lID0gQnJpZGdlSGVscGVyCi0JCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRGcm9tQW5ub3RhdGlvbihtb2RlbEVsZW1lbnQsCi0JCQkJCQkJCQl0YXJnZXRQcm9jZXNzLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpOwotCi0JCQkJCU9iamVjdCBtYXBwZWRNZXRob2RFbGVtZW50ID0gZ2V0Q29waWVkRWxlbWVudCgKLQkJCQkJCQljb3B5VG9PcmlnaW5hbE1hcCwgbWUpOwotCQkJCQlpZiAobWFwcGVkTWV0aG9kRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb24obW9kZWxFbGVtZW50LAotCQkJCQkJCQkoTWV0aG9kRWxlbWVudCkgbWFwcGVkTWV0aG9kRWxlbWVudCk7Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZGlhZ3JhbVR5cGUgPT0gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIpIHsKLQkJCQkJTm9kZUNvbnRhaW5lciBub2RlQ29udGFpbmVyID0gKE5vZGVDb250YWluZXIpIG9iajsKLQkJCQkJLy8gZG8gbWFwcGluZyBmb3Igbm9kZWNvbnRhaW5lcgotCQkJCQlNZXRob2RFbGVtZW50IG1lID0gbm9kZUNvbnRhaW5lci5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQkJCU9iamVjdCBtYXBwZWRNZXRob2RFbGVtZW50ID0gZ2V0Q29waWVkRWxlbWVudCgKLQkJCQkJCQljb3B5VG9PcmlnaW5hbE1hcCwgbWUpOwotCQkJCQlpZiAobWFwcGVkTWV0aG9kRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlub2RlQ29udGFpbmVyCi0JCQkJCQkJCS5zZXRMaW5rZWRFbGVtZW50KChNZXRob2RFbGVtZW50KSBtYXBwZWRNZXRob2RFbGVtZW50KTsKLQkJCQkJfQotCi0JCQkJCS8vIGRvIG1hcHBpbmcgZm9yIGl0cyBjaGlsZHJlbgotCQkJCQlMaXN0IG5vZGVzID0gbm9kZUNvbnRhaW5lci5nZXROb2RlcygpOwotCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCU5hbWVkTm9kZSBuYW1lZE5vZGUgPSAoTmFtZWROb2RlKSBub2Rlcy5nZXQoaSk7Ci0JCQkJCQltZSA9IG5hbWVkTm9kZS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0KLQkJCQkJCW1hcHBlZE1ldGhvZEVsZW1lbnQgPSBnZXRDb3BpZWRFbGVtZW50KAotCQkJCQkJCQljb3B5VG9PcmlnaW5hbE1hcCwgbWUpOwotCQkJCQkJaWYgKG1hcHBlZE1ldGhvZEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCW5hbWVkTm9kZQotCQkJCQkJCQkJLnNldExpbmtlZEVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpIG1hcHBlZE1ldGhvZEVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChkaWFncmFtVHlwZSA9PSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSkgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBOYW1lZE5vZGUpIHsKLQkJCQkJTmFtZWROb2RlIG5hbWVkTm9kZSA9IChOYW1lZE5vZGUpIG9iajsKLQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IG5hbWVkTm9kZS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0KLQkJCQkJT2JqZWN0IG1hcHBlZE1ldGhvZEVsZW1lbnQgPSBnZXRDb3BpZWRFbGVtZW50KAotCQkJCQkJCWNvcHlUb09yaWdpbmFsTWFwLCBtZSk7Ci0JCQkJCWlmIChtYXBwZWRNZXRob2RFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCW5hbWVkTm9kZQotCQkJCQkJCQkuc2V0TGlua2VkRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgbWFwcGVkTWV0aG9kRWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgY29waWVkIGVsZW1lbnQgZnJvbSB0aGUgbWFwCi0JICogCi0JICogQHBhcmFtIGNvcGllZE1hcAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldENvcGllZEVsZW1lbnQoTWFwIGNvcGllZE1hcCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJU2V0IGtleXMgPSBjb3BpZWRNYXAua2V5U2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGtleXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qga2V5ID0gaXRvci5uZXh0KCk7Ci0JCQlPYmplY3QgdmFsdWUgPSBjb3BpZWRNYXAuZ2V0KGtleSk7Ci0JCQlpZiAodmFsdWUuZXF1YWxzKGVsZW1lbnQpKQotCQkJCXJldHVybiBrZXk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmICghKGNvcGllZEVsZW1lbnRzID09IG51bGwgfHwgY29waWVkRWxlbWVudHMuaXNFbXB0eSgpKSkgewotCQkJdHJ5IHsKLQkJCQlUcmFuc2FjdGlvbiB0eCA9IGRvbWFpbi5zdGFydFRyYW5zYWN0aW9uKGZhbHNlLAotCQkJCQkJQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb3BpZWRFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGl0ZXIubmV4dCgpOwotCi0JCQkJCW1nci5nZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkKLQkJCQkJCQkucmVtb3ZlKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCQkJbWdyLmdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5yZW1vdmUoZGlhZ3JhbSk7Ci0JCQkJfQotCQkJCWNvcGllZEVsZW1lbnRzLmNsZWFyKCk7Ci0JCQkJdHguY29tbWl0KCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKGNvcGllZEVsZW1lbnRzID09IG51bGwgfHwgY29waWVkRWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBjb21tYW5kIGlzIG5vdCBleGVjdXRlZCB5ZXQKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCUhhc2hTZXQ8T2JqZWN0PiBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb3BpZWRFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBpdGVyLm5leHQoKTsKLQkJCWlmKGRpYWdyYW0gIT0gbnVsbCAmJiBkaWFncmFtLmVSZXNvdXJjZSgpICE9IG51bGwpCi0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGRpYWdyYW0uZVJlc291cmNlKCkpOwotCQl9Ci0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQkKLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKG1nciAhPSBudWxsKQotCQkJbWdyLnJlbGVhc2UoKTsKLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvY29tbWFuZHMvQ3JlYXRlQWN0aXZpdHlOb2RlSW5BY3Rpdml0eVBhcnRpdGlvbi5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvY29tbWFuZHMvQ3JlYXRlQWN0aXZpdHlOb2RlSW5BY3Rpdml0eVBhcnRpdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OThiOWRkLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2NvbW1hbmRzL0NyZWF0ZUFjdGl2aXR5Tm9kZUluQWN0aXZpdHlQYXJ0aXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5QYWNrYWdlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVBY3Rpdml0eU5vZGVJbkFjdGl2aXR5UGFydGl0aW9uIGV4dGVuZHMgQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgQ3JlYXRlQWN0aXZpdHlOb2RlSW5BY3Rpdml0eVBhcnRpdGlvbihDcmVhdGVFbGVtZW50UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXN1cGVyKHJlcXVlc3QpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCX07Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCWlmKGNvbnRhaW5lciBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uKXsKLQkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kI2RvRXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlzdGF0dXMgPSBzdXBlci5kb0V4ZWN1dGUobW9uaXRvciwgaW5mbyk7Ci0JCUVPYmplY3QgbmV3RWxlbWVudCA9IGdldE5ld0VsZW1lbnQoKTsKLQkJCi0JCWlmIChuZXdFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSAKLQkJewotCQkJRU9iamVjdCBvYmogPSBnZXRPcmlnaW5hbENvbnRhaW5lcigpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uKSB7Ci0JCQkJLy8gc2V0IGlucGFydGl0aW9uIAotCQkJCSgoQWN0aXZpdHlOb2RlKSBuZXdFbGVtZW50KS5nZXRJblBhcnRpdGlvbnMoKS5hZGQob2JqKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLQkKLQotCS8qKgotCSAqIEBjdXN0b20KLQkgKi8KLQlwcml2YXRlIEVPYmplY3QgZ2V0T3JpZ2luYWxDb250YWluZXIoKQotCXsKLQkJcmV0dXJuICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuZ2V0Q29udGFpbmVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRhaW5tZW50IGZlYXR1cmUgZm9yIHRoZSBuZXcgZWxlbWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb250YWlubWVudCBmZWF0dXJlCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgewotCi0JCS8qKgotCQkgKiBUaGUgY29udGFpbm1lbnQgZmVhdHVyZSBpbiB3aGljaCB0aGUgbmV3IGVsZW1lbnQgd2lsbCBiZSBjcmVhdGVkLgotCQkgKi8KLQkJRVJlZmVyZW5jZSBjb250YWlubWVudEZlYXR1cmU9bnVsbDsKLQkJaWYgKGNvbnRhaW5tZW50RmVhdHVyZSA9PSBudWxsKSB7Ci0JCQlFQ2xhc3MgY2xhc3NUb0VkaXQgPSBnZXRFQ2xhc3NUb0VkaXQoKTsKLQotCQkJaWYgKGNsYXNzVG9FZGl0ICE9IG51bGwpIHsKLQkJCQlJRWxlbWVudFR5cGUgdHlwZSA9IGdldEVsZW1lbnRUeXBlKCk7Ci0KLQkJCQlpZiAodHlwZSAhPSBudWxsICYmIHR5cGUuZ2V0RUNsYXNzKCkgIT0gbnVsbCkgewotCQkJCQljb250YWlubWVudEZlYXR1cmUgPSBQYWNrYWdlVXRpbC5maW5kRmVhdHVyZShjbGFzc1RvRWRpdCwKLQkJCQkJCQl0eXBlLmdldEVDbGFzcygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY29udGFpbm1lbnRGZWF0dXJlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2NvbW1hbmRzL0NyZWF0ZURpYWdyYW1Db21tYW5kLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9jb21tYW5kcy9DcmVhdGVEaWFncmFtQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWQ2MTM3Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2NvbW1hbmRzL0NyZWF0ZURpYWdyYW1Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnV0aWwuVW1hVW1sVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5FUEZEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLlZpZXdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZURpYWdyYW1Db21tYW5kIGV4dGVuZHMgQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDT01NQU5EX0xBQkVMID0gIkNyZWF0aW5nIGRpYWdyYW0gYW5kIG1vZGVsIjsgCi0JcHJpdmF0ZSBJRWRpdG9ySW5wdXQgaW5wdXQ7Ci0JcHJpdmF0ZSBSZXNvdXJjZSBkaWFncmFtUmVzb3VyY2U7Ci0JcHJpdmF0ZSBTdHJpbmcga2luZFBhcmFtOwotCS8vcHJpdmF0ZSBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW47Ci0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBhZmZlY3RlZEZpbGVzCi0JICovCi0JcHVibGljIENyZWF0ZURpYWdyYW1Db21tYW5kKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCVN0cmluZyBsYWJlbCwgTGlzdCBhZmZlY3RlZEZpbGVzLCAKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCwgUmVzb3VyY2UgZGlhZ3JhbVJlc291Y2UsCi0JCQlTdHJpbmcga2luZFBhcmFtKSB7Ci0JCXN1cGVyKGRvbWFpbiwgbGFiZWwsIGFmZmVjdGVkRmlsZXMpOwotCQl0aGlzLmlucHV0ID0gaW5wdXQ7Ci0JCXRoaXMuZGlhZ3JhbVJlc291cmNlID0gZGlhZ3JhbVJlc291Y2U7Ci0JCXRoaXMua2luZFBhcmFtID0ga2luZFBhcmFtOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb21haW4KLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqIEBwYXJhbSBhZmZlY3RlZEZpbGVzCi0JICovCi0JcHVibGljIENyZWF0ZURpYWdyYW1Db21tYW5kKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCVN0cmluZyBsYWJlbCwgTWFwIG9wdGlvbnMsIExpc3QgYWZmZWN0ZWRGaWxlcykgewotCQlzdXBlcihkb21haW4sIGxhYmVsLCBvcHRpb25zLCBhZmZlY3RlZEZpbGVzKTsKLQkJLy8vdGhpcy5kb21haW4gPSBkb21haW47Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kI2RvRXhlY3V0ZVdpdGhSZXN1bHQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJQWN0aXZpdHkgbW9kZWwgPSBjcmVhdGVJbml0aWFsTW9kZWwoKTsKLQkJZGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKG1vZGVsKTsKLQkJRGlhZ3JhbSBkaWFncmFtID0gVmlld1NlcnZpY2UuY3JlYXRlRGlhZ3JhbShtb2RlbCwga2luZFBhcmFtLAotCQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCi0JCQlNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSAoKERpYWdyYW1FZGl0b3JJbnB1dClpbnB1dCkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJaWYobWV0aG9kRWxlbWVudCAhPSBudWxsICYmIG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5KXsKLQkJCQlVbWFVbWxVdGlsLmNyZWF0ZUVBbm5vdGF0aW9uRm9yVW1sKG1vZGVsLCBtZXRob2RFbGVtZW50LmdldEd1aWQoKSk7Ci0JCQl9Ci0JCQkKLQkJCWRpYWdyYW1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtKTsKLQkJCWRpYWdyYW0uc2V0TmFtZShtZXRob2RFbGVtZW50LmdldE5hbWUoKSk7Ci0JCQlkaWFncmFtLnNldEVsZW1lbnQobW9kZWwpOwotCQl9Ci0JCXRyeSB7Ci0JCQlkaWFncmFtUmVzb3VyY2Uuc2F2ZShDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0KLQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBzdG9yZSBtb2RlbCBhbmQgZGlhZ3JhbSByZXNvdXJjZXMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdCgpOwkKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGRvbWFpbiBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBjYW52YXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHkgY3JlYXRlSW5pdGlhbE1vZGVsKCkgewotCQlyZXR1cm4gVU1MRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9jb21tYW5kcy9DcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93Q29tbWFuZC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvY29tbWFuZHMvQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvd0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UyZDMyYy4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9jb21tYW5kcy9DcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvd0NvbW1hbmQgZXh0ZW5kcyBDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kIHsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvd0NvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXF1ZXN0LAotCQkJRU9iamVjdCBlbGVtZW50KSB7Ci0JCXN1cGVyKHJlcXVlc3QpOwotCQlzZXRFbGVtZW50VG9FZGl0KGVsZW1lbnQpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqLwotCXB1YmxpYyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93Q29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJc3VwZXIocmVxdWVzdCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0vLwkJaWYoZ2V0U291cmNlKCkgPT0gbnVsbCkKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCQotLy8JCWlmIChnZXRFQ2xhc3NUb0VkaXQoKSA9PSBudWxsKSB7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0vLwotLy8JCWlmIChnZXRDb250YWlubWVudEZlYXR1cmUoKSAhPSBudWxsKSB7Ci0vLwkJCUVDbGFzc2lmaWVyIGVDbGFzc2lmaWVyID0gZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkuZ2V0RVR5cGUoKTsKLS8vCQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotLy8KLS8vCQkJaWYgKGVDbGFzc2lmaWVyIGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0vLwkJCQlyZXN1bHQgPSAoKEVDbGFzcykgZUNsYXNzaWZpZXIpLmlzU3VwZXJUeXBlT2YoZ2V0RWxlbWVudFR5cGUoKQotLy8JCQkJCQkuZ2V0RUNsYXNzKCkpOwotLy8JCQl9Ci0vLwotLy8JCQlyZXN1bHQgPSByZXN1bHQKLS8vCQkJCQkmJiBQYWNrYWdlVXRpbC5jYW5SZWZlcmVuY2UoZ2V0RUNsYXNzVG9FZGl0KCksCi0vLwkJCQkJCQlnZXRDb250YWlubWVudEZlYXR1cmUoKSwgZ2V0RWxlbWVudFR5cGUoKQotLy8JCQkJCQkJCQkuZ2V0RUNsYXNzKCkpOwotLy8KLS8vCQkJcmV0dXJuIHJlc3VsdDsKLS8vCQl9Ci0vLwkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCUNvbnRyb2xGbG93IG5ld0VsZW1lbnQgPSAoQ29udHJvbEZsb3cpIHN1cGVyLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQluZXdFbGVtZW50LnNldFRhcmdldCgoQWN0aXZpdHlOb2RlKSBnZXRUYXJnZXQoKSk7Ci0JCQluZXdFbGVtZW50LnNldFNvdXJjZSgoQWN0aXZpdHlOb2RlKSBnZXRTb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvY29tbWFuZHMvQ3JlYXRlT3V0Z29pbmdDb250cm9sRmxvd0NvbW1hbmQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2NvbW1hbmRzL0NyZWF0ZU91dGdvaW5nQ29udHJvbEZsb3dDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MzkwOTQuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvY29tbWFuZHMvQ3JlYXRlT3V0Z29pbmdDb250cm9sRmxvd0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5QYWNrYWdlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZU91dGdvaW5nQ29udHJvbEZsb3dDb21tYW5kIGV4dGVuZHMgQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIENyZWF0ZU91dGdvaW5nQ29udHJvbEZsb3dDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxdWVzdCwKLQkJCUVPYmplY3QgZWxlbWVudCkgewotCQlzdXBlcihyZXF1ZXN0KTsKLQkJc2V0RWxlbWVudFRvRWRpdChlbGVtZW50KTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgQ3JlYXRlT3V0Z29pbmdDb250cm9sRmxvd0NvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXN1cGVyKHJlcXVlc3QpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eU5vZGUoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJaWYoZ2V0U291cmNlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChnZXRFQ2xhc3NUb0VkaXQoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgIT0gbnVsbCkgewotCQkJRUNsYXNzaWZpZXIgZUNsYXNzaWZpZXIgPSBnZXRDb250YWlubWVudEZlYXR1cmUoKS5nZXRFVHlwZSgpOwotCQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCi0JCQlpZiAoZUNsYXNzaWZpZXIgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKLQkJCQlyZXN1bHQgPSAoKEVDbGFzcykgZUNsYXNzaWZpZXIpLmlzU3VwZXJUeXBlT2YoZ2V0RWxlbWVudFR5cGUoKQotCQkJCQkJLmdldEVDbGFzcygpKTsKLQkJCX0KLQotCQkJcmVzdWx0ID0gcmVzdWx0Ci0JCQkJCSYmIFBhY2thZ2VVdGlsLmNhblJlZmVyZW5jZShnZXRFQ2xhc3NUb0VkaXQoKSwKLQkJCQkJCQlnZXRDb250YWlubWVudEZlYXR1cmUoKSwgZ2V0RWxlbWVudFR5cGUoKQotCQkJCQkJCQkJLmdldEVDbGFzcygpKTsKLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JCS8vcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVPYmplY3QgZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCkgewotCQkvLyBUT0RPOiBSZXNvbHZlIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBwcm9wZXJseS4KLQkJQ29udHJvbEZsb3cgbmV3RWxlbWVudCA9IChDb250cm9sRmxvdykgc3VwZXIuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCW5ld0VsZW1lbnQuc2V0VGFyZ2V0KChBY3Rpdml0eU5vZGUpIGdldFRhcmdldCgpKTsKLQkJCW5ld0VsZW1lbnQuc2V0U291cmNlKChBY3Rpdml0eU5vZGUpIGdldFNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gbmV3RWxlbWVudDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9jb21tYW5kcy9DcmVhdGVSZWxhdGlvblNoaXBDb21tYW5kU3RydWN0dXJlZEFjdGl2aXR5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9jb21tYW5kcy9DcmVhdGVSZWxhdGlvblNoaXBDb21tYW5kU3RydWN0dXJlZEFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNTJlOGUuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvY29tbWFuZHMvQ3JlYXRlUmVsYXRpb25TaGlwQ29tbWFuZFN0cnVjdHVyZWRBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlUmVsYXRpb25TaGlwQ29tbWFuZFN0cnVjdHVyZWRBY3Rpdml0eSBleHRlbmRzCi0JCUNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQgewotCi0JLyoqCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgQ3JlYXRlUmVsYXRpb25TaGlwQ29tbWFuZFN0cnVjdHVyZWRBY3Rpdml0eSgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxdWVzdCwgRU9iamVjdCBlbGVtZW50KSB7Ci0JCXN1cGVyKHJlcXVlc3QpOwotCQlzZXRFbGVtZW50VG9FZGl0KGVsZW1lbnQpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCk7Ci0JfTsKLQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCkgewotCQlDb250cm9sRmxvdyBuZXdFbGVtZW50ID0gKENvbnRyb2xGbG93KSBzdXBlcgotCQkJCS5kb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKTsKLQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJbmV3RWxlbWVudC5zZXRUYXJnZXQoKEFjdGl2aXR5Tm9kZSkgZ2V0VGFyZ2V0KCkpOwotCQkJbmV3RWxlbWVudC5zZXRTb3VyY2UoKEFjdGl2aXR5Tm9kZSkgZ2V0U291cmNlKCkpOwotCQl9Ci0JCXJldHVybiBuZXdFbGVtZW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9jb21tYW5kcy9EZWxldGVEaWFncmFtQ29tbWFuZC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvY29tbWFuZHMvRGVsZXRlRGlhZ3JhbUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU4MDZmOS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9jb21tYW5kcy9EZWxldGVEaWFncmFtQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmVkaXRvci5FZGl0b3JTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogQ29tbWFuZCB0byBkZWxldGUgdGhlIGRpYWdyYW0vZGlhZ3JhbSBlbGVtZW50IG9mIGdpdmVuIEFjdGl2aXR5L0NQLCB0aGlzIGNvbW1hbmQgaXMgcGVyZm9ybWVkCi0gKiB0aHJvdWdoIG5lc3RlZCBjb21tYW5kcyBpbiB7QGxpbmsgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmR9LiAgCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZURpYWdyYW1Db21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMgSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBlbGVtZW50c1RvUmVtb3ZlOwotCXByaXZhdGUgUHJvY2VzcyB0YXJnZXRQcm9jZXNzOwotCXByaXZhdGUgRGlhZ3JhbU1hbmFnZXIgZE1nciA9IG51bGw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGVsZXRlRGlhZ3JhbUNvbW1hbmQoQ29sbGVjdGlvbiBlbGVtZW50c1RvUmVtb3ZlLCBQcm9jZXNzIHRhcmdldFByb2Nlc3MpIHsKLQkJdGhpcy5lbGVtZW50c1RvUmVtb3ZlID0gZWxlbWVudHNUb1JlbW92ZTsKLQkJdGhpcy50YXJnZXRQcm9jZXNzID0gdGFyZ2V0UHJvY2VzczsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJdHJ5IHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJQ29sbGVjdGlvbiBkaWFncmFtcyA9IERpYWdyYW1IZWxwZXIKLQkJCQkJCQkuZ2V0RGlhZ3JhbXMoKEFjdGl2aXR5KSBlbGVtZW50KTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRpYWdyYW1zLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCQkJLy8gQmVmb3JlIGRlbGV0aW5nIGNsb3NlIG9wZW5lZCBkaWFncmFtIGVkaXRvcnMuCi0JCQkJCQkJY2xvc2VEaWFncmFtRWRpdG9yKGRpYWdyYW0pOwotCQkJCQkJCS8vIERlbGV0ZSBEaWFncmFtLgotCQkJCQkJCURpYWdyYW1IZWxwZXIuZGVsZXRlRGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJZE1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKHRhcmdldFByb2Nlc3MpOwotCQlIYXNoU2V0PE9iamVjdD4gbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCXRyeXsKLQkJCWlmKGRNZ3IgIT0gbnVsbCAmJiBkTWdyLmdldFJlc291cmNlKCkgIT0gbnVsbCl7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGRNZ3IuZ2V0UmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX1jYXRjaChFeGNlcHRpb24gZSl7Ci0JCQkKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiB0YXJnZXRQcm9jZXNzICE9IG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKGRNZ3IgIT0gbnVsbCl7Ci0JCQlkTWdyLnJlbGVhc2UoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjbG9zZURpYWdyYW1FZGl0b3IoRGlhZ3JhbSBkaWFncmFtKXsKLQkJTGlzdCBlZGl0b3JzID0gRWRpdG9yU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFJlZ2lzdGVyZWRFZGl0b3JQYXJ0cygpOwotCQlJdGVyYXRvciBpdCA9IGVkaXRvcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3IpIHsKLQkJCQlEaWFncmFtRWRpdG9yIGRpYWdyYW1FZGl0b3IgPSAoKERpYWdyYW1FZGl0b3IpIG9iaik7Ci0JCQkJaWYgKGRpYWdyYW1FZGl0b3IuZ2V0RGlhZ3JhbSgpLmVxdWFscyhkaWFncmFtKSkgewotCQkJCQkvL2l0J3MgYWxyZWFkeSBvcGVuLCBqdXN0IGNsb3NlIGl0LgotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkuZ2V0QWN0aXZlUGFnZSgpLmFjdGl2YXRlKGRpYWdyYW1FZGl0b3IpOwotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCS5nZXRBY3RpdmVQYWdlKCkuY2xvc2VFZGl0b3IoZGlhZ3JhbUVkaXRvciwgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2NvbW1hbmRzL0RpYWdyYW1Db3B5Q29tbWFuZC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvY29tbWFuZHMvRGlhZ3JhbUNvcHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjZjNTcuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvY29tbWFuZHMvRGlhZ3JhbUNvcHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWwuQ29waWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uaW1wbC5JbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS51dGlsLlVtYVVtbFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuT2JqZWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Db3B5Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0KLQlwcml2YXRlIERpYWdyYW0gZGlhZ3JhbTsKLQlwcml2YXRlIEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluOwotCXByaXZhdGUgUmVzb3VyY2UgcmVzb3VyY2U7Ci0JcHJpdmF0ZSBEaWFncmFtIGNvcHlEaWFncmFtOwotCXByaXZhdGUgQWN0aXZpdHkgb3JpZ0FjdDsKLQlwcml2YXRlIEFjdGl2aXR5IGNvcHlBY3Q7Ci0JcHJpdmF0ZSBIZWxwZXIgY29waWVkSGVscGVyOwotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBEaWFncmFtQ29weUNvbW1hbmQoSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIERpYWdyYW0gZGlhZ3JhbSwgCi0JCQlBY3Rpdml0eSBvcmlnQWN0LCBBY3Rpdml0eSBjb3B5QWN0LCBSZXNvdXJjZSByZXNvdXJjZSwgSGVscGVyIGNvcGllZEhlbHBlcikgewotCQl0aGlzLmRvbWFpbiA9IGRvbWFpbjsKLQkJdGhpcy5kaWFncmFtID0gZGlhZ3JhbTsKLQkJdGhpcy5jb3B5QWN0ID0gY29weUFjdDsKLQkJdGhpcy5vcmlnQWN0ID0gb3JpZ0FjdDsKLQkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwotCQl0aGlzLmNvcGllZEhlbHBlciA9IGNvcGllZEhlbHBlcjsKLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqLwotCXB1YmxpYyBEaWFncmFtQ29weUNvbW1hbmQoU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIERpYWdyYW1Db3B5Q29tbWFuZChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkKLQkJdHJ5ewotCQkJVHJhbnNhY3Rpb24gdCA9IGRvbWFpbi5zdGFydFRyYW5zYWN0aW9uKGZhbHNlLCBuZXcgSGFzaE1hcCgpKTsKLQkJCWNvcHlEaWFncmFtID0gY29weURpYWdyYW0oZGlhZ3JhbSwgY29weUFjdCk7Ci0JCQlVbWFVbWxVdGlsLnVwZGF0ZUVBbm5vdGF0aW9uRm9yVW1sKChOYW1lZEVsZW1lbnQpY29weURpYWdyYW0uZ2V0RWxlbWVudCgpLAotCQkJCWNvcHlBY3QuZ2V0R3VpZCgpKTsKLQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGNvcHlEaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChjb3B5RGlhZ3JhbSk7Ci0JCQkKLQkJCS8vIFRPRE86IHNob3VsZCBub3Qgc2F2ZSB1bnRpbCwgc2F2ZSBhY3Rpb24gcGVyZm9ybWVkLgotCQkJcmVzb3VyY2Uuc2F2ZShDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQkJdC5jb21taXQoKTsKLQkJCQotCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZihjb3B5RGlhZ3JhbSAhPSBudWxsKXsKLQkJCXRyeXsKLQkJCQlUcmFuc2FjdGlvbiB0ID0gZG9tYWluLnN0YXJ0VHJhbnNhY3Rpb24oZmFsc2UsIG5ldyBIYXNoTWFwKCkpOwotCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkucmVtb3ZlKGNvcHlEaWFncmFtKTsKLQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLnJlbW92ZShjb3B5RGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCXJlc291cmNlLnNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCQl0LmNvbW1pdCgpOwotCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXN1cGVyLnVuZG8oKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZGlhZ3JhbSAhPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgY29weSBvZiBEaWFncmFtLiBBbHNvIGNvcGllcyB0aGUgcmVmZXJlbmNlcyBhbmQgYWxzbyBjb3BpZXMgdGhlIHVtbE9iamVjdC4KLQkgKiBAcGFyYW0gc291cmNlRGlhZ3JhbQotCSAqIEBwYXJhbSBhY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIERpYWdyYW0gY29weURpYWdyYW0oRGlhZ3JhbSBzb3VyY2VEaWFncmFtLCBBY3Rpdml0eSBhY3QpewotCQlEaWFncmFtIGNvcHkgPSBjb3B5KHNvdXJjZURpYWdyYW0pOwotCQlFT2JqZWN0IHVtbENvcHkgPSBjb3B5LmdldEVsZW1lbnQoKTsKLQkJaWYoYWN0ICE9IG51bGwpewotCQkJLy9CcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb24oKE5hbWVkRWxlbWVudCl1bWxDb3B5LCBhY3QpOwotCQkJVW1hVW1sVXRpbC51cGRhdGVFQW5ub3RhdGlvbkZvclVtbCgoTmFtZWRFbGVtZW50KXVtbENvcHksIGFjdC5nZXRHdWlkKCkpOwotCQl9Ci0JCWlmKGNvcHkgIT0gbnVsbCl7Ci0JCQlyZXR1cm4gY29weTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHJpdmF0ZSBEaWFncmFtIGNvcHkoRGlhZ3JhbSBzb3VyY2VPYmplY3QpewotCQlDb3BpZXIgY29waWVyID0gbmV3IENvcGllcigpIHsKLQkJCi0JCQkvKioKLQkJCSAqIAotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJcHVibGljIEVPYmplY3QgY29weShFT2JqZWN0IGVPYmplY3QpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQkJRU9iamVjdCBjb3B5ID0gc3VwZXIuY29weShlT2JqZWN0KTsKLQkJCQlpZihjb3B5IGluc3RhbmNlb2YgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSB8fCBjb3B5IGluc3RhbmNlb2YgT2JqZWN0Tm9kZSl7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgb3JpZyA9IGdldE1ldGhvZEVsZW1lbnRGcm9tQW5ub3RhdGlvbigoRU1vZGVsRWxlbWVudCllT2JqZWN0KTsKLQkJCQkJRU9iamVjdCBjb3B5ZWxlbWVudCA9IChFT2JqZWN0KWNvcGllZEhlbHBlci5nZXQob3JpZyk7Ci0JCQkJCUJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvbigoRU1vZGVsRWxlbWVudCljb3B5LCAoTWV0aG9kRWxlbWVudCljb3B5ZWxlbWVudCk7Ci0JCQkJfQotCQkJCXJldHVybiBjb3B5OwotCQkJfQotCQl9OwotCQlFT2JqZWN0IHVtbENvcHkgPSBjb3BpZXIuY29weShzb3VyY2VPYmplY3QuZ2V0RWxlbWVudCgpKTsKLQkJRGlhZ3JhbSByZXN1bHQgPSAoRGlhZ3JhbSljb3BpZXIuY29weShzb3VyY2VPYmplY3QpOwotCQlyZXN1bHQuc2V0RWxlbWVudCh1bWxDb3B5KTsKLQkJY29waWVyLmNvcHlSZWZlcmVuY2VzKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnRGcm9tQW5ub3RhdGlvbihFTW9kZWxFbGVtZW50IG5vZGUpIHsJCQotCQkKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHAgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Mob3JpZ0FjdCk7Ci0JCVJlc291cmNlIHJlc291cmNlID0gcC5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSAhPSBudWxsKSB7Ci0JCQlFQW5ub3RhdGlvbiBlQW5ub3RhdGlvbiA9IG5vZGUuZ2V0RUFubm90YXRpb24oQnJpZGdlSGVscGVyLlVNQV9FTEVNRU5UKTsKLQkJCWlmIChlQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHVyaSA9IChTdHJpbmcpIGVBbm5vdGF0aW9uLmdldERldGFpbHMoKS5nZXQoQnJpZGdlSGVscGVyLlVNQV9VUkkpOwotCQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCQlFT2JqZWN0IG8gPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpLmdldEVPYmplY3QoCi0JCQkJCQkJVVJJLmNyZWF0ZVVSSSh1cmkpLCBmYWxzZSk7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJcmV0dXJuIChNZXRob2RFbGVtZW50KSBvOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gVE9ETzogbG9nIGVycm9yCi0JCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIk5vdCBhIG1ldGhvZCBlbGVtZW50OiAiICsgbyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9jb21tYW5kcy9FZGl0TmFtZUNvbW1hbmQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2NvbW1hbmRzL0VkaXROYW1lQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODg3MjJiLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2NvbW1hbmRzL0VkaXROYW1lQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuTmFtZWRFbGVtZW50OwotCi0vKioKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0TmFtZUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBsYWJlbCA9ICJFZGl0TmFtZUNvbW1hbmQiOwotCXByaXZhdGUgTmFtZWRFbGVtZW50IG9iamVjdDsKLQlwcml2YXRlIFN0cmluZyBuZXdWYWx1ZTsKLQlwcml2YXRlIFN0cmluZyBvbGROYW1lLCBvbGRQcmVzZW50YXRpb25OYW1lOwotCXByaXZhdGUgU3RyaW5nIGVsZW1lbnRHdWlkOwotCQotCXB1YmxpYyBFZGl0TmFtZUNvbW1hbmQoTmFtZWRFbGVtZW50IG9iamVjdCwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JCXRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoKEFjdGl2aXR5Tm9kZSlvYmplY3QpOwotCQkKLQkJLy8gc2V0IE5hbWUKLQkJdGhpcy5vbGROYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCWVsZW1lbnQuc2V0TmFtZShuZXdWYWx1ZSk7Ci0JCWVsZW1lbnRHdWlkID0gZWxlbWVudC5nZXRHdWlkKCk7Ci0JCQotCQkvLyBzZXRQcmVzZW50YXRpb25OYW1lCi0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpewotCQkJdGhpcy5vbGRQcmVzZW50YXRpb25OYW1lID0gKChEZXNjcmliYWJsZUVsZW1lbnQpZWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOyAKLQkJCSgoRGVzY3JpYmFibGVFbGVtZW50KWVsZW1lbnQpLnNldFByZXNlbnRhdGlvbk5hbWUobmV3VmFsdWUpOwotCQl9Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYobWFuYWdlciAhPSBudWxsKXsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudChlbGVtZW50R3VpZCk7Ci0JCQlpZihlbGVtZW50ICE9IG51bGwpewotCQkJCWVsZW1lbnQuc2V0TmFtZSh0aGlzLm9sZE5hbWUpOwotCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpewotCQkJCQkoKERlc2NyaWJhYmxlRWxlbWVudCllbGVtZW50KS5zZXRQcmVzZW50YXRpb25OYW1lKHRoaXMub2xkUHJlc2VudGF0aW9uTmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvY29tbWFuZHMvTmVzdGVkQ29tbWFuZFByb3ZpZGVyLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9jb21tYW5kcy9OZXN0ZWRDb21tYW5kUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdjNTllMC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9jb21tYW5kcy9OZXN0ZWRDb21tYW5kUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5XcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JTmVzdGVkQ29tbWFuZFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5BY3Rpdml0eURyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuSUFjdGlvblR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQWN0aXZpdHlIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbi5UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci0KLS8qKgotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTmVzdGVkQ29tbWFuZFByb3ZpZGVyIGltcGxlbWVudHMgSU5lc3RlZENvbW1hbmRQcm92aWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklOZXN0ZWRDb21tYW5kUHJvdmlkZXIjY3JlYXRlTmVzdGVkQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCkKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVOZXN0ZWRDb21tYW5kKENvbW1hbmQgY29tbWFuZCkgewotCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIEFjdGl2aXR5RHJvcENvbW1hbmQpIHsKLQkJCUFjdGl2aXR5RHJvcENvbW1hbmQgY21kID0gKEFjdGl2aXR5RHJvcENvbW1hbmQpIGNvbW1hbmQ7Ci0JCQlpZiAoSUFjdGlvblR5cGVQcm92aWRlci5DT1BZID09IGNtZC5nZXRUeXBlKCkpCi0JCQkJcmV0dXJuIGNyZWF0ZU5lc3RlZENvbW1hbmRGb3JDb3B5KGNtZCk7Ci0JCQllbHNlIGlmIChJQWN0aW9uVHlwZVByb3ZpZGVyLkRFRVBfQ09QWSA9PSBjbWQuZ2V0VHlwZSgpKQotCQkJCXJldHVybiBjcmVhdGVOZXN0ZWRDb21tYW5kRm9yRGVlcENvcHkoY21kKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmVzdGVkIGNvbW1hbmQgZm9yIERyYWcgJiBEcm9wIENvcHkKLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIENvbW1hbmQgY3JlYXRlTmVzdGVkQ29tbWFuZEZvckNvcHkoQWN0aXZpdHlEcm9wQ29tbWFuZCBjb21tYW5kKSB7Ci0JCUFjdGl2aXR5SGFuZGxlciBhY3Rpdml0eUhhbmRsZXIgPSAoKEFjdGl2aXR5RHJvcENvbW1hbmQpIGNvbW1hbmQpCi0JCQkJLmdldEFjdGl2aXR5SGFuZGxlcigpOwotCQlpZiAoYWN0aXZpdHlIYW5kbGVyICE9IG51bGwKLQkJCQkmJiAhYWN0aXZpdHlIYW5kbGVyLmdldEFjdGl2aXRpZXMoKS5pc0VtcHR5KCkpIHsKLQkJCUNvbXBvdW5kQ29tbWFuZCBjbWQgPSBuZXcgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZCgKLQkJCQkJQ29tcG91bmRDb21tYW5kLk1FUkdFX0NPTU1BTkRfQUxMKTsKLQotCQkJSGVscGVyIGNvcGllZEhlbHBlciA9IGNvbW1hbmQuZ2V0QWN0aXZpdHlIYW5kbGVyKCkuZ2V0Q29weUhlbHBlcigpOwotCQkJQWN0aXZpdHkgdGFyZ2V0QWN0aXZpdHkgPSBjb21tYW5kLmdldEFjdGl2aXR5KCk7Ci0JCQlQcm9jZXNzIHRhcmdldFByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3ModGFyZ2V0QWN0aXZpdHkpOwotCQkJU2V0IGtleXMgPSBjb3BpZWRIZWxwZXIua2V5U2V0KCk7Ci0KLQkJCWlmICh0YXJnZXRQcm9jICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlNYXAgY29weVRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBrZXlzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJRU9iamVjdCBvcmlnQWN0ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQkJRU9iamVjdCBjb3B5QWN0ID0gKEVPYmplY3QpIGNvcGllZEhlbHBlci5nZXQob3JpZ0FjdCk7Ci0JCi0JCQkJCQlpZiAob3JpZ0FjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkJCSYmIGNvcHlBY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9yaWdBY3Q6IiArIG9yaWdBY3QpOwotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvcHlBY3Q6IiArIGNvcHlBY3QpOwotCQkJCQkJCX0KLQkKLQkJCQkJCQljb3B5VG9PcmlnaW5hbE1hcC5wdXQoY29weUFjdCwgb3JpZ0FjdCk7Ci0JCQkJCQl9Ci0JCi0JCQkJCX0KLQkKLQkJCQkJY21kLmFwcGVuZChuZXcgQ29weURpYWdyYW1Db21tYW5kKGNvcHlUb09yaWdpbmFsTWFwLmtleVNldCgpLAotCQkJCQkJCWNvcHlUb09yaWdpbmFsTWFwLCB0YXJnZXRQcm9jKSk7Ci0JCQkJCi0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWNtZC5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gY21kOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZWQgbmVzdGVkIGNvbW1hbmQgZm9yIERyYWcgYW5kIERyb3AgRGVlcCBjb3B5Ci0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBDb21tYW5kIGNyZWF0ZU5lc3RlZENvbW1hbmRGb3JEZWVwQ29weShBY3Rpdml0eURyb3BDb21tYW5kIGNvbW1hbmQpIHsKLQkJQWN0aXZpdHlIYW5kbGVyIGFjdGl2aXR5SGFuZGxlciA9ICgoQWN0aXZpdHlEcm9wQ29tbWFuZCkgY29tbWFuZCkKLQkJCQkuZ2V0QWN0aXZpdHlIYW5kbGVyKCk7Ci0JCWlmIChhY3Rpdml0eUhhbmRsZXIgIT0gbnVsbAotCQkJCSYmICFhY3Rpdml0eUhhbmRsZXIuZ2V0RGVlcENvcGllcygpLmlzRW1wdHkoKSkgewotCQkJQ29tcG91bmRDb21tYW5kIGNtZCA9IG5ldyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKAotCQkJCQlDb21wb3VuZENvbW1hbmQuTUVSR0VfQ09NTUFORF9BTEwpOwotCQkJRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gKEV4cG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGFjdGl2aXR5SGFuZGxlci5nZXREZWVwQ29weUNvbmZpZygpOwotCQkJUHJvY2VzcyB0YXJnZXRQcm9jID0gYWN0aXZpdHlIYW5kbGVyLmdldFRhcmdldFByb2Nlc3MoKTsKLQkJCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJCWNvbmZpZyA9IHRhcmdldFByb2MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCX0KLQkJCUlDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gKChJQ29uZmlndXJhdG9yKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuZ2V0RmlsdGVyKCkpOwotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBvbGRDb25maWcgPSBjb25maWd1cmF0b3IKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCXRyeSB7Ci0JCQkJY29uZmlndXJhdG9yLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCQlpbnQgc2l6ZSA9IGFjdGl2aXR5SGFuZGxlci5nZXREZWVwQ29waWVzKCkuc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCUFjdGl2aXR5IGNvcHlBY3QgPSAoQWN0aXZpdHkpIGFjdGl2aXR5SGFuZGxlcgotCQkJCQkJCS5nZXREZWVwQ29waWVzKCkuZ2V0KGkpOwotCQkJCQlBY3Rpdml0eSBvcmlnQWN0ID0gKEFjdGl2aXR5KSBhY3Rpdml0eUhhbmRsZXIKLQkJCQkJCQkuZ2V0RGVlcENvcHlUb09yaWdpbmFsTWFwKCkuZ2V0KGNvcHlBY3QpOwotCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3Mgc3JjUHJvYyA9IFRuZ1V0aWwKLQkJCQkJCQkuZ2V0T3duaW5nUHJvY2VzcyhvcmlnQWN0KTsKLQotCQkJCQlNYXAgY29weVRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCQkJCWZpbmFsIFNldCBkZWVwQ29weVNldCA9IG5ldyBIYXNoU2V0KGFjdGl2aXR5SGFuZGxlcgotCQkJCQkJCS5nZXREZWVwQ29waWVzKCkpOwotCQkJCQlib29sZWFuIHNhbWVQcm9jZXNzID0gc3JjUHJvYyA9PSB0YXJnZXRQcm9jOwotCQkJCQlJdGVyYXRvciBjb3B5VHJlZSA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcigKLQkJCQkJCQlhZGFwdGVyRmFjdG9yeSwgY29weUFjdCk7Ci0JCQkJCUl0ZXJhdG9yIG9yaWdpbmFsVHJlZTsKLQkJCQkJaWYgKHNhbWVQcm9jZXNzKSB7Ci0JCQkJCQlvcmlnaW5hbFRyZWUgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoCi0JCQkJCQkJCWFkYXB0ZXJGYWN0b3J5LCBvcmlnQWN0KSB7Ci0KLQkJCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3QgbykgewotCQkJCQkJCQlpZiAoZGVlcENvcHlTZXQuY29udGFpbnMobykpIHsKLQkJCQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG8pOwotCQkJCQkJCX0KLQkJCQkJCX07Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlvcmlnaW5hbFRyZWUgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoCi0JCQkJCQkJCWFkYXB0ZXJGYWN0b3J5LCBvcmlnQWN0KTsKLQkJCQkJfQotCQkJCQl3aGlsZSAoY29weVRyZWUuaGFzTmV4dCgpKSB7Ci0JCQkJCQlPYmplY3QgY29weSA9IGNvcHlUcmVlLm5leHQoKTsKLQkJCQkJCU9iamVjdCBvcmlnOwotCQkJCQkJaWYgKHNhbWVQcm9jZXNzKSB7Ci0JCQkJCQkJZG8gewotCQkJCQkJCQlvcmlnID0gb3JpZ2luYWxUcmVlLm5leHQoKTsKLQkJCQkJCQl9IHdoaWxlIChkZWVwQ29weVNldC5jb250YWlucyhvcmlnKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCW9yaWcgPSBvcmlnaW5hbFRyZWUubmV4dCgpOwotCQkJCQkJfQotCQkJCQkJaWYgKGNvcHkgaW5zdGFuY2VvZiBXcmFwcGVySXRlbVByb3ZpZGVyKQotCQkJCQkJCWNvcHkgPSBUbmdVdGlsLnVud3JhcChjb3B5KTsKLQkJCQkJCWlmIChvcmlnIGluc3RhbmNlb2YgV3JhcHBlckl0ZW1Qcm92aWRlcikKLQkJCQkJCQlvcmlnID0gVG5nVXRpbC51bndyYXAob3JpZyk7Ci0JCQkJCQljb3B5VG9PcmlnaW5hbE1hcC5wdXQoY29weSwgb3JpZyk7Ci0JCQkJCX0KLQkJCQkJY21kLmFwcGVuZChuZXcgQ29weURpYWdyYW1Db21tYW5kKGNvcHlUb09yaWdpbmFsTWFwCi0JCQkJCQkJLmtleVNldCgpLCBjb3B5VG9PcmlnaW5hbE1hcCwgdGFyZ2V0UHJvYykpOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJY29uZmlndXJhdG9yLnNldE1ldGhvZENvbmZpZ3VyYXRpb24ob2xkQ29uZmlnKTsKLQkJCX0KLQkJCWlmICghY21kLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBjbWQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSU5lc3RlZENvbW1hbmRQcm92aWRlciNjcmVhdGVSZWxhdGVkT2JqZWN0cyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kKQotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZVJlbGF0ZWRPYmplY3RzKENvbGxlY3Rpb24gY3JlYXRlZEVsZW1lbnRzLAotCQkJQ29tbWFuZCBjcmVhdGVDb21tYW5kKSB7Ci0KLQkJQ29tcG91bmRDb21tYW5kIGNtZCA9IG5ldyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKAotCQkJCUNvbXBvdW5kQ29tbWFuZC5NRVJHRV9DT01NQU5EX0FMTCk7Ci0JCWlmIChjcmVhdGVDb21tYW5kIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQpIHsKLQotCQkJTWV0aG9kRWxlbWVudEFkZENvbW1hbmQgbWVDb21tYW5kID0gKChNZXRob2RFbGVtZW50QWRkQ29tbWFuZCkgY3JlYXRlQ29tbWFuZCk7Ci0JCQlDb21tYW5kIGFkZENvbW1hbmQgPSBtZUNvbW1hbmQuZ2V0Q29tbWFuZCgpOwotCQkJaWYgKGFkZENvbW1hbmQgaW5zdGFuY2VvZiBBZGRDb21tYW5kKSB7Ci0JCQkJRWRpdGluZ0RvbWFpbiBlZCA9ICgoQWRkQ29tbWFuZCkgYWRkQ29tbWFuZCkuZ2V0RG9tYWluKCk7Ci0JCQkJCi0JCQkJaWYgKCgoQWRkQ29tbWFuZClhZGRDb21tYW5kKS5nZXRPd25lcigpIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJaWYgKGVkIGluc3RhbmNlb2YgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQkJCQlNYXAgY29weVRvT3JpZ2luYWxNYXAgPSAoKFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZWQpCi0JCQkJCQkJCS5nZXRDb3B5VG9PcmlnaW5hbE1hcCgpOwotCQkJCQkJaWYgKCFjb3B5VG9PcmlnaW5hbE1hcC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlDb2xsZWN0aW9uIGFmZmVjdHMgPSBtZUNvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWZmZWN0cy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgaXRlcgotCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJCQkJY21kLmFwcGVuZChuZXcgQ29weURpYWdyYW1Db21tYW5kKAotCQkJCQkJCQkJCQljb3B5VG9PcmlnaW5hbE1hcC5rZXlTZXQoKSwKLQkJCQkJCQkJCQkJY29weVRvT3JpZ2luYWxNYXAsCi0JCQkJCQkJCQkJCSgoUHJvY2Vzc0NvbXBvbmVudCkgZWxlbWVudCkKLQkJCQkJCQkJCQkJCQkuZ2V0UHJvY2VzcygpKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBDb3B5L3Bhc3RlIHdpdGhpbiB0aGUgcHJvY2VzcyBlZGl0b3IKLQkJCQkJaWYgKGVkIGluc3RhbmNlb2YgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQkJCQlNYXAgb3JpZ2luYWxUb0NvcHlNYXAgPSAoKFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZWQpCi0JCQkJCQkJCS5nZXRPcmlnaW5hbFRvQ2xpcGJvYXJkTWFwKCk7Ci0JCQkJCQlNYXAgY29weVRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQkJT2JqZWN0IG93bmVyID0gKChBZGRDb21tYW5kKSBhZGRDb21tYW5kKS5nZXRPd25lcigpOwotCQkJCQkJUHJvY2VzcyB0YXJnZXRQcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKG93bmVyKTsKLQkJCQkJCWlmICh0YXJnZXRQcm9jICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvcmlnaW5hbFRvQ29weU1hcC5rZXlTZXQoKQotCQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCQlPYmplY3Qga2V5ID0gaXRlci5uZXh0KCk7Ci0JCQkJCQkJCU9iamVjdCB2YWwgPSBvcmlnaW5hbFRvQ29weU1hcC5nZXQoa2V5KTsKLQkKLQkJCQkJCQkJY29weVRvT3JpZ2luYWxNYXAucHV0KHZhbCwga2V5KTsKLQkJCQkJCQl9Ci0JCi0JCQkJCQkJY21kLmFwcGVuZChuZXcgQ29weURpYWdyYW1Db21tYW5kKGNvcHlUb09yaWdpbmFsTWFwLmtleVNldCgpLAotCQkJCQkJCQkJY29weVRvT3JpZ2luYWxNYXAsIHRhcmdldFByb2MpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIWNtZC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBjbWQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSU5lc3RlZENvbW1hbmRQcm92aWRlciNyZW1vdmVSZWxhdGVkT2JqZWN0cyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kKQotCSAqLwotCXB1YmxpYyBDb21tYW5kIHJlbW92ZVJlbGF0ZWRPYmplY3RzKENvbGxlY3Rpb24gZGVsZXRlZEVsZW1lbnRzLAotCQkJQ29tbWFuZCBkZWxldGVDb21tYW5kKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjbWQgPSBuZXcgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZCgKLQkJCQlDb21wb3VuZENvbW1hbmQuTUVSR0VfQ09NTUFORF9BTEwpOwotCQlpZihkZWxldGVDb21tYW5kIGluc3RhbmNlb2YgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQpewotCQkJQ29tbWFuZCByZW1vdmVDb21tYW5kID0gKChEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZClkZWxldGVDb21tYW5kKS5nZXRDb21tYW5kKCk7Ci0JCQlpZihyZW1vdmVDb21tYW5kIGluc3RhbmNlb2YgUmVtb3ZlQ29tbWFuZCl7Ci0JCQkJT2JqZWN0IG93bmVyID0gKChSZW1vdmVDb21tYW5kKXJlbW92ZUNvbW1hbmQpLmdldE93bmVyKCk7Ci0JCQkJaWYob3duZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KXsKLQkJCQkJQ29sbGVjdGlvbiBhbGxFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVsZXRlZEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJCQlhbGxFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJCQkJYWxsRWxlbWVudHMuYWRkQWxsKCgoQWN0aXZpdHkpZWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmKCFhbGxFbGVtZW50cy5pc0VtcHR5KCkpewotCQkJCQkJY21kLmFwcGVuZChuZXcgRGVsZXRlRGlhZ3JhbUNvbW1hbmQoYWxsRWxlbWVudHMsIFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudClvd25lcikpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZighY21kLmlzRW1wdHkoKSl7Ci0JCQlyZXR1cm4gY21kOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvY29tbWFuZHMvT3JpZW50YXRpb25Db21tYW5kLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9jb21tYW5kcy9PcmllbnRhdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRkMzRlMS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9jb21tYW5kcy9PcmllbnRhdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLmFjdGlvbnMuQWN0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIE9yaWVudGF0aW9uQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQgewotCi0JcHJpdmF0ZSBTdHJpbmcgb3JpZW50YXRpb247Ci0JcHJpdmF0ZSBFZGl0UGFydCBlZGl0UGFydDsKLQotCS8qKgotCSAqIEBwYXJhbSBkb21haW4KLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiBAcGFyYW0gYWZmZWN0ZWRGaWxlcwotCSAqLwotCXB1YmxpYyBPcmllbnRhdGlvbkNvbW1hbmQoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBTdHJpbmcgbGFiZWwsCi0JCQlFZGl0UGFydCBlZGl0UGFydCwgU3RyaW5nIG9yaWVudGF0aW9uKSB7Ci0JCQotCQlzdXBlcihkb21haW4sICJPcmllbnRhdGlvbiIsIGdldFdvcmtzcGFjZUZpbGVzKCgoVmlldyllZGl0UGFydC5nZXRNb2RlbCgpKS5lQ29udGFpbmVyKCkpKTsKLQkJdGhpcy5vcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uOwotCQl0aGlzLmVkaXRQYXJ0ID0gZWRpdFBhcnQ7Ci0KLQkJc2V0UmVzdWx0KENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KGVkaXRQYXJ0LmdldE1vZGVsKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiBAcGFyYW0gYWZmZWN0ZWRGaWxlcwotCSAqLwotCXB1YmxpYyBPcmllbnRhdGlvbkNvbW1hbmQoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBTdHJpbmcgbGFiZWwsCi0JCQlNYXAgb3B0aW9ucywgTGlzdCBhZmZlY3RlZEZpbGVzKSB7Ci0JCXN1cGVyKGRvbWFpbiwgbGFiZWwsIG9wdGlvbnMsIGFmZmVjdGVkRmlsZXMpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQjZG9FeGVjdXRlV2l0aFJlc3VsdChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlpZihvcmllbnRhdGlvbiA9PSBBY3Rpb25JZHMuQUNUSU9OX1ZfT1JJRU5UQVRJT04pewotCQkJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCllZGl0UGFydDsKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBwYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJaWYgKGJvdW5kcyAhPSBudWxsKSB7Ci0JCQkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSgoVmlldylwYXJ0LmdldE1vZGVsKCksTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCksIG5ldyBJbnRlZ2VyKGJvdW5kcy5oZWlnaHQpKTsKLQkJCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKChWaWV3KXBhcnQuZ2V0TW9kZWwoKSxOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCksIG5ldyBJbnRlZ2VyKGJvdW5kcy53aWR0aCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdCgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlpZihlZGl0UGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpIAotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvZmlndXJlcy9EZWNpc2lvbk5vZGVGaWd1cmUuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2ZpZ3VyZXMvRGVjaXNpb25Ob2RlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZWUxMzguLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvZmlndXJlcy9EZWNpc2lvbk5vZGVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5maWd1cmVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5JUG9seWdvbkFuY2hvcmFibGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQWRvcHRlZCBmcm9tIEdNRidzIEdlb1NoYXBlcwotICovCi1wdWJsaWMgY2xhc3MgRGVjaXNpb25Ob2RlRmlndXJlIGV4dGVuZHMgRGVmYXVsdFNpemVOb2RlRmlndXJlIGltcGxlbWVudHMKLQkJSVBvbHlnb25BbmNob3JhYmxlRmlndXJlIHsKLQotCXByaXZhdGUgaW50IHNwYWNpbmc7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBjcmVhdGUgYSBkZWNpc2lvbiBmaWd1cmUKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGVjaXNpb25Ob2RlRmlndXJlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHNwYWNpbmcpIHsKLQkJc3VwZXIod2lkdGgsIGhlaWdodCk7Ci0JCXRoaXMuc3BhY2luZyA9IHNwYWNpbmc7Ci0JCWNyZWF0ZUZpZ3VyZSh3aWR0aCwgaGVpZ2h0KTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGRlZlNpemUKLQkgKi8KLQlwdWJsaWMgRGVjaXNpb25Ob2RlRmlndXJlKERpbWVuc2lvbiBkZWZTaXplKSB7Ci0JCXN1cGVyKGRlZlNpemUpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICovCi0JcHVibGljIERlY2lzaW9uTm9kZUZpZ3VyZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJc3VwZXIod2lkdGgsIGhlaWdodCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLklQb2x5Z29uQW5jaG9yYWJsZUZpZ3VyZSNnZXRQb2x5Z29uUG9pbnRzKCkKLQkgKi8KLQlwdWJsaWMgUG9pbnRMaXN0IGdldFBvbHlnb25Qb2ludHMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGdldFBvaW50cygpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBnKSB7Ci0JCVBvaW50TGlzdCBwb2ludHMgPSBnZXRQb2ludExpc3QoZ2V0Qm91bmRzKCkuZ2V0Q29weSgpKTsKLQkJZy5maWxsUG9seWdvbihwb2ludHMpOwotCQlnLmRyYXdQb2x5Z29uKHBvaW50cyk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgc2hhcGVzIHBvbHlnb24gcG9pbnRzLgotCSAqIFRoaXMgaXMgY3VycmVudGx5IGJhc2VkIG9uIHRoZSBzaGFwZXMgYm91bmRpbmcgYm94LgotCSAqIAotCSAqIEBwYXJhbSByZWN0IHRoZSByZWN0YW5nbGUgdGhhdCB0aGUgc2hhcGUgd2lsbCBmaXQgaW4KLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnRMaXN0IGdldFBvaW50TGlzdChSZWN0YW5nbGUgcmVjdCkgewotCQlQb2ludExpc3QgcG9pbnRzID0gbmV3IFBvaW50TGlzdCgpOwotCQkKLQkJaW50IGhhbGZYID0gcmVjdC54ICsgKHJlY3Qud2lkdGggLyAyKTsKLQkJaW50IGhhbGZZID0gcmVjdC55ICsgKHJlY3QuaGVpZ2h0IC8gMik7Ci0JCQotCQlQb2ludCBwMSA9IG5ldyBQb2ludCggaGFsZlgsIHJlY3QueSApOwotCQlQb2ludCBwMiA9IG5ldyBQb2ludCggcmVjdC54ICsgcmVjdC53aWR0aCAtIDEsIGhhbGZZICk7Ci0JCVBvaW50IHAzID0gbmV3IFBvaW50KCBoYWxmWCwgcmVjdC55ICsgcmVjdC5oZWlnaHQgLSAxICk7Ci0JCVBvaW50IHA0ID0gbmV3IFBvaW50KCByZWN0LngsIGhhbGZZICk7Ci0JCQotCQlwb2ludHMuYWRkUG9pbnQoIHAxICk7Ci0JCXBvaW50cy5hZGRQb2ludCggcDIgKTsKLQkJcG9pbnRzLmFkZFBvaW50KCBwMyApOwotCQlwb2ludHMuYWRkUG9pbnQoIHA0ICk7Ci0JCXBvaW50cy5hZGRQb2ludCggcDEgKTsJCi0JCQotCQlyZXR1cm4gcG9pbnRzOwotCX0KLQkKLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJcmV0dXJuIChJRmlndXJlKSBnZXRDaGlsZHJlbigpLmdldCgwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlRmlndXJlKGludCB3aWR0aCwgaW50IGhlaWdodCl7Ci0JCXNldE9wYXF1ZSh0cnVlKTsKLQkJc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsYXlvdXQoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJCQlSZWN0YW5nbGUgciA9IGZpZ3VyZS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJTGlzdCBjaGlsZHJlbiA9IGZpZ3VyZS5nZXRDaGlsZHJlbigpOwotCQkJCUlGaWd1cmUgY2hpbGQ7Ci0JCQkJRGltZW5zaW9uIGQ7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJCQljaGlsZCA9IChJRmlndXJlKWNoaWxkcmVuLmdldChpKTsKLQkJCQkJZCA9IGNoaWxkLmdldFByZWZlcnJlZFNpemUoci53aWR0aCwgci5oZWlnaHQpOwotCQkJCQlkLndpZHRoID0gTWF0aC5taW4oZC53aWR0aCwgci53aWR0aCk7Ci0JCQkJCWQuaGVpZ2h0ID0gTWF0aC5taW4oZC5oZWlnaHQsIHIuaGVpZ2h0KTsKLQkJCQkJUmVjdGFuZ2xlIGNoaWxkUmVjdCA9IG5ldyBSZWN0YW5nbGUoCi0JCQkJCQlyLnggKyAoci53aWR0aCAtIGQud2lkdGgpLzIsCi0JCQkJCQlyLnkgKyAoci5oZWlnaHQgLSBkLmhlaWdodCkvMiwKLQkJCQkJCWQud2lkdGgsCi0JCQkJCQlkLmhlaWdodCk7Ci0JCQkJCWNoaWxkLnNldEJvdW5kcyhjaGlsZFJlY3QpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlJRmlndXJlIGYgPSBuZXcgRmlndXJlKCk7Ci0JCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCWxheW91dC5zZXRTcGFjaW5nKHNwYWNpbmcpOwotCQlmLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJYWRkKGYpOwotCX0KLQkKLQlwdWJsaWMgUG9pbnRMaXN0IGdldFBvaW50cygpewotCQlyZXR1cm4gZ2V0UG9pbnRMaXN0KGdldEJvdW5kcygpLmdldENvcHkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvZmlndXJlcy9FbmROb2RlRmlndXJlLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9maWd1cmVzL0VuZE5vZGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2YjY3MS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9maWd1cmVzL0VuZE5vZGVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkVsbGlwc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVuZE5vZGVGaWd1cmUgZXh0ZW5kcyBFbGxpcHNlIHsKLQotCS8qKgotCSAqIEZpbGxzIHRoZSBlbGxpcHNlLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlI2ZpbGxTaGFwZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbFNoYXBlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCVJlY3RhbmdsZSByID0gZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQlyLnNocmluayhyLndpZHRoIC8gOCwgci5oZWlnaHQgLyA4KTsKLQkJZ3JhcGhpY3MuZmlsbE92YWwocik7Ci0JfQotCi0JLyoqCi0JICogT3V0bGluZXMgdGhlIGVsbGlwc2UuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGUjb3V0bGluZVNoYXBlKG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvdXRsaW5lU2hhcGUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJc3VwZXIub3V0bGluZVNoYXBlKGdyYXBoaWNzKTsKLQotCQlSZWN0YW5nbGUgciA9IFJlY3RhbmdsZS5TSU5HTEVUT047Ci0JCXIuc2V0Qm91bmRzKGdldEJvdW5kcygpKTsKLQkJci5zaHJpbmsoZ2V0Qm91bmRzKCkud2lkdGggLyA4LCBnZXRCb3VuZHMoKS5oZWlnaHQgLyA4KTsKLQkJci53aWR0aC0tOwotCQlyLmhlaWdodC0tOwotCQlyLnNocmluaygobGluZVdpZHRoIC0gMSkgLyAyLCAobGluZVdpZHRoIC0gMSkgLyAyKTsKLQkJZ3JhcGhpY3MuZHJhd092YWwocik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9maWd1cmVzL0ZvcmtOb2RlRmlndXJlLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9maWd1cmVzL0ZvcmtOb2RlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ODMxMDEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvZmlndXJlcy9Gb3JrTm9kZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLm1hcG1vZGUuTWFwTW9kZVV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRm9ya05vZGVGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCQotCXB1YmxpYyB2b2lkIHNldFNpemUoaW50IHcsIGludCBoKSB7Ci0JCXN1cGVyLnNldFNpemUoTWFwTW9kZVV0aWwuZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCAKLQkJCQlNYXBNb2RlVXRpbC5nZXRNYXBNb2RlKCkuRFB0b0xQKDgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9maWd1cmVzL1JlbGF0aXZlWFlBbmNob3IuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2ZpZ3VyZXMvUmVsYXRpdmVYWUFuY2hvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTc0MTU4Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL2ZpZ3VyZXMvUmVsYXRpdmVYWUFuY2hvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIFByb3ZpZGVzIHJlbGF0aXZlIGFuY2hvciBmb3IgYSBmaWd1cmUncyBsb2NhdGlvbi4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWxhdGl2ZVhZQW5jaG9yIGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yIHsKLQotCXByaXZhdGUgUG9pbnQgcmVsYXRpdmVMb2NhdGlvbjsKLQotCXB1YmxpYyBSZWxhdGl2ZVhZQW5jaG9yKElGaWd1cmUgZmlndXJlLCBQb2ludCBsb2NhdGlvbiwgYm9vbGVhbiBpc1JlbGF0aXZlKSB7Ci0JCXN1cGVyKGZpZ3VyZSk7Ci0JCXJlbGF0aXZlTG9jYXRpb24gPSBsb2NhdGlvbi5nZXRDb3B5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkFuY2hvciNnZXRMb2NhdGlvbihQb2ludCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oUG9pbnQgcmVmZXJlbmNlKSB7Ci0JCVBvaW50IHAgPSByZWxhdGl2ZUxvY2F0aW9uLmdldENvcHkoKTsKLQkJUmVjdGFuZ2xlIHIgPSBnZXRPd25lcigpLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJcC5wZXJmb3JtVHJhbnNsYXRlKHIueCwgci55KTsKLQkJZ2V0T3duZXIoKS50cmFuc2xhdGVUb0Fic29sdXRlKHApOwotCQlyZXR1cm4gcDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdENvbm5lY3Rpb25BbmNob3IjZ2V0UmVmZXJlbmNlUG9pbnQoKQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRSZWZlcmVuY2VQb2ludCgpIHsKLQkJcmV0dXJuIGdldExvY2F0aW9uKG51bGwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcGFydHMvQWN0aXZpdHlOb2RlRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BhcnRzL0FjdGl2aXR5Tm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0M2EzNDEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcGFydHMvQWN0aXZpdHlOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucG9saWNpZXMuQWN0aXZpdHlOb2RlUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlOb2RlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmlldwotCSAqLwotCXB1YmxpYyBBY3Rpdml0eU5vZGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0I2NyZWF0ZU5vZGVGaWd1cmUoKQotCSAqLwotCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEVkaXRQb2xpY3kgZ2V0UHJpbWFyeURyYWdFZGl0UG9saWN5KCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5Tm9kZVJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wYXJ0cy9EaWFncmFtRmlsZUVkaXRvcklucHV0LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wYXJ0cy9EaWFncmFtRmlsZUVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMzM3NTAuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcGFydHMvRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhdGhFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dEZhY3Rvcnk7Ci0KLS8qKgotICogQWRhcHRlciBmb3IgbWFraW5nIGEgZmlsZSByZXNvdXJjZSBhIHN1aXRhYmxlIGlucHV0IGZvciBhbiBlZGl0b3IuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1GaWxlRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJRmlsZUVkaXRvcklucHV0LCBJUGF0aEVkaXRvcklucHV0LAotICAgICAgICBJUGVyc2lzdGFibGVFbGVtZW50IAotICAgICAgICB7Ci0JcHJpdmF0ZSBEaWFncmFtRWRpdG9ySW5wdXQgZGlhZ3JhbUVkaXRvcklucHV0OwotICAgIHByaXZhdGUgSUZpbGUgZmlsZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gZWRpdG9yIGlucHV0IGJhc2VkIG9mIHRoZSBnaXZlbiBmaWxlIHJlc291cmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgcmVzb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dChJRmlsZSBmaWxlLCBEaWFncmFtRWRpdG9ySW5wdXQgZGlhZ3JhbUVkaXRvcklucHV0KSB7Ci0gICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgICAgICB0aGlzLmRpYWdyYW1FZGl0b3JJbnB1dCA9IGRpYWdyYW1FZGl0b3JJbnB1dDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIE9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gZmlsZS5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gT2JqZWN0LgotICAgICAqCi0gICAgICogVGhlIDxjb2RlPkRpYWdyYW1GaWxlRWRpdG9ySW5wdXQ8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+T2JqZWN0PC9jb2RlPgotICAgICAqIG1ldGhvZCBiYXNlcyB0aGUgZXF1YWxpdHkgb2YgdHdvIDxjb2RlPkRpYWdyYW1GaWxlRWRpdG9ySW5wdXQ8L2NvZGU+IG9iamVjdHMgb24gdGhlCi0gICAgICogZXF1YWxpdHkgb2YgdGhlaXIgdW5kZXJseWluZyA8Y29kZT5JRmlsZTwvY29kZT4gcmVzb3VyY2VzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICh0aGlzID09IG9iaikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotICAgICAgICBJRmlsZUVkaXRvcklucHV0IG90aGVyID0gKElGaWxlRWRpdG9ySW5wdXQpIG9iajsKLSAgICAgICAgcmV0dXJuIGZpbGUuZXF1YWxzKG90aGVyLmdldEZpbGUoKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRWRpdG9ySW5wdXQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotICAgICAgICByZXR1cm4gZmlsZS5leGlzdHMoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElBZGFwdGFibGUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLSAgICAgICAgaWYgKGFkYXB0ZXIgPT0gSUZpbGUuY2xhc3MpIHsKLQkJCXJldHVybiBmaWxlOwotCQl9Ci0gICAgICAgIHJldHVybiBmaWxlLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUGVyc2lzdGFibGVFbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUlkKCkgewotICAgICAgICByZXR1cm4gRmlsZUVkaXRvcklucHV0RmFjdG9yeS5nZXRGYWN0b3J5SWQoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFncmFtRmlsZUVkaXRvcklucHV0LgotICAgICAqLwotICAgIHB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotICAgICAgICByZXR1cm4gZmlsZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElFZGl0b3JJbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLSAgICAgICAgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gSURFLmdldENvbnRlbnRUeXBlKGZpbGUpOwotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRFZGl0b3JSZWdpc3RyeSgpCi0gICAgICAgICAgICAgICAgLmdldEltYWdlRGVzY3JpcHRvcihmaWxlLmdldE5hbWUoKSwgY29udGVudFR5cGUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUVkaXRvcklucHV0LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGUuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUVkaXRvcklucHV0LgotICAgICAqLwotICAgIHB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElTdG9yYWdlRWRpdG9ySW5wdXQuCi0gICAgICovCi0gICAgcHVibGljIElTdG9yYWdlIGdldFN0b3JhZ2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBmaWxlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUVkaXRvcklucHV0LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQZXJzaXN0YWJsZUVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVBhdGhFZGl0b3JJbnB1dAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKiBAaXNzdWUgY29uc2lkZXIgdXNpbmcgYW4gaW50ZXJuYWwgYWRhcHRlciBmb3IgSVBhdGhFZGl0b3JJbnB1dCByYXRoZXIgdGhhbiBhZGRpbmcgdGhpcyBhcyBBUEkKLSAgICAgKi8KLSAgICBwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGUuZ2V0TG9jYXRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIigiICsgZ2V0RmlsZSgpLmdldEZ1bGxQYXRoKCkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLQotCXB1YmxpYyBEaWFncmFtRWRpdG9ySW5wdXQgZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkgewotCQlyZXR1cm4gZGlhZ3JhbUVkaXRvcklucHV0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpYWdyYW1FZGl0b3JJbnB1dChEaWFncmFtRWRpdG9ySW5wdXQgZGlhZ3JhbUVkaXRvcklucHV0KSB7Ci0JCXRoaXMuZGlhZ3JhbUVkaXRvcklucHV0ID0gZGlhZ3JhbUVkaXRvcklucHV0OwotCX0KLQkKLX0KLQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcGFydHMvRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dEZhY3RvcnkuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BhcnRzL0RpYWdyYW1GaWxlRWRpdG9ySW5wdXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMTVhMmMuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcGFydHMvRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFbGVtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBzYXZpbmcgYW5kIHJlc3RvcmluZyBhIHtAbGluayBEaWFncmFtRmlsZUVkaXRvcklucHV0fS4gCi0gKiBUaGUgc3RvcmVkIHJlcHJlc2VudGF0aW9uIG9mIGEge0BsaW5rIERpYWdyYW1GaWxlRWRpdG9ySW5wdXR9IHJlbWVtYmVycwotICogdGhlIGZ1bGwgcGF0aCBvZiB0aGUgZmlsZSBhbmQge0BsaW5rIENhcGFiaWxpdHlQYXR0ZXJufSBvciB7QGxpbmsgQWN0aXZpdHl9J3MKLSAqIEdVSUQuVGhlIHdvcmtiZW5jaCB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFzIHJlcXVpcmVkLgotICogSXQgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IHRoZSBjbGllbnQuCi0gKiA8L3A+Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1GaWxlRWRpdG9ySW5wdXRGYWN0b3J5IGltcGxlbWVudHMgSUVsZW1lbnRGYWN0b3J5IHsKLQotCQotCSAvKioKLSAgICAgKiBGYWN0b3J5IGlkLiBUaGUgd29ya2JlbmNoIHBsdWctaW4gcmVnaXN0ZXJzIGEgZmFjdG9yeSBieSB0aGlzIG5hbWUKLSAgICAgKiB3aXRoIHRoZSAib3JnLmVjbGlwc2UudWkuZWxlbWVudEZhY3RvcmllcyIgZXh0ZW5zaW9uIHBvaW50LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9GQUNUT1JZID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBhcnRzLkRpYWdyYW1GaWxlRWRpdG9ySW5wdXRGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGFnIGZvciB0aGUgSUZpbGUuZnVsbFBhdGggb2YgdGhlIGZpbGUgcmVzb3VyY2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QQVRIID0gInBhdGgiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLyoqCi0gICAgICogVGFnIGZvciB1bWEgR1VJRAotICAgICAqIAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfR1VJRCA9ICJndWlkIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBEaWFncmFtRmlsZUVkaXRvcklucHV0RmFjdG9yeSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVsZW1lbnRGYWN0b3J5I2NyZWF0ZUVsZW1lbnQob3JnLmVjbGlwc2UudWkuSU1lbWVudG8pCi0JICovCi0JcHVibGljIElBZGFwdGFibGUgY3JlYXRlRWxlbWVudChJTWVtZW50byBtZW1lbnRvKSB7Ci0JCQotCQkgIFN0cmluZyBmaWxlTmFtZSA9IG1lbWVudG8uZ2V0U3RyaW5nKFRBR19QQVRIKTsKLQkgICAgICAgIGlmIChmaWxlTmFtZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JICAgICAgICBTdHJpbmcgZ3VpZCA9IG1lbWVudG8uZ2V0U3RyaW5nKFRBR19HVUlEKTsKLQkgICAgICAgIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gbnVsbDsKLQkgICAgICAgIE1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkgICAgICAgIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JICAgICAgICAJc3VwcHJlc3Npb24gPSBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbigob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSgoQWN0aXZpdHkpZWxlbWVudCkuZUNvbnRhaW5lcigpKTsKLQkgICAgICAgIH0KLQkgICAgICAgIERpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0KAotCQkJCQllbGVtZW50LCBzdXBwcmVzc2lvbik7Ci0KLQkgICAgICAgIC8vIEdldCBhIGhhbmRsZSB0byB0aGUgSUZpbGUuLi53aGljaCBjYW4gYmUgYSBoYW5kbGUKLQkgICAgICAgIC8vIHRvIGEgcmVzb3VyY2UgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB3b3Jrc3BhY2UKLQkgICAgICAgIElGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoCi0JICAgICAgICAgICAgICAgIG5ldyBQYXRoKGZpbGVOYW1lKSk7Ci0JICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBEaWFncmFtRmlsZUVkaXRvcklucHV0KGZpbGUsaW5wdXQgKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JfQotCQotCS8qKgotICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnQgZmFjdG9yeSBpZCBmb3IgdGhpcyBjbGFzcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGZhY3RvcnkgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGYWN0b3J5SWQoKSB7Ci0gICAgICAgIHJldHVybiBJRF9GQUNUT1JZOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhdmVzIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gZmlsZSBlZGl0b3IgaW5wdXQgaW50byB0aGUgZ2l2ZW4gbWVtZW50by4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZW1lbnRvIHRoZSBzdG9yYWdlIGFyZWEgZm9yIGVsZW1lbnQgc3RhdGUKLSAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIGZpbGUgZWRpdG9yIGlucHV0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvLCBEaWFncmFtRmlsZUVkaXRvcklucHV0IGlucHV0KSB7Ci0gICAgICAgIElGaWxlIGZpbGUgPSBpbnB1dC5nZXRGaWxlKCk7Ci0gICAgICAgIG1lbWVudG8ucHV0U3RyaW5nKFRBR19QQVRILCBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIG1lbWVudG8ucHV0U3RyaW5nKFRBR19HVUlELCBpbnB1dC5nZXREaWFncmFtRWRpdG9ySW5wdXQoKS5nZXRNZXRob2RFbGVtZW50KCkuZ2V0R3VpZCgpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BhcnRzL0RpYWdyYW1IZWxwZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BhcnRzL0RpYWdyYW1IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQxMTBmYi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wYXJ0cy9EaWFncmFtSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLmltcGwuSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5BY3Rpdml0eURpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wZXJzaXN0ZW5jZS5EaWFncmFtRmlsZUNyZWF0b3JFeDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wZXJzaXN0ZW5jZS5EaWFncmFtUGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBlcnNpc3RlbmNlLkRpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBlcnNpc3RlbmNlLklEaWFncmFtU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuSURpYWdyYW1Xb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLQotLyoqCi0gKiBEaWFncm0gaGVscGVyIGNsYXNzIChyZXBsYWNpbmcgdGhlIERpYWdyYW1FZGl0b3JVdGlsKS4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERpYWdyYW1IZWxwZXIgewotCi0JLyoqCi0JICogVG8gb3BlbiBhIGRpYWdyYW0gYW5kIGNyZWF0ZSBhIGZpbGUuCi0JICogQHdyaXR0ZW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkRpYWdyYW1FZGl0b3IoSVdvcmtiZW5jaFBhZ2UgcGFnZSwgSUVkaXRvcklucHV0IGlucHV0LCBTdHJpbmcgZGlhZ3JhbUtpbmQpewotCQkKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCi0JCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IChNZXRob2RFbGVtZW50KSgoRGlhZ3JhbUVkaXRvcklucHV0KWlucHV0KS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IElEaWFncmFtU2VydmljZS5lSW5zdGFuY2UuZ2V0RGlhZ3JhbSgoQWN0aXZpdHkpbWV0aG9kRWxlbWVudCwgZGlhZ3JhbUtpbmQsIGZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJSUZpbGUgZGlhZ3JhbUZpbGUgPSBEaWFncmFtUGVyc2lzdGVyLmdldEZpbGUoaW5wdXQpIDsKLQkJaWYoZGlhZ3JhbUZpbGUgPT0gbnVsbCl7Ci0JCQlkaWFncmFtRmlsZSA9IERpYWdyYW1QZXJzaXN0ZXIuY3JlYXRlTmV3RGlhZ3JhbUZpbGUoRGlhZ3JhbUZpbGVDcmVhdG9yRXguZ2V0SW5zdGFuY2UoKSwgCi0JCQkJCWlucHV0LCBwYWdlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIAotCQkJCQltb25pdG9yKTsKLQkJfQotCQlpZihkaWFncmFtID09IG51bGwpewotCQkJZGlhZ3JhbSA9IElEaWFncmFtU2VydmljZS5lSW5zdGFuY2UuY3JlYXRlRGlhZ3JhbSgoQWN0aXZpdHkpbWV0aG9kRWxlbWVudCwgZGlhZ3JhbUtpbmQsIGZhbHNlKTsKLQkJCS8vVE9ETzogcmVtb3ZlIHRoaXMgc2F2ZSBvcHRpb24KLQkJCXRyeXsKLQkJCQlEaWFncmFtUGVyc2lzdGVyLnNhdmVEaWFncmFtKElEaWFncmFtU2VydmljZS5lSW5zdGFuY2UuY3JlYXRlRWRpdGluZ0RvbWFpbigpLCAKLQkJCQkJZGlhZ3JhbUZpbGUsIGRpYWdyYW0sIGZhbHNlKTsKLQkJCX1jYXRjaChFeGNlcHRpb24gZSl7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQkKLQkJCi0JCURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSBkaWFncmFtRmlsZUVkaXRvcklucHV0ID0gbmV3IERpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSgKLQkJCQlkaWFncmFtRmlsZSwgKERpYWdyYW1FZGl0b3JJbnB1dClpbnB1dCwgbnVsbCk7Ci0JCQotCQlpZiAoZGlhZ3JhbUZpbGUgIT0gbnVsbCkgewotCQkJRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0ID0gb3BlbkVkaXRvcihkaWFncmFtRmlsZUVkaXRvcklucHV0LCBwYWdlLCBtb25pdG9yLCB0cnVlLCB0cnVlKTsKLQkJCWluaXRpYWxpemUoKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCksIGRpYWdyYW1GaWxlRWRpdG9ySW5wdXQpOwotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEaWFncmFtRWRpdFBhcnQgb3BlbkVkaXRvcihJRmlsZUVkaXRvcklucHV0IGlucHV0LAotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSxJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwgYm9vbGVhbiBhY3RpdmF0ZSwgCi0JCQlib29sZWFuIGRldGVybWluZUNvbnRlbnRUeXBlKXsKLQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvL0lXb3JrYmVuY2hQYWdlIHBhZ2UgPSBkV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCUlFZGl0b3JQYXJ0IHBhcmVudCA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJIC8vc2FuaXR5IGNoZWNrcwotCQkgICAgICAgIGlmIChwYWdlID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJCX0KLQotCQkgICAgICAgIC8vIG9wZW4gdGhlIGVkaXRvciBvbiB0aGUgZmlsZQotCQkgICAgICAgIElFZGl0b3JEZXNjcmlwdG9yIGVkaXRvckRlc2MgPSBJREUuZ2V0RWRpdG9yRGVzY3JpcHRvcihpbnB1dC5nZXRGaWxlKCksIGRldGVybWluZUNvbnRlbnRUeXBlKTsKLQkJICAgICAgICBlZGl0b3JQYXJ0ID0gIHBhZ2Uub3BlbkVkaXRvcihpbnB1dCwgZWRpdG9yRGVzYy5nZXRJZCgpLAotCQkgICAgICAgICAgICAgICAgYWN0aXZhdGUpOwotCQkJCWlmKGVkaXRvclBhcnQgIT0gbnVsbCAmJiBwYXJlbnQgIT0gbnVsbCl7Ci0JCQkJCS8vIHNldCB0aGUgcGFyZW50LgotCQkJCX0KLQkJCX0KLQkJCWlucHV0LmdldEZpbGUoKS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG51bGwpOwotCQkJcmV0dXJuICgoSURpYWdyYW1Xb3JrYmVuY2hQYXJ0KSBlZGl0b3JQYXJ0KS5nZXREaWFncmFtRWRpdFBhcnQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aXZpdHlEaWFncmFtS2luZCgpewotCQlyZXR1cm4gRGlhZ3JhbVNlcnZpY2UuQURfa2luZDsKLQl9Ci0JLyoqCi0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIGRpYWdyYW1GaWxlRWRpdG9ySW5wdXQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoRGlhZ3JhbSBtb2RlbCwgRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5IGRpYWdyYW1GaWxlRWRpdG9ySW5wdXQpIHsKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IGRpYWdyYW1GaWxlRWRpdG9ySW5wdXQuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuZ2V0V3JhcHBlcigpOwotCQlBY3Rpdml0eURpYWdyYW1BZGFwdGVyIGFkYXB0ZXIgPSB3cmFwcGVyICE9IG51bGwgPwotCQkJCW5ldyBBY3Rpdml0eURpYWdyYW1BZGFwdGVyKHdyYXBwZXIpIDogCi0JCQkJCW5ldyBBY3Rpdml0eURpYWdyYW1BZGFwdGVyKChBY3Rpdml0eSlkaWFncmFtRmlsZUVkaXRvcklucHV0LmdldERpYWdyYW1FZGl0b3JJbnB1dCgpLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCWFkYXB0ZXIuc2V0RWRpdGluZ0RvbWFpbigoSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbikgZGlhZ3JhbUZpbGVFZGl0b3JJbnB1dC5nZXRFZGl0aW5nRG9tYWluKCkpOwotCQlhZGFwdGVyLnNldFN1cHByZXNzaW9uKGRpYWdyYW1GaWxlRWRpdG9ySW5wdXQuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCW1vZGVsLmdldEVsZW1lbnQoKS5lQWRhcHRlcnMoKS5hZGQoYWRhcHRlcik7Ci0JCWFkYXB0ZXIucG9wdWxhdGVEaWFncmFtKCk7Ci0JfQotCQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbW1hbmQgZ2V0Q29tbWFuZFdyYXBwZXIoSUNvbW1hbmQgY21kKSB7Ci0JCXJldHVybiBuZXcgSUNvbW1hbmRQcm94eShjbWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BhcnRzL0RpYW1vbmROb2RlRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BhcnRzL0RpYW1vbmROb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ5MWU4Yi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wYXJ0cy9EaWFtb25kTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLmZpZ3VyZXMuRGVjaXNpb25Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLmZpZ3VyZXMuUmVsYXRpdmVYWUFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQ29ubmVjdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVDb25uZWN0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuTG9jYXRpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFtb25kTm9kZUVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQHBhcmFtIHZpZXcKLQkgKi8KLQlwdWJsaWMgRGlhbW9uZE5vZGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0I2NyZWF0ZU5vZGVGaWd1cmUoKQotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUVkaXRQYXJ0I2dldFNvdXJjZUNvbm5lY3Rpb25BbmNob3Iob3JnLmVjbGlwc2UuZ2VmLkNvbm5lY3Rpb25FZGl0UGFydCkKLQkgKiBAY3VzdG9tCi0JICovCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcigKLQkJCUNvbm5lY3Rpb25FZGl0UGFydCBjb25uZWN0aW9uKSB7Ci0JCWJvb2xlYW4gaXNSZWxhdGl2ZSA9IGZhbHNlOwotCQlQb2ludCBzb3VyY2VFbmRQb2ludDsKLQkJaWYgKHJlY2VudFNvdXJjZUVuZFBvaW50ID09IG51bGwpIHsKLQkJCS8vIGdldCBzb3VyY2UgZW5kIHBvaW50IGZyb20gdGhlIG1vZGVsCi0JCQlMaW5rIGxpbmsgPSAoTGluaykgY29ubmVjdGlvbi5nZXRNb2RlbCgpOwotCQkJc291cmNlRW5kUG9pbnQgPSBsaW5rLmdldFNvdXJjZUVuZFBvaW50KCk7Ci0JCQlpc1JlbGF0aXZlID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXNvdXJjZUVuZFBvaW50ID0gcmVjZW50U291cmNlRW5kUG9pbnQ7Ci0JCX0KLQkJaWYgKHNvdXJjZUVuZFBvaW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgUmVsYXRpdmVYWUFuY2hvcihnZXRGaWd1cmUoKSwgc291cmNlRW5kUG9pbnQsIGlzUmVsYXRpdmUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKGNvbm5lY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlRWRpdFBhcnQjZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdCkKLQkgKiBAY3VzdG9tCi0JICovCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJUG9pbnQgcCA9IG51bGw7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHsKLQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcSA9IChDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCkgcmVxdWVzdDsKLQkJCXAgPSByZXEuZ2V0TG9jYXRpb24oKTsKLQkJfSBlbHNlIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgTG9jYXRpb25SZXF1ZXN0KSB7Ci0JCQlwID0gKChMb2NhdGlvblJlcXVlc3QpIHJlcXVlc3QpLmdldExvY2F0aW9uKCk7Ci0JCX0KLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJcmVjZW50U291cmNlRW5kUG9pbnQgPSBnZXRMb2NhdGlvbihwKTsKLQkJCXJldHVybiBuZXcgUmVsYXRpdmVYWUFuY2hvcihnZXRGaWd1cmUoKSwgcmVjZW50U291cmNlRW5kUG9pbnQsIHRydWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKHJlcXVlc3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlRWRpdFBhcnQjZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcihvcmcuZWNsaXBzZS5nZWYuQ29ubmVjdGlvbkVkaXRQYXJ0KQotCSAqIEBjdXN0b20KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKAotCQkJQ29ubmVjdGlvbkVkaXRQYXJ0IGNvbm5lY3Rpb24pIHsKLQkJYm9vbGVhbiBpc1JlbGF0aXZlID0gZmFsc2U7Ci0JCVBvaW50IHRhcmdldEVuZFBvaW50OwotCQlpZiAocmVjZW50VGFyZ2V0RW5kUG9pbnQgPT0gbnVsbCkgewotCQkJLy8gZ2V0IHRhcmdldCBlbmQgcG9pbnQgZnJvbSBtb2RlbAotCQkJTGluayBsaW5rID0gKExpbmspIGNvbm5lY3Rpb24uZ2V0TW9kZWwoKTsKLQkJCXRhcmdldEVuZFBvaW50ID0gbGluay5nZXRUYXJnZXRFbmRQb2ludCgpOwotCQkJaXNSZWxhdGl2ZSA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQl0YXJnZXRFbmRQb2ludCA9IHJlY2VudFRhcmdldEVuZFBvaW50OwotCQl9Ci0JCWlmICh0YXJnZXRFbmRQb2ludCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHRhcmdldEVuZFBvaW50LCBpc1JlbGF0aXZlKTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKGNvbm5lY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlRWRpdFBhcnQjZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcihvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdCkKLQkgKiBAY3VzdG9tCi0JICovCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcihSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJUG9pbnQgcCA9IG51bGw7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHsKLQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcSA9IChDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCkgcmVxdWVzdDsKLQkJCXAgPSByZXEuZ2V0TG9jYXRpb24oKTsKLQkJfSBlbHNlIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgTG9jYXRpb25SZXF1ZXN0KSB7Ci0JCQlwID0gKChMb2NhdGlvblJlcXVlc3QpIHJlcXVlc3QpLmdldExvY2F0aW9uKCk7Ci0JCX0KLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJcmVjZW50VGFyZ2V0RW5kUG9pbnQgPSBnZXRMb2NhdGlvbihwKTsKLQkJCXJldHVybiBuZXcgUmVsYXRpdmVYWUFuY2hvcihnZXRGaWd1cmUoKSwgcmVjZW50VGFyZ2V0RW5kUG9pbnQsIHRydWUpOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldFRhcmdldENvbm5lY3Rpb25BbmNob3IocmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkNvbm5lY3Rpb25BbmNob3JMb2NhdG9yI2dldExvY2F0aW9uKFBvaW50KQotCSAqIEBjdXN0b20KLQkgKiAKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oUG9pbnQgcmVmZXJlbmNlKSB7Ci0JCURlY2lzaW9uTm9kZUZpZ3VyZSBmID0gKChEZWNpc2lvbk5vZGVGaWd1cmUpIGdldEZpZ3VyZSgpKTsKLQotCQkvLyB0cmFuc2xhdGUgcG9pbnRzIHRvIGFic29sdXRlCi0JCVBvaW50W10gcG9pbnRzID0gbmV3IFBvaW50W2YuZ2V0UG9pbnRzKCkuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IGYuZ2V0UG9pbnRzKCkuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCVBvaW50IHAgPSBmLmdldFBvaW50cygpLmdldFBvaW50KGkpOwotCQkJZi50cmFuc2xhdGVUb0Fic29sdXRlKHApOwotCQkJcG9pbnRzW2ldID0gcDsKLQkJfQotCi0JCVBvaW50IHAgPSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS51dGlsLkFuY2hvclV0aWwuZ2V0Q2xvc2VzdFBvaW50KHBvaW50cywgcmVmZXJlbmNlKTsKLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJUmVjdGFuZ2xlIHIgPSBmLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJCWYudHJhbnNsYXRlVG9BYnNvbHV0ZShyKTsKLQkJCXAucGVyZm9ybVRyYW5zbGF0ZSgtci54LCAtci55KTsKLQkJfQotCQlyZXR1cm4gcDsKLQl9Ci0JCi0JLyoKLQkgKiBAY3VzdG9tCi0JICovCi0JcHJpdmF0ZSBQb2ludCByZWNlbnRTb3VyY2VFbmRQb2ludDsKLQotCS8qCi0JICogQGN1c3RvbQotCSAqLwotCXByaXZhdGUgUG9pbnQgcmVjZW50VGFyZ2V0RW5kUG9pbnQ7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BlcnNpc3RlbmNlL0RpYWdyYW1GaWxlQ3JlYXRvckV4LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wZXJzaXN0ZW5jZS9EaWFncmFtRmlsZUNyZWF0b3JFeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDFkMTlmLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BlcnNpc3RlbmNlL0RpYWdyYW1GaWxlQ3JlYXRvckV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci51dGlsLkRpYWdyYW1GaWxlQ3JlYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1GaWxlQ3JlYXRvckV4IGV4dGVuZHMgRGlhZ3JhbUZpbGVDcmVhdG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRfZGlhZ3JhbV9maWxlID0gImRpYWdyYW0iOyAKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBEaWFncmFtRmlsZUNyZWF0b3JFeCBJTlNUQU5DRSA9IG5ldyBEaWFncmFtRmlsZUNyZWF0b3JFeCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBEaWFncmFtRmlsZUNyZWF0b3JFeCBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKLQkJcmV0dXJuICIueG1pIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BlcnNpc3RlbmNlL0RpYWdyYW1QZXJzaXN0ZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BlcnNpc3RlbmNlL0RpYWdyYW1QZXJzaXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQwNzc3ZS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wZXJzaXN0ZW5jZS9EaWFncmFtUGVyc2lzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuT3BlcmF0aW9uSGlzdG9yeUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuRmVhdHVyZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuUGFja2FnZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uaW1wbC5JbnRlcm5hbFRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLkludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5FUEZEaWFncmFtUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLmNvbW1hbmRzLkNyZWF0ZURpYWdyYW1Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UudXRpbC5VbWFVbWxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5WaWV3U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IudXRpbC5EaWFncmFtRmlsZUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnJlc291cmNlcy5HTUZSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi51dGlsLk5vdGF0aW9uRXh0ZW5kZWRNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MRmFjdG9yeTsKLQotLyoqCi0gKiBSZS11c2VkIHtEaWFncmFtSU9VdGlsfSBjb2RlIGFuZCBtb2RpZnkgYWNjb3JkaW5nIGZvciBFUEYgYW5kIFVNTAotICogQnJpZGdlLiBQZXJzaXN0ZXIgaGVscHMgaW4gaGFuZGxpbmcgbXVsdGkgcmVzb3VyY2UgbWFuaXB1bGF0aW9uLiAKLSAqICAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMgotICovCi0KLXB1YmxpYyBjbGFzcyBEaWFncmFtUGVyc2lzdGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgVFhfT1BUSU9OUyA9IG5ldyBIYXNoTWFwKCk7CQotICAgIHN0YXRpYyB7Ci0gICAgICAgIFRYX09QVElPTlMucHV0KFRyYW5zYWN0aW9uLk9QVElPTl9OT19VTkRPLCBCb29sZWFuLlRSVUUpOwotICAgICAgICBUWF9PUFRJT05TLnB1dChUcmFuc2FjdGlvbi5PUFRJT05fTk9fTk9USUZJQ0FUSU9OUywgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgVFhfT1BUSU9OUy5wdXQoVHJhbnNhY3Rpb24uT1BUSU9OX05PX1RSSUdHRVJTLCBCb29sZWFuLlRSVUUpOwotICAgIH0KLQkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZS5GYWN0b3J5IHJlc291cmNlRmFjdG9yeSA9IG5ldyBHTUZSZXNvdXJjZUZhY3RvcnkoKTsKLSAgICAKLQkvLyBsb2NhbGl6ZWQgbGFiZWxzCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFVOQUJMRV9UT19MT0FEX0RJQUdSQU0gPSAiVW5hYmxlIHRvIGxvYWQgZGlhZ3JhbSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTk9fRElBR1JBTV9JTl9SRVNPVVJDRSA9ICJObyBkaWFncmFtIHJlc291cmNlIjsKLQotCXByaXZhdGUgc3RhdGljIGludGVyZmFjZSBJTG9hZGVyIHsKLQkJcHVibGljIFJlc291cmNlIGxvYWQoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBNYXAgbG9hZE9wdGlvbnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBGaWxlTG9hZGVyIGltcGxlbWVudHMgSUxvYWRlciB7Ci0JCXByaXZhdGUgSUZpbGUgZkZpbGU7Ci0JCXB1YmxpYyBGaWxlTG9hZGVyKElGaWxlIGZpbGUpIHsKLQkJCS8vYXNzZXJ0IGZpbGUgIT0gbnVsbDsKLQkJCWZGaWxlID0gZmlsZTsKLQkJfQotCQkKLQkJcHVibGljIFJlc291cmNlIGxvYWQoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBNYXAgbG9hZE9wdGlvbnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJCWZGaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbW9uaXRvcik7Ci0JCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZkZpbGUuZ2V0RnVsbFBhdGgoKQotICAgICAgICAgICAgICAgIC50b1N0cmluZygpLCB0cnVlKTsKLQkJCQotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBkb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZSh1cmksIGZhbHNlKTsKLQkJCQotCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCQlyZXNvdXJjZSA9IGRvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JCQl9Ci0JCQkKLQkJCWlmICghcmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCU1hcCBsb2FkaW5nT3B0aW9ucyA9IG5ldyBIYXNoTWFwKEdNRlJlc291cmNlRmFjdG9yeS5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKSk7Ci0JCQkJCi0gICAgICAgICAgICAgICAgLy8gcHJvcG9nYXRlIHBhc3NlZCBpbiBvcHRpb25zIHRvIHRoZSBkZWZhdWx0cwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBsb2FkT3B0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3Qga2V5ID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvYWRpbmdPcHRpb25zLnB1dChrZXksIGxvYWRPcHRpb25zLmdldChrZXkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAJcmVzb3VyY2UubG9hZChsb2FkaW5nT3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIAlyZXNvdXJjZS51bmxvYWQoKTsKLSAgICAgICAgICAgICAgICAJdGhyb3cgZTsKLSAgICAgICAgICAgICAgICB9Ci0JCQl9Ci0JCQkKLQkJCWxvZ1Jlc291cmNlRXJyb3JzQW5kV2FybmluZ3MocmVzb3VyY2UpOwotCQkJCQkJCi0JCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ1Jlc291cmNlRXJyb3JzQW5kV2FybmluZ3MoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0RXJyb3JzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZS5EaWFnbm9zdGljIGRpYWdub3N0aWMgPSAoUmVzb3VyY2UuRGlhZ25vc3RpYykgaXRlci5uZXh0KCk7Ci0JCQlMb2cuZXJyb3IoRVBGRGlhZ3JhbVBsdWdpbi5nZXREZWZhdWx0KCksIDEsIGRpYWdub3N0aWMuZ2V0TWVzc2FnZSgpKTsJCQkJCi0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRXYXJuaW5ncygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UuRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gKFJlc291cmNlLkRpYWdub3N0aWMpIGl0ZXIubmV4dCgpOwotCQkJTG9nLndhcm5pbmcoRVBGRGlhZ3JhbVBsdWdpbi5nZXREZWZhdWx0KCksIDcsIGRpYWdub3N0aWMuZ2V0TWVzc2FnZSgpKTsJCQkJCi0JCX0KLQl9Ci0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdG9yYWdlTG9hZGVyIGltcGxlbWVudHMgSUxvYWRlciB7Ci0JCXByaXZhdGUgSVN0b3JhZ2UgZlN0b3JhZ2U7Ci0JCXB1YmxpYyBTdG9yYWdlTG9hZGVyKElTdG9yYWdlIHN0b3JhZ2UpIHsKLQkJCS8vYXNzZXJ0IHN0b3JhZ2UgIT0gbnVsbDsKLQkJCWZTdG9yYWdlID0gc3RvcmFnZTsKLQkJfQotCQkKLQkJcHVibGljIFJlc291cmNlIGxvYWQoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwKLQkJCQlNYXAgbG9hZE9wdGlvbnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBTdHJpbmcgc3RvcmFnZU5hbWUgPSBmU3RvcmFnZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBVUkkgdXJpID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoc3RvcmFnZU5hbWUpOwotICAgICAgICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UodXJpLGZhbHNlKTsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuY3JlYXRlUmVzb3VyY2UodXJpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghcmVzb3VyY2UuaXNMb2FkZWQoKSkgewotICAgICAgICAgICAgICAgIHJlc291cmNlLmxvYWQoZlN0b3JhZ2UuZ2V0Q29udGVudHMoKSwgbG9hZE9wdGlvbnMpOwotICAgICAgICAgICAgfQotCQkJbG9nUmVzb3VyY2VFcnJvcnNBbmRXYXJuaW5ncyhyZXNvdXJjZSk7Ci0JCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCX0KLQl9Ci0JCi0Jc3RhdGljIHB1YmxpYyBEaWFncmFtIGxvYWQoZmluYWwgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBmaW5hbCBJRmlsZSBmaWxlLCBib29sZWFuIGJUcnlDb21wYXRpYmxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJRmlsZUxvYWRlciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlcihmaWxlKTsKLQkJcmV0dXJuIGxvYWQoZG9tYWluLCBsb2FkZXIsIGJUcnlDb21wYXRpYmxlLCBtb25pdG9yKTsKLQl9Ci0JCi0Jc3RhdGljIHB1YmxpYyBEaWFncmFtIGxvYWQoZmluYWwgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBmaW5hbCBJU3RvcmFnZSBzdG9yYWdlLCBib29sZWFuIGJUcnlDb21wYXRpYmxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQlJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUxvYWRlciBsb2FkZXIgPSBudWxsOwotCQlpZihzdG9yYWdlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCWxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKChJRmlsZSlzdG9yYWdlKTsKLQkJfSBlbHNlIHsKLQkJCWxvYWRlciA9IG5ldyBTdG9yYWdlTG9hZGVyKHN0b3JhZ2UpOwotCQl9Ci0JCXJldHVybiBsb2FkKGRvbWFpbiwgbG9hZGVyLCBiVHJ5Q29tcGF0aWJsZSwgbW9uaXRvciwgaW5wdXQpOwotCX0KLQkKLQlzdGF0aWMgcHVibGljIERpYWdyYW0gbG9hZChmaW5hbCBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIGZpbmFsIElTdG9yYWdlIHN0b3JhZ2UsIGJvb2xlYW4gYlRyeUNvbXBhdGlibGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCU1ldGhvZEVsZW1lbnQgbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUxvYWRlciBsb2FkZXIgPSBudWxsOwotCQlpZihzdG9yYWdlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCWxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKChJRmlsZSlzdG9yYWdlKTsKLQkJfSBlbHNlIHsKLQkJCWxvYWRlciA9IG5ldyBTdG9yYWdlTG9hZGVyKHN0b3JhZ2UpOwotCQl9Ci0JCXJldHVybiBsb2FkKGRvbWFpbiwgbG9hZGVyLCBiVHJ5Q29tcGF0aWJsZSwgbW9uaXRvciwgbWUpOwotCX0KLQkKLQkvKioKLQkgKiBsb2FkIGFuIGV4aXN0aW5nIGRpYWdyYW0gZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlzdGF0aWMgcHJpdmF0ZSBEaWFncmFtIGxvYWQoZmluYWwgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBmaW5hbCBJTG9hZGVyIGxvYWRlciwgYm9vbGVhbiBiVHJ5Q29tcGF0aWJsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAgewotCQlSZXNvdXJjZSBub3RhdGlvbk1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRyeSB7CQotCQkJCS8vIEZpbGUgZXhpc3RzIHdpdGggY29udGVudHMuLgotCQkJCW5vdGF0aW9uTW9kZWwgPSBsb2FkZXIubG9hZChkb21haW4sIG5ldyBIYXNoTWFwKCksIG1vbml0b3IpOwotCQkJfSBjYXRjaCAoUmVzb3VyY2UuSU9XcmFwcGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoYlRyeUNvbXBhdGlibGUpIHsKLQkJCQkJVGhyb3dhYmxlIGNhdXNlRXJyb3IgPSBlLmdldENhdXNlKCk7Ci0JCQkJCQotCQkJCQlpZiAoY2F1c2VFcnJvciA9PSBudWxsKSB7Ci0JCQkJCQljYXVzZUVycm9yID0gZTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJU3RyaW5nIGVyck1zZyA9IGNhdXNlRXJyb3IuZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCQkJCQlpZiAoY2F1c2VFcnJvciBpbnN0YW5jZW9mIFJlc291cmNlLklPV3JhcHBlZEV4Y2VwdGlvbikgewotCQkJCQkJRXhjZXB0aW9uIGV4YyA9IChFeGNlcHRpb24pKChSZXNvdXJjZS5JT1dyYXBwZWRFeGNlcHRpb24pIGNhdXNlRXJyb3IpCi0JCQkJCQkJLmdldENhdXNlKCk7Ci0JCQkJCQlpZiAoZXhjICE9IG51bGwpIHsKLQkJCQkJCQljYXVzZUVycm9yID0gZXhjOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoKGNhdXNlRXJyb3IgaW5zdGFuY2VvZiBQYWNrYWdlTm90Rm91bmRFeGNlcHRpb24gCi0JCQkJCQkJfHwgY2F1c2VFcnJvciBpbnN0YW5jZW9mIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLQkJCQkJCQl8fCBjYXVzZUVycm9yIGluc3RhbmNlb2YgRmVhdHVyZU5vdEZvdW5kRXhjZXB0aW9uKSkgewotCQkJCQkJaWYgKHNob3VsZExvYWRJbkNvbXBhdGliaWxpdHlNb2RlKGVyck1zZykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgbG9hZE9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgCQkJCQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHdpbGwgcGxhY2UgYSBzcGVjaWFsIGV4dGVuZGVkIG1ldGFkYXRhIGluIGhlcmUgdG8gZW5zdXJlIHRoYXQgd2UgY2FuIGxvYWQgZGlhZ3JhbXMKLSAgICAgICAgICAgIAkJCQkvLyAgZnJvbSBvbGRlciB2ZXJzaW9ucyBvZiBvdXIgbWV0YW1vZGVsLgotICAgICAgICAgICAgCQkJCWxvYWRPcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBuZXcgTm90YXRpb25FeHRlbmRlZE1ldGFEYXRhKCkpOwotICAgICAgICAgICAgCQkJCQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRPcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fUkVDT1JEX1VOS05PV05fRkVBVFVSRSwgQm9vbGVhbi5UUlVFKTsKLQkJCQkJCQlub3RhdGlvbk1vZGVsID0gbG9hZGVyLmxvYWQoZG9tYWluLCBsb2FkT3B0aW9ucywgbW9uaXRvcik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIHVzZXIgZG9lcyBub3Qgd2FudCB0byBsb2FkIGluIGNvbXBhdGliaWxpdHkgbW9kZS4KLQkJCQkJCQlyZXR1cm4gbnVsbDsgCi0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZihub3RhdGlvbk1vZGVsID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oVU5BQkxFX1RPX0xPQURfRElBR1JBTSk7Ci0KLQkJCUl0ZXJhdG9yIHJvb3RDb250ZW50cyA9IG5vdGF0aW9uTW9kZWwuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUocm9vdENvbnRlbnRzLmhhc05leHQoKSkgewotCQkJCUVPYmplY3Qgcm9vdEVsZW1lbnQgPSAoRU9iamVjdClyb290Q29udGVudHMubmV4dCgpOwotCQkJCWlmKHJvb3RFbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbSkKLQkJCQkJcmV0dXJuIChEaWFncmFtKXJvb3RFbGVtZW50OwotCQkJfQotCQkJCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihOT19ESUFHUkFNX0lOX1JFU09VUkNFKTsKLQkJfSBjYXRjaChFeGNlcHRpb24gZSkgewotCQkJQ29yZUV4Y2VwdGlvbiB0aHJvd25FeGNwID0gbnVsbDsKLQkJCWlmKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQkJdGhyb3duRXhjcCA9IChDb3JlRXhjZXB0aW9uKWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBleGNlcHRpb25NZXNzYWdlID0gZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3duRXhjcCA9IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICAgICAgICAJCUVQRkRpYWdyYW1QbHVnaW4uZ2V0UGx1Z2luSWQoKSwgMSwKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uTWVzc2FnZSAhPSBudWxsID8gZXhjZXB0aW9uTWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgOiAibG9hZChJRmlsZSwgYm9vbGVhbikiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLQkJCXRocm93IHRocm93bkV4Y3A7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBsb2FkIGFuIGV4aXN0aW5nIGRpYWdyYW0gZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlzdGF0aWMgcHJpdmF0ZSBEaWFncmFtIGxvYWQoZmluYWwgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBmaW5hbCBJTG9hZGVyIGxvYWRlciwgYm9vbGVhbiBiVHJ5Q29tcGF0aWJsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJSUVkaXRvcklucHV0IGlucHV0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAgewotCQlSZXNvdXJjZSBub3RhdGlvbk1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRyeSB7CQotCQkJCS8vIEZpbGUgZXhpc3RzIHdpdGggY29udGVudHMuLgotCQkJCW5vdGF0aW9uTW9kZWwgPSBsb2FkZXIubG9hZChkb21haW4sIG5ldyBIYXNoTWFwKCksIG1vbml0b3IpOwotCQkJfSBjYXRjaCAoUmVzb3VyY2UuSU9XcmFwcGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoYlRyeUNvbXBhdGlibGUpIHsKLQkJCQkJVGhyb3dhYmxlIGNhdXNlRXJyb3IgPSBlLmdldENhdXNlKCk7Ci0JCQkJCQotCQkJCQlpZiAoY2F1c2VFcnJvciA9PSBudWxsKSB7Ci0JCQkJCQljYXVzZUVycm9yID0gZTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJU3RyaW5nIGVyck1zZyA9IGNhdXNlRXJyb3IuZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCQkJCQlpZiAoY2F1c2VFcnJvciBpbnN0YW5jZW9mIFJlc291cmNlLklPV3JhcHBlZEV4Y2VwdGlvbikgewotCQkJCQkJRXhjZXB0aW9uIGV4YyA9IChFeGNlcHRpb24pKChSZXNvdXJjZS5JT1dyYXBwZWRFeGNlcHRpb24pIGNhdXNlRXJyb3IpCi0JCQkJCQkJLmdldENhdXNlKCk7Ci0JCQkJCQlpZiAoZXhjICE9IG51bGwpIHsKLQkJCQkJCQljYXVzZUVycm9yID0gZXhjOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoKGNhdXNlRXJyb3IgaW5zdGFuY2VvZiBQYWNrYWdlTm90Rm91bmRFeGNlcHRpb24gCi0JCQkJCQkJfHwgY2F1c2VFcnJvciBpbnN0YW5jZW9mIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLQkJCQkJCQl8fCBjYXVzZUVycm9yIGluc3RhbmNlb2YgRmVhdHVyZU5vdEZvdW5kRXhjZXB0aW9uKSkgewotCQkJCQkJaWYgKHNob3VsZExvYWRJbkNvbXBhdGliaWxpdHlNb2RlKGVyck1zZykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgbG9hZE9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgCQkJCQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHdpbGwgcGxhY2UgYSBzcGVjaWFsIGV4dGVuZGVkIG1ldGFkYXRhIGluIGhlcmUgdG8gZW5zdXJlIHRoYXQgd2UgY2FuIGxvYWQgZGlhZ3JhbXMKLSAgICAgICAgICAgIAkJCQkvLyAgZnJvbSBvbGRlciB2ZXJzaW9ucyBvZiBvdXIgbWV0YW1vZGVsLgotICAgICAgICAgICAgCQkJCWxvYWRPcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBuZXcgTm90YXRpb25FeHRlbmRlZE1ldGFEYXRhKCkpOwotICAgICAgICAgICAgCQkJCQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRPcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fUkVDT1JEX1VOS05PV05fRkVBVFVSRSwgQm9vbGVhbi5UUlVFKTsKLQkJCQkJCQlub3RhdGlvbk1vZGVsID0gbG9hZGVyLmxvYWQoZG9tYWluLCBsb2FkT3B0aW9ucywgbW9uaXRvcik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIHVzZXIgZG9lcyBub3Qgd2FudCB0byBsb2FkIGluIGNvbXBhdGliaWxpdHkgbW9kZS4KLQkJCQkJCQlyZXR1cm4gbnVsbDsgCi0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZihub3RhdGlvbk1vZGVsID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oVU5BQkxFX1RPX0xPQURfRElBR1JBTSk7Ci0KLQkJCS8vRmlsZUVkaXRvcklucHV0UHJveHkgcHJveHkgPSAoRmlsZUVkaXRvcklucHV0UHJveHkpaW5wdXQ7Ci0JCQlEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkgZmlsZUlucHV0ID0gKERpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSlpbnB1dDsKLQkJCURpYWdyYW1FZGl0b3JJbnB1dCBkaWFncmFtSW5wdXQgPSBmaWxlSW5wdXQuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0JCQkKLQkJCU9iamVjdCBpbnB1dEVsZW1lbnQgPSBkaWFncmFtSW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCi0JCQlEaWFncmFtIGFkID0gbnVsbDsKLQkJCUl0ZXJhdG9yIHJvb3RDb250ZW50cyA9IG5vdGF0aW9uTW9kZWwuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotCQkJZmluZF9hZDoKLQkJCXdoaWxlKHJvb3RDb250ZW50cy5oYXNOZXh0KCkpIHsKLQkJCQlFT2JqZWN0IHJvb3RFbGVtZW50ID0gKEVPYmplY3Qpcm9vdENvbnRlbnRzLm5leHQoKTsKLQkJCQkKLQkJCQlpZihyb290RWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pewotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSlyb290RWxlbWVudDsKLQkJCQkJRU9iamVjdCBkaWFncmFtRWxlbWVudCA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQkJCQkvL1RPRE86IGNhbiB0aGlzIG1ldGhvZCBoYW5kbGUgd2l0aCBvdGhlciB0eXBlcyBvZiBkaWFncmFtPz8/Ci0JCQkJCWlmKERpYWdyYW1TZXJ2aWNlLkFEX2tpbmQuZXF1YWxzKGRpYWdyYW0uZ2V0VHlwZSgpKSAmJiBkaWFncmFtRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IFVtYVVtbFV0aWwuZ2V0VW1hRWxlbWVudCgoTmFtZWRFbGVtZW50KWRpYWdyYW1FbGVtZW50KTsKLQkJCQkJCWlmKGlucHV0RWxlbWVudCA9PSBlbGVtZW50KXsKLQkJCQkJCQlhZCA9IGRpYWdyYW07Ci0JCQkJCQkJYnJlYWsgZmluZF9hZDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmKGFkICE9IG51bGwpIHsKLQkJCQkKLQkJCQkvLyBkaWFncmFtIGZvdW5kLCByZW1vdmUgYWxsIG90aGVyIGRpYWdyYW1zIGFuZCB0aGVpciBzZW1hdGljIG1vZGVscyBmcm9tIHRoZSByZXNvdXJjZQotCQkJCS8vCi0vLwkJCQlMaXN0IHRvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm90YXRpb25Nb2RlbC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0vLwkJCQkJaWYoZWxlbWVudCAhPSBhZCAmJiBlbGVtZW50ICE9IGFkLmdldEVsZW1lbnQoKSkgewotLy8JCQkJCQl0b1JlbW92ZS5hZGQoZWxlbWVudCk7Ci0vLwkJCQkJfQkJCQkJCi0vLwkJCQl9Ci0vLwkJCQkKLS8vCQkJCWlmKCF0b1JlbW92ZS5pc0VtcHR5KCkpIHsKLS8vCQkJCQlJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGludGVybmFsRG9tYWluID0gKChJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKWRvbWFpbik7Ci0vLwkJCQkJSW50ZXJuYWxUcmFuc2FjdGlvbiB0eCA9IGludGVybmFsRG9tYWluLmdldEFjdGl2ZVRyYW5zYWN0aW9uKCk7Ci0vLwkJCQkJaWYodHggPT0gbnVsbCkgewotLy8JCQkJCQl0eCA9IGludGVybmFsRG9tYWluLnN0YXJ0VHJhbnNhY3Rpb24oZmFsc2UsIENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0vLwkJCQkJfQotLy8JCQkJCWVsc2UgaWYoIXR4LmlzQWN0aXZlKCkpIHsJCQotLy8JCQkJCQl0eC5zdGFydCgpOwotLy8JCQkJCX0KLS8vCQkJCQlub3RhdGlvbk1vZGVsLmdldENvbnRlbnRzKCkucmVtb3ZlQWxsKHRvUmVtb3ZlKTsKLS8vCQkJCQkKLS8vCQkJCQl0eC5jb21taXQoKTsKLS8vCQkJCX0KLQkJCQkKLS8vCQkJCVJlc291cmNlIHJlc291cmNlID0gZG9tYWluLmNyZWF0ZVJlc291cmNlKG5vdGF0aW9uTW9kZWwuZ2V0VVJJKCkpOwotLy8JCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5jbGVhcigpOwotLy8JCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoYWQuZ2V0RWxlbWVudCgpKTsKLS8vCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGFkKTsKLQkJCQkKLQkJCQkKLQkJCQlyZXR1cm4gYWQ7Ci0JCQl9Ci0JCQkKLQkJCS8vVE9ETzogcmVtb3ZlIHRoZSBkZXBlbmRlbmN5IG9uIERpYWdyYW1FZGl0b3JVdGlsLgotCQkJYm9vbGVhbiBvayA9RGlhZ3JhbUVkaXRvclV0aWwuY3JlYXRlRGlhZ3JhbUNvbnRlbnQoZG9tYWluLAotCQkJCQlmaWxlSW5wdXQuZ2V0RmlsZSgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBkaWFncmFtSW5wdXQsIG5vdGF0aW9uTW9kZWwpOwotCQkJaWYob2spewotCQkJCS8vdW5sb2FkKGRvbWFpbiwgZGlhZ3JhbSkKLQkJCQlyZXR1cm4gbG9hZChkb21haW4sIGxvYWRlciwgYlRyeUNvbXBhdGlibGUsIG1vbml0b3IsIGlucHV0KTsKLQkJCX0KLQkJCQkKLQkJCQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oTk9fRElBR1JBTV9JTl9SRVNPVVJDRSk7Ci0JCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCUNvcmVFeGNlcHRpb24gdGhyb3duRXhjcCA9IG51bGw7Ci0JCQlpZihlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJCXRocm93bkV4Y3AgPSAoQ29yZUV4Y2VwdGlvbillOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZXhjZXB0aW9uTWVzc2FnZSA9IGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIHRocm93bkV4Y3AgPSBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgICAgICAgICAgIEVQRkRpYWdyYW1QbHVnaW4uZ2V0UGx1Z2luSWQoKSwgMSwKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uTWVzc2FnZSAhPSBudWxsID8gZXhjZXB0aW9uTWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgOiAibG9hZChJRmlsZSwgYm9vbGVhbikiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLQkJCXRocm93IHRocm93bkV4Y3A7Ci0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogbG9hZCBhbiBleGlzdGluZyBkaWFncmFtIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0Jc3RhdGljIHByaXZhdGUgRGlhZ3JhbSBsb2FkKGZpbmFsIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgZmluYWwgSUxvYWRlciBsb2FkZXIsIGJvb2xlYW4gYlRyeUNvbXBhdGlibGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCU1ldGhvZEVsZW1lbnQgbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uICB7Ci0JCVJlc291cmNlIG5vdGF0aW9uTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJdHJ5IHsJCi0JCQkJLy8gRmlsZSBleGlzdHMgd2l0aCBjb250ZW50cy4uCi0JCQkJbm90YXRpb25Nb2RlbCA9IGxvYWRlci5sb2FkKGRvbWFpbiwgbmV3IEhhc2hNYXAoKSwgbW9uaXRvcik7Ci0JCQl9IGNhdGNoIChSZXNvdXJjZS5JT1dyYXBwZWRFeGNlcHRpb24gZSkgewotCQkJCWlmIChiVHJ5Q29tcGF0aWJsZSkgewotCQkJCQlUaHJvd2FibGUgY2F1c2VFcnJvciA9IGUuZ2V0Q2F1c2UoKTsKLQkJCQkJCi0JCQkJCWlmIChjYXVzZUVycm9yID09IG51bGwpIHsKLQkJCQkJCWNhdXNlRXJyb3IgPSBlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlTdHJpbmcgZXJyTXNnID0gY2F1c2VFcnJvci5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCQkJCWlmIChjYXVzZUVycm9yIGluc3RhbmNlb2YgUmVzb3VyY2UuSU9XcmFwcGVkRXhjZXB0aW9uKSB7Ci0JCQkJCQlFeGNlcHRpb24gZXhjID0gKEV4Y2VwdGlvbikoKFJlc291cmNlLklPV3JhcHBlZEV4Y2VwdGlvbikgY2F1c2VFcnJvcikKLQkJCQkJCQkuZ2V0Q2F1c2UoKTsKLQkJCQkJCWlmIChleGMgIT0gbnVsbCkgewotCQkJCQkJCWNhdXNlRXJyb3IgPSBleGM7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmICgoY2F1c2VFcnJvciBpbnN0YW5jZW9mIFBhY2thZ2VOb3RGb3VuZEV4Y2VwdGlvbiAKLQkJCQkJCQl8fCBjYXVzZUVycm9yIGluc3RhbmNlb2YgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotCQkJCQkJCXx8IGNhdXNlRXJyb3IgaW5zdGFuY2VvZiBGZWF0dXJlTm90Rm91bmRFeGNlcHRpb24pKSB7Ci0JCQkJCQlpZiAoc2hvdWxkTG9hZEluQ29tcGF0aWJpbGl0eU1vZGUoZXJyTXNnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBsb2FkT3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAJCQkJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2Ugd2lsbCBwbGFjZSBhIHNwZWNpYWwgZXh0ZW5kZWQgbWV0YWRhdGEgaW4gaGVyZSB0byBlbnN1cmUgdGhhdCB3ZSBjYW4gbG9hZCBkaWFncmFtcwotICAgICAgICAgICAgCQkJCS8vICBmcm9tIG9sZGVyIHZlcnNpb25zIG9mIG91ciBtZXRhbW9kZWwuCi0gICAgICAgICAgICAJCQkJbG9hZE9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIG5ldyBOb3RhdGlvbkV4dGVuZGVkTWV0YURhdGEoKSk7Ci0gICAgICAgICAgICAJCQkJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZE9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9SRUNPUkRfVU5LTk9XTl9GRUFUVVJFLCBCb29sZWFuLlRSVUUpOwotCQkJCQkJCW5vdGF0aW9uTW9kZWwgPSBsb2FkZXIubG9hZChkb21haW4sIGxvYWRPcHRpb25zLCBtb25pdG9yKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gdXNlciBkb2VzIG5vdCB3YW50IHRvIGxvYWQgaW4gY29tcGF0aWJpbGl0eSBtb2RlLgotCQkJCQkJCXJldHVybiBudWxsOyAKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQkJCX0KLQkJCWlmKG5vdGF0aW9uTW9kZWwgPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihVTkFCTEVfVE9fTE9BRF9ESUFHUkFNKTsKLQotCQkJSXRlcmF0b3Igcm9vdENvbnRlbnRzID0gbm90YXRpb25Nb2RlbC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShyb290Q29udGVudHMuaGFzTmV4dCgpKSB7Ci0JCQkJRU9iamVjdCByb290RWxlbWVudCA9IChFT2JqZWN0KXJvb3RDb250ZW50cy5uZXh0KCk7Ci0JCQkJCi0JCQkJaWYocm9vdEVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKXsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pcm9vdEVsZW1lbnQ7Ci0JCQkJCUVPYmplY3QgZGlhZ3JhbUVsZW1lbnQgPSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJCQkJaWYoZGlhZ3JhbUVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBVbWFVbWxVdGlsLmdldFVtYUVsZW1lbnQoKE5hbWVkRWxlbWVudClkaWFncmFtRWxlbWVudCk7Ci0KLQkJCQkJCWlmKG1lID09IGVsZW1lbnQpewotCQkJCQkJCXJldHVybiBkaWFncmFtOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJfSBjYXRjaChFeGNlcHRpb24gZSkgewotCQkJQ29yZUV4Y2VwdGlvbiB0aHJvd25FeGNwID0gbnVsbDsKLQkJCWlmKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQkJdGhyb3duRXhjcCA9IChDb3JlRXhjZXB0aW9uKWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBleGNlcHRpb25NZXNzYWdlID0gZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3duRXhjcCA9IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgRVBGRGlhZ3JhbVBsdWdpbi5nZXRQbHVnaW5JZCgpLCAxLAotICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25NZXNzYWdlICE9IG51bGwgPyBleGNlcHRpb25NZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICA6ICJsb2FkKElGaWxlLCBib29sZWFuKSIsIGUpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotCQkJdGhyb3cgdGhyb3duRXhjcDsKLQkJfQotCX0KLQkKLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEBwYXJhbSBiS2VlcFVucmVjb2duaXplZERhdGEKLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JCi0Jc3RhdGljIHB1YmxpYyB2b2lkIHNhdmUoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBJRmlsZSBmaWxlLCBEaWFncmFtIGRpYWdyYW0sIGJvb2xlYW4gYktlZXBVbnJlY29nbml6ZWREYXRhLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmKGJLZWVwVW5yZWNvZ25pemVkRGF0YSkKLSAgICAgICAgICAgIG9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9SRUNPUkRfVU5LTk9XTl9GRUFUVVJFLCBCb29sZWFuLlRSVUUpOwotICAgICAgICBzYXZlKGRvbWFpbiwgZmlsZSwgZGlhZ3JhbSwgcHJvZ3Jlc3NNb25pdG9yLCBvcHRpb25zKTsKLQl9Ci0gICAgCi0gICAgc3RhdGljIHB1YmxpYyB2b2lkIHNhdmUoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBJRmlsZSBmaWxlLCBEaWFncmFtIGRpYWdyYW0sIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgc2F2ZShkb21haW4sIGZpbGUsIGRpYWdyYW0sIHByb2dyZXNzTW9uaXRvciwgb3B0aW9ucyk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIExpc3QgZ2V0T3RoZXJEaWFncmFtT2JqZWN0cyhSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIGFjdEd1aWQpIHsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJaWYoIWFjdEd1aWQuZXF1YWxzKFVtYVVtbFV0aWwuZ2V0VW1hR3VpZEZyb21VbWxFbGVtZW50KChOYW1lZEVsZW1lbnQpIGVsZW1lbnQpKSkgewotCQkJCQlsaXN0LmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJT2JqZWN0IGUgPSAoKERpYWdyYW0pZWxlbWVudCkuZ2V0RWxlbWVudCgpOwotCQkJCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgeyAKLQkJCQkJaWYoIWFjdEd1aWQuZXF1YWxzKFVtYVVtbFV0aWwuZ2V0VW1hR3VpZEZyb21VbWxFbGVtZW50KChOYW1lZEVsZW1lbnQpIGUpKSkgewotCQkJCQkJbGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJCX0JCQkJCQkKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWxpc3QuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWxpc3QuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotICAgIH0KLQkKLQlzdGF0aWMgcHVibGljIHZvaWQgc2F2ZShUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIElGaWxlIGZpbGUsIERpYWdyYW0gZGlhZ3JhbSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsIE1hcCBvcHRpb25zKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlIG5vdGF0aW9uTW9kZWwgPSAoKEVPYmplY3QpIGRpYWdyYW0pLmVSZXNvdXJjZSgpOwotCQlTdHJpbmcgYWN0R3VpZCA9IFVtYVVtbFV0aWwuZ2V0VW1hR3VpZEZyb21VbWxFbGVtZW50KChOYW1lZEVsZW1lbnQpIGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCi0JCS8vIFRoZSBjdXJyZW50IHJlc291cmNlIGNvbnRhaW5zIG9ubHkgY3VycmVudCBkaWFncmFtCi0JCS8vIFNvIGxvYWQgZGlhZ3JhbSBmaWxlIGFuZCBhZGQgb3RoZXIgZGlhZ3JhbXMgdG8gdGhlIGN1cnJlbnQgcmVzb3VyY2UgYmVmb3JlIHNhdmluZyBpdAotCQkvLwotCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlRmFjdG9yeS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpOwotCQl0cnkgewotCQkJVHJhbnNhY3Rpb24gdHggPSAoKEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4pZG9tYWluKS5zdGFydFRyYW5zYWN0aW9uKGZhbHNlLCBUWF9PUFRJT05TKTsKLQkJCXJlc291cmNlLmxvYWQoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsJCi0JCQlMaXN0IG5ld0xpc3QgPSBnZXRPdGhlckRpYWdyYW1PYmplY3RzKHJlc291cmNlLCBhY3RHdWlkKTsKLQkJCUxpc3Qgb2xkTGlzdCA9IGdldE90aGVyRGlhZ3JhbU9iamVjdHMobm90YXRpb25Nb2RlbCwgYWN0R3VpZCk7Ci0JCQlub3RhdGlvbk1vZGVsLmdldENvbnRlbnRzKCkucmVtb3ZlQWxsKG9sZExpc3QpOwotCQkJbm90YXRpb25Nb2RlbC5nZXRDb250ZW50cygpLmFkZEFsbChuZXdMaXN0KTsKLQkJCXR4LmNvbW1pdCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQl9CQkKLQkJCi0JCVN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCk7Ci0JCW5vdGF0aW9uTW9kZWwuc2V0VVJJKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGVOYW1lLCB0cnVlKSk7Ci0JCXRyeSB7Ci0JCQlub3RhdGlvbk1vZGVsLnNhdmUob3B0aW9ucyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRVBGRGlhZ3JhbVBsdWdpbgotCQkJCS5nZXRQbHVnaW5JZCgpLCA1LCBlCi0JCQkJLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgbnVsbCkpOwotCQl9Ci0KLQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKQotCQkJcHJvZ3Jlc3NNb25pdG9yLmRvbmUoKTsKLQkJCi0JCWxvZ1Jlc291cmNlRXJyb3JzQW5kV2FybmluZ3Mobm90YXRpb25Nb2RlbCk7Ci0JfQotCQotCS8qKgotCSAqIFRlbXAgbWV0aG9kIHdpbGwgYmUgcmVtb3ZlZCBsYXRlci4KLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiBAcGFyYW0gc2F2ZQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCBzYXZlKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgSUZpbGUgZmlsZSwgRGlhZ3JhbSBkaWFncmFtLCAKLQkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBib29sZWFuIHNhdmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgTWFwIG9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQlSZXNvdXJjZSBub3RhdGlvbk1vZGVsID0gKChFT2JqZWN0KSBkaWFncmFtKS5lUmVzb3VyY2UoKTsKLQkJaWYobm90YXRpb25Nb2RlbCA9PSBudWxsKXsKLQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZS5nZXRGdWxsUGF0aCgpCi0JICAgICAgICAgICAgICAgIC50b09TU3RyaW5nKCksIHRydWUpOwotCQkJCQotCQkJCW5vdGF0aW9uTW9kZWwgPSBkb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZSh1cmksIGZhbHNlKTsKLQkJCQlpZiAobm90YXRpb25Nb2RlbCA9PSBudWxsKSB7Ci0JCQkJCW5vdGF0aW9uTW9kZWwgPSBkb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZSh1cmkpOwotCQkJCX0KLQkJCQlub3RhdGlvbk1vZGVsLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCQlub3RhdGlvbk1vZGVsLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOwotCQl9ZWxzZXsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCk7Ci0JCQlub3RhdGlvbk1vZGVsLnNldFVSSShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlTmFtZSwgdHJ1ZSkpOwotCQl9Ci0JCQotCQl0cnkgewotCQkJbm90YXRpb25Nb2RlbC5zYXZlKG9wdGlvbnMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEVQRkRpYWdyYW1QbHVnaW4KLQkJCQkuZ2V0UGx1Z2luSWQoKSwgNSwgZQotCQkJCS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIG51bGwpKTsKLQkJfQotCi0JCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkKLQkJCXByb2dyZXNzTW9uaXRvci5kb25lKCk7Ci0JCQotCQlsb2dSZXNvdXJjZUVycm9yc0FuZFdhcm5pbmdzKG5vdGF0aW9uTW9kZWwpOwotCX0KLQkKLQkKLQkJLyoqCi0JICogQHBhcmFtIGVyck1zZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHNob3VsZExvYWRJbkNvbXBhdGliaWxpdHlNb2RlKFN0cmluZyBlcnJNc2cpIHsKLQkJLy8gbm8gY29tcGF0aWJpbGl0eSBzdXBwb3J0IGF0IHByZXNlbnQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5sb2FkKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCWRpYWdyYW0uZVJlc291cmNlKCkudW5sb2FkKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1VucmVjb2duaXplZERhdGEoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJLy8gbm8gY29tcGF0aWJpbGl0eSBzdXBwb3J0IGF0IHByZXNlbnQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldEZpbGUoSUVkaXRvcklucHV0IGlucHV0KXsKLQkJcmV0dXJuIGdldEZpbGUoRGlhZ3JhbUZpbGVDcmVhdG9yRXguZGVmYXVsdF9kaWFncmFtX2ZpbGUsIGlucHV0LAotCQkJCURpYWdyYW1GaWxlQ3JlYXRvckV4LmdldEluc3RhbmNlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIGZpbGUgZXhpc3RzIG9yIG5vdC4KLQkgKiBAcGFyYW0gc3pGaWxlTmFtZQotCSAqIEBwYXJhbSBpbnB1dAotCSAqIEBwYXJhbSBkaWFncmFtRmlsZUNyZWF0b3IKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKFN0cmluZyBzekZpbGVOYW1lLCBJRWRpdG9ySW5wdXQgaW5wdXQsCi0JCQlEaWFncmFtRmlsZUNyZWF0b3IgZGlhZ3JhbUZpbGVDcmVhdG9yKSB7Ci0KLQkJTWV0aG9kRWxlbWVudCBlID0gKChEaWFncmFtRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCVByb2Nlc3Mgc3JjUHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgZSk7Ci0KLQkJSVBhdGggY29udGFpbmVyUGF0aCA9IGdldENvbnRhaW5lclBhdGgoZSk7Ci0JCVN0cmluZyBzek5ld0ZpbGVOYW1lID0gc3pGaWxlTmFtZTsKLQkJSVBhdGggZmlsZVBhdGggPSBjb250YWluZXJQYXRoLmFwcGVuZChkaWFncmFtRmlsZUNyZWF0b3IKLQkJCQkuYXBwZW5kRXh0ZW5zaW9uVG9GaWxlTmFtZShzek5ld0ZpbGVOYW1lKSk7Ci0JCUZpbGUgbGliRGlycyA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkpOwotCQlTdHJpbmcgZGlhZ3JhbVBhdGggPSBsaWJEaXJzLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkrIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuZ2V0RWxlbWVudFBhdGgoc3JjUHJvYykKLQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgc3JjUHJvYy5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCSsgImRpYWdyYW0ueG1pIjsKLQkJRmlsZSBmaWxleCA9IG5ldyBGaWxlKGRpYWdyYW1QYXRoKTsKLQkJaWYgKGZpbGV4LmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGZpbGVQYXRoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQHdyaXR0ZW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldENvbnRhaW5lclBhdGgoKXsKLQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCWlmIChwYXRoID09IG51bGwpIHsKLQkJCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCQlJUHJvamVjdFtdIHByb2plY3RzID0gcm9vdC5nZXRQcm9qZWN0cygpOwotCi0JCQkJcGF0aCA9IHJvb3QuZ2V0RnVsbFBhdGgoKTsKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCi0JCQkJCWlmIChwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJCQlwYXRoID0gcHJvamVjdC5nZXRGdWxsUGF0aCgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIAotCSAqIEBwYXJhbSBwcm9jCi0JICogQHJldHVybgotCSAqIEBjdXN0b20KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldENvbnRhaW5lclBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0KLQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGUpOwotCQkvLyBUT0RPIGhhbmRsZSB0aGUgV3JhcHBlciBFbGVtZW50cy4KLQkJCi0JCWlmIChwcm9jIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHByb2MpOwotCi0JCQlTdHJpbmcgcmVsYXRpdmVEaXI7Ci0KLQkJCWlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQlyZWxhdGl2ZURpciA9IE11bHRpRmlsZVNhdmVVdGlsLkNBUEFCSUxJVFlfUEFUVEVSTl9QQVRIOwotCQkJfSBlbHNlIGlmIChwcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJcmVsYXRpdmVEaXIgPSBNdWx0aUZpbGVTYXZlVXRpbC5ERUxJVkVSWV9QUk9DRVNTX1BBVEg7Ci0JCQl9IGVsc2UgewotCQkJCXJlbGF0aXZlRGlyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJSVBhdGggd29ya3NwYWNlUGF0aCA9IG51bGw7Ci0JCQlpZiAod29ya3NwYWNlUGF0aCA9PSBudWxsKSB7Ci0JCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IHJvb3QuZ2V0UHJvamVjdHMoKTsKLQotCQkJCXdvcmtzcGFjZVBhdGggPSByb290LmdldEZ1bGxQYXRoKCk7Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgKytpKSB7Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQotCQkJCQlpZiAocHJvamVjdC5pc09wZW4oKSkgewotCQkJCQkJd29ya3NwYWNlUGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlTdHJpbmcgbGliRGlyID0gd29ya3NwYWNlUGF0aC50b1N0cmluZygpOwotCQkJU3RyaW5nIHBsdWdpbkRpciA9IGxpYkRpciArIEZpbGUuc2VwYXJhdG9yICsgcGx1Z2luLmdldE5hbWUoKTsKLQkJCVN0cmluZyBkaWFncmFtRGlyID0gcGx1Z2luRGlyICsgRmlsZS5zZXBhcmF0b3IgKyByZWxhdGl2ZURpcgotCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgcHJvYy5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvcjsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJQcmludDogIiArIGRpYWdyYW1EaXIpOwotCQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoZGlhZ3JhbURpcik7Ci0JCQlyZXR1cm4gcGF0aDsKLQotCQkJLy8JIHJldHVybiB3b3Jrc3BhY2VQYXRoOwotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCX0gCi0JCi0JLyoqCi0JICogQ2hlY2sgd2hldGhlciBmaWxlIGV4aXN0cyBvciBub3QuCi0JICogCi0JICogQHBhcmFtIHN6RmlsZU5hbWUKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcGFyYW0gZGlhZ3JhbUZpbGVDcmVhdG9yCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0RmlsZShTdHJpbmcgc3pGaWxlTmFtZSwgQnJlYWtkb3duRWxlbWVudCBlLAotCQkJRGlhZ3JhbUZpbGVDcmVhdG9yIGRpYWdyYW1GaWxlQ3JlYXRvcikgewotCi0JCVByb2Nlc3Mgc3JjUHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgZSk7Ci0KLQkJSVBhdGggY29udGFpbmVyUGF0aCA9IGdldENvbnRhaW5lclBhdGgoZSk7Ci0JCVN0cmluZyBzek5ld0ZpbGVOYW1lID0gc3pGaWxlTmFtZTsKLQkJSVBhdGggZmlsZVBhdGggPSBjb250YWluZXJQYXRoLmFwcGVuZChkaWFncmFtRmlsZUNyZWF0b3IKLQkJCQkuYXBwZW5kRXh0ZW5zaW9uVG9GaWxlTmFtZShzek5ld0ZpbGVOYW1lKSk7Ci0JCUZpbGUgbGliRGlycyA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkpOwotCQlTdHJpbmcgZGlhZ3JhbVBhdGggPSBsaWJEaXJzLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkrIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuZ2V0RWxlbWVudFBhdGgoc3JjUHJvYykKLQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgc3JjUHJvYy5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCSsgImRpYWdyYW0ueG1pIjsKLQkJRmlsZSBmaWxleCA9IG5ldyBGaWxlKGRpYWdyYW1QYXRoKTsKLQkJaWYgKGZpbGV4LmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGZpbGVQYXRoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JLyoqCi0JICogCi0JICogCi0JICogQ3JlYXRlcyBhIGRpYWdyYW0gZmlsZSBjb250ZW50IC0gR01GIG5vdGF0aW9uIERpYWdyYW0gYW5kIFVNTCBBY3Rpdml0eSwKLQkgKiBVTUEgYnJpZGdlLiBUT0RPOiByZW1vdmUgdGhlIGRlcGVuZGVuY3kgb24gY29tbWFuZC4KLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjcmVhdGVEaWFncmFtQ29udGVudCgKLQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIElGaWxlIGRpYWdyYW1GaWxlLAotCQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsIElFZGl0b3JJbnB1dCBpbnB1dCwKLQkJCVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcga2luZCkgewotCi0JCUxpc3QgYWZmZWN0ZWRGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYWZmZWN0ZWRGaWxlcy5hZGQoZGlhZ3JhbUZpbGUpOwotCQlDcmVhdGVEaWFncmFtQ29tbWFuZCBjb21tYW5kID0gbmV3IENyZWF0ZURpYWdyYW1Db21tYW5kKGVkaXRpbmdEb21haW4sCi0JCQkJQ3JlYXRlRGlhZ3JhbUNvbW1hbmQuQ09NTUFORF9MQUJFTCwgYWZmZWN0ZWRGaWxlcywgaW5wdXQsCi0JCQkJcmVzb3VyY2UsIGtpbmQpOwotCQl0cnkgewotCQkJT3BlcmF0aW9uSGlzdG9yeUZhY3RvcnkuZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmV4ZWN1dGUoY29tbWFuZCwKLQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDEpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBjcmVhdGUgbW9kZWwgYW5kIGRpYWdyYW0iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpYWdyYW0gY3JlYXRlRGlhZ3JhbShUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCAKLQkJCVN0cmluZyBkaWFncmFtS2luZCwgQnJlYWtkb3duRWxlbWVudCBtZSwgYm9vbGVhbiBzYXZlKSB7Ci0JCUlGaWxlIGRpYWdyYW1GaWxlID0gZ2V0RmlsZShEaWFncmFtRmlsZUNyZWF0b3JFeC5kZWZhdWx0X2RpYWdyYW1fZmlsZSwgKEJyZWFrZG93bkVsZW1lbnQpbWUsIAotCQkJCURpYWdyYW1GaWxlQ3JlYXRvckV4LmdldEluc3RhbmNlKCkpOwkKLQkJCi0JCWZpbmFsIFJlc291cmNlIGRpYWdyYW1SZXNvdXJjZSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKQotCQkJCS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShkaWFncmFtRmlsZQotCQkJCQkJLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpOwotCQlMaXN0IGFmZmVjdGVkRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWFmZmVjdGVkRmlsZXMuYWRkKGRpYWdyYW1GaWxlKTsKLQotCQlmaW5hbCBTdHJpbmcga2luZFBhcmFtID0gZGlhZ3JhbUtpbmQ7Ci0JCWZpbmFsIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IG1lOwotCQlmaW5hbCBib29sZWFuIHNhdmVEaWFncmFtID0gc2F2ZTsKLQkJQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCBjb21tYW5kID0gbmV3IEFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQoCi0JCQkJZWRpdGluZ0RvbWFpbiwgIkNyZWF0aW5nIGRpYWdyYW0gYW5kIG1vZGVsIiwgYWZmZWN0ZWRGaWxlcykgeyAvLyROT04tTkxTLTEkCi0JCQlEaWFncmFtIGRpYWdyYW0gPSBudWxsOwotCQkJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdCgKLQkJCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCUFjdGl2aXR5IG1vZGVsID0gVU1MRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKTsKLQkJCQlkaWFncmFtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQobW9kZWwpOwotCQkJCWRpYWdyYW0gPSBWaWV3U2VydmljZS5jcmVhdGVEaWFncmFtKG1vZGVsLCBraW5kUGFyYW0sCi0JCQkJCQlFUEZEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQlpZihtZXRob2RFbGVtZW50ICE9IG51bGwgJiYgbWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkpewotCQkJCQkJVW1hVW1sVXRpbC5jcmVhdGVFQW5ub3RhdGlvbkZvclVtbChtb2RlbCwgbWV0aG9kRWxlbWVudC5nZXRHdWlkKCkpOwotCQkJCQl9Ci0JCQkJCWRpYWdyYW1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtKTsKLQkJCQkJZGlhZ3JhbS5zZXROYW1lKG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkJCQkJZGlhZ3JhbS5zZXRFbGVtZW50KG1vZGVsKTsKLQkJCQkJbW9kZWwuc2V0TmFtZShtZXRob2RFbGVtZW50LmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJCS8vIEVuYWJsZSBiZWxvdyBpZiB3ZSBoYXZlIHRvIHN0b3JlIHRoZSBkaWFncmFtIGltbWVkaWF0ZWx5LgotCQkJCWlmIChzYXZlRGlhZ3JhbSkgewotCQkJCQl0cnkgewotCQkJCQkJIGRpYWdyYW1SZXNvdXJjZS5zYXZlKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIlVuYWJsZSB0byBzdG9yZSBtb2RlbCBhbmQgZGlhZ3JhbSByZXNvdXJjZXMiCi0JCQkJCQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KGRpYWdyYW0pOwotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQlPcGVyYXRpb25IaXN0b3J5RmFjdG9yeS5nZXRPcGVyYXRpb25IaXN0b3J5KCkuZXhlY3V0ZShjb21tYW5kLAotCQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIDEpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiBVbmFibGUgdG8gY3JlYXRlIG1vZGVsIGFuZCBkaWFncmFtIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlkaWFncmFtRmlsZS5zZXRDaGFyc2V0KAotCQkJCQkiVVRGLTgiLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIDEpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6IFVuYWJsZSB0byBzZXQgY2hhcnNldCBmb3IgZGlhZ3JhbSBmaWxlICIrICBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gKERpYWdyYW0pY29tbWFuZC5nZXRDb21tYW5kUmVzdWx0KCkuZ2V0UmV0dXJuVmFsdWUoKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogCi0JICogQAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbSBzYXZlRGlhZ3JhbShUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBJRmlsZSBkaWFncmFtRmlsZSwgCi0JCQlEaWFncmFtIGRpYWdyYW0sIGJvb2xlYW4gc2F2ZSkgewotCQkKLQkJUmVzb3VyY2Ugbm90YXRpb25Nb2RlbCA9ICgoRU9iamVjdCkgZGlhZ3JhbSkuZVJlc291cmNlKCk7Ci0JCWlmKG5vdGF0aW9uTW9kZWwgPT0gbnVsbCl7Ci0JCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGRpYWdyYW1GaWxlLmdldEZ1bGxQYXRoKCkKLQkgICAgICAgICAgICAgICAgLnRvT1NTdHJpbmcoKSwgdHJ1ZSk7Ci0JCQkJCi0JCQkJbm90YXRpb25Nb2RlbCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZSh1cmksIGZhbHNlKTsKLQkJCQlpZiAobm90YXRpb25Nb2RlbCA9PSBudWxsKSB7Ci0JCQkJCW5vdGF0aW9uTW9kZWwgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuY3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJCQl9Ci0JCX0KLQkJZmluYWwgUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gbm90YXRpb25Nb2RlbDsKLQkJTGlzdCBhZmZlY3RlZEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlhZmZlY3RlZEZpbGVzLmFkZChkaWFncmFtRmlsZSk7Ci0JCWZpbmFsIERpYWdyYW0gc2F2ZURpYWdyYW0gPSBkaWFncmFtOwotCQlBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCgKLQkJCQllZGl0aW5nRG9tYWluLCAiU2F2aW5nIGRpYWdyYW0gYW5kIG1vZGVsIiwgYWZmZWN0ZWRGaWxlcykgeyAvLyROT04tTkxTLTEkCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KAotCQkJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJZGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHNhdmVEaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQkJZGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHNhdmVEaWFncmFtKTsKLQkJCQl0cnkgewotCQkJCQkgZGlhZ3JhbVJlc291cmNlLnNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiVW5hYmxlIHRvIHN0b3JlIG1vZGVsIGFuZCBkaWFncmFtIHJlc291cmNlcyIKLQkJCQkJCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoc2F2ZURpYWdyYW0pOwotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQlPcGVyYXRpb25IaXN0b3J5RmFjdG9yeS5nZXRPcGVyYXRpb25IaXN0b3J5KCkuZXhlY3V0ZShjb21tYW5kLAotCQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIDEpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiBVbmFibGUgdG8gY3JlYXRlIG1vZGVsIGFuZCBkaWFncmFtIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlkaWFncmFtRmlsZS5zZXRDaGFyc2V0KAotCQkJCQkiVVRGLTgiLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIDEpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6IFVuYWJsZSB0byBzZXQgY2hhcnNldCBmb3IgZGlhZ3JhbSBmaWxlICIrICBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gKERpYWdyYW0pY29tbWFuZC5nZXRDb21tYW5kUmVzdWx0KCkuZ2V0UmV0dXJuVmFsdWUoKTsKLQl9Ci0JCi0JLyoqCi0JICogTWV0aG9kIGdldEluaXRpYWxDb250ZW50cy4gR2V0cyB0aGUgaW5pdGlhbCBjb250ZW50cyBvZiB0aGUgVU1MCi0JICogVmlzdWFsaXplciBkaWFncmFtIGZpbGUuIEN1cnJlbnRseSBpdCByZXR1cm5zIGFuIGVtcHR5IGJ5dGUgc3RyZWFtLgotCSAqCi0JICogQHJldHVybiBCeXRlIHN0cmVhbSB0aGF0IHdpbGwgaW5pdGlhbGx5IHBvcHVsYXRlIHRoZSBVTUwKLQkgKiAgICAgICAgIFZpc3VhbGl6ZXIgZGlhZ3JhbSBmaWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0SW5pdGlhbENvbnRlbnRzKCkgewotCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB3aXRoaW4gYSB3b3Jrc3BhY2UgbW9kaWZ5IG9wZXJhdGlvbiBzaW5jZSBpdCBjcmVhdGVzIHJlc291cmNlcy4KLQkgKiA8L3A+Ci0JICogQG1vZGlmaWVkCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBmaWxlIHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZmlsZSB3YXMgbm90IGNyZWF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElGaWxlIGNyZWF0ZU5ld0RpYWdyYW1GaWxlKAotCQkJRGlhZ3JhbUZpbGVDcmVhdG9yRXggZGlhZ3JhbUZpbGVDcmVhdG9yLCBJRWRpdG9ySW5wdXQgaW5wdXQsIAotCQkJU2hlbGwgc2hlbGwsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yICkgewotCQkKLQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKChEaWFncmFtRWRpdG9ySW5wdXQpaW5wdXQpLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJZmluYWwgSVBhdGggY29udGFpbmVyUGF0aCA9IGdldENvbnRhaW5lclBhdGgoZWxlbWVudCk7Ci0JCWZpbmFsIFN0cmluZyBkaWFncmFtRmlsZU5hbWUgPSBEaWFncmFtRmlsZUNyZWF0b3JFeC5kZWZhdWx0X2RpYWdyYW1fZmlsZTsKLQkJcHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzaygiQ3JlYXRpbmcgbm90YXRpb24gZGlhZ3JhbSBhbmQgbW9kZWwgZmlsZSIsIDQpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIElQcm9ncmVzc01vbml0b3Igc3ViUHJvZ3Jlc3NNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcigKLQkJCQlwcm9ncmVzc01vbml0b3IsIDEpOwotCQlmaW5hbCBJRmlsZSBkaWFncmFtRmlsZSA9IGRpYWdyYW1GaWxlQ3JlYXRvci5jcmVhdGVOZXdGaWxlKAotCQkJCWNvbnRhaW5lclBhdGgsIGRpYWdyYW1GaWxlTmFtZSwgCi0JCQkJZ2V0SW5pdGlhbENvbnRlbnRzKCksIHNoZWxsLAotCQkJCW5ldyBJUnVubmFibGVDb250ZXh0KCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oYm9vbGVhbiBmb3JrLCBib29sZWFuIGNhbmNlbGFibGUsCi0JCQkJCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlKQotCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCXJ1bm5hYmxlLnJ1bihzdWJQcm9ncmVzc01vbml0b3IpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQkvL2NyZWF0ZURpYWdyYW1Db250ZW50KGRpYWdyYW1GaWxlLCBwcm9ncmVzc01vbml0b3IsIGlucHV0KTsKLQkJcHJvZ3Jlc3NNb25pdG9yLmRvbmUoKTsKLQkJcmV0dXJuIGRpYWdyYW1GaWxlOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcGVyc2lzdGVuY2UvRGlhZ3JhbVNlcnZpY2UuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BlcnNpc3RlbmNlL0RpYWdyYW1TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMWE0NDEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcGVyc2lzdGVuY2UvRGlhZ3JhbVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsLkNvcGllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLkFic3RyYWN0RU1GT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnV0aWwuVW1hVW1sVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuU3RyaW5nU3RhdGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuRGlhZ3JhbUVkaXRpbmdEb21haW5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLlZpZXdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU1GQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk9iamVjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBEaWFncmFtIHNlcnZpY2UgZG9lcyBkaWFncmFtIGRhdGEgc3BlY2lmaWMgd29yayByZXF1ZXN0ZWQgYnkgY2xpZW50cy4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVNlcnZpY2UgaW1wbGVtZW50cyBJRGlhZ3JhbVNlcnZpY2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUSU5HX0RPTUlBTl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuRWRpdGluZ0RvbWFpbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRF9raW5kID0gRGlhZ3JhbU1hbmFnZXIuQURfa2luZDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfa2luZCA9IERpYWdyYW1NYW5hZ2VyLkFERF9raW5kOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdQRF9raW5kID0gRGlhZ3JhbU1hbmFnZXIuV1BEX2tpbmQ7CQotCQotCXN0YXRpYyBmaW5hbCBpbnRbXSBESUFHUkFNX1RZUEVTID0geyBBQ1RJVklUWV9ESUFHUkFNLCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNLCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTSB9OwotCQotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBESUFHUkFNX0tJTkRTID0gbmV3IFN0cmluZ1tde0FEX2tpbmQsIFdQRF9raW5kLCBBRERfa2luZH07Ci0KLQlwdWJsaWMgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOwotCQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByZWZlcmVuY2VzSGludCBESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQgPSBuZXcgUHJlZmVyZW5jZXNIaW50KAotCQkJSUQpOwotCQotCXByb3RlY3RlZCBzdGF0aWMgRGlhZ3JhbVNlcnZpY2UgaW5zdGFuY2UgPSBuZXcgRGlhZ3JhbVNlcnZpY2UoKTsKLQlwcm90ZWN0ZWQgTGlzdCBkaXNwYXRjaGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbVNlcnZpY2UoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbVNlcnZpY2UgZUluc3RhbmNlKCl7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQWRkcyBhIGRpc3BhdGNoZXJzIHRvIG1vbml0b3IgTGlicmFyeSBTZXJ2aWNlIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzcGF0Y2hlcnMKLQkgKiAgICAgICAgICAgIGEgZGlhZ3JhbSBzZXJ2aWNlIGRpc3BhdGNoZXJzCi0JICovCi0JcHVibGljIHZvaWQgYWRkRGlzcGF0Y2hlcnMoSVNhdmVFdmVudERpc3BhdGNoZXIgZGlzcGF0Y2hlcikgewotCQlkaXNwYXRjaGVycy5hZGQoZGlzcGF0Y2hlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGRpc3BhdGNoZXJzIHRoYXQgd2FzIGFkZGVkIHRvIG1vbml0b3IgTGlicmFyeSBTZXJ2aWNlIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzcGF0Y2hlcnMKLQkgKiAgICAgICAgICAgIGEgZGlhZ3JhbSBzZXJ2aWNlIGRpc3BhdGNoZXJzCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRGlzcGF0Y2hlcnMoSVNhdmVFdmVudERpc3BhdGNoZXIgZGlzcGF0Y2hlcikgewotCQlkaXNwYXRjaGVycy5yZW1vdmUoZGlzcGF0Y2hlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3BhdGNoKElTYXZlSW5mbyBpbmZvKXsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlzcGF0Y2hlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJU2F2ZUV2ZW50RGlzcGF0Y2hlciBlbGVtZW50ID0gKElTYXZlRXZlbnREaXNwYXRjaGVyKSBpdGVyLm5leHQoKTsKLQkJCWVsZW1lbnQudXBkYXRlVGltZVN0YW1wKGluZm8pOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTYXZlSW5mbyBnZXRTYXZlSW5mbyhPYmplY3Qgb2JqLCBsb25nIHRpbWVTdGFtcCl7Ci0JCQotCQlyZXR1cm4gbmV3IFNhdmVJbmZvKG9iaiwgdGltZVN0YW1wKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIFRyYW5zYWN0aW9uYWxEb21haW4gZm9yIGhhbmRsaW5nIHRoaW5ncyB3aXRoIHJlc291cmNlcy4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGNyZWF0ZUVkaXRpbmdEb21haW4oKSB7Ci0gICAgICAgIFN0cmluZyBlZGl0aW5nRG9tYWluSUQgPSBFRElUSU5HX0RPTUlBTl9JRDsKLSAgICAgICAgaWYgKGVkaXRpbmdEb21haW5JRCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4uUmVnaXN0cnkuSU5TVEFOQ0UKLSAgICAgICAgICAgICAgICAuZ2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluSUQpOwotICAgICAgICAgICAgaWYgKGVkaXRpbmdEb21haW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBlZGl0aW5nRG9tYWluOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBEaWFncmFtRWRpdGluZ0RvbWFpbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVFZGl0aW5nRG9tYWluKCk7Ci0gICAgfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBkaWFncmFtIGZvciBiYXNlIGFjdGl2aXR5LiBJZiBkaWFncmFtIGV4aXN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogQHJldHVybgotCSAqLwotCQotCXB1YmxpYyBEaWFncmFtIGdldERpYWdyYW0oQWN0aXZpdHkgYWN0aXZpdHksIFN0cmluZyBkaWFncmFtVHlwZSwgYm9vbGVhbiBjcmVhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IG51bGw7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IGNyZWF0ZUVkaXRpbmdEb21haW4oKTsKLQkJSUZpbGUgZmlsZSA9IERpYWdyYW1QZXJzaXN0ZXIuZ2V0RmlsZShEaWFncmFtRmlsZUNyZWF0b3JFeC5kZWZhdWx0X2RpYWdyYW1fZmlsZSwgYWN0aXZpdHksIERpYWdyYW1GaWxlQ3JlYXRvckV4LmdldEluc3RhbmNlKCkpOwotCQkKLQkJaWYoZmlsZSAhPSBudWxsKXsKLQkJCWlmKG1vbml0b3IgPT0gbnVsbCltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCXRyeXsKLQkJCQlkaWFncmFtID0gRGlhZ3JhbVBlcnNpc3Rlci5sb2FkKGRvbWFpbiwgZmlsZSwgdHJ1ZSwgIG1vbml0b3IsIGFjdGl2aXR5KTsKLQkJCQlpZihkaWFncmFtICE9IG51bGwpewotCQkJCQlyZXR1cm4gZGlhZ3JhbTsKLQkJCQl9Ci0JCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotCQkJCWlmKGRlYnVnKXsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBvY2N1cmVkIHdoaWxlIHJldHJpZXZpbmcgZGlhZ3JhbSBmb3IgIiArIGFjdGl2aXR5ICsgIjoiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZihjcmVhdGUpewotCQkJZGlhZ3JhbSA9IGNyZWF0ZURpYWdyYW0oYWN0aXZpdHksIGRpYWdyYW1UeXBlLCBmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBjb3B5IG9mIERpYWdyYW0uIEFsc28gY29waWVzIHRoZSByZWZlcmVuY2VzIGFuZCBhbHNvIGNvcGllcyB0aGUgdW1sT2JqZWN0LgotCSAqIEBwYXJhbSBzb3VyY2VEaWFncmFtCi0JICogQHBhcmFtIGFjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBjb3B5RGlhZ3JhbShEaWFncmFtIHNvdXJjZURpYWdyYW0sIEFjdGl2aXR5IGFjdCl7Ci0JCURpYWdyYW0gY29weSA9IGNvcHkoc291cmNlRGlhZ3JhbSk7Ci0JCUVPYmplY3QgdW1sQ29weSA9IGNvcHkuZ2V0RWxlbWVudCgpOwotCQlpZihhY3QgIT0gbnVsbCl7Ci0JCQlCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb24oKE5hbWVkRWxlbWVudCl1bWxDb3B5LCBhY3QpOwotCQl9Ci0JCWlmKGNvcHkgIT0gbnVsbCl7Ci0JCQlyZXR1cm4gY29weTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBEaWFncmFtIGNvcHkoRGlhZ3JhbSBzb3VyY2VPYmplY3QpewotCQlDb3BpZXIgY29waWVyID0gbmV3IENvcGllcigpIHsKLQkJCi0JCQkvKioKLQkJCSAqIAotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJcHJvdGVjdGVkIHZvaWQgY29weVJlZmVyZW5jZShFUmVmZXJlbmNlIGVSZWZlcmVuY2UsIEVPYmplY3QgZU9iamVjdCwKLQkJCQkJRU9iamVjdCBjb3B5RU9iamVjdCkgewotCQkJCWlmIChlT2JqZWN0LmVJc1NldChlUmVmZXJlbmNlKSkKLQkJCSAgICAgIHsKLQkJCSAgICAgICAgaWYgKGVSZWZlcmVuY2UuaXNNYW55KCkpCi0JCQkgICAgICAgIHsKLQkJCSAgICAgICAgICBJbnRlcm5hbEVMaXN0IHNvdXJjZSA9IChJbnRlcm5hbEVMaXN0KWVPYmplY3QuZUdldChlUmVmZXJlbmNlKTsKLQkJCSAgICAgICAgICBJbnRlcm5hbEVMaXN0IHRhcmdldCA9IChJbnRlcm5hbEVMaXN0KWNvcHlFT2JqZWN0LmVHZXQoZ2V0VGFyZ2V0KGVSZWZlcmVuY2UpKTsKLQkJCSAgICAgICAgICBpZiAoc291cmNlLmlzRW1wdHkoKSkKLQkJCSAgICAgICAgICB7Ci0JCQkgICAgICAgICAgICB0YXJnZXQuY2xlYXIoKTsKLQkJCSAgICAgICAgICB9Ci0JCQkgICAgICAgICAgZWxzZQotCQkJICAgICAgICAgIHsKLQkJCSAgICAgICAgICAgIGJvb2xlYW4gaXNCaWRpcmVjdGlvbmFsID0gZVJlZmVyZW5jZS5nZXRFT3Bwb3NpdGUoKSAhPSBudWxsOwotCQkJICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKLQkJCSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgayA9IHJlc29sdmVQcm94aWVzID8gc291cmNlLml0ZXJhdG9yKCkgOiBzb3VyY2UuYmFzaWNJdGVyYXRvcigpOyBrLmhhc05leHQoKTspCi0JCQkgICAgICAgICAgICB7Ci0JCQkgICAgICAgICAgICAgIE9iamVjdCByZWZlcmVuY2VkRU9iamVjdCA9IGsubmV4dCgpOwotCQkJICAgICAgICAgICAgICBPYmplY3QgY29weVJlZmVyZW5jZWRFT2JqZWN0ID0gZ2V0KHJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCSAgICAgICAgICAgICAgaWYgKGNvcHlSZWZlcmVuY2VkRU9iamVjdCA9PSBudWxsKQotCQkJICAgICAgICAgICAgICB7Ci0JCQkgICAgICAgICAgICAgICAgaWYgKCFpc0JpZGlyZWN0aW9uYWwpCi0JCQkgICAgICAgICAgICAgICAgewotCQkJICAgICAgICAgICAgICAgICAgdGFyZ2V0LmFkZFVuaXF1ZShpbmRleCwgcmVmZXJlbmNlZEVPYmplY3QpOwotCQkJICAgICAgICAgICAgICAgICAgKytpbmRleDsKLQkJCSAgICAgICAgICAgICAgICB9Ci0JCQkgICAgICAgICAgICAgIH0KLQkJCSAgICAgICAgICAgICAgZWxzZQotCQkJICAgICAgICAgICAgICB7Ci0JCQkgICAgICAgICAgICAgICAgaWYgKGlzQmlkaXJlY3Rpb25hbCkKLQkJCSAgICAgICAgICAgICAgICB7Ci0JCQkgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24gPSB0YXJnZXQuaW5kZXhPZihjb3B5UmVmZXJlbmNlZEVPYmplY3QpOwotCQkJICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09IC0xKQotCQkJICAgICAgICAgICAgICAgICAgewotCQkJICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYWRkVW5pcXVlKGluZGV4LCBjb3B5UmVmZXJlbmNlZEVPYmplY3QpOwotCQkJICAgICAgICAgICAgICAgICAgfQotCQkJICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5kZXggIT0gcG9zaXRpb24pCi0JCQkgICAgICAgICAgICAgICAgICB7Ci0JCQkgICAgICAgICAgICAgICAgICAgIHRhcmdldC5tb3ZlKGluZGV4LCBjb3B5UmVmZXJlbmNlZEVPYmplY3QpOwotCQkJICAgICAgICAgICAgICAgICAgfQotCQkJICAgICAgICAgICAgICAgIH0KLQkJCSAgICAgICAgICAgICAgICBlbHNlCi0JCQkgICAgICAgICAgICAgICAgewotCQkJICAgICAgICAgICAgICAgICAgdGFyZ2V0LmFkZFVuaXF1ZShpbmRleCwgY29weVJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCSAgICAgICAgICAgICAgICB9Ci0JCQkgICAgICAgICAgICAgICAgKytpbmRleDsKLQkJCSAgICAgICAgICAgICAgfQotCQkJICAgICAgICAgICAgfQotCQkJICAgICAgICAgIH0KLQkJCSAgICAgICAgfQotCQkJICAgICAgICBlbHNlCi0JCQkgICAgICAgIHsKLQkJCSAgICAgICAgICBPYmplY3QgcmVmZXJlbmNlZEVPYmplY3QgPSBlT2JqZWN0LmVHZXQoZVJlZmVyZW5jZSwgcmVzb2x2ZVByb3hpZXMpOwotCQkJICAgICAgICAgIGlmIChyZWZlcmVuY2VkRU9iamVjdCA9PSBudWxsKQotCQkJICAgICAgICAgIHsKLQkJCSAgICAgICAgICAgIGNvcHlFT2JqZWN0LmVTZXQoZ2V0VGFyZ2V0KGVSZWZlcmVuY2UpLCBudWxsKTsKLQkJCSAgICAgICAgICB9Ci0JCQkgICAgICAgICAgZWxzZQotCQkJICAgICAgICAgIHsKLQkJCSAgICAgICAgICAgIE9iamVjdCBjb3B5UmVmZXJlbmNlZEVPYmplY3QgPSBnZXQocmVmZXJlbmNlZEVPYmplY3QpOwotCQkJICAgICAgICAgICAgaWYgKGNvcHlSZWZlcmVuY2VkRU9iamVjdCA9PSBudWxsKQotCQkJICAgICAgICAgICAgewotCQkJICAgICAgICAgICAgICBpZiAoZVJlZmVyZW5jZS5nZXRFT3Bwb3NpdGUoKSA9PSBudWxsKQotCQkJICAgICAgICAgICAgICB7Ci0JCQkgICAgICAgICAgICAJICAvLyBNYWtlIGEgY29weSBvZiBBY3Rpdml0eSdzIGVsZW1lbnRzCi0JCQkgICAgICAgICAgICAJaWYocmVmZXJlbmNlZEVPYmplY3QgaW5zdGFuY2VvZiBOYW1lZEVsZW1lbnQpewotCQkJICAgICAgICAgICAgCQkvL2NvcHlSZWZlcmVuY2VkRU9iamVjdCA9IGNvcHkoKEVPYmplY3QpcmVmZXJlbmNlZEVPYmplY3QpOwotCQkJICAgICAgICAgICAgCQkvL2NvcHlFT2JqZWN0LmVTZXQoZ2V0VGFyZ2V0KGVSZWZlcmVuY2UpLCBjb3B5UmVmZXJlbmNlZEVPYmplY3QpOwotCQkJICAgICAgICAgICAgCQljb3B5RU9iamVjdC5lU2V0KGdldFRhcmdldChlUmVmZXJlbmNlKSwgY29weVJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCSAgICAgICAgICAgIAl9ZWxzZXsKLQkJCSAgICAgICAgICAgIAkJY29weUVPYmplY3QuZVNldChnZXRUYXJnZXQoZVJlZmVyZW5jZSksIHJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCSAgICAgICAgICAgIAl9Ci0JCQkgICAgICAgICAgICAJICAKLQkJCSAgICAgICAgICAgICAgfQotCQkJICAgICAgICAgICAgfQotCQkJICAgICAgICAgICAgZWxzZQotCQkJICAgICAgICAgICAgewotCQkJICAgICAgICAgICAgICBjb3B5RU9iamVjdC5lU2V0KGdldFRhcmdldChlUmVmZXJlbmNlKSwgY29weVJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCSAgICAgICAgICAgIH0KLQkJCSAgICAgICAgICB9Ci0JCQkgICAgICAgIH0KLQkJCSAgICAgIH0KLQkJCX0KLQkJCi0JCX07Ci0JCUVPYmplY3QgdW1sQ29weSA9IGNvcGllci5jb3B5KHNvdXJjZU9iamVjdC5nZXRFbGVtZW50KCkpOwotCQlEaWFncmFtIHJlc3VsdCA9IChEaWFncmFtKWNvcGllci5jb3B5KHNvdXJjZU9iamVjdCk7Ci0JCXJlc3VsdC5zZXRFbGVtZW50KHVtbENvcHkpOwotCQljb3BpZXIuY29weVJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQ29waWVzIHRoZSBkaWFncmFtIGZyb20gb25lIHJlc291cmNlcyB0byBhbm90aGVyLiBUaGlzIGlzIHVzZWZ1bCBpbiBjYXNlIG9mIAotCSAqIGRlZXAgY29weS4gRm9yIGNvcHkgb2YgaW5kaXZpZHVhbCBkaWFncmFtIGxvb2sgYXQgY29weURpYWdyYW0oRGlhZ3JhbSBzb3VyY2VEaWFncmFtLCBBY3Rpdml0eSBhY3QpCi0JICogQHBhcmFtIHNvdXJjZURpYWdyYW0KLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBjb3B5RGlhZ3JhbVJlc291cmNlKERpYWdyYW0gc291cmNlRGlhZ3JhbSwgSUZpbGUgZmlsZSkgewotCQlSZXNvdXJjZSBzb3VyY2VSZXMgPSBzb3VyY2VEaWFncmFtLmVSZXNvdXJjZSgpOwotCQlFTGlzdCBjb250ZW50cyA9IHNvdXJjZVJlcy5nZXRDb250ZW50cygpOwotCQkKLQkJaW50IGluZGV4T2ZEaWFncmFtID0gY29udGVudHMuaW5kZXhPZihzb3VyY2VEaWFncmFtKTsKLQkJZmluYWwgQ29sbGVjdGlvbiBjb3BpZWRDb250ZW50cyA9IEVjb3JlVXRpbC5jb3B5QWxsKGNvbnRlbnRzKTsKLQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oc291cmNlRGlhZ3JhbSk7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQlmaW5hbCBSZXNvdXJjZSBuZXdSZXNvdXJjZSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKQotICAgICAgICAgICAgLmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGVOYW1lLCB0cnVlKSk7Ci0gICAgICAgICAKLSAgICAgICAgTWFwIG9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBvcHRpb25zLnB1dChUcmFuc2FjdGlvbi5PUFRJT05fVU5QUk9URUNURUQsIEJvb2xlYW4uVFJVRSk7Ci0gCi0gICAgICAgIEFic3RyYWN0RU1GT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBBYnN0cmFjdEVNRk9wZXJhdGlvbigKLSAgICAgICAgICAgIGVkaXRpbmdEb21haW4sIFN0cmluZ1N0YXRpY3MuQkxBTkssCi0gICAgICAgICAgICBvcHRpb25zKSB7Ci0KLSAgICAgICAgICAgIHByb3RlY3RlZCBJU3RhdHVzIGRvRXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0gICAgICAgICAgICAgICAgICAgIElBZGFwdGFibGUgaW5mbykKLSAgICAgICAgICAgICAgICB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIG5ld1Jlc291cmNlLmdldENvbnRlbnRzKCkuYWRkQWxsKGNvcGllZENvbnRlbnRzKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3BlcmF0aW9uLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gCQotCQlyZXR1cm4gKERpYWdyYW0pbmV3UmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoaW5kZXhPZkRpYWdyYW0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBkaWFncmFtIGZvciBnaXZlbiB7QGxpbmsgQWN0aXZpdHl9IGFuZCBkaWFncmFtS2luZC4gCi0JICogSWYgQWN0aXZpdHkgaXMgZXh0ZW5kaW5nL2xvY2FsbHljb250cmlidXRpbmcsIGdldHMgYSBjb3B5IG9mIGJhc2UgZGlhZ3JhbS4KLQkgKiBlbHNlIGNyZWF0ZXMgYSBuZXcgZGlhZ3JhbSBmb3IgaXQuCi0JICogQHBhcmFtIGFjdAotCSAqIEBwYXJhbSBkaWFncmFtS2luZAotCSAqIEBwYXJhbSBzYXZlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBEaWFncmFtIGNyZWF0ZURpYWdyYW0oQWN0aXZpdHkgYWN0LCBTdHJpbmcgZGlhZ3JhbUtpbmQsIGJvb2xlYW4gc2F2ZSl7Ci0JCQotCQlpZihQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhhY3QpKXsKLQkJCURpYWdyYW0gYmFzZURpYWdyYW0gPSBnZXREaWFncmFtKChBY3Rpdml0eSlhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLAotCQkJCQlkaWFncmFtS2luZCwgZmFsc2UsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJaWYoYmFzZURpYWdyYW0gIT0gbnVsbCl7Ci0JCQkJRGlhZ3JhbSBjb3B5ID0gY29weURpYWdyYW0oYmFzZURpYWdyYW0sIGFjdCk7Ci0JCQkJaWYoY29weSAhPSBudWxsKXsKLQkJCQkJcmV0dXJuIGNvcHk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlEaWFncmFtIGRpYWdyYW0gPSBEaWFncmFtUGVyc2lzdGVyLmNyZWF0ZURpYWdyYW0oY3JlYXRlRWRpdGluZ0RvbWFpbigpLAotCQkJCWRpYWdyYW1LaW5kLCBhY3QsIGZhbHNlKTsKLQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJLy9wb3B1bGF0ZURpYWdyYW0oZGlhZ3JhbSwgYWN0LCBkaWFncmFtS2luZCk7Ci0JCQlyZXR1cm4gZGlhZ3JhbTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRGlhZ3JhbShEaWFncmFtIGRpYWdyYW0sIEFjdGl2aXR5IGFjdCwgU3RyaW5nIGRpYWdyYW1LaW5kKSB7Ci0JCS8vIGNyZWF0ZSBHcmFwaE5vZGUgZm9yIGVhY2ggQnJlYWtkb3duRWxlbWVudCBhbmQgYWRkIGl0IHRvIHRoZSBkaWFncmFtCi0JCS8vCi0JCUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmKGRpYWdyYW0gPT0gbnVsbCkgcmV0dXJuOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KWl0ZXIubmV4dCgpOwotCQkJbm9kZXMuYWRkKGNyZWF0ZU5vZGUoZGlhZ3JhbSwgKE1ldGhvZEVsZW1lbnQpZWxlbWVudCkpOwotCQl9Ci0KLQkJLy8gY3JlYXRlIEdyYXBoQ29ubmVjdG9ycyBmb3IgZWFjaCBCcmVha2Rvd25FbGVtZW50Ci0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJY3JlYXRlQ29ubmVjdG9ycyhub2RlLCBkaWFncmFtLCBkaWFncmFtS2luZCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbm5lY3RvcnMoTm9kZSBub2RlLCBEaWFncmFtIGRpYWdyYW0sCi0JCQlTdHJpbmcgZGlhZ3JhbUtpbmQpewotCQkvLyBJbiBjYXNlIG9mIEFjdGl2aXR5IGRpYWdyYW0KLQkJaWYgKGRpYWdyYW1LaW5kLmVxdWFscyhBRF9raW5kKSkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoKEFjdGl2aXR5Tm9kZSlub2RlLmdldEVsZW1lbnQoKSk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBlOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdC5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVdvcmtPcmRlciB3b3JrT3JkZXIgPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJTm9kZSBzcmNOb2RlID0gZmluZE5vZGUoZGlhZ3JhbSwgd29ya09yZGVyCi0JCQkJCQkJLmdldFByZWQoKSk7Ci0JCQkJCWlmIChzcmNOb2RlICE9IG51bGwpIHsKLQkJCQkJCWNyZWF0ZUVkZ2UoZGlhZ3JhbSwgc3JjTm9kZSwgbm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE5vZGUgZmluZE5vZGUoRGlhZ3JhbSBkaWFncmFtLCBPYmplY3QgbWV0aG9kRWxlbWVudCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlWaWV3IHZpZXcgPSAoVmlldykgaXRlci5uZXh0KCk7Ci0JCQlpZih2aWV3IGluc3RhbmNlb2YgTm9kZSl7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoKEFjdGl2aXR5Tm9kZSl2aWV3LmdldEVsZW1lbnQoKSk7Ci0JCQkJaWYobWV0aG9kRWxlbWVudC5lcXVhbHMoZSkpewotCQkJCQlyZXR1cm4gKE5vZGUpdmlldzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTm9kZSBmaW5kTm9kZShEaWFncmFtIGRpYWdyYW0sIE5hbWVkRWxlbWVudCB1bWxFbGVtZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVZpZXcgdmlldyA9IChWaWV3KSBpdGVyLm5leHQoKTsKLQkJCWlmKHZpZXcgaW5zdGFuY2VvZiBOb2RlKXsKLQkJCQlFT2JqZWN0IGUgPSB2aWV3LmdldEVsZW1lbnQoKTsKLQkJCQlpZih1bWxFbGVtZW50LmVxdWFscyhlKSl7Ci0JCQkJCXJldHVybiAoTm9kZSl2aWV3OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBFZGdlIGZpbmRFZGdlKERpYWdyYW0gZGlhZ3JhbSwgTm9kZSBzcmNOb2RlLCBOb2RlIHRhcmdldE5vZGUpIHsKLQkJLy8gVE9ETyA6IGltcGxlbWVudCB0aGlzLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVkZ2UgZmluZEVkZ2UoRGlhZ3JhbSBkaWFncmFtLCBNZXRob2RFbGVtZW50IHNyYywKLQkJCU1ldGhvZEVsZW1lbnQgdGFyZ2V0KSB7Ci0KLQkJLy8gVE9ETyA6IGltcGxlbWVudAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHVibGljIEVkZ2UgY3JlYXRlRWRnZShEaWFncmFtIGRpYWdyYW0sIE5vZGUgc3JjTm9kZSwKLQkJCU5vZGUgdGFyZ2V0Tm9kZSkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQlFUmVmZXJlbmNlIGNvbnRhaW5tZW50ID0gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfRWRnZSgpOwotCQlFT2JqZWN0IGVkZ2UgPSBFTUZDb3JlVXRpbC5jcmVhdGUoY29udGFpbmVyLCBjb250YWlubWVudCwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlFZGdlKCkpOwotCQkvL1RPRE86IHJlbW92ZSBDcmVhdGlvbiBub2RlLiBBZGRpbmcgTW9kZWwgd2lsbCBjcmVhdGUgVmlldy4KLQkJcmV0dXJuIFZpZXdTZXJ2aWNlLmNyZWF0ZUVkZ2Uoc3JjTm9kZSwgdGFyZ2V0Tm9kZSwgZWRnZSwgVmlld1R5cGUuRElBR1JBTV9MSU5LLCAKLQkJCQkJCURJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JfQotCQotCXB1YmxpYyBOb2RlIGNyZWF0ZU5vZGUoRGlhZ3JhbSBkaWFncmFtLCBNZXRob2RFbGVtZW50IGUgKXsKLQkJRU9iamVjdCBlbGVtZW50ID0gZTsKLQkJRU9iamVjdCB1bWxDbGFzcyA9IGdldEVsZW1lbnQoZWxlbWVudCk7Ci0JCUVPYmplY3QgdW1sT2JqZWN0ID0gVU1MRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlKChFQ2xhc3MpdW1sQ2xhc3MpOwotCQkKLQkJLy9UT0RPOiByZW1vdmUgQ3JlYXRpb24gbm9kZS4gQWRkaW5nIE1vZGVsIHdpbGwgY3JlYXRlIFZpZXcuCi0JCU5vZGUgbm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sT2JqZWN0LCAiIiwgCi0JCQkJRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uKChFTW9kZWxFbGVtZW50KW5vZGUuZ2V0RWxlbWVudCgpLGUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXREaWFncmFtVHlwZShEaWFncmFtIGRpYWdyYW0pIHsKLQkJU3RyaW5nIHR5cGVTdHIgPSBkaWFncmFtLmdldFR5cGUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBESUFHUkFNX0tJTkRTLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoRElBR1JBTV9LSU5EU1tpXS5lcXVhbHModHlwZVN0cikpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRDb21tYW5kTGlzdGVuZXJzKCl7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVmcmVzaEZyb21CYXNlKERpYWdyYW0gZGlhZ3JhbSwgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluKSB7Ci0JCQotCQljbGFzcyBSZWZyZXNoRnJvbUJhc2VPcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdEVNRk9wZXJhdGlvbnsKLQkJCQotCQkJcHJpdmF0ZSBEaWFncmFtIGRpYWdyYW07Ci0KLQkJCXB1YmxpYyBSZWZyZXNoRnJvbUJhc2VPcGVyYXRpb24oVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBEaWFncmFtIGRpYWdyYW0pIHsKLQkJCQlzdXBlcihkb21haW4sICJSZWZyZXNoIGZyb20gYmFzZSIpOwotCQkJCXRoaXMuZGlhZ3JhbSA9IGRpYWdyYW07Ci0JCQl9Ci0JCQkKLQkJCXByb3RlY3RlZCBJU3RhdHVzIGRvRXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJRU9iamVjdCB1bWxPYmplY3QgPSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJCQlpZih1bWxPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJCUFjdGl2aXR5IGFjdCA9ICAoQWN0aXZpdHkpQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnRGcm9tQW5ub3RhdGlvbigoRU1vZGVsRWxlbWVudCl1bWxPYmplY3QpOwotCQkJCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KWFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCWlmKGJhc2UgPT0gbnVsbCAKLQkJCQkJCQl8fCBhY3QuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UX0xJVEVSQUwgKXsKLQkJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJfQotCQkJCQkKLQkJCQkJaW50IHR5cGUgPSBEaWFncmFtU2VydmljZS5lSW5zdGFuY2UoKS5nZXREaWFncmFtVHlwZShkaWFncmFtKTsKLQkJCQkJRGlhZ3JhbSBiYXNlRGlhZ3JhbSA9IERpYWdyYW1TZXJ2aWNlLmVJbnN0YW5jZSgpLmdldERpYWdyYW0oYmFzZSwgZGlhZ3JhbS5nZXRUeXBlKCksIGZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJaWYoYmFzZURpYWdyYW0gPT0gbnVsbCkgcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCQkKLQkJCQkJTGlzdCBvbGROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJRGlhZ3JhbSBiYXNlQ29weSA9IGNvcHlEaWFncmFtKGJhc2VEaWFncmFtLCBiYXNlKTsKLQkJCQkJc3dpdGNoKHR5cGUpewotCQkJCQljYXNlIEFDVElWSVRZX0RJQUdSQU06ewotCQkJCQkJCi0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBiYXNlRGlhZ3JhbS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCU5vZGUgYmFzZU5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJdW1sT2JqZWN0ID0gYmFzZU5vZGUuZ2V0RWxlbWVudCgpOwotCQkJCQkJCWlmKHVtbE9iamVjdCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgfHwKLQkJCQkJCQkJCXVtbE9iamVjdCBpbnN0YW5jZW9mIE9iamVjdE5vZGUpewotCQkJCQkJCQlNZXRob2RFbGVtZW50IGUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudEZyb21Bbm5vdGF0aW9uKChBY3Rpdml0eU5vZGUpdW1sT2JqZWN0KTsKLQkJCQkJCQkJTm9kZSBub2RlID0gIGZpbmROb2RlKGRpYWdyYW0sIGUpOwotCQkJCQkJCQlpZihub2RlICE9bnVsbCl7Ci0JCQkJCQkJCQlvbGROb2Rlcy5hZGQobm9kZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9ZWxzZXsKLQkJCQkJCQkJTm9kZSBub2RlID0gZmluZE5vZGUoZGlhZ3JhbSwgdW1sT2JqZWN0KTsKLQkJCQkJCQkJaWYobm9kZSAhPSBudWxsKXsKLQkJCQkJCQkJCW9sZE5vZGVzLmFkZChub2RlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWRpYWdyYW0uZ2V0Q2hpbGRyZW4oKS5yZW1vdmVBbGwob2xkTm9kZXMpOwotCQkJCQkJCi0JCQkJCQkvL1RPRE86IGNoZWNrIHdoeSB0aGlzIAotLy8JCQkJCQkgcmVtb3ZlIHVudXNlZCBvbGQgVUkgbm9kZXMgJiYgbm9kZXMgb2YgY29udHJpYnV0b3IvcmVwbGFjZXIKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQkJCUVPYmplY3QgYnJpZGdlID0gbm9kZS5nZXRFbGVtZW50KCk7Ci0JCQkJCQkJaWYgKGJyaWRnZSBpbnN0YW5jZW9mIENvbnRyb2xOb2RlKXsKLQkJCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAoYnJpZGdlIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQkJCQkJCQlNZXRob2RFbGVtZW50IGUgPSBVbWFVbWxVdGlsLmdldFVtYUVsZW1lbnQoKE5hbWVkRWxlbWVudClicmlkZ2UpOwotCQkJCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJCQkJCQkmJiAoKEFjdGl2aXR5KSBlKQotCQkJCQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLS8vCQkJCQkJIHJlcGxhY2UgYXNzb2NpYXRlZCBiYXNlIGVsZW1lbnQgd2l0aCBjb250cmlidXRpbmcvcmVwbGFjaW5nCi0JCQkJCQkvLyBlbGVtZW50Ci0JCQkJCQkvLwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZUVsZW1lbnQgPSAoKEFjdGl2aXR5KSBlbGVtZW50KQotCQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCQkJCU5vZGUgbm9kZSA9IGZpbmROb2RlKGJhc2VDb3B5LCBiYXNlRWxlbWVudCk7Ci0JCQkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJCQkJCUVPYmplY3QgdW1sT2JqID0gbm9kZS5nZXRFbGVtZW50KCk7Ci0JCQkJCQkJCQlCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb24oKEVNb2RlbEVsZW1lbnQpdW1sT2JqLCAoTWV0aG9kRWxlbWVudCllbGVtZW50KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIGFkZCBuZXcgbm9kZXMKLQkJCQkJCS8vCi0JCQkJCQlkaWFncmFtLmdldENoaWxkcmVuKCkuYWRkQWxsKGJhc2VDb3B5LmdldENoaWxkcmVuKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJZGVmYXVsdDogewotCi0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBiYXNlRGlhZ3JhbS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlOb2RlIGJhc2VOb2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQkJCXVtbE9iamVjdCA9IGJhc2VOb2RlLmdldEVsZW1lbnQoKTsKLQkJCQkJCQlpZiAodW1sT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQkJCQkJCS8vIHRoaXMgaXMgYSBlbGVtZW50J3Mgbm9kZQotCQkJCQkJCQlNZXRob2RFbGVtZW50IGUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCgoQWN0aXZpdHlOb2RlKXVtbE9iamVjdCk7Ci0JCQkJCQkJCU5vZGUgbm9kZSA9IGZpbmROb2RlKGRpYWdyYW0sIGUpOwotCQkJCQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlvbGROb2Rlcy5hZGQobm9kZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIHJlbW92ZSBvbGQgbm9kZXMKLQkJCQkJCS8vCi0JCQkJCQlkaWFncmFtLmdldENoaWxkcmVuKCkucmVtb3ZlQWxsKG9sZE5vZGVzKTsKLQotCQkJCQkJLy8gYWRkIG5ldyBub2RlcwotCQkJCQkJLy8KLQkJCQkJCWRpYWdyYW0uZ2V0Q2hpbGRyZW4oKS5hZGRBbGwoYmFzZUNvcHkuZ2V0Q2hpbGRyZW4oKSk7Ci0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX0KLQkJdHJ5IHsKLQkJCVJlZnJlc2hGcm9tQmFzZU9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgUmVmcmVzaEZyb21CYXNlT3BlcmF0aW9uKGRvbWFpbiwgZGlhZ3JhbSk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IG9wZXJhdGlvbi5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCQkJaWYoc3RhdHVzLmlzT0soKSkgcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIDogdXNlIExvZwotCQkJU3lzdGVtLmVyci5wcmludGxuKCJFcnJvcjogUmVmcmVzaCBmcm9tIGJhc2UiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBlbGVtZW50czsKLQotCQotCS8qKgotCSAqIFJldHVybnMgJ3R5cGUnIG9mIHRoZSBlY29yZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBoaW50LgotCSAqIAotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRU5hbWVkRWxlbWVudCBnZXRFbGVtZW50KEVPYmplY3Qgb2JqZWN0KSB7Ci0JCUVDbGFzcyBlQ2xhc3MgPSBvYmplY3QuZUNsYXNzKCk7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQllbGVtZW50cyA9IG5ldyBJZGVudGl0eUhhc2hNYXAoKTsKLQkJCWVsZW1lbnRzLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpICwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSk7Ci0JCQllbGVtZW50cy5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0aW9uKCksIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBY3Rpdml0eVBhcmFtZXRlck5vZGUoKSk7Ci0JCX0KLQkJcmV0dXJuIChFTmFtZWRFbGVtZW50KSBlbGVtZW50cy5nZXQoZUNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wZXJzaXN0ZW5jZS9JRGlhZ3JhbVNlcnZpY2UuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BlcnNpc3RlbmNlL0lEaWFncmFtU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjc0ZWRjLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BlcnNpc3RlbmNlL0lEaWFncmFtU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEaWFncmFtU2VydmljZSB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfRElBR1JBTSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNID0gMjsKLQkKLQlwdWJsaWMgdm9pZCBkaXNwYXRjaChJU2F2ZUluZm8gaW5mbyk7Ci0JCi0JcHVibGljIFNhdmVJbmZvIGdldFNhdmVJbmZvKE9iamVjdCBvYmosIGxvbmcgdGltZVN0YW1wKTsKLQkKLQlwdWJsaWMgRGlhZ3JhbVNlcnZpY2UgZUluc3RhbmNlID0gRGlhZ3JhbVNlcnZpY2UuZUluc3RhbmNlKCk7Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wZXJzaXN0ZW5jZS9JU2F2ZUV2ZW50RGlzcGF0Y2hlci5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcGVyc2lzdGVuY2UvSVNhdmVFdmVudERpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhkNjEzYi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wZXJzaXN0ZW5jZS9JU2F2ZUV2ZW50RGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTYXZlRXZlbnREaXNwYXRjaGVyIHsKLQotCXB1YmxpYyB2b2lkIHVwZGF0ZVRpbWVTdGFtcChJU2F2ZUluZm8gaW5mbyk7Ci0JCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wZXJzaXN0ZW5jZS9JU2F2ZUluZm8uamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BlcnNpc3RlbmNlL0lTYXZlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzAyMGYyLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BlcnNpc3RlbmNlL0lTYXZlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTYXZlSW5mbyB7Ci0JCi0JcHVibGljIE9iamVjdCBnZXRTb3VyY2UoKTsKLQkKLQlwdWJsaWMgbG9uZyBnZXRUaW1lU3RhbXAoKTsKLQkKLQlwdWJsaWMgdm9pZCBzZXRUaW1lU3RhbXAobG9uZyB0aW1lU3RhbXApOwotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcGVyc2lzdGVuY2UvU2F2ZUV2ZW50RGlzcGF0Y2hlci5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcGVyc2lzdGVuY2UvU2F2ZUV2ZW50RGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2U2ZDJmLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BlcnNpc3RlbmNlL1NhdmVFdmVudERpc3BhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBlcnNpc3RlbmNlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIFNhdmVFdmVudERpc3BhdGNoZXIgaW1wbGVtZW50cyBJU2F2ZUV2ZW50RGlzcGF0Y2hlciB7Ci0KLQlwcml2YXRlIElTYXZlSW5mbyBpbmZvOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFNhdmVFdmVudERpc3BhdGNoZXIoKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2UuSVNhdmVFdmVudERpc3BhdGNoZXIjdXBkYXRlVGltZVN0YW1wKGphdmEubGFuZy5PYmplY3QsIGxvbmcpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlVGltZVN0YW1wKElTYXZlSW5mbyBpbmZvKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJdGhpcy5pbmZvID0gaW5mbzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwYXRjaCgpewotCQlEaWFncmFtU2VydmljZS5lSW5zdGFuY2UuZGlzcGF0Y2goaW5mbyk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcGVyc2lzdGVuY2UvU2F2ZUluZm8uamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BlcnNpc3RlbmNlL1NhdmVJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NWFhZmYuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcGVyc2lzdGVuY2UvU2F2ZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBlcnNpc3RlbmNlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIFNhdmVJbmZvIGltcGxlbWVudHMgSVNhdmVJbmZvIHsKLQotCQotCXByaXZhdGUgT2JqZWN0IHNvdXJjZTsKLQlwcml2YXRlIGxvbmcgdGltZVN0YW1wOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFNhdmVJbmZvKE9iamVjdCBzb3VyY2UsIGxvbmcgdGltZVN0YW1wKSB7Ci0JCXRoaXMuc291cmNlID0gc291cmNlOwotCQl0aGlzLnRpbWVTdGFtcCA9IHRpbWVTdGFtcDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wZXJzaXN0ZW5jZS5JU2F2ZUluZm8jZ2V0U291cmNlKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNvdXJjZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBlcnNpc3RlbmNlLklTYXZlSW5mbyNnZXRUaW1lU3RhbXAoKQotCSAqLwotCXB1YmxpYyBsb25nIGdldFRpbWVTdGFtcCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gdGltZVN0YW1wOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBlcnNpc3RlbmNlLklTYXZlSW5mbyNzZXRUaW1lU3RhbXAoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWVTdGFtcChsb25nIHRpbWVTdGFtcCkgewotCQl0aGlzLnRpbWVTdGFtcCA9IHRpbWVTdGFtcDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BvbGljaWVzL0FjdGl2aXR5Tm9kZVJlc2l6YWJsZUVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BvbGljaWVzL0FjdGl2aXR5Tm9kZVJlc2l6YWJsZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdhY2FhZS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wb2xpY2llcy9BY3Rpdml0eU5vZGVSZXNpemFibGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5IYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlU2hhcGVFZGl0UG9saWN5OwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5Tm9kZVJlc2l6YWJsZUVkaXRQb2xpY3kgZXh0ZW5kcyBSZXNpemFibGVTaGFwZUVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFjdGl2aXR5Tm9kZVJlc2l6YWJsZUVkaXRQb2xpY3koKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNvbW1hbmQoQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIHN1cGVyLmdldE1vdmVDb21tYW5kKHJlcXVlc3QpOwotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2VIYW5kbGVEcmFnRWRpdFBhcnRzVHJhY2tlcihIYW5kbGUgaGFuZGxlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIucmVwbGFjZUhhbmRsZURyYWdFZGl0UGFydHNUcmFja2VyKGhhbmRsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGlvbkVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uQ3JlYXRpb25FZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyY2JmY2EuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGlvbkVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQ3JlYXRpb25FZGl0UG9saWN5IGZvciBBY3Rpdml0eVBhcnRpdGlvbgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGlvbkVkaXRQb2xpY3kgZXh0ZW5kcyBDcmVhdGlvbkVkaXRQb2xpY3kgewotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5I2dldENyZWF0ZUNvbW1hbmQob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY2MgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoCi0JCQkJZWRpdGluZ0RvbWFpbiwgRGlhZ3JhbVVJTWVzc2FnZXMuQWRkQ29tbWFuZF9MYWJlbCk7Ci0KLQkJSXRlcmF0b3IgZGVzY3JpcHRvcnMgPSByZXF1ZXN0LmdldFZpZXdEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGRlc2NyaXB0b3JzLmhhc05leHQoKSkgewotCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcikgZGVzY3JpcHRvcnMKLQkJCQkJLm5leHQoKTsKLQkJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLS8vCQkJd2hpbGUoY29udGFpbmVyVmlldy5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbil7Ci0vLwkJCQljb250YWluZXJWaWV3ID0gKFZpZXcpY29udGFpbmVyVmlldy5lQ29udGFpbmVyKCk7Ci0vLwkJCX0KLQkJCUNyZWF0ZUNvbW1hbmQgY3JlYXRlQ29tbWFuZCA9IG5ldyBDcmVhdGVDb21tYW5kKGVkaXRpbmdEb21haW4sCi0JCQkJCWRlc2NyaXB0b3IsIGNvbnRhaW5lclZpZXcpOwotCi0JCQljYy5jb21wb3NlKGNyZWF0ZUNvbW1hbmQpOwotCQl9Ci0JcmV0dXJuIG5ldyBJQ29tbWFuZFByb3h5KGNjLnJlZHVjZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkRlbGVnYXRpb25FZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkRlbGVnYXRpb25FZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZmYwMzMuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25EZWxlZ2F0aW9uRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQWJzdHJhY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLQotLyoqCi0gKiBBY3Rpdml0eVBhcnRpdGlvbiBkZWxlZ2F0ZXMgdG8gaXRzIGNvbXBhcnRtZW50IGVkaXQgcG9saWN5Ci0gKiAgIAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25EZWxlZ2F0aW9uRWRpdFBvbGljeSBleHRlbmRzCi0gICAgICAgIEFic3RyYWN0RWRpdFBvbGljeSB7Ci0KLSAgICBwcml2YXRlIEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQ7Ci0gICAgcHJpdmF0ZSBFZGl0UG9saWN5IGNoaWxkRWRpdFBvbGljeTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjaGlsZFZpZXdJRDsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBlZGl0UG9saWN5SUQ7Ci0gICAgCi0gICAgCi0gICAgcHVibGljIEFjdGl2aXR5UGFydGl0aW9uRGVsZWdhdGlvbkVkaXRQb2xpY3koU3RyaW5nIGNoaWxkSWQsIFN0cmluZyBlZGl0UG9saWN5SWQpIHsKLSAgICAgICAgY2hpbGRWaWV3SUQgPSBjaGlsZElkOwotICAgICAgICBlZGl0UG9saWN5SUQgPSBlZGl0UG9saWN5SWQ7Ci0gICAgfQotICAgIAotCi0gICAvKioKLSAgICAqIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5BYnN0cmFjdEVkaXRQb2xpY3kjYWN0aXZhdGUoKQotICAgICovCi0gICAgcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0gICAgICAgIGNoaWxkRWRpdFBhcnQgPQotICAgICAgICAgICAgKChJR3JhcGhpY2FsRWRpdFBhcnQpZ2V0SG9zdCgpKS5nZXRDaGlsZEJ5U2VtYW50aWNIaW50KGNoaWxkVmlld0lEKTsKLSAgICAgICAgaWYgKGNoaWxkRWRpdFBhcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNoaWxkRWRpdFBvbGljeSA9IGNoaWxkRWRpdFBhcnQuZ2V0RWRpdFBvbGljeShlZGl0UG9saWN5SUQpOwotICAgICAgICBjaGlsZEVkaXRQb2xpY3kuc2V0SG9zdChjaGlsZEVkaXRQYXJ0KTsKLSAgICAgICAgY2hpbGRFZGl0UG9saWN5LmFjdGl2YXRlKCk7Ci0gICAgfQotCi0gIC8qKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5BYnN0cmFjdEVkaXRQb2xpY3kjZGVhY3RpdmF0ZSgpCi0gICAqLwotICAgIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0gICAgICAgIGlmIChjaGlsZEVkaXRQb2xpY3kgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNoaWxkRWRpdFBvbGljeS5kZWFjdGl2YXRlKCk7Ci0gICAgICAgIGNoaWxkRWRpdFBhcnQgPSBudWxsOwotICAgICAgICBjaGlsZEVkaXRQb2xpY3kgPSBudWxsOwotICAgIH0KLQotCi0gICAvKioKLSAgICAqIAotICAgICovCi0gICAgcHVibGljIHZvaWQgZXJhc2VTb3VyY2VGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgaWYgKGNoaWxkRWRpdFBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2hpbGRFZGl0UG9saWN5LmVyYXNlU291cmNlRmVlZGJhY2socmVxdWVzdCk7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQWJzdHJhY3RFZGl0UG9saWN5I2VyYXNlVGFyZ2V0RmVlZGJhY2sob3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3QpCi0gICAgICogQG1vZGlmaWVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXJhc2VUYXJnZXRGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgaWYgKGNoaWxkRWRpdFBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2hpbGRFZGl0UG9saWN5LmVyYXNlVGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQWJzdHJhY3RFZGl0UG9saWN5I2dldENvbW1hbmQob3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3QpCi0gICAgICogQG1vZGlmaWVkCi0gICAgICovCi0gICAgcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgaWYgKGNoaWxkRWRpdFBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hpbGRFZGl0UG9saWN5LmdldENvbW1hbmQocmVxdWVzdCk7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQWJzdHJhY3RFZGl0UG9saWN5I2dldFRhcmdldEVkaXRQYXJ0KG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0KQotICAgICAqIEBtb2RpZmllZAotICAgICAqLwotICAgIHB1YmxpYyBFZGl0UGFydCBnZXRUYXJnZXRFZGl0UGFydChSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgaWYgKGNoaWxkRWRpdFBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hpbGRFZGl0UG9saWN5LmdldFRhcmdldEVkaXRQYXJ0KHJlcXVlc3QpOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkFic3RyYWN0RWRpdFBvbGljeSNzaG93U291cmNlRmVlZGJhY2sob3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3QpCi0gICAgICogQG1vZGlmaWVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd1NvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBpZiAoY2hpbGRFZGl0UG9saWN5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjaGlsZEVkaXRQb2xpY3kuc2hvd1NvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkFic3RyYWN0RWRpdFBvbGljeSNzaG93VGFyZ2V0RmVlZGJhY2sob3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3QpCi0gICAgICogQG1vZGlmaWVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd1RhcmdldEZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBpZiAoY2hpbGRFZGl0UG9saWN5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjaGlsZEVkaXRQb2xpY3kuc2hvd1RhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkFic3RyYWN0RWRpdFBvbGljeSN1bmRlcnN0YW5kc1JlcXVlc3Qob3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3QpCi0gICAgICogQG1vZGlmaWVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxKSB7Ci0gICAgICAgIGlmIChjaGlsZEVkaXRQYXJ0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGFjdGl2YXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoaWxkRWRpdFBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoaWxkRWRpdFBvbGljeS51bmRlcnN0YW5kc1JlcXVlc3QocmVxKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25MYXlvdXRFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkxheW91dEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBhN2JhYi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkxheW91dEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZVNoYXBlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5YWUxheW91dEVkaXRQb2xpY3k7Ci0KLS8qKgotICogWFlMYXlvdXRQb2xpY3kgZm9yIEFjdGl2aXR5UGFydGl0aW9uIHRvIGhhbmRsZSB0aGUgbW92ZSBvZiBjaGlsZHJlbi4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHdyaXR0ZW4KLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uTGF5b3V0RWRpdFBvbGljeSBleHRlbmRzIFhZTGF5b3V0RWRpdFBvbGljeSB7Ci0KLQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJRWRpdFBvbGljeSByZXN1bHQgPSBzdXBlci5jcmVhdGVDaGlsZEVkaXRQb2xpY3koY2hpbGQpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgUmVzaXphYmxlU2hhcGVFZGl0UG9saWN5KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldE1vdmVDaGlsZHJlbkNvbW1hbmQocmVxdWVzdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcG9saWNpZXMvQWN0aXZpdHlYWUxheW91dEVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BvbGljaWVzL0FjdGl2aXR5WFlMYXlvdXRFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YzM0ODcuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcG9saWNpZXMvQWN0aXZpdHlYWUxheW91dEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnV0aWwuQUREaWFncmFtVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldEJvdW5kc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5YWUxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5WFlMYXlvdXRFZGl0UG9saWN5IGV4dGVuZHMgWFlMYXlvdXRFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVhZTGF5b3V0RWRpdFBvbGljeSgpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRQYXJ0IGNoaWxkLCBPYmplY3QgY29uc3RyYWludCkgewotCQlPYmplY3QgcGFyZW50ICA9IGNoaWxkLmdldFBhcmVudCgpOwotCQlpZiAoKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpICYmCi0JCQkoIGNoaWxkIGluc3RhbmNlb2YgU2hhcGVFZGl0UGFydCAmJiBjb25zdHJhaW50IGluc3RhbmNlb2YgUmVjdGFuZ2xlKSkgewotCQkJCQotCQkJUmVjdGFuZ2xlIHJlY3QgPSAoUmVjdGFuZ2xlKSBjb25zdHJhaW50OwotCQkJaW50IHggPSByZWN0LnggLSAoKEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpIHBhcmVudCkuZ2V0TG9jYXRpb24oKS54OwotCQkJaW50IHkgPSByZWN0LnkgLSAoKEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpIHBhcmVudCkuZ2V0TG9jYXRpb24oKS55OwotCQkJCi0JIAkJSUNvbW1hbmQgYm91bmRzQ29tbWFuZCA9IAotCSAJCQluZXcgU2V0Qm91bmRzQ29tbWFuZCgoKFNoYXBlRWRpdFBhcnQpIGNoaWxkKS5nZXRFZGl0aW5nRG9tYWluKCksCi0JIAkJCQlEaWFncmFtVUlNZXNzYWdlcy5TZXRMb2NhdGlvbkNvbW1hbmRfTGFiZWxfUmVzaXplLAotCSAJCQkJbmV3IEVPYmplY3RBZGFwdGVyKChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpKSwKLQkJCQkJbmV3IFBvaW50KHgsIHkpKTsgCi0JIAkJCi0JCQlyZXR1cm4gbmV3IElDb21tYW5kUHJveHkoYm91bmRzQ29tbWFuZCk7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5jcmVhdGVBZGRDb21tYW5kKGNoaWxkLCBjb25zdHJhaW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChyZXF1ZXN0KTsKLQl9Ci0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNoYW5nZUNvbnN0cmFpbnRDb21tYW5kKEVkaXRQYXJ0IGNoaWxkLAotCQkJT2JqZWN0IGNvbnN0cmFpbnQpIHsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNoYW5nZUNvbnN0cmFpbnRDb21tYW5kKGNoaWxkLCBjb25zdHJhaW50KTsKLQl9Ci0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNoYW5nZUNvbnN0cmFpbnRDb21tYW5kKAotCQkJQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0LCBFZGl0UGFydCBjaGlsZCwgT2JqZWN0IGNvbnN0cmFpbnQpIHsKLQkJQ29tbWFuZCBjbWQgPSBzdXBlci5jcmVhdGVDaGFuZ2VDb25zdHJhaW50Q29tbWFuZChyZXF1ZXN0LCBjaGlsZCwKLQkJCQljb25zdHJhaW50KTsKLQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCkgewotCQkJTGlzdCBsaXN0ID0gQUREaWFncmFtVXRpbAotCQkJCQkuZ2V0Tm9kZXNJblBhcnRpdGlvbigoQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCkgY2hpbGQpOwotCQkJaWYgKGxpc3QgIT0gbnVsbCAmJiAhbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlFZGl0UGFydCBlbGVtZW50ID0gKEVkaXRQYXJ0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTaGFwZU5vZGVFZGl0UGFydCkgewotCQkJCQkJQ2hhbmdlQm91bmRzUmVxdWVzdCByZXEgPSBuZXcgQ2hhbmdlQm91bmRzUmVxdWVzdCgKLQkJCQkJCQkJUkVRX1JFU0laRV9DSElMRFJFTik7Ci0JCQkJCQlyZXEuc2V0RWRpdFBhcnRzKGVsZW1lbnQpOwotCQkJCQkJcmVxLnNldE1vdmVEZWx0YShyZXF1ZXN0LmdldE1vdmVEZWx0YSgpKTsKLQkJCQkJCXJlcS5zZXRTaXplRGVsdGEocmVxdWVzdC5nZXRTaXplRGVsdGEoKSk7Ci0JCQkJCQlyZXEuc2V0TG9jYXRpb24ocmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCXJlcS5zZXRFeHRlbmRlZERhdGEocmVxdWVzdC5nZXRFeHRlbmRlZERhdGEoKSk7Ci0JCQkJCQlyZXEuc2V0UmVzaXplRGlyZWN0aW9uKHJlcXVlc3QuZ2V0UmVzaXplRGlyZWN0aW9uKCkpOwotCQkJCQkJY21kID0gY21kLmNoYWluKGVsZW1lbnQuZ2V0UGFyZW50KCkuZ2V0Q29tbWFuZChyZXEpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY21kOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcG9saWNpZXMvT3BlbkFEREVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BvbGljaWVzL09wZW5BRERFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MDFkYWEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcG9saWNpZXMvT3BlbkFEREVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuRGlhZ3JhbUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5FUEZEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLk9wZW5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIE1vdXNlIGRvdWJsZSBjbGljayBvbiBTdHJ1Y3R1cmVkQWN0aXZpdHlFZGl0UGFydCBzaG91bGQgb3BlbiBkaWFncmFtLiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIE9wZW5BRERFZGl0UG9saWN5IGV4dGVuZHMgT3BlbkVkaXRQb2xpY3kgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuT3BlbkVkaXRQb2xpY3kjZ2V0T3BlbkNvbW1hbmQob3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0T3BlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0ID0gZ2V0VGFyZ2V0RWRpdFBhcnQocmVxdWVzdCk7Ci0JCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCkgewotCQkJTm9kZSB2aWV3ID0gKE5vZGUpIHRhcmdldEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0KLQkJCURpYWdyYW1FZGl0UGFydCBkaWFncmFtRWRpdFBhcnQgPSAoRGlhZ3JhbUVkaXRQYXJ0KSB0YXJnZXRFZGl0UGFydAotCQkJCQkuZ2V0UGFyZW50KCk7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZGlhZ3JhbUVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQlEaWFncmFtQWRhcHRlciBkaWFncmFtQWRhcHRlciA9IEJyaWRnZUhlbHBlcgotCQkJCQkuZ2V0RGlhZ3JhbUFkYXB0ZXIoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCi0JCQlOb2RlQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyCi0JCQkJCS5nZXROb2RlQWRhcHRlcih2aWV3LmdldEVsZW1lbnQoKSk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBhZGFwdGVyLmdldFdyYXBwZXIoKTsKLQkJCQlpZiAoc2VsZWN0ZWRPYmplY3QgPT0gbnVsbCkgewotCQkJCQlzZWxlY3RlZE9iamVjdCA9IGFkYXB0ZXIuZ2V0RWxlbWVudCgpOwotCQkJCX0KLQkJCQlHcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKEdyYXBoaWNhbFZpZXdlcikgZGlhZ3JhbUVkaXRQYXJ0Ci0JCQkJCQkuZ2V0Vmlld2VyKCk7Ci0JCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJCURpYWdyYW1FZGl0RG9tYWluIGRvbWFpbiA9IChEaWFncmFtRWRpdERvbWFpbikgdmlld2VyCi0JCQkJCQkJLmdldEVkaXREb21haW4oKTsKLQkJCQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IGRvbWFpbi5nZXREaWFncmFtRWRpdG9yUGFydCgpOwotCQkJCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dCgKLQkJCQkJCQkJc2VsZWN0ZWRPYmplY3QsCi0JCQkJCQkJCWRpYWdyYW1BZGFwdGVyLmdldFN1cHByZXNzaW9uKCksCi0JCQkJCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKTsKLQkJCQkJCXRyeXsKLQkJCQkJCURpYWdyYW1FZGl0b3JVdGlsCi0JCQkJCQkJCS5vcGVuRGlhZ3JhbUVkaXRvcigKLQkJCQkJCQkJCQlwYXJ0LmdldFNpdGUoKS5nZXRQYWdlKCksCi0JCQkJCQkJCQkJaW5wdXQsCi0JCQkJCQkJCQkJRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQsCi0JCQkJCQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotCQkJCQkJCQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcG9saWNpZXMvVmlld0xhYmVsRGlyZWN0RWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcG9saWNpZXMvVmlld0xhYmVsRGlyZWN0RWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWVjNWYyLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3BvbGljaWVzL1ZpZXdMYWJlbERpcmVjdEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuY29tbWFuZHMuRWRpdE5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5pbnRlcm5hbC5wYXJ0cy5UZXh0Q2VsbEVkaXRvckV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk9iamVjdE5vZGU7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVmlld0xhYmVsRGlyZWN0RWRpdFBvbGljeSBleHRlbmRzIExhYmVsRGlyZWN0RWRpdFBvbGljeSB7Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREaXJlY3RFZGl0Q29tbWFuZChEaXJlY3RFZGl0UmVxdWVzdCBlZGl0KSB7Ci0JCUNvbW1hbmQgY29tbWFuZDsKLQkJY29tbWFuZCA9IHN1cGVyLmdldERpcmVjdEVkaXRDb21tYW5kKGVkaXQpOwotCi0JCS8vIHN0aXRjaCB0aGUgdW1hIGNvbW1hbmQgdG8gY2hhbmdlIHRoZSBuYW1lIG9uIHVtYSBzaWRlLgotCQlpZiAoY29tbWFuZCAhPSBudWxsKSB7Ci0JCQlpZiAoZWRpdC5nZXRDZWxsRWRpdG9yKCkgaW5zdGFuY2VvZiBUZXh0Q2VsbEVkaXRvckV4KQotCQkJCWlmICghKChUZXh0Q2VsbEVkaXRvckV4KSBlZGl0LmdldENlbGxFZGl0b3IoKSkKLQkJCQkJCS5oYXNWYWx1ZUNoYW5nZWQoKSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0KLQkJCVN0cmluZyBsYWJlbFRleHQgPSAoU3RyaW5nKSBlZGl0LmdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpOwotCi0JCQlJVGV4dEF3YXJlRWRpdFBhcnQgY29tcGFydG1lbnQgPSAoSVRleHRBd2FyZUVkaXRQYXJ0KSBnZXRIb3N0KCk7Ci0JCQlFT2JqZWN0IG1vZGVsID0gKEVPYmplY3QpIGNvbXBhcnRtZW50LmdldE1vZGVsKCk7Ci0JCQlFT2JqZWN0IHVtbE9iamVjdCA9IG51bGw7Ci0JCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJVmlldyB2aWV3ID0gKFZpZXcpIG1vZGVsOwotCQkJCXVtbE9iamVjdCA9IFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQodmlldyk7Ci0JCQkJaWYgKHVtbE9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJCQljb21tYW5kID0gY29tbWFuZC5jaGFpbihuZXcgRWRpdE5hbWVDb21tYW5kKAotCQkJCQkJCShBY3Rpdml0eU5vZGUpIHVtbE9iamVjdCwgbGFiZWxUZXh0KSk7Ci0JCQkJfQotCQkJCWlmICh1bWxPYmplY3QgaW5zdGFuY2VvZiBPYmplY3ROb2RlKSB7Ci0JCQkJCWNvbW1hbmQgPSBjb21tYW5kLmNoYWluKG5ldyBFZGl0TmFtZUNvbW1hbmQoCi0JCQkJCQkJKE9iamVjdE5vZGUpIHVtbE9iamVjdCwgbGFiZWxUZXh0KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3Byb3ZpZGVycy9EaWFncmFtRWRpdG9yRG9jdW1lbnRQcm92aWRlci5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcHJvdmlkZXJzL0RpYWdyYW1FZGl0b3JEb2N1bWVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwOWM1YzAuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvcHJvdmlkZXJzL0RpYWdyYW1FZGl0b3JEb2N1bWVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5tYW5pcHVsYXRpb24uQ29udGFpbmVyQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UuQWJzdHJhY3RFTUZPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS51dGlsLldvcmtzcGFjZVN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5JRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLkRpYWdyYW1taW5nUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBlcnNpc3RlbmNlLkRpYWdyYW1QZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2UuRGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2UuSVNhdmVFdmVudERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2UuSVNhdmVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBlcnNpc3RlbmNlLlNhdmVFdmVudERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2UuU2F2ZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UudXRpbC5VbWFVbWxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkRpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURpYWdyYW1Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZG9jdW1lbnQuRmlsZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnJlc291cmNlcy5HTUZSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdG9yYWdlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuTmFtZWRFbGVtZW50OwotCi0vKioKLSAqIFNwZWNpYWxpemVkIGRvY3VtZW50IHByb3ZpZGVyIGZvciBoYW5kbGUgY2hhbmdlcyBhbmQgbWFuaXB1bGF0ZSBkb2N1bWVudCBhc3NvY2lhdGVkIAotICogYW5kIHN5bmNocm9uaXplIHRoZSBvdGhlciBvcGVuZWQgZWRpdG9yJ3MgZG9jdW1lbnQgYW5kIGRvIG1lcmdlIGFueSBjb25mbGljdCBzeW5jaHJvbml6ZS4KLSAqIEFsc28gaGFuZGxlcyB0aGUgdGltZXN0YW1wIHN5bmNocm9uaXphdGlvbiBpZiB0aGUgbXVsdGlwbGUgZWRpdG9ycyBhcmUgc2hhcmluZyBzYW1lIHJlc291cmNlLgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRWRpdG9yRG9jdW1lbnRQcm92aWRlciBleHRlbmRzIEZpbGVEaWFncmFtRG9jdW1lbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUVkaXRvckRvY3VtZW50UHJvdmlkZXIoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZG9jdW1lbnQuRmlsZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyI3NldERvY3VtZW50Q29udGVudChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50LCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICogCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2V0RG9jdW1lbnRDb250ZW50KElEb2N1bWVudCBkb2N1bWVudCwKLQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpIHsKLQkJCURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSBkaWFncmFtRWxlbWVudCA9IChEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpIGVkaXRvcklucHV0OwotCi0JCQkoKElEaWFncmFtRG9jdW1lbnQpIGRvY3VtZW50KS5zZXRFZGl0aW5nRG9tYWluKGRpYWdyYW1FbGVtZW50Ci0JCQkJCS5nZXRFZGl0aW5nRG9tYWluKCkpOwotCQkJaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJCUlTdG9yYWdlIHN0b3JhZ2UgPSAoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KQotCQkJCQkJLmdldFN0b3JhZ2UoKTsKLQkJCQlzZXREb2N1bWVudENvbnRlbnRGcm9tU3RvcmFnZShkb2N1bWVudCwgc3RvcmFnZSwgZWRpdG9ySW5wdXQpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cERvY3VtZW50KE9iamVjdCBlbGVtZW50LCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc3VwZXIuc2V0dXBEb2N1bWVudChlbGVtZW50LCBkb2N1bWVudCk7Ci0JfQotCi0JLyoqCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBjdXN0b20KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudENvbnRlbnRGcm9tU3RvcmFnZShJRG9jdW1lbnQgZG9jdW1lbnQsCi0JCQlJU3RvcmFnZSBzdG9yYWdlLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGRvY3VtZW50LmdldENvbnRlbnQoKTsKLQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBkaWFncmFtLmVSZXNvdXJjZSgpOwotCQkJSUZpbGUgcmVzb3VyY2VGaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUocmVzb3VyY2UpOwotCQkJLy8gdW5sb2FkIGlmIHRoZSByZXNvdXJjZUZpbGUgYW5kIHN0b3JhZ2UgaXMgc2FtZS4KLQkJCS8vIGlmIG5vdCBzYW1lIHRocm93IGV4Y2VwdGlvbi4KLQkJCWlmIChyZXNvdXJjZUZpbGUgIT0gbnVsbCkgewotCQkJCWlmIChyZXNvdXJjZUZpbGUuZXF1YWxzKHN0b3JhZ2UpKSB7Ci0JCQkJCWRvY3VtZW50LnNldENvbnRlbnQobnVsbCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCQkJbmV3IFN0YXR1cygKLQkJCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJCQkiMSIsCi0JCQkJCQkJCQkxLAotCQkJCQkJCQkJRGlhZ3JhbW1pbmdSZXNvdXJjZXMuRmlsZURvY3VtZW50UHJvdmlkZXJfaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkLAotCQkJCQkJCQkJbnVsbCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlJRGlhZ3JhbURvY3VtZW50IGRpYWdyYW1Eb2N1bWVudCA9IChJRGlhZ3JhbURvY3VtZW50KSBkb2N1bWVudDsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluID0gZGlhZ3JhbURvY3VtZW50LmdldEVkaXRpbmdEb21haW4oKTsKLQotCQlkaWFncmFtID0gRGlhZ3JhbVBlcnNpc3Rlci5sb2FkKGRvbWFpbiwgc3RvcmFnZSwgdHJ1ZSwKLQkJCQlnZXRQcm9ncmVzc01vbml0b3IoKSwgZWRpdG9ySW5wdXQpOwotCQlkb2N1bWVudC5zZXRDb250ZW50KGRpYWdyYW0pOwotCQkvL3N1cGVyLnNldERvY3VtZW50Q29udGVudEZyb21TdG9yYWdlKGRvY3VtZW50LCBzdG9yYWdlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZG9jdW1lbnQuRmlsZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyI2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZChvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0KQotCSAqIEBjdXN0b20KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQoSUZpbGVFZGl0b3JJbnB1dCBmaWxlRWRpdG9ySW5wdXQpIHsKLQotCQlGaWxlSW5mbyBpbmZvPSAoRmlsZUluZm8pIGdldEVsZW1lbnRJbmZvKGZpbGVFZGl0b3JJbnB1dCk7Ci0JCWlmIChpbmZvID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSURvY3VtZW50IGRvY3VtZW50PSBjcmVhdGVFbXB0eURvY3VtZW50KCk7Ci0JCUlTdGF0dXMgc3RhdHVzPSBudWxsOwotCi0JCXRyeSB7Ci0KLQkJCXRyeSB7Ci0JCQkJcmVmcmVzaEZpbGUoZmlsZUVkaXRvcklucHV0LmdldEZpbGUoKSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIHgpIHsKLQkJCQloYW5kbGVDb3JlRXhjZXB0aW9uKHgsICJGaWxlIENoYW5nZWQgb3V0c2lkZSIpOwotCQkJfQotCi0JCQlzZXREb2N1bWVudENvbnRlbnQoZG9jdW1lbnQsIGZpbGVFZGl0b3JJbnB1dCk7Ci0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQlzdGF0dXM9IHguZ2V0U3RhdHVzKCk7Ci0JCX0KLQotCQlPYmplY3QgbmV3Q29udGVudD0gZG9jdW1lbnQuZ2V0Q29udGVudCgpOwotCi0JCWlmICggIW5ld0NvbnRlbnQuZXF1YWxzKGluZm8uZkRvY3VtZW50LmdldENvbnRlbnQoKSkpIHsKLQotCQkJLy8gc2V0IHRoZSBuZXcgY29udGVudCBhbmQgZmlyZSBjb250ZW50IHJlbGF0ZWQgZXZlbnRzCi0JCQlmaXJlRWxlbWVudENvbnRlbnRBYm91dFRvQmVSZXBsYWNlZChmaWxlRWRpdG9ySW5wdXQpOwotCi0JCQlyZW1vdmVVbmNoYW5nZWRFbGVtZW50TGlzdGVuZXJzKGZpbGVFZGl0b3JJbnB1dCwgaW5mbyk7Ci0KLQkJCWluZm8uZkRvY3VtZW50LnJlbW92ZURvY3VtZW50TGlzdGVuZXIoaW5mbyk7Ci0JCQlpbmZvLmZEb2N1bWVudC5zZXRDb250ZW50KG5ld0NvbnRlbnQpOwotCQkJaW5mby5mQ2FuQmVTYXZlZD0gZmFsc2U7Ci0JCQlpbmZvLmZNb2RpZmljYXRpb25TdGFtcD0gY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGVFZGl0b3JJbnB1dC5nZXRGaWxlKCkpOwotCQkJaW5mby5mU3RhdHVzPSBzdGF0dXM7Ci0KLQkJCWFkZFVuY2hhbmdlZEVsZW1lbnRMaXN0ZW5lcnMoZmlsZUVkaXRvcklucHV0LCBpbmZvKTsKLQotCQkJZmlyZUVsZW1lbnRDb250ZW50UmVwbGFjZWQoZmlsZUVkaXRvcklucHV0KTsKLQotCQl9IAotCX0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFbGVtZW50TW92ZWQoSUZpbGVFZGl0b3JJbnB1dCBmaWxlRWRpdG9ySW5wdXQsIElQYXRoIHBhdGgpIHsKLQkJc3VwZXIuaGFuZGxlRWxlbWVudE1vdmVkKGZpbGVFZGl0b3JJbnB1dCwgcGF0aCk7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5kb2N1bWVudC5GaWxlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIjY3JlYXRlSW5wdXRXaXRoRWRpdGluZ0RvbWFpbihvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQsIG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbikKLQkgKiBAY3VzdG9tCi0JICovCi0JcHVibGljIElFZGl0b3JJbnB1dCBjcmVhdGVJbnB1dFdpdGhFZGl0aW5nRG9tYWluKElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCwgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluKSB7Ci0JCWlmKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSl7Ci0JCQkoKElEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpZWRpdG9ySW5wdXQpLnNldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKGRvbWFpbik7Ci0JCQlyZXR1cm4gZWRpdG9ySW5wdXQ7Ci0JCX1lbHNlewotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUlucHV0V2l0aEVkaXRpbmdEb21haW4oZWRpdG9ySW5wdXQsIGRvbWFpbik7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0JICogQGN1c3RvbQotCSAqLwotCXB1YmxpYyBjbGFzcyBEaWFncmFtRmlsZUluZm9TeW5jIGV4dGVuZHMgRGlhZ3JhbUZpbGVJbmZvewotCi0JCUlTYXZlRXZlbnREaXNwYXRjaGVyIGRpc3BhdGNoZXI7Ci0JCUlGaWxlRWRpdG9ySW5wdXQgaW5wdXQ7Ci0JCXB1YmxpYyBib29sZWFuIHJlZnJlc2hlZEJ5U2hhcmVkID0gZmFsc2U7Ci0JCXB1YmxpYyBEaWFncmFtRmlsZUluZm9TeW5jKElEb2N1bWVudCBkb2N1bWVudCwgRmlsZVN5bmNocm9uaXplciBmaWxlU3luY2hyb25pemVyLCBEaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIsCi0JCQkJSUZpbGVFZGl0b3JJbnB1dCBpbnB1dCkgewotCQkJc3VwZXIoZG9jdW1lbnQsIGZpbGVTeW5jaHJvbml6ZXIsIGxpc3RlbmVyKTsKLQkJCWZpbmFsIElEb2N1bWVudCBpblVzZURvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCQlmaW5hbCBEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkgaW5wdXRQcm94eSA9KERpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSlpbnB1dDsKLQkJCWlmKGRpc3BhdGNoZXIgPT0gbnVsbCl7Ci0JCQkJZGlzcGF0Y2hlciA9IG5ldyBTYXZlRXZlbnREaXNwYXRjaGVyKCl7Ci0JCQkJCXB1YmxpYyB2b2lkIHVwZGF0ZVRpbWVTdGFtcChJU2F2ZUluZm8gaW5mbykgewotCQkJCQkJZk1vZGlmaWNhdGlvblN0YW1wID0gaW5mby5nZXRUaW1lU3RhbXAoKTsKLS8vCQkJCQkJT2JqZWN0IG9iamVjdCA9IGluZm8uZ2V0U291cmNlKCk7Ci0vLwkJCQkJCQotLy8JCQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBFbGVtZW50SW5mbyl7Ci0vLwkJCQkJCQkKLS8vCQkJCQkJCWlmKGluVXNlRG9jdW1lbnQuZXF1YWxzKCgoRWxlbWVudEluZm8pb2JqZWN0KS5mRG9jdW1lbnQpKXsKLS8vCQkJCQkJCQlyZXR1cm47Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQkJTWVyZ2VPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IE1lcmdlT3BlcmF0aW9uKGlucHV0UHJveHkuZ2V0RWRpdGluZ0RvbWFpbigpLAotLy8JCQkJCQkJCSJEb2N1bWVudCBNZXJnZSBPcGVyYXRpb24iLCAoRWxlbWVudEluZm8pb2JqZWN0LCBpblVzZURvY3VtZW50KTsKLS8vCQkJCQkJdHJ5ewotLy8JCQkJCQkJb3BlcmF0aW9uLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCApOwotLy8JCQkJCQl9Y2F0Y2goRXhlY3V0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbil7Ci0vLwkJCQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0JCQkJaWYoZGlzcGF0Y2hlciAhPSBudWxsKXsKLQkJCQkJRGlhZ3JhbVNlcnZpY2UuZUluc3RhbmNlKCkuYWRkRGlzcGF0Y2hlcnMoZGlzcGF0Y2hlcik7Ci0JCQkJfQotCQkJfQotCQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCQkJCi0JCX0KLQkJcHVibGljIHZvaWQgdXBkYXRlVGltZVN0YW1wKCl7Ci0JCQlsb25nIHRpbWVzdGFtcCA9IGdldE1vZGlmaWNhdGlvblN0YW1wKGlucHV0KTsKLQkJCVNhdmVJbmZvIGluZm8gPSBEaWFncmFtU2VydmljZS5lSW5zdGFuY2UoKS5nZXRTYXZlSW5mbyh0aGlzLCB0aW1lc3RhbXApOwotCQkJcmVmcmVzaGVkQnlTaGFyZWQgPSB0cnVlOwotCQkJRGlhZ3JhbVNlcnZpY2UuZUluc3RhbmNlKCkuZGlzcGF0Y2goaW5mbyk7Ci0JCQlyZWZyZXNoZWRCeVNoYXJlZCA9IGZhbHNlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHVwZGF0ZVRpbWVTdGFtcChJRmlsZSBmaWxlKXsKLQkJCWxvbmcgdGltZXN0YW1wID0gY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGUpOwotCQkJU2F2ZUluZm8gaW5mbyA9IERpYWdyYW1TZXJ2aWNlLmVJbnN0YW5jZSgpLmdldFNhdmVJbmZvKHRoaXMsIHRpbWVzdGFtcCk7Ci0JCQlEaWFncmFtU2VydmljZS5lSW5zdGFuY2UoKS5kaXNwYXRjaChpbmZvKTsKLQkJfQotCi0JCQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlRGlzcGF0Y2hlcigpewotCQkJaWYoZGlzcGF0Y2hlciAhPW51bGwpCi0JCQkJRGlhZ3JhbVNlcnZpY2UuZUluc3RhbmNlKCkucmVtb3ZlRGlzcGF0Y2hlcnMoZGlzcGF0Y2hlcik7Ci0JCX0KLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmRvY3VtZW50LkZpbGVEaWFncmFtRG9jdW1lbnRQcm92aWRlciNkb1NhdmVEb2N1bWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudCwgYm9vbGVhbikKLQkgKiBAY3VzdG9tCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlRG9jdW1lbnQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPYmplY3QgZWxlbWVudCwgSURvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQotCQkJSUZpbGVFZGl0b3JJbnB1dCBpbnB1dD0gKElGaWxlRWRpdG9ySW5wdXQpIGVsZW1lbnQ7Ci0JCQlGaWxlSW5mbyBpbmZvPSAoRmlsZUluZm8pIGdldEVsZW1lbnRJbmZvKGVsZW1lbnQpOwotCQkJSUZpbGUgZmlsZT0gaW5wdXQuZ2V0RmlsZSgpOwotCi0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCi0JCQkJaWYgKGluZm8gIT0gbnVsbCAmJiAhb3ZlcndyaXRlKQotCQkJCQljaGVja1N5bmNocm9uaXphdGlvblN0YXRlKGluZm8uZk1vZGlmaWNhdGlvblN0YW1wLCBmaWxlKTsKLQotCQkJCS8vIGluZm9ybSBhYm91dCB0aGUgdXBjb21pbmcgY29udGVudCBjaGFuZ2UKLQkJCQlmaXJlRWxlbWVudFN0YXRlQ2hhbmdpbmcoZWxlbWVudCk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUaW1lIHRpbWVzdGFtcCBiZWZvcmUgc2F2aW5nOiAiICsgY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGUpKTsKLQkJCQkJc2F2ZURvY3VtZW50VG9GaWxlKGRvY3VtZW50LCBmaWxlLCBvdmVyd3JpdGUsIG1vbml0b3IpOwotCQkJCQkvLyBEaXNwYXRjaCB0aGUgc2F2ZSBldmVudC4KLQkJCQkJaWYoaW5mbyBpbnN0YW5jZW9mIERpYWdyYW1GaWxlSW5mb1N5bmMpewotCQkJCQkJKChEaWFncmFtRmlsZUluZm9TeW5jKWluZm8pLnVwZGF0ZVRpbWVTdGFtcCgpOwotCQkJCQl9Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGltZSB0aW1lc3RhbXAgYWZ0ZXIgc2F2aW5nOiAiICsgY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGUpKTsKLQkJCQkJCi0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQkJCS8vIGluZm9ybSBhYm91dCBmYWlsdXJlCi0JCQkJCWZpcmVFbGVtZW50U3RhdGVDaGFuZ2VGYWlsZWQoZWxlbWVudCk7Ci0JCQkJCXRocm93IHg7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB4KSB7Ci0JCQkJCS8vIGluZm9ybSBhYm91dCBmYWlsdXJlCi0JCQkJCWZpcmVFbGVtZW50U3RhdGVDaGFuZ2VGYWlsZWQoZWxlbWVudCk7Ci0JCQkJCXRocm93IHg7Ci0JCQkJfQotCi0JCQkJLy8gSWYgaGVyZSwgdGhlIGVkaXRvciBzdGF0ZSB3aWxsIGJlIGZsaXBwZWQgdG8gIm5vdCBkaXJ0eSIuCi0JCQkJLy8gVGh1cywgdGhlIHN0YXRlIGNoYW5naW5nIGZsYWcgd2lsbCBiZSByZXNldC4KLQotCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJaW5mby5mTW9kaWZpY2F0aW9uU3RhbXA9IGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChmaWxlKTsKLQkJCQl9Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5iZWdpblRhc2soRGlhZ3JhbW1pbmdSZXNvdXJjZXMuRmlsZURvY3VtZW50UHJvdmlkZXJfdGFza19zYXZpbmcsIDMwMDApOwotCQkJCQlDb250YWluZXJDcmVhdG9yIGNyZWF0b3IgPSBuZXcgQ29udGFpbmVyQ3JlYXRvcihmaWxlLmdldFdvcmtzcGFjZSgpLCBmaWxlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkpOwotCQkJCQljcmVhdG9yLmNyZWF0ZUNvbnRhaW5lcihuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwMDApKTsKLQkJCQkJZmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCIiLmdldEJ5dGVzKCkpLCBmYWxzZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMDAwKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc2F2ZURvY3VtZW50VG9GaWxlKGRvY3VtZW50LCBmaWxlLCBvdmVyd3JpdGUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwMCkpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuZG9TYXZlRG9jdW1lbnQobW9uaXRvciwgZWxlbWVudCwgZG9jdW1lbnQsIG92ZXJ3cml0ZSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmRvY3VtZW50LkZpbGVEaWFncmFtRG9jdW1lbnRQcm92aWRlciNkaXNwb3NlRWxlbWVudEluZm8oamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkFic3RyYWN0RG9jdW1lbnRQcm92aWRlci5FbGVtZW50SW5mbykKLQkgKiBAY3VzdG9tCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50LCBFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCWlmKGluZm8gaW5zdGFuY2VvZiBEaWFncmFtRmlsZUluZm9TeW5jKXsKLQkJCSgoRGlhZ3JhbUZpbGVJbmZvU3luYylpbmZvKS5kaXNwb3NlRGlzcGF0Y2hlcigpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2VFbGVtZW50SW5mbyhlbGVtZW50LCBpbmZvKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0b3IuQWJzdHJhY3REb2N1bWVudFByb3ZpZGVyI2NyZWF0ZUVsZW1lbnRJbmZvKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnRJbmZvIGNyZWF0ZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCi0JCQlJRmlsZUVkaXRvcklucHV0IGlucHV0PSAoSUZpbGVFZGl0b3JJbnB1dCkgZWxlbWVudDsKLQotCQkJdHJ5IHsKLQkJCQlyZWZyZXNoRmlsZShpbnB1dC5nZXRGaWxlKCkpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQkJaGFuZGxlQ29yZUV4Y2VwdGlvbih4LCBEaWFncmFtbWluZ1Jlc291cmNlcy5GaWxlRG9jdW1lbnRQcm92aWRlcl9jcmVhdGVFbGVtZW50SW5mbyk7Ci0JCQl9Ci0KLQkJCUlEb2N1bWVudCBkPSBudWxsOwotCQkJSVN0YXR1cyBzPSBudWxsOwotCi0JCQl0cnkgewotCQkJCWQ9IGNyZWF0ZURvY3VtZW50KGVsZW1lbnQpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQkJaGFuZGxlQ29yZUV4Y2VwdGlvbih4LCBEaWFncmFtbWluZ1Jlc291cmNlcy5GaWxlRG9jdW1lbnRQcm92aWRlcl9jcmVhdGVFbGVtZW50SW5mbyk7Ci0JCQkJcz0geC5nZXRTdGF0dXMoKTsKLQkJCQlkPSBjcmVhdGVFbXB0eURvY3VtZW50KCk7Ci0JCQl9Ci0JCQkKLQkJCURpYWdyYW1GaWxlU3luY2hyb25pemVyIGY9IG5ldyBEaWFncmFtRmlsZVN5bmNocm9uaXplcihpbnB1dCk7Ci0JCQlmLmluc3RhbGwoKTsKLQotCQkJRmlsZUluZm8gaW5mbz0gY3JlYXRlRmlsZUluZm8oZCwgZiwgaW5wdXQpOwotCQkJaW5mby5mTW9kaWZpY2F0aW9uU3RhbXA9IGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChpbnB1dC5nZXRGaWxlKCkpOwotCQkJaW5mby5mU3RhdHVzPSBzOwotCi0JCQlyZXR1cm4gaW5mbzsKLQkJfQotCi0JCXJldHVybiBzdXBlci5jcmVhdGVFbGVtZW50SW5mbyhlbGVtZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogRG9lcyBtZXJnZSBvcGVyYXRpb24gb2YgdGhlIHJlc291cmNlIGlmIHJlc291cmNlIGNvbnRlbnRzIGFyZSBzYXZlZCBieSBzaGFyZWQKLQkgKiBJRG9jdW1lbnQuIAotCSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotCSAqLwotCXB1YmxpYyBjbGFzcyBNZXJnZU9wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0RU1GT3BlcmF0aW9uewotCi0JCXByaXZhdGUgRWxlbWVudEluZm8gZWxlbWVudEluZm87Ci0JCXByaXZhdGUgSURvY3VtZW50IHRvTWVyZ2VEb2N1bWVudDsKLQotCQlwdWJsaWMgTWVyZ2VPcGVyYXRpb24oVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBTdHJpbmcgbGFiZWwsCi0JCQkJRWxlbWVudEluZm8gZWxlbWVudEluZm8sIElEb2N1bWVudCB0b01lcmdlRG9jdW1lbnQpIHsKLQkJCXN1cGVyKGRvbWFpbiwgbGFiZWwpOwotCQkJdGhpcy5lbGVtZW50SW5mbyA9IGVsZW1lbnRJbmZvOwotCQkJdGhpcy50b01lcmdlRG9jdW1lbnQgPSB0b01lcmdlRG9jdW1lbnQ7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJdHJ5ewotCQkJaWYoZWxlbWVudEluZm8gaW5zdGFuY2VvZiBFbGVtZW50SW5mbyl7Ci0JCQkJSURvY3VtZW50IHNhdmVkRG9jdW1lbnQgPSAoKEVsZW1lbnRJbmZvKWVsZW1lbnRJbmZvKS5mRG9jdW1lbnQ7Ci0JCQkJRGlhZ3JhbSBzYXZlZGRpYWdyYW0gID0gKERpYWdyYW0pc2F2ZWREb2N1bWVudC5nZXRDb250ZW50KCk7Ci0JCQkJaWYoc2F2ZWRkaWFncmFtICE9IG51bGwpewotCQkJCQlEaWFncmFtIGluVXNlRGlhZ3JhbSA9IChEaWFncmFtKXRvTWVyZ2VEb2N1bWVudC5nZXRDb250ZW50KCk7Ci0JCQkJCUdNRlJlc291cmNlIGdtZlJlc291cmNlID0gKEdNRlJlc291cmNlKWluVXNlRGlhZ3JhbS5lUmVzb3VyY2UoKTsKLQkJCQkJRUxpc3QgbGlzdCA9IGdtZlJlc291cmNlLmdldENvbnRlbnRzKCk7Ci0KLQkJCQkJU3RyaW5nIGd1aWQgPSBVbWFVbWxVdGlsLmdldFVtYUd1aWRGcm9tVW1sRWxlbWVudCgoTmFtZWRFbGVtZW50KXNhdmVkZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCQlEaWFncmFtIHJlcGxhY2luZ0RpYWdyYW0gPSBudWxsOwotCQkJCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCQkJCVN0cmluZyBjdXJyZW50Z3VpZCA9IFVtYVVtbFV0aWwuZ2V0VW1hR3VpZEZyb21VbWxFbGVtZW50KChOYW1lZEVsZW1lbnQpZWxlbWVudCk7Ci0JCQkJCQkJaWYoY3VycmVudGd1aWQuZXF1YWxzKGd1aWQpKXsKLQkJCQkJCQkJbmV3TGlzdC5hZGQoc2F2ZWRkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCW5ld0xpc3QuYWRkKGVsZW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKXsKLQkJCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSllbGVtZW50OwotCQkJCQkJCUVPYmplY3Qgb2JqZWN0ID0gKChEaWFncmFtKWVsZW1lbnQpLmdldEVsZW1lbnQoKTsKLQkJCQkJCQlTdHJpbmcgckd1aWQgPSBVbWFVbWxVdGlsLmdldFVtYUd1aWRGcm9tVW1sRWxlbWVudCgoTmFtZWRFbGVtZW50KW9iamVjdCk7Ci0JCQkJCQkJaWYoZ3VpZC5lcXVhbHMockd1aWQpKXsKLQkJCQkJCQkJcmVwbGFjaW5nRGlhZ3JhbSA9IGRpYWdyYW07Ci0JCQkJCQkJCW5ld0xpc3QuYWRkKHNhdmVkZGlhZ3JhbSk7Ci0JCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCW5ld0xpc3QuYWRkKGVsZW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYocmVwbGFjaW5nRGlhZ3JhbSA9PSBudWxsKXsKLQkJCQkJCW5ld0xpc3QuYWRkKHNhdmVkZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCQkJbmV3TGlzdC5hZGQoc2F2ZWRkaWFncmFtKTsKLQkJCQkJfQotCQkJCQkvL1RyYW5zYWN0aW9uIHR4ID0gY3JlYXRlIAotCQkJCQkvLyBUT0RPIGhhbmRsZSBiZXR0ZXIgd2F5IHRvIG1lcmdlIHRoZSBlbGVtZW50cy4KLQkJCQkJaWYoIW5ld0xpc3QuaXNFbXB0eSgpKXsKLQkJCQkJCWJvb2xlYW4gbm90aWZpY2F0aW9uID0gZ21mUmVzb3VyY2UuZURlbGl2ZXIoKTsKLQkJCQkJCWdtZlJlc291cmNlLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQkJCWdtZlJlc291cmNlLmdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQkJCWdtZlJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkQWxsKG5ld0xpc3QpOwotCQkJCQkJZ21mUmVzb3VyY2UuZVNldERlbGl2ZXIobm90aWZpY2F0aW9uKTsKLQkJCQkJCS8vbGlzdC5hZGRBbGwobmV3TGlzdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZzogRG9jdW1lbnQgbWVyZ2UgZmFpbGVkIGR1ZSB0byAiKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0JCi0JICAgCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyB0aGUgc2F2aW5nIG9mIHRoZSBkaWFncmFtIHRvIGEgZmlsZQotICAgICAqIAotICAgICAqIEBwYXJhbSBkb21haW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB3ZSBhcmUgc2F2aW5nIGluCi0gICAgICogQHBhcmFtIGZpbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBJRmlsZSB0byBzYXZlIHRvCi0gICAgICogQHBhcmFtIGRpYWdyYW0KLSAgICAgKiAgICAgICAgICAgIERpYWdyYW0gdGhhdCB3aWxsIGJlIHNhdmVkCi0gICAgICogQHBhcmFtIG9wdGlvbnMKLSAgICAgKiAgICAgICAgICAgIHNhdmUgb3B0aW9ucyBvciBudWxsCi0gICAgICogQHBhcmFtIG1vbml0b3IKLSAgICAgKiAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NhdmUoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBJRmlsZSBmaWxlLAotICAgICAgICAgICAgRGlhZ3JhbSBkaWFncmFtLCBNYXAgb3B0aW9ucywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKLSAgICAgICAgICAgIERpYWdyYW1QZXJzaXN0ZXIuc2F2ZShkb21haW4sIGZpbGUsIGRpYWdyYW0sIERpYWdyYW1QZXJzaXN0ZXIKLSAgICAgICAgICAgICAgICAuaGFzVW5yZWNvZ25pemVkRGF0YShkaWFncmFtLmVSZXNvdXJjZSgpKSwgbW9uaXRvcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlEaWFncmFtUGVyc2lzdGVyLnNhdmUoZG9tYWluLCBmaWxlLCBkaWFncmFtLCBtb25pdG9yLCBvcHRpb25zKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLQkgKiBTeW5jaHJvbml6ZXMgdGhlIGRvY3VtZW50IHdpdGggZXh0ZXJuYWwgcmVzb3VyY2UgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgRGlhZ3JhbUZpbGVTeW5jaHJvbml6ZXIgZXh0ZW5kcyBGaWxlU3luY2hyb25pemVyIHsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBmaWxlIHN5bmNocm9uaXplci4gSXMgbm90IHlldCBpbnN0YWxsZWQgb24gYSByZXNvdXJjZS4KLQkJICoKLQkJICogQHBhcmFtIGZpbGVFZGl0b3JJbnB1dCB0aGUgZWRpdG9yIGlucHV0IHRvIGJlIHN5bmNocm9uaXplZAotCQkgKi8KLQkJcHVibGljIERpYWdyYW1GaWxlU3luY2hyb25pemVyKElGaWxlRWRpdG9ySW5wdXQgZmlsZUVkaXRvcklucHV0KSB7Ci0JCQlzdXBlcihmaWxlRWRpdG9ySW5wdXQpOwotCQl9Ci0JCS8qCi0JCSAqIEBzZWUgSVJlc291cmNlRGVsdGFWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCWlmIChkZWx0YSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJZGVsdGE9IGRlbHRhLmZpbmRNZW1iZXIoZ2V0RmlsZSgpLmdldEZ1bGxQYXRoKCkpOwotCi0JCQlpZiAoZGVsdGEgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlPSBudWxsOwotCi0JCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRDoKLQkJCQkJRGlhZ3JhbUZpbGVJbmZvU3luYyBpbmZvPSAoRGlhZ3JhbUZpbGVJbmZvU3luYykgZ2V0RWxlbWVudEluZm8oZkZpbGVFZGl0b3JJbnB1dCk7Ci0JCQkJCWlmIChpbmZvID09IG51bGwgfHwgaW5mby5mQ2FuQmVTYXZlZCkKLQkJCQkJCWJyZWFrOwotCi0JCQkJCWJvb2xlYW4gaXNTeW5jaHJvbml6ZWQ9IGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChnZXRGaWxlKCkpID09IGluZm8uZk1vZGlmaWNhdGlvblN0YW1wOwotCQkJCQlpZiAoKChJUmVzb3VyY2VEZWx0YS5FTkNPRElORyAmIGRlbHRhLmdldEZsYWdzKCkpICE9IDAgJiYgaXNTeW5jaHJvbml6ZWQpIHx8ICgoSVJlc291cmNlRGVsdGEuQ09OVEVOVCAmIGRlbHRhLmdldEZsYWdzKCkpICE9IDAgJiYgIWlzU3luY2hyb25pemVkKQotCQkJCQkJCXx8IGluZm8ucmVmcmVzaGVkQnlTaGFyZWQpIHsKLQkJCQkJCXJ1bm5hYmxlID0gbmV3IFNhZmVDaGFuZ2UoZkZpbGVFZGl0b3JJbnB1dCkgewotCQkJCQkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSUZpbGVFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQkJCS8vaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkKGlucHV0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9OwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEOgotCQkJCQlpZiAoKElSZXNvdXJjZURlbHRhLk1PVkVEX1RPICYgZGVsdGEuZ2V0RmxhZ3MoKSkgIT0gMCkgewotCQkJCQkJZmluYWwgSVBhdGggcGF0aD0gZGVsdGEuZ2V0TW92ZWRUb1BhdGgoKTsKLQkJCQkJCXJ1bm5hYmxlPSBuZXcgU2FmZUNoYW5nZShmRmlsZUVkaXRvcklucHV0KSB7Ci0JCQkJCQkJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJRmlsZUVkaXRvcklucHV0IGlucHV0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJCQkJaGFuZGxlRWxlbWVudE1vdmVkKGlucHV0LCBwYXRoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9OwotCQkJCQl9IGVsc2UgewotCQkJCQkJaW5mbz0gKERpYWdyYW1GaWxlSW5mb1N5bmMpIGdldEVsZW1lbnRJbmZvKGZGaWxlRWRpdG9ySW5wdXQpOwotCQkJCQkJaWYgKGluZm8gIT0gbnVsbCAmJiAhaW5mby5mQ2FuQmVTYXZlZCkgewotCQkJCQkJCXJ1bm5hYmxlPSBuZXcgU2FmZUNoYW5nZShmRmlsZUVkaXRvcklucHV0KSB7Ci0JCQkJCQkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSUZpbGVFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQkJCQloYW5kbGVFbGVtZW50RGVsZXRlZChpbnB1dCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAocnVubmFibGUgIT0gbnVsbCkKLQkJCQl1cGRhdGUocnVubmFibGUpOwotCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9CQotCQotCXB1YmxpYyB2b2lkIHVuc2V0Q2FuU2F2ZURvY3VtZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCUVsZW1lbnRJbmZvIGluZm8gPSAoRWxlbWVudEluZm8pIGdldEVsZW1lbnRJbmZvKGVsZW1lbnQpOwotCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCXJlbW92ZVVuY2hhbmdlZEVsZW1lbnRMaXN0ZW5lcnMoZWxlbWVudCwgaW5mbyk7Ci0JCQkJaW5mby5mQ2FuQmVTYXZlZCA9IGZhbHNlOwotCQkJCWFkZFVuY2hhbmdlZEVsZW1lbnRMaXN0ZW5lcnMoZWxlbWVudCwgaW5mbyk7Ci0JCQkJZmlyZUVsZW1lbnREaXJ0eVN0YXRlQ2hhbmdlZChlbGVtZW50LCBpbmZvLmZDYW5CZVNhdmVkKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3V0aWwvQUREaWFncmFtVXRpbC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvdXRpbC9BRERpYWdyYW1VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNjExYzkuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvdXRpbC9BRERpYWdyYW1VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcnRpdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQUREaWFncmFtVXRpbCB7Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE5vZGVzSW5QYXJ0aXRpb24oQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCBjaGlsZCkgewotCQlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlBY3Rpdml0eVBhcnRpdGlvbiBwYXJ0aXRpb24gPSAoQWN0aXZpdHlQYXJ0aXRpb24pKChOb2RlKWNoaWxkLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJTGlzdCBsaXN0ID0gcGFydGl0aW9uLmdldE5vZGVzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJbm9kZXMuYWRkKGZpbmRFZGl0UGFydHlCeUVsZW1lbnQoY2hpbGQuZ2V0UGFyZW50KCksIGVsZW1lbnQpKTsKLQkJfQotCQlyZXR1cm4gbm9kZXM7Ci0JfQotCXB1YmxpYyBzdGF0aWMgRWRpdFBhcnQgZmluZEVkaXRQYXJ0eUJ5RWxlbWVudChFZGl0UGFydCBwYXJlbnQsCi0JCQlPYmplY3QgZWxlbWVudCkgewotCQlMaXN0IGxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBpdGVyLm5leHQoKTsKLQkJCWlmICgoKE5vZGUpIGVkaXRQYXJ0LmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKSA9PSBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGVkaXRQYXJ0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgc3RhdGljIEVkaXRQYXJ0IGdldFBhcnRpdGlvbldoZXJlQ2hpbGRJbihFZGl0UGFydCBjaGlsZCwgT2JqZWN0IGNvbnN0cmFpbnQpIHsKLQkJRGlhZ3JhbUVkaXRQYXJ0IHBhcmVudCA9IChEaWFncmFtRWRpdFBhcnQpIGNoaWxkLmdldFBhcmVudCgpOwotCQlpZiAoIShjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpCi0JCQkJJiYgcGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHlFZGl0UGFydCkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoKE5vZGUpIGNoaWxkLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQkJTGlzdCBsaXN0ID0gKChBY3Rpdml0eU5vZGUpIGVsZW1lbnQpLmdldEluUGFydGl0aW9ucygpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJQWN0aXZpdHlQYXJ0aXRpb24gcGFydGl0aW9uID0gKEFjdGl2aXR5UGFydGl0aW9uKSBpdGVyCi0vLwkJCQkJCQkubmV4dCgpOwotCQkJCQlFZGl0UGFydCBwYXJ0ID0gZmluZEVkaXRQYXJ0eUJ5RWxlbWVudChwYXJlbnQsIGVsZW1lbnQpOwotCQkJCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBOb2RlIG5vZGUgPSAoTm9kZSlwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCQkvLyBPYmplY3QgeCA9IFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwKLQkJCQkJCS8vIE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpKTsKLQkJCQkJCS8vIE9iamVjdCB5ID0gVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLAotCQkJCQkJLy8gTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkpOwotCQkJCQkJLy8gT2JqZWN0IHdpZHRoID0KLQkJCQkJCS8vIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwKLQkJCQkJCS8vIE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpKTsKLQkJCQkJCS8vIE9iamVjdCBoZWlnaHQgPQotCQkJCQkJLy8gVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLAotCQkJCQkJLy8gTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpKTsKLQkJCQkJCS8vIFJlY3RhbmdsZSByZWN0ID0gbmV3IFJlY3RhbmdsZSh4LHksd2lkdGgsIGhlaWdodCk7Ci0JCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gKChHcmFwaGljYWxFZGl0UGFydCkgcGFydCkKLQkJCQkJCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQkJaWYgKGJvdW5kcy5jb250YWlucygoUmVjdGFuZ2xlKSBjb25zdHJhaW50KSkgewotCQkJCQkJCXJldHVybiBwYXJ0OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbm91c2UoKXsKLS8vCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KSB7Ci0vLwkJCUxpc3QgY2hpbGRzID0gZ2V0Tm9kZXNJblBhcnRpdGlvbigoQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCljaGlsZCk7CQotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlFZGl0UGFydCBlbGVtZW50ID0gKEVkaXRQYXJ0KSBpdGVyLm5leHQoKTsKLS8vCQkJCS8vY21kLmNoYWluKHN1cGVyLmNyZWF0ZUNoYW5nZUNvbnN0cmFpbnRDb21tYW5kKGVsZW1lbnQsIGNvbnN0cmFpbnQpKTsKLS8vCQkJfQotLy8JCQkKLS8vCQl9IGVsc2UgewotLy8KLS8vCQkJRWRpdFBhcnQgcGFydCA9IGNoaWxkSW5BbnlQYXJ0aXRpb25BcmVhKGNoaWxkLCBjb25zdHJhaW50KTsKLS8vCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KSB7Ci0vLwkJCQkvLyBSZWN0YW5nbGUgYm91bmRzID0KLS8vCQkJCS8vICgoR3JhcGhpY2FsRWRpdFBhcnQpcGFydCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0vLwkJCQkvLyBSZWN0YW5nbGUgY29uc3RhaW50ciA9IChSZWN0YW5nbGUpY29uc3RyYWludDsKLS8vCQkJCS8vIGJvdW5kcyA9IGJvdW5kcy5leHBhbmQoY29uc3RhaW50ci53aWR0aCwgY29uc3RhaW50ci5oZWlnaHQpOwotLy8JCQkJLy8gKChHcmFwaGljYWxFZGl0UGFydClwYXJ0KS5nZXRGaWd1cmUoKS5zZXRCb3VuZHMoYm91bmRzKTsKLS8vLy8JCQkJQ29tbWFuZCBjbWR4ID0gc3VwZXIuY3JlYXRlQ2hhbmdlQ29uc3RyYWludENvbW1hbmQocGFydCwKLS8vLy8JCQkJCQljb25zdHJhaW50KTsKLS8vLy8JCQkJY21kLmNoYWluKGNtZHgpOwotLy8KLS8vCQkJfQotLy8JCX0KLQl9Ci0JCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tbWFuZCBnZXRDb21tYW5kV3JhcHBlcihJQ29tbWFuZCBjbWQpIHsKLQkJcmV0dXJuIG5ldyBJQ29tbWFuZFByb3h5KGNtZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvdXRpbC9BbmNob3JVdGlsLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS91dGlsL0FuY2hvclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM3OGY5MS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS91dGlsL0FuY2hvclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGFuY2hvcnMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbmNob3JVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgUG9pbnQgZ2V0Q2xvc2VzdFBvaW50KFBvaW50W10gcG9pbnRzLCBQb2ludCBwb2ludCkgewotCQlpbnQgc2l6ZSA9IHBvaW50cy5sZW5ndGg7Ci0JCWRvdWJsZVtdIGRpc3RhbmNlcyA9IG5ldyBkb3VibGVbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlkaXN0YW5jZXNbaV0gPSBwb2ludHNbaV0uZ2V0RGlzdGFuY2UocG9pbnQpOwotCQl9Ci0JCXJldHVybiBwb2ludHNbbWluKGRpc3RhbmNlcyldOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IG1pbihkb3VibGVbXSBudW1iZXJzKSB7Ci0JCWlmIChudW1iZXJzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIC0xOwotCQlkb3VibGUgbWluID0gbnVtYmVyc1swXTsKLQkJaW50IGlkID0gMDsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBudW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlkb3VibGUgbiA9IG51bWJlcnNbaV07Ci0JCQlpZiAobiA8IG1pbikgewotCQkJCW1pbiA9IG47Ci0JCQkJaWQgPSBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbnVtYmVycwotCSAqIEByZXR1cm4KLQkgKiAJCWluZGV4IG9mIHRoZSBzbWFsbGVzdCBudW1iZXIgaW4gdGhlIGdpdmVuIGFycmF5Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgbWluKGludFtdIG51bWJlcnMpIHsKLQkJaWYgKG51bWJlcnMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gLTE7Ci0JCWludCBtaW4gPSBudW1iZXJzWzBdOwotCQlpbnQgaWQgPSAwOwotCQlmb3IgKGludCBpID0gMTsgaSA8IG51bWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWludCBuID0gbnVtYmVyc1tpXTsKLQkJCWlmIChuIDwgbWluKSB7Ci0JCQkJbWluID0gbjsKLQkJCQlpZCA9IGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvdXRpbC9EaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3V0aWwvRGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzN2M4ZmIuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvdXRpbC9EaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLQotLyoqCi0gKiBEaWFncmFtQ2hhbmdlTGlzdGVuZXIgbGlzdGVucyB0byB0aGUgTm90aWZpY2F0aW9uIG9mIE5vdGlmaWVyIChtYWlubHkge0BsaW5rIEFjdGl2aXR5fQotICogU2ltaWxhciB0byB0aGUgR0VGIGJhc2VkIEFjdGl2aXR5RGlhZ3JhbSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JRGlhZ3JhbUNoYW5nZUxpc3RlbmVyfQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElEaWFncmFtQ2hhbmdlTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IG9iamVjdDsKLQlwcml2YXRlIERpYWdyYW0gZGlhZ3JhbTsKLQkKLQlwdWJsaWMgRGlhZ3JhbUNoYW5nZUxpc3RlbmVyKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCU1ldGhvZEVsZW1lbnQgb2JqZWN0LCBEaWFncmFtIGRpYWdyYW0pIHsKLQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JCXRoaXMuZGlhZ3JhbSA9IGRpYWdyYW07Ci0JfQotCi0JcHVibGljIERpYWdyYW1DaGFuZ2VMaXN0ZW5lcihNZXRob2RFbGVtZW50IG9iamVjdCwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCQl0aGlzLmRpYWdyYW0gPSBkaWFncmFtOwotCX0KLQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQlwdWJsaWMgTm90aWZpZXIgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLS8vCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQgKQotLy8JCQlyZXR1cm47Ci0vLwkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotLy8JCXRyeSB7Ci0vLwkJCS8vT2JqZWN0IG9iajsKLS8vCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSkgewotLy8JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLS8vCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0vLwkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0vLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb3RpZmljYXRpb24gQWRkIik7Ci0vLwkJCQkJYnJlYWs7Ci0vLwkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0vLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb3RpZmljYXRpb24gQWRkIik7Ci0vLwkJCQkJYnJlYWs7Ci0vLwkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLS8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGlmaWNhdGlvbiBBZGQiKTsKLS8vCQkJCQlicmVhazsKLS8vCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm90aWZpY2F0aW9uIEFkZCIpOwotLy8JCQkJCWJyZWFrOwotLy8JCQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLS8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGlmaWNhdGlvbiBBZGQiKTsKLS8vCQkJCQlicmVhazsKLS8vCQkJCX0KLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0vLwkJfQotLy8JCWZpbmFsbHkgewotLy8JCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLS8vCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS91dGlsL0RpYWdyYW1FZGl0b3JVdGlsLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS91dGlsL0RpYWdyYW1FZGl0b3JVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOTk3YmMuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvdXRpbC9EaWFncmFtRWRpdG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuT3BlcmF0aW9uSGlzdG9yeUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLmltcGwuSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5BY3Rpdml0eURpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuY29tbWFuZHMuQ3JlYXRlRGlhZ3JhbUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2UuRGlhZ3JhbUZpbGVDcmVhdG9yRXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2UuRGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2UuSURpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MRGlhZ3JhbUZpbGVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5BY3Rpdml0eURyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuSURpYWdyYW1Xb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUudXRpbC5JREVFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5wYXJ0cy5EaWFncmFtRG9jdW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnV0aWwuRGlhZ3JhbUZpbGVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci51dGlsLkVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLkdNRkVkaXRpbmdEb21haW5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRWRpdG9yVXRpbCBleHRlbmRzIElERUVkaXRvclV0aWwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcga2luZCA9ICJBRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmYXVsdF9maWxlX25hbWUgPSAiZGlhZ3JhbSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY3JlYXRlX2RpYWdyYW1fbGFiZWwgPSAiQ3JlYXRlIGRpYWdyYW0gYW5kIG1vZGVsIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURfRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkRpYWdyYW1FZGl0b3JJRCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFZGl0b3JJZChpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJc3dpdGNoKGRpYWdyYW1UeXBlKSB7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlyZXR1cm4gQURfRURJVE9SX0lEOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElFZGl0b3JQYXJ0IG9wZW5EaWFncmFtRWRpdG9yKElXb3JrYmVuY2hQYWdlIHBhZ2UsIERpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJRGlhZ3JhbUVkaXRvcklucHV0UHJveHkgZGlhZ3JhbUZpbGVFZGl0b3JJbnB1dCA9IG5ldyBEaWFncmFtRWRpdG9ySW5wdXRQcm94eShpbnB1dCwgRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCi0JCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdG9yUGFydCA9IHBhZ2Uub3BlbkVkaXRvcihkaWFncmFtRmlsZUVkaXRvcklucHV0LCBnZXRFZGl0b3JJZChpbnB1dC5nZXREaWFncmFtVHlwZSgpKSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCQkvLyBpbml0aWFsaXplIHRoZSBkaWFncmFtIGJ5IHN5bmNocm9uaXppbmcgaXQgd2l0aCBsaWJyYXJ5IGRhdGEKLQkJLy8KLQkJaWYoZWRpdG9yUGFydCBpbnN0YW5jZW9mIElEaWFncmFtV29ya2JlbmNoUGFydCkgewotCQkJRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKChJRGlhZ3JhbVdvcmtiZW5jaFBhcnQpZWRpdG9yUGFydCkuZ2V0RGlhZ3JhbUVkaXRQYXJ0KCk7Ci0JCQkoKERpYWdyYW1Eb2N1bWVudEVkaXRvcillZGl0b3JQYXJ0KS5nZXREb2N1bWVudFByb3ZpZGVyKCkuc2V0Q2FuU2F2ZURvY3VtZW50KGRpYWdyYW1GaWxlRWRpdG9ySW5wdXQpOwotCQkJaW5pdGlhbGl6ZSgoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKSwgZGlhZ3JhbUZpbGVFZGl0b3JJbnB1dCk7Ci0JCX0KLQkJcmV0dXJuIGVkaXRvclBhcnQ7Ci0JfQotCi0JLyoqCi0JICogVG8gb3BlbiBhIGRpYWdyYW0gYW5kIGNyZWF0ZSBhIGZpbGUuCi0JICogQHdyaXR0ZW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkRpYWdyYW1FZGl0b3IoSVdvcmtiZW5jaFBhZ2UgcGFnZSwgSUVkaXRvcklucHV0IGlucHV0KXsKLQkJCi0JCU1ldGhvZEVsZW1lbnQgcHJvY2VzcyA9IChNZXRob2RFbGVtZW50KSgoRGlhZ3JhbUVkaXRvcklucHV0KWlucHV0KS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCUlQYXRoIGNvbnRhaW5lclBhdGggPSBnZXRDb250YWluZXJQYXRoKHByb2Nlc3MpOwotCQkKLQkJY3JlYXRlQW5kT3BlbkRpYWdyYW0oCi0JCQkJVU1MRGlhZ3JhbUZpbGVDcmVhdG9yLmdldEluc3RhbmNlKCksIGNvbnRhaW5lclBhdGgsIGRlZmF1bHRfZmlsZV9uYW1lLAotCQkJCUVkaXRvclV0aWwuZ2V0SW5pdGlhbENvbnRlbnRzKCksIGtpbmQsIHBhZ2UsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksCi0JCQkJdHJ1ZSwgZmFsc2UsIGlucHV0KTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUZpbGUgY3JlYXRlQW5kT3BlbkRpYWdyYW0oCi0JCQlEaWFncmFtRmlsZUNyZWF0b3IgZGlhZ3JhbUZpbGVDcmVhdG9yLCBJUGF0aCBjb250YWluZXJQYXRoLAotCQkJU3RyaW5nIGZpbGVOYW1lLCBJbnB1dFN0cmVhbSBpbml0aWFsQ29udGVudHMsIFN0cmluZyBraW5kLAotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0JCQlib29sZWFuIG9wZW5FZGl0b3IsIGJvb2xlYW4gc2F2ZURpYWdyYW0sIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQkKLQkJSUZpbGUgZGlhZ3JhbUZpbGUgPSBnZXRGaWxlKGZpbGVOYW1lLCBpbnB1dCwgZGlhZ3JhbUZpbGVDcmVhdG9yKSA7Ci0JCWlmKGRpYWdyYW1GaWxlID09IG51bGwpewotCQkJZGlhZ3JhbUZpbGUgPSBjcmVhdGVOZXdEaWFncmFtRmlsZSgKLQkJCQlkaWFncmFtRmlsZUNyZWF0b3IsIGNvbnRhaW5lclBhdGgsIGZpbGVOYW1lLCBpbml0aWFsQ29udGVudHMsCi0JCQkJa2luZCwgcGFnZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBwcm9ncmVzc01vbml0b3IsIGlucHV0KTsKLQkJfWVsc2V7Ci0JCQkKLQkJfQotCQkKLS8vCQlEaWFncmFtRmlsZUVkaXRvcklucHV0IGRpYWdyYW1GaWxlRWRpdG9ySW5wdXQgPSBuZXcgRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dCgKLS8vCQkJCWRpYWdyYW1GaWxlLCAoRGlhZ3JhbUVkaXRvcklucHV0KWlucHV0KTsKLQkJRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5IGRpYWdyYW1GaWxlRWRpdG9ySW5wdXQgPSBuZXcgRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5KAotCQkJCWRpYWdyYW1GaWxlLCAoRGlhZ3JhbUVkaXRvcklucHV0KWlucHV0LCBudWxsKTsKLQkJCi0JCWlmIChkaWFncmFtRmlsZSAhPSBudWxsICYmIG9wZW5FZGl0b3IpIHsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBkb09wZW5EaWFncmFtRWRpdG9yKGRpYWdyYW1GaWxlRWRpdG9ySW5wdXQsIHBhZ2UsIHNhdmVEaWFncmFtLCBwcm9ncmVzc01vbml0b3IpOwotCQkJCi0JCQkvLyBpbml0aWFsaXplIHRoZSBkaWFncmFtIGJ5IHN5bmNocm9uaXppbmcgaXQgd2l0aCBsaWJyYXJ5IGRhdGEKLQkJCS8vCi0JCQlpZihlZGl0b3JQYXJ0IGluc3RhbmNlb2YgSURpYWdyYW1Xb3JrYmVuY2hQYXJ0KSB7Ci0JCQkJRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKChJRGlhZ3JhbVdvcmtiZW5jaFBhcnQpZWRpdG9yUGFydCkuZ2V0RGlhZ3JhbUVkaXRQYXJ0KCk7Ci0JCQkJaW5pdGlhbGl6ZSgoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKSwgZGlhZ3JhbUZpbGVFZGl0b3JJbnB1dCk7Ci0JCQl9Ci0JCQkvLyByZW1vdmUgdGhlIGRpcnR5IGZsYWcKLQkJCS8vCi0vLwkJCWlmKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFZGl0b3IpIHsKLS8vCQkJCUlEb2N1bWVudFByb3ZpZGVyIGRwID0gKChJRG9jdW1lbnRFZGl0b3IpZWRpdG9yUGFydCkuZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotLy8JCQkJaWYoZHAgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9yRG9jdW1lbnRQcm92aWRlcikgewotLy8JCQkJCSgoRGlhZ3JhbUVkaXRvckRvY3VtZW50UHJvdmlkZXIpZHApLnVuc2V0Q2FuU2F2ZURvY3VtZW50KGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJfQotCQlyZXR1cm4gZGlhZ3JhbUZpbGU7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShEaWFncmFtIG1vZGVsLCBEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkgZGlhZ3JhbUZpbGVFZGl0b3JJbnB1dCkgewotCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gZGlhZ3JhbUZpbGVFZGl0b3JJbnB1dC5nZXREaWFncmFtRWRpdG9ySW5wdXQoKS5nZXRXcmFwcGVyKCk7Ci0JCUFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIgYWRhcHRlciA9IHdyYXBwZXIgIT0gbnVsbCA/Ci0JCQkJbmV3IEFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIod3JhcHBlcikgOiAKLQkJCQkJbmV3IEFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIoKEFjdGl2aXR5KWRpYWdyYW1GaWxlRWRpdG9ySW5wdXQuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJYWRhcHRlci5zZXRFZGl0aW5nRG9tYWluKChJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKSBkaWFncmFtRmlsZUVkaXRvcklucHV0LmdldEVkaXRpbmdEb21haW4oKSk7Ci0JCWFkYXB0ZXIuc2V0U3VwcHJlc3Npb24oZGlhZ3JhbUZpbGVFZGl0b3JJbnB1dC5nZXREaWFncmFtRWRpdG9ySW5wdXQoKS5nZXRTdXBwcmVzc2lvbigpKTsKLQkJYWRhcHRlci5zZXRWaWV3KG1vZGVsKTsKLQkJbW9kZWwuZ2V0RWxlbWVudCgpLmVBZGFwdGVycygpLmFkZChhZGFwdGVyKTsKLQkJYWRhcHRlci5wb3B1bGF0ZURpYWdyYW0oKTsKLQl9Ci0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2l0aGluIGEgd29ya3NwYWNlIG1vZGlmeSBvcGVyYXRpb24gc2luY2UgaXQgY3JlYXRlcyByZXNvdXJjZXMuCi0JICogPC9wPgotCSAqIEBtb2RpZmllZAotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgZmlsZSByZXNvdXJjZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGZpbGUgd2FzIG5vdCBjcmVhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRmlsZSBjcmVhdGVOZXdEaWFncmFtRmlsZSgKLQkJCURpYWdyYW1GaWxlQ3JlYXRvciBkaWFncmFtRmlsZUNyZWF0b3IsIElQYXRoIGNvbnRhaW5lckZ1bGxQYXRoLAotCQkJU3RyaW5nIGZpbGVOYW1lLCBJbnB1dFN0cmVhbSBpbml0aWFsQ29udGVudHMsIFN0cmluZyBraW5kLAotCQkJU2hlbGwgc2hlbGwsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJcHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzaygiQ3JlYXRpbmcgbm90YXRpb24gZGlhZ3JhbSBhbmQgbW9kZWwgZmlsZSIsIDQpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIElQcm9ncmVzc01vbml0b3Igc3ViUHJvZ3Jlc3NNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcigKLQkJCQlwcm9ncmVzc01vbml0b3IsIDEpOwotCQlmaW5hbCBJRmlsZSBkaWFncmFtRmlsZSA9IGRpYWdyYW1GaWxlQ3JlYXRvci5jcmVhdGVOZXdGaWxlKAotCQkJCWNvbnRhaW5lckZ1bGxQYXRoLCBmaWxlTmFtZSwgaW5pdGlhbENvbnRlbnRzLCBzaGVsbCwKLQkJCQluZXcgSVJ1bm5hYmxlQ29udGV4dCgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKGJvb2xlYW4gZm9yaywgYm9vbGVhbiBjYW5jZWxhYmxlLAotCQkJCQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkKLQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQlydW5uYWJsZS5ydW4oc3ViUHJvZ3Jlc3NNb25pdG9yKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJY3JlYXRlRGlhZ3JhbUNvbnRlbnQoZGlhZ3JhbUZpbGUsIHByb2dyZXNzTW9uaXRvciwgaW5wdXQpOwotCQlyZXR1cm4gZGlhZ3JhbUZpbGU7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBkaWFncmFtIGZpbGUgY29udGVudCAtIEdNRiBub3RhdGlvbiBEaWFncmFtIGFuZCBVTUwgQWN0aXZpdHksCi0JICogVU1BIGJyaWRnZS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY3JlYXRlRGlhZ3JhbUNvbnRlbnQoSUZpbGUgZGlhZ3JhbUZpbGUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gR01GRWRpdGluZ0RvbWFpbkZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsKLQkJZmluYWwgUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gcmVzb3VyY2VTZXQKLQkJCQkuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZGlhZ3JhbUZpbGUKLQkJCQkJCS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpKTsKLQkJTGlzdCBhZmZlY3RlZEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlhZmZlY3RlZEZpbGVzLmFkZChkaWFncmFtRmlsZSk7Ci0JCUNyZWF0ZURpYWdyYW1Db21tYW5kIGNvbW1hbmQgPSBuZXcgQ3JlYXRlRGlhZ3JhbUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwKLQkJCQkiQ3JlYXRpbmcgZGlhZ3JhbSBhbmQgbW9kZWwiLCBhZmZlY3RlZEZpbGVzLCBpbnB1dCwKLQkJCQlkaWFncmFtUmVzb3VyY2UsIGtpbmQpOwotCQl0cnkgewotCQkJT3BlcmF0aW9uSGlzdG9yeUZhY3RvcnkuZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmV4ZWN1dGUoY29tbWFuZCwKLQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDEpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBjcmVhdGUgbW9kZWwgYW5kIGRpYWdyYW0iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgZGlhZ3JhbSBmaWxlIGNvbnRlbnQgLSBHTUYgbm90YXRpb24gRGlhZ3JhbSBhbmQgVU1MIEFjdGl2aXR5LAotCSAqIFVNQSBicmlkZ2UuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNyZWF0ZURpYWdyYW1Db250ZW50KFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sCi0JCQlJRmlsZSBkaWFncmFtRmlsZSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsIElFZGl0b3JJbnB1dCBpbnB1dCwKLQkJCVJlc291cmNlIHJlc291cmNlKSB7Ci0KLS8vCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gR01GRWRpdGluZ0RvbWFpbkZhY3RvcnkuSU5TVEFOQ0UKLS8vCQkJCS5jcmVhdGVFZGl0aW5nRG9tYWluKCk7Ci0vLwkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCk7Ci0vLwkJZmluYWwgUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gcmVzb3VyY2VTZXQKLS8vCQkJCS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShkaWFncmFtRmlsZQotLy8JCQkJCQkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSk7Ci0JCUxpc3QgYWZmZWN0ZWRGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYWZmZWN0ZWRGaWxlcy5hZGQoZGlhZ3JhbUZpbGUpOwotCQlDcmVhdGVEaWFncmFtQ29tbWFuZCBjb21tYW5kID0gbmV3IENyZWF0ZURpYWdyYW1Db21tYW5kKGVkaXRpbmdEb21haW4sCi0JCQkJIkNyZWF0aW5nIGRpYWdyYW0gYW5kIG1vZGVsIiwgYWZmZWN0ZWRGaWxlcywgaW5wdXQsCi0JCQkJcmVzb3VyY2UsIGtpbmQpOwotCQl0cnkgewotCQkJT3BlcmF0aW9uSGlzdG9yeUZhY3RvcnkuZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmV4ZWN1dGUoY29tbWFuZCwKLQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDEpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBjcmVhdGUgbW9kZWwgYW5kIGRpYWdyYW0iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKioKLQkgKiBAd3JpdHRlbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0Q29udGFpbmVyUGF0aCgpewotCQlJUGF0aCBwYXRoID0gRWRpdG9yVXRpbC5nZXREZWZhdWx0RGlhZ3JhbVBhdGgobnVsbCwgbnVsbCk7Ci0JCWlmIChwYXRoID09IG51bGwpIHsKLQkJCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCQlJUHJvamVjdFtdIHByb2plY3RzID0gcm9vdC5nZXRQcm9qZWN0cygpOwotCi0JCQkJcGF0aCA9IHJvb3QuZ2V0RnVsbFBhdGgoKTsKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCi0JCQkJCWlmIChwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJCQlwYXRoID0gcHJvamVjdC5nZXRGdWxsUGF0aCgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCQotCS8qKgotCSAqIE9wZW5zIHRoZSBkaWFncmFtIGluIGFuIElFZGl0b3JQYXJ0Ci0JICogIAotCSAqIEBwYXJhbSBmaWxlIElGaWxlIHRoYXQgY29udGFpbnMgdGhlIGRpYWdyYW0KLQkgKiBAcGFyYW0gZFdpbmRvdyB0aGUgd29ya2JlbmNoIHdpbmRvdwotCSAqIEBwYXJhbSBzYXZlRGlhZ3JhbSB0cnVlIHRvIHNhdmUgdGhlIGRpYWdyYW0gYWZ0ZXIgb3BlbmluZywgZmFsc2UgdG8gbm90Ci0JICogc2F2ZSBpdC4KLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIHVzZWQgd2hlbiBvcGVuaW5nIHRoZSBkaWFncmFtLgotCSAqIEZvciBub3csIGl0IGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBkaWFncmFtIGlzIGJlaW5nIHNhdmVkIGFmdGVyIG9wZW5pbmcuCi0JICogIAotCSAqIEByZXR1cm4gRGlhZ3JhbUVkaXRQYXJ0IGZvciB0aGUgZGlhZ3JhbSBvcGVuZWQgaW4gYW4gSUVkaXRvclBhcnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEaWFncmFtRWRpdFBhcnQgb3BlbkRpYWdyYW1FZGl0b3IoSUZpbGVFZGl0b3JJbnB1dCBpbnB1dCwKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UsIGJvb2xlYW4gc2F2ZURpYWdyYW0sCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gZG9PcGVuRGlhZ3JhbUVkaXRvcihpbnB1dCwgcGFnZSwgc2F2ZURpYWdyYW0sIHByb2dyZXNzTW9uaXRvcik7Ci0JCWlmKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJRGlhZ3JhbVdvcmtiZW5jaFBhcnQpIHsKLQkJCXJldHVybiAoKElEaWFncmFtV29ya2JlbmNoUGFydCllZGl0b3JQYXJ0KS5nZXREaWFncmFtRWRpdFBhcnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWRpdG9yUGFydCBkb09wZW5EaWFncmFtRWRpdG9yKElGaWxlRWRpdG9ySW5wdXQgaW5wdXQsCi0JCQlJV29ya2JlbmNoUGFnZSBwYWdlLCBib29sZWFuIHNhdmVEaWFncmFtLAotCQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvL0lXb3JrYmVuY2hQYWdlIHBhZ2UgPSBkV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCUlFZGl0b3JQYXJ0IHBhcmVudCA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJZWRpdG9yUGFydCA9IG9wZW5FZGl0b3IocGFnZSwgaW5wdXQsIHRydWUsdHJ1ZSk7Ci0JCQkJaWYoZWRpdG9yUGFydCAhPSBudWxsICYmIHBhcmVudCAhPSBudWxsKXsKLQkJCQkJLy8gc2V0IHRoZSBwYXJlbnQuCi0JCQkJfQotCQkJCS8vIHNldCBBY3RpdmUgcGFnZSBlZGl0b3IgYXMgcGFyZW50LgotCQkJCWlmIChzYXZlRGlhZ3JhbSkKLQkJCQkJZWRpdG9yUGFydC5kb1NhdmUocHJvZ3Jlc3NNb25pdG9yKTsKLQkJCX0KLQkJCWlucHV0LmdldEZpbGUoKS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG51bGwpOwotCQkJcmV0dXJuIGVkaXRvclBhcnQ7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotICAgICAqIE9wZW5zIGFuIGVkaXRvciBvbiB0aGUgZ2l2ZW4gZmlsZSByZXNvdXJjZS4gIFRoaXMgbWV0aG9kIHdpbGwgYXR0ZW1wdCB0bwotCSAqIHJlc29sdmUgdGhlIGVkaXRvciBiYXNlZCBvbiBjb250ZW50LXR5cGUgYmluZGluZ3MgYXMgd2VsbCBhcyB0cmFkaXRpb25hbAotCSAqIG5hbWUvZXh0ZW5zaW9uIGJpbmRpbmdzIGlmIDxjb2RlPmRldGVybWluZUNvbnRlbnRUeXBlPC9jb2RlPiBpcwotCSAqIDxjb2RlPnRydWU8L2NvZGU+LgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBwYWdlIGFscmVhZHkgaGFzIGFuIGVkaXRvciBvcGVuIG9uIHRoZSB0YXJnZXQgb2JqZWN0IHRoZW4gdGhhdAotICAgICAqIGVkaXRvciBpcyBicm91Z2h0IHRvIGZyb250OyBvdGhlcndpc2UsIGEgbmV3IGVkaXRvciBpcyBvcGVuZWQuIElmCi0gICAgICogPGNvZGU+YWN0aXZhdGUgPT0gdHJ1ZTwvY29kZT4gdGhlIGVkaXRvciB3aWxsIGJlIGFjdGl2YXRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBAcGFyYW0gcGFnZQotICAgICAqICAgICAgICAgICAgdGhlIHBhZ2UgaW4gd2hpY2ggdGhlIGVkaXRvciB3aWxsIGJlIG9wZW5lZAotICAgICAqIEBwYXJhbSBpbnB1dAotICAgICAqICAgICAgICAgICAgdGhlIGVkaXRvciBpbnB1dAotICAgICAqIEBwYXJhbSBhY3RpdmF0ZQotICAgICAqIAkJCSAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIGVkaXRvciB3aWxsIGJlIGFjdGl2YXRlZAotICAgICAqIEBwYXJhbSBkZXRlcm1pbmVDb250ZW50VHlwZQotICAgICAqIAkJCSAgYXR0ZW1wdCB0byByZXNvbHZlIHRoZSBjb250ZW50IHR5cGUgZm9yIHRoaXMgZmlsZQotICAgICAqIEByZXR1cm4gYW4gb3BlbiBlZGl0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgYW4gZXh0ZXJuYWwgZWRpdG9yIHdhcwotICAgICAqICAgICAgICAgb3BlbmVkCi0gICAgICogQGV4Y2VwdGlvbiBQYXJ0SW5pdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBlZGl0b3IgY291bGQgbm90IGJlIGluaXRpYWxpemVkCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZSNvcGVuRWRpdG9yKG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCwKLSAgICAgKiAgICAgIFN0cmluZywgYm9vbGVhbikKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0JcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydCBvcGVuRWRpdG9yKElXb3JrYmVuY2hQYWdlIHBhZ2UsIElGaWxlRWRpdG9ySW5wdXQgaW5wdXQsCi0gICAgICAgICAgICBib29sZWFuIGFjdGl2YXRlLCBib29sZWFuIGRldGVybWluZUNvbnRlbnRUeXBlKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICAvL3Nhbml0eSBjaGVja3MKLSAgICAgICAgaWYgKHBhZ2UgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLSAgICAgICAgLy8gb3BlbiB0aGUgZWRpdG9yIG9uIHRoZSBmaWxlCi0gICAgICAgIElFZGl0b3JEZXNjcmlwdG9yIGVkaXRvckRlc2MgPSBJREUuZ2V0RWRpdG9yRGVzY3JpcHRvcihpbnB1dC5nZXRGaWxlKCksIGRldGVybWluZUNvbnRlbnRUeXBlKTsKLSAgICAgICAgcmV0dXJuIHBhZ2Uub3BlbkVkaXRvcihpbnB1dCwgZWRpdG9yRGVzYy5nZXRJZCgpLAotICAgICAgICAgICAgICAgIGFjdGl2YXRlKTsKLSAgICB9Ci0JCi0JLyoqCi0JICogQ2hlY2sgd2hldGhlciBmaWxlIGV4aXN0cyBvciBub3QuCi0JICogQHBhcmFtIHN6RmlsZU5hbWUKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcGFyYW0gZGlhZ3JhbUZpbGVDcmVhdG9yCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0RmlsZShTdHJpbmcgc3pGaWxlTmFtZSwgSUVkaXRvcklucHV0IGlucHV0LCBEaWFncmFtRmlsZUNyZWF0b3IgZGlhZ3JhbUZpbGVDcmVhdG9yKXsKLQkJCi0JCU1ldGhvZEVsZW1lbnQgZSA9ICgoRGlhZ3JhbUVkaXRvcklucHV0KWlucHV0KS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCVByb2Nlc3Mgc3JjUHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgZSk7Ci0JCQotCQlJUGF0aCBjb250YWluZXJQYXRoID0gZ2V0Q29udGFpbmVyUGF0aChlKTsKLQkJU3RyaW5nIHN6TmV3RmlsZU5hbWUgPSBzekZpbGVOYW1lOwkJCi0JCUlQYXRoIGZpbGVQYXRoID0gY29udGFpbmVyUGF0aC5hcHBlbmQoZGlhZ3JhbUZpbGVDcmVhdG9yLmFwcGVuZEV4dGVuc2lvblRvRmlsZU5hbWUoc3pOZXdGaWxlTmFtZSkpOwotLy8JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotLy8JCWlmKHdvcmtzcGFjZVJvb3QuZXhpc3RzKGZpbGVQYXRoKSl7Ci0vLwkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZmlsZVBhdGgpOwotLy8JCQlpZihmaWxlLmV4aXN0cygpKXsKLS8vCQkJCXJldHVybiBudWxsOwotLy8JCQl9Ci0vLwkJfQotCQlGaWxlIGxpYkRpcnMgPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpKTsKLQkJU3RyaW5nIGRpYWdyYW1QYXRoID0gbGliRGlycy5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkJCSsgTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXRFbGVtZW50UGF0aChzcmNQcm9jKQotCQkJCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgc3JjUHJvYy5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJCQkrICJkaWFncmFtLnhtaSI7Ci0JCUZpbGUgZmlsZXggPSBuZXcgRmlsZShkaWFncmFtUGF0aCk7Ci0JCWlmKGZpbGV4LmV4aXN0cygpKXsKLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZmlsZVBhdGgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiAKLQkgKiBAcGFyYW0gcHJvYwotCSAqIEByZXR1cm4KLQkgKiBAY3VzdG9tCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRDb250YWluZXJQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCi0JCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlKTsKLQkJLy8gVE9ETyBoYW5kbGUgdGhlIFdyYXBwZXIgRWxlbWVudHMuCi0JCQotCQlpZiAocHJvYyBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwcm9jKTsKLQotCQkJU3RyaW5nIHJlbGF0aXZlRGlyOwotCi0JCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJcmVsYXRpdmVEaXIgPSBNdWx0aUZpbGVTYXZlVXRpbC5DQVBBQklMSVRZX1BBVFRFUk5fUEFUSDsKLQkJCX0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCXJlbGF0aXZlRGlyID0gTXVsdGlGaWxlU2F2ZVV0aWwuREVMSVZFUllfUFJPQ0VTU19QQVRIOwotCQkJfSBlbHNlIHsKLQkJCQlyZWxhdGl2ZURpciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCUlQYXRoIHdvcmtzcGFjZVBhdGggPSBFZGl0b3JVdGlsLmdldERlZmF1bHREaWFncmFtUGF0aChudWxsLCBudWxsKTsKLQkJCWlmICh3b3Jrc3BhY2VQYXRoID09IG51bGwpIHsKLQkJCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCQlJUHJvamVjdFtdIHByb2plY3RzID0gcm9vdC5nZXRQcm9qZWN0cygpOwotCi0JCQkJd29ya3NwYWNlUGF0aCA9IHJvb3QuZ2V0RnVsbFBhdGgoKTsKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCi0JCQkJCWlmIChwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJCQl3b3Jrc3BhY2VQYXRoID0gcHJvamVjdC5nZXRGdWxsUGF0aCgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCVN0cmluZyBsaWJEaXIgPSB3b3Jrc3BhY2VQYXRoLnRvU3RyaW5nKCk7Ci0JCQlTdHJpbmcgcGx1Z2luRGlyID0gbGliRGlyICsgRmlsZS5zZXBhcmF0b3IgKyBwbHVnaW4uZ2V0TmFtZSgpOwotCQkJU3RyaW5nIGRpYWdyYW1EaXIgPSBwbHVnaW5EaXIgKyBGaWxlLnNlcGFyYXRvciArIHJlbGF0aXZlRGlyCi0JCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyBwcm9jLmdldE5hbWUoKSArIEZpbGUuc2VwYXJhdG9yOwotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlByaW50OiAiICsgZGlhZ3JhbURpcik7Ci0JCQlQYXRoIHBhdGggPSBuZXcgUGF0aChkaWFncmFtRGlyKTsKLQkJCXJldHVybiBwYXRoOwotCi0JCQkvLwkgcmV0dXJuIHdvcmtzcGFjZVBhdGg7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfSAKLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgZmlsZSBleGlzdHMgb3Igbm90LgotCSAqIEBwYXJhbSBzekZpbGVOYW1lCi0JICogQHBhcmFtIGlucHV0Ci0JICogQHBhcmFtIGRpYWdyYW1GaWxlQ3JlYXRvcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldEZpbGUoU3RyaW5nIHN6RmlsZU5hbWUsIEJyZWFrZG93bkVsZW1lbnQgZSwgRGlhZ3JhbUZpbGVDcmVhdG9yIGRpYWdyYW1GaWxlQ3JlYXRvcil7Ci0JCQotCQlQcm9jZXNzIHNyY1Byb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIGUpOwotCQkKLQkJSVBhdGggY29udGFpbmVyUGF0aCA9IGdldENvbnRhaW5lclBhdGgoZSk7Ci0JCVN0cmluZyBzek5ld0ZpbGVOYW1lID0gc3pGaWxlTmFtZTsJCQotCQlJUGF0aCBmaWxlUGF0aCA9IGNvbnRhaW5lclBhdGguYXBwZW5kKGRpYWdyYW1GaWxlQ3JlYXRvci5hcHBlbmRFeHRlbnNpb25Ub0ZpbGVOYW1lKHN6TmV3RmlsZU5hbWUpKTsKLS8vCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLS8vCQlpZih3b3Jrc3BhY2VSb290LmV4aXN0cyhmaWxlUGF0aCkpewotLy8JCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGZpbGVQYXRoKTsKLS8vCQkJaWYoZmlsZS5leGlzdHMoKSl7Ci0vLwkJCQlyZXR1cm4gbnVsbDsKLS8vCQkJfQotLy8JCX0KLQkJRmlsZSBsaWJEaXJzID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSk7Ci0JCVN0cmluZyBkaWFncmFtUGF0aCA9IGxpYkRpcnMuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJCQkrIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuZ2V0RWxlbWVudFBhdGgoc3JjUHJvYykKLQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIHNyY1Byb2MuZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCQkJKyAiZGlhZ3JhbS54bWkiOwotCQlGaWxlIGZpbGV4ID0gbmV3IEZpbGUoZGlhZ3JhbVBhdGgpOwotCQlpZihmaWxleC5leGlzdHMoKSl7Ci0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGZpbGVQYXRoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG1vdmVkIHRvIExpYnJhcnlFZGl0IG9yIFVzZSBOZXN0ZWRDb21tYW5kcyB1c2luZyBleHRlbnNpb24uCi0JICogQHBhcmFtIGNvbW1hbmQyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29weURpYWdyYW1zKEFjdGl2aXR5RHJvcENvbW1hbmQgY29tbWFuZDIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBJRGlhZ3JhbVNlcnZpY2UuZUluc3RhbmNlLmNyZWF0ZUVkaXRpbmdEb21haW4oKTsKLQkJSGVscGVyIGNvcHlIZWxwZXIgPSBuZXcgSGVscGVyKCk7Ci0JCUhlbHBlciBjb3BpZWRIZWxwZXIgPSBjb21tYW5kMi5nZXRBY3Rpdml0eUhhbmRsZXIoKS5nZXRDb3B5SGVscGVyKCk7Ci0JCVNldCBrZXlzID0gY29waWVkSGVscGVyLmtleVNldCgpOwotCQlDb21wb3VuZENvbW1hbmQgY29tbWFuZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoQ29tcG91bmRDb21tYW5kLk1FUkdFX0NPTU1BTkRfQUxMKTsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGtleXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGtleSA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCUVPYmplY3QgZW50cnkgPSAoRU9iamVjdCljb3BpZWRIZWxwZXIuZ2V0KGtleSk7Ci0JCQlpZihlbnRyeSBpbnN0YW5jZW9mIEFjdGl2aXR5ICYmIGtleSBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpZW50cnk7Ci0JCQkJLy9UT0RPOiBIYW5kbGUgZGlmZmVyZW50IGRpYWdyYW1zLgotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IElEaWFncmFtU2VydmljZS5lSW5zdGFuY2UuZ2V0RGlhZ3JhbSgoQWN0aXZpdHkpa2V5LCBEaWFncmFtU2VydmljZS5BRF9raW5kLCAKLQkJCQkJCWZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlpZihkaWFncmFtICE9IG51bGwpewotLy8JCQkJCUNvcHlEaWFncmFtRWxlbWVudENvbW1hbmQgY21kID0gbmV3IENvcHlEaWFncmFtRWxlbWVudENvbW1hbmQoCi0vLwkJCQkJCQlkb21haW4sZGlhZ3JhbS5nZXRFbGVtZW50KCksY29weUhlbHBlcixhY3QgKTsKLS8vCQkJCQljb21tYW5kLmFwcGVuZChjbWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0cnl7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJCVByb2Nlc3MgcCA9IGNvbW1hbmQyLmdldEFjdGl2aXR5SGFuZGxlcigpLmdldFRhcmdldFByb2Nlc3MoKTsKLQkJCS8vIE5lZWQgdG8gbW92ZSB0aGlzIGNvZGUgdG8gZGlmZmVyZW50IHBsYWNlLgotLy8JCQlwLmdldEJyCi0JCQlJRmlsZSBmaWxlID0gRGlhZ3JhbUVkaXRvclV0aWwuZ2V0RmlsZShkZWZhdWx0X2ZpbGVfbmFtZSwgKEJyZWFrZG93bkVsZW1lbnQpcCwgRGlhZ3JhbUZpbGVDcmVhdG9yRXguZ2V0SW5zdGFuY2UoKSk7Ci0JCQlpZihmaWxlID09IG51bGwpewotCQkJCWZpbGUgPSBjcmVhdGVOZXdEaWFncmFtRmlsZShEaWFncmFtRmlsZUNyZWF0b3JFeC5nZXRJbnN0YW5jZSgpLCBwLCBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCAKLQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfQotCQkJU2V0IHhLZXlzID0gY29weUhlbHBlci5rZXlTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHhLZXlzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbSl7Ci0JCQkJCQotCQkJCX0KLQkJCX0KLQkJCUxpc3QgYWZmZWN0ZWRGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWFmZmVjdGVkRmlsZXMuYWRkKGZpbGUpOwotCQkJQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCgKLQkJCQkJZG9tYWluLCAiY29weSBkaWFncmFtcyIsIGFmZmVjdGVkRmlsZXMpIHsKLQkJCQotCQkJCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCi0JCQl9OwotCQkJCi0JCQkKLQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCQotCQl9Ci0JCWZpbmFsbHl7Ci0JCQljb21tYW5kLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2l0aGluIGEgd29ya3NwYWNlIG1vZGlmeSBvcGVyYXRpb24gc2luY2UgaXQgY3JlYXRlcyByZXNvdXJjZXMuCi0JICogPC9wPgotCSAqIEBtb2RpZmllZAotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgZmlsZSByZXNvdXJjZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGZpbGUgd2FzIG5vdCBjcmVhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRmlsZSBjcmVhdGVOZXdEaWFncmFtRmlsZSgKLQkJCURpYWdyYW1GaWxlQ3JlYXRvckV4IGRpYWdyYW1GaWxlQ3JlYXRvciwgQnJlYWtkb3duRWxlbWVudCBlbGVtZW50LCAKLQkJCVNoZWxsIHNoZWxsLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciApIHsKLQkJCi0JCWZpbmFsIElQYXRoIGNvbnRhaW5lclBhdGggPSBnZXRDb250YWluZXJQYXRoKGVsZW1lbnQpOwotCQlmaW5hbCBTdHJpbmcgZGlhZ3JhbUZpbGVOYW1lID0gRGlhZ3JhbUZpbGVDcmVhdG9yRXguZGVmYXVsdF9kaWFncmFtX2ZpbGU7Ci0JCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soIkNyZWF0aW5nIG5vdGF0aW9uIGRpYWdyYW0gYW5kIG1vZGVsIGZpbGUiLCA0KTsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIHN1YlByb2dyZXNzTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IoCi0JCQkJcHJvZ3Jlc3NNb25pdG9yLCAxKTsKLQkJZmluYWwgSUZpbGUgZGlhZ3JhbUZpbGUgPSBkaWFncmFtRmlsZUNyZWF0b3IuY3JlYXRlTmV3RmlsZSgKLQkJCQljb250YWluZXJQYXRoLCBkaWFncmFtRmlsZU5hbWUsIAotCQkJCWdldEluaXRpYWxDb250ZW50cygpLCBzaGVsbCwKLQkJCQluZXcgSVJ1bm5hYmxlQ29udGV4dCgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKGJvb2xlYW4gZm9yaywgYm9vbGVhbiBjYW5jZWxhYmxlLAotCQkJCQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkKLQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQlydW5uYWJsZS5ydW4oc3ViUHJvZ3Jlc3NNb25pdG9yKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJLy9jcmVhdGVEaWFncmFtQ29udGVudChkaWFncmFtRmlsZSwgcHJvZ3Jlc3NNb25pdG9yLCBpbnB1dCk7Ci0JCXByb2dyZXNzTW9uaXRvci5kb25lKCk7Ci0JCXJldHVybiBkaWFncmFtRmlsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS91dGlsL0lEaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3V0aWwvSURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODUxNTAzLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3V0aWwvSURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEFkYXB0ZXIgewotCXB1YmxpYyBEaWFncmFtIGdldERpYWdyYW0oKTsKLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3V0aWwvSVZpZXdDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvdXRpbC9JVmlld0NoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MDk0ZjYuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvdXRpbC9JVmlld0NoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqICBMaXN0ZW5zIHRvIGNoYW5nZXMgaW4gVmlldy4gU2ltaWxhciB0byBPbGQgRGlhZ3JhbSBjb2RlLgotICogIFJlcGxpY2Egb2YgSU5vZGVDaGFuZ2VMaXN0ZW5lcihvZiBlcGYgZGlhZ3JhbSkKLSAqCVNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmlld0NoYW5nZUxpc3RlbmVyIGV4dGVuZHMgQWRhcHRlciB7Ci0JCi0JcHVibGljIFZpZXcgZ2V0VmlldygpOwotCQotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCk7Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS91dGlsL1VtYVVtbFV0aWwuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3V0aWwvVW1hVW1sVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDdhZjZhLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3V0aWwvVW1hVW1sVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk5hbWVkRWxlbWVudDsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIga2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVbWFVbWxVdGlsIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBVbWFVbWxVdGlsKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VW1hR3VpZEZyb21VbWxFbGVtZW50KE5hbWVkRWxlbWVudCBuZSl7Ci0JCUVBbm5vdGF0aW9uIGVBbm5vdGF0aW9uID0gbmUuZ2V0RUFubm90YXRpb24oQ29uc3RhbnRzLlVNQV9TT1VSQ0UpOwotCQlpZihlQW5ub3RhdGlvbiAhPSBudWxsKXsKLQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgZUFubm90YXRpb24uZ2V0RGV0YWlscygpLmdldCgKLQkJCQkJQ29uc3RhbnRzLlVNQV9FTEVNRU5UX0dVSUQpOwotCQkJcmV0dXJuIGd1aWQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVFQW5ub3RhdGlvbkZvclVtbChOYW1lZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGd1aWQpewotCQlpZihlbGVtZW50LmdldEVBbm5vdGF0aW9uKENvbnN0YW50cy5VTUFfU09VUkNFKSA9PSBudWxsKXsKLQkJCUVBbm5vdGF0aW9uIGVBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJZUFubm90YXRpb24uc2V0U291cmNlKENvbnN0YW50cy5VTUFfU09VUkNFKTsKLQkJCWVBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoQ29uc3RhbnRzLlVNQV9FTEVNRU5UX0dVSUQsIGd1aWQpOwotCQkJZWxlbWVudC5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoZUFubm90YXRpb24pOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVFQW5ub3RhdGlvbkZvclVtbChOYW1lZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGd1aWQpewotCQlFQW5ub3RhdGlvbiBlQW5ub3RhdGlvbiA9IGVsZW1lbnQuZ2V0RUFubm90YXRpb24oQ29uc3RhbnRzLlVNQV9TT1VSQ0UpOwotCQlpZihlQW5ub3RhdGlvbiA9PSBudWxsKXsKLQkJCWNyZWF0ZUVBbm5vdGF0aW9uRm9yVW1sKGVsZW1lbnQsIGd1aWQpOwotCQl9ZWxzZXsKLQkJCWVBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoQ29uc3RhbnRzLlVNQV9FTEVNRU5UX0dVSUQsIGd1aWQpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRVbWFFbGVtZW50KE5hbWVkRWxlbWVudCB1bWxFbGVtZW50KXsKLQotCQlTdHJpbmcgdW1hR3VpZCA9IGdldFVtYUd1aWRGcm9tVW1sRWxlbWVudCh1bWxFbGVtZW50KTsKLQkJaWYodW1hR3VpZCAhPSBudWxsICYmIHVtYUd1aWQgIT0gIiIpewotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJaWYobWFuYWdlciAhPSBudWxsKXsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQodW1hR3VpZCk7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRVbWFFbGVtZW50KFZpZXcgdmlldyl7Ci0JCQotCQlOYW1lZEVsZW1lbnQgdW1sRWxlbWVudCA9IChOYW1lZEVsZW1lbnQpdmlldy5nZXRFbGVtZW50KCk7Ci0JCVN0cmluZyB1bWFHdWlkID0gZ2V0VW1hR3VpZEZyb21VbWxFbGVtZW50KHVtbEVsZW1lbnQpOwotCQlpZih1bWFHdWlkICE9IG51bGwgJiYgdW1hR3VpZCAhPSAiIil7Ci0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZihtYW5hZ2VyICE9IG51bGwpewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudCh1bWFHdWlkKTsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVVtYU9iamVjdChWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCUVBbm5vdGF0aW9uIGVBbm5vdGF0aW9uID0gY29udGFpbmVyVmlldwotCQkJCS5nZXRFQW5ub3RhdGlvbihDb25zdGFudHMuVU1BX1NPVVJDRSk7Ci0JCVN0cmluZyBndWlkID0gKFN0cmluZykgZUFubm90YXRpb24uZ2V0RGV0YWlscygpLmdldCgKLQkJCQlDb25zdGFudHMuVU1BX0VMRU1FTlRfR1VJRCk7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQlBY3Rpdml0eSBzdWJhY3Rpdml0eSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5KCk7Ci0JCQkJKChBY3Rpdml0eSllbGVtZW50KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChzdWJhY3Rpdml0eSk7Ci0JCQkJU3RyaW5nIHN1YklkID0gVW1hVXRpbC5nZW5lcmF0ZUdVSUQoKTsKLQkJCQlzdWJhY3Rpdml0eS5zZXRHdWlkKHN1YklkKTsKLQkJCQlFQW5ub3RhdGlvbiBlQW5ub3RhdGlvbjIgPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQkJZUFubm90YXRpb24yLnNldFNvdXJjZShDb25zdGFudHMuVU1BX1NPVVJDRSk7Ci0JCQkJZUFubm90YXRpb24yLmdldERldGFpbHMoKS5wdXQoQ29uc3RhbnRzLlVNQV9FTEVNRU5UX0dVSUQsIHN1YklkKTsKLQkJCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChlQW5ub3RhdGlvbjIpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvdXRpbC9WYWxpZGF0aW9uVXRpbC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2UvdXRpbC9WYWxpZGF0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWYzMjk1Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9iYXNlL3V0aWwvVmFsaWRhdGlvblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBza2Fubm9vcgotICoKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25VdGlsIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uVXRpbCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS92aWV3L0RpYWdyYW1JbXBsLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvYmFzZS92aWV3L0RpYWdyYW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNWUxY2IuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2Jhc2Uvdmlldy9EaWFncmFtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnZpZXc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnV0aWwuRGlhZ3JhbUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnV0aWwuSURpYWdyYW1DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS51dGlsLlVtYVVtbFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk5hbWVkRWxlbWVudDsKLQotLyoqCi0gKiBFeHRlbmRlZCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uaW1wbC5EaWFncmFtSW1wbH0KLSAqIHRvIGFkZCBhZGFwdGVycyB0byBVTUEge0BsaW5rIE1ldGhvZEVsZW1lbnR9IGFuZCB7QGxpbmsgRGlhZ3JhbX0gICAKLSAqIAotICogTm90IFVzZWZ1bCAsIG5vdCBjb21wbGV0ZS4gVGVtcG9yYXJ5IHNvbHV0aW9uLiBEZWZlY3QgYXQgdGltZSBvZiByZXNvdXJjZSBsb2FkLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1JbXBsIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uaW1wbC5EaWFncmFtSW1wbCB7Ci0KLQlPYmplY3Qgb2JqZWN0OwotCXByaXZhdGUgYm9vbGVhbiBub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsgCi0JcHJpdmF0ZSBib29sZWFuIHJlYWRPbmx5ID0gZmFsc2U7Ci0JcHJvdGVjdGVkIElEaWFncmFtQ2hhbmdlTGlzdGVuZXIgZGlhZ3JhbUNoYW5nZUxpc3RlbmVyOwotCXByaXZhdGUgQWN0aXZpdHkgYmFzZUFjdDsKLQkKLQkvLyBzdGlsbCBuZWVkIHRvIHVzZSBiZWxvdyB0aGVzZQotCXByaXZhdGUgU3VwcHJlc3Npb24gc3VwcHJlc3Npb247Ci0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXI7Ci0JcHJvdGVjdGVkIElGaWx0ZXIgZmlsdGVyOwotCQotCXB1YmxpYyBEaWFncmFtSW1wbCgpIHsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5pbXBsLlZpZXdJbXBsI3NldEVsZW1lbnQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChFT2JqZWN0IG5ld0VsZW1lbnQpIHsKLQkJc3VwZXIuc2V0RWxlbWVudChuZXdFbGVtZW50KTsKLQkJLy8gQ2hlY2sgZm9yIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGFuZCByZWFkb25seS4KLQkJb2JqZWN0ID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnRGcm9tQW5ub3RhdGlvbigoRU1vZGVsRWxlbWVudCluZXdFbGVtZW50KTsKLQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQlBY3Rpdml0eSBlID0gKEFjdGl2aXR5KSBvYmplY3Q7Ci0JCQlpZiAoUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoZSkpIHsKLQkJCQliYXNlQWN0ID0gKEFjdGl2aXR5KSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCX0KLQkJCWJhc2VBY3QgPSBudWxsOwotCQkJCi0JCQlpZihkaWFncmFtQ2hhbmdlTGlzdGVuZXIgPT1udWxsKXsKLQkJCQlkaWFncmFtQ2hhbmdlTGlzdGVuZXIgPSBuZXcgQWN0aXZpdHlEaWFncmFtQ2hhbmdlTGlzdGVuZXIoZSwgdGhpcyk7Ci0JCQl9Ci0KLQkJCWlmKGRpYWdyYW1DaGFuZ2VMaXN0ZW5lciAhPSBudWxsKXsKLQkJCQllLmVBZGFwdGVycygpLmFkZChkaWFncmFtQ2hhbmdlTGlzdGVuZXIpOwotCQkJfQotCQkJCi0JCQlpZiAoYmFzZUFjdCAhPSBudWxsKSB7Ci0JCQkJYmFzZUFjdC5lQWRhcHRlcnMoKS5hZGQoZGlhZ3JhbUNoYW5nZUxpc3RlbmVyKTsKLQkJCX0KLQkJCXRoaXMuZUFkYXB0ZXJzKCkuYWRkKG5ldyBEaWFncmFtTm90YXRpb25DaGFuZ2VMaXN0ZW5lcigpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUbyBzZXQgdGhlIFVtYUVsZW1lbnQgb2JqZWN0IGNhbiBiZSB7QGxpbmsgQWN0aXZpdHl9IG9yIHtAbGluayBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcn0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbWFFbGVtZW50KE9iamVjdCBvYmplY3QpewotCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQl9Ci0JCi0KLQkvKioKLQkgKiAKLQkgKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLQkgKgotCSAqLwotCXB1YmxpYyBjbGFzcyBBY3Rpdml0eURpYWdyYW1DaGFuZ2VMaXN0ZW5lciBleHRlbmRzIERpYWdyYW1DaGFuZ2VMaXN0ZW5lcnsKLQkJcHVibGljIEFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyKE1ldGhvZEVsZW1lbnQgZSwgRGlhZ3JhbSBkKSB7Ci0JCQlzdXBlcihlLCBkKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmICghbm90aWZpY2F0aW9uRW5hYmxlZCApCi0JCQkJcmV0dXJuOwotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQkvL09iamVjdCBvYmo7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSkgewotCQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTOgotCQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGlmaWNhdGlvbiBBZGQiKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGlmaWNhdGlvbiBSZW1vdmVkIik7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGlmaWNhdGlvbiBBRERfTUFOWSIpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb3RpZmljYXRpb24gUkVNT1ZFX01BTlkiKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5NT1ZFOgotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb3RpZmljYXRpb24gTU9WRSIpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7Ci0JCQl9Ci0JCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0JICoKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRGlhZ3JhbU5vdGF0aW9uQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBBZGFwdGVySW1wbHsKLQkJCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYgKCFub3RpZmljYXRpb25FbmFibGVkKQotCQkJCXJldHVybjsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJLy9BY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldE9iamVjdCgpOwotCQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChEaWFncmFtLmNsYXNzKSkgewotCQkJCWNhc2UgTm90YXRpb25QYWNrYWdlLkRJQUdSQU1fX1BFUlNJU1RFRF9DSElMRFJFTjoKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIubm90aWZ5Q2hhbmdlZCgpOiBpbmRleD0iICsKLQkJCQkJLy8gbXNnLmdldFBvc2l0aW9uKCkpOwotCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb247Ci0JCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJCW5vZGVBZGRlZChtc2cuZ2V0UG9zaXRpb24oKSwgbXNnCi0JCQkJCQkJCS5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQkJbm9kZVJlbW92ZWQobXNnLmdldE9sZFZhbHVlKCkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3Qgbm9kZSA9ICBpdGVyLm5leHQoKTsKLQkJCQkJCQlub2RlQWRkZWQobXNnLmdldFBvc2l0aW9uKCksIG5vZGUpOwotCQkJCQkJfQotCi0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCW5vZGVSZW1vdmVkKGl0ZXIubmV4dCgpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgbm9kZUFkZGVkKGludCBwb3NpdGlvbiwgT2JqZWN0IG9iamVjdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiTm90YXRpb24gbm90aWZpY2F0aW9uIGFkZCIrb2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3lzdGVtLm91dC5wcmludGxuKCJOb3RhdGlvbiBub3RpZmljYXRpb24gcmVtb3ZlIiArIG9iamVjdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIHJlYWRPbmx5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpIHsKLQkJdGhpcy5yZWFkT25seSA9IHJlYWRPbmx5OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBleHRyYWN0Q2hpbGRyZW4oSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIsIE9iamVjdCBvYmplY3QsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJLy8gZGlzYWJsZSByb2xsdXAgYmVmb3JlIGdldHRpbmcgdGhlIGNoaWxkcmVuCi0JCS8vCi0JCWJvb2xlYW4gb2xkUm9sbGVkVXAgPSBmYWxzZTsKLQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpYWRhcHRlcjsKLQkJCW9sZFJvbGxlZFVwID0gaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCWl0ZW1Qcm92aWRlci5iYXNpY1NldFJvbGxlZFVwKGZhbHNlKTsKLQkJfQotCQllbHNlIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpewotCQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpYWRhcHRlcjsKLQkJCW9sZFJvbGxlZFVwID0gaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCWl0ZW1Qcm92aWRlci5zZXRSb2xsZWRVcChmYWxzZSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQkvLyBmaWx0ZXIgb3V0IHRoZSBzdXBwcmVzc2VkIGVsZW1lbnRzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmKCFnZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZChjaGlsZCkpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGRvbid0IGZpbHRlciBzdXBwcmVzc2VkIGVsZW1lbnRzCi0JCQkvLwotCQkJLy9jaGlsZHJlbi5hZGRBbGwoYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIHJlc3RvcmUgdGhlIHJvbGxlZC11cCBmbGFnCi0JCQkvLwotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCSgoSUJTSXRlbVByb3ZpZGVyKWFkYXB0ZXIpLnNldFJvbGxlZFVwKG9sZFJvbGxlZFVwKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oKSB7Ci0JCXJldHVybiBzdXBwcmVzc2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdXBwcmVzc2lvbihTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQl0aGlzLnN1cHByZXNzaW9uID0gc3VwcHJlc3Npb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvY29tbWFuZHMvVU1MUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2NvbW1hbmRzL1VNTFJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OWJkNDUuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvY29tbWFuZHMvVU1MUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQgZXh0ZW5kcwotCQlBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElBZGFwdGFibGUgZWRnZUFkYXB0b3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVNTFJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kKAotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGVkaXRpbmdEb21haW4sIGxhYmVsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWZmZWN0ZWRGaWxlcygpIHsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGVkZ2VBZGFwdG9yLmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRXb3Jrc3BhY2VGaWxlcyh2aWV3KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRGaWxlcygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUFkYXB0YWJsZSBnZXRFZGdlQWRhcHRvcigpIHsKLQkJcmV0dXJuIGVkZ2VBZGFwdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGdlQWRhcHRvcihJQWRhcHRhYmxlIGVkZ2VBZGFwdG9yKSB7Ci0JCXRoaXMuZWRnZUFkYXB0b3IgPSBlZGdlQWRhcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKiAJICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdCgKLQkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHsKLQkJLy8gICAgYXNzZXJ0IG51bGwgIT0gZWRnZUFkYXB0b3IgOiAiTnVsbCBjaGlsZCBpbiBVTUxSZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCI7IC8vJE5PTi1OTFMtMSQKLQkJRWRnZSBlZGdlID0gKEVkZ2UpIGdldEVkZ2VBZGFwdG9yKCkuZ2V0QWRhcHRlcihFZGdlLmNsYXNzKTsKLQkJLy8gICAgYXNzZXJ0IG51bGwgIT0gZWRnZSA6ICJOdWxsIGVkZ2UgaW4gVU1MUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0KLQkJVmlldyB0ZW1wVmlldyA9IGVkZ2UuZ2V0U291cmNlKCk7Ci0JCWVkZ2Uuc2V0U291cmNlKGVkZ2UuZ2V0VGFyZ2V0KCkpOwotCQllZGdlLnNldFRhcmdldCh0ZW1wVmlldyk7Ci0KLQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9BY3Rpdml0eUVkaXRIZWxwZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvQWN0aXZpdHlFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NjkwYmYuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9BY3Rpdml0eUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvQWN0aXZpdHlGaW5hbE5vZGVFZGl0SGVscGVyLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL0FjdGl2aXR5RmluYWxOb2RlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzJmZDA2Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvQWN0aXZpdHlGaW5hbE5vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RmluYWxOb2RlRWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2Q3YmI4Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlckFkdmljZS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyQWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNmRjMjguLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyQWR2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5oZWxwZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lZGl0aGVscGVyLkFic3RyYWN0RWRpdEhlbHBlckFkdmljZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyQWR2aWNlIGV4dGVuZHMKLQkJQWJzdHJhY3RFZGl0SGVscGVyQWR2aWNlIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL0FjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlci5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk3MzM4ZC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL0FjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXIgZXh0ZW5kcyBVTUxCYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXJBZHZpY2UuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyQWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMTg1NjkuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXJBZHZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmhlbHBlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVkaXRoZWxwZXIuQWJzdHJhY3RFZGl0SGVscGVyQWR2aWNlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlckFkdmljZSBleHRlbmRzIEFic3RyYWN0RWRpdEhlbHBlckFkdmljZSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9Db250cm9sRmxvd0VkaXRIZWxwZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvQ29udHJvbEZsb3dFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYmZlZDEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9Db250cm9sRmxvd0VkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvRGVjaXNpb25Ob2RlRWRpdEhlbHBlci5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9EZWNpc2lvbk5vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZjE2NzYuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9EZWNpc2lvbk5vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlY2lzaW9uTm9kZUVkaXRIZWxwZXIgZXh0ZW5kcyBVTUxCYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9Gb3JrTm9kZUVkaXRIZWxwZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvRm9ya05vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NTRhNmIuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9Gb3JrTm9kZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRm9ya05vZGVFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvSW5pdGlhbE5vZGVFZGl0SGVscGVyLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL0luaXRpYWxOb2RlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGFjNWFjLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvSW5pdGlhbE5vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlRWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL0pvaW5Ob2RlRWRpdEhlbHBlci5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9Kb2luTm9kZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYzOTZmNS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL0pvaW5Ob2RlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luTm9kZUVkaXRIZWxwZXIgZXh0ZW5kcyBVTUxCYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9NZXJnZU5vZGVFZGl0SGVscGVyLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL01lcmdlTm9kZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBjMTM5OC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL01lcmdlTm9kZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVyZ2VOb2RlRWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL09iamVjdE5vZGVFZGl0SGVscGVyLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL09iamVjdE5vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNWYyM2YuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9PYmplY3ROb2RlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPYmplY3ROb2RlRWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdEhlbHBlckFkdmljZS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRIZWxwZXJBZHZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzYTc1NC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdEhlbHBlckFkdmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWRpdGhlbHBlci5BYnN0cmFjdEVkaXRIZWxwZXJBZHZpY2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0SGVscGVyQWR2aWNlIGV4dGVuZHMKLQkJQWJzdHJhY3RFZGl0SGVscGVyQWR2aWNlIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMTNlZGYuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyQWR2aWNlLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyQWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZTVhZTMuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvaGVscGVycy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlckFkdmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWRpdGhlbHBlci5BYnN0cmFjdEVkaXRIZWxwZXJBZHZpY2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXJBZHZpY2UgZXh0ZW5kcwotCQlBYnN0cmFjdEVkaXRIZWxwZXJBZHZpY2UgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvVU1MQmFzZUVkaXRIZWxwZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L2hlbHBlcnMvVU1MQmFzZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1OTcyZS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9oZWxwZXJzL1VNTEJhc2VFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5oZWxwZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21wb3NpdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lZGl0aGVscGVyLkFic3RyYWN0RWRpdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuSUVkaXRDb21tYW5kUmVxdWVzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxCYXNlRWRpdEhlbHBlciBleHRlbmRzIEFic3RyYWN0RWRpdEhlbHBlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9QT0xJQ1lfQ09NTUFORCA9ICJlZGl0IHBvbGljeSBjb21tYW5kIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRJbnN0ZWFkQ29tbWFuZChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcSkgewotCQlJQ29tbWFuZCBlcENvbW1hbmQgPSAoSUNvbW1hbmQpIHJlcS5nZXRQYXJhbWV0ZXIoRURJVF9QT0xJQ1lfQ09NTUFORCk7Ci0JCXJlcS5zZXRQYXJhbWV0ZXIoRURJVF9QT0xJQ1lfQ09NTUFORCwgbnVsbCk7Ci0JCUlDb21tYW5kIGVoQ29tbWFuZCA9IHN1cGVyLmdldEluc3RlYWRDb21tYW5kKHJlcSk7Ci0JCWlmIChlcENvbW1hbmQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGVoQ29tbWFuZDsKLQkJfQotCQlpZiAoZWhDb21tYW5kID09IG51bGwpIHsKLQkJCXJldHVybiBlcENvbW1hbmQ7Ci0JCX0KLQkJQ29tcG9zaXRlQ29tbWFuZCBjb21tYW5kID0gbmV3IENvbXBvc2l0ZUNvbW1hbmQobnVsbCk7Ci0JCWNvbW1hbmQuYWRkKGVwQ29tbWFuZCk7Ci0JCWNvbW1hbmQuYWRkKGVoQ29tbWFuZCk7Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKERlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQWN0aXZpdHlFZGl0UGFydC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQWN0aXZpdHlFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzA0MDQyLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucG9saWNpZXMuQWN0aXZpdHlYWUxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuQWN0aXZpdHlDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLkFjdGl2aXR5SXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlFZGl0UGFydCBleHRlbmRzIERpYWdyYW1FZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTU9ERUxfSUQgPSAiQUQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0KLQkJLy8gbW9kaWZpZWQgU1RBUlQKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlYWUxheW91dEVkaXRQb2xpY3koKSk7Ci0JCS8vIG1vZGlmaWVkIEVORAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTBmNzMyLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5BY3Rpdml0eUZpbmFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuQWN0aXZpdHlGaW5hbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5BY3Rpdml0eUZpbmFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuVU1MRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuTGF5ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAwMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBBY3Rpdml0eUZpbmFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlGaW5hbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eUZpbmFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlQ2hpbGQoRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlpZiAoaXNFeHRlcm5hbExhYmVsKGNoaWxkKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXN1cGVyLmRlY29yYXRlQ2hpbGQoY2hpbGQpOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJVU1MRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kgeGxlcCA9IG5ldyBVTUxFeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHRlcm5hbExhYmVsKEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQudGhpcy5pc0V4dGVybmFsTGFiZWwoZWRpdFBhcnQpOwotCQkJfQotCQl9OwotCQl4bGVwLnNldFJlYWxMYXlvdXRFZGl0UG9saWN5KGxlcCk7Ci0JCXJldHVybiB4bGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCUVuZE5vZGVGaWd1cmUgZmlndXJlID0gbmV3IEVuZE5vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVuZE5vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKEVuZE5vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkuRFB0b0xQKDI0KSwgZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCgyNCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShBY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHRlcm5hbExhYmVsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRFeHRlcm5hbExhYmVsc0NvbnRhaW5lcigpIHsKLQkJTGF5ZXJNYW5hZ2VyIHJvb3QgPSAoTGF5ZXJNYW5hZ2VyKSBnZXRSb290KCk7Ci0JCXJldHVybiByb290LmdldExheWVyKFVNTEVkaXRQYXJ0RmFjdG9yeS5FWFRFUk5BTF9OT0RFX0xBQkVMU19MQVlFUik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgewotCQlpZiAoaXNFeHRlcm5hbExhYmVsKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlJRmlndXJlIGxhYmVsRmlndXJlID0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJLmdldEZpZ3VyZSgpOwotCQkJZ2V0RXh0ZXJuYWxMYWJlbHNDb250YWluZXIoKS5hZGQobGFiZWxGaWd1cmUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAoaXNFeHRlcm5hbExhYmVsKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlJRmlndXJlIGxhYmVsRmlndXJlID0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJLmdldEZpZ3VyZSgpOwotCQkJZ2V0RXh0ZXJuYWxMYWJlbHNDb250YWluZXIoKS5yZW1vdmUobGFiZWxGaWd1cmUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVOb3RpZnkoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQgPSAoRWRpdFBhcnQpIGl0Lm5leHQoKTsKLQkJCWlmIChpc0V4dGVybmFsTGFiZWwoY2hpbGRFZGl0UGFydCkpIHsKLQkJCQlJRmlndXJlIGxhYmVsRmlndXJlID0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJCS5nZXRGaWd1cmUoKTsKLQkJCQlnZXRFeHRlcm5hbExhYmVsc0NvbnRhaW5lcigpLnJlbW92ZShsYWJlbEZpZ3VyZSk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIucmVtb3ZlTm90aWZ5KCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIGNsYXNzIEVuZE5vZGVGaWd1cmUgZXh0ZW5kcwotCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuZmlndXJlcy5FbmROb2RlRmlndXJlIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIEVuZE5vZGVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5kYXJrQmx1ZQotCi0JCQkpOwotCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRU5ETk9ERUZJR1VSRV9CQUNLCi0KLQkJCSk7Ci0KLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBFTkROT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKAotCQkJbnVsbCwgNDUsIDg1LCAxMzApOwotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ2ODA0Ny4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5FUEZEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0IGV4dGVuZHMgVU1MRXh0Tm9kZUxhYmVsRWRpdFBhcnQKLQkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXN0YXRpYyB7Ci0JCXJlZ2lzdGVyU25hcEJhY2tQb3NpdGlvbihVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwgbmV3IFBvaW50KDAsCi0JCQkJMCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGdldEVkaXRUZXh0KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlGaW5hbE5vZGVfMTAwMTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0RGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIFVNTEVkaXRQYXJ0RmFjdG9yeQotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlJRmlndXJlIGxhYmVsID0gY3JlYXRlRmlndXJlUHJpbSgpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihsYWJlbCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlUHJpbSgpIHsKLQkJcmV0dXJuIG5ldyBXcmFwTGFiZWwoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZmFhNjcuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcmFtZXRlck5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcmFtZXRlck5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMTI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcmFtZXRlck5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5HUkFQSElDQUxfTk9ERV9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcmFtZXRlck5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCUFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0KSB7Ci0JCQkoKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpCi0JCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQotCQkJCQkJCS5nZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7Ci0JCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUgZXh0ZW5kcwotCQkJb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0T3V0bGluZShmYWxzZSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOwotCi0JCQlEaWFncmFtQ29yZVV0aWwuc2V0TGFiZWxQcm9wZXJ0aWVzKGZpZ18wKTsKLQkJCXNldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbChmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoKSB7Ci0JCQlyZXR1cm4gZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKAotCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpIHsKLQkJCWZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY0YmJkZS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFyYW1ldGVyTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydCkgewotCQkJKChBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpCi0JCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQotCQkJCQkJCS5nZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSBleHRlbmRzCi0JCQlvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7Ci0KLQkJCURpYWdyYW1Db3JlVXRpbC5zZXRMYWJlbFByb3BlcnRpZXMoZmlnXzApOwotCQkJc2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKGZpZ18wKTsKLQotCQkJT2JqZWN0IGxheURhdGEwID0gbnVsbDsKLQotCQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCgpIHsKLQkJCXJldHVybiBmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoCi0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZykgewotCQkJZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCA9IGZpZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU3ZGYzMS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTm9uUmVzaXphYmxlSGFuZGxlS2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5WYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuRVBGRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQKLQkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMTE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwTGFiZWwgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJLy9yZXR1cm4gbnVsbDsKLQkJcmV0dXJuIEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgKLQkJImRpYWdyYW0vbWlsZXN0b25lLmdpZiIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCWlmKERpYWdyYW1Db3JlVXRpbC5pc1JlYWRPbmx5KHRoaXMpKSByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBWYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwgVU1MRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpewotCi0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQkJCQkJCSgoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydClnZXRFZGl0UGFydCgpKS5wZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQkJCQlyZXR1cm4gRGlhZ3JhbUNvcmVVdGlsLnZhbGlkU3RyaW5nRm9yQnJlYWtkb3duRWxlbWVudHMoZ2V0RWRpdFBhcnQoKSwgdHh0KTsKLQkJCQkJCX0KLQkJCQkKLQkJCX0pOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIGMgPSBEaWFncmFtQ29yZVV0aWwuZ2V0Rm9udENvbG9yKHRoaXMpOwotCQlpZihjICE9IG51bGwpIHsKLQkJCWNvbG9yID0gYzsKLQkJfQotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQkKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM4MWI3ZS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5WYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0Ci0JCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDA4OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwTGFiZWwgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJLy8JCXJldHVybiBudWxsOwotCQlyZXR1cm4gRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKAotCQkJCSJkaWFncmFtL3Rhc2tkZXNjcmlwdG9yLmdpZiIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCWlmKERpYWdyYW1Db3JlVXRpbC5pc1JlYWRPbmx5KHRoaXMpKSByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5OwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBWYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwgVU1MRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpewotCi0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQkJCQkJCSgoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0KWdldEVkaXRQYXJ0KCkpLnBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHR4dCkgewotCQkJCQkJCXJldHVybiBEaWFncmFtQ29yZVV0aWwudmFsaWRTdHJpbmdGb3JCcmVha2Rvd25FbGVtZW50cyhnZXRFZGl0UGFydCgpLCB0eHQpOwotCQkJCQkJfQotCQkJCQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJQ29sb3IgYyA9IERpYWdyYW1Db3JlVXRpbC5nZXRGb250Q29sb3IodGhpcyk7Ci0JCWlmKGMgIT0gbnVsbCkgewotCQkJY29sb3IgPSBjOwotCQl9Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDcxZWM2Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uMkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb24yR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb24ySXRlbVNlbWFudGljRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVTaGFwZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuWFlMYXlvdXRFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDIwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb24yR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb24yQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJWFlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBYWUxheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gc3VwZXIuY3JlYXRlQ2hpbGRFZGl0UG9saWN5KGNoaWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG5ldyBSZXNpemFibGVTaGFwZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSBmaWd1cmUgPSBuZXcgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydCkgewotCQkJKChBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpLmdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBGcmVlZm9ybUxheW91dCgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0Q29uc3RyYWludChJRmlndXJlIGZpZ3VyZSkgewotCQkJCQlPYmplY3QgcmVzdWx0ID0gY29uc3RyYWludHMuZ2V0KGZpZ3VyZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQkJcmVzdWx0ID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAtMSwgLTEpOwotCQkJCQl9Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlIGV4dGVuZHMKLQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUoKSB7Ci0KLQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dCBteUdlbkxheW91dE1hbmFnZXIgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0KCk7Ci0KLQkJCXRoaXMuc2V0TGF5b3V0TWFuYWdlcihteUdlbkxheW91dE1hbmFnZXIpOwotCi0JCQl0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuYmxhY2sKLQotCQkJKTsKLQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKEFDVElWSVRZUEFSVElUSU9ORklHVVJFX0JBQ0sKLQotCQkJKTsKLQkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDQwMCksIGdldE1hcE1vZGUoKQotCQkJCQkuRFB0b0xQKDgwMCkpOwotCQkJdGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMDApKTsKLQkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcigpKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOwotCi0JCQlzZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZShmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZlBhcnRpdGlvbkxhYmVsRmlndXJlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKCkgewotCQkJcmV0dXJuIGZQYXJ0aXRpb25MYWJlbEZpZ3VyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoCi0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZykgewotCQkJZlBhcnRpdGlvbkxhYmVsRmlndXJlID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcigKLQkJCW51bGwsIDI1NSwgMjU1LCAyNTUpOwotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlN2E0ODcuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvbkNyZWF0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvbkRlbGVnYXRpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvbkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb25HcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvbkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZVNoYXBlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5YWUxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS51dGlsLk1lYXN1cmVtZW50VW5pdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5HcmF2aXR5Q29uc3RyYWluZWRGbG93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkdyYXZpdHlEaXJlY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5tYXBtb2RlLklNYXBNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDg7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGlvbkVkaXRQb2xpY3koKSk7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJcmVtb3ZlRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koCi0JCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb25DYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvbkxheW91dEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KAotCQkJCUVkaXRQb2xpY3kuQ09OVEFJTkVSX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uRGVsZWdhdGlvbkVkaXRQb2xpY3koCi0JCQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCQkJRWRpdFBvbGljeS5DT05UQUlORVJfUk9MRSkpOwotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCVhZTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgWFlMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IHN1cGVyLmNyZWF0ZUNoaWxkRWRpdFBvbGljeShjaGlsZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBuZXcgUmVzaXphYmxlU2hhcGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUgZmlndXJlID0gbmV3IEFjdGl2aXR5UGFydGl0aW9uRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0KSB7Ci0JCQkoKEFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpLmdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobmV3IEdyYXZpdHlDb25zdHJhaW5lZEZsb3dMYXlvdXQoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldENvbnN0cmFpbnQoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJCQkJLy8JCQkJCU9iamVjdCByZXN1bHQgPSBjb25zdHJhaW50cy5nZXQoZmlndXJlKTsKLQkJCQkJLy8JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQkvLwkJCQkJCXJlc3VsdCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgLTEsIC0xKTsKLQkJCQkJLy8JCQkJCX0KLQkJCQkJLy8JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCXJldHVybiBzdXBlci5nZXRDb25zdHJhaW50KGZpZ3VyZSk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgc2V0R3Jhdml0eShHcmF2aXR5RGlyZWN0aW9uVHlwZSBncmF2aXR5KSB7Ci0JCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCQkJc3VwZXIuc2V0R3Jhdml0eShHcmF2aXR5RGlyZWN0aW9uVHlwZS5FQVNUKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlIGV4dGVuZHMKLQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUoKSB7Ci0KLQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dCBteUdlbkxheW91dE1hbmFnZXIgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0KCk7Ci0KLQkJCXRoaXMuc2V0TGF5b3V0TWFuYWdlcihteUdlbkxheW91dE1hbmFnZXIpOwotCi0JCQl0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuYmxhY2sKLQotCQkJKTsKLQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKEFDVElWSVRZUEFSVElUSU9ORklHVVJFX0JBQ0sKLQotCQkJKTsKLQkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDQwMCksIGdldE1hcE1vZGUoKQotCQkJCQkuRFB0b0xQKDgwMCkpOwotCQkJdGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMDApKTsKLQkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcigpKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOwotCi0JCQlzZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZShmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZlBhcnRpdGlvbkxhYmVsRmlndXJlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKCkgewotCQkJcmV0dXJuIGZQYXJ0aXRpb25MYWJlbEZpZ3VyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoCi0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZykgewotCQkJZlBhcnRpdGlvbkxhYmVsRmlndXJlID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcigKLQkJCW51bGwsIDI1NSwgMjU1LCAyNTUpOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUVkaXRQYXJ0I3JlZnJlc2hWaXN1YWxzKCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJTm9kZSB2aWV3ID0gKE5vZGUpIGdldENoaWxkVmlld0J5U2VtYW50aWNIaW50KG5ldyBJbnRlZ2VyKAotCQkJCUFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCkpOwotCQlOb2RlIHBhcmVudFZpZXcgPSAoTm9kZSkgZ2V0TW9kZWwoKTsKLQkJTG9jYXRpb24gbG9jYXRpb24gPSAoTG9jYXRpb24pIHZpZXcuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQlpZiAobG9jYXRpb24uZ2V0WCgpID4gMCkgewotCQkJSU1hcE1vZGUgbWFwTW9kZSA9IE1lYXN1cmVtZW50VW5pdEhlbHBlci5nZXRNYXBNb2RlKHBhcmVudFZpZXcKLQkJCQkJLmdldERpYWdyYW0oKS5nZXRNZWFzdXJlbWVudFVuaXQoKSk7Ci0JCQlsb2NhdGlvbi5zZXRYKG1hcE1vZGUuRFB0b0xQKDApKTsKLQkJCWxvY2F0aW9uLnNldFkobWFwTW9kZS5EUHRvTFAoNSkpOwotCQl9Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0RWRpdFBhcnQjcmVmcmVzaENoaWxkcmVuKCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ2hpbGRyZW4oKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIucmVmcmVzaENoaWxkcmVuKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjRkOGNkLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5FUEZEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQKLQkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDc7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBMYWJlbCBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0SXRlbUltYWdlRGVzY3JpcHRvcihnZXRQYXJzZXJFbGVtZW50KCkpOwotCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzEwMDg7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBVTUxFZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJcmVmcmVzaEJvdW5kcygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsKLQkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOwotCQlEaW1lbnNpb24gc2l6ZSA9IG5ldyBEaW1lbnNpb24od2lkdGgsIGhlaWdodCk7Ci0JCWludCB4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQlQb2ludCBsb2MgPSBuZXcgUG9pbnQoeCwgeSk7Ci0JCSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5zZXRMYXlvdXRDb25zdHJhaW50KHRoaXMsCi0JCQkJZ2V0RmlndXJlKCksIG5ldyBSZWN0YW5nbGUobG9jLCBzaXplKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaEJvdW5kcygpOwotCQl9Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTIyNGRlLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0Ci0JCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDA2OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBMYWJlbCBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0SXRlbUltYWdlRGVzY3JpcHRvcihnZXRQYXJzZXJFbGVtZW50KCkpOwotCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzIwMDE7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBVTUxFZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJcmVmcmVzaEJvdW5kcygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsKLQkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOwotCQlEaW1lbnNpb24gc2l6ZSA9IG5ldyBEaW1lbnNpb24od2lkdGgsIGhlaWdodCk7Ci0JCWludCB4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQlQb2ludCBsb2MgPSBuZXcgUG9pbnQoeCwgeSk7Ci0JCSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5zZXRMYXlvdXRDb25zdHJhaW50KHRoaXMsCi0JCQkJZ2V0RmlndXJlKCksIG5ldyBSZWN0YW5nbGUobG9jLCBzaXplKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaEJvdW5kcygpOwotCQl9Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y2MGVlNS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0IGV4dGVuZHMKLQkJU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7Ci0JCXJldHVybiAiUGFydGl0aW9uQ2FtcGFydG1lbnQiOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXIKLQkJCQkuY3JlYXRlRmlndXJlKCk7Ci0JCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KAotCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLAotCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwKLQkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLy9wdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JLy8JSUZpZ3VyZSByZXN1bHQgPSBzdXBlci5jcmVhdGVGaWd1cmUoKTsKLQkvLwlyZXN1bHQuc2V0Qm9yZGVyKG5ldyBMaW5lQm9yZGVyKCkpOwotCS8vCXJldHVybiByZXN1bHQ7Ci0JLy99Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoQm91bmRzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQobm90aWZpY2F0aW9uKTsKLQkJT2JqZWN0IGZlYXR1cmUgPSBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaEJvdW5kcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hCb3VuZHMoKSB7Ci0JCWludCB3aWR0aCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfV2lkdGgoKSkpLmludFZhbHVlKCk7Ci0JCWludCBoZWlnaHQgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRTaXplX0hlaWdodCgpKSkuaW50VmFsdWUoKTsKLQkJRGltZW5zaW9uIHNpemUgPSBuZXcgRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpOwotCQlpbnQgeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7Ci0JCWludCB5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsKLQkJUG9pbnQgbG9jID0gbmV3IFBvaW50KHgsIHkpOwotCQkoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuc2V0TGF5b3V0Q29uc3RyYWludCh0aGlzLAotCQkJCWdldEZpZ3VyZSgpLCBuZXcgUmVjdGFuZ2xlKGxvYywgc2l6ZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsKLQkJLy8gbm90aGluZyB0byBkbyAtLSBwYXJlbnQgbGF5b3V0IGRvZXMgbm90IGFjY2VwdCBEb3VibGUgY29uc3RyYWludHMgYXMgcmF0aW8KLQkJLy8gc3VwZXIuc2V0UmF0aW8ocmF0aW8pOyAKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTY1YWJlLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ29udGFpbmVyTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5YWUxheW91dEVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0IGV4dGVuZHMKLQkJU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsKLQkJcmV0dXJuICJQYXJ0aXRpb25DYW1wYXJ0bWVudCI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcgotCQkJCS5jcmVhdGVGaWd1cmUoKTsKLQkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeSgKLQkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLAotCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwKLQkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IENvbnRhaW5lck5vZGVFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBuZXcgWFlMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvL3B1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkvLwlJRmlndXJlIHJlc3VsdCA9IHN1cGVyLmNyZWF0ZUZpZ3VyZSgpOwotCS8vCXJlc3VsdC5zZXRCb3JkZXIobmV3IExpbmVCb3JkZXIoKSk7Ci0JLy8JcmV0dXJuIHJlc3VsdDsKLQkvL30KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hCb3VuZHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChub3RpZmljYXRpb24pOwotCQlPYmplY3QgZmVhdHVyZSA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoQm91bmRzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsKLQkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOwotCQlEaW1lbnNpb24gc2l6ZSA9IG5ldyBEaW1lbnNpb24od2lkdGgsIGhlaWdodCk7Ci0JCWludCB4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQlQb2ludCBsb2MgPSBuZXcgUG9pbnQoeCwgeSk7Ci0JCSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5zZXRMYXlvdXRDb25zdHJhaW50KHRoaXMsCi0JCQkJZ2V0RmlndXJlKCksIG5ldyBSZWN0YW5nbGUobG9jLCBzaXplKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgewotCQkvLyBub3RoaW5nIHRvIGRvIC0tIHBhcmVudCBsYXlvdXQgZG9lcyBub3QgYWNjZXB0IERvdWJsZSBjb25zdHJhaW50cyBhcyByYXRpbwotCQkvLyBzdXBlci5zZXRSYXRpbyhyYXRpbyk7IAotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0NvbnRyb2xGbG93RWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0NvbnRyb2xGbG93RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4ZWE3ZC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9Db250cm9sRmxvd0VkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLkNvbnRyb2xGbG93SXRlbVNlbWFudGljRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dFZGl0UGFydCBleHRlbmRzIENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRyb2xGbG93RWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBDb250cm9sRmxvd0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZSgpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sRmxvd0ZpZ3VyZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dGaWd1cmUgZXh0ZW5kcwotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuUG9seWxpbmVDb25uZWN0aW9uRXggewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQ29udHJvbEZsb3dGaWd1cmUoKSB7Ci0KLQkJCXNldFRhcmdldERlY29yYXRpb24oY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpIHsKLQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gZGYgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbigpOwotCQkJLy8gZGlzcGF0Y2hOZXh0PwotCi0JCQlvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0IHBsID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QoKTsKLQkJCXBsLmFkZFBvaW50KC0xLCAxKTsKLQkJCXBsLmFkZFBvaW50KDAsIDApOwotCQkJcGwuYWRkUG9pbnQoLTEsIC0xKTsKLQkJCWRmLnNldFRlbXBsYXRlKHBsKTsKLQkJCWRmLnNldFNjYWxlKGdldE1hcE1vZGUoKS5EUHRvTFAoNyksIGdldE1hcE1vZGUoKS5EUHRvTFAoMykpOwotCi0JCQlyZXR1cm4gZGY7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0NvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNGI4YzYuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sRmxvd05hbWVFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgaW1wbGVtZW50cwotCQlJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMTI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXN0YXRpYyB7Ci0JCXJlZ2lzdGVyU25hcEJhY2tQb3NpdGlvbihVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwgbmV3IFBvaW50KDAsIDQwKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250cm9sRmxvd05hbWVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0S2V5UG9pbnQoKSB7Ci0JCXJldHVybiBDb25uZWN0aW9uTG9jYXRvci5NSURETEU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotLy8JCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0vLwkJCQkuZ2V0SXRlbUltYWdlRGVzY3JpcHRvcihnZXRQYXJzZXJFbGVtZW50KCkpOwotLy8JCWlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLS8vCQkJZGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0vLwkJfQotLy8JCXJldHVybiBkZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDE7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBVTUxFZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJSUZpZ3VyZSBsYWJlbCA9IGNyZWF0ZUZpZ3VyZVByaW0oKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbEZsb3dMYWJlbEZpZ3VyZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dMYWJlbEZpZ3VyZSBleHRlbmRzCi0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQ29udHJvbEZsb3dMYWJlbEZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRUZXh0KCIiKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvRGVjaXNpb25Ob2RlRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0RlY2lzaW9uTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZjY3M2YuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvRGVjaXNpb25Ob2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5maWd1cmVzLkRlY2lzaW9uTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5EZWNpc2lvbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLkRlY2lzaW9uTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLkRlY2lzaW9uTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICogQG1vZGlmaWVkIGJ5IFNoYXNoaWRoYXIgS2Fubm9vcmkuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDA1OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVjaXNpb25Ob2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBEZWNpc2lvbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IERlY2lzaW9uTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IERlY2lzaW9uTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCURlY2lzaW9uRGlhbW9uZEZpZ3VyZSBmaWd1cmUgPSBuZXcgRGVjaXNpb25EaWFtb25kRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKERlY2lzaW9uRGlhbW9uZEZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJcmV0dXJuIG5ldyBEZWNpc2lvbk5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBjbGFzcyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUgZXh0ZW5kcyBEZWNpc2lvbk5vZGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXB1YmxpYyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUoKSB7Ci0KLQkJCXN1cGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwKLQkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOwotCQkJdGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmRhcmtCbHVlCi0KLQkJCSk7Ci0KLQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKERFQ0lTSU9ORElBTU9OREZJR1VSRV9CQUNLKTsKLQotCQkJdGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKAotCQkJCQk1MCkpOwotCQkJdGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSk7Ci0KLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOwotCi0JCQlzZXRGaWd1cmVEaWFtb25kTGFiZWwoZmlnXzApOwotCi0JCQlPYmplY3QgbGF5RGF0YTAgPSBudWxsOwotCi0JCQl0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZEaWFtb25kTGFiZWw7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlRGlhbW9uZExhYmVsKCkgewotCQkJcmV0dXJuIGZEaWFtb25kTGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNldEZpZ3VyZURpYW1vbmRMYWJlbCgKLQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKSB7Ci0JCQlmRGlhbW9uZExhYmVsID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBERUNJU0lPTkRJQU1PTkRGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IoCi0JCQludWxsLCAxODUsIDIwNSwgMjMwKTsKLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9EZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA4MTk3Yy4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9EZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5FUEZEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlY2lzaW9uTm9kZU5hbWVFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cwotCQlJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLkRlY2lzaW9uTm9kZV8xMDA1OwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwgVU1MRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlJRmlndXJlIGxhYmVsID0gY3JlYXRlRmlndXJlUHJpbSgpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihsYWJlbCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlUHJpbSgpIHsKLQkJcmV0dXJuIG5ldyBOb2RlTmFtZUZpZ3VyZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTm9kZU5hbWVGaWd1cmUgZXh0ZW5kcwotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIE5vZGVOYW1lRmlndXJlKCkgewotCi0JCQl0aGlzLnNldFRleHQoIjwuLi4+Iik7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0ZvcmtOb2RlRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0ZvcmtOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxY2I2Yy4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9Gb3JrTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuRm9ya05vZGVDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLkZvcmtOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuRm9ya05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuUmVzaXphYmxlRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRm9ya05vZGVFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRm9ya05vZGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEZvcmtOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5HUkFQSElDQUxfTk9ERV9ST0xFLAotCQkJCW5ldyBGb3JrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IEZvcmtOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJRm9ya05vZGVGaWd1cmUgZmlndXJlID0gbmV3IEZvcmtOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGb3JrTm9kZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoRm9ya05vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg4KSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UG9saWN5IGdldFByaW1hcnlEcmFnRWRpdFBvbGljeSgpIHsKLQkJUmVzaXphYmxlRWRpdFBvbGljeSBlcCA9IChSZXNpemFibGVFZGl0UG9saWN5KSBzdXBlcgotCQkJCS5nZXRQcmltYXJ5RHJhZ0VkaXRQb2xpY3koKTsKLQotCQllcC5zZXRSZXNpemVEaXJlY3Rpb25zKFBvc2l0aW9uQ29uc3RhbnRzLldFU1QgfCBQb3NpdGlvbkNvbnN0YW50cy5FQVNUKTsKLQotCQlyZXR1cm4gZXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBGb3JrTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgRm9ya05vZGVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKEZPUktOT0RFRklHVVJFX0JBQ0sKLQotCQkJKTsKLQkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMCksIGdldE1hcE1vZGUoKQotCQkJCQkuRFB0b0xQKDgpKTsKLQkJCXRoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoOCkpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIEZPUktOT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKAotCQkJbnVsbCwgNTEsIDEwMiwgMTAyKTsKLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvRm9ya05vZGVOYW1lRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0ZvcmtOb2RlTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OGIxODMuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvRm9ya05vZGVOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5FUEZEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZvcmtOb2RlTmFtZUVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydCBpbXBsZW1lbnRzCi0JCUlUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZvcmtOb2RlTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZ2V0RWRpdFRleHQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5Gb3JrTm9kZV8xMDAzOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwgVU1MRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlJRmlndXJlIGxhYmVsID0gY3JlYXRlRmlndXJlUHJpbSgpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihsYWJlbCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlUHJpbSgpIHsKLQkJcmV0dXJuIG5ldyBOb2RlTmFtZUZpZ3VyZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTm9kZU5hbWVGaWd1cmUgZXh0ZW5kcwotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIE5vZGVOYW1lRmlndXJlKCkgewotCi0JCQl0aGlzLnNldFRleHQoIjwuLi4+Iik7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0luaXRpYWxOb2RlRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0luaXRpYWxOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1ODUzYS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9Jbml0aWFsTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5Jbml0aWFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuSW5pdGlhbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5Jbml0aWFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuVU1MRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5MYXllck1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0aWFsTm9kZUVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbml0aWFsTm9kZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgSW5pdGlhbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IEluaXRpYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgSW5pdGlhbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZUNoaWxkKEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJaWYgKGlzRXh0ZXJuYWxMYWJlbChjaGlsZCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlzdXBlci5kZWNvcmF0ZUNoaWxkKGNoaWxkKTsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCVVNTEV4dE5vZGVMYWJlbEhvc3RMYXlvdXRFZGl0UG9saWN5IHhsZXAgPSBuZXcgVU1MRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBib29sZWFuIGlzRXh0ZXJuYWxMYWJlbChFZGl0UGFydCBlZGl0UGFydCkgewotCQkJCXJldHVybiBJbml0aWFsTm9kZUVkaXRQYXJ0LnRoaXMuaXNFeHRlcm5hbExhYmVsKGVkaXRQYXJ0KTsKLQkJCX0KLQkJfTsKLQkJeGxlcC5zZXRSZWFsTGF5b3V0RWRpdFBvbGljeShsZXApOwotCQlyZXR1cm4geGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlJbml0aWFsTm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgSW5pdGlhbE5vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluaXRpYWxOb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChJbml0aWFsTm9kZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLCBnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDIwKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4dGVybmFsTGFiZWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0KSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGdldEV4dGVybmFsTGFiZWxzQ29udGFpbmVyKCkgewotCQlMYXllck1hbmFnZXIgcm9vdCA9IChMYXllck1hbmFnZXIpIGdldFJvb3QoKTsKLQkJcmV0dXJuIHJvb3QuZ2V0TGF5ZXIoVU1MRWRpdFBhcnRGYWN0b3J5LkVYVEVSTkFMX05PREVfTEFCRUxTX0xBWUVSKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7Ci0JCWlmIChpc0V4dGVybmFsTGFiZWwoY2hpbGRFZGl0UGFydCkpIHsKLQkJCUlGaWd1cmUgbGFiZWxGaWd1cmUgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuZ2V0RmlndXJlKCk7Ci0JCQlnZXRFeHRlcm5hbExhYmVsc0NvbnRhaW5lcigpLmFkZChsYWJlbEZpZ3VyZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChpc0V4dGVybmFsTGFiZWwoY2hpbGRFZGl0UGFydCkpIHsKLQkJCUlGaWd1cmUgbGFiZWxGaWd1cmUgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuZ2V0RmlndXJlKCk7Ci0JCQlnZXRFeHRlcm5hbExhYmVsc0NvbnRhaW5lcigpLnJlbW92ZShsYWJlbEZpZ3VyZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU5vdGlmeSgpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRWRpdFBhcnQgY2hpbGRFZGl0UGFydCA9IChFZGl0UGFydCkgaXQubmV4dCgpOwotCQkJaWYgKGlzRXh0ZXJuYWxMYWJlbChjaGlsZEVkaXRQYXJ0KSkgewotCQkJCUlGaWd1cmUgbGFiZWxGaWd1cmUgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkJLmdldEZpZ3VyZSgpOwotCQkJCWdldEV4dGVybmFsTGFiZWxzQ29udGFpbmVyKCkucmVtb3ZlKGxhYmVsRmlndXJlKTsKLQkJCX0KLQkJfQotCQlzdXBlci5yZW1vdmVOb3RpZnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEluaXRpYWxOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLkVsbGlwc2UgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgSW5pdGlhbE5vZGVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5kYXJrQmx1ZQotCi0JCQkpOwotCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoSU5JVElBTE5PREVGSUdVUkVfQkFDSwotCi0JCQkpOwotCQkJdGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgSU5JVElBTE5PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IoCi0JCQludWxsLCAxODUsIDIwNSwgMjMwKTsKLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0luaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNTI3MDUuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuRVBGRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0aWFsTm9kZU5hbWVFZGl0UGFydCBleHRlbmRzIFVNTEV4dE5vZGVMYWJlbEVkaXRQYXJ0IGltcGxlbWVudHMKLQkJSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlzdGF0aWMgewotCQlyZWdpc3RlclNuYXBCYWNrUG9zaXRpb24oVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksIG5ldyBQb2ludCgwLCAwKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbml0aWFsTm9kZU5hbWVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZ2V0RWRpdFRleHQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsTm9kZV8xMDA0OwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwgVU1MRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUlGaWd1cmUgbGFiZWwgPSBjcmVhdGVGaWd1cmVQcmltKCk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGxhYmVsKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmVQcmltKCkgewotCQlyZXR1cm4gbmV3IFdyYXBMYWJlbCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvSm9pbk5vZGVFZGl0UGFydC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvSm9pbk5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTNjOWIyLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL0pvaW5Ob2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5Kb2luTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuSm9pbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5Kb2luTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5SZXNpemFibGVFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luTm9kZUVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDY7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKb2luTm9kZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgSm9pbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IEpvaW5Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgSm9pbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlGb3JrTm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgRm9ya05vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZvcmtOb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChGb3JrTm9kZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQb2xpY3kgZ2V0UHJpbWFyeURyYWdFZGl0UG9saWN5KCkgewotCQlSZXNpemFibGVFZGl0UG9saWN5IGVwID0gKFJlc2l6YWJsZUVkaXRQb2xpY3kpIHN1cGVyCi0JCQkJLmdldFByaW1hcnlEcmFnRWRpdFBvbGljeSgpOwotCi0JCWVwLnNldFJlc2l6ZURpcmVjdGlvbnMoUG9zaXRpb25Db25zdGFudHMuV0VTVCB8IFBvc2l0aW9uQ29uc3RhbnRzLkVBU1QpOwotCi0JCXJldHVybiBlcDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEZvcmtOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBGb3JrTm9kZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRk9SS05PREVGSUdVUkVfQkFDSwotCi0JCQkpOwotCQkJdGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpCi0JCQkJCS5EUHRvTFAoOCkpOwotCQkJdGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgRk9SS05PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IoCi0JCQludWxsLCA1MSwgMTAyLCAxMDIpOwotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9Kb2luTm9kZU5hbWVFZGl0UGFydC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvSm9pbk5vZGVOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRiZTM2Ni4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9Kb2luTm9kZU5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSm9pbk5vZGVOYW1lRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0IGltcGxlbWVudHMKLQkJSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDA2OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSm9pbk5vZGVOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLkpvaW5Ob2RlXzEwMDY7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBVTUxFZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUlGaWd1cmUgbGFiZWwgPSBjcmVhdGVGaWd1cmVQcmltKCk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGxhYmVsKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmVQcmltKCkgewotCQlyZXR1cm4gbmV3IE5vZGVOYW1lRmlndXJlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBOb2RlTmFtZUZpZ3VyZSBleHRlbmRzCi0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTm9kZU5hbWVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0VGV4dCgiPC4uLj4iKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvTWVyZ2VOb2RlRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL01lcmdlTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MzA5MjcuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvTWVyZ2VOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5maWd1cmVzLkRlY2lzaW9uTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5NZXJnZU5vZGVDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLk1lcmdlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLk1lcmdlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQG1vZGlmaWVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXJnZU5vZGVFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVyZ2VOb2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBNZXJnZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IE1lcmdlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IE1lcmdlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCURlY2lzaW9uRGlhbW9uZEZpZ3VyZSBmaWd1cmUgPSBuZXcgRGVjaXNpb25EaWFtb25kRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKERlY2lzaW9uRGlhbW9uZEZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJcmV0dXJuIG5ldyBEZWNpc2lvbk5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIG1vZGlmaWVkCi0JICovCi0JcHVibGljIGNsYXNzIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSBleHRlbmRzIERlY2lzaW9uTm9kZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHVibGljIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSgpIHsKLQotCQkJc3VwZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLAotCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSk7Ci0JCQl0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUKLQotCQkJKTsKLQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKERFQ0lTSU9ORElBTU9OREZJR1VSRV9CQUNLKTsKLQkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgKLQkJCQkJNTApKTsKLQkJCXRoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOwotCi0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsKLQotCQkJc2V0RmlndXJlRGlhbW9uZExhYmVsKGZpZ18wKTsKLQotCQkJT2JqZWN0IGxheURhdGEwID0gbnVsbDsKLQotCQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmRGlhbW9uZExhYmVsOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZURpYW1vbmRMYWJlbCgpIHsKLQkJCXJldHVybiBmRGlhbW9uZExhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVEaWFtb25kTGFiZWwoCi0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZykgewotCQkJZkRpYW1vbmRMYWJlbCA9IGZpZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgREVDSVNJT05ESUFNT05ERklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKAotCQkJbnVsbCwgMTg1LCAyMDUsIDIzMCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL01lcmdlTm9kZU5hbWVFZGl0UGFydC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYWE3N2MuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuRVBGRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTm9uUmVzaXphYmxlSGFuZGxlS2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXJnZU5vZGVOYW1lRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0IGltcGxlbWVudHMKLQkJSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZ2V0RWRpdFRleHQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5NZXJnZU5vZGVfMTAwMjsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0RGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIFVNTEVkaXRQYXJ0RmFjdG9yeQotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJSUZpZ3VyZSBsYWJlbCA9IGNyZWF0ZUZpZ3VyZVByaW0oKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7Ci0JCXJldHVybiBuZXcgTm9kZU5hbWVGaWd1cmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIE5vZGVOYW1lRmlndXJlIGV4dGVuZHMKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBOb2RlTmFtZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRUZXh0KCI8Li4uPiIpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYjI3NmYuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucG9saWNpZXMuT3BlbkFEREVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAxMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5HUkFQSElDQUxfTk9ERV9ST0xFLAotCQkJCW5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwgbmV3IE9wZW5BRERFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0KSB7Ci0JCQkoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkuZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgewotCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSBleHRlbmRzCi0JCQlvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0T3V0bGluZShmYWxzZSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOwotCQkJZmlnXzAuc2V0VGV4dCgiPC4uLj4iKTsKLQotCQkJRGlhZ3JhbUNvcmVVdGlsLnNldExhYmVsUHJvcGVydGllcyhmaWdfMCk7Ci0KLQkJCXNldEZpZ3VyZU5vZGVOYW1lRmlndXJlKGZpZ18wKTsKLQotCQkJT2JqZWN0IGxheURhdGEwID0gbnVsbDsKLQotCQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmTm9kZU5hbWVGaWd1cmU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSB7Ci0JCQlyZXR1cm4gZk5vZGVOYW1lRmlndXJlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSgKLQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKSB7Ci0JCQlmTm9kZU5hbWVGaWd1cmUgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZjQ3NzAuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucG9saWNpZXMuT3BlbkFEREVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAxMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5HUkFQSElDQUxfTk9ERV9ST0xFLAotCQkJCW5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0dyYXBoaWNhbE5vZGVFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwgbmV3IE9wZW5BRERFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0KSB7Ci0JCQkoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkuZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgewotCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSBleHRlbmRzCi0JCQlvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0T3V0bGluZShmYWxzZSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOwotCQkJZmlnXzAuc2V0VGV4dCgiPC4uLj4iKTsKLQotCQkJRGlhZ3JhbUNvcmVVdGlsLnNldExhYmVsUHJvcGVydGllcyhmaWdfMCk7Ci0JCQlzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZk5vZGVOYW1lRmlndXJlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkgewotCQkJcmV0dXJuIGZOb2RlTmFtZUZpZ3VyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoCi0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZykgewotCQkJZk5vZGVOYW1lRmlndXJlID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxYWZjYy4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnBvbGljaWVzLk9wZW5BRERFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5PcGVuRGlhZ3JhbUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDc7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwgbmV3IE9wZW5BRERFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQpIHsKLQkJCSgoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpLmdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgewotCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSBleHRlbmRzCi0JCQlvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0T3V0bGluZShmYWxzZSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOwotCQkJZmlnXzAuc2V0VGV4dCgiPC4uLj4iKTsKLQotCQkJRGlhZ3JhbUNvcmVVdGlsLnNldExhYmVsUHJvcGVydGllcyhmaWdfMCk7Ci0JCQlzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZk5vZGVOYW1lRmlndXJlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkgewotCQkJcmV0dXJuIGZOb2RlTmFtZUZpZ3VyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoCi0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZykgewotCQkJZk5vZGVOYW1lRmlndXJlID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMzE0NzAuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLlZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5FUEZEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQKLQkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsCi0JCQkJbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJCQkJCUxpc3QgaGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCU5vblJlc2l6YWJsZUhhbmRsZUtpdC5hZGRNb3ZlSGFuZGxlKAotCQkJCQkJCQkoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSwgaGFuZGxlcyk7Ci0JCQkJCQlyZXR1cm4gaGFuZGxlczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcExhYmVsIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCS8vcmV0dXJuIG51bGw7Ci0JCXJldHVybiBFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoCi0JCQkJImRpYWdyYW0vcGhhc2UuZ2lmIik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlpZihEaWFncmFtQ29yZVV0aWwuaXNSZWFkT25seSh0aGlzKSkgcmV0dXJuIGZhbHNlOyAKLQkJcmV0dXJuIGdldEVkaXRUZXh0KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBWYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwgVU1MRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpewotCi0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQkJCQkJCSgoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQpZ2V0RWRpdFBhcnQoKSkucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJCQkJcmV0dXJuIERpYWdyYW1Db3JlVXRpbC52YWxpZFN0cmluZ0ZvckJyZWFrZG93bkVsZW1lbnRzKGdldEVkaXRQYXJ0KCksIHR4dCk7Ci0JCQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlDb2xvciBjID0gRGlhZ3JhbUNvcmVVdGlsLmdldEZvbnRDb2xvcih0aGlzKTsKLQkJaWYoYyAhPSBudWxsKSB7Ci0JCQljb2xvciA9IGM7Ci0JCX0KLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MzM4NjkuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLlZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5FUEZEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQKLQkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMTA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsCi0JCQkJbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJCQkJCUxpc3QgaGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCU5vblJlc2l6YWJsZUhhbmRsZUtpdC5hZGRNb3ZlSGFuZGxlKAotCQkJCQkJCQkoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSwgaGFuZGxlcyk7Ci0JCQkJCQlyZXR1cm4gaGFuZGxlczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcExhYmVsIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCS8vcmV0dXJuIG51bGw7Ci0JCXJldHVybiBFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoCi0JCQkJImRpYWdyYW0vaXRlcmF0aW9uLmdpZiIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCWlmKERpYWdyYW1Db3JlVXRpbC5pc1JlYWRPbmx5KHRoaXMpKSByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0RGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIFVNTEVkaXRQYXJ0RmFjdG9yeQotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKXsKLQotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJCQkJCQkoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0KWdldEVkaXRQYXJ0KCkpLnBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJCQkJcmV0dXJuIERpYWdyYW1Db3JlVXRpbC52YWxpZFN0cmluZ0ZvckJyZWFrZG93bkVsZW1lbnRzKGdldEVkaXRQYXJ0KCksIHR4dCk7Ci0JCQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlDb2xvciBjID0gRGlhZ3JhbUNvcmVVdGlsLmdldEZvbnRDb2xvcih0aGlzKTsKLQkJaWYoYyAhPSBudWxsKSB7Ci0JCQljb2xvciA9IGM7Ci0JCX0KLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWNlNjU1Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5BY3Rpdml0eURpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5JRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wb2xpY2llcy5WaWV3TGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQKLQkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgVmlld0xhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsgLy9tb2RpZmllZAotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBMYWJlbCBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ21vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJLy8JCXJldHVybiBudWxsOwotCQlyZXR1cm4gRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKAotCQkJCSJkaWFncmFtL2FjdGl2aXR5LmdpZiIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCWlmKERpYWdyYW1Db3JlVXRpbC5pc1JlYWRPbmx5KHRoaXMpKSByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNzsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBWYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBVTUxFZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSl7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQkJCQotCQkJCQkJT2JqZWN0IG9iaiA9IGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKTsKLQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iajsKLQkJCQkJCQlFT2JqZWN0IHVtbEUgPSBub2RlLmdldEVsZW1lbnQoKTsKLQkJCQkJCQlPYmplY3QgZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KChFTW9kZWxFbGVtZW50KXVtbEUpOwotCQkJCQkJCUVPYmplY3QgdW1sQSA9IG5vZGUuZ2V0RGlhZ3JhbSgpLmdldEVsZW1lbnQoKTsKLQkJCQkJCQlBY3Rpdml0eURpYWdyYW1BZGFwdGVyIGFkYXB0ZXIgPSAoQWN0aXZpdHlEaWFncmFtQWRhcHRlcilCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIodW1sQSk7Ci0JCQkJCQkJCi0JCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCQlyZXR1cm4gVG5nVXRpbC5jaGVja1dCU0FjdGl2aXR5UHJlc2VudGF0aW9uTmFtZShlLCB0eHQsIGFkYXB0ZXIuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlyZXR1cm4gVG5nVXRpbAotCQkJCQkJCQkJCS5jaGVja1dvcmtCcmVha2Rvd25FbGVtZW50UHJlc2VudGF0aW9uTmFtZShlLAotCQkJCQkJCQkJCQkJdHh0LCBhZGFwdGVyLmdldFN1cHByZXNzaW9uKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJCQkJCSgoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydClnZXRFZGl0UGFydCgpKS5wZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0JCQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIGMgPSBEaWFncmFtQ29yZVV0aWwuZ2V0Rm9udENvbG9yKHRoaXMpOwotCQlpZihjICE9IG51bGwpIHsKLQkJCWNvbG9yID0gYzsKLQkJfQotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsIG1ldGhvZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wYXJ0cy9VTUxFZGl0UGFydEZhY3RvcnkuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL1VNTEVkaXRQYXJ0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWM3OTk0Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL1VNTEVkaXRQYXJ0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTEVkaXRQYXJ0RmFjdG9yeSBpbXBsZW1lbnRzIEVkaXRQYXJ0RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfTk9ERV9MQUJFTFNfTEFZRVIgPSAiRXh0ZXJuYWwgTm9kZSBMYWJlbHMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KEVkaXRQYXJ0IGNvbnRleHQsIE9iamVjdCBtb2RlbCkgewotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlWaWV3IHZpZXcgPSAoVmlldykgbW9kZWw7Ci0JCQlpbnQgdmlld1Zpc3VhbElEID0gVU1MVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsKLQkJCXN3aXRjaCAodmlld1Zpc3VhbElEKSB7Ci0JCQljYXNlIEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydCh2aWV3KTsKLQkJCWNhc2UgQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQodmlldyk7Ci0JCQljYXNlIE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IE1lcmdlTm9kZUVkaXRQYXJ0KHZpZXcpOwotCQkJY2FzZSBNZXJnZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0KHZpZXcpOwotCQkJY2FzZSBGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEZvcmtOb2RlRWRpdFBhcnQodmlldyk7Ci0JCQljYXNlIEluaXRpYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgSW5pdGlhbE5vZGVFZGl0UGFydCh2aWV3KTsKLQkJCWNhc2UgSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQodmlldyk7Ci0JCQljYXNlIERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IERlY2lzaW9uTm9kZUVkaXRQYXJ0KHZpZXcpOwotCQkJY2FzZSBEZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0KHZpZXcpOwotCQkJY2FzZSBKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEpvaW5Ob2RlRWRpdFBhcnQodmlldyk7Ci0JCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQodmlldyk7Ci0JCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydCh2aWV3KTsKLQkJCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KHZpZXcpOwotCQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0KHZpZXcpOwotCQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydCh2aWV3KTsKLQkJCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydCh2aWV3KTsKLQkJCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0KHZpZXcpOwotCQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydCh2aWV3KTsKLQkJCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0KHZpZXcpOwotCQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydCh2aWV3KTsKLQkJCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydCh2aWV3KTsKLQkJCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0KHZpZXcpOwotCQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydCh2aWV3KTsKLQkJCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQodmlldyk7Ci0JCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQodmlldyk7Ci0JCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydCh2aWV3KTsKLQkJCWNhc2UgQWN0aXZpdHlFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBBY3Rpdml0eUVkaXRQYXJ0KHZpZXcpOwotCQkJY2FzZSBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IENvbnRyb2xGbG93RWRpdFBhcnQodmlldyk7Ci0JCQljYXNlIENvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IENvbnRyb2xGbG93TmFtZUVkaXRQYXJ0KHZpZXcpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjcmVhdGVVbnJlY29nbml6ZWRFZGl0UGFydChjb250ZXh0LCBtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWRpdFBhcnQgY3JlYXRlVW5yZWNvZ25pemVkRWRpdFBhcnQoRWRpdFBhcnQgY29udGV4dCwgT2JqZWN0IG1vZGVsKSB7Ci0JCS8vIEhhbmRsZSBjcmVhdGlvbiBvZiB1bnJlY29nbml6ZWQgY2hpbGQgbm9kZSBFZGl0UGFydHMgaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDZWxsRWRpdG9yTG9jYXRvciBnZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IoCi0JCQlJVGV4dEF3YXJlRWRpdFBhcnQgc291cmNlKSB7Ci0JCWlmIChzb3VyY2UuZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpCi0JCQlyZXR1cm4gbmV3IFRleHRDZWxsRWRpdG9yTG9jYXRvcigoV3JhcExhYmVsKSBzb3VyY2UuZ2V0RmlndXJlKCkpOwotCQllbHNlIHsKLQkJCUlGaWd1cmUgZmlndXJlID0gc291cmNlLmdldEZpZ3VyZSgpOwotCQkJcmV0dXJuIG5ldyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKChMYWJlbCkgZmlndXJlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlzdGF0aWMgcHJpdmF0ZSBjbGFzcyBUZXh0Q2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgV3JhcExhYmVsIHdyYXBMYWJlbDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFRleHRDZWxsRWRpdG9yTG9jYXRvcihXcmFwTGFiZWwgd3JhcExhYmVsKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy53cmFwTGFiZWwgPSB3cmFwTGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFdyYXBMYWJlbCBnZXRXcmFwTGFiZWwoKSB7Ci0JCQlyZXR1cm4gd3JhcExhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBnZXRXcmFwTGFiZWwoKS5nZXRUZXh0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQkJZ2V0V3JhcExhYmVsKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShyZWN0KTsKLQotCQkJaWYgKGdldFdyYXBMYWJlbCgpLmlzVGV4dFdyYXBwZWQoKQotCQkJCQkmJiBnZXRXcmFwTGFiZWwoKS5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKQotCQkJCXJlY3Quc2V0U2l6ZShuZXcgRGltZW5zaW9uKHRleHQuY29tcHV0ZVNpemUocmVjdC53aWR0aCwKLQkJCQkJCVNXVC5ERUZBVUxUKSkpOwotCQkJZWxzZSB7Ci0JCQkJaW50IGF2ciA9IEZpZ3VyZVV0aWxpdGllcy5nZXRGb250TWV0cmljcyh0ZXh0LmdldEZvbnQoKSkKLQkJCQkJCS5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci0JCQkJcmVjdC5zZXRTaXplKG5ldyBEaW1lbnNpb24odGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwKLQkJCQkJCVNXVC5ERUZBVUxUKSkuZXhwYW5kKGF2ciAqIDIsIDApKTsKLQkJCX0KLQotCQkJaWYgKCFyZWN0LmVxdWFscyhuZXcgUmVjdGFuZ2xlKHRleHQuZ2V0Qm91bmRzKCkpKSkKLQkJCQl0ZXh0LnNldEJvdW5kcyhyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGFiZWxDZWxsRWRpdG9yTG9jYXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3JMb2NhdG9yIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIExhYmVsQ2VsbEVkaXRvckxvY2F0b3IoTGFiZWwgbGFiZWwpIHsKLQkJCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTGFiZWwgZ2V0TGFiZWwoKSB7Ci0JCQlyZXR1cm4gbGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKSB7Ci0JCQlUZXh0IHRleHQgPSAoVGV4dCkgY2VsbGVkaXRvci5nZXRDb250cm9sKCk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGdldExhYmVsKCkuZ2V0VGV4dEJvdW5kcygpLmdldENvcHkoKTsKLQkJCWdldExhYmVsKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShyZWN0KTsKLQotCQkJaW50IGF2ciA9IEZpZ3VyZVV0aWxpdGllcy5nZXRGb250TWV0cmljcyh0ZXh0LmdldEZvbnQoKSkKLQkJCQkJLmdldEF2ZXJhZ2VDaGFyV2lkdGgoKTsKLQkJCXJlY3Quc2V0U2l6ZShuZXcgRGltZW5zaW9uKHRleHQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsCi0JCQkJCVNXVC5ERUZBVUxUKSkuZXhwYW5kKGF2ciAqIDIsIDApKTsKLQotCQkJaWYgKCFyZWN0LmVxdWFscyhuZXcgUmVjdGFuZ2xlKHRleHQuZ2V0Qm91bmRzKCkpKSkKLQkJCQl0ZXh0LnNldEJvdW5kcyhyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvVU1MRXh0Tm9kZUxhYmVsRWRpdFBhcnQuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BhcnRzL1VNTEV4dE5vZGVMYWJlbEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNmQzYmQuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcGFydHMvVU1MRXh0Tm9kZUxhYmVsRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkxhYmVsTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxFeHROb2RlTGFiZWxFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVTUxFeHROb2RlTGFiZWxFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hCb3VuZHMoKSB7Ci0JCUlGaWd1cmUgcmVmRmlndXJlID0gKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0UGFyZW50KCkpLmdldEZpZ3VyZSgpOwotCQlpbnQgZHggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9YKCkpKS5pbnRWYWx1ZSgpOwotCQlpbnQgZHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQlQb2ludCBvZmZzZXQgPSBuZXcgUG9pbnQoZHgsIGR5KTsKLQkJZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuc2V0Q29uc3RyYWludChnZXRGaWd1cmUoKSwKLQkJCQluZXcgTGFiZWxMb2NhdG9yKHJlZkZpZ3VyZSwgb2Zmc2V0LCBnZXRLZXlQb2ludCgpKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcmVsb2NhdGUoSUZpZ3VyZSB0YXJnZXQpIHsKLQkJCQkJCVBvaW50IGxvY2F0aW9uID0gZ2V0UmVmZXJlbmNlUG9pbnQoKS5nZXRUcmFuc2xhdGVkKAotCQkJCQkJCQlnZXRPZmZzZXQoKSk7Ci0JCQkJCQlsb2NhdGlvbi50cmFuc2xhdGUoLXRhcmdldC5nZXRCb3VuZHMoKS53aWR0aCAvIDIsIDApOwotCQkJCQkJdGFyZ2V0LnNldExvY2F0aW9uKGxvY2F0aW9uKTsKLQkJCQkJCXRhcmdldC5zZXRTaXplKG5ldyBEaW1lbnNpb24oCi0JCQkJCQkJCXRhcmdldC5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGgsIHRhcmdldAotCQkJCQkJCQkJCS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0KSk7Ci0JCQkJCX0KLQotCQkJCQlwcm90ZWN0ZWQgUG9pbnQgZ2V0UmVmZXJlbmNlUG9pbnQoKSB7Ci0JCQkJCQlyZXR1cm4gZ2V0TGFiZWxMb2NhdGlvbihwYXJlbnQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRSZWZlcmVuY2VQb2ludCgpIHsKLQkJcmV0dXJuIGdldExhYmVsTG9jYXRpb24oKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0UGFyZW50KCkpLmdldEZpZ3VyZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGdldExhYmVsTG9jYXRpb24oSUZpZ3VyZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHBhcmVudC5nZXRCb3VuZHMoKS5nZXRCb3R0b20oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWRkYzY3Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5Gb3JrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkluaXRpYWxOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuSm9pbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5NZXJnZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsQ29ubmVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5Q2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbENvbm5lY3Rpb25FZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCUVPYmplY3QgbW9kZWxPYmplY3QgPSAoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJRU9iamVjdCBuZXh0VmFsdWU7Ci0JCWludCBub2RlVklEOwotCQlmb3IgKEl0ZXJhdG9yIHZhbHVlcyA9ICgoQWN0aXZpdHkpIG1vZGVsT2JqZWN0KS5nZXROb2RlcygpLml0ZXJhdG9yKCk7IHZhbHVlcwotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQluZXh0VmFsdWUgPSAoRU9iamVjdCkgdmFsdWVzLm5leHQoKTsKLQkJCS8vIG1vZGlmaWVkIFNUQVJUCi0JCQkvLyBUbyBhdm9pZCB0aGUgQWN0aXZpdHlOb2RlIHNob3cgaW4gZHVwbGljYXRlIHBsYWNlcwotCQkJaWYgKG5leHRWYWx1ZSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJCWlmICghKChBY3Rpdml0eU5vZGUpIG5leHRWYWx1ZSkuZ2V0SW5QYXJ0aXRpb25zKCkuaXNFbXB0eSgpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8vIG1vZGlmaWVkIEVORAotCQkJbm9kZVZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldE5vZGVWaXN1YWxJRCh2aWV3T2JqZWN0LCBuZXh0VmFsdWUpOwotCQkJc3dpdGNoIChub2RlVklEKSB7Ci0JCQljYXNlIEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBJbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl9Ci0JCX0KLQkJZm9yIChJdGVyYXRvciB2YWx1ZXMgPSAoKEFjdGl2aXR5KSBtb2RlbE9iamVjdCkuZ2V0R3JvdXBzKCkuaXRlcmF0b3IoKTsgdmFsdWVzCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCW5leHRWYWx1ZSA9IChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpOwotCQkJbm9kZVZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldE5vZGVWaXN1YWxJRCh2aWV3T2JqZWN0LCBuZXh0VmFsdWUpOwotCQkJaWYgKEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWSUQpIHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKQotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiAodmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKSB8fCAodmlldy5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBFTW9kZWxFbGVtZW50ICYmIEJyaWRnZUhlbHBlcgotCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpIHZpZXcuZ2V0RWxlbWVudCgpKSAhPSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0Nvbm5lY3Rpb25zTGlzdCgpIHsKLQkJLy8JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCi0JCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgKChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQlyZXR1cm4gbmV3IEFycmF5TGlzdChhY3QuZ2V0RWRnZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0U291cmNlRWxlbWVudChFT2JqZWN0IHJlbGF0aW9uc2hpcCkgewotCQlpZiAocmVsYXRpb25zaGlwIGluc3RhbmNlb2YgQWN0aXZpdHlFZGdlKSB7Ci0JCQlyZXR1cm4gKChBY3Rpdml0eUVkZ2UpIHJlbGF0aW9uc2hpcCkuZ2V0U291cmNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0VGFyZ2V0RWxlbWVudChFT2JqZWN0IHJlbGF0aW9uc2hpcCkgewotCQlpZiAocmVsYXRpb25zaGlwIGluc3RhbmNlb2YgQWN0aXZpdHlFZGdlKSB7Ci0JCQlyZXR1cm4gKChBY3Rpdml0eUVkZ2UpIHJlbGF0aW9uc2hpcCkuZ2V0VGFyZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkSW5jbHVkZUNvbm5lY3Rpb24oRWRnZSBjb25uZWN0b3IsCi0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXJldHVybiBzdXBlci5zaG91bGRJbmNsdWRlQ29ubmVjdGlvbihjb25uZWN0b3IsIGNoaWxkcmVuKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgewotCQlMaXN0IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWNyZWF0ZWRWaWV3cy5hZGRBbGwocmVmcmVzaFNlbWFudGljQ2hpbGRyZW4oKSk7Ci0JCUxpc3QgY3JlYXRlZENvbm5lY3Rpb25WaWV3cyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWNyZWF0ZWRDb25uZWN0aW9uVmlld3MuYWRkQWxsKHJlZnJlc2hTZW1hbnRpY0Nvbm5lY3Rpb25zKCkpOwotCQljcmVhdGVkQ29ubmVjdGlvblZpZXdzLmFkZEFsbChyZWZyZXNoQ29ubmVjdGlvbnMoKSk7Ci0KLQkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7Ci0JCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXIKLQkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQotCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7Ci0JCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsKLQkJfQotCi0JCWNyZWF0ZWRWaWV3cy5hZGRBbGwoY3JlYXRlZENvbm5lY3Rpb25WaWV3cyk7Ci0JCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gbXlMaW5rRGVzY3JpcHRvcnMgPSBuZXcgTGlua2VkTGlzdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTWFwIG15RU9iamVjdDJWaWV3TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gcmVmcmVzaENvbm5lY3Rpb25zKCkgewotCQl0cnkgewotCQkJY29sbGVjdEFsbExpbmtzKGdldERpYWdyYW0oKSk7Ci0JCQlDb2xsZWN0aW9uIGV4aXN0aW5nTGlua3MgPSBuZXcgTGlua2VkTGlzdChnZXREaWFncmFtKCkuZ2V0RWRnZXMoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGRpYWdyYW1MaW5rcyA9IGV4aXN0aW5nTGlua3MuaXRlcmF0b3IoKTsgZGlhZ3JhbUxpbmtzCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRWRnZSBuZXh0RGlhZ3JhbUxpbmsgPSAoRWRnZSkgZGlhZ3JhbUxpbmtzLm5leHQoKTsKLQkJCQlFT2JqZWN0IGRpYWdyYW1MaW5rT2JqZWN0ID0gbmV4dERpYWdyYW1MaW5rLmdldEVsZW1lbnQoKTsKLQkJCQlFT2JqZWN0IGRpYWdyYW1MaW5rU3JjID0gbmV4dERpYWdyYW1MaW5rLmdldFNvdXJjZSgpCi0JCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJCUVPYmplY3QgZGlhZ3JhbUxpbmtEc3QgPSBuZXh0RGlhZ3JhbUxpbmsuZ2V0VGFyZ2V0KCkKLQkJCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQkJaW50IGRpYWdyYW1MaW5rVmlzdWFsSUQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0VmlzdWFsSUQobmV4dERpYWdyYW1MaW5rKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIG1vZGVsTGlua0Rlc2NyaXB0b3JzID0gbXlMaW5rRGVzY3JpcHRvcnMKLQkJCQkJCS5pdGVyYXRvcigpOyBtb2RlbExpbmtEZXNjcmlwdG9ycy5oYXNOZXh0KCk7KSB7Ci0JCQkJCUxpbmtEZXNjcmlwdG9yIG5leHRMaW5rRGVzY3JpcHRvciA9IChMaW5rRGVzY3JpcHRvcikgbW9kZWxMaW5rRGVzY3JpcHRvcnMKLQkJCQkJCQkubmV4dCgpOwotCQkJCQlpZiAoZGlhZ3JhbUxpbmtPYmplY3QgPT0gbmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCQkJLmdldExpbmtFbGVtZW50KCkKLQkJCQkJCQkmJiBkaWFncmFtTGlua1NyYyA9PSBuZXh0TGlua0Rlc2NyaXB0b3IuZ2V0U291cmNlKCkKLQkJCQkJCQkmJiBkaWFncmFtTGlua0RzdCA9PSBuZXh0TGlua0Rlc2NyaXB0b3IKLQkJCQkJCQkJCS5nZXREZXN0aW5hdGlvbigpCi0JCQkJCQkJJiYgZGlhZ3JhbUxpbmtWaXN1YWxJRCA9PSBuZXh0TGlua0Rlc2NyaXB0b3IKLQkJCQkJCQkJCS5nZXRWaXN1YWxJRCgpKSB7Ci0JCQkJCQlkaWFncmFtTGlua3MucmVtb3ZlKCk7Ci0JCQkJCQltb2RlbExpbmtEZXNjcmlwdG9ycy5yZW1vdmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWRlbGV0ZVZpZXdzKGV4aXN0aW5nTGlua3MuaXRlcmF0b3IoKSk7Ci0JCQlyZXR1cm4gY3JlYXRlQ29ubmVjdGlvbnMobXlMaW5rRGVzY3JpcHRvcnMpOwotCQl9IGZpbmFsbHkgewotCQkJbXlMaW5rRGVzY3JpcHRvcnMuY2xlYXIoKTsKLQkJCW15RU9iamVjdDJWaWV3TWFwLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RBbGxMaW5rcyhWaWV3IHZpZXcpIHsKLQkJRU9iamVjdCBtb2RlbEVsZW1lbnQgPSB2aWV3LmdldEVsZW1lbnQoKTsKLQkJaW50IGRpYWdyYW1FbGVtZW50VmlzdWFsSUQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOwotCQlzd2l0Y2ggKGRpYWdyYW1FbGVtZW50VmlzdWFsSUQpIHsKLQkJY2FzZSBBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgSW5pdGlhbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIEpvaW5Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIEFjdGl2aXR5RWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQlteUVPYmplY3QyVmlld01hcC5wdXQobW9kZWxFbGVtZW50LCB2aWV3KTsKLQkJCXN0b3JlTGlua3MobW9kZWxFbGVtZW50LCBnZXREaWFncmFtKCkpOwotCQl9Ci0JCWRlZmF1bHQ6IHsKLQkJfQotCQkJZm9yIChJdGVyYXRvciBjaGlsZHJlbiA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaGlsZHJlbgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkcmVuLm5leHQoKTsKLQkJCQljb2xsZWN0QWxsTGlua3MoY2hpbGRWaWV3KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gY3JlYXRlQ29ubmVjdGlvbnMoQ29sbGVjdGlvbiBsaW5rRGVzY3JpcHRvcnMpIHsKLQkJaWYgKGxpbmtEZXNjcmlwdG9ycy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCUxpc3QgYWRhcHRlcnMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGxpbmtEZXNjcmlwdG9yc0l0ZXJhdG9yID0gbGlua0Rlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGxpbmtEZXNjcmlwdG9yc0l0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCWZpbmFsIExpbmtEZXNjcmlwdG9yIG5leHRMaW5rRGVzY3JpcHRvciA9IChMaW5rRGVzY3JpcHRvcikgbGlua0Rlc2NyaXB0b3JzSXRlcmF0b3IKLQkJCQkJLm5leHQoKTsKLQkJCUVkaXRQYXJ0IHNvdXJjZUVkaXRQYXJ0ID0gZ2V0RWRpdFBhcnRGb3IobmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCS5nZXRTb3VyY2UoKSk7Ci0JCQlFZGl0UGFydCB0YXJnZXRFZGl0UGFydCA9IGdldEVkaXRQYXJ0Rm9yKG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkuZ2V0RGVzdGluYXRpb24oKSk7Ci0JCQlpZiAoc291cmNlRWRpdFBhcnQgPT0gbnVsbCB8fCB0YXJnZXRFZGl0UGFydCA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlDcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3QuQ29ubmVjdGlvblZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0LkNvbm5lY3Rpb25WaWV3RGVzY3JpcHRvcigKLQkJCQkJbmV4dExpbmtEZXNjcmlwdG9yLmdldFNlbWFudGljQWRhcHRlcigpLCBudWxsLAotCQkJCQlWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLCAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCQkJCS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOwotCQkJQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0IGNjciA9IG5ldyBDcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3QoCi0JCQkJCWRlc2NyaXB0b3IpOwotCQkJY2NyLnNldFR5cGUoUmVxdWVzdENvbnN0YW50cy5SRVFfQ09OTkVDVElPTl9TVEFSVCk7Ci0JCQljY3Iuc2V0U291cmNlRWRpdFBhcnQoc291cmNlRWRpdFBhcnQpOwotCQkJc291cmNlRWRpdFBhcnQuZ2V0Q29tbWFuZChjY3IpOwotCQkJY2NyLnNldFRhcmdldEVkaXRQYXJ0KHRhcmdldEVkaXRQYXJ0KTsKLQkJCWNjci5zZXRUeXBlKFJlcXVlc3RDb25zdGFudHMuUkVRX0NPTk5FQ1RJT05fRU5EKTsKLQkJCUNvbW1hbmQgY21kID0gdGFyZ2V0RWRpdFBhcnQuZ2V0Q29tbWFuZChjY3IpOwotCQkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQlleGVjdXRlQ29tbWFuZChjbWQpOwotCQkJCUlBZGFwdGFibGUgdmlld0FkYXB0ZXIgPSAoSUFkYXB0YWJsZSkgY2NyLmdldE5ld09iamVjdCgpOwotCQkJCWlmICh2aWV3QWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXJzLmFkZCh2aWV3QWRhcHRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhZGFwdGVyczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFZGl0UGFydCBnZXRFZGl0UGFydEZvcihFT2JqZWN0IG1vZGVsRWxlbWVudCkgewotCQlWaWV3IHZpZXcgPSAoVmlldykgbXlFT2JqZWN0MlZpZXdNYXAuZ2V0KG1vZGVsRWxlbWVudCk7Ci0JCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCXJldHVybiAoRWRpdFBhcnQpIGdldEhvc3QoKS5nZXRWaWV3ZXIoKS5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KAotCQkJCQl2aWV3KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKkBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVMaW5rcyhFT2JqZWN0IGNvbnRhaW5lciwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCUVDbGFzcyBjb250YWluZXJNZXRhY2xhc3MgPSBjb250YWluZXIuZUNsYXNzKCk7Ci0JCXN0b3JlRmVhdHVyZU1vZGVsRmFjZXRMaW5rcyhjb250YWluZXIsIGNvbnRhaW5lck1ldGFjbGFzcywgZGlhZ3JhbSk7Ci0JCXN0b3JlVHlwZU1vZGVsRmFjZXRMaW5rcyhjb250YWluZXIsIGNvbnRhaW5lck1ldGFjbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVR5cGVNb2RlbEZhY2V0TGlua3MoRU9iamVjdCBjb250YWluZXIsCi0JCQlFQ2xhc3MgY29udGFpbmVyTWV0YWNsYXNzKSB7Ci0JCWlmIChVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkuaXNTdXBlclR5cGVPZigKLQkJCQljb250YWluZXJNZXRhY2xhc3MpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIHZhbHVlcyA9ICgoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgY29udGFpbmVyKQotCQkJCQkuZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyB2YWx1ZXMuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgbmV4dFZhbHVlID0gKChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpKTsKLQkJCQlpbnQgbGlua1ZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRMaW5rV2l0aENsYXNzVmlzdWFsSUQobmV4dFZhbHVlKTsKLQkJCQlpZiAoQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQgPT0gbGlua1ZJRCkgewotCQkJCQlPYmplY3Qgc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQgPSAoKEFjdGl2aXR5RWRnZSkgbmV4dFZhbHVlKQotCQkJCQkJCS5nZXRUYXJnZXQoKTsKLQkJCQkJaWYgKHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQkJRU9iamVjdCBkc3QgPSAoRU9iamVjdCkgc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQ7Ci0JCQkJCQlzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdCA9ICgoQWN0aXZpdHlFZGdlKSBuZXh0VmFsdWUpCi0JCQkJCQkJCS5nZXRTb3VyY2UoKTsKLQkJCQkJCWlmIChzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCQlFT2JqZWN0IHNyYyA9IChFT2JqZWN0KSBzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdDsKLQkJCQkJCQlteUxpbmtEZXNjcmlwdG9ycy5hZGQobmV3IExpbmtEZXNjcmlwdG9yKHNyYywgZHN0LAotCQkJCQkJCQkJbmV4dFZhbHVlLCBsaW5rVklEKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKkBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVGZWF0dXJlTW9kZWxGYWNldExpbmtzKEVPYmplY3QgY29udGFpbmVyLAotCQkJRUNsYXNzIGNvbnRhaW5lck1ldGFjbGFzcywgRGlhZ3JhbSBkaWFncmFtKSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaWFncmFtIGdldERpYWdyYW0oKSB7Ci0JCXJldHVybiAoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKS5nZXREaWFncmFtKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgY2xhc3MgTGlua0Rlc2NyaXB0b3IgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIEVPYmplY3QgbXlTb3VyY2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgRU9iamVjdCBteURlc3RpbmF0aW9uOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIEVPYmplY3QgbXlMaW5rRWxlbWVudDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgbXlWaXN1YWxJRDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBJQWRhcHRhYmxlIG15U2VtYW50aWNBZGFwdGVyOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgTGlua0Rlc2NyaXB0b3IoRU9iamVjdCBzb3VyY2UsIEVPYmplY3QgZGVzdGluYXRpb24sCi0JCQkJRU9iamVjdCBsaW5rRWxlbWVudCwgaW50IGxpbmtWSUQpIHsKLQkJCXRoaXMoc291cmNlLCBkZXN0aW5hdGlvbiwgbGlua1ZJRCk7Ci0JCQlteUxpbmtFbGVtZW50ID0gbGlua0VsZW1lbnQ7Ci0JCQlteVNlbWFudGljQWRhcHRlciA9IG5ldyBFT2JqZWN0QWRhcHRlcihsaW5rRWxlbWVudCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIExpbmtEZXNjcmlwdG9yKEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IGRlc3RpbmF0aW9uLAotCQkJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSwgaW50IGxpbmtWSUQpIHsKLQkJCXRoaXMoc291cmNlLCBkZXN0aW5hdGlvbiwgbGlua1ZJRCk7Ci0JCQlteUxpbmtFbGVtZW50ID0gbnVsbDsKLQkJCWZpbmFsIElFbGVtZW50VHlwZSBlbGVtZW50VHlwZUNvcHkgPSBlbGVtZW50VHlwZTsKLQkJCW15U2VtYW50aWNBZGFwdGVyID0gbmV3IElBZGFwdGFibGUoKSB7Ci0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBlbGVtZW50VHlwZUNvcHk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIExpbmtEZXNjcmlwdG9yKEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IGRlc3RpbmF0aW9uLCBpbnQgbGlua1ZJRCkgewotCQkJbXlTb3VyY2UgPSBzb3VyY2U7Ci0JCQlteURlc3RpbmF0aW9uID0gZGVzdGluYXRpb247Ci0JCQlteVZpc3VhbElEID0gbGlua1ZJRDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRTb3VyY2UoKSB7Ci0JCQlyZXR1cm4gbXlTb3VyY2U7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RGVzdGluYXRpb24oKSB7Ci0JCQlyZXR1cm4gbXlEZXN0aW5hdGlvbjsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRMaW5rRWxlbWVudCgpIHsKLQkJCXJldHVybiBteUxpbmtFbGVtZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBpbnQgZ2V0VmlzdWFsSUQoKSB7Ci0JCQlyZXR1cm4gbXlWaXN1YWxJRDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgSUFkYXB0YWJsZSBnZXRTZW1hbnRpY0FkYXB0ZXIoKSB7Ci0JCQlyZXR1cm4gbXlTZW1hbnRpY0FkYXB0ZXI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RmluYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlGaW5hbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNzU2ODcuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlGaW5hbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpbmFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlGaW5hbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlGaW5hbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjkwNzhlLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RmluYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RmluYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUZpbmFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RmluYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDUyMDhhLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RmluYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpbmFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpIHsKLQotCQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRGVzdHJveSgpIHsKLQkJCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCQkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiB2aWV3OwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0RWxlbWVudFRvRGVzdHJveSgpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJLy8JCWlmIChVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkvLwkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSkKLQkJLy8JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQocmVxKTsKLQkJLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJaWYgKCEocmVxLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJZmluYWwgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBlbGVtZW50ID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlyZXEuZ2V0U291cmNlKCksIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9FZGdlKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQocmVxKSB7Ci0KLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kIGV4dGVuZHMKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKAotCQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCQlzdXBlcihyZXEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKTsKLQkJfTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0RWxlbWVudFRvRWRpdChFT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJCUNvbnRyb2xGbG93IG5ld0VsZW1lbnQgPSAoQ29udHJvbEZsb3cpIHN1cGVyCi0JCQkJCS5kb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKTsKLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCQluZXdFbGVtZW50LnNldFRhcmdldCgoQWN0aXZpdHlOb2RlKSBnZXRUYXJnZXQoKSk7Ci0JCQkJbmV3RWxlbWVudC5zZXRTb3VyY2UoKEFjdGl2aXR5Tm9kZSkgZ2V0U291cmNlKCkpOwotCQkJfQotCQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTJkYzJhLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kcy5EdXBsaWNhdGVFT2JqZWN0c0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eUZpbmFsTm9kZV8xMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDcmVhdGVBY3Rpdml0eUZpbmFsTm9kZV8xMDAxQ29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLk1lcmdlTm9kZV8xMDAyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDcmVhdGVNZXJnZU5vZGVfMTAwMkNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Gb3JrTm9kZV8xMDAzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDcmVhdGVGb3JrTm9kZV8xMDAzQ29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkluaXRpYWxOb2RlXzEwMDQgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENyZWF0ZUluaXRpYWxOb2RlXzEwMDRDb21tYW5kKHJlcSkpOwotCQl9Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuRGVjaXNpb25Ob2RlXzEwMDUgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENyZWF0ZURlY2lzaW9uTm9kZV8xMDA1Q29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkpvaW5Ob2RlXzEwMDYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENyZWF0ZUpvaW5Ob2RlXzEwMDZDb21tYW5kKHJlcSkpOwotCQl9Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDcmVhdGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDdDb21tYW5kKAotCQkJCQlyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzEwMDggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Hcm91cCgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDcmVhdGVBY3Rpdml0eVBhcnRpdGlvbl8xMDA4Q29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDcmVhdGVBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOUNvbW1hbmQoCi0JCQkJCXJlcSkpOwotCQl9Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDcmVhdGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTBDb21tYW5kKAotCQkJCQlyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExQ29tbWFuZCgKLQkJCQkJcmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTJDb21tYW5kKAotCQkJCQlyZXEpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDcmVhdGVBY3Rpdml0eUZpbmFsTm9kZV8xMDAxQ29tbWFuZCBleHRlbmRzCi0JCQlDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBDcmVhdGVBY3Rpdml0eUZpbmFsTm9kZV8xMDAxQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJCXN1cGVyKHJlcSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQkJfTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY29udGFpbmVyOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZU1lcmdlTm9kZV8xMDAyQ29tbWFuZCBleHRlbmRzCi0JCQlDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBDcmVhdGVNZXJnZU5vZGVfMTAwMkNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCQlzdXBlcihyZXEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkJLmdldENvbnRhaW5lcigpOwotCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQkJfQotCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDcmVhdGVGb3JrTm9kZV8xMDAzQ29tbWFuZCBleHRlbmRzCi0JCQlDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBDcmVhdGVGb3JrTm9kZV8xMDAzQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJCXN1cGVyKHJlcSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQkJfTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY29udGFpbmVyOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZUluaXRpYWxOb2RlXzEwMDRDb21tYW5kIGV4dGVuZHMKLQkJCUNyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZUluaXRpYWxOb2RlXzEwMDRDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCQl9OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJCS5nZXRDb250YWluZXIoKTsKLQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJCX0KLQkJCXJldHVybiBjb250YWluZXI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3JlYXRlRGVjaXNpb25Ob2RlXzEwMDVDb21tYW5kIGV4dGVuZHMKLQkJCUNyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZURlY2lzaW9uTm9kZV8xMDA1Q29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJCXN1cGVyKHJlcSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQkJfTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY29udGFpbmVyOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZUpvaW5Ob2RlXzEwMDZDb21tYW5kIGV4dGVuZHMKLQkJCUNyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZUpvaW5Ob2RlXzEwMDZDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCQl9OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJCS5nZXRDb250YWluZXIoKTsKLQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJCX0KLQkJCXJldHVybiBjb250YWluZXI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3JlYXRlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3Q29tbWFuZCBleHRlbmRzCi0JCQlDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBDcmVhdGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDdDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCQl9OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJCS5nZXRDb250YWluZXIoKTsKLQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJCX0KLQkJCXJldHVybiBjb250YWluZXI7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCkgewotCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBuZXdFbGVtZW50ID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIHN1cGVyCi0JCQkJCS5kb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKTsKLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlVTUxFbGVtZW50VHlwZXMuSW5pdGlhbGl6ZXJzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNwotCQkJCQkJLmluaXQobmV3RWxlbWVudCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3RWxlbWVudDsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQjZG9FeGVjdXRlV2l0aFJlc3VsdChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCi0JCSAqIEBtb2RpaWZlZAotCQkgKi8KLQkJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCUNvbW1hbmRSZXN1bHQgcmVzdWx0ID0gc3VwZXIuZG9FeGVjdXRlV2l0aFJlc3VsdChtb25pdG9yLCBpbmZvKTsKLQkJCS8vVmlldyBjb250YWluZXIgPSAoVmlldykoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KWdldFJlcXVlc3QoKSkuZ2V0Q29udGFpbmVyKCk7Ci0KLQkJCS8vKChDcmVhdGVFbGVtZW50UmVxdWVzdClnZXRSZXF1ZXN0KCkpLgotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCNkb1VuZG8ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByb3RlY3RlZCBJU3RhdHVzIGRvVW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCXJldHVybiBzdXBlci5kb1VuZG8obW9uaXRvciwgaW5mbyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3JlYXRlQWN0aXZpdHlQYXJ0aXRpb25fMTAwOENvbW1hbmQgZXh0ZW5kcwotCQkJQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQ3JlYXRlQWN0aXZpdHlQYXJ0aXRpb25fMTAwOENvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCQlzdXBlcihyZXEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkJLmdldENvbnRhaW5lcigpOwotCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQkJfQotCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDcmVhdGVBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOUNvbW1hbmQgZXh0ZW5kcwotCQkJQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQ3JlYXRlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDlDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCQl9OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJCS5nZXRDb250YWluZXIoKTsKLQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJCX0KLQkJCXJldHVybiBjb250YWluZXI7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCkgewotCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIG5ld0VsZW1lbnQgPSAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSBzdXBlcgotCQkJCQkuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJVU1MRWxlbWVudFR5cGVzLkluaXRpYWxpemVycy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOQotCQkJCQkJLmluaXQobmV3RWxlbWVudCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3RWxlbWVudDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDcmVhdGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTBDb21tYW5kIGV4dGVuZHMKLQkJCUNyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMENvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCQlzdXBlcihyZXEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkJLmdldENvbnRhaW5lcigpOwotCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQkJfQotCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIG5ld0VsZW1lbnQgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgc3VwZXIKLQkJCQkJLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJCVVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsaXplcnMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwCi0JCQkJCQkuaW5pdChuZXdFbGVtZW50KTsKLQkJCX0KLQkJCXJldHVybiBuZXdFbGVtZW50OwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMUNvbW1hbmQgZXh0ZW5kcwotCQkJQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQ3JlYXRlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJCXN1cGVyKHJlcSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQkJfTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY29udGFpbmVyOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgbmV3RWxlbWVudCA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBzdXBlcgotCQkJCQkuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJVU1MRWxlbWVudFR5cGVzLkluaXRpYWxpemVycy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEKLQkJCQkJCS5pbml0KG5ld0VsZW1lbnQpOwotCQkJfQotCQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3JlYXRlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTJDb21tYW5kIGV4dGVuZHMKLQkJCUNyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZUFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJCXN1cGVyKHJlcSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQkJfTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY29udGFpbmVyOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJCUFjdGl2aXR5UGFyYW1ldGVyTm9kZSBuZXdFbGVtZW50ID0gKEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgc3VwZXIKLQkJCQkJLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJCVVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsaXplcnMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIKLQkJCQkJCS5pbml0KG5ld0VsZW1lbnQpOwotCQkJfQotCQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RHVwbGljYXRlQ29tbWFuZChEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QgcmVxKSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEdXBsaWNhdGVBbnl0aGluZ0NvbW1hbmQoZWRpdGluZ0RvbWFpbiwgcmVxKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIER1cGxpY2F0ZUFueXRoaW5nQ29tbWFuZCBleHRlbmRzCi0JCQlEdXBsaWNhdGVFT2JqZWN0c0NvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgRHVwbGljYXRlQW55dGhpbmdDb21tYW5kKAotCQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sCi0JCQkJRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIoZWRpdGluZ0RvbWFpbiwgcmVxLmdldExhYmVsKCksIHJlcQotCQkJCQkuZ2V0RWxlbWVudHNUb0JlRHVwbGljYXRlZCgpLCByZXEKLQkJCQkJLmdldEFsbER1cGxpY2F0ZWRFbGVtZW50c01hcCgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Zjk1MDg1Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzCi0JCUNhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjE4MzMyLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NTAzZGMuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpIHsKLQotCQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRGVzdHJveSgpIHsKLQkJCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCQkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiB2aWV3OwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0RWxlbWVudFRvRGVzdHJveSgpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJLy8JCWlmIChVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkvLwkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSkKLQkJLy8JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQocmVxKTsKLQkJLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJaWYgKCEocmVxLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJZmluYWwgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBlbGVtZW50ID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlyZXEuZ2V0U291cmNlKCksIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9FZGdlKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQocmVxKSB7Ci0KLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kIGV4dGVuZHMKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKAotCQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCQlzdXBlcihyZXEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKTsKLQkJfTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0RWxlbWVudFRvRWRpdChFT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJCUNvbnRyb2xGbG93IG5ld0VsZW1lbnQgPSAoQ29udHJvbEZsb3cpIHN1cGVyCi0JCQkJCS5kb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKTsKLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCQluZXdFbGVtZW50LnNldFRhcmdldCgoQWN0aXZpdHlOb2RlKSBnZXRUYXJnZXQoKSk7Ci0JCQkJbmV3RWxlbWVudC5zZXRTb3VyY2UoKEFjdGl2aXR5Tm9kZSkgZ2V0U291cmNlKCkpOwotCQkJfQotCQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMDc2ZTMuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzCi0JCUNhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2OTBiZi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjOGRkYjQuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSB7Ci0KLQkJCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0Rlc3Ryb3koKSB7Ci0JCQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQkJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdmlldzsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRUb0Rlc3Ryb3koKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCS8vCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJLy8JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZChyZXEpCi0JCS8vCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSk7Ci0JCS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmICghKHJlcS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWZpbmFsIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgZWxlbWVudCA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJcmVxLmdldFNvdXJjZSgpLCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSkgewotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCBleHRlbmRzCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldEVsZW1lbnRUb0VkaXQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCQlDb250cm9sRmxvdyBuZXdFbGVtZW50ID0gKENvbnRyb2xGbG93KSBzdXBlcgotCQkJCQkuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJbmV3RWxlbWVudC5zZXRUYXJnZXQoKEFjdGl2aXR5Tm9kZSkgZ2V0VGFyZ2V0KCkpOwotCQkJCW5ld0VsZW1lbnQuc2V0U291cmNlKChBY3Rpdml0eU5vZGUpIGdldFNvdXJjZSgpKTsKLQkJCX0KLQkJCXJldHVybiBuZXdFbGVtZW50OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb24yQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb24yQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjc1ODBiLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uMkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uMkNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb24yR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZWZlMTYuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb24yR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb24ySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb24ySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTM4MzBhLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpIHsKLQotCQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRGVzdHJveSgpIHsKLQkJCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCQkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiB2aWV3OwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0RWxlbWVudFRvRGVzdHJveSgpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25DYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg0OTZkYi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ODk5ZDYuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25HcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25HcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25JdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZmVlYjEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25JdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpIHsKLQotCQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRGVzdHJveSgpIHsKLQkJCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCQkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiB2aWV3OwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0RWxlbWVudFRvRGVzdHJveSgpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg5N2RiNC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJ0aXRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJRU9iamVjdCBtb2RlbE9iamVjdCA9ICgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlFT2JqZWN0IG5leHRWYWx1ZTsKLQkJaW50IG5vZGVWSUQ7Ci0JCWZvciAoSXRlcmF0b3IgdmFsdWVzID0gKChBY3Rpdml0eVBhcnRpdGlvbikgbW9kZWxPYmplY3QpCi0JCQkJLmdldFN1YnBhcnRpdGlvbnMoKS5pdGVyYXRvcigpOyB2YWx1ZXMuaGFzTmV4dCgpOykgewotCQkJbmV4dFZhbHVlID0gKEVPYmplY3QpIHZhbHVlcy5uZXh0KCk7Ci0JCQlub2RlVklEID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0Tm9kZVZpc3VhbElEKHZpZXdPYmplY3QsIG5leHRWYWx1ZSk7Ci0JCQlpZiAoQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWSUQpIHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNmU1MWYuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kKLQkJZXh0ZW5kcyBVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8yMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlQYXJ0aXRpb25fU3VicGFydGl0aW9uKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENyZWF0ZUFjdGl2aXR5UGFydGl0aW9uXzIwMDFDb21tYW5kKHJlcSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZUFjdGl2aXR5UGFydGl0aW9uXzIwMDFDb21tYW5kIGV4dGVuZHMKLQkJCUNyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZUFjdGl2aXR5UGFydGl0aW9uXzIwMDFDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eVBhcnRpdGlvbigpOwotCQl9OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJCS5nZXRDb250YWluZXIoKTsKLQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJCX0KLQkJCXJldHVybiBjb250YWluZXI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzc4MjYwLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFydGl0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlFT2JqZWN0IG1vZGVsT2JqZWN0ID0gKChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCUVPYmplY3QgbmV4dFZhbHVlOwotCQlpbnQgbm9kZVZJRDsKLQkJLy8gbW9kaWZpZWQgdG8gY2hlY2sgQWN0aXZpdHlQYXJ0aXRpb24gb3Igbm90LiB0byBhdm9pZCBjbGFzc2Nhc3QgZXhjZXB0aW9uLgotCQlpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbikgewotCQkJZm9yIChJdGVyYXRvciB2YWx1ZXMgPSAoKEFjdGl2aXR5UGFydGl0aW9uKSBtb2RlbE9iamVjdCkKLQkJCQkJLmdldFN1YnBhcnRpdGlvbnMoKS5pdGVyYXRvcigpOyB2YWx1ZXMuaGFzTmV4dCgpOykgewotCQkJCW5leHRWYWx1ZSA9IChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpOwotCQkJCW5vZGVWSUQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3T2JqZWN0LAotCQkJCQkJbmV4dFZhbHVlKTsKLQkJCQlpZiAoQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWSUQpIHsKLQkJCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NDU1ZjEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuY29tbWFuZHMuQWN0aXZpdHlQYXJ0aXRpb25EZXN0cm95Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5jb21tYW5kcy5DcmVhdGVBY3Rpdml0eU5vZGVJbkFjdGl2aXR5UGFydGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95UmVmZXJlbmNlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eVBhcnRpdGlvbl9TdWJwYXJ0aXRpb24oKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlQWN0aXZpdHlQYXJ0aXRpb25fMjAwMUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJLy8gbW9kaWZpZWQgU1RBUlQKLQkJQ29tbWFuZCBjb21tYW5kID0gZ2V0Q3JlYXRlQWN0aXZpdHlOb2RlQ29tbWFuZChyZXEpOwotCQlpZiAoY29tbWFuZCAhPSBudWxsKSB7Ci0KLQkJCS8vCQkJY29tbWFuZCA9IGNvbW1hbmQuY2hhaW4oZ2V0TVNMV3JhcHBlcihuZXcgVXBkYXRlQWN0aXZpdHlDb21tYW5kKHJlcSkpKTsKLQkJCS8vCQkJY29tbWFuZCA9IGNvbW1hbmQuY2hhaW4obmV3IFVtYUFjdGl2aXR5Q3JlYXRpb25Db21tYW5kKHJlcSkpOwotCQkJcmV0dXJuIGNvbW1hbmQ7Ci0JCX0KLQkJLy8gbW9kaWZpZWQgRU5ECi0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3JlYXRlQWN0aXZpdHlQYXJ0aXRpb25fMjAwMUNvbW1hbmQgZXh0ZW5kcwotCQkJQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQ3JlYXRlQWN0aXZpdHlQYXJ0aXRpb25fMjAwMUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCQlzdXBlcihyZXEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5UGFydGl0aW9uKCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkJLmdldENvbnRhaW5lcigpOwotCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQkJfQotCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBjdXN0b20KLQkgKi8KLQlwcml2YXRlIENvbW1hbmQgZ2V0Q3JlYXRlQWN0aXZpdHlOb2RlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkKLQkJCQl8fCBVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwID09IHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkKLQkJCQl8fCBVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExID09IHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkKLQkJCQl8fCBVTUxFbGVtZW50VHlwZXMuTWVyZ2VOb2RlXzEwMDIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkKLQkJCQl8fCBVTUxFbGVtZW50VHlwZXMuRm9ya05vZGVfMTAwMyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKQotCQkJCXx8IFVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsTm9kZV8xMDA0ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLkRlY2lzaW9uTm9kZV8xMDA1ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLkpvaW5Ob2RlXzEwMDYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkKLQkJCQl8fCBVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSA9PSByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5ID09IHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkKLQkJCQl8fCBVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIgPT0gcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5UGFydGl0aW9uX05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlQWN0aXZpdHlOb2RlSW5BY3Rpdml0eVBhcnRpdGlvbihyZXEpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5nbWYuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5I2dldENyZWF0ZU91dGdvaW5nKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCkKLQkgKiBAbW9kaWlmZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVPdXRnb2luZyhDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0KLQkvKgotCSAqIEBjdXN0b20KLQkgKi8KLQkvLwlwcml2YXRlIHZvaWQgdXBkYXRlQWN0aXZpdHlDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QsIENvbW1hbmQgY21kKXsKLQkvLwkJRU9iamVjdCBvYmogPSByZXF1ZXN0LmdldE5ld0VsZW1lbnQoKTsKLQkvLwkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JLy8JCQlFT2JqZWN0IHBhcmVudCA9IG9iajsKLQkvLwkJCXdoaWxlICghKHBhcmVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkvLwkJCQlwYXJlbnQgPSBwYXJlbnQuZUNvbnRhaW5lcigpOwotCS8vCQkJfQotCS8vCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCS8vCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpOwotCS8vCQkJU2V0UmVxdWVzdCByZXEgPSBuZXcgU2V0UmVxdWVzdChwYXJlbnQsIGZlYXR1cmUsIHJlcXVlc3QKLQkvLwkJCQkJLmdldE5ld0VsZW1lbnQoKSk7Ci0JLy8JCQljbWQuY2hhaW4oZ2V0TVNMV3JhcHBlcihuZXcgU2V0VmFsdWVDb21tYW5kKHJlcSkpKTsKLQkvLwkJfQotCS8vCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzLlVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5I2dldERlc3Ryb3lFbGVtZW50Q29tbWFuZChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQkvKiBtb2RpZnkgU1RBUlQgKi8KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IEFjdGl2aXR5UGFydGl0aW9uRGVzdHJveUNvbW1hbmQocmVxLCBnZXRIb3N0KCkpKTsKLQkJLyogbW9kaWZ5IEVORCAqLwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXMuVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kjZ2V0RGVzdHJveVJlZmVyZW5jZUNvbW1hbmQob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95UmVmZXJlbmNlUmVxdWVzdCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95UmVmZXJlbmNlQ29tbWFuZChEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIHN1cGVyLmdldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvQ29udHJvbEZsb3dJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Db250cm9sRmxvd0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNmNGY0Ni4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Db250cm9sRmxvd0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xGbG93SXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0RlY2lzaW9uTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0RlY2lzaW9uTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYxYTRlMS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9EZWNpc2lvbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0RlY2lzaW9uTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9EZWNpc2lvbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDIyMjc5Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0RlY2lzaW9uTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0RlY2lzaW9uTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0RlY2lzaW9uTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRhMDc4Ny4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9EZWNpc2lvbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlY2lzaW9uTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpIHsKLQotCQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRGVzdHJveSgpIHsKLQkJCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCQkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiB2aWV3OwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0RWxlbWVudFRvRGVzdHJveSgpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJLy8JCWlmIChVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkvLwkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSkKLQkJLy8JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQocmVxKTsKLQkJLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJaWYgKCEocmVxLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJZmluYWwgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBlbGVtZW50ID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlyZXEuZ2V0U291cmNlKCksIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9FZGdlKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQocmVxKSB7Ci0KLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kIGV4dGVuZHMKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKAotCQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCQlzdXBlcihyZXEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKTsKLQkJfTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0RWxlbWVudFRvRWRpdChFT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJCUNvbnRyb2xGbG93IG5ld0VsZW1lbnQgPSAoQ29udHJvbEZsb3cpIHN1cGVyCi0JCQkJCS5kb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKTsKLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCQluZXdFbGVtZW50LnNldFRhcmdldCgoQWN0aXZpdHlOb2RlKSBnZXRUYXJnZXQoKSk7Ci0JCQkJbmV3RWxlbWVudC5zZXRTb3VyY2UoKEFjdGl2aXR5Tm9kZSkgZ2V0U291cmNlKCkpOwotCQkJfQotCQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0ZvcmtOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTNkZWRhLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0ZvcmtOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRm9ya05vZGVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0ZvcmtOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0ZvcmtOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ0NzM4OC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMgVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvRm9ya05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ3Zjc3MC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRm9ya05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSB7Ci0KLQkJCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0Rlc3Ryb3koKSB7Ci0JCQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQkJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdmlldzsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRUb0Rlc3Ryb3koKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCS8vCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJLy8JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZChyZXEpCi0JCS8vCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSk7Ci0JCS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmICghKHJlcS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWZpbmFsIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgZWxlbWVudCA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJcmVxLmdldFNvdXJjZSgpLCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSkgewotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCBleHRlbmRzCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldEVsZW1lbnRUb0VkaXQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCQlDb250cm9sRmxvdyBuZXdFbGVtZW50ID0gKENvbnRyb2xGbG93KSBzdXBlcgotCQkJCQkuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJbmV3RWxlbWVudC5zZXRUYXJnZXQoKEFjdGl2aXR5Tm9kZSkgZ2V0VGFyZ2V0KCkpOwotCQkJCW5ld0VsZW1lbnQuc2V0U291cmNlKChBY3Rpdml0eU5vZGUpIGdldFNvdXJjZSgpKTsKLQkJCX0KLQkJCXJldHVybiBuZXdFbGVtZW50OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvSW5pdGlhbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Jbml0aWFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA1ODkyMi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Jbml0aWFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Jbml0aWFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Jbml0aWFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNzUxYzQuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvSW5pdGlhbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5pdGlhbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0luaXRpYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvSW5pdGlhbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YWE4OTkuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvSW5pdGlhbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSW5pdGlhbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkgewotCi0JCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9EZXN0cm95KCkgewotCQkJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHZpZXc7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRFbGVtZW50VG9EZXN0cm95KCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkvLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCS8vCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQocmVxKQotCQkvLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZChyZXEpOwotCQkvLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmdtZi5kaWFncmFtLmVkaXQucG9saWNpZXMuVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kjZ2V0Q3JlYXRlSW5jb21pbmdDb21wbGV0ZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlSW5jb21pbmdDb21wbGV0ZShDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlpZiAocmVxLmdldFRhcmdldCgpIGluc3RhbmNlb2YgSW5pdGlhbE5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVJbmNvbWluZ0NvbXBsZXRlKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmICghKHJlcS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWZpbmFsIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgZWxlbWVudCA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJcmVxLmdldFNvdXJjZSgpLCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSkgewotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCBleHRlbmRzCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldEVsZW1lbnRUb0VkaXQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCQlDb250cm9sRmxvdyBuZXdFbGVtZW50ID0gKENvbnRyb2xGbG93KSBzdXBlcgotCQkJCQkuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJbmV3RWxlbWVudC5zZXRUYXJnZXQoKEFjdGl2aXR5Tm9kZSkgZ2V0VGFyZ2V0KCkpOwotCQkJCW5ld0VsZW1lbnQuc2V0U291cmNlKChBY3Rpdml0eU5vZGUpIGdldFNvdXJjZSgpKTsKLQkJCX0KLQkJCXJldHVybiBuZXdFbGVtZW50OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvSm9pbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Kb2luTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5Y2ZiMC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Kb2luTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpvaW5Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Kb2luTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9Kb2luTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNjE5NTMuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvSm9pbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSm9pbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzIFVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL0pvaW5Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvSm9pbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNzAyZjAuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvSm9pbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Kb2luTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSm9pbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSB7Ci0KLQkJCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0Rlc3Ryb3koKSB7Ci0JCQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQkJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdmlldzsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRUb0Rlc3Ryb3koKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCS8vCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJLy8JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZChyZXEpCi0JCS8vCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSk7Ci0JCS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZ21mLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSNnZXRDcmVhdGVPdXRnb2luZyhvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlT3V0Z29pbmcoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQotCQkvLyBWYWxpZGF0aW9uIEpvaW4gTm9kZSBzaG91bGQgYWxsb3cgb25seSBvbmUgb3V0Z29pbmcgY29ubmVjdGlvbi4KLQkJaWYgKHJlcS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEpvaW5Ob2RlKSB7Ci0JCQlKb2luTm9kZSBqb2luID0gKEpvaW5Ob2RlKSByZXEuZ2V0U291cmNlKCk7Ci0JCQlMaXN0IGxpc3QgPSBqb2luLmdldE91dGdvaW5ncygpOwotCQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+PSAxKSB7Ci0JCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZU91dGdvaW5nKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmICghKHJlcS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWZpbmFsIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgZWxlbWVudCA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJcmVxLmdldFNvdXJjZSgpLCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSkgewotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCBleHRlbmRzCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldEVsZW1lbnRUb0VkaXQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCQlDb250cm9sRmxvdyBuZXdFbGVtZW50ID0gKENvbnRyb2xGbG93KSBzdXBlcgotCQkJCQkuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJbmV3RWxlbWVudC5zZXRUYXJnZXQoKEFjdGl2aXR5Tm9kZSkgZ2V0VGFyZ2V0KCkpOwotCQkJCW5ld0VsZW1lbnQuc2V0U291cmNlKChBY3Rpdml0eU5vZGUpIGdldFNvdXJjZSgpKTsKLQkJCX0KLQkJCXJldHVybiBuZXdFbGVtZW50OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODhkMjliLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL01lcmdlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lcmdlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL01lcmdlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZTY3NWEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lcmdlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjhiNWFlLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL01lcmdlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVyZ2VOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkgewotCi0JCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9EZXN0cm95KCkgewotCQkJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHZpZXc7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRFbGVtZW50VG9EZXN0cm95KCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkvLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCS8vCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQocmVxKQotCQkvLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZChyZXEpOwotCQkvLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlpZiAoIShyZXEuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlmaW5hbCBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGVsZW1lbnQgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXJlcS5nZXRTb3VyY2UoKSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX0VkZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZChyZXEpIHsKLQotCQkJLyoqCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQgZXh0ZW5kcwotCQkJQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQoCi0JCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJCXN1cGVyKHJlcSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpOwotCQl9OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRFbGVtZW50VG9FZGl0KEVPYmplY3QgZWxlbWVudCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCkgewotCQkJQ29udHJvbEZsb3cgbmV3RWxlbWVudCA9IChDb250cm9sRmxvdykgc3VwZXIKLQkJCQkJLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJCW5ld0VsZW1lbnQuc2V0VGFyZ2V0KChBY3Rpdml0eU5vZGUpIGdldFRhcmdldCgpKTsKLQkJCQluZXdFbGVtZW50LnNldFNvdXJjZSgoQWN0aXZpdHlOb2RlKSBnZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3RWxlbWVudDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MDI3MjUuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcwotCQlDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzkwMDY4Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDEyOWI2Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpIHsKLQotCQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRGVzdHJveSgpIHsKLQkJCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCQkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiB2aWV3OwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0RWxlbWVudFRvRGVzdHJveSgpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJLy8JCWlmIChVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkvLwkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSkKLQkJLy8JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQocmVxKTsKLQkJLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJaWYgKCEocmVxLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJZmluYWwgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBlbGVtZW50ID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlyZXEuZ2V0U291cmNlKCksIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9FZGdlKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQocmVxKSB7Ci0KLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kIGV4dGVuZHMKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKAotCQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCQlzdXBlcihyZXEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKTsKLQkJfTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0RWxlbWVudFRvRWRpdChFT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJCUNvbnRyb2xGbG93IG5ld0VsZW1lbnQgPSAoQ29udHJvbEZsb3cpIHN1cGVyCi0JCQkJCS5kb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKTsKLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCQluZXdFbGVtZW50LnNldFRhcmdldCgoQWN0aXZpdHlOb2RlKSBnZXRUYXJnZXQoKSk7Ci0JCQkJbmV3RWxlbWVudC5zZXRTb3VyY2UoKEFjdGl2aXR5Tm9kZSkgZ2V0U291cmNlKCkpOwotCQkJfQotCQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDBiN2EyLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3YWUxYi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0dyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0dyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIxYmYyOC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSB7Ci0KLQkJCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0Rlc3Ryb3koKSB7Ci0JCQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQkJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdmlldzsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRUb0Rlc3Ryb3koKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCS8vCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJLy8JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZChyZXEpCi0JCS8vCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSk7Ci0JCS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmICghKHJlcS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWZpbmFsIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgZWxlbWVudCA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJcmVxLmdldFNvdXJjZSgpLCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvdzMwMDFDb21tYW5kKHJlcSkgewotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCBleHRlbmRzCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldEVsZW1lbnRUb0VkaXQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCQlDb250cm9sRmxvdyBuZXdFbGVtZW50ID0gKENvbnRyb2xGbG93KSBzdXBlcgotCQkJCQkuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJbmV3RWxlbWVudC5zZXRUYXJnZXQoKEFjdGl2aXR5Tm9kZSkgZ2V0VGFyZ2V0KCkpOwotCQkJCW5ld0VsZW1lbnQuc2V0U291cmNlKChBY3Rpdml0eU5vZGUpIGdldFNvdXJjZSgpKTsKLQkJCX0KLQkJCXJldHVybiBuZXdFbGVtZW50OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMTY2NmMuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYmQwZjEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZkYWViZC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkgewotCi0JCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9EZXN0cm95KCkgewotCQkJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHZpZXc7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRFbGVtZW50VG9EZXN0cm95KCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkvLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCS8vCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQocmVxKQotCQkvLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZChyZXEpOwotCQkvLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlpZiAoIShyZXEuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlmaW5hbCBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGVsZW1lbnQgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXJlcS5nZXRTb3VyY2UoKSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX0VkZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENyZWF0ZUluY29taW5nQ29udHJvbEZsb3czMDAxQ29tbWFuZChyZXEpIHsKLQotCQkJLyoqCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQgZXh0ZW5kcwotCQkJQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93MzAwMUNvbW1hbmQoCi0JCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJCXN1cGVyKHJlcSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpOwotCQl9OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRFbGVtZW50VG9FZGl0KEVPYmplY3QgZWxlbWVudCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCkgewotCQkJQ29udHJvbEZsb3cgbmV3RWxlbWVudCA9IChDb250cm9sRmxvdykgc3VwZXIKLQkJCQkJLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJCW5ld0VsZW1lbnQuc2V0VGFyZ2V0KChBY3Rpdml0eU5vZGUpIGdldFRhcmdldCgpKTsKLQkJCQluZXdFbGVtZW50LnNldFNvdXJjZSgoQWN0aXZpdHlOb2RlKSBnZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3RWxlbWVudDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1VNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmFkYmFhLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1VNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuY29tbWFuZHMuQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvd0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuY29tbWFuZHMuQ3JlYXRlT3V0Z29pbmdDb250cm9sRmxvd0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQuaGVscGVycy5VTUxCYXNlRWRpdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuRWxlbWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFZGl0SGVscGVyQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95UmVmZXJlbmNlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuR2V0RWRpdENvbnRleHRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuSUVkaXRDb21tYW5kUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLk1vdmVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuU2V0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzIFNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0U2VtYW50aWNDb21tYW5kKElFZGl0Q29tbWFuZFJlcXVlc3QgcmVxdWVzdCkgewotCQlJRWRpdENvbW1hbmRSZXF1ZXN0IGNvbXBsZXRlZFJlcXVlc3QgPSBjb21wbGV0ZVJlcXVlc3QocmVxdWVzdCk7Ci0JCU9iamVjdCBlZGl0SGVscGVyQ29udGV4dCA9IGNvbXBsZXRlZFJlcXVlc3QuZ2V0RWRpdEhlbHBlckNvbnRleHQoKTsKLQkJaWYgKGVkaXRIZWxwZXJDb250ZXh0IGluc3RhbmNlb2YgVmlldwotCQkJCXx8IChlZGl0SGVscGVyQ29udGV4dCBpbnN0YW5jZW9mIElFZGl0SGVscGVyQ29udGV4dCAmJiAoKElFZGl0SGVscGVyQ29udGV4dCkgZWRpdEhlbHBlckNvbnRleHQpCi0JCQkJCQkuZ2V0RU9iamVjdCgpIGluc3RhbmNlb2YgVmlldykpIHsKLQkJCS8vIG5vIHNlbWFudGljIGNvbW1hbmRzIGFyZSBwcm92aWRlZCBmb3IgcHVyZSBkZXNpZ24gZWxlbWVudHMKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChlZGl0SGVscGVyQ29udGV4dCA9PSBudWxsKSB7Ci0JCQllZGl0SGVscGVyQ29udGV4dCA9IFZpZXdVdGlsCi0JCQkJCS5yZXNvbHZlU2VtYW50aWNFbGVtZW50KChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSk7Ci0JCX0KLQkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEVsZW1lbnRUeXBlKGVkaXRIZWxwZXJDb250ZXh0KTsKLQkJaWYgKGVsZW1lbnRUeXBlID09IEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlKAotCQkJCSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmRlZmF1bHQiKSkgeyAvLyROT04tTkxTLTEkIAotCQkJZWxlbWVudFR5cGUgPSBudWxsOwotCQl9Ci0JCUNvbW1hbmQgZXBDb21tYW5kID0gZ2V0U2VtYW50aWNDb21tYW5kU3dpdGNoKGNvbXBsZXRlZFJlcXVlc3QpOwotCQlpZiAoZXBDb21tYW5kICE9IG51bGwpIHsKLQkJCUlDb21tYW5kIGNvbW1hbmQgPSBlcENvbW1hbmQgaW5zdGFuY2VvZiBJQ29tbWFuZFByb3h5ID8gKChJQ29tbWFuZFByb3h5KSBlcENvbW1hbmQpCi0JCQkJCS5nZXRJQ29tbWFuZCgpCi0JCQkJCTogbmV3IENvbW1hbmRQcm94eShlcENvbW1hbmQpOwotCQkJY29tcGxldGVkUmVxdWVzdC5zZXRQYXJhbWV0ZXIoCi0JCQkJCVVNTEJhc2VFZGl0SGVscGVyLkVESVRfUE9MSUNZX0NPTU1BTkQsIGNvbW1hbmQpOwotCQl9Ci0JCUNvbW1hbmQgZWhDb21tYW5kID0gbnVsbDsKLQkJaWYgKGVsZW1lbnRUeXBlICE9IG51bGwpIHsKLQkJCUlDb21tYW5kIGNvbW1hbmQgPSBlbGVtZW50VHlwZS5nZXRFZGl0Q29tbWFuZChjb21wbGV0ZWRSZXF1ZXN0KTsKLQkJCWlmIChjb21tYW5kICE9IG51bGwpIHsKLQkJCQlpZiAoIShjb21tYW5kIGluc3RhbmNlb2YgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQpKSB7Ci0JCQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCQkJCWNvbW1hbmQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoZWRpdGluZ0RvbWFpbiwKLQkJCQkJCQludWxsKS5jb21wb3NlKGNvbW1hbmQpOwotCQkJCX0KLQkJCQllaENvbW1hbmQgPSBuZXcgSUNvbW1hbmRQcm94eShjb21tYW5kKTsKLQkJCX0KLQkJfQotCQlib29sZWFuIHNob3VsZFByb2NlZWQgPSB0cnVlOwotCQlpZiAoY29tcGxldGVkUmVxdWVzdCBpbnN0YW5jZW9mIERlc3Ryb3lSZXF1ZXN0KSB7Ci0JCQlzaG91bGRQcm9jZWVkID0gc2hvdWxkUHJvY2VlZCgoRGVzdHJveVJlcXVlc3QpIGNvbXBsZXRlZFJlcXVlc3QpOwotCQl9Ci0JCWlmIChzaG91bGRQcm9jZWVkKSB7Ci0JCQlpZiAoY29tcGxldGVkUmVxdWVzdCBpbnN0YW5jZW9mIERlc3Ryb3lSZXF1ZXN0KSB7Ci0JCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQkJCUNvbW1hbmQgZGVsZXRlVmlld0NvbW1hbmQgPSBuZXcgSUNvbW1hbmRQcm94eSgKLQkJCQkJCW5ldyBEZWxldGVDb21tYW5kKGVkaXRpbmdEb21haW4sIChWaWV3KSBnZXRIb3N0KCkKLQkJCQkJCQkJLmdldE1vZGVsKCkpKTsKLQkJCQllaENvbW1hbmQgPSBlaENvbW1hbmQgPT0gbnVsbCA/IGRlbGV0ZVZpZXdDb21tYW5kIDogZWhDb21tYW5kCi0JCQkJCQkuY2hhaW4oZGVsZXRlVmlld0NvbW1hbmQpOwotCQkJfQotCQkJcmV0dXJuIGVoQ29tbWFuZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0U2VtYW50aWNDb21tYW5kU3dpdGNoKElFZGl0Q29tbWFuZFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChyZXEgaW5zdGFuY2VvZiBDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBDcmVhdGVFbGVtZW50UmVxdWVzdCkgewotCQkJcmV0dXJuIGdldENyZWF0ZUNvbW1hbmQoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIENvbmZpZ3VyZVJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRDb25maWd1cmVDb21tYW5kKChDb25maWd1cmVSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIERlc3Ryb3lFbGVtZW50UmVxdWVzdCkgewotCQkJcmV0dXJuIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZCgoRGVzdHJveUVsZW1lbnRSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIERlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0RGVzdHJveVJlZmVyZW5jZUNvbW1hbmQoKERlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIER1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldER1cGxpY2F0ZUNvbW1hbmQoKER1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBHZXRFZGl0Q29udGV4dFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRFZGl0Q29udGV4dENvbW1hbmQoKEdldEVkaXRDb250ZXh0UmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBNb3ZlUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldE1vdmVDb21tYW5kKChNb3ZlUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcENvbW1hbmQoKFJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoKFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBTZXRSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0U2V0Q29tbWFuZCgoU2V0UmVxdWVzdCkgcmVxKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29uZmlndXJlQ29tbWFuZChDb25maWd1cmVSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlT3V0Z29pbmcocmVxKQotCQkJCQk6IGdldENyZWF0ZUluY29taW5nQ29tcGxldGUocmVxKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDaGlsZHJlbiBzaG91bGQgb3ZlcnJpZGUgdGhpcywgZm9yIGFueSBleHRyYSB2YWxpZGF0aW9ucy4KLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVJbmNvbWluZ0NvbXBsZXRlKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUNvbW1hbmQgY29tbWFuZDsKLQkJaWYgKHJlcS5nZXRTb3VyY2UoKSA9PSByZXEuZ2V0VGFyZ2V0KCkpIHsKLQkJCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCX07Ci0JCX0KLQotCQlpZiAoIShyZXEuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCi0JCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgIShlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKGlzRHVwbGljYXRlUmVsYXRpb25zaGlwKHJlcS5nZXRTb3VyY2UoKSwgcmVxLmdldFRhcmdldCgpKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJCi0JCWlmKERpYWdyYW1Db3JlVmFsaWRhdGlvbi5jYW5Db25uZWN0KChFZGl0UGFydClnZXRIb3N0KCksIHJlcS5nZXRUYXJnZXQoKSwgcmVxLmdldFNvdXJjZSgpKSAhPSBudWxsKQotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X0VkZ2UoKSk7Ci0JCQl9Ci0JCQljb21tYW5kID0gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvd0NvbW1hbmQocmVxLAotCQkJCQllbGVtZW50LmVDb250YWluZXIoKSkpOwotCi0JCQkvLwkJCWlmIChyZXEuZ2V0VGFyZ2V0KCkgIT0gcmVxLmdldFNvdXJjZSgpKSB7Ci0JCQkvLwkJCQljb21tYW5kID0gY29tbWFuZC5jaGFpbihuZXcgQ3JlYXRlUHJlZGVjZXNzb3JDb21tYW5kKHJlcSkpOwotCQkJLy8JCQl9Ci0JCQlyZXR1cm4gY29tbWFuZDsKLQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrICBpZiB0aGUgbGluayBiZXR3ZWVuIHR3byBlbmRzIGFscmVhZHkgZXhpc3RzLgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0R1cGxpY2F0ZVJlbGF0aW9uc2hpcChFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCB0YXJnZXQpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSBzb3VyY2UuZUNvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBjb250YWluZXI7Ci0JCQlMaXN0IGxpc3QgPSBhY3Rpdml0eS5nZXRFZGdlcygpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eUVkZ2UgZWxlbWVudCA9IChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJCWlmICgoZWxlbWVudC5nZXRTb3VyY2UoKSA9PSBzb3VyY2UpCi0JCQkJCQkmJiBlbGVtZW50LmdldFRhcmdldCgpID09IHRhcmdldCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZU91dGdvaW5nKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmICghKHJlcS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgIShlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSkgewotCQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJfTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJLy8gVE9ETzogIGNoZWNrIHRoZSBzYW1lIHR5cGUsIGRvbid0IGNyZWF0ZSBjb25uZWN0aW9uLgotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X0VkZ2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENyZWF0ZU91dGdvaW5nQ29udHJvbEZsb3dDb21tYW5kKHJlcSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0U2V0Q29tbWFuZChTZXRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RWRpdENvbnRleHRDb21tYW5kKEdldEVkaXRDb250ZXh0UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95UmVmZXJlbmNlQ29tbWFuZChEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldER1cGxpY2F0ZUNvbW1hbmQoRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNvbW1hbmQoTW92ZVJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNU0xXcmFwcGVyKElDb21tYW5kIGNtZCkgewotCQlyZXR1cm4gbmV3IElDb21tYW5kUHJveHkoY21kKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0U2VtYW50aWNFbGVtZW50KCkgewotCQlyZXR1cm4gVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudCgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIGNvbnRhaW5lciBlbGVtZW50IGZvciB0aGUgbmV3IHJlbGF0aW9uc2hpcCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBnb2VzIHVwIGJ5IGNvbnRhaW5tZW50IGhpZXJhcmNoeSBzdGFydGluZyBmcm9tCi0JICogdGhlIHNwZWNpZmllZCBlbGVtZW50IGFuZCByZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgaW5zdGFuY2Ugb2YKLQkgKiB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciBjbGFzcy4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKEVPYmplY3QgZWxlbWVudCwKLQkJCUVDbGFzcyBjb250YWluZXJDbGFzcywgSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKLQkJZm9yICg7IGVsZW1lbnQgIT0gbnVsbDsgZWxlbWVudCA9IGVsZW1lbnQuZUNvbnRhaW5lcigpKSB7Ci0JCQlpZiAoY29udGFpbmVyQ2xhc3MuaXNTdXBlclR5cGVPZihlbGVtZW50LmVDbGFzcygpKSkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvVU1MRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1VNTEV4dE5vZGVMYWJlbEhvc3RMYXlvdXRFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYzE1NWEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvVU1MRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuR3JvdXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlhZTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxFeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeSBleHRlbmRzIFhZTGF5b3V0RWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMYXlvdXRFZGl0UG9saWN5IHJlYWxMYXlvdXRFZGl0UG9saWN5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMYXlvdXRFZGl0UG9saWN5IGdldFJlYWxMYXlvdXRFZGl0UG9saWN5KCkgewotCQlyZXR1cm4gcmVhbExheW91dEVkaXRQb2xpY3k7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWxMYXlvdXRFZGl0UG9saWN5KExheW91dEVkaXRQb2xpY3kgcmVhbExheW91dEVkaXRQb2xpY3kpIHsKLQkJdGhpcy5yZWFsTGF5b3V0RWRpdFBvbGljeSA9IHJlYWxMYXlvdXRFZGl0UG9saWN5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4dGVybmFsTGFiZWwoRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdCBnZXRFeHRlcm5hbExhYmVscyhHcm91cFJlcXVlc3QgcmVxdWVzdCkgewotCQlMaXN0IGVkaXRQYXJ0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCkgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGlzRXh0ZXJuYWxMYWJlbChlZGl0UGFydCkpIHsKLQkJCQkJZWRpdFBhcnRzLmFkZChlZGl0UGFydCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlZGl0UGFydHM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChSRVFfTU9WRV9DSElMRFJFTi5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpKSB7Ci0JCQlDaGFuZ2VCb3VuZHNSZXF1ZXN0IGNiUmVxdWVzdCA9IChDaGFuZ2VCb3VuZHNSZXF1ZXN0KSByZXF1ZXN0OwotCQkJTGlzdCBleHRMYWJlbHMgPSBnZXRFeHRlcm5hbExhYmVscyhjYlJlcXVlc3QpOwotCQkJaWYgKCFleHRMYWJlbHMuaXNFbXB0eSgpKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBjYlJlcXVlc3QuZ2V0RWRpdFBhcnRzKCk7Ci0JCQkJQ29tbWFuZCBjbWQgPSBudWxsOwotCQkJCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsCi0JCQkJCQkmJiBlZGl0UGFydHMuc2l6ZSgpID4gZXh0TGFiZWxzLnNpemUoKSkgewotCQkJCQlMaXN0IG90aGVyID0gbmV3IEFycmF5TGlzdChlZGl0UGFydHMpOwotCQkJCQlvdGhlci5yZW1vdmVBbGwoZXh0TGFiZWxzKTsKLQkJCQkJY2JSZXF1ZXN0LnNldEVkaXRQYXJ0cyhvdGhlcik7Ci0JCQkJCWNtZCA9IHJlYWxMYXlvdXRFZGl0UG9saWN5LmdldENvbW1hbmQocmVxdWVzdCk7Ci0JCQkJfQotCQkJCWNiUmVxdWVzdC5zZXRFZGl0UGFydHMoZXh0TGFiZWxzKTsKLQkJCQlDb21tYW5kIGV4dExhYmVsc0NtZCA9IGdldE1vdmVDaGlsZHJlbkNvbW1hbmQocmVxdWVzdCk7Ci0JCQkJY2JSZXF1ZXN0LnNldEVkaXRQYXJ0cyhlZGl0UGFydHMpOwotCQkJCXJldHVybiBjbWQgPT0gbnVsbCA/IGV4dExhYmVsc0NtZCA6IGNtZC5jaGFpbihleHRMYWJlbHNDbWQpOwotCQkJfQotCQl9Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgR3JvdXBSZXF1ZXN0KSB7Ci0JCQlMaXN0IGV4dExhYmVscyA9IGdldEV4dGVybmFsTGFiZWxzKChHcm91cFJlcXVlc3QpIHJlcXVlc3QpOwotCQkJaWYgKCFleHRMYWJlbHMuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlYWxMYXlvdXRFZGl0UG9saWN5ID09IG51bGwgPyBudWxsIDogcmVhbExheW91dEVkaXRQb2xpY3kKLQkJCQkuZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb25zdHJhaW50Rm9yKENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCwKLQkJCUdyYXBoaWNhbEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCWludCBkeCA9ICgoSW50ZWdlcikgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSgoVmlldykgY2hpbGQKLQkJCQkuZ2V0TW9kZWwoKSwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkpKQotCQkJCS5pbnRWYWx1ZSgpOwotCQlpbnQgZHkgPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoKFZpZXcpIGNoaWxkCi0JCQkJLmdldE1vZGVsKCksIE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpKSkKLQkJCQkuaW50VmFsdWUoKTsKLQkJUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKGR4LCBkeSwgMCwgMCk7Ci0JCWNoaWxkLmdldEZpZ3VyZSgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocik7Ci0JCXIudHJhbnNsYXRlKHJlcXVlc3QuZ2V0TW92ZURlbHRhKCkpOwotCQljaGlsZC5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb1JlbGF0aXZlKHIpOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsCi0JCQkJJiYgcmVhbExheW91dEVkaXRQb2xpY3kudW5kZXJzdGFuZHNSZXF1ZXN0KHJlcSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdXBlci51bmRlcnN0YW5kc1JlcXVlc3QocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVDaGlsZChFZGl0UGFydCBjaGlsZCkgewotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIb3N0KEVkaXRQYXJ0IGhvc3QpIHsKLQkJc3VwZXIuc2V0SG9zdChob3N0KTsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LnNldEhvc3QoaG9zdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5hY3RpdmF0ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LmRlYWN0aXZhdGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0VGFyZ2V0RWRpdFBhcnQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVhbExheW91dEVkaXRQb2xpY3kuZ2V0VGFyZ2V0RWRpdFBhcnQocmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0VGFyZ2V0RWRpdFBhcnQocmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2hvd1NvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuc2hvd1NvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuc2hvd1NvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVyYXNlU291cmNlRmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5lcmFzZVNvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuZXJhc2VTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93VGFyZ2V0RmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5zaG93VGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5zaG93VGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZXJhc2VUYXJnZXRGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LmVyYXNlVGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5lcmFzZVRhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1VNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MDFhMTkuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVDb25uZWN0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbXBvc2l0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmVkaXRoZWxwZXJzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlQ29ubmVjdGlvblZpZXdBbmRFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5jb21tYW5kcy5VTUxSZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzIEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUVsZW1lbnRUeXBlIGdldEVsZW1lbnRUeXBlKENyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBDcmVhdGVDb25uZWN0aW9uVmlld0FuZEVsZW1lbnRSZXF1ZXN0KSB7Ci0JCQlDcmVhdGVFbGVtZW50UmVxdWVzdEFkYXB0ZXIgcmVxdWVzdEFkYXB0ZXIgPSAoKENyZWF0ZUNvbm5lY3Rpb25WaWV3QW5kRWxlbWVudFJlcXVlc3QpIHJlcXVlc3QpCi0JCQkJCS5nZXRDb25uZWN0aW9uVmlld0FuZEVsZW1lbnREZXNjcmlwdG9yKCkKLQkJCQkJLmdldENyZWF0ZUVsZW1lbnRSZXF1ZXN0QWRhcHRlcigpOwotCQkJcmV0dXJuIChJRWxlbWVudFR5cGUpIHJlcXVlc3RBZGFwdGVyLmdldEFkYXB0ZXIoSUVsZW1lbnRUeXBlLmNsYXNzKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29ubmVjdGlvbldpdGhSZW9yaWVudGVkVmlld0NvbXBsZXRlQ29tbWFuZCgKLQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3QpIHsKLQkJSUNvbW1hbmRQcm94eSBjID0gKElDb21tYW5kUHJveHkpIHN1cGVyCi0JCQkJLmdldENvbm5lY3Rpb25Db21wbGV0ZUNvbW1hbmQocmVxdWVzdCk7Ci0JCUNvbXBvc2l0ZUNvbW1hbmQgY2MgPSAoQ29tcG9zaXRlQ29tbWFuZCkgYy5nZXRJQ29tbWFuZCgpOwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlVTUxSZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCByY3ZDb21tYW5kID0gbmV3IFVNTFJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kKAotCQkJCWVkaXRpbmdEb21haW4sIG51bGwpOwotCQlyY3ZDb21tYW5kLnNldEVkZ2VBZGFwdG9yKGdldFZpZXdBZGFwdGVyKCkpOwotCQljYy5jb21wb3NlKHJjdkNvbW1hbmQpOwotCQlyZXR1cm4gYzsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9VTUxSZWZlcmVuY2VDb25uZWN0aW9uRWRpdFBvbGljeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvVU1MUmVmZXJlbmNlQ29ubmVjdGlvbkVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM3Zjg0YS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9VTUxSZWZlcmVuY2VDb25uZWN0aW9uRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RDb25uZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Db25uZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuR3JvdXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5FZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuR3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxSZWZlcmVuY2VDb25uZWN0aW9uRWRpdFBvbGljeSBleHRlbmRzIENvbm5lY3Rpb25FZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0ZST01fRElBR1JBTV9ETEdfVElUTEUgPSBEaWFncmFtVUlNZXNzYWdlcy5Qcm9tcHRpbmdEZWxldGVBY3Rpb25fRGVsZXRlRnJvbURpYWdyYW1EaWFsb2dfVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9GUk9NX0RJQUdSQU1fRExHX01FU1NBR0UgPSBEaWFncmFtVUlNZXNzYWdlcy5Qcm9tcHRpbmdEZWxldGVBY3Rpb25fRGVsZXRlRnJvbURpYWdyYW1EaWFsb2dfTWVzc2FnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0ZST01fTU9ERUxfRExHX1RPR0dMRV9MQUJFTCA9IERpYWdyYW1VSU1lc3NhZ2VzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlX0RvTm90UHJvbXB0QWdhaW5Ub2dnbGVfbGFiZWw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZChHcm91cFJlcXVlc3QgZGVsZXRlUmVxdWVzdCkgewotCQlib29sZWFuIGlzRGVsZXRlRnJvbUtleUJvYXJkID0gZGVsZXRlUmVxdWVzdCBpbnN0YW5jZW9mIEdyb3VwUmVxdWVzdFZpYUtleWJvYXJkOwotCQlpZiAoc2hvdWxkRGVsZXRlU2VtYW50aWMoKSkgewotCQkJcmV0dXJuIGNyZWF0ZURlbGV0ZVNlbWFudGljQ29tbWFuZChkZWxldGVSZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCWJvb2xlYW4gcHJvY2VlZFRvRGVsZXRlVmlldyA9IHRydWU7Ci0JCQlpZiAoaXNEZWxldGVGcm9tS2V5Qm9hcmQpIHsKLQkJCQlHcm91cFJlcXVlc3RWaWFLZXlib2FyZCBncm91cFJlcXVlc3RWaWFLZXlib2FyZCA9IChHcm91cFJlcXVlc3RWaWFLZXlib2FyZCkgZGVsZXRlUmVxdWVzdDsKLQkJCQlpZiAoZ3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQuaXNTaG93SW5mb3JtYXRpb25EaWFsb2coKSkgewotCQkJCQlwcm9jZWVkVG9EZWxldGVWaWV3ID0gc2hvd1Byb21wdCgpOwotCQkJCQlncm91cFJlcXVlc3RWaWFLZXlib2FyZC5zZXRTaG93SW5mb3JtYXRpb25EaWFsb2coZmFsc2UpOwotCQkJCQlpZiAoIShwcm9jZWVkVG9EZWxldGVWaWV3KSkKLQkJCQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjcmVhdGVEZWxldGVWaWV3Q29tbWFuZChkZWxldGVSZXF1ZXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVTZW1hbnRpYygpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShnZXRIb3N0KCkgaW5zdGFuY2VvZiBBYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydCk7Ci0JCUFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0IGNlcCA9IChBYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydCkgZ2V0SG9zdCgpOwotCQlib29sZWFuIGlzQ2Fub25pY2FsID0gZmFsc2U7Ci0JCWlmIChjZXAuZ2V0U291cmNlKCkgIT0gbnVsbCkKLQkJCWlzQ2Fub25pY2FsID0gSXNDYW5vbmljYWwoY2VwLmdldFNvdXJjZSgpKTsKLQkJaWYgKGNlcC5nZXRUYXJnZXQoKSAhPSBudWxsKQotCQkJcmV0dXJuIGlzQ2Fub25pY2FsID8gaXNDYW5vbmljYWwgOiBJc0Nhbm9uaWNhbChjZXAuZ2V0VGFyZ2V0KCkpOwotCQlyZXR1cm4gaXNDYW5vbmljYWw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBJc0Nhbm9uaWNhbChFZGl0UGFydCBlcCkgewotCQlFZGl0UGFydCBwYXJlbnQgPSBlcC5nZXRQYXJlbnQoKTsKLQkJcmV0dXJuIHBhcmVudCBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0ID8gKChHcmFwaGljYWxFZGl0UGFydCkgcGFyZW50KQotCQkJCS5pc0Nhbm9uaWNhbCgpCi0JCQkJOiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRGVsZXRlVmlld0NvbW1hbmQoR3JvdXBSZXF1ZXN0IGRlbGV0ZVJlcXVlc3QpIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJcmV0dXJuIG5ldyBJQ29tbWFuZFByb3h5KG5ldyBEZWxldGVDb21tYW5kKGVkaXRpbmdEb21haW4sCi0JCQkJKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURlbGV0ZVNlbWFudGljQ29tbWFuZChHcm91cFJlcXVlc3QgZGVsZXRlUmVxdWVzdCkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlFZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyIHNlbVJlcSA9IG5ldyBFZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyKAotCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZWRpdGluZ0RvbWFpbiwgZmFsc2UpLCBkZWxldGVSZXF1ZXN0Ci0JCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkpOwotCQlDb21tYW5kIHNlbWFudGljQ21kID0gZ2V0SG9zdCgpLmdldENvbW1hbmQoc2VtUmVxKTsKLQkJaWYgKHNlbWFudGljQ21kICE9IG51bGwgJiYgc2VtYW50aWNDbWQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQlDb21wb3VuZENvbW1hbmQgY2MgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JCQljYy5hZGQoc2VtYW50aWNDbWQpOwotCQkJcmV0dXJuIGNjOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2hvd1Byb21wdCgpIHsKLQkJYm9vbGVhbiBwcm9tcHQgPSAoKElQcmVmZXJlbmNlU3RvcmUpICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSkKLQkJCQkuZ2V0Qm9vbGVhbihJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1BST01QVF9PTl9ERUxfRlJPTV9ESUFHUkFNKTsKLQkJaWYgKHByb21wdCkKLQkJCWlmIChzaG93TWVzc2FnZURpYWxvZygpKQotCQkJCXJldHVybiB0cnVlOwotCQkJZWxzZQotCQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG93TWVzc2FnZURpYWxvZygpIHsKLQkJTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUgZGlhbG9nID0gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUKLQkJCQkub3Blblllc05vUXVlc3Rpb24oRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCURFTEVURV9GUk9NX0RJQUdSQU1fRExHX1RJVExFLAotCQkJCQkJREVMRVRFX0ZST01fRElBR1JBTV9ETEdfTUVTU0FHRSwKLQkJCQkJCURFTEVURV9GUk9NX01PREVMX0RMR19UT0dHTEVfTEFCRUwsIGZhbHNlLAotCQkJCQkJKElQcmVmZXJlbmNlU3RvcmUpICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJCQkJCS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkKLQkJCQkJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpLAotCQkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9QUk9NUFRfT05fREVMX0ZST01fRElBR1JBTSk7Ci0JCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IElEaWFsb2dDb25zdGFudHMuWUVTX0lEKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBHcm91cFJlcXVlc3RWaWFLZXlib2FyZCkgewotCQkJcmV0dXJuIGdldERlbGV0ZUNvbW1hbmQoKEdyb3VwUmVxdWVzdCkgcmVxdWVzdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbW1hbmQocmVxdWVzdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvVU1MVGV4dE5vblJlc2l6YWJsZUVkaXRQb2xpY3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1VNTFRleHROb25SZXNpemFibGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyY2FkOTYuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2VkaXQvcG9saWNpZXMvVU1MVGV4dE5vblJlc2l6YWJsZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk1vdmVIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeUV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuRHJhZ0VkaXRQYXJ0c1RyYWNrZXJFeDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MVGV4dE5vblJlc2l6YWJsZUVkaXRQb2xpY3kgZXh0ZW5kcyBOb25SZXNpemFibGVFZGl0UG9saWN5RXggewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUZpZ3VyZSBzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElGaWd1cmUgZm9jdXNGZWVkYmFja0ZpZ3VyZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93UHJpbWFyeVNlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXNob3dTZWxlY3Rpb24oKTsKLQkJCXNob3dGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKHRydWUpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaGlkZVNlbGVjdGlvbigpOwotCQkJYWRkRmVlZGJhY2soc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBjcmVhdGVTZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSgpKTsKLQkJCXJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpOwotCQkJaGlkZUZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZVNlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQoZmFsc2UpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCQlyZW1vdmVGZWVkYmFjayhzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBudWxsOwotCQkJfQotCQkJaGlkZUZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd0ZvY3VzKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWhpZGVGb2N1cygpOwotCQkJYWRkRmVlZGJhY2soZm9jdXNGZWVkYmFja0ZpZ3VyZSA9IGNyZWF0ZUZvY3VzRmVlZGJhY2tGaWd1cmUoKSk7Ci0JCQlyZWZyZXNoRm9jdXNGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhpZGVGb2N1cygpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaWYgKGZvY3VzRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJCXJlbW92ZUZlZWRiYWNrKGZvY3VzRmVlZGJhY2tGaWd1cmUpOwotCQkJCWZvY3VzRmVlZGJhY2tGaWd1cmUgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGdldEZlZWRiYWNrTGF5ZXIoKSB7Ci0JCXJldHVybiBnZXRMYXllcihMYXllckNvbnN0YW50cy5TQ0FMRURfRkVFREJBQ0tfTEFZRVIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVjdGFuZ2xlIGdldEZlZWRiYWNrQm91bmRzKCkgewotCQlSZWN0YW5nbGUgYm91bmRzOwotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCWJvdW5kcyA9ICgoTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuZ2V0VGV4dEJvdW5kcygpOwotCQkJYm91bmRzLmludGVyc2VjdChnZXRIb3N0RmlndXJlKCkuZ2V0Qm91bmRzKCkpOwotCQl9IGVsc2UgewotCQkJYm91bmRzID0gZ2V0SG9zdEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJfQotCQlnZXRIb3N0RmlndXJlKCkuZ2V0UGFyZW50KCkudHJhbnNsYXRlVG9BYnNvbHV0ZShib3VuZHMpOwotCQlnZXRGZWVkYmFja0xheWVyKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShib3VuZHMpOwotCQlyZXR1cm4gYm91bmRzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVTZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSgpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlMYWJlbCBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBMYWJlbCgpOwotCQkJZmVlZGJhY2tGaWd1cmUuc2V0T3BhcXVlKHRydWUpOwotCQkJZmVlZGJhY2tGaWd1cmUKLQkJCQkJLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWZlZWRiYWNrRmlndXJlCi0JCQkJCS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUZvcmVncm91bmRTZWxlY3RlZCk7Ci0JCQlyZXR1cm4gZmVlZGJhY2tGaWd1cmU7Ci0JCX0gZWxzZSB7Ci0JCQlSZWN0YW5nbGVGaWd1cmUgZmVlZGJhY2tGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZS5zZXRGaWxsKGZhbHNlKTsKLQkJCXJldHVybiBmZWVkYmFja0ZpZ3VyZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGb2N1c0ZlZWRiYWNrRmlndXJlKCkgewotCQlyZXR1cm4gbmV3IEZpZ3VyZSgpIHsKLQotCQkJcHJvdGVjdGVkIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJCQlncmFwaGljcy5kcmF3Rm9jdXMoZ2V0Qm91bmRzKCkuZ2V0UmVzaXplZCgtMSwgLTEpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTGFiZWwoTGFiZWwgdGFyZ2V0KSB7Ci0JCUxhYmVsIHNvdXJjZSA9IChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpOwotCQl0YXJnZXQuc2V0VGV4dChzb3VyY2UuZ2V0VGV4dCgpKTsKLQkJdGFyZ2V0LnNldFRleHRBbGlnbm1lbnQoc291cmNlLmdldFRleHRBbGlnbm1lbnQoKSk7Ci0JCXRhcmdldC5zZXRGb250KHNvdXJjZS5nZXRGb250KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKSB7Ci0JCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJCXVwZGF0ZUxhYmVsKChMYWJlbCkgc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUpOwotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkuZXhwYW5kKDUsCi0JCQkJCQk1KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvY3VzRmVlZGJhY2soKSB7Ci0JCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCWZvY3VzRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hGZWVkYmFjaygpIHsKLQkJcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0JCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCU1vdmVIYW5kbGUgbW92ZUhhbmRsZSA9IG5ldyBNb3ZlSGFuZGxlKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsKLQkJbW92ZUhhbmRsZS5zZXRCb3JkZXIobnVsbCk7Ci0JCW1vdmVIYW5kbGUuc2V0RHJhZ1RyYWNrZXIobmV3IERyYWdFZGl0UGFydHNUcmFja2VyRXgoZ2V0SG9zdCgpKSk7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG1vdmVIYW5kbGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1VNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvZWRpdC9wb2xpY2llcy9VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjdhOTZhLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9lZGl0L3BvbGljaWVzL1VNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSBleHRlbmRzIFNlbGVjdGlvbkVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUZpZ3VyZSBzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElGaWd1cmUgZm9jdXNGZWVkYmFja0ZpZ3VyZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93UHJpbWFyeVNlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXNob3dTZWxlY3Rpb24oKTsKLQkJCXNob3dGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKHRydWUpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaGlkZVNlbGVjdGlvbigpOwotCQkJYWRkRmVlZGJhY2soc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBjcmVhdGVTZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSgpKTsKLQkJCXJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpOwotCQkJaGlkZUZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZVNlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQoZmFsc2UpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCQlyZW1vdmVGZWVkYmFjayhzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBudWxsOwotCQkJfQotCQkJaGlkZUZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd0ZvY3VzKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWhpZGVGb2N1cygpOwotCQkJYWRkRmVlZGJhY2soZm9jdXNGZWVkYmFja0ZpZ3VyZSA9IGNyZWF0ZUZvY3VzRmVlZGJhY2tGaWd1cmUoKSk7Ci0JCQlyZWZyZXNoRm9jdXNGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhpZGVGb2N1cygpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaWYgKGZvY3VzRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJCXJlbW92ZUZlZWRiYWNrKGZvY3VzRmVlZGJhY2tGaWd1cmUpOwotCQkJCWZvY3VzRmVlZGJhY2tGaWd1cmUgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGdldEZlZWRiYWNrTGF5ZXIoKSB7Ci0JCXJldHVybiBnZXRMYXllcihMYXllckNvbnN0YW50cy5TQ0FMRURfRkVFREJBQ0tfTEFZRVIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVjdGFuZ2xlIGdldEZlZWRiYWNrQm91bmRzKCkgewotCQlSZWN0YW5nbGUgYm91bmRzOwotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCWJvdW5kcyA9ICgoTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuZ2V0VGV4dEJvdW5kcygpOwotCQkJYm91bmRzLmludGVyc2VjdChnZXRIb3N0RmlndXJlKCkuZ2V0Qm91bmRzKCkpOwotCQl9IGVsc2UgewotCQkJYm91bmRzID0gZ2V0SG9zdEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJfQotCQlnZXRIb3N0RmlndXJlKCkuZ2V0UGFyZW50KCkudHJhbnNsYXRlVG9BYnNvbHV0ZShib3VuZHMpOwotCQlnZXRGZWVkYmFja0xheWVyKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShib3VuZHMpOwotCQlyZXR1cm4gYm91bmRzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVTZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSgpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlMYWJlbCBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBMYWJlbCgpOwotCQkJZmVlZGJhY2tGaWd1cmUuc2V0T3BhcXVlKHRydWUpOwotCQkJZmVlZGJhY2tGaWd1cmUKLQkJCQkJLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWZlZWRiYWNrRmlndXJlCi0JCQkJCS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUZvcmVncm91bmRTZWxlY3RlZCk7Ci0JCQlyZXR1cm4gZmVlZGJhY2tGaWd1cmU7Ci0JCX0gZWxzZSB7Ci0JCQlSZWN0YW5nbGVGaWd1cmUgZmVlZGJhY2tGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZS5zZXRGaWxsKGZhbHNlKTsKLQkJCXJldHVybiBmZWVkYmFja0ZpZ3VyZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGb2N1c0ZlZWRiYWNrRmlndXJlKCkgewotCQlyZXR1cm4gbmV3IEZpZ3VyZSgpIHsKLQotCQkJcHJvdGVjdGVkIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJCQlncmFwaGljcy5kcmF3Rm9jdXMoZ2V0Qm91bmRzKCkuZ2V0UmVzaXplZCgtMSwgLTEpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTGFiZWwoTGFiZWwgdGFyZ2V0KSB7Ci0JCUxhYmVsIHNvdXJjZSA9IChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpOwotCQl0YXJnZXQuc2V0VGV4dChzb3VyY2UuZ2V0VGV4dCgpKTsKLQkJdGFyZ2V0LnNldFRleHRBbGlnbm1lbnQoc291cmNlLmdldFRleHRBbGlnbm1lbnQoKSk7Ci0JCXRhcmdldC5zZXRGb250KHNvdXJjZS5nZXRGb250KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKSB7Ci0JCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJCXVwZGF0ZUxhYmVsKChMYWJlbCkgc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUpOwotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkuZXhwYW5kKDUsCi0JCQkJCQk1KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvY3VzRmVlZGJhY2soKSB7Ci0JCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCWZvY3VzRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hGZWVkYmFjaygpIHsKLQkJcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0JCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2V4cHJlc3Npb25zL1VNTEFic3RyYWN0RXhwcmVzc2lvbi5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL2V4cHJlc3Npb25zL1VNTEFic3RyYWN0RXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDQwNDBiLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9leHByZXNzaW9ucy9VTUxBYnN0cmFjdEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZXhwcmVzc2lvbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5FUEZEaWFncmFtRWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFVNTEFic3RyYWN0RXhwcmVzc2lvbiB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gRElTQUJMRURfTk9fSU1QTF9FWENFUFRJT05fTE9HID0gQm9vbGVhbgotCQkJLnZhbHVlT2YoCi0JCQkJCVBsYXRmb3JtLmdldERlYnVnT3B0aW9uKEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKQotCQkJCQkJCSsgIi9kZWJ1Zy9kaXNhYmxlTm9FeHBySW1wbEV4Y2VwdGlvbkxvZyIpKQotCQkJLmJvb2xlYW5WYWx1ZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGJvZHk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3NpZmllciBjb250ZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBVTUxBYnN0cmFjdEV4cHJlc3Npb24oRUNsYXNzaWZpZXIgY29udGV4dCkgewotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVU1MQWJzdHJhY3RFeHByZXNzaW9uKFN0cmluZyBib2R5LCBFQ2xhc3NpZmllciBjb250ZXh0LCBNYXAgZW52KSB7Ci0JCXRoaXMuYm9keSA9IGJvZHk7Ci0JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCVN0cmluZyBwbHVnaW5JRCA9IEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uSUQ7Ci0JCXRoaXMuc3RhdHVzID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgcGx1Z2luSUQsIC0xLAotCQkJCShtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICIiLCB0aHJvd2FibGUpOyAvLyROT04tTkxTLTEkCi0JCWlmICghdGhpcy5zdGF0dXMuaXNPSygpKSB7Ci0JCQlFUEZEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJCS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXhwcmVzc2lvbiBwcm9ibGVtOiIgKyBtZXNzYWdlICsgImJvZHk6IiArIGJvZHksIHRocm93YWJsZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBkb0V2YWx1YXRlKE9iamVjdCBjb250ZXh0LCBNYXAgZW52KTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKE9iamVjdCBjb250ZXh0KSB7Ci0JCXJldHVybiBldmFsdWF0ZShjb250ZXh0LCBDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKE9iamVjdCBjb250ZXh0LCBNYXAgZW52KSB7Ci0JCWlmIChjb250ZXh0KCkuaXNJbnN0YW5jZShjb250ZXh0KSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZG9FdmFsdWF0ZShjb250ZXh0LCBlbnYpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoRElTQUJMRURfTk9fSU1QTF9FWENFUFRJT05fTE9HCi0JCQkJCQkmJiBlIGluc3RhbmNlb2YgTm9JbXBsRXhjZXB0aW9uKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkiRXhwcmVzc2lvbiBldmFsdWF0aW9uIGZhaWx1cmU6ICIgKyBib2R5LCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGJvZHkoKSB7Ci0JCXJldHVybiBib2R5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzaWZpZXIgY29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYXNzaWduVG8oRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVPYmplY3QgdGFyZ2V0KSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGV2YWx1YXRlKHRhcmdldCk7Ci0JCS8vCQl2YWx1ZSA9ICh2YWx1ZSAhPSBudWxsKSA/IHBlcmZvcm1DYXN0KHZhbHVlLCBmZWF0dXJlKSA6IG51bGw7Ci0JCS8vCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkvLwkJCUNvbGxlY3Rpb24gZGVzdENvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgdGFyZ2V0LmVHZXQoZmVhdHVyZSk7Ci0JCS8vCQkJZGVzdENvbGxlY3Rpb24uY2xlYXIoKTsKLQkJLy8JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCS8vCQkJCUNvbGxlY3Rpb24gdmFsdWVDb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHZhbHVlOwotCQkvLwkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmFsdWVDb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJLy8JCQkJCWRlc3RDb2xsZWN0aW9uLmFkZChwZXJmb3JtQ2FzdChpdC5uZXh0KCksIGZlYXR1cmUpKTsKLQkJLy8JCQkJfQotCQkvLwkJCX0gZWxzZSB7Ci0JCS8vCQkJCWRlc3RDb2xsZWN0aW9uLmFkZCh2YWx1ZSk7Ci0JCS8vCQkJfQotCQkvLwkJCXJldHVybjsKLQkJLy8JCX0KLQkJLy8JCXRhcmdldC5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBwZXJmb3JtQ2FzdChPYmplY3QgdmFsdWUsIEVUeXBlZEVsZW1lbnQgdGFyZ2V0VHlwZSkgewotCQlpZiAodGFyZ2V0VHlwZS5nZXRFVHlwZSgpID09IG51bGwKLQkJCQl8fCB0YXJnZXRUeXBlLmdldEVUeXBlKCkuZ2V0SW5zdGFuY2VDbGFzcygpID09IG51bGwpIHsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCQlDbGFzcyB0YXJnZXRDbGFzcyA9IHRhcmdldFR5cGUuZ2V0RVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQlOdW1iZXIgbnVtID0gKE51bWJlcikgdmFsdWU7Ci0JCQlDbGFzcyB2YWxDbGFzcyA9IHZhbHVlLmdldENsYXNzKCk7Ci0JCQlDbGFzcyB0YXJnZXRXcmFwcGVyQ2xhc3MgPSB0YXJnZXRDbGFzczsKLQkJCWlmICh0YXJnZXRDbGFzcy5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQkJdGFyZ2V0V3JhcHBlckNsYXNzID0gRWNvcmVVdGlsLndyYXBwZXJDbGFzc0Zvcih0YXJnZXRDbGFzcyk7Ci0JCQl9Ci0JCQlpZiAodmFsQ2xhc3MuZXF1YWxzKHRhcmdldFdyYXBwZXJDbGFzcykpIHsKLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCQlpZiAoTnVtYmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odGFyZ2V0V3JhcHBlckNsYXNzKSkgewotCQkJCWlmICh0YXJnZXRXcmFwcGVyQ2xhc3MuZXF1YWxzKEJ5dGUuY2xhc3MpKQotCQkJCQlyZXR1cm4gbmV3IEJ5dGUobnVtLmJ5dGVWYWx1ZSgpKTsKLQkJCQlpZiAodGFyZ2V0V3JhcHBlckNsYXNzLmVxdWFscyhJbnRlZ2VyLmNsYXNzKSkKLQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKG51bS5pbnRWYWx1ZSgpKTsKLQkJCQlpZiAodGFyZ2V0V3JhcHBlckNsYXNzLmVxdWFscyhTaG9ydC5jbGFzcykpCi0JCQkJCXJldHVybiBuZXcgU2hvcnQobnVtLnNob3J0VmFsdWUoKSk7Ci0JCQkJaWYgKHRhcmdldFdyYXBwZXJDbGFzcy5lcXVhbHMoTG9uZy5jbGFzcykpCi0JCQkJCXJldHVybiBuZXcgTG9uZyhudW0ubG9uZ1ZhbHVlKCkpOwotCQkJCWlmICh0YXJnZXRXcmFwcGVyQ2xhc3MuZXF1YWxzKEJpZ0ludGVnZXIuY2xhc3MpKQotCQkJCQlyZXR1cm4gQmlnSW50ZWdlci52YWx1ZU9mKG51bS5sb25nVmFsdWUoKSk7Ci0JCQkJaWYgKHRhcmdldFdyYXBwZXJDbGFzcy5lcXVhbHMoRmxvYXQuY2xhc3MpKQotCQkJCQlyZXR1cm4gbmV3IEZsb2F0KG51bS5mbG9hdFZhbHVlKCkpOwotCQkJCWlmICh0YXJnZXRXcmFwcGVyQ2xhc3MuZXF1YWxzKERvdWJsZS5jbGFzcykpCi0JCQkJCXJldHVybiBuZXcgRG91YmxlKG51bS5kb3VibGVWYWx1ZSgpKTsKLQkJCQlpZiAodGFyZ2V0V3JhcHBlckNsYXNzLmVxdWFscyhCaWdEZWNpbWFsLmNsYXNzKSkKLQkJCQkJcmV0dXJuIG5ldyBCaWdEZWNpbWFsKG51bS5kb3VibGVWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVU1MQWJzdHJhY3RFeHByZXNzaW9uIGNyZWF0ZU51bGxFeHByZXNzaW9uKAotCQkJRUNsYXNzaWZpZXIgY29udGV4dCkgewotCQlyZXR1cm4gbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbihjb250ZXh0KSB7Ci0JCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkvLyBUT0RPIC0gbG9nIGVudHJ5IGFib3V0IG5vdCBwcm92aWRlciBhdmFpbGFibGUgZm9yIHRoaXMgZXhwcmVzc2lvbgotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE5vSW1wbEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIE5vSW1wbEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQkJc3VwZXIobWVzc2FnZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9EaWFncmFtRWRpdG9yLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9EaWFncmFtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMDJhOTUuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvRGlhZ3JhbUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkRlbGVnYXRpbmdMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxheWVyZWRQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5EaWFncmFtQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5Ob2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlVNTEVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIEBtb2RpZmllZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUVkaXRvciBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5BYnN0cmFjdERpYWdyYW1FZGl0b3IgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5EaWFncmFtRWRpdG9ySUQiOyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOwotCQlEaWFncmFtUm9vdEVkaXRQYXJ0IHJvb3QgPSAoRGlhZ3JhbVJvb3RFZGl0UGFydCkgZ2V0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcigpCi0JCQkJLmdldFJvb3RFZGl0UGFydCgpOwotCQlMYXllcmVkUGFuZSBwcmludGFibGVMYXllcnMgPSAoTGF5ZXJlZFBhbmUpIHJvb3QKLQkJCQkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuUFJJTlRBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgZXh0TGFiZWxzTGF5ZXIgPSBuZXcgRnJlZWZvcm1MYXllcigpOwotCQlleHRMYWJlbHNMYXllci5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBEZWxlZ2F0aW5nTGF5b3V0KCkpOwotCQlwcmludGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihleHRMYWJlbHNMYXllciwKLQkJCQlVTUxFZGl0UGFydEZhY3RvcnkuRVhURVJOQUxfTk9ERV9MQUJFTFNfTEFZRVIsCi0JCQkJTGF5ZXJDb25zdGFudHMuUFJJTUFSWV9MQVlFUik7Ci0JCUxheWVyZWRQYW5lIHNjYWxhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlNDQUxBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgc2NhbGVkRmVlZGJhY2tMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCXNjYWxlZEZlZWRiYWNrTGF5ZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNjYWxhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoc2NhbGVkRmVlZGJhY2tMYXllciwKLQkJCQlMYXllckNvbnN0YW50cy5TQ0FMRURfRkVFREJBQ0tfTEFZRVIsCi0JCQkJRGlhZ3JhbVJvb3RFZGl0UGFydC5ERUNPUkFUSU9OX1VOUFJJTlRBQkxFX0xBWUVSKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXNIaW50IGdldFByZWZlcmVuY2VzSGludCgpIHsKLQkJcmV0dXJuIG5ldyBQcmVmZXJlbmNlc0hpbnQoRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCk7Ci0JfQotCi0JCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRG91YmxlQ2xpY2soRXZlbnQgZXZlbnQpIHsKLQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCi0JCS8vIGRvIG5vdGhpbmcgaWYgMCBvciBtb3JlIHRoYW4gMSBlZGl0IHBhcnRzIGFyZSBzZWxlY3RlZAotCQkvLwotCQlpZiAoZWRpdFBhcnRzLnNpemUoKSAhPSAxKQotCQkJcmV0dXJuOwotCi0JCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDApOwotCQlOb2RlIG5vZGUgPSAoTm9kZSllZGl0UGFydC5nZXRNb2RlbCgpOwotCQlFT2JqZWN0IG1vZGVsID0gbm9kZS5nZXRFbGVtZW50KCk7Ci0JCURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSBlZGl0b3JJbnB1dCA9IChEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpZ2V0RWRpdG9ySW5wdXQoKTsKLQkJRGlhZ3JhbUVkaXRvcklucHV0IGRJbnB1dCA9IGVkaXRvcklucHV0LmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCi0JCWlmKG1vZGVsIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpewotCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobW9kZWwpOwotCQkJT2JqZWN0IGUgPSBudWxsOwotCQkJLy8gVE9ETzogaGFuZGxlIFdyYXBwZXIgY2hhbmdlIGJlbG93IGxpbmUgYWZ0ZXIgd3JhcHBlciBpbXBsZW1lbnQKLQkJCQllID0gbm9kZUFkYXB0ZXIuZ2V0RWxlbWVudCgpOwotCQkJaWYoZSA9PSBudWxsKXsKLQkJCQllID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpbW9kZWwpOwotCQkJfQotCQkJaWYoZSAhPSBudWxsKXsKLQkJCQlJRWRpdG9yUGFydCBwYXJlbnQgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0KAotCQkJCQkJZSwgZElucHV0LmdldFN1cHByZXNzaW9uKCksIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKTsKLQkJCQlEaWFncmFtRWRpdG9yVXRpbC5vcGVuRGlhZ3JhbUVkaXRvcihnZXRTaXRlKCkuZ2V0UGFnZSgpLCBpbnB1dCwgCi0JCQkJCQlFUEZEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CQkJCQkKLQotCQkJfQotCQl9Ci0KLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUdyYXBoaWNhbFZpZXdlcigpOwotCQkvLyBDb2RlIGZvciBkaXNhYmxpbmcgdGhlIHJlYWRvbmx5IGVsZW1lbnQgaW4gdGhlIGRpYWdyYW0uCi0vLwkJRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1QYXJ0ID0gZ2V0RGlhZ3JhbUVkaXRQYXJ0KCk7Ci0vLwkJTGlzdCBjaGlsZHJlbiA9IGRpYWdyYW1QYXJ0LmdldENoaWxkcmVuKCk7Ci0vLwkJaWYoIWNoaWxkcmVuLmlzRW1wdHkoKSl7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJRWRpdFBhcnQgcGFydCA9IChFZGl0UGFydCkgaXRlci5uZXh0KCk7Ci0vLwkJCQlpZihwYXJ0IGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpewotLy8JCQkJCU5vZGUgbm9kZSA9IChOb2RlKXBhcnQuZ2V0TW9kZWwoKTsKLS8vCQkJCQlpZihCcmlkZ2VIZWxwZXIuaXNJbmhlcml0ZWQobm9kZSkpewotLy8JCQkJCQkoKEdyYXBoaWNhbEVkaXRQYXJ0KXBhcnQpLmRpc2FibGVFZGl0TW9kZSgpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9FUEZEaWFncmFtRWRpdG9yUGx1Z2luLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9FUEZEaWFncmFtRWRpdG9yUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YmVlMjguLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wcm92aWRlci5FY29yZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuZWRpdC5wcm92aWRlcnMuVU1MSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogQG1vZGlmaWVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFUEZEaWFncmFtRWRpdG9yUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByZWZlcmVuY2VzSGludCBESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQgPSBuZXcgUHJlZmVyZW5jZXNIaW50KAotCQkJSUQpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4gaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUEZEaWFncmFtRWRpdG9yUGx1Z2luKCkgewotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCQlQcmVmZXJlbmNlc0hpbnQucmVnaXN0ZXJQcmVmZXJlbmNlU3RvcmUoRElBR1JBTV9QUkVGRVJFTkNFU19ISU5ULAotCQkJCWdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJYWRhcHRlckZhY3RvcnkgPSBjcmVhdGVBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQlpbnN0YW5jZSA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVBGRGlhZ3JhbUVkaXRvclBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVBZGFwdGVyRmFjdG9yeSgpIHsKLQkJTGlzdCBmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZpbGxJdGVtUHJvdmlkZXJGYWN0b3JpZXMoZmFjdG9yaWVzKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KGZhY3Rvcmllcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxJdGVtUHJvdmlkZXJGYWN0b3JpZXMoTGlzdCBmYWN0b3JpZXMpIHsKLQkJZmFjdG9yaWVzLmFkZChuZXcgVU1MSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IEVjb3JlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEl0ZW1JbWFnZURlc2NyaXB0b3IoT2JqZWN0IGl0ZW0pIHsKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSAoSUl0ZW1MYWJlbFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChpdGVtLCBJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQlsYWJlbFByb3ZpZGVyLmdldEltYWdlKGl0ZW0pKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRCdW5kbGVkSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oSUQsIHBhdGgpOwotCX0KLQotCS8qKgotCSAqIFJlc3BlY3RzIGltYWdlcyByZXNpZGluZyBpbiBhbnkgcGx1Zy1pbi4gSWYgcGF0aCBpcyByZWxhdGl2ZSwKLQkgKiB0aGVuIHRoaXMgYnVuZGxlIGlzIGxvb2tlZCB1cCBmb3IgdGhlIGltYWdlLCBvdGhlcndpc2UsIGZvciBhYnNvbHV0ZSAKLQkgKiBwYXRoLCBmaXJzdCBzZWdtZW50IGlzIHRha2VuIGFzIGlkIG9mIHBsdWctaW4gd2l0aCBpbWFnZQotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIGltYWdlLCBlaXRoZXIgYWJzb2x1dGUgKHdpdGggcGx1Zy1pbiBpZCBhcyBmaXJzdCBzZWdtZW50KSwgb3IgcmVsYXRpdmUgZm9yIGJ1bmRsZWQgaW1hZ2VzCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGZpbmRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJZmluYWwgSVBhdGggcCA9IG5ldyBQYXRoKHBhdGgpOwotCQlpZiAocC5pc0Fic29sdXRlKCkgJiYgcC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4ocC5zZWdtZW50KDApLCBwCi0JCQkJCS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCkpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IocC5tYWtlQWJzb2x1dGUoKS50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbiBwbHVnLWluIHJlbGF0aXZlIHBhdGguCi0JICogQ2xpZW50IGRvIG5vdCBuZWVkIHRvIGRpc3Bvc2UgdGhpcyBpbWFnZS4gSW1hZ2VzIHdpbGwgYmUgZGlzcG9zZWQgYXV0b21hdGljYWxseS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gaW1hZ2UgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0QnVuZGxlZEltYWdlKFN0cmluZyBwYXRoKSB7Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChwYXRoKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQocGF0aCwgZ2V0QnVuZGxlZEltYWdlRGVzY3JpcHRvcihwYXRoKSk7Ci0JCQlpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocGF0aCk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgZXJyb3IpIHsKLQkJbG9nRXJyb3IoZXJyb3IsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aHJvd2FibGUgYWN0dWFsIGVycm9yIG9yIG51bGwgY291bGQgYmUgcGFzc2VkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvciwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlpZiAoZXJyb3IgPT0gbnVsbCAmJiB0aHJvd2FibGUgIT0gbnVsbCkgewotCQkJZXJyb3IgPSB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCWdldExvZygpLmxvZygKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQlJU3RhdHVzLk9LLCBlcnJvciwgdGhyb3dhYmxlKSk7Ci0JCWRlYnVnKGVycm9yLCB0aHJvd2FibGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dJbmZvKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWxvZ0luZm8obWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRocm93YWJsZSBhY3R1YWwgZXJyb3Igb3IgbnVsbCBjb3VsZCBiZSBwYXNzZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbG9nSW5mbyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlpZiAobWVzc2FnZSA9PSBudWxsICYmIG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJbWVzc2FnZSA9IHRocm93YWJsZS5nZXRNZXNzYWdlKCk7Ci0JCX0KLQkJZ2V0TG9nKCkubG9nKAotCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBFUEZEaWFncmFtRWRpdG9yUGx1Z2luLklELCBJU3RhdHVzLk9LLAotCQkJCQkJbWVzc2FnZSwgdGhyb3dhYmxlKSk7Ci0JCWRlYnVnKG1lc3NhZ2UsIHRocm93YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBkZWJ1ZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4obWVzc2FnZSk7Ci0JCX0KLQkJaWYgKHRocm93YWJsZSAhPSBudWxsKSB7Ci0JCQl0aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTENyZWF0aW9uV2l6YXJkLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxDcmVhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWM4ZDVjLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTENyZWF0aW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUud2l6YXJkcy5FZGl0b3JDcmVhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MQ3JlYXRpb25XaXphcmQgZXh0ZW5kcyBFZGl0b3JDcmVhdGlvbldpemFyZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXN1cGVyLmFkZFBhZ2VzKCk7Ci0JCWlmIChwYWdlID09IG51bGwpIHsKLQkJCXBhZ2UgPSBuZXcgVU1MQ3JlYXRpb25XaXphcmRQYWdlKGdldFdvcmtiZW5jaCgpLCBnZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQkJYWRkUGFnZShwYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyLmluaXQod29ya2JlbmNoLCBzZWxlY3Rpb24pOwotCQlzZXRXaW5kb3dUaXRsZSgiTmV3IEFEIERpYWdyYW0iKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihFUEZEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IoImljb25zL3dpemJhbi9OZXdVTUxXaXphcmQuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MQ3JlYXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NzQzOTMuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MQ3JlYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydDsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS53aXphcmRzLkVkaXRvcldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnV0aWwuRGlhZ3JhbUZpbGVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxDcmVhdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBFZGl0b3JXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVU1MQ3JlYXRpb25XaXphcmRQYWdlKElXb3JrYmVuY2ggd29ya2JlbmNoLAotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKCJDcmVhdGlvbldpemFyZFBhZ2UiLCB3b3JrYmVuY2gsIHNlbGVjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VGl0bGUoIkNyZWF0ZSBBRCBEaWFncmFtIik7Ci0JCXNldERlc2NyaXB0aW9uKCJDcmVhdGUgYSBuZXcgQUQgZGlhZ3JhbS4iKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWxlIGNyZWF0ZUFuZE9wZW5EaWFncmFtKElQYXRoIGNvbnRhaW5lclBhdGgsIFN0cmluZyBmaWxlTmFtZSwKLQkJCUlucHV0U3RyZWFtIGluaXRpYWxDb250ZW50cywgU3RyaW5nIGtpbmQsIElXb3JrYmVuY2hXaW5kb3cgZFdpbmRvdywKLQkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBib29sZWFuIHNhdmVEaWFncmFtKSB7Ci0JCXJldHVybiBVTUxEaWFncmFtRWRpdG9yVXRpbC5jcmVhdGVBbmRPcGVuRGlhZ3JhbSgKLQkJCQlnZXREaWFncmFtRmlsZUNyZWF0b3IoKSwgY29udGFpbmVyUGF0aCwgZmlsZU5hbWUsCi0JCQkJaW5pdGlhbENvbnRlbnRzLCBraW5kLCBkV2luZG93LCBwcm9ncmVzc01vbml0b3IsCi0JCQkJaXNPcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcigpLCBzYXZlRGlhZ3JhbSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZpbGVOYW1lKCkgewotCQlyZXR1cm4gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtRmlsZUNyZWF0b3IgZ2V0RGlhZ3JhbUZpbGVDcmVhdG9yKCkgewotCQlyZXR1cm4gVU1MRGlhZ3JhbUZpbGVDcmVhdG9yLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbUtpbmQoKSB7Ci0JCXJldHVybiBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxEaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJhNDUwMC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxEaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMgRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0RWRpdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiBEaWFncmFtRWRpdG9yLmNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVkaXRvcklkKCkgewotCQlyZXR1cm4gRGlhZ3JhbUVkaXRvci5JRDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxEaWFncmFtRWRpdG9yLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxEaWFncmFtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyN2ZhNTIuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MRGlhZ3JhbUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkRlbGVnYXRpbmdMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxheWVyZWRQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZWRpdG9yLkZpbGVEaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuVU1MRWRpdFBhcnRGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5kb2N1bWVudC5TdG9yYWdlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXI7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MRGlhZ3JhbUVkaXRvciBleHRlbmRzIEZpbGVEaWFncmFtRWRpdG9yIGltcGxlbWVudHMgSUdvdG9NYXJrZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTERpYWdyYW1FZGl0b3JJRCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVU1MRGlhZ3JhbUVkaXRvcigpIHsKLQkJc3VwZXIodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWRpdGluZ0RvbWFpbklEKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5FZGl0aW5nRG9tYWluIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gY3JlYXRlRWRpdGluZ0RvbWFpbigpIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluID0gc3VwZXIuY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotCQlkb21haW4uc2V0SUQoZ2V0RWRpdGluZ0RvbWFpbklEKCkpOwotCQlyZXR1cm4gZG9tYWluOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudFByb3ZpZGVyKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlpZiAoaW5wdXQuZ2V0QWRhcHRlcihJRmlsZS5jbGFzcykgIT0gbnVsbCkgewotCQkJc2V0RG9jdW1lbnRQcm92aWRlcihuZXcgVU1MRG9jdW1lbnRQcm92aWRlcigpKTsKLQkJfSBlbHNlIHsKLQkJCXNldERvY3VtZW50UHJvdmlkZXIobmV3IFN0b3JhZ2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcigpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOwotCQlEaWFncmFtUm9vdEVkaXRQYXJ0IHJvb3QgPSAoRGlhZ3JhbVJvb3RFZGl0UGFydCkgZ2V0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcigpCi0JCQkJLmdldFJvb3RFZGl0UGFydCgpOwotCQlMYXllcmVkUGFuZSBwcmludGFibGVMYXllcnMgPSAoTGF5ZXJlZFBhbmUpIHJvb3QKLQkJCQkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuUFJJTlRBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgZXh0TGFiZWxzTGF5ZXIgPSBuZXcgRnJlZWZvcm1MYXllcigpOwotCQlleHRMYWJlbHNMYXllci5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBEZWxlZ2F0aW5nTGF5b3V0KCkpOwotCQlwcmludGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihleHRMYWJlbHNMYXllciwKLQkJCQlVTUxFZGl0UGFydEZhY3RvcnkuRVhURVJOQUxfTk9ERV9MQUJFTFNfTEFZRVIsCi0JCQkJTGF5ZXJDb25zdGFudHMuUFJJTUFSWV9MQVlFUik7Ci0JCUxheWVyZWRQYW5lIHNjYWxhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlNDQUxBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgc2NhbGVkRmVlZGJhY2tMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCXNjYWxlZEZlZWRiYWNrTGF5ZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNjYWxhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoc2NhbGVkRmVlZGJhY2tMYXllciwKLQkJCQlMYXllckNvbnN0YW50cy5TQ0FMRURfRkVFREJBQ0tfTEFZRVIsCi0JCQkJRGlhZ3JhbVJvb3RFZGl0UGFydC5ERUNPUkFUSU9OX1VOUFJJTlRBQkxFX0xBWUVSKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxEaWFncmFtRWRpdG9yVXRpbC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MRGlhZ3JhbUVkaXRvclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FjMjc5ZC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxEaWFncmFtRWRpdG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLk9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5WaWV3U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UuY29tbWFuZHMuQ3JlYXRlRGlhZ3JhbUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUudXRpbC5JREVFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci51dGlsLkRpYWdyYW1GaWxlQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnV0aWwuRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5HTUZFZGl0aW5nRG9tYWluRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MRmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxEaWFncmFtRWRpdG9yVXRpbCBleHRlbmRzIElERUVkaXRvclV0aWwgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUZpbGUgY3JlYXRlQW5kT3BlbkRpYWdyYW0oCi0JCQlEaWFncmFtRmlsZUNyZWF0b3IgZGlhZ3JhbUZpbGVDcmVhdG9yLCBJUGF0aCBjb250YWluZXJQYXRoLAotCQkJU3RyaW5nIGZpbGVOYW1lLCBJbnB1dFN0cmVhbSBpbml0aWFsQ29udGVudHMsIFN0cmluZyBraW5kLAotCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3csIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLAotCQkJYm9vbGVhbiBvcGVuRWRpdG9yLCBib29sZWFuIHNhdmVEaWFncmFtKSB7Ci0JCUlGaWxlIGRpYWdyYW1GaWxlID0gVU1MRGlhZ3JhbUVkaXRvclV0aWwuY3JlYXRlTmV3RGlhZ3JhbUZpbGUoCi0JCQkJZGlhZ3JhbUZpbGVDcmVhdG9yLCBjb250YWluZXJQYXRoLCBmaWxlTmFtZSwgaW5pdGlhbENvbnRlbnRzLAotCQkJCWtpbmQsIHdpbmRvdy5nZXRTaGVsbCgpLCBwcm9ncmVzc01vbml0b3IpOwotCQlpZiAoZGlhZ3JhbUZpbGUgIT0gbnVsbCAmJiBvcGVuRWRpdG9yKSB7Ci0JCQlJREVFZGl0b3JVdGlsLm9wZW5EaWFncmFtKGRpYWdyYW1GaWxlLCB3aW5kb3csIHNhdmVEaWFncmFtLAotCQkJCQlwcm9ncmVzc01vbml0b3IpOwotCQl9Ci0JCXJldHVybiBkaWFncmFtRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdpdGhpbiBhIHdvcmtzcGFjZSBtb2RpZnkgb3BlcmF0aW9uIHNpbmNlIGl0IGNyZWF0ZXMgcmVzb3VyY2VzLgotCSAqIDwvcD4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBmaWxlIHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZmlsZSB3YXMgbm90IGNyZWF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElGaWxlIGNyZWF0ZU5ld0RpYWdyYW1GaWxlKAotCQkJRGlhZ3JhbUZpbGVDcmVhdG9yIGRpYWdyYW1GaWxlQ3JlYXRvciwgSVBhdGggY29udGFpbmVyRnVsbFBhdGgsCi0JCQlTdHJpbmcgZmlsZU5hbWUsIElucHV0U3RyZWFtIGluaXRpYWxDb250ZW50cywgU3RyaW5nIGtpbmQsCi0JCQlTaGVsbCBzaGVsbCwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IEdNRkVkaXRpbmdEb21haW5GYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZUVkaXRpbmdEb21haW4oKTsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCk7Ci0JCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soIkNyZWF0aW5nIGRpYWdyYW0gYW5kIG1vZGVsIGZpbGVzIiwgNCk7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBzdWJQcm9ncmVzc01vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKAotCQkJCXByb2dyZXNzTW9uaXRvciwgMSk7Ci0JCWZpbmFsIElGaWxlIGRpYWdyYW1GaWxlID0gZGlhZ3JhbUZpbGVDcmVhdG9yLmNyZWF0ZU5ld0ZpbGUoCi0JCQkJY29udGFpbmVyRnVsbFBhdGgsIGZpbGVOYW1lLCBpbml0aWFsQ29udGVudHMsIHNoZWxsLAotCQkJCW5ldyBJUnVubmFibGVDb250ZXh0KCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oYm9vbGVhbiBmb3JrLCBib29sZWFuIGNhbmNlbGFibGUsCi0JCQkJCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlKQotCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCXJ1bm5hYmxlLnJ1bihzdWJQcm9ncmVzc01vbml0b3IpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCWZpbmFsIFJlc291cmNlIGRpYWdyYW1SZXNvdXJjZSA9IHJlc291cmNlU2V0Ci0JCQkJLmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGRpYWdyYW1GaWxlCi0JCQkJCQkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSk7Ci0JCUxpc3QgYWZmZWN0ZWRGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYWZmZWN0ZWRGaWxlcy5hZGQoZGlhZ3JhbUZpbGUpOwotCi0JCWZpbmFsIFN0cmluZyBraW5kUGFyYW0gPSBraW5kOwotCQlBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCgKLQkJCQllZGl0aW5nRG9tYWluLCAiQ3JlYXRpbmcgZGlhZ3JhbSBhbmQgbW9kZWwiLCBhZmZlY3RlZEZpbGVzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoCi0JCQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQlBY3Rpdml0eSBtb2RlbCA9IGNyZWF0ZUluaXRpYWxNb2RlbCgpOwotCQkJCWRpYWdyYW1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChtb2RlbCk7Ci0JCQkJRGlhZ3JhbSBkaWFncmFtID0gVmlld1NlcnZpY2UuY3JlYXRlRGlhZ3JhbShtb2RlbCwga2luZFBhcmFtLAotCQkJCQkJRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJZGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOwotCQkJCQlkaWFncmFtLnNldE5hbWUoZGlhZ3JhbUZpbGUuZ2V0TmFtZSgpKTsKLQkJCQkJZGlhZ3JhbS5zZXRFbGVtZW50KG1vZGVsKTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJZGlhZ3JhbVJlc291cmNlLnNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0KLQkJCQkJRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkJCSJVbmFibGUgdG8gc3RvcmUgbW9kZWwgYW5kIGRpYWdyYW0gcmVzb3VyY2VzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCU9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5LmdldE9wZXJhdGlvbkhpc3RvcnkoKS5leGVjdXRlKGNvbW1hbmQsCi0JCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCAxKSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gY3JlYXRlIG1vZGVsIGFuZCBkaWFncmFtIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRyeSB7Ci0JCQlkaWFncmFtRmlsZS5zZXRDaGFyc2V0KAotCQkJCQkiVVRGLTgiLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzTW9uaXRvciwgMSkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIHNldCBjaGFyc2V0IGZvciBkaWFncmFtIGZpbGUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGRpYWdyYW1GaWxlOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUZpbGUgY3JlYXRlQW5kT3BlbkRpYWdyYW0oCi0JCQlEaWFncmFtRmlsZUNyZWF0b3IgZGlhZ3JhbUZpbGVDcmVhdG9yLCBJUGF0aCBjb250YWluZXJQYXRoLAotCQkJU3RyaW5nIGZpbGVOYW1lLCBJbnB1dFN0cmVhbSBpbml0aWFsQ29udGVudHMsIFN0cmluZyBraW5kLAotCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3csIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLAotCQkJYm9vbGVhbiBvcGVuRWRpdG9yLCBib29sZWFuIHNhdmVEaWFncmFtLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJSUZpbGUgZGlhZ3JhbUZpbGUgPSBVTUxEaWFncmFtRWRpdG9yVXRpbC5jcmVhdGVOZXdEaWFncmFtRmlsZSgKLQkJCQlkaWFncmFtRmlsZUNyZWF0b3IsIGNvbnRhaW5lclBhdGgsIGZpbGVOYW1lLCBpbml0aWFsQ29udGVudHMsCi0JCQkJa2luZCwgd2luZG93LmdldFNoZWxsKCksIHByb2dyZXNzTW9uaXRvciwgaW5wdXQpOwotCQlpZiAoZGlhZ3JhbUZpbGUgIT0gbnVsbCAmJiBvcGVuRWRpdG9yKSB7Ci0JCQlJREVFZGl0b3JVdGlsLm9wZW5EaWFncmFtKGRpYWdyYW1GaWxlLCB3aW5kb3csIHNhdmVEaWFncmFtLAotCQkJCQlwcm9ncmVzc01vbml0b3IpOwotCQl9Ci0JCXJldHVybiBkaWFncmFtRmlsZTsKLQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2l0aGluIGEgd29ya3NwYWNlIG1vZGlmeSBvcGVyYXRpb24gc2luY2UgaXQgY3JlYXRlcyByZXNvdXJjZXMuCi0JICogPC9wPgotCSAqIEBtb2RpZmllZAotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgZmlsZSByZXNvdXJjZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGZpbGUgd2FzIG5vdCBjcmVhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRmlsZSBjcmVhdGVOZXdEaWFncmFtRmlsZSgKLQkJCURpYWdyYW1GaWxlQ3JlYXRvciBkaWFncmFtRmlsZUNyZWF0b3IsIElQYXRoIGNvbnRhaW5lckZ1bGxQYXRoLAotCQkJU3RyaW5nIGZpbGVOYW1lLCBJbnB1dFN0cmVhbSBpbml0aWFsQ29udGVudHMsIFN0cmluZyBraW5kLAotCQkJU2hlbGwgc2hlbGwsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IEdNRkVkaXRpbmdEb21haW5GYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZUVkaXRpbmdEb21haW4oKTsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCk7Ci0JCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soIkNyZWF0aW5nIGRpYWdyYW0gYW5kIG1vZGVsIGZpbGVzIiwgNCk7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBzdWJQcm9ncmVzc01vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKAotCQkJCXByb2dyZXNzTW9uaXRvciwgMSk7Ci0JCWZpbmFsIElGaWxlIGRpYWdyYW1GaWxlID0gZGlhZ3JhbUZpbGVDcmVhdG9yLmNyZWF0ZU5ld0ZpbGUoCi0JCQkJY29udGFpbmVyRnVsbFBhdGgsIGZpbGVOYW1lLCBpbml0aWFsQ29udGVudHMsIHNoZWxsLAotCQkJCW5ldyBJUnVubmFibGVDb250ZXh0KCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oYm9vbGVhbiBmb3JrLCBib29sZWFuIGNhbmNlbGFibGUsCi0JCQkJCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlKQotCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCXJ1bm5hYmxlLnJ1bihzdWJQcm9ncmVzc01vbml0b3IpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCWZpbmFsIFJlc291cmNlIGRpYWdyYW1SZXNvdXJjZSA9IHJlc291cmNlU2V0Ci0JCQkJLmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGRpYWdyYW1GaWxlCi0JCQkJCQkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSk7Ci0JCUxpc3QgYWZmZWN0ZWRGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYWZmZWN0ZWRGaWxlcy5hZGQoZGlhZ3JhbUZpbGUpOwotCi0JCS8vZmluYWwgU3RyaW5nIGtpbmRQYXJhbSA9IGtpbmQ7Ci0JCUNyZWF0ZURpYWdyYW1Db21tYW5kIGNvbW1hbmQgPSBuZXcgQ3JlYXRlRGlhZ3JhbUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwKLQkJCQkiQ3JlYXRpbmcgZGlhZ3JhbSBhbmQgbW9kZWwiLCBhZmZlY3RlZEZpbGVzLCBpbnB1dCwKLQkJCQlkaWFncmFtUmVzb3VyY2UsIGtpbmQpOwotCQl0cnkgewotCQkJT3BlcmF0aW9uSGlzdG9yeUZhY3RvcnkuZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmV4ZWN1dGUoY29tbWFuZCwKLQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDEpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBjcmVhdGUgbW9kZWwgYW5kIGRpYWdyYW0iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdHJ5IHsKLQkJCWRpYWdyYW1GaWxlLnNldENoYXJzZXQoCi0JCQkJCSJVVEYtOCIsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCAxKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gc2V0IGNoYXJzZXQgZm9yIGRpYWdyYW0gZmlsZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gZGlhZ3JhbUZpbGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGRvbWFpbiBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBjYW52YXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHkgY3JlYXRlSW5pdGlhbE1vZGVsKCkgewotCQlyZXR1cm4gVU1MRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBUbyBvcGVuIGEgZGlhZ3JhbSBhbmQgY3JlYXRlIGEgZmlsZS4KLQkgKiBAY3VzdG9tCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUFuZE9wZW5EaWFncmFtKElXb3JrYmVuY2hXaW5kb3cgZFdpbmRvdywKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCwgUHJvY2VzcyBwcm9jKSB7Ci0JCVVNTERpYWdyYW1FZGl0b3JVdGlsLmNyZWF0ZUFuZE9wZW5EaWFncmFtKFVNTERpYWdyYW1GaWxlQ3JlYXRvcgotCQkJCS5nZXRJbnN0YW5jZSgpLCBnZXRDb250YWluZXJQYXRoKHByb2MpLCAiZGVmYXVsdCIsIEVkaXRvclV0aWwKLQkJCQkuZ2V0SW5pdGlhbENvbnRlbnRzKCksICJFUEYgVU1MIiwgZFdpbmRvdywKLQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0cnVlLCB0cnVlLCBpbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogQGN1c3RvbQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0Q29udGFpbmVyUGF0aCgpIHsKLQkJSVBhdGggcGF0aCA9IEVkaXRvclV0aWwuZ2V0RGVmYXVsdERpYWdyYW1QYXRoKG51bGwsIG51bGwpOwotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSByb290LmdldFByb2plY3RzKCk7Ci0KLQkJCXBhdGggPSByb290LmdldEZ1bGxQYXRoKCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyArK2kpIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0KLQkJCQlpZiAocHJvamVjdC5pc09wZW4oKSkgewotCQkJCQlwYXRoID0gcHJvamVjdC5nZXRGdWxsUGF0aCgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogQGN1c3RvbQotCSAqIAotCSAqIEBwYXJhbSBwcm9jCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0Q29udGFpbmVyUGF0aChQcm9jZXNzIHByb2MpIHsKLQotCQlpZiAocHJvYyBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwcm9jKTsKLQotCQkJU3RyaW5nIHJlbGF0aXZlRGlyOwotCi0JCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJcmVsYXRpdmVEaXIgPSBNdWx0aUZpbGVTYXZlVXRpbC5DQVBBQklMSVRZX1BBVFRFUk5fUEFUSDsKLQkJCX0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCXJlbGF0aXZlRGlyID0gTXVsdGlGaWxlU2F2ZVV0aWwuREVMSVZFUllfUFJPQ0VTU19QQVRIOwotCQkJfSBlbHNlIHsKLQkJCQlyZWxhdGl2ZURpciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCUlQYXRoIHdvcmtzcGFjZVBhdGggPSBFZGl0b3JVdGlsLmdldERlZmF1bHREaWFncmFtUGF0aChudWxsLCBudWxsKTsKLQkJCWlmICh3b3Jrc3BhY2VQYXRoID09IG51bGwpIHsKLQkJCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCQlJUHJvamVjdFtdIHByb2plY3RzID0gcm9vdC5nZXRQcm9qZWN0cygpOwotCi0JCQkJd29ya3NwYWNlUGF0aCA9IHJvb3QuZ2V0RnVsbFBhdGgoKTsKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCi0JCQkJCWlmIChwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJCQl3b3Jrc3BhY2VQYXRoID0gcHJvamVjdC5nZXRGdWxsUGF0aCgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCVN0cmluZyBsaWJEaXIgPSB3b3Jrc3BhY2VQYXRoLnRvU3RyaW5nKCk7Ci0JCQlTdHJpbmcgcGx1Z2luRGlyID0gbGliRGlyICsgRmlsZS5zZXBhcmF0b3IgKyBwbHVnaW4uZ2V0TmFtZSgpOwotCQkJU3RyaW5nIGRpYWdyYW1EaXIgPSBwbHVnaW5EaXIgKyBGaWxlLnNlcGFyYXRvciArIHJlbGF0aXZlRGlyCi0JCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyBwcm9jLmdldE5hbWUoKSArIEZpbGUuc2VwYXJhdG9yOwotCi0JCQlQYXRoIHBhdGggPSBuZXcgUGF0aChkaWFncmFtRGlyKTsKLQkJCXJldHVybiBwYXRoOwotCi0JCQkvLwkJCXJldHVybiB3b3Jrc3BhY2VQYXRoOwotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRFZGl0b3JJbnB1dFRvRGlhZ3JhbShEaWFncmFtIGRpYWdyYW0sCi0JCQlJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MRGlhZ3JhbUZpbGVDcmVhdG9yLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxEaWFncmFtRmlsZUNyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQxYjgyYS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxEaWFncmFtRmlsZUNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS51dGlsLklERUVkaXRvckZpbGVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci51dGlsLkRpYWdyYW1GaWxlQ3JlYXRvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxEaWFncmFtRmlsZUNyZWF0b3IgZXh0ZW5kcyBJREVFZGl0b3JGaWxlQ3JlYXRvciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVU1MRGlhZ3JhbUZpbGVDcmVhdG9yIElOU1RBTkNFID0gbmV3IFVNTERpYWdyYW1GaWxlQ3JlYXRvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbUZpbGVDcmVhdG9yIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gIi54bWkiOyAvLyROT04tTkxTLTEkCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjQzZWViLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTERpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLkRpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTERpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcwotCQlEaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5FUEZEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpOwotCQlEaWFncmFtQ29yZVV0aWwuc2V0RGVmYXVsdEZvbnRQcmVmZXJlbmNlKGdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxEb2N1bWVudFByb3ZpZGVyLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxEb2N1bWVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NTM1ZjAuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MRG9jdW1lbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuTXVsdGlSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLkRlbXVsdGlwbGV4aW5nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLk5vdGlmaWNhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS51dGlsLldvcmtzcGFjZVN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wcm92aWRlcnMuRGlhZ3JhbUVkaXRvckRvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkRpYWdyYW1Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRGlhZ3JhbURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5kb2N1bWVudC5GaWxlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5kb2N1bWVudC5GaWxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLQotLyoqCi0gKiBAbW9kaWZpZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTERvY3VtZW50UHJvdmlkZXIgZXh0ZW5kcyBEaWFncmFtRWRpdG9yRG9jdW1lbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlRG9jdW1lbnRUb0ZpbGUoSURvY3VtZW50IGRvY3VtZW50LCBJRmlsZSBmaWxlLAotCQkJYm9vbGVhbiBvdmVyd3JpdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvL0RpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBkb2N1bWVudC5nZXRDb250ZW50KCk7Ci0JCS8vUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gZGlhZ3JhbS5lUmVzb3VyY2UoKTsKLQkJSURpYWdyYW1Eb2N1bWVudCBkaWFncmFtRG9jdW1lbnQgPSAoSURpYWdyYW1Eb2N1bWVudCkgZG9jdW1lbnQ7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IGRpYWdyYW1Eb2N1bWVudC5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCUxpc3QgcmVzb3VyY2VzID0gZG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0KLQkJbW9uaXRvci5iZWdpblRhc2soIlNhdmluZyBkaWFncmFtIiwgcmVzb3VyY2VzLnNpemUoKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCXN1cGVyLnNhdmVEb2N1bWVudFRvRmlsZShkb2N1bWVudCwgZmlsZSwgb3ZlcndyaXRlLAotCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkvLwkJZm9yIChJdGVyYXRvciBpdCA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCS8vCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCS8vCQkJbW9uaXRvci5zZXRUYXNrTmFtZSgiU2F2aW5nICIgKyBuZXh0UmVzb3VyY2UuZ2V0VVJJKCkpOyAvLyROT04tTkxTLTEkCi0JCS8vCQkJaWYgKG5leHRSZXNvdXJjZSAhPSBkaWFncmFtUmVzb3VyY2UgJiYgbmV4dFJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJLy8JCQkJdHJ5IHsKLQkJLy8JCQkJCW5leHRSZXNvdXJjZS5zYXZlKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCS8vCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJLy8JCQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4KLQkJLy8JCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJLy8JCQkJCQkJLmxvZ0Vycm9yKAotCQkvLwkJCQkJCQkJCSJVbmFibGUgdG8gc2F2ZSByZXNvdXJjZTogIiArIG5leHRSZXNvdXJjZS5nZXRVUkkoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8JCQkJfQotCQkvLwkJCX0KLQkJLy8JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJLy8JCX0KLQkJbW9uaXRvci5kb25lKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRTYXZlUnVsZShPYmplY3QgZWxlbWVudCkgewotCQlJRGlhZ3JhbURvY3VtZW50IGRpYWdyYW1Eb2N1bWVudCA9IGdldERpYWdyYW1Eb2N1bWVudChlbGVtZW50KTsKLQkJaWYgKGRpYWdyYW1Eb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSBkaWFncmFtRG9jdW1lbnQuZ2V0RGlhZ3JhbSgpOwotCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCUNvbGxlY3Rpb24gcnVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGRpYWdyYW1Eb2N1bWVudC5nZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlJRmlsZSBuZXh0RmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplcgotCQkJCQkJCS5nZXRGaWxlKChSZXNvdXJjZSkgaXQubmV4dCgpKTsKLQkJCQkJaWYgKG5leHRGaWxlICE9IG51bGwpIHsKLQkJCQkJCXJ1bGVzLmFkZChjb21wdXRlU2F2ZVNjaGVkdWxpbmdSdWxlKG5leHRGaWxlKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIG5ldyBNdWx0aVJ1bGUoKElTY2hlZHVsaW5nUnVsZVtdKSBydWxlcwotCQkJCQkJLnRvQXJyYXkobmV3IElTY2hlZHVsaW5nUnVsZVtydWxlcy5zaXplKCldKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFNhdmVSdWxlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBGaWxlSW5mbyBjcmVhdGVGaWxlSW5mbyhJRG9jdW1lbnQgZG9jdW1lbnQsCi0JCQlGaWxlU3luY2hyb25pemVyIHN5bmNocm9uaXplciwgSUZpbGVFZGl0b3JJbnB1dCBpbnB1dCkgewotCQkvLyAgICBhc3NlcnQgZG9jdW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtRG9jdW1lbnQ7Ci0KLQkJRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyIGRpYWdyYW1MaXN0ZW5lciA9IG5ldyBDdXN0b21Nb2RpZmljYXRpb25MaXN0ZW5lcigKLQkJCQl0aGlzLCAoRGlhZ3JhbURvY3VtZW50KSBkb2N1bWVudCwgaW5wdXQpOwotCQkvLwkJRGlhZ3JhbUZpbGVJbmZvIGluZm8gPSBuZXcgRGlhZ3JhbUZpbGVJbmZvKGRvY3VtZW50LCBzeW5jaHJvbml6ZXIsCi0JCS8vCQkJCWRpYWdyYW1MaXN0ZW5lcik7Ci0JCURpYWdyYW1GaWxlSW5mb1N5bmMgaW5mbyA9IG5ldyBEaWFncmFtRmlsZUluZm9TeW5jKGRvY3VtZW50LAotCQkJCXN5bmNocm9uaXplciwgZGlhZ3JhbUxpc3RlbmVyLCBpbnB1dCk7Ci0KLQkJZGlhZ3JhbUxpc3RlbmVyLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JCXJldHVybiBpbmZvOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElTY2hlZHVsaW5nUnVsZSBjb21wdXRlU2F2ZVNjaGVkdWxpbmdSdWxlKElSZXNvdXJjZSB0b0NyZWF0ZU9yTW9kaWZ5KSB7Ci0JCWlmICh0b0NyZWF0ZU9yTW9kaWZ5LmV4aXN0cygpCi0JCQkJJiYgdG9DcmVhdGVPck1vZGlmeS5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTykpCi0JCQlyZXR1cm4gZlJlc291cmNlUnVsZUZhY3RvcnkubW9kaWZ5UnVsZSh0b0NyZWF0ZU9yTW9kaWZ5KTsKLQotCQlJUmVzb3VyY2UgcGFyZW50ID0gdG9DcmVhdGVPck1vZGlmeTsKLQkJZG8gewotCQkJLyoKLQkJCSAqIFhYWCBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY3NjAxCi0JCQkgKiBJUmVzb3VyY2VSdWxlRmFjdG9yeS5jcmVhdGVSdWxlIHNob3VsZCBpdGVyYXRlIHRoZSBoaWVyYXJjaHkgaXRzZWxmLgotCQkJICovCi0JCQl0b0NyZWF0ZU9yTW9kaWZ5ID0gcGFyZW50OwotCQkJcGFyZW50ID0gdG9DcmVhdGVPck1vZGlmeS5nZXRQYXJlbnQoKTsKLQkJfSB3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5leGlzdHMoKQotCQkJCSYmICFwYXJlbnQuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKTsKLQotCQlyZXR1cm4gZlJlc291cmNlUnVsZUZhY3RvcnkuY3JlYXRlUnVsZSh0b0NyZWF0ZU9yTW9kaWZ5KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBDdXN0b21Nb2RpZmljYXRpb25MaXN0ZW5lciBleHRlbmRzCi0JCQlGaWxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBEZW11bHRpcGxleGluZ0xpc3RlbmVyIG15TGlzdGVuZXIgPSBudWxsOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQ3VzdG9tTW9kaWZpY2F0aW9uTGlzdGVuZXIoCi0JCQkJVU1MRG9jdW1lbnRQcm92aWRlciBkb2N1bWVudFByb3ZpZGVyUGFyYW1ldGVyLAotCQkJCURpYWdyYW1Eb2N1bWVudCBkb2N1bWVudFBhcmFtZXRlciwKLQkJCQlJRmlsZUVkaXRvcklucHV0IGlucHV0UGFyYW1ldGVyKSB7Ci0JCQlzdXBlcihkb2N1bWVudFByb3ZpZGVyUGFyYW1ldGVyLCBkb2N1bWVudFBhcmFtZXRlciwgaW5wdXRQYXJhbWV0ZXIpOwotCQkJZmluYWwgRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50ID0gZG9jdW1lbnRQYXJhbWV0ZXI7Ci0JCQlOb3RpZmljYXRpb25GaWx0ZXIgZGlhZ3JhbVJlc291cmNlTW9kaWZpZWRGaWx0ZXIgPSBOb3RpZmljYXRpb25GaWx0ZXIKLQkJCQkJLmNyZWF0ZUV2ZW50VHlwZUZpbHRlcihOb3RpZmljYXRpb24uU0VUKTsKLQkJCW15TGlzdGVuZXIgPSBuZXcgRGVtdWx0aXBsZXhpbmdMaXN0ZW5lcigKLQkJCQkJZGlhZ3JhbVJlc291cmNlTW9kaWZpZWRGaWx0ZXIpIHsKLQkJCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb24oCi0JCQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQkJCQlOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCVJlc291cmNlIG1vZGlmaWVkUmVzb3VyY2UgPSAoKEVPYmplY3QpIG5vdGlmaWNhdGlvbgotCQkJCQkJCQkuZ2V0Tm90aWZpZXIoKSkuZVJlc291cmNlKCk7Ci0JCQkJCQlpZiAobW9kaWZpZWRSZXNvdXJjZSAhPSBkb2N1bWVudC5nZXREaWFncmFtKCkKLQkJCQkJCQkJLmVSZXNvdXJjZSgpKSB7Ci0JCQkJCQkJZG9jdW1lbnQuc2V0Q29udGVudChkb2N1bWVudC5nZXRDb250ZW50KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHN0YXJ0TGlzdGVuaW5nKCkgewotCQkJc3VwZXIuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5hZGRSZXNvdXJjZVNldExpc3RlbmVyKG15TGlzdGVuZXIpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHN0b3BMaXN0ZW5pbmcoKSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucmVtb3ZlUmVzb3VyY2VTZXRMaXN0ZW5lcihteUxpc3RlbmVyKTsKLQkJCXN1cGVyLnN0b3BMaXN0ZW5pbmcoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb24uamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTEluaXREaWFncmFtRmlsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTI4ZmQ5Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTEluaXREaWFncmFtRmlsZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLkdNRkVkaXRpbmdEb21haW5GYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IG15UGFydDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElGaWxlIG15U2VsZWN0ZWRNb2RlbEZpbGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBteVNlbGVjdGlvbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCW15UGFydCA9IHRhcmdldFBhcnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCW15U2VsZWN0ZWRNb2RlbEZpbGUgPSBudWxsOwotCQlteVNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uID09IGZhbHNlCi0JCQkJfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCW15U2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCW15U2VsZWN0ZWRNb2RlbEZpbGUgPSAoSUZpbGUpICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKLQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IEdNRkVkaXRpbmdEb21haW5GYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZUVkaXRpbmdEb21haW4oKTsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCUVPYmplY3QgZGlhZ3JhbVJvb3QgPSBudWxsOwotCQl0cnkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShVUkkKLQkJCQkJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkobXlTZWxlY3RlZE1vZGVsRmlsZQotCQkJCQkJCS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLCB0cnVlKTsKLQkJCWRpYWdyYW1Sb290ID0gKEVPYmplY3QpIHJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQl9IGNhdGNoIChXcmFwcGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQlFUEZEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJCS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2U6ICIgKyBteVNlbGVjdGVkTW9kZWxGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGRpYWdyYW1Sb290ID09IG51bGwpIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKG15UGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwgIkVycm9yIiwKLQkJCQkJIk1vZGVsIGZpbGUgbG9hZGluZyBmYWlsZWQiKTsKLQkJCXJldHVybjsKLQkJfQotCQlXaXphcmQgd2l6YXJkID0gbmV3IFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkKG15U2VsZWN0ZWRNb2RlbEZpbGUsIG15UGFydAotCQkJCS5nZXRTaXRlKCkuZ2V0UGFnZSgpLCBteVNlbGVjdGlvbiwgZGlhZ3JhbVJvb3QsIGVkaXRpbmdEb21haW4pOwotCQlJRGlhbG9nU2V0dGluZ3MgcGx1Z2luRGlhbG9nU2V0dGluZ3MgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJSURpYWxvZ1NldHRpbmdzIGluaXREaWFncmFtRmlsZVNldHRpbmdzID0gcGx1Z2luRGlhbG9nU2V0dGluZ3MKLQkJCQkuZ2V0U2VjdGlvbigiSW5pc0RpYWdyYW1GaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluaXREaWFncmFtRmlsZVNldHRpbmdzID09IG51bGwpIHsKLQkJCWluaXREaWFncmFtRmlsZVNldHRpbmdzID0gcGx1Z2luRGlhbG9nU2V0dGluZ3MKLQkJCQkJLmFkZE5ld1NlY3Rpb24oIkluaXNEaWFncmFtRmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJd2l6YXJkLnNldERpYWxvZ1NldHRpbmdzKGluaXREaWFncmFtRmlsZVNldHRpbmdzKTsKLQkJd2l6YXJkLnNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyhmYWxzZSk7Ci0JCXdpemFyZC5zZXRXaW5kb3dUaXRsZSgiSW5pdGlhbGl6ZSBuZXcgIiArIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQKLQkJCQkrICIgZGlhZ3JhbSBmaWxlIik7Ci0KLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2cobXlQYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpLAotCQkJCXdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZShNYXRoLm1heCg1MDAsIGRpYWxvZy5nZXRTaGVsbCgpLmdldFNpemUoKS54KSwKLQkJCQk1MDApOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTExvYWRSZXNvdXJjZUFjdGlvbi5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MTG9hZFJlc291cmNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YzQ4NmIuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MTG9hZFJlc291cmNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Mb2FkUmVzb3VyY2VBY3Rpb24uTG9hZFJlc291cmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTExvYWRSZXNvdXJjZUFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBBY3Rpdml0eUVkaXRQYXJ0IG15U2VsZWN0ZWRFbGVtZW50OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU2hlbGwgbXlTaGVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCW15U2hlbGwgPSB0YXJnZXRQYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJTG9hZFJlc291cmNlRGlhbG9nIGxvYWRSZXNvdXJjZURpYWxvZyA9IG5ldyBMb2FkUmVzb3VyY2VEaWFsb2cobXlTaGVsbCwKLQkJCQlteVNlbGVjdGVkRWxlbWVudC5nZXRFZGl0aW5nRG9tYWluKCkpOwotCQlsb2FkUmVzb3VyY2VEaWFsb2cub3BlbigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlteVNlbGVjdGVkRWxlbWVudCA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpID09IDEKLQkJCQkJJiYgc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RWRpdFBhcnQpIHsKLQkJCQlteVNlbGVjdGVkRWxlbWVudCA9IChBY3Rpdml0eUVkaXRQYXJ0KSBzdHJ1Y3R1cmVkU2VsZWN0aW9uCi0JCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQl9Ci0JCX0KLQkJYWN0aW9uLnNldEVuYWJsZWQoaXNFbmFibGVkKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gbXlTZWxlY3RlZEVsZW1lbnQgIT0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTE1hdGNoaW5nU3RyYXRlZ3kuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTE1hdGNoaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlNDc2Yy4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxNYXRjaGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wYXJ0cy5EaWFncmFtRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuRG9jdW1lbnRQcm92aWRlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRGlhZ3JhbURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRGlhZ3JhbURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50Lk1FZGl0aW5nRG9tYWluRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuRG9jdW1lbnRQcm92aWRlclJlZ2lzdHJ5LklEb2N1bWVudFByb3ZpZGVyU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnBhcnRzLkRpYWdyYW1Eb2N1bWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IucGFydHMuRGlhZ3JhbURvY3VtZW50RWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxNYXRjaGluZ1N0cmF0ZWd5IGV4dGVuZHMgRGlhZ3JhbURvY3VtZW50RWRpdG9yTWF0Y2hpbmdTdHJhdGVneSB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5wYXJ0cy5EaWFncmFtRG9jdW1lbnRFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5I21hdGNoZXMob3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqIEBjdXN0b20KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKElFZGl0b3JSZWZlcmVuY2UgZWRpdG9yUmVmLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkvL3JldHVybiBzdXBlci5tYXRjaGVzKGVkaXRvclJlZiwgaW5wdXQpOwotCQlJRWRpdG9ySW5wdXQgZXhpc3RpbmdFZGl0b3JJbnB1dDsKLQkJSUVkaXRvclBhcnQgZWRpdG9yID0gZWRpdG9yUmVmLmdldEVkaXRvcihmYWxzZSk7Ci0KLQkJdHJ5IHsKLQkJCWV4aXN0aW5nRWRpdG9ySW5wdXQgPSBlZGl0b3JSZWYuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gSWYgdGhlIEV4aXN0aW5nRWRpdG9ySW5wdXQgaXMgc2FtZSBhcyB0aGUgcGFzc2VkIGlucHV0LAotCQkvLyByZXR1cm4gdHJ1ZQotCQlpZiAoZXhpc3RpbmdFZGl0b3JJbnB1dC5lcXVhbHMoaW5wdXQpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgaWYgKCEoaW5wdXQgaW5zdGFuY2VvZiBNRWRpdGluZ0RvbWFpbkVsZW1lbnQpCi0JCQkJJiYgKGVkaXRvciBpbnN0YW5jZW9mIERpYWdyYW1Eb2N1bWVudEVkaXRvcikpIHsKLQkJCS8vIElmIHRoZSBpbnB1dCBpc24ndCBhbiBpbnN0YW5jZW9mIE1FZGl0aW5nRG9tYWluRWxlbWVudCwgYW5kIHRoZSBlZGl0b3IgaXMgaW5zdGFuY2VvZiBEaWFncmFtRG9jdW1lbnRFZGl0b3IKLQkJCS8vIHRoZW4gZG9uJ3QgbWF0Y2ggaXQsIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGNsaWVudCBzaG91bGRuJ3QgdXNlIHRoaXMgc3RyYXRlZ3kgZm9yIG5vbi1EaWFncmFtRG9jdW1lbnRFZGl0b3IuCi0JCQlJRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIgZG9jUHJvdmlkZXIgPSAoSURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKSBEb2N1bWVudFByb3ZpZGVyUmVnaXN0cnkKLQkJCQkJLmdldERlZmF1bHQoKS5nZXREb2N1bWVudFByb3ZpZGVyKGlucHV0LAotCQkJCQkJCW5ldyBJRG9jdW1lbnRQcm92aWRlclNlbGVjdG9yKCkgewotCi0JCQkJCQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChTdHJpbmcgZG9jdW1lbnRUeXBlKSB7Ci0JCQkJCQkJCQkvLyBPbmx5IGNoZWNraW5nIG9mIHRoZSBpbnRlcmZhY2UgbmFtZQotCQkJCQkJCQkJcmV0dXJuIGRvY3VtZW50VHlwZQotCQkJCQkJCQkJCQkuZXF1YWxzKElEaWFncmFtRG9jdW1lbnQuY2xhc3MKLQkJCQkJCQkJCQkJCQkuZ2V0TmFtZSgpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCi0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBEaWFncmFtRmlsZUVkaXRvcklucHV0KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKChEaWFncmFtRmlsZUVkaXRvcklucHV0KSBpbnB1dCkKLQkJCQkJCS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJLy9NZXRob2RFbGVtZW50IGV4aXNpdG5nRSA9KChEaWFncmFtRmlsZUVkaXRvcklucHV0KWV4aXN0aW5nRWRpdG9ySW5wdXQpLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQlNZXRob2RFbGVtZW50IGV4aXN0aW5nRSA9ICgoRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dCkgZXhpc3RpbmdFZGl0b3JJbnB1dAotCQkJCQkJLmdldFBlcnNpc3RhYmxlKCkpLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpCi0JCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCWlmIChlICE9IGV4aXN0aW5nRSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlpZiAoZG9jUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGRvY1Byb3ZpZGVyCi0JCQkJCQkuY3JlYXRlSW5wdXRXaXRoRWRpdGluZ0RvbWFpbihpbnB1dCwKLQkJCQkJCQkJKChEaWFncmFtRG9jdW1lbnRFZGl0b3IpIGVkaXRvcikKLQkJCQkJCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpKTsKLQkJCQlyZXR1cm4gZWRpdG9ySW5wdXQuZXF1YWxzKGV4aXN0aW5nRWRpdG9ySW5wdXQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxOZXdEaWFncmFtRmlsZVdpemFyZC5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhZWQ1Ni4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcGFydC9VTUxOZXdEaWFncmFtRmlsZVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLk9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMuVmlld1NlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMudmlldy5DcmVhdGVEaWFncmFtVmlld09wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmQgZXh0ZW5kcyBXaXphcmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gbXlFZGl0aW5nRG9tYWluOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSBteUZpbGVDcmVhdGlvblBhZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJRmlsZSBteVNlbGVjdGVkTW9kZWxGaWxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVdvcmtiZW5jaFBhZ2UgbXlXb3JrYmVuY2hQYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gbXlTZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFT2JqZWN0IG15RGlhZ3JhbVJvb3Q7Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmQoSUZpbGUgc2VsZWN0ZWRNb2RlbEZpbGUsCi0JCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sCi0JCQlFT2JqZWN0IGRpYWdyYW1Sb290LCBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluKSB7Ci0JCS8vICAgIGFzc2VydCBzZWxlY3RlZE1vZGVsRmlsZSAhPSBudWxsIDogIk51bGwgc2VsZWN0ZWRNb2RlbEZpbGUgaW4gVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmQgY29uc3RydWN0b3IiOyAvLyROT04tTkxTLTEkCi0JCS8vICAgIGFzc2VydCB3b3JrYmVuY2hQYWdlICE9IG51bGwgOiAiTnVsbCB3b3JrYmVuY2hQYWdlIGluIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkIGNvbnN0cnVjdG9yIjsgLy8kTk9OLU5MUy0xJAotCQkvLyAgICBhc3NlcnQgc2VsZWN0aW9uICE9IG51bGwgOiAiTnVsbCBzZWxlY3Rpb24gaW4gVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmQgY29uc3RydWN0b3IiOyAvLyROT04tTkxTLTEkCi0JCS8vICAgICAgYXNzZXJ0IGRpYWdyYW1Sb290ICE9IG51bGwgOiAiTnVsbCBkaWFncmFtUm9vdCBpbiBVTUxOZXdEaWFncmFtRmlsZVdpemFyZCBjb25zdHJ1Y3RvciI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gICAgICBhc3NlcnQgZWRpdGluZ0RvbWFpbiAhPSBudWxsIDogIk51bGwgZWRpdGluZ0RvbWFpbiBpbiBVTUxOZXdEaWFncmFtRmlsZVdpemFyZCBjb25zdHJ1Y3RvciI7IC8vJE5PTi1OTFMtMSQKLQotCQlteVNlbGVjdGVkTW9kZWxGaWxlID0gc2VsZWN0ZWRNb2RlbEZpbGU7Ci0JCW15V29ya2JlbmNoUGFnZSA9IHdvcmtiZW5jaFBhZ2U7Ci0JCW15U2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlteURpYWdyYW1Sb290ID0gZGlhZ3JhbVJvb3Q7Ci0JCW15RWRpdGluZ0RvbWFpbiA9IGVkaXRpbmdEb21haW47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlteUZpbGVDcmVhdGlvblBhZ2UgPSBuZXcgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSgKLQkJCQkiSW5pdGlhbGl6ZSBuZXcgRWNvcmUgZGlhZ3JhbSBmaWxlIiwgbXlTZWxlY3Rpb24pIHsKLQotCQkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCi0JCQkJSUNvbnRhaW5lciBwYXJlbnRDb250YWluZXIgPSBteVNlbGVjdGVkTW9kZWxGaWxlLmdldFBhcmVudCgpOwotCQkJCVN0cmluZyBvcmlnaW5hbEZpbGVOYW1lID0gbXlTZWxlY3RlZE1vZGVsRmlsZQotCQkJCQkJLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5yZW1vdmVGaWxlRXh0ZW5zaW9uKCkKLQkJCQkJCS5sYXN0U2VnbWVudCgpOwotCQkJCVN0cmluZyBmaWxlRXh0ZW5zaW9uID0gIi54bWkiOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGZpbGVOYW1lID0gb3JpZ2luYWxGaWxlTmFtZSArIGZpbGVFeHRlbnNpb247Ci0JCQkJZm9yIChpbnQgaSA9IDE7IHBhcmVudENvbnRhaW5lci5nZXRGaWxlKG5ldyBQYXRoKGZpbGVOYW1lKSkKLQkJCQkJCS5leGlzdHMoKTsgaSsrKSB7Ci0JCQkJCWZpbGVOYW1lID0gb3JpZ2luYWxGaWxlTmFtZSArIGkgKyBmaWxlRXh0ZW5zaW9uOwotCQkJCX0KLQkJCQlzZXRGaWxlTmFtZShmaWxlTmFtZSk7Ci0JCQl9Ci0KLQkJfTsKLQkJbXlGaWxlQ3JlYXRpb25QYWdlLnNldFRpdGxlKCJEaWFncmFtIGZpbGUiKTsKLQkJbXlGaWxlQ3JlYXRpb25QYWdlLnNldERlc2NyaXB0aW9uKCJDcmVhdGUgbmV3IGRpYWdyYW0gYmFzZWQgb24gIgotCQkJCSsgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCArICIgbW9kZWwgY29udGVudCIpOwotCQlhZGRQYWdlKG15RmlsZUNyZWF0aW9uUGFnZSk7Ci0JCWFkZFBhZ2UobmV3IFJvb3RFbGVtZW50U2VsZWN0b3JQYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlJRmlsZSBkaWFncmFtRmlsZSA9IG15RmlsZUNyZWF0aW9uUGFnZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCXRyeSB7Ci0JCQlkaWFncmFtRmlsZS5zZXRDaGFyc2V0KCJVVEYtOCIsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIHNldCBjaGFyc2V0IGZvciBkaWFncmFtIGZpbGUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBteUVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsKLQkJZmluYWwgUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gcmVzb3VyY2VTZXQKLQkJCQkuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZGlhZ3JhbUZpbGUKLQkJCQkJCS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpKTsKLQotCQlMaXN0IGFmZmVjdGVkRmlsZXMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlhZmZlY3RlZEZpbGVzLmFkZChteVNlbGVjdGVkTW9kZWxGaWxlKTsKLQkJYWZmZWN0ZWRGaWxlcy5hZGQoZGlhZ3JhbUZpbGUpOwotCi0JCUFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQgY29tbWFuZCA9IG5ldyBBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kKAotCQkJCW15RWRpdGluZ0RvbWFpbiwgIkluaXRpYWxpemluZyBkaWFncmFtIGNvbnRlbnRzIiwgYWZmZWN0ZWRGaWxlcykgeyAvLyROT04tTkxTLTEkCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KAotCQkJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJaW50IGRpYWdyYW1WSUQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0RGlhZ3JhbVZpc3VhbElEKG15RGlhZ3JhbVJvb3QpOwotCQkJCWlmIChkaWFncmFtVklEICE9IEFjdGl2aXR5RWRpdFBhcnQuVklTVUFMX0lEKSB7Ci0JCQkJCXJldHVybiBDb21tYW5kUmVzdWx0Ci0JCQkJCQkJLm5ld0Vycm9yQ29tbWFuZFJlc3VsdCgiSW5jb3JyZWN0IG1vZGVsIG9iamVjdCBzdG9yZWQgYXMgYSByb290IHJlc291cmNlIG9iamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZURpYWdyYW0obXlEaWFncmFtUm9vdCwKLQkJCQkJCUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQsCi0JCQkJCQlFUEZEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJZGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOwotCQkJCWRpYWdyYW1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCU9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5LmdldE9wZXJhdGlvbkhpc3RvcnkoKS5leGVjdXRlKGNvbW1hbmQsCi0JCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCQkJZGlhZ3JhbVJlc291cmNlLnNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCUlERS5vcGVuRWRpdG9yKG15V29ya2JlbmNoUGFnZSwgZGlhZ3JhbUZpbGUpOwotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIGNyZWF0ZSBtb2RlbCBhbmQgZGlhZ3JhbSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlFUEZEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJCS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiU2F2ZSBvcGVyYXRpb24gZmFpbGVkIGZvcjogIiArIGRpYWdyYW1GaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4KSB7Ci0JCQlFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gb3BlbiBlZGl0b3IiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBSb290RWxlbWVudFNlbGVjdG9yUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cwotCQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBSb290RWxlbWVudFNlbGVjdG9yUGFnZSgpIHsKLQkJCXN1cGVyKCJTZWxlY3QgZGlhZ3JhbSByb290IGVsZW1lbnQiKTsKLQkJCXNldFRpdGxlKCJEaWFncmFtIHJvb3QgZWxlbWVudCIpOwotCQkJc2V0RGVzY3JpcHRpb24oIlNlbGVjdCBzZW1hbnRpYyBtb2RlbCBlbGVtZW50IHRvIGJlIGRlcGljdGVkIG9uIGRpYWdyYW0iKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCQkJQ29tcG9zaXRlIHRvcExldmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCXRvcExldmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCXRvcExldmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwKLQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJCXRvcExldmVsLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCQlzZXRDb250cm9sKHRvcExldmVsKTsKLQkJCWNyZWF0ZU1vZGVsQnJvd3Nlcih0b3BMZXZlbCk7Ci0JCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVNb2RlbEJyb3dzZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCXBhbmVsLnNldExheW91dChsYXlvdXQpOwotCi0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dCgiU2VsZWN0IGRpYWdyYW0gcm9vdCBlbGVtZW50OiIpOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0JCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0KLQkJCVRyZWVWaWV3ZXIgdHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHBhbmVsLCBTV1QuU0lOR0xFCi0JCQkJCXwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlsYXlvdXREYXRhLmhlaWdodEhpbnQgPSAzMDA7Ci0JCQlsYXlvdXREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRJdGVtUHJvdmlkZXJzQWRhcHRlckZhY3RvcnkoKSkpOwotCQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRJdGVtUHJvdmlkZXJzQWRhcHRlckZhY3RvcnkoKSkpOwotCQkJdHJlZVZpZXdlci5zZXRJbnB1dChteURpYWdyYW1Sb290LmVSZXNvdXJjZSgpKTsKLQkJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG15RGlhZ3JhbVJvb3QpKTsKLQkJCXRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlteURpYWdyYW1Sb290ID0gbnVsbDsKLQkJCWlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlzZWxlY3RlZEVsZW1lbnQgPSAoKElXcmFwcGVySXRlbVByb3ZpZGVyKSBzZWxlY3RlZEVsZW1lbnQpCi0JCQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCQl9Ci0JCQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGZWF0dXJlTWFwLkVudHJ5KSB7Ci0JCQkJCQlzZWxlY3RlZEVsZW1lbnQgPSAoKEZlYXR1cmVNYXAuRW50cnkpIHNlbGVjdGVkRWxlbWVudCkKLQkJCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCW15RGlhZ3JhbVJvb3QgPSAoRU9iamVjdCkgc2VsZWN0ZWRFbGVtZW50OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQkJaWYgKG15RGlhZ3JhbVJvb3QgPT0gbnVsbCkgewotCQkJCXNldEVycm9yTWVzc2FnZSgiTm8gZGlhZ3JhbSByb290IGVsZW1lbnQgc2VsZWN0ZWQiKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlib29sZWFuIHJlc3VsdCA9IFZpZXdTZXJ2aWNlLmdldEluc3RhbmNlKCkucHJvdmlkZXMoCi0JCQkJCW5ldyBDcmVhdGVEaWFncmFtVmlld09wZXJhdGlvbihuZXcgRU9iamVjdEFkYXB0ZXIoCi0JCQkJCQkJbXlEaWFncmFtUm9vdCksIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQsCi0JCQkJCQkJRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpKTsKLQkJCXNldEVycm9yTWVzc2FnZShyZXN1bHQgPyBudWxsCi0JCQkJCTogIkludmFsaWQgZGlhZ3JhbSByb290IGVsZW1lbnQgd2FzIHNlbGVjdGVkIik7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MUGFsZXR0ZUZhY3RvcnkuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTFBhbGV0dGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NDRkNWEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MUGFsZXR0ZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZURyYXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVTZXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVW5zcGVjaWZpZWRUeXBlQ3JlYXRpb25Ub29sOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFBhbGV0dGVGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsUGFsZXR0ZShQYWxldHRlUm9vdCBwYWxldHRlUm9vdCkgewotCQlwYWxldHRlUm9vdC5hZGQoY3JlYXRlRmxvd3MxR3JvdXAoKSk7Ci0JCXBhbGV0dGVSb290LmFkZChjcmVhdGVOb2RlczJHcm91cCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBQYWxldHRlQ29udGFpbmVyIGNyZWF0ZUZsb3dzMUdyb3VwKCkgewotCQlQYWxldHRlQ29udGFpbmVyIHBhbGV0dGVDb250YWluZXIgPSBuZXcgUGFsZXR0ZURyYXdlcigiRmxvd3MiKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5zZXREZXNjcmlwdGlvbigiQ3JlYXRpb24gdG9vbCBmb3IgZmxvd3MiKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlTGluazFDcmVhdGlvblRvb2woKSk7Ci0JCXJldHVybiBwYWxldHRlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFBhbGV0dGVDb250YWluZXIgY3JlYXRlTm9kZXMyR3JvdXAoKSB7Ci0JCVBhbGV0dGVDb250YWluZXIgcGFsZXR0ZUNvbnRhaW5lciA9IG5ldyBQYWxldHRlRHJhd2VyKCJOb2RlcyIpOwotCQlwYWxldHRlQ29udGFpbmVyLnNldERlc2NyaXB0aW9uKCJDcmVhdGlvbiB0b29sIGdyb3VwIGZvciBub2RlcyIpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVBY3Rpdml0eVBhcnRpdGlvbjFDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZVN0YXJ0Tm9kZTJDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZUZvcmtOb2RlM0NyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlTWVyZ2VOb2RlNENyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlRGVjaXNpb25Ob2RlNUNyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlRW5kTm9kZTZDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZUpvaW5Ob2RlN0NyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQobmV3IFBhbGV0dGVTZXBhcmF0b3IoKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZUFjdGl2aXR5OUNyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlUGhhc2UxMENyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlSXRlcmF0aW9uMTFDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZVRhc2tEZXNjcmlwdG9yMTJDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZU1pbGVzdG9uZTEzQ3JlYXRpb25Ub29sKCkpOwotCQlyZXR1cm4gcGFsZXR0ZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlQWN0aXZpdHlQYXJ0aXRpb24xQ3JlYXRpb25Ub29sKCkgewotCQlJbWFnZURlc2NyaXB0b3Igc21hbGxJbWFnZTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGxhcmdlSW1hZ2U7Ci0KLQkJc21hbGxJbWFnZSA9IEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZmluZEltYWdlRGVzY3JpcHRvcigiL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5UGFydGl0aW9uLmdpZiIpOwotCi0JCWxhcmdlSW1hZ2UgPSBzbWFsbEltYWdlOwotCi0JCWZpbmFsIExpc3QgZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8xMDA4KTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJ0aXRpb25fMjAwMSk7Ci0JCVRvb2xFbnRyeSByZXN1bHQgPSBuZXcgTm9kZVRvb2xFbnRyeSgiQWN0aXZpdHkgUGFydGl0aW9uIiwKLQkJCQkiQ3JlYXRlIG5ldyBBY3Rpdml0eSBQYXJ0aXRpb24iLCBzbWFsbEltYWdlLCBsYXJnZUltYWdlLAotCQkJCWVsZW1lbnRUeXBlcyk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlU3RhcnROb2RlMkNyZWF0aW9uVG9vbCgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIHNtYWxsSW1hZ2U7Ci0JCUltYWdlRGVzY3JpcHRvciBsYXJnZUltYWdlOwotCi0JCXNtYWxsSW1hZ2UgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmZpbmRJbWFnZURlc2NyaXB0b3IoIi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Jbml0aWFsTm9kZS5naWYiKTsKLQotCQlsYXJnZUltYWdlID0gc21hbGxJbWFnZTsKLQotCQlmaW5hbCBMaXN0IGVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuSW5pdGlhbE5vZGVfMTAwNCk7Ci0JCVRvb2xFbnRyeSByZXN1bHQgPSBuZXcgTm9kZVRvb2xFbnRyeSgiU3RhcnQgTm9kZSIsCi0JCQkJIkNyZWF0ZSBuZXcgU3RhcnQgTm9kZSIsIHNtYWxsSW1hZ2UsIGxhcmdlSW1hZ2UsIGVsZW1lbnRUeXBlcyk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlRm9ya05vZGUzQ3JlYXRpb25Ub29sKCkgewotCQlJbWFnZURlc2NyaXB0b3Igc21hbGxJbWFnZTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGxhcmdlSW1hZ2U7Ci0KLQkJc21hbGxJbWFnZSA9IEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZmluZEltYWdlRGVzY3JpcHRvcigiL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0ZvcmtOb2RlLmdpZiIpOwotCi0JCWxhcmdlSW1hZ2UgPSBzbWFsbEltYWdlOwotCi0JCWZpbmFsIExpc3QgZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5Gb3JrTm9kZV8xMDAzKTsKLQkJVG9vbEVudHJ5IHJlc3VsdCA9IG5ldyBOb2RlVG9vbEVudHJ5KCJGb3JrIE5vZGUiLAotCQkJCSJDcmVhdGUgbmV3IEZvcmsgTm9kZSIsIHNtYWxsSW1hZ2UsIGxhcmdlSW1hZ2UsIGVsZW1lbnRUeXBlcyk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlTWVyZ2VOb2RlNENyZWF0aW9uVG9vbCgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIHNtYWxsSW1hZ2U7Ci0JCUltYWdlRGVzY3JpcHRvciBsYXJnZUltYWdlOwotCi0JCXNtYWxsSW1hZ2UgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmZpbmRJbWFnZURlc2NyaXB0b3IoIi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9NZXJnZU5vZGUuZ2lmIik7Ci0KLQkJbGFyZ2VJbWFnZSA9IHNtYWxsSW1hZ2U7Ci0KLQkJZmluYWwgTGlzdCBlbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLk1lcmdlTm9kZV8xMDAyKTsKLQkJVG9vbEVudHJ5IHJlc3VsdCA9IG5ldyBOb2RlVG9vbEVudHJ5KCJNZXJnZSBOb2RlIiwKLQkJCQkiQ3JlYXRlIG5ldyBNZXJnZSBOb2RlIiwgc21hbGxJbWFnZSwgbGFyZ2VJbWFnZSwgZWxlbWVudFR5cGVzKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVEZWNpc2lvbk5vZGU1Q3JlYXRpb25Ub29sKCkgewotCQlJbWFnZURlc2NyaXB0b3Igc21hbGxJbWFnZTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGxhcmdlSW1hZ2U7Ci0KLQkJc21hbGxJbWFnZSA9IEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZmluZEltYWdlRGVzY3JpcHRvcigiL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0RlY2lzaW9uTm9kZS5naWYiKTsKLQotCQlsYXJnZUltYWdlID0gc21hbGxJbWFnZTsKLQotCQlmaW5hbCBMaXN0IGVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuRGVjaXNpb25Ob2RlXzEwMDUpOwotCQlUb29sRW50cnkgcmVzdWx0ID0gbmV3IE5vZGVUb29sRW50cnkoIkRlY2lzaW9uIE5vZGUiLAotCQkJCSJDcmVhdGUgbmV3IERlY2lzaW9uIE5vZGUiLCBzbWFsbEltYWdlLCBsYXJnZUltYWdlLAotCQkJCWVsZW1lbnRUeXBlcyk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlRW5kTm9kZTZDcmVhdGlvblRvb2woKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBzbWFsbEltYWdlOwotCQlJbWFnZURlc2NyaXB0b3IgbGFyZ2VJbWFnZTsKLQotCQlzbWFsbEltYWdlID0gRVBGRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCS5maW5kSW1hZ2VEZXNjcmlwdG9yKCIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlGaW5hbE5vZGUuZ2lmIik7Ci0KLQkJbGFyZ2VJbWFnZSA9IHNtYWxsSW1hZ2U7Ci0KLQkJZmluYWwgTGlzdCBlbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5RmluYWxOb2RlXzEwMDEpOwotCQlUb29sRW50cnkgcmVzdWx0ID0gbmV3IE5vZGVUb29sRW50cnkoIkVuZCBOb2RlIiwgIkNyZWF0ZSBuZXcgRW5kIE5vZGUiLAotCQkJCXNtYWxsSW1hZ2UsIGxhcmdlSW1hZ2UsIGVsZW1lbnRUeXBlcyk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlSm9pbk5vZGU3Q3JlYXRpb25Ub29sKCkgewotCQlJbWFnZURlc2NyaXB0b3Igc21hbGxJbWFnZTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGxhcmdlSW1hZ2U7Ci0KLQkJc21hbGxJbWFnZSA9IEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZmluZEltYWdlRGVzY3JpcHRvcigiL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0pvaW5Ob2RlLmdpZiIpOwotCi0JCWxhcmdlSW1hZ2UgPSBzbWFsbEltYWdlOwotCi0JCWZpbmFsIExpc3QgZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5Kb2luTm9kZV8xMDA2KTsKLQkJVG9vbEVudHJ5IHJlc3VsdCA9IG5ldyBOb2RlVG9vbEVudHJ5KCJKb2luIE5vZGUiLAotCQkJCSJDcmVhdGUgbmV3IEpvaW4gTm9kZSIsIHNtYWxsSW1hZ2UsIGxhcmdlSW1hZ2UsIGVsZW1lbnRUeXBlcyk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlQWN0aXZpdHk5Q3JlYXRpb25Ub29sKCkgewotCQlJbWFnZURlc2NyaXB0b3Igc21hbGxJbWFnZTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGxhcmdlSW1hZ2U7Ci0KLQkJc21hbGxJbWFnZSA9IEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZmluZEltYWdlRGVzY3JpcHRvcigiL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZiIpOwotCi0JCWxhcmdlSW1hZ2UgPSBzbWFsbEltYWdlOwotCi0JCWZpbmFsIExpc3QgZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcpOwotCQlUb29sRW50cnkgcmVzdWx0ID0gbmV3IE5vZGVUb29sRW50cnkoIkFjdGl2aXR5IiwgIkNyZWF0ZSBuZXcgQWN0aXZpdHkiLAotCQkJCXNtYWxsSW1hZ2UsIGxhcmdlSW1hZ2UsIGVsZW1lbnRUeXBlcyk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlUGhhc2UxMENyZWF0aW9uVG9vbCgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIHNtYWxsSW1hZ2U7Ci0JCUltYWdlRGVzY3JpcHRvciBsYXJnZUltYWdlOwotCi0JCXNtYWxsSW1hZ2UgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmZpbmRJbWFnZURlc2NyaXB0b3IoIi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9QaGFzZS5naWYiKTsKLQotCQlsYXJnZUltYWdlID0gc21hbGxJbWFnZTsKLQotCQlmaW5hbCBMaXN0IGVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwKTsKLQkJVG9vbEVudHJ5IHJlc3VsdCA9IG5ldyBOb2RlVG9vbEVudHJ5KCJQaGFzZSIsICJDcmVhdGUgbmV3IFBoYXNlIiwKLQkJCQlzbWFsbEltYWdlLCBsYXJnZUltYWdlLCBlbGVtZW50VHlwZXMpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZUl0ZXJhdGlvbjExQ3JlYXRpb25Ub29sKCkgewotCQlJbWFnZURlc2NyaXB0b3Igc21hbGxJbWFnZTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGxhcmdlSW1hZ2U7Ci0KLQkJc21hbGxJbWFnZSA9IEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZmluZEltYWdlRGVzY3JpcHRvcigiL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0l0ZXJhdGlvbi5naWYiKTsKLQotCQlsYXJnZUltYWdlID0gc21hbGxJbWFnZTsKLQotCQlmaW5hbCBMaXN0IGVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExKTsKLQkJVG9vbEVudHJ5IHJlc3VsdCA9IG5ldyBOb2RlVG9vbEVudHJ5KCJJdGVyYXRpb24iLAotCQkJCSJDcmVhdGUgbmV3IEl0ZXJhdGlvbiIsIHNtYWxsSW1hZ2UsIGxhcmdlSW1hZ2UsIGVsZW1lbnRUeXBlcyk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlVGFza0Rlc2NyaXB0b3IxMkNyZWF0aW9uVG9vbCgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIHNtYWxsSW1hZ2U7Ci0JCUltYWdlRGVzY3JpcHRvciBsYXJnZUltYWdlOwotCi0JCXNtYWxsSW1hZ2UgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmZpbmRJbWFnZURlc2NyaXB0b3IoIi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRvci5naWYiKTsKLQotCQlsYXJnZUltYWdlID0gc21hbGxJbWFnZTsKLQotCQlmaW5hbCBMaXN0IGVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkpOwotCQlUb29sRW50cnkgcmVzdWx0ID0gbmV3IE5vZGVUb29sRW50cnkoIlRhc2sgRGVzY3JpcHRvciIsCi0JCQkJIkNyZWF0ZSBuZXcgVGFzayBEZXNjcmlwdG9yIiwgc21hbGxJbWFnZSwgbGFyZ2VJbWFnZSwKLQkJCQllbGVtZW50VHlwZXMpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZU1pbGVzdG9uZTEzQ3JlYXRpb25Ub29sKCkgewotCQlJbWFnZURlc2NyaXB0b3Igc21hbGxJbWFnZTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGxhcmdlSW1hZ2U7Ci0KLQkJc21hbGxJbWFnZSA9IEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZmluZEltYWdlRGVzY3JpcHRvcigiL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZS5naWYiKTsKLQotCQlsYXJnZUltYWdlID0gc21hbGxJbWFnZTsKLQotCQlmaW5hbCBMaXN0IGVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIpOwotCQlUb29sRW50cnkgcmVzdWx0ID0gbmV3IE5vZGVUb29sRW50cnkoIk1pbGVzdG9uZSIsCi0JCQkJIkNyZWF0ZSBuZXcgTWlsZXN0b25lIiwgc21hbGxJbWFnZSwgbGFyZ2VJbWFnZSwgZWxlbWVudFR5cGVzKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVMaW5rMUNyZWF0aW9uVG9vbCgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIHNtYWxsSW1hZ2U7Ci0JCUltYWdlRGVzY3JpcHRvciBsYXJnZUltYWdlOwotCi0JCXNtYWxsSW1hZ2UgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmZpbmRJbWFnZURlc2NyaXB0b3IoIi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Db250cm9sRmxvdy5naWYiKTsKLQotCQlsYXJnZUltYWdlID0gc21hbGxJbWFnZTsKLQotCQlmaW5hbCBMaXN0IHJlbGF0aW9uc2hpcFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZWxhdGlvbnNoaXBUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEpOwotCQlUb29sRW50cnkgcmVzdWx0ID0gbmV3IExpbmtUb29sRW50cnkoIkxpbmsiLCAiQ3JlYXRlIG5ldyBMaW5rIiwKLQkJCQlzbWFsbEltYWdlLCBsYXJnZUltYWdlLCByZWxhdGlvbnNoaXBUeXBlcyk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9kZVRvb2xFbnRyeSBleHRlbmRzIFRvb2xFbnRyeSB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgZmluYWwgTGlzdCBlbGVtZW50VHlwZXM7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTm9kZVRvb2xFbnRyeShTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbiwKLQkJCQlJbWFnZURlc2NyaXB0b3Igc21hbGxJY29uLCBJbWFnZURlc2NyaXB0b3IgbGFyZ2VJY29uLAotCQkJCUxpc3QgZWxlbWVudFR5cGVzKSB7Ci0JCQlzdXBlcih0aXRsZSwgZGVzY3JpcHRpb24sIHNtYWxsSWNvbiwgbGFyZ2VJY29uKTsKLQkJCXRoaXMuZWxlbWVudFR5cGVzID0gZWxlbWVudFR5cGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHVibGljIFRvb2wgY3JlYXRlVG9vbCgpIHsKLQkJCVRvb2wgdG9vbCA9IG5ldyBVbnNwZWNpZmllZFR5cGVDcmVhdGlvblRvb2woZWxlbWVudFR5cGVzKTsKLQkJCXRvb2wuc2V0UHJvcGVydGllcyhnZXRUb29sUHJvcGVydGllcygpKTsKLQkJCUJyaWRnZUhlbHBlci5lbGVtZW50VHlwZXMuYWRkKGVsZW1lbnRUeXBlcwotCQkJCQkuZ2V0KGVsZW1lbnRUeXBlcy5zaXplKCkgLSAxKSk7Ci0JCQlyZXR1cm4gdG9vbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBMaW5rVG9vbEVudHJ5IGV4dGVuZHMgVG9vbEVudHJ5IHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBMaXN0IHJlbGF0aW9uc2hpcFR5cGVzOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIExpbmtUb29sRW50cnkoU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24sCi0JCQkJSW1hZ2VEZXNjcmlwdG9yIHNtYWxsSWNvbiwgSW1hZ2VEZXNjcmlwdG9yIGxhcmdlSWNvbiwKLQkJCQlMaXN0IHJlbGF0aW9uc2hpcFR5cGVzKSB7Ci0JCQlzdXBlcih0aXRsZSwgZGVzY3JpcHRpb24sIHNtYWxsSWNvbiwgbGFyZ2VJY29uKTsKLQkJCXRoaXMucmVsYXRpb25zaGlwVHlwZXMgPSByZWxhdGlvbnNoaXBUeXBlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgVG9vbCBjcmVhdGVUb29sKCkgewotCQkJVG9vbCB0b29sID0gbmV3IFVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25Ub29sKHJlbGF0aW9uc2hpcFR5cGVzKTsKLQkJCXRvb2wuc2V0UHJvcGVydGllcyhnZXRUb29sUHJvcGVydGllcygpKTsKLQkJCXJldHVybiB0b29sOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MVmlzdWFsSURSZWdpc3RyeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3BhcnQvVU1MVmlzdWFsSURSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDlhYmI0Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wYXJ0L1VNTFZpc3VhbElEUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkZvcmtOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuRm9ya05vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuSW5pdGlhbE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5Kb2luTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkpvaW5Ob2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLk1lcmdlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLk1lcmdlTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmV4cHJlc3Npb25zLlVNTEFic3RyYWN0RXhwcmVzc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUZpbmFsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcmFtZXRlck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRGVjaXNpb25Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkZvcmtOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkluaXRpYWxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkpvaW5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk1lcmdlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5PYmplY3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIHJlZ2lzdHJ5IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIHR5cGUgb2YgdmlzdWFsIG9iamVjdCBzaG91bGQgYmUKLSAqIGNyZWF0ZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIERpYWdyYW0sIE5vZGUsIENoaWxkTm9kZSBvciBMaW5rIHJlcHJlc2VudGVkIAotICogYnkgYSBkb21haW4gbW9kZWwgb2JqZWN0LgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFZpc3VhbElEUmVnaXN0cnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19LRVkgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkuZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKQotCQkJKyAiL2RlYnVnL3Zpc3VhbElEIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFZpc3VhbElEKFZpZXcgdmlldykgewotCQlpZiAodmlldyBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCWlmIChBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyh2aWV3LmdldFR5cGUoKSkpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0VmlzdWFsSUQodmlldy5nZXRUeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2RlbElEKFZpZXcgdmlldykgewotCQlWaWV3IGRpYWdyYW0gPSB2aWV3LmdldERpYWdyYW0oKTsKLQkJd2hpbGUgKHZpZXcgIT0gZGlhZ3JhbSkgewotCQkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gKFN0cmluZykgYW5ub3RhdGlvbi5nZXREZXRhaWxzKCkuZ2V0KCJtb2RlbElEIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW0gIT0gbnVsbCA/IGRpYWdyYW0uZ2V0VHlwZSgpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VmlzdWFsSUQoU3RyaW5nIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHR5cGUpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJaWYgKEJvb2xlYW4uVFJVRS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJCVBsYXRmb3JtLmdldERlYnVnT3B0aW9uKERFQlVHX0tFWSkpKSB7Ci0JCQkJRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkJIlVuYWJsZSB0byBwYXJzZSB2aWV3IHR5cGUgYXMgYSB2aXN1YWxJRCBudW1iZXI6ICIKLQkJCQkJCQkJKyB0eXBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGUoaW50IHZpc3VhbElEKSB7Ci0JCXJldHVybiBTdHJpbmcudmFsdWVPZih2aXN1YWxJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldERpYWdyYW1WaXN1YWxJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJaWYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzID0gZG9tYWluRWxlbWVudC5lQ2xhc3MoKTsKLQkJcmV0dXJuIGdldERpYWdyYW1WaXN1YWxJRChkb21haW5FbGVtZW50LCBkb21haW5FbGVtZW50TWV0YWNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldERpYWdyYW1WaXN1YWxJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQsCi0JCQlFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcykgewotCQlpZiAoVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKS5pc1N1cGVyVHlwZU9mKAotCQkJCWRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJJiYgaXNEaWFncmFtQWN0aXZpdHlfNzkoKEFjdGl2aXR5KSBkb21haW5FbGVtZW50KSkgewotCQkJcmV0dXJuIEFjdGl2aXR5RWRpdFBhcnQuVklTVUFMX0lEOwotCQl9Ci0JCXJldHVybiBnZXRVbnJlY29nbml6ZWREaWFncmFtSUQoZG9tYWluRWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldE5vZGVWaXN1YWxJRChWaWV3IGNvbnRhaW5lclZpZXcsIEVPYmplY3QgZG9tYWluRWxlbWVudCkgewotCQlpZiAoZG9tYWluRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MgPSBkb21haW5FbGVtZW50LmVDbGFzcygpOwotCQlyZXR1cm4gZ2V0Tm9kZVZpc3VhbElEKGNvbnRhaW5lclZpZXcsIGRvbWFpbkVsZW1lbnQsCi0JCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Tm9kZVZpc3VhbElEKFZpZXcgY29udGFpbmVyVmlldywKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MsCi0JCQlTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCVN0cmluZyBjb250YWluZXJNb2RlbElEID0gZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhjb250YWluZXJNb2RlbElEKSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWludCBjb250YWluZXJWaXN1YWxJRDsKLQkJaWYgKEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKGNvbnRhaW5lck1vZGVsSUQpKSB7Ci0JCQljb250YWluZXJWaXN1YWxJRCA9IGdldFZpc3VhbElEKGNvbnRhaW5lclZpZXcpOwotCQl9IGVsc2UgewotCQkJaWYgKGNvbnRhaW5lclZpZXcgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJY29udGFpbmVyVmlzdWFsSUQgPSBBY3Rpdml0eUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWludCBub2RlVmlzdWFsSUQgPSBzZW1hbnRpY0hpbnQgIT0gbnVsbCA/IGdldFZpc3VhbElEKHNlbWFudGljSGludCkKLQkJCQk6IC0xOwotCQlzd2l0Y2ggKGNvbnRhaW5lclZpc3VhbElEKSB7Ci0JCWNhc2UgQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBBY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlGaW5hbE5vZGVfMTAwMUNoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChNZXJnZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBNZXJnZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZE1lcmdlTm9kZV8xMDAyQ2hpbGROb2RlSUQoZG9tYWluRWxlbWVudCwKLQkJCQkJc2VtYW50aWNIaW50KTsKLQkJY2FzZSBGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChGb3JrTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEZvcmtOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRGb3JrTm9kZV8xMDAzQ2hpbGROb2RlSUQoZG9tYWluRWxlbWVudCwKLQkJCQkJc2VtYW50aWNIaW50KTsKLQkJY2FzZSBJbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChJbml0aWFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRJbml0aWFsTm9kZV8xMDA0Q2hpbGROb2RlSUQoZG9tYWluRWxlbWVudCwKLQkJCQkJc2VtYW50aWNIaW50KTsKLQkJY2FzZSBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWREZWNpc2lvbk5vZGVfMTAwNUNoaWxkTm9kZUlEKGRvbWFpbkVsZW1lbnQsCi0JCQkJCXNlbWFudGljSGludCk7Ci0JCWNhc2UgSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoSm9pbk5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBKb2luTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkSm9pbk5vZGVfMTAwNkNoaWxkTm9kZUlEKGRvbWFpbkVsZW1lbnQsCi0JCQkJCXNlbWFudGljSGludCk7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3Q2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmIChBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmIChJbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gSW5pdGlhbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKEpvaW5Ob2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmIChGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoTWVyZ2VOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eVBhcnRpdGlvbl8xMDA4Q2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDlDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTBDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTFDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMkNoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmIChBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJ0aXRpb25fMjAwMUNoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5UGFydGl0aW9uKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZUFjdGl2aXR5UGFydGl0aW9uXzIwMDEoKEFjdGl2aXR5UGFydGl0aW9uKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRfNTAwMUNoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eVBhcnRpdGlvbigpCi0JCQkJCQkJLmlzU3VwZXJUeXBlT2YoZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVBY3Rpdml0eVBhcnRpdGlvbl8yMDAxKChBY3Rpdml0eVBhcnRpdGlvbikgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50XzUwMDJDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBBY3Rpdml0eUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eUZpbmFsTm9kZSgpCi0JCQkJCQkJLmlzU3VwZXJUeXBlT2YoZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVBY3Rpdml0eUZpbmFsTm9kZV8xMDAxKChBY3Rpdml0eUZpbmFsTm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXJnZU5vZGUoKS5pc1N1cGVyVHlwZU9mKAotCQkJCQkJCWRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlTWVyZ2VOb2RlXzEwMDIoKE1lcmdlTm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRGb3JrTm9kZSgpLmlzU3VwZXJUeXBlT2YoCi0JCQkJCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVGb3JrTm9kZV8xMDAzKChGb3JrTm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBJbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRpYWxOb2RlKCkuaXNTdXBlclR5cGVPZigKLQkJCQkJCQlkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZUluaXRpYWxOb2RlXzEwMDQoKEluaXRpYWxOb2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gSW5pdGlhbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldERlY2lzaW9uTm9kZSgpLmlzU3VwZXJUeXBlT2YoCi0JCQkJCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVEZWNpc2lvbk5vZGVfMTAwNSgoRGVjaXNpb25Ob2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEpvaW5Ob2RlKCkuaXNTdXBlclR5cGVPZigKLQkJCQkJCQlkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZUpvaW5Ob2RlXzEwMDYoKEpvaW5Ob2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNygoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJ0aXRpb24oKQotCQkJCQkJCS5pc1N1cGVyVHlwZU9mKGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCgoQWN0aXZpdHlQYXJ0aXRpb24pIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5KChBY3Rpdml0eVBhcmFtZXRlck5vZGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpCi0JCQkJCQkJLmlzU3VwZXJUeXBlT2YoZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSgoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyKChBY3Rpdml0eVBhcmFtZXRlck5vZGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZEFjdGl2aXR5Xzc5Q2hpbGROb2RlSUQoZG9tYWluRWxlbWVudCwKLQkJCQkJc2VtYW50aWNIaW50KTsKLQkJY2FzZSBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChDb250cm9sRmxvd05hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIENvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRDb250cm9sRmxvd18zMDAxTGlua0xhYmVsSUQoc2VtYW50aWNIaW50KTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJaWYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzID0gZG9tYWluRWxlbWVudC5lQ2xhc3MoKTsKLQkJcmV0dXJuIGdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChkb21haW5FbGVtZW50LCBkb21haW5FbGVtZW50TWV0YWNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKEVPYmplY3QgZG9tYWluRWxlbWVudCwKLQkJCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzKSB7Ci0JCWlmIChVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250cm9sRmxvdygpLmlzU3VwZXJUeXBlT2YoCi0JCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTGlua1dpdGhDbGFzc0NvbnRyb2xGbG93XzMwMDEoKENvbnRyb2xGbG93KSBkb21haW5FbGVtZW50KSkpIHsKLQkJCXJldHVybiBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRMaW5rV2l0aENsYXNzSUQoZG9tYWluRWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGlhZ3JhbUFjdGl2aXR5Xzc5KEFjdGl2aXR5IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWREaWFncmFtSUQoRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZUFjdGl2aXR5RmluYWxOb2RlXzEwMDEoCi0JCQlBY3Rpdml0eUZpbmFsTm9kZSBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlTWVyZ2VOb2RlXzEwMDIoTWVyZ2VOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVGb3JrTm9kZV8xMDAzKEZvcmtOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVJbml0aWFsTm9kZV8xMDA0KEluaXRpYWxOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVEZWNpc2lvbk5vZGVfMTAwNShEZWNpc2lvbk5vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZUpvaW5Ob2RlXzEwMDYoSm9pbk5vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNygKLQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3Lm1hdGNoZXMoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVBY3Rpdml0eVBhcnRpdGlvbl8xMDA4KAotCQkJQWN0aXZpdHlQYXJ0aXRpb24gZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5KAotCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5Lm1hdGNoZXMoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAoCi0JCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMC5tYXRjaGVzKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExKAotCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBlbGVtZW50KSB7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEubWF0Y2hlcyhlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyKAotCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyLm1hdGNoZXMoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVBY3Rpdml0eVBhcnRpdGlvbl8yMDAxKAotCQkJQWN0aXZpdHlQYXJ0aXRpb24gZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZEFjdGl2aXR5RmluYWxOb2RlXzEwMDFDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRNZXJnZU5vZGVfMTAwMkNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZEZvcmtOb2RlXzEwMDNDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRJbml0aWFsTm9kZV8xMDA0Q2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkRGVjaXNpb25Ob2RlXzEwMDVDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRKb2luTm9kZV8xMDA2Q2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3Q2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJ0aXRpb25fMTAwOENoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5Q2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTJDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eVBhcnRpdGlvbl8yMDAxQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudF81MDAxQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudF81MDAyQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlfNzlDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRDb250cm9sRmxvd18zMDAxTGlua0xhYmVsSUQoCi0JCQlTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZExpbmtXaXRoQ2xhc3NJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMaW5rV2l0aENsYXNzQ29udHJvbEZsb3dfMzAwMShDb250cm9sRmxvdyBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXRjaGVyIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyA9IG5ldyBNYXRjaGVyKAotCQkJbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKSB7Ci0JCQkJcHJvdGVjdGVkIE9iamVjdCBkb0V2YWx1YXRlKE9iamVjdCBjb250ZXh0LCBNYXAgZW52KSB7Ci0JCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgc2VsZiA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBjb250ZXh0OwotCQkJCQlyZXR1cm4gSmF2YU1hdGNoZXJzLmdldFVtYVR5cGVfQWN0aXZpdHkoc2VsZik7Ci0JCQkJfQotCQkJfSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWF0Y2hlciBBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSA9IG5ldyBNYXRjaGVyKAotCQkJbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkpIHsKLQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIHNlbGYgPSAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSBjb250ZXh0OwotCQkJCQlyZXR1cm4gSmF2YU1hdGNoZXJzLmdldFVtYVR5cGVfVGFza0Rlc2NyaXB0b3Ioc2VsZik7Ci0JCQkJfQotCQkJfSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWF0Y2hlciBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAgPSBuZXcgTWF0Y2hlcigKLQkJCW5ldyBVTUxBYnN0cmFjdEV4cHJlc3Npb24oVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSkgewotCQkJCXByb3RlY3RlZCBPYmplY3QgZG9FdmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudikgewotCQkJCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHNlbGYgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgY29udGV4dDsKLQkJCQkJcmV0dXJuIEphdmFNYXRjaGVycy5nZXRVbWFUeXBlX1BoYXNlKHNlbGYpOwotCQkJCX0KLQkJCX0pOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hdGNoZXIgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExID0gbmV3IE1hdGNoZXIoCi0JCQluZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpIHsKLQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGNvbnRleHQ7Ci0JCQkJCXJldHVybiBKYXZhTWF0Y2hlcnMuZ2V0VW1hVHlwZV9JdGVyYXRpb24oc2VsZik7Ci0JCQkJfQotCQkJfSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWF0Y2hlciBBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMiA9IG5ldyBNYXRjaGVyKAotCQkJbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkpIHsKLQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIHNlbGYgPSAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSBjb250ZXh0OwotCQkJCQlyZXR1cm4gSmF2YU1hdGNoZXJzLmdldFVtYVR5cGVfTWlsZXN0b25lKHNlbGYpOwotCQkJCX0KLQkJCX0pOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAkKLQkgKi8KLQlzdGF0aWMgY2xhc3MgTWF0Y2hlciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQJCi0JCSAqLwotCQlwcml2YXRlIFVNTEFic3RyYWN0RXhwcmVzc2lvbiBjb25kaXRpb247Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQJCi0JCSAqLwotCQlNYXRjaGVyKFVNTEFic3RyYWN0RXhwcmVzc2lvbiBjb25kaXRpb25FeHByZXNzaW9uKSB7Ci0JCQl0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbkV4cHJlc3Npb247Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAkKLQkJICovCi0JCWJvb2xlYW4gbWF0Y2hlcyhFT2JqZWN0IG9iamVjdCkgewotCQkJT2JqZWN0IHJlc3VsdCA9IGNvbmRpdGlvbi5ldmFsdWF0ZShvYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdCBpbnN0YW5jZW9mIEJvb2xlYW4KLQkJCQkJJiYgKChCb29sZWFuKSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JfS8vIE1hdGNoZXIKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBKYXZhTWF0Y2hlcnMgewotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIEJvb2xlYW4gZ2V0VW1hVHlwZV9BY3Rpdml0eShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHNlbGYpIHsKLQkJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQotCQkJQm9vbGVhbiBibCA9IG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJCVN0cmluZyB0eXBlID0gQnJpZGdlSGVscGVyLmdldEVBbm5vdGF0aW9uVHlwZShzZWxmLAotCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX1RZUEUpOwotCQkJaWYgKEJyaWRnZUhlbHBlci5VTUFfQUNUSVZJVFkuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgewotCQkJCXJldHVybiBibC5UUlVFOwotCQkJfQotCQkJcmV0dXJuIGJsOwotCQkJLy8JCQl0aHJvdyBuZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uLk5vSW1wbEV4Y2VwdGlvbigKLQkJCS8vCQkJCQkiTm8gdXNlciBqYXZhIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGluICdnZXRVbWFUeXBlX0FjdGl2aXR5JyBvcGVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiBnZXRVbWFUeXBlX1Rhc2tEZXNjcmlwdG9yKAotCQkJCUFjdGl2aXR5UGFyYW1ldGVyTm9kZSBzZWxmKSB7Ci0JCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0KLQkJCUJvb2xlYW4gYmwgPSBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JCQlTdHJpbmcgdHlwZSA9IEJyaWRnZUhlbHBlci5nZXRFQW5ub3RhdGlvblR5cGUoc2VsZiwKLQkJCQkJQnJpZGdlSGVscGVyLlVNQV9UWVBFKTsKLQkJCWlmIChCcmlkZ2VIZWxwZXIuVU1BX1RBU0tfREVTQ1JJUFRPUi5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7Ci0JCQkJcmV0dXJuIGJsLlRSVUU7Ci0JCQl9Ci0JCQlyZXR1cm4gYmw7Ci0JCQkvLwkJCXRocm93IG5ldyBVTUxBYnN0cmFjdEV4cHJlc3Npb24uTm9JbXBsRXhjZXB0aW9uKAotCQkJLy8JCQkJCSJObyB1c2VyIGphdmEgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgaW4gJ2dldFVtYVR5cGVfVGFza0Rlc2NyaXB0b3InIG9wZXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBCb29sZWFuIGdldFVtYVR5cGVfUGhhc2UoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmKSB7Ci0JCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0KLQkJCUJvb2xlYW4gYmwgPSBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JCQlTdHJpbmcgdHlwZSA9IEJyaWRnZUhlbHBlci5nZXRFQW5ub3RhdGlvblR5cGUoc2VsZiwKLQkJCQkJQnJpZGdlSGVscGVyLlVNQV9UWVBFKTsKLQkJCWlmIChCcmlkZ2VIZWxwZXIuVU1BX1BIQVNFLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpIHsKLQkJCQlyZXR1cm4gYmwuVFJVRTsKLQkJCX0KLQkJCXJldHVybiBibDsKLQkJCS8vCQkJdGhyb3cgbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbi5Ob0ltcGxFeGNlcHRpb24oCi0JCQkvLwkJCQkJIk5vIHVzZXIgamF2YSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBpbiAnZ2V0VW1hVHlwZV9QaGFzZScgb3BlcmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIEJvb2xlYW4gZ2V0VW1hVHlwZV9JdGVyYXRpb24oU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmKSB7Ci0JCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCQlCb29sZWFuIGJsID0gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQkJU3RyaW5nIHR5cGUgPSBCcmlkZ2VIZWxwZXIuZ2V0RUFubm90YXRpb25UeXBlKHNlbGYsCi0JCQkJCUJyaWRnZUhlbHBlci5VTUFfVFlQRSk7Ci0JCQlpZiAoQnJpZGdlSGVscGVyLlVNQV9JVEVSQVRJT04uZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgewotCQkJCXJldHVybiBibC5UUlVFOwotCQkJfQotCQkJcmV0dXJuIGJsOwotCQkJLy8JCQl0aHJvdyBuZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uLk5vSW1wbEV4Y2VwdGlvbigKLQkJCS8vCQkJCQkiTm8gdXNlciBqYXZhIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGluICdnZXRVbWFUeXBlX0l0ZXJhdGlvbicgb3BlcmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIEJvb2xlYW4gZ2V0VW1hVHlwZV9NaWxlc3RvbmUoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIHNlbGYpIHsKLQkJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQotCQkJQm9vbGVhbiBibCA9IG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJCVN0cmluZyB0eXBlID0gQnJpZGdlSGVscGVyLmdldEVBbm5vdGF0aW9uVHlwZShzZWxmLAotCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX1RZUEUpOwotCQkJaWYgKEJyaWRnZUhlbHBlci5VTUFfTUlMRVNUT05FLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpIHsKLQkJCQlyZXR1cm4gYmwuVFJVRTsKLQkJCX0KLQkJCXJldHVybiBibDsKLQkJCS8vCQkJdGhyb3cgbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbi5Ob0ltcGxFeGNlcHRpb24oCi0JCQkvLwkJCQkJIk5vIHVzZXIgamF2YSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBpbiAnZ2V0VW1hVHlwZV9NaWxlc3RvbmUnIG9wZXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0vLyBKYXZhTWF0Y2hlcnMKLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MQWJzdHJhY3RQYXJzZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MQWJzdHJhY3RQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUzMTg0Mi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcHJvdmlkZXJzL1VNTEFic3RyYWN0UGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5QYXJzZVBvc2l0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bUxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5FUEZEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLlNldFZhbHVlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlNldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFVNTEFic3RyYWN0UGFyc2VyIGltcGxlbWVudHMgSVBhcnNlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdmlld1BhdHRlcm47Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNZXNzYWdlRm9ybWF0IHZpZXdQcm9jZXNzb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZWRpdFBhdHRlcm47Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNZXNzYWdlRm9ybWF0IGVkaXRQcm9jZXNzb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWaWV3UGF0dGVybigpIHsKLQkJcmV0dXJuIHZpZXdQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBnZXRWaWV3UHJvY2Vzc29yKCkgewotCQlyZXR1cm4gdmlld1Byb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vmlld1BhdHRlcm4oU3RyaW5nIHZpZXdQYXR0ZXJuKSB7Ci0JCXRoaXMudmlld1BhdHRlcm4gPSB2aWV3UGF0dGVybjsKLQkJdmlld1Byb2Nlc3NvciA9IGNyZWF0ZVZpZXdQcm9jZXNzb3Iodmlld1BhdHRlcm4pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBjcmVhdGVWaWV3UHJvY2Vzc29yKFN0cmluZyB2aWV3UGF0dGVybikgewotCQlyZXR1cm4gbmV3IE1lc3NhZ2VGb3JtYXQodmlld1BhdHRlcm4pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRQYXR0ZXJuKCkgewotCQlyZXR1cm4gZWRpdFBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGdldEVkaXRQcm9jZXNzb3IoKSB7Ci0JCXJldHVybiBlZGl0UHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0UGF0dGVybihTdHJpbmcgZWRpdFBhdHRlcm4pIHsKLQkJdGhpcy5lZGl0UGF0dGVybiA9IGVkaXRQYXR0ZXJuOwotCQllZGl0UHJvY2Vzc29yID0gY3JlYXRlRWRpdFByb2Nlc3NvcihlZGl0UGF0dGVybik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGNyZWF0ZUVkaXRQcm9jZXNzb3IoU3RyaW5nIGVkaXRQYXR0ZXJuKSB7Ci0JCXJldHVybiBuZXcgTWVzc2FnZUZvcm1hdChlZGl0UGF0dGVybik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbnRTdHJpbmcoSUFkYXB0YWJsZSBhZGFwdGVyLCBpbnQgZmxhZ3MpIHsKLQkJcmV0dXJuIGdldFN0cmluZ0J5UGF0dGVybihhZGFwdGVyLCBmbGFncywgZ2V0Vmlld1BhdHRlcm4oKSwKLQkJCQlnZXRWaWV3UHJvY2Vzc29yKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRTdHJpbmcoSUFkYXB0YWJsZSBhZGFwdGVyLCBpbnQgZmxhZ3MpIHsKLQkJcmV0dXJuIGdldFN0cmluZ0J5UGF0dGVybihhZGFwdGVyLCBmbGFncywgZ2V0RWRpdFBhdHRlcm4oKSwKLQkJCQlnZXRFZGl0UHJvY2Vzc29yKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFN0cmluZ0J5UGF0dGVybihJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncywKLQkJCVN0cmluZyBwYXR0ZXJuLCBNZXNzYWdlRm9ybWF0IHByb2Nlc3Nvcik7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXJFZGl0U3RhdHVzIGlzVmFsaWRFZGl0U3RyaW5nKElBZGFwdGFibGUgZWxlbWVudCwKLQkJCVN0cmluZyBlZGl0U3RyaW5nKSB7Ci0JCVBhcnNlUG9zaXRpb24gcG9zID0gbmV3IFBhcnNlUG9zaXRpb24oMCk7Ci0JCU9iamVjdFtdIHZhbHVlcyA9IGdldEVkaXRQcm9jZXNzb3IoKS5wYXJzZShlZGl0U3RyaW5nLCBwb3MpOwotCQlpZiAodmFsdWVzID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgUGFyc2VyRWRpdFN0YXR1cyhFUEZEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQlJUGFyc2VyRWRpdFN0YXR1cy5VTkVESVRBQkxFLCAiSW52YWxpZCBpbnB1dCBhdCAiCi0JCQkJCQkJKyBwb3MuZ2V0RXJyb3JJbmRleCgpKTsKLQkJfQotCQlyZXR1cm4gdmFsaWRhdGVOZXdWYWx1ZXModmFsdWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXJFZGl0U3RhdHVzIHZhbGlkYXRlTmV3VmFsdWVzKE9iamVjdFtdIHZhbHVlcykgewotCQlyZXR1cm4gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRV9TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29tbWFuZCBnZXRQYXJzZUNvbW1hbmQoSUFkYXB0YWJsZSBhZGFwdGVyLCBTdHJpbmcgbmV3U3RyaW5nLAotCQkJaW50IGZsYWdzKSB7Ci0JCU9iamVjdFtdIHZhbHVlcyA9IGdldEVkaXRQcm9jZXNzb3IoKS5wYXJzZShuZXdTdHJpbmcsCi0JCQkJbmV3IFBhcnNlUG9zaXRpb24oMCkpOwotCQlpZiAodmFsdWVzID09IG51bGwKLQkJCQl8fCB2YWxpZGF0ZU5ld1ZhbHVlcyh2YWx1ZXMpLmdldENvZGUoKSAhPSBJUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlQ29tbWFuZChhZGFwdGVyLCB2YWx1ZXMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUNvbW1hbmQgZ2V0UGFyc2VDb21tYW5kKElBZGFwdGFibGUgYWRhcHRlciwKLQkJCU9iamVjdFtdIHZhbHVlcyk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoSUFkYXB0YWJsZSBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0TW9kaWZpY2F0aW9uQ29tbWFuZChFT2JqZWN0IGVsZW1lbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXZhbHVlID0gZ2V0VmFsaWROZXdWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludmFsaWRWYWx1ZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJU2V0UmVxdWVzdCByZXF1ZXN0ID0gbmV3IFNldFJlcXVlc3QoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWUpOwotCQlyZXR1cm4gbmV3IFNldFZhbHVlQ29tbWFuZChyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRWYWxpZFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJRUNsYXNzaWZpZXIgdHlwZSA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBFRGF0YVR5cGUpIHsKLQkJCUNsYXNzIGlDbGFzcyA9IHR5cGUuZ2V0SW5zdGFuY2VDbGFzcygpOwotCQkJaWYgKFN0cmluZy5jbGFzcy5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbGlkTmV3VmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlFQ2xhc3NpZmllciB0eXBlID0gZmVhdHVyZS5nZXRFVHlwZSgpOwotCQlpZiAodHlwZSBpbnN0YW5jZW9mIEVEYXRhVHlwZSkgewotCQkJQ2xhc3MgaUNsYXNzID0gdHlwZS5nZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCQlpZiAoQm9vbGVhbi5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJdmFsdWUgPSBCb29sZWFuLnZhbHVlT2YoKFN0cmluZykgdmFsdWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkiVmFsdWUgb2YgdHlwZSBCb29sZWFuIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChDaGFyYWN0ZXIuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdmFsdWUgPSBuZXcgQ2hhcmFjdGVyKHMuY2hhckF0KDApKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkiVmFsdWUgb2YgdHlwZSBDaGFyYWN0ZXIgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKEJ5dGUuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEJ5dGUpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IEJ5dGUoKChOdW1iZXIpIHZhbHVlKS5ieXRlVmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gQnl0ZS52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBCeXRlIHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgQnl0ZSBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoU2hvcnQuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFNob3J0KSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBTaG9ydCgoKE51bWJlcikgdmFsdWUpLnNob3J0VmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gU2hvcnQudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gU2hvcnQgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBTaG9ydCBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoSW50ZWdlci5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW50ZWdlcigoKE51bWJlcikgdmFsdWUpLmludFZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IEludGVnZXIudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gSW50ZWdlciB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCSJWYWx1ZSBvZiB0eXBlIEludGVnZXIgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKExvbmcuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIExvbmcpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IExvbmcoKChOdW1iZXIpIHZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gTG9uZy52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBMb25nIHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgTG9uZyBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoRmxvYXQuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEZsb2F0KSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBGbG9hdCgoKE51bWJlcikgdmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gRmxvYXQudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gRmxvYXQgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBGbG9hdCBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoRG91YmxlLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBEb3VibGUpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IERvdWJsZSgoKE51bWJlcikgdmFsdWUpLmRvdWJsZVZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IERvdWJsZS52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBEb3VibGUgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBEb3VibGUgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBFRW51bSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlFRW51bUxpdGVyYWwgbGl0ZXJhbCA9ICgoRUVudW0pIHR5cGUpCi0JCQkJCQkJLmdldEVFbnVtTGl0ZXJhbEJ5TGl0ZXJhbCgoU3RyaW5nKSB2YWx1ZSk7Ci0JCQkJCWlmIChsaXRlcmFsID09IG51bGwpIHsKLQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVW5rbm93biBsaXRlcmFsOiAiICsgdmFsdWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdmFsdWUgPSBsaXRlcmFsLmdldEluc3RhbmNlKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgU3RyaW5nIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEludmFsaWRWYWx1ZSB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLQkJcHVibGljIEludmFsaWRWYWx1ZShTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcHJvdmlkZXJzL1VNTEVkaXRQYXJ0UHJvdmlkZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MRWRpdFBhcnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmI1ODJiLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MRWRpdFBhcnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuQWJzdHJhY3RFZGl0UGFydFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuQ3JlYXRlR3JhcGhpY0VkaXRQYXJ0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuSUVkaXRQYXJ0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuVU1MRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTEVkaXRQYXJ0UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEVkaXRQYXJ0UHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWRpdFBhcnRGYWN0b3J5IGZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGFsbG93Q2FjaGluZzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdlYWtSZWZlcmVuY2UgY2FjaGVkUGFydDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdlYWtSZWZlcmVuY2UgY2FjaGVkVmlldzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVU1MRWRpdFBhcnRQcm92aWRlcigpIHsKLQkJc2V0RmFjdG9yeShuZXcgVU1MRWRpdFBhcnRGYWN0b3J5KCkpOwotCQlzZXRBbGxvd0NhY2hpbmcodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmaW5hbCBFZGl0UGFydEZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZhY3RvcnkoRWRpdFBhcnRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNBbGxvd0NhY2hpbmcoKSB7Ci0JCXJldHVybiBhbGxvd0NhY2hpbmc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBzZXRBbGxvd0NhY2hpbmcoYm9vbGVhbiBhbGxvd0NhY2hpbmcpIHsKLQkJdGhpcy5hbGxvd0NhY2hpbmcgPSBhbGxvd0NhY2hpbmc7Ci0JCWlmICghYWxsb3dDYWNoaW5nKSB7Ci0JCQljYWNoZWRQYXJ0ID0gbnVsbDsKLQkJCWNhY2hlZFZpZXcgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJR3JhcGhpY2FsRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCUVkaXRQYXJ0IHBhcnQgPSBmYWN0b3J5LmNyZWF0ZUVkaXRQYXJ0KG51bGwsIHZpZXcpOwotCQlpZiAocGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCkgewotCQkJcmV0dXJuIChJR3JhcGhpY2FsRWRpdFBhcnQpIHBhcnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2FjaGVkUGFydChWaWV3IHZpZXcpIHsKLQkJaWYgKGNhY2hlZFZpZXcgIT0gbnVsbCAmJiBjYWNoZWRWaWV3LmdldCgpID09IHZpZXcpIHsKLQkJCXJldHVybiAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBjYWNoZWRQYXJ0LmdldCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElHcmFwaGljYWxFZGl0UGFydCBjcmVhdGVHcmFwaGljRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCWlmIChpc0FsbG93Q2FjaGluZygpKSB7Ci0JCQlJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IGdldENhY2hlZFBhcnQodmlldyk7Ci0JCQljYWNoZWRQYXJ0ID0gbnVsbDsKLQkJCWNhY2hlZFZpZXcgPSBudWxsOwotCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCXJldHVybiBwYXJ0OwotCQkJfQotCQl9Ci0JCXJldHVybiBjcmVhdGVFZGl0UGFydCh2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBDcmVhdGVHcmFwaGljRWRpdFBhcnRPcGVyYXRpb24pIHsKLQkJCVZpZXcgdmlldyA9ICgoSUVkaXRQYXJ0T3BlcmF0aW9uKSBvcGVyYXRpb24pLmdldFZpZXcoKTsKLQkJCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0TW9kZWxJRCh2aWV3KSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoaXNBbGxvd0NhY2hpbmcoKSAmJiBnZXRDYWNoZWRQYXJ0KHZpZXcpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCUlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gY3JlYXRlRWRpdFBhcnQodmlldyk7Ci0JCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJaWYgKGlzQWxsb3dDYWNoaW5nKCkpIHsKLQkJCQkJY2FjaGVkUGFydCA9IG5ldyBXZWFrUmVmZXJlbmNlKHBhcnQpOwotCQkJCQljYWNoZWRWaWV3ID0gbmV3IFdlYWtSZWZlcmVuY2Uodmlldyk7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3Byb3ZpZGVycy9VTUxFbGVtZW50VHlwZXMuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MRWxlbWVudFR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MWIyMGMuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3Byb3ZpZGVycy9VTUxFbGVtZW50VHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5leHByZXNzaW9ucy5VTUxBYnN0cmFjdEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuRVBGRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLkVsZW1lbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MRWxlbWVudFR5cGVzIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFVNTEVsZW1lbnRUeXBlcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IGdldEltYWdlUmVnaXN0cnkoKSB7Ci0JCWlmIChpbWFnZVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCWltYWdlUmVnaXN0cnkgPSBuZXcgSW1hZ2VSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBpbWFnZVJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SW1hZ2VSZWdpc3RyeUtleShFTmFtZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0UHJvdmlkZWRJbWFnZURlc2NyaXB0b3IoCi0JCQlFTmFtZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFU3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJCWVsZW1lbnQgPSAoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZWxlbWVudCkuZ2V0RUNvbnRhaW5pbmdDbGFzcygpOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcykgZWxlbWVudDsKLQkJCWlmICghZUNsYXNzLmlzQWJzdHJhY3QoKSkgewotCQkJCXJldHVybiBFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJdGVtSW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJCQllQ2xhc3MuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkKLQkJCQkJCQkJCQkuY3JlYXRlKGVDbGFzcykpOwotCQkJfQotCQl9Ci0JCS8vIFRPRE8gOiBzdXBwb3J0IHN0cnVjdHVyYWwgZmVhdHVyZXMKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihFTmFtZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGtleSA9IGdldEltYWdlUmVnaXN0cnlLZXkoZWxlbWVudCk7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0RGVzY3JpcHRvcihrZXkpOwotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IGdldFByb3ZpZGVkSW1hZ2VEZXNjcmlwdG9yKGVsZW1lbnQpOwotCQkJaWYgKGltYWdlRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCX0KLQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQoa2V5LCBpbWFnZURlc2NyaXB0b3IpOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoRU5hbWVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBrZXkgPSBnZXRJbWFnZVJlZ2lzdHJ5S2V5KGVsZW1lbnQpOwotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsKLQotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCi0JCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yICA9IGdldFByb3ZpZGVkSW1hZ2VEZXNjcmlwdG9yKGVsZW1lbnQpOwotCQkJaWYgKGltYWdlRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCX0KLQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQoa2V5LCBpbWFnZURlc2NyaXB0b3IpOwotCQkJaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoSUFkYXB0YWJsZSBoaW50KSB7Ci0JCUVOYW1lZEVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoaGludCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRJbWFnZURlc2NyaXB0b3IoZWxlbWVudCk7Ci0JfQotCi0JCi0JLyoqCi0JICogQGN1c3RvbQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoRU5hbWVkRWxlbWVudCBlbGVtZW50LCBJRWxlbWVudFR5cGUgdHlwZSkgewotCQlTdHJpbmcga2V5ID0gdHlwZS5nZXRJZCgpOwotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsKLQotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0JCQlpZihrZXkuZXF1YWxzKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNy5nZXRJZCgpKSl7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmKGtleS5lcXVhbHMoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwLmdldElkKCkpKXsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL29iajE2L1BoYXNlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQl9ZWxzZSBpZihrZXkuZXF1YWxzKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMS5nZXRJZCgpKSl7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC9vYmoxNi9JdGVyYXRpb24uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCX1lbHNlIGlmKGtleS5lcXVhbHMoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIuZ2V0SWQoKSkpewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvb2JqMTYvTWlsZXN0b25lLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQl9ZWxzZSBpZihrZXkuZXF1YWxzKEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5LmdldElkKCkpKXsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZihpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCl7Ci0JCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChrZXksIGltYWdlRGVzY3JpcHRvcik7Ci0JCQkJaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKElBZGFwdGFibGUgaGludCkgewotCQlFTmFtZWRFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KGhpbnQpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlPYmplY3QgdHlwZSA9IGhpbnQuZ2V0QWRhcHRlcihJRWxlbWVudFR5cGUuY2xhc3MpOwotCQlpZih0eXBlICE9IG51bGwpewotCQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZShlbGVtZW50LCAoSUVsZW1lbnRUeXBlKXR5cGUpOwotCQkJaWYoaW1hZ2UgIT0gbnVsbCl7Ci0JCQkJcmV0dXJuIGltYWdlOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRJbWFnZShlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zICd0eXBlJyBvZiB0aGUgZWNvcmUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgaGludC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFTmFtZWRFbGVtZW50IGdldEVsZW1lbnQoSUFkYXB0YWJsZSBoaW50KSB7Ci0JCU9iamVjdCB0eXBlID0gaGludC5nZXRBZGFwdGVyKElFbGVtZW50VHlwZS5jbGFzcyk7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQllbGVtZW50cyA9IG5ldyBJZGVudGl0eUhhc2hNYXAoKTsKLQkJCWVsZW1lbnRzLnB1dChBY3Rpdml0eV83OSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKSk7Ci0JCQllbGVtZW50cy5wdXQoQWN0aXZpdHlQYXJ0aXRpb25fMjAwMSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEFjdGl2aXR5UGFydGl0aW9uKCkpOwotCQkJZWxlbWVudHMucHV0KEFjdGl2aXR5RmluYWxOb2RlXzEwMDEsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBY3Rpdml0eUZpbmFsTm9kZSgpKTsKLQkJCWVsZW1lbnRzLnB1dChNZXJnZU5vZGVfMTAwMiwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVyZ2VOb2RlKCkpOwotCQkJZWxlbWVudHMucHV0KEZvcmtOb2RlXzEwMDMsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEZvcmtOb2RlKCkpOwotCQkJZWxlbWVudHMucHV0KEluaXRpYWxOb2RlXzEwMDQsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRJbml0aWFsTm9kZSgpKTsKLQkJCWVsZW1lbnRzLnB1dChEZWNpc2lvbk5vZGVfMTAwNSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldERlY2lzaW9uTm9kZSgpKTsKLQkJCWVsZW1lbnRzLnB1dChKb2luTm9kZV8xMDA2LCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRKb2luTm9kZSgpKTsKLQkJCWVsZW1lbnRzLnB1dChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpOwotCQkJZWxlbWVudHMucHV0KEFjdGl2aXR5UGFydGl0aW9uXzEwMDgsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBY3Rpdml0eVBhcnRpdGlvbigpKTsKLQkJCWVsZW1lbnRzLnB1dChBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEFjdGl2aXR5UGFyYW1ldGVyTm9kZSgpKTsKLQkJCWVsZW1lbnRzLnB1dChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpOwotCQkJZWxlbWVudHMucHV0KFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSk7Ci0JCQllbGVtZW50cy5wdXQoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBY3Rpdml0eVBhcmFtZXRlck5vZGUoKSk7Ci0JCQllbGVtZW50cy5wdXQoQ29udHJvbEZsb3dfMzAwMSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRyb2xGbG93KCkpOwotCQl9Ci0JCXJldHVybiAoRU5hbWVkRWxlbWVudCkgZWxlbWVudHMuZ2V0KHR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBBY3Rpdml0eV83OSA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuQWN0aXZpdHlfNzkiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIEFjdGl2aXR5UGFydGl0aW9uXzIwMDEgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIEFjdGl2aXR5RmluYWxOb2RlXzEwMDEgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkFjdGl2aXR5RmluYWxOb2RlXzEwMDEiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIE1lcmdlTm9kZV8xMDAyID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5NZXJnZU5vZGVfMTAwMiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgRm9ya05vZGVfMTAwMyA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuRm9ya05vZGVfMTAwMyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgSW5pdGlhbE5vZGVfMTAwNCA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuSW5pdGlhbE5vZGVfMTAwNCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgRGVjaXNpb25Ob2RlXzEwMDUgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkRlY2lzaW9uTm9kZV8xMDA1Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBKb2luTm9kZV8xMDA2ID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5Kb2luTm9kZV8xMDA2Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQ29udHJvbEZsb3dfMzAwMSA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuQ29udHJvbEZsb3dfMzAwMSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSUVsZW1lbnRUeXBlIGdldEVsZW1lbnRUeXBlKFN0cmluZyBpZCkgewotCQlyZXR1cm4gRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFR5cGUoaWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTZXQgS05PV05fRUxFTUVOVF9UWVBFUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNLbm93bkVsZW1lbnRUeXBlKElFbGVtZW50VHlwZSBlbGVtZW50VHlwZSkgewotCQlpZiAoS05PV05fRUxFTUVOVF9UWVBFUyA9PSBudWxsKSB7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTID0gbmV3IEhhc2hTZXQoKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKEFjdGl2aXR5Xzc5KTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKEFjdGl2aXR5UGFydGl0aW9uXzIwMDEpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChNZXJnZU5vZGVfMTAwMik7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChGb3JrTm9kZV8xMDAzKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKEluaXRpYWxOb2RlXzEwMDQpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoRGVjaXNpb25Ob2RlXzEwMDUpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoSm9pbk5vZGVfMTAwNik7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTApOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKENvbnRyb2xGbG93XzMwMDEpOwotCQl9Ci0JCXJldHVybiBLTk9XTl9FTEVNRU5UX1RZUEVTLmNvbnRhaW5zKGVsZW1lbnRUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBJbml0aWFsaXplcnMgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdEluaXRpYWxpemVyIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyA9IG5ldyBPYmplY3RJbml0aWFsaXplcigKLQkJCQluZXcgRmVhdHVyZUluaXRpYWxpemVyW10geyBuZXcgRmVhdHVyZUluaXRpYWxpemVyKAotCQkJCQkJbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKSB7Ci0JCQkJCQkJcHJvdGVjdGVkIE9iamVjdCBkb0V2YWx1YXRlKE9iamVjdCBjb250ZXh0LCBNYXAgZW52KSB7Ci0JCQkJCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgc2VsZiA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBjb250ZXh0OwotCQkJCQkJCQlyZXR1cm4gSmF2YS5jcmVhdGVVbWFUeXBlX0FjdGl2aXR5KHNlbGYpOwotCQkJCQkJCX0KLQkJCQkJCX0sIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEVNb2RlbEVsZW1lbnRfRUFubm90YXRpb25zKCkpIH0pOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdEluaXRpYWxpemVyIEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5ID0gbmV3IE9iamVjdEluaXRpYWxpemVyKAotCQkJCW5ldyBGZWF0dXJlSW5pdGlhbGl6ZXJbXSB7IG5ldyBGZWF0dXJlSW5pdGlhbGl6ZXIoCi0JCQkJCQluZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRBY3Rpdml0eVBhcmFtZXRlck5vZGUoKSkgewotCQkJCQkJCXByb3RlY3RlZCBPYmplY3QgZG9FdmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudikgewotCQkJCQkJCQlBY3Rpdml0eVBhcmFtZXRlck5vZGUgc2VsZiA9IChBY3Rpdml0eVBhcmFtZXRlck5vZGUpIGNvbnRleHQ7Ci0JCQkJCQkJCXJldHVybiBKYXZhLmNyZWF0ZVVtYVR5cGVfVGFza0Rlc2NyaXB0b3Ioc2VsZik7Ci0JCQkJCQkJfQotCQkJCQkJfSwgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RU1vZGVsRWxlbWVudF9FQW5ub3RhdGlvbnMoKSkgfSk7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SW5pdGlhbGl6ZXIgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwID0gbmV3IE9iamVjdEluaXRpYWxpemVyKAotCQkJCW5ldyBGZWF0dXJlSW5pdGlhbGl6ZXJbXSB7IG5ldyBGZWF0dXJlSW5pdGlhbGl6ZXIoCi0JCQkJCQluZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpIHsKLQkJCQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGNvbnRleHQ7Ci0JCQkJCQkJCXJldHVybiBKYXZhLmNyZWF0ZVVtYVR5cGVfUGhhc2Uoc2VsZik7Ci0JCQkJCQkJfQotCQkJCQkJfSwgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RU1vZGVsRWxlbWVudF9FQW5ub3RhdGlvbnMoKSkgfSk7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SW5pdGlhbGl6ZXIgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExID0gbmV3IE9iamVjdEluaXRpYWxpemVyKAotCQkJCW5ldyBGZWF0dXJlSW5pdGlhbGl6ZXJbXSB7IG5ldyBGZWF0dXJlSW5pdGlhbGl6ZXIoCi0JCQkJCQluZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpIHsKLQkJCQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGNvbnRleHQ7Ci0JCQkJCQkJCXJldHVybiBKYXZhLmNyZWF0ZVVtYVR5cGVfSXRlcmF0aW9uKHNlbGYpOwotCQkJCQkJCX0KLQkJCQkJCX0sIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEVNb2RlbEVsZW1lbnRfRUFubm90YXRpb25zKCkpIH0pOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdEluaXRpYWxpemVyIEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyID0gbmV3IE9iamVjdEluaXRpYWxpemVyKAotCQkJCW5ldyBGZWF0dXJlSW5pdGlhbGl6ZXJbXSB7IG5ldyBGZWF0dXJlSW5pdGlhbGl6ZXIoCi0JCQkJCQluZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRBY3Rpdml0eVBhcmFtZXRlck5vZGUoKSkgewotCQkJCQkJCXByb3RlY3RlZCBPYmplY3QgZG9FdmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudikgewotCQkJCQkJCQlBY3Rpdml0eVBhcmFtZXRlck5vZGUgc2VsZiA9IChBY3Rpdml0eVBhcmFtZXRlck5vZGUpIGNvbnRleHQ7Ci0JCQkJCQkJCXJldHVybiBKYXZhLmNyZWF0ZVVtYVR5cGVfTWlsZXN0b25lKHNlbGYpOwotCQkJCQkJCX0KLQkJCQkJCX0sIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEVNb2RlbEVsZW1lbnRfRUFubm90YXRpb25zKCkpIH0pOwotCi0JCS8qKiAKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBJbml0aWFsaXplcnMoKSB7Ci0JCX0KLQotCQkvKiogCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgY2xhc3MgT2JqZWN0SW5pdGlhbGl6ZXIgewotCQkJLyoqIAotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwcml2YXRlIEZlYXR1cmVJbml0aWFsaXplcltdIGluaXRFeHByZXNzaW9uczsKLQotCQkJLyoqIAotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlPYmplY3RJbml0aWFsaXplcihGZWF0dXJlSW5pdGlhbGl6ZXJbXSBpbml0RXhwcmVzc2lvbnMpIHsKLQkJCQl0aGlzLmluaXRFeHByZXNzaW9ucyA9IGluaXRFeHByZXNzaW9uczsKLQkJCX0KLQotCQkJLyoqIAotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBpbml0KEVPYmplY3QgaW5zdGFuY2UpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluaXRFeHByZXNzaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlGZWF0dXJlSW5pdGlhbGl6ZXIgbmV4dEV4cHIgPSBpbml0RXhwcmVzc2lvbnNbaV07Ci0JCQkJCXRyeSB7Ci0JCQkJCQluZXh0RXhwci5pbml0KGluc3RhbmNlKTsKLQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlFUEZEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkJCSJGZWF0dXJlIGluaXRpYWxpemF0aW9uIGZhaWxlZCIsIGUpOyAvLyROT04tTkxTLTEkCQkJCQkJCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gLy8gZW5kIG9mIE9iamVjdEluaXRpYWxpemVyCi0KLQkJLyoqIAotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlzdGF0aWMgY2xhc3MgRmVhdHVyZUluaXRpYWxpemVyIHsKLQotCQkJLyoqIAotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzRmVhdHVyZTsKLQotCQkJLyoqIAotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwcml2YXRlIFVNTEFic3RyYWN0RXhwcmVzc2lvbiBleHByZXNzaW9uOwotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJRmVhdHVyZUluaXRpYWxpemVyKFVNTEFic3RyYWN0RXhwcmVzc2lvbiBleHByZXNzaW9uLAotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgc0ZlYXR1cmUpIHsKLQkJCQl0aGlzLnNGZWF0dXJlID0gc0ZlYXR1cmU7Ci0JCQkJdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKLQkJCX0KLQotCQkJLyoqIAotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQl2b2lkIGluaXQoRU9iamVjdCBjb250ZXh0SW5zdGFuY2UpIHsKLQkJCQlleHByZXNzaW9uLmFzc2lnblRvKHNGZWF0dXJlLCBjb250ZXh0SW5zdGFuY2UpOwotCQkJfQotCQl9IC8vIGVuZCBvZiBGZWF0dXJlSW5pdGlhbGl6ZXIKLQotCQkvKiogCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXN0YXRpYyBjbGFzcyBKYXZhIHsKLQotCQkJLyoqCi0JCQkgKiBAbW9kaWZpZWQKLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgRUxpc3QgY3JlYXRlVW1hVHlwZV9QaGFzZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHNlbGYpIHsKLQkJCQlyZXR1cm4gQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uVHlwZShzZWxmLAotCQkJCQkJQnJpZGdlSGVscGVyLlVNQV9QSEFTRSk7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQG1vZGlmaWVkCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIEVMaXN0IGNyZWF0ZVVtYVR5cGVfTWlsZXN0b25lKAotCQkJCQlBY3Rpdml0eVBhcmFtZXRlck5vZGUgc2VsZikgewotCQkJCXJldHVybiBCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb25UeXBlKHNlbGYsCi0JCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX01JTEVTVE9ORSk7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQG1vZGlmaWVkCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIEVMaXN0IGNyZWF0ZVVtYVR5cGVfQWN0aXZpdHkoCi0JCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgc2VsZikgewotCQkJCXJldHVybiBCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb25UeXBlKHNlbGYsCi0JCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX0FDVElWSVRZKTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAbW9kaWZpZWQKLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgRUxpc3QgY3JlYXRlVW1hVHlwZV9UYXNrRGVzY3JpcHRvcigKLQkJCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIHNlbGYpIHsKLQkJCQlyZXR1cm4gQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uVHlwZShzZWxmLAotCQkJCQkJQnJpZGdlSGVscGVyLlVNQV9UQVNLX0RFU0NSSVBUT1IpOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBtb2RpZmllZAotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBFTGlzdCBjcmVhdGVVbWFUeXBlX0l0ZXJhdGlvbigKLQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmKSB7Ci0JCQkJcmV0dXJuIEJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvblR5cGUoc2VsZiwKLQkJCQkJCUJyaWRnZUhlbHBlci5VTUFfSVRFUkFUSU9OKTsKLQkJCX0KLQkJfSAvL0phdmEKLQl9IC8vIGVuZCBvZiBJbml0aWFsaXplcnMKLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MSWNvblByb3ZpZGVyLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcHJvdmlkZXJzL1VNTEljb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTc4NzFkLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MSWNvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5BYnN0cmFjdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuaWNvbi5HZXRJY29uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5pY29uLklJY29uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTEljb25Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0UHJvdmlkZXIgaW1wbGVtZW50cyBJSWNvblByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SWNvbihJQWRhcHRhYmxlIGhpbnQsIGludCBmbGFncykgewotCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLmdldEltYWdlKGhpbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlcyhJT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgR2V0SWNvbk9wZXJhdGlvbikgewotCQkJcmV0dXJuICgoR2V0SWNvbk9wZXJhdGlvbikgb3BlcmF0aW9uKS5leGVjdXRlKHRoaXMpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlci5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3Byb3ZpZGVycy9VTUxNb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YmE0N2YuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3Byb3ZpZGVycy9VTUxNb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuRWxlbWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMubW9kZWxpbmdhc3Npc3RhbnQuTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2c7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlciBleHRlbmRzIE1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFR5cGVzRm9yUG9wdXBCYXIoSUFkYXB0YWJsZSBob3N0KSB7Ci0JCUlHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpIGhvc3QKLQkJCQkuZ2V0QWRhcHRlcihJR3JhcGhpY2FsRWRpdFBhcnQuY2xhc3MpOwotCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQpIHsKLQkJCUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEpOwotCQkJcmV0dXJuIHR5cGVzOwotCQl9Ci0JCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQpIHsKLQkJCUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEpOwotCQkJcmV0dXJuIHR5cGVzOwotCQl9Ci0JCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5RWRpdFBhcnQpIHsKLQkJCUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5RmluYWxOb2RlXzEwMDEpOwotCQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5NZXJnZU5vZGVfMTAwMik7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkZvcmtOb2RlXzEwMDMpOwotCQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsTm9kZV8xMDA0KTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuRGVjaXNpb25Ob2RlXzEwMDUpOwotCQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5Kb2luTm9kZV8xMDA2KTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3KTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCk7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5KTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwKTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExKTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIpOwotCQkJcmV0dXJuIHR5cGVzOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWxUeXBlc09uU291cmNlKElBZGFwdGFibGUgc291cmNlKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWxUeXBlc09uVGFyZ2V0KElBZGFwdGFibGUgdGFyZ2V0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWxUeXBlc09uU291cmNlQW5kVGFyZ2V0KElBZGFwdGFibGUgc291cmNlLAotCQkJSUFkYXB0YWJsZSB0YXJnZXQpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFR5cGVzRm9yU291cmNlKElBZGFwdGFibGUgdGFyZ2V0LAotCQkJSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFR5cGVzRm9yVGFyZ2V0KElBZGFwdGFibGUgc291cmNlLAotCQkJSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IHNlbGVjdEV4aXN0aW5nRWxlbWVudEZvclNvdXJjZShJQWRhcHRhYmxlIHRhcmdldCwKLQkJCUlFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7Ci0JCXJldHVybiBzZWxlY3RFeGlzdGluZ0VsZW1lbnQodGFyZ2V0LCBnZXRUeXBlc0ZvclNvdXJjZSh0YXJnZXQsCi0JCQkJcmVsYXRpb25zaGlwVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBzZWxlY3RFeGlzdGluZ0VsZW1lbnRGb3JUYXJnZXQoSUFkYXB0YWJsZSBzb3VyY2UsCi0JCQlJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewotCQlyZXR1cm4gc2VsZWN0RXhpc3RpbmdFbGVtZW50KHNvdXJjZSwgZ2V0VHlwZXNGb3JUYXJnZXQoc291cmNlLAotCQkJCXJlbGF0aW9uc2hpcFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3Qgc2VsZWN0RXhpc3RpbmdFbGVtZW50KElBZGFwdGFibGUgaG9zdCwgQ29sbGVjdGlvbiB0eXBlcykgewotCQlpZiAodHlwZXMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBob3N0Ci0JCQkJLmdldEFkYXB0ZXIoSUdyYXBoaWNhbEVkaXRQYXJ0LmNsYXNzKTsKLQkJaWYgKGVkaXRQYXJ0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRSb290KCkuZ2V0Q29udGVudHMoKS5nZXRNb2RlbCgpOwotCQlDb2xsZWN0aW9uIGVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJaWYgKGlzQXBwbGljYWJsZUVsZW1lbnQoZWxlbWVudCwgdHlwZXMpKSB7Ci0JCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWlmIChlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBzZWxlY3RFbGVtZW50KChFT2JqZWN0W10pIGVsZW1lbnRzLnRvQXJyYXkobmV3IEVPYmplY3RbZWxlbWVudHMKLQkJCQkuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FwcGxpY2FibGVFbGVtZW50KEVPYmplY3QgZWxlbWVudCwgQ29sbGVjdGlvbiB0eXBlcykgewotCQlJRWxlbWVudFR5cGUgdHlwZSA9IEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50VHlwZSgKLQkJCQllbGVtZW50KTsKLQkJcmV0dXJuIHR5cGVzLmNvbnRhaW5zKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBzZWxlY3RFbGVtZW50KEVPYmplY3RbXSBlbGVtZW50cykgewotCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCUVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpKTsKLQkJRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nKAotCQkJCXNoZWxsLCBsYWJlbFByb3ZpZGVyKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoIkF2YWlsYWJsZSBkb21haW4gbW9kZWwgZWxlbWVudHM6Iik7Ci0JCWRpYWxvZy5zZXRUaXRsZSgiU2VsZWN0IGRvbWFpbiBtb2RlbCBlbGVtZW50Iik7Ci0JCWRpYWxvZy5zZXRNdWx0aXBsZVNlbGVjdGlvbihmYWxzZSk7Ci0JCWRpYWxvZy5zZXRFbGVtZW50cyhlbGVtZW50cyk7Ci0JCUVPYmplY3Qgc2VsZWN0ZWQgPSBudWxsOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXNlbGVjdGVkID0gKEVPYmplY3QpIGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQl9Ci0JCXJldHVybiBzZWxlY3RlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcHJvdmlkZXJzL1VNTFBhbGV0dGVQcm92aWRlci5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3Byb3ZpZGVycy9VTUxQYWxldHRlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM4M2YwZS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcHJvdmlkZXJzL1VNTFBhbGV0dGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLkFic3RyYWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMucGFsZXR0ZS5JUGFsZXR0ZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFBhbGV0dGVGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFBhbGV0dGVQcm92aWRlciBleHRlbmRzIEFic3RyYWN0UHJvdmlkZXIgaW1wbGVtZW50cwotCQlJUGFsZXR0ZVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9QYWxldHRlKElFZGl0b3JQYXJ0IGVkaXRvciwgT2JqZWN0IGNvbnRlbnQsCi0JCQlQYWxldHRlUm9vdCByb290LCBNYXAgcHJlZGVmaW5lZEVudHJpZXMpIHsKLQkJVU1MUGFsZXR0ZUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBVTUxQYWxldHRlRmFjdG9yeSgpOwotCQlmYWN0b3J5LmZpbGxQYWxldHRlKHJvb3QpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250cmlidXRpb25zKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KSB7Ci0JCS8vIG5vIGNvbmZpZ3VyYXRpb24KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXMoSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJcmV0dXJuIGZhbHNlOyAvLyBhbGwgbG9naWMgaXMgZG9uZSBpbiB0aGUgc2VydmljZQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MUGFyc2VyUHJvdmlkZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MUGFyc2VyUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJjNjYxZi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcHJvdmlkZXJzL1VNTFBhcnNlclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5Db250cm9sRmxvd05hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuRm9ya05vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuSm9pbk5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLkFic3RyYWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuR2V0UGFyc2VyT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MUGFyc2VyUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSVBhcnNlclByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgYWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwNlBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0QWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwNlBhcnNlcigpIHsKLQkJaWYgKGFjdGl2aXR5UGFydGl0aW9uQWN0aXZpdHlQYXJ0aXRpb25OYW1lXzQwMDZQYXJzZXIgPT0gbnVsbCkgewotCQkJYWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwNlBhcnNlciA9IGNyZWF0ZUFjdGl2aXR5UGFydGl0aW9uQWN0aXZpdHlQYXJ0aXRpb25OYW1lXzQwMDZQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gYWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwNlBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlQWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwNlBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgKLQkJCQkJCSJuYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBhY3Rpdml0eUZpbmFsTm9kZUFjdGl2aXR5RmluYWxOb2RlTmFtZV80MDAxUGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRBY3Rpdml0eUZpbmFsTm9kZUFjdGl2aXR5RmluYWxOb2RlTmFtZV80MDAxUGFyc2VyKCkgewotCQlpZiAoYWN0aXZpdHlGaW5hbE5vZGVBY3Rpdml0eUZpbmFsTm9kZU5hbWVfNDAwMVBhcnNlciA9PSBudWxsKSB7Ci0JCQlhY3Rpdml0eUZpbmFsTm9kZUFjdGl2aXR5RmluYWxOb2RlTmFtZV80MDAxUGFyc2VyID0gY3JlYXRlQWN0aXZpdHlGaW5hbE5vZGVBY3Rpdml0eUZpbmFsTm9kZU5hbWVfNDAwMVBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBhY3Rpdml0eUZpbmFsTm9kZUFjdGl2aXR5RmluYWxOb2RlTmFtZV80MDAxUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVBY3Rpdml0eUZpbmFsTm9kZUFjdGl2aXR5RmluYWxOb2RlTmFtZV80MDAxUGFyc2VyKCkgewotCQlVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKAotCQkJCQkJIm5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIG1lcmdlTm9kZU1lcmdlTm9kZU5hbWVfNDAwMlBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0TWVyZ2VOb2RlTWVyZ2VOb2RlTmFtZV80MDAyUGFyc2VyKCkgewotCQlpZiAobWVyZ2VOb2RlTWVyZ2VOb2RlTmFtZV80MDAyUGFyc2VyID09IG51bGwpIHsKLQkJCW1lcmdlTm9kZU1lcmdlTm9kZU5hbWVfNDAwMlBhcnNlciA9IGNyZWF0ZU1lcmdlTm9kZU1lcmdlTm9kZU5hbWVfNDAwMlBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBtZXJnZU5vZGVNZXJnZU5vZGVOYW1lXzQwMDJQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZU1lcmdlTm9kZU1lcmdlTm9kZU5hbWVfNDAwMlBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgKLQkJCQkJCSJuYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBpbml0aWFsTm9kZUluaXRpYWxOb2RlTmFtZV80MDAzUGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRJbml0aWFsTm9kZUluaXRpYWxOb2RlTmFtZV80MDAzUGFyc2VyKCkgewotCQlpZiAoaW5pdGlhbE5vZGVJbml0aWFsTm9kZU5hbWVfNDAwM1BhcnNlciA9PSBudWxsKSB7Ci0JCQlpbml0aWFsTm9kZUluaXRpYWxOb2RlTmFtZV80MDAzUGFyc2VyID0gY3JlYXRlSW5pdGlhbE5vZGVJbml0aWFsTm9kZU5hbWVfNDAwM1BhcnNlcigpOwotCQl9Ci0JCXJldHVybiBpbml0aWFsTm9kZUluaXRpYWxOb2RlTmFtZV80MDAzUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVJbml0aWFsTm9kZUluaXRpYWxOb2RlTmFtZV80MDAzUGFyc2VyKCkgewotCQlVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKAotCQkJCQkJIm5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGRlY2lzaW9uTm9kZURlY2lzaW9uTm9kZU5hbWVfNDAwNFBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0RGVjaXNpb25Ob2RlRGVjaXNpb25Ob2RlTmFtZV80MDA0UGFyc2VyKCkgewotCQlpZiAoZGVjaXNpb25Ob2RlRGVjaXNpb25Ob2RlTmFtZV80MDA0UGFyc2VyID09IG51bGwpIHsKLQkJCWRlY2lzaW9uTm9kZURlY2lzaW9uTm9kZU5hbWVfNDAwNFBhcnNlciA9IGNyZWF0ZURlY2lzaW9uTm9kZURlY2lzaW9uTm9kZU5hbWVfNDAwNFBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBkZWNpc2lvbk5vZGVEZWNpc2lvbk5vZGVOYW1lXzQwMDRQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZURlY2lzaW9uTm9kZURlY2lzaW9uTm9kZU5hbWVfNDAwNFBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgKLQkJCQkJCSJuYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwNVBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMDVQYXJzZXIoKSB7Ci0JCWlmIChzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwNVBhcnNlciA9PSBudWxsKSB7Ci0JCQlzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwNVBhcnNlciA9IGNyZWF0ZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA1UGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA1UGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwNVBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgKLQkJCQkJCSJuYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBhY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA3UGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRBY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA3UGFyc2VyKCkgewotCQlpZiAoYWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwN1BhcnNlciA9PSBudWxsKSB7Ci0JCQlhY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA3UGFyc2VyID0gY3JlYXRlQWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwN1BhcnNlcigpOwotCQl9Ci0JCXJldHVybiBhY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA3UGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVBY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA3UGFyc2VyKCkgewotCQlVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKAotCQkJCQkJIm5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAwOFBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDA4UGFyc2VyKCkgewotCQlpZiAoYWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDA4UGFyc2VyID09IG51bGwpIHsKLQkJCWFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAwOFBhcnNlciA9IGNyZWF0ZUFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAwOFBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBhY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMDhQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZUFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAwOFBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgKLQkJCQkJCSJuYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwOVBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMDlQYXJzZXIoKSB7Ci0JCWlmIChzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwOVBhcnNlciA9PSBudWxsKSB7Ci0JCQlzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwOVBhcnNlciA9IGNyZWF0ZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA5UGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA5UGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwOVBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgKLQkJCQkJCSJuYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAxMFBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMTBQYXJzZXIoKSB7Ci0JCWlmIChzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAxMFBhcnNlciA9PSBudWxsKSB7Ci0JCQlzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAxMFBhcnNlciA9IGNyZWF0ZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDEwUGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDEwUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAxMFBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgKLQkJCQkJCSJuYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBhY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMTFQYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGdldEFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAxMVBhcnNlcigpIHsKLQkJaWYgKGFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAxMVBhcnNlciA9PSBudWxsKSB7Ci0JCQlhY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMTFQYXJzZXIgPSBjcmVhdGVBY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMTFQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gYWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDExUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVBY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMTFQYXJzZXIoKSB7Ci0JCVVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoCi0JCQkJCQkibmFtZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgY29udHJvbEZsb3dDb250cm9sRmxvd05hbWVfNDAxMlBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0Q29udHJvbEZsb3dDb250cm9sRmxvd05hbWVfNDAxMlBhcnNlcigpIHsKLQkJaWYgKGNvbnRyb2xGbG93Q29udHJvbEZsb3dOYW1lXzQwMTJQYXJzZXIgPT0gbnVsbCkgewotCQkJY29udHJvbEZsb3dDb250cm9sRmxvd05hbWVfNDAxMlBhcnNlciA9IGNyZWF0ZUNvbnRyb2xGbG93Q29udHJvbEZsb3dOYW1lXzQwMTJQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gY29udHJvbEZsb3dDb250cm9sRmxvd05hbWVfNDAxMlBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlQ29udHJvbEZsb3dDb250cm9sRmxvd05hbWVfNDAxMlBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgKLQkJCQkJCSJuYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGdldFBhcnNlcihpbnQgdmlzdWFsSUQpIHsKLQkJc3dpdGNoICh2aXN1YWxJRCkgewotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRBY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA2UGFyc2VyKCk7Ci0JCWNhc2UgQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldEFjdGl2aXR5RmluYWxOb2RlQWN0aXZpdHlGaW5hbE5vZGVOYW1lXzQwMDFQYXJzZXIoKTsKLQkJY2FzZSBNZXJnZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldE1lcmdlTm9kZU1lcmdlTm9kZU5hbWVfNDAwMlBhcnNlcigpOwotCQljYXNlIEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRJbml0aWFsTm9kZUluaXRpYWxOb2RlTmFtZV80MDAzUGFyc2VyKCk7Ci0JCWNhc2UgRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXREZWNpc2lvbk5vZGVEZWNpc2lvbk5vZGVOYW1lXzQwMDRQYXJzZXIoKTsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwNVBhcnNlcigpOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0QWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwN1BhcnNlcigpOwotCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDA4UGFyc2VyKCk7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA5UGFyc2VyKCk7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDEwUGFyc2VyKCk7Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDExUGFyc2VyKCk7Ci0JCWNhc2UgQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldENvbnRyb2xGbG93Q29udHJvbEZsb3dOYW1lXzQwMTJQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKElBZGFwdGFibGUgaGludCkgewotCQlTdHJpbmcgdmlkID0gKFN0cmluZykgaGludC5nZXRBZGFwdGVyKFN0cmluZy5jbGFzcyk7Ci0JCWlmICh2aWQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFBhcnNlcihVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZCkpOwotCQl9Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBoaW50LmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRQYXJzZXIoVU1MVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBHZXRQYXJzZXJPcGVyYXRpb24pIHsKLQkJCUlBZGFwdGFibGUgaGludCA9ICgoR2V0UGFyc2VyT3BlcmF0aW9uKSBvcGVyYXRpb24pLmdldEhpbnQoKTsKLQkJCWlmIChVTUxFbGVtZW50VHlwZXMuZ2V0RWxlbWVudChoaW50KSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIGdldFBhcnNlcihoaW50KSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcHJvdmlkZXJzL1VNTFByb3BlcnR5UHJvdmlkZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MUHJvcGVydHlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDA0MWE2Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MUHJvcGVydHlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnByb3BlcnRpZXMuR2V0UHJvcGVydHlTb3VyY2VPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnByb3BlcnRpZXMuSUNvbXBvc2l0ZVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wcm9wZXJ0aWVzLklQcm9wZXJ0aWVzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnByb3BlcnRpZXMucHJvdmlkZXJzLkdlbmVyaWNFTUZQcm9wZXJ0aWVzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxQcm9wZXJ0eVByb3ZpZGVyIGV4dGVuZHMgR2VuZXJpY0VNRlByb3BlcnRpZXNQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlQcm9wZXJ0aWVzUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBHZXRQcm9wZXJ0eVNvdXJjZU9wZXJhdGlvbikgewotCQkJT2JqZWN0IG9iamVjdCA9ICgoR2V0UHJvcGVydHlTb3VyY2VPcGVyYXRpb24pIG9wZXJhdGlvbikKLQkJCQkJLmdldE9iamVjdCgpOwotCQkJcmV0dXJuIGdldFNlbWFudGljRWxlbWVudChvYmplY3QpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbXBvc2l0ZVByb3BlcnR5U291cmNlIGdldFByb3BlcnR5U291cmNlKE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gZ2V0U2VtYW50aWNFbGVtZW50KG9iamVjdCk7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eVNvdXJjZShlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0U2VtYW50aWNFbGVtZW50KE9iamVjdCBvYmplY3QpIHsKLQkJVmlldyB2aWV3ID0gbnVsbDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCXZpZXcgPSAoVmlldykgb2JqZWN0OwotCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgb2JqZWN0OwotCQkJaWYgKGVkaXRQYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJdmlldyA9IChWaWV3KSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJfQotCQl9Ci0JCWlmICh2aWV3ICE9IG51bGwKLQkJCQkmJiBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0TW9kZWxJRCh2aWV3KSkpIHsKLQkJCXJldHVybiB2aWV3LmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwODMxOS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcHJvdmlkZXJzL1VNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudGV4dC5GaWVsZFBvc2l0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuRVBGRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIGV4dGVuZHMgVU1MQWJzdHJhY3RQYXJzZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1lc3NhZ2VGb3JtYXQgREVGQVVMVF9QUk9DRVNTT1IgPSBuZXcgTWVzc2FnZUZvcm1hdCgKLQkJCSJ7MH0iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGdldFZpZXdQcm9jZXNzb3IoKSB7Ci0JCU1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yID0gc3VwZXIuZ2V0Vmlld1Byb2Nlc3NvcigpOwotCQlyZXR1cm4gcHJvY2Vzc29yID09IG51bGwgPyBERUZBVUxUX1BST0NFU1NPUiA6IHByb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgZ2V0RWRpdFByb2Nlc3NvcigpIHsKLQkJTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IgPSBzdXBlci5nZXRFZGl0UHJvY2Vzc29yKCk7Ci0JCXJldHVybiBwcm9jZXNzb3IgPT0gbnVsbCA/IERFRkFVTFRfUFJPQ0VTU09SIDogcHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZ0J5UGF0dGVybihJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncywKLQkJCVN0cmluZyBwYXR0ZXJuLCBNZXNzYWdlRm9ybWF0IHByb2Nlc3NvcikgewotCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgYWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCXZhbHVlID0gZ2V0VmFsaWRWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JCXJldHVybiBwcm9jZXNzb3IuZm9ybWF0KG5ldyBPYmplY3RbXSB7IHZhbHVlIH0sIG5ldyBTdHJpbmdCdWZmZXIoKSwKLQkJCQluZXcgRmllbGRQb3NpdGlvbigwKSkudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXJFZGl0U3RhdHVzIHZhbGlkYXRlVmFsdWVzKE9iamVjdFtdIHZhbHVlcykgewotCQlpZiAodmFsdWVzLmxlbmd0aCA+IDEpIHsKLQkJCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEVfU1RBVFVTOwotCQl9Ci0JCU9iamVjdCB2YWx1ZSA9IHZhbHVlcy5sZW5ndGggPT0gMSA/IHZhbHVlc1swXSA6IG51bGw7Ci0JCXZhbHVlID0gZ2V0VmFsaWROZXdWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludmFsaWRWYWx1ZSkgewotCQkJcmV0dXJuIG5ldyBQYXJzZXJFZGl0U3RhdHVzKEVQRkRpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCUlQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEUsIHZhbHVlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgSUNvbW1hbmQgZ2V0UGFyc2VDb21tYW5kKElBZGFwdGFibGUgYWRhcHRlciwgT2JqZWN0W10gdmFsdWVzKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBhZGFwdGVyLmdldEFkYXB0ZXIoRU9iamVjdC5jbGFzcyk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBUcmFuc2FjdGlvblV0aWwKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbihlbGVtZW50KTsKLQkJaWYgKGVkaXRpbmdEb21haW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJT2JqZWN0IHZhbHVlID0gdmFsdWVzLmxlbmd0aCA9PSAxID8gdmFsdWVzWzBdIDogbnVsbDsKLQkJSUNvbW1hbmQgY29tbWFuZCA9IGdldE1vZGlmaWNhdGlvbkNvbW1hbmQoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWUpOwotCQkvLwkJQ29sbGVjdGlvbjxJQ29tbWFuZD4gY29sID0gbmV3IEFycmF5TGlzdDxJQ29tbWFuZD4oKTsKLQkJLy8JCWNvbC5hZGQoY29tbWFuZCk7Ci0JCS8vCQlJQ29tbWFuZCBjb21tYW5kMSA9IGdldFVtYUNvbW1hbmQoYWRhcHRlciwgdmFsdWUpOwotCi0JCS8vVE9ETzogQ2hhbmdlIHRvIENvbW1hbmQuIGZvciB1bmRvIGFjdGlvbi4KLQkJLy8JCVZpZXcgdmlldyA9IChWaWV3KSgoVmlldylhZGFwdGVyLmdldEFkYXB0ZXIoVmlldy5jbGFzcykpLmVDb250YWluZXIoKTsKLQkJLy8JCUVBbm5vdGF0aW9uIGVBbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbihDb25zdGFudHMuVU1BX1NPVVJDRSk7Ci0JCS8vCQlpZihlQW5ub3RhdGlvbiAhPSBudWxsKXsKLQkJLy8JCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpZUFubm90YXRpb24uZ2V0RGV0YWlscygpLmdldChDb25zdGFudHMuVU1BX0VMRU1FTlRfR1VJRCk7Ci0JCS8vCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkvLwkJCU1ldGhvZEVsZW1lbnQgbWUgPSBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCS8vCQkJbWUuc2V0TmFtZSgoU3RyaW5nKXZhbHVlKTsKLQkJLy8JCQlpZihtZSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCl7Ci0JCS8vCQkJCSgoRGVzY3JpYmFibGVFbGVtZW50KW1lKS5zZXRQcmVzZW50YXRpb25OYW1lKChTdHJpbmcpdmFsdWUpOwotCQkvLwkJCX0KLQkJLy8JCX0KLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZChlZGl0aW5nRG9tYWluLCBjb21tYW5kCi0JCQkJLmdldExhYmVsKCksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY29tbWFuZCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FmZmVjdGluZ0V2ZW50KE9iamVjdCBldmVudCwgaW50IGZsYWdzKSB7Ci0JCWlmIChldmVudCBpbnN0YW5jZW9mIE5vdGlmaWNhdGlvbikgewotCQkJaWYgKGZlYXR1cmUgPT0gKChOb3RpZmljYXRpb24pIGV2ZW50KS5nZXRGZWF0dXJlKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3Byb3ZpZGVycy9VTUxTdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MU3RydWN0dXJhbEZlYXR1cmVzUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZTBlZGIuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3Byb3ZpZGVycy9VTUxTdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LkVQRkRpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxTdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIgZXh0ZW5kcyBVTUxBYnN0cmFjdFBhcnNlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IGZlYXR1cmVzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVTUxTdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIoTGlzdCBmZWF0dXJlcykgewotCQl0aGlzLmZlYXR1cmVzID0gZmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nQnlQYXR0ZXJuKElBZGFwdGFibGUgYWRhcHRlciwgaW50IGZsYWdzLAotCQkJU3RyaW5nIHBhdHRlcm4sIE1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBhZGFwdGVyLmdldEFkYXB0ZXIoRU9iamVjdC5jbGFzcyk7Ci0JCUxpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdChmZWF0dXJlcy5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdC5uZXh0KCk7Ci0JCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQl2YWx1ZSA9IGdldFZhbGlkVmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCQkJdmFsdWVzLmFkZCh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3Nvci5mb3JtYXQodmFsdWVzLnRvQXJyYXkobmV3IE9iamVjdFt2YWx1ZXMuc2l6ZSgpXSksCi0JCQkJbmV3IFN0cmluZ0J1ZmZlcigpLCBuZXcgRmllbGRQb3NpdGlvbigwKSkudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXJFZGl0U3RhdHVzIHZhbGlkYXRlVmFsdWVzKE9iamVjdFtdIHZhbHVlcykgewotCQlpZiAodmFsdWVzLmxlbmd0aCAhPSBmZWF0dXJlcy5zaXplKCkpIHsKLQkJCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEVfU1RBVFVTOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3QgdmFsdWUgPSBnZXRWYWxpZE5ld1ZhbHVlKChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzCi0JCQkJCS5nZXQoaSksIHZhbHVlc1tpXSk7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnZhbGlkVmFsdWUpIHsKLQkJCQlyZXR1cm4gbmV3IFBhcnNlckVkaXRTdGF0dXMoRVBGRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEUsIHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb21tYW5kIGdldFBhcnNlQ29tbWFuZChJQWRhcHRhYmxlIGFkYXB0ZXIsIE9iamVjdFtdIHZhbHVlcykgewotCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgYWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gVHJhbnNhY3Rpb25VdGlsCi0JCQkJLmdldEVkaXRpbmdEb21haW4oZWxlbWVudCk7Ci0JCWlmIChlZGl0aW5nRG9tYWluID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoCi0JCQkJZWRpdGluZ0RvbWFpbiwgIlNldCBWYWx1ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0JCQljb21tYW5kCi0JCQkJCS5jb21wb3NlKGdldE1vZGlmaWNhdGlvbkNvbW1hbmQoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWVzW2ldKSk7Ci0JCX0KLQkJcmV0dXJuIGNvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWZmZWN0aW5nRXZlbnQoT2JqZWN0IGV2ZW50LCBpbnQgZmxhZ3MpIHsKLQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgTm90aWZpY2F0aW9uKSB7Ci0JCQlPYmplY3QgZmVhdHVyZSA9ICgoTm90aWZpY2F0aW9uKSBldmVudCkuZ2V0RmVhdHVyZSgpOwotCQkJaWYgKGZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MVmlld1Byb3ZpZGVyLmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvcHJvdmlkZXJzL1VNTFZpZXdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDZiNDZhLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy9wcm92aWRlcnMvVU1MVmlld1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkRlY2lzaW9uTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkRlY2lzaW9uTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5Gb3JrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkluaXRpYWxOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuSm9pbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5NZXJnZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5NZXJnZU5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5RmluYWxOb2RlTmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eUZpbmFsTm9kZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eVBhcmFtZXRlck5vZGUyVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5UGFydGl0aW9uMlZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eVBhcnRpdGlvbk5hbWUyVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5UGFydGl0aW9uTmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MlZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Vmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5UGFydGl0aW9uVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5Vmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzLkNvbnRyb2xGbG93TmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5Db250cm9sRmxvd1ZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5EZWNpc2lvbk5vZGVOYW1lVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzLkRlY2lzaW9uTm9kZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5Gb3JrTm9kZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5Jbml0aWFsTm9kZU5hbWVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXMuSW5pdGlhbE5vZGVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXMuSm9pbk5vZGVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXMuTWVyZ2VOb2RlTmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5NZXJnZU5vZGVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM1ZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3Rvcmllcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycy5BYnN0cmFjdFZpZXdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFZpZXdQcm92aWRlciBleHRlbmRzIEFic3RyYWN0Vmlld1Byb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0RGlhZ3JhbVZpZXdDbGFzcyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVN0cmluZyBkaWFncmFtS2luZCkgewotCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGdldFNlbWFudGljRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIpOwotCQlpZiAoQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoZGlhZ3JhbUtpbmQpCi0JCQkJJiYgVU1MVmlzdWFsSURSZWdpc3RyeS5nZXREaWFncmFtVmlzdWFsSUQoc2VtYW50aWNFbGVtZW50KSAhPSAtMSkgewotCQkJcmV0dXJuIEFjdGl2aXR5Vmlld0ZhY3RvcnkuY2xhc3M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXROb2RlVmlld0NsYXNzKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJVmlldyBjb250YWluZXJWaWV3LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCWlmIChjb250YWluZXJWaWV3ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9IGdldFNlbWFudGljRWxlbWVudFR5cGUoc2VtYW50aWNBZGFwdGVyKTsKLQkJaWYgKGVsZW1lbnRUeXBlICE9IG51bGwKLQkJCQkmJiAhVU1MRWxlbWVudFR5cGVzLmlzS25vd25FbGVtZW50VHlwZShlbGVtZW50VHlwZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUVDbGFzcyBzZW1hbnRpY1R5cGUgPSBnZXRTZW1hbnRpY0VDbGFzcyhzZW1hbnRpY0FkYXB0ZXIpOwotCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGdldFNlbWFudGljRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIpOwotCQlpbnQgbm9kZVZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKGNvbnRhaW5lclZpZXcsCi0JCQkJc2VtYW50aWNFbGVtZW50LCBzZW1hbnRpY1R5cGUsIHNlbWFudGljSGludCk7Ci0JCXN3aXRjaCAobm9kZVZJRCkgewotCQljYXNlIEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5RmluYWxOb2RlVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5RmluYWxOb2RlTmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBNZXJnZU5vZGVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBNZXJnZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIE1lcmdlTm9kZU5hbWVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBGb3JrTm9kZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIEluaXRpYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEluaXRpYWxOb2RlVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEluaXRpYWxOb2RlTmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBEZWNpc2lvbk5vZGVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBEZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIERlY2lzaW9uTm9kZU5hbWVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBKb2luTm9kZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb25WaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uTmFtZTJWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGUyVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb24yVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uTmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudFZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIENvbnRyb2xGbG93TmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0RWRnZVZpZXdDbGFzcyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVZpZXcgY29udGFpbmVyVmlldywgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSBnZXRTZW1hbnRpY0VsZW1lbnRUeXBlKHNlbWFudGljQWRhcHRlcik7Ci0JCWlmIChlbGVtZW50VHlwZSAhPSBudWxsCi0JCQkJJiYgIVVNTEVsZW1lbnRUeXBlcy5pc0tub3duRWxlbWVudFR5cGUoZWxlbWVudFR5cGUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlFQ2xhc3Mgc2VtYW50aWNUeXBlID0gZ2V0U2VtYW50aWNFQ2xhc3Moc2VtYW50aWNBZGFwdGVyKTsKLQkJaWYgKHNlbWFudGljVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGdldFNlbWFudGljRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIpOwotCQlpbnQgbGlua1ZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKAotCQkJCXNlbWFudGljRWxlbWVudCwgc2VtYW50aWNUeXBlKTsKLQkJc3dpdGNoIChsaW5rVklEKSB7Ci0JCWNhc2UgQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQ29udHJvbEZsb3dWaWV3RmFjdG9yeS5jbGFzczsKLQkJfQotCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQ29ubmVjdG9yVmlld0NsYXNzKHNlbWFudGljQWRhcHRlciwKLQkJCQljb250YWluZXJWaWV3LCBzZW1hbnRpY0hpbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElFbGVtZW50VHlwZSBnZXRTZW1hbnRpY0VsZW1lbnRUeXBlKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyKSB7Ci0JCWlmIChzZW1hbnRpY0FkYXB0ZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChJRWxlbWVudFR5cGUpIHNlbWFudGljQWRhcHRlci5nZXRBZGFwdGVyKElFbGVtZW50VHlwZS5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ2xhc3MgZ2V0VW5yZWNvZ25pemVkQ29ubmVjdG9yVmlld0NsYXNzKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJVmlldyBjb250YWluZXJWaWV3LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCS8vIEhhbmRsZSB1bnJlY29nbml6ZWQgY2hpbGQgbm9kZSBjbGFzc2VzIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlGaW5hbE5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eUZpbmFsTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjQzYzJkLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eUZpbmFsTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RMYWJlbFZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnV0aWwuTWVhc3VyZW1lbnRVbml0SGVscGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLm1hcG1vZGUuSU1hcE1vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Mb2NhdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpbmFsTm9kZU5hbWVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TGFiZWxWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZpZXcgY3JlYXRlVmlldyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgVmlldyBjb250YWluZXJWaWV3LAotCQkJU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwKLQkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsKLQkJTm9kZSB2aWV3ID0gKE5vZGUpIHN1cGVyLmNyZWF0ZVZpZXcoc2VtYW50aWNBZGFwdGVyLCBjb250YWluZXJWaWV3LAotCQkJCXNlbWFudGljSGludCwgaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsKLQkJTG9jYXRpb24gbG9jYXRpb24gPSAoTG9jYXRpb24pIHZpZXcuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQlJTWFwTW9kZSBtYXBNb2RlID0gTWVhc3VyZW1lbnRVbml0SGVscGVyLmdldE1hcE1vZGUoY29udGFpbmVyVmlldwotCQkJCS5nZXREaWFncmFtKCkuZ2V0TWVhc3VyZW1lbnRVbml0KCkpOwotCQlsb2NhdGlvbi5zZXRYKG1hcE1vZGUuRFB0b0xQKDApKTsKLQkJbG9jYXRpb24uc2V0WShtYXBNb2RlLkRQdG9MUCg1KSk7Ci0JCXJldHVybiB2aWV3OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eUZpbmFsTm9kZVZpZXdGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlGaW5hbE5vZGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzIwMzM5Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eUZpbmFsTm9kZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RmluYWxOb2RlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkuY3JlYXRlTm9kZSgKLQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJdmlldywKLQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0VHlwZShBY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJWaWV3RmFjdG9yeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2ZiNjVmLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGUyVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKS5jcmVhdGVOb2RlKAotCQkJCXNlbWFudGljQWRhcHRlciwKLQkJCQl2aWV3LAotCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMlZpZXdGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmZhMDBjLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMlZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkJhc2ljTm9kZVZpZXdGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyVmlld0ZhY3RvcnkgZXh0ZW5kcyBCYXNpY05vZGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNjFmOTIuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5CYXNpY05vZGVWaWV3RmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lVmlld0ZhY3RvcnkgZXh0ZW5kcyBCYXNpY05vZGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlVmlld0ZhY3RvcnkuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjZhOWQzLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpLmNyZWF0ZU5vZGUoCi0JCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCXZpZXcsCi0JCQkJVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb24yVmlld0ZhY3RvcnkuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvbjJWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2ZiMTVhLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvbjJWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uMlZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKS5jcmVhdGVOb2RlKAotCQkJCXNlbWFudGljQWRhcHRlciwKLQkJCQl2aWV3LAotCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JCWdldFZpZXdTZXJ2aWNlKCkKLQkJCQkuY3JlYXRlTm9kZSgKLQkJCQkJCXNlbWFudGljQWRhcHRlciwKLQkJCQkJCXZpZXcsCi0JCQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uTmFtZTJWaWV3RmFjdG9yeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uTmFtZTJWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGIzNzhjLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvbk5hbWUyVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnV0aWwuTWVhc3VyZW1lbnRVbml0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5tYXBtb2RlLklNYXBNb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uTmFtZTJWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkJhc2ljTm9kZVZpZXdGYWN0b3J5I2NyZWF0ZVZpZXcob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUsIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXcsIGphdmEubGFuZy5TdHJpbmcsIGludCwgYm9vbGVhbiwgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgVmlldyBjcmVhdGVWaWV3KElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBWaWV3IGNvbnRhaW5lclZpZXcsCi0JCQlTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLAotCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgewotCQlOb2RlIHZpZXcgPSAoTm9kZSkgc3VwZXIuY3JlYXRlVmlldyhzZW1hbnRpY0FkYXB0ZXIsIGNvbnRhaW5lclZpZXcsCi0JCQkJc2VtYW50aWNIaW50LCBpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOwotCQlMb2NhdGlvbiBsb2NhdGlvbiA9IChMb2NhdGlvbikgdmlldy5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCUlNYXBNb2RlIG1hcE1vZGUgPSBNZWFzdXJlbWVudFVuaXRIZWxwZXIuZ2V0TWFwTW9kZShjb250YWluZXJWaWV3Ci0JCQkJLmdldERpYWdyYW0oKS5nZXRNZWFzdXJlbWVudFVuaXQoKSk7Ci0JCWxvY2F0aW9uLnNldFgobWFwTW9kZS5EUHRvTFAoMCkpOwotCQlsb2NhdGlvbi5zZXRZKG1hcE1vZGUuRFB0b0xQKDUpKTsKLQkJcmV0dXJuIHZpZXc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uTmFtZVZpZXdGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25OYW1lVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUyYmY3Ni4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25OYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uTmFtZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJWaWV3RmFjdG9yeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRhNTA0NC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkxpc3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuRmlndXJlVXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRHJhd2VyU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTGF5b3V0Q29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlRpdGxlU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyVmlld0ZhY3RvcnkgZXh0ZW5kcwotCQlMaXN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTb3J0aW5nU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWx0ZXJpbmdTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlzZXR1cENvbXBhcnRtZW50VGl0bGUodmlldyk7Ci0JCXNldHVwQ29tcGFydG1lbnRDb2xsYXBzZWQodmlldyk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRDb25zdHJhaW50IGNyZWF0ZUxheW91dENvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzKFZpZXcgdmlldykgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVByZWZlcmVuY2VzKHZpZXcpOwotCi0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgZ2V0UHJlZmVyZW5jZXNIaW50KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJLy8gZmlsbCBjb2xvcgotCQlSR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsCi0JCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsKLQkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwgRmlndXJlVXRpbGl0aWVzCi0JCQkJLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwQ29tcGFydG1lbnRUaXRsZShWaWV3IHZpZXcpIHsKLQkJVGl0bGVTdHlsZSB0aXRsZVN0eWxlID0gKFRpdGxlU3R5bGUpIHZpZXcKLQkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRUaXRsZVN0eWxlKCkpOwotCQlpZiAodGl0bGVTdHlsZSAhPSBudWxsKSB7Ci0JCQl0aXRsZVN0eWxlLnNldFNob3dUaXRsZSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cENvbXBhcnRtZW50Q29sbGFwc2VkKFZpZXcgdmlldykgewotCQlEcmF3ZXJTdHlsZSBkcmF3ZXJTdHlsZSA9IChEcmF3ZXJTdHlsZSkgdmlldwotCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldERyYXdlclN0eWxlKCkpOwotCQlpZiAoZHJhd2VyU3R5bGUgIT0gbnVsbCkgewotCQkJZHJhd2VyU3R5bGUuc2V0Q29sbGFwc2VkKGZhbHNlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRWaWV3RmFjdG9yeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWQ1ZTc3Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Vmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5MaXN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkZpZ3VyZVV0aWxpdGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRyYXdlclN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxheW91dENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5UaXRsZVN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Vmlld0ZhY3RvcnkgZXh0ZW5kcwotCQlMaXN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTb3J0aW5nU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWx0ZXJpbmdTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCXNldHVwQ29tcGFydG1lbnRUaXRsZSh2aWV3KTsKLQkJc2V0dXBDb21wYXJ0bWVudENvbGxhcHNlZCh2aWV3KTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dENvbnN0cmFpbnQgY3JlYXRlTGF5b3V0Q29uc3RyYWludCgpIHsKLQkJcmV0dXJuIE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMoVmlldyB2aWV3KSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXModmlldyk7Ci0KLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBnZXRQcmVmZXJlbmNlc0hpbnQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQkvLyBmaWxsIGNvbG9yCi0JCVJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwKLQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOwotCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsIE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLCBGaWd1cmVVdGlsaXRpZXMKLQkJCQkuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBDb21wYXJ0bWVudFRpdGxlKFZpZXcgdmlldykgewotCQlUaXRsZVN0eWxlIHRpdGxlU3R5bGUgPSAoVGl0bGVTdHlsZSkgdmlldwotCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFRpdGxlU3R5bGUoKSk7Ci0JCWlmICh0aXRsZVN0eWxlICE9IG51bGwpIHsKLQkJCXRpdGxlU3R5bGUuc2V0U2hvd1RpdGxlKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwQ29tcGFydG1lbnRDb2xsYXBzZWQoVmlldyB2aWV3KSB7Ci0JCURyYXdlclN0eWxlIGRyYXdlclN0eWxlID0gKERyYXdlclN0eWxlKSB2aWV3Ci0JCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RHJhd2VyU3R5bGUoKSk7Ci0JCWlmIChkcmF3ZXJTdHlsZSAhPSBudWxsKSB7Ci0JCQlkcmF3ZXJTdHlsZS5zZXRDb2xsYXBzZWQoZmFsc2UpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25WaWV3RmFjdG9yeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY2ZWJjZS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25WaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkuY3JlYXRlTm9kZSgKLQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJdmlldywKLQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0VHlwZShBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQkJZ2V0Vmlld1NlcnZpY2UoKQotCQkJCS5jcmVhdGVOb2RlKAotCQkJCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJdmlldywKLQkJCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVZpZXdGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzRmYTZkLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5iYXNlLnZpZXcuRGlhZ3JhbUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkRpYWdyYW1WaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk1lYXN1cmVtZW50VW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVZpZXdGYWN0b3J5IGV4dGVuZHMgRGlhZ3JhbVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhZ2VTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUd1aWRlU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyB2aWV3LCBJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVN0cmluZyBkaWFncmFtS2luZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcodmlldywgc2VtYW50aWNBZGFwdGVyLCBkaWFncmFtS2luZCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkRpYWdyYW1WaWV3RmFjdG9yeSNjcmVhdGVEaWFncmFtKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50KQotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBEaWFncmFtIGNyZWF0ZURpYWdyYW0oSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlTdHJpbmcgZGlhZ3JhbUtpbmQsIFByZWZlcmVuY2VzSGludCB0aGVQcmVmZXJlbmNlc0hpbnQpIHsKLQkJc2V0UHJlZmVyZW5jZXNIaW50KHRoZVByZWZlcmVuY2VzSGludCk7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IG5ldyBEaWFncmFtSW1wbCgpOwotCQlMaXN0IHN0eWxlcyA9IGNyZWF0ZVN0eWxlcyhkaWFncmFtKTsKLQkJaWYgKHN0eWxlcy5zaXplKCkgPiAwKSB7Ci0JCQlkaWFncmFtLmdldFN0eWxlcygpLmFkZEFsbChzdHlsZXMpOwotCQl9Ci0KLQkJaWYgKGRpYWdyYW1LaW5kICE9IG51bGwpCi0JCQlkaWFncmFtLnNldFR5cGUoZGlhZ3JhbUtpbmQpOwotCQlpZiAoc2VtYW50aWNBZGFwdGVyICE9IG51bGwpCi0JCQlkaWFncmFtLnNldEVsZW1lbnQoKEVPYmplY3QpIHNlbWFudGljQWRhcHRlcgotCQkJCQkuZ2V0QWRhcHRlcihFT2JqZWN0LmNsYXNzKSk7Ci0JCWVsc2UKLQkJCS8vIGVuZm9yY2UgYSBzZXQgdG8gTlVMTAotCQkJZGlhZ3JhbS5zZXRFbGVtZW50KG51bGwpOwotCi0JCWluaXRpYWxpemVNZWFzdXJlbWVudFVuaXQoZGlhZ3JhbSk7Ci0KLQkJLy8gZG8gdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbnMgKGNyZWF0aW5nIGNoaWxkcmVuLCBzZXR0aW5nIHByb3BlcnRpZXMuLi5ldGMpCi0JCWRlY29yYXRlVmlldyhkaWFncmFtLCBzZW1hbnRpY0FkYXB0ZXIsIGRpYWdyYW1LaW5kKTsKLQotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEBjdXN0b20KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZU1lYXN1cmVtZW50VW5pdChEaWFncmFtIGRpYWdyYW0pIHsKLQkJaWYgKCFkaWFncmFtLmlzU2V0TWVhc3VyZW1lbnRVbml0KCkpIHsKLQkJCWRpYWdyYW0uc2V0TWVhc3VyZW1lbnRVbml0KGdldE1lYXN1cmVtZW50VW5pdCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVhc3VyZW1lbnRVbml0IGdldE1lYXN1cmVtZW50VW5pdCgpIHsKLQkJcmV0dXJuIE1lYXN1cmVtZW50VW5pdC5QSVhFTF9MSVRFUkFMOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0NvbnRyb2xGbG93TmFtZVZpZXdGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQ29udHJvbEZsb3dOYW1lVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQzYTM0My4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvQ29udHJvbEZsb3dOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0TGFiZWxWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS51dGlsLk1lYXN1cmVtZW50VW5pdEhlbHBlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5tYXBtb2RlLklNYXBNb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTG9jYXRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dOYW1lVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdExhYmVsVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWaWV3IGNyZWF0ZVZpZXcoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFZpZXcgY29udGFpbmVyVmlldywKLQkJCVN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsCi0JCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7Ci0JCU5vZGUgdmlldyA9IChOb2RlKSBzdXBlci5jcmVhdGVWaWV3KHNlbWFudGljQWRhcHRlciwgY29udGFpbmVyVmlldywKLQkJCQlzZW1hbnRpY0hpbnQsIGluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7Ci0JCUxvY2F0aW9uIGxvY2F0aW9uID0gKExvY2F0aW9uKSB2aWV3LmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJSU1hcE1vZGUgbWFwTW9kZSA9IE1lYXN1cmVtZW50VW5pdEhlbHBlci5nZXRNYXBNb2RlKGNvbnRhaW5lclZpZXcKLQkJCQkuZ2V0RGlhZ3JhbSgpLmdldE1lYXN1cmVtZW50VW5pdCgpKTsKLQkJbG9jYXRpb24uc2V0WChtYXBNb2RlLkRQdG9MUCgwKSk7Ci0JCWxvY2F0aW9uLnNldFkobWFwTW9kZS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHZpZXc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0NvbnRyb2xGbG93Vmlld0ZhY3RvcnkuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9Db250cm9sRmxvd1ZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyM2I2MzMuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0NvbnRyb2xGbG93Vmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS5BYnN0cmFjdEVNRk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUudXRpbC5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUudXRpbC5TdHJpbmdTdGF0aWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmludGVybmFsLkRpYWdyYW1VSURlYnVnT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmludGVybmFsLkRpYWdyYW1VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmludGVybmFsLkRpYWdyYW1VSVN0YXR1c0NvZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQ29ubmVjdGlvblZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkJlbmRwb2ludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sRmxvd1ZpZXdGYWN0b3J5IGV4dGVuZHMgQ29ubmVjdGlvblZpZXdGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQlzdGF0aWMgewotCQlvcHRpb25zLnB1dChUcmFuc2FjdGlvbi5PUFRJT05fVU5QUk9URUNURUQsIEJvb2xlYW4uVFJVRSk7Ci0JCW9wdGlvbnMucHV0KFRyYW5zYWN0aW9uLk9QVElPTl9OT19OT1RJRklDQVRJT05TLCBCb29sZWFuLlRSVUUpOwotCQlvcHRpb25zLnB1dChUcmFuc2FjdGlvbi5PUFRJT05fTk9fVFJJR0dFUlMsIEJvb2xlYW4uVFJVRSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm91dGluZ1N0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKS5jcmVhdGVOb2RlKHNlbWFudGljQWRhcHRlciwgdmlldywKLQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUoQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS52aWV3LmZhY3Rvcmllcy5WaWV3RmFjdG9yeSNjcmVhdGVWaWV3KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlLCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGJvb2xlYW4sIGphdmEubGFuZy5TdHJpbmcpCi0JICogCi0JICogT3ZlcnJvZGUgY3JlYXRlVmlldyBzaW5jZSB0aGVyZSBpcyBhIGJ1ZyBpbiAKLQkgKiBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkNvbm5lY3Rpb25WaWV3RmFjdG9yeS5qYXZhCi0JICovCi0JcHVibGljIFZpZXcgY3JlYXRlVmlldyhmaW5hbCBJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCWZpbmFsIFZpZXcgY29udGFpbmVyVmlldywgZmluYWwgU3RyaW5nIHNlbWFudGljSGludCwKLQkJCWZpbmFsIGludCBpbmRleCwgZmluYWwgYm9vbGVhbiBwZXJzaXN0ZWQsCi0JCQlmaW5hbCBQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7Ci0KLQkJc2V0UHJlZmVyZW5jZXNIaW50KHByZWZlcmVuY2VzSGludCk7Ci0KLQkJZmluYWwgRWRnZSBlZGdlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFZGdlKCk7Ci0JCUxpc3Qgc3R5bGVzID0gY3JlYXRlU3R5bGVzKGVkZ2UpOwotCQlpZiAoc3R5bGVzLnNpemUoKSA+IDApIHsKLQkJCWVkZ2UuZ2V0U3R5bGVzKCkuYWRkQWxsKHN0eWxlcyk7Ci0JCX0KLQotCQlCZW5kcG9pbnRzIGJlbmRQb2ludHMgPSBjcmVhdGVCZW5kcG9pbnRzKCk7Ci0JCWlmIChiZW5kUG9pbnRzICE9IG51bGwpIHsKLQkJCWVkZ2Uuc2V0QmVuZHBvaW50cyhiZW5kUG9pbnRzKTsKLQkJfQotCi0JCUVPYmplY3Qgc2VtYW50aWNFbCA9IHNlbWFudGljQWRhcHRlciA9PSBudWxsID8gbnVsbAotCQkJCTogKEVPYmplY3QpIHNlbWFudGljQWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQlpZiAoc2VtYW50aWNFbCA9PSBudWxsKQotCQkJLy8gZW5mb3JjZSBhIHNldCB0byBOVUxMCi0JCQllZGdlLnNldEVsZW1lbnQobnVsbCk7Ci0JCWVsc2UgaWYgKHJlcXVpcmVzRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIsIGNvbnRhaW5lclZpZXcpKSB7Ci0JCQllZGdlLnNldEVsZW1lbnQoc2VtYW50aWNFbCk7Ci0JCX0KLQotCQllZGdlLnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQotCQkvLyBkZWNvcmF0ZSB2aWV3IGFzc3VtZXMgdGhlIHZpZXcgaGFkIGJlZW4gaW5zZXJ0ZWQgYWxyZWFkeSwgc28gCi0JCS8vIHdlIGhhZCB0byBjYWxsIGluc2VydCBjaGlsZCBiZWZvcmUgY2FsbGluZyBkZWNvcmF0ZSB2aWV3Ci0JCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBlZGdlLCBpbmRleCwgcGVyc2lzdGVkKTsKLQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBnZXRFZGl0aW5nRG9tYWluKHNlbWFudGljRWwsCi0JCQkJY29udGFpbmVyVmlldyk7Ci0KLQkJaWYgKGRvbWFpbiAhPSBudWxsKSB7Ci0JCQlpZiAoaXNVblByb3RlY3RlZFNpbGVudFRyYW5zYWN0aW9uSW5Qcm9ncmVzcyhkb21haW4pKSB7Ci0JCQkJLy8gZGVjb3JhdGUgdmlldyBoYWQgdG8gcnVuIGFzIGEgc2lsZW50IG9wZXJhdGlvbiBvdGhlciB3aXNlCi0JCQkJLy8gaXQgd2lsbCBnZW5lcmF0ZSB0b28gbWFueSBldmVudHMKLQkJCQlkZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgZWRnZSwgc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJc2VtYW50aWNIaW50LCBpbmRleCwgdHJ1ZSk7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJQWJzdHJhY3RFTUZPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEFic3RyYWN0RU1GT3BlcmF0aW9uKAotCQkJCQkJZG9tYWluLCBTdHJpbmdTdGF0aWNzLkJMQU5LLCBvcHRpb25zKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCQkJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCQkJZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIGVkZ2UsIHNlbWFudGljQWRhcHRlciwKLQkJCQkJCQkJc2VtYW50aWNIaW50LCBpbmRleCwgdHJ1ZSk7Ci0KLQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQl0cnkgewotCQkJCQlvcGVyYXRpb24uZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS5jYXRjaGluZyhEaWFncmFtVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKSwKLQkJCQkJCQlEaWFncmFtVUlEZWJ1Z09wdGlvbnMuRVhDRVBUSU9OU19DQVRDSElORywKLQkJCQkJCQlnZXRDbGFzcygpLCAiY3JlYXRlVmlldyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCUxvZy53YXJuaW5nKERpYWdyYW1VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLAotCQkJCQkJCURpYWdyYW1VSVN0YXR1c0NvZGVzLklHTk9SRURfRVhDRVBUSU9OX1dBUk5JTkcsCi0JCQkJCQkJImNyZWF0ZVZpZXciLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBlZGdlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0RlY2lzaW9uTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0RlY2lzaW9uTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWNmMTE5Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9EZWNpc2lvbk5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQmFzaWNOb2RlVmlld0ZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVjaXNpb25Ob2RlTmFtZVZpZXdGYWN0b3J5IGV4dGVuZHMgQmFzaWNOb2RlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0RlY2lzaW9uTm9kZVZpZXdGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvRGVjaXNpb25Ob2RlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU4MzNkNy4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvRGVjaXNpb25Ob2RlVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlY2lzaW9uTm9kZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKQotCQkJCS5jcmVhdGVOb2RlKAotCQkJCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJdmlldywKLQkJCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCQkJLmdldFR5cGUoRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9Gb3JrTm9kZVZpZXdGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvRm9ya05vZGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjRjNTFjLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9Gb3JrTm9kZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuRm9ya05vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZvcmtOb2RlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5Gb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvSW5pdGlhbE5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9Jbml0aWFsTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJkYzU4Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9Jbml0aWFsTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RMYWJlbFZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnV0aWwuTWVhc3VyZW1lbnRVbml0SGVscGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLm1hcG1vZGUuSU1hcE1vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Mb2NhdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0aWFsTm9kZU5hbWVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TGFiZWxWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZpZXcgY3JlYXRlVmlldyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgVmlldyBjb250YWluZXJWaWV3LAotCQkJU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwKLQkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsKLQkJTm9kZSB2aWV3ID0gKE5vZGUpIHN1cGVyLmNyZWF0ZVZpZXcoc2VtYW50aWNBZGFwdGVyLCBjb250YWluZXJWaWV3LAotCQkJCXNlbWFudGljSGludCwgaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsKLQkJTG9jYXRpb24gbG9jYXRpb24gPSAoTG9jYXRpb24pIHZpZXcuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQlJTWFwTW9kZSBtYXBNb2RlID0gTWVhc3VyZW1lbnRVbml0SGVscGVyLmdldE1hcE1vZGUoY29udGFpbmVyVmlldwotCQkJCS5nZXREaWFncmFtKCkuZ2V0TWVhc3VyZW1lbnRVbml0KCkpOwotCQlsb2NhdGlvbi5zZXRYKG1hcE1vZGUuRFB0b0xQKDApKTsKLQkJbG9jYXRpb24uc2V0WShtYXBNb2RlLkRQdG9MUCg1KSk7Ci0JCXJldHVybiB2aWV3OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9Jbml0aWFsTm9kZVZpZXdGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvSW5pdGlhbE5vZGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2IyMjBiLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9Jbml0aWFsTm9kZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkuY3JlYXRlTm9kZShzZW1hbnRpY0FkYXB0ZXIsIHZpZXcsCi0JCQkJVU1MVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvSm9pbk5vZGVWaWV3RmFjdG9yeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL0pvaW5Ob2RlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU5ZGY4Ni4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvSm9pbk5vZGVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkpvaW5Ob2RlTmFtZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luTm9kZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL01lcmdlTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL01lcmdlTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2ZkOTZjLi4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9NZXJnZU5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQmFzaWNOb2RlVmlld0ZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVyZ2VOb2RlTmFtZVZpZXdGYWN0b3J5IGV4dGVuZHMgQmFzaWNOb2RlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL01lcmdlTm9kZVZpZXdGYWN0b3J5LmphdmEgYi9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvTWVyZ2VOb2RlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVjYmQxZS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvTWVyZ2VOb2RlVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5NZXJnZU5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lcmdlTm9kZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuTWVyZ2VOb2RlRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKS5jcmVhdGVOb2RlKHNlbWFudGljQWRhcHRlciwgdmlldywKLQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUoTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJWaWV3RmFjdG9yeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0M2I0NS4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMlZpZXdGYWN0b3J5IGV4dGVuZHMKLQkJQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpCi0JCQkJLmNyZWF0ZU5vZGUoCi0JCQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJCQl2aWV3LAotCQkJCQkJVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJCQkuZ2V0VHlwZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNWaWV3RmFjdG9yeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFlYmVhNC4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM1ZpZXdGYWN0b3J5IGV4dGVuZHMKLQkJQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpCi0JCQkJLmNyZWF0ZU5vZGUoCi0JCQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJCQl2aWV3LAotCQkJCQkJVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJCQkuZ2V0VHlwZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyVmlld0ZhY3RvcnkuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTQ3NDE3Li4wMDAwMDAwCi0tLSBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5CYXNpY05vZGVWaWV3RmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJWaWV3RmFjdG9yeSBleHRlbmRzCi0JCUJhc2ljTm9kZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNWaWV3RmFjdG9yeS5qYXZhIGIvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM1ZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NTQzMTguLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM1ZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkJhc2ljTm9kZVZpZXdGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM1ZpZXdGYWN0b3J5IGV4dGVuZHMKLQkJQmFzaWNOb2RlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYmE5ZWEuLjAwMDAwMDAKLS0tIGEvZGVwcmVjYXRlZF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW1taW5nL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkJhc2ljTm9kZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVWaWV3RmFjdG9yeSBleHRlbmRzIEJhc2ljTm9kZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlVmlld0ZhY3RvcnkuamF2YSBiL2RlcHJlY2F0ZWRfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtbWluZy92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U4OThjNi4uMDAwMDAwMAotLS0gYS9kZXByZWNhdGVkX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbW1pbmcvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkuY3JlYXRlTm9kZSgKLQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJdmlldywKLQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0VHlwZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS8ucHJvamVjdCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OWMxN2EyLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNzM3ZjBmLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcDQotICAgICAgICAgICAgICAgZmVhdHVyZV9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBmZWF0dXJlX2phLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGZlYXR1cmVfa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgZmVhdHVyZV9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBmZWF0dXJlX3poX0NOLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGZlYXR1cmVfemhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgZmVhdHVyZV9pdC5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBmZWF0dXJlX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGZlYXR1cmVfZGUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sDQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDEvZmVhdHVyZS54bWwgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDFhNTIzNy4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEiCi0gICAgICBsYWJlbD0iRVBGIENvbXBvc2VyIEJhc2UgTkwxIEZlYXR1cmUiCi0gICAgICB2ZXJzaW9uPSIxLjIuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSJFY2xpcHNlIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYmFzZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlVGV4dAotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90ZWNobm9sb2d5L2VwZi91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51bWEubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2ZlYXR1cmVfZGUucHJvcGVydGllcyBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2ZlYXR1cmVfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjUwZTI1Ny4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9mZWF0dXJlX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1mZWF0dXJlTmFtZT1FUEYgLSBCYXNpcy1GZWF0dXJlDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249RVBGLUJhc2lzLUZlYXR1cmUuDQotdXBkYXRlU2l0ZU5hbWU9RVBGIC0gRmVhdHVyZS1Ba3R1YWxpc2llcnVuZ2VuDQotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbA0KLWxpY2Vuc2VUZXh0PURpZSBWZXJ3ZW5kdW5nIGRpZXNlcyBGZWF0dXJlcyB1bnRlcmxpZWd0IGRlbnNlbGJlbiBCZWRpbmd1bmdlbiwgZGllIGZcdTAwZmNyIGRpZSBWZXJ3ZW5kdW5nIGRlcyBQcm9kdWt0cyBnZWx0ZW4sIGRhcyBkaWVzZXMgRmVhdHVyZSBlbnRoXHUwMGU0bHQuDQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDEvZmVhdHVyZV9lcy5wcm9wZXJ0aWVzIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDEvZmVhdHVyZV9lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MmQzYWYwLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2ZlYXR1cmVfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZlYXR1cmVOYW1lPUNhcmFjdGVyXHUwMGVkc3RpY2EgYlx1MDBlMXNpY2EgZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249Q2FyYWN0ZXJcdTAwZWRzdGljYSBiXHUwMGUxc2ljYSBkZSBFUEYuDQotdXBkYXRlU2l0ZU5hbWU9QWN0dWFsaXphY2lvbmVzIGRlIGNhcmFjdGVyXHUwMGVkc3RpY2EgZGUgRVBGDQotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgQ29sYWJvcmFkb3JlcyBkZSBFY2xpcHNlIHkgb3Ryb3MgMjAwNCwgMjAwNi4gIFJlc2VydmFkb3MgdG9kb3MgbG9zIGRlcmVjaG9zLg0KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sDQotbGljZW5zZVRleHQ9RWwgdXNvIGRlIGVzdGEgY2FyYWN0ZXJcdTAwZWRzdGljYSBlc3RcdTAwZTEgc3VqZXRvIGEgbG9zIG1pc21vcyB0XHUwMGU5cm1pbm9zIHkgY29uZGljaW9uZXMgcXVlIHJpZ2VuIGVsIHVzbyBkZWwgUHJvZHVjdG8gcXVlIGluY2x1eWUgZXN0YSBjYXJhY3Rlclx1MDBlZHN0aWNhLg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2ZlYXR1cmVfZnIucHJvcGVydGllcyBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2ZlYXR1cmVfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDVlNWY3ZS4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9mZWF0dXJlX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1mZWF0dXJlTmFtZT1Gb25jdGlvbiBkZSBiYXNlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLWRlc2NyaXB0aW9uPUZvbmN0aW9uIGRlIGJhc2UgRVBGLg0KLXVwZGF0ZVNpdGVOYW1lPU1pc2VzIFx1MDBlMCBqb3VyIGRlIGxhIGZvbmN0aW9uIEVQRg0KLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwNCi1saWNlbnNlVGV4dD1MJ3V0aWxpc2F0aW9uIGRlIGNldHRlIGZvbmN0aW9uIGRcdTAwZTlwZW5kIGRlcyBtXHUwMGVhbWVzIHRlcm1lcyBldCBjb25kaXRpb25zIHF1aSByXHUwMGU5Z2lzc2VudCBsJ3V0aWxpc2F0aW9uIGR1IHByb2R1aXQgaW5jbHVhbnQgY2V0dGUgZm9uY3Rpb24uDQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDEvZmVhdHVyZV9pdC5wcm9wZXJ0aWVzIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDEvZmVhdHVyZV9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OTMxNWI3Li4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2ZlYXR1cmVfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZlYXR1cmVOYW1lPUZ1bnppb25lIEVQRiBCYXNlDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249RnVuemlvbmUgZGkgYmFzZSBFUEYuDQotdXBkYXRlU2l0ZU5hbWU9QWdnaW9ybmFtZW50aSBmdW56aW9uZSBFUEYNCi1jb3B5cmlnaHQ9KGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDYuICBUdXR0aSBpIGRpcml0dGkgcmlzZXJ2YXRpLg0KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sDQotbGljZW5zZVRleHQ9TCd1c28gZGkgcXVlc3RhIGZ1bnppb25lIFx1MDBlOCBzb2dnZXR0byBhZ2xpIHN0ZXNzaSB0ZXJtaW5pIGUgY29uZGl6aW9uaSBjaGUgcmVnb2xhbm8gbCd1c28gZGVsIHByb2RvdHRvIGNoZSBmb3JuaXNjZSB0YWxlIGZ1bnppb25lLg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2ZlYXR1cmVfamEucHJvcGVydGllcyBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2ZlYXR1cmVfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA5ZWM1MC4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9mZWF0dXJlX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1mZWF0dXJlTmFtZT1FUEYgQmFzZSBGZWF0dXJlDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249RVBGIFx1NTdmYVx1NjcyY1x1NmE1Zlx1ODBmZFx1MzAwMg0KLXVwZGF0ZVNpdGVOYW1lPUVQRiBcdTZhNWZcdTgwZmRcdTMwNmVcdTY2ZjRcdTY1YjANCi1jb3B5cmlnaHQ9KGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDYuICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sDQotbGljZW5zZVRleHQ9XHUzMDUzXHUzMDZlXHUzMGQ1XHUzMGEzXHUzMGZjXHUzMGMxXHUzMGUzXHUzMGZjXHUzMDZlXHU0ZjdmXHU3NTI4XHUzMDZiXHUzMDZmXHUzMDAxXHUzMDUzXHUzMDZlXHUzMGQ1XHUzMGEzXHUzMGZjXHUzMGMxXHUzMGUzXHUzMGZjXHUzMDkyXHU1NDJiXHUzMDgwXHU4OGZkXHU1NGMxXHUzMDZlXHU0ZjdmXHU3NTI4XHUzMDZiXHU1YmZlXHUzMDU3XHUzMDY2XHU5MDY5XHU3NTI4XHUzMDU1XHUzMDhjXHUzMDhiXHUzMDgyXHUzMDZlXHUzMDY4XHU1NDBjXHUzMDU4XHUzMDU0XHU0ZjdmXHU3NTI4XHU2NzYxXHU0ZWY2XHUzMDRjXHU5MDY5XHU3NTI4XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU5XHUzMDAyDQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDEvZmVhdHVyZV9rby5wcm9wZXJ0aWVzIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDEvZmVhdHVyZV9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMmQzNDMyLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2ZlYXR1cmVfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZlYXR1cmVOYW1lPUVQRiBcdWFlMzBcdWJjZjggXHVhZTMwXHViMmE1DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249RVBGIFx1YWUzMFx1YmNmOCBcdWFlMzBcdWIyYTUNCi11cGRhdGVTaXRlTmFtZT1FUEYgXHVhZTMwXHViMmE1IFx1YWMzMVx1YzJlMFx1YzBhY1x1ZDU2ZA0KLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbA0KLWxpY2Vuc2VUZXh0PVx1YmNmOCBcdWFlMzBcdWIyYTVcdWM3NTggXHVjMGFjXHVjNmE5XHVjNWQwIFx1YjMwMFx1ZDU3NFx1YzExY1x1YjI5NCBcdWJjZjggXHVhZTMwXHViMmE1XHVjNzQ0IFx1ZDNlY1x1ZDU2OFx1ZDU1OFx1YjI5NCBcdWM4MWNcdWQ0ODhcdWM3NTggXHVjMGFjXHVjNmE5XHVjNWQwIFx1YzgwMVx1YzZhOVx1YjQxOFx1YjI5NCBcdWIzZDlcdWM3N2NcdWQ1NWMgXHVjODcwXHVhYzc0XHVjNzc0IFx1YzgwMVx1YzZhOVx1YjQyOVx1YjJjOFx1YjJlNC4NCmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9mZWF0dXJlX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9mZWF0dXJlX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYyYzRiNDcuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDEvZmVhdHVyZV9wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotZmVhdHVyZU5hbWU9UmVjdXJzbyBCYXNlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLWRlc2NyaXB0aW9uPVJlY3Vyc28gQmFzZSBFUEYuDQotdXBkYXRlU2l0ZU5hbWU9QXR1YWxpemFcdTAwZTdcdTAwZjVlcyBkZSBSZWN1cnNvcyBFUEYNCi1jb3B5cmlnaHQ9KGMpIENvcHlyaWdodCBjb250cmlidWlkb3JlcyBkbyBFY2xpcHNlIGUgdGVyY2Vpcm9zIDIwMDQsIDIwMDYuICBUb2RvcyBvcyBEaXJlaXRvcyBSZXNlcnZhZG9zLg0KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sDQotbGljZW5zZVRleHQ9TyB1c28gZGVzdGUgcmVjdXJzbyBlc3RcdTAwZTEgc3VqZWl0byBhb3MgbWVzbW9zIHRlcm1vcyBlIGNvbmRpXHUwMGU3XHUwMGY1ZXMgcXVlIGNvbnRyb2xhbSBvIHVzbyBkbyBQcm9kdXRvIHF1ZSBpbmNsdWl1IGVzdGUgcmVjdXJzby4NCmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9mZWF0dXJlX3poX0NOLnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9mZWF0dXJlX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRjOThiYzkuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDEvZmVhdHVyZV96aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotZmVhdHVyZU5hbWU9RVBGIEJhc2UgXHU1MjlmXHU4MGZkXHU5MGU4XHU0ZWY2DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249RVBGIEJhc2UgXHU1MjlmXHU4MGZkXHU5MGU4XHU0ZWY2XHUzMDAyDQotdXBkYXRlU2l0ZU5hbWU9RVBGIFx1NTI5Zlx1ODBmZFx1OTBlOFx1NGVmNlx1NjZmNFx1NjViMA0KLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbA0KLWxpY2Vuc2VUZXh0PVx1NmI2NFx1NTI5Zlx1ODBmZFx1OTBlOFx1NGVmNlx1NzY4NFx1NGY3Zlx1NzUyOFx1NGUwZVx1NTMwNVx1NTQyYlx1NmI2NFx1NTI5Zlx1ODBmZFx1OTBlOFx1NGVmNlx1NzY4NFx1NGVhN1x1NTRjMVx1NzY4NFx1NGY3Zlx1NzUyOFx1N2JhMVx1NzQwNlx1OTA3NVx1NWZhYVx1NzZmOFx1NTQwY1x1NzY4NFx1Njc2MVx1NmIzZVx1NTQ4Y1x1Njc2MVx1NGVmNlx1MzAwMg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2ZlYXR1cmVfemhfVFcucHJvcGVydGllcyBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2ZlYXR1cmVfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODAzOGY0Mi4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9mZWF0dXJlX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1mZWF0dXJlTmFtZT1FUEYgQmFzZSBcdTcyNzlcdTYwMjcNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi1kZXNjcmlwdGlvbj1FUEYgQmFzZSBcdTcyNzlcdTYwMjdcdTMwMDINCi11cGRhdGVTaXRlTmFtZT1FUEYgXHU3Mjc5XHU2MDI3XHU2NmY0XHU2NWIwDQotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbA0KLWxpY2Vuc2VUZXh0PVx1NjcyY1x1NzI3OVx1NjAyN1x1NGU0Ylx1NzUyOFx1OTAxNFx1ODk4Zlx1N2JjNFx1N2I0OVx1NTQwY1x1NjViY1x1NTMwNVx1NTQyYlx1NjcyY1x1NzI3OVx1NjAyN1x1NGU0Ylx1MzAwY1x1NzUyMlx1NTRjMVx1MzAwZFx1NzY4NFx1NGY3Zlx1NzUyOFx1Njg5ZFx1NmIzZVx1MzAwMg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2xpY2Vuc2UuaHRtbCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTVhMTBjZi4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPg0KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+DQotPC9oZWFkPg0KLQ0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPg0KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPg0KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPg0KLQ0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4NCi0NCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMNCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORA0KLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UNCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUg0KLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORA0KLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4NCi0gICANCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgDQotICAgDQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMA0KLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4NCi0NCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUw0KLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPg0KLSAgIA0KLTx1bD4NCi0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4NCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPg0KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMNCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4NCi0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+DQotPC91bD4gICANCi0gDQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQNCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQ0KLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4NCi0NCi08dWw+DQotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPg0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPg0KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+DQotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+DQotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4NCi08L3VsPg0KLQkJDQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUNCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3INCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuDQotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluDQotdGhhdCBkaXJlY3RvcnkuPC9wPg0KLQ0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFDQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+DQotDQotPHVsPg0KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+DQotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkNCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4NCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4NCi08L3VsPg0KLQ0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlDQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+DQotDQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+DQotDQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bw0KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LA0KLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPg0KLSAgIA0KLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIA0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDEvbGljZW5zZV9mci5odG1sIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDEvbGljZW5zZV9mci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MGZmZDAyLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2xpY2Vuc2VfZnIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KLTxodG1sPg0KLQ0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCi08TUVUQSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9IklCTSBXZWJTcGhlcmUgU3R1ZGlvIj4NCi08dGl0bGU+Q29udHJhdCBkZSBsaWNlbmNlIGRlIGxhIGZvbmN0aW9uPC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotDQotPGgzPkNvbnRyYXQgZGUgbGljZW5jZSBkZSBsYSBmb25jdGlvbjwvaDM+DQotDQotPHA+TCd1dGlsaXNhdGlvbiBkZSBjZXR0ZSBmb25jdGlvbiBkw6lwZW5kIGRlcyBtw6ptZXMgdGVybWVzIGV0IGNvbmRpdGlvbnMgcXVpIHLDqWdpc3NlbnQgbCd1dGlsaXNhdGlvbiBkdSBwcm9kdWl0IGluY2x1YW50IGNldHRlIGZvbmN0aW9uLjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2xpY2Vuc2VfamEuaHRtbCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwxL2xpY2Vuc2VfamEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDIzNzQ4OS4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMS9saWNlbnNlX2phLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi0NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQotPE1FVEEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJJQk0gV2ViU3BoZXJlIFN0dWRpbyI+DQotPHRpdGxlPuODleOCo+ODvOODgeODo+ODvOOBruOBlOS9v+eUqOadoeS7tjwvdGl0bGU+DQotPC9oZWFkPg0KLQ0KLTxib2R5Pg0KLQ0KLTxoMz7jg5XjgqPjg7zjg4Hjg6Pjg7zjga7jgZTkvb/nlKjmnaHku7Y8L2gzPg0KLQ0KLTxwPuOBk+OBruODleOCo+ODvOODgeODo+ODvOOBruS9v+eUqOOBq+OBr+OAgeOBk+OBruODleOCo+ODvOODgeODo+ODvOOCkuWQq+OCgOijveWTgeOBruS9v+eUqOOBq+WvvuOBl+OBpumBqeeUqOOBleOCjOOCi+OCguOBruOBqOWQjOOBmOOBlOS9v+eUqOadoeS7tuOBjOmBqeeUqOOBleOCjOOBvuOBmeOAgjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyLy5wcm9qZWN0IGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhjYWI5YTEuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmM2I4YWIuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXA0KLSAgICAgICAgICAgICAgIGZlYXR1cmVfcnUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sDQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDIvZmVhdHVyZS54bWwgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMi9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTdlZmI4ZS4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMi9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDIiCi0gICAgICBsYWJlbD0iRVBGIENvbXBvc2VyIEJhc2UgTkwyIEZlYXR1cmUiCi0gICAgICB2ZXJzaW9uPSIxLjIuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSJFY2xpcHNlIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2VUZXh0Ci0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3RlY2hub2xvZ3kvZXBmL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmNwLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnVtYS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDIvZmVhdHVyZV9ydS5wcm9wZXJ0aWVzIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDIvZmVhdHVyZV9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZmViNzFhLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyL2ZlYXR1cmVfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZlYXR1cmVOYW1lPVx1MDQxMVx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQ0Ylx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2JcdTA0MzVcdTA0M2FcdTA0NDIgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249XHUwNDExXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzYlx1MDQzNVx1MDQzYVx1MDQ0MiBFUEYuDQotdXBkYXRlU2l0ZU5hbWU9XHUwNDFlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIEVQRg0KLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi4gIFx1MDQxMlx1MDQ0MVx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDQ5XHUwNDM4XHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDRiLg0KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sDQotbGljZW5zZVRleHQ9XHUwNDE0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjXHUwNDQxXHUwNDRmIFx1MDQzZFx1MDQzMCBcdTA0NDJcdTA0MzVcdTA0NDUgXHUwNDM2XHUwNDM1IFx1MDQ0M1x1MDQ0MVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Zlx1MDQ0NSwgXHUwNDQ3XHUwNDQyXHUwNDNlIFx1MDQzOCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyLCBcdTA0MzIgXHUwNDQxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0M2VcdTA0M2QgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDQyLg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyL2xpY2Vuc2UuaHRtbCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTVhMTBjZi4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMi9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPg0KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+DQotPC9oZWFkPg0KLQ0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPg0KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPg0KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPg0KLQ0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4NCi0NCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMNCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORA0KLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UNCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUg0KLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORA0KLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4NCi0gICANCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgDQotICAgDQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMA0KLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4NCi0NCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUw0KLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPg0KLSAgIA0KLTx1bD4NCi0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4NCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPg0KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMNCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4NCi0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+DQotPC91bD4gICANCi0gDQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQNCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQ0KLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4NCi0NCi08dWw+DQotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPg0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPg0KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+DQotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+DQotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4NCi08L3VsPg0KLQkJDQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUNCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3INCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuDQotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluDQotdGhhdCBkaXJlY3RvcnkuPC9wPg0KLQ0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFDQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+DQotDQotPHVsPg0KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+DQotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkNCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4NCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4NCi08L3VsPg0KLQ0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlDQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+DQotDQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+DQotDQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bw0KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LA0KLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPg0KLSAgIA0KLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIA0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDIvbGljZW5zZV9ydS5odG1sIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDIvbGljZW5zZV9ydS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNjczYTgxLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyL2xpY2Vuc2VfcnUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KLTxodG1sPg0KLQ0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCi08TUVUQSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9IklCTSBXZWJTcGhlcmUgU3R1ZGlvIj4NCi08dGl0bGU+0JvQuNGG0LXQvdC30LjQvtC90L3QvtC1INGB0L7Qs9C70LDRiNC10L3QuNC1INC60L7QvNC/0LvQtdC60YLQsDwvdGl0bGU+DQotPC9oZWFkPg0KLQ0KLTxib2R5Pg0KLQ0KLTxoMz7Qm9C40YbQtdC90LfQuNC+0L3QvdC+0LUg0YHQvtCz0LvQsNGI0LXQvdC40LUg0LrQvtC80L/Qu9C10LrRgtCwPC9oMz4NCi0NCi08cD7QmtC+0LzQv9C70LXQutGCINC/0YDQtdC00L7RgdGC0LDQstC70Y/QtdGC0YHRjyDQvdCwINGD0YHQu9C+0LLQuNGP0YUg0LvQuNGG0LXQvdC30LjQvtC90L3QvtCz0L4g0YHQvtCz0LvQsNGI0LXQvdC40Y8g0L7RgdC90L7QstC90L7Qs9C+INC/0YDQvtC00YPQutGC0LAsINGBINC60L7RgtC+0YDRi9C8INC+0L0g0L/QvtGB0YLQsNCy0LvRj9C10YLRgdGPLjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyYS8ucHJvamVjdCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGZjZjRiYi4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMmEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyYS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDJhL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4N2YyZTkuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwNCi0gICAgICAgICAgICAgICBmZWF0dXJlX2RhLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbA0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyYS9mZWF0dXJlLnhtbCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyYS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2NhZGM3MS4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMmEvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyYSIKLSAgICAgIGxhYmVsPSJFUEYgQ29tcG9zZXIgQmFzZSBOTDJhIEZlYXR1cmUiCi0gICAgICB2ZXJzaW9uPSIxLjIuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSJFY2xpcHNlIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYmFzZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlVGV4dAotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90ZWNobm9sb2d5L2VwZi91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJjcC5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51bWEubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyYS9mZWF0dXJlX2RhLnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sMmEvZmVhdHVyZV9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZGM4YjgwLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyYS9mZWF0dXJlX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1mZWF0dXJlTmFtZT1FUEYgLSBiYXNpc2Z1bmt0aW9uDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249RVBGIC0gYmFzaXNmdW5rdGlvbi4NCi11cGRhdGVTaXRlTmFtZT1FUEYgLSBmdW5rdGlvbnNvcGRhdGVyaW5nZXINCi1jb3B5cmlnaHQ9KGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDYuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwNCi1saWNlbnNlVGV4dD1CcnVnZW4gYWYgZGVubmUgZnVua3Rpb24gZXIgdW5kZXJsYWd0IGRlIHNhbW1lIHZpbGtcdTAwZTVyLCBzb20gcmVndWxlcmVyIGJydWdlbiBhZiBkZXQgcHJvZHVrdCwgZGVyIGluZGVob2xkZXIgZGVubmUgZnVua3Rpb24uDQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDJhL2xpY2Vuc2UuaHRtbCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmwyYS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1YTEwY2YuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubDJhL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+DQotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+DQotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+DQotPHA+TWFyY2ggMTcsIDIwMDU8L3A+DQotDQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPg0KLQ0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUw0KLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EDQotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQ0KLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SDQotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EDQotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPg0KLSAgIA0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICANCi0gICANCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wDQotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTDQotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+DQotICAgDQotPHVsPg0KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPg0KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+DQotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucw0KLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPg0KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4NCi08L3VsPiAgIA0KLSANCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZA0KLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlDQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPg0KLQ0KLTx1bD4NCi0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+DQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+DQotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4NCi0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4NCi0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPg0KLTwvdWw+DQotCQkNCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQ0KLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcg0KLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4NCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4NCi10aGF0IGRpcmVjdG9yeS48L3A+DQotDQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UNCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4NCi0NCi08dWw+DQotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+DQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+DQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4NCi0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQ0KLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPg0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPg0KLTwvdWw+DQotDQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UNCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4NCi0NCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4NCi0NCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvDQotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsDQotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+DQotICAgDQotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvLnByb2plY3QgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiYmE4ZTUuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvYnVpbGQucHJvcGVydGllcyBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YWExNzQwLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXA0KLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgZmVhdHVyZV9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBmZWF0dXJlX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGZlYXR1cmVfZnIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgZmVhdHVyZV9pdC5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBmZWF0dXJlX2phLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGZlYXR1cmVfa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgZmVhdHVyZV9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBmZWF0dXJlX3poX0NOLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGZlYXR1cmVfemhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sDQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2ZlYXR1cmUucHJvcGVydGllcyBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyNWI2ZGYuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZlYXR1cmVOYW1lPUVQRiBQbGF0Zm9ybSBGZWF0dXJlIChOTDEpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249RVBGIFBsYXRmb3JtIEZlYXR1cmUuDQotdXBkYXRlU2l0ZU5hbWU9RVBGIEZlYXR1cmUgVXBkYXRlcw0KLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwNCi1saWNlbnNlVGV4dD1Vc2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHN1YmplY3QgdG8gdGhlIHNhbWUgdGVybXMgYW5kIGNvbmRpdGlvbnMgd2hpY2ggZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIFByb2R1Y3Qgd2hpY2ggaW5jbHVkZWQgdGhpcyBmZWF0dXJlLg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlLnhtbCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDE3Y2NhNS4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjIuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0iCi0gICAgICBvcz0ibGludXgsd2luMzIiCi0gICAgICB3cz0iZ3RrLHdpbjMyIgotICAgICAgYXJjaD0ieDg2IgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZVRleHQKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4yIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImNvbS5pYm0uaWN1Lm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmpvYnMubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5Lm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LmF1dGgubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5jb21tb25qLnNkby5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWRpdC5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJlY29yZS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJ4bWwubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24ubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlcy5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5Lm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdlZi5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAuYXBwc2VydmVyLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLnVpLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpmYWNlLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NnaS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGV4dC5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5mb3Jtcy5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaW50cm8ubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5jaGFuZ2UubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXQubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLndlYmFwcC5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRvbWNhdC5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc2VhcmNoLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnNzaC5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2gyLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnVpLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0udWkubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5jb25zb2xlLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5ubDEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMubmwxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZV9kZS5wcm9wZXJ0aWVzIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2ZlYXR1cmVfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Q2NTc5MC4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZV9kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotZmVhdHVyZU5hbWU9RVBGIC0gUGxhdHRmb3JtLUZlYXR1cmUNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi1kZXNjcmlwdGlvbj1FUEYtUGxhdHRmb3JtLUZlYXR1cmUuDQotdXBkYXRlU2l0ZU5hbWU9RVBGIC0gRmVhdHVyZS1Ba3R1YWxpc2llcnVuZ2VuDQotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbA0KLWxpY2Vuc2VUZXh0PURpZSBWZXJ3ZW5kdW5nIGRpZXNlcyBGZWF0dXJlcyB1bnRlcmxpZWd0IGRlbnNlbGJlbiBCZWRpbmd1bmdlbiwgZGllIGZcdTAwZmNyIGRpZSBWZXJ3ZW5kdW5nIGRlcyBQcm9kdWt0cyBnZWx0ZW4sIGRhcyBkaWVzZXMgRmVhdHVyZSBlbnRoXHUwMGU0bHQuDQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2ZlYXR1cmVfZXMucHJvcGVydGllcyBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4Yzc4NTIuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2ZlYXR1cmVfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZlYXR1cmVOYW1lPUNhcmFjdGVyXHUwMGVkc3RpY2EgZGUgbGEgcGxhdGFmb3JtYSBkZSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi1kZXNjcmlwdGlvbj1DYXJhY3Rlclx1MDBlZHN0aWNhIGRlIGxhIHBsYXRhZm9ybWEgZGUgRVBGLg0KLXVwZGF0ZVNpdGVOYW1lPUFjdHVhbGl6YWNpb25lcyBkZSBjYXJhY3Rlclx1MDBlZHN0aWNhIGRlIEVQRg0KLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IENvbGFib3JhZG9yZXMgZGUgRWNsaXBzZSB5IG90cm9zIDIwMDQsIDIwMDYuICBSZXNlcnZhZG9zIHRvZG9zIGxvcyBkZXJlY2hvcy4NCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbA0KLWxpY2Vuc2VUZXh0PUVsIHVzbyBkZSBlc3RhIGNhcmFjdGVyXHUwMGVkc3RpY2EgZXN0XHUwMGUxIHN1amV0byBhIGxvcyBtaXNtb3MgdFx1MDBlOXJtaW5vcyB5IGNvbmRpY2lvbmVzIHF1ZSByaWdlbiBlbCB1c28gZGVsIFByb2R1Y3RvIHF1ZSBpbmNsdXllIGVzdGEgY2FyYWN0ZXJcdTAwZWRzdGljYS4NCmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZV9mci5wcm9wZXJ0aWVzIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2ZlYXR1cmVfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWYwNTFmNC4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZV9mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotZmVhdHVyZU5hbWU9Rm9uY3Rpb24gcGxhdGVmb3JtZSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi1kZXNjcmlwdGlvbj1Gb25jdGlvbiBwbGF0ZWZvcm1lIEVQRi4NCi11cGRhdGVTaXRlTmFtZT1NaXNlcyBcdTAwZTAgam91ciBkZSBsYSBmb25jdGlvbiBFUEYNCi1jb3B5cmlnaHQ9KGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDYuICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sDQotbGljZW5zZVRleHQ9TCd1dGlsaXNhdGlvbiBkZSBjZXR0ZSBmb25jdGlvbiBkXHUwMGU5cGVuZCBkZXMgbVx1MDBlYW1lcyB0ZXJtZXMgZXQgY29uZGl0aW9ucyBxdWkgclx1MDBlOWdpc3NlbnQgbCd1dGlsaXNhdGlvbiBkdSBwcm9kdWl0IGluY2x1YW50IGNldHRlIGZvbmN0aW9uLg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlX2l0LnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZV9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NzZhNmRiLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1mZWF0dXJlTmFtZT1GdW56aW9uZSBwaWF0dGFmb3JtYSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi1kZXNjcmlwdGlvbj1GdW56aW9uZSBwaWF0dGFmb3JtYSBFUEYuDQotdXBkYXRlU2l0ZU5hbWU9QWdnaW9ybmFtZW50aSBmdW56aW9uZSBFUEYNCi1jb3B5cmlnaHQ9KGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDYuICBUdXR0aSBpIGRpcml0dGkgcmlzZXJ2YXRpLg0KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sDQotbGljZW5zZVRleHQ9TCd1c28gZGkgcXVlc3RhIGZ1bnppb25lIFx1MDBlOCBzb2dnZXR0byBhZ2xpIHN0ZXNzaSB0ZXJtaW5pIGUgY29uZGl6aW9uaSBjaGUgcmVnb2xhbm8gbCd1c28gZGVsIHByb2RvdHRvIGNoZSBmb3JuaXNjZSB0YWxlIGZ1bnppb25lLg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlX2phLnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZV9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YWYyYmE4Li4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1mZWF0dXJlTmFtZT1FUEYgUGxhdGZvcm0gRmVhdHVyZQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLWRlc2NyaXB0aW9uPUVQRiBcdTMwZDdcdTMwZTlcdTMwYzNcdTMwYzhcdTMwZDVcdTMwYTlcdTMwZmNcdTMwZTBcdTZhNWZcdTgwZmRcdTMwMDINCi11cGRhdGVTaXRlTmFtZT1FUEYgXHU2YTVmXHU4MGZkXHUzMDZlXHU2NmY0XHU2NWIwDQotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbA0KLWxpY2Vuc2VUZXh0PVx1MzA1M1x1MzA2ZVx1MzBkNVx1MzBhM1x1MzBmY1x1MzBjMVx1MzBlM1x1MzBmY1x1MzA2ZVx1NGY3Zlx1NzUyOFx1MzA2Ylx1MzA2Zlx1MzAwMVx1MzA1M1x1MzA2ZVx1MzBkNVx1MzBhM1x1MzBmY1x1MzBjMVx1MzBlM1x1MzBmY1x1MzA5Mlx1NTQyYlx1MzA4MFx1ODhmZFx1NTRjMVx1MzA2ZVx1NGY3Zlx1NzUyOFx1MzA2Ylx1NWJmZVx1MzA1N1x1MzA2Nlx1OTA2OVx1NzUyOFx1MzA1NVx1MzA4Y1x1MzA4Ylx1MzA4Mlx1MzA2ZVx1MzA2OFx1NTQwY1x1MzA1OFx1MzA1NFx1NGY3Zlx1NzUyOFx1Njc2MVx1NGVmNlx1MzA0Y1x1OTA2OVx1NzUyOFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1OVx1MzAwMg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlX2tvLnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZV9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZDIyY2NjLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1mZWF0dXJlTmFtZT1FUEYgXHVkNTBjXHViN2FiXHVkM2ZjIFx1YWUzMFx1YjJhNQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLWRlc2NyaXB0aW9uPUVQRiBcdWQ1MGNcdWI3YWJcdWQzZmMgXHVhZTMwXHViMmE1Lg0KLXVwZGF0ZVNpdGVOYW1lPUVQRiBcdWFlMzBcdWIyYTUgXHVhYzMxXHVjMmUwXHVjMGFjXHVkNTZkDQotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sDQotbGljZW5zZVRleHQ9XHViY2Y4IFx1YWUzMFx1YjJhNVx1Yzc1OCBcdWMwYWNcdWM2YTlcdWM1ZDAgXHViMzAwXHVkNTc0XHVjMTFjXHViMjk0IFx1YmNmOCBcdWFlMzBcdWIyYTVcdWM3NDQgXHVkM2VjXHVkNTY4XHVkNTU4XHViMjk0IFx1YzgxY1x1ZDQ4OFx1Yzc1OCBcdWMwYWNcdWM2YTlcdWM1ZDAgXHVjODAxXHVjNmE5XHViNDE4XHViMjk0IFx1YjNkOVx1Yzc3Y1x1ZDU1YyBcdWM4NzBcdWFjNzRcdWM3NzQgXHVjODAxXHVjNmE5XHViNDI5XHViMmM4XHViMmU0Lg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZV9wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NzlmYjM0Li4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1mZWF0dXJlTmFtZT1SZWN1cnNvIGRhIFBsYXRhZm9ybWEgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249UmVjdXJzbyBkYSBQbGF0YWZvcm1hIEVQRi4NCi11cGRhdGVTaXRlTmFtZT1BdHVhbGl6YVx1MDBlN1x1MDBmNWVzIGRlIFJlY3Vyc29zIEVQRg0KLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IGNvbnRyaWJ1aWRvcmVzIGRvIEVjbGlwc2UgZSB0ZXJjZWlyb3MgMjAwNCwgMjAwNi4gIFRvZG9zIG9zIERpcmVpdG9zIFJlc2VydmFkb3MuDQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwNCi1saWNlbnNlVGV4dD1PIHVzbyBkZXN0ZSByZWN1cnNvIGVzdFx1MDBlMSBzdWplaXRvIGFvcyBtZXNtb3MgdGVybW9zIGUgY29uZGlcdTAwZTdcdTAwZjVlcyBxdWUgY29udHJvbGFtIG8gdXNvIGRvIFByb2R1dG8gcXVlIGluY2x1aXUgZXN0ZSByZWN1cnNvLg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlX3poX0NOLnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZV96aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YmFlMTI2Li4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9mZWF0dXJlX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1mZWF0dXJlTmFtZT1FUEYgXHU1ZTczXHU1M2YwXHU1MjlmXHU4MGZkXHU5MGU4XHU0ZWY2DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249RVBGIFx1NWU3M1x1NTNmMFx1NTI5Zlx1ODBmZFx1OTBlOFx1NGVmNlx1MzAwMg0KLXVwZGF0ZVNpdGVOYW1lPUVQRiBcdTUyOWZcdTgwZmRcdTkwZThcdTRlZjZcdTY2ZjRcdTY1YjANCi1jb3B5cmlnaHQ9KGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDYuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwNCi1saWNlbnNlVGV4dD1cdTZiNjRcdTUyOWZcdTgwZmRcdTkwZThcdTRlZjZcdTc2ODRcdTRmN2ZcdTc1MjhcdTRlMGVcdTUzMDVcdTU0MmJcdTZiNjRcdTUyOWZcdTgwZmRcdTkwZThcdTRlZjZcdTc2ODRcdTRlYTdcdTU0YzFcdTc2ODRcdTRmN2ZcdTc1MjhcdTdiYTFcdTc0MDZcdTkwNzVcdTVmYWFcdTc2ZjhcdTU0MGNcdTc2ODRcdTY3NjFcdTZiM2VcdTU0OGNcdTY3NjFcdTRlZjZcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZV96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2ZlYXR1cmVfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQ0NGUyMC4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvZmVhdHVyZV96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotZmVhdHVyZU5hbWU9RVBGIFx1NWU3M1x1NTNmMFx1NzI3OVx1NjAyNw0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLWRlc2NyaXB0aW9uPUVQRiBcdTVlNzNcdTUzZjBcdTcyNzlcdTYwMjdcdTMwMDINCi11cGRhdGVTaXRlTmFtZT1FUEYgXHU3Mjc5XHU2MDI3XHU2NmY0XHU2NWIwDQotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbA0KLWxpY2Vuc2VUZXh0PVx1NjcyY1x1NzI3OVx1NjAyN1x1NGU0Ylx1NzUyOFx1OTAxNFx1ODk4Zlx1N2JjNFx1N2I0OVx1NTQwY1x1NjViY1x1NTMwNVx1NTQyYlx1NjcyY1x1NzI3OVx1NjAyN1x1NGU0Ylx1MzAwY1x1NzUyMlx1NTRjMVx1MzAwZFx1NzY4NFx1NGY3Zlx1NzUyOFx1Njg5ZFx1NmIzZVx1MzAwMg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9saWNlbnNlLmh0bWwgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNWExMGNmLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPg0KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+DQotPC9oZWFkPg0KLQ0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPg0KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPg0KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPg0KLQ0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4NCi0NCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMNCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORA0KLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UNCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUg0KLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORA0KLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4NCi0gICANCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgDQotICAgDQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMA0KLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4NCi0NCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUw0KLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPg0KLSAgIA0KLTx1bD4NCi0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4NCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPg0KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMNCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4NCi0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+DQotPC91bD4gICANCi0gDQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQNCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQ0KLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4NCi0NCi08dWw+DQotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPg0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPg0KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+DQotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+DQotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4NCi08L3VsPg0KLQkJDQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUNCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3INCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuDQotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluDQotdGhhdCBkaXJlY3RvcnkuPC9wPg0KLQ0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFDQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+DQotDQotPHVsPg0KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+DQotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkNCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4NCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4NCi08L3VsPg0KLQ0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlDQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+DQotDQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+DQotDQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bw0KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LA0KLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPg0KLSAgIA0KLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIA0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2xpY2Vuc2VfZW4uaHRtbCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9saWNlbnNlX2VuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1YTEwY2YuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2xpY2Vuc2VfZW4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+DQotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+DQotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+DQotPHA+TWFyY2ggMTcsIDIwMDU8L3A+DQotDQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPg0KLQ0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUw0KLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EDQotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQ0KLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SDQotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EDQotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPg0KLSAgIA0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICANCi0gICANCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wDQotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTDQotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+DQotICAgDQotPHVsPg0KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPg0KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+DQotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucw0KLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPg0KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4NCi08L3VsPiAgIA0KLSANCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZA0KLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlDQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPg0KLQ0KLTx1bD4NCi0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+DQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+DQotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4NCi0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4NCi0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPg0KLTwvdWw+DQotCQkNCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQ0KLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcg0KLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4NCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4NCi10aGF0IGRpcmVjdG9yeS48L3A+DQotDQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UNCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4NCi0NCi08dWw+DQotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+DQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+DQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4NCi0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQ0KLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPg0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPg0KLTwvdWw+DQotDQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UNCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4NCi0NCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4NCi0NCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvDQotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsDQotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+DQotICAgDQotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvbGljZW5zZV9mci5odG1sIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2xpY2Vuc2VfZnIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmYzNDQxNi4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDEvbGljZW5zZV9mci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQotPHRpdGxlPkNvbnRyYXQgZCd1dGlsaXNhdGlvbiBkdSBsb2dpY2llbCBkJ0VjbGlwc2Uub3JnPC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHkgbGFuZz0iRlItRlIiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+DQotPGgyPkNvbnRyYXQgZCd1dGlsaXNhdGlvbiBkdSBsb2dpY2llbCBkZSBsYSBmb25kYXRpb24gRWNsaXBzZTwvaDI+DQotPHA+MTcgbWFycyAyMDA1PC9wPg0KLQ0KLTxoMz5VdGlsaXNhdGlvbiBkdSBjb250ZW51PC9oMz4NCi0NCi08cD5MQSBGT05EQVRJT04gRUNMSVBTRSBGT1VSTklUIERFUyBMT0dJQ0lFTFMsIERFIExBIERPQ1VNRU5UQVRJT04sIERFUyBJTkZPUk1BVElPTlMgRVQvT1UgRCdBVVRSRVMgRE9DVU1FTlRTIERFU1RJTkVTIEEgREVTIFBST0pFVFMgQSBTT1VSQ0UgT1VWRVJURSAoQ09MTEVDVElWRU1FTlQgJnF1b3Q7Q09OVEVOVSZxdW90OykuIEwnVVRJTElTQVRJT04gRFUgQ09OVEVOVSBFU1QgUkVHSSBQQVIgTEVTIFRFUk1FUyBFVCBDT05ESVRJT05TIERFIENFIENPTlRSQVQgRVQvT1UgTEVTIFRFUk1FUyBFVCBDT05ESVRJT05TIERFUyBDT05UUkFUUyBERSBMSUNFTkNFIE9VIERFUyBNT0RBTElURVMgSU5ESVFVRUVTIE9VIFJFRkVSRU5DRUVTIENJLURFU1NPVVMuIEVOIFVUSUxJU0FOVCBMRSBDT05URU5VLCBWT1VTIEFDQ0VQVEVaIFFVRSBWT1RSRSBVVElMSVNBVElPTiBEVSBDT05URU5VIFNPSVQgUkVHSUUgUEFSIENFIENPTlRSQVQgRVQvT1UgTEVTIFRFUk1FUyBFVCBDT05ESVRJT05TIERFIFRPVVQgQ09OVFJBVCBERSBMSUNFTkNFIEFQUExJQ0FCTEUgT1UgREUgVE9VVEUgTU9EQUxJVEUgSU5ESVFVRUUgT1UgUkVGRVJFTkNFRSBDSS1ERVNTT1VTLiBTSSBWT1VTIE4nQUNDRVBURVogUEFTIExFUyBURVJNRVMgRVQgQ09ORElUSU9OUyBERSBDRSBDT05UUkFUIEVUIExFUyBURVJNRVMgRVQgQ09ORElUSU9OUyBERSBUT1VUIENPTlRSQVQgREUgTElDRU5DRSBBUFBMSUNBQkxFIE9VIERFUyBNT0RBTElURVMgSU5ESVFVRUVTIE9VIFJFRkVSRU5DRUVTIENJLURFU1NPVVMsIE4nVVRJTElTRVogUEFTIExFIENPTlRFTlUuPC9wPg0KLSAgIA0KLTxoMz5MaWNlbmNlcyBhcHBsaWNhYmxlczwvaDM+ICAgDQotICAgDQotPHA+U2F1ZiBpbmRpY2F0aW9uIGNvbnRyYWlyZSwgdG91dCBjb250ZW51IG1pcyDDoCBkaXNwb3NpdGlvbiBwYXIgbGEgRm9uZGF0aW9uIEVjbGlwc2Ugdm91cyBlc3QgZm91cm5pIGNvbmZvcm3DqW1lbnQgYXV4IHRlcm1lcyBldCBjb25kaXRpb25zIGQnRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMA0KLSAgICgmcXVvdDtFUEwmcXVvdDspLiBVbmUgY29waWUgZGUgbCdFUEwgZXN0IGZvdXJuaWUgYXZlYyBjZSBjb250ZW51LCB2b3VzIHBvdXZleiDDqWdhbGVtZW50IGxhIGNvbnN1bHRlciDDoCBsJ2FkcmVzc2Ugc3VpdmFudGUgOiA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+Lg0KLURhbnMgbGUgY2FkcmUgZGUgbCdFUEwsIGxlIHRlcm1lICZxdW90O1Byb2dyYW1tZSZxdW90OyBzaWduaWZpZSAiQ29udGVudSIuPC9wPg0KLQ0KLTxwPkxlIGNvbnRlbnUgaW5jbHV0LCBzYW5zIHMneSBsaW1pdGVyLCBsZSBjb2RlIHNvdXJjZSwgbGUgY29kZSBvYmpldCwgbGEgZG9jdW1lbnRhdGlvbiBldCBsZXMgYXV0cmVzIGZpY2hpZXJzIGZpZ3VyYW50IGRhbnMgbGUgcsOpZsOpcmVudGllbCAoJnF1b3Q7UsOpZsOpcmVudGllbCZxdW90OykgQ1ZTIGR1IHNpdGUgRWNsaXBzZS5vcmcgZXQgZGFucyBsZXMgbW9kdWxlcyBDVlMNCi0oJnF1b3Q7TW9kdWxlcyZxdW90OykgZXQgbWlzIMOgIGRpc3Bvc2l0aW9uIHNvdXMgZm9ybWUgZCdhcmNoaXZlcyB0w6lsw6ljaGFyZ2VhYmxlcyAoJnF1b3Q7VMOpbMOpY2hhcmdlbWVudHMmcXVvdDspLjwvcD4NCi0gICANCi08dWw+DQotCTxsaT5MZSBjb250ZW51IHBldXQgw6p0cmUgc3RydWN0dXLDqSBldCBtaXMgZW4gZm9ybWUgZGFucyBkZXMgbW9kdWxlcyBwb3VyIGZhY2lsaXRlciBsYSBsaXZyYWlzb24sIGxlIGTDqXZlbG9wcGVtZW50IGV0IGxhIG1pc2Ugw6Agbml2ZWF1IGR1IGNvbnRlbnUuIERlcyBtb2R1bGVzIGNsYXNzaXF1ZXMgcGV1dmVudCBpbmNsdXJlIGRlcyBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBkZXMgZnJhZ21lbnRzIGRlIHBsdWctaW4gKCZxdW90O0ZyYWdtZW50cyZxdW90OykgYWluc2kgcXVlIGRlcyBmb25jdGlvbnMgKCZxdW90O0ZvbmN0aW9ucyZxdW90OykuPC9saT4NCi0JPGxpPkNoYXF1ZSBwbHVnLWluIG91IGZyYWdtZW50IHBldXQgw6p0cmUgbWlzIGVuIGZvcm1lIGVuIHRhbnQgcXVlIHNvdXMtcsOpcGVydG9pcmUgb3UgSkFSIChBcmNoaXZlIEphdmEmdHJhZGU7KSBkYW5zIHVuIHLDqXBlcnRvaXJlIGTDqW5vbW3DqSAmcXVvdDtwbHVnLWlucyZxdW90Oy48L2xpPg0KLQk8bGk+VW5lIGZvbmN0aW9uIHJlZ3JvdXBlIHVuIG91IHBsdXNpZXVycyBwbHVnLWlucyBldC9vdSBkZXMgZnJhZ21lbnRzIGV0IGRlcyBkb2N1bWVudHMgYXNzb2Npw6lzLiBDaGFxdWUgZm9uY3Rpb24gcGV1dCDDqnRyZSBtaXNlIGVuIGZvcm1lIGVuIHRhbnQgcXVlIHNvdXMtcsOpcGVydG9pcmUgZGFucyB1biByw6lwZXJ0b2lyZSBkw6lub21tw6kgJnF1b3Q7Zm9uY3Rpb25zJnF1b3Q7LiBEYW5zIHVuZSBmb25jdGlvbiwgbGVzIGZpY2hpZXJzIGTDqW5vbW3DqXMgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgcGV1dmVudCBjb250ZW5pciB1bmUgbGlzdGUgZGVzIG5vbXMgZXQgbnVtw6lyb3MgZGUgdmVyc2lvbiBkZXMgcGx1Zy1pbnMNCi0gICAgICBldC9vdSBkZXMgZnJhZ21lbnRzIGFzc29jacOpcyDDoCBjZXR0ZSBmb25jdGlvbi48L2xpPg0KLQk8bGk+TGVzIGZvbmN0aW9ucyBwZXV2ZW50IMOpZ2FsZW1lbnQgaW5jbHVyZSBkJ2F1dHJlcyBmb25jdGlvbnMgKCZxdW90O0ZvbmN0aW9ucyBpbmNsdXNlcyZxdW90OykuIERhbnMgdW5lIGZvbmN0aW9uLCBsZXMgZmljaGllcnMgZMOpbm9tbcOpcyAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBwZXV2ZW50IGNvbnRlbmlyIHVuZSBsaXN0ZSBkZXMgbm9tcyBldCBudW3DqXJvcyBkZSB2ZXJzaW9uIGRlcyBmb25jdGlvbnMgaW5jbHVzZXMuPC9saT4NCi08L3VsPiAgIA0KLSANCi08cD5MZXMgdGVybWVzIGV0IGNvbmRpdGlvbnMgcsOpZ2lzc2FudCBsZXMgcGx1Zy1pbnMgZXQgbGVzIGZyYWdtZW50cyBkb2l2ZW50IGZpZ3VyZXIgZGFucyBsZXMgZmljaGllcnMgZMOpbm9tbcOpcyAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBIHByb3BvcyBkZSZxdW90OykuIExlcyB0ZXJtZXMgZXQgY29uZGl0aW9ucyByw6lnaXNzYW50IGxlcyBmb25jdGlvbnMgZXQNCi1sZXMgZm9uY3Rpb25zIGluY2x1c2VzIGRvaXZlbnQgZmlndXJlciBkYW5zIGxlcyBmaWNoaWVycyBkw6lub21tw6lzICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7TGljZW5jZXMgZGVzIGZvbmN0aW9ucyZxdW90OykuIExlcyBpbmZvcm1hdGlvbnMgcHJvZHVpdCAoQSBwcm9wb3MgZGUpIGV0IGxlcyBsaWNlbmNlcyBkZXMgZm9uY3Rpb25zIHBldXZlbnQgc2UgdHJvdXZlciBkYW5zIG4naW1wb3J0ZSBxdWVsIHLDqXBlcnRvaXJlIGRlIHTDqWzDqWNoYXJnZW1lbnQgb3UgZGUgbW9kdWxlDQoteSBjb21wcmlzLCBtYWlzIG5vbiBsaW1pdMOpIGF1eCBlbXBsYWNlbWVudHMgc3VpdmFudHMgOjwvcD4NCi0NCi08dWw+DQotCTxsaT5MZSByw6lwZXJ0b2lyZSBkZSBuaXZlYXUgc3Vww6lyaWV1ciAocmFjaW5lKTwvbGk+DQotCTxsaT5MZXMgcsOpcGVydG9pcmVzIGRlIHBsdWctaW5zIGV0IGRlIGZyYWdtZW50czwvbGk+DQotCTxsaT5MZXMgcGx1Zy1pbnMgZXQgbGVzIGZyYWdtZW50cyBpbnRlcm5lcyBtaXMgZW4gZm9ybWUgZW4gdGFudCBxdWUgSkFSIChhcmNoaXZlcyBKYXZhKTwvbGk+DQotCTxsaT5MZXMgc291cy1yw6lwZXJ0b2lyZXMgZHUgcsOpcGVydG9pcmUgZMOpbm9tbcOpICZxdW90O3NyYyZxdW90OyBkZSBjZXJ0YWlucyBwbHVnLWluczwvbGk+DQotCTxsaT5MZXMgcsOpcGVydG9pcmVzIGRlIGZvbmN0aW9uczwvbGk+DQotPC91bD4NCi0JCQ0KLTxwPlJlbWFycXVlIDogc2kgdW5lIGZvbmN0aW9uIGZvdXJuaWUgcGFyIGxhIEZvbmRhdGlvbiBFY2xpcHNlIGVzdCBpbnN0YWxsw6llIMOgIGwnYWlkZSBkdSBnZXN0aW9ubmFpcmUgZGUgbWlzZSDDoCBqb3VyIGQnRWNsaXBzZSwgdm91cyBkZXZleiBhY2NlcHRlciBsYSBsaWNlbmNlICgmcXVvdDtMaWNlbmNlIGRlIG1pc2Ugw6Agam91ciBkZSBsYSBmb25jdGlvbiZxdW90OykgbG9ycyBkdQ0KLXByb2Nlc3N1cyBkJ2luc3RhbGxhdGlvbi4gU2kgbGEgZm9uY3Rpb24gY29udGllbnQgZGVzIGZvbmN0aW9ucyBpbmNsdXNlcywgbGEgbGljZW5jZSBkZSBtaXNlIMOgIGpvdXIgZGUgbGEgZm9uY3Rpb24gZG9pdCB2b3VzIGZvdXJuaXIgbGVzIHRlcm1lcyBldCBjb25kaXRpb25zIHLDqWdpc3NhbnQgbGVzIGZvbmN0aW9ucyBpbmNsdXNlcyBvdSB2b3VzIGluZm9ybWVyIGRlIGwnZW5kcm9pdCBvw7kgaWxzIHNlIHRyb3V2ZW50LiBMZXMgbGljZW5jZXMgZGUgbWlzZSDDoCBqb3VyIGRlIGxhIGZvbmN0aW9uIHNlIHRyb3V2ZW50IGRhbnMgbGEgcHJvcHJpw6l0w6kgJnF1b3Q7bGljZW5jZSZxdW90OyBkZXMgZmljaGllcnMgZMOpbm9tbcOpcyAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZmlndXJhbnQgZGFucyB1bmUgZm9uY3Rpb24uDQotRGUgdGVsbGVzIGluZm9ybWF0aW9ucyBwcm9kdWl0IChBIHByb3BvcyBkZSksIGxpY2VuY2VzIGRlIGZvbmN0aW9ucyBldCBsaWNlbmNlcyBkZSBtaXNlcyDDoCBqb3VyIGRlIGxhIGZvbmN0aW9uIGNvbnRpZW5uZW50IGxlcyB0ZXJtZXMgZXQgY29uZGl0aW9ucyAob3UgbGVzIHLDqWbDqXJlbmNlcyBhdXggZGl0cyB0ZXJtZXMgZXQgY29uZGl0aW9ucykgcXVpIHLDqWdpc3NlbnQgdm90cmUgdXRpbGlzYXRpb24gZHUgY29udGVudSBhc3NvY2nDqSBkYW5zIGNlIHLDqXBlcnRvaXJlLjwvcD4NCi0NCi08cD5MRVMgSU5GT1JNQVRJT05TIFBST0RVSVQgKEEgUFJPUE9TIERFKSwgTEVTIExJQ0VOQ0VTIERFIEZPTkNUSU9OUyBFVCBMRVMgTElDRU5DRVMgREUgTUlTRVMgQSBKT1VSIERFIExBIEZPTkNUSU9OIFBFVVZFTlQgU0UgUkVGRVJFUiBBIEwnRVBMIE9VIEEgRCdBVVRSRVMgQ09OVFJBVFMgREUgTElDRU5DRSwgTU9EQUxJVEVTIE9VIFRFUk1FUyBFVCBDT05ESVRJT05TLiBDRVJUQUlOUyBERSBDRVMgQVVUUkVTIENPTlRSQVRTIERFIExJQ0VOQ0UgUEVVVkVOVCBJTkNMVVJFIChNQUlTIFNBTlMgUydZIExJTUlURVIpIDo8L3A+DQotDQotPHVsPg0KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChkaXNwb25pYmxlIMOgIGwnYWRyZXNzZSBzdWl2YW50ZSA6IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4NCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoZGlzcG9uaWJsZSDDoCBsJ2FkcmVzc2Ugc3VpdmFudGUgOiA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+DQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGRpc3BvbmlibGUgw6AgbCdhZHJlc3NlIHN1aXZhbnRlIDogPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+DQotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChkaXNwb25pYmxlIMOgIGwnYWRyZXNzZSBzdWl2YW50ZSA6IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JDQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGRpc3BvbmlibGUgw6AgbCdhZHJlc3NlIHN1aXZhbnRlIDogPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPg0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoZGlzcG9uaWJsZSDDoCBsJ2FkcmVzc2Ugc3VpdmFudGUgOiA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4NCi08L3VsPg0KLQ0KLTxwPklMIEVTVCBERSBWT1RSRSBSRVNQT05TQUJJTElURSBERSBMSVJFIEVUIEQnQUNDRVBURVIgTCdFTlNFTUJMRSBERSBDRVMgVEVSTUVTIEVUIENPTkRJVElPTlMgQVZBTlQgRCdVVElMSVNFUiBMRSBDT05URU5VLiBTaSBhdWN1bmUgaW5mb3JtYXRpb24gcHJvZHVpdCAoQSBwcm9wb3MgZGUpLCBsaWNlbmNlIGRlIGZvbmN0aW9uIG91IGxpY2VuY2UgZGUgbWlzZSDDoCBqb3VyIGRlIGxhIGZvbmN0aW9uIG4nZXN0IGZvdXJuaWUsDQotY29udGFjdGV6IGxhIEZvbmRhdGlvbiBFY2xpcHNlIHBvdXIgZMOpdGVybWluZXIgcXVlbHMgdGVybWVzIGV0IGNvbmRpdGlvbnMgcsOpZ2lzc2VudCBjZSBjb250ZW51IHByw6ljaXMuPC9wPg0KLQ0KLTxoMz5DcnlwdG9ncmFwaGllPC9oMz4NCi0NCi08cD5MZSBjb250ZW51IHBldXQgaW5jbHVyZSB1biBsb2dpY2llbCBkZSBjcnlwdGFnZS4gTGUgcGF5cyBkYW5zIGxlcXVlbCB2b3VzIHZvdXMgdHJvdXZleiBhY3R1ZWxsZW1lbnQgcGV1dCDDqnRyZSBzb3VtaXMgw6AgZGVzIHJlc3RyaWN0aW9ucyBkJ2ltcG9ydGF0aW9uLCBkZSBwb3NzZXNzaW9uLCBkJ3V0aWxpc2F0aW9uIGV0L291IGRlIHLDqWV4cG9ydGF0aW9uIHZlcnMgdW4gYXV0cmUgcGF5cyBkdSBsb2dpY2llbCBkZSBjcnlwdGFnZS4gQVZBTlQgZCd1dGlsaXNlciB1biBsb2dpY2llbCBkZSBjcnlwdGFnZSwgdsOpcmlmaWV6IHNpIGxhIGxvaSBuYXRpb25hbGUsIGxlcyByw6hnbGVzIGV0IGxlcyBwb2xpdGlxdWVzIGVuIHZpZ3VldXIsIHJlbGF0aXZlcyDDoCBsJ2ltcG9ydGF0aW9uLCBsYSBwb3NzZXNzaW9uIG91IGwndXRpbGlzYXRpb24gZXQgbGEgcsOpZXhwb3J0YXRpb24gZHUgbG9naWNpZWwgZGUgY3J5cHRhZ2UgbCdhdXRvcmlzZW50LjwvcD4NCi0gICANCi08c21hbGw+SmF2YSBhaW5zaSBxdWUgdG91dGVzIGxlcyBtYXJxdWVzIGluY2x1YW50IEphdmEgc29udCBkZXMgbWFycXVlcyBkZSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGF1eCBFdGF0cy1VbmlzLCBldC9vdSBkYW5zIGNlcnRhaW5zIGF1dHJlcyBwYXlzLjwvc21hbGw+IA0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2xpY2Vuc2VfamEuaHRtbCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMS9saWNlbnNlX2phLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlOWJkYTEuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwxL2xpY2Vuc2VfamEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+DQotPC9oZWFkPg0KLQ0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPg0KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPg0KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPg0KLQ0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4NCi0NCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMNCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORA0KLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UNCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUg0KLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORA0KLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4NCi0gICANCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgDQotICAgDQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMA0KLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4NCi0NCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUw0KLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPg0KLSAgIA0KLTx1bD4NCi0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4NCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPg0KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMNCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4NCi0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+DQotPC91bD4gICANCi0gDQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQNCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQ0KLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4NCi0NCi08dWw+DQotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPg0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPg0KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+DQotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+DQotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4NCi08L3VsPg0KLQkJDQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUNCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3INCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuDQotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluDQotdGhhdCBkaXJlY3RvcnkuPC9wPg0KLQ0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFDQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+DQotDQotPHVsPg0KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+DQotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkNCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4NCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4NCi08L3VsPg0KLQ0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlDQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+DQotDQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+DQotDQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bw0KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LA0KLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPg0KLSAgIA0KLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIA0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyLy5wcm9qZWN0IGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmM2YzMzhkLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2FmODBlYS4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXA0KLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgZmVhdHVyZV9ydS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwNCmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDIvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTI1YjZkZi4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDIvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotZmVhdHVyZU5hbWU9RVBGIFBsYXRmb3JtIEZlYXR1cmUgKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi1kZXNjcmlwdGlvbj1FUEYgUGxhdGZvcm0gRmVhdHVyZS4NCi11cGRhdGVTaXRlTmFtZT1FUEYgRmVhdHVyZSBVcGRhdGVzDQotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbA0KLWxpY2Vuc2VUZXh0PVVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgc3ViamVjdCB0byB0aGUgc2FtZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB3aGljaCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgUHJvZHVjdCB3aGljaCBpbmNsdWRlZCB0aGlzIGZlYXR1cmUuDQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyL2ZlYXR1cmUueG1sIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNjI3Y2ZkLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMi9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMi4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybSIKLSAgICAgIG9zPSJsaW51eCx3aW4zMiIKLSAgICAgIHdzPSJndGssd2luMzIiCi0gICAgICBhcmNoPSJ4ODYiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlVGV4dAotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjIiLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iY29tLmlibS5pY3UubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuNC40LnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hbnQuY29yZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjEwMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjEuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5qb2JzLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjEwMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkuYXV0aC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMTAwLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5jb21tb25qLnNkby5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4xLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWRpdC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJlY29yZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLmVjb3JlMnhtbC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlcy5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnkubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nZWYubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscC5hcHBzZXJ2ZXIubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4xMDAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAudWkubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZmFjZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2dpLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGV4dC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5mb3Jtcy5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmludHJvLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5jaGFuZ2UubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8ubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLndlYmFwcC5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudG9tY2F0Lm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSI0LjEuMTMwLnYyMDA2MDYyMjAwMjYiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zZWFyY2gubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2gubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2gyLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMudWkubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLnVpLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmNvbnNvbGUubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4xMDAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5ubDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDYwNjIyMDAyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMubmwyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA2MDYyMjAwMjYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNjA2MjIwMDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjEuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDIvZmVhdHVyZV9ydS5wcm9wZXJ0aWVzIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyL2ZlYXR1cmVfcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjk0ZjEwYS4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDIvZmVhdHVyZV9ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotZmVhdHVyZU5hbWU9XHUwNDFmXHUwNDNiXHUwNDMwXHUwNDQyXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLWRlc2NyaXB0aW9uPVx1MDQxZlx1MDQzYlx1MDQzMFx1MDQ0Mlx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMCBFUEYNCi11cGRhdGVTaXRlTmFtZT1cdTA0MWVcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgRVBGDQotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiAgXHUwNDEyXHUwNDQxXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzMCBcdTA0MzdcdTA0MzBcdTA0NDlcdTA0MzhcdTA0NDlcdTA0MzVcdTA0M2RcdTA0NGIuDQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwNCi1saWNlbnNlVGV4dD1cdTA0MTRcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNjXHUwNDNmXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzY1x1MDQzZVx1MDQzNlx1MDQzNVx1MDQ0MiBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGNcdTA0NDFcdTA0NGYgXHUwNDNkXHUwNDMwIFx1MDQ0Mlx1MDQzNVx1MDQ0NSBcdTA0MzZcdTA0MzUgXHUwNDQzXHUwNDQxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDRmXHUwNDQ1LCBcdTA0NDdcdTA0NDJcdTA0M2UgXHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDIsIFx1MDQzMiBcdTA0NDFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzIgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZVx1MDQzZCBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDIuDQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyL2xpY2Vuc2UuaHRtbCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMi9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1YTEwY2YuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+DQotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+DQotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+DQotPHA+TWFyY2ggMTcsIDIwMDU8L3A+DQotDQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPg0KLQ0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUw0KLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EDQotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQ0KLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SDQotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EDQotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPg0KLSAgIA0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICANCi0gICANCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wDQotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTDQotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+DQotICAgDQotPHVsPg0KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPg0KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+DQotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucw0KLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPg0KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4NCi08L3VsPiAgIA0KLSANCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZA0KLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlDQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPg0KLQ0KLTx1bD4NCi0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+DQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+DQotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4NCi0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4NCi0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPg0KLTwvdWw+DQotCQkNCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQ0KLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcg0KLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4NCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4NCi10aGF0IGRpcmVjdG9yeS48L3A+DQotDQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UNCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4NCi0NCi08dWw+DQotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+DQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+DQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4NCi0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQ0KLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPg0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPg0KLTwvdWw+DQotDQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UNCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4NCi0NCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4NCi0NCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvDQotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsDQotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+DQotICAgDQotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDIvbGljZW5zZV9lbi5odG1sIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyL2xpY2Vuc2VfZW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTVhMTBjZi4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDIvbGljZW5zZV9lbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCi08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4NCi08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4NCi08cD5NYXJjaCAxNywgMjAwNTwvcD4NCi0NCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+DQotDQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTDQotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQNCi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFDQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1INCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQNCi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+DQotICAgDQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIA0KLSAgIA0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjANCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+Lg0KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+DQotDQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMNCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4NCi0gICANCi08dWw+DQotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+DQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4NCi0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zDQotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+DQotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPg0KLTwvdWw+ICAgDQotIA0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kDQotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUNCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+DQotDQotPHVsPg0KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4NCi0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4NCi0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPg0KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPg0KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+DQotPC91bD4NCi0JCQ0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlDQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yDQotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLg0KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbg0KLXRoYXQgZGlyZWN0b3J5LjwvcD4NCi0NCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQ0KLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPg0KLQ0KLTx1bD4NCi0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4NCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4NCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPg0KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JDQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+DQotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+DQotPC91bD4NCi0NCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQ0KLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPg0KLQ0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPg0KLQ0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8NCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwNCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4NCi0gICANCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICANCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMi9saWNlbnNlX3J1Lmh0bWwgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDIvbGljZW5zZV9ydS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDEwYTE2Li4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMi9saWNlbnNlX3J1Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCi08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keSBsYW5nPSJSVS1SVSIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4NCi08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4NCi08cD5NYXJjaCAxNywgMjAwNTwvcD4NCi0NCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+DQotDQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTDQotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQNCi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFDQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1INCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQNCi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+DQotICAgDQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIA0KLSAgIA0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjANCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+Lg0KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+DQotDQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMNCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4NCi0gICANCi08dWw+DQotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+DQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4NCi0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMNCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4NCi0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+DQotPC91bD4gICANCi0gDQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQNCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQ0KLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4NCi0NCi08dWw+DQotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPg0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPg0KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+DQotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+DQotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4NCi08L3VsPg0KLQkJDQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUNCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3INCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuDQotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluDQotdGhhdCBkaXJlY3RvcnkuPC9wPg0KLQ0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFDQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+DQotDQotPHVsPg0KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+DQotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkNCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4NCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4NCi08L3VsPg0KLQ0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlDQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+DQotDQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+DQotDQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bw0KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LA0KLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPg0KLSAgIA0KLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIA0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyYS8ucHJvamVjdCBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMmEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ5ZWEyZTIuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMmEvYnVpbGQucHJvcGVydGllcyBiL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTdiMTJlNy4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwNCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGZlYXR1cmVfZGEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sDQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyYS9mZWF0dXJlLnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDJhL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTI1YjZkZi4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDJhL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZlYXR1cmVOYW1lPUVQRiBQbGF0Zm9ybSBGZWF0dXJlIChOTDEpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249RVBGIFBsYXRmb3JtIEZlYXR1cmUuDQotdXBkYXRlU2l0ZU5hbWU9RVBGIEZlYXR1cmUgVXBkYXRlcw0KLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwNCi1saWNlbnNlVGV4dD1Vc2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHN1YmplY3QgdG8gdGhlIHNhbWUgdGVybXMgYW5kIGNvbmRpdGlvbnMgd2hpY2ggZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIFByb2R1Y3Qgd2hpY2ggaW5jbHVkZWQgdGhpcyBmZWF0dXJlLg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMmEvZmVhdHVyZS54bWwgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDJhL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNTU4MmUxLi4wMDAwMDAwCi0tLSBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMmEvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMmEiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtIgotICAgICAgb3M9ImxpbnV4LHdpbjMyIgotICAgICAgd3M9Imd0ayx3aW4zMiIKLSAgICAgIGFyY2g9Ing4NiIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2VUZXh0Ci0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMiIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJjb20uaWJtLmljdS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYW50LmNvcmUubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5qb2JzLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkuYXV0aC5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24ubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5jb21tb25qLnNkby5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWRpdC5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQudWkubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJlY29yZS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyeG1sLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbi5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlcy5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ2VmLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLmFwcHNlcnZlci5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscC5iYXNlLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLnVpLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZmFjZS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamZhY2UudGV4dC5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NnaS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZXh0Lm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmZvcm1zLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmludHJvLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmNoYW5nZS5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXQubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8ubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAud2ViYXBwLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRvbWNhdC5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zZWFyY2gubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnNzaC5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMuc3NoMi5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMudWkubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0udWkubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmNvbnNvbGUubmwyYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5ubDJhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMmEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyYS9mZWF0dXJlX2RhLnByb3BlcnRpZXMgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDJhL2ZlYXR1cmVfZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDQ3OTY1Ni4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDJhL2ZlYXR1cmVfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZlYXR1cmVOYW1lPUVQRiAtIHBsYXRmb3Jtc2Z1bmt0aW9uDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotZGVzY3JpcHRpb249RVBGIC0gcGxhdGZvcm1zZnVua3Rpb24uDQotdXBkYXRlU2l0ZU5hbWU9RVBGIC0gZnVua3Rpb25zb3BkYXRlcmluZ2VyDQotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sDQotbGljZW5zZVRleHQ9QnJ1Z2VuIGFmIGRlbm5lIGZ1bmt0aW9uIGVyIHVuZGVybGFndCBkZSBzYW1tZSB2aWxrXHUwMGU1ciwgc29tIHJlZ3VsZXJlciBicnVnZW4gYWYgZGV0IHByb2R1a3QsIGRlciBpbmRlaG9sZGVyIGRlbm5lIGZ1bmt0aW9uLg0KZGlmZiAtLWdpdCBhL25sX2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sMmEvbGljZW5zZS5odG1sIGIvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyYS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1YTEwY2YuLjAwMDAwMDAKLS0tIGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyYS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPg0KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+DQotPC9oZWFkPg0KLQ0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPg0KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPg0KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPg0KLQ0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4NCi0NCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMNCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORA0KLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UNCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUg0KLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORA0KLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4NCi0gICANCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgDQotICAgDQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMA0KLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4NCi0NCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUw0KLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPg0KLSAgIA0KLTx1bD4NCi0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4NCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPg0KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMNCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4NCi0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+DQotPC91bD4gICANCi0gDQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQNCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQ0KLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4NCi0NCi08dWw+DQotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPg0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPg0KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+DQotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+DQotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4NCi08L3VsPg0KLQkJDQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUNCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3INCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuDQotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluDQotdGhhdCBkaXJlY3RvcnkuPC9wPg0KLQ0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFDQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+DQotDQotPHVsPg0KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPg0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+DQotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkNCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4NCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4NCi08L3VsPg0KLQ0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlDQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+DQotDQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+DQotDQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bw0KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LA0KLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPg0KLSAgIA0KLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIA0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmwyYS9saWNlbnNlX2VuLmh0bWwgYi9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDJhL2xpY2Vuc2VfZW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTVhMTBjZi4uMDAwMDAwMAotLS0gYS9ubF9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubDJhL2xpY2Vuc2VfZW4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+DQotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+DQotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+DQotPHA+TWFyY2ggMTcsIDIwMDU8L3A+DQotDQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPg0KLQ0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUw0KLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EDQotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQ0KLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SDQotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EDQotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPg0KLSAgIA0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICANCi0gICANCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wDQotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTDQotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+DQotICAgDQotPHVsPg0KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPg0KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+DQotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucw0KLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPg0KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4NCi08L3VsPiAgIA0KLSANCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZA0KLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlDQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPg0KLQ0KLTx1bD4NCi0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+DQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+DQotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4NCi0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4NCi0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPg0KLTwvdWw+DQotCQkNCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQ0KLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcg0KLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4NCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4NCi10aGF0IGRpcmVjdG9yeS48L3A+DQotDQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UNCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4NCi0NCi08dWw+DQotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+DQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+DQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4NCi0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQ0KLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPg0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPg0KLTwvdWw+DQotDQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UNCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4NCi0NCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4NCi0NCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvDQotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsDQotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+DQotICAgDQotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhNWJjYzIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDVlMjhjNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZnJhZ21lbnROYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwxLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGZyYWdtZW50Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZmNzNiOTkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotc291cmNlLm5sMS5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMS5qYXIgPSBiaW4vDQotYmluLmluY2x1ZGVzID0gbmwxLmphcixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBubC8NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL2ZyYWdtZW50LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL2ZyYWdtZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU3OTdjZTMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9mcmFnbWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mcmFnbWVudE5hbWU9RVBGIENvbXBvc2VyIEF1dGhvcmluZyBVSSAoTkwxKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OWU2NTJmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBCZW51dHplcnNjaG5pdHRzdGVsbGUgZlx1MDBmY3IgQXV0aG9yaW5nDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBDYXRlZ29yeQ0KLW1ldGhvZENhdGVnb3J5TmFtZT1NZXRob2RlDQotDQotIyBQZXJzcGVjdGl2ZQ0KLWF1dGhvcmluZ1BlcnNwZWN0aXZlTmFtZT1BdXRob3JpbmcNCi1icm93c2luZ1BlcnNwZWN0aXZlTmFtZT1Ccm93c2luZw0KLQ0KLSMgVmlld3MNCi1saWJyYXJ5Vmlld05hbWU9QmlibGlvdGhlaw0KLWNvbmZpZ3VyYXRpb25WaWV3TmFtZT1Lb25maWd1cmF0aW9uDQotY29udGVudFZpZXdOYW1lPUluaGFsdA0KLWNvbmZpZ3VyYXRpb25FcnJvckxvZ1ZpZXdOYW1lPUtvbmZpZ3VyYXRpb25zZmVobGVycHJvdG9rb2xsDQotDQotIyBFZGl0b3JzDQotbWV0aG9kRWxlbWVudEVkaXRvck5hbWU9RWRpdG9yIGZcdTAwZmNyIE1ldGhvZGVuZWxlbWVudGUNCi1jb25maWd1cmF0aW9uRWRpdG9yTmFtZT1Lb25maWd1cmF0aW9uc2VkaXRvcg0KLXByb2Nlc3NFZGl0b3JOYW1lPVByb3plc3NlZGl0b3INCi1hY3Rpdml0eURpYWdyYW1FZGl0b3JOYW1lPUVkaXRvciBmXHUwMGZjciBBa3Rpdml0XHUwMGU0dHNkaWFncmFtbWUNCi1hY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JOYW1lPUVkaXRvciBmXHUwMGZjciBBa3Rpdml0XHUwMGU0dHNkZXRhaWxkaWFncmFtbWUNCi13b3JrUHJvZHVjdERlcGVkZW5jeURpYWdyYW1FZGl0b3JOYW1lPUVkaXRvciBmXHUwMGZjciBBcmJlaXRzZXJnZWJuaXNhYmhcdTAwZTRuZ2lna2VpdHNkaWFncmFtbWUNCi0NCi0jIENoZWF0IFNoZWV0cw0KLW1ldGhvZEF1dGhvcmluZ0NoZWF0U2hlZXRzTmFtZT1TcGlja3pldHRlbCBmXHUwMGZjciBNZXRob2Rlbi1BdXRob3JpbmcNCi1DaGVhdHNoZWV0R2V0c3RhcnRlZENhdGVnb3J5VGV4dD1FcnN0ZSBTY2hyaXR0ZQ0KLUNoZWF0c2hlZXRSZXVzYWJsZUNvbnRlbnRDYXRlZ29yeVRleHQ9V2llZGVydmVyd2VuZGJhcmVuIE1ldGhvZGVuaW5oYWx0IGVyc3RlbGxlbg0KLUNoZWF0c2hlZXRXcml0ZUNvbnRlbnRDYXRlZ29yeVRleHQ9TWV0aG9kZW5pbmhhbHQgc2NocmVpYmVuDQotQ2hlYXRzaGVldFByb2Nlc3Nlc0NhdGVnb3J5VGV4dD1NaXQgUHJvemVzc2VuIGFyYmVpdGVuDQotQ2hlYXRzaGVldE5hdmlnYXRlTWV0aG9kQ29udGVudD1JbSBNZXRob2RlbmluaGFsdCBuYXZpZ2llcmVuDQotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb249RWlnZW5lIE1ldGhvZGVua29uZmlndXJhdGlvbiBlcnN0ZWxsZW4NCi1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kUGx1Z2luPUVpZ2VuZXMgTWV0aG9kZW4tUGx1Zy1pbiBlcnN0ZWxsZW4NCi1DaGVhdHNoZWV0QWRkTWV0aG9kQ29udGVudD1OZXVlbiBNZXRob2RlbmluaGFsdCB3aWUgUm9sbGVuLCBBdWZnYWJlbiwgQXJiZWl0c2VyZ2Vibmlzc2Ugb2RlciBBbmxlaXR1bmdlbiBoaW56dWZcdTAwZmNnZW4NCi1DaGVhdHNoZWV0VGFpbG9yTWV0aG9kRWxlbWVudHM9Vm9yaGFuZGVuZSBNZXRob2RlbmVsZW1lbnRlIChSb2xsZW4sIEF1ZmdhYmVuLCBBcmJlaXRzZXJnZWJuaXNzZSBvZGVyIEFubGVpdHVuZ2VuKSBtaXQgQmVpdHJcdTAwZTRnZW4gYW5wYXNzZW4NCi1DaGVhdHNoZWV0UmVwbGFjZU1laHRvZEVsZW1lbnRzPVZvcmhhbmRlbmUgTWV0aG9kZW5lbGVtZW50ZSAoUm9sbGVuLCBBdWZnYWJlbiwgQXJiZWl0c2VyZ2Vibmlzc2Ugb2RlciBBbmxlaXR1bmdlbikgZXJzZXR6ZW4NCi1DaGVhdHNoZWV0QWRkTWV0aG9kUmVmT3JIeXBlcmxpbms9TWV0aG9kZW5yZWZlcmVueiBvZGVyIEh5cGVybGluayAoVVJMKSBoaW56dWZcdTAwZmNnZW4NCi1DaGVhdHNoZWV0QXBwbHlDYXBhYmlsaXR5UGF0dGVybj1Qcm96ZXNzbXVzdGVyIGFud2VuZGVuDQotQ2hlYXRzaGVldENyZWF0ZVByb2Nlc3M9UHJvemVzcyBlcnN0ZWxsZW4gKFByb3plc3NtdXN0ZXIgb2RlciBCZXJlaXRzdGVsbHVuZ3Nwcm96ZXNzKQ0KLQ0KLSMgQWN0aW9uIFNldA0KLWF1dGhvcmluZ0FjdGlvblNldD1BdXRob3JpbmcNCi1jaGVhdFNoZWV0c0FjdGlvblNldD1TcGlja3pldHRlbA0KLQ0KLSMgR2xvYmFsIEFjdGlvbnMNCi1uZXdMaWJyYXJ5QWN0aW9uPU1ldGhvZGVuYmliJmxpb3RoZWsNCi1uZXdMaWJyYXJ5QWN0aW9uVG9vbHRpcD1OZXVlIE1ldGhvZGVuYmlibGlvdGhlayBlcnN0ZWxsZW4NCi1uZXdQbHVnaW5BY3Rpb249TWV0aG9kZW4tJlBsdWctaW4NCi1uZXdQbHVnaW5BY3Rpb25Ub29sdGlwPU5ldWVzIE1ldGhvZGVuLVBsdWctaW4gZXJzdGVsbGVuDQotbmV3Q29uZmlnQWN0aW9uPU1ldGhvZGVuJmtvbmZpZ3VyYXRpb24NCi1uZXdDb25maWdBY3Rpb25Ub29sdGlwPU5ldWUgTWV0aG9kZW5rb25maWd1cmF0aW9uIGVyc3RlbGxlbg0KLW9wZW5MaWJyYXJ5QWN0aW9uPU1ldGhvZGVuYmliJmxpb3RoZWsNCi1vcGVuTGlicmFyeUFjdGlvblRvb2x0aXA9Vm9yaGFuZGVuZSBNZXRob2RlbmJpYmxpb3RoZWsgXHUwMGY2ZmZuZW4NCi1vcGVuQ29uZmlnQWN0aW9uPU1ldGhvZGVuJmtvbmZpZ3VyYXRpb24NCi1vcGVuQ29uZmlnQWN0aW9uVG9vbHRpcD1Wb3JoYW5kZW5lIE1ldGhvZGVua29uZmlndXJhdGlvbiBcdTAwZjZmZm5lbg0KLW9wZW5DaGVhdFNoZWV0cz1TcGlja3pldHRlbC4uLg0KLQ0KLSMgTGlicmFyeSBWaWV3IEFjdGlvbnMNCi1saW5rV2l0aEVkaXRvcj1NaXQgRWRpdG9yIHZlcmxpbmtlbg0KLWxpbmtXaXRoRWRpdG9yVG9vbHRpcD1NaXQgRWRpdG9yIHZlcmxpbmtlbg0KLXNob3dQcmVzZW50YXRpb25OYW1lcz1Qclx1MDBlNHNlbnRhdGlvbnNuYW1lbiBhbnplaWdlbg0KLXNob3dQcmVzZW50YXRpb25OYW1lc1Rvb2x0aXA9UHJcdTAwZTRzZW50YXRpb25zbmFtZW4gYW56ZWlnZW4NCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBBY3Rpb25zDQotcmVmcmVzaENvbmZpZz1Ba3R1YWxpc2llcmVuDQotcmVmcmVzaENvbmZpZ1Rvb2x0aXA9S29uZmlndXJhdGlvbiBha3R1YWxpc2llcmVuDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1tZXRob2RBdXRob3JpbmdQYWdlPU1ldGhvZGVuLUF1dGhvcmluZw0KLXByb2Nlc3NFZGl0b3I9UHJvemVzc2VkaXRvcg0KLWxpYnJhcnlPcHRpb25zPUJpYmxpb3RoZWtzb3B0aW9uZW4NCi1kaWFncmFtPURpYWdyYW1tDQotc3RhcnR1cEFuZFNodXRkb3duPVN0YXJ0ZW4gdW5kIGJlZW5kZW4NCi1kZWJ1Zz1EZWJ1Z2dpbmcNCi0NCi0jIENvbW1hbmQgSGFuZGxlcg0KLXNlbGVjdEFsbD1BbGxlcyBhdXN3XHUwMGU0aGxlbg0KLQ0KLSMgUHJvcGVydGllcyBWaWV3DQotX1VJX1Byb2Nlc3NFZGl0b3JfbWVudT1Qcm96ZXNzDQotX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbT0mTmV1ZXIgdW50ZXJnZW9yZG5ldGVyIEVpbnRyYWcNCi1fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW09TiZldWVyIGdsZWljaGdlb3JkbmV0ZXIgRWludHJhZw0KLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPUUmaWdlbnNjaGFmdGVuc2ljaHQgYW56ZWlnZW4NCi1fVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW09QSZrdHVhbGlzaWVyZW4NCi1fVUlfUHJvcGVydGllc19HZW5lcmFsPUFsbGdlbWVpbg0KLV9VSV9Qcm9wZXJ0aWVzX0RvY3VtZW50YXRpb249RG9rdW1lbnRhdGlvbg0KLV9VSV9Qcm9wZXJ0aWVzX0d1aWRhbmNlPUFubGVpdHVuZw0KLV9VSV9Qcm9wZXJ0aWVzX1dvcmtfUm9sbHVwPUFyYmVpdHMtUm9sbHVwDQotX1VJX1Byb3BlcnRpZXNfVGVhbV9Sb2xsdXA9VGVhbS1Sb2xsdXANCi0jIyBUaGUgZm9sbG93aW5nIHZhbHVlIG9mIHN0cmluZyBzaG91bGQgYmUgIldvcmsgUHJvZHVjdCBSb2xsdXAiLiBCdXQNCi0jIyBkdWUgdG8gbGltaXRhdGlvbi9idWcgaW4gRWNsaXBzZSBXVFAsIGl0J3MgYmVlbiB0cnVuY2F0ZWQgdG8gDQotIyMgIldvcmsgUHJvZCBSb2xsdXAiLiBTbyBkdXJpbmcgdHJhbnNsYXRpb24sIHBsZWFzZSB0YWtlIHRoaXMgaW50byBjb25zaWRlcmF0aW9uLg0KLV9VSV9Qcm9wZXJ0aWVzX1dQX1JvbGx1cD1BcmJlaXRzZXJnLi1Sb2xsdXANCi1fVUlfUHJvcGVydGllc19Sb2xlcz1Sb2xsZW4NCi1fVUlfUHJvcGVydGllc19Xb3JrUHJvZHVjdHM9QXJiZWl0c2VyZ2Vibmlzc2UNCi1fVUlfUHJvcGVydGllc19TdGVwcz1TY2hyaXR0ZQ0KLV9VSV9Qcm9wZXJ0aWVzX1RlYW1zPVRlYW1zDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxMGM3NTguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVVJIGRlIG1vbnRhamUgZGUgVUkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIENhdGVnb3J5DQotbWV0aG9kQ2F0ZWdvcnlOYW1lPU1cdTAwZTl0b2RvDQotDQotIyBQZXJzcGVjdGl2ZQ0KLWF1dGhvcmluZ1BlcnNwZWN0aXZlTmFtZT1BdXRvclx1MDBlZGENCi1icm93c2luZ1BlcnNwZWN0aXZlTmFtZT1FeGFtZW4NCi0NCi0jIFZpZXdzDQotbGlicmFyeVZpZXdOYW1lPUJpYmxpb3RlY2ENCi1jb25maWd1cmF0aW9uVmlld05hbWU9Q29uZmlndXJhY2lcdTAwZjNuDQotY29udGVudFZpZXdOYW1lPUNvbnRlbmlkbw0KLWNvbmZpZ3VyYXRpb25FcnJvckxvZ1ZpZXdOYW1lPVJlZ2lzdHJvIGRlIGVycm9yZXMgZGUgY29uZmlndXJhY2lcdTAwZjNuDQotDQotIyBFZGl0b3JzDQotbWV0aG9kRWxlbWVudEVkaXRvck5hbWU9RWRpdG9yIGRlIGVsZW1lbnRvcyBkZSBtXHUwMGU5dG9kbw0KLWNvbmZpZ3VyYXRpb25FZGl0b3JOYW1lPUVkaXRvciBkZSBjb25maWd1cmFjaVx1MDBmM24NCi1wcm9jZXNzRWRpdG9yTmFtZT1FZGl0b3IgZGUgcHJvY2Vzb3MNCi1hY3Rpdml0eURpYWdyYW1FZGl0b3JOYW1lPUVkaXRvciBkZWwgZGlhZ3JhbWEgZGUgbGEgYWN0aXZpZGFkDQotYWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yTmFtZT1FZGl0b3IgZGVsIGRpYWdyYW1hIGRlIGRldGFsbGVzIGRlIGxhIGFjdGl2aWRhZA0KLXdvcmtQcm9kdWN0RGVwZWRlbmN5RGlhZ3JhbUVkaXRvck5hbWU9RWRpdG9yIGRlbCBkaWFncmFtYSBkZSBkZXBlbmRlbmNpYSBkZWwgcHJvZHVjdG8gZGUgdHJhYmFqbw0KLQ0KLSMgQ2hlYXQgU2hlZXRzDQotbWV0aG9kQXV0aG9yaW5nQ2hlYXRTaGVldHNOYW1lPUhvamFzIGRlIG9yaWVudGFjaVx1MDBmM24gZGUgbGEgYXV0b3JcdTAwZWRhIGRlIG1cdTAwZTl0b2Rvcw0KLUNoZWF0c2hlZXRHZXRzdGFydGVkQ2F0ZWdvcnlUZXh0PUNcdTAwZjNtbyBlbXBlemFyDQotQ2hlYXRzaGVldFJldXNhYmxlQ29udGVudENhdGVnb3J5VGV4dD1DcmVhciBjb250ZW5pZG8gZGVsIG1cdTAwZTl0b2RvIHJldXRpbGl6YWJsZQ0KLUNoZWF0c2hlZXRXcml0ZUNvbnRlbnRDYXRlZ29yeVRleHQ9RXNjcmliaXIgY29udGVuaWRvIGRlbCBtXHUwMGU5dG9kbw0KLUNoZWF0c2hlZXRQcm9jZXNzZXNDYXRlZ29yeVRleHQ9VHJhYmFqYXIgY29uIHByb2Nlc29zDQotQ2hlYXRzaGVldE5hdmlnYXRlTWV0aG9kQ29udGVudD1OYXZlZ2FyIHBvciBlbCBjb250ZW5pZG8gZGVsIG1cdTAwZTl0b2RvDQotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb249Q3JlYXIgdW5hIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kbyBwcm9waWENCi1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kUGx1Z2luPUNyZWFyIHVuIHBsdWctaW4gZGUgbVx1MDBlOXRvZG8gcHJvcGlvDQotQ2hlYXRzaGVldEFkZE1ldGhvZENvbnRlbnQ9QVx1MDBmMWFkaXIgY29udGVuaWRvIGRlbCBtXHUwMGU5dG9kbyBudWV2bywgY29tbyByb2xlcywgdGFyZWFzLCBwcm9kdWN0b3MgZGUgdHJhYmFqbyBvIGd1XHUwMGVkYXMNCi1DaGVhdHNoZWV0VGFpbG9yTWV0aG9kRWxlbWVudHM9UGVyc29uYWxpemFyIGxvcyBlbGVtZW50b3MgZGUgbVx1MDBlOXRvZG8gZXhpc3RlbnRlcyAoUm9sZXMsIFRhcmVhcywgUHJvZHVjdG9zIGRlIHRyYWJham8gbyBHdVx1MDBlZGEpIG1lZGlhbnRlIGxhIGNvbnRyaWJ1Y2lcdTAwZjNuDQotQ2hlYXRzaGVldFJlcGxhY2VNZWh0b2RFbGVtZW50cz1SZWVtcGxhemFyIGxvcyBlbGVtZW50b3MgZGUgbVx1MDBlOXRvZG8gZXhpc3RlbnRlcyAoUm9sZXMsIFRhcmVhcywgUHJvZHVjdG9zIGRlIHRyYWJham8gbyBHdVx1MDBlZGEpDQotQ2hlYXRzaGVldEFkZE1ldGhvZFJlZk9ySHlwZXJsaW5rPUFcdTAwZjFhZGlyIHVuYSByZWZlcmVuY2lhIG8gaGlwZXJlbmxhY2UgYWwgbVx1MDBlOXRvZG8gKFVSTCkNCi1DaGVhdHNoZWV0QXBwbHlDYXBhYmlsaXR5UGF0dGVybj1BcGxpY2FyIHVuIHBhdHJcdTAwZjNuIGRlIHBvc2liaWxpZGFkDQotQ2hlYXRzaGVldENyZWF0ZVByb2Nlc3M9Q3JlYXIgdW4gcHJvY2VzbyAoUGF0clx1MDBmM24gZGUgcG9zaWJpbGlkYWQgbyBQcm9jZXNvIGRlIGVudHJlZ2EpDQotDQotIyBBY3Rpb24gU2V0DQotYXV0aG9yaW5nQWN0aW9uU2V0PUF1dG9yXHUwMGVkYQ0KLWNoZWF0U2hlZXRzQWN0aW9uU2V0PUhvamFzIGRlIG9yaWVudGFjaVx1MDBmM24NCi0NCi0jIEdsb2JhbCBBY3Rpb25zDQotbmV3TGlicmFyeUFjdGlvbj0mQmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MNCi1uZXdMaWJyYXJ5QWN0aW9uVG9vbHRpcD1DcmVhciB1bmEgbnVldmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MNCi1uZXdQbHVnaW5BY3Rpb249JlBsdWctaW4gZGUgbVx1MDBlOXRvZG8NCi1uZXdQbHVnaW5BY3Rpb25Ub29sdGlwPUNyZWFyIHVuIHBsdWctaW4gZGUgbVx1MDBlOXRvZG8gbnVldm8NCi1uZXdDb25maWdBY3Rpb249JkNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kbw0KLW5ld0NvbmZpZ0FjdGlvblRvb2x0aXA9Q3JlYXIgdW5hIG51ZXZhIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kbw0KLW9wZW5MaWJyYXJ5QWN0aW9uPSZCaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcw0KLW9wZW5MaWJyYXJ5QWN0aW9uVG9vbHRpcD1BYnJpciB1bmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZXhpc3RlbnRlDQotb3BlbkNvbmZpZ0FjdGlvbj0mQ29uZmlndXJhY2lcdTAwZjNuIGRlIG1cdTAwZTl0b2RvDQotb3BlbkNvbmZpZ0FjdGlvblRvb2x0aXA9QWJyaXIgdW5hIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kbyBleGlzdGVudGUNCi1vcGVuQ2hlYXRTaGVldHM9SG9qYXMgZGUgb3JpZW50YWNpXHUwMGYzbi4uLg0KLQ0KLSMgTGlicmFyeSBWaWV3IEFjdGlvbnMNCi1saW5rV2l0aEVkaXRvcj1FbmxhemFyIGNvbiBlbCBlZGl0b3INCi1saW5rV2l0aEVkaXRvclRvb2x0aXA9RW5sYXphciBjb24gZWwgZWRpdG9yDQotc2hvd1ByZXNlbnRhdGlvbk5hbWVzPU1vc3RyYXIgbm9tYnJlcyBkZSBwcmVzZW50YWNpXHUwMGYzbg0KLXNob3dQcmVzZW50YXRpb25OYW1lc1Rvb2x0aXA9TW9zdHJhciBub21icmVzIGRlIHByZXNlbnRhY2lcdTAwZjNuDQotDQotIyBDb25maWd1cmF0aW9uIFZpZXcgQWN0aW9ucw0KLXJlZnJlc2hDb25maWc9UmVub3Zhcg0KLXJlZnJlc2hDb25maWdUb29sdGlwPVJlbm92YXIgbGEgY29uZmlndXJhY2lcdTAwZjNuDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1tZXRob2RBdXRob3JpbmdQYWdlPUF1dG9yXHUwMGVkYSBkZSBtXHUwMGU5dG9kb3MNCi1wcm9jZXNzRWRpdG9yPUVkaXRvciBkZSBwcm9jZXNvcw0KLWxpYnJhcnlPcHRpb25zPU9wY2lvbmVzIGRlIGxhIGJpYmxpb3RlY2ENCi1kaWFncmFtPURpYWdyYW1hDQotc3RhcnR1cEFuZFNodXRkb3duPUluaWNpbyB5IGNvbmNsdXNpXHUwMGYzbg0KLWRlYnVnPURlcHVyYXINCi0NCi0jIENvbW1hbmQgSGFuZGxlcg0KLXNlbGVjdEFsbD1TZWxlY2Npb25hciB0b2RvDQotDQotIyBQcm9wZXJ0aWVzIFZpZXcNCi1fVUlfUHJvY2Vzc0VkaXRvcl9tZW51PVByb2Nlc28NCi1fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtPSZOdWV2byBoaWpvDQotX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtPU51JmV2byBpZ3VhbA0KLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPU1vc3RyYXIgcHJvcGllZGFkZXMgJlZpc3RhDQotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPVJlJm5vdmFyDQotX1VJX1Byb3BlcnRpZXNfR2VuZXJhbD1HZW5lcmFsDQotX1VJX1Byb3BlcnRpZXNfRG9jdW1lbnRhdGlvbj1Eb2N1bWVudGFjaVx1MDBmM24NCi1fVUlfUHJvcGVydGllc19HdWlkYW5jZT1HdVx1MDBlZGENCi1fVUlfUHJvcGVydGllc19Xb3JrX1JvbGx1cD1UcmFiYWphciBjb24gZWxlbWVudG9zIGNvbnRyYVx1MDBlZGRvcw0KLV9VSV9Qcm9wZXJ0aWVzX1RlYW1fUm9sbHVwPUVsZW1lbnRvcyBjb250cmFcdTAwZWRkb3MgZGUgRXF1aXBvDQotIyMgVGhlIGZvbGxvd2luZyB2YWx1ZSBvZiBzdHJpbmcgc2hvdWxkIGJlICJXb3JrIFByb2R1Y3QgUm9sbHVwIi4gQnV0DQotIyMgZHVlIHRvIGxpbWl0YXRpb24vYnVnIGluIEVjbGlwc2UgV1RQLCBpdCdzIGJlZW4gdHJ1bmNhdGVkIHRvIA0KLSMjICJXb3JrIFByb2QgUm9sbHVwIi4gU28gZHVyaW5nIHRyYW5zbGF0aW9uLCBwbGVhc2UgdGFrZSB0aGlzIGludG8gY29uc2lkZXJhdGlvbi4NCi1fVUlfUHJvcGVydGllc19XUF9Sb2xsdXA9RWxlbWVudG8gY29udHJhXHUwMGVkZG8gZGUgcHJvZHVjdG8gZGUgdHJhYmFqbw0KLV9VSV9Qcm9wZXJ0aWVzX1JvbGVzPVJvbGVzDQotX1VJX1Byb3BlcnRpZXNfV29ya1Byb2R1Y3RzPVByb2R1Y3RvcyBkZSB0cmFiYWpvDQotX1VJX1Byb3BlcnRpZXNfU3RlcHM9UGFzb3MNCi1fVUlfUHJvcGVydGllc19UZWFtcz1FcXVpcG9zDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI3MWNiNDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUludGVyZmFjZSB1dGlsaXNhdGV1ciBkJ2F1dG9yaXNhdGlvbiBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIENhdGVnb3J5DQotbWV0aG9kQ2F0ZWdvcnlOYW1lPU1cdTAwZTl0aG9kZQ0KLQ0KLSMgUGVyc3BlY3RpdmUNCi1hdXRob3JpbmdQZXJzcGVjdGl2ZU5hbWU9Q3JcdTAwZTlhdGlvbg0KLWJyb3dzaW5nUGVyc3BlY3RpdmVOYW1lPUV4cGxvcmF0aW9uDQotDQotIyBWaWV3cw0KLWxpYnJhcnlWaWV3TmFtZT1CaWJsaW90aFx1MDBlOHF1ZQ0KLWNvbmZpZ3VyYXRpb25WaWV3TmFtZT1Db25maWd1cmF0aW9uDQotY29udGVudFZpZXdOYW1lPUNvbnRlbnUNCi1jb25maWd1cmF0aW9uRXJyb3JMb2dWaWV3TmFtZT1Kb3VybmFsIGRlcyBlcnJldXJzIGRlIGNvbmZpZ3VyYXRpb24NCi0NCi0jIEVkaXRvcnMNCi1tZXRob2RFbGVtZW50RWRpdG9yTmFtZT1FZGl0ZXVyIGQnXHUwMGU5bFx1MDBlOW1lbnQgZGUgbVx1MDBlOXRob2RlDQotY29uZmlndXJhdGlvbkVkaXRvck5hbWU9RWRpdGV1ciBkZSBjb25maWd1cmF0aW9uDQotcHJvY2Vzc0VkaXRvck5hbWU9RWRpdGV1ciBkZSBwcm9jZXNzdXMNCi1hY3Rpdml0eURpYWdyYW1FZGl0b3JOYW1lPUVkaXRldXIgZGUgZGlhZ3JhbW1lIGQnYWN0aXZpdFx1MDBlOQ0KLWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvck5hbWU9RWRpdGV1ciBkZSBkaWFncmFtbWUgZGUgZFx1MDBlOXRhaWwgZCdhY3Rpdml0XHUwMGU5DQotd29ya1Byb2R1Y3REZXBlZGVuY3lEaWFncmFtRWRpdG9yTmFtZT1FZGl0ZXVyIGRlIGRpYWdyYW1tZSBkZSBkXHUwMGU5cGVuZGFuY2UgZGUgcHJvZHVpdA0KLQ0KLSMgQ2hlYXQgU2hlZXRzDQotbWV0aG9kQXV0aG9yaW5nQ2hlYXRTaGVldHNOYW1lPUFpZGUtbVx1MDBlOW1vaXJlIGRlIGNyXHUwMGU5YXRpb24gZGUgbVx1MDBlOXRob2RlDQotQ2hlYXRzaGVldEdldHN0YXJ0ZWRDYXRlZ29yeVRleHQ9TWlzZSBlbiByb3V0ZQ0KLUNoZWF0c2hlZXRSZXVzYWJsZUNvbnRlbnRDYXRlZ29yeVRleHQ9Q3JcdTAwZTllciB1biBjb250ZW51IGRlIG1cdTAwZTl0aG9kZSByXHUwMGU5dXRpbGlzYWJsZQ0KLUNoZWF0c2hlZXRXcml0ZUNvbnRlbnRDYXRlZ29yeVRleHQ9RWNyaXJlIGxlIGNvbnRlbnUgZGUgbGEgbVx1MDBlOXRob2RlDQotQ2hlYXRzaGVldFByb2Nlc3Nlc0NhdGVnb3J5VGV4dD1HXHUwMGU5cmVyIGxlcyBwcm9jZXNzdXMNCi1DaGVhdHNoZWV0TmF2aWdhdGVNZXRob2RDb250ZW50PU5hdmlndWVyIGRhbnMgbGUgY29udGVudSBkZSBsYSBtXHUwMGU5dGhvZGUNCi1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbj1Dclx1MDBlOWVyIHZvdHJlIHByb3ByZSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLUNoZWF0c2hlZXRDcmVhdGVNZXRob2RQbHVnaW49Q3JcdTAwZTllciB2b3RyZSBwcm9wcmUgcGx1Zy1pbiBkZSBtXHUwMGU5dGhvZGUNCi1DaGVhdHNoZWV0QWRkTWV0aG9kQ29udGVudD1Bam91dGVyIGR1IG5vdXZlYXUgY29udGVudSBkZSBtXHUwMGU5dGhvZGUgdGVsIHF1ZSBkZXMgclx1MDBmNGxlcywgZGVzIHRcdTAwZTJjaGVzLCBkZXMgcHJvZHVpdHMgb3UgZGVzIGNvbnNlaWxzDQotQ2hlYXRzaGVldFRhaWxvck1ldGhvZEVsZW1lbnRzPVBlcnNvbm5hbGlzZXIgbGVzIFx1MDBlOWxcdTAwZTltZW50cyBkZSBtXHUwMGU5dGhvZGUgZXhpc3RhbnRzIChyXHUwMGY0bGVzLCB0XHUwMGUyY2hlcywgcHJvZHVpdHMgb3UgY29uc2VpbHMpIFx1MDBlMCBsJ2FpZGUgZGUgbGEgY29udHJpYnV0aW9uDQotQ2hlYXRzaGVldFJlcGxhY2VNZWh0b2RFbGVtZW50cz1SZW1wbGFjZXIgbGVzIFx1MDBlOWxcdTAwZTltZW50cyBkZSBtXHUwMGU5dGhvZGUgZXhpc3RhbnRzIChyXHUwMGY0bGVzLCB0XHUwMGUyY2hlcywgcHJvZHVpdHMgb3UgY29uc2VpbHMpDQotQ2hlYXRzaGVldEFkZE1ldGhvZFJlZk9ySHlwZXJsaW5rPUFqb3V0ZXIgdW5lIHJcdTAwZTlmXHUwMGU5cmVuY2UgZGUgbVx1MDBlOXRob2RlIG91IHVuIGxpZW4gaHlwZXJ0ZXh0ZSAoVVJMKQ0KLUNoZWF0c2hlZXRBcHBseUNhcGFiaWxpdHlQYXR0ZXJuPUFwcGxpcXVlciB1biBwYXR0ZXJuIGRlIGNhcGFjaXRcdTAwZTkNCi1DaGVhdHNoZWV0Q3JlYXRlUHJvY2Vzcz1Dclx1MDBlOWVyIHVuIHByb2Nlc3N1cyAocGF0dGVybiBkZSBjYXBhY2l0XHUwMGU5IG91IHByb2Nlc3N1cyBkZSBsaXZyYWlzb24pDQotDQotIyBBY3Rpb24gU2V0DQotYXV0aG9yaW5nQWN0aW9uU2V0PUNyXHUwMGU5YXRpb24NCi1jaGVhdFNoZWV0c0FjdGlvblNldD1BaWRlLW1cdTAwZTltb2lyZXMNCi0NCi0jIEdsb2JhbCBBY3Rpb25zDQotbmV3TGlicmFyeUFjdGlvbj0mQmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcw0KLW5ld0xpYnJhcnlBY3Rpb25Ub29sdGlwPUNyXHUwMGU5ZXIgdW5lIG5vdXZlbGxlIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMNCi1uZXdQbHVnaW5BY3Rpb249JlBsdWctaW4gZGUgbVx1MDBlOXRob2RlDQotbmV3UGx1Z2luQWN0aW9uVG9vbHRpcD1Dclx1MDBlOWVyIHVuIG5vdXZlYXUgcGx1Zy1pbiBkZSBtXHUwMGU5dGhvZGUNCi1uZXdDb25maWdBY3Rpb249JkNvbmZpZ3VyYXRpb24gZGUgbVx1MDBlOXRob2RlDQotbmV3Q29uZmlnQWN0aW9uVG9vbHRpcD1Dclx1MDBlOWVyIHVuZSBub3V2ZWxsZSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLW9wZW5MaWJyYXJ5QWN0aW9uPSZCaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzDQotb3BlbkxpYnJhcnlBY3Rpb25Ub29sdGlwPU91dnJpciB1bmUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBleGlzdGFudGUNCi1vcGVuQ29uZmlnQWN0aW9uPSZDb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLW9wZW5Db25maWdBY3Rpb25Ub29sdGlwPU91dnJpciB1bmUgY29uZmlndXJhdGlvbiBkZSBtXHUwMGU5dGhvZGUgZXhpc3RhbnRlDQotb3BlbkNoZWF0U2hlZXRzPUFpZGUtbVx1MDBlOW1vaXJlLi4uDQotDQotIyBMaWJyYXJ5IFZpZXcgQWN0aW9ucw0KLWxpbmtXaXRoRWRpdG9yPUxpZW4gYXZlYyBsJ1x1MDBlOWRpdGV1cg0KLWxpbmtXaXRoRWRpdG9yVG9vbHRpcD1MaWVuIGF2ZWMgbCdcdTAwZTlkaXRldXINCi1zaG93UHJlc2VudGF0aW9uTmFtZXM9QWZmaWNoZXIgbGVzIG5vbXMgZGUgcHJcdTAwZTlzZW50YXRpb24NCi1zaG93UHJlc2VudGF0aW9uTmFtZXNUb29sdGlwPUFmZmljaGVyIGxlcyBub21zIGRlIHByXHUwMGU5c2VudGF0aW9uDQotDQotIyBDb25maWd1cmF0aW9uIFZpZXcgQWN0aW9ucw0KLXJlZnJlc2hDb25maWc9QWN0dWFsaXNlcg0KLXJlZnJlc2hDb25maWdUb29sdGlwPUFjdHVhbGlzZXIgbGEgY29uZmlndXJhdGlvbg0KLQ0KLSMgUHJlZmVyZW5jZSBQYWdlDQotbWV0aG9kQXV0aG9yaW5nUGFnZT1Dclx1MDBlOWF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLXByb2Nlc3NFZGl0b3I9RWRpdGV1ciBkZSBwcm9jZXNzdXMNCi1saWJyYXJ5T3B0aW9ucz1PcHRpb25zIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlDQotZGlhZ3JhbT1EaWFncmFtbWUNCi1zdGFydHVwQW5kU2h1dGRvd249RFx1MDBlOW1hcnJhZ2UgZXQgYXJyXHUwMGVhdA0KLWRlYnVnPURcdTAwZTlib2d1ZXINCi0NCi0jIENvbW1hbmQgSGFuZGxlcg0KLXNlbGVjdEFsbD1TXHUwMGU5bGVjdGlvbm5lciB0b3V0DQotDQotIyBQcm9wZXJ0aWVzIFZpZXcNCi1fVUlfUHJvY2Vzc0VkaXRvcl9tZW51PVByb2Nlc3N1cw0KLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09Jk5vdXZlbCBlbmZhbnQNCi1fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW09TiZvdXZlYXUgZnJcdTAwZThyZS9zb2V1cg0KLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPSZBZmZpY2hlciBsYSB2dWUgUHJvcHJpXHUwMGU5dFx1MDBlOXMNCi1fVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW09QWN0JnVhbGlzZXINCi1fVUlfUHJvcGVydGllc19HZW5lcmFsPURpc3Bvc2l0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzDQotX1VJX1Byb3BlcnRpZXNfRG9jdW1lbnRhdGlvbj1Eb2N1bWVudGF0aW9uDQotX1VJX1Byb3BlcnRpZXNfR3VpZGFuY2U9Q29uc2VpbA0KLV9VSV9Qcm9wZXJ0aWVzX1dvcmtfUm9sbHVwPUN1bXVsIGRlIHRyYXZhaWwNCi1fVUlfUHJvcGVydGllc19UZWFtX1JvbGx1cD1DdW11bCBkZSBsJ1x1MDBlOXF1aXBlDQotIyMgVGhlIGZvbGxvd2luZyB2YWx1ZSBvZiBzdHJpbmcgc2hvdWxkIGJlICJXb3JrIFByb2R1Y3QgUm9sbHVwIi4gQnV0DQotIyMgZHVlIHRvIGxpbWl0YXRpb24vYnVnIGluIEVjbGlwc2UgV1RQLCBpdCdzIGJlZW4gdHJ1bmNhdGVkIHRvIA0KLSMjICJXb3JrIFByb2QgUm9sbHVwIi4gU28gZHVyaW5nIHRyYW5zbGF0aW9uLCBwbGVhc2UgdGFrZSB0aGlzIGludG8gY29uc2lkZXJhdGlvbi4NCi1fVUlfUHJvcGVydGllc19XUF9Sb2xsdXA9Q3VtdWwgZGUgcHJvZHVpdHMNCi1fVUlfUHJvcGVydGllc19Sb2xlcz1SXHUwMGY0bGVzDQotX1VJX1Byb3BlcnRpZXNfV29ya1Byb2R1Y3RzPVByb2R1aXRzDQotX1VJX1Byb3BlcnRpZXNfU3RlcHM9RXRhcGVzDQotX1VJX1Byb3BlcnRpZXNfVGVhbXM9RXF1aXBlcw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMGQwMzM2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBVSSBBdXRob3JpbmcNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIENhdGVnb3J5DQotbWV0aG9kQ2F0ZWdvcnlOYW1lPU1ldG9kbw0KLQ0KLSMgUGVyc3BlY3RpdmUNCi1hdXRob3JpbmdQZXJzcGVjdGl2ZU5hbWU9QXV0aG9yaW5nDQotYnJvd3NpbmdQZXJzcGVjdGl2ZU5hbWU9RXNwbG9yYXppb25lDQotDQotIyBWaWV3cw0KLWxpYnJhcnlWaWV3TmFtZT1MaWJyZXJpYQ0KLWNvbmZpZ3VyYXRpb25WaWV3TmFtZT1Db25maWd1cmF6aW9uZQ0KLWNvbnRlbnRWaWV3TmFtZT1Db250ZW51dG8NCi1jb25maWd1cmF0aW9uRXJyb3JMb2dWaWV3TmFtZT1Mb2cgZXJyb3JpIGRpIGNvbmZpZ3VyYXppb25lDQotDQotIyBFZGl0b3JzDQotbWV0aG9kRWxlbWVudEVkaXRvck5hbWU9RWRpdG9yIGRpIGVsZW1lbnRpIGRlbCBtZXRvZG8NCi1jb25maWd1cmF0aW9uRWRpdG9yTmFtZT1FZGl0b3IgZGkgY29uZmlndXJhemlvbmkNCi1wcm9jZXNzRWRpdG9yTmFtZT1FZGl0b3IgZGkgcHJvY2Vzc2kNCi1hY3Rpdml0eURpYWdyYW1FZGl0b3JOYW1lPUVkaXRvciBkaSBkaWFncmFtbWkgYXR0aXZpdFx1MDBlMA0KLWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvck5hbWU9RWRpdG9yIGRpIGRpYWdyYW1taSBkZXR0YWdsaSBhdHRpdml0XHUwMGUwDQotd29ya1Byb2R1Y3REZXBlZGVuY3lEaWFncmFtRWRpdG9yTmFtZT1FZGl0b3IgZGkgZGlhZ3JhbW1pIGRpcGVuZGVuemUgcHJvZG90dGkgZGkgbGF2b3JvDQotDQotIyBDaGVhdCBTaGVldHMNCi1tZXRob2RBdXRob3JpbmdDaGVhdFNoZWV0c05hbWU9Q2hlYXQgc2hlZXQgcmVsYXRpdmkgYWxsJ2F1dGhvcmluZyBkaSBtZXRvZGkNCi1DaGVhdHNoZWV0R2V0c3RhcnRlZENhdGVnb3J5VGV4dD1JbnRyb2R1emlvbmUNCi1DaGVhdHNoZWV0UmV1c2FibGVDb250ZW50Q2F0ZWdvcnlUZXh0PUNyZWF6aW9uZSBkaSBjb250ZW51dG8gZGVsIG1ldG9kbyByaXV0aWxpenphYmlsZQ0KLUNoZWF0c2hlZXRXcml0ZUNvbnRlbnRDYXRlZ29yeVRleHQ9U2NyaXR0dXJhIGRlbCBjb250ZW51dG8gZGVsIG1ldG9kbw0KLUNoZWF0c2hlZXRQcm9jZXNzZXNDYXRlZ29yeVRleHQ9VXRpbGl6em8gZGVpIHByb2Nlc3NpDQotQ2hlYXRzaGVldE5hdmlnYXRlTWV0aG9kQ29udGVudD1Fc3Bsb3JhemlvbmUgZGVsIGNvbnRlbnV0byBkZWwgbWV0b2RvDQotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb249Q3JlYXppb25lIGRpIHVuYSBjb25maWd1cmF6aW9uZSBkaSBtZXRvZG8gcGVyc29uYWxpenphdGENCi1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kUGx1Z2luPUNyZWF6aW9uZSBkaSB1biBwbHVnLWluIGRpIG1ldG9kbyBwZXJzb25hbGl6emF0bw0KLUNoZWF0c2hlZXRBZGRNZXRob2RDb250ZW50PUFnZ2l1bnRhIGRpIG51b3ZvIGNvbnRlbnV0byBkZWwgbWV0b2RvIGNvbWUgcnVvbG8sIG9wZXJhemlvbmksIHByb2RvdHRpIGRpIGxhdm9ybyBvIGd1aWRhDQotQ2hlYXRzaGVldFRhaWxvck1ldGhvZEVsZW1lbnRzPVBlcnNvbmFsaXp6YXppb25lIGRpIGVsZW1lbnRpIGRlbCBtZXRvZG8gZXNpc3RlbnRpIChydW9saSwgb3BlcmF6aW9uaSwgcHJvZG90dGkgZGkgbGF2b3JvIG8gZ3VpZGEpIG1lZGlhbnRlIHVuIGNvbnRyaWJ1dG8NCi1DaGVhdHNoZWV0UmVwbGFjZU1laHRvZEVsZW1lbnRzPVNvc3RpdHV6aW9uZSBkaSBlbGVtZW50aSBkZWwgbWV0b2RvIGVzaXN0ZW50aSAocnVvbGksIG9wZXJhemlvbmksIHByb2RvdHRpIGRpIGxhdm9ybyBvIGd1aWRhKQ0KLUNoZWF0c2hlZXRBZGRNZXRob2RSZWZPckh5cGVybGluaz1BZ2dpdW50YSBkaSB1biBjb2xsZWdhbWVudG8gaXBlcnRlc3R1YWxlIChVUkwpIG8gZGkgdW4gcmlmZXJpbWVudG8gZGVsIG1ldG9kbw0KLUNoZWF0c2hlZXRBcHBseUNhcGFiaWxpdHlQYXR0ZXJuPUFwcGxpY2F6aW9uZSBkaSB1biBtb2RlbGxvIGRpIGNhcGFjaXRcdTAwZTANCi1DaGVhdHNoZWV0Q3JlYXRlUHJvY2Vzcz1DcmVhemlvbmUgZGkgdW4gcHJvY2Vzc28gKG1vZGVsbG8gZGkgY2FwYWNpdFx1MDBlMCBvIHByb2Nlc3NvIGRpIHByb2R1emlvbmUpDQotDQotIyBBY3Rpb24gU2V0DQotYXV0aG9yaW5nQWN0aW9uU2V0PUF1dGhvcmluZw0KLWNoZWF0U2hlZXRzQWN0aW9uU2V0PUNoZWF0IHNoZWV0DQotDQotIyBHbG9iYWwgQWN0aW9ucw0KLW5ld0xpYnJhcnlBY3Rpb249TGlicmVyaWEgZGVpICZtZXRvZGkNCi1uZXdMaWJyYXJ5QWN0aW9uVG9vbHRpcD1DcmVhIHVuYSBudW92YSBsaWJyZXJpYSBkZWkgbWV0b2RpDQotbmV3UGx1Z2luQWN0aW9uPSZQbHVnLWluIGRpIG1ldG9kbw0KLW5ld1BsdWdpbkFjdGlvblRvb2x0aXA9Q3JlYSB1biBudW92byBwbHVnLWluIGRpIG1ldG9kbw0KLW5ld0NvbmZpZ0FjdGlvbj0mQ29uZmlndXJhemlvbmUgbWV0b2RvDQotbmV3Q29uZmlnQWN0aW9uVG9vbHRpcD1DcmVhIHVuYSBudW92YSBjb25maWd1cmF6aW9uZSBkaSBtZXRvZG8NCi1vcGVuTGlicmFyeUFjdGlvbj1MaWJyZXJpYSBkZWkgJm1ldG9kaQ0KLW9wZW5MaWJyYXJ5QWN0aW9uVG9vbHRpcD1BcHJpIHVuYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGVzaXN0ZW50ZQ0KLW9wZW5Db25maWdBY3Rpb249JkNvbmZpZ3VyYXppb25lIG1ldG9kbw0KLW9wZW5Db25maWdBY3Rpb25Ub29sdGlwPUFwcmkgdW5hIGNvbmZpZ3VyYXppb25lIGRpIG1ldG9kbyBlc2lzdGVudGUNCi1vcGVuQ2hlYXRTaGVldHM9Q2hlYXQgc2hlZXQuLi4NCi0NCi0jIExpYnJhcnkgVmlldyBBY3Rpb25zDQotbGlua1dpdGhFZGl0b3I9Q29sbGVnYSBhIGVkaXRvcg0KLWxpbmtXaXRoRWRpdG9yVG9vbHRpcD1Db2xsZWdhIGEgZWRpdG9yDQotc2hvd1ByZXNlbnRhdGlvbk5hbWVzPU1vc3RyYSBub21pIHByZXNlbnRhemlvbmkNCi1zaG93UHJlc2VudGF0aW9uTmFtZXNUb29sdGlwPU1vc3RyYSBub21pIHByZXNlbnRhemlvbmkNCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBBY3Rpb25zDQotcmVmcmVzaENvbmZpZz1BZ2dpb3JuYQ0KLXJlZnJlc2hDb25maWdUb29sdGlwPUFnZ2lvcm5hcmUgbGEgY29uZmlndXJhemlvbmUNCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLW1ldGhvZEF1dGhvcmluZ1BhZ2U9QXV0aG9yaW5nIG1ldG9kaQ0KLXByb2Nlc3NFZGl0b3I9RWRpdG9yIGRpIHByb2Nlc3NpDQotbGlicmFyeU9wdGlvbnM9T3B6aW9uaSBsaWJyZXJpYQ0KLWRpYWdyYW09RGlhZ3JhbW1hDQotc3RhcnR1cEFuZFNodXRkb3duPUF2dmlvIGUgYXJyZXN0byBzaXN0ZW1hDQotZGVidWc9RGVidWcNCi0NCi0jIENvbW1hbmQgSGFuZGxlcg0KLXNlbGVjdEFsbD1TZWxlemlvbmEgdHV0dG8NCi0NCi0jIFByb3BlcnRpZXMgVmlldw0KLV9VSV9Qcm9jZXNzRWRpdG9yX21lbnU9UHJvY2Vzc28NCi1fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtPSZOdW92byBlbGVtZW50byBjaGlsZA0KLV9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbT1OJnVvdm8gZWxlbWVudG8gZGkgcGFyaSBsaXZlbGxvDQotX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW09TW9zdHJhICZ2aXN0YSBQcm9wcmlldFx1MDBlMA0KLV9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbT1BJmdnaW9ybmENCi1fVUlfUHJvcGVydGllc19HZW5lcmFsPUdlbmVyYWxlDQotX1VJX1Byb3BlcnRpZXNfRG9jdW1lbnRhdGlvbj1Eb2N1bWVudGF6aW9uZQ0KLV9VSV9Qcm9wZXJ0aWVzX0d1aWRhbmNlPUd1aWRhDQotX1VJX1Byb3BlcnRpZXNfV29ya19Sb2xsdXA9Um9sbHVwIGxhdm9ybw0KLV9VSV9Qcm9wZXJ0aWVzX1RlYW1fUm9sbHVwPVJvbGx1cCB0ZWFtDQotIyMgVGhlIGZvbGxvd2luZyB2YWx1ZSBvZiBzdHJpbmcgc2hvdWxkIGJlICJXb3JrIFByb2R1Y3QgUm9sbHVwIi4gQnV0DQotIyMgZHVlIHRvIGxpbWl0YXRpb24vYnVnIGluIEVjbGlwc2UgV1RQLCBpdCdzIGJlZW4gdHJ1bmNhdGVkIHRvIA0KLSMjICJXb3JrIFByb2QgUm9sbHVwIi4gU28gZHVyaW5nIHRyYW5zbGF0aW9uLCBwbGVhc2UgdGFrZSB0aGlzIGludG8gY29uc2lkZXJhdGlvbi4NCi1fVUlfUHJvcGVydGllc19XUF9Sb2xsdXA9Um9sbHVwIHByb2RvdHRvIGRpIGxhdm9ybw0KLV9VSV9Qcm9wZXJ0aWVzX1JvbGVzPVJ1b2xpDQotX1VJX1Byb3BlcnRpZXNfV29ya1Byb2R1Y3RzPVByb2RvdHRpIGRpIGxhdm9ybw0KLV9VSV9Qcm9wZXJ0aWVzX1N0ZXBzPVBhc3NpDQotX1VJX1Byb3BlcnRpZXNfVGVhbXM9VGVhbQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MTJiYjFmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgQXV0aG9yaW5nIFVJDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBDYXRlZ29yeQ0KLW1ldGhvZENhdGVnb3J5TmFtZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzkNCi0NCi0jIFBlcnNwZWN0aXZlDQotYXV0aG9yaW5nUGVyc3BlY3RpdmVOYW1lPVx1MzBhYVx1MzBmY1x1MzBiNVx1MzBlYVx1MzBmM1x1MzBiMA0KLWJyb3dzaW5nUGVyc3BlY3RpdmVOYW1lPVx1MzBkNlx1MzBlOVx1MzBhNlx1MzBiYQ0KLQ0KLSMgVmlld3MNCi1saWJyYXJ5Vmlld05hbWU9XHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjDQotY29uZmlndXJhdGlvblZpZXdOYW1lPVx1NjljYlx1NjIxMA0KLWNvbnRlbnRWaWV3TmFtZT1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQNCi1jb25maWd1cmF0aW9uRXJyb3JMb2dWaWV3TmFtZT1cdTY5Y2JcdTYyMTBcdTMwYThcdTMwZTlcdTMwZmNcdTMwZmJcdTMwZWRcdTMwYjANCi0NCi0jIEVkaXRvcnMNCi1tZXRob2RFbGVtZW50RWRpdG9yTmFtZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTg5ODFcdTdkMjBcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmMNCi1jb25maWd1cmF0aW9uRWRpdG9yTmFtZT1cdTY5Y2JcdTYyMTBcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmMNCi1wcm9jZXNzRWRpdG9yTmFtZT1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwZmJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmMNCi1hY3Rpdml0eURpYWdyYW1FZGl0b3JOYW1lPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1NTZmM1x1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmYw0KLWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvck5hbWU9XHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU4YTczXHU3ZDMwXHU1NmYzXHUzMGE4XHUzMGM3XHUzMGEzXHUzMGJmXHUzMGZjDQotd29ya1Byb2R1Y3REZXBlZGVuY3lEaWFncmFtRWRpdG9yTmFtZT1cdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTRmOWRcdTViNThcdTk1YTJcdTRmYzJcdTU2ZjNcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmMNCi0NCi0jIENoZWF0IFNoZWV0cw0KLW1ldGhvZEF1dGhvcmluZ0NoZWF0U2hlZXRzTmFtZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwYWFcdTMwZmNcdTMwYjVcdTMwZWFcdTMwZjNcdTMwYjBcdTg2NGVcdTMwNmVcdTVkZmINCi1DaGVhdHNoZWV0R2V0c3RhcnRlZENhdGVnb3J5VGV4dD1cdTU5Y2JcdTMwODFcdTMwNmINCi1DaGVhdHNoZWV0UmV1c2FibGVDb250ZW50Q2F0ZWdvcnlUZXh0PVx1NTE4ZFx1NGY3Zlx1NzUyOFx1NTNlZlx1ODBmZFx1MzA2YVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzA2ZVx1NGY1Y1x1NjIxMA0KLUNoZWF0c2hlZXRXcml0ZUNvbnRlbnRDYXRlZ29yeVRleHQ9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMDZlXHU0ZjVjXHU2MjEwDQotQ2hlYXRzaGVldFByb2Nlc3Nlc0NhdGVnb3J5VGV4dD1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNmVcdTUxZTZcdTc0MDYNCi1DaGVhdHNoZWV0TmF2aWdhdGVNZXRob2RDb250ZW50PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzA2ZVx1MzBjYVx1MzBkM1x1MzBiMlx1MzBmY1x1MzBjOA0KLUNoZWF0c2hlZXRDcmVhdGVNZXRob2RDb25maWd1cmF0aW9uPVx1NzJlY1x1ODFlYVx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA2ZVx1NGY1Y1x1NjIxMA0KLUNoZWF0c2hlZXRDcmVhdGVNZXRob2RQbHVnaW49XHU3MmVjXHU4MWVhXHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDZlXHU0ZjVjXHU2MjEwDQotQ2hlYXRzaGVldEFkZE1ldGhvZENvbnRlbnQ9XHUzMDBjXHUzMGVkXHUzMGZjXHUzMGViXHUzMDBkXHUzMDAxXHUzMDBjXHUzMGJmXHUzMGI5XHUzMGFmXHUzMDBkXHUzMDAxXHUzMDBjXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDBkXHUzMDAxXHUzMDdlXHUzMDVmXHUzMDZmXHUzMDBjXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDBkXHUzMDZhXHUzMDY5XHUzMDAxXHU2NWIwXHU4OThmXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMDZlXHU4ZmZkXHU1MmEwDQotQ2hlYXRzaGVldFRhaWxvck1ldGhvZEVsZW1lbnRzPVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMCAoXHUzMDBjXHUzMGVkXHUzMGZjXHUzMGViXHUzMDBkXHUzMDAxXHUzMDBjXHUzMGJmXHUzMGI5XHUzMGFmXHUzMDBkXHUzMDAxXHUzMDBjXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDBkXHUzMDAxXHUzMDdlXHUzMDVmXHUzMDZmXHUzMDBjXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDBkKSBcdTMwNmVcdTMwMGNcdTViYzRcdTRlMGVcdTMwMGRcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwNWZcdThhYmZcdTY1NzQNCi1DaGVhdHNoZWV0UmVwbGFjZU1laHRvZEVsZW1lbnRzPVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMCAoXHUzMDBjXHUzMGVkXHUzMGZjXHUzMGViXHUzMDBkXHUzMDAxXHUzMDBjXHUzMGJmXHUzMGI5XHUzMGFmXHUzMDBkXHUzMDAxXHUzMDBjXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDBkXHUzMDAxXHUzMDdlXHUzMDVmXHUzMDZmXHUzMDBjXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDBkKSBcdTMwNmVcdTdmNmVcdTYzZGINCi1DaGVhdHNoZWV0QWRkTWV0aG9kUmVmT3JIeXBlcmxpbms9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU1M2MyXHU3MTY3XHUzMDdlXHUzMDVmXHUzMDZmXHUzMGNmXHUzMGE0XHUzMGQxXHUzMGZjXHUzMGVhXHUzMGYzXHUzMGFmIChVUkwpIFx1MzA2ZVx1OGZmZFx1NTJhMA0KLUNoZWF0c2hlZXRBcHBseUNhcGFiaWxpdHlQYXR0ZXJuPVx1MzBiMVx1MzBmY1x1MzBkMVx1MzBkM1x1MzBlYVx1MzBjNlx1MzBhM1x1MzBmY1x1MzBmYlx1MzBkMVx1MzBiZlx1MzBmY1x1MzBmM1x1MzA2ZVx1OTA2OVx1NzUyOA0KLUNoZWF0c2hlZXRDcmVhdGVQcm9jZXNzPVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOSAoXHUzMGIxXHUzMGZjXHUzMGQxXHUzMGQzXHUzMGVhXHUzMGM2XHUzMGEzXHUzMGZjXHUzMGZiXHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzXHUzMDdlXHUzMDVmXHUzMDZmXHUzMGM3XHUzMGVhXHUzMGQwXHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5KSBcdTMwNmVcdTRmNWNcdTYyMTANCi0NCi0jIEFjdGlvbiBTZXQNCi1hdXRob3JpbmdBY3Rpb25TZXQ9XHUzMGFhXHUzMGZjXHUzMGI1XHUzMGVhXHUzMGYzXHUzMGIwDQotY2hlYXRTaGVldHNBY3Rpb25TZXQ9XHU4NjRlXHUzMDZlXHU1ZGZiDQotDQotIyBHbG9iYWwgQWN0aW9ucw0KLW5ld0xpYnJhcnlBY3Rpb249XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjKCZMKQ0KLW5ld0xpYnJhcnlBY3Rpb25Ub29sdGlwPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMA0KLW5ld1BsdWdpbkFjdGlvbj1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjMoJlApDQotbmV3UGx1Z2luQWN0aW9uVG9vbHRpcD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNmVcdTY1YjBcdTg5OGZcdTRmNWNcdTYyMTANCi1uZXdDb25maWdBY3Rpb249XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OWNiXHU2MjEwKCZDKQ0KLW5ld0NvbmZpZ0FjdGlvblRvb2x0aXA9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OWNiXHU2MjEwXHUzMDZlXHU2NWIwXHU4OThmXHU0ZjVjXHU2MjEwDQotb3BlbkxpYnJhcnlBY3Rpb249XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjKCZMKQ0KLW9wZW5MaWJyYXJ5QWN0aW9uVG9vbHRpcD1cdTY1ZTJcdTViNThcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNGYNCi1vcGVuQ29uZmlnQWN0aW9uPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMCgmQykNCi1vcGVuQ29uZmlnQWN0aW9uVG9vbHRpcD1cdTY1ZTJcdTViNThcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5Y2JcdTYyMTBcdTMwOTJcdTk1OGJcdTMwNGYNCi1vcGVuQ2hlYXRTaGVldHM9XHU4NjRlXHUzMDZlXHU1ZGZiLi4uDQotDQotIyBMaWJyYXJ5IFZpZXcgQWN0aW9ucw0KLWxpbmtXaXRoRWRpdG9yPVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA5Mlx1NGY3Zlx1NzUyOFx1MzA1N1x1MzA2Nlx1MzBlYVx1MzBmM1x1MzBhZg0KLWxpbmtXaXRoRWRpdG9yVG9vbHRpcD1cdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwNjZcdTMwZWFcdTMwZjNcdTMwYWYNCi1zaG93UHJlc2VudGF0aW9uTmFtZXM9XHU4ODY4XHU3OTNhXHU1NDBkXHUzMDZlXHU4ODY4XHU3OTNhDQotc2hvd1ByZXNlbnRhdGlvbk5hbWVzVG9vbHRpcD1cdTg4NjhcdTc5M2FcdTU0MGRcdTMwNmVcdTg4NjhcdTc5M2ENCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBBY3Rpb25zDQotcmVmcmVzaENvbmZpZz1cdTY2ZjRcdTY1YjANCi1yZWZyZXNoQ29uZmlnVG9vbHRpcD1cdTY5Y2JcdTYyMTBcdTMwNmVcdTY2ZjRcdTY1YjANCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLW1ldGhvZEF1dGhvcmluZ1BhZ2U9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGFhXHUzMGZjXHUzMGI1XHUzMGVhXHUzMGYzXHUzMGIwDQotcHJvY2Vzc0VkaXRvcj1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwZmJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmMNCi1saWJyYXJ5T3B0aW9ucz1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwZmJcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjMNCi1kaWFncmFtPVx1MzBjMFx1MzBhNFx1MzBhMlx1MzBiMFx1MzBlOVx1MzBlMA0KLXN0YXJ0dXBBbmRTaHV0ZG93bj1cdTU5Y2JcdTUyZDVcdTMwNjhcdTMwYjdcdTMwZTNcdTMwYzNcdTMwYzhcdTMwYzBcdTMwYTZcdTMwZjMNCi1kZWJ1Zz1cdTMwYzdcdTMwZDBcdTMwYzNcdTMwYjANCi0NCi0jIENvbW1hbmQgSGFuZGxlcg0KLXNlbGVjdEFsbD1cdTMwNTlcdTMwNzlcdTMwNjZcdTkwNzhcdTYyOWUNCi0NCi0jIFByb3BlcnRpZXMgVmlldw0KLV9VSV9Qcm9jZXNzRWRpdG9yX21lbnU9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5DQotX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbT1cdTY1YjBcdTg5OGZcdTMwNmVcdTViNTAoJk4pDQotX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtPVx1NjViMFx1ODk4Zlx1MzA2ZVx1NTE0NFx1NWYxZigmRSkNCi1fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbT1cdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwZmNcdTMwZmJcdTMwZDNcdTMwZTVcdTMwZmNcdTMwNmVcdTg4NjhcdTc5M2EoJlYpDQotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPVx1NjZmNFx1NjViMCgmRikNCi1fVUlfUHJvcGVydGllc19HZW5lcmFsPVx1NGUwMFx1ODIyYw0KLV9VSV9Qcm9wZXJ0aWVzX0RvY3VtZW50YXRpb249XHU2NTg3XHU2NmY4DQotX1VJX1Byb3BlcnRpZXNfR3VpZGFuY2U9XHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5DQotX1VJX1Byb3BlcnRpZXNfV29ya19Sb2xsdXA9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMGEyXHUzMGMzXHUzMGQ3DQotX1VJX1Byb3BlcnRpZXNfVGVhbV9Sb2xsdXA9XHUzMGMxXHUzMGZjXHUzMGUwXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMGEyXHUzMGMzXHUzMGQ3DQotIyMgVGhlIGZvbGxvd2luZyB2YWx1ZSBvZiBzdHJpbmcgc2hvdWxkIGJlICJXb3JrIFByb2R1Y3QgUm9sbHVwIi4gQnV0DQotIyMgZHVlIHRvIGxpbWl0YXRpb24vYnVnIGluIEVjbGlwc2UgV1RQLCBpdCdzIGJlZW4gdHJ1bmNhdGVkIHRvIA0KLSMjICJXb3JrIFByb2QgUm9sbHVwIi4gU28gZHVyaW5nIHRyYW5zbGF0aW9uLCBwbGVhc2UgdGFrZSB0aGlzIGludG8gY29uc2lkZXJhdGlvbi4NCi1fVUlfUHJvcGVydGllc19XUF9Sb2xsdXA9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMGEyXHUzMGMzXHUzMGQ3DQotX1VJX1Byb3BlcnRpZXNfUm9sZXM9XHUzMGVkXHUzMGZjXHUzMGViDQotX1VJX1Byb3BlcnRpZXNfV29ya1Byb2R1Y3RzPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLV9VSV9Qcm9wZXJ0aWVzX1N0ZXBzPVx1MzBiOVx1MzBjNlx1MzBjM1x1MzBkNw0KLV9VSV9Qcm9wZXJ0aWVzX1RlYW1zPVx1MzBjMVx1MzBmY1x1MzBlMA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNTEwN2Y1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHVjNzkxXHVjMTMxIFVJDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBDYXRlZ29yeQ0KLW1ldGhvZENhdGVnb3J5TmFtZT1cdWJhNTRcdWMxOGNcdWI0ZGMNCi0NCi0jIFBlcnNwZWN0aXZlDQotYXV0aG9yaW5nUGVyc3BlY3RpdmVOYW1lPVx1Yzc5MVx1YzEzMQ0KLWJyb3dzaW5nUGVyc3BlY3RpdmVOYW1lPVx1Y2MzZVx1YzU0NFx1YmNmNFx1YWUzMA0KLQ0KLSMgVmlld3MNCi1saWJyYXJ5Vmlld05hbWU9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjDQotY29uZmlndXJhdGlvblZpZXdOYW1lPVx1YWQ2Y1x1YzEzMQ0KLWNvbnRlbnRWaWV3TmFtZT1cdWNlZThcdWQxNTBcdWNlMjANCi1jb25maWd1cmF0aW9uRXJyb3JMb2dWaWV3TmFtZT1cdWFkNmNcdWMxMzEgXHVjNjI0XHViOTU4IFx1Yjg1Y1x1YWRmOA0KLQ0KLSMgRWRpdG9ycw0KLW1ldGhvZEVsZW1lbnRFZGl0b3JOYW1lPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWM2OTRcdWMxOGMgXHVkM2I4XHVjOWQxXHVhZTMwDQotY29uZmlndXJhdGlvbkVkaXRvck5hbWU9XHVhZDZjXHVjMTMxIFx1ZDNiOFx1YzlkMVx1YWUzMA0KLXByb2Nlc3NFZGl0b3JOYW1lPVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWQzYjhcdWM5ZDFcdWFlMzANCi1hY3Rpdml0eURpYWdyYW1FZGl0b3JOYW1lPVx1ZDY1Y1x1YjNkOSBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTggXHVkM2I4XHVjOWQxXHVhZTMwDQotYWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yTmFtZT1cdWQ2NWNcdWIzZDkgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOCBcdWQzYjhcdWM5ZDFcdWFlMzANCi13b3JrUHJvZHVjdERlcGVkZW5jeURpYWdyYW1FZGl0b3JOYW1lPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjODg1XHVjMThkXHVjMTMxIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOCBcdWQzYjhcdWM5ZDFcdWFlMzANCi0NCi0jIENoZWF0IFNoZWV0cw0KLW1ldGhvZEF1dGhvcmluZ0NoZWF0U2hlZXRzTmFtZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNzkxXHVjMTMxIFx1Y2U1OFx1ZDJiOCBcdWMyZGNcdWQyYjgNCi1DaGVhdHNoZWV0R2V0c3RhcnRlZENhdGVnb3J5VGV4dD1cdWMyZGNcdWM3OTFcdWQ1NThcdWFlMzANCi1DaGVhdHNoZWV0UmV1c2FibGVDb250ZW50Q2F0ZWdvcnlUZXh0PVx1YzdhY1x1YzBhY1x1YzZhOVx1YWMwMFx1YjJhNSBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVjZWU4XHVkMTUwXHVjZTIwIFx1Yzc5MVx1YzEzMQ0KLUNoZWF0c2hlZXRXcml0ZUNvbnRlbnRDYXRlZ29yeVRleHQ9XHViYTU0XHVjMThjXHViNGRjIFx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWM0ZjBcdWFlMzANCi1DaGVhdHNoZWV0UHJvY2Vzc2VzQ2F0ZWdvcnlUZXh0PVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWM3OTFcdWM1YzUNCi1DaGVhdHNoZWV0TmF2aWdhdGVNZXRob2RDb250ZW50PVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWNlZThcdWQxNTBcdWNlMjAgXHVkMGQwXHVjMGM5DQotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb249XHVhY2UwXHVjNzIwXHVkNTVjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzEgXHVjNzkxXHVjMTMxDQotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZFBsdWdpbj1cdWFjZTBcdWM3MjBcdWQ1NWMgXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OCBcdWM3OTFcdWMxMzENCi1DaGVhdHNoZWV0QWRkTWV0aG9kQ29udGVudD1cdWM1ZWRcdWQ1NjAsIFx1ZDBjMFx1YzJhNFx1ZDA2YywgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWI2MTBcdWIyOTQgXHVjNTQ4XHViMGI0XHVjNjQwIFx1YWMxOVx1Yzc0MCBcdWMwYzhcdWI4NWNcdWM2YjQgXHViYTU0XHVjMThjXHViNGRjIFx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWNkOTRcdWFjMDANCi1DaGVhdHNoZWV0VGFpbG9yTWV0aG9kRWxlbWVudHM9XHVjZWU4XHVkMmI4XHViOWFjXHViZGYwXHVjMTU4XHVjNzQ0IFx1YzBhY1x1YzZhOVx1ZDU1OFx1YzVlYyBcdWFlMzBcdWM4NzQgXHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4YyhcdWM1ZWRcdWQ1NjAsIFx1ZDBjMFx1YzJhNFx1ZDA2YywgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWI2MTBcdWIyOTQgXHVjNTQ4XHViMGI0KSBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODcwXHVjODE1DQotQ2hlYXRzaGVldFJlcGxhY2VNZWh0b2RFbGVtZW50cz1cdWFlMzBcdWM4NzQgXHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4YyhcdWM1ZWRcdWQ1NjAsIFx1ZDBjMFx1YzJhNFx1ZDA2YywgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWI2MTBcdWIyOTQgXHVjNTQ4XHViMGI0KSBcdWJjMTRcdWFmYjhcdWFlMzANCi1DaGVhdHNoZWV0QWRkTWV0aG9kUmVmT3JIeXBlcmxpbms9XHViYTU0XHVjMThjXHViNGRjIFx1Y2MzOFx1Yzg3MCBcdWI2MTBcdWIyOTQgXHVkNTU4XHVjNzc0XHVkMzdjXHViOWMxXHVkMDZjKFVSTCkgXHVjZDk0XHVhYzAwDQotQ2hlYXRzaGVldEFwcGx5Q2FwYWJpbGl0eVBhdHRlcm49XHVhZTMwXHViMmE1IFx1ZDMyOFx1ZDEzNCBcdWM4MDFcdWM2YTkNCi1DaGVhdHNoZWV0Q3JlYXRlUHJvY2Vzcz1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQoXHVhZTMwXHViMmE1IFx1ZDMyOFx1ZDEzNCBcdWI2MTBcdWIyOTQgXHVjODA0XHViMmVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCkgXHVjNzkxXHVjMTMxDQotDQotIyBBY3Rpb24gU2V0DQotYXV0aG9yaW5nQWN0aW9uU2V0PVx1Yzc5MVx1YzEzMQ0KLWNoZWF0U2hlZXRzQWN0aW9uU2V0PVx1Y2U1OFx1ZDJiOCBcdWMyZGNcdWQyYjgNCi0NCi0jIEdsb2JhbCBBY3Rpb25zDQotbmV3TGlicmFyeUFjdGlvbj1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjKCZMKQ0KLW5ld0xpYnJhcnlBY3Rpb25Ub29sdGlwPVx1YzBjOCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1Yzc5MVx1YzEzMQ0KLW5ld1BsdWdpbkFjdGlvbj1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4KCZQKQ0KLW5ld1BsdWdpbkFjdGlvblRvb2x0aXA9XHVjMGM4IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzggXHVjNzkxXHVjMTMxDQotbmV3Q29uZmlnQWN0aW9uPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzEoJkMpDQotbmV3Q29uZmlnQWN0aW9uVG9vbHRpcD1cdWMwYzggXHViYTU0XHVjMThjXHViNGRjIFx1YWQ2Y1x1YzEzMSBcdWM3OTFcdWMxMzENCi1vcGVuTGlicmFyeUFjdGlvbj1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjKCZMKQ0KLW9wZW5MaWJyYXJ5QWN0aW9uVG9vbHRpcD1cdWFlMzBcdWM4NzQgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWM1ZjRcdWFlMzANCi1vcGVuQ29uZmlnQWN0aW9uPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzEoJkMpDQotb3BlbkNvbmZpZ0FjdGlvblRvb2x0aXA9XHVhZTMwXHVjODc0IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzEgXHVjNWY0XHVhZTMwDQotb3BlbkNoZWF0U2hlZXRzPVx1Y2U1OFx1ZDJiOCBcdWMyZGNcdWQyYjguLi4NCi0NCi0jIExpYnJhcnkgVmlldyBBY3Rpb25zDQotbGlua1dpdGhFZGl0b3I9XHVkM2I4XHVjOWQxXHVhZTMwXHVjNjQwIFx1YjljMVx1ZDA2Yw0KLWxpbmtXaXRoRWRpdG9yVG9vbHRpcD1cdWQzYjhcdWM5ZDFcdWFlMzBcdWM2NDAgXHViOWMxXHVkMDZjDQotc2hvd1ByZXNlbnRhdGlvbk5hbWVzPVx1ZDQ1Y1x1YzJkYyBcdWM3NzRcdWI5ODRcdWM3NTggXHVkNDVjXHVjMmRjDQotc2hvd1ByZXNlbnRhdGlvbk5hbWVzVG9vbHRpcD1cdWQ0NWNcdWMyZGMgXHVjNzc0XHViOTg0XHVjNzU4IFx1ZDQ1Y1x1YzJkYw0KLQ0KLSMgQ29uZmlndXJhdGlvbiBWaWV3IEFjdGlvbnMNCi1yZWZyZXNoQ29uZmlnPVx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNThcdWFlMzANCi1yZWZyZXNoQ29uZmlnVG9vbHRpcD1cdWMwYzhcdWI4NWMgXHVhY2UwXHVjZTU4XHVhZTMwIFx1YWQ2Y1x1YzEzMQ0KLQ0KLSMgUHJlZmVyZW5jZSBQYWdlDQotbWV0aG9kQXV0aG9yaW5nUGFnZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNzkxXHVjMTMxDQotcHJvY2Vzc0VkaXRvcj1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVkM2I4XHVjOWQxXHVhZTMwDQotbGlicmFyeU9wdGlvbnM9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YzYzNVx1YzE1OA0KLWRpYWdyYW09XHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4DQotc3RhcnR1cEFuZFNodXRkb3duPVx1YzJkY1x1Yzc5MSBcdWJjMGYgXHVjMmRjXHVjMmE0XHVkMTVjIFx1Yzg4NVx1YjhjYw0KLWRlYnVnPVx1YjUxNFx1YmM4NFx1YWRmOA0KLQ0KLSMgQ29tbWFuZCBIYW5kbGVyDQotc2VsZWN0QWxsPVx1YmFhOFx1YjQ1MCBcdWMxMjBcdWQwZGQNCi0NCi0jIFByb3BlcnRpZXMgVmlldw0KLV9VSV9Qcm9jZXNzRWRpdG9yX21lbnU9XHVkNTA0XHViODVjXHVjMTM4XHVjMmE0DQotX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbT1cdWMwYzggXHVkNTU4XHVjNzA0KCZOKQ0KLV9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbT1cdWMwYzggXHViM2Q5XHVjNzA0KCZFKQ0KLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPVx1ZDJiOVx1YzEzMSBcdWJjZjRcdWFlMzAgXHVkNDVjXHVjMmRjKCZWKQ0KLV9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbT1cdWMwYzhcdWI4NWMgXHVhY2UwXHVjZTU4XHVhZTMwKCZGKQ0KLV9VSV9Qcm9wZXJ0aWVzX0dlbmVyYWw9XHVjNzdjXHViYzE4DQotX1VJX1Byb3BlcnRpZXNfRG9jdW1lbnRhdGlvbj1cdWJiMzhcdWMxMWMNCi1fVUlfUHJvcGVydGllc19HdWlkYW5jZT1cdWM1NDhcdWIwYjQNCi1fVUlfUHJvcGVydGllc19Xb3JrX1JvbGx1cD1cdWM3OTFcdWM1YzUgXHViODY0XHVjNWM1DQotX1VJX1Byb3BlcnRpZXNfVGVhbV9Sb2xsdXA9XHVkMzAwIFx1Yjg2NFx1YzVjNQ0KLSMjIFRoZSBmb2xsb3dpbmcgdmFsdWUgb2Ygc3RyaW5nIHNob3VsZCBiZSAiV29yayBQcm9kdWN0IFJvbGx1cCIuIEJ1dA0KLSMjIGR1ZSB0byBsaW1pdGF0aW9uL2J1ZyBpbiBFY2xpcHNlIFdUUCwgaXQncyBiZWVuIHRydW5jYXRlZCB0byANCi0jIyAiV29yayBQcm9kIFJvbGx1cCIuIFNvIGR1cmluZyB0cmFuc2xhdGlvbiwgcGxlYXNlIHRha2UgdGhpcyBpbnRvIGNvbnNpZGVyYXRpb24uDQotX1VJX1Byb3BlcnRpZXNfV1BfUm9sbHVwPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHViODY0XHVjNWM1DQotX1VJX1Byb3BlcnRpZXNfUm9sZXM9XHVjNWVkXHVkNTYwDQotX1VJX1Byb3BlcnRpZXNfV29ya1Byb2R1Y3RzPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi1fVUlfUHJvcGVydGllc19TdGVwcz1cdWIyZThcdWFjYzQNCi1fVUlfUHJvcGVydGllc19UZWFtcz1cdWQzMDANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMThlYTgwZS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9VUkgZGUgQXV0b3JpYSBkbyBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIENhdGVnb3J5DQotbWV0aG9kQ2F0ZWdvcnlOYW1lPU1cdTAwZTl0b2RvDQotDQotIyBQZXJzcGVjdGl2ZQ0KLWF1dGhvcmluZ1BlcnNwZWN0aXZlTmFtZT1BdXRvcmlhDQotYnJvd3NpbmdQZXJzcGVjdGl2ZU5hbWU9TmF2ZWdhXHUwMGU3XHUwMGUzbw0KLQ0KLSMgVmlld3MNCi1saWJyYXJ5Vmlld05hbWU9QmlibGlvdGVjYQ0KLWNvbmZpZ3VyYXRpb25WaWV3TmFtZT1Db25maWd1cmFcdTAwZTdcdTAwZTNvDQotY29udGVudFZpZXdOYW1lPUNvbnRlXHUwMGZhZG8NCi1jb25maWd1cmF0aW9uRXJyb3JMb2dWaWV3TmFtZT1SZWdpc3RybyBkZSBFcnJvcyBkZSBDb25maWd1cmFcdTAwZTdcdTAwZTNvDQotDQotIyBFZGl0b3JzDQotbWV0aG9kRWxlbWVudEVkaXRvck5hbWU9RWRpdG9yIGRlIEVsZW1lbnRvIGRlIE1cdTAwZTl0b2RvDQotY29uZmlndXJhdGlvbkVkaXRvck5hbWU9RWRpdG9yIGRlIENvbmZpZ3VyYVx1MDBlN1x1MDBlM28NCi1wcm9jZXNzRWRpdG9yTmFtZT1FZGl0b3IgZGUgUHJvY2Vzc28NCi1hY3Rpdml0eURpYWdyYW1FZGl0b3JOYW1lPUVkaXRvciBkZSBEaWFncmFtYSBkZSBBdGl2aWRhZGVzDQotYWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yTmFtZT1FZGl0b3IgZGUgRGlhZ3JhbWEgZGUgRGV0YWxoZXMgZGUgQXRpdmlkYWRlcw0KLXdvcmtQcm9kdWN0RGVwZWRlbmN5RGlhZ3JhbUVkaXRvck5hbWU9RWRpdG9yIGRlIERpYWdyYW1hIGRlIERlcGVuZFx1MDBlYW5jaWEgZGUgUHJvZHV0byBkZSBUcmFiYWxobw0KLQ0KLSMgQ2hlYXQgU2hlZXRzDQotbWV0aG9kQXV0aG9yaW5nQ2hlYXRTaGVldHNOYW1lPUZvbGhhcyBkZSBEaWNhcyBkZSBBdXRvcmlhIGRlIE1cdTAwZTl0b2RvDQotQ2hlYXRzaGVldEdldHN0YXJ0ZWRDYXRlZ29yeVRleHQ9R3VpYSBkZSBJbnRyb2R1XHUwMGU3XHUwMGUzbw0KLUNoZWF0c2hlZXRSZXVzYWJsZUNvbnRlbnRDYXRlZ29yeVRleHQ9Q3JpYXIgQ29udGVcdTAwZmFkbyBkZSBNXHUwMGU5dG9kbyBSZXV0aWxpelx1MDBlMXZlbA0KLUNoZWF0c2hlZXRXcml0ZUNvbnRlbnRDYXRlZ29yeVRleHQ9R3JhdmFyIENvbnRlXHUwMGZhZG8gZGUgTVx1MDBlOXRvZG8NCi1DaGVhdHNoZWV0UHJvY2Vzc2VzQ2F0ZWdvcnlUZXh0PVRyYWJhbGhhciBjb20gUHJvY2Vzc29zDQotQ2hlYXRzaGVldE5hdmlnYXRlTWV0aG9kQ29udGVudD1OYXZlZ2FyIENvbnRlXHUwMGZhZG8gZGUgTVx1MDBlOXRvZG8NCi1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbj1DcmlhciBTdWEgUHJcdTAwZjNwcmlhIENvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGUgTVx1MDBlOXRvZG8NCi1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kUGx1Z2luPUNyaWFyIFNldSBQclx1MDBmM3ByaW8gUGx1Zy1pbiBkZSBNXHUwMGU5dG9kbw0KLUNoZWF0c2hlZXRBZGRNZXRob2RDb250ZW50PUluY2x1aXIgTm92byBDb250ZVx1MDBmYWRvIGRlIE1cdTAwZTl0b2RvLCBjb21vIEZ1blx1MDBlN1x1MDBmNWVzLCBUYXJlZmFzLCBQcm9kdXRvcyBkZSBUcmFiYWxobyBvdSBPcmllbnRhXHUwMGU3XHUwMGUzbw0KLUNoZWF0c2hlZXRUYWlsb3JNZXRob2RFbGVtZW50cz1BZGFwdGFyIEVsZW1lbnRvcyBkZSBNXHUwMGU5dG9kbyBFeGlzdGVudGVzIChGdW5cdTAwZTdcdTAwZjVlcywgVGFyZWZhcywgUHJvZHV0b3MgZGUgVHJhYmFsaG8gb3UgT3JpZW50YVx1MDBlN1x1MDBlM28pIFV0aWxpemFuZG8gQ29udHJpYnVpXHUwMGU3XHUwMGUzbw0KLUNoZWF0c2hlZXRSZXBsYWNlTWVodG9kRWxlbWVudHM9U3Vic3RpdHVpciBFbGVtZW50b3MgZGUgTVx1MDBlOXRvZG8gRXhpc3RlbnRlcyAoRnVuXHUwMGU3XHUwMGY1ZXMsIFRhcmVmYXMsIFByb2R1dG9zIGRlIFRyYWJhbGhvIG91IE9yaWVudGFcdTAwZTdcdTAwZTNvKQ0KLUNoZWF0c2hlZXRBZGRNZXRob2RSZWZPckh5cGVybGluaz1JbmNsdWlyIHVtYSBSZWZlclx1MDBlYW5jaWEgb3UgSHlwZXJsaW5rIChVUkwpIGRlIE1cdTAwZTl0b2RvDQotQ2hlYXRzaGVldEFwcGx5Q2FwYWJpbGl0eVBhdHRlcm49QXBsaWNhciB1bSBQYWRyXHUwMGUzbyBkZSBSZWN1cnNvDQotQ2hlYXRzaGVldENyZWF0ZVByb2Nlc3M9Q3JpYXIgdW0gUHJvY2Vzc28gKFBhZHJcdTAwZTNvIGRlIFJlY3Vyc28gb3UgUHJvY2Vzc28gZGUgRW50cmVnYSkNCi0NCi0jIEFjdGlvbiBTZXQNCi1hdXRob3JpbmdBY3Rpb25TZXQ9QXV0b3JpYQ0KLWNoZWF0U2hlZXRzQWN0aW9uU2V0PUZvbGhhcyBkZSBEaWNhcw0KLQ0KLSMgR2xvYmFsIEFjdGlvbnMNCi1uZXdMaWJyYXJ5QWN0aW9uPSZCaWJsaW90ZWNhIGRlIE1cdTAwZTl0b2Rvcw0KLW5ld0xpYnJhcnlBY3Rpb25Ub29sdGlwPUNyaWFyIHVtYSBOb3ZhIEJpYmxpb3RlY2EgZGUgTVx1MDBlOXRvZG9zDQotbmV3UGx1Z2luQWN0aW9uPSZQbHVnLWluIGRlIE1cdTAwZTl0b2RvDQotbmV3UGx1Z2luQWN0aW9uVG9vbHRpcD1DcmlhciB1bSBOb3ZvIFBsdWctaW4gZGUgTVx1MDBlOXRvZG8NCi1uZXdDb25maWdBY3Rpb249JkNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGUgTVx1MDBlOXRvZG8NCi1uZXdDb25maWdBY3Rpb25Ub29sdGlwPUNyaWFyIHVtYSBOb3ZhIENvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGUgTVx1MDBlOXRvZG8NCi1vcGVuTGlicmFyeUFjdGlvbj0mQmlibGlvdGVjYSBkZSBNXHUwMGU5dG9kb3MNCi1vcGVuTGlicmFyeUFjdGlvblRvb2x0aXA9QWJyaXIgdW1hIEJpYmxpb3RlY2EgZGUgTVx1MDBlOXRvZG9zIEV4aXN0ZW50ZQ0KLW9wZW5Db25maWdBY3Rpb249JkNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGUgTVx1MDBlOXRvZG8NCi1vcGVuQ29uZmlnQWN0aW9uVG9vbHRpcD1BYnJpciB1bWEgQ29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBNXHUwMGU5dG9kbyBFeGlzdGVudGUNCi1vcGVuQ2hlYXRTaGVldHM9Rm9saGFzIGRlIERpY2FzLi4uDQotDQotIyBMaWJyYXJ5IFZpZXcgQWN0aW9ucw0KLWxpbmtXaXRoRWRpdG9yPUxpbmsgY29tIEVkaXRvcg0KLWxpbmtXaXRoRWRpdG9yVG9vbHRpcD1MaW5rIGNvbSBFZGl0b3INCi1zaG93UHJlc2VudGF0aW9uTmFtZXM9TW9zdHJhciBOb21lcyBkZSBBcHJlc2VudGFcdTAwZTdcdTAwZTNvDQotc2hvd1ByZXNlbnRhdGlvbk5hbWVzVG9vbHRpcD1Nb3N0cmFyIE5vbWVzIGRlIEFwcmVzZW50YVx1MDBlN1x1MDBlM28NCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBBY3Rpb25zDQotcmVmcmVzaENvbmZpZz1BdHVhbGl6YXINCi1yZWZyZXNoQ29uZmlnVG9vbHRpcD1BdHVhbGl6YXIgQ29uZmlndXJhXHUwMGU3XHUwMGUzbw0KLQ0KLSMgUHJlZmVyZW5jZSBQYWdlDQotbWV0aG9kQXV0aG9yaW5nUGFnZT1BdXRvcmlhIGRlIE1cdTAwZTl0b2RvDQotcHJvY2Vzc0VkaXRvcj1FZGl0b3IgZGUgUHJvY2Vzc28NCi1saWJyYXJ5T3B0aW9ucz1PcFx1MDBlN1x1MDBmNWVzIGRlIEJpYmxpb3RlY2ENCi1kaWFncmFtPURpYWdyYW1hDQotc3RhcnR1cEFuZFNodXRkb3duPUluaWNpYWxpemFcdTAwZTdcdTAwZTNvIGUgRW5jZXJyYW1lbnRvDQotZGVidWc9RGVwdXJhcg0KLQ0KLSMgQ29tbWFuZCBIYW5kbGVyDQotc2VsZWN0QWxsPVNlbGVjaW9uYXIgVHVkbw0KLQ0KLSMgUHJvcGVydGllcyBWaWV3DQotX1VJX1Byb2Nlc3NFZGl0b3JfbWVudT1Qcm9jZXNzbw0KLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09Jk5vdm8gRmlsaG8NCi1fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW09TiZvdm8gSXJtXHUwMGUzbw0KLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPU1vc3RyYXIgJlZpc3VhbGl6YVx1MDBlN1x1MDBlM28gZGUgUHJvcHJpZWRhZGVzDQotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPUF0dWFsaSZ6YXINCi1fVUlfUHJvcGVydGllc19HZW5lcmFsPUdlcmFsDQotX1VJX1Byb3BlcnRpZXNfRG9jdW1lbnRhdGlvbj1Eb2N1bWVudGFcdTAwZTdcdTAwZTNvDQotX1VJX1Byb3BlcnRpZXNfR3VpZGFuY2U9T3JpZW50YVx1MDBlN1x1MDBlM28NCi1fVUlfUHJvcGVydGllc19Xb3JrX1JvbGx1cD1MaXN0YSBkbyBUcmFiYWxobw0KLV9VSV9Qcm9wZXJ0aWVzX1RlYW1fUm9sbHVwPUxpc3RhIGRhIEVxdWlwZQ0KLSMjIFRoZSBmb2xsb3dpbmcgdmFsdWUgb2Ygc3RyaW5nIHNob3VsZCBiZSAiV29yayBQcm9kdWN0IFJvbGx1cCIuIEJ1dA0KLSMjIGR1ZSB0byBsaW1pdGF0aW9uL2J1ZyBpbiBFY2xpcHNlIFdUUCwgaXQncyBiZWVuIHRydW5jYXRlZCB0byANCi0jIyAiV29yayBQcm9kIFJvbGx1cCIuIFNvIGR1cmluZyB0cmFuc2xhdGlvbiwgcGxlYXNlIHRha2UgdGhpcyBpbnRvIGNvbnNpZGVyYXRpb24uDQotX1VJX1Byb3BlcnRpZXNfV1BfUm9sbHVwPUxpc3RhIGRlIFByb2R1dG9zIGRlIFRyYWJhbGhvDQotX1VJX1Byb3BlcnRpZXNfUm9sZXM9RnVuXHUwMGU3XHUwMGY1ZXMNCi1fVUlfUHJvcGVydGllc19Xb3JrUHJvZHVjdHM9UHJvZHV0b3MgZGUgVHJhYmFsaG8NCi1fVUlfUHJvcGVydGllc19TdGVwcz1FdGFwYXMNCi1fVUlfUHJvcGVydGllc19UZWFtcz1FcXVpcGVzDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVkNGFmYjIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdTdmMTZcdTUxOTlcdTc1MjhcdTYyMzdcdTc1NGNcdTk3NjINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIENhdGVnb3J5DQotbWV0aG9kQ2F0ZWdvcnlOYW1lPVx1NjViOVx1NmNkNQ0KLQ0KLSMgUGVyc3BlY3RpdmUNCi1hdXRob3JpbmdQZXJzcGVjdGl2ZU5hbWU9XHU3ZjE2XHU1MTk5DQotYnJvd3NpbmdQZXJzcGVjdGl2ZU5hbWU9XHU2ZDRmXHU4OWM4DQotDQotIyBWaWV3cw0KLWxpYnJhcnlWaWV3TmFtZT1cdTVlOTMNCi1jb25maWd1cmF0aW9uVmlld05hbWU9XHU5MTRkXHU3ZjZlDQotY29udGVudFZpZXdOYW1lPVx1NTE4NVx1NWJiOQ0KLWNvbmZpZ3VyYXRpb25FcnJvckxvZ1ZpZXdOYW1lPVx1OTE0ZFx1N2Y2ZVx1OTUxOVx1OGJlZlx1NjVlNVx1NWZkNw0KLQ0KLSMgRWRpdG9ycw0KLW1ldGhvZEVsZW1lbnRFZGl0b3JOYW1lPVx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMFx1N2YxNlx1OGY5MVx1NTY2OA0KLWNvbmZpZ3VyYXRpb25FZGl0b3JOYW1lPVx1OTE0ZFx1N2Y2ZVx1N2YxNlx1OGY5MVx1NTY2OA0KLXByb2Nlc3NFZGl0b3JOYW1lPVx1NmQ0MVx1N2EwYlx1N2YxNlx1OGY5MVx1NTY2OA0KLWFjdGl2aXR5RGlhZ3JhbUVkaXRvck5hbWU9XHU2ZDNiXHU1MmE4XHU1NmZlXHU3ZjE2XHU4ZjkxXHU1NjY4DQotYWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yTmFtZT1cdTZkM2JcdTUyYThcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTU2ZmVcdTdmMTZcdThmOTFcdTU2NjgNCi13b3JrUHJvZHVjdERlcGVkZW5jeURpYWdyYW1FZGl0b3JOYW1lPVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NGY5ZFx1OGQ1Nlx1NTE3M1x1N2NmYlx1NTZmZVx1N2YxNlx1OGY5MVx1NTY2OA0KLQ0KLSMgQ2hlYXQgU2hlZXRzDQotbWV0aG9kQXV0aG9yaW5nQ2hlYXRTaGVldHNOYW1lPVx1NjViOVx1NmNkNVx1N2YxNlx1NTE5OVx1NTkwN1x1NWZkOFx1NTM1NQ0KLUNoZWF0c2hlZXRHZXRzdGFydGVkQ2F0ZWdvcnlUZXh0PVx1NTE2NVx1OTVlOA0KLUNoZWF0c2hlZXRSZXVzYWJsZUNvbnRlbnRDYXRlZ29yeVRleHQ9XHU1MjFiXHU1ZWZhXHU1M2VmXHU1OTBkXHU3NTI4XHU3Njg0XHU2NWI5XHU2Y2Q1XHU1MTg1XHU1YmI5DQotQ2hlYXRzaGVldFdyaXRlQ29udGVudENhdGVnb3J5VGV4dD1cdTUxOTlcdTY1YjlcdTZjZDVcdTUxODVcdTViYjkNCi1DaGVhdHNoZWV0UHJvY2Vzc2VzQ2F0ZWdvcnlUZXh0PVx1NTkwNFx1NzQwNlx1NmQ0MVx1N2EwYg0KLUNoZWF0c2hlZXROYXZpZ2F0ZU1ldGhvZENvbnRlbnQ9XHU2ZDRmXHU4OWM4XHU2NWI5XHU2Y2Q1XHU1MTg1XHU1YmI5DQotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb249XHU1MjFiXHU1ZWZhXHU2MGE4XHU4MWVhXHU1ZGYxXHU3Njg0XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZFBsdWdpbj1cdTUyMWJcdTVlZmFcdTYwYThcdTgxZWFcdTVkZjFcdTc2ODRcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjYNCi1DaGVhdHNoZWV0QWRkTWV0aG9kQ29udGVudD1cdTZkZmJcdTUyYTBcdTY1YjBcdTY1YjlcdTZjZDVcdTUxODVcdTViYjlcdWZmMGNcdTRmOGJcdTU5ODJcdTg5ZDJcdTgyNzJcdTMwMDFcdTRlZmJcdTUyYTFcdTMwMDFcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTYyMTZcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmYNCi1DaGVhdHNoZWV0VGFpbG9yTWV0aG9kRWxlbWVudHM9XHU0ZjdmXHU3NTI4XHU2M2QwXHU0ZjliXHU1YjlhXHU1MjM2XHU3M2IwXHU2NzA5XHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHVmZjA4XHU4OWQyXHU4MjcyXHUzMDAxXHU0ZWZiXHU1MmExXHUzMDAxXHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU2MjE2XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHVmZjA5DQotQ2hlYXRzaGVldFJlcGxhY2VNZWh0b2RFbGVtZW50cz1cdTY2ZmZcdTYzNjJcdTczYjBcdTY3MDlcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdWZmMDhcdTg5ZDJcdTgyNzJcdTMwMDFcdTRlZmJcdTUyYTFcdTMwMDFcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTYyMTZcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdWZmMDkNCi1DaGVhdHNoZWV0QWRkTWV0aG9kUmVmT3JIeXBlcmxpbms9XHU2ZGZiXHU1MmEwXHU2NWI5XHU2Y2Q1XHU1ZjE1XHU3NTI4XHU2MjE2XHU4ZDg1XHU5NGZlXHU2M2E1XHVmZjA4VVJMXHVmZjA5DQotQ2hlYXRzaGVldEFwcGx5Q2FwYWJpbGl0eVBhdHRlcm49XHU1ZTk0XHU3NTI4XHU4MGZkXHU1MjliXHU2YTIxXHU1ZjBmDQotQ2hlYXRzaGVldENyZWF0ZVByb2Nlc3M9XHU1MjFiXHU1ZWZhXHU2ZDQxXHU3YTBiXHVmZjA4XHU4MGZkXHU1MjliXHU2YTIxXHU1ZjBmXHU2MjE2XHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiXHVmZjA5DQotDQotIyBBY3Rpb24gU2V0DQotYXV0aG9yaW5nQWN0aW9uU2V0PVx1N2YxNlx1NTE5OQ0KLWNoZWF0U2hlZXRzQWN0aW9uU2V0PVx1NTkwN1x1NWZkOFx1NTM1NQ0KLQ0KLSMgR2xvYmFsIEFjdGlvbnMNCi1uZXdMaWJyYXJ5QWN0aW9uPVx1NjViOVx1NmNkNVx1NWU5MygmTCkNCi1uZXdMaWJyYXJ5QWN0aW9uVG9vbHRpcD1cdTUyMWJcdTVlZmFcdTY1YjBcdTY1YjlcdTZjZDVcdTVlOTMNCi1uZXdQbHVnaW5BY3Rpb249XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2KCZQKQ0KLW5ld1BsdWdpbkFjdGlvblRvb2x0aXA9XHU1MjFiXHU1ZWZhXHU2NWIwXHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2DQotbmV3Q29uZmlnQWN0aW9uPVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZSgmQykNCi1uZXdDb25maWdBY3Rpb25Ub29sdGlwPVx1NTIxYlx1NWVmYVx1NjViMFx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZQ0KLW9wZW5MaWJyYXJ5QWN0aW9uPVx1NjViOVx1NmNkNVx1NWU5MygmTCkNCi1vcGVuTGlicmFyeUFjdGlvblRvb2x0aXA9XHU2MjUzXHU1ZjAwXHU3M2IwXHU2NzA5XHU2NWI5XHU2Y2Q1XHU1ZTkzDQotb3BlbkNvbmZpZ0FjdGlvbj1cdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmUoJkMpDQotb3BlbkNvbmZpZ0FjdGlvblRvb2x0aXA9XHU2MjUzXHU1ZjAwXHU3M2IwXHU2NzA5XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotb3BlbkNoZWF0U2hlZXRzPVx1NTkwN1x1NWZkOFx1NTM1NS4uLg0KLQ0KLSMgTGlicmFyeSBWaWV3IEFjdGlvbnMNCi1saW5rV2l0aEVkaXRvcj1cdTk0ZmVcdTYzYTVcdTdmMTZcdThmOTFcdTU2NjgNCi1saW5rV2l0aEVkaXRvclRvb2x0aXA9XHU5NGZlXHU2M2E1XHU3ZjE2XHU4ZjkxXHU1NjY4DQotc2hvd1ByZXNlbnRhdGlvbk5hbWVzPVx1NjdlNVx1NzcwYlx1NjYzZVx1NzkzYVx1NTQwZFx1NzlmMA0KLXNob3dQcmVzZW50YXRpb25OYW1lc1Rvb2x0aXA9XHU2N2U1XHU3NzBiXHU2NjNlXHU3OTNhXHU1NDBkXHU3OWYwDQotDQotIyBDb25maWd1cmF0aW9uIFZpZXcgQWN0aW9ucw0KLXJlZnJlc2hDb25maWc9XHU1MjM3XHU2NWIwDQotcmVmcmVzaENvbmZpZ1Rvb2x0aXA9XHU1MjM3XHU2NWIwXHU5MTRkXHU3ZjZlDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1tZXRob2RBdXRob3JpbmdQYWdlPVx1NjViOVx1NmNkNVx1N2YxNlx1NTE5OQ0KLXByb2Nlc3NFZGl0b3I9XHU2ZDQxXHU3YTBiXHU3ZjE2XHU4ZjkxXHU1NjY4DQotbGlicmFyeU9wdGlvbnM9XHU1ZTkzXHU5MDA5XHU5ODc5DQotZGlhZ3JhbT1cdTU2ZmUNCi1zdGFydHVwQW5kU2h1dGRvd249XHU1NDJmXHU1MmE4XHU1NDhjXHU1MTczXHU5NWVkDQotZGVidWc9XHU4YzAzXHU4YmQ1DQotDQotIyBDb21tYW5kIEhhbmRsZXINCi1zZWxlY3RBbGw9XHU1MTY4XHU5MGU4XHU5MDA5XHU0ZTJkDQotDQotIyBQcm9wZXJ0aWVzIFZpZXcNCi1fVUlfUHJvY2Vzc0VkaXRvcl9tZW51PVx1NmQ0MVx1N2EwYg0KLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09XHU2NWIwXHU1ZWZhXHU1YjUwXHU0ZWUzKCZOKQ0KLV9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbT1cdTY1YjBcdTVlZmFcdTU0MGNcdTRlZTMoJkUpDQotX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW09XHU2NjNlXHU3OTNhXHU1YzVlXHU2MDI3XHU4OWM2XHU1NmZlKCZWKQ0KLV9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbT1cdTUyMzdcdTY1YjAoJkYpDQotX1VJX1Byb3BlcnRpZXNfR2VuZXJhbD1cdTVlMzhcdTg5YzQNCi1fVUlfUHJvcGVydGllc19Eb2N1bWVudGF0aW9uPVx1NjU4N1x1Njg2Mw0KLV9VSV9Qcm9wZXJ0aWVzX0d1aWRhbmNlPVx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zg0KLV9VSV9Qcm9wZXJ0aWVzX1dvcmtfUm9sbHVwPVx1NWRlNVx1NGY1Y1x1NGUwYVx1NmVkYQ0KLV9VSV9Qcm9wZXJ0aWVzX1RlYW1fUm9sbHVwPVx1NTZlMlx1OTYxZlx1NGUwYVx1NmVkYQ0KLSMjIFRoZSBmb2xsb3dpbmcgdmFsdWUgb2Ygc3RyaW5nIHNob3VsZCBiZSAiV29yayBQcm9kdWN0IFJvbGx1cCIuIEJ1dA0KLSMjIGR1ZSB0byBsaW1pdGF0aW9uL2J1ZyBpbiBFY2xpcHNlIFdUUCwgaXQncyBiZWVuIHRydW5jYXRlZCB0byANCi0jIyAiV29yayBQcm9kIFJvbGx1cCIuIFNvIGR1cmluZyB0cmFuc2xhdGlvbiwgcGxlYXNlIHRha2UgdGhpcyBpbnRvIGNvbnNpZGVyYXRpb24uDQotX1VJX1Byb3BlcnRpZXNfV1BfUm9sbHVwPVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NGUwYVx1NmVkYQ0KLV9VSV9Qcm9wZXJ0aWVzX1JvbGVzPVx1ODlkMlx1ODI3Mg0KLV9VSV9Qcm9wZXJ0aWVzX1dvcmtQcm9kdWN0cz1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzENCi1fVUlfUHJvcGVydGllc19TdGVwcz1cdTZiNjVcdTlhYTQNCi1fVUlfUHJvcGVydGllc19UZWFtcz1cdTU2ZTJcdTk2MWYNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2YxNDJhYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIEF1dGhvcmluZyBVSQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgQ2F0ZWdvcnkNCi1tZXRob2RDYXRlZ29yeU5hbWU9XHU2NWI5XHU2Y2Q1DQotDQotIyBQZXJzcGVjdGl2ZQ0KLWF1dGhvcmluZ1BlcnNwZWN0aXZlTmFtZT1cdTdkZThcdTViZWINCi1icm93c2luZ1BlcnNwZWN0aXZlTmFtZT1cdTcwMGZcdTg5YmQNCi0NCi0jIFZpZXdzDQotbGlicmFyeVZpZXdOYW1lPVx1N2EwYlx1NWYwZlx1NWVhYg0KLWNvbmZpZ3VyYXRpb25WaWV3TmFtZT1cdTkxNGRcdTdmNmUNCi1jb250ZW50Vmlld05hbWU9XHU1MTY3XHU1YmI5DQotY29uZmlndXJhdGlvbkVycm9yTG9nVmlld05hbWU9XHU5MTRkXHU3ZjZlXHU5MzJmXHU4YWE0XHU2NWU1XHU4YThjDQotDQotIyBFZGl0b3JzDQotbWV0aG9kRWxlbWVudEVkaXRvck5hbWU9XHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU3ZGU4XHU4ZjJmXHU1NjY4DQotY29uZmlndXJhdGlvbkVkaXRvck5hbWU9XHU5MTRkXHU3ZjZlXHU3ZGU4XHU4ZjJmXHU1NjY4DQotcHJvY2Vzc0VkaXRvck5hbWU9XHU3YTBiXHU1ZThmXHU3ZGU4XHU4ZjJmXHU1NjY4DQotYWN0aXZpdHlEaWFncmFtRWRpdG9yTmFtZT1cdTZkM2JcdTUyZDVcdTU3MTZcdTdkZThcdThmMmZcdTU2NjgNCi1hY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JOYW1lPVx1NmQzYlx1NTJkNVx1NjYwZVx1N2QzMFx1NTcxNlx1N2RlOFx1OGYyZlx1NTY2OA0KLXdvcmtQcm9kdWN0RGVwZWRlbmN5RGlhZ3JhbUVkaXRvck5hbWU9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU3NmY4XHU0ZjlkXHU5NWRjXHU0ZmMyXHU1NzE2XHU3ZGU4XHU4ZjJmXHU1NjY4DQotDQotIyBDaGVhdCBTaGVldHMNCi1tZXRob2RBdXRob3JpbmdDaGVhdFNoZWV0c05hbWU9XHU2NWI5XHU2Y2Q1XHU3ZGU4XHU1YmViXHU2M2QwXHU4OTgxDQotQ2hlYXRzaGVldEdldHN0YXJ0ZWRDYXRlZ29yeVRleHQ9XHU1MTY1XHU5NTgwDQotQ2hlYXRzaGVldFJldXNhYmxlQ29udGVudENhdGVnb3J5VGV4dD1cdTVlZmFcdTdhY2JcdTUzZWZcdTkxY2RcdTg5MDdcdTRmN2ZcdTc1MjhcdTc2ODRcdTY1YjlcdTZjZDVcdTUxNjdcdTViYjkNCi1DaGVhdHNoZWV0V3JpdGVDb250ZW50Q2F0ZWdvcnlUZXh0PVx1NWJlYlx1NTE2NVx1NjViOVx1NmNkNVx1NTE2N1x1NWJiOQ0KLUNoZWF0c2hlZXRQcm9jZXNzZXNDYXRlZ29yeVRleHQ9XHU0ZjdmXHU3NTI4XHU3YTBiXHU1ZThmDQotQ2hlYXRzaGVldE5hdmlnYXRlTWV0aG9kQ29udGVudD1cdTVjMGVcdTg5YmRcdTY1YjlcdTZjZDVcdTUxNjdcdTViYjkNCi1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbj1cdTVlZmFcdTdhY2JcdTgxZWFcdTVkZjFcdTc2ODRcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmUNCi1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kUGx1Z2luPVx1NWVmYVx1N2FjYlx1ODFlYVx1NWRmMVx1NzY4NFx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZg0KLUNoZWF0c2hlZXRBZGRNZXRob2RDb250ZW50PVx1NjViMFx1NTg5ZVx1NjViOVx1NmNkNVx1NTE2N1x1NWJiOVx1ZmYwY1x1NGY4Ylx1NTk4Mlx1ODlkMlx1ODI3Mlx1MzAwMVx1NGY1Y1x1Njk2ZFx1MzAwMVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1NjIxNlx1NjMwN1x1NWYxNQ0KLUNoZWF0c2hlZXRUYWlsb3JNZXRob2RFbGVtZW50cz1cdTRmN2ZcdTc1MjhcdTk2NDRcdTUyYTBcdTg5ODFcdTdkMjBcdThhYmZcdTY1NzRcdTczZmVcdTY3MDlcdTc2ODRcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdWZmMDhcdTg5ZDJcdTgyNzJcdTMwMDFcdTRmNWNcdTY5NmRcdTMwMDFcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTYyMTZcdTYzMDdcdTVmMTVcdWZmMDkNCi1DaGVhdHNoZWV0UmVwbGFjZU1laHRvZEVsZW1lbnRzPVx1NTNkNlx1NGVlM1x1NzNmZVx1NjcwOVx1NzY4NFx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMFx1ZmYwOFx1ODlkMlx1ODI3Mlx1MzAwMVx1NGY1Y1x1Njk2ZFx1MzAwMVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1NjIxNlx1NjMwN1x1NWYxNVx1ZmYwOQ0KLUNoZWF0c2hlZXRBZGRNZXRob2RSZWZPckh5cGVybGluaz1cdTY1YjBcdTU4OWVcdTY1YjlcdTZjZDVcdTUzYzNcdTcxNjdcdTYyMTZcdThkODVcdTkzYzhcdTdkNTAgKFVSTCkNCi1DaGVhdHNoZWV0QXBwbHlDYXBhYmlsaXR5UGF0dGVybj1cdTU5NTdcdTc1MjhcdTUyOWZcdTgwZmRcdTU3OGJcdTZhMjMNCi1DaGVhdHNoZWV0Q3JlYXRlUHJvY2Vzcz1cdTVlZmFcdTdhY2JcdTdhMGJcdTVlOGZcdWZmMDhcdTUyOWZcdTgwZmRcdTU3OGJcdTZhMjNcdTYyMTZcdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGJcdWZmMDkNCi0NCi0jIEFjdGlvbiBTZXQNCi1hdXRob3JpbmdBY3Rpb25TZXQ9XHU3ZGU4XHU1YmViDQotY2hlYXRTaGVldHNBY3Rpb25TZXQ9XHU2M2QwXHU4OTgxDQotDQotIyBHbG9iYWwgQWN0aW9ucw0KLW5ld0xpYnJhcnlBY3Rpb249XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiKCZMKQ0KLW5ld0xpYnJhcnlBY3Rpb25Ub29sdGlwPVx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYg0KLW5ld1BsdWdpbkFjdGlvbj1cdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGYoJlApDQotbmV3UGx1Z2luQWN0aW9uVG9vbHRpcD1cdTVlZmFcdTdhY2JcdTY1YjBcdTc2ODRcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGYNCi1uZXdDb25maWdBY3Rpb249XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlKCZDKQ0KLW5ld0NvbmZpZ0FjdGlvblRvb2x0aXA9XHU1ZWZhXHU3YWNiXHU2NWIwXHU3Njg0XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotb3BlbkxpYnJhcnlBY3Rpb249XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiKCZMKQ0KLW9wZW5MaWJyYXJ5QWN0aW9uVG9vbHRpcD1cdTk1OGJcdTU1NWZcdTczZmVcdTY3MDlcdTc2ODRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWINCi1vcGVuQ29uZmlnQWN0aW9uPVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZSgmQykNCi1vcGVuQ29uZmlnQWN0aW9uVG9vbHRpcD1cdTk1OGJcdTU1NWZcdTczZmVcdTY3MDlcdTc2ODRcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmUNCi1vcGVuQ2hlYXRTaGVldHM9XHU2M2QwXHU4OTgxLi4uDQotDQotIyBMaWJyYXJ5IFZpZXcgQWN0aW9ucw0KLWxpbmtXaXRoRWRpdG9yPVx1OTAyM1x1N2Q1MFx1N2RlOFx1OGYyZlx1NTY2OA0KLWxpbmtXaXRoRWRpdG9yVG9vbHRpcD1cdTkwMjNcdTdkNTBcdTdkZThcdThmMmZcdTU2NjgNCi1zaG93UHJlc2VudGF0aW9uTmFtZXM9XHU5ODZmXHU3OTNhXHU1NDQ4XHU3M2ZlXHU1NDBkXHU3YTMxDQotc2hvd1ByZXNlbnRhdGlvbk5hbWVzVG9vbHRpcD1cdTk4NmZcdTc5M2FcdTU0NDhcdTczZmVcdTU0MGRcdTdhMzENCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBBY3Rpb25zDQotcmVmcmVzaENvbmZpZz1cdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDYNCi1yZWZyZXNoQ29uZmlnVG9vbHRpcD1cdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDZcdTkxNGRcdTdmNmUNCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLW1ldGhvZEF1dGhvcmluZ1BhZ2U9XHU2NWI5XHU2Y2Q1XHU3ZGU4XHU1YmViDQotcHJvY2Vzc0VkaXRvcj1cdTdhMGJcdTVlOGZcdTdkZThcdThmMmZcdTU2NjgNCi1saWJyYXJ5T3B0aW9ucz1cdTdhMGJcdTVmMGZcdTVlYWJcdTkwNzhcdTk4MDUNCi1kaWFncmFtPVx1NTcxNlx1ODllMw0KLXN0YXJ0dXBBbmRTaHV0ZG93bj1cdTU1NWZcdTUyZDVcdTgyMDdcdTk1ZGNcdTk1ODkNCi1kZWJ1Zz1cdTk2NjRcdTkzMmYNCi0NCi0jIENvbW1hbmQgSGFuZGxlcg0KLXNlbGVjdEFsbD1cdTUxNjhcdTkwNzgNCi0NCi0jIFByb3BlcnRpZXMgVmlldw0KLV9VSV9Qcm9jZXNzRWRpdG9yX21lbnU9XHU3YTBiXHU1ZThmDQotX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbT1cdTY1YjBcdTVlZmFcdTViNTBcdTk4MDUoJk4pDQotX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtPVx1NjViMFx1NWVmYVx1NTQwY1x1NWM2NFx1N2QxYVx1OTgwNSgmRSkNCi1fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbT1cdTk4NmZcdTc5M2FcdTUxNjdcdTViYjlcdTg5OTZcdTdhOTcoJlYpDQotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPVx1OTFjZFx1NjViMFx1NjU3NFx1NzQwNigmRikNCi1fVUlfUHJvcGVydGllc19HZW5lcmFsPVx1NGUwMFx1ODIyYw0KLV9VSV9Qcm9wZXJ0aWVzX0RvY3VtZW50YXRpb249XHU2NTg3XHU0ZWY2DQotX1VJX1Byb3BlcnRpZXNfR3VpZGFuY2U9XHU2MzA3XHU1ZjE1DQotX1VJX1Byb3BlcnRpZXNfV29ya19Sb2xsdXA9XHU1ZGU1XHU0ZjVjXHU1ZjU5XHU3ZTNkDQotX1VJX1Byb3BlcnRpZXNfVGVhbV9Sb2xsdXA9XHU1NzE4XHU5NjhhXHU1ZjU5XHU3ZTNkDQotIyMgVGhlIGZvbGxvd2luZyB2YWx1ZSBvZiBzdHJpbmcgc2hvdWxkIGJlICJXb3JrIFByb2R1Y3QgUm9sbHVwIi4gQnV0DQotIyMgZHVlIHRvIGxpbWl0YXRpb24vYnVnIGluIEVjbGlwc2UgV1RQLCBpdCdzIGJlZW4gdHJ1bmNhdGVkIHRvIA0KLSMjICJXb3JrIFByb2QgUm9sbHVwIi4gU28gZHVyaW5nIHRyYW5zbGF0aW9uLCBwbGVhc2UgdGFrZSB0aGlzIGludG8gY29uc2lkZXJhdGlvbi4NCi1fVUlfUHJvcGVydGllc19XUF9Sb2xsdXA9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU1ZjU5XHU3ZTNkDQotX1VJX1Byb3BlcnRpZXNfUm9sZXM9XHU4OWQyXHU4MjcyDQotX1VJX1Byb3BlcnRpZXNfV29ya1Byb2R1Y3RzPVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLV9VSV9Qcm9wZXJ0aWVzX1N0ZXBzPVx1NmI2NVx1OWE1Zg0KLV9VSV9Qcm9wZXJ0aWVzX1RlYW1zPVx1NTcxOFx1OTY4YQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OWYyOTgzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1wcmV2aW91c19uYW1lX251bGwxPURhcyBSXHUwMGZjY2tnXHUwMGU0bmdpZ21hY2hlbiBlaW5lciBOYW1lbnNcdTAwZTRuZGVydW5nIGlzdCBuaWNodCB6dWxcdTAwZTRzc2lnLCB3ZW5uIGRlciBOYW1lIHZvcmhlciBuaWNodCBkZWZpbmllcnQgd2FyLg0KLWVycl9uYW1lX2VtcHR5PURlciBOYW1lIG11c3MgYW5nZWdlYmVuIHdlcmRlbi4gR2ViZW4gU2llIGVpbmVuIGdcdTAwZmNsdGlnZW4gTmFtZW4gYW4uDQotbW92ZUFjdGlvbl9sYWJlbD1WZXJzY2hpZWJlbg0KLQ0KLUFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dD1BdXN3XHUwMGU0aGxlbg0KLUFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdG9vbHRpcD1Lbm90ZW4gb2RlciBMaW5rIGF1c3dcdTAwZTRobGVuDQotQWJzdHJhY3REaWFncmFtX0FkZE5vZGVfdGl0bGU9S25vdGVuIGhpbnp1Zlx1MDBmY2dlbg0KLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX2Vycl9tc2c9SVhSRDAwMDJXOiBEYXMgSGluenVmXHUwMGZjZ2VuIGVpbmVzIEtub3RlbnMgenVtIERpYWdyYW1tIGlzdCBmZWhsZ2VzY2hsYWdlbi4NCi1BYnN0cmFjdERpYWdyYW1fTGlua190ZXh0PUxpbmsNCi1BYnN0cmFjdERpYWdyYW1fTGlua19zZWxlY3Q9TGluayBhdXN3XHUwMGU0aGxlbg0KLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3Rvb2x0aXA9TmV1ZW4gTGluayBlcnN0ZWxsZW4NCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3RleHQ9QXVzZ2FuZ3Nrbm90ZW4NCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXA9TmV1ZW4gQXVzZ2FuZ3Nrbm90ZW4gZXJzdGVsbGVuDQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQ9VGV4dCBtaXQgZnJlaWVtIEZvcm1hdA0KLUFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwPU5ldWVuIFRleHQgbWl0IGZyZWllbSBGb3JtYXQgZXJzdGVsbGVuDQotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdGV4dD1TeW5jaHJvbmlzYXRpb25zYmFsa2VuDQotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdG9vbHRpcD1OZXVlbiBTeW5jaHJvbmlzYXRpb25zYmFsa2VuIGVyc3RlbGxlbg0KLUFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdGV4dD1FbnRzY2hlaWR1bmdza25vdGVuDQotQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90b29sdGlwPU5ldWVuIEVudHNjaGVpZHVuZ3Nrbm90ZW4gZXJzdGVsbGVuDQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dD1FbmRrbm90ZW4NCi1BY3Rpdml0eURldGFpbERpYWdyYW1fcHJlZml4PUFrdGl2aXRcdTAwZTR0c2RldGFpbDoNCi1BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90b29sdGlwPU5ldWVuIEVuZGtub3RlbiBlcnN0ZWxsZW4NCi1BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1Ba3Rpdml0XHUwMGU0dA0KLUFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90b29sdGlwPU5ldWUgQWt0aXZpdFx1MDBlNHQgZXJzdGVsbGVuDQotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0PUl0ZXJhdGlvbg0KLUFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdG9vbHRpcD1OZXVlIEl0ZXJhdGlvbiBlcnN0ZWxsZW4NCi1BY3Rpdml0eURpYWdyYW1fUGhhc2VfdGV4dD1QaGFzZQ0KLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90b29sdGlwPU5ldWUgUGhhc2UgZXJzdGVsbGVuDQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQ9QXVmZ2FiZW5kZXNrcmlwdG9yDQotQWJzdHJhY3REaWFncmFtX1JvbGVEZXNjcmlwdG9yX3RleHQ9Um9sbGVuZGVza3JpcHRvcg0KLVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4PUFyYmVpdHNlcmdlYm5pc2FiaFx1MDBlNG5naWdrZWl0c2RpYWdyYW1tOg0KLUFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90b29sdGlwPU5ldWVuIFJvbGxlbmRlc2tyaXB0b3IgZXJzdGVsbGVuDQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3Rvb2x0aXA9TmV1ZW4gQXVmZ2FiZW5kZXNrcmlwdG9yIGVyc3RlbGxlbg0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9EZWxpdmVyeVByb2Nlc3NfdGV4dD1CZXJlaXRzdGVsbHVuZ3Nwcm96ZXNzDQotQWN0dml0aXZpdHlEaWFncmFtX0NhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9UHJvemVzc211c3Rlcg0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXg9UGhhc2UNCi1BY3R2aXRpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ9SXRlcmF0aW9uDQotQWN0dml0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9QWt0aXZpdFx1MDBlNHQNCi1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9QXJiZWl0c2VyZ2VibmlzZGVza3JpcHRvcg0KLUFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcD1OZXVlbiBBcmJlaXRzZXJnZWJuaXNkZXNrcmlwdG9yIGVyc3RlbGxlbg0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1BdXNyaWNodGVuDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3JlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQ9QW5oYW5kIGRlciBCYXNpc2FrdGl2aXRcdTAwZTR0IGFrdHVhbGlzaWVyZW4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9VGV4dGZlbGQgZm9ybWF0aWVyZW4uLi4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PUhvcml6b250YWwgYW4gRHVyY2hzY2huaXR0c2tvb3JkaW5hdGVuDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1Ib3Jpem9udGFsIGFuIGVyc3RlciBhdXNnZXdcdTAwZTRobHRlciBLb29yZGluYXRlDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1WZXJ0aWthbCBhbiBEdXJjaHNjaG5pdHRza29vcmRpbmF0ZW4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PVZlcnRpa2FsIGFuIGVyc3RlciBhdXNnZXdcdTAwZTRobHRlciBLb29yZGluYXRlDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dD1TcGVpY2hlcm4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlPXswfSB3aXJkIGdlc3BlaWNoZXJ0DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsPUtub3RlbiB2ZXJzY2hpZWJlbg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcnJlZnJlc2hmcm9tYmFzZT1BbmhhbmQgZGVyIEJhc2lzIGFrdHVhbGlzaWVyZW4NCi1BYnN0cmFjdERpYWdyYW1fQmVuZFBvaW50X2NyZWF0ZT1WZXJ6d2VpZ3VuZ3NwdW5rdCBlcnN0ZWxsZW4NCi0NCi1BY3Rpdml0eURpYWdyYW1fb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0PUFrdGl2aXRcdTAwZTR0c2RldGFpbGRpYWdyYW1tIFx1MDBmNmZmbmVuDQotcmVmcmVzaEFjdGlvbl9sYWJlbD1Ba3R1YWxpc2llcmVuDQotcmVmcmVzaEZyb21CYXNlQ21kX2xhYmVsPUFuaGFuZCBkZXIgQmFzaXMgYWt0dWFsaXNpZXJlbg0KLWRpYWdyYW1fc2F2ZUVycm9yPUlVUEQwMDAxVzogRGFzIFNwZWljaGVybiBkZXMgRGlhZ3JhbW1zIGlzdCBmZWhsZ2VzY2hsYWdlbi4NCi0NCi1EZWxldGVEaWFncmFtX3RleHQ9RGlhZ3JhbW0gbFx1MDBmNnNjaGVuDQotRGVsZXRlRGlhZ3JhbV9wcm9tcHQ9TVx1MDBmNmNodGVuIFNpZSBkYXMgRGlhZ3JhbW0gd2lya2xpY2ggc2NobGllXHUwMGRmZW4gdW5kIGxcdTAwZjZzY2hlbj9cbkRpZXNlIFx1MDBjNG5kZXJ1bmcgaXN0IHBlcm1hbmVudCB1bmQga2FubiBuaWNodCByXHUwMGZjY2tnXHUwMGU0bmdpZyBnZW1hY2h0IHdlcmRlbi4NCi1hbGlnbl9iZW5kX3BvaW50X3RleHQ9VmVyendlaWd1bmdzcHVua3QgYXVzcmljaHRlbg0KLUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dF9jb25maWdlZGl0b3IwPUtvbmZpZ3VyYXRpb25zZWRpdG9yDQotZGlhZ3JhbV9ub2RlX3Byb3BlcnR5X3ZhbHVlX3Byb2JsZW1fbXNnPUZlaGxlciBpbSBFaWdlbnNjaGFmdHN3ZXJ0IGRlcyBLbm90ZW5zLg0KLWRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA9RmVobGVyDQotDQotQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0PURpYWdyYW1tbGF5b3V0IHp1clx1MDBmY2Nrc2V0emVuDQotZXJyb3JEaWFsb2dfdGl0bGU9RmVobGVyDQotY29tbWFuZF9jYW5ub3RFZGl0PUlVUEQwMDAzRTogRGFzIERpYWdyYW1tIGthbm4gbmljaHQgYmVhcmJlaXRldCB3ZXJkZW4uDQotDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RpdGxlPVx1MDBkY2Jlcmdlb3JkbmV0ZXIgRWRpdG9yIGdlc2NobG9zc2VuDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RleHQ9ezB9IHd1cmRlIGdlc2NobG9zc2VuLiB7MX0gYXVjaCBzY2hsaWVcdTAwZGZlbj8NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDU2ODFlOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotcHJldmlvdXNfbmFtZV9udWxsMT1ObyBzZSBwdWVkZSBkZXNoYWNlciBlbCBjYW1iaW8gZGUgbm9tYnJlIHNpIGVsIG5vbWJyZSBhbnRlcmlvciBlcyBudWxvLg0KLWVycl9uYW1lX2VtcHR5PUVsIG5vbWJyZSBubyBwdWVkZSBlc3RhciB2YWNcdTAwZWRvLiBFc3BlY2lmaXF1ZSB1biBub21icmUgdlx1MDBlMWxpZG8uDQotbW92ZUFjdGlvbl9sYWJlbD1Nb3Zlcg0KLQ0KLUFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dD1TZWxlY2Npb25hcg0KLUFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdG9vbHRpcD1TZWxlY2Npb25hciBub2RvIG8gZW5sYWNlDQotQWJzdHJhY3REaWFncmFtX0FkZE5vZGVfdGl0bGU9QVx1MDBmMWFkaXIgbm9kbw0KLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX2Vycl9tc2c9SVhSRDAwMDJXOiBMYSBhZGljaVx1MDBmM24gZGUgdW4gbm9kbyBhbCBkaWFncmFtYSBoYSBmYWxsYWRvDQotQWJzdHJhY3REaWFncmFtX0xpbmtfdGV4dD1FbmxhY2UNCi1BYnN0cmFjdERpYWdyYW1fTGlua19zZWxlY3Q9U2VsZWNjaW9uYXIgZW5sYWNlDQotQWJzdHJhY3REaWFncmFtX0xpbmtfdG9vbHRpcD1DcmVhciB1biBudWV2byBlbmxhY2UNCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3RleHQ9Tm9kbyBkZSBpbmljaW8NCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXA9Q3JlYXIgdW4gbnVldm8gbm9kbyBkZSBpbmljaW8NCi1BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dD1UZXh0byBsaWJyZQ0KLUFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwPUNyZWFyIHVuIG51ZXZvIHRleHRvIGxpYnJlDQotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdGV4dD1CYXJyYSBkZSBzaW5jcm9uaXphY2lcdTAwZjNuDQotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdG9vbHRpcD1DcmVhciB1bmEgbnVldmEgYmFycmEgZGUgc2luY3Jvbml6YWNpXHUwMGYzbg0KLUFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdGV4dD1Ob2RvIGRlIGRlY2lzaVx1MDBmM24NCi1BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXA9Q3JlYXIgdW4gbnVldm8gbm9kbyBkZSBkZWNpc2lcdTAwZjNuDQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dD1Ob2RvIGRlIGZpbg0KLUFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9wcmVmaXg9RGV0YWxsZSBkZSBsYSBhY3RpdmlkYWQ6DQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcD1DcmVhciB1biBudWV2byBub2RvIGRlIGZpbg0KLUFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0PUFjdGl2aWRhZA0KLUFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90b29sdGlwPUNyZWFyIHVuYSBudWV2YSBhY3RpdmlkYWQNCi1BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ9SXRlcmFjaVx1MDBmM24NCi1BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3Rvb2x0aXA9Q3JlYXIgdW5hIG51ZXZhIGl0ZXJhY2lcdTAwZjNuDQotQWN0aXZpdHlEaWFncmFtX1BoYXNlX3RleHQ9RmFzZQ0KLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90b29sdGlwPUNyZWFyIHVuYSBudWV2YSBmYXNlDQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQ9RGVzY3JpcHRvciBkZSB0YXJlYXMNCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdGV4dD1EZXNjcmlwdG9yIGRlIHJvbGVzDQotV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV9wcmVmaXg9RGlhZ3JhbWEgZGUgZGVwZW5kZW5jaWEgZGVsIHByb2R1Y3RvIGRlIHRyYWJham86DQotQWJzdHJhY3REaWFncmFtX1JvbGVEZXNjcmlwdG9yX3Rvb2x0aXA9Q3JlYXIgdW4gbnVldm8gZGVzY3JpcHRvciBkZSByb2xlcw0KLUFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwPUNyZWFyIHVuIG51ZXZvIGRlc2NyaXB0b3IgZGUgdGFyZWFzDQotQWN0dml0aXZpdHlEaWFncmFtX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0PVByb2Nlc28gZGUgZW50cmVnYQ0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0PVBhdHJcdTAwZjNuIGRlIHBvc2liaWxpZGFkDQotQWN0dml0aXZpdHlEaWFncmFtX1BoYXNlX3RleD1GYXNlDQotQWN0dml0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0PUl0ZXJhY2lcdTAwZjNuDQotQWN0dml0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9QWN0aXZpZGFkDQotQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0PURlc2NyaXB0b3IgZGUgcHJvZHVjdG9zIGRlIHRyYWJham8NCi1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3Rvb2x0aXA9Q3JlYXIgdW4gbnVldm8gZGVzY3JpcHRvciBkZSBwcm9kdWN0b3MgZGUgdHJhYmFqbw0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1BbGluZWFyDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3JlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQ9UmVub3ZhciBkZXNkZSBhY3RpdmlkYWQgYlx1MDBlMXNpY2ENCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9Rm9ybWF0ZWFyIHJlY3VhZHJvIGRlIHRleHRvLi4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1Ib3Jpem9udGFsbWVudGUgaGFzdGEgZWwgcHJvbWVkaW8NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PUhvcml6b250YWxtZW50ZSBoYXN0YSBsYSBwcmltZXJhIHNlbGVjY2lcdTAwZjNuDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1WZXJ0aWNhbG1lbnRlIGhhc3RhIGVsIHByb21lZGlvDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1WZXJ0aWNhbG1lbnRlIGhhc3RhIGxhIHByaW1lcmEgc2VsZWNjaVx1MDBmM24NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PUd1YXJkYXINCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlPUd1YXJkYW5kbyB7MH0NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw9TW92ZXIgbm9kbw0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcnJlZnJlc2hmcm9tYmFzZT1SZW5vdmFyIGRlc2RlIGFjdGl2aWRhZCBiXHUwMGUxc2ljYQ0KLUFic3RyYWN0RGlhZ3JhbV9CZW5kUG9pbnRfY3JlYXRlPUNyZWFyIHB1bnRvIGRlIGluZmxleGlcdTAwZjNuDQotDQotQWN0aXZpdHlEaWFncmFtX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dD1BYnJpciBkaWFncmFtYSBkZSBkZXRhbGxlcyBkZSBsYSBhY3RpdmlkYWQNCi1yZWZyZXNoQWN0aW9uX2xhYmVsPVJlbm92YXINCi1yZWZyZXNoRnJvbUJhc2VDbWRfbGFiZWw9UmVub3ZhciBkZXNkZSBhY3RpdmlkYWQgYlx1MDBlMXNpY2ENCi1kaWFncmFtX3NhdmVFcnJvcj1JVVBEMDAwMVc6IExhIGFjY2lcdTAwZjNuIGRlIGd1YXJkYXIgZWwgZGlhZ3JhbWEgaGEgZmFsbGFkbw0KLQ0KLURlbGV0ZURpYWdyYW1fdGV4dD1TdXByaW1pciBkaWFncmFtYQ0KLURlbGV0ZURpYWdyYW1fcHJvbXB0PVx1MDBiZkVzdFx1MDBlMSBzZWd1cm8gZGUgcXVlIGRlc2VhIGNlcnJhciB5IHN1cHJpbWlyIGVzdGUgZGlhZ3JhbWE/XG5Fc3RlIGNhbWJpbyBlcyBwZXJtYW5lbnRlIHkgbm8gc2UgcHVlZGUgZGVzaGFjZXIuDQotYWxpZ25fYmVuZF9wb2ludF90ZXh0PUFsaW5lYXIgcHVudG8gZGUgaW5mbGV4aVx1MDBmM24NCi1Db25maWd1cmF0aW9uRWRpdG9ySW5wdXRfY29uZmlnZWRpdG9yMD1FZGl0b3IgZGUgY29uZmlndXJhY2lcdTAwZjNuDQotZGlhZ3JhbV9ub2RlX3Byb3BlcnR5X3ZhbHVlX3Byb2JsZW1fbXNnPVNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBlbiBlbCB2YWxvciBkZSBsYSBwcm9waWVkYWQgZGVsIG5vZG8uDQotZGlhZ3JhbV9lcnJvckRpYWxvZ190aXRsZV90ZXh0MD1FcnJvcg0KLQ0KLUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcl9SZXNldERpYWdyYW1MYXlvdXRfdGV4dD1SZXN0YWJsZWNlciBkaXNlXHUwMGYxbyBkZSBkaWFncmFtYQ0KLWVycm9yRGlhbG9nX3RpdGxlPUVycm9yDQotY29tbWFuZF9jYW5ub3RFZGl0PUlVUEQwMDAzRTogTm8gc2UgcHVlZGUgZWRpdGFyIGVsIGRpYWdyYW1hDQotDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RpdGxlPUVkaXRvciBwYWRyZSBjZXJyYWRvDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RleHQ9ezB9IHNlIGhhIGNlcnJhZG8uIFx1MDBiZkRlc2VhIGNlcnJhciB0YW1iaVx1MDBlOW4gezF9Pw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NDIzNTg3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1wcmV2aW91c19uYW1lX251bGwxPUwnYW5udWxhdGlvbiBkdSBjaGFuZ2VtZW50IGRlIG5vbSBuJ2VzdCBwYXMgcGVybWlzZSBzaSBsZSBub20gcHJcdTAwZTljXHUwMGU5ZGVudCBlc3QgTlVMTC4NCi1lcnJfbmFtZV9lbXB0eT1MZSBub20gbmUgcGV1dCBwYXMgXHUwMGVhdHJlIHZpZGUuIEluZGlxdWV6IHVuIG5vbSB2YWxpZGUuDQotbW92ZUFjdGlvbl9sYWJlbD1EXHUwMGU5cGxhY2VyDQotDQotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90ZXh0PVNcdTAwZTlsZWN0aW9ubmVyDQotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90b29sdGlwPVNcdTAwZTlsZWN0aW9ubmVyIHVuIG5vZXVkIG91IHVuIGxpZW4NCi1BYnN0cmFjdERpYWdyYW1fQWRkTm9kZV90aXRsZT1Bam91dGVyIHVuIG5vZXVkDQotQWJzdHJhY3REaWFncmFtX0FkZE5vZGVfZXJyX21zZz1JWFJEMDAwMlcgOiBFY2hlYyBkZSBsJ2Fqb3V0IGQndW4gbm9ldWQgYXUgZGlhZ3JhbW1lDQotQWJzdHJhY3REaWFncmFtX0xpbmtfdGV4dD1MaWVuDQotQWJzdHJhY3REaWFncmFtX0xpbmtfc2VsZWN0PVNcdTAwZTlsZWN0aW9ubmVyIHVuIGxpZW4NCi1BYnN0cmFjdERpYWdyYW1fTGlua190b29sdGlwPUNyXHUwMGU5ZXIgdW4gbm91dmVhdSBsaWVuDQotQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0PU5vZXVkIGRlIGRcdTAwZTlidXQNCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXA9Q3JcdTAwZTllciB1biBub3V2ZWF1IG5vZXVkIGRlIGRcdTAwZTlidXQNCi1BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dD1UZXh0ZSBsaWJyZQ0KLUFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwPUNyXHUwMGU5ZXIgdW4gbm91dmVhdSB0ZXh0ZSBsaWJyZQ0KLUFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3RleHQ9QmFycmUgZGUgc3luY2hyb25pc2F0aW9uDQotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdG9vbHRpcD1Dclx1MDBlOWVyIHVuZSBub3V2ZWxsZSBiYXJyZSBkZSBzeW5jaHJvbmlzYXRpb24NCi1BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3RleHQ9Tm9ldWQgZGUgZFx1MDBlOWNpc2lvbg0KLUFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdG9vbHRpcD1Dclx1MDBlOWVyIHVuIG5vdXZlYXUgbm9ldWQgZGUgZFx1MDBlOWNpc2lvbg0KLUFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3RleHQ9Tm9ldWQgZGUgZmluIGRlIGZsdXgNCi1BY3Rpdml0eURldGFpbERpYWdyYW1fcHJlZml4PURcdTAwZTl0YWlsIGRlcyBhY3Rpdml0XHUwMGU5cyA6DQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcD1Dclx1MDBlOWVyIHVuIG5vdXZlYXUgbm9ldWQgZGUgZmluIGRlIGZsdXgNCi1BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1BY3Rpdml0XHUwMGU5DQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXA9Q3JcdTAwZTllciB1bmUgbm91dmVsbGUgYWN0aXZpdFx1MDBlOQ0KLUFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1JdFx1MDBlOXJhdGlvbg0KLUFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdG9vbHRpcD1Dclx1MDBlOWVyIHVuZSBub3V2ZWxsZSBpdFx1MDBlOXJhdGlvbg0KLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0PVBoYXNlDQotQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXA9Q3JcdTAwZTllciB1bmUgbm91dmVsbGUgcGhhc2UNCi1BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dD1EZXNjcmlwdGV1ciBkZSB0XHUwMGUyY2hlDQotQWJzdHJhY3REaWFncmFtX1JvbGVEZXNjcmlwdG9yX3RleHQ9RGVzY3JpcHRldXIgZGUgclx1MDBmNGxlDQotV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV9wcmVmaXg9RGlhZ3JhbW1lIGRlIGRcdTAwZTlwZW5kYW5jZSBkZSBwcm9kdWl0IDoNCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdG9vbHRpcD1Dclx1MDBlOWVyIHVuIG5vdXZlYXUgZGVzY3JpcHRldXIgZGUgclx1MDBmNGxlDQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3Rvb2x0aXA9Q3JcdTAwZTllciB1biBub3V2ZWF1IGRlc2NyaXB0ZXVyIGRlIHRcdTAwZTJjaGUNCi1BY3R2aXRpdml0eURpYWdyYW1fRGVsaXZlcnlQcm9jZXNzX3RleHQ9UHJvY2Vzc3VzIGRlIGxpdnJhaXNvbg0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0PVBhdHRlcm4gZGUgY2FwYWNpdFx1MDBlOQ0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXg9UGhhc2UNCi1BY3R2aXRpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ9SXRcdTAwZTlyYXRpb24NCi1BY3R2aXRpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1BY3Rpdml0XHUwMGU5DQotQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0PURlc2NyaXB0ZXVyIGRlIHByb2R1aXQNCi1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3Rvb2x0aXA9Q3JcdTAwZTllciB1biBub3V2ZWF1IGRlc2NyaXB0ZXVyIGRlIHByb2R1aXQNCi0NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9QWxpZ25lcg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0PUFjdHVhbGlzZXIgXHUwMGUwIHBhcnRpciBkZSBsJ2FjdGl2aXRcdTAwZTkgZGUgYmFzZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dD1NaXNlIGVuIGZvcm1lIGRlIGxhIHpvbmUgZGUgdGV4dGUuLi4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PUhvcml6b250YWxlbWVudCBwYXIgcmFwcG9ydCBcdTAwZTAgbGEgbW95ZW5uZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9SG9yaXpvbnRhbGVtZW50IHBhciByYXBwb3J0IGF1IHByZW1pZXIgXHUwMGU5bFx1MDBlOW1lbnQgc1x1MDBlOWxlY3Rpb25uXHUwMGU5DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1WZXJ0aWNhbGVtZW50IHBhciByYXBwb3J0IFx1MDBlMCBsYSBtb3llbm5lDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1WZXJ0aWNhbGVtZW50IHBhciByYXBwb3J0IGF1IHByZW1pZXIgXHUwMGU5bFx1MDBlOW1lbnQgc1x1MDBlOWxlY3Rpb25uXHUwMGU5DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dD1TYXV2ZWdhcmRlcg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9U2F1dmVnYXJkZSBkZSB7MH0NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw9RFx1MDBlOXBsYWNlciB1biBub2V1ZA0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcnJlZnJlc2hmcm9tYmFzZT1BY3R1YWxpc2VyIFx1MDBlMCBwYXJ0aXIgZGUgbGEgYmFzZQ0KLUFic3RyYWN0RGlhZ3JhbV9CZW5kUG9pbnRfY3JlYXRlPUNyXHUwMGU5ZXIgdW4gcG9pbnQgZCdpbmZsXHUwMGU5Y2hpc3NlbWVudA0KLQ0KLUFjdGl2aXR5RGlhZ3JhbV9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9T3V2cmlyIHVuIGRpYWdyYW1tZSBkXHUwMGU5dGFpbGxcdTAwZTkgZCdhY3Rpdml0XHUwMGU5DQotcmVmcmVzaEFjdGlvbl9sYWJlbD1BY3R1YWxpc2VyDQotcmVmcmVzaEZyb21CYXNlQ21kX2xhYmVsPUFjdHVhbGlzZXIgXHUwMGUwIHBhcnRpciBkZSBsYSBiYXNlDQotZGlhZ3JhbV9zYXZlRXJyb3I9SVVQRDAwMDFXIDogRWNoZWMgZGUgc2F1dmVnYXJkZSBkdSBkaWFncmFtbWUNCi0NCi1EZWxldGVEaWFncmFtX3RleHQ9U3VwcHJpbWVyIGxlIGRpYWdyYW1tZQ0KLURlbGV0ZURpYWdyYW1fcHJvbXB0PUV0ZXMtdm91cyBzXHUwMGZiciBkZSB2b3Vsb2lyIGZlcm1lciBldCBzdXBwcmltZXIgY2UgZGlhZ3JhbW1lID9cbkNlIGNoYW5nZW1lbnQgZXN0IGRcdTAwZTlmaW5pdGlmIGV0IG5lIHBldXQgcGFzIFx1MDBlYXRyZSBhbm51bFx1MDBlOS4NCi1hbGlnbl9iZW5kX3BvaW50X3RleHQ9QWxpZ25lciBsZSBwb2ludCBkJ2luZmxcdTAwZTljaGlzc2VtZW50DQotQ29uZmlndXJhdGlvbkVkaXRvcklucHV0X2NvbmZpZ2VkaXRvcjA9RWRpdGV1ciBkZSBjb25maWd1cmF0aW9uDQotZGlhZ3JhbV9ub2RlX3Byb3BlcnR5X3ZhbHVlX3Byb2JsZW1fbXNnPUVycmV1ciBkYW5zIGxhIHZhbGV1ciBkZSBwcm9wcmlcdTAwZTl0XHUwMGU5IGR1IG5vZXVkLg0KLWRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA9RXJyZXVyDQotDQotQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0PVJcdTAwZTlpbml0aWFsaXNlciBsYSBkaXNwb3NpdGlvbiBkdSBkaWFncmFtbWUNCi1lcnJvckRpYWxvZ190aXRsZT1FcnJldXINCi1jb21tYW5kX2Nhbm5vdEVkaXQ9SVVQRDAwMDNFIDogSW1wb3NzaWJsZSBkZSBtb2RpZmllciBsZSBkaWFncmFtbWUNCi0NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGl0bGU9RWRpdGV1ciBwYXJlbnQgZmVybVx1MDBlOQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90ZXh0PXswfSBzJydlc3QgZmVybVx1MDBlOS4gVm91bGV6LXZvdXMgXHUwMGU5Z2FsZW1lbnQgZmVybWVyIHsxfSA/DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfaXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViOGRhZWUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXByZXZpb3VzX25hbWVfbnVsbDE9Tm9uIFx1MDBlOCBwb3NzaWJpbGUgYW5udWxsYXJlIGxhIG1vZGlmaWNhIGRlbCBub21lIHNlIGlsIG5vbWUgcHJlY2VkZW50ZSBcdTAwZTggbnVsbG8uDQotZXJyX25hbWVfZW1wdHk9SWwgbm9tZSBub24gcHVcdTAwZjIgZXNzZXJlIHZ1b3RvLiBTcGVjaWZpY2FyZSB1biBub21lIHZhbGlkby4NCi1tb3ZlQWN0aW9uX2xhYmVsPVNwb3N0YQ0KLQ0KLUFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dD1TZWxlemlvbmENCi1BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3Rvb2x0aXA9U2VsZXppb25hIG5vZG8gb3BwdXJlIGNvbGxlZ2FtZW50bw0KLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX3RpdGxlPUFnZ2l1bmdpIG5vZG8NCi1BYnN0cmFjdERpYWdyYW1fQWRkTm9kZV9lcnJfbXNnPUlYUkQwMDAyVzogQWdnaXVudGEgZGVsIG5vZG8gYWwgZGlhZ3JhbW1hIG5vbiByaXVzY2l0YQ0KLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3RleHQ9Q29sbGVnYW1lbnRvDQotQWJzdHJhY3REaWFncmFtX0xpbmtfc2VsZWN0PVNlbGV6aW9uYSBjb2xsZWdhbWVudG8NCi1BYnN0cmFjdERpYWdyYW1fTGlua190b29sdGlwPUNyZWEgdW4gbnVvdm8gY29sbGVnYW1lbnRvDQotQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0PU5vZG8gaW5pemlhbGUNCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXA9Q3JlYSB1biBudW92byBub2RvDQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQ9VGVzdG8gbGliZXJvDQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXA9Q3JlYSBudW92byB0ZXN0byBsaWJlcm8NCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90ZXh0PUJhcnJhIGRpIHNpbmNyb25penphemlvbmUNCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90b29sdGlwPUNyZWEgdW5hIG51b3ZhIGJhcnJhIGRpIHNpbmNyb25penphemlvbmUNCi1BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3RleHQ9Tm9kbyBkaSBkZWNpc2lvbmUNCi1BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXA9Q3JlYSB1biBudW92byBkZWNpc2lvbmUNCi1BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90ZXh0PU5vZG8gZmluYWxlDQotQWN0aXZpdHlEZXRhaWxEaWFncmFtX3ByZWZpeD1EZXR0YWdsaSBhdHRpdml0XHUwMGUwOg0KLUFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3Rvb2x0aXA9Q3JlYSB1biBudW92byBub2RvIGZpbmFsZQ0KLUFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0PUF0dGl2aXRcdTAwZTANCi1BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdG9vbHRpcD1DcmVhIHVuYSBudW92YSBhdHRpdml0XHUwMGUwDQotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0PUl0ZXJhemlvbmUNCi1BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3Rvb2x0aXA9Q3JlYSB1bmEgbnVvdmEgaXRlcmF6aW9uZQ0KLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0PUZhc2UNCi1BY3Rpdml0eURpYWdyYW1fUGhhc2VfdG9vbHRpcD1DcmVhIHVuYSBudW92YSBmYXNlDQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQ9RGVzY3JpdHRvcmUgZGkgb3BlcmF6aW9uaQ0KLUFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90ZXh0PURlc2NyaXR0b3JlIGRpIHJ1b2xpDQotV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV9wcmVmaXg9RGlhZ3JhbW1hIGRpcGVuZGVuemUgcHJvZG90dG8gZGkgbGF2b3JvOg0KLUFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90b29sdGlwPUNyZWEgdW4gbnVvdm8gZGVzY3JpdHRvcmUgZGkgcnVvbGkNCi1BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdG9vbHRpcD1DcmVhIHVuIG51b3ZvIGRlc2NyaXR0b3JlIGRpIG9wZXJhemlvbmkNCi1BY3R2aXRpdml0eURpYWdyYW1fRGVsaXZlcnlQcm9jZXNzX3RleHQ9UHJvY2Vzc28gZGkgcHJvZHV6aW9uZQ0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0PU1vZGVsbG8gZGkgY2FwYWNpdFx1MDBlMA0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXg9RmFzZQ0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1JdGVyYXppb25lDQotQWN0dml0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9QXR0aXZpdFx1MDBlMA0KLUFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dD1EZXNjcml0dG9yZSBkaSBwcm9kb3R0aSBkaSBsYXZvcm8NCi1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3Rvb2x0aXA9Q3JlYSB1biBudW92byBkZXNjcml0dG9yZSBkaSBwcm9kb3R0aSBkaSBsYXZvcmkNCi0NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9QWxsaW5lYQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0PUFnZ2lvcm5hIGRhIGF0dGl2aXRcdTAwZTAgZGkgYmFzZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dD1Gb3JtYXRvIGNhc2VsbGEgZGkgdGVzdG8uLi4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PU9yaXp6b250YWxtZW50ZSBhIGNvb3JkLiBtZWRpZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9T3JpenpvbnRhbG1lbnRlIGEgcHJpbWUgY29vcmQuIHNlbGV6aW9uYXRlDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1WZXJ0aWNhbG1lbnRlIGEgY29vcmQuIG1lZGllDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1WZXJ0aWNhbG1lbnRlIGEgcHJpbWUgY29vcmQuIHNlbGV6aW9uYXRlDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dD1TYWx2YQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9U2FsdmF0YWdnaW8gZGkgezB9DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsPVNwb3N0YSBub2RvDQotQWJzdHJhY3REaWFncmFtRWRpdG9ycmVmcmVzaGZyb21iYXNlPUFnZ2lvcm5hIGRhIGJhc2UNCi1BYnN0cmFjdERpYWdyYW1fQmVuZFBvaW50X2NyZWF0ZT1DcmVhIGJlbmRwb2ludA0KLQ0KLUFjdGl2aXR5RGlhZ3JhbV9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9QXByaSBkaWFncmFtbWEgZGV0dGFnbGkgYXR0aXZpdFx1MDBlMA0KLXJlZnJlc2hBY3Rpb25fbGFiZWw9QWdnaW9ybmENCi1yZWZyZXNoRnJvbUJhc2VDbWRfbGFiZWw9QWdnaW9ybmEgZGEgYmFzZQ0KLWRpYWdyYW1fc2F2ZUVycm9yPUlVUEQwMDAxVzogU2FsdmF0YWdnaW8gZGVsIGRpYWdyYW1tYSBub24gcml1c2NpdG8NCi0NCi1EZWxldGVEaWFncmFtX3RleHQ9RWxpbWluYSBkaWFncmFtbWENCi1EZWxldGVEaWFncmFtX3Byb21wdD1DaGl1ZGVyZSBlZCBlbGltaW5hcmUgcXVlc3RvIGRpYWdyYW1tYT9cblF1ZXN0YSBtb2RpZmljYSBcdTAwZTggcGVybWFuZW50ZSBlIG5vbiBwdVx1MDBmMiBlc3NlcmUgYW5udWxsYXRhLg0KLWFsaWduX2JlbmRfcG9pbnRfdGV4dD1BbGxpbmVhIGJlbmRwb2ludA0KLUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dF9jb25maWdlZGl0b3IwPUVkaXRvciBkaSBjb25maWd1cmF6aW9uaQ0KLWRpYWdyYW1fbm9kZV9wcm9wZXJ0eV92YWx1ZV9wcm9ibGVtX21zZz1FcnJvcmUgbmVsIHZhbG9yZSBkZWwgbm9kby4NCi1kaWFncmFtX2Vycm9yRGlhbG9nX3RpdGxlX3RleHQwPUVycm9yZQ0KLQ0KLUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcl9SZXNldERpYWdyYW1MYXlvdXRfdGV4dD1SaXByaXN0aW5hIGxheW91dCBkaWFncmFtbWENCi1lcnJvckRpYWxvZ190aXRsZT1FcnJvcmUNCi1jb21tYW5kX2Nhbm5vdEVkaXQ9SVVQRDAwMDNFOiBJbXBvc3NpYmlsZSBtb2RpZmljYXJlIGlsIGRpYWdyYW1tYQ0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90aXRsZT1FZGl0b3IgcGFyZW50IGNoaXVzbw0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90ZXh0PXswfSBjaGl1c28uIENoaXVkZXJlIGFuY2hlIHsxfT8NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjc5NzQ0Yi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotcHJldmlvdXNfbmFtZV9udWxsMT1cdTUyNGRcdTMwNmVcdTU0MGRcdTUyNGRcdTMwNGNcdTMwY2NcdTMwZWJcdTMwNjdcdTMwNDJcdTMwOGJcdTU4MzRcdTU0MDhcdTMwMDFcdTU0MGRcdTUyNGRcdTMwNmVcdTU5MDlcdTY2ZjRcdTMwNmZcdTUzZDZcdTMwOGFcdTZkODhcdTMwNWJcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1lcnJfbmFtZV9lbXB0eT1cdTU0MGRcdTUyNGRcdTMwOTJcdTdhN2FcdTMwNmJcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIgXHU2NzA5XHU1MmI5XHUzMDZhXHU1NDBkXHU1MjRkXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotbW92ZUFjdGlvbl9sYWJlbD1cdTc5ZmJcdTUyZDUNCi0NCi1BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3RleHQ9XHU5MDc4XHU2MjllDQotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90b29sdGlwPVx1MzBjZVx1MzBmY1x1MzBjOVx1MzA3ZVx1MzA1Zlx1MzA2Zlx1MzBlYVx1MzBmM1x1MzBhZlx1MzA2ZVx1OTA3OFx1NjI5ZQ0KLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX3RpdGxlPVx1MzBjZVx1MzBmY1x1MzBjOVx1MzA2ZVx1OGZmZFx1NTJhMA0KLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX2Vycl9tc2c9SVhSRDAwMDJXOiBcdTMwYzBcdTMwYTRcdTMwYTJcdTMwYjBcdTMwZTlcdTMwZTBcdTMwNzhcdTMwNmVcdTMwY2VcdTMwZmNcdTMwYzlcdTMwNmVcdThmZmRcdTUyYTBcdTMwNmJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYNCi1BYnN0cmFjdERpYWdyYW1fTGlua190ZXh0PVx1MzBlYVx1MzBmM1x1MzBhZg0KLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3NlbGVjdD1cdTMwZWFcdTMwZjNcdTMwYWZcdTMwNmVcdTkwNzhcdTYyOWUNCi1BYnN0cmFjdERpYWdyYW1fTGlua190b29sdGlwPVx1MzBlYVx1MzBmM1x1MzBhZlx1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMA0KLUFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdGV4dD1cdTMwY2VcdTMwZmNcdTMwYzlcdTMwNmVcdTk1OGJcdTU5Y2INCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXA9XHU5NThiXHU1OWNiXHUzMGNlXHUzMGZjXHUzMGM5XHUzMDZlXHU2NWIwXHU4OThmXHU0ZjVjXHU2MjEwDQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQ9XHUzMGQ1XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4DQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXA9XHUzMGQ1XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZlXHU2NWIwXHU4OThmXHU0ZjVjXHU2MjEwDQotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdGV4dD1cdTU0MGNcdTY3MWZcdTMwZDBcdTMwZmMNCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90b29sdGlwPVx1NTQwY1x1NjcxZlx1MzBkMFx1MzBmY1x1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMA0KLUFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdGV4dD1cdTZjN2FcdTViOWFcdTMwY2VcdTMwZmNcdTMwYzkNCi1BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXA9XHU2YzdhXHU1YjlhXHUzMGNlXHUzMGZjXHUzMGM5XHUzMDZlXHU2NWIwXHU4OThmXHU0ZjVjXHU2MjEwDQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dD1cdTdkNDJcdTRlODZcdTMwY2VcdTMwZmNcdTMwYzkNCi1BY3Rpdml0eURldGFpbERpYWdyYW1fcHJlZml4PVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1MzA2ZVx1OGE3M1x1N2QzMDoNCi1BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90b29sdGlwPVx1N2Q0Mlx1NGU4Nlx1MzBjZVx1MzBmY1x1MzBjOVx1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMA0KLUFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0PVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmYw0KLUFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90b29sdGlwPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMA0KLUFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1cdTUzY2RcdTVmYTkNCi1BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3Rvb2x0aXA9XHU1M2NkXHU1ZmE5XHUzMDZlXHU2NWIwXHU4OThmXHU0ZjVjXHU2MjEwDQotQWN0aXZpdHlEaWFncmFtX1BoYXNlX3RleHQ9XHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGJhDQotQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXA9XHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGJhXHUzMDZlXHU2NWIwXHU4OThmXHU0ZjVjXHU2MjEwDQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQ9XHUzMGJmXHUzMGI5XHUzMGFmXHU4YTE4XHU4ZmYwXHU1YjUwDQotQWJzdHJhY3REaWFncmFtX1JvbGVEZXNjcmlwdG9yX3RleHQ9XHUzMGVkXHUzMGZjXHUzMGViXHU4YTE4XHU4ZmYwXHU1YjUwDQotV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV9wcmVmaXg9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU0ZjlkXHU1YjU4XHU5NWEyXHU0ZmMyXHU1NmYzOg0KLUFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90b29sdGlwPVx1MzBlZFx1MzBmY1x1MzBlYlx1OGExOFx1OGZmMFx1NWI1MFx1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMA0KLUFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwPVx1MzBiZlx1MzBiOVx1MzBhZlx1OGExOFx1OGZmMFx1NWI1MFx1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMA0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9EZWxpdmVyeVByb2Nlc3NfdGV4dD1cdTMwYzdcdTMwZWFcdTMwZDBcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi1BY3R2aXRpdml0eURpYWdyYW1fQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1cdTMwYjFcdTMwZmNcdTMwZDFcdTMwZDNcdTMwZWFcdTMwYzZcdTMwYTNcdTMwZmNcdTMwZmJcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjMNCi1BY3R2aXRpdml0eURpYWdyYW1fUGhhc2VfdGV4PVx1MzBkNVx1MzBhN1x1MzBmY1x1MzBiYQ0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1cdTUzY2RcdTVmYTkNCi1BY3R2aXRpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1cdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmMNCi1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU4YTE4XHU4ZmYwXHU1YjUwDQotQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90b29sdGlwPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1OGExOFx1OGZmMFx1NWI1MFx1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMA0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1cdThhYmZcdTY1NzQNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1cdTU3ZmFcdTY3MmNcdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTMwNGJcdTMwODlcdTMwNmVcdTY2ZjRcdTY1YjANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9XHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMGZiXHUzMGRjXHUzMGMzXHUzMGFmXHUzMGI5XHUzMDZlXHUzMGQ1XHUzMGE5XHUzMGZjXHUzMGRlXHUzMGMzXHUzMGM4Li4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1cdTVlNzNcdTU3NDdcdTMwNmJcdTViZmVcdTMwNTdcdTMwNjZcdTZjMzRcdTVlNzNcdTMwNmJcdTkxNGRcdTdmNmUNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PVx1NjcwMFx1NTIxZFx1MzA2ZVx1OTA3OFx1NjI5ZVx1MzA2Ylx1NWJmZVx1MzA1N1x1MzA2Nlx1NmMzNFx1NWU3M1x1MzA2Ylx1OTE0ZFx1N2Y2ZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9XHU1ZTczXHU1NzQ3XHUzMDZiXHU1YmZlXHUzMDU3XHUzMDY2XHU1NzgyXHU3NmY0XHUzMDZiXHU5MTRkXHU3ZjZlDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1cdTY3MDBcdTUyMWRcdTMwNmVcdTkwNzhcdTYyOWVcdTMwNmJcdTViZmVcdTMwNTdcdTMwNjZcdTU3ODJcdTc2ZjRcdTMwNmJcdTkxNGRcdTdmNmUNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PVx1NGZkZFx1N2JhMQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9ezB9IFx1MzA5Mlx1NGZkZFx1N2JhMVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9Nb3ZlTm9kZV9sYWJlbD1cdTMwY2VcdTMwZmNcdTMwYzlcdTMwNmVcdTc5ZmJcdTUyZDUNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JyZWZyZXNoZnJvbWJhc2U9XHU1N2ZhXHU2NzJjXHUzMDRiXHUzMDg5XHUzMDZlXHU2NmY0XHU2NWIwDQotQWJzdHJhY3REaWFncmFtX0JlbmRQb2ludF9jcmVhdGU9XHUzMGQ5XHUzMGYzXHUzMGM5XHUzMGZiXHUzMGRkXHUzMGE0XHUzMGYzXHUzMGM4XHUzMDZlXHU0ZjVjXHU2MjEwDQotDQotQWN0aXZpdHlEaWFncmFtX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dD1cdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdThhNzNcdTdkMzBcdTU2ZjNcdTMwOTJcdTk1OGJcdTMwNGYNCi1yZWZyZXNoQWN0aW9uX2xhYmVsPVx1NjZmNFx1NjViMA0KLXJlZnJlc2hGcm9tQmFzZUNtZF9sYWJlbD1cdTU3ZmFcdTY3MmNcdTMwNGJcdTMwODlcdTMwNmVcdTY2ZjRcdTY1YjANCi1kaWFncmFtX3NhdmVFcnJvcj1JVVBEMDAwMVc6IFx1MzBjMFx1MzBhNFx1MzBhMlx1MzBiMFx1MzBlOVx1MzBlMFx1MzA2ZVx1NGZkZFx1N2JhMVx1MzA2Ylx1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zg0KLQ0KLURlbGV0ZURpYWdyYW1fdGV4dD1cdTMwYzBcdTMwYTRcdTMwYTJcdTMwYjBcdTMwZTlcdTMwZTBcdTMwNmVcdTUyNGFcdTk2NjQNCi1EZWxldGVEaWFncmFtX3Byb21wdD1cdTMwNTNcdTMwNmVcdTMwYzBcdTMwYTRcdTMwYTJcdTMwYjBcdTMwZTlcdTMwZTBcdTMwOTJcdTk1ODlcdTMwNThcdTMwNjZcdTUyNGFcdTk2NjRcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/XG5cdTMwNTNcdTMwNmVcdTU5MDlcdTY2ZjRcdTMwNmZcdTZjMzhcdTdkOWFcdTc2ODRcdTMwNjdcdTMwMDFcdTUxNDNcdTMwNmJcdTYyM2JcdTMwNTlcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1hbGlnbl9iZW5kX3BvaW50X3RleHQ9XHUzMGQ5XHUzMGYzXHUzMGM5XHUzMGZiXHUzMGRkXHUzMGE0XHUzMGYzXHUzMGM4XHUzMDZlXHU4YWJmXHU2NTc0DQotQ29uZmlndXJhdGlvbkVkaXRvcklucHV0X2NvbmZpZ2VkaXRvcjA9XHU2OWNiXHU2MjEwXHUzMGE4XHUzMGM3XHUzMGEzXHUzMGJmXHUzMGZjDQotZGlhZ3JhbV9ub2RlX3Byb3BlcnR5X3ZhbHVlX3Byb2JsZW1fbXNnPVx1MzBjZVx1MzBmY1x1MzBjOVx1MzA2ZVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzBmY1x1NTAyNFx1MzA2Ylx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMg0KLWRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA9XHUzMGE4XHUzMGU5XHUzMGZjDQotDQotQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0PVx1MzBjMFx1MzBhNFx1MzBhMlx1MzBiMFx1MzBlOVx1MzBlMFx1MzA2ZVx1MzBlY1x1MzBhNFx1MzBhMlx1MzBhNlx1MzBjOFx1MzA2ZVx1NTIxZFx1NjcxZlx1NTMxNg0KLWVycm9yRGlhbG9nX3RpdGxlPVx1MzBhOFx1MzBlOVx1MzBmYw0KLWNvbW1hbmRfY2Fubm90RWRpdD1JVVBEMDAwM0U6IFx1MzBjMFx1MzBhNFx1MzBhMlx1MzBiMFx1MzBlOVx1MzBlMFx1MzA5Mlx1N2RlOFx1OTZjNlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90aXRsZT1cdTg5YWFcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwNmVcdTMwYWZcdTMwZWRcdTMwZmNcdTMwYmENCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGV4dD17MH0gXHUzMDRjXHUzMGFmXHUzMGVkXHUzMGZjXHUzMGJhXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyIHsxfSBcdTMwODJcdTk1ODlcdTMwNThcdTMwN2VcdTMwNTlcdTMwNGI/DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEwNzUzOWUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXByZXZpb3VzX25hbWVfbnVsbDE9XHVjNzc0XHVjODA0IFx1Yzc3NFx1Yjk4NFx1Yzc3NCBcdWIxMTAobnVsbClcdWM3N2MgXHVhY2JkXHVjNmIwIFx1Yzc3NFx1Yjk4NCBcdWJjYzBcdWFjYmQgXHVjMmU0XHVkNTg5IFx1Y2RlOFx1YzE4YyBcdWM4NzBcdWM3OTFcdWM3NzQgXHVkNWM4XHVjNmE5XHViNDE4XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4NCi1lcnJfbmFtZV9lbXB0eT1cdWM3NzRcdWI5ODRcdWM3NDQgXHViZTQ0XHVjNmNjXHViNDU4IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuIFx1YzYyY1x1YmMxNFx1Yjk3OCBcdWM3NzRcdWI5ODRcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLW1vdmVBY3Rpb25fbGFiZWw9XHVjNzc0XHViM2Q5DQotDQotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90ZXh0PVx1YzEyMFx1ZDBkZA0KLUFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdG9vbHRpcD1cdWIxNzhcdWI0ZGMgXHViNjEwXHViMjk0IFx1YjljMVx1ZDA2YyBcdWMxMjBcdWQwZGQNCi1BYnN0cmFjdERpYWdyYW1fQWRkTm9kZV90aXRsZT1cdWIxNzhcdWI0ZGMgXHVjZDk0XHVhYzAwDQotQWJzdHJhY3REaWFncmFtX0FkZE5vZGVfZXJyX21zZz1JWFJEMDAwMlc6IFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOFx1YzVkMCBcdWIxNzhcdWI0ZGMgXHVjZDk0XHVhYzAwIFx1YzJlNFx1ZDMyOA0KLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3RleHQ9XHViOWMxXHVkMDZjDQotQWJzdHJhY3REaWFncmFtX0xpbmtfc2VsZWN0PVx1YjljMVx1ZDA2YyBcdWMxMjBcdWQwZGQNCi1BYnN0cmFjdERpYWdyYW1fTGlua190b29sdGlwPVx1YzBjOCBcdWI5YzFcdWQwNmMgXHVjNzkxXHVjMTMxDQotQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0PVx1YzJkY1x1Yzc5MSBcdWIxNzhcdWI0ZGMNCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXA9XHVjMGM4IFx1YzJkY1x1Yzc5MSBcdWIxNzhcdWI0ZGMgXHVjNzkxXHVjMTMxDQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQ9XHViZTQ0XHVjODE1XHVkNjE1IFx1ZDE0ZFx1YzJhNFx1ZDJiOA0KLUFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwPVx1YzBjOCBcdWJlNDRcdWM4MTVcdWQ2MTUgXHVkMTRkXHVjMmE0XHVkMmI4IFx1Yzc5MVx1YzEzMQ0KLUFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3RleHQ9XHViM2Q5XHVhZTMwXHVkNjU0IFx1ZDQ1Y1x1YzJkY1x1YzkwNA0KLUFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3Rvb2x0aXA9XHVjMGM4IFx1YjNkOVx1YWUzMFx1ZDY1NCBcdWQ0NWNcdWMyZGNcdWM5MDQgXHVjNzkxXHVjMTMxDQotQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0PVx1YWNiMFx1YzgxNSBcdWIxNzhcdWI0ZGMNCi1BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXA9XHVjMGM4IFx1YWNiMFx1YzgxNSBcdWIxNzhcdWI0ZGMgXHVjNzkxXHVjMTMxDQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dD1cdWIwNWQgXHViMTc4XHViNGRjDQotQWN0aXZpdHlEZXRhaWxEaWFncmFtX3ByZWZpeD1cdWQ2NWNcdWIzZDkgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkOg0KLUFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3Rvb2x0aXA9XHVjMGM4IFx1YjA1ZCBcdWIxNzhcdWI0ZGMgXHVjNzkxXHVjMTMxDQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9XHVkNjVjXHViM2Q5DQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXA9XHVjMGM4IFx1ZDY1Y1x1YjNkOSBcdWM3OTFcdWMxMzENCi1BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ9XHViYzE4XHViY2Y1DQotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90b29sdGlwPVx1YzBjOCBcdWJjMThcdWJjZjUgXHVjNzkxXHVjMTMxDQotQWN0aXZpdHlEaWFncmFtX1BoYXNlX3RleHQ9XHViMmU4XHVhY2M0DQotQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXA9XHVjMGM4IFx1YjJlOFx1YWNjNCBcdWM3OTFcdWMxMzENCi1BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dD1cdWQwYzBcdWMyYTRcdWQwNmMgXHVjMTI0XHViYTg1XHVjNzkwDQotQWJzdHJhY3REaWFncmFtX1JvbGVEZXNjcmlwdG9yX3RleHQ9XHVjNWVkXHVkNTYwIFx1YzEyNFx1YmE4NVx1Yzc5MA0KLVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4PVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjODg1XHVjMThkXHVjMTMxIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhODoNCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdG9vbHRpcD1cdWMwYzggXHVjNWVkXHVkNTYwIFx1YzEyNFx1YmE4NVx1Yzc5MCBcdWM3OTFcdWMxMzENCi1BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdG9vbHRpcD1cdWMwYzggXHVkMGMwXHVjMmE0XHVkMDZjIFx1YzEyNFx1YmE4NVx1Yzc5MCBcdWM3OTFcdWMxMzENCi1BY3R2aXRpdml0eURpYWdyYW1fRGVsaXZlcnlQcm9jZXNzX3RleHQ9XHVjODA0XHViMmVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNA0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0PVx1YWUzMFx1YjJhNSBcdWQzMjhcdWQxMzQNCi1BY3R2aXRpdml0eURpYWdyYW1fUGhhc2VfdGV4PVx1YjJlOFx1YWNjNA0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1cdWJjMThcdWJjZjUNCi1BY3R2aXRpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1cdWQ2NWNcdWIzZDkNCi1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWMxMjRcdWJhODVcdWM3OTANCi1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3Rvb2x0aXA9XHVjMGM4IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjMTI0XHViYTg1XHVjNzkwIFx1Yzc5MVx1YzEzMQ0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1cdWI5ZGVcdWNkOTRcdWFlMzANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1cdWFlMzBcdWJjZjggXHVkNjVjXHViM2Q5XHVjNWQwXHVjMTFjIFx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNThcdWFlMzANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9XHVkNjE1XHVjMmRkIFx1ZDE0ZFx1YzJhNFx1ZDJiOCBcdWMwYzFcdWM3OTAuLi4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVx1ZDNjOVx1YWRlMFx1YzVkMCBcdWI5ZGVcdWNkYjAgXHVhYzAwXHViODVjXHViODVjDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1cdWNjOThcdWM3NGMgXHVjMTIwXHVkMGRkXHVjMGFjXHVkNTZkXHVjNWQwIFx1YjlkZVx1Y2RiMCBcdWFjMDBcdWI4NWNcdWI4NWMNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVx1ZDNjOVx1YWRlMFx1YzVkMCBcdWI5ZGVcdWNkYjAgXHVjMTM4XHViODVjXHViODVjDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1cdWNjOThcdWM3NGMgXHVjMTIwXHVkMGRkXHVjMGFjXHVkNTZkXHVjNWQwIFx1YjlkZVx1Y2RiMCBcdWMxMzhcdWI4NWNcdWI4NWMNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PVx1YzgwMFx1YzdhNQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9ezB9IFx1YzgwMFx1YzdhNSBcdWM5MTENCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw9XHViMTc4XHViNGRjIFx1Yzc3NFx1YjNkOQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcnJlZnJlc2hmcm9tYmFzZT1cdWFlMzBcdWJjZjhcdWM1ZDBcdWMxMWMgXHVjMGM4XHViODVjIFx1YWNlMFx1Y2U1OFx1YWUzMA0KLUFic3RyYWN0RGlhZ3JhbV9CZW5kUG9pbnRfY3JlYXRlPVx1YWQ3NFx1YWNlMVx1YzgxMCBcdWM3OTFcdWMxMzENCi0NCi1BY3Rpdml0eURpYWdyYW1fb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0PVx1ZDY1Y1x1YjNkOSBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmQgXHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4IFx1YzVmNFx1YWUzMA0KLXJlZnJlc2hBY3Rpb25fbGFiZWw9XHVjMGM4XHViODVjIFx1YWNlMFx1Y2U1OFx1YWUzMA0KLXJlZnJlc2hGcm9tQmFzZUNtZF9sYWJlbD1cdWFlMzBcdWJjZjhcdWM1ZDBcdWMxMWMgXHVjMGM4XHViODVjIFx1YWNlMFx1Y2U1OFx1YWUzMA0KLWRpYWdyYW1fc2F2ZUVycm9yPUlVUEQwMDAxVzogXHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4IFx1YzgwMFx1YzdhNSBcdWMyZTRcdWQzMjgNCi0NCi1EZWxldGVEaWFncmFtX3RleHQ9XHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4IFx1YzBhZFx1YzgxYw0KLURlbGV0ZURpYWdyYW1fcHJvbXB0PVx1Yzc3NCBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YThcdWM3NDQgXHViMmViXHVhY2UwIFx1YzBhZFx1YzgxY1x1ZDU1OFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz9cblx1Yzc3NCBcdWJjYzBcdWFjYmRcdWM3NDAgXHVjNjAxXHVhZDZjXHVjODAxXHVjNzc0XHViYmMwXHViODVjIFx1YzJlNFx1ZDU4OSBcdWNkZThcdWMxOGNcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1hbGlnbl9iZW5kX3BvaW50X3RleHQ9XHVhZDc0XHVhY2UxXHVjODEwIFx1YjlkZVx1Y2Q5NFx1YWUzMA0KLUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dF9jb25maWdlZGl0b3IwPVx1YWQ2Y1x1YzEzMSBcdWQzYjhcdWM5ZDFcdWFlMzANCi1kaWFncmFtX25vZGVfcHJvcGVydHlfdmFsdWVfcHJvYmxlbV9tc2c9XHViMTc4XHViNGRjIFx1ZDJiOVx1YzEzMSBcdWFjMTIgXHVjNjI0XHViOTU4Lg0KLWRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA9XHVjNjI0XHViOTU4IA0KLUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcl9SZXNldERpYWdyYW1MYXlvdXRfdGV4dD1cdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTggXHViODA4XHVjNzc0XHVjNTQ0XHVjNmMzIFx1YzdhY1x1YzEyNFx1YzgxNQ0KLWVycm9yRGlhbG9nX3RpdGxlPVx1YzYyNFx1Yjk1OA0KLWNvbW1hbmRfY2Fubm90RWRpdD1JVVBEMDAwM0U6IFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOFx1Yzc0NCBcdWQzYjhcdWM5ZDFcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1Yzc0Yw0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90aXRsZT1cdWMwYzFcdWM3MDQgXHVkM2I4XHVjOWQxXHVhZTMwIFx1YjJlYlx1ZDc5OA0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90ZXh0PXswfVx1Yzc3NChcdWFjMDApIFx1YjJlYlx1ZDYxNFx1YzJiNVx1YjJjOFx1YjJlNC4gezF9XHViM2M0IFx1YjJlYlx1YzczY1x1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWYyZDFhOC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotcHJldmlvdXNfbmFtZV9udWxsMT1OXHUwMGUzbyBcdTAwZTkgcGVybWl0aWRvIGRlc2ZhemVyIHVtYSBhbHRlcmFcdTAwZTdcdTAwZTNvIGRlIG5vbWUgc2UgbyBub21lIGFudGVyaW9yIGZvciBudWxvLg0KLWVycl9uYW1lX2VtcHR5PU8gbm9tZSBuXHUwMGUzbyBwb2RlIGVzdGFyIHZhemlvLiBFc3BlY2lmaXF1ZSB1bSBub21lIHZcdTAwZTFsaWRvLg0KLW1vdmVBY3Rpb25fbGFiZWw9TW92ZXINCi0NCi1BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3RleHQ9U2VsZWNpb25hcg0KLUFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdG9vbHRpcD1TZWxlY2lvbmFyIG5cdTAwZjMgb3UgbGluaw0KLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX3RpdGxlPUluY2x1aXIgTlx1MDBmMw0KLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX2Vycl9tc2c9SVhSRDAwMDJXOiBBIGluY2x1c1x1MDBlM28gZGUgdW0gblx1MDBmMyBubyBkaWFncmFtYSBmYWxob3UNCi1BYnN0cmFjdERpYWdyYW1fTGlua190ZXh0PUxpbmsNCi1BYnN0cmFjdERpYWdyYW1fTGlua19zZWxlY3Q9U2VsZWNpb25hciBMaW5rDQotQWJzdHJhY3REaWFncmFtX0xpbmtfdG9vbHRpcD1DcmlhciBub3ZvIExpbmsNCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3RleHQ9Tlx1MDBmMyBkZSBJblx1MDBlZGNpbw0KLUFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdG9vbHRpcD1DcmlhciBOb3ZvIE5cdTAwZjMgZGUgSW5cdTAwZWRjaW8NCi1BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dD1UZXh0byBMaXZyZQ0KLUFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwPUNyaWFyIE5vdm8gVGV4dG8gTGl2cmUNCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90ZXh0PUJhcnJhIGRlIFNpbmNyb25pemFcdTAwZTdcdTAwZTNvDQotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdG9vbHRpcD1DcmlhciBOb3ZhIEJhcnJhIGRlIFNpbmNyb25pemFcdTAwZTdcdTAwZTNvDQotQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0PU5cdTAwZjMgZGUgRGVjaXNcdTAwZTNvDQotQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90b29sdGlwPUNyaWFyIE5vdm8gTlx1MDBmMyBkZSBEZWNpc1x1MDBlM28NCi1BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90ZXh0PU5cdTAwZjMgZGUgRXh0cmVtaWRhZGUNCi1BY3Rpdml0eURldGFpbERpYWdyYW1fcHJlZml4PURldGFsaGUgZG8gQWN0aXZpdHk6DQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcD1DcmlhciBOb3ZvIE5cdTAwZjMgZGUgRXh0cmVtaWRhZGUNCi1BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1BdGl2aWRhZGUNCi1BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdG9vbHRpcD1DcmlhciBOb3ZhIEF0aXZpZGFkZQ0KLUFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1JdGVyYVx1MDBlN1x1MDBlM28NCi1BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3Rvb2x0aXA9Q3JpYXIgTm92YSBJdGVyYVx1MDBlN1x1MDBlM28NCi1BY3Rpdml0eURpYWdyYW1fUGhhc2VfdGV4dD1GYXNlDQotQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXA9Q3JpYXIgTm92YSBGYXNlDQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQ9RGVzY3JpdG9yIGRlIFRhcmVmYXMNCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdGV4dD1EZXNjcml0b3IgZGEgRnVuXHUwMGU3XHUwMGUzbw0KLVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4PURpYWdyYW1hIGRlIERlcGVuZFx1MDBlYW5jaWEgZGUgUHJvZHV0byBkZSBUcmFiYWxobzoNCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdG9vbHRpcD1DcmlhciBOb3ZvIERlc2NyaXRvciBkZSBGdW5cdTAwZTdcdTAwZTNvDQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3Rvb2x0aXA9Q3JpYXIgTm92byBEZXNjcml0b3IgZGUgVGFyZWZhDQotQWN0dml0aXZpdHlEaWFncmFtX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0PVByb2Nlc3NvIGRlIEVudHJlZ2ENCi1BY3R2aXRpdml0eURpYWdyYW1fQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1QYWRyXHUwMGUzbyBkZSBSZWN1cnNvDQotQWN0dml0aXZpdHlEaWFncmFtX1BoYXNlX3RleD1GYXNlDQotQWN0dml0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0PUl0ZXJhXHUwMGU3XHUwMGUzbw0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0PUF0aXZpZGFkZQ0KLUFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dD1EZXNjcml0b3IgZG8gUHJvZHV0byBkZSBUcmFiYWxobw0KLUFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcD1DcmlhciBOb3ZvIERlc2NyaXRvciBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2FsaWduTWVudV90ZXh0PUFsaW5oYXINCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1BdHVhbGl6YXIgYSBwYXJ0aXIgZGEgQXRpdmlkYWRlIGRlIEJhc2UNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9Rm9ybWF0YXIgQ2FpeGEgZGUgVGV4dG8uLi4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PUhvcml6b250YWxtZW50ZSBwYXJhIGEgTVx1MDBlOWRpYQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9SG9yaXpvbnRhbG1lbnRlIHBhcmEgbyBQcmltZWlybyBTZWxlY2lvbmFkbw0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9VmVydGljYWxtZW50ZSBwYXJhIGEgTVx1MDBlOWRpYQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9VmVydGljYWxtZW50ZSBwYXJhIG8gUHJpbWVpcm8gU2VsZWNpb25hZG8NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PVNhbHZhcg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9U2FsdmFuZG8gezB9DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsPU1vdmVyIE5cdTAwZjMNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JyZWZyZXNoZnJvbWJhc2U9QXR1YWxpemFyIGEgUGFydGlyIGRhIEJhc2UNCi1BYnN0cmFjdERpYWdyYW1fQmVuZFBvaW50X2NyZWF0ZT1DcmlhciBQb250byBkZSBDdXJ2YXR1cmENCi0NCi1BY3Rpdml0eURpYWdyYW1fb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0PUFicmlyIERpYWdyYW1hIGRlIERldGFsaGVzIGRlIEF0aXZpZGFkZXMNCi1yZWZyZXNoQWN0aW9uX2xhYmVsPUF0dWFsaXphcg0KLXJlZnJlc2hGcm9tQmFzZUNtZF9sYWJlbD1BdHVhbGl6YXIgYSBQYXJ0aXIgZGEgQmFzZQ0KLWRpYWdyYW1fc2F2ZUVycm9yPUlVUEQwMDAxVzogT2NvcnJldSB1bWEgZmFsaGEgYW8gc2FsdmFyIG8gZGlhZ3JhbWENCi0NCi1EZWxldGVEaWFncmFtX3RleHQ9RXhjbHVpciBEaWFncmFtYQ0KLURlbGV0ZURpYWdyYW1fcHJvbXB0PVRlciBjZXJ0ZXphIGRlIHF1ZSBxdWVyIGZlY2hhciBlIGV4Y2x1aXIgZXN0ZSBkaWFncmFtYT9cbkVzdGEgYWx0ZXJhXHUwMGU3XHUwMGUzbyBcdTAwZTkgcGVybWFuZW50ZSBlIG5cdTAwZTNvIHBvZGUgc2VyIGRlc2ZlaXRhLg0KLWFsaWduX2JlbmRfcG9pbnRfdGV4dD1BbGluaGFyIFBvbnRvIGRlIEN1cnZhdHVyYQ0KLUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dF9jb25maWdlZGl0b3IwPUVkaXRvciBkZSBDb25maWd1cmFcdTAwZTdcdTAwZTNvDQotZGlhZ3JhbV9ub2RlX3Byb3BlcnR5X3ZhbHVlX3Byb2JsZW1fbXNnPUVycm8gbm8gdmFsb3IgZGEgcHJvcHJpZWRhZGUgZG8gblx1MDBmMy4NCi1kaWFncmFtX2Vycm9yRGlhbG9nX3RpdGxlX3RleHQwPUVycm8NCi1BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JfUmVzZXREaWFncmFtTGF5b3V0X3RleHQ9UmVjb25maWd1cmFyIExheW91dCBkbyBEaWFncmFtYQ0KLWVycm9yRGlhbG9nX3RpdGxlPUVycm8NCi1jb21tYW5kX2Nhbm5vdEVkaXQ9SVVQRDAwMDNFOiBOXHUwMGUzbyBcdTAwZTkgcG9zc1x1MDBlZHZlbCBlZGl0YXIgbyBkaWFncmFtYQ0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90aXRsZT1FZGl0b3IgUGFpIEZlY2hhZG8NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGV4dD1PIHswfSBmb2kgZmVjaGFkby4gRGVzZWphIGZlY2hhciB7MX0/DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzNTNmZTMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXByZXZpb3VzX25hbWVfbnVsbDE9XHU1OTgyXHU2NzljXHU1MTQ4XHU1MjRkXHU3Njg0XHU1NDBkXHU3OWYwXHU0ZTNhXHU3YTdhXHVmZjBjXHU1MjE5XHU0ZTBkXHU1MTQxXHU4YmI4XHU2NGE0XHU2ZDg4XHU1NDBkXHU3OWYwXHU2NmY0XHU2NTM5XHUzMDAyDQotZXJyX25hbWVfZW1wdHk9XHU1NDBkXHU3OWYwXHU0ZTBkXHU4MGZkXHU0ZTNhXHU3YTdhXHUzMDAyXHU4YmY3XHU2MzA3XHU1YjlhXHU2NzA5XHU2NTQ4XHU1NDBkXHU3OWYwXHUzMDAyDQotbW92ZUFjdGlvbl9sYWJlbD1cdTc5ZmJcdTUyYTgNCi0NCi1BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3RleHQ9XHU5MDA5XHU2MmU5DQotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90b29sdGlwPVx1OTAwOVx1NjJlOVx1ODI4Mlx1NzBiOVx1NjIxNlx1OTRmZVx1NjNhNQ0KLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX3RpdGxlPVx1NmRmYlx1NTJhMFx1ODI4Mlx1NzBiOQ0KLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX2Vycl9tc2c9SVhSRDAwMDJXOiBcdTVjMDZcdTgyODJcdTcwYjlcdTZkZmJcdTUyYTBcdTUyMzBcdTU2ZmVcdTU5MzFcdThkMjUNCi1BYnN0cmFjdERpYWdyYW1fTGlua190ZXh0PVx1OTRmZVx1NjNhNQ0KLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3NlbGVjdD1cdTkwMDlcdTYyZTlcdTk0ZmVcdTYzYTUNCi1BYnN0cmFjdERpYWdyYW1fTGlua190b29sdGlwPVx1NTIxYlx1NWVmYVx1NjViMFx1OTRmZVx1NjNhNQ0KLUFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdGV4dD1cdTU0MmZcdTUyYThcdTgyODJcdTcwYjkNCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXA9XHU1MjFiXHU1ZWZhXHU2NWIwXHU1NDJmXHU1MmE4XHU4MjgyXHU3MGI5DQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQ9XHU4MWVhXHU3NTMxXHU2NTg3XHU2NzJjDQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXA9XHU1MjFiXHU1ZWZhXHU2NWIwXHU3Njg0XHU4MWVhXHU3NTMxXHU2NTg3XHU2NzJjDQotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdGV4dD1cdTU0MGNcdTZiNjVcdTY3NjENCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90b29sdGlwPVx1NTIxYlx1NWVmYVx1NjViMFx1NTQwY1x1NmI2NVx1Njc2MQ0KLUFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdGV4dD1cdTUxYjNcdTdiNTZcdTgyODJcdTcwYjkNCi1BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXA9XHU1MjFiXHU1ZWZhXHU2NWIwXHU1MWIzXHU3YjU2XHU4MjgyXHU3MGI5DQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dD1cdTdlZDNcdTY3NWZcdTgyODJcdTcwYjkNCi1BY3Rpdml0eURldGFpbERpYWdyYW1fcHJlZml4PVx1NmQzYlx1NTJhOFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1ZmYxYQ0KLUFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3Rvb2x0aXA9XHU1MjFiXHU1ZWZhXHU2NWIwXHU3ZWQzXHU2NzVmXHU4MjgyXHU3MGI5DQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9XHU2ZDNiXHU1MmE4DQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXA9XHU1MjFiXHU1ZWZhXHU2NWIwXHU2ZDNiXHU1MmE4DQotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0PVx1OGZlZFx1NGVlMw0KLUFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdG9vbHRpcD1cdTUyMWJcdTVlZmFcdTY1YjBcdThmZWRcdTRlZTMNCi1BY3Rpdml0eURpYWdyYW1fUGhhc2VfdGV4dD1cdTk2MzZcdTZiYjUNCi1BY3Rpdml0eURpYWdyYW1fUGhhc2VfdG9vbHRpcD1cdTUyMWJcdTVlZmFcdTY1YjBcdTk2MzZcdTZiYjUNCi1BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dD1cdTRlZmJcdTUyYTFcdTYzY2ZcdThmZjBcdTdiMjYNCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdGV4dD1cdTg5ZDJcdTgyNzJcdTYzY2ZcdThmZjBcdTdiMjYNCi1Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtX3ByZWZpeD1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTRmOWRcdThkNTZcdTUxNzNcdTdjZmJcdTU2ZmVcdWZmMWENCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdG9vbHRpcD1cdTUyMWJcdTVlZmFcdTY1YjBcdTg5ZDJcdTgyNzJcdTYzY2ZcdThmZjBcdTdiMjYNCi1BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdG9vbHRpcD1cdTUyMWJcdTVlZmFcdTY1YjBcdTRlZmJcdTUyYTFcdTYzY2ZcdThmZjBcdTdiMjYNCi1BY3R2aXRpdml0eURpYWdyYW1fRGVsaXZlcnlQcm9jZXNzX3RleHQ9XHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiDQotQWN0dml0aXZpdHlEaWFncmFtX0NhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9XHU4MGZkXHU1MjliXHU2YTIxXHU1ZjBmDQotQWN0dml0aXZpdHlEaWFncmFtX1BoYXNlX3RleD1cdTk2MzZcdTZiYjUNCi1BY3R2aXRpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ9XHU4ZmVkXHU0ZWUzDQotQWN0dml0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9XHU2ZDNiXHU1MmE4DQotQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0PVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NjNjZlx1OGZmMFx1N2IyNg0KLUFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcD1cdTUyMWJcdTVlZmFcdTY1YjBcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTYzY2ZcdThmZjBcdTdiMjYNCi0NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9XHU1YmY5XHU5ZjUwDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3JlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQ9XHU0ZWNlXHU1N2ZhXHU2NzJjXHU2ZDNiXHU1MmE4XHU1MjM3XHU2NWIwDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2Zvcm1hdFRleHRCb3hBY3Rpdml0eV90ZXh0PVx1NjgzY1x1NWYwZlx1NjU4N1x1NjcyY1x1Njg0Ni4uLg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9XHU2YzM0XHU1ZTczXHU1YzQ1XHU0ZTJkXHU1YmY5XHU5ZjUwDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1cdTZjMzRcdTVlNzNcdTViZjlcdTlmNTBcdTdiMmNcdTRlMDBcdTRlMmFcdTkwMDlcdTViOWFcdTk4NzkNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVx1NTc4Mlx1NzZmNFx1NWM0NVx1NGUyZFx1NWJmOVx1OWY1MA0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9XHU1NzgyXHU3NmY0XHU1YmY5XHU5ZjUwXHU3YjJjXHU0ZTAwXHU0ZTJhXHU5MDA5XHU1YjlhXHU5ODc5DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dD1cdTRmZGRcdTViNTgNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlPVx1NmI2M1x1NTcyOFx1NGZkZFx1NWI1OCB7MH0NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw9XHU3OWZiXHU1MmE4XHU4MjgyXHU3MGI5DQotQWJzdHJhY3REaWFncmFtRWRpdG9ycmVmcmVzaGZyb21iYXNlPVx1NGVjZVx1NTdmYVx1NjcyY1x1NmQzYlx1NTJhOFx1NTIzN1x1NjViMA0KLUFic3RyYWN0RGlhZ3JhbV9CZW5kUG9pbnRfY3JlYXRlPVx1NTIxYlx1NWVmYVx1NWYyZlx1NjZmMlx1NzBiOQ0KLQ0KLUFjdGl2aXR5RGlhZ3JhbV9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9XHU2MjUzXHU1ZjAwXHU2ZDNiXHU1MmE4XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHU1NmZlDQotcmVmcmVzaEFjdGlvbl9sYWJlbD1cdTUyMzdcdTY1YjANCi1yZWZyZXNoRnJvbUJhc2VDbWRfbGFiZWw9XHU0ZWNlXHU1N2ZhXHU2NzJjXHU2ZDNiXHU1MmE4XHU1MjM3XHU2NWIwDQotZGlhZ3JhbV9zYXZlRXJyb3I9SVVQRDAwMDFXOiBcdTRmZGRcdTViNThcdTU2ZmVcdTU5MzFcdThkMjUNCi0NCi1EZWxldGVEaWFncmFtX3RleHQ9XHU1MjIwXHU5NjY0XHU1NmZlDQotRGVsZXRlRGlhZ3JhbV9wcm9tcHQ9XHU3ODZlXHU1YjllXHU4OTgxXHU1MTczXHU5NWVkXHU1ZTc2XHU1MjIwXHU5NjY0XHU2YjY0XHU1NmZlXHU1NDE3XHVmZjFmXG5cdTZiNjRcdTY2ZjRcdTY1MzlcdTVjMDZcdTY2MmZcdTZjMzhcdTRlNDVcdTc2ODRcdTRlMTRcdTY1ZTBcdTZjZDVcdTY0YTRcdTZkODhcdTMwMDINCi1hbGlnbl9iZW5kX3BvaW50X3RleHQ9XHU1YmY5XHU5ZjUwXHU1ZjJmXHU2NmYyXHU3MGI5DQotQ29uZmlndXJhdGlvbkVkaXRvcklucHV0X2NvbmZpZ2VkaXRvcjA9XHU5MTRkXHU3ZjZlXHU3ZjE2XHU4ZjkxXHU1NjY4DQotZGlhZ3JhbV9ub2RlX3Byb3BlcnR5X3ZhbHVlX3Byb2JsZW1fbXNnPVx1ODI4Mlx1NzBiOVx1NzY4NFx1NWM1ZVx1NjAyN1x1NTAzY1x1NGUyZFx1NjcwOVx1OTUxOVx1OGJlZlx1MzAwMg0KLWRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA9XHU5NTE5XHU4YmVmDQotDQotQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0PVx1OTFjZFx1NjViMFx1OGJiZVx1N2Y2ZVx1NTZmZVx1NzY4NFx1NWUwM1x1NWM0MA0KLWVycm9yRGlhbG9nX3RpdGxlPVx1OTUxOVx1OGJlZg0KLWNvbW1hbmRfY2Fubm90RWRpdD1JVVBEMDAwM0U6IFx1NjVlMFx1NmNkNVx1N2YxNlx1OGY5MVx1NTZmZQ0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90aXRsZT1cdTcyMzZcdTdmMTZcdThmOTFcdTU2NjhcdTVkZjJcdTUxNzNcdTk1ZWQNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGV4dD17MH0gXHU1ZGYyXHU1MTczXHU5NWVkXHUzMDAyXHU4OTgxXHU1NDBjXHU2NWY2XHU1MTczXHU5NWVkIHsxfSBcdTU0MTdcdWZmMWYNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDdmMGQyMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotcHJldmlvdXNfbmFtZV9udWxsMT1cdTU5ODJcdTY3OWNcdTUyNGRcdTRlMDBcdTUwMGJcdTU0MGRcdTdhMzFcdTY2MmZcdTdhN2FcdTUwM2NcdWZmMGNcdTUyNDdcdTRlMGRcdTUxNDFcdThhMzFcdTVmYTlcdTUzOWZcdTU0MGRcdTdhMzFcdThiOGFcdTY2ZjRcdTMwMDINCi1lcnJfbmFtZV9lbXB0eT1cdTU0MGRcdTdhMzFcdTRlMGRcdTgwZmRcdTdhN2FcdTc2N2RcdTMwMDJcdThhY2JcdTYzMDdcdTViOWFcdTY3MDlcdTY1NDhcdTc2ODRcdTU0MGRcdTdhMzFcdTMwMDINCi1tb3ZlQWN0aW9uX2xhYmVsPVx1NzlmYlx1NTJkNQ0KLQ0KLUFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dD1cdTkwNzhcdTUzZDYNCi1BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3Rvb2x0aXA9XHU5MDc4XHU1M2Q2XHU3YmMwXHU5ZWRlXHU2MjE2XHU5M2M4XHU3ZDUwDQotQWJzdHJhY3REaWFncmFtX0FkZE5vZGVfdGl0bGU9XHU2NWIwXHU1ODllXHU3YmMwXHU5ZWRlDQotQWJzdHJhY3REaWFncmFtX0FkZE5vZGVfZXJyX21zZz1JWFJEMDAwMlc6IFx1NWMwN1x1N2JjMFx1OWVkZVx1NjViMFx1NTg5ZVx1ODFmM1x1NTcxNlx1ODllM1x1NTkzMVx1NjU1Nw0KLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3RleHQ9XHU5M2M4XHU3ZDUwDQotQWJzdHJhY3REaWFncmFtX0xpbmtfc2VsZWN0PVx1OTA3OFx1NTNkNlx1OTNjOFx1N2Q1MA0KLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3Rvb2x0aXA9XHU1ZWZhXHU3YWNiXHU2NWIwXHU3Njg0XHU5M2M4XHU3ZDUwDQotQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0PVx1OGQ3N1x1NTljYlx1N2JjMFx1OWVkZQ0KLUFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdG9vbHRpcD1cdTVlZmFcdTdhY2JcdTY1YjBcdTc2ODRcdThkNzdcdTU5Y2JcdTdiYzBcdTllZGUNCi1BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dD1cdTRlZmJcdTYxMGZcdTY1ODdcdTViNTcNCi1BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcD1cdTVlZmFcdTdhY2JcdTY1YjBcdTc2ODRcdTRlZmJcdTYxMGZcdTY1ODdcdTViNTcNCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90ZXh0PVx1NTQwY1x1NmI2NVx1ODY1NVx1NzQwNlx1Njg3Zg0KLUFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3Rvb2x0aXA9XHU1ZWZhXHU3YWNiXHU2NWIwXHU3Njg0XHU1NDBjXHU2YjY1XHU4NjU1XHU3NDA2XHU2ODdmDQotQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0PVx1NmM3YVx1N2I1Nlx1N2JjMFx1OWVkZQ0KLUFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdG9vbHRpcD1cdTVlZmFcdTdhY2JcdTY1YjBcdTc2ODRcdTZjN2FcdTdiNTZcdTdiYzBcdTllZGUNCi1BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90ZXh0PVx1N2Q1MFx1Njc1Zlx1N2JjMFx1OWVkZQ0KLUFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9wcmVmaXg9XHU2ZDNiXHU1MmQ1XHU2NjBlXHU3ZDMwXHVmZjFhDQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcD1cdTVlZmFcdTdhY2JcdTY1YjBcdTc2ODRcdTdkNTBcdTY3NWZcdTdiYzBcdTllZGUNCi1BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1cdTZkM2JcdTUyZDUNCi1BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdG9vbHRpcD1cdTVlZmFcdTdhY2JcdTY1YjBcdTc2ODRcdTZkM2JcdTUyZDUNCi1BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ9XHU1M2NkXHU4OTg2DQotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90b29sdGlwPVx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NFx1NTNjZFx1ODk4Ng0KLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0PVx1OTY4ZVx1NmJiNQ0KLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90b29sdGlwPVx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NFx1OTY4ZVx1NmJiNQ0KLUFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90ZXh0PVx1NGY1Y1x1Njk2ZFx1NjNjZlx1OGZmMFx1NWI1MA0KLUFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90ZXh0PVx1ODlkMlx1ODI3Mlx1NjNjZlx1OGZmMFx1NWI1MA0KLVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4PVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1NzZmOFx1NGY5ZFx1OTVkY1x1NGZjMlx1NTcxNlx1ZmYxYQ0KLUFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90b29sdGlwPVx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NFx1ODlkMlx1ODI3Mlx1NjNjZlx1OGZmMFx1NWI1MA0KLUFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwPVx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NFx1NGY1Y1x1Njk2ZFx1NjNjZlx1OGZmMFx1NWI1MA0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9EZWxpdmVyeVByb2Nlc3NfdGV4dD1cdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGINCi1BY3R2aXRpdml0eURpYWdyYW1fQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1cdTUyOWZcdTgwZmRcdTU3OGJcdTZhMjMNCi1BY3R2aXRpdml0eURpYWdyYW1fUGhhc2VfdGV4PVx1OTY4ZVx1NmJiNQ0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1cdTUzY2RcdTg5ODYNCi1BY3R2aXRpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1cdTZkM2JcdTUyZDUNCi1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU2M2NmXHU4ZmYwXHU1YjUwDQotQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90b29sdGlwPVx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1NjNjZlx1OGZmMFx1NWI1MA0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1cdTVjMGRcdTlmNGENCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1cdTVmOWVcdTU3ZmFcdTY3MmNcdTZkM2JcdTUyZDVcdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDYNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9XHU2ODNjXHU1ZjBmXHU2NTg3XHU1YjU3XHU2ODQ2Li4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1cdTZjMzRcdTVlNzNcdTVjMGRcdTlmNGFcdTVlNzNcdTU3NDdcdTUwM2MNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PVx1NmMzNFx1NWU3M1x1NWMwZFx1OWY0YVx1N2IyY1x1NGUwMFx1NTAwYlx1OTA3OFx1NWI5YVx1OTgwNVx1NzZlZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9XHU1NzgyXHU3NmY0XHU1YzBkXHU5ZjRhXHU1ZTczXHU1NzQ3XHU1MDNjDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1cdTU3ODJcdTc2ZjRcdTVjMGRcdTlmNGFcdTdiMmNcdTRlMDBcdTUwMGJcdTkwNzhcdTViOWFcdTk4MDVcdTc2ZWUNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PVx1NTEzMlx1NWI1OA0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9XHU2YjYzXHU1NzI4XHU1MTMyXHU1YjU4IHswfQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9Nb3ZlTm9kZV9sYWJlbD1cdTc5ZmJcdTUyZDVcdTdiYzBcdTllZGUNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JyZWZyZXNoZnJvbWJhc2U9XHU1ZjllXHU1N2ZhXHU2NzJjXHU5MWNkXHU2NWIwXHU2NTc0XHU3NDA2DQotQWJzdHJhY3REaWFncmFtX0JlbmRQb2ludF9jcmVhdGU9XHU1ZWZhXHU3YWNiXHU1ZjRlXHU2NmYyXHU5ZWRlDQotDQotQWN0aXZpdHlEaWFncmFtX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dD1cdTk1OGJcdTU1NWZcdTZkM2JcdTUyZDVcdTY2MGVcdTdkMzBcdTU3MTYNCi1yZWZyZXNoQWN0aW9uX2xhYmVsPVx1OTFjZFx1NjViMFx1NjU3NFx1NzQwNg0KLXJlZnJlc2hGcm9tQmFzZUNtZF9sYWJlbD1cdTVmOWVcdTU3ZmFcdTY3MmNcdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDYNCi1kaWFncmFtX3NhdmVFcnJvcj1JVVBEMDAwMVc6IFx1NTEzMlx1NWI1OFx1NTcxNlx1ODllM1x1NTkzMVx1NjU1Nw0KLQ0KLURlbGV0ZURpYWdyYW1fdGV4dD1cdTUyMmFcdTk2NjRcdTU3MTZcdTg5ZTMNCi1EZWxldGVEaWFncmFtX3Byb21wdD1cdTYwYThcdTc4YmFcdTViOWFcdTg5ODFcdTk1ZGNcdTk1ODlcdTRlMjZcdTUyMmFcdTk2NjRcdTZiNjRcdTU3MTZcdTg5ZTNcdTU1Y2VcdWZmMWZcblx1NmI2NFx1OGI4YVx1NjZmNFx1NzBiYVx1NmMzOFx1NGU0NVx1NjAyN1x1ZmYwY1x1NzEyMVx1NmNkNVx1NWZhOVx1NTM5Zlx1MzAwMg0KLWFsaWduX2JlbmRfcG9pbnRfdGV4dD1cdTVjMGRcdTlmNGFcdTVmNGVcdTY2ZjJcdTllZGUNCi1Db25maWd1cmF0aW9uRWRpdG9ySW5wdXRfY29uZmlnZWRpdG9yMD1cdTkxNGRcdTdmNmVcdTdkZThcdThmMmZcdTU2NjgNCi1kaWFncmFtX25vZGVfcHJvcGVydHlfdmFsdWVfcHJvYmxlbV9tc2c9XHU3YmMwXHU5ZWRlXHU3Njg0XHU1MTY3XHU1YmI5XHU1MDNjXHU5MzJmXHU4YWE0XHUzMDAyDQotZGlhZ3JhbV9lcnJvckRpYWxvZ190aXRsZV90ZXh0MD1cdTkzMmZcdThhYTQNCi0NCi1BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JfUmVzZXREaWFncmFtTGF5b3V0X3RleHQ9XHU5MWNkXHU4YTJkXHU1NzE2XHU4OWUzXHU3MjQ4XHU5NzYyXHU5MTRkXHU3ZjZlDQotZXJyb3JEaWFsb2dfdGl0bGU9XHU5MzJmXHU4YWE0DQotY29tbWFuZF9jYW5ub3RFZGl0PUlVUEQwMDAzRTogXHU3MTIxXHU2Y2Q1XHU3ZGU4XHU4ZjJmXHU1NzE2XHU4OWUzDQotDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RpdGxlPVx1NmJjZFx1OTgwNVx1N2RlOFx1OGYyZlx1NTY2OFx1NWRmMlx1OTVkY1x1OTU4OQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90ZXh0PXswfSBcdTVkZjJcdTk1ZGNcdTk1ODlcdTMwMDJcdTYwYThcdTRlNWZcdTYwZjNcdTg5ODFcdTk1ZGNcdTk1ODkgezF9IFx1NTVjZVx1ZmYxZg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZDE4OTQzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGb3JtIFBhZ2UgVGl0bGVzDQotYXNzaWduUGFnZV90aXRsZT1adW9yZG5lbg0KLWNhdGVnb3JpZXNQYWdlX3RpdGxlPUthdGVnb3JpZW4NCi1kZWxpdmVyYWJsZVBhcnRzUGFnZV90aXRsZT1UZWlsZSBkZXMgTGllZmVyZ2VnZW5zdGFuZHMNCi1kZXNjcmlwdGlvblBhZ2VfdGl0bGU9QmVzY2hyZWlidW5nDQotZGlzY2lwbGluZXNQYWdlX3RpdGxlPURpc3ppcGxpbmVuDQotZGlzY2FyZHVucmVzb2x2ZWRyZWY9TmljaHQgYXVmZ2VsXHUwMGY2c3RlIFJlZmVyZW56ZW4gdmVyd2VyZmVuDQotZ3VpZGFuY2VQYWdlX3RpdGxlPUFubGVpdHVuZw0KLXByZXZpZXdQYWdlX3RpdGxlPVZvcmFuemVpZ2UNCi1yZWZlcmVuY2VzUGFnZV90aXRsZT1SZWZlcmVuemVuDQotcmVmZXJlbmNlX3RleHQ9UmVmZXJlbnplbjoNCi1yZWZlcmVuY2VXb3JrZmxvd1BhZ2VfdGl0bGU9UmVmZXJlbnp3b3JrZmxvdw0KLXJvbGVzUGFnZV90aXRsZT1Sb2xsZW4NCi1yb2xlU2V0c1BhZ2VfdGl0bGU9Um9sbGVuZ3J1cHBlbg0KLXN0ZXBzUGFnZV90aXRsZT1TY2hyaXR0ZQ0KLXRhc2tzUGFnZV90aXRsZT1BdWZnYWJlbg0KLXRvb2xNZW50b3JzUGFnZV90aXRsZT1Ub29sbWVudG9yZW4NCi13b3JrUHJvZHVjdHNQYWdlX3RpdGxlPUFyYmVpdHNlcmdlYm5pc3NlDQotDQotIyBTZWN0aW9uIE5hbWVzICYgRGVzY3JpcHRpb24NCi1jaGVja0l0ZW1zU2VjdGlvbl9uYW1lPVByXHUwMGZjZmxpc3RlbmVpbnRyXHUwMGU0Z2UNCi1jaGVja0l0ZW1zU2VjdGlvbl9kZXNjPUdlYmVuIFNpZSBkaWUgUHJcdTAwZmNmbGlzdGVuZWludHJcdTAwZTRnZSBmXHUwMGZjciBkaWVzZSBQclx1MDBmY2ZsaXN0ZSBhbi4NCi1kZXBlbmRlbmNpZXNTZWN0aW9uX25hbWU9QWJoXHUwMGU0bmdpZ2tlaXRlbg0KLWRlcGVuZGVuY2llc1NlY3Rpb25fZGVzYz1JbiBkaWVzZW0gQWJzY2huaXR0IHdlcmRlbiBkaWUgQWJoXHUwMGU0bmdpZ2tlaXRlbiBkaWVzZXMgSW5oYWx0c3Bha2V0cyB2b24gYW5kZXJlbiBJbmhhbHRzcGFrZXRlbiBhbmdlemVpZ3QuDQotZGV0YWlsU2VjdGlvbl9uYW1lPURldGFpbGluZm9ybWF0aW9uZW4NCi1kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4gZlx1MDBmY3IgezB9IGFuZ2ViZW4uDQotZ2VuZXJhbEluZm9TZWN0aW9uX25hbWU9QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuDQotZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIGZcdTAwZmNyIHswfSBhbmdlYmVuLg0KLWljb25TZWN0aW9uX25hbWU9U3ltYm9sDQotaWNvblNlY3Rpb25fZGVzYz1TeW1ib2xlIGZcdTAwZmNyIHswfSBhbnBhc3Nlbi4NCi1ub3RhdGlvblNlY3Rpb25fbmFtZT1CZXJlaXRzdGVsbHVuZ3NvcHRpb25lbg0KLW5vdGF0aW9uU2VjdGlvbl9kZXNjPUJlcmVpdHN0ZWxsdW5nc2luZm9ybWF0aW9uZW4genUgezB9IGFuZ2ViZW4uDQotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX25hbWU9UmVmZXJlbnppZXJ0ZSBQbHVnLWluczoNCi1yZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fZGVzYz1EaWVzZXIgQWJzY2huaXR0IHplaWd0IGRpZSB2b24gZGllc2VtIE1ldGhvZGVuLVBsdWctaW4gcmVmZXJlbnppZXJ0ZW4gUGx1Zy1pbnMgYW4uDQotc3RhZmZpbmdTZWN0aW9uX25hbWU9SW5mb3JtYXRpb25lbiB6dXIgTWl0YXJiZWl0ZXJhdXN3YWhsDQotc3RhZmZpbmdTZWN0aW9uX2Rlc2M9SW5mb3JtYXRpb25lbiB6dXIgTWl0YXJiZWl0ZXJhdXN3YWhsIGZcdTAwZmNyIGRpZXNlIFJvbGxlIGFuZ2ViZW4uDQotc3RlcHNTZWN0aW9uX25hbWU9U2Nocml0dGUNCi1zdGVwc1NlY3Rpb25fZGVzYz1EaWUgU2Nocml0dGUgZlx1MDBmY3IgZGllIEF1c2ZcdTAwZmNocnVuZyBkaWVzZXIgQXVmZ2FiZSBhbmdlYmVuLg0KLXRhaWxvcmluZ1NlY3Rpb25fbmFtZT1BbnBhc3N1bmcNCi10YWlsb3JpbmdTZWN0aW9uX2Rlc2M9QW5wYXNzdW5nc2luZm9ybWF0aW9uZW4gZlx1MDBmY3IgezB9IGFuZ2ViZW4uDQotdmFyaWFiaWxpdHlTZWN0aW9uX25hbWU9SW5oYWx0c3ZhcmlhYmlsaXRcdTAwZTR0DQotdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5nZWJlbiwgd2llIHswfSBtaXQgezB9IGluIEJlemllaHVuZyBzdGVodC4NCi12ZXJzaW9uSW5mb1NlY3Rpb25fbmFtZT1WZXJzaW9uc2luZm9ybWF0aW9uZW4NCi12ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1WZXJzaW9uc2luZm9ybWF0aW9uZW4gZlx1MDBmY3IgezB9IGFuZ2ViZW4uDQotDQotIyBVSSAmIEVsZW1lbnQgQXR0cmlidXRlIExhYmVscw0KLWFkZGl0aW9uYWxJbmZvX3RleHQ9WnVzXHUwMGU0dHpsaWNoZSBJbmZvcm1hdGlvbmVuOg0KLWFwcGxpY2F0aW9uX3RleHQ9QW53ZW5kdW5nOg0KLWFjdGlvbkxhYmVsX2VkaXQ9QmVhcmJlaXRlbg0KLWFjdGlvbkxhYmVsX2ZpbmRFbGVtZW50SW5MaWJOYXY9SW4gQmlibGlvdGhla3NzaWNodCBhbnplaWdlbg0KLWFsdGVybmF0aXZlc190ZXh0PUFsdGVybmF0aXZlbjoNCi1hc3NpZ25tZW50QXBwcm9hY2hlc190ZXh0PVp1b3JkbnVuZ3NzdHJhdGVnaWVuOg0KLWF1dGhvcnNfdGV4dD1BdXRvcmVuOg0KLWJhY2tncm91bmRfdGV4dD1IaW50ZXJncnVuZDoNCi1iYXNlRWxlbWVudF90ZXh0PUJhc2lzOg0KLWJhc2VHdWlkYW5jZV90ZXh0PUJhc2lzYW5sZWl0dW5nOg0KLWJyaWVmRGVzY3JpcHRpb25fdGV4dD1LdXJ6YmVzY2hyZWlidW5nOg0KLWRlc2NyaXB0aW9uX3RleHQ9QmVzY2hyZWlidW5nOg0KLWJhY2t1cGJlZm9yZXNhdmVfdGV4dD1Wb3IgZGVtIFNwZWljaGVybiBzaWNoZXJuDQotYnJpZWZPdXRsaW5lX3RleHQ9S3VyemluZm9ybWF0aW9uOg0KLWNoYW5nZURhdGVfdGV4dD1cdTAwYzRuZGVydW5nc2RhdHVtOg0KLWNoYW5nZURlc2NyaXB0aW9uX3RleHQ9XHUwMGM0bmRlcnVuZ3NiZXNjaHJlaWJ1bmc6DQotY2hlY2tJdGVtc190ZXh0PVByXHUwMGZjZmxpc3RlbmVpbnRyXHUwMGU0Z2UNCi1jb250cmlidXRlc190ZXh0PUJlaXRyYWcNCi1sb2NhbENvbnRyaWJ1dGVzX3RleHQ9TG9rYWxlciBCZWl0cmFnIHp1DQotY29udHJpYnV0ZXNfdG9fdGV4dD1CZWl0cmFnIHp1DQotY29weXJpZ2h0X3RleHQ9Q29weXJpZ2h0Og0KLWVkaXRvcl90ZXh0PUVkaXRvcg0KLWV4dGVuZHNfdGV4dD1FcndlaXRlcnVuZw0KLWV4dGVuZF90ZXh0PUVyd2VpdGVybg0KLWV4dGVybmFsRGVzY3JpcHRpb25fdGV4dD1FeHRlcm5lIEJlc2NocmVpYnVuZzoNCi1leHRlcm5hbElkX3RleHQ9RXh0ZXJuZSBJRDoNCi1nb2Fsc190ZXh0PVppZWxlOg0KLWltcGFjdE9mTm90SGF2aW5nX3RleHQ9QXVzd2lya3VuZ2VuIGJlaSBOaWNodHZlcndlbmR1bmc6DQota2V5Q29uc2lkZXJhdGlvbnNfdGV4dD1XaWNodGlnZSBIaW53ZWlzZToNCi1sZXZlbHNPZkFkb3B0aW9uX3RleHQ9RWluZlx1MDBmY2hydW5nc3N0dWZlOg0KLW1haW5EZXNjcmlwdGlvbl90ZXh0PUhhdXB0YmVzY2hyZWlidW5nOg0KLW5ld0VsZW1lbnRfdGV4dD17MH0gLSBOZXUNCi1uYW1lX3RleHQ9TmFtZToNCi1ub3RBcHBsaWNhYmxlX3RleHQ9TmljaHQgenV0cmVmZmVuZA0KLXBhY2thZ2luZ0d1aWRhbmNlX3RleHQ9QW5sZWl0dW5nIGZcdTAwZmNyIFBhY2tlbjoNCi1wcmVzZW50YXRpb25OYW1lX3RleHQ9UHJcdTAwZTRzZW50YXRpb25zbmFtZToNCi1wcm9tcHRmb3JsaWJhcnlfdGV4dD1BbmZvcmRlcnVuZyB6dXIgQW5nYWJlIGRlciBNZXRob2RlbmJpYmxpb3RoZWsgYmVpbSBTdGFydGVuDQotZW5hYmxlSGVhbHRoQ2hlY2tfdGV4dD1JbnRlcm5lIERlYnVnLVRvb2xzIGFrdGl2aWVyZW4NCi1wcm9ibGVtX3RleHQ9UHJvYmxlbToNCi1wdXJwb3NlX3RleHQ9WndlY2s6DQotcmVhc29uRm9yTm90TmVlZGluZ190ZXh0PUdyXHUwMGZjbmRlIGZcdTAwZmNyIE5pY2h0dmVyd2VuZHVuZzoNCi1yZXBsYWNlc190ZXh0PUVyc2V0enVuZw0KLWxvY2FsUmVwbGFjZXNfdGV4dD1Mb2thbGUgRXJzZXR6dW5nIGZcdTAwZmNyDQotcmVwcmVzZW50YXRpb25PcHRpb25zX3RleHQ9RGFyc3RlbGx1bmdzb3B0aW9uZW46DQotdGVtcGxhdGVGaWxlX3RleHQ9Vm9ybGFnZW5kYXRlaShlbik6DQotc2tpbGxzX3RleHQ9S25vdy1ob3c6DQotc3RlcHNfdGV4dD1TY2hyaXR0ZToNCi1zdGVwc19uYW1lX3RleHQ9TmFtZToNCi1zdG9wX3RleHQ9U3RvcHBlbg0KLXByaW50X3RleHQ9RHJ1Y2tlbg0KLXN5bm9ueW1zX3RleHQ9U3lub255bWU6DQotdHlwZV90ZXh0PVR5cDoNCi1jb3B5X3RleHQ9S29waWVyZW4NCi1kZWVwQ29weV90ZXh0PVRpZWZlIEtvcGllDQotYmFja190ZXh0PVp1clx1MDBmY2NrDQotbmV3X3BsdWdpbj1OZXVlcyBNZXRob2Rlbi1QbHVnLWluDQotbW92ZT1WZXJzY2hpZWJlbi4uLg0KLXVuaXF1ZUlkX3RleHQ9RWluZGV1dGlnZS1JRDoNCi12YXJpYWJpbGl0eVR5cGVfdGV4dD1WYXJpYWJpbGl0XHUwMGU0dHN0eXA6DQotdmVyc2lvbl90ZXh0PVZlcnNpb246DQotDQotIyBCdXR0b24gTGFiZWxzDQotYWRkQnV0dG9uX3RleHQ9SGluenVmXHUwMGZjZ2VuLi4uDQotYXR0YWNoQnV0dG9uX3RleHQ9QW5oXHUwMGU0bmdlbi4uLg0KLWJyb3dzZUJ1dHRvbl90ZXh0PUR1cmNoc3VjaGVuLi4uDQotY2hhbmdlVHlwZUJ1dHRvbl90ZXh0PVR5cCBcdTAwZTRuZGVybi4uLg0KLWNsZWFyQnV0dG9uX3RleHQ9SW5oYWx0IGxcdTAwZjZzY2hlbg0KLWRlbGV0ZUJ1dHRvbl90ZXh0PUxcdTAwZjZzY2hlbg0KLWRldGFjaEJ1dHRvbl90ZXh0PUFiaFx1MDBlNG5nZW4NCi1kaWFncmFtX3NhdmVFcnJvcj1GZWhsZXIgYmVpbSBTcGVpY2hlcm4gZGVzIERpYWdyYW1tcw0KLWRvd25CdXR0b25fdGV4dD1OYWNoIHVudGVuDQotZGlyZWN0b3J5X3RleHQ9VmVyemVpY2huaXM6DQotb3JkZXJCdXR0b25fdGV4dD1Tb3J0aWVyZW4NCi1lZGl0QnV0dG9uX3RleHQ9QmVhcmJlaXRlbi4uLg0KLXJlbW92ZUJ1dHRvbl90ZXh0PUVudGZlcm5lbg0KLXJlbmFtZUFjdGlvbl90ZXh0PVVtYmVuZW5uZW4uLi4NCi1yZW1vdmVfdGV4dD1FbnRmZXJuZW4NCi1yZW5hbWVfdGV4dD1VbWJlbmVubmVuDQotU2F2ZUFzX3RleHQ9U3BlaWNoZXJuIHVudGVyDQotc2VsZWN0QnV0dG9uX3RleHQ9QXVzd1x1MDBlNGhsZW4uLi4NCi1kZXNlbGVjdEJ1dHRvbl90ZXh0PUFid1x1MDBlNGhsZW4NCi11cEJ1dHRvbl90ZXh0PU5hY2ggb2Jlbg0KLW1ha2VEZWZhdWx0QnV0dG9uX3RleHQ9QWxzIFN0YW5kYXJkIGZlc3RsZWdlbg0KLXZpZXdIaXN0b3J5QnV0dG9uX3RleHQ9SGlzdG9yaWUgYW56ZWlnZW4uLi4NCi0NCi0jIFJvbGUgRWRpdG9yIFRhc2tzIFBhZ2UNCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25OYW1lPUF1ZmdhYmVuDQotcm9sZVRhc2tzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249RGllc2UgUm9sbGUgaXN0IEF1c2ZcdTAwZmNocmVuZGVyIGRlciBmb2xnZW5kZW4gQXVmZ2FiZW4uDQotcm9sZVRhc2tzUGFnZV9hdmFpbGFibGVMYWJlbD1WZXJmXHUwMGZjZ2JhcmUgQXVmZ2FiZW4NCi1yb2xlVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw9UHJpbVx1MDBlNHJlciBBdXNmXHUwMGZjaHJlbmRlcjoNCi1yb2xlVGFza3NQYWdlX3NlbGVjdGVkTGFiZWwyPVp1c1x1MDBlNHR6bGljaGVyIEF1c2ZcdTAwZmNocmVuZGVyOg0KLXJvbGVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1FcyB3dXJkZW4gezB9IEF1ZmdhYmVuIGF1c2dld1x1MDBlNGhsdC4NCi0NCi0jIFJvbGUgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPUFyYmVpdHNlcmdlYm5pc3NlOg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1BcmJlaXRzZXJnZWJuaXNzZSBhbmdlYmVuLCBmXHUwMGZjciBkaWUgZGllc2UgUm9sbGUgdmVyYW50d29ydGxpY2ggaXN0Lg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVZlcmZcdTAwZmNnYmFyZSBBcmJlaXRzZXJnZWJuaXNzZToNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVZlcmFudHdvcnRsaWNoIGZcdTAwZmNyOg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyPUFyYmVpdHNlcmdlYm5pc3NlLCBkaWUgQXVzZ2FiZW4gZGVyIEF1ZmdhYmVuIHNpbmQsIGRpZSBkaWVzZSBSb2xsZSBhdXNmXHUwMGZjaHJ0Og0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249RXMgd3VyZGVuIHswfSBBcmJlaXRzZXJnZWJuaXNzZSBhdXNnZXdcdTAwZTRobHQuDQotDQotIyBSb2xlIEVkaXRvciBHdWlkYW5jZSBQYWdlDQotcm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1BbmxlaXR1bmcNCi1yb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1MaW5rcyB6dSB3ZWl0ZXJlbiBJbmZvcm1hdGlvbmVuIGluIEZvcm0gdm9uIEFubGVpdHVuZ2VuIGFuZ2ViZW4uDQotcm9sZUd1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1WZXJmXHUwMGZjZ2JhcmUgQW5sZWl0dW5nOg0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1BbmxlaXR1bmc6DQotcm9sZUd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPUVzIHd1cmRlbiB7MH0gQW5sZWl0dW5nZW4gYXVzZ2V3XHUwMGU0aGx0Lg0KLQ0KLSMgUm9sZSBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPUthdGVnb3JpZW46DQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1EaWUgS2F0ZWdvcmllbiB2ZXJ3YWx0ZW4sIHp1IGRlbmVuIGRpZXNlIFJvbGxlIGdlaFx1MDBmNnJ0Lg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1Sb2xsZW5ncnVwcGVuOg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9QW5nZXBhc3N0ZSBLYXRlZ29yaWVuOg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPVJvbGxlbmdydXBwZW46DQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPUFuZ2VwYXNzdGUgS2F0ZWdvcmllbjoNCi0NCi0jIFRhc2sgRWRpdG9yIFJvbGVzIFBhZ2UNCi10YXNrUm9sZXNQYWdlX3NlY3Rpb25OYW1lPVJvbGxlbg0KLXRhc2tSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPURpZSBSb2xsZW4gZlx1MDBmY3IgZGllIEF1c2ZcdTAwZmNocnVuZyBkaWVzZXIgQXVmZ2FiZSB6dW9yZG5lbi4NCi10YXNrUm9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVZlcmZcdTAwZmNnYmFyZSBSb2xsZW46DQotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVByaW1cdTAwZTRyZXIgQXVzZlx1MDBmY2hyZW5kZXI6DQotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsMj1adXNcdTAwZTR0emxpY2hlIEF1c2ZcdTAwZmNocmVuZGU6DQotdGFza1JvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPUVzIHd1cmRlbiB7MH0gUm9sbGVuIGF1c2dld1x1MDBlNGhsdC4NCi10YXNrUm9sZXNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbW9kaWZ5X21lc3NhZ2U9SVVQQTAwMDQ1VzogTVx1MDBmNmNodGVuIFNpZSBkZW4gcHJpbVx1MDBlNHJlbiBBdXNmXHUwMGZjaHJlbmRlbiBpbiAnJ3swfScnIFx1MDBlNG5kZXJuPw0KLXRhc2tSb2xlc1BhZ2VfY29uZmlybV90aXRsZT1cdTAwYzRuZGVydW5nIGRlciBwcmltXHUwMGU0cmVuIFJvbGxlIGJlc3RcdTAwZTR0aWdlbg0KLQ0KLSMgVGFzayBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9QXJiZWl0c2VyZ2Vibmlzc2UNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249RWluZ2FiZS0gdW5kIEF1c2dhYmVhcmJlaXRzZXJnZWJuaXNzZSBmXHUwMGZjciBkaWVzZSBBdWZnYWJlIGFuZ2ViZW4uDQotdGFza1dvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9VmVyZlx1MDBmY2diYXJlIEFyYmVpdHNlcmdlYm5pc3NlDQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1WZXJiaW5kbGljaGUgRWluZ2FiZW46DQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9T3B0aW9uYWxlIEVpbmdhYmVuOg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwzPUF1c2dhYmVuOg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249RXMgd3VyZGVuIHswfSBBcmJlaXRzZXJnZWJuaXNzZSBhdXNnZXdcdTAwZTRobHQuDQotDQotIyBUYXNrIEVkaXRvciBHdWlkYW5jZSBQYWdlDQotdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1BbmxlaXR1bmcNCi10YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1MaW5rcyB6dSB3ZWl0ZXJlbiBJbmZvcm1hdGlvbmVuIGluIEZvcm0gdm9uIEFubGVpdHVuZ2VuIGFuZ2ViZW4uDQotdGFza0d1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1WZXJmXHUwMGZjZ2JhcmUgQW5sZWl0dW5nOg0KLXRhc2tHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1BbmxlaXR1bmc6DQotdGFza0d1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPUVzIHd1cmRlbiB7MH0gQW5sZWl0dW5nZW4gYXVzZ2V3XHUwMGU0aGx0Lg0KLQ0KLSMgVGFzayBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotdGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPUthdGVnb3JpZW4NCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPURpZSBLYXRlZ29yaWVuIHZlcndhbHRlbiwgenUgZGVuZW4gZGllc2UgQXVmZ2FiZSBnZWhcdTAwZjZydC4NCi10YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9RGlzemlwbGluZW4NCi10YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyPUFuZ2VwYXNzdGUgS2F0ZWdvcmllbg0KLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPURpc3ppcGxpbmVuOg0KLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1BbmdlcGFzc3RlIEthdGVnb3JpZW46DQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIFRhc2tzIFBhZ2UNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uTmFtZT1BdWZnYWJlbg0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25EZXNjcmlwdGlvbj1EaWVzZXMgQXJiZWl0c2VyZ2VibmlzIGlzdCBlaW5lIEVpbmdhYmUgb2RlciBBdXNnYWJlIGZcdTAwZmNyIGRpZSBmb2xnZW5kZW4gQXVmZ2FiZW4uDQotV29ya1Byb2R1Y3RfVGFza3NfQXZhaWxhYmxlTGFiZWw9VmVyZlx1MDBmY2diYXJlIEF1ZmdhYmVuDQotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbD1WZXJiaW5kbGljaGUgRWluZ2FiZToNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMj1PcHRpb25hbGUgRWluZ2FiZToNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMz1BdXNnYWJlOg0KLVdvcmtQcm9kdWN0X1Rhc2tzX011bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249RXMgd3VyZGVuIHswfSBBdWZnYWJlbiBhdXNnZXdcdTAwZTRobHQuDQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIFJvbGVzIFBhZ2UNCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uTmFtZT1Sb2xsZW4NCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249RGllIGZvbGdlbmRlbiBSb2xsZW4gc2luZCBmXHUwMGZjciBkaWVzZXMgQXJiZWl0c2VyZ2VibmlzIHZlcmFudHdvcnRsaWNoIGJ6dy4gXHUwMGU0bmRlcm4gZXMuDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9VmVyZlx1MDBmY2diYXJlIFJvbGxlbg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9VmVyYW50d29ydGxpY2hlIFJvbGxlOg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1MDBjNG5kZXJuZGUgUm9sbGVuOg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249RXMgd3VyZGVuIHswfSBSb2xsZW4gYXVzZ2V3XHUwMGU0aGx0Lg0KLQ0KLSMjIFdvcmsgUHJvZHVjdCBFZGl0b3IgRGVsaXZlcmFibGUgUGFydHMgUGFnZQ0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbk5hbWU9VGVpbGUgZGVzIExpZWZlcmdlZ2Vuc3RhbmRzDQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QXJiZWl0c2VyZ2Vibmlzc2UgYW5nZWJlbiwgYXVzIGRlbmVuIHNpY2ggZGllc2VyIExpZWZlcmdlZ2Vuc3RhbmQgenVzYW1tZW5zZXR6dC4NCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX2F2YWlsYWJsZUxhYmVsPVZlcmZcdTAwZmNnYmFyZSBBcmJlaXRzZXJnZWJuaXNzZSBhbHMgVGVpbGUgZGVzIExpZWZlcmdlZ2Vuc3RhbmRzOg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1BcmJlaXRzZXJnZWJuaXNzZSBhbHMgVGVpbGUgZGVzIExpZWZlcmdlZ2Vuc3RhbmRzOg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1FcyB3dXJkZW4gezB9IEFyYmVpdHNlcmdlYm5pc3NlIGF1c2dld1x1MDBlNGhsdC4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPUFubGVpdHVuZw0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1MaW5rcyB6dSB3ZWl0ZXJlbiBJbmZvcm1hdGlvbmVuIGluIEZvcm0gdm9uIEFubGVpdHVuZ2VuIGFuZ2ViZW4uDQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9VmVyZlx1MDBmY2diYXJlIEFubGVpdHVuZzoNCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsPUFubGVpdHVuZzoNCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPUVzIHd1cmRlbiB7MH0gQW5sZWl0dW5nZW4gYXVzZ2V3XHUwMGU0aGx0Lg0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPUthdGVnb3JpZW4NCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1EaWUgS2F0ZWdvcmllbiB2ZXJ3YWx0ZW4sIHp1IGRlbmVuIGRpZXNlcyBBcmJlaXRzZXJnZWJuaXMgZ2VoXHUwMGY2cnQuDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1Eb21cdTAwZTRuZW4NCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1BcnRlbiBBcmJlaXRzZXJnZWJuaXNzZW46DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDM9QW5nZXBhc3N0ZSBLYXRlZ29yaWVuOg0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Eb21cdTAwZTRuZToNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPUFydGVuIHZvbiBBcmJlaXRzZXJnZWJuaXNzZW46DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMz1BbmdlcGFzc3RlIEthdGVnb3JpZW46DQotDQotIyBQcmFjdGljZSBFZGl0b3IgUmVmZXJlbmNlcyBQYWdlDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uTmFtZT1JbmhhbHRzZWxlbWVudGUNCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1JbmhhbHRzZWxlbWVudGUgYW5nZWJlbiwgYXVmIGRpZSBkaWVzZXMgVmVyZmFocmVuIHZlcndlaXN0Lg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9VmVyZlx1MDBmY2diYXJlIEluaGFsdHNlbGVtZW50ZToNCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw9SW5oYWx0c2VsZW1lbnRlOg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1FcyB3dXJkZW4gezB9IEluaGFsdHNlbGVtZW50ZSBhdXNnZXdcdTAwZTRobHQuDQotDQotIyBDYXRlZ29yeSBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uTmFtZT1BbmxlaXR1bmcNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUFubGVpdHVuZyBmXHUwMGZjciB7MH0gdmVyd2FsdGVuLg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9hdmFpbGFibGVMYWJlbD1WZXJmXHUwMGZjZ2JhcmUgQW5sZWl0dW5nOg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsPUFubGVpdHVuZzoNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1FcyB3dXJkZW4gezB9IEFubGVpdHVuZ2VuIGF1c2dld1x1MDBlNGhsdC4NCi0NCi0jIERpc2NpcGxpbmUgR3JvdXBpbmcgRWRpdG9yIERpc2NpcGxpbmVzIFBhZ2UNCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbk5hbWU9RGlzemlwbGluZW4NCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPURpc3ppcGxpbmVuIHZlcndhbHRlbiwgZGllIHp1IGRpZXNlciBEaXN6aXBsaW5ncnVwcGllcnVuZyBnZWhcdTAwZjZyZW4uDQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVZlcmZcdTAwZmNnYmFyZSBEaXN6aXBsaW5lbjoNCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1EaXN6aXBsaW5lbjoNCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1FcyB3dXJkZW4gezB9IERpc3ppcGxpbmVuIGF1c2dld1x1MDBlNGhsdC4NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX1VzZURlZmF1bHREaXJlY3RvcnlCdXR0b25MYWJlbD1TdGFuZGFyZHZlcnplaWNobmlzIHZlcndlbmRlbg0KLQ0KLSMgRGlzY2lwbGluZSBFZGl0b3IgVGFza3MgUGFnZQ0KLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbk5hbWU9QXVmZ2FiZW4NCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1BdWZnYWJlbiB2ZXJ3YWx0ZW4sIGRpZSB6dSBkaWVzZXIgRGlzemlwbGluIGdlaFx1MDBmNnJlbi4NCi1kaXNjaXBsaW5lVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPVZlcmZcdTAwZmNnYmFyZSBBdWZnYWJlbjoNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw9QXVmZ2FiZW46DQotZGlzY2lwbGluZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPUVzIHd1cmRlbiB7MH0gQXVmZ2FiZW4gYXVzZ2V3XHUwMGU0aGx0Lg0KLQ0KLSMgRGlzY2lwbGluZSBFZGl0b3IgUmVmZXJlbmNlIFdvcmtmbG93IFBhZ2UNCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25OYW1lPVJlZmVyZW56d29ya2Zsb3dzDQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uRGVzY3JpcHRpb249UmVmZXJlbnp3b3JrZmxvd3MgdmVyd2FsdGVuLCBkaWUgenUgZGllc2VyIERpc3ppcGxpbiBnZWhcdTAwZjZyZW4uDQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9hdmFpbGFibGVMYWJlbD1WZXJmXHUwMGZjZ2JhcmUgUmVmZXJlbnp3b3JrZmxvd3M6DQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWxlY3RlZExhYmVsPVJlZmVyZW56d29ya2Zsb3dzOg0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1FcyB3dXJkZW4gezB9IFJlZmVyZW56d29ya2Zsb3dzIGF1c2dld1x1MDBlNGhsdC4NCi0NCi0jIERvbWFpbiBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1BcmJlaXRzZXJnZWJuaXNzZQ0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUFyYmVpdHNlcmdlYm5pc3NlIHZlcndhbHRlbiwgZGllIHp1IGRpZXNlciBEb21cdTAwZTRuZSBnZWhcdTAwZjZyZW4uDQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1WZXJmXHUwMGZjZ2JhcmUgQXJiZWl0c2VyZ2Vibmlzc2U6DQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPUFyYmVpdHNlcmdlYm5pc3NlOg0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1FcyB3dXJkZW4gezB9IEFyYmVpdHNlcmdlYm5pc3NlIGF1c2dld1x1MDBlNGhsdC4NCi0NCi0jIFdvcmsgUHJvZHVjdCBLaW5kIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPUFyYmVpdHNlcmdlYm5pc3NlDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QXJiZWl0c2VyZ2Vibmlzc2UgdmVyd2FsdGVuLCBkaWUgenUgZGllc2VyIEFydCB2b24gQXJiZWl0c2VyZ2Vibmlzc2VuIGdlaFx1MDBmNnJlbi4NCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVZlcmZcdTAwZmNnYmFyZSBBcmJlaXRzZXJnZWJuaXNzZToNCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9QXJiZWl0c2VyZ2Vibmlzc2U6DQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPUVzIHd1cmRlbiB7MH0gQXJiZWl0c2VyZ2Vibmlzc2UgYXVzZ2V3XHUwMGU0aGx0Lg0KLQ0KLSMgUm9sZSBTZXQgR3JvdXBpbmcgRWRpdG9yIFJvbGUgU2V0cyBQYWdlDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25OYW1lPVJvbGxlbmdydXBwZW4NCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVJvbGxlbmdydXBwZW4gdmVyd2FsdGVuLCBkaWUgenUgZGllc2VyIEdydXBwaWVydW5nIHZvbiBSb2xsZW5ncnVwcGVuIGdlaFx1MDBmNnJlbi4NCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9VmVyZlx1MDBmY2diYXJlIFJvbGxlbmdydXBwZW46DQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw9Um9sbGVuZ3J1cHBlbjoNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1FcyB3dXJkZW4gezB9IFJvbGxlbmdydXBwZW4gYXVzZ2V3XHUwMGU0aGx0Lg0KLQ0KLSMgUm9sZSBTZXQgRWRpdG9yIFJvbGVzIFBhZ2UNCi1yb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25OYW1lPVJvbGxlbg0KLXJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVJvbGxlbiB2ZXJ3YWx0ZW4sIGRpZSB6dSBkaWVzZXIgUm9sbGVuZ3J1cHBlIGdlaFx1MDBmNnJlbi4NCi1yb2xlU2V0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVZlcmZcdTAwZmNnYmFyZSBSb2xsZW46DQotcm9sZVNldFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVJvbGxlbjoNCi1yb2xlU2V0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249RXMgd3VyZGVuIHswfSBSb2xsZW4gYXVzZ2V3XHUwMGU0aGx0Lg0KLQ0KLSMgVG9vbCBFZGl0b3IgVG9vbCBNZW50b3JzIFBhZ2UNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25OYW1lPVRvb2xtZW50b3Jlbg0KLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVRvb2xtZW50b3JlbiB2ZXJ3YWx0ZW4sIGRpZSB6dSBkaWVzZW0gVG9vbCBnZWhcdTAwZjZyZW4uDQotdG9vbFRvb2xNZW50b3JzUGFnZV9hdmFpbGFibGVMYWJlbD1WZXJmXHUwMGZjZ2JhcmUgVG9vbG1lbnRvcmVuOg0KLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Ub29sbWVudG9yZW46DQotdG9vbFRvb2xNZW50b3JzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPUVzIHd1cmRlbiB7MH0gVG9vbG1lbnRvcmVuIGF1c2dld1x1MDBlNGhsdC4NCi0NCi0jIEN1c3RvbSBDYXRlZ29yeSBFZGl0b3IgQXNzaWduIFBhZ2UNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbk5hbWU9SW5oYWx0c2VsZW1lbnRlDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1JbmhhbHRzZWxlbWVudGUgdmVyd2FsdGVuLCBhdXMgZGVuZW4gc2ljaCBkaWVzZSBhbmdlcGFzc3RlIEthdGVnb3JpZSB6dXNhbW1lbnNldHp0Lg0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9hdmFpbGFibGVMYWJlbD1WZXJmXHUwMGZjZ2JhcmUgSW5oYWx0c2VsZW1lbnRlOg0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWxlY3RlZExhYmVsPUluaGFsdHNlbGVtZW50ZToNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1FcyB3dXJkZW4gezB9IEluaGFsdHNlbGVtZW50ZSBhdXNnZXdcdTAwZTRobHQuDQotDQotIyBOZXcgTWV0aG9kIFBsdWctaW4gV2l6YXJkDQotbmV3UGx1Z2luV2l6YXJkX3RpdGxlPU5ldWVzIE1ldGhvZGVuLVBsdWctaW4NCi1uZXdQbHVnaW5XaXphcmRQYWdlX3RpdGxlPU5ldWVzIE1ldGhvZGVuLVBsdWctaW4gZXJzdGVsbGVuDQotbmV3UGx1Z2luV2l6YXJkUGFnZV90ZXh0PUdlYmVuIFNpZSBlaW5lbiBOYW1lbiB1bmQgYWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIGZcdTAwZmNyIGRhcyBuZXVlIE1ldGhvZGVuLVBsdWctaW4gYW4uDQotbmV3UGx1Z2luRXJyb3JfbXNnPUlVUEEwMDIxRTogRGFzIE1ldGhvZGVuLVBsdWctaW4ga29ubnRlIG5pY2h0IGVyc3RlbGx0IHdlcmRlbi4NCi1uZXdQbHVnaW5FcnJvcl9yZWFzb249SW50ZXJuZXIgRmVobGVyLlxuXA0KLVxuXA0KLUtsaWNrZW4gU2llIGF1ZiBEZXRhaWxzLCB1bSB3ZWl0ZXJlIEluZm9ybWF0aW9uZW4genUgZXJoYWx0ZW4uDQotDQotIyBHZW5lcmljIGRpYWxvZyB0aXRsZXMNCi1jcmVhdGVEaWFsb2dfdGl0bGU9RWxlbWVudCBlcnN0ZWxsZW4NCi1kZWxldGVEaWFsb2dfdGl0bGU9RWxlbWVudCBsXHUwMGY2c2NoZW4NCi1lZGl0RGlhbG9nX3RpdGxlPUVsZW1lbnQgYmVhcmJlaXRlbg0KLWVycm9yRGlhbG9nX3RpdGxlPUZlaGxlcg0KLW1vdmVEaWFsb2dfdGl0bGU9RWxlbWVudCB2ZXJzY2hpZWJlbg0KLXJlbmFtZURpYWxvZ190aXRsZT1FbGVtZW50IHVtYmVuZW5uZW4NCi13YXJuaW5nRGlhbG9nX3RpdGxlPVdhcm51bmcNCi0NCi0jIEFkZCBDb25maWd1cmF0aW9uIHRvIFByb2Nlc3MgRXJyb3IgRGlhbG9nDQotYWRkQ29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9S29uZmlndXJhdGlvbiB6dW0gUHJvemVzcyBoaW56dWZcdTAwZmNnZW4NCi0NCi0jIFNldCBEZWZhdWx0IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotc2V0RGVmYXVsdENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPVN0YW5kYXJka29uZmlndXJhdGlvbiBmXHUwMGZjciBQcm96ZXNzIGZlc3RsZWdlbg0KLQ0KLSMgRWRpdCBQcm9jZXNzIEVycm9yIERpYWxvZw0KLWVkaXRQcm9jZXNzRWxlbWVudEVycm9yRGlhbG9nX3RpdGxlPVByb3plc3NlbGVtZW50IGJlYXJiZWl0ZW4NCi0NCi0jIE9wZW4gTGlicmFyeSBEaWFsb2cNCi1vcGVuTGlicmFyeURpYWxvZ190aXRsZT1NZXRob2RlbmJpYmxpb3RoZWsgXHUwMGY2ZmZuZW4NCi1vcGVuTGlicmFyeURpYWxvZ190ZXh0PURpZSBha3R1ZWxsZSBNZXRob2RlbmJpYmxpb3RoZWsgd3VyZGUgbmljaHQgb3JkbnVuZ3NnZW1cdTAwZTRcdTAwZGYgZ2VzcGVpY2hlcnQuIERlbiBGZWhsZXIgaWdub3JpZXJlbiB1bmQgZWluZSBhbmRlcmUgQmlibGlvdGhlayBcdTAwZjZmZm5lbj8NCi0NCi0jIFNhdmUgTGlicmFyeSBEaWFsb2cNCi1zYXZlTGlicmFyeURpYWxvZ190aXRsZT1NZXRob2RlbmJpYmxpb3RoZWsgc3BlaWNoZXJuDQotc2F2ZUxpYnJhcnlEaWFsb2dfdGV4dD1EaWUgYWt0dWVsbGUgTWV0aG9kZW5iaWJsaW90aGVrIHd1cmRlIGdlXHUwMGU0bmRlcnQuIFx1MDBjNG5kZXJ1bmdlbiBzcGVpY2hlcm4/DQotDQotIyBVcGdyYWRlIExpYnJhcnkgRGlhbG9nDQotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGl0bGU9VXBncmFkZSBkZXIgTWV0aG9kZW5iaWJsaW90aGVrIGR1cmNoZlx1MDBmY2hyZW4NCi0NCi0jIERlbGV0ZSBFbGVtZW50IFJlZmVyZW5jZSBEaWFsb2cNCi1kZWxldGVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PURhcyBFbGVtZW50ICcnezB9Jycgd3VyZGUgYmVyZWl0cyBnZWxcdTAwZjZzY2h0LiBFbGVtZW50IGF1cyAnJ3sxfScnIGVudGZlcm5lbj8NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbm9PcGVuTGlicmFyeUVycm9yX21zZz1JVVBBMDAwMEU6IEVzIGlzdCBrZWluZSBNZXRob2RlbmJpYmxpb3RoZWsgZ2VcdTAwZjZmZm5ldC5cblwNCi1cblwNCi1FcyBtdXNzIGVpbmUgTWV0aG9kZW5iaWJsaW90aGVrIGdlXHUwMGY2ZmZuZXQgc2VpbiwgZGFtaXQgZWluIG5ldWVzIE1ldGhvZGVuZWxlbWVudCBoaW56dWdlZlx1MDBmY2d0IHdlcmRlbiBrYW5uLiBcblwNCi1cblwNCi1FcnN0ZWxsZW4gU2llIGVpbmUgbmV1ZSBNZXRob2RlbmJpYmxpb3RoZWsgb2RlciBcdTAwZjZmZm5lbiBTaWUgZWluZSB2b3JoYW5kZW5lIHVuZCB3aWVkZXJob2xlbiBTaWUgYW5zY2hsaWVcdTAwZGZlbmQgZGVuIFZvcmdhbmcuDQotZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZz1JVVBBMDAwMUU6IERlciBOYW1lIGZcdTAwZmNyIHswfSBmZWhsdC5cblwNCi1cblwNCi1BbGxlIE1ldGhvZGVuLSB1bmQgUHJvemVzc2VsZW1lbnRlIG1cdTAwZmNzc2VuIGVpbmVuIE5hbWVuIGhhYmVuLlxuXA0KLVxuXA0KLUtsaWNrZW4gU2llIGF1ZiBPSyB1bmQgZ2ViZW4gU2llIGVpbmVuIGdcdTAwZmNsdGlnZW4gTmFtZW4gZlx1MDBmY3IgZGFzIEVsZW1lbnQgZWluLg0KLWR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEEwMDAyRTogRGVyIE5hbWUgJyd7MH0nJyBpc3QgYmVyZWl0cyB2b3JoYW5kZW4uXG5cDQotXG5cDQotRWluIE1ldGhvZGVuZWxlbWVudCBtdXNzIGVpbmVuIGVpbmRldXRpZ2VuIE5hbWVuIGhhYmVuLlxuXA0KLVxuXA0KLUtsaWNrZW4gU2llIGF1ZiBPSyB1bmQgZ2ViZW4gU2llIGVpbmVuIGFuZGVyZW4gTmFtZW4gZlx1MDBmY3IgZGFzIEVsZW1lbnQgZWluLg0KLWNyZWF0ZUNvbmZpZ0Vycm9yX21zZz1JVVBBMDAwM0U6IERpZSBNZXRob2RlbmtvbmZpZ3VyYXRpb24ga2FubiBuaWNodCBlcnN0ZWxsdCB3ZXJkZW4uDQotZGVsZXRlQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDA0VzogRGllIE1ldGhvZGVua29uZmlndXJhdGlvbiBrYW5uIG5pY2h0IGdlbFx1MDBmNnNjaHQgd2VyZGVuLg0KLWludGVybmFsRXJyb3JfbXNnPUlVUEEwMDA1RTogRXMgaXN0IGVpbiBpbnRlcm5lciBGZWhsZXIgYXVmZ2V0cmV0ZW4uXG5cDQotXG5cDQotS2xpY2tlbiBTaWUgYXVmIERldGFpbHMsIHVtIHdlaXRlcmUgSW5mb3JtYXRpb25lbiB6dSBlcmhhbHRlbi4NCi1pbnZhbGlkUHJlc2VudGF0aW9uTmFtZUVycm9yX21zZz1JVVBBMDAwNkU6IERlciBhbmdlZ2ViZW5lIFByXHUwMGU0c2VudGF0aW9uc25hbWUgaXN0IHVuZ1x1MDBmY2x0aWcuXG5cDQotXG5cDQotS2xpY2tlbiBTaWUgYXVmIE9LIHVuZCBnZWJlbiBTaWUgZWluZW4gYW5kZXJlbiBOYW1lbiBlaW4uDQotaW52YWxpZENvbmZpZ0Vycm9yX21zZz1JVVBBMDAwN0U6IERpZSBhdXNnZXdcdTAwZTRobHRlIE1ldGhvZGVua29uZmlndXJhdGlvbiAnJ3swfScnIGlzdCBrZWluIFN1YnNldCBkZXIgU3RhbmRhcmRrb25maWd1cmF0aW9uIGRlcyBQcm96ZXNzZXMuXG5cDQotXG5cDQotVW0gZGllIEludGVncml0XHUwMGU0dCBlaW5lcyBQcm96ZXNzZXMgenUgd2FocmVuLCBtdXNzIGRpZSBTdGFuZGFyZGtvbmZpZ3VyYXRpb24gZGVzIFByb3plc3NlcyBlaW4gU3VwZXJzZXQgYWxsZXIgYW5kZXJlbiBLb25maWd1cmF0aW9uZW4gc2VpbiwgZGllIGRpZXNlbSBQcm96ZXNzIHp1Z2VvcmRuZXQgc2luZC5cblwNCi1cblwNCi1XXHUwMGU0aGxlbiBTaWUgZWluZSBhbmRlcmUgS29uZmlndXJhdGlvbiBhdXMgb2RlciBcdTAwZTRuZGVybiBTaWUgZGllIFN0YW5kYXJka29uZmlndXJhdGlvbiwgdW0gZGVuIEluaGFsdCBkZXIgYXVzZ2V3XHUwMGU0aGx0ZW4gS29uZmlndXJhdGlvbiBlaW56dWZcdTAwZmNnZW4sIHVuZCB3aWVkZXJob2xlbiBTaWUgYW5zY2hsaWVcdTAwZGZlbmQgZGVuIFZvcmdhbmcuDQotc2V0RGVmYXVsdENvbmZpZ0Vycm9yX21zZz1JVVBBMDAwOEU6IERpZSBhdXNnZXdcdTAwZTRobHRlIE1ldGhvZGVua29uZmlndXJhdGlvbiAnJ3swfScnIGlzdCBrZWluIFN1cGVyc2V0IGRlciBhbmRlcmVuIEtvbmZpZ3VyYXRpb24sIGF1ZiBkaWUgZGVyIFByb3plc3MgdmVyd2Vpc3QuXG5cDQotXG5cDQotVW0gZGllIEludGVncml0XHUwMGU0dCBlaW5lcyBQcm96ZXNzZXMgenUgd2FocmVuLCBtdXNzIGRpZSBTdGFuZGFyZGtvbmZpZ3VyYXRpb24gZGVzIFByb3plc3NlcyBlaW4gU3VwZXJzZXQgYWxsZXIgYW5kZXJlbiBLb25maWd1cmF0aW9uZW4gc2VpbiwgZGllIGRpZXNlbSBQcm96ZXNzIHp1Z2VvcmRuZXQgc2luZC5cblwNCi1cblwNCi1XXHUwMGU0aGxlbiBTaWUgZWluZSBhbmRlcmUgS29uZmlndXJhdGlvbiBhdXMgb2RlciBcdTAwZTRuZGVybiBTaWUgZGVuIEluaGFsdCBkZXIgYXVzZ2V3XHUwMGU0aGx0ZW4gS29uZmlndXJhdGlvbiB1bmQgd2llZGVyaG9sZW4gU2llIGFuc2NobGllXHUwMGRmZW5kIGRlbiBWb3JnYW5nLg0KLW9wZW5MaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDA5RTogRGllIE1ldGhvZGVuYmlibGlvdGhlayBrYW5uIG5pY2h0IGdlbGFkZW4gd2VyZGVuLlxuXA0KLVxuXA0KLUtsaWNrZW4gU2llIGF1ZiBEZXRhaWxzLCB1bSB3ZWl0ZXJlIEluZm9ybWF0aW9uZW4genUgZXJoYWx0ZW4uDQotc2F2ZUxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTBFOiBEaWUgTWV0aG9kZW5iaWJsaW90aGVrIGthbm4gbmljaHQgZ2VzcGVpY2hlcnQgd2VyZGVuLg0KLXNhdmVMaWJyYXJ5VG9FcnJvcl9tc2c9SVVQQTAwMTBFOiBEaWUgTWV0aG9kZW5iaWJsaW90aGVrIGthbm4gbmljaHQgaW4gJyd7MH0nJyBnZXNwZWljaGVydCB3ZXJkZW4uDQotZWxlbWVudEFscmVhZHlEZWxldGVkRXJyb3JfbXNnPUlVUEEwMDExRTogRGFzIEVsZW1lbnQgJyd7MH0nJyB3dXJkZSBiZXJlaXRzIGdlbFx1MDBmNnNjaHQuDQotdXBncmFkZUxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTJFOiBEaWUgTWV0aG9kZW5iaWJsaW90aGVrIGthbm4gbmljaHQgYWt0dWFsaXNpZXJ0IHdlcmRlbi4NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249SVVQQTAwMTZFOiBFcyBpc3QgZWluIEZlaGxlciBhdWZnZXRyZXRlbi5cblwNCi1cblwNCi1LbGlja2VuIFNpZSBhdWYgRGV0YWlscywgdW0gd2VpdGVyZSBJbmZvcm1hdGlvbmVuIHp1IGVyaGFsdGVuLg0KLWludGVybmFsRXJyb3JfcmVhc29uPUlVUEEwMDE3RTogRXMgaXN0IGVpbiBpbnRlcm5lciBGZWhsZXIgYXVmZ2V0cmV0ZW4uXG5cDQotXG5cDQotS2xpY2tlbiBTaWUgYXVmIERldGFpbHMsIHVtIHdlaXRlcmUgSW5mb3JtYXRpb25lbiB6dSBlcmhhbHRlbi4NCi11cGdyYWRlTGlicmFyeUVycm9yX3JlYXNvbj1JVVBBMDAxOEU6IEJlaW0gTGFkZW4gZGVyIEVsZW1lbnRlIGZcdTAwZmNyIGRpZSBNZXRob2RlbmJpYmxpb3RoZWsgaXN0IGVpbiBGZWhsZXIgYXVmZ2V0cmV0ZW4uXG5cDQotXG5cDQotS2xpY2tlbiBTaWUgYXVmIERldGFpbHMsIHVtIHdlaXRlcmUgSW5mb3JtYXRpb25lbiB6dSBlcmhhbHRlbi4NCi1zYXZlVXBncmFkZWRMaWJyYXJ5RXJyb3JfcmVhc29uPUlVUEEwMDE5RTogQmVpbSBTcGVpY2hlcm4gZGVyIGFrdHVhbGlzaWVydGVuIE1ldGhvZGVuYmlibGlvdGhlayBpc3QgZWluIEZlaGxlciBhdWZnZXRyZXRlbi5cblwNCi1cblwNCi1LbGlja2VuIFNpZSBhdWYgRGV0YWlscywgdW0gd2VpdGVyZSBJbmZvcm1hdGlvbmVuIHp1IGVyaGFsdGVuLg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1vcGVuaW5nTGlicmFyeVRhc2tfbmFtZT1NZXRob2RlbmJpYmxpb3RoZWsgd2lyZCBnZVx1MDBmNmZmbmV0Li4uDQotc2F2aW5nTGlicmFyeVRhc2tfbmFtZT1NZXRob2RlbmJpYmxpb3RoZWsgd2lyZCBnZXNwZWljaGVydC4uLg0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9VXBncmFkZSBmXHUwMGZjciBNZXRob2RlbmJpYmxpb3RoZWsgd2lyZCBkdXJjaGdlZlx1MDBmY2hydC4uLg0KLWxvYWRpbmdMaWJyYXJ5RWxlbWVudHNUYXNrX25hbWU9RWxlbWVudGUgZlx1MDBmY3IgTWV0aG9kZW5iaWJsaW90aGVrIHdlcmRlbiBnZWxhZGVuLi4uDQotc2F2aW5nVXBncmFkZWRFbGVtZW50c1Rhc2tfbmFtZT1FbGVtZW50ZSBmXHUwMGZjciBNZXRob2RlbmJpYmxpb3RoZWsgd2VyZGVuIGluIG5ldWVtIERhdGVpZm9ybWF0IGdlc3BlaWNoZXJ0Li4uDQotc2F2aW5nVGFza19uYW1lPScnezB9Jycgd2lyZCBnZXNwZWljaGVydC4uLg0KLXNhdmluZ0ZpbGVzVGFza19uYW1lPURhdGVpZW4gd2VyZGVuIGdlc3BlaWNoZXJ0Li4uDQotZml4aW5nQ29udGVudERlc2NyaXB0aW9uR1VJRHNUYXNrX25hbWU9R1VJRHMgZlx1MDBmY3IgSW5oYWx0c2Jlc2NocmVpYnVuZyB3ZXJkZW4ga29ycmlnaWVydC4uLg0KLWRlbGV0aW5nSW52YWxpZFJlZmVyZW5jZXNUYXNrX25hbWU9VW5nXHUwMGZjbHRpZ2UgUmVmZXJlbnplbiB3ZXJkZW4gZ2VsXHUwMGY2c2NodC4uLg0KLQ0KLQ0KLSMgQWRkIEVkaXRvciBUbyBCcm93c2luZyBQZXJzcGVjdGl2ZSBXYXJuaW5nIERpYWxvZw0KLWFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZz1JVVBBMDA0Nlc6IERpZXNlIFBlcnNwZWt0aXZlIGlzdCBzcGV6aWVsbCBkYWZcdTAwZmNyIGVudHdpY2tlbHQgd29yZGVuLCBkYXNzIHNpY2ggZGVyIEJlbnV0emVyIG1pdCBkZXIgQW56ZWlnZSB2b24gSFRNTC1EYXJzdGVsbHVuZ2VuIGRlciBNZXRob2RlbmJpYmxpb3RoZWtzZWxlbWVudGUgdmVydHJhdXQgbWFjaGVuIGthbm4uIEVzIGthbm4ga2VpbiBFZGl0b3IgaGluenVnZWZcdTAwZmNndCBvZGVyIGFuZ2V6ZWlndCB3ZXJkZW4uDQotDQotIyBDaGFuZ2UgSGlzdG9yeSBEaWFsb2cNCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX3RpdGxlPUhpc3RvcmllIGRlciBcdTAwYzRuZGVydW5nc2Jlc2NocmVpYnVuZw0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfbGFiZWw9XHUwMGM0bmRlcnVuZ3NoaXN0b3JpZToNCi0NCi0jIE1ldGhvZCBFbGVtZW50IERlbGV0ZSBBY3Rpb24NCi1jb25maXJtRGVsZXRlRGlhbG9nX3RpdGxlPUxcdTAwZjZzY2hlbiBiZXN0XHUwMGU0dGlnZW4NCi1jb25maXJtRGVsZXRlRGlhbG9nX21zZz0nJ3swfScnIHdpcmtsaWNoIGxcdTAwZjZzY2hlbj8NCi1jb25maXJtRGVsZXRlRGlhbG9nX21zZ1dpdGhSZWZlcmVuY2U9Jyd7MH0nJyB3aXJrbGljaCBsXHUwMGY2c2NoZW4/XG5cDQotXG5cDQotRGllIGZvbGdlbmRlbiBFbGVtZW50ZSBlbnRoYWx0ZW4gUmVmZXJlbnplbiBhdWYgZGllIHp1IGxcdTAwZjZzY2hlbmRlbiBFaW50clx1MDBlNGdlOiB7MX0NCi0NCi0jIE5ldyBMaWJyYXJ5IERpYWxvZw0KLWVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjJFOiBEaWUgTWV0aG9kZW5iaWJsaW90aGVrICcnezB9Jycga2FubiBuaWNodCBlcnN0ZWxsdCB3ZXJkZW4uDQotZXJyb3JEaWFsb2dfZXJyb3I9RXMgaXN0IG5pY2h0IG1cdTAwZjZnbGljaCwgZWluZSBNZXRob2RlbmJpYmxpb3RoZWsgaW4gZWluZXIgYW5kZXJlbiBNZXRob2RlbmJpYmxpb3RoZWsgenUgZXJzdGVsbGVuLg0KLWVycl9ub29wZW5saWJyYXJ5PUlVUEEwMDQwRTogRXMgaXN0IGtlaW5lIE1ldGhvZGVuYmlibGlvdGhlayBnZVx1MDBmNmZmbmV0LlxuXA0KLVxuXA0KLUVzIG11c3MgZWluZSBNZXRob2RlbmJpYmxpb3RoZWsgZ2VcdTAwZjZmZm5ldCBzZWluLCBkYW1pdCBlaW4gbmV1ZXMgTWV0aG9kZW4tUGx1Zy1pbiBoaW56dWdlZlx1MDBmY2d0IHdlcmRlbiBrYW5uLiBcblwNCi1cblwNCi1FcnN0ZWxsZW4gU2llIGVpbmUgbmV1ZSBNZXRob2RlbmJpYmxpb3RoZWsgb2RlciBcdTAwZjZmZm5lbiBTaWUgZWluZSB2b3JoYW5kZW5lIHVuZCB3aWVkZXJob2xlbiBTaWUgYW5zY2hsaWVcdTAwZGZlbmQgZGVuIFZvcmdhbmcuDQotZXJyX2xvYWRpbmdsaWJyYXJ5PUZlaGxlciBiZWltIExhZGVuIGRlciBCaWJsaW90aGVrDQotbXNnX3JlbG9hZExpYnJhcnk9RmVobGVyIGJlaW0gUlx1MDBmY2NrZ1x1MDBlNG5naWdtYWNoZW4gZGVyIGZlaGxnZXNjaGxhZ2VuZW4gTFx1MDBmNnNjaG9wZXJhdGlvbi4gRGllIGFrdHVlbGxlIE1ldGhvZGVuYmlibGlvdGhlayBtdXNzIGVybmV1dCBnZWxhZGVuIHdlcmRlbi4NCi0NCi0jIFJlbG9hZCBMaWJyYXJ5IERpYWxvZw0KLXJlbG9hZERpYWxvZ19tZXNzYWdlPURpZSBCaWJsaW90aGVrIG11c3MgZXJuZXV0IGdlbGFkZW4gd2VyZGVuLCB1bSBkZW4gdXJzcHJcdTAwZmNuZ2xpY2hlbiBadXN0YW5kIHdpZWRlcmhlcnp1c3RlbGxlbi4NCi1yZWxvYWREaWFsb2dfdGl0bGU9QmlibGlvdGhlayBlcm5ldXQgbGFkZW4NCi1kaWFsb2dzX01vdmVEaWFsb2dfZXJyb3JUaXRsZT1GZWhsZXIgYmVpbSBWZXJzY2hpZWJlbg0KLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvck1lc3NhZ2U9QmVpbSBWZXJzY2hpZWJlbiBpc3QgZWluIEZlaGxlciBhdWZnZXRyZXRlbi4NCi0NCi0jIFByb2Nlc3MgRm9ybSBFZGl0b3INCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU9U3BlaWNoZXJuDQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UxPURpZXNlIFx1MDBjNG5kZXJ1bmcgd2lya3Qgc2ljaCBhdWYgYWxsZSBEaWFncmFtbWUgaW4gSWhyZW0gUHJvemVzcyBhdXMuIERlciBFZGl0b3Igd2lyZCBuYWNoIGRlciBcdTAwYzRuZGVydW5nIGdlc3BlaWNoZXJ0LiBGb3J0ZmFocmVuPw0KLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMj1EZXIgRWRpdG9yIHdpcmQgbmFjaCBkZXIgXHUwMGM0bmRlcnVuZyBnZXNwZWljaGVydC4gRm9ydGZhaHJlbj8NCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBQYWdlDQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX3RpdGxlPUVudGZlcm5lbiBiZXN0XHUwMGU0dGlnZW4NCi1jb25maWdWaWV3UGFnZVJlbW92ZVZpZXdEaWFsb2dfbWVzc2FnZT1TaWNodCAnJ3swfScnIHdpcmtsaWNoIGVudGZlcm5lbj8NCi1jb25maWdWaWV3UGFnZVZpZXdFeGlzdHNEaWFsb2dfdGl0bGU9V2FybnVuZw0KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb249S29uZmlndXJhdGlvbjoNCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld3M9S29uZmlndXJhdGlvbnNzaWNodGVuDQotY29uZmlnVmlld1BhZ2Vfdmlld3M9U2ljaHRlbg0KLWNvbHVtbnNlbGVjdGlvbl90ZXh0PVNwYWx0ZW5hdXN3YWhsOg0KLWNvbmZpZ1ZpZXdQYWdlX2FkZFZpZXdCdXR0b25UZXh0PVNpY2h0IGhpbnp1Zlx1MDBmY2dlbi4uLg0KLWNvbmZpZ1ZpZXdQYWdlX3JlbW92ZVZpZXdCdXR0b25UZXh0PVNpY2h0IGVudGZlcm5lbg0KLWNvbmZpZ1ZpZXdQYWdlX21ha2VEZWZhdWx0QnV0dG9uVGV4dD1BbHMgU3RhbmRhcmQgZmVzdGxlZ2VuDQotY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNXOiBEaWUgU2ljaHQgbWl0IGRlbSBOYW1lbiAnJ3swfScnIGlzdCBiZXJlaXRzIHZvcmhhbmRlbi4NCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25UaXRsZT1WZXJcdTAwZjZmZmVudGxpY2h0ZSBOYXZpZ2F0aW9uc3NpY2h0ZW4NCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25NZXNzYWdlPUdlYmVuIFNpZSBkaWUgU2ljaHRlbiBhbiwgZGllIGVpbmdlc2NobG9zc2VuIHdlcmRlbiBzb2xsZW4sIHdlbm4gZGllc2UgS29uZmlndXJhdGlvbiB2ZXJcdTAwZjZmZmVudGxpY2h0IHdpcmQuIEtsaWNrZW4gU2llIHp1bSBFcnN0ZWxsZW4gZWluZXIgU2ljaHQgYXVmIFNpY2h0IGhpbnp1Zlx1MDBmY2dlbiwgdW0gZWluZSBTdGFuZGFyZC0gb2RlciBhbmdlcGFzc3RlIEthdGVnb3JpZSBpbiBkZXIgS29uZmlndXJhdGlvbiBhdXN6dXdcdTAwZTRobGVuLiBEaWUgYXVzZ2V3XHUwMGU0aGx0ZSBLYXRlZ29yaWUgc3RlbGx0IGRpZSBTaWNodCBkYXIgdW5kIGRpZSBVbnRlcmthdGVnb3JpZW4gdW5kIEluaGFsdHNlbGVtZW50ZSBkaWUgQmF1bXN0cnVrdHVyZWxlbWVudGUgZGVyIFNpY2h0Lg0KLQ0KLSMgRGVzY3JpcHRpb24gVGFiDQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfdGl0bGU9QW5sZWl0dW5nIGtvbnZlcnRpZXJlbg0KLWRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UxPUlVUEEwMDQwVzogU3BlaWNoZXJuIFNpZSB6dWVyc3QgZGVuIEVkaXRvci4NCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMj1FcyBpc3Qga2VpbmUga29tcGF0aWJsZSBBbmxlaXR1bmcgZlx1MDBmY3IgZGllc2VuIFR5cCB2b3JoYW5kZW4uDQotDQotY2hhbmdlQWN0aXZpdHlUeXBlV2FybmluZ0RpYWxvZ190aXRsZT1Ba3Rpdml0XHUwMGU0dCBrb252ZXJ0aWVyZW4NCi0jIEFzc29jaWF0aW9uIEZvcm0gUGFnZQ0KLUFzc29jaWF0aW9uRm9ybVBhZ2VfQnJpZWZEZXNjcmlwdGlvbkxhYmVsPUt1cnpiZXNjaHJlaWJ1bmcgZGVzIGF1c2dld1x1MDBlNGhsdGVuIEVsZW1lbnRzOg0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgRGVzY3JpcHRpb24NCi1tZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfdGl0bGU9RWxlbWVudG5hbWVuIGVpbmdlYmVuLg0KLW1ldGhvZEVsZW1lbnREZXNjcmlwdGlvbkVtcHR5TmFtZURpYWxvZ19tZXNzYWdlPURhcyBGZWxkIGZcdTAwZmNyIGRlbiBOYW1lbiBkYXJmIG5pY2h0IGxlZXIgc2Vpbi4NCi0NCi0jIE1ldGhvZCBQbHVnLWluIERlc2NyaXB0aW9uDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25SZW1vdmVSZWZDb25maXJtX21lc3NhZ2U9V2VubiBTaWUgZGllIHJlZmVyZW56aWVydGVuIFBsdWctaW5zIGFid1x1MDBlNGhsZW4sIGRpZSBkZW0gUGx1Zy1pbiAnJ3swfScnIHp1Z2VvcmRuZXQgc2luZCwgd2VyZGVuIHVuZ1x1MDBmY2x0aWdlIEJlemllaHVuZ2VuIGVyemV1Z3QsIGRpZSBnZWxcdTAwZjZzY2h0IHdlcmRlbi5cblwNCi1cblwNCi1EaWVzZSBBa3Rpb24ga2FubiBuaWNodCByXHUwMGZjY2tnXHUwMGU0bmdpZyBnZW1hY2h0IHdlcmRlbi4gTWl0IGRlciBcdTAwYzRuZGVydW5nIGZvcnRmYWhyZW4/DQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWU9U2llIHNpbmQgZGFiZWksIGRlbiBOYW1lbiBkaWVzZXMgTWV0aG9kZW4tUGx1Zy1pbiB2b24gJyd7MH0nJyBpbiAnJ3sxfScnIHp1IFx1MDBlNG5kZXJuLiBCZWkgZGllc2VyIEFrdGlvbiB3aXJkIGRlciBFZGl0b3IgZ2VzcGVpY2hlcnQgdW5kIGRlciBQbHVnLWluLU9yZG5lciB1bWJlbmFubnQuIEZvcnRmYWhyZW4/DQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWVfdGl0bGU9TWV0aG9kZW4tUGx1Zy1pbiB1bWJlbmVubmVuDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2Nhbm5vdFJlbmFtZVBsdWdpbkZvbGRlcj1EZXIgUGx1Zy1pbi1PcmRuZXIga29ubnRlIG5pY2h0IHVtYmVuYW5udCB3ZXJkZW4uDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5MYWJlbD1QbHVnLWluIHNwZXJyZW4NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbl9tZXNzYWdlPUJlaW0gU3BlcnJlbiBkZXMgUGx1Zy1pbiB3ZXJkZW4gb2ZmZW5lIEVkaXRvcmVuIG1pdCBFbGVtZW50ZW4sIGRpZSB6dW0gUGx1Zy1pbiAnJ3swfScnIGdlaFx1MDBmNnJlbiwgZ2VzcGVpY2hlcnQgdW5kIGdlc2NobG9zc2VuLiBNaXQgZGVyIFx1MDBjNG5kZXJ1bmcgZm9ydGZhaHJlbj8NCi0NCi0jIFByb2Nlc3MgRGVzY3JpcHRpb24NCi1wcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV90aXRsZT1VbWJlbmVubmVuDQotcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fbWVzc2FnZT1TaWUgc2luZCBkYWJlaSwgZGVuIE5hbWVuIGRlcyBQcm96ZXNzZXMgenUgXHUwMGU0bmRlcm4uIEJlaSBkaWVzZXIgQWt0aW9uIHdpcmQgZGVyIEluaGFsdCBkZXMgRWRpdG9ycyBnZXNwZWljaGVydCB1bmQgZGVyIFByb3plc3NvcmRuZXIgdW1iZW5hbm50LiBGb3J0ZmFocmVuPw0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uRGVzY3JpcHRpb249QmVzY2hyZWlidW5nOg0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uU2VjdGlvblRpdGxlPUtvbmZpZ3VyYXRpb24NCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25NZXNzYWdlPUdlYmVuIFNpZSBhbGxlIGdcdTAwZmNsdGlnZW4gS29uZmlndXJhdGlvbmVuIGZcdTAwZmNyIGRpZXNlbiBQcm96ZXNzIGFuLiBXXHUwMGU0aGxlbiBTaWUgZWluZSBLb25maWd1cmF0aW9uIGFscyBTdGFuZGFyZGtvbmZpZ3VyYXRpb24gYXVzLiBEaWVzZSBtdXNzIGVpbiBTdXBlcnNldCBhbGxlIGFuZGVyZW4gS29uZmlndXJhdGlvbmVuIHNlaW4uDQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25zPUtvbmZpZ3VyYXRpb25lbjoNCi1wcm9jZXNzRGVzY3JpcHRpb25fZGVmYXVsdD0oU3RhbmRhcmQpDQotUHJvY2Vzc0Rlc2NyaXB0aW9uX3NlbGVjdENvbmZpZ3VyYXRpb249SGluenV6dWZcdTAwZmNnZW5kZSBLb25maWd1cmF0aW9uZW4gYXVzd1x1MDBlNGhsZW4NCi1Qcm9jZXNzRGVsZXRlQWN0aW9uX2RlbGV0ZWNvZmlybV90ZXh0MD1NaXQgZGllc2VyIEFrdGlvbiB3aXJkIGRlciBha3R1ZWxsZSBFZGl0b3IgZ2VzcGVpY2hlcnQgdW5kIGRpZSBcdTAwYzRuZGVydW5nIHBlcm1hbmVudCBmZXN0Z2VzY2hyaWViZW4uICcnezB9Jycgd2lya2xpY2ggbFx1MDBmNnNjaGVuPw0KLVByb2Nlc3NEZWxldGVBY3Rpb25fc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZT1EaWUgZm9sZ2VuZGVuIERlc2tyaXB0b3JlbiB3ZXJkZW4gbmFjaCBkZW0gTFx1MDBmNnNjaGVuIGRlciBhdXNnZXdcdTAwZTRobHRlbiBFbGVtZW50ZSBuaXJnZW5kd28gbWVociB2ZXJ3ZW5kZXQuXG5cDQotV1x1MDBlNGhsZW4gU2llIGRpZSB6dSBsXHUwMGY2c2NoZW5kZW4gRGVza3JpcHRvcmVuIGF1cy4NCi0NCi0jIFZpZXcgSGVscGVyDQotdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX3RpdGxlPVN0YXR1c3ByXHUwMGZjZnVuZyBkZXIgQmlibGlvdGhlaw0KLXZpZXdIZWxwZXJfcGVyZm9ybUhlYWx0aENoZWNrPVN0YXR1c3ByXHUwMGZjZnVuZyBkZXIgQmlibGlvdGhlayB3aXJkIGR1cmNoZ2VmXHUwMGZjaHJ0Li4uDQotdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX21lc3NhZ2U9RGllIFN0YXR1c3ByXHUwMGZjZnVuZyBkZXIgZ2VcdTAwZjZmZm5ldGVuIEJpYmxpb3RoZWsgd3VyZGUgb3JkbnVuZ3NnZW1cdTAwZTRcdTAwZGYgZHVyY2hnZWZcdTAwZmNocnQuIFNlaGVuIFNpZSBzaWNoIGRlbiBCZXJpY2h0IGluIGRlciBQcm90b2tvbGxkYXRlaSBhbi4NCi0NCi0jIEF0dGFjaCBUZW1wbGF0ZSBGaWxlIERpYWxvZw0KLWF0dGFjaFRlbXBsYXRlRmlsZURpYWxvZ190aXRsZT1Wb3JsYWdlbmRhdGVpIGFuaFx1MDBlNG5nZW4NCi0NCi0jIENyZWF0ZSBFbGVtZW50IEVycm9yIERpYWxvZw0KLWNyZWF0ZUVsZW1lbnREaWFsb2dfdGl0bGU9ezB9IG5ldSBlcnN0ZWxsZW4NCi1jcmVhdGVOZXdFbGVtZW50RXJyb3JfbXNnPUZlaGxlciBiZWltIEVyc3RlbGxlbiB2b24gezB9Lg0KLQ0KLWRsZ1RpdGxlX3JlbG9hZExpYnJhcnk9QmlibGlvdGhlayBlcm5ldXQgbGFkZW4NCi1jcmVhdGVFbGVtZW50RXJyb3JfcmVhc29uPUVzIG11c3MgZWluIE5hbWUgZlx1MDBmY3IgezB9IGFuZ2VnZWJlbiB3ZXJkZW4uXG5cDQotXG5cDQotR2ViZW4gU2llIGVpbmVuIGdcdTAwZmNsdGlnZW4gTmFtZW4gZWluIHVuZCB3aWVkZXJob2xlbiBTaWUgZGVuIFZvcmdhbmcuDQotZGVsZXRlQ29uZmlnRXJyb3JfcmVhc29uPURpZSBLb25maWd1cmF0aW9uIHdpcmQgdm9tIFByb3plc3MgJyd7MH0nJyByZWZlcmVuemllcnQuDQotIyBDaGFuZ2VCb3VuZHNDb21tYW5kDQotZ2VmX2NoYW5nZUJvdW5kc0NvbW1hbmRfbGFiZWw9QmVncmVuenVuZ2VuIFx1MDBlNG5kZXJuDQotIyBDaGFuZ2VOYW1lQ29tbWFuZA0KLWdlZl9jaGFuZ2VOYW1lQ29tbWFuZF9sYWJlbD1OYW1lbiBcdTAwZTRuZGVybg0KLWdlZl9jaGFuZ2VOYW1lQ29tbWFuZF91bmRvTWVzc2FnZT1EaWUgTmFtZW5zXHUwMGU0bmRlcnVuZyBrYW5uIG5pY2h0IHJcdTAwZmNja2dcdTAwZTRuZ2lnIGdlbWFjaHQgd2VyZGVuLlxuXA0KLVxuXA0KLURhcyBSXHUwMGZjY2tnXHUwMGU0bmdpZ21hY2hlbiBlaW5lciBOYW1lbnNcdTAwZTRuZGVydW5nIGlzdCBuaWNodCB6dWxcdTAwZTRzc2lnLCB3ZW5uIGRlciBOYW1lIHZvcmhlciBuaWNodCBkZWZpbmllcnQgd2FyLg0KLSMgQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQNCi1nZWZfY2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmRfbGFiZWw9RWlnZW5zY2hhZnRzd2VydCBcdTAwZTRuZGVybg0KLSMgQ3JlYXRlQmVuZHBvaW50Q29tbWFuZA0KLWdlZl9jcmVhdGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPVZlcnp3ZWlndW5nc3B1bmt0IGVyc3RlbGxlbg0KLSMgQ3JlYXRlTGlua0NvbW1hbmQNCi1nZWZfY3JlYXRlTGlua0NvbW1hbmRfbGFiZWw9TGluay1FcnN0ZWxsdW5nDQotIyBDcmVhdGVOb2RlQ29tbWFuZA0KLWdlZl9jcmVhdGVOb2RlQ29tbWFuZF9sYWJlbD1OZXVlbiBLbm90ZW4gZXJzdGVsbGVuDQotIyBEZWxldGVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX2RlbGV0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9VmVyendlaWd1bmdzcHVua3QgbFx1MDBmNnNjaGVuDQotIyBEZWxldGVDb21tYW5kDQotZ2VmX2RlbGV0ZUNvbW1hbmRfbGFiZWw9TFx1MDBmNnNjaGVuDQotIyBEZWxldGVMaW5rQ29tbWFuZA0KLWdlZl9kZWxldGVMaW5rQ29tbWFuZF9sYWJlbD1WZXJiaW5kdW5nIGxcdTAwZjZzY2hlbg0KLSMgTW92ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfbW92ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9VmVyendlaWd1bmdzcHVua3QgdmVyc2NoaWViZW4NCi0jIFJlY29ubmVjdExpbmtDb21tYW5kDQotZ2VmX3JlY29ubmVjdExpbmtDb21tYW5kX2xhYmVsPUxpbmsgd2llZGVyaGVyc3RlbGxlbg0KLQ0KLSMgVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyDQotZ2VmX3ZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ9RGVyIE5hbWUgbXVzcyBhbmdlZ2ViZW4gd2VyZGVuLiBHZWJlbiBTaWUgZWluZW4gZ1x1MDBmY2x0aWdlbiBOYW1lbiBhbi4NCi0jIFZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyDQotZ2VmX3ZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdD1EZXIgTmFtZSBtdXNzIGFuZ2VnZWJlbiB3ZXJkZW4uIEdlYmVuIFNpZSBlaW5lbiBnXHUwMGZjbHRpZ2VuIE5hbWVuIGFuLg0KLSMgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQNCi1nZWZfd29ya1Byb2R1Y3ROb2RlRWRpdFBhcnRfdmFsaWRhdGVNZXNzYWdlPURlciBOYW1lIG11c3MgYW5nZWdlYmVuIHdlcmRlbi4gR2ViZW4gU2llIGVpbmVuIGdcdTAwZmNsdGlnZW4gTmFtZW4gYW4uDQotDQotIyBFbGVtZW50c1ZpZXdEZWxldGVBY3Rpb24NCi1hY3Rpb25zX0VsZW1lbnRzVmlld0RlbGV0ZUFjdGlvbl9tZXNzYWdlPURpZSBLb25maWd1cmF0aW9uICcnezB9Jycga2FubiBuaWNodCBnZWxcdTAwZjZzY2h0IHdlcmRlbiwgd2VpbCBzaWUgbm9jaCB2b24gUHJvemVzcyAnJ3sxfScnIHZlcndlbmRldCB3aXJkLg0KLQ0KLSMgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yDQotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JUaXRsZT1GZWhsZXIgYmVpbSBMXHUwMGY2c2NoZW4NCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvck1lc3NhZ2U9TmljaHQgYmVoYW5kZWx0ZSBBdXNuYWhtZQ0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yUmVhc29uPVNlaGVuIFNpZSBzaWNoIGRpZSBEZXRhaWxzIGFuLg0KLQ0KLSMgTWV0aG9kRWxlbWVudEVkaXRvcg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZT1GZWhsZXIgYmVpbSBTcGVpY2hlcm4NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTE9SVVQQTAwMjBFOiBGZWhsZXIgYmVpbSBTcGVpY2hlcm4gZGVyIERhdGVpDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UyPUZlaGxlciBiZWltIEZlc3RzY2hyZWliZW4NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMT1TdWNoZW4gU2llIGluIGRlciBQcm90b2tvbGxkYXRlaSBuYWNoIHdlaXRlcmVuIERldGFpbHMuDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjI9U2VoZW4gU2llIHNpY2ggZGllIERldGFpbHMgYW4uDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yVGl0bGU9RmVobGVyIGJlaW0gVW1iZW5lbm5lbg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9pbnZhbGlkRWRpdG9yTXNnPU1pbmRlc3RlbnMgZWluZSBEYXRlaSBkaWVzZXMgRWRpdG9ycyB3dXJkZSBlbnRmZXJudC4gRGVyIEVkaXRvciBpc3QgbmljaHQgbWVociBnXHUwMGZjbHRpZyB1bmQgbXVzcyBnZXNjaGxvc3NlbiB3ZXJkZW4uDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JUaXRsZT1VbmdcdTAwZmNsdGlnZXIgRWRpdG9yDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yTWVzc2FnZTE9RmVobGVyIGJlaW0gVW1iZW5lbm5lbiBkZXIgRGF0ZWkoZW4pICcnezB9JycNCi0NCi0jIERlc2NyaXB0aW9uRm9ybVBhZ2UNCi1yZW5hbWVFcnJvcl90aXRsZT1FbGVtZW50IHVtYmVuZW5uZW4NCi1yZW5hbWVFcnJvcl9tc2c9SVVQQTAwMTNFOiBEaWUgVW1iZW5lbm51bmdzb3BlcmF0aW9uIGthbm4gbmljaHQgYXVzZ2VmXHUwMGZjaHJ0IHdlcmRlbi4NCi1TZWxlY3RFbGVtZW50RGlhbG9nX3NlbGVjdGVsZW1lbnRfdGV4dD1FbGVtZW50IGF1c3dcdTAwZTRobGVuDQotDQotIyBFZGl0b3JDaG9vc2VyDQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX3RpdGxlPU1ldGhvZGVuZWRpdG9yIFx1MDBmNmZmbmVuDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZXNjcmlwdGlvbkxhYmVsPUJlc2NocmVpYnVuZzoNCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfU2VsZWN0QWxsQnV0dG9uTGFiZWw9QWxsZXMgYXVzd1x1MDBlNGhsZW4NCi1PcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlX2VkaXRfdGV4dDA9RWxlbWVudCBiZWFyYmVpdGVuDQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNFOiBEZXIgRWRpdG9yLCBkZXIgZGVtIGF1c2dld1x1MDBlNGhsdGVuIE1ldGhvZGVuZWxlbWVudCB6dWdlb3JkbmV0IGlzdCwga2FubiBuaWNodCBnZVx1MDBmNmZmbmV0IHdlcmRlbi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZT1HcmFmaWtkYXRlaSBhdXN3XHUwMGU0aGxlbg0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVmYXVsdExpYnJhcnlOYW1lPU5ldWUgQmlibGlvdGhlaw0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZXNjcmlwdGlvbkxhYmVsPUJlc2NocmVpYnVuZzoNCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1XXHUwMGU0aGxlbiBTaWUgZWluZSBvZGVyIG1laHJlcmUgTWV0aG9kZW5rb25maWd1cmF0aW9uZW4gYXVzIHVuZCBrbGlja2VuIFNpZSBhbnNjaGxpZVx1MDBkZmVuZCBhdWYgRmVydGlnIHN0ZWxsZW4sIHVtIHNpZSB6dSBcdTAwZjZmZm5lbi4NCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfRGVzZWxlY3RBbGxCdXR0b25MYWJlbD1BbGxlcyBhYndcdTAwZTRobGVuDQotRWxlbWVudHNWaWV3X21pZ3JhdGlvbl9kaXJfZGxnX2Rlc2NyaXB0aW9uX3RleHQ9VmVyemVpY2huaXMgZlx1MDBmY3IgTWlncmF0aW9uIHZvbiB7MH0gYWxzIEVyc2V0enVuZyBmXHUwMGZjciB7MH0gYW5nZWJlbi4NCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uPUVzIGlzdCBlaW4gU3lzdGVtZmVobGVyIGF1ZmdldHJldGVuLiBLbGlja2VuIFNpZSBhdWYgRGV0YWlscywgdW0gd2VpdGVyZSBJbmZvcm1hdGlvbmVuIHp1IGVyaGFsdGVuLlxuXA0KLVxuXA0KLVNjaGxpZVx1MDBkZmVuIFNpZSBlaW5pZ2UgZGVyIGdlXHUwMGY2ZmZuZXRlbiBFZGl0b3JlbiB1bmQgd2llZGVyaG9sZW4gU2llIGFuc2NobGllXHUwMGRmZW5kIGRlbiBWb3JnYW5nLg0KLQ0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGl0bGU9R3JhZmlrIGlzdCB1bmdcdTAwZmNsdGlnDQotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZVRvb0JpZ0RpYWxvZ190ZW1wbGF0ZT1JVVBBMDAzMUU6IERpZSBhdXNnZXdcdTAwZTRobHRlIEdyYWZpayAnJ3swfScnIFx1MDBmY2JlcnNjaHJlaXRldCBkaWUgenVsXHUwMGU0c3NpZ2UgR3JcdTAwZjZcdTAwZGZlICh7MX0geCB7Mn0pLiBXXHUwMGU0aGxlbiBTaWUgZWluZSBhbmRlcmUgR3JhZmlrIGF1cy4NCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGl0bGU9R3JhZmlrIGlzdCB1bmdcdTAwZmNsdGlnDQotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RlbXBsYXRlPUlVUEEwMDMyRTogRGllIGF1c2dld1x1MDBlNGhsdGUgRGF0ZWkgJyd7MH0nJyBpc3QgbmljaHQgdm9yaGFuZGVuLiBXXHUwMGU0aGxlbiBTaWUgZWluZSBhbmRlcmUgR3JhZmlrIGF1cy4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9QXVzd1x1MDBlNGhsZW4uLi4NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5RGVzY3JpcHRpb249QmVzY2hyZWlidW5nIGRlciBNZXRob2RlbmJpYmxpb3RoZWsNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfRGVmYXVsdEJyaWVmRGVzY3JpcHRpb249QmVzY2hyZWlidW5nIGRlciBNZXRob2RlbmtvbmZpZ3VyYXRpb24NCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZURlc2NyaXB0aW9uPUFsbGUgRWRpdG9yZW4gbVx1MDBmY3NzZW4gZ2VzY2hsb3NzZW4gd2VyZGVuLiBXXHUwMGU0aGxlbiBTaWUgZGllIEVkaXRvcmVuIGF1cywgZGllIGdlZ2ViZW5lbmZhbGxzIHp1ZXJzdCBnZXNpY2hlcnQgd2VyZGVuIG1cdTAwZmNzc2VuLg0KLQ0KLSMgVGVtcGxhdGVEZXNjcmlwdGlvblBhZ2UNCi1mb3Jtc19UZW1wbGF0ZURlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnPURpZSBhdXNnZXdcdTAwZTRobHRlIERhdGVpIGlzdCBiZXJlaXRzIGVpbiBBbmhhbmcgZGllc2VyIFZvcmxhZ2UuDQotDQotIyBOZXcgTGlicmFyeSBFcnJvciBEaWFsb2cNCi1uZXdMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDE0RTogRGllIE1ldGhvZGVuYmlibGlvdGhlayBrYW5uIG5pY2h0IGVyc3RlbGx0IHdlcmRlbi4NCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMT1EZXIgYW5nZWdlYmVuZSBQZmFkIGZcdTAwZmNyIGRpZSBNZXRob2RlbmJpYmxpb3RoZWssICcnezB9JycsIGlzdCB1bmdcdTAwZmNsdGlnLg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24yPUVzIGlzdCBiZXJlaXRzIGVpbmUgTWV0aG9kZW5iaWJsaW90aGVrIGluICcnezB9Jycgdm9yaGFuZGVuLg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24zPURlciBhbmdlZ2ViZW5lIE9yZG5lciBmXHUwMGZjciBkaWUgTWV0aG9kZW5iaWJsaW90aGVrLCAnJ3swfScnLCBrYW5uIG5pY2h0IGVyc3RlbGx0IHdlcmRlbi4NCi1uZXdMaWJyYXJ5RXJyb3JfYWR2aWNlPVdcdTAwZTRobGVuIFNpZSBPSyBhdXMsIHVtIGVpbmVuIGFuZGVyZW4gTmFtZW4gb2RlciBQZmFkIGZcdTAwZmNyIGRpZSBCaWJsaW90aGVrIGFuenVnZWJlbi4NCi0NCi0jUHJvY2VzcyBsaXRlcmFscw0KLVByb2Nlc3NfRXh0ZXJuYWxJRD1FeHRlcm5lIElEOg0KLVByb2Nlc3NfUHVycG9zZT1ad2VjazoNCi1Qcm9jZXNzX1Njb3BlPVNjb3BlOg0KLVByb2Nlc3NfVXNhZ2VOb3Rlcz1WZXJ3ZW5kdW5nc2hpbndlaXNlOg0KLVByb2Nlc3NfQWx0ZXJuYXRpdmVzPUFsdGVybmF0aXZlbjoNCi1Qcm9jZXNzX0hvd1RvU3RhZmY9Vm9yZ2VoZW5zd2Vpc2UgYmVpIE1pdGFyYmVpdGVyYXVzd2FobDoNCi1Qcm9jZXNzX0tleUNvbnNpZGVyYXRpb249V2ljaHRpZ2UgSGlud2Vpc2U6DQotUHJvY2Vzc19TY2FsZT1Ta2FsaWVydW5nOg0KLVByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljcz1Qcm9qZWt0bWVya21hbGU6DQotUHJvY2Vzc19SaXNrTGV2ZWw9UmlzaWtvc3R1ZmU6DQotUHJvY2Vzc19Fc3RpbWF0aW5nVGVjaG5pcXVlPVNjaFx1MDBlNHR6dW5nc3RlY2huaWtlbjoNCi1Qcm9jZXNzX1Byb2plY3RNZW1iZXJFeHBlcnRpc2U9S25vdy1ob3cgZGVyIFByb2pla3RtaXRhcmJlaXRlcjoNCi1Qcm9jZXNzX1R5cGVPZkNvbnRyYWN0PVR5cCBkZXMgVmVydHJhZ3M6DQotDQotIyBFZGl0b3IgUHJldmlldyBOYXZpZ2F0aW9uIEJ1dHRvbnMNCi1iYWNrQnV0dG9uX3RleHQ9WnVyXHUwMGZjY2sNCi1mb3J3YXJkQnV0dG9uX3RleHQ9Vm9yDQotZm9yd2FyZF90ZXh0PVZvcg0KLXN0b3BCdXR0b25fdGV4dD1TdG9wcGVuDQotcmVmcmVzaEJ1dHRvbl90ZXh0PUFrdHVhbGlzaWVyZW4NCi1yZWZyZXNoX3RleHQ9QWt0dWFsaXNpZXJlbg0KLW5ld25hbWVfdGV4dD1OZXVlciBOYW1lOg0KLXByaW50QnV0dG9uX3RleHQ9RHJ1Y2tlbg0KLQ0KLSMgQ29udGV4dCBtZW51cw0KLV9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbT0mQWt0dWFsaXNpZXJlbg0KLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPSZFaWdlbnNjaGFmdGVuIGFuemVpZ2VuDQotDQotX1VJX01ldGhvZEVkaXRvcl9tZW51PSZNZXRob2RlbmVkaXRvcg0KLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09Jk5ldQ0KLV9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbT1OJmV1ZXIgZ2xlaWNoZ2VvcmRuZXRlciBFaW50cmFnDQotDQotX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWw9QXVzd2FobA0KLV9VSV9QYXJlbnRQYWdlX2xhYmVsPVx1MDBkY2Jlcmdlb3JkbmV0ZXIgRWludHJhZw0KLV9VSV9MaXN0UGFnZV9sYWJlbD1MaXN0ZQ0KLV9VSV9UcmVlUGFnZV9sYWJlbD1CYXVtc3RydWt0dXINCi1fVUlfVGFibGVQYWdlX2xhYmVsPVRhYmVsbGUNCi1fVUlfVGFibGVUcmVlUGFnZV9sYWJlbD1UYWJsZVRyZWUNCi1fVUlfT2JqZWN0Q29sdW1uX2xhYmVsPU9iamVrdA0KLV9VSV9TZWxmQ29sdW1uX2xhYmVsPUVpZ2VudGxpY2hlciBFaW50cmFnDQotDQotX1VJX05vT2JqZWN0U2VsZWN0ZWQ9RXMgaXN0IG5pY2h0cyBhdXNnZXdcdTAwZTRobHQgd29yZGVuLg0KLV9VSV9TaW5nbGVPYmplY3RTZWxlY3RlZD1BdXNnZXdcdTAwZTRobHRlcyBPYmpla3Q6IHswfQ0KLV9VSV9NdWx0aU9iamVjdFNlbGVjdGVkPUVzIHd1cmRlbiB7MH0gT2JqZWt0ZSBhdXNnZXdcdTAwZTRobHQuDQotDQotX1VJX09wZW5FZGl0b3JFcnJvcl9sYWJlbD1FZGl0b3IgXHUwMGY2ZmZuZW4NCi0NCi1fVUlfV2l6YXJkX2NhdGVnb3J5PUFzc2lzdGVudGVuIGZcdTAwZmNyIGRpZSBFcnN0ZWxsdW5nIHZvbiBFTUYtQmVpc3BpZWxtb2RlbGxlbg0KLQ0KLV9VSV9NZXRob2RNb2RlbFdpemFyZF9sYWJlbD1NZXRob2Rlbm1vZGVsbA0KLV9VSV9NZXRob2RNb2RlbFdpemFyZF9kZXNjcmlwdGlvbj1OZXVlcyBNZXRob2Rlbm1vZGVsbCBlcnN0ZWxsZW4NCi0NCi1fVUlfTWV0aG9kRWRpdG9yX2xhYmVsPUVkaXRvciBmXHUwMGZjciBNZXRob2Rlbm1vZGVsbGUNCi0NCi1fVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZT1NeQ0KLV9VSV9NZXRob2RFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbj1tZXRob2QNCi0NCi1fVUlfV2l6YXJkX2xhYmVsPU5ldQ0KLQ0KLV9XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9uPURlciBEYXRlaW5hbWUgbXVzcyBtaXQgJycuezB9JycgZW5kZW4uDQotDQotX1VJX01vZGVsT2JqZWN0PU1vZGVsbG9iamVrdA0KLV9VSV9YTUxFbmNvZGluZz1YTUwtQ29kaWVydW5nDQotX1VJX1hNTEVuY29kaW5nQ2hvaWNlcz1VVEYtOCBBU0NJSSBVVEYtMTYgVVRGLTE2QkUgVVRGLTE2TEUgSVNPLTg4NTktMQ0KLV9VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb249V1x1MDBlNGhsZW4gU2llIGVpbiB6dSBlcnN0ZWxsZW5kZXMgT2JqZWt0bW9kZWxsIGF1cy4NCi0NCi1fVUlfRmlsZUNvbmZsaWN0X2xhYmVsPURhdGVpa29uZmxpa3QNCi1fV0FSTl9GaWxlQ29uZmxpY3Q9RXMgc2luZCBuaWNodCBnZXNwZWljaGVydGUgXHUwMGM0bmRlcnVuZ2VuIHZvcmhhbmRlbiwgZGllIG1pdCBcdTAwYzRuZGVydW5nZW4gaW4gS29uZmxpa3Qgc3RlaGVuLCBkaWUgYXVcdTAwZGZlcmhhbGIgZGVzIEVkaXRvcnMgdm9yZ2Vub21tZW4gd3VyZGVuLiBcdTAwYzRuZGVydW5nZW4gaW4gZGllc2VtIEVkaXRvciB2ZXJ3ZXJmZW4/DQotDQotIyBBZGQgTGluayBEaWFsb2cNCi1hZGRMaW5rRGlhbG9nX2xpbmtUeXBlPVR5cDoNCi1vcGVuTGlua0NoZWNrYm94X3RleHQ9TGluayBpbiBlaW5lbSBnZXNvbmRlcnRlbiBCcm93c2VyZmVuc3RlciBcdTAwZjZmZm5lbg0KLQ0KLSMgQWRkIEltYWdlIERpYWxvZw0KLWhlaWdodExhYmVsX3RleHQ9SFx1MDBmNmhlOg0KLXdpZHRoTGFiZWxfdGV4dD1CcmVpdGU6DQotRWxlbWVudHNWaWV3XzIwPVByb3plc3NtdXN0ZXINCi1FbGVtZW50c1ZpZXdfMjE9QmVyZWl0c3RlbGx1bmdzcHJvemVzcw0KLUVsZW1lbnRzVmlld18yMj1Qcm96ZXNzDQotRWxlbWVudHNWaWV3XzM1PXswfSBpc3Qgc2NocmVpYmdlc2NoXHUwMGZjdHp0LiBCZXZvciBTaWUgZGVuIFZvcmdhbmcgZm9ydHNldHplbiwgbVx1MDBmY3NzZW4gU2llIGRhZlx1MDBmY3Igc29yZ2VuLCBkYXNzIGluIGRpZSBEYXRlaSBnZXNjaHJpZWJlbiB3ZXJkZW4ga2Fubi4NCi1FbGVtZW50c1ZpZXdfMzY9RmVobGVyIGJlaW0gTGFkZW4gZGVyIEJpYmxpb3RoZWsNCi1hbHRUYWdMYWJlbF90ZXh0PUFMVC1UYWc6DQotaW1hZ2VTaXplTGFiZWxfdGV4dD1EaWUgTWluZGVzdC0gdW5kIE1heGltYWx3ZXJ0ZSBmXHUwMGZjciBIXHUwMGY2aGUgdW5kIEJyZWl0ZSBlaW5lcyBCaWxkZXMgc2luZCAxMCBiencuIDYwMC4gVW5nXHUwMGZjbHRpZ2UgSFx1MDBmNmhlbi0gdW5kIEJyZWl0ZW5hbmdhYmVuIHdlcmRlbiBpbiBlaW5lIGFuZ2VtZXNzZW5lIEdyXHUwMGY2XHUwMGRmZSBrb252ZXJ0aWVydC4NCi0NCi0jIFByb2Nlc3MgRWRpdG9yDQotUHJvY2Vzc0VkaXRvcj1Qcm9jZXNzRWRpdG9yDQotUHJvY2Vzc0VkaXRvcl9OYW1lPU5hbWUNCi1Qcm9jZXNzRWRpdG9yX1ByZXNlbnRhdGlvbk5hbWU9UHJcdTAwZTRzZW50YXRpb25zbmFtZQ0KLVByb2Nlc3NFZGl0b3JfSW5kZXg9SW5kZXgNCi1Qcm9jZXNzRWRpdG9yX1ByZWRlY2Vzc29ycz1Wb3JnXHUwMGU0bmdlcg0KLSNDb25maWd1cmF0aW9uUGFnZV9TZWxlY3RlZD1TZWxlY3RlZDogDQotQ2hlY2tsaXN0T3JkZXJfZGVzY3JpcHRpb249V1x1MDBlNGhsZW4gU2llIGVpbmVuIFByXHUwMGZjZmxpc3RlbmVpbnRyYWcgYXVzIG9kZXIgXHUwMGU0bmRlcm4gU2llIG1pdCBOYWNoIG9iZW4gdW5kIE5hY2ggdW50ZW4gZGllIFBvc2l0aW9uIGRlcyBFaW50cmFncyBpbiBkZXIgTGlzdGUuDQotRWxlbWVudHNWaWV3X3JlbmFtaW5nX3RleHQ9VW1iZW5lbm5lbi4uLg0KLVByb2Nlc3NFZGl0b3JfTW9kZWxJbmZvPU1vZGVsbGluZm8NCi1Qcm9jZXNzRWRpdG9yX1ByZWZpeD1Qclx1MDBlNGZpeA0KLU1vdmVEaWFsb2dfbW92ZV90ZXh0PVZlcnNjaGllYmVuDQotQ2hlY2tsaXN0T3JkZXJfdGl0bGU9UHJcdTAwZmNmbGlzdGVuZWludHJcdTAwZTRnZSBzb3J0aWVyZW4NCi1Qcm9jZXNzRWRpdG9yX1JlcGV0YWJsZT1XaWVkZXJob2x0IGFud2VuZGJhcg0KLVByb2Nlc3NFZGl0b3JfT25nb2luZz1Gb3J0bGF1ZmVuZA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N5bmNocm9uaXphdGlvbj1TeW5jaHJvbmlzaWVyZW4uLi4NCi1Qcm9jZXNzRWRpdG9yX0V2ZW50RHJpdmVuPUVyZWlnbmlzZ2VzdGV1ZXJ0DQotUHJvY2Vzc0VkaXRvcl9EZWxpdmVyYWJsZT1MaWVmZXJnZWdlbnN0YW5kDQotUHJvY2Vzc0VkaXRvcl9PcHRpb25hbD1PcHRpb25hbA0KLUZpbHRlckRpYWxvZ19UeXBlX3RleHQ9VHlwIGRlcyBNZXRob2RlbmVsZW1lbnRzOg0KLUZpbHRlckRpYWxvZ19FeHBhbmRBbGw9QWxsZXMgZWluYmxlbmRlbg0KLU1vdmVEaWFsb2dfbW92aW5nX3RleHQ9VmVyc2NoaWViZW4uLi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWRTaGFwZUljb25XYXJuaW5nPUlVUEEwMDI1VzogRGFzIEZvcm1zeW1ib2wgZlx1MDBmY3IgezB9IHd1cmRlIG5pY2h0IGltIFBmYWQgZ2VmdW5kZW46IHsxfQ0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbkVycm9yPUlVUEEwMDI1RTogRmVobGVyOiBBYnNjaG5pdHQgZlx1MDBmY3IgRm9ybXN5bWJvbDogezB9DQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9OYW1lTGFiZWw9TmFtZToNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZVRpdGxlPU5ldWUgTWV0aG9kZW5rb25maWd1cmF0aW9uIGVyc3RlbGxlbg0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9OYW1lTGFiZWw9TmFtZToNCi1BdXRob3JpbmdVSVBsdWdpbl9uZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlPU5ldWUgTWV0aG9kZW5rb25maWd1cmF0aW9uDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VUaXRsZT1OZXVlIE1ldGhvZGVuYmlibGlvdGhlayBlcnN0ZWxsZW4NCi1uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlPU5ldWUgTWV0aG9kZW5iaWJsaW90aGVrDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVUaXRsZT1cdTAwYzRuZGVydW5nZW4gc3BlaWNoZXJuDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1HZWJlbiBTaWUgZWluZW4gTmFtZW4sIGVpbmUgQmVzY2hyZWlidW5nIHVuZCBlaW4gWmllbHZlcnplaWNobmlzIGZcdTAwZmNyIGRpZSBuZXVlIE1ldGhvZGVuYmlibGlvdGhlayBhbi4NCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZURlc2NyaXB0aW9uPU1pbmRlc3RlbnMgZWluIE1ldGhvZGVuZWxlbWVudCB3dXJkZSBnZVx1MDBlNG5kZXJ0LiBXXHUwMGU0aGxlbiBTaWUgZGllIGF1cywgZGllIGdlc3BlaWNoZXJ0IHdlcmRlbiBtXHUwMGZjc3Nlbi4NCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1NZXRob2RlbmtvbmZpZ3VyYXRpb25lbiBcdTAwZjZmZm5lbg0KLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uV2l6YXJkX3dpbmRvd1RpdGxlPU1ldGhvZGVua29uZmlndXJhdGlvbmVuIFx1MDBmNmZmbmVuDQotRWxlbWVudHNWaWV3X3JlcGxhY2Vpbmd3aXRoZm9ybWF0X3RleHQ9ezB9IHdpcmQgZXJzZXR6dC4uLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uV2FybmluZz1JVVBBMDAyNlc6IERhcyBLbm90ZW5zeW1ib2wgZlx1MDBmY3IgezB9IHd1cmRlIG5pY2h0IGltIFBmYWQgezF9IGdlZnVuZGVuLg0KLU1lc3NhZ2VMYWJlbFByb3ZpZGVyX3Vuc2VsZWN0ZWRwYWNrYWdlcz0nJ3swfScnIGVudGhcdTAwZTRsdCBFbGVtZW50ZSwgZGllIGF1ZiBFbGVtZW50ZSBpbiBuaWNodCBhdXNnZXdcdTAwZTRobHRlbiBQYWtldGVuIHZlcndlaXNlbi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbkVycm9yPUlVUEEwMDI2RTogRmVobGVyOiBBYnNjaG5pdHQgZlx1MDBmY3IgS25vdGVuc3ltYm9sOiB7MH0NCi1TdGVwc09yZGVyRGlhbG9nX3N0ZXBzPVNjaHJpdHRlOg0KLQ0KLVN0ZXBzT3JkZXJEaWFsb2dfdGl0bGU9QXVmZ2FiZW5zY2hyaXR0ZSBzb3J0aWVyZW4NCi1Qcm9jZXNzRWRpdG9yX1BsYW5uZWQ9R2VwbGFudA0KLXNwZWNpZnlkaXJlY3RvcnlfdGV4dD1HZWJlbiBTaWUgZWluIFZlcnplaWNobmlzIGVpbiwgaW4gZGVtIGRpZSBNZXRob2RlbmJpYmxpb3RoZWsgZ2VzcGVpY2hlcnQgd2VyZGVuIHNvbGwuDQotUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzPU1laHJlcmUgVm9ya29tbWVuDQotUHJvY2Vzc0VkaXRvcl9FbnRyeVN0YXRlPUFuZmFuZ3N6dXN0YW5kDQotUHJvY2Vzc0VkaXRvcl9FeGl0U3RhdGU9RW5kenVzdGFuZA0KLXNlbGVjdENvbHVtbnN0b0FkZF90ZXh0PUhpbnp1enVmXHUwMGZjZ2VuZGUgU3BhbHRlbiBhdXN3XHUwMGU0aGxlbg0KLVByb2Nlc3NFZGl0b3JfVHlwZT1UeXANCi1Qcm9jZXNzRWRpdG9yX1RlYW09VGVhbQ0KLUZpbHRlckRpYWxvZ190aXRsZT1EaWFsb2cgYXVzd1x1MDBlNGhsZW46IA0KLQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZD1IaW56dWZcdTAwZmNnZW4gYXVzICZNZXRob2RlbmluaGFsdC4uLg0KLUZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbD1BbGxlcyBhdXNibGVuZGVuDQotT3BlbkNoZWF0c2hlZXRWaWV3X3RpdGxlPVNwaWNremV0dGVsc2ljaHQgXHUwMGY2ZmZuZW4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Sb2xsVXA9Um9sbHVwDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbERvd249Um9sbGRvd24NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXA9TmFjaCAmb2Jlbg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX01vdmVEb3duPU5hY2ggJnVudGVuDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsPVJldmUmYWwNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Db3B5PSZLb3BpZXJlbi4uLg0KLUZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQ9TmFtZW5zbXVzdGVyIChcdTAwZmNiZXJlaW5zdGltbWVuZGUgTmFtZW4gd2VyZGVuIGFuZ2V6ZWlndCk6DQotDQotTWV0aG9kTGlicmFyeUVkaXRvcl90aXRsZT1NZXRob2RlbmJpYmxpb3RoZWs6DQotI01lc3NhZ2VWaWV3X3NlbGVjdGVkX3RleHQ9U2VsZWN0ZWQ6IA0KLU1lc3NhZ2VWaWV3X2Vycm1zZ190ZXh0PUJlc2NocmVpYnVuZw0KLUVsZW1lbnRzVmlld19lcnJfc2F2aW5nPUlVUEEwMDI3RTogRmVobGVyIGJlaW0gU3BlaWNoZXJuIHZvbiAnJ3swfScnezF9DQotDQotZXJyX2NvcHlpbmdfZmlsZV90aXRsZT1GZWhsZXIgYmVpbSBLb3BpZXJlbiBkZXIgRGF0ZWkNCi1lcnJfY29weWluZ19maWxlX2Vycm9yPUlVUEEwMDI4RTogRGFzIFN5bWJvbCBrb25udGUgbmljaHQgenVnZW9yZG5ldCB3ZXJkZW4uIA0KLWVycl9jb3B5aW5nX2ZpbGVfcmVhc29uPUJlaW0gS29waWVyZW4gZGVyIGF1c2dld1x1MDBlNGhsdGVuIERhdGVpIGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLiBLbGlja2VuIFNpZSBhdWYgRGV0YWlscywgdW0gd2VpdGVyZSBJbmZvcm1hdGlvbmVuIHp1IGVyaGFsdGVuLg0KLWVycl9wcm9jZXNzaW5nX2ZpbGVfdGl0bGU9RmVobGVyIGJlaW0gVmVyYXJiZWl0ZW4gZGVyIERhdGVpDQotZWRpdENvbmZpZ3VyYXRpb25fdG9vbHRpcD1Lb25maWd1cmF0aW9uIGJlYXJiZWl0ZW4NCi1lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQ9SVVQQTAwMTVFOiBEYXMgRWxlbWVudCBrYW5uIG5pY2h0IGJlYXJiZWl0ZXQgd2VyZGVuDQotU2F2ZVRoaXNBY3Rpb25fc2F2ZW9iamVjdD1PYmpla3Qgc3BlaWNoZXJuLi4uDQotRWxlbWVudHNWaWV3X3JlcGxhY2VfdGV4dD1FcnNldHplbg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0V4dGVuZD0mRXJ3ZWl0ZXJuLi4uDQotTW92ZURpYWxvZ19kZXN0aW5hdGlvbl90ZXh0PVppZWwgZlx1MDBmY3IgYXVzZ2V3XHUwMGU0aGx0ZSBFbGVtZW50ZSBhdXN3XHUwMGU0aGxlbjoNCi1jaG9vc2VEZWZhdWx0RGlyZWN0b3J5X3RleHQ9U3RhbmRhcmR2ZXJ6ZWljaG5pcyBmXHUwMGZjciBCaWJsaW90aGVrZW4gYXVzd1x1MDBlNGhsZW46DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3M9VW50ZXJkJnJcdTAwZmNja2VuDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3MyPVZlclx1MDBmNmZmZW50bGljaHVuZ3NvJnB0aW9uZW4uLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbT1CZW4mdXR6ZXJkZWZpbmllcnRlIERpYWdyYW1tZS4uLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ190aXRsZT1CZW51dHplcmRlZmluaWVydGUgRGlhZ3JhbW1lIHp1b3JkbmVuDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkSW1hZ2U9QWt0aXZpdFx1MDBlNHRzZGlhZ3JhbW06DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkZEltYWdlPUFrdGl2aXRcdTAwZTR0c2RldGFpbGRpYWdyYW1tOg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ193cGRJbWFnZT1BcmJlaXRzZXJnZWJuaXNhYmhcdTAwZTRuZ2lna2VpdHNkaWFncmFtbToNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfbm90YUZpbGU9SVVQQTAwMDRFOiBEZXIgYW5nZWdlYmVuZSBQZmFkIGlzdCBrZWluZSBEYXRlaS4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYXNzaWduQnV0dG9uPUF1c3dcdTAwZTRobGVuLi4uDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2VudGVyZWRJbWFnZU5vdEZvdW5kPUlVUEEwMDI0RTogRGllIGFuZ2VnZWJlbmUgR3JhZmlrIGlzdCBuaWNodCBpbiBkZXIgQmlibGlvdGhlayBlbnRoYWx0ZW4uIFZlcmdld2lzc2VybiBTaWUgc2ljaCwgZGFzcyBkZXIgUGZhZCByZWxhdGl2IHp1bSBTdGFtbXZlcnplaWNobmlzIGRlciBCaWJsaW90aGVrIGVpbmdlZ2ViZW4gd3VyZGUuDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3NlbGVjdGVkSW1hZ2VOb3RGb3VuZD1JVVBBMDAzMEU6IERpZSBhdXNnZXdcdTAwZTRobHRlIEdyYWZpayBpc3QgbmljaHQgaW4gZGVyIEJpYmxpb3RoZWsgZW50aGFsdGVuLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBREltYWdlPUdyYWZpayBmXHUwMGZjciBBa3Rpdml0XHUwMGU0dHNkaWFncmFtbSBmXHUwMGZjciBCcm93c2luZyB1bmQgVmVyXHUwMGY2ZmZlbnRsaWNodW5nIHZlcndlbmRlbg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBRERJbWFnZT1HcmFmaWsgZlx1MDBmY3IgQWt0aXZpdFx1MDBlNHRzZGV0YWlsZGlhZ3JhbW0gZlx1MDBmY3IgQnJvd3NpbmcgdW5kIFZlclx1MDBmNmZmZW50bGljaHVuZyB2ZXJ3ZW5kZW4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlV1BESW1hZ2U9R3JhZmlrIGZcdTAwZmNyIEFyYmVpdHNlcmdlYm5pc2FiaFx1MDBlNG5naWdrZWl0c2RpYWdyYW1tIGZcdTAwZmNyIEJyb3dzaW5nIHVuZCBWZXJcdTAwZjZmZmVudGxpY2h1bmcgdmVyd2VuZGVuDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29udHJpYnV0ZT1Mb2thbGVyIEJlaXRyYWcNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXBsYWNlPUxva2FsZSBFcnNldHp1bmcNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9EaWFncmFtcz1EaWEmZ3JhbW1lDQotUHJvY2Vzc0VkaXRvcl9hY3Rpb25fZGVlcENvcHk9JlRpZWZlIEtvcGllLi4uDQotRmlsdGVyRGlhbG9nX0JyaWVmRGVzY3JpcHRpb249S3VyemJlc2NocmVpYnVuZzoNCi1Db25maWd1cmF0aW9uUGFnZV9oaWRlVG9vbFRpcD1OaWNodCBhdXNnZXdcdTAwZTRobHRlIEVsZW1lbnRlIGVpbi0vYXVzYmxlbmRlbg0KLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uPUJlc2NocmVpYnVuZzoNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc0FsbD1OaWNodHMgdmVyXHUwMGY2ZmZlbnRsaWNoZW4NCi1GaWx0ZXJEaWFsb2dfUGF0dGVybl9kZXNjcmlwdGlvbj1NdXN0ZXIgd2VyZGVuIGR1cmNoIEtvbW1hdGEgdm9uZWluYW5kZXIgZ2V0cmVubnQuIEluIGVpbmVtIE11c3RlciBrYW5uICogZlx1MDBmY3IgZWluZSBiZWxpZWJpZ2UgWmVpY2hlbmZvbGdlIHVuZCA/ICBmXHUwMGZjciBlaW4gYmVsaWViaWdlcyBaZWljaGVuIHZlcndlbmRldCB3ZXJkZW4uDQotQ29uZmlndXJhdGlvblBhZ2VfVHJlZVRpdGxlTGFiZWw9SW5oYWx0Og0KLUNvbmZpZ3VyYXRpb25QYWdlX0xvYWRpbmdNZXNzYWdlPUtvbmZpZ3VyYXRpb24gd2lyZCBnZWxhZGVuLiBCaXR0ZSB3YXJ0ZW4uLi4NCi1Nb3ZlRGlhbG9nX3ZhbGlkZGVzdGluYXRpb25fdGV4dD1EYXMgYW5nZWdlYmVuZSBaaWVsIGZcdTAwZmNyIFZlcnNjaGllYmVuIGlzdCBuaWNodCBnXHUwMGZjbHRpZy4NCi1Nb3ZlRGlhbG9nX2Nhbm5vdE1vZGlmeURlc3RpbmF0aW9uPUlVUEEwMDM0RTogRGllIGF1c2dld1x1MDBlNGhsdGUgWmllbGFkcmVzc2Uga2FubiBuaWNodCBnZVx1MDBlNG5kZXJ0IHdlcmRlbi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGw9QWxsZXMgdmVyXHUwMGY2ZmZlbnRsaWNoZW4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQmFzZUFjdGl2aXR5PUJhc2lzYWt0aXZpdFx1MDBlNHQgXHUwMGY2ZmZuZW4NCi1Qcm9jZXNzRm9ybUVkaXRvcl9leHBhbkFsbEFjdGlvbkxhYmVsPUFsbGVzIGUmaW5ibGVuZGVuDQotUHJvY2Vzc0Zvcm1FZGl0b3JfY29sbGFwc2VBbGxBY3Rpb25MYWJlbD1BbGxlcyBhdXNiJmxlbmRlbg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURpYWdyYW09JkFrdGl2aXRcdTAwZTR0c2RpYWdyYW1tIFx1MDBmNmZmbmVuDQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVJldmVhbD1EaWUgdW50ZXIgRGV0YWlscyBhdWZnZWxpc3RldGVuIHVudGVyZHJcdTAwZmNja3RlbiBEZXNrcmlwdG9yZW4gbVx1MDBmY3NzZW4gZ2VsXHUwMGY2c2NodCB3ZXJkZW4sIHVtIG5hY2ggZGVtIEVpbmJsZW5kZW4gZGVyIGF1c2dld1x1MDBlNGhsdGVuIEVsZW1lbnRlIER1cGxpemllcnVuZ2VuIHp1IHZlcm1laWRlbi4gS2xpY2tlbiBTaWUgYXVmIE9LLCB3ZW5uIFNpZSBkaWUgRGVza3JpcHRvcmVuIGxcdTAwZjZzY2hlbiB1bmQgZm9ydGZhaHJlbiBtXHUwMGY2Y2h0ZW4uDQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX1NlbGVjdENvbHVtbnM9SGluenV6dWZcdTAwZmNnZW5kZSBTcGFsdGVuIGF1c3dcdTAwZTRobGVuDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT1Ba3Rpdml0XHUwMGU0dHMmZGV0YWlsZGlhZ3JhbW0NCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfQ29sdW1uU2VsZWN0aW9uPVNwYWx0ZW5hdXN3YWhsOg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zd2l0Y2hDb25maWd1cmF0aW9uPUJlaW0gQWt0aXZpZXJlbiBlaW5lcyBQcm96ZXNzZWRpdG9ycyBhdWYgZGllIFN0YW5kYXJka29uZmlndXJhdGlvbiBkZXMgUHJvemVzc2VzIHVtc2NoYWx0ZW4NCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3VwcHJlc3Npb25Hcm91cFRpdGxlPVVudGVyZHJcdTAwZmNja3VuZw0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9pbmhlcml0U3VwcHJlc3Npb25TdGF0ZT1VbnRlcmRyXHUwMGZjY2t1bmdzenVzdFx1MDBlNG5kZSBcdTAwZmNiZXJuZWhtZW4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbT1BJnJiZWl0c2VyZ2VibmlzYWJoXHUwMGU0bmdpZ2tlaXRzZGlhZ3JhbW0gXHUwMGY2ZmZuZW4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1JbmhhbHQgbFx1MDBmNnNjaGVuDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9QXVzd1x1MDBlNGhsZW4uLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9JbnNlcnROZXdQaGFzZT1OZXVlIFBoYXNlIGVpbmZcdTAwZmNnZW4NCi1WaWV3SGVscGVyX3JlbG9hZExpYk9uUm9sbGJhY2tFcnJvcj1SZWNvdmVyeSBuYWNoIGVpbmVtIHBlcm1hbmVudGVuIEZlaGxlciBuaWNodCBtXHUwMGY2Z2xpY2guIERpZSBCaWJsaW90aGVrIG11c3MgZXJuZXV0IGdlbGFkZW4gd2VyZGVuLCB1bSBkZW4gdXJzcHJcdTAwZmNuZ2xpY2hlbiBadXN0YW5kIHdpZWRlcmhlcnp1c3RlbGxlbi4NCi1WaWV3SGVscGVyX2FscmVhZHlkZWxldGVkX3RleHQ9RGFzIEVsZW1lbnQgJyd7MH0nJyB3dXJkZSBiZXJlaXRzIGdlbFx1MDBmNnNjaHQuDQotVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZGNvbmZpcm1fdGV4dD1EYXMgRWxlbWVudCAnJ3swfScnIHd1cmRlIGJlcmVpdHMgZ2VsXHUwMGY2c2NodC4gXA0KLUVsZW1lbnQgYXVzICcnezF9JycgZW50ZmVybmVuPw0KLUNvbmZpZ3VyYXRpb25QYWdlX0FkZE1pc3NpbmdUb29sVGlwPUZlaGxlbmRlIFJlZmVyZW56ZW4gaGluenVmXHUwMGZjZ2VuDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb249QmVzY2hyZWlidW5nDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uR2VuZXJhbEluZm89QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuDQotDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXBwbHlQYXR0ZXJuPU11cyZ0ZXIgYW53ZW5kZW4NCi1Nb3ZlRGlhbG9nX3NlbGVjdGRlc3RpbmF0aW9uX3RleHQ9V1x1MDBlNGhsZW4gU2llIGVpbmUgWmllbGFkcmVzc2UgYXVzLg0KLU1vdmVEaWFsb2dfbm9tb3ZlX2Rlc3RpbmF0aW9uX3Byb2JsZW1fbXNnPUVzIHd1cmRlIGtlaW4gWmllbCBmXHUwMGZjciBWZXJzY2hpZWJlbiBhbmdlZ2ViZW4uDQotTWV0aG9kTGlicmFyeUVkaXRvcl90cm91Ymxlb2JqZWN0PS4gRmVobGVyaGFmdGVzIE9iamVrdDogDQotTWVzc2FnZUxhYmVsUHJvdmlkZXJfZXJyY2hpbGRwa2dzPUVpbiB1bnRlcmdlb3JkbmV0ZXMgSW5oYWx0c3Bha2V0IG9kZXIgZWluIFByb3plc3MgZW50aFx1MDBlNGx0IEVsZW1lbnRlIG1pdCBmZWhsZW5kZW4gUmVmZXJlbnplbg0KLVByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfVGl0bGU9VmVyXHUwMGY2ZmZlbnRsaWNodW5nc29wdGlvbmVuIGZcdTAwZmNyIERpYWdyYW1tDQotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19NZXNzYWdlPVdcdTAwZTRobGVuIFNpZSBkaWUgenUgdmVyXHUwMGY2ZmZlbnRsaWNoZW5kZW4gRGlhZ3JhbW1lIGF1cyB1bmQgd1x1MDBlNGhsZW4gU2llIGRpZSBEaWFncmFtbWUgYWIsIGRpZSBTaWUgbmljaHQgdmVyXHUwMGY2ZmZlbnRsaWNoZW4gbVx1MDBmNmNodGVuLg0KLVByb2Nlc3NFZGl0b3JfVGl0bGU9UHJvemVzc2VkaXRvcjogDQotU2F2ZUFzd2l0aGRvdHNfdGV4dD1TcGVpY2hlcm4gdW50ZXIuLi4NCi1Qcm9jZXNzRWRpdG9yX1dvcmtCcmVha2Rvd25TdHJ1Y3R1cmU9UHJvamVrdHN0cnVrdHVycGxhbg0KLVByb2Nlc3NFZGl0b3JfVGVhbUFsbG9jYXRpb249VGVhbXp1b3JkbnVuZw0KLVByb2Nlc3NFZGl0b3JfV29ya1Byb2R1Y3RVc2FnZT1WZXJ3ZW5kdW5nIGRlciBBcmJlaXRzZXJnZWJuaXNzZQ0KLVByb2Nlc3NFZGl0b3JfQ29uc29saWRhdGVkVmlldz1Lb25zb2xpZGllcnRlIFNpY2h0DQotUHJvY2Vzc0VkaXRvcl9jb25maXJtQXV0b1N5bmNoPURpZXNlIE9wZXJhdGlvbiBha3R1YWxpc2llcnQgZGllIGF1c2dld1x1MDBlNGhsdGVuIERlc2tyaXB0b3JlbiBiencuIGFsbGUgRGVza3JpcHRvcmVuIHVudGVyaGFsYiBkZXIgYXVzZ2V3XHUwMGU0aGx0ZW4gQWt0aXZpdFx1MDBlNHRlbiwgZGllIGF1ZiBkZXIgUmVnaXN0ZXJrYXJ0ZSBBbGxnZW1laW4gZGVyIEVpZ2Vuc2NoYWZ0ZW5zaWNodCBtaXQgIlN5bmNocm9uaXNpZXJ0IG1pdCBRdWVsbGUiIGdla2VubnplaWNobmV0IHNpbmQuIFNpZSBha3R1YWxpc2llcnQgZGllc2UgRGVza3JpcHRvcmVuIG1pdCBkZW4gdXJzcHJcdTAwZmNuZ2xpY2hlbiBFaWdlbnNjaGFmdGVuIGRlciB2ZXJsaW5rdGVuIE1ldGhvZGVuaW5oYWx0c2VsZW1lbnRlIGluIGRlciBTdGFuZGFyZGtvbmZpZ3VyYXRpb24gZGVzIFByb3plc3Nlcy4gQmVhY2h0ZW4gU2llLCBkYXNzIGtlaW5lIGR5bmFtaXNjaCB2ZXJsaW5rdGVuIERlc2tyaXB0b3JlbiAoZ3JcdTAwZmNuZSBLdXJzaXZzY2hyaWZ0KSBha3R1YWxpc2llcnQgd2VyZGVuLiBGb3J0ZmFocmVuPw0KLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMT1Lb25maWd1cmF0aW9uDQotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24yPVBsdWctaW4tIHVuZCBQYWtldGF1c3dhaGwNCi1OZXdMaWJyYXJ5RGlhbG9nX25ld2xpYnJhcnlfYXM9TmV1ZSBCaWJsaW90aGVrIGVyc3RlbGxlbiB1bnRlcg0KLU5ld1BsdWdpbkRpYWxvZ19uZXdwbHVnaW5fdGV4dD1OZXVlcyBNZXRob2Rlbi1QbHVnLWluDQotU2VsZWN0RWxlbWVudERpYWxvZ190aXRsZV90ZXh0PVdcdTAwZTRobGVuIFNpZSBkYXMgRWxlbWVudCBvZGVyIGVpbmVuIHNlaW5lciBCZWl0clx1MDBlNGdlIGF1czoNCi1PcGVuQ29uZmlnRGlhbG9nbmV3Y29uZmlnX3RleHQ9TmV1ZSBLb25maWd1cmF0aW9uOg0KLXByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZV9CU0VkaXRvcj1Qcm96ZXNzZWRpdG9yDQotDQotIyBBYnN0cmFjdERpYWdyYW1FZGl0b3INCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9QXVzcmljaHRlbg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0PUFuaGFuZCBkZXIgQmFzaXNha3Rpdml0XHUwMGU0dCBha3R1YWxpc2llcmVuDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2Zvcm1hdFRleHRCb3hBY3Rpdml0eV90ZXh0PVRleHRmZWxkIGZvcm1hdGllcmVuLi4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1Ib3Jpem9udGFsIGFuIER1cmNoc2Nobml0dHNrb29yZGluYXRlbg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9SG9yaXpvbnRhbCBhbiBlcnN0ZXIgYXVzZ2V3XHUwMGU0aGx0ZXIgS29vcmRpbmF0ZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9VmVydGlrYWwgYW4gRHVyY2hzY2huaXR0c2tvb3JkaW5hdGVuDQotTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl90aXRsZT1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4NCi1Nb3ZlRGlhbG9nX2ludmFsaWRfbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZz1JVVBBMDA0MUU6IERpZSBhdXNnZXdcdTAwZTRobHRlbiBFbGVtZW50ZSBrXHUwMGY2bm5lbiBuaWNodCBhbiBkaWUgYW5nZWdlYmVuZSBaaWVsYWRyZXNzZSB2ZXJzY2hvYmVuIHdlcmRlbi4NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3NhdmVtb2RlbGxpYnJhcnk9TW9kZWxsYmlibGlvdGhlayB3aXJkIGdlc3BlaWNoZXJ0Li4uDQotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJvcl9kaWFsb2dfdGl0bGU9RmVobGVyDQotTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c9SVVQQTAwMzNFOiBCZWltIFNwZWljaGVybiBkZXIgQmlibGlvdGhlayBpc3QgZWluIEZlaGxlciBhdWZnZXRyZXRlbi4NCi1NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dD0nJ3swfScnIHdpcmtsaWNoIGxcdTAwZjZzY2hlbj8NCi1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19Db250ZW50RWxlbWVudF90ZXh0PUluaGFsdHNlbGVtZW50ZTogDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Ccm93c2VCdXR0b25MYWJlbD1EdXJjaHN1Y2hlbi4uLg0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb249R2ViZW4gU2llIGVpbmVuIE5hbWVuIHVuZCBlaW5lIEJlc2NocmVpYnVuZyBmXHUwMGZjciBkaWUgbmV1ZSBNZXRob2RlbmtvbmZpZ3VyYXRpb24gYW4uDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VUaXRsZT1cdTAwYzRuZGVydW5nZW4gc3BlaWNoZXJuIHVuZCBhbGxlIEVkaXRvcmVuIHNjaGxpZVx1MDBkZmVuDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1WZXJ0aWthbCBhbiBlcnN0ZXIgYXVzZ2V3XHUwMGU0aGx0ZXIgS29vcmRpbmF0ZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQ9U3BlaWNoZXJuDQotQXR0YWNobWVudERpYWxvZ2F0dGFjaEZpbGVfdGV4dD1EYXRlaSBhbmhcdTAwZTRuZ2VuDQotQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudD1Lb25maWd1cmF0aW9uc2luaGFsdA0KLU9wZW5Db25maWdEaWFsb2dvcGVuY29uZmlnX3RleHQ9S29uZmlndXJhdGlvbiBcdTAwZjZmZm5lbg0KLUVsZW1lbnRzVmlld19yZXBsYWNlQWN0aW9uX3RleHQ9RXJzZXR6ZW4uLi4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlPXswfSB3aXJkIGdlc3BlaWNoZXJ0DQotQ29uZmlndXJhdGlvblBhZ2VfU2hvd0Vycm9yVG9vbFRpcD1WaWV3ZXIgZlx1MDBmY3IgS29uZmlndXJhdGlvbnN3YXJudW5nc3Byb3Rva29sbCBhbnplaWdlbg0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkZvcm1QcmVmaXg9S29uZmlndXJhdGlvbjoNCi0NCi1DaGVja2xpc3RPcmRlcl9jaGVja2xpc3RpdGVtc190ZXh0PVByXHUwMGZjZmxpc3RlbmVpbnRyXHUwMGU0Z2U6IA0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9Nb3ZlTm9kZV9sYWJlbD1Lbm90ZW4gdmVyc2NoaWViZW4NCi1Db25maWd1cmF0aW9uUGFnZV9NYWtlQ2xvc3VyZVRvb2xUaXA9RmVobGVyYmVoZWJ1bmcgZlx1MDBmY3IgS29uZmlndXJhdGlvbnNhYnNjaGx1c3MNCi1OZXdQbHVnaW5EaWFsb2dfcmVmZXJlbmNlcGx1Z2luX3RleHQ9UmVmZXJlbnotUGx1Zy1pbnM6DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2NyZWF0ZUZyZWVUZXh0X3RleHQ9VGV4dCBtaXQgZnJlaWVtIEZvcm1hdCBlcnN0ZWxsZW4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19MYWJlbD1Wb3JhbnplaWdlIGRlcyBLbm90ZW5zeW1ib2xzOg0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0PUlVUEEwMDMyVzogVmVyYmluZHVuZyBrYW5uIG5pY2h0IGhlcmdlc3RlbGx0IHdlcmRlbg0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9zYW1lcHJlZGFuZHN1Y190ZXh0PUlVUEEwMDMzVzogRWluIFN0cnVrdHVyZWxlbWVudCBrYW5uIG5pY2h0IGdsZWljaHplaXRpZyBWb3JnXHUwMGU0bmdlciB1bmQgTmFjaGZvbGdlciBzZWluLg0KLQ0KLSMgRWRpdG9yQ2hvb3Nlcg0KLUVkaXRvckNob29zZXJfbG9hZGRFcnJvckRsZ1RpdGxlPUVkaXRvciBcdTAwZjZmZm5lbg0KLUVkaXRvckNob29zZXJfUmVzb3VyY2VzRXJyb3I9RGllc2VzIEVsZW1lbnQgZW50aFx1MDBlNGx0IEZlaGxlci4gRXMgd2lyZCBlbXBmb2hsZW4sIGRpZSBGZWhsZXIgenUgYmVoZWJlbiwgYmV2b3IgZGVyIFZvcmdhbmcgZm9ydGdlc2V0enQgd2lyZCAoc2llaGUgRGV0YWlscykuXG5cDQotXG5cDQotS2xpY2tlbiBTaWUgYXVmIE9LLCB1bSBkZW4gVm9yZ2FuZyBvaG5lIFx1MDBkNmZmbmVuIGRlcyBFZGl0b3JzIGZvcnR6dXNldHplbi4gU2NobGllXHUwMGRmZW4gU2llIGRlbiBEaWFsb2csIHVtIGRlbiBFZGl0b3IgenUgXHUwMGY2ZmZuZW4uDQotQ29uZmlndXJhdGlvblBhZ2VfRm9ybVByZWZpeD1Lb25maWd1cmF0aW9uOg0KLQ0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbk5hbWU9TmFtZToNCi1BdHRhY2htZW50RGlhbG9nRmlsZVVSTF90ZXh0PURhdGVpLVVSTDoNCi1TdGVwc09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uPVdcdTAwZTRobGVuIFNpZSBlaW5lbiBTY2hyaXR0IGF1cyBvZGVyIFx1MDBlNG5kZXJuIFNpZSBtaXQgTmFjaCBvYmVuIHVuZCBOYWNoIHVudGVuIGRpZSBQb3NpdGlvbiBkZXMgRWludHJhZ3MgaW4gZGVyIExpc3RlLg0KLU1ldGhvZExpYnJhcnlFZGl0b3JfZXJyX3NhdmU9QmVpbSBTcGVpY2hlcm4gaXN0IGVpbiBGZWhsZXIgYXVmZ2V0cmV0ZW4uDQotTWVzc2FnZVZpZXdfZXJyZWxlbWVudF90ZXh0PVJlZmVyZW56aWVyZW5kZXMgRWxlbWVudA0KLU1lc3NhZ2VWaWV3X3JlZmVsZW1lbnRfdGV4dD1SZWZlcmVuemllcnRlcyBFbGVtZW50DQotDQotI0FjdGl2aXR5IERpYWdyYW0NCi1BY3Rpdml0eURpYWdyYW1FZGl0b3JfY3JlYXRlU3RhcnROb2RlX3RleHQ9QW5mYW5nc2tub3RlbiBlcnN0ZWxsZW4NCi1Db25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50RGVzY3JpcHRpb249V1x1MDBlNGhsZW4gU2llIGRpZSBNZXRob2Rlbi1QbHVnLWlucywgZGllIEluaGFsdHNwYWtldGUgdW5kIFByb3plc3NlIGF1cywgZGllIGluIGRpZSBLb25maWd1cmF0aW9uIGF1Zmdlbm9tbWVuIHdlcmRlbiBzb2xsZW4uDQotQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb25fdGV4dD1JbmhhbHRzZWxlbWVudGUgZGVyIGFuZ2VwYXNzdGVuIEthdGVnb3JpZSAoRGlhbG9nKQ0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGlyZWN0b3J5TGFiZWw9VmVyemVpY2huaXM6DQotUm9vdFByZWZQYWdlX2VuYWJsZXByb2Nlc3Njb250cmlidXRpb25fdGV4dD1Qcm96ZXNzYmVpdHJcdTAwZTRnZSBha3RpdmllcmVuDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25fdGV4dD1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VyIE1ldGhvZGVua29uZmlndXJhdGlvbiBhbmdlYmVuLg0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uTGFiZWw9QmVzY2hyZWlidW5nOg0KLUNvbnRyaWJ1dGlvblNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9QmVpdHJcdTAwZTRnZSBmXHUwMGZjciAnJ3swfScnIGF1c3dcdTAwZTRobGVuDQotRWxlbWVudHNWaWV3X29wZW5WYXJpYWJpbGl0eURpYWxvZ0FjdGlvbl90ZXh0PVx1MDBkY2JlciBWYXJpYWJpbGl0XHUwMGU0dHNlbGVtZW50ZSBcdTAwZjZmZm5lbg0KLVZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZT1WYXJpYWJpbGl0XHUwMGU0dHNlbGVtZW50ZSBmXHUwMGZjciAnJ3swfScnIGF1c3dcdTAwZTRobGVuDQotVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3ZpZXdlckxhYmVsPVZhcmlhYmlsaXRcdTAwZTR0c2VsZW1lbnRlIGZcdTAwZmNyICcnezB9JycNCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfTGFiZWw9Vm9yYW56ZWlnZSBkZXMgRm9ybXN5bWJvbHM6DQotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9kZWxldGVfdGV4dD1MXHUwMGY2c2Nob3BlcmF0aW9uIGthbm4gbmljaHQgYXVzZ2VmXHUwMGZjaHJ0IHdlcmRlbg0KLUFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9QWt0aXZpdFx1MDBlNHRzZGV0YWlsZGlhZ3JhbW0gXHUwMGY2ZmZuZW4NCi0NCi1NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX2Rlc2NyaXB0aW9uPUFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgTWV0aG9kZW5iaWJsaW90aGVrIGFuZ2ViZW4uDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1JbmhhbHQgbFx1MDBmNnNjaGVuDQotV1BDb21wYXJ0bWVudEZpZ3VyZV8wPU5ldWVyIEFyYmVpdHNlcmdlYm5pc2Rlc2tyaXB0b3INCi1wcm9tcHRmb3JfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZF90ZXh0PUFrdGl2aXRcdTAwZTR0c2RldGFpbGRpYWdyYW1tZSB2ZXJcdTAwZjZmZmVudGxpY2hlbiBvZGVyIGFuemVpZ2VuLCBkaWUgaW0gUHJvemVzc2VkaXRvciBuaWNodCBlcnN0ZWxsdCB3dXJkZW4uDQotcHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtPUFrdGl2aXRcdTAwZTR0c2RpYWdyYW1tZSBmXHUwMGZjciBuaWNodCBnZVx1MDBlNG5kZXJ0ZSBBa3Rpdml0XHUwMGU0dHNlcndlaXRlcnVuZ2VuIHZlclx1MDBmNmZmZW50bGljaGVuIG9kZXIgYW56ZWlnZW4NCi0NCi0jQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2cNCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19OYW1lUGF0dGVybj1OYW1lbnNtdXN0ZXIgKFx1MDBmY2JlcmVpbnN0aW1tZW5kZSBOYW1lbiB3ZXJkZW4gYW5nZXplaWd0KToNCi1zaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbl9sYWJlbD1JbSBSZXNzb3VyY2VubmF2aWdhdG9yIGFuemVpZ2VuDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfUGF0dGVybj1NdXN0ZXIgd2VyZGVuIGR1cmNoIEtvbW1hdGEgdm9uZWluYW5kZXIgZ2V0cmVubnQuIEluIGVpbmVtIE11c3RlciBrYW5uICogZlx1MDBmY3IgZWluZSBiZWxpZWJpZ2UgWmVpY2hlbmZvbGdlIHVuZCA/ICBmXHUwMGZjciBlaW4gYmVsaWViaWdlcyBaZWljaGVuIHZlcndlbmRldCB3ZXJkZW4uDQotZXJyX3Byb2Nlc3NpbmdfZmlsZV9kZXNjcmlwdGlvbj1JVVBBMDAyOUU6IEJlaW0gVmVyYXJiZWl0ZW4gZGVyIGF1c2dld1x1MDBlNGhsdGVuIERhdGVpIGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLiBLbGlja2VuIFNpZSBhdWYgRGV0YWlscywgdW0gd2VpdGVyZSBJbmZvcm1hdGlvbmVuIHp1IGVyaGFsdGVuLg0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX0NhdGVnb3J5VHlwZT1LYXRlZ29yaWV0eXA6DQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbj1LdXJ6YmVzY2hyZWlidW5nOg0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1NlbGVjdENhdGVnb3JpZXM9S2F0ZWdvcmllbiBhdXN3XHUwMGU0aGxlbg0KLQ0KLSNsb2cgbWVzc2FnZXMNCi1jaGVhdHNoZWV0X2xvYWRfZmFpbHVyZV9sb2dfbXNnPURlciBhbmdlZm9yZGVydGUgU3BpY2t6ZXR0ZWwga29ubnRlIG5pY2h0IGdlXHUwMGY2ZmZuZXQgd2VyZGVuOiANCi0NCi1uZXdDb25maWd1cmF0aW9uV2lyYXpkX2NyZWF0ZUVycm9yPUlVUEEwMDM1RTogRGllIEtvbmZpZ3VyYXRpb24ga2FubiBuaWNodCBmZWhsZXJmcmVpIGVyc3RlbGx0IHdlcmRlbi4NCi1uZXdQbHVnaW5XaXphcmRfY3JlYXRlRXJyb3I9SVVQQTAwMzZFOiBEYXMgUGx1Zy1pbiBrYW5uIG5pY2h0IGZlaGxlcmZyZWkgZXJzdGVsbHQgd2VyZGVuLg0KLWVycm9yRGlhbG9nX21vdmVFcnJvcj1JVVBBMDAzN0U6IERhcyBFbGVtZW50IGthbm4gbmljaHQgZmVobGVyZnJlaSB2ZXJzY2hvYmVuIHdlcmRlbi4NCi1yZW5hbWVEaWFsb2dfcmVuYW1lRXJyb3I9SVVQQTAwMzhFOiBEYXMgRWxlbWVudCBrYW5uIG5pY2h0IGZlaGxlcmZyZWkgdW1iZW5hbm50IHdlcmRlbi4NCi1lcnJvckRpYWxvZ19jcmVhdGVFcnJvcj1JVVBBMDAzOUU6IERhcyBFbGVtZW50IGthbm4gbmljaHQgZmVobGVyZnJlaSBlcnN0ZWxsdCB3ZXJkZW4uDQotZHVwbGljYXRlUGx1Z2luTmFtZUVycm9yX21zZz1JVVBBMDEwMUU6IERlciBOYW1lICcnezB9JycgaXN0IGJlcmVpdHMgdm9yaGFuZGVuLiBHZWJlbiBTaWUgZWluZW4gYW5kZXJlbiBOYW1lbiBlaW4gdW5kIHdpZWRlcmhvbGVuIFNpZSBkaWUgT3BlcmF0aW9uLg0KLQ0KLSNOZXcgU3RyaW5ncyBmb3IgUHJvY2Vzc0VkaXRvciBDb250ZXh0IG1lbnUgZGlhZ3JhbSBpbWFnZXMNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRBREltYWdlPUdyYWZpayBmXHUwMGZjciBBa3Rpdml0XHUwMGU0dHNkaWFncmFtbSB6dW9yZG5lbi4uLg0KLVByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yVGl0bGU9QWt0dWFsaXNpZXJ1bmdzZmVobGVyDQotUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JNc2c9RmVobGVyIGJlaW0gQWt0dWFsaXNpZXJlbiBkZXMgRWRpdG9ycw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFEREltYWdlPUdyYWZpayBmXHUwMGZjciBBa3Rpdml0XHUwMGU0dHNkZXRhaWxkaWFncmFtbSB6dW9yZG5lbi4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZFdQREltYWdlPUdyYWZpayBmXHUwMGZjciBBcmJlaXRzZXJnZWJuaXNhYmhcdTAwZTRuZ2lna2VpdHNkaWFncmFtbSB6dW9yZG5lbi4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFESW1hZ2VJblB1Ymxpc2hpbmc9R3JhZmlrIGZcdTAwZmNyIEFrdGl2aXRcdTAwZTR0c2RpYWdyYW1tIGluIFZlclx1MDBmNmZmZW50bGljaHVuZyB2ZXJ3ZW5kZW4NCi1Qcm9jZXNzRWRpdG9yX3Byb21wdFRvRGVsZXRlQmVmb3JlU3VwcHJlc3M9RGllIHVudGVyIERldGFpbHMgYXVmZ2VsaXN0ZXRlbiB1bnRlcmRyXHUwMGZjY2t0ZW4gRGVza3JpcHRvcmVuIG1cdTAwZmNzc2VuIGdlbFx1MDBmNnNjaHQgd2VyZGVuLCB1bSBuYWNoIGRlbSBVbnRlcmRyXHUwMGZjY2tlbiBkZXIgYXVzZ2V3XHUwMGU0aGx0ZW4gRWxlbWVudGUgRHVwbGl6aWVydW5nZW4genUgdmVybWVpZGVuLiBLbGlja2VuIFNpZSBhdWYgT0ssIHdlbm4gU2llIGRpZSBEZXNrcmlwdG9yZW4gbFx1MDBmNnNjaGVuIHVuZCBmb3J0ZmFocmVuIG1cdTAwZjZjaHRlbi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VBRERJbWFnZUluUHVibGlzaGluZz1HcmFmaWsgZlx1MDBmY3IgQWt0aXZpdFx1MDBlNHRzZGV0YWlsZGlhZ3JhbW0gaW4gVmVyXHUwMGY2ZmZlbnRsaWNodW5nIHZlcndlbmRlbg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZVdQREltYWdlSW5QdWJsaXNoaW5nPUdyYWZpayBmXHUwMGZjciBBcmJlaXRzZXJnZWJuaXNhYmhcdTAwZTRuZ2lna2VpdHNkaWFncmFtbSBpbiBWZXJcdTAwZjZmZmVudGxpY2h1bmcgdmVyd2VuZGVuDQotUHJvY2Vzc0VkaXRvcl9EaWFncmFtSW1hZ2VfSW5wdXREaWFsb2dfaW5pdGlhbFZhbHVlPUdyYWZpa3BmYWQNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TaG93TGlua2VkRWxlbWVudGluTGlicmFyeVZpZXc9VmVybGlua3RlcyBFbGVtZW50IGluIEJpYmxpb3QmaGVrc3NpY2h0IGFuemVpZ2VuDQotUHJvY2Vzc0VkaXRvcl91cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uX2xhYmVsPVVudGVyZHJcdTAwZmNja3RlIEVsZW1lbnRlIGluICZCYXNpcyBha3R1YWxpc2llcmVuDQotUHJvY2Vzc0VkaXRvcl9Db250ZXh0TWVudV9EaWFncmFtSW1hZ2VzPURpYWdyYW1tZ3JhZmlrZW4NCi0NCi0jU3RyaW5ncyBmb3Igc3luY2hyb25pemF0aW9uIHdpemFyZCBvbiBwcm9jZXNzIGVkaXRvcidzIEJTDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90aXRsZT1TeW5jaHJvbmlzYXRpb25zYmVzY2hyZWlidW5nDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90ZXh0PUxlc2VuIFNpZSBkaWUgZm9sZ2VuZGVuIEluZm9ybWF0aW9uZW4genVyIGJlbnV0emVyZGVmaW5pZXJ0ZW4gU3luY2hyb25pc2F0aW9uLg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RpdGxlPUtvbmZpZ3VyYXRpb24gYXVzd1x1MDBlNGhsZW4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0PVdcdTAwZTRobGVuIFNpZSBkaWUgS29uZmlndXJhdGlvbiBhdXMsIGRpZSBTaWUgZlx1MDBmY3IgZGllIFN5bmNocm9uaXNhdGlvbiB2ZXJ3ZW5kZW4gbVx1MDBmNmNodGVuLiBcDQotSWhyZSBBdXN3YWhsIGJlc3RpbW10LCB3ZWxjaGUgQmVpdHJcdTAwZTRnZSB1bmQgRXJzZXR6dW5nZW4gZlx1MDBmY3IgZGllIFN5bmNocm9uaXNhdGlvbiB2ZXJ3ZW5kZXQgd2VyZGVuLg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX2NvbmZpZ0xhYmVsPUtvbmZpZ3VyYXRpb246DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RpdGxlPVp1IHN5bmNocm9uaXNpZXJlbmRlIEVpZ2Vuc2NoYWZ0ZW4gYXVzd1x1MDBlNGhsZW4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJvcGVydGllc19sYWJsZT1FaWdlbnNjaGFmdGVuDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX25hbWVfbGFibGU9TmFtZQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmVzZW50YXRpb25OYW1lX2xhYmxlPVByXHUwMGU0c2VudGF0aW9uc25hbWUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYnJpZWZEZXNjX2xhYmxlPUt1cnpiZXNjaHJlaWJ1bmcNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3B0aW9uYWxJbm91dHNfbGFiZWw9T3B0aW9uYWxlIEVpbmdhYmVuDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX21hbmRhdG9yeUlucHV0c19sYWJsZT1WZXJiaW5kbGljaGUgRWluZ2FiZW4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3V0cHV0c19sYWJlbD1BdXNnYWJlbg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX2xhYmVsPVByaW1cdTAwZTRyZXIgQXVzZlx1MDBmY2hyZW5kZXINCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYWRkblBlcmZvcm1lcnNfbGFibGU9WnVzXHUwMGU0dHpsaWNoZSBBdXNmXHUwMGZjaHJlbmRlDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Jlc3BvbnNpYmxlUm9sZXNfbGFibGU9VmVyYW50d29ydGxpY2hlIFJvbGxlbg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9jb250bkFydGlmYWN0c19sYWJlbD1FbnRoYWx0ZW5lIEFydGVmYWt0ZQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9kaWx2ZWRQYXJ0c19sYWJlbD1UZWlsZSBkZXMgTGllZmVyZ2VnZW5zdGFuZHMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfc2VsU3RlcHNfbGFiZWw9QXVzd2FobCBkZXIgU2Nocml0dGUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGV4dD1XXHUwMGU0aGxlbiBTaWUgZGllIEVpZ2Vuc2NoYWZ0ZW4gZGVzIE1ldGhvZGVuaW5oYWx0cyBhdXMsIGRpZSBiZWkgZGVyIFN5bmNocm9uaXNhdGlvbiBiZXJcdTAwZmNja3NpY2h0aWd0IHdlcmRlbiBzb2xsZW4uDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RpdGxlPVN5bmNocm9uaXNhdGlvbnN2b3JzY2hhdQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90ZXh0PVx1MDBkY2JlcnByXHUwMGZjZmVuIFNpZSBkaWUgdm9yZ2VzY2hsYWdlbmVuIFN5bmNocm9uaXNhdGlvbnNkZXRhaWxzLg0KLXNlbGVjdEVkaXRvcnNUb0Rpc2NhcmRDb25mbGljdENoYW5nZXM9RXMgc2luZCBuaWNodCBnZXNwZWljaGVydGUgXHUwMGM0bmRlcnVuZ2VuIHZvcmhhbmRlbiwgZGllIG1pdCBcdTAwYzRuZGVydW5nZW4gaW4gS29uZmxpa3Qgc3RlaGVuLCBkaWUgYXVcdTAwZGZlcmhhbGIgZGVyIEVkaXRvcmVuIHZvcmdlbm9tbWVuIHd1cmRlbi5cblwNCi1XXHUwMGU0aGxlbiBTaWUgZGllIEVkaXRvcmVuIGF1cywgZGVyZW4gXHUwMGM0bmRlcnVuZ2VuIFNpZSB2ZXJ3ZXJmZW4gbVx1MDBmNmNodGVuLg0KLXN5bmNocm9uaXphdGlvbldpemFyZF90aXRsZV90ZXh0PVN5bmNocm9uaXNhdGlvbnNhc3Npc3RlbnQNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX2V4cGxhaW5UZXh0PURpZXNlciBBc3Npc3RlbnQgdW50ZXJzdFx1MDBmY3R6dCBTaWUgYmVpbSBBa3R1YWxpc2llcmVuIGRlciBhdXNnZXdcdTAwZTRobHRlbiBEZXNrcmlwdG9yZW4gYnp3LiBhbGxlciBEZXNrcmlwdG9yZW4gdW50ZXJoYWxiIGRlciBhdXNnZXdcdTAwZTRobHRlbiBBa3Rpdml0XHUwMGU0dGVuLCBkaWUgYXVmIGRlciBSZWdpc3RlcmthcnRlIEFsbGdlbWVpbiBpaHJlciBFaWdlbnNjaGFmdGVuc2ljaHQgbWl0ICJTeW5jaHJvbmlzaWVydCBtaXQgUXVlbGxlIiBnZWtlbm56ZWljaG5ldCBzaW5kLiBcDQotRXMgd2VyZGVuIG51ciBkaWUgRWlnZW5zY2hhZnRlbiwgZGllIFNpZSBpbiBkaWVzZW0gQXNzaXN0ZW50ZW4gYXVzd1x1MDBlNGhsZW4sIGluIGRlbiBEZXNrcmlwdG9yZW4gYWt0dWFsaXNpZXJ0LiBcDQotQmVpIGRlciBCZXJlY2hudW5nIGRlciBBa3R1YWxpc2llcnVuZyBrXHUwMGY2bm5lbiBTaWUgamVkZSBnXHUwMGZjbHRpZ2UgS29uZmlndXJhdGlvbiBmXHUwMGZjciBJaHJlbiBQcm96ZXNzIHZlcndlbmRlbi4gXA0KLURlciBBc3Npc3RlbnQgYWt0dWFsaXNpZXJ0IGtlaW5lIGR5bmFtaXNjaCB2ZXJsaW5rdGVuIERlc2tyaXB0b3JlbiAoZ3JcdTAwZmNuZSBLdXJzaXZzY2hyaWZ0KS4NCi0NCi1vcGVuUlRFPVJpY2ggVGV4dCBFZGl0b3IgXHUwMGY2ZmZuZW4NCi1jbG9zZVJURT1SaWNoIFRleHQgRWRpdG9yIHNjaGxpZVx1MDBkZmVuDQotDQotI05ldyBTdHJpbmdzDQotcm9sZXNldHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1BbmxlaXR1bmcgZlx1MDBmY3IgZGllc2UgUm9sbGVuZ3J1cHBlIHZlcndhbHRlbi4NCi1kaXNjaXBsaW5lc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFubGVpdHVuZyBmXHUwMGZjciBkaWVzZSBEaXN6aXBsaW4gdmVyd2FsdGVuLg0KLXdvcmtwcm9kdWN0dHlwZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1BbmxlaXR1bmcgZlx1MDBmY3IgZGllc2UgQXJ0IHZvbiBBcmJlaXRzZXJnZWJuaXNzZW4gdmVyd2FsdGVuLg0KLWRvbWFpbnNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1BbmxlaXR1bmcgZlx1MDBmY3IgZGllc2UgRG9tXHUwMGU0bmUgdmVyd2FsdGVuLg0KLXRvb2xzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QW5sZWl0dW5nIGZcdTAwZmNyIGRpZXNlcyBUb29sIHZlcndhbHRlbi4NCi1jdXN0b21jYXRlZ29yeV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFubGVpdHVuZyBmXHUwMGZjciBkaWVzZSBhbmdlcGFzc3RlIEthdGVnb3JpZSB2ZXJ3YWx0ZW4uDQotDQotY29uY2VwdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFubGVpdHVuZyBmXHUwMGZjciBkaWVzZXMgS29uemVwdCB2ZXJ3YWx0ZW4uDQotY2hlY2tsaXN0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QW5sZWl0dW5nIGZcdTAwZmNyIGRpZXNlIFByXHUwMGZjZmxpc3RlIHZlcndhbHRlbi4NCi1leGFtcGxlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QW5sZWl0dW5nIGZcdTAwZmNyIGRpZXNlcyBCZWlzcGllbCB2ZXJ3YWx0ZW4uDQotZ3VpZGVsaW5lX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QW5sZWl0dW5nIGZcdTAwZmNyIGRpZXNlIFJpY2h0bGluaWUgdmVyd2FsdGVuLg0KLXJvYWRtYXBfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1BbmxlaXR1bmcgZlx1MDBmY3IgZGllc2UgUm9hZG1hcCB2ZXJ3YWx0ZW4uDQotcmV1c2FibGVhc3NldF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFubGVpdHVuZyBmXHUwMGZjciBkaWVzZXMgd2llZGVydmVyd2VuZGJhcmUgQXNzZXQgdmVyd2FsdGVuLg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFubGVpdHVuZyBmXHUwMGZjciBkaWVzZXMgdW50ZXJzdFx1MDBmY3R6ZW5kZSBNYXRlcmlhbCB2ZXJ3YWx0ZW4uDQotcmVwb3J0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QW5sZWl0dW5nIGZcdTAwZmNyIGRpZXNlbiBCZXJpY2h0IHZlcndhbHRlbi4NCi1wcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFubGVpdHVuZyBmXHUwMGZjciBkaWVzZXMgVmVyZmFocmVuIHZlcndhbHRlbi4NCi10ZW1wbGF0ZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFubGVpdHVuZyBmXHUwMGZjciBkaWVzZSBWb3JsYWdlIHZlcndhbHRlbi4NCi10ZXJtZGVmaW5pdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFubGVpdHVuZyBmXHUwMGZjciBkaWVzZSBCZWdyaWZmc2RlZmluaXRpb24gdmVyd2FsdGVuLg0KLXRvb2xtZW50b3JfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1BbmxlaXR1bmcgZlx1MDBmY3IgZGllc2VuIFRvb2xtZW50b3IgdmVyd2FsdGVuLg0KLXdoaXRlcGFwZXJfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1BbmxlaXR1bmcgZlx1MDBmY3IgZGllc2VzIFdoaXRlIFBhcGVyIHZlcndhbHRlbi4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFubGVpdHVuZyBmXHUwMGZjciBkaWVzZW4gU2NoXHUwMGU0dHpmYWt0b3IgdmVyd2FsdGVuLg0KLQ0KLQ0KLSNOZXcgU3RyaW5nIFNlY3Rpb24gRGVzY3JpcHRpb24NCi1yb2xlX2RldGFpbFNlY3Rpb25fZGVzYz1EZXRhaWxsaWVydGUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgUm9sbGUgYW5nZWJlbi4NCi1yb2xlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgUm9sbGUgYW5nZWJlbi4NCi1yb2xlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZSBSb2xsZSBtaXQgZWluZXIgYW5kZXJlbiBSb2xsZSBpbiBCZXppZWh1bmcgc3RlaHQuDQotcm9sZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1WZXJzaW9uc2luZm9ybWF0aW9uZW4genUgZGllc2VyIFJvbGxlIGFuZ2ViZW4uDQotDQotdGFza19kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VyIEF1ZmdhYmUgYW5nZWJlbi4NCi10YXNrX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgQXVmZ2FiZSBhbmdlYmVuLg0KLXRhc2tfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5nZWJlbiwgd2llIGRpZXNlIEF1ZmdhYmUgbWl0IGVpbmVyIGFuZGVyZW4gQXVmZ2FiZSBpbiBCZXppZWh1bmcgc3RlaHQuDQotdGFza192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1WZXJzaW9uc2luZm9ybWF0aW9uZW4genUgZGllc2VyIEF1ZmdhYmUgYW5nZWJlbi4NCi0NCi1hcnRpZmFjdF9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VtIEFydGVmYWt0IGFuZ2ViZW4uDQotYXJ0aWZhY3RfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBBcnRlZmFrdCBhbmdlYmVuLg0KLWFydGlmYWN0X2ljb25TZWN0aW9uX2Rlc2M9U3ltYm9sZSBmXHUwMGZjciBkaWVzZXMgQXJ0ZWZha3QgYW5wYXNzZW4uDQotYXJ0aWZhY3Rfbm90YXRpb25TZWN0aW9uX2Rlc2M9QmVyZWl0c3RlbGx1bmdzaW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gQXJ0ZWZha3QgYW5nZWJlbi4NCi1hcnRpZmFjdF90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9QW5wYXNzdW5nc2luZm9ybWF0aW9uZW4genUgZGllc2VtIEFydGVmYWt0IGFuZ2ViZW4uDQotYXJ0aWZhY3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5nZWJlbiwgd2llIGRpZXNlcyBBcnRlZmFrdCBtaXQgZWluZW0gYW5kZXJlbiBBcnRlZmFrdCBpbiBCZXppZWh1bmcgc3RlaHQuDQotYXJ0aWZhY3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9VmVyc2lvbnNpbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBBcnRlZmFrdCBhbmdlYmVuLg0KLQ0KLW91dGNvbWVfZGV0YWlsU2VjdGlvbl9kZXNjPURldGFpbGxpZXJ0ZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBSZXN1bHRhdCBhbmdlYmVuLg0KLW91dGNvbWVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBSZXN1bHRhdCBhbmdlYmVuLg0KLW91dGNvbWVfaWNvblNlY3Rpb25fZGVzYz1TeW1ib2xlIGZcdTAwZmNyIGRpZXNlcyBSZXN1bHRhdCBhbnBhc3Nlbi4NCi1vdXRjb21lX25vdGF0aW9uU2VjdGlvbl9kZXNjPUJlcmVpdHN0ZWxsdW5nc2luZm9ybWF0aW9uZW4genUgZGllc2VtIFJlc3VsdGF0IGFuZ2ViZW4uDQotb3V0Y29tZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9QW5wYXNzdW5nc2luZm9ybWF0aW9uZW4genUgZGllc2VtIFJlc3VsdGF0IGFuZ2ViZW4uDQotb3V0Y29tZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdlYmVuLCB3aWUgZGllc2VzIFJlc3VsdGF0IG1pdCBlaW5lbSBhbmRlcmVuIFJlc3VsdGF0IGluIEJlemllaHVuZyBzdGVodC4NCi1vdXRjb21lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVZlcnNpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gUmVzdWx0YXQgYW5nZWJlbi4NCi0NCi1kZWxpdmVyYWJsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VtIExpZWZlcmdlZ2Vuc3RhbmQgYW5nZWJlbi4NCi1kZWxpdmVyYWJsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VtIExpZWZlcmdlZ2Vuc3RhbmQgYW5nZWJlbi4NCi1kZWxpdmVyYWJsZV9pY29uU2VjdGlvbl9kZXNjPVN5bWJvbGUgZlx1MDBmY3IgZGllc2VuIExpZWZlcmdlZ2Vuc3RhbmQgYW5wYXNzZW4uDQotZGVsaXZlcmFibGVfbm90YXRpb25TZWN0aW9uX2Rlc2M9QmVyZWl0c3RlbGx1bmdzaW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gTGllZmVyZ2VnZW5zdGFuZCBhbmdlYmVuLg0KLWRlbGl2ZXJhYmxlX3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1BbnBhc3N1bmdzaW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gTGllZmVyZ2VnZW5zdGFuZCBhbmdlYmVuLg0KLWRlbGl2ZXJhYmxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZXIgTGllZmVyZ2VnZW5zdGFuZCBtaXQgZWluZW0gYW5kZXJlbiBMaWVmZXJnZWdlbnN0YW5kIGluIEJlemllaHVuZyBzdGVodC4NCi1kZWxpdmVyYWJsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1WZXJzaW9uc2luZm9ybWF0aW9uZW4genUgZGllc2VtIExpZWZlcmdlZ2Vuc3RhbmQgYW5nZWJlbi4NCi0NCi1kaXNjaXBsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1EZXRhaWxsaWVydGUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgRGlzemlwbGluIGFuZ2ViZW4uDQotZGlzY2lwbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VyIERpc3ppcGxpbiBhbmdlYmVuLg0KLWRpc2NpcGxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5nZWJlbiwgd2llIGRpZXNlIERpc3ppcGxpbiBtaXQgZWluZXIgYW5kZXJlbiBEaXN6aXBsaW4gaW4gQmV6aWVodW5nIHN0ZWh0Lg0KLWRpc2NpcGxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9VmVyc2lvbnNpbmZvcm1hdGlvbmVuIHp1IGRpZXNlciBEaXN6aXBsaW4gYW5nZWJlbi4NCi0NCi1kb21haW5fZGV0YWlsU2VjdGlvbl9kZXNjPURldGFpbGxpZXJ0ZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlciBEb21cdTAwZTRuZSBhbmdlYmVuLg0KLWRvbWFpbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VyIERvbVx1MDBlNG5lIGFuZ2ViZW4uDQotZG9tYWluX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZSBEb21cdTAwZTRuZSBtaXQgZWluZXIgYW5kZXJlbiBEb21cdTAwZTRuZSBpbiBCZXppZWh1bmcgc3RlaHQuDQotZG9tYWluX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVZlcnNpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgRG9tXHUwMGU0bmUgYW5nZWJlbi4NCi0NCi13b3JrcHJvZHVjdHR5cGVfZGV0YWlsU2VjdGlvbl9kZXNjPURldGFpbGxpZXJ0ZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlciBBcnQgdm9uIEFyYmVpdHNlcmdlYm5pc3NlbiBhbmdlYmVuLg0KLXdvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VyIEFydCB2b24gQXJiZWl0c2VyZ2Vibmlzc2VuIGFuZ2ViZW4uDQotd29ya3Byb2R1Y3R0eXBlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZSBBcnQgdm9uIEFyYmVpdHNlcmdlYm5pc3NlbiBtaXQgZWluZXIgYW5kZXJlbiBBcnQgdm9uIEFyYmVpdHNlcmdlYm5pc3NlbiBpbiBCZXppZWh1bmcgc3RlaHQuDQotd29ya3Byb2R1Y3R0eXBlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVZlcnNpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgQXJ0IHZvbiBBcmJlaXRzZXJnZWJuaXNzZW4gYW5nZWJlbi4NCi0NCi1yb2xlc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1EZXRhaWxsaWVydGUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgUm9sbGVuZ3J1cHBlIGFuZ2ViZW4uDQotcm9sZXNldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VyIFJvbGxlbmdydXBwZSBhbmdlYmVuLg0KLXJvbGVzZXRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5nZWJlbiwgd2llIGRpZXNlIFJvbGxlbmdydXBwZSBtaXQgZWluZXIgYW5kZXJlbiBSb2xsZW5ncnVwcGUgaW4gQmV6aWVodW5nIHN0ZWh0Lg0KLXJvbGVzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9VmVyc2lvbnNpbmZvcm1hdGlvbmVuIHp1IGRpZXNlciBSb2xsZW5ncnVwcGUgYW5nZWJlbi4NCi0NCi10b29sX2RldGFpbFNlY3Rpb25fZGVzYz1EZXRhaWxsaWVydGUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gVG9vbCBhbmdlYmVuLg0KLXRvb2xfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBUb29sIGFuZ2ViZW4uDQotdG9vbF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdlYmVuLCB3aWUgZGllc2VzIFRvb2wgbWl0IGVpbmVtIGFuZGVyZW4gVG9vbCBpbiBCZXppZWh1bmcgc3RlaHQuDQotdG9vbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1WZXJzaW9uc2luZm9ybWF0aW9uZW4genUgZGllc2VtIFRvb2wgYW5nZWJlbi4NCi0NCi1jb25jZXB0X2RldGFpbFNlY3Rpb25fZGVzYz1EZXRhaWxsaWVydGUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gS29uemVwdCBhbmdlYmVuLg0KLWNvbmNlcHRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBLb256ZXB0IGFuZ2ViZW4uDQotY29uY2VwdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdlYmVuLCB3aWUgZGllc2VzIEtvbnplcHQgbWl0IGVpbmVtIGFuZGVyZW4gS29uemVwdCBpbiBCZXppZWh1bmcgc3RlaHQuDQotY29uY2VwdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1WZXJzaW9uc2luZm9ybWF0aW9uZW4genUgZGllc2VtIEtvbnplcHQgYW5nZWJlbi4NCi0NCi1jaGVja2xpc3RfZGV0YWlsU2VjdGlvbl9kZXNjPURldGFpbGxpZXJ0ZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlciBQclx1MDBmY2ZsaXN0ZSBhbmdlYmVuLg0KLWNoZWNrbGlzdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VyIFByXHUwMGZjZmxpc3RlIGFuZ2ViZW4uDQotY2hlY2tsaXN0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZSBQclx1MDBmY2ZsaXN0ZSBtaXQgZWluZXIgYW5kZXJlbiBQclx1MDBmY2ZsaXN0ZSBpbiBCZXppZWh1bmcgc3RlaHQuDQotY2hlY2tsaXN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVZlcnNpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgUHJcdTAwZmNmbGlzdGUgYW5nZWJlbi4NCi0NCi1leGFtcGxlX2RldGFpbFNlY3Rpb25fZGVzYz1EZXRhaWxsaWVydGUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gQmVpc3BpZWwgYW5nZWJlbi4NCi1leGFtcGxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gQmVpc3BpZWwgYW5nZWJlbi4NCi1leGFtcGxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZXMgQmVpc3BpZWwgbWl0IGVpbmVtIGFuZGVyZW4gQmVpc3BpZWwgaW4gQmV6aWVodW5nIHN0ZWh0Lg0KLWV4YW1wbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9VmVyc2lvbnNpbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBCZWlzcGllbCBhbmdlYmVuLg0KLQ0KLWd1aWRlbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VyIFJpY2h0bGluaWUgYW5nZWJlbi4NCi1ndWlkZWxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlciBSaWNodGxpbmllIGFuZ2ViZW4uDQotZ3VpZGVsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZSBSaWNodGxpbmllIG1pdCBlaW5lciBhbmRlcmVuIFJpY2h0bGluaWUgaW4gQmV6aWVodW5nIHN0ZWh0Lg0KLWd1aWRlbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1WZXJzaW9uc2luZm9ybWF0aW9uZW4genUgZGllc2VyIFJpY2h0bGluaWUgYW5nZWJlbi4NCi0NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VtIFNjaFx1MDBlNHR6ZmFrdG9yIGFuZ2ViZW4uDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBTY2hcdTAwZTR0emZha3RvciBhbmdlYmVuLg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZXIgU2NoXHUwMGU0dHpmYWt0b3IgbWl0IGVpbmVtIGFuZGVyZW4gU2NoXHUwMGU0dHpmYWt0b3IgaW4gQmV6aWVodW5nIHN0ZWh0Lg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVZlcnNpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gU2NoXHUwMGU0dHpmYWt0b3IgYW5nZWJlbi4NCi0NCi1wcmFjdGljZV9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VtIFZlcmZhaHJlbiBhbmdlYmVuLg0KLXByYWN0aWNlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gVmVyZmFocmVuIGFuZ2ViZW4uDQotcHJhY3RpY2VfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5nZWJlbiwgd2llIGRpZXNlcyBWZXJmYWhyZW4gbWl0IGVpbmVtIGFuZGVyZW4gVmVyZmFocmVuIGluIEJlemllaHVuZyBzdGVodC4NCi1wcmFjdGljZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1WZXJzaW9uc2luZm9ybWF0aW9uZW4genUgZGllc2VtIFZlcmZhaHJlbiBhbmdlYmVuLg0KLQ0KLXJlcG9ydF9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VtIEJlcmljaHQgYW5nZWJlbi4NCi1yZXBvcnRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBCZXJpY2h0IGFuZ2ViZW4uDQotcmVwb3J0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZXIgQmVyaWNodCBtaXQgZWluZW0gYW5kZXJlbiBCZXJpY2h0IGluIEJlemllaHVuZyBzdGVodC4NCi1yZXBvcnRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9VmVyc2lvbnNpbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBCZXJpY2h0IGFuZ2ViZW4uDQotDQotcmVzdWFibGVhc3NldF9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VtIHdpZWRlcnZlcndlbmRiYXJlbiBBc3NldCBhbmdlYmVuLg0KLXJlc3VhYmxlYXNzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSB3aWVkZXJ2ZXJ3ZW5kYmFyZW4gQXNzZXQgYW5nZWJlbi4NCi1yZXN1YWJsZWFzc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZXMgd2llZGVydmVyd2VuZGJhcmUgQXNzZXQgbWl0IGVpbmVtIGFuZGVyZW4gd2llZGVydmVyd2VuZGJhcmVuIEFzc2V0IGluIEJlemllaHVuZyBzdGVodC4NCi1yZXN1YWJsZWFzc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVZlcnNpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gd2llZGVydmVyd2VuZGJhcmVuIEFzc2V0IGFuZ2ViZW4uDQotDQotcm9hZG1hcF9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VyIFJvYWRtYXAgYW5nZWJlbi4NCi1yb2FkbWFwX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgUm9hZG1hcCBhbmdlYmVuLg0KLXJvYWRtYXBfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5nZWJlbiwgd2llIGRpZXNlIFJvYWRtYXAgbWl0IGVpbmVyIGFuZGVyZW4gUm9hZG1hcCBpbiBCZXppZWh1bmcgc3RlaHQuDQotcm9hZG1hcF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1WZXJzaW9uc2luZm9ybWF0aW9uZW4genUgZGllc2VyIFJvYWRtYXAgYW5nZWJlbi4NCi0NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZGV0YWlsU2VjdGlvbl9kZXNjPURldGFpbGxpZXJ0ZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSB1bnRlcnN0XHUwMGZjdHplbmRlbiBNYXRlcmlhbCBhbmdlYmVuLg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VtIHVudGVyc3RcdTAwZmN0emVuZGVuIE1hdGVyaWFsIGFuZ2ViZW4uDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZXMgdW50ZXJzdFx1MDBmY3R6ZW5kZSBNYXRlcmlhbCBtaXQgYW5kZXJlbSB1bnRlcnN0XHUwMGZjdHplbmRlbiBNYXRlcmlhbCBpbiBCZXppZWh1bmcgc3RlaHQuDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVZlcnNpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gdW50ZXJzdFx1MDBmY3R6ZW5kZW4gTWF0ZXJpYWwgYW5nZWJlbi4NCi0NCi10ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VyIFZvcmxhZ2UgYW5nZWJlbi4NCi10ZW1wbGF0ZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VyIFZvcmxhZ2UgYW5nZWJlbi4NCi10ZW1wbGF0ZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdlYmVuLCB3aWUgZGllc2UgVm9ybGFnZSBtaXQgZWluZXIgYW5kZXJlbiBWb3JsYWdlIGluIEJlemllaHVuZyBzdGVodC4NCi10ZW1wbGF0ZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1WZXJzaW9uc2luZm9ybWF0aW9uZW4genUgZGllc2VyIFZvcmxhZ2UgYW5nZWJlbi4NCi0NCi10ZXJtZGVmaW5pdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VyIEJlZ3JpZmZzZGVmaW5pdGlvbiBhbmdlYmVuLg0KLXRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgQmVncmlmZnNkZWZpbml0aW9uIGFuZ2ViZW4uDQotdGVybWRlZmluaXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5nZWJlbiwgd2llIGRpZXNlIEJlZ3JpZmZzZGVmaW5pdGlvbiBtaXQgZWluZXIgYW5kZXJlbiBCZWdyaWZmc2RlZmluaXRpb24gaW4gQmV6aWVodW5nIHN0ZWh0Lg0KLXRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVZlcnNpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgQmVncmlmZnNkZWZpbml0aW9uIGFuZ2ViZW4uDQotDQotdG9vbG1lbnRvcl9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VtIFRvb2xtZW50b3IgYW5nZWJlbi4NCi10b29sbWVudG9yX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gVG9vbG1lbnRvciBhbmdlYmVuLg0KLXRvb2xtZW50b3JfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5nZWJlbiwgd2llIGRpZXNlciBUb29sbWVudG9yIG1pdCBlaW5lbSBhbmRlcmVuIFRvb2xtZW50b3IgaW4gQmV6aWVodW5nIHN0ZWh0Lg0KLXRvb2xtZW50b3JfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9VmVyc2lvbnNpbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBUb29sbWVudG9yIGFuZ2ViZW4uDQotDQotd2hpdGVwYXBlcl9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VtIFdoaXRlIFBhcGVyIGFuZ2ViZW4uDQotd2hpdGVwYXBlcl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VtIFdoaXRlIFBhcGVyIGFuZ2ViZW4uDQotd2hpdGVwYXBlcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdlYmVuLCB3aWUgZGllc2VzIFdoaXRlIFBhcGVyIG1pdCBlaW5lbSBhbmRlcmVuIFdoaXRlIFBhcGVyIGluIEJlemllaHVuZyBzdGVodC4NCi13aGl0ZXBhcGVyX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVZlcnNpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gV2hpdGUgUGFwZXIgYW5nZWJlbi4NCi0NCi1kaXNjaXBsaW5lZ3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjPURldGFpbGxpZXJ0ZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlciBEaXN6aXBsaW5ncnVwcGllcnVuZyBhbmdlYmVuLg0KLWRpc2NpcGxpbmVncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VyIERpc3ppcGxpbmdydXBwaWVydW5nIGFuZ2ViZW4uDQotZGlzY2lwbGluZWdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZSBEaXN6aXBsaW5ncnVwcGllcnVuZyBtaXQgZWluZXIgYW5kZXJlbiBEaXN6aXBsaW5ncnVwcGllcnVuZyBpbiBCZXppZWh1bmcgc3RlaHQuDQotZGlzY2lwbGluZWdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVZlcnNpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgRGlzemlwbGluZ3J1cHBpZXJ1bmcgYW5nZWJlbi4NCi0NCi1yb2xlc2V0Z3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjPURldGFpbGxpZXJ0ZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlciBHcnVwcGllcnVuZyB2b24gUm9sbGVuZ3J1cHBlbiBhbmdlYmVuLg0KLXJvbGVzZXRncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VyIEdydXBwaWVydW5nIHZvbiBSb2xsZW5ncnVwcGVuIGFuZ2ViZW4uDQotcm9sZXNldGdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2ViZW4sIHdpZSBkaWVzZSBHcnVwcGllcnVuZyB2b24gUm9sbGVuZ3J1cHBlbiBtaXQgZWluZXIgYW5kZXJlbiBHcnVwcGllcnVuZyB2b24gUm9sbGVuZ3J1cHBlbiBpbiBCZXppZWh1bmcgc3RlaHQuDQotcm9sZXNldGdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVZlcnNpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgR3J1cHBpZXJ1bmcgdm9uIFJvbGxlbmdydXBwZW4gYW5nZWJlbi4NCi0NCi1jdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M9RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VyIGFuZ2VwYXNzdGVuIEthdGVnb3JpZSBhbmdlYmVuLg0KLWN1c3RvbWNhdGVnb3J5X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgYW5nZXBhc3N0ZW4gS2F0ZWdvcmllIGFuZ2ViZW4uDQotY3VzdG9tY2F0ZWdvcnlfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5nZWJlbiwgd2llIGRpZXNlIGFuZ2VwYXNzdGUgS2F0ZWdvcmllIG1pdCBlaW5lciBhbmRlcmVuIGFuZ2VwYXNzdGVuIEthdGVnb3JpZSBpbiBCZXppZWh1bmcgc3RlaHQuDQotY3VzdG9tY2F0ZWdvcnlfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9VmVyc2lvbnNpbmZvcm1hdGlvbmVuIHp1IGRpZXNlciBhbmdlcGFzc3RlbiBLYXRlZ29yaWUgYW5nZWJlbi4NCi1jdXN0b21jYXRlZ29yeV9JY29uU2VjdGlvbl9kZXNjPVN5bWJvbGUgZlx1MDBmY3IgZGllc2UgYW5nZXBhc3N0ZSBLYXRlZ29yaWUgYW5wYXNzZW4uDQotDQotY29uY2VwdF9pY29uU2VjdGlvbl9kZXNjPVN5bWJvbGUgZlx1MDBmY3IgZGllc2VzIEtvbnplcHQgYW5wYXNzZW4uDQotY2hlY2tsaXN0X2ljb25TZWN0aW9uX2Rlc2M9U3ltYm9sZSBmXHUwMGZjciBkaWVzZSBQclx1MDBmY2ZsaXN0ZSBhbnBhc3Nlbi4NCi10b29sbWVudG9yX2ljb25TZWN0aW9uX2Rlc2M9U3ltYm9sZSBmXHUwMGZjciBkaWVzZW4gVG9vbG1lbnRvciBhbnBhc3Nlbi4NCi13aGl0ZXBhcGVyX2ljb25TZWN0aW9uX2Rlc2M9U3ltYm9sZSBmXHUwMGZjciBkaWVzZXMgV2hpdGUgUGFwZXIgYW5wYXNzZW4uDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25faWNvblNlY3Rpb25fZGVzYz1TeW1ib2xlIGZcdTAwZmNyIGRpZXNlbiBTY2hcdTAwZTR0emZha3RvciBhbnBhc3Nlbi4NCi10ZXJtZGVmaW5pdGlvbl9pY29uU2VjdGlvbl9kZXNjPVN5bWJvbGUgZlx1MDBmY3IgZGllc2UgQmVncmlmZnNkZWZpbml0aW9uIGFucGFzc2VuLg0KLXRlbXBsYXRlX2ljb25TZWN0aW9uX2Rlc2M9U3ltYm9sZSBmXHUwMGZjciBkaWVzZSBWb3JsYWdlIGFucGFzc2VuLg0KLXJldXNhYmxlYXNzZXRfaWNvblNlY3Rpb25fZGVzYz1TeW1ib2xlIGZcdTAwZmNyIGRpZXNlcyB3aWVkZXJ2ZXJ3ZW5kYmFyZSBBc3NldCBhbnBhc3Nlbi4NCi1yZXBvcnRfaWNvblNlY3Rpb25fZGVzYz1TeW1ib2xlIGZcdTAwZmNyIGRpZXNlbiBCZXJpY2h0IGFucGFzc2VuLg0KLXByYWN0aWNlX2ljb25TZWN0aW9uX2Rlc2M9U3ltYm9sZSBmXHUwMGZjciBkaWVzZXMgVmVyZmFocmVuIGFucGFzc2VuLg0KLWV4YW1wbGVfaWNvblNlY3Rpb25fZGVzYz1TeW1ib2xlIGZcdTAwZmNyIGRpZXNlcyBCZWlzcGllbCBhbnBhc3Nlbi4NCi1ndWlkZWxpbmVfaWNvblNlY3Rpb25fZGVzYz1TeW1ib2xlIGZcdTAwZmNyIGRpZXNlIFJpY2h0bGluaWUgYW5wYXNzZW4uDQotcm9hZG1hcF9pY29uU2VjdGlvbl9kZXNjPVN5bWJvbGUgZlx1MDBmY3IgZGllc2UgUm9hZG1hcCBhbnBhc3Nlbi4NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfaWNvblNlY3Rpb25fZGVzYz1TeW1ib2xlIGZcdTAwZmNyIGRpZXNlcyB1bnRlcnN0XHUwMGZjdHplbmRlIE1hdGVyaWFsIGFucGFzc2VuLg0KLQ0KLWVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX3RpdGxlPURhdGVpIGdlXHUwMGU0bmRlcnQNCi1lZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY19tZXNzYWdlPURpZSBEYXRlaSB3dXJkZSBpbSBEYXRlaXN5c3RlbSBnZVx1MDBlNG5kZXJ0LiBNXHUwMGY2Y2h0ZW4gU2llIGRpZSBcdTAwYzRuZGVydW5nZW4gbGFkZW4/DQotDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU9QWt0aXZpdFx1MDBlNHRzdmFyaWFiaWxpdFx1MDBlNHQNCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2c9RGllIEFrdGl2aXRcdTAwZTR0ICcnezB9Jycga2FubiBrZWluZSBWYXJpYWJpbGl0XHUwMGU0dCBtaXQgJyd7MX0nJyBzZXR6ZW4sIGRhICcnezF9JycgYmVyZWl0cyBlaW5lIG9kZXIgbWVocmVyZSB6dXNcdTAwZTR0emxpY2hlIG9kZXIgZXJzZXR6dGUgQWt0aXZpdFx1MDBlNHRlbiBhbHMgdW50ZXJnZW9yZG5ldGUgRWxlbWVudGUgZW50aFx1MDBlNGx0Lg0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzE9RGllIEFrdGl2aXRcdTAwZTR0ICcnezB9Jycga2FubiBrZWluZSBWYXJpYWJpbGl0XHUwMGU0dCBtaXQgZWluZXIgaWhyZXIgZGlyZWt0ZW4gXHUwMGZjYmVyZ2VvcmRuZXRlbiBFbGVtZW50ZSB1bmQgUHJvemVzc2Ugc2V0emVuLg0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzI9RGllIEFrdGl2aXRcdTAwZTR0ICcnezB9Jycga2FubiBrZWluZSBWYXJpYWJpbGl0XHUwMGU0dCBtaXQgJyd7MX0nJyBzZXR6ZW4sIGRhIGRpZXMgenUgZWluZXIgU2NobGVpZmVuYWJoXHUwMGU0bmdpZ2tlaXQgZlx1MDBmY2hyZW4gd1x1MDBmY3JkZS4NCi0NCi1hcHBseV9wYXR0ZXJuX2Vycm9yX3RpdGxlPU11c3RlciBhbndlbmRlbg0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnPURpZSBBa3Rpdml0XHUwMGU0dCAnJ3swfScnIGthbm4ga2VpbmUgTXVzdGVyIG1pdCAnJ3sxfScnIGFud2VuZGVuLCBkYSBkaWVzIHp1IGVpbmVyIFNjaGxlaWZlbmFiaFx1MDBlNG5naWdrZWl0IGZcdTAwZmNocmVuIHdcdTAwZmNyZGUuDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfZGVsaW1pdGVyPXwNCi1NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3Nob3dPd25lckluTGlicmFyeVZpZXc9RWlnbmVyIGRpZXNlciBuaWNodCBhdWZnZWxcdTAwZjZzdGVuIFJlZmVyZW56IGluIGRlciBCaWJsaW90aGVrc3NpY2h0IGFuemVpZ2VuDQotTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9yZW1vdmVVbnJlc29sdmVkUmVmZXJlbmNlPU5pY2h0IGF1ZmdlbFx1MDBmNnN0ZSBSZWZlcmVueiBlbnRmZXJuZW4NCi1wcm9tcHREZWxldGVDdXN0b21DYXRlZ29yeUJlZm9yZVJlbW92ZUxhc3RSZWZUb0l0PVNpZSBzaW5kIGRhYmVpLCBkaWUgbGV0enRlIFJlZmVyZW56IGF1ZiB7MH0gaW0gUGx1Zy1pbiB6dSBsXHUwMGY2c2NoZW4uIERpZSBFbGVtZW50ZSB3ZXJkZW4gZ2VsXHUwMGY2c2NodC4gRm9ydGZhaHJlbj8NCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotI0JlbG93IHByb3BlcnR5ICJlZGl0b3JfdGl0bGVfY29sb25fd2l0aF9zcGFjZXMiIHNob3VsZCBub3QgYmUgdHJhbnNsYXRlZA0KLSNEb24ndCBkZWxldGUgYSBzcGFjZSBhZnRlciAiOiAiDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1lZGl0b3JfdGl0bGVfY29sb25fd2l0aF9zcGFjZXM9OiANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDc4ODQyYy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIxNCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRm9ybSBQYWdlIFRpdGxlcw0KLWFzc2lnblBhZ2VfdGl0bGU9QXNpZ25hcg0KLWNhdGVnb3JpZXNQYWdlX3RpdGxlPUNhdGVnb3JcdTAwZWRhcw0KLWRlbGl2ZXJhYmxlUGFydHNQYWdlX3RpdGxlPUNvbXBvbmVudGVzIGRlIHByb2R1Y3RvIGZpbmFsDQotZGVzY3JpcHRpb25QYWdlX3RpdGxlPURlc2NyaXBjaVx1MDBmM24NCi1kaXNjaXBsaW5lc1BhZ2VfdGl0bGU9RGlzY2lwbGluYXMNCi1kaXNjYXJkdW5yZXNvbHZlZHJlZj1EZXNjYXJ0YXIgcmVmZXJlbmNpYXMgc2luIHJlc29sdmVyDQotZ3VpZGFuY2VQYWdlX3RpdGxlPUd1XHUwMGVkYQ0KLXByZXZpZXdQYWdlX3RpdGxlPVZpc3RhIHByZWxpbWluYXINCi1yZWZlcmVuY2VzUGFnZV90aXRsZT1SZWZlcmVuY2lhcw0KLXJlZmVyZW5jZV90ZXh0PVJlZmVyZW5jaWFzOg0KLXJlZmVyZW5jZVdvcmtmbG93UGFnZV90aXRsZT1GbHVqbyBkZSB0cmFiYWpvIGRlIHJlZmVyZW5jaWENCi1yb2xlc1BhZ2VfdGl0bGU9Um9sZXMNCi1yb2xlU2V0c1BhZ2VfdGl0bGU9Q29uanVudG9zIGRlIHJvbGVzDQotc3RlcHNQYWdlX3RpdGxlPVBhc29zDQotdGFza3NQYWdlX3RpdGxlPVRhcmVhcw0KLXRvb2xNZW50b3JzUGFnZV90aXRsZT1HdVx1MDBlZGFzIGRlIGxhIGhlcnJhbWllbnRhDQotd29ya1Byb2R1Y3RzUGFnZV90aXRsZT1Qcm9kdWN0b3MgZGUgdHJhYmFqbw0KLQ0KLSMgU2VjdGlvbiBOYW1lcyAmIERlc2NyaXB0aW9uDQotY2hlY2tJdGVtc1NlY3Rpb25fbmFtZT1FbGVtZW50b3MgZGUgY29tcHJvYmFjaVx1MDBmM24NCi1jaGVja0l0ZW1zU2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGxvcyBlbGVtZW50b3MgZGUgY29tcHJvYmFjaVx1MDBmM24gcXVlIGNvbnN0aXR1eWVuIGVzdGEgbGlzdGEgZGUgY29tcHJvYmFjaVx1MDBmM24uDQotZGVwZW5kZW5jaWVzU2VjdGlvbl9uYW1lPURlcGVuZGVuY2lhcw0KLWRlcGVuZGVuY2llc1NlY3Rpb25fZGVzYz1FbiBlc3RlIGFwYXJ0YWRvIHNlIG11ZXN0cmFuIGxhcyBkZXBlbmRlbmNpYXMgZGUgZXN0ZSBwYXF1ZXRlIGRlIGNvbnRlbmlkbyBjb24gb3Ryb3MgcGFxdWV0ZXMgZGUgY29udGVuaWRvLg0KLWRldGFpbFNlY3Rpb25fbmFtZT1JbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYQ0KLWRldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGU6IHswfS4NCi1nZW5lcmFsSW5mb1NlY3Rpb25fbmFtZT1JbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwNCi1nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlOiB7MH0uDQotaWNvblNlY3Rpb25fbmFtZT1JY29ubw0KLWljb25TZWN0aW9uX2Rlc2M9UGVyc29uYWxpemFyIGxvcyBpY29ub3M6IHswfS4NCi1ub3RhdGlvblNlY3Rpb25fbmFtZT1JbmZvcm1hY2lcdTAwZjNuIGRlIGVudHJlZ2ENCi1ub3RhdGlvblNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGxhIGVudHJlZ2EgYWNlcmNhIGRlIGVzdGUgezB9Lg0KLXJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9uYW1lPVBsdWctaW5zIGNvbiByZWZlcmVuY2lhczoNCi1yZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fZGVzYz1Fc3RhIHNlY2NpXHUwMGYzbiBtdWVzdHJhIHBsdWctaW5zIGEgbG9zIHF1ZSBoYWNlIHJlZmVyZW5jaWEgZXN0ZSBwbHVnLWluIGRlIG1cdTAwZTl0b2RvLg0KLXN0YWZmaW5nU2VjdGlvbl9uYW1lPUluZm9ybWFjaVx1MDBmM24gZGVsIHBlcnNvbmFsDQotc3RhZmZpbmdTZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZWwgcGVyc29uYWwgYWNlcmNhIGRlIGVzdGUgcm9sLg0KLXN0ZXBzU2VjdGlvbl9uYW1lPVBhc29zDQotc3RlcHNTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgbG9zIHBhc29zIG5lY2VzYXJpb3MgcGFyYSByZWFsaXphciBlc3RhIHRhcmVhLg0KLXRhaWxvcmluZ1NlY3Rpb25fbmFtZT1QZXJzb25hbGl6YWNpXHUwMGYzbg0KLXRhaWxvcmluZ1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIHBlcnNvbmFsaXphY2lcdTAwZjNuIGFjZXJjYSBkZTogezB9Lg0KLXZhcmlhYmlsaXR5U2VjdGlvbl9uYW1lPVZhcmlhYmlsaWRhZCBkZSBjb250ZW5pZG8NCi12YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjXHUwMGYzbW8gc2UgcmVsYWNpb25hIHswfSBjb24gb3RybyhhKSB7MH0uDQotdmVyc2lvbkluZm9TZWN0aW9uX25hbWU9SW5mb3JtYWNpXHUwMGYzbiBkZSBsYSB2ZXJzaVx1MDBmM24NCi12ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGxhIHZlcnNpXHUwMGYzbiBhY2VyY2EgZGU6IHswfS4NCi0NCi0jIFVJICYgRWxlbWVudCBBdHRyaWJ1dGUgTGFiZWxzDQotYWRkaXRpb25hbEluZm9fdGV4dD1JbmZvcm1hY2lcdTAwZjNuIGFkaWNpb25hbDoNCi1hcHBsaWNhdGlvbl90ZXh0PUFwbGljYWNpXHUwMGYzbjoNCi1hY3Rpb25MYWJlbF9lZGl0PUVkaXRhcg0KLWFjdGlvbkxhYmVsX2ZpbmRFbGVtZW50SW5MaWJOYXY9TW9zdHJhciBlbiBsYSB2aXN0YSBkZSBiaWJsaW90ZWNhDQotYWx0ZXJuYXRpdmVzX3RleHQ9QWx0ZXJuYXRpdmFzOg0KLWFzc2lnbm1lbnRBcHByb2FjaGVzX3RleHQ9UHJvcHVlc3RhcyBkZSBhc2lnbmFjaVx1MDBmM246DQotYXV0aG9yc190ZXh0PUF1dG9yZXM6DQotYmFja2dyb3VuZF90ZXh0PUZvbmRvOg0KLWJhc2VFbGVtZW50X3RleHQ9QmFzZToNCi1iYXNlR3VpZGFuY2VfdGV4dD1HdVx1MDBlZGEgYlx1MDBlMXNpY2E6DQotYnJpZWZEZXNjcmlwdGlvbl90ZXh0PURlc2NyaXBjaVx1MDBmM24gYnJldmU6DQotZGVzY3JpcHRpb25fdGV4dD1EZXNjcmlwY2lcdTAwZjNuOg0KLWJhY2t1cGJlZm9yZXNhdmVfdGV4dD1SZWFsaXphciBjb3BpYSBkZSBzZWd1cmlkYWQgYW50ZXMgZGUgZ3VhcmRhcg0KLWJyaWVmT3V0bGluZV90ZXh0PUVzcXVlbWF0aXphY2lcdTAwZjNuIGJyZXZlOg0KLWNoYW5nZURhdGVfdGV4dD1GZWNoYSBkZSBjYW1iaW86DQotY2hhbmdlRGVzY3JpcHRpb25fdGV4dD1EZXNjcmlwY2lcdTAwZjNuIGRlIGNhbWJpbzoNCi1jaGVja0l0ZW1zX3RleHQ9RWxlbWVudG9zIGRlIGNvbXByb2JhY2lcdTAwZjNuDQotY29udHJpYnV0ZXNfdGV4dD1Db250cmlidXllDQotbG9jYWxDb250cmlidXRlc190ZXh0PUxvY2FsQ29udHJpYnV0ZXMNCi1jb250cmlidXRlc190b190ZXh0PUNvbnRyaWJ1eWUgYQ0KLWNvcHlyaWdodF90ZXh0PUNvcHlyaWdodDoNCi1lZGl0b3JfdGV4dD1FZGl0b3INCi1leHRlbmRzX3RleHQ9QW1wbFx1MDBlZGENCi1leHRlbmRfdGV4dD1BbXBsaWFyDQotZXh0ZXJuYWxEZXNjcmlwdGlvbl90ZXh0PURlc2NyaXBjaVx1MDBmM24gZXh0ZXJuYToNCi1leHRlcm5hbElkX3RleHQ9SUQgZXh0ZXJubzoNCi1nb2Fsc190ZXh0PU9iamV0aXZvczoNCi1pbXBhY3RPZk5vdEhhdmluZ190ZXh0PUltcGFjdG8gZGUgbm8gdGVuZXI6DQota2V5Q29uc2lkZXJhdGlvbnNfdGV4dD1GYWN0b3JlcyBjbGF2ZToNCi1sZXZlbHNPZkFkb3B0aW9uX3RleHQ9Tml2ZWwgZGUgYWRvcGNpXHUwMGYzbjoNCi1tYWluRGVzY3JpcHRpb25fdGV4dD1EZXNjcmlwY2lcdTAwZjNuIHByaW5jaXBhbDoNCi1uZXdFbGVtZW50X3RleHQ9ezB9IG51ZXZvDQotbmFtZV90ZXh0PU5vbWJyZToNCi1ub3RBcHBsaWNhYmxlX3RleHQ9Tm8gYXBsaWNhYmxlDQotcGFja2FnaW5nR3VpZGFuY2VfdGV4dD1HdVx1MDBlZGEgZGUgZW1wYXF1ZXRhZG86DQotcHJlc2VudGF0aW9uTmFtZV90ZXh0PU5vbWJyZSBkZSBwcmVzZW50YWNpXHUwMGYzbjoNCi1wcm9tcHRmb3JsaWJhcnlfdGV4dD1Tb2xpY2l0YXIgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgYWwgaW5pY2lvDQotZW5hYmxlSGVhbHRoQ2hlY2tfdGV4dD1IYWJpbGl0YXIgbGFzIGhlcnJhbWllbnRhcyBkZSBkZXB1cmFjaVx1MDBmM24gaW50ZXJuYXMNCi1wcm9ibGVtX3RleHQ9UHJvYmxlbWE6DQotcHVycG9zZV90ZXh0PU9iamV0aXZvOg0KLXJlYXNvbkZvck5vdE5lZWRpbmdfdGV4dD1Nb3Rpdm9zIHBhcmEgbm8gbmVjZXNpdGFyOg0KLXJlcGxhY2VzX3RleHQ9UmVlbXBsYXphDQotbG9jYWxSZXBsYWNlc190ZXh0PUxvY2FsUmVwbGFjZXMNCi1yZXByZXNlbnRhdGlvbk9wdGlvbnNfdGV4dD1PcGNpb25lcyBkZSByZXByZXNlbnRhY2lcdTAwZjNuOg0KLXRlbXBsYXRlRmlsZV90ZXh0PUFyY2hpdm8ocykgZGUgcGxhbnRpbGxhOg0KLXNraWxsc190ZXh0PUhhYmlsaWRhZGVzOg0KLXN0ZXBzX3RleHQ9UGFzb3M6DQotc3RlcHNfbmFtZV90ZXh0PU5vbWJyZToNCi1zdG9wX3RleHQ9RGV0ZW5lcg0KLXByaW50X3RleHQ9SW1wcmltaXINCi1zeW5vbnltc190ZXh0PVNpblx1MDBmM25pbW9zOg0KLXR5cGVfdGV4dD1UaXBvOg0KLWNvcHlfdGV4dD1Db3BpYXINCi1kZWVwQ29weV90ZXh0PUNvcGlhIGVuIHByb2Z1bmRpZGFkDQotYmFja190ZXh0PUF0clx1MDBlMXMNCi1uZXdfcGx1Z2luPU51ZXZvIHBsdWctaW4gZGUgbVx1MDBlOXRvZG8NCi1tb3ZlPU1vdmVyLi4uDQotdW5pcXVlSWRfdGV4dD1JRCBleGNsdXNpdm86DQotdmFyaWFiaWxpdHlUeXBlX3RleHQ9VGlwbyBkZSB2YXJpYWJpbGlkYWQ6DQotdmVyc2lvbl90ZXh0PVZlcnNpXHUwMGYzbjoNCi0NCi0jIEJ1dHRvbiBMYWJlbHMNCi1hZGRCdXR0b25fdGV4dD1BXHUwMGYxYWRpci4uLg0KLWF0dGFjaEJ1dHRvbl90ZXh0PUFkanVudGFyLi4uDQotYnJvd3NlQnV0dG9uX3RleHQ9RXhhbWluYXIuLi4NCi1jaGFuZ2VUeXBlQnV0dG9uX3RleHQ9Q2FtYmlhciB0aXBvLi4uDQotY2xlYXJCdXR0b25fdGV4dD1Cb3JyYXINCi1kZWxldGVCdXR0b25fdGV4dD1TdXByaW1pcg0KLWRldGFjaEJ1dHRvbl90ZXh0PURlc2NvbmVjdGFyDQotZGlhZ3JhbV9zYXZlRXJyb3I9U2UgaGEgcHJvZHVjaWRvIHVuIGVycm9yIGFsIGd1YXJkYXIgZWwgZGlhZ3JhbWENCi1kb3duQnV0dG9uX3RleHQ9QWJham8NCi1kaXJlY3RvcnlfdGV4dD1EaXJlY3RvcmlvOg0KLW9yZGVyQnV0dG9uX3RleHQ9T3JkZW4NCi1lZGl0QnV0dG9uX3RleHQ9RWRpdGFyLi4uDQotcmVtb3ZlQnV0dG9uX3RleHQ9RWxpbWluYXINCi1yZW5hbWVBY3Rpb25fdGV4dD1SZW5vbWJyYXIuLi4NCi1yZW1vdmVfdGV4dD1FbGltaW5hcg0KLXJlbmFtZV90ZXh0PVJlbm9tYnJhcg0KLVNhdmVBc190ZXh0PUd1YXJkYXIgY29tbw0KLXNlbGVjdEJ1dHRvbl90ZXh0PVNlbGVjY2lvbmFyLi4uDQotZGVzZWxlY3RCdXR0b25fdGV4dD1BbnVsYXIgc2VsZWNjaVx1MDBmM24NCi11cEJ1dHRvbl90ZXh0PUFycmliYQ0KLW1ha2VEZWZhdWx0QnV0dG9uX3RleHQ9RXN0YWJsZWNlciBjb21vIHByZWRldGVybWluYWRvDQotdmlld0hpc3RvcnlCdXR0b25fdGV4dD1WZXIgaGlzdG9yaWFsLi4uDQotDQotIyBSb2xlIEVkaXRvciBUYXNrcyBQYWdlDQotcm9sZVRhc2tzUGFnZV9zZWN0aW9uTmFtZT1UYXJlYXMNCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Fc3RlIHJvbCBlcyBlbCByZWFsaXphZG9yIGRlIGxhcyBzaWd1aWVudGVzIHRhcmVhcy4NCi1yb2xlVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPVRhcmVhcyBkaXNwb25pYmxlcw0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1SZWFsaXphZG9yIHByaW5jaXBhbDoNCi1yb2xlVGFza3NQYWdlX3NlbGVjdGVkTGFiZWwyPVJlYWxpemFkb3IgYWRpY2lvbmFsOg0KLXJvbGVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1TZSBoYW4gc2VsZWNjaW9uYWRvIHswfSB0YXJlYXMuDQotDQotIyBSb2xlIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Qcm9kdWN0b3MgZGUgdHJhYmFqbzoNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249RXNwZWNpZmlxdWUgbG9zIHByb2R1Y3RvcyBkZSB0cmFiYWpvIGRlIGxvcyBxdWUgZXMgcmVzcG9uc2FibGUgZXN0ZSByb2wuDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9UHJvZHVjdG9zIGRlIHRyYWJham8gZGlzcG9uaWJsZXM6DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1SZXNwb25zYWJsZSBkZToNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMj1Qcm9kdWN0b3MgZGUgdHJhYmFqbyBxdWUgc29uIGxhIHNhbGlkYSBkZSB0YXJlYXMgcXVlIHJlYWxpemEgZXN0ZSByb2w6DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1TZSBoYW4gc2VsZWNjaW9uYWRvIHswfSBwcm9kdWN0b3MgZGUgdHJhYmFqby4NCi0NCi0jIFJvbGUgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi1yb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPUd1XHUwMGVkYQ0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVByb3BvcmNpb25hciBlbmxhY2VzIGEgaW5mb3JtYWNpXHUwMGYzbiBhZGljaW9uYWwgZW4gZm9ybWEgZGUgZ3VcdTAwZWRhLg0KLXJvbGVHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9R3VcdTAwZWRhIGRpc3BvbmlibGU6DQotcm9sZUd1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsPUd1XHUwMGVkYToNCi1yb2xlR3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U2UgaGFuIHNlbGVjY2lvbmFkbyB7MH0gZ3VcdTAwZWRhcy4NCi0NCi0jIFJvbGUgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQ0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1DYXRlZ29yXHUwMGVkYXM6DQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXN0aW9uYXIgbGFzIGNhdGVnb3JcdTAwZWRhcyBhIGxhcyBxdWUgcGVydGVuZWNlIGVzdGUgcm9sLg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1Db25qdW50b3MgZGUgcm9sZXM6DQotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1DYXRlZ29yXHUwMGVkYXMgcGVyc29uYWxpemFkYXM6DQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw9Q29uanVudG9zIGRlIHJvbGVzOg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1DYXRlZ29yXHUwMGVkYXMgcGVyc29uYWxpemFkYXM6DQotDQotIyBUYXNrIEVkaXRvciBSb2xlcyBQYWdlDQotdGFza1JvbGVzUGFnZV9zZWN0aW9uTmFtZT1Sb2xlcw0KLXRhc2tSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUFzaWduYXIgbG9zIHJvbGVzIHF1ZSBkZWJlbiByZWFsaXphciBlc3RhIHRhcmVhLg0KLXRhc2tSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9Um9sZXMgZGlzcG9uaWJsZXM6DQotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVJlYWxpemFkb3IgcHJpbmNpcGFsOg0KLXRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9UmVhbGl6YWRvcmVzIGFkaWNpb25hbGVzOg0KLXRhc2tSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1TZSBoYW4gc2VsZWNjaW9uYWRvIHswfSByb2xlcy4NCi10YXNrUm9sZXNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbW9kaWZ5X21lc3NhZ2U9SVVQQTAwMDQ1VzogXHUwMGJmRGVzZWEgY2FtYmlhciBlbCByZWFsaXphZG9yIHByaW5jaXBhbCBhICcnezB9Jyc/DQotdGFza1JvbGVzUGFnZV9jb25maXJtX3RpdGxlPUNvbmZpcm1hciBlbCBjYW1iaW8gZGUgcm9sIHByaW5jaXBhbA0KLQ0KLSMgVGFzayBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9UHJvZHVjdG9zIGRlIHRyYWJham8NCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249RXNwZWNpZmlxdWUgbG9zIHByb2R1Y3RvcyBkZSB0cmFiYWpvIGRlIHNhbGlkYSB5IGVudHJhZGEgcGFyYSBlc3RhIHRhcmVhLg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVByb2R1Y3RvcyBkZSB0cmFiYWpvIGRpc3BvbmlibGVzDQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1FbnRyYWRhcyBvYmxpZ2F0b3JpYXM6DQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9RW50cmFkYXMgb3BjaW9uYWxlczoNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMz1TYWxpZGFzOg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U2UgaGFuIHNlbGVjY2lvbmFkbyB7MH0gcHJvZHVjdG9zIGRlIHRyYWJham8uDQotDQotIyBUYXNrIEVkaXRvciBHdWlkYW5jZSBQYWdlDQotdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1HdVx1MDBlZGENCi10YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Qcm9wb3JjaW9uYXIgZW5sYWNlcyBhIGluZm9ybWFjaVx1MDBmM24gYWRpY2lvbmFsIGVuIGZvcm1hIGRlIGd1XHUwMGVkYS4NCi10YXNrR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPUd1XHUwMGVkYSBkaXNwb25pYmxlOg0KLXRhc2tHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1HdVx1MDBlZGE6DQotdGFza0d1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNlIGhhbiBzZWxlY2Npb25hZG8gezB9IGd1XHUwMGVkYXMuDQotDQotIyBUYXNrIEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9Q2F0ZWdvclx1MDBlZGFzDQotdGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXN0aW9uYXIgbGFzIGNhdGVnb3JcdTAwZWRhcyBhIGxhcyBxdWUgcGVydGVuZWNlIGVzdGEgdGFyZWEuDQotdGFza0NhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPURpc2NpcGxpbmFzDQotdGFza0NhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1DYXRlZ29yXHUwMGVkYXMgcGVyc29uYWxpemFkYXMNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1EaXNjaXBsaW5hczoNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9Q2F0ZWdvclx1MDBlZGFzIHBlcnNvbmFsaXphZGFzOg0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBUYXNrcyBQYWdlDQotV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbk5hbWU9VGFyZWFzDQotV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPUVzdGUgcHJvZHVjdG8gZGUgdHJhYmFqbyBlcyB1bmEgZW50cmFkYSBvIHVuYSBzYWxpZGEgZGUgbGFzIHNpZ3VpZW50ZXMgdGFyZWFzLg0KLVdvcmtQcm9kdWN0X1Rhc2tzX0F2YWlsYWJsZUxhYmVsPVRhcmVhcyBkaXNwb25pYmxlcw0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWw9RW50cmFkYSBvYmxpZ2F0b3JpYToNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMj1FbnRyYWRhIG9wY2lvbmFsOg0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwzPVNhbGlkYToNCi1Xb3JrUHJvZHVjdF9UYXNrc19NdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNlIGhhbiBzZWxlY2Npb25hZG8gezB9IHRhcmVhcy4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgUm9sZXMgUGFnZQ0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25OYW1lPVJvbGVzDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUxvcyByb2xlcyBzaWd1aWVudGVzIHNvbiByZXNwb25zYWJsZXMgZGUgZXN0ZSBwcm9kdWN0byBkZSB0cmFiYWpvIG8gbG8gbW9kaWZpY2FuLg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVJvbGVzIGRpc3BvbmlibGVzDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Sb2wgcmVzcG9uc2FibGU6DQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9Um9sZXMgZGUgbW9kaWZpY2FjaVx1MDBmM246DQotd29ya1Byb2R1Y3RSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1TZSBoYW4gc2VsZWNjaW9uYWRvIHswfSByb2xlcy4NCi0NCi0jIyBXb3JrIFByb2R1Y3QgRWRpdG9yIERlbGl2ZXJhYmxlIFBhcnRzIFBhZ2UNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25OYW1lPUNvbXBvbmVudGVzIGRlIHByb2R1Y3RvIGZpbmFsDQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249RXNwZWNpZmljYXIgbG9zIHByb2R1Y3RvcyBkZSB0cmFiYWpvIHF1ZSBjb25zdGl0dXllbiBlc3RlIHByb2R1Y3RvIGZpbmFsLg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9UHJvZHVjdG9zIGRlIHRyYWJham8gZGlzcG9uaWJsZXMgY29tbyBjb21wb25lbnRlcyBkZSBwcm9kdWN0byBmaW5hbDoNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlbGVjdGVkTGFiZWw9UHJvZHVjdG9zIGRlIHRyYWJham8gY29tbyBjb21wb25lbnRlcyBkZSBwcm9kdWN0byBmaW5hbDoNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U2UgaGFuIHNlbGVjY2lvbmFkbyB7MH0gcHJvZHVjdG9zIGRlIHRyYWJham8uDQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1HdVx1MDBlZGENCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249UHJvcG9yY2lvbmFyIGVubGFjZXMgYSBpbmZvcm1hY2lcdTAwZjNuIGFkaWNpb25hbCBlbiBmb3JtYSBkZSBndVx1MDBlZGEuDQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9R3VcdTAwZWRhIGRpc3BvbmlibGU6DQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1HdVx1MDBlZGE6DQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1TZSBoYW4gc2VsZWNjaW9uYWRvIHswfSBndVx1MDBlZGFzLg0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPUNhdGVnb3JcdTAwZWRhcw0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlc3Rpb25hciBsYXMgY2F0ZWdvclx1MDBlZGFzIGEgbGFzIHF1ZSBwZXJ0ZW5lY2UgZXN0ZSBwcm9kdWN0byBkZSB0cmFiYWpvLg0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9RG9taW5pb3MNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1DbGFzZXMgZGUgcHJvZHVjdG8gZGUgdHJhYmFqbzoNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMz1DYXRlZ29yXHUwMGVkYXMgcGVyc29uYWxpemFkYXM6DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPURvbWluaW86DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1DbGFzZXMgZGUgcHJvZHVjdG8gZGUgdHJhYmFqbzoNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwzPUNhdGVnb3JcdTAwZWRhcyBwZXJzb25hbGl6YWRhczoNCi0NCi0jIFByYWN0aWNlIEVkaXRvciBSZWZlcmVuY2VzIFBhZ2UNCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25OYW1lPUVsZW1lbnRvcyBkZSBjb250ZW5pZG8NCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Fc3BlY2lmaWNhciBsb3MgZWxlbWVudG9zIGRlIGNvbnRlbmlkbyBhIGxvcyBxdWUgaGFjZSByZWZlcmVuY2lhIGVzdGEgcHJcdTAwZTFjdGljYS4NCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUVsZW1lbnRvcyBkZSBjb250ZW5pZG8gZGlzcG9uaWJsZXM6DQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWxlY3RlZExhYmVsPUVsZW1lbnRvcyBkZSBjb250ZW5pZG86DQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNlIGhhbiBzZWxlY2Npb25hZG8gezB9IGVsZW1lbnRvcyBkZSBjb250ZW5pZG8uDQotDQotIyBDYXRlZ29yeSBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uTmFtZT1HdVx1MDBlZGENCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlc3Rpb25hciBsYSBndVx1MDBlZGEgcXVlIHBlcnRlbmVjZSBhIGVzdGUgezB9Lg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9hdmFpbGFibGVMYWJlbD1HdVx1MDBlZGEgZGlzcG9uaWJsZToNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1HdVx1MDBlZGE6DQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U2UgaGFuIHNlbGVjY2lvbmFkbyB7MH0gZ3VcdTAwZWRhcy4NCi0NCi0jIERpc2NpcGxpbmUgR3JvdXBpbmcgRWRpdG9yIERpc2NpcGxpbmVzIFBhZ2UNCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbk5hbWU9RGlzY2lwbGluYXMNCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlc3Rpb25hciBsYXMgZGlzY2lwbGluYXMgcXVlIHBlcnRlbmVjZW4gYSBlc3RhIGFncnVwYWNpXHUwMGYzbiBkZSBkaXNjaXBsaW5hcy4NCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfYXZhaWxhYmxlTGFiZWw9RGlzY2lwbGluYXMgZGlzcG9uaWJsZXM6DQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw9RGlzY2lwbGluYXM6DQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U2UgaGFuIHNlbGVjY2lvbmFkbyB7MH0gZGlzY2lwbGluYXMuDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Vc2VEZWZhdWx0RGlyZWN0b3J5QnV0dG9uTGFiZWw9VXRpbGl6YXIgZGlyZWN0b3JpbyBwb3Igb21pc2lcdTAwZjNuDQotDQotIyBEaXNjaXBsaW5lIEVkaXRvciBUYXNrcyBQYWdlDQotZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uTmFtZT1UYXJlYXMNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXN0aW9uYXIgbGFzIHRhcmVhcyBxdWUgcGVydGVuZWNlbiBhIGVzdGEgZGlzY2lwbGluYS4NCi1kaXNjaXBsaW5lVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPVRhcmVhcyBkaXNwb25pYmxlczoNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw9VGFyZWFzOg0KLWRpc2NpcGxpbmVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1TZSBoYW4gc2VsZWNjaW9uYWRvIHswfSB0YXJlYXMuDQotDQotIyBEaXNjaXBsaW5lIEVkaXRvciBSZWZlcmVuY2UgV29ya2Zsb3cgUGFnZQ0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbk5hbWU9Rmx1am9zIGRlIHRyYWJham8gZGUgcmVmZXJlbmNpYQ0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlc3Rpb25lIGxvcyBmbHVqb3MgZGUgdHJhYmFqbyBkZSByZWZlcmVuY2lhIHF1ZSBwZXJ0ZW5lY2VuIGEgZXN0YSBkaXNjaXBsaW5hLg0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfYXZhaWxhYmxlTGFiZWw9Rmx1am9zIGRlIHRyYWJham8gZGUgcmVmZXJlbmNpYSBkaXNwb25pYmxlcw0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VsZWN0ZWRMYWJlbD1GbHVqb3MgZGUgdHJhYmFqbyBkZSByZWZlcmVuY2lhOg0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1TZSBoYW4gc2VsZWNjaW9uYWRvIHswfSBmbHVqb3MgZGUgdHJhYmFqbyBkZSByZWZlcmVuY2lhLg0KLQ0KLSMgRG9tYWluIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVByb2R1Y3RvcyBkZSB0cmFiYWpvDQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R2VzdGlvbmFyIGxvcyBwcm9kdWN0b3MgZGUgdHJhYmFqbyBxdWUgcGVydGVuZWNlbiBhIGVzdGUgZG9taW5pby4NCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVByb2R1Y3RvcyBkZSB0cmFiYWpvIGRpc3BvbmlibGVzOg0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Qcm9kdWN0b3MgZGUgdHJhYmFqbzoNCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U2UgaGFuIHNlbGVjY2lvbmFkbyB7MH0gcHJvZHVjdG9zIGRlIHRyYWJham8uDQotDQotIyBXb3JrIFByb2R1Y3QgS2luZCBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Qcm9kdWN0b3MgZGUgdHJhYmFqbw0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlc3Rpb25hciBsb3MgcHJvZHVjdG9zIGRlIHRyYWJham8gcXVlIHBlcnRlbmVjZW4gYSBlc3RhIGNsYXNlIGRlIHByb2R1Y3RvIGRlIHRyYWJham8uDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1Qcm9kdWN0b3MgZGUgdHJhYmFqbyBkaXNwb25pYmxlczoNCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9UHJvZHVjdG9zIGRlIHRyYWJham86DQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNlIGhhbiBzZWxlY2Npb25hZG8gezB9IHByb2R1Y3RvcyBkZSB0cmFiYWpvLg0KLQ0KLSMgUm9sZSBTZXQgR3JvdXBpbmcgRWRpdG9yIFJvbGUgU2V0cyBQYWdlDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25OYW1lPUNvbmp1bnRvcyBkZSByb2xlcw0KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R2VzdGlvbmFyIGxvcyBjb25qdW50b3MgZGUgcm9sZXMgcXVlIHBlcnRlbmVjZW4gYSBlc3RhIGFncnVwYWNpXHUwMGYzbiBkZWwgY29uanVudG8gZGUgcm9sZXMuDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX2F2YWlsYWJsZUxhYmVsPUNvbmp1bnRvcyBkZSByb2xlcyBkaXNwb25pYmxlczoNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Db25qdW50b3MgZGUgcm9sZXM6DQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U2UgaGFuIHNlbGVjY2lvbmFkbyB7MH0gY29uanVudG9zIGRlIHJvbGVzLg0KLQ0KLSMgUm9sZSBTZXQgRWRpdG9yIFJvbGVzIFBhZ2UNCi1yb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25OYW1lPVJvbGVzDQotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R2VzdGlvbmFyIGxvcyByb2xlcyBxdWUgcGVydGVuZWNlbiBhIGVzdGUgY29uanVudG8gZGUgcm9sZXMuDQotcm9sZVNldFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1Sb2xlcyBkaXNwb25pYmxlczoNCi1yb2xlU2V0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9Um9sZXM6DQotcm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNlIGhhbiBzZWxlY2Npb25hZG8gezB9IHJvbGVzLg0KLQ0KLSMgVG9vbCBFZGl0b3IgVG9vbCBNZW50b3JzIFBhZ2UNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25OYW1lPUd1XHUwMGVkYXMgZGUgbGEgaGVycmFtaWVudGENCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXN0aW9uYXIgbGFzIGd1XHUwMGVkYXMgZGUgbGEgaGVycmFtaWVudGEgcXVlIHBlcnRlbmVjZW4gYSBlc3RhIGhlcnJhbWllbnRhLg0KLXRvb2xUb29sTWVudG9yc1BhZ2VfYXZhaWxhYmxlTGFiZWw9R3VcdTAwZWRhcyBkZSBsYSBoZXJyYW1pZW50YSBkaXNwb25pYmxlczoNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlbGVjdGVkTGFiZWw9R3VcdTAwZWRhcyBkZSBsYSBoZXJyYW1pZW50YToNCi10b29sVG9vbE1lbnRvcnNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U2UgaGFuIHNlbGVjY2lvbmFkbyB7MH0gZ3VcdTAwZWRhcyBkZSBsYSBoZXJyYW1pZW50YS4NCi0NCi0jIEN1c3RvbSBDYXRlZ29yeSBFZGl0b3IgQXNzaWduIFBhZ2UNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbk5hbWU9RWxlbWVudG9zIGRlIGNvbnRlbmlkbw0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R2VzdGlvbmFyIGxvcyBlbGVtZW50b3MgZGUgY29udGVuaWRvIHF1ZSBjb25zdGl0dXllbiBlc3RhIGNhdGVnb3JcdTAwZWRhIHBlcnNvbmFsaXphZGEuDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX2F2YWlsYWJsZUxhYmVsPUVsZW1lbnRvcyBkZSBjb250ZW5pZG8gZGlzcG9uaWJsZXM6DQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlbGVjdGVkTGFiZWw9RWxlbWVudG9zIGRlIGNvbnRlbmlkbzoNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1TZSBoYW4gc2VsZWNjaW9uYWRvIHswfSBlbGVtZW50b3MgZGUgY29udGVuaWRvLg0KLQ0KLSMgTmV3IE1ldGhvZCBQbHVnLWluIFdpemFyZA0KLW5ld1BsdWdpbldpemFyZF90aXRsZT1OdWV2byBwbHVnLWluIGRlIG1cdTAwZTl0b2RvDQotbmV3UGx1Z2luV2l6YXJkUGFnZV90aXRsZT1DcmVhciB1biBwbHVnLWluIGRlIG1cdTAwZTl0b2RvIG51ZXZvDQotbmV3UGx1Z2luV2l6YXJkUGFnZV90ZXh0PUVzcGVjaWZpcXVlIHVuIG5vbWJyZSB5IHByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbCBhY2VyY2EgZGVsIG51ZXZvIHBsdWctaW4gZGUgbVx1MDBlOXRvZG8uDQotbmV3UGx1Z2luRXJyb3JfbXNnPUlVUEEwMDIxRTogTm8gc2UgaGEgcG9kaWRvIGNyZWFyIGVsIHBsdWctaW4gZGUgbVx1MDBlOXRvZG8uDQotbmV3UGx1Z2luRXJyb3JfcmVhc29uPUVycm9yIGludGVybm8uXG5cDQotXG5cDQotUHVsc2UgRGV0YWxsZXMgcGFyYSBvYnRlbmVyIG1cdTAwZTFzIGluZm9ybWFjaVx1MDBmM24uDQotDQotIyBHZW5lcmljIGRpYWxvZyB0aXRsZXMNCi1jcmVhdGVEaWFsb2dfdGl0bGU9Q3JlYXIgZWxlbWVudG8NCi1kZWxldGVEaWFsb2dfdGl0bGU9U3VwcmltaXIgZWxlbWVudG8NCi1lZGl0RGlhbG9nX3RpdGxlPUVkaXRhciBlbGVtZW50bw0KLWVycm9yRGlhbG9nX3RpdGxlPUVycm9yDQotbW92ZURpYWxvZ190aXRsZT1Nb3ZlciBlbGVtZW50bw0KLXJlbmFtZURpYWxvZ190aXRsZT1SZW5vbWJyYXIgZWxlbWVudG8NCi13YXJuaW5nRGlhbG9nX3RpdGxlPUF2aXNvDQotDQotIyBBZGQgQ29uZmlndXJhdGlvbiB0byBQcm9jZXNzIEVycm9yIERpYWxvZw0KLWFkZENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPUFcdTAwZjFhZGlyIGNvbmZpZ3VyYWNpXHUwMGYzbiBhbCBwcm9jZXNvDQotDQotIyBTZXQgRGVmYXVsdCBDb25maWd1cmF0aW9uIEVycm9yIERpYWxvZw0KLXNldERlZmF1bHRDb25maWdFcnJvckRpYWxvZ190aXRsZT1Fc3RhYmxlY2VyIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBwb3Igb21pc2lcdTAwZjNuIHBhcmEgZWwgcHJvY2Vzbw0KLQ0KLSMgRWRpdCBQcm9jZXNzIEVycm9yIERpYWxvZw0KLWVkaXRQcm9jZXNzRWxlbWVudEVycm9yRGlhbG9nX3RpdGxlPUVkaXRhciBlbCBlbGVtZW50byBkZSBwcm9jZXNvDQotDQotIyBPcGVuIExpYnJhcnkgRGlhbG9nDQotb3BlbkxpYnJhcnlEaWFsb2dfdGl0bGU9QWJyaXIgdW5hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zDQotb3BlbkxpYnJhcnlEaWFsb2dfdGV4dD1MYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBhY3R1YWwgbm8gc2UgaGEgZ3VhcmRhZG8gY29ycmVjdGFtZW50ZS4gXHUwMGJmRGVzZWEgb21pdGlyIGVsIGVycm9yIHkgYWJyaXIgb3RyYSBiaWJsaW90ZWNhPw0KLQ0KLSMgU2F2ZSBMaWJyYXJ5IERpYWxvZw0KLXNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlPUd1YXJkYXIgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MNCi1zYXZlTGlicmFyeURpYWxvZ190ZXh0PUxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGFjdHVhbCBzZSBoYSBtb2RpZmljYWRvLiBcdTAwYmZEZXNlYSBndWFyZGFyIGxvcyBjYW1iaW9zPw0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPUFjdHVhbGl6YXIgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MNCi0NCi0jIERlbGV0ZSBFbGVtZW50IFJlZmVyZW5jZSBEaWFsb2cNCi1kZWxldGVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PUVsIGVsZW1lbnRvICcnezB9JycgeWEgc2UgaGEgc3VwcmltaWRvLiBcdTAwYmZEZXNlYSBlbGltaW5hcmxvIGRlICcnezF9Jyc/DQotDQotIyBFcnJvciBNZXNzYWdlcw0KLW5vT3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDBFOiBObyBoYXkgbmluZ3VuYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBhYmllcnRhLlxuXA0KLVxuXA0KLURlYmUgYWJyaXIgdW5hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIHBhcmEgcG9kZXIgYVx1MDBmMWFkaXIgdW4gbnVldm8gZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8uXG5cDQotXG5cDQotQ3JlZSB1bmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgbnVldmEgbyBhYnJhIHVuYSBleGlzdGVudGUgeSB2dWVsdmEgYSBpbnRlbnRhcmxvLg0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDFFOiBGYWx0YSBlbCBub21icmUgZGUgezB9LlxuXA0KLVxuXA0KLVRvZG9zIGxvcyBlbGVtZW50b3MgZGUgcHJvY2VzbyB5IG1cdTAwZTl0b2RvIGRlYmVuIHRlbmVyIHVuIG5vbWJyZS5cblwNCi1cblwNCi1QdWxzZSBBY2VwdGFyIHkgZXNwZWNpZmlxdWUgdW4gbm9tYnJlIHZcdTAwZTFsaWRvIHBhcmEgZWwgZWxlbWVudG8uDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDJFOiBFbCBub21icmUgJyd7MH0nJyB5YSBleGlzdGUuXG5cDQotXG5cDQotVW4gZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gZGViZSB0ZW5lciB1biBub21icmUgZXhjbHVzaXZvLlxuXA0KLVxuXA0KLVB1bHNlIEFjZXB0YXIgeSBlc3BlY2lmaXF1ZSB1biBub21icmUgZGlmZXJlbnRlIHBhcmEgZWwgZWxlbWVudG8uDQotY3JlYXRlQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDAzRTogTm8gc2UgcHVlZGUgY3JlYXIgbGEgY29uZmlndXJhY2lcdTAwZjNuIGRlbCBtXHUwMGU5dG9kby4NCi1kZWxldGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDRXOiBObyBzZSBwdWVkZSBzdXByaW1pciBsYSBjb25maWd1cmFjaVx1MDBmM24gZGVsIG1cdTAwZTl0b2RvLg0KLWludGVybmFsRXJyb3JfbXNnPUlVUEEwMDA1RTogU2UgaGEgcHJvZHVjaWRvIHVuIGVycm9yIGludGVybm8uXG5cDQotXG5cDQotUHVsc2UgRGV0YWxsZXMgcGFyYSBvYnRlbmVyIG1cdTAwZTFzIGluZm9ybWFjaVx1MDBmM24uDQotaW52YWxpZFByZXNlbnRhdGlvbk5hbWVFcnJvcl9tc2c9SVVQQTAwMDZFOiBFbCBub21icmUgZGUgcHJlc2VudGFjaVx1MDBmM24gZXNwZWNpZmljYWRvIG5vIGVzIHZcdTAwZTFsaWRvLlxuXA0KLVxuXA0KLVB1bHNlIEFjZXB0YXIgeSBlc3BlY2lmaXF1ZSB1biBub21icmUgZGlmZXJlbnRlLg0KLWludmFsaWRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDdFOiBMYSBjb25maWd1cmFjaVx1MDBmM24gZGVsIG1cdTAwZTl0b2RvIHNlbGVjY2lvbmFkYSAnJ3swfScnIG5vIGVzIHVuIHN1YmNvbmp1bnRvIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBwb3Igb21pc2lcdTAwZjNuIGRlbCBwcm9jZXNvLlxuXA0KLVxuXA0KLVBhcmEgbWFudGVuZXIgbGEgaW50ZWdyaWRhZCBkZSB1biBwcm9jZXNvLCBzdSBjb25maWd1cmFjaVx1MDBmM24gcG9yIG9taXNpXHUwMGYzbiBkZWJlIHNlciB1biBzdXBlcmNvbmp1bnRvIGRlIHRvZGFzIGxhcyBkZW1cdTAwZTFzIGNvbmZpZ3VyYWNpb25lcyBhc29jaWFkYXMgY29uIGVsIHByb2Nlc28uXG5cDQotXG5cDQotU2VsZWNjaW9uZSBvdHJhIGNvbmZpZ3VyYWNpXHUwMGYzbiBvIG1vZGlmaXF1ZSBsYSBjb25maWd1cmFjaVx1MDBmM24gcG9yIG9taXNpXHUwMGYzbiBwYXJhIGluY2x1aXIgZWwgY29udGVuaWRvIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBzZWxlY2Npb25hZGEgeSB2dWVsdmEgYSBpbnRlbnRhcmxvLg0KLXNldERlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDhFOiBMYSBjb25maWd1cmFjaVx1MDBmM24gZGVsIG1cdTAwZTl0b2RvIHNlbGVjY2lvbmFkYSAnJ3swfScnIG5vIGVzIHVuIHN1cGVyY29uanVudG8gZGUgbGFzIGRlbVx1MDBlMXMgY29uZmlndXJhY2lvbmVzIGEgbGFzIHF1ZSBoYWNlIHJlZmVyZW5jaWEgZWwgcHJvY2Vzby5cblwNCi1cblwNCi1QYXJhIG1hbnRlbmVyIGxhIGludGVncmlkYWQgZGUgdW4gcHJvY2Vzbywgc3UgY29uZmlndXJhY2lcdTAwZjNuIHBvciBvbWlzaVx1MDBmM24gZGViZSBzZXIgdW4gc3VwZXJjb25qdW50byBkZSB0b2RhcyBsYXMgZGVtXHUwMGUxcyBjb25maWd1cmFjaW9uZXMgYXNvY2lhZGFzIGNvbiBlbCBwcm9jZXNvLlxuXA0KLVxuXA0KLVNlbGVjY2lvbmUgb3RyYSBjb25maWd1cmFjaVx1MDBmM24gbyBtb2RpZmlxdWUgZWwgY29udGVuaWRvIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBzZWxlY2Npb25hZGEgeSB2dWVsdmEgYSBpbnRlbnRhcmxvLg0KLW9wZW5MaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDA5RTogTm8gc2UgcHVlZGUgY2FyZ2FyIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLlxuXA0KLVxuXA0KLVB1bHNlIERldGFsbGVzIHBhcmEgb2J0ZW5lciBtXHUwMGUxcyBpbmZvcm1hY2lcdTAwZjNuLg0KLXNhdmVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEwRTogTm8gc2UgcHVlZGUgZ3VhcmRhciBsYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBzZWxlY2Npb25hZGEuDQotc2F2ZUxpYnJhcnlUb0Vycm9yX21zZz1JVVBBMDAxMEU6IE5vIHNlIHB1ZWRlIGd1YXJkYXIgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3Mgc2VsZWNjaW9uYWRhIGVuICcnezB9JycuDQotZWxlbWVudEFscmVhZHlEZWxldGVkRXJyb3JfbXNnPUlVUEEwMDExRTogRWwgZWxlbWVudG8gJyd7MH0nJyB5YSBzZSBoYSBzdXByaW1pZG8uDQotdXBncmFkZUxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTJFOiBObyBzZSBwdWVkZSBhY3R1YWxpemFyIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLg0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVycm9yX3JlYXNvbj1JVVBBMDAxNkU6IFNlIGhhIHByb2R1Y2lkbyB1biBlcnJvci5cblwNCi1cblwNCi1QdWxzZSBEZXRhbGxlcyBwYXJhIG9idGVuZXIgbVx1MDBlMXMgaW5mb3JtYWNpXHUwMGYzbi4NCi1pbnRlcm5hbEVycm9yX3JlYXNvbj1JVVBBMDAxN0U6IFNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBpbnRlcm5vLlxuXA0KLVxuXA0KLVB1bHNlIERldGFsbGVzIHBhcmEgb2J0ZW5lciBtXHUwMGUxcyBpbmZvcm1hY2lcdTAwZjNuLg0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfcmVhc29uPUlVUEEwMDE4RTogU2UgaGEgcHJvZHVjaWRvIHVuIGVycm9yIGFsIGNhcmdhciBsb3MgZWxlbWVudG9zIGRlIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLlxuXA0KLVxuXA0KLVB1bHNlIERldGFsbGVzIHBhcmEgb2J0ZW5lciBtXHUwMGUxcyBpbmZvcm1hY2lcdTAwZjNuLg0KLXNhdmVVcGdyYWRlZExpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMTlFOiBTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgZ3VhcmRhciBsYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBhY3R1YWxpemFkYS5cblwNCi1cblwNCi1QdWxzZSBEZXRhbGxlcyBwYXJhIG9idGVuZXIgbVx1MDBlMXMgaW5mb3JtYWNpXHUwMGYzbi4NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9QWJyaWVuZG8gYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuLi4NCi1zYXZpbmdMaWJyYXJ5VGFza19uYW1lPUd1YXJkYW5kbyBsYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy4uLg0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9QWN0dWFsaXphbmRvIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLi4uDQotbG9hZGluZ0xpYnJhcnlFbGVtZW50c1Rhc2tfbmFtZT1DYXJnYW5kbyBlbGVtZW50b3MgZGUgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuLi4NCi1zYXZpbmdVcGdyYWRlZEVsZW1lbnRzVGFza19uYW1lPUd1YXJkYW5kbyBlbGVtZW50b3MgZGUgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZW4gZWwgbnVldm8gZm9ybWF0byBkZSBhcmNoaXZvLi4uDQotc2F2aW5nVGFza19uYW1lPUd1YXJkYW5kbyAnJ3swfScnLi4uDQotc2F2aW5nRmlsZXNUYXNrX25hbWU9R3VhcmRhbmRvIGFyY2hpdm9zLi4uDQotZml4aW5nQ29udGVudERlc2NyaXB0aW9uR1VJRHNUYXNrX25hbWU9QXJyZWdsYW5kbyBHVUlEIGRlIGRlc2NyaXBjaVx1MDBmM24gZGVsIGNvbnRlbmlkby4uLg0KLWRlbGV0aW5nSW52YWxpZFJlZmVyZW5jZXNUYXNrX25hbWU9U3VwcmltaWVuZG8gbGFzIHJlZmVyZW5jaWFzIG5vIHZcdTAwZTFsaWRhcy4uLg0KLQ0KLQ0KLSMgQWRkIEVkaXRvciBUbyBCcm93c2luZyBQZXJzcGVjdGl2ZSBXYXJuaW5nIERpYWxvZw0KLWFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZz1JVVBBMDA0Nlc6IEVzdGEgcGVyc3BlY3RpdmEgc2UgaGEgZGlzZVx1MDBmMWFkbyBlc3BlY1x1MDBlZGZpY2FtZW50ZSBwYXJhIG1heGltaXphciBsYSBleHBlcmllbmNpYSBkZWwgdXN1YXJpbyBhbCBuYXZlZ2FyIHBvciBsYSByZXByZXNlbnRhY2lcdTAwZjNuIEhUTUwgZGUgbG9zIGVsZW1lbnRvcyBkZSBsYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy4gQXF1XHUwMGVkIG5vIHNlIHB1ZWRlIGFcdTAwZjFhZGlyIG5pIHZpc3VhbGl6YXIgbmluZ1x1MDBmYW4gZWRpdG9yLg0KLQ0KLSMgQ2hhbmdlIEhpc3RvcnkgRGlhbG9nDQotQ2hhbmdlSGlzdG9yeURpYWxvZ190aXRsZT1IaXN0b3JpYWwgZGUgZGVzY3JpcGNpXHUwMGYzbiBkZSBjYW1iaW8NCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX2xhYmVsPUhpc3RvcmlhbCBkZSBjYW1iaW9zOg0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgRGVsZXRlIEFjdGlvbg0KLWNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU9Q29uZmlybWFyIHN1cHJlc2lcdTAwZjNuDQotY29uZmlybURlbGV0ZURpYWxvZ19tc2c9XHUwMGJmRXN0XHUwMGUxIHNlZ3VybyBkZSBxdWUgZGVzZWEgc3VwcmltaXIgJyd7MH0nJz8NCi1jb25maXJtRGVsZXRlRGlhbG9nX21zZ1dpdGhSZWZlcmVuY2U9XHUwMGJmRXN0XHUwMGUxIHNlZ3VybyBkZSBxdWUgZGVzZWEgc3VwcmltaXIgJyd7MH0nJz9cblwNCi1cblwNCi1Mb3MgZWxlbWVudG9zIHNpZ3VpZW50ZXMgY29udGllbmVuIHJlZmVyZW5jaWFzIGEgbG9zIGFydFx1MDBlZGN1bG9zIHF1ZSBzZSB2YW4gYSBzdXByaW1pcjogezF9DQotDQotIyBOZXcgTGlicmFyeSBEaWFsb2cNCi1lcnJvckRpYWxvZ19tZXNzYWdlPUlVUEEwMDIyRTogTm8gc2UgcHVlZGUgY3JlYXIgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgJyd7MH0nJy4NCi1lcnJvckRpYWxvZ19lcnJvcj1ObyBzZSBwdWVkZSBjcmVhciB1bmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZGVudHJvIGRlIG90cmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuDQotZXJyX25vb3BlbmxpYnJhcnk9SVVQQTAwNDBFOiBObyBoYXkgbmluZ3VuYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBhYmllcnRhLlxuXA0KLVxuXA0KLURlYmUgYWJyaXIgdW5hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIHBhcmEgcG9kZXIgYVx1MDBmMWFkaXIgdW4gbnVldm8gcGx1Zy1pbiBkZSBtXHUwMGU5dG9kby5cblwNCi1cblwNCi1DcmVlIHVuYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBudWV2YSBvIGFicmEgdW5hIGV4aXN0ZW50ZSB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotZXJyX2xvYWRpbmdsaWJyYXJ5PVNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBjYXJnYXIgbGEgYmlibGlvdGVjYQ0KLW1zZ19yZWxvYWRMaWJyYXJ5PVNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBkZXNoYWNlciBsYSBzdXByZXNpXHUwMGYzbiBhblx1MDBmM21hbGEuIERlYmUgdm9sdmVyIGEgY2FyZ2FyIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGFjdHVhbC4NCi0NCi0jIFJlbG9hZCBMaWJyYXJ5IERpYWxvZw0KLXJlbG9hZERpYWxvZ19tZXNzYWdlPURlYmUgdm9sdmVyIGEgY2FyZ2FyIGxhIGJpYmxpb3RlY2EgcGFyYSByZXN0YXVyYXIgc3UgZXN0YWRvIG9yaWdpbmFsLg0KLXJlbG9hZERpYWxvZ190aXRsZT1Wb2x2ZXIgYSBjYXJnYXIgYmlibGlvdGVjYQ0KLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvclRpdGxlPUVycm9yIGRlIG1vdmltaWVudG8NCi1kaWFsb2dzX01vdmVEaWFsb2dfZXJyb3JNZXNzYWdlPVNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBkdXJhbnRlIGVsIG1vdmltaWVudG8NCi0NCi0jIFByb2Nlc3MgRm9ybSBFZGl0b3INCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU9R3VhcmRhcg0KLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMT1Fc3RlIGNhbWJpbyBhZmVjdGFyXHUwMGUxIGEgdG9kb3MgbG9zIGRpYWdyYW1hcyBkZWwgcHJvY2Vzby4gRWwgZWRpdG9yIHNlIGd1YXJkYXJcdTAwZTEgZGVzcHVcdTAwZTlzIGRlbCBjYW1iaW8uIFx1MDBiZkRlc2VhIGNvbnRpbnVhcj8NCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTI9RWwgZWRpdG9yIHNlIGd1YXJkYXJcdTAwZTEgZGVzcHVcdTAwZTlzIGRlbCBjYW1iaW8uIFx1MDBiZkRlc2VhIGNvbnRpbnVhcj8NCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBQYWdlDQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX3RpdGxlPUNvbmZpcm1hciBlbGltaW5hY2lcdTAwZjNuDQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX21lc3NhZ2U9XHUwMGJmRXN0XHUwMGUxIHNlZ3VybyBkZSBxdWUgZGVzZWEgZWxpbWluYXIgbGEgdmlzdGEgJyd7MH0nJz8NCi1jb25maWdWaWV3UGFnZVZpZXdFeGlzdHNEaWFsb2dfdGl0bGU9QXZpc28NCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uPUNvbmZpZ3VyYWNpXHUwMGYzbjoNCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld3M9VmlzdGFzIGRlIGNvbmZpZ3VyYWNpXHUwMGYzbg0KLWNvbmZpZ1ZpZXdQYWdlX3ZpZXdzPVZpc3Rhcw0KLWNvbHVtbnNlbGVjdGlvbl90ZXh0PVNlbGVjY2lcdTAwZjNuIGRlIGNvbHVtbmFzOg0KLWNvbmZpZ1ZpZXdQYWdlX2FkZFZpZXdCdXR0b25UZXh0PUFcdTAwZjFhZGlyIHZpc3RhLi4uDQotY29uZmlnVmlld1BhZ2VfcmVtb3ZlVmlld0J1dHRvblRleHQ9RWxpbWluYXIgdmlzdGENCi1jb25maWdWaWV3UGFnZV9tYWtlRGVmYXVsdEJ1dHRvblRleHQ9RXN0YWJsZWNlciBjb21vIHByZWRldGVybWluYWRvDQotY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNXOiBZYSBleGlzdGUgdW5hIHZpc3RhIGNvbiBlbCBub21icmUgJyd7MH0nJy4NCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25UaXRsZT1WaXN0YXMgZGUgbmF2ZWdhY2lcdTAwZjNuIHB1YmxpY2FkYXMNCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25NZXNzYWdlPUVzcGVjaWZpcXVlIGxhcyB2aXN0YXMgcXVlIHNlIGluY2x1aXJcdTAwZTFuIGN1YW5kbyBzZSBwdWJsaXF1ZSBlc3RhIGNvbmZpZ3VyYWNpXHUwMGYzbi4gUGFyYSBjcmVhciB1bmEgdmlzdGEsIHB1bHNlIEFcdTAwZjFhZGlyIHZpc3RhIHBhcmEgc2VsZWNjaW9uYXIgdW5hIGNhdGVnb3JcdTAwZWRhIGVzdFx1MDBlMW5kYXIgbyBwZXJzb25hbGl6YWRhIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbi4gIExhIGNhdGVnb3JcdTAwZWRhIHNlbGVjY2lvbmFkYSByZXByZXNlbnRhclx1MDBlMSBsYSB2aXN0YSB5IGxvcyBlbGVtZW50b3MgZGUgY29udGVuaWRvIHkgbGFzIHN1YmNhdGVnb3JcdTAwZWRhcyBkZSBsYSBjYXRlZ29yXHUwMGVkYSByZXByZXNlbnRhclx1MDBlMW4gbG9zIGVsZW1lbnRvcyBkZSBcdTAwZTFyYm9sIGRlIGxhIHZpc3RhLg0KLQ0KLSMgRGVzY3JpcHRpb24gVGFiDQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfdGl0bGU9Q29udmVydGlyIGd1XHUwMGVkYQ0KLWRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UxPUlVUEEwMDQwVzogQW50ZXMgZ3VhcmRlIGVsIGVkaXRvci4NCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMj1ObyBoYXkgbmluZ3VuYSBndVx1MDBlZGEgY29tcGF0aWJsZSBwYXJhIGVzdGUgdGlwby4NCi0NCi1jaGFuZ2VBY3Rpdml0eVR5cGVXYXJuaW5nRGlhbG9nX3RpdGxlPUNvbnZlcnRpciBhY3RpdmlkYWQNCi0jIEFzc29jaWF0aW9uIEZvcm0gUGFnZQ0KLUFzc29jaWF0aW9uRm9ybVBhZ2VfQnJpZWZEZXNjcmlwdGlvbkxhYmVsPURlc2NyaXBjaVx1MDBmM24gYnJldmUgZGVsIGVsZW1lbnRvIHNlbGVjY2lvbmFkbzoNCi0NCi0jIE1ldGhvZCBFbGVtZW50IERlc2NyaXB0aW9uDQotbWV0aG9kRWxlbWVudERlc2NyaXB0aW9uRW1wdHlOYW1lRGlhbG9nX3RpdGxlPUVzcGVjaWZpY2FyIGVsIG5vbWJyZSBkZSBlbGVtZW50bw0KLW1ldGhvZEVsZW1lbnREZXNjcmlwdGlvbkVtcHR5TmFtZURpYWxvZ19tZXNzYWdlPUVsIGNhbXBvIGRlIG5vbWJyZSBubyBwdWVkZSBlc3RhciB2YWNcdTAwZWRvLg0KLQ0KLSMgTWV0aG9kIFBsdWctaW4gRGVzY3JpcHRpb24NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblJlbW92ZVJlZkNvbmZpcm1fbWVzc2FnZT1TaSBhbnVsYSBsYSBzZWxlY2NpXHUwMGYzbiBkZSBsb3MgcGx1Zy1pbnMgY29uIHJlZmVyZW5jaWFzIGFzb2NpYWRvcyBjb24gZWwgcGx1Zy1pbiAnJ3swfScnIHNlIHByb2R1Y2lyXHUwMGUxbiByZWxhY2lvbmVzIG5vIHZcdTAwZTFsaWRhcyBxdWUgc2Ugc3VwcmltaXJcdTAwZTFuLlxuXA0KLVxuXA0KLUVzdGEgYWNjaVx1MDBmM24gbm8gc2UgcHVlZGUgZGVzaGFjZXIuIFx1MDBiZkRlc2VhIGNvbnRpbnVhciBjb24gZXN0ZSBjYW1iaW8/DQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWU9RXN0XHUwMGUxIGEgcHVudG8gZGUgY2FtYmlhciBlbCBub21icmUgZGUgZXN0ZSBwbHVnLWluIGRlIG1cdTAwZTl0b2RvIGRlICcnezB9JycgYWwgbnVldm8gbm9tYnJlICcnezF9JycuIEVzdGEgb3BlcmFjaVx1MDBmM24gZ3VhcmRhclx1MDBlMSBlbCBlZGl0b3IgeSBjYW1iaWFyXHUwMGUxIGVsIG5vbWJyZSBkZSBsYSBjYXJwZXRhIGRlIHBsdWctaW5zIHBvciBlbCBub21icmUgbnVldm8uIFx1MDBiZkRlc2VhIGNvbnRpbnVhcj8NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZV90aXRsZT1SZW5vbWJyYXIgcGx1Zy1pbiBkZSBtXHUwMGU5dG9kbw0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jYW5ub3RSZW5hbWVQbHVnaW5Gb2xkZXI9Tm8gc2UgaGEgcG9kaWRvIGNhbWJpYXIgZWwgbm9tYnJlIGRlIGxhIGNhcnBldGEgZGUgcGx1Zy1pbnMgcG9yIGVsIG5vbWJyZSBudWV2bw0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luTGFiZWw9QmxvcXVlYXIgcGx1Zy1pbg0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luX21lc3NhZ2U9RWwgY2FtYmlvIGRlbCBibG9xdWVvIGRlbCBwbHVnLWluIGd1YXJkYXJcdTAwZTEgeSBjZXJyYXJcdTAwZTEgbG9zIGVkaXRvcmVzIGFiaWVydG9zIGRlIGVsZW1lbnRvcyBxdWUgcGVydGVuZWNlbiBhbCBwbHVnLWluICcnezB9JycuIFx1MDBiZkRlc2VhIGNvbnRpbnVhciBjb24gZXN0ZSBjYW1iaW8/DQotDQotIyBQcm9jZXNzIERlc2NyaXB0aW9uDQotcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fdGl0bGU9UmVub21icmFyDQotcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fbWVzc2FnZT1Fc3RcdTAwZTEgYSBwdW50byBkZSBjYW1iaWFyIGVsIG5vbWJyZSBkZSBlc3RlIHByb2Nlc28uIEVzdGEgb3BlcmFjaVx1MDBmM24gZ3VhcmRhclx1MDBlMSBlbCBlZGl0b3IgeSBjYW1iaWFyXHUwMGUxIGVsIG5vbWJyZSBkZSBsYSBjYXJwZXRhIGRlbCBwcm9jZXNvIHBvciBlbCBub21icmUgbnVldm8uIFx1MDBiZkRlc2VhIGNvbnRpbnVhcj8NCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbkRlc2NyaXB0aW9uPURlc2NyaXBjaVx1MDBmM246DQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uVGl0bGU9Q29uZmlndXJhY2lcdTAwZjNuDQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uTWVzc2FnZT1Fc3BlY2lmaXF1ZSB0b2RhcyBsYXMgY29uZmlndXJhY2lvbmVzIHZcdTAwZTFsaWRhcyBwYXJhIGVzdGUgcHJvY2Vzby4gU2VsZWNjaW9uZSB1bmEgY29uZmlndXJhY2lcdTAwZjNuIHBvciBvbWlzaVx1MDBmM24sIHF1ZSBkZWJlIHNlciB1biBjb25qdW50byBzdXBlcmlvciBkZWwgcmVzdG8gZGUgY29uZmlndXJhY2lvbmVzLg0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9ucz1Db25maWd1cmFjaW9uZXM6DQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2RlZmF1bHQ9KHBvciBvbWlzaVx1MDBmM24pDQotUHJvY2Vzc0Rlc2NyaXB0aW9uX3NlbGVjdENvbmZpZ3VyYXRpb249U2VsZWNjaW9uZSBsYXMgY29uZmlndXJhY2lvbmVzIHF1ZSBkZXNlYSBhXHUwMGYxYWRpcg0KLVByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQwPUVzdGEgYWNjaVx1MDBmM24gZ3VhcmRhclx1MDBlMSBlbCBlZGl0b3IgYWN0dWFsIHkgZWwgY2FtYmlvIHNlclx1MDBlMSBwZXJtYW5lbnRlLiBcdTAwYmZFc3RcdTAwZTEgc2VndXJvIGRlIHF1ZSBkZXNlYSBzdXByaW1pciAnJ3swfScnPw0KLVByb2Nlc3NEZWxldGVBY3Rpb25fc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZT1Mb3MgZGVzY3JpcHRvcmVzIHNpZ3VpZW50ZXMgbm8gc2UgdXRpbGl6YW4gZW4gbmluZ3VuYSBwYXJ0ZSBkZXNwdVx1MDBlOXMgZGUgc3VwcmltaXIgbG9zIGVsZW1lbnRvcyBzZWxlY2Npb25hZG9zLlxuXA0KLVNlbGVjY2lvbmUgbG9zIGRlc2NyaXB0b3JlcyBxdWUgZGVzZWEgc3VwcmltaXIuDQotDQotIyBWaWV3IEhlbHBlcg0KLXZpZXdIZWxwZXJIZWFsdGhDaGVja0RpYWxvZ190aXRsZT1Db21wcm9iYXIgZWwgZXN0YWRvIGRlIGxhIGJpYmxpb3RlY2ENCi12aWV3SGVscGVyX3BlcmZvcm1IZWFsdGhDaGVjaz1SZWFsaXphbmRvIGxhIGNvbXByb2JhY2lcdTAwZjNuIGRlIGVzdGFkbyBkZSBsYSBiaWJsaW90ZWNhLi4uDQotdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX21lc3NhZ2U9TGEgY29tcHJvYmFjaVx1MDBmM24gZGUgZXN0YWRvIGRlIGxhIGJpYmxpb3RlY2EgYWJpZXJ0YSBzZSBoYSBjb21wbGV0YWRvIHNhdGlzZmFjdG9yaWFtZW50ZS4gQ29uc3VsdGUgZWwgaW5mb3JtZSBkZWwgYXJjaGl2byBkZSByZWdpc3Ryby4NCi0NCi0jIEF0dGFjaCBUZW1wbGF0ZSBGaWxlIERpYWxvZw0KLWF0dGFjaFRlbXBsYXRlRmlsZURpYWxvZ190aXRsZT1BZGp1bnRhciBhcmNoaXZvIGRlIHBsYW50aWxsYQ0KLQ0KLSMgQ3JlYXRlIEVsZW1lbnQgRXJyb3IgRGlhbG9nDQotY3JlYXRlRWxlbWVudERpYWxvZ190aXRsZT1DcmVhciBudWV2byB7MH0NCi1jcmVhdGVOZXdFbGVtZW50RXJyb3JfbXNnPVNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBjcmVhciBlbCBudWV2byB7MH0uDQotDQotZGxnVGl0bGVfcmVsb2FkTGlicmFyeT1Wb2x2ZXIgYSBjYXJnYXIgYmlibGlvdGVjYQ0KLWNyZWF0ZUVsZW1lbnRFcnJvcl9yZWFzb249RWwgbm9tYnJlIGRlIHswfSBubyBwdWVkZSBlc3RhciB2YWNcdTAwZWRvLlxuXA0KLVxuXA0KLUVzcGVjaWZpcXVlIHVuIG5vbWJyZSB2XHUwMGUxbGlkbyB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotZGVsZXRlQ29uZmlnRXJyb3JfcmVhc29uPUVsIHByb2Nlc28gJyd7MH0nJyBoYWNlIHJlZmVyZW5jaWEgYSBsYSBjb25maWd1cmFjaVx1MDBmM24NCi0NCi0jIENoYW5nZUJvdW5kc0NvbW1hbmQNCi1nZWZfY2hhbmdlQm91bmRzQ29tbWFuZF9sYWJlbD1DYW1iaWFyIGxcdTAwZWRtaXRlcw0KLSMgQ2hhbmdlTmFtZUNvbW1hbmQNCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfbGFiZWw9Q2FtYmlhciBub21icmUNCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfdW5kb01lc3NhZ2U9Tm8gc2UgcHVlZGUgZGVzaGFjZXIgZWwgY2FtYmlvIGRlIG5vbWJyZS5cblwNCi1cblwNCi1ObyBzZSBwdWVkZSBkZXNoYWNlciBlbCBjYW1iaW8gZGUgbm9tYnJlIHNpIGVsIG5vbWJyZSBhbnRlcmlvciBlcyBudWxvLg0KLSMgQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQNCi1nZWZfY2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmRfbGFiZWw9Q2FtYmlhciB2YWxvciBkZSBsYSBwcm9waWVkYWQNCi0jIENyZWF0ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfY3JlYXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1DcmVhciBwdW50byBkZSBpbmZsZXhpXHUwMGYzbg0KLSMgQ3JlYXRlTGlua0NvbW1hbmQNCi1nZWZfY3JlYXRlTGlua0NvbW1hbmRfbGFiZWw9Q3JlYWNpXHUwMGYzbiBkZSBlbmxhY2VzDQotIyBDcmVhdGVOb2RlQ29tbWFuZA0KLWdlZl9jcmVhdGVOb2RlQ29tbWFuZF9sYWJlbD1DcmVhciBudWV2byBub2RvDQotIyBEZWxldGVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX2RlbGV0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9U3VwcmltaXIgcHVudG8gZGUgaW5mbGV4aVx1MDBmM24NCi0jIERlbGV0ZUNvbW1hbmQNCi1nZWZfZGVsZXRlQ29tbWFuZF9sYWJlbD1TdXByaW1pcg0KLSMgRGVsZXRlTGlua0NvbW1hbmQNCi1nZWZfZGVsZXRlTGlua0NvbW1hbmRfbGFiZWw9U3VwcmltaXIgY29uZXhpXHUwMGYzbg0KLSMgTW92ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfbW92ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9TW92ZXIgcHVudG8gZGUgaW5mbGV4aVx1MDBmM24NCi0jIFJlY29ubmVjdExpbmtDb21tYW5kDQotZ2VmX3JlY29ubmVjdExpbmtDb21tYW5kX2xhYmVsPVJlY29uZWN0YXIgZW5sYWNlDQotDQotIyBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXINCi1nZWZfdmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdD1FbCBub21icmUgbm8gcHVlZGUgZXN0YXIgdmFjXHUwMGVkby4gRXNwZWNpZmlxdWUgdW4gbm9tYnJlIHZcdTAwZTFsaWRvLg0KLSMgVmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXINCi1nZWZfdmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXJfYnJpbmdEb3duUHJvbXB0PUVsIG5vbWJyZSBubyBwdWVkZSBlc3RhciB2YWNcdTAwZWRvLiBFc3BlY2lmaXF1ZSB1biBub21icmUgdlx1MDBlMWxpZG8uDQotIyBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydA0KLWdlZl93b3JrUHJvZHVjdE5vZGVFZGl0UGFydF92YWxpZGF0ZU1lc3NhZ2U9RWwgbm9tYnJlIG5vIHB1ZWRlIGVzdGFyIHZhY1x1MDBlZG8uIEVzcGVjaWZpcXVlIHVuIG5vbWJyZSB2XHUwMGUxbGlkby4NCi0NCi0jIEVsZW1lbnRzVmlld0RlbGV0ZUFjdGlvbg0KLWFjdGlvbnNfRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uX21lc3NhZ2U9TGEgY29uZmlndXJhY2lcdTAwZjNuICcnezB9Jycgbm8gc2UgcHVlZGUgc3VwcmltaXIgcG9ycXVlIHRvZGF2XHUwMGVkYSBsYSBlc3RcdTAwZTEgdXRpbGl6YW5kbyBlbCBwcm9jZXNvICcnezF9JycuDQotDQotIyBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3INCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclRpdGxlPVN1cHJpbWlyIGVycm9yDQotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JNZXNzYWdlPUV4Y2VwY2lcdTAwZjNuIG5vIGNvbnRyb2xhZGENCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclJlYXNvbj1Db25zdWx0ZSBsb3MgZGV0YWxsZXMNCi0NCi0jIE1ldGhvZEVsZW1lbnRFZGl0b3INCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yVGl0bGU9R3VhcmRhciBlcnJvcg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMT1JVVBBMDAyMEU6IFNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBndWFyZGFyIGVsIGFyY2hpdm8NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTI9Q29uZmlybWFyIGVycm9yDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjE9Q29uc3VsdGUgZWwgYXJjaGl2byBkZSByZWdpc3RybyBwYXJhIG9idGVuZXIgbVx1MDBlMXMgZGV0YWxsZXMNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMj1Db25zdWx0ZSBsb3MgZGV0YWxsZXMNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JUaXRsZT1FcnJvciBkZSByZW5vbWJyZQ0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9pbnZhbGlkRWRpdG9yTXNnPVNlIGhhbiBlbGltaW5hZG8gdW5vIG8gbXVjaG9zIGFyY2hpdm9zIGRlIGVzdGUgZWRpdG9yLiBFbCBlZGl0b3IgeWEgbm8gZXMgdlx1MDBlMWxpZG8geSB0aWVuZSBxdWUgY2VycmFyc2UuDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JUaXRsZT1FZGl0b3Igbm8gdlx1MDBlMWxpZG8NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JNZXNzYWdlMT1TZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgcmVub21icmFyIGVsIGFyY2hpdm8gJyd7MH0nJw0KLQ0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQ0KLXJlbmFtZUVycm9yX3RpdGxlPVJlbm9tYnJhciBlbGVtZW50bw0KLXJlbmFtZUVycm9yX21zZz1JVVBBMDAxM0U6IE5vIHNlIHB1ZWRlIGNvbXBsZXRhciBsYSBvcGVyYWNpXHUwMGYzbiBkZSByZW5vbWJyYXIuDQotU2VsZWN0RWxlbWVudERpYWxvZ19zZWxlY3RlbGVtZW50X3RleHQ9U2VsZWNjaW9uYXIgZWxlbWVudG8NCi0NCi0jIEVkaXRvckNob29zZXINCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfdGl0bGU9QWJyaXIgZWRpdG9yIGRlIG1cdTAwZTl0b2Rvcw0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVzY3JpcHRpb25MYWJlbD1EZXNjcmlwY2lcdTAwZjNuOg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9TZWxlY3RBbGxCdXR0b25MYWJlbD1TZWxlY2Npb25hciB0b2RvDQotT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZV9lZGl0X3RleHQwPUVkaXRhciBlbGVtZW50bw0KLWVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ19tZXNzYWdlPUlVUEEwMDIzRTogTm8gc2UgcHVlZGUgYWJyaXIgZWwgZWRpdG9yIGFzb2NpYWRvIGNvbiBlbCBlbGVtZW50byBkZSBtXHUwMGU5dG9kbyBzZWxlY2Npb25hZG8uDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9JY29uRmlsZUNob29zZXJEaWFsb2dfdGl0bGU9U2VsZWNjaW9uYXIgYXJjaGl2byBkZSBpbWFnZW4NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5TmFtZT1OdWV2YSBiaWJsaW90ZWNhDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX0Rlc2NyaXB0aW9uTGFiZWw9RGVzY3JpcGNpXHUwMGYzbjoNCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1TZWxlY2Npb25lIHVuYSBvIHZhcmlhcyBjb25maWd1cmFjaW9uZXMgZGVsIG1cdTAwZTl0b2RvIHkgcHVsc2UgRmluYWxpemFyIHBhcmEgYWJyaXJsYXMuDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX0Rlc2VsZWN0QWxsQnV0dG9uTGFiZWw9QW51bGFyIHNlbGVjY2lvbmVzDQotRWxlbWVudHNWaWV3X21pZ3JhdGlvbl9kaXJfZGxnX2Rlc2NyaXB0aW9uX3RleHQ9RXNwZWNpZmlxdWUgZWwgZGlyZWN0b3JpbyBkZWwgezB9IHJlY2lcdTAwZTluIG1pZ3JhZG8gcGFyYSByZWVtcGxhemFyIGVsIHswfSBzZWxlY2Npb25hZG8NCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uPVNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBkZWwgc2lzdGVtYS4gUHVsc2UgRGV0YWxsZXMgcGFyYSBvYnRlbmVyIG1cdTAwZTFzIGluZm9ybWFjaVx1MDBmM24uXG5cDQotXG5cDQotQ2llcnJlIGFsZ3Vub3MgZGUgbG9zIGVkaXRvcmVzIGFiaWVydG9zIHkgdnVlbHZhIGEgaW50ZW50YXJsby4NCi0NCi0jIERlc2NyaXB0aW9uRm9ybVBhZ2UNCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RpdGxlPUxhIGltYWdlbiBubyBlcyB2XHUwMGUxbGlkYQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzFFOiBMYSBpbWFnZW4gc2VsZWNjaW9uYWRhICcnezB9Jycgc3VwZXJhIGVsIHRhbWFcdTAwZjFvIHBlcm1pdGlkbyAoezF9IHBvciB7Mn0pLiBTZWxlY2Npb25lIG90cmEgaW1hZ2VuLg0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190aXRsZT1MYSBpbWFnZW4gbm8gZXMgdlx1MDBlMWxpZGENCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzJFOiBFbCBhcmNoaXZvIHNlbGVjY2lvbmFkbyAnJ3swfScnIG5vIGV4aXN0ZS4gU2VsZWNjaW9uZSBvdHJhIGltYWdlbi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9U2VsZWNjaW9uYXIuLi4NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5RGVzY3JpcHRpb249RGVzY3JpcGNpXHUwMGYzbiBkZSBsYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcw0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZWZhdWx0QnJpZWZEZXNjcmlwdGlvbj1EZXNjcmlwY2lcdTAwZjNuIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZWwgbVx1MDBlOXRvZG8NCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZURlc2NyaXB0aW9uPURlYmVuIGNlcnJhcnNlIHRvZG9zIGxvcyBlZGl0b3Jlcy4gU2VsZWNjaW9uZSBsb3MgcXVlIHRpZW5lbiBxdWUgZ3VhcmRhcnNlIHByaW1lcm8sIGVuIHN1IGNhc28uDQotDQotIyBUZW1wbGF0ZURlc2NyaXB0aW9uUGFnZQ0KLWZvcm1zX1RlbXBsYXRlRGVzY3JpcHRpb25QYWdlX2FscmVhZHlBdHRhY2hlZF9tc2c9RWwgYXJjaGl2byBzZWxlY2Npb25hZG8geWEgZXMgdW4gYXJjaGl2byBkZSBkYXRvcyBhZGp1bnRvcyBkZSBlc3RhIFBsYW50aWxsYS4NCi0NCi0jIE5ldyBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLW5ld0xpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTRFOiBObyBzZSBoYSBwb2RpZG8gY3JlYXIgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuDQotbmV3TGlicmFyeUVycm9yX3JlYXNvbjE9TGEgdlx1MDBlZGEgZGUgYWNjZXNvIGRlIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGVzcGVjaWZpY2FkYSAnJ3swfScnIG5vIGVzIHZcdTAwZTFsaWRhLg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24yPVlhIGV4aXN0ZSB1bmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZW4gJyd7MH0nJy4NCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMz1ObyBzZSBwdWVkZSBjcmVhciBsYSBjYXJwZXRhIGRlIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGVzcGVjaWZpY2FkYSAnJ3swfScnLg0KLW5ld0xpYnJhcnlFcnJvcl9hZHZpY2U9U2VsZWNjaW9uZSBBY2VwdGFyIHBhcmEgZXNwZWNpZmljYXIgb3RybyBub21icmUgbyB2XHUwMGVkYSBkZSBhY2Nlc28gcGFyYSBsYSBiaWJsaW90ZWNhLg0KLQ0KLSNQcm9jZXNzIGxpdGVyYWxzDQotUHJvY2Vzc19FeHRlcm5hbElEPUlEIGV4dGVybm86DQotUHJvY2Vzc19QdXJwb3NlPU9iamV0aXZvOg0KLVByb2Nlc3NfU2NvcGU9XHUwMGMxbWJpdG86DQotUHJvY2Vzc19Vc2FnZU5vdGVzPU5vdGFzIGRlIHV0aWxpemFjaVx1MDBmM246DQotUHJvY2Vzc19BbHRlcm5hdGl2ZXM9QWx0ZXJuYXRpdmFzOg0KLVByb2Nlc3NfSG93VG9TdGFmZj1DXHUwMGYzbW8gcHJvdmVlciBkZSBwZXJzb25hbDoNCi1Qcm9jZXNzX0tleUNvbnNpZGVyYXRpb249RmFjdG9yZXMgY2xhdmU6DQotUHJvY2Vzc19TY2FsZT1Fc2NhbGE6DQotUHJvY2Vzc19Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzPUNhcmFjdGVyXHUwMGVkc3RpY2FzIGRlbCBwcm95ZWN0bzoNCi1Qcm9jZXNzX1Jpc2tMZXZlbD1OaXZlbCBkZSByaWVzZ286DQotUHJvY2Vzc19Fc3RpbWF0aW5nVGVjaG5pcXVlPVRcdTAwZTljbmljYSBkZSBjXHUwMGUxbGN1bG86DQotUHJvY2Vzc19Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPUVzcGVjaWFsaWRhZCBkZSBtaWVtYnJvIGRlbCBwcm95ZWN0bzoNCi1Qcm9jZXNzX1R5cGVPZkNvbnRyYWN0PVRpcG8gZGUgY29udHJhdG86DQotDQotIyBFZGl0b3IgUHJldmlldyBOYXZpZ2F0aW9uIEJ1dHRvbnMNCi1iYWNrQnV0dG9uX3RleHQ9QXRyXHUwMGUxcw0KLWZvcndhcmRCdXR0b25fdGV4dD1IYWNpYSBkZWxhbnRlDQotZm9yd2FyZF90ZXh0PUhhY2lhIGRlbGFudGUNCi1zdG9wQnV0dG9uX3RleHQ9RGV0ZW5lcg0KLXJlZnJlc2hCdXR0b25fdGV4dD1SZW5vdmFyDQotcmVmcmVzaF90ZXh0PVJlbm92YXINCi1uZXduYW1lX3RleHQ9TnVldm8gbm9tYnJlOg0KLXByaW50QnV0dG9uX3RleHQ9SW1wcmltaXINCi0NCi0jIENvbnRleHQgbWVudXMNCi1fVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW09JlJlbm92YXINCi1fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbT0mTW9zdHJhciBwcm9waWVkYWRlcw0KLQ0KLV9VSV9NZXRob2RFZGl0b3JfbWVudT0mRWRpdG9yIGRlIG1cdTAwZTl0b2Rvcw0KLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09Jk51ZXZvDQotX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtPU51JmV2byBpZ3VhbA0KLQ0KLV9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsPVNlbGVjY2lcdTAwZjNuDQotX1VJX1BhcmVudFBhZ2VfbGFiZWw9UGFkcmUNCi1fVUlfTGlzdFBhZ2VfbGFiZWw9TGlzdGENCi1fVUlfVHJlZVBhZ2VfbGFiZWw9XHUwMGMxcmJvbA0KLV9VSV9UYWJsZVBhZ2VfbGFiZWw9VGFibGENCi1fVUlfVGFibGVUcmVlUGFnZV9sYWJlbD1cdTAwYzFyYm9sIGRlIHRhYmxhDQotX1VJX09iamVjdENvbHVtbl9sYWJlbD1PYmpldG8NCi1fVUlfU2VsZkNvbHVtbl9sYWJlbD1BdXRvbVx1MDBlMXRpY28NCi0NCi1fVUlfTm9PYmplY3RTZWxlY3RlZD1ObyBzZSBoYSBzZWxlY2Npb25hZG8gbmluZ1x1MDBmYW4gb2JqZXRvDQotX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkPU9iamV0byBzZWxlY2Npb25hZG86IHswfQ0KLV9VSV9NdWx0aU9iamVjdFNlbGVjdGVkPVNlIGhhbiBzZWxlY2Npb25hZG8gezB9IG9iamV0b3MNCi0NCi1fVUlfT3BlbkVkaXRvckVycm9yX2xhYmVsPUFicmlyIGVkaXRvcg0KLQ0KLV9VSV9XaXphcmRfY2F0ZWdvcnk9RWplbXBsbyBkZSBhc2lzdGVudGVzIGRlIGNyZWFjaVx1MDBmM24gZGUgbW9kZWxvcyBkZSBFTUYNCi0NCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfbGFiZWw9TW9kZWxvIGRlIG1cdTAwZTl0b2RvDQotX1VJX01ldGhvZE1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uPUNyZWFyIHVuIG51ZXZvIG1vZGVsbyBkZSBtXHUwMGU5dG9kbw0KLQ0KLV9VSV9NZXRob2RFZGl0b3JfbGFiZWw9RWRpdG9yIGRlIG1vZGVsb3MgZGUgbVx1MDBlOXRvZG8NCi0NCi1fVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZT1NaQ0KLV9VSV9NZXRob2RFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbj1tXHUwMGU5dG9kbw0KLQ0KLV9VSV9XaXphcmRfbGFiZWw9TnVldm8NCi0NCi1fV0FSTl9GaWxlbmFtZUV4dGVuc2lvbj1FbCBub21icmUgZGUgYXJjaGl2byBkZWJlIHRlcm1pbmFyIGVuICcnezB9JycNCi0NCi1fVUlfTW9kZWxPYmplY3Q9T2JqZXRvIGRlIG1vZGVsbw0KLV9VSV9YTUxFbmNvZGluZz1Db2RpZmljYWNpXHUwMGYzbiBYTUwNCi1fVUlfWE1MRW5jb2RpbmdDaG9pY2VzPVVURi04IEFTQ0lJIFVURi0xNiBVVEYtMTZCRSBVVEYtMTZMRSBJU08tODg1OS0xDQotX1VJX1dpemFyZF9pbml0aWFsX29iamVjdF9kZXNjcmlwdGlvbj1TZWxlY2Npb25lIHVuIG9iamV0byBkZSBtb2RlbG8gcGFyYSBjcmVhcg0KLQ0KLV9VSV9GaWxlQ29uZmxpY3RfbGFiZWw9Q29uZmxpY3RvIGRlIGFyY2hpdm9zDQotX1dBUk5fRmlsZUNvbmZsaWN0PUhheSBjYW1iaW9zIHNpbiBndWFyZGFyIHF1ZSBlbnRyYW4gZW4gY29uZmxpY3RvIGNvbiBsb3MgY2FtYmlvcyByZWFsaXphZG9zIGZ1ZXJhIGRlbCBlZGl0b3IuIFx1MDBiZkRlc2VhIGRlc2NhcnRhciBsb3MgY2FtYmlvcyBkZSBlc3RlIGVkaXRvcj8NCi0NCi0jIEFkZCBMaW5rIERpYWxvZw0KLWFkZExpbmtEaWFsb2dfbGlua1R5cGU9VGlwbzoNCi1vcGVuTGlua0NoZWNrYm94X3RleHQ9QWJyaXIgZW5sYWNlIGVuIHVuYSB2ZW50YW5hIHNlcGFyYWRhIGRlbCBuYXZlZ2Fkb3INCi0NCi0jIEFkZCBJbWFnZSBEaWFsb2cNCi1oZWlnaHRMYWJlbF90ZXh0PUFsdHVyYToNCi13aWR0aExhYmVsX3RleHQ9QW5jaG86DQotRWxlbWVudHNWaWV3XzIwPXBhdHJcdTAwZjNuIGRlIHBvc2liaWxpZGFkDQotRWxlbWVudHNWaWV3XzIxPXByb2Nlc28gZGUgZW50cmVnYQ0KLUVsZW1lbnRzVmlld18yMj1wcm9jZXNvDQotRWxlbWVudHNWaWV3XzM1PXswfSBlcyBkZSBzXHUwMGYzbG8gbGVjdHVyYS4gU2VsZWNjaW9uZSBsYSBvcGNpXHUwMGYzbiBwYXJhIHF1ZSBzZSBwdWVkYSBlc2NyaWJpciBhbnRlcyBkZSBjb250aW51YXIuDQotRWxlbWVudHNWaWV3XzM2PVNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBjYXJnYXIgbGEgYmlibGlvdGVjYQ0KLWFsdFRhZ0xhYmVsX3RleHQ9RXRpcXVldGEgQUxUOg0KLWltYWdlU2l6ZUxhYmVsX3RleHQ9TGEgYWx0dXJhIHkgZWwgYW5jaG8gZGUgbGEgaW1hZ2VuIGRlYmVuIHRlbmVyIHVuIG1cdTAwZWRuaW1vIGRlIDEwIHkgdW4gbVx1MDBlMXhpbW8gZGUgNjAwLiBMYSBhbHR1cmEgeSBlbCBhbmNobyBxdWUgbm8gc2VhbiB2XHUwMGUxbGlkb3Mgc2UgY29udmVydGlyXHUwMGUxbiBhIHVuIHRhbWFcdTAwZjFvIGFkZWN1YWRvLg0KLQ0KLSMgUHJvY2VzcyBFZGl0b3INCi1Qcm9jZXNzRWRpdG9yPUVkaXRvciBkZSBwcm9jZXNvcw0KLVByb2Nlc3NFZGl0b3JfTmFtZT1Ob21icmUNCi1Qcm9jZXNzRWRpdG9yX1ByZXNlbnRhdGlvbk5hbWU9Tm9tYnJlIGRlIHByZXNlbnRhY2lcdTAwZjNuDQotUHJvY2Vzc0VkaXRvcl9JbmRleD1cdTAwY2RuZGljZQ0KLVByb2Nlc3NFZGl0b3JfUHJlZGVjZXNzb3JzPVByZWRlY2Vzb3Jlcw0KLSNDb25maWd1cmF0aW9uUGFnZV9TZWxlY3RlZD1TZWxlY3RlZDogDQotQ2hlY2tsaXN0T3JkZXJfZGVzY3JpcHRpb249U2VsZWNjaW9uZSB1biBlbGVtZW50byBkZSBjb21wcm9iYWNpXHUwMGYzbiB5IHB1bHNlIEFycmliYSBvIEFiYWpvIHBhcmEgY2FtYmlhciBlbCBvcmRlbi4NCi1FbGVtZW50c1ZpZXdfcmVuYW1pbmdfdGV4dD1SZW5vbWJyYW5kby4uLg0KLVByb2Nlc3NFZGl0b3JfTW9kZWxJbmZvPUluZm9ybWFjaVx1MDBmM24gZGVsIG1vZGVsbw0KLVByb2Nlc3NFZGl0b3JfUHJlZml4PVByZWZpam8NCi1Nb3ZlRGlhbG9nX21vdmVfdGV4dD1Nb3Zlcg0KLUNoZWNrbGlzdE9yZGVyX3RpdGxlPU9yZGVuYXIgZWxlbWVudG9zIGRlIGNvbXByb2JhY2lcdTAwZjNuDQotUHJvY2Vzc0VkaXRvcl9SZXBldGFibGU9U2UgcHVlZGUgcmVwZXRpcg0KLVByb2Nlc3NFZGl0b3JfT25nb2luZz1Db250aW51bw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N5bmNocm9uaXphdGlvbj1TaW5jcm9uaXphci4uLg0KLVByb2Nlc3NFZGl0b3JfRXZlbnREcml2ZW49Q29uZGljaW9uYWRvIHBvciBzdWNlc29zDQotUHJvY2Vzc0VkaXRvcl9EZWxpdmVyYWJsZT1Qcm9kdWN0byBmaW5hbA0KLVByb2Nlc3NFZGl0b3JfT3B0aW9uYWw9T3BjaW9uYWwNCi1GaWx0ZXJEaWFsb2dfVHlwZV90ZXh0PVRpcG8gZGUgZWxlbWVudG8gZGUgbVx1MDBlOXRvZG86DQotRmlsdGVyRGlhbG9nX0V4cGFuZEFsbD1FeHBhbmRpciB0b2RvDQotTW92ZURpYWxvZ19tb3ZpbmdfdGV4dD1Nb3ZpZW5kby4uLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbldhcm5pbmc9SVVQQTAwMjVXOiBFbCBpY29ubyBkZSBmb3JtYSBwYXJhIHswfSBubyBzZSBlbmN1ZW50cmEgZW4gbGEgdlx1MDBlZGEgZGUgYWNjZXNvOiB7MX0NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWRTaGFwZUljb25FcnJvcj1JVVBBMDAyNUU6IEVycm9yOiBTZWNjaVx1MDBmM24gZGVsIGljb25vIGRlIGZvcm1hOiB7MH0NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX05hbWVMYWJlbD1Ob21icmU6DQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1DcmVhciB1bmEgY29uZmlndXJhY2lcdTAwZjNuIGRlbCBtXHUwMGU5dG9kbyBudWV2YQ0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9OYW1lTGFiZWw9Tm9tYnJlOg0KLUF1dGhvcmluZ1VJUGx1Z2luX25ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGU9TnVldmEgY29uZmlndXJhY2lcdTAwZjNuIGRlbCBtXHUwMGU5dG9kbw0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0xpYnJhcnlNYWluUGFnZV9wYWdlVGl0bGU9Q3JlYXIgdW5hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIG51ZXZhDQotbmV3TGlicmFyeVdpemFyZF90aXRsZT1OdWV2YSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcw0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlVGl0bGU9R3VhcmRhciBjYW1iaW9zDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1Fc3BlY2lmaXF1ZSB1biBub21icmUsIHVuYSBkZXNjcmlwY2lcdTAwZjNuIHkgdW4gZGlyZWN0b3JpbyBkZSBkZXN0aW5vIHBhcmEgbGEgbnVldmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVEZXNjcmlwdGlvbj1TZSBoYW4gbW9kaWZpY2FkbyB1bm8gbyB2YXJpb3MgZWxlbWVudG9zIGRlIG1cdTAwZTl0b2RvLiBTZWxlY2Npb25lIGxvcyBxdWUgZGVzZWUgZ3VhcmRhci4NCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1BYnJpciBjb25maWd1cmFjaW9uZXMgZGVsIG1cdTAwZTl0b2RvDQotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25XaXphcmRfd2luZG93VGl0bGU9QWJyaXIgY29uZmlndXJhY2lvbmVzIGRlbCBtXHUwMGU5dG9kbw0KLUVsZW1lbnRzVmlld19yZXBsYWNlaW5nd2l0aGZvcm1hdF90ZXh0PVJlZW1wbGF6YW5kbyB7MH0uLi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbldhcm5pbmc9SVVQQTAwMjZXOiBFbCBpY29ubyBkZSBub2RvIHBhcmEgezB9IG5vIHNlIGVuY3VlbnRyYSBlbiBsYSB2XHUwMGVkYSBkZSBhY2Nlc286IHsxfQ0KLU1lc3NhZ2VMYWJlbFByb3ZpZGVyX3Vuc2VsZWN0ZWRwYWNrYWdlcz0nJ3swfScnIGNvbnRpZW5lIGVsZW1lbnRvcyBxdWUgaGFjZW4gcmVmZXJlbmNpYSBhIGVsZW1lbnRvcyBkZSBwYXF1ZXRlcyBubyBzZWxlY2Npb25hZG9zDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkTm9kZUljb25FcnJvcj1JVVBBMDAyNkU6IEVycm9yOiBTZWNjaVx1MDBmM24gZGVsIGljb25vIGRlIG5vZG86IHswfQ0KLVN0ZXBzT3JkZXJEaWFsb2dfc3RlcHM9UGFzb3M6IA0KLVN0ZXBzT3JkZXJEaWFsb2dfdGl0bGU9T3JkZW5hciBwYXNvcyBkZSBsYSB0YXJlYQ0KLVByb2Nlc3NFZGl0b3JfUGxhbm5lZD1QbGFuZWFkbw0KLXNwZWNpZnlkaXJlY3RvcnlfdGV4dD1Fc3BlY2lmaXF1ZSB1biBkaXJlY3RvcmlvIHBhcmEgZ3VhcmRhciBsYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBlbg0KLVByb2Nlc3NFZGl0b3JfTXVsdGlwbGVPY2N1cnJlbmNlcz1WYXJpYXMgYXBhcmljaW9uZXMNCi1Qcm9jZXNzRWRpdG9yX0VudHJ5U3RhdGU9RXN0YWRvIGRlIGVudHJhZGENCi1Qcm9jZXNzRWRpdG9yX0V4aXRTdGF0ZT1Fc3RhZG8gZGUgc2FsaWRhDQotc2VsZWN0Q29sdW1uc3RvQWRkX3RleHQ9U2VsZWNjaW9uZSBsYXMgY29sdW1uYXMgcXVlIGRlc2VlIGFcdTAwZjFhZGlyDQotUHJvY2Vzc0VkaXRvcl9UeXBlPVRpcG8NCi1Qcm9jZXNzRWRpdG9yX1RlYW09RXF1aXBvDQotRmlsdGVyRGlhbG9nX3RpdGxlPVNlbGVjY2lvbmFyIGRpXHUwMGUxbG9nbzogDQotDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkPUFcdTAwZjFhZGlyIGRlc2RlIGVsIGNvbnRlbmlkbyBkZWwgJm1cdTAwZTl0b2RvLi4uDQotRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsPUNvbnRyYWVyIHRvZG8NCi1PcGVuQ2hlYXRzaGVldFZpZXdfdGl0bGU9QWJyaXIgdmlzdGEgZGUgaG9qYSBkZSBvcmllbnRhY2lcdTAwZjNuDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbFVwPUNvbnRyYWVyDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbERvd249RXhwYW5kaXINCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXA9TSZvdmVyIGFycmliYQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX01vdmVEb3duPU1vdmVyIGEmYmFqbw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbD1Nb3N0ciZhcg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvcHk9JkNvcGlhci4uLg0KLUZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQ9UGF0cm9uZXMgZGUgbm9tYnJlIChzZSBtb3N0cmFyXHUwMGUxbiBsb3Mgbm9tYnJlcyBxdWUgY29pbmNpZGFuKTogDQotTWV0aG9kTGlicmFyeUVkaXRvcl90aXRsZT1CaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvczogDQotI01lc3NhZ2VWaWV3X3NlbGVjdGVkX3RleHQ9U2VsZWN0ZWQ6IA0KLU1lc3NhZ2VWaWV3X2Vycm1zZ190ZXh0PURlc2NyaXBjaVx1MDBmM24NCi1FbGVtZW50c1ZpZXdfZXJyX3NhdmluZz1JVVBBMDAyN0U6IFNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBndWFyZGFyICcnezB9Jyd7MX0NCi0NCi1lcnJfY29weWluZ19maWxlX3RpdGxlPVNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBjb3BpYXIgZWwgYXJjaGl2bw0KLWVycl9jb3B5aW5nX2ZpbGVfZXJyb3I9SVVQQTAwMjhFOiBObyBzZSBoYSBwb2RpZG8gYXNpZ25hciBlbCBpY29uby4gDQotZXJyX2NvcHlpbmdfZmlsZV9yZWFzb249U2UgaGEgcHJvZHVjaWRvIHVuIGVycm9yIGFsIGNvcGlhciBlbCBhcmNoaXZvIHNlbGVjY2lvbmFkby4gUHVsc2UgZW4gRGV0YWxsZXMgcGFyYSBvYnRlbmVyIG1cdTAwZTFzIGluZm9ybWFjaVx1MDBmM24uDQotZXJyX3Byb2Nlc3NpbmdfZmlsZV90aXRsZT1TZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgcHJvY2VzYXIgZWwgYXJjaGl2bw0KLWVkaXRDb25maWd1cmF0aW9uX3Rvb2x0aXA9RWRpdGFyIGNvbmZpZ3VyYWNpXHUwMGYzbg0KLWVkaXREaWFsb2dfbXNnQ2Fubm90RWRpdD1JVVBBMDAxNUU6IE5vIHNlIHB1ZWRlIGVkaXRhciBlbCBlbGVtZW50bw0KLVNhdmVUaGlzQWN0aW9uX3NhdmVvYmplY3Q9R3VhcmRhciBlc3RlIG9iamV0by4uLg0KLUVsZW1lbnRzVmlld19yZXBsYWNlX3RleHQ9UmVlbXBsYXphcg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0V4dGVuZD0mRXh0ZW5kZXIuLi4NCi1Nb3ZlRGlhbG9nX2Rlc3RpbmF0aW9uX3RleHQ9RXNjb2dlciBkZXN0aW5vIHBhcmEgbG9zIGVsZW1lbnRvcyBzZWxlY2Npb25hZG9zOg0KLWNob29zZURlZmF1bHREaXJlY3RvcnlfdGV4dD1Fc2NvZ2VyIHVuIGRpcmVjdG9yaW8gcG9yIG9taXNpXHUwMGYzbiBwYXJhIGxhcyBiaWJsaW90ZWNhczoNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzcz0mU3VwcmltaXINCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzczI9T3BjaW9uZXMgZGUgJnB1YmxpY2FjaVx1MDBmM24uLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbT1EaWFncmFtYXMgZGVmaW5pZG9zIHBvciBlbCAmdXN1YXJpby4uLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ190aXRsZT1Bc2lnbmFyIGRpYWdyYW1hcyBkZWZpbmlkb3MgcG9yIGVsIHVzdWFyaW8NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYWRJbWFnZT1EaWFncmFtYSBkZSBsYSBhY3RpdmlkYWQ6DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkZEltYWdlPURpYWdyYW1hIGRlIGRldGFsbGUgZGUgbGEgYWN0aXZpZGFkOg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ193cGRJbWFnZT1EaWFncmFtYSBkZSBkZXBlbmRlbmNpYSBkZWwgcHJvZHVjdG8gZGUgdHJhYmFqbzoNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfbm90YUZpbGU9SVVQQTAwMDRFOiBMYSB2XHUwMGVkYSBkZSBhY2Nlc28gZXNwZWNpZmljYWRhIG5vIGVzIHVuIGFyY2hpdm8uDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2Fzc2lnbkJ1dHRvbj1TZWxlY2Npb25hci4uLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19lbnRlcmVkSW1hZ2VOb3RGb3VuZD1JVVBBMDAyNEU6IExhIGltYWdlbiBlc3BlY2lmaWNhZGEgbm8gZXhpc3RlIGVuIGxhIGJpYmxpb3RlY2EuIEFzZWdcdTAwZmFyZXNlIGRlIHF1ZSBoYSBlbnRyYWRvIGxhIHZcdTAwZWRhIGRlIGFjY2VzbyByZWxhdGl2YSBhbCBkaXJlY3RvcmlvIHJhXHUwMGVkeiBkZSBsYSBiaWJsaW90ZWNhLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19zZWxlY3RlZEltYWdlTm90Rm91bmQ9SVVQQTAwMzBFOiBMYSBpbWFnZW4gcXVlIGhhIHNlbGVjY2lvbmFkbyBubyBzZSBlbmN1ZW50cmEgZW4gbGEgYmlibGlvdGVjYS4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURJbWFnZT1VdGlsaXphciBsYSBpbWFnZW4gZGVsIGRpYWdyYW1hIGRlIGFjdGl2aWRhZCBwYXJhIGV4YW1pbmFyIHkgcHVibGljYXINCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURESW1hZ2U9VXRpbGl6YXIgbGEgaW1hZ2VuIGRlbCBkaWFncmFtYSBkZSBhY3RpdmlkYWQgZGUgZGVzZ2xvc2UgcGFyYSBleGFtaW5hciB5IHB1YmxpY2FyDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZVdQREltYWdlPVV0aWxpemFyIGxhIGltYWdlbiBkZWwgZGlhZ3JhbWEgZGUgZGVwZW5kZW5jaWEgZGVsIHByb2R1Y3RvIGRlIHRyYWJham8gcGFyYSBleGFtaW5hciB5IHB1YmxpY2FyDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29udHJpYnV0ZT1Db250cmlidWNpXHUwMGYzbiBsb2NhbA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JlcGxhY2U9U3VzdGl0dWNpXHUwMGYzbiBsb2NhbA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0RpYWdyYW1zPURpYSZncmFtYXMNCi1Qcm9jZXNzRWRpdG9yX2FjdGlvbl9kZWVwQ29weT1Db3BpYSBlbiBwcm9mdW4mZGlkYWQuLi4NCi1GaWx0ZXJEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbj1EZXNjcmlwY2lcdTAwZjNuIGJyZXZlOg0KLUNvbmZpZ3VyYXRpb25QYWdlX2hpZGVUb29sVGlwPU1vc3RyYXIvT2N1bHRhciBlbGVtZW50b3MgZGVzYWN0aXZhZG9zDQotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb249RGVzY3JpcGNpXHUwMGYzbjoNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc0FsbD1ObyBwdWJsaWNhciBuYWRhDQotRmlsdGVyRGlhbG9nX1BhdHRlcm5fZGVzY3JpcHRpb249TG9zIHBhdHJvbmVzIHNlIHNlcGFyYW4gbWVkaWFudGUgY29tYXMsIGRvbmRlICo9Y3VhbHF1aWVyIGNhZGVuYSBkZSBjYXJhY3RlcmVzIHkgPz1jdWFscXVpZXIgY2FyXHUwMGUxY3Rlcg0KLUNvbmZpZ3VyYXRpb25QYWdlX1RyZWVUaXRsZUxhYmVsPUNvbnRlbmlkbzoNCi1Db25maWd1cmF0aW9uUGFnZV9Mb2FkaW5nTWVzc2FnZT1DYXJnYW5kbyBjb25maWd1cmFjaVx1MDBmM24sIGVzcGVyZS4uLg0KLU1vdmVEaWFsb2dfdmFsaWRkZXN0aW5hdGlvbl90ZXh0PUVsIGRlc3Rpbm8gZGUgbW92aW1pZW50byBlc3BlY2lmaWNhZG8gbm8gZXMgdlx1MDBlMWxpZG8uDQotTW92ZURpYWxvZ19jYW5ub3RNb2RpZnlEZXN0aW5hdGlvbj1JVVBBMDAzNEU6IEVsIGRlc3Rpbm8gc2VsZWNjaW9uYWRvIG5vIHNlIHB1ZWRlIG1vZGlmaWNhci4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGw9UHVibGljYXIgdG9kbw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5CYXNlQWN0aXZpdHk9QWJyaXIgYWN0aXZpZGFkIGJcdTAwZTFzaWNhDQotUHJvY2Vzc0Zvcm1FZGl0b3JfZXhwYW5BbGxBY3Rpb25MYWJlbD1FJnhwYW5kaXIgdG9kbw0KLVByb2Nlc3NGb3JtRWRpdG9yX2NvbGxhcHNlQWxsQWN0aW9uTGFiZWw9Q28mbGFwc2FyIHRvZG8NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEaWFncmFtPUFicmlyIGRpYWdyYW1hIGRlIGxhICZhY3RpdmlkYWQNCi1Qcm9jZXNzRWRpdG9yX3Byb21wdFRvRGVsZXRlQmVmb3JlUmV2ZWFsPUxvcyBkZXNjcmlwdG9yZXMgbm8gZWxpbWluYWRvcyBxdWUgc2UgbGlzdGFuIGVuIERldGFsbGVzIGRlYmVuIHN1cHJpbWlyc2UgcGFyYSBldml0YXIgbGEgZHVwbGljYWNpXHUwMGYzbiBkZXNwdVx1MDBlOXMgZGUgcmV2ZWxhciBsb3MgZWxlbWVudG9zIHNlbGVjY2lvbmFkb3MuIFB1bHNlIEFjZXB0YXIgc2kgZGVzZWEgc3VwcmltaXJsb3MgeSBjb250aW51YXIuDQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX1NlbGVjdENvbHVtbnM9U2VsZWNjaW9uZSBsYXMgY29sdW1uYXMgcXVlIGRlc2VlIGFcdTAwZjFhZGlyDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT1BYnJpciBkaWFncmFtYSBkZSAmZGV0YWxsZXMgZGUgbGEgYWN0aXZpZGFkDQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX0NvbHVtblNlbGVjdGlvbj1TZWxlY2NpXHUwMGYzbiBkZSBjb2x1bW5hczoNCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3dpdGNoQ29uZmlndXJhdGlvbj1WYXlhIGEgbGEgY29uZmlndXJhY2lcdTAwZjNuIHBvciBvbWlzaVx1MDBmM24gZGVsIHByb2Nlc28gY3VhbmRvIGFjdGl2ZSB1biBlZGl0b3IgZGUgcHJvY2Vzbw0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zdXBwcmVzc2lvbkdyb3VwVGl0bGU9U3VwcmVzaVx1MDBmM24NCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfaW5oZXJpdFN1cHByZXNzaW9uU3RhdGU9SGVyZWRhciBlc3RhZG9zIGRlIHN1cHJlc2lcdTAwZjNuDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW09QWJyaXIgZGlhZ3JhbWEgZGUgZGVwZW5kZW5jaWEgZGVsIHByb2R1Y3RvIGRlICZ0cmFiYWpvDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw9Qm9ycmFyDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9U2VsZWNjaW9uYXIuLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9JbnNlcnROZXdQaGFzZT1JbnNlcnRhciBmYXNlIG51ZXZhDQotVmlld0hlbHBlcl9yZWxvYWRMaWJPblJvbGxiYWNrRXJyb3I9Tm8gc2UgaGEgcG9kaWRvIHJlY3VwZXJhciBkZSB1biBlcnJvciBkZSBwZXJtYW5lbmNpYS4gRGViZSB2b2x2ZXIgYSBjYXJnYXIgbGEgYmlibGlvdGVjYSBwYXJhIHJlc3RhdXJhciBzdSBlc3RhZG8gb3JpZ2luYWwuDQotVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZF90ZXh0PUVsIGVsZW1lbnRvICcnezB9JycgeWEgc2UgaGEgc3VwcmltaWRvLg0KLVZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRjb25maXJtX3RleHQ9RWwgZWxlbWVudG8gJyd7MH0nJyB5YSBzZSBoYSBzdXByaW1pZG8uIFx1MDBiZkRlc2VhIGVsaW1pbmFybG8gZGUgJyd7MX0nJz8NCi1Db25maWd1cmF0aW9uUGFnZV9BZGRNaXNzaW5nVG9vbFRpcD1BXHUwMGYxYWRpciByZWZlcmVuY2lhcyBhdXNlbnRlcw0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uPURlc2NyaXBjaVx1MDBmM24NCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25HZW5lcmFsSW5mbz1JbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXBwbHlQYXR0ZXJuPUFwbGljYXIgcGEmdHJcdTAwZjNuDQotTW92ZURpYWxvZ19zZWxlY3RkZXN0aW5hdGlvbl90ZXh0PVNlbGVjY2lvbmUgdW4gZGVzdGluby4NCi1Nb3ZlRGlhbG9nX25vbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZz1ObyBzZSBoYSBlc3BlY2lmaWNhZG8gbmluZ1x1MDBmYW4gZGVzdGlubyBkZSBtb3ZpbWllbnRvLg0KLU1ldGhvZExpYnJhcnlFZGl0b3JfdHJvdWJsZW9iamVjdD0uIE9iamV0byBwcm9ibGVtXHUwMGUxdGljbzogDQotTWVzc2FnZUxhYmVsUHJvdmlkZXJfZXJyY2hpbGRwa2dzPVVuIHByb2Nlc28gbyBwYXF1ZXRlIGRlIGNvbnRlbmlkbyBoaWpvIGNvbnRpZW5lIGVsZW1lbnRvcyBjb24gcmVmZXJlbmNpYXMgYXVzZW50ZXMNCi1Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX1RpdGxlPU9wY2lvbmVzIGRlIHB1YmxpY2FjaVx1MDBmM24gZGVsIGRpYWdyYW1hDQotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19NZXNzYWdlPVNlbGVjY2lvbmUgZWwgZGlhZ3JhbWFzIHF1ZSBkZXNlZSBwdWJsaWNhciBvIGFudWxlIGxhIHNlbGVjY2lcdTAwZjNuIHBhcmEgbm8gcHVibGljYXJsbw0KLVByb2Nlc3NFZGl0b3JfVGl0bGU9RWRpdG9yIGRlIHByb2Nlc29zOiANCi1TYXZlQXN3aXRoZG90c190ZXh0PUd1YXJkYXIgY29tby4uLg0KLVByb2Nlc3NFZGl0b3JfV29ya0JyZWFrZG93blN0cnVjdHVyZT1Fc3RydWN0dXJhIGRlIGRlc2dsb3NlIGRlIHRyYWJham8NCi1Qcm9jZXNzRWRpdG9yX1RlYW1BbGxvY2F0aW9uPUFzaWduYWNpXHUwMGYzbiBkZSBlcXVpcG9zDQotUHJvY2Vzc0VkaXRvcl9Xb3JrUHJvZHVjdFVzYWdlPVV0aWxpemFjaVx1MDBmM24gZGVsIHByb2R1Y3RvIGRlIHRyYWJham8NCi1Qcm9jZXNzRWRpdG9yX0NvbnNvbGlkYXRlZFZpZXc9VmlzdGEgY29uc29saWRhZGENCi1Qcm9jZXNzRWRpdG9yX2NvbmZpcm1BdXRvU3luY2g9RXN0YSBvcGVyYWNpXHUwMGYzbiByZW51ZXZhIGxvcyBkZXNjcmlwdG9yZXMgc2VsZWNjaW9uYWRvcyBvIHRvZG9zIGxvcyBkZXNjcmlwdG9yZXMgcG9yIGRlYmFqbyBkZSBsYXMgYWN0aXZpZGFkZXMgc2VsZWNjaW9uYWRhcyBxdWUgc2UgaGFuIG1hcmNhZG8gY29tbyAiU2luY3Jvbml6YWRvIGNvbiBlbCBvcmlnZW4iIGVuIGxhIHBlc3RhXHUwMGYxYSBHZW5lcmFsIGRlIGxhIHZpc3RhIGRlIHByb3BpZWRhZGVzLiAgUmVudWV2YSBsb3MgZGVzY3JpcHRvcmVzIGNvbiBsYXMgcHJvcGllZGFkZXMgb3JpZ2luYWxlcyBkZSBsb3MgZWxlbWVudG9zIGRlIGNvbnRlbmlkbyBkZWwgbVx1MDBlOXRvZG8gZW5sYXphZG8gZGViYWpvIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBwb3Igb21pc2lcdTAwZjNuIGRlbCBwcm9jZXNvLiAgVGVuZ2EgZW4gY3VlbnRhIHF1ZSBlc3RvIG5vIGFjdHVhbGl6YXJcdTAwZTEgbmluZ1x1MDBmYW4gZGVzY3JpcHRvciBlbmxhemFkbyBkZSBmb3JtYSBkaW5cdTAwZTFtaWNhIChjdXJzaXZhIHZlcmRlKS4gIFx1MDBiZkRlc2VhIGNvbnRpbnVhcj8NCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjE9Q29uZmlndXJhY2lcdTAwZjNuDQotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24yPVNlbGVjY2lcdTAwZjNuIGRlIHBhcXVldGUgeSBwbHVnLWluDQotTmV3TGlicmFyeURpYWxvZ19uZXdsaWJyYXJ5X2FzPUNyZWFyIG51ZXZhIGJpYmxpb3RlY2EgY29tbw0KLU5ld1BsdWdpbkRpYWxvZ19uZXdwbHVnaW5fdGV4dD1OdWV2byBwbHVnLWluIGRlIG1cdTAwZTl0b2RvDQotU2VsZWN0RWxlbWVudERpYWxvZ190aXRsZV90ZXh0PVNlbGVjY2lvbmFyIGVsIGVsZW1lbnRvIG8gdW5vIGRlIHN1cyBjb2xhYm9yYWRvcmVzOg0KLU9wZW5Db25maWdEaWFsb2duZXdjb25maWdfdGV4dD1OdWV2YSBjb25maWd1cmFjaVx1MDBmM246DQotcHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlX0JTRWRpdG9yPUVkaXRvciBkZSBwcm9jZXNvcw0KLQ0KLSMgQWJzdHJhY3REaWFncmFtRWRpdG9yDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2FsaWduTWVudV90ZXh0PUFsaW5lYXINCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1SZW5vdmFyIGRlc2RlIGFjdGl2aWRhZCBiXHUwMGUxc2ljYQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dD1Gb3JtYXRlYXIgcmVjdWFkcm8gZGUgdGV4dG8uLi4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PUhvcml6b250YWxtZW50ZSBoYXN0YSBlbCBwcm9tZWRpbw0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9SG9yaXpvbnRhbG1lbnRlIGhhc3RhIGxhIHByaW1lcmEgc2VsZWNjaVx1MDBmM24NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVZlcnRpY2FsbWVudGUgaGFzdGEgZWwgcHJvbWVkaW8NCi1NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX3RpdGxlPUluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbA0KLU1vdmVEaWFsb2dfaW52YWxpZF9tb3ZlX2Rlc3RpbmF0aW9uX3Byb2JsZW1fbXNnPUlVUEEwMDQxRTogRWwgZWxlbWVudG8gc2VsZWNjaW9uYWRvIG5vIHNlIHB1ZWRlIG1vdmVyIGFsIGRlc3Rpbm8gZXNwZWNpZmljYWRvLg0KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZW1vZGVsbGlicmFyeT1HdWFyZGFuZG8gYmlibGlvdGVjYSBkZSBtb2RlbG8uLi4NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX2Vycm9yX2RpYWxvZ190aXRsZT1FcnJvcg0KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZV9saWJyYXJ5X3Byb2JsZW1fbXNnPUlVUEEwMDMzRTogU2UgaGEgcHJvZHVjaWRvIHVuIHByb2JsZW1hIGFsIGd1YXJkYXIgbGEgYmlibGlvdGVjYS4NCi1NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dD1cdTAwYmZFc3RcdTAwZTEgc2VndXJvIGRlIHF1ZSBkZXNlYSBzdXByaW1pciAnJ3swfScnPw0KLUNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX0NvbnRlbnRFbGVtZW50X3RleHQ9RWxlbWVudG9zIGRlIGNvbnRlbmlkbzogDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Ccm93c2VCdXR0b25MYWJlbD1FeGFtaW5hci4uLg0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb249RXNwZWNpZmlxdWUgdW4gbm9tYnJlIHkgdW5hIGRlc2NyaXBjaVx1MDBmM24gcGFyYSBsYSBudWV2YSBjb25maWd1cmFjaVx1MDBmM24gZGVsIG1cdTAwZTl0b2RvLg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlVGl0bGU9R3VhcmRhciBsb3MgY2FtYmlvcyB5IGNlcnJhciB0b2RvcyBsb3MgZWRpdG9yZXMNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PVZlcnRpY2FsbWVudGUgaGFzdGEgbGEgcHJpbWVyYSBzZWxlY2NpXHUwMGYzbg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQ9R3VhcmRhcg0KLUF0dGFjaG1lbnREaWFsb2dhdHRhY2hGaWxlX3RleHQ9QWRqdW50YXIgYXJjaGl2bw0KLUNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnQ9Q29udGVuaWRvIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbg0KLU9wZW5Db25maWdEaWFsb2dvcGVuY29uZmlnX3RleHQ9QWJyaXIgY29uZmlndXJhY2lcdTAwZjNuDQotRWxlbWVudHNWaWV3X3JlcGxhY2VBY3Rpb25fdGV4dD1SZWVtcGxhemFyLi4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfbWVzc2FnZT1HdWFyZGFuZG8gezB9DQotQ29uZmlndXJhdGlvblBhZ2VfU2hvd0Vycm9yVG9vbFRpcD1Nb3N0cmFyIHZpc29yIGRlIHJlZ2lzdHJvcyBkZSBhdmlzb3MgZGUgY29uZmlndXJhY2lcdTAwZjNuDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRm9ybVByZWZpeD1Db25maWd1cmFjaVx1MDBmM246IA0KLUNoZWNrbGlzdE9yZGVyX2NoZWNrbGlzdGl0ZW1zX3RleHQ9RWxlbWVudG9zIGRlIGNvbXByb2JhY2lcdTAwZjNuOiANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw9TW92ZXIgbm9kbw0KLUNvbmZpZ3VyYXRpb25QYWdlX01ha2VDbG9zdXJlVG9vbFRpcD1FZmVjdFx1MDBmYWUgZWwgY2llcnJlIGFycmVnbGFuZG8gbG9zIGVycm9yZXMNCi1OZXdQbHVnaW5EaWFsb2dfcmVmZXJlbmNlcGx1Z2luX3RleHQ9UGx1Zy1pbnMgZGUgcmVmZXJlbmNpYToNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfY3JlYXRlRnJlZVRleHRfdGV4dD1DcmVhciB1biB0ZXh0byBsaWJyZQ0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0xhYmVsPVZpc3RhIHByZWxpbWluYXIgZGVsIGljb25vIGRlIG5vZG86DQotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9jb25uZWN0X3RleHQ9SVVQQTAwMzJXOiBObyBzZSBwdWVkZSBjb25lY3Rhcg0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9zYW1lcHJlZGFuZHN1Y190ZXh0PUlVUEEwMDMzVzogTm8gcHVlZGUgdGVuZXIgZWwgbWlzbW8gZWxlbWVudG8gZGUgZGVzZ2xvc2UgcXVlIGVsIHByZWRlY2Vzb3IgbyBlbCBzdWNlc29yDQotDQotIyBFZGl0b3JDaG9vc2VyDQotRWRpdG9yQ2hvb3Nlcl9sb2FkZEVycm9yRGxnVGl0bGU9QWJyaXIgZWRpdG9yDQotRWRpdG9yQ2hvb3Nlcl9SZXNvdXJjZXNFcnJvcj1Fc3RlIGVsZW1lbnRvIHRpZW5lIGVycm9yZXMuIEVzIHJlY29tZW5kYWJsZSBhcnJlZ2xhciBlc3RvcyBlcnJvcmVzIGFudGVzIGRlIGNvbnRpbnVhciAoY29uc3VsdGUgbG9zIGRldGFsbGVzKS5cblwNCi1cblwNCi1QdWxzZSBBY2VwdGFyIHBhcmEgY29udGludWFyIHNpbiBhYnJpciBlbCBlZGl0b3IuIENpZXJyZSBlc3RlIGRpXHUwMGUxbG9nbyBwYXJhIGFicmlyIGVsIGVkaXRvci4NCi1Db25maWd1cmF0aW9uUGFnZV9Gb3JtUHJlZml4PUNvbmZpZ3VyYWNpXHUwMGYzbjogDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uTmFtZT1Ob21icmU6DQotQXR0YWNobWVudERpYWxvZ0ZpbGVVUkxfdGV4dD1VUkwgZGVsIGFyY2hpdm86DQotU3RlcHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbj1TZWxlY2Npb25lIHVuIHBhc28geSBwdWxzZSBBcnJpYmEgbyBBYmFqbyBwYXJhIGNhbWJpYXIgZWwgb3JkZW4uDQotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJfc2F2ZT1TZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgZ3VhcmRhcg0KLU1lc3NhZ2VWaWV3X2VycmVsZW1lbnRfdGV4dD1FbGVtZW50byBkZSByZWZlcmVuY2lhDQotTWVzc2FnZVZpZXdfcmVmZWxlbWVudF90ZXh0PUVsZW1lbnRvIGNvbiByZWZlcmVuY2lhcw0KLQ0KLSNBY3Rpdml0eSBEaWFncmFtDQotQWN0aXZpdHlEaWFncmFtRWRpdG9yX2NyZWF0ZVN0YXJ0Tm9kZV90ZXh0PUNyZWFyIHVuIG5vZG8gZGUgaW5pY2lvDQotQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudERlc2NyaXB0aW9uPVNlbGVjY2lvbmUgbG9zIHBsdWctaW5zIGRlIG1cdTAwZTl0b2RvLCBsb3MgcHJvY2Vzb3MgeSBsb3MgcGFxdWV0ZXMgZGUgY29udGVuaWRvIHF1ZSBzZSBpbmNsdWlyXHUwMGUxbiBlbiBlc3RhIGNvbmZpZ3VyYWNpXHUwMGYzbi4NCi1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbl90ZXh0PURpXHUwMGUxbG9nbyBkZSBvcmRlbiBkZSBlbGVtZW50b3MgZGUgY29udGVuaWRvIGRlIGxhIGNhdGVnb3JcdTAwZWRhIHBlcnNvbmFsaXphZGENCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RpcmVjdG9yeUxhYmVsPURpcmVjdG9yaW86DQotUm9vdFByZWZQYWdlX2VuYWJsZXByb2Nlc3Njb250cmlidXRpb25fdGV4dD1IYWJpbGl0YXIgY29udHJpYnVjaVx1MDBmM24gYWwgcHJvY2Vzbw0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uX3RleHQ9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RhIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZWwgbVx1MDBlOXRvZG8uDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25MYWJlbD1EZXNjcmlwY2lcdTAwZjNuOg0KLUNvbnRyaWJ1dGlvblNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9RXNjb2dpZW5kbyBjb2xhYm9yYWRvcmVzIHBhcmEgJyd7MH0nJw0KLUVsZW1lbnRzVmlld19vcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb25fdGV4dD1BYnJpciBhIHRyYXZcdTAwZTlzIGRlIGxvcyBlbGVtZW50b3MgZGUgdmFyaWFiaWxpZGFkDQotVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3RpdGxlPXNlbGVjY2lvbmFuZG8gZWxlbWVudG9zIGRlIHZhcmlhYmlsaWRhZCBwYXJhICcnezB9JycNCi1WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdmlld2VyTGFiZWw9RWxlbWVudG9zIGRlIHZhcmlhYmlsaWRhZCBwYXJhICcnezB9JycNCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfTGFiZWw9VmlzdGEgcHJlbGltaW5hciBkZWwgaWNvbm8gZGUgZm9ybWE6DQotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9kZWxldGVfdGV4dD1ObyBzZSBwdWVkZSBzdXByaW1pcg0KLUFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9QWJyaXIgZGlhZ3JhbWEgZGUgZGV0YWxsZXMgZGUgbGEgYWN0aXZpZGFkIA0KLU1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fZGVzY3JpcHRpb249UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw9Qm9ycmFyDQotV1BDb21wYXJ0bWVudEZpZ3VyZV8wPU51ZXZvIGRlc2NyaXB0b3IgZGUgcHJvZHVjdG9zIGRlIHRyYWJham8NCi1wcm9tcHRmb3JfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZF90ZXh0PVB1YmxpY2FyIG8gZXhhbWluYXIgZGlhZ3JhbWFzIGRlIGRldGFsbGVzIGRlIGxhIGFjdGl2aWRhZCBxdWUgbm8gc2UgaGF5YW4gY3JlYWRvIGVuIGVsIGVkaXRvciBkZSBwcm9jZXNvcw0KLXByb21wdF9mb3JfcHVibGlzaF9leHRlbmRfYWN0aXZpdHlfZGlhZ3JhbT1QdWJsaWNhciB5IGV4YW1pbmFyIGRpYWdyYW1hcyBkZSBhY3RpdmlkYWQgcGFyYSBleHRlbnNpb25lcyBkZSBhY3RpdmlkYWQgbm8gbW9kaWZpY2FkYXMNCi0NCi0jQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2cNCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19OYW1lUGF0dGVybj1QYXRyb25lcyBkZSBub21icmUgKHNlIG1vc3RyYXJcdTAwZTFuIGxvcyBub21icmVzIHF1ZSBjb2luY2lkYW4pOg0KLXNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uX2xhYmVsPU1vc3RyYXIgZW4gZWwgbmF2ZWdhZG9yIGRlIHJlY3Vyc29zDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfUGF0dGVybj1Mb3MgcGF0cm9uZXMgc2Ugc2VwYXJhbiBtZWRpYW50ZSBjb21hcywgZG9uZGUgKj1jdWFscXVpZXIgY2FkZW5hIGRlIGNhcmFjdGVyZXMgeSA/PWN1YWxxdWllciBjYXJcdTAwZTFjdGVyDQotZXJyX3Byb2Nlc3NpbmdfZmlsZV9kZXNjcmlwdGlvbj1JVVBBMDAyOUU6IFNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBwcm9jZXNhciBlbCBhcmNoaXZvIHNlbGVjY2lvbmFkby4gUHVsc2UgZW4gRGV0YWxsZXMgcGFyYSBvYnRlbmVyIG1cdTAwZTFzIGluZm9ybWFjaVx1MDBmM24uDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQ2F0ZWdvcnlUeXBlPVRpcG8gZGUgY2F0ZWdvclx1MDBlZGE6DQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbj1EZXNjcmlwY2lcdTAwZjNuIGJyZXZlOg0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1NlbGVjdENhdGVnb3JpZXM9U2VsZWNjaW9uYXIgY2F0ZWdvclx1MDBlZGFzDQotDQotI2xvZyBtZXNzYWdlcw0KLWNoZWF0c2hlZXRfbG9hZF9mYWlsdXJlX2xvZ19tc2c9Tm8gc2UgaGEgcG9kaWRvIGFicmlyIGxhIGhvamEgZGUgb3JpZW50YWNpXHUwMGYzbiBzb2xpY2l0YWRhOiANCi0NCi1uZXdDb25maWd1cmF0aW9uV2lyYXpkX2NyZWF0ZUVycm9yPUlVUEEwMDM1RTogTm8gc2UgaGEgcG9kaWRvIGNyZWFyIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBzYXRpc2ZhY3RvcmlhbWVudGUNCi1uZXdQbHVnaW5XaXphcmRfY3JlYXRlRXJyb3I9SVVQQTAwMzZFOiBObyBzZSBwdWVkZSBjcmVhciBlbCBwbHVnLWluIHNhdGlzZmFjdG9yaWFtZW50ZQ0KLWVycm9yRGlhbG9nX21vdmVFcnJvcj1JVVBBMDAzN0U6IE5vIHNlIHB1ZWRlIG1vdmVyIGVsIGVsZW1lbnRvIHNhdGlzZmFjdG9yaWFtZW50ZQ0KLXJlbmFtZURpYWxvZ19yZW5hbWVFcnJvcj1JVVBBMDAzOEU6IE5vIHNlIHB1ZWRlIHJlbm9tYnJhciBlbCBlbGVtZW50byBzYXRpc2ZhY3RvcmlhbWVudGUNCi1lcnJvckRpYWxvZ19jcmVhdGVFcnJvcj1JVVBBMDAzOUU6IE5vIHNlIHB1ZWRlIGNyZWFyIGVsIGVsZW1lbnRvIHNhdGlzZmFjdG9yaWFtZW50ZQ0KLWR1cGxpY2F0ZVBsdWdpbk5hbWVFcnJvcl9tc2c9SVVQQTAxMDFFOiBFbCBub21icmUgJyd7MH0nJyB5YSBleGlzdGUuIEVzY3JpYmEgdW4gbm9tYnJlIGRpZmVyZW50ZSB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotDQotI05ldyBTdHJpbmdzIGZvciBQcm9jZXNzRWRpdG9yIENvbnRleHQgbWVudSBkaWFncmFtIGltYWdlcw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFESW1hZ2U9QXNpZ25hciBpbWFnZW4gQUQuLi4NCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlPVJlbm92YXIgZXJyb3INCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvck1zZz1FcnJvciBhbCByZW5vdmFyIGVsIGVkaXRvcg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFEREltYWdlPUFzaWduYXIgaW1hZ2VuIEFERC4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZFdQREltYWdlPUFzaWduYXIgaW1hZ2VuIFdQRC4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFESW1hZ2VJblB1Ymxpc2hpbmc9VXRpbGl6YXIgaW1hZ2VuIEFEIGFsIHB1YmxpY2FyDQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVN1cHByZXNzPUxvcyBkZXNjcmlwdG9yZXMgZWxpbWluYWRvcyBxdWUgc2UgbGlzdGFuIGVuIERldGFsbGVzIGRlYmVuIHN1cHJpbWlyc2UgcGFyYSBldml0YXIgbGEgZHVwbGljYWNpXHUwMGYzbiBkZXNwdVx1MDBlOXMgZGUgc3VwcmltaXIgbG9zIGVsZW1lbnRvcyBzZWxlY2Npb25hZG9zLiBQdWxzZSBBY2VwdGFyIHNpIGRlc2VhIHN1cHJpbWlybG9zIHkgY29udGludWFyLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFEREltYWdlSW5QdWJsaXNoaW5nPVV0aWxpemFyIGltYWdlbiBBREQgYWwgcHVibGljYXINCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VXUERJbWFnZUluUHVibGlzaGluZz1VdGlsaXphciBpbWFnZW4gV1BEIGFsIHB1YmxpY2FyDQotUHJvY2Vzc0VkaXRvcl9EaWFncmFtSW1hZ2VfSW5wdXREaWFsb2dfaW5pdGlhbFZhbHVlPVZcdTAwZWRhIGRlIGFjY2VzbyBhIGxhIGltYWdlbg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1Nob3dMaW5rZWRFbGVtZW50aW5MaWJyYXJ5Vmlldz1Nb3N0cmFyIGVsZW1lbnRvIGVuJmxhemFkbyBlbiBsYSB2aXN0YSBkZSBiaWJsaW90ZWNhDQotUHJvY2Vzc0VkaXRvcl91cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uX2xhYmVsPUFjdHVhbGl6YXIgbGEgc3VwcmVzaVx1MDBmM24gZGVzZGUgbGEgJmJhc2UNCi1Qcm9jZXNzRWRpdG9yX0NvbnRleHRNZW51X0RpYWdyYW1JbWFnZXM9SW1cdTAwZTFnZW5lcyBkZSBkaWFncmFtYQ0KLQ0KLSNTdHJpbmdzIGZvciBzeW5jaHJvbml6YXRpb24gd2l6YXJkIG9uIHByb2Nlc3MgZWRpdG9yJ3MgQlMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RpdGxlPURlc2NyaXBjaVx1MDBmM24gZGUgc2luY3Jvbml6YWNpXHUwMGYzbg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfdGV4dD1MZWEgbGEgaW5mb3JtYWNpXHUwMGYzbiBzaWd1aWVudGUgcXVlIGV4cGxpY2EgcXVcdTAwZTkgc2luY3Jvbml6YWNpXHUwMGYzbiBwZXJzb25hbGl6YWRhIHNlIGVmZWN0dWFyXHUwMGUxLg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RpdGxlPVNlbGVjY2lvbmFyIGNvbmZpZ3VyYWNpXHUwMGYzbg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RleHQ9U2VsZWNjaW9uZSBsYSBjb25maWd1cmFjaVx1MDBmM24gcXVlIGRlc2VhIHV0aWxpemFyIHBhcmEgbGEgc2luY3Jvbml6YWNpXHUwMGYzbi4gIFwNCi1MYSBzZWxlY2NpXHUwMGYzbiBkZXRlcm1pbmEgcXVcdTAwZTkgY29udHJpYnVjaW9uZXMgeSByZWVtcGxhem9zIHNlIHV0aWxpemFyXHUwMGUxbiBwYXJhIGxhIHNpbmNyb25pemFjaVx1MDBmM24uDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfY29uZmlnTGFiZWw9Q29uZmlndXJhY2lcdTAwZjNuOg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90aXRsZT1TZWxlY2Npb25hciBwcm9waWVkYWRlcyBwYXJhIHNpbmNyb25pemFyDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Byb3BlcnRpZXNfbGFibGU9UHJvcGllZGFkZXMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbmFtZV9sYWJsZT1Ob21icmUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJlc2VudGF0aW9uTmFtZV9sYWJsZT1Ob21icmUgZGUgcHJlc2VudGFjaVx1MDBmM24NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYnJpZWZEZXNjX2xhYmxlPURlc2NyaXBjaVx1MDBmM24gYnJldmUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3B0aW9uYWxJbm91dHNfbGFiZWw9RW50cmFkYXMgb3BjaW9uYWxlcw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9tYW5kYXRvcnlJbnB1dHNfbGFibGU9RW50cmFkYXMgb2JsaWdhdG9yaWFzDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX291dHB1dHNfbGFiZWw9U2FsaWRhcw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX2xhYmVsPVJlYWxpemFkb3IgcHJpbmNpcGFsDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2FkZG5QZXJmb3JtZXJzX2xhYmxlPU90cmFzIGFjdGl2aWRhZGVzIGFkaWNpb25hbGVzIHF1ZSByZWFsaXphDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Jlc3BvbnNpYmxlUm9sZXNfbGFibGU9Um9sZXMgcmVzcG9uc2FibGVzDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2NvbnRuQXJ0aWZhY3RzX2xhYmVsPUFydGVmYWN0b3MgY29udGVuaWRvcw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9kaWx2ZWRQYXJ0c19sYWJlbD1Db21wb25lbnRlcyBkZSBwcm9kdWN0byBmaW5hbA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9zZWxTdGVwc19sYWJlbD1TZWxlY2NpXHUwMGYzbiBkZSBwYXNvcw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90ZXh0PVNlbGVjY2lvbmUgbGFzIHByb3BpZWRhZGVzIGRlbCBjb250ZW5pZG8gZGUgbVx1MDBlOXRvZG8gcXVlIGRlc2VhIHF1ZSBzZSB0ZW5nYSBlbiBjdWVudGEgcGFyYSBsYSBzaW5jcm9uaXphY2lcdTAwZjNuLg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90aXRsZT1WaXN0YSBwcmVsaW1pbmFyIGRlIGxhIHNpbmNyb25pemFjaVx1MDBmM24NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGV4dD1SZXZpc2UgbG9zIGRldGFsbGVzIGRlIGxhIHNpbmNyb25pemFjaVx1MDBmM24gcHJvcHVlc3RhIGEgY29udGludWFjaVx1MDBmM24uDQotc2VsZWN0RWRpdG9yc1RvRGlzY2FyZENvbmZsaWN0Q2hhbmdlcz1IYXkgY2FtYmlvcyBzaW4gZ3VhcmRhciBxdWUgZW50cmFuIGVuIGNvbmZsaWN0byBjb24gbG9zIGNhbWJpb3MgcmVhbGl6YWRvcyBmdWVyYSBkZSBsb3MgZWRpdG9yZXMuIFxuXA0KLVNlbGVjY2lvbmUgbG9zIGVkaXRvcmVzIGVuIGxvcyBxdWUgZGVzZWEgZGVzY2FydGFyIGxvcyBjYW1iaW9zLg0KLXN5bmNocm9uaXphdGlvbldpemFyZF90aXRsZV90ZXh0PUFzaXN0ZW50ZSBkZSBzaW5jcm9uaXphY2lcdTAwZjNuDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV9leHBsYWluVGV4dD1Fc3RlIGFzaXN0ZW50ZSBkYSBzb3BvcnRlIGEgbGEgcmVub3ZhY2lcdTAwZjNuIGRlIGxvcyBkZXNjcmlwdG9yZXMgc2VsZWNjaW9uYWRvcyBvIHRvZG9zIGxvcyBkZXNjcmlwdG9yZXMgcG9yIGRlYmFqbyBkZSBsYXMgYWN0aXZpZGFkZXMgc2VsZWNjaW9uYWRhcyBxdWUgc2UgaGFuIG1hcmNhZG8gY29tbyAiU2luY3Jvbml6YWRvIGNvbiBlbCBvcmlnZW4iIGVuIGxhIHBlc3RhXHUwMGYxYSBHZW5lcmFsIGRlIGxhIHZpc3RhIGRlIHByb3BpZWRhZGVzLiAgXA0KLVNcdTAwZjNsbyBsYXMgcHJvcGllZGFkZXMgcXVlIHNlbGVjY2lvbmUgZW4gZXN0ZSBhc2lzdGVudGUgc2UgcmVudWV2YW4gZW4gbG9zIGRlc2NyaXB0b3Jlcy4gIFwNCi1UYW1iaVx1MDBlOW4gcHVlZGUgc2VsZWNjaW9uYXIgY3VhbHF1aWVyIGNvbmZpZ3VyYWNpXHUwMGYzbiB2XHUwMGUxbGlkYSBwYXJhIHF1ZSBlbCBwcm9jZXNvIGxhIHV0aWxpY2UgYWwgY29tcHV0YXIgbGEgcmVub3ZhY2lcdTAwZjNuLiAgXA0KLVRlbmdhIGVuIGN1ZW50YSBxdWUgZWwgYXNpc3RlbnRlIG5vIGFjdHVhbGl6YXJcdTAwZTEgbmluZ1x1MDBmYW4gZGVzY3JpcHRvciBlbmxhemFkbyBkZSBmb3JtYSBkaW5cdTAwZTFtaWNhIChjdXJzaXZhIHZlcmRlKS4NCi0NCi1vcGVuUlRFPUFicmlyIGVsIGVkaXRvciBkZSB0ZXh0byBlbnJpcXVlY2lkbw0KLWNsb3NlUlRFPUNlcnJhciBlbCBlZGl0b3IgZGUgdGV4dG8gZW5yaXF1ZWNpZG8NCi0NCi0jTmV3IFN0cmluZ3MNCi1yb2xlc2V0c19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3Rpb25lIGxhcyBpbnN0cnVjY2lvbmVzIHF1ZSBwZXJ0ZW5lY2VuIGEgZXN0ZSBjb25qdW50byBkZSByb2xlcy4NCi1kaXNjaXBsaW5lc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3Rpb25lIGxhcyBpbnN0cnVjY2lvbmVzIHF1ZSBwZXJ0ZW5lY2VuIGEgZXN0YSBkaXNjaXBsaW5hLg0KLXdvcmtwcm9kdWN0dHlwZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aW9uZSBsYXMgaW5zdHJ1Y2Npb25lcyBxdWUgcGVydGVuZWNlbiBhIGVzdGEgY2xhc2UgZGUgcHJvZHVjdG8gZGUgdHJhYmFqby4NCi1kb21haW5zX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlvbmUgbGFzIGluc3RydWNjaW9uZXMgcXVlIHBlcnRlbmVjZW4gYSBlc3RlIGRvbWluaW8uDQotdG9vbHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aW9uZSBsYXMgaW5zdHJ1Y2Npb25lcyBxdWUgcGVydGVuZWNlbiBhIGVzdGEgaGVycmFtaWVudGEuDQotY3VzdG9tY2F0ZWdvcnlfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aW9uZSBsYXMgaW5zdHJ1Y2Npb25lcyBxdWUgcGVydGVuZWNlbiBhIGVzdGEgY2F0ZWdvclx1MDBlZGEgcGVyc29uYWxpemFkYS4NCi0NCi1jb25jZXB0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlvbmUgbGFzIGluc3RydWNjaW9uZXMgcXVlIHBlcnRlbmVjZW4gYSBlc3RlIGNvbmNlcHRvLg0KLWNoZWNrbGlzdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3Rpb25lIGxhcyBpbnN0cnVjY2lvbmVzIHF1ZSBwZXJ0ZW5lY2VuIGEgZXN0YSBsaXN0YSBkZSBjb21wcm9iYWNpXHUwMGYzbi4NCi1leGFtcGxlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlvbmUgbGFzIGluc3RydWNjaW9uZXMgcXVlIHBlcnRlbmVjZW4gYSBlc3RlIGVqZW1wbG8uDQotZ3VpZGVsaW5lX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlvbmUgbGFzIGluc3RydWNjaW9uZXMgcXVlIHBlcnRlbmVjZW4gYSBlc3RhIGRpcmVjdHJpei4NCi1yb2FkbWFwX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlvbmUgbGFzIGluc3RydWNjaW9uZXMgcXVlIHBlcnRlbmVjZW4gYSBlc3RlIG1hcGEuDQotcmV1c2FibGVhc3NldF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3Rpb25lIGxhcyBpbnN0cnVjY2lvbmVzIHF1ZSBwZXJ0ZW5lY2VuIGEgZXN0ZSBhY3Rpdm8gcmV1dGlsaXphYmxlLg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3Rpb25lIGxhcyBpbnN0cnVjY2lvbmVzIHF1ZSBwZXJ0ZW5lY2VuIGEgZXN0ZSBtYXRlcmlhbCBkZSBzb3BvcnRlLg0KLXJlcG9ydF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3Rpb25lIGxhcyBpbnN0cnVjY2lvbmVzIHF1ZSBwZXJ0ZW5lY2VuIGEgZXN0ZSBpbmZvcm1lLg0KLXByYWN0aWNlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlvbmUgbGFzIGluc3RydWNjaW9uZXMgcXVlIHBlcnRlbmVjZW4gYSBlc3RhIHByXHUwMGUxY3RpY2EuDQotdGVtcGxhdGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aW9uZSBsYXMgaW5zdHJ1Y2Npb25lcyBxdWUgcGVydGVuZWNlbiBhIGVzdGEgcGxhbnRpbGxhLg0KLXRlcm1kZWZpbml0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlvbmUgbGFzIGluc3RydWNjaW9uZXMgcXVlIHBlcnRlbmVjZW4gYSBlc3RhIGRlZmluaWNpXHUwMGYzbi4NCi10b29sbWVudG9yX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlvbmUgbGFzIGluc3RydWNjaW9uZXMgcXVlIHBlcnRlbmVjZW4gYSBlc3RhIGhlcnJhbWllbnRhLg0KLXdoaXRlcGFwZXJfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aW9uZSBsYXMgaW5zdHJ1Y2Npb25lcyBxdWUgcGVydGVuZWNlbiBhIGVzdGEgZG9jdW1lbnRhY2lcdTAwZjNuIHRcdTAwZTljbmljYS4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3Rpb25lIGxhcyBpbnN0cnVjY2lvbmVzIHF1ZSBwZXJ0ZW5lY2VuIGEgZXN0YSBjb25zaWRlcmFjaVx1MDBmM24gZGUgY1x1MDBlMWxjdWxvLg0KLQ0KLQ0KLSNOZXcgU3RyaW5nIFNlY3Rpb24gRGVzY3JpcHRpb24NCi1yb2xlX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0ZSByb2wuDQotcm9sZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGUgcm9sLg0KLXJvbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY1x1MDBmM21vIHNlIHJlbGFjaW9uYSBlc3RlIHJvbCBjb24gb3Ryby4NCi1yb2xlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGUgbGEgdmVyc2lcdTAwZjNuIGFjZXJjYSBkZSBlc3RlIHJvbC4NCi0NCi10YXNrX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0YSB0YXJlYS4NCi10YXNrX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbCBhY2VyY2EgZGUgZXN0YSB0YXJlYS4NCi10YXNrX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNcdTAwZjNtbyBzZSByZWxhY2lvbmEgZXN0YSB0YXJlYSBjb24gb3RyYS4NCi10YXNrX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGUgbGEgdmVyc2lcdTAwZjNuIGFjZXJjYSBkZSBlc3RhIHRhcmVhLg0KLQ0KLWFydGlmYWN0X2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0ZSBhcnRlZmFjdG8uDQotYXJ0aWZhY3RfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RlIGFydGVmYWN0by4NCi1hcnRpZmFjdF9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaWNlIGxvcyBpY29ub3MgcGFyYSBlc3RlIGFydGVmYWN0by4NCi1hcnRpZmFjdF9ub3RhdGlvblNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGVudHJlZ2EgYWNlcmNhIGRlIGVzdGUgYXJ0ZWZhY3RvLg0KLWFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGFkYXB0YWNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0ZSBhcnRlZmFjdG8uDQotYXJ0aWZhY3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY1x1MDBmM21vIHNlIHJlbGFjaW9uYSBlc3RlIGFydGVmYWN0byBjb24gb3Ryby4NCi1hcnRpZmFjdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGxhIHZlcnNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0ZSBhcnRlZmFjdG8uDQotDQotb3V0Y29tZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZXRhbGxhZGEgYWNlcmNhIGRlIGVzdGUgcmVzdWx0YWRvLg0KLW91dGNvbWVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RlIHJlc3VsdGFkby4NCi1vdXRjb21lX2ljb25TZWN0aW9uX2Rlc2M9UGVyc29uYWxpY2UgbG9zIGljb25vcyBwYXJhIGVzdGUgcmVzdWx0YWRvLg0KLW91dGNvbWVfbm90YXRpb25TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZSBlbnRyZWdhIGFjZXJjYSBkZSBlc3RlIHJlc3VsdGFkby4NCi1vdXRjb21lX3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGFkYXB0YWNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0ZSByZXN1bHRhZG8uDQotb3V0Y29tZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjXHUwMGYzbW8gc2UgcmVsYWNpb25hIGVzdGUgcmVzdWx0YWRvIGNvbiBvdHJvLg0KLW91dGNvbWVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZSBsYSB2ZXJzaVx1MDBmM24gYWNlcmNhIGRlIGVzdGUgcmVzdWx0YWRvLg0KLQ0KLWRlbGl2ZXJhYmxlX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0ZSBwcm9kdWN0byBmaW5hbC4NCi1kZWxpdmVyYWJsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGUgcHJvZHVjdG8gZmluYWwuDQotZGVsaXZlcmFibGVfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25hbGljZSBsb3MgaWNvbm9zIHBhcmEgZXN0ZSBwcm9kdWN0byBmaW5hbC4NCi1kZWxpdmVyYWJsZV9ub3RhdGlvblNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGVudHJlZ2EgYWNlcmNhIGRlIGVzdGUgcHJvZHVjdG8gZmluYWwuDQotZGVsaXZlcmFibGVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGUgYWRhcHRhY2lcdTAwZjNuIGFjZXJjYSBkZSBlc3RlIHByb2R1Y3RvIGZpbmFsLg0KLWRlbGl2ZXJhYmxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNcdTAwZjNtbyBzZSByZWxhY2lvbmEgZXN0ZSBwcm9kdWN0byBmaW5hbCBjb24gb3Ryby4NCi1kZWxpdmVyYWJsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIHZlcnNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0ZSBwcm9kdWN0byBmaW5hbC4NCi0NCi1kaXNjaXBsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0YSBkaXNjaXBsaW5hLg0KLWRpc2NpcGxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RhIGRpc2NpcGxpbmEuDQotZGlzY2lwbGluZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjXHUwMGYzbW8gc2UgcmVsYWNpb25hIGVzdGEgZGlzY2lwbGluYSBjb24gb3RyYS4NCi1kaXNjaXBsaW5lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGUgbGEgdmVyc2lcdTAwZjNuIGFjZXJjYSBkZSBlc3RhIGRpc2NpcGxpbmEuDQotDQotZG9tYWluX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0ZSBkb21pbmlvLg0KLWRvbWFpbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGUgZG9taW5pby4NCi1kb21haW5fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY1x1MDBmM21vIHNlIHJlbGFjaW9uYSBlc3RlIGRvbWluaW8gY29uIG90cm8uDQotZG9tYWluX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGUgbGEgdmVyc2lcdTAwZjNuIGFjZXJjYSBkZSBlc3RlIGRvbWluaW8uDQotDQotd29ya3Byb2R1Y3R0eXBlX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0YSBjbGFzZSBkZSBwcm9kdWN0byBkZSB0cmFiYWpvLg0KLXdvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGEgY2xhc2UgZGUgcHJvZHVjdG8gZGUgdHJhYmFqby4NCi13b3JrcHJvZHVjdHR5cGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY1x1MDBmM21vIGVzdGEgY2xhc2UgZGUgcHJvZHVjdG8gZGUgdHJhYmFqbyBzZSByZWxhY2lvbmEgY29uIG90cmEgY2xhc2UgZGUgcHJvZHVjdG8gZGUgdHJhYmFqby4NCi13b3JrcHJvZHVjdHR5cGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZSBsYSB2ZXJzaVx1MDBmM24gYWNlcmNhIGRlIGVzdGEgY2xhc2UgZGUgcHJvZHVjdG8gZGUgdHJhYmFqby4NCi0NCi1yb2xlc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0ZSBjb25qdW50byBkZSByb2xlcy4NCi1yb2xlc2V0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbCBhY2VyY2EgZGUgZXN0ZSBjb25qdW50byBkZSByb2xlcy4NCi1yb2xlc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNcdTAwZjNtbyBzZSByZWxhY2lvbmEgZXN0ZSBjb25qdW50byBkZSByb2xlcyBjb24gb3Ryby4NCi1yb2xlc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGUgbGEgdmVyc2lcdTAwZjNuIGFjZXJjYSBkZSBlc3RlIGNvbmp1bnRvIGRlIHJvbGVzLg0KLQ0KLXRvb2xfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGV0YWxsYWRhIGFjZXJjYSBkZSBlc3RhIGhlcnJhbWllbnRhLg0KLXRvb2xfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RhIGhlcnJhbWllbnRhLg0KLXRvb2xfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY1x1MDBmM21vIHNlIHJlbGFjaW9uYSBlc3RhIGhlcnJhbWllbnRhIGNvbiBvdHJhLg0KLXRvb2xfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZSBsYSB2ZXJzaVx1MDBmM24gYWNlcmNhIGRlIGVzdGEgaGVycmFtaWVudGEuDQotDQotY29uY2VwdF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZXRhbGxhZGEgYWNlcmNhIGRlIGVzdGUgY29uY2VwdG8uDQotY29uY2VwdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGUgY29uY2VwdG8uDQotY29uY2VwdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjXHUwMGYzbW8gc2UgcmVsYWNpb25hIGVzdGUgY29uY2VwdG8gY29uIG90cm8uDQotY29uY2VwdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGxhIHZlcnNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0ZSBjb25jZXB0by4NCi0NCi1jaGVja2xpc3RfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGV0YWxsYWRhIGFjZXJjYSBkZSBlc3RhIGxpc3RhIGRlIGNvbXByb2JhY2lcdTAwZjNuLg0KLWNoZWNrbGlzdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGEgbGlzdGEgZGUgY29tcHJvYmFjaVx1MDBmM24uDQotY2hlY2tsaXN0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNcdTAwZjNtbyBzZSByZWxhY2lvbmEgZXN0YSBsaXN0YSBkZSBjb21wcm9iYWNpXHUwMGYzbiBjb24gb3RyYS4NCi1jaGVja2xpc3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZSBsYSB2ZXJzaVx1MDBmM24gYWNlcmNhIGRlIGVzdGEgbGlzdGEgZGUgY29tcHJvYmFjaVx1MDBmM24uDQotDQotZXhhbXBsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZXRhbGxhZGEgYWNlcmNhIGRlIGVzdGUgZWplbXBsby4NCi1leGFtcGxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbCBhY2VyY2EgZGUgZXN0ZSBlamVtcGxvLg0KLWV4YW1wbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY1x1MDBmM21vIHNlIHJlbGFjaW9uYSBlc3RlIGVqZW1wbG8gY29uIG90cm8uDQotZXhhbXBsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGxhIHZlcnNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0ZSBlamVtcGxvLg0KLQ0KLWd1aWRlbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZXRhbGxhZGEgYWNlcmNhIGRlIGVzdGEgZGlyZWN0cml6Lg0KLWd1aWRlbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGEgZGlyZWN0cml6Lg0KLWd1aWRlbGluZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjXHUwMGYzbW8gc2UgcmVsYWNpb25hIGVzdGEgZGlyZWN0cml6IGNvbiBvdHJhLg0KLWd1aWRlbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGxhIHZlcnNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0YSBkaXJlY3RyaXouDQotDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGV0YWxsYWRhIGFjZXJjYSBkZSBlc3RhIGNvbnNpZGVyYWNpXHUwMGYzbiBkZSBjXHUwMGUxbGN1bG8uDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RhIGNvbnNpZGVyYWNpXHUwMGYzbiBkZSBjXHUwMGUxbGN1bG8uDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY1x1MDBmM21vIHNlIHJlbGFjaW9uYSBlc3RhIGNvbnNpZGVyYWNpXHUwMGYzbiBkZSBjXHUwMGUxbGN1bG8gY29uIG90cmEuDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZSBsYSB2ZXJzaVx1MDBmM24gYWNlcmNhIGRlIGVzdGEgY29uc2lkZXJhY2lcdTAwZjNuIGRlIGNcdTAwZTFsY3Vsby4NCi0NCi1wcmFjdGljZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZXRhbGxhZGEgYWNlcmNhIGRlIGVzdGEgcHJcdTAwZTFjdGljYS4NCi1wcmFjdGljZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGEgcHJcdTAwZTFjdGljYS4NCi1wcmFjdGljZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjXHUwMGYzbW8gc2UgcmVsYWNpb25hIGVzdGEgcHJcdTAwZTFjdGljYSBjb24gb3RyYS4NCi1wcmFjdGljZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGxhIHZlcnNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0YSBwclx1MDBlMWN0aWNhLg0KLQ0KLXJlcG9ydF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZXRhbGxhZGEgYWNlcmNhIGRlIGVzdGUgaW5mb3JtZS4NCi1yZXBvcnRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RlIGluZm9ybWUuDQotcmVwb3J0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNcdTAwZjNtbyBzZSByZWxhY2lvbmEgZXN0ZSBpbmZvcm1lIGNvbiBvdHJvLg0KLXJlcG9ydF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGxhIHZlcnNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0ZSBpbmZvcm1lLg0KLQ0KLXJlc3VhYmxlYXNzZXRfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGV0YWxsYWRhIGFjZXJjYSBkZSBlc3RlIGFjdGl2byByZXV0aWxpemFibGUuDQotcmVzdWFibGVhc3NldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGUgYWN0aXZvIHJldXRpbGl6YWJsZS4NCi1yZXN1YWJsZWFzc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNcdTAwZjNtbyBzZSByZWxhY2lvbmEgZXN0ZSBhY3Rpdm8gcmV1dGlsaXphYmxlIGNvbiBvdHJvLg0KLXJlc3VhYmxlYXNzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZSBsYSB2ZXJzaVx1MDBmM24gYWNlcmNhIGRlIGVzdGUgYWN0aXZvIHJldXRpbGl6YWJsZS4NCi0NCi1yb2FkbWFwX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0ZSBtYXBhLg0KLXJvYWRtYXBfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RlIG1hcGEuDQotcm9hZG1hcF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjXHUwMGYzbW8gc2UgcmVsYWNpb25hIGVzdGUgbWFwYSBjb24gb3Ryby4NCi1yb2FkbWFwX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGUgbGEgdmVyc2lcdTAwZjNuIGFjZXJjYSBkZSBlc3RlIG1hcGEuDQotDQotc3VwcG9ydGluZ21hdGVyaWFsX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0ZSBtYXRlcmlhbCBkZSBzb3BvcnRlLg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGUgbWF0ZXJpYWwgZGUgc29wb3J0ZS4NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY1x1MDBmM21vIHNlIHJlbGFjaW9uYSBlc3RlIG1hdGVyaWFsIGRlIHNvcG9ydGUgY29uIG90cm8uDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGUgbGEgdmVyc2lcdTAwZjNuIGFjZXJjYSBkZSBlc3RlIG1hdGVyaWFsIGRlIHNvcG9ydGUuDQotDQotdGVtcGxhdGVfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGV0YWxsYWRhIGFjZXJjYSBkZSBlc3RhIHBsYW50aWxsYS4NCi10ZW1wbGF0ZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGEgcGxhbnRpbGxhLg0KLXRlbXBsYXRlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNcdTAwZjNtbyBzZSByZWxhY2lvbmEgZXN0YSBwbGFudGlsbGEgY29uIG90cmEuDQotdGVtcGxhdGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZSBsYSB2ZXJzaVx1MDBmM24gYWNlcmNhIGRlIGVzdGEgcGxhbnRpbGxhLg0KLQ0KLXRlcm1kZWZpbml0aW9uX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0YSBkZWZpbmljaVx1MDBmM24gZGUgdFx1MDBlOXJtaW5vLg0KLXRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbCBhY2VyY2EgZGUgZXN0YSBkZWZpbmljaVx1MDBmM24gZGUgdFx1MDBlOXJtaW5vLg0KLXRlcm1kZWZpbml0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNcdTAwZjNtbyBzZSByZWxhY2lvbmEgZXN0YSBkZWZpbmljaVx1MDBmM24gZGUgdFx1MDBlOXJtaW5vIGNvbiBvdHJhLg0KLXRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGUgbGEgdmVyc2lcdTAwZjNuIGFjZXJjYSBkZSBlc3RhIGRlZmluaWNpXHUwMGYzbiBkZSB0XHUwMGU5cm1pbm8uDQotDQotdG9vbG1lbnRvcl9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZXRhbGxhZGEgYWNlcmNhIGRlIGVzdGEgZ3VcdTAwZWRhIGRlIGhlcnJhbWllbnRhLg0KLXRvb2xtZW50b3JfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RhIGd1XHUwMGVkYSBkZSBoZXJyYW1pZW50YS4NCi10b29sbWVudG9yX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNcdTAwZjNtbyBzZSByZWxhY2lvbmEgZXN0YSBndVx1MDBlZGEgZGUgaGVycmFtaWVudGEgY29uIG90cmEuDQotdG9vbG1lbnRvcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGxhIHZlcnNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0YSBndVx1MDBlZGEgZGUgaGVycmFtaWVudGEuDQotDQotd2hpdGVwYXBlcl9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZXRhbGxhZGEgYWNlcmNhIGRlIGVzdGEgZG9jdW1lbnRhY2lcdTAwZjNuIHRcdTAwZTljbmljYS4NCi13aGl0ZXBhcGVyX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbCBhY2VyY2EgZGUgZXN0YSBkb2N1bWVudGFjaVx1MDBmM24gdFx1MDBlOWNuaWNhLg0KLXdoaXRlcGFwZXJfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY1x1MDBmM21vIHNlIHJlbGFjaW9uYSBlc3RhIGRvY3VtZW50YWNpXHUwMGYzbiB0XHUwMGU5Y25pY2EgY29uIG90cmEuDQotd2hpdGVwYXBlcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGxhIHZlcnNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0YSBkb2N1bWVudGFjaVx1MDBmM24gdFx1MDBlOWNuaWNhLg0KLQ0KLWRpc2NpcGxpbmVncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZXRhbGxhZGEgYWNlcmNhIGRlIGVzdGEgYWdydXBhY2lcdTAwZjNuIGRlIGRpc2NpcGxpbmFzLg0KLWRpc2NpcGxpbmVncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGEgYWdydXBhY2lcdTAwZjNuIGRlIGRpc2NpcGxpbmFzLg0KLWRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjXHUwMGYzbW8gc2UgcmVsYWNpb25hIGVzdGEgYWdydXBhY2lcdTAwZjNuIGRlIGRpc2NpcGxpbmFzIGNvbiBvdHJhLg0KLWRpc2NpcGxpbmVncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRlIGxhIHZlcnNpXHUwMGYzbiBhY2VyY2EgZGUgZXN0YSBhZ3J1cGFjaVx1MDBmM24gZGUgZGlzY2lwbGluYXMuDQotDQotcm9sZXNldGdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0YSBhZ3J1cGFjaVx1MDBmM24gZGUgY29uanVudG9zIGRlIHJvbGVzLg0KLXJvbGVzZXRncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGEgYWdydXBhY2lcdTAwZjNuIGRlIGNvbmp1bnRvcyBkZSByb2xlcy4NCi1yb2xlc2V0Z3JvdXBpbmdfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY1x1MDBmM21vIHNlIHJlbGFjaW9uYSBlc3RhIGFncnVwYWNpXHUwMGYzbiBkZSBjb25qdW50b3MgZGUgcm9sZXMgY29uIG90cmEuDQotcm9sZXNldGdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGUgbGEgdmVyc2lcdTAwZjNuIGFjZXJjYSBkZSBlc3RhIGFncnVwYWNpXHUwMGYzbiBkZSBjb25qdW50b3MgZGUgcm9sZXMuDQotDQotY3VzdG9tY2F0ZWdvcnlfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGV0YWxsYWRhIGFjZXJjYSBkZSBlc3RhIGNhdGVnb3JcdTAwZWRhIHBlcnNvbmFsaXphZGEuDQotY3VzdG9tY2F0ZWdvcnlfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RhIGNhdGVnb3JcdTAwZWRhIHBlcnNvbmFsaXphZGEuDQotY3VzdG9tY2F0ZWdvcnlfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY1x1MDBmM21vIHNlIHJlbGFjaW9uYSBlc3RhIGNhdGVnb3JcdTAwZWRhIHBlcnNvbmFsaXphZGEgY29uIG90cmEuDQotY3VzdG9tY2F0ZWdvcnlfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBkZSBsYSB2ZXJzaVx1MDBmM24gYWNlcmNhIGRlIGVzdGEgY2F0ZWdvclx1MDBlZGEgcGVyc29uYWxpemFkYS4NCi1jdXN0b21jYXRlZ29yeV9JY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaWNlIGxvcyBpY29ub3MgcGFyYSBlc3RhIGNhdGVnb3JcdTAwZWRhIHBlcnNvbmFsaXphZGEuDQotDQotY29uY2VwdF9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaWNlIGxvcyBpY29ub3MgcGFyYSBlc3RlIGNvbmNlcHRvLg0KLWNoZWNrbGlzdF9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaWNlIGxvcyBpY29ub3MgcGFyYSBlc3RhIGxpc3RhIGRlIGNvbXByb2JhY2lcdTAwZjNuLg0KLXRvb2xtZW50b3JfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25hbGljZSBsb3MgaWNvbm9zIHBhcmEgZXN0YSBndVx1MDBlZGEgZGUgbGEgaGVycmFtaWVudGEuDQotd2hpdGVwYXBlcl9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaWNlIGxvcyBpY29ub3MgcGFyYSBlc3RhIGRvY3VtZW50YWNpXHUwMGYzbiB0XHUwMGU5Y25pY2EuDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25faWNvblNlY3Rpb25fZGVzYz1QZXJzb25hbGljZSBsb3MgaWNvbm9zIHBhcmEgZXN0YSBjb25zaWRlcmFjaVx1MDBmM24gZGUgY1x1MDBlMWxjdWxvLg0KLXRlcm1kZWZpbml0aW9uX2ljb25TZWN0aW9uX2Rlc2M9UGVyc29uYWxpY2UgbG9zIGljb25vcyBwYXJhIGVzdGEgZGVmaW5pY2lcdTAwZjNuIGRlIHRcdTAwZTlybWluby4NCi10ZW1wbGF0ZV9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaWNlIGxvcyBpY29ub3MgcGFyYSBlc3RhIHBsYW50aWxsYS4NCi1yZXVzYWJsZWFzc2V0X2ljb25TZWN0aW9uX2Rlc2M9UGVyc29uYWxpY2UgbG9zIGljb25vcyBwYXJhIGVzdGUgYWN0aXZvIHJldXRpbGl6YWJsZS4NCi1yZXBvcnRfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25hbGljZSBsb3MgaWNvbm9zIHBhcmEgZXN0ZSBpbmZvcm1lLg0KLXByYWN0aWNlX2ljb25TZWN0aW9uX2Rlc2M9UGVyc29uYWxpY2UgbG9zIGljb25vcyBwYXJhIGVzdGEgcHJcdTAwZTFjdGljYS4NCi1leGFtcGxlX2ljb25TZWN0aW9uX2Rlc2M9UGVyc29uYWxpY2UgbG9zIGljb25vcyBwYXJhIGVzdGUgZWplbXBsby4NCi1ndWlkZWxpbmVfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25hbGljZSBsb3MgaWNvbm9zIHBhcmEgZXN0YSBkaXJlY3RyaXouDQotcm9hZG1hcF9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaWNlIGxvcyBpY29ub3MgcGFyYSBlc3RlIG1hcGEuDQotc3VwcG9ydGluZ21hdGVyaWFsX2ljb25TZWN0aW9uX2Rlc2M9UGVyc29uYWxpY2UgbG9zIGljb25vcyBwYXJhIGVzdGUgbWF0ZXJpYWwgZGUgc29wb3J0ZS4NCi0NCi1lZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY190aXRsZT1BcmNoaXZvIGNhbWJpYWRvDQotZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfbWVzc2FnZT1FbCBhcmNoaXZvIHNlIGhhIGNhbWJpYWRvIGVuIGVsIHNpc3RlbWEgZGUgYXJjaGl2b3MuIFx1MDBiZkRlc2VhIGNhcmdhciBsb3MgY2FtYmlvcz8NCi0NCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZT1WYXJpYWJpbGlkYWQgZGUgbGEgYWN0aXZpZGFkDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnPUxhIGFjdGl2aWRhZCAnJ3swfScnIG5vIHB1ZWRlIGVzdGFibGVjZXIgbGEgdmFyaWFiaWxpZGFkIGNvbiAnJ3sxfScnIHB1ZXN0byBxdWUgJyd7MX0nJyB5YSB0aWVuZSB1bmEgbyB2YXJpYXMgYWN0aXZpZGFkZXMgY29udHJpYnVpZGFzL3N1c3RpdHVpZGFzIGNvbW8gaGlqb3MuDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMT1MYSBhY3RpdmlkYWQgJyd7MH0nJyBubyBwdWVkZSBlc3RhYmxlY2VyIGxhIHZhcmlhYmlsaWRhZCBjb24gdW5vIGRlIHN1cyBwYWRyZXMgZGlyZWN0b3MgbmkgY29uIG5pbmdcdTAwZmFuIHByb2Nlc28uDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMj1MYSBhY3RpdmlkYWQgJyd7MH0nJyBubyBwdWVkZSBlc3RhYmxlY2VyIGxhIHZhcmlhYmlsaWRhZCBjb24gJyd7MX0nJyBwdWVzdG8gcXVlIGRhclx1MDBlZGEgY29tbyByZXN1bHRhZG8gdW5hIGRlcGVuZGVuY2lhIGNpcmN1bGFyLg0KLQ0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfdGl0bGU9QXBsaWNhciBwYXRyXHUwMGYzbg0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnPUxhIGFjdGl2aWRhZCAnJ3swfScnIG5vIHB1ZWRlIGVzdGFibGVjZXIgZWwgcGF0clx1MDBmM24gY29uICcnezF9JycgcHVlc3RvIHF1ZSBkYXJcdTAwZWRhIGNvbW8gcmVzdWx0YWRvIHVuYSBkZXBlbmRlbmNpYSBjaXJjdWxhci4NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotQ2hhbmdlSGlzdG9yeURpYWxvZ19kZWxpbWl0ZXI9fA0KLU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3Jfc2hvd093bmVySW5MaWJyYXJ5Vmlldz1TaG93IG93bmVyIG9mIHRoaXMgdW5yZXNvbHZlZCByZWZlcmVuY2UgaW4gTGlicmFyeSB2aWV3DQotTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9yZW1vdmVVbnJlc29sdmVkUmVmZXJlbmNlPVJlbW92ZSB0aGlzIHVucmVzb2x2ZWQgcmVmZXJlbmNlDQotcHJvbXB0RGVsZXRlQ3VzdG9tQ2F0ZWdvcnlCZWZvcmVSZW1vdmVMYXN0UmVmVG9JdD1Fc3RcdTAwZTEgYSBwdW50byBkZSBzdXByaW1pciBsYSBcdTAwZmFsdGltYSByZWZlcmVuY2lhIGEgezB9IGVuIGVsIHBsdWctaW4uIFNlIHN1cHJpbWlyXHUwMGUxbiBsb3MgZWxlbWVudG9zLiBcdTAwYmZEZXNlYSBjb250aW51YXI/DQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSNCZWxvdyBwcm9wZXJ0eSAiZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzIiBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQNCi0jRG9uJ3QgZGVsZXRlIGEgc3BhY2UgYWZ0ZXIgIjogIg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzPTogDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXNfZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwMmQ4ZjkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyMTQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEZvcm0gUGFnZSBUaXRsZXMNCi1hc3NpZ25QYWdlX3RpdGxlPUFmZmVjdGVyDQotY2F0ZWdvcmllc1BhZ2VfdGl0bGU9Q2F0XHUwMGU5Z29yaWVzDQotZGVsaXZlcmFibGVQYXJ0c1BhZ2VfdGl0bGU9Q29tcG9zYW50cyBsaXZyYWJsZXMNCi1kZXNjcmlwdGlvblBhZ2VfdGl0bGU9RGVzY3JpcHRpb24NCi1kaXNjaXBsaW5lc1BhZ2VfdGl0bGU9RGlzY2lwbGluZXMNCi1kaXNjYXJkdW5yZXNvbHZlZHJlZj1FbGltaW5lciBsZXMgclx1MDBlOWZcdTAwZTlyZW5jZXMgbm9uIHJcdTAwZTlzb2x1ZXMNCi1ndWlkYW5jZVBhZ2VfdGl0bGU9Q29uc2VpbA0KLXByZXZpZXdQYWdlX3RpdGxlPUFwZXJcdTAwZTd1DQotcmVmZXJlbmNlc1BhZ2VfdGl0bGU9Ulx1MDBlOWZcdTAwZTlyZW5jZXMNCi1yZWZlcmVuY2VfdGV4dD1SXHUwMGU5Zlx1MDBlOXJlbmNlcyA6DQotcmVmZXJlbmNlV29ya2Zsb3dQYWdlX3RpdGxlPUVuY2hhXHUwMGVlbmVtZW50IGQnYWN0aXZpdFx1MDBlOXMgZGUgclx1MDBlOWZcdTAwZTlyZW5jZQ0KLXJvbGVzUGFnZV90aXRsZT1SXHUwMGY0bGVzDQotcm9sZVNldHNQYWdlX3RpdGxlPUVuc2VtYmxlcyBkZSByXHUwMGY0bGVzDQotc3RlcHNQYWdlX3RpdGxlPUV0YXBlcw0KLXRhc2tzUGFnZV90aXRsZT1UXHUwMGUyY2hlcw0KLXRvb2xNZW50b3JzUGFnZV90aXRsZT1HdWlkZXMgZCd1dGlsaXNhdGlvbiBkZSBsJ291dGlsDQotd29ya1Byb2R1Y3RzUGFnZV90aXRsZT1Qcm9kdWl0cw0KLQ0KLSMgU2VjdGlvbiBOYW1lcyAmIERlc2NyaXB0aW9uDQotY2hlY2tJdGVtc1NlY3Rpb25fbmFtZT1FbFx1MDBlOW1lbnRzIGRlIHZcdTAwZTlyaWZpY2F0aW9uDQotY2hlY2tJdGVtc1NlY3Rpb25fZGVzYz1TcFx1MDBlOWNpZmlleiBsZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIHZcdTAwZTlyaWZpY2F0aW9uIGNvbnN0aXR1YW50IGNldHRlIGxpc3RlIGRlIGNvbnRyXHUwMGY0bGUuDQotZGVwZW5kZW5jaWVzU2VjdGlvbl9uYW1lPURcdTAwZTlwZW5kYW5jZXMNCi1kZXBlbmRlbmNpZXNTZWN0aW9uX2Rlc2M9Q2V0dGUgc2VjdGlvbiBhZmZpY2hlIGxlcyBkXHUwMGU5cGVuZGFuY2VzIGRlIGNlIHBhY2thZ2UgZGUgY29udGVudSBhdXggYXV0cmVzIHBhY2thZ2VzIGRlIGNvbnRlbnUuDQotZGV0YWlsU2VjdGlvbl9uYW1lPUluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcw0KLWRldGFpbFNlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZFx1MDBlOXRhaWxsXHUwMGU5ZXMgc3VyIGNlIHswfS4NCi1nZW5lcmFsSW5mb1NlY3Rpb25fbmFtZT1JbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcw0KLWdlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2UgezB9Lg0KLWljb25TZWN0aW9uX25hbWU9SWNcdTAwZjRuZQ0KLWljb25TZWN0aW9uX2Rlc2M9UGVyc29ubmFsaXNleiBsZXMgaWNcdTAwZjRuZXMgcG91ciBjZSB7MH0uDQotbm90YXRpb25TZWN0aW9uX25hbWU9SW5mb3JtYXRpb25zIGRlIGxpdnJhaXNvbg0KLW5vdGF0aW9uU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkZSBsaXZyYWlzb24gXHUwMGUwIHByb3BvcyBkZSBjZSB7MH0uDQotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX25hbWU9UGx1Zy1pbnMgclx1MDBlOWZcdTAwZTlyZW5jXHUwMGU5cyA6DQotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX2Rlc2M9Q2V0dGUgc2VjdGlvbiBhZmZpY2hlIGxlcyBwbHVnLWlucyByXHUwMGU5Zlx1MDBlOXJlbmNcdTAwZTlzIHBhciBjZSBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZS4NCi1zdGFmZmluZ1NlY3Rpb25fbmFtZT1JbmZvcm1hdGlvbnMgcmVsYXRpdmVzIFx1MDBlMCBsJ2FmZmVjdGF0aW9uIGR1IHBlcnNvbm5lbA0KLXN0YWZmaW5nU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyByZWxhdGl2ZXMgXHUwMGUwIGwnYWZmZWN0YXRpb24gZHUgcGVyc29ubmVsIFx1MDBlMCBwcm9wb3MgZGUgY2Ugclx1MDBmNGxlLg0KLXN0ZXBzU2VjdGlvbl9uYW1lPUV0YXBlcw0KLXN0ZXBzU2VjdGlvbl9kZXNjPVNwXHUwMGU5Y2lmaWV6IGxlcyBcdTAwZTl0YXBlcyBcdTAwZTAgc3VpdnJlIHBvdXIgZWZmZWN0dWVyIGNldHRlIHRcdTAwZTJjaGUuDQotdGFpbG9yaW5nU2VjdGlvbl9uYW1lPVBlcnNvbm5hbGlzYXRpb24NCi10YWlsb3JpbmdTZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHBlcnNvbm5hbGlzYXRpb24gXHUwMGUwIHByb3BvcyBkZSBjZSB7MH0uDQotdmFyaWFiaWxpdHlTZWN0aW9uX25hbWU9VmFyaWFiaWxpdFx1MDBlOSBkdSBjb250ZW51DQotdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZSB7MH0gcycnYXNzb2NpZSBcdTAwZTAgdW4gYXV0cmUgezB9Lg0KLXZlcnNpb25JbmZvU2VjdGlvbl9uYW1lPUluZm9ybWF0aW9ucyBkZSB2ZXJzaW9uDQotdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZSB7MH0uDQotDQotIyBVSSAmIEVsZW1lbnQgQXR0cmlidXRlIExhYmVscw0KLWFkZGl0aW9uYWxJbmZvX3RleHQ9SW5mb3JtYXRpb25zIGNvbXBsXHUwMGU5bWVudGFpcmVzIDoNCi1hcHBsaWNhdGlvbl90ZXh0PUFwcGxpY2F0aW9uIDoNCi1hY3Rpb25MYWJlbF9lZGl0PU1vZGlmaWVyDQotYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdj1BZmZpY2hlciBkYW5zIGxhIHZ1ZSBCaWJsaW90aFx1MDBlOHF1ZQ0KLWFsdGVybmF0aXZlc190ZXh0PUFsdGVybmF0aXZlcyA6DQotYXNzaWdubWVudEFwcHJvYWNoZXNfdGV4dD1BcHByb2NoZXMgZCdhZmZlY3RhdGlvbiA6DQotYXV0aG9yc190ZXh0PUF1dGV1cnMgOg0KLWJhY2tncm91bmRfdGV4dD1BcnJpXHUwMGU4cmUtcGxhbiA6DQotYmFzZUVsZW1lbnRfdGV4dD1CYXNlIDoNCi1iYXNlR3VpZGFuY2VfdGV4dD1Db25zZWlsIGRlIGJhc2UgOg0KLWJyaWVmRGVzY3JpcHRpb25fdGV4dD1EZXNjcmlwdGlmIGNvdXJ0IDoNCi1kZXNjcmlwdGlvbl90ZXh0PURlc2NyaXB0aW9uIDoNCi1iYWNrdXBiZWZvcmVzYXZlX3RleHQ9U2F1dmVnYXJkZXIgYXZhbnQgZCdlbnJlZ2lzdHJlcg0KLWJyaWVmT3V0bGluZV90ZXh0PUJyZWYgYXBlclx1MDBlN3UgOg0KLWNoYW5nZURhdGVfdGV4dD1EYXRlIGRlIG1vZGlmaWNhdGlvbiA6DQotY2hhbmdlRGVzY3JpcHRpb25fdGV4dD1EZXNjcmlwdGlvbiBkZSBsYSBtb2RpZmljYXRpb24gOg0KLWNoZWNrSXRlbXNfdGV4dD1FbFx1MDBlOW1lbnRzIGRlIHZcdTAwZTlyaWZpY2F0aW9uDQotY29udHJpYnV0ZXNfdGV4dD1Db250cmlidWUNCi1sb2NhbENvbnRyaWJ1dGVzX3RleHQ9Q29udHJpYnV0aW9ucyBsb2NhbGVzDQotY29udHJpYnV0ZXNfdG9fdGV4dD1Db250cmlidWUgXHUwMGUwDQotY29weXJpZ2h0X3RleHQ9Q29weXJpZ2h0IDoNCi1lZGl0b3JfdGV4dD1FZGl0ZXVyDQotZXh0ZW5kc190ZXh0PUV0ZW5kDQotZXh0ZW5kX3RleHQ9RXh0ZW5zaW9uDQotZXh0ZXJuYWxEZXNjcmlwdGlvbl90ZXh0PURlc2NyaXB0aWYgZXh0ZXJuZSA6DQotZXh0ZXJuYWxJZF90ZXh0PUlkZW50aWZpY2F0ZXVyIGV4dGVybmUgOg0KLWdvYWxzX3RleHQ9QnV0cyA6DQotaW1wYWN0T2ZOb3RIYXZpbmdfdGV4dD1JbmNpZGVuY2UgZHUgbWFucXVlIDoNCi1rZXlDb25zaWRlcmF0aW9uc190ZXh0PUNvbnNpZFx1MDBlOXJhdGlvbnMgY2xcdTAwZTlzIDoNCi1sZXZlbHNPZkFkb3B0aW9uX3RleHQ9Tml2ZWF1IGQnYWRvcHRpb24gOg0KLW1haW5EZXNjcmlwdGlvbl90ZXh0PURlc2NyaXB0aWYgcHJpbmNpcGFsIDoNCi1uZXdFbGVtZW50X3RleHQ9Tm91dmVhdShub3V2ZWxsZSkgezB9DQotbmFtZV90ZXh0PU5vbSA6DQotbm90QXBwbGljYWJsZV90ZXh0PVNhbnMgb2JqZXQNCi1wYWNrYWdpbmdHdWlkYW5jZV90ZXh0PUNvbnNlaWwgcG91ciByZWdyb3VwZW1lbnQgOg0KLXByZXNlbnRhdGlvbk5hbWVfdGV4dD1Ob20gZGUgcHJcdTAwZTlzZW50YXRpb24gOg0KLXByb21wdGZvcmxpYmFyeV90ZXh0PUludml0ZSBkZW1hbmRhbnQgcXVlbGxlIGVzdCBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIGF1IGRcdTAwZTltYXJyYWdlDQotZW5hYmxlSGVhbHRoQ2hlY2tfdGV4dD1BY3RpdmVyIGxlcyBvdXRpbHMgZGUgZFx1MDBlOWJvZ2FnZSBpbnRlcm5lcw0KLXByb2JsZW1fdGV4dD1Qcm9ibFx1MDBlOG1lIDoNCi1wdXJwb3NlX3RleHQ9T2JqZXQgOg0KLXJlYXNvbkZvck5vdE5lZWRpbmdfdGV4dD1DYXVzZSBqdXN0aWZpYW50IGwnYWJzZW5jZSBkZSBuXHUwMGU5Y2Vzc2l0XHUwMGU5IDoNCi1yZXBsYWNlc190ZXh0PVJlbXBsYWNlDQotbG9jYWxSZXBsYWNlc190ZXh0PVJlbXBsYWNlbWVudCBsb2NhbA0KLXJlcHJlc2VudGF0aW9uT3B0aW9uc190ZXh0PU9wdGlvbnMgZGUgcmVwclx1MDBlOXNlbnRhdGlvbiA6DQotdGVtcGxhdGVGaWxlX3RleHQ9RmljaGllcihzKSBkZSBjYW5ldmFzIDoNCi1za2lsbHNfdGV4dD1Db21wXHUwMGU5dGVuY2VzIDoNCi1zdGVwc190ZXh0PUV0YXBlcyA6DQotc3RlcHNfbmFtZV90ZXh0PU5vbSA6DQotc3RvcF90ZXh0PUFyclx1MDBlYXQNCi1wcmludF90ZXh0PUltcHJpbWVyDQotc3lub255bXNfdGV4dD1TeW5vbnltZXMgOg0KLXR5cGVfdGV4dD1UeXBlIDoNCi1jb3B5X3RleHQ9Q29waWVyDQotZGVlcENvcHlfdGV4dD1Db3BpZSBwcm9mb25kZQ0KLWJhY2tfdGV4dD1SZXRvdXINCi1uZXdfcGx1Z2luPU5vdXZlYXUgcGx1Zy1pbiBkZSBtXHUwMGU5dGhvZGUNCi1tb3ZlPURcdTAwZTlwbGFjZXIuLi4NCi11bmlxdWVJZF90ZXh0PUlkZW50aWZpY2F0ZXVyIHVuaXF1ZSA6DQotdmFyaWFiaWxpdHlUeXBlX3RleHQ9VHlwZSBkZSB2YXJpYWJpbGl0XHUwMGU5IDoNCi12ZXJzaW9uX3RleHQ9VmVyc2lvbiA6DQotDQotIyBCdXR0b24gTGFiZWxzDQotYWRkQnV0dG9uX3RleHQ9QWpvdXRlci4uLg0KLWF0dGFjaEJ1dHRvbl90ZXh0PUpvaW5kcmUuLi4NCi1icm93c2VCdXR0b25fdGV4dD1QYXJjb3VyaXIuLi4NCi1jaGFuZ2VUeXBlQnV0dG9uX3RleHQ9Q2hhbmdlciBkZSB0eXBlLi4uDQotY2xlYXJCdXR0b25fdGV4dD1FZmZhY2VyDQotZGVsZXRlQnV0dG9uX3RleHQ9U3VwcHJpbWVyDQotZGV0YWNoQnV0dG9uX3RleHQ9RFx1MDBlOXRhY2hlcg0KLWRpYWdyYW1fc2F2ZUVycm9yPUVycmV1ciBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUgZHUgZGlhZ3JhbW1lDQotZG93bkJ1dHRvbl90ZXh0PUJhcw0KLWRpcmVjdG9yeV90ZXh0PVJcdTAwZTlwZXJ0b2lyZSA6DQotb3JkZXJCdXR0b25fdGV4dD1PcmRyZQ0KLWVkaXRCdXR0b25fdGV4dD1Nb2RpZmllci4uLg0KLXJlbW92ZUJ1dHRvbl90ZXh0PVN1cHByaW1lcg0KLXJlbmFtZUFjdGlvbl90ZXh0PVJlbm9tbWVyLi4uDQotcmVtb3ZlX3RleHQ9U3VwcHJpbWVyDQotcmVuYW1lX3RleHQ9UmVub21tZXINCi1TYXZlQXNfdGV4dD1FbnJlZ2lzdHJlciBzb3VzDQotc2VsZWN0QnV0dG9uX3RleHQ9U1x1MDBlOWxlY3Rpb25uZXIuLi4NCi1kZXNlbGVjdEJ1dHRvbl90ZXh0PURcdTAwZTlzXHUwMGU5bGVjdGlvbm5lcg0KLXVwQnV0dG9uX3RleHQ9SGF1dA0KLW1ha2VEZWZhdWx0QnV0dG9uX3RleHQ9RFx1MDBlOWZpbmlyIGNvbW1lIHZhbGV1ciBwYXIgZFx1MDBlOWZhdXQNCi12aWV3SGlzdG9yeUJ1dHRvbl90ZXh0PUFmZmljaGVyIGwnaGlzdG9yaXF1ZS4uLg0KLQ0KLSMgUm9sZSBFZGl0b3IgVGFza3MgUGFnZQ0KLXJvbGVUYXNrc1BhZ2Vfc2VjdGlvbk5hbWU9VFx1MDBlMmNoZXMNCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1DZSByXHUwMGY0bGUgZXN0IGwnZXhcdTAwZTljdXRhbnQgZGVzIHRcdTAwZTJjaGVzIHN1aXZhbnRlcy4NCi1yb2xlVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPVRcdTAwZTJjaGVzIGRpc3BvbmlibGVzDQotcm9sZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsPUV4XHUwMGU5Y3V0YW50IHByaW5jaXBhbCA6DQotcm9sZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsMj1FeFx1MDBlOWN1dGFudCBzdXBwbFx1MDBlOW1lbnRhaXJlIDoNCi1yb2xlVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHRcdTAwZTJjaGVzIG9udCBcdTAwZTl0XHUwMGU5IHNcdTAwZTlsZWN0aW9ublx1MDBlOWVzLg0KLQ0KLSMgUm9sZSBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9UHJvZHVpdHMgOg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1TcFx1MDBlOWNpZmlleiBsZXMgcHJvZHVpdHMgZG9udCBjZSByXHUwMGY0bGUgZXN0IHJlc3BvbnNhYmxlLg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVByb2R1aXRzIGRpc3BvbmlibGVzIDoNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVJlc3BvbnNhYmxlIGRlIDoNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMj1Qcm9kdWl0cyBjb25zdGl0dWFudCBkZXMgc29ydGllcyBkZXMgdFx1MDBlMmNoZXMgZWZmZWN0dVx1MDBlOWVzIHBhciBjZSByXHUwMGY0bGUgOg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHByb2R1aXRzIG9udCBcdTAwZTl0XHUwMGU5IHNcdTAwZTlsZWN0aW9ublx1MDBlOXMuDQotDQotIyBSb2xlIEVkaXRvciBHdWlkYW5jZSBQYWdlDQotcm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1Db25zZWlsDQotcm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249Rm91cm5pdCBkZXMgbGllbnMgdmVycyBkZXMgaW5mb3JtYXRpb25zIGNvbXBsXHUwMGU5bWVudGFpcmVzIHNvdXMgbGEgZm9ybWUgZGUgY29uc2VpbHMuDQotcm9sZUd1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1Db25zZWlsIGRpc3BvbmlibGUgOg0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1Db25zZWlsIDoNCi1yb2xlR3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGNvbnNlaWxzIG9udCBcdTAwZTl0XHUwMGU5IHNcdTAwZTlsZWN0aW9ublx1MDBlOXMuDQotDQotIyBSb2xlIEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9Q2F0XHUwMGU5Z29yaWVzIDoNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGVzIGNhdFx1MDBlOWdvcmllcyBhdXhxdWVsbGVzIGFwcGFydGllbnQgY2Ugclx1MDBmNGxlLg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1FbnNlbWJsZXMgZGUgclx1MDBmNGxlcyA6DQotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1DYXRcdTAwZTlnb3JpZXMgcGVyc29ubmFsaXNcdTAwZTllcyA6DQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw9RW5zZW1ibGVzIGRlIHJcdTAwZjRsZXMgOg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1DYXRcdTAwZTlnb3JpZXMgcGVyc29ubmFsaXNcdTAwZTllcyA6DQotDQotIyBUYXNrIEVkaXRvciBSb2xlcyBQYWdlDQotdGFza1JvbGVzUGFnZV9zZWN0aW9uTmFtZT1SXHUwMGY0bGVzDQotdGFza1JvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QWZmZWN0ZXogbGVzIHJcdTAwZjRsZXMgcG91ciBlZmZlY3R1ZXIgY2V0dGUgdFx1MDBlMmNoZS4NCi10YXNrUm9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVJcdTAwZjRsZXMgZGlzcG9uaWJsZXMgOg0KLXRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1FeFx1MDBlOWN1dGFudCBwcmluY2lwYWwgOg0KLXRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9RXhcdTAwZTljdXRhbnRzIHN1cHBsXHUwMGU5bWVudGFpcmVzIDoNCi10YXNrUm9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHJcdTAwZjRsZXMgb250IFx1MDBlOXRcdTAwZTkgc1x1MDBlOWxlY3Rpb25uXHUwMGU5cy4NCi10YXNrUm9sZXNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbW9kaWZ5X21lc3NhZ2U9SVVQQTAwMDQ1VyA6IFZvdWxlei12b3VzIG1vZGlmaWVyIGwnJ2V4XHUwMGU5Y3V0YW50IHByaW5jaXBhbCBlbiAnJ3swfScnID8NCi10YXNrUm9sZXNQYWdlX2NvbmZpcm1fdGl0bGU9Q29uZmlybWVyIGxhIG1vZGlmaWNhdGlvbiBkdSByXHUwMGY0bGUgcHJpbmNpcGFsDQotDQotIyBUYXNrIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Qcm9kdWl0cw0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1TcFx1MDBlOWNpZmlleiBsZXMgcHJvZHVpdHMgZCdlbnRyXHUwMGU5ZSBldCBkZSBzb3J0aWUgcG91ciBjZXR0ZSB0XHUwMGUyY2hlLg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVByb2R1aXRzIGRpc3BvbmlibGVzDQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1FbnRyXHUwMGU5ZXMgb2JsaWdhdG9pcmVzIDoNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMj1FbnRyXHUwMGU5ZXMgZmFjdWx0YXRpdmVzIDoNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMz1Tb3J0aWVzIDoNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBwcm9kdWl0cyBvbnQgXHUwMGU5dFx1MDBlOSBzXHUwMGU5bGVjdGlvbm5cdTAwZTlzLg0KLQ0KLSMgVGFzayBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLXRhc2tHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU9Q29uc2VpbA0KLXRhc2tHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUZvdXJuaXQgZGVzIGluZm9ybWF0aW9ucyBjb21wbFx1MDBlOW1lbnRhaXJlcyBzb3VzIGxhIGZvcm1lIGRlIGNvbnNlaWxzLg0KLXRhc2tHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9Q29uc2VpbCBkaXNwb25pYmxlIDoNCi10YXNrR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9Q29uc2VpbCA6DQotdGFza0d1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBjb25zZWlscyBvbnQgXHUwMGU5dFx1MDBlOSBzXHUwMGU5bGVjdGlvbm5cdTAwZTlzLg0KLQ0KLSMgVGFzayBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotdGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPUNhdFx1MDBlOWdvcmllcw0KLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R1x1MDBlOXJleiBsZXMgY2F0XHUwMGU5Z29yaWVzIGF1eHF1ZWxsZXMgYXBwYXJ0aWVudCBjZXR0ZSB0XHUwMGUyY2hlLg0KLXRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1EaXNjaXBsaW5lcw0KLXRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9Q2F0XHUwMGU5Z29yaWVzIHBlcnNvbm5hbGlzXHUwMGU5ZXMNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1EaXNjaXBsaW5lcyA6DQotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPUNhdFx1MDBlOWdvcmllcyBwZXJzb25uYWxpc1x1MDBlOWVzIDoNCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgVGFza3MgUGFnZQ0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25OYW1lPVRcdTAwZTJjaGVzDQotV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPUNlIHByb2R1aXQgZXN0IHVuZSBlbnRyXHUwMGU5ZSBvdSB1bmUgc29ydGllIHBvdXIgbGVzIHRcdTAwZTJjaGVzIHN1aXZhbnRlcy4NCi1Xb3JrUHJvZHVjdF9UYXNrc19BdmFpbGFibGVMYWJlbD1UXHUwMGUyY2hlcyBkaXNwb25pYmxlcw0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWw9RW50clx1MDBlOWUgb2JsaWdhdG9pcmUgOg0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwyPUVudHJcdTAwZTllIGZhY3VsdGF0aXZlIDoNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMz1Tb3J0aWUgOg0KLVdvcmtQcm9kdWN0X1Rhc2tzX011bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHRcdTAwZTJjaGVzIG9udCBcdTAwZTl0XHUwMGU5IHNcdTAwZTlsZWN0aW9ublx1MDBlOWVzLg0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBSb2xlcyBQYWdlDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU9Ulx1MDBmNGxlcw0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1MZXMgclx1MDBmNGxlcyBzdWl2YW50cyBzb250IHJlc3BvbnNhYmxlcyBkZSBvdSBtb2RpZmllbnQgY2UgcHJvZHVpdC4NCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1SXHUwMGY0bGVzIGRpc3BvbmlibGVzDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1SXHUwMGY0bGUgcmVzcG9uc2FibGUgOg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVJcdTAwZjRsZXMgbW9kaWZpY2F0ZXVycyA6DQotd29ya1Byb2R1Y3RSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gclx1MDBmNGxlcyBvbnQgXHUwMGU5dFx1MDBlOSBzXHUwMGU5bGVjdGlvbm5cdTAwZTlzLg0KLQ0KLSMjIFdvcmsgUHJvZHVjdCBFZGl0b3IgRGVsaXZlcmFibGUgUGFydHMgUGFnZQ0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbk5hbWU9Q29tcG9zYW50cyBsaXZyYWJsZXMNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1TcFx1MDBlOWNpZmlleiBsZXMgcHJvZHVpdHMgcXVpIGNvbnN0aXR1ZW50IGNlIGxpdnJhYmxlLg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9UHJvZHVpdHMgZGlzcG9uaWJsZXMgY29tbWUgY29tcG9zYW50cyBsaXZyYWJsZXMgOg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Qcm9kdWl0cyBjb21tZSBjb21wb3NhbnRzIGxpdnJhYmxlcyA6DQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBwcm9kdWl0cyBvbnQgXHUwMGU5dFx1MDBlOSBzXHUwMGU5bGVjdGlvbm5cdTAwZTlzLg0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBHdWlkYW5jZSBQYWdlDQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU9Q29uc2VpbA0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Gb3Vybml0IGRlcyBpbmZvcm1hdGlvbnMgY29tcGxcdTAwZTltZW50YWlyZXMgc291cyBsYSBmb3JtZSBkZSBjb25zZWlscy4NCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1Db25zZWlsIGRpc3BvbmlibGUgOg0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9Q29uc2VpbCA6DQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gY29uc2VpbHMgb250IFx1MDBlOXRcdTAwZTkgc1x1MDBlOWxlY3Rpb25uXHUwMGU5cy4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1DYXRcdTAwZTlnb3JpZXMNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HXHUwMGU5cmV6IGxlcyBjYXRcdTAwZTlnb3JpZXMgYXV4cXVlbGxlcyBhcHBhcnRpZW50IGNlIHByb2R1aXQuDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1Eb21haW5lcw0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyPVR5cGUgZGUgcHJvZHVpdHMgOg0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwzPUNhdFx1MDBlOWdvcmllcyBwZXJzb25uYWxpc1x1MDBlOWVzIDoNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw9RG9tYWluZSA6DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1UeXBlcyBkZSBwcm9kdWl0cyA6DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMz1DYXRcdTAwZTlnb3JpZXMgcGVyc29ubmFsaXNcdTAwZTllcyA6DQotDQotIyBQcmFjdGljZSBFZGl0b3IgUmVmZXJlbmNlcyBQYWdlDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uTmFtZT1FbFx1MDBlOW1lbnRzIGRlIGNvbnRlbnUNCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1TcFx1MDBlOWNpZmlleiBsZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIGNvbnRlbnUgclx1MDBlOWZcdTAwZTlyZW5jXHUwMGU5cyBwYXIgY2V0dGUgcHJhdGlxdWUuDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9hdmFpbGFibGVMYWJlbD1FbFx1MDBlOW1lbnRzIGRlIGNvbnRlbnUgZGlzcG9uaWJsZXMgOg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1FbFx1MDBlOW1lbnRzIGRlIGNvbnRlbnUgOg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gXHUwMGU5bFx1MDBlOW1lbnRzIGRlIGNvbnRlbnUgb250IFx1MDBlOXRcdTAwZTkgc1x1MDBlOWxlY3Rpb25uXHUwMGU5cy4NCi0NCi0jIENhdGVnb3J5IEVkaXRvciBHdWlkYW5jZSBQYWdlDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlY3Rpb25OYW1lPUNvbnNlaWwNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGVzIGNvbnNlaWxzIHF1aSBhcHBhcnRpZW5uZW50IFx1MDBlMCBjZXQgezB9Lg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9hdmFpbGFibGVMYWJlbD1Db25zZWlsIGRpc3BvbmlibGUgOg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsPUNvbnNlaWwgOg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBjb25zZWlscyBvbnQgXHUwMGU5dFx1MDBlOSBzXHUwMGU5bGVjdGlvbm5cdTAwZTlzLg0KLQ0KLSMgRGlzY2lwbGluZSBHcm91cGluZyBFZGl0b3IgRGlzY2lwbGluZXMgUGFnZQ0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uTmFtZT1EaXNjaXBsaW5lcw0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R1x1MDBlOXJlciBsZXMgZGlzY2lwbGluZXMgcXVpIGFwcGFydGllbm5lbnQgXHUwMGUwIGNlIHJlZ3JvdXBlbWVudCBkZSBkaXNjaXBsaW5lcy4NCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfYXZhaWxhYmxlTGFiZWw9RGlzY2lwbGluZXMgZGlzcG9uaWJsZXMgOg0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWxlY3RlZExhYmVsPURpc2NpcGxpbmVzIDoNCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gZGlzY2lwbGluZXMgb250IFx1MDBlOXRcdTAwZTkgc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZXMuDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Vc2VEZWZhdWx0RGlyZWN0b3J5QnV0dG9uTGFiZWw9VXRpbGlzZXIgbGUgclx1MDBlOXBlcnRvaXJlIHBhciBkXHUwMGU5ZmF1dA0KLQ0KLSMgRGlzY2lwbGluZSBFZGl0b3IgVGFza3MgUGFnZQ0KLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbk5hbWU9VFx1MDBlMmNoZXMNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HXHUwMGU5cmV6IGxlcyB0XHUwMGUyY2hlcyBxdWkgYXBwYXJ0aWVubmVudCBcdTAwZTAgY2V0dGUgZGlzY2lwbGluZS4NCi1kaXNjaXBsaW5lVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPVRcdTAwZTJjaGVzIGRpc3BvbmlibGVzIDoNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw9VFx1MDBlMmNoZXMgOg0KLWRpc2NpcGxpbmVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gdFx1MDBlMmNoZXMgb250IFx1MDBlOXRcdTAwZTkgc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZXMuDQotDQotIyBEaXNjaXBsaW5lIEVkaXRvciBSZWZlcmVuY2UgV29ya2Zsb3cgUGFnZQ0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbk5hbWU9RW5jaGFcdTAwZWVuZW1lbnRzIGQnYWN0aXZpdFx1MDBlOXMgZGUgclx1MDBlOWZcdTAwZTlyZW5jZQ0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGVzIGVuY2hhXHUwMGVlbmVtZW50cyBkJ2FjdGl2aXRcdTAwZTlzIGRlIHJcdTAwZTlmXHUwMGU5cmVuY2UgcXVpIGFwcGFydGllbm5lbnQgXHUwMGUwIGNldHRlIGRpc2NpcGxpbmUuDQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9hdmFpbGFibGVMYWJlbD1FbmNoYVx1MDBlZW5lbWVudHMgZCdhY3Rpdml0XHUwMGU5cyBkZSByXHUwMGU5Zlx1MDBlOXJlbmNlIGRpc3BvbmlibGVzIDoNCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlbGVjdGVkTGFiZWw9RW5jaGFcdTAwZWVuZW1lbnRzIGQnYWN0aXZpdFx1MDBlOXMgZGUgclx1MDBlOWZcdTAwZTlyZW5jZSA6DQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBlbmNoYVx1MDBlZW5lbWVudHMgZCcnYWN0aXZpdFx1MDBlOXMgZGUgclx1MDBlOWZcdTAwZTlyZW5jZSBvbnQgXHUwMGU5dFx1MDBlOSBzXHUwMGU5bGVjdGlvbm5cdTAwZTlzLg0KLQ0KLSMgRG9tYWluIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVByb2R1aXRzDQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R1x1MDBlOXJleiBsZXMgcHJvZHVpdHMgcXVpIGFwcGFydGllbm5lbnQgXHUwMGUwIGNlIGRvbWFpbmUuDQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1Qcm9kdWl0cyBkaXNwb25pYmxlcyA6DQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVByb2R1aXRzIDoNCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHByb2R1aXRzIG9udCBcdTAwZTl0XHUwMGU5IHNcdTAwZTlsZWN0aW9ublx1MDBlOXMuDQotDQotIyBXb3JrIFByb2R1Y3QgS2luZCBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Qcm9kdWl0cw0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGVzIHByb2R1aXRzIHF1aSBhcHBhcnRpZW5uZW50IFx1MDBlMCBjZSB0eXBlIGRlIHByb2R1aXQuDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1Qcm9kdWl0cyBkaXNwb25pYmxlcyA6DQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVByb2R1aXRzIDoNCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHByb2R1aXRzIG9udCBcdTAwZTl0XHUwMGU5IHNcdTAwZTlsZWN0aW9ublx1MDBlOXMuDQotDQotIyBSb2xlIFNldCBHcm91cGluZyBFZGl0b3IgUm9sZSBTZXRzIFBhZ2UNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbk5hbWU9RW5zZW1ibGVzIGRlIHJcdTAwZjRsZXMNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGVzIGVuc2VtYmxlcyBkZSByXHUwMGY0bGVzIHF1aSBhcHBhcnRpZW5uZW50IFx1MDBlMCBjZSByZWdyb3VwZW1lbnQgZCdlbnNlbWJsZXMgZGUgclx1MDBmNGxlcy4NCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9RW5zZW1ibGVzIGRlIHJcdTAwZjRsZXMgZGlzcG9uaWJsZXMgOg0KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWxlY3RlZExhYmVsPUVuc2VtYmxlcyBkZSByXHUwMGY0bGVzIDoNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gZW5zZW1ibGVzIGRlIHJcdTAwZjRsZXMgb250IFx1MDBlOXRcdTAwZTkgc1x1MDBlOWxlY3Rpb25uXHUwMGU5cy4NCi0NCi0jIFJvbGUgU2V0IEVkaXRvciBSb2xlcyBQYWdlDQotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uTmFtZT1SXHUwMGY0bGVzDQotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R1x1MDBlOXJleiBsZXMgclx1MDBmNGxlcyBxdWkgYXBwYXJ0aWVubmVudCBcdTAwZTAgY2V0IGVuc2VtYmxlIGRlIHJcdTAwZjRsZXMuDQotcm9sZVNldFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1SXHUwMGY0bGVzIGRpc3BvbmlibGVzIDoNCi1yb2xlU2V0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9Ulx1MDBmNGxlcyA6DQotcm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSByXHUwMGY0bGVzIG9udCBcdTAwZTl0XHUwMGU5IHNcdTAwZTlsZWN0aW9ublx1MDBlOXMuDQotDQotIyBUb29sIEVkaXRvciBUb29sIE1lbnRvcnMgUGFnZQ0KLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbk5hbWU9R3VpZGVzIGQndXRpbGlzYXRpb24gZGUgbCdvdXRpbA0KLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGVzIGd1aWRlcyBkJ3V0aWxpc2F0aW9uIGRlIGwnb3V0aWwgcXVpIGFwcGFydGllbm5lbnQgXHUwMGUwIGNldCBvdXRpbC4NCi10b29sVG9vbE1lbnRvcnNQYWdlX2F2YWlsYWJsZUxhYmVsPUd1aWRlcyBkJ3V0aWxpc2F0aW9uIGRlIGwnb3V0aWwgZGlzcG9uaWJsZXMgOg0KLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1HdWlkZXMgZCd1dGlsaXNhdGlvbiBkZSBsJ291dGlsIDoNCi10b29sVG9vbE1lbnRvcnNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGd1aWRlcyBkJyd1dGlsaXNhdGlvbiBkZSBsJydvdXRpbCBvbnQgXHUwMGU5dFx1MDBlOSBzXHUwMGU5bGVjdGlvbm5cdTAwZTlzLg0KLQ0KLSMgQ3VzdG9tIENhdGVnb3J5IEVkaXRvciBBc3NpZ24gUGFnZQ0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uTmFtZT1FbFx1MDBlOW1lbnRzIGRlIGNvbnRlbnUNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGVzIFx1MDBlOWxcdTAwZTltZW50cyBkZSBjb250ZW51IHF1aSBjb25zdGl0dWVudCBjZXR0ZSBjYXRcdTAwZTlnb3JpZSBwZXJzb25uYWxpc1x1MDBlOWUuDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX2F2YWlsYWJsZUxhYmVsPUVsXHUwMGU5bWVudHMgZGUgY29udGVudSBkaXNwb25pYmxlcyA6DQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlbGVjdGVkTGFiZWw9RWxcdTAwZTltZW50cyBkZSBjb250ZW51IDoNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gXHUwMGU5bFx1MDBlOW1lbnRzIGRlIGNvbnRlbnUgb250IFx1MDBlOXRcdTAwZTkgc1x1MDBlOWxlY3Rpb25uXHUwMGU5cy4NCi0NCi0jIE5ldyBNZXRob2QgUGx1Zy1pbiBXaXphcmQNCi1uZXdQbHVnaW5XaXphcmRfdGl0bGU9Tm91dmVhdSBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZQ0KLW5ld1BsdWdpbldpemFyZFBhZ2VfdGl0bGU9Q3JcdTAwZTllciB1biBub3V2ZWF1IHBsdWctaW4gZGUgbVx1MDBlOXRob2RlDQotbmV3UGx1Z2luV2l6YXJkUGFnZV90ZXh0PVNwXHUwMGU5Y2lmaWV6IHVuIG5vbSBldCBmb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBzdXIgbGUgbm91dmVhdSBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZS4NCi1uZXdQbHVnaW5FcnJvcl9tc2c9SVVQQTAwMjFFIDogRWNoZWMgZGUgbGEgY3JcdTAwZTlhdGlvbiBkdSBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZS4NCi1uZXdQbHVnaW5FcnJvcl9yZWFzb249RXJyZXVyIGludGVybmUuXG5cDQotXG5cDQotQ2xpcXVleiBzdXIgRFx1MDBlOXRhaWxzIHBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucy4NCi0NCi0jIEdlbmVyaWMgZGlhbG9nIHRpdGxlcw0KLWNyZWF0ZURpYWxvZ190aXRsZT1Dclx1MDBlOWVyIHVuIFx1MDBlOWxcdTAwZTltZW50DQotZGVsZXRlRGlhbG9nX3RpdGxlPVN1cHByaW1lciB1biBcdTAwZTlsXHUwMGU5bWVudA0KLWVkaXREaWFsb2dfdGl0bGU9TW9kaWZpZXIgdW4gXHUwMGU5bFx1MDBlOW1lbnQNCi1lcnJvckRpYWxvZ190aXRsZT1FcnJldXINCi1tb3ZlRGlhbG9nX3RpdGxlPURcdTAwZTlwbGFjZXIgdW4gXHUwMGU5bFx1MDBlOW1lbnQNCi1yZW5hbWVEaWFsb2dfdGl0bGU9UmVub21tZXIgdW4gXHUwMGU5bFx1MDBlOW1lbnQNCi13YXJuaW5nRGlhbG9nX3RpdGxlPUF2ZXJ0aXNzZW1lbnQNCi0NCi0jIEFkZCBDb25maWd1cmF0aW9uIHRvIFByb2Nlc3MgRXJyb3IgRGlhbG9nDQotYWRkQ29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9QWpvdXRlciB1bmUgY29uZmlndXJhdGlvbiBhdSBwcm9jZXNzdXMNCi0NCi0jIFNldCBEZWZhdWx0IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotc2V0RGVmYXVsdENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPURcdTAwZTlmaW5pciB1bmUgY29uZmlndXJhdGlvbiBwYXIgZFx1MDBlOWZhdXQgcG91ciBsZSBwcm9jZXNzdXMNCi0NCi0jIEVkaXQgUHJvY2VzcyBFcnJvciBEaWFsb2cNCi1lZGl0UHJvY2Vzc0VsZW1lbnRFcnJvckRpYWxvZ190aXRsZT1Nb2RpZmllciBsJ1x1MDBlOWxcdTAwZTltZW50IGRlIHByb2Nlc3N1cw0KLQ0KLSMgT3BlbiBMaWJyYXJ5IERpYWxvZw0KLW9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlPU91dnJpciB1bmUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcw0KLW9wZW5MaWJyYXJ5RGlhbG9nX3RleHQ9TGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBlbiBjb3VycyBuJ2EgcGFzIFx1MDBlOXRcdTAwZTkgc2F1dmVnYXJkXHUwMGU5ZSBjb3JyZWN0ZW1lbnQuIFZvdWxlei12b3VzIGlnbm9yZXIgbCdlcnJldXIgZXQgY29udGludWVyIHBvdXIgb3V2cmlyIHVuZSBhdXRyZSBiaWJsaW90aFx1MDBlOHF1ZSA/DQotDQotIyBTYXZlIExpYnJhcnkgRGlhbG9nDQotc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGU9U2F1dmVnYXJkZXIgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcw0KLXNhdmVMaWJyYXJ5RGlhbG9nX3RleHQ9TGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBlbiBjb3VycyBhIFx1MDBlOXRcdTAwZTkgbW9kaWZpXHUwMGU5ZS4gVm91bGV6LXZvdXMgZW5yZWdpc3RyZXIgbGVzIG1vZGlmaWNhdGlvbnMgPw0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPU1ldHRyZSBcdTAwZTAgbml2ZWF1IGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMNCi0NCi0jIERlbGV0ZSBFbGVtZW50IFJlZmVyZW5jZSBEaWFsb2cNCi1kZWxldGVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PUwnJ1x1MDBlOWxcdTAwZTltZW50ICcnezB9JycgYSBkXHUwMGU5alx1MDBlMCBcdTAwZTl0XHUwMGU5IHN1cHByaW1cdTAwZTkuIFNvdWhhaXRlei12b3VzIGxlIHN1cHByaW1lciBkZSAnJ3sxfScnID8NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbm9PcGVuTGlicmFyeUVycm9yX21zZz1JVVBBMDAwMEUgOiBBdWN1bmUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBvdXZlcnRlLlxuXA0KLVxuXA0KLVVuZSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIGRvaXQgXHUwMGVhdHJlIG91dmVydGUgcG91ciBxdSd1biBub3V2ZWwgXHUwMGU5bFx1MDBlOW1lbnQgZGUgbVx1MDBlOXRob2RlIHB1aXNzZSBcdTAwZWF0cmUgYWpvdXRcdTAwZTkuXG5cDQotXG5cDQotQ3JcdTAwZTlleiB1bmUgbm91dmVsbGUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBvdSBvdXZyZXogdW5lIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZXhpc3RhbnRlIGV0IHJcdTAwZTllc3NheWV6Lg0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDFFIDogTGUgbm9tIHswfSBlc3QgbWFucXVhbnQuXG5cDQotXG5cDQotVG91cyBsZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIG1cdTAwZTl0aG9kZSBldCBkZSBwcm9jZXNzdXMgZG9pdmVudCBhdm9pciB1biBub20uXG5cDQotXG5cDQotQ2xpcXVleiBzdXIgT0sgZXQgc2Fpc2lzc2V6IHVuIG5vbSB2YWxpZGUgcG91ciBjZXQgXHUwMGU5bFx1MDBlOW1lbnQuDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDJFIDogTGUgbm9tICcnezB9JycgZXhpc3RlIGRcdTAwZTlqXHUwMGUwLlxuXA0KLVxuXA0KLVVuIFx1MDBlOWxcdTAwZTltZW50IGRlIG1cdTAwZTl0aG9kZSBkb2l0IGF2b2lyIHVuIG5vbSB1bmlxdWUuXG5cDQotXG5cDQotQ2xpcXVleiBzdXIgT0sgZXQgc2Fpc2lzc2V6IHVuIG5vbSBkaWZmXHUwMGU5cmVudCBwb3VyIGNldCBcdTAwZTlsXHUwMGU5bWVudC4NCi1jcmVhdGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDNFIDogSW1wb3NzaWJsZSBkZSBjclx1MDBlOWVyIGxhIGNvbmZpZ3VyYXRpb24gZGUgbVx1MDBlOXRob2RlLg0KLWRlbGV0ZUNvbmZpZ0Vycm9yX21zZz1JVVBBMDAwNFcgOiBJbXBvc3NpYmxlIGRlIHN1cHByaW1lciBsYSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZS4NCi1pbnRlcm5hbEVycm9yX21zZz1JVVBBMDAwNUUgOiBVbmUgZXJyZXVyIGludGVybmUgcydlc3QgcHJvZHVpdGUuXG5cDQotXG5cDQotQ2xpcXVleiBzdXIgRFx1MDBlOXRhaWxzIHBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucy4NCi1pbnZhbGlkUHJlc2VudGF0aW9uTmFtZUVycm9yX21zZz1JVVBBMDAwNkUgOiBMZSBub20gZGUgcHJcdTAwZTlzZW50YXRpb24gc3BcdTAwZTljaWZpXHUwMGU5IGVzdCBub24gdmFsaWRlLlxuXA0KLVxuXA0KLUNsaXF1ZXogc3VyIE9LIGV0IHNhaXNpc3NleiB1biBub20gZGlmZlx1MDBlOXJlbnQuDQotaW52YWxpZENvbmZpZ0Vycm9yX21zZz1JVVBBMDAwN0UgOiBMYSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZSBzXHUwMGU5bGVjdGlvbm5cdTAwZTllICcnezB9JycgbicnZXN0IHBhcyB1biBzb3VzLWVuc2VtYmxlIGRlIGxhIGNvbmZpZ3VyYXRpb24gcGFyIGRcdTAwZTlmYXV0IGR1IHByb2Nlc3N1cy5cblwNCi1cblwNCi1BZmluIGRlIHByXHUwMGU5c2VydmVyIGwnJ2ludFx1MDBlOWdyaXRcdTAwZTkgZCcndW4gcHJvY2Vzc3VzLCBzYSBjb25maWd1cmF0aW9uIHBhciBkXHUwMGU5ZmF1dCBkb2l0IFx1MDBlYXRyZSB1bmUgdmVyc2lvbiBcdTAwZTlsYWJvclx1MDBlOWUgZGUgdG91dGVzIGxlcyBhdXRyZXMgY29uZmlndXJhdGlvbnMgcXVpIHNvbnQgYXNzb2NpXHUwMGU5ZXMgXHUwMGUwIGNlIHByb2Nlc3N1cy5cblwNCi1cblwNCi1TXHUwMGU5bGVjdGlvbm5leiB1bmUgYXV0cmUgY29uZmlndXJhdGlvbiBvdSBtb2RpZmlleiBsYSBjb25maWd1cmF0aW9uIHBhciBkXHUwMGU5ZmF1dCBwb3VyIHF1JydlbGxlIGluY2x1ZSBsZSBjb250ZW51IGRlIGxhIGNvbmZpZ3VyYXRpb24gc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZSBldCByXHUwMGU5ZXNzYXllei4NCi1zZXREZWZhdWx0Q29uZmlnRXJyb3JfbXNnPUlVUEEwMDA4RSA6IExhIGNvbmZpZ3VyYXRpb24gZGUgbVx1MDBlOXRob2RlIHNcdTAwZTlsZWN0aW9ublx1MDBlOWUgJyd7MH0nJyBuJydlc3QgcGFzIHVuZSB2ZXJzaW9uIFx1MDBlOWxhYm9yXHUwMGU5ZSBkZXMgYXV0cmVzIGNvbmZpZ3VyYXRpb25zIHJcdTAwZTlmXHUwMGU5cmVuY1x1MDBlOWVzIHBhciBsZSBwcm9jZXNzdXMuXG5cDQotXG5cDQotQWZpbiBkZSBwclx1MDBlOXNlcnZlciBsJydpbnRcdTAwZTlncml0XHUwMGU5IGQnJ3VuIHByb2Nlc3N1cywgc2EgY29uZmlndXJhdGlvbiBwYXIgZFx1MDBlOWZhdXQgZG9pdCBcdTAwZWF0cmUgdW5lIHZlcnNpb24gXHUwMGU5bGFib3JcdTAwZTllIGRlIHRvdXRlcyBsZXMgYXV0cmVzIGNvbmZpZ3VyYXRpb25zIHF1aSBzb250IGFzc29jaVx1MDBlOWVzIFx1MDBlMCBjZSBwcm9jZXNzdXMuXG5cDQotXG5cDQotU1x1MDBlOWxlY3Rpb25uZXogdW5lIGF1dHJlIGNvbmZpZ3VyYXRpb24gb3UgbW9kaWZpZXogbGUgY29udGVudSBkZSBsYSBjb25maWd1cmF0aW9uIHNcdTAwZTlsZWN0aW9ublx1MDBlOWUgZXQgclx1MDBlOWVzc2F5ZXouDQotb3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDlFIDogQ2hhcmdlbWVudCBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIGltcG9zc2libGUuXG5cDQotXG5cDQotQ2xpcXVleiBzdXIgRFx1MDBlOXRhaWxzIHBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucy4NCi1zYXZlTGlicmFyeUVycm9yX21zZz1JVVBBMDAxMEUgOiBJbXBvc3NpYmxlIGRlIHNhdXZlZ2FyZGVyIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMuDQotc2F2ZUxpYnJhcnlUb0Vycm9yX21zZz1JVVBBMDAxMEUgOiBJbXBvc3NpYmxlIGRlIHNhdXZlZ2FyZGVyIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZGFucyAnJ3swfScnLg0KLWVsZW1lbnRBbHJlYWR5RGVsZXRlZEVycm9yX21zZz1JVVBBMDAxMUUgOiBMJydcdTAwZTlsXHUwMGU5bWVudCAnJ3swfScnIGEgZFx1MDBlOWpcdTAwZTAgXHUwMGU5dFx1MDBlOSBzdXBwcmltXHUwMGU5Lg0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEyRSA6IExhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgbmUgcGV1dCBwYXMgXHUwMGVhdHJlIG1pc2UgXHUwMGUwIG5pdmVhdS4NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249SVVQQTAwMTZFIDogVW5lIGVycmV1ciBzJ2VzdCBwcm9kdWl0ZS5cblwNCi1cblwNCi1DbGlxdWV6IHN1ciBEXHUwMGU5dGFpbHMgcG91ciBwbHVzIGQnaW5mb3JtYXRpb25zLg0KLWludGVybmFsRXJyb3JfcmVhc29uPUlVUEEwMDE3RSA6IFVuZSBlcnJldXIgaW50ZXJuZSBzJ2VzdCBwcm9kdWl0ZS5cblwNCi1cblwNCi1DbGlxdWV6IHN1ciBEXHUwMGU5dGFpbHMgcG91ciBwbHVzIGQnaW5mb3JtYXRpb25zLg0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfcmVhc29uPUlVUEEwMDE4RSA6IFVuZSBlcnJldXIgcydlc3QgcHJvZHVpdGUgbG9ycyBkdSBjaGFyZ2VtZW50IGRlcyBcdTAwZTlsXHUwMGU5bWVudHMgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcy5cblwNCi1cblwNCi1DbGlxdWV6IHN1ciBEXHUwMGU5dGFpbHMgcG91ciBwbHVzIGQnaW5mb3JtYXRpb25zLg0KLXNhdmVVcGdyYWRlZExpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMTlFIDogVW5lIGVycmV1ciBzJ2VzdCBwcm9kdWl0ZSBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBtaXNlIFx1MDBlMCBuaXZlYXUuXG5cDQotXG5cDQotQ2xpcXVleiBzdXIgRFx1MDBlOXRhaWxzIHBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucy4NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9T3V2ZXJ0dXJlIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMuLi4NCi1zYXZpbmdMaWJyYXJ5VGFza19uYW1lPVNhdXZlZ2FyZGUgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcy4uLg0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9TWlzZSBcdTAwZTAgbml2ZWF1IGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMuLi4NCi1sb2FkaW5nTGlicmFyeUVsZW1lbnRzVGFza19uYW1lPUNoYXJnZW1lbnQgZGVzIFx1MDBlOWxcdTAwZTltZW50cyBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzLi4uDQotc2F2aW5nVXBncmFkZWRFbGVtZW50c1Rhc2tfbmFtZT1FbnJlZ2lzdHJlbWVudCBkZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZGFucyB1biBub3V2ZWF1IGZvcm1hdCBkZSBmaWNoaWVyLi4uDQotc2F2aW5nVGFza19uYW1lPUVucmVnaXN0cmVtZW50IGRlICcnezB9JycuLi4NCi1zYXZpbmdGaWxlc1Rhc2tfbmFtZT1FbnJlZ2lzdHJlbWVudCBkZXMgZmljaGllcnMuLi4NCi1maXhpbmdDb250ZW50RGVzY3JpcHRpb25HVUlEc1Rhc2tfbmFtZT1Db3JyZWN0aW9uIGRlcyBpZGVudGlmaWNhdGV1cnMgZ2xvYmF1eCB1bmlxdWVzIGRlIGRlc2NyaXB0aW9uIGRlIGNvbnRlbnUuLi4NCi1kZWxldGluZ0ludmFsaWRSZWZlcmVuY2VzVGFza19uYW1lPVN1cHByZXNzaW9uIGRlcyByXHUwMGU5Zlx1MDBlOXJlbmNlcyBub24gdmFsaWRlcy4uLg0KLQ0KLQ0KLSMgQWRkIEVkaXRvciBUbyBCcm93c2luZyBQZXJzcGVjdGl2ZSBXYXJuaW5nIERpYWxvZw0KLWFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZz1JVVBBMDA0NlcgOiBDZXR0ZSBwZXJzcGVjdGl2ZSBhIFx1MDBlOXRcdTAwZTkgc3BcdTAwZTljaWFsZW1lbnQgY29uXHUwMGU3dWUgcG91ciBtYXhpbWlzZXIgdm90cmUgYWNxdWlzIHV0aWxpc2F0ZXVyIGVuIHRlcm1lcyBkJ2V4cGxvcmF0aW9uIGRhbnMgbGEgcmVwclx1MDBlOXNlbnRhdGlvbiBIVE1MIGRlcyBcdTAwZTlsXHUwMGU5bWVudHMgZGUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcy4gQXVjdW4gXHUwMGU5ZGl0ZXVyIG5lIHBldXQgeSBcdTAwZWF0cmUgYWpvdXRcdTAwZTkgb3UgYWZmaWNoXHUwMGU5Lg0KLQ0KLSMgQ2hhbmdlIEhpc3RvcnkgRGlhbG9nDQotQ2hhbmdlSGlzdG9yeURpYWxvZ190aXRsZT1IaXN0b3JpcXVlIGRlcyBkZXNjcmlwdGlvbnMgZGVzIG1vZGlmaWNhdGlvbnMNCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX2xhYmVsPUhpc3RvcmlxdWUgZGVzIG1vZGlmaWNhdGlvbnMgOg0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgRGVsZXRlIEFjdGlvbg0KLWNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU9Q29uZmlybWVyIGxhIHN1cHByZXNzaW9uDQotY29uZmlybURlbGV0ZURpYWxvZ19tc2c9RXRlcy12b3VzIHNcdTAwZmJyIGRlIHZvdWxvaXIgc3VwcHJpbWVyICcnezB9JycgPw0KLWNvbmZpcm1EZWxldGVEaWFsb2dfbXNnV2l0aFJlZmVyZW5jZT1FdGVzLXZvdXMgc1x1MDBmYnIgZGUgdm91bG9pciBzdXBwcmltZXIgJyd7MH0nJyA/XG5cDQotXG5cDQotTGUocykgXHUwMGU5bFx1MDBlOW1lbnQocykgc3VpdmFudChzKSBjb250aWVudCgtdGllbm5lbnQpIGRlcyByXHUwMGU5Zlx1MDBlOXJlbmNlcyBcdTAwZTAoYXV4KSBcdTAwZTlsXHUwMGU5bWVudChzKSBcdTAwZTAgc3VwcHJpbWVyIDogezF9DQotDQotIyBOZXcgTGlicmFyeSBEaWFsb2cNCi1lcnJvckRpYWxvZ19tZXNzYWdlPUlVUEEwMDIyRSA6IEltcG9zc2libGUgZGUgY3JcdTAwZTllciBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzICcnezB9JycuDQotZXJyb3JEaWFsb2dfZXJyb3I9SW1wb3NzaWJsZSBkZSBjclx1MDBlOWVyIHVuZSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIGRhbnMgdW5lIGF1dHJlIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMuDQotZXJyX25vb3BlbmxpYnJhcnk9SVVQQTAwNDBFIDogQXVjdW5lIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgb3V2ZXJ0ZS5cblwNCi1cblwNCi1VbmUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBkb2l0IFx1MDBlYXRyZSBvdXZlcnRlIHBvdXIgcXUndW4gbm91dmVhdSBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZSBwdWlzc2UgXHUwMGVhdHJlIGFqb3V0XHUwMGU5LlxuXA0KLVxuXA0KLUNyXHUwMGU5ZXogdW5lIG5vdXZlbGxlIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgb3Ugb3V2cmV6IHVuZSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIGV4aXN0YW50ZSBldCByXHUwMGU5ZXNzYXllei4NCi1lcnJfbG9hZGluZ2xpYnJhcnk9RXJyZXVyIGRlIGNoYXJnZW1lbnQgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUNCi1tc2dfcmVsb2FkTGlicmFyeT1FcnJldXIgZCdhbm51bGF0aW9uIGRlIGwnXHUwMGU5Y2hlYyBkZSBzdXBwcmVzc2lvbi4gTGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBlbiBjb3VycyBkb2l0IFx1MDBlYXRyZSByZWNoYXJnXHUwMGU5ZS4NCi0NCi0jIFJlbG9hZCBMaWJyYXJ5IERpYWxvZw0KLXJlbG9hZERpYWxvZ19tZXNzYWdlPUxhIGJpYmxpb3RoXHUwMGU4cXVlIGRvaXQgXHUwMGVhdHJlIHJlY2hhcmdcdTAwZTllIHBvdXIgcXVlIHNvbiBcdTAwZTl0YXQgaW5pdGlhbCBzb2l0IHJlc3RhdXJcdTAwZTkuDQotcmVsb2FkRGlhbG9nX3RpdGxlPVJlY2hhcmdlciBsYSBiaWJsaW90aFx1MDBlOHF1ZQ0KLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvclRpdGxlPUVycmV1ciBkZSBkXHUwMGU5cGxhY2VtZW50DQotZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yTWVzc2FnZT1FcnJldXIgbG9ycyBkdSBkXHUwMGU5cGxhY2VtZW50DQotDQotIyBQcm9jZXNzIEZvcm0gRWRpdG9yDQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX3RpdGxlPUVucmVnaXN0cmVyDQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UxPUNldHRlIG1vZGlmaWNhdGlvbiBhdXJhIHVuZSBpbmNpZGVuY2Ugc3VyIHRvdXMgbGVzIGRpYWdyYW1tZXMgZGUgdm90cmUgcHJvY2Vzc3VzLiBMJ1x1MDBlOWRpdGV1ciBzZXJhIHNhdXZlZ2FyZFx1MDBlOSB1bmUgZm9pcyBxdWUgdm91cyBhdXJleiBlZmZlY3R1XHUwMGU5IHZvdHJlIG1vZGlmaWNhdGlvbi4gVm91bGV6LXZvdXMgY29udGludWVyID8NCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTI9TCdcdTAwZTlkaXRldXIgc2VyYSBzYXV2ZWdhcmRcdTAwZTkgdW5lIGZvaXMgcXVlIHZvdXMgYXVyZXogZWZmZWN0dVx1MDBlOSB2b3RyZSBtb2RpZmljYXRpb24uIFZvdWxlei12b3VzIGNvbnRpbnVlciA/DQotDQotIyBDb25maWd1cmF0aW9uIFZpZXcgUGFnZQ0KLWNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ190aXRsZT1Db25maXJtZXIgbGEgc3VwcHJlc3Npb24NCi1jb25maWdWaWV3UGFnZVJlbW92ZVZpZXdEaWFsb2dfbWVzc2FnZT1FdGVzLXZvdXMgc1x1MDBmYnIgZGUgdm91bG9pciBzdXBwcmltZXIgbGEgdnVlICcnezB9JycgPw0KLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ190aXRsZT1BdmVydGlzc2VtZW50DQotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvbj1Db25maWd1cmF0aW9uIDoNCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld3M9VnVlcyBkZSBsYSBjb25maWd1cmF0aW9uDQotY29uZmlnVmlld1BhZ2Vfdmlld3M9VnVlcw0KLWNvbHVtbnNlbGVjdGlvbl90ZXh0PVNcdTAwZTlsZWN0aW9uIGRlIGNvbG9ubmVzIDoNCi1jb25maWdWaWV3UGFnZV9hZGRWaWV3QnV0dG9uVGV4dD1Bam91dGVyIHVuZSB2dWUuLi4NCi1jb25maWdWaWV3UGFnZV9yZW1vdmVWaWV3QnV0dG9uVGV4dD1TdXBwcmltZXIgdW5lIHZ1ZQ0KLWNvbmZpZ1ZpZXdQYWdlX21ha2VEZWZhdWx0QnV0dG9uVGV4dD1EXHUwMGU5ZmluaXIgY29tbWUgdmFsZXVyIHBhciBkXHUwMGU5ZmF1dA0KLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ19tZXNzYWdlPUlVUEEwMDIzVyA6IExhIHZ1ZSAnJ3swfScnIGV4aXN0ZSBkXHUwMGU5alx1MDBlMC4NCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25UaXRsZT1WdWVzIGRlIG5hdmlnYXRpb24gcHVibGlcdTAwZTllcw0KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvbk1lc3NhZ2U9U3BcdTAwZTljaWZpZXogbGVzIHZ1ZXMgcXVpIHNlcm9udCBpbmNsdXNlcyBsb3JzIGRlIGxhIHB1YmxpY2F0aW9uIGRlIGNldHRlIGNvbmZpZ3VyYXRpb24uIFBvdXIgY3JcdTAwZTllciB1bmUgdnVlLCBjbGlxdWV6IHN1ciBBam91dGVyIHVuZSB2dWUgYWZpbiBkZSBzXHUwMGU5bGVjdGlvbm5lciBuJ2ltcG9ydGUgcXVlbGxlIGNhdFx1MDBlOWdvcmllIHN0YW5kYXJkIG91IHBlcnNvbm5hbGlzXHUwMGU5ZSBkYW5zIGxhIGNvbmZpZ3VyYXRpb24uICBMYSBjYXRcdTAwZTlnb3JpZSBzXHUwMGU5bGVjdGlvbm5cdTAwZTllIHJlcHJcdTAwZTlzZW50ZXJhIGxhIHZ1ZSwgdGFuZGlzIHF1ZSBsZXMgc291cy1jYXRcdTAwZTlnb3JpZXMgZGUgbGEgY2F0XHUwMGU5Z29yaWUgZXQgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIGNvbnRlbnUgcmVwclx1MDBlOXNlbnRlcm9udCBsZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIGwnYXJicmUgZGUgbGEgdnVlLg0KLQ0KLSMgRGVzY3JpcHRpb24gVGFiDQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfdGl0bGU9Q29udmVydGlyIGxlIGNvbnNlaWwNCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMT1JVVBBMDA0MFcgOiBFbnJlZ2lzdHJleiBkJ2Fib3JkIGwnXHUwMGU5ZGl0ZXVyLg0KLWRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UyPUF1Y3VuIGNvbnNlaWwgbidlc3QgY29tcGF0aWJsZSBhdmVjIGNlIHR5cGUuDQotDQotY2hhbmdlQWN0aXZpdHlUeXBlV2FybmluZ0RpYWxvZ190aXRsZT1Db252ZXJ0aXIgbCdhY3Rpdml0XHUwMGU5DQotIyBBc3NvY2lhdGlvbiBGb3JtIFBhZ2UNCi1Bc3NvY2lhdGlvbkZvcm1QYWdlX0JyaWVmRGVzY3JpcHRpb25MYWJlbD1EZXNjcmlwdGlmIGNvdXJ0IGRlIGwnXHUwMGU5bFx1MDBlOW1lbnQgc1x1MDBlOWxlY3Rpb25uXHUwMGU5IDoNCi0NCi0jIE1ldGhvZCBFbGVtZW50IERlc2NyaXB0aW9uDQotbWV0aG9kRWxlbWVudERlc2NyaXB0aW9uRW1wdHlOYW1lRGlhbG9nX3RpdGxlPVNhaXNpciBsZSBub20gZGUgbCdcdTAwZTlsXHUwMGU5bWVudA0KLW1ldGhvZEVsZW1lbnREZXNjcmlwdGlvbkVtcHR5TmFtZURpYWxvZ19tZXNzYWdlPUxhIHpvbmUgZGUgbm9tIG5lIHBldXQgcGFzIFx1MDBlYXRyZSB2aWRlLg0KLQ0KLSMgTWV0aG9kIFBsdWctaW4gRGVzY3JpcHRpb24NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblJlbW92ZVJlZkNvbmZpcm1fbWVzc2FnZT1TaSB2b3VzIGRcdTAwZTlzXHUwMGU5bGVjdGlvbm5leiBsZShzKSBwbHVnLWluKHMpIHJcdTAwZTlmXHUwMGU5cmVuY1x1MDBlOShzKSBhc3NvY2lcdTAwZTkocykgYXUgcGx1Zy1pbiAnJ3swfScnIGRlcyByZWxhdGlvbnMgbm9uIHZhbGlkZXMgc2Vyb250IGdcdTAwZTluXHUwMGU5clx1MDBlOWVzIGV0IHN1cHByaW1cdTAwZTllcy5cblwNCi1cblwNCi1DZXR0ZSBhY3Rpb24gbmUgcGV1dCBwYXMgXHUwMGVhdHJlIGFubnVsXHUwMGU5ZS4gVm91bGV6LXZvdXMgY29udGludWVyIGV0IGVmZmVjdHVlciBjZXR0ZSBtb2RpZmljYXRpb24gPw0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jb25maXJtUmVuYW1lPVZvdXMgXHUwMGVhdGVzIHN1ciBsZSBwb2ludCBkZSBjaGFuZ2VyIGxlIG5vbSBkZSBjZSBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZSwgZGUgJyd7MH0nJyBhdSBwcm9maXQgZHUgbm91dmVhdSBub20gJyd7MX0nJy4gQ2V0dGUgYWN0aW9uIGVucmVnaXN0cmVyYSBjZXQgXHUwMGU5ZGl0ZXVyIGV0IHJlbm9tbWVyYSBsZSBkb3NzaWVyIGR1IHBsdWctaW4uIFZvdWxlei12b3VzIGNvbnRpbnVlciA/DQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWVfdGl0bGU9UmVub21tZXIgbGUgcGx1Zy1pbiBkZSBtXHUwMGU5dGhvZGUNCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY2Fubm90UmVuYW1lUGx1Z2luRm9sZGVyPUltcG9zc2libGUgZGUgcmVub21tZXIgbGUgZG9zc2llciBkdSBwbHVnLWluDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5MYWJlbD1WZXJyb3VpbGxlciBsZSBwbHVnLWluDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5fbWVzc2FnZT1TaSB2b3VzIHZlcnJvdWlsbGV6IGxhIG1vZGlmaWNhdGlvbiBkdSBwbHVnLWluLCBsZXMgXHUwMGU5ZGl0ZXVycyBvdXZlcnRzIGRlcyBcdTAwZTlsXHUwMGU5bWVudHMgYXBwYXJ0ZW5hbnQgYXUgcGx1Zy1pbiAnJ3swfScnIHNlcm9udCBlbnJlZ2lzdHJcdTAwZTlzIGV0IGZlcm1cdTAwZTlzLiBWb3VsZXotdm91cyBjb250aW51ZXIgZXQgZWZmZWN0dWVyIGNldHRlIG1vZGlmaWNhdGlvbiA/DQotDQotIyBQcm9jZXNzIERlc2NyaXB0aW9uDQotcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fdGl0bGU9UmVub21tZXINCi1wcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV9tZXNzYWdlPVZvdXMgXHUwMGVhdGVzIHN1ciBsZSBwb2ludCBkZSBjaGFuZ2VyIGxlIG5vbSBkZSBjZSBwcm9jZXNzdXMuIENldHRlIG9wXHUwMGU5cmF0aW9uIGVucmVnaXN0cmVyYSBjZXQgXHUwMGU5ZGl0ZXVyIGV0IHZhIHJlbm9tbWVyIGxlIGRvc3NpZXIgZHUgcHJvY2Vzc3VzLiBWb3VsZXotdm91cyBjb250aW51ZXIgPw0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uRGVzY3JpcHRpb249RGVzY3JpcHRpb24gOg0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uU2VjdGlvblRpdGxlPUNvbmZpZ3VyYXRpb24NCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25NZXNzYWdlPUluZGlxdWV6IHRvdXRlcyBsZXMgY29uZmlndXJhdGlvbnMgdmFsaWRlcyBwb3VyIGNlIHByb2Nlc3N1cy4gU1x1MDBlOWxlY3Rpb25uZXogdW5lIGNvbmZpZ3VyYXRpb24gZW4gdGFudCBxdWUgY29uZmlndXJhdGlvbiBwYXIgZFx1MDBlOWZhdXQuIElsIGRvaXQgcydhZ2lyIGQndW5lIHZlcnNpb24gXHUwMGU5bGFib3JcdTAwZTllIGRlIHRvdXRlcyBsZXMgYXV0cmVzIGNvbmZpZ3VyYXRpb25zLg0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9ucz1Db25maWd1cmF0aW9ucyA6DQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2RlZmF1bHQ9KHBhciBkXHUwMGU5ZmF1dCkNCi1Qcm9jZXNzRGVzY3JpcHRpb25fc2VsZWN0Q29uZmlndXJhdGlvbj1TXHUwMGU5bGVjdGlvbm5leiBsZXMgY29uZmlndXJhdGlvbnMgXHUwMGUwIGFqb3V0ZXINCi1Qcm9jZXNzRGVsZXRlQWN0aW9uX2RlbGV0ZWNvZmlybV90ZXh0MD1DZXR0ZSBvcFx1MDBlOXJhdGlvbiBlbnJlZ2lzdHJlcmEgbCcnXHUwMGU5ZGl0ZXVyIGVuIGNvdXJzIGV0IGxhIG1vZGlmaWNhdGlvbiBzZXJhIGRcdTAwZTlmaW5pdGl2ZS4gRXRlcy12b3VzIHNcdTAwZmJyIGRlIHZvdWxvaXIgc3VwcHJpbWVyICcnezB9JycgPw0KLVByb2Nlc3NEZWxldGVBY3Rpb25fc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZT1MZXMgZGVzY3JpcHRldXJzIHN1aXZhbnRzIG5lIHNvbnQgcGx1cyB1dGlsaXNcdTAwZTlzIG51bGxlIHBhcnQgdW5lIGZvaXMgcXVlIGxlcyBcdTAwZTlsXHUwMGU5bWVudHMgc1x1MDBlOWxlY3Rpb25uXHUwMGU5cyBzb250IHN1cHByaW1cdTAwZTlzLlxuXA0KLVNcdTAwZTlsZWN0aW9ubmV6IGxlcyBkZXNjcmlwdGV1cnMgcXVlIHZvdXMgc291aGFpdGV6IHN1cHByaW1lci4NCi0NCi0jIFZpZXcgSGVscGVyDQotdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX3RpdGxlPVZcdTAwZTlyaWZpZXIgbGEgc2FudFx1MDBlOSBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZQ0KLXZpZXdIZWxwZXJfcGVyZm9ybUhlYWx0aENoZWNrPVZcdTAwZTlyaWZpY2F0aW9uIGRlIGxhIHNhbnRcdTAwZTkgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUuLi4NCi12aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfbWVzc2FnZT1MYSB2XHUwMGU5cmlmaWNhdGlvbiBkZSBsYSBzYW50XHUwMGU5IGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIG91dmVydGUgcydlc3QgY29ycmVjdGVtZW50IHRlcm1pblx1MDBlOWUuIENvbnN1bHRleiBsZSByYXBwb3J0IGRhbnMgbGUgZmljaGllciBqb3VybmFsLg0KLQ0KLSMgQXR0YWNoIFRlbXBsYXRlIEZpbGUgRGlhbG9nDQotYXR0YWNoVGVtcGxhdGVGaWxlRGlhbG9nX3RpdGxlPUpvaW5kcmUgdW4gZmljaGllciBkZSBjYW5ldmFzDQotDQotIyBDcmVhdGUgRWxlbWVudCBFcnJvciBEaWFsb2cNCi1jcmVhdGVFbGVtZW50RGlhbG9nX3RpdGxlPUNyXHUwMGU5ZXIgdW5lIG5vdXZlbGxlIHswfQ0KLWNyZWF0ZU5ld0VsZW1lbnRFcnJvcl9tc2c9RXJyZXVyIGRlIGNyXHUwMGU5YXRpb24gZCcndW5lIG5vdXZlbGxlIHswfS4NCi0NCi1kbGdUaXRsZV9yZWxvYWRMaWJyYXJ5PVJlY2hhcmdlciBsYSBiaWJsaW90aFx1MDBlOHF1ZQ0KLWNyZWF0ZUVsZW1lbnRFcnJvcl9yZWFzb249TGUgbm9tIGRlIGxhIHswfSBuZSBwZXV0IHBhcyBcdTAwZWF0cmUgdmlkZS5cblwNCi1cblwNCi1TcFx1MDBlOWNpZmlleiB1biBub20gdmFsaWRlIGV0IHJcdTAwZTllc3NheWV6Lg0KLWRlbGV0ZUNvbmZpZ0Vycm9yX3JlYXNvbj1MYSBjb25maWd1cmF0aW9uIGVzdCByXHUwMGU5Zlx1MDBlOXJlbmNcdTAwZTllIHBhciBsZSBwcm9jZXNzdXMgJyd7MH0nJw0KLQ0KLSMgQ2hhbmdlQm91bmRzQ29tbWFuZA0KLWdlZl9jaGFuZ2VCb3VuZHNDb21tYW5kX2xhYmVsPUNoYW5nZXIgbGVzIGJvcm5lcw0KLSMgQ2hhbmdlTmFtZUNvbW1hbmQNCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfbGFiZWw9Q2hhbmdlciBsZSBub20NCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfdW5kb01lc3NhZ2U9SW1wb3NzaWJsZSBkJ2FubnVsZXIgbGUgY2hhbmdlbWVudCBkZSBub20uXG5cDQotXG5cDQotTCdhbm51bGF0aW9uIGR1IGNoYW5nZW1lbnQgZGUgbm9tIG4nZXN0IHBhcyBwZXJtaXNlIHNpIGxlIG5vbSBwclx1MDBlOWNcdTAwZTlkZW50IGVzdCBOVUxMLg0KLSMgQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQNCi1nZWZfY2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmRfbGFiZWw9Q2hhbmdlciB1bmUgdmFsZXVyIGRlIHByb3ByaVx1MDBlOXRcdTAwZTkNCi0jIENyZWF0ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfY3JlYXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1Dclx1MDBlOWVyIHVuIHBvaW50IGQnaW5mbFx1MDBlOWNoaXNzZW1lbnQNCi0jIENyZWF0ZUxpbmtDb21tYW5kDQotZ2VmX2NyZWF0ZUxpbmtDb21tYW5kX2xhYmVsPUNyXHUwMGU5YXRpb24gZCd1biBsaWVuDQotIyBDcmVhdGVOb2RlQ29tbWFuZA0KLWdlZl9jcmVhdGVOb2RlQ29tbWFuZF9sYWJlbD1Dclx1MDBlOWVyIHVuIG5vdXZlYXUgbm9ldWQNCi0jIERlbGV0ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfZGVsZXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1TdXBwcmltZXIgdW4gcG9pbnQgZCdpbmZsXHUwMGU5Y2hpc3NlbWVudA0KLSMgRGVsZXRlQ29tbWFuZA0KLWdlZl9kZWxldGVDb21tYW5kX2xhYmVsPVN1cHByaW1lcg0KLSMgRGVsZXRlTGlua0NvbW1hbmQNCi1nZWZfZGVsZXRlTGlua0NvbW1hbmRfbGFiZWw9U3VwcHJpbWVyIHVuZSBjb25uZXhpb24NCi0jIE1vdmVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX21vdmVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPURcdTAwZTlwbGFjZXIgdW4gcG9pbnQgZCdpbmZsXHUwMGU5Y2hpc3NlbWVudA0KLSMgUmVjb25uZWN0TGlua0NvbW1hbmQNCi1nZWZfcmVjb25uZWN0TGlua0NvbW1hbmRfbGFiZWw9Ulx1MDBlOXRhYmxpciB1biBsaWVuDQotDQotIyBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXINCi1nZWZfdmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdD1MZSBub20gbmUgcGV1dCBwYXMgXHUwMGVhdHJlIHZpZGUuIFZldWlsbGV6IGluZGlxdWVyIHVuIG5vbSB2YWxpZGUuDQotIyBWYWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcg0KLWdlZl92YWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ9TGUgbm9tIG5lIHBldXQgcGFzIFx1MDBlYXRyZSB2aWRlLiBWZXVpbGxleiBpbmRpcXVlciB1biBub20gdmFsaWRlLg0KLSMgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQNCi1nZWZfd29ya1Byb2R1Y3ROb2RlRWRpdFBhcnRfdmFsaWRhdGVNZXNzYWdlPUxlIG5vbSBuZSBwZXV0IHBhcyBcdTAwZWF0cmUgdmlkZS4gVmV1aWxsZXogaW5kaXF1ZXIgdW4gbm9tIHZhbGlkZS4NCi0NCi0jIEVsZW1lbnRzVmlld0RlbGV0ZUFjdGlvbg0KLWFjdGlvbnNfRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uX21lc3NhZ2U9TGEgY29uZmlndXJhdGlvbiAnJ3swfScnIG5lIHBldXQgcGFzIFx1MDBlYXRyZSBzdXBwcmltXHUwMGU5ZSBjYXIgZWxsZSBlc3QgZW4gY291cnMgZCcndXRpbGlzYXRpb24gcGFyIGxlIHByb2Nlc3N1cyAnJ3sxfScnLg0KLQ0KLSMgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yDQotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JUaXRsZT1FcnJldXIgZGUgc3VwcHJlc3Npb24NCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvck1lc3NhZ2U9RXhjZXB0aW9uIG5vbiBnXHUwMGU5clx1MDBlOWUNCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclJlYXNvbj1BZmZpY2hlciBsZXMgZFx1MDBlOXRhaWxzDQotDQotIyBNZXRob2RFbGVtZW50RWRpdG9yDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclRpdGxlPUVycmV1ciBkZSBzYXV2ZWdhcmRlDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UxPUlVUEEwMDIwRSA6IEVycmV1ciBkZSBzYXV2ZWdhcmRlIGR1IGZpY2hpZXINCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTI9RXJyZXVyIGRlIHZhbGlkYXRpb24NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMT1BZmZpY2hlciBsZSBmaWNoaWVyIGpvdXJuYWwgcG91ciBwbHVzIGRlIGRcdTAwZTl0YWlscw0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24yPUFmZmljaGVyIGxlcyBkXHUwMGU5dGFpbHMNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JUaXRsZT1FcnJldXIgZGUgcmVub21tYWdlDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JNc2c9VW4gb3UgcGx1c2lldXJzIGZpY2hpZXJzIGRlIGNldCBcdTAwZTlkaXRldXIgb250IFx1MDBlOXRcdTAwZTkgc3VwcHJpbVx1MDBlOXMuIEwnXHUwMGU5ZGl0ZXVyIG4nZXN0IHBsdXMgdmFsaWRlIGV0IGRvaXQgc2UgZmVybWVyLg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9pbnZhbGlkRWRpdG9yVGl0bGU9RWRpdGV1ciBub24gdmFsaWRlDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yTWVzc2FnZTE9RXJyZXVyIGRlIHJlbm9tbWFnZSBkdShkZXMpIGZpY2hpZXIocykgJyd7MH0nJw0KLQ0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQ0KLXJlbmFtZUVycm9yX3RpdGxlPVJlbm9tbWVyIHVuIFx1MDBlOWxcdTAwZTltZW50DQotcmVuYW1lRXJyb3JfbXNnPUlVUEEwMDEzRSA6IEltcG9zc2libGUgZGUgdGVybWluZXIgbCdvcFx1MDBlOXJhdGlvbiBkZSByZW5vbW1hZ2UuDQotU2VsZWN0RWxlbWVudERpYWxvZ19zZWxlY3RlbGVtZW50X3RleHQ9U1x1MDBlOWxlY3Rpb25uZXogdW4gXHUwMGU5bFx1MDBlOW1lbnQNCi0NCi0jIEVkaXRvckNob29zZXINCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfdGl0bGU9T3V2cmlyIGwnXHUwMGU5ZGl0ZXVyIGRlIG1cdTAwZTl0aG9kZXMNCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0Rlc2NyaXB0aW9uTGFiZWw9RGVzY3JpcHRpb24gOg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9TZWxlY3RBbGxCdXR0b25MYWJlbD1TXHUwMGU5bGVjdGlvbm5lciB0b3V0DQotT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZV9lZGl0X3RleHQwPU1vZGlmaWVyIHVuIFx1MDBlOWxcdTAwZTltZW50DQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNFIDogSW1wb3NzaWJsZSBkJ291dnJpciBsJ1x1MDBlOWRpdGV1ciBhc3NvY2lcdTAwZTkgXHUwMGUwIGwnXHUwMGU5bFx1MDBlOW1lbnQgZGUgbVx1MDBlOXRob2RlIHNcdTAwZTlsZWN0aW9ublx1MDBlOS4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZT1TXHUwMGU5bGVjdGlvbm5lciB1biBmaWNoaWVyIGltYWdlDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeU5hbWU9Tm91dmVsbGUgYmlibGlvdGhcdTAwZThxdWUNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfRGVzY3JpcHRpb25MYWJlbD1EZXNjcmlwdGlvbiA6DQotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb249U1x1MDBlOWxlY3Rpb25uZXogdW5lIG91IHBsdXNpZXVycyBjb25maWd1cmF0aW9ucyBkZSBtXHUwMGU5dGhvZGUgZXQgY2xpcXVleiBzdXIgVGVybWluZXIgcG91ciBsZXMgb3V2cmlyLg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9EZXNlbGVjdEFsbEJ1dHRvbkxhYmVsPURcdTAwZTlzXHUwMGU5bGVjdGlvbm5lciB0b3V0DQotRWxlbWVudHNWaWV3X21pZ3JhdGlvbl9kaXJfZGxnX2Rlc2NyaXB0aW9uX3RleHQ9U3BcdTAwZTljaWZpZXogbGUgclx1MDBlOXBlcnRvaXJlIGRlcyB7MH0gclx1MDBlOWNlbW1lbnQgbWlnclx1MDBlOXMgcG91ciByZW1wbGFjZXIgbGVzIHswfSBzXHUwMGU5bGVjdGlvbm5cdTAwZTlzDQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX3JlYXNvbj1VbmUgZXJyZXVyIHN5c3RcdTAwZThtZSBzJ2VzdCBwcm9kdWl0ZS4gQ2xpcXVleiBzdXIgRFx1MDBlOXRhaWxzIHBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucy5cblwNCi1cblwNCi1GZXJtZXogdW5lIHBhcnRpZSBkZXMgXHUwMGU5ZGl0ZXVycyBvdXZlcnRzIGV0IHJcdTAwZTllc3NheWV6Lg0KLQ0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGl0bGU9TCdpbWFnZSBlc3Qgbm9uIHZhbGlkZQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzFFIDogTGEgdGFpbGxlIGRlIGwnJ2ltYWdlICcnezB9Jycgc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZSBkXHUwMGU5cGFzc2UgbGEgdGFpbGxlIGF1dG9yaXNcdTAwZTllICh7MX0gcGFyIHsyfSkuIFNcdTAwZTlsZWN0aW9ubmV6IHVuZSBhdXRyZSBpbWFnZS4NCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGl0bGU9TCdpbWFnZSBlc3Qgbm9uIHZhbGlkZQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190ZW1wbGF0ZT1JVVBBMDAzMkUgOiBMZSBmaWNoaWVyICcnezB9Jycgc1x1MDBlOWxlY3Rpb25uXHUwMGU5IG4nJ2V4aXN0ZSBwYXMuIFNcdTAwZTlsZWN0aW9ubmV6IHVuZSBhdXRyZSBpbWFnZS4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9U1x1MDBlOWxlY3Rpb25uZXIuLi4NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5RGVzY3JpcHRpb249RGVzY3JpcHRpb24gZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcw0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZWZhdWx0QnJpZWZEZXNjcmlwdGlvbj1EZXNjcmlwdGlvbiBkZSBsYSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlRGVzY3JpcHRpb249VG91cyBsZXMgXHUwMGU5ZGl0ZXVycyBkb2l2ZW50IFx1MDBlYXRyZSBmZXJtXHUwMGU5cy4gU1x1MDBlOWxlY3Rpb25uZXogY2V1eCBxdWkgZG9pdmVudCBcdTAwZWF0cmUgZW5yZWdpc3RyXHUwMGU5cyBlbiBwcmVtaWVyLCBzaSBhcHBsaWNhYmxlLg0KLQ0KLSMgVGVtcGxhdGVEZXNjcmlwdGlvblBhZ2UNCi1mb3Jtc19UZW1wbGF0ZURlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnPUxlIGZpY2hpZXIgc1x1MDBlOWxlY3Rpb25uXHUwMGU5IGVzdCBkXHUwMGU5alx1MDBlMCB1bmUgcGlcdTAwZThjZSBqb2ludGUgZGUgY2UgY2FuZXZhcy4NCi0NCi0jIE5ldyBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLW5ld0xpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTRFIDogSW1wb3NzaWJsZSBkZSBjclx1MDBlOWVyIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMuDQotbmV3TGlicmFyeUVycm9yX3JlYXNvbjE9TGUgY2hlbWluIGRlIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgaW5kaXF1XHUwMGU5ICcnezB9JycgZXN0IG5vbiB2YWxpZGUuDQotbmV3TGlicmFyeUVycm9yX3JlYXNvbjI9VW5lIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZXhpc3RlIGRcdTAwZTlqXHUwMGUwIGRhbnMgJyd7MH0nJy4NCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMz1JbXBvc3NpYmxlIGRlIGNyXHUwMGU5ZXIgbGUgZG9zc2llciBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzICcnezB9JycgaW5kaXF1XHUwMGU5Lg0KLW5ld0xpYnJhcnlFcnJvcl9hZHZpY2U9Q2xpcXVleiBzdXIgT0sgcG91ciBzYWlzaXIgdW4gYXV0cmUgbm9tIG91IHVuIGF1dHJlIGNoZW1pbiBwb3VyIGNldHRlIGJpYmxpb3RoXHUwMGU4cXVlLg0KLQ0KLSNQcm9jZXNzIGxpdGVyYWxzDQotUHJvY2Vzc19FeHRlcm5hbElEPUlkZW50aWZpY2F0ZXVyIGV4dGVybmUgOg0KLVByb2Nlc3NfUHVycG9zZT1PYmpldCA6DQotUHJvY2Vzc19TY29wZT1Qb3J0XHUwMGU5ZSA6DQotUHJvY2Vzc19Vc2FnZU5vdGVzPU5vdGVzIGQndXRpbGlzYXRpb24gOg0KLVByb2Nlc3NfQWx0ZXJuYXRpdmVzPUFsdGVybmF0aXZlcyA6DQotUHJvY2Vzc19Ib3dUb1N0YWZmPURvdGF0aW9uIGVuIHBlcnNvbm5lbCA6DQotUHJvY2Vzc19LZXlDb25zaWRlcmF0aW9uPUNvbnNpZFx1MDBlOXJhdGlvbnMgY2xcdTAwZTlzIDoNCi1Qcm9jZXNzX1NjYWxlPUVjaGVsbGUgOg0KLVByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljcz1DYXJhY3RcdTAwZTlyaXN0aXF1ZXMgZHUgcHJvamV0IDoNCi1Qcm9jZXNzX1Jpc2tMZXZlbD1OaXZlYXUgZGUgcmlzcXVlIDoNCi1Qcm9jZXNzX0VzdGltYXRpbmdUZWNobmlxdWU9VGVjaG5pcXVlcyBkJ2VzdGltYXRpb24gOg0KLVByb2Nlc3NfUHJvamVjdE1lbWJlckV4cGVydGlzZT1FeHBlcnRpc2UgZHUgbWVtYnJlIGRlIHByb2pldCA6DQotUHJvY2Vzc19UeXBlT2ZDb250cmFjdD1UeXBlIGRlIGNvbnRyYXQgOg0KLQ0KLSMgRWRpdG9yIFByZXZpZXcgTmF2aWdhdGlvbiBCdXR0b25zDQotYmFja0J1dHRvbl90ZXh0PVJldG91cg0KLWZvcndhcmRCdXR0b25fdGV4dD1TdWl2YW50DQotZm9yd2FyZF90ZXh0PVN1aXZhbnQNCi1zdG9wQnV0dG9uX3RleHQ9QXJyXHUwMGVhdA0KLXJlZnJlc2hCdXR0b25fdGV4dD1BY3R1YWxpc2VyDQotcmVmcmVzaF90ZXh0PUFjdHVhbGlzZXINCi1uZXduYW1lX3RleHQ9Tm91dmVhdSBub20gOg0KLXByaW50QnV0dG9uX3RleHQ9SW1wcmltZXINCi0NCi0jIENvbnRleHQgbWVudXMNCi1fVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW09JkFjdHVhbGlzZXINCi1fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbT0mQWZmaWNoZXIgbGVzIHByb3ByaVx1MDBlOXRcdTAwZTlzDQotDQotX1VJX01ldGhvZEVkaXRvcl9tZW51PSZFZGl0ZXVyIGRlIG1cdTAwZTl0aG9kZQ0KLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09Jk5vdXZlYXUNCi1fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW09TiZvdXZlYXUgZnJcdTAwZThyZS9zb2V1cg0KLQ0KLV9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsPVNcdTAwZTlsZWN0aW9uDQotX1VJX1BhcmVudFBhZ2VfbGFiZWw9UGFyZW50DQotX1VJX0xpc3RQYWdlX2xhYmVsPUxpc3RlDQotX1VJX1RyZWVQYWdlX2xhYmVsPUFyYnJlDQotX1VJX1RhYmxlUGFnZV9sYWJlbD1UYWJsZQ0KLV9VSV9UYWJsZVRyZWVQYWdlX2xhYmVsPVRhYmxlVHJlZQ0KLV9VSV9PYmplY3RDb2x1bW5fbGFiZWw9T2JqZXQNCi1fVUlfU2VsZkNvbHVtbl9sYWJlbD1BdXRvDQotDQotX1VJX05vT2JqZWN0U2VsZWN0ZWQ9QXVjdW5lIHNcdTAwZTlsZWN0aW9uDQotX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkPU9iamV0IHNcdTAwZTlsZWN0aW9ublx1MDBlOSA6IHswfQ0KLV9VSV9NdWx0aU9iamVjdFNlbGVjdGVkPU9iamV0cyB7MH0gc1x1MDBlOWxlY3Rpb25uXHUwMGU5cw0KLQ0KLV9VSV9PcGVuRWRpdG9yRXJyb3JfbGFiZWw9T3V2cmlyIGwnXHUwMGU5ZGl0ZXVyDQotDQotX1VJX1dpemFyZF9jYXRlZ29yeT1FeGVtcGxlcyBkJ2Fzc2lzdGFudHMgZGUgY3JcdTAwZTlhdGlvbiBkZSBtb2RcdTAwZThsZSBFTUYNCi0NCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfbGFiZWw9TW9kXHUwMGU4bGUgZGUgbVx1MDBlOXRob2RlDQotX1VJX01ldGhvZE1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uPUNyXHUwMGU5ZXogdW4gbm91dmVhdSBtb2RcdTAwZThsZSBkZSBtXHUwMGU5dGhvZGUNCi0NCi1fVUlfTWV0aG9kRWRpdG9yX2xhYmVsPUVkaXRldXIgZGUgbW9kXHUwMGU4bGUgZGUgbVx1MDBlOXRob2RlDQotDQotX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2U9TWENCi1fVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVFeHRlbnNpb249bVx1MDBlOXRob2RlDQotDQotX1VJX1dpemFyZF9sYWJlbD1Ob3V2ZWF1DQotDQotX1dBUk5fRmlsZW5hbWVFeHRlbnNpb249TGUgbm9tIGRlIGZpY2hpZXIgZG9pdCBzZSB0ZXJtaW5lciBwYXIgJycuezB9JycNCi0NCi1fVUlfTW9kZWxPYmplY3Q9T2JqZXQgZGUgbW9kXHUwMGU4bGUNCi1fVUlfWE1MRW5jb2Rpbmc9RW5jb2RhZ2UgWE1MDQotX1VJX1hNTEVuY29kaW5nQ2hvaWNlcz1VVEYtOCBBU0NJSSBVVEYtMTYgVVRGLTE2QkUgVVRGLTE2TEUgSVNPLTg4NTktMQ0KLV9VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb249U1x1MDBlOWxlY3Rpb25uZXogdW4gb2JqZXQgZGUgbW9kXHUwMGU4bGUgXHUwMGUwIGNyXHUwMGU5ZXINCi0NCi1fVUlfRmlsZUNvbmZsaWN0X2xhYmVsPUNvbmZsaXQgZGUgZmljaGllcnMNCi1fV0FSTl9GaWxlQ29uZmxpY3Q9Q2VydGFpbmVzIG1vZGlmaWNhdGlvbnMgbm9uIGVucmVnaXN0clx1MDBlOWVzIHNvbnQgZW4gY29uZmxpdCBhdmVjIGRlcyBtb2RpZmljYXRpb25zIGVmZmVjdHVcdTAwZTllcyBlbiBkZWhvcnMgZGUgbCdcdTAwZTlkaXRldXIuIFZvdWxlei12b3VzIFx1MDBlOWxpbWluZXIgbGVzIG1vZGlmaWNhdGlvbnMgZWZmZWN0dVx1MDBlOWVzIGRhbnMgY2V0IFx1MDBlOWRpdGV1ciA/DQotDQotIyBBZGQgTGluayBEaWFsb2cNCi1hZGRMaW5rRGlhbG9nX2xpbmtUeXBlPVR5cGUgOg0KLW9wZW5MaW5rQ2hlY2tib3hfdGV4dD1PdXZyZXogbGUgbGllbiBkYW5zIHVuZSBmZW5cdTAwZWF0cmUgZGUgbmF2aWdhdGV1ciBkaXN0aW5jdGUNCi0NCi0jIEFkZCBJbWFnZSBEaWFsb2cNCi1oZWlnaHRMYWJlbF90ZXh0PUhhdXRldXIgOg0KLXdpZHRoTGFiZWxfdGV4dD1MYXJnZXVyIDoNCi1FbGVtZW50c1ZpZXdfMjA9cGF0dGVybiBkZSBjYXBhY2l0XHUwMGU5DQotRWxlbWVudHNWaWV3XzIxPXByb2Nlc3N1cyBkZSBsaXZyYWlzb24NCi1FbGVtZW50c1ZpZXdfMjI9cHJvY2Vzc3VzDQotRWxlbWVudHNWaWV3XzM1PXswfSBlc3QgZW4gbGVjdHVyZSBzZXVsZW1lbnQuIEF2YW50IGRlIGNvbnRpbnVlciwgZmFpdGVzIGVuIHNvcnRlIHF1JydpbCBzb2l0IG1vZGlmaWFibGUuDQotRWxlbWVudHNWaWV3XzM2PUVycmV1ciBkZSBjaGFyZ2VtZW50IGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlDQotYWx0VGFnTGFiZWxfdGV4dD1CYWxpc2UgQUxUIDoNCi1pbWFnZVNpemVMYWJlbF90ZXh0PUxhIGhhdXRldXIgZXQgbGEgbGFyZ2V1ciBkZSBsJ2ltYWdlIGRvaXZlbnQgXHUwMGVhdHJlIGNvbXByaXNlcyBlbnRyZSAxMCBldCA2MDAuIExlcyBoYXV0ZXVycyBldCBsYXJnZXVycyBub24gdmFsaWRlcyBzZXJvbnQgY29udmVydGllcyBlbiB1bmUgdGFpbGxlIGFkYXB0XHUwMGU5ZS4NCi0NCi0jIFByb2Nlc3MgRWRpdG9yDQotUHJvY2Vzc0VkaXRvcj1FZGl0ZXVyIGRlIHByb2Nlc3N1cw0KLVByb2Nlc3NFZGl0b3JfTmFtZT1Ob20NCi1Qcm9jZXNzRWRpdG9yX1ByZXNlbnRhdGlvbk5hbWU9Tm9tIGRlIHByXHUwMGU5c2VudGF0aW9uDQotUHJvY2Vzc0VkaXRvcl9JbmRleD1JbmRleA0KLVByb2Nlc3NFZGl0b3JfUHJlZGVjZXNzb3JzPVByXHUwMGU5ZFx1MDBlOWNlc3NldXJzDQotI0NvbmZpZ3VyYXRpb25QYWdlX1NlbGVjdGVkPVNlbGVjdGVkOiANCi1DaGVja2xpc3RPcmRlcl9kZXNjcmlwdGlvbj1TXHUwMGU5bGVjdGlvbm5leiB1biBcdTAwZTlsXHUwMGU5bWVudCBkZSB2XHUwMGU5cmlmaWNhdGlvbiBldCBjbGlxdWV6IHN1ciBIYXV0IG91IEJhcyBwb3VyIGNoYW5nZXIgc2EgcG9zaXRpb24uDQotRWxlbWVudHNWaWV3X3JlbmFtaW5nX3RleHQ9UmVub21tYWdlLi4uDQotUHJvY2Vzc0VkaXRvcl9Nb2RlbEluZm89SW5mb3JtYXRpb25zIHJlbGF0aXZlcyBhdSBtb2RcdTAwZThsZQ0KLVByb2Nlc3NFZGl0b3JfUHJlZml4PVByXHUwMGU5Zml4ZQ0KLU1vdmVEaWFsb2dfbW92ZV90ZXh0PURcdTAwZTlwbGFjZXINCi1DaGVja2xpc3RPcmRlcl90aXRsZT1DbGFzc2VyIGxlcyBcdTAwZTlsXHUwMGU5bWVudHMgZGUgdlx1MDBlOXJpZmljYXRpb24NCi1Qcm9jZXNzRWRpdG9yX1JlcGV0YWJsZT1SXHUwMGU5aXRcdTAwZTlyYWJsZQ0KLVByb2Nlc3NFZGl0b3JfT25nb2luZz1FbiBjb3Vycw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N5bmNocm9uaXphdGlvbj1TeW5jaHJvbmlzYXRpb24uLi4NCi1Qcm9jZXNzRWRpdG9yX0V2ZW50RHJpdmVuPUNvbW1hbmRcdTAwZTkgcGFyIGxlcyBcdTAwZTl2XHUwMGU5bmVtZW50cw0KLVByb2Nlc3NFZGl0b3JfRGVsaXZlcmFibGU9TGl2cmFibGUNCi1Qcm9jZXNzRWRpdG9yX09wdGlvbmFsPUZhY3VsdGF0aWYNCi1GaWx0ZXJEaWFsb2dfVHlwZV90ZXh0PVR5cGUgZCdcdTAwZTlsXHUwMGU5bWVudCBkZSBtXHUwMGU5dGhvZGUgOg0KLUZpbHRlckRpYWxvZ19FeHBhbmRBbGw9VG91dCBkXHUwMGU5dmVsb3BwZXINCi1Nb3ZlRGlhbG9nX21vdmluZ190ZXh0PURcdTAwZTlwbGFjZW1lbnQuLi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWRTaGFwZUljb25XYXJuaW5nPUlVUEEwMDI1VyA6IEwnJ2ljXHUwMGY0bmUgRm9ybWUgcG91ciB7MH0gZXN0IGludHJvdXZhYmxlIGRhbnMgbGUgY2hlbWluIDogezF9DQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkU2hhcGVJY29uRXJyb3I9SVVQQTAwMjVFIDogRXJyZXVyIDogU2VjdGlvbiBkZSBsJydpY1x1MDBmNG5lIEZvcm1lIDogezB9DQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9OYW1lTGFiZWw9Tm9tIDoNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZVRpdGxlPUNyXHUwMGU5ZXIgdW5lIG5vdXZlbGxlIGNvbmZpZ3VyYXRpb24gZGUgbVx1MDBlOXRob2RlDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX05hbWVMYWJlbD1Ob20gOg0KLUF1dGhvcmluZ1VJUGx1Z2luX25ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGU9Tm91dmVsbGUgY29uZmlndXJhdGlvbiBkZSBtXHUwMGU5dGhvZGUNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdMaWJyYXJ5TWFpblBhZ2VfcGFnZVRpdGxlPUNyXHUwMGU5ZXIgdW5lIG5vdXZlbGxlIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMNCi1uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlPU5vdXZlbGxlIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMNCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZVRpdGxlPUVucmVnaXN0cmVyIGxlcyBtb2RpZmljYXRpb25zDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1TcFx1MDBlOWNpZmlleiB1biBub20sIHVuZSBkZXNjcmlwdGlvbiBldCB1biByXHUwMGU5cGVydG9pcmUgZGUgZGVzdGluYXRpb24gcG91ciBsYSBub3V2ZWxsZSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzLg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlRGVzY3JpcHRpb249VW4gb3UgcGx1c2lldXJzIFx1MDBlOWxcdTAwZTltZW50cyBkZSBtXHUwMGU5dGhvZGUgb250IFx1MDBlOXRcdTAwZTkgbW9kaWZpXHUwMGU5cy4gU1x1MDBlOWxlY3Rpb25uZXogY2V1eCBxdWkgZG9pdmVudCBcdTAwZWF0cmUgZW5yZWdpc3RyXHUwMGU5cy4NCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1PdXZyaXIgZGVzIGNvbmZpZ3VyYXRpb25zIGRlIG1cdTAwZTl0aG9kZQ0KLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uV2l6YXJkX3dpbmRvd1RpdGxlPU91dnJpciBkZXMgY29uZmlndXJhdGlvbnMgZGUgbVx1MDBlOXRob2RlDQotRWxlbWVudHNWaWV3X3JlcGxhY2Vpbmd3aXRoZm9ybWF0X3RleHQ9UmVtcGxhY2VtZW50IGRlIHswfS4uLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uV2FybmluZz1JVVBBMDAyNlcgOiBMJydpY1x1MDBmNG5lIGRlIG5vZXVkIGRlIHswfSBlc3QgaW50cm91dmFibGUgZGFucyBsZSBjaGVtaW4gOiB7MX0NCi1NZXNzYWdlTGFiZWxQcm92aWRlcl91bnNlbGVjdGVkcGFja2FnZXM9Jyd7MH0nJyBjb250aWVudCBkZXMgXHUwMGU5bFx1MDBlOW1lbnRzIHF1aSByXHUwMGU5Zlx1MDBlOXJlbmNlbnQgZGVzIFx1MDBlOWxcdTAwZTltZW50cyBkYW5zIGRlcyBwYWNrYWdlcyBub24gc1x1MDBlOWxlY3Rpb25uXHUwMGU5cw0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uRXJyb3I9SVVQQTAwMjZFIDogRXJyZXVyIDogU2VjdGlvbiBkZSBsJydpY1x1MDBmNG5lIGRlIG5vZXVkIDogezB9DQotU3RlcHNPcmRlckRpYWxvZ19zdGVwcz1FdGFwZXMgOiANCi1TdGVwc09yZGVyRGlhbG9nX3RpdGxlPUNsYXNzZXIgbGVzIFx1MDBlOXRhcGVzIGRlIHRcdTAwZTJjaGUNCi1Qcm9jZXNzRWRpdG9yX1BsYW5uZWQ9UGxhbmlmaVx1MDBlOQ0KLXNwZWNpZnlkaXJlY3RvcnlfdGV4dD1TcFx1MDBlOWNpZmlleiB1biByXHUwMGU5cGVydG9pcmUgcG91ciBlbnJlZ2lzdHJlciBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIGRhbnMNCi1Qcm9jZXNzRWRpdG9yX011bHRpcGxlT2NjdXJyZW5jZXM9UGx1c2lldXJzIG9jY3VycmVuY2VzDQotUHJvY2Vzc0VkaXRvcl9FbnRyeVN0YXRlPUV0YXQgZCdlbnRyXHUwMGU5ZQ0KLVByb2Nlc3NFZGl0b3JfRXhpdFN0YXRlPUV0YXQgZGUgc29ydGllDQotc2VsZWN0Q29sdW1uc3RvQWRkX3RleHQ9U1x1MDBlOWxlY3Rpb25uZXogbGVzIGNvbG9ubmVzIFx1MDBlMCBham91dGVyDQotUHJvY2Vzc0VkaXRvcl9UeXBlPVR5cGUNCi1Qcm9jZXNzRWRpdG9yX1RlYW09RXF1aXBlDQotRmlsdGVyRGlhbG9nX3RpdGxlPVNcdTAwZTlsZWN0aW9ubmVyIGxhIGJvXHUwMGVldGUgZGUgZGlhbG9ndWUgOiANCi0NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGQ9QWpvdXRlciBcdTAwZTAgcGFydGlyIGR1IGNvbnRlbnUgZGUgbGEgJm1cdTAwZTl0aG9kZS4uLg0KLUZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbD1Ub3V0IGNvbmRlbnNlcg0KLU9wZW5DaGVhdHNoZWV0Vmlld190aXRsZT1PdXZyaXIgbGEgdnVlIEFpZGUtbVx1MDBlOW1vaXJlDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbFVwPUZhaXJlIGRcdTAwZTlmaWxlciB2ZXJzIGxlIGhhdXQNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Sb2xsRG93bj1GYWlyZSBkXHUwMGU5ZmlsZXIgdmVycyBsZSBiYXMNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXA9RFx1MDBlOXBsJmFjZXIgdmVycyBsZSBoYXV0DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZURvd249RFx1MDBlOXBsYWNlciB2ZXJzIGxlIGJhJnMNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWw9RFx1MDBlOWMmb3V2cmlyDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29weT0mQ29weS4uLg0KLUZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQ9UGF0dGVybnMgZGUgbm9tcyAobGVzIG5vbXMgY29ycmVzcG9uZGFudHMgc2Vyb250IGFmZmljaFx1MDBlOXMpIDogDQotTWV0aG9kTGlicmFyeUVkaXRvcl90aXRsZT1CaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIDogDQotI01lc3NhZ2VWaWV3X3NlbGVjdGVkX3RleHQ9U2VsZWN0ZWQ6IA0KLU1lc3NhZ2VWaWV3X2Vycm1zZ190ZXh0PURlc2NyaXB0aW9uDQotRWxlbWVudHNWaWV3X2Vycl9zYXZpbmc9SVVQQTAwMjdFIDogRXJyZXVyIGRlIHNhdXZlZ2FyZGUgZGUgJyd7MH0nJ3sxfQ0KLQ0KLWVycl9jb3B5aW5nX2ZpbGVfdGl0bGU9RXJyZXVyIGRlIGNvcGllIGRlIGZpY2hpZXINCi1lcnJfY29weWluZ19maWxlX2Vycm9yPUlVUEEwMDI4RSA6IEltcG9zc2libGUgZCdhZmZlY3RlciBsJ2ljXHUwMGY0bmUuIA0KLWVycl9jb3B5aW5nX2ZpbGVfcmVhc29uPVVuZSBlcnJldXIgcydlc3QgcHJvZHVpdGUgbG9ycyBkZSBsYSBjb3BpZSBkdSBmaWNoaWVyIHNcdTAwZTlsZWN0aW9ublx1MDBlOS4gQ2xpcXVleiBzdXIgRFx1MDBlOXRhaWxzIHBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucy4NCi1lcnJfcHJvY2Vzc2luZ19maWxlX3RpdGxlPUVycmV1ciBkZSB0cmFpdGVtZW50IGRlIGZpY2hpZXINCi1lZGl0Q29uZmlndXJhdGlvbl90b29sdGlwPU1vZGlmaWVyIGxhIGNvbmZpZ3VyYXRpb24NCi1lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQ9SVVQQTAwMTVFIDogSW1wb3NzaWJsZSBkZSBtb2RpZmllciBsJ1x1MDBlOWxcdTAwZTltZW50DQotU2F2ZVRoaXNBY3Rpb25fc2F2ZW9iamVjdD1TYXV2ZWdhcmRlciBjZXQgb2JqZXQuLi4NCi1FbGVtZW50c1ZpZXdfcmVwbGFjZV90ZXh0PVJlbXBsYWNlcg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0V4dGVuZD0mRXRlbmRyZS4uLg0KLU1vdmVEaWFsb2dfZGVzdGluYXRpb25fdGV4dD1DaG9pc2lzc2V6IGxhIGRlc3RpbmF0aW9uIGR1KGRlcykgXHUwMGU5bFx1MDBlOW1lbnQocykgc1x1MDBlOWxlY3Rpb25uXHUwMGU5KHMpIDoNCi1jaG9vc2VEZWZhdWx0RGlyZWN0b3J5X3RleHQ9Q2hvaXNpc3NleiB1biByXHUwMGU5cGVydG9pcmUgcGFyIGRcdTAwZTlmYXV0IHBvdXIgbGVzIGJpYmxpb3RoXHUwMGU4cXVlcyA6DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3M9JlN1cHByaW1lcg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzMj0mT3B0aW9ucyBkZSBwdWJsaWNhdGlvbi4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0Fzc2lnblVzZXJEaWFncmFtPSZEaWFncmFtbWVzIHBlcnNvbm5hbGlzXHUwMGU5cy4uLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ190aXRsZT1BZmZlY3RlciBkZXMgZGlhZ3JhbW1lcyBwZXJzb25uYWxpc1x1MDBlOXMNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYWRJbWFnZT1EaWFncmFtbWUgZCdhY3Rpdml0XHUwMGU5IDoNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYWRkSW1hZ2U9RGlhZ3JhbW1lIGRcdTAwZTl0YWlsbFx1MDBlOSBkJ2FjdGl2aXRcdTAwZTkgOg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ193cGRJbWFnZT1EaWFncmFtbWUgZGUgZFx1MDBlOXBlbmRhbmNlIGRlIHByb2R1aXQgOg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19ub3RhRmlsZT1JVVBBMDAwNEUgOiBMZSBjaGVtaW4gaW5kaXF1XHUwMGU5IG4nZXN0IHBhcyB1biBmaWNoaWVyLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hc3NpZ25CdXR0b249U1x1MDBlOWxlY3Rpb25uZXIuLi4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfZW50ZXJlZEltYWdlTm90Rm91bmQ9SVVQQTAwMjRFIDogTCdpbWFnZSBzcFx1MDBlOWNpZmlcdTAwZTllIG4nZXhpc3RlIHBhcyBkYW5zIGxhIGJpYmxpb3RoXHUwMGU4cXVlLiBBc3N1cmV6LXZvdXMgZCdhdm9pciBiaWVuIHNhaXNpIGxlIGNoZW1pbiBwYXIgcmFwcG9ydCBhdSByXHUwMGU5cGVydG9pcmUgcmFjaW5lIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19zZWxlY3RlZEltYWdlTm90Rm91bmQ9SVVQQTAwMzBFIDogTCdpbWFnZSBxdWUgdm91cyBhdmV6IHNcdTAwZTlsZWN0aW9ublx1MDBlOWUgbidleGlzdGUgcGFzIGRhbnMgbGEgYmlibGlvdGhcdTAwZThxdWUuDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZUFESW1hZ2U9VXRpbGlzZXIgbCdpbWFnZSBkdSBkaWFncmFtbWUgZCdhY3Rpdml0XHUwMGU5IHBvdXIgbCdleHBsb3JhdGlvbiBldCBsYSBwdWJsaWNhdGlvbg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBRERJbWFnZT1VdGlsaXNlciBsJ2ltYWdlIGR1IGRpYWdyYW1tZSBkXHUwMGU5dGFpbGxcdTAwZTkgZCdhY3Rpdml0XHUwMGU5IHBvdXIgbCdleHBsb3JhdGlvbiBldCBsYSBwdWJsaWNhdGlvbg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VXUERJbWFnZT1VdGlsaXNlciBsJ2ltYWdlIGR1IGRpYWdyYW1tZSBkZSBkXHUwMGU5cGVuZGFuY2UgZGUgcHJvZHVpdCBwb3VyIGwnZXhwbG9yYXRpb24gZXQgbGEgcHVibGljYXRpb24NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Db250cmlidXRlPUNvbnRyaWJ1dGlvbiBsb2NhbGUNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXBsYWNlPVJlbXBsYWNlbWVudCBsb2NhbA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0RpYWdyYW1zPURpYSZncmFtbWVzDQotUHJvY2Vzc0VkaXRvcl9hY3Rpb25fZGVlcENvcHk9JkNvcGllIHByb2ZvbmRlLi4uDQotRmlsdGVyRGlhbG9nX0JyaWVmRGVzY3JpcHRpb249RGVzY3JpcHRpZiBjb3VydCA6DQotQ29uZmlndXJhdGlvblBhZ2VfaGlkZVRvb2xUaXA9QWZmaWNoZXIvTWFzcXVlciBsZXMgXHUwMGU5bFx1MDBlOW1lbnRzIG5vbiB2XHUwMGU5cmlmaVx1MDBlOXMNCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbj1EZXNjcmlwdGlvbiA6DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3NBbGw9UmllbiBwdWJsaWVyDQotRmlsdGVyRGlhbG9nX1BhdHRlcm5fZGVzY3JpcHRpb249TGVzIHBhdHRlcm5zIHNvbnQgc1x1MDBlOXBhclx1MDBlOXMgcGFyIHVuZSB2aXJndWxlLCBvXHUwMGY5ICogPSBuJ2ltcG9ydGUgcXVlbGxlIGNoYVx1MDBlZW5lLCA/ID0gbidpbXBvcnRlIHF1ZWwgY2FyYWN0XHUwMGU4cmUNCi1Db25maWd1cmF0aW9uUGFnZV9UcmVlVGl0bGVMYWJlbD1Db250ZW51IDoNCi1Db25maWd1cmF0aW9uUGFnZV9Mb2FkaW5nTWVzc2FnZT1DaGFyZ2VtZW50IGRlIGxhIGNvbmZpZ3VyYXRpb24sIHZldWlsbGV6IHBhdGllbnRlci4uLg0KLU1vdmVEaWFsb2dfdmFsaWRkZXN0aW5hdGlvbl90ZXh0PUxhIGRlc3RpbmF0aW9uIGRlIGRcdTAwZTlwbGFjZW1lbnQgaW5kaXF1XHUwMGU5ZSBlc3Qgbm9uIHZhbGlkZS4NCi1Nb3ZlRGlhbG9nX2Nhbm5vdE1vZGlmeURlc3RpbmF0aW9uPUlVUEEwMDM0RSA6IExhIGRlc3RpbmF0aW9uIHNcdTAwZTlsZWN0aW9ublx1MDBlOWUgbmUgcGV1dCBwYXMgXHUwMGVhdHJlIG1vZGlmaVx1MDBlOWUuDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsQWxsPVB1YmxpZXIgdG91dA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5CYXNlQWN0aXZpdHk9T3V2cmlyIHVuZSBhY3Rpdml0XHUwMGU5IGRlIGJhc2UNCi1Qcm9jZXNzRm9ybUVkaXRvcl9leHBhbkFsbEFjdGlvbkxhYmVsPUUmdGVuZHJlIHRvdXQNCi1Qcm9jZXNzRm9ybUVkaXRvcl9jb2xsYXBzZUFsbEFjdGlvbkxhYmVsPVJcdTAwZTkmZHVpcmUgdG91dA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURpYWdyYW09T3V2cmlyIHVuIGRpYWdyYW1tZSBkJyZhY3Rpdml0XHUwMGU5DQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVJldmVhbD1MZXMgZGVzY3JpcHRldXJzIG5vbiBzdXBwcmltXHUwMGU5cyByXHUwMGU5cGVydG9yaVx1MDBlOXMgZGFucyBsYSBsaXN0ZSBEXHUwMGU5dGFpbHMgZG9pdmVudCBcdTAwZWF0cmUgc3VwcHJpbVx1MDBlOXMgYWZpbiBkJ1x1MDBlOXZpdGVyIGxlcyBkb3VibG9ucyBhcHJcdTAwZThzIGF2b2lyIHJcdTAwZTl2XHUwMGU5bFx1MDBlOSBsZXMgXHUwMGU5bFx1MDBlOW1lbnRzIHNcdTAwZTlsZWN0aW9ublx1MDBlOXMuIENsaXF1ZXogc3VyIE9LIHNpIHZvdXMgc291aGFpdGV6IGxlcyBzdXBwcmltZXIgZXQgY29udGludWVyLg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9TZWxlY3RDb2x1bW5zPVNcdTAwZTlsZWN0aW9ubmV6IGxlcyBjb2xvbm5lcyBcdTAwZTAgYWpvdXRlcg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURldGFpbERpYWdyYW09T3V2cmlyIHVuIGRpYWdyYW1tZSAmZFx1MDBlOXRhaWxsXHUwMGU5IGQnYWN0aXZpdFx1MDBlOQ0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9Db2x1bW5TZWxlY3Rpb249U1x1MDBlOWxlY3Rpb24gZGUgY29sb25uZXMgOg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zd2l0Y2hDb25maWd1cmF0aW9uPUJhc2N1bGVyIHZlcnMgbGEgY29uZmlndXJhdGlvbiBwYXIgZFx1MDBlOWZhdXQgZHUgcHJvY2Vzc3VzIGxvcnMgZGUgbCdhY3RpdmF0aW9uIGQndW4gXHUwMGU5ZGl0ZXVyIGRlIHByb2Nlc3N1cw0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zdXBwcmVzc2lvbkdyb3VwVGl0bGU9U3VwcHJlc3Npb24NCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfaW5oZXJpdFN1cHByZXNzaW9uU3RhdGU9SFx1MDBlOXJpdGVyIGRlcyBcdTAwZTl0YXRzIGRlIHN1cHByZXNzaW9uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW09T3V2cmlyIHVuIGRpYWdyYW1tZSBkZSBkXHUwMGU5cGVuZGFuY2UgZGUgJnByb2R1aXQNCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1FZmZhY2VyDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9U1x1MDBlOWxlY3Rpb25uZXIuLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9JbnNlcnROZXdQaGFzZT1JbnNcdTAwZTlyZXIgdW5lIG5vdXZlbGxlIHBoYXNlDQotVmlld0hlbHBlcl9yZWxvYWRMaWJPblJvbGxiYWNrRXJyb3I9SW1wb3NzaWJsZSBkZSByXHUwMGU5Y3VwXHUwMGU5cmVyIHVuZSBlcnJldXIgZGUgcGVyc2lzdGFuY2UuIExhIGJpYmxpb3RoXHUwMGU4cXVlIGRvaXQgXHUwMGVhdHJlIHJlY2hhcmdcdTAwZTllIHBvdXIgcXVlIHNvbiBcdTAwZTl0YXQgaW5pdGlhbCBzb2l0IHJlc3RhdXJcdTAwZTkuDQotVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZF90ZXh0PUwnJ1x1MDBlOWxcdTAwZTltZW50ICcnezB9JycgYSBkXHUwMGU5alx1MDBlMCBcdTAwZTl0XHUwMGU5IHN1cHByaW1cdTAwZTkuDQotVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZGNvbmZpcm1fdGV4dD1MJydcdTAwZTlsXHUwMGU5bWVudCAnJ3swfScnIGEgZFx1MDBlOWpcdTAwZTAgXHUwMGU5dFx1MDBlOSBzdXBwcmltXHUwMGU5LiBTb3VoYWl0ZXotdm91cyBsZSBzdXBwcmltZXIgZGUgJyd7MX0nJyA/DQotQ29uZmlndXJhdGlvblBhZ2VfQWRkTWlzc2luZ1Rvb2xUaXA9QWpvdXRlciBkZXMgclx1MDBlOWZcdTAwZTlyZW5jZXMgbWFucXVhbnRlcw0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uPURlc2NyaXB0aW9uDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uR2VuZXJhbEluZm89SW5mb3JtYXRpb25zIGdcdTAwZTluXHUwMGU5cmFsZXMgDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXBwbHlQYXR0ZXJuPUFwcGxpcXVlciB1biBwYSZ0dGVybg0KLU1vdmVEaWFsb2dfc2VsZWN0ZGVzdGluYXRpb25fdGV4dD1TXHUwMGU5bGVjdGlvbm5leiB1bmUgZGVzdGluYXRpb24uDQotTW92ZURpYWxvZ19ub21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9QXVjdW5lIGNoZW1pc2UgZGUgZGVzdGluYXRpb24gZHUgZG9jdW1lbnQgXHUwMGUwIHRyYW5zZlx1MDBlOXJlciBuJ2EgXHUwMGU5dFx1MDBlOSBzcFx1MDBlOWNpZmlcdTAwZTllLg0KLU1ldGhvZExpYnJhcnlFZGl0b3JfdHJvdWJsZW9iamVjdD0uIE9iamV0IHByb2JsXHUwMGU5bWF0aXF1ZSA6IA0KLU1lc3NhZ2VMYWJlbFByb3ZpZGVyX2VycmNoaWxkcGtncz1VbiBwcm9jZXNzdXMgb3UgdW4gcGFja2FnZSBkZSBjb250ZW51IGVuZmFudCBjb250aWVudCBkZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGNvbnRlbmFudCBkZXMgclx1MDBlOWZcdTAwZTlyZW5jZXMgbWFucXVhbnRlcw0KLVByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfVGl0bGU9T3B0aW9ucyBkZSBwdWJsaWNhdGlvbiBkdSBkaWFncmFtbWUNCi1Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX01lc3NhZ2U9U1x1MDBlOWxlY3Rpb25uZXogbGUocykgZGlhZ3JhbW1lKHMpIFx1MDBlMCBwdWJsaWVyIG91IGRcdTAwZTlzXHUwMGU5bGVjdGlvbm5lei1sZXMgcG91ciBuZSBwYXMgbGVzIHB1YmxpZXINCi1Qcm9jZXNzRWRpdG9yX1RpdGxlPUVkaXRldXIgZGUgcHJvY2Vzc3VzIDogDQotU2F2ZUFzd2l0aGRvdHNfdGV4dD1FbnJlZ2lzdHJlciBzb3VzLi4uDQotUHJvY2Vzc0VkaXRvcl9Xb3JrQnJlYWtkb3duU3RydWN0dXJlPVN0cnVjdHVyZSBkZSByXHUwMGU5cGFydGl0aW9uIGR1IHRyYXZhaWwNCi1Qcm9jZXNzRWRpdG9yX1RlYW1BbGxvY2F0aW9uPUFmZmVjdGF0aW9uIGRlIGwnXHUwMGU5cXVpcGUNCi1Qcm9jZXNzRWRpdG9yX1dvcmtQcm9kdWN0VXNhZ2U9VXRpbGlzYXRpb24gZHUgcHJvZHVpdA0KLVByb2Nlc3NFZGl0b3JfQ29uc29saWRhdGVkVmlldz1WdWUgY29uc29saWRcdTAwZTllDQotUHJvY2Vzc0VkaXRvcl9jb25maXJtQXV0b1N5bmNoPUNldHRlIG9wXHUwMGU5cmF0aW9uIHJhZnJhXHUwMGVlY2hpdCBsZXMgZGVzY3JpcHRldXJzIHNcdTAwZTlsZWN0aW9ublx1MDBlOXMgb3UgdG91cyBsZXMgZGVzY3JpcHRldXJzIHNlIHRyb3V2YW50IHNvdXMgbGVzIGFjdGl2aXRcdTAwZTlzIHNcdTAwZTlsZWN0aW9ublx1MDBlOWVzIHF1aSBvbnQgcmVcdTAwZTd1IGxlIG1hcnF1YWdlICJTeW5jaHJvbmlzXHUwMGU5IGF2ZWMgbGEgc291cmNlIiBkYW5zIGwnb25nbGV0IEdcdTAwZTluXHUwMGU5cmFsaXRcdTAwZTlzIGRlIGxldXIgdnVlIFByb3ByaVx1MDBlOXRcdTAwZTlzLiAgRWxsZSBhY3R1YWxpc2UgY2VzIGRlc2NyaXB0ZXVycyBhdmVjIGxlcyBwcm9wcmlcdTAwZTl0XHUwMGU5cyBkJ29yaWdpbmUgZGVzIFx1MDBlOWxcdTAwZTltZW50cyBkZSBjb250ZW51IGRlIG1cdTAwZTl0aG9kZSBsaVx1MDBlOXMgZGUgbGEgY29uZmlndXJhdGlvbiBwYXIgZFx1MDBlOWZhdXQgZHUgcHJvY2Vzc3VzLiAgTm90ZXogcXVlIGNldHRlIG9wXHUwMGU5cmF0aW9uIG5lIG1ldCBcdTAwZTAgam91ciBhdWN1biBkZXNjcmlwdGV1ciBsaVx1MDBlOSBkZSBmYVx1MDBlN29uIGR5bmFtaXF1ZSAoaXRhbGlxdWUgdmVydCkuICBWb3VsZXotdm91cyBjb250aW51ZXIgPw0KLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMT1Db25maWd1cmF0aW9uDQotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24yPVNcdTAwZTlsZWN0aW9uIGR1IHBsdWctaW4gZXQgZHUgcGFja2FnZQ0KLU5ld0xpYnJhcnlEaWFsb2dfbmV3bGlicmFyeV9hcz1Dclx1MDBlOWVyIGxhIG5vdXZlbGxlIGJpYmxpb3RoXHUwMGU4cXVlIHNvdXMNCi1OZXdQbHVnaW5EaWFsb2dfbmV3cGx1Z2luX3RleHQ9Tm91dmVhdSBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZQ0KLVNlbGVjdEVsZW1lbnREaWFsb2dfdGl0bGVfdGV4dD1TXHUwMGU5bGVjdGlvbm5leiBsJ1x1MDBlOWxcdTAwZTltZW50IG91IGwndW4gZGUgc2VzIGNvbGxhYm9yYXRldXJzIDoNCi1PcGVuQ29uZmlnRGlhbG9nbmV3Y29uZmlnX3RleHQ9Tm91dmVsbGUgY29uZmlndXJhdGlvbiA6DQotcHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlX0JTRWRpdG9yPUVkaXRldXIgZGUgcHJvY2Vzc3VzDQotDQotIyBBYnN0cmFjdERpYWdyYW1FZGl0b3INCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9QWxpZ25lcg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0PUFjdHVhbGlzZXIgXHUwMGUwIHBhcnRpciBkZSBsJ2FjdGl2aXRcdTAwZTkgXHUwMGU5bFx1MDBlOW1lbnRhaXJlDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2Zvcm1hdFRleHRCb3hBY3Rpdml0eV90ZXh0PU1pc2UgZW4gZm9ybWUgZGUgbGEgem9uZSBkZSB0ZXh0ZS4uLg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9SG9yaXpvbnRhbGVtZW50IHBhciByYXBwb3J0IFx1MDBlMCBsYSBtb3llbm5lDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1Ib3Jpem9udGFsZW1lbnQgcGFyIHJhcHBvcnQgYXUgcHJlbWllciBcdTAwZTlsXHUwMGU5bWVudCBzXHUwMGU5bGVjdGlvbm5cdTAwZTkNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVZlcnRpY2FsZW1lbnQgcGFyIHJhcHBvcnQgXHUwMGUwIGxhIG1veWVubmUNCi1NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX3RpdGxlPUluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzDQotTW92ZURpYWxvZ19pbnZhbGlkX21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9SVVQQTAwNDFFIDogSW1wb3NzaWJsZSBkZSBkXHUwMGU5cGxhY2VyIGxlKHMpIFx1MDBlOWxcdTAwZTltZW50KHMpIHNcdTAwZTlsZWN0aW9ublx1MDBlOShzKSB2ZXJzIGxhIGRlc3RpbmF0aW9uIGluZGlxdVx1MDBlOWUuDQotTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlbW9kZWxsaWJyYXJ5PVNhdXZlZ2FyZGUgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcy4uLg0KLU1ldGhvZExpYnJhcnlFZGl0b3JfZXJyb3JfZGlhbG9nX3RpdGxlPUVycmV1cg0KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZV9saWJyYXJ5X3Byb2JsZW1fbXNnPUlVUEEwMDMzRSA6IFByb2JsXHUwMGU4bWUgcmVuY29udHJcdTAwZTkgbG9ycyBkZSBsYSBzYXV2ZWdhcmRlIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlLg0KLU1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb25fZGVsZXRlY29uZmlybV90ZXh0PUV0ZXMtdm91cyBzXHUwMGZiciBkZSB2b3Vsb2lyIHN1cHByaW1lciAnJ3swfScnID8NCi1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19Db250ZW50RWxlbWVudF90ZXh0PUVsXHUwMGU5bWVudHMgZGUgY29udGVudSA6IA0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfQnJvd3NlQnV0dG9uTGFiZWw9UGFyY291cmlyLi4uDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1TcFx1MDBlOWNpZmlleiB1biBub20gZXQgdW5lIGRlc2NyaXB0aW9uIHBvdXIgbGEgbm91dmVsbGUgY29uZmlndXJhdGlvbiBkZSBtXHUwMGU5dGhvZGUuDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VUaXRsZT1FbnJlZ2lzdHJlciBsZXMgbW9kaWZpY2F0aW9ucyBldCBmZXJtZXIgdG91cyBsZXMgXHUwMGU5ZGl0ZXVycw0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9VmVydGljYWxlbWVudCBwYXIgcmFwcG9ydCBhdSBwcmVtaWVyIFx1MDBlOWxcdTAwZTltZW50IHNcdTAwZTlsZWN0aW9ublx1MDBlOQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQ9RW5yZWdpc3RyZXINCi1BdHRhY2htZW50RGlhbG9nYXR0YWNoRmlsZV90ZXh0PUpvaW5kcmUgdW4gZmljaGllcg0KLUNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnQ9Q29udGVudSBkZSBsYSBjb25maWd1cmF0aW9uDQotT3BlbkNvbmZpZ0RpYWxvZ29wZW5jb25maWdfdGV4dD1PdXZyaXIgdW5lIGNvbmZpZ3VyYXRpb24NCi1FbGVtZW50c1ZpZXdfcmVwbGFjZUFjdGlvbl90ZXh0PVJlbXBsYWNlci4uLg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9U2F1dmVnYXJkZSBkZSB7MH0gZW4gY291cnMNCi1Db25maWd1cmF0aW9uUGFnZV9TaG93RXJyb3JUb29sVGlwPUFmZmljaGVyIGwnYWZmaWNoZXVyIGRlIGpvdXJuYWwgZCdhdmVydGlzc2VtZW50IGRlIGNvbmZpZ3VyYXRpb24NCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25Gb3JtUHJlZml4PUNvbmZpZ3VyYXRpb24gOiANCi1DaGVja2xpc3RPcmRlcl9jaGVja2xpc3RpdGVtc190ZXh0PUVsXHUwMGU5bWVudHMgZGUgdlx1MDBlOXJpZmljYXRpb24gOiANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw9RFx1MDBlOXBsYWNlciB1biBub2V1ZA0KLUNvbmZpZ3VyYXRpb25QYWdlX01ha2VDbG9zdXJlVG9vbFRpcD1GZXJtZXIgZW4gY29ycmlnZWFudCBsZXMgZXJyZXVycw0KLU5ld1BsdWdpbkRpYWxvZ19yZWZlcmVuY2VwbHVnaW5fdGV4dD1QbHVnLWlucyBkZSByXHUwMGU5Zlx1MDBlOXJlbmNlIDoNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfY3JlYXRlRnJlZVRleHRfdGV4dD1Dclx1MDBlOWV6IHVuIHRleHRlIGxpYnJlDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfTGFiZWw9QXBlclx1MDBlN3UgZGUgbCdpY1x1MDBmNG5lIGRlIG5vZXVkIDoNCi1EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2Nvbm5lY3RfdGV4dD1JVVBBMDAzMlcgOiBDb25uZXhpb24gaW1wb3NzaWJsZQ0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9zYW1lcHJlZGFuZHN1Y190ZXh0PUlVUEEwMDMzVyA6IE5lIHBldXQgcGFzIGF2b2lyIGxlIG1cdTAwZWFtZSBcdTAwZTlsXHUwMGU5bWVudCBkZSByXHUwMGU5cGFydGl0aW9uIHF1ZSBsZSBwclx1MDBlOWRcdTAwZTljZXNzZXVyIGV0IGxlIHN1Y2Nlc3NldXINCi0NCi0jIEVkaXRvckNob29zZXINCi1FZGl0b3JDaG9vc2VyX2xvYWRkRXJyb3JEbGdUaXRsZT1PdXZyaXIgbCdcdTAwZTlkaXRldXINCi1FZGl0b3JDaG9vc2VyX1Jlc291cmNlc0Vycm9yPUNldCBcdTAwZTlsXHUwMGU5bWVudCBjb21wb3J0ZSBkZXMgZXJyZXVycy4gSWwgZXN0IHJlY29tbWFuZFx1MDBlOSBkZSBsZXMgY29ycmlnZXIgYXZhbnQgZGUgY29udGludWVyICh2b2lyIGxlcyBkXHUwMGU5dGFpbHMpLlxuXA0KLVxuXA0KLUNsaXF1ZXogc3VyIE9LIHBvdXIgY29udGludWVyIHNhbnMgb3V2cmlyIGwnXHUwMGU5ZGl0ZXVyLiBGZXJtZXogY2V0dGUgYm9cdTAwZWV0ZSBkZSBkaWFsb2d1ZSBwb3VyIG91dnJpciBsJ1x1MDBlOWRpdGV1ci4NCi1Db25maWd1cmF0aW9uUGFnZV9Gb3JtUHJlZml4PUNvbmZpZ3VyYXRpb24gOiANCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25OYW1lPU5vbSA6DQotQXR0YWNobWVudERpYWxvZ0ZpbGVVUkxfdGV4dD1VUkwgZGUgZmljaGllciA6DQotU3RlcHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbj1TXHUwMGU5bGVjdGlvbm5leiB1bmUgXHUwMGU5dGFwZSBldCBjbGlxdWV6IHN1ciBIYXV0IG91IEJhcyBwb3VyIGNoYW5nZXIgc29uIG9yZHJlLg0KLU1ldGhvZExpYnJhcnlFZGl0b3JfZXJyX3NhdmU9RXJyZXVyIGxvcnMgZGUgbGEgc2F1dmVnYXJkZQ0KLU1lc3NhZ2VWaWV3X2VycmVsZW1lbnRfdGV4dD1FbFx1MDBlOW1lbnQgZGUgclx1MDBlOWZcdTAwZTlyZW5jZW1lbnQNCi1NZXNzYWdlVmlld19yZWZlbGVtZW50X3RleHQ9RWxcdTAwZTltZW50IHJcdTAwZTlmXHUwMGU5cmVuY1x1MDBlOQ0KLQ0KLSNBY3Rpdml0eSBEaWFncmFtDQotQWN0aXZpdHlEaWFncmFtRWRpdG9yX2NyZWF0ZVN0YXJ0Tm9kZV90ZXh0PUNyXHUwMGU5ZXIgdW4gbm9ldWQgZGUgZFx1MDBlOXBhcnQNCi1Db25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50RGVzY3JpcHRpb249U1x1MDBlOWxlY3Rpb25uZXogbGVzIHBsdWctaW5zIGRlIG1cdTAwZTl0aG9kZSwgcGFja2FnZXMgZGUgY29udGVudSBldCBwcm9jZXNzdXMgcXVpIHNlcm9udCBpbmNsdXMgZGFucyBjZXR0ZSBjb25maWd1cmF0aW9uLg0KLUNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uX3RleHQ9Qm9cdTAwZWV0ZSBkZSBkaWFsb2d1ZSBkJ29yZHJlIGRlcyBcdTAwZTlsXHUwMGU5bWVudHMgZHUgY29udGVudSBkZSBsYSBjYXRcdTAwZTlnb3JpZSBwZXJzb25uYWxpc1x1MDBlOWUNCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RpcmVjdG9yeUxhYmVsPVJcdTAwZTlwZXJ0b2lyZSA6DQotUm9vdFByZWZQYWdlX2VuYWJsZXByb2Nlc3Njb250cmlidXRpb25fdGV4dD1BY3RpdmVyIGxhIGNvbnRyaWJ1dGlvbiBkZSBwcm9jZXNzdXMNCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbl90ZXh0PUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0dGUgY29uZmlndXJhdGlvbiBkZSBtXHUwMGU5dGhvZGUuDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25MYWJlbD1EZXNjcmlwdGlvbiA6DQotQ29udHJpYnV0aW9uU2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZT1DaG9pc2lyIGRlcyBjb2xsYWJvcmF0ZXVycyBwb3VyICcnezB9JycNCi1FbGVtZW50c1ZpZXdfb3BlblZhcmlhYmlsaXR5RGlhbG9nQWN0aW9uX3RleHQ9T3V2cmlyIHZpYSBkZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIHZhcmlhYmlsaXRcdTAwZTkNCi1WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9Q2hvaXNpciBkZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIHZhcmlhYmlsaXRcdTAwZTkgcG91ciAnJ3swfScnDQotVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3ZpZXdlckxhYmVsPUVsXHUwMGU5bWVudHMgZGUgdmFyaWFiaWxpdFx1MDBlOSBwb3VyICcnezB9JycNCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfTGFiZWw9QXBlclx1MDBlN3UgZGUgbCdpY1x1MDBmNG5lIEZvcm1lIDoNCi1EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2RlbGV0ZV90ZXh0PVN1cHByZXNzaW9uIGltcG9zc2libGUNCi1BY3Rpdml0eURpYWdyYW1FZGl0b3Jfb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0PU91dnJpciB1biBkaWFncmFtbWUgZFx1MDBlOXRhaWxsXHUwMGU5IGQnYWN0aXZpdFx1MDBlOSANCi1NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX2Rlc2NyaXB0aW9uPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0dGUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcy4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19DbGVhckJ1dHRvbkxhYmVsPUVmZmFjZXINCi1XUENvbXBhcnRtZW50RmlndXJlXzA9Tm91dmVhdSBkZXNjcmlwdGV1ciBkZSBwcm9kdWl0DQotcHJvbXB0Zm9yX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGRfdGV4dD1QdWJsaWV6IG91IHBhcmNvdXJleiBsZXMgZGlhZ3JhbW1lcyBkXHUwMGU5dGFpbGxcdTAwZTlzIGQnYWN0aXZpdFx1MDBlOSBxdWkgbidvbnQgcGFzIFx1MDBlOXRcdTAwZTkgY3JcdTAwZTlcdTAwZTlzIGRhbnMgbCdcdTAwZTlkaXRldXIgZGUgcHJvY2Vzc3VzDQotcHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtPVB1YmxpZXIgb3UgcGFyY291cmlyIGxlcyBkaWFncmFtbWVzIGQnYWN0aXZpdFx1MDBlOSBkZXMgZXh0ZW5zaW9ucyBkJ2FjdGl2aXRcdTAwZTkgbm9uIG1vZGlmaVx1MDBlOWVzDQotDQotI0NvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfTmFtZVBhdHRlcm49UGF0dGVybnMgZGUgbm9tcyAobGVzIG5vbXMgY29ycmVzcG9uZGFudHMgc2Vyb250IGFmZmljaFx1MDBlOXMpIDoNCi1zaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbl9sYWJlbD1BZmZpY2hlciBsZSBuYXZpZ2F0ZXVyIGRlIHJlc3NvdXJjZXMNCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19QYXR0ZXJuPUxlcyBwYXR0ZXJucyBzb250IHNcdTAwZTlwYXJcdTAwZTlzIHBhciB1bmUgdmlyZ3VsZSwgb1x1MDBmOSAqID0gbidpbXBvcnRlIHF1ZWxsZSBjaGFcdTAwZWVuZSwgPyA9IG4naW1wb3J0ZSBxdWVsIGNhcmFjdFx1MDBlOHJlDQotZXJyX3Byb2Nlc3NpbmdfZmlsZV9kZXNjcmlwdGlvbj1JVVBBMDAyOUUgOiBVbmUgZXJyZXVyIHMnZXN0IHByb2R1aXRlIGxvcnMgZHUgdHJhaXRlbWVudCBkdSBmaWNoaWVyIHNcdTAwZTlsZWN0aW9ublx1MDBlOS4gQ2xpcXVleiBzdXIgRFx1MDBlOXRhaWxzIHBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucy4NCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19DYXRlZ29yeVR5cGU9VHlwZSBkZSBjYXRcdTAwZTlnb3JpZSA6DQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbj1EZXNjcmlwdGlmIGNvdXJ0IDoNCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19TZWxlY3RDYXRlZ29yaWVzPVNcdTAwZTlsZWN0aW9ubmVyIGxlcyBjYXRcdTAwZTlnb3JpZXMNCi0NCi0jbG9nIG1lc3NhZ2VzDQotY2hlYXRzaGVldF9sb2FkX2ZhaWx1cmVfbG9nX21zZz1FY2hlYyBkZSBsJ291dmVydHVyZSBkZSBsJ2FpZGUtbVx1MDBlOW1vaXJlIGRlbWFuZFx1MDBlOSA6IA0KLQ0KLW5ld0NvbmZpZ3VyYXRpb25XaXJhemRfY3JlYXRlRXJyb3I9SVVQQTAwMzVFIDogSW1wb3NzaWJsZSBkZSBjclx1MDBlOWVyIGxhIGNvbmZpZ3VyYXRpb24NCi1uZXdQbHVnaW5XaXphcmRfY3JlYXRlRXJyb3I9SVVQQTAwMzZFIDogSW1wb3NzaWJsZSBkZSBjclx1MDBlOWVyIGxlIHBsdWctaW4NCi1lcnJvckRpYWxvZ19tb3ZlRXJyb3I9SVVQQTAwMzdFIDogSW1wb3NzaWJsZSBkZSBkXHUwMGU5cGxhY2VyIGwnXHUwMGU5bFx1MDBlOW1lbnQNCi1yZW5hbWVEaWFsb2dfcmVuYW1lRXJyb3I9SVVQQTAwMzhFIDogSW1wb3NzaWJsZSBkZSBjaGFuZ2VyIGxlIG5vbSBkZSBsJ1x1MDBlOWxcdTAwZTltZW50DQotZXJyb3JEaWFsb2dfY3JlYXRlRXJyb3I9SVVQQTAwMzlFIDogSW1wb3NzaWJsZSBkZSBjclx1MDBlOWVyIGwnXHUwMGU5bFx1MDBlOW1lbnQNCi1kdXBsaWNhdGVQbHVnaW5OYW1lRXJyb3JfbXNnPUlVUEEwMTAxRSA6IExlIG5vbSAnJ3swfScnIGV4aXN0ZSBkXHUwMGU5alx1MDBlMC4gU2Fpc2lzc2V6IHVuIG5vbSBkaWZmXHUwMGU5cmVudCBldCByXHUwMGU5ZXNzYXllei4NCi0NCi0jTmV3IFN0cmluZ3MgZm9yIFByb2Nlc3NFZGl0b3IgQ29udGV4dCBtZW51IGRpYWdyYW0gaW1hZ2VzDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkQURJbWFnZT1BZmZlY3RlciB1bmUgaW1hZ2UgQUQuLi4NCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlPUFjdHVhbGlzZXIgbCdlcnJldXINCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvck1zZz1FZGl0ZXVyIGQnYWN0dWFsaXNhdGlvbiBkZXMgZXJyZXVycw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFEREltYWdlPUFmZmVjdGVyIHVuZSBpbWFnZSBBREQuLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRXUERJbWFnZT1BZmZlY3RlciB1bmUgaW1hZ2UgV1BELi4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURJbWFnZUluUHVibGlzaGluZz1VdGlsaXNlciB1bmUgaW1hZ2UgQUQgZGFucyBsYSBwdWJsaWNhdGlvbg0KLVByb2Nlc3NFZGl0b3JfcHJvbXB0VG9EZWxldGVCZWZvcmVTdXBwcmVzcz1MZXMgZGVzY3JpcHRldXJzIHN1cHByaW1cdTAwZTlzIHJcdTAwZTlwZXJ0b3JpXHUwMGU5cyBkYW5zIGxhIGxpc3RlIERcdTAwZTl0YWlscyBkb2l2ZW50IFx1MDBlYXRyZSBzdXBwcmltXHUwMGU5cyBhZmluIGQnXHUwMGU5dml0ZXIgbGVzIGRvdWJsb25zIGFwclx1MDBlOHMgbGEgc3VwcHJlc3Npb24gZGVzIFx1MDBlOWxcdTAwZTltZW50cyBzXHUwMGU5bGVjdGlvbm5cdTAwZTlzLiBDbGlxdWV6IHN1ciBPSyBzaSB2b3VzIHNvdWhhaXRleiBsZXMgc3VwcHJpbWVyIGV0IGNvbnRpbnVlci4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VBRERJbWFnZUluUHVibGlzaGluZz1VdGlsaXNlciB1bmUgaW1hZ2UgQUREIGRhbnMgbGEgcHVibGljYXRpb24NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VXUERJbWFnZUluUHVibGlzaGluZz1VdGlsaXNlciB1bmUgaW1hZ2UgV1BEIGRhbnMgbGEgcHVibGljYXRpb24NCi1Qcm9jZXNzRWRpdG9yX0RpYWdyYW1JbWFnZV9JbnB1dERpYWxvZ19pbml0aWFsVmFsdWU9Q2hlbWluIGRlIGwnaW1hZ2UNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TaG93TGlua2VkRWxlbWVudGluTGlicmFyeVZpZXc9QWZmaWMmaGVyIGwnXHUwMGU5bFx1MDBlOW1lbnQgbGlcdTAwZTkgZGFucyBsYSB2dWUgQmlibGlvdGhcdTAwZThxdWUNCi1Qcm9jZXNzRWRpdG9yX3VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb25fbGFiZWw9TWV0dHJlIFx1MDBlMCBqb3VyIGxhIHN1cHByZXNzaW9uIFx1MDBlMCBwYXJ0aXIgZGUgbGEgJmJhc2UNCi1Qcm9jZXNzRWRpdG9yX0NvbnRleHRNZW51X0RpYWdyYW1JbWFnZXM9SW1hZ2VzIGRlIGRpYWdyYW1tZQ0KLQ0KLSNTdHJpbmdzIGZvciBzeW5jaHJvbml6YXRpb24gd2l6YXJkIG9uIHByb2Nlc3MgZWRpdG9yJ3MgQlMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RpdGxlPURlc2NyaXB0aW9uIGRlIGxhIHN5bmNocm9uaXNhdGlvbg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfdGV4dD1MaXNleiBsZXMgaW5mb3JtYXRpb25zIGNpLWRlc3NvdXMgcXVpIGV4cGxpcXVlbnQgY2UgcXVlIHZhIGVmZmVjdHVlciBsYSBzeW5jaHJvbmlzYXRpb24gcGVyc29ubmFsaXNcdTAwZTllLg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RpdGxlPVNcdTAwZTlsZWN0aW9ubmVyIGxhIGNvbmZpZ3VyYXRpb24NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0PVNcdTAwZTlsZWN0aW9ubmV6IGxhIGNvbmZpZ3VyYXRpb24gcXVlIHZvdXMgc291aGFpdGV6IHV0aWxpc2VyIHBvdXIgbGEgc3luY2hyb25pc2F0aW9uLiAgXA0KLVZvdHJlIHNcdTAwZTlsZWN0aW9uIGRcdTAwZTl0ZXJtaW5lIHF1ZWxsZXMgY29udHJpYnV0aW9ucyBldCBxdWVscyByZW1wbGFjZW1lbnRzIHNlcm9udCB1dGlsaXNcdTAwZTlzIHBvdXIgbGEgc3luY2hyb25pc2F0aW9uLg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX2NvbmZpZ0xhYmVsPUNvbmZpZ3VyYXRpb24gOg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90aXRsZT1TXHUwMGU5bGVjdGlvbm5lciBsZXMgcHJvcHJpXHUwMGU5dFx1MDBlOXMgXHUwMGUwIHN5bmNocm9uaXNlcg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcm9wZXJ0aWVzX2xhYmxlPVByb3ByaVx1MDBlOXRcdTAwZTlzDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX25hbWVfbGFibGU9Tm9tDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByZXNlbnRhdGlvbk5hbWVfbGFibGU9Tm9tIGRlIHByXHUwMGU5c2VudGF0aW9uDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2JyaWVmRGVzY19sYWJsZT1EZXNjcmlwdGlmIGNvdXJ0DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX29wdGlvbmFsSW5vdXRzX2xhYmVsPUVudHJcdTAwZTllcyBmYWN1bHRhdGl2ZXMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbWFuZGF0b3J5SW5wdXRzX2xhYmxlPUVudHJcdTAwZTllcyBvYmxpZ2F0b2lyZXMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3V0cHV0c19sYWJlbD1Tb3J0aWVzDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbGFiZWw9RXhcdTAwZTljdXRhbnQgcHJpbmNpcGFsDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2FkZG5QZXJmb3JtZXJzX2xhYmxlPUV4XHUwMGU5Y3V0YW50IHN1cHBsXHUwMGU5bWVudGFpcmVzDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Jlc3BvbnNpYmxlUm9sZXNfbGFibGU9Ulx1MDBmNGxlcyByZXNwb25zYWJsZXMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfY29udG5BcnRpZmFjdHNfbGFiZWw9QXJ0ZWZhY3RzIGNvbnRlbnVzDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2RpbHZlZFBhcnRzX2xhYmVsPUNvbXBvc2FudHMgbGl2cmFibGVzDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3NlbFN0ZXBzX2xhYmVsPVNcdTAwZTlsZWN0aW9uIGRlcyBcdTAwZTl0YXBlcw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90ZXh0PUNob2lzaXNzZXogbGVzIHByb3ByaVx1MDBlOXRcdTAwZTlzIGR1IGNvbnRlbnUgZGUgbVx1MDBlOXRob2RlIHF1ZSB2b3VzIHZvdWxleiBzb3VtZXR0cmUgXHUwMGUwIHVuZSBzeW5jaHJvbmlzYXRpb24uDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RpdGxlPVByXHUwMGU5dmlzdWFsaXNhdGlvbiBkZSBsYSBzeW5jaHJvbmlzYXRpb24NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGV4dD1SXHUwMGU5dmlzZXogbGVzIGRcdTAwZTl0YWlscyBkZSBzeW5jaHJvbmlzYXRpb24gcHJvcG9zXHUwMGU5cyBjaS1kZXNzb3VzLg0KLXNlbGVjdEVkaXRvcnNUb0Rpc2NhcmRDb25mbGljdENoYW5nZXM9Q2VydGFpbmVzIG1vZGlmaWNhdGlvbnMgbm9uIHNhdXZlZ2FyZFx1MDBlOWVzIHNvbnQgZW4gY29uZmxpdCBhdmVjIGRlcyBtb2RpZmljYXRpb25zIGVmZmVjdHVcdTAwZTllcyBlbiBkZWhvcnMgZGVzIFx1MDBlOWRpdGV1cnMuXG5cDQotU1x1MDBlOWxlY3Rpb25uZXogbGVzIFx1MDBlOWRpdGV1cnMgZG9udCB2b3VzIHNvdWhhaXRleiBzdXBwcmltZXIgbGVzIG1vZGlmaWNhdGlvbnMuDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3RpdGxlX3RleHQ9QXNzaXN0YW50IGRlIHN5bmNocm9uaXNhdGlvbg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfZXhwbGFpblRleHQ9Q2V0IGFzc2lzdGFudCB2b3VzIGFpZGUgXHUwMGUwIGFjdHVhbGlzZXIgbGVzIGRlc2NyaXB0ZXVycyBzXHUwMGU5bGVjdGlvbm5cdTAwZTlzIG91IHRvdXMgbGVzIGRlc2NyaXB0ZXVycyBzZSB0cm91dmFudCBzb3VzIGRlcyBhY3Rpdml0XHUwMGU5cyBzXHUwMGU5bGVjdGlvbm5cdTAwZTllcyBxdWkgb250IHJlXHUwMGU3dSBsZSBtYXJxdWFnZSAiU3luY2hyb25pc2VyIGF2ZWMgbGEgU291cmNlIiBkYW5zIGwnb25nbGV0IEdcdTAwZTluXHUwMGU5cmFsaXRcdTAwZTlzIGRlIGxldXIgdnVlIFByb3ByaVx1MDBlOXRcdTAwZTlzLiAgXA0KLVNldWxlcyBsZXMgcHJvcHJpXHUwMGU5dFx1MDBlOXMgcXVlIHZvdXMgc1x1MDBlOWxlY3Rpb25uZXogZGFucyBjZXQgYXNzaXN0YW50IHNvbnQgYWN0dWFsaXNcdTAwZTllcyBkYW5zIGxlcyBkZXNjcmlwdGV1cnMuICBcDQotVm91cyBwb3V2ZXogXHUwMGU5Z2FsZW1lbnQgc1x1MDBlOWxlY3Rpb25uZXIgbidpbXBvcnRlIHF1ZWxsZSBjb25maWd1cmF0aW9uIHZhbGlkZSBwb3VyIHZvdHJlIHByb2Nlc3N1cyBldCBxdWkgc2VyYSB1dGlsaXNcdTAwZTllIGxvcnMgZGUgbCdvcFx1MDBlOXJhdGlvbiBkJ2FjdHVhbGlzYXRpb24uICBcDQotTm90ZXogcXVlIGwnYXNzaXN0YW50IG5lIG1ldCBcdTAwZTAgam91ciBhdWN1biBkZXNjcmlwdGV1ciBsaVx1MDBlOSBkZSBmYVx1MDBlN29uIGR5bmFtaXF1ZSAoaXRhbGlxdWUgdmVydCkuDQotDQotb3BlblJURT1PdXZyaXIgbCdcdTAwZTlkaXRldXIgZGUgdGV4dGUgZW5yaWNoaQ0KLWNsb3NlUlRFPUZlcm1lciBsJ1x1MDBlOWRpdGV1ciBkZSB0ZXh0ZSBlbnJpY2hpDQotDQotI05ldyBTdHJpbmdzDQotcm9sZXNldHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HXHUwMGU5cmV6IGxlIGNvbnNlaWwgcXVpIGFwcGFydGllbnQgXHUwMGUwIGNldCBlbnNlbWJsZSBkZSByXHUwMGY0bGVzLg0KLWRpc2NpcGxpbmVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R1x1MDBlOXJleiBsZSBjb25zZWlsIHF1aSBhcHBhcnRpZW50IFx1MDBlMCBjZXR0ZSBkaXNjaXBsaW5lLg0KLXdvcmtwcm9kdWN0dHlwZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HXHUwMGU5cmV6IGxlIGNvbnNlaWwgcXVpIGFwcGFydGllbnQgXHUwMGUwIGNlIHR5cGUgZGUgcHJvZHVpdC4NCi1kb21haW5zX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R1x1MDBlOXJleiBsZSBjb25zZWlsIHF1aSBhcHBhcnRpZW50IFx1MDBlMCBjZSBkb21haW5lLg0KLXRvb2xzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R1x1MDBlOXJleiBsZSBjb25zZWlsIHF1aSBhcHBhcnRpZW50IFx1MDBlMCBjZXQgb3V0aWwuDQotY3VzdG9tY2F0ZWdvcnlfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HXHUwMGU5cmV6IGxlIGNvbnNlaWwgcXVpIGFwcGFydGllbnQgXHUwMGUwIGNldHRlIGNhdFx1MDBlOWdvcmllIHBlcnNvbm5hbGlzXHUwMGU5ZS4NCi0NCi1jb25jZXB0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R1x1MDBlOXJleiBsZSBjb25zZWlsIHF1aSBhcHBhcnRpZW50IFx1MDBlMCBjZSBjb25jZXB0Lg0KLWNoZWNrbGlzdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGUgY29uc2VpbCBxdWkgYXBwYXJ0aWVudCBcdTAwZTAgY2V0dGUgbGlzdGUgZGUgY29udHJcdTAwZjRsZS4NCi1leGFtcGxlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R1x1MDBlOXJleiBsZSBjb25zZWlsIHF1aSBhcHBhcnRpZW50IFx1MDBlMCBjZXQgZXhlbXBsZS4NCi1ndWlkZWxpbmVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HXHUwMGU5cmV6IGxlIGNvbnNlaWwgcXVpIGFwcGFydGllbnQgXHUwMGUwIGNldHRlIGluc3RydWN0aW9uLg0KLXJvYWRtYXBfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HXHUwMGU5cmV6IGxlIGNvbnNlaWwgcXVpIGFwcGFydGllbnQgXHUwMGUwIGNldHRlIGZldWlsbGUgZGUgcm91dGUuDQotcmV1c2FibGVhc3NldF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGUgY29uc2VpbCBxdWkgYXBwYXJ0aWVudCBcdTAwZTAgY2V0dGUgcmVzc291cmNlIHJcdTAwZTl1dGlsaXNhYmxlLg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGUgY29uc2VpbCBxdWkgYXBwYXJ0aWVudCBcdTAwZTAgY2V0dGUgZG9jdW1lbnRhdGlvbiBkJ2FjY29tcGFnbmVtZW50Lg0KLXJlcG9ydF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGUgY29uc2VpbCBxdWkgYXBwYXJ0aWVudCBcdTAwZTAgY2UgcmFwcG9ydC4NCi1wcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGUgY29uc2VpbCBxdWkgYXBwYXJ0aWVudCBcdTAwZTAgY2V0dGUgcHJhdGlxdWUuDQotdGVtcGxhdGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HXHUwMGU5cmV6IGxlIGNvbnNlaWwgcXVpIGFwcGFydGllbnQgXHUwMGUwIGNlIGNhbmV2YXMuDQotdGVybWRlZmluaXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HXHUwMGU5cmVyIGxlIGNvbnNlaWwgcXVpIGFwcGFydGllbnQgXHUwMGUwIGNldHRlIGRcdTAwZTlmaW5pdGlvbiBkZSB0ZXJtZS4NCi10b29sbWVudG9yX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R1x1MDBlOXJlciBsZSBjb25zZWlsIHF1aSBhcHBhcnRpZW50IFx1MDBlMCBjZSBndWlkZSBkJ3V0aWxpc2F0aW9uIGRlIGwnb3V0aWwuDQotd2hpdGVwYXBlcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdcdTAwZTlyZXogbGUgY29uc2VpbCBxdWkgYXBwYXJ0aWVudCBcdTAwZTAgY2UgbGl2cmUgYmxhbmMuDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HXHUwMGU5cmV6IGxlIGNvbnNlaWwgcXVpIGFwcGFydGllbnQgXHUwMGUwIGNldHRlIGNvbnNpZFx1MDBlOXJhdGlvbiBkJ2VzdGltYXRpb24uDQotDQotDQotI05ldyBTdHJpbmcgU2VjdGlvbiBEZXNjcmlwdGlvbg0KLXJvbGVfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGRlIGNlIHJcdTAwZjRsZS4NCi1yb2xlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2Ugclx1MDBmNGxlLg0KLXJvbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZSByXHUwMGY0bGUgcydhc3NvY2llIFx1MDBlMCB1biBhdXRyZS4NCi1yb2xlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkZSB2ZXJzaW9uIFx1MDBlMCBwcm9wb3MgZGUgY2Ugclx1MDBmNGxlLg0KLQ0KLXRhc2tfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIHRcdTAwZTJjaGUuDQotdGFza19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIHRcdTAwZTJjaGUuDQotdGFza192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1JbmRpcXVleiBjb21tZW50IGNldHRlIHRcdTAwZTJjaGUgcydhc3NvY2llIFx1MDBlMCB1bmUgYXV0cmUuDQotdGFza192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZGUgdmVyc2lvbiBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIHRcdTAwZTJjaGUuDQotDQotYXJ0aWZhY3RfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGRlIGNldCBhcnRlZmFjdC4NCi1hcnRpZmFjdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNldCBhcnRlZmFjdC4NCi1hcnRpZmFjdF9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbm5hbGlzZXogbGVzIGljXHUwMGY0bmVzIGRlIGNldCBhcnRlZmFjdC4NCi1hcnRpZmFjdF9ub3RhdGlvblNlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZGUgbGl2cmFpc29uIFx1MDBlMCBwcm9wb3MgZGUgY2V0IGFydGVmYWN0Lg0KLWFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZGUgcGVyc29ubmFsaXNhdGlvbiBcdTAwZTAgcHJvcG9zIGRlIGNldCBhcnRlZmFjdC4NCi1hcnRpZmFjdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1JbmRpcXVleiBjb21tZW50IGNldCBhcnRlZmFjdCBzJ2Fzc29jaWUgXHUwMGUwIHVuIGF1dHJlLg0KLWFydGlmYWN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkZSB2ZXJzaW9uIFx1MDBlMCBwcm9wb3MgZGUgY2V0IGFydGVmYWN0Lg0KLQ0KLW91dGNvbWVfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIHNvcnRpZS4NCi1vdXRjb21lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0dGUgc29ydGllLg0KLW91dGNvbWVfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25uYWxpc2V6IGxlcyBpY1x1MDBmNG5lcyBkZSBjZXR0ZSBzb3J0aWUuDQotb3V0Y29tZV9ub3RhdGlvblNlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZGUgbGl2cmFpc29uIFx1MDBlMCBwcm9wb3MgZGUgY2V0dGUgc29ydGllLg0KLW91dGNvbWVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkZSBwZXJzb25uYWxpc2F0aW9uIFx1MDBlMCBwcm9wb3MgZGUgY2V0dGUgc29ydGllLg0KLW91dGNvbWVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZXR0ZSBzb3J0aWUgcydhc3NvY2llIFx1MDBlMCB1bmUgYXV0cmUuDQotb3V0Y29tZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZGUgdmVyc2lvbiBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIHNvcnRpZS4NCi0NCi1kZWxpdmVyYWJsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRcdTAwZTl0YWlsbFx1MDBlOWVzIFx1MDBlMCBwcm9wb3MgZGUgY2UgbGl2cmFibGUuDQotZGVsaXZlcmFibGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGdcdTAwZTluXHUwMGU5cmFsZXMgXHUwMGUwIHByb3BvcyBkZSBjZSBsaXZyYWJsZS4NCi1kZWxpdmVyYWJsZV9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbm5hbGlzZXogbGVzIGljXHUwMGY0bmVzIGRlIGNlIGxpdnJhYmxlLg0KLWRlbGl2ZXJhYmxlX25vdGF0aW9uU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkZSBsaXZyYWlzb24gXHUwMGUwIHByb3BvcyBkZSBjZSBsaXZyYWJsZS4NCi1kZWxpdmVyYWJsZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHBlcnNvbm5hbGlzYXRpb24gXHUwMGUwIHByb3BvcyBkZSBkZSBsaXZyYWJsZS4NCi1kZWxpdmVyYWJsZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1JbmRpcXVleiBjb21tZW50IGNlIGxpdnJhYmxlIHMnYXNzb2NpZSBcdTAwZTAgdW4gYXV0cmUuDQotZGVsaXZlcmFibGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZSBsaXZyYWJsZS4NCi0NCi1kaXNjaXBsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZFx1MDBlOXRhaWxsXHUwMGU5ZXMgXHUwMGUwIHByb3BvcyBkZSBjZXR0ZSBkaXNjaXBsaW5lLg0KLWRpc2NpcGxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGdcdTAwZTluXHUwMGU5cmFsZXMgXHUwMGUwIHByb3BvcyBkZSBjZXR0ZSBkaXNjaXBsaW5lLg0KLWRpc2NpcGxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZXR0ZSBkaXNjaXBsaW5lIHMnYXNzb2NpZSBcdTAwZTAgdW5lIGF1dHJlLg0KLWRpc2NpcGxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZXR0ZSBkaXNjaXBsaW5lLg0KLQ0KLWRvbWFpbl9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRcdTAwZTl0YWlsbFx1MDBlOWVzIFx1MDBlMCBwcm9wb3MgZGUgY2UgZG9tYWluZS4NCi1kb21haW5fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGdcdTAwZTluXHUwMGU5cmFsZXMgXHUwMGUwIHByb3BvcyBkZSBjZSBkb21haW5lLg0KLWRvbWFpbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1JbmRpcXVleiBjb21tZW50IGNlIGRvbWFpbmUgcydhc3NvY2llIFx1MDBlMCB1biBhdXRyZS4NCi1kb21haW5fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZSBkb21haW5lLg0KLQ0KLXdvcmtwcm9kdWN0dHlwZV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRcdTAwZTl0YWlsbFx1MDBlOWVzIFx1MDBlMCBwcm9wb3MgZGUgY2UgdHlwZSBkZSBwcm9kdWl0Lg0KLXdvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNlIHR5cGUgZGUgcHJvZHVpdC4NCi13b3JrcHJvZHVjdHR5cGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZSB0eXBlIGRlIHByb2R1aXQgcydhc3NvY2llIFx1MDBlMCB1biBhdXRyZS4NCi13b3JrcHJvZHVjdHR5cGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZSB0eXBlIGRlIHByb2R1aXQuDQotDQotcm9sZXNldF9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRcdTAwZTl0YWlsbFx1MDBlOWVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0IGVuc2VtYmxlIGRlIHJcdTAwZjRsZXMuDQotcm9sZXNldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNldCBlbnNlbWJsZSBkZSByXHUwMGY0bGVzLg0KLXJvbGVzZXRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZXQgZW5zZW1ibGUgZGUgclx1MDBmNGxlcyBzJ2Fzc29jaWUgXHUwMGUwIHVuIGF1dHJlLg0KLXJvbGVzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZXQgZW5zZW1ibGUgZGUgclx1MDBmNGxlLg0KLQ0KLXRvb2xfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGRlIGNldCBvdXRpbC4NCi10b29sX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0IG91dGlsLg0KLXRvb2xfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZXQgb3V0aWwgcydhc3NvY2llIFx1MDBlMCB1biBhdXRyZS4NCi10b29sX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkZSB2ZXJzaW9uIFx1MDBlMCBwcm9wb3MgZGUgY2V0IG91dGlsLg0KLQ0KLWNvbmNlcHRfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGRlIGNlIGNvbmNlcHQuDQotY29uY2VwdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNlIGNvbmNlcHQuDQotY29uY2VwdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1JbmRpcXVleiBjb21tZW50IGNlIGNvbmNlcHQgcydhc3NvY2llIFx1MDBlMCB1biBhdXRyZS4NCi1jb25jZXB0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkZSB2ZXJzaW9uIFx1MDBlMCBwcm9wb3MgZGUgY2UgY29uY2VwdC4NCi0NCi1jaGVja2xpc3RfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIGxpc3RlIGRlIGNvbnRyXHUwMGY0bGUuDQotY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0dGUgbGlzdGUgZGUgY29udHJcdTAwZjRsZS4NCi1jaGVja2xpc3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZXR0ZSBsaXN0ZSBkZSBjb250clx1MDBmNGxlIHMnYXNzb2NpZSBcdTAwZTAgdW5lIGF1dHJlLg0KLWNoZWNrbGlzdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZGUgdmVyc2lvbiBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIGxpc3RlIGRlIGNvbnRyXHUwMGY0bGUuDQotDQotZXhhbXBsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRcdTAwZTl0YWlsbFx1MDBlOWVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0IGV4ZW1wbGUuDQotZXhhbXBsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNldCBleGVtcGxlLg0KLWV4YW1wbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZXQgZXhlbXBsZSBzJ2Fzc29jaWUgXHUwMGUwIHVuIGF1dHJlLg0KLWV4YW1wbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZXQgZXhlbXBsZS4NCi0NCi1ndWlkZWxpbmVfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIGluc3RydWN0aW9uLg0KLWd1aWRlbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIGluc3RydWN0aW9uLg0KLWd1aWRlbGluZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1JbmRpcXVleiBjb21tZW50IGNldHRlIGluc3RydWN0aW9uIHMnYXNzb2NpZSBcdTAwZTAgdW5lIGF1dHJlLg0KLWd1aWRlbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZGUgdmVyc2lvbiBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIGluc3RydWN0aW9uLg0KLQ0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZFx1MDBlOXRhaWxsXHUwMGU5ZXMgXHUwMGUwIHByb3BvcyBkZSBjZXR0ZSBjb25zaWRcdTAwZTlyYXRpb24gZCdlc3RpbWF0aW9uLg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0dGUgY29uc2lkXHUwMGU5cmF0aW9uIGQnZXN0aW1hdGlvbi4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1JbmRpcXVleiBjb21tZW50IGNldHRlIGNvbnNpZFx1MDBlOXJhdGlvbiBkJ2VzdGltYXRpb24gcydhc3NvY2llIFx1MDBlMCB1bmUgYXV0cmUuDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZXR0ZSBjb25zaWRcdTAwZTlyYXRpb24gZCdlc3RpbWF0aW9uLg0KLQ0KLXByYWN0aWNlX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZFx1MDBlOXRhaWxsXHUwMGU5ZXMgXHUwMGUwIHByb3BvcyBkZSBjZXR0ZSBwcmF0aXF1ZS4NCi1wcmFjdGljZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIHByYXRpcXVlLg0KLXByYWN0aWNlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUluZGlxdWV6IGNvbW1lbnQgY2V0dGUgcHJhdGlxdWUgcydhc3NvY2llIFx1MDBlMCB1bmUgYXV0cmUuDQotcHJhY3RpY2VfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZXR0ZSBwcmF0aXF1ZS4NCi0NCi1yZXBvcnRfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGRlIGNlIHJhcHBvcnQuDQotcmVwb3J0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2UgcmFwcG9ydC4NCi1yZXBvcnRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZSByYXBwb3J0IHMnYXNzb2NpZSBcdTAwZTAgdW4gYXV0cmUuDQotcmVwb3J0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkZSB2ZXJzaW9uIFx1MDBlMCBwcm9wb3MgZGUgY2UgcmFwcG9ydC4NCi0NCi1yZXN1YWJsZWFzc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZFx1MDBlOXRhaWxsXHUwMGU5ZXMgXHUwMGUwIHByb3BvcyBkZSBjZXR0ZSByZXNzb3VyY2Ugclx1MDBlOXV0aWxpc2FibGUuDQotcmVzdWFibGVhc3NldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIHJlc3NvdXJjZSByXHUwMGU5dXRpbGlzYWJsZS4NCi1yZXN1YWJsZWFzc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUluZGlxdWV6IGNvbW1lbnQgY2V0dGUgcmVzc291cmNlIHJcdTAwZTl1dGlsaXNhYmxlIHMnYXNzb2NpZSBcdTAwZTAgdW5lIGF1dHJlLg0KLXJlc3VhYmxlYXNzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZXR0ZSByZXNzb3VyY2Ugclx1MDBlOXV0aWxpc2FibGUuDQotDQotcm9hZG1hcF9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRcdTAwZTl0YWlsbFx1MDBlOWVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0dGUgZmV1aWxsZSBkZSByb3V0ZS4NCi1yb2FkbWFwX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0dGUgZmV1aWxsZSBkZSByb3V0ZS4NCi1yb2FkbWFwX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUluZGlxdWV6IGNvbW1lbnQgY2V0dGUgZmV1aWxsZSBkZSByb3V0ZSBzJ2Fzc29jaWUgXHUwMGUwIHVuZSBhdXRyZS4NCi1yb2FkbWFwX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkZSB2ZXJzaW9uIFx1MDBlMCBwcm9wb3MgZGUgY2V0dGUgZmV1aWxsZSBkZSByb3V0ZS4NCi0NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGRlIGNlIGRvY3VtZW50IGQnYWNjb21wYWduZW1lbnQuDQotc3VwcG9ydGluZ21hdGVyaWFsX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2UgZG9jdW1lbnQgZCdhY2NvbXBhZ25lbWVudC4NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZSBkb2N1bWVudCBkJ2FjY29tcGFnbmVtZW50IHMnYXNzb2NpZSBcdTAwZTAgdW4gYXV0cmUuDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkZSB2ZXJzaW9uIFx1MDBlMCBwcm9wb3MgZGUgY2UgZG9jdW1lbnQgZCdhY2NvbXBhZ25lbWVudC4NCi0NCi10ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRcdTAwZTl0YWlsbFx1MDBlOWVzIFx1MDBlMCBwcm9wb3MgZGUgY2UgY2FuZXZhcy4NCi10ZW1wbGF0ZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNlIGNhbmV2YXMuDQotdGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZSBjYW5ldmFzIHMnYXNzb2NpZSBcdTAwZTAgdW4gYXV0cmUuDQotdGVtcGxhdGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZSBjYW5ldmFzLg0KLQ0KLXRlcm1kZWZpbml0aW9uX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZFx1MDBlOXRhaWxsXHUwMGU5ZXMgXHUwMGUwIHByb3BvcyBjZXR0ZSBkXHUwMGU5ZmluaXRpb24gZGUgdGVybWUuDQotdGVybWRlZmluaXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGdcdTAwZTluXHUwMGU5cmFsZXMgXHUwMGUwIHByb3BvcyBjZXR0ZSBkXHUwMGU5ZmluaXRpb24gZGUgdGVybWUuDQotdGVybWRlZmluaXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZXR0ZSBkXHUwMGU5ZmluaXRpb24gZGUgdGVybWUgcydhc3NvY2llIFx1MDBlMCB1bmUgYXV0cmUuDQotdGVybWRlZmluaXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZXR0ZSBkXHUwMGU5ZmluaXRpb24gZGUgdGVybWUuDQotDQotdG9vbG1lbnRvcl9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRcdTAwZTl0YWlsbFx1MDBlOWVzIFx1MDBlMCBwcm9wb3MgY2UgZ3VpZGUgZCd1dGlsaXNhdGlvbiBkZSBsJ291dGlsLg0KLXRvb2xtZW50b3JfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGdcdTAwZTluXHUwMGU5cmFsZXMgXHUwMGUwIHByb3BvcyBjZSBndWlkZSBkJ3V0aWxpc2F0aW9uIGRlIGwnb3V0aWwuDQotdG9vbG1lbnRvcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1JbmRpcXVleiBjb21tZW50IGNlIGd1aWRlIGQndXRpbGlzYXRpb24gZGUgbCdvdXRpbCBzJ2Fzc29jaWUgXHUwMGUwIHVuIGF1dHJlLg0KLXRvb2xtZW50b3JfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZSBndWlkZSBkJ3V0aWxpc2F0aW9uIGRlIGwnb3V0aWwuDQotDQotd2hpdGVwYXBlcl9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRcdTAwZTl0YWlsbFx1MDBlOWVzIFx1MDBlMCBwcm9wb3MgY2UgbGl2cmUgYmxhbmMuDQotd2hpdGVwYXBlcl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGNlIGxpdnJlIGJsYW5jLg0KLXdoaXRlcGFwZXJfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9SW5kaXF1ZXogY29tbWVudCBjZSBsaXZyZSBibGFuYyBzJ2Fzc29jaWUgXHUwMGUwIHVuIGF1dHJlLg0KLXdoaXRlcGFwZXJfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24gXHUwMGUwIHByb3BvcyBkZSBjZSBsaXZyZSBibGFuYy4NCi0NCi1kaXNjaXBsaW5lZ3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGNlIHJlZ3JvdXBlbWVudCBkZSBkaXNjaXBsaW5lLg0KLWRpc2NpcGxpbmVncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGNlIHJlZ3JvdXBlbWVudCBkZSBkaXNjaXBsaW5lLg0KLWRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1JbmRpcXVleiBjb21tZW50IGNlIHJlZ3JvdXBlbWVudCBkZSBkaXNjaXBsaW5lcyBzJ2Fzc29jaWUgXHUwMGUwIHVuIGF1dHJlLg0KLWRpc2NpcGxpbmVncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZGUgdmVyc2lvbiBcdTAwZTAgcHJvcG9zIGRlIGNlIHJlZ3JvdXBlbWVudCBkZSBkaXNjaXBsaW5lcy4NCi0NCi1yb2xlc2V0Z3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGNlIHJlZ3JvdXBlbWVudCBkJ2Vuc2VtYmxlcyBkZSByXHUwMGY0bGVzLg0KLXJvbGVzZXRncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGNlIHJlZ3JvdXBlbWVudCBkJ2Vuc2VtYmxlcyBkZSByXHUwMGY0bGVzLg0KLXJvbGVzZXRncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1JbmRpcXVleiBjb21tZW50IGNlIHJlZ3JvdXBlbWVudCBkJ2Vuc2VtYmxlcyBkZSByXHUwMGY0bGVzIHMnYXNzb2NpZSBcdTAwZTAgdW4gYXV0cmUuDQotcm9sZXNldGdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkZSB2ZXJzaW9uIFx1MDBlMCBwcm9wb3MgZGUgY2UgcmVncm91cGVtZW50IGQnZW5zZW1ibGVzIGRlIHJcdTAwZjRsZXMuDQotDQotY3VzdG9tY2F0ZWdvcnlfZGV0YWlsU2VjdGlvbl9kZXNjPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBcdTAwZTAgcHJvcG9zIGNldHRlIGNhdFx1MDBlOWdvcmllIHBlcnNvbm5hbGlzXHUwMGU5ZS4NCi1jdXN0b21jYXRlZ29yeV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGNldHRlIGNhdFx1MDBlOWdvcmllIHBlcnNvbm5hbGlzXHUwMGU5ZS4NCi1jdXN0b21jYXRlZ29yeV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1JbmRpcXVleiBjb21tZW50IGNldHRlIGNhdFx1MDBlOWdvcmllIHBlcnNvbm5hbGlzXHUwMGU5ZSBzJ2Fzc29jaWUgXHUwMGUwIHVuZSBhdXRyZS4NCi1jdXN0b21jYXRlZ29yeV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZGUgdmVyc2lvbiBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIGNhdFx1MDBlOWdvcmllIHBlcnNvbm5hbGlzXHUwMGU5ZS4NCi1jdXN0b21jYXRlZ29yeV9JY29uU2VjdGlvbl9kZXNjPVBlcnNvbm5hbGlzZXogbGVzIGljXHUwMGY0bmVzIGRlIGNldHRlIGNhdFx1MDBlOWdvcmllIHBlcnNvbm5hbGlzXHUwMGU5ZS4NCi0NCi1jb25jZXB0X2ljb25TZWN0aW9uX2Rlc2M9UGVyc29ubmFsaXNleiBsZXMgaWNcdTAwZjRuZXMgZGUgY2UgY29uY2VwdC4NCi1jaGVja2xpc3RfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25uYWxpc2V6IGxlcyBpY1x1MDBmNG5lcyBkZSBjZXR0ZSBsaXN0ZSBkZSBjb250clx1MDBmNGxlLg0KLXRvb2xtZW50b3JfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25uYWxpc2V6IGxlcyBpY1x1MDBmNG5lcyBkZSBjZSBndWlkZSBkJ3V0aWxpc2F0aW9uIGRlIGwnb3V0aWwuDQotd2hpdGVwYXBlcl9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbm5hbGlzZXogbGVzIGljXHUwMGY0bmVzIGRlIGNlIGxpdnJlIGJsYW5jLg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2ljb25TZWN0aW9uX2Rlc2M9UGVyc29ubmFsaXNleiBsZXMgaWNcdTAwZjRuZXMgZGUgY2V0dGUgY29uc2lkXHUwMGU5cmF0aW9uIGQnZXN0aW1hdGlvbi4NCi10ZXJtZGVmaW5pdGlvbl9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbm5hbGlzZXogbGVzIGljXHUwMGY0bmVzIGRlIGNldHRlIGRcdTAwZTlmaW5pdGlvbiBkZSB0ZXJtZS4NCi10ZW1wbGF0ZV9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbm5hbGlzZXogbGVzIGljXHUwMGY0bmVzIGRlIGNlIGNhbmV2YXMuDQotcmV1c2FibGVhc3NldF9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbm5hbGlzZXogbGVzIGljXHUwMGY0bmVzIGRlIGNldHRlIHJlc3NvdXJjZSByXHUwMGU5dXRpbGlzYWJsZS4NCi1yZXBvcnRfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25uYWxpc2V6IGxlcyBpY1x1MDBmNG5lcyBkZSBjZSByYXBwb3J0Lg0KLXByYWN0aWNlX2ljb25TZWN0aW9uX2Rlc2M9UGVyc29ubmFsaXNleiBsZXMgaWNcdTAwZjRuZXMgZGUgY2V0dGUgcHJhdGlxdWUuDQotZXhhbXBsZV9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbm5hbGlzZXogbGVzIGljXHUwMGY0bmVzIGRlIGNldCBleGVtcGxlLg0KLWd1aWRlbGluZV9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbm5hbGlzZXogbGVzIGljXHUwMGY0bmVzIGRlIGNldHRlIGluc3RydWN0aW9uLg0KLXJvYWRtYXBfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25uYWxpc2V6IGxlcyBpY1x1MDBmNG5lcyBkZSBjZXR0ZSBmZXVpbGxlIGRlIHJvdXRlLg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbm5hbGlzZXogbGVzIGljXHUwMGY0bmVzIGRlIGNlIGRvY3VtZW50IGQnYWNjb21wYWduZW1lbnQuDQotDQotZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfdGl0bGU9RmljaGllciBtb2RpZmlcdTAwZTkNCi1lZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY19tZXNzYWdlPUxlIGZpY2hpZXIgYSBcdTAwZTl0XHUwMGU5IG1vZGlmaVx1MDBlOSBkYW5zIGxlIHN5c3RcdTAwZThtZSBkZSBmaWNoaWVycy4gU291aGFpdGV6LXZvdXMgY2hhcmdlciBsZXMgbW9kaWZpY2F0aW9ucyA/DQotDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU9VmFyaWFiaWxpdFx1MDBlOSBkZSBsJ2FjdGl2aXRcdTAwZTkNCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2c9TCcnYWN0aXZpdFx1MDBlOSAnJ3swfScnIG5lIHBldXQgcGFzIGRcdTAwZTlmaW5pciBsYSB2YXJpYWJpbGl0XHUwMGU5IGF2ZWMgJyd7MX0nJyBcdTAwZTl0YW50IGRvbm5cdTAwZTkgcXVlICcnezF9JycgZGlzcG9zZSBkXHUwMGU5alx1MDBlMCBkJyd1bmUgb3UgZGUgcGx1c2lldXJzIGFjdGl2aXRcdTAwZTlzIGRlIGNvbnRyaWJ1dGlvbiBvdSBkZSByZW1wbGFjZW1lbnQgY29tbWUgXHUwMGU5dGFudCBzZXMgZW5mYW50cy4NCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cxPUwnJ2FjdGl2aXRcdTAwZTkgJyd7MH0nJyBuZSBwZXV0IHBhcyBkXHUwMGU5ZmluaXIgbGEgdmFyaWFiaWxpdFx1MDBlOSBhdmVjIGwnJ3VuIGRlIHNlcyBwYXJlbnRzIGRpcmVjdHMgb3UgdW4gcXVlbGNvbnF1ZSAgcHJvY2Vzc3VzLg0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzI9TCcnYWN0aXZpdFx1MDBlOSAnJ3swfScnIG5lIHBldXQgcGFzIGRcdTAwZTlmaW5pciBsYSB2YXJpYWJpbGl0XHUwMGU5IGF2ZWMgJyd7MX0nJyBcdTAwZTl0YW50IGRvbm5cdTAwZTkgcXUnJ2VsbGUgdmEgZ1x1MDBlOW5cdTAwZTlyZXIgdW5lIGRcdTAwZTlwZW5kYW5jZSBlbiBib3VjbGUuDQotDQotYXBwbHlfcGF0dGVybl9lcnJvcl90aXRsZT1BcHBsaXF1ZXIgdW4gcGF0dGVybg0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnPUwnJ2FjdGl2aXRcdTAwZTkgJyd7MH0nJyBuZSBwZXV0IHBhcyBhcHBsaXF1ZXIgZGUgcGF0dGVybiBhdmVjICcnezF9JycgXHUwMGU5dGFudCBkb25uXHUwMGU5IHF1JydlbGxlIHZhIGdcdTAwZTluXHUwMGU5cmVyIHVuZSBkXHUwMGU5cGVuZGFuY2UgZW4gYm91Y2xlLg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX2RlbGltaXRlcj18DQotTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9zaG93T3duZXJJbkxpYnJhcnlWaWV3PUFmZmljaGVyIGxlIHByb3ByaVx1MDBlOXRhaXJlIGRlIGNldHRlIHJcdTAwZTlmXHUwMGU5cmVuY2Ugbm9uIHJcdTAwZTlzb2x1ZSBkYW5zIGxhIHZ1ZSBCaWJsaW90aFx1MDBlOHF1ZQ0KLU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlVW5yZXNvbHZlZFJlZmVyZW5jZT1TdXBwcmltZXIgY2V0dGUgclx1MDBlOWZcdTAwZTlyZW5jZSBub24gclx1MDBlOXNvbHVlDQotcHJvbXB0RGVsZXRlQ3VzdG9tQ2F0ZWdvcnlCZWZvcmVSZW1vdmVMYXN0UmVmVG9JdD1Wb3VzIFx1MDBlYXRlcyBzdXIgbGUgcG9pbnQgZGUgc3VwcHJpbWVyIGxhIGRlcm5pXHUwMGU4cmUgclx1MDBlOWZcdTAwZTlyZW5jZSBcdTAwZTAgezB9IGRhbnMgbGUgcGx1Zy1pbi4gTGUgb3UgbGVzIFx1MDBlOWxcdTAwZTltZW50cyBzZXJvbnQgc3VwcHJpbVx1MDBlOXMuIFZvdWxlei12b3VzIGNvbnRpbnVlciA/DQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSNCZWxvdyBwcm9wZXJ0eSAiZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzIiBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQNCi0jRG9uJ3QgZGVsZXRlIGEgc3BhY2UgYWZ0ZXIgIjogIg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzPVwgOiANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzUwYjhiMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRm9ybSBQYWdlIFRpdGxlcw0KLWFzc2lnblBhZ2VfdGl0bGU9QXNzZWduYQ0KLWNhdGVnb3JpZXNQYWdlX3RpdGxlPUNhdGVnb3JpZQ0KLWRlbGl2ZXJhYmxlUGFydHNQYWdlX3RpdGxlPVBhcnRpIGRpc3RyaWJ1aWJpbGkNCi1kZXNjcmlwdGlvblBhZ2VfdGl0bGU9RGVzY3JpemlvbmUNCi1kaXNjaXBsaW5lc1BhZ2VfdGl0bGU9RGlzY2lwbGluZQ0KLWRpc2NhcmR1bnJlc29sdmVkcmVmPUVsaW1pbmEgcmlmZXJpbWVudGkgbm9uIHJpc29sdGkNCi1ndWlkYW5jZVBhZ2VfdGl0bGU9R3VpZGENCi1wcmV2aWV3UGFnZV90aXRsZT1BbnRlcHJpbWENCi1yZWZlcmVuY2VzUGFnZV90aXRsZT1SaWZlcmltZW50aQ0KLXJlZmVyZW5jZV90ZXh0PVJpZmVyaW1lbnRpOg0KLXJlZmVyZW5jZVdvcmtmbG93UGFnZV90aXRsZT1GbHVzc28gZGkgbGF2b3JvIGRpIHJpZmVyaW1lbnRvDQotcm9sZXNQYWdlX3RpdGxlPVJ1b2xpDQotcm9sZVNldHNQYWdlX3RpdGxlPUluc2llbWkgZGkgcnVvbGkNCi1zdGVwc1BhZ2VfdGl0bGU9UGFzc2kNCi10YXNrc1BhZ2VfdGl0bGU9T3BlcmF6aW9uaQ0KLXRvb2xNZW50b3JzUGFnZV90aXRsZT1HdWlkYSBhbCB0b29sDQotd29ya1Byb2R1Y3RzUGFnZV90aXRsZT1Qcm9kb3R0aSBkaSBsYXZvcm8NCi0NCi0jIFNlY3Rpb24gTmFtZXMgJiBEZXNjcmlwdGlvbg0KLWNoZWNrSXRlbXNTZWN0aW9uX25hbWU9Vm9jaSBlbGVuY2hpIGRpIG9wZXJhemlvbmkNCi1jaGVja0l0ZW1zU2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGxlIHZvY2kgY2hlIGNvc3RpdHVpc2Nvbm8gcXVlc3RvIGVsZW5jbyBkaSBjb250cm9sbG8uDQotZGVwZW5kZW5jaWVzU2VjdGlvbl9uYW1lPURpcGVuZGVuemUNCi1kZXBlbmRlbmNpZXNTZWN0aW9uX2Rlc2M9UXVlc3RhIHNlemlvbmUgdmlzdWFsaXp6YSBsZSBkaXBlbmRlbnplIGRpIHF1ZXN0byBwYWNjaGV0dG8gZGVsIGNvbnRlbnV0byBpbiBhbHRyaSBwYWNjaGV0dGkgZGVsIGNvbnRlbnV0by4NCi1kZXRhaWxTZWN0aW9uX25hbWU9SW5mb3JtYXppb25pIGRldHRhZ2xpYXRlDQotZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGRldHRhZ2xpYXRlIHN1IHF1ZXN0byB7MH0uDQotZ2VuZXJhbEluZm9TZWN0aW9uX25hbWU9SW5mb3JtYXppb25pIGdlbmVyYWxpDQotZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3UgcXVlc3RvIHswfS4NCi1pY29uU2VjdGlvbl9uYW1lPUljb25hDQotaWNvblNlY3Rpb25fZGVzYz1QZXJzb25hbGl6emFyZSBsZSBpY29uZSBwZXIgcXVlc3RvIHswfS4NCi1ub3RhdGlvblNlY3Rpb25fbmFtZT1JbmZvcm1hemlvbmkgc3VsbGEgY29uc2VnbmENCi1ub3RhdGlvblNlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSBjb25zZWduYSBwZXIgcXVlc3RvIHswfS4NCi1yZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fbmFtZT1QbHVnLWluIGEgY3VpIHNpIGZhIHJpZmVyaW1lbnRvOg0KLXJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9kZXNjPVF1ZXN0YSBzZXppb25lIHZpc3VhbGl6emEgaSBwbHVnLWluIGEgY3VpIGZhIHJpZmVyaW1lbnRvIHF1ZXN0byBwbHVnLWluIGRpIG1ldG9kby4NCi1zdGFmZmluZ1NlY3Rpb25fbmFtZT1JbmZvcm1hemlvbmkgc3VsIHBlcnNvbmFsZQ0KLXN0YWZmaW5nU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIHN1IHBlcnNvbmFsZSByZWxhdGl2ZSBhIHF1ZXN0byBydW9sby4NCi1zdGVwc1NlY3Rpb25fbmFtZT1QYXNzaQ0KLXN0ZXBzU2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGkgcGFzc2kgcGVyIGVzZWd1aXJlIHF1ZXN0YSBvcGVyYXppb25lLg0KLXRhaWxvcmluZ1NlY3Rpb25fbmFtZT1QZXJzb25hbGl6emF6aW9uZQ0KLXRhaWxvcmluZ1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSBwZXJzb25hbGl6emF6aW9uZSByZWxhdGl2ZSBhIHF1ZXN0byB7MH0uDQotdmFyaWFiaWxpdHlTZWN0aW9uX25hbWU9VmFyaWFiaWxpdFx1MDBlMCBkZWwgY29udGVudXRvDQotdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmaWNhcmUgaW4gY2hlIG1vZG8gcXVlc3RvIHswfSBzaSBjb3JyZWxhIGEgdW4gYWx0cm8gezB9Lg0KLXZlcnNpb25JbmZvU2VjdGlvbl9uYW1lPUluZm9ybWF6aW9uaSBzdWxsYSB2ZXJzaW9uZQ0KLXZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIHN1bGxhIHZlcnNpb25lIHJlbGF0aXZlIGEgcXVlc3RvIHswfS4NCi0NCi0jIFVJICYgRWxlbWVudCBBdHRyaWJ1dGUgTGFiZWxzDQotYWRkaXRpb25hbEluZm9fdGV4dD1JbmZvcm1hemlvbmkgYWdnaXVudGl2ZToNCi1hcHBsaWNhdGlvbl90ZXh0PUFwcGxpY2F6aW9uZToNCi1hY3Rpb25MYWJlbF9lZGl0PU1vZGlmaWNhDQotYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdj1Nb3N0cmEgaW4gdmlzdGEgbGlicmVyaWENCi1hbHRlcm5hdGl2ZXNfdGV4dD1BbHRlcm5hdGl2ZToNCi1hc3NpZ25tZW50QXBwcm9hY2hlc190ZXh0PUFwcHJvY2NpIGFzc2VnbmF6aW9uZToNCi1hdXRob3JzX3RleHQ9QXV0b3JpOg0KLWJhY2tncm91bmRfdGV4dD1CYWNrZ3JvdW5kOg0KLWJhc2VFbGVtZW50X3RleHQ9QmFzZToNCi1iYXNlR3VpZGFuY2VfdGV4dD1HdWlkYSBkaSBiYXNlOg0KLWJyaWVmRGVzY3JpcHRpb25fdGV4dD1CcmV2ZSBkZXNjcml6aW9uZToNCi1kZXNjcmlwdGlvbl90ZXh0PURlc2NyaXppb25lOg0KLWJhY2t1cGJlZm9yZXNhdmVfdGV4dD1Fc2VndWkgYmFja3VwIHByaW1hIGRpIHNhbHZhcmUNCi1icmllZk91dGxpbmVfdGV4dD1CcmV2ZSBwcm9maWxvOg0KLWNoYW5nZURhdGVfdGV4dD1EYXRhIG1vZGlmaWNhOg0KLWNoYW5nZURlc2NyaXB0aW9uX3RleHQ9RGVzY3JpemlvbmUgbW9kaWZpY2E6DQotY2hlY2tJdGVtc190ZXh0PVZvY2kgZWxlbmNoaSBkaSBvcGVyYXppb25pDQotY29udHJpYnV0ZXNfdGV4dD1Db250cmlidWlzY2UNCi1sb2NhbENvbnRyaWJ1dGVzX3RleHQ9TG9jYWxDb250cmlidXRlcw0KLWNvbnRyaWJ1dGVzX3RvX3RleHQ9Q29udHJpYnVpc2NlIGENCi1jb3B5cmlnaHRfdGV4dD1Db3B5cmlnaHQ6DQotZWRpdG9yX3RleHQ9RWRpdG9yDQotZXh0ZW5kc190ZXh0PUVzdGVuZGUNCi1leHRlbmRfdGV4dD1Fc3RlbmRpDQotZXh0ZXJuYWxEZXNjcmlwdGlvbl90ZXh0PURlc2NyaXppb25lIGVzdGVybmE6DQotZXh0ZXJuYWxJZF90ZXh0PUlEIGVzdGVybm86DQotZ29hbHNfdGV4dD1PYmlldHRpdmk6DQotaW1wYWN0T2ZOb3RIYXZpbmdfdGV4dD1JbXBhdHRvIGRlbGxhIG5vbiBkaXNwb25pYmlsaXRcdTAwZTA6DQota2V5Q29uc2lkZXJhdGlvbnNfdGV4dD1Db25zaWRlcmF6aW9uaSBjaGlhdmU6DQotbGV2ZWxzT2ZBZG9wdGlvbl90ZXh0PUxpdmVsbG8gZGkgYWRvemlvbmU6DQotbWFpbkRlc2NyaXB0aW9uX3RleHQ9RGVzY3JpemlvbmUgcHJpbmNpcGFsZToNCi1uZXdFbGVtZW50X3RleHQ9TnVvdm8gezB9DQotbmFtZV90ZXh0PU5vbWU6DQotbm90QXBwbGljYWJsZV90ZXh0PU5vbiBhcHBsaWNhYmlsZQ0KLXBhY2thZ2luZ0d1aWRhbmNlX3RleHQ9R3VpZGEgYWxsYSBjcmVhemlvbmUgcGFjY2hldHRpOg0KLXByZXNlbnRhdGlvbk5hbWVfdGV4dD1Ob21lIHByZXNlbnRhemlvbmU6DQotcHJvbXB0Zm9ybGliYXJ5X3RleHQ9UmljaGllZGkgbGlicmVyaWEgZGVpIG1ldG9kaSBhbGwnYXZ2aW8NCi1lbmFibGVIZWFsdGhDaGVja190ZXh0PUFiaWxpdGEgdG9vbCBkaSBkZWJ1ZyBpbnRlcm5pDQotcHJvYmxlbV90ZXh0PVByb2JsZW1hOg0KLXB1cnBvc2VfdGV4dD1TY29wbzoNCi1yZWFzb25Gb3JOb3ROZWVkaW5nX3RleHQ9TW90aXZvIGRlbGxhIG5vbiBuZWNlc3NpdFx1MDBlMDoNCi1yZXBsYWNlc190ZXh0PVNvc3RpdHVpc2NlDQotbG9jYWxSZXBsYWNlc190ZXh0PUxvY2FsUmVwbGFjZXMNCi1yZXByZXNlbnRhdGlvbk9wdGlvbnNfdGV4dD1PcHppb25pIGRpIHJhcHByZXNlbnRhemlvbmU6DQotdGVtcGxhdGVGaWxlX3RleHQ9RmlsZSBkaSBtb2RlbGxvOg0KLXNraWxsc190ZXh0PVNraWxsOg0KLXN0ZXBzX3RleHQ9UGFzc2k6DQotc3RlcHNfbmFtZV90ZXh0PU5vbWU6DQotc3RvcF90ZXh0PUludGVycm9tcGkNCi1wcmludF90ZXh0PVN0YW1wYQ0KLXN5bm9ueW1zX3RleHQ9U2lub25pbWk6DQotdHlwZV90ZXh0PVRpcG86DQotY29weV90ZXh0PUNvcGlhDQotZGVlcENvcHlfdGV4dD1Db3BpYSBwcm9mb25kYQ0KLWJhY2tfdGV4dD1JbmRpZXRybw0KLW5ld19wbHVnaW49TnVvdm8gcGx1Zy1pbiBkaSBtZXRvZG8NCi1tb3ZlPVNwb3N0YS4uLg0KLXVuaXF1ZUlkX3RleHQ9SUQgdW5pdm9jbzoNCi12YXJpYWJpbGl0eVR5cGVfdGV4dD1UaXBvIGRpIHZhcmlhYmlsaXRcdTAwZTA6DQotdmVyc2lvbl90ZXh0PVZlcnNpb25lOg0KLQ0KLSMgQnV0dG9uIExhYmVscw0KLWFkZEJ1dHRvbl90ZXh0PUFnZ2l1bmdpLi4uDQotYXR0YWNoQnV0dG9uX3RleHQ9QWxsZWdhLi4uDQotYnJvd3NlQnV0dG9uX3RleHQ9U2ZvZ2xpYS4uLg0KLWNoYW5nZVR5cGVCdXR0b25fdGV4dD1Nb2RpZmljYSB0aXBvLi4uDQotY2xlYXJCdXR0b25fdGV4dD1DYW5jZWxsYQ0KLWRlbGV0ZUJ1dHRvbl90ZXh0PUVsaW1pbmENCi1kZXRhY2hCdXR0b25fdGV4dD1TZXBhcmENCi1kaWFncmFtX3NhdmVFcnJvcj1FcnJvcmUgZHVyYW50ZSBpbCBzYWx2YXRhZ2dpbyBkZWwgZGlhZ3JhbW1hDQotZG93bkJ1dHRvbl90ZXh0PUdpXHUwMGY5DQotZGlyZWN0b3J5X3RleHQ9RGlyZWN0b3J5Og0KLW9yZGVyQnV0dG9uX3RleHQ9T3JkaW5hDQotZWRpdEJ1dHRvbl90ZXh0PU1vZGlmaWNhLi4uDQotcmVtb3ZlQnV0dG9uX3RleHQ9UmltdW92aQ0KLXJlbmFtZUFjdGlvbl90ZXh0PVJpbm9taW5hLi4uDQotcmVtb3ZlX3RleHQ9UmltdW92aQ0KLXJlbmFtZV90ZXh0PVJpbm9taW5hDQotU2F2ZUFzX3RleHQ9U2FsdmEgY29uIG5vbWUNCi1zZWxlY3RCdXR0b25fdGV4dD1TZWxlemlvbmEuLi4NCi1kZXNlbGVjdEJ1dHRvbl90ZXh0PURlc2VsZXppb25hDQotdXBCdXR0b25fdGV4dD1TdQ0KLW1ha2VEZWZhdWx0QnV0dG9uX3RleHQ9UmVuZGkgcHJlZGVmaW5pdGENCi12aWV3SGlzdG9yeUJ1dHRvbl90ZXh0PVZpc3VhbGl6emEgY3Jvbm9sb2dpYS4uLg0KLQ0KLSMgUm9sZSBFZGl0b3IgVGFza3MgUGFnZQ0KLXJvbGVUYXNrc1BhZ2Vfc2VjdGlvbk5hbWU9T3BlcmF6aW9uaQ0KLXJvbGVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVF1ZXN0byBydW9sbyBcdTAwZTggbCdlc2VjdXRvcmUgZGVsbGUgc2VndWVudGkgb3BlcmF6aW9uaS4NCi1yb2xlVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPU9wZXJhemlvbmkgZGlzcG9uaWJpbGkNCi1yb2xlVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw9RXNlY3V0b3JlIHByaW1hcmlvOg0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9RXNlY3V0b3JlIGFnZ2l1bnRpdm86DQotcm9sZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNvbm8gc3RhdGUgc2VsZXppb25hdGUgezB9IG9wZXJhemlvbmkuDQotDQotIyBSb2xlIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Qcm9kb3R0aSBkaSBsYXZvcm86DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVNwZWNpZmljYXJlIGkgcHJvZG90dGkgZGkgbGF2b3JvIGRpIGN1aSBcdTAwZTggcmVzcG9uc2FiaWxlIHF1ZXN0byBydW9sby4NCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1Qcm9kb3R0aSBkaSBsYXZvcm8gZGlzcG9uaWJpbGk6DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1SZXNwb25zYWJpbGUgZGk6DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9UHJvZG90dGkgZGkgbGF2b3JvIGNoZSBzb25vIGdsaSBvdXRwdXQgZGVsbGUgb3BlcmF6aW9uaSBlc2VndWl0ZSBkYSBxdWVzdG8gcnVvbG86DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1Tb25vIHN0YXRpIHNlbGV6aW9uYXRpIHswfSBwcm9kb3R0aSBkaSBsYXZvcm8uDQotDQotIyBSb2xlIEVkaXRvciBHdWlkYW5jZSBQYWdlDQotcm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1HdWlkYQ0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUZvcm5pcmUgY29sbGVnYW1lbnRpIGEgaW5mb3JtYXppb25pIGFnZ2l1bnRpdmUgc290dG8gZm9ybWEgZGkgZ3VpZGEuDQotcm9sZUd1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1HdWlkYSBkaXNwb25pYmlsZToNCi1yb2xlR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9R3VpZGE6DQotcm9sZUd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNvbm8gc3RhdGUgc2VsZXppb25hdGUgezB9IGd1aWRlLg0KLQ0KLSMgUm9sZSBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPUNhdGVnb3JpZToNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlc3RpcmUgbGUgY2F0ZWdvcmllIGEgY3VpIGFwcGFydGllbmUgcXVlc3RvIHJ1b2xvLg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1JbnNpZW1pIGRpIHJ1b2xpOg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9Q2F0ZWdvcmllIHBlcnNvbmFsaXp6YXRlOg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPUluc2llbWkgZGkgcnVvbGk6DQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPUNhdGVnb3JpZSBwZXJzb25hbGl6emF0ZToNCi0NCi0jIFRhc2sgRWRpdG9yIFJvbGVzIFBhZ2UNCi10YXNrUm9sZXNQYWdlX3NlY3Rpb25OYW1lPVJ1b2xpDQotdGFza1JvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QXNzZWduYXJlIGkgcnVvbGkgcGVyIGVzZWd1aXJlIHF1ZXN0YSBvcGVyYXppb25lLg0KLXRhc2tSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9UnVvbGkgZGlzcG9uaWJpbGk6DQotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsPUVzZWN1dG9yZSBwcmltYXJpbzoNCi10YXNrUm9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPUVzZWN1dG9yaSBhZ2dpdW50aXZpOg0KLXRhc2tSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1Tb25vIHN0YXRpIHNlbGV6aW9uYXRpIHswfSBydW9saS4NCi10YXNrUm9sZXNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbW9kaWZ5X21lc3NhZ2U9SVVQQTAwMDQ1VzogTW9kaWZpY2FyZSBsJydlc2VjdXRvcmUgcHJpbWFyaW8gaW4gJyd7MH0nJz8NCi10YXNrUm9sZXNQYWdlX2NvbmZpcm1fdGl0bGU9Q29uZmVybWFyZSBsYSBtb2RpZmljYSBkZWwgcnVvbG8gcHJpbWFyaW8NCi0NCi0jIFRhc2sgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVByb2RvdHRpIGRpIGxhdm9ybw0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1TcGVjaWZpY2FyZSBpIHByb2RvdHRpIGRpIGxhdm9ybyBpbnB1dCBlIG91dHB1dCBwZXIgcXVlc3RhIG9wZXJhemlvbmUuDQotdGFza1dvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9UHJvZG90dGkgZGkgbGF2b3JvIGRpc3BvbmliaWxpOg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9SW5wdXQgb2JibGlnYXRvcmk6DQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9SW5wdXQgZmFjb2x0YXRpdmk6DQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDM9T3V0cHV0Og0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U29ubyBzdGF0aSBzZWxlemlvbmF0aSB7MH0gcHJvZG90dGkgZGkgbGF2b3JvLg0KLQ0KLSMgVGFzayBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLXRhc2tHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU9R3VpZGENCi10YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Gb3JuaXJlIGNvbGxlZ2FtZW50aSBhIGluZm9ybWF6aW9uaSBhZ2dpdW50aXZlIHNvdHRvIGZvcm1hIGRpIGd1aWRhLg0KLXRhc2tHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9R3VpZGEgZGlzcG9uaWJpbGU6DQotdGFza0d1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsPUd1aWRhOg0KLXRhc2tHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1Tb25vIHN0YXRlIHNlbGV6aW9uYXRlIHswfSBndWlkZS4NCi0NCi0jIFRhc2sgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQ0KLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1DYXRlZ29yaWUNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlc3RpcmUgbGUgY2F0ZWdvcmllIGEgY3VpIGFwcGFydGllbmUgcXVlc3RhIG9wZXJhemlvbmUuDQotdGFza0NhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPURpc2NpcGxpbmUNCi10YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyPUNhdGVnb3JpZSBwZXJzb25hbGl6emF0ZQ0KLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPURpc2NpcGxpbmU6DQotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPUNhdGVnb3JpZSBwZXJzb25hbGl6emF0ZToNCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgVGFza3MgUGFnZQ0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25OYW1lPU9wZXJhemlvbmkNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uRGVzY3JpcHRpb249UXVlc3RvIHByb2RvdHRvIGRpIGxhdm9ybyBcdTAwZTggdW4gaW5wdXQgb3BwdXJlIHVuIG91dHB1dCBwZXIgbGUgc2VndWVudGkgb3BlcmF6aW9uaS4NCi1Xb3JrUHJvZHVjdF9UYXNrc19BdmFpbGFibGVMYWJlbD1PcGVyYXppb25pIGRpc3BvbmliaWxpDQotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbD1JbnB1dCBvYmJsaWdhdG9yaW86DQotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDI9SW5wdXQgZmFjb2x0YXRpdm86DQotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDM9T3V0cHV0Og0KLVdvcmtQcm9kdWN0X1Rhc2tzX011bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U29ubyBzdGF0ZSBzZWxlemlvbmF0ZSB7MH0gb3BlcmF6aW9uaS4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgUm9sZXMgUGFnZQ0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25OYW1lPVJ1b2xpDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUkgc2VndWVudGkgcnVvbGkgc29ubyByZXNwb25zYWJpbGkgb3BwdXJlIG1vZGlmaWNhbm8gcXVlc3RvIHByb2RvdHRvIGRpIGxhdm9yby4NCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1SdW9saSBkaXNwb25pYmlsaQ0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9UnVvbG8gcmVzcG9uc2FiaWxlOg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPU1vZGlmaWNhIGRlaSBydW9saToNCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNvbm8gc3RhdGkgc2VsZXppb25hdGkgezB9IHJ1b2xpLg0KLQ0KLSMjIFdvcmsgUHJvZHVjdCBFZGl0b3IgRGVsaXZlcmFibGUgUGFydHMgUGFnZQ0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbk5hbWU9UGFydGkgZGlzdHJpYnVpYmlsaQ0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVNwZWNpZmljYXJlIGkgcHJvZG90dGkgZGkgbGF2b3JvIGNoZSBjb3N0aXR1aXNjb25vIHF1ZXN0byBjb21wb25lbnRlIGRpc3RyaWJ1aWJpbGUuDQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9hdmFpbGFibGVMYWJlbD1Qcm9kb3R0aSBkaSBsYXZvcm8gZGlzcG9uaWJpbGkgY29tZSBwYXJ0aSBkaXN0cmlidWliaWxpOg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Qcm9kb3R0aSBkaSBsYXZvcm8gY29tZSBwYXJ0aSBkaXN0cmlidWliaWxpOg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1Tb25vIHN0YXRpIHNlbGV6aW9uYXRpIHswfSBwcm9kb3R0aSBkaSBsYXZvcm8uDQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1HdWlkYQ0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Gb3JuaXJlIGNvbGxlZ2FtZW50aSBhIGluZm9ybWF6aW9uaSBhZ2dpdW50aXZlIHNvdHRvIGZvcm1hIGRpIGd1aWRhLg0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPUd1aWRhIGRpc3BvbmliaWxlOg0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9R3VpZGE6DQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1Tb25vIHN0YXRlIHNlbGV6aW9uYXRlIHswfSBndWlkZS4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1DYXRlZ29yaWUNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXN0aXJlIGxlIGNhdGVnb3JpZSBhIGN1aSBhcHBhcnRpZW5lIHF1ZXN0byBwcm9kb3R0byBkaSBsYXZvcm8uDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1Eb21pbmkNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1UaXBpIGRpIHByb2RvdHRpIGRpIGxhdm9ybzoNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMz1DYXRlZ29yaWUgcGVyc29uYWxpenphdGU6DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPURvbWluaW86DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1UaXBpIGRpIHByb2RvdHRpIGRpIGxhdm9ybzoNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwzPUNhdGVnb3JpZSBwZXJzb25hbGl6emF0ZToNCi0NCi0jIFByYWN0aWNlIEVkaXRvciBSZWZlcmVuY2VzIFBhZ2UNCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25OYW1lPUVsZW1lbnRpIGRlbCBjb250ZW51dG8NCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1TcGVjaWZpY2FyZSBnbGkgZWxlbWVudGkgZGVsIGNvbnRlbnV0byBjdWkgZmEgcmlmZXJpbWVudG8gcXVlc3RhIHByYXRpY2EuDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9hdmFpbGFibGVMYWJlbD1FbGVtZW50aSBkZWwgY29udGVudXRvIGRpc3BvbmliaWxpOg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1FbGVtZW50aSBkZWwgY29udGVudXRvOg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1Tb25vIHN0YXRpIHNlbGV6aW9uYXRpIHswfSBlbGVtZW50aSBkZWwgY29udGVudXRvLg0KLQ0KLSMgQ2F0ZWdvcnkgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbk5hbWU9R3VpZGENCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlc3RpcmUgbGUgZ3VpZGUgY2hlIGFwcGFydGVuZ29ubyBhIHF1ZXN0byB7MH0uDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUd1aWRhIGRpc3BvbmliaWxlOg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsPUd1aWRhOg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNvbm8gc3RhdGUgc2VsZXppb25hdGUgezB9IGd1aWRlLg0KLQ0KLSMgRGlzY2lwbGluZSBHcm91cGluZyBFZGl0b3IgRGlzY2lwbGluZXMgUGFnZQ0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uTmFtZT1EaXNjaXBsaW5lDQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXN0aXJlIGxlIGRpc2NpcGxpbmUgYSBjdWkgYXBwYXJ0aWVuZSBxdWVzdG8gcmFnZ3J1cHBhbWVudG8gZGkgZGlzY2lwbGluZS4NCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfYXZhaWxhYmxlTGFiZWw9RGlzY2lwbGluZSBkaXNwb25pYmlsaToNCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1EaXNjaXBsaW5lOg0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNvbm8gc3RhdGUgc2VsZXppb25hdGUgezB9IGRpc2NpcGxpbmUuDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Vc2VEZWZhdWx0RGlyZWN0b3J5QnV0dG9uTGFiZWw9VXRpbGl6emEgZGlyZWN0b3J5IHByZWRlZmluaXRhDQotDQotIyBEaXNjaXBsaW5lIEVkaXRvciBUYXNrcyBQYWdlDQotZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uTmFtZT1PcGVyYXppb25pDQotZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R2VzdGlyZSBsZSBvcGVyYXppb25pIGNoZSBhcHBhcnRlbmdvbm8gYSBxdWVzdGEgZGlzY2lwbGluYS4NCi1kaXNjaXBsaW5lVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPU9wZXJhemlvbmkgZGlzcG9uaWJpbGk6DQotZGlzY2lwbGluZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsPU9wZXJhemlvbmk6DQotZGlzY2lwbGluZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNvbm8gc3RhdGUgc2VsZXppb25hdGUgezB9IG9wZXJhemlvbmkuDQotDQotIyBEaXNjaXBsaW5lIEVkaXRvciBSZWZlcmVuY2UgV29ya2Zsb3cgUGFnZQ0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbk5hbWU9Rmx1c3NpIGRpIGxhdm9ybyBkaSByaWZlcmltZW50bw0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlc3RpcmUgaSBmbHVzc2kgZGkgbGF2b3JvIGRpIHJpZmVyaW1lbnRvIGNoZSBhcHBhcnRlbmdvbm8gYSBxdWVzdGEgZGlzY2lwbGluYS4NCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX2F2YWlsYWJsZUxhYmVsPUZsdXNzaSBkaSBsYXZvcm8gZGkgcmlmZXJpbWVudG8gZGlzcG9uaWJpbGk6DQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWxlY3RlZExhYmVsPUZsdXNzaSBkaSBsYXZvcm8gZGkgcmlmZXJpbWVudG86DQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNvbm8gc3RhdGkgc2VsZXppb25hdGkgezB9IGZsdXNzaSBkaSByaWZlcmltZW50by4NCi0NCi0jIERvbWFpbiBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Qcm9kb3R0aSBkaSBsYXZvcm8NCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXN0aXJlIGkgcHJvZG90dGkgZGkgbGF2b3JvIGNoZSBhcHBhcnRlbmdvbm8gYSBxdWVzdG8gZG9taW5pby4NCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVByb2RvdHRpIGRpIGxhdm9ybyBkaXNwb25pYmlsaToNCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9UHJvZG90dGkgZGkgbGF2b3JvOg0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1Tb25vIHN0YXRpIHNlbGV6aW9uYXRpIHswfSBwcm9kb3R0aSBkaSBsYXZvcm8uDQotDQotIyBXb3JrIFByb2R1Y3QgS2luZCBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Qcm9kb3R0aSBkaSBsYXZvcm8NCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXN0aXJlIGkgcHJvZG90dGkgZGkgbGF2b3JvIGNoZSBhcHBhcnRlbmdvbm8gYSBxdWVzdG8gdGlwbyBkaSBwcm9kb3R0byBkaSBsYXZvcm8uDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1Qcm9kb3R0aSBkaSBsYXZvcm8gZGlzcG9uaWJpbGk6DQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVByb2RvdHRpIGRpIGxhdm9ybzoNCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U29ubyBzdGF0aSBzZWxlemlvbmF0aSB7MH0gcHJvZG90dGkgZGkgbGF2b3JvLg0KLQ0KLSMgUm9sZSBTZXQgR3JvdXBpbmcgRWRpdG9yIFJvbGUgU2V0cyBQYWdlDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25OYW1lPUluc2llbWkgZGkgcnVvbGkNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlc3RpcmUgZ2xpIGluc2llbWkgZGkgcnVvbGkgY2hlIGFwcGFydGVuZ29ubyBhIHF1ZXN0byByYWdncnVwcGFtZW50byBkaSBpbnNpZW1pIGRpIHJ1b2xpLg0KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9hdmFpbGFibGVMYWJlbD1JbnNpZW1pIGRpIHJ1b2xpIGRpc3BvbmliaWxpOg0KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWxlY3RlZExhYmVsPUluc2llbWkgZGkgcnVvbGk6DQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U29ubyBzdGF0aSBzZWxlemlvbmF0aSB7MH0gaW5zaWVtaSBkaSBydW9saS4NCi0NCi0jIFJvbGUgU2V0IEVkaXRvciBSb2xlcyBQYWdlDQotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uTmFtZT1SdW9saQ0KLXJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlc3RpcmUgaSBydW9saSBjaGUgYXBwYXJ0ZW5nb25vIGEgcXVlc3RvIGluc2llbWUgZGkgcnVvbGkuDQotcm9sZVNldFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1SdW9saSBkaXNwb25pYmlsaToNCi1yb2xlU2V0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9UnVvbGk6DQotcm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVNvbm8gc3RhdGkgc2VsZXppb25hdGkgezB9IHJ1b2xpLg0KLQ0KLSMgVG9vbCBFZGl0b3IgVG9vbCBNZW50b3JzIFBhZ2UNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25OYW1lPUd1aWRhIGFsIHRvb2wNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXN0aXJlIGxlIGd1aWRlIGFpIHRvb2wgY2hlIGFwcGFydGVuZ29ubyBhIHF1ZXN0byB0b29sLg0KLXRvb2xUb29sTWVudG9yc1BhZ2VfYXZhaWxhYmxlTGFiZWw9R3VpZGUgYWkgdG9vbCBkaXNwb25pYmlsaToNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlbGVjdGVkTGFiZWw9R3VpZGUgYWkgdG9vbDoNCi10b29sVG9vbE1lbnRvcnNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U29ubyBzdGF0ZSBzZWxlemlvbmF0ZSB7MH0gZ3VpZGUgYWkgdG9vbC4NCi0NCi0jIEN1c3RvbSBDYXRlZ29yeSBFZGl0b3IgQXNzaWduIFBhZ2UNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbk5hbWU9RWxlbWVudGkgZGVsIGNvbnRlbnV0bw0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R2VzdGlyZSBnbGkgZWxlbWVudGkgZGVsIGNvbnRlbnV0byBjaGUgY29zdGl0dWlzY29ubyBxdWVzdGEgY2F0ZWdvcmlhIHBlcnNvbmFsaXp6YXRhLg0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9hdmFpbGFibGVMYWJlbD1FbGVtZW50aSBkZWwgY29udGVudXRvIGRpc3BvbmliaWxpOg0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWxlY3RlZExhYmVsPUVsZW1lbnRpIGRlbCBjb250ZW51dG86DQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249U29ubyBzdGF0aSBzZWxlemlvbmF0aSB7MH0gZWxlbWVudGkgZGVsIGNvbnRlbnV0by4NCi0NCi0jIE5ldyBNZXRob2QgUGx1Zy1pbiBXaXphcmQNCi1uZXdQbHVnaW5XaXphcmRfdGl0bGU9TnVvdm8gcGx1Zy1pbiBkaSBtZXRvZG8NCi1uZXdQbHVnaW5XaXphcmRQYWdlX3RpdGxlPUNyZWEgbnVvdm8gcGx1Zy1pbiBtZXRvZG8NCi1uZXdQbHVnaW5XaXphcmRQYWdlX3RleHQ9U3BlY2lmaWNhcmUgdW4gbm9tZSBlIGZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHJlbGF0aXZlIGFsIG51b3ZvIHBsdWctaW4gZGkgbWV0b2RvLg0KLW5ld1BsdWdpbkVycm9yX21zZz1JVVBBMDAyMUU6IEltcG9zc2liaWxlIGNyZWFyZSBpbCBwbHVnLWluIGRpIG1ldG9kby4NCi1uZXdQbHVnaW5FcnJvcl9yZWFzb249RXJyb3JlIGludGVybm8uXG5cDQotXG5cDQotRmFyZSBjbGljIHN1IERldHRhZ2xpIHBlciB1bHRlcmlvcmkgaW5mb3JtYXppb25pLg0KLQ0KLSMgR2VuZXJpYyBkaWFsb2cgdGl0bGVzDQotY3JlYXRlRGlhbG9nX3RpdGxlPUNyZWEgZWxlbWVudG8NCi1kZWxldGVEaWFsb2dfdGl0bGU9RWxpbWluYSBlbGVtZW50bw0KLWVkaXREaWFsb2dfdGl0bGU9TW9kaWZpY2EgZWxlbWVudG8NCi1lcnJvckRpYWxvZ190aXRsZT1FcnJvcmUNCi1tb3ZlRGlhbG9nX3RpdGxlPVNwb3N0YSBlbGVtZW50bw0KLXJlbmFtZURpYWxvZ190aXRsZT1SaW5vbWluYSBlbGVtZW50bw0KLXdhcm5pbmdEaWFsb2dfdGl0bGU9QXZ2aXNvDQotDQotIyBBZGQgQ29uZmlndXJhdGlvbiB0byBQcm9jZXNzIEVycm9yIERpYWxvZw0KLWFkZENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPUFnZ2l1bmdpIGNvbmZpZ3VyYXppb25lIGEgcHJvY2Vzc28NCi0NCi0jIFNldCBEZWZhdWx0IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotc2V0RGVmYXVsdENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPUltcG9zdGEgY29uZmlndXJhemlvbmUgcHJlZGVmaW5pdGEgcGVyIHByb2Nlc3NvDQotDQotIyBFZGl0IFByb2Nlc3MgRXJyb3IgRGlhbG9nDQotZWRpdFByb2Nlc3NFbGVtZW50RXJyb3JEaWFsb2dfdGl0bGU9TW9kaWZpY2EgZWxlbWVudG8gcHJvY2Vzc28NCi0NCi0jIE9wZW4gTGlicmFyeSBEaWFsb2cNCi1vcGVuTGlicmFyeURpYWxvZ190aXRsZT1BcHJpIGxpYnJlcmlhIGRlaSBtZXRvZGkNCi1vcGVuTGlicmFyeURpYWxvZ190ZXh0PUxhIGxpYnJlcmlhIGRlaSBtZXRvZGkgY29ycmVudGUgbm9uIFx1MDBlOCBzdGF0YSBzYWx2YXRhIGNvcnJldHRhbWVudGUuIElnbm9yYXJlIGwnZXJyb3JlIGUgYXByaXJlIHVuJ2FsdHJhIGxpYnJlcmlhPw0KLQ0KLSMgU2F2ZSBMaWJyYXJ5IERpYWxvZw0KLXNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlPVNhbHZhIGxpYnJlcmlhIGRlaSBtZXRvZGkNCi1zYXZlTGlicmFyeURpYWxvZ190ZXh0PUxhIGxpYnJlcmlhIGRlaSBtZXRvZGkgY29ycmVudGUgXHUwMGU4IHN0YXRhIG1vZGlmaWNhdGEuIFNhbHZhcmUgbGUgbW9kaWZpY2hlPw0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPUFnZ2lvcm5hIGxpYnJlcmlhIGRlaSBtZXRvZGkNCi0NCi0jIERlbGV0ZSBFbGVtZW50IFJlZmVyZW5jZSBEaWFsb2cNCi1kZWxldGVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PUwnJ2VsZW1lbnRvICcnezB9JycgXHUwMGU4IHN0YXRvIGdpXHUwMGUwIGVsaW1pbmF0by4gUmltdW92ZXJsbyBkYSAnJ3sxfScnPw0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1ub09wZW5MaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDAwRTogTmVzc3VuYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGFwZXJ0YS5cblwNCi1cblwNCi1QcmltYSBkaSBwb3RlciBhZ2dpdW5nZXJlIHVuIG51b3ZvIGVsZW1lbnRvIG1ldG9kbywgXHUwMGU4IG5lY2Vzc2FyaW8gYXByaXJlIHVuYSBsaWJyZXJpYSBkZWkgbWV0b2RpLlxuXA0KLVxuXA0KLUNyZWFyZSB1bmEgbnVvdmEgbGlicmVyaWEgZGVpIG1ldG9kaSBvcHB1cmUgYXByaXJuZSB1bmEgZXNpc3RlbnRlIGUgcHJvdmFyZSBkaSBudW92by4NCi1lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEEwMDAxRTogSWwgbm9tZSB7MH0gbWFuY2EuXG5cDQotXG5cDQotVHV0dGkgZ2xpIGVsZW1lbnRpIGRpIG1ldG9kbyBlIGRpIHByb2Nlc3NvIGRldm9ubyBhdmVyZSB1biBub21lLlxuXA0KLVxuXA0KLUZhcmUgY2xpYyBzdSBPSyBlIGltbWV0dGVyZSB1biBub21lIHZhbGlkbyBwZXIgbCcnZWxlbWVudG8uDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDJFOiBJbCBub21lICcnezB9JycgZXNpc3RlIGdpXHUwMGUwLlxuXA0KLVxuXA0KLUdsaSBlbGVtZW50aSBkaSBtZXRvZG8gZGV2b25vIGF2ZXJlIHVuIG5vbWUgdW5pdm9jby5cblwNCi1cblwNCi1GYXJlIGNsaWMgc3UgT0sgZSBpbW1ldHRlcmUgdW4gbm9tZSBkaWZmZXJlbnRlIHBlciBsJydlbGVtZW50by4NCi1jcmVhdGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDNFOiBJbXBvc3NpYmlsZSBjcmVhcmUgbGEgY29uZmlndXJhemlvbmUgZGkgbWV0b2RvLg0KLWRlbGV0ZUNvbmZpZ0Vycm9yX21zZz1JVVBBMDAwNFc6IEltcG9zc2liaWxlIGVsaW1pbmFyZSBsYSBjb25maWd1cmF6aW9uZSBkaSBtZXRvZG8uDQotaW50ZXJuYWxFcnJvcl9tc2c9SVVQQTAwMDVFOiBTaSBcdTAwZTggdmVyaWZpY2F0byB1biBlcnJvcmUgaW50ZXJuby5cblwNCi1cblwNCi1GYXJlIGNsaWMgc3UgRGV0dGFnbGkgcGVyIHVsdGVyaW9yaSBpbmZvcm1hemlvbmkuDQotaW52YWxpZFByZXNlbnRhdGlvbk5hbWVFcnJvcl9tc2c9SVVQQTAwMDZFOiBJbCBub21lIGRlbGxhIHByZXNlbnRhemlvbmUgc3BlY2lmaWNhdG8gbm9uIFx1MDBlOCB2YWxpZG8uXG5cDQotXG5cDQotRmFyZSBjbGljIHN1IE9LIGUgaW1tZXR0ZXJlIHVuIG5vbWUgZGlmZmVyZW50ZS4NCi1pbnZhbGlkQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDA3RTogTGEgY29uZmlndXJhemlvbmUgZGkgbWV0b2RvIHNlbGV6aW9uYXRhICcnezB9Jycgbm9uIFx1MDBlOCB1biBzb3R0b2luc2llbWUgZGVsbGEgY29uZmlndXJhemlvbmUgcHJlZGVmaW5pdGEgZGVsIHByb2Nlc3NvLlxuXA0KLVxuXA0KLVBlciBnYXJhbnRpcmUgbCcnaW50ZWdyaXRcdTAwZTAgZGkgdW4gcHJvY2Vzc28sIFx1MDBlOCBuZWNlc3NhcmlvIGNoZSBsYSBzdWEgY29uZmlndXJhemlvbmUgcHJlZGVmaW5pdGEgc2lhIHVuIHN1cGVyaW5zaWVtZSBkaSB0dXR0ZSBsZSBhbHRyZSBjb25maWd1cmF6aW9uaSBhc3NvY2lhdGUgYWwgcHJvY2Vzc28uXG5cDQotXG5cDQotU2VsZXppb25hcmUgdW4nJ2FsdHJhIGNvbmZpZ3VyYXppb25lIG9wcHVyZSBtb2RpZmljYXJlIGxhIGNvbmZpZ3VyYXppb25lIHByZWRlZmluaXRhIHBlciBpbmNsdWRlcmUgaWwgY29udGVudXRvIGRlbGxhIGNvbmZpZ3VyYXppb25lIGUgcHJvdmFyZSBkaSBudW92by4NCi1zZXREZWZhdWx0Q29uZmlnRXJyb3JfbXNnPUlVUEEwMDA4RTogTGEgY29uZmlndXJhemlvbmUgZGkgbWV0b2RvIHNlbGV6aW9uYXRhICcnezB9Jycgbm9uIFx1MDBlOCB1biBzdXBlcmluc2llbWUgZGVsbGUgYWx0cmUgY29uZmlndXJhemlvbmkgY3VpIGZhIHJpZmVyaW1lbnRvIGlsIHByb2Nlc3NvLlxuXA0KLVxuXA0KLVBlciBnYXJhbnRpcmUgbCcnaW50ZWdyaXRcdTAwZTAgZGkgdW4gcHJvY2Vzc28sIFx1MDBlOCBuZWNlc3NhcmlvIGNoZSBsYSBzdWEgY29uZmlndXJhemlvbmUgcHJlZGVmaW5pdGEgc2lhIHVuIHN1cGVyaW5zaWVtZSBkaSB0dXR0ZSBsZSBhbHRyZSBjb25maWd1cmF6aW9uaSBhc3NvY2lhdGUgYWwgcHJvY2Vzc28uXG5cDQotXG5cDQotU2VsZXppb25hcmUgdW4nJ2FsdHJhIGNvbmZpZ3VyYXppb25lIG9wcHVyZSBtb2RpZmljYXJlIGlsIGNvbnRlbnV0byBkZWxsYSBjb25maWd1cmF6aW9uZSBzZWxlemlvbmF0YSBlIHByb3ZhcmUgZGkgbnVvdm8uDQotb3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDlFOiBJbXBvc3NpYmlsZSBjYXJpY2FyZSBsYSBsaWJyZXJpYSBkZWkgbWV0b2RpLlxuXA0KLVxuXA0KLUZhcmUgY2xpYyBzdSBEZXR0YWdsaSBwZXIgdWx0ZXJpb3JpIGluZm9ybWF6aW9uaS4NCi1zYXZlTGlicmFyeUVycm9yX21zZz1JVVBBMDAxMEU6IEltcG9zc2liaWxlIHNhbHZhcmUgbGEgbGlicmVyaWEgZGVpIG1ldG9kaS4NCi1zYXZlTGlicmFyeVRvRXJyb3JfbXNnPUlVUEEwMDEwRTogSW1wb3NzaWJpbGUgc2FsdmFyZSBsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGluICcnezB9JycuDQotZWxlbWVudEFscmVhZHlEZWxldGVkRXJyb3JfbXNnPUlVUEEwMDExRTogTCcnZWxlbWVudG8gJyd7MH0nJyBcdTAwZTggc3RhdG8gZ2lcdTAwZTAgZWxpbWluYXRvLg0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEyRTogSW1wb3NzaWJpbGUgYWdnaW9ybmFyZSBsYSBsaWJyZXJpYSBkZWkgbWV0b2RpLg0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVycm9yX3JlYXNvbj1JVVBBMDAxNkU6IFNpIFx1MDBlOCB2ZXJpZmljYXRvIHVuIGVycm9yZS5cblwNCi1cblwNCi1GYXJlIGNsaWMgc3UgRGV0dGFnbGkgcGVyIHVsdGVyaW9yaSBpbmZvcm1hemlvbmkuDQotaW50ZXJuYWxFcnJvcl9yZWFzb249SVVQQTAwMTdFOiBTaSBcdTAwZTggdmVyaWZpY2F0byB1biBlcnJvcmUgaW50ZXJuby5cblwNCi1cblwNCi1GYXJlIGNsaWMgc3UgRGV0dGFnbGkgcGVyIHVsdGVyaW9yaSBpbmZvcm1hemlvbmkuDQotdXBncmFkZUxpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMThFOiBTaSBcdTAwZTggdmVyaWZpY2F0byB1biBlcnJvcmUgZHVyYW50ZSBpbCBjYXJpY2FtZW50byBkZWdsaSBlbGVtZW50aSBkZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpLlxuXA0KLVxuXA0KLUZhcmUgY2xpYyBzdSBEZXR0YWdsaSBwZXIgdWx0ZXJpb3JpIGluZm9ybWF6aW9uaS4NCi1zYXZlVXBncmFkZWRMaWJyYXJ5RXJyb3JfcmVhc29uPUlVUEEwMDE5RTogU2kgXHUwMGU4IHZlcmlmaWNhdG8gdW4gZXJyb3JlIGR1cmFudGUgaWwgc2FsdmF0YWdnaW8gZGVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBhZ2dpb3JuYXRhLlxuXA0KLVxuXA0KLUZhcmUgY2xpYyBzdSBEZXR0YWdsaSBwZXIgdWx0ZXJpb3JpIGluZm9ybWF6aW9uaS4NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9QXBlcnR1cmEgZGVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBpbiBjb3Jzby4uLg0KLXNhdmluZ0xpYnJhcnlUYXNrX25hbWU9U2FsdmF0YWdnaW8gZGVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBpbiBjb3Jzby4uLg0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9QWdnaW9ybmFtZW50byBkZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGluIGNvcnNvLi4uDQotbG9hZGluZ0xpYnJhcnlFbGVtZW50c1Rhc2tfbmFtZT1DYXJpY2FtZW50byBkZWdsaSBlbGVtZW50aSBkZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGluIGNvcnNvLi4uDQotc2F2aW5nVXBncmFkZWRFbGVtZW50c1Rhc2tfbmFtZT1TYWx2YXRhZ2dpbyBkZWdsaSBlbGVtZW50aSBkZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIG5lbCBudW92byBmb3JtYXRvIGZpbGUgaW4gY29yc28uLi4NCi1zYXZpbmdUYXNrX25hbWU9U2FsdmF0YWdnaW8gZGkgJyd7MH0nJyBpbiBjb3Jzby4uLg0KLXNhdmluZ0ZpbGVzVGFza19uYW1lPVNhbHZhdGFnZ2lvIGRlaSBmaWxlIGluIGNvcnNvLi4uDQotZml4aW5nQ29udGVudERlc2NyaXB0aW9uR1VJRHNUYXNrX25hbWU9Q29ycmV6aW9uZSBkZWkgR1VJRCBkZWxsZSBkZXNjcml6aW9uaSBkZWwgY29udGVudXRvIGluIGNvcnNvLi4uDQotZGVsZXRpbmdJbnZhbGlkUmVmZXJlbmNlc1Rhc2tfbmFtZT1FbGltaW5hemlvbmUgZGVpIHJpZmVyaW1lbnRpIG5vbiB2YWxpZGkgaW4gY29yc28uLi4NCi0NCi0NCi0jIEFkZCBFZGl0b3IgVG8gQnJvd3NpbmcgUGVyc3BlY3RpdmUgV2FybmluZyBEaWFsb2cNCi1hZGRFZGl0b3JUb1BlcnNwZWN0aXZlV2FybmluZ19tc2c9SVVQQTAwNDZXOiBRdWVzdGEgcHJvc3BldHRpdmEgXHUwMGU4IHN0YXRhIHByb2dldHRhdGEgYXBwb3NpdGFtZW50ZSBwZXIgYWdldm9sYXJlIGdsaSB1dGVudGkgbmVsbGEgdmlzdWFsaXp6YXppb25lIGRlbGxlIHJhcHByZXNlbnRhemlvbmkgSFRNTCBkZWdsaSBlbGVtZW50aSBkZWxsZSBsaWJyZXJpZSBkZWkgbWV0b2RpLiBOb24gXHUwMGU4IHBvc3NpYmlsZSBhZ2dpdW5nZXJlIG8gdmlzdWFsaXp6YXJlIGFsY3VuIGVkaXRvci4NCi0NCi0jIENoYW5nZSBIaXN0b3J5IERpYWxvZw0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfdGl0bGU9TW9kaWZpY2EgY3Jvbm9sb2dpYSBkZXNjcml6aW9uZQ0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfbGFiZWw9TW9kaWZpY2EgY3Jvbm9sb2dpYToNCi0NCi0jIE1ldGhvZCBFbGVtZW50IERlbGV0ZSBBY3Rpb24NCi1jb25maXJtRGVsZXRlRGlhbG9nX3RpdGxlPUNvbmZlcm1hIGVsaW1pbmF6aW9uZQ0KLWNvbmZpcm1EZWxldGVEaWFsb2dfbXNnPUVsaW1pbmFyZSAnJ3swfScnPw0KLWNvbmZpcm1EZWxldGVEaWFsb2dfbXNnV2l0aFJlZmVyZW5jZT1FbGltaW5hcmUgJyd7MH0nJz9cblwNCi1cblwNCi1JIHNlZ3VlbnRpIGVsZW1lbnRpIGNvbnRlbmdvbm8gcmlmZXJpbWVudGkgYWQgZWxlbWVudGkgY2hlIGRldm9ubyBlc3NlcmUgZWxpbWluYXRpOiB7MX0NCi0NCi0jIE5ldyBMaWJyYXJ5IERpYWxvZw0KLWVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjJFOiBJbXBvc3NpYmlsZSBjcmVhcmUgbGEgbGlicmVyaWEgZGVpIG1ldG9kaSAnJ3swfScnLg0KLWVycm9yRGlhbG9nX2Vycm9yPUltcG9zc2liaWxlIGNyZWFyZSB1bmEgbGlicmVyaWEgZGVpIG1ldG9kaSBpbiB1bidhbHRyYSBsaWJyZXJpYSBkZWkgbWV0b2RpLg0KLWVycl9ub29wZW5saWJyYXJ5PUlVUEEwMDQwRTogTmVzc3VuYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGFwZXJ0YS5cblwNCi1cblwNCi1QcmltYSBkaSBwb3RlciBhZ2dpdW5nZXJlIHVuIG51b3ZvIHBsdWctaW4gZGkgbWV0b2RvLCBcdTAwZTggbmVjZXNzYXJpbyBhcHJpcmUgdW5hIG51b3ZhIGxpYnJlcmlhIGRlaSBtZXRvZGkuXG5cDQotXG5cDQotQ3JlYXJlIHVuYSBudW92YSBsaWJyZXJpYSBkZWkgbWV0b2RpIG9wcHVyZSBhcHJpcm5lIHVuYSBlc2lzdGVudGUgZSBwcm92YXJlIGRpIG51b3ZvLg0KLWVycl9sb2FkaW5nbGlicmFyeT1FcnJvcmUgZHVyYW50ZSBpbCBjYXJpY2FtZW50byBkZWxsYSBsaWJyZXJpYQ0KLW1zZ19yZWxvYWRMaWJyYXJ5PUVycm9yZSBkdXJhbnRlIGwnYW5udWxsYW1lbnRvIGRlbGwnb3BlcmF6aW9uZSBkaSBlbGltaW5hemlvbmUgbm9uIHJpdXNjaXRhLiBPY2NvcnJlIHJpY2FyaWNhcmUgbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBjb3JyZW50ZS4NCi0NCi0jIFJlbG9hZCBMaWJyYXJ5IERpYWxvZw0KLXJlbG9hZERpYWxvZ19tZXNzYWdlPUxhIGxpYnJlcmlhIGRldmUgZXNzZXJlIHJpY2FyaWNhdGEgcGVyIHJpcHJpc3RpbmFybmUgbG8gc3RhdG8gb3JpZ2luYWxlLg0KLXJlbG9hZERpYWxvZ190aXRsZT1SaWNhcmljYSBsaWJyZXJpYQ0KLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvclRpdGxlPUVycm9yZSBkaSBzcG9zdGFtZW50bw0KLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvck1lc3NhZ2U9RXJyb3JlIGR1cmFudGUgbG8gc3Bvc3RhbWVudG8NCi0NCi0jIFByb2Nlc3MgRm9ybSBFZGl0b3INCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU9U2FsdmENCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTE9UXVlc3RhIG1vZGlmaWNhIGludGVyZXNzZXJcdTAwZTAgdHV0dGkgaSBkaWFncmFtbWkgZGVsIHByb2Nlc3NvLiBMJ2VkaXRvciB2ZXJyXHUwMGUwIHNhbHZhdG8gZG9wbyBsZSBtb2RpZmljaGUuIENvbnRpbnVhcmU/DQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UyPUwnZWRpdG9yIHZlcnJcdTAwZTAgc2FsdmF0byBkb3BvIGxlIG1vZGlmaWNoZS4gQ29udGludWFyZT8NCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBQYWdlDQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX3RpdGxlPUNvbmZlcm1hIHJpbW96aW9uZQ0KLWNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ19tZXNzYWdlPVJpbXVvdmVyZSBsYSB2aXN0YSAnJ3swfScnPw0KLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ190aXRsZT1BdnZpc28NCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uPUNvbmZpZ3VyYXppb25lOg0KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3cz1WaXN0ZSBkaSBjb25maWd1cmF6aW9uZQ0KLWNvbmZpZ1ZpZXdQYWdlX3ZpZXdzPVZpc3RlDQotY29sdW1uc2VsZWN0aW9uX3RleHQ9U2VsZXppb25lIGNvbG9ubmE6DQotY29uZmlnVmlld1BhZ2VfYWRkVmlld0J1dHRvblRleHQ9QWdnaXVuZ2kgdmlzdGEuLi4NCi1jb25maWdWaWV3UGFnZV9yZW1vdmVWaWV3QnV0dG9uVGV4dD1SaW11b3ZpIHZpc3RhDQotY29uZmlnVmlld1BhZ2VfbWFrZURlZmF1bHRCdXR0b25UZXh0PVJlbmRpIHByZWRlZmluaXRhDQotY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNXOiBMYSB2aXN0YSBjb24gaWwgbm9tZSAnJ3swfScnIGVzaXN0ZSBnaVx1MDBlMC4NCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25UaXRsZT1WaXN0ZSBkaSBuYXZpZ2F6aW9uZSBwdWJibGljYXRlDQotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdTZWN0aW9uTWVzc2FnZT1TcGVjaWZpY2FyZSBsZSB2aXN0ZSBjaGUgdmVycmFubm8gaW5jbHVzZSBxdWFuZG8gcXVlc3RhIHB1YmJsaWNhemlvbmUgdmVyclx1MDBlMCBwdWJibGljYXRhLiBQZXIgY3JlYXJlIHVuYSB2aXN0YSwgZmFyZSBjbGljIHN1IEFnZ2l1bmdpIHZpc3RhIHBlciBzZWxlemlvbmFyZSBxdWFsc2lhc2kgY2F0ZWdvcmlhIHN0YW5kYXJkIG8gcGVyc29uYWxpenphdGEgYWxsJ2ludGVybm8gZGVsbGEgY29uZmlndXJhemlvbmUuICBMYSBjYXRlZ29yaWEgc2VsZXppb25hdGEgcmFwcHJlc2VudGVyXHUwMGUwIGxhIHZpc3RhLCBsZSBzb3R0b2NhdGVnb3JpZSBkZWxsYSBjYXRlZ29yaWEgZSBnbGkgZWxlbWVudGkgZGVsIGNvbnRlbnV0byByYXBwcmVzZW50ZXJhbm5vIGdsaSBlbGVtZW50aSBkZWxsYSBzdHJ1dHR1cmEgZGVsbGEgdmlzdGEuDQotDQotIyBEZXNjcmlwdGlvbiBUYWINCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ190aXRsZT1Db252ZXJ0aSBndWlkYQ0KLWRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UxPUlVUEEwMDQwVzogIFNhbHZhcmUgcHJpbWEgbCdlZGl0b3IuDQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTI9Tm9uIGNpIHNvbm8gZ3VpZGUgY29tcGF0aWJpbGkgcGVyIHF1ZXN0byB0aXBvLg0KLQ0KLWNoYW5nZUFjdGl2aXR5VHlwZVdhcm5pbmdEaWFsb2dfdGl0bGU9Q29udmVydGkgYXR0aXZpdFx1MDBlMA0KLSMgQXNzb2NpYXRpb24gRm9ybSBQYWdlDQotQXNzb2NpYXRpb25Gb3JtUGFnZV9CcmllZkRlc2NyaXB0aW9uTGFiZWw9QnJldmUgZGVzY3JpemlvbmUgZGVsbCdlbGVtZW50byBzZWxlemlvbmF0bzoNCi0NCi0jIE1ldGhvZCBFbGVtZW50IERlc2NyaXB0aW9uDQotbWV0aG9kRWxlbWVudERlc2NyaXB0aW9uRW1wdHlOYW1lRGlhbG9nX3RpdGxlPUltbWV0dGVyZSBub21lIGVsZW1lbnRvDQotbWV0aG9kRWxlbWVudERlc2NyaXB0aW9uRW1wdHlOYW1lRGlhbG9nX21lc3NhZ2U9SWwgY2FtcG8gbm9tZSBub24gcHVcdTAwZjIgZXNzZXJlIHZ1b3RvLg0KLQ0KLSMgTWV0aG9kIFBsdWctaW4gRGVzY3JpcHRpb24NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblJlbW92ZVJlZkNvbmZpcm1fbWVzc2FnZT1EZXNlbGV6aW9uYW5kbyBpIHBsdWctaW4gYSBjdWkgdmllbmUgZmF0dG8gcmlmZXJpbWVudG8gZSBjaGUgc29ubyBhc3NvY2lhdGkgYWwgcGx1Zy1pbiAnJ3swfScnLCB2ZW5nb25vIGdlbmVyYXRlIHJlbGF6aW9uaSBub24gdmFsaWRlIGNoZSB2ZXJyYW5ubyBlbGltaW5hdGUuXG5cDQotXG5cDQotUXVlc3RhIGF6aW9uZSBub24gcHVcdTAwZjIgZXNzZXJlIGFubnVsbGF0YS4gUHJvY2VkZXJlIGNvbiBxdWVzdGEgbW9kaWZpY2E/DQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWU9U2kgc3RhIHBlciBtb2RpZmljYXJlIGlsIG5vbWUgZGkgcXVlc3RvIHBsdWctaW4gZGkgbWV0b2RvIGRhICcnezB9JycgbmVsIG51b3ZvIG5vbWUgJyd7MX0nJy4gUXVlc3RhIGF6aW9uZSBzYWx2YSBsJydlZGl0b3IgZSByaW5vbWluYSBsYSBjYXJ0ZWxsYSBkZWkgcGx1Zy1pbi4gQ29udGludWFyZT8NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZV90aXRsZT1SaW5vbWluYSBwbHVnLWluIGRpIG1ldG9kbw0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jYW5ub3RSZW5hbWVQbHVnaW5Gb2xkZXI9SW1wb3NzaWJpbGUgcmlub21pbmFyZSBsYSBjYXJ0ZWxsYSBkZWkgcGx1Zy1pbiBjb24gdW4gbnVvdm8gbm9tZQ0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luTGFiZWw9QmxvY2NhIHBsdWctaW4NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbl9tZXNzYWdlPURvcG8gYXZlciBibG9jY2F0byBpbCBwbHVnLWluLCBnbGkgZWRpdG9yIGRlZ2xpIGVsZW1lbnRpIGNoZSBhcHBhcnRlbmdvbm8gYWwgcGx1Zy1pbiAnJ3swfScnIHZlcnJhbm5vIHNhbHZhdGkgZSBjaGl1c2kuIFByb2NlZGVyZSBjb24gcXVlc3RhIG1vZGlmaWNhPw0KLQ0KLSMgUHJvY2VzcyBEZXNjcmlwdGlvbg0KLXByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX3RpdGxlPVJpbm9taW5hDQotcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fbWVzc2FnZT1TaSBzdGEgcGVyIG1vZGlmaWNhcmUgaWwgbm9tZSBkaSBxdWVzdG8gcHJvY2Vzc28uIEluIHRhbCBtb2RvLCBsJ2VkaXRvciB2ZXJyXHUwMGUwIHNhbHZhdG8gZSBsYSBjYXJ0ZWxsYSBkZWkgcHJvY2Vzc2kgdmVyclx1MDBlMCByaW5vbWluYXRhLiBDb250aW51YXJlPw0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uRGVzY3JpcHRpb249RGVzY3JpemlvbmU6DQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uVGl0bGU9Q29uZmlndXJhemlvbmUNCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25NZXNzYWdlPVNwZWNpZmljYXJlIHR1dHRlIGxlIGNvbmZpZ3VyYXppb25pIHZhbGlkZSBwZXIgcXVlc3RvIHByb2Nlc3NvLiBTZWxlemlvbmFyZSB1bmEgY29uZmlndXJhemlvbmUgY29tZSBwcmVkZWZpbml0YTsgZGV2ZSBlc3NlcmUgdW5hIHN1cGVyc2VyaWUgZGkgdHV0dGUgbGUgYWx0cmUgY29uZmlndXJhemlvbmkuDQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25zPUNvbmZpZ3VyYXppb25pOg0KLXByb2Nlc3NEZXNjcmlwdGlvbl9kZWZhdWx0PShwcmVkZWZpbml0YSkNCi1Qcm9jZXNzRGVzY3JpcHRpb25fc2VsZWN0Q29uZmlndXJhdGlvbj1TZWxlemlvbmEgY29uZmlndXJhemlvbmkgZGEgYWdnaXVuZ2VyZQ0KLVByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQwPUluIHRhbCBtb2RvLCBsJydlZGl0b3IgY29ycmVudGUgdmVyclx1MDBlMCBzYWx2YXRvIGUgbGEgbW9kaWZpY2Egc2FyXHUwMGUwIHBlcm1hbmVudGUuIEVsaW1pbmFyZSAnJ3swfScnPw0KLVByb2Nlc3NEZWxldGVBY3Rpb25fc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZT1JIHNlZ3VlbnRpIGRlc2NyaXR0b3JpIG5vbiB2ZW5nb25vIHV0aWxpenphdGkgb3Z1bnF1ZSBkb3BvIGwnZWxpbWluYXppb25lIGRlZ2xpIGVsZW1lbnRpIHNlbGV6aW9uYXRpLlxuXA0KLVNlbGV6aW9uYXJlIGkgZGVzY3JpdHRvcmkgZGEgZWxpbWluYXJlLg0KLQ0KLSMgVmlldyBIZWxwZXINCi12aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfdGl0bGU9Q29udHJvbGxvIGludGVncml0XHUwMGUwIGxpYnJlcmlhDQotdmlld0hlbHBlcl9wZXJmb3JtSGVhbHRoQ2hlY2s9RXNlY3V6aW9uZSBkZWwgY29udHJvbGxvIGRpIGludGVncml0XHUwMGUwIGRlbGxhIGxpYnJlcmlhIGluIGNvcnNvLi4uDQotdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX21lc3NhZ2U9SWwgY29udHJvbGxvIGRpIGludGVncml0XHUwMGUwIGRlbGxhIGxpYnJlcmlhIGFwZXJ0YSBcdTAwZTggc3RhdG8gY29tcGxldGF0by4gQ29uc3VsdGFyZSBpbCByZXBvcnQgbmVsIGZpbGUgZGkgbG9nLg0KLQ0KLSMgQXR0YWNoIFRlbXBsYXRlIEZpbGUgRGlhbG9nDQotYXR0YWNoVGVtcGxhdGVGaWxlRGlhbG9nX3RpdGxlPUFsbGVnYSBmaWxlIGRpIG1vZGVsbG8NCi0NCi0jIENyZWF0ZSBFbGVtZW50IEVycm9yIERpYWxvZw0KLWNyZWF0ZUVsZW1lbnREaWFsb2dfdGl0bGU9Q3JlYSBudW92byB7MH0NCi1jcmVhdGVOZXdFbGVtZW50RXJyb3JfbXNnPUVycm9yZSBkdXJhbnRlIGxhIGNyZWF6aW9uZSBkZWwgbnVvdm8gezB9Lg0KLQ0KLWRsZ1RpdGxlX3JlbG9hZExpYnJhcnk9UmljYXJpY2EgbGlicmVyaWENCi1jcmVhdGVFbGVtZW50RXJyb3JfcmVhc29uPUlsIG5vbWUgZGkgezB9IG5vbiBwdVx1MDBmMiBlc3NlcmUgdnVvdG8uXG5cDQotXG5cDQotU3BlY2lmaWNhcmUgdW4gbm9tZSBlIHByb3ZhcmUgZGkgbnVvdm8uDQotZGVsZXRlQ29uZmlnRXJyb3JfcmVhc29uPUFsbGEgY29uZmlndXJhemlvbmUgZmEgcmlmZXJpbWVudG8gaWwgcHJvY2Vzc28gJyd7MH0nJyANCi0jIENoYW5nZUJvdW5kc0NvbW1hbmQNCi1nZWZfY2hhbmdlQm91bmRzQ29tbWFuZF9sYWJlbD1Nb2RpZmljYSBsaW1pdGkNCi0jIENoYW5nZU5hbWVDb21tYW5kDQotZ2VmX2NoYW5nZU5hbWVDb21tYW5kX2xhYmVsPU1vZGlmaWNhIG5vbWUNCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfdW5kb01lc3NhZ2U9SW1wb3NzaWJpbGUgYW5udWxsYXJlIGxhIG1vZGlmaWNhIGRlbCBub21lLlxuXA0KLVxuXA0KLU5vbiBcdTAwZTggcG9zc2liaWxlIGFubnVsbGFyZSBsYSBtb2RpZmljYSBkZWwgbm9tZSBzZSBpbCBub21lIHByZWNlZGVudGUgXHUwMGU4IG51bGxvLg0KLSMgQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQNCi1nZWZfY2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmRfbGFiZWw9TW9kaWZpY2EgdmFsb3JlIHByb3ByaWV0XHUwMGUwDQotIyBDcmVhdGVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX2NyZWF0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9Q3JlYSBiZW5kcG9pbnQNCi0jIENyZWF0ZUxpbmtDb21tYW5kDQotZ2VmX2NyZWF0ZUxpbmtDb21tYW5kX2xhYmVsPUNyZWF6aW9uZSBjb2xsZWdhbWVudG8NCi0jIENyZWF0ZU5vZGVDb21tYW5kDQotZ2VmX2NyZWF0ZU5vZGVDb21tYW5kX2xhYmVsPUNyZWEgbnVvdm8gbm9kbw0KLSMgRGVsZXRlQmVuZHBvaW50Q29tbWFuZA0KLWdlZl9kZWxldGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPUVsaW1pbmEgYmVuZHBvaW50DQotIyBEZWxldGVDb21tYW5kDQotZ2VmX2RlbGV0ZUNvbW1hbmRfbGFiZWw9RWxpbWluYQ0KLSMgRGVsZXRlTGlua0NvbW1hbmQNCi1nZWZfZGVsZXRlTGlua0NvbW1hbmRfbGFiZWw9RWxpbWluYSBjb25uZXNzaW9uZQ0KLSMgTW92ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfbW92ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9U3Bvc3RhIGJlbmRwb2ludA0KLSMgUmVjb25uZWN0TGlua0NvbW1hbmQNCi1nZWZfcmVjb25uZWN0TGlua0NvbW1hbmRfbGFiZWw9Umljb25uZXR0aSBjb2xsZWdhbWVudG8NCi0NCi0jIFZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcg0KLWdlZl92YWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXJfYnJpbmdEb3duUHJvbXB0PUlsIG5vbWUgbm9uIHB1XHUwMGYyIGVzc2VyZSB2dW90by4gU3BlY2lmaWNhcmUgdW4gbm9tZSB2YWxpZG8uDQotIyBWYWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcg0KLWdlZl92YWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ9SWwgbm9tZSBub24gcHVcdTAwZjIgZXNzZXJlIHZ1b3RvLiBTcGVjaWZpY2FyZSB1biBub21lIHZhbGlkby4NCi0jIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0DQotZ2VmX3dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0X3ZhbGlkYXRlTWVzc2FnZT1JbCBub21lIG5vbiBwdVx1MDBmMiBlc3NlcmUgdnVvdG8uIFNwZWNpZmljYXJlIHVuIG5vbWUgdmFsaWRvLg0KLQ0KLSMgRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uDQotYWN0aW9uc19FbGVtZW50c1ZpZXdEZWxldGVBY3Rpb25fbWVzc2FnZT1JbXBvc3NpYmlsZSBlbGltaW5hcmUgbGEgY29uZmlndXJhemlvbmUgJyd7MH0nJyBwZXJjaFx1MDBlOSBcdTAwZTggYW5jb3JhIGluIHVzbyBkYWwgcHJvY2Vzc28gJyd7MX0nJy4NCi0NCi0jIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcg0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yVGl0bGU9RWxpbWluYSBlcnJvcmUNCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvck1lc3NhZ2U9RWNjZXppb25lIG5vbiBnZXN0aXRhDQotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JSZWFzb249VmVkaSBkZXR0YWdsaQ0KLQ0KLSMgTWV0aG9kRWxlbWVudEVkaXRvcg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZT1FcnJvcmUgZHVyYW50ZSBsJ2VsaW1pbmF6aW9uZQ0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMT1JVVBBMDAyMEU6IEVycm9yZSBkdXJhbnRlIGlsIHNhbHZhdGFnZ2lvIGRlbCBmaWxlDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UyPUVycm9yZSBkdXJhbnRlIGlsIGNvbW1pdA0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24xPUNvbnRyb2xsYXJlIGlsIGZpbGUgZGkgbG9nIHBlciB1bHRlcmlvcmkgZGV0dGFnbGkNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMj1WZWRpIGRldHRhZ2xpDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yVGl0bGU9RXJyb3JlIGR1cmFudGUgbGEgcmlkZW5vbWluYXppb25lDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JNc2c9VW5vIG8gcGlcdTAwZjkgZmlsZSBkaSBxdWVzdG8gZWRpdG9yIHNvbm8gc3RhdGkgcmltb3NzaS4gTCdlZGl0b3Igbm9uIFx1MDBlOCBwaVx1MDBmOSB2YWxpZG8gZSBkZXZlIGVzc2VyZSBjaGl1c28uDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JUaXRsZT1FZGl0b3Igbm9uIHZhbGlkbw0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvck1lc3NhZ2UxPUVycm9yZSBkdXJhbnRlIGxhIHJpZGVub21pbmF6aW9uZSBkZWkgZmlsZSAnJ3swfScnDQotDQotIyBEZXNjcmlwdGlvbkZvcm1QYWdlDQotcmVuYW1lRXJyb3JfdGl0bGU9Umlub21pbmEgZWxlbWVudG8NCi1yZW5hbWVFcnJvcl9tc2c9SVVQQTAwMTNFOiBJbXBvc3NpYmlsZSBjb21wbGV0YXJlIGwnb3BlcmF6aW9uZSBkaSByaWRlbm9taW5hemlvbmUuDQotU2VsZWN0RWxlbWVudERpYWxvZ19zZWxlY3RlbGVtZW50X3RleHQ9U2VsZXppb25hIGVsZW1lbnRvDQotDQotIyBFZGl0b3JDaG9vc2VyDQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX3RpdGxlPUFwcmkgZWRpdG9yIGRpIG1ldG9kaQ0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVzY3JpcHRpb25MYWJlbD1EZXNjcml6aW9uZToNCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfU2VsZWN0QWxsQnV0dG9uTGFiZWw9U2VsZXppb25hIHR1dHRvDQotT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZV9lZGl0X3RleHQwPU1vZGlmaWNhIGVsZW1lbnRvDQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNFOiBJbXBvc3NpYmlsZSBhcHJpcmUgbCdlZGl0b3IgYXNzb2NpYXRvIGFsbCdlbGVtZW50byBtZXRvZG8gc2VsZXppb25hdG8uDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9JY29uRmlsZUNob29zZXJEaWFsb2dfdGl0bGU9U2VsZXppb25hIGZpbGUgaW1tYWdpbmUNCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5TmFtZT1OdW92YSBsaWJyZXJpYQ0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZXNjcmlwdGlvbkxhYmVsPURlc2NyaXppb25lOg0KLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uPVNlbGV6aW9uYXJlIHVuYSBvIHBpXHUwMGY5IGNvbmZpZ3VyYXppb25pIGRpIG1ldG9kbyBlIGZhcmUgY2xpYyBzdSBGaW5lIHBlciBhcHJpcmxlLg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9EZXNlbGVjdEFsbEJ1dHRvbkxhYmVsPURlc2VsZXppb25hIHR1dHRvDQotRWxlbWVudHNWaWV3X21pZ3JhdGlvbl9kaXJfZGxnX2Rlc2NyaXB0aW9uX3RleHQ9U3BlY2lmaWNhcmUgbGEgZGlyZWN0b3J5IGRlbCB7MH0gYXBwZW5hIG1pZ3JhdG8gcGVyIHNvc3RpdHVpcmUgaWwgezB9IHNlbGV6aW9uYXRvDQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX3JlYXNvbj1TaSBcdTAwZTggdmVyaWZpY2F0byB1biBlcnJvcmUgZGkgc2lzdGVtYS4gRmFyZSBjbGljIHN1IERldHRhZ2xpIHBlciB1bHRlcmlvcmkgaW5mb3JtYXppb25pLlxuXA0KLVxuXA0KLUNoaXVkZXJlIGFsY3VuaSBkZWdsaSBlZGl0b3IgYXBlcnRpIGUgcHJvdmFyZSBkaSBudW92by4NCi0NCi0jIERlc2NyaXB0aW9uRm9ybVBhZ2UNCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RpdGxlPUwnaW1tYWdpbmUgbm9uIFx1MDBlOCB2YWxpZGENCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RlbXBsYXRlPUlVUEEwMDMxRTogTCcnaW1tYWdpbmUgc2VsZXppb25hdGEgJyd7MH0nJyBcdTAwZTggcGlcdTAwZjkgbGFyZ2EgZGVsbGEgZGltZW5zaW9uZSBjb25zZW50aXRhICh7MX0gZGkgezJ9KS4gU2VsZXppb25hcmUgdW4nJ2FsdHJhIGltbWFnaW5lLg0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190aXRsZT1MJ2ltbWFnaW5lIG5vbiBcdTAwZTggdmFsaWRhDQotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RlbXBsYXRlPUlVUEEwMDMyRTogSWwgZmlsZSBzZWxlemlvbmF0byAnJ3swfScnIG5vbiBlc2lzdGUuIFNlbGV6aW9uYXJlIHVuJydhbHRyYSBpbW1hZ2luZS4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9U2VsZXppb25hLi4uDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeURlc2NyaXB0aW9uPURlc2NyaXppb25lIGxpYnJlcmlhIG1ldG9kaQ0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZWZhdWx0QnJpZWZEZXNjcmlwdGlvbj1EZXNjcml6aW9uZSBjb25maWd1cmF6aW9uZSBtZXRvZG8NCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZURlc2NyaXB0aW9uPVx1MDBjOCBuZWNlc3NhcmlvIGNoaXVkZXJlIHR1dHRpIGdsaSBlZGl0b3IuIFNlbGV6aW9uYXJlIHF1ZWxsaSBjaGUgZGV2b25vIGVzc2VyZSBwcmltYSBzYWx2YXRpLCBzZSBwb3NzaWJpbGUuDQotDQotIyBUZW1wbGF0ZURlc2NyaXB0aW9uUGFnZQ0KLWZvcm1zX1RlbXBsYXRlRGVzY3JpcHRpb25QYWdlX2FscmVhZHlBdHRhY2hlZF9tc2c9SWwgZmlsZSBzZWxlemlvbmF0byBcdTAwZTggZ2lcdTAwZTAgdW4gYWxsZWdhdG8gcGVyIHF1ZXN0byBtb2RlbGxvLg0KLQ0KLSMgTmV3IExpYnJhcnkgRXJyb3IgRGlhbG9nDQotbmV3TGlicmFyeUVycm9yX21zZz1JVVBBMDAxNEU6IEltcG9zc2liaWxlIGNyZWFyZSBsYSBsaWJyZXJpYSBkZWkgbWV0b2RpLg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24xPUlsIHBlcmNvcnNvIGRlbGxhIGxpYnJlcmlhIGRlaSBtZXRvZGkgc3BlY2lmaWNhdGEgJyd7MH0nJyBub24gXHUwMGU4IHZhbGlkby4NCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMj1VbmEgbGlicmVyaWEgZGVpIG1ldG9kaSBlc2lzdGUgZ2lcdTAwZTAgaW4gJyd7MH0nJy4NCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMz1JbXBvc3NpYmlsZSBjcmVhcmUgbGEgY2FydGVsbGEgZGVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBzcGVjaWZpY2F0YSAnJ3swfScnLg0KLW5ld0xpYnJhcnlFcnJvcl9hZHZpY2U9U2VsZXppb25hcmUgT0sgcGVyIGltbWV0dGVyZSB1biBhbHRybyBub21lIG8gcGVyY29yc28gcGVyIGxhIGxpYnJlcmlhLg0KLQ0KLSNQcm9jZXNzIGxpdGVyYWxzDQotUHJvY2Vzc19FeHRlcm5hbElEPUlEIGVzdGVybm86DQotUHJvY2Vzc19QdXJwb3NlPVNjb3BvOg0KLVByb2Nlc3NfU2NvcGU9QW1iaXRvOg0KLVByb2Nlc3NfVXNhZ2VOb3Rlcz1Ob3RlIHN1bGwndXRpbGl6em86DQotUHJvY2Vzc19BbHRlcm5hdGl2ZXM9QWx0ZXJuYXRpdmU6DQotUHJvY2Vzc19Ib3dUb1N0YWZmPURlZmluaXppb25lIGRlbCBwZXJzb25hbGU6DQotUHJvY2Vzc19LZXlDb25zaWRlcmF0aW9uPUNvbnNpZGVyYXppb25pIGNoaWF2ZToNCi1Qcm9jZXNzX1NjYWxlPVNjYWxhOg0KLVByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljcz1DYXJhdHRlcmlzdGljaGUgZGVsIHByb2dldHRvOg0KLVByb2Nlc3NfUmlza0xldmVsPUxpdmVsbG8gZGkgcmlzY2hpbzoNCi1Qcm9jZXNzX0VzdGltYXRpbmdUZWNobmlxdWU9VGVjbmljaGUgZGkgdmFsdXRhemlvbmU6DQotUHJvY2Vzc19Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPUVzcGVyaWVuemEgbWVtYnJvIGRlbCBwcm9nZXR0bzoNCi1Qcm9jZXNzX1R5cGVPZkNvbnRyYWN0PVRpcG8gZGkgY29udHJhdHRvOg0KLQ0KLSMgRWRpdG9yIFByZXZpZXcgTmF2aWdhdGlvbiBCdXR0b25zDQotYmFja0J1dHRvbl90ZXh0PUluZGlldHJvDQotZm9yd2FyZEJ1dHRvbl90ZXh0PUluIGF2YW50aQ0KLWZvcndhcmRfdGV4dD1JbiBhdmFudGkNCi1zdG9wQnV0dG9uX3RleHQ9SW50ZXJyb21waQ0KLXJlZnJlc2hCdXR0b25fdGV4dD1BZ2dpb3JuYQ0KLXJlZnJlc2hfdGV4dD1BZ2dpb3JuYQ0KLW5ld25hbWVfdGV4dD1OdW92byBub21lOg0KLXByaW50QnV0dG9uX3RleHQ9U3RhbXBhDQotDQotIyBDb250ZXh0IG1lbnVzDQotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPSZBZ2dpb3JuYQ0KLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPSZNb3N0cmEgcHJvcHJpZXRcdTAwZTANCi0NCi1fVUlfTWV0aG9kRWRpdG9yX21lbnU9JkVkaXRvciBkaSBtZXRvZGkNCi1fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtPSZOdW92bw0KLV9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbT1OJnVvdm8gZWxlbWVudG8gZGkgcGFyaSBsaXZlbGxvDQotDQotX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWw9U2VsZXppb25lDQotX1VJX1BhcmVudFBhZ2VfbGFiZWw9UGFyZW50DQotX1VJX0xpc3RQYWdlX2xhYmVsPUVsZW5jbw0KLV9VSV9UcmVlUGFnZV9sYWJlbD1TdHJ1dHR1cmENCi1fVUlfVGFibGVQYWdlX2xhYmVsPVRhYmVsbGENCi1fVUlfVGFibGVUcmVlUGFnZV9sYWJlbD1UYWJsZVRyZWUNCi1fVUlfT2JqZWN0Q29sdW1uX2xhYmVsPU9nZ2V0dG8NCi1fVUlfU2VsZkNvbHVtbl9sYWJlbD1FbGVtZW50byBpbiBzXHUwMGU5DQotDQotX1VJX05vT2JqZWN0U2VsZWN0ZWQ9TmVzc3VuIG9nZ2V0dG8gc2VsZXppb25hdG8NCi1fVUlfU2luZ2xlT2JqZWN0U2VsZWN0ZWQ9T2dnZXR0byBzZWxlemlvbmF0bzogezB9DQotX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQ9U2VsZXppb25hdGkgezB9IG9nZ2V0dGkNCi0NCi1fVUlfT3BlbkVkaXRvckVycm9yX2xhYmVsPUFwcmkgZWRpdG9yDQotDQotX1VJX1dpemFyZF9jYXRlZ29yeT1Qcm9jZWR1cmUgZ3VpZGF0ZSBwZXIgbGEgY3JlYXppb25lIGRpIG1vZGVsbGkgZGkgZXNlbXBpbyBFTUYNCi0NCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfbGFiZWw9TW9kZWxsbyBkaSBtZXRvZG8NCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfZGVzY3JpcHRpb249Q3JlYSBudW92byBtb2RlbGxvIGRpIG1ldG9kbw0KLQ0KLV9VSV9NZXRob2RFZGl0b3JfbGFiZWw9RWRpdG9yIGRpIG1vZGVsbGkgZGkgbWV0b2RvDQotDQotX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2U9TXkNCi1fVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVFeHRlbnNpb249bWV0b2RvDQotDQotX1VJX1dpemFyZF9sYWJlbD1OdW92bw0KLQ0KLV9XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9uPUlsIG5vbWUgZmlsZSBkZXZlIHRlcm1pbmFyZSBpbiAnJy57MH0nJw0KLQ0KLV9VSV9Nb2RlbE9iamVjdD1PZ2dldHRvIG1vZGVsbG8NCi1fVUlfWE1MRW5jb2Rpbmc9Q29kaWZpY2EgWE1MDQotX1VJX1hNTEVuY29kaW5nQ2hvaWNlcz1VVEYtOCBBU0NJSSBVVEYtMTYgVVRGLTE2QkUgVVRGLTE2TEUgSVNPLTg4NTktMQ0KLV9VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb249U2VsZXppb25hcmUgdW4gb2dnZXR0byBtb2RlbGxvIGRhIGNyZWFyZS4NCi0NCi1fVUlfRmlsZUNvbmZsaWN0X2xhYmVsPUNvbmZsaXR0byBmaWxlDQotX1dBUk5fRmlsZUNvbmZsaWN0PUNpIHNvbm8gbW9kaWZpY2hlIG5vbiBzYWx2YXRlIGNoZSBzb25vIGluIGNvbmZsaXR0byBjb24gbGUgbW9kaWZpY2hlIGFwcG9ydGF0ZSBhbGwnZXN0ZXJubyBkZWxsJ2VkaXRvci4gSWdub3JhcmUgbGUgbW9kaWZpY2hlIGFwcG9ydGF0ZSBhIHF1ZXN0byBlZGl0b3I/DQotDQotIyBBZGQgTGluayBEaWFsb2cNCi1hZGRMaW5rRGlhbG9nX2xpbmtUeXBlPVRpcG86DQotb3BlbkxpbmtDaGVja2JveF90ZXh0PUFwcmkgY29sbGVnYW1lbnRvIGluIHVuJ2FsdHJhIGZpbmVzdHJhIGRlbCBicm93c2VyDQotDQotIyBBZGQgSW1hZ2UgRGlhbG9nDQotaGVpZ2h0TGFiZWxfdGV4dD1BbHRlenphOg0KLXdpZHRoTGFiZWxfdGV4dD1MYXJnaGV6emE6DQotRWxlbWVudHNWaWV3XzIwPW1vZGVsbG8gZGkgY2FwYWNpdFx1MDBlMA0KLUVsZW1lbnRzVmlld18yMT1wcm9jZXNzbyBkaSBwcm9kdXppb25lDQotRWxlbWVudHNWaWV3XzIyPXByb2Nlc3NvDQotRWxlbWVudHNWaWV3XzM1PXswfSBcdTAwZTggZGkgc29sYSBsZXR0dXJhLiBQZXIgY29udGludWFyZSwgXHUwMGU4IG5lY2Vzc2FyaW8gcmVuZGVybG8gc2NyaXZpYmlsZS4NCi1FbGVtZW50c1ZpZXdfMzY9RXJyb3JlIGR1cmFudGUgaWwgY2FyaWNhbWVudG8gZGVsbGEgbGlicmVyaWENCi1hbHRUYWdMYWJlbF90ZXh0PVRhZyBBTFQ6DQotaW1hZ2VTaXplTGFiZWxfdGV4dD1MJ2FsdGV6emEgZSBsYSBsYXJnaGV6emEgZGVsbCdpbW1hZ2luZSBkZXZvbm8gZXNzZXJlIGFsbWVubyAxMCBlIG5vbiBwaVx1MDBmOSBkaSA2MDAuIExlIGFsdGV6emUgZSBsZSBsYXJnaGV6emUgbm9uIHZhbGlkZSB2ZXJyYW5ubyBtb2RpZmljYXRlIG5laSB2YWxvcmkgYXBwcm9wcmlhdGkuDQotDQotIyBQcm9jZXNzIEVkaXRvcg0KLVByb2Nlc3NFZGl0b3I9UHJvY2Vzc0VkaXRvcg0KLVByb2Nlc3NFZGl0b3JfTmFtZT1Ob21lDQotUHJvY2Vzc0VkaXRvcl9QcmVzZW50YXRpb25OYW1lPU5vbWUgcHJlc2VudGF6aW9uZQ0KLVByb2Nlc3NFZGl0b3JfSW5kZXg9SW5kaWNlDQotUHJvY2Vzc0VkaXRvcl9QcmVkZWNlc3NvcnM9UHJlZGVjZXNzb3JpDQotI0NvbmZpZ3VyYXRpb25QYWdlX1NlbGVjdGVkPVNlbGVjdGVkOiANCi1DaGVja2xpc3RPcmRlcl9kZXNjcmlwdGlvbj1TZWxlemlvbmFyZSB1biB2b2NlIGRlbGwnZWxlbmNvIGRpIGNvbnRyb2xsbyBlIGZhcmUgY2xpYyBzdSBHaVx1MDBmOSBvIFN1IHBlciBtb2RpZmljYXJuZSBsJ29yZGluZS4NCi1FbGVtZW50c1ZpZXdfcmVuYW1pbmdfdGV4dD1SaWRlbm9taW5hemlvbmUgaW4gY29yc28uLi4NCi1Qcm9jZXNzRWRpdG9yX01vZGVsSW5mbz1JbmZvIG1vZGVsbG8NCi1Qcm9jZXNzRWRpdG9yX1ByZWZpeD1QcmVmaXNzbw0KLU1vdmVEaWFsb2dfbW92ZV90ZXh0PVNwb3N0YQ0KLUNoZWNrbGlzdE9yZGVyX3RpdGxlPU9yZGluYSB2b2NlIGVsZW5jbyBkaSBjb250cm9sbG8NCi1Qcm9jZXNzRWRpdG9yX1JlcGV0YWJsZT1SaXBldGliaWxlDQotUHJvY2Vzc0VkaXRvcl9PbmdvaW5nPUluIGNvcnNvDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3luY2hyb25pemF0aW9uPVNpbmNyb25penphemlvbmUgaW4gY29yc28uLi4NCi1Qcm9jZXNzRWRpdG9yX0V2ZW50RHJpdmVuPUF0dGl2YXRvIGRhIGV2ZW50bw0KLVByb2Nlc3NFZGl0b3JfRGVsaXZlcmFibGU9Q29tcG9uZW50ZSBkaXN0cmlidWliaWxlDQotUHJvY2Vzc0VkaXRvcl9PcHRpb25hbD1GYWNvbHRhdGl2bw0KLUZpbHRlckRpYWxvZ19UeXBlX3RleHQ9VGlwbyBkaSBlbGVtZW50byBkaSBtZXRvZG86DQotRmlsdGVyRGlhbG9nX0V4cGFuZEFsbD1Fc3BhbmRpIHR1dHRvDQotTW92ZURpYWxvZ19tb3ZpbmdfdGV4dD1TcG9zdGFtZW50byBpbiBjb3Jzby4uLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbldhcm5pbmc9SVVQQTAwMjVXOiBMJydpY29uYSBmb3JtYSB7MH0gbm9uIHNpIHRyb3ZhIG5lbCBwZXJjb3JzbzogezF9DQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkU2hhcGVJY29uRXJyb3I9SVVQQTAwMjVFOiBFcnJvcmU6IFNlemlvbmUgaWNvbmEgZm9ybWE6IHswfQ0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfTmFtZUxhYmVsPU5vbWU6DQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1DcmVhIG51b3ZhIGNvbmZpZ3VyYXppb25lIG1ldG9kbw0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9OYW1lTGFiZWw9Tm9tZToNCi1BdXRob3JpbmdVSVBsdWdpbl9uZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlPU51b3ZhIGNvbmZpZ3VyYXppb25lIG1ldG9kbw0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0xpYnJhcnlNYWluUGFnZV9wYWdlVGl0bGU9Q3JlYSBudW92YSBsaWJyZXJpYSBkZWkgbWV0b2RpDQotbmV3TGlicmFyeVdpemFyZF90aXRsZT1OdW92YSBsaWJyZXJpYSBkZWkgbWV0b2RpDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVUaXRsZT1TYWx2YSBtb2RpZmljYQ0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0xpYnJhcnlNYWluUGFnZV9wYWdlRGVzY3JpcHRpb249U3BlY2lmaWNhcmUgdW4gbm9tZSwgdW5hIGRlc2NyaXppb25lIGUgdW5hIGRpcmVjdG9yeSBkaSBkZXN0aW5hemlvbmUgcGVyIGxhIG51b3ZhIGxpYnJlcmlhIGRlaSBtZXRvZGkuDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVEZXNjcmlwdGlvbj1Vbm8gbyBwaVx1MDBmOSBlbGVtZW50aSBkaSBtZXRvZG8gc29ubyBzdGF0aSBtb2RpZmljYXRpLiBTZWxlemlvbmFyZSBxdWVsbGkgY2hlIG9jY29ycmUgc2FsdmFyZS4NCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1BcHJpIGNvbmZpZ3VyYXppb25pIG1ldG9kbw0KLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uV2l6YXJkX3dpbmRvd1RpdGxlPUFwcmkgY29uZmlndXJhemlvbmkgbWV0b2RvDQotRWxlbWVudHNWaWV3X3JlcGxhY2Vpbmd3aXRoZm9ybWF0X3RleHQ9U29zdGl0dXppb25lIGluIGNvcnNvIHswfS4uLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uV2FybmluZz1JVVBBMDAyNlc6IEwnJ2ljb25hIG5vZG8gcGVyIHswfSBub24gc2kgdHJvdmEgbmVsIHBlcmNvcnNvOiB7MX0NCi1NZXNzYWdlTGFiZWxQcm92aWRlcl91bnNlbGVjdGVkcGFja2FnZXM9Jyd7MH0nJyBjb250aWVuZSBlbGVtZW50aSBjaGUgZmFubm8gcmlmZXJpbWVudG8gYSBlbGVtZW50aSBpbiBwYWNjaGV0dGkgbm9uIHNlbGV6aW9uYXRpDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkTm9kZUljb25FcnJvcj1JVVBBMDAyNkU6IEVycm9yZTogU2V6aW9uZSBpY29uYSBub2RvOiB7MH0NCi1TdGVwc09yZGVyRGlhbG9nX3N0ZXBzPVBhc3NpOg0KLQ0KLVN0ZXBzT3JkZXJEaWFsb2dfdGl0bGU9T3JkaW5hIHBhc3NpIG9wZXJhemlvbmUNCi1Qcm9jZXNzRWRpdG9yX1BsYW5uZWQ9UGlhbmlmaWNhdG8NCi1zcGVjaWZ5ZGlyZWN0b3J5X3RleHQ9U3BlY2lmaWNhcmUgdW5hIGRpcmVjdG9yeSBwZXIgc2FsdmFyZSBsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGluDQotUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzPVJpY29ycmVuemUgbXVsdGlwbGUNCi1Qcm9jZXNzRWRpdG9yX0VudHJ5U3RhdGU9U3RhdG8gZGkgaW5ncmVzc28NCi1Qcm9jZXNzRWRpdG9yX0V4aXRTdGF0ZT1TdGF0byBkaSB1c2NpdGENCi1zZWxlY3RDb2x1bW5zdG9BZGRfdGV4dD1TZWxlemlvbmEgbGUgY29sb25uZSBkYSBhZ2dpdW5nZXJlDQotUHJvY2Vzc0VkaXRvcl9UeXBlPVRpcG8NCi1Qcm9jZXNzRWRpdG9yX1RlYW09VGVhbQ0KLUZpbHRlckRpYWxvZ190aXRsZT1TZWxlemlvbmEgZmluZXN0cmEgZGkgZGlhbG9nbzogDQotDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkPUFnZ2l1bmdpIGEgY29udGVudXRvICZtZXRvZG8uLi4NCi1GaWx0ZXJEaWFsb2dfQ29sbGFwc2VBbGw9Q29tcHJpbWkgdHV0dG8NCi1PcGVuQ2hlYXRzaGVldFZpZXdfdGl0bGU9QXByaSB2aXN0YSBDaGVhdCBzaGVldA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxVcD1Fc2VndWkgcm9sbHVwDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbERvd249RXNlZ3VpIHJvbGxkb3duDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZVVwPU0mdW92aSBzdQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX01vdmVEb3duPU11b3ZpIGcmaVx1MDBmOQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbD1NbyZzcnRyYQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvcHk9JkNvcGlhLi4uDQotRmlsdGVyRGlhbG9nX1BhdHRlcm5fdGV4dD1Nb2RlbGxpIG5vbWkgKGkgbm9taSBjb3JyaXNwb25kZW50aSB2ZXJyYW5ubyB2aXN1YWxpenphdGkpOg0KLQ0KLU1ldGhvZExpYnJhcnlFZGl0b3JfdGl0bGU9TGlicmVyaWEgZGVpIG1ldG9kaTogDQotI01lc3NhZ2VWaWV3X3NlbGVjdGVkX3RleHQ9U2VsZWN0ZWQ6IA0KLU1lc3NhZ2VWaWV3X2Vycm1zZ190ZXh0PURlc2NyaXppb25lDQotRWxlbWVudHNWaWV3X2Vycl9zYXZpbmc9SVVQQTAwMjdFOiBFcnJvcmUgZHVyYW50ZSBpbCBzYWx2YXRhZ2dpbyBkaSAnJ3swfScnezF9DQotDQotZXJyX2NvcHlpbmdfZmlsZV90aXRsZT1FcnJvcmUgZHVyYW50ZSBsYSBjb3BpYSBkZWwgZmlsZQ0KLWVycl9jb3B5aW5nX2ZpbGVfZXJyb3I9SVVQQTAwMjhFOiBJbXBvc3NpYmlsZSBhc3NlZ25hcmUgbCdpY29uYS4gDQotZXJyX2NvcHlpbmdfZmlsZV9yZWFzb249U2kgXHUwMGU4IHZlcmlmaWNhdG8gdW4gZXJyb3JlIGR1cmFudGUgbGEgY29waWEgZGVsIGZpbGUgc2VsZXppb25hdG8uIEZhcmUgY2xpYyBzdSBEZXR0YWdsaSBwZXIgdWx0ZXJpb3JpIGluZm9ybWF6aW9uaS4NCi1lcnJfcHJvY2Vzc2luZ19maWxlX3RpdGxlPUVycm9yZSBkdXJhbnRlIGwnZWxhYm9yYXppb25lIGRlbCBmaWxlDQotZWRpdENvbmZpZ3VyYXRpb25fdG9vbHRpcD1Nb2RpZmljYSBjb25maWd1cmF6aW9uZQ0KLWVkaXREaWFsb2dfbXNnQ2Fubm90RWRpdD1JVVBBMDAxNUU6IEltcG9zc2liaWxlIG1vZGlmaWNhcmUgbCdlbGVtZW50bw0KLVNhdmVUaGlzQWN0aW9uX3NhdmVvYmplY3Q9U2FsdmEgcXVlc3RvIG9nZ2V0dG8uLi4NCi1FbGVtZW50c1ZpZXdfcmVwbGFjZV90ZXh0PVNvc3RpdHVpc2NpDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRXh0ZW5kPSZFc3RlbmRpLi4uDQotTW92ZURpYWxvZ19kZXN0aW5hdGlvbl90ZXh0PVNjZWdsaWVyZSBkZXN0aW5hemlvbmUgcGVyIGVsZW1lbnRpIHNlbGV6aW9uYXRpOg0KLWNob29zZURlZmF1bHREaXJlY3RvcnlfdGV4dD1TY2VnbGllcmUgdW5hIGRpcmVjdG9yeSBwcmVkZWZpbml0YSBwZXIgbGUgbGlicmVyaWU6DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3M9JlNvcHByaW1pDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3MyPU9wemlvbmkgZGkgJnB1YmJsaWNhemlvbmUuLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbT1EaWFncmFtbWkgZGVmaW5pdGkgZGFsbCcmdXRlbnRlLi4uDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3RpdGxlPUFzc2VnbmEgZGlhZ3JhbW1pIGRlZmluaXRpIGRhbGwndXRlbnRlDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkSW1hZ2U9RGlhZ3JhbW1hIGF0dGl2aXRcdTAwZTA6DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkZEltYWdlPURpYWdyYW1tYSBkZXR0YWdsaSBhdHRpdml0XHUwMGUwOg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ193cGRJbWFnZT1EaWFncmFtbWEgZGlwZW5kZW56ZSBwcm9kb3R0byBkaSBsYXZvcm86DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX25vdGFGaWxlPUlVUEEwMDA0RTogSWwgcGVyY29yc28gc3BlY2lmaWNhdG8gbm9uIFx1MDBlOCB1biBmaWxlLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hc3NpZ25CdXR0b249U2VsZXppb25hLi4uDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2VudGVyZWRJbWFnZU5vdEZvdW5kPUlVUEEwMDI0RTogTCdpbW1hZ2luZSBzcGVjaWZpY2F0YSBub24gZXNpc3RlIG5lbGxhIGxpYnJlcmlhLiBWZXJpZmljYXJlIGRpIGF2ZXIgaW5zZXJpdG8gaWwgcGVyY29yc28gcmVsYXRpdm8gYWxsYSBkaXJlY3Rvcnkgcm9vdCBkZWxsYSBsaWJyZXJpYS4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfc2VsZWN0ZWRJbWFnZU5vdEZvdW5kPUlVUEEwMDMwRTogTCdpbW1hZ2luZSBzZWxlemlvbmF0YSBub24gXHUwMGU4IG5lbGxhIGxpYnJlcmlhLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBREltYWdlPVV0aWxpenphcmUgbCdpbW1hZ2luZSBkaWFncmFtbWEgYXR0aXZpdFx1MDBlMCBwZXIgbGEgcmljZXJjYSBlIGxhIHB1YmJsaWNhemlvbmUNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURESW1hZ2U9VXRpbGl6emFyZSBsJ2ltbWFnaW5lIGRpYWdyYW1tYSBkZXR0YWdsaSBhdHRpdml0XHUwMGUwIHBlciBsYSByaWNlcmNhIGUgbGEgcHViYmxpY2F6aW9uZQ0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VXUERJbWFnZT1VdGlsaXp6YXJlIGwnaW1tYWdpbmUgZGlhZ3JhbW1hIGRpIGRpcGVuZGVuemEgZGVsIHByb2RvdHRvIGRpIGxhdm9ybyBwZXIgbGEgcmljZXJjYSBlIGxhIHB1YmJsaWNhemlvbmUNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Db250cmlidXRlPUNvbnRyaWJ1dG8gbG9jYWxlDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmVwbGFjZT1Tb3N0aXR1emlvbmUgbG9jYWxlDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRGlhZ3JhbXM9RGlhJmdyYW1taQ0KLVByb2Nlc3NFZGl0b3JfYWN0aW9uX2RlZXBDb3B5PUNvcGlhIGNvbXAmbGV0YS4uLg0KLUZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uPUJyZXZlIGRlc2NyaXppb25lOg0KLUNvbmZpZ3VyYXRpb25QYWdlX2hpZGVUb29sVGlwPU1vc3RyYS9OYXNjb25kaSBlbGVtZW50aSBub24gc2VsZXppb25hdGkNCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbj1EZXNjcml6aW9uZToNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc0FsbD1Ob24gcHViYmxpY2FyZQ0KLUZpbHRlckRpYWxvZ19QYXR0ZXJuX2Rlc2NyaXB0aW9uPUkgbW9kZWxsaSBzb25vIHNlcGFyYXRpIGRhIHVuYSB2aXJnb2xhLCBkb3ZlICo9cXVhbHNpYXNpIHN0cmluZ2EsID89cXVhbHNpYXNpIGNhcmF0dGVyZQ0KLUNvbmZpZ3VyYXRpb25QYWdlX1RyZWVUaXRsZUxhYmVsPUNvbnRlbnV0bzoNCi1Db25maWd1cmF0aW9uUGFnZV9Mb2FkaW5nTWVzc2FnZT1DYXJpY2FtZW50byBkZWxsYSBjb25maWd1cmF6aW9uZSBpbiBjb3JzbywgYXR0ZW5kZXJlIC4uLg0KLU1vdmVEaWFsb2dfdmFsaWRkZXN0aW5hdGlvbl90ZXh0PUxhIGRlc3RpbmF6aW9uZSBkaSBzcG9zdGFtZW50byBzcGVjaWZpY2F0YSBub24gXHUwMGU4IHZhbGlkYS4NCi1Nb3ZlRGlhbG9nX2Nhbm5vdE1vZGlmeURlc3RpbmF0aW9uPUlVUEEwMDM0RTogSW1wb3NzaWJpbGUgbW9kaWZpY2FyZSBsYSBkZXN0aW5hemlvbmUgc2VsZXppb25hdGEuDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsQWxsPVB1YmJsaWNhIHR1dHRvDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkJhc2VBY3Rpdml0eT1BcHJpIGF0dGl2aXRcdTAwZTAgZGkgYmFzZQ0KLVByb2Nlc3NGb3JtRWRpdG9yX2V4cGFuQWxsQWN0aW9uTGFiZWw9RSZzdGVuZGkgdHV0dG8NCi1Qcm9jZXNzRm9ybUVkaXRvcl9jb2xsYXBzZUFsbEFjdGlvbkxhYmVsPUNoaXUmZGkgdHV0dG8NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEaWFncmFtPUFwcmkgZGlhZ3JhbW1hICZhdHRpdml0XHUwMGUwDQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVJldmVhbD1JIGRlc2NyaXR0b3JpIG5vbiBzb3BwcmVzc2kgZWxlbmNhdGkgbmVpIGRldHRhZ2xpIGRldm9ubyBlc3NlcmUgZWxpbWluYXRpIHBlciBldml0YXJlIGxhIGR1cGxpY2F6aW9uZSBpbiBzZWd1aXRvIGFsbGEgcml2ZWxhemlvbmUgZGVnbGkgZWxlbWVudGkgc2VsZXppb25hdGkuIEZhcmUgY2xpYyBzdSBPSyBwZXIgZWxpbWluYXJsaSBlIGNvbnRpbnVhcmUuDQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX1NlbGVjdENvbHVtbnM9U2VsZXppb25hIGxlIGNvbG9ubmUgZGEgYWdnaXVuZ2VyZQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURldGFpbERpYWdyYW09QXByaSBkaWFncmFtbWEgJmRldHRhZ2xpIGF0dGl2aXRcdTAwZTANCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfQ29sdW1uU2VsZWN0aW9uPVNlbGV6aW9uZSBjb2xvbm5hOg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zd2l0Y2hDb25maWd1cmF0aW9uPVBhc3NhcmUgYWxsYSBjb25maWd1cmF6aW9uZSBwcmVkZWZpbml0YSBkZWwgcHJvY2Vzc28gZHVyYW50ZSBsJ2F0dGl2YXppb25lIGRpIHVuIGVkaXRvciBkaSBwcm9jZXNzbw0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zdXBwcmVzc2lvbkdyb3VwVGl0bGU9RWxpbWluYXppb25lDQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX2luaGVyaXRTdXBwcmVzc2lvblN0YXRlPUVyZWRpdGEgc3RhdGkgZGkgZWxpbWluYXppb25lDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW09YXByaSBkaWFncmFtbWEgZGlwZW5kZW4memUgcHJvZG90dG8gZGkgbGF2b3JvDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw9Q2FuY2VsbGENCi1EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19TZWxlY3RCdXR0b25MYWJlbD1TZWxlemlvbmEuLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9JbnNlcnROZXdQaGFzZT1JbnNlcmlzY2kgbnVvdmEgZmFzZQ0KLVZpZXdIZWxwZXJfcmVsb2FkTGliT25Sb2xsYmFja0Vycm9yPUltcG9zc2liaWxlIGVzZWd1aXJlIHJpcHJpc3Rpbm8gaW4gc2VndWl0byBhIHVuIGVycm9yZSBkaSBwZXJzaXN0ZW56YS4gTGEgbGlicmVyaWEgZGV2ZSBlc3NlcmUgcmljYXJpY2F0YSBwZXIgcmlwcmlzdGluYXJuZSBsbyBzdGF0byBvcmlnaW5hbGUuDQotVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZF90ZXh0PUwnJ2VsZW1lbnRvICcnezB9JycgXHUwMGU4IHN0YXRvIGdpXHUwMGUwIGVsaW1pbmF0by4NCi1WaWV3SGVscGVyX2FscmVhZHlkZWxldGVkY29uZmlybV90ZXh0PUwnJ2VsZW1lbnRvICcnezB9JycgXHUwMGU4IHN0YXRvIGdpXHUwMGUwIGVsaW1pbmF0by4gXA0KLVJpbXVvdmVybG8gZGEgJyd7MX0nJz8NCi1Db25maWd1cmF0aW9uUGFnZV9BZGRNaXNzaW5nVG9vbFRpcD1BZ2dpdW5naSByaWZlcmltZW50aSBtYW5jYW50aQ0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uPURlc2NyaXppb25lDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uR2VuZXJhbEluZm89SW5mb3JtYXppb25pIGdlbmVyYWxpDQotDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXBwbHlQYXR0ZXJuPUFwcGxpJmNhIG1vZGVsbG8NCi1Nb3ZlRGlhbG9nX3NlbGVjdGRlc3RpbmF0aW9uX3RleHQ9U2VsZXppb25hcmUgdW5hIGRlc3RpbmF6aW9uZS4NCi1Nb3ZlRGlhbG9nX25vbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZz1OZXNzdW5hIGRlc3RpbmF6aW9uZSBkaSBzcG9zdGFtZW50byBzcGVjaWZpY2F0YS4NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3Ryb3VibGVvYmplY3Q9LiBPZ2dldHRvIGNvbiBwcm9ibGVtaTogDQotTWVzc2FnZUxhYmVsUHJvdmlkZXJfZXJyY2hpbGRwa2dzPVVuIHByb2Nlc3NvIG8gdW4gcGFjY2hldHRvIGRlbCBjb250ZW51dG8gY2hpbGQgY29udGllbmUgZWxlbWVudGkgY29uIHJpZmVyaW1lbnRpIG1hbmNhbnRpDQotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19UaXRsZT1PcHppb25pIGRpIHB1YmJsaWNhemlvbmUgZGlhZ3JhbW1pDQotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19NZXNzYWdlPVNlbGV6aW9uYXJlIGkgZGlhZ3JhbW1pIGRhIHB1YmJsaWNhcmUgb3BwdXJlIGRlc2VsZXppb25hcmUgcXVlbGxpIGRhIG5vbiBwdWJibGljYXJlDQotUHJvY2Vzc0VkaXRvcl9UaXRsZT1FZGl0b3IgZGkgcHJvY2Vzc2k6IA0KLVNhdmVBc3dpdGhkb3RzX3RleHQ9U2FsdmEgY29uIG5vbWUuLi4NCi1Qcm9jZXNzRWRpdG9yX1dvcmtCcmVha2Rvd25TdHJ1Y3R1cmU9RWxlbWVudG8gZGVsbGEgc3VkZGl2aXNpb25lIGRlbCBsYXZvcm8NCi1Qcm9jZXNzRWRpdG9yX1RlYW1BbGxvY2F0aW9uPUFsbG9jYXppb25lIHRlYW0NCi1Qcm9jZXNzRWRpdG9yX1dvcmtQcm9kdWN0VXNhZ2U9VXRpbGl6em8gZGVsIHByb2RvdHRvIGRpIGxhdm9ybw0KLVByb2Nlc3NFZGl0b3JfQ29uc29saWRhdGVkVmlldz1WaXN0YSBjb25zb2xpZGF0YQ0KLVByb2Nlc3NFZGl0b3JfY29uZmlybUF1dG9TeW5jaD1RdWVzdGEgb3BlcmF6aW9uZSBhZ2dpb3JuYSBpIGRlc2NyaXR0b3JpIHNlbGV6aW9uYXRpIG8gdHV0dGkgaSBkZXNjcml0dG9yaSBzb3R0byBsZSBhdHRpdml0XHUwMGUwIHNlbGV6aW9uYXRlIGNoZSBzb25vIHN0YXRpIGNvbnRyYXNzZWduYXRpIGNvbWUgIlNpbmNyb25penphdG8gY29uIGwnb3JpZ2luZSIgbmVsbGEgc2NoZWRhIEdlbmVyYWxlIGRlbGxhIHZpc3RhIFByb3ByaWV0XHUwMGUwLiBBZ2dpb3JuYSBxdWVzdGkgZGVzY3JpdHRvcmkgY29uIGxlIHByb3ByaWV0XHUwMGUwIG9yaWdpbmFsaSBkZWdsaSBlbGVtZW50aSBkZWwgY29udGVudXRvIGRlbCBtZXRvZG8gY29sbGVnYXRvIG5lbGxhIGNvbmZpZ3VyYXppb25lIHByZWRlZmluaXRhIGRlbCBwcm9jZXNzby4gTm90YXJlIGNoZSBub24gYWdnaW9ybmEgbmVzc3VuIGRlc2NyaXR0b3JlIGNvbGxlZ2F0byBpbiBtb2RvIGRpbmFtaWNvIChjb3JzaXZvIHZlcmRlKS4gIFByb2NlZGVyZT8NCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjE9Q29uZmlndXJhemlvbmUNCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjI9U2VsZXppb25lIHBsdWctaW4gZSBwYWNjaGV0dG8NCi1OZXdMaWJyYXJ5RGlhbG9nX25ld2xpYnJhcnlfYXM9Q3JlYSBudW92YSBsaWJyZXJpYSBjb21lDQotTmV3UGx1Z2luRGlhbG9nX25ld3BsdWdpbl90ZXh0PU51b3ZvIHBsdWctaW4gZGkgbWV0b2RvDQotU2VsZWN0RWxlbWVudERpYWxvZ190aXRsZV90ZXh0PVNlbGV6aW9uYXJlIGwnZWxlbWVudG8gb3BwdXJlIHVubyBkZWkgc3VvaSBjb250cmlidXRvcjoNCi1PcGVuQ29uZmlnRGlhbG9nbmV3Y29uZmlnX3RleHQ9TnVvdmEgY29uZmlndXJhemlvbmU6DQotcHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlX0JTRWRpdG9yPUVkaXRvciBkaSBwcm9jZXNzaQ0KLQ0KLSMgQWJzdHJhY3REaWFncmFtRWRpdG9yDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2FsaWduTWVudV90ZXh0PUFsbGluZWENCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1BZ2dpb3JuYSBkYSBhdHRpdml0XHUwMGUwIGRpIGJhc2UNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9Rm9ybWF0byBjYXNlbGxhIGRpIHRlc3RvLi4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1Pcml6em9udGFsbWVudGUgYSBjb29yZC4gbWVkaWUNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PU9yaXp6b250YWxtZW50ZSBhIHByaW1lIGNvb3JkLiBzZWxlemlvbmF0ZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9VmVydGljYWxtZW50ZSBhIGNvb3JkLiBtZWRpZQ0KLU1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fdGl0bGU9SW5mb3JtYXppb25pIGdlbmVyYWxpDQotTW92ZURpYWxvZ19pbnZhbGlkX21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9SVVQQTAwNDFFOiBJbXBvc3NpYmlsZSBzcG9zdGFyZSBsJ2VsZW1lbnRvIHNlbGV6aW9uYXRvIHN1bGxhIGRlc3RpbmF6aW9uZSBzcGVjaWZpY2F0YS4NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3NhdmVtb2RlbGxpYnJhcnk9U2FsdmF0YWdnaW8gZGVsbGEgbGlicmVyaWEgZGVpIG1vZGVsbGkgaW4gY29yc28gLi4uDQotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJvcl9kaWFsb2dfdGl0bGU9RXJyb3JlDQotTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c9SVVQQTAwMzNFOiBSaWxldmF0byBwcm9ibGVtYSBkdXJhbnRlIGlsIHNhbHZhdGFnZ2lvIGRlbGxhIGxpYnJlcmlhLg0KLU1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb25fZGVsZXRlY29uZmlybV90ZXh0PUVsaW1pbmFyZSAnJ3swfScnPw0KLUNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX0NvbnRlbnRFbGVtZW50X3RleHQ9RWxlbWVudGkgZGVsIGNvbnRlbnV0bzogDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Ccm93c2VCdXR0b25MYWJlbD1TZm9nbGlhLi4uDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1TcGVjaWZpY2FyZSB1biBub21lIGUgdW5hIGRlc2NyaXppb25lIHBlciBsYSBudW92YSBjb25maWd1cmF6aW9uZSBkaSBtZXRvZG8uDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VUaXRsZT1TYWx2YSBtb2RpZmljaGUgZSBjaGl1ZGkgdHV0dGkgZ2xpIGVkaXRvcg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9VmVydGljYWxtZW50ZSBhIHByaW1lIGNvb3JkLiBzZWxlemlvbmF0ZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQ9U2FsdmENCi1BdHRhY2htZW50RGlhbG9nYXR0YWNoRmlsZV90ZXh0PUFsbGVnYSBmaWxlDQotQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudD1Db250ZW51dG8gY29uZmlndXJhemlvbmUNCi1PcGVuQ29uZmlnRGlhbG9nb3BlbmNvbmZpZ190ZXh0PUFwcmkgY29uZmlndXJhemlvbmUNCi1FbGVtZW50c1ZpZXdfcmVwbGFjZUFjdGlvbl90ZXh0PVNvc3RpdHVpc2NpLi4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfbWVzc2FnZT1TYWx2YXRhZ2dpbyBkaSB7MH0NCi1Db25maWd1cmF0aW9uUGFnZV9TaG93RXJyb3JUb29sVGlwPU1vc3RyYSBpbCB2aXN1YWxpenphdG9yZSBsb2cgZGVnbGkgYXZ2aXNpIGRpIGNvbmZpZ3VyYXppb25lDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRm9ybVByZWZpeD1Db25maWd1cmF6aW9uZToNCi0NCi1DaGVja2xpc3RPcmRlcl9jaGVja2xpc3RpdGVtc190ZXh0PVZvY2kgZWxlbmNvIGRpIGNvbnRyb2xsbzogDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsPVNwb3N0YSBub2RvDQotQ29uZmlndXJhdGlvblBhZ2VfTWFrZUNsb3N1cmVUb29sVGlwPUNyZWEgY2hpdXN1cmEgY29ycmVnZ2VuZG8gZ2xpIGVycm9yaQ0KLU5ld1BsdWdpbkRpYWxvZ19yZWZlcmVuY2VwbHVnaW5fdGV4dD1QbHVnLWluIGRpIHJpZmVyaW1lbnRvOg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9jcmVhdGVGcmVlVGV4dF90ZXh0PUNyZWEgdGVzdG8gbGliZXJvDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfTGFiZWw9QW50ZXByaW1hIGljb25hIG5vZG86DQotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9jb25uZWN0X3RleHQ9SVVQQTAwMzJXOiBJbXBvc3NpYmlsZSBjb25uZXR0ZXJzaQ0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9zYW1lcHJlZGFuZHN1Y190ZXh0PUlVUEEwMDMzVzogSW1wb3NzaWJpbGUgYXZlcmUgbG8gc3Rlc3NvIGVsZW1lbnRvIGRlbGxhIHN1ZGRpdmlzaW9uZSBjb21lIHByZWRlY2Vzc29yZSBlIHN1Y2Nlc3NvcmUNCi0NCi0jIEVkaXRvckNob29zZXINCi1FZGl0b3JDaG9vc2VyX2xvYWRkRXJyb3JEbGdUaXRsZT1BcHJpIGVkaXRvcg0KLUVkaXRvckNob29zZXJfUmVzb3VyY2VzRXJyb3I9UXVlc3RvIGVsZW1lbnRvIHByZXNlbnRhIGVycm9yaS4gU2kgY29uc2lnbGlhIGRpIGNvcnJlZ2dlcmUgcXVlc3RpIGVycm9yaSBwcmltYSBkaSBjb250aW51YXJlICh2ZWRlcmUgaSBkZXR0YWdsaSkuXG5cDQotXG5cDQotRmFyZSBjbGljIHN1IE9LIHBlciBjb250aW51YXJlIHNlbnphIGFwcmlyZSBsJ2VkaXRvci4gQ2hpdWRlcmUgbGEgZmluZXN0cmEgZGkgZGlhbG9nbyBwZXIgYXByaXJlIGwnZWRpdG9yLg0KLUNvbmZpZ3VyYXRpb25QYWdlX0Zvcm1QcmVmaXg9Q29uZmlndXJhemlvbmU6DQotDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uTmFtZT1Ob21lOg0KLUF0dGFjaG1lbnREaWFsb2dGaWxlVVJMX3RleHQ9VVJMIGZpbGU6DQotU3RlcHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbj1TZWxlemlvbmFyZSB1biBwYXNzbyBlIGZhcmUgY2xpYyBzdSBTdSBvIEdpXHUwMGY5IHBlciBtb2RpZmljYXJuZSBsJ29yZGluZS4NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX2Vycl9zYXZlPUVycm9yZSBkdXJhbnRlIGlsIHNhbHZhdGFnZ2lvDQotTWVzc2FnZVZpZXdfZXJyZWxlbWVudF90ZXh0PUVsZW1lbnRvIGNoZSBmYSByaWZlcmltZW50bw0KLU1lc3NhZ2VWaWV3X3JlZmVsZW1lbnRfdGV4dD1FbGVtZW50byBjdWkgc2kgZmEgcmlmZXJpbWVudG8NCi0NCi0jQWN0aXZpdHkgRGlhZ3JhbQ0KLUFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9jcmVhdGVTdGFydE5vZGVfdGV4dD1DcmVhIG5vZG8gaW5pemlhbGUNCi1Db25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50RGVzY3JpcHRpb249U2VsZXppb25hcmUgaSBwbHVnLWluIGRpIG1ldG9kbywgaSBwcm9jZXNzaSBlIGkgcGFjY2hldHRpIGRlbCBjb250ZW51dG8gY2hlIHZlcnJhbm5vIGluY2x1c2kgaW4gcXVlc3RhIGNvbmZpZ3VyYXppb25lLg0KLUNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uX3RleHQ9RmluZXN0cmEgZGkgZGlhbG9nbyBPcmRpbmUgZWxlbWVudGkgZGVsIGNvbnRlbnV0byBkZWxsYSBjYXRlZ29yaWEgcGVyc29uYWxpenphdGENCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RpcmVjdG9yeUxhYmVsPURpcmVjdG9yeToNCi1Sb290UHJlZlBhZ2VfZW5hYmxlcHJvY2Vzc2NvbnRyaWJ1dGlvbl90ZXh0PUFiaWxpdGEgY29udHJpYnV0byBwcm9jZXNzbw0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uX3RleHQ9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3UgcXVlc3RhIGNvbmZpZ3VyYXppb25lIGRpIG1ldG9kby4NCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbkxhYmVsPURlc2NyaXppb25lOg0KLUNvbnRyaWJ1dGlvblNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9U2NlbHRhIGRlaSBjb250cmlidXRvciBwZXIgJyd7MH0nJw0KLUVsZW1lbnRzVmlld19vcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb25fdGV4dD1BcHJpcmUgdHJhbWl0ZSBnbGkgZWxlbWVudGkgZGkgdmFyaWFiaWxpdFx1MDBlMA0KLVZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZT1zY2VsdGEgZGVnbGkgZWxlbWVudGkgZGkgdmFyaWFiaWxpdFx1MDBlMCBwZXIgJyd7MH0nJw0KLVZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ192aWV3ZXJMYWJlbD1FbGVtZW50aSBkaSB2YXJpYWJpbGl0XHUwMGUwIHBlciAnJ3swfScnDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0xhYmVsPUFudGVwcmltYSBpY29uYSBmb3JtYToNCi1EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2RlbGV0ZV90ZXh0PUltcG9zc2liaWxlIGVsaW1pbmFyZQ0KLUFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9QXByaSBkaWFncmFtbWEgZGV0dGFnbGkgYXR0aXZpdFx1MDBlMA0KLQ0KLU1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fZGVzY3JpcHRpb249Rm9ybmlyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3UgcXVlc3RhIGxpYnJlcmlhIGRlaSBtZXRvZGkuDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1DYW5jZWxsYQ0KLVdQQ29tcGFydG1lbnRGaWd1cmVfMD1OdW92byBkZXNjcml0dG9yZSBkaSBwcm9kb3R0aSBkaSBsYXZvcm8NCi1wcm9tcHRmb3JfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZF90ZXh0PVB1YmJsaWNhIG8gdmlzdWFsaXp6YSBkaWFncmFtbWkgZGV0dGFnbGkgYXR0aXZpdFx1MDBlMCBjaGUgbm9uIHNvbm8gc3RhdGkgY3JlYXRpIG5lbGwnZWRpdG9yIGRpIHByb2Nlc3NpDQotcHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtPVB1YmJsaWNhcmUgbyByaWNlcmNhcmUgaSBkaWFncmFtbWkgZGkgYXR0aXZpdFx1MDBlMCBwZXIgbGUgZXN0ZW5zaW9uaSBhdHRpdml0XHUwMGUwIG5vbiBtb2RpZmljYXRlDQotDQotI0NvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfTmFtZVBhdHRlcm49TW9kZWxsaSBub21pIChpIG5vbWkgY29ycmlzcG9uZGVudGkgdmVycmFubm8gdmlzdWFsaXp6YXRpKToNCi1zaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbl9sYWJlbD1Nb3N0cmEgaW4gTmF2aWdhdG9yIHJpc29yc2UNCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19QYXR0ZXJuPUkgbW9kZWxsaSBzb25vIHNlcGFyYXRpIGRhIHVuYSB2aXJnb2xhLCBkb3ZlICo9cXVhbHNpYXNpIHN0cmluZ2EsID89cXVhbHNpYXNpIGNhcmF0dGVyZQ0KLWVycl9wcm9jZXNzaW5nX2ZpbGVfZGVzY3JpcHRpb249SVVQQTAwMjlFOiBTaSBcdTAwZTggdmVyaWZpY2F0byB1biBlcnJvcmUgZHVyYW50ZSBsJ2VsYWJvcmF6aW9uZSBkZWwgZmlsZSBzZWxlemlvbmF0by4gRmFyZSBjbGljIHN1IERldHRhZ2xpIHBlciB1bHRlcmlvcmkgaW5mb3JtYXppb25pLg0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX0NhdGVnb3J5VHlwZT1UaXBvIGRpIGNhdGVnb3JpYToNCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19CcmllZkRlc2NyaXB0aW9uPUJyZXZlIGRlc2NyaXppb25lOg0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1NlbGVjdENhdGVnb3JpZXM9U2VsZXppb25hIGNhdGVnb3JpZQ0KLQ0KLSNsb2cgbWVzc2FnZXMNCi1jaGVhdHNoZWV0X2xvYWRfZmFpbHVyZV9sb2dfbXNnPUltcG9zc2liaWxlIGFwcmlyZSBpbCBjaGVhdCBzaGVldCByaWNoaWVzdG86IA0KLQ0KLW5ld0NvbmZpZ3VyYXRpb25XaXJhemRfY3JlYXRlRXJyb3I9SVVQQTAwMzVFOiBJbXBvc3NpYmlsZSBjcmVhcmUgbGEgY29uZmlndXJhemlvbmUgY29ycmV0dGFtZW50ZQ0KLW5ld1BsdWdpbldpemFyZF9jcmVhdGVFcnJvcj1JVVBBMDAzNkU6IEltcG9zc2liaWxlIGNyZWFyZSBpbCBwbHVnLWluIGNvcnJldHRhbWVudGUNCi1lcnJvckRpYWxvZ19tb3ZlRXJyb3I9SVVQQTAwMzdFOiBJbXBvc3NpYmlsZSBzcG9zdGFyZSBsJ2VsZW1lbnRvIGNvcnJldHRhbWVudGUNCi1yZW5hbWVEaWFsb2dfcmVuYW1lRXJyb3I9SVVQQTAwMzhFOiBJbXBvc3NpYmlsZSByaW5vbWluYXJlIGwnZWxlbWVudG8gY29ycmV0dGFtZW50ZQ0KLWVycm9yRGlhbG9nX2NyZWF0ZUVycm9yPUlVUEEwMDM5RTogSW1wb3NzaWJpbGUgY3JlYXJlIGwnZWxlbWVudG8gY29ycmV0dGFtZW50ZQ0KLWR1cGxpY2F0ZVBsdWdpbk5hbWVFcnJvcl9tc2c9SVVQQTAxMDFFOiBJbCBub21lICcnezB9JycgZXNpc3RlIGdpXHUwMGUwLiBJbW1ldHRlcmUgdW4gYWx0cm8gbm9tZSBlIHByb3ZhcmUgZGkgbnVvdm8uDQotDQotI05ldyBTdHJpbmdzIGZvciBQcm9jZXNzRWRpdG9yIENvbnRleHQgbWVudSBkaWFncmFtIGltYWdlcw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFESW1hZ2U9QXNzZWduYXppb25lIGltbWFnaW5lIEFEIGluIGNvcnNvLi4uDQotUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JUaXRsZT1FcnJvcmUgZGkgYWdnaW9ybmFtZW50bw0KLVByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yTXNnPUVycm9yZSBkdXJhbnRlIGwnYWdnaW9ybmFtZW50byBkZWxsJ2VkaXRvcg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFEREltYWdlPUFzc2VnbmF6aW9uZSBpbW1hZ2luZSBBREQgaW4gY29yc28uLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRXUERJbWFnZT1Bc3NlZ25hemlvbmUgaW1tYWdpbmUgV1BEIGluIGNvcnNvLi4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURJbWFnZUluUHVibGlzaGluZz1VdGlsaXp6YXJlIGwnaW1tYWdpbmUgQUQgbmVsbGEgcHViYmxpY2F6aW9uZQ0KLVByb2Nlc3NFZGl0b3JfcHJvbXB0VG9EZWxldGVCZWZvcmVTdXBwcmVzcz1JIGRlc2NyaXR0b3JpIHNvcHByZXNzaSBlbGVuY2F0aSBuZWkgZGV0dGFnbGkgZGV2b25vIGVzc2VyZSBlbGltaW5hdGkgcGVyIGV2aXRhcmUgbGEgZHVwbGljYXppb25lIGluIHNlZ3VpdG8gYWxsYSBzb3BwcmVzc2lvbmUgZGVnbGkgZWxlbWVudGkgc2VsZXppb25hdGkuIEZhcmUgY2xpYyBzdSBPSyBwZXIgZWxpbWluYXJsaSBlIGNvbnRpbnVhcmUuDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURESW1hZ2VJblB1Ymxpc2hpbmc9VXRpbGl6emFyZSBsJ2ltbWFnaW5lIEFERCBuZWxsYSBwdWJibGljYXppb25lDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlV1BESW1hZ2VJblB1Ymxpc2hpbmc9VXRpbGl6emFyZSBsJ2ltbWFnaW5lIFdQRCBuZWxsYSBwdWJibGljYXppb25lDQotUHJvY2Vzc0VkaXRvcl9EaWFncmFtSW1hZ2VfSW5wdXREaWFsb2dfaW5pdGlhbFZhbHVlPVBlcmNvcnNvIGltbWFnaW5lDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU2hvd0xpbmtlZEVsZW1lbnRpbkxpYnJhcnlWaWV3PU0mb3N0cmEgZWxlbWVudG8gY29sbGVnYXRvIGluIHZpc3RhIGxpYnJlcmlhDQotUHJvY2Vzc0VkaXRvcl91cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uX2xhYmVsPUFnZ2lvcm5hIHNvcHByZXNzaW9uZSBkYSAmYmFzZQ0KLVByb2Nlc3NFZGl0b3JfQ29udGV4dE1lbnVfRGlhZ3JhbUltYWdlcz1JbW1hZ2luaSBkaWFncmFtbWkNCi0NCi0jU3RyaW5ncyBmb3Igc3luY2hyb25pemF0aW9uIHdpemFyZCBvbiBwcm9jZXNzIGVkaXRvcidzIEJTDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90aXRsZT1EZXNjcml6aW9uZSBzaW5jcm9uaXp6YXppb25lDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90ZXh0PUxlZ2dlcmUgbGUgaW5mb3JtYXppb25pIHJpcG9ydGF0ZSBkaSBzZWd1aXRvIGNoZSBzcGllZ2FubyBxdWFsZSBzaW5jcm9uaXp6YXppb25lIHBlcnNvbmFsaXp6YXRhIHZlcnJcdTAwZTAgZXNlZ3VpdGEuDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9U2VsZXppb25hIGNvbmZpZ3VyYXppb25lDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGV4dD1TZWxlemlvbmFyZSBsYSBjb25maWd1cmF6aW9uZSBkYSB1dGlsaXp6YXJlIHBlciBsYSBzaW5jcm9uaXp6YXppb25lLiAgXA0KLUxhIHNlbGV6aW9uZSBkZXRlcm1pbmEgaSBjb250cmlidXRpIGUgbGUgc29zdGl0dXppb25pIGNoZSB2ZXJyYW5ubyB1c2F0aSBwZXIgbGEgc2luY3Jvbml6emF6aW9uZS4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV9jb25maWdMYWJlbD1Db25maWd1cmF6aW9uZToNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGl0bGU9U2VsZXppb25hcmUgbGUgcHJvcHJpZXRcdTAwZTAgZGEgc2luY3Jvbml6emFyZQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcm9wZXJ0aWVzX2xhYmxlPVByb3ByaWV0XHUwMGUwDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX25hbWVfbGFibGU9Tm9tZQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmVzZW50YXRpb25OYW1lX2xhYmxlPU5vbWUgcHJlc2VudGF6aW9uZQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9icmllZkRlc2NfbGFibGU9QnJldmUgZGVzY3JpemlvbmUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3B0aW9uYWxJbm91dHNfbGFiZWw9SW5wdXQgZmFjb2x0YXRpdmkNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbWFuZGF0b3J5SW5wdXRzX2xhYmxlPUlucHV0IG9iYmxpZ2F0b3JpDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX291dHB1dHNfbGFiZWw9T3V0cHV0DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbGFiZWw9RXNlY3V0b3JlIHByaW1hcmlvDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2FkZG5QZXJmb3JtZXJzX2xhYmxlPUVzZWN1dG9yaSBhZ2dpdW50aXZpDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Jlc3BvbnNpYmxlUm9sZXNfbGFibGU9UnVvbGkgcmVzcG9uc2FiaWxlDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2NvbnRuQXJ0aWZhY3RzX2xhYmVsPUFydGVmYXR0aSBjb250ZW51dGkNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfZGlsdmVkUGFydHNfbGFiZWw9UGFydGkgZGlzdHJpYnVpYmlsaQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9zZWxTdGVwc19sYWJlbD1TZWxlemlvbmUgcGFzc2kNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGV4dD1TY2VnbGllcmUgbGUgcHJvcHJpZXRcdTAwZTAgZGVsIGNvbnRlbnV0byBtZXRvZG8gZGEgY29uc2lkZXJhcmUgcGVyIGxhIHNpbmNyb25penphemlvbmUuDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RpdGxlPUFudGVwcmltYSBzaW5jcm9uaXp6YXppb25lDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RleHQ9Uml2ZWRlcmUgaSBkZXR0YWdsaSBkZWxsYSBzaW5jcm9uaXp6YXppb25lIHByb3Bvc3RpIGRpIHNlZ3VpdG8uDQotc2VsZWN0RWRpdG9yc1RvRGlzY2FyZENvbmZsaWN0Q2hhbmdlcz1DaSBzb25vIG1vZGlmaWNoZSBub24gc2FsdmF0ZSBjaGUgc29ubyBpbiBjb25mbGl0dG8gY29uIGxlIG1vZGlmaWNoZSBhcHBvcnRhdGUgYWxsJ2VzdGVybm8gZGVnbGkgZWRpdG9yLlxuXA0KLVNlbGV6aW9uYXJlIGdsaSBlZGl0b3IgZGkgY3VpIGVsaW1pbmFyZSBsZSBtb2RpZmljaGUuDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3RpdGxlX3RleHQ9UHJvY2VkdXJhIGd1aWRhdGEgcGVyIGxhIHNpbmNyb25penphemlvbmUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX2V4cGxhaW5UZXh0PVF1ZXN0YSBwcm9jZWR1cmEgZ3VpZGF0YSBmb3JuaXNjZSB1biBzdXBwb3J0byBwZXIgbCdhZ2dpb3JuYW1lbnRvIGRlaSBkZXNjcml0dG9yaSBzZWxlemlvbmF0aSBvIGRpIHR1dHRpIGkgZGVzY3JpdHRvcmkgc290dG8gbGUgYXR0aXZpdFx1MDBlMCBzZWxlemlvbmF0ZSBjaGUgc29ubyBzdGF0aSBjb250cmFzc2VnbmF0aSBjb21lICJTaW5jcm9uaXp6YXRvIGNvbiBsJ29yaWdpbmUiIG5lbGxhIHNjaGVkYSBHZW5lcmFsZSBkZWxsYSB2aXN0YSBQcm9wcmlldFx1MDBlMC4gIFwNCi1Tb2xvIGxlIHByb3ByaWV0XHUwMGUwIHNlbGV6aW9uYXRlIG5lbGxhIHByb2NlZHVyYSBndWlkYXRhIHZlbmdvbm8gYWdnaW9ybmF0ZSBuZWkgZGVzY3JpdHRvcmkuICBcDQotXHUwMGM4IHBvc3NpYmlsZSBzZWxlemlvbmFyZSBxdWFsc2lhc2kgY29uZmlndXJhemlvbmUgdmFsaWRhIHBlciBpbCBwcm9jZXNzbyBkYSB1dGlsaXp6YXJlIGR1cmFudGUgbCdlbGFib3JhemlvbmUgZGVsbCdhZ2dpb3JuYW1lbnRvLiAgXA0KLU5vdGFyZSBjaGUgbGEgcHJvY2VkdXJhIGd1aWRhdGEgbm9uIGFnZ2lvcm5hIG5lc3N1biBkZXNjcml0dG9yZSBjb2xsZWdhdG8gaW4gbW9kbyBkaW5hbWljbyAoY29yc2l2byB2ZXJkZSkuICANCi1vcGVuUlRFPUFwcmlyZSBsJ2VkaXRvciByaWNoIHRleHQNCi1jbG9zZVJURT1DaGl1ZGVyZSBsJ2VkaXRvciByaWNoIHRleHQNCi0NCi0jTmV3IFN0cmluZ3MNCi1yb2xlc2V0c19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3RpcmUgbGUgZ3VpZGUgY2hlIGFwcGFydGVuZ29ubyBhIHF1ZXN0byBpbnNpZW1lIGRpIHJ1b2xpLg0KLWRpc2NpcGxpbmVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlyZSBsZSBndWlkZSBjaGUgYXBwYXJ0ZW5nb25vIGEgcXVlc3RhIGRpc2NpcGxpbmEuDQotd29ya3Byb2R1Y3R0eXBlc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3RpcmUgbGUgZ3VpZGUgY2hlIGFwcGFydGVuZ29ubyBhIHF1ZXN0byB0aXBvIGRpIHByb2RvdHRvIGRpIGxhdm9yby4NCi1kb21haW5zX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlyZSBsZSBndWlkZSBjaGUgYXBwYXJ0ZW5nb25vIGEgcXVlc3RvIGRvbWluaW8uDQotdG9vbHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aXJlIGxlIGd1aWRlIGNoZSBhcHBhcnRlbmdvbm8gYSBxdWVzdG8gdG9vbC4NCi1jdXN0b21jYXRlZ29yeV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3RpcmUgbGUgZ3VpZGUgY2hlIGFwcGFydGVuZ29ubyBhIHF1ZXN0YSBjYXRlZ29yaWEgcGVyc29uYWxpenphdGEuDQotDQotY29uY2VwdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3RpcmUgbGUgZ3VpZGUgY2hlIGFwcGFydGVuZ29ubyBhIHF1ZXN0byBjb25jZXR0by4NCi1jaGVja2xpc3RfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aXJlIGxlIGd1aWRlIGNoZSBhcHBhcnRlbmdvbm8gYSBxdWVzdG8gZWxlbmNvIGRpIGNvbnRyb2xsby4NCi1leGFtcGxlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlyZSBsZSBndWlkZSBjaGUgYXBwYXJ0ZW5nb25vIGEgcXVlc3RvIGVzZW1waW8uDQotZ3VpZGVsaW5lX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlyZSBsZSBndWlkZSBjaGUgYXBwYXJ0ZW5nb25vIGEgcXVlc3RhIGxpbmVhIGd1aWRhLg0KLXJvYWRtYXBfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aXJlIGxlIGd1aWRlIGNoZSBhcHBhcnRlbmdvbm8gYSBxdWVzdGEgcm9hZG1hcC4NCi1yZXVzYWJsZWFzc2V0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlyZSBsZSBndWlkZSBjaGUgYXBwYXJ0ZW5nb25vIGEgcXVlc3RhIHJpc29yc2Egcml1dGlsaXp6YWJpbGUuDQotc3VwcG9ydGluZ21hdGVyaWFsX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlyZSBsZSBndWlkZSBjaGUgYXBwYXJ0ZW5nb25vIGEgcXVlc3RvIG1hdGVyaWFsZSBkaSBzdXBwb3J0by4NCi1yZXBvcnRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aXJlIGxlIGd1aWRlIGNoZSBhcHBhcnRlbmdvbm8gYSBxdWVzdG8gcmVwb3J0Lg0KLXByYWN0aWNlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlyZSBsZSBndWlkZSBjaGUgYXBwYXJ0ZW5nb25vIGEgcXVlc3RhIHByYXRpY2EuDQotdGVtcGxhdGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aXJlIGxlIGd1aWRlIGNoZSBhcHBhcnRlbmdvbm8gYSBxdWVzdG8gbW9kZWxsby4NCi10ZXJtZGVmaW5pdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlc3RpcmUgbGUgZ3VpZGUgY2hlIGFwcGFydGVuZ29ubyBhIHF1ZXN0YSBkZWZpbml6aW9uZSB0ZXJtaW5lLg0KLXRvb2xtZW50b3JfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aXJlIGxlIGd1aWRlIGNoZSBhcHBhcnRlbmdvbm8gYSBxdWVzdGEgZ3VpZGEgdG9vbC4NCi13aGl0ZXBhcGVyX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VzdGlyZSBsZSBndWlkZSBjaGUgYXBwYXJ0ZW5nb25vIGEgcXVlc3RvIHdoaXRlcGFwZXIuDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXN0aXJlIGxlIGd1aWRlIGNoZSBhcHBhcnRlbmdvbm8gYSBxdWVzdGEgY29uc2lkZXJhemlvbmUgc3VsbGEgdmFsdXRhemlvbmUuDQotDQotDQotI05ldyBTdHJpbmcgU2VjdGlvbiBEZXNjcmlwdGlvbg0KLXJvbGVfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGRldHRhZ2xpYXRlIHN1IHF1ZXN0byBydW9sby4NCi1yb2xlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0byBydW9sby4NCi1yb2xlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGluIGNoZSBtb2RvIHF1ZXN0byBydW9sbyBzaSBjb3JyZWxhIGEgdW4gYWx0cm8gcnVvbG8uDQotcm9sZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSB2ZXJzaW9uZSBkaSBxdWVzdG8gcnVvbG8uDQotDQotdGFza19kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZGV0dGFnbGlhdGUgc3UgcXVlc3RhIG9wZXJhemlvbmUuDQotdGFza19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBnZW5lcmFsaSBzdSBxdWVzdGEgb3BlcmF6aW9uZS4NCi10YXNrX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGluIGNoZSBtb2RvIHF1ZXN0YSBvcGVyYXppb25lIHNpIGNvcnJlbGEgYSB1bidhbHRyYSBvcGVyYXppb25lLg0KLXRhc2tfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RhIG9wZXJhemlvbmUuDQotDQotYXJ0aWZhY3RfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGRldHRhZ2xpYXRlIHN1IHF1ZXN0byBhcnRlZmF0dG8uDQotYXJ0aWZhY3RfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3UgcXVlc3RvIGFydGVmYXR0by4NCi1hcnRpZmFjdF9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaXp6YXJlIGxlIGljb25lIHBlciBxdWVzdG8gYXJ0ZWZhdHRvLg0KLWFydGlmYWN0X25vdGF0aW9uU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIHN1bGxhIGNvbnNlZ25hIHBlciBxdWVzdG8gYXJ0ZWZhdHRvLg0KLWFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSBwZXJzb25hbGl6emF6aW9uZSByZWxhdGl2ZSBhIHF1ZXN0byBhcnRlZmF0dG8uDQotYXJ0aWZhY3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmaWNhcmUgaW4gY2hlIG1vZG8gcXVlc3RvIGFydGVmYXR0byBzaSBjb3JyZWxhIGEgdW4gYWx0cm8gYXJ0ZWZhdHRvLg0KLWFydGlmYWN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIHN1bGxhIHZlcnNpb25lIGRpIHF1ZXN0byBhcnRlZmF0dG8uDQotDQotb3V0Y29tZV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZGV0dGFnbGlhdGUgc3UgcXVlc3RvIHJpc3VsdGF0by4NCi1vdXRjb21lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0byByaXN1bHRhdG8uDQotb3V0Y29tZV9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaXp6YXJlIGxlIGljb25lIHBlciBxdWVzdG8gcmlzdWx0YXRvLg0KLW91dGNvbWVfbm90YXRpb25TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgY29uc2VnbmEgcGVyIHF1ZXN0byByaXN1bHRhdG8uDQotb3V0Y29tZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgcGVyc29uYWxpenphemlvbmUgcmVsYXRpdmUgYSBxdWVzdG8gcmlzdWx0YXRvLg0KLW91dGNvbWVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmaWNhcmUgaW4gY2hlIG1vZG8gcXVlc3RvIHJpc3VsdGF0byBzaSBjb3JyZWxhIGEgdW4gYWx0cm8gcmlzdWx0YXRvLg0KLW91dGNvbWVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RvIHJpc3VsdGF0by4NCi0NCi1kZWxpdmVyYWJsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZGV0dGFnbGlhdGUgc3UgcXVlc3RvIGNvbXBvbmVudGUgZGlzdHJpYnVpYmlsZS4NCi1kZWxpdmVyYWJsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBnZW5lcmFsaSBzdSBxdWVzdG8gY29tcG9uZW50ZSBkaXN0cmlidWliaWxlLg0KLWRlbGl2ZXJhYmxlX2ljb25TZWN0aW9uX2Rlc2M9UGVyc29uYWxpenphcmUgbGUgaWNvbmUgcGVyIHF1ZXN0byBjb21wb25lbnRlIGRpc3RyaWJ1aWJpbGUuDQotZGVsaXZlcmFibGVfbm90YXRpb25TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgY29uc2VnbmEgcGVyIHF1ZXN0byBjb21wb25lbnRlIGRpc3RyaWJ1aWJpbGUuDQotZGVsaXZlcmFibGVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIHN1bGxhIHBlcnNvbmFsaXp6YXppb25lIHJlbGF0aXZlIGEgcXVlc3RvIGNvbXBvbmVudGUgZGlzdHJpYnVpYmlsZS4NCi1kZWxpdmVyYWJsZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZpY2FyZSBpbiBjaGUgbW9kbyBxdWVzdG8gY29tcG9uZW50ZSBkaXN0cmlidWliaWxlIHNpIGNvcnJlbGEgYSB1biBhbHRybyBjb21wb25lbnRlIGRpc3RyaWJ1aWJpbGUuDQotZGVsaXZlcmFibGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RvIGNvbXBvbmVudGUgZGlzdHJpYnVpYmlsZS4NCi0NCi1kaXNjaXBsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBkZXR0YWdsaWF0ZSBzdSBxdWVzdGEgZGlzY2lwbGluYS4NCi1kaXNjaXBsaW5lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0YSBkaXNjaXBsaW5hLg0KLWRpc2NpcGxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmaWNhcmUgaW4gY2hlIG1vZG8gcXVlc3RhIGRpc2NpcGxpbmEgc2kgY29ycmVsYSBhIHVuJ2FsdHJhIGRpc2NpcGxpbmEuDQotZGlzY2lwbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSB2ZXJzaW9uZSBkaSBxdWVzdGEgZGlzY2lwbGluYS4NCi0NCi1kb21haW5fZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGRldHRhZ2xpYXRlIHN1IHF1ZXN0byBkb21pbmlvLg0KLWRvbWFpbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBnZW5lcmFsaSBzdSBxdWVzdG8gZG9taW5pby4NCi1kb21haW5fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmaWNhcmUgaW4gY2hlIG1vZG8gcXVlc3RvIGRvbWluaW8gc2kgY29ycmVsYSBhIHVuIGFsdHJvIGRvbWluaW8uDQotZG9tYWluX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIHN1bGxhIHZlcnNpb25lIGRpIHF1ZXN0byBkb21pbmlvLg0KLQ0KLXdvcmtwcm9kdWN0dHlwZV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZGV0dGFnbGlhdGUgc3UgcXVlc3RvIHRpcG8gZGkgcHJvZG90dG8gZGkgbGF2b3JvLg0KLXdvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBnZW5lcmFsaSBzdSBxdWVzdG8gdGlwbyBkaSBwcm9kb3R0byBkaSBsYXZvcm8uDQotd29ya3Byb2R1Y3R0eXBlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGluIGNoZSBtb2RvIHF1ZXN0byB0aXBvIGRpIHByb2RvdHRvIGRpIGxhdm9ybyBzaSBjb3JyZWxhIGEgdW4gYWx0cm8gdGlwbyBkaSBwcm9kb3R0byBkaSBsYXZvcm8uDQotd29ya3Byb2R1Y3R0eXBlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIHN1bGxhIHZlcnNpb25lIGRpIHF1ZXN0byB0aXBvIGRpIHByb2RvdHRvIGRpIGxhdm9yby4NCi0NCi1yb2xlc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBkZXR0YWdsaWF0ZSBzdSBxdWVzdG8gaW5zaWVtZSBkaSBydW9saS4NCi1yb2xlc2V0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0byBpbnNpZW1lIGRpIHJ1b2xpLg0KLXJvbGVzZXRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmaWNhcmUgaW4gY2hlIG1vZG8gcXVlc3RvIGluc2llbWUgZGkgcnVvbGkgc2kgY29ycmVsYSBhIHVuIGFsdHJvIGluc2llbWUgZGkgcnVvbGkuDQotcm9sZXNldF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSB2ZXJzaW9uZSBkaSBxdWVzdG8gaW5zaWVtZSBkaSBydW9saS4NCi0NCi10b29sX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBkZXR0YWdsaWF0ZSBzdSBxdWVzdG8gdG9vbC4NCi10b29sX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0byB0b29sLg0KLXRvb2xfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmaWNhcmUgaW4gY2hlIG1vZG8gcXVlc3RvIHRvb2wgc2kgY29ycmVsYSBhIHVuIGFsdHJvIHRvb2wuDQotdG9vbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSB2ZXJzaW9uZSBkaSBxdWVzdG8gdG9vbC4NCi0NCi1jb25jZXB0X2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBkZXR0YWdsaWF0ZSBzdSBxdWVzdG8gY29uY2V0dG8uDQotY29uY2VwdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBnZW5lcmFsaSBzdSBxdWVzdG8gY29uY2V0dG8uDQotY29uY2VwdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZpY2FyZSBpbiBjaGUgbW9kbyBxdWVzdG8gY29uY2V0dG8gc2kgY29ycmVsYSBhIHVuIGFsdHJvIGNvbmNldHRvLg0KLWNvbmNlcHRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RvIGNvbmNldHRvLg0KLQ0KLWNoZWNrbGlzdF9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZGV0dGFnbGlhdGUgc3UgcXVlc3RvIGVsZW5jbyBkaSBjb250cm9sbG8uDQotY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0byBlbGVuY28gZGkgY29udHJvbGxvLg0KLWNoZWNrbGlzdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZpY2FyZSBpbiBjaGUgbW9kbyBxdWVzdG8gZWxlbmNvIGRpIGNvbnRyb2xsbyBzaSBjb3JyZWxhIGEgdW4gYWx0cm8gZWxlbmNvIGRpIGNvbnRyb2xsby4NCi1jaGVja2xpc3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RvIGVsZW5jbyBkaSBjb250cm9sbG8uDQotDQotZXhhbXBsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZGV0dGFnbGlhdGUgc3UgcXVlc3RvIGVzZW1waW8uDQotZXhhbXBsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBnZW5lcmFsaSBzdSBxdWVzdG8gZXNlbXBpby4NCi1leGFtcGxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGluIGNoZSBtb2RvIHF1ZXN0byBlc2VtcGlvIHNpIGNvcnJlbGEgYSB1biBhbHRybyBlc2VtcGlvLg0KLWV4YW1wbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RvIGVzZW1waW8uDQotDQotZ3VpZGVsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBkZXR0YWdsaWF0ZSBzdSBxdWVzdGEgbGluZWEgZ3VpZGEuDQotZ3VpZGVsaW5lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0YSBsaW5lYSBndWlkYS4NCi1ndWlkZWxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmaWNhcmUgaW4gY2hlIG1vZG8gcXVlc3RhIGxpbmVhIGd1aWRhIHNpIGNvcnJlbGEgYSB1bidhbHRyYSBsaW5lYSBndWlkYS4NCi1ndWlkZWxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RhIGxpbmVhIGd1aWRhLg0KLQ0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBkZXR0YWdsaWF0ZSBzdSBxdWVzdGEgY29uc2lkZXJhemlvbmUgc3VsbGEgdmFsdXRhemlvbmUuDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3UgcXVlc3RhIGNvbnNpZGVyYXppb25lIHN1bGxhIHZhbHV0YXppb25lLg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGluIGNoZSBtb2RvIHF1ZXN0YSBjb25zaWRlcmF6aW9uZSBzdWxsYSB2YWx1dGF6aW9uZSBzaSBjb3JyZWxhIGEgdW4nYWx0cmEgY29uc2lkZXJhemlvbmUgc3VsbGEgdmFsdXRhemlvbmUuDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RhIGNvbnNpZGVyYXppb25lIHN1bGxhIHZhbHV0YXppb25lLg0KLQ0KLXByYWN0aWNlX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBkZXR0YWdsaWF0ZSBzdSBxdWVzdGEgcHJhdGljYS4NCi1wcmFjdGljZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBnZW5lcmFsaSBzdSBxdWVzdGEgcHJhdGljYS4NCi1wcmFjdGljZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZpY2FyZSBpbiBjaGUgbW9kbyBxdWVzdGEgcHJhdGljYSBzaSBjb3JyZWxhIGEgdW4nYWx0cmEgcHJhdGljYS4NCi1wcmFjdGljZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSB2ZXJzaW9uZSBkaSBxdWVzdGEgcHJhdGljYS4NCi0NCi1yZXBvcnRfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGRldHRhZ2xpYXRlIHN1IHF1ZXN0byByZXBvcnQuDQotcmVwb3J0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0byByZXBvcnQuDQotcmVwb3J0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGluIGNoZSBtb2RvIHF1ZXN0byByZXBvcnQgc2kgY29ycmVsYSBhIHVuIGFsdHJvIHJlcG9ydC4NCi1yZXBvcnRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RvIHJlcG9ydC4NCi0NCi1yZXN1YWJsZWFzc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBkZXR0YWdsaWF0ZSBzdSBxdWVzdGEgcmlzb3JzYSByaXV0aWxpenphYmlsZS4NCi1yZXN1YWJsZWFzc2V0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0YSByaXNvcnNhIHJpdXRpbGl6emFiaWxlLg0KLXJlc3VhYmxlYXNzZXRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmaWNhcmUgaW4gY2hlIG1vZG8gcXVlc3RhIHJpc29yc2Egcml1dGlsaXp6YWJpbGUgc2kgY29ycmVsYSBhIHVuJ2FsdHJhIHJpc29yc2Egcml1dGlsaXp6YWJpbGUuDQotcmVzdWFibGVhc3NldF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSB2ZXJzaW9uZSBkaSBxdWVzdGEgcmlzb3JzYSByaXV0aWxpenphYmlsZS4NCi0NCi1yb2FkbWFwX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBkZXR0YWdsaWF0ZSBzdSBxdWVzdGEgcm9hZG1hcC4NCi1yb2FkbWFwX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0YSByb2FkbWFwLg0KLXJvYWRtYXBfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmaWNhcmUgaW4gY2hlIG1vZG8gcXVlc3RhIHJvYWRtYXAgc2kgY29ycmVsYSBhIHVuJ2FsdHJhIHJvYWRtYXAuDQotcm9hZG1hcF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSB2ZXJzaW9uZSBkaSBxdWVzdGEgcm9hZG1hcC4NCi0NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGRldHRhZ2xpYXRlIHN1IHF1ZXN0byBtYXRlcmlhbGUgZGkgc3VwcG9ydG8uDQotc3VwcG9ydGluZ21hdGVyaWFsX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0byBtYXRlcmlhbGUgZGkgc3VwcG9ydG8uDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGluIGNoZSBtb2RvIHF1ZXN0byBtYXRlcmlhbGUgZGkgc3VwcG9ydG8gc2kgY29ycmVsYSBhIHVuIGFsdHJvIG1hdGVyaWFsZSBkaSBzdXBwb3J0by4NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RvIG1hdGVyaWFsZSBkaSBzdXBwb3J0by4NCi0NCi10ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZGV0dGFnbGlhdGUgc3UgcXVlc3RvIG1vZGVsbG8uDQotdGVtcGxhdGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3UgcXVlc3RvIG1vZGVsbG8uDQotdGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmaWNhcmUgaW4gY2hlIG1vZG8gcXVlc3RvIG1vZGVsbG8gc2kgY29ycmVsYSBhIHVuIGFsdHJvIG1vZGVsbG8uDQotdGVtcGxhdGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RvIG1vZGVsbG8uDQotDQotdGVybWRlZmluaXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGRldHRhZ2xpYXRlIHN1IHF1ZXN0YSBkZWZpbml6aW9uZSB0ZXJtaW5lLg0KLXRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0YSBkZWZpbml6aW9uZSB0ZXJtaW5lLg0KLXRlcm1kZWZpbml0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGluIGNoZSBtb2RvIHF1ZXN0YSBkZWZpbml6aW9uZSB0ZXJtaW5lIHNpIGNvcnJlbGEgYSB1bidhbHRyYSBkZWZpbml6aW9uZSB0ZXJtaW5lLg0KLXRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIHN1bGxhIHZlcnNpb25lIGRpIHF1ZXN0YSBkZWZpbml6aW9uZSB0ZXJtaW5lLg0KLQ0KLXRvb2xtZW50b3JfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGRldHRhZ2xpYXRlIHN1IHF1ZXN0YSBndWlkYSBhbCB0b29sLg0KLXRvb2xtZW50b3JfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3UgcXVlc3RhIGd1aWRhIGFsIHRvb2wuDQotdG9vbG1lbnRvcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZpY2FyZSBpbiBjaGUgbW9kbyBxdWVzdGEgZ3VpZGEgYWwgdG9vbCBzaSBjb3JyZWxhIGEgdW4nYWx0cmEgZ3VpZGEgYWwgdG9vbC4NCi10b29sbWVudG9yX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIHN1bGxhIHZlcnNpb25lIGRpIHF1ZXN0YSBndWlkYSBhbCB0b29sLg0KLQ0KLXdoaXRlcGFwZXJfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGRldHRhZ2xpYXRlIHN1IHF1ZXN0byB3aGl0ZXBhcGVyLg0KLXdoaXRlcGFwZXJfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3UgcXVlc3RvIHdoaXRlcGFwZXIuDQotd2hpdGVwYXBlcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZpY2FyZSBpbiBjaGUgbW9kbyBxdWVzdG8gd2hpdGVwYXBlciBzaSBjb3JyZWxhIGEgdW4gYWx0cm8gd2hpdGVwYXBlci4NCi13aGl0ZXBhcGVyX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIHN1bGxhIHZlcnNpb25lIGRpIHF1ZXN0byB3aGl0ZXBhcGVyLg0KLQ0KLWRpc2NpcGxpbmVncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZGV0dGFnbGlhdGUgc3UgcXVlc3RvIHJhZ2dydXBwYW1lbnRvIGRpIGRpc2NpcGxpbmUuDQotZGlzY2lwbGluZWdyb3VwaW5nX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0byByYWdncnVwcGFtZW50byBkaSBkaXNjaXBsaW5lLg0KLWRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZpY2FyZSBpbiBjaGUgbW9kbyBxdWVzdG8gcmFnZ3J1cHBhbWVudG8gZGkgZGlzY2lwbGluZSBzaSBjb3JyZWxhIGEgdW4gYWx0cm8gcmFnZ3J1cHBhbWVudG8gZGkgZGlzY2lwbGluZS4NCi1kaXNjaXBsaW5lZ3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgdmVyc2lvbmUgZGkgcXVlc3RvIHJhZ2dydXBwYW1lbnRvIGRpIGRpc2NpcGxpbmUuDQotDQotcm9sZXNldGdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBkZXR0YWdsaWF0ZSBzdSBxdWVzdG8gcmFnZ3J1cHBhbWVudG8gaW5zaWVtaSBkaSBydW9saS4NCi1yb2xlc2V0Z3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3UgcXVlc3RvIHJhZ2dydXBwYW1lbnRvIGluc2llbWkgZGkgcnVvbGkuDQotcm9sZXNldGdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGluIGNoZSBtb2RvIHF1ZXN0byByYWdncnVwcGFtZW50byBpbnNpZW1pIGRpIHJ1b2xpIHNpIGNvcnJlbGEgYSB1biBhbHRybyByYWdncnVwcGFtZW50byBpbnNpZW1pIGRpIHJ1b2xpLg0KLXJvbGVzZXRncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSB2ZXJzaW9uZSBkaSBxdWVzdG8gcmFnZ3J1cHBhbWVudG8gaW5zaWVtaSBkaSBydW9saS4NCi0NCi1jdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmlyZSBpbmZvcm1hemlvbmkgZGV0dGFnbGlhdGUgc3UgcXVlc3RhIGNhdGVnb3JpYSBwZXJzb25hbGl6emF0YS4NCi1jdXN0b21jYXRlZ29yeV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBnZW5lcmFsaSBzdSBxdWVzdGEgY2F0ZWdvcmlhIHBlcnNvbmFsaXp6YXRhLg0KLWN1c3RvbWNhdGVnb3J5X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZmljYXJlIGluIGNoZSBtb2RvIHF1ZXN0YSBjYXRlZ29yaWEgcGVyc29uYWxpenphdGEgc2kgY29ycmVsYSBhIHVuJ2FsdHJhIGNhdGVnb3JpYSBwZXJzb25hbGl6emF0YS4NCi1jdXN0b21jYXRlZ29yeV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSB2ZXJzaW9uZSBkaSBxdWVzdGEgY2F0ZWdvcmlhIHBlcnNvbmFsaXp6YXRhLg0KLWN1c3RvbWNhdGVnb3J5X0ljb25TZWN0aW9uX2Rlc2M9UGVyc29uYWxpenphcmUgbGUgaWNvbmUgcGVyIHF1ZXN0YSBjYXRlZ29yaWEgcGVyc29uYWxpenphdGEuDQotDQotY29uY2VwdF9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaXp6YXJlIGxlIGljb25lIHBlciBxdWVzdG8gY29uY2V0dG8uDQotY2hlY2tsaXN0X2ljb25TZWN0aW9uX2Rlc2M9UGVyc29uYWxpenphcmUgbGUgaWNvbmUgcGVyIHF1ZXN0byBlbGVuY28gZGkgY29udHJvbGxvLg0KLXRvb2xtZW50b3JfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25hbGl6emFyZSBsZSBpY29uZSBwZXIgcXVlc3RhIGd1aWRhIGFsIHRvb2wuDQotd2hpdGVwYXBlcl9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaXp6YXJlIGxlIGljb25lIHBlciBxdWVzdG8gd2hpdGVwYXBlci4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaXp6YXJlIGxlIGljb25lIHBlciBxdWVzdGEgY29uc2lkZXJhemlvbmUgc3VsbGEgdmFsdXRhemlvbmUuDQotdGVybWRlZmluaXRpb25faWNvblNlY3Rpb25fZGVzYz1QZXJzb25hbGl6emFyZSBsZSBpY29uZSBwZXIgcXVlc3RhIGRlZmluaXppb25lIHRlcm1pbmUuDQotdGVtcGxhdGVfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25hbGl6emFyZSBsZSBpY29uZSBwZXIgcXVlc3RvIG1vZGVsbG8uDQotcmV1c2FibGVhc3NldF9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaXp6YXJlIGxlIGljb25lIHBlciBxdWVzdGEgcmlzb3JzYSByaXV0aWxpenphYmlsZS4NCi1yZXBvcnRfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25hbGl6emFyZSBsZSBpY29uZSBwZXIgcXVlc3RvIHJlcG9ydC4NCi1wcmFjdGljZV9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaXp6YXJlIGxlIGljb25lIHBlciBxdWVzdGEgcHJhdGljYS4NCi1leGFtcGxlX2ljb25TZWN0aW9uX2Rlc2M9UGVyc29uYWxpenphcmUgbGUgaWNvbmUgcGVyIHF1ZXN0byBlc2VtcGlvLg0KLWd1aWRlbGluZV9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaXp6YXJlIGxlIGljb25lIHBlciBxdWVzdGEgbGluZWEgZ3VpZGEuDQotcm9hZG1hcF9pY29uU2VjdGlvbl9kZXNjPVBlcnNvbmFsaXp6YXJlIGxlIGljb25lIHBlciBxdWVzdGEgcm9hZG1hcC4NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfaWNvblNlY3Rpb25fZGVzYz1QZXJzb25hbGl6emFyZSBsZSBpY29uZSBwZXIgcXVlc3RvIG1hdGVyaWFsZSBkaSBzdXBwb3J0by4NCi0NCi1lZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY190aXRsZT1GaWxlIG1vZGlmaWNhdG8NCi1lZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY19tZXNzYWdlPUlsIGZpbGUgXHUwMGU4IHN0YXRvIG1vZGlmaWNhdG8gc3VsIGZpbGUgc3lzdGVtLiBDYXJpY2FyZSBsZSBtb2RpZmljaGU/DQotDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU9VmFyaWFiaWxpdFx1MDBlMCBhdHRpdml0XHUwMGUwDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnPUwnJ2F0dGl2aXRcdTAwZTAgJyd7MH0nJyBub24gcHVcdTAwZjIgaW1wb3N0YXJlIGxhIHZhcmlhYmlsaXRcdTAwZTAgY29uICcnezF9JycgcG9pY2hcdTAwZTkgJyd7MX0nJyBkaXNwb25lIGRpIHVuYSBvIHBpXHUwMGY5IGF0dGl2aXRcdTAwZTAgY29udHJpYnVpdGEvc29zdGl0dWl0YSBjb21lIGdsaSBlbGVtZW50aSBjaGlsZC4NCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cxPUwnJ2F0dGl2aXRcdTAwZTAgJyd7MH0nJyBub24gcHVcdTAwZjIgaW1wb3N0YXJlIGxhIHZhcmlhYmlsaXRcdTAwZTAgY29uIHVubyBkZWkgcGFyZW50IGRpcmV0dGkgZSBxdWFsc2lhc2kgcHJvY2Vzc28uDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMj1MJydhdHRpdml0XHUwMGUwICcnezB9Jycgbm9uIHB1XHUwMGYyIGltcG9zdGFyZSBsYSB2YXJpYWJpbGl0XHUwMGUwIGNvbiAnJ3sxfScnIHBvaWNoXHUwMGU5IGRldGVybWluZXJcdTAwZTAgdW5hIGRpcGVuZGVuemEgY2lyY29sYXJlLg0KLQ0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfdGl0bGU9QXBwbGljYSBtb2RlbGxvDQotYXBwbHlfcGF0dGVybl9lcnJvcl9tc2c9TCcnYXR0aXZpdFx1MDBlMCAnJ3swfScnIG5vbiBwdVx1MDBmMiBhcHBsaWNhcmUgaSBtb2RlbGxpIGNvbiAnJ3sxfScnIHBvaWNoXHUwMGU4IGRldGVybWluZXJcdTAwZTAgdW5hIGRpcGVuZGVuemEgY2lzcmNvbGFyZS4NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotQ2hhbmdlSGlzdG9yeURpYWxvZ19kZWxpbWl0ZXI9fA0KLU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3Jfc2hvd093bmVySW5MaWJyYXJ5Vmlldz1Nb3N0cmEgcHJvcHJpZXRhcmlvIGRpIHF1ZXN0byByaWZlcmltZW50byBub24gcmlzb2x0byBuZWxsYSB2aXN0YSBsaWJyZXJpYQ0KLU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlVW5yZXNvbHZlZFJlZmVyZW5jZT1SaW11b3ZpIHF1ZXN0byByaWZlcmltZW50byBub24gcmlzb2x0bw0KLXByb21wdERlbGV0ZUN1c3RvbUNhdGVnb3J5QmVmb3JlUmVtb3ZlTGFzdFJlZlRvSXQ9U2kgc3RhIHBlciByaW11b3ZlcmUgbCcndWx0aW1vIHJpZmVyaW1lbnRvIGEgezB9IG5lbCBwbHVnaW4uIEdsaSBlbGVtZW50aSB2ZXJyYW5ubyBlbGltaW5hdGkuIENvbnRpbnVhcmU/DQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSNCZWxvdyBwcm9wZXJ0eSAiZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzIiBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQNCi0jRG9uJ3QgZGVsZXRlIGEgc3BhY2UgYWZ0ZXIgIjogIg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzPTogDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXNfamEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1YmU5ZDUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXNfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEZvcm0gUGFnZSBUaXRsZXMNCi1hc3NpZ25QYWdlX3RpdGxlPVx1NTI3Mlx1MzA4YVx1NWY1M1x1MzA2Ng0KLWNhdGVnb3JpZXNQYWdlX3RpdGxlPVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmYw0KLWRlbGl2ZXJhYmxlUGFydHNQYWdlX3RpdGxlPVx1N2QwZFx1NTE2NVx1NzI2OQ0KLWRlc2NyaXB0aW9uUGFnZV90aXRsZT1cdThhYWNcdTY2MGUNCi1kaXNjaXBsaW5lc1BhZ2VfdGl0bGU9XHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlDQotZGlzY2FyZHVucmVzb2x2ZWRyZWY9XHU2NzJhXHU4OWUzXHU2YzdhXHUzMDZlXHU1M2MyXHU3MTY3XHUzMDZlXHU3ODM0XHU2OGM0DQotZ3VpZGFuY2VQYWdlX3RpdGxlPVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOQ0KLXByZXZpZXdQYWdlX3RpdGxlPVx1MzBkN1x1MzBlY1x1MzBkM1x1MzBlNVx1MzBmYw0KLXJlZmVyZW5jZXNQYWdlX3RpdGxlPVx1NTNjMlx1NzE2Nw0KLXJlZmVyZW5jZV90ZXh0PVx1NTNjMlx1NzE2NzoNCi1yZWZlcmVuY2VXb3JrZmxvd1BhZ2VfdGl0bGU9XHU1M2MyXHU3MTY3XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGQ1XHUzMGVkXHUzMGZjDQotcm9sZXNQYWdlX3RpdGxlPVx1MzBlZFx1MzBmY1x1MzBlYg0KLXJvbGVTZXRzUGFnZV90aXRsZT1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzgNCi1zdGVwc1BhZ2VfdGl0bGU9XHUzMGI5XHUzMGM2XHUzMGMzXHUzMGQ3DQotdGFza3NQYWdlX3RpdGxlPVx1MzBiZlx1MzBiOVx1MzBhZg0KLXRvb2xNZW50b3JzUGFnZV90aXRsZT1cdTMwYzRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwZTFcdTMwZjNcdTMwYmZcdTMwZmMNCi13b3JrUHJvZHVjdHNQYWdlX3RpdGxlPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLQ0KLSMgU2VjdGlvbiBOYW1lcyAmIERlc2NyaXB0aW9uDQotY2hlY2tJdGVtc1NlY3Rpb25fbmFtZT1cdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTk4MDVcdTc2ZWUNCi1jaGVja0l0ZW1zU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1MzBlYVx1MzBiOVx1MzBjOFx1MzA5Mlx1NjljYlx1NjIxMFx1MzA1OVx1MzA4Ylx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1OTgwNVx1NzZlZVx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWRlcGVuZGVuY2llc1NlY3Rpb25fbmFtZT1cdTRmOWRcdTViNThcdTk1YTJcdTRmYzINCi1kZXBlbmRlbmNpZXNTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGJiXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDY3XHUzMDZmXHUzMDAxXHU0ZWQ2XHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMGZiXHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4XHUzMDZiXHU1YmZlXHUzMDU5XHUzMDhiXHUzMDUzXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMGZiXHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4XHUzMDZlXHU0ZjlkXHU1YjU4XHU5NWEyXHU0ZmMyXHUzMDkyXHU3OTNhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZGV0YWlsU2VjdGlvbl9uYW1lPVx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMQ0KLWRldGFpbFNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmV7MH1cdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdThhNzNcdTdkMzBcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1nZW5lcmFsSW5mb1NlY3Rpb25fbmFtZT1cdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzENCi1nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmV7MH1cdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1pY29uU2VjdGlvbl9uYW1lPVx1MzBhMlx1MzBhNFx1MzBiM1x1MzBmMw0KLWljb25TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlezB9XHUzMDZlXHUzMGEyXHUzMGE0XHUzMGIzXHUzMGYzXHUzMDkyXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGRlXHUzMGE0XHUzMGJhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotbm90YXRpb25TZWN0aW9uX25hbWU9XHUzMGM3XHUzMGVhXHUzMGQwXHUzMGVhXHUzMGZjXHU2MGM1XHU1ODMxDQotbm90YXRpb25TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlIHswfSBcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTMwYzdcdTMwZWFcdTMwZDBcdTMwZWFcdTMwZmNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1yZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fbmFtZT1cdTUzYzJcdTcxNjdcdTUxNDhcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjM6DQotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGJiXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDY3XHUzMDZmXHUzMDAxXHUzMDUzXHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDRjXHU1M2MyXHU3MTY3XHUzMDU5XHUzMDhiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDkyXHU3OTNhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotc3RhZmZpbmdTZWN0aW9uX25hbWU9XHU5MTRkXHU1YzVlXHU2MGM1XHU1ODMxDQotc3RhZmZpbmdTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU5MTRkXHU1YzVlXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotc3RlcHNTZWN0aW9uX25hbWU9XHUzMGI5XHUzMGM2XHUzMGMzXHUzMGQ3DQotc3RlcHNTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGJmXHUzMGI5XHUzMGFmXHUzMDZlXHU1YjlmXHU4ODRjXHUzMGI5XHUzMGM2XHUzMGMzXHUzMGQ3XHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdGFpbG9yaW5nU2VjdGlvbl9uYW1lPVx1OGFiZlx1NjU3NA0KLXRhaWxvcmluZ1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmV7MH1cdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdThhYmZcdTY1NzRcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi12YXJpYWJpbGl0eVNlY3Rpb25fbmFtZT1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwNmVcdTUzZWZcdTU5MDlcdTYwMjcNCi12YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmUgezB9IFx1MzA2OFx1NTIyNVx1MzA2ZSB7MH0gXHUzMDY4XHUzMDZlXHU5NWEyXHU0ZmMyXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdmVyc2lvbkluZm9TZWN0aW9uX25hbWU9XHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxDQotdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlezB9XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBVSSAmIEVsZW1lbnQgQXR0cmlidXRlIExhYmVscw0KLWFkZGl0aW9uYWxJbmZvX3RleHQ9XHU4ZmZkXHU1MmEwXHU2MGM1XHU1ODMxOg0KLWFwcGxpY2F0aW9uX3RleHQ9XHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzOg0KLWFjdGlvbkxhYmVsX2VkaXQ9XHU3ZGU4XHU5NmM2DQotYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdj1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDNcdTMwZTVcdTMwZmNcdTMwNmJcdTg4NjhcdTc5M2ENCi1hbHRlcm5hdGl2ZXNfdGV4dD1cdTRlZTNcdTY4NDg6DQotYXNzaWdubWVudEFwcHJvYWNoZXNfdGV4dD1cdTUyNzJcdTMwOGFcdTVmNTNcdTMwNjZcdTY1YjlcdTZjZDU6DQotYXV0aG9yc190ZXh0PVx1NGY1Y1x1NjIxMFx1ODAwNToNCi1iYWNrZ3JvdW5kX3RleHQ9XHUzMGQwXHUzMGMzXHUzMGFmXHUzMGIwXHUzMGU5XHUzMGE2XHUzMGYzXHUzMGM5Og0KLWJhc2VFbGVtZW50X3RleHQ9XHU1N2ZhXHU2NzJjOg0KLWJhc2VHdWlkYW5jZV90ZXh0PVx1NTdmYVx1NjcyY1x1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOToNCi1icmllZkRlc2NyaXB0aW9uX3RleHQ9XHU4OTgxXHU2NWU4Og0KLWRlc2NyaXB0aW9uX3RleHQ9XHU4YWFjXHU2NjBlOg0KLWJhY2t1cGJlZm9yZXNhdmVfdGV4dD1cdTRmZGRcdTdiYTFcdTUyNGRcdTMwNmJcdTMwZDBcdTMwYzNcdTMwYWZcdTMwYTJcdTMwYzNcdTMwZDcNCi1icmllZk91dGxpbmVfdGV4dD1cdTY5ODJcdTg5ODE6DQotY2hhbmdlRGF0ZV90ZXh0PVx1NTkwOVx1NjZmNFx1NjVlNToNCi1jaGFuZ2VEZXNjcmlwdGlvbl90ZXh0PVx1NTkwOVx1NjZmNFx1MzA2ZVx1OGFhY1x1NjYwZToNCi1jaGVja0l0ZW1zX3RleHQ9XHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHU5ODA1XHU3NmVlDQotY29udHJpYnV0ZXNfdGV4dD1cdTViYzRcdTRlMGUNCi1sb2NhbENvbnRyaWJ1dGVzX3RleHQ9XHUzMGVkXHUzMGZjXHUzMGFiXHUzMGViXHU1YmM0XHU0ZTBlDQotY29udHJpYnV0ZXNfdG9fdGV4dD1cdTViYzRcdTRlMGVcdTViZmVcdThjNjENCi1jb3B5cmlnaHRfdGV4dD1cdTg0NTdcdTRmNWNcdTZhMjk6DQotZWRpdG9yX3RleHQ9XHUzMGE4XHUzMGM3XHUzMGEzXHUzMGJmXHUzMGZjDQotZXh0ZW5kc190ZXh0PVx1NjJlMVx1NWYzNQ0KLWV4dGVuZF90ZXh0PVx1NjJlMVx1NWYzNQ0KLWV4dGVybmFsRGVzY3JpcHRpb25fdGV4dD1cdTU5MTZcdTkwZThcdThhMThcdThmZjA6DQotZXh0ZXJuYWxJZF90ZXh0PVx1NTkxNlx1OTBlOCBJRDoNCi1nb2Fsc190ZXh0PVx1NzZlZVx1NmExOToNCi1pbXBhY3RPZk5vdEhhdmluZ190ZXh0PVx1MzA2YVx1MzA0NFx1NTgzNFx1NTQwOFx1MzA2ZVx1NWY3MVx1OTdmZjoNCi1rZXlDb25zaWRlcmF0aW9uc190ZXh0PVx1NGUzYlx1MzA2YVx1ODAwM1x1NjE2ZVx1NGU4Ylx1OTgwNToNCi1sZXZlbHNPZkFkb3B0aW9uX3RleHQ9XHU2M2ExXHU3NTI4XHUzMGVjXHUzMGQ5XHUzMGViOg0KLW1haW5EZXNjcmlwdGlvbl90ZXh0PVx1OGFhY1x1NjYwZToNCi1uZXdFbGVtZW50X3RleHQ9XHU2NWIwXHU4OThmIHswfQ0KLW5hbWVfdGV4dD1cdTU0MGRcdTUyNGQ6DQotbm90QXBwbGljYWJsZV90ZXh0PVx1OTA2OVx1NzUyOFx1NTkxNg0KLXBhY2thZ2luZ0d1aWRhbmNlX3RleHQ9XHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4XHU1MzE2XHUzMDZlXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5Og0KLXByZXNlbnRhdGlvbk5hbWVfdGV4dD1cdTg4NjhcdTc5M2FcdTU0MGQ6DQotcHJvbXB0Zm9ybGliYXJ5X3RleHQ9XHU1OWNiXHU1MmQ1XHU2NjQyXHUzMDZiXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDkyXHUzMGQ3XHUzMGVkXHUzMGYzXHUzMGQ3XHUzMGM4XHUzMDU5XHUzMDhiDQotZW5hYmxlSGVhbHRoQ2hlY2tfdGV4dD1cdTUxODVcdTkwZThcdTMwYzdcdTMwZDBcdTMwYzNcdTMwYjBcdTMwZmJcdTMwYzRcdTMwZmNcdTMwZWJcdTMwOTJcdTRmN2ZcdTc1MjhcdTUzZWZcdTgwZmRcdTMwNmJcdTMwNTlcdTMwOGINCi1wcm9ibGVtX3RleHQ9XHU1NTRmXHU5ODRjOg0KLXB1cnBvc2VfdGV4dD1cdTc2ZWVcdTc2ODQ6DQotcmVhc29uRm9yTm90TmVlZGluZ190ZXh0PVx1NGUwZFx1ODk4MVx1MzA2N1x1MzA0Mlx1MzA4Ylx1NzQwNlx1NzUzMToNCi1yZXBsYWNlc190ZXh0PVx1N2Y2ZVx1NjNkYg0KLWxvY2FsUmVwbGFjZXNfdGV4dD1cdTMwZWRcdTMwZmNcdTMwYWJcdTMwZWJcdTdmNmVcdTYzZGINCi1yZXByZXNlbnRhdGlvbk9wdGlvbnNfdGV4dD1cdTg4NjhcdTc5M2FcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjM6DQotdGVtcGxhdGVGaWxlX3RleHQ9XHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViOg0KLXNraWxsc190ZXh0PVx1MzBiOVx1MzBhZFx1MzBlYjoNCi1zdGVwc190ZXh0PVx1MzBiOVx1MzBjNlx1MzBjM1x1MzBkNzoNCi1zdGVwc19uYW1lX3RleHQ9XHU1NDBkXHU1MjRkOg0KLXN0b3BfdGV4dD1cdTUwNWNcdTZiNjINCi1wcmludF90ZXh0PVx1NTM3MFx1NTIzNw0KLXN5bm9ueW1zX3RleHQ9XHU1NDBjXHU3ZmE5XHU4YTllOg0KLXR5cGVfdGV4dD1cdTMwYmZcdTMwYTRcdTMwZDc6DQotY29weV90ZXh0PVx1MzBiM1x1MzBkNFx1MzBmYw0KLWRlZXBDb3B5X3RleHQ9XHUzMGM3XHUzMGEzXHUzMGZjXHUzMGQ3XHUzMGZiXHUzMGIzXHUzMGQ0XHUzMGZjDQotYmFja190ZXh0PVx1NjIzYlx1MzA4Yg0KLW5ld19wbHVnaW49XHU2NWIwXHU4OThmXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzDQotbW92ZT1cdTc5ZmJcdTUyZDUuLi4NCi11bmlxdWVJZF90ZXh0PVx1NTZmYVx1NjcwOSBJRDoNCi12YXJpYWJpbGl0eVR5cGVfdGV4dD1cdTUzZWZcdTU5MDlcdTYwMjdcdTMwNmVcdTMwYmZcdTMwYTRcdTMwZDc6DQotdmVyc2lvbl90ZXh0PVx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmMzoNCi0NCi0jIEJ1dHRvbiBMYWJlbHMNCi1hZGRCdXR0b25fdGV4dD1cdThmZmRcdTUyYTAuLi4NCi1hdHRhY2hCdXR0b25fdGV4dD1cdTZkZmJcdTRlZDguLi4NCi1icm93c2VCdXR0b25fdGV4dD1cdTUzYzJcdTcxNjcuLi4NCi1jaGFuZ2VUeXBlQnV0dG9uX3RleHQ9XHUzMGJmXHUzMGE0XHUzMGQ3XHUzMDZlXHU1OTA5XHU2NmY0Li4uDQotY2xlYXJCdXR0b25fdGV4dD1cdTMwYWZcdTMwZWFcdTMwYTINCi1kZWxldGVCdXR0b25fdGV4dD1cdTUyNGFcdTk2NjQNCi1kZXRhY2hCdXR0b25fdGV4dD1cdTZkZmJcdTRlZDhcdTUyNGFcdTk2NjQNCi1kaWFncmFtX3NhdmVFcnJvcj1cdTMwYzBcdTMwYTRcdTMwYTJcdTMwYjBcdTMwZTlcdTMwZTBcdTRmZGRcdTdiYTFcdTY2NDJcdTMwNmVcdTMwYThcdTMwZTlcdTMwZmMNCi1kb3duQnV0dG9uX3RleHQ9XHU0ZTBiXHUzMDc4DQotZGlyZWN0b3J5X3RleHQ9XHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjOg0KLW9yZGVyQnV0dG9uX3RleHQ9XHU5ODA2XHU1ZThmDQotZWRpdEJ1dHRvbl90ZXh0PVx1N2RlOFx1OTZjNi4uLg0KLXJlbW92ZUJ1dHRvbl90ZXh0PVx1OTY2NFx1NTNiYg0KLXJlbmFtZUFjdGlvbl90ZXh0PVx1NTQwZFx1NTI0ZFx1NTkwOVx1NjZmNC4uLg0KLXJlbW92ZV90ZXh0PVx1OTY2NFx1NTNiYg0KLXJlbmFtZV90ZXh0PVx1NTQwZFx1NTI0ZFx1NTkwOVx1NjZmNA0KLVNhdmVBc190ZXh0PVx1NTIyNVx1NTQwZFx1NGZkZFx1N2JhMQ0KLXNlbGVjdEJ1dHRvbl90ZXh0PVx1OTA3OFx1NjI5ZS4uLg0KLWRlc2VsZWN0QnV0dG9uX3RleHQ9XHU5MDc4XHU2MjllXHU4OWUzXHU5NjY0DQotdXBCdXR0b25fdGV4dD1cdTRlMGFcdTMwNzgNCi1tYWtlRGVmYXVsdEJ1dHRvbl90ZXh0PVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzA2Ylx1OGEyZFx1NWI5YQ0KLXZpZXdIaXN0b3J5QnV0dG9uX3RleHQ9XHU1YzY1XHU2Yjc0XHUzMDZlXHU4ODY4XHU3OTNhLi4uDQotDQotIyBSb2xlIEVkaXRvciBUYXNrcyBQYWdlDQotcm9sZVRhc2tzUGFnZV9zZWN0aW9uTmFtZT1cdTMwYmZcdTMwYjlcdTMwYWYNCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwNmZcdTMwMDFcdTZiMjFcdTMwNmVcdTMwYmZcdTMwYjlcdTMwYWZcdTMwNmVcdTViOWZcdTg4NGNcdTgwMDVcdTMwNjdcdTMwNTlcdTMwMDINCi1yb2xlVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPVx1OTA3OFx1NjI5ZVx1NTNlZlx1ODBmZFx1MzA2YVx1MzBiZlx1MzBiOVx1MzBhZg0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTU3ZmFcdTY3MmNcdTViOWZcdTg4NGNcdTgwMDU6DQotcm9sZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsMj1cdThmZmRcdTUyYTBcdTViOWZcdTg4NGNcdTgwMDU6DQotcm9sZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBcdTMwYmZcdTMwYjlcdTMwYWZcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIFJvbGUgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjODoNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMDRjXHU2MmM1XHU1ZjUzXHUzMDU5XHUzMDhiXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU5MDc4XHU2MjllXHU1M2VmXHU4MGZkXHUzMDZhXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4Og0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9XHU2MmM1XHU1ZjUzOg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzA0Y1x1NWI5Zlx1ODg0Y1x1MzA1OVx1MzA4Ylx1MzBiZlx1MzBiOVx1MzBhZlx1MzA2ZVx1NTFmYVx1NTI5Ylx1MzA2N1x1MzA0Mlx1MzA4Ylx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjODoNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIFJvbGUgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi1yb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOQ0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1OGZmZFx1NTJhMFx1NjBjNVx1NTgzMVx1MzA3OFx1MzA2ZVx1MzBlYVx1MzBmM1x1MzBhZlx1MzA5Mlx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1NWY2Mlx1NWYwZlx1MzA2N1x1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXJvbGVHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9XHU5MDc4XHU2MjllXHU1M2VmXHU4MGZkXHUzMDZhXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5Og0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjk6DQotcm9sZUd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIFJvbGUgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQ0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1cdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmM6DQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwNGNcdTVjNWVcdTMwNTlcdTMwOGJcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmNcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1yb2xlQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHUzMGVkXHUzMGZjXHUzMGViXHUzMGZiXHUzMGJiXHUzMGMzXHUzMGM4Og0KLXJvbGVDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9XHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjOg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjODoNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjOg0KLQ0KLSMgVGFzayBFZGl0b3IgUm9sZXMgUGFnZQ0KLXRhc2tSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU9XHUzMGVkXHUzMGZjXHUzMGViDQotdGFza1JvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGJmXHUzMGI5XHUzMGFmXHUzMDkyXHU1YjlmXHU4ODRjXHUzMDU5XHUzMDhiXHUzMGVkXHUzMGZjXHUzMGViXHUzMDkyXHU1MjcyXHUzMDhhXHU1ZjUzXHUzMDY2XHUzMDdlXHUzMDU5XHUzMDAyDQotdGFza1JvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTkwNzhcdTYyOWVcdTUzZWZcdTgwZmRcdTMwNmFcdTMwZWRcdTMwZmNcdTMwZWI6DQotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVx1NTdmYVx1NjcyY1x1NWI5Zlx1ODg0Y1x1ODAwNToNCi10YXNrUm9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1OGZmZFx1NTJhMFx1NWI5Zlx1ODg0Y1x1ODAwNToNCi10YXNrUm9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IFx1MzBlZFx1MzBmY1x1MzBlYlx1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLXRhc2tSb2xlc1BhZ2VfcHJpbWFyeVBlcmZvcm1lcl9tb2RpZnlfbWVzc2FnZT1JVVBBMDAwNDVXOiBcdTU3ZmFcdTY3MmNcdTViOWZcdTg4NGNcdTgwMDVcdTMwOTIgJyd7MH0nJyBcdTMwNmJcdTU5MDlcdTY2ZjRcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQotdGFza1JvbGVzUGFnZV9jb25maXJtX3RpdGxlPVx1NTdmYVx1NjcyY1x1MzBlZFx1MzBmY1x1MzBlYlx1MzA2ZVx1NTkwOVx1NjZmNFx1MzA2ZVx1NzhiYVx1OGE4ZA0KLQ0KLSMgVGFzayBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4DQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBiZlx1MzBiOVx1MzBhZlx1MzA2ZVx1NTE2NVx1NTFmYVx1NTI5Ylx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1OTA3OFx1NjI5ZVx1NTNlZlx1ODBmZFx1MzA2YVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9XHU1ZmM1XHU5ODA4XHU1MTY1XHU1MjliOg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmM1x1NTE2NVx1NTI5YjoNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMz1cdTUxZmFcdTUyOWI6DQotdGFza1dvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDRjXHU5MDc4XHU2MjllXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBUYXNrIEVkaXRvciBHdWlkYW5jZSBQYWdlDQotdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1cdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjkNCi10YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdThmZmRcdTUyYTBcdTYwYzVcdTU4MzFcdTMwNzhcdTMwNmVcdTMwZWFcdTMwZjNcdTMwYWZcdTMwOTJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTVmNjJcdTVmMGZcdTMwNjdcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi10YXNrR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPVx1OTA3OFx1NjI5ZVx1NTNlZlx1ODBmZFx1MzA2YVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOToNCi10YXNrR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9XHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5Og0KLXRhc2tHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDRjXHU5MDc4XHU2MjllXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBUYXNrIEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjDQotdGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwYmZcdTMwYjlcdTMwYWZcdTMwNGNcdTVjNWVcdTMwNTlcdTMwOGJcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmNcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi10YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlDQotdGFza0NhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1cdTMwYWJcdTMwYjlcdTMwYmZcdTMwZTBcdTMwZmJcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmMNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2U6DQotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1MzBhYlx1MzBiOVx1MzBiZlx1MzBlMFx1MzBmYlx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmYzoNCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgVGFza3MgUGFnZQ0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25OYW1lPVx1MzBiZlx1MzBiOVx1MzBhZg0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTMwNmZcdTMwMDFcdTZiMjFcdTMwNmVcdTMwYmZcdTMwYjlcdTMwYWZcdTMwNmVcdTUxNjVcdTUyOWJcdTMwN2VcdTMwNWZcdTMwNmZcdTUxZmFcdTUyOWJcdTMwNjdcdTMwNTlcdTMwMDINCi1Xb3JrUHJvZHVjdF9UYXNrc19BdmFpbGFibGVMYWJlbD1cdTkwNzhcdTYyOWVcdTUzZWZcdTgwZmRcdTMwNmFcdTMwYmZcdTMwYjlcdTMwYWYNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsPVx1NWZjNVx1OTgwOFx1NTE2NVx1NTI5YjoNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMj1cdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjNcdTUxNjVcdTUyOWI6DQotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDM9XHU1MWZhXHU1MjliOg0KLVdvcmtQcm9kdWN0X1Rhc2tzX011bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IFx1MzBiZlx1MzBiOVx1MzBhZlx1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBSb2xlcyBQYWdlDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU9XHUzMGVkXHUzMGZjXHUzMGViDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1NmIyMVx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzA2Zlx1MzAwMVx1MzA1M1x1MzA2ZVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1MzA5Mlx1NjJjNVx1NWY1M1x1MzA3ZVx1MzA1Zlx1MzA2Zlx1NTkwOVx1NjZmNFx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1OTA3OFx1NjI5ZVx1NTNlZlx1ODBmZFx1MzA2YVx1MzBlZFx1MzBmY1x1MzBlYg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHU2MmM1XHU1ZjUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViOg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1NTkwOVx1NjZmNFx1MzBlZFx1MzBmY1x1MzBlYjoNCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBcdTMwZWRcdTMwZmNcdTMwZWJcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIyBXb3JrIFByb2R1Y3QgRWRpdG9yIERlbGl2ZXJhYmxlIFBhcnRzIFBhZ2UNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25OYW1lPVx1N2QwZFx1NTE2NVx1NzI2OQ0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1N2QwZFx1NTE2NVx1NzI2OVx1MzA5Mlx1NjljYlx1NjIxMFx1MzA1OVx1MzA4Ylx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU3ZDBkXHU1MTY1XHU3MjY5XHUzMDY4XHUzMDU3XHUzMDY2XHU5MDc4XHU2MjllXHU1M2VmXHU4MGZkXHUzMDZhXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4Og0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTdkMGRcdTUxNjVcdTcyNjlcdTMwNjhcdTMwNTdcdTMwNjZcdTMwNmVcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzg6DQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOQ0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdThmZmRcdTUyYTBcdTYwYzVcdTU4MzFcdTMwNzhcdTMwNmVcdTMwZWFcdTMwZjNcdTMwYWZcdTMwOTJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTVmNjJcdTVmMGZcdTMwNjdcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1cdTkwNzhcdTYyOWVcdTUzZWZcdTgwZmRcdTMwNmFcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjk6DQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjk6DQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDRjXHU5MDc4XHU2MjllXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQ0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDRjXHU1YzVlXHUzMDU5XHUzMDhiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTMwYzlcdTMwZTFcdTMwYTRcdTMwZjMNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1cdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTk4NWU6DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDM9XHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjOg0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTMwYzlcdTMwZTFcdTMwYTRcdTMwZjM6DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1cdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTk4NWU6DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMz1cdTMwYWJcdTMwYjlcdTMwYmZcdTMwZTBcdTMwZmJcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmM6DQotDQotIyBQcmFjdGljZSBFZGl0b3IgUmVmZXJlbmNlcyBQYWdlDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uTmFtZT1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTg5ODFcdTdkMjANCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwZDdcdTMwZTlcdTMwYWZcdTMwYzZcdTMwYTNcdTMwYjlcdTMwNjdcdTUzYzJcdTcxNjdcdTMwNTlcdTMwOGJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTg5ODFcdTdkMjBcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1OTA3OFx1NjI5ZVx1NTNlZlx1ODBmZFx1MzA2YVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1ODk4MVx1N2QyMDoNCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHU4OTgxXHU3ZDIwOg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHU4OTgxXHU3ZDIwXHUzMDRjXHU5MDc4XHU2MjllXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBDYXRlZ29yeSBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uTmFtZT1cdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjkNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZSB7MH0gXHUzMDZiXHU1YzVlXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1OTA3OFx1NjI5ZVx1NTNlZlx1ODBmZFx1MzA2YVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOToNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjk6DQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IFx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLSMgRGlzY2lwbGluZSBHcm91cGluZyBFZGl0b3IgRGlzY2lwbGluZXMgUGFnZQ0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uTmFtZT1cdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2UNCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZVx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1MzA2Ylx1NWM1ZVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZVx1MzA5Mlx1N2JhMVx1NzQwNlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTkwNzhcdTYyOWVcdTUzZWZcdTgwZmRcdTMwNmFcdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2U6DQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlOg0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBcdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2VcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX1VzZURlZmF1bHREaXJlY3RvcnlCdXR0b25MYWJlbD1cdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwZmJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNmVcdTRmN2ZcdTc1MjgNCi0NCi0jIERpc2NpcGxpbmUgRWRpdG9yIFRhc2tzIFBhZ2UNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25OYW1lPVx1MzBiZlx1MzBiOVx1MzBhZg0KLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZVx1MzA2Ylx1NWM1ZVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBiZlx1MzBiOVx1MzBhZlx1MzA5Mlx1N2JhMVx1NzQwNlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWRpc2NpcGxpbmVUYXNrc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU5MDc4XHU2MjllXHU1M2VmXHU4MGZkXHUzMDZhXHUzMGJmXHUzMGI5XHUzMGFmOg0KLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTMwYmZcdTMwYjlcdTMwYWY6DQotZGlzY2lwbGluZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBcdTMwYmZcdTMwYjlcdTMwYWZcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIERpc2NpcGxpbmUgRWRpdG9yIFJlZmVyZW5jZSBXb3JrZmxvdyBQYWdlDQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uTmFtZT1cdTUzYzJcdTcxNjdcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZDVcdTMwZWRcdTMwZmMNCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2VcdTMwNmJcdTVjNWVcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTUzYzJcdTcxNjdcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZDVcdTMwZWRcdTMwZmNcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX2F2YWlsYWJsZUxhYmVsPVx1OTA3OFx1NjI5ZVx1NTNlZlx1ODBmZFx1MzA2YVx1NTNjMlx1NzE2N1x1MzBlZlx1MzBmY1x1MzBhZlx1MzBkNVx1MzBlZFx1MzBmYzoNCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlbGVjdGVkTGFiZWw9XHU1M2MyXHU3MTY3XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGQ1XHUzMGVkXHUzMGZjOg0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gXHU1M2MyXHU3MTY3XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGQ1XHUzMGVkXHUzMGZjXHUzMDRjXHU5MDc4XHU2MjllXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBEb21haW4gRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4DQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGM5XHUzMGUxXHUzMGE0XHUzMGYzXHUzMDZiXHU1YzVlXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTkwNzhcdTYyOWVcdTUzZWZcdTgwZmRcdTMwNmFcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzg6DQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjODoNCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IFx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLSMgV29yayBQcm9kdWN0IEtpbmQgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4DQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU5ODVlXHUzMDZiXHU1YzVlXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTkwNzhcdTYyOWVcdTUzZWZcdTgwZmRcdTMwNmFcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzg6DQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjODoNCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IFx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLSMgUm9sZSBTZXQgR3JvdXBpbmcgRWRpdG9yIFJvbGUgU2V0cyBQYWdlDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25OYW1lPVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjOA0KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMGZiXHUzMGJiXHUzMGMzXHUzMGM4XHUzMGZiXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHUzMDZiXHU1YzVlXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGVkXHUzMGZjXHUzMGViXHUzMGZiXHUzMGJiXHUzMGMzXHUzMGM4XHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1OTA3OFx1NjI5ZVx1NTNlZlx1ODBmZFx1MzA2YVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjODoNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzg6DQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IFx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjOFx1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLSMgUm9sZSBTZXQgRWRpdG9yIFJvbGVzIFBhZ2UNCi1yb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25OYW1lPVx1MzBlZFx1MzBmY1x1MzBlYg0KLXJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjOFx1MzA2Ylx1NWM1ZVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBlZFx1MzBmY1x1MzBlYlx1MzA5Mlx1N2JhMVx1NzQwNlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXJvbGVTZXRSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU5MDc4XHU2MjllXHU1M2VmXHU4MGZkXHUzMDZhXHUzMGVkXHUzMGZjXHUzMGViOg0KLXJvbGVTZXRSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTMwZWRcdTMwZmNcdTMwZWI6DQotcm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBcdTMwZWRcdTMwZmNcdTMwZWJcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIFRvb2wgRWRpdG9yIFRvb2wgTWVudG9ycyBQYWdlDQotdG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uTmFtZT1cdTMwYzRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwZTFcdTMwZjNcdTMwYmZcdTMwZmMNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwYzRcdTMwZmNcdTMwZWJcdTMwNmJcdTVjNWVcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYzRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwZTFcdTMwZjNcdTMwYmZcdTMwZmNcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi10b29sVG9vbE1lbnRvcnNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1OTA3OFx1NjI5ZVx1NTNlZlx1ODBmZFx1MzA2YVx1MzBjNFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBlMVx1MzBmM1x1MzBiZlx1MzBmYzoNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlbGVjdGVkTGFiZWw9XHUzMGM0XHUzMGZjXHUzMGViXHUzMGZiXHUzMGUxXHUzMGYzXHUzMGJmXHUzMGZjOg0KLXRvb2xUb29sTWVudG9yc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gXHUzMGM0XHUzMGZjXHUzMGViXHUzMGZiXHUzMGUxXHUzMGYzXHUzMGJmXHUzMGZjXHUzMDRjXHU5MDc4XHU2MjllXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBDdXN0b20gQ2F0ZWdvcnkgRWRpdG9yIEFzc2lnbiBQYWdlDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25OYW1lPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1ODk4MVx1N2QyMA0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDkyXHU2OWNiXHU2MjEwXHUzMDU5XHUzMDhiXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHU4OTgxXHU3ZDIwXHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX2F2YWlsYWJsZUxhYmVsPVx1OTA3OFx1NjI5ZVx1NTNlZlx1ODBmZFx1MzA2YVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1ODk4MVx1N2QyMDoNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTg5ODFcdTdkMjA6DQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1ODk4MVx1N2QyMFx1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLSMgTmV3IE1ldGhvZCBQbHVnLWluIFdpemFyZA0KLW5ld1BsdWdpbldpemFyZF90aXRsZT1cdTY1YjBcdTg5OGZcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjMNCi1uZXdQbHVnaW5XaXphcmRQYWdlX3RpdGxlPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMA0KLW5ld1BsdWdpbldpemFyZFBhZ2VfdGV4dD1cdTY1YjBcdTg5OGZcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNmVcdTU0MGRcdTUyNGRcdTMwNjhcdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1uZXdQbHVnaW5FcnJvcl9tc2c9SVVQQTAwMjFFOiBcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNmVcdTRmNWNcdTYyMTBcdTMwNmJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi1uZXdQbHVnaW5FcnJvcl9yZWFzb249XHU1MTg1XHU5MGU4XHUzMGE4XHUzMGU5XHUzMGZjXHUzMDAyXG5cDQotXG5cDQotXHU4YTczXHUzMDU3XHUzMDRmXHUzMDZmXHUzMDBjXHU4YTczXHU3ZDMwXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotDQotIyBHZW5lcmljIGRpYWxvZyB0aXRsZXMNCi1jcmVhdGVEaWFsb2dfdGl0bGU9XHU4OTgxXHU3ZDIwXHUzMDZlXHU0ZjVjXHU2MjEwDQotZGVsZXRlRGlhbG9nX3RpdGxlPVx1ODk4MVx1N2QyMFx1MzA2ZVx1NTI0YVx1OTY2NA0KLWVkaXREaWFsb2dfdGl0bGU9XHU4OTgxXHU3ZDIwXHUzMDZlXHU3ZGU4XHU5NmM2DQotZXJyb3JEaWFsb2dfdGl0bGU9XHUzMGE4XHUzMGU5XHUzMGZjDQotbW92ZURpYWxvZ190aXRsZT1cdTg5ODFcdTdkMjBcdTMwNmVcdTc5ZmJcdTUyZDUNCi1yZW5hbWVEaWFsb2dfdGl0bGU9XHU4OTgxXHU3ZDIwXHUzMDZlXHU1NDBkXHU1MjRkXHU1OTA5XHU2NmY0DQotd2FybmluZ0RpYWxvZ190aXRsZT1cdThiNjZcdTU0NGENCi0NCi0jIEFkZCBDb25maWd1cmF0aW9uIHRvIFByb2Nlc3MgRXJyb3IgRGlhbG9nDQotYWRkQ29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9XHU1MWU2XHU3NDA2XHU1YmZlXHU4YzYxXHUzMDZlXHU2OWNiXHU2MjEwXHUzMDkyXHU4ZmZkXHU1MmEwDQotDQotIyBTZXQgRGVmYXVsdCBDb25maWd1cmF0aW9uIEVycm9yIERpYWxvZw0KLXNldERlZmF1bHRDb25maWdFcnJvckRpYWxvZ190aXRsZT1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTc1MjhcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTY5Y2JcdTYyMTBcdTMwNmVcdThhMmRcdTViOWENCi0NCi0jIEVkaXQgUHJvY2VzcyBFcnJvciBEaWFsb2cNCi1lZGl0UHJvY2Vzc0VsZW1lbnRFcnJvckRpYWxvZ190aXRsZT1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTg5ODFcdTdkMjBcdTMwNmVcdTdkZThcdTk2YzYNCi0NCi0jIE9wZW4gTGlicmFyeSBEaWFsb2cNCi1vcGVuTGlicmFyeURpYWxvZ190aXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNGYNCi1vcGVuTGlicmFyeURpYWxvZ190ZXh0PVx1NzNmZVx1ODg0Y1x1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2Zlx1OTA2OVx1NTIwN1x1MzA2Ylx1NGZkZFx1NWI1OFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMiBcdTMwYThcdTMwZTlcdTMwZmNcdTMwOTJcdTcxMjFcdTg5OTZcdTMwNTdcdTMwNjZcdTUyMjVcdTMwNmVcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNGRcdTMwN2VcdTMwNTlcdTMwNGI/DQotDQotIyBTYXZlIExpYnJhcnkgRGlhbG9nDQotc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZlXHU0ZmRkXHU3YmExDQotc2F2ZUxpYnJhcnlEaWFsb2dfdGV4dD1cdTczZmVcdTg4NGNcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmZcdTU5MDlcdTY2ZjRcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDIgXHU1OTA5XHU2NmY0XHU1MTg1XHU1YmI5XHUzMDkyXHU0ZmRkXHU3YmExXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiPw0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBhMlx1MzBjM1x1MzBkN1x1MzBiMFx1MzBlY1x1MzBmY1x1MzBjOQ0KLQ0KLSMgRGVsZXRlIEVsZW1lbnQgUmVmZXJlbmNlIERpYWxvZw0KLWRlbGV0ZUFzc29jaWF0aW9uRGlhbG9nX3RleHQ9XHU4OTgxXHU3ZDIwICcnezB9JycgXHUzMDZmXHUzMDU5XHUzMDY3XHUzMDZiXHU1MjRhXHU5NjY0XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyIFx1MzA1M1x1MzA2ZVx1ODk4MVx1N2QyMFx1MzA5MiAnJ3sxfScnIFx1MzA0Ylx1MzA4OVx1OTY2NFx1NTNiYlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbm9PcGVuTGlicmFyeUVycm9yX21zZz1JVVBBMDAwMEU6IFx1OTU4Ylx1MzA0NFx1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXA0KLVxuXA0KLVx1NjViMFx1ODk4Zlx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMFx1MzA5Mlx1OGZmZFx1NTJhMFx1MzA1OVx1MzA4Ylx1MzA2Ylx1MzA2Zlx1MzAwMVx1MzA1ZFx1MzA2ZVx1NTI0ZFx1MzA2Ylx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0Zlx1NWZjNVx1ODk4MVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMlxuXA0KLVxuXA0KLVx1NjViMFx1ODk4Zlx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA1OVx1MzA4Ylx1MzA0Ylx1MzAwMVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0NFx1MzA2Nlx1MzA0Ylx1MzA4OVx1MzAwMVx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDFFOiB7MH0gXHUzMDZlXHU1NDBkXHU1MjRkXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXG5cDQotXG5cDQotXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMDRhXHUzMDg4XHUzMDczXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHU4OTgxXHU3ZDIwXHUzMDZiXHUzMDZmXHU1NDBkXHU1MjRkXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5XHUzMDAyXG5cDQotXG5cDQotXHUzMDBjT0tcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwMDFcdTg5ODFcdTdkMjBcdTMwNmJcdTY3MDlcdTUyYjlcdTMwNmFcdTU0MGRcdTUyNGRcdTMwOTJcdTUxNjVcdTUyOWJcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZz1JVVBBMDAwMkU6IFx1NTQwZFx1NTI0ZCAnJ3swfScnIFx1MzA2Zlx1NjVlMlx1MzA2Ylx1NWI1OFx1NTcyOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMlxuXA0KLVxuXA0KLVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMFx1MzA2ZVx1NTQwZFx1NTI0ZFx1MzA2Zlx1NTZmYVx1NjcwOVx1MzA2N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA2YVx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXA0KLVxuXA0KLVx1MzAwY09LXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDAxXHU4OTgxXHU3ZDIwXHUzMDZiXHU1MjI1XHUzMDZlXHU1NDBkXHU1MjRkXHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotY3JlYXRlQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDAzRTogXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OWNiXHU2MjEwXHUzMDkyXHU0ZjVjXHU2MjEwXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotZGVsZXRlQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDA0VzogXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OWNiXHU2MjEwXHUzMDkyXHU1MjRhXHU5NjY0XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotaW50ZXJuYWxFcnJvcl9tc2c9SVVQQTAwMDVFOiBcdTUxODVcdTkwZThcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDJcblwNCi1cblwNCi1cdThhNzNcdTMwNTdcdTMwNGZcdTMwNmZcdTMwMGNcdThhNzNcdTdkMzBcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1pbnZhbGlkUHJlc2VudGF0aW9uTmFtZUVycm9yX21zZz1JVVBBMDAwNkU6IFx1NzEyMVx1NTJiOVx1MzA2YVx1ODg2OFx1NzkzYVx1NTQwZFx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMlxuXA0KLVxuXA0KLVx1MzAwY09LXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHU1MjI1XHUzMDZlXHU1NDBkXHU1MjRkXHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotaW52YWxpZENvbmZpZ0Vycm9yX21zZz1JVVBBMDAwN0U6IFx1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMCAnJ3swfScnIFx1MzA2Zlx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA2ZVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1NjljYlx1NjIxMFx1MzA2ZVx1MzBiNVx1MzBkNlx1MzBiYlx1MzBjM1x1MzBjOFx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXA0KLVxuXA0KLVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA2ZVx1NjU3NFx1NTQwOFx1NjAyN1x1MzA5Mlx1N2RhZFx1NjMwMVx1MzA1OVx1MzA4Ylx1MzA1Zlx1MzA4MVx1MzAwMVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA2ZVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1NjljYlx1NjIxMFx1MzA2Zlx1MzAwMVx1MzA1M1x1MzA2ZVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA2Ylx1OTVhMlx1OTAyM1x1MzA1OVx1MzA4Ylx1MzA1ZFx1MzA2ZVx1NGVkNlx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2ZVx1NjljYlx1NjIxMFx1MzA2ZVx1MzBiOVx1MzBmY1x1MzBkMVx1MzBmY1x1MzBiYlx1MzBjM1x1MzBjOFx1MzA2N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA2YVx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXA0KLVxuXA0KLVx1NTIyNVx1MzA2ZVx1NjljYlx1NjIxMFx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1OVx1MzA4Ylx1MzA0Ylx1MzAwMVx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA1Zlx1NjljYlx1NjIxMFx1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzA5Mlx1NTQyYlx1MzA4MFx1MzA4OFx1MzA0Nlx1MzA2Ylx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1NjljYlx1NjIxMFx1MzA5Mlx1NTkwOVx1NjZmNFx1MzA1N1x1MzA2Nlx1MzA0Ylx1MzA4OVx1MzAwMVx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXNldERlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDhFOiBcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNGNcdTUzYzJcdTcxNjdcdTMwNTlcdTMwOGJcdTMwNWRcdTMwNmVcdTRlZDZcdTMwNmVcdTY5Y2JcdTYyMTBcdTMwNmVcdTMwYjlcdTMwZmNcdTMwZDFcdTMwZmNcdTMwYmJcdTMwYzNcdTMwYzhcdTMwNjdcdTMwNmZcdTMwNmFcdTMwNDRcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5Y2JcdTYyMTAgJyd7MH0nJyBcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDJcblwNCi1cblwNCi1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNmVcdTY1NzRcdTU0MDhcdTYwMjdcdTMwOTJcdTdkYWRcdTYzMDFcdTMwNTlcdTMwOGJcdTMwNWZcdTMwODFcdTMwMDFcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTY5Y2JcdTYyMTBcdTMwNmZcdTMwMDFcdTMwNTNcdTMwNmVcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNmJcdTk1YTJcdTkwMjNcdTMwNTlcdTMwOGJcdTMwNWRcdTMwNmVcdTRlZDZcdTMwNTlcdTMwNzlcdTMwNjZcdTMwNmVcdTY5Y2JcdTYyMTBcdTMwNmVcdTMwYjlcdTMwZmNcdTMwZDFcdTMwZmNcdTMwYmJcdTMwYzNcdTMwYzhcdTMwNjdcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNmFcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcblwNCi1cblwNCi1cdTUyMjVcdTMwNmVcdTY5Y2JcdTYyMTBcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTlcdTMwOGJcdTMwNGJcdTMwMDFcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTY5Y2JcdTYyMTBcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwOTJcdTU5MDlcdTY2ZjRcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTMwMDFcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1vcGVuTGlicmFyeUVycm9yX21zZz1JVVBBMDAwOUU6IFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXA0KLVxuXA0KLVx1OGE3M1x1MzA1N1x1MzA0Zlx1MzA2Zlx1MzAwY1x1OGE3M1x1N2QzMFx1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXNhdmVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEwRTogXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDkyXHU0ZmRkXHU3YmExXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotc2F2ZUxpYnJhcnlUb0Vycm9yX21zZz1JVVBBMDAxMEU6IFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5MiAnJ3swfScnIFx1MzA2Ylx1NGZkZFx1N2JhMVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLWVsZW1lbnRBbHJlYWR5RGVsZXRlZEVycm9yX21zZz1JVVBBMDAxMUU6IFx1ODk4MVx1N2QyMCAnJ3swfScnIFx1MzA2Zlx1MzA1OVx1MzA2N1x1MzA2Ylx1NTI0YVx1OTY2NFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEyRTogXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDkyXHUzMGEyXHUzMGMzXHUzMGQ3XHUzMGIwXHUzMGVjXHUzMGZjXHUzMGM5XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotDQotIyBFcnJvciBSZWFzb25zDQotZXJyb3JfcmVhc29uPUlVUEEwMDE2RTogXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyXG5cDQotXG5cDQotXHU4YTczXHUzMDU3XHUzMDRmXHUzMDZmXHUzMDBjXHU4YTczXHU3ZDMwXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotaW50ZXJuYWxFcnJvcl9yZWFzb249SVVQQTAwMTdFOiBcdTUxODVcdTkwZThcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDJcblwNCi1cblwNCi1cdThhNzNcdTMwNTdcdTMwNGZcdTMwNmZcdTMwMGNcdThhNzNcdTdkMzBcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi11cGdyYWRlTGlicmFyeUVycm9yX3JlYXNvbj1JVVBBMDAxOEU6IFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1ODk4MVx1N2QyMFx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBjOVx1NGUyZFx1MzA2Ylx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMlxuXA0KLVxuXA0KLVx1OGE3M1x1MzA1N1x1MzA0Zlx1MzA2Zlx1MzAwY1x1OGE3M1x1N2QzMFx1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXNhdmVVcGdyYWRlZExpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMTlFOiBcdTMwYTJcdTMwYzNcdTMwZDdcdTMwYjBcdTMwZWNcdTMwZmNcdTMwYzlcdTMwNTdcdTMwNWZcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTRmZGRcdTdiYTFcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDJcblwNCi1cblwNCi1cdThhNzNcdTMwNTdcdTMwNGZcdTMwNmZcdTMwMGNcdThhNzNcdTdkMzBcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDkyXHU5NThiXHUzMDQ0XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotc2F2aW5nTGlicmFyeVRhc2tfbmFtZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTRmZGRcdTdiYTFcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi11cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1MzBhMlx1MzBjM1x1MzBkN1x1MzBiMFx1MzBlY1x1MzBmY1x1MzBjOVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLWxvYWRpbmdMaWJyYXJ5RWxlbWVudHNUYXNrX25hbWU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHU4OTgxXHU3ZDIwXHUzMDkyXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotc2F2aW5nVXBncmFkZWRFbGVtZW50c1Rhc2tfbmFtZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTg5ODFcdTdkMjBcdTMwOTJcdTY1YjBcdTg5OGZcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwZmJcdTMwZDVcdTMwYTlcdTMwZmNcdTMwZGVcdTMwYzNcdTMwYzhcdTMwNjdcdTRmZGRcdTdiYTFcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi1zYXZpbmdUYXNrX25hbWU9Jyd7MH0nJyBcdTMwOTJcdTRmZGRcdTdiYTFcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi1zYXZpbmdGaWxlc1Rhc2tfbmFtZT1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwOTJcdTRmZGRcdTdiYTFcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi1maXhpbmdDb250ZW50RGVzY3JpcHRpb25HVUlEc1Rhc2tfbmFtZT1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdThhYWNcdTY2MGUgR1VJRCBcdTMwOTJcdTRmZWVcdTZiNjNcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi1kZWxldGluZ0ludmFsaWRSZWZlcmVuY2VzVGFza19uYW1lPVx1NzEyMVx1NTJiOVx1MzA2YVx1NTNjMlx1NzE2N1x1MzA5Mlx1NTI0YVx1OTY2NFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLQ0KLQ0KLSMgQWRkIEVkaXRvciBUbyBCcm93c2luZyBQZXJzcGVjdGl2ZSBXYXJuaW5nIERpYWxvZw0KLWFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZz1JVVBBMDA0Nlc6IFx1MzA1M1x1MzA2ZVx1MzBkMVx1MzBmY1x1MzBiOVx1MzBkYVx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkNlx1MzA2Zlx1MzAwMVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1ODk4MVx1N2QyMFx1MzA2ZSBIVE1MIFx1ODg2OFx1NzNmZVx1MzA5Mlx1MzBkNlx1MzBlOVx1MzBhNlx1MzBiYVx1MzA1OVx1MzA4Ylx1MzBlNlx1MzBmY1x1MzBiNlx1MzBmY1x1MzBmYlx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkYVx1MzBlYVx1MzBhOFx1MzBmM1x1MzBiOVx1MzA5Mlx1NjcwMFx1NTkyN1x1NTMxNlx1MzA1OVx1MzA4Ylx1MzA4OFx1MzA0Nlx1NzI3OVx1NTIyNVx1MzA2Ylx1OGEyZFx1OGEwOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwNTNcdTMwNTNcdTMwNmJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwOTJcdThmZmRcdTUyYTBcdTMwNTdcdTMwNWZcdTMwOGFcdTMwMDFcdTg4NjhcdTc5M2FcdTMwNTdcdTMwNWZcdTMwOGFcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi0NCi0jIENoYW5nZSBIaXN0b3J5IERpYWxvZw0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfdGl0bGU9XHU1OTA5XHU2NmY0XHU4YWFjXHU2NjBlXHUzMDZlXHU1YzY1XHU2Yjc0DQotQ2hhbmdlSGlzdG9yeURpYWxvZ19sYWJlbD1cdTU5MDlcdTY2ZjRcdTVjNjVcdTZiNzQ6DQotDQotIyBNZXRob2QgRWxlbWVudCBEZWxldGUgQWN0aW9uDQotY29uZmlybURlbGV0ZURpYWxvZ190aXRsZT1cdTUyNGFcdTk2NjRcdTMwNmVcdTc4YmFcdThhOGQNCi1jb25maXJtRGVsZXRlRGlhbG9nX21zZz0nJ3swfScnIFx1MzA5Mlx1NTI0YVx1OTY2NFx1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi1jb25maXJtRGVsZXRlRGlhbG9nX21zZ1dpdGhSZWZlcmVuY2U9Jyd7MH0nJyBcdTMwOTJcdTUyNGFcdTk2NjRcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/XG5cDQotXG5cDQotXHU2YjIxXHUzMDZlXHU4OTgxXHU3ZDIwXHUzMDZiXHUzMDZmXHUzMDAxXHU1MjRhXHU5NjY0XHU1YmZlXHU4YzYxXHU5ODA1XHU3NmVlXHUzMDc4XHUzMDZlXHU1M2MyXHU3MTY3XHUzMDRjXHU1NDJiXHUzMDdlXHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5OiB7MX0NCi0NCi0jIE5ldyBMaWJyYXJ5IERpYWxvZw0KLWVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjJFOiBcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmMgJyd7MH0nJyBcdTMwOTJcdTRmNWNcdTYyMTBcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1lcnJvckRpYWxvZ19lcnJvcj1cdTUyMjVcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTUxODVcdTMwNmJcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTRmNWNcdTYyMTBcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1lcnJfbm9vcGVubGlicmFyeT1JVVBBMDA0MEU6IFx1OTU4Ylx1MzA0NFx1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXA0KLVxuXA0KLVx1NjViMFx1ODk4Zlx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1OGZmZFx1NTJhMFx1MzA1OVx1MzA4Ylx1MzA2Ylx1MzA2Zlx1MzAwMVx1MzA1ZFx1MzA2ZVx1NTI0ZFx1MzA2Ylx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0Zlx1NWZjNVx1ODk4MVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMlxuXA0KLVxuXA0KLVx1NjViMFx1ODk4Zlx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA1OVx1MzA4Ylx1MzA0Ylx1MzAwMVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0NFx1MzA2Nlx1MzA0Ylx1MzA4OVx1MzAwMVx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLWVycl9sb2FkaW5nbGlicmFyeT1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwYzlcdTMwZmJcdTMwYThcdTMwZTlcdTMwZmMNCi1tc2dfcmVsb2FkTGlicmFyeT1cdTU5MzFcdTY1NTdcdTMwNTdcdTMwNWZcdTUyNGFcdTk2NjRcdTMwNmVcdTUzZDZcdTMwOGFcdTZkODhcdTMwNTdcdTMwNmJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIgXHU3M2ZlXHU4ODRjXHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDkyXHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDU5XHUzMDhiXHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBSZWxvYWQgTGlicmFyeSBEaWFsb2cNCi1yZWxvYWREaWFsb2dfbWVzc2FnZT1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTUxNDNcdTMwNmVcdTcyYjZcdTYxNGJcdTMwNmJcdTVmYTlcdTUxNDNcdTMwNTlcdTMwOGJcdTMwNmJcdTMwNmZcdTMwMDFcdTUxOGRcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNTlcdTMwOGJcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDINCi1yZWxvYWREaWFsb2dfdGl0bGU9XHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZlXHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5DQotZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yVGl0bGU9XHU3OWZiXHU1MmQ1XHUzMGE4XHUzMGU5XHUzMGZjDQotZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yTWVzc2FnZT1cdTc5ZmJcdTUyZDVcdTRlMmRcdTMwNmVcdTMwYThcdTMwZTlcdTMwZmMNCi0NCi0jIFByb2Nlc3MgRm9ybSBFZGl0b3INCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU9XHU0ZmRkXHU3YmExDQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UxPVx1MzA1M1x1MzA2ZVx1NTkwOVx1NjZmNFx1MzA2Zlx1MzAwMVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1NTE4NVx1MzA2ZVx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2ZVx1MzBjMFx1MzBhNFx1MzBhMlx1MzBiMFx1MzBlOVx1MzBlMFx1MzA2Ylx1NWY3MVx1OTdmZlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTU5MDlcdTY2ZjRcdTVmOGNcdTMwMDFcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwNGNcdTRmZGRcdTdiYTFcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDIgXHU3ZDlhXHU4ODRjXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiPw0KLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMj1cdTU5MDlcdTY2ZjRcdTVmOGNcdTMwMDFcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwNGNcdTRmZGRcdTdiYTFcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDIgXHU3ZDlhXHU4ODRjXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiPw0KLQ0KLSMgQ29uZmlndXJhdGlvbiBWaWV3IFBhZ2UNCi1jb25maWdWaWV3UGFnZVJlbW92ZVZpZXdEaWFsb2dfdGl0bGU9XHU5NjY0XHU1M2JiXHUzMDZlXHU3OGJhXHU4YThkDQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX21lc3NhZ2U9XHUzMGQzXHUzMGU1XHUzMGZjICcnezB9JycgXHUzMDkyXHU5NjY0XHU1M2JiXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiPw0KLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ190aXRsZT1cdThiNjZcdTU0NGENCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uPVx1NjljYlx1NjIxMDoNCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld3M9XHU2OWNiXHU2MjEwXHUzMGQzXHUzMGU1XHUzMGZjDQotY29uZmlnVmlld1BhZ2Vfdmlld3M9XHUzMGQzXHUzMGU1XHUzMGZjDQotY29sdW1uc2VsZWN0aW9uX3RleHQ9XHU1MjE3XHUzMDZlXHU5MDc4XHU2MjllOg0KLWNvbmZpZ1ZpZXdQYWdlX2FkZFZpZXdCdXR0b25UZXh0PVx1MzBkM1x1MzBlNVx1MzBmY1x1MzA2ZVx1OGZmZFx1NTJhMC4uLg0KLWNvbmZpZ1ZpZXdQYWdlX3JlbW92ZVZpZXdCdXR0b25UZXh0PVx1MzBkM1x1MzBlNVx1MzBmY1x1MzA2ZVx1OTY2NFx1NTNiYg0KLWNvbmZpZ1ZpZXdQYWdlX21ha2VEZWZhdWx0QnV0dG9uVGV4dD1cdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwNmJcdThhMmRcdTViOWENCi1jb25maWdWaWV3UGFnZVZpZXdFeGlzdHNEaWFsb2dfbWVzc2FnZT1JVVBBMDAyM1c6IFx1NTQwZFx1NTI0ZCAnJ3swfScnIFx1MzA2ZVx1MzBkM1x1MzBlNVx1MzBmY1x1MzA2Zlx1NjVlMlx1MzA2Ylx1NWI1OFx1NTcyOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvblRpdGxlPVx1NTE2Y1x1OTU4Ylx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBjYVx1MzBkM1x1MzBiMlx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBmYlx1MzBkM1x1MzBlNVx1MzBmYw0KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvbk1lc3NhZ2U9XHUzMDUzXHUzMDZlXHU2OWNiXHU2MjEwXHUzMDZlXHU1MTZjXHU5NThiXHU2NjQyXHUzMDZiXHU3ZDQ0XHUzMDdmXHU4ZmJjXHUzMDdlXHUzMDhjXHUzMDhiXHUzMGQzXHUzMGU1XHUzMGZjXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyIFx1MzBkM1x1MzBlNVx1MzBmY1x1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA1OVx1MzA4Ylx1MzA2Ylx1MzA2Zlx1MzAwMVx1MzAwY1x1MzBkM1x1MzBlNVx1MzBmY1x1MzA2ZVx1OGZmZFx1NTJhMFx1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzAwMVx1NjljYlx1NjIxMFx1NTE4NVx1MzA2ZVx1NmExOVx1NmU5Nlx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmY1x1MzA3ZVx1MzA1Zlx1MzA2Zlx1MzBhYlx1MzBiOVx1MzBiZlx1MzBlMFx1MzBmYlx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmY1x1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiAgXHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDZmXHUzMDAxXHUzMGQzXHUzMGU1XHUzMGZjXHUzMDg0XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDZlXHUzMGI1XHUzMGQ2XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDkyXHU4ODY4XHUzMDU3XHUzMDAxXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHU4OTgxXHU3ZDIwXHUzMDZmXHUzMGQzXHUzMGU1XHUzMGZjXHUzMDZlXHUzMGM0XHUzMGVhXHUzMGZjXHU4OTgxXHU3ZDIwXHUzMDkyXHU4ODY4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBEZXNjcmlwdGlvbiBUYWINCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ190aXRsZT1cdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwNmVcdTU5MDlcdTYzZGINCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMT1JVVBBMDA0MFc6IFx1NjcwMFx1NTIxZFx1MzA2Ylx1MzAwMVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA5Mlx1NGZkZFx1N2JhMVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLWRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UyPVx1MzA1M1x1MzA2ZVx1MzBiZlx1MzBhNFx1MzBkN1x1MzA2Ylx1NGU5Mlx1NjNkYlx1NjAyN1x1MzA2ZVx1MzA0Mlx1MzA4Ylx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLQ0KLWNoYW5nZUFjdGl2aXR5VHlwZVdhcm5pbmdEaWFsb2dfdGl0bGU9XHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHUzMDZlXHU1OTA5XHU2M2RiDQotIyBBc3NvY2lhdGlvbiBGb3JtIFBhZ2UNCi1Bc3NvY2lhdGlvbkZvcm1QYWdlX0JyaWVmRGVzY3JpcHRpb25MYWJlbD1cdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTg5ODFcdTdkMjBcdTMwNmVcdTg5ODFcdTY1ZTg6DQotDQotIyBNZXRob2QgRWxlbWVudCBEZXNjcmlwdGlvbg0KLW1ldGhvZEVsZW1lbnREZXNjcmlwdGlvbkVtcHR5TmFtZURpYWxvZ190aXRsZT1cdTg5ODFcdTdkMjBcdTU0MGRcdTMwNmVcdTUxNjVcdTUyOWINCi1tZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfbWVzc2FnZT1cdTU0MGRcdTUyNGRcdTMwZDVcdTMwYTNcdTMwZmNcdTMwZWJcdTMwYzlcdTMwOTJcdTdhN2FcdTMwNmJcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi0NCi0jIE1ldGhvZCBQbHVnLWluIERlc2NyaXB0aW9uDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25SZW1vdmVSZWZDb25maXJtX21lc3NhZ2U9XHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzICcnezB9JycgXHUzMDZiXHU5NWEyXHU5MDIzXHUzMDU5XHUzMDhiXHU1M2MyXHU3MTY3XHU1MTQ4XHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDkyXHU5MDc4XHU2MjllXHU4OWUzXHU5NjY0XHUzMDU5XHUzMDhiXHUzMDY4XHUzMDAxXHU1MjRhXHU5NjY0XHU1YmZlXHU4YzYxXHUzMDY4XHUzMDZhXHUzMDhiXHU3MTIxXHU1MmI5XHUzMDZhXHU5NWEyXHU0ZmMyXHUzMDRjXHU0ZjVjXHU2MjEwXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU5XHUzMDAyXG5cDQotXG5cDQotXHUzMDUzXHUzMDZlXHUzMGEyXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZmXHU1M2Q2XHUzMDhhXHU2ZDg4XHUzMDViXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyIFx1MzA1M1x1MzA2ZVx1NTkwOVx1NjZmNFx1MzA5Mlx1N2Q5YVx1ODg0Y1x1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZT1cdTMwNTNcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNmVcdTU0MGRcdTUyNGRcdTMwOTIgJyd7MH0nJyBcdTMwNGJcdTMwODlcdTY1YjBcdTg5OGZcdTU0MGQgJyd7MX0nJyBcdTMwNmJcdTU5MDlcdTY2ZjRcdTMwNTdcdTMwODhcdTMwNDZcdTMwNjhcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDIgXHUzMDUzXHUzMDZlXHUzMGEyXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZiXHUzMDg4XHUzMDhhXHUzMDAxXHUzMDUzXHUzMDZlXHUzMGE4XHUzMGM3XHUzMGEzXHUzMGJmXHUzMGZjXHUzMDRjXHU0ZmRkXHU3YmExXHUzMDU1XHUzMDhjXHUzMDAxXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMGZiXHUzMGQ1XHUzMGE5XHUzMGViXHUzMGMwXHUzMGZjXHUzMDRjXHU2NWIwXHU4OThmXHU1NDBkXHUzMDZiXHU1OTA5XHU2NmY0XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU5XHUzMDAyIFx1N2Q5YVx1ODg0Y1x1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZV90aXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNmVcdTU0MGRcdTUyNGRcdTU5MDlcdTY2ZjQNCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY2Fubm90UmVuYW1lUGx1Z2luRm9sZGVyPVx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzBmYlx1MzBkNVx1MzBhOVx1MzBlYlx1MzBjMFx1MzBmY1x1MzA5Mlx1NjViMFx1ODk4Zlx1NTQwZFx1MzA2Ylx1NTkwOVx1NjZmNFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMg0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luTGFiZWw9XHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDZlXHUzMGVkXHUzMGMzXHUzMGFmDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5fbWVzc2FnZT1cdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNmVcdTU5MDlcdTY2ZjRcdTMwOTJcdTMwZWRcdTMwYzNcdTMwYWZcdTMwNTlcdTMwOGJcdTMwNjhcdTMwMDFcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjMgJyd7MH0nJyBcdTMwNmJcdTVjNWVcdTMwNTlcdTMwOGJcdTg5ODFcdTdkMjBcdTMwOTJcdTk1OGJcdTMwNDRcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwOTJcdTRmZGRcdTdiYTFcdTMwNTdcdTMwNjZcdTk1ODlcdTMwNThcdTMwN2VcdTMwNTlcdTMwMDIgXHUzMDUzXHUzMDZlXHU1OTA5XHU2NmY0XHUzMDkyXHU3ZDlhXHU4ODRjXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiPw0KLQ0KLSMgUHJvY2VzcyBEZXNjcmlwdGlvbg0KLXByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX3RpdGxlPVx1NTQwZFx1NTI0ZFx1NTkwOVx1NjZmNA0KLXByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX21lc3NhZ2U9XHUzMDUzXHUzMDZlXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDZlXHU1NDBkXHU1MjRkXHUzMDkyXHU1OTA5XHU2NmY0XHUzMDU3XHUzMDg4XHUzMDQ2XHUzMDY4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyIFx1MzA1M1x1MzA2ZVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA0Y1x1NGZkZFx1N2JhMVx1MzA1NVx1MzA4Y1x1MzAwMVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzBmYlx1MzBkNVx1MzBhOVx1MzBlYlx1MzBjMFx1MzBmY1x1MzA0Y1x1NjViMFx1ODk4Zlx1NTQwZFx1MzA2Ylx1NTkwOVx1NjZmNFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTdkOWFcdTg4NGNcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbj1cdThhYWNcdTY2MGU6DQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uVGl0bGU9XHU2OWNiXHU2MjEwDQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uTWVzc2FnZT1cdTMwNTNcdTMwNmVcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNmJcdTY3MDlcdTUyYjlcdTMwNjdcdTMwNDJcdTMwOGJcdTMwNTlcdTMwNzlcdTMwNjZcdTMwNmVcdTY5Y2JcdTYyMTBcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIgXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMDZlXHU2OWNiXHU2MjEwXHUzMDkyIDEgXHUzMDY0XHU5MDc4XHU2MjllXHUzMDU3XHUzMDAxXHUzMDVkXHUzMDhjXHU0ZWU1XHU1OTE2XHUzMDZlXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZlXHU2OWNiXHU2MjEwXHUzMDZlXHUzMGI5XHUzMGZjXHUzMGQxXHUzMGZjXHUzMGJiXHUzMGMzXHUzMGM4XHUzMDZiXHUzMDZhXHUzMDhiXHUzMDg4XHUzMDQ2XHUzMDZiXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25zPVx1NjljYlx1NjIxMDoNCi1wcm9jZXNzRGVzY3JpcHRpb25fZGVmYXVsdD0oXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4KQ0KLVByb2Nlc3NEZXNjcmlwdGlvbl9zZWxlY3RDb25maWd1cmF0aW9uPVx1OGZmZFx1NTJhMFx1MzA1OVx1MzA4Ylx1NjljYlx1NjIxMFx1MzA2ZVx1OTA3OFx1NjI5ZQ0KLVByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQwPVx1NzNmZVx1NTcyOFx1MzA2ZVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA0Y1x1NGZkZFx1N2JhMVx1MzA1NVx1MzA4Y1x1MzAwMVx1NTkwOVx1NjZmNFx1NTE4NVx1NWJiOVx1MzA0Y1x1NmMzOFx1N2Q5YVx1NTMxNlx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1OVx1MzAwMiAnJ3swfScnIFx1MzA5Mlx1NTI0YVx1OTY2NFx1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi1Qcm9jZXNzRGVsZXRlQWN0aW9uX3NlbGVjdERlc2NyaXB0b3JzVG9EZWxldGU9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHU4OTgxXHU3ZDIwXHUzMDkyXHU1MjRhXHU5NjY0XHUzMDU3XHUzMDVmXHU1ZjhjXHUzMDZmXHUzMDAxXHU0ZWU1XHU0ZTBiXHUzMDZlXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDZmXHU0ZjdmXHU3NTI4XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXG5cDQotXHU1MjRhXHU5NjY0XHUzMDU5XHUzMDhiXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotDQotIyBWaWV3IEhlbHBlcg0KLXZpZXdIZWxwZXJIZWFsdGhDaGVja0RpYWxvZ190aXRsZT1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwZDhcdTMwZWJcdTMwYjlcdTMwZmJcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWYNCi12aWV3SGVscGVyX3BlcmZvcm1IZWFsdGhDaGVjaz1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwZDhcdTMwZWJcdTMwYjlcdTMwZmJcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTMwOTJcdTViOWZcdTg4NGNcdTRlMmRcdTMwNjdcdTMwNTkuLi4NCi12aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfbWVzc2FnZT1cdTMwYWFcdTMwZmNcdTMwZDdcdTMwZjNcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwZDhcdTMwZWJcdTMwYjlcdTMwZmJcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTMwNmZcdTZiNjNcdTVlMzhcdTMwNmJcdTViOGNcdTRlODZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIgXHUzMGVkXHUzMGIwXHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHUzMGVjXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDkyXHU1M2MyXHU3MTY3XHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotDQotIyBBdHRhY2ggVGVtcGxhdGUgRmlsZSBEaWFsb2cNCi1hdHRhY2hUZW1wbGF0ZUZpbGVEaWFsb2dfdGl0bGU9XHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHU2ZGZiXHU0ZWQ4DQotDQotIyBDcmVhdGUgRWxlbWVudCBFcnJvciBEaWFsb2cNCi1jcmVhdGVFbGVtZW50RGlhbG9nX3RpdGxlPXswfSBcdTMwNmVcdTY1YjBcdTg5OGZcdTRmNWNcdTYyMTANCi1jcmVhdGVOZXdFbGVtZW50RXJyb3JfbXNnPXswfSBcdTMwNmVcdTY1YjBcdTg5OGZcdTRmNWNcdTYyMTBcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi0NCi1kbGdUaXRsZV9yZWxvYWRMaWJyYXJ5PVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1NTE4ZFx1MzBlZFx1MzBmY1x1MzBjOQ0KLWNyZWF0ZUVsZW1lbnRFcnJvcl9yZWFzb249XHU1NDBkXHU1MjRkIHswfSBcdTMwOTJcdTdhN2FcdTMwNmJcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcblwNCi1cblwNCi1cdTY3MDlcdTUyYjlcdTMwNmFcdTU0MGRcdTUyNGRcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1kZWxldGVDb25maWdFcnJvcl9yZWFzb249XHU2OWNiXHU2MjEwXHUzMDZmXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5ICcnezB9JycgXHUzMDZiXHUzMDg4XHUzMDYzXHUzMDY2XHU1M2MyXHU3MTY3XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBDaGFuZ2VCb3VuZHNDb21tYW5kDQotZ2VmX2NoYW5nZUJvdW5kc0NvbW1hbmRfbGFiZWw9XHU1ODgzXHU3NTRjXHUzMDZlXHU1OTA5XHU2NmY0DQotIyBDaGFuZ2VOYW1lQ29tbWFuZA0KLWdlZl9jaGFuZ2VOYW1lQ29tbWFuZF9sYWJlbD1cdTU0MGRcdTUyNGRcdTMwNmVcdTU5MDlcdTY2ZjQNCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfdW5kb01lc3NhZ2U9XHU1NDBkXHU1MjRkXHUzMDZlXHU1OTA5XHU2NmY0XHUzMDZmXHU1M2Q2XHUzMDhhXHU2ZDg4XHUzMDViXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXG5cDQotXG5cDQotXHU1MjRkXHUzMDZlXHU1NDBkXHU1MjRkXHUzMDRjXHUzMGNjXHUzMGViXHUzMDY3XHUzMDQyXHUzMDhiXHU1ODM0XHU1NDA4XHUzMDAxXHU1NDBkXHU1MjRkXHUzMDZlXHU1OTA5XHU2NmY0XHUzMDZmXHU1M2Q2XHUzMDhhXHU2ZDg4XHUzMDViXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotIyBDaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZA0KLWdlZl9jaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZF9sYWJlbD1cdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwZmNcdTUwMjRcdTMwNmVcdTU5MDlcdTY2ZjQNCi0jIENyZWF0ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfY3JlYXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1cdTMwZDlcdTMwZjNcdTMwYzlcdTMwZmJcdTMwZGRcdTMwYTRcdTMwZjNcdTMwYzhcdTMwNmVcdTRmNWNcdTYyMTANCi0jIENyZWF0ZUxpbmtDb21tYW5kDQotZ2VmX2NyZWF0ZUxpbmtDb21tYW5kX2xhYmVsPVx1MzBlYVx1MzBmM1x1MzBhZlx1MzA2ZVx1NGY1Y1x1NjIxMA0KLSMgQ3JlYXRlTm9kZUNvbW1hbmQNCi1nZWZfY3JlYXRlTm9kZUNvbW1hbmRfbGFiZWw9XHUzMGNlXHUzMGZjXHUzMGM5XHUzMDZlXHU2NWIwXHU4OThmXHU0ZjVjXHU2MjEwDQotIyBEZWxldGVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX2RlbGV0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9XHUzMGQ5XHUzMGYzXHUzMGM5XHUzMGZiXHUzMGRkXHUzMGE0XHUzMGYzXHUzMGM4XHUzMDZlXHU1MjRhXHU5NjY0DQotIyBEZWxldGVDb21tYW5kDQotZ2VmX2RlbGV0ZUNvbW1hbmRfbGFiZWw9XHU1MjRhXHU5NjY0DQotIyBEZWxldGVMaW5rQ29tbWFuZA0KLWdlZl9kZWxldGVMaW5rQ29tbWFuZF9sYWJlbD1cdTYzYTVcdTdkOWFcdTMwNmVcdTUyNGFcdTk2NjQNCi0jIE1vdmVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX21vdmVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPVx1MzBkOVx1MzBmM1x1MzBjOVx1MzBmYlx1MzBkZFx1MzBhNFx1MzBmM1x1MzBjOFx1MzA2ZVx1NzlmYlx1NTJkNQ0KLSMgUmVjb25uZWN0TGlua0NvbW1hbmQNCi1nZWZfcmVjb25uZWN0TGlua0NvbW1hbmRfbGFiZWw9XHUzMGVhXHUzMGYzXHUzMGFmXHUzMDZlXHU1MThkXHU2M2E1XHU3ZDlhDQotDQotIyBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXINCi1nZWZfdmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdD1cdTU0MGRcdTUyNGRcdTMwOTJcdTdhN2FcdTMwNmJcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIgXHU2NzA5XHU1MmI5XHUzMDZhXHU1NDBkXHU1MjRkXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotIyBWYWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcg0KLWdlZl92YWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ9XHU1NDBkXHU1MjRkXHUzMDkyXHU3YTdhXHUzMDZiXHUzMDU5XHUzMDhiXHUzMDUzXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyIFx1NjcwOVx1NTJiOVx1MzA2YVx1NTQwZFx1NTI0ZFx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLSMgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQNCi1nZWZfd29ya1Byb2R1Y3ROb2RlRWRpdFBhcnRfdmFsaWRhdGVNZXNzYWdlPVx1NTQwZFx1NTI0ZFx1MzA5Mlx1N2E3YVx1MzA2Ylx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMiBcdTY3MDlcdTUyYjlcdTMwNmFcdTU0MGRcdTUyNGRcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi0NCi0jIEVsZW1lbnRzVmlld0RlbGV0ZUFjdGlvbg0KLWFjdGlvbnNfRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uX21lc3NhZ2U9XHU2OWNiXHU2MjEwICcnezB9JycgXHUzMDZmXHUzMDAxXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5ICcnezF9JycgXHUzMDRjXHUzMDdlXHUzMDYwXHU0ZjdmXHU3NTI4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMDVmXHUzMDgxXHUzMDAxXHU1MjRhXHU5NjY0XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotDQotIyBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3INCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclRpdGxlPVx1NTI0YVx1OTY2NFx1MzBhOFx1MzBlOVx1MzBmYw0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yTWVzc2FnZT1cdTY3MmFcdTUxZTZcdTc0MDZcdTMwNmVcdTRmOGJcdTU5MTYNCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclJlYXNvbj1cdThhNzNcdTdkMzBcdTMwOTJcdTUzYzJcdTcxNjcNCi0NCi0jIE1ldGhvZEVsZW1lbnRFZGl0b3INCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yVGl0bGU9XHU0ZmRkXHU3YmExXHUzMGE4XHUzMGU5XHUzMGZjDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UxPUlVUEEwMDIwRTogXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU0ZmRkXHU3YmExXHU0ZTJkXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UyPVx1MzBiM1x1MzBkZlx1MzBjM1x1MzBjOFx1MzBmYlx1MzBhOFx1MzBlOVx1MzBmYw0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24xPVx1OGE3M1x1MzA1N1x1MzA0Zlx1MzA2Zlx1MzBlZFx1MzBiMFx1MzBmYlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NTNjMlx1NzE2Nw0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24yPVx1OGE3M1x1N2QzMFx1MzA5Mlx1NTNjMlx1NzE2Nw0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvclRpdGxlPVx1NTQwZFx1NTI0ZFx1NTkwOVx1NjZmNFx1MzBhOFx1MzBlOVx1MzBmYw0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9pbnZhbGlkRWRpdG9yTXNnPVx1MzA1M1x1MzA2ZVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA2ZSAxIFx1MzA2NFx1NGVlNVx1NGUwYVx1MzA2ZVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1OTY2NFx1NTNiYlx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiBcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwNmZcdTY3MDlcdTUyYjlcdTMwNjdcdTMwNmZcdTMwNmFcdTMwNGZcdTMwNmFcdTMwOGFcdTMwMDFcdTk1ODlcdTMwNThcdTMwOGJcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDINCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvclRpdGxlPVx1NzEyMVx1NTJiOVx1MzA2YVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmYw0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvck1lc3NhZ2UxPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiAnJ3swfScnIFx1MzA2ZVx1NTQwZFx1NTI0ZFx1NTkwOVx1NjZmNFx1NGUyZFx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmYw0KLQ0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQ0KLXJlbmFtZUVycm9yX3RpdGxlPVx1ODk4MVx1N2QyMFx1MzA2ZVx1NTQwZFx1NTI0ZFx1NTkwOVx1NjZmNA0KLXJlbmFtZUVycm9yX21zZz1JVVBBMDAxM0U6IFx1NTQwZFx1NTI0ZFx1NTkwOVx1NjZmNFx1NjRjZFx1NGY1Y1x1MzA5Mlx1NWI4Y1x1NGU4Nlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLVNlbGVjdEVsZW1lbnREaWFsb2dfc2VsZWN0ZWxlbWVudF90ZXh0PVx1ODk4MVx1N2QyMFx1MzA2ZVx1OTA3OFx1NjI5ZQ0KLQ0KLSMgRWRpdG9yQ2hvb3Nlcg0KLWVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ190aXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNGYNCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0Rlc2NyaXB0aW9uTGFiZWw9XHU4YWFjXHU2NjBlOg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9TZWxlY3RBbGxCdXR0b25MYWJlbD1cdTMwNTlcdTMwNzlcdTMwNjZcdTkwNzhcdTYyOWUNCi1PcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlX2VkaXRfdGV4dDA9XHU4OTgxXHU3ZDIwXHUzMDZlXHU3ZGU4XHU5NmM2DQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNFOiBcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTg5ODFcdTdkMjBcdTMwNmJcdTk1YTJcdTkwMjNcdTMwNTlcdTMwOGJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZT1cdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjhcdTMwZmJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmVcdTkwNzhcdTYyOWUNCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5TmFtZT1OZXcgTGlicmFyeQ0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZXNjcmlwdGlvbkxhYmVsPVx1OGFhY1x1NjYwZToNCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj0xIFx1MzA2NFx1NGVlNVx1NGUwYVx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzAwMVx1MzAwY1x1NWI4Y1x1NGU4Nlx1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzA1ZFx1MzA4Y1x1MzA4OVx1MzA5Mlx1OTU4Ylx1MzA0ZFx1MzA3ZVx1MzA1OVx1MzAwMg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9EZXNlbGVjdEFsbEJ1dHRvbkxhYmVsPVx1OTA3OFx1NjI5ZVx1MzA5Mlx1MzA1OVx1MzA3OVx1MzA2Nlx1ODllM1x1OTY2NA0KLUVsZW1lbnRzVmlld19taWdyYXRpb25fZGlyX2RsZ19kZXNjcmlwdGlvbl90ZXh0PVx1NjViMFx1ODk4Zlx1MzA2Ylx1MzBkZVx1MzBhNFx1MzBiMFx1MzBlY1x1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA1NVx1MzA4Y1x1MzA1ZiB7MH0gXHUzMDZlXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDY2XHUzMDAxXHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmIHswfSBcdTMwOTJcdTdmNmVcdTMwNGRcdTYzZGJcdTMwNDhcdTMwN2VcdTMwNTlcdTMwMDINCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uPVx1MzBiN1x1MzBiOVx1MzBjNlx1MzBlMFx1MzBmYlx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiBcdThhNzNcdTMwNTdcdTMwNGZcdTMwNmZcdTMwMGNcdThhNzNcdTdkMzBcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDJcblwNCi1cblwNCi1cdTk1OGJcdTMwNDRcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwOTJcdTk1ODlcdTMwNThcdTMwNjZcdTMwNGJcdTMwODlcdTMwMDFcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi0NCi0jIERlc2NyaXB0aW9uRm9ybVBhZ2UNCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RpdGxlPVx1MzBhNFx1MzBlMVx1MzBmY1x1MzBiOFx1MzA0Y1x1NzEyMVx1NTJiOQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzFFOiBcdThhMzFcdTViYjlcdTMwYjVcdTMwYTRcdTMwYmEgKHsxfSBcdTAwZDcgezJ9KSBcdTMwOTJcdThkODVcdTMwNDhcdTMwOGJcdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjggJyd7MH0nJyBcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIgXHU1MjI1XHUzMDZlXHUzMGE0XHUzMGUxXHUzMGZjXHUzMGI4XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RpdGxlPVx1MzBhNFx1MzBlMVx1MzBmY1x1MzBiOFx1MzA0Y1x1NzEyMVx1NTJiOQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190ZW1wbGF0ZT1JVVBBMDAzMkU6IFx1NWI1OFx1NTcyOFx1MzA1N1x1MzA2YVx1MzA0NFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiAnJ3swfScnIFx1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiBcdTUyMjVcdTMwNmVcdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjhcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9XHU5MDc4XHU2MjllLi4uDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeURlc2NyaXB0aW9uPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1OGFhY1x1NjYwZQ0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZWZhdWx0QnJpZWZEZXNjcmlwdGlvbj1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5Y2JcdTYyMTBcdTMwNmVcdThhYWNcdTY2MGUNCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZURlc2NyaXB0aW9uPVx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2ZVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA5Mlx1OTU4OVx1MzA1OFx1MzA4Ylx1NWZjNVx1ODk4MVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMiBcdTY3MDBcdTUyMWRcdTMwNmJcdTMwMDFcdTRmZGRcdTdiYTFcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNmFcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwNGNcdTMwNDJcdTMwOGNcdTMwNzBcdTMwMDFcdTMwNWRcdTMwOGNcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi0NCi0jIFRlbXBsYXRlRGVzY3JpcHRpb25QYWdlDQotZm9ybXNfVGVtcGxhdGVEZXNjcmlwdGlvblBhZ2VfYWxyZWFkeUF0dGFjaGVkX21zZz1cdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmZcdTMwNTlcdTMwNjdcdTMwNmJcdTMwNTNcdTMwNmVcdTMwYzZcdTMwZjNcdTMwZDdcdTMwZWNcdTMwZmNcdTMwYzhcdTMwNmJcdTZkZmJcdTRlZDhcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIE5ldyBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLW5ld0xpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTRFOiBcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTRmNWNcdTYyMTBcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMT1cdTcxMjFcdTUyYjlcdTMwNmFcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwZDFcdTMwYjkgJyd7MH0nJyBcdTMwNGNcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMj1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmYgJyd7MH0nJyBcdTMwNmJcdTY1ZTJcdTMwNmJcdTViNThcdTU3MjhcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMz1cdTRmNWNcdTYyMTBcdTMwNjdcdTMwNGRcdTMwNmFcdTMwNDRcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzBcdTMwZmMgJyd7MH0nJyBcdTMwNGNcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi1uZXdMaWJyYXJ5RXJyb3JfYWR2aWNlPVx1MzAwY09LXHUzMDBkXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDAxXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZlXHU1MjI1XHUzMDZlXHU1NDBkXHU1MjRkXHUzMDRiXHUzMGQxXHUzMGI5XHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotDQotI1Byb2Nlc3MgbGl0ZXJhbHMNCi1Qcm9jZXNzX0V4dGVybmFsSUQ9XHU1OTE2XHU5MGU4IElEOg0KLVByb2Nlc3NfUHVycG9zZT1cdTc2ZWVcdTc2ODQ6DQotUHJvY2Vzc19TY29wZT1cdTMwYjlcdTMwYjNcdTMwZmNcdTMwZDc6DQotUHJvY2Vzc19Vc2FnZU5vdGVzPVx1NGY3Zlx1NzUyOFx1NGUwYVx1MzA2ZVx1NmNlOFx1NjEwZjoNCi1Qcm9jZXNzX0FsdGVybmF0aXZlcz1cdTRlZTNcdTY4NDg6DQotUHJvY2Vzc19Ib3dUb1N0YWZmPVx1OTE0ZFx1NWM1ZVx1NjViOVx1NmNkNToNCi1Qcm9jZXNzX0tleUNvbnNpZGVyYXRpb249XHU0ZTNiXHUzMDZhXHU4MDAzXHU2MTZlXHU0ZThiXHU5ODA1Og0KLVByb2Nlc3NfU2NhbGU9XHUzMGI5XHUzMGIxXHUzMGZjXHUzMGViOg0KLVByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljcz1cdTMwZDdcdTMwZWRcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzhcdTMwNmVcdTcyNzlcdTYwMjc6DQotUHJvY2Vzc19SaXNrTGV2ZWw9XHUzMGVhXHUzMGI5XHUzMGFmXHUzMGZiXHUzMGVjXHUzMGQ5XHUzMGViOg0KLVByb2Nlc3NfRXN0aW1hdGluZ1RlY2huaXF1ZT1cdTg5OGJcdTdhNGRcdTMwODJcdTMwOGFcdTYyODBcdTg4NTM6DQotUHJvY2Vzc19Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPVx1MzBkN1x1MzBlZFx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjOFx1MzBmYlx1MzBlMVx1MzBmM1x1MzBkMFx1MzBmY1x1MzA2ZVx1NWMwMlx1OTU4MFx1NzdlNVx1OGI1ODoNCi1Qcm9jZXNzX1R5cGVPZkNvbnRyYWN0PVx1NTk1MVx1N2QwNFx1MzA2ZVx1MzBiZlx1MzBhNFx1MzBkNzoNCi0NCi0jIEVkaXRvciBQcmV2aWV3IE5hdmlnYXRpb24gQnV0dG9ucw0KLWJhY2tCdXR0b25fdGV4dD1cdTYyM2JcdTMwOGINCi1mb3J3YXJkQnV0dG9uX3RleHQ9XHU5MDMyXHUzMDgwDQotZm9yd2FyZF90ZXh0PVx1OTAzMlx1MzA4MA0KLXN0b3BCdXR0b25fdGV4dD1cdTUwNWNcdTZiNjINCi1yZWZyZXNoQnV0dG9uX3RleHQ9XHU2NmY0XHU2NWIwDQotcmVmcmVzaF90ZXh0PVx1NjZmNFx1NjViMA0KLW5ld25hbWVfdGV4dD1cdTY1YjBcdTg5OGZcdTU0MGQ6DQotcHJpbnRCdXR0b25fdGV4dD1cdTUzNzBcdTUyMzcNCi0NCi0jIENvbnRleHQgbWVudXMNCi1fVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW09XHU2NmY0XHU2NWIwKCZSKQ0KLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzBmY1x1MzA2ZVx1ODg2OFx1NzkzYSgmUykNCi0NCi1fVUlfTWV0aG9kRWRpdG9yX21lbnU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGE4XHUzMGM3XHUzMGEzXHUzMGJmXHUzMGZjKCZNKQ0KLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09XHU2NWIwXHU4OThmKCZOKQ0KLV9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbT1cdTY1YjBcdTg5OGZcdTMwNmVcdTUxNDRcdTVmMWYoJkUpDQotDQotX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWw9XHU5MDc4XHU2MjllDQotX1VJX1BhcmVudFBhZ2VfbGFiZWw9XHU4OWFhDQotX1VJX0xpc3RQYWdlX2xhYmVsPVx1MzBlYVx1MzBiOVx1MzBjOA0KLV9VSV9UcmVlUGFnZV9sYWJlbD1cdTMwYzRcdTMwZWFcdTMwZmMNCi1fVUlfVGFibGVQYWdlX2xhYmVsPVx1MzBjNlx1MzBmY1x1MzBkNlx1MzBlYg0KLV9VSV9UYWJsZVRyZWVQYWdlX2xhYmVsPVRhYmxlVHJlZQ0KLV9VSV9PYmplY3RDb2x1bW5fbGFiZWw9XHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4DQotX1VJX1NlbGZDb2x1bW5fbGFiZWw9XHUzMGJiXHUzMGViXHUzMGQ1DQotDQotX1VJX05vT2JqZWN0U2VsZWN0ZWQ9XHU5MDc4XHU2MjllXHUzMDZhXHUzMDU3DQotX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkPVx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA1Zlx1MzBhYVx1MzBkNlx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjODogezB9DQotX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQ9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmIHswfSBcdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzgNCi0NCi1fVUlfT3BlbkVkaXRvckVycm9yX2xhYmVsPVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0Zg0KLQ0KLV9VSV9XaXphcmRfY2F0ZWdvcnk9RU1GIFx1MzBlMlx1MzBjN1x1MzBlYlx1NGY1Y1x1NjIxMFx1MzBhNlx1MzBhM1x1MzBiNlx1MzBmY1x1MzBjOVx1MzA2ZVx1NGY4Yg0KLQ0KLV9VSV9NZXRob2RNb2RlbFdpemFyZF9sYWJlbD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTJcdTMwYzdcdTMwZWINCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfZGVzY3JpcHRpb249XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGUyXHUzMGM3XHUzMGViXHUzMDkyXHU2NWIwXHU4OThmXHU0ZjVjXHU2MjEwDQotDQotX1VJX01ldGhvZEVkaXRvcl9sYWJlbD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTJcdTMwYzdcdTMwZWJcdTMwZmJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmMNCi0NCi1fVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZT1NeQ0KLV9VSV9NZXRob2RFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbj1tZXRob2QNCi0NCi1fVUlfV2l6YXJkX2xhYmVsPVx1NjViMFx1ODk4Zg0KLQ0KLV9XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9uPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1NTQwZFx1MzA2ZVx1NjcyYlx1NWMzZVx1MzA2ZiAnJy57MH0nJyBcdTMwNjdcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNmFcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi0NCi1fVUlfTW9kZWxPYmplY3Q9XHUzMGUyXHUzMGM3XHUzMGViXHUzMGZiXHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4DQotX1VJX1hNTEVuY29kaW5nPVhNTCBcdTMwYThcdTMwZjNcdTMwYjNcdTMwZmNcdTMwYzlcdTY1YjlcdTVmMGYNCi1fVUlfWE1MRW5jb2RpbmdDaG9pY2VzPVVURi04IEFTQ0lJIFVURi0xNiBVVEYtMTZCRSBVVEYtMTZMRSBJU08tODg1OS0xDQotX1VJX1dpemFyZF9pbml0aWFsX29iamVjdF9kZXNjcmlwdGlvbj1cdTRmNWNcdTYyMTBcdTMwNTlcdTMwOGJcdTMwZTJcdTMwYzdcdTMwZWJcdTMwZmJcdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzhcdTMwNmVcdTkwNzhcdTYyOWUNCi0NCi1fVUlfRmlsZUNvbmZsaWN0X2xhYmVsPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2ZVx1N2FmNlx1NTQwOA0KLV9XQVJOX0ZpbGVDb25mbGljdD1cdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTU5MTZcdTMwNjdcdTUyYTBcdTMwNDhcdTMwODlcdTMwOGNcdTMwNWZcdTU5MDlcdTY2ZjRcdTMwNjhcdTc3ZGJcdTc2ZmVcdTMwNTlcdTMwOGJcdTMwMDFcdTRmZGRcdTdiYTFcdTUyNGRcdTMwNmVcdTU5MDlcdTY2ZjRcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDIgXHUzMDUzXHUzMDZlXHUzMGE4XHUzMGM3XHUzMGEzXHUzMGJmXHUzMGZjXHUzMDZlXHU1OTA5XHU2NmY0XHUzMDkyXHU3ODM0XHU2OGM0XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiPw0KLQ0KLSMgQWRkIExpbmsgRGlhbG9nDQotYWRkTGlua0RpYWxvZ19saW5rVHlwZT1cdTMwYmZcdTMwYTRcdTMwZDc6DQotb3BlbkxpbmtDaGVja2JveF90ZXh0PVx1NTIyNVx1MzA2ZVx1MzBkNlx1MzBlOVx1MzBhNlx1MzBiNlx1MzBmY1x1MzBmYlx1MzBhNlx1MzBhM1x1MzBmM1x1MzBjOVx1MzBhNlx1MzA2N1x1MzBlYVx1MzBmM1x1MzBhZlx1MzA5Mlx1OTU4Ylx1MzA0Zg0KLQ0KLSMgQWRkIEltYWdlIERpYWxvZw0KLWhlaWdodExhYmVsX3RleHQ9XHU5YWQ4XHUzMDU1Og0KLXdpZHRoTGFiZWxfdGV4dD1cdTVlNDU6DQotRWxlbWVudHNWaWV3XzIwPVx1MzBiMVx1MzBmY1x1MzBkMVx1MzBkM1x1MzBlYVx1MzBjNlx1MzBhM1x1MzBmY1x1MzBmYlx1MzBkMVx1MzBiZlx1MzBmY1x1MzBmMw0KLUVsZW1lbnRzVmlld18yMT1cdTMwYzdcdTMwZWFcdTMwZDBcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi1FbGVtZW50c1ZpZXdfMjI9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5DQotRWxlbWVudHNWaWV3XzM1PXswfSBcdTMwNmZcdThhYWRcdTMwN2ZcdTUzZDZcdTMwOGFcdTVjMDJcdTc1MjhcdTMwNjdcdTMwNTlcdTMwMDIgXHU3ZDlhXHU4ODRjXHUzMDU5XHUzMDhiXHU1MjRkXHUzMDZiXHU2NmY4XHUzMDRkXHU4ZmJjXHUzMDdmXHU1M2VmXHU4MGZkXHUzMDZiXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotRWxlbWVudHNWaWV3XzM2PVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBjOVx1MzBmYlx1MzBhOFx1MzBlOVx1MzBmYw0KLWFsdFRhZ0xhYmVsX3RleHQ9QUxUIFx1MzBiZlx1MzBiMDoNCi1pbWFnZVNpemVMYWJlbF90ZXh0PVx1MzBhNFx1MzBlMVx1MzBmY1x1MzBiOFx1MzA2ZVx1OWFkOFx1MzA1NVx1MzA2OFx1NWU0NVx1MzA2Zlx1MzAwMTEwIFx1NGVlNVx1NGUwYSA2MDAgXHU0ZWU1XHU0ZTBiXHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDZhXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyIFx1NzEyMVx1NTJiOVx1MzA2YVx1OWFkOFx1MzA1NVx1MzA2OFx1NWU0NVx1MzA2Zlx1MzAwMVx1OTA2OVx1NTIwN1x1MzA2YVx1MzBiNVx1MzBhNFx1MzBiYVx1MzA2Ylx1NTkwOVx1NjNkYlx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLSMgUHJvY2VzcyBFZGl0b3INCi1Qcm9jZXNzRWRpdG9yPVByb2Nlc3NFZGl0b3INCi1Qcm9jZXNzRWRpdG9yX05hbWU9XHU1NDBkXHU1MjRkDQotUHJvY2Vzc0VkaXRvcl9QcmVzZW50YXRpb25OYW1lPVx1ODg2OFx1NzkzYVx1NTQwZA0KLVByb2Nlc3NFZGl0b3JfSW5kZXg9XHU3ZDIyXHU1ZjE1DQotUHJvY2Vzc0VkaXRvcl9QcmVkZWNlc3NvcnM9XHU1MTQ4XHU4ODRjXHUzMGJmXHUzMGI5XHUzMGFmDQotI0NvbmZpZ3VyYXRpb25QYWdlX1NlbGVjdGVkPVNlbGVjdGVkOiANCi1DaGVja2xpc3RPcmRlcl9kZXNjcmlwdGlvbj1cdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTk4MDVcdTc2ZWVcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwMDFcdTMwMGNcdTRlMGFcdTMwNzhcdTMwMGRcdTMwN2VcdTMwNWZcdTMwNmZcdTMwMGNcdTRlMGJcdTMwNzhcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTk4MDZcdTVlOGZcdTMwOTJcdTU5MDlcdTY2ZjRcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1FbGVtZW50c1ZpZXdfcmVuYW1pbmdfdGV4dD1cdTU0MGRcdTUyNGRcdTU5MDlcdTY2ZjQuLi4NCi1Qcm9jZXNzRWRpdG9yX01vZGVsSW5mbz1cdTMwZTJcdTMwYzdcdTMwZWJcdTYwYzVcdTU4MzENCi1Qcm9jZXNzRWRpdG9yX1ByZWZpeD1cdTMwZDdcdTMwZWNcdTMwZDVcdTMwYTNcdTMwYzNcdTMwYWZcdTMwYjkNCi1Nb3ZlRGlhbG9nX21vdmVfdGV4dD1cdTc5ZmJcdTUyZDUNCi1DaGVja2xpc3RPcmRlcl90aXRsZT1cdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTk4MDVcdTc2ZWVcdTMwNmVcdTk4MDZcdTVlOGZcdTRlZDhcdTMwNTENCi1Qcm9jZXNzRWRpdG9yX1JlcGV0YWJsZT1cdTUzY2RcdTVmYTlcdTUzZWZcdTgwZmQNCi1Qcm9jZXNzRWRpdG9yX09uZ29pbmc9XHU5MDMyXHU4ODRjXHU0ZTJkDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3luY2hyb25pemF0aW9uPVx1NTQwY1x1NjcxZlx1NTMxNi4uLg0KLVByb2Nlc3NFZGl0b3JfRXZlbnREcml2ZW49XHUzMGE0XHUzMGQ5XHUzMGYzXHUzMGM4XHU5OWM2XHU1MmQ1DQotUHJvY2Vzc0VkaXRvcl9EZWxpdmVyYWJsZT1cdTdkMGRcdTUxNjVcdTcyNjkNCi1Qcm9jZXNzRWRpdG9yX09wdGlvbmFsPVx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmMw0KLUZpbHRlckRpYWxvZ19UeXBlX3RleHQ9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU4OTgxXHU3ZDIwXHUzMDZlXHUzMGJmXHUzMGE0XHUzMGQ3Og0KLUZpbHRlckRpYWxvZ19FeHBhbmRBbGw9XHUzMDU5XHUzMDc5XHUzMDY2XHU1YzU1XHU5NThiDQotTW92ZURpYWxvZ19tb3ZpbmdfdGV4dD1cdTc5ZmJcdTUyZDVcdTRlMmQuLi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWRTaGFwZUljb25XYXJuaW5nPUlVUEEwMDI1VzogezB9IFx1MzA2ZSBcdTVmNjJcdTcyYjZcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwNGNcdTZiMjFcdTMwNmVcdTMwZDFcdTMwYjlcdTMwNmJcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTM6IHsxfQ0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbkVycm9yPUlVUEEwMDI1RTogXHUzMGE4XHUzMGU5XHUzMGZjOiBcdTVmNjJcdTcyYjZcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwNmVcdTMwYmJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjM6IHswfQ0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfTmFtZUxhYmVsPVx1NTQwZFx1NTI0ZDoNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZVRpdGxlPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMA0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9OYW1lTGFiZWw9XHU1NDBkXHU1MjRkOg0KLUF1dGhvcmluZ1VJUGx1Z2luX25ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGU9XHU2NWIwXHU4OThmXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OWNiXHU2MjEwDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VUaXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTY1YjBcdTg5OGZcdTRmNWNcdTYyMTANCi1uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlPVx1NjViMFx1ODk4Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmYw0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlVGl0bGU9XHU1OTA5XHU2NmY0XHUzMDkyXHU0ZmRkXHU3YmExDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1cdTY1YjBcdTg5OGZcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwMDFcdTU0MGRcdTUyNGRcdTMwMDFcdThhYWNcdTY2MGVcdTMwMDFcdTMwNGFcdTMwODhcdTMwNzNcdTViOWJcdTUxNDhcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZURlc2NyaXB0aW9uPTEgXHUzMDY0XHU0ZWU1XHU0ZTBhXHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU4OTgxXHU3ZDIwXHUzMDRjXHU1OTA5XHU2NmY0XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyIFx1NGZkZFx1N2JhMVx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2YVx1ODk4MVx1N2QyMFx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZVRpdGxlPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA5Mlx1OTU4Ylx1MzA0Zg0KLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uV2l6YXJkX3dpbmRvd1RpdGxlPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA5Mlx1OTU4Ylx1MzA0Zg0KLUVsZW1lbnRzVmlld19yZXBsYWNlaW5nd2l0aGZvcm1hdF90ZXh0PXswfSBcdTMwOTJcdTdmNmVcdTYzZGJcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbldhcm5pbmc9SVVQQTAwMjZXOiB7MH0gXHUzMDZlXHUzMGNlXHUzMGZjXHUzMGM5XHUzMGZiXHUzMGEyXHUzMGE0XHUzMGIzXHUzMGYzXHUzMDRjXHU2YjIxXHUzMDZlXHUzMGQxXHUzMGI5XHUzMDZiXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzOiB7MX0NCi1NZXNzYWdlTGFiZWxQcm92aWRlcl91bnNlbGVjdGVkcGFja2FnZXM9Jyd7MH0nJyBcdTMwNGNcdTMwMDFcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwNmFcdTMwNDRcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjhcdTMwNmVcdTg5ODFcdTdkMjBcdTMwOTJcdTUzYzJcdTcxNjdcdTMwNTlcdTMwOGJcdTg5ODFcdTdkMjBcdTMwOTJcdTU0MmJcdTMwOTNcdTMwNjdcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbkVycm9yPUlVUEEwMDI2RTogXHUzMGE4XHUzMGU5XHUzMGZjOiBcdTMwY2VcdTMwZmNcdTMwYzlcdTMwZmJcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwNmVcdTMwYmJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjM6IHswfQ0KLVN0ZXBzT3JkZXJEaWFsb2dfc3RlcHM9XHUzMGI5XHUzMGM2XHUzMGMzXHUzMGQ3OiANCi1TdGVwc09yZGVyRGlhbG9nX3RpdGxlPVx1MzBiZlx1MzBiOVx1MzBhZlx1MzBmYlx1MzBiOVx1MzBjNlx1MzBjM1x1MzBkN1x1MzA2ZVx1OTgwNlx1NWU4Zlx1NGVkOFx1MzA1MQ0KLVByb2Nlc3NFZGl0b3JfUGxhbm5lZD1cdThhMDhcdTc1M2JcdTZlMDhcdTMwN2YNCi1zcGVjaWZ5ZGlyZWN0b3J5X3RleHQ9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZlXHU0ZmRkXHU3YmExXHU1MTQ4XHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0DQotUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzPVx1ODkwN1x1NjU3MFx1MzA2ZVx1NTFmYVx1NzNmZQ0KLVByb2Nlc3NFZGl0b3JfRW50cnlTdGF0ZT1cdTk1OGJcdTU5Y2JcdTcyYjZcdTYxNGINCi1Qcm9jZXNzRWRpdG9yX0V4aXRTdGF0ZT1cdTdkNDJcdTRlODZcdTcyYjZcdTYxNGINCi1zZWxlY3RDb2x1bW5zdG9BZGRfdGV4dD1cdThmZmRcdTUyYTBcdTMwNTlcdTMwOGJcdTUyMTdcdTMwNmVcdTkwNzhcdTYyOWUNCi1Qcm9jZXNzRWRpdG9yX1R5cGU9XHUzMGJmXHUzMGE0XHUzMGQ3DQotUHJvY2Vzc0VkaXRvcl9UZWFtPVx1MzBjMVx1MzBmY1x1MzBlMA0KLUZpbHRlckRpYWxvZ190aXRsZT1cdTkwNzhcdTYyOWVcdTMwYzBcdTMwYTRcdTMwYTJcdTMwZWRcdTMwYjA6IA0KLQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwNGJcdTMwODlcdThmZmRcdTUyYTAoJk0pLi4uDQotRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsPVx1MzA1OVx1MzA3OVx1MzA2Nlx1N2UyZVx1NWMwZlx1ODg2OFx1NzkzYQ0KLU9wZW5DaGVhdHNoZWV0Vmlld190aXRsZT1DaGVhdFNoZWV0IFx1MzBkM1x1MzBlNVx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0Zg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxVcD1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwYTJcdTMwYzNcdTMwZDcNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Sb2xsRG93bj1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwYzBcdTMwYTZcdTMwZjMNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXA9XHU0ZTBhXHUzMDc4XHU3OWZiXHU1MmQ1KCZPKQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX01vdmVEb3duPVx1NGUwYlx1MzA3OFx1NzlmYlx1NTJkNSgmVykNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWw9XHU2NjBlXHU3OTNhKCZBKQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvcHk9XHUzMGIzXHUzMGQ0XHUzMGZjKCZDKS4uLg0KLUZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQ9XHU1NDBkXHU1MjRkXHUzMDZlXHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzIChcdTRlMDBcdTgxZjRcdTMwNTlcdTMwOGJcdTU0MGRcdTUyNGRcdTMwOTJcdTg4NjhcdTc5M2EpOg0KLQ0KLU1ldGhvZExpYnJhcnlFZGl0b3JfdGl0bGU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjOiANCi0jTWVzc2FnZVZpZXdfc2VsZWN0ZWRfdGV4dD1TZWxlY3RlZDogDQotTWVzc2FnZVZpZXdfZXJybXNnX3RleHQ9XHU4YWFjXHU2NjBlDQotRWxlbWVudHNWaWV3X2Vycl9zYXZpbmc9SVVQQTAwMjdFOiAnJ3swfScnIFx1MzA2ZVx1NGZkZFx1N2JhMVx1NGUyZFx1MzA2Ylx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZiB7MX0NCi0NCi1lcnJfY29weWluZ19maWxlX3RpdGxlPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2ZVx1MzBiM1x1MzBkNFx1MzBmY1x1NGUyZFx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmYw0KLWVycl9jb3B5aW5nX2ZpbGVfZXJyb3I9SVVQQTAwMjhFOiBcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwOTJcdTUyNzJcdTMwOGFcdTVmNTNcdTMwNjZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDIgDQotZXJyX2NvcHlpbmdfZmlsZV9yZWFzb249XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHUzMGIzXHUzMGQ0XHUzMGZjXHU0ZTJkXHUzMDZiXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyIFx1OGE3M1x1MzA1N1x1MzA0Zlx1MzA2Zlx1MzAwY1x1OGE3M1x1N2QzMFx1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLWVycl9wcm9jZXNzaW5nX2ZpbGVfdGl0bGU9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU1MWU2XHU3NDA2XHU0ZTJkXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjDQotZWRpdENvbmZpZ3VyYXRpb25fdG9vbHRpcD1cdTY5Y2JcdTYyMTBcdTMwNmVcdTdkZThcdTk2YzYNCi1lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQ9SVVQQTAwMTVFOiBcdTg5ODFcdTdkMjBcdTMwOTJcdTdkZThcdTk2YzZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMNCi1TYXZlVGhpc0FjdGlvbl9zYXZlb2JqZWN0PVx1MzA1M1x1MzA2ZVx1MzBhYVx1MzBkNlx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjOFx1MzA5Mlx1NGZkZFx1N2JhMS4uLg0KLUVsZW1lbnRzVmlld19yZXBsYWNlX3RleHQ9XHU3ZjZlXHU2M2RiDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRXh0ZW5kPVx1NjJlMVx1NWYzNSgmRSkuLi4NCi1Nb3ZlRGlhbG9nX2Rlc3RpbmF0aW9uX3RleHQ9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHU4OTgxXHU3ZDIwXHUzMDZlXHU1YjliXHU1MTQ4XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0Og0KLWNob29zZURlZmF1bHREaXJlY3RvcnlfdGV4dD1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwZmJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNmVcdTkwNzhcdTYyOWU6DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3M9XHU2MjkxXHU1MjM2KCZTKQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzMj1cdTUxNmNcdTk1OGJcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjMoJlApLi4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXNzaWduVXNlckRpYWdyYW09XHUzMGU2XHUzMGZjXHUzMGI2XHUzMGZjXHU1YjlhXHU3ZmE5XHUzMGMwXHUzMGE0XHUzMGEyXHUzMGIwXHUzMGU5XHUzMGUwKCZVKS4uLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ190aXRsZT1cdTMwZTZcdTMwZmNcdTMwYjZcdTMwZmNcdTViOWFcdTdmYTlcdTMwYzBcdTMwYTRcdTMwYTJcdTMwYjBcdTMwZTlcdTMwZTBcdTMwNmVcdTUyNzJcdTMwOGFcdTVmNTNcdTMwNjYNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYWRJbWFnZT1cdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTU2ZjM6DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkZEltYWdlPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1OGE3M1x1N2QzMFx1NTZmMzoNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfd3BkSW1hZ2U9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU0ZjlkXHU1YjU4XHU5NWEyXHU0ZmMyXHU1NmYzOg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19ub3RhRmlsZT1JVVBBMDAwNEU6IFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2N1x1MzA2Zlx1MzA2YVx1MzA0NFx1MzBkMVx1MzBiOVx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hc3NpZ25CdXR0b249XHU5MDc4XHU2MjllLi4uDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2VudGVyZWRJbWFnZU5vdEZvdW5kPUlVUEEwMDI0RTogXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDZhXHUzMDQ0XHUzMGE0XHUzMGUxXHUzMGZjXHUzMGI4XHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyIFx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBlYlx1MzBmY1x1MzBjOFx1MzBmYlx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzBmY1x1MzA3OFx1MzA2ZVx1NzZmOFx1NWJmZVx1MzBkMVx1MzBiOVx1MzA5Mlx1NTE2NVx1NTI5Ylx1MzA1N1x1MzA1Zlx1MzA1M1x1MzA2OFx1MzA5Mlx1NzhiYVx1OGE4ZFx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19zZWxlY3RlZEltYWdlTm90Rm91bmQ9SVVQQTAwMzBFOiBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmJcdTViNThcdTU3MjhcdTMwNTdcdTMwNmFcdTMwNDRcdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjhcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURJbWFnZT1cdTMwZDZcdTMwZTlcdTMwYTZcdTMwYmFcdTMwNGFcdTMwODhcdTMwNzNcdTUxNmNcdTk1OGJcdTMwNTlcdTMwOGJcdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTU2ZjNcdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjhcdTMwNmVcdTRmN2ZcdTc1MjgNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURESW1hZ2U9XHUzMGQ2XHUzMGU5XHUzMGE2XHUzMGJhXHUzMDRhXHUzMDg4XHUzMDczXHU1MTZjXHU5NThiXHUzMDU5XHUzMDhiXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU4YTczXHU3ZDMwXHU1NmYzXHUzMGE0XHUzMGUxXHUzMGZjXHUzMGI4XHUzMDZlXHU0ZjdmXHU3NTI4DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZVdQREltYWdlPVx1MzBkNlx1MzBlOVx1MzBhNlx1MzBiYVx1MzA0YVx1MzA4OFx1MzA3M1x1NTE2Y1x1OTU4Ylx1MzA1OVx1MzA4Ylx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1NGY5ZFx1NWI1OFx1OTVhMlx1NGZjMlx1NTZmM1x1MzBhNFx1MzBlMVx1MzBmY1x1MzBiOFx1MzA2ZVx1NGY3Zlx1NzUyOA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvbnRyaWJ1dGU9XHUzMGVkXHUzMGZjXHUzMGFiXHUzMGViXHU1YmM0XHU0ZTBlDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmVwbGFjZT1cdTMwZWRcdTMwZmNcdTMwYWJcdTMwZWJcdTdmNmVcdTYzZGINCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9EaWFncmFtcz1cdTMwYzBcdTMwYTRcdTMwYTJcdTMwYjBcdTMwZTlcdTMwZTAoJkcpDQotUHJvY2Vzc0VkaXRvcl9hY3Rpb25fZGVlcENvcHk9XHUzMGM3XHUzMGEzXHUzMGZjXHUzMGQ3XHUzMGZiXHUzMGIzXHUzMGQ0XHUzMGZjKCZEKS4uLg0KLUZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uPVx1ODk4MVx1NjVlODoNCi1Db25maWd1cmF0aW9uUGFnZV9oaWRlVG9vbFRpcD1cdTY3MmFcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTg5ODFcdTdkMjBcdTMwOTJcdTg4NjhcdTc5M2EvXHU5NzVlXHU4ODY4XHU3OTNhDQotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb249XHU4YWFjXHU2NjBlOg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzQWxsPVx1NTE2Y1x1OTU4Ylx1MzA2YVx1MzA1Nw0KLUZpbHRlckRpYWxvZ19QYXR0ZXJuX2Rlc2NyaXB0aW9uPVx1MzBkMVx1MzBiZlx1MzBmY1x1MzBmM1x1MzA2Zlx1MzBiM1x1MzBmM1x1MzBkZVx1MzA2N1x1NTMzYVx1NTIwN1x1MzA4YVx1MzAwMSogXHUzMDY3XHU0ZWZiXHU2MTBmXHUzMDZlXHUzMGI5XHUzMGM4XHUzMGVhXHUzMGYzXHUzMGIwXHUzMDAxPyBcdTMwNjdcdTRlZmJcdTYxMGZcdTMwNmVcdTY1ODdcdTViNTdcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1Db25maWd1cmF0aW9uUGFnZV9UcmVlVGl0bGVMYWJlbD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQ6DQotQ29uZmlndXJhdGlvblBhZ2VfTG9hZGluZ01lc3NhZ2U9XHU2OWNiXHU2MjEwXHUzMDkyXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyXHUzMDRhXHU1Zjg1XHUzMDYxXHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0IC4uLg0KLU1vdmVEaWFsb2dfdmFsaWRkZXN0aW5hdGlvbl90ZXh0PVx1NzEyMVx1NTJiOVx1MzA2YVx1NzlmYlx1NTJkNVx1NTE0OFx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMg0KLU1vdmVEaWFsb2dfY2Fubm90TW9kaWZ5RGVzdGluYXRpb249SVVQQTAwMzRFOiBcdTU5MDlcdTY2ZjRcdTMwNjdcdTMwNGRcdTMwNmFcdTMwNDRcdTViOWJcdTUxNDhcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGw9XHUzMDU5XHUzMDc5XHUzMDY2XHU1MTZjXHU5NThiDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkJhc2VBY3Rpdml0eT1cdTU3ZmFcdTY3MmNcdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNGYNCi1Qcm9jZXNzRm9ybUVkaXRvcl9leHBhbkFsbEFjdGlvbkxhYmVsPVx1MzA1OVx1MzA3OVx1MzA2Nlx1NWM1NVx1OTU4YigmWCkNCi1Qcm9jZXNzRm9ybUVkaXRvcl9jb2xsYXBzZUFsbEFjdGlvbkxhYmVsPVx1MzA1OVx1MzA3OVx1MzA2Nlx1N2UyZVx1NWMwZlx1ODg2OFx1NzkzYSgmTCkNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEaWFncmFtPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1NTZmM1x1MzA5Mlx1OTU4Ylx1MzA0ZigmQSkNCi1Qcm9jZXNzRWRpdG9yX3Byb21wdFRvRGVsZXRlQmVmb3JlUmV2ZWFsPVx1MzAwY1x1OGE3M1x1N2QzMFx1MzAwZFx1MzA2Ylx1MzBlYVx1MzBiOVx1MzBjOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA4Ylx1NjI5MVx1NTIzNlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA2YVx1MzA0NFx1OGExOFx1OGZmMFx1NWI1MFx1MzA2Zlx1MzAwMVx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA1Zlx1ODk4MVx1N2QyMFx1MzA5Mlx1NzkzYVx1MzA1N1x1MzA1Zlx1NWY4Y1x1MzA2N1x1MzAwMVx1OTFjZFx1ODkwN1x1MzA5Mlx1OTA3Zlx1MzA1MVx1MzA4Ylx1MzA1Zlx1MzA4MVx1MzA2Ylx1NTI0YVx1OTY2NFx1MzA1OVx1MzA4Ylx1NWZjNVx1ODk4MVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwNTNcdTMwOGNcdTMwODlcdTMwOTJcdTUyNGFcdTk2NjRcdTMwNTdcdTMwNjZcdTdkOWFcdTg4NGNcdTMwNTlcdTMwOGJcdTU4MzRcdTU0MDhcdTMwNmZcdTMwMDFcdTMwMGNPS1x1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9TZWxlY3RDb2x1bW5zPVx1OGZmZFx1NTJhMFx1MzA1OVx1MzA4Ylx1NTIxN1x1MzA2ZVx1OTA3OFx1NjI5ZQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURldGFpbERpYWdyYW09XHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU4YTczXHU3ZDMwXHU1NmYzXHUzMDkyXHU5NThiXHUzMDRmKCZEKQ0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9Db2x1bW5TZWxlY3Rpb249XHU1MjE3XHUzMDZlXHU5MDc4XHU2MjllOg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zd2l0Y2hDb25maWd1cmF0aW9uPVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzBmYlx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA5Mlx1NmQzYlx1NTJkNVx1NTMxNlx1MzA1OVx1MzA4Ylx1MzA2OFx1MzA0ZFx1MzA2Ylx1MzAwMVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA2ZVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1NjljYlx1NjIxMFx1MzA2Ylx1NTIwN1x1MzA4YVx1NjZmZlx1MzA0OFx1MzA4Yg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zdXBwcmVzc2lvbkdyb3VwVGl0bGU9XHU2MjkxXHU1MjM2DQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX2luaGVyaXRTdXBwcmVzc2lvblN0YXRlPVx1NjI5MVx1NTIzNlx1NzJiNlx1NjE0Ylx1MzA2ZVx1N2Q5OVx1NjI3Zg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1NGY5ZFx1NWI1OFx1OTVhMlx1NGZjMlx1NTZmM1x1MzA5Mlx1OTU4Ylx1MzA0ZigmVykNCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1cdTMwYWZcdTMwZWFcdTMwYTINCi1EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19TZWxlY3RCdXR0b25MYWJlbD1cdTkwNzhcdTYyOWUuLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9JbnNlcnROZXdQaGFzZT1cdTY1YjBcdTg5OGZcdTMwZDVcdTMwYTdcdTMwZmNcdTMwYmFcdTMwNmVcdTYzM2ZcdTUxNjUNCi1WaWV3SGVscGVyX3JlbG9hZExpYk9uUm9sbGJhY2tFcnJvcj1cdTMwZDFcdTMwZmNcdTMwYjdcdTMwYjlcdTMwYmZcdTMwZjNcdTMwYjlcdTMwZmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGJcdTMwODlcdTMwZWFcdTMwYWJcdTMwZDBcdTMwZWFcdTMwZmNcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIgXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDkyXHU1MTQzXHUzMDZlXHU3MmI2XHU2MTRiXHUzMDZiXHU1ZmE5XHU1MTQzXHUzMDU5XHUzMDhiXHUzMDZiXHUzMDZmXHUzMDAxXHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDU5XHUzMDhiXHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyDQotVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZF90ZXh0PVx1ODk4MVx1N2QyMCAnJ3swfScnIFx1MzA2Zlx1NjVlMlx1MzA2Ylx1NTI0YVx1OTY2NFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLVZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRjb25maXJtX3RleHQ9XHU4OTgxXHU3ZDIwICcnezB9JycgXHUzMDZmXHU2NWUyXHUzMDZiXHU1MjRhXHU5NjY0XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyIFx1MzA1M1x1MzA2ZVx1ODk4MVx1N2QyMFx1MzA5MiAnJ3sxfScnIFx1MzA0Ylx1MzA4OVx1OTY2NFx1NTNiYlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi1Db25maWd1cmF0aW9uUGFnZV9BZGRNaXNzaW5nVG9vbFRpcD1cdTZiMjBcdTg0M2RcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTUzYzJcdTcxNjdcdTMwNmVcdThmZmRcdTUyYTANCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbj1cdThhYWNcdTY2MGUNCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25HZW5lcmFsSW5mbz1cdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzEgDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXBwbHlQYXR0ZXJuPVx1MzBkMVx1MzBiZlx1MzBmY1x1MzBmM1x1MzA2ZVx1OTA2OVx1NzUyOCgmVCkNCi1Nb3ZlRGlhbG9nX3NlbGVjdGRlc3RpbmF0aW9uX3RleHQ9XHU1YjliXHU1MTQ4XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotTW92ZURpYWxvZ19ub21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9XHU3OWZiXHU1MmQ1XHU1MTQ4XHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotTWV0aG9kTGlicmFyeUVkaXRvcl90cm91Ymxlb2JqZWN0PS4gXHU1NTRmXHU5ODRjXHUzMDRjXHU3NTFmXHUzMDU4XHUzMDVmXHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4OiANCi1NZXNzYWdlTGFiZWxQcm92aWRlcl9lcnJjaGlsZHBrZ3M9XHU1YjUwXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMDZlXHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4XHUzMDdlXHUzMDVmXHUzMDZmXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDZiXHUzMDAxXHU2YjIwXHU4NDNkXHUzMDU3XHUzMDVmXHU1M2MyXHU3MTY3XHUzMDkyXHU2MzAxXHUzMDY0XHU4OTgxXHU3ZDIwXHUzMDRjXHU1NDJiXHUzMDdlXHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyDQotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19UaXRsZT1cdTMwYzBcdTMwYTRcdTMwYTJcdTMwYjBcdTMwZTlcdTMwZTBcdTUxNmNcdTk1OGJcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjMNCi1Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX01lc3NhZ2U9XHU1MTZjXHU5NThiXHUzMDU5XHUzMDhiXHUzMGMwXHUzMGE0XHUzMGEyXHUzMGIwXHUzMGU5XHUzMGUwXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU5XHUzMDhiXHUzMDRiXHUzMDAxXHU1MTZjXHU5NThiXHUzMDU3XHUzMDZhXHUzMDQ0XHUzMGMwXHUzMGE0XHUzMGEyXHUzMGIwXHUzMGU5XHUzMGUwXHUzMDkyXHU5MDc4XHU2MjllXHU4OWUzXHU5NjY0XHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotUHJvY2Vzc0VkaXRvcl9UaXRsZT1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwZmJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmM6IA0KLVNhdmVBc3dpdGhkb3RzX3RleHQ9XHU1MjI1XHU1NDBkXHU0ZmRkXHU3YmExLi4uDQotUHJvY2Vzc0VkaXRvcl9Xb3JrQnJlYWtkb3duU3RydWN0dXJlPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkNlx1MzBlY1x1MzBmY1x1MzBhZlx1MzBjMFx1MzBhNlx1MzBmM1x1MzBmYlx1MzBiOVx1MzBjOFx1MzBlOVx1MzBhZlx1MzBjMVx1MzBlM1x1MzBmYw0KLVByb2Nlc3NFZGl0b3JfVGVhbUFsbG9jYXRpb249XHUzMGMxXHUzMGZjXHUzMGUwXHUzMDZlXHU1MjcyXHUzMDhhXHU2MzJmXHUzMDhhDQotUHJvY2Vzc0VkaXRvcl9Xb3JrUHJvZHVjdFVzYWdlPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1MzA2ZVx1NGY3Zlx1NzUyOFx1NzJiNlx1NmNjMQ0KLVByb2Nlc3NFZGl0b3JfQ29uc29saWRhdGVkVmlldz1cdTdkNzFcdTU0MDhcdTMwZDNcdTMwZTVcdTMwZmMNCi1Qcm9jZXNzRWRpdG9yX2NvbmZpcm1BdXRvU3luY2g9XHUzMDUzXHUzMDZlXHU2NGNkXHU0ZjVjXHUzMDZmXHUzMDAxXHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzXHUzMGZjXHUzMGZiXHUzMGQzXHUzMGU1XHUzMGZjXHUzMDZlXHUzMDBjXHU0ZTAwXHU4MjJjXHUzMDBkXHUzMGJmXHUzMGQ2XHUzMDY3XHUzMDBjXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDY4XHU1NDBjXHU2NzFmXHU1MzE2XHUzMDBkXHUzMDY4XHUzMGRlXHUzMGZjXHUzMGFmXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDhiXHU5MDc4XHU2MjllXHU2ZTA4XHUzMDdmXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHUzMDZlXHU0ZTBiXHUzMDZlXHUzMDAxXHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDdlXHUzMDVmXHUzMDZmXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZlXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDkyXHU2NmY0XHU2NWIwXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyICBcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTY5Y2JcdTYyMTBcdTMwNmVcdTRlMGJcdTMwNmVcdTMwMDFcdTMwZWFcdTMwZjNcdTMwYWZcdTMwNTVcdTMwOGNcdTMwNWZcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTg5ODFcdTdkMjBcdTMwNmVcdTMwYWFcdTMwZWFcdTMwYjhcdTMwY2FcdTMwZWJcdTMwZmJcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwZmNcdTMwOTJcdTYzMDFcdTMwNjRcdThhMThcdThmZjBcdTViNTBcdTMwNGNcdTY2ZjRcdTY1YjBcdTViZmVcdThjNjFcdTMwNjhcdTMwNmFcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDIgIFx1MzA1M1x1MzA2ZVx1NjRjZFx1NGY1Y1x1MzA2N1x1MzAwMVx1NTJkNVx1NzY4NFx1MzA2Ylx1MzBlYVx1MzBmM1x1MzBhZlx1MzA1NVx1MzA4Y1x1MzA1ZiAoXHU3ZGQxXHU4MjcyXHUzMDZlXHUzMGE0XHUzMGJmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDY3XHU3OTNhXHUzMDU1XHUzMDhjXHUzMDhiKSBcdThhMThcdThmZjBcdTViNTBcdTMwNGNcdTY2ZjRcdTY1YjBcdTMwNTVcdTMwOGNcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIgIFx1N2Q5YVx1ODg0Y1x1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjE9XHU2OWNiXHU2MjEwDQotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24yPVx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA0YVx1MzA4OFx1MzA3M1x1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOFx1MzA2ZVx1OTA3OFx1NjI5ZQ0KLU5ld0xpYnJhcnlEaWFsb2dfbmV3bGlicmFyeV9hcz1cdTZiMjFcdTMwNmVcdTU0MGRcdTUyNGRcdTMwNjdcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTY1YjBcdTg5OGZcdTRmNWNcdTYyMTANCi1OZXdQbHVnaW5EaWFsb2dfbmV3cGx1Z2luX3RleHQ9XHU2NWIwXHU4OThmXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzDQotU2VsZWN0RWxlbWVudERpYWxvZ190aXRsZV90ZXh0PVx1ODk4MVx1N2QyMFx1MzA3ZVx1MzA1Zlx1MzA2Zlx1MzA1ZFx1MzA2ZVx1NWJjNFx1NGUwZVx1ODAwNVx1MzA2ZSAxIFx1MzA2NFx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NDoNCi1PcGVuQ29uZmlnRGlhbG9nbmV3Y29uZmlnX3RleHQ9XHU2NWIwXHU4OThmXHU2OWNiXHU2MjEwOg0KLXByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZV9CU0VkaXRvcj1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwZmJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmMNCi0NCi0jIEFic3RyYWN0RGlhZ3JhbUVkaXRvcg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1cdThhYmZcdTY1NzQNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1cdTU3ZmFcdTY3MmNcdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTMwNGJcdTMwODlcdTMwNmVcdTY2ZjRcdTY1YjANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9XHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMGZiXHUzMGRjXHUzMGMzXHUzMGFmXHUzMGI5XHUzMDZlXHUzMGQ1XHUzMGE5XHUzMGZjXHUzMGRlXHUzMGMzXHUzMGM4Li4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1cdTVlNzNcdTU3NDdcdTMwNmJcdTViZmVcdTMwNTdcdTMwNjZcdTZjMzRcdTVlNzNcdTMwNmJcdTkxNGRcdTdmNmUNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PVx1NjcwMFx1NTIxZFx1MzA2ZVx1OTA3OFx1NjI5ZVx1MzA2Ylx1NWJmZVx1MzA1N1x1MzA2Nlx1NmMzNFx1NWU3M1x1MzA2Ylx1OTE0ZFx1N2Y2ZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9XHU1ZTczXHU1NzQ3XHUzMDZiXHU1YmZlXHUzMDU3XHUzMDY2XHU1NzgyXHU3NmY0XHUzMDZiXHU5MTRkXHU3ZjZlDQotTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl90aXRsZT1cdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzENCi1Nb3ZlRGlhbG9nX2ludmFsaWRfbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZz1JVVBBMDA0MUU6IFx1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA1Zlx1ODk4MVx1N2QyMFx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA2ZVx1NWI5Ylx1NTE0OFx1MzA2Ylx1NzlmYlx1NTJkNVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZW1vZGVsbGlicmFyeT1cdTMwZTJcdTMwYzdcdTMwZWJcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTRmZGRcdTdiYTFcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkgLi4uDQotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJvcl9kaWFsb2dfdGl0bGU9XHUzMGE4XHUzMGU5XHUzMGZjDQotTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c9SVVQQTAwMzNFOiBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTRmZGRcdTdiYTFcdTRlMmRcdTMwNmJcdTU1NGZcdTk4NGNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi1NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dD0nJ3swfScnIFx1MzA5Mlx1NTI0YVx1OTY2NFx1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19Db250ZW50RWxlbWVudF90ZXh0PVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1ODk4MVx1N2QyMDogDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Ccm93c2VCdXR0b25MYWJlbD1cdTUzYzJcdTcxNjcuLi4NCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uPVx1NjViMFx1ODk4Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA2Ylx1NTQwZFx1NTI0ZFx1MzA2OFx1OGFhY1x1NjYwZVx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlVGl0bGU9XHU1OTA5XHU2NmY0XHUzMDkyXHU0ZmRkXHU3YmExXHUzMDU3XHUzMDY2XHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZlXHUzMGE4XHUzMGM3XHUzMGEzXHUzMGJmXHUzMGZjXHUzMDkyXHU5NTg5XHUzMDU4XHUzMDhiDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1cdTY3MDBcdTUyMWRcdTMwNmVcdTkwNzhcdTYyOWVcdTMwNmJcdTViZmVcdTMwNTdcdTMwNjZcdTU3ODJcdTc2ZjRcdTMwNmJcdTkxNGRcdTdmNmUNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PVx1NGZkZFx1N2JhMQ0KLUF0dGFjaG1lbnREaWFsb2dhdHRhY2hGaWxlX3RleHQ9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHU2ZGZiXHU0ZWQ4DQotQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudD1cdTY5Y2JcdTYyMTBcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQNCi1PcGVuQ29uZmlnRGlhbG9nb3BlbmNvbmZpZ190ZXh0PVx1NjljYlx1NjIxMFx1MzA5Mlx1OTU4Ylx1MzA0Zg0KLUVsZW1lbnRzVmlld19yZXBsYWNlQWN0aW9uX3RleHQ9XHU3ZjZlXHU2M2RiLi4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfbWVzc2FnZT17MH0gXHUzMDkyXHU0ZmRkXHU3YmExXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5DQotQ29uZmlndXJhdGlvblBhZ2VfU2hvd0Vycm9yVG9vbFRpcD1cdTY5Y2JcdTYyMTBcdTMwNmVcdThiNjZcdTU0NGFcdTMwZWRcdTMwYjBcdTMwZmJcdTMwZDNcdTMwZTVcdTMwZmNcdTMwYTJcdTMwZmNcdTMwOTJcdTg4NjhcdTc5M2ENCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25Gb3JtUHJlZml4PVx1NjljYlx1NjIxMDogDQotQ2hlY2tsaXN0T3JkZXJfY2hlY2tsaXN0aXRlbXNfdGV4dD1cdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTk4MDVcdTc2ZWU6IA0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9Nb3ZlTm9kZV9sYWJlbD1cdTMwY2VcdTMwZmNcdTMwYzlcdTMwNmVcdTc5ZmJcdTUyZDUNCi1Db25maWd1cmF0aW9uUGFnZV9NYWtlQ2xvc3VyZVRvb2xUaXA9XHUzMGE4XHUzMGU5XHUzMGZjXHUzMDkyXHU0ZmVlXHU2YjYzXHUzMDU3XHUzMDY2XHU5NTg5XHUzMDU4XHUzMDhiDQotTmV3UGx1Z2luRGlhbG9nX3JlZmVyZW5jZXBsdWdpbl90ZXh0PVx1NTNjMlx1NzE2N1x1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmMzoNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfY3JlYXRlRnJlZVRleHRfdGV4dD1cdTMwZDVcdTMwZWFcdTMwZmNcdTMwZmJcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwNmVcdTRmNWNcdTYyMTANCi1EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19MYWJlbD1cdTMwY2VcdTMwZmNcdTMwYzlcdTMwZmJcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwNmVcdTMwZDdcdTMwZWNcdTMwZDNcdTMwZTVcdTMwZmM6DQotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9jb25uZWN0X3RleHQ9SVVQQTAwMzJXOiBcdTYzYTVcdTdkOWFcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMNCi1EaWFncmFtVmFsaWRhdGlvbl9lcnJfc2FtZXByZWRhbmRzdWNfdGV4dD1JVVBBMDAzM1c6IFx1NTE0OFx1ODg0Y1x1MzBiZlx1MzBiOVx1MzBhZlx1MzA0YVx1MzA4OFx1MzA3M1x1NWY4Y1x1N2Q5YVx1MzBiZlx1MzBiOVx1MzBhZlx1MzA2OFx1NTQwY1x1MzA1OFx1MzBkNlx1MzBlY1x1MzBmY1x1MzBhZlx1MzBjMFx1MzBhNlx1MzBmM1x1MzBmYlx1MzBhOFx1MzBlY1x1MzBlMVx1MzBmM1x1MzBjOFx1MzA2Zlx1NjMwMVx1MzA2Nlx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLQ0KLSMgRWRpdG9yQ2hvb3Nlcg0KLUVkaXRvckNob29zZXJfbG9hZGRFcnJvckRsZ1RpdGxlPVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0Zg0KLUVkaXRvckNob29zZXJfUmVzb3VyY2VzRXJyb3I9XHUzMDUzXHUzMDZlXHU4OTgxXHU3ZDIwXHUzMDZiXHUzMDZmXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyIFx1MzA1M1x1MzA4Y1x1MzA4OVx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA5Mlx1NGZlZVx1NmI2M1x1MzA1N1x1MzA2Nlx1MzA0Ylx1MzA4OVx1N2Q5YVx1ODg0Y1x1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA5Mlx1MzA0YVx1NTJlN1x1MzA4MVx1MzA1N1x1MzA3ZVx1MzA1OSAoXHU4YTczXHU3ZDMwXHUzMDkyXHU1M2MyXHU3MTY3XHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0KVx1MzAwMlxuXA0KLVxuXA0KLVx1MzAwY09LXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDAxXHUzMGE4XHUzMGM3XHUzMGEzXHUzMGJmXHUzMGZjXHUzMDkyXHU5NThiXHUzMDRiXHUzMDVhXHUzMDZiXHU3ZDlhXHU4ODRjXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyIFx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0Zlx1MzA2Ylx1MzA2Zlx1MzAwMVx1MzA1M1x1MzA2ZVx1MzBjMFx1MzBhNFx1MzBhMlx1MzBlZFx1MzBiMFx1MzA5Mlx1OTU4OVx1MzA1OFx1MzA3ZVx1MzA1OVx1MzAwMg0KLUNvbmZpZ3VyYXRpb25QYWdlX0Zvcm1QcmVmaXg9XHU2OWNiXHU2MjEwOiANCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25OYW1lPVx1NTQwZFx1NTI0ZDoNCi1BdHRhY2htZW50RGlhbG9nRmlsZVVSTF90ZXh0PVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2ZSBVUkw6DQotU3RlcHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbj1cdTMwYjlcdTMwYzZcdTMwYzNcdTMwZDdcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwMDFcdTMwMGNcdTRlMGFcdTMwNzhcdTMwMGRcdTMwN2VcdTMwNWZcdTMwNmZcdTMwMGNcdTRlMGJcdTMwNzhcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTk4MDZcdTVlOGZcdTMwOTJcdTU5MDlcdTY2ZjRcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1NZXRob2RMaWJyYXJ5RWRpdG9yX2Vycl9zYXZlPVx1NGZkZFx1N2JhMVx1NGUyZFx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmYw0KLU1lc3NhZ2VWaWV3X2VycmVsZW1lbnRfdGV4dD1cdTUzYzJcdTcxNjdcdTUwNzRcdTMwNmVcdTg5ODFcdTdkMjANCi1NZXNzYWdlVmlld19yZWZlbGVtZW50X3RleHQ9XHU1M2MyXHU3MTY3XHU1YmZlXHU4YzYxXHUzMDZlXHU4OTgxXHU3ZDIwDQotDQotI0FjdGl2aXR5IERpYWdyYW0NCi1BY3Rpdml0eURpYWdyYW1FZGl0b3JfY3JlYXRlU3RhcnROb2RlX3RleHQ9XHUzMDBjXHU5NThiXHU1OWNiXHUzMGNlXHUzMGZjXHUzMGM5XHUzMDBkXHUzMDZlXHU0ZjVjXHU2MjEwDQotQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudERlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1NjljYlx1NjIxMFx1MzA2Ylx1NTQyYlx1MzA3ZVx1MzA4Y1x1MzA4Ylx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzAwMVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzBmYlx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOFx1MzAwMVx1MzA0YVx1MzA4OFx1MzA3M1x1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLUNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uX3RleHQ9XHUzMDBjXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDBkXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHU4OTgxXHU3ZDIwXHUzMDZlXHU5ODA2XHU1ZThmXHUzMGMwXHUzMGE0XHUzMGEyXHUzMGVkXHUzMGIwDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EaXJlY3RvcnlMYWJlbD1cdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmM6DQotUm9vdFByZWZQYWdlX2VuYWJsZXByb2Nlc3Njb250cmlidXRpb25fdGV4dD1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTViYzRcdTRlMGVcdTMwOTJcdTRmN2ZcdTc1MjhcdTUzZWZcdTgwZmRcdTMwNmJcdTMwNTlcdTMwOGINCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbl90ZXh0PVx1MzA1M1x1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1NGUwMFx1ODIyY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uTGFiZWw9XHU4YWFjXHU2NjBlOg0KLUNvbnRyaWJ1dGlvblNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9Jyd7MH0nJyBcdTMwNmVcdTViYzRcdTRlMGVcdTgwMDVcdTMwOTJcdTkwNzhcdTYyOWUNCi1FbGVtZW50c1ZpZXdfb3BlblZhcmlhYmlsaXR5RGlhbG9nQWN0aW9uX3RleHQ9XHU1OTFhXHU2OWQ4XHU2MDI3XHU4OTgxXHU3ZDIwXHU3ZDRjXHU3NTMxXHUzMDY3XHU5NThiXHUzMDRmDQotVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3RpdGxlPScnezB9JycgXHUzMDZlXHU1OTFhXHU2OWQ4XHU2MDI3XHU4OTgxXHU3ZDIwXHUzMDZlXHU5MDc4XHU2MjllDQotVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3ZpZXdlckxhYmVsPScnezB9JycgXHUzMDZlXHU1OTFhXHU2OWQ4XHU2MDI3XHU4OTgxXHU3ZDIwDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0xhYmVsPVx1NWY2Mlx1NzJiNlx1MzBhMlx1MzBhNFx1MzBiM1x1MzBmM1x1MzA2ZVx1MzBkN1x1MzBlY1x1MzBkM1x1MzBlNVx1MzBmYzoNCi1EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2RlbGV0ZV90ZXh0PVx1NTI0YVx1OTY2NFx1NGUwZFx1NTNlZg0KLUFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9XHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU4YTczXHU3ZDMwXHU1NmYzXHUzMDkyXHU5NThiXHUzMDRmIA0KLU1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fZGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1cdTMwYWZcdTMwZWFcdTMwYTINCi1XUENvbXBhcnRtZW50RmlndXJlXzA9XHU2NWIwXHU4OThmXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU4YTE4XHU4ZmYwXHU1YjUwDQotcHJvbXB0Zm9yX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGRfdGV4dD1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwZmJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwNjdcdTRmNWNcdTYyMTBcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwNmFcdTMwNDRcdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdThhNzNcdTdkMzBcdTU2ZjNcdTMwOTJcdTUxNmNcdTk1OGJcdTMwN2VcdTMwNWZcdTMwNmZcdTMwZDZcdTMwZTlcdTMwYTZcdTMwYmFcdTMwNTlcdTMwOGINCi1wcm9tcHRfZm9yX3B1Ymxpc2hfZXh0ZW5kX2FjdGl2aXR5X2RpYWdyYW09XHU1OTA5XHU2NmY0XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDZhXHUzMDQ0XHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU2MmUxXHU1ZjM1XHUzMDZlXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU1NmYzXHUzMDkyXHU1MTZjXHU5NThiXHUzMDdlXHUzMDVmXHUzMDZmXHUzMGQ2XHUzMGU5XHUzMGE2XHUzMGJhXHUzMDU5XHUzMDhiDQotDQotI0NvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfTmFtZVBhdHRlcm49XHU1NDBkXHU1MjRkXHUzMDZlXHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzIChcdTRlMDBcdTgxZjRcdTMwNTlcdTMwOGJcdTU0MGRcdTUyNGRcdTMwOTJcdTg4NjhcdTc5M2EpOg0KLXNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uX2xhYmVsPVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzBmYlx1MzBjYVx1MzBkM1x1MzBiMlx1MzBmY1x1MzBiZlx1MzBmY1x1MzA2Ylx1ODg2OFx1NzkzYQ0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1BhdHRlcm49XHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzXHUzMDZmXHUzMGIzXHUzMGYzXHUzMGRlXHUzMDY3XHU1MzNhXHU1MjA3XHUzMDhhXHUzMDAxKiBcdTMwNjdcdTRlZmJcdTYxMGZcdTMwNmVcdTMwYjlcdTMwYzhcdTMwZWFcdTMwZjNcdTMwYjBcdTMwMDE/IFx1MzA2N1x1NGVmYlx1NjEwZlx1MzA2ZVx1NjU4N1x1NWI1N1x1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWVycl9wcm9jZXNzaW5nX2ZpbGVfZGVzY3JpcHRpb249SVVQQTAwMjlFOiBcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmVcdTUxZTZcdTc0MDZcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIgXHU4YTczXHUzMDU3XHUzMDRmXHUzMDZmXHUzMDBjXHU4YTczXHU3ZDMwXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQ2F0ZWdvcnlUeXBlPVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmY1x1MzBmYlx1MzBiZlx1MzBhNFx1MzBkNzoNCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19CcmllZkRlc2NyaXB0aW9uPVx1ODk4MVx1NjVlODoNCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19TZWxlY3RDYXRlZ29yaWVzPVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmY1x1MzA2ZVx1OTA3OFx1NjI5ZQ0KLQ0KLSNsb2cgbWVzc2FnZXMNCi1jaGVhdHNoZWV0X2xvYWRfZmFpbHVyZV9sb2dfbXNnPVx1ODk4MVx1NmM0Mlx1MzA1NVx1MzA4Y1x1MzA1Zlx1ODY0ZVx1MzA2ZVx1NWRmYlx1MzA5Mlx1OTU4Ylx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1ZjogDQotDQotbmV3Q29uZmlndXJhdGlvbldpcmF6ZF9jcmVhdGVFcnJvcj1JVVBBMDAzNUU6IFx1NjljYlx1NjIxMFx1MzA5Mlx1NmI2M1x1NWUzOFx1MzA2Ylx1NGY1Y1x1NjIxMFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLW5ld1BsdWdpbldpemFyZF9jcmVhdGVFcnJvcj1JVVBBMDAzNkU6IFx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1NmI2M1x1NWUzOFx1MzA2Ylx1NGY1Y1x1NjIxMFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLWVycm9yRGlhbG9nX21vdmVFcnJvcj1JVVBBMDAzN0U6IFx1ODk4MVx1N2QyMFx1MzA5Mlx1NmI2M1x1NWUzOFx1MzA2Ylx1NzlmYlx1NTJkNVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLXJlbmFtZURpYWxvZ19yZW5hbWVFcnJvcj1JVVBBMDAzOEU6IFx1ODk4MVx1N2QyMFx1MzA5Mlx1NmI2M1x1NWUzOFx1MzA2Ylx1NTQwZFx1NTI0ZFx1NTkwOVx1NjZmNFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLWVycm9yRGlhbG9nX2NyZWF0ZUVycm9yPUlVUEEwMDM5RTogXHU4OTgxXHU3ZDIwXHUzMDkyXHU2YjYzXHU1ZTM4XHUzMDZiXHU0ZjVjXHU2MjEwXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzDQotZHVwbGljYXRlUGx1Z2luTmFtZUVycm9yX21zZz1JVVBBMDEwMUU6IFx1NTQwZFx1NTI0ZCAnJ3swfScnIFx1MzA2Zlx1NjVlMlx1MzA2Ylx1NWI1OFx1NTcyOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMiBcdTUyMjVcdTMwNmVcdTU0MGRcdTUyNGRcdTMwOTJcdTUxNjVcdTUyOWJcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi0NCi0jTmV3IFN0cmluZ3MgZm9yIFByb2Nlc3NFZGl0b3IgQ29udGV4dCBtZW51IGRpYWdyYW0gaW1hZ2VzDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkQURJbWFnZT1BRCBcdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjhcdTMwNmVcdTUyNzJcdTMwOGFcdTVmNTNcdTMwNjYuLi4NCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlPVx1NjZmNFx1NjViMFx1MzBhOFx1MzBlOVx1MzBmYw0KLVByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yTXNnPVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA2ZVx1NjZmNFx1NjViMFx1NGUyZFx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmYw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFEREltYWdlPUFERCBcdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjhcdTMwNmVcdTUyNzJcdTMwOGFcdTVmNTNcdTMwNjYuLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRXUERJbWFnZT1XUEQgXHUzMGE0XHUzMGUxXHUzMGZjXHUzMGI4XHUzMDZlXHU1MjcyXHUzMDhhXHU1ZjUzXHUzMDY2Li4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURJbWFnZUluUHVibGlzaGluZz1cdTUxNmNcdTk1OGJcdTRlMmRcdTMwNmUgQUQgXHUzMGE0XHUzMGUxXHUzMGZjXHUzMGI4XHUzMDZlXHU0ZjdmXHU3NTI4DQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVN1cHByZXNzPVx1MzAwY1x1OGE3M1x1N2QzMFx1MzAwZFx1MzA2Ylx1MzBlYVx1MzBiOVx1MzBjOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA4Ylx1NjI5MVx1NTIzNlx1MzA1NVx1MzA4Y1x1MzA1Zlx1OGExOFx1OGZmMFx1NWI1MFx1MzA2Zlx1MzAwMVx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA1Zlx1ODk4MVx1N2QyMFx1MzA5Mlx1NjI5MVx1NTIzNlx1MzA1N1x1MzA1Zlx1NWY4Y1x1MzA2N1x1MzAwMVx1OTFjZFx1ODkwN1x1MzA5Mlx1OTA3Zlx1MzA1MVx1MzA4Ylx1MzA1Zlx1MzA4MVx1MzA2Ylx1NTI0YVx1OTY2NFx1MzA1OVx1MzA4Ylx1NWZjNVx1ODk4MVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwNTNcdTMwOGNcdTMwODlcdTMwOTJcdTUyNGFcdTk2NjRcdTMwNTdcdTMwNjZcdTdkOWFcdTg4NGNcdTMwNTlcdTMwOGJcdTU4MzRcdTU0MDhcdTMwNmZcdTMwMDFcdTMwMGNPS1x1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFEREltYWdlSW5QdWJsaXNoaW5nPVx1NTE2Y1x1OTU4Ylx1NGUyZFx1MzA2ZSBBREQgXHUzMGE0XHUzMGUxXHUzMGZjXHUzMGI4XHUzMDZlXHU0ZjdmXHU3NTI4DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlV1BESW1hZ2VJblB1Ymxpc2hpbmc9XHU1MTZjXHU5NThiXHU0ZTJkXHUzMDZlIFdQRCBcdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjhcdTMwNmVcdTRmN2ZcdTc1MjgNCi1Qcm9jZXNzRWRpdG9yX0RpYWdyYW1JbWFnZV9JbnB1dERpYWxvZ19pbml0aWFsVmFsdWU9XHUzMGE0XHUzMGUxXHUzMGZjXHUzMGI4XHUzMGZiXHUzMGQxXHUzMGI5DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU2hvd0xpbmtlZEVsZW1lbnRpbkxpYnJhcnlWaWV3PVx1MzBlYVx1MzBmM1x1MzBhZlx1MzA1NVx1MzA4Y1x1MzA1Zlx1ODk4MVx1N2QyMFx1MzA5Mlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzBmYlx1MzBkM1x1MzBlNVx1MzBmY1x1MzA2Ylx1ODg2OFx1NzkzYSgmSCkNCi1Qcm9jZXNzRWRpdG9yX3VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb25fbGFiZWw9XHU1N2ZhXHU2NzJjXHUzMDRiXHUzMDg5XHUzMDZlXHU2MjkxXHU1MjM2XHUzMDZlXHU2NmY0XHU2NWIwKCZCKQ0KLVByb2Nlc3NFZGl0b3JfQ29udGV4dE1lbnVfRGlhZ3JhbUltYWdlcz1cdTMwYzBcdTMwYTRcdTMwYTJcdTMwYjBcdTMwZTlcdTMwZTBcdTMwZmJcdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjgNCi0NCi0jU3RyaW5ncyBmb3Igc3luY2hyb25pemF0aW9uIHdpemFyZCBvbiBwcm9jZXNzIGVkaXRvcidzIEJTDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90aXRsZT1cdTU0MGNcdTY3MWZcdTMwNmVcdThhYWNcdTY2MGUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RleHQ9XHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHU1NDBjXHU2NzFmXHUzMDZlXHU1YjlmXHU4ODRjXHU1MTg1XHU1YmI5XHUzMDkyXHU4YWFjXHU2NjBlXHUzMDU5XHUzMDhiXHUzMDAxXHU0ZWU1XHU0ZTBiXHUzMDZlXHU2MGM1XHU1ODMxXHUzMDkyXHUzMDRhXHU4YWFkXHUzMDdmXHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9XHU2OWNiXHU2MjEwXHUzMDZlXHU5MDc4XHU2MjllDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGV4dD1cdTU0MGNcdTY3MWZcdTMwNmJcdTRmN2ZcdTc1MjhcdTMwNTlcdTMwOGJcdTY5Y2JcdTYyMTBcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIgIFwNCi1cdTMwNTNcdTMwNmVcdTkwNzhcdTYyOWVcdTMwNjdcdTMwMDFcdTU0MGNcdTY3MWZcdTMwNmJcdTRmN2ZcdTc1MjhcdTMwNTVcdTMwOGNcdTMwOGJcdTViYzRcdTRlMGVcdTMwNjhcdTdmNmVcdTYzZGJcdTMwNGNcdTZjN2FcdTMwN2VcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDINCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV9jb25maWdMYWJlbD1cdTY5Y2JcdTYyMTA6DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RpdGxlPVx1NTQwY1x1NjcxZlx1MzA1OVx1MzA4Ylx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzBmY1x1MzA2ZVx1OTA3OFx1NjI5ZQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcm9wZXJ0aWVzX2xhYmxlPVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzBmYw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9uYW1lX2xhYmxlPVx1NTQwZFx1NTI0ZA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmVzZW50YXRpb25OYW1lX2xhYmxlPVx1ODg2OFx1NzkzYVx1NTQwZA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9icmllZkRlc2NfbGFibGU9XHU4OTgxXHU2NWU4DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX29wdGlvbmFsSW5vdXRzX2xhYmVsPVx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmM1x1NTE2NVx1NTI5Yg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9tYW5kYXRvcnlJbnB1dHNfbGFibGU9XHU1ZmM1XHU5ODA4XHU1MTY1XHU1MjliDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX291dHB1dHNfbGFiZWw9XHU1MWZhXHU1MjliDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbGFiZWw9XHU1N2ZhXHU2NzJjXHU1YjlmXHU4ODRjXHU4MDA1DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2FkZG5QZXJmb3JtZXJzX2xhYmxlPVx1OGZmZFx1NTJhMFx1NWI5Zlx1ODg0Y1x1ODAwNQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9yZXNwb25zaWJsZVJvbGVzX2xhYmxlPVx1NjJjNVx1NWY1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9jb250bkFydGlmYWN0c19sYWJlbD1cdTU0MmJcdTMwN2VcdTMwOGNcdTMwOGJcdTYyMTBcdTY3OWNcdTcyNjkNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfZGlsdmVkUGFydHNfbGFiZWw9XHU3ZDBkXHU1MTY1XHU3MjY5DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3NlbFN0ZXBzX2xhYmVsPVx1MzBiOVx1MzBjNlx1MzBjM1x1MzBkN1x1OTA3OFx1NjI5ZQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90ZXh0PVx1NTQwY1x1NjcxZlx1MzA2ZVx1NWJmZVx1OGM2MVx1MzA2OFx1MzA1OVx1MzA4Ylx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzA2ZVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzBmY1x1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90aXRsZT1cdTU0MGNcdTY3MWZcdTMwNmVcdTMwZDdcdTMwZWNcdTMwZDNcdTMwZTVcdTMwZmMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGV4dD1cdTRlZTVcdTRlMGJcdTMwNmVcdTYzZDBcdTY4NDhcdTMwNTVcdTMwOGNcdTMwNWZcdTU0MGNcdTY3MWZcdTMwNmVcdThhNzNcdTdkMzBcdTMwOTJcdTc4YmFcdThhOGRcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1zZWxlY3RFZGl0b3JzVG9EaXNjYXJkQ29uZmxpY3RDaGFuZ2VzPVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1NTkxNlx1MzA2N1x1NTJhMFx1MzA0OFx1MzA4OVx1MzA4Y1x1MzA1Zlx1NTkwOVx1NjZmNFx1MzA2OFx1NzdkYlx1NzZmZVx1MzA1OVx1MzA4Ylx1MzAwMVx1NGZkZFx1N2JhMVx1NTI0ZFx1MzA2ZVx1NTkwOVx1NjZmNFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMlxuXA0KLVx1NTkwOVx1NjZmNFx1MzA5Mlx1NzgzNFx1NjhjNFx1MzA1OVx1MzA4Ylx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXN5bmNocm9uaXphdGlvbldpemFyZF90aXRsZV90ZXh0PVx1NTQwY1x1NjcxZlx1MzBhNlx1MzBhM1x1MzBiNlx1MzBmY1x1MzBjOQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfZXhwbGFpblRleHQ9XHUzMDUzXHUzMDZlXHUzMGE2XHUzMGEzXHUzMGI2XHUzMGZjXHUzMGM5XHUzMDZmXHUzMDAxXHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzXHUzMGZjXHUzMGZiXHUzMGQzXHUzMGU1XHUzMGZjXHUzMDZlXHUzMDBjXHU0ZTAwXHU4MjJjXHUzMDBkXHUzMGJmXHUzMGQ2XHUzMDY3XHUzMDBjXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDY4XHU1NDBjXHU2NzFmXHU1MzE2XHUzMDBkXHUzMDY4XHUzMGRlXHUzMGZjXHUzMGFmXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDhiXHU5MDc4XHU2MjllXHU2ZTA4XHUzMDdmXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHUzMDZlXHU0ZTBiXHUzMDZlXHUzMDAxXHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDdlXHUzMDVmXHUzMDZmXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZlXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDkyXHU2NmY0XHU2NWIwXHUzMDU5XHUzMDhiXHU2NGNkXHU0ZjVjXHUzMDkyXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyICBcDQotXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDY3XHUzMDZmXHUzMDAxXHUzMDUzXHUzMDZlXHUzMGE2XHUzMGEzXHUzMGI2XHUzMGZjXHUzMGM5XHUzMDY3XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzXHUzMGZjXHUzMDYwXHUzMDUxXHUzMDRjXHU2NmY0XHU2NWIwXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU5XHUzMDAyICBcDQotXHU2NmY0XHU2NWIwXHUzMDZlXHU4YTA4XHU3Yjk3XHU2NjQyXHUzMDZiXHU0ZjdmXHU3NTI4XHUzMDU5XHUzMDhiXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDZlXHU2NzA5XHU1MmI5XHUzMDZhXHU2OWNiXHU2MjEwXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU5XHUzMDhiXHUzMDUzXHUzMDY4XHUzMDgyXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDU5XHUzMDAyICBcDQotXHUzMDUzXHUzMDZlXHUzMGE2XHUzMGEzXHUzMGI2XHUzMGZjXHUzMGM5XHUzMDY3XHUzMDZmXHUzMDAxXHU1MmQ1XHU3Njg0XHUzMDZiXHUzMGVhXHUzMGYzXHUzMGFmXHUzMDU1XHUzMDhjXHUzMDVmIChcdTdkZDFcdTgyNzJcdTMwNmVcdTMwYTRcdTMwYmZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNjdcdTc5M2FcdTMwNTVcdTMwOGNcdTMwOGIpIFx1OGExOFx1OGZmMFx1NWI1MFx1MzA2Zlx1NjZmNFx1NjViMFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLQ0KLW9wZW5SVEU9XHUzMGVhXHUzMGMzXHUzMGMxXHUzMGZiXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMGZiXHUzMGE4XHUzMGM3XHUzMGEzXHUzMGJmXHUzMGZjXHUzMDkyXHU5NThiXHUzMDRmDQotY2xvc2VSVEU9XHUzMGVhXHUzMGMzXHUzMGMxXHUzMGZiXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMGZiXHUzMGE4XHUzMGM3XHUzMGEzXHUzMGJmXHUzMGZjXHUzMDkyXHU5NTg5XHUzMDU4XHUzMDhiDQotDQotI05ldyBTdHJpbmdzDQotcm9sZXNldHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzhcdTMwNmJcdTVjNWVcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1kaXNjaXBsaW5lc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZVx1MzA2Ylx1NWM1ZVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1MzA5Mlx1N2JhMVx1NzQwNlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXdvcmtwcm9kdWN0dHlwZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTk4NWVcdTMwNmJcdTVjNWVcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1kb21haW5zX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGM5XHUzMGUxXHUzMGE0XHUzMGYzXHUzMDZiXHU1YzVlXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdG9vbHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwYzRcdTMwZmNcdTMwZWJcdTMwNmJcdTVjNWVcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1jdXN0b21jYXRlZ29yeV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBhYlx1MzBiOVx1MzBiZlx1MzBlMFx1MzBmYlx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmY1x1MzA2Ylx1NWM1ZVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1MzA5Mlx1N2JhMVx1NzQwNlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLWNvbmNlcHRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTY5ODJcdTVmZjVcdTMwNmJcdTVjNWVcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1jaGVja2xpc3RfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTMwZWFcdTMwYjlcdTMwYzhcdTMwNmJcdTVjNWVcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1leGFtcGxlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHU0ZjhiXHUzMDZiXHU1YzVlXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZ3VpZGVsaW5lX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGFjXHUzMGE0XHUzMGM5XHUzMGU5XHUzMGE0XHUzMGYzXHUzMDZiXHU1YzVlXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcm9hZG1hcF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBjOVx1MzBkZVx1MzBjM1x1MzBkN1x1MzA2Ylx1NWM1ZVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1MzA5Mlx1N2JhMVx1NzQwNlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXJldXNhYmxlYXNzZXRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTUxOGRcdTUyMjlcdTc1MjhcdTUzZWZcdTgwZmRcdTMwNmFcdThjYzdcdTc1MjNcdTMwNmJcdTVjNWVcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwYjVcdTMwZGRcdTMwZmNcdTMwYzhcdThjYzdcdTY1OTlcdTMwNmJcdTVjNWVcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1yZXBvcnRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwZWNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNmJcdTVjNWVcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1wcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBkN1x1MzBlOVx1MzBhZlx1MzBjNlx1MzBhM1x1MzBiOVx1MzA2Ylx1NWM1ZVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1MzA5Mlx1N2JhMVx1NzQwNlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXRlbXBsYXRlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMDZiXHU1YzVlXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdGVybWRlZmluaXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTc1MjhcdThhOWVcdTViOWFcdTdmYTlcdTMwNmJcdTVjNWVcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwOTJcdTdiYTFcdTc0MDZcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi10b29sbWVudG9yX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGM0XHUzMGZjXHUzMGViXHUzMGZiXHUzMGUxXHUzMGYzXHUzMGJmXHUzMGZjXHUzMDZiXHU1YzVlXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotd2hpdGVwYXBlcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBkYlx1MzBlZlx1MzBhNFx1MzBjOFx1MzBmYlx1MzBkYVx1MzBmY1x1MzBkMVx1MzBmY1x1MzA2Ylx1NWM1ZVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1MzA5Mlx1N2JhMVx1NzQwNlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHU4OThiXHU3YTRkXHUzMDgyXHUzMDhhXHU4MDAzXHU2MTZlXHU0ZThiXHU5ODA1XHUzMDZiXHU1YzVlXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5XHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotDQotI05ldyBTdHJpbmcgU2VjdGlvbiBEZXNjcmlwdGlvbg0KLXJvbGVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXJvbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcm9sZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwNjhcdTUyMjVcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwNjhcdTMwNmVcdTk1YTJcdTRmYzJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1yb2xlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLXRhc2tfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBiZlx1MzBiOVx1MzBhZlx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXRhc2tfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGJmXHUzMGI5XHUzMGFmXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdGFza192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYmZcdTMwYjlcdTMwYWZcdTMwNjhcdTUyMjVcdTMwNmVcdTMwYmZcdTMwYjlcdTMwYWZcdTMwNjhcdTMwNmVcdTk1YTJcdTRmYzJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi10YXNrX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBiZlx1MzBiOVx1MzBhZlx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLWFydGlmYWN0X2RldGFpbFNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTYyMTBcdTY3OWNcdTcyNjlcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdThhNzNcdTdkMzBcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1hcnRpZmFjdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTYyMTBcdTY3OWNcdTcyNjlcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1hcnRpZmFjdF9pY29uU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1NjIxMFx1Njc5Y1x1NzI2OVx1MzA2ZVx1MzBhMlx1MzBhNFx1MzBiM1x1MzBmM1x1MzA5Mlx1MzBhYlx1MzBiOVx1MzBiZlx1MzBkZVx1MzBhNFx1MzBiYVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWFydGlmYWN0X25vdGF0aW9uU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1NjIxMFx1Njc5Y1x1NzI2OVx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBjN1x1MzBlYVx1MzBkMFx1MzBlYVx1MzBmY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTYyMTBcdTY3OWNcdTcyNjlcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdThhYmZcdTY1NzRcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1hcnRpZmFjdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTYyMTBcdTY3OWNcdTcyNjlcdTMwNjhcdTUyMjVcdTMwNmVcdTYyMTBcdTY3OWNcdTcyNjlcdTMwNjhcdTMwNmVcdTk1YTJcdTRmYzJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1hcnRpZmFjdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTYyMTBcdTY3OWNcdTcyNjlcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi1vdXRjb21lX2RldGFpbFNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTdkNTBcdTY3OWNcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdThhNzNcdTdkMzBcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1vdXRjb21lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1N2Q1MFx1Njc5Y1x1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1NGUwMFx1ODIyY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLW91dGNvbWVfaWNvblNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTdkNTBcdTY3OWNcdTMwNmVcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwOTJcdTMwYWJcdTMwYjlcdTMwYmZcdTMwZGVcdTMwYTRcdTMwYmFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1vdXRjb21lX25vdGF0aW9uU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1N2Q1MFx1Njc5Y1x1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBjN1x1MzBlYVx1MzBkMFx1MzBlYVx1MzBmY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLW91dGNvbWVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1N2Q1MFx1Njc5Y1x1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGFiZlx1NjU3NFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLW91dGNvbWVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU3ZDUwXHU2NzljXHUzMDY4XHU1MjI1XHUzMDZlXHU3ZDUwXHU2NzljXHUzMDY4XHUzMDZlXHU5NWEyXHU0ZmMyXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotb3V0Y29tZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTdkNTBcdTY3OWNcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi1kZWxpdmVyYWJsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU3ZDBkXHU1MTY1XHU3MjY5XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZGVsaXZlcmFibGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU3ZDBkXHU1MTY1XHU3MjY5XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZGVsaXZlcmFibGVfaWNvblNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTdkMGRcdTUxNjVcdTcyNjlcdTMwNmVcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwOTJcdTMwYWJcdTMwYjlcdTMwYmZcdTMwZGVcdTMwYTRcdTMwYmFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1kZWxpdmVyYWJsZV9ub3RhdGlvblNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTdkMGRcdTUxNjVcdTcyNjlcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTMwYzdcdTMwZWFcdTMwZDBcdTMwZWFcdTMwZmNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1kZWxpdmVyYWJsZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU3ZDBkXHU1MTY1XHU3MjY5XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YWJmXHU2NTc0XHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZGVsaXZlcmFibGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU3ZDBkXHU1MTY1XHU3MjY5XHUzMDY4XHU1MjI1XHUzMDZlXHU3ZDBkXHU1MTY1XHU3MjY5XHUzMDY4XHUzMDZlXHU5NWEyXHU0ZmMyXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZGVsaXZlcmFibGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU3ZDBkXHU1MTY1XHU3MjY5XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotZGlzY2lwbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZGlzY2lwbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2VcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1kaXNjaXBsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZVx1MzA2OFx1NTIyNVx1MzA2ZVx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZVx1MzA2OFx1MzA2ZVx1OTVhMlx1NGZjMlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWRpc2NpcGxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotZG9tYWluX2RldGFpbFNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYzlcdTMwZTFcdTMwYTRcdTMwZjNcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdThhNzNcdTdkMzBcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1kb21haW5fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGM5XHUzMGUxXHUzMGE0XHUzMGYzXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZG9tYWluX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBjOVx1MzBlMVx1MzBhNFx1MzBmM1x1MzA2OFx1NTIyNVx1MzA2ZVx1MzBjOVx1MzBlMVx1MzBhNFx1MzBmM1x1MzA2OFx1MzA2ZVx1OTVhMlx1NGZjMlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWRvbWFpbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYzlcdTMwZTFcdTMwYTRcdTMwZjNcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi13b3JrcHJvZHVjdHR5cGVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1MzA2ZVx1N2EyZVx1OTg1ZVx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXdvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTMwNmVcdTdhMmVcdTk4NWVcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi13b3JrcHJvZHVjdHR5cGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDZlXHU3YTJlXHU5ODVlXHUzMDY4XHU1MjI1XHUzMDZlXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDZlXHU3YTJlXHU5ODVlXHUzMDY4XHUzMDZlXHU5NWEyXHU0ZmMyXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotd29ya3Byb2R1Y3R0eXBlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1MzA2ZVx1N2EyZVx1OTg1ZVx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLXJvbGVzZXRfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjOFx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXJvbGVzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMGZiXHUzMGJiXHUzMGMzXHUzMGM4XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcm9sZXNldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzhcdTMwNjhcdTUyMjVcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzhcdTMwNjhcdTMwNmVcdTk1YTJcdTRmYzJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1yb2xlc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjOFx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLXRvb2xfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBjNFx1MzBmY1x1MzBlYlx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXRvb2xfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGM0XHUzMGZjXHUzMGViXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdG9vbF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYzRcdTMwZmNcdTMwZWJcdTMwNjhcdTUyMjVcdTMwNmVcdTMwYzRcdTMwZmNcdTMwZWJcdTMwNjhcdTMwNmVcdTk1YTJcdTRmYzJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi10b29sX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBjNFx1MzBmY1x1MzBlYlx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLWNvbmNlcHRfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1Njk4Mlx1NWZmNVx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWNvbmNlcHRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU2OTgyXHU1ZmY1XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotY29uY2VwdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTY5ODJcdTVmZjVcdTMwNjhcdTUyMjVcdTMwNmVcdTY5ODJcdTVmZjVcdTMwNjhcdTMwNmVcdTk1YTJcdTRmYzJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1jb25jZXB0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1Njk4Mlx1NWZmNVx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLWNoZWNrbGlzdF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHUzMGVhXHUzMGI5XHUzMGM4XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1MzBlYVx1MzBiOVx1MzBjOFx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1NGUwMFx1ODIyY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWNoZWNrbGlzdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTMwZWFcdTMwYjlcdTMwYzhcdTMwNjhcdTUyMjVcdTMwNmVcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTMwZWFcdTMwYjlcdTMwYzhcdTMwNjhcdTMwNmVcdTk1YTJcdTRmYzJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1jaGVja2xpc3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHUzMGVhXHUzMGI5XHUzMGM4XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotZXhhbXBsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU0ZjhiXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZXhhbXBsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTRmOGJcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1leGFtcGxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1NGY4Ylx1MzA2OFx1NTIyNVx1MzA2ZVx1NGY4Ylx1MzA2OFx1MzA2ZVx1OTVhMlx1NGZjMlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWV4YW1wbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU0ZjhiXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotZ3VpZGVsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYWNcdTMwYTRcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZjNcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdThhNzNcdTdkMzBcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1ndWlkZWxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGFjXHUzMGE0XHUzMGM5XHUzMGU5XHUzMGE0XHUzMGYzXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZ3VpZGVsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBhY1x1MzBhNFx1MzBjOVx1MzBlOVx1MzBhNFx1MzBmM1x1MzA2OFx1NTIyNVx1MzA2ZVx1MzBhY1x1MzBhNFx1MzBjOVx1MzBlOVx1MzBhNFx1MzBmM1x1MzA2OFx1MzA2ZVx1OTVhMlx1NGZjMlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWd1aWRlbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYWNcdTMwYTRcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZjNcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU4OThiXHU3YTRkXHUzMDgyXHUzMDhhXHU4MDAzXHU2MTZlXHU0ZThiXHU5ODA1XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU4OThiXHU3YTRkXHUzMDgyXHUzMDhhXHU4MDAzXHU2MTZlXHU0ZThiXHU5ODA1XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU4OThiXHU3YTRkXHUzMDgyXHUzMDhhXHU4MDAzXHU2MTZlXHU0ZThiXHU5ODA1XHUzMDY4XHU1MjI1XHUzMDZlXHU4OThiXHU3YTRkXHUzMDgyXHUzMDhhXHU4MDAzXHU2MTZlXHU0ZThiXHU5ODA1XHUzMDY4XHUzMDZlXHU5NWEyXHU0ZmMyXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU4OThiXHU3YTRkXHUzMDgyXHUzMDhhXHU4MDAzXHU2MTZlXHU0ZThiXHU5ODA1XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotcHJhY3RpY2VfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBkN1x1MzBlOVx1MzBhZlx1MzBjNlx1MzBhM1x1MzBiOVx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXByYWN0aWNlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBkN1x1MzBlOVx1MzBhZlx1MzBjNlx1MzBhM1x1MzBiOVx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1NGUwMFx1ODIyY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXByYWN0aWNlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBkN1x1MzBlOVx1MzBhZlx1MzBjNlx1MzBhM1x1MzBiOVx1MzA2OFx1NTIyNVx1MzA2ZVx1MzBkN1x1MzBlOVx1MzBhZlx1MzBjNlx1MzBhM1x1MzBiOVx1MzA2OFx1MzA2ZVx1OTVhMlx1NGZjMlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXByYWN0aWNlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBkN1x1MzBlOVx1MzBhZlx1MzBjNlx1MzBhM1x1MzBiOVx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLXJlcG9ydF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGVjXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcmVwb3J0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBlY1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1NGUwMFx1ODIyY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXJlcG9ydF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwZWNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNjhcdTUyMjVcdTMwNmVcdTMwZWNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNjhcdTMwNmVcdTk1YTJcdTRmYzJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1yZXBvcnRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGVjXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotcmVzdWFibGVhc3NldF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU1MThkXHU1MjI5XHU3NTI4XHU1M2VmXHU4MGZkXHUzMDZhXHU4Y2M3XHU3NTIzXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcmVzdWFibGVhc3NldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTUxOGRcdTUyMjlcdTc1MjhcdTUzZWZcdTgwZmRcdTMwNmFcdThjYzdcdTc1MjNcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1yZXN1YWJsZWFzc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1NTE4ZFx1NTIyOVx1NzUyOFx1NTNlZlx1ODBmZFx1MzA2YVx1OGNjN1x1NzUyM1x1MzA2OFx1NTIyNVx1MzA2ZVx1NTE4ZFx1NTIyOVx1NzUyOFx1NTNlZlx1ODBmZFx1MzA2YVx1OGNjN1x1NzUyM1x1MzA2OFx1MzA2ZVx1OTVhMlx1NGZjMlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXJlc3VhYmxlYXNzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU1MThkXHU1MjI5XHU3NTI4XHU1M2VmXHU4MGZkXHUzMDZhXHU4Y2M3XHU3NTIzXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotcm9hZG1hcF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGM5XHUzMGRlXHUzMGMzXHUzMGQ3XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcm9hZG1hcF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwYzlcdTMwZGVcdTMwYzNcdTMwZDdcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1yb2FkbWFwX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBjOVx1MzBkZVx1MzBjM1x1MzBkN1x1MzA2OFx1NTIyNVx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBjOVx1MzBkZVx1MzBjM1x1MzBkN1x1MzA2OFx1MzA2ZVx1OTVhMlx1NGZjMlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXJvYWRtYXBfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGM5XHUzMGRlXHUzMGMzXHUzMGQ3XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotc3VwcG9ydGluZ21hdGVyaWFsX2RldGFpbFNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYjVcdTMwZGRcdTMwZmNcdTMwYzhcdThjYzdcdTY1OTlcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdThhNzNcdTdkMzBcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHU4Y2M3XHU2NTk5XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1OGNjN1x1NjU5OVx1MzA2OFx1NTIyNVx1MzA2ZVx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1OGNjN1x1NjU5OVx1MzA2OFx1MzA2ZVx1OTVhMlx1NGZjMlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXN1cHBvcnRpbmdtYXRlcmlhbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYjVcdTMwZGRcdTMwZmNcdTMwYzhcdThjYzdcdTY1OTlcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi10ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdGVtcGxhdGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMDY4XHU1MjI1XHUzMDZlXHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMDY4XHUzMDZlXHU5NWEyXHU0ZmMyXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdGVtcGxhdGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotdGVybWRlZmluaXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1NzUyOFx1OGE5ZVx1NWI5YVx1N2ZhOVx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1NzUyOFx1OGE5ZVx1NWI5YVx1N2ZhOVx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1NGUwMFx1ODIyY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXRlcm1kZWZpbml0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1NzUyOFx1OGE5ZVx1NWI5YVx1N2ZhOVx1MzA2OFx1NTIyNVx1MzA2ZVx1NzUyOFx1OGE5ZVx1NWI5YVx1N2ZhOVx1MzA2OFx1MzA2ZVx1OTVhMlx1NGZjMlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1NzUyOFx1OGE5ZVx1NWI5YVx1N2ZhOVx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLXRvb2xtZW50b3JfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBjNFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBlMVx1MzBmM1x1MzBiZlx1MzBmY1x1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXRvb2xtZW50b3JfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGM0XHUzMGZjXHUzMGViXHUzMGZiXHUzMGUxXHUzMGYzXHUzMGJmXHUzMGZjXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdG9vbG1lbnRvcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYzRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwZTFcdTMwZjNcdTMwYmZcdTMwZmNcdTMwNjhcdTUyMjVcdTMwNmVcdTMwYzRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwZTFcdTMwZjNcdTMwYmZcdTMwZmNcdTMwNjhcdTMwNmVcdTk1YTJcdTRmYzJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi10b29sbWVudG9yX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBjNFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBlMVx1MzBmM1x1MzBiZlx1MzBmY1x1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLXdoaXRlcGFwZXJfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBkYlx1MzBlZlx1MzBhNFx1MzBjOFx1MzBmYlx1MzBkYVx1MzBmY1x1MzBkMVx1MzBmY1x1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXdoaXRlcGFwZXJfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGRiXHUzMGVmXHUzMGE0XHUzMGM4XHUzMGZiXHUzMGRhXHUzMGZjXHUzMGQxXHUzMGZjXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotd2hpdGVwYXBlcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwZGJcdTMwZWZcdTMwYTRcdTMwYzhcdTMwZmJcdTMwZGFcdTMwZmNcdTMwZDFcdTMwZmNcdTMwNjhcdTUyMjVcdTMwNmVcdTMwZGJcdTMwZWZcdTMwYTRcdTMwYzhcdTMwZmJcdTMwZGFcdTMwZmNcdTMwZDFcdTMwZmNcdTMwNjhcdTMwNmVcdTk1YTJcdTRmYzJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi13aGl0ZXBhcGVyX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBkYlx1MzBlZlx1MzBhNFx1MzBjOFx1MzBmYlx1MzBkYVx1MzBmY1x1MzBkMVx1MzBmY1x1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLWRpc2NpcGxpbmVncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZGlzY2lwbGluZWdyb3VwaW5nX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZVx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1NGUwMFx1ODIyY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2VcdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTMwNjhcdTUyMjVcdTMwNmVcdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2VcdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTMwNjhcdTMwNmVcdTk1YTJcdTRmYzJcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1kaXNjaXBsaW5lZ3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotcm9sZXNldGdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzhcdTMwZmJcdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdThhNzNcdTdkMzBcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1yb2xlc2V0Z3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMGZiXHUzMGJiXHUzMGMzXHUzMGM4XHUzMGZiXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcm9sZXNldGdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjOFx1MzBmYlx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1MzA2OFx1NTIyNVx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjOFx1MzBmYlx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1MzA2OFx1MzA2ZVx1OTVhMlx1NGZjMlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXJvbGVzZXRncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzhcdTMwZmJcdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi1jdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDY4XHU1MjI1XHUzMDZlXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDY4XHUzMDZlXHU5NWEyXHU0ZmMyXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfSWNvblNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYWJcdTMwYjlcdTMwYmZcdTMwZTBcdTMwZmJcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmNcdTMwNmVcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwOTJcdTMwYWJcdTMwYjlcdTMwYmZcdTMwZGVcdTMwYTRcdTMwYmFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi1jb25jZXB0X2ljb25TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU2OTgyXHU1ZmY1XHUzMDZlXHUzMGEyXHUzMGE0XHUzMGIzXHUzMGYzXHUzMDkyXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGRlXHUzMGE0XHUzMGJhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotY2hlY2tsaXN0X2ljb25TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHUzMGVhXHUzMGI5XHUzMGM4XHUzMDZlXHUzMGEyXHUzMGE0XHUzMGIzXHUzMGYzXHUzMDkyXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGRlXHUzMGE0XHUzMGJhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdG9vbG1lbnRvcl9pY29uU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBjNFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBlMVx1MzBmM1x1MzBiZlx1MzBmY1x1MzA2ZVx1MzBhMlx1MzBhNFx1MzBiM1x1MzBmM1x1MzA5Mlx1MzBhYlx1MzBiOVx1MzBiZlx1MzBkZVx1MzBhNFx1MzBiYVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXdoaXRlcGFwZXJfaWNvblNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwZGJcdTMwZWZcdTMwYTRcdTMwYzhcdTMwZmJcdTMwZGFcdTMwZmNcdTMwZDFcdTMwZmNcdTMwNmVcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwOTJcdTMwYWJcdTMwYjlcdTMwYmZcdTMwZGVcdTMwYTRcdTMwYmFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9pY29uU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1ODk4Ylx1N2E0ZFx1MzA4Mlx1MzA4YVx1ODAwM1x1NjE2ZVx1NGU4Ylx1OTgwNVx1MzA2ZVx1MzBhMlx1MzBhNFx1MzBiM1x1MzBmM1x1MzA5Mlx1MzBhYlx1MzBiOVx1MzBiZlx1MzBkZVx1MzBhNFx1MzBiYVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXRlcm1kZWZpbml0aW9uX2ljb25TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU3NTI4XHU4YTllXHU1YjlhXHU3ZmE5XHUzMDZlXHUzMGEyXHUzMGE0XHUzMGIzXHUzMGYzXHUzMDkyXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGRlXHUzMGE0XHUzMGJhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdGVtcGxhdGVfaWNvblNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwYzZcdTMwZjNcdTMwZDdcdTMwZWNcdTMwZmNcdTMwYzhcdTMwNmVcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwOTJcdTMwYWJcdTMwYjlcdTMwYmZcdTMwZGVcdTMwYTRcdTMwYmFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1yZXVzYWJsZWFzc2V0X2ljb25TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU1MThkXHU1MjI5XHU3NTI4XHU1M2VmXHU4MGZkXHUzMDZhXHU4Y2M3XHU3NTIzXHUzMDZlXHUzMGEyXHUzMGE0XHUzMGIzXHUzMGYzXHUzMDkyXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGRlXHUzMGE0XHUzMGJhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcmVwb3J0X2ljb25TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGVjXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDZlXHUzMGEyXHUzMGE0XHUzMGIzXHUzMGYzXHUzMDkyXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGRlXHUzMGE0XHUzMGJhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcHJhY3RpY2VfaWNvblNlY3Rpb25fZGVzYz1cdTMwNTNcdTMwNmVcdTMwZDdcdTMwZTlcdTMwYWZcdTMwYzZcdTMwYTNcdTMwYjlcdTMwNmVcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwOTJcdTMwYWJcdTMwYjlcdTMwYmZcdTMwZGVcdTMwYTRcdTMwYmFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1leGFtcGxlX2ljb25TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHU0ZjhiXHUzMDZlXHUzMGEyXHUzMGE0XHUzMGIzXHUzMGYzXHUzMDkyXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGRlXHUzMGE0XHUzMGJhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotZ3VpZGVsaW5lX2ljb25TZWN0aW9uX2Rlc2M9XHUzMDUzXHUzMDZlXHUzMGFjXHUzMGE0XHUzMGM5XHUzMGU5XHUzMGE0XHUzMGYzXHUzMDZlXHUzMGEyXHUzMGE0XHUzMGIzXHUzMGYzXHUzMDkyXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGRlXHUzMGE0XHUzMGJhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcm9hZG1hcF9pY29uU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBjOVx1MzBkZVx1MzBjM1x1MzBkN1x1MzA2ZVx1MzBhMlx1MzBhNFx1MzBiM1x1MzBmM1x1MzA5Mlx1MzBhYlx1MzBiOVx1MzBiZlx1MzBkZVx1MzBhNFx1MzBiYVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9pY29uU2VjdGlvbl9kZXNjPVx1MzA1M1x1MzA2ZVx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1OGNjN1x1NjU5OVx1MzA2ZVx1MzBhMlx1MzBhNFx1MzBiM1x1MzBmM1x1MzA5Mlx1MzBhYlx1MzBiOVx1MzBiZlx1MzBkZVx1MzBhNFx1MzBiYVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLWVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX3RpdGxlPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1NTkwOVx1NjZmNFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zg0KLWVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX21lc3NhZ2U9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMGZiXHUzMGI3XHUzMGI5XHUzMGM2XHUzMGUwXHUzMDY3XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDRjXHU1OTA5XHU2NmY0XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyIFx1NTkwOVx1NjZmNFx1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi0NCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZT1cdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTMwNmVcdTUzZWZcdTU5MDlcdTYwMjcNCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2c9Jyd7MX0nJyBcdTMwNmZcdTY1ZTJcdTMwNmIgMSBcdTMwNjRcdTRlZTVcdTRlMGFcdTMwNmVcdTViYzRcdTRlMGUvXHU3ZjZlXHU2M2RiXHU2ZTA4XHUzMDdmXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHUzMDkyXHU1YjUwXHUzMDY4XHUzMDU3XHUzMDY2XHU2MzAxXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDhiXHUzMDVmXHUzMDgxXHUzMDAxXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjICcnezB9JycgXHUzMDZmICcnezF9JycgXHUzMDY3XHU1M2VmXHU1OTA5XHU2MDI3XHUzMDkyXHU4YTJkXHU1YjlhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMT1cdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmMgJyd7MH0nJyBcdTMwNmZcdTMwMDFcdTMwNDRcdTMwNWFcdTMwOGNcdTMwNGJcdTMwNmVcdTc2ZjRcdTYzYTVcdTMwNmVcdTg5YWFcdTMwNGFcdTMwODhcdTMwNzNcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNjdcdTUzZWZcdTU5MDlcdTYwMjdcdTMwOTJcdThhMmRcdTViOWFcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cyPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmYyAnJ3swfScnIFx1MzA2Zlx1MzAwMVx1NWZhYVx1NzRiMFx1NGY5ZFx1NWI1OFx1OTVhMlx1NGZjMlx1MzA2Ylx1MzA2YVx1MzA4Ylx1MzA1Zlx1MzA4MSAnJ3sxfScnIFx1MzA2N1x1NTNlZlx1NTkwOVx1NjAyN1x1MzA5Mlx1OGEyZFx1NWI5YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLQ0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfdGl0bGU9XHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzXHUzMDZlXHU5MDY5XHU3NTI4DQotYXBwbHlfcGF0dGVybl9lcnJvcl9tc2c9XHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjICcnezB9JycgXHUzMDZmXHUzMDAxXHU1ZmFhXHU3NGIwXHU0ZjlkXHU1YjU4XHU5NWEyXHU0ZmMyXHUzMDZiXHUzMDZhXHUzMDhiXHUzMDVmXHUzMDgxICcnezF9JycgXHUzMDY3XHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzXHUzMDkyXHU5MDY5XHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfZGVsaW1pdGVyPXwNCi1NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3Nob3dPd25lckluTGlicmFyeVZpZXc9XHUzMDUzXHUzMDZlXHU2NzJhXHU4OWUzXHU2YzdhXHUzMDZlXHU1M2MyXHU3MTY3XHUzMDZlXHU2MjQwXHU2NzA5XHU4MDA1XHUzMDkyXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQzXHUzMGU1XHUzMGZjXHUzMDZiXHU4ODY4XHU3OTNhXHUzMDU5XHUzMDhiDQotTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9yZW1vdmVVbnJlc29sdmVkUmVmZXJlbmNlPVx1MzA1M1x1MzA2ZVx1NjcyYVx1ODllM1x1NmM3YVx1MzA2ZVx1NTNjMlx1NzE2N1x1MzA5Mlx1OTY2NFx1NTNiYlx1MzA1OVx1MzA4Yg0KLXByb21wdERlbGV0ZUN1c3RvbUNhdGVnb3J5QmVmb3JlUmVtb3ZlTGFzdFJlZlRvSXQ9XHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHU1MTg1XHUzMDZlIHswfSBcdTMwNzhcdTMwNmVcdTY3MDBcdTVmOGNcdTMwNmVcdTUzYzJcdTcxNjdcdTMwOTJcdTk2NjRcdTUzYmJcdTMwNTdcdTMwODhcdTMwNDZcdTMwNjhcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDJcdTg5ODFcdTdkMjBcdTMwNmZcdTUyNGFcdTk2NjRcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDJcdTdkOWFcdTg4NGNcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSNCZWxvdyBwcm9wZXJ0eSAiZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzIiBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQNCi0jRG9uJ3QgZGVsZXRlIGEgc3BhY2UgYWZ0ZXIgIjogIg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzPTogDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlYzRmOWQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyMTQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEZvcm0gUGFnZSBUaXRsZXMNCi1hc3NpZ25QYWdlX3RpdGxlPVx1YzljMFx1YzgxNQ0KLWNhdGVnb3JpZXNQYWdlX3RpdGxlPVx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYw0KLWRlbGl2ZXJhYmxlUGFydHNQYWdlX3RpdGxlPVx1Yzc3OFx1YjNjNFx1YmIzYyBcdWQzMGNcdWQyYjgNCi1kZXNjcmlwdGlvblBhZ2VfdGl0bGU9XHVjMTI0XHViYTg1DQotZGlzY2lwbGluZXNQYWdlX3RpdGxlPVx1YzZkMFx1Y2U1OQ0KLWRpc2NhcmR1bnJlc29sdmVkcmVmPVx1ZDU3NFx1YzExZFx1ZDU2MCBcdWMyMTggXHVjNWM2XHViMjk0IFx1Y2MzOFx1Yzg3MCBcdWJjODRcdWI5YWNcdWFlMzANCi1ndWlkYW5jZVBhZ2VfdGl0bGU9XHVjNTQ4XHViMGI0DQotcHJldmlld1BhZ2VfdGl0bGU9XHViYmY4XHViOWFjXHViY2Y0XHVhZTMwDQotcmVmZXJlbmNlc1BhZ2VfdGl0bGU9XHVjYzM4XHVjODcwDQotcmVmZXJlbmNlX3RleHQ9XHVjYzM4XHVjODcwOg0KLXJlZmVyZW5jZVdvcmtmbG93UGFnZV90aXRsZT1cdWNjMzhcdWM4NzAgXHVjNmNjXHVkMDZjXHVkNTBjXHViODVjXHVjNmIwDQotcm9sZXNQYWdlX3RpdGxlPVx1YzVlZFx1ZDU2MA0KLXJvbGVTZXRzUGFnZV90aXRsZT1cdWM1ZWRcdWQ1NjAgXHVjMTM4XHVkMmI4DQotc3RlcHNQYWdlX3RpdGxlPVx1YjJlOFx1YWNjNA0KLXRhc2tzUGFnZV90aXRsZT1cdWQwYzBcdWMyYTRcdWQwNmMNCi10b29sTWVudG9yc1BhZ2VfdGl0bGU9XHViM2M0XHVhZDZjIFx1YzBhY1x1YzZhOSBcdWIzYzRcdWM2YzBcdWI5ZDANCi13b3JrUHJvZHVjdHNQYWdlX3RpdGxlPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi0NCi0jIFNlY3Rpb24gTmFtZXMgJiBEZXNjcmlwdGlvbg0KLWNoZWNrSXRlbXNTZWN0aW9uX25hbWU9XHVhYzgwXHVjMGFjIFx1ZDU2ZFx1YmFhOQ0KLWNoZWNrSXRlbXNTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1Y2NiNFx1ZDA2Y1x1YjlhY1x1YzJhNFx1ZDJiOFx1Yjk3YyBcdWFkNmNcdWMxMzFcdWQ1NThcdWIyOTQgXHVhYzgwXHVjMGFjIFx1ZDU2ZFx1YmFhOVx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZGVwZW5kZW5jaWVzU2VjdGlvbl9uYW1lPVx1Yzg4NVx1YzE4ZFx1YzEzMQ0KLWRlcGVuZGVuY2llc1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVjMTM5XHVjMTU4XHVjNWQwXHViMjk0IFx1YjJlNFx1Yjk3OCBcdWNlZThcdWQxNTBcdWNlMjAgXHVkMzI4XHVkMGE0XHVjOWMwXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3NzQgXHVjZWU4XHVkMTUwXHVjZTIwIFx1ZDMyOFx1ZDBhNFx1YzljMFx1Yzc1OCBcdWM4ODVcdWMxOGRcdWMxMzFcdWM3NzQgXHVkNDVjXHVjMmRjXHViNDI5XHViMmM4XHViMmU0Lg0KLWRldGFpbFNlY3Rpb25fbmFtZT1cdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0DQotZGV0YWlsU2VjdGlvbl9kZXNjPVx1Yzc3NCB7MH1cdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWdlbmVyYWxJbmZvU2VjdGlvbl9uYW1lPVx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjQNCi1nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgezB9XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1pY29uU2VjdGlvbl9uYW1lPVx1YzU0NFx1Yzc3NFx1Y2Y1OA0KLWljb25TZWN0aW9uX2Rlc2M9XHVjNzc0IHswfVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNTQ0XHVjNzc0XHVjZjU4XHVjNzQ0IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NThcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotbm90YXRpb25TZWN0aW9uX25hbWU9XHVjODA0XHViMmVjIFx1YzgxNVx1YmNmNA0KLW5vdGF0aW9uU2VjdGlvbl9kZXNjPVx1Yzc3NCB7MH1cdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzgwNFx1YjJlYyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9uYW1lPVx1Y2MzOFx1Yzg3MFx1YjQxYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3Nzg6DQotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzEzOVx1YzE1OFx1YzVkMFx1YjI5NCBcdWM3NzQgXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1YzVkMFx1YzExYyBcdWNjMzhcdWM4NzBcdWQ1NThcdWIyOTQgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzc0IFx1ZDQ1Y1x1YzJkY1x1YjQyOVx1YjJjOFx1YjJlNC4NCi1zdGFmZmluZ1NlY3Rpb25fbmFtZT1cdWM3NzhcdWI4MjUgXHVhZDZjXHVjMTMxIFx1YzgxNVx1YmNmNA0KLXN0YWZmaW5nU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM1ZWRcdWQ1NjBcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3OFx1YjgyNSBcdWFkNmNcdWMxMzEgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1zdGVwc1NlY3Rpb25fbmFtZT1cdWIyZThcdWFjYzQNCi1zdGVwc1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVkMGMwXHVjMmE0XHVkMDZjXHViOTdjIFx1YzIxOFx1ZDU4OVx1ZDU1OFx1YWUzMCBcdWM3MDRcdWQ1NWMgXHViMmU4XHVhY2M0XHViOTdjIFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi10YWlsb3JpbmdTZWN0aW9uX25hbWU9XHVjODcwXHVjODE1DQotdGFpbG9yaW5nU2VjdGlvbl9kZXNjPVx1Yzc3NCB7MH1cdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzg3MFx1YzgxNSBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXZhcmlhYmlsaXR5U2VjdGlvbl9uYW1lPVx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWJjYzBcdWIzZDkNCi12YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdWM3NzQgezB9XHVjNzc0KFx1YWMwMCkgXHViMmU0XHViOTc4IHswfVx1YWNmYyhcdWM2NDApIFx1YWQwMFx1YjgyOFx1YjQxOFx1YjI5NCBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXZlcnNpb25JbmZvU2VjdGlvbl9uYW1lPVx1YmM4NFx1YzgwNCBcdWM4MTVcdWJjZjQNCi12ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgezB9XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jIFVJICYgRWxlbWVudCBBdHRyaWJ1dGUgTGFiZWxzDQotYWRkaXRpb25hbEluZm9fdGV4dD1cdWNkOTRcdWFjMDAgXHVjODE1XHViY2Y0Og0KLWFwcGxpY2F0aW9uX3RleHQ9XHVjNzUxXHVjNmE5XHVkNTA0XHViODVjXHVhZGY4XHViN2E4Og0KLWFjdGlvbkxhYmVsX2VkaXQ9XHVkM2I4XHVjOWQxDQotYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdj1cdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHViY2Y0XHVhZTMwXHVjNWQwIFx1ZDQ1Y1x1YzJkYw0KLWFsdGVybmF0aXZlc190ZXh0PVx1YjMwMFx1YzU0ODoNCi1hc3NpZ25tZW50QXBwcm9hY2hlc190ZXh0PVx1YzljMFx1YzgxNSBcdWM4MTFcdWFkZmMgXHViYzI5XHVjMmRkOg0KLWF1dGhvcnNfdGV4dD1cdWM3OTFcdWMxMzFcdWM3OTA6DQotYmFja2dyb3VuZF90ZXh0PVx1YmMzMFx1YWNiZDoNCi1iYXNlRWxlbWVudF90ZXh0PVx1YWUzMFx1YmNmODoNCi1iYXNlR3VpZGFuY2VfdGV4dD1cdWFlMzBcdWJjZjggXHVjNTQ4XHViMGI0Og0KLWJyaWVmRGVzY3JpcHRpb25fdGV4dD1cdWFjMDRcdWI3YjVcdWQ1NWMgXHVjMTI0XHViYTg1Og0KLWRlc2NyaXB0aW9uX3RleHQ9XHVjMTI0XHViYTg1Og0KLWJhY2t1cGJlZm9yZXNhdmVfdGV4dD1cdWM4MDBcdWM3YTUgXHVjODA0IFx1YmMzMVx1YzVjNQ0KLWJyaWVmT3V0bGluZV90ZXh0PVx1YWMwNFx1YjdiNVx1ZDU1YyBcdWM1NDRcdWM2YzNcdWI3N2NcdWM3Nzg6DQotY2hhbmdlRGF0ZV90ZXh0PVx1YmNjMFx1YWNiZCBcdWIwYTBcdWM5ZGM6DQotY2hhbmdlRGVzY3JpcHRpb25fdGV4dD1cdWJjYzBcdWFjYmQgXHVjMTI0XHViYTg1Og0KLWNoZWNrSXRlbXNfdGV4dD1cdWFjODBcdWMwYWMgXHVkNTZkXHViYWE5DQotY29udHJpYnV0ZXNfdGV4dD1cdWNlZThcdWQyYjhcdWI5YWNcdWJkZjBcdWMxNTgNCi1sb2NhbENvbnRyaWJ1dGVzX3RleHQ9TG9jYWxDb250cmlidXRlcw0KLWNvbnRyaWJ1dGVzX3RvX3RleHQ9XHVjZWU4XHVkMmI4XHViOWFjXHViZGYwXHVjMTU4IFx1YjMwMFx1YzBjMQ0KLWNvcHlyaWdodF90ZXh0PVx1YzgwMFx1Yzc5MVx1YWQ4YzoNCi1lZGl0b3JfdGV4dD1cdWQzYjhcdWM5ZDFcdWFlMzANCi1leHRlbmRzX3RleHQ9XHVkNjU1XHVjN2E1DQotZXh0ZW5kX3RleHQ9XHVkNjU1XHVjN2E1DQotZXh0ZXJuYWxEZXNjcmlwdGlvbl90ZXh0PVx1YzY3OFx1YmQ4MCBcdWMxMjRcdWJhODU6DQotZXh0ZXJuYWxJZF90ZXh0PVx1YzY3OFx1YmQ4MCBJRDoNCi1nb2Fsc190ZXh0PVx1YmFhOVx1YzgwMToNCi1pbXBhY3RPZk5vdEhhdmluZ190ZXh0PVx1YmQ4MFx1YzdhY1x1YzVkMCBcdWI1MzBcdWI5NzggXHVjNjAxXHVkNWE1Og0KLWtleUNvbnNpZGVyYXRpb25zX3RleHQ9XHVkNTc1XHVjMmVjIFx1YWNlMFx1YjgyNFx1YzBhY1x1ZDU2ZDoNCi1sZXZlbHNPZkFkb3B0aW9uX3RleHQ9XHVjYzQ0XHVkMGRkIFx1YjgwOFx1YmNhODoNCi1tYWluRGVzY3JpcHRpb25fdGV4dD1cdWFlMzBcdWJjZjggXHVjMTI0XHViYTg1Og0KLW5ld0VsZW1lbnRfdGV4dD1cdWMwYzggezB9DQotbmFtZV90ZXh0PVx1Yzc3NFx1Yjk4NDoNCi1ub3RBcHBsaWNhYmxlX3RleHQ9XHVkNTc0XHViMmY5IFx1YzBhY1x1ZDU2ZCBcdWM1YzZcdWM3NGMNCi1wYWNrYWdpbmdHdWlkYW5jZV90ZXh0PVx1ZDMyOFx1ZDBhNFx1YzlkNSBcdWM1NDhcdWIwYjQ6DQotcHJlc2VudGF0aW9uTmFtZV90ZXh0PVx1ZDQ1Y1x1YzJkYyBcdWM3NzRcdWI5ODQ6DQotcHJvbXB0Zm9ybGliYXJ5X3RleHQ9XHVjMmRjXHVjNzkxIFx1YzJkYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1ZDUwNFx1Yjg2Y1x1ZDUwNFx1ZDJiOA0KLWVuYWJsZUhlYWx0aENoZWNrX3RleHQ9XHViMGI0XHViZDgwIFx1YjUxNFx1YmM4NFx1YWRmOCBcdWIzYzRcdWFkNmMgXHVjMGFjXHVjNmE5DQotcHJvYmxlbV90ZXh0PVx1YmIzOFx1YzgxY1x1YzgxMDoNCi1wdXJwb3NlX3RleHQ9XHViYWE5XHVjODAxOg0KLXJlYXNvbkZvck5vdE5lZWRpbmdfdGV4dD1cdWQ1NDRcdWM2OTQgXHVjNWM2XHViMjk0IFx1Yzc3NFx1YzcyMDoNCi1yZXBsYWNlc190ZXh0PVx1YmMxNFx1YWZiOFx1YWUzMA0KLWxvY2FsUmVwbGFjZXNfdGV4dD1Mb2NhbFJlcGxhY2VzDQotcmVwcmVzZW50YXRpb25PcHRpb25zX3RleHQ9XHVkNDVjXHVjMmRjIFx1YzYzNVx1YzE1ODoNCi10ZW1wbGF0ZUZpbGVfdGV4dD1cdWQxNWNcdWQ1MGNcdWI5YWNcdWQyYjggXHVkMzBjXHVjNzdjOg0KLXNraWxsc190ZXh0PVx1YzJhNFx1ZDBhYzoNCi1zdGVwc190ZXh0PVx1YjJlOFx1YWNjNDoNCi1zdGVwc19uYW1lX3RleHQ9XHVjNzc0XHViOTg0Og0KLXN0b3BfdGV4dD1cdWM5MTFcdWM5YzANCi1wcmludF90ZXh0PVx1Yzc3OFx1YzFjNA0KLXN5bm9ueW1zX3RleHQ9XHViM2Q5XHVjNzU4XHVjNWI0Og0KLXR5cGVfdGV4dD1cdWM3MjBcdWQ2MTU6DQotY29weV90ZXh0PVx1YmNmNVx1YzBhYw0KLWRlZXBDb3B5X3RleHQ9XHVjODA0XHVjY2I0IFx1YmNmNVx1YzBhYw0KLWJhY2tfdGV4dD1cdWM3NzRcdWM4MDQNCi1uZXdfcGx1Z2luPVx1YzBjOCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4DQotbW92ZT1cdWM3NzRcdWIzZDkuLi4NCi11bmlxdWVJZF90ZXh0PVx1YWNlMFx1YzcyMCBJRDoNCi12YXJpYWJpbGl0eVR5cGVfdGV4dD1cdWJjYzBcdWIzZDkgXHVjNzIwXHVkNjE1Og0KLXZlcnNpb25fdGV4dD1cdWJjODRcdWM4MDQ6DQotDQotIyBCdXR0b24gTGFiZWxzDQotYWRkQnV0dG9uX3RleHQ9XHVjZDk0XHVhYzAwLi4uDQotYXR0YWNoQnV0dG9uX3RleHQ9XHVjY2E4XHViZDgwLi4uDQotYnJvd3NlQnV0dG9uX3RleHQ9XHVjYzNlXHVjNTQ0XHViY2Y0XHVhZTMwLi4uDQotY2hhbmdlVHlwZUJ1dHRvbl90ZXh0PVx1YmNjMFx1YWNiZCBcdWM3MjBcdWQ2MTUuLi4NCi1jbGVhckJ1dHRvbl90ZXh0PVx1YzljMFx1YzZiMFx1YWUzMA0KLWRlbGV0ZUJ1dHRvbl90ZXh0PVx1YzBhZFx1YzgxYw0KLWRldGFjaEJ1dHRvbl90ZXh0PVx1YmQ4NFx1YjlhYw0KLWRpYWdyYW1fc2F2ZUVycm9yPVx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOCBcdWM4MDBcdWM3YTUgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OCBcdWJjMWNcdWMwZGQNCi1kb3duQnV0dG9uX3RleHQ9XHVjNTQ0XHViNzk4XHViODVjDQotZGlyZWN0b3J5X3RleHQ9XHViNTE0XHViODA5XHVkMWEwXHViOWFjOg0KLW9yZGVyQnV0dG9uX3RleHQ9XHVjMjFjXHVjMTFjIFx1YzljMFx1YzgxNQ0KLWVkaXRCdXR0b25fdGV4dD1cdWQzYjhcdWM5ZDEuLi4NCi1yZW1vdmVCdXR0b25fdGV4dD1cdWM4MWNcdWFjNzANCi1yZW5hbWVBY3Rpb25fdGV4dD1cdWM3NzRcdWI5ODQgXHViYzE0XHVhZmI4XHVhZTMwLi4uDQotcmVtb3ZlX3RleHQ9XHVjODFjXHVhYzcwDQotcmVuYW1lX3RleHQ9XHVjNzc0XHViOTg0IFx1YmMxNFx1YWZiOFx1YWUzMA0KLVNhdmVBc190ZXh0PVx1YjJlNFx1Yjk3OCBcdWM3NzRcdWI5ODRcdWM3M2NcdWI4NWMgXHVjODAwXHVjN2E1DQotc2VsZWN0QnV0dG9uX3RleHQ9XHVjMTIwXHVkMGRkLi4uDQotZGVzZWxlY3RCdXR0b25fdGV4dD1cdWMxMjBcdWQwZGQgXHVjZGU4XHVjMThjDQotdXBCdXR0b25fdGV4dD1cdWM3MDRcdWI4NWMNCi1tYWtlRGVmYXVsdEJ1dHRvbl90ZXh0PVx1YWUzMFx1YmNmOFx1YWMxMlx1YzczY1x1Yjg1YyBcdWMxMjRcdWM4MTUNCi12aWV3SGlzdG9yeUJ1dHRvbl90ZXh0PVx1ZDc4OFx1YzJhNFx1ZDFhMFx1YjlhYyBcdWJjZjRcdWFlMzAuLi4NCi0NCi0jIFJvbGUgRWRpdG9yIFRhc2tzIFBhZ2UNCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25OYW1lPVx1ZDBjMFx1YzJhNFx1ZDA2Yw0KLXJvbGVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWM1ZWRcdWQ1NjBcdWM3NDAgXHViMmU0XHVjNzRjIFx1ZDBjMFx1YzJhNFx1ZDA2Y1x1Yzc1OCBcdWMyMThcdWQ1ODlcdWM3OTBcdWM3ODVcdWIyYzhcdWIyZTQuDQotcm9sZVRhc2tzUGFnZV9hdmFpbGFibGVMYWJlbD1cdWMwYWNcdWM2YTkgXHVhYzAwXHViMmE1XHVkNTVjIFx1ZDBjMFx1YzJhNFx1ZDA2Yw0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWFlMzBcdWJjZjggXHVjMjE4XHVkNTg5XHVjNzkwOg0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHVjZDk0XHVhYzAwIFx1YzIxOFx1ZDU4OVx1Yzc5MDoNCi1yb2xlVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9XHVhYzFjIFx1ZDBjMFx1YzJhNFx1ZDA2Y1x1YWMwMCBcdWMxMjBcdWQwZGRcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotIyBSb2xlIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjOg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVjNWVkXHVkNTYwXHVjNzc0IFx1Y2M0NVx1Yzc4NFx1YzljMFx1YjI5NCBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjXHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1cdWMwYWNcdWM2YTkgXHVhYzAwXHViMmE1XHVkNTVjIFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2M6DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWNjNDVcdWM3ODQgXHVjMGFjXHVkNTZkOg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1Yzc3NCBcdWM1ZWRcdWQ1NjBcdWM3NzQgXHVjMjE4XHVkNTg5XHVkNTU4XHViMjk0IFx1ZDBjMFx1YzJhNFx1ZDA2Y1x1Yzc1OCBcdWMwYjBcdWNkOWNcdWJiM2NcdWM3NzggXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYzoNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfVx1YWMxYyBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjXHVjNzc0IFx1YzEyMFx1ZDBkZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIFJvbGUgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi1yb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPVx1YzU0OFx1YjBiNA0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1YzU0OFx1YjBiNCBcdWQ2MTVcdWMyZGRcdWM3M2NcdWI4NWMgXHVjZDk0XHVhYzAwIFx1YzgxNVx1YmNmNFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHViOWMxXHVkMDZjXHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yb2xlR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPVx1YzBhY1x1YzZhOSBcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjNTQ4XHViMGI0Og0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWM1NDhcdWIwYjQ6DQotcm9sZUd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfVx1YWMxYyBcdWM1NDhcdWIwYjRcdWFjMDAgXHVjMTIwXHVkMGRkXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLSMgUm9sZSBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPVx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYzoNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWM1ZWRcdWQ1NjBcdWM3NzQgXHVjMThkXHVkNTU4XHViMjk0IFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhY1x1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjg6DQotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1cdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMgXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1ODoNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWM1ZWRcdWQ1NjAgXHVjMTM4XHVkMmI4Og0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1cdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMgXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1ODoNCi0NCi0jIFRhc2sgRWRpdG9yIFJvbGVzIFBhZ2UNCi10YXNrUm9sZXNQYWdlX3NlY3Rpb25OYW1lPVx1YzVlZFx1ZDU2MA0KLXRhc2tSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWQwYzBcdWMyYTRcdWQwNmNcdWI5N2MgXHVjMjE4XHVkNTg5XHVkNTYwIFx1YzVlZFx1ZDU2MFx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdGFza1JvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdWMwYWNcdWM2YTkgXHVhYzAwXHViMmE1XHVkNTVjIFx1YzVlZFx1ZDU2MDoNCi10YXNrUm9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHVhZTMwXHViY2Y4IFx1YzIxOFx1ZDU4OVx1Yzc5MDoNCi10YXNrUm9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1Y2Q5NFx1YWMwMCBcdWMyMThcdWQ1ODlcdWM3OTA6DQotdGFza1JvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfVx1YWMxYyBcdWM1ZWRcdWQ1NjBcdWM3NzQgXHVjMTIwXHVkMGRkXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0Lg0KLXRhc2tSb2xlc1BhZ2VfcHJpbWFyeVBlcmZvcm1lcl9tb2RpZnlfbWVzc2FnZT1JVVBBMDAwNDVXOiBcdWFlMzBcdWJjZjggXHVjMjE4XHVkNTg5XHVjNzkwXHViOTdjICcnezB9JycoXHVjNzNjKVx1Yjg1YyBcdWJjMTRcdWFmYjhcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotdGFza1JvbGVzUGFnZV9jb25maXJtX3RpdGxlPVx1YWUzMFx1YmNmOCBcdWM1ZWRcdWQ1NjAgXHViY2MwXHVhY2JkIFx1ZDY1NVx1Yzc3OA0KLQ0KLSMgVGFzayBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYw0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVkMGMwXHVjMmE0XHVkMDZjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3ODVcdWI4MjUgXHViYzBmIFx1Y2Q5Y1x1YjgyNSBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjXHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1cdWMwYWNcdWM2YTkgXHVhYzAwXHViMmE1XHVkNTVjIFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVx1ZDU0NFx1YzIxOCBcdWM3ODVcdWI4MjU6DQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHVjMTIwXHVkMGRkXHVjODAxIFx1Yzc4NVx1YjgyNToNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMz1cdWNkOWNcdWI4MjU6DQotdGFza1dvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH1cdWFjMWMgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzY1x1Yzc3NCBcdWMxMjBcdWQwZGRcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotIyBUYXNrIEVkaXRvciBHdWlkYW5jZSBQYWdlDQotdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1cdWM1NDhcdWIwYjQNCi10YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdWM1NDhcdWIwYjQgXHVkNjE1XHVjMmRkXHVjNzNjXHViODVjIFx1Y2Q5NFx1YWMwMCBcdWM4MTVcdWJjZjRcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YjljMVx1ZDA2Y1x1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdGFza0d1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1cdWMwYWNcdWM2YTkgXHVhYzAwXHViMmE1XHVkNTVjIFx1YzU0OFx1YjBiNDoNCi10YXNrR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9XHVjNTQ4XHViMGI0Og0KLXRhc2tHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH1cdWFjMWMgXHVjNTQ4XHViMGI0XHVhYzAwIFx1YzEyMFx1ZDBkZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIFRhc2sgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQ0KLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1cdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWQwYzBcdWMyYTRcdWQwNmNcdWFjMDAgXHVjMThkXHVkNTU4XHViMjk0IFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhY1x1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdGFza0NhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1YzZkMFx1Y2U1OQ0KLXRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9XHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OCBcdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWM2ZDBcdWNlNTk6DQotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYyBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4Og0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBUYXNrcyBQYWdlDQotV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbk5hbWU9XHVkMGMwXHVjMmE0XHVkMDZjDQotV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjXHVjNzQwIFx1YjJlNFx1Yzc0YyBcdWQwYzBcdWMyYTRcdWQwNmNcdWM3NTggXHVjNzg1XHViODI1IFx1YjYxMFx1YjI5NCBcdWNkOWNcdWI4MjVcdWM3ODVcdWIyYzhcdWIyZTQuDQotV29ya1Byb2R1Y3RfVGFza3NfQXZhaWxhYmxlTGFiZWw9XHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWQwYzBcdWMyYTRcdWQwNmMNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsPVx1ZDU0NFx1YzIxOCBcdWM3ODVcdWI4MjU6DQotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDI9XHVjMTIwXHVkMGRkXHVjODAxIFx1Yzc4NVx1YjgyNToNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMz1cdWNkOWNcdWI4MjU6DQotV29ya1Byb2R1Y3RfVGFza3NfTXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH1cdWFjMWMgXHVkMGMwXHVjMmE0XHVkMDZjXHVhYzAwIFx1YzEyMFx1ZDBkZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgUm9sZXMgUGFnZQ0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25OYW1lPVx1YzVlZFx1ZDU2MA0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdWIyZTRcdWM3NGMgXHVjNWVkXHVkNTYwXHVjNWQwXHVjMTFjIFx1Yzc3NCBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjXHVjNWQwIFx1YjMwMFx1ZDU3NCBcdWNjNDVcdWM3ODRcdWM3NDQgXHVjOWMwXHVhYzcwXHViMDk4IFx1YzIxOFx1YzgxNVx1ZDU2MCBcdWMyMTggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0Lg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1YzBhY1x1YzZhOSBcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjNWVkXHVkNTYwDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWNjNDVcdWM3ODRcdWM3NDQgXHViOWUxXHVjNzQwIFx1YzVlZFx1ZDU2MDoNCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsMj1cdWMyMThcdWM4MTUgXHVhZDhjXHVkNTVjXHVjNzc0IFx1Yzc4OFx1YjI5NCBcdWM1ZWRcdWQ1NjA6DQotd29ya1Byb2R1Y3RSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH1cdWFjMWMgXHVjNWVkXHVkNTYwXHVjNzc0IFx1YzEyMFx1ZDBkZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIyBXb3JrIFByb2R1Y3QgRWRpdG9yIERlbGl2ZXJhYmxlIFBhcnRzIFBhZ2UNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25OYW1lPVx1Yzc3OFx1YjNjNFx1YmIzYyBcdWQzMGNcdWQyYjgNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVjNzc4XHViM2M0XHViYjNjXHVjNzQ0IFx1YWQ2Y1x1YzEzMVx1ZDU1OFx1YjI5NCBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjXHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1Yzc3OFx1YjNjNFx1YmIzYyBcdWQzMGNcdWQyYjhcdWI4NWMgXHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjOg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWM3NzhcdWIzYzRcdWJiM2MgXHVkMzBjXHVkMmI4XHVjNzc4IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2M6DQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfVx1YWMxYyBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjXHVjNzc0IFx1YzEyMFx1ZDBkZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPVx1YzU0OFx1YjBiNA0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdWM1NDhcdWIwYjQgXHVkNjE1XHVjMmRkXHVjNzNjXHViODVjIFx1Y2Q5NFx1YWMwMCBcdWM4MTVcdWJjZjRcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YjljMVx1ZDA2Y1x1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9XHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWM1NDhcdWIwYjQ6DQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWM1NDhcdWIwYjQ6DQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH1cdWFjMWMgXHVjNTQ4XHViMGI0XHVhYzAwIFx1YzEyMFx1ZDBkZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1cdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzY1x1Yzc3NCBcdWMxOGRcdWQ1NThcdWIyOTQgXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjXHViOTdjIFx1YWQwMFx1YjlhY1x1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1YjNjNFx1YmE1NFx1Yzc3OA0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjNzIwXHVkNjE1Og0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwzPVx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYyBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4Og0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWIzYzRcdWJhNTRcdWM3Nzg6DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1YzcyMFx1ZDYxNToNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwzPVx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYyBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4Og0KLQ0KLSMgUHJhY3RpY2UgRWRpdG9yIFJlZmVyZW5jZXMgUGFnZQ0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VjdGlvbk5hbWU9XHVjZWU4XHVkMTUwXHVjZTIwIFx1YzY5NFx1YzE4Yw0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWMwYWNcdWI4NDBcdWI4NWMgXHVjYzM4XHVjODcwXHViNDE4XHViMjk0IFx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWM2OTRcdWMxOGNcdWI5N2MgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWNlZThcdWQxNTBcdWNlMjAgXHVjNjk0XHVjMThjOg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWNlZThcdWQxNTBcdWNlMjAgXHVjNjk0XHVjMThjOg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH1cdWFjMWMgXHVjZWU4XHVkMTUwXHVjZTIwIFx1YzY5NFx1YzE4Y1x1YWMwMCBcdWMxMjBcdWQwZGRcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotIyBDYXRlZ29yeSBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uTmFtZT1cdWM1NDhcdWIwYjQNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCB7MH1cdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1YzU0OFx1YjBiNFx1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1YzBhY1x1YzZhOSBcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjNTQ4XHViMGI0Og0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsPVx1YzU0OFx1YjBiNDoNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH1cdWFjMWMgXHVjNTQ4XHViMGI0XHVhYzAwIFx1YzEyMFx1ZDBkZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIERpc2NpcGxpbmUgR3JvdXBpbmcgRWRpdG9yIERpc2NpcGxpbmVzIFBhZ2UNCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbk5hbWU9XHVjNmQwXHVjZTU5DQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVjNmQwXHVjZTU5IFx1YWRmOFx1YjhmOVx1YzVkMCBcdWMxOGRcdWQ1NThcdWIyOTQgXHVjNmQwXHVjZTU5XHVjNzQ0IFx1YWQwMFx1YjlhY1x1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWM2ZDBcdWNlNTk6DQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHVjNmQwXHVjZTU5Og0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfVx1YWMxYyBcdWM2ZDBcdWNlNTlcdWM3NzQgXHVjMTIwXHVkMGRkXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0Lg0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfVXNlRGVmYXVsdERpcmVjdG9yeUJ1dHRvbkxhYmVsPVx1YWUzMFx1YmNmOCBcdWI1MTRcdWI4MDlcdWQxYTBcdWI5YWMgXHVjMGFjXHVjNmE5DQotDQotIyBEaXNjaXBsaW5lIEVkaXRvciBUYXNrcyBQYWdlDQotZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uTmFtZT1cdWQwYzBcdWMyYTRcdWQwNmMNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVjNmQwXHVjZTU5XHVjNWQwIFx1YzE4ZFx1ZDU1OFx1YjI5NCBcdWQwYzBcdWMyYTRcdWQwNmNcdWI5N2MgXHVhZDAwXHViOWFjXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWRpc2NpcGxpbmVUYXNrc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWQwYzBcdWMyYTRcdWQwNmM6DQotZGlzY2lwbGluZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsPVx1ZDBjMFx1YzJhNFx1ZDA2YzoNCi1kaXNjaXBsaW5lVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9XHVhYzFjIFx1ZDBjMFx1YzJhNFx1ZDA2Y1x1YWMwMCBcdWMxMjBcdWQwZGRcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotIyBEaXNjaXBsaW5lIEVkaXRvciBSZWZlcmVuY2UgV29ya2Zsb3cgUGFnZQ0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbk5hbWU9XHVjYzM4XHVjODcwIFx1YzZjY1x1ZDA2Y1x1ZDUwY1x1Yjg1Y1x1YzZiMA0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWM2ZDBcdWNlNTlcdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1Y2MzOFx1Yzg3MCBcdWM2Y2NcdWQwNmNcdWQ1MGNcdWI4NWNcdWM2YjBcdWI5N2MgXHVhZDAwXHViOWFjXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWNjMzhcdWM4NzAgXHVjNmNjXHVkMDZjXHVkNTBjXHViODVjXHVjNmIwOg0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWNjMzhcdWM4NzAgXHVjNmNjXHVkMDZjXHVkNTBjXHViODVjXHVjNmIwOg0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH1cdWFjMWMgXHVjYzM4XHVjODcwIFx1YzZjY1x1ZDA2Y1x1ZDUwY1x1Yjg1Y1x1YzZiMFx1YWMwMCBcdWMxMjBcdWQwZGRcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotIyBEb21haW4gRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYw0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWIzYzRcdWJhNTRcdWM3NzhcdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2NcdWM3NDQgXHVhZDAwXHViOWFjXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjOg0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjOg0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH1cdWFjMWMgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzY1x1Yzc3NCBcdWMxMjBcdWQwZGRcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotIyBXb3JrIFByb2R1Y3QgS2luZCBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHVjNzc0IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjNzIwXHVkNjE1XHVjNWQwIFx1YzE4ZFx1ZDU1OFx1YjI5NCBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjXHVjNzQ0IFx1YWQwMFx1YjlhY1x1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1YzBhY1x1YzZhOSBcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYzoNCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYzoNCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9XHVhYzFjIFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2NcdWM3NzQgXHVjMTIwXHVkMGRkXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLSMgUm9sZSBTZXQgR3JvdXBpbmcgRWRpdG9yIFJvbGUgU2V0cyBQYWdlDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25OYW1lPVx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjgNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWM1ZWRcdWQ1NjAgXHVjMTM4XHVkMmI4IFx1YWRmOFx1YjhmOVx1YzVkMCBcdWMxOGRcdWQ1NThcdWIyOTQgXHVjNWVkXHVkNTYwIFx1YzEzOFx1ZDJiOFx1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1YzBhY1x1YzZhOSBcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjNWVkXHVkNTYwIFx1YzEzOFx1ZDJiODoNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWM1ZWRcdWQ1NjAgXHVjMTM4XHVkMmI4Og0KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfVx1YWMxYyBcdWM1ZWRcdWQ1NjAgXHVjMTM4XHVkMmI4XHVhYzAwIFx1YzEyMFx1ZDBkZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIFJvbGUgU2V0IEVkaXRvciBSb2xlcyBQYWdlDQotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uTmFtZT1cdWM1ZWRcdWQ1NjANCi1yb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVjNWVkXHVkNTYwIFx1YzEzOFx1ZDJiOFx1YzVkMCBcdWMxOGRcdWQ1NThcdWIyOTQgXHVjNWVkXHVkNTYwXHVjNzQ0IFx1YWQwMFx1YjlhY1x1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yb2xlU2V0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1YzBhY1x1YzZhOSBcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjNWVkXHVkNTYwOg0KLXJvbGVTZXRSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWM1ZWRcdWQ1NjA6DQotcm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfVx1YWMxYyBcdWM1ZWRcdWQ1NjBcdWM3NzQgXHVjMTIwXHVkMGRkXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLSMgVG9vbCBFZGl0b3IgVG9vbCBNZW50b3JzIFBhZ2UNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25OYW1lPVx1YjNjNFx1YWQ2YyBcdWMwYWNcdWM2YTkgXHViM2M0XHVjNmMwXHViOWQwDQotdG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHVjNzc0IFx1YjNjNFx1YWQ2Y1x1YzVkMCBcdWMxOGRcdWQ1NThcdWIyOTQgXHViM2M0XHVhZDZjIFx1YzBhY1x1YzZhOSBcdWIzYzRcdWM2YzBcdWI5ZDBcdWM3NDQgXHVhZDAwXHViOWFjXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXRvb2xUb29sTWVudG9yc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWIzYzRcdWFkNmMgXHVjMGFjXHVjNmE5IFx1YjNjNFx1YzZjMFx1YjlkMDoNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlbGVjdGVkTGFiZWw9XHViM2M0XHVhZDZjIFx1YzBhY1x1YzZhOSBcdWIzYzRcdWM2YzBcdWI5ZDA6DQotdG9vbFRvb2xNZW50b3JzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfVx1YWMxYyBcdWIzYzRcdWFkNmMgXHVjMGFjXHVjNmE5IFx1YjNjNFx1YzZjMFx1YjlkMFx1Yzc3NCBcdWMxMjBcdWQwZGRcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotIyBDdXN0b20gQ2F0ZWdvcnkgRWRpdG9yIEFzc2lnbiBQYWdlDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25OYW1lPVx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWM2OTRcdWMxOGMNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4IFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhY1x1Yjk3YyBcdWFkNmNcdWMxMzFcdWQ1NThcdWIyOTQgXHVjZWU4XHVkMTUwXHVjZTIwIFx1YzY5NFx1YzE4Y1x1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX2F2YWlsYWJsZUxhYmVsPVx1YzBhY1x1YzZhOSBcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjZWU4XHVkMTUwXHVjZTIwIFx1YzY5NFx1YzE4YzoNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VsZWN0ZWRMYWJlbD1cdWNlZThcdWQxNTBcdWNlMjAgXHVjNjk0XHVjMThjOg0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfVx1YWMxYyBcdWNlZThcdWQxNTBcdWNlMjAgXHVjNjk0XHVjMThjXHVhYzAwIFx1YzEyMFx1ZDBkZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIE5ldyBNZXRob2QgUGx1Zy1pbiBXaXphcmQNCi1uZXdQbHVnaW5XaXphcmRfdGl0bGU9XHVjMGM4IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzgNCi1uZXdQbHVnaW5XaXphcmRQYWdlX3RpdGxlPVx1YzBjOCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4IFx1Yzc5MVx1YzEzMQ0KLW5ld1BsdWdpbldpemFyZFBhZ2VfdGV4dD1cdWMwYzggXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzc0XHViOTg0XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YWNlMCBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1uZXdQbHVnaW5FcnJvcl9tc2c9SVVQQTAwMjFFOiBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzQ0IFx1Yzc5MVx1YzEzMVx1ZDU1OFx1YzljMCBcdWJhYmJcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotbmV3UGx1Z2luRXJyb3JfcmVhc29uPVx1YjBiNFx1YmQ4MCBcdWM2MjRcdWI5NTggXG5cDQotXG5cDQotXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWJjZjRcdWI4MjRcdWJhNzQgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkXHVjNzQ0IFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jIEdlbmVyaWMgZGlhbG9nIHRpdGxlcw0KLWNyZWF0ZURpYWxvZ190aXRsZT1cdWM2OTRcdWMxOGMgXHVjNzkxXHVjMTMxDQotZGVsZXRlRGlhbG9nX3RpdGxlPVx1YzY5NFx1YzE4YyBcdWMwYWRcdWM4MWMNCi1lZGl0RGlhbG9nX3RpdGxlPVx1YzY5NFx1YzE4YyBcdWQzYjhcdWM5ZDENCi1lcnJvckRpYWxvZ190aXRsZT1cdWM2MjRcdWI5NTgNCi1tb3ZlRGlhbG9nX3RpdGxlPVx1YzY5NFx1YzE4YyBcdWM3NzRcdWIzZDkNCi1yZW5hbWVEaWFsb2dfdGl0bGU9XHVjNjk0XHVjMThjIFx1Yzc3NFx1Yjk4NCBcdWJjMTRcdWFmYjhcdWFlMzANCi13YXJuaW5nRGlhbG9nX3RpdGxlPVx1YWNiZFx1YWNlMA0KLQ0KLSMgQWRkIENvbmZpZ3VyYXRpb24gdG8gUHJvY2VzcyBFcnJvciBEaWFsb2cNCi1hZGRDb25maWdFcnJvckRpYWxvZ190aXRsZT1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTRcdWM1ZDAgXHVhZDZjXHVjMTMxIFx1Y2Q5NFx1YWMwMA0KLQ0KLSMgU2V0IERlZmF1bHQgQ29uZmlndXJhdGlvbiBFcnJvciBEaWFsb2cNCi1zZXREZWZhdWx0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9XHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWFlMzBcdWJjZjggXHVhZDZjXHVjMTMxIFx1YzEyNFx1YzgxNQ0KLQ0KLSMgRWRpdCBQcm9jZXNzIEVycm9yIERpYWxvZw0KLWVkaXRQcm9jZXNzRWxlbWVudEVycm9yRGlhbG9nX3RpdGxlPVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWM2OTRcdWMxOGMgXHVkM2I4XHVjOWQxDQotDQotIyBPcGVuIExpYnJhcnkgRGlhbG9nDQotb3BlbkxpYnJhcnlEaWFsb2dfdGl0bGU9XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWM1ZjRcdWFlMzANCi1vcGVuTGlicmFyeURpYWxvZ190ZXh0PVx1ZDYwNFx1YzdhYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVhYzAwIFx1YzgxY1x1YjMwMFx1Yjg1YyBcdWM4MDBcdWM3YTVcdWI0MThcdWM5YzAgXHVjNTRhXHVjNTU4XHVjMmI1XHViMmM4XHViMmU0LiBcdWM2MjRcdWI5NThcdWI5N2MgXHViYjM0XHVjMmRjXHVkNTU4XHVhY2UwIFx1YWNjNFx1YzE4ZFx1ZDU3NFx1YzExYyBcdWIyZTRcdWI5NzggXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzVlY1x1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8NCi0NCi0jIFNhdmUgTGlicmFyeSBEaWFsb2cNCi1zYXZlTGlicmFyeURpYWxvZ190aXRsZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YzgwMFx1YzdhNQ0KLXNhdmVMaWJyYXJ5RGlhbG9nX3RleHQ9XHVkNjA0XHVjN2FjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWFjMDAgXHVjMjE4XHVjODE1XHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0LiBcdWJjYzBcdWFjYmRcdWMwYWNcdWQ1NmRcdWM3NDQgXHVjODAwXHVjN2E1XHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVjNWM1XHVhZGY4XHViODA4XHVjNzc0XHViNGRjDQotDQotIyBEZWxldGUgRWxlbWVudCBSZWZlcmVuY2UgRGlhbG9nDQotZGVsZXRlQXNzb2NpYXRpb25EaWFsb2dfdGV4dD0nJ3swfScnIFx1YzY5NFx1YzE4Y1x1YWMwMCBcdWM3NzRcdWJiZjggXHVjMGFkXHVjODFjXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0LiBcdWM3NzRcdWI5N2MgJyd7MX0nJ1x1YzVkMFx1YzExYyBcdWM4MWNcdWFjNzBcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotDQotIyBFcnJvciBNZXNzYWdlcw0KLW5vT3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDBFOiBcdWM1ZjRcdWI4MjQgXHVjNzg4XHViMjk0IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWFjMDAgXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LlxuXA0KLVxuXA0KLVx1YzBjOCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNjk0XHVjMThjXHViOTdjIFx1Y2Q5NFx1YWMwMFx1ZDU1OFx1YjgyNFx1YmE3NCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzVmNFx1YzViNFx1YzU3YyBcdWQ1NjlcdWIyYzhcdWIyZTQuXG5cDQotXG5cDQotXHVjMGM4IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHVjNzkxXHVjMTMxXHVkNTU4XHVhYzcwXHViMDk4IFx1YWUzMFx1Yzg3NCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzVmNFx1YWNlMCBcdWIyZTRcdWMyZGMgXHVjMmRjXHViM2M0XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDFFOiB7MH0gXHVjNzc0XHViOTg0XHVjNzc0IFx1YjIwNFx1Yjc3ZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC5cblwNCi1cblwNCi1cdWJhYThcdWI0ZTAgXHViYTU0XHVjMThjXHViNGRjIFx1YmMwZiBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVjNjk0XHVjMThjXHVjNWQwXHViMjk0IFx1Yzc3NFx1Yjk4NFx1Yzc3NCBcdWM3ODhcdWM1YjRcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0LlxuXA0KLVxuXA0KLVx1ZDY1NVx1Yzc3OFx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWFjZTAgXHVjNjk0XHVjMThjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM2MmNcdWJjMTRcdWI5NzggXHVjNzc0XHViOTg0XHVjNzQ0IFx1Yzc4NVx1YjgyNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZz1JVVBBMDAwMkU6IFx1Yzc3NFx1Yjk4NFx1Yzc3NCAnJ3swfScnXHVjNzc4IFx1ZDU2ZFx1YmFhOVx1Yzc3NCBcdWM3NzRcdWJiZjggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LlxuXA0KLVxuXA0KLVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWM2OTRcdWMxOGNcdWM1ZDAgXHVhY2UwXHVjNzIwXHVkNTVjIFx1Yzc3NFx1Yjk4NFx1Yzc3NCBcdWM3ODhcdWM1YjRcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0LlxuXA0KLVxuXA0KLVx1ZDY1NVx1Yzc3OFx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWFjZTAgXHVjNjk0XHVjMThjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWIyZTRcdWI5NzggXHVjNzc0XHViOTg0XHVjNzQ0IFx1Yzc4NVx1YjgyNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1jcmVhdGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDNFOiBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1Yzc5MVx1YzEzMVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWRlbGV0ZUNvbmZpZ0Vycm9yX21zZz1JVVBBMDAwNFc6IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzFcdWM3NDQgXHVjMGFkXHVjODFjXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotaW50ZXJuYWxFcnJvcl9tc2c9SVVQQTAwMDVFOiBcdWIwYjRcdWJkODAgXHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC5cblwNCi1cblwNCi1cdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YmNmNFx1YjgyNFx1YmE3NCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmRcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWludmFsaWRQcmVzZW50YXRpb25OYW1lRXJyb3JfbXNnPUlVUEEwMDA2RTogXHVjOWMwXHVjODE1XHVkNTVjIFx1ZDQ1Y1x1YzJkYyBcdWM3NzRcdWI5ODRcdWM3NzQgXHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC5cblwNCi1cblwNCi1cdWQ2NTVcdWM3NzhcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVhY2UwIFx1YjJlNFx1Yjk3OCBcdWM3NzRcdWI5ODRcdWM3NDQgXHVjNzg1XHViODI1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWludmFsaWRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDdFOiBcdWMxMjBcdWQwZGRcdWQ1NWMgXHViYTU0XHVjMThjXHViNGRjIFx1YWQ2Y1x1YzEzMSAnJ3swfScnXHVjNzc0KFx1YWMwMCkgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1YWUzMFx1YmNmOCBcdWFkNmNcdWMxMzFcdWM3NTggXHVjMTFjXHViZTBjXHVjMTM4XHVkMmI4XHVhYzAwIFx1YzU0NFx1YjJkOVx1YjJjOFx1YjJlNC5cblwNCi1cblwNCi1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTRcdWM3NTggXHViYjM0XHVhY2IwXHVjMTMxXHVjNzQ0IFx1YzcyMFx1YzljMFx1ZDU1OFx1YjgyNFx1YmE3NCBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTRcdWM3NTggXHVhZTMwXHViY2Y4IFx1YWQ2Y1x1YzEzMVx1Yzc3NCBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTRcdWM2NDAgXHVjNWYwXHVhZDAwXHViNDFjIFx1YjJlNFx1Yjk3OCBcdWJhYThcdWI0ZTAgXHVhZDZjXHVjMTMxXHVjNzU4IFx1YzBjMVx1YzcwNCBcdWMxMzhcdWQyYjhcdWM1ZWNcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0LlxuXA0KLVxuXA0KLVx1YjJlNFx1Yjk3OCBcdWFkNmNcdWMxMzFcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVhYzcwXHViMDk4IFx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWFkNmNcdWMxMzFcdWM3NTggXHVjZWU4XHVkMTUwXHVjZTIwXHViOTdjIFx1ZDNlY1x1ZDU2OFx1ZDU1OFx1YjNjNFx1Yjg1ZCBcdWFlMzBcdWJjZjggXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YzIxOFx1YzgxNVx1ZDU1OFx1YWNlMCBcdWIyZTRcdWMyZGMgXHVjMmRjXHViM2M0XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXNldERlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDhFOiBcdWMxMjBcdWQwZGRcdWQ1NWMgXHViYTU0XHVjMThjXHViNGRjIFx1YWQ2Y1x1YzEzMSAnJ3swfScnXHVjNzc0KFx1YWMwMCkgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHVjNWQwXHVjMTFjIFx1Y2MzOFx1Yzg3MFx1ZDU1OFx1YjI5NCBcdWIyZTRcdWI5NzggXHVhZDZjXHVjMTMxXHVjNzU4IFx1YzBjMVx1YzcwNCBcdWMxMzhcdWQyYjhcdWFjMDAgXHVjNTQ0XHViMmQ5XHViMmM4XHViMmU0LlxuXA0KLVxuXA0KLVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1Yzc1OCBcdWJiMzRcdWFjYjBcdWMxMzFcdWM3NDQgXHVjNzIwXHVjOWMwXHVkNTU4XHViODI0XHViYTc0IFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1Yzc1OCBcdWFlMzBcdWJjZjggXHVhZDZjXHVjMTMxXHVjNzc0IFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1YzY0MCBcdWM1ZjBcdWFkMDBcdWI0MWMgXHViMmU0XHViOTc4IFx1YmFhOFx1YjRlMCBcdWFkNmNcdWMxMzFcdWM3NTggXHVjMGMxXHVjNzA0IFx1YzEzOFx1ZDJiOFx1YzVlY1x1YzU3YyBcdWQ1NjlcdWIyYzhcdWIyZTQuXG5cDQotXG5cDQotXHViMmU0XHViOTc4IFx1YWQ2Y1x1YzEzMVx1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWFjNzBcdWIwOTggXHVjMTIwXHVkMGRkXHVkNTVjIFx1YWQ2Y1x1YzEzMVx1Yzc1OCBcdWNlZThcdWQxNTBcdWNlMjBcdWI5N2MgXHVjMjE4XHVjODE1XHVkNTU4XHVhY2UwIFx1YjJlNFx1YzJkYyBcdWMyZGNcdWIzYzRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotb3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDlFOiBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1Yjg1Y1x1YjRkY1x1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LlxuXA0KLVxuXA0KLVx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHViY2Y0XHViODI0XHViYTc0IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotc2F2ZUxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTBFOiBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzgwMFx1YzdhNVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXNhdmVMaWJyYXJ5VG9FcnJvcl9tc2c9SVVQQTAwMTBFOiBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjICcnezB9JycoXHVjNzNjKVx1Yjg1YyBcdWM4MDBcdWM3YTVcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1lbGVtZW50QWxyZWFkeURlbGV0ZWRFcnJvcl9tc2c9SVVQQTAwMTFFOiAnJ3swfScnIFx1YzY5NFx1YzE4Y1x1YWMwMCBcdWM3NzRcdWJiZjggXHVjMGFkXHVjODFjXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0Lg0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEyRTogXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWM1YzVcdWFkZjhcdWI4MDhcdWM3NzRcdWI0ZGNcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249SVVQQTAwMTZFOiBcdWM2MjRcdWI5NThcdWFjMDAgXHViYzFjXHVjMGRkXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0LlxuXA0KLVxuXA0KLVx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHViY2Y0XHViODI0XHViYTc0IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotaW50ZXJuYWxFcnJvcl9yZWFzb249SVVQQTAwMTdFOiBcdWIwYjRcdWJkODAgXHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC5cblwNCi1cblwNCi1cdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YmNmNFx1YjgyNFx1YmE3NCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmRcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfcmVhc29uPUlVUEEwMDE4RTogXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWM2OTRcdWMxOGNcdWI5N2MgXHViODVjXHViNGRjXHVkNTU4XHViMjk0IFx1YzkxMVx1YzVkMCBcdWM2MjRcdWI5NThcdWFjMDAgXHViYzFjXHVjMGRkXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0LlxuXA0KLVxuXA0KLVx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHViY2Y0XHViODI0XHViYTc0IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotc2F2ZVVwZ3JhZGVkTGlicmFyeUVycm9yX3JlYXNvbj1JVVBBMDAxOUU6IFx1YzVjNVx1YWRmOFx1YjgwOFx1Yzc3NFx1YjRkY1x1YjQxYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzgwMFx1YzdhNVx1ZDU1OFx1YjI5NCBcdWM5MTFcdWM1ZDAgXHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC5cblwNCi1cblwNCi1cdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YmNmNFx1YjgyNFx1YmE3NCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmRcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1vcGVuaW5nTGlicmFyeVRhc2tfbmFtZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzVlY1x1YjI5NCBcdWM5MTEuLi4NCi1zYXZpbmdMaWJyYXJ5VGFza19uYW1lPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVjODAwXHVjN2E1IFx1YzkxMS4uLg0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWM1YzVcdWFkZjhcdWI4MDhcdWM3NzRcdWI0ZGNcdWQ1NThcdWIyOTQgXHVjOTExLi4uDQotbG9hZGluZ0xpYnJhcnlFbGVtZW50c1Rhc2tfbmFtZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YzY5NFx1YzE4Y1x1Yjk3YyBcdWI4NWNcdWI0ZGNcdWQ1NThcdWIyOTQgXHVjOTExLi4uDQotc2F2aW5nVXBncmFkZWRFbGVtZW50c1Rhc2tfbmFtZT1cdWMwYzggXHVkMzBjXHVjNzdjIFx1ZDYxNVx1YzJkZFx1YzczY1x1Yjg1YyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YzY5NFx1YzE4Y1x1Yjk3YyBcdWM4MDBcdWM3YTVcdWQ1NThcdWIyOTQgXHVjOTExLi4uDQotc2F2aW5nVGFza19uYW1lPScnezB9JydcdWM3NDQoXHViOTdjKSBcdWM4MDBcdWM3YTVcdWQ1NThcdWIyOTQgXHVjOTExLi4uDQotc2F2aW5nRmlsZXNUYXNrX25hbWU9XHVkMzBjXHVjNzdjXHVjNzQ0IFx1YzgwMFx1YzdhNVx1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1maXhpbmdDb250ZW50RGVzY3JpcHRpb25HVUlEc1Rhc2tfbmFtZT1cdWNlZThcdWQxNTBcdWNlMjAgXHVjMTI0XHViYTg1IEdVSURcdWI5N2MgXHVjMjE4XHVjODE1XHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLWRlbGV0aW5nSW52YWxpZFJlZmVyZW5jZXNUYXNrX25hbWU9XHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWNjMzhcdWM4NzBcdWI5N2MgXHVjMGFkXHVjODFjXHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLQ0KLQ0KLSMgQWRkIEVkaXRvciBUbyBCcm93c2luZyBQZXJzcGVjdGl2ZSBXYXJuaW5nIERpYWxvZw0KLWFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZz1JVVBBMDA0Nlc6IFx1Yzc3NCBQZXJzcGVjdGl2ZVx1YjI5NCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YzY5NFx1YzE4Y1x1YjRlNFx1Yzc0NCBIVE1MIFx1ZDYxNVx1YzJkZFx1YzczY1x1Yjg1YyBcdWJjZmMgXHVjMjE4IFx1Yzc4OFx1YWM4YyBcdWQ1NThcdWM1ZWMgXHVjMGFjXHVjNmE5XHVjNzkwXHVjNzU4IFx1YWNiZFx1ZDVkOFx1Yzc0NCBcdWFkZjlcdWIzMDBcdWQ2NTRcdWQ1NjAgXHVjMjE4IFx1Yzc4OFx1YjNjNFx1Yjg1ZCBcdWQyYjlcdWMyMTggXHVjMTI0XHVhY2M0XHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0LiBcdWM1ZWNcdWFlMzBcdWM1ZDBcdWIyOTQgXHVkM2I4XHVjOWQxXHVhZTMwXHViOTdjIFx1Y2Q5NFx1YWMwMFx1ZDU1OFx1YWM3MFx1YjA5OCBcdWQ0NWNcdWMyZGNcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIENoYW5nZSBIaXN0b3J5IERpYWxvZw0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfdGl0bGU9XHVjMTI0XHViYTg1IFx1YmNjMFx1YWNiZCBcdWQ3ODhcdWMyYTRcdWQxYTBcdWI5YWMNCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX2xhYmVsPVx1YmNjMFx1YWNiZCBcdWQ3ODhcdWMyYTRcdWQxYTBcdWI5YWM6DQotDQotIyBNZXRob2QgRWxlbWVudCBEZWxldGUgQWN0aW9uDQotY29uZmlybURlbGV0ZURpYWxvZ190aXRsZT1cdWMwYWRcdWM4MWMgXHVkNjU1XHVjNzc4DQotY29uZmlybURlbGV0ZURpYWxvZ19tc2c9Jyd7MH0nJyBcdWQ1NmRcdWJhYTlcdWM3NDQgXHVjMGFkXHVjODFjXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLWNvbmZpcm1EZWxldGVEaWFsb2dfbXNnV2l0aFJlZmVyZW5jZT0nJ3swfScnIFx1ZDU2ZFx1YmFhOVx1Yzc0NCBcdWMwYWRcdWM4MWNcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/XG5cDQotXG5cDQotezF9IFx1YzY5NFx1YzE4Y1x1YzVkMCBcdWMwYWRcdWM4MWNcdWQ1NjAgXHVkNTZkXHViYWE5XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWNjMzhcdWM4NzBcdWFjMDAgXHVkM2VjXHVkNTY4XHViNDE4XHVjNWI0IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIE5ldyBMaWJyYXJ5IERpYWxvZw0KLWVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjJFOiBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjICcnezB9JydcdWM3NDQoXHViOTdjKSBcdWM3OTFcdWMxMzFcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1lcnJvckRpYWxvZ19lcnJvcj1cdWIyZTRcdWI5NzggXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWIwYjRcdWM1ZDAgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWM3OTFcdWMxMzFcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1lcnJfbm9vcGVubGlicmFyeT1JVVBBMDA0MEU6IFx1YzVmNFx1YjgyNCBcdWM3ODhcdWIyOTQgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YWMwMCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuXG5cDQotXG5cDQotXHVjMGM4IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NDQgXHVjZDk0XHVhYzAwXHVkNTU4XHViODI0XHViYTc0IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHVjNWY0XHVjNWI0XHVjNTdjIFx1ZDU2OVx1YjJjOFx1YjJlNC5cblwNCi1cblwNCi1cdWMwYzggXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWM3OTFcdWMxMzFcdWQ1NThcdWFjNzBcdWIwOTggXHVhZTMwXHVjODc0IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHVjNWY0XHVhY2UwIFx1YjJlNFx1YzJkYyBcdWMyZGNcdWIzYzRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZXJyX2xvYWRpbmdsaWJyYXJ5PVx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWI4NWNcdWI0ZGNcdWQ1NThcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OCBcdWJjMWNcdWMwZGQNCi1tc2dfcmVsb2FkTGlicmFyeT1cdWMyZTRcdWQzMjhcdWQ1NWMgXHVjMGFkXHVjODFjXHViOTdjIFx1YzJlNFx1ZDU4OSBcdWNkZThcdWMxOGNcdWQ1NThcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OFx1YWMwMCBcdWJjMWNcdWMwZGRcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1ZDYwNFx1YzdhYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YjJlNFx1YzJkYyBcdWI4NWNcdWI0ZGNcdWQ1NzRcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0Lg0KLQ0KLSMgUmVsb2FkIExpYnJhcnkgRGlhbG9nDQotcmVsb2FkRGlhbG9nX21lc3NhZ2U9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzZkMFx1Yjc5OCBcdWMwYzFcdWQwZGNcdWI4NWMgXHViY2Y1XHVjNmQwXHVkNTU4XHViODI0XHViYTc0IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWIyZTRcdWMyZGMgXHViODVjXHViNGRjXHVkNTc0XHVjNTdjIFx1ZDU2OVx1YjJjOFx1YjJlNC4NCi1yZWxvYWREaWFsb2dfdGl0bGU9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YjJlNFx1YzJkYyBcdWI4NWNcdWI0ZGMNCi1kaWFsb2dzX01vdmVEaWFsb2dfZXJyb3JUaXRsZT1cdWM3NzRcdWIzZDkgXHVjNjI0XHViOTU4DQotZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yTWVzc2FnZT1cdWM3NzRcdWIzZDkgXHVjOTExIFx1YzYyNFx1Yjk1OA0KLQ0KLSMgUHJvY2VzcyBGb3JtIEVkaXRvcg0KLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ190aXRsZT1cdWM4MDBcdWM3YTUNCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTE9XHVjNzc0IFx1YmNjMFx1YWNiZFx1YzBhY1x1ZDU2ZFx1Yzc0MCBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTRcdWM3NTggXHViYWE4XHViNGUwIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOFx1YzVkMCBcdWM2MDFcdWQ1YTVcdWM3NDQgXHViYmY4XHVjZTY5XHViMmM4XHViMmU0LiBcdWJjYzBcdWFjYmQgXHVkNmM0IFx1ZDNiOFx1YzlkMVx1YWUzMFx1YWMwMCBcdWM4MDBcdWM3YTVcdWI0MjlcdWIyYzhcdWIyZTQuIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8NCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTI9XHViY2MwXHVhY2JkIFx1ZDZjNCBcdWQzYjhcdWM5ZDFcdWFlMzBcdWFjMDAgXHVjODAwXHVjN2E1XHViNDI5XHViMmM4XHViMmU0LiBcdWFjYzRcdWMxOGRcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotDQotIyBDb25maWd1cmF0aW9uIFZpZXcgUGFnZQ0KLWNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ190aXRsZT1cdWM4MWNcdWFjNzAgXHVkNjU1XHVjNzc4DQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX21lc3NhZ2U9Jyd7MH0nJyBcdWJjZjRcdWFlMzBcdWI5N2MgXHVjODFjXHVhYzcwXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ190aXRsZT1cdWFjYmRcdWFjZTANCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uPVx1YWQ2Y1x1YzEzMToNCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld3M9XHVhZDZjXHVjMTMxIFx1YmNmNFx1YWUzMA0KLWNvbmZpZ1ZpZXdQYWdlX3ZpZXdzPVx1YmNmNFx1YWUzMA0KLWNvbHVtbnNlbGVjdGlvbl90ZXh0PVx1YzVmNCBcdWMxMjBcdWQwZGRcdWMwYWNcdWQ1NmQ6DQotY29uZmlnVmlld1BhZ2VfYWRkVmlld0J1dHRvblRleHQ9XHViY2Y0XHVhZTMwIFx1Y2Q5NFx1YWMwMC4uLg0KLWNvbmZpZ1ZpZXdQYWdlX3JlbW92ZVZpZXdCdXR0b25UZXh0PVx1YmNmNFx1YWUzMCBcdWM4MWNcdWFjNzANCi1jb25maWdWaWV3UGFnZV9tYWtlRGVmYXVsdEJ1dHRvblRleHQ9XHVhZTMwXHViY2Y4XHVhYzEyXHVjNzNjXHViODVjIFx1YzEyNFx1YzgxNQ0KLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ19tZXNzYWdlPUlVUEEwMDIzVzogXHVjNzc0XHViOTg0XHVjNzc0ICcnezB9JydcdWM3NzggXHViY2Y0XHVhZTMwXHVhYzAwIFx1Yzc3NFx1YmJmOCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdTZWN0aW9uVGl0bGU9XHVhY2Y1XHVhYzFjXHViNDFjIFx1ZDBkMFx1YzBjOSBcdWJjZjRcdWFlMzANCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25NZXNzYWdlPVx1Yzc3NCBcdWFkNmNcdWMxMzFcdWM3NDQgXHVhY2Y1XHVhYzFjXHVkNTYwIFx1YjU0YyBcdWQzZWNcdWQ1NjhcdWI0MThcdWIyOTQgXHViY2Y0XHVhZTMwXHViOTdjIFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4gXHViY2Y0XHVhZTMwXHViOTdjIFx1Yzc5MVx1YzEzMVx1ZDU1OFx1YjgyNFx1YmE3NCBcdWJjZjRcdWFlMzAgXHVjZDk0XHVhYzAwXHViOTdjIFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzVlYyBcdWFkNmNcdWMxMzEgXHViMGI0IFx1ZDQ1Y1x1YzkwMCBcdWI2MTBcdWIyOTQgXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OCBcdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWNcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiBcdWMxMjBcdWQwZGRcdWQ1NWMgXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjXHVjNWQwXHVjMTFjIFx1YmNmNFx1YWUzMFx1Yjk3YyBcdWQ0NWNcdWMyZGNcdWQ1NThcdWFjZTAgXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjXHVjNzU4IFx1ZDU1OFx1YzcwNCBcdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWNcdWM2NDAgXHVjZWU4XHVkMTUwXHVjZTIwIFx1YzY5NFx1YzE4Y1x1YzVkMFx1YzExYyBcdWJjZjRcdWFlMzBcdWM3NTggXHVkMmI4XHViOWFjIFx1YzY5NFx1YzE4Y1x1Yjk3YyBcdWQ0NWNcdWMyZGNcdWQ1NjlcdWIyYzhcdWIyZTQuDQotDQotIyBEZXNjcmlwdGlvbiBUYWINCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ190aXRsZT1cdWM1NDhcdWIwYjQgXHViY2MwXHVkNjU4DQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTE9SVVQQTAwNDBXOiBcdWJhM2NcdWM4MDAgXHVkM2I4XHVjOWQxXHVhZTMwXHViOTdjIFx1YzgwMFx1YzdhNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMj1cdWM3NzQgXHVjNzIwXHVkNjE1XHVjNWQwIFx1YjMwMFx1ZDU3NCBcdWQ2MzhcdWQ2NTggXHVhYzAwXHViMmE1XHVkNTVjIFx1YzU0OFx1YjBiNFx1YWMwMCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotY2hhbmdlQWN0aXZpdHlUeXBlV2FybmluZ0RpYWxvZ190aXRsZT1cdWQ2NWNcdWIzZDkgXHViY2MwXHVkNjU4DQotIyBBc3NvY2lhdGlvbiBGb3JtIFBhZ2UNCi1Bc3NvY2lhdGlvbkZvcm1QYWdlX0JyaWVmRGVzY3JpcHRpb25MYWJlbD1cdWMxMjBcdWQwZGRcdWQ1NWMgXHVjNjk0XHVjMThjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWFjMDRcdWI3YjVcdWQ1NWMgXHVjMTI0XHViYTg1Og0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgRGVzY3JpcHRpb24NCi1tZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfdGl0bGU9XHVjNjk0XHVjMThjIFx1Yzc3NFx1Yjk4NCBcdWM3ODVcdWI4MjUNCi1tZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfbWVzc2FnZT1cdWM3NzRcdWI5ODQgXHVkNTQ0XHViNGRjXHViOTdjIFx1YmU0NFx1YzZjY1x1YjQ1OCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLSMgTWV0aG9kIFBsdWctaW4gRGVzY3JpcHRpb24NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblJlbW92ZVJlZkNvbmZpcm1fbWVzc2FnZT0nJ3swfScnIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1YWNmYyBcdWM1ZjBcdWFkMDBcdWI0MWMgXHVjYzM4XHVjODcwXHViNDFjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc1OCBcdWMxMjBcdWQwZGRcdWM3NDQgXHVjZGU4XHVjMThjXHVkNTU4XHViYTc0IFx1YzYyY1x1YmMxNFx1Yjk3NFx1YzljMCBcdWM1NGFcdWM3NDAgXHVhZDAwXHVhY2M0XHVhYzAwIFx1YzBkZFx1YzEzMVx1YjQxOFx1YWNlMCBcdWMwYWRcdWM4MWNcdWI0MjlcdWIyYzhcdWIyZTQuXG5cDQotXG5cDQotXHVjNzc0IFx1Yzg3MFx1Y2U1OFx1YjI5NCBcdWMyZTRcdWQ1ODkgXHVjZGU4XHVjMThjXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuIFx1Yzc3NCBcdWJjYzBcdWFjYmRcdWM3NDQgXHVhY2M0XHVjMThkXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jb25maXJtUmVuYW1lPVx1Yzc3NCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzU4IFx1Yzc3NFx1Yjk4NFx1Yzc0NCAnJ3swfScnXHVjNWQwXHVjMTFjIFx1YzBjOCBcdWM3NzRcdWI5ODQgJyd7MX0nJyhcdWM3M2MpXHViODVjIFx1YmNjMFx1YWNiZFx1ZDU1OFx1YjgyNFx1YWNlMCBcdWQ1NjlcdWIyYzhcdWIyZTQuIFx1YmNjMFx1YWNiZFx1ZDU1OFx1YmE3NCBcdWM3NzQgXHVkM2I4XHVjOWQxXHVhZTMwXHVhYzAwIFx1YzgwMFx1YzdhNVx1YjQxOFx1YWNlMCBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzggXHVkM2Y0XHViMzU0IFx1Yzc3NFx1Yjk4NFx1Yzc3NCBcdWMwYzhcdWI4NWNcdWM2YjQgXHVjNzc0XHViOTg0XHVjNzNjXHViODVjIFx1YmMxNFx1YjAxZFx1YjJjOFx1YjJlNC4gXHVhY2M0XHVjMThkXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jb25maXJtUmVuYW1lX3RpdGxlPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzggXHVjNzc0XHViOTg0IFx1YmMxNFx1YWZiOFx1YWUzMA0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jYW5ub3RSZW5hbWVQbHVnaW5Gb2xkZXI9XHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4IFx1ZDNmNFx1YjM1NCBcdWM3NzRcdWI5ODRcdWM3NDQgXHVjMGM4XHViODVjXHVjNmI0IFx1Yzc3NFx1Yjk4NFx1YzczY1x1Yjg1YyBcdWJjMTRcdWFmYzAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbkxhYmVsPVx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OCBcdWM3YTBcdWFlMDgNCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbl9tZXNzYWdlPVx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OCBcdWM3YTBcdWFlMDggXHViY2MwXHVhY2JkXHVjNzQwICcnezB9JycgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNWQwIFx1YzE4ZFx1ZDU1OFx1YjI5NCBcdWM2OTRcdWMxOGNcdWM3NTggXHVjNWY0XHViOWIwIFx1ZDNiOFx1YzlkMVx1YWUzMFx1Yjk3YyBcdWM4MDBcdWM3YTVcdWQ1NThcdWFjZTAgXHViMmViXHVjMmI1XHViMmM4XHViMmU0LiBcdWM3NzQgXHViY2MwXHVhY2JkXHVjNzQ0IFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8NCi0NCi0jIFByb2Nlc3MgRGVzY3JpcHRpb24NCi1wcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV90aXRsZT1cdWM3NzRcdWI5ODQgXHViYzE0XHVhZmI4XHVhZTMwDQotcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fbWVzc2FnZT1cdWM3NzQgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHVjNzU4IFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWJjYzBcdWFjYmRcdWQ1NThcdWI4MjRcdWFjZTAgXHVkNTY5XHViMmM4XHViMmU0LiBcdWFkZjhcdWI3ZWNcdWJhNzQgXHVjNzc0IFx1ZDNiOFx1YzlkMVx1YWUzMFx1YWMwMCBcdWM4MDBcdWM3YTVcdWI0MThcdWFjZTAgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1ZDNmNFx1YjM1NCBcdWM3NzRcdWI5ODRcdWM3NzQgXHVjMGM4XHViODVjXHVjNmI0IFx1Yzc3NFx1Yjk4NFx1YzczY1x1Yjg1YyBcdWJjMTRcdWIwMWRcdWIyYzhcdWIyZTQuIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8NCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbkRlc2NyaXB0aW9uPVx1YzEyNFx1YmE4NToNCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25UaXRsZT1cdWFkNmNcdWMxMzENCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25NZXNzYWdlPVx1Yzc3NCBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTRcdWM1ZDAgXHVjNjJjXHViYzE0XHViOTc4IFx1YmFhOFx1YjRlMCBcdWFkNmNcdWMxMzFcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiBcdWFlMzBcdWJjZjhcdWM3M2NcdWI4NWMgXHVkNTU4XHViMDk4XHVjNzU4IFx1YWQ2Y1x1YzEzMVx1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuIFx1YWRmOFx1YjdlY1x1YmE3NCBcdWIyZTRcdWI5NzggXHViYWE4XHViNGUwIFx1YWQ2Y1x1YzEzMVx1Yzc1OCBcdWMwYzFcdWM3MDQgXHVjMTM4XHVkMmI4XHVhYzAwIFx1YjQyMCBcdWQ1NDRcdWM2OTRcdWFjMDAgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0Lg0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9ucz1cdWFkNmNcdWMxMzE6DQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2RlZmF1bHQ9KFx1YWUzMFx1YmNmOFx1YWMxMikNCi1Qcm9jZXNzRGVzY3JpcHRpb25fc2VsZWN0Q29uZmlndXJhdGlvbj1cdWNkOTRcdWFjMDBcdWQ1NjAgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1Qcm9jZXNzRGVsZXRlQWN0aW9uX2RlbGV0ZWNvZmlybV90ZXh0MD1cdWM3NzQgXHVjODcwXHVjNzkxXHVjNzQwIFx1ZDYwNFx1YzdhYyBcdWQzYjhcdWM5ZDFcdWFlMzBcdWI5N2MgXHVjODAwXHVjN2E1XHVkNTU4XHVhY2UwIFx1YmNjMFx1YWNiZFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWM2MDFcdWFkNmNcdWM4MDFcdWM3M2NcdWI4NWMgXHViYzE4XHVjNjAxXHVkNTY5XHViMmM4XHViMmU0LiAnJ3swfScnIFx1ZDU2ZFx1YmFhOVx1Yzc0NCBcdWMwYWRcdWM4MWNcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotUHJvY2Vzc0RlbGV0ZUFjdGlvbl9zZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlPVx1YjJlNFx1Yzc0YyBcdWMxMjRcdWJhODVcdWM3OTBcdWIyOTQgXHVjMTIwXHVkMGRkXHViNDFjIFx1YzY5NFx1YzE4Y1x1YWMwMCBcdWMwYWRcdWM4MWNcdWI0MWMgXHVjNzc0XHVkNmM0IFx1YzViNFx1YjI5MCBcdWFjZjNcdWM1ZDBcdWMxMWNcdWIzYzQgXHVjMGFjXHVjNmE5XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuXG5cDQotXHVjMGFkXHVjODFjXHVkNTYwIFx1YzEyNFx1YmE4NVx1Yzc5MFx1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotIyBWaWV3IEhlbHBlcg0KLXZpZXdIZWxwZXJIZWFsdGhDaGVja0RpYWxvZ190aXRsZT1cdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVjMGMxXHVkMGRjIFx1YWM4MFx1YzBhYw0KLXZpZXdIZWxwZXJfcGVyZm9ybUhlYWx0aENoZWNrPVx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YzVkMFx1YzExYyBcdWMwYzFcdWQwZGMgXHVhYzgwXHVjMGFjXHViOTdjIFx1YzIxOFx1ZDU4OVx1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi12aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfbWVzc2FnZT1cdWM1ZjRcdWI4MjQgXHVjNzg4XHViMjk0IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yzc1OCBcdWMwYzFcdWQwZGMgXHVhYzgwXHVjMGFjXHVhYzAwIFx1YzEzMVx1YWNmNVx1YzgwMVx1YzczY1x1Yjg1YyBcdWM2NDRcdWI4Y2NcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1Yjg1Y1x1YWRmOCBcdWQzMGNcdWM3N2NcdWM3NTggXHViY2Y0XHVhY2UwXHVjMTFjXHViOTdjIFx1Y2MzOFx1Yzg3MFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jIEF0dGFjaCBUZW1wbGF0ZSBGaWxlIERpYWxvZw0KLWF0dGFjaFRlbXBsYXRlRmlsZURpYWxvZ190aXRsZT1cdWQxNWNcdWQ1MGNcdWI5YWNcdWQyYjggXHVkMzBjXHVjNzdjIFx1Y2NhOFx1YmQ4MA0KLQ0KLSMgQ3JlYXRlIEVsZW1lbnQgRXJyb3IgRGlhbG9nDQotY3JlYXRlRWxlbWVudERpYWxvZ190aXRsZT1cdWMwYzggezB9IFx1Yzc5MVx1YzEzMQ0KLWNyZWF0ZU5ld0VsZW1lbnRFcnJvcl9tc2c9XHVjMGM4IHswfSBcdWQ1NmRcdWJhYTlcdWM3NDQgXHVjNzkxXHVjMTMxXHVkNTU4XHViMjk0IFx1YzkxMVx1YzVkMCBcdWM2MjRcdWI5NThcdWFjMDAgXHViYzFjXHVjMGRkXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLWRsZ1RpdGxlX3JlbG9hZExpYnJhcnk9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YjJlNFx1YzJkYyBcdWI4NWNcdWI0ZGMNCi1jcmVhdGVFbGVtZW50RXJyb3JfcmVhc29uPXswfSBcdWM3NzRcdWI5ODRcdWM3NDQgXHViZTQ0XHVjNmNjXHViNDU4IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuXG5cDQotXG5cDQotXHVjNjJjXHViYzE0XHViOTc4IFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWFjZTAgXHViMmU0XHVjMmRjIFx1YzJkY1x1YjNjNFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1kZWxldGVDb25maWdFcnJvcl9yZWFzb249XHVhZDZjXHVjMTMxXHVjNzQ0ICcnezB9JycgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHVjNWQwXHVjMTFjIFx1Y2MzOFx1Yzg3MFx1ZDU2OVx1YjJjOFx1YjJlNC4NCi0NCi0jIENoYW5nZUJvdW5kc0NvbW1hbmQNCi1nZWZfY2hhbmdlQm91bmRzQ29tbWFuZF9sYWJlbD1cdWJjOTRcdWM3MDQgXHViY2MwXHVhY2JkDQotIyBDaGFuZ2VOYW1lQ29tbWFuZA0KLWdlZl9jaGFuZ2VOYW1lQ29tbWFuZF9sYWJlbD1cdWM3NzRcdWI5ODQgXHViY2MwXHVhY2JkDQotZ2VmX2NoYW5nZU5hbWVDb21tYW5kX3VuZG9NZXNzYWdlPVx1Yzc3NFx1Yjk4NCBcdWJjYzBcdWFjYmRcdWM3NDQgXHVjMmU0XHVkNTg5IFx1Y2RlOFx1YzE4Y1x1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LlxuXA0KLVxuXA0KLVx1Yzc3NFx1YzgwNCBcdWM3NzRcdWI5ODRcdWM3NzQgXHViMTEwKG51bGwpXHVjNzdjIFx1YWNiZFx1YzZiMCBcdWM3NzRcdWI5ODQgXHViY2MwXHVhY2JkIFx1YzJlNFx1ZDU4OSBcdWNkZThcdWMxOGMgXHVjODcwXHVjNzkxXHVjNzc0IFx1ZDVjOFx1YzZhOVx1YjQxOFx1YzljMCBcdWM1NGFcdWMyYjVcdWIyYzhcdWIyZTQuDQotIyBDaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZA0KLWdlZl9jaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZF9sYWJlbD1cdWQyYjlcdWMxMzEgXHVhYzEyIFx1YmNjMFx1YWNiZA0KLSMgQ3JlYXRlQmVuZHBvaW50Q29tbWFuZA0KLWdlZl9jcmVhdGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPVx1YWQ3NFx1YWNlMVx1YzgxMCBcdWM3OTFcdWMxMzENCi0jIENyZWF0ZUxpbmtDb21tYW5kDQotZ2VmX2NyZWF0ZUxpbmtDb21tYW5kX2xhYmVsPVx1YjljMVx1ZDA2YyBcdWM3OTFcdWMxMzENCi0jIENyZWF0ZU5vZGVDb21tYW5kDQotZ2VmX2NyZWF0ZU5vZGVDb21tYW5kX2xhYmVsPVx1YzBjOCBcdWIxNzhcdWI0ZGMgXHVjNzkxXHVjMTMxDQotIyBEZWxldGVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX2RlbGV0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9XHVhZDc0XHVhY2UxXHVjODEwIFx1YzBhZFx1YzgxYw0KLSMgRGVsZXRlQ29tbWFuZA0KLWdlZl9kZWxldGVDb21tYW5kX2xhYmVsPVx1YzBhZFx1YzgxYw0KLSMgRGVsZXRlTGlua0NvbW1hbmQNCi1nZWZfZGVsZXRlTGlua0NvbW1hbmRfbGFiZWw9XHVjNWYwXHVhY2IwIFx1YzBhZFx1YzgxYw0KLSMgTW92ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfbW92ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9XHVhZDc0XHVhY2UxXHVjODEwIFx1Yzc3NFx1YjNkOQ0KLSMgUmVjb25uZWN0TGlua0NvbW1hbmQNCi1nZWZfcmVjb25uZWN0TGlua0NvbW1hbmRfbGFiZWw9XHViOWMxXHVkMDZjIFx1YjJlNFx1YzJkYyBcdWM1ZjBcdWFjYjANCi0NCi0jIFZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcg0KLWdlZl92YWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXJfYnJpbmdEb3duUHJvbXB0PVx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWJlNDRcdWM2Y2NcdWI0NTggXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNjJjXHViYzE0XHViOTc4IFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotIyBWYWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcg0KLWdlZl92YWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ9XHVjNzc0XHViOTg0XHVjNzQ0IFx1YmU0NFx1YzZjY1x1YjQ1OCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcdWM2MmNcdWJjMTRcdWI5NzggXHVjNzc0XHViOTg0XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0jIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0DQotZ2VmX3dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0X3ZhbGlkYXRlTWVzc2FnZT1cdWM3NzRcdWI5ODRcdWM3NDQgXHViZTQ0XHVjNmNjXHViNDU4IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuIFx1YzYyY1x1YmMxNFx1Yjk3OCBcdWM3NzRcdWI5ODRcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLSMgRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uDQotYWN0aW9uc19FbGVtZW50c1ZpZXdEZWxldGVBY3Rpb25fbWVzc2FnZT0nJ3swfScnIFx1YWQ2Y1x1YzEzMVx1Yzc0NCAnJ3sxfScnIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1YzVkMFx1YzExYyBcdWMwYWNcdWM2YTlcdWQ1NThcdWIyOTQgXHVjOTExXHVjNzc0XHVhZTMwIFx1YjU0Y1x1YmIzOFx1YzVkMCBcdWMwYWRcdWM4MWNcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcg0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yVGl0bGU9XHVjMGFkXHVjODFjIFx1YzYyNFx1Yjk1OA0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yTWVzc2FnZT1cdWNjOThcdWI5YWNcdWI0MThcdWM5YzAgXHVjNTRhXHVjNzQwIFx1YzYwOFx1YzY3OA0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yUmVhc29uPVx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZCBcdWNjMzhcdWM4NzANCi0NCi0jIE1ldGhvZEVsZW1lbnRFZGl0b3INCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yVGl0bGU9XHVjODAwXHVjN2E1IFx1YzYyNFx1Yjk1OA0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMT1JVVBBMDAyMEU6IFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWM4MDBcdWM3YTVcdWQ1NThcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OCBcdWJjMWNcdWMwZGQNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTI9XHVkNjU1XHVjNTdkIFx1YzYyNFx1Yjk1OA0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24xPVx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWIyOTQgXHViODVjXHVhZGY4IFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWNjMzhcdWM4NzBcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjI9XHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1Y2MzOFx1Yzg3MA0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvclRpdGxlPVx1Yzc3NFx1Yjk4NCBcdWJjMTRcdWFmYjhcdWFlMzAgXHVjNjI0XHViOTU4DQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JNc2c9XHVjNzc0IFx1ZDNiOFx1YzlkMVx1YWUzMFx1Yzc1OCBcdWQzMGNcdWM3N2NcdWM3NzQgXHVkNTU4XHViMDk4IFx1Yzc3NFx1YzBjMSBcdWM4MWNcdWFjNzBcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1ZDNiOFx1YzlkMVx1YWUzMFx1YjI5NCBcdWIzNTQgXHVjNzc0XHVjMGMxIFx1YzYyY1x1YmMxNFx1Yjk3NFx1YzljMCBcdWM1NGFcdWM3M2NcdWJhNzAgXHViMmViXHVjNTQ0XHVjNTdjIFx1ZDU2OVx1YjJjOFx1YjJlNC4NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvclRpdGxlPVx1YzYyY1x1YmMxNFx1Yjk3NFx1YzljMCBcdWM1NGFcdWM3NDAgXHVkM2I4XHVjOWQxXHVhZTMwDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yTWVzc2FnZTE9Jyd7MH0nJyBcdWQzMGNcdWM3N2MgXHVjNzc0XHViOTg0XHVjNzQ0IFx1YmMxNFx1YWZiOFx1YjI5NCBcdWM5MTFcdWM1ZDAgXHVjNjI0XHViOTU4IFx1YmMxY1x1YzBkZA0KLQ0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQ0KLXJlbmFtZUVycm9yX3RpdGxlPVx1YzY5NFx1YzE4YyBcdWM3NzRcdWI5ODQgXHViYzE0XHVhZmI4XHVhZTMwDQotcmVuYW1lRXJyb3JfbXNnPUlVUEEwMDEzRTogXHVjNzc0XHViOTg0IFx1YmMxNFx1YWZiOFx1YWUzMCBcdWM4NzBcdWM3OTFcdWM3NDQgXHVjNjQ0XHViOGNjXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotU2VsZWN0RWxlbWVudERpYWxvZ19zZWxlY3RlbGVtZW50X3RleHQ9XHVjNjk0XHVjMThjIFx1YzEyMFx1ZDBkZA0KLQ0KLSMgRWRpdG9yQ2hvb3Nlcg0KLWVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ190aXRsZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVkM2I4XHVjOWQxXHVhZTMwIFx1YzVmNFx1YWUzMA0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVzY3JpcHRpb25MYWJlbD1cdWMxMjRcdWJhODU6DQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX1NlbGVjdEFsbEJ1dHRvbkxhYmVsPVx1YmFhOFx1YjQ1MCBcdWMxMjBcdWQwZGQNCi1PcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlX2VkaXRfdGV4dDA9XHVjNjk0XHVjMThjIFx1ZDNiOFx1YzlkMQ0KLWVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ19tZXNzYWdlPUlVUEEwMDIzRTogXHVjMTIwXHVkMGRkXHVkNTVjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWM2OTRcdWMxOGNcdWM2NDAgXHVjNWYwXHVhZDAwXHViNDFjIFx1ZDNiOFx1YzlkMVx1YWUzMFx1Yjk3YyBcdWM1ZjQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZT1cdWM3NzRcdWJiZjhcdWM5YzAgXHVkMzBjXHVjNzdjIFx1YzEyMFx1ZDBkZA0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVmYXVsdExpYnJhcnlOYW1lPVx1YzBjOCBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfRGVzY3JpcHRpb25MYWJlbD1cdWMxMjRcdWJhODU6DQotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb249XHVkNTU4XHViMDk4IFx1Yzc3NFx1YzBjMVx1Yzc1OCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YWNlMCBcdWM2NDRcdWI4Y2NcdWI5N2MgXHVkMDc0XHViOWFkXHVkNTU4XHVjNWVjIFx1YzVlY1x1YzJlZFx1YzJkY1x1YzYyNC4NCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfRGVzZWxlY3RBbGxCdXR0b25MYWJlbD1cdWJhYThcdWI0NTAgXHVjMTIwXHVkMGRkIFx1Y2RlOFx1YzE4Yw0KLUVsZW1lbnRzVmlld19taWdyYXRpb25fZGlyX2RsZ19kZXNjcmlwdGlvbl90ZXh0PVx1YzBjOFx1Yjg1YyBcdWM3NzRcdWM4ZmNcdWI0MWMgezB9XHVjNzU4IFx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhY1x1Yjk3YyBcdWM5YzBcdWM4MTVcdWQ1NThcdWM1ZWMgXHVjMTIwXHVkMGRkXHViNDFjIHswfVx1Yzc0NChcdWI5N2MpIFx1YmMxNFx1YWZiOFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uPVx1YzJkY1x1YzJhNFx1ZDE1YyBcdWM2MjRcdWI5NThcdWFjMDAgXHViYzFjXHVjMGRkXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0LiBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YmNmNFx1YjgyNFx1YmE3NCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmRcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LlxuXA0KLVxuXA0KLVx1YzVmNFx1YjgyNCBcdWM3ODhcdWIyOTQgXHVjNzdjXHViZDgwIFx1ZDNiOFx1YzlkMVx1YWUzMFx1Yjk3YyBcdWIyZWJcdWFjZTAgXHViMmU0XHVjMmRjIFx1YzJkY1x1YjNjNFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jIERlc2NyaXB0aW9uRm9ybVBhZ2UNCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RpdGxlPVx1Yzc3NFx1YmJmOFx1YzljMFx1YWMwMCBcdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0Lg0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzFFOiBcdWMxMjBcdWQwZGRcdWQ1NWMgJyd7MH0nJyBcdWM3NzRcdWJiZjhcdWM5YzBcdWFjMDAgXHVkNWM4XHVjNmE5XHViNDE4XHViMjk0IFx1ZDA2Y1x1YWUzMCh7MX0pXHViY2Y0XHViMmU0IFx1YjM1NCBcdWQwN2RcdWIyYzhcdWIyZTQoezJ9KS4gXHViMmU0XHViOTc4IFx1Yzc3NFx1YmJmOFx1YzljMFx1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RpdGxlPVx1Yzc3NFx1YmJmOFx1YzljMFx1YWMwMCBcdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0Lg0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190ZW1wbGF0ZT1JVVBBMDAzMkU6IFx1YzEyMFx1ZDBkZFx1ZDU1YyAnJ3swfScnIFx1ZDMwY1x1Yzc3Y1x1Yzc3NCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuIFx1YjJlNFx1Yjk3OCBcdWM3NzRcdWJiZjhcdWM5YzBcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19TZWxlY3RCdXR0b25MYWJlbD1cdWMxMjBcdWQwZGQuLi4NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5RGVzY3JpcHRpb249XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWMxMjRcdWJhODUNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfRGVmYXVsdEJyaWVmRGVzY3JpcHRpb249XHViYTU0XHVjMThjXHViNGRjIFx1YWQ2Y1x1YzEzMSBcdWMxMjRcdWJhODUNCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZURlc2NyaXB0aW9uPVx1YmFhOFx1YjRlMCBcdWQzYjhcdWM5ZDFcdWFlMzBcdWI5N2MgXHViMmViXHVjNTQ0XHVjNTdjIFx1ZDU2OVx1YjJjOFx1YjJlNC4gXHViYTNjXHVjODAwIFx1YzgwMFx1YzdhNVx1ZDU3NFx1YzU3YyBcdWQ1NThcdWIyOTQgXHVhY2JkXHVjNmIwIFx1ZDU3NFx1YjJmOSBcdWQzYjhcdWM5ZDFcdWFlMzBcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLSMgVGVtcGxhdGVEZXNjcmlwdGlvblBhZ2UNCi1mb3Jtc19UZW1wbGF0ZURlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnPVx1YzEyMFx1ZDBkZFx1YjQxYyBcdWQzMGNcdWM3N2NcdWM3NDAgXHVjNzc0XHViYmY4IFx1Yzc3NCBcdWQxNWNcdWQ1MGNcdWI5YWNcdWQyYjhcdWM1ZDAgXHVjY2E4XHViZDgwXHViNDE4XHVjNWI0IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIE5ldyBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLW5ld0xpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTRFOiBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1Yzc5MVx1YzEzMVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24xPVx1YzljMFx1YzgxNVx1ZDU1YyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YWNiZFx1Yjg1YyAnJ3swfScnXHVjNzc0KFx1YWMwMCkgXHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4NCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMj1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVhYzAwIFx1Yzc3NFx1YmJmOCAnJ3swfScnXHVjNWQwIFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMz1cdWM5YzBcdWM4MTVcdWQ1NWMgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWQzZjRcdWIzNTQgJyd7MH0nJ1x1Yzc0NChcdWI5N2MpIFx1Yzc5MVx1YzEzMVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLW5ld0xpYnJhcnlFcnJvcl9hZHZpY2U9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWIyZTRcdWI5NzggXHVjNzc0XHViOTg0XHVjNzc0XHViMDk4IFx1YWNiZFx1Yjg1Y1x1Yjk3YyBcdWM3ODVcdWI4MjVcdWQ1NThcdWI4MjRcdWJhNzQgXHVkNjU1XHVjNzc4XHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jUHJvY2VzcyBsaXRlcmFscw0KLVByb2Nlc3NfRXh0ZXJuYWxJRD1cdWM2NzhcdWJkODAgSUQ6DQotUHJvY2Vzc19QdXJwb3NlPVx1YmFhOVx1YzgwMToNCi1Qcm9jZXNzX1Njb3BlPVx1YmM5NFx1YzcwNDoNCi1Qcm9jZXNzX1VzYWdlTm90ZXM9XHVjMGFjXHVjNmE5XHViYzk1IFx1YjE3OFx1ZDJiODoNCi1Qcm9jZXNzX0FsdGVybmF0aXZlcz1cdWIzMDBcdWM1NDg6DQotUHJvY2Vzc19Ib3dUb1N0YWZmPVx1Yzc3OFx1YjgyNSBcdWFkNmNcdWMxMzEgXHViYzI5XHViYzk1Og0KLVByb2Nlc3NfS2V5Q29uc2lkZXJhdGlvbj1cdWQ1NzVcdWMyZWMgXHVhY2UwXHViODI0XHVjMGFjXHVkNTZkOg0KLVByb2Nlc3NfU2NhbGU9XHVhZGRjXHViYWE4Og0KLVByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljcz1cdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjggXHVkMmI5XHVjMTMxOg0KLVByb2Nlc3NfUmlza0xldmVsPVx1YzcwNFx1ZDVkOFx1YzEzMSBcdWI4MDhcdWJjYTg6DQotUHJvY2Vzc19Fc3RpbWF0aW5nVGVjaG5pcXVlPVx1YzYwOFx1YzBjMSBcdWFlMzBcdWJjOTU6DQotUHJvY2Vzc19Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPVx1ZDUwNFx1Yjg1Y1x1YzgxZFx1ZDJiOCBcdWFkNmNcdWMxMzFcdWM2ZDAgXHVjODA0XHViYjM4IFx1YzljMFx1YzJkZDoNCi1Qcm9jZXNzX1R5cGVPZkNvbnRyYWN0PVx1YWNjNFx1YzU3ZCBcdWM3MjBcdWQ2MTU6DQotDQotIyBFZGl0b3IgUHJldmlldyBOYXZpZ2F0aW9uIEJ1dHRvbnMNCi1iYWNrQnV0dG9uX3RleHQ9XHVjNzc0XHVjODA0DQotZm9yd2FyZEJ1dHRvbl90ZXh0PVx1YjJlNFx1Yzc0Yw0KLWZvcndhcmRfdGV4dD1cdWIyZTRcdWM3NGMNCi1zdG9wQnV0dG9uX3RleHQ9XHVjOTExXHVjOWMwDQotcmVmcmVzaEJ1dHRvbl90ZXh0PVx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNThcdWFlMzANCi1yZWZyZXNoX3RleHQ9XHVjMGM4XHViODVjIFx1YWNlMFx1Y2U1OFx1YWUzMA0KLW5ld25hbWVfdGV4dD1cdWMwYzggXHVjNzc0XHViOTg0Og0KLXByaW50QnV0dG9uX3RleHQ9XHVjNzc4XHVjMWM0DQotDQotIyBDb250ZXh0IG1lbnVzDQotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPVx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNThcdWFlMzAoJlIpDQotX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW09XHVkMmI5XHVjMTMxIFx1ZDQ1Y1x1YzJkYygmUykNCi0NCi1fVUlfTWV0aG9kRWRpdG9yX21lbnU9XHViYTU0XHVjMThjXHViNGRjIFx1ZDNiOFx1YzlkMVx1YWUzMCgmTSkNCi1fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtPVx1YzBjOFx1Yjg1YyBcdWM3OTFcdWMxMzEoJk4pDQotX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtPVx1YzBjOCBcdWIzZDlcdWM3MDQoJkUpDQotDQotX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWw9XHVjMTIwXHVkMGRkDQotX1VJX1BhcmVudFBhZ2VfbGFiZWw9XHVjMGMxXHVjNzA0DQotX1VJX0xpc3RQYWdlX2xhYmVsPVx1YmFhOVx1Yjg1ZA0KLV9VSV9UcmVlUGFnZV9sYWJlbD1cdWQyYjhcdWI5YWMNCi1fVUlfVGFibGVQYWdlX2xhYmVsPVx1ZDE0Y1x1Yzc3NFx1YmUxNA0KLV9VSV9UYWJsZVRyZWVQYWdlX2xhYmVsPVRhYmxlVHJlZQ0KLV9VSV9PYmplY3RDb2x1bW5fbGFiZWw9XHVjNjI0XHViZTBjXHVjODFkXHVkMmI4DQotX1VJX1NlbGZDb2x1bW5fbGFiZWw9XHVjNzkwXHVjY2I0DQotDQotX1VJX05vT2JqZWN0U2VsZWN0ZWQ9XHVjMTIwXHVkMGRkIFx1YzU0OFx1ZDU2OA0KLV9VSV9TaW5nbGVPYmplY3RTZWxlY3RlZD1cdWMxMjBcdWQwZGRcdWQ1NWMgXHVjNjI0XHViZTBjXHVjODFkXHVkMmI4OiB7MH0NCi1fVUlfTXVsdGlPYmplY3RTZWxlY3RlZD17MH1cdWFjMWMgXHVjNjI0XHViZTBjXHVjODFkXHVkMmI4IFx1YzEyMFx1ZDBkZFx1ZDU2OA0KLQ0KLV9VSV9PcGVuRWRpdG9yRXJyb3JfbGFiZWw9XHVkM2I4XHVjOWQxXHVhZTMwIFx1YzVmNFx1YWUzMA0KLQ0KLV9VSV9XaXphcmRfY2F0ZWdvcnk9XHVjNjA4XHVjODFjIEVNRiBcdWJhYThcdWIzNzggXHVjNzkxXHVjMTMxIFx1YjljOFx1YmM5NVx1YzBhYw0KLQ0KLV9VSV9NZXRob2RNb2RlbFdpemFyZF9sYWJlbD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViYWE4XHViMzc4DQotX1VJX01ldGhvZE1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uPVx1YzBjOCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViYWE4XHViMzc4IFx1Yzc5MVx1YzEzMQ0KLQ0KLV9VSV9NZXRob2RFZGl0b3JfbGFiZWw9XHViYTU0XHVjMThjXHViNGRjIFx1YmFhOFx1YjM3OCBcdWQzYjhcdWM5ZDFcdWFlMzANCi0NCi1fVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZT1NeQ0KLV9VSV9NZXRob2RFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbj1cdWJhNTRcdWMxOGNcdWI0ZGMNCi0NCi1fVUlfV2l6YXJkX2xhYmVsPVx1YzBjOFx1Yjg1YyBcdWM3OTFcdWMxMzENCi0NCi1fV0FSTl9GaWxlbmFtZUV4dGVuc2lvbj1cdWQzMGNcdWM3N2MgXHVjNzc0XHViOTg0XHVjNzQwICcnLnswfScnKFx1YzczYylcdWI4NWMgXHViMDVkXHViMDk4XHVjNTdjIFx1ZDU2OVx1YjJjOFx1YjJlNC4NCi0NCi1fVUlfTW9kZWxPYmplY3Q9XHViYWE4XHViMzc4IFx1YzYyNFx1YmUwY1x1YzgxZFx1ZDJiOA0KLV9VSV9YTUxFbmNvZGluZz1YTUwgXHVjNzc4XHVjZjU0XHViNTI5DQotX1VJX1hNTEVuY29kaW5nQ2hvaWNlcz1VVEYtOCBBU0NJSSBVVEYtMTYgVVRGLTE2QkUgVVRGLTE2TEUgSVNPLTg4NTktMQ0KLV9VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb249XHVjNzkxXHVjMTMxXHVkNTYwIFx1YmFhOFx1YjM3OCBcdWM2MjRcdWJlMGNcdWM4MWRcdWQyYjhcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLV9VSV9GaWxlQ29uZmxpY3RfbGFiZWw9XHVkMzBjXHVjNzdjIFx1Y2RhOVx1YjNjYw0KLV9XQVJOX0ZpbGVDb25mbGljdD1cdWQzYjhcdWM5ZDFcdWFlMzAgXHVjNjc4XHViZDgwXHVjNzU4IFx1YmNjMFx1YWNiZFx1YzBhY1x1ZDU2ZFx1YWNmYyBcdWNkYTlcdWIzY2NcdWQ1NThcdWIyOTQgXHVjODAwXHVjN2E1XHViNDE4XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWJjYzBcdWFjYmRcdWMwYWNcdWQ1NmRcdWM3NzQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LiBcdWM3NzQgXHVkM2I4XHVjOWQxXHVhZTMwXHVjNzU4IFx1YmNjMFx1YWNiZFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWJjODRcdWI5YWNcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotDQotIyBBZGQgTGluayBEaWFsb2cNCi1hZGRMaW5rRGlhbG9nX2xpbmtUeXBlPVx1YzcyMFx1ZDYxNToNCi1vcGVuTGlua0NoZWNrYm94X3RleHQ9XHViY2M0XHViM2M0XHVjNzU4IFx1YmUwY1x1Yjc3Y1x1YzZiMFx1YzgwMCBcdWNjM2RcdWM1ZDBcdWMxMWMgXHViOWMxXHVkMDZjIFx1YzVmNFx1YWUzMA0KLQ0KLSMgQWRkIEltYWdlIERpYWxvZw0KLWhlaWdodExhYmVsX3RleHQ9XHViMTkyXHVjNzc0Og0KLXdpZHRoTGFiZWxfdGV4dD1cdWIxMDhcdWJlNDQ6DQotRWxlbWVudHNWaWV3XzIwPVx1YWUzMFx1YjJhNSBcdWQzMjhcdWQxMzQNCi1FbGVtZW50c1ZpZXdfMjE9XHVjODA0XHViMmVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNA0KLUVsZW1lbnRzVmlld18yMj1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQNCi1FbGVtZW50c1ZpZXdfMzU9ezB9XHVjNzQwKFx1YjI5NCkgXHVjNzdkXHVhZTMwIFx1YzgwNFx1YzZhOVx1Yzc4NVx1YjJjOFx1YjJlNC4gXHVhY2M0XHVjMThkXHVkNTU4XHVhZTMwIFx1YzgwNFx1YzVkMCBcdWM0ZjBcdWFlMzAgXHVhYzAwXHViMmE1XHVjNzNjXHViODVjIFx1YjljY1x1YjRkY1x1YzJlZFx1YzJkY1x1YzYyNC4NCi1FbGVtZW50c1ZpZXdfMzY9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1Yjg1Y1x1YjRkY1x1ZDU1OFx1YjI5NCBcdWM5MTFcdWM1ZDAgXHVjNjI0XHViOTU4IFx1YmMxY1x1YzBkZA0KLWFsdFRhZ0xhYmVsX3RleHQ9QUxUIFx1ZDBkY1x1YWRmODoNCi1pbWFnZVNpemVMYWJlbF90ZXh0PVx1Yzc3NFx1YmJmOFx1YzljMFx1Yzc1OCBcdWIxOTJcdWM3NzRcdWM2NDAgXHViMTA4XHViZTQ0XHViMjk0IFx1YWMwMVx1YWMwMSBcdWNkNWNcdWMxOGNcdWQ1NWMgMTAgXHViYzBmIDYwMCBcdWM3NzRcdWQ1NThcdWM1ZWNcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0LiBcdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjNzQwIFx1YjE5Mlx1Yzc3NFx1YzY0MCBcdWIxMDhcdWJlNDRcdWIyOTQgXHVjODAxXHVjODA4XHVkNTVjIFx1ZDA2Y1x1YWUzMFx1Yjg1YyBcdWJjYzBcdWQ2NThcdWI0MjlcdWIyYzhcdWIyZTQuDQotDQotIyBQcm9jZXNzIEVkaXRvcg0KLVByb2Nlc3NFZGl0b3I9UHJvY2Vzc0VkaXRvcg0KLVByb2Nlc3NFZGl0b3JfTmFtZT1cdWM3NzRcdWI5ODQNCi1Qcm9jZXNzRWRpdG9yX1ByZXNlbnRhdGlvbk5hbWU9XHVkNDVjXHVjMmRjIFx1Yzc3NFx1Yjk4NA0KLVByb2Nlc3NFZGl0b3JfSW5kZXg9XHVjMGM5XHVjNzc4DQotUHJvY2Vzc0VkaXRvcl9QcmVkZWNlc3NvcnM9XHVjMTIwXHVkNTg5DQotI0NvbmZpZ3VyYXRpb25QYWdlX1NlbGVjdGVkPVNlbGVjdGVkOiANCi1DaGVja2xpc3RPcmRlcl9kZXNjcmlwdGlvbj1cdWFjODBcdWMwYWMgXHVkNTZkXHViYWE5XHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YWNlMCBcdWM3MDRcdWI4NWMgXHViNjEwXHViMjk0IFx1YzU0NFx1Yjc5OFx1Yjg1Y1x1Yjk3YyBcdWQwNzRcdWI5YWRcdWQ1NThcdWM1ZWMgXHVkNTc0XHViMmY5IFx1YzIxY1x1YzExY1x1Yjk3YyBcdWJjYzBcdWFjYmRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotRWxlbWVudHNWaWV3X3JlbmFtaW5nX3RleHQ9XHVjNzc0XHViOTg0XHVjNzQ0IFx1YmMxNFx1YWZiOFx1YjI5NCBcdWM5MTEuLi4NCi1Qcm9jZXNzRWRpdG9yX01vZGVsSW5mbz1cdWJhYThcdWIzNzggXHVjODE1XHViY2Y0DQotUHJvY2Vzc0VkaXRvcl9QcmVmaXg9XHVjODExXHViNDUwXHViZDgwDQotTW92ZURpYWxvZ19tb3ZlX3RleHQ9XHVjNzc0XHViM2Q5DQotQ2hlY2tsaXN0T3JkZXJfdGl0bGU9XHVhYzgwXHVjMGFjIFx1ZDU2ZFx1YmFhOSBcdWMyMWNcdWMxMWMgXHVjOWMwXHVjODE1DQotUHJvY2Vzc0VkaXRvcl9SZXBldGFibGU9XHViYzE4XHViY2Y1IFx1YWMwMFx1YjJhNVx1ZDU2OA0KLVByb2Nlc3NFZGl0b3JfT25nb2luZz1cdWM5YzRcdWQ1ODkgXHVjOTExXHVjNzg0DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3luY2hyb25pemF0aW9uPVx1YjNkOVx1YWUzMFx1ZDY1NC4uLg0KLVByb2Nlc3NFZGl0b3JfRXZlbnREcml2ZW49XHVjNzc0XHViY2E0XHVkMmI4XHViODVjIFx1YWQ2Y1x1YjNkOVx1YjQyOA0KLVByb2Nlc3NFZGl0b3JfRGVsaXZlcmFibGU9XHVjNzc4XHViM2M0XHViYjNjDQotUHJvY2Vzc0VkaXRvcl9PcHRpb25hbD1cdWMxMjBcdWQwZGRcdWM4MDENCi1GaWx0ZXJEaWFsb2dfVHlwZV90ZXh0PVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWM2OTRcdWMxOGMgXHVjNzIwXHVkNjE1Og0KLUZpbHRlckRpYWxvZ19FeHBhbmRBbGw9XHViYWE4XHViNDUwIFx1ZDNiY1x1Y2U1OFx1YWUzMA0KLU1vdmVEaWFsb2dfbW92aW5nX3RleHQ9XHVjNzc0XHViM2Q5IFx1YzkxMS4uLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbldhcm5pbmc9SVVQQTAwMjVXOiB7MH1cdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmFhOFx1YzU5MSBcdWM1NDRcdWM3NzRcdWNmNThcdWM3NzQgezF9IFx1YWNiZFx1Yjg1Y1x1YzVkMCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkU2hhcGVJY29uRXJyb3I9SVVQQTAwMjVFOiBcdWM2MjRcdWI5NTg6IFx1YmFhOFx1YzU5MSBcdWM1NDRcdWM3NzRcdWNmNTggXHVjMTM5XHVjMTU4OiB7MH0NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX05hbWVMYWJlbD1cdWM3NzRcdWI5ODQ6DQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1cdWMwYzggXHViYTU0XHVjMThjXHViNGRjIFx1YWQ2Y1x1YzEzMSBcdWM3OTFcdWMxMzENCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfTmFtZUxhYmVsPVx1Yzc3NFx1Yjk4NDoNCi1BdXRob3JpbmdVSVBsdWdpbl9uZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlPVx1YzBjOCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VUaXRsZT1cdWMwYzggXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWM3OTFcdWMxMzENCi1uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlPVx1YzBjOCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVUaXRsZT1cdWJjYzBcdWFjYmRcdWMwYWNcdWQ1NmQgXHVjODAwXHVjN2E1DQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1cdWMwYzggXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzc0XHViOTg0LCBcdWMxMjRcdWJhODUgXHViYzBmIFx1YjMwMFx1YzBjMSBcdWI1MTRcdWI4MDlcdWQxYTBcdWI5YWNcdWI5N2MgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlRGVzY3JpcHRpb249XHVkNTU4XHViMDk4IFx1Yzc3NFx1YzBjMVx1Yzc1OCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNjk0XHVjMThjXHVhYzAwIFx1YzIxOFx1YzgxNVx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjODAwXHVjN2E1XHVkNTc0XHVjNTdjIFx1ZDU2MCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNjk0XHVjMThjXHViOTdjIFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxIFx1YzVmNFx1YWUzMA0KLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uV2l6YXJkX3dpbmRvd1RpdGxlPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzEgXHVjNWY0XHVhZTMwDQotRWxlbWVudHNWaWV3X3JlcGxhY2Vpbmd3aXRoZm9ybWF0X3RleHQ9ezB9XHVjNzQ0KFx1Yjk3YykgXHViYzE0XHVhZmI4XHViMjk0IFx1YzkxMS4uLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uV2FybmluZz1JVVBBMDAyNlc6IHswfVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHViMTc4XHViNGRjIFx1YzU0NFx1Yzc3NFx1Y2Y1OFx1Yzc3NCB7MX0gXHVhY2JkXHViODVjXHVjNWQwIFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1NZXNzYWdlTGFiZWxQcm92aWRlcl91bnNlbGVjdGVkcGFja2FnZXM9XHVjMTIwXHVkMGRkXHVkNTU4XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWQzMjhcdWQwYTRcdWM5YzBcdWM3NTggXHVjNjk0XHVjMThjXHViOTdjIFx1Y2MzOFx1Yzg3MFx1ZDU1OFx1YjI5NCBcdWM2OTRcdWMxOGNcdWFjMDAgJyd7MH0nJ1x1YzVkMCBcdWQzZWNcdWQ1NjhcdWI0MThcdWM1YjQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0Lg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uRXJyb3I9SVVQQTAwMjZFOiBcdWM2MjRcdWI5NTg6IFx1YjE3OFx1YjRkYyBcdWM1NDRcdWM3NzRcdWNmNTggXHVjMTM5XHVjMTU4OiB7MH0NCi1TdGVwc09yZGVyRGlhbG9nX3N0ZXBzPVx1YjJlOFx1YWNjNDogDQotU3RlcHNPcmRlckRpYWxvZ190aXRsZT1cdWQwYzBcdWMyYTRcdWQwNmMgXHViMmU4XHVhY2M0IFx1YzIxY1x1YzExYyBcdWM5YzBcdWM4MTUNCi1Qcm9jZXNzRWRpdG9yX1BsYW5uZWQ9XHVhY2M0XHVkNjhkXHViNDI4DQotc3BlY2lmeWRpcmVjdG9yeV90ZXh0PVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHVjODAwXHVjN2E1XHVkNTYwIFx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhY1x1Yjk3YyBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzPVx1YjJlNFx1YzkxMSBcdWJjMWNcdWMwZGQNCi1Qcm9jZXNzRWRpdG9yX0VudHJ5U3RhdGU9XHVjMmRjXHVjNzkxIFx1YzBjMVx1ZDBkYw0KLVByb2Nlc3NFZGl0b3JfRXhpdFN0YXRlPVx1Yzg4NVx1YjhjYyBcdWMwYzFcdWQwZGMNCi1zZWxlY3RDb2x1bW5zdG9BZGRfdGV4dD1cdWNkOTRcdWFjMDBcdWQ1NjAgXHVjNWY0XHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1Qcm9jZXNzRWRpdG9yX1R5cGU9XHVjNzIwXHVkNjE1DQotUHJvY2Vzc0VkaXRvcl9UZWFtPVx1ZDMwMA0KLUZpbHRlckRpYWxvZ190aXRsZT1cdWMxMjBcdWQwZGQgXHViMzAwXHVkNjU0IFx1YzBjMVx1Yzc5MDogDQotDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWNlZThcdWQxNTBcdWNlMjBcdWM1ZDBcdWMxMWMgXHVjZDk0XHVhYzAwKCZNKS4uLg0KLUZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbD1cdWJhYThcdWI0NTAgXHVjODExXHVhZTMwDQotT3BlbkNoZWF0c2hlZXRWaWV3X3RpdGxlPVx1Y2U1OFx1ZDJiOCBcdWMyZGNcdWQyYjggXHViY2Y0XHVhZTMwIFx1YzVmNFx1YWUzMA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxVcD1cdWI4NjRcdWM1YzUNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Sb2xsRG93bj1cdWI4NjRcdWIyZTRcdWM2YjQNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXA9XHVjNzA0XHViODVjIFx1Yzc3NFx1YjNkOSgmTykNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlRG93bj1cdWM1NDRcdWI3OThcdWI4NWMgXHVjNzc0XHViM2Q5KCZXKQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbD1cdWQ0NWNcdWMyZGMoJkEpDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29weT1cdWJjZjVcdWMwYWMoJkMpLi4uDQotRmlsdGVyRGlhbG9nX1BhdHRlcm5fdGV4dD1cdWM3NzRcdWI5ODQgXHVkMzI4XHVkMTM0KFx1Yzc3Y1x1Y2U1OFx1ZDU1OFx1YjI5NCBcdWM3NzRcdWI5ODRcdWM3NzQgXHVkNDVjXHVjMmRjXHViNDI4KTogDQotTWV0aG9kTGlicmFyeUVkaXRvcl90aXRsZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjOiANCi0jTWVzc2FnZVZpZXdfc2VsZWN0ZWRfdGV4dD1TZWxlY3RlZDogDQotTWVzc2FnZVZpZXdfZXJybXNnX3RleHQ9XHVjMTI0XHViYTg1DQotRWxlbWVudHNWaWV3X2Vycl9zYXZpbmc9SVVQQTAwMjdFOiAnJ3swfScnXHVjNzQ0KFx1Yjk3YykgXHVjODAwXHVjN2E1XHVkNTU4XHViMjk0IFx1YzkxMVx1YzVkMCBcdWM2MjRcdWI5NTggXHViYzFjXHVjMGRkKHsxfSkNCi0NCi1lcnJfY29weWluZ19maWxlX3RpdGxlPVx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWJjZjVcdWMwYWNcdWQ1NThcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OCBcdWJjMWNcdWMwZGQNCi1lcnJfY29weWluZ19maWxlX2Vycm9yPUlVUEEwMDI4RTogXHVjNTQ0XHVjNzc0XHVjZjU4XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiANCi1lcnJfY29weWluZ19maWxlX3JlYXNvbj1cdWMxMjBcdWQwZGRcdWQ1NWMgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YmNmNVx1YzBhY1x1ZDU1OFx1YjI5NCBcdWM5MTFcdWM1ZDAgXHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWJjZjRcdWI4MjRcdWJhNzQgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkXHVjNzQ0IFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1lcnJfcHJvY2Vzc2luZ19maWxlX3RpdGxlPVx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWNjOThcdWI5YWNcdWQ1NThcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OCBcdWJjMWNcdWMwZGQNCi1lZGl0Q29uZmlndXJhdGlvbl90b29sdGlwPVx1YWQ2Y1x1YzEzMSBcdWQzYjhcdWM5ZDENCi1lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQ9SVVQQTAwMTVFOiBcdWM2OTRcdWMxOGNcdWI5N2MgXHVkM2I4XHVjOWQxXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotU2F2ZVRoaXNBY3Rpb25fc2F2ZW9iamVjdD1cdWM3NzQgXHVjNjI0XHViZTBjXHVjODFkXHVkMmI4IFx1YzgwMFx1YzdhNS4uLg0KLUVsZW1lbnRzVmlld19yZXBsYWNlX3RleHQ9XHViYzE0XHVhZmI4XHVhZTMwDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRXh0ZW5kPVx1ZDY1NVx1YzdhNSgmRSkuLi4NCi1Nb3ZlRGlhbG9nX2Rlc3RpbmF0aW9uX3RleHQ9XHVjMTIwXHVkMGRkXHVkNTVjIFx1YzY5NFx1YzE4Y1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHViMzAwXHVjMGMxIFx1YzEyMFx1ZDBkZDoNCi1jaG9vc2VEZWZhdWx0RGlyZWN0b3J5X3RleHQ9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWFlMzBcdWJjZjggXHViNTE0XHViODA5XHVkMWEwXHViOWFjIFx1YzEyMFx1ZDBkZDoNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzcz1cdWM1YjVcdWM4MWMoJlMpDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3MyPVx1YWNmNVx1YWMxYyBcdWM2MzVcdWMxNTgoJlApLi4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXNzaWduVXNlckRpYWdyYW09XHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OCBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTgoJlUpLi4uDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3RpdGxlPVx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NTggXHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4IFx1YzljMFx1YzgxNQ0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZEltYWdlPVx1ZDY1Y1x1YjNkOSBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTg6DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkZEltYWdlPVx1ZDY1Y1x1YjNkOSBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmQgXHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4Og0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ193cGRJbWFnZT1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1Yzg4NVx1YzE4ZFx1YzEzMSBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTg6DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX25vdGFGaWxlPUlVUEEwMDA0RTogXHVjOWMwXHVjODE1XHViNDFjIFx1YWNiZFx1Yjg1Y1x1YWMwMCBcdWQzMGNcdWM3N2NcdWM3NzQgXHVjNTQ0XHViMmQ5XHViMmM4XHViMmU0Lg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hc3NpZ25CdXR0b249XHVjMTIwXHVkMGRkLi4uDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2VudGVyZWRJbWFnZU5vdEZvdW5kPUlVUEEwMDI0RTogXHVjOWMwXHVjODE1XHViNDFjIFx1Yzc3NFx1YmJmOFx1YzljMFx1YWMwMCBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM1ZDAgXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHViOGU4XHVkMmI4IFx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhY1x1Yzc1OCBcdWMwYzFcdWIzMDAgXHVhY2JkXHViODVjXHViOTdjIFx1Yzc4NVx1YjgyNVx1ZDU4OFx1YjI5NFx1YzljMCBcdWQ2NTVcdWM3NzhcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3NlbGVjdGVkSW1hZ2VOb3RGb3VuZD1JVVBBMDAzMEU6IFx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWM3NzRcdWJiZjhcdWM5YzBcdWFjMDAgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVjNWQwIFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURJbWFnZT1cdWNjM2VcdWM1NDRcdWJjZjRcdWFlMzAgXHViYzBmIFx1YWNmNVx1YWMxY1x1Yjk3YyBcdWM3MDRcdWQ1NzQgXHVkNjVjXHViM2Q5IFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOCBcdWM3NzRcdWJiZjhcdWM5YzAgXHVjMGFjXHVjNmE5DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZUFEREltYWdlPVx1Y2MzZVx1YzU0NFx1YmNmNFx1YWUzMCBcdWJjMGYgXHVhY2Y1XHVhYzFjXHViOTdjIFx1YzcwNFx1ZDU3NCBcdWQ2NWNcdWIzZDkgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOCBcdWM3NzRcdWJiZjhcdWM5YzAgXHVjMGFjXHVjNmE5DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZVdQREltYWdlPVx1Y2MzZVx1YzU0NFx1YmNmNFx1YWUzMCBcdWJjMGYgXHVhY2Y1XHVhYzFjXHViOTdjIFx1YzcwNFx1ZDU3NCBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1Yzg4NVx1YzE4ZFx1YzEzMSBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTggXHVjNzc0XHViYmY4XHVjOWMwIFx1YzBhY1x1YzZhOQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvbnRyaWJ1dGU9XHViODVjXHVjZWVjIFx1YmQ4NFx1YmMzMA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JlcGxhY2U9XHViODVjXHVjZWVjIFx1YmMxNFx1YWZiOFx1YWUzMA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0RpYWdyYW1zPVx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOCgmRykNCi1Qcm9jZXNzRWRpdG9yX2FjdGlvbl9kZWVwQ29weT1cdWM4MDRcdWNjYjQgXHViY2Y1XHVjMGFjKCZEKS4uLg0KLUZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uPVx1YWMwNFx1YjdiNVx1ZDU1YyBcdWMxMjRcdWJhODU6DQotQ29uZmlndXJhdGlvblBhZ2VfaGlkZVRvb2xUaXA9XHVjMTIwXHVkMGRkIFx1Y2RlOFx1YzE4Y1x1ZDU1YyBcdWM2OTRcdWMxOGMgXHVkNDVjXHVjMmRjL1x1YzIyOFx1YWUzMFx1YWUzMA0KLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uPVx1YzEyNFx1YmE4NToNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc0FsbD1cdWFjZjVcdWFjMWMgXHVjNWM2XHVjNzRjDQotRmlsdGVyRGlhbG9nX1BhdHRlcm5fZGVzY3JpcHRpb249XHVkMzI4XHVkMTM0XHVjNzQwIFx1YzI3Y1x1ZDQ1Y1x1Yjg1YyBcdWFkNmNcdWJkODRcdWI0MjlcdWIyYzhcdWIyZTQuIFx1YzVlY1x1YWUzMFx1YzExYyAqXHViMjk0IFx1YmIzOFx1Yzc5MFx1YzVmNCwgP1x1YjI5NCBcdWJiMzhcdWM3OTBcdWM3ODVcdWIyYzhcdWIyZTQuDQotQ29uZmlndXJhdGlvblBhZ2VfVHJlZVRpdGxlTGFiZWw9XHVjZWU4XHVkMTUwXHVjZTIwOg0KLUNvbmZpZ3VyYXRpb25QYWdlX0xvYWRpbmdNZXNzYWdlPVx1YWQ2Y1x1YzEzMVx1Yzc0NCBcdWI4NWNcdWI0ZGNcdWQ1NThcdWIyOTQgXHVjOTExXHVjNzg1XHViMmM4XHViMmU0LiBcdWFlMzBcdWIyZTRcdWI5YWNcdWMyZWRcdWMyZGNcdWM2MjQuDQotTW92ZURpYWxvZ192YWxpZGRlc3RpbmF0aW9uX3RleHQ9XHVjOWMwXHVjODE1XHViNDFjIFx1Yzc3NFx1YjNkOSBcdWIzMDBcdWMwYzFcdWM3NzQgXHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4NCi1Nb3ZlRGlhbG9nX2Nhbm5vdE1vZGlmeURlc3RpbmF0aW9uPUlVUEEwMDM0RTogXHVjMTIwXHVkMGRkXHVkNTVjIFx1YjMwMFx1YzBjMVx1Yzc0NCBcdWMyMThcdWM4MTVcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGw9XHViYWE4XHViNDUwIFx1YWNmNVx1YWMxYw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5CYXNlQWN0aXZpdHk9XHVhZTMwXHViY2Y4IFx1ZDY1Y1x1YjNkOSBcdWM1ZjRcdWFlMzANCi1Qcm9jZXNzRm9ybUVkaXRvcl9leHBhbkFsbEFjdGlvbkxhYmVsPVx1YmFhOFx1YjQ1MCBcdWQzYmNcdWNlNThcdWFlMzAoJlgpDQotUHJvY2Vzc0Zvcm1FZGl0b3JfY29sbGFwc2VBbGxBY3Rpb25MYWJlbD1cdWJhYThcdWI0NTAgXHVjODExXHVhZTMwKCZMKQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURpYWdyYW09XHVkNjVjXHViM2Q5IFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOCBcdWM1ZjRcdWFlMzAoJkEpDQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVJldmVhbD1cdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmRcdWM1ZDAgXHViMDk4XHVjNWY0XHViNDFjIFx1YzViNVx1YzgxY1x1YjQxOFx1YzljMCBcdWM1NGFcdWM3NDAgXHVjMTI0XHViYTg1XHVjNzkwXHViOTdjIFx1YzEyMFx1ZDBkZFx1YjQxYyBcdWM2OTRcdWMxOGNcdWFjMDAgXHViMDk4XHVkMGMwXHViMDljIFx1ZDZjNCwgXHVjOTExXHViY2Y1IFx1YmMyOVx1YzljMFx1Yjk3YyBcdWM3MDRcdWQ1NzQgXHVjMGFkXHVjODFjXHVkNTc0XHVjNTdjIFx1ZDU2OVx1YjJjOFx1YjJlNC4gXHVjMGFkXHVjODFjXHVkNTU4XHVhY2UwIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YjgyNFx1YmE3NCBcdWQ2NTVcdWM3NzhcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9TZWxlY3RDb2x1bW5zPVx1Y2Q5NFx1YWMwMFx1ZDU2MCBcdWM1ZjRcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURldGFpbERpYWdyYW09XHVkNjVjXHViM2Q5IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZCBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTggXHVjNWY0XHVhZTMwKCZEKQ0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9Db2x1bW5TZWxlY3Rpb249XHVjNWY0IFx1YzEyMFx1ZDBkZFx1YzBhY1x1ZDU2ZDoNCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3dpdGNoQ29uZmlndXJhdGlvbj1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVkM2I4XHVjOWQxXHVhZTMwXHVhYzAwIFx1ZDY1Y1x1YzEzMVx1ZDY1NFx1YjQxOFx1YmE3NCBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVhZTMwXHViY2Y4IFx1YWQ2Y1x1YzEzMVx1YzczY1x1Yjg1YyBcdWM4MDRcdWQ2NTgNCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3VwcHJlc3Npb25Hcm91cFRpdGxlPVx1YzViNVx1YzgxYw0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9pbmhlcml0U3VwcHJlc3Npb25TdGF0ZT1cdWM1YjVcdWM4MWMgXHVjMGMxXHVkMGRjIFx1YzBjMVx1YzE4ZA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjODg1XHVjMThkXHVjMTMxIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOCBcdWM1ZjRcdWFlMzAoJlcpDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw9XHVjOWMwXHVjNmIwXHVhZTMwDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9XHVjMTIwXHVkMGRkLi4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fSW5zZXJ0TmV3UGhhc2U9XHVjMGM4IFx1YjJlOFx1YWNjNCBcdWMwYmRcdWM3ODUNCi1WaWV3SGVscGVyX3JlbG9hZExpYk9uUm9sbGJhY2tFcnJvcj1cdWM5YzBcdWMxOGRcdWMxMzEgXHVjNjI0XHViOTU4XHViOTdjIFx1YmNmNVx1YWQ2Y1x1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHVjNmQwXHViNzk4IFx1YzBjMVx1ZDBkY1x1Yjg1YyBcdWJjZjVcdWM2ZDBcdWQ1NThcdWI4MjRcdWJhNzQgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YjJlNFx1YzJkYyBcdWI4NWNcdWI0ZGNcdWQ1NzRcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0Lg0KLVZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRfdGV4dD0nJ3swfScnIFx1YzY5NFx1YzE4Y1x1YWMwMCBcdWM3NzRcdWJiZjggXHVjMGFkXHVjODFjXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0Lg0KLVZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRjb25maXJtX3RleHQ9Jyd7MH0nJyBcdWM2OTRcdWMxOGNcdWFjMDAgXHVjNzc0XHViYmY4IFx1YzBhZFx1YzgxY1x1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzc0XHViOTdjICcnezF9JydcdWM1ZDBcdWMxMWMgXHVjODFjXHVhYzcwXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLUNvbmZpZ3VyYXRpb25QYWdlX0FkZE1pc3NpbmdUb29sVGlwPVx1YjIwNFx1Yjc3ZFx1YjQxYyBcdWNjMzhcdWM4NzAgXHVjZDk0XHVhYzAwDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb249XHVjMTI0XHViYTg1DQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uR2VuZXJhbEluZm89XHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNCANCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BcHBseVBhdHRlcm49XHVkMzI4XHVkMTM0IFx1YzgwMVx1YzZhOSgmVCkNCi1Nb3ZlRGlhbG9nX3NlbGVjdGRlc3RpbmF0aW9uX3RleHQ9XHViMzAwXHVjMGMxXHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1Nb3ZlRGlhbG9nX25vbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZz1cdWM3NzRcdWIzZDkgXHViMzAwXHVjMGMxXHVjNzc0IFx1YzljMFx1YzgxNVx1YjQxOFx1YzljMCBcdWM1NGFcdWM1NThcdWMyYjVcdWIyYzhcdWIyZTQuDQotTWV0aG9kTGlicmFyeUVkaXRvcl90cm91Ymxlb2JqZWN0PS4gXHViYjM4XHVjODFjXHVjODEwIFx1YzYyNFx1YmUwY1x1YzgxZFx1ZDJiODogDQotTWVzc2FnZUxhYmVsUHJvdmlkZXJfZXJyY2hpbGRwa2dzPVx1ZDU1OFx1YzcwNCBcdWNlZThcdWQxNTBcdWNlMjAgXHVkMzI4XHVkMGE0XHVjOWMwIFx1YjYxMFx1YjI5NCBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTRcdWM1ZDAgXHViMjA0XHViNzdkXHViNDFjIFx1Y2MzOFx1Yzg3MFx1Yjk3YyBcdWFjMDBcdWM5YzQgXHVjNjk0XHVjMThjXHVhYzAwIFx1ZDNlY1x1ZDU2OFx1YjQxOFx1YzViNCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19UaXRsZT1cdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTggXHVhY2Y1XHVhYzFjIFx1YzYzNVx1YzE1OA0KLVByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfTWVzc2FnZT1cdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YThcdWM3NDQgXHVhY2Y1XHVhYzFjXHVkNTU4XHViODI0XHViYTc0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YWNlMCBcdWFjZjVcdWFjMWNcdWQ1NThcdWM5YzAgXHVjNTRhXHVjNzNjXHViODI0XHViYTc0IFx1YzEyMFx1ZDBkZCBcdWNkZThcdWMxOGNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotUHJvY2Vzc0VkaXRvcl9UaXRsZT1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVkM2I4XHVjOWQxXHVhZTMwOiANCi1TYXZlQXN3aXRoZG90c190ZXh0PVx1YjJlNFx1Yjk3OCBcdWM3NzRcdWI5ODRcdWM3M2NcdWI4NWMgXHVjODAwXHVjN2E1Li4uDQotUHJvY2Vzc0VkaXRvcl9Xb3JrQnJlYWtkb3duU3RydWN0dXJlPVx1Yzc5MVx1YzVjNVx1YmQ4NFx1Yjk1OFx1Y2NiNFx1YWNjNChXQlMpDQotUHJvY2Vzc0VkaXRvcl9UZWFtQWxsb2NhdGlvbj1cdWQzMDAgXHVkNTYwXHViMmY5DQotUHJvY2Vzc0VkaXRvcl9Xb3JrUHJvZHVjdFVzYWdlPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjMGFjXHVjNmE5XHViYzk1DQotUHJvY2Vzc0VkaXRvcl9Db25zb2xpZGF0ZWRWaWV3PVx1ZDFiNVx1ZDU2OVx1YjQxYyBcdWJjZjRcdWFlMzANCi1Qcm9jZXNzRWRpdG9yX2NvbmZpcm1BdXRvU3luY2g9XHVjNzc0IFx1Yzg3MFx1Yzc5MVx1Yzc0MCBcdWQyYjlcdWMxMzEgXHViY2Y0XHVhZTMwXHVjNzU4IFx1Yzc3Y1x1YmMxOCBcdWQwZWRcdWM1ZDBcdWMxMWMgIlx1YzE4Y1x1YzJhNFx1YzY0MCBcdWIzZDlcdWFlMzBcdWQ2NTQiXHViODVjIFx1ZDQ1Y1x1YzJkY1x1YjQxYyBcdWMxMjBcdWQwZGRcdWI0MWMgXHVkNjVjXHViM2Q5IFx1YzU0NFx1Yjc5OFx1Yzc1OCBcdWMxMjBcdWQwZGRcdWI0MWMgXHVjMTI0XHViYTg1XHVjNzkwIFx1YjYxMFx1YjI5NCBcdWJhYThcdWI0ZTAgXHVjMTI0XHViYTg1XHVjNzkwXHViOTdjIFx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNjlcdWIyYzhcdWIyZTQuIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWFlMzBcdWJjZjggXHVhZDZjXHVjMTMxIFx1YzU0NFx1Yjc5OFx1Yzc1OCBcdWI5YzFcdWQwNmNcdWI0MWMgXHViYTU0XHVjMThjXHViNGRjIFx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWM2OTRcdWMxOGNcdWM3NTggXHVjNmQwXHViNzk4IFx1ZDJiOVx1YzEzMVx1YWNmYyBcdWQ1NjhcdWFlZDggXHVjMTI0XHViYTg1XHVjNzkwXHViOTdjIFx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNjlcdWIyYzhcdWIyZTQuIFx1YjljMVx1ZDA2YyhcdWNkMDhcdWI4NWRcdWMwYzkgXHVhZTMwXHVjNmI4XHVjNzg0XHVjY2I0KVx1YjQxYyBcdWMxMjRcdWJhODVcdWM3OTBcdWIyOTQgXHVhYzMxXHVjMmUwXHVkNTU4XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4gXHVhY2M0XHVjMThkXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMT1cdWFkNmNcdWMxMzENCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjI9XHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4IFx1YmMwZiBcdWQzMjhcdWQwYTRcdWM5YzAgXHVjMTIwXHVkMGRkDQotTmV3TGlicmFyeURpYWxvZ19uZXdsaWJyYXJ5X2FzPVx1YjJlNFx1Yjk3OCBcdWM3NzRcdWI5ODRcdWM3M2NcdWI4NWMgXHVjMGM4IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWM3OTFcdWMxMzENCi1OZXdQbHVnaW5EaWFsb2dfbmV3cGx1Z2luX3RleHQ9XHVjMGM4IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzgNCi1TZWxlY3RFbGVtZW50RGlhbG9nX3RpdGxlX3RleHQ9XHVjNjk0XHVjMThjXHViMDk4IFx1YzY5NFx1YzE4Y1x1Yzc1OCBcdWNlZThcdWQyYjhcdWI5YWNcdWJkZjBcdWQxMzAgXHVjOTExIFx1ZDU1OFx1YjA5OFx1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotT3BlbkNvbmZpZ0RpYWxvZ25ld2NvbmZpZ190ZXh0PVx1YzBjOCBcdWFkNmNcdWMxMzE6DQotcHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlX0JTRWRpdG9yPVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWQzYjhcdWM5ZDFcdWFlMzANCi0NCi0jIEFic3RyYWN0RGlhZ3JhbUVkaXRvcg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1cdWI5ZGVcdWNkOTRcdWFlMzANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1cdWFlMzBcdWJjZjggXHVkNjVjXHViM2Q5XHVjNWQwXHVjMTFjIFx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNThcdWFlMzANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9XHVkNjE1XHVjMmRkIFx1ZDE0ZFx1YzJhNFx1ZDJiOCBcdWMwYzFcdWM3OTAuLi4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVx1ZDNjOVx1YWRlMFx1YzVkMCBcdWI5ZGVcdWNkYjAgXHVhYzAwXHViODVjXHViODVjDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1cdWNjOThcdWM3NGMgXHVjMTIwXHVkMGRkXHVjMGFjXHVkNTZkXHVjNWQwIFx1YjlkZVx1Y2RiMCBcdWFjMDBcdWI4NWNcdWI4NWMNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVx1ZDNjOVx1YWRlMFx1YzVkMCBcdWI5ZGVcdWNkYjAgXHVjMTM4XHViODVjXHViODVjDQotTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl90aXRsZT1cdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0DQotTW92ZURpYWxvZ19pbnZhbGlkX21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9SVVQQTAwNDFFOiBcdWMxMjBcdWQwZGRcdWQ1NWMgXHVjNjk0XHVjMThjXHViOTdjIFx1YzljMFx1YzgxNVx1YjQxYyBcdWIzMDBcdWMwYzFcdWM3M2NcdWI4NWMgXHVjNzc0XHViM2Q5XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlbW9kZWxsaWJyYXJ5PVx1YmFhOFx1YjM3OCBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVjODAwXHVjN2E1IFx1YzkxMS4uLg0KLU1ldGhvZExpYnJhcnlFZGl0b3JfZXJyb3JfZGlhbG9nX3RpdGxlPVx1YzYyNFx1Yjk1OA0KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZV9saWJyYXJ5X3Byb2JsZW1fbXNnPUlVUEEwMDMzRTogXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzgwMFx1YzdhNVx1ZDU1OFx1YjI5NCBcdWM5MTFcdWM1ZDAgXHViYjM4XHVjODFjXHVjODEwXHVjNzc0IFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dD0nJ3swfScnIFx1ZDU2ZFx1YmFhOVx1Yzc0NCBcdWMwYWRcdWM4MWNcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfQ29udGVudEVsZW1lbnRfdGV4dD1cdWNlZThcdWQxNTBcdWNlMjAgXHVjNjk0XHVjMThjOiANCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0Jyb3dzZUJ1dHRvbkxhYmVsPVx1Y2MzZVx1YzU0NFx1YmNmNFx1YWUzMC4uLg0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb249XHVjMGM4IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzFcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3NFx1Yjk4NFx1YWNmYyBcdWMxMjRcdWJhODVcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlVGl0bGU9XHViY2MwXHVhY2JkXHVjMGFjXHVkNTZkIFx1YzgwMFx1YzdhNSBcdWQ2YzQgXHViYWE4XHViNGUwIFx1ZDNiOFx1YzlkMVx1YWUzMCBcdWIyZWJcdWFlMzANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PVx1Y2M5OFx1Yzc0YyBcdWMxMjBcdWQwZGRcdWMwYWNcdWQ1NmRcdWM1ZDAgXHViOWRlXHVjZGIwIFx1YzEzOFx1Yjg1Y1x1Yjg1Yw0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQ9XHVjODAwXHVjN2E1DQotQXR0YWNobWVudERpYWxvZ2F0dGFjaEZpbGVfdGV4dD1cdWQzMGNcdWM3N2MgXHVjY2E4XHViZDgwDQotQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudD1cdWFkNmNcdWMxMzEgXHVjZWU4XHVkMTUwXHVjZTIwDQotT3BlbkNvbmZpZ0RpYWxvZ29wZW5jb25maWdfdGV4dD1cdWFkNmNcdWMxMzEgXHVjNWY0XHVhZTMwDQotRWxlbWVudHNWaWV3X3JlcGxhY2VBY3Rpb25fdGV4dD1cdWJjMTRcdWFmYjhcdWFlMzAuLi4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlPXswfSBcdWM4MDBcdWM3YTUgXHVjOTExDQotQ29uZmlndXJhdGlvblBhZ2VfU2hvd0Vycm9yVG9vbFRpcD1cdWFkNmNcdWMxMzEgXHVhY2JkXHVhY2UwIFx1Yjg1Y1x1YWRmOCBcdWQ0NWNcdWMyZGNcdWFlMzAgXHVkNDVjXHVjMmRjDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRm9ybVByZWZpeD1cdWFkNmNcdWMxMzE6IA0KLUNoZWNrbGlzdE9yZGVyX2NoZWNrbGlzdGl0ZW1zX3RleHQ9XHVhYzgwXHVjMGFjIFx1ZDU2ZFx1YmFhOTogDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsPVx1YjE3OFx1YjRkYyBcdWM3NzRcdWIzZDkNCi1Db25maWd1cmF0aW9uUGFnZV9NYWtlQ2xvc3VyZVRvb2xUaXA9XHVjNzkwXHViM2Q5XHVjNzNjXHViODVjIFx1YzYyNFx1Yjk1OCBcdWMyMThcdWM4MTUNCi1OZXdQbHVnaW5EaWFsb2dfcmVmZXJlbmNlcGx1Z2luX3RleHQ9XHVjYzM4XHVjODcwIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3ODoNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfY3JlYXRlRnJlZVRleHRfdGV4dD1cdWJlNDRcdWM4MTVcdWQ2MTUgXHVkMTRkXHVjMmE0XHVkMmI4IFx1Yzc5MVx1YzEzMQ0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0xhYmVsPVx1YjE3OFx1YjRkYyBcdWM1NDRcdWM3NzRcdWNmNTggXHViYmY4XHViOWFjXHViY2Y0XHVhZTMwOg0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0PUlVUEEwMDMyVzogXHVjNWYwXHVhY2IwXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWM3NGMNCi1EaWFncmFtVmFsaWRhdGlvbl9lcnJfc2FtZXByZWRhbmRzdWNfdGV4dD1JVVBBMDAzM1c6IFx1YzEyMFx1ZDU4OSBcdWJjMGYgXHVkNmM0XHVkNTg5XHVhY2ZjIFx1YjNkOVx1Yzc3Y1x1ZDU1YyBcdWM3OTFcdWM1YzVcdWJkODRcdWI5NTggXHVjNjk0XHVjMThjXHViOTdjIFx1YWMwMFx1YzljOCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLSMgRWRpdG9yQ2hvb3Nlcg0KLUVkaXRvckNob29zZXJfbG9hZGRFcnJvckRsZ1RpdGxlPVx1ZDNiOFx1YzlkMVx1YWUzMCBcdWM1ZjRcdWFlMzANCi1FZGl0b3JDaG9vc2VyX1Jlc291cmNlc0Vycm9yPVx1Yzc3NCBcdWM2OTRcdWMxOGNcdWM1ZDAgXHVjNjI0XHViOTU4XHVhYzAwIFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVhY2M0XHVjMThkXHVkNTU4XHVhZTMwIFx1YzgwNFx1YzVkMCBcdWM3NzQgXHVjNjI0XHViOTU4XHViOTdjIFx1YzIxOFx1YzgxNVx1ZDU2MCBcdWFjODNcdWM3NDQgXHVhZDhjXHVjN2E1XHVkNTY5XHViMmM4XHViMmU0KFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZCBcdWNjMzhcdWM4NzApLlxuXA0KLVxuXA0KLVx1ZDNiOFx1YzlkMVx1YWUzMFx1Yjk3YyBcdWM1ZjRcdWM5YzAgXHVjNTRhXHVhY2UwIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YjgyNFx1YmE3NCBcdWQ2NTVcdWM3NzhcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiBcdWQzYjhcdWM5ZDFcdWFlMzBcdWI5N2MgXHVjNWY0XHViODI0XHViYTc0IFx1Yzc3NCBcdWIzMDBcdWQ2NTQgXHVjMGMxXHVjNzkwXHViOTdjIFx1YjJlYlx1YzczY1x1YzJlZFx1YzJkY1x1YzYyNC4NCi1Db25maWd1cmF0aW9uUGFnZV9Gb3JtUHJlZml4PVx1YWQ2Y1x1YzEzMTogDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uTmFtZT1cdWM3NzRcdWI5ODQ6DQotQXR0YWNobWVudERpYWxvZ0ZpbGVVUkxfdGV4dD1cdWQzMGNcdWM3N2MgVVJMOg0KLVN0ZXBzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb249XHViMmU4XHVhY2M0XHViOTdjIFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YWNlMCBcdWM3MDRcdWI4NWMgXHViNjEwXHViMjk0IFx1YzU0NFx1Yjc5OFx1Yjg1Y1x1Yjk3YyBcdWQwNzRcdWI5YWRcdWQ1NThcdWM1ZWMgXHViMmU4XHVhY2M0IFx1YzIxY1x1YzExY1x1Yjk3YyBcdWJjYzBcdWFjYmRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJfc2F2ZT1cdWM4MDBcdWM3YTVcdWQ1NThcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OCBcdWJjMWNcdWMwZGQNCi1NZXNzYWdlVmlld19lcnJlbGVtZW50X3RleHQ9XHVjYzM4XHVjODcwXHVkNTU4XHViMjk0IFx1YzY5NFx1YzE4Yw0KLU1lc3NhZ2VWaWV3X3JlZmVsZW1lbnRfdGV4dD1cdWNjMzhcdWM4NzBcdWI0MWMgXHVjNjk0XHVjMThjDQotDQotI0FjdGl2aXR5IERpYWdyYW0NCi1BY3Rpdml0eURpYWdyYW1FZGl0b3JfY3JlYXRlU3RhcnROb2RlX3RleHQ9XHVjMmRjXHVjNzkxIFx1YjE3OFx1YjRkYyBcdWM3OTFcdWMxMzENCi1Db25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50RGVzY3JpcHRpb249XHVjNzc0IFx1YWQ2Y1x1YzEzMVx1Yzc3NCBcdWQzZWNcdWQ1NjhcdWQ1NjAgXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OCwgXHVjZWU4XHVkMTUwXHVjZTIwIFx1ZDMyOFx1ZDBhNFx1YzljMCBcdWJjMGYgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHViOTdjIFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbl90ZXh0PVx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhY1x1Yzc1OCBcdWNlZThcdWQxNTBcdWNlMjAgXHVjNjk0XHVjMThjIFx1YzIxY1x1YzExYyBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4IFx1YjMwMFx1ZDY1NCBcdWMwYzFcdWM3OTANCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RpcmVjdG9yeUxhYmVsPVx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhYzoNCi1Sb290UHJlZlBhZ2VfZW5hYmxlcHJvY2Vzc2NvbnRyaWJ1dGlvbl90ZXh0PVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWNlZThcdWQyYjhcdWI5YWNcdWJkZjBcdWMxNTggXHVjMGFjXHVjNmE5DQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25fdGV4dD1cdWM3NzQgXHViYTU0XHVjMThjXHViNGRjIFx1YWQ2Y1x1YzEzMVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25MYWJlbD1cdWMxMjRcdWJhODU6DQotQ29udHJpYnV0aW9uU2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZT0nJ3swfScnXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWNlZThcdWQyYjhcdWI5YWNcdWJkZjBcdWQxMzAgXHVjMTIwXHVkMGRkDQotRWxlbWVudHNWaWV3X29wZW5WYXJpYWJpbGl0eURpYWxvZ0FjdGlvbl90ZXh0PVx1YmNjMFx1YzIxOCBcdWM2OTRcdWMxOGNcdWI4NWMgXHVjNWY0XHVhZTMwDQotVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3RpdGxlPScnezB9JydcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmNjMFx1YzIxOCBcdWMxMjBcdWQwZGQNCi1WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdmlld2VyTGFiZWw9Jyd7MH0nJ1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHViY2MwXHVjMjE4IFx1YzY5NFx1YzE4Yw0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19MYWJlbD1cdWJhYThcdWM1OTEgXHVjNTQ0XHVjNzc0XHVjZjU4IFx1YmJmOFx1YjlhY1x1YmNmNFx1YWUzMDoNCi1EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2RlbGV0ZV90ZXh0PVx1YzBhZFx1YzgxY1x1ZDU2MCBcdWMyMTggXHVjNWM2XHVjNzRjDQotQWN0aXZpdHlEaWFncmFtRWRpdG9yX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dD1cdWQ2NWNcdWIzZDkgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOCBcdWM1ZjRcdWFlMzAgDQotTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl9kZXNjcmlwdGlvbj1cdWM3NzQgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1cdWM5YzBcdWM2YjBcdWFlMzANCi1XUENvbXBhcnRtZW50RmlndXJlXzA9XHVjMGM4IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjMTI0XHViYTg1XHVjNzkwDQotcHJvbXB0Zm9yX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGRfdGV4dD1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVkM2I4XHVjOWQxXHVhZTMwXHVjNWQwXHVjMTFjIFx1Yzc5MVx1YzEzMVx1YjQxOFx1YzljMCBcdWM1NGFcdWM3NDAgXHVkNjVjXHViM2Q5IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZCBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTggXHVhY2Y1XHVhYzFjIFx1YjYxMFx1YjI5NCBcdWNjM2VcdWM1NDRcdWJjZjRcdWFlMzANCi1wcm9tcHRfZm9yX3B1Ymxpc2hfZXh0ZW5kX2FjdGl2aXR5X2RpYWdyYW09XHVjMjE4XHVjODE1XHViNDE4XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWQ2NWNcdWIzZDkgXHVkNjU1XHVjN2E1XHVjNzkwXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWQ2NWNcdWIzZDkgXHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4XHVjNzQ0IFx1YWNmNVx1YWMxY1x1ZDU1OFx1YWM3MFx1YjA5OCBcdWNjM2VcdWM1NDRcdWJjZjRcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotI0NvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfTmFtZVBhdHRlcm49XHVjNzc0XHViOTg0IFx1ZDMyOFx1ZDEzNChcdWM3N2NcdWNlNThcdWQ1NThcdWIyOTQgXHVjNzc0XHViOTg0XHVjNzc0IFx1ZDQ1Y1x1YzJkY1x1YjQyOCk6DQotc2hvd0luUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb25fbGFiZWw9XHVjNzkwXHVjNmQwIFx1YjEyNFx1YmU0NFx1YWM4Y1x1Yzc3NFx1ZDEzMFx1YzVkMCBcdWQ0NWNcdWMyZGMNCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19QYXR0ZXJuPVx1ZDMyOFx1ZDEzNFx1Yzc0MCBcdWMyN2NcdWQ0NWNcdWI4NWMgXHVhZDZjXHViZDg0XHViNDI5XHViMmM4XHViMmU0LiBcdWM1ZWNcdWFlMzBcdWMxMWMgKlx1YjI5NCBcdWJiMzhcdWM3OTBcdWM1ZjQsID9cdWIyOTQgXHViYjM4XHVjNzkwXHVjNzg1XHViMmM4XHViMmU0Lg0KLWVycl9wcm9jZXNzaW5nX2ZpbGVfZGVzY3JpcHRpb249SVVQQTAwMjlFOiBcdWMxMjBcdWQwZGRcdWQ1NWMgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1Y2M5OFx1YjlhY1x1ZDU1OFx1YjI5NCBcdWM5MTFcdWM1ZDAgXHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWJjZjRcdWI4MjRcdWJhNzQgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkXHVjNzQ0IFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19DYXRlZ29yeVR5cGU9XHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjIFx1YzcyMFx1ZDYxNToNCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19CcmllZkRlc2NyaXB0aW9uPVx1YWMwNFx1YjdiNVx1ZDU1YyBcdWMxMjRcdWJhODU6DQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfU2VsZWN0Q2F0ZWdvcmllcz1cdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMgXHVjMTIwXHVkMGRkDQotDQotI2xvZyBtZXNzYWdlcw0KLWNoZWF0c2hlZXRfbG9hZF9mYWlsdXJlX2xvZ19tc2c9XHVjNjk0XHVjY2FkXHVkNTVjIFx1Y2U1OFx1ZDJiOCBcdWMyZGNcdWQyYjhcdWI5N2MgXHVjNWY0IFx1YzIxOCBcdWM1YzZcdWM3NGM6IA0KLQ0KLW5ld0NvbmZpZ3VyYXRpb25XaXJhemRfY3JlYXRlRXJyb3I9SVVQQTAwMzVFOiBcdWFkNmNcdWMxMzFcdWM3NDQgXHVjNzkxXHVjMTMxXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotbmV3UGx1Z2luV2l6YXJkX2NyZWF0ZUVycm9yPUlVUEEwMDM2RTogXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzQ0IFx1Yzc5MVx1YzEzMVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWVycm9yRGlhbG9nX21vdmVFcnJvcj1JVVBBMDAzN0U6IFx1YzY5NFx1YzE4Y1x1Yjk3YyBcdWM3NzRcdWIzZDlcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1yZW5hbWVEaWFsb2dfcmVuYW1lRXJyb3I9SVVQQTAwMzhFOiBcdWM2OTRcdWMxOGMgXHVjNzc0XHViOTg0XHVjNzQ0IFx1YmMxNFx1YWZjMCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWVycm9yRGlhbG9nX2NyZWF0ZUVycm9yPUlVUEEwMDM5RTogXHVjNjk0XHVjMThjXHViOTdjIFx1Yzc5MVx1YzEzMVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWR1cGxpY2F0ZVBsdWdpbk5hbWVFcnJvcl9tc2c9SVVQQTAxMDFFOiBcdWM3NzRcdWI5ODRcdWM3NzQgJyd7MH0nJ1x1Yzc3OCBcdWQ1NmRcdWJhYTlcdWM3NzQgXHVjNzc0XHViYmY4IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHViMmU0XHViOTc4IFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWM3ODVcdWI4MjVcdWQ1NThcdWFjZTAgXHViMmU0XHVjMmRjIFx1YzJkY1x1YjNjNFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jTmV3IFN0cmluZ3MgZm9yIFByb2Nlc3NFZGl0b3IgQ29udGV4dCBtZW51IGRpYWdyYW0gaW1hZ2VzDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkQURJbWFnZT1BRCBcdWM3NzRcdWJiZjhcdWM5YzAgXHVjOWMwXHVjODE1Li4uDQotUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JUaXRsZT1cdWMwYzhcdWI4NWMgXHVhY2UwXHVjZTU4XHVhZTMwIFx1YzYyNFx1Yjk1OA0KLVByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yTXNnPVx1ZDNiOFx1YzlkMVx1YWUzMCBcdWMwYzhcdWI4NWMgXHVhY2UwXHVjZTU4XHVhZTMwIFx1YzYyNFx1Yjk1OA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFEREltYWdlPUFERCBcdWM3NzRcdWJiZjhcdWM5YzAgXHVjOWMwXHVjODE1Li4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkV1BESW1hZ2U9V1BEIFx1Yzc3NFx1YmJmOFx1YzljMCBcdWM5YzBcdWM4MTUuLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VBREltYWdlSW5QdWJsaXNoaW5nPVx1YWNmNVx1YWMxY1x1YzVkMFx1YzExYyBBRCBcdWM3NzRcdWJiZjhcdWM5YzAgXHVjMGFjXHVjNmE5DQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVN1cHByZXNzPVx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZFx1YzVkMCBcdWIwOThcdWM1ZjRcdWI0MWMgXHVjNWI1XHVjODFjXHViNDFjIFx1YzEyNFx1YmE4NVx1Yzc5MFx1Yjk3YyBcdWMxMjBcdWQwZGRcdWI0MWMgXHVjNjk0XHVjMThjXHViOTdjIFx1YzViNVx1YzgxY1x1ZDU1YyBcdWQ2YzQsIFx1YzkxMVx1YmNmNSBcdWJjMjlcdWM5YzBcdWI5N2MgXHVjNzA0XHVkNTc0IFx1YzBhZFx1YzgxY1x1ZDU3NFx1YzU3YyBcdWQ1NjlcdWIyYzhcdWIyZTQuIFx1YzBhZFx1YzgxY1x1ZDU1OFx1YWNlMCBcdWFjYzRcdWMxOGRcdWQ1NThcdWI4MjRcdWJhNzQgXHVkNjU1XHVjNzc4XHVjNzQ0IFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VBRERJbWFnZUluUHVibGlzaGluZz1cdWFjZjVcdWFjMWNcdWM1ZDBcdWMxMWMgQUREIFx1Yzc3NFx1YmJmOFx1YzljMCBcdWMwYWNcdWM2YTkNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VXUERJbWFnZUluUHVibGlzaGluZz1cdWFjZjVcdWFjMWNcdWM1ZDBcdWMxMWMgV1BEIFx1Yzc3NFx1YmJmOFx1YzljMCBcdWMwYWNcdWM2YTkNCi1Qcm9jZXNzRWRpdG9yX0RpYWdyYW1JbWFnZV9JbnB1dERpYWxvZ19pbml0aWFsVmFsdWU9XHVjNzc0XHViYmY4XHVjOWMwIFx1YWNiZFx1Yjg1Yw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1Nob3dMaW5rZWRFbGVtZW50aW5MaWJyYXJ5Vmlldz1cdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHViY2Y0XHVhZTMwXHVjNWQwXHVjMTFjIFx1YjljMVx1ZDA2Y1x1YjQxYyBcdWM2OTRcdWMxOGMgXHVkNDVjXHVjMmRjKCZIKQ0KLVByb2Nlc3NFZGl0b3JfdXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbl9sYWJlbD1cdWFlMzBcdWJjZjhcdWM1ZDBcdWMxMWMgXHVjNWI1XHVjODFjIFx1YWMzMVx1YzJlMCgmQikNCi1Qcm9jZXNzRWRpdG9yX0NvbnRleHRNZW51X0RpYWdyYW1JbWFnZXM9XHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4IFx1Yzc3NFx1YmJmOFx1YzljMA0KLQ0KLSNTdHJpbmdzIGZvciBzeW5jaHJvbml6YXRpb24gd2l6YXJkIG9uIHByb2Nlc3MgZWRpdG9yJ3MgQlMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RpdGxlPVx1YjNkOVx1YWUzMFx1ZDY1NCBcdWMxMjRcdWJhODUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RleHQ9XHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OCBcdWIzZDlcdWFlMzBcdWQ2NTRcdWM3NTggXHVjMjE4XHVkNTg5XHVjNWQwIFx1YjMwMFx1ZDU3NCBcdWMxMjRcdWJhODVcdWQ1NWMgXHViMmU0XHVjNzRjXHVjNzU4IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM3N2RcdWM3M2NcdWMyZWRcdWMyZGNcdWM2MjQuDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9XHVhZDZjXHVjMTMxIFx1YzEyMFx1ZDBkZA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RleHQ9XHViM2Q5XHVhZTMwXHVkNjU0XHVjNWQwIFx1YzBhY1x1YzZhOVx1ZDU2MCBcdWFkNmNcdWMxMzFcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiBcDQotXHVjMGFjXHVjNmE5XHVjNzkwXHVjNzU4IFx1YzEyMFx1ZDBkZFx1Yzc3NCBcdWIzZDlcdWFlMzBcdWQ2NTRcdWM1ZDAgXHVjMGFjXHVjNmE5XHViNDIwIFx1YzgxY1x1YWNmNSBcdWJjMGYgXHViMzAwXHVjY2I0XHViOTdjIFx1YWNiMFx1YzgxNVx1ZDU2OVx1YjJjOFx1YjJlNC4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV9jb25maWdMYWJlbD1cdWFkNmNcdWMxMzE6DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RpdGxlPVx1YjNkOVx1YWUzMFx1ZDY1NFx1ZDU2MCBcdWQyYjlcdWMxMzEgXHVjMTIwXHVkMGRkDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Byb3BlcnRpZXNfbGFibGU9XHVkMmI5XHVjMTMxDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX25hbWVfbGFibGU9XHVjNzc0XHViOTg0DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByZXNlbnRhdGlvbk5hbWVfbGFibGU9XHVkNDVjXHVjMmRjIFx1Yzc3NFx1Yjk4NA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9icmllZkRlc2NfbGFibGU9XHVhYzA0XHViN2I1XHVkNTVjIFx1YzEyNFx1YmE4NQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9vcHRpb25hbElub3V0c19sYWJlbD1cdWMxMjBcdWQwZGRcdWM4MDEgXHVjNzg1XHViODI1DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX21hbmRhdG9yeUlucHV0c19sYWJsZT1cdWQ1NDRcdWMyMTggXHVjNzg1XHViODI1DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX291dHB1dHNfbGFiZWw9XHVjMGIwXHVjZDljXHViYjNjDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbGFiZWw9XHVhZTMwXHViY2Y4IFx1YzIxOFx1ZDU4OVx1Yzc5MA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9hZGRuUGVyZm9ybWVyc19sYWJsZT1cdWNkOTRcdWFjMDAgXHVjMjE4XHVkNTg5XHVjNzkwDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Jlc3BvbnNpYmxlUm9sZXNfbGFibGU9XHVjYzQ1XHVjNzg0XHVjNzQ0IFx1YjllMVx1Yzc0MCBcdWM1ZWRcdWQ1NjANCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfY29udG5BcnRpZmFjdHNfbGFiZWw9XHVkM2VjXHVkNTY4XHViNDFjIFx1YzU0NFx1ZDJmMFx1ZDMyOVx1ZDJiOA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9kaWx2ZWRQYXJ0c19sYWJlbD1cdWM3NzhcdWIzYzRcdWJiM2MgXHVkMzBjXHVkMmI4DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3NlbFN0ZXBzX2xhYmVsPVx1YzEyMFx1ZDBkZCBcdWIyZThcdWFjYzQNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGV4dD1cdWIzZDlcdWFlMzBcdWQ2NTRcdWM1ZDAgXHVhY2UwXHViODI0XHVkNTYwIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWNlZThcdWQxNTBcdWNlMjBcdWM3NTggXHVkMmI5XHVjMTMxXHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGl0bGU9XHViM2Q5XHVhZTMwXHVkNjU0IFx1YmJmOFx1YjlhY1x1YmNmNFx1YWUzMA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90ZXh0PVx1YzU0NFx1Yjc5OFx1Yzc1OCBcdWM2OTRcdWNjYWRcdWQ1NWMgXHViM2Q5XHVhZTMwXHVkNjU0IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWFjODBcdWQxYTBcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotc2VsZWN0RWRpdG9yc1RvRGlzY2FyZENvbmZsaWN0Q2hhbmdlcz1cdWQzYjhcdWM5ZDFcdWFlMzAgXHVjNjc4XHViZDgwXHVjNzU4IFx1YmNjMFx1YWNiZFx1YzBhY1x1ZDU2ZFx1YWNmYyBcdWNkYTlcdWIzY2NcdWQ1NThcdWIyOTQgXHVjODAwXHVjN2E1XHViNDE4XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWJjYzBcdWFjYmRcdWMwYWNcdWQ1NmRcdWM3NzQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LlxuXA0KLVx1YmNjMFx1YWNiZFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWNkZThcdWMxOGNcdWQ1NjAgXHVkM2I4XHVjOWQxXHVhZTMwXHViOTdjIFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfdGl0bGVfdGV4dD1cdWIzZDlcdWFlMzBcdWQ2NTQgXHViOWM4XHViYzk1XHVjMGFjDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV9leHBsYWluVGV4dD1cdWM3NzQgXHViOWM4XHViYzk1XHVjMGFjXHViMjk0IFx1ZDJiOVx1YzEzMSBcdWJjZjRcdWFlMzBcdWM3NTggXHVjNzdjXHViYzE4IFx1ZDBlZFx1YzVkMFx1YzExYyAiXHVjMThjXHVjMmE0XHVjNjQwIFx1YjNkOVx1YWUzMFx1ZDY1NCJcdWI4NWMgXHVkNDVjXHVjMmRjXHViNDFjIFx1YzEyMFx1ZDBkZFx1YjQxYyBcdWQ2NWNcdWIzZDkgXHVjNTQ0XHViNzk4XHVjNzU4IFx1YzEyMFx1ZDBkZFx1YjQxYyBcdWMxMjRcdWJhODVcdWM3OTAgXHViNjEwXHViMjk0IFx1YmFhOFx1YjRlMCBcdWMxMjRcdWJhODVcdWM3OTBcdWM3NTggXHVjMGM4XHViODVjIFx1YWNlMFx1Y2U2OFx1Yzc0NCBcdWM5YzBcdWM2ZDBcdWQ1NjlcdWIyYzhcdWIyZTQuIFwNCi1cdWM3NzQgXHViOWM4XHViYzk1XHVjMGFjXHVjNWQwXHVjMTFjIFx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWQyYjlcdWMxMzFcdWI5Y2MgXHVjMTI0XHViYTg1XHVjNzkwXHVjNTQ4XHVjNWQwXHVjMTFjIFx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNjhcdWI0MjlcdWIyYzhcdWIyZTQuIFwNCi1cdWI2MTBcdWQ1NWMgXHVjMGM4XHViODVjIFx1YWNlMFx1Y2U1OFx1YWUzMCBcdWFlMzBcdWIyYTVcdWM3NDQgXHVhY2M0XHVjMGIwXHVkNTYwIFx1YjU0YyBcdWMwYWNcdWM2YTlcdWQ1NjAgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHVjNWQwIFx1YjMwMFx1ZDU3NCBcdWM3MjBcdWQ2YThcdWQ1NWMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU2MCBcdWMyMTggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LiBcDQotXHViOWM4XHViYzk1XHVjMGFjXHViMjk0IFx1YjljMVx1ZDA2YyhcdWNkMDhcdWI4NWRcdWMwYzkgXHVhZTMwXHVjNmI4XHVjNzg0XHVjY2I0KVx1YjQxYyBcdWMxMjRcdWJhODVcdWM3OTBcdWIyOTQgXHVhYzMxXHVjMmUwXHVkNTU4XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi1vcGVuUlRFPVx1YzExY1x1YzJkZFx1Yzc4OFx1YjI5NCBcdWJiMzhcdWMxMWMgXHVkM2I4XHVjOWQxXHVhZTMwIFx1YzVmNFx1YWUzMA0KLWNsb3NlUlRFPVx1YzExY1x1YzJkZFx1Yzc4OFx1YjI5NCBcdWJiMzhcdWMxMWMgXHVkM2I4XHVjOWQxXHVhZTMwIFx1YjJlYlx1YWUzMA0KLQ0KLSNOZXcgU3RyaW5ncw0KLXJvbGVzZXRzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHVjNzc0IFx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjhcdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1YzU0OFx1YjBiNFx1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZGlzY2lwbGluZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdWM3NzQgXHVjNmQwXHVjZTU5XHVjNWQwIFx1YzE4ZFx1ZDU1OFx1YjI5NCBcdWM1NDhcdWIwYjRcdWI5N2MgXHVhZDAwXHViOWFjXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXdvcmtwcm9kdWN0dHlwZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdWM3NzQgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWM3MjBcdWQ2MTVcdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1YzU0OFx1YjBiNFx1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZG9tYWluc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1Yzc3NCBcdWIzYzRcdWJhNTRcdWM3NzhcdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1YzU0OFx1YjBiNFx1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdG9vbHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdWM3NzQgXHViM2M0XHVhZDZjXHVjNWQwIFx1YzE4ZFx1ZDU1OFx1YjI5NCBcdWM1NDhcdWIwYjRcdWI5N2MgXHVhZDAwXHViOWFjXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWN1c3RvbWNhdGVnb3J5X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHVjNzc0IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NTggXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjXHVjNWQwIFx1YzE4ZFx1ZDU1OFx1YjI5NCBcdWM1NDhcdWIwYjRcdWI5N2MgXHVhZDAwXHViOWFjXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLWNvbmNlcHRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdWM3NzQgXHVhYzFjXHViMTUwXHVjNWQwIFx1YzE4ZFx1ZDU1OFx1YjI5NCBcdWM1NDhcdWIwYjRcdWI5N2MgXHVhZDAwXHViOWFjXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWNoZWNrbGlzdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1Yzc3NCBcdWNjYjRcdWQwNmNcdWI5YWNcdWMyYTRcdWQyYjhcdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1YzU0OFx1YjBiNFx1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZXhhbXBsZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1Yzc3NCBcdWM2MDhcdWM4MWNcdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1YzU0OFx1YjBiNFx1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZ3VpZGVsaW5lX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHVjNzc0IFx1YWMwMFx1Yzc3NFx1YjRkY1x1Yjc3Y1x1Yzc3OFx1YzVkMCBcdWMxOGRcdWQ1NThcdWIyOTQgXHVjNTQ4XHViMGI0XHViOTdjIFx1YWQwMFx1YjlhY1x1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yb2FkbWFwX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHVjNzc0IFx1Yjg1Y1x1YjRkY1x1YjlmNVx1YzVkMCBcdWMxOGRcdWQ1NThcdWIyOTQgXHVjNTQ4XHViMGI0XHViOTdjIFx1YWQwMFx1YjlhY1x1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yZXVzYWJsZWFzc2V0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHVjNzc0IFx1YzdhY1x1YzBhY1x1YzZhOVx1YWMwMFx1YjJhNVx1ZDU1YyBcdWM3OTBcdWMwYjBcdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1YzU0OFx1YjBiNFx1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotc3VwcG9ydGluZ21hdGVyaWFsX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHVjNzc0IFx1YzljMFx1YzZkMCBcdWM3OTBcdWI4Y2NcdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1YzU0OFx1YjBiNFx1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcmVwb3J0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHVjNzc0IFx1YmNmNFx1YWNlMFx1YzExY1x1YzVkMCBcdWMxOGRcdWQ1NThcdWIyOTQgXHVjNTQ4XHViMGI0XHViOTdjIFx1YWQwMFx1YjlhY1x1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1wcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1Yzc3NCBcdWMwYWNcdWI4NDBcdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1YzU0OFx1YjBiNFx1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdGVtcGxhdGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdWM3NzQgXHVkMTVjXHVkNTBjXHViOWFjXHVkMmI4XHVjNWQwIFx1YzE4ZFx1ZDU1OFx1YjI5NCBcdWM1NDhcdWIwYjRcdWI5N2MgXHVhZDAwXHViOWFjXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXRlcm1kZWZpbml0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHVjNzc0IFx1YzZhOVx1YzViNCBcdWM4MTVcdWM3NThcdWM1ZDAgXHVjMThkXHVkNTU4XHViMjk0IFx1YzU0OFx1YjBiNFx1Yjk3YyBcdWFkMDBcdWI5YWNcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdG9vbG1lbnRvcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1Yzc3NCBcdWIzYzRcdWFkNmMgXHVjMGFjXHVjNmE5IFx1YjNjNFx1YzZjMFx1YjlkMFx1YzVkMCBcdWMxOGRcdWQ1NThcdWIyOTQgXHVjNTQ4XHViMGI0XHViOTdjIFx1YWQwMFx1YjlhY1x1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi13aGl0ZXBhcGVyX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHVjNzc0IFx1YmMzMVx1YzExY1x1YzVkMCBcdWMxOGRcdWQ1NThcdWIyOTQgXHVjNTQ4XHViMGI0XHViOTdjIFx1YWQwMFx1YjlhY1x1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1Yzc3NCBcdWM2MDhcdWMwYzEgXHVhY2UwXHViODI0XHVjMGFjXHVkNTZkXHVjNWQwIFx1YzE4ZFx1ZDU1OFx1YjI5NCBcdWM1NDhcdWIwYjRcdWI5N2MgXHVhZDAwXHViOWFjXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLQ0KLSNOZXcgU3RyaW5nIFNlY3Rpb24gRGVzY3JpcHRpb24NCi1yb2xlX2RldGFpbFNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNWVkXHVkNTYwXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yb2xlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM1ZWRcdWQ1NjBcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXJvbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzVlZFx1ZDU2MFx1Yzc3NCBcdWIyZTRcdWI5NzggXHVjNWVkXHVkNTYwXHVhY2ZjIFx1YWQwMFx1YjgyOFx1YjQxOFx1YjI5NCBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXJvbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzVlZFx1ZDU2MFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHViYzg0XHVjODA0IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotdGFza19kZXRhaWxTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1ZDBjMFx1YzJhNFx1ZDA2Y1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdGFza19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVkMGMwXHVjMmE0XHVkMDZjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi10YXNrX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWQwYzBcdWMyYTRcdWQwNmNcdWFjMDAgXHViMmU0XHViOTc4IFx1ZDBjMFx1YzJhNFx1ZDA2Y1x1YzY0MCBcdWFkMDBcdWI4MjhcdWI0MThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi10YXNrX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWQwYzBcdWMyYTRcdWQwNmNcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmM4NFx1YzgwNCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLWFydGlmYWN0X2RldGFpbFNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNTQ0XHVkMmYwXHVkMzI5XHVkMmI4XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1hcnRpZmFjdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNTQ0XHVkMmYwXHVkMzI5XHVkMmI4XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1hcnRpZmFjdF9pY29uU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM1NDRcdWQyZjBcdWQzMjlcdWQyYjhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzU0NFx1Yzc3NFx1Y2Y1OFx1Yzc0NCBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWFydGlmYWN0X25vdGF0aW9uU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM1NDRcdWQyZjBcdWQzMjlcdWQyYjhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzgwNFx1YjJlYyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNTQ0XHVkMmYwXHVkMzI5XHVkMmI4XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODcwXHVjODE1IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotYXJ0aWZhY3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzU0NFx1ZDJmMFx1ZDMyOVx1ZDJiOFx1YWMwMCBcdWIyZTRcdWI5NzggXHVjNTQ0XHVkMmYwXHVkMzI5XHVkMmI4XHVjNjQwIFx1YWQwMFx1YjgyOFx1YjQxOFx1YjI5NCBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWFydGlmYWN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM1NDRcdWQyZjBcdWQzMjlcdWQyYjhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmM4NFx1YzgwNCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLW91dGNvbWVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWFjYjBcdWFjZmNcdWJiM2NcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLW91dGNvbWVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YWNiMFx1YWNmY1x1YmIzY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotb3V0Y29tZV9pY29uU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWFjYjBcdWFjZmNcdWJiM2NcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzU0NFx1Yzc3NFx1Y2Y1OFx1Yzc0NCBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLW91dGNvbWVfbm90YXRpb25TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YWNiMFx1YWNmY1x1YmIzY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjODA0XHViMmVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotb3V0Y29tZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YWNiMFx1YWNmY1x1YmIzY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjMGFjXHVjNmE5XHVjNzkwIFx1Yzg3MFx1YzgxNSBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLW91dGNvbWVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YWNiMFx1YWNmY1x1YmIzY1x1Yzc3NCBcdWIyZTRcdWI5NzggXHVhY2IwXHVhY2ZjXHViYjNjXHVhY2ZjIFx1YWQwMFx1YjgyOFx1YjQxOFx1YjI5NCBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLW91dGNvbWVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YWNiMFx1YWNmY1x1YmIzY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHViYzg0XHVjODA0IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotZGVsaXZlcmFibGVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM3NzhcdWIzYzRcdWJiM2NcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWRlbGl2ZXJhYmxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM3NzhcdWIzYzRcdWJiM2NcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWRlbGl2ZXJhYmxlX2ljb25TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1Yzc3OFx1YjNjNFx1YmIzY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNTQ0XHVjNzc0XHVjZjU4XHVjNzQ0IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NThcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZGVsaXZlcmFibGVfbm90YXRpb25TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1Yzc3OFx1YjNjNFx1YmIzY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjODA0XHViMmVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZGVsaXZlcmFibGVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM3NzhcdWIzYzRcdWJiM2NcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4NzBcdWM4MTUgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1kZWxpdmVyYWJsZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNzc4XHViM2M0XHViYjNjXHVjNzc0IFx1YjJlNFx1Yjk3OCBcdWM3NzhcdWIzYzRcdWJiM2NcdWFjZmMgXHVhZDAwXHViODI4XHViNDE4XHViMjk0IFx1YmMyOVx1YmM5NVx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZGVsaXZlcmFibGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1Yzc3OFx1YjNjNFx1YmIzY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHViYzg0XHVjODA0IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotZGlzY2lwbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzZkMFx1Y2U1OVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZGlzY2lwbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNmQwXHVjZTU5XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1kaXNjaXBsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM2ZDBcdWNlNTlcdWM3NzQgXHViMmU0XHViOTc4IFx1YzZkMFx1Y2U1OVx1YWNmYyBcdWFkMDBcdWI4MjhcdWI0MThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1kaXNjaXBsaW5lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM2ZDBcdWNlNTlcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmM4NFx1YzgwNCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLWRvbWFpbl9kZXRhaWxTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YjNjNFx1YmE1NFx1Yzc3OFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZG9tYWluX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWIzYzRcdWJhNTRcdWM3NzhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWRvbWFpbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdWM3NzQgXHViM2M0XHViYTU0XHVjNzc4XHVjNzc0IFx1YjJlNFx1Yjk3OCBcdWIzYzRcdWJhNTRcdWM3NzhcdWFjZmMgXHVhZDAwXHViODI4XHViNDE4XHViMjk0IFx1YmMyOVx1YmM5NVx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZG9tYWluX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWIzYzRcdWJhNTRcdWM3NzhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmM4NFx1YzgwNCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLXdvcmtwcm9kdWN0dHlwZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjNzIwXHVkNjE1XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi13b3JrcHJvZHVjdHR5cGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjNzIwXHVkNjE1XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi13b3JrcHJvZHVjdHR5cGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjNzIwXHVkNjE1XHVjNzc0IFx1YjJlNFx1Yjk3OCBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1YzcyMFx1ZDYxNVx1YWNmYyBcdWFkMDBcdWI4MjhcdWI0MThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi13b3JrcHJvZHVjdHR5cGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjNzIwXHVkNjE1XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1yb2xlc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNWVkXHVkNTYwIFx1YzEzOFx1ZDJiOFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcm9sZXNldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNWVkXHVkNTYwIFx1YzEzOFx1ZDJiOFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcm9sZXNldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNWVkXHVkNTYwIFx1YzEzOFx1ZDJiOFx1YWMwMCBcdWIyZTRcdWI5NzggXHVjNWVkXHVkNTYwIFx1YzEzOFx1ZDJiOFx1YzY0MCBcdWFkMDBcdWI4MjhcdWI0MThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yb2xlc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM1ZWRcdWQ1NjAgXHVjMTM4XHVkMmI4XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi10b29sX2RldGFpbFNlY3Rpb25fZGVzYz1cdWM3NzQgXHViM2M0XHVhZDZjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi10b29sX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWIzYzRcdWFkNmNcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXRvb2xfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YjNjNFx1YWQ2Y1x1YWMwMCBcdWIyZTRcdWI5NzggXHViM2M0XHVhZDZjXHVjNjQwIFx1YWQwMFx1YjgyOFx1YjQxOFx1YjI5NCBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXRvb2xfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YjNjNFx1YWQ2Y1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHViYzg0XHVjODA0IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotY29uY2VwdF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YWMxY1x1YjE1MFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotY29uY2VwdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVhYzFjXHViMTUwXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1jb25jZXB0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWFjMWNcdWIxNTBcdWM3NzQgXHViMmU0XHViOTc4IFx1YWMxY1x1YjE1MFx1YWNmYyBcdWFkMDBcdWI4MjhcdWI0MThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1jb25jZXB0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWFjMWNcdWIxNTBcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmM4NFx1YzgwNCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLWNoZWNrbGlzdF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1Y2NiNFx1ZDA2Y1x1YjlhY1x1YzJhNFx1ZDJiOFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWNjYjRcdWQwNmNcdWI5YWNcdWMyYTRcdWQyYjhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWNoZWNrbGlzdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjY2I0XHVkMDZjXHViOWFjXHVjMmE0XHVkMmI4XHVhYzAwIFx1YjJlNFx1Yjk3OCBcdWNjYjRcdWQwNmNcdWI5YWNcdWMyYTRcdWQyYjhcdWM2NDAgXHVhZDAwXHViODI4XHViNDE4XHViMjk0IFx1YmMyOVx1YmM5NVx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotY2hlY2tsaXN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWNjYjRcdWQwNmNcdWI5YWNcdWMyYTRcdWQyYjhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmM4NFx1YzgwNCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLWV4YW1wbGVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM2MDhcdWM4MWNcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWV4YW1wbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzYwOFx1YzgxY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZXhhbXBsZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNjA4XHVjODFjXHVhYzAwIFx1YjJlNFx1Yjk3OCBcdWM2MDhcdWM4MWNcdWM2NDAgXHVhZDAwXHViODI4XHViNDE4XHViMjk0IFx1YmMyOVx1YmM5NVx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZXhhbXBsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNjA4XHVjODFjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1ndWlkZWxpbmVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWFjMDBcdWM3NzRcdWI0ZGNcdWI3N2NcdWM3NzhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWd1aWRlbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVhYzAwXHVjNzc0XHViNGRjXHViNzdjXHVjNzc4XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1ndWlkZWxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YWMwMFx1Yzc3NFx1YjRkY1x1Yjc3Y1x1Yzc3OFx1Yzc3NCBcdWIyZTRcdWI5NzggXHVhYzAwXHVjNzc0XHViNGRjXHViNzdjXHVjNzc4XHVhY2ZjIFx1YWQwMFx1YjgyOFx1YjQxOFx1YjI5NCBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWd1aWRlbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVhYzAwXHVjNzc0XHViNGRjXHViNzdjXHVjNzc4XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzYwOFx1YzBjMSBcdWFjZTBcdWI4MjRcdWMwYWNcdWQ1NmRcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM2MDhcdWMwYzEgXHVhY2UwXHViODI0XHVjMGFjXHVkNTZkXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNjA4XHVjMGMxIFx1YWNlMFx1YjgyNFx1YzBhY1x1ZDU2ZFx1Yzc3NCBcdWIyZTRcdWI5NzggXHVjNjA4XHVjMGMxIFx1YWNlMFx1YjgyNFx1YzBhY1x1ZDU2ZFx1YWNmYyBcdWFkMDBcdWI4MjhcdWI0MThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNjA4XHVjMGMxIFx1YWNlMFx1YjgyNFx1YzBhY1x1ZDU2ZFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHViYzg0XHVjODA0IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotcHJhY3RpY2VfZGV0YWlsU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWMwYWNcdWI4NDBcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXByYWN0aWNlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWMwYWNcdWI4NDBcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXByYWN0aWNlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWMwYWNcdWI4NDBcdWFjMDAgXHViMmU0XHViOTc4IFx1YzBhY1x1Yjg0MFx1YzY0MCBcdWFkMDBcdWI4MjhcdWI0MThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1wcmFjdGljZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVjMGFjXHViODQwXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1yZXBvcnRfZGV0YWlsU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWJjZjRcdWFjZTBcdWMxMWNcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXJlcG9ydF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHViY2Y0XHVhY2UwXHVjMTFjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yZXBvcnRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YmNmNFx1YWNlMFx1YzExY1x1YWMwMCBcdWIyZTRcdWI5NzggXHViY2Y0XHVhY2UwXHVjMTFjXHVjNjQwIFx1YWQwMFx1YjgyOFx1YjQxOFx1YjI5NCBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXJlcG9ydF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHViY2Y0XHVhY2UwXHVjMTFjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1yZXN1YWJsZWFzc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjN2FjXHVjMGFjXHVjNmE5XHVhYzAwXHViMmE1XHVkNTVjIFx1Yzc5MFx1YzBiMFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcmVzdWFibGVhc3NldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVjN2FjXHVjMGFjXHVjNmE5XHVhYzAwXHViMmE1XHVkNTVjIFx1Yzc5MFx1YzBiMFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcmVzdWFibGVhc3NldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjN2FjXHVjMGFjXHVjNmE5XHVhYzAwXHViMmE1XHVkNTVjIFx1Yzc5MFx1YzBiMFx1Yzc3NCBcdWIyZTRcdWI5NzggXHVjN2FjXHVjMGFjXHVjNmE5XHVhYzAwXHViMmE1XHVkNTVjIFx1Yzc5MFx1YzBiMFx1YWNmYyBcdWFkMDBcdWI4MjhcdWI0MThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yZXN1YWJsZWFzc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM3YWNcdWMwYWNcdWM2YTlcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjNzkwXHVjMGIwXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1yb2FkbWFwX2RldGFpbFNlY3Rpb25fZGVzYz1cdWM3NzQgXHViODVjXHViNGRjXHViOWY1XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yb2FkbWFwX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWI4NWNcdWI0ZGNcdWI5ZjVcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXJvYWRtYXBfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1Yjg1Y1x1YjRkY1x1YjlmNVx1Yzc3NCBcdWIyZTRcdWI5NzggXHViODVjXHViNGRjXHViOWY1XHVhY2ZjIFx1YWQwMFx1YjgyOFx1YjQxOFx1YjI5NCBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXJvYWRtYXBfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1Yjg1Y1x1YjRkY1x1YjlmNVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHViYzg0XHVjODA0IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotc3VwcG9ydGluZ21hdGVyaWFsX2RldGFpbFNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjOWMwXHVjNmQwIFx1Yzc5MFx1YjhjY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotc3VwcG9ydGluZ21hdGVyaWFsX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM5YzBcdWM2ZDAgXHVjNzkwXHViOGNjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzljMFx1YzZkMCBcdWM3OTBcdWI4Y2NcdWFjMDAgXHViMmU0XHViOTc4IFx1YzljMFx1YzZkMCBcdWM3OTBcdWI4Y2NcdWM2NDAgXHVhZDAwXHViODI4XHViNDE4XHViMjk0IFx1YmMyOVx1YmM5NVx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM5YzBcdWM2ZDAgXHVjNzkwXHViOGNjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi10ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1ZDE1Y1x1ZDUwY1x1YjlhY1x1ZDJiOFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdGVtcGxhdGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1ZDE1Y1x1ZDUwY1x1YjlhY1x1ZDJiOFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1ZDE1Y1x1ZDUwY1x1YjlhY1x1ZDJiOFx1YWMwMCBcdWIyZTRcdWI5NzggXHVkMTVjXHVkNTBjXHViOWFjXHVkMmI4XHVjNjQwIFx1YWQwMFx1YjgyOFx1YjQxOFx1YjI5NCBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXRlbXBsYXRlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWQxNWNcdWQ1MGNcdWI5YWNcdWQyYjhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmM4NFx1YzgwNCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLXRlcm1kZWZpbml0aW9uX2RldGFpbFNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNmE5XHVjNWI0IFx1YzgxNVx1Yzc1OFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdGVybWRlZmluaXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzZhOVx1YzViNCBcdWM4MTVcdWM3NThcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXRlcm1kZWZpbml0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM2YTlcdWM1YjQgXHVjODE1XHVjNzU4XHVhYzAwIFx1YjJlNFx1Yjk3OCBcdWM2YTlcdWM1YjQgXHVjODE1XHVjNzU4XHVjNjQwIFx1YWQwMFx1YjgyOFx1YjQxOFx1YjI5NCBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM2YTlcdWM1YjQgXHVjODE1XHVjNzU4XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi10b29sbWVudG9yX2RldGFpbFNlY3Rpb25fZGVzYz1cdWM3NzQgXHViM2M0XHVhZDZjIFx1YzBhY1x1YzZhOSBcdWIzYzRcdWM2YzBcdWI5ZDBcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXRvb2xtZW50b3JfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YjNjNFx1YWQ2YyBcdWMwYWNcdWM2YTkgXHViM2M0XHVjNmMwXHViOWQwXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi10b29sbWVudG9yX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWIzYzRcdWFkNmMgXHVjMGFjXHVjNmE5IFx1YjNjNFx1YzZjMFx1YjlkMFx1Yzc3NCBcdWIyZTRcdWI5NzggXHViM2M0XHVhZDZjIFx1YzBhY1x1YzZhOSBcdWIzYzRcdWM2YzBcdWI5ZDBcdWFjZmMgXHVhZDAwXHViODI4XHViNDE4XHViMjk0IFx1YmMyOVx1YmM5NVx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdG9vbG1lbnRvcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHViM2M0XHVhZDZjIFx1YzBhY1x1YzZhOSBcdWIzYzRcdWM2YzBcdWI5ZDBcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmM4NFx1YzgwNCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLXdoaXRlcGFwZXJfZGV0YWlsU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWJjMzFcdWMxMWNcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXdoaXRlcGFwZXJfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YmMzMVx1YzExY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotd2hpdGVwYXBlcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdWM3NzQgXHViYzMxXHVjMTFjXHVhYzAwIFx1YjJlNFx1Yjk3OCBcdWJjMzFcdWMxMWNcdWM2NDAgXHVhZDAwXHViODI4XHViNDE4XHViMjk0IFx1YmMyOVx1YmM5NVx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotd2hpdGVwYXBlcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHViYzMxXHVjMTFjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1kaXNjaXBsaW5lZ3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM2ZDBcdWNlNTkgXHVhZGY4XHViOGY5XHVkNjU0XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1kaXNjaXBsaW5lZ3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzZkMFx1Y2U1OSBcdWFkZjhcdWI4ZjlcdWQ2NTRcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjNmQwXHVjZTU5IFx1YWRmOFx1YjhmOVx1ZDY1NFx1YWMwMCBcdWIyZTRcdWI5NzggXHVjNmQwXHVjZTU5IFx1YWRmOFx1YjhmOVx1ZDY1NFx1YzY0MCBcdWFkMDBcdWI4MjhcdWI0MThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1kaXNjaXBsaW5lZ3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzZkMFx1Y2U1OSBcdWFkZjhcdWI4ZjlcdWQ2NTRcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmM4NFx1YzgwNCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLXJvbGVzZXRncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjggXHVhZGY4XHViOGY5XHVkNjU0XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yb2xlc2V0Z3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjggXHVhZGY4XHViOGY5XHVkNjU0XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yb2xlc2V0Z3JvdXBpbmdfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjggXHVhZGY4XHViOGY5XHVkNjU0XHVhYzAwIFx1YjJlNFx1Yjk3OCBcdWM1ZWRcdWQ1NjAgXHVjMTM4XHVkMmI4IFx1YWRmOFx1YjhmOVx1ZDY1NFx1YzY0MCBcdWFkMDBcdWI4MjhcdWI0MThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yb2xlc2V0Z3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjggXHVhZGY4XHViOGY5XHVkNjU0XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1jdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NTggXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1jdXN0b21jYXRlZ29yeV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdWM3NzQgXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OCBcdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWNcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWN1c3RvbWNhdGVnb3J5X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4IFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhY1x1YWMwMCBcdWIyZTRcdWI5NzggXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OCBcdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWNcdWM2NDAgXHVhZDAwXHViODI4XHViNDE4XHViMjk0IFx1YmMyOVx1YmM5NVx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotY3VzdG9tY2F0ZWdvcnlfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NTggXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJjODRcdWM4MDQgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1jdXN0b21jYXRlZ29yeV9JY29uU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4IFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNTQ0XHVjNzc0XHVjZjU4XHVjNzQ0IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NThcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotY29uY2VwdF9pY29uU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWFjMWNcdWIxNTBcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzU0NFx1Yzc3NFx1Y2Y1OFx1Yzc0NCBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWNoZWNrbGlzdF9pY29uU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWNjYjRcdWQwNmNcdWI5YWNcdWMyYTRcdWQyYjhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzU0NFx1Yzc3NFx1Y2Y1OFx1Yzc0NCBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXRvb2xtZW50b3JfaWNvblNlY3Rpb25fZGVzYz1cdWM3NzQgXHViM2M0XHVhZDZjIFx1YzBhY1x1YzZhOSBcdWIzYzRcdWM2YzBcdWI5ZDBcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzU0NFx1Yzc3NFx1Y2Y1OFx1Yzc0NCBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXdoaXRlcGFwZXJfaWNvblNlY3Rpb25fZGVzYz1cdWM3NzQgXHViYzMxXHVjMTFjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM1NDRcdWM3NzRcdWNmNThcdWM3NDQgXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9pY29uU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM2MDhcdWMwYzEgXHVhY2UwXHViODI0XHVjMGFjXHVkNTZkXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM1NDRcdWM3NzRcdWNmNThcdWM3NDQgXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi10ZXJtZGVmaW5pdGlvbl9pY29uU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM2YTlcdWM1YjQgXHVjODE1XHVjNzU4XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM1NDRcdWM3NzRcdWNmNThcdWM3NDQgXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi10ZW1wbGF0ZV9pY29uU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWQxNWNcdWQ1MGNcdWI5YWNcdWQyYjhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzU0NFx1Yzc3NFx1Y2Y1OFx1Yzc0NCBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXJldXNhYmxlYXNzZXRfaWNvblNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjN2FjXHVjMGFjXHVjNmE5XHVhYzAwXHViMmE1XHVkNTVjIFx1Yzc5MFx1YzBiMFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNTQ0XHVjNzc0XHVjZjU4XHVjNzQ0IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NThcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcmVwb3J0X2ljb25TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YmNmNFx1YWNlMFx1YzExY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNTQ0XHVjNzc0XHVjZjU4XHVjNzQ0IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NThcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcHJhY3RpY2VfaWNvblNlY3Rpb25fZGVzYz1cdWM3NzQgXHVjMGFjXHViODQwXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM1NDRcdWM3NzRcdWNmNThcdWM3NDQgXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1leGFtcGxlX2ljb25TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YzYwOFx1YzgxY1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNTQ0XHVjNzc0XHVjZjU4XHVjNzQ0IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NThcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZ3VpZGVsaW5lX2ljb25TZWN0aW9uX2Rlc2M9XHVjNzc0IFx1YWMwMFx1Yzc3NFx1YjRkY1x1Yjc3Y1x1Yzc3OFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNTQ0XHVjNzc0XHVjZjU4XHVjNzQ0IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NThcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcm9hZG1hcF9pY29uU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWI4NWNcdWI0ZGNcdWI5ZjVcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzU0NFx1Yzc3NFx1Y2Y1OFx1Yzc0NCBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9pY29uU2VjdGlvbl9kZXNjPVx1Yzc3NCBcdWM5YzBcdWM2ZDAgXHVjNzkwXHViOGNjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM1NDRcdWM3NzRcdWNmNThcdWM3NDQgXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1lZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY190aXRsZT1cdWQzMGNcdWM3N2MgXHViY2MwXHVhY2JkDQotZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfbWVzc2FnZT1cdWQzMGNcdWM3N2NcdWM3NzQgXHVkMzBjXHVjNzdjIFx1YzJkY1x1YzJhNFx1ZDE1Y1x1YzVkMFx1YzExYyBcdWJjYzBcdWFjYmRcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1YmNjMFx1YWNiZFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWI4NWNcdWI0ZGNcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU9XHVkNjVjXHViM2Q5IFx1YmNjMFx1YjNkOQ0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZz0nJ3swfScnIFx1ZDY1Y1x1YjNkOVx1Yzc3NCBcdWJjYzBcdWIzZDlcdWM3NDQgJyd7MX0nJ1x1YzVkMCBcdWMxMjRcdWM4MTVcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gJyd7MX0nJ1x1Yzc3NChcdWFjMDApIFx1Yzc3NFx1YmJmOCBcdWQ1NThcdWM3MDQgXHVkNjVjXHViM2Q5XHVjNzNjXHViODVjXHVjMTFjIFx1ZDU1OFx1YjA5OCBcdWM3NzRcdWMwYzFcdWM3NTggXHVjZWU4XHVkMmI4XHViOWFjXHViZGYwXHVkMmI4XHViNDE4XHVhYzcwXHViMDk4IFx1YjMwMFx1Y2NiNFx1YjQxYyBcdWQ2NWNcdWIzZDlcdWM3NDQgXHVhYzAwXHVjOWMwXHVhY2UwIFx1Yzc4OFx1YWUzMCBcdWI1NGNcdWJiMzhcdWM3ODVcdWIyYzhcdWIyZTQuDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMT0nJ3swfScnIFx1ZDY1Y1x1YjNkOVx1Yzc3NCBcdWJjYzBcdWIzZDlcdWM3NDQgXHVjOWMxXHVjODExIFx1YzBjMVx1YzcwNCBcdWQ2NWNcdWIzZDkgXHViNjEwXHViMjk0IFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWM5MTEgXHVkNTU4XHViMDk4XHVjNWQwIFx1YzEyNFx1YzgxNVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzI9XHVjMjFjXHVkNjU4IFx1Yzg4NVx1YzE4ZFx1YzEzMVx1Yzc0NCBcdWFjMDBcdWM5YzBcdWFlMzAgXHViNTRjXHViYjM4XHVjNWQwICcnezB9JycgXHVkNjVjXHViM2Q5XHVjNzc0IFx1YmNjMFx1YjNkOVx1Yzc0NCAnJ3sxfScnXHVjNWQwIFx1YzEyNFx1YzgxNVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfdGl0bGU9XHVkMzI4XHVkMTM0IFx1YzgwMVx1YzZhOQ0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnPVx1YzIxY1x1ZDY1OCBcdWM4ODVcdWMxOGRcdWMxMzFcdWM3NDQgXHVhYzAwXHVjOWMwXHVhZTMwIFx1YjU0Y1x1YmIzOFx1YzVkMCAnJ3swfScnIFx1ZDY1Y1x1YjNkOVx1Yzc3NCBcdWQzMjhcdWQxMzRcdWM3NDQgJyd7MX0nJ1x1YzVkMCBcdWM4MDFcdWM2YTlcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotQ2hhbmdlSGlzdG9yeURpYWxvZ19kZWxpbWl0ZXI9fA0KLU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3Jfc2hvd093bmVySW5MaWJyYXJ5Vmlldz1cdWJiZjhcdWQ1NzRcdWFjYjBcdWI0MWMgXHVjYzM4XHVjODcwXHVjNzU4IFx1YzE4Y1x1YzcyMFx1Yzc5MFx1Yjk3YyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHViY2Y0XHVhZTMwXHVjNWQwIFx1ZDQ1Y1x1YzJkYw0KLU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlVW5yZXNvbHZlZFJlZmVyZW5jZT1cdWJiZjhcdWQ1NzRcdWFjYjBcdWI0MWMgXHVjYzM4XHVjODcwIFx1YzgxY1x1YWM3MA0KLXByb21wdERlbGV0ZUN1c3RvbUNhdGVnb3J5QmVmb3JlUmVtb3ZlTGFzdFJlZlRvSXQ9XHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzU4IHswfVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHViOWM4XHVjOWMwXHViOWM5IFx1Y2MzOFx1Yzg3MFx1Yjk3YyBcdWM4MWNcdWFjNzBcdWQ1NThcdWI4MjQgXHVkNTY5XHViMmM4XHViMmU0LiBcdWQ1NzRcdWIyZjkgXHVjNjk0XHVjMThjXHVhYzAwIFx1YzBhZFx1YzgxY1x1YjQyOVx1YjJjOFx1YjJlNC4gXHVhY2M0XHVjMThkXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jQmVsb3cgcHJvcGVydHkgImVkaXRvcl90aXRsZV9jb2xvbl93aXRoX3NwYWNlcyIgc2hvdWxkIG5vdCBiZSB0cmFuc2xhdGVkDQotI0Rvbid0IGRlbGV0ZSBhIHNwYWNlIGFmdGVyICI6ICINCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLWVkaXRvcl90aXRsZV9jb2xvbl93aXRoX3NwYWNlcz06IA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZjE1MzFkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGb3JtIFBhZ2UgVGl0bGVzDQotYXNzaWduUGFnZV90aXRsZT1EZXNpZ25hcg0KLWNhdGVnb3JpZXNQYWdlX3RpdGxlPUNhdGVnb3JpYXMNCi1kZWxpdmVyYWJsZVBhcnRzUGFnZV90aXRsZT1QYXJ0ZXMgRGlzdHJpYnVcdTAwZWR2ZWlzDQotZGVzY3JpcHRpb25QYWdlX3RpdGxlPURlc2NyaVx1MDBlN1x1MDBlM28NCi1kaXNjaXBsaW5lc1BhZ2VfdGl0bGU9RGlzY2lwbGluYXMNCi1kaXNjYXJkdW5yZXNvbHZlZHJlZj1EZXNjYXJ0YXIgcmVmZXJcdTAwZWFuY2lhcyBuXHUwMGUzbyByZXNvbHZpZGFzDQotZ3VpZGFuY2VQYWdlX3RpdGxlPU9yaWVudGFcdTAwZTdcdTAwZTNvDQotcHJldmlld1BhZ2VfdGl0bGU9VmlzdWFsaXphcg0KLXJlZmVyZW5jZXNQYWdlX3RpdGxlPVJlZmVyXHUwMGVhbmNpYXMNCi1yZWZlcmVuY2VfdGV4dD1SZWZlclx1MDBlYW5jaWFzOg0KLXJlZmVyZW5jZVdvcmtmbG93UGFnZV90aXRsZT1GbHV4byBkZSBUcmFiYWxobyBkZSBSZWZlclx1MDBlYW5jaWENCi1yb2xlc1BhZ2VfdGl0bGU9RnVuXHUwMGU3XHUwMGY1ZXMNCi1yb2xlU2V0c1BhZ2VfdGl0bGU9Q29uanVudG9zIGRlIEZ1blx1MDBlN1x1MDBmNWVzDQotc3RlcHNQYWdlX3RpdGxlPUV0YXBhcw0KLXRhc2tzUGFnZV90aXRsZT1UYXJlZmFzDQotdG9vbE1lbnRvcnNQYWdlX3RpdGxlPU1lbnRvcmVzIGRlIEZlcnJhbWVudGFzDQotd29ya1Byb2R1Y3RzUGFnZV90aXRsZT1Qcm9kdXRvcyBkZSBUcmFiYWxobw0KLQ0KLSMgU2VjdGlvbiBOYW1lcyAmIERlc2NyaXB0aW9uDQotY2hlY2tJdGVtc1NlY3Rpb25fbmFtZT1JdGVucyBkZSBWZXJpZmljYVx1MDBlN1x1MDBlM28NCi1jaGVja0l0ZW1zU2VjdGlvbl9kZXNjPUVzcGVjaWZpY2FyIG9zIGl0ZW5zIGRlIHZlcmlmaWNhXHUwMGU3XHUwMGUzbyBxdWUgY29uc3RpdHVlbSBlc3RhIGxpc3RhIGRlIHZlcmlmaWNhXHUwMGU3XHUwMGUzby4NCi1kZXBlbmRlbmNpZXNTZWN0aW9uX25hbWU9RGVwZW5kXHUwMGVhbmNpYXMNCi1kZXBlbmRlbmNpZXNTZWN0aW9uX2Rlc2M9RXN0YSBzZVx1MDBlN1x1MDBlM28gZXhpYmUgZGVwZW5kXHUwMGVhbmNpYXMgZGVzdGUgcGFjb3RlIGRlIGNvbnRlXHUwMGZhZG8gcGFyYSBvdXRyb3MgcGFjb3RlcyBkZSBjb250ZVx1MDBmYWRvLg0KLWRldGFpbFNlY3Rpb25fbmFtZT1JbmZvcm1hXHUwMGU3XHUwMGY1ZXMgRGV0YWxoYWRhcw0KLWRldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZWNlciBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGV0YWxoYWRhcyBzb2JyZSBlc3RlL2VzdGEgezB9Lg0KLWdlbmVyYWxJbmZvU2VjdGlvbl9uYW1lPUluZm9ybWFcdTAwZTdcdTAwZjVlcyBHZXJhaXMNCi1nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RlL2VzdGEgezB9Lg0KLWljb25TZWN0aW9uX25hbWU9XHUwMGNkY29uZQ0KLWljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXphciBvcyBcdTAwZWRjb25lcyBwYXJhIGVzdGUvZXN0YSB7MH0uDQotbm90YXRpb25TZWN0aW9uX25hbWU9SW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIEVudHJlZ2ENCi1ub3RhdGlvblNlY3Rpb25fZGVzYz1Gb3JuZWNlciBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgZW50cmVnYSBzb2JyZSBlc3RlIHswfS4NCi1yZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fbmFtZT1QbHVnLWlucyBSZWZlcmVuY2lhZG9zOg0KLXJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9kZXNjPUVzdGEgc2VcdTAwZTdcdTAwZTNvIGV4aWJlIG9zIHBsdWctaW5zIHJlZmVyZW5jaWFkb3MgcG9yIGVzdGUgcGx1Zy1pbiBkZSBtXHUwMGU5dG9kby4NCi1zdGFmZmluZ1NlY3Rpb25fbmFtZT1JbmZvcm1hXHUwMGU3XHUwMGY1ZXMgc29icmUgRGVmaW5pXHUwMGU3XHUwMGUzbyBkYSBFcXVpcGUNCi1zdGFmZmluZ1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIHNvYnJlIGEgZGVmaW5pXHUwMGU3XHUwMGUzbyBkYSBlcXVpcGUgcGFyYSBlc3RhIGZ1blx1MDBlN1x1MDBlM28uDQotc3RlcHNTZWN0aW9uX25hbWU9RXRhcGFzDQotc3RlcHNTZWN0aW9uX2Rlc2M9RXNwZWNpZmljYXIgYXMgZXRhcGFzIHBhcmEgZGVzZW1wZW5oYXIgZXN0YSB0YXJlZmEuDQotdGFpbG9yaW5nU2VjdGlvbl9uYW1lPUFkYXB0YVx1MDBlN1x1MDBlM28NCi10YWlsb3JpbmdTZWN0aW9uX2Rlc2M9Rm9ybmVjZXIgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIHNvYnJlIGFkYXB0YVx1MDBlN1x1MDBlM28gc29icmUgZXN0ZS9lc3RhIHswfS4NCi12YXJpYWJpbGl0eVNlY3Rpb25fbmFtZT1WYXJpYWJpbGlkYWRlIGRvIENvbnRlXHUwMGZhZG8NCi12YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaWNhciBjb21vIGVzdGUvZXN0YSB7MH0gc2UgcmVsYWNpb25hIGNvbSBvdXRyby9vdXRyYSB7MH0uDQotdmVyc2lvbkluZm9TZWN0aW9uX25hbWU9SW5mb3JtYVx1MDBlN1x1MDBmNWVzIHNvYnJlIFZlcnNcdTAwZTNvDQotdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVjZXIgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIHNvYnJlIHZlcnNcdTAwZTNvIHNvYnJlIGVzdGUvZXN0YSB7MH0uDQotDQotIyBVSSAmIEVsZW1lbnQgQXR0cmlidXRlIExhYmVscw0KLWFkZGl0aW9uYWxJbmZvX3RleHQ9SW5mb3JtYVx1MDBlN1x1MDBmNWVzIEFkaWNpb25haXM6DQotYXBwbGljYXRpb25fdGV4dD1BcGxpY2F0aXZvOg0KLWFjdGlvbkxhYmVsX2VkaXQ9RWRpdGFyDQotYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdj1Nb3N0cmFyIG5hIFZpc3VhbGl6YVx1MDBlN1x1MDBlM28gZGUgQmlibGlvdGVjYQ0KLWFsdGVybmF0aXZlc190ZXh0PUFsdGVybmF0aXZhczoNCi1hc3NpZ25tZW50QXBwcm9hY2hlc190ZXh0PUFib3JkYWdlbnMgZGUgZGVzaWduYVx1MDBlN1x1MDBlM286DQotYXV0aG9yc190ZXh0PUF1dG9yZXM6DQotYmFja2dyb3VuZF90ZXh0PUluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZSBiYXNlOg0KLWJhc2VFbGVtZW50X3RleHQ9QmFzZToNCi1iYXNlR3VpZGFuY2VfdGV4dD1PcmllbnRhXHUwMGU3XHUwMGUzbyBkZSBiYXNlOg0KLWJyaWVmRGVzY3JpcHRpb25fdGV4dD1EZXNjcmlcdTAwZTdcdTAwZTNvIHJlc3VtaWRhOg0KLWRlc2NyaXB0aW9uX3RleHQ9RGVzY3JpXHUwMGU3XHUwMGUzbzoNCi1iYWNrdXBiZWZvcmVzYXZlX3RleHQ9RmF6ZXIgYmFja3VwIGFudGVzIGRlIHNhbHZhcg0KLWJyaWVmT3V0bGluZV90ZXh0PUVzYm9cdTAwZTdvIHJlc3VtaWRvOg0KLWNoYW5nZURhdGVfdGV4dD1EYXRhIGRhIGFsdGVyYVx1MDBlN1x1MDBlM286DQotY2hhbmdlRGVzY3JpcHRpb25fdGV4dD1EZXNjcmlcdTAwZTdcdTAwZTNvIGRhIGFsdGVyYVx1MDBlN1x1MDBlM286DQotY2hlY2tJdGVtc190ZXh0PUl0ZW5zIGRlIFZlcmlmaWNhXHUwMGU3XHUwMGUzbw0KLWNvbnRyaWJ1dGVzX3RleHQ9Q29udHJpYnVpDQotbG9jYWxDb250cmlidXRlc190ZXh0PUxvY2FsQ29udHJpYnV0ZXMNCi1jb250cmlidXRlc190b190ZXh0PUNvbnRyaWJ1aSBwYXJhDQotY29weXJpZ2h0X3RleHQ9RGlyZWl0b3MgYXV0b3JhaXM6DQotZWRpdG9yX3RleHQ9RWRpdG9yDQotZXh0ZW5kc190ZXh0PUV4dGVuc1x1MDBmNWVzDQotZXh0ZW5kX3RleHQ9RXh0ZW5zXHUwMGUzbw0KLWV4dGVybmFsRGVzY3JpcHRpb25fdGV4dD1EZXNjcmlcdTAwZTdcdTAwZTNvIGV4dGVybmE6DQotZXh0ZXJuYWxJZF90ZXh0PUlEIGV4dGVybm86DQotZ29hbHNfdGV4dD1NZXRhczoNCi1pbXBhY3RPZk5vdEhhdmluZ190ZXh0PUltcGFjdG8gZGUgblx1MDBlM28gdGVyOg0KLWtleUNvbnNpZGVyYXRpb25zX3RleHQ9Q29uc2lkZXJhXHUwMGU3XHUwMGY1ZXMgY2hhdmU6DQotbGV2ZWxzT2ZBZG9wdGlvbl90ZXh0PU5cdTAwZWR2ZWwgZGUgYWRvXHUwMGU3XHUwMGUzbzoNCi1tYWluRGVzY3JpcHRpb25fdGV4dD1EZXNjcmlcdTAwZTdcdTAwZTNvIHByaW5jaXBhbDoNCi1uZXdFbGVtZW50X3RleHQ9Tm92byB7MH0NCi1uYW1lX3RleHQ9Tm9tZToNCi1ub3RBcHBsaWNhYmxlX3RleHQ9Tlx1MDBlM28gYXBsaWNcdTAwZTF2ZWwNCi1wYWNrYWdpbmdHdWlkYW5jZV90ZXh0PU9yaWVudGFcdTAwZTdcdTAwZTNvIGRlIGVtcGFjb3RhbWVudG86DQotcHJlc2VudGF0aW9uTmFtZV90ZXh0PU5vbWUgZGEgYXByZXNlbnRhXHUwMGU3XHUwMGUzbzoNCi1wcm9tcHRmb3JsaWJhcnlfdGV4dD1QZWRpciBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBuYSBpbmljaWFsaXphXHUwMGU3XHUwMGUzbw0KLWVuYWJsZUhlYWx0aENoZWNrX3RleHQ9QXRpdmFyIGZlcnJhbWVudGFzIGRlIGRlcHVyYVx1MDBlN1x1MDBlM28gaW50ZXJuYXMNCi1wcm9ibGVtX3RleHQ9UHJvYmxlbWE6DQotcHVycG9zZV90ZXh0PU9iamV0aXZvOg0KLXJlYXNvbkZvck5vdE5lZWRpbmdfdGV4dD1SYXpcdTAwZTNvIHBhcmEgblx1MDBlM28gbmVjZXNzaXRhcjoNCi1yZXBsYWNlc190ZXh0PVN1YnN0aXR1aQ0KLWxvY2FsUmVwbGFjZXNfdGV4dD1Mb2NhbFJlcGxhY2VzDQotcmVwcmVzZW50YXRpb25PcHRpb25zX3RleHQ9T3BcdTAwZTdcdTAwZjVlcyBkZSByZXByZXNlbnRhXHUwMGU3XHUwMGUzbzoNCi10ZW1wbGF0ZUZpbGVfdGV4dD1BcnF1aXZvKHMpIGRlIGdhYmFyaXRvOg0KLXNraWxsc190ZXh0PUhhYmlsaWRhZGVzOg0KLXN0ZXBzX3RleHQ9RXRhcGFzOg0KLXN0ZXBzX25hbWVfdGV4dD1Ob21lOg0KLXN0b3BfdGV4dD1QYXJhcg0KLXByaW50X3RleHQ9SW1wcmltaXINCi1zeW5vbnltc190ZXh0PVNpblx1MDBmNG5pbW9zOg0KLXR5cGVfdGV4dD1UaXBvOg0KLWNvcHlfdGV4dD1Db3BpYXINCi1kZWVwQ29weV90ZXh0PUNcdTAwZjNwaWEgUHJvZnVuZGENCi1iYWNrX3RleHQ9Vm9sdGFyDQotbmV3X3BsdWdpbj1Ob3ZvIFBsdWctaW4gZGUgTVx1MDBlOXRvZG8NCi1tb3ZlPU1vdmVyLi4uDQotdW5pcXVlSWRfdGV4dD1JRCBFeGNsdXNpdm86DQotdmFyaWFiaWxpdHlUeXBlX3RleHQ9VGlwbyBkZSB2YXJpYWJpbGlkYWRlOg0KLXZlcnNpb25fdGV4dD1WZXJzXHUwMGUzbzoNCi0NCi0jIEJ1dHRvbiBMYWJlbHMNCi1hZGRCdXR0b25fdGV4dD1JbmNsdWlyLi4uDQotYXR0YWNoQnV0dG9uX3RleHQ9QW5leGFyLi4uDQotYnJvd3NlQnV0dG9uX3RleHQ9UHJvY3VyYXIuLi4NCi1jaGFuZ2VUeXBlQnV0dG9uX3RleHQ9QWx0ZXJhciBUaXBvLi4uDQotY2xlYXJCdXR0b25fdGV4dD1MaW1wYXINCi1kZWxldGVCdXR0b25fdGV4dD1EZWxldGUNCi1kZXRhY2hCdXR0b25fdGV4dD1EZXNhbmV4YXINCi1kaWFncmFtX3NhdmVFcnJvcj1FcnJvIGFvIHNhbHZhciBkaWFncmFtYQ0KLWRvd25CdXR0b25fdGV4dD1QYXJhIEJhaXhvDQotZGlyZWN0b3J5X3RleHQ9RGlyZXRcdTAwZjNyaW86DQotb3JkZXJCdXR0b25fdGV4dD1PcmRlbmFyDQotZWRpdEJ1dHRvbl90ZXh0PUVkaXRhci4uLg0KLXJlbW92ZUJ1dHRvbl90ZXh0PVJlbW92ZXINCi1yZW5hbWVBY3Rpb25fdGV4dD1SZW5vbWVhci4uLg0KLXJlbW92ZV90ZXh0PVJlbW92ZXINCi1yZW5hbWVfdGV4dD1SZW5vbWVhcg0KLVNhdmVBc190ZXh0PVNhbHZhciBjb21vDQotc2VsZWN0QnV0dG9uX3RleHQ9U2VsZWNpb25hci4uLg0KLWRlc2VsZWN0QnV0dG9uX3RleHQ9Q2FuY2VsYXIgc2VsZVx1MDBlN1x1MDBlM28NCi11cEJ1dHRvbl90ZXh0PVBhcmEgQ2ltYQ0KLW1ha2VEZWZhdWx0QnV0dG9uX3RleHQ9VG9ybmFyIFBhZHJcdTAwZTNvDQotdmlld0hpc3RvcnlCdXR0b25fdGV4dD1WaXN1YWxpemFyIEhpc3RcdTAwZjNyaWNvLi4uDQotIyBSb2xlIEVkaXRvciBUYXNrcyBQYWdlDQotcm9sZVRhc2tzUGFnZV9zZWN0aW9uTmFtZT1UYXJlZmFzDQotcm9sZVRhc2tzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249RXN0YSBmdW5cdTAwZTdcdTAwZTNvIFx1MDBlOSBhIGV4ZWN1dG9yYSBkYXMgdGFyZWZhcyBhIHNlZ3Vpci4NCi1yb2xlVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPVRhcmVmYXMgZGlzcG9uXHUwMGVkdmVpcw0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1FeGVjdXRvciBwcmltXHUwMGUxcmlvOg0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9RXhlY3V0b3IgYWRpY2lvbmFsOg0KLXJvbGVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gdGFyZWZhcyBmb3JhbSBzZWxlY2lvbmFkYXMuDQotDQotIyBSb2xlIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Qcm9kdXRvcyBkZSBUcmFiYWxobzoNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249RXNwZWNpZmlxdWUgcHJvZHV0b3MgZGUgdHJhYmFsaG8gcGVsb3MgcXVhaXMgZXN0YSBmdW5cdTAwZTdcdTAwZTNvIFx1MDBlOSByZXNwb25zXHUwMGUxdmVsLg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVByb2R1dG9zIGRlIHRyYWJhbGhvIGRpc3Bvblx1MDBlZHZlaXM6DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1SZXNwb25zXHUwMGUxdmVsIHBvcjoNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMj1Qcm9kdXRvcyBkZSB0cmFiYWxobyBxdWUgc1x1MDBlM28gc2FcdTAwZWRkYXMgZGUgdGFyZWZhcyBxdWUgZXN0YSBmdW5cdTAwZTdcdTAwZTNvIGRlc2VtcGVuaGE6DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gcHJvZHV0b3MgZGUgdHJhYmFsaG8gZm9yYW0gc2VsZWNpb25hZG9zLg0KLQ0KLSMgUm9sZSBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU9T3JpZW50YVx1MDBlN1x1MDBlM28NCi1yb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Gb3JuZVx1MDBlN2EgbGlua3MgcGFyYSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcyBuYSBmb3JtYSBkZSBvcmllbnRhXHUwMGU3XHUwMGUzby4NCi1yb2xlR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPU9yaWVudGFcdTAwZTdcdTAwZjVlcyBEaXNwb25cdTAwZWR2ZWlzOg0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1PcmllbnRhXHUwMGU3XHUwMGUzbzoNCi1yb2xlR3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IG9yaWVudGFcdTAwZTdcdTAwZjVlcyBmb3JhbSBzZWxlY2lvbmFkYXMuDQotDQotIyBSb2xlIEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9Q2F0ZWdvcmlhczoNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlcmVuY2llIGFzIGNhdGVnb3JpYXMgXHUwMGUwcyBxdWFpcyBlc3RhIGZ1blx1MDBlN1x1MDBlM28gcGVydGVuY2UuDQotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUNvbmp1bnRvcyBkZSBGdW5cdTAwZTdcdTAwZjVlczoNCi1yb2xlQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyPUNhdGVnb3JpYXMgQ3VzdG9taXphZGFzOg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPUNvbmp1bnRvcyBkZSBmdW5cdTAwZTdcdTAwZjVlczoNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9Q2F0ZWdvcmlhcyBjdXN0b21pemFkYXM6DQotDQotIyBUYXNrIEVkaXRvciBSb2xlcyBQYWdlDQotdGFza1JvbGVzUGFnZV9zZWN0aW9uTmFtZT1GdW5cdTAwZTdcdTAwZjVlcw0KLXRhc2tSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPURlc2lnbmUgYXMgZnVuXHUwMGU3XHUwMGY1ZXMgcGFyYSBkZXNlbXBlbmhhciBlc3RhIHRhcmVmYS4NCi10YXNrUm9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUZ1blx1MDBlN1x1MDBmNWVzIGRpc3Bvblx1MDBlZHZlaXM6DQotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsPUV4ZWN1dG9yIHByaW1cdTAwZTFyaW86DQotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsMj1FeGVjdXRvcmVzIGFkaWNpb25haXM6DQotdGFza1JvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBmdW5cdTAwZTdcdTAwZjVlcyBmb3JhbSBzZWxlY2lvbmFkYXMuDQotdGFza1JvbGVzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX21vZGlmeV9tZXNzYWdlPUlVUEEwMDA0NVc6IERlc2VqYSBhbHRlcmFyIG8gYWdlbnRlIHByaW1cdTAwZTFyaW8gcGFyYSAnJ3swfScnPw0KLXRhc2tSb2xlc1BhZ2VfY29uZmlybV90aXRsZT1Db25maXJtYXIgYWx0ZXJhXHUwMGU3XHUwMGUzbyBkZSBmdW5cdTAwZTdcdTAwZTNvIHByaW1cdTAwZTFyaWENCi0NCi0jIFRhc2sgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVByb2R1dG9zIGRlIFRyYWJhbGhvDQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUVzcGVjaWZpcXVlIG9zIHByb2R1dG9zIGRlIHRyYWJhbGhvIGRlIGVudHJhZGEgZSBkZSBzYVx1MDBlZGRhIHBhcmEgZXN0YSB0YXJlZmEuDQotdGFza1dvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9UHJvZHV0b3MgZGUgVHJhYmFsaG8gRGlzcG9uXHUwMGVkdmVpcw0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9RW50cmFkYXMgb2JyaWdhdFx1MDBmM3JpYXM6DQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9RW50cmFkYXMgb3BjaW9uYWlzOg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwzPVNhXHUwMGVkZGFzOg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHByb2R1dG9zIGRlIHRyYWJhbGhvIGZvcmFtIHNlbGVjaW9uYWRvcy4NCi0NCi0jIFRhc2sgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi10YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPU9yaWVudGFcdTAwZTdcdTAwZTNvDQotdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249Rm9ybmVcdTAwZTdhIGxpbmtzIHBhcmEgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGFkaWNpb25haXMgbmEgZm9ybWEgZGUgb3JpZW50YVx1MDBlN1x1MDBlM28uDQotdGFza0d1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1PcmllbnRhXHUwMGU3XHUwMGY1ZXMgRGlzcG9uXHUwMGVkdmVpczoNCi10YXNrR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9T3JpZW50YVx1MDBlN1x1MDBlM286DQotdGFza0d1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBvcmllbnRhXHUwMGU3XHUwMGY1ZXMgZm9yYW0gc2VsZWNpb25hZGFzLg0KLQ0KLSMgVGFzayBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotdGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPUNhdGVnb3JpYXMNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlcmVuY2llIGFzIGNhdGVnb3JpYXMgXHUwMGUwcyBxdWFpcyBlc3RhIHRhcmVmYSBwZXJ0ZW5jZS4NCi10YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9RGlzY2lwbGluYXMNCi10YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyPUNhdGVnb3JpYXMgUGVyc29uYWxpemFkYXMNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1EaXNjaXBsaW5hczoNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9Q2F0ZWdvcmlhcyBjdXN0b21pemFkYXM6DQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIFRhc2tzIFBhZ2UNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uTmFtZT1UYXJlZmFzDQotV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPUVzdGUgcHJvZHV0byBkZSB0cmFiYWxobyBcdTAwZTkgdW1hIGVudHJhZGEgb3Ugc2FcdTAwZWRkYSBwYXJhIGFzIHRhcmVmYXMgYSBzZWd1aXIuDQotV29ya1Byb2R1Y3RfVGFza3NfQXZhaWxhYmxlTGFiZWw9VGFyZWZhcyBkaXNwb25cdTAwZWR2ZWlzDQotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbD1FbnRyYWRhIG9icmlnYXRcdTAwZjNyaWE6DQotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDI9RW50cmFkYSBvcGNpb25hbDoNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMz1TYVx1MDBlZGRhOg0KLVdvcmtQcm9kdWN0X1Rhc2tzX011bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHRhcmVmYXMgZm9yYW0gc2VsZWNpb25hZGFzLg0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBSb2xlcyBQYWdlDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU9RnVuXHUwMGU3XHUwMGY1ZXMNCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QXMgdGFyZWZhcyBhIHNlZ3VpciBzXHUwMGUzbyByZXNwb25zXHUwMGUxdmVpcyBwb3IgZXN0ZSBwcm9kdXRvIGRlIHRyYWJhbGhvIG91IG8gbW9kaWZpY2FtLg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUZ1blx1MDBlN1x1MDBmNWVzIGRpc3Bvblx1MDBlZHZlaXMNCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsPUZ1blx1MDBlN1x1MDBlM28gcmVzcG9uc1x1MDBlMXZlbDoNCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsMj1GdW5cdTAwZTdcdTAwZjVlcyBtb2RpZmljYWRvcmFzOg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGZ1blx1MDBlN1x1MDBmNWVzIGZvcmFtIHNlbGVjaW9uYWRhcy4NCi0NCi0jIyBXb3JrIFByb2R1Y3QgRWRpdG9yIERlbGl2ZXJhYmxlIFBhcnRzIFBhZ2UNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25OYW1lPVBhcnRlcyBEaXN0cmlidVx1MDBlZHZlaXMNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Fc3BlY2lmaXF1ZSBvcyBwcm9kdXRvcyBkZSB0cmFiYWxobyBxdWUgY29uc3RpdHVlbSBlc3RlIGRpc3RyaWJ1XHUwMGVkdmVsLg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9UHJvZHV0b3MgZGUgdHJhYmFsaG8gZGlzcG9uXHUwMGVkdmVpcyBjb21vIHBhcnRlcyBkaXN0cmlidVx1MDBlZHZlaXM6DQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWxlY3RlZExhYmVsPVByb2R1dG9zIGRlIHRyYWJhbGhvIGNvbW8gcGFydGVzIGRpc3RyaWJ1XHUwMGVkdmVpczoNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHByb2R1dG9zIGRlIHRyYWJhbGhvIGZvcmFtIHNlbGVjaW9uYWRvcy4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPU9yaWVudGFcdTAwZTdcdTAwZTNvDQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUZvcm5lXHUwMGU3YSBsaW5rcyBwYXJhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBhZGljaW9uYWlzIG5hIGZvcm1hIGRlIG9yaWVudGFcdTAwZTdcdTAwZTNvLg0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPU9yaWVudGFcdTAwZTdcdTAwZjVlcyBEaXNwb25cdTAwZWR2ZWlzOg0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9T3JpZW50YVx1MDBlN1x1MDBlM286DQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gb3JpZW50YVx1MDBlN1x1MDBmNWVzIGZvcmFtIHNlbGVjaW9uYWRhcy4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1DYXRlZ29yaWFzDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R2VyZW5jaWUgYXMgY2F0ZWdvcmlhcyBcdTAwZTBzIHF1YWlzIGVzdGUgcHJvZHV0byBkZSB0cmFiYWxobyBwZXJ0ZW5jZS4NCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPURvbVx1MDBlZG5pb3MNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1UaXBvcyBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvOg0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwzPUNhdGVnb3JpYXMgQ3VzdG9taXphZGFzOg0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Eb21cdTAwZWRuaW86DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1UaXBvIGRlIHByb2R1dG8gZGUgdHJhYmFsaG86DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMz1DYXRlZ29yaWFzIGN1c3RvbWl6YWRhczoNCi0NCi0jIFByYWN0aWNlIEVkaXRvciBSZWZlcmVuY2VzIFBhZ2UNCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25OYW1lPUVsZW1lbnRvcyBkZSBDb250ZVx1MDBmYWRvDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249RXNwZWNpZmlxdWUgb3MgZWxlbWVudG9zIGRlIGNvbnRlXHUwMGZhZG8gcmVmZXJlbmNpYWRvcyBwb3IgZXN0YSBwclx1MDBlMXRpY2EuDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9hdmFpbGFibGVMYWJlbD1FbGVtZW50b3MgZGUgY29udGVcdTAwZmFkbyBkaXNwb25cdTAwZWR2ZWlzOg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1FbGVtZW50b3MgZGUgY29udGVcdTAwZmFkbzoNCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGVsZW1lbnRvcyBkZSBjb250ZVx1MDBmYWRvIGZvcmFtIHNlbGVjaW9uYWRvcy4NCi0NCi0jIENhdGVnb3J5IEVkaXRvciBHdWlkYW5jZSBQYWdlDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlY3Rpb25OYW1lPU9yaWVudGFcdTAwZTdcdTAwZTNvDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXJlbmNpZSBhIG9yaWVudGFcdTAwZTdcdTAwZTNvIHF1ZSBwZXJ0ZW5jZSBhIGVzdGUvZXN0YSB7MH0uDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsPU9yaWVudGFcdTAwZTdcdTAwZjVlcyBEaXNwb25cdTAwZWR2ZWlzOg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsPU9yaWVudGFcdTAwZTdcdTAwZTNvOg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBvcmllbnRhXHUwMGU3XHUwMGY1ZXMgZm9yYW0gc2VsZWNpb25hZGFzLg0KLQ0KLSMgRGlzY2lwbGluZSBHcm91cGluZyBFZGl0b3IgRGlzY2lwbGluZXMgUGFnZQ0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uTmFtZT1EaXNjaXBsaW5hcw0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249R2VyZW5jaWUgYXMgZGlzY2lwbGluYXMgcXVlIHBlcnRlbmNlbSBhIGVzdGUgYWdydXBhbWVudG8gZGUgZGlzY2lwbGluYXMuDQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX2F2YWlsYWJsZUxhYmVsPURpc2NpcGxpbmFzIERpc3Bvblx1MDBlZHZlaXM6DQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw9RGlzY2lwbGluYXM6DQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGRpc2NpcGxpbmFzIGZvcmFtIHNlbGVjaW9uYWRhcy4NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX1VzZURlZmF1bHREaXJlY3RvcnlCdXR0b25MYWJlbD1VdGlsaXphciBkaXJldFx1MDBmM3JpbyBwYWRyXHUwMGUzbw0KLQ0KLSMgRGlzY2lwbGluZSBFZGl0b3IgVGFza3MgUGFnZQ0KLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbk5hbWU9VGFyZWZhcw0KLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlcmVuY2llIGFzIHRhcmVmYXMgcXVlIHBlcnRlbmNlbSBhIGVzdGEgZGlzY2lwbGluYS4NCi1kaXNjaXBsaW5lVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPVRhcmVmYXMgZGlzcG9uXHUwMGVkdmVpczoNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw9VGFyZWZhczoNCi1kaXNjaXBsaW5lVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHRhcmVmYXMgZm9yYW0gc2VsZWNpb25hZGFzLg0KLQ0KLSMgRGlzY2lwbGluZSBFZGl0b3IgUmVmZXJlbmNlIFdvcmtmbG93IFBhZ2UNCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25OYW1lPUZsdXhvcyBkZSBUcmFiYWxobyBkZSBSZWZlclx1MDBlYW5jaWENCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXJlbmNpZSBvcyBmbHV4b3MgZGUgdHJhYmFsaG8gZGUgcmVmZXJcdTAwZWFuY2lhIHF1ZSBwZXJ0ZW5jZW0gYSBlc3RhIGRpc2NpcGxpbmEuDQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9hdmFpbGFibGVMYWJlbD1GbHV4b3MgZGUgVHJhYmFsaG8gZGUgUmVmZXJcdTAwZWFuY2lhIERpc3Bvblx1MDBlZHZlaXM6DQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWxlY3RlZExhYmVsPUZsdXhvcyBkZSB0cmFiYWxobyBkZSByZWZlclx1MDBlYW5jaWE6DQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBmbHV4b3MgZGUgdHJhYmFsaG8gZGUgcmVmZXJcdTAwZWFuY2lhIGZvcmFtIHNlbGVjaW9uYWRvcy4NCi0NCi0jIERvbWFpbiBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Qcm9kdXRvcyBkZSBUcmFiYWxobw0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlcmVuY2llIG9zIHByb2R1dG9zIGRlIHRyYWJhbGhvIHF1ZSBwZXJ0ZW5jZW0gYSBlc3RlIGRvbVx1MDBlZG5pby4NCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVByb2R1dG9zIGRlIHRyYWJhbGhvIGRpc3Bvblx1MDBlZHZlaXM6DQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVByb2R1dG9zIGRlIHRyYWJhbGhvOg0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gcHJvZHV0b3MgZGUgdHJhYmFsaG8gZm9yYW0gc2VsZWNpb25hZG9zLg0KLQ0KLSMgV29yayBQcm9kdWN0IEtpbmQgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9UHJvZHV0b3MgZGUgVHJhYmFsaG8NCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXJlbmNpZSBvcyBwcm9kdXRvcyBkZSB0cmFiYWxobyBxdWUgcGVydGVuY2VtIGEgZXN0ZSB0aXBvIGRlIHByb2R1dG8gZGUgdHJhYmFsaG8uDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1Qcm9kdXRvcyBkZSB0cmFiYWxobyBkaXNwb25cdTAwZWR2ZWlzOg0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Qcm9kdXRvcyBkZSB0cmFiYWxobzoNCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHByb2R1dG9zIGRlIHRyYWJhbGhvIGZvcmFtIHNlbGVjaW9uYWRvcy4NCi0NCi0jIFJvbGUgU2V0IEdyb3VwaW5nIEVkaXRvciBSb2xlIFNldHMgUGFnZQ0KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWN0aW9uTmFtZT1Db25qdW50b3MgZGUgRnVuXHUwMGU3XHUwMGY1ZXMNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlcmVuY2llIG9zIGNvbmp1bnRvcyBkZSBmdW5cdTAwZTdcdTAwZjVlcyBxdWUgcGVydGVuY2VtIGEgZXN0ZSBhZ3J1cGFtZW50byBkZSBjb25qdW50b3MgZGUgZnVuXHUwMGU3XHUwMGY1ZXMuDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX2F2YWlsYWJsZUxhYmVsPUNvbmp1bnRvcyBkZSBGdW5cdTAwZTdcdTAwZjVlcyBEaXNwb25cdTAwZWR2ZWlzOg0KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWxlY3RlZExhYmVsPUNvbmp1bnRvcyBkZSBmdW5cdTAwZTdcdTAwZjVlczoNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gY29uanVudG9zIGRlIGZ1blx1MDBlN1x1MDBmNWVzIGZvcmFtIHNlbGVjaW9uYWRvcy4NCi0NCi0jIFJvbGUgU2V0IEVkaXRvciBSb2xlcyBQYWdlDQotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uTmFtZT1GdW5cdTAwZTdcdTAwZjVlcw0KLXJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUdlcmVuY2llIGFzIGZ1blx1MDBlN1x1MDBmNWVzIHF1ZSBwZXJ0ZW5jZW0gYSBlc3RlIGNvbmp1bnRvIGRlIGZ1blx1MDBlN1x1MDBmNWVzLg0KLXJvbGVTZXRSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9RnVuXHUwMGU3XHUwMGY1ZXMgZGlzcG9uXHUwMGVkdmVpczoNCi1yb2xlU2V0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9RnVuXHUwMGU3XHUwMGY1ZXM6DQotcm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBmdW5cdTAwZTdcdTAwZjVlcyBmb3JhbSBzZWxlY2lvbmFkYXMuDQotDQotIyBUb29sIEVkaXRvciBUb29sIE1lbnRvcnMgUGFnZQ0KLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbk5hbWU9TWVudG9yZXMgZGUgRmVycmFtZW50YXMNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXJlbmNpZSBvcyBtZW50b3JlcyBkZSBmZXJyYW1lbnRhcyBxdWUgcGVydGVuY2VtIGEgZXN0YSBmZXJyYW1lbnRhLg0KLXRvb2xUb29sTWVudG9yc1BhZ2VfYXZhaWxhYmxlTGFiZWw9TWVudG9yZXMgZGUgZmVycmFtZW50YXMgZGlzcG9uXHUwMGVkdmVpczoNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlbGVjdGVkTGFiZWw9TWVudG9yZXMgZGUgZmVycmFtZW50YXM6DQotdG9vbFRvb2xNZW50b3JzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBtZW50b3JlcyBkZSBmZXJyYW1lbnRhcyBmb3JhbSBzZWxlY2lvbmFkb3MuDQotDQotIyBDdXN0b20gQ2F0ZWdvcnkgRWRpdG9yIEFzc2lnbiBQYWdlDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25OYW1lPUVsZW1lbnRvcyBkZSBDb250ZVx1MDBmYWRvDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1HZXJlbmNpZSBvcyBlbGVtZW50b3MgZGUgY29udGVcdTAwZmFkbyBxdWUgY29uc3RpdHVlbSBlc3RhIGNhdGVnb3JpYSBjdXN0b21pemFkYS4NCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfYXZhaWxhYmxlTGFiZWw9RWxlbWVudG9zIGRlIENvbnRlXHUwMGZhZG8gRGlzcG9uXHUwMGVkdmVpczoNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VsZWN0ZWRMYWJlbD1FbGVtZW50b3MgZGUgY29udGVcdTAwZmFkbzoNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gZWxlbWVudG9zIGRlIGNvbnRlXHUwMGZhZG8gZm9yYW0gc2VsZWNpb25hZG9zLg0KLQ0KLSMgTmV3IE1ldGhvZCBQbHVnLWluIFdpemFyZA0KLW5ld1BsdWdpbldpemFyZF90aXRsZT1Ob3ZvIFBsdWctaW4gZGUgTVx1MDBlOXRvZG8NCi1uZXdQbHVnaW5XaXphcmRQYWdlX3RpdGxlPUNyaWUgdW0gbm92byBwbHVnLWluIGRlIG1cdTAwZTl0b2RvDQotbmV3UGx1Z2luV2l6YXJkUGFnZV90ZXh0PUVzcGVjaWZpcXVlIHVtIG5vbWUgZSBmb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBvIG5vdm8gcGx1Zy1pbiBkZSBtXHUwMGU5dG9kby4NCi1uZXdQbHVnaW5FcnJvcl9tc2c9SVVQQTAwMjFFOiBOXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBjcmlhciBvIHBsdWctaW4gZGUgbVx1MDBlOXRvZG8uDQotbmV3UGx1Z2luRXJyb3JfcmVhc29uPUVycm8gaW50ZXJuby5cblwNCi1cblwNCi1DbGlxdWUgZW0gRGV0YWxoZXMgcGFyYSBvYnRlciBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcy4NCi0NCi0jIEdlbmVyaWMgZGlhbG9nIHRpdGxlcw0KLWNyZWF0ZURpYWxvZ190aXRsZT1DcmlhciBFbGVtZW50bw0KLWRlbGV0ZURpYWxvZ190aXRsZT1FeGNsdWlyIEVsZW1lbnRvDQotZWRpdERpYWxvZ190aXRsZT1FZGl0YXIgRWxlbWVudG8NCi1lcnJvckRpYWxvZ190aXRsZT1FcnJvDQotbW92ZURpYWxvZ190aXRsZT1Nb3ZlciBFbGVtZW50bw0KLXJlbmFtZURpYWxvZ190aXRsZT1SZW5vbWVhciBFbGVtZW50bw0KLXdhcm5pbmdEaWFsb2dfdGl0bGU9QXZpc28NCi0NCi0jIEFkZCBDb25maWd1cmF0aW9uIHRvIFByb2Nlc3MgRXJyb3IgRGlhbG9nDQotYWRkQ29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9SW5jbHVpciBDb25maWd1cmFcdTAwZTdcdTAwZTNvIGVtIFByb2Nlc3NvDQotDQotIyBTZXQgRGVmYXVsdCBDb25maWd1cmF0aW9uIEVycm9yIERpYWxvZw0KLXNldERlZmF1bHRDb25maWdFcnJvckRpYWxvZ190aXRsZT1EZWZpbmlyIENvbmZpZ3VyYVx1MDBlN1x1MDBlM28gUGFkclx1MDBlM28gcGFyYSBQcm9jZXNzbw0KLQ0KLSMgRWRpdCBQcm9jZXNzIEVycm9yIERpYWxvZw0KLWVkaXRQcm9jZXNzRWxlbWVudEVycm9yRGlhbG9nX3RpdGxlPUVkaXRhciBFbGVtZW50byBkZSBQcm9jZXNzbw0KLQ0KLSMgT3BlbiBMaWJyYXJ5IERpYWxvZw0KLW9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlPUFicmlyIEJpYmxpb3RlY2EgZGUgTVx1MDBlOXRvZG9zDQotb3BlbkxpYnJhcnlEaWFsb2dfdGV4dD1BIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGF0dWFsIG5cdTAwZTNvIGZvaSBzYWx2YSBjb3JyZXRhbWVudGUuIERlc2VqYSBpZ25vcmFyIG8gZXJybyBlIGNvbnRpbnVhciBwYXJhIGFicmlyIG91dHJhIGJpYmxpb3RlY2E/DQotDQotIyBTYXZlIExpYnJhcnkgRGlhbG9nDQotc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGU9U2FsdmFyIEJpYmxpb3RlY2EgZGUgTVx1MDBlOXRvZG9zDQotc2F2ZUxpYnJhcnlEaWFsb2dfdGV4dD1BIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGF0dWFsIGZvaSBtb2RpZmljYWRhLiBEZXNlamEgc2FsdmFyIGFzIGFsdGVyYVx1MDBlN1x1MDBmNWVzPw0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPUZhemVyIFVwZ3JhZGUgZGUgQmlibGlvdGVjYSBkZSBNXHUwMGU5dG9kb3MNCi0NCi0jIERlbGV0ZSBFbGVtZW50IFJlZmVyZW5jZSBEaWFsb2cNCi1kZWxldGVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PU8gZWxlbWVudG8gJyd7MH0nJyBqXHUwMGUxIGZvaSBleGNsdVx1MDBlZGRvLiBEZXNlamEgcmVtb3ZcdTAwZWEtbG8gZGUgJyd7MX0nJz8NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbm9PcGVuTGlicmFyeUVycm9yX21zZz1JVVBBMDAwMEU6IE5lbmh1bWEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZXN0XHUwMGUxIGFiZXJ0YS5cblwNCi1cblwNCi1cdTAwYzkgcHJlY2lzbyBxdWUgaGFqYSB1bWEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgYWJlcnRhIHBhcmEgcG9kZXIgaW5jbHVpciB1bSBub3ZvIGVsZW1lbnRvIGRlIG1cdTAwZTl0b2RvLlxuXA0KLVxuXA0KLUNyaWUgdW1hIG5vdmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3Mgb3UgYWJyYSB1bWEgZXhpc3RlbnRlIGUgdGVudGUgbm92YW1lbnRlLg0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDFFOiBPIG5vbWUgZGUgezB9IGVzdFx1MDBlMSBhdXNlbnRlLlxuXA0KLVxuXA0KLVRvZG9zIG9zIGVsZW1lbnRvcyBkZSBtXHUwMGU5dG9kbyBlIGRlIHByb2Nlc3NvIGRldmVtIHRlciB1bSBub21lLlxuXA0KLVxuXA0KLUNsaXF1ZSBlbSBPSyBlIGRpZ2l0ZSB1bSBub21lIHZcdTAwZTFsaWRvIHBhcmEgbyBlbGVtZW50by4NCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZz1JVVBBMDAwMkU6IE8gbm9tZSAnJ3swfScnIGpcdTAwZTEgZXhpc3RlLlxuXA0KLVxuXA0KLVVtIGVsZW1lbnRvIGRlIG1cdTAwZTl0b2RvIGRldmUgdGVyIHVtIG5vbWUgZXhjbHVzaXZvLlxuXA0KLVxuXA0KLUNsaXF1ZSBlbSBPSyBlIGRpZ2l0ZSB1bSBub21lIGRpZmVyZW50ZSBwYXJhIG8gZWxlbWVudG8uDQotY3JlYXRlQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDAzRTogTlx1MDBlM28gXHUwMGU5IHBvc3NcdTAwZWR2ZWwgY3JpYXIgYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRvIG1cdTAwZTl0b2RvLg0KLWRlbGV0ZUNvbmZpZ0Vycm9yX21zZz1JVVBBMDAwNFc6IE5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIGV4Y2x1aXIgYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRvIG1cdTAwZTl0b2RvLg0KLWludGVybmFsRXJyb3JfbXNnPUlVUEEwMDA1RTogT2NvcnJldSB1bSBlcnJvIGludGVybm8uXG5cDQotXG5cDQotQ2xpcXVlIGVtIERldGFsaGVzIHBhcmEgb2J0ZXIgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGFkaWNpb25haXMuDQotaW52YWxpZFByZXNlbnRhdGlvbk5hbWVFcnJvcl9tc2c9SVVQQTAwMDZFOiBPIG5vbWUgZGUgYXByZXNlbnRhXHUwMGU3XHUwMGUzbyBlc3BlY2lmaWNhZG8gXHUwMGU5IGludlx1MDBlMWxpZG8uXG5cDQotXG5cDQotQ2xpcXVlIGVtIE9LIGUgZGlnaXRlIHVtIG5vbWUgZGlmZXJlbnRlLg0KLWludmFsaWRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDdFOiBBIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGUgbVx1MDBlOXRvZG8gc2VsZWNpb25hZGEgJyd7MH0nJyBuXHUwMGUzbyBcdTAwZTkgdW0gc3ViY29uanVudG8gZGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBwYWRyXHUwMGUzbyBkb3MgcHJvY2Vzc29zIHBhZHJcdTAwZTNvLlxuXA0KLVxuXA0KLVBhcmEgbWFudGVyIGEgaW50ZWdyaWRhZGUgZGUgdW0gcHJvY2Vzc28sIHN1YSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHBhZHJcdTAwZTNvIGRldmUgc2VyIHVtIHN1cGVyY29uanVudG8gZGUgdG9kYXMgYXMgb3V0cmFzIGNvbmZpZ3VyYVx1MDBlN1x1MDBmNWVzIGFzc29jaWFkYXMgYW8gcHJvY2Vzc28uXG5cDQotXG5cDQotU2VsZWNpb25lIG91dHJhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gb3UgbW9kaWZpcXVlIGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBwYWRyXHUwMGUzbyBwYXJhIGluY2x1aXIgbyBjb250ZVx1MDBmYWRvIGRhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gc2VsZWNpb25hZGEgZSB0ZW50ZSBub3ZhbWVudGUuDQotc2V0RGVmYXVsdENvbmZpZ0Vycm9yX21zZz1JVVBBMDAwOEU6IEEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBtXHUwMGU5dG9kbyBzZWxlY2lvbmFkYSAnJ3swfScnIG5cdTAwZTNvIFx1MDBlOSB1bSBzdXBlcmNvbmp1bnRvIGRhcyBvdXRyYXMgY29uZmlndXJhXHUwMGU3XHUwMGY1ZXMgcmVmZXJlbmNpYWRhcyBwZWxvIHByb2Nlc3NvLlxuXA0KLVxuXA0KLVBhcmEgbWFudGVyIGEgaW50ZWdyaWRhZGUgZGUgdW0gcHJvY2Vzc28sIHN1YSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHBhZHJcdTAwZTNvIGRldmUgc2VyIHVtIHN1cGVyY29uanVudG8gZGUgdG9kYXMgYXMgb3V0cmFzIGNvbmZpZ3VyYVx1MDBlN1x1MDBmNWVzIGFzc29jaWFkYXMgYW8gcHJvY2Vzc28uXG5cDQotXG5cDQotU2VsZWNpb25lIG91dHJhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gb3UgbW9kaWZpcXVlIG8gY29udGVcdTAwZmFkbyBkYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHNlbGVjaW9uYWRhIGUgdGVudGUgbm92YW1lbnRlLg0KLW9wZW5MaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDA5RTogTlx1MDBlM28gXHUwMGU5IHBvc3NcdTAwZWR2ZWwgY2FycmVnYXIgYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy5cblwNCi1cblwNCi1DbGlxdWUgZW0gRGV0YWxoZXMgcGFyYSBvYnRlciBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcy4NCi1zYXZlTGlicmFyeUVycm9yX21zZz1JVVBBMDAxMEU6IE5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIHNhbHZhciBhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLg0KLXNhdmVMaWJyYXJ5VG9FcnJvcl9tc2c9SVVQQTAwMTBFOiBOXHUwMGUzbyBcdTAwZTkgcG9zc1x1MDBlZHZlbCBzYWx2YXIgYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBwYXJhICcnezB9JycuDQotZWxlbWVudEFscmVhZHlEZWxldGVkRXJyb3JfbXNnPUlVUEEwMDExRTogTyBlbGVtZW50byAnJ3swfScnIGpcdTAwZTEgZm9pIGV4Y2x1XHUwMGVkZG8uDQotdXBncmFkZUxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTJFOiBOXHUwMGUzbyBcdTAwZTkgcG9zc1x1MDBlZHZlbCBmYXplciB1cGdyYWRlIGRhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLg0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVycm9yX3JlYXNvbj1JVVBBMDAxNkU6IE9jb3JyZXUgdW0gZXJyby5cblwNCi1cblwNCi1DbGlxdWUgZW0gRGV0YWxoZXMgcGFyYSBvYnRlciBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcy4NCi1pbnRlcm5hbEVycm9yX3JlYXNvbj1JVVBBMDAxN0U6IE9jb3JyZXUgdW0gZXJybyBpbnRlcm5vLlxuXA0KLVxuXA0KLUNsaXF1ZSBlbSBEZXRhbGhlcyBwYXJhIG9idGVyIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBhZGljaW9uYWlzLg0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfcmVhc29uPUlVUEEwMDE4RTogT2NvcnJldSB1bSBlcnJvIGFvIGNhcnJlZ2FyIG9zIGVsZW1lbnRvcyBkYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy5cblwNCi1cblwNCi1DbGlxdWUgZW0gRGV0YWxoZXMgcGFyYSBvYnRlciBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcy4NCi1zYXZlVXBncmFkZWRMaWJyYXJ5RXJyb3JfcmVhc29uPUlVUEEwMDE5RTogT2NvcnJldSB1bSBlcnJvIGFvIHNhbHZhciBhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGF0dWFsaXphZGEuXG5cDQotXG5cDQotQ2xpcXVlIGVtIERldGFsaGVzIHBhcmEgb2J0ZXIgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGFkaWNpb25haXMuDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLW9wZW5pbmdMaWJyYXJ5VGFza19uYW1lPUFicmluZG8gYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy4uLg0KLXNhdmluZ0xpYnJhcnlUYXNrX25hbWU9U2FsdmFuZG8gYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuLi4NCi11cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lPUZhemVuZG8gdXBncmFkZSBkYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy4uLg0KLWxvYWRpbmdMaWJyYXJ5RWxlbWVudHNUYXNrX25hbWU9Q2FycmVnYW5kbyBlbGVtZW50b3MgZGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuLi4NCi1zYXZpbmdVcGdyYWRlZEVsZW1lbnRzVGFza19uYW1lPVNhbHZhbmRvIGVsZW1lbnRvcyBkYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBlbSBub3ZvIGZvcm1hdG8gZGUgYXJxdWl2by4uLg0KLXNhdmluZ1Rhc2tfbmFtZT1TYWx2YW5kbyAnJ3swfScnLi4uDQotc2F2aW5nRmlsZXNUYXNrX25hbWU9U2FsdmFuZG8gYXJxdWl2b3MuLi4NCi1maXhpbmdDb250ZW50RGVzY3JpcHRpb25HVUlEc1Rhc2tfbmFtZT1Db3JyaWdpbmRvIEdVSURzIGRlIGRlc2NyaVx1MDBlN1x1MDBlM28gZGUgY29udGVcdTAwZmFkby4uLg0KLWRlbGV0aW5nSW52YWxpZFJlZmVyZW5jZXNUYXNrX25hbWU9RXhjbHVpbmRvIHJlZmVyXHUwMGVhbmNpYXMgaW52XHUwMGUxbGlkYXMuLi4NCi0NCi0NCi0jIEFkZCBFZGl0b3IgVG8gQnJvd3NpbmcgUGVyc3BlY3RpdmUgV2FybmluZyBEaWFsb2cNCi1hZGRFZGl0b3JUb1BlcnNwZWN0aXZlV2FybmluZ19tc2c9SVVQQTAwNDZXOiBFc3RhIHBlcnNwZWN0aXZhIGZvaSBkZXNlbnZvbHZpZGEgZXNwZWNpYWxtZW50ZSBwYXJhIG1heGltaXphciBhIGV4cGVyaVx1MDBlYW5jaWEgZG8gdXN1XHUwMGUxcmlvIGVtIHJlbGFcdTAwZTdcdTAwZTNvIFx1MDBlMCBuYXZlZ2FcdTAwZTdcdTAwZTNvIG5hIHJlcHJlc2VudGFcdTAwZTdcdTAwZTNvIEhUTUwgZG9zIGVsZW1lbnRvcyBkYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy4gTmVuaHVtIGVkaXRvciBwb2RlIHNlciBpbmNsdVx1MDBlZGRvIG91IGV4aWJpZG8gYXF1aS4NCi0NCi0jIENoYW5nZSBIaXN0b3J5IERpYWxvZw0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfdGl0bGU9QWx0ZXJhciBIaXN0XHUwMGYzcmljbyBkZSBEZXNjcmlcdTAwZTdcdTAwZTNvDQotQ2hhbmdlSGlzdG9yeURpYWxvZ19sYWJlbD1BbHRlcmFyIG8gaGlzdFx1MDBmM3JpY286DQotDQotIyBNZXRob2QgRWxlbWVudCBEZWxldGUgQWN0aW9uDQotY29uZmlybURlbGV0ZURpYWxvZ190aXRsZT1Db25maXJtYXIgRXhjbHVzXHUwMGUzbw0KLWNvbmZpcm1EZWxldGVEaWFsb2dfbXNnPVRlbSBjZXJ0ZXphIGRlIHF1ZSBkZXNlamEgZXhjbHVpciAnJ3swfScnPw0KLWNvbmZpcm1EZWxldGVEaWFsb2dfbXNnV2l0aFJlZmVyZW5jZT1UZW0gY2VydGV6YSBkZSBxdWUgZGVzZWphIGV4Y2x1aXIgJyd7MH0nJz9cblwNCi1cblwNCi1PcyBzZWd1aW50ZXMgZWxlbWVudG9zIGNvbnRcdTAwZWFtIHJlZmVyXHUwMGVhbmNpYXMgYW9zIHRlcm1vcyBhIHNlcmVtIGV4Y2x1XHUwMGVkZG9zOiB7MX0NCi0NCi0jIE5ldyBMaWJyYXJ5IERpYWxvZw0KLWVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjJFOiBOXHUwMGUzbyBcdTAwZTkgcG9zc1x1MDBlZHZlbCBjcmlhciBhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zICcnezB9JycuDQotZXJyb3JEaWFsb2dfZXJyb3I9SW1wb3NzXHUwMGVkdmVsIGNyaWFyIHVtYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBkZW50cm8gZGUgb3V0cmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuDQotZXJyX25vb3BlbmxpYnJhcnk9SVVQQTAwNDBFOiBOZW5odW1hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGVzdFx1MDBlMSBhYmVydGEuXG5cDQotXG5cDQotXHUwMGM5IHByZWNpc28gcXVlIGhhamEgdW1hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGFiZXJ0YSBwYXJhIHBvZGVyIGluY2x1aXIgdW0gbm92byBwbHVnLWluIGRlIG1cdTAwZTl0b2RvLlxuXA0KLVxuXA0KLUNyaWUgdW1hIG5vdmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3Mgb3UgYWJyYSB1bWEgZXhpc3RlbnRlIGUgdGVudGUgbm92YW1lbnRlLg0KLWVycl9sb2FkaW5nbGlicmFyeT1FcnJvIGFvIGNhcnJlZ2FyIGJpYmxpb3RlY2ENCi1tc2dfcmVsb2FkTGlicmFyeT1FcnJvIGFvIGRlc2ZhemVyIGEgZXhjbHVzXHUwMGUzbyBxdWUgZmFsaG91LiBBIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGF0dWFsIHByZWNpc2Egc2VyIHJlY2FycmVnYWRhLg0KLQ0KLSMgUmVsb2FkIExpYnJhcnkgRGlhbG9nDQotcmVsb2FkRGlhbG9nX21lc3NhZ2U9QSBiaWJsaW90ZWNhIHByZWNpc2Egc2VyIHJlY2FycmVnYWRhIHBhcmEgcmVzdGF1cmFyIHNldSBlc3RhZG8gb3JpZ2luYWwuDQotcmVsb2FkRGlhbG9nX3RpdGxlPVJlY2FycmVnYXIgQmlibGlvdGVjYQ0KLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvclRpdGxlPUVycm8gZGUgTW92aW1lbnRhXHUwMGU3XHUwMGUzbw0KLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvck1lc3NhZ2U9RXJybyBkdXJhbnRlIGEgbW92aW1lbnRhXHUwMGU3XHUwMGUzbw0KLQ0KLSMgUHJvY2VzcyBGb3JtIEVkaXRvcg0KLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ190aXRsZT1TYWx2YXINCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTE9RXN0YSBhbHRlcmFcdTAwZTdcdTAwZTNvIGFmZXRhclx1MDBlMSB0b2RvcyBvcyBkaWFncmFtYXMgbm8gcHJvY2Vzc28uIE8gZWRpdG9yIHNlclx1MDBlMSBzYWx2byBhcFx1MDBmM3MgYSBhbHRlcmFcdTAwZTdcdTAwZTNvLiBEZXNlamEgY29udGludWFyPw0KLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMj1PIGVkaXRvciBzZXJcdTAwZTEgc2Fsdm8gYXBcdTAwZjNzIGEgYWx0ZXJhXHUwMGU3XHUwMGUzby4gRGVzZWphIGNvbnRpbnVhcj8NCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBQYWdlDQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX3RpdGxlPUNvbmZpcm1hciBSZW1vXHUwMGU3XHUwMGUzbw0KLWNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ19tZXNzYWdlPXRlbSBjZXJ0ZXphIGRlIHF1ZSBkZXNlamEgcmVtb3ZlciBhIHZpc3VhbGl6YVx1MDBlN1x1MDBlM28gJyd7MH0nJz8NCi1jb25maWdWaWV3UGFnZVZpZXdFeGlzdHNEaWFsb2dfdGl0bGU9QXZpc28NCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uPUNvbmZpZ3VyYVx1MDBlN1x1MDBlM286DQotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdzPVZpc3VhbGl6YVx1MDBlN1x1MDBmNWVzIGRlIENvbmZpZ3VyYVx1MDBlN1x1MDBlM28NCi1jb25maWdWaWV3UGFnZV92aWV3cz1WaXN1YWxpemFcdTAwZTdcdTAwZjVlcw0KLWNvbHVtbnNlbGVjdGlvbl90ZXh0PVNlbGVcdTAwZTdcdTAwZTNvIGRlIGNvbHVuYToNCi1jb25maWdWaWV3UGFnZV9hZGRWaWV3QnV0dG9uVGV4dD1JbmNsdWlyIFZpc3VhbGl6YVx1MDBlN1x1MDBlM28uLi4NCi1jb25maWdWaWV3UGFnZV9yZW1vdmVWaWV3QnV0dG9uVGV4dD1SZW1vdmVyIFZpc3VhbGl6YVx1MDBlN1x1MDBlM28NCi1jb25maWdWaWV3UGFnZV9tYWtlRGVmYXVsdEJ1dHRvblRleHQ9VG9ybmFyIFBhZHJcdTAwZTNvDQotY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNXOiBBIHZpc3VhbGl6YVx1MDBlN1x1MDBlM28gY29tIG8gbm9tZSAnJ3swfScnIGpcdTAwZTEgZXhpc3RlLg0KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvblRpdGxlPVZpc3VhbGl6YVx1MDBlN1x1MDBmNWVzIGRlIE5hdmVnYVx1MDBlN1x1MDBlM28gUHVibGljYWRhcw0KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvbk1lc3NhZ2U9RXNwZWNpZmlxdWUgYXMgdmlzdWFsaXphXHUwMGU3XHUwMGY1ZXMgcXVlIHNlclx1MDBlM28gaW5jbHVcdTAwZWRkYXMgcXVhbmRvIGVzdGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBmb3IgcHVibGljYWRhLiBQYXJhIGNyaWFyIHVtYSB2aXN1YWxpemFcdTAwZTdcdTAwZTNvLCBjbGlxdWUgZW0gSW5jbHVpciBWaXN1YWxpemFcdTAwZTdcdTAwZTNvIHBhcmEgc2VsZWNpb25hciBxdWFscXVlciBjYXRlZ29yaWEgcGFkclx1MDBlM28gb3UgY3VzdG9taXphZGEgbmEgY29uZmlndXJhXHUwMGU3XHUwMGUzby4gQSBjYXRlZ29yaWEgc2VsZWNpb25hZGEgcmVwcmVzZW50YXJcdTAwZTEgYSB2aXN1YWxpemFcdTAwZTdcdTAwZTNvIGUgYXMgc3ViLWNhdGVnb3JpYXMgZSBvcyBlbGVtZW50b3MgZGUgY29udGVcdTAwZmFkbyBkYSBjYXRlZ29yaWEgcmVwcmVzZW50YXJcdTAwZTNvIG9zIGVsZW1lbnRvcyBkYSBcdTAwZTFydm9yZSBkYSB2aXN1YWxpemFcdTAwZTdcdTAwZTNvLg0KLQ0KLSMgRGVzY3JpcHRpb24gVGFiDQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfdGl0bGU9Q29udmVydGVyIE9yaWVudGFcdTAwZTdcdTAwZTNvDQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTE9SVVQQTAwNDBXOiBTYWx2ZSBvIGVkaXRvciBwcmltZWlyby4NCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMj1OXHUwMGUzbyBleGlzdGUgb3JpZW50YVx1MDBlN1x1MDBlM28gY29tcGF0XHUwMGVkdmVsIHBhcmEgZXN0ZSB0aXBvLg0KLQ0KLWNoYW5nZUFjdGl2aXR5VHlwZVdhcm5pbmdEaWFsb2dfdGl0bGU9Q29udmVydGVyIEF0aXZpZGFkZQ0KLSMgQXNzb2NpYXRpb24gRm9ybSBQYWdlDQotQXNzb2NpYXRpb25Gb3JtUGFnZV9CcmllZkRlc2NyaXB0aW9uTGFiZWw9RGVzY3JpXHUwMGU3XHUwMGUzbyByZXN1bWlkYSBkbyBlbGVtZW50byBzZWxlY2lvbmFkbzoNCi0NCi0jIE1ldGhvZCBFbGVtZW50IERlc2NyaXB0aW9uDQotbWV0aG9kRWxlbWVudERlc2NyaXB0aW9uRW1wdHlOYW1lRGlhbG9nX3RpdGxlPURpZ2l0YXIgTm9tZSBkZSBFbGVtZW50bw0KLW1ldGhvZEVsZW1lbnREZXNjcmlwdGlvbkVtcHR5TmFtZURpYWxvZ19tZXNzYWdlPU8gY2FtcG8gZGUgbm9tZSBuXHUwMGUzbyBwb2RlIGVzdGFyIHZhemlvLg0KLQ0KLSMgTWV0aG9kIFBsdWctaW4gRGVzY3JpcHRpb24NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblJlbW92ZVJlZkNvbmZpcm1fbWVzc2FnZT1DYW5jZWxhciBhIHNlbGVcdTAwZTdcdTAwZTNvIGRvcyBwbHVnLWlucyByZWZlcmVuY2lhZG9zIGFzc29jaWFkb3MgYW8gcGx1Zy1pbiAnJ3swfScnIHByb2R1emlyXHUwMGUxIHJlbGFjaW9uYW1lbnRvcyBpbnZcdTAwZTFsaWRvcyBxdWUgc2VyXHUwMGUzbyBleGNsdVx1MDBlZGRvcy5cblwNCi1cblwNCi1Fc3RhIGFcdTAwZTdcdTAwZTNvIG5cdTAwZTNvIHBvZGUgc2VyIGRlc2ZlaXRhLiBEZXNlamEgY29udGludWFyIGNvbSBlc3RhIGFsdGVyYVx1MDBlN1x1MDBlM28/DQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWU9Vm9jXHUwMGVhIGVzdFx1MDBlMSBwcmVzdGVzIGEgYWx0ZXJhciBvIG5vbWUgZGVzdGUgcGx1Zy1pbiBkZSBtXHUwMGU5dG9kbyBkZSAnJ3swfScnIHBhcmEgbyBub3ZvIG5vbWUgJyd7MX0nJy4gRXN0YSBhXHUwMGU3XHUwMGUzbyBpclx1MDBlMSBzYWx2YXIgZXN0ZSBlZGl0b3IgZSByZW5vbWVhciBhIHBhc3RhIGRlIHBsdWctaW5zIGNvbSBvIG5vdm8gbm9tZS4gRGVzZWphIGNvbnRpbnVhcj8NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZV90aXRsZT1SZW5vbWVhciBQbHVnLWluIGRlIE1cdTAwZTl0b2RvDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2Nhbm5vdFJlbmFtZVBsdWdpbkZvbGRlcj1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCByZW5vbWVhciBhIHBhc3RhIGRvIHBsdWdpbiBwYXJhIG8gbm92byBub21lLg0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luTGFiZWw9QmxvcXVlYXIgcGx1Zy1pbg0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luX21lc3NhZ2U9QSBhbHRlcmFcdTAwZTdcdTAwZTNvIEJsb3F1ZWFyIHBsdWctaW4gaXJcdTAwZTEgc2FsdmFyIGUgZmVjaGFyIG9zIGVkaXRvcmVzIGRlIGVsZW1lbnRvcyBhYmVydG9zIHF1ZSBwZXJ0ZW5jZXJlbSBhbyBwbHVnLWluICcnezB9JycuIERlc2VqYSBjb250aW51YXIgY29tIGVzdGEgYWx0ZXJhXHUwMGU3XHUwMGUzbz8NCi0NCi0jIFByb2Nlc3MgRGVzY3JpcHRpb24NCi1wcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV90aXRsZT1SZW5vbWVhcg0KLXByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX21lc3NhZ2U9Vm9jXHUwMGVhIGVzdFx1MDBlMSBwcmVzdGVzIGEgYWx0ZXJhciBvIG5vbWUgZGVzdGUgcHJvY2Vzc28uIElzc28gc2FsdmFyXHUwMGUxIGVzdGUgZWRpdG9yIGUgcmVub21lYXJcdTAwZTEgYSBwYXN0YSBkbyBwcm9jZXNzbyBjb20gbyBub3ZvIG5vbWUuIERlc2VqYSBjb250aW51YXI/DQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbj1EZXNjcmlcdTAwZTdcdTAwZTNvOg0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uU2VjdGlvblRpdGxlPUNvbmZpZ3VyYVx1MDBlN1x1MDBlM28NCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25NZXNzYWdlPUVzcGVjaWZpcXVlIHRvZGFzIGFzIGNvbmZpZ3VyYVx1MDBlN1x1MDBmNWVzIHZcdTAwZTFsaWRhcyBwYXJhIGVzdGUgcHJvY2Vzc28uIFNlbGVjaW9uZSB1bWEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBjb21vIGEgcGFkclx1MDBlM28uIEVsYSBwcmVjaXNhIHNlciB1bSBzdXBlcmNvbmp1bnRvIGRlIHRvZGFzIGFzIG91dHJhcyBjb25maWd1cmFcdTAwZTdcdTAwZjVlcy4NCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbnM9Q29uZmlndXJhXHUwMGU3XHUwMGY1ZXM6DQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2RlZmF1bHQ9KHBhZHJcdTAwZTNvKQ0KLVByb2Nlc3NEZXNjcmlwdGlvbl9zZWxlY3RDb25maWd1cmF0aW9uPVNlbGVjaW9uZSBhcyBjb25maWd1cmFcdTAwZTdcdTAwZjVlcyBhIHNlcmVtIGluY2x1XHUwMGVkZGFzLg0KLVByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQwPUlzdG8gc2FsdmFyXHUwMGUxIG8gZWRpdG9yIGF0dWFsIGUgYSBhbHRlcmFcdTAwZTdcdTAwZTNvIHNlclx1MDBlMSBwZXJtYW5lbnRlLiBUZW0gY2VydGV6YSBkZSBxdWUgZGVzZWphIGV4Y2x1aXIgJyd7MH0nJz8NCi1Qcm9jZXNzRGVsZXRlQWN0aW9uX3NlbGVjdERlc2NyaXB0b3JzVG9EZWxldGU9T3Mgc2VndWludGVzIGRlc2NyaXRvcmVzIG5cdTAwZTNvIHNcdTAwZTNvIHV0aWxpemFkb3MgZW0gbmVuaHVtIGx1Z2FyIGFwXHUwMGYzcyBhIGV4Y2x1c1x1MDBlM28gZG9zIGVsZW1lbnRvcyBzZWxlY2lvbmFkb3MuXG5cDQotU2VsZWNpb25lIG9zIGRlc2NyaXRvcmVzIHF1ZSB2b2NcdTAwZWEgZGVzZWphIGV4Y2x1aXIuDQotDQotIyBWaWV3IEhlbHBlcg0KLXZpZXdIZWxwZXJIZWFsdGhDaGVja0RpYWxvZ190aXRsZT1WZXJpZmljYVx1MDBlN1x1MDBlM28gZGUgRnVuY2lvbmFtZW50byBkYSBCaWJsaW90ZWNhDQotdmlld0hlbHBlcl9wZXJmb3JtSGVhbHRoQ2hlY2s9RXhlY3V0YW5kbyB2ZXJpZmljYVx1MDBlN1x1MDBlM28gZGUgZnVuY2lvbmFtZW50byBuYSBiaWJsaW90ZWNhLi4uDQotdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX21lc3NhZ2U9QSB2ZXJpZmljYVx1MDBlN1x1MDBlM28gZGUgZnVuY2lvbmFtZW50byBuYSBiaWJsaW90ZWNhIGFiZXJ0YSBmb2kgY29uY2x1XHUwMGVkZGEgY29tIFx1MDBlYXhpdG8uIENvbnN1bHRlIG8gcmVsYXRcdTAwZjNyaW8gbm8gYXJxdWl2byBkZSByZWdpc3Ryby4NCi0NCi0jIEF0dGFjaCBUZW1wbGF0ZSBGaWxlIERpYWxvZw0KLWF0dGFjaFRlbXBsYXRlRmlsZURpYWxvZ190aXRsZT1BbmV4YXIgQXJxdWl2byBkZSBHYWJhcml0bw0KLQ0KLSMgQ3JlYXRlIEVsZW1lbnQgRXJyb3IgRGlhbG9nDQotY3JlYXRlRWxlbWVudERpYWxvZ190aXRsZT1DcmlhciBub3ZvL25vdmEgezB9DQotY3JlYXRlTmV3RWxlbWVudEVycm9yX21zZz1FcnJvIGFvIGNyaWFyIG5vdm8vbm92YSB7MH0uDQotDQotZGxnVGl0bGVfcmVsb2FkTGlicmFyeT1SZWNhcnJlZ2FyIEJpYmxpb3RlY2ENCi1jcmVhdGVFbGVtZW50RXJyb3JfcmVhc29uPU8gbm9tZSBkZSB7MH0gblx1MDBlM28gcG9kZSBzZXIgdmF6aW8uXG5cDQotXG5cDQotRXNwZWNpZmlxdWUgdW0gbm9tZSB2XHUwMGUxbGlkbyBlIHRlbnRlIG5vdmFtZW50ZS4NCi1kZWxldGVDb25maWdFcnJvcl9yZWFzb249QSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIFx1MDBlOSByZWZlcmVuY2lhZGEgcGVsbyBwcm9jZXNzbyAnJ3swfScnIA0KLSMgQ2hhbmdlQm91bmRzQ29tbWFuZA0KLWdlZl9jaGFuZ2VCb3VuZHNDb21tYW5kX2xhYmVsPUFsdGVyYXIgTGltaXRlcw0KLSMgQ2hhbmdlTmFtZUNvbW1hbmQNCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfbGFiZWw9QWx0ZXJhciBvIE5vbWUNCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfdW5kb01lc3NhZ2U9SW1wb3NzXHUwMGVkdmVsIGRlc2ZhemVyIGEgYWx0ZXJhXHUwMGU3XHUwMGUzbyBkZSBub21lLlxuXA0KLVxuXA0KLU5cdTAwZTNvIFx1MDBlOSBwZXJtaXRpZG8gZGVzZmF6ZXIgdW1hIGFsdGVyYVx1MDBlN1x1MDBlM28gZGUgbm9tZSBzZSBvIG5vbWUgYW50ZXJpb3IgZXJhIG51bG8uDQotIyBDaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZA0KLWdlZl9jaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZF9sYWJlbD1BbHRlcmFyIFZhbG9yIGRlIFByb3ByaWVkYWRlDQotIyBDcmVhdGVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX2NyZWF0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9Q3JpYXIgUG9udG8gZGUgQ3VydmF0dXJhDQotIyBDcmVhdGVMaW5rQ29tbWFuZA0KLWdlZl9jcmVhdGVMaW5rQ29tbWFuZF9sYWJlbD1GYXplciBMaW5rIGRlIENyaWFcdTAwZTdcdTAwZTNvDQotIyBDcmVhdGVOb2RlQ29tbWFuZA0KLWdlZl9jcmVhdGVOb2RlQ29tbWFuZF9sYWJlbD1DcmlhciBOb3ZvIE5cdTAwZjMNCi0jIERlbGV0ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfZGVsZXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1FeGNsdWlyIFBvbnRvIGRlIEN1cnZhdHVyYQ0KLSMgRGVsZXRlQ29tbWFuZA0KLWdlZl9kZWxldGVDb21tYW5kX2xhYmVsPURlbGV0ZQ0KLSMgRGVsZXRlTGlua0NvbW1hbmQNCi1nZWZfZGVsZXRlTGlua0NvbW1hbmRfbGFiZWw9RXhjbHVpciBDb25leFx1MDBlM28NCi0jIE1vdmVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX21vdmVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPU1vdmVyIFBvbnRvIGRlIEN1cnZhdHVyYQ0KLSMgUmVjb25uZWN0TGlua0NvbW1hbmQNCi1nZWZfcmVjb25uZWN0TGlua0NvbW1hbmRfbGFiZWw9UmVjb25lY3RhciBMaW5rDQotDQotIyBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXINCi1nZWZfdmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdD1PIG5vbWUgblx1MDBlM28gcG9kZSBlc3RhciB2YXppby4gRXNwZWNpZmlxdWUgdW0gbm9tZSB2XHUwMGUxbGlkby4NCi0jIFZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyDQotZ2VmX3ZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdD1PIG5vbWUgblx1MDBlM28gcG9kZSBlc3RhciB2YXppby4gRXNwZWNpZmlxdWUgdW0gbm9tZSB2XHUwMGUxbGlkby4NCi0jIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0DQotZ2VmX3dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0X3ZhbGlkYXRlTWVzc2FnZT1PIG5vbWUgblx1MDBlM28gcG9kZSBlc3RhciB2YXppby4gRXNwZWNpZmlxdWUgdW0gbm9tZSB2XHUwMGUxbGlkby4NCi0NCi0jIEVsZW1lbnRzVmlld0RlbGV0ZUFjdGlvbg0KLWFjdGlvbnNfRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uX21lc3NhZ2U9Tlx1MDBlM28gXHUwMGU5IHBvc3NcdTAwZWR2ZWwgZXhjbHVpciBhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gJyd7MH0nJyBwb3JxdWUgZWxhIGFpbmRhIGVzdFx1MDBlMSBlbSB1c28gcGVsbyBwcm9jZXNzbyAnJ3sxfScnLg0KLQ0KLSMgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yDQotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JUaXRsZT1FcnJvIGRlIEV4Y2x1c1x1MDBlM28NCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvck1lc3NhZ2U9RXhjZVx1MDBlN1x1MDBlM28gblx1MDBlM28gbWFuaXB1bGFkYQ0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yUmVhc29uPUNvbnN1bHRlIG9zIGRldGFsaGVzDQotDQotIyBNZXRob2RFbGVtZW50RWRpdG9yDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclRpdGxlPUVycm8gZGUgU2FsdmFtZW50bw0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMT1JVVBBMDAyMEU6IEVycm8gYW8gc2FsdmFyIGFycXVpdm8NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTI9RXJybyBkZSBjb25maXJtYVx1MDBlN1x1MDBlM28NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMT1Db25zdWx0ZSBvIGFycXVpdm8gZGUgcmVnaXN0cm8gcGFyYSBvYnRlciBkZXRhbGhlcyBhZGljaW9uYWlzDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjI9Q29uc3VsdGUgb3MgZGV0YWxoZXMNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JUaXRsZT1FcnJvIGRlIFJlbm9tZWFcdTAwZTdcdTAwZTNvDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JNc2c9VW0gb3UgbXVpdG9zIGFycXVpdm9zIGRlc3RlIGVkaXRvciBmb3JhbSByZW1vdmlkb3MuIE8gZWRpdG9yIG5cdTAwZTNvIFx1MDBlOSBtYWlzIHZcdTAwZTFsaWRvIGUgdGVtIGRlIHNlciBmZWNoYWRvLg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9pbnZhbGlkRWRpdG9yVGl0bGU9RWRpdG9yIEludlx1MDBlMWxpZG8NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JNZXNzYWdlMT1FcnJvIGFvIHJlbm9tZWFyIG8ocykgYXJxdWl2byhzKSAnJ3swfScnDQotDQotIyBEZXNjcmlwdGlvbkZvcm1QYWdlDQotcmVuYW1lRXJyb3JfdGl0bGU9UmVub21lYXIgRWxlbWVudG8NCi1yZW5hbWVFcnJvcl9tc2c9SVVQQTAwMTNFOiBJbXBvc3NcdTAwZWR2ZWwgY29uY2x1aXIgYSBvcGVyYVx1MDBlN1x1MDBlM28gZGUgcmVub21lYVx1MDBlN1x1MDBlM28uDQotU2VsZWN0RWxlbWVudERpYWxvZ19zZWxlY3RlbGVtZW50X3RleHQ9U2VsZWNpb25hciBFbGVtZW50bw0KLQ0KLSMgRWRpdG9yQ2hvb3Nlcg0KLWVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ190aXRsZT1BYnJpciBFZGl0b3IgZGUgTVx1MDBlOXRvZG8NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0Rlc2NyaXB0aW9uTGFiZWw9RGVzY3JpXHUwMGU3XHUwMGUzbzoNCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfU2VsZWN0QWxsQnV0dG9uTGFiZWw9U2VsZWNpb25hciBUdWRvDQotT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZV9lZGl0X3RleHQwPUVkaXRhciBFbGVtZW50bw0KLWVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ19tZXNzYWdlPUlVUEEwMDIzRTogSW1wb3NzXHUwMGVkdmVsIGFicmlyIG8gZWRpdG9yIGFzc29jaWFkbyBhbyBlbGVtZW50byBkZSBNXHUwMGU5dG9kbyBzZWxlY2lvbmFkby4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZT1TZWxlY2lvbmFyIEFycXVpdm8gZGUgSW1hZ2VtDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeU5hbWU9Tm92YSBCaWJsaW90ZWNhDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX0Rlc2NyaXB0aW9uTGFiZWw9RGVzY3JpXHUwMGU3XHUwMGUzbzoNCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1TZWxlY2lvbmUgdW1hIG91IG1haXMgY29uZmlndXJhXHUwMGU3XHUwMGY1ZXMgZGUgbVx1MDBlOXRvZG8gZSBjbGlxdWUgZW0gQ29uY2x1aXIgcGFyYSBhYnJpLWxhcy4NCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfRGVzZWxlY3RBbGxCdXR0b25MYWJlbD1EZXNtYXJjYXIgVHVkbw0KLUVsZW1lbnRzVmlld19taWdyYXRpb25fZGlyX2RsZ19kZXNjcmlwdGlvbl90ZXh0PUVzcGVjaWZpcXVlIG8gZGlyZXRcdTAwZjNyaW8gZG9zIG5vdm9zIHswfSByZWNcdTAwZTltLW1pZ3JhZG9zIHBhcmEgc3Vic3RpdHVpciBvIHswfSBzZWxlY2lvbmFkby4NCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uPU9jb3JyZXUgdW0gZXJybyBkbyBzaXN0ZW1hLiBDbGlxdWUgZW0gRGV0YWxoZXMgcGFyYSBvYnRlciBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcy4gXG5cDQotXG5cDQotRmVjaGUgYWxndW5zIGRvcyBlZGl0b3JlcyBhYmVydG9zIGUgdGVudGUgbm92YW1lbnRlLg0KLQ0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGl0bGU9QSBpbWFnZW0gXHUwMGU5IGludlx1MDBlMWxpZGENCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RlbXBsYXRlPUlVUEEwMDMxRTogQSBpbWFnZW0gc2VsZWNpb25hZGEgJyd7MH0nJyBcdTAwZTkgbWFpb3IgcXVlIG8gdGFtYW5obyBwZXJtaXRpZG8gKHsxfSBwb3IgezJ9KS4gU2VsZWNpb25lIG91dHJhIGltYWdlbS4NCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGl0bGU9QSBpbWFnZW0gXHUwMGU5IGludlx1MDBlMWxpZGENCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzJFOiBPIGFycXVpdm8gc2VsZWNpb25hZG8gJyd7MH0nJyBuXHUwMGUzbyBleGlzdGUuIFNlbGVjaW9uZSBvdXRyYSBpbWFnZW0uDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsPVNlbGVjaW9uYXIuLi4NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5RGVzY3JpcHRpb249RGVzY3JpXHUwMGU3XHUwMGUzbyBkYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcw0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZWZhdWx0QnJpZWZEZXNjcmlwdGlvbj1EZXNjcmlcdTAwZTdcdTAwZTNvIGRhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZG8gbVx1MDBlOXRvZG8NCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZURlc2NyaXB0aW9uPVRvZG9zIG9zIGVkaXRvcmVzIGRldmVtIHNlciBmZWNoYWRvcy4gU2VsZWNpb25lIGFxdWVsZXMgcXVlIHByZWNpc2FtIHNlciBzYWx2b3MgcHJpbWVpcm8sIHNlIGFwbGljXHUwMGUxdmVsLg0KLQ0KLSMgVGVtcGxhdGVEZXNjcmlwdGlvblBhZ2UNCi1mb3Jtc19UZW1wbGF0ZURlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnPU8gYXJxdWl2byBzZWxlY2lvbmFkbyBqXHUwMGUxIFx1MDBlOSB1bSBhbmV4byBkZXN0ZSBHYWJhcml0by4NCi0NCi0jIE5ldyBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLW5ld0xpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTRFOiBJbXBvc3NcdTAwZWR2ZWwgY3JpYXIgYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy4NCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMT1PIGNhbWluaG8gZGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZXNwZWNpZmljYWRvICcnezB9JycgXHUwMGU5IGludlx1MDBlMWxpZG8uDQotbmV3TGlicmFyeUVycm9yX3JlYXNvbjI9Slx1MDBlMSBleGlzdGUgdW1hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGVtICcnezB9JycuDQotbmV3TGlicmFyeUVycm9yX3JlYXNvbjM9Tlx1MDBlM28gXHUwMGU5IHBvc3NcdTAwZWR2ZWwgY3JpYXIgYSBwYXN0YSBkYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBlc3BlY2lmaWNhZGEgJyd7MH0nJy4NCi1uZXdMaWJyYXJ5RXJyb3JfYWR2aWNlPVNlbGVjaW9uZSBPSyBwYXJhIGRpZ2l0YXIgb3V0cm8gbm9tZSBvdSBjYW1pbmhvIHBhcmEgYSBiaWJsaW90ZWNhLg0KLQ0KLSNQcm9jZXNzIGxpdGVyYWxzDQotUHJvY2Vzc19FeHRlcm5hbElEPUlEIGV4dGVybm86DQotUHJvY2Vzc19QdXJwb3NlPU9iamV0aXZvOg0KLVByb2Nlc3NfU2NvcGU9RXNjb3BvOg0KLVByb2Nlc3NfVXNhZ2VOb3Rlcz1Ob3RhcyBkZSBVc286DQotUHJvY2Vzc19BbHRlcm5hdGl2ZXM9QWx0ZXJuYXRpdmFzOg0KLVByb2Nlc3NfSG93VG9TdGFmZj1Db21vIERlZmluaXIgYSBFcXVpcGU6DQotUHJvY2Vzc19LZXlDb25zaWRlcmF0aW9uPUNvbnNpZGVyYVx1MDBlN1x1MDBmNWVzLWNoYXZlOg0KLVByb2Nlc3NfU2NhbGU9RXNjYWxhOg0KLVByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljcz1DYXJhY3Rlclx1MDBlZHN0aWNhcyBkbyBQcm9qZXRvOg0KLVByb2Nlc3NfUmlza0xldmVsPU5cdTAwZWR2ZWwgZGUgUmlzY286DQotUHJvY2Vzc19Fc3RpbWF0aW5nVGVjaG5pcXVlPVRcdTAwZTljbmljYXMgZGUgRXN0aW1hdGl2YToNCi1Qcm9jZXNzX1Byb2plY3RNZW1iZXJFeHBlcnRpc2U9RXhwZXJpXHUwMGVhbmNpYSBkb3MgTWVtYnJvcyBkbyBQcm9qZXRvOg0KLVByb2Nlc3NfVHlwZU9mQ29udHJhY3Q9VGlwbyBkZSBDb250cmF0bzoNCi0NCi0jIEVkaXRvciBQcmV2aWV3IE5hdmlnYXRpb24gQnV0dG9ucw0KLWJhY2tCdXR0b25fdGV4dD1Wb2x0YXINCi1mb3J3YXJkQnV0dG9uX3RleHQ9UmVkaXJlY2lvbmFyDQotZm9yd2FyZF90ZXh0PVJlZGlyZWNpb25hcg0KLXN0b3BCdXR0b25fdGV4dD1QYXJhcg0KLXJlZnJlc2hCdXR0b25fdGV4dD1BdHVhbGl6YXINCi1yZWZyZXNoX3RleHQ9QXR1YWxpemFyDQotbmV3bmFtZV90ZXh0PU5vdm8gbm9tZToNCi1wcmludEJ1dHRvbl90ZXh0PUltcHJpbWlyDQotDQotIyBDb250ZXh0IG1lbnVzDQotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPUF0dWFsaXphJnINCi1fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbT1Nb3N0cmFyICZQcm9wcmllZGFkZXMNCi0NCi1fVUlfTWV0aG9kRWRpdG9yX21lbnU9RWRpdG9yIGRlICZNXHUwMGU5dG9kbw0KLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09Jk5vdm8NCi1fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW09TiZvdm8gSXJtXHUwMGUzbw0KLQ0KLV9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsPVNlbGVcdTAwZTdcdTAwZTNvDQotX1VJX1BhcmVudFBhZ2VfbGFiZWw9UGFpDQotX1VJX0xpc3RQYWdlX2xhYmVsPUxpc3RhDQotX1VJX1RyZWVQYWdlX2xhYmVsPVx1MDBjMXJ2b3JlDQotX1VJX1RhYmxlUGFnZV9sYWJlbD1UYWJlbGENCi1fVUlfVGFibGVUcmVlUGFnZV9sYWJlbD1cdTAwYzFydm9yZSBkZSBUYWJlbGENCi1fVUlfT2JqZWN0Q29sdW1uX2xhYmVsPU9iamV0bw0KLV9VSV9TZWxmQ29sdW1uX2xhYmVsPVx1MDBkYW5pY28NCi0NCi1fVUlfTm9PYmplY3RTZWxlY3RlZD1OYWRhIFNlbGVjaW9uYWRvDQotX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkPU9iamV0byBTZWxlY2lvbmFkbzogezB9DQotX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQ9T2JqZXRvcyB7MH0gU2VsZWNpb25hZG9zDQotDQotX1VJX09wZW5FZGl0b3JFcnJvcl9sYWJlbD1BYnJpciBFZGl0b3INCi0NCi1fVUlfV2l6YXJkX2NhdGVnb3J5PUV4ZW1wbG8gZGUgQXNzaXN0ZW50ZXMgZGUgQ3JpYVx1MDBlN1x1MDBlM28gZG8gTW9kZWxvIEVNRg0KLQ0KLV9VSV9NZXRob2RNb2RlbFdpemFyZF9sYWJlbD1Nb2RlbG8gZGUgTVx1MDBlOXRvZG8NCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfZGVzY3JpcHRpb249Q3JpZSB1bSBub3ZvIG1vZGVsbyBkZSBNXHUwMGU5dG9kbw0KLQ0KLV9VSV9NZXRob2RFZGl0b3JfbGFiZWw9RWRpdG9yIGRlIE1vZGVsbyBkZSBNXHUwMGU5dG9kbw0KLQ0KLV9VSV9NZXRob2RFZGl0b3JGaWxlbmFtZURlZmF1bHRCYXNlPU1pbmhhDQotX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRXh0ZW5zaW9uPW1cdTAwZTl0b2RvDQotX1VJX1dpemFyZF9sYWJlbD1Ob3ZvDQotDQotX1dBUk5fRmlsZW5hbWVFeHRlbnNpb249TyBub21lIGRvIGFycXVpdm8gZGV2ZSB0ZXJtaW5hciBlbSAnJy57MH0nJw0KLQ0KLV9VSV9Nb2RlbE9iamVjdD1PYmpldG8gZGUgTW9kZWxvDQotX1VJX1hNTEVuY29kaW5nPUNvZGlmaWNhXHUwMGU3XHUwMGUzbyBYTUwNCi1fVUlfWE1MRW5jb2RpbmdDaG9pY2VzPVVURi04IEFTQ0lJIFVURi0xNiBVVEYtMTZCRSBVVEYtMTZMRSBJU08tODg1OS0xDQotX1VJX1dpemFyZF9pbml0aWFsX29iamVjdF9kZXNjcmlwdGlvbj1TZWxlY2lvbmUgdW0gb2JqZXRvIGRlIG1vZGVsbyBhIHNlciBjcmlhZG8NCi0NCi1fVUlfRmlsZUNvbmZsaWN0X2xhYmVsPUNvbmZsaXRvIGRlIEFycXVpdm8NCi1fV0FSTl9GaWxlQ29uZmxpY3Q9SFx1MDBlMSBhbHRlcmFcdTAwZTdcdTAwZjVlcyBuXHUwMGUzbyBzYWx2YXMgZW0gY29uZmxpdG8gY29tIGFzIGFsdGVyYVx1MDBlN1x1MDBmNWVzIGZlaXRhcyBmb3JhIGRvIGVkaXRvci4gRGVzZWphIGRlc2NhcnRhciBlc3RhcyBhbHRlcmFcdTAwZTdcdTAwZjVlcyBkbyBlZGl0b3I/DQotDQotIyBBZGQgTGluayBEaWFsb2cNCi1hZGRMaW5rRGlhbG9nX2xpbmtUeXBlPVRpcG86DQotb3BlbkxpbmtDaGVja2JveF90ZXh0PUFicmEgbyBsaW5rIGVtIHVtYSBqYW5lbGEgc2VwYXJhZGEgZG8gbmF2ZWdhZG9yDQotDQotIyBBZGQgSW1hZ2UgRGlhbG9nDQotaGVpZ2h0TGFiZWxfdGV4dD1BbHR1cmE6DQotd2lkdGhMYWJlbF90ZXh0PUxhcmd1cmE6DQotRWxlbWVudHNWaWV3XzIwPXBhZHJcdTAwZTNvIGRlIHJlY3Vyc28NCi1FbGVtZW50c1ZpZXdfMjE9cHJvY2Vzc28gZGUgZW50cmVnYQ0KLUVsZW1lbnRzVmlld18yMj1wcm9jZXNzbw0KLUVsZW1lbnRzVmlld18zNT17MH0gXHUwMGU5IHNvbWVudGUgbGVpdHVyYS4gXA0KLVRvcm5lLW8gZ3Jhdlx1MDBlMXZlbCBhbnRlcyBkZSBjb250aW51YXIuDQotRWxlbWVudHNWaWV3XzM2PUVycm8gYW8gY2FycmVnYXIgYmlibGlvdGVjYQ0KLWFsdFRhZ0xhYmVsX3RleHQ9VGFnIEFMVDoNCi1pbWFnZVNpemVMYWJlbF90ZXh0PUEgYWx0dXJhIGUgYSBsYXJndXJhIGRhIGltYWdlbSBkZXZlbSBzZXIgcGVsbyBtZW5vcyAxMCBlIG5cdTAwZTNvIG1haXMgcXVlIDYwMC4gQSBhbHR1cmEgZSBsYXJndXJhIGludlx1MDBlMWxpZGFzIHNlclx1MDBlM28gY29udmVydGlkYXMgZW0gdW0gdGFtYW5obyBhZGVxdWFkby4NCi0NCi0jIFByb2Nlc3MgRWRpdG9yDQotUHJvY2Vzc0VkaXRvcj1Qcm9jZXNzRWRpdG9yDQotUHJvY2Vzc0VkaXRvcl9OYW1lPU5vbWUNCi1Qcm9jZXNzRWRpdG9yX1ByZXNlbnRhdGlvbk5hbWU9Tm9tZSBkZSBBcHJlc2VudGFcdTAwZTdcdTAwZTNvDQotUHJvY2Vzc0VkaXRvcl9JbmRleD1cdTAwY2RuZGljZQ0KLVByb2Nlc3NFZGl0b3JfUHJlZGVjZXNzb3JzPVByZWRlY2Vzc29yZXMNCi0jQ29uZmlndXJhdGlvblBhZ2VfU2VsZWN0ZWQ9U2VsZWN0ZWQ6IA0KLUNoZWNrbGlzdE9yZGVyX2Rlc2NyaXB0aW9uPVNlbGVjaW9uZSB1bSBpdGVtIGRlIHZlcmlmaWNhXHUwMGU3XHUwMGUzbyBlIGNsaXF1ZSBlbSBQYXJhIENpbWEgb3UgZW0gUGFyYSBCYWl4byBwYXJhIGFsdGVyYXIgc3VhIG9yZGVtLg0KLUVsZW1lbnRzVmlld19yZW5hbWluZ190ZXh0PVJlbm9tZWFuZG8uLi4NCi1Qcm9jZXNzRWRpdG9yX01vZGVsSW5mbz1JbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZG8gTW9kZWxvDQotUHJvY2Vzc0VkaXRvcl9QcmVmaXg9UHJlZml4bw0KLU1vdmVEaWFsb2dfbW92ZV90ZXh0PU1vdmVyDQotQ2hlY2tsaXN0T3JkZXJfdGl0bGU9Q2xhc3NpZmljYXIgSXRlbnMgZGUgVmVyaWZpY2FcdTAwZTdcdTAwZTNvDQotUHJvY2Vzc0VkaXRvcl9SZXBldGFibGU9UmVwZXRcdTAwZWR2ZWwNCi1Qcm9jZXNzRWRpdG9yX09uZ29pbmc9RW0gQW5kYW1lbnRvDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3luY2hyb25pemF0aW9uPVNpbmNyb25pemFyLi4uDQotUHJvY2Vzc0VkaXRvcl9FdmVudERyaXZlbj1PcmllbnRhZG8gYSBFdmVudG8NCi1Qcm9jZXNzRWRpdG9yX0RlbGl2ZXJhYmxlPURpc3RyaWJ1XHUwMGVkdmVsDQotUHJvY2Vzc0VkaXRvcl9PcHRpb25hbD1PcGNpb25hbA0KLUZpbHRlckRpYWxvZ19UeXBlX3RleHQ9VGlwbyBkZSBFbGVtZW50byBkZSBNXHUwMGU5dG9kbzoNCi1GaWx0ZXJEaWFsb2dfRXhwYW5kQWxsPUV4cGFuZGlyIFR1ZG8NCi1Nb3ZlRGlhbG9nX21vdmluZ190ZXh0PU1vdmVuZG8uLi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWRTaGFwZUljb25XYXJuaW5nPUlVUEEwMDI1VzogTyBcdTAwZWRjb25lIGRlIHNoYXBlIHBhcmEgezB9IG5cdTAwZTNvIGZvaSBsb2NhbGl6YWRvIG5vIGNhbWluaG86IHsxfQ0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbkVycm9yPUlVUEEwMDI1RTogRXJybzogU2VcdTAwZTdcdTAwZTNvIGRlIFx1MDBlZGNvbmUgZGUgc2hhcGU6IHswfQ0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfTmFtZUxhYmVsPU5vbWU6DQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1DcmlhciB1bWEgbm92YSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIG1cdTAwZTl0b2RvDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX05hbWVMYWJlbD1Ob21lOg0KLUF1dGhvcmluZ1VJUGx1Z2luX25ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGU9Tm92YSBDb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIE1cdTAwZTl0b2RvDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VUaXRsZT1DcmlhciB1bWEgbm92YSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvDQotbmV3TGlicmFyeVdpemFyZF90aXRsZT1Ob3ZhIEJpYmxpb3RlY2EgZGUgTVx1MDBlOXRvZG8NCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZVRpdGxlPVNhbHZhciBhbHRlcmFcdTAwZTdcdTAwZjVlcw0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0xpYnJhcnlNYWluUGFnZV9wYWdlRGVzY3JpcHRpb249RXNwZWNpZmlxdWUgdW0gbm9tZSwgdW1hIGRlc2NyaVx1MDBlN1x1MDBlM28gZSB1bSBkaXJldFx1MDBmM3JpbyBkZSBkZXN0aW5vIHBhcmEgYSBub3ZhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG8uDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVEZXNjcmlwdGlvbj1VbSBvdSBtYWlzIGVsZW1lbnRvcyBkZSBtXHUwMGU5dG9kbyBmb3JhbSBtb2RpZmljYWRvcy4gU2VsZWNpb25lIGFxdWVsZXMgcXVlIHByZWNpc2FtIHNlciBzYWx2b3MuDQotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGU9QWJyaXIgQ29uZmlndXJhXHUwMGU3XHUwMGY1ZXMgZGUgTVx1MDBlOXRvZG8NCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbldpemFyZF93aW5kb3dUaXRsZT1BYnJpciBDb25maWd1cmFcdTAwZTdcdTAwZjVlcyBkZSBNXHUwMGU5dG9kbw0KLUVsZW1lbnRzVmlld19yZXBsYWNlaW5nd2l0aGZvcm1hdF90ZXh0PVN1YnN0aXR1aW5kbyB7MH0uLi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbldhcm5pbmc9SVVQQTAwMjZXOiBPIFx1MDBlZGNvbmUgZGUgblx1MDBmMyBwYXJhIHswfSBuXHUwMGUzbyBmb2kgbG9jYWxpemFkbyBubyBjYW1pbmhvOiB7MX0NCi1NZXNzYWdlTGFiZWxQcm92aWRlcl91bnNlbGVjdGVkcGFja2FnZXM9Jyd7MH0nJyBjb250XHUwMGU5bSBlbGVtZW50b3MgcXVlIHJlZmVyZW5jaWFtIGVsZW1lbnRvcyBlbSBwYWNvdGVzIG5cdTAwZTNvIHNlbGVjaW9uYWRvcw0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uRXJyb3I9SVVQQTAwMjZFOiBFcnJvOiBTZVx1MDBlN1x1MDBlM28gZGUgXHUwMGVkY29uZSBkZSBuXHUwMGYzOiB7MH0NCi1TdGVwc09yZGVyRGlhbG9nX3N0ZXBzPUV0YXBhczogDQotU3RlcHNPcmRlckRpYWxvZ190aXRsZT1DbGFzc2lmaWNhciBFdGFwYXMgZGUgVGFyZWZhDQotUHJvY2Vzc0VkaXRvcl9QbGFubmVkPVBsYW5lamFkbw0KLXNwZWNpZnlkaXJlY3RvcnlfdGV4dD1Fc3BlY2lmaXF1ZSB1bSBkaXJldFx1MDBmM3JpbyBwYXJhIHNhbHZhciBhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zDQotUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzPU1cdTAwZmFsdGlwbGFzIE9jb3JyXHUwMGVhbmNpYXMNCi1Qcm9jZXNzRWRpdG9yX0VudHJ5U3RhdGU9RXN0YWRvIGRlIEVudHJhZGENCi1Qcm9jZXNzRWRpdG9yX0V4aXRTdGF0ZT1Fc3RhZG8gZGUgU2FcdTAwZWRkYQ0KLXNlbGVjdENvbHVtbnN0b0FkZF90ZXh0PVNlbGVjaW9uZSBhcyBjb2x1bmFzIGEgc2VyZW0gaW5jbHVcdTAwZWRkYXMNCi1Qcm9jZXNzRWRpdG9yX1R5cGU9VGlwbw0KLVByb2Nlc3NFZGl0b3JfVGVhbT1FcXVpcGUNCi1GaWx0ZXJEaWFsb2dfdGl0bGU9U2VsZWNpb25hciBEaVx1MDBlMWxvZ286IA0KLQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZD1JbmNsdWlyIGRvIENvbnRlXHUwMGZhZG8gZG8gJk1cdTAwZTl0b2RvLi4uDQotRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsPVJlZHV6aXIgVHVkbw0KLU9wZW5DaGVhdHNoZWV0Vmlld190aXRsZT1BYnJpciBWaXN1YWxpemFcdTAwZTdcdTAwZTNvIGRlIEZvbGhhIGRlIERpY2FzDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbFVwPVJvbGFyIHBhcmEgQ2ltYQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxEb3duPVJvbGFyIHBhcmEgQmFpeG8NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXA9TSZvdmVyIHBhcmEgQ2ltYQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX01vdmVEb3duPU1vdmVyIHBhcmEgQmFpJnhvDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsPVJldmUmbGFyDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29weT0mQ29waWFyLi4uDQotRmlsdGVyRGlhbG9nX1BhdHRlcm5fdGV4dD1QYWRyXHUwMGY1ZXMgZGUgbm9tZSAob3Mgbm9tZXMgY29ycmVzcG9uZGVudGVzIHNlclx1MDBlM28gbW9zdHJhZG9zKToNCi0NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3RpdGxlPUJpYmxpb3RlY2EgZGUgTVx1MDBlOXRvZG9zOiANCi0jTWVzc2FnZVZpZXdfc2VsZWN0ZWRfdGV4dD1TZWxlY3RlZDogDQotTWVzc2FnZVZpZXdfZXJybXNnX3RleHQ9RGVzY3JpXHUwMGU3XHUwMGUzbw0KLUVsZW1lbnRzVmlld19lcnJfc2F2aW5nPUlVUEEwMDI3RTogRXJybyBhbyBzYWx2YXIgJyd7MH0nJ3sxfQ0KLQ0KLWVycl9jb3B5aW5nX2ZpbGVfdGl0bGU9RXJybyBhbyBjb3BpYXIgYXJxdWl2bw0KLWVycl9jb3B5aW5nX2ZpbGVfZXJyb3I9SVVQQTAwMjhFOiBPIFx1MDBlZGNvbmUgblx1MDBlM28gcFx1MDBmNGRlIHNlciBkZXNpZ25hZG8uIA0KLWVycl9jb3B5aW5nX2ZpbGVfcmVhc29uPU9jb3JyZXUgdW0gZXJybyBhbyBjb3BpYXIgbyBhcnF1aXZvIHNlbGVjaW9uYWRvLiBDbGlxdWUgZW0gRGV0YWxoZXMgcGFyYSBvYnRlciBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcy4NCi1lcnJfcHJvY2Vzc2luZ19maWxlX3RpdGxlPUVycm8gYW8gcHJvY2Vzc2FyIGFycXVpdm8NCi1lZGl0Q29uZmlndXJhdGlvbl90b29sdGlwPUVkaXRhciBjb25maWd1cmFcdTAwZTdcdTAwZTNvDQotZWRpdERpYWxvZ19tc2dDYW5ub3RFZGl0PUlVUEEwMDE1RTogSW1wb3NzXHUwMGVkdmVsIGVkaXRhciBlbGVtZW50bw0KLVNhdmVUaGlzQWN0aW9uX3NhdmVvYmplY3Q9U2FsdmFyIGVzdGUgT2JqZXRvLi4uDQotRWxlbWVudHNWaWV3X3JlcGxhY2VfdGV4dD1TdWJzdGl0dWlyDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRXh0ZW5kPSZFc3RlbmRlci4uLg0KLU1vdmVEaWFsb2dfZGVzdGluYXRpb25fdGV4dD1Fc2NvbGhhIG8gZGVzdGlubyBwYXJhIG9zIGVsZW1lbnRvcyBzZWxlY2lvbmFkb3M6DQotY2hvb3NlRGVmYXVsdERpcmVjdG9yeV90ZXh0PUVzY29saGEgdW0gZGlyZXRcdTAwZjNyaW8gcGFkclx1MDBlM28gcGFyYSBiaWJsaW90ZWNhczoNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzcz0mU3VwcmltaXINCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzczI9T3BcdTAwZTdcdTAwZjVlcyBkZSAmUHVibGljYVx1MDBlN1x1MDBlM28uLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbT1EaWFncmFtYXMgRGVmaW5pZG9zIHBlbG8gJlVzdVx1MDBlMXJpby4uLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ190aXRsZT1EZXNpZ25hciBEaWFncmFtYXMgRGVmaW5pZG9zIHBlbG8gVXN1XHUwMGUxcmlvDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkSW1hZ2U9RGlhZ3JhbWEgZGUgQXRpdmlkYWRlOg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZGRJbWFnZT1EaWFncmFtYSBkZSBEZXRhbGhlIGRlIEF0aXZpZGFkZToNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfd3BkSW1hZ2U9RGlhZ3JhbWEgZGUgRGVwZW5kXHUwMGVhbmNpYSBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvOg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19ub3RhRmlsZT1JVVBBMDAwNEU6IE8gY2FtaW5obyBlc3BlY2lmaWNhZG8gblx1MDBlM28gXHUwMGU5IHVtIGFycXVpdm8uDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2Fzc2lnbkJ1dHRvbj1TZWxlY2lvbmFyLi4uDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2VudGVyZWRJbWFnZU5vdEZvdW5kPUlVUEEwMDI0RTogQSBpbWFnZW0gZXNwZWNpZmljYWRhIG5cdTAwZTNvIGV4aXN0ZSBuYSBiaWJsaW90ZWNhLiBDZXJ0aWZpcXVlLXNlIGRlIHRlciBkaWdpdGFkbyBvIGNhbWluaG8gcmVsYXRpdm8gYW8gZGlyZXRcdTAwZjNyaW8gcmFpeiBkYSBiaWJsaW90ZWNhLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19zZWxlY3RlZEltYWdlTm90Rm91bmQ9SVVQQTAwMzBFOiBBIGltYWdlbSBzZWxlY2lvbmFkYSBuXHUwMGUzbyBlc3RcdTAwZTEgbmEgYmlibGlvdGVjYS4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURJbWFnZT1VdGlsaXplIGEgaW1hZ2VtIGRvIGRpYWdyYW1hIGRlIEF0aXZpZGFkZSBwYXJhIG5hdmVnYVx1MDBlN1x1MDBlM28gZSBwdWJsaWNhXHUwMGU3XHUwMGUzbw0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBRERJbWFnZT1VdGlsaXplIGEgaW1hZ2VtIGRvIGRpYWdyYW1hIGRlIGRldGFsaGUgZGUgQXRpdmlkYWRlIHBhcmEgbmF2ZWdhXHUwMGU3XHUwMGUzbyBlIHB1YmxpY2FcdTAwZTdcdTAwZTNvDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZVdQREltYWdlPVV0aWxpemUgYSBpbWFnZW0gZG8gZGlhZ3JhbWEgZGUgZGVwZW5kXHUwMGVhbmNpYSBkbyBwcm9kdXRvIHBhcmEgbmF2ZWdhXHUwMGU3XHUwMGUzbyBlIHB1YmxpY2FcdTAwZTdcdTAwZTNvDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29udHJpYnV0ZT1Db250cmlidWlcdTAwZTdcdTAwZTNvIExvY2FsDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmVwbGFjZT1TdWJzdGl0dWlcdTAwZTdcdTAwZTNvIExvY2FsDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRGlhZ3JhbXM9RGlhJmdyYW1hcw0KLVByb2Nlc3NFZGl0b3JfYWN0aW9uX2RlZXBDb3B5PUNcdTAwZjNwaWEgUHJvZnVuJmRhLi4uDQotRmlsdGVyRGlhbG9nX0JyaWVmRGVzY3JpcHRpb249RGVzY3JpXHUwMGU3XHUwMGUzbyBSZXN1bWlkYToNCi1Db25maWd1cmF0aW9uUGFnZV9oaWRlVG9vbFRpcD1Nb3N0cmFyL09jdWx0YXIgRWxlbWVudG9zIE5cdTAwZTNvIFZlcmlmaWNhZG9zDQotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb249RGVzY3JpXHUwMGU3XHUwMGUzbzoNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc0FsbD1OXHUwMGUzbyBQdWJsaWNhciBOZW5odW0NCi1GaWx0ZXJEaWFsb2dfUGF0dGVybl9kZXNjcmlwdGlvbj1PcyBwYWRyXHUwMGY1ZXMgc1x1MDBlM28gc2VwYXJhZG9zIHBvciB2XHUwMGVkcmd1bGFzLCBlbSBxdWUgKj1xdWFscXVlciBjYWRlaWEsID89cXVhbHF1ZXIgY2FyYWN0ZXJlDQotQ29uZmlndXJhdGlvblBhZ2VfVHJlZVRpdGxlTGFiZWw9Q29udGVcdTAwZmFkbzoNCi1Db25maWd1cmF0aW9uUGFnZV9Mb2FkaW5nTWVzc2FnZT1DYXJyZWdhbmRvIGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbywgYWd1YXJkZSAuLi4NCi1Nb3ZlRGlhbG9nX3ZhbGlkZGVzdGluYXRpb25fdGV4dD1PIGRlc3Rpbm8gcGFyYSBtdWRhblx1MDBlN2EgZXNwZWNpZmljYWRvIFx1MDBlOSBpbnZcdTAwZTFsaWRvLg0KLU1vdmVEaWFsb2dfY2Fubm90TW9kaWZ5RGVzdGluYXRpb249SVVQQTAwMzRFOiBOXHUwMGUzbyBcdTAwZTkgcG9zc1x1MDBlZHZlbCBtb2RpZmljYXIgbyBkZXN0aW5vIHNlbGVjaW9uYWRvLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbEFsbD1QdWJsaWNhciBUdWRvDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkJhc2VBY3Rpdml0eT1BYnJpciBBdGl2aWRhZGUgZGUgQmFzZQ0KLVByb2Nlc3NGb3JtRWRpdG9yX2V4cGFuQWxsQWN0aW9uTGFiZWw9RSZ4cGFuZGlyIFRvZG9zDQotUHJvY2Vzc0Zvcm1FZGl0b3JfY29sbGFwc2VBbGxBY3Rpb25MYWJlbD1SZWR1JnppciBUb2Rvcw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURpYWdyYW09QWJyaXIgRGlhZ3JhbWEgZGUgJkF0aXZpZGFkZQ0KLVByb2Nlc3NFZGl0b3JfcHJvbXB0VG9EZWxldGVCZWZvcmVSZXZlYWw9T3MgZGVzY3JpdG9yZXMgblx1MDBlM28gc3VwcmltaWRvcyBsaXN0YWRvcyBub3MgRGV0YWxoZXMgZGV2ZW0gc2VyIGV4Y2x1XHUwMGVkZG9zIHBhcmEgZXZpdGFyIGR1cGxpY2FcdTAwZTdcdTAwZTNvIGFwXHUwMGYzcyByZXZlbGFyIG9zIGVsZW1lbnRvcyBzZWxlY2lvbmFkb3MuIENsaXF1ZSBlbSBPSyBzZSBkZXNlamFyIGV4Y2x1XHUwMGVkLWxvcyBlIGNvbnRpbnVlLg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9TZWxlY3RDb2x1bW5zPVNlbGVjaW9uZSBhcyBjb2x1bmFzIGEgc2VyZW0gaW5jbHVcdTAwZWRkYXMNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtPUFicmlyIERpYWdyYW1hIGRlICZEZXRhbGhlcyBkZSBBdGl2aWRhZGUNCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfQ29sdW1uU2VsZWN0aW9uPVNlbGVcdTAwZTdcdTAwZTNvIGRlIGNvbHVuYToNCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3dpdGNoQ29uZmlndXJhdGlvbj1WXHUwMGUxIHBhcmEgYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHBhZHJcdTAwZTNvIGRvIFByb2Nlc3NvIGFvIGF0aXZhciB1bSBlZGl0b3IgZGUgUHJvY2Vzc28NCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3VwcHJlc3Npb25Hcm91cFRpdGxlPVN1cHJlc3NcdTAwZTNvDQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX2luaGVyaXRTdXBwcmVzc2lvblN0YXRlPUhlcmRhciBlc3RhZG9zIGRlIHN1cHJlc3NcdTAwZTNvDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW09QWJyaXIgRGlhZ3JhbWEgZGUgRGVwZW5kXHUwMGVhbmNpYSBkZSBQcm9kdXRvIGRlICZUcmFiYWxobw0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19DbGVhckJ1dHRvbkxhYmVsPUxpbXBhcg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsPVNlbGVjaW9uYXIuLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9JbnNlcnROZXdQaGFzZT1JbnNlcmlyIE5vdmEgRmFzZQ0KLVZpZXdIZWxwZXJfcmVsb2FkTGliT25Sb2xsYmFja0Vycm9yPU5cdTAwZTNvIGZvaSBwb3NzXHUwMGVkdmVsIHJlY3VwZXJhci1zZSBkZSB1bSBlcnJvIGRlIHBlcnNpc3RcdTAwZWFuY2lhLiBBIGJpYmxpb3RlY2EgcHJlY2lzYSBzZXIgcmVjYXJyZWdhZGEgcGFyYSByZXN0YXVyYXIgc2V1IGVzdGFkbyBvcmlnaW5hbC4NCi1WaWV3SGVscGVyX2FscmVhZHlkZWxldGVkX3RleHQ9TyBlbGVtZW50byAnJ3swfScnIGpcdTAwZTEgZm9pIGV4Y2x1XHUwMGVkZG8uDQotVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZGNvbmZpcm1fdGV4dD1PIGVsZW1lbnRvICcnezB9Jycgalx1MDBlMSBmb2kgZXhjbHVcdTAwZWRkby4gRGVzZWphIHJlbW92XHUwMGVhLWxvIGRlICcnezF9Jyc/DQotQ29uZmlndXJhdGlvblBhZ2VfQWRkTWlzc2luZ1Rvb2xUaXA9SW5jbHVpciBSZWZlclx1MDBlYW5jaWFzIEF1c2VudGVzDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb249RGVzY3JpXHUwMGU3XHUwMGUzbw0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkdlbmVyYWxJbmZvPUluZm9ybWFcdTAwZTdcdTAwZjVlcyBHZXJhaXMgDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXBwbHlQYXR0ZXJuPUFwbGljYXIgUGEmZHJcdTAwZTNvDQotTW92ZURpYWxvZ19zZWxlY3RkZXN0aW5hdGlvbl90ZXh0PVNlbGVjaW9uZSB1bSBkZXN0aW5vLg0KLU1vdmVEaWFsb2dfbm9tb3ZlX2Rlc3RpbmF0aW9uX3Byb2JsZW1fbXNnPU5lbmh1bSBkZXN0aW5vIGRlIG1vdmltZW50YVx1MDBlN1x1MDBlM28gZm9pIGVzcGVjaWZpY2Fkby4NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3Ryb3VibGVvYmplY3Q9LiBPYmpldG8gY29tIHByb2JsZW1hOiANCi1NZXNzYWdlTGFiZWxQcm92aWRlcl9lcnJjaGlsZHBrZ3M9VW0gcGFjb3RlIGRlIGNvbnRlXHUwMGZhZG8gb3UgcHJvY2Vzc28gY29udFx1MDBlOW0gZWxlbWVudG9zIGNvbSByZWZlclx1MDBlYW5jaWFzIGF1c2VudGVzDQotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19UaXRsZT1PcFx1MDBlN1x1MDBmNWVzIGRlIFB1YmxpY2FcdTAwZTdcdTAwZTNvIGRlIERpYWdyYW1hDQotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19NZXNzYWdlPVNlbGVjaW9uZSBvcyBkaWFncmFtYXMgYSBzZXJlbSBwdWJsaWNhZG9zIG91IGNhbmNlbGUgYSBzZWxlXHUwMGU3XHUwMGUzbyBwYXJhIG5cdTAwZTNvIHB1YmxpY2FyDQotUHJvY2Vzc0VkaXRvcl9UaXRsZT1FZGl0b3IgZGUgUHJvY2Vzc286IA0KLVNhdmVBc3dpdGhkb3RzX3RleHQ9U2FsdmFyIENvbW8uLi4NCi1Qcm9jZXNzRWRpdG9yX1dvcmtCcmVha2Rvd25TdHJ1Y3R1cmU9RXN0cnV0dXJhIGRlIERlY29tcG9zaVx1MDBlN1x1MDBlM28gZGUgVHJhYmFsaG8NCi1Qcm9jZXNzRWRpdG9yX1RlYW1BbGxvY2F0aW9uPUFsb2NhXHUwMGU3XHUwMGUzbyBkZSBFcXVpcGUNCi1Qcm9jZXNzRWRpdG9yX1dvcmtQcm9kdWN0VXNhZ2U9VXNvIGRlIFByb2R1dG8gZGUgVHJhYmFsaG8NCi1Qcm9jZXNzRWRpdG9yX0NvbnNvbGlkYXRlZFZpZXc9VmlzdWFsaXphXHUwMGU3XHUwMGUzbyBDb25zb2xpZGFkYQ0KLVByb2Nlc3NFZGl0b3JfY29uZmlybUF1dG9TeW5jaD1Fc3RhIG9wZXJhXHUwMGU3XHUwMGUzbyBhdHVhbGl6YSBvcyBkZXNjcml0b3JlcyBzZWxlY2lvbmFkb3Mgb3UgdG9kb3Mgb3MgZGVzY3JpdG9yZXMgYWJhaXhvIGRhcyBhdGl2aWRhZGVzIHNlbGVjaW9uYWRhcyBxdWUgZm9yYW0gbWFyY2Fkb3MgY29tbyAiU2luY3Jvbml6YWRvcyBjb20gYSBvcmlnZW0iIG5hIGd1aWEgR2VyYWwgZGEgdmlzdWFsaXphXHUwMGU3XHUwMGUzbyBQcm9wcmllZGFkZXMuIEVsYSBhdHVhbGl6YSBlc3NlcyBkZXNjcml0b3JlcyBjb20gYXMgcHJvcHJpZWRhZGVzIG9yaWdpbmFpcyBkb3MgZWxlbWVudG9zIGRlIGNvbnRlXHUwMGZhZG8gZGUgbVx1MDBlOXRvZG8gdmluY3VsYWRvcyBuYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHBhZHJcdTAwZTNvIGRvIHByb2Nlc3NvLiBPYnNlcnZlIHF1ZSBlbGUgblx1MDBlM28gYXR1YWxpemFyXHUwMGUxIG5lbmh1bSBkZXNjcml0b3IgdmluY3VsYWRvIGRpbmFtaWNhbWVudGUgKGVtIHZlcmRlIGUgaXRcdTAwZTFsaWNvKS4gRGVzZWphIGNvbnRpbnVhcj8NCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjE9Q29uZmlndXJhXHUwMGU3XHUwMGUzbw0KLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMj1TZWxlXHUwMGU3XHUwMGUzbyBkZSBQbHVnLWluIGUgUGFjb3RlDQotTmV3TGlicmFyeURpYWxvZ19uZXdsaWJyYXJ5X2FzPUNyaWFyIE5vdmEgQmlibGlvdGVjYSBDb21vDQotTmV3UGx1Z2luRGlhbG9nX25ld3BsdWdpbl90ZXh0PU5vdm8gUGx1Zy1pbiBkZSBNXHUwMGU5dG9kbw0KLVNlbGVjdEVsZW1lbnREaWFsb2dfdGl0bGVfdGV4dD1TZWxlY2lvbmUgbyBlbGVtZW50byBvdSB1bSBkZSBzZXVzIGNvbnRyaWJ1aW50ZXM6DQotT3BlbkNvbmZpZ0RpYWxvZ25ld2NvbmZpZ190ZXh0PU5vdmEgQ29uZmlndXJhXHUwMGU3XHUwMGUzbzoNCi1wcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2VfQlNFZGl0b3I9RWRpdG9yIGRlIFByb2Nlc3NvDQotDQotIyBBYnN0cmFjdERpYWdyYW1FZGl0b3INCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9QWxpbmhhcg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0PUF0dWFsaXphciBhIHBhcnRpciBkYSBBdGl2aWRhZGUgZGUgQmFzZQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dD1Gb3JtYXRhciBDYWl4YSBkZSBUZXh0by4uLg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9SG9yaXpvbnRhbG1lbnRlIHBhcmEgYSBNXHUwMGU5ZGlhDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1Ib3Jpem9udGFsbWVudGUgcGFyYSBvIFByaW1laXJvIFNlbGVjaW9uYWRvDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1WZXJ0aWNhbG1lbnRlIHBhcmEgYSBNXHUwMGU5ZGlhDQotTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl90aXRsZT1JbmZvcm1hXHUwMGU3XHUwMGY1ZXMgR2VyYWlzDQotTW92ZURpYWxvZ19pbnZhbGlkX21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9SVVQQTAwNDFFOiBPKHMpIGVsZW1lbnRvKHMpIHNlbGVjaW9uYWRvKHMpIG5cdTAwZTNvIHBvZGUobSkgc2VyIG1vdmlkbyhzICkgcGFyYSBvIGRlc3Rpbm8gZXNwZWNpZmljYWRvLg0KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZW1vZGVsbGlicmFyeT1TYWx2YW5kbyBiaWJsaW90ZWNhIGRlIG1vZGVsbyAuLi4NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX2Vycm9yX2RpYWxvZ190aXRsZT1FcnJvDQotTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c9SVVQQTAwMzNFOiBQcm9ibGVtYSBlbmNvbnRyYWRvIGFvIHNhbHZhciBiaWJsaW90ZWNhLg0KLU1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb25fZGVsZXRlY29uZmlybV90ZXh0PVRlbSBjZXJ0ZXphIGRlIHF1ZSBkZXNlamEgZXhjbHVpciAnJ3swfScnPw0KLUNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX0NvbnRlbnRFbGVtZW50X3RleHQ9RWxlbWVudG9zIGRlIGNvbnRlXHUwMGZhZG86IA0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfQnJvd3NlQnV0dG9uTGFiZWw9UHJvY3VyYXIuLi4NCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uPUVzcGVjaWZpcXVlIHVtIG5vbWUgZSB1bWEgZGVzY3JpXHUwMGU3XHUwMGUzbyBwYXJhIGEgbm92YSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIG1cdTAwZTl0b2RvLg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlVGl0bGU9U2FsdmFyIGFzIGFsdGVyYVx1MDBlN1x1MDBmNWVzIGUgZmVjaGFyIHRvZG9zIG9zIGVkaXRvcmVzDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1WZXJ0aWNhbG1lbnRlIHBhcmEgbyBQcmltZWlybyBTZWxlY2lvbmFkbw0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQ9U2FsdmFyDQotQXR0YWNobWVudERpYWxvZ2F0dGFjaEZpbGVfdGV4dD1BbmV4YXIgQXJxdWl2bw0KLUNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnQ9Q29udGVcdTAwZmFkbyBkYSBDb25maWd1cmFcdTAwZTdcdTAwZTNvDQotT3BlbkNvbmZpZ0RpYWxvZ29wZW5jb25maWdfdGV4dD1BYnJpciBDb25maWd1cmFcdTAwZTdcdTAwZTNvDQotRWxlbWVudHNWaWV3X3JlcGxhY2VBY3Rpb25fdGV4dD1TdWJzdGl0dWlyLi4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfbWVzc2FnZT1TYWx2YW5kbyB7MH0NCi1Db25maWd1cmF0aW9uUGFnZV9TaG93RXJyb3JUb29sVGlwPU1vc3RyYXIgdmlzdWFsaXphZG9yIGRlIHJlZ2lzdHJvIGRlIGF2aXNvcyBkZSBjb25maWd1cmFcdTAwZTdcdTAwZTNvDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRm9ybVByZWZpeD1Db25maWd1cmFcdTAwZTdcdTAwZTNvOg0KLQ0KLUNoZWNrbGlzdE9yZGVyX2NoZWNrbGlzdGl0ZW1zX3RleHQ9SXRlbnMgZGUgVmVyaWZpY2FcdTAwZTdcdTAwZTNvOiANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw9TW92ZXIgTlx1MDBmMw0KLUNvbmZpZ3VyYXRpb25QYWdlX01ha2VDbG9zdXJlVG9vbFRpcD1GYXplciBGZWNoYW1lbnRvIGNvcnJpZ2luZG8gZXJyb3MNCi1OZXdQbHVnaW5EaWFsb2dfcmVmZXJlbmNlcGx1Z2luX3RleHQ9UGx1Zy1pbnMgZGUgUmVmZXJcdTAwZWFuY2lhOg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9jcmVhdGVGcmVlVGV4dF90ZXh0PUNyaWFyIHVtIFRleHRvIExpdnJlDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfTGFiZWw9VmlzdWFsaXphXHUwMGU3XHUwMGUzbyBkZSBcdTAwY2Rjb25lIGRlIE5cdTAwZjM6DQotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9jb25uZWN0X3RleHQ9SVVQQTAwMzJXOiBJbXBvc3NcdTAwZWR2ZWwgY29uZWN0YXINCi1EaWFncmFtVmFsaWRhdGlvbl9lcnJfc2FtZXByZWRhbmRzdWNfdGV4dD1JVVBBMDAzM1c6IE5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIHRlciBvIG1lc21vIGVsZW1lbnRvIGRlIGRpdmlzXHUwMGUzbyBjb21vIHByZWRlY2Vzc29yIGUgc3VjZXNzb3INCi0NCi0jIEVkaXRvckNob29zZXINCi1FZGl0b3JDaG9vc2VyX2xvYWRkRXJyb3JEbGdUaXRsZT1BYnJpciBFZGl0b3INCi1FZGl0b3JDaG9vc2VyX1Jlc291cmNlc0Vycm9yPUVzdGUgZWxlbWVudG8gdGVtIGVycm9zLiBSZWNvbWVuZGEtc2UgY29ycmlnaXIgZXN0ZXMgZXJyb3MgYW50ZXMgZGUgY29udGludWFyIChjb25zdWx0ZSBvcyBkZXRhbGhlcykuXG5cDQotXG5cDQotQ2xpcXVlIGVtIE9LIHBhcmEgY29udGludWFyIHNlbSBhYnJpciBvIGVkaXRvci4gRmVjaGUgZXN0ZSBkaVx1MDBlMWxvZ28gcGFyYSBhYnJpciBvIGVkaXRvci4NCi1Db25maWd1cmF0aW9uUGFnZV9Gb3JtUHJlZml4PUNvbmZpZ3VyYVx1MDBlN1x1MDBlM286DQotDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uTmFtZT1Ob21lOg0KLUF0dGFjaG1lbnREaWFsb2dGaWxlVVJMX3RleHQ9VVJMIGRvIEFycXVpdm86DQotU3RlcHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbj1TZWxlY2lvbmUgdW1hIGV0YXBhIGUgY2xpcXVlIGVtIFBhcmEgQ2ltYSBvdSBlbSBQYXJhIEJhaXhvIHBhcmEgYWx0ZXJhciBzdWEgb3JkZW0uDQotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJfc2F2ZT1FcnJvIGR1cmFudGUgc2FsdmFtZW50bw0KLU1lc3NhZ2VWaWV3X2VycmVsZW1lbnRfdGV4dD1FbGVtZW50byBxdWUgUmVmZXJlbmNpYQ0KLU1lc3NhZ2VWaWV3X3JlZmVsZW1lbnRfdGV4dD1FbGVtZW50byBSZWZlcmVuY2lhZG8NCi0NCi0jQWN0aXZpdHkgRGlhZ3JhbQ0KLUFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9jcmVhdGVTdGFydE5vZGVfdGV4dD1DcmlhciB1bSBOXHUwMGYzIGRlIEluXHUwMGVkY2lvDQotQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudERlc2NyaXB0aW9uPVNlbGVjaW9uZSBvcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbywgb3MgcGFjb3RlcyBkZSBjb250ZVx1MDBmYWRvIGUgb3MgcHJvY2Vzc28gcXVlIHNlclx1MDBlM28gaW5jbHVcdTAwZWRkb3MgbmVzdGEgY29uZmlndXJhXHUwMGU3XHUwMGUzby4NCi1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbl90ZXh0PURpXHUwMGUxbG9nbyBkZSBvcmRlbSBkb3MgZWxlbWVudG9zIGRlIGNvbnRlXHUwMGZhZG8gZGUgQ2F0ZWdvcmlhIEN1c3RvbWl6YWRhDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EaXJlY3RvcnlMYWJlbD1EaXJldFx1MDBmM3JpbzoNCi1Sb290UHJlZlBhZ2VfZW5hYmxlcHJvY2Vzc2NvbnRyaWJ1dGlvbl90ZXh0PUF0aXZhciBDb250cmlidWlcdTAwZTdcdTAwZTNvIGRlIFByb2Nlc3NvDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25fdGV4dD1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGUgbVx1MDBlOXRvZG8uDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25MYWJlbD1EZXNjcmlcdTAwZTdcdTAwZTNvOg0KLUNvbnRyaWJ1dGlvblNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9RXNjb2xoZW5kbyBDb250cmlidWludGVzIHBhcmEgJyd7MH0nJw0KLUVsZW1lbnRzVmlld19vcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb25fdGV4dD1BYnJpciB2aWEgZWxlbWVudG9zIGRlIHZhcmlhYmlsaWRhZGUNCi1WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9ZXNjb2xoZW5kbyBlbGVtZW50b3MgZGUgdmFyaWFiaWxpZGFkZSBkZSAnJ3swfScnDQotVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3ZpZXdlckxhYmVsPUVsZW1lbnRvcyBkZSB2YXJpYWJpbGlkYWRlIGRlICcnezB9JycNCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfTGFiZWw9VmlzdWFsaXphXHUwMGU3XHUwMGUzbyBkZSBcdTAwY2Rjb25lIGRlIFNoYXBlOg0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfZGVsZXRlX3RleHQ9SW1wb3NzXHUwMGVkdmVsIGV4Y2x1aXINCi1BY3Rpdml0eURpYWdyYW1FZGl0b3Jfb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0PUFicmlyIERpYWdyYW1hIGRlIERldGFsaGVzIGRlIEF0aXZpZGFkZXMgDQotTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl9kZXNjcmlwdGlvbj1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw9TGltcGFyDQotV1BDb21wYXJ0bWVudEZpZ3VyZV8wPU5vdm8gRGVzY3JpdG9yIGRlIFByb2R1dG8gZGUgVHJhYmFsaG8NCi1wcm9tcHRmb3JfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZF90ZXh0PVB1YmxpY2FyIG91IHByb2N1cmFyIGRpYWdyYW1hcyBkZSBkZXRhbGhlcyBkZSBhdGl2aWRhZGUgcXVlIG5cdTAwZTNvIHRlbmhhbSBzaWRvIGNyaWFkb3Mgbm8gZWRpdG9yIGRlIHByb2Nlc3NvDQotcHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtPVB1YmxpY2FyIG91IHByb2N1cmFyIGRpYWdyYW1hcyBkZSBhdGl2aWRhZGVzIHBhcmEgZXh0ZW5zXHUwMGY1ZXMgZGUgYXRpdmlkYWRlIG5cdTAwZTNvIG1vZGlmaWNhZGFzLg0KLQ0KLSNDb25maWdQcm9jZXNzVmlld0RpYWxvZw0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX05hbWVQYXR0ZXJuPVBhZHJcdTAwZjVlcyBkZSBub21lIChvcyBub21lcyBjb3JyZXNwb25kZW50ZXMgc2VyXHUwMGUzbyBtb3N0cmFkb3MpOg0KLXNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uX2xhYmVsPU1vc3RyYXIgbm8gTmF2ZWdhZG9yIGRlIFJlY3Vyc28NCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19QYXR0ZXJuPU9zIHBhZHJcdTAwZjVlcyBzXHUwMGUzbyBzZXBhcmFkb3MgcG9yIHZcdTAwZWRyZ3VsYXMsIGVtIHF1ZSAqPXF1YWxxdWVyIGNhZGVpYSwgPz1xdWFscXVlciBjYXJhY3RlcmUNCi1lcnJfcHJvY2Vzc2luZ19maWxlX2Rlc2NyaXB0aW9uPUlVUEEwMDI5RTogT2NvcnJldSB1bSBlcnJvIGFvIHByb2Nlc3NhciBvIGFycXVpdm8gc2VsZWNpb25hZG8uIENsaXF1ZSBlbSBEZXRhbGhlcyBwYXJhIG9idGVyIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBhZGljaW9uYWlzLg0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX0NhdGVnb3J5VHlwZT1UaXBvIGRlIENhdGVnb3JpYToNCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19CcmllZkRlc2NyaXB0aW9uPURlc2NyaVx1MDBlN1x1MDBlM28gUmVzdW1pZGE6DQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfU2VsZWN0Q2F0ZWdvcmllcz1TZWxlY2lvbmFyIENhdGVnb3JpYXMNCi0NCi0jbG9nIG1lc3NhZ2VzDQotY2hlYXRzaGVldF9sb2FkX2ZhaWx1cmVfbG9nX21zZz1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBhYnJpciBhIGZvbGhhIGRlIGRpY2FzIHNvbGljaXRhZGE6IA0KLQ0KLW5ld0NvbmZpZ3VyYXRpb25XaXJhemRfY3JlYXRlRXJyb3I9SVVQQTAwMzVFOiBOXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBjcmlhciBhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gY29tIFx1MDBlYXhpdG8NCi1uZXdQbHVnaW5XaXphcmRfY3JlYXRlRXJyb3I9SVVQQTAwMzZFOiBOXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBjcmlhciBvIHBsdWctaW4gY29tIFx1MDBlYXhpdG8NCi1lcnJvckRpYWxvZ19tb3ZlRXJyb3I9SVVQQTAwMzdFOiBOXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBtb3ZlciBvIGVsZW1lbnRvIGNvbSBcdTAwZWF4aXRvDQotcmVuYW1lRGlhbG9nX3JlbmFtZUVycm9yPUlVUEEwMDM4RTogTlx1MDBlM28gZm9pIHBvc3NcdTAwZWR2ZWwgcmVub21lYXIgbyBlbGVtZW50byBjb20gXHUwMGVheGl0bw0KLWVycm9yRGlhbG9nX2NyZWF0ZUVycm9yPUlVUEEwMDM5RTogTlx1MDBlM28gZm9pIHBvc3NcdTAwZWR2ZWwgY3JpYXIgbyBlbGVtZW50byBjb20gXHUwMGVheGl0bw0KLWR1cGxpY2F0ZVBsdWdpbk5hbWVFcnJvcl9tc2c9SVVQQTAxMDFFOiBPIG5vbWUgJyd7MH0nJyBqXHUwMGUxIGV4aXN0ZS4gRGlnaXRlIHVtIG5vbWUgZGlmZXJlbnRlIGUgdGVudGUgbm92YW1lbnRlLg0KLQ0KLSNOZXcgU3RyaW5ncyBmb3IgUHJvY2Vzc0VkaXRvciBDb250ZXh0IG1lbnUgZGlhZ3JhbSBpbWFnZXMNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRBREltYWdlPURlc2lnbmFyIEltYWdlbSBBRC4uLg0KLVByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yVGl0bGU9RXJybyBkZSBBdHVhbGl6YVx1MDBlN1x1MDBlM28NCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvck1zZz1FcnJvIGFvIGF0dWFsaXphciBlZGl0b3INCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRBRERJbWFnZT1EZXNpZ25hciBJbWFnZW0gQURELi4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkV1BESW1hZ2U9RGVzaWduYXIgSW1hZ2VtIFdQRC4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFESW1hZ2VJblB1Ymxpc2hpbmc9VXRpbGl6YXIgSW1hZ2VtIEFEIG5hIFB1YmxpY2FcdTAwZTdcdTAwZTNvDQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVN1cHByZXNzPU9zIGRlc2NyaXRvcmVzIHN1cHJpbWlkb3MgbGlzdGFkb3Mgbm9zIERldGFsaGVzIGRldmVtIHNlciBleGNsdVx1MDBlZGRvcyBwYXJhIGV2aXRhciBkdXBsaWNhXHUwMGU3XHUwMGUzbyBhcFx1MDBmM3MgYSBzdXByZXNzXHUwMGUzbyBkb3MgZWxlbWVudG9zIHNlbGVjaW9uYWRvcy4gQ2xpcXVlIGVtIE9LIHNlIGRlc2VqYXIgZXhjbHVcdTAwZWQtbG9zIGUgY29udGludWUuDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURESW1hZ2VJblB1Ymxpc2hpbmc9VXRpbGl6YXIgSW1hZ2VtIEFERCBuYSBQdWJsaWNhXHUwMGU3XHUwMGUzbw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZVdQREltYWdlSW5QdWJsaXNoaW5nPVV0aWxpemFyIEltYWdlbSBXUEQgbmEgUHVibGljYVx1MDBlN1x1MDBlM28NCi1Qcm9jZXNzRWRpdG9yX0RpYWdyYW1JbWFnZV9JbnB1dERpYWxvZ19pbml0aWFsVmFsdWU9Q2FtaW5obyBkYSBJbWFnZW0NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TaG93TGlua2VkRWxlbWVudGluTGlicmFyeVZpZXc9TSZvc3RyYXIgRWxlbWVudG8gVmluY3VsYWRvIGVtIFZpc3VhbGl6YVx1MDBlN1x1MDBlM28gZGUgQmlibGlvdGVjYQ0KLVByb2Nlc3NFZGl0b3JfdXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbl9sYWJlbD1BdHVhbGl6YXIgU3VwcmVzc1x1MDBlM28gZGEgJkJhc2UNCi1Qcm9jZXNzRWRpdG9yX0NvbnRleHRNZW51X0RpYWdyYW1JbWFnZXM9SW1hZ2VucyBkZSBEaWFncmFtYQ0KLQ0KLSNTdHJpbmdzIGZvciBzeW5jaHJvbml6YXRpb24gd2l6YXJkIG9uIHByb2Nlc3MgZWRpdG9yJ3MgQlMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RpdGxlPURlc2NyaVx1MDBlN1x1MDBlM28gZGEgU2luY3Jvbml6YVx1MDBlN1x1MDBlM28NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RleHQ9TGVpYSBhcyBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWJhaXhvIHF1ZSBleHBsaWNhbSBlbSBxdWUgcmVzdWx0YSB1bWEgc2luY3Jvbml6YVx1MDBlN1x1MDBlM28gcGVyc29uYWxpemFkYS4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1TZWxlY2lvbmFyIENvbmZpZ3VyYVx1MDBlN1x1MDBlM28NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0PVNlbGVjaW9uZSBhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gcXVlIGRlc2VqYSB1dGlsaXphciBuYSBzaW5jcm9uaXphXHUwMGU3XHUwMGUzby5cDQotQSBzZWxlXHUwMGU3XHUwMGUzbyBkZXRlcm1pbmEgcXVhaXMgY29udHJpYnVpXHUwMGU3XHUwMGY1ZXMgZSBzdWJzdGl0dWlcdTAwZTdcdTAwZjVlcyBzZXJcdTAwZTNvIHV0aWxpemFkYXMgbmEgc2luY3Jvbml6YVx1MDBlN1x1MDBlM28uDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfY29uZmlnTGFiZWw9Q29uZmlndXJhXHUwMGU3XHUwMGUzbzoNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGl0bGU9U2VsZWNpb25lIGFzIHByb3ByaWVkYWRlcyBxdWUgZGV2ZW0gc2VyIHNpbmNyb25pemFkYXMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJvcGVydGllc19sYWJsZT1Qcm9wcmllZGFkZXMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbmFtZV9sYWJsZT1Ob21lDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByZXNlbnRhdGlvbk5hbWVfbGFibGU9Tm9tZSBkZSBBcHJlc2VudGFcdTAwZTdcdTAwZTNvDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2JyaWVmRGVzY19sYWJsZT1CcmV2ZSBEZXNjcmlcdTAwZTdcdTAwZTNvDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX29wdGlvbmFsSW5vdXRzX2xhYmVsPUVudHJhZGFzIE9wY2lvbmFpcw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9tYW5kYXRvcnlJbnB1dHNfbGFibGU9RW50cmFkYXMgT2JyaWdhdFx1MDBmM3JpYXMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3V0cHV0c19sYWJlbD1TYVx1MDBlZGRhcw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX2xhYmVsPUV4ZWN1dG9yIFByaW1cdTAwZTFyaW8NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYWRkblBlcmZvcm1lcnNfbGFibGU9RXhlY3V0b3JlcyBBZGljaW9uYWlzDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Jlc3BvbnNpYmxlUm9sZXNfbGFibGU9RnVuXHUwMGU3XHUwMGY1ZXMgUmVzcG9uc1x1MDBlMXZlaXMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfY29udG5BcnRpZmFjdHNfbGFiZWw9QXJ0ZWZhdG8gQ29udGlkbw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9kaWx2ZWRQYXJ0c19sYWJlbD1QYXJ0ZXMgRGlzdHJpYnVcdTAwZWR2ZWlzDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3NlbFN0ZXBzX2xhYmVsPVNlbGVcdTAwZTdcdTAwZTNvIGRlIEV0YXBhcw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90ZXh0PUVzY29saGEgYXMgcHJvcHJpZWRhZGVzIGRlIGNvbnRlXHUwMGZhZG8gZG8gbVx1MDBlOXRvZG8gcXVlIHZvY1x1MDBlYSBkZXNlamEgY29uc2lkZXJhciBwYXJhIHNpbmNyb25pemFcdTAwZTdcdTAwZTNvLg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90aXRsZT1Qclx1MDBlOS12aXN1YWxpemFcdTAwZTdcdTAwZTNvIGRlIFNpbmNyb25pemFcdTAwZTdcdTAwZTNvDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RleHQ9UmV2aXNlIG9zIGRldGFsaGVzIGRhIHNpbmNyb25pemFcdTAwZTdcdTAwZTNvIHByb3Bvc3RvcyBhYmFpeG8uDQotc2VsZWN0RWRpdG9yc1RvRGlzY2FyZENvbmZsaWN0Q2hhbmdlcz1IXHUwMGUxIGFsdGVyYVx1MDBlN1x1MDBmNWVzIG5cdTAwZTNvIHNhbHZhcyBlbSBjb25mbGl0byBjb20gYWx0ZXJhXHUwMGU3XHUwMGY1ZXMgZmVpdGFzIGZvcmEgZG9zIGVkaXRvcmVzLlxuXA0KLVNlbGVjaW9uZSBvcyBlZGl0b3JlcyBjdWphcyBhbHRlcmFcdTAwZTdcdTAwZjVlcyB2b2NcdTAwZWEgZGVzZWphIGRlc2NhcnRhci4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfdGl0bGVfdGV4dD1Bc3Npc3RlbnRlIGRlIFNpbmNyb25pemFcdTAwZTdcdTAwZTNvDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV9leHBsYWluVGV4dD1Fc3RlIGFzc2lzdGVudGUgb2ZlcmVjZSBzdXBvcnRlIHBhcmEgYSBhdHVhbGl6YVx1MDBlN1x1MDBlM28gZG9zIGRlc2NyaXRvcmVzIHNlbGVjaW9uYWRvcyBvdSB0b2RvcyBvcyBkZXNjcml0b3JlcyBhYmFpeG8gZGFzIGF0aXZpZGFkZXMgc2VsZWNpb25hZGFzIHF1ZSBmb3JhbSBtYXJjYWRvcyBjb21vICJTaW5jcm9uaXphZG9zIGNvbSBhIG9yaWdlbSIgbmEgZ3VpYSBHZXJhbCBkYSB2aXN1YWxpemFcdTAwZTdcdTAwZTNvIFByb3ByaWVkYWRlcy5cDQotQXBlbmFzIGFzIHByb3ByaWVkYWRlcyBxdWUgZm9yZW0gc2VsZWNpb25hZGFzIG5lc3RlIGFzc2lzdGVudGUgc2VyXHUwMGUzbyBhdHVhbGl6YWRhcyBub3MgZGVzY3JpdG9yZXMuIFwNCi1UYW1iXHUwMGU5bSBcdTAwZTkgcG9zc1x1MDBlZHZlbCBzZWxlY2lvbmFyIHF1YWxxdWVyIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gdlx1MDBlMWxpZGEgZG8gcHJvY2Vzc28gcXVlIHNlclx1MDBlMSB1dGlsaXphZG8gYW8gY29tcHV0YXIgYSBhdHVhbGl6YVx1MDBlN1x1MDBlM28uXA0KLU9ic2VydmUgcXVlIG8gYXNzaXN0ZW50ZSBuXHUwMGUzbyBhdHVhbGl6YXJcdTAwZTEgbmVuaHVtIGRlc2NyaXRvciB2aW5jdWxhZG8gZGluYW1pY2FtZW50ZSAoZW0gdmVyZGUgZSBpdFx1MDBlMWxpY28pLg0KLQ0KLW9wZW5SVEU9QWJyaXIgZWRpdG9yIGRlIHJpY2ggdGV4dA0KLWNsb3NlUlRFPUZlY2hhciBlZGl0b3IgZGUgcmljaCB0ZXh0DQotDQotI05ldyBTdHJpbmdzDQotcm9sZXNldHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXJlbmNpZSBhIG9yaWVudGFcdTAwZTdcdTAwZTNvIHF1ZSBwZXJ0ZW5jZSBhIGVzdGUgY29uanVudG8gZGUgZnVuXHUwMGU3XHUwMGY1ZXMuDQotZGlzY2lwbGluZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXJlbmNpZSBhIG9yaWVudGFcdTAwZTdcdTAwZTNvIHF1ZSBwZXJ0ZW5jZSBhIGVzdGEgZGlzY2lwbGluYS4NCi13b3JrcHJvZHVjdHR5cGVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VyZW5jaWUgYSBvcmllbnRhXHUwMGU3XHUwMGUzbyBxdWUgcGVydGVuY2UgYSBlc3RlIHRpcG8gZGUgcHJvZHV0byBkZSB0cmFiYWxoby4NCi1kb21haW5zX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VyZW5jaWUgYSBvcmllbnRhXHUwMGU3XHUwMGUzbyBxdWUgcGVydGVuY2UgYSBlc3RlIGRvbVx1MDBlZG5pby4NCi10b29sc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlcmVuY2llIGEgb3JpZW50YVx1MDBlN1x1MDBlM28gcXVlIHBlcnRlbmNlIGEgZXN0YSBmZXJyYW1lbnRhLg0KLWN1c3RvbWNhdGVnb3J5X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VyZW5jaWUgYSBvcmllbnRhXHUwMGU3XHUwMGUzbyBxdWUgcGVydGVuY2UgYSBlc3RhIGNhdGVnb3JpYSBjdXN0b21pemFkYS4NCi0NCi1jb25jZXB0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VyZW5jaWUgYSBvcmllbnRhXHUwMGU3XHUwMGUzbyBxdWUgcGVydGVuY2UgYSBlc3RlIGNvbmNlaXRvLg0KLWNoZWNrbGlzdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlcmVuY2llIGEgb3JpZW50YVx1MDBlN1x1MDBlM28gcXVlIHBlcnRlbmNlIGEgZXN0YSBsaXN0YSBkZSB2ZXJpZmljYVx1MDBlN1x1MDBlM28uDQotZXhhbXBsZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlcmVuY2llIGEgb3JpZW50YVx1MDBlN1x1MDBlM28gcXVlIHBlcnRlbmNlIGEgZXN0ZSBleGVtcGxvLg0KLWd1aWRlbGluZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlcmVuY2llIGEgb3JpZW50YVx1MDBlN1x1MDBlM28gcXVlIHBlcnRlbmNlIGEgZXN0YSBkaXJldHJpei4NCi1yb2FkbWFwX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VyZW5jaWUgYSBvcmllbnRhXHUwMGU3XHUwMGUzbyBxdWUgcGVydGVuY2UgYSBlc3RlIHJvdGVpcm8uDQotcmV1c2FibGVhc3NldF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlcmVuY2llIGEgb3JpZW50YVx1MDBlN1x1MDBlM28gcXVlIHBlcnRlbmNlIGEgZXN0ZSByZWN1cnNvIHJldXRpbGl6XHUwMGUxdmVsLg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlcmVuY2llIGEgb3JpZW50YVx1MDBlN1x1MDBlM28gcXVlIHBlcnRlbmNlIGEgZXN0ZSBtYXRlcmlhbCBkZSBzdXBvcnRlLg0KLXJlcG9ydF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlcmVuY2llIGEgb3JpZW50YVx1MDBlN1x1MDBlM28gcXVlIHBlcnRlbmNlIGEgZXN0ZSByZWxhdFx1MDBmM3Jpby4NCi1wcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlcmVuY2llIGEgb3JpZW50YVx1MDBlN1x1MDBlM28gcXVlIHBlcnRlbmNlIGEgZXN0YSBwclx1MDBlMXRpY2EuDQotdGVtcGxhdGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXJlbmNpZSBhIG9yaWVudGFcdTAwZTdcdTAwZTNvIHF1ZSBwZXJ0ZW5jZSBhIGVzdGUgbW9kZWxvLg0KLXRlcm1kZWZpbml0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VyZW5jaWUgYSBvcmllbnRhXHUwMGU3XHUwMGUzbyBxdWUgcGVydGVuY2UgYSBlc3NhIGRlZmluaVx1MDBlN1x1MDBlM28gZGUgdGVybW8uDQotdG9vbG1lbnRvcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUdlcmVuY2llIGEgb3JpZW50YVx1MDBlN1x1MDBlM28gcXVlIHBlcnRlbmNlIGEgZXNzZSBtZW50b3IgZGUgZmVycmFtZW50YS4NCi13aGl0ZXBhcGVyX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249R2VyZW5jaWUgYSBvcmllbnRhXHUwMGU3XHUwMGUzbyBxdWUgcGVydGVuY2UgYSBlc3RlIHdoaXRlcGFwZXIuDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1HZXJlbmNpZSBhIG9yaWVudGFcdTAwZTdcdTAwZTNvIHF1ZSBwZXJ0ZW5jZSBhIGVzdGEgY29uc2lkZXJhXHUwMGU3XHUwMGUzbyBkZSBlc3RpbWF0aXZhLg0KLQ0KLQ0KLSNOZXcgU3RyaW5nIFNlY3Rpb24gRGVzY3JpcHRpb24NCi1yb2xlX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0YSBmdW5cdTAwZTdcdTAwZTNvLg0KLXJvbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBnZXJhaXMgc29icmUgZXN0YSBmdW5cdTAwZTdcdTAwZTNvLg0KLXJvbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY29tbyBlc3RhIGZ1blx1MDBlN1x1MDBlM28gc2UgcmVsYWNpb25hIGEgb3V0cmEgZnVuXHUwMGU3XHUwMGUzby4NCi1yb2xlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0YSBmdW5cdTAwZTdcdTAwZTNvLg0KLQ0KLXRhc2tfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGV0YWxoYWRhcyBzb2JyZSBlc3RhIHRhcmVmYS4NCi10YXNrX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGEgdGFyZWZhLg0KLXRhc2tfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY29tbyBlc3RhIHRhcmVmYSBzZSByZWxhY2lvbmEgYSBvdXRyYSB0YXJlZmEuDQotdGFza192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIHZlcnNcdTAwZTNvIHNvYnJlIGVzdGEgdGFyZWZhLg0KLQ0KLWFydGlmYWN0X2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0ZSBhcnRlZmF0by4NCi1hcnRpZmFjdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RlIGFydGVmYXRvLg0KLWFydGlmYWN0X2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIG9zIFx1MDBlZGNvbmVzIGRlc3RlIGFydGVmYXRvLg0KLWFydGlmYWN0X25vdGF0aW9uU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgZW50cmVnYSBzb2JyZSBlc3RlIGFydGVmYXRvLg0KLWFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIGFqdXN0ZSBzb2JyZSBlc3RlIGFydGVmYXRvLg0KLWFydGlmYWN0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNvbW8gZXN0ZSBhcnRlZmF0byBzZSByZWxhY2lvbmEgYSBvdXRybyBhcnRlZmF0by4NCi1hcnRpZmFjdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIHZlcnNcdTAwZTNvIHNvYnJlIGVzdGUgYXJ0ZWZhdG8uDQotDQotb3V0Y29tZV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZXRhbGhhZGFzIHNvYnJlIGVzdGUgcmVzdWx0YWRvLg0KLW91dGNvbWVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBnZXJhaXMgc29icmUgZXN0ZSByZXN1bHRhZG8uDQotb3V0Y29tZV9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSBvcyBcdTAwZWRjb25lcyBkZXN0ZSByZXN1bHRhZG8uDQotb3V0Y29tZV9ub3RhdGlvblNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIGVudHJlZ2Egc29icmUgZXN0ZSByZXN1bHRhZG8uDQotb3V0Y29tZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZSBhanVzdGUgc29icmUgZXN0ZSByZXN1bHRhZG8uDQotb3V0Y29tZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjb21vIGVzdGUgcmVzdWx0YWRvIHNlIHJlbGFjaW9uYSBhIG91dHJvIHJlc3VsdGFkby4NCi1vdXRjb21lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0ZSByZXN1bHRhZG8uDQotDQotZGVsaXZlcmFibGVfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGV0YWxoYWRhcyBzb2JyZSBlc3RlIGRpc3RyaWJ1XHUwMGVkdmVsLg0KLWRlbGl2ZXJhYmxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGUgZGlzdHJpYnVcdTAwZWR2ZWwuDQotZGVsaXZlcmFibGVfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgb3MgXHUwMGVkY29uZXMgZGVzdGUgZGlzdHJpYnVcdTAwZWR2ZWwuDQotZGVsaXZlcmFibGVfbm90YXRpb25TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZSBlbnRyZWdhIHNvYnJlIGVzdGUgZGlzdHJpYnVcdTAwZWR2ZWwuDQotZGVsaXZlcmFibGVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgYWp1c3RlIHNvYnJlIGVzdGUgZGlzdHJpYnVcdTAwZWR2ZWwuDQotZGVsaXZlcmFibGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY29tbyBlc3RlIGRpc3RyaWJ1XHUwMGVkdmVsIHNlIHJlbGFjaW9uYSBhIG91dHJvIGRpc3RyaWJ1XHUwMGVkdmVsLg0KLWRlbGl2ZXJhYmxlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0ZSBkaXN0cmlidVx1MDBlZHZlbC4NCi0NCi1kaXNjaXBsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0YSBkaXNjaXBsaW5hLg0KLWRpc2NpcGxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBnZXJhaXMgc29icmUgZXN0YSBkaXNjaXBsaW5hLg0KLWRpc2NpcGxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY29tbyBlc3RhIGRpc2NpcGxpbmEgc2UgcmVsYWNpb25hIGEgb3V0cmEgZGlzY2lwbGluYS4NCi1kaXNjaXBsaW5lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0YSBkaXNjaXBsaW5hLg0KLQ0KLWRvbWFpbl9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZXRhbGhhZGFzIHNvYnJlIGVzdGUgZG9tXHUwMGVkbmlvLg0KLWRvbWFpbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RlIGRvbVx1MDBlZG5pby4NCi1kb21haW5fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY29tbyBlc3RlIGRvbVx1MDBlZG5pbyBzZSByZWxhY2lvbmEgYSBvdXRybyBkb21cdTAwZWRuaW8uDQotZG9tYWluX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0ZSBkb21cdTAwZWRuaW8uDQotDQotd29ya3Byb2R1Y3R0eXBlX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0ZSB0aXBvIGRlIHByb2R1dG8gZGUgdHJhYmFsaG8uDQotd29ya3Byb2R1Y3R0eXBlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGUgdGlwbyBkZSBwcm9kdXRvIGRlIHRyYWJhbGhvLg0KLXdvcmtwcm9kdWN0dHlwZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjb21vIGVzdGUgdGlwbyBkZSBwcm9kdXRvIGRlIHRyYWJhbGhvIHNlIHJlbGFjaW9uYSBhIG91dHJvIHRpcG8gZGUgcHJvZHV0byBkZSB0cmFiYWxoby4NCi13b3JrcHJvZHVjdHR5cGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZSB2ZXJzXHUwMGUzbyBzb2JyZSBlc3RlIHRpcG8gZGUgcHJvZHV0byBkZSB0cmFiYWxoby4NCi0NCi1yb2xlc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0ZSBjb25qdW50byBkZSBmdW5cdTAwZTdcdTAwZjVlcy4NCi1yb2xlc2V0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGUgY29uanVudG8gZGUgZnVuXHUwMGU3XHUwMGY1ZXMuDQotcm9sZXNldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjb21vIGVzdGUgY29uanVudG8gZGUgZnVuXHUwMGU3XHUwMGY1ZXMgc2UgcmVsYWNpb25hIGEgb3V0cm8gY29uanVudG8gZGUgZnVuXHUwMGU3XHUwMGY1ZXMuDQotcm9sZXNldF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIHZlcnNcdTAwZTNvIHNvYnJlIGVzdGUgY29uanVudG8gZGUgZnVuXHUwMGU3XHUwMGY1ZXMuDQotDQotdG9vbF9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZXRhbGhhZGFzIHNvYnJlIGVzdGEgZmVycmFtZW50YS4NCi10b29sX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGEgZmVycmFtZW50YS4NCi10b29sX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNvbW8gZXN0YSBmZXJyYW1lbnRhIHNlIHJlbGFjaW9uYSBhIG91dHJhIGZlcnJhbWVudGEuDQotdG9vbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIHZlcnNcdTAwZTNvIHNvYnJlIGVzdGEgZmVycmFtZW50YS4NCi0NCi1jb25jZXB0X2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0ZSBjb25jZWl0by4NCi1jb25jZXB0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGUgY29uY2VpdG8uDQotY29uY2VwdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjb21vIGVzdGUgY29uY2VpdG8gc2UgcmVsYWNpb25hIGEgb3V0cm8gY29uY2VpdG8uDQotY29uY2VwdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIHZlcnNcdTAwZTNvIHNvYnJlIGVzdGUgY29uY2VpdG8uDQotDQotY2hlY2tsaXN0X2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0YSBsaXN0YSBkZSB2ZXJpZmljYVx1MDBlN1x1MDBlM28uDQotY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGEgbGlzdGEgZGUgdmVyaWZpY2FcdTAwZTdcdTAwZTNvLg0KLWNoZWNrbGlzdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjb21vIGVzdGEgbGlzdGEgZGUgdmVyaWZpY2FcdTAwZTdcdTAwZTNvIHNlIHJlbGFjaW9uYSBhIG91dHJhIGxpc3RhIGRlIHZlcmlmaWNhXHUwMGU3XHUwMGUzby4NCi1jaGVja2xpc3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZSB2ZXJzXHUwMGUzbyBzb2JyZSBlc3RhIGxpc3RhIGRlIHZlcmlmaWNhXHUwMGU3XHUwMGUzby4NCi0NCi1leGFtcGxlX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0ZSBleGVtcGxvLg0KLWV4YW1wbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBnZXJhaXMgc29icmUgZXN0ZSBleGVtcGxvLg0KLWV4YW1wbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY29tbyBlc3RlIGV4ZW1wbG8gc2UgcmVsYWNpb25hIGEgb3V0cm8gZXhlbXBsby4NCi1leGFtcGxlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0ZSBleGVtcGxvLg0KLQ0KLWd1aWRlbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZXRhbGhhZGFzIHNvYnJlIGVzdGEgb3JpZW50YVx1MDBlN1x1MDBlM28uDQotZ3VpZGVsaW5lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGEgb3JpZW50YVx1MDBlN1x1MDBlM28uDQotZ3VpZGVsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNvbW8gZXN0YSBvcmllbnRhXHUwMGU3XHUwMGUzbyBzZSByZWxhY2lvbmEgYSBvdXRyYSBvcmllbnRhXHUwMGU3XHUwMGUzby4NCi1ndWlkZWxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZSB2ZXJzXHUwMGUzbyBzb2JyZSBlc3RhIG9yaWVudGFcdTAwZTdcdTAwZTNvLg0KLQ0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0YSBjb25zaWRlcmFcdTAwZTdcdTAwZTNvIGRlIGVzdGltYXRpdmEuDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBnZXJhaXMgc29icmUgZXN0YSBjb25zaWRlcmFcdTAwZTdcdTAwZTNvIGRlIGVzdGltYXRpdmEuDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmljYXIgY29tbyBlc3RhIGNvbnNpZGVyYVx1MDBlN1x1MDBlM28gZGUgZXN0aW1hdGl2YSBzZSByZWxhY2lvbmEgYSBvdXJhIGNvbnNpZGVyYVx1MDBlN1x1MDBlM28gZGUgZXN0aW1hdGl2YS4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIHZlcnNcdTAwZTNvIHNvYnJlIGVzdGEgY29uc2lkZXJhXHUwMGU3XHUwMGUzbyBkZSBlc3RpbWF0aXZhLg0KLQ0KLXByYWN0aWNlX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0YSBwclx1MDBlMXRpY2EuDQotcHJhY3RpY2VfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBnZXJhaXMgc29icmUgZXN0YSBwclx1MDBlMXRpY2EuDQotcHJhY3RpY2VfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY29tbyBlc3RhIHByXHUwMGUxdGljYSBzZSByZWxhY2lvbmEgYSBvdXRyYSBwclx1MDBlMXRpY2EuDQotcHJhY3RpY2VfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZSB2ZXJzXHUwMGUzbyBzb2JyZSBlc3RhIHByXHUwMGUxdGljYS4NCi0NCi1yZXBvcnRfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGV0YWxoYWRhcyBzb2JyZSBlc3RlIHJlbGF0XHUwMGYzcmlvLg0KLXJlcG9ydF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RlIHJlbGF0XHUwMGYzcmlvLg0KLXJlcG9ydF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjb21vIGVzdGUgcmVsYXRcdTAwZjNyaW8gc2UgcmVsYWNpb25hIGEgb3V0cm8gcmVsYXRcdTAwZjNyaW8uDQotcmVwb3J0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0ZSByZWxhdFx1MDBmM3Jpby4NCi0NCi1yZXN1YWJsZWFzc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0ZSByZWN1cnNvIHJldXRpbGl6XHUwMGUxdmVsLg0KLXJlc3VhYmxlYXNzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBnZXJhaXMgc29icmUgZXN0ZSByZWN1cnNvIHJldXRpbGl6XHUwMGUxdmVsLg0KLXJlc3VhYmxlYXNzZXRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmljYXIgY29tbyBlc3RlIHJlY3Vyc28gcmV1dGlsaXpcdTAwZTF2ZWwgc2UgcmVsYWNpb25hIGEgb3V0cm8gcmVjdXJzbyByZXV0aWxpelx1MDBlMXZlbC4NCi1yZXN1YWJsZWFzc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0ZSByZWN1cnNvIHJldXRpbGl6XHUwMGUxdmVsLg0KLQ0KLXJvYWRtYXBfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGV0YWxoYWRhcyBzb2JyZSBlc3RlIHJvdGVpcm8uDQotcm9hZG1hcF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RlIHJvdGVpcm8uDQotcm9hZG1hcF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjb21vIGVzdGUgcm90ZWlybyBzZSByZWxhY2lvbmEgYSBvdXRybyByb3RlaXJvLg0KLXJvYWRtYXBfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZSB2ZXJzXHUwMGUzbyBzb2JyZSBlc3RlIHJvdGVpcm8uDQotDQotc3VwcG9ydGluZ21hdGVyaWFsX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0ZSBtYXRlcmlhbCBkZSBzdXBvcnRlLg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RlIG1hdGVyaWFsIGRlIHN1cG9ydGUuDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpY2FyIGNvbW8gZXN0ZSBtYXRlcmlhbCBkZSBzdXBvcnRlIHNlIHJlbGFjaW9uYSBhIG91dHJvIG1hdGVyaWFsIGRlIHN1cG9ydGUuDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0ZSBtYXRlcmlhbCBkZSBzdXBvcnRlLg0KLQ0KLXRlbXBsYXRlX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0ZSBtb2RlbG8uDQotdGVtcGxhdGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBnZXJhaXMgc29icmUgZXN0ZSBtb2RlbG8uDQotdGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmlxdWUgY29tbyBlc3RlIG1vZGVsbyBzZSByZWxhY2lvbmEgYSBvdXRybyBtb2RlbG8uDQotdGVtcGxhdGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZSB2ZXJzXHUwMGUzbyBzb2JyZSBlc3RlIG1vZGVsby4NCi0NCi10ZXJtZGVmaW5pdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZXRhbGhhZGFzIHNvYnJlIGVzdGEgZGVmaW5pXHUwMGU3XHUwMGUzbyBkZSB0ZXJtby4NCi10ZXJtZGVmaW5pdGlvbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RhIGRlZmluaVx1MDBlN1x1MDBlM28gZGUgdGVybW8uDQotdGVybWRlZmluaXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9RXNwZWNpZmljYXIgY29tbyBlc3RhIGRlZmluaVx1MDBlN1x1MDBlM28gZGUgdGVybW8gc2UgcmVsYWNpb25hIGEgb3V0cmEgZGVmaW5pXHUwMGU3XHUwMGUzbyBkZSB0ZXJtby4NCi10ZXJtZGVmaW5pdGlvbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIHZlcnNcdTAwZTNvIHNvYnJlIGVzdGEgZGVmaW5pXHUwMGU3XHUwMGUzbyBkZSB0ZXJtby4NCi0NCi10b29sbWVudG9yX2RldGFpbFNlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0ZSBtZW50b3IgZGUgZmVycmFtZW50YS4NCi10b29sbWVudG9yX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGUgbWVudG9yIGRlIGZlcnJhbWVudGEuDQotdG9vbG1lbnRvcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjb21vIGVzdGUgbWVudG9yIGRlIGZlcnJhbWVudGEgc2UgcmVsYWNpb25hIGEgb3V0cm8gbWVudG9yIGRlIGZlcnJhbWVudGEuDQotdG9vbG1lbnRvcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIHZlcnNcdTAwZTNvIHNvYnJlIGVzdGUgbWVudG9yIGRlIGZlcnJhbWVudGEuDQotDQotd2hpdGVwYXBlcl9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZXRhbGhhZGFzIHNvYnJlIGVzdGUgd2hpdGVwYXBlci4NCi13aGl0ZXBhcGVyX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGUgd2hpdGVwYXBlci4NCi13aGl0ZXBhcGVyX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNvbW8gZXN0ZSB3aGl0ZXBhcGVyIHNlIHJlbGFjaW9uYSBhIG91dHJvIHdoaXRlcGFwZXIuDQotd2hpdGVwYXBlcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIHZlcnNcdTAwZTNvIHNvYnJlIGVzdGUgd2hpdGVwYXBlci4NCi0NCi1kaXNjaXBsaW5lZ3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGV0YWxoYWRhcyBzb2JyZSBlc3RlIGdydXBvIGRlIGRpc2NpcGxpbmFzLg0KLWRpc2NpcGxpbmVncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RlIGdydXBvIGRlIGRpc2NpcGxpbmFzLg0KLWRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjb21vIGVzdGUgZ3J1cG8gZGUgZGlzY2lwbGluYXMgc2UgcmVsYWNpb25hIGEgb3V0cm8gZ3J1cG8gZGUgZGlzY2lwbGluYXMuDQotZGlzY2lwbGluZWdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0ZSBncnVwbyBkZSBkaXNjaXBsaW5hcy4NCi0NCi1yb2xlc2V0Z3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGV0YWxoYWRhcyBzb2JyZSBlc3RlIGdydXBvIGRlIGNvbmp1bnRvIGRlIGZ1blx1MDBlN1x1MDBmNWVzLg0KLXJvbGVzZXRncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RlIGdydXBvIGRlIGNvbmp1bnRvIGRlIGZ1blx1MDBlN1x1MDBmNWVzLg0KLXJvbGVzZXRncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1Fc3BlY2lmaXF1ZSBjb21vIGVzdGUgZ3J1cG8gZGUgY29uanVudG8gZGUgZnVuXHUwMGU3XHUwMGY1ZXMgc2UgcmVsYWNpb25hIGEgb3V0cm8gZ3J1cG8gZGUgY29uanVudG8gZGUgZnVuXHUwMGU3XHUwMGY1ZXMuDQotcm9sZXNldGdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0ZSBncnVwbyBkZSBjb25qdW50byBkZSBmdW5cdTAwZTdcdTAwZjVlcy4NCi0NCi1jdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M9Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZXRhbGhhZGFzIHNvYnJlIGVzdGEgY2F0ZWdvcmlhIGN1c3RvbWl6YWRhLg0KLWN1c3RvbWNhdGVnb3J5X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGEgY2F0ZWdvcmlhIGN1c3RvbWl6YWRhLg0KLWN1c3RvbWNhdGVnb3J5X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUVzcGVjaWZpcXVlIGNvbW8gZXN0YSBjYXRlZ29yaWEgY3VzdG9taXphZGEgc2UgcmVsYWNpb25hIGEgb3V0cmEgY2F0ZWdvcmlhIGN1c3RvbWl6YWRhLg0KLWN1c3RvbWNhdGVnb3J5X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGUgdmVyc1x1MDBlM28gc29icmUgZXN0YSBjYXRlZ29yaWEgY3VzdG9taXphZGEuDQotY3VzdG9tY2F0ZWdvcnlfSWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgb3MgXHUwMGVkY29uZXMgZGVzdGEgY2F0ZWdvcmlhIGN1c3RvbWl6YWRhLg0KLQ0KLWNvbmNlcHRfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgb3MgXHUwMGVkY29uZXMgZGVzdGUgY29uY2VpdG8uDQotY2hlY2tsaXN0X2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIG9zIFx1MDBlZGNvbmVzIGRlc3RhIGxpc3RhIGRlIHZlcmlmaWNhXHUwMGU3XHUwMGUzby4NCi10b29sbWVudG9yX2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIG9zIFx1MDBlZGNvbmVzIGRlc3RlIG1lbnRvciBkZSBmZXJyYW1lbnRhLg0KLXdoaXRlcGFwZXJfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgb3MgXHUwMGVkY29uZXMgZGVzdGUgd2hpdGVwYXBlci4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSBvcyBcdTAwZWRjb25lcyBkZXN0YSBjb25zaWRlcmFcdTAwZTdcdTAwZTNvIGRlIGVzdGltYXRpdmEuDQotdGVybWRlZmluaXRpb25faWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgb3MgXHUwMGVkY29uZXMgZGVzdGEgZGVmaW5pXHUwMGU3XHUwMGUzbyBkZSB0ZXJtby4NCi10ZW1wbGF0ZV9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSBvcyBcdTAwZWRjb25lcyBkZXN0ZSBtb2RlbG8uDQotcmV1c2FibGVhc3NldF9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSBvcyBcdTAwZWRjb25lcyBkZXN0ZSByZWN1cnNvIHJldXRpbGl6XHUwMGUxdmVsLg0KLXJlcG9ydF9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSBvcyBcdTAwZWRjb25lcyBkZXN0ZSByZWxhdFx1MDBmM3Jpby4NCi1wcmFjdGljZV9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSBvcyBcdTAwZWRjb25lcyBkZXN0YSBwclx1MDBlMXRpY2EuDQotZXhhbXBsZV9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSBvcyBcdTAwZWRjb25lcyBkZXN0ZSBleGVtcGxvLg0KLWd1aWRlbGluZV9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSBvcyBcdTAwZWRjb25lcyBkZXN0YSBkaXJldHJpei4NCi1yb2FkbWFwX2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIG9zIFx1MDBlZGNvbmVzIGRlc3RlIHJvdGVpcm8uDQotc3VwcG9ydGluZ21hdGVyaWFsX2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIG9zIFx1MDBlZGNvbmVzIGRlc3RlIG1hdGVyaWFsIGRlIHN1cG9ydGUuDQotDQotZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfdGl0bGU9QXJxdWl2byBBbHRlcmFkbw0KLWVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX21lc3NhZ2U9TyBhcnF1aXZvIGZvaSBhbHRlcmFkbyBubyBzaXN0ZW1hIGRlIGFycXVpdm8uIERlc2VqYSBjYXJyZWdhciBhcyBhbHRlcmFcdTAwZTdcdTAwZjVlcz8NCi0NCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZT1WYXJpYWJpbGlkYWRlIGRlIEF0aXZpZGFkZQ0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZz1BIGF0aXZpZGFkZSAnJ3swfScnIG5cdTAwZTNvIHBvZGUgZGVmaW5pciBhIHZhcmlhYmlsaWRhZGUgY29tICcnezF9JycgcG9ycXVlICcnezF9Jycgalx1MDBlMSB0ZW0gdW1hIG91IG1haXMgYXRpdmlkYWRlcyBjb250cmlidVx1MDBlZGRhcy9zdWJzdGl0dVx1MDBlZGRhcyBjb21vIHN1YXMgZmlsaGFzLg0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzE9QSBhdGl2aWRhZGUgJyd7MH0nJyBuXHUwMGUzbyBwb2RlIGRlZmluaXIgYSB2YXJpYWJpbGlkYWRlIGNvbSB1bSBkZSBzZXVzIHBhaXMgZGlyZXRvcyBlIHF1YWxxdWVyIHByb2Nlc3NvLg0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzI9QSBhdGl2aWRhZGUgJyd7MH0nJyBuXHUwMGUzbyBwb2RlIGRlZmluaXIgYSB2YXJpYWJpbGlkYWRlIGNvbSAnJ3sxfScnIHBvcnF1ZSByZXN1bHRhclx1MDBlMSBlbSBkZXBlbmRcdTAwZWFuY2lhIGNpcmN1bGFyLg0KLQ0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfdGl0bGU9QXBsaWNhciBQYWRyXHUwMGUzbw0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnPUEgYXRpdmlkYWRlICcnezB9Jycgblx1MDBlM28gcG9kZSBhcGxpY2FyIHBhZHJcdTAwZjVlcyBjb20gJyd7MX0nJyBqXHUwMGUxIHF1ZSByZXN1bHRhIGVtIGRlcGVuZFx1MDBlYW5jaWEgY2lyY3VsYXIuDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfZGVsaW1pdGVyPXwNCi1NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3Nob3dPd25lckluTGlicmFyeVZpZXc9TW9zdHJhciBwcm9wcmlldFx1MDBlMXJpbyBkZXN0YSByZWZlclx1MDBlYW5jaWEgblx1MDBlM28gcmVzb2x2aWRhIG5hIHZpc3VhbGl6YVx1MDBlN1x1MDBlM28gQmlibGlvdGVjYQ0KLU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlVW5yZXNvbHZlZFJlZmVyZW5jZT1SZW1vdmVyIGVzdGEgcmVmZXJcdTAwZWFuY2lhIG5cdTAwZTNvIHJlc29sdmlkYQ0KLXByb21wdERlbGV0ZUN1c3RvbUNhdGVnb3J5QmVmb3JlUmVtb3ZlTGFzdFJlZlRvSXQ9Vm9jXHUwMGVhIGVzdFx1MDBlMSBwcmVzdGVzIGEgcmVtb3ZlciBhIFx1MDBmYWx0aW1hIHJlZmVyXHUwMGVhbmNpYSBhIHswfSBubyBwbHVnLWluLiBPKHMpIGVsZW1lbnRvKHMpIHNlclx1MDBlMShcdTAwZTNvKSBleGNsdVx1MDBlZGRvKHMpLiBEZXNlamEgY29udGludWFyPw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jQmVsb3cgcHJvcGVydHkgImVkaXRvcl90aXRsZV9jb2xvbl93aXRoX3NwYWNlcyIgc2hvdWxkIG5vdCBiZSB0cmFuc2xhdGVkDQotI0Rvbid0IGRlbGV0ZSBhIHNwYWNlIGFmdGVyICI6ICINCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLWVkaXRvcl90aXRsZV9jb2xvbl93aXRoX3NwYWNlcz06IA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhY2FhOTM5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEzICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGb3JtIFBhZ2UgVGl0bGVzDQotYXNzaWduUGFnZV90aXRsZT1cdTUyMDZcdTkxNGQNCi1jYXRlZ29yaWVzUGFnZV90aXRsZT1cdTdjN2JcdTUyMmINCi1kZWxpdmVyYWJsZVBhcnRzUGFnZV90aXRsZT1cdTUzZWZcdTRlYTRcdTRlZDhcdTkwZThcdTRlZjYNCi1kZXNjcmlwdGlvblBhZ2VfdGl0bGU9XHU2M2NmXHU4ZmYwDQotZGlzY2lwbGluZXNQYWdlX3RpdGxlPVx1ODljNFx1N2EwYg0KLWRpc2NhcmR1bnJlc29sdmVkcmVmPVx1NWU5Zlx1NWYwM1x1NjcyYVx1ODllM1x1Njc5MFx1NzY4NFx1NWYxNVx1NzUyOA0KLWd1aWRhbmNlUGFnZV90aXRsZT1cdTYzMDdcdTViZmNcdTRmZTFcdTYwNmYNCi1wcmV2aWV3UGFnZV90aXRsZT1cdTk4ODRcdTg5YzgNCi1yZWZlcmVuY2VzUGFnZV90aXRsZT1cdTVmMTVcdTc1MjgNCi1yZWZlcmVuY2VfdGV4dD1cdTVmMTVcdTc1MjhcdWZmMWENCi1yZWZlcmVuY2VXb3JrZmxvd1BhZ2VfdGl0bGU9XHU1ZjE1XHU3NTI4XHU1ZGU1XHU0ZjVjXHU2ZDQxDQotcm9sZXNQYWdlX3RpdGxlPVx1ODlkMlx1ODI3Mg0KLXJvbGVTZXRzUGFnZV90aXRsZT1cdTg5ZDJcdTgyNzJcdTk2YzYNCi1zdGVwc1BhZ2VfdGl0bGU9XHU2YjY1XHU5YWE0DQotdGFza3NQYWdlX3RpdGxlPVx1NGVmYlx1NTJhMQ0KLXRvb2xNZW50b3JzUGFnZV90aXRsZT1cdTVkZTVcdTUxNzdcdTU0MTFcdTViZmMNCi13b3JrUHJvZHVjdHNQYWdlX3RpdGxlPVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMQ0KLQ0KLSMgU2VjdGlvbiBOYW1lcyAmIERlc2NyaXB0aW9uDQotY2hlY2tJdGVtc1NlY3Rpb25fbmFtZT1cdTY4YzBcdTY3ZTVcdTk4NzkNCi1jaGVja0l0ZW1zU2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1Njc4NFx1NjIxMFx1NmI2NFx1NjgzOFx1NWJmOVx1ODg2OFx1NzY4NFx1NjhjMFx1NjdlNVx1OTg3OVx1MzAwMg0KLWRlcGVuZGVuY2llc1NlY3Rpb25fbmFtZT1cdTRmOWRcdThkNTZcdTUxNzNcdTdjZmINCi1kZXBlbmRlbmNpZXNTZWN0aW9uX2Rlc2M9XHU2NzJjXHU5MGU4XHU1MjA2XHU2NjNlXHU3OTNhXHU2YjY0XHU1MTg1XHU1YmI5XHU1MzA1XHU0ZTBlXHU1MTc2XHU0ZWQ2XHU1MTg1XHU1YmI5XHU1MzA1XHU3Njg0XHU0ZjlkXHU4ZDU2XHU1MTczXHU3Y2ZiXHUzMDAyDQotZGV0YWlsU2VjdGlvbl9uYW1lPVx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zg0KLWRldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTY3MDlcdTUxNzNcdTZiNjR7MH1cdTc2ODRcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTMwMDINCi1nZW5lcmFsSW5mb1NlY3Rpb25fbmFtZT1cdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmYNCi1nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTY3MDlcdTUxNzNcdTZiNjR7MH1cdTc2ODRcdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmZcdTMwMDINCi1pY29uU2VjdGlvbl9uYW1lPVx1NTZmZVx1NjgwNw0KLWljb25TZWN0aW9uX2Rlc2M9XHU0ZTNhXHU2YjY0ezB9XHU1YjlhXHU1MjM2XHU1NmZlXHU2ODA3XHUzMDAyDQotbm90YXRpb25TZWN0aW9uX25hbWU9XHU0ZWE0XHU0ZWQ4XHU0ZmUxXHU2MDZmDQotbm90YXRpb25TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2NzA5XHU1MTczXHU2YjY0ezB9XHU3Njg0XHU0ZWE0XHU0ZWQ4XHU0ZmUxXHU2MDZmXHUzMDAyDQotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX25hbWU9XHU1ZjE1XHU3NTI4XHU2M2QyXHU0ZWY2XHVmZjFhDQotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX2Rlc2M9XHU2NzJjXHU5MGU4XHU1MjA2XHU2NjNlXHU3OTNhXHU2YjY0XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHU1ZjE1XHU3NTI4XHU3Njg0XHU2M2QyXHU0ZWY2XHUzMDAyDQotc3RhZmZpbmdTZWN0aW9uX25hbWU9XHU0ZWJhXHU1NDU4XHU5MTRkXHU1OTA3XHU0ZmUxXHU2MDZmDQotc3RhZmZpbmdTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2NzA5XHU1MTczXHU2YjY0XHU4OWQyXHU4MjcyXHU3Njg0XHU0ZWJhXHU1NDU4XHU5MTRkXHU1OTA3XHU0ZmUxXHU2MDZmXHUzMDAyDQotc3RlcHNTZWN0aW9uX25hbWU9XHU2YjY1XHU5YWE0DQotc3RlcHNTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2MjY3XHU4ODRjXHU2YjY0XHU0ZWZiXHU1MmExXHU3Njg0XHU2YjY1XHU5YWE0XHUzMDAyDQotdGFpbG9yaW5nU2VjdGlvbl9uYW1lPVx1NWI5YVx1NTIzNg0KLXRhaWxvcmluZ1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTY3MDlcdTUxNzNcdTZiNjR7MH1cdTc2ODRcdTViOWFcdTUyMzZcdTRmZTFcdTYwNmZcdTMwMDINCi12YXJpYWJpbGl0eVNlY3Rpb25fbmFtZT1cdTUxODVcdTViYjlcdTUzZWZcdTUzZDhcdTYwMjcNCi12YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjR7MH1cdTU5ODJcdTRmNTVcdTRlMGVcdTUzZTZcdTRlMDBcdTRlMmF7MH1cdTc2ZjhcdTUxNzNcdTMwMDINCi12ZXJzaW9uSW5mb1NlY3Rpb25fbmFtZT1cdTcyNDhcdTY3MmNcdTRmZTFcdTYwNmYNCi12ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTY3MDlcdTUxNzNcdTZiNjR7MH1cdTc2ODRcdTcyNDhcdTY3MmNcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi0jIFVJICYgRWxlbWVudCBBdHRyaWJ1dGUgTGFiZWxzDQotYWRkaXRpb25hbEluZm9fdGV4dD1cdTUxNzZcdTRlZDZcdTRmZTFcdTYwNmZcdWZmMWENCi1hcHBsaWNhdGlvbl90ZXh0PVx1NWU5NFx1NzUyOFx1N2EwYlx1NWU4Zlx1ZmYxYQ0KLWFjdGlvbkxhYmVsX2VkaXQ9XHU3ZjE2XHU4ZjkxDQotYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdj1cdTU3MjhcdTVlOTNcdTg5YzZcdTU2ZmVcdTRlMmRcdTY2M2VcdTc5M2ENCi1hbHRlcm5hdGl2ZXNfdGV4dD1cdTY2ZmZcdTRlZTNcdTY1YjlcdTY4NDhcdWZmMWENCi1hc3NpZ25tZW50QXBwcm9hY2hlc190ZXh0PVx1NTIwNlx1OTE0ZFx1NjViOVx1NmNkNVx1ZmYxYQ0KLWF1dGhvcnNfdGV4dD1cdTRmNWNcdTgwMDVcdWZmMWENCi1iYWNrZ3JvdW5kX3RleHQ9XHU4MGNjXHU2NjZmXHVmZjFhDQotYmFzZUVsZW1lbnRfdGV4dD1cdTU3ZmFcdTY3MmNcdWZmMWENCi1iYXNlR3VpZGFuY2VfdGV4dD1cdTU3ZmFcdTY3MmNcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdWZmMWENCi1icmllZkRlc2NyaXB0aW9uX3RleHQ9XHU3YjgwXHU4OTgxXHU2M2NmXHU4ZmYwXHVmZjFhDQotZGVzY3JpcHRpb25fdGV4dD1cdTYzY2ZcdThmZjBcdWZmMWENCi1iYWNrdXBiZWZvcmVzYXZlX3RleHQ9XHU0ZmRkXHU1YjU4XHU1MjRkXHU1OTA3XHU0ZWZkDQotYnJpZWZPdXRsaW5lX3RleHQ9XHU3YjgwXHU3N2VkXHU2OTgyXHU2MmVjXHVmZjFhDQotY2hhbmdlRGF0ZV90ZXh0PVx1NjZmNFx1NjUzOVx1NjVlNVx1NjcxZlx1ZmYxYQ0KLWNoYW5nZURlc2NyaXB0aW9uX3RleHQ9XHU2NmY0XHU2NTM5XHU2M2NmXHU4ZmYwXHVmZjFhDQotY2hlY2tJdGVtc190ZXh0PVx1NjhjMFx1NjdlNVx1OTg3OQ0KLWNvbnRyaWJ1dGVzX3RleHQ9XHU2M2QwXHU0ZjliDQotbG9jYWxDb250cmlidXRlc190ZXh0PVx1NjcyY1x1NTczMFx1NjNkMFx1NGY5Yg0KLWNvbnRyaWJ1dGVzX3RvX3RleHQ9XHU2M2QwXHU0ZjliXHU1MjMwDQotY29weXJpZ2h0X3RleHQ9XHU3MjQ4XHU2NzQzXHVmZjFhDQotZWRpdG9yX3RleHQ9XHU3ZjE2XHU4ZjkxXHU1NjY4DQotZXh0ZW5kc190ZXh0PVx1NjI2OVx1NWM1NQ0KLWV4dGVuZF90ZXh0PVx1NjI2OVx1NWM1NQ0KLWV4dGVybmFsRGVzY3JpcHRpb25fdGV4dD1cdTU5MTZcdTkwZThcdTYzY2ZcdThmZjBcdWZmMWENCi1leHRlcm5hbElkX3RleHQ9XHU1OTE2XHU5MGU4XHU2ODA3XHU4YmM2XHVmZjFhDQotZ29hbHNfdGV4dD1cdTc2ZWVcdTY4MDdcdWZmMWENCi1pbXBhY3RPZk5vdEhhdmluZ190ZXh0PVx1NGUwZFx1NTE3N1x1NjcwOVx1NzY4NFx1NWY3MVx1NTRjZFx1ZmYxYQ0KLWtleUNvbnNpZGVyYXRpb25zX3RleHQ9XHU1MTczXHU5NTJlXHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5XHVmZjFhDQotbGV2ZWxzT2ZBZG9wdGlvbl90ZXh0PVx1OTFjN1x1NzUyOFx1N2VhN1x1NTIyYlx1ZmYxYQ0KLW1haW5EZXNjcmlwdGlvbl90ZXh0PVx1NGUzYlx1ODk4MVx1NjNjZlx1OGZmMFx1ZmYxYQ0KLW5ld0VsZW1lbnRfdGV4dD1cdTY1YjBcdTVlZmEgezB9DQotbmFtZV90ZXh0PVx1NTQwZFx1NzlmMFx1ZmYxYQ0KLW5vdEFwcGxpY2FibGVfdGV4dD1cdTRlMGRcdTkwMDJcdTc1MjgNCi1wYWNrYWdpbmdHdWlkYW5jZV90ZXh0PVx1NjI1M1x1NTMwNVx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1ZmYxYQ0KLXByZXNlbnRhdGlvbk5hbWVfdGV4dD1cdTY2M2VcdTc5M2FcdTU0MGRcdTc5ZjBcdWZmMWENCi1wcm9tcHRmb3JsaWJhcnlfdGV4dD1cdTU0MmZcdTUyYThcdTY1ZjZcdTYzZDBcdTc5M2FcdTkwMDlcdTYyZTlcdTY1YjlcdTZjZDVcdTVlOTMNCi1lbmFibGVIZWFsdGhDaGVja190ZXh0PVx1NTQyZlx1NzUyOFx1NTE4NVx1OTBlOFx1OGMwM1x1OGJkNVx1NWRlNVx1NTE3Nw0KLXByb2JsZW1fdGV4dD1cdTk1ZWVcdTk4OThcdWZmMWENCi1wdXJwb3NlX3RleHQ9XHU3NTI4XHU5MDE0XHVmZjFhDQotcmVhc29uRm9yTm90TmVlZGluZ190ZXh0PVx1NGUwZFx1OTcwMFx1ODk4MVx1NzY4NFx1NTM5Zlx1NTZlMFx1ZmYxYQ0KLXJlcGxhY2VzX3RleHQ9XHU2NmZmXHU2MzYyDQotbG9jYWxSZXBsYWNlc190ZXh0PVx1NjcyY1x1NTczMFx1NjZmZlx1NjM2Mg0KLXJlcHJlc2VudGF0aW9uT3B0aW9uc190ZXh0PVx1OGJmNFx1NjYwZVx1OTAwOVx1OTg3OVx1ZmYxYQ0KLXRlbXBsYXRlRmlsZV90ZXh0PVx1NmEyMVx1Njc3Zlx1NjU4N1x1NGVmNlx1ZmYxYQ0KLXNraWxsc190ZXh0PVx1NjI4MFx1ODBmZFx1ZmYxYQ0KLXN0ZXBzX3RleHQ9XHU2YjY1XHU5YWE0XHVmZjFhDQotc3RlcHNfbmFtZV90ZXh0PVx1NTQwZFx1NzlmMFx1ZmYxYQ0KLXN0b3BfdGV4dD1cdTUwNWNcdTZiNjINCi1wcmludF90ZXh0PVx1NjI1M1x1NTM3MA0KLXN5bm9ueW1zX3RleHQ9XHU1NDBjXHU0ZTQ5XHU4YmNkXHVmZjFhDQotdHlwZV90ZXh0PVx1N2M3Ylx1NTc4Ylx1ZmYxYQ0KLWNvcHlfdGV4dD1cdTU5MGRcdTUyMzYNCi1kZWVwQ29weV90ZXh0PVx1NmRmMVx1NWM0Mlx1NTkwZFx1NTIzNg0KLWJhY2tfdGV4dD1cdTU0MGVcdTkwMDANCi1uZXdfcGx1Z2luPVx1NjViMFx1NWVmYVx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNg0KLW1vdmU9XHU3OWZiXHU1MmE4Li4uDQotdW5pcXVlSWRfdGV4dD1cdTU1MmZcdTRlMDBcdTY4MDdcdThiYzZcdWZmMWENCi12YXJpYWJpbGl0eVR5cGVfdGV4dD1cdTUzZWZcdTUzZDhcdTYwMjdcdTdjN2JcdTU3OGJcdWZmMWENCi12ZXJzaW9uX3RleHQ9XHU3MjQ4XHU2NzJjXHVmZjFhDQotDQotIyBCdXR0b24gTGFiZWxzDQotYWRkQnV0dG9uX3RleHQ9XHU2ZGZiXHU1MmEwLi4uDQotYXR0YWNoQnV0dG9uX3RleHQ9XHU5NjQ0XHU1MmEwLi4uDQotYnJvd3NlQnV0dG9uX3RleHQ9XHU2ZDRmXHU4OWM4Li4uDQotY2hhbmdlVHlwZUJ1dHRvbl90ZXh0PVx1NjZmNFx1NjUzOVx1N2M3Ylx1NTc4Yi4uLg0KLWNsZWFyQnV0dG9uX3RleHQ9XHU2ZTA1XHU5NjY0DQotZGVsZXRlQnV0dG9uX3RleHQ9XHU1MjIwXHU5NjY0DQotZGV0YWNoQnV0dG9uX3RleHQ9XHU2MmM2XHU3OWJiDQotZGlhZ3JhbV9zYXZlRXJyb3I9XHU0ZmRkXHU1YjU4XHU1NmZlXHU2NWY2XHU1MWZhXHU5NTE5DQotZG93bkJ1dHRvbl90ZXh0PVx1NTQxMVx1NGUwYg0KLWRpcmVjdG9yeV90ZXh0PVx1NzZlZVx1NWY1NVx1ZmYxYQ0KLW9yZGVyQnV0dG9uX3RleHQ9XHU2MzkyXHU1ZThmDQotZWRpdEJ1dHRvbl90ZXh0PVx1N2YxNlx1OGY5MS4uLg0KLXJlbW92ZUJ1dHRvbl90ZXh0PVx1OTY2NFx1NTNiYg0KLXJlbmFtZUFjdGlvbl90ZXh0PVx1OTFjZFx1NTQ3ZFx1NTQwZC4uLg0KLXJlbW92ZV90ZXh0PVx1OTY2NFx1NTNiYg0KLXJlbmFtZV90ZXh0PVx1OTFjZFx1NTQ3ZFx1NTQwZA0KLVNhdmVBc190ZXh0PVx1NTNlNlx1NWI1OFx1NGUzYQ0KLXNlbGVjdEJ1dHRvbl90ZXh0PVx1OTAwOVx1NjJlOS4uLg0KLWRlc2VsZWN0QnV0dG9uX3RleHQ9XHU1M2Q2XHU2ZDg4XHU5MDA5XHU2MmU5DQotdXBCdXR0b25fdGV4dD1cdTU0MTFcdTRlMGENCi1tYWtlRGVmYXVsdEJ1dHRvbl90ZXh0PVx1OGJiZVx1NGUzYVx1N2YzYVx1NzcwMVx1NTAzYw0KLXZpZXdIaXN0b3J5QnV0dG9uX3RleHQ9XHU2N2U1XHU3NzBiXHU1Mzg2XHU1M2YyXHU4YmIwXHU1ZjU1Li4uDQotDQotIyBSb2xlIEVkaXRvciBUYXNrcyBQYWdlDQotcm9sZVRhc2tzUGFnZV9zZWN0aW9uTmFtZT1cdTRlZmJcdTUyYTENCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTZiNjRcdTg5ZDJcdTgyNzJcdTY2MmZcdTRlZTVcdTRlMGJcdTRlZmJcdTUyYTFcdTc2ODRcdTYyNjdcdTg4NGNcdTgwMDVcdTMwMDINCi1yb2xlVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NGVmYlx1NTJhMQ0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTRlM2JcdTg5ODFcdTYyNjdcdTg4NGNcdTgwMDVcdWZmMWENCi1yb2xlVGFza3NQYWdlX3NlbGVjdGVkTGFiZWwyPVx1NTE3Nlx1NGVkNlx1NjI2N1x1ODg0Y1x1ODAwNVx1ZmYxYQ0KLXJvbGVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwMDlcdTYyZTkgezB9IFx1NGUyYVx1NGVmYlx1NTJhMVx1MzAwMg0KLQ0KLSMgUm9sZSBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHVmZjFhDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1NjMwN1x1NWI5YVx1NmI2NFx1ODlkMlx1ODI3Mlx1OGQxZlx1OGQyM1x1NzY4NFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1MzAwMg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1ZmYxYQ0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9XHU4ZDFmXHU4ZDIzXHVmZjFhDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHU2YjY0XHU4OWQyXHU4MjcyXHU2MjY3XHU4ODRjXHU3Njg0XHU0ZWZiXHU1MmExXHU2MjQwXHU4ZjkzXHU1MWZhXHU3Njg0XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHVmZjFhDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwMDlcdTYyZTkgezB9IFx1NGUyYVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1MzAwMg0KLQ0KLSMgUm9sZSBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU9XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmDQotcm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU0ZWU1XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHU3Njg0XHU1ZjYyXHU1ZjBmXHU2M2QwXHU0ZjliXHU1MjMwXHU1MTc2XHU0ZWQ2XHU0ZmUxXHU2MDZmXHU3Njg0XHU5NGZlXHU2M2E1XHUzMDAyDQotcm9sZUd1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1cdTUzZWZcdTc1MjhcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdWZmMWENCi1yb2xlR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHVmZjFhDQotcm9sZUd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTAwOVx1NjJlOSB7MH0gXHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotIyBSb2xlIEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9XHU3YzdiXHU1MjJiXHVmZjFhDQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTZiNjRcdTg5ZDJcdTgyNzJcdTYyNDBcdTVjNWVcdTc2ODRcdTdjN2JcdTUyMmJcdTMwMDINCi1yb2xlQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU4OWQyXHU4MjcyXHU5NmM2XHVmZjFhDQotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1cdTViOWFcdTUyMzZcdTdjN2JcdTUyMmJcdWZmMWENCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTg5ZDJcdTgyNzJcdTk2YzZcdWZmMWENCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHU1YjlhXHU1MjM2XHU3YzdiXHU1MjJiXHVmZjFhDQotDQotIyBUYXNrIEVkaXRvciBSb2xlcyBQYWdlDQotdGFza1JvbGVzUGFnZV9zZWN0aW9uTmFtZT1cdTg5ZDJcdTgyNzINCi10YXNrUm9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTYzMDdcdTViOWFcdTYyNjdcdTg4NGNcdTZiNjRcdTRlZmJcdTUyYTFcdTc2ODRcdTg5ZDJcdTgyNzJcdTMwMDINCi10YXNrUm9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1ODlkMlx1ODI3Mlx1ZmYxYQ0KLXRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTRlM2JcdTg5ODFcdTYyNjdcdTg4NGNcdTgwMDVcdWZmMWENCi10YXNrUm9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1NTE3Nlx1NGVkNlx1NjI2N1x1ODg0Y1x1ODAwNVx1ZmYxYQ0KLXRhc2tSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwMDlcdTYyZTkgezB9IFx1NGUyYVx1ODlkMlx1ODI3Mlx1MzAwMg0KLXRhc2tSb2xlc1BhZ2VfcHJpbWFyeVBlcmZvcm1lcl9tb2RpZnlfbWVzc2FnZT1JVVBBMDAwNDVXOiBcdTg5ODFcdTVjMDZcdTRlM2JcdTg5ODFcdTYyNjdcdTg4NGNcdTgwMDVcdTY2ZjRcdTY1MzlcdTRlM2FcdTIwMWN7MH1cdTIwMWRcdTU0MTdcdWZmMWYNCi10YXNrUm9sZXNQYWdlX2NvbmZpcm1fdGl0bGU9XHU3ODZlXHU4YmE0XHU0ZTNiXHU4OTgxXHU4OWQyXHU4MjcyXHU2NmY0XHU2NTM5DQotDQotIyBUYXNrIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzENCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU2MzA3XHU1YjlhXHU2YjY0XHU0ZWZiXHU1MmExXHU3Njg0XHU4ZjkzXHU1MTY1XHU1NDhjXHU4ZjkzXHU1MWZhXHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHUzMDAyDQotdGFza1dvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTVmYzVcdTk3MDBcdThmOTNcdTUxNjVcdWZmMWENCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMj1cdTUzZWZcdTkwMDlcdThmOTNcdTUxNjVcdWZmMWENCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMz1cdThmOTNcdTUxZmFcdWZmMWENCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTAwOVx1NjJlOSB7MH0gXHU0ZTJhXHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHUzMDAyDQotDQotIyBUYXNrIEVkaXRvciBHdWlkYW5jZSBQYWdlDQotdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1cdTYzMDdcdTViZmNcdTRmZTFcdTYwNmYNCi10YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTRlZTVcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTc2ODRcdTVmNjJcdTVmMGZcdTYzZDBcdTRmOWJcdTUyMzBcdTUxNzZcdTRlZDZcdTRmZTFcdTYwNmZcdTc2ODRcdTk0ZmVcdTYzYTVcdTMwMDINCi10YXNrR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1ZmYxYQ0KLXRhc2tHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdWZmMWENCi10YXNrR3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDA5XHU2MmU5IHswfSBcdTRlMmFcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi0jIFRhc2sgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQ0KLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1cdTdjN2JcdTUyMmINCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NmI2NFx1NGVmYlx1NTJhMVx1NjI0MFx1NWM1ZVx1NzY4NFx1N2M3Ylx1NTIyYlx1MzAwMg0KLXRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTg5YzRcdTdhMGINCi10YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyPVx1NWI5YVx1NTIzNlx1N2M3Ylx1NTIyYg0KLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPVx1ODljNFx1N2EwYlx1ZmYxYQ0KLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1cdTViOWFcdTUyMzZcdTdjN2JcdTUyMmJcdWZmMWENCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgVGFza3MgUGFnZQ0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25OYW1lPVx1NGVmYlx1NTJhMQ0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTZiNjRcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTY2MmZcdTRlZTVcdTRlMGJcdTRlZmJcdTUyYTFcdTc2ODRcdThmOTNcdTUxNjVcdTYyMTZcdThmOTNcdTUxZmFcdTMwMDINCi1Xb3JrUHJvZHVjdF9UYXNrc19BdmFpbGFibGVMYWJlbD1cdTUzZWZcdTc1MjhcdTRlZmJcdTUyYTENCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsPVx1NWZjNVx1OTcwMFx1OGY5M1x1NTE2NVx1ZmYxYQ0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwyPVx1NTNlZlx1OTAwOVx1OGY5M1x1NTE2NVx1ZmYxYQ0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwzPVx1OGY5M1x1NTFmYVx1ZmYxYQ0KLVdvcmtQcm9kdWN0X1Rhc2tzX011bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDA5XHU2MmU5IHswfSBcdTRlMmFcdTRlZmJcdTUyYTFcdTMwMDINCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgUm9sZXMgUGFnZQ0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25OYW1lPVx1ODlkMlx1ODI3Mg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTRlZTVcdTRlMGJcdTg5ZDJcdTgyNzJcdThkMWZcdThkMjNcdTZiNjRcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTYyMTZcdTRmZWVcdTY1MzlcdTZiNjRcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTMwMDINCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTUzZWZcdTc1MjhcdTg5ZDJcdTgyNzINCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVx1OGQxZlx1OGQyM1x1ODlkMlx1ODI3Mlx1ZmYxYQ0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1NGZlZVx1NjUzOVx1ODlkMlx1ODI3Mlx1ZmYxYQ0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDA5XHU2MmU5IHswfSBcdTRlMmFcdTg5ZDJcdTgyNzJcdTMwMDINCi0NCi0jIyBXb3JrIFByb2R1Y3QgRWRpdG9yIERlbGl2ZXJhYmxlIFBhcnRzIFBhZ2UNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25OYW1lPVx1NTNlZlx1NGVhNFx1NGVkOFx1OTBlOFx1NGVmNg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1NjMwN1x1NWI5YVx1Njc4NFx1NjIxMFx1NmI2NFx1NTNlZlx1NGVhNFx1NGVkOFx1NGVmNlx1NzY4NFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1MzAwMg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU0ZjVjXHU0ZTNhXHU1M2VmXHU0ZWE0XHU0ZWQ4XHU5MGU4XHU0ZWY2XHU3Njg0XHU1M2VmXHU3NTI4XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHVmZjFhDQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWxlY3RlZExhYmVsPVx1NGY1Y1x1NGUzYVx1NTNlZlx1NGVhNFx1NGVkOFx1OTBlOFx1NGVmNlx1NzY4NFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1ZmYxYQ0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwMDlcdTYyZTkgezB9IFx1NGUyYVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1MzAwMg0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBHdWlkYW5jZSBQYWdlDQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU9XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmDQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1NGVlNVx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1NzY4NFx1NWY2Mlx1NWYwZlx1NjNkMFx1NGY5Ylx1NTIzMFx1NTE3Nlx1NGVkNlx1NGZlMVx1NjA2Zlx1NzY4NFx1OTRmZVx1NjNhNVx1MzAwMg0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1ZmYxYQ0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHVmZjFhDQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwMDlcdTYyZTkgezB9IFx1NGUyYVx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPVx1N2M3Ylx1NTIyYg0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NmI2NFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NjI0MFx1NWM1ZVx1NzY4NFx1N2M3Ylx1NTIyYlx1MzAwMg0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1N2RmDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU3YzdiXHU1NzhiXHVmZjFhDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDM9XHU1YjlhXHU1MjM2XHU3YzdiXHU1MjJiXHVmZjFhDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPVx1NTdkZlx1ZmYxYQ0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU3YzdiXHU1NzhiXHVmZjFhDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMz1cdTViOWFcdTUyMzZcdTdjN2JcdTUyMmJcdWZmMWENCi0NCi0jIFByYWN0aWNlIEVkaXRvciBSZWZlcmVuY2VzIFBhZ2UNCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25OYW1lPVx1NTE4NVx1NWJiOVx1NTE0M1x1N2QyMA0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1NjMwN1x1NWI5YVx1NmI2NFx1NWI5ZVx1OGRmNVx1NWYxNVx1NzUyOFx1NzY4NFx1NTE4NVx1NWJiOVx1NTE0M1x1N2QyMFx1MzAwMg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU1MTg1XHU1YmI5XHU1MTQzXHU3ZDIwXHVmZjFhDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWxlY3RlZExhYmVsPVx1NTE4NVx1NWJiOVx1NTE0M1x1N2QyMFx1ZmYxYQ0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwMDlcdTYyZTkgezB9IFx1NGUyYVx1NTE4NVx1NWJiOVx1NTE0M1x1N2QyMFx1MzAwMg0KLQ0KLSMgQ2F0ZWdvcnkgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbk5hbWU9XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNWVcdTRlOGVcdTZiNjR7MH1cdTc2ODRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHVmZjFhDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHVmZjFhDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDA5XHU2MmU5IHswfSBcdTRlMmFcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi0jIERpc2NpcGxpbmUgR3JvdXBpbmcgRWRpdG9yIERpc2NpcGxpbmVzIFBhZ2UNCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbk5hbWU9XHU4OWM0XHU3YTBiDQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNWVcdTRlOGVcdTZiNjRcdTg5YzRcdTdhMGJcdTUyMDZcdTdlYzRcdTc2ODRcdTg5YzRcdTdhMGJcdTMwMDINCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU4OWM0XHU3YTBiXHVmZjFhDQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHU4OWM0XHU3YTBiXHVmZjFhDQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDA5XHU2MmU5IHswfSBcdTRlMmFcdTg5YzRcdTdhMGJcdTMwMDINCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX1VzZURlZmF1bHREaXJlY3RvcnlCdXR0b25MYWJlbD1cdTRmN2ZcdTc1MjhcdTdmM2FcdTc3MDFcdTc2ZWVcdTVmNTUNCi0NCi0jIERpc2NpcGxpbmUgRWRpdG9yIFRhc2tzIFBhZ2UNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25OYW1lPVx1NGVmYlx1NTJhMQ0KLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NWM1ZVx1NGU4ZVx1NmI2NFx1ODljNFx1N2EwYlx1NzY4NFx1NGVmYlx1NTJhMVx1MzAwMg0KLWRpc2NpcGxpbmVUYXNrc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU0ZWZiXHU1MmExXHVmZjFhDQotZGlzY2lwbGluZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsPVx1NGVmYlx1NTJhMVx1ZmYxYQ0KLWRpc2NpcGxpbmVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwMDlcdTYyZTkgezB9IFx1NGUyYVx1NGVmYlx1NTJhMVx1MzAwMg0KLQ0KLSMgRGlzY2lwbGluZSBFZGl0b3IgUmVmZXJlbmNlIFdvcmtmbG93IFBhZ2UNCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25OYW1lPVx1NWYxNVx1NzUyOFx1NWRlNVx1NGY1Y1x1NmQ0MQ0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NWM1ZVx1NGU4ZVx1NmI2NFx1ODljNFx1N2EwYlx1NzY4NFx1NWYxNVx1NzUyOFx1NWRlNVx1NGY1Y1x1NmQ0MVx1MzAwMg0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU1ZjE1XHU3NTI4XHU1ZGU1XHU0ZjVjXHU2ZDQxXHVmZjFhDQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWxlY3RlZExhYmVsPVx1NWYxNVx1NzUyOFx1NWRlNVx1NGY1Y1x1NmQ0MVx1ZmYxYQ0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwMDlcdTYyZTkgezB9IFx1NGUyYVx1NWYxNVx1NzUyOFx1NWRlNVx1NGY1Y1x1NmQ0MVx1MzAwMg0KLQ0KLSMgRG9tYWluIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMQ0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NWM1ZVx1NGU4ZVx1NmI2NFx1NTdkZlx1NzY4NFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1MzAwMg0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHVmZjFhDQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1ZmYxYQ0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwMDlcdTYyZTkgezB9IFx1NGUyYVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1MzAwMg0KLQ0KLSMgV29yayBQcm9kdWN0IEtpbmQgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU1YzVlXHU0ZThlXHU2YjY0XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU3YzdiXHU1NzhiXHU3Njg0XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHUzMDAyDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTUzZWZcdTc1MjhcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdWZmMWENCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHVmZjFhDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTAwOVx1NjJlOSB7MH0gXHU0ZTJhXHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHUzMDAyDQotDQotIyBSb2xlIFNldCBHcm91cGluZyBFZGl0b3IgUm9sZSBTZXRzIFBhZ2UNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbk5hbWU9XHU4OWQyXHU4MjcyXHU5NmM2DQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNWVcdTRlOGVcdTZiNjRcdTg5ZDJcdTgyNzJcdTk2YzZcdTUyMDZcdTdlYzRcdTc2ODRcdTg5ZDJcdTgyNzJcdTk2YzZcdTMwMDINCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU4OWQyXHU4MjcyXHU5NmM2XHVmZjFhDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw9XHU4OWQyXHU4MjcyXHU5NmM2XHVmZjFhDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDA5XHU2MmU5IHswfSBcdTRlMmFcdTg5ZDJcdTgyNzJcdTk2YzZcdTMwMDINCi0NCi0jIFJvbGUgU2V0IEVkaXRvciBSb2xlcyBQYWdlDQotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uTmFtZT1cdTg5ZDJcdTgyNzINCi1yb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNWVcdTRlOGVcdTZiNjRcdTg5ZDJcdTgyNzJcdTk2YzZcdTc2ODRcdTg5ZDJcdTgyNzJcdTMwMDINCi1yb2xlU2V0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1ODlkMlx1ODI3Mlx1ZmYxYQ0KLXJvbGVTZXRSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTg5ZDJcdTgyNzJcdWZmMWENCi1yb2xlU2V0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDA5XHU2MmU5IHswfSBcdTRlMmFcdTg5ZDJcdTgyNzJcdTMwMDINCi0NCi0jIFRvb2wgRWRpdG9yIFRvb2wgTWVudG9ycyBQYWdlDQotdG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uTmFtZT1cdTVkZTVcdTUxNzdcdTU0MTFcdTViZmMNCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNWVcdTRlOGVcdTZiNjRcdTVkZTVcdTUxNzdcdTc2ODRcdTVkZTVcdTUxNzdcdTU0MTFcdTViZmNcdTMwMDINCi10b29sVG9vbE1lbnRvcnNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NWRlNVx1NTE3N1x1NTQxMVx1NWJmY1x1ZmYxYQ0KLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTVkZTVcdTUxNzdcdTU0MTFcdTViZmMNCi10b29sVG9vbE1lbnRvcnNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDA5XHU2MmU5IHswfSBcdTRlMmFcdTVkZTVcdTUxNzdcdTU0MTFcdTViZmNcdTMwMDINCi0jIEN1c3RvbSBDYXRlZ29yeSBFZGl0b3IgQXNzaWduIFBhZ2UNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbk5hbWU9XHU1MTg1XHU1YmI5XHU1MTQzXHU3ZDIwDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTY3ODRcdTYyMTBcdTZiNjRcdTViOWFcdTUyMzZcdTdjN2JcdTUyMmJcdTc2ODRcdTUxODVcdTViYjlcdTUxNDNcdTdkMjBcdTMwMDINCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU1MTg1XHU1YmI5XHU1MTQzXHU3ZDIwXHVmZjFhDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlbGVjdGVkTGFiZWw9XHU1MTg1XHU1YmI5XHU1MTQzXHU3ZDIwXHVmZjFhDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDA5XHU2MmU5IHswfSBcdTRlMmFcdTUxODVcdTViYjlcdTUxNDNcdTdkMjBcdTMwMDINCi0jIE5ldyBNZXRob2QgUGx1Zy1pbiBXaXphcmQNCi1uZXdQbHVnaW5XaXphcmRfdGl0bGU9XHU2NWIwXHU1ZWZhXHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2DQotbmV3UGx1Z2luV2l6YXJkUGFnZV90aXRsZT1cdTUyMWJcdTVlZmFcdTY1YjBcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjYNCi1uZXdQbHVnaW5XaXphcmRQYWdlX3RleHQ9XHU2MzA3XHU1YjlhXHU1NDBkXHU3OWYwXHU1ZTc2XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2NWIwXHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotbmV3UGx1Z2luRXJyb3JfbXNnPUlVUEEwMDIxRTogXHU2NzJhXHU4MGZkXHU1MjFiXHU1ZWZhXHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHUzMDAyDQotbmV3UGx1Z2luRXJyb3JfcmVhc29uPVx1NTE4NVx1OTBlOFx1OTUxOVx1OGJlZlx1MzAwMlxuXA0KLVxuXA0KLVx1OGJmN1x1NTM1NVx1NTFmYlx1MjAxY1x1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MjAxZFx1ZmYwY1x1ODNiN1x1NTNkNlx1NjZmNFx1NTkxYVx1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLSMgR2VuZXJpYyBkaWFsb2cgdGl0bGVzDQotY3JlYXRlRGlhbG9nX3RpdGxlPVx1NTIxYlx1NWVmYVx1NTE0M1x1N2QyMA0KLWRlbGV0ZURpYWxvZ190aXRsZT1cdTUyMjBcdTk2NjRcdTUxNDNcdTdkMjANCi1lZGl0RGlhbG9nX3RpdGxlPVx1N2YxNlx1OGY5MVx1NTE0M1x1N2QyMA0KLWVycm9yRGlhbG9nX3RpdGxlPVx1OTUxOVx1OGJlZg0KLW1vdmVEaWFsb2dfdGl0bGU9XHU3OWZiXHU1MmE4XHU1MTQzXHU3ZDIwDQotcmVuYW1lRGlhbG9nX3RpdGxlPVx1OTFjZFx1NTQ3ZFx1NTQwZFx1NTE0M1x1N2QyMA0KLXdhcm5pbmdEaWFsb2dfdGl0bGU9XHU4YjY2XHU1NDRhDQotDQotIyBBZGQgQ29uZmlndXJhdGlvbiB0byBQcm9jZXNzIEVycm9yIERpYWxvZw0KLWFkZENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPVx1NTQxMVx1NmQ0MVx1N2EwYlx1NmRmYlx1NTJhMFx1OTE0ZFx1N2Y2ZQ0KLQ0KLSMgU2V0IERlZmF1bHQgQ29uZmlndXJhdGlvbiBFcnJvciBEaWFsb2cNCi1zZXREZWZhdWx0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9XHU4YmJlXHU3ZjZlXHU2ZDQxXHU3YTBiXHU3Njg0XHU3ZjNhXHU3NzAxXHU5MTRkXHU3ZjZlDQotDQotIyBFZGl0IFByb2Nlc3MgRXJyb3IgRGlhbG9nDQotZWRpdFByb2Nlc3NFbGVtZW50RXJyb3JEaWFsb2dfdGl0bGU9XHU3ZjE2XHU4ZjkxXHU2ZDQxXHU3YTBiXHU1MTQzXHU3ZDIwDQotDQotIyBPcGVuIExpYnJhcnkgRGlhbG9nDQotb3BlbkxpYnJhcnlEaWFsb2dfdGl0bGU9XHU2MjUzXHU1ZjAwXHU2NWI5XHU2Y2Q1XHU1ZTkzDQotb3BlbkxpYnJhcnlEaWFsb2dfdGV4dD1cdTY3MmFcdTZiNjNcdTc4NmVcdTRmZGRcdTViNThcdTVmNTNcdTUyNGRcdTY1YjlcdTZjZDVcdTVlOTNcdTMwMDJcdTY2MmZcdTU0MjZcdTg5ODFcdTVmZmRcdTc1NjVcdTk1MTlcdThiZWZcdTVlNzZcdTdlZTdcdTdlZWRcdTYyNTNcdTVmMDBcdTUzZTZcdTRlMDBcdTRlMmFcdTVlOTNcdWZmMWYNCi0NCi0jIFNhdmUgTGlicmFyeSBEaWFsb2cNCi1zYXZlTGlicmFyeURpYWxvZ190aXRsZT1cdTRmZGRcdTViNThcdTY1YjlcdTZjZDVcdTVlOTMNCi1zYXZlTGlicmFyeURpYWxvZ190ZXh0PVx1NWY1M1x1NTI0ZFx1NjViOVx1NmNkNVx1NWU5M1x1NWRmMlx1NGZlZVx1NjUzOVx1MzAwMlx1NjYyZlx1NTQyNlx1ODk4MVx1NGZkZFx1NWI1OFx1NjZmNFx1NjUzOVx1ZmYxZg0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPVx1NTM0N1x1N2VhN1x1NjViOVx1NmNkNVx1NWU5Mw0KLQ0KLSMgRGVsZXRlIEVsZW1lbnQgUmVmZXJlbmNlIERpYWxvZw0KLWRlbGV0ZUFzc29jaWF0aW9uRGlhbG9nX3RleHQ9XHU1MTQzXHU3ZDIwXHUyMDFjezB9XHUyMDFkXHU1ZGYyXHU1MjIwXHU5NjY0XHUzMDAyXHU2NjJmXHU1NDI2XHU4OTgxXHU0ZWNlXHUyMDFjezF9XHUyMDFkXHU0ZTJkXHU5NjY0XHU1M2JiXHU1YjgzXHVmZjFmDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLW5vT3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDBFOiBcdTY1ZTBcdTYyNTNcdTVmMDBcdTc2ODRcdTY1YjlcdTZjZDVcdTVlOTNcdTMwMDJcblwNCi1cblwNCi1cdTU3MjhcdTZkZmJcdTUyYTBcdTY1YjBcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTRlNGJcdTUyNGRcdWZmMGNcdTVmYzVcdTk4N2JcdTYyNTNcdTVmMDBcdTY1YjlcdTZjZDVcdTVlOTNcdTMwMDJcblwNCi1cblwNCi1cdThiZjdcdTUyMWJcdTVlZmFcdTY1YjBcdTY1YjlcdTZjZDVcdTVlOTNcdWZmMGNcdTYyMTZcdTYyNTNcdTVmMDBcdTczYjBcdTY3MDlcdTY1YjlcdTZjZDVcdTVlOTNcdWZmMGNcdTcxMzZcdTU0MGVcdTkxY2RcdThiZDVcdTMwMDINCi1lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEEwMDAxRTogXHU3ZjNhXHU1YzExezB9XHU1NDBkXHU3OWYwXHUzMDAyXG5cDQotXG5cDQotXHU2MjQwXHU2NzA5XHU2NWI5XHU2Y2Q1XHU1NDhjXHU2ZDQxXHU3YTBiXHU1MTQzXHU3ZDIwXHU5MGZkXHU1ZmM1XHU5ODdiXHU2NzA5XHU1NDBkXHU3OWYwXHUzMDAyXG5cDQotXG5cDQotXHU4YmY3XHU1MzU1XHU1MWZiXHUyMDFjXHU3ODZlXHU1YjlhXHUyMDFkXHVmZjBjXHU3MTM2XHU1NDBlXHU0ZTNhXHU1MTQzXHU3ZDIwXHU4ZjkzXHU1MTY1XHU2NzA5XHU2NTQ4XHU1NDBkXHU3OWYwXHUzMDAyDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDJFOiBcdTU0MGRcdTc5ZjBcdTIwMWN7MH1cdTIwMWRcdTVkZjJcdTViNThcdTU3MjhcdTMwMDJcblwNCi1cblwNCi1cdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTVmYzVcdTk4N2JcdTY3MDlcdTU1MmZcdTRlMDBcdTU0MGRcdTc5ZjBcdTMwMDJcblwNCi1cblwNCi1cdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdTc4NmVcdTViOWFcdTIwMWRcdWZmMGNcdTcxMzZcdTU0MGVcdTRlM2FcdTUxNDNcdTdkMjBcdThmOTNcdTUxNjVcdTUzZTZcdTRlMDBcdTRlMmFcdTU0MGRcdTc5ZjBcdTMwMDINCi1jcmVhdGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDNFOiBcdTY1ZTBcdTZjZDVcdTUyMWJcdTVlZmFcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTMwMDINCi1kZWxldGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDRXOiBcdTY1ZTBcdTZjZDVcdTUyMjBcdTk2NjRcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTMwMDINCi1pbnRlcm5hbEVycm9yX21zZz1JVVBBMDAwNUU6IFx1NTNkMVx1NzUxZlx1NTE4NVx1OTBlOFx1OTUxOVx1OGJlZlx1MzAwMlxuXA0KLVxuXA0KLVx1OGJmN1x1NTM1NVx1NTFmYlx1MjAxY1x1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MjAxZFx1ZmYwY1x1ODNiN1x1NTNkNlx1NjZmNFx1NTkxYVx1NGZlMVx1NjA2Zlx1MzAwMg0KLWludmFsaWRQcmVzZW50YXRpb25OYW1lRXJyb3JfbXNnPUlVUEEwMDA2RTogXHU2MzA3XHU1YjlhXHU3Njg0XHU2NjNlXHU3OTNhXHU1NDBkXHU3OWYwXHU2NWUwXHU2NTQ4XHUzMDAyXG5cDQotXG5cDQotXHU4YmY3XHU1MzU1XHU1MWZiXHUyMDFjXHU3ODZlXHU1YjlhXHUyMDFkXHVmZjBjXHU3MTM2XHU1NDBlXHU4ZjkzXHU1MTY1XHU1M2U2XHU0ZTAwXHU0ZTJhXHU1NDBkXHU3OWYwXHUzMDAyDQotaW52YWxpZENvbmZpZ0Vycm9yX21zZz1JVVBBMDAwN0U6IFx1OTAwOVx1NjJlOVx1NzY4NFx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1MjAxY3swfVx1MjAxZFx1NGUwZFx1NjYyZlx1NmQ0MVx1N2EwYlx1N2YzYVx1NzcwMVx1OTE0ZFx1N2Y2ZVx1NzY4NFx1NWI1MFx1OTZjNlx1MzAwMlxuXA0KLVxuXA0KLVx1NGUzYVx1NGU4Nlx1NGZkZFx1NjMwMVx1NmQ0MVx1N2EwYlx1NzY4NFx1NWI4Y1x1NjU3NFx1NjAyN1x1ZmYwY1x1NWI4M1x1NzY4NFx1N2YzYVx1NzcwMVx1OTE0ZFx1N2Y2ZVx1NWZjNVx1OTg3Ylx1NjYyZlx1NGUwZVx1NmQ0MVx1N2EwYlx1NTE3M1x1ODA1NFx1NzY4NFx1NjI0MFx1NjcwOVx1NTE3Nlx1NGVkNlx1OTE0ZFx1N2Y2ZVx1NzY4NFx1OGQ4NVx1OTZjNlx1MzAwMlxuXA0KLVxuXA0KLVx1OGJmN1x1OTAwOVx1NjJlOVx1NTNlNlx1NGUwMFx1NGUyYVx1OTE0ZFx1N2Y2ZVx1ZmYwY1x1NjIxNlx1NGZlZVx1NjUzOVx1N2YzYVx1NzcwMVx1OTE0ZFx1N2Y2ZVx1NGY3Zlx1NWI4M1x1NTMwNVx1NTQyYlx1NjI0MFx1OTAwOVx1OTE0ZFx1N2Y2ZVx1NzY4NFx1NTE4NVx1NWJiOVx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNVx1MzAwMg0KLXNldERlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDhFOiBcdTkwMDlcdTViOWFcdTc2ODRcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTIwMWN7MH1cdTIwMWRcdTRlMGRcdTY2MmZcdTZkNDFcdTdhMGJcdTVmMTVcdTc1MjhcdTc2ODRcdTUxNzZcdTRlZDZcdTkxNGRcdTdmNmVcdTc2ODRcdThkODVcdTk2YzZcdTMwMDJcblwNCi1cblwNCi1cdTRlM2FcdTRlODZcdTRmZGRcdTYzMDFcdTZkNDFcdTdhMGJcdTc2ODRcdTViOGNcdTY1NzRcdTYwMjdcdWZmMGNcdTViODNcdTc2ODRcdTdmM2FcdTc3MDFcdTkxNGRcdTdmNmVcdTVmYzVcdTk4N2JcdTY2MmZcdTRlMGVcdTZkNDFcdTdhMGJcdTUxNzNcdTgwNTRcdTc2ODRcdTYyNDBcdTY3MDlcdTUxNzZcdTRlZDZcdTkxNGRcdTdmNmVcdTc2ODRcdThkODVcdTk2YzZcdTMwMDJcblwNCi1cblwNCi1cdThiZjdcdTkwMDlcdTYyZTlcdTUzZTZcdTRlMDBcdTRlMmFcdTkxNGRcdTdmNmVcdWZmMGNcdTYyMTZcdTRmZWVcdTY1MzlcdTYyNDBcdTkwMDlcdTkxNGRcdTdmNmVcdTc2ODRcdTUxODVcdTViYjlcdWZmMGNcdTcxMzZcdTU0MGVcdTkxY2RcdThiZDVcdTMwMDINCi1vcGVuTGlicmFyeUVycm9yX21zZz1JVVBBMDAwOUU6IFx1NjVlMFx1NmNkNVx1ODhjNVx1NTE2NVx1NjViOVx1NmNkNVx1NWU5M1x1MzAwMlxuXA0KLVxuXA0KLVx1OGJmN1x1NTM1NVx1NTFmYlx1MjAxY1x1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MjAxZFx1ZmYwY1x1ODNiN1x1NTNkNlx1NjZmNFx1NTkxYVx1NGZlMVx1NjA2Zlx1MzAwMg0KLXNhdmVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEwRTogXHU2NWUwXHU2Y2Q1XHU0ZmRkXHU1YjU4XHU2NWI5XHU2Y2Q1XHU1ZTkzXHUzMDAyDQotc2F2ZUxpYnJhcnlUb0Vycm9yX21zZz1JVVBBMDAxMEU6IFx1NjVlMFx1NmNkNVx1NWMwNlx1NjViOVx1NmNkNVx1NWU5M1x1NGZkZFx1NWI1OFx1NTIzMFx1MjAxY3swfVx1MjAxZFx1MzAwMg0KLWVsZW1lbnRBbHJlYWR5RGVsZXRlZEVycm9yX21zZz1JVVBBMDAxMUU6IFx1NTE0M1x1N2QyMFx1MjAxY3swfVx1MjAxZFx1NWRmMlx1NTIyMFx1OTY2NFx1MzAwMg0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEyRTogXHU2NWUwXHU2Y2Q1XHU1MzQ3XHU3ZWE3XHU2NWI5XHU2Y2Q1XHU1ZTkzXHUzMDAyDQotDQotIyBFcnJvciBSZWFzb25zDQotZXJyb3JfcmVhc29uPUlVUEEwMDE2RTogXHU1M2QxXHU3NTFmXHU5NTE5XHU4YmVmXHUzMDAyXG5cDQotXG5cDQotXHU4YmY3XHU1MzU1XHU1MWZiXHUyMDFjXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUyMDFkXHVmZjBjXHU4M2I3XHU1M2Q2XHU2NmY0XHU1OTFhXHU0ZmUxXHU2MDZmXHUzMDAyDQotaW50ZXJuYWxFcnJvcl9yZWFzb249SVVQQTAwMTdFOiBcdTUzZDFcdTc1MWZcdTUxODVcdTkwZThcdTk1MTlcdThiZWZcdTMwMDJcblwNCi1cblwNCi1cdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTIwMWRcdWZmMGNcdTgzYjdcdTUzZDZcdTY2ZjRcdTU5MWFcdTRmZTFcdTYwNmZcdTMwMDINCi11cGdyYWRlTGlicmFyeUVycm9yX3JlYXNvbj1JVVBBMDAxOEU6IFx1ODhjNVx1NTE2NVx1NjViOVx1NmNkNVx1NWU5M1x1NTE0M1x1N2QyMFx1NjVmNlx1NTNkMVx1NzUxZlx1OTUxOVx1OGJlZlx1MzAwMlxuXA0KLVxuXA0KLVx1OGJmN1x1NTM1NVx1NTFmYlx1MjAxY1x1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MjAxZFx1ZmYwY1x1ODNiN1x1NTNkNlx1NjZmNFx1NTkxYVx1NGZlMVx1NjA2Zlx1MzAwMg0KLXNhdmVVcGdyYWRlZExpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMTlFOiBcdTRmZGRcdTViNThcdTVkZjJcdTUzNDdcdTdlYTdcdTc2ODRcdTY1YjlcdTZjZDVcdTVlOTNcdTY1ZjZcdTUzZDFcdTc1MWZcdTk1MTlcdThiZWZcdTMwMDJcblwNCi1cblwNCi1cdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTIwMWRcdWZmMGNcdTgzYjdcdTUzZDZcdTY2ZjRcdTU5MWFcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU2MjUzXHU1ZjAwXHU2NWI5XHU2Y2Q1XHU1ZTkzLi4uDQotc2F2aW5nTGlicmFyeVRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTRmZGRcdTViNThcdTY1YjlcdTZjZDVcdTVlOTMuLi4NCi11cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NTM0N1x1N2VhN1x1NjViOVx1NmNkNVx1NWU5My4uLg0KLWxvYWRpbmdMaWJyYXJ5RWxlbWVudHNUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU4OGM1XHU1MTY1XHU2NWI5XHU2Y2Q1XHU1ZTkzXHU1MTQzXHU3ZDIwLi4uDQotc2F2aW5nVXBncmFkZWRFbGVtZW50c1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTRlZTVcdTY1YjBcdTY1ODdcdTRlZjZcdTY4M2NcdTVmMGZcdTRmZGRcdTViNThcdTY1YjlcdTZjZDVcdTVlOTNcdTUxNDNcdTdkMjAuLi4NCi1zYXZpbmdUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU0ZmRkXHU1YjU4XHUyMDFjezB9XHUyMDFkLi4uDQotc2F2aW5nRmlsZXNUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU0ZmRkXHU1YjU4XHU2NTg3XHU0ZWY2Li4uDQotZml4aW5nQ29udGVudERlc2NyaXB0aW9uR1VJRHNUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU0ZmVlXHU1OTBkXHU1MTg1XHU1YmI5XHU2M2NmXHU4ZmYwIEdVSUQuLi4NCi1kZWxldGluZ0ludmFsaWRSZWZlcmVuY2VzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NTIyMFx1OTY2NFx1NjVlMFx1NjU0OFx1NWYxNVx1NzUyOC4uLg0KLQ0KLQ0KLSMgQWRkIEVkaXRvciBUbyBCcm93c2luZyBQZXJzcGVjdGl2ZSBXYXJuaW5nIERpYWxvZw0KLWFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZz1JVVBBMDA0Nlc6IFx1NWRmMlx1NzI3OVx1NTIyYlx1OGJiZVx1OGJhMVx1NmI2NFx1OTAwZlx1ODljNlx1NTZmZVx1NGVlNVx1NjUzOVx1NTU4NFx1NmQ0Zlx1ODljOFx1NjViOVx1NmNkNVx1NWU5M1x1NTE0M1x1N2QyMFx1NzY4NCBIVE1MIFx1OGJmNFx1NjYwZVx1NzY4NFx1NzUyOFx1NjIzN1x1NGY1M1x1OWE4Y1x1MzAwMlx1NjVlMFx1NmNkNVx1NTcyOFx1NmI2NFx1NTkwNFx1NmRmYlx1NTJhMFx1NjIxNlx1NjYzZVx1NzkzYVx1N2YxNlx1OGY5MVx1NTY2OFx1MzAwMg0KLQ0KLSMgQ2hhbmdlIEhpc3RvcnkgRGlhbG9nDQotQ2hhbmdlSGlzdG9yeURpYWxvZ190aXRsZT1cdTY2ZjRcdTY1MzlcdTYzY2ZcdThmZjBcdTUzODZcdTUzZjJcdThiYjBcdTVmNTUNCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX2xhYmVsPVx1NjZmNFx1NjUzOVx1NTM4Nlx1NTNmMlx1OGJiMFx1NWY1NVx1ZmYxYQ0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgRGVsZXRlIEFjdGlvbg0KLWNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU9XHU3ODZlXHU4YmE0XHU1MjIwXHU5NjY0DQotY29uZmlybURlbGV0ZURpYWxvZ19tc2c9XHU3ODZlXHU1YjllXHU4OTgxXHU1MjIwXHU5NjY0XHUyMDFjezB9XHUyMDFkXHU1NDE3XHVmZjFmDQotY29uZmlybURlbGV0ZURpYWxvZ19tc2dXaXRoUmVmZXJlbmNlPVx1Nzg2ZVx1NWI5ZVx1ODk4MVx1NTIyMFx1OTY2NFx1MjAxY3swfVx1MjAxZFx1NTQxN1x1ZmYxZlxuXA0KLVxuXA0KLVx1NGVlNVx1NGUwYlx1NTE0M1x1N2QyMFx1NTMwNVx1NTQyYlx1NWJmOVx1ODk4MVx1NTIyMFx1OTY2NFx1NzY4NFx1OTg3OVx1NzY4NFx1NWYxNVx1NzUyOFx1ZmYxYXsxfQ0KLQ0KLSMgTmV3IExpYnJhcnkgRGlhbG9nDQotZXJyb3JEaWFsb2dfbWVzc2FnZT1JVVBBMDAyMkU6IFx1NjVlMFx1NmNkNVx1NTIxYlx1NWVmYVx1NjViOVx1NmNkNVx1NWU5M1x1MjAxY3swfVx1MjAxZFx1MzAwMg0KLWVycm9yRGlhbG9nX2Vycm9yPVx1NjVlMFx1NmNkNVx1NTcyOFx1NGUwMFx1NGUyYVx1NjViOVx1NmNkNVx1NWU5M1x1NGUyZFx1NTIxYlx1NWVmYVx1NTNlNlx1NGUwMFx1NGUyYVx1NjViOVx1NmNkNVx1NWU5M1x1MzAwMg0KLWVycl9ub29wZW5saWJyYXJ5PUlVUEEwMDQwRTogXHU2NWUwXHU2MjUzXHU1ZjAwXHU3Njg0XHU2NWI5XHU2Y2Q1XHU1ZTkzXHUzMDAyXG5cDQotXG5cDQotXHU1NzI4XHU2ZGZiXHU1MmEwXHU2NWIwXHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHU0ZTRiXHU1MjRkXHVmZjBjXHU1ZmM1XHU5ODdiXHU2MjUzXHU1ZjAwXHU2NWI5XHU2Y2Q1XHU1ZTkzXHUzMDAyXG5cDQotXG5cDQotXHU4YmY3XHU1MjFiXHU1ZWZhXHU2NWIwXHU2NWI5XHU2Y2Q1XHU1ZTkzXHVmZjBjXHU2MjE2XHU2MjUzXHU1ZjAwXHU3M2IwXHU2NzA5XHU2NWI5XHU2Y2Q1XHU1ZTkzXHVmZjBjXHU3MTM2XHU1NDBlXHU5MWNkXHU4YmQ1XHUzMDAyDQotZXJyX2xvYWRpbmdsaWJyYXJ5PVx1ODhjNVx1NTE2NVx1NWU5M1x1NjVmNlx1NTFmYVx1OTUxOQ0KLW1zZ19yZWxvYWRMaWJyYXJ5PVx1NjRhNFx1NmQ4OFx1NTkzMVx1OGQyNVx1NzY4NFx1NTIyMFx1OTY2NFx1NjVmNlx1NTFmYVx1OTUxOVx1MzAwMlx1OTcwMFx1ODk4MVx1OTFjZFx1NjViMFx1ODhjNVx1NTE2NVx1NWY1M1x1NTI0ZFx1NjViOVx1NmNkNVx1NWU5M1x1MzAwMg0KLQ0KLSMgUmVsb2FkIExpYnJhcnkgRGlhbG9nDQotcmVsb2FkRGlhbG9nX21lc3NhZ2U9XHU5NzAwXHU4OTgxXHU5MWNkXHU2NWIwXHU4OGM1XHU1MTY1XHU1ZTkzXHVmZjBjXHU2MDYyXHU1OTBkXHU1YjgzXHU3Njg0XHU1MzlmXHU1OWNiXHU3MmI2XHU2MDAxXHUzMDAyDQotcmVsb2FkRGlhbG9nX3RpdGxlPVx1OTFjZFx1NjViMFx1ODhjNVx1NTE2NVx1NWU5Mw0KLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvclRpdGxlPVx1NzlmYlx1NTJhOFx1OTUxOVx1OGJlZg0KLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvck1lc3NhZ2U9XHU3OWZiXHU1MmE4XHU2NWY2XHU1MWZhXHU5NTE5DQotDQotIyBQcm9jZXNzIEZvcm0gRWRpdG9yDQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX3RpdGxlPVx1NGZkZFx1NWI1OA0KLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMT1cdTZiNjRcdTY2ZjRcdTY1MzlcdTVjMDZcdTVmNzFcdTU0Y2RcdTZkNDFcdTdhMGJcdTRlMmRcdTc2ODRcdTYyNDBcdTY3MDlcdTU2ZmVcdTMwMDJcdTY2ZjRcdTY1MzlcdTRlNGJcdTU0MGVcdWZmMGNcdTVjMDZcdTRmZGRcdTViNThcdTdmMTZcdThmOTFcdTU2NjhcdTMwMDJcdTg5ODFcdTdlZTdcdTdlZWRcdTU0MTdcdWZmMWYNCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTI9XHU2NmY0XHU2NTM5XHU0ZTRiXHU1NDBlXHVmZjBjXHU1YzA2XHU0ZmRkXHU1YjU4XHU3ZjE2XHU4ZjkxXHU1NjY4XHUzMDAyXHU4OTgxXHU3ZWU3XHU3ZWVkXHU1NDE3XHVmZjFmDQotDQotIyBDb25maWd1cmF0aW9uIFZpZXcgUGFnZQ0KLWNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ190aXRsZT1cdTc4NmVcdThiYTRcdTk2NjRcdTUzYmINCi1jb25maWdWaWV3UGFnZVJlbW92ZVZpZXdEaWFsb2dfbWVzc2FnZT1cdTc4NmVcdTViOWVcdTg5ODFcdTk2NjRcdTUzYmJcdTg5YzZcdTU2ZmVcdTIwMWN7MH1cdTIwMWRcdTU0MTdcdWZmMWYNCi1jb25maWdWaWV3UGFnZVZpZXdFeGlzdHNEaWFsb2dfdGl0bGU9XHU4YjY2XHU1NDRhDQotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvbj1cdTkxNGRcdTdmNmVcdWZmMWENCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld3M9XHU5MTRkXHU3ZjZlXHU4OWM2XHU1NmZlDQotY29uZmlnVmlld1BhZ2Vfdmlld3M9XHU4OWM2XHU1NmZlDQotY29sdW1uc2VsZWN0aW9uX3RleHQ9XHU1MjE3XHU5MDA5XHU2MmU5XHVmZjFhDQotY29uZmlnVmlld1BhZ2VfYWRkVmlld0J1dHRvblRleHQ9XHU2ZGZiXHU1MmEwXHU4OWM2XHU1NmZlLi4uDQotY29uZmlnVmlld1BhZ2VfcmVtb3ZlVmlld0J1dHRvblRleHQ9XHU5NjY0XHU1M2JiXHU4OWM2XHU1NmZlDQotY29uZmlnVmlld1BhZ2VfbWFrZURlZmF1bHRCdXR0b25UZXh0PVx1OGJiZVx1NGUzYVx1N2YzYVx1NzcwMVx1NTAzYw0KLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ19tZXNzYWdlPUlVUEEwMDIzVzogXHU1NDBkXHU3OWYwXHU0ZTNhXHUyMDFjezB9XHUyMDFkXHU3Njg0XHU4OWM2XHU1NmZlXHU1ZGYyXHU1YjU4XHU1NzI4XHUzMDAyDQotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdTZWN0aW9uVGl0bGU9XHU1M2QxXHU1ZTAzXHU3Njg0XHU1YmZjXHU4MjJhXHU4OWM2XHU1NmZlDQotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdTZWN0aW9uTWVzc2FnZT1cdTYzMDdcdTViOWFcdTUzZDFcdTVlMDNcdTZiNjRcdTkxNGRcdTdmNmVcdTY1ZjZcdTVjMDZcdTUzMDVcdTU0MmJcdTc2ODRcdTg5YzZcdTU2ZmVcdTMwMDJcdTg5ODFcdTUyMWJcdTVlZmFcdTg5YzZcdTU2ZmVcdWZmMGNcdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdTZkZmJcdTUyYTBcdTg5YzZcdTU2ZmVcdTIwMWRcdWZmMGNcdTU3MjhcdTkxNGRcdTdmNmVcdTRlMmRcdTkwMDlcdTYyZTlcdTRlZmJcdTYxMGZcdTY4MDdcdTUxYzZcdTYyMTZcdTViOWFcdTUyMzZcdTdjN2JcdTUyMmJcdTMwMDJcdTkwMDlcdTViOWFcdTc2ODRcdTdjN2JcdTUyMmJcdTVjMDZcdTg4NjhcdTc5M2FcdThiZTVcdTg5YzZcdTU2ZmVcdWZmMGNcdTgwMGNcdThmZDlcdTRlMmFcdTdjN2JcdTUyMmJcdTc2ODRcdTViNTBcdTdjN2JcdTUyMmJcdTU0OGNcdTUxODVcdTViYjlcdTUxNDNcdTdkMjBcdTVjMDZcdTg4NjhcdTc5M2FcdThiZTVcdTg5YzZcdTU2ZmVcdTc2ODRcdTY4MTFcdTUxNDNcdTdkMjBcdTMwMDINCi0NCi0jIERlc2NyaXB0aW9uIFRhYg0KLWRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX3RpdGxlPVx1OGY2Y1x1NjM2Mlx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zg0KLWRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UxPUlVUEEwMDQwVzogXHU4YmY3XHU1MTQ4XHU0ZmRkXHU1YjU4XHU3ZjE2XHU4ZjkxXHU1NjY4XHUzMDAyDQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTI9XHU2YjY0XHU3YzdiXHU1NzhiXHU2Y2ExXHU2NzA5XHU1MTdjXHU1YmI5XHU3Njg0XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotY2hhbmdlQWN0aXZpdHlUeXBlV2FybmluZ0RpYWxvZ190aXRsZT1cdThmNmNcdTYzNjJcdTZkM2JcdTUyYTgNCi0jIEFzc29jaWF0aW9uIEZvcm0gUGFnZQ0KLUFzc29jaWF0aW9uRm9ybVBhZ2VfQnJpZWZEZXNjcmlwdGlvbkxhYmVsPVx1OTAwOVx1NWI5YVx1NTE0M1x1N2QyMFx1NzY4NFx1N2I4MFx1ODk4MVx1NjNjZlx1OGZmMFx1ZmYxYQ0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgRGVzY3JpcHRpb24NCi1tZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfdGl0bGU9XHU4ZjkzXHU1MTY1XHU1MTQzXHU3ZDIwXHU1NDBkXHU3OWYwDQotbWV0aG9kRWxlbWVudERlc2NyaXB0aW9uRW1wdHlOYW1lRGlhbG9nX21lc3NhZ2U9XHU1NDBkXHU3OWYwXHU1YjU3XHU2YmI1XHU0ZTBkXHU4MGZkXHU0ZTNhXHU3YTdhXHUzMDAyDQotDQotIyBNZXRob2QgUGx1Zy1pbiBEZXNjcmlwdGlvbg0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUmVtb3ZlUmVmQ29uZmlybV9tZXNzYWdlPVx1NGUwZFx1OTAwOVx1NjJlOVx1NGUwZVx1NjNkMlx1NGVmNlx1MjAxY3swfVx1MjAxZFx1NTE3M1x1ODA1NFx1NzY4NFx1NWYxNVx1NzUyOFx1NjNkMlx1NGVmNlx1NWMwNlx1NGVhN1x1NzUxZlx1NGYxYVx1ODhhYlx1NTIyMFx1OTY2NFx1NzY4NFx1NjVlMFx1NjU0OFx1NTE3M1x1N2NmYlx1MzAwMlxuXA0KLVxuXA0KLVx1NmI2NFx1NjRjZFx1NGY1Y1x1NjVlMFx1NmNkNVx1NjRhNFx1NmQ4OFx1MzAwMlx1NjYyZlx1NTQyNlx1ODk4MVx1N2VlN1x1N2VlZFx1NjI2N1x1ODg0Y1x1NmI2NFx1NjZmNFx1NjUzOVx1ZmYxZg0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jb25maXJtUmVuYW1lPVx1NjBhOFx1ODk4MVx1NWMwNlx1NmI2NFx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNlx1NzY4NFx1NTQwZFx1NzlmMFx1NGVjZVx1MjAxY3swfVx1MjAxZFx1NjZmNFx1NjUzOVx1NGUzYVx1NjViMFx1NTQwZFx1NzlmMFx1MjAxY3sxfVx1MjAxZFx1MzAwMlx1OGZkOVx1NGUyYVx1NjRjZFx1NGY1Y1x1NWMwNlx1NGZkZFx1NWI1OFx1NmI2NFx1N2YxNlx1OGY5MVx1NTY2OFx1NWU3Nlx1NWMwNlx1NjNkMlx1NGVmNlx1NjU4N1x1NGVmNlx1NTkzOVx1OTFjZFx1NTQ3ZFx1NTQwZFx1NGUzYVx1NjViMFx1NTQwZFx1NzlmMFx1MzAwMlx1ODk4MVx1N2VlN1x1N2VlZFx1NTQxN1x1ZmYxZg0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jb25maXJtUmVuYW1lX3RpdGxlPVx1OTFjZFx1NTQ3ZFx1NTQwZFx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNg0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jYW5ub3RSZW5hbWVQbHVnaW5Gb2xkZXI9XHU2NWUwXHU2Y2Q1XHU1YzA2XHU2M2QyXHU0ZWY2XHU2NTg3XHU0ZWY2XHU1OTM5XHU5MWNkXHU1NDdkXHU1NDBkXHU0ZTNhXHU2NWIwXHU1NDBkXHU3OWYwDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5MYWJlbD1cdTk1MDFcdTViOWFcdTYzZDJcdTRlZjYNCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbl9tZXNzYWdlPVx1OTUwMVx1NWI5YVx1NjNkMlx1NGVmNlx1NjZmNFx1NjUzOVx1NWMwNlx1NGZkZFx1NWI1OFx1ZmYwY1x1NWU3Nlx1NWMwNlx1NTE3M1x1OTVlZFx1NWJmOVx1NWM1ZVx1NGU4ZVx1NjNkMlx1NGVmNlx1MjAxY3swfVx1MjAxZFx1NzY4NFx1NTE0M1x1N2QyMFx1NjI1M1x1NWYwMFx1NzY4NFx1N2YxNlx1OGY5MVx1NTY2OFx1MzAwMlx1NjYyZlx1NTQyNlx1ODk4MVx1N2VlN1x1N2VlZFx1NjI2N1x1ODg0Y1x1NmI2NFx1NjZmNFx1NjUzOVx1ZmYxZg0KLQ0KLSMgUHJvY2VzcyBEZXNjcmlwdGlvbg0KLXByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX3RpdGxlPVx1OTFjZFx1NTQ3ZFx1NTQwZA0KLXByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX21lc3NhZ2U9XHU2MGE4XHU4OTgxXHU2NmY0XHU2NTM5XHU2YjY0XHU2ZDQxXHU3YTBiXHU3Njg0XHU1NDBkXHU3OWYwXHUzMDAyXHU4ZmQ5XHU1YzA2XHU0ZmRkXHU1YjU4XHU2YjY0XHU3ZjE2XHU4ZjkxXHU1NjY4XHU1ZTc2XHU1YzA2XHU2ZDQxXHU3YTBiXHU2NTg3XHU0ZWY2XHU1OTM5XHU5MWNkXHU1NDdkXHU1NDBkXHU0ZTNhXHU2NWIwXHU1NDBkXHU3OWYwXHUzMDAyXHU4OTgxXHU3ZWU3XHU3ZWVkXHU1NDE3XHVmZjFmDQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbj1cdTYzY2ZcdThmZjBcdWZmMWENCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25UaXRsZT1cdTkxNGRcdTdmNmUNCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25NZXNzYWdlPVx1NjMwN1x1NWI5YVx1NjI0MFx1NjcwOVx1NWJmOVx1NGU4ZVx1NmI2NFx1NmQ0MVx1N2EwYlx1NjcwOVx1NjU0OFx1NzY4NFx1OTE0ZFx1N2Y2ZVx1MzAwMlx1OGJmN1x1OTAwOVx1NjJlOVx1NGUwMFx1NGUyYVx1OTE0ZFx1N2Y2ZVx1NGY1Y1x1NGUzYVx1N2YzYVx1NzcwMVx1OTE0ZFx1N2Y2ZVx1ZmYxYlx1OGJlNVx1OTE0ZFx1N2Y2ZVx1NWZjNVx1OTg3Ylx1NjYyZlx1NjI0MFx1NjcwOVx1NTE3Nlx1NGVkNlx1OTE0ZFx1N2Y2ZVx1NzY4NFx1OGQ4NVx1OTZjNlx1MzAwMg0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9ucz1cdTkxNGRcdTdmNmVcdWZmMWENCi1wcm9jZXNzRGVzY3JpcHRpb25fZGVmYXVsdD1cdWZmMDhcdTdmM2FcdTc3MDFcdTUwM2NcdWZmMDkNCi1Qcm9jZXNzRGVzY3JpcHRpb25fc2VsZWN0Q29uZmlndXJhdGlvbj1cdTkwMDlcdTYyZTlcdTg5ODFcdTZkZmJcdTUyYTBcdTc2ODRcdTkxNGRcdTdmNmUNCi1Qcm9jZXNzRGVsZXRlQWN0aW9uX2RlbGV0ZWNvZmlybV90ZXh0MD1cdThmZDlcdTVjMDZcdTRmZGRcdTViNThcdTVmNTNcdTUyNGRcdTdmMTZcdThmOTFcdTU2NjhcdTVlNzZcdTRlMTRcdTY2ZjRcdTY1MzlcdTY2MmZcdTZjMzhcdTRlNDVcdTYwMjdcdTc2ODRcdTMwMDJcdTc4NmVcdTViOWVcdTg5ODFcdTUyMjBcdTk2NjRcdTIwMWN7MH1cdTIwMWRcdTU0MTdcdWZmMWYNCi1Qcm9jZXNzRGVsZXRlQWN0aW9uX3NlbGVjdERlc2NyaXB0b3JzVG9EZWxldGU9XHU1MjIwXHU5NjY0XHU5MDA5XHU1YjlhXHU1MTQzXHU3ZDIwXHU1NDBlXHVmZjBjXHU2NWUwXHU0ZWZiXHU0ZjU1XHU1NzMwXHU2NWI5XHU0ZjdmXHU3NTI4XHU0ZWU1XHU0ZTBiXHU2M2NmXHU4ZmYwXHU3YjI2XHUzMDAyXG5cDQotXHU4YmY3XHU5MDA5XHU2MmU5XHU4OTgxXHU1MjIwXHU5NjY0XHU3Njg0XHU2M2NmXHU4ZmYwXHU3YjI2XHUzMDAyDQotDQotIyBWaWV3IEhlbHBlcg0KLXZpZXdIZWxwZXJIZWFsdGhDaGVja0RpYWxvZ190aXRsZT1cdTVlOTNcdTUwNjVcdTUxNjhcdTY4YzBcdTY3ZTUNCi12aWV3SGVscGVyX3BlcmZvcm1IZWFsdGhDaGVjaz1cdTZiNjNcdTU3MjhcdTViZjlcdTVlOTNcdTYyNjdcdTg4NGNcdTUwNjVcdTUxNjhcdTY4YzBcdTY3ZTUuLi4NCi12aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfbWVzc2FnZT1cdTVkZjJcdTYyMTBcdTUyOWZcdTViOGNcdTYyMTBcdTViZjlcdTYyNTNcdTVmMDBcdTVlOTNcdTc2ODRcdTUwNjVcdTUxNjhcdTY4YzBcdTY3ZTVcdTMwMDJcdThiZjdcdTUzYzJcdTk2MDVcdTY1ZTVcdTVmZDdcdTY1ODdcdTRlZjZcdTRlMmRcdTc2ODRcdTYyYTVcdTU0NGFcdTMwMDINCi0NCi0jIEF0dGFjaCBUZW1wbGF0ZSBGaWxlIERpYWxvZw0KLWF0dGFjaFRlbXBsYXRlRmlsZURpYWxvZ190aXRsZT1cdTk2NDRcdTUyYTBcdTZhMjFcdTY3N2ZcdTY1ODdcdTRlZjYNCi0NCi0jIENyZWF0ZSBFbGVtZW50IEVycm9yIERpYWxvZw0KLWNyZWF0ZUVsZW1lbnREaWFsb2dfdGl0bGU9XHU2NWIwXHU1ZWZhIHswfQ0KLWNyZWF0ZU5ld0VsZW1lbnRFcnJvcl9tc2c9XHU2NWIwXHU1ZWZhIHswfSBcdTY1ZjZcdTUxZmFcdTk1MTlcdTMwMDINCi0NCi1kbGdUaXRsZV9yZWxvYWRMaWJyYXJ5PVx1OTFjZFx1NjViMFx1ODhjNVx1NTE2NVx1NWU5Mw0KLWNyZWF0ZUVsZW1lbnRFcnJvcl9yZWFzb249ezB9IFx1NTQwZFx1NzlmMFx1NGUwZFx1ODBmZFx1NGUzYVx1N2E3YVx1MzAwMlxuXA0KLVxuXA0KLVx1OGJmN1x1NjMwN1x1NWI5YVx1NjcwOVx1NjU0OFx1NTQwZFx1NzlmMFx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNVx1MzAwMg0KLWRlbGV0ZUNvbmZpZ0Vycm9yX3JlYXNvbj1cdTZkNDFcdTdhMGJcdTIwMWN7MH1cdTIwMWRcdTVmMTVcdTc1MjhcdTRlODZcdTkxNGRcdTdmNmUNCi0jIENoYW5nZUJvdW5kc0NvbW1hbmQNCi1nZWZfY2hhbmdlQm91bmRzQ29tbWFuZF9sYWJlbD1cdTY2ZjRcdTY1MzlcdTdlZDFcdTViOWENCi0jIENoYW5nZU5hbWVDb21tYW5kDQotZ2VmX2NoYW5nZU5hbWVDb21tYW5kX2xhYmVsPVx1NjZmNFx1NjUzOVx1NTQwZFx1NzlmMA0KLWdlZl9jaGFuZ2VOYW1lQ29tbWFuZF91bmRvTWVzc2FnZT1cdTY1ZTBcdTZjZDVcdTY0YTRcdTZkODhcdTU0MGRcdTc5ZjBcdTY2ZjRcdTY1MzlcdTMwMDJcblwNCi1cblwNCi1cdTU5ODJcdTY3OWNcdTUxNDhcdTUyNGRcdTc2ODRcdTU0MGRcdTc5ZjBcdTRlM2FcdTdhN2FcdWZmMGNcdTUyMTlcdTRlMGRcdTUxNDFcdThiYjhcdTY0YTRcdTZkODhcdTU0MGRcdTc5ZjBcdTY2ZjRcdTY1MzlcdTMwMDINCi0jIENoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kDQotZ2VmX2NoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kX2xhYmVsPVx1NjZmNFx1NjUzOVx1NWM1ZVx1NjAyN1x1NTAzYw0KLSMgQ3JlYXRlQmVuZHBvaW50Q29tbWFuZA0KLWdlZl9jcmVhdGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPVx1NTIxYlx1NWVmYVx1NWYyZlx1NjZmMlx1NzBiOQ0KLSMgQ3JlYXRlTGlua0NvbW1hbmQNCi1nZWZfY3JlYXRlTGlua0NvbW1hbmRfbGFiZWw9XHU5NGZlXHU2M2E1XHU1MjFiXHU1ZWZhDQotIyBDcmVhdGVOb2RlQ29tbWFuZA0KLWdlZl9jcmVhdGVOb2RlQ29tbWFuZF9sYWJlbD1cdTUyMWJcdTVlZmFcdTY1YjBcdTgyODJcdTcwYjkNCi0jIERlbGV0ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfZGVsZXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1cdTUyMjBcdTk2NjRcdTVmMmZcdTY2ZjJcdTcwYjkNCi0jIERlbGV0ZUNvbW1hbmQNCi1nZWZfZGVsZXRlQ29tbWFuZF9sYWJlbD1cdTUyMjBcdTk2NjQNCi0jIERlbGV0ZUxpbmtDb21tYW5kDQotZ2VmX2RlbGV0ZUxpbmtDb21tYW5kX2xhYmVsPVx1NTIyMFx1OTY2NFx1OGZkZVx1NjNhNQ0KLSMgTW92ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfbW92ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9XHU3OWZiXHU1MmE4XHU1ZjJmXHU2NmYyXHU3MGI5DQotIyBSZWNvbm5lY3RMaW5rQ29tbWFuZA0KLWdlZl9yZWNvbm5lY3RMaW5rQ29tbWFuZF9sYWJlbD1cdTkxY2RcdTY1YjBcdTk0ZmVcdTYzYTUNCi0NCi0jIFZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcg0KLWdlZl92YWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXJfYnJpbmdEb3duUHJvbXB0PVx1NTQwZFx1NzlmMFx1NGUwZFx1ODBmZFx1NGUzYVx1N2E3YVx1MzAwMlx1OGJmN1x1NjMwN1x1NWI5YVx1NjcwOVx1NjU0OFx1NTQwZFx1NzlmMFx1MzAwMg0KLSMgVmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXINCi1nZWZfdmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXJfYnJpbmdEb3duUHJvbXB0PVx1NTQwZFx1NzlmMFx1NGUwZFx1ODBmZFx1NGUzYVx1N2E3YVx1MzAwMlx1OGJmN1x1NjMwN1x1NWI5YVx1NjcwOVx1NjU0OFx1NTQwZFx1NzlmMFx1MzAwMg0KLSMgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQNCi1nZWZfd29ya1Byb2R1Y3ROb2RlRWRpdFBhcnRfdmFsaWRhdGVNZXNzYWdlPVx1NTQwZFx1NzlmMFx1NGUwZFx1ODBmZFx1NGUzYVx1N2E3YVx1MzAwMlx1OGJmN1x1NjMwN1x1NWI5YVx1NjcwOVx1NjU0OFx1NTQwZFx1NzlmMFx1MzAwMg0KLQ0KLSMgRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uDQotYWN0aW9uc19FbGVtZW50c1ZpZXdEZWxldGVBY3Rpb25fbWVzc2FnZT1cdTY1ZTBcdTZjZDVcdTUyMjBcdTk2NjRcdTkxNGRcdTdmNmVcdTIwMWN7MH1cdTIwMWRcdWZmMGNcdTU2ZTBcdTRlM2FcdTZkNDFcdTdhMGJcdTIwMWN7MX1cdTIwMWRcdTRlY2RcdTcxMzZcdTU3MjhcdTRmN2ZcdTc1MjhcdTZiNjRcdTkxNGRcdTdmNmVcdTMwMDINCi0NCi0jIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcg0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yVGl0bGU9XHU1MjIwXHU5NjY0XHU5NTE5XHU4YmVmDQotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JNZXNzYWdlPVx1NjcyYVx1NTkwNFx1NzQwNlx1NzY4NFx1NWYwMlx1NWUzOA0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yUmVhc29uPVx1OGJmN1x1NTNjMlx1OTYwNVx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zg0KLQ0KLSMgTWV0aG9kRWxlbWVudEVkaXRvcg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZT1cdTRmZGRcdTViNThcdTk1MTlcdThiZWYNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTE9SVVQQTAwMjBFOiBcdTRmZGRcdTViNThcdTY1ODdcdTRlZjZcdTY1ZjZcdTUxZmFcdTk1MTkNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTI9XHU2M2QwXHU0ZWE0XHU5NTE5XHU4YmVmDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjE9XHU4YmY3XHU1M2MyXHU5NjA1XHU2NWU1XHU1ZmQ3XHU2NTg3XHU0ZWY2XHVmZjBjXHU4M2I3XHU1M2Q2XHU2NmY0XHU1OTFhXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjI9XHU4YmY3XHU1M2MyXHU5NjA1XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yVGl0bGU9XHU5MWNkXHU1NDdkXHU1NDBkXHU5NTE5XHU4YmVmDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JNc2c9XHU2YjY0XHU3ZjE2XHU4ZjkxXHU1NjY4XHU3Njg0XHU0ZTAwXHU0ZTJhXHU2MjE2XHU1OTFhXHU0ZTJhXHU2NTg3XHU0ZWY2XHU1ZGYyXHU4OGFiXHU1MjIwXHU5NjY0XHUzMDAyXHU2YjY0XHU3ZjE2XHU4ZjkxXHU1NjY4XHU0ZTBkXHU1MThkXHU2NzA5XHU2NTQ4XHVmZjBjXHU1YzA2XHU4OGFiXHU1MTczXHU5NWVkXHUzMDAyDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JUaXRsZT1cdTY1ZTBcdTY1NDhcdTdmMTZcdThmOTFcdTU2NjgNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JNZXNzYWdlMT1cdTkxY2RcdTU0N2RcdTU0MGRcdTY1ODdcdTRlZjZcdTIwMWN7MH1cdTIwMWRcdTY1ZjZcdTUxZmFcdTk1MTkNCi0jIERlc2NyaXB0aW9uRm9ybVBhZ2UNCi1yZW5hbWVFcnJvcl90aXRsZT1cdTkxY2RcdTU0N2RcdTU0MGRcdTUxNDNcdTdkMjANCi1yZW5hbWVFcnJvcl9tc2c9SVVQQTAwMTNFOiBcdTY1ZTBcdTZjZDVcdTViOGNcdTYyMTBcdTkxY2RcdTU0N2RcdTU0MGRcdTY0Y2RcdTRmNWNcdTMwMDINCi1TZWxlY3RFbGVtZW50RGlhbG9nX3NlbGVjdGVsZW1lbnRfdGV4dD1cdTkwMDlcdTYyZTlcdTUxNDNcdTdkMjANCi0NCi0jIEVkaXRvckNob29zZXINCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfdGl0bGU9XHU2MjUzXHU1ZjAwXHU2NWI5XHU2Y2Q1XHU3ZjE2XHU4ZjkxXHU1NjY4DQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZXNjcmlwdGlvbkxhYmVsPVx1NjNjZlx1OGZmMFx1ZmYxYQ0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9TZWxlY3RBbGxCdXR0b25MYWJlbD1cdTUxNjhcdTkwZThcdTkwMDlcdTRlMmQNCi1PcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlX2VkaXRfdGV4dDA9XHU3ZjE2XHU4ZjkxXHU1MTQzXHU3ZDIwDQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNFOiBcdTY1ZTBcdTZjZDVcdTYyNTNcdTVmMDBcdTRlMGVcdTkwMDlcdTViOWFcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTUxNzNcdTgwNTRcdTc2ODRcdTdmMTZcdThmOTFcdTU2NjhcdTMwMDINCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZT1cdTkwMDlcdTYyZTlcdTU2ZmVcdTUwY2ZcdTY1ODdcdTRlZjYNCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5TmFtZT1cdTY1YjBcdTVlZmFcdTVlOTMNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfRGVzY3JpcHRpb25MYWJlbD1cdTYzY2ZcdThmZjBcdWZmMWENCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1cdTkwMDlcdTYyZTlcdTRlMDBcdTRlMmFcdTYyMTZcdTU5MWFcdTRlMmFcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdWZmMGNcdTcxMzZcdTU0MGVcdTUzNTVcdTUxZmJcdTIwMWNcdTViOGNcdTYyMTBcdTIwMWRcdTYyNTNcdTVmMDBcdThmZDlcdTRlOWJcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTMwMDINCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfRGVzZWxlY3RBbGxCdXR0b25MYWJlbD1cdTUxNjhcdTkwZThcdTRlMGRcdTkwMDkNCi1FbGVtZW50c1ZpZXdfbWlncmF0aW9uX2Rpcl9kbGdfZGVzY3JpcHRpb25fdGV4dD1cdTYzMDdcdTViOWFcdTY1YjBcdThmYzFcdTc5ZmJcdTc2ODQgezB9IFx1NzY4NFx1NzZlZVx1NWY1NVx1NjZmZlx1NjM2Mlx1OTAwOVx1NWI5YVx1NzY4NCB7MH0NCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uPVx1NTNkMVx1NzUxZlx1N2NmYlx1N2VkZlx1OTUxOVx1OGJlZlx1MzAwMlx1OGJmN1x1NTM1NVx1NTFmYlx1MjAxY1x1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MjAxZFx1ZmYwY1x1ODNiN1x1NTNkNlx1NjZmNFx1NTkxYVx1NGZlMVx1NjA2Zlx1MzAwMlxuXA0KLVxuXA0KLVx1OGJmN1x1NTE3M1x1OTVlZFx1NGUwMFx1NGU5Ylx1NjI1M1x1NWYwMFx1NzY4NFx1N2YxNlx1OGY5MVx1NTY2OFx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNVx1MzAwMg0KLQ0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGl0bGU9XHU1NmZlXHU1MGNmXHU2NWUwXHU2NTQ4DQotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZVRvb0JpZ0RpYWxvZ190ZW1wbGF0ZT1JVVBBMDAzMUU6IFx1OTAwOVx1NWI5YVx1NzY4NFx1NTZmZVx1NTBjZlx1MjAxY3swfVx1MjAxZFx1NTkyN1x1NGU4ZVx1NTE0MVx1OGJiOFx1NzY4NFx1NTkyN1x1NWMwZlx1ZmYwOHsxfSAqIHsyfVx1ZmYwOVx1MzAwMlx1OGJmN1x1OTAwOVx1NjJlOVx1NTNlNlx1NGUwMFx1NGUyYVx1NTZmZVx1NTBjZlx1MzAwMg0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190aXRsZT1cdTU2ZmVcdTUwY2ZcdTY1ZTBcdTY1NDgNCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzJFOiBcdTkwMDlcdTViOWFcdTc2ODRcdTY1ODdcdTRlZjZcdTIwMWN7MH1cdTIwMWRcdTRlMGRcdTViNThcdTU3MjhcdTMwMDJcdThiZjdcdTkwMDlcdTYyZTlcdTUzZTZcdTRlMDBcdTRlMmFcdTU2ZmVcdTUwY2ZcdTMwMDINCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9XHU5MDA5XHU2MmU5Li4uDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeURlc2NyaXB0aW9uPVx1NjViOVx1NmNkNVx1NWU5M1x1NjNjZlx1OGZmMA0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZWZhdWx0QnJpZWZEZXNjcmlwdGlvbj1cdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTYzY2ZcdThmZjANCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZURlc2NyaXB0aW9uPVx1NWZjNVx1OTg3Ylx1NTE3M1x1OTVlZFx1NjI0MFx1NjcwOVx1N2YxNlx1OGY5MVx1NTY2OFx1MzAwMlx1OGJmN1x1NjMwOVx1NWI5ZVx1OTY0NVx1NjBjNVx1NTFiNVx1OTAwOVx1NjJlOVx1OTcwMFx1ODk4MVx1NTE0OFx1ODhhYlx1NGZkZFx1NWI1OFx1NzY4NFx1N2YxNlx1OGY5MVx1NTY2OFx1MzAwMg0KLQ0KLSMgVGVtcGxhdGVEZXNjcmlwdGlvblBhZ2UNCi1mb3Jtc19UZW1wbGF0ZURlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnPVx1OTAwOVx1NjJlOVx1NzY4NFx1NjU4N1x1NGVmNlx1NWRmMlx1NjYyZlx1NmI2NFx1NmEyMVx1Njc3Zlx1NzY4NFx1OTY0NFx1NGVmNlx1MzAwMg0KLQ0KLSMgTmV3IExpYnJhcnkgRXJyb3IgRGlhbG9nDQotbmV3TGlicmFyeUVycm9yX21zZz1JVVBBMDAxNEU6IFx1NjVlMFx1NmNkNVx1NTIxYlx1NWVmYVx1NjViOVx1NmNkNVx1NWU5M1x1MzAwMg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24xPVx1NjMwN1x1NWI5YVx1NzY4NFx1NjViOVx1NmNkNVx1NWU5M1x1OGRlZlx1NWY4NFx1MjAxY3swfVx1MjAxZFx1NjVlMFx1NjU0OFx1MzAwMg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24yPVx1MjAxY3swfVx1MjAxZFx1NGUyZFx1NWRmMlx1NWI1OFx1NTcyOFx1NjViOVx1NmNkNVx1NWU5M1x1MzAwMg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24zPVx1NjVlMFx1NmNkNVx1NTIxYlx1NWVmYVx1NjMwN1x1NWI5YVx1NzY4NFx1NjViOVx1NmNkNVx1NWU5M1x1NjU4N1x1NGVmNlx1NTkzOVx1MjAxY3swfVx1MjAxZFx1MzAwMg0KLW5ld0xpYnJhcnlFcnJvcl9hZHZpY2U9XHU4YmY3XHU5MDA5XHU2MmU5XHUyMDFjXHU3ODZlXHU1YjlhXHUyMDFkXHVmZjBjXHU0ZTNhXHU1ZTkzXHU4ZjkzXHU1MTY1XHU1M2U2XHU0ZTAwXHU0ZTJhXHU1NDBkXHU3OWYwXHU2MjE2XHU4ZGVmXHU1Zjg0XHUzMDAyDQotDQotI1Byb2Nlc3MgbGl0ZXJhbHMNCi1Qcm9jZXNzX0V4dGVybmFsSUQ9XHU1OTE2XHU5MGU4XHU2ODA3XHU4YmM2XHVmZjFhDQotUHJvY2Vzc19QdXJwb3NlPVx1NzUyOFx1OTAxNFx1ZmYxYQ0KLVByb2Nlc3NfU2NvcGU9XHU4MzAzXHU1NmY0XHVmZjFhDQotUHJvY2Vzc19Vc2FnZU5vdGVzPVx1NGY3Zlx1NzUyOFx1NmNlOFx1OTFjYVx1ZmYxYQ0KLVByb2Nlc3NfQWx0ZXJuYXRpdmVzPVx1NjZmZlx1NGVlM1x1NjViOVx1Njg0OFx1ZmYxYQ0KLVByb2Nlc3NfSG93VG9TdGFmZj1cdTU5ODJcdTRmNTVcdTkxNGRcdTU5MDdcdTRlYmFcdTU0NThcdWZmMWENCi1Qcm9jZXNzX0tleUNvbnNpZGVyYXRpb249XHU1MTczXHU5NTJlXHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5XHVmZjFhDQotUHJvY2Vzc19TY2FsZT1cdTdiNDlcdTdlYTdcdWZmMWENCi1Qcm9jZXNzX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3M9XHU5ODc5XHU3NmVlXHU3Mjc5XHU1ZjgxXHVmZjFhDQotUHJvY2Vzc19SaXNrTGV2ZWw9XHU5OGNlXHU5NjY5XHU3ZWE3XHU1MjJiXHVmZjFhDQotUHJvY2Vzc19Fc3RpbWF0aW5nVGVjaG5pcXVlPVx1NGYzMFx1N2I5N1x1NjI4MFx1NjcyZlx1ZmYxYQ0KLVByb2Nlc3NfUHJvamVjdE1lbWJlckV4cGVydGlzZT1cdTk4NzlcdTc2ZWVcdTYyMTBcdTU0NThcdTRlMTNcdTk1N2ZcdWZmMWENCi1Qcm9jZXNzX1R5cGVPZkNvbnRyYWN0PVx1NTQwOFx1NTQwY1x1N2M3Ylx1NTc4Ylx1ZmYxYQ0KLQ0KLSMgRWRpdG9yIFByZXZpZXcgTmF2aWdhdGlvbiBCdXR0b25zDQotYmFja0J1dHRvbl90ZXh0PVx1NTQwZVx1OTAwMA0KLWZvcndhcmRCdXR0b25fdGV4dD1cdTUyNGRcdThmZGINCi1mb3J3YXJkX3RleHQ9XHU1MjRkXHU4ZmRiDQotc3RvcEJ1dHRvbl90ZXh0PVx1NTA1Y1x1NmI2Mg0KLXJlZnJlc2hCdXR0b25fdGV4dD1cdTUyMzdcdTY1YjANCi1yZWZyZXNoX3RleHQ9XHU1MjM3XHU2NWIwDQotbmV3bmFtZV90ZXh0PVx1NjViMFx1NTQwZFx1NzlmMFx1ZmYxYQ0KLXByaW50QnV0dG9uX3RleHQ9XHU2MjUzXHU1MzcwDQotDQotIyBDb250ZXh0IG1lbnVzDQotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPVx1NTIzN1x1NjViMCgmUikNCi1fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbT1cdTY2M2VcdTc5M2FcdTVjNWVcdTYwMjcoJlMpDQotDQotX1VJX01ldGhvZEVkaXRvcl9tZW51PVx1NjViOVx1NmNkNVx1N2YxNlx1OGY5MVx1NTY2OCgmTSkNCi1fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtPVx1NjViMFx1NWVmYSgmTikNCi1fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW09XHU2NWIwXHU1ZWZhXHU1NDBjXHU0ZWUzKCZFKQ0KLQ0KLV9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsPVx1OTAwOVx1NjJlOQ0KLV9VSV9QYXJlbnRQYWdlX2xhYmVsPVx1NzIzNg0KLV9VSV9MaXN0UGFnZV9sYWJlbD1cdTUyMTdcdTg4NjgNCi1fVUlfVHJlZVBhZ2VfbGFiZWw9XHU2ODExDQotX1VJX1RhYmxlUGFnZV9sYWJlbD1cdTg4NjgNCi1fVUlfVGFibGVUcmVlUGFnZV9sYWJlbD1cdTg4NjhcdTY4MTENCi1fVUlfT2JqZWN0Q29sdW1uX2xhYmVsPVx1NWJmOVx1OGM2MQ0KLV9VSV9TZWxmQ29sdW1uX2xhYmVsPVx1ODFlYVx1OGVhYg0KLQ0KLV9VSV9Ob09iamVjdFNlbGVjdGVkPVx1NjcyYVx1OTAwOVx1NjJlOVx1NGVmYlx1NGY1NVx1NWJmOVx1OGM2MQ0KLV9VSV9TaW5nbGVPYmplY3RTZWxlY3RlZD1cdTkwMDlcdTViOWFcdTc2ODRcdTViZjlcdThjNjFcdWZmMWF7MH0NCi1fVUlfTXVsdGlPYmplY3RTZWxlY3RlZD1cdTVkZjJcdTkwMDlcdTYyZTkgezB9IFx1NGUyYVx1NWJmOVx1OGM2MQ0KLQ0KLV9VSV9PcGVuRWRpdG9yRXJyb3JfbGFiZWw9XHU2MjUzXHU1ZjAwXHU3ZjE2XHU4ZjkxXHU1NjY4DQotDQotX1VJX1dpemFyZF9jYXRlZ29yeT1cdTc5M2FcdTRmOGIgRU1GIFx1NmEyMVx1NTc4Ylx1NTIxYlx1NWVmYVx1NTQxMVx1NWJmYw0KLQ0KLV9VSV9NZXRob2RNb2RlbFdpemFyZF9sYWJlbD1cdTY1YjlcdTZjZDVcdTZhMjFcdTU3OGINCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfZGVzY3JpcHRpb249XHU1MjFiXHU1ZWZhXHU2NWIwXHU2NWI5XHU2Y2Q1XHU2YTIxXHU1NzhiDQotDQotX1VJX01ldGhvZEVkaXRvcl9sYWJlbD1cdTY1YjlcdTZjZDVcdTZhMjFcdTU3OGJcdTdmMTZcdThmOTFcdTU2NjgNCi0NCi1fVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZT1cdTYyMTFcdTc2ODQNCi1fVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVFeHRlbnNpb249XHU2NWI5XHU2Y2Q1DQotDQotX1VJX1dpemFyZF9sYWJlbD1cdTY1YjBcdTVlZmENCi0NCi1fV0FSTl9GaWxlbmFtZUV4dGVuc2lvbj1cdTY1ODdcdTRlZjZcdTU0MGRcdTVmYzVcdTk4N2JcdTRlZTVcdTIwMWMuezB9XHUyMDFkXHU3ZWQzXHU1YzNlDQotDQotX1VJX01vZGVsT2JqZWN0PVx1NmEyMVx1NTc4Ylx1NWJmOVx1OGM2MQ0KLV9VSV9YTUxFbmNvZGluZz1YTUwgXHU3ZjE2XHU3ODAxDQotX1VJX1hNTEVuY29kaW5nQ2hvaWNlcz1VVEYtOCBBU0NJSSBVVEYtMTYgVVRGLTE2QkUgVVRGLTE2TEUgSVNPLTg4NTktMQ0KLV9VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb249XHU5MDA5XHU2MmU5XHU4OTgxXHU1MjFiXHU1ZWZhXHU3Njg0XHU2YTIxXHU1NzhiXHU1YmY5XHU4YzYxDQotDQotX1VJX0ZpbGVDb25mbGljdF9sYWJlbD1cdTY1ODdcdTRlZjZcdTUxYjJcdTdhODENCi1fV0FSTl9GaWxlQ29uZmxpY3Q9XHU2NzA5XHU2NzJhXHU0ZmRkXHU1YjU4XHU3Njg0XHU2NmY0XHU2NTM5XHU0ZTBlXHU1NzI4XHU3ZjE2XHU4ZjkxXHU1NjY4XHU1OTE2XHU0ZjVjXHU1MWZhXHU3Njg0XHU2NmY0XHU2NTM5XHU1MWIyXHU3YTgxXHUzMDAyXHU2NjJmXHU1NDI2XHU4OTgxXHU1ZTlmXHU1ZjAzXHU2YjY0XHU3ZjE2XHU4ZjkxXHU1NjY4XHU3Njg0XHU2NmY0XHU2NTM5XHVmZjFmDQotDQotIyBBZGQgTGluayBEaWFsb2cNCi1hZGRMaW5rRGlhbG9nX2xpbmtUeXBlPVx1N2M3Ylx1NTc4Ylx1ZmYxYQ0KLW9wZW5MaW5rQ2hlY2tib3hfdGV4dD1cdTU3MjhcdTUzZTZcdTRlMDBcdTRlMmFcdTZkNGZcdTg5YzhcdTU2NjhcdTdhOTdcdTUzZTNcdTRlMmRcdTYyNTNcdTVmMDBcdTk0ZmVcdTYzYTUNCi0NCi0jIEFkZCBJbWFnZSBEaWFsb2cNCi1oZWlnaHRMYWJlbF90ZXh0PVx1OWFkOFx1NWVhNlx1ZmYxYQ0KLXdpZHRoTGFiZWxfdGV4dD1cdTViYmRcdTVlYTZcdWZmMWENCi1FbGVtZW50c1ZpZXdfMjA9XHU4MGZkXHU1MjliXHU2YTIxXHU1ZjBmDQotRWxlbWVudHNWaWV3XzIxPVx1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYg0KLUVsZW1lbnRzVmlld18yMj1cdTZkNDFcdTdhMGINCi1FbGVtZW50c1ZpZXdfMzU9ezB9IFx1NGUzYVx1NTNlYVx1OGJmYlx1MzAwMlx1OGJmN1x1NWMwNlx1NWI4M1x1OGJiZVx1NGUzYVx1NTNlZlx1NTE5OVx1ZmYwY1x1NzEzNlx1NTQwZVx1NTE4ZFx1N2VlN1x1N2VlZFx1MzAwMg0KLUVsZW1lbnRzVmlld18zNj1cdTg4YzVcdTUxNjVcdTVlOTNcdTY1ZjZcdTUxZmFcdTk1MTkNCi1hbHRUYWdMYWJlbF90ZXh0PUFMVCBcdTY4MDdcdThiYjBcdWZmMWENCi1pbWFnZVNpemVMYWJlbF90ZXh0PVx1NTZmZVx1NTBjZlx1NzY4NFx1OWFkOFx1NWVhNlx1NTQ4Y1x1NWJiZFx1NWVhNlx1NWZjNVx1OTg3Ylx1ODFmM1x1NWMxMVx1NGUzYSAxMFx1ZmYwY1x1NGY0Nlx1NGUwZFx1ODBmZFx1OGQ4NVx1OGZjNyA2MDBcdTMwMDJcdTY1ZTBcdTY1NDhcdTlhZDhcdTVlYTZcdTU0OGNcdTViYmRcdTVlYTZcdTVjMDZcdThmNmNcdTYzNjJcdTRlM2FcdTU0MDhcdTkwMDJcdTU5MjdcdTVjMGZcdTMwMDINCi0NCi0jIFByb2Nlc3MgRWRpdG9yDQotUHJvY2Vzc0VkaXRvcj1Qcm9jZXNzRWRpdG9yDQotUHJvY2Vzc0VkaXRvcl9OYW1lPVx1NTQwZFx1NzlmMA0KLVByb2Nlc3NFZGl0b3JfUHJlc2VudGF0aW9uTmFtZT1cdTY2M2VcdTc5M2FcdTU0MGRcdTc5ZjANCi1Qcm9jZXNzRWRpdG9yX0luZGV4PVx1N2QyMlx1NWYxNQ0KLVByb2Nlc3NFZGl0b3JfUHJlZGVjZXNzb3JzPVx1NTE0OFx1ODg0Y1x1NGY1Y1x1NGUxYQ0KLSNDb25maWd1cmF0aW9uUGFnZV9TZWxlY3RlZD1TZWxlY3RlZDogDQotQ2hlY2tsaXN0T3JkZXJfZGVzY3JpcHRpb249XHU5MDA5XHU2MmU5XHU2N2QwXHU0ZTJhXHU2OGMwXHU2N2U1XHU5ODc5XHVmZjBjXHU3MTM2XHU1NDBlXHU1MzU1XHU1MWZiXHUyMDFjXHU1NDExXHU0ZTBhXHUyMDFkXHU2MjE2XHUyMDFjXHU1NDExXHU0ZTBiXHUyMDFkXHVmZjBjXHU1M2VmXHU2NmY0XHU2NTM5XHU1YjgzXHU3Njg0XHU5ODdhXHU1ZThmXHUzMDAyDQotRWxlbWVudHNWaWV3X3JlbmFtaW5nX3RleHQ9XHU2YjYzXHU1NzI4XHU5MWNkXHU1NDdkXHU1NDBkLi4uDQotUHJvY2Vzc0VkaXRvcl9Nb2RlbEluZm89XHU2YTIxXHU1NzhiXHU0ZmUxXHU2MDZmDQotUHJvY2Vzc0VkaXRvcl9QcmVmaXg9XHU1MjRkXHU3ZjAwDQotTW92ZURpYWxvZ19tb3ZlX3RleHQ9XHU3OWZiXHU1MmE4DQotQ2hlY2tsaXN0T3JkZXJfdGl0bGU9XHU1YmY5XHU2OGMwXHU2N2U1XHU5ODc5XHU2MzkyXHU1ZThmDQotUHJvY2Vzc0VkaXRvcl9SZXBldGFibGU9XHU1M2VmXHU5MWNkXHU1OTBkDQotUHJvY2Vzc0VkaXRvcl9PbmdvaW5nPVx1NmI2M1x1NTcyOFx1OGZkYlx1ODg0Yw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N5bmNocm9uaXphdGlvbj1cdTU0MGNcdTZiNjUuLi4NCi1Qcm9jZXNzRWRpdG9yX0V2ZW50RHJpdmVuPVx1NGU4Ylx1NGVmNlx1OWE3MVx1NTJhOA0KLVByb2Nlc3NFZGl0b3JfRGVsaXZlcmFibGU9XHU1M2VmXHU0ZWE0XHU0ZWQ4XHU0ZWY2DQotUHJvY2Vzc0VkaXRvcl9PcHRpb25hbD1cdTUzZWZcdTkwMDkNCi1GaWx0ZXJEaWFsb2dfVHlwZV90ZXh0PVx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMFx1N2M3Ylx1NTc4Ylx1ZmYxYQ0KLUZpbHRlckRpYWxvZ19FeHBhbmRBbGw9XHU1MTY4XHU5MGU4XHU1YzU1XHU1ZjAwDQotTW92ZURpYWxvZ19tb3ZpbmdfdGV4dD1cdTZiNjNcdTU3MjhcdTc5ZmJcdTUyYTguLi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWRTaGFwZUljb25XYXJuaW5nPUlVUEEwMDI1VzogXHU4ZGVmXHU1Zjg0IHsxfSBcdTRlMmRcdTY3MmFcdTYyN2VcdTUyMzAgezB9IFx1NzY4NFx1NWY2Mlx1NzJiNlx1NTZmZVx1NjgwNw0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbkVycm9yPUlVUEEwMDI1RTogXHU5NTE5XHU4YmVmXHVmZjFhXHU1ZjYyXHU3MmI2XHU1NmZlXHU2ODA3XHU5MGU4XHU1MjA2XHVmZjFhezB9DQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9OYW1lTGFiZWw9XHU1NDBkXHU3OWYwXHVmZjFhDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1cdTUyMWJcdTVlZmFcdTY1YjBcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmUNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfTmFtZUxhYmVsPVx1NTQwZFx1NzlmMFx1ZmYxYQ0KLUF1dGhvcmluZ1VJUGx1Z2luX25ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGU9XHU2NWIwXHU1ZWZhXHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VUaXRsZT1cdTUyMWJcdTVlZmFcdTY1YjBcdTY1YjlcdTZjZDVcdTVlOTMNCi1uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlPVx1NjViMFx1NWVmYVx1NjViOVx1NmNkNVx1NWU5Mw0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlVGl0bGU9XHU0ZmRkXHU1YjU4XHU2NmY0XHU2NTM5DQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1cdTRlM2FcdTY1YjBcdTY1YjlcdTZjZDVcdTVlOTNcdTYzMDdcdTViOWFcdTU0MGRcdTc5ZjBcdTMwMDFcdTYzY2ZcdThmZjBcdTU0OGNcdTc2ZWVcdTY4MDdcdTc2ZWVcdTVmNTVcdTMwMDINCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZURlc2NyaXB0aW9uPVx1NGZlZVx1NjUzOVx1NGU4Nlx1NGUwMFx1NGUyYVx1NjIxNlx1NTkxYVx1NGUyYVx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMFx1MzAwMlx1OGJmN1x1OTAwOVx1NjJlOVx1OTcwMFx1ODk4MVx1NGZkZFx1NWI1OFx1NzY4NFx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMFx1MzAwMg0KLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZVRpdGxlPVx1NjI1M1x1NWYwMFx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZQ0KLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uV2l6YXJkX3dpbmRvd1RpdGxlPVx1NjI1M1x1NWYwMFx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZQ0KLUVsZW1lbnRzVmlld19yZXBsYWNlaW5nd2l0aGZvcm1hdF90ZXh0PVx1NmI2M1x1NTcyOFx1NjZmZlx1NjM2MiB7MH0uLi4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbldhcm5pbmc9SVVQQTAwMjZXOiBcdThkZWZcdTVmODQgezF9IFx1NGUyZFx1NjcyYVx1NjI3ZVx1NTIzMCB7MH0gXHU3Njg0XHU4MjgyXHU3MGI5XHU1NmZlXHU2ODA3DQotTWVzc2FnZUxhYmVsUHJvdmlkZXJfdW5zZWxlY3RlZHBhY2thZ2VzPVx1MjAxY3swfVx1MjAxZFx1NTMwNVx1NTQyYlx1NjdkMFx1NGU5Ylx1NTE0M1x1N2QyMFx1ZmYwY1x1OGZkOVx1NGU5Ylx1NTE0M1x1N2QyMFx1NWYxNVx1NzUyOFx1NjcyYVx1OTAwOVx1NWI5YVx1N2EwYlx1NWU4Zlx1NTMwNVx1NGUyZFx1NzY4NFx1NTE0M1x1N2QyMA0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uRXJyb3I9SVVQQTAwMjZFOiBcdTk1MTlcdThiZWZcdWZmMWFcdTgyODJcdTcwYjlcdTU2ZmVcdTY4MDdcdTkwZThcdTUyMDZcdWZmMWF7MH0NCi1TdGVwc09yZGVyRGlhbG9nX3N0ZXBzPVx1NmI2NVx1OWFhNFx1ZmYxYQ0KLVN0ZXBzT3JkZXJEaWFsb2dfdGl0bGU9XHU1YmY5XHU0ZWZiXHU1MmExXHU2YjY1XHU5YWE0XHU2MzkyXHU1ZThmDQotUHJvY2Vzc0VkaXRvcl9QbGFubmVkPVx1NWRmMlx1ODljNFx1NTIxMg0KLXNwZWNpZnlkaXJlY3RvcnlfdGV4dD1cdThiZjdcdTYzMDdcdTViOWFcdTRmZGRcdTViNThcdTY1YjlcdTZjZDVcdTVlOTNcdTc2ODRcdTc2ZWVcdTVmNTUNCi1Qcm9jZXNzRWRpdG9yX011bHRpcGxlT2NjdXJyZW5jZXM9XHU1OTFhXHU2YjIxXHU1MWZhXHU3M2IwDQotUHJvY2Vzc0VkaXRvcl9FbnRyeVN0YXRlPVx1OGZkYlx1NTE2NVx1NzJiNlx1NjAwMQ0KLVByb2Nlc3NFZGl0b3JfRXhpdFN0YXRlPVx1OTAwMFx1NTFmYVx1NzJiNlx1NjAwMQ0KLXNlbGVjdENvbHVtbnN0b0FkZF90ZXh0PVx1OTAwOVx1NjJlOVx1ODk4MVx1NmRmYlx1NTJhMFx1NzY4NFx1NTIxNw0KLVByb2Nlc3NFZGl0b3JfVHlwZT1cdTdjN2JcdTU3OGINCi1Qcm9jZXNzRWRpdG9yX1RlYW09XHU1NmUyXHU5NjFmDQotRmlsdGVyRGlhbG9nX3RpdGxlPVx1OTAwOVx1NjJlOVx1NWJmOVx1OGJkZFx1Njg0Nlx1ZmYxYQ0KLQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZD1cdTRlY2VcdTY1YjlcdTZjZDVcdTUxODVcdTViYjlcdTZkZmJcdTUyYTAoJk0pLi4uDQotRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsPVx1NTE2OFx1OTBlOFx1NjI5OFx1NTNlMA0KLU9wZW5DaGVhdHNoZWV0Vmlld190aXRsZT1cdTYyNTNcdTVmMDBcdTU5MDdcdTVmZDhcdTUzNTVcdTg5YzZcdTU2ZmUNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Sb2xsVXA9XHU0ZTBhXHU2ZWRhDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbERvd249XHU0ZTBiXHU2ZWRhDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZVVwPVx1NGUwYVx1NzlmYigmTykNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlRG93bj1cdTRlMGJcdTc5ZmIoJlcpDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsPVx1NjYzZVx1NzkzYSgmQSkNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Db3B5PVx1NTkwZFx1NTIzNigmQykuLi4NCi1GaWx0ZXJEaWFsb2dfUGF0dGVybl90ZXh0PVx1NTQwZFx1NzlmMFx1NmEyMVx1NWYwZlx1ZmYwOFx1NWMwNlx1NjYzZVx1NzkzYVx1NTMzOVx1OTE0ZFx1NzY4NFx1NTQwZFx1NzlmMFx1ZmYwOVx1ZmYxYQ0KLQ0KLU1ldGhvZExpYnJhcnlFZGl0b3JfdGl0bGU9XHU2NWI5XHU2Y2Q1XHU1ZTkzXHVmZjFhDQotI01lc3NhZ2VWaWV3X3NlbGVjdGVkX3RleHQ9U2VsZWN0ZWQ6IA0KLU1lc3NhZ2VWaWV3X2Vycm1zZ190ZXh0PVx1NjNjZlx1OGZmMA0KLUVsZW1lbnRzVmlld19lcnJfc2F2aW5nPUlVUEEwMDI3RTogXHU0ZmRkXHU1YjU4XHUyMDFjezB9XHUyMDFkezF9IFx1NjVmNlx1NTFmYVx1OTUxOQ0KLQ0KLWVycl9jb3B5aW5nX2ZpbGVfdGl0bGU9XHU1OTBkXHU1MjM2XHU2NTg3XHU0ZWY2XHU2NWY2XHU1MWZhXHU5NTE5DQotZXJyX2NvcHlpbmdfZmlsZV9lcnJvcj1JVVBBMDAyOEU6IFx1NjVlMFx1NmNkNVx1NTIwNlx1OTE0ZFx1OGJlNVx1NTZmZVx1NjgwN1x1MzAwMg0KLWVycl9jb3B5aW5nX2ZpbGVfcmVhc29uPVx1NTkwZFx1NTIzNlx1OTAwOVx1NWI5YVx1NjU4N1x1NGVmNlx1NjVmNlx1NTFmYVx1OTUxOVx1MzAwMlx1OGJmN1x1NTM1NVx1NTFmYlx1MjAxY1x1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MjAxZFx1ZmYwY1x1ODNiN1x1NTNkNlx1NjZmNFx1NTkxYVx1NGZlMVx1NjA2Zlx1MzAwMg0KLWVycl9wcm9jZXNzaW5nX2ZpbGVfdGl0bGU9XHU1OTA0XHU3NDA2XHU2NTg3XHU0ZWY2XHU2NWY2XHU1MWZhXHU5NTE5DQotZWRpdENvbmZpZ3VyYXRpb25fdG9vbHRpcD1cdTdmMTZcdThmOTFcdTkxNGRcdTdmNmUNCi1lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQ9SVVQQTAwMTVFOiBcdTY1ZTBcdTZjZDVcdTdmMTZcdThmOTFcdTUxNDNcdTdkMjANCi1TYXZlVGhpc0FjdGlvbl9zYXZlb2JqZWN0PVx1NGZkZFx1NWI1OFx1NmI2NFx1NWJmOVx1OGM2MS4uLg0KLUVsZW1lbnRzVmlld19yZXBsYWNlX3RleHQ9XHU2NmZmXHU2MzYyDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRXh0ZW5kPVx1NjI2OVx1NWM1NSgmRSkuLi4NCi1Nb3ZlRGlhbG9nX2Rlc3RpbmF0aW9uX3RleHQ9XHU5MDA5XHU2MmU5XHU5MDA5XHU1YjlhXHU1MTQzXHU3ZDIwXHU3Njg0XHU3NmVlXHU2ODA3XHU0ZjRkXHU3ZjZlXHVmZjFhDQotY2hvb3NlRGVmYXVsdERpcmVjdG9yeV90ZXh0PVx1OTAwOVx1NjJlOVx1NWU5M1x1NzY4NFx1N2YzYVx1NzcwMVx1NzZlZVx1NWY1NVx1ZmYxYQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzPVx1NjI5MVx1NTIzNigmUykNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzczI9XHU1M2QxXHU1ZTAzXHU5MDA5XHU5ODc5KCZQKS4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0Fzc2lnblVzZXJEaWFncmFtPVx1NzUyOFx1NjIzN1x1NWI5YVx1NGU0OVx1NTZmZSgmVSkuLi4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdGl0bGU9XHU1MjA2XHU5MTRkXHU3NTI4XHU2MjM3XHU1YjlhXHU0ZTQ5XHU1NmZlDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkSW1hZ2U9XHU2ZDNiXHU1MmE4XHU1NmZlXHVmZjFhDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkZEltYWdlPVx1NmQzYlx1NTJhOFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1NTZmZVx1ZmYxYQ0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ193cGRJbWFnZT1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTRmOWRcdThkNTZcdTUxNzNcdTdjZmJcdTU2ZmVcdWZmMWENCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfbm90YUZpbGU9SVVQQTAwMDRFOiBcdTYzMDdcdTViOWFcdTc2ODRcdThkZWZcdTVmODRcdTRlMGRcdTY2MmZcdTY1ODdcdTRlZjZcdTMwMDINCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYXNzaWduQnV0dG9uPVx1OTAwOVx1NjJlOS4uLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19lbnRlcmVkSW1hZ2VOb3RGb3VuZD1JVVBBMDAyNEU6IFx1NjMwN1x1NWI5YVx1NzY4NFx1NTZmZVx1NTBjZlx1NTcyOFx1NWU5M1x1NGUyZFx1NGUwZFx1NWI1OFx1NTcyOFx1MzAwMlx1OGJmN1x1Nzg2ZVx1NGZkZFx1OGY5M1x1NTE2NVx1NGUwZVx1NWU5M1x1NjgzOVx1NzZlZVx1NWY1NVx1NzZmOFx1NWJmOVx1NzY4NFx1OGRlZlx1NWY4NFx1MzAwMg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19zZWxlY3RlZEltYWdlTm90Rm91bmQ9SVVQQTAwMzBFOiBcdTYwYThcdTkwMDlcdTYyZTlcdTc2ODRcdTU2ZmVcdTUwY2ZcdTRlMGRcdTU3MjhcdTVlOTNcdTRlMmRcdTMwMDINCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURJbWFnZT1cdTRmN2ZcdTc1MjhcdTZkM2JcdTUyYThcdTU2ZmVcdTU2ZmVcdTUwY2ZcdThmZGJcdTg4NGNcdTZkNGZcdTg5YzhcdTU0OGNcdTUzZDFcdTVlMDMNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURESW1hZ2U9XHU0ZjdmXHU3NTI4XHU2ZDNiXHU1MmE4XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHU1NmZlXHU1NmZlXHU1MGNmXHU4ZmRiXHU4ODRjXHU2ZDRmXHU4OWM4XHU1NDhjXHU1M2QxXHU1ZTAzDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZVdQREltYWdlPVx1NGY3Zlx1NzUyOFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NGY5ZFx1OGQ1Nlx1NTE3M1x1N2NmYlx1NTZmZVx1NTZmZVx1NTBjZlx1OGZkYlx1ODg0Y1x1NmQ0Zlx1ODljOFx1NTQ4Y1x1NTNkMVx1NWUwMw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvbnRyaWJ1dGU9XHU2NzJjXHU1NzMwXHU2M2QwXHU0ZjliDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmVwbGFjZT1cdTY3MmNcdTU3MzBcdTY2ZmZcdTYzNjINCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9EaWFncmFtcz1cdTU2ZmUoJkcpDQotUHJvY2Vzc0VkaXRvcl9hY3Rpb25fZGVlcENvcHk9XHU2ZGYxXHU1YzQyXHU1OTBkXHU1MjM2KCZEKS4uLg0KLUZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uPVx1N2I4MFx1ODk4MVx1NjNjZlx1OGZmMFx1ZmYxYQ0KLUNvbmZpZ3VyYXRpb25QYWdlX2hpZGVUb29sVGlwPVx1NjYzZVx1NzkzYVx1ZmYwZlx1OTY5MFx1ODVjZlx1NjcyYVx1OTAwOVx1NGUyZFx1NzY4NFx1NTE0M1x1N2QyMA0KLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uPVx1NjNjZlx1OGZmMFx1ZmYxYQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzQWxsPVx1NGUwZFx1NTNkMVx1NWUwMw0KLUZpbHRlckRpYWxvZ19QYXR0ZXJuX2Rlc2NyaXB0aW9uPVx1NmEyMVx1NWYwZlx1NGVlNVx1OTAxN1x1NTNmN1x1OTY5NFx1NWYwMFx1ZmYwY1x1NTE3Nlx1NGUyZCAqIFx1ODg2OFx1NzkzYVx1NGVmYlx1NjEwZlx1NWI1N1x1N2IyNlx1NGUzMlx1ZmYwYz8gXHU4ODY4XHU3OTNhXHU0ZWZiXHU2MTBmXHU1YjU3XHU3YjI2DQotQ29uZmlndXJhdGlvblBhZ2VfVHJlZVRpdGxlTGFiZWw9XHU1MTg1XHU1YmI5XHVmZjFhDQotQ29uZmlndXJhdGlvblBhZ2VfTG9hZGluZ01lc3NhZ2U9XHU2YjYzXHU1NzI4XHU4OGM1XHU1MTY1XHU5MTRkXHU3ZjZlXHVmZjBjXHU4YmY3XHU3YTBkXHU1MDE5IC4uLg0KLU1vdmVEaWFsb2dfdmFsaWRkZXN0aW5hdGlvbl90ZXh0PVx1NjMwN1x1NWI5YVx1NzY4NFx1NzlmYlx1NTJhOFx1NzZlZVx1NjgwN1x1NGY0ZFx1N2Y2ZVx1NjVlMFx1NjU0OFx1MzAwMg0KLU1vdmVEaWFsb2dfY2Fubm90TW9kaWZ5RGVzdGluYXRpb249SVVQQTAwMzRFOiBcdTY1ZTBcdTZjZDVcdTRmZWVcdTY1MzlcdTkwMDlcdTViOWFcdTc2ODRcdTc2ZWVcdTY4MDdcdTRmNGRcdTdmNmVcdTMwMDINCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGw9XHU1MTY4XHU5MGU4XHU1M2QxXHU1ZTAzDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkJhc2VBY3Rpdml0eT1cdTYyNTNcdTVmMDBcdTU3ZmFcdTY3MmNcdTZkM2JcdTUyYTgNCi1Qcm9jZXNzRm9ybUVkaXRvcl9leHBhbkFsbEFjdGlvbkxhYmVsPVx1NTE2OFx1OTBlOFx1NWM1NVx1NWYwMCgmWCkNCi1Qcm9jZXNzRm9ybUVkaXRvcl9jb2xsYXBzZUFsbEFjdGlvbkxhYmVsPVx1NTE2OFx1OTBlOFx1NjI5OFx1NTNlMCgmTCkNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEaWFncmFtPVx1NjI1M1x1NWYwMFx1NmQzYlx1NTJhOFx1NTZmZSgmQSkNCi1Qcm9jZXNzRWRpdG9yX3Byb21wdFRvRGVsZXRlQmVmb3JlUmV2ZWFsPVx1NWZjNVx1OTg3Ylx1NTIyMFx1OTY2NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1NGUyZFx1NTIxN1x1NTFmYVx1NzY4NFx1NjcyYVx1NjI5MVx1NTIzNlx1NzY4NFx1NjNjZlx1OGZmMFx1N2IyNlx1ZmYwY1x1NGVlNVx1OTA3Zlx1NTE0ZFx1NTcyOFx1NWM1NVx1NzkzYVx1OTAwOVx1NWI5YVx1NTE0M1x1N2QyMFx1NTQwZVx1NTFmYVx1NzNiMFx1OTFjZFx1NTkwZFx1MzAwMlx1NTk4Mlx1Njc5Y1x1ODk4MVx1NTIyMFx1OTY2NFx1NWI4M1x1NGVlY1x1NWU3Nlx1N2VlN1x1N2VlZFx1NGUwYlx1NTNiYlx1ZmYwY1x1OGJmN1x1NTM1NVx1NTFmYlx1MjAxY1x1Nzg2ZVx1NWI5YVx1MjAxZFx1MzAwMg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9TZWxlY3RDb2x1bW5zPVx1OTAwOVx1NjJlOVx1ODk4MVx1NmRmYlx1NTJhMFx1NzY4NFx1NTIxNw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURldGFpbERpYWdyYW09XHU2MjUzXHU1ZjAwXHU2ZDNiXHU1MmE4XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHU1NmZlKCZEKQ0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9Db2x1bW5TZWxlY3Rpb249XHU1MjE3XHU5MDA5XHU2MmU5XHVmZjFhDQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N3aXRjaENvbmZpZ3VyYXRpb249XHU1NzI4XHU2ZmMwXHU2ZDNiXHUyMDFjXHU2ZDQxXHU3YTBiXHUyMDFkXHU3ZjE2XHU4ZjkxXHU1NjY4XHU2NWY2XHU1MjA3XHU2MzYyXHU1MjMwXHU2ZDQxXHU3YTBiXHU3Njg0XHU3ZjNhXHU3NzAxXHU5MTRkXHU3ZjZlDQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N1cHByZXNzaW9uR3JvdXBUaXRsZT1cdTYyOTFcdTUyMzYNCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfaW5oZXJpdFN1cHByZXNzaW9uU3RhdGU9XHU3ZWU3XHU2MjdmXHU2MjkxXHU1MjM2XHU3MmI2XHU2MDAxDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW09XHU2MjUzXHU1ZjAwXHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU0ZjlkXHU4ZDU2XHU1MTczXHU3Y2ZiXHU1NmZlKCZXKQ0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19DbGVhckJ1dHRvbkxhYmVsPVx1NmUwNVx1OTY2NA0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsPVx1OTAwOVx1NjJlOS4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0luc2VydE5ld1BoYXNlPVx1NjNkMlx1NTE2NVx1NjViMFx1OTYzNlx1NmJiNQ0KLVZpZXdIZWxwZXJfcmVsb2FkTGliT25Sb2xsYmFja0Vycm9yPVx1NjVlMFx1NmNkNVx1NGVjZVx1NjMwMVx1NGU0NVx1NjAyN1x1OTUxOVx1OGJlZlx1NjA2Mlx1NTkwZFx1MzAwMlx1OTcwMFx1ODk4MVx1OTFjZFx1NjViMFx1ODhjNVx1NTE2NVx1NWU5M1x1ZmYwY1x1NjA2Mlx1NTkwZFx1NWI4M1x1NzY4NFx1NTM5Zlx1NTljYlx1NzJiNlx1NjAwMVx1MzAwMg0KLVZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRfdGV4dD1cdTUxNDNcdTdkMjBcdTIwMWN7MH1cdTIwMWRcdTVkZjJcdTUyMjBcdTk2NjRcdTMwMDINCi1WaWV3SGVscGVyX2FscmVhZHlkZWxldGVkY29uZmlybV90ZXh0PVx1NTE0M1x1N2QyMFx1MjAxY3swfVx1MjAxZFx1NWRmMlx1NTIyMFx1OTY2NFx1MzAwMlx1NjYyZlx1NTQyNlx1ODk4MVx1NGVjZVx1MjAxY3sxfVx1MjAxZFx1NGUyZFx1OTY2NFx1NTNiYlx1NWI4M1x1ZmYxZg0KLUNvbmZpZ3VyYXRpb25QYWdlX0FkZE1pc3NpbmdUb29sVGlwPVx1NmRmYlx1NTJhMFx1N2YzYVx1NWMxMVx1NzY4NFx1NWYxNVx1NzUyOA0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uPVx1NjNjZlx1OGZmMA0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkdlbmVyYWxJbmZvPVx1NWUzOFx1ODljNFx1NGZlMVx1NjA2Zg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FwcGx5UGF0dGVybj1cdTVlOTRcdTc1MjhcdTZhMjFcdTVmMGYoJlQpDQotTW92ZURpYWxvZ19zZWxlY3RkZXN0aW5hdGlvbl90ZXh0PVx1OGJmN1x1OTAwOVx1NjJlOVx1NzZlZVx1NjgwN1x1NGY0ZFx1N2Y2ZVx1MzAwMg0KLU1vdmVEaWFsb2dfbm9tb3ZlX2Rlc3RpbmF0aW9uX3Byb2JsZW1fbXNnPVx1NjcyYVx1NjMwN1x1NWI5YVx1NzlmYlx1NTJhOFx1NzZlZVx1NjgwN1x1NGY0ZFx1N2Y2ZVx1MzAwMg0KLU1ldGhvZExpYnJhcnlFZGl0b3JfdHJvdWJsZW9iamVjdD1cdTk1ZWVcdTk4OThcdTViZjlcdThjNjFcdWZmMWENCi1NZXNzYWdlTGFiZWxQcm92aWRlcl9lcnJjaGlsZHBrZ3M9XHU1YjUwXHU1MTg1XHU1YmI5XHU1MzA1XHU2MjE2XHU2ZDQxXHU3YTBiXHU1MzA1XHU1NDJiXHU1ZTI2XHU2NzA5XHU3ZjNhXHU1YzExXHU1ZjE1XHU3NTI4XHU3Njg0XHU1MTQzXHU3ZDIwDQotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19UaXRsZT1cdTU2ZmVcdTUzZDFcdTVlMDNcdTkwMDlcdTk4NzkNCi1Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX01lc3NhZ2U9XHU4YmY3XHU5MDA5XHU2MmU5XHU4OTgxXHU1M2QxXHU1ZTAzXHU3Njg0XHU1NmZlXHU2MjE2XHU1M2Q2XHU2ZDg4XHU5MDA5XHU2MmU5XHU0ZTBkXHU1M2QxXHU1ZTAzXHU3Njg0XHU1NmZlDQotUHJvY2Vzc0VkaXRvcl9UaXRsZT1cdTZkNDFcdTdhMGJcdTdmMTZcdThmOTFcdTU2NjhcdWZmMWENCi1TYXZlQXN3aXRoZG90c190ZXh0PVx1NTNlNlx1NWI1OFx1NGUzYS4uLg0KLVByb2Nlc3NFZGl0b3JfV29ya0JyZWFrZG93blN0cnVjdHVyZT1cdTVkZTVcdTRmNWNcdTUyMDZcdTg5ZTNcdTdlZDNcdTY3ODQNCi1Qcm9jZXNzRWRpdG9yX1RlYW1BbGxvY2F0aW9uPVx1NTZlMlx1OTYxZlx1NTIwNlx1OTE0ZA0KLVByb2Nlc3NFZGl0b3JfV29ya1Byb2R1Y3RVc2FnZT1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTRmN2ZcdTc1MjgNCi1Qcm9jZXNzRWRpdG9yX0NvbnNvbGlkYXRlZFZpZXc9XHU1NDA4XHU1ZTc2XHU4OWM2XHU1NmZlDQotUHJvY2Vzc0VkaXRvcl9jb25maXJtQXV0b1N5bmNoPVx1NmI2NFx1NjRjZFx1NGY1Y1x1NTIzN1x1NjViMFx1OTAwOVx1NWI5YVx1NzY4NFx1NjNjZlx1OGZmMFx1N2IyNlx1ZmYwY1x1NjIxNlx1NTIzN1x1NjViMFx1OTAwOVx1NWI5YVx1NmQzYlx1NTJhOFx1NGUwYlx1NzY4NFx1MzAwMVx1NTcyOFx1NTQwNFx1ODFlYVx1MjAxY1x1NWM1ZVx1NjAyN1x1MjAxZFx1ODljNlx1NTZmZVx1MjAxY1x1NWUzOFx1ODljNFx1MjAxZFx1OTAwOVx1OTg3OVx1NTM2MVx1NGUyZFx1NjgwN1x1NGUzYVx1MjAxY1x1NWRmMlx1NGUwZVx1NmU5MFx1NTQwY1x1NmI2NVx1MjAxZFx1NzY4NFx1NjI0MFx1NjcwOVx1NjNjZlx1OGZmMFx1N2IyNlx1MzAwMlx1NWI4M1x1NGVlNVx1NmQ0MVx1N2EwYlx1N2YzYVx1NzcwMVx1OTE0ZFx1N2Y2ZVx1NGUwYlx1NzY4NFx1OTRmZVx1NjNhNVx1NjViOVx1NmNkNVx1NTE4NVx1NWJiOVx1NTE0M1x1N2QyMFx1NzY4NFx1NTM5Zlx1NTljYlx1NWM1ZVx1NjAyN1x1NTIzN1x1NjViMFx1OGZkOVx1NGU5Ylx1NjNjZlx1OGZmMFx1N2IyNlx1MzAwMlx1OGJmN1x1NmNlOFx1NjEwZlx1ZmYxYVx1NWI4M1x1NGUwZFx1NGYxYVx1NjZmNFx1NjViMFx1NjI0MFx1NjcwOVx1NTJhOFx1NjAwMVx1OTRmZVx1NjNhNVx1NzY4NFx1NjNjZlx1OGZmMFx1N2IyNlx1ZmYwOFx1NGVlNVx1N2VmZlx1ODI3Mlx1NjU5Y1x1NGY1M1x1NjYzZVx1NzkzYVx1ZmYwOVx1MzAwMlx1NjYyZlx1NTQyNlx1ODk4MVx1N2VlN1x1N2VlZFx1ZmYxZg0KLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMT1cdTkxNGRcdTdmNmUNCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjI9XHU2M2QyXHU0ZWY2XHU1NDhjXHU1MzA1XHU5MDA5XHU2MmU5DQotTmV3TGlicmFyeURpYWxvZ19uZXdsaWJyYXJ5X2FzPVx1NWMwNlx1NjViMFx1NWU5M1x1NTIxYlx1NWVmYVx1NGUzYQ0KLU5ld1BsdWdpbkRpYWxvZ19uZXdwbHVnaW5fdGV4dD1cdTY1YjBcdTVlZmFcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjYNCi1TZWxlY3RFbGVtZW50RGlhbG9nX3RpdGxlX3RleHQ9XHU5MDA5XHU2MmU5XHU1MTQzXHU3ZDIwXHU2MjE2XHU5MDA5XHU2MmU5XHU1MTQzXHU3ZDIwXHU3Njg0XHU0ZTAwXHU0ZTJhXHU2M2QwXHU0ZjliXHU4MDA1XHVmZjFhDQotT3BlbkNvbmZpZ0RpYWxvZ25ld2NvbmZpZ190ZXh0PVx1NjViMFx1OTE0ZFx1N2Y2ZVx1ZmYxYQ0KLXByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZV9CU0VkaXRvcj1cdTZkNDFcdTdhMGJcdTdmMTZcdThmOTFcdTU2NjgNCi0NCi0jIEFic3RyYWN0RGlhZ3JhbUVkaXRvcg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1cdTViZjlcdTlmNTANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1cdTRlY2VcdTU3ZmFcdTY3MmNcdTZkM2JcdTUyYThcdTUyMzdcdTY1YjANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9XHU2ODNjXHU1ZjBmXHU2NTg3XHU2NzJjXHU2ODQ2Li4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1cdTZjMzRcdTVlNzNcdTVjNDVcdTRlMmRcdTViZjlcdTlmNTANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PVx1NmMzNFx1NWU3M1x1NWJmOVx1OWY1MFx1N2IyY1x1NGUwMFx1NGUyYVx1OTAwOVx1NWI5YVx1OTg3OQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9XHU1NzgyXHU3NmY0XHU1YzQ1XHU0ZTJkXHU1YmY5XHU5ZjUwDQotTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl90aXRsZT1cdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmYNCi1Nb3ZlRGlhbG9nX2ludmFsaWRfbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZz1JVVBBMDA0MUU6IFx1OTAwOVx1NWI5YVx1NzY4NFx1NTE0M1x1N2QyMFx1NjVlMFx1NmNkNVx1NzlmYlx1NTJhOFx1NTIzMFx1NjMwN1x1NWI5YVx1NzY4NFx1NzZlZVx1NjgwN1x1NGY0ZFx1N2Y2ZVx1MzAwMg0KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZW1vZGVsbGlicmFyeT1cdTZiNjNcdTU3MjhcdTRmZGRcdTViNThcdTZhMjFcdTU3OGJcdTVlOTMgLi4uDQotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJvcl9kaWFsb2dfdGl0bGU9XHU5NTE5XHU4YmVmDQotTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c9SVVQQTAwMzNFOiBcdTRmZGRcdTViNThcdTVlOTNcdTY1ZjZcdTkwNDdcdTUyMzBcdTk1ZWVcdTk4OThcdTMwMDINCi1NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dD1cdTc4NmVcdTViOWVcdTg5ODFcdTUyMjBcdTk2NjRcdTIwMWN7MH1cdTIwMWRcdTU0MTdcdWZmMWYNCi1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19Db250ZW50RWxlbWVudF90ZXh0PVx1NTE4NVx1NWJiOVx1NTE0M1x1N2QyMFx1ZmYxYQ0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfQnJvd3NlQnV0dG9uTGFiZWw9XHU2ZDRmXHU4OWM4Li4uDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1cdTYzMDdcdTViOWFcdTY1YjBcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTc2ODRcdTU0MGRcdTc5ZjBcdTU0OGNcdTYzY2ZcdThmZjBcdTMwMDINCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZVRpdGxlPVx1NGZkZFx1NWI1OFx1NjZmNFx1NjUzOVx1NWU3Nlx1NTE3M1x1OTVlZFx1NjI0MFx1NjcwOVx1N2YxNlx1OGY5MVx1NTY2OA0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9XHU1NzgyXHU3NmY0XHU1YmY5XHU5ZjUwXHU3YjJjXHU0ZTAwXHU0ZTJhXHU5MDA5XHU1YjlhXHU5ODc5DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dD1cdTRmZGRcdTViNTgNCi1BdHRhY2htZW50RGlhbG9nYXR0YWNoRmlsZV90ZXh0PVx1OTY0NFx1NTJhMFx1NjU4N1x1NGVmNg0KLUNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnQ9XHU5MTRkXHU3ZjZlXHU1MTg1XHU1YmI5DQotT3BlbkNvbmZpZ0RpYWxvZ29wZW5jb25maWdfdGV4dD1cdTYyNTNcdTVmMDBcdTkxNGRcdTdmNmUNCi1FbGVtZW50c1ZpZXdfcmVwbGFjZUFjdGlvbl90ZXh0PVx1NjZmZlx1NjM2Mi4uLg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9XHU2YjYzXHU1NzI4XHU0ZmRkXHU1YjU4IHswfQ0KLUNvbmZpZ3VyYXRpb25QYWdlX1Nob3dFcnJvclRvb2xUaXA9XHU2NjNlXHU3OTNhXHU5MTRkXHU3ZjZlXHU4YjY2XHU1NDRhXHU2NWU1XHU1ZmQ3XHU2N2U1XHU3NzBiXHU1NjY4DQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRm9ybVByZWZpeD1cdTkxNGRcdTdmNmVcdWZmMWENCi0NCi1DaGVja2xpc3RPcmRlcl9jaGVja2xpc3RpdGVtc190ZXh0PVx1NjhjMFx1NjdlNVx1OTg3OVx1ZmYxYQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9Nb3ZlTm9kZV9sYWJlbD1cdTc5ZmJcdTUyYThcdTgyODJcdTcwYjkNCi1Db25maWd1cmF0aW9uUGFnZV9NYWtlQ2xvc3VyZVRvb2xUaXA9XHU0ZmVlXHU1OTBkXHU5NTE5XHU4YmVmXHU1ZTc2XHU3ZWQzXHU2NzVmDQotTmV3UGx1Z2luRGlhbG9nX3JlZmVyZW5jZXBsdWdpbl90ZXh0PVx1NWYxNVx1NzUyOFx1NjNkMlx1NGVmNlx1ZmYxYQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9jcmVhdGVGcmVlVGV4dF90ZXh0PVx1NTIxYlx1NWVmYVx1ODFlYVx1NzUzMVx1NjU4N1x1NjcyYw0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0xhYmVsPVx1ODI4Mlx1NzBiOVx1NTZmZVx1NjgwN1x1OTg4NFx1ODljOFx1ZmYxYQ0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0PUlVUEEwMDMyVzogXHU2NWUwXHU2Y2Q1XHU4ZmRlXHU2M2E1DQotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX3NhbWVwcmVkYW5kc3VjX3RleHQ9SVVQQTAwMzNXOiBcdTRlMGRcdTgwZmRcdTVjMDZcdTU0MGNcdTRlMDBcdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjBcdTU0MGNcdTY1ZjZcdTRmNWNcdTRlM2FcdTUxNDhcdTg4NGNcdTRmNWNcdTRlMWFcdTU0OGNcdTU0MGVcdTdlZWRcdTRmNWNcdTRlMWENCi0NCi0jIEVkaXRvckNob29zZXINCi1FZGl0b3JDaG9vc2VyX2xvYWRkRXJyb3JEbGdUaXRsZT1cdTYyNTNcdTVmMDBcdTdmMTZcdThmOTFcdTU2NjgNCi1FZGl0b3JDaG9vc2VyX1Jlc291cmNlc0Vycm9yPVx1NmI2NFx1NTE0M1x1N2QyMFx1NjcwOVx1OTUxOVx1OGJlZlx1MzAwMlx1NWVmYVx1OGJhZVx1NTE0OFx1NGZlZVx1NTkwZFx1OGZkOVx1NGU5Ylx1OTUxOVx1OGJlZlx1ZmYwY1x1NzEzNlx1NTQwZVx1NTE4ZFx1N2VlN1x1N2VlZFx1ZmYwOFx1OGJmN1x1NTNjMlx1OTYwNVx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1ZmYwOVx1MzAwMlxuXA0KLVxuXA0KLVx1NTM1NVx1NTFmYlx1MjAxY1x1Nzg2ZVx1NWI5YVx1MjAxZFx1NTNlZlx1N2VlN1x1N2VlZFx1NjRjZFx1NGY1Y1x1ODAwY1x1NGUwZFx1NjI1M1x1NWYwMFx1N2YxNlx1OGY5MVx1NTY2OFx1MzAwMlx1NTE3M1x1OTVlZFx1NmI2NFx1NWJmOVx1OGJkZFx1Njg0Nlx1NTNlZlx1NjI1M1x1NWYwMFx1N2YxNlx1OGY5MVx1NTY2OFx1MzAwMg0KLUNvbmZpZ3VyYXRpb25QYWdlX0Zvcm1QcmVmaXg9XHU5MTRkXHU3ZjZlXHVmZjFhDQotDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uTmFtZT1cdTU0MGRcdTc5ZjBcdWZmMWENCi1BdHRhY2htZW50RGlhbG9nRmlsZVVSTF90ZXh0PVx1NjU4N1x1NGVmNiBVUkxcdWZmMWENCi1TdGVwc09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uPVx1OTAwOVx1NjJlOVx1NjdkMFx1NGUyYVx1NmI2NVx1OWFhNFx1ZmYwY1x1NzEzNlx1NTQwZVx1NTM1NVx1NTFmYlx1MjAxY1x1NTQxMVx1NGUwYVx1MjAxZFx1NjIxNlx1MjAxY1x1NTQxMVx1NGUwYlx1MjAxZFx1ZmYwY1x1NTNlZlx1NjZmNFx1NjUzOVx1NWI4M1x1NzY4NFx1OTg3YVx1NWU4Zlx1MzAwMg0KLU1ldGhvZExpYnJhcnlFZGl0b3JfZXJyX3NhdmU9XHU0ZmRkXHU1YjU4XHU2NzFmXHU5NWY0XHU1MWZhXHU5NTE5DQotTWVzc2FnZVZpZXdfZXJyZWxlbWVudF90ZXh0PVx1NWYxNVx1NzUyOFx1NTE0M1x1N2QyMA0KLU1lc3NhZ2VWaWV3X3JlZmVsZW1lbnRfdGV4dD1cdTg4YWJcdTVmMTVcdTc1MjhcdTUxNDNcdTdkMjANCi0NCi0jQWN0aXZpdHkgRGlhZ3JhbQ0KLUFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9jcmVhdGVTdGFydE5vZGVfdGV4dD1cdTUyMWJcdTVlZmFcdTU0MmZcdTUyYThcdTgyODJcdTcwYjkNCi1Db25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50RGVzY3JpcHRpb249XHU5MDA5XHU2MmU5XHU2YjY0XHU5MTRkXHU3ZjZlXHU0ZTJkXHU1YzA2XHU1MzA1XHU1NDJiXHU3Njg0XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHUzMDAxXHU1MTg1XHU1YmI5XHU1MzA1XHU1NDhjXHU2ZDQxXHU3YTBiXHUzMDAyDQotQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb25fdGV4dD1cdTViOWFcdTUyMzZcdTdjN2JcdTUyMmJcdTc2ODRcdTUxODVcdTViYjlcdTUxNDNcdTdkMjBcdTk4N2FcdTVlOGZcdTViZjlcdThiZGRcdTY4NDYNCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RpcmVjdG9yeUxhYmVsPVx1NzZlZVx1NWY1NVx1ZmYxYQ0KLVJvb3RQcmVmUGFnZV9lbmFibGVwcm9jZXNzY29udHJpYnV0aW9uX3RleHQ9XHU1NDJmXHU3NTI4XHU2ZDQxXHU3YTBiXHU2M2QwXHU0ZjliDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25fdGV4dD1cdTYzZDBcdTRmOWJcdTY3MDlcdTUxNzNcdTZiNjRcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTc2ODRcdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmZcdTMwMDINCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbkxhYmVsPVx1NjNjZlx1OGZmMFx1ZmYxYQ0KLUNvbnRyaWJ1dGlvblNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9XHU5MDA5XHU2MmU5XHUyMDFjezB9XHUyMDFkXHU3Njg0XHU2M2QwXHU0ZjliXHU4MDA1DQotRWxlbWVudHNWaWV3X29wZW5WYXJpYWJpbGl0eURpYWxvZ0FjdGlvbl90ZXh0PVx1OTAxYVx1OGZjN1x1NTNlZlx1NTNkOFx1NjAyN1x1NTE0M1x1N2QyMFx1NjI1M1x1NWYwMA0KLVZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZT1cdTkwMDlcdTYyZTlcdTIwMWN7MH1cdTIwMWRcdTc2ODRcdTUzZWZcdTUzZDhcdTYwMjdcdTUxNDNcdTdkMjANCi1WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdmlld2VyTGFiZWw9XHUyMDFjezB9XHUyMDFkXHU3Njg0XHU1M2VmXHU1M2Q4XHU2MDI3XHU1MTQzXHU3ZDIwDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0xhYmVsPVx1NWY2Mlx1NzJiNlx1NTZmZVx1NjgwN1x1OTg4NFx1ODljOFx1ZmYxYQ0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfZGVsZXRlX3RleHQ9XHU2NWUwXHU2Y2Q1XHU1MjIwXHU5NjY0DQotQWN0aXZpdHlEaWFncmFtRWRpdG9yX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dD1cdTYyNTNcdTVmMDBcdTZkM2JcdTUyYThcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTU2ZmUNCi1NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX2Rlc2NyaXB0aW9uPVx1NjNkMFx1NGY5Ylx1NjcwOVx1NTE3M1x1NmI2NFx1NjViOVx1NmNkNVx1NWU5M1x1NzY4NFx1NWUzOFx1ODljNFx1NGZlMVx1NjA2Zlx1MzAwMg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw9XHU2ZTA1XHU5NjY0DQotV1BDb21wYXJ0bWVudEZpZ3VyZV8wPVx1NjViMFx1NWVmYVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NjNjZlx1OGZmMFx1N2IyNg0KLXByb21wdGZvcl9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkX3RleHQ9XHU1M2QxXHU1ZTAzXHU2MjE2XHU2ZDRmXHU4OWM4XHU2ZDQxXHU3YTBiXHU3ZjE2XHU4ZjkxXHU1NjY4XHU0ZTJkXHU1YzFhXHU2NzJhXHU1MjFiXHU1ZWZhXHU3Njg0XHU2ZDNiXHU1MmE4XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHU1NmZlDQotcHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtPVx1NTNkMVx1NWUwM1x1NjIxNlx1NmQ0Zlx1ODljOFx1NjcyYVx1NGZlZVx1NjUzOVx1NzY4NFx1NmQzYlx1NTJhOFx1NjI2OVx1NWM1NVx1NzY4NFx1NmQzYlx1NTJhOFx1NTZmZQ0KLQ0KLSNDb25maWdQcm9jZXNzVmlld0RpYWxvZw0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX05hbWVQYXR0ZXJuPVx1NTQwZFx1NzlmMFx1NmEyMVx1NWYwZlx1ZmYwOFx1NWMwNlx1NjYzZVx1NzkzYVx1NTMzOVx1OTE0ZFx1NzY4NFx1NTQwZFx1NzlmMFx1ZmYwOVx1ZmYxYQ0KLXNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uX2xhYmVsPVx1NzUyOFx1OGQ0NFx1NmU5MFx1NWJmY1x1ODIyYVx1NTY2OFx1NjYzZVx1NzkzYQ0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1BhdHRlcm49XHU2YTIxXHU1ZjBmXHU0ZWU1XHU5MDE3XHU1M2Y3XHU5Njk0XHU1ZjAwXHVmZjBjXHU1MTc2XHU0ZTJkICogXHU4ODY4XHU3OTNhXHU0ZWZiXHU2MTBmXHU1YjU3XHU3YjI2XHU0ZTMyXHVmZjBjPyBcdTg4NjhcdTc5M2FcdTRlZmJcdTYxMGZcdTViNTdcdTdiMjYNCi1lcnJfcHJvY2Vzc2luZ19maWxlX2Rlc2NyaXB0aW9uPUlVUEEwMDI5RTogXHU1OTA0XHU3NDA2XHU5MDA5XHU1YjlhXHU3Njg0XHU2NTg3XHU0ZWY2XHU2NWY2XHU1MWZhXHU5NTE5XHUzMDAyXHU4YmY3XHU1MzU1XHU1MWZiXHUyMDFjXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUyMDFkXHVmZjBjXHU4M2I3XHU1M2Q2XHU2NmY0XHU1OTFhXHU0ZmUxXHU2MDZmXHUzMDAyDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQ2F0ZWdvcnlUeXBlPVx1N2M3Ylx1NTIyYlx1N2M3Ylx1NTc4Ylx1ZmYxYQ0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX0JyaWVmRGVzY3JpcHRpb249XHU3YjgwXHU4OTgxXHU2M2NmXHU4ZmYwXHVmZjFhDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfU2VsZWN0Q2F0ZWdvcmllcz1cdTkwMDlcdTYyZTlcdTdjN2JcdTUyMmINCi0NCi0jbG9nIG1lc3NhZ2VzDQotY2hlYXRzaGVldF9sb2FkX2ZhaWx1cmVfbG9nX21zZz1cdTY3MmFcdTgwZmRcdTYyNTNcdTVmMDBcdThiZjdcdTZjNDJcdTc2ODRcdTU5MDdcdTVmZDhcdTUzNTVcdWZmMWENCi0NCi1uZXdDb25maWd1cmF0aW9uV2lyYXpkX2NyZWF0ZUVycm9yPUlVUEEwMDM1RTogXHU2NWUwXHU2Y2Q1XHU2MjEwXHU1MjlmXHU1MjFiXHU1ZWZhXHU5MTRkXHU3ZjZlDQotbmV3UGx1Z2luV2l6YXJkX2NyZWF0ZUVycm9yPUlVUEEwMDM2RTogXHU2NWUwXHU2Y2Q1XHU2MjEwXHU1MjlmXHU1MjFiXHU1ZWZhXHU2M2QyXHU0ZWY2DQotZXJyb3JEaWFsb2dfbW92ZUVycm9yPUlVUEEwMDM3RTogXHU2NWUwXHU2Y2Q1XHU2MjEwXHU1MjlmXHU3OWZiXHU1MmE4XHU1MTQzXHU3ZDIwDQotcmVuYW1lRGlhbG9nX3JlbmFtZUVycm9yPUlVUEEwMDM4RTogXHU2NWUwXHU2Y2Q1XHU2MjEwXHU1MjlmXHU5MWNkXHU1NDdkXHU1NDBkXHU1MTQzXHU3ZDIwDQotZXJyb3JEaWFsb2dfY3JlYXRlRXJyb3I9SVVQQTAwMzlFOiBcdTY1ZTBcdTZjZDVcdTYyMTBcdTUyOWZcdTUyMWJcdTVlZmFcdTUxNDNcdTdkMjANCi1kdXBsaWNhdGVQbHVnaW5OYW1lRXJyb3JfbXNnPUlVUEEwMTAxRTogXHU1NDBkXHU3OWYwXHUyMDFjezB9XHUyMDFkXHU1ZGYyXHU1YjU4XHU1NzI4XHUzMDAyXHU4YmY3XHU4ZjkzXHU1MTY1XHU1MTc2XHU0ZWQ2XHU1NDBkXHU3OWYwXHU1ZTc2XHU5MWNkXHU4YmQ1XHUzMDAyDQotDQotI05ldyBTdHJpbmdzIGZvciBQcm9jZXNzRWRpdG9yIENvbnRleHQgbWVudSBkaWFncmFtIGltYWdlcw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFESW1hZ2U9XHU1MjA2XHU5MTRkIEFEIFx1NTZmZVx1NTBjZi4uLg0KLVByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yVGl0bGU9XHU1MjM3XHU2NWIwXHU5NTE5XHU4YmVmDQotUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JNc2c9XHU1MjM3XHU2NWIwXHU3ZjE2XHU4ZjkxXHU1NjY4XHU2NWY2XHU1MWZhXHU5NTE5DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkQURESW1hZ2U9XHU1MjA2XHU5MTRkIEFERCBcdTU2ZmVcdTUwY2YuLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRXUERJbWFnZT1cdTUyMDZcdTkxNGQgV1BEIFx1NTZmZVx1NTBjZi4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFESW1hZ2VJblB1Ymxpc2hpbmc9XHU1NzI4XHU1M2QxXHU1ZTAzXHU0ZTJkXHU0ZjdmXHU3NTI4IEFEIFx1NTZmZVx1NTBjZg0KLVByb2Nlc3NFZGl0b3JfcHJvbXB0VG9EZWxldGVCZWZvcmVTdXBwcmVzcz1cdTVmYzVcdTk4N2JcdTUyMjBcdTk2NjRcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTRlMmRcdTUyMTdcdTUxZmFcdTc2ODRcdTYyOTFcdTUyMzZcdTc2ODRcdTYzY2ZcdThmZjBcdTdiMjZcdWZmMGNcdTRlZTVcdTkwN2ZcdTUxNGRcdTU3MjhcdTYyOTFcdTUyMzZcdTkwMDlcdTViOWFcdTUxNDNcdTdkMjBcdTU0MGVcdTUxZmFcdTczYjBcdTkxY2RcdTU5MGRcdTMwMDJcdTU5ODJcdTY3OWNcdTg5ODFcdTUyMjBcdTk2NjRcdTViODNcdTRlZWNcdTVlNzZcdTdlZTdcdTdlZWRcdTRlMGJcdTUzYmJcdWZmMGNcdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdTc4NmVcdTViOWFcdTIwMWRcdTMwMDINCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VBRERJbWFnZUluUHVibGlzaGluZz1cdTU3MjhcdTUzZDFcdTVlMDNcdTRlMmRcdTRmN2ZcdTc1MjggQUREIFx1NTZmZVx1NTBjZg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZVdQREltYWdlSW5QdWJsaXNoaW5nPVx1NTcyOFx1NTNkMVx1NWUwM1x1NGUyZFx1NGY3Zlx1NzUyOCBXUEQgXHU1NmZlXHU1MGNmDQotUHJvY2Vzc0VkaXRvcl9EaWFncmFtSW1hZ2VfSW5wdXREaWFsb2dfaW5pdGlhbFZhbHVlPVx1NTZmZVx1NTBjZlx1OGRlZlx1NWY4NA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1Nob3dMaW5rZWRFbGVtZW50aW5MaWJyYXJ5Vmlldz1cdTU3MjhcdTVlOTNcdTg5YzZcdTU2ZmVcdTRlMmRcdTY2M2VcdTc5M2FcdTk0ZmVcdTYzYTVcdTUxNDNcdTdkMjAoJkgpDQotUHJvY2Vzc0VkaXRvcl91cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uX2xhYmVsPVx1NGVjZVx1NTdmYVx1NjcyY1x1NzUyOFx1NGY4Ylx1NjZmNFx1NjViMFx1NjI5MVx1NTIzNigmQikNCi1Qcm9jZXNzRWRpdG9yX0NvbnRleHRNZW51X0RpYWdyYW1JbWFnZXM9XHU1NmZlXHU3Njg0XHU1NmZlXHU1MGNmDQotDQotI1N0cmluZ3MgZm9yIHN5bmNocm9uaXphdGlvbiB3aXphcmQgb24gcHJvY2VzcyBlZGl0b3IncyBCUw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfdGl0bGU9XHU1NDBjXHU2YjY1XHU2M2NmXHU4ZmYwDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90ZXh0PVx1OTYwNVx1OGJmYlx1NGUwYlx1OTc2Mlx1OGJmNFx1NjYwZVx1NWMwNlx1NWI4Y1x1NjIxMFx1NGVjMFx1NGU0OFx1NWI5YVx1NTIzNlx1NTQwY1x1NmI2NVx1NzY4NFx1NGZlMVx1NjA2Zlx1MzAwMg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RpdGxlPVx1OTAwOVx1NjJlOVx1OTE0ZFx1N2Y2ZQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RleHQ9XHU5MDA5XHU2MmU5XHU4OTgxXHU3NTI4XHU0ZThlXHU1NDBjXHU2YjY1XHU3Njg0XHU5MTRkXHU3ZjZlXHUzMDAyXA0KLVx1NjBhOFx1NzY4NFx1OTAwOVx1NjJlOVx1NTFiM1x1NWI5YVx1NTRlYVx1NGU5Ylx1NjNkMFx1NGY5Ylx1NTQ4Y1x1NjZmZlx1NjM2Mlx1NWMwNlx1NzUyOFx1NGU4ZVx1NTQwY1x1NmI2NVx1MzAwMg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX2NvbmZpZ0xhYmVsPVx1OTE0ZFx1N2Y2ZVx1ZmYxYQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90aXRsZT1cdTkwMDlcdTYyZTlcdTg5ODFcdTU0MGNcdTZiNjVcdTc2ODRcdTVjNWVcdTYwMjcNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJvcGVydGllc19sYWJsZT1cdTVjNWVcdTYwMjcNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbmFtZV9sYWJsZT1cdTU0MGRcdTc5ZjANCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJlc2VudGF0aW9uTmFtZV9sYWJsZT1cdTY2M2VcdTc5M2FcdTU0MGRcdTc5ZjANCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYnJpZWZEZXNjX2xhYmxlPVx1N2I4MFx1ODk4MVx1NjNjZlx1OGZmMA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9vcHRpb25hbElub3V0c19sYWJlbD1cdTUzZWZcdTkwMDlcdThmOTNcdTUxNjUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbWFuZGF0b3J5SW5wdXRzX2xhYmxlPVx1NWYzYVx1NTIzNlx1OGY5M1x1NTE2NQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9vdXRwdXRzX2xhYmVsPVx1OGY5M1x1NTFmYQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX2xhYmVsPVx1NGUzYlx1NjI2N1x1ODg0Y1x1ODAwNQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9hZGRuUGVyZm9ybWVyc19sYWJsZT1cdTUxNzZcdTRlZDZcdTYyNjdcdTg4NGNcdTgwMDUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcmVzcG9uc2libGVSb2xlc19sYWJsZT1cdThkMWZcdThkMjNcdTg5ZDJcdTgyNzINCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfY29udG5BcnRpZmFjdHNfbGFiZWw9XHU1MzA1XHU1NDJiXHU3Njg0XHU1ZGU1XHU0ZWY2DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2RpbHZlZFBhcnRzX2xhYmVsPVx1NTNlZlx1NGVhNFx1NGVkOFx1OTBlOFx1NGVmNg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9zZWxTdGVwc19sYWJlbD1cdTZiNjVcdTlhYTRcdTkwMDlcdTYyZTkNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGV4dD1cdTkwMDlcdTYyZTlcdTg5ODFcdTgwMDNcdTg2NTFcdThmZGJcdTg4NGNcdTU0MGNcdTZiNjVcdTc2ODRcdTY1YjlcdTZjZDVcdTUxODVcdTViYjlcdTc2ODRcdTVjNWVcdTYwMjdcdTMwMDINCi1zeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGl0bGU9XHU1NDBjXHU2YjY1XHU5ODg0XHU4OWM4DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RleHQ9XHU2OGMwXHU2N2U1XHU0ZTBiXHU5NzYyXHU2M2QwXHU0ZjliXHU3Njg0XHU1NDBjXHU2YjY1XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotc2VsZWN0RWRpdG9yc1RvRGlzY2FyZENvbmZsaWN0Q2hhbmdlcz1cdTY3MmFcdTRmZGRcdTViNThcdTc2ODRcdTY2ZjRcdTY1MzlcdTRlMGVcdTU3MjhcdTdmMTZcdThmOTFcdTU2NjhcdTU5MTZcdTYyNDBcdTRmNWNcdTc2ODRcdTY2ZjRcdTY1MzlcdTUzZDFcdTc1MWZcdTUxYjJcdTdhODFcdTMwMDJcblwNCi1cdThiZjdcdTkwMDlcdTYyZTlcdTYwYThcdTYwZjNcdTVlOWZcdTVmMDNcdTUxNzZcdTY2ZjRcdTY1MzlcdTc2ODRcdTdmMTZcdThmOTFcdTU2NjhcdTMwMDINCi1zeW5jaHJvbml6YXRpb25XaXphcmRfdGl0bGVfdGV4dD1cdTU0MGNcdTZiNjVcdTU0MTFcdTViZmMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX2V4cGxhaW5UZXh0PVx1NmI2NFx1NTQxMVx1NWJmY1x1NjUyZlx1NjMwMVx1NTIzN1x1NjViMFx1OTAwOVx1NWI5YVx1NzY4NFx1NjNjZlx1OGZmMFx1N2IyNlx1ZmYwY1x1NjIxNlx1NTIzN1x1NjViMFx1OTAwOVx1NWI5YVx1NmQzYlx1NTJhOFx1NGUwYlx1NzY4NFx1MzAwMVx1NTcyOFx1NTQwNFx1ODFlYVx1MjAxY1x1NWM1ZVx1NjAyN1x1MjAxZFx1ODljNlx1NTZmZVx1MjAxY1x1NWUzOFx1ODljNFx1MjAxZFx1OTAwOVx1OTg3OVx1NTM2MVx1NGUyZFx1NjgwN1x1NGUzYVx1MjAxY1x1NGUwZVx1NmU5MFx1NTQwY1x1NmI2NVx1MjAxZFx1NzY4NFx1NjI0MFx1NjcwOVx1NjNjZlx1OGZmMFx1N2IyNlx1MzAwMlwNCi1cdTUzZWFcdTY3MDlcdTYwYThcdTU3MjhcdTZiNjRcdTU0MTFcdTViZmNcdTRlMmRcdTkwMDlcdTYyZTlcdTc2ODRcdTVjNWVcdTYwMjdcdWZmMGNcdTYyNGRcdTRmMWFcdTU3MjhcdTYzY2ZcdThmZjBcdTdiMjZcdTRlMmRcdTUyMzdcdTY1YjBcdTMwMDJcDQotXHU2MGE4XHU4ZmQ4XHU1M2VmXHU0ZWU1XHU5MDA5XHU2MmU5XHU0ZWZiXHU0ZjU1XHU2NzA5XHU2NTQ4XHU5MTRkXHU3ZjZlXHVmZjBjXHU4YmE5XHU2MGE4XHU3Njg0XHU2ZDQxXHU3YTBiXHU1NzI4XHU4YmExXHU3Yjk3XHU1MjM3XHU2NWIwXHU2NWY2XHU0ZjdmXHU3NTI4XHUzMDAyXA0KLVx1OGJmN1x1NmNlOFx1NjEwZlx1ZmYxYVx1NmI2NFx1NTQxMVx1NWJmY1x1NGUwZFx1NGYxYVx1NjZmNFx1NjViMFx1NjI0MFx1NjcwOVx1NTJhOFx1NjAwMVx1OTRmZVx1NjNhNVx1NzY4NFx1NjNjZlx1OGZmMFx1N2IyNlx1ZmYwOFx1NGVlNVx1N2VmZlx1ODI3Mlx1NjU5Y1x1NGY1M1x1NjYzZVx1NzkzYVx1ZmYwOVx1MzAwMg0KLQ0KLW9wZW5SVEU9XHU2MjUzXHU1ZjAwXHU1YmNjXHU2NTg3XHU2NzJjXHU2ODNjXHU1ZjBmXHU3ZjE2XHU4ZjkxXHU1NjY4DQotY2xvc2VSVEU9XHU1MTczXHU5NWVkXHU1YmNjXHU2NTg3XHU2NzJjXHU2ODNjXHU1ZjBmXHU3ZjE2XHU4ZjkxXHU1NjY4DQotDQotI05ldyBTdHJpbmdzDQotcm9sZXNldHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTZiNjRcdTg5ZDJcdTgyNzJcdTk2YzZcdTc2ODRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi1kaXNjaXBsaW5lc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NmI2NFx1ODljNFx1N2EwYlx1NzY4NFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLXdvcmtwcm9kdWN0dHlwZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTZiNjRcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTdjN2JcdTU3OGJcdTc2ODRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi1kb21haW5zX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU2YjY0XHU1N2RmXHU3Njg0XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHUzMDAyDQotdG9vbHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTZiNjRcdTVkZTVcdTUxNzdcdTc2ODRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi1jdXN0b21jYXRlZ29yeV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NmI2NFx1NWI5YVx1NTIzNlx1N2M3Ylx1NTIyYlx1NzY4NFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLWNvbmNlcHRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTZiNjRcdTY5ODJcdTVmZjVcdTc2ODRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi1jaGVja2xpc3RfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTZiNjRcdTY4MzhcdTViZjlcdTg4NjhcdTc2ODRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi1leGFtcGxlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU2YjY0XHU3OTNhXHU0ZjhiXHU3Njg0XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHUzMDAyDQotZ3VpZGVsaW5lX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU2YjY0XHU2MzA3XHU1MzU3XHU3Njg0XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHUzMDAyDQotcm9hZG1hcF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NmI2NFx1OGRlZlx1N2ViZlx1NTZmZVx1NzY4NFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLXJldXNhYmxlYXNzZXRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTZiNjRcdTUzZWZcdTkxY2RcdTc1MjhcdThkNDRcdTRlYTdcdTc2ODRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTZiNjRcdTY1MmZcdTYzMDFcdTY3NTBcdTY1OTlcdTc2ODRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi1yZXBvcnRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTZiNjRcdTYyYTVcdTU0NGFcdTc2ODRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi1wcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NmI2NFx1NWI5ZVx1OGRmNVx1NzY4NFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLXRlbXBsYXRlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU2YjY0XHU2YTIxXHU2NzdmXHU3Njg0XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHUzMDAyDQotdGVybWRlZmluaXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTZiNjRcdTY3MmZcdThiZWRcdTViOWFcdTRlNDlcdTc2ODRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTMwMDINCi10b29sbWVudG9yX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU2YjY0XHU1ZGU1XHU1MTc3XHU1NDExXHU1YmZjXHU3Njg0XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHUzMDAyDQotd2hpdGVwYXBlcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NmI2NFx1NzY3ZFx1NzZhZVx1NGU2Nlx1NzY4NFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU2YjY0XHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5XHU3Njg0XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotDQotI05ldyBTdHJpbmcgU2VjdGlvbiBEZXNjcmlwdGlvbg0KLXJvbGVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1ODlkMlx1ODI3Mlx1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLXJvbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU4OWQyXHU4MjcyXHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotcm9sZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTg5ZDJcdTgyNzJcdTRlMGVcdTUxNzZcdTRlZDZcdTg5ZDJcdTgyNzJcdTc2ODRcdTUxNzNcdTdjZmJcdTMwMDINCi1yb2xlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1ODlkMlx1ODI3Mlx1NzY4NFx1NzI0OFx1NjcyY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLXRhc2tfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NGVmYlx1NTJhMVx1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLXRhc2tfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU0ZWZiXHU1MmExXHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotdGFza192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTRlZmJcdTUyYTFcdTRlMGVcdTUxNzZcdTRlZDZcdTRlZmJcdTUyYTFcdTc2ODRcdTUxNzNcdTdjZmJcdTMwMDINCi10YXNrX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NGVmYlx1NTJhMVx1NzY4NFx1NzI0OFx1NjcyY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLWFydGlmYWN0X2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTVkZTVcdTRlZjZcdTc2ODRcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTMwMDINCi1hcnRpZmFjdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTVkZTVcdTRlZjZcdTc2ODRcdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmZcdTMwMDINCi1hcnRpZmFjdF9pY29uU2VjdGlvbl9kZXNjPVx1NWI5YVx1NTIzNlx1NmI2NFx1NWRlNVx1NGVmNlx1NzY4NFx1NTZmZVx1NjgwN1x1MzAwMg0KLWFydGlmYWN0X25vdGF0aW9uU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NWRlNVx1NGVmNlx1NzY4NFx1NGVhNFx1NGVkOFx1NGZlMVx1NjA2Zlx1MzAwMg0KLWFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTVkZTVcdTRlZjZcdTc2ODRcdTViOWFcdTUyMzZcdTRmZTFcdTYwNmZcdTMwMDINCi1hcnRpZmFjdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTVkZTVcdTRlZjZcdTRlMGVcdTUxNzZcdTRlZDZcdTVkZTVcdTRlZjZcdTc2ODRcdTUxNzNcdTdjZmJcdTMwMDINCi1hcnRpZmFjdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTVkZTVcdTRlZjZcdTc2ODRcdTcyNDhcdTY3MmNcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi1vdXRjb21lX2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTdlZDNcdTY3OWNcdTc2ODRcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTMwMDINCi1vdXRjb21lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1N2VkM1x1Njc5Y1x1NzY4NFx1NWUzOFx1ODljNFx1NGZlMVx1NjA2Zlx1MzAwMg0KLW91dGNvbWVfaWNvblNlY3Rpb25fZGVzYz1cdTViOWFcdTUyMzZcdTZiNjRcdTdlZDNcdTY3OWNcdTc2ODRcdTU2ZmVcdTY4MDdcdTMwMDINCi1vdXRjb21lX25vdGF0aW9uU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1N2VkM1x1Njc5Y1x1NzY4NFx1NGVhNFx1NGVkOFx1NGZlMVx1NjA2Zlx1MzAwMg0KLW91dGNvbWVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1N2VkM1x1Njc5Y1x1NzY4NFx1NWI5YVx1NTIzNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLW91dGNvbWVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU3ZWQzXHU2NzljXHU0ZTBlXHU1MTc2XHU0ZWQ2XHU3ZWQzXHU2NzljXHU3Njg0XHU1MTczXHU3Y2ZiXHUzMDAyDQotb3V0Y29tZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTdlZDNcdTY3OWNcdTc2ODRcdTcyNDhcdTY3MmNcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi1kZWxpdmVyYWJsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1M2VmXHU0ZWE0XHU0ZWQ4XHU0ZWY2XHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotZGVsaXZlcmFibGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1M2VmXHU0ZWE0XHU0ZWQ4XHU0ZWY2XHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotZGVsaXZlcmFibGVfaWNvblNlY3Rpb25fZGVzYz1cdTViOWFcdTUyMzZcdTZiNjRcdTUzZWZcdTRlYTRcdTRlZDhcdTRlZjZcdTc2ODRcdTU2ZmVcdTY4MDdcdTMwMDINCi1kZWxpdmVyYWJsZV9ub3RhdGlvblNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTUzZWZcdTRlYTRcdTRlZDhcdTRlZjZcdTc2ODRcdTRlYTRcdTRlZDhcdTRmZTFcdTYwNmZcdTMwMDINCi1kZWxpdmVyYWJsZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1M2VmXHU0ZWE0XHU0ZWQ4XHU0ZWY2XHU3Njg0XHU1YjlhXHU1MjM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotZGVsaXZlcmFibGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU1M2VmXHU0ZWE0XHU0ZWQ4XHU0ZWY2XHU0ZTBlXHU1MTc2XHU0ZWQ2XHU1M2VmXHU0ZWE0XHU0ZWQ4XHU0ZWY2XHU3Njg0XHU1MTczXHU3Y2ZiXHUzMDAyDQotZGVsaXZlcmFibGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1M2VmXHU0ZWE0XHU0ZWQ4XHU0ZWY2XHU3Njg0XHU3MjQ4XHU2NzJjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotZGlzY2lwbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU4OWM0XHU3YTBiXHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotZGlzY2lwbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTg5YzRcdTdhMGJcdTc2ODRcdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmZcdTMwMDINCi1kaXNjaXBsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1ODljNFx1N2EwYlx1NGUwZVx1NTE3Nlx1NGVkNlx1ODljNFx1N2EwYlx1NzY4NFx1NTE3M1x1N2NmYlx1MzAwMg0KLWRpc2NpcGxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU4OWM0XHU3YTBiXHU3Njg0XHU3MjQ4XHU2NzJjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotZG9tYWluX2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTU3ZGZcdTc2ODRcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTMwMDINCi1kb21haW5fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1N2RmXHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotZG9tYWluX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1NTdkZlx1NGUwZVx1NTE3Nlx1NGVkNlx1NTdkZlx1NzY4NFx1NTE3M1x1N2NmYlx1MzAwMg0KLWRvbWFpbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTU3ZGZcdTc2ODRcdTcyNDhcdTY3MmNcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi13b3JrcHJvZHVjdHR5cGVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1N2M3Ylx1NTc4Ylx1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLXdvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTdjN2JcdTU3OGJcdTc2ODRcdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmZcdTMwMDINCi13b3JrcHJvZHVjdHR5cGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU3YzdiXHU1NzhiXHU0ZTBlXHU1MTc2XHU0ZWQ2XHU0ZWE3XHU1NGMxXHU3YzdiXHU1NzhiXHU3Njg0XHU1MTczXHU3Y2ZiXHUzMDAyDQotd29ya3Byb2R1Y3R0eXBlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1N2M3Ylx1NTc4Ylx1NzY4NFx1NzI0OFx1NjcyY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLXJvbGVzZXRfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1ODlkMlx1ODI3Mlx1OTZjNlx1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLXJvbGVzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU4OWQyXHU4MjcyXHU5NmM2XHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotcm9sZXNldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTg5ZDJcdTgyNzJcdTk2YzZcdTRlMGVcdTUxNzZcdTRlZDZcdTg5ZDJcdTgyNzJcdTk2YzZcdTc2ODRcdTUxNzNcdTdjZmJcdTMwMDINCi1yb2xlc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1ODlkMlx1ODI3Mlx1OTZjNlx1NzY4NFx1NzI0OFx1NjcyY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLXRvb2xfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NWRlNVx1NTE3N1x1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLXRvb2xfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1ZGU1XHU1MTc3XHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotdG9vbF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTVkZTVcdTUxNzdcdTRlMGVcdTUxNzZcdTRlZDZcdTVkZTVcdTUxNzdcdTc2ODRcdTUxNzNcdTdjZmJcdTMwMDINCi10b29sX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NWRlNVx1NTE3N1x1NzY4NFx1NzI0OFx1NjcyY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLWNvbmNlcHRfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1Njk4Mlx1NWZmNVx1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLWNvbmNlcHRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU2OTgyXHU1ZmY1XHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotY29uY2VwdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTY5ODJcdTVmZjVcdTRlMGVcdTUxNzZcdTRlZDZcdTY5ODJcdTVmZjVcdTc2ODRcdTUxNzNcdTdjZmJcdTMwMDINCi1jb25jZXB0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1Njk4Mlx1NWZmNVx1NzY4NFx1NzI0OFx1NjcyY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLWNoZWNrbGlzdF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2NzA5XHU1MTczXHU2YjY0XHU2ODM4XHU1YmY5XHU4ODY4XHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NjgzOFx1NWJmOVx1ODg2OFx1NzY4NFx1NWUzOFx1ODljNFx1NGZlMVx1NjA2Zlx1MzAwMg0KLWNoZWNrbGlzdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTY4MzhcdTViZjlcdTg4NjhcdTRlMGVcdTUxNzZcdTRlZDZcdTY4MzhcdTViZjlcdTg4NjhcdTc2ODRcdTUxNzNcdTdjZmJcdTMwMDINCi1jaGVja2xpc3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2NzA5XHU1MTczXHU2YjY0XHU2ODM4XHU1YmY5XHU4ODY4XHU3Njg0XHU3MjQ4XHU2NzJjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotZXhhbXBsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU3OTNhXHU0ZjhiXHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotZXhhbXBsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTc5M2FcdTRmOGJcdTc2ODRcdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmZcdTMwMDINCi1leGFtcGxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1NzkzYVx1NGY4Ylx1NGUwZVx1NTE3Nlx1NGVkNlx1NzkzYVx1NGY4Ylx1NzY4NFx1NTE3M1x1N2NmYlx1MzAwMg0KLWV4YW1wbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU3OTNhXHU0ZjhiXHU3Njg0XHU3MjQ4XHU2NzJjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotZ3VpZGVsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTYzMDdcdTUzNTdcdTc2ODRcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTMwMDINCi1ndWlkZWxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU2MzA3XHU1MzU3XHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotZ3VpZGVsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1NjMwN1x1NTM1N1x1NGUwZVx1NTE3Nlx1NGVkNlx1NjMwN1x1NTM1N1x1NzY4NFx1NTE3M1x1N2NmYlx1MzAwMg0KLWd1aWRlbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTYzMDdcdTUzNTdcdTc2ODRcdTcyNDhcdTY3MmNcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5XHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5XHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5XHU0ZTBlXHU1MTc2XHU0ZWQ2XHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5XHU3Njg0XHU1MTczXHU3Y2ZiXHUzMDAyDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5XHU3Njg0XHU3MjQ4XHU2NzJjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotcHJhY3RpY2VfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NWI5ZVx1OGRmNVx1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLXByYWN0aWNlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NWI5ZVx1OGRmNVx1NzY4NFx1NWUzOFx1ODljNFx1NGZlMVx1NjA2Zlx1MzAwMg0KLXByYWN0aWNlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1NWI5ZVx1OGRmNVx1NGUwZVx1NTE3Nlx1NGVkNlx1NWI5ZVx1OGRmNVx1NzY4NFx1NTE3M1x1N2NmYlx1MzAwMg0KLXByYWN0aWNlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NWI5ZVx1OGRmNVx1NzY4NFx1NzI0OFx1NjcyY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLXJlcG9ydF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU2MmE1XHU1NDRhXHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotcmVwb3J0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NjJhNVx1NTQ0YVx1NzY4NFx1NWUzOFx1ODljNFx1NGZlMVx1NjA2Zlx1MzAwMg0KLXJlcG9ydF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTYyYTVcdTU0NGFcdTRlMGVcdTUxNzZcdTRlZDZcdTYyYTVcdTU0NGFcdTc2ODRcdTUxNzNcdTdjZmJcdTMwMDINCi1yZXBvcnRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU2MmE1XHU1NDRhXHU3Njg0XHU3MjQ4XHU2NzJjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotcmVzdWFibGVhc3NldF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1M2VmXHU5MWNkXHU3NTI4XHU4ZDQ0XHU0ZWE3XHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotcmVzdWFibGVhc3NldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTUzZWZcdTkxY2RcdTc1MjhcdThkNDRcdTRlYTdcdTc2ODRcdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmZcdTMwMDINCi1yZXN1YWJsZWFzc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1NTNlZlx1OTFjZFx1NzUyOFx1OGQ0NFx1NGVhN1x1NGUwZVx1NTE3Nlx1NGVkNlx1NTNlZlx1OTFjZFx1NzUyOFx1OGQ0NFx1NGVhN1x1NzY4NFx1NTE3M1x1N2NmYlx1MzAwMg0KLXJlc3VhYmxlYXNzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1M2VmXHU5MWNkXHU3NTI4XHU4ZDQ0XHU0ZWE3XHU3Njg0XHU3MjQ4XHU2NzJjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotcm9hZG1hcF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU4ZGVmXHU3ZWJmXHU1NmZlXHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotcm9hZG1hcF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdThkZWZcdTdlYmZcdTU2ZmVcdTc2ODRcdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmZcdTMwMDINCi1yb2FkbWFwX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1OGRlZlx1N2ViZlx1NTZmZVx1NGUwZVx1NTE3Nlx1NGVkNlx1OGRlZlx1N2ViZlx1NTZmZVx1NzY4NFx1NTE3M1x1N2NmYlx1MzAwMg0KLXJvYWRtYXBfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU4ZGVmXHU3ZWJmXHU1NmZlXHU3Njg0XHU3MjQ4XHU2NzJjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotc3VwcG9ydGluZ21hdGVyaWFsX2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTY1MmZcdTYzMDFcdTY3NTBcdTY1OTlcdTc2ODRcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTMwMDINCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU2NTJmXHU2MzAxXHU2NzUwXHU2NTk5XHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1NjUyZlx1NjMwMVx1Njc1MFx1NjU5OVx1NGUwZVx1NTE3Nlx1NGVkNlx1NjUyZlx1NjMwMVx1Njc1MFx1NjU5OVx1NzY4NFx1NTE3M1x1N2NmYlx1MzAwMg0KLXN1cHBvcnRpbmdtYXRlcmlhbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTY1MmZcdTYzMDFcdTY3NTBcdTY1OTlcdTc2ODRcdTcyNDhcdTY3MmNcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi10ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU2YTIxXHU2NzdmXHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotdGVtcGxhdGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU2YTIxXHU2NzdmXHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotdGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU2YTIxXHU2NzdmXHU0ZTBlXHU1MTc2XHU0ZWQ2XHU2YTIxXHU2NzdmXHU3Njg0XHU1MTczXHU3Y2ZiXHUzMDAyDQotdGVtcGxhdGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU2YTIxXHU2NzdmXHU3Njg0XHU3MjQ4XHU2NzJjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotdGVybWRlZmluaXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NjcyZlx1OGJlZFx1NWI5YVx1NGU0OVx1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLXRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NjcyZlx1OGJlZFx1NWI5YVx1NGU0OVx1NzY4NFx1NWUzOFx1ODljNFx1NGZlMVx1NjA2Zlx1MzAwMg0KLXRlcm1kZWZpbml0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1NjcyZlx1OGJlZFx1NWI5YVx1NGU0OVx1NGUwZVx1NTE3Nlx1NGVkNlx1NjcyZlx1OGJlZFx1NWI5YVx1NGU0OVx1NzY4NFx1NTE3M1x1N2NmYlx1MzAwMg0KLXRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NjcyZlx1OGJlZFx1NWI5YVx1NGU0OVx1NzY4NFx1NzI0OFx1NjcyY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLXRvb2xtZW50b3JfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NWRlNVx1NTE3N1x1NTQxMVx1NWJmY1x1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLXRvb2xtZW50b3JfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1ZGU1XHU1MTc3XHU1NDExXHU1YmZjXHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotdG9vbG1lbnRvcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTVkZTVcdTUxNzdcdTU0MTFcdTViZmNcdTRlMGVcdTUxNzZcdTRlZDZcdTVkZTVcdTUxNzdcdTU0MTFcdTViZmNcdTc2ODRcdTUxNzNcdTdjZmJcdTMwMDINCi10b29sbWVudG9yX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NjcwOVx1NTE3M1x1NmI2NFx1NWRlNVx1NTE3N1x1NTQxMVx1NWJmY1x1NzY4NFx1NzI0OFx1NjcyY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLXdoaXRlcGFwZXJfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NzY3ZFx1NzZhZVx1NGU2Nlx1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLXdoaXRlcGFwZXJfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU3NjdkXHU3NmFlXHU0ZTY2XHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotd2hpdGVwYXBlcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTc2N2RcdTc2YWVcdTRlNjZcdTRlMGVcdTUxNzZcdTRlZDZcdTc2N2RcdTc2YWVcdTRlNjZcdTc2ODRcdTUxNzNcdTdjZmJcdTMwMDINCi13aGl0ZXBhcGVyX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1NzY3ZFx1NzZhZVx1NGU2Nlx1NzY4NFx1NzI0OFx1NjcyY1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLWRpc2NpcGxpbmVncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU4OWM0XHU3YTBiXHU1MjA2XHU3ZWM0XHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotZGlzY2lwbGluZWdyb3VwaW5nX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NTE3M1x1NGU4ZVx1NmI2NFx1ODljNFx1N2EwYlx1NTIwNlx1N2VjNFx1NzY4NFx1NWUzOFx1ODljNFx1NGZlMVx1NjA2Zlx1MzAwMg0KLWRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTg5YzRcdTdhMGJcdTUyMDZcdTdlYzRcdTRlMGVcdTUxNzZcdTRlZDZcdTg5YzRcdTdhMGJcdTUyMDZcdTdlYzRcdTc2ODRcdTUxNzNcdTdjZmJcdTMwMDINCi1kaXNjaXBsaW5lZ3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU4OWM0XHU3YTBiXHU1MjA2XHU3ZWM0XHU3Njg0XHU3MjQ4XHU2NzJjXHU0ZmUxXHU2MDZmXHUzMDAyDQotDQotcm9sZXNldGdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTg5ZDJcdTgyNzJcdTk2YzZcdTUyMDZcdTdlYzRcdTc2ODRcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTMwMDINCi1yb2xlc2V0Z3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU4OWQyXHU4MjcyXHU5NmM2XHU1MjA2XHU3ZWM0XHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotcm9sZXNldGdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1ODlkMlx1ODI3Mlx1OTZjNlx1NTIwNlx1N2VjNFx1NGUwZVx1NTE3Nlx1NGVkNlx1ODlkMlx1ODI3Mlx1OTZjNlx1NTIwNlx1N2VjNFx1NzY4NFx1NTE3M1x1N2NmYlx1MzAwMg0KLXJvbGVzZXRncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTUxNzNcdTRlOGVcdTZiNjRcdTg5ZDJcdTgyNzJcdTk2YzZcdTUyMDZcdTdlYzRcdTc2ODRcdTcyNDhcdTY3MmNcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi1jdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1YjlhXHU1MjM2XHU3YzdiXHU1MjJiXHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1YjlhXHU1MjM2XHU3YzdiXHU1MjJiXHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU1YjlhXHU1MjM2XHU3YzdiXHU1MjJiXHU0ZTBlXHU1MTc2XHU0ZWQ2XHU1YjlhXHU1MjM2XHU3YzdiXHU1MjJiXHU3Njg0XHU1MTczXHU3Y2ZiXHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU1MTczXHU0ZThlXHU2YjY0XHU1YjlhXHU1MjM2XHU3YzdiXHU1MjJiXHU3Njg0XHU3MjQ4XHU2NzJjXHU0ZmUxXHU2MDZmXHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfSWNvblNlY3Rpb25fZGVzYz1cdTViOWFcdTUyMzZcdTZiNjRcdTViOWFcdTUyMzZcdTdjN2JcdTUyMmJcdTc2ODRcdTU2ZmVcdTY4MDdcdTMwMDINCi0NCi1jb25jZXB0X2ljb25TZWN0aW9uX2Rlc2M9XHU1YjlhXHU1MjM2XHU2YjY0XHU2OTgyXHU1ZmY1XHU3Njg0XHU1NmZlXHU2ODA3XHUzMDAyDQotY2hlY2tsaXN0X2ljb25TZWN0aW9uX2Rlc2M9XHU1YjlhXHU1MjM2XHU2YjY0XHU2ODM4XHU1YmY5XHU4ODY4XHU3Njg0XHU1NmZlXHU2ODA3XHUzMDAyDQotdG9vbG1lbnRvcl9pY29uU2VjdGlvbl9kZXNjPVx1NWI5YVx1NTIzNlx1NmI2NFx1NWRlNVx1NTE3N1x1NTQxMVx1NWJmY1x1NzY4NFx1NTZmZVx1NjgwN1x1MzAwMg0KLXdoaXRlcGFwZXJfaWNvblNlY3Rpb25fZGVzYz1cdTViOWFcdTUyMzZcdTZiNjRcdTc2N2RcdTc2YWVcdTRlNjZcdTc2ODRcdTU2ZmVcdTY4MDdcdTMwMDINCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9pY29uU2VjdGlvbl9kZXNjPVx1NWI5YVx1NTIzNlx1NmI2NFx1NGYzMFx1N2I5N1x1NmNlOFx1NjEwZlx1NGU4Ylx1OTg3OVx1NzY4NFx1NTZmZVx1NjgwN1x1MzAwMg0KLXRlcm1kZWZpbml0aW9uX2ljb25TZWN0aW9uX2Rlc2M9XHU1YjlhXHU1MjM2XHU2YjY0XHU2NzJmXHU4YmVkXHU1YjlhXHU0ZTQ5XHU3Njg0XHU1NmZlXHU2ODA3XHUzMDAyDQotdGVtcGxhdGVfaWNvblNlY3Rpb25fZGVzYz1cdTViOWFcdTUyMzZcdTZiNjRcdTZhMjFcdTY3N2ZcdTc2ODRcdTU2ZmVcdTY4MDdcdTMwMDINCi1yZXVzYWJsZWFzc2V0X2ljb25TZWN0aW9uX2Rlc2M9XHU1YjlhXHU1MjM2XHU2YjY0XHU1M2VmXHU5MWNkXHU3NTI4XHU4ZDQ0XHU0ZWE3XHU3Njg0XHU1NmZlXHU2ODA3XHUzMDAyDQotcmVwb3J0X2ljb25TZWN0aW9uX2Rlc2M9XHU1YjlhXHU1MjM2XHU2YjY0XHU2MmE1XHU1NDRhXHU3Njg0XHU1NmZlXHU2ODA3XHUzMDAyDQotcHJhY3RpY2VfaWNvblNlY3Rpb25fZGVzYz1cdTViOWFcdTUyMzZcdTZiNjRcdTViOWVcdThkZjVcdTc2ODRcdTU2ZmVcdTY4MDdcdTMwMDINCi1leGFtcGxlX2ljb25TZWN0aW9uX2Rlc2M9XHU1YjlhXHU1MjM2XHU2YjY0XHU3OTNhXHU0ZjhiXHU3Njg0XHU1NmZlXHU2ODA3XHUzMDAyDQotZ3VpZGVsaW5lX2ljb25TZWN0aW9uX2Rlc2M9XHU1YjlhXHU1MjM2XHU2YjY0XHU2MzA3XHU1MzU3XHU3Njg0XHU1NmZlXHU2ODA3XHUzMDAyDQotcm9hZG1hcF9pY29uU2VjdGlvbl9kZXNjPVx1NWI5YVx1NTIzNlx1NmI2NFx1OGRlZlx1N2ViZlx1NTZmZVx1NzY4NFx1NTZmZVx1NjgwN1x1MzAwMg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9pY29uU2VjdGlvbl9kZXNjPVx1NWI5YVx1NTIzNlx1NmI2NFx1NjUyZlx1NjMwMVx1Njc1MFx1NjU5OVx1NzY4NFx1NTZmZVx1NjgwN1x1MzAwMg0KLQ0KLWVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX3RpdGxlPVx1NjU4N1x1NGVmNlx1NWRmMlx1NjZmNFx1NjUzOQ0KLWVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX21lc3NhZ2U9XHU1ZGYyXHU1NzI4XHU2NTg3XHU0ZWY2XHU3Y2ZiXHU3ZWRmXHU0ZTBhXHU2NmY0XHU2NTM5XHU0ZTg2XHU2NTg3XHU0ZWY2XHUzMDAyXHU2NjJmXHU1NDI2XHU4OTgxXHU4OGM1XHU1MTY1XHU4ZmQ5XHU0ZTliXHU2NmY0XHU2NTM5XHVmZjFmDQotDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU9XHU2ZDNiXHU1MmE4XHU1M2VmXHU1M2Q4XHU2MDI3DQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnPVx1NmQzYlx1NTJhOFx1MjAxY3swfVx1MjAxZFx1NjVlMFx1NmNkNVx1NzUyOFx1MjAxY3sxfVx1MjAxZFx1Njc2NVx1OGJiZVx1N2Y2ZVx1NTNlZlx1NTNkOFx1NjAyN1x1ZmYwY1x1NTZlMFx1NGUzYVx1MjAxY3sxfVx1MjAxZFx1NWRmMlx1NjcwOVx1NGUwMFx1OTg3OVx1NjIxNlx1NTkxYVx1OTg3OVx1NGY1Y1x1NGUzYVx1NTE3Nlx1NWI1MFx1NTE0M1x1N2QyMFx1NzY4NFx1NjNkMFx1NGY5Ylx1ZmYwZlx1NjZmZlx1NjM2Mlx1NmQzYlx1NTJhOFx1MzAwMg0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzE9XHU2ZDNiXHU1MmE4XHUyMDFjezB9XHUyMDFkXHU2NWUwXHU2Y2Q1XHU3NTI4XHU1YjgzXHU3Njg0XHU0ZTAwXHU0ZTJhXHU3NmY0XHU2M2E1XHU3MjM2XHU1MTQzXHU3ZDIwXHU1NDhjXHU0ZWZiXHU0ZjU1XHU2ZDQxXHU3YTBiXHU2NzY1XHU4YmJlXHU3ZjZlXHU1M2VmXHU1M2Q4XHU2MDI3XHUzMDAyDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMj1cdTZkM2JcdTUyYThcdTIwMWN7MH1cdTIwMWRcdTY1ZTBcdTZjZDVcdTc1MjhcdTIwMWN7MX1cdTIwMWRcdTY3NjVcdThiYmVcdTdmNmVcdTUzZWZcdTUzZDhcdTYwMjdcdWZmMGNcdTU2ZTBcdTRlM2FcdThmZDlcdTVjMDZcdTRmMWFcdTViZmNcdTgxZjRcdTVmYWFcdTczYWZcdTc2ODRcdTRmOWRcdThkNTZcdTUxNzNcdTdjZmJcdTMwMDINCi0NCi1hcHBseV9wYXR0ZXJuX2Vycm9yX3RpdGxlPVx1NWU5NFx1NzUyOFx1NmEyMVx1NWYwZg0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnPVx1NmQzYlx1NTJhOFx1MjAxY3swfVx1MjAxZFx1NjVlMFx1NmNkNVx1NzUyOFx1MjAxY3sxfVx1MjAxZFx1Njc2NVx1NWU5NFx1NzUyOFx1NmEyMVx1NWYwZlx1ZmYwY1x1NTZlMFx1NGUzYVx1OGZkOVx1NWMwNlx1NGYxYVx1NWJmY1x1ODFmNFx1NWZhYVx1NzNhZlx1NzY4NFx1NGY5ZFx1OGQ1Nlx1NTE3M1x1N2NmYlx1MzAwMg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX2RlbGltaXRlcj18DQotTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9zaG93T3duZXJJbkxpYnJhcnlWaWV3PVx1NTcyOFx1NWU5M1x1ODljNlx1NTZmZVx1NGUyZFx1NjYzZVx1NzkzYVx1NmI2NFx1NjcyYVx1ODllM1x1Njc5MFx1NWYxNVx1NzUyOFx1NzY4NFx1NjJlNVx1NjcwOVx1ODAwNQ0KLU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlVW5yZXNvbHZlZFJlZmVyZW5jZT1cdTk2NjRcdTUzYmJcdTZiNjRcdTY3MmFcdTg5ZTNcdTY3OTBcdTc2ODRcdTVmMTVcdTc1MjgNCi1wcm9tcHREZWxldGVDdXN0b21DYXRlZ29yeUJlZm9yZVJlbW92ZUxhc3RSZWZUb0l0PVx1NjBhOFx1NWMwNlx1OTY2NFx1NTNiYlx1NjNkMlx1NGVmNlx1NGUyZFx1NWJmOSB7MH0gXHU3Njg0XHU2NzAwXHU1NDBlXHU1ZjE1XHU3NTI4XHUzMDAyXHU1YzA2XHU1MjIwXHU5NjY0XHU1MTQzXHU3ZDIwXHUzMDAyXHU4OTgxXHU3ZWU3XHU3ZWVkXHU1NDE3XHVmZjFmDQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSNCZWxvdyBwcm9wZXJ0eSAiZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzIiBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQNCi0jRG9uJ3QgZGVsZXRlIGEgc3BhY2UgYWZ0ZXIgIjogIg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzPVx1ZmYxYQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOWIzY2IzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGb3JtIFBhZ2UgVGl0bGVzDQotYXNzaWduUGFnZV90aXRsZT1cdTYzMDdcdTZkM2UNCi1jYXRlZ29yaWVzUGFnZV90aXRsZT1cdTdhMmVcdTk4NWUNCi1kZWxpdmVyYWJsZVBhcnRzUGFnZV90aXRsZT1cdTRlYTRcdTRlZDhcdTk4MDVcdTc2ZWVcdTdkNDRcdTRlZjYNCi1kZXNjcmlwdGlvblBhZ2VfdGl0bGU9XHU4YWFhXHU2NjBlDQotZGlzY2lwbGluZXNQYWdlX3RpdGxlPVx1ODk4Zlx1N2JjNA0KLWRpc2NhcmR1bnJlc29sdmVkcmVmPVx1NjM2OFx1NjhjNFx1NjcyYVx1ODllM1x1Njc5MFx1NzY4NFx1NTNjM1x1NzE2Nw0KLWd1aWRhbmNlUGFnZV90aXRsZT1cdTYzMDdcdTVmMTUNCi1wcmV2aWV3UGFnZV90aXRsZT1cdTk4MTBcdTg5YmQNCi1yZWZlcmVuY2VzUGFnZV90aXRsZT1cdTUzYzNcdTcxNjcNCi1yZWZlcmVuY2VfdGV4dD1cdTUzYzNcdTcxNjdcdWZmMWENCi1yZWZlcmVuY2VXb3JrZmxvd1BhZ2VfdGl0bGU9XHU1M2MzXHU3MTY3XHU1ZGU1XHU0ZjVjXHU2ZDQxXHU3YTBiDQotcm9sZXNQYWdlX3RpdGxlPVx1ODlkMlx1ODI3Mg0KLXJvbGVTZXRzUGFnZV90aXRsZT1cdTg5ZDJcdTgyNzJcdTk2YzYNCi1zdGVwc1BhZ2VfdGl0bGU9XHU2YjY1XHU5YTVmDQotdGFza3NQYWdlX3RpdGxlPVx1NGY1Y1x1Njk2ZA0KLXRvb2xNZW50b3JzUGFnZV90aXRsZT1cdTVkZTVcdTUxNzdcdThmMTRcdTUyYTkNCi13b3JrUHJvZHVjdHNQYWdlX3RpdGxlPVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLQ0KLSMgU2VjdGlvbiBOYW1lcyAmIERlc2NyaXB0aW9uDQotY2hlY2tJdGVtc1NlY3Rpb25fbmFtZT1cdTZhYTJcdTY3ZTVcdTk4MDVcdTc2ZWUNCi1jaGVja0l0ZW1zU2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NjljYlx1NjIxMFx1NmI2NFx1NjgzOFx1NWMwZFx1NmUwNVx1NTVhZVx1NzY4NFx1NmFhMlx1NjdlNVx1OTgwNVx1NzZlZVx1MzAwMg0KLWRlcGVuZGVuY2llc1NlY3Rpb25fbmFtZT1cdTc2ZjhcdTRmOWRcdTk1ZGNcdTRmYzINCi1kZXBlbmRlbmNpZXNTZWN0aW9uX2Rlc2M9XHU2NzJjXHU3YmMwXHU5ODZmXHU3OTNhXHU2YjY0XHU1MTY3XHU1YmI5XHU1OTU3XHU0ZWY2XHU4MjA3XHU1MTc2XHU0ZWQ2XHU1MTY3XHU1YmI5XHU1OTU3XHU0ZWY2XHU3Njg0XHU3NmY4XHU0ZjlkXHU5NWRjXHU0ZmMyXHUzMDAyDQotZGV0YWlsU2VjdGlvbl9uYW1lPVx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYQ0KLWRldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjR7MH1cdTc2ODRcdThhNzNcdTdkMzBcdThjYzdcdThhMGFcdTMwMDINCi1nZW5lcmFsSW5mb1NlY3Rpb25fbmFtZT1cdTRlMDBcdTgyMmNcdThjYzdcdThhMGENCi1nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjR7MH1cdTc2ODRcdTRlMDBcdTgyMmNcdThjYzdcdThhMGFcdTMwMDINCi1pY29uU2VjdGlvbl9uYW1lPVx1NTcxNlx1NzkzYQ0KLWljb25TZWN0aW9uX2Rlc2M9XHU4MWVhXHU4YTAyXHU2YjY0ezB9XHU3Njg0XHU1NzE2XHU3OTNhXHUzMDAyDQotbm90YXRpb25TZWN0aW9uX25hbWU9XHU5MDVlXHU5MDAxXHU4Y2M3XHU4YTBhDQotbm90YXRpb25TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0ezB9XHU3Njg0XHU0ZWE0XHU0ZWQ4XHU4Y2M3XHU4YTBhXHUzMDAyDQotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX25hbWU9XHU1M2MzXHU3MTY3XHU3Njg0XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHVmZjFhDQotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX2Rlc2M9XHU2NzJjXHU3YmMwXHU5ODZmXHU3OTNhXHU2YjY0XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHU2MjQwXHU1M2MzXHU3MTY3XHU3Njg0XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHUzMDAyDQotc3RhZmZpbmdTZWN0aW9uX25hbWU9XHU0ZWJhXHU1NGUxXHU5MTRkXHU3ZjZlXHU4Y2M3XHU4YTBhDQotc3RhZmZpbmdTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4OWQyXHU4MjcyXHU3Njg0XHU0ZWJhXHU1NGUxXHU5MTRkXHU3ZjZlXHU4Y2M3XHU4YTBhXHUzMDAyDQotc3RlcHNTZWN0aW9uX25hbWU9XHU2YjY1XHU5YTVmDQotc3RlcHNTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU1N2Y3XHU4ODRjXHU5MDE5XHU5ODA1XHU0ZjVjXHU2OTZkXHU3Njg0XHU2YjY1XHU5YTVmXHUzMDAyDQotdGFpbG9yaW5nU2VjdGlvbl9uYW1lPVx1OGFiZlx1NjU3NA0KLXRhaWxvcmluZ1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjR7MH1cdTc2ODRcdThhYmZcdTY1NzRcdThjYzdcdThhMGFcdTMwMDINCi12YXJpYWJpbGl0eVNlY3Rpb25fbmFtZT1cdTUxNjdcdTViYjlcdThiOGFcdTc1NzBcdTYwMjcNCi12YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjR7MH1cdTgyMDdcdTUzZTZcdTRlMDBcdTUwMGJ7MH1cdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi12ZXJzaW9uSW5mb1NlY3Rpb25fbmFtZT1cdTcyNDhcdTY3MmNcdThjYzdcdThhMGENCi12ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjR7MH1cdTc2ODRcdTcyNDhcdTY3MmNcdThjYzdcdThhMGFcdTMwMDINCi0NCi0jIFVJICYgRWxlbWVudCBBdHRyaWJ1dGUgTGFiZWxzDQotYWRkaXRpb25hbEluZm9fdGV4dD1cdTUxNzZcdTRlZDZcdThjYzdcdThhMGFcdWZmMWENCi1hcHBsaWNhdGlvbl90ZXh0PVx1NjFjOVx1NzUyOFx1N2EwYlx1NWYwZlx1ZmYxYQ0KLWFjdGlvbkxhYmVsX2VkaXQ9XHU3ZGU4XHU4ZjJmDQotYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdj1cdTU3MjhcdTdhMGJcdTVmMGZcdTVlYWJcdTg5OTZcdTU3MTZcdTRlMmRcdTk4NmZcdTc5M2ENCi1hbHRlcm5hdGl2ZXNfdGV4dD1cdTY2ZmZcdTRlZTNcdTY1YjlcdTY4NDhcdWZmMWENCi1hc3NpZ25tZW50QXBwcm9hY2hlc190ZXh0PVx1NjMwN1x1NmQzZVx1NjViOVx1NmNkNVx1ZmYxYQ0KLWF1dGhvcnNfdGV4dD1cdTRmNWNcdTgwMDVcdWZmMWENCi1iYWNrZ3JvdW5kX3RleHQ9XHU4MGNjXHU2NjZmXHVmZjFhDQotYmFzZUVsZW1lbnRfdGV4dD1cdTU3ZmFcdTY3MmNcdWZmMWENCi1iYXNlR3VpZGFuY2VfdGV4dD1cdTU3ZmFcdTY3MmNcdTYzMDdcdTVmMTVcdWZmMWENCi1icmllZkRlc2NyaXB0aW9uX3RleHQ9XHU3YzIxXHU4OTgxXHU4YWFhXHU2NjBlXHVmZjFhDQotZGVzY3JpcHRpb25fdGV4dD1cdThhYWFcdTY2MGVcdWZmMWENCi1iYWNrdXBiZWZvcmVzYXZlX3RleHQ9XHU1MTMyXHU1YjU4XHU0ZTRiXHU1MjRkXHU1MDk5XHU0ZWZkDQotYnJpZWZPdXRsaW5lX3RleHQ9XHU3YzIxXHU3N2VkXHU2OTgyXHU4OTgxXHVmZjFhDQotY2hhbmdlRGF0ZV90ZXh0PVx1OGI4YVx1NjZmNFx1NjVlNVx1NjcxZlx1ZmYxYQ0KLWNoYW5nZURlc2NyaXB0aW9uX3RleHQ9XHU4YjhhXHU2NmY0XHU4YWFhXHU2NjBlXHVmZjFhDQotY2hlY2tJdGVtc190ZXh0PVx1NmFhMlx1NjdlNVx1OTgwNVx1NzZlZQ0KLWNvbnRyaWJ1dGVzX3RleHQ9XHU2M2QwXHU1MWZhDQotbG9jYWxDb250cmlidXRlc190ZXh0PUxvY2FsQ29udHJpYnV0ZXMNCi1jb250cmlidXRlc190b190ZXh0PVx1NjNkMFx1NTFmYVx1ODFmMw0KLWNvcHlyaWdodF90ZXh0PVx1ODQ1N1x1NGY1Y1x1NmIwYVx1ZmYxYQ0KLWVkaXRvcl90ZXh0PVx1N2RlOFx1OGYyZlx1NTY2OA0KLWV4dGVuZHNfdGV4dD1cdTVlZjZcdTRmMzgNCi1leHRlbmRfdGV4dD1cdTVlZjZcdTRmMzgNCi1leHRlcm5hbERlc2NyaXB0aW9uX3RleHQ9XHU1OTE2XHU5MGU4XHU4YWFhXHU2NjBlXHVmZjFhDQotZXh0ZXJuYWxJZF90ZXh0PVx1NTkxNlx1OTBlOCBJRFx1ZmYxYQ0KLWdvYWxzX3RleHQ9XHU3NmVlXHU2YTE5XHVmZjFhDQotaW1wYWN0T2ZOb3RIYXZpbmdfdGV4dD1cdTZiMjBcdTdmM2FcdTRlMGJcdTUyMTdcdTk4MDVcdTc2ZWVcdTc2ODRcdTVmNzFcdTk3ZmZcdWZmMWENCi1rZXlDb25zaWRlcmF0aW9uc190ZXh0PVx1NGUzYlx1ODk4MVx1ODAwM1x1OTFjZlx1ZmYxYQ0KLWxldmVsc09mQWRvcHRpb25fdGV4dD1cdTYzYTFcdTc1MjhcdTVjNjRcdTZiMjFcdWZmMWENCi1tYWluRGVzY3JpcHRpb25fdGV4dD1cdTRlM2JcdTg5ODFcdThhYWFcdTY2MGVcdWZmMWENCi1uZXdFbGVtZW50X3RleHQ9XHU2NWIwXHU1ZWZhIHswfQ0KLW5hbWVfdGV4dD1cdTU0MGRcdTdhMzFcdWZmMWENCi1ub3RBcHBsaWNhYmxlX3RleHQ9XHU0ZTBkXHU5MDY5XHU3NTI4DQotcGFja2FnaW5nR3VpZGFuY2VfdGV4dD1cdTU5NTdcdTg4ZGRcdTYzMDdcdTVmMTVcdWZmMWENCi1wcmVzZW50YXRpb25OYW1lX3RleHQ9XHU1NDQ4XHU3M2ZlXHU1NDBkXHU3YTMxXHVmZjFhDQotcHJvbXB0Zm9ybGliYXJ5X3RleHQ9XHU1NTVmXHU1MmQ1XHU2NjQyXHU2M2QwXHU3OTNhXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiDQotZW5hYmxlSGVhbHRoQ2hlY2tfdGV4dD1cdTU1NWZcdTc1MjhcdTUxNjdcdTkwZThcdTk2NjRcdTkzMmZcdTVkZTVcdTUxNzcNCi1wcm9ibGVtX3RleHQ9XHU1NTRmXHU5ODRjXHVmZjFhDQotcHVycG9zZV90ZXh0PVx1NzUyOFx1OTAxNFx1ZmYxYQ0KLXJlYXNvbkZvck5vdE5lZWRpbmdfdGV4dD1cdTRlMGRcdTk3MDBcdTg5ODFcdTc2ODRcdTUzOWZcdTU2ZTBcdWZmMWENCi1yZXBsYWNlc190ZXh0PVx1NTNkNlx1NGVlMw0KLWxvY2FsUmVwbGFjZXNfdGV4dD1Mb2NhbFJlcGxhY2VzDQotcmVwcmVzZW50YXRpb25PcHRpb25zX3RleHQ9XHU4ODY4XHU3OTNhXHU2Y2Q1XHU5MDc4XHU5ODA1XHVmZjFhDQotdGVtcGxhdGVGaWxlX3RleHQ9XHU3YmM0XHU2NzJjXHU2YTk0XHVmZjFhDQotc2tpbGxzX3RleHQ9XHU2MjgwXHU1ZGU3XHVmZjFhDQotc3RlcHNfdGV4dD1cdTZiNjVcdTlhNWZcdWZmMWENCi1zdGVwc19uYW1lX3RleHQ9XHU1NDBkXHU3YTMxXHVmZjFhDQotc3RvcF90ZXh0PVx1NTA1Y1x1NmI2Mg0KLXByaW50X3RleHQ9XHU1MjE3XHU1MzcwDQotc3lub255bXNfdGV4dD1cdTU0MGNcdTdmYTlcdTViNTdcdWZmMWENCi10eXBlX3RleHQ9XHU5ODVlXHU1NzhiXHVmZjFhDQotY29weV90ZXh0PVx1ODkwN1x1ODhmZA0KLWRlZXBDb3B5X3RleHQ9XHU2ZGYxXHU1YzY0XHU4OTA3XHU4OGZkDQotYmFja190ZXh0PVx1NGUwYVx1NGUwMFx1NmI2NQ0KLW5ld19wbHVnaW49XHU2NWIwXHU1ZWZhXHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotbW92ZT1cdTc5ZmJcdTUyZDUuLi4NCi11bmlxdWVJZF90ZXh0PVx1NTUyZlx1NGUwMCBJRFx1ZmYxYQ0KLXZhcmlhYmlsaXR5VHlwZV90ZXh0PVx1OGI4YVx1NzU3MFx1NjAyN1x1OTg1ZVx1NTc4Ylx1ZmYxYQ0KLXZlcnNpb25fdGV4dD1cdTcyNDhcdTY3MmNcdWZmMWENCi0NCi0jIEJ1dHRvbiBMYWJlbHMNCi1hZGRCdXR0b25fdGV4dD1cdTY1YjBcdTU4OWUuLi4NCi1hdHRhY2hCdXR0b25fdGV4dD1cdTk2NDRcdTUyYTAuLi4NCi1icm93c2VCdXR0b25fdGV4dD1cdTcwMGZcdTg5YmQuLi4NCi1jaGFuZ2VUeXBlQnV0dG9uX3RleHQ9XHU4YjhhXHU2NmY0XHU5ODVlXHU1NzhiLi4uDQotY2xlYXJCdXR0b25fdGV4dD1cdTZlMDVcdTk2NjQNCi1kZWxldGVCdXR0b25fdGV4dD1cdTUyMmFcdTk2NjQNCi1kZXRhY2hCdXR0b25fdGV4dD1cdTUyMDZcdTk1OGINCi1kaWFncmFtX3NhdmVFcnJvcj1cdTUxMzJcdTViNThcdTU3MTZcdTg5ZTNcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTQNCi1kb3duQnV0dG9uX3RleHQ9XHU0ZTBiDQotZGlyZWN0b3J5X3RleHQ9XHU3NmVlXHU5MzA0XHVmZjFhDQotb3JkZXJCdXR0b25fdGV4dD1cdTZiMjFcdTVlOGYNCi1lZGl0QnV0dG9uX3RleHQ9XHU3ZGU4XHU4ZjJmLi4uDQotcmVtb3ZlQnV0dG9uX3RleHQ9XHU3OWZiXHU5NjY0DQotcmVuYW1lQWN0aW9uX3RleHQ9XHU5MWNkXHU2NWIwXHU1NDdkXHU1NDBkLi4uDQotcmVtb3ZlX3RleHQ9XHU3OWZiXHU5NjY0DQotcmVuYW1lX3RleHQ9XHU5MWNkXHU2NWIwXHU1NDdkXHU1NDBkDQotU2F2ZUFzX3RleHQ9XHU1M2U2XHU1YjU4XHU2NWIwXHU2YTk0DQotc2VsZWN0QnV0dG9uX3RleHQ9XHU5MDc4XHU1M2Q2Li4uDQotZGVzZWxlY3RCdXR0b25fdGV4dD1cdTUzZDZcdTZkODhcdTkwNzhcdTUzZDYNCi11cEJ1dHRvbl90ZXh0PVx1NGUwYQ0KLW1ha2VEZWZhdWx0QnV0dG9uX3RleHQ9XHU4YTJkXHU3MGJhXHU5ODEwXHU4YTJkXHU1MDNjDQotdmlld0hpc3RvcnlCdXR0b25fdGV4dD1cdTZhYTJcdTg5OTZcdTZiNzdcdTdhMGIuLi4NCi0NCi0jIFJvbGUgRWRpdG9yIFRhc2tzIFBhZ2UNCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25OYW1lPVx1NGY1Y1x1Njk2ZA0KLXJvbGVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1NmI2NFx1ODlkMlx1ODI3Mlx1NjYyZlx1NGUwYlx1NTIxN1x1NGY1Y1x1Njk2ZFx1NzY4NFx1NTdmN1x1ODg0Y1x1ODAwNVx1MzAwMg0KLXJvbGVUYXNrc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU3Njg0XHU0ZjVjXHU2OTZkDQotcm9sZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsPVx1NGUzYlx1ODk4MVx1NTdmN1x1ODg0Y1x1ODAwNVx1ZmYxYQ0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHU1MTc2XHU0ZWQ2XHU1N2Y3XHU4ODRjXHU4MDA1XHVmZjFhDQotcm9sZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU0ZjVjXHU2OTZkXHUzMDAyDQotDQotIyBSb2xlIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdWZmMWENCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU2MzA3XHU1YjlhXHU2YjY0XHU4OWQyXHU4MjcyXHU4Y2EwXHU4Y2FjXHU3Njg0XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHUzMDAyDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU3Njg0XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHVmZjFhDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdThjYTBcdThjYWNcdWZmMWENCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMj1cdTZiNjRcdTg5ZDJcdTgyNzJcdTU3ZjdcdTg4NGNcdTc2ODRcdTRmNWNcdTY5NmRcdTYyNDBcdThmMzhcdTUxZmFcdTc2ODRcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdWZmMWENCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHUzMDAyDQotDQotIyBSb2xlIEVkaXRvciBHdWlkYW5jZSBQYWdlDQotcm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1cdTYzMDdcdTVmMTUNCi1yb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTRlZTVcdTYzMDdcdTVmMTVcdTVmNjJcdTVmMGZcdTYzZDBcdTRmOWJcdTUxNzZcdTRlZDZcdThjYzdcdThhMGFcdTc2ODRcdTkzYzhcdTdkNTBcdTMwMDINCi1yb2xlR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NzY4NFx1NjMwN1x1NWYxNVx1ZmYxYQ0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTYzMDdcdTVmMTVcdWZmMWENCi1yb2xlR3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDc4XHU1M2Q2IHswfSBcdTUwMGJcdTYzMDdcdTVmMTVcdTMwMDINCi0NCi0jIFJvbGUgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQ0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1cdTdhMmVcdTk4NWVcdWZmMWENCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NmI2NFx1ODlkMlx1ODI3Mlx1OTZiOFx1NWM2Y1x1NzY4NFx1N2EyZVx1OTg1ZVx1MzAwMg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTg5ZDJcdTgyNzJcdTk2YzZcdWZmMWENCi1yb2xlQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyPVx1ODFlYVx1OGEwMlx1N2EyZVx1OTg1ZVx1ZmYxYQ0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPVx1ODlkMlx1ODI3Mlx1OTZjNlx1ZmYxYQ0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1cdTgxZWFcdThhMDJcdTdhMmVcdTk4NWVcdWZmMWENCi0NCi0jIFRhc2sgRWRpdG9yIFJvbGVzIFBhZ2UNCi10YXNrUm9sZXNQYWdlX3NlY3Rpb25OYW1lPVx1ODlkMlx1ODI3Mg0KLXRhc2tSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1NjMwN1x1NmQzZVx1ODlkMlx1ODI3Mlx1NGY4Nlx1NTdmN1x1ODg0Y1x1OTAxOVx1OTgwNVx1NGY1Y1x1Njk2ZFx1MzAwMg0KLXRhc2tSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU3Njg0XHU4OWQyXHU4MjcyXHVmZjFhDQotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVx1NGUzYlx1ODk4MVx1NTdmN1x1ODg0Y1x1ODAwNVx1ZmYxYQ0KLXRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHU1MTc2XHU0ZWQ2XHU1N2Y3XHU4ODRjXHU4MDA1XHVmZjFhDQotdGFza1JvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU4OWQyXHU4MjcyXHUzMDAyDQotdGFza1JvbGVzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX21vZGlmeV9tZXNzYWdlPUlVUEEwMDA0NVc6IFx1NjBhOFx1ODk4MVx1NWMwN1x1NGUzYlx1ODk4MVx1NTdmN1x1ODg0Y1x1ODAwNVx1NjUzOVx1NzBiYSAnJ3swfScnIFx1NTVjZVx1ZmYxZg0KLXRhc2tSb2xlc1BhZ2VfY29uZmlybV90aXRsZT1cdTc4YmFcdThhOGRcdTRlM2JcdTg5ODFcdTg5ZDJcdTgyNzJcdThiOGFcdTY2ZjQNCi0NCi0jIFRhc2sgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTYzMDdcdTViOWFcdTkwMTlcdTk4MDVcdTRmNWNcdTY5NmRcdTc2ODRcdThmMzhcdTUxNjVcdTUzY2FcdThmMzhcdTUxZmFcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTMwMDINCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTUzZWZcdTc1MjhcdTc2ODRcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWMNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVx1NWZjNVx1ODk4MVx1OGYzOFx1NTE2NVx1ZmYxYQ0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1OTA3OFx1NzUyOFx1OGYzOFx1NTE2NVx1ZmYxYQ0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwzPVx1OGYzOFx1NTFmYVx1ZmYxYQ0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDc4XHU1M2Q2IHswfSBcdTUwMGJcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTMwMDINCi0NCi0jIFRhc2sgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi10YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPVx1NjMwN1x1NWYxNQ0KLXRhc2tHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1NGVlNVx1NjMwN1x1NWYxNVx1NWY2Mlx1NWYwZlx1NjNkMFx1NGY5Ylx1NTE3Nlx1NGVkNlx1OGNjN1x1OGEwYVx1NzY4NFx1OTNjOFx1N2Q1MFx1MzAwMg0KLXRhc2tHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU3Njg0XHU2MzA3XHU1ZjE1XHVmZjFhDQotdGFza0d1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsPVx1NjMwN1x1NWYxNVx1ZmYxYQ0KLXRhc2tHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwNzhcdTUzZDYgezB9IFx1NTAwYlx1NjMwN1x1NWYxNVx1MzAwMg0KLQ0KLSMgVGFzayBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotdGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPVx1N2EyZVx1OTg1ZQ0KLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU5MDE5XHU5ODA1XHU0ZjVjXHU2OTZkXHU5NmI4XHU1YzZjXHU3Njg0XHU3YTJlXHU5ODVlXHUzMDAyDQotdGFza0NhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1ODk4Zlx1N2JjNA0KLXRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9XHU4MWVhXHU4YTAyXHU3YTJlXHU5ODVlDQotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHU4OThmXHU3YmM0XHVmZjFhDQotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1ODFlYVx1OGEwMlx1N2EyZVx1OTg1ZVx1ZmYxYQ0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBUYXNrcyBQYWdlDQotV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbk5hbWU9XHU0ZjVjXHU2OTZkDQotV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPVx1NmI2NFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1NjYyZlx1NGUwYlx1NTIxN1x1NGY1Y1x1Njk2ZFx1NzY4NFx1OGYzOFx1NTE2NVx1NjIxNlx1OGYzOFx1NTFmYVx1MzAwMg0KLVdvcmtQcm9kdWN0X1Rhc2tzX0F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NzY4NFx1NGY1Y1x1Njk2ZA0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWw9XHU1ZmM1XHU4OTgxXHU4ZjM4XHU1MTY1XHVmZjFhDQotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDI9XHU5MDc4XHU3NTI4XHU4ZjM4XHU1MTY1XHVmZjFhDQotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDM9XHU4ZjM4XHU1MWZhXHVmZjFhDQotV29ya1Byb2R1Y3RfVGFza3NfTXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwNzhcdTUzZDYgezB9IFx1NTAwYlx1NGY1Y1x1Njk2ZFx1MzAwMg0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBSb2xlcyBQYWdlDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU9XHU4OWQyXHU4MjcyDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1NGUwYlx1NTIxN1x1ODlkMlx1ODI3Mlx1OGNhMFx1OGNhY1x1NjIxNlx1NGZlZVx1NjUzOVx1NmI2NFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1MzAwMg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NzY4NFx1ODlkMlx1ODI3Mg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHU4Y2EwXHU4Y2FjXHU4OWQyXHU4MjcyXHVmZjFhDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHU0ZmVlXHU2NTM5XHU4OWQyXHU4MjcyXHVmZjFhDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwNzhcdTUzZDYgezB9IFx1NTAwYlx1ODlkMlx1ODI3Mlx1MzAwMg0KLQ0KLSMjIFdvcmsgUHJvZHVjdCBFZGl0b3IgRGVsaXZlcmFibGUgUGFydHMgUGFnZQ0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbk5hbWU9XHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlXHU3ZDQ0XHU0ZWY2DQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU2MzA3XHU1YjlhXHU2OWNiXHU2MjEwXHU2YjY0XHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHUzMDAyDQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTUzZWZcdTc1NzZcdTUwNWFcdTRlYTRcdTRlZDhcdTk4MDVcdTc2ZWVcdTc2ODRcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdWZmMWENCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlbGVjdGVkTGFiZWw9XHU3NTc2XHU1MDVhXHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlXHU3Njg0XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHVmZjFhDQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHUzMDAyDQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1cdTYzMDdcdTVmMTUNCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU0ZWU1XHU2MzA3XHU1ZjE1XHU1ZjYyXHU1ZjBmXHU2M2QwXHU0ZjliXHU1MTc2XHU0ZWQ2XHU4Y2M3XHU4YTBhXHU3Njg0XHU5M2M4XHU3ZDUwXHUzMDAyDQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU3Njg0XHU2MzA3XHU1ZjE1XHVmZjFhDQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTYzMDdcdTVmMTVcdWZmMWENCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU2MzA3XHU1ZjE1XHUzMDAyDQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQ0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9XHU3YTJlXHU5ODVlDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU2YjY0XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU5NmI4XHU1YzZjXHU3Njg0XHU3YTJlXHU5ODVlXHUzMDAyDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTk4MThcdTU3ZGYNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTk4NWVcdTU3OGJcdWZmMWENCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMz1cdTgxZWFcdThhMDJcdTdhMmVcdTk4NWVcdWZmMWENCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHU5ODE4XHU1N2RmXHVmZjFhDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTk4NWVcdTU3OGJcdWZmMWENCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwzPVx1ODFlYVx1OGEwMlx1N2EyZVx1OTg1ZVx1ZmYxYQ0KLQ0KLSMgUHJhY3RpY2UgRWRpdG9yIFJlZmVyZW5jZXMgUGFnZQ0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VjdGlvbk5hbWU9XHU1MTY3XHU1YmI5XHU1MTQzXHU3ZDIwDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU2MzA3XHU1YjlhXHU2YjY0XHU0ZjVjXHU2Y2Q1XHU2MjQwXHU1M2MzXHU3MTY3XHU3Njg0XHU1MTY3XHU1YmI5XHU1MTQzXHU3ZDIwXHUzMDAyDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTUzZWZcdTc1MjhcdTc2ODRcdTUxNjdcdTViYjlcdTUxNDNcdTdkMjBcdWZmMWENCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHU1MTY3XHU1YmI5XHU1MTQzXHU3ZDIwXHVmZjFhDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU1MTY3XHU1YmI5XHU1MTQzXHU3ZDIwXHUzMDAyDQotDQotIyBDYXRlZ29yeSBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uTmFtZT1cdTYzMDdcdTVmMTUNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NWM2Y1x1NjViY1x1NmI2NCB7MH0gXHU3Njg0XHU2MzA3XHU1ZjE1XHUzMDAyDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NzY4NFx1NjMwN1x1NWYxNVx1ZmYxYQ0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsPVx1NjMwN1x1NWYxNVx1ZmYxYQ0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU2MzA3XHU1ZjE1XHUzMDAyDQotDQotIyBEaXNjaXBsaW5lIEdyb3VwaW5nIEVkaXRvciBEaXNjaXBsaW5lcyBQYWdlDQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlY3Rpb25OYW1lPVx1ODk4Zlx1N2JjNA0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU1YzZjXHU2NWJjXHU2YjY0XHU4OThmXHU3YmM0XHU3ZmE0XHU3ZDQ0XHU3Njg0XHU4OThmXHU3YmM0XHUzMDAyDQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NzY4NFx1ODk4Zlx1N2JjNFx1ZmYxYQ0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWxlY3RlZExhYmVsPVx1ODk4Zlx1N2JjNFx1ZmYxYQ0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU4OThmXHU3YmM0XHUzMDAyDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Vc2VEZWZhdWx0RGlyZWN0b3J5QnV0dG9uTGFiZWw9XHU0ZjdmXHU3NTI4XHU5ODEwXHU4YTJkXHU3NmVlXHU5MzA0DQotDQotIyBEaXNjaXBsaW5lIEVkaXRvciBUYXNrcyBQYWdlDQotZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uTmFtZT1cdTRmNWNcdTY5NmQNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTZiNjRcdTg5OGZcdTdiYzRcdTc2ODRcdTRmNWNcdTY5NmRcdTMwMDINCi1kaXNjaXBsaW5lVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NzY4NFx1NGY1Y1x1Njk2ZFx1ZmYxYQ0KLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTRmNWNcdTY5NmRcdWZmMWENCi1kaXNjaXBsaW5lVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDc4XHU1M2Q2IHswfSBcdTUwMGJcdTRmNWNcdTY5NmRcdTMwMDINCi0NCi0jIERpc2NpcGxpbmUgRWRpdG9yIFJlZmVyZW5jZSBXb3JrZmxvdyBQYWdlDQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uTmFtZT1cdTUzYzNcdTcxNjdcdTVkZTVcdTRmNWNcdTZkNDFcdTdhMGINCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTZiNjRcdTg5OGZcdTdiYzRcdTc2ODRcdTUzYzNcdTcxNjdcdTVkZTVcdTRmNWNcdTZkNDFcdTdhMGJcdTMwMDINCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NzY4NFx1NTNjM1x1NzE2N1x1NWRlNVx1NGY1Y1x1NmQ0MVx1N2EwYlx1ZmYxYQ0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTUzYzNcdTcxNjdcdTVkZTVcdTRmNWNcdTZkNDFcdTdhMGJcdWZmMWENCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDc4XHU1M2Q2IHswfSBcdTUwMGJcdTUzYzNcdTcxNjdcdTVkZTVcdTRmNWNcdTZkNDFcdTdhMGJcdTMwMDINCi0NCi0jIERvbWFpbiBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWMNCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTZiNjRcdTk4MThcdTU3ZGZcdTc2ODRcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTMwMDINCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NzY4NFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1ZmYxYQ0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdWZmMWENCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHU1ZGYyXHU5MDc4XHU1M2Q2IHswfSBcdTUwMGJcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTMwMDINCi0NCi0jIFdvcmsgUHJvZHVjdCBLaW5kIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NWM2Y1x1NjViY1x1NmI2NFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1OTg1ZVx1NTc4Ylx1NzY4NFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1MzAwMg0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHU1M2VmXHU3NTI4XHU3Njg0XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHVmZjFhDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1ZmYxYQ0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTVkZjJcdTkwNzhcdTUzZDYgezB9IFx1NTAwYlx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1MzAwMg0KLQ0KLSMgUm9sZSBTZXQgR3JvdXBpbmcgRWRpdG9yIFJvbGUgU2V0cyBQYWdlDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25OYW1lPVx1ODlkMlx1ODI3Mlx1OTZjNg0KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU1YzZjXHU2NWJjXHU2YjY0XHU4OWQyXHU4MjcyXHU5NmM2XHU3ZmE0XHU3ZDQ0XHU3Njg0XHU4OWQyXHU4MjcyXHU5NmM2XHUzMDAyDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NzY4NFx1ODlkMlx1ODI3Mlx1OTZjNlx1ZmYxYQ0KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWxlY3RlZExhYmVsPVx1ODlkMlx1ODI3Mlx1OTZjNlx1ZmYxYQ0KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU4OWQyXHU4MjcyXHU5NmM2XHUzMDAyDQotDQotIyBSb2xlIFNldCBFZGl0b3IgUm9sZXMgUGFnZQ0KLXJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU9XHU4OWQyXHU4MjcyDQotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU1YzZjXHU2NWJjXHU2YjY0XHU4OWQyXHU4MjcyXHU5NmM2XHU3Njg0XHU4OWQyXHU4MjcyXHUzMDAyDQotcm9sZVNldFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTUzZWZcdTc1MjhcdTc2ODRcdTg5ZDJcdTgyNzJcdWZmMWENCi1yb2xlU2V0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9XHU4OWQyXHU4MjcyXHVmZjFhDQotcm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU4OWQyXHU4MjcyXHUzMDAyDQotDQotIyBUb29sIEVkaXRvciBUb29sIE1lbnRvcnMgUGFnZQ0KLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbk5hbWU9XHU1ZGU1XHU1MTc3XHU4ZjE0XHU1MmE5DQotdG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU1YzZjXHU2NWJjXHU2YjY0XHU1ZGU1XHU1MTc3XHU3Njg0XHU1ZGU1XHU1MTc3XHU4ZjE0XHU1MmE5XHUzMDAyDQotdG9vbFRvb2xNZW50b3JzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTUzZWZcdTc1MjhcdTc2ODRcdTVkZTVcdTUxNzdcdThmMTRcdTUyYTlcdWZmMWENCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlbGVjdGVkTGFiZWw9XHU1ZGU1XHU1MTc3XHU4ZjE0XHU1MmE5XHVmZjFhDQotdG9vbFRvb2xNZW50b3JzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU1ZGU1XHU1MTc3XHU4ZjE0XHU1MmE5XHUzMDAyDQotDQotIyBDdXN0b20gQ2F0ZWdvcnkgRWRpdG9yIEFzc2lnbiBQYWdlDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25OYW1lPVx1NTE2N1x1NWJiOVx1NTE0M1x1N2QyMA0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU2OWNiXHU2MjEwXHU2YjY0XHU4MWVhXHU4YTAyXHU3YTJlXHU5ODVlXHU3Njg0XHU1MTY3XHU1YmI5XHU1MTQzXHU3ZDIwXHUzMDAyDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX2F2YWlsYWJsZUxhYmVsPVx1NTNlZlx1NzUyOFx1NzY4NFx1NTE2N1x1NWJiOVx1NTE0M1x1N2QyMFx1ZmYxYQ0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWxlY3RlZExhYmVsPVx1NTE2N1x1NWJiOVx1NTE0M1x1N2QyMFx1ZmYxYQ0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU1MTY3XHU1YmI5XHU1MTQzXHU3ZDIwXHUzMDAyDQotDQotIyBOZXcgTWV0aG9kIFBsdWctaW4gV2l6YXJkDQotbmV3UGx1Z2luV2l6YXJkX3RpdGxlPVx1NjViMFx1NWVmYVx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZg0KLW5ld1BsdWdpbldpemFyZFBhZ2VfdGl0bGU9XHU1ZWZhXHU3YWNiXHU2NWIwXHU3Njg0XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotbmV3UGx1Z2luV2l6YXJkUGFnZV90ZXh0PVx1NjMwN1x1NWI5YVx1NjViMFx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1NzY4NFx1NTQwZFx1N2EzMVx1NGUyNlx1NjNkMFx1NGY5Ylx1NGUwMFx1ODIyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLW5ld1BsdWdpbkVycm9yX21zZz1JVVBBMDAyMUU6IFx1NzEyMVx1NmNkNVx1NWVmYVx1N2FjYlx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1MzAwMg0KLW5ld1BsdWdpbkVycm9yX3JlYXNvbj1cdTUxNjdcdTkwZThcdTkzMmZcdThhYTRcdTMwMDJcblwNCi1cblwNCi1cdTU5ODJcdTk3MDBcdTc2ZjhcdTk1ZGNcdThjYzdcdThhMGFcdWZmMGNcdThhY2JcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTMwMGRcdTMwMDINCi0NCi0jIEdlbmVyaWMgZGlhbG9nIHRpdGxlcw0KLWNyZWF0ZURpYWxvZ190aXRsZT1cdTVlZmFcdTdhY2JcdTUxNDNcdTdkMjANCi1kZWxldGVEaWFsb2dfdGl0bGU9XHU1MjJhXHU5NjY0XHU1MTQzXHU3ZDIwDQotZWRpdERpYWxvZ190aXRsZT1cdTdkZThcdThmMmZcdTUxNDNcdTdkMjANCi1lcnJvckRpYWxvZ190aXRsZT1cdTkzMmZcdThhYTQNCi1tb3ZlRGlhbG9nX3RpdGxlPVx1NzlmYlx1NTJkNVx1NTE0M1x1N2QyMA0KLXJlbmFtZURpYWxvZ190aXRsZT1cdTkxY2RcdTY1YjBcdTU0N2RcdTU0MGRcdTUxNDNcdTdkMjANCi13YXJuaW5nRGlhbG9nX3RpdGxlPVx1OGI2Nlx1NTQ0YQ0KLQ0KLSMgQWRkIENvbmZpZ3VyYXRpb24gdG8gUHJvY2VzcyBFcnJvciBEaWFsb2cNCi1hZGRDb25maWdFcnJvckRpYWxvZ190aXRsZT1cdTY1YjBcdTU4OWVcdTkxNGRcdTdmNmVcdTgxZjNcdTdhMGJcdTVlOGYNCi0NCi0jIFNldCBEZWZhdWx0IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotc2V0RGVmYXVsdENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPVx1OGEyZFx1NWI5YVx1N2EwYlx1NWU4Zlx1NzY4NFx1OTgxMFx1OGEyZFx1OTE0ZFx1N2Y2ZQ0KLQ0KLSMgRWRpdCBQcm9jZXNzIEVycm9yIERpYWxvZw0KLWVkaXRQcm9jZXNzRWxlbWVudEVycm9yRGlhbG9nX3RpdGxlPVx1N2RlOFx1OGYyZlx1N2EwYlx1NWU4Zlx1NTE0M1x1N2QyMA0KLQ0KLSMgT3BlbiBMaWJyYXJ5IERpYWxvZw0KLW9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlPVx1OTU4Ylx1NTU1Zlx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYg0KLW9wZW5MaWJyYXJ5RGlhbG9nX3RleHQ9XHU3NmVlXHU1MjRkXHU3Njg0XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU2NzJhXHU2YjYzXHU3OGJhXHU1MTMyXHU1YjU4XHUzMDAyXHU2MGE4XHU4OTgxXHU1ZmZkXHU3NTY1XHU5MzJmXHU4YWE0XHU0ZTI2XHU3ZTdjXHU3ZThjXHU5NThiXHU1NTVmXHU1M2U2XHU0ZTAwXHU1MDBiXHU3YTBiXHU1ZjBmXHU1ZWFiXHU1NWNlXHVmZjFmDQotDQotIyBTYXZlIExpYnJhcnkgRGlhbG9nDQotc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGU9XHU1MTMyXHU1YjU4XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiDQotc2F2ZUxpYnJhcnlEaWFsb2dfdGV4dD1cdTVkZjJcdTRmZWVcdTY1MzlcdTc2ZWVcdTUyNGRcdTc2ODRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTMwMDJcdTYwYThcdTg5ODFcdTUxMzJcdTViNThcdThiOGFcdTY2ZjRcdTU1Y2VcdWZmMWYNCi0NCi0jIFVwZ3JhZGUgTGlicmFyeSBEaWFsb2cNCi11cGdyYWRlTGlicmFyeURpYWxvZ190aXRsZT1cdTUzNDdcdTdkMWFcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWINCi0NCi0jIERlbGV0ZSBFbGVtZW50IFJlZmVyZW5jZSBEaWFsb2cNCi1kZWxldGVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PVx1NWRmMlx1NTIyYVx1OTY2NFx1NTE0M1x1N2QyMCAnJ3swfScnXHUzMDAyXHU2MGE4XHU4OTgxXHU1ZjllICcnezF9JycgXHU0ZTJkXHU3OWZiXHU5NjY0XHU2YjY0XHU1MTQzXHU3ZDIwXHU1NWNlXHVmZjFmDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLW5vT3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDBFOiBcdTY3MmFcdTk1OGJcdTU1NWZcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTMwMDJcblwNCi1cblwNCi1cdTVmYzVcdTk4MDhcdTk1OGJcdTU1NWZcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdWZmMGNcdTYyNGRcdTgwZmRcdTY1YjBcdTU4OWVcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTMwMDJcblwNCi1cblwNCi1cdThhY2JcdTVlZmFcdTdhY2JcdTY1YjBcdTc2ODRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTYyMTZcdTk1OGJcdTU1NWZcdTczZmVcdTY3MDlcdTc2ODRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdWZmMGNcdTcxMzZcdTVmOGNcdTUxOGRcdThhNjZcdTRlMDBcdTZiMjFcdTMwMDINCi1lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEEwMDAxRTogXHU5MDdhXHU2ZjBmezB9XHU1NDBkXHU3YTMxXHUzMDAyXG5cDQotXG5cDQotXHU2MjQwXHU2NzA5XHU2NWI5XHU2Y2Q1XHU1NDhjXHU3YTBiXHU1ZThmXHU1MTQzXHU3ZDIwXHU5MGZkXHU1ZmM1XHU5ODA4XHU2NzA5XHU1NDBkXHU3YTMxXHUzMDAyXG5cDQotXG5cDQotXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU3OGJhXHU1YjlhXHUzMDBkXHVmZjBjXHU4ZjM4XHU1MTY1XHU1MTQzXHU3ZDIwXHU3Njg0XHU2NzA5XHU2NTQ4XHU1NDBkXHU3YTMxXHUzMDAyDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDJFOiBcdTU0MGRcdTdhMzEgJyd7MH0nJyBcdTVkZjJcdTViNThcdTU3MjhcdTMwMDJcblwNCi1cblwNCi1cdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTVmYzVcdTk4MDhcdTY3MDlcdTU1MmZcdTRlMDBcdTU0MGRcdTdhMzFcdTMwMDJcblwNCi1cblwNCi1cdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdTc4YmFcdTViOWFcdTMwMGRcdWZmMGNcdThmMzhcdTUxNjVcdTRlMGRcdTU0MGNcdTc2ODRcdTUxNDNcdTdkMjBcdTU0MGRcdTdhMzFcdTMwMDINCi1jcmVhdGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDNFOiBcdTcxMjFcdTZjZDVcdTVlZmFcdTdhY2JcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTMwMDINCi1kZWxldGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDRXOiBcdTcxMjFcdTZjZDVcdTUyMmFcdTk2NjRcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTMwMDINCi1pbnRlcm5hbEVycm9yX21zZz1JVVBBMDAwNUU6IFx1NzY3Y1x1NzUxZlx1NTE2N1x1OTBlOFx1OTMyZlx1OGFhNFx1MzAwMlxuXA0KLVxuXA0KLVx1NTk4Mlx1OTcwMFx1NzZmOFx1OTVkY1x1OGNjN1x1OGEwYVx1ZmYwY1x1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1MzAwZFx1MzAwMg0KLWludmFsaWRQcmVzZW50YXRpb25OYW1lRXJyb3JfbXNnPUlVUEEwMDA2RTogXHU2MzA3XHU1YjlhXHU3Njg0XHU1NDQ4XHU3M2ZlXHU1NDBkXHU3YTMxXHU3MTIxXHU2NTQ4XHUzMDAyXG5cDQotXG5cDQotXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU3OGJhXHU1YjlhXHUzMDBkXHVmZjBjXHU4ZjM4XHU1MTY1XHU0ZTBkXHU1NDBjXHU3Njg0XHU1NDBkXHU3YTMxXHUzMDAyDQotaW52YWxpZENvbmZpZ0Vycm9yX21zZz1JVVBBMDAwN0U6IFx1OTA3OFx1NTNkNlx1NzY4NFx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZSAnJ3swfScnIFx1NGUwZFx1NjYyZlx1N2EwYlx1NWU4Zlx1NzY4NFx1OTgxMFx1OGEyZFx1OTE0ZFx1N2Y2ZVx1NzY4NFx1NWI1MFx1OTZjNlx1MzAwMlxuXA0KLVxuXA0KLVx1NzBiYVx1NGU4Nlx1NGZkZFx1NjMwMVx1N2EwYlx1NWU4Zlx1NzY4NFx1NWI4Y1x1NjU3NFx1NjAyN1x1ZmYwY1x1OTgxMFx1OGEyZFx1OTE0ZFx1N2Y2ZVx1NWZjNVx1OTgwOFx1NjYyZlx1N2EwYlx1NWU4Zlx1NzZmOFx1OTVkY1x1NGU0Ylx1NTE3Nlx1NGVkNlx1NjI0MFx1NjcwOVx1OTE0ZFx1N2Y2ZVx1NzY4NFx1OGQ4NVx1OTZjNlx1MzAwMlxuXA0KLVxuXA0KLVx1OGFjYlx1OTA3OFx1NTNkNlx1NTNlNlx1NGUwMFx1NTAwYlx1OTE0ZFx1N2Y2ZVx1ZmYwY1x1NjIxNlx1NGZlZVx1NjUzOVx1OTgxMFx1OGEyZFx1OTE0ZFx1N2Y2ZVx1NGY4Nlx1NTMwNVx1NTQyYlx1OTA3OFx1NWI5YVx1OTE0ZFx1N2Y2ZVx1NzY4NFx1NTE2N1x1NWJiOVx1ZmYwY1x1NzEzNlx1NWY4Y1x1NTE4ZFx1OGE2Nlx1NGUwMFx1NmIyMVx1MzAwMg0KLXNldERlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDhFOiBcdTkwNzhcdTUzZDZcdTc2ODRcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmUgJyd7MH0nJyBcdTRlMGRcdTY2MmZcdTdhMGJcdTVlOGZcdTYyNDBcdTUzYzNcdTcxNjdcdTRlNGJcdTUxNzZcdTRlZDZcdTkxNGRcdTdmNmVcdTc2ODRcdThkODVcdTk2YzZcdTMwMDJcblwNCi1cblwNCi1cdTcwYmFcdTRlODZcdTRmZGRcdTYzMDFcdTdhMGJcdTVlOGZcdTc2ODRcdTViOGNcdTY1NzRcdTYwMjdcdWZmMGNcdTk4MTBcdThhMmRcdTkxNGRcdTdmNmVcdTVmYzVcdTk4MDhcdTY2MmZcdTdhMGJcdTVlOGZcdTc2ZjhcdTk1ZGNcdTRlNGJcdTUxNzZcdTRlZDZcdTYyNDBcdTY3MDlcdTkxNGRcdTdmNmVcdTc2ODRcdThkODVcdTk2YzZcdTMwMDJcblwNCi1cblwNCi1cdThhY2JcdTkwNzhcdTUzZDZcdTUzZTZcdTRlMDBcdTUwMGJcdTkxNGRcdTdmNmVcdWZmMGNcdTYyMTZcdTRmZWVcdTY1MzlcdTkwNzhcdTViOWFcdTkxNGRcdTdmNmVcdTc2ODRcdTUxNjdcdTViYjlcdWZmMGNcdTcxMzZcdTVmOGNcdTUxOGRcdThhNjZcdTRlMDBcdTZiMjFcdTMwMDINCi1vcGVuTGlicmFyeUVycm9yX21zZz1JVVBBMDAwOUU6IFx1NzEyMVx1NmNkNVx1OGYwOVx1NTE2NVx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1MzAwMlxuXA0KLVxuXA0KLVx1NTk4Mlx1OTcwMFx1NzZmOFx1OTVkY1x1OGNjN1x1OGEwYVx1ZmYwY1x1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1MzAwZFx1MzAwMg0KLXNhdmVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEwRTogXHU3MTIxXHU2Y2Q1XHU1MTMyXHU1YjU4XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHUzMDAyDQotc2F2ZUxpYnJhcnlUb0Vycm9yX21zZz1JVVBBMDAxMEU6IFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NzEyMVx1NmNkNVx1NTEzMlx1NWI1OFx1ODFmMyAnJ3swfScnXHUzMDAyDQotZWxlbWVudEFscmVhZHlEZWxldGVkRXJyb3JfbXNnPUlVUEEwMDExRTogXHU1ZGYyXHU1MjJhXHU5NjY0XHU1MTQzXHU3ZDIwICcnezB9JydcdTMwMDINCi11cGdyYWRlTGlicmFyeUVycm9yX21zZz1JVVBBMDAxMkU6IFx1NzEyMVx1NmNkNVx1NTM0N1x1N2QxYVx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1MzAwMg0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVycm9yX3JlYXNvbj1JVVBBMDAxNkU6IFx1NzY3Y1x1NzUxZlx1OTMyZlx1OGFhNFx1MzAwMlxuXA0KLVxuXA0KLVx1NTk4Mlx1OTcwMFx1NzZmOFx1OTVkY1x1OGNjN1x1OGEwYVx1ZmYwY1x1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1MzAwZFx1MzAwMg0KLWludGVybmFsRXJyb3JfcmVhc29uPUlVUEEwMDE3RTogXHU3NjdjXHU3NTFmXHU1MTY3XHU5MGU4XHU5MzJmXHU4YWE0XHUzMDAyXG5cDQotXG5cDQotXHU1OTgyXHU5NzAwXHU3NmY4XHU5NWRjXHU4Y2M3XHU4YTBhXHVmZjBjXHU4YWNiXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5XHUzMDBkXHUzMDAyDQotdXBncmFkZUxpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMThFOiBcdThmMDlcdTUxNjVcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTUxNDNcdTdkMjBcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdTMwMDJcblwNCi1cblwNCi1cdTU5ODJcdTk3MDBcdTc2ZjhcdTk1ZGNcdThjYzdcdThhMGFcdWZmMGNcdThhY2JcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTMwMGRcdTMwMDINCi1zYXZlVXBncmFkZWRMaWJyYXJ5RXJyb3JfcmVhc29uPUlVUEEwMDE5RTogXHU1MTMyXHU1YjU4XHU1ZGYyXHU1MzQ3XHU3ZDFhXHU3Njg0XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0XHUzMDAyXG5cDQotXG5cDQotXHU1OTgyXHU5NzAwXHU3NmY4XHU5NWRjXHU4Y2M3XHU4YTBhXHVmZjBjXHU4YWNiXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5XHUzMDBkXHUzMDAyDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLW9wZW5pbmdMaWJyYXJ5VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1OTU4Ylx1NTU1Zlx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYi4uLg0KLXNhdmluZ0xpYnJhcnlUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU1MTMyXHU1YjU4XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiLi4uDQotdXBncmFkaW5nTGlicmFyeVRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTUzNDdcdTdkMWFcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWIuLi4NCi1sb2FkaW5nTGlicmFyeUVsZW1lbnRzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1OGYwOVx1NTE2NVx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NTE0M1x1N2QyMC4uLg0KLXNhdmluZ1VwZ3JhZGVkRWxlbWVudHNUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU0ZWU1XHU2NWIwXHU3Njg0XHU2YTk0XHU2ODQ4XHU2ODNjXHU1ZjBmXHU1MTMyXHU1YjU4XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU1MTQzXHU3ZDIwLi4uDQotc2F2aW5nVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NTEzMlx1NWI1OCAnJ3swfScnLi4uDQotc2F2aW5nRmlsZXNUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU1MTMyXHU1YjU4XHU2YTk0XHU2ODQ4Li4uDQotZml4aW5nQ29udGVudERlc2NyaXB0aW9uR1VJRHNUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU0ZmVlXHU2YjYzXHU1MTY3XHU1YmI5XHU4YWFhXHU2NjBlIEdVSUQuLi4NCi1kZWxldGluZ0ludmFsaWRSZWZlcmVuY2VzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NTIyYVx1OTY2NFx1NzEyMVx1NjU0OFx1NTNjM1x1NzE2Ny4uLg0KLQ0KLQ0KLSMgQWRkIEVkaXRvciBUbyBCcm93c2luZyBQZXJzcGVjdGl2ZSBXYXJuaW5nIERpYWxvZw0KLWFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZz1JVVBBMDA0Nlc6IFx1NmI2NFx1ODk5Nlx1NjY2Zlx1NWRmMlx1NzI3OVx1NTIyNVx1OGEyZFx1OGEwOFx1OGI5M1x1NjBhOFx1NGVlNVx1NjcwMFx1NGY3M1x1NjViOVx1NWYwZlx1NzAwZlx1ODliZFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NTE0M1x1N2QyMFx1NzY4NCBIVE1MIFx1ODg2OFx1NzkzYVx1NmNkNVx1MzAwMlx1OTAxOVx1ODhlMVx1NzEyMVx1NmNkNVx1NjViMFx1NTg5ZVx1NjIxNlx1OTg2Zlx1NzkzYVx1NGVmYlx1NGY1NVx1N2RlOFx1OGYyZlx1NTY2OFx1MzAwMg0KLQ0KLSMgQ2hhbmdlIEhpc3RvcnkgRGlhbG9nDQotQ2hhbmdlSGlzdG9yeURpYWxvZ190aXRsZT1cdThiOGFcdTY2ZjRcdThhYWFcdTY2MGVcdTZiNzdcdTdhMGINCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX2xhYmVsPVx1OGI4YVx1NjZmNFx1NmI3N1x1N2EwYlx1ZmYxYQ0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgRGVsZXRlIEFjdGlvbg0KLWNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU9XHU3OGJhXHU4YThkXHU1MjJhXHU5NjY0DQotY29uZmlybURlbGV0ZURpYWxvZ19tc2c9XHU2MGE4XHU3OGJhXHU1YjlhXHU4OTgxXHU1MjJhXHU5NjY0ICcnezB9JycgXHU1NWNlXHVmZjFmDQotY29uZmlybURlbGV0ZURpYWxvZ19tc2dXaXRoUmVmZXJlbmNlPVx1NjBhOFx1NzhiYVx1NWI5YVx1ODk4MVx1NTIyYVx1OTY2NCAnJ3swfScnIFx1NTVjZVx1ZmYxZlxuXA0KLVxuXA0KLVx1NGUwYlx1NTIxN1x1NTE0M1x1N2QyMFx1NTNjM1x1NzE2N1x1NTIzMFx1ODk4MVx1NTIyYVx1OTY2NFx1NzY4NFx1OTgwNVx1NzZlZVx1ZmYxYXsxfQ0KLQ0KLSMgTmV3IExpYnJhcnkgRGlhbG9nDQotZXJyb3JEaWFsb2dfbWVzc2FnZT1JVVBBMDAyMkU6IFx1NzEyMVx1NmNkNVx1NWVmYVx1N2FjYlx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYiAnJ3swfScnXHUzMDAyDQotZXJyb3JEaWFsb2dfZXJyb3I9XHU3MTIxXHU2Y2Q1XHU1NzI4XHU1M2U2XHU0ZTAwXHU1MDBiXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU1MTY3XHU1MThkXHU1ZWZhXHU3YWNiXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHUzMDAyDQotZXJyX25vb3BlbmxpYnJhcnk9SVVQQTAwNDBFOiBcdTY3MmFcdTk1OGJcdTU1NWZcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTMwMDJcblwNCi1cblwNCi1cdTVmYzVcdTk4MDhcdTk1OGJcdTU1NWZcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdWZmMGNcdTYyNGRcdTgwZmRcdTY1YjBcdTU4OWVcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTMwMDJcblwNCi1cblwNCi1cdThhY2JcdTVlZmFcdTdhY2JcdTY1YjBcdTc2ODRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTYyMTZcdTk1OGJcdTU1NWZcdTczZmVcdTY3MDlcdTc2ODRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdWZmMGNcdTcxMzZcdTVmOGNcdTUxOGRcdThhNjZcdTRlMDBcdTZiMjFcdTMwMDINCi1lcnJfbG9hZGluZ2xpYnJhcnk9XHU4ZjA5XHU1MTY1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0DQotbXNnX3JlbG9hZExpYnJhcnk9XHU1ZmE5XHU1MzlmXHU1OTMxXHU2NTU3XHU3Njg0XHU1MjJhXHU5NjY0XHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0XHUzMDAyXHU1ZmM1XHU5ODA4XHU5MWNkXHU2NWIwXHU4ZjA5XHU1MTY1XHU3NmVlXHU1MjRkXHU3Njg0XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHUzMDAyDQotDQotIyBSZWxvYWQgTGlicmFyeSBEaWFsb2cNCi1yZWxvYWREaWFsb2dfbWVzc2FnZT1cdTdhMGJcdTVmMGZcdTVlYWJcdTVmYzVcdTk4MDhcdTkxY2RcdTY1YjBcdThmMDlcdTUxNjVcdTRmODZcdTkwODRcdTUzOWZcdTgxZjNcdTUzOWZcdTU5Y2JcdTcyYzBcdTYxNGJcdTMwMDINCi1yZWxvYWREaWFsb2dfdGl0bGU9XHU5MWNkXHU2NWIwXHU4ZjA5XHU1MTY1XHU3YTBiXHU1ZjBmXHU1ZWFiDQotZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yVGl0bGU9XHU3OWZiXHU1MmQ1XHU5MzJmXHU4YWE0DQotZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yTWVzc2FnZT1cdTc5ZmJcdTUyZDVcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTQNCi0NCi0jIFByb2Nlc3MgRm9ybSBFZGl0b3INCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU9XHU1MTMyXHU1YjU4DQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UxPVx1NmI2NFx1OGI4YVx1NjZmNFx1NWMwN1x1NWY3MVx1OTdmZlx1NmQ0MVx1N2EwYlx1NzY4NFx1NjI0MFx1NjcwOVx1NTcxNlx1ODllM1x1MzAwMlx1OGI4YVx1NjZmNFx1NGU0Ylx1NWY4Y1x1NWMwN1x1NTEzMlx1NWI1OFx1N2RlOFx1OGYyZlx1NTY2OFx1MzAwMlx1ODk4MVx1N2U3Y1x1N2U4Y1x1NTVjZVx1ZmYxZg0KLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMj1cdThiOGFcdTY2ZjRcdTRlNGJcdTVmOGNcdTVjMDdcdTUxMzJcdTViNThcdTdkZThcdThmMmZcdTU2NjhcdTMwMDJcdTg5ODFcdTdlN2NcdTdlOGNcdTU1Y2VcdWZmMWYNCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBQYWdlDQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX3RpdGxlPVx1NzhiYVx1OGE4ZFx1NzlmYlx1OTY2NA0KLWNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ19tZXNzYWdlPVx1NjBhOFx1NzhiYVx1NWI5YVx1ODk4MVx1NzlmYlx1OTY2NFx1ODk5Nlx1NTcxNiAnJ3swfScnIFx1NTVjZVx1ZmYxZg0KLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ190aXRsZT1cdThiNjZcdTU0NGENCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uPVx1OTE0ZFx1N2Y2ZVx1ZmYxYQ0KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3cz1cdTkxNGRcdTdmNmVcdTg5OTZcdTU3MTYNCi1jb25maWdWaWV3UGFnZV92aWV3cz1cdTg5OTZcdTU3MTYNCi1jb2x1bW5zZWxlY3Rpb25fdGV4dD1cdTc2ZjRcdTZiMDRcdTkwNzhcdTY0YzdcdWZmMWENCi1jb25maWdWaWV3UGFnZV9hZGRWaWV3QnV0dG9uVGV4dD1cdTY1YjBcdTU4OWVcdTg5OTZcdTU3MTYuLi4NCi1jb25maWdWaWV3UGFnZV9yZW1vdmVWaWV3QnV0dG9uVGV4dD1cdTc5ZmJcdTk2NjRcdTg5OTZcdTU3MTYNCi1jb25maWdWaWV3UGFnZV9tYWtlRGVmYXVsdEJ1dHRvblRleHQ9XHU4YTJkXHU3MGJhXHU5ODEwXHU4YTJkXHU1MDNjDQotY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNXOiBcdTVkZjJcdTViNThcdTU3MjhcdTU0MGRcdTdhMzFcdTcwYmEgJyd7MH0nJyBcdTc2ODRcdTg5OTZcdTU3MTZcdTMwMDINCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25UaXRsZT1cdTVkZjJcdTc2N2NcdTRmNDhcdTc2ODRcdTVjMGVcdTg5YmRcdTg5OTZcdTU3MTYNCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25NZXNzYWdlPVx1NjMwN1x1NWI5YVx1NzY3Y1x1NGY0OFx1NmI2NFx1OTE0ZFx1N2Y2ZVx1NjY0Mlx1NWMwN1x1NTMwNVx1NTQyYlx1NzY4NFx1ODk5Nlx1NTcxNlx1MzAwMlx1ODJlNVx1ODk4MVx1NWVmYVx1N2FjYlx1ODk5Nlx1NTcxNlx1ZmYwY1x1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1NjViMFx1NTg5ZVx1ODk5Nlx1NTcxNlx1MzAwZFx1ZmYwY1x1OTA3OFx1NTNkNlx1OTE0ZFx1N2Y2ZVx1NTE2N1x1NGVmYlx1NGY1NVx1NmExOVx1NmU5Nlx1NzY4NFx1NjIxNlx1ODFlYVx1OGEwMlx1NzY4NFx1N2EyZVx1OTg1ZVx1MzAwMlx1OTA3OFx1NTNkNlx1NzY4NFx1N2EyZVx1OTg1ZVx1NWMwN1x1NGVlM1x1ODg2OFx1ODk5Nlx1NTcxNlx1ZmYwY1x1N2EyZVx1OTg1ZVx1NzY4NFx1NmIyMVx1N2EyZVx1OTg1ZVx1NTQ4Y1x1NTE2N1x1NWJiOVx1NTE0M1x1N2QyMFx1NWMwN1x1NGVlM1x1ODg2OFx1ODk5Nlx1NTcxNlx1NzY4NFx1NmEzOVx1NzJjMFx1NTE0M1x1N2QyMFx1MzAwMg0KLQ0KLSMgRGVzY3JpcHRpb24gVGFiDQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfdGl0bGU9XHU4ZjQ5XHU2M2RiXHU2MzA3XHU1ZjE1DQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTE9SVVQQTAwNDBXOiBcdThhY2JcdTUxNDhcdTUxMzJcdTViNThcdTdkZThcdThmMmZcdTU2NjhcdTMwMDINCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMj1cdTZiNjRcdTk4NWVcdTU3OGJcdTZjOTJcdTY3MDlcdTc2ZjhcdTViYjlcdTc2ODRcdTYzMDdcdTVmMTVcdTMwMDINCi0NCi1jaGFuZ2VBY3Rpdml0eVR5cGVXYXJuaW5nRGlhbG9nX3RpdGxlPVx1OGY0OVx1NjNkYlx1NmQzYlx1NTJkNQ0KLSMgQXNzb2NpYXRpb24gRm9ybSBQYWdlDQotQXNzb2NpYXRpb25Gb3JtUGFnZV9CcmllZkRlc2NyaXB0aW9uTGFiZWw9XHU5MDc4XHU1YjlhXHU1MTQzXHU3ZDIwXHU3Njg0XHU3YzIxXHU4OTgxXHU4YWFhXHU2NjBlXHVmZjFhDQotDQotIyBNZXRob2QgRWxlbWVudCBEZXNjcmlwdGlvbg0KLW1ldGhvZEVsZW1lbnREZXNjcmlwdGlvbkVtcHR5TmFtZURpYWxvZ190aXRsZT1cdThmMzhcdTUxNjVcdTUxNDNcdTdkMjBcdTU0MGRcdTdhMzENCi1tZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfbWVzc2FnZT1cdTU0MGRcdTdhMzFcdTZiMDRcdTRmNGRcdTRlMGRcdTgwZmRcdTdhN2FcdTc2N2RcdTMwMDINCi0NCi0jIE1ldGhvZCBQbHVnLWluIERlc2NyaXB0aW9uDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25SZW1vdmVSZWZDb25maXJtX21lc3NhZ2U9XHU1M2Q2XHU2ZDg4XHU5MDc4XHU1M2Q2XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmICcnezB9JycgXHU1M2MzXHU3MTY3XHU3Njg0XHU3NmY4XHU5NWRjXHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHVmZjBjXHU1YzA3XHU3NTIyXHU3NTFmXHU3MTIxXHU2NTQ4XHU3Njg0XHU5NWRjXHU0ZmMyXHVmZjBjXHU2NzAwXHU1ZjhjXHU2NzAzXHU1MjJhXHU5NjY0XHU5MDE5XHU0ZTliXHU5NWRjXHU0ZmMyXHUzMDAyXG5cDQotXG5cDQotXHU2YjY0XHU1MmQ1XHU0ZjVjXHU3MTIxXHU2Y2Q1XHU1ZmE5XHU1MzlmXHUzMDAyXHU2MGE4XHU4OTgxXHU3ZTdjXHU3ZThjXHU1YjhjXHU2MjEwXHU5MDE5XHU5ODA1XHU4YjhhXHU2NmY0XHU1NWNlXHVmZjFmDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWU9XHU2MGE4XHU2ZTk2XHU1MDk5XHU1YzA3XHU2YjY0XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHU3Njg0XHU1NDBkXHU3YTMxICcnezB9JycgXHU2NTM5XHU3MGJhXHU2NWIwXHU1NDBkXHU3YTMxICcnezF9JydcdTMwMDJcdTZiNjRcdTUyZDVcdTRmNWNcdTY3MDNcdTUxMzJcdTViNThcdTZiNjRcdTdkZThcdThmMmZcdTU2NjhcdWZmMGNcdTRlMjZcdTVjMDdcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdThjYzdcdTY1OTlcdTU5M2VcdTkxY2RcdTY1YjBcdTU0N2RcdTU0MGRcdTcwYmFcdTY1YjBcdTU0MGRcdTdhMzFcdTMwMDJcdTg5ODFcdTdlN2NcdTdlOGNcdTU1Y2VcdWZmMWYNCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZV90aXRsZT1cdTkxY2RcdTY1YjBcdTU0N2RcdTU0MGRcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGYNCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY2Fubm90UmVuYW1lUGx1Z2luRm9sZGVyPVx1NzEyMVx1NmNkNVx1NWMwN1x1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1OGNjN1x1NjU5OVx1NTkzZVx1OTFjZFx1NjViMFx1NTQ3ZFx1NTQwZFx1NzBiYVx1NjViMFx1NTQwZFx1N2EzMQ0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luTGFiZWw9XHU5Mzk2XHU1YjlhXHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5fbWVzc2FnZT1cdTkzOTZcdTViOWFcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdThiOGFcdTY2ZjRcdTY3MDNcdTUxMzJcdTViNThcdTRlMjZcdTk1ZGNcdTk1ODlcdTVjNmNcdTY1YmNcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGYgJyd7MH0nJyBcdTc2ODRcdTUxNDNcdTdkMjBcdTVkZjJcdTk1OGJcdTU1NWZcdTc2ODRcdTdkZThcdThmMmZcdTU2NjhcdTMwMDJcdTYwYThcdTg5ODFcdTdlN2NcdTdlOGNcdTkwMTlcdTk4MDVcdThiOGFcdTY2ZjRcdTU1Y2VcdWZmMWYNCi0NCi0jIFByb2Nlc3MgRGVzY3JpcHRpb24NCi1wcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV90aXRsZT1cdTkxY2RcdTY1YjBcdTU0N2RcdTU0MGQNCi1wcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV9tZXNzYWdlPVx1NjBhOFx1NWMwN1x1OGI4YVx1NjZmNFx1NmI2NFx1N2EwYlx1NWU4Zlx1NzY4NFx1NTQwZFx1N2EzMVx1MzAwMlx1OTAxOVx1NmEyM1x1NjcwM1x1NTEzMlx1NWI1OFx1NmI2NFx1N2RlOFx1OGYyZlx1NTY2OFx1ZmYwY1x1NGUyNlx1NWMwN1x1N2EwYlx1NWU4Zlx1OGNjN1x1NjU5OVx1NTkzZVx1OTFjZFx1NjViMFx1NTQ3ZFx1NTQwZFx1NzBiYVx1NjViMFx1NTQwZFx1N2EzMVx1MzAwMlx1ODk4MVx1N2U3Y1x1N2U4Y1x1NTVjZVx1ZmYxZg0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uRGVzY3JpcHRpb249XHU4YWFhXHU2NjBlXHVmZjFhDQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uVGl0bGU9XHU5MTRkXHU3ZjZlDQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uTWVzc2FnZT1cdTYzMDdcdTViOWFcdTZiNjRcdTZkNDFcdTdhMGJcdTY3MDlcdTY1NDhcdTc2ODRcdTYyNDBcdTY3MDlcdTkxNGRcdTdmNmVcdTMwMDJcdTkwNzhcdTUzZDZcdTRlMDBcdTUwMGJcdTkxNGRcdTdmNmVcdTUwNWFcdTcwYmFcdTk4MTBcdThhMmRcdTUwM2NcdWZmMGNcdTRmNDZcdTVmYzVcdTk4MDhcdTY2MmZcdTUxNzZcdTRlZDZcdTYyNDBcdTY3MDlcdTkxNGRcdTdmNmVcdTc2ODRcdThkODVcdTk2YzZcdTMwMDINCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbnM9XHU5MTRkXHU3ZjZlXHVmZjFhDQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2RlZmF1bHQ9XHVmZjA4XHU5ODEwXHU4YTJkXHVmZjA5DQotUHJvY2Vzc0Rlc2NyaXB0aW9uX3NlbGVjdENvbmZpZ3VyYXRpb249XHU5MDc4XHU1M2Q2XHU4OTgxXHU2NWIwXHU1ODllXHU3Njg0XHU5MTRkXHU3ZjZlDQotUHJvY2Vzc0RlbGV0ZUFjdGlvbl9kZWxldGVjb2Zpcm1fdGV4dDA9XHU5MDE5XHU2YTIzXHU2NzAzXHU1MTMyXHU1YjU4XHU3NmVlXHU1MjRkXHU3Njg0XHU3ZGU4XHU4ZjJmXHU1NjY4XHVmZjBjXHU0ZTE0XHU1YzA3XHU2YzM4XHU0ZTQ1XHU4YjhhXHU2NmY0XHUzMDAyXHU2MGE4XHU3OGJhXHU1YjlhXHU4OTgxXHU1MjJhXHU5NjY0ICcnezB9JycgXHU1NWNlXHVmZjFmDQotUHJvY2Vzc0RlbGV0ZUFjdGlvbl9zZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlPVx1OTA3OFx1NTNkNlx1NzY4NFx1NTE0M1x1N2QyMFx1NTcyOFx1NTIyYVx1OTY2NFx1NGU0Ylx1NWY4Y1x1ZmYwY1x1NGUwYlx1NTIxN1x1NjNjZlx1OGZmMFx1NWI1MFx1NWMwN1x1NGUwZFx1NTE4ZFx1NGY3Zlx1NzUyOFx1MzAwMlxuXA0KLVx1OTA3OFx1NTNkNlx1NjBhOFx1ODk4MVx1NTIyYVx1OTY2NFx1NzY4NFx1NjNjZlx1OGZmMFx1NWI1MFx1MzAwMg0KLQ0KLSMgVmlldyBIZWxwZXINCi12aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfdGl0bGU9XHU3YTBiXHU1ZjBmXHU1ZWFiXHU2MDI3XHU4MGZkXHU3MmMwXHU2MTRiXHU2YWEyXHU2N2U1DQotdmlld0hlbHBlcl9wZXJmb3JtSGVhbHRoQ2hlY2s9XHU2YjYzXHU1NzI4XHU2YWEyXHU2N2U1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU3Njg0XHU1MDY1XHU1MTY4XHU3MmMwXHU2MTRiLi4uDQotdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX21lc3NhZ2U9XHU1NzI4XHU5NThiXHU1NTVmXHU3Njg0XHU3YTBiXHU1ZjBmXHU1ZWFiXHU0ZTBhXHU1ZGYyXHU5ODA2XHU1MjI5XHU1YjhjXHU2MjEwXHU1MDY1XHU1MTY4XHU3MmMwXHU2MTRiXHU2YWEyXHU2N2U1XHUzMDAyXHU4YWNiXHU1M2MzXHU5NWIxXHU2NWU1XHU4YThjXHU2YTk0XHU3Njg0XHU1ODMxXHU1NDRhXHUzMDAyDQotDQotIyBBdHRhY2ggVGVtcGxhdGUgRmlsZSBEaWFsb2cNCi1hdHRhY2hUZW1wbGF0ZUZpbGVEaWFsb2dfdGl0bGU9XHU5NjQ0XHU1MmEwXHU3YmM0XHU2NzJjXHU2YTk0DQotDQotIyBDcmVhdGUgRWxlbWVudCBFcnJvciBEaWFsb2cNCi1jcmVhdGVFbGVtZW50RGlhbG9nX3RpdGxlPVx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NCB7MH0NCi1jcmVhdGVOZXdFbGVtZW50RXJyb3JfbXNnPVx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NCB7MH0gXHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0XHUzMDAyDQotDQotZGxnVGl0bGVfcmVsb2FkTGlicmFyeT1cdTkxY2RcdTY1YjBcdThmMDlcdTUxNjVcdTdhMGJcdTVmMGZcdTVlYWINCi1jcmVhdGVFbGVtZW50RXJyb3JfcmVhc29uPXswfSBcdTU0MGRcdTdhMzFcdTRlMGRcdTgwZmRcdTdhN2FcdTc2N2RcdTMwMDJcblwNCi1cblwNCi1cdThhY2JcdTYzMDdcdTViOWFcdTY3MDlcdTY1NDhcdTc2ODRcdTU0MGRcdTdhMzFcdWZmMGNcdTcxMzZcdTVmOGNcdTUxOGRcdThhNjZcdTRlMDBcdTZiMjFcdTMwMDINCi1kZWxldGVDb25maWdFcnJvcl9yZWFzb249XHU5MTRkXHU3ZjZlXHU3NTMxXHU3YTBiXHU1ZThmICcnezB9JycgXHU2MjQwXHU1M2MzXHU3MTY3DQotIyBDaGFuZ2VCb3VuZHNDb21tYW5kDQotZ2VmX2NoYW5nZUJvdW5kc0NvbW1hbmRfbGFiZWw9XHU4YjhhXHU2NmY0XHU3NTRjXHU5NjUwDQotIyBDaGFuZ2VOYW1lQ29tbWFuZA0KLWdlZl9jaGFuZ2VOYW1lQ29tbWFuZF9sYWJlbD1cdThiOGFcdTY2ZjRcdTU0MGRcdTdhMzENCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfdW5kb01lc3NhZ2U9XHU3MTIxXHU2Y2Q1XHU1ZmE5XHU1MzlmXHU1NDBkXHU3YTMxXHU4YjhhXHU2NmY0XHUzMDAyXG5cDQotXG5cDQotXHU1OTgyXHU2NzljXHU1MjRkXHU0ZTAwXHU1MDBiXHU1NDBkXHU3YTMxXHU2NjJmXHU3YTdhXHU1MDNjXHVmZjBjXHU1MjQ3XHU0ZTBkXHU1MTQxXHU4YTMxXHU1ZmE5XHU1MzlmXHU1NDBkXHU3YTMxXHU4YjhhXHU2NmY0XHUzMDAyDQotIyBDaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZA0KLWdlZl9jaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZF9sYWJlbD1cdThiOGFcdTY2ZjRcdTUxNjdcdTViYjlcdTUwM2MNCi0jIENyZWF0ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfY3JlYXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1cdTVlZmFcdTdhY2JcdTVmNGVcdTY2ZjJcdTllZGUNCi0jIENyZWF0ZUxpbmtDb21tYW5kDQotZ2VmX2NyZWF0ZUxpbmtDb21tYW5kX2xhYmVsPVx1OTNjOFx1N2Q1MFx1NWVmYVx1N2FjYg0KLSMgQ3JlYXRlTm9kZUNvbW1hbmQNCi1nZWZfY3JlYXRlTm9kZUNvbW1hbmRfbGFiZWw9XHU1ZWZhXHU3YWNiXHU2NWIwXHU3Njg0XHU3YmMwXHU5ZWRlDQotIyBEZWxldGVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX2RlbGV0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9XHU1MjJhXHU5NjY0XHU1ZjRlXHU2NmYyXHU5ZWRlDQotIyBEZWxldGVDb21tYW5kDQotZ2VmX2RlbGV0ZUNvbW1hbmRfbGFiZWw9XHU1MjJhXHU5NjY0DQotIyBEZWxldGVMaW5rQ29tbWFuZA0KLWdlZl9kZWxldGVMaW5rQ29tbWFuZF9sYWJlbD1cdTUyMmFcdTk2NjRcdTkwMjNcdTdkZGENCi0jIE1vdmVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX21vdmVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPVx1NzlmYlx1NTJkNVx1NWY0ZVx1NjZmMlx1OWVkZQ0KLSMgUmVjb25uZWN0TGlua0NvbW1hbmQNCi1nZWZfcmVjb25uZWN0TGlua0NvbW1hbmRfbGFiZWw9XHU5MWNkXHU2NWIwXHU5MDIzXHU2M2E1XHU5M2M4XHU3ZDUwDQotDQotIyBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXINCi1nZWZfdmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdD1cdTU0MGRcdTdhMzFcdTRlMGRcdTgwZmRcdTdhN2FcdTc2N2RcdTMwMDJcdThhY2JcdTYzMDdcdTViOWFcdTY3MDlcdTY1NDhcdTc2ODRcdTU0MGRcdTdhMzFcdTMwMDINCi0jIFZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyDQotZ2VmX3ZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdD1cdTU0MGRcdTdhMzFcdTRlMGRcdTgwZmRcdTdhN2FcdTc2N2RcdTMwMDJcdThhY2JcdTYzMDdcdTViOWFcdTY3MDlcdTY1NDhcdTc2ODRcdTU0MGRcdTdhMzFcdTMwMDINCi0jIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0DQotZ2VmX3dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0X3ZhbGlkYXRlTWVzc2FnZT1cdTU0MGRcdTdhMzFcdTRlMGRcdTgwZmRcdTdhN2FcdTc2N2RcdTMwMDJcdThhY2JcdTYzMDdcdTViOWFcdTY3MDlcdTY1NDhcdTc2ODRcdTU0MGRcdTdhMzFcdTMwMDINCi0NCi0jIEVsZW1lbnRzVmlld0RlbGV0ZUFjdGlvbg0KLWFjdGlvbnNfRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uX21lc3NhZ2U9XHU3MTIxXHU2Y2Q1XHU1MjJhXHU5NjY0XHU5MTRkXHU3ZjZlICcnezB9JydcdWZmMGNcdTU2ZTBcdTcwYmFcdTdhMGJcdTVlOGYgJyd7MX0nJyBcdTRlY2RcdTU3MjhcdTRmN2ZcdTc1MjhcdTZiNjRcdTkxNGRcdTdmNmVcdTMwMDINCi0NCi0jIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcg0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yVGl0bGU9XHU1MjJhXHU5NjY0XHU5MzJmXHU4YWE0DQotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JNZXNzYWdlPVx1NzEyMVx1NmNkNVx1ODY1NVx1NzQwNlx1NzY4NFx1NzU3MFx1NWUzOFx1NzJjMFx1NmNjMQ0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yUmVhc29uPVx1OGFjYlx1NTNjM1x1OTViMVx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OQ0KLQ0KLSMgTWV0aG9kRWxlbWVudEVkaXRvcg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZT1cdTUxMzJcdTViNThcdTkzMmZcdThhYTQNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTE9SVVQQTAwMjBFOiBcdTUxMzJcdTViNThcdTZhOTRcdTY4NDhcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTQNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTI9XHU3OGJhXHU1YjlhXHU5MzJmXHU4YWE0DQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjE9XHU4YWNiXHU1M2MzXHU5NWIxXHU2NWU1XHU4YThjXHU2YTk0XHU0Zjg2XHU1M2Q2XHU1Zjk3XHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5DQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjI9XHU4YWNiXHU1M2MzXHU5NWIxXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5DQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yVGl0bGU9XHU5MWNkXHU2NWIwXHU1NDdkXHU1NDBkXHU5MzJmXHU4YWE0DQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JNc2c9XHU5MDE5XHU1MDBiXHU3ZGU4XHU4ZjJmXHU1NjY4XHU3Njg0XHU0ZTAwXHU2MjE2XHU1OTFhXHU1MDBiXHU2YTk0XHU2ODQ4XHU1ZGYyXHU3OWZiXHU5NjY0XHUzMDAyXHU3ZGU4XHU4ZjJmXHU1NjY4XHU1ZGYyXHU3MTIxXHU2NTQ4XHVmZjBjXHU1ZmM1XHU5ODA4XHU5NWRjXHU5NTg5XHUzMDAyDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JUaXRsZT1cdTcxMjFcdTY1NDhcdTc2ODRcdTdkZThcdThmMmZcdTU2NjgNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JNZXNzYWdlMT1cdTkxY2RcdTY1YjBcdTU0N2RcdTU0MGRcdTZhOTRcdTY4NDggJyd7MH0nJyBcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTQNCi0NCi0jIERlc2NyaXB0aW9uRm9ybVBhZ2UNCi1yZW5hbWVFcnJvcl90aXRsZT1cdTkxY2RcdTY1YjBcdTU0N2RcdTU0MGRcdTUxNDNcdTdkMjANCi1yZW5hbWVFcnJvcl9tc2c9SVVQQTAwMTNFOiBcdTcxMjFcdTZjZDVcdTViOGNcdTYyMTBcdTkxY2RcdTY1YjBcdTU0N2RcdTU0MGRcdTRmNWNcdTY5NmRcdTMwMDINCi1TZWxlY3RFbGVtZW50RGlhbG9nX3NlbGVjdGVsZW1lbnRfdGV4dD1cdTkwNzhcdTUzZDZcdTUxNDNcdTdkMjANCi0NCi0jIEVkaXRvckNob29zZXINCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfdGl0bGU9XHU5NThiXHU1NTVmXHU2NWI5XHU2Y2Q1XHU3ZGU4XHU4ZjJmXHU1NjY4DQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZXNjcmlwdGlvbkxhYmVsPVx1OGFhYVx1NjYwZVx1ZmYxYQ0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9TZWxlY3RBbGxCdXR0b25MYWJlbD1cdTUxNjhcdTkwNzgNCi1PcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlX2VkaXRfdGV4dDA9XHU3ZGU4XHU4ZjJmXHU1MTQzXHU3ZDIwDQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNFOiBcdTcxMjFcdTZjZDVcdTk1OGJcdTU1NWZcdTgyMDdcdTkwNzhcdTViOWFcdTMwMGNcdTY1YjlcdTZjZDVcdTMwMGRcdTUxNDNcdTdkMjBcdTc2ZjhcdTk1ZGNcdTc2ODRcdTdkZThcdThmMmZcdTU2NjhcdTMwMDINCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZT1cdTkwNzhcdTUzZDZcdTVmNzFcdTUwY2ZcdTZhOTQNCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5TmFtZT1cdTY1YjBcdTVlZmFcdTdhMGJcdTVmMGZcdTVlYWINCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfRGVzY3JpcHRpb25MYWJlbD1cdThhYWFcdTY2MGVcdWZmMWENCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1cdTkwNzhcdTUzZDZcdTRlMDBcdTYyMTZcdTU5MWFcdTUwMGJcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdWZmMGNcdTUxOGRcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdTViOGNcdTYyMTBcdTMwMGRcdTRmODZcdTk1OGJcdTU1NWZcdTkxNGRcdTdmNmVcdTMwMDINCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfRGVzZWxlY3RBbGxCdXR0b25MYWJlbD1cdTUzZDZcdTZkODhcdTUxNjhcdTkwNzgNCi1FbGVtZW50c1ZpZXdfbWlncmF0aW9uX2Rpcl9kbGdfZGVzY3JpcHRpb25fdGV4dD1cdTYzMDdcdTViOWFcdTY1YjBcdTc5ZmJcdThmNDlcdTc2ODQgezB9IFx1NzY4NFx1NzZlZVx1OTMwNFx1NGY4Nlx1NTNkNlx1NGVlM1x1OTA3OFx1NTNkNlx1NzY4NCB7MH0NCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uPVx1NzY3Y1x1NzUxZlx1N2NmYlx1N2Q3MVx1OTMyZlx1OGFhNFx1MzAwMlx1NTk4Mlx1OTcwMFx1NzZmOFx1OTVkY1x1OGNjN1x1OGEwYVx1ZmYwY1x1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1MzAwZFx1MzAwMlxuXA0KLVxuXA0KLVx1OGFjYlx1OTVkY1x1OTU4OVx1NGUwMFx1NGU5Ylx1NWRmMlx1OTU4Ylx1NTU1Zlx1NzY4NFx1N2RlOFx1OGYyZlx1NTY2OFx1ZmYwY1x1NzEzNlx1NWY4Y1x1NTE4ZFx1OGE2Nlx1NGUwMFx1NmIyMVx1MzAwMg0KLQ0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGl0bGU9XHU1ZjcxXHU1MGNmXHU3MTIxXHU2NTQ4DQotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZVRvb0JpZ0RpYWxvZ190ZW1wbGF0ZT1JVVBBMDAzMUU6IFx1OTA3OFx1NTNkNlx1NzY4NFx1NWY3MVx1NTBjZiAnJ3swfScnIFx1OGQ4NVx1OTA0ZVx1NWJiOVx1OGEzMVx1NzY4NFx1NTkyN1x1NWMwZiAoezF9IHggezJ9KVx1MzAwMlx1OGFjYlx1OTA3OFx1NTNkNlx1NTNlNlx1NGUwMFx1NTAwYlx1NWY3MVx1NTBjZlx1MzAwMg0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190aXRsZT1cdTVmNzFcdTUwY2ZcdTcxMjFcdTY1NDgNCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzJFOiBcdTkwNzhcdTUzZDZcdTc2ODRcdTZhOTRcdTY4NDggJyd7MH0nJyBcdTRlMGRcdTViNThcdTU3MjhcdTMwMDJcdThhY2JcdTkwNzhcdTUzZDZcdTUzZTZcdTRlMDBcdTUwMGJcdTVmNzFcdTUwY2ZcdTMwMDINCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9XHU5MDc4XHU1M2Q2Li4uDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeURlc2NyaXB0aW9uPVx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1OGFhYVx1NjYwZQ0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZWZhdWx0QnJpZWZEZXNjcmlwdGlvbj1cdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdThhYWFcdTY2MGUNCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZURlc2NyaXB0aW9uPVx1NWZjNVx1OTgwOFx1OTVkY1x1OTU4OVx1NjI0MFx1NjcwOVx1N2RlOFx1OGYyZlx1NTY2OFx1MzAwMlx1NTNlZlx1ODBmZFx1NzY4NFx1OGE3MVx1ZmYwY1x1OGFjYlx1NTE0OFx1OTA3OFx1NTNkNlx1OTcwMFx1ODk4MVx1NTEzMlx1NWI1OFx1NzY4NFx1N2RlOFx1OGYyZlx1NTY2OFx1MzAwMg0KLQ0KLSMgVGVtcGxhdGVEZXNjcmlwdGlvblBhZ2UNCi1mb3Jtc19UZW1wbGF0ZURlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnPVx1OTA3OFx1NTNkNlx1NzY4NFx1NmE5NFx1Njg0OFx1NWRmMlx1N2Q5M1x1NjYyZlx1NmI2NFx1MzAwY1x1N2JjNFx1NjcyY1x1MzAwZFx1NzY4NFx1OTY0NFx1NGVmNlx1MzAwMg0KLQ0KLSMgTmV3IExpYnJhcnkgRXJyb3IgRGlhbG9nDQotbmV3TGlicmFyeUVycm9yX21zZz1JVVBBMDAxNEU6IFx1NzEyMVx1NmNkNVx1NWVmYVx1N2FjYlx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1MzAwMg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24xPVx1NjMwN1x1NWI5YVx1NzY4NFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1OGRlZlx1NWY5MSAnJ3swfScnIFx1NzEyMVx1NjU0OFx1MzAwMg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24yPVx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NWRmMlx1NWI1OFx1NTcyOCAnJ3swfScnIFx1NGUyZFx1MzAwMg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24zPVx1NzEyMVx1NmNkNVx1NWVmYVx1N2FjYlx1NjMwN1x1NWI5YVx1NzY4NFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1OGNjN1x1NjU5OVx1NTkzZSAnJ3swfScnXHUzMDAyDQotbmV3TGlicmFyeUVycm9yX2FkdmljZT1cdTkwNzhcdTUzZDZcdTMwMGNcdTc4YmFcdTViOWFcdTMwMGRcdWZmMGNcdTRlMjZcdThmMzhcdTUxNjVcdTdhMGJcdTVmMGZcdTVlYWJcdTc2ODRcdTUxNzZcdTRlZDZcdTU0MGRcdTdhMzFcdTYyMTZcdThkZWZcdTVmOTFcdTMwMDINCi0NCi0jUHJvY2VzcyBsaXRlcmFscw0KLVByb2Nlc3NfRXh0ZXJuYWxJRD1cdTU5MTZcdTkwZTggSURcdWZmMWENCi1Qcm9jZXNzX1B1cnBvc2U9XHU3NTI4XHU5MDE0XHVmZjFhDQotUHJvY2Vzc19TY29wZT1cdTdiYzRcdTU3MGRcdWZmMWENCi1Qcm9jZXNzX1VzYWdlTm90ZXM9XHU0ZjdmXHU3NTI4XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODA1XHVmZjFhDQotUHJvY2Vzc19BbHRlcm5hdGl2ZXM9XHU2NmZmXHU0ZWUzXHU2NWI5XHU2ODQ4XHVmZjFhDQotUHJvY2Vzc19Ib3dUb1N0YWZmPVx1NTk4Mlx1NGY1NVx1OTE0ZFx1N2Y2ZVx1NGViYVx1NTRlMVx1ZmYxYQ0KLVByb2Nlc3NfS2V5Q29uc2lkZXJhdGlvbj1cdTRlM2JcdTg5ODFcdTgwMDNcdTkxY2ZcdWZmMWENCi1Qcm9jZXNzX1NjYWxlPVx1NmJkNFx1NGY4Ylx1ZmYxYQ0KLVByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljcz1cdTVjMDhcdTY4NDhcdTYwMjdcdThjZWFcdWZmMWENCi1Qcm9jZXNzX1Jpc2tMZXZlbD1cdTk4YThcdTk2YWFcdTdiNDlcdTdkMWFcdWZmMWENCi1Qcm9jZXNzX0VzdGltYXRpbmdUZWNobmlxdWU9XHU5ODEwXHU0ZjMwXHU2MjgwXHU4ODUzXHVmZjFhDQotUHJvY2Vzc19Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPVx1NWMwOFx1Njg0OFx1NjIxMFx1NTRlMVx1NWMwOFx1Njk2ZFx1NzdlNVx1OGI1OFx1ZmYxYQ0KLVByb2Nlc3NfVHlwZU9mQ29udHJhY3Q9XHU1NDA4XHU3ZDA0XHU5ODVlXHU1NzhiXHVmZjFhDQotDQotIyBFZGl0b3IgUHJldmlldyBOYXZpZ2F0aW9uIEJ1dHRvbnMNCi1iYWNrQnV0dG9uX3RleHQ9XHU0ZTBhXHU0ZTAwXHU2YjY1DQotZm9yd2FyZEJ1dHRvbl90ZXh0PVx1NGUwYlx1NGUwMFx1NmI2NQ0KLWZvcndhcmRfdGV4dD1cdTRlMGJcdTRlMDBcdTZiNjUNCi1zdG9wQnV0dG9uX3RleHQ9XHU1MDVjXHU2YjYyDQotcmVmcmVzaEJ1dHRvbl90ZXh0PVx1OTFjZFx1NjViMFx1NjU3NFx1NzQwNg0KLXJlZnJlc2hfdGV4dD1cdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDYNCi1uZXduYW1lX3RleHQ9XHU2NWIwXHU1NDBkXHU3YTMxXHVmZjFhDQotcHJpbnRCdXR0b25fdGV4dD1cdTUyMTdcdTUzNzANCi0NCi0jIENvbnRleHQgbWVudXMNCi1fVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW09XHU5MWNkXHU2NWIwXHU2NTc0XHU3NDA2KCZSKQ0KLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPVx1OTg2Zlx1NzkzYVx1NTE2N1x1NWJiOSgmUykNCi0NCi1fVUlfTWV0aG9kRWRpdG9yX21lbnU9XHU2NWI5XHU2Y2Q1XHU3ZGU4XHU4ZjJmXHU1NjY4KCZNKQ0KLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09XHU2NWIwXHU1ZWZhKCZOKQ0KLV9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbT1cdTY1YjBcdTVlZmFcdTU0MGNcdTVjNjRcdTdkMWFcdTk4MDUoJkUpDQotDQotX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWw9XHU5MDc4XHU5ODA1DQotX1VJX1BhcmVudFBhZ2VfbGFiZWw9XHU2YmNkXHU5ODA1DQotX1VJX0xpc3RQYWdlX2xhYmVsPVx1NmUwNVx1NTVhZQ0KLV9VSV9UcmVlUGFnZV9sYWJlbD1cdTZhMzlcdTcyYzBcdTdkNTBcdTY5Y2INCi1fVUlfVGFibGVQYWdlX2xhYmVsPVx1ODg2OFx1NjgzYw0KLV9VSV9UYWJsZVRyZWVQYWdlX2xhYmVsPVx1ODg2OFx1NjgzY1x1NmEzOQ0KLV9VSV9PYmplY3RDb2x1bW5fbGFiZWw9XHU3MjY5XHU0ZWY2DQotX1VJX1NlbGZDb2x1bW5fbGFiZWw9XHU4MWVhXHU4ZWFiDQotDQotX1VJX05vT2JqZWN0U2VsZWN0ZWQ9XHU1MTY4XHU2NzJhXHU5MDc4DQotX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkPVx1NWRmMlx1OTA3OFx1NTNkNlx1NzY4NFx1NzI2OVx1NGVmNlx1ZmYxYXswfQ0KLV9VSV9NdWx0aU9iamVjdFNlbGVjdGVkPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU3MjY5XHU0ZWY2DQotDQotX1VJX09wZW5FZGl0b3JFcnJvcl9sYWJlbD1cdTk1OGJcdTU1NWZcdTdkZThcdThmMmZcdTU2NjgNCi0NCi1fVUlfV2l6YXJkX2NhdGVnb3J5PVx1N2JjNFx1NGY4YiBFTUYgXHU2YTIxXHU1NzhiXHU1ZWZhXHU3YWNiXHU3Y2JlXHU5NzQ4DQotDQotX1VJX01ldGhvZE1vZGVsV2l6YXJkX2xhYmVsPVx1NjViOVx1NmNkNVx1NmEyMVx1NTc4Yg0KLV9VSV9NZXRob2RNb2RlbFdpemFyZF9kZXNjcmlwdGlvbj1cdTVlZmFcdTdhY2JcdTY1YjBcdTc2ODRcdTY1YjlcdTZjZDVcdTZhMjFcdTU3OGINCi0NCi1fVUlfTWV0aG9kRWRpdG9yX2xhYmVsPVx1NjViOVx1NmNkNVx1NmEyMVx1NTc4Ylx1N2RlOFx1OGYyZlx1NTY2OA0KLQ0KLV9VSV9NZXRob2RFZGl0b3JGaWxlbmFtZURlZmF1bHRCYXNlPVx1NjIxMVx1NzY4NA0KLV9VSV9NZXRob2RFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbj1cdTY1YjlcdTZjZDUNCi0NCi1fVUlfV2l6YXJkX2xhYmVsPVx1NjViMFx1NWVmYQ0KLQ0KLV9XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9uPVx1NmE5NFx1NTQwZFx1N2Q1MFx1NWMzZVx1NWZjNVx1OTgwOFx1NjYyZiAnJy57MH0nJw0KLQ0KLV9VSV9Nb2RlbE9iamVjdD1cdTZhMjFcdTU3OGJcdTcyNjlcdTRlZjYNCi1fVUlfWE1MRW5jb2Rpbmc9WE1MIFx1N2RlOFx1NzhiYw0KLV9VSV9YTUxFbmNvZGluZ0Nob2ljZXM9VVRGLTggQVNDSUkgVVRGLTE2IFVURi0xNkJFIFVURi0xNkxFIElTTy04ODU5LTENCi1fVUlfV2l6YXJkX2luaXRpYWxfb2JqZWN0X2Rlc2NyaXB0aW9uPVx1OTA3OFx1NTNkNlx1ODk4MVx1NWVmYVx1N2FjYlx1NzY4NFx1NmEyMVx1NTc4Ylx1NzI2OVx1NGVmNg0KLQ0KLV9VSV9GaWxlQ29uZmxpY3RfbGFiZWw9XHU2YTk0XHU2ODQ4XHU4ODVkXHU3YTgxDQotX1dBUk5fRmlsZUNvbmZsaWN0PVx1NjcyYVx1NTEzMlx1NWI1OFx1NzY4NFx1OGI4YVx1NjZmNFx1NTQ4Y1x1N2RlOFx1OGYyZlx1NTY2OFx1NGU0Ylx1NTkxNlx1NjI0MFx1NTA1YVx1NzY4NFx1OGI4YVx1NjZmNFx1NzY3Y1x1NzUxZlx1ODg1ZFx1N2E4MVx1MzAwMlx1NjBhOFx1ODk4MVx1NjM2OFx1NjhjNFx1NmI2NFx1N2RlOFx1OGYyZlx1NTY2OFx1NzY4NFx1OGI4YVx1NjZmNFx1NTVjZVx1ZmYxZg0KLQ0KLSMgQWRkIExpbmsgRGlhbG9nDQotYWRkTGlua0RpYWxvZ19saW5rVHlwZT1cdTk4NWVcdTU3OGJcdWZmMWENCi1vcGVuTGlua0NoZWNrYm94X3RleHQ9XHU1NzI4XHU0ZTBkXHU1NDBjXHU3Njg0XHU3MDBmXHU4OWJkXHU1NjY4XHU4OTk2XHU3YTk3XHU5NThiXHU1NTVmXHU5M2M4XHU3ZDUwDQotDQotIyBBZGQgSW1hZ2UgRGlhbG9nDQotaGVpZ2h0TGFiZWxfdGV4dD1cdTlhZDhcdTVlYTZcdWZmMWENCi13aWR0aExhYmVsX3RleHQ9XHU1YmVjXHU1ZWE2XHVmZjFhDQotRWxlbWVudHNWaWV3XzIwPVx1NTI5Zlx1ODBmZFx1NTc4Ylx1NmEyMw0KLUVsZW1lbnRzVmlld18yMT1cdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGINCi1FbGVtZW50c1ZpZXdfMjI9XHU2ZDQxXHU3YTBiDQotRWxlbWVudHNWaWV3XzM1PXswfSBcdTY2MmZcdTU1MmZcdThiODBcdTc2ODRcdTMwMDJcdTdlN2NcdTdlOGNcdTRlNGJcdTUyNGRcdWZmMGNcdThhY2JcdTUxNDhcdThhMmRcdTcwYmFcdTUzZWZcdTViZWJcdTUxNjVcdTMwMDINCi1FbGVtZW50c1ZpZXdfMzY9XHU4ZjA5XHU1MTY1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0DQotYWx0VGFnTGFiZWxfdGV4dD1BTFQgXHU2YTE5XHU3YzY0XHVmZjFhDQotaW1hZ2VTaXplTGFiZWxfdGV4dD1cdTVmNzFcdTUwY2ZcdTc2ODRcdTlhZDhcdTVlYTZcdTU0OGNcdTViZWNcdTVlYTZcdTgxZjNcdTVjMTFcdTVmYzVcdTk4MDhcdTcwYmEgMTAgXHU0ZTE0XHU0ZTBkXHU4ZDg1XHU5MDRlIDYwMFx1MzAwMlx1NzEyMVx1NjU0OFx1NzY4NFx1OWFkOFx1NWVhNlx1NTQ4Y1x1NWJlY1x1NWVhNlx1NWMwN1x1OGY0OVx1NjNkYlx1NzBiYVx1OTA2OVx1NzU3Nlx1NTkyN1x1NWMwZlx1MzAwMg0KLQ0KLSMgUHJvY2VzcyBFZGl0b3INCi1Qcm9jZXNzRWRpdG9yPVByb2Nlc3NFZGl0b3INCi1Qcm9jZXNzRWRpdG9yX05hbWU9XHU1NDBkXHU3YTMxDQotUHJvY2Vzc0VkaXRvcl9QcmVzZW50YXRpb25OYW1lPVx1NTQ0OFx1NzNmZVx1NTQwZFx1N2EzMQ0KLVByb2Nlc3NFZGl0b3JfSW5kZXg9XHU3ZDIyXHU1ZjE1DQotUHJvY2Vzc0VkaXRvcl9QcmVkZWNlc3NvcnM9XHU1MjRkXHU0ZTAwXHU3MjQ4DQotI0NvbmZpZ3VyYXRpb25QYWdlX1NlbGVjdGVkPVNlbGVjdGVkOiANCi1DaGVja2xpc3RPcmRlcl9kZXNjcmlwdGlvbj1cdTkwNzhcdTUzZDZcdTZhYTJcdTY3ZTVcdTk4MDVcdTc2ZWVcdWZmMGNcdTUxOGRcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdTRlMGFcdTMwMGRcdTYyMTZcdTMwMGNcdTRlMGJcdTMwMGRcdTRmODZcdThiOGFcdTY2ZjRcdTZiMjFcdTVlOGZcdTMwMDINCi1FbGVtZW50c1ZpZXdfcmVuYW1pbmdfdGV4dD1cdTZiNjNcdTU3MjhcdTkxY2RcdTY1YjBcdTU0N2RcdTU0MGQuLi4NCi1Qcm9jZXNzRWRpdG9yX01vZGVsSW5mbz1cdTZhMjFcdTU3OGJcdThjYzdcdThhMGENCi1Qcm9jZXNzRWRpdG9yX1ByZWZpeD1cdTViNTdcdTk5OTYNCi1Nb3ZlRGlhbG9nX21vdmVfdGV4dD1cdTc5ZmJcdTUyZDUNCi1DaGVja2xpc3RPcmRlcl90aXRsZT1cdTYzOTJcdTVlOGZcdTZhYTJcdTY3ZTVcdTk4MDVcdTc2ZWUNCi1Qcm9jZXNzRWRpdG9yX1JlcGV0YWJsZT1cdTUzZWZcdTkxY2RcdTg5MDdcdTc2ODQNCi1Qcm9jZXNzRWRpdG9yX09uZ29pbmc9XHU2MzAxXHU3ZThjXHU5MDMyXHU4ODRjXHU0ZTJkDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3luY2hyb25pemF0aW9uPVx1NTQwY1x1NmI2NVx1NTMxNi4uLg0KLVByb2Nlc3NFZGl0b3JfRXZlbnREcml2ZW49XHU0ZThiXHU0ZWY2XHU5YTQ1XHU1MmQ1DQotUHJvY2Vzc0VkaXRvcl9EZWxpdmVyYWJsZT1cdTRlYTRcdTRlZDhcdTk4MDVcdTc2ZWUNCi1Qcm9jZXNzRWRpdG9yX09wdGlvbmFsPVx1OTA3OFx1NzUyOA0KLUZpbHRlckRpYWxvZ19UeXBlX3RleHQ9XHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU5ODVlXHU1NzhiXHVmZjFhDQotRmlsdGVyRGlhbG9nX0V4cGFuZEFsbD1cdTUxNjhcdTkwZThcdTVjNTVcdTk1OGINCi1Nb3ZlRGlhbG9nX21vdmluZ190ZXh0PVx1NmI2M1x1NTcyOFx1NzlmYlx1NTJkNS4uLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbldhcm5pbmc9SVVQQTAwMjVXOiBcdTU3MjhcdThkZWZcdTVmOTEgezF9IFx1NGUyZFx1NjI3ZVx1NGUwZFx1NTIzMCB7MH0gXHU3Njg0XHU1ZjYyXHU3MmMwXHU1NzE2XHU3OTNhDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkU2hhcGVJY29uRXJyb3I9SVVQQTAwMjVFOiBcdTkzMmZcdThhYTRcdWZmMWFcdTVmNjJcdTcyYzBcdTU3MTZcdTc5M2FcdTUzNDBcdTZiYjVcdWZmMWF7MH0NCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX05hbWVMYWJlbD1cdTU0MGRcdTdhMzFcdWZmMWENCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZVRpdGxlPVx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NFx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZQ0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9OYW1lTGFiZWw9XHU1NDBkXHU3YTMxXHVmZjFhDQotQXV0aG9yaW5nVUlQbHVnaW5fbmV3Q29uZmlndXJhdGlvbldpemFyZF90aXRsZT1cdTY1YjBcdTVlZmFcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmUNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdMaWJyYXJ5TWFpblBhZ2VfcGFnZVRpdGxlPVx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYg0KLW5ld0xpYnJhcnlXaXphcmRfdGl0bGU9XHU2NWIwXHU1ZWZhXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVUaXRsZT1cdTUxMzJcdTViNThcdThiOGFcdTY2ZjQNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdMaWJyYXJ5TWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uPVx1NjMwN1x1NWI5YVx1NjViMFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NzY4NFx1NTQwZFx1N2EzMVx1MzAwMVx1OGFhYVx1NjYwZVx1NTNjYVx1NzZlZVx1NmExOVx1NzZlZVx1OTMwNFx1MzAwMg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlRGVzY3JpcHRpb249XHU1ZGYyXHU0ZmVlXHU2NTM5XHU0ZTAwXHU2MjE2XHU1OTFhXHU1MDBiXHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHUzMDAyXHU4YWNiXHU5MDc4XHU1M2Q2XHU5NzAwXHU4OTgxXHU1MTMyXHU1YjU4XHU3Njg0XHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHUzMDAyDQotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGU9XHU5NThiXHU1NTVmXHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25XaXphcmRfd2luZG93VGl0bGU9XHU5NThiXHU1NTVmXHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotRWxlbWVudHNWaWV3X3JlcGxhY2Vpbmd3aXRoZm9ybWF0X3RleHQ9XHU2YjYzXHU1NzI4XHU1M2Q2XHU0ZWUzIHswfS4uLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uV2FybmluZz1JVVBBMDAyNlc6IFx1NTcyOFx1OGRlZlx1NWY5MSB7MX0gXHU0ZTJkXHU2MjdlXHU0ZTBkXHU1MjMwIHswfSBcdTc2ODRcdTdiYzBcdTllZGVcdTU3MTZcdTc5M2ENCi1NZXNzYWdlTGFiZWxQcm92aWRlcl91bnNlbGVjdGVkcGFja2FnZXM9Jyd7MH0nJyBcdTRlMmRcdTY3MDlcdTUxNDNcdTdkMjBcdTUzYzNcdTcxNjdcdTUyMzBcdTY3MmFcdTkwNzhcdTViOWFcdTU5NTdcdTRlZjZcdTc2ODRcdTUxNDNcdTdkMjANCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbkVycm9yPUlVUEEwMDI2RTogXHU5MzJmXHU4YWE0XHVmZjFhXHU3YmMwXHU5ZWRlXHU1NzE2XHU3OTNhXHU1MzQwXHU2YmI1XHVmZjFhezB9DQotU3RlcHNPcmRlckRpYWxvZ19zdGVwcz1cdTZiNjVcdTlhNWZcdWZmMWENCi0NCi1TdGVwc09yZGVyRGlhbG9nX3RpdGxlPVx1NjM5Mlx1NWU4Zlx1NGY1Y1x1Njk2ZFx1NmI2NVx1OWE1Zg0KLVByb2Nlc3NFZGl0b3JfUGxhbm5lZD1cdTg5OGZcdTUyODMNCi1zcGVjaWZ5ZGlyZWN0b3J5X3RleHQ9XHU4YWNiXHU2MzA3XHU1YjlhXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU3Njg0XHU1MTMyXHU1YjU4XHU3NmVlXHU5MzA0DQotUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzPVx1NTkxYVx1NmIyMVx1NTFmYVx1NzNmZVx1NzY4NFx1OTgwNVx1NzZlZQ0KLVByb2Nlc3NFZGl0b3JfRW50cnlTdGF0ZT1cdTkwMzJcdTUxNjVcdTcyYzBcdTYxNGINCi1Qcm9jZXNzRWRpdG9yX0V4aXRTdGF0ZT1cdTdkNTBcdTY3NWZcdTcyYzBcdTYxNGINCi1zZWxlY3RDb2x1bW5zdG9BZGRfdGV4dD1cdTkwNzhcdTUzZDZcdTg5ODFcdTY1YjBcdTU4OWVcdTc2ODRcdTc2ZjRcdTZiMDQNCi1Qcm9jZXNzRWRpdG9yX1R5cGU9XHU5ODVlXHU1NzhiDQotUHJvY2Vzc0VkaXRvcl9UZWFtPVx1NTcxOFx1OTY4YQ0KLUZpbHRlckRpYWxvZ190aXRsZT1cdTkwNzhcdTUzZDZcdTVjMGRcdThhNzFcdTY4NDZcdWZmMWENCi0NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGQ9XHU1ZjllXHU2NWI5XHU2Y2Q1XHU1MTY3XHU1YmI5XHU2NWIwXHU1ODllKCZNKS4uLg0KLUZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbD1cdTUxNjhcdTkwZThcdTY1MzZcdTU0MDgNCi1PcGVuQ2hlYXRzaGVldFZpZXdfdGl0bGU9XHU5NThiXHU1NTVmXHU2M2QwXHU4OTgxXHU4OTk2XHU1NzE2DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbFVwPVx1NGUwYVx1NjM3Mg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxEb3duPVx1NGUwYlx1NjM3Mg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX01vdmVVcD1cdTRlMGFcdTc5ZmIoJk8pDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZURvd249XHU0ZTBiXHU3OWZiKCZXKQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbD1cdTk4NmZcdTc5M2EoJkEpDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29weT1cdTg5MDdcdTg4ZmQoJkMpLi4uDQotRmlsdGVyRGlhbG9nX1BhdHRlcm5fdGV4dD1cdTU0MGRcdTdhMzFcdTU3OGJcdTZhMjNcdWZmMDhcdTVjMDdcdTk4NmZcdTc5M2FcdTc2ZjhcdTdiMjZcdTc2ODRcdTU0MGRcdTdhMzFcdWZmMDlcdWZmMWENCi0NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3RpdGxlPVx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1ZmYxYQ0KLSNNZXNzYWdlVmlld19zZWxlY3RlZF90ZXh0PVNlbGVjdGVkOiANCi1NZXNzYWdlVmlld19lcnJtc2dfdGV4dD1cdThhYWFcdTY2MGUNCi1FbGVtZW50c1ZpZXdfZXJyX3NhdmluZz1JVVBBMDAyN0U6IFx1NTEzMlx1NWI1OCAnJ3swfScnezF9IFx1NjY0Mlx1NzY3Y1x1NzUxZlx1OTMyZlx1OGFhNA0KLQ0KLWVycl9jb3B5aW5nX2ZpbGVfdGl0bGU9XHU4OTA3XHU4OGZkXHU2YTk0XHU2ODQ4XHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0DQotZXJyX2NvcHlpbmdfZmlsZV9lcnJvcj1JVVBBMDAyOEU6IFx1NzEyMVx1NmNkNVx1NjMwN1x1NWI5YVx1NTcxNlx1NzkzYVx1MzAwMg0KLWVycl9jb3B5aW5nX2ZpbGVfcmVhc29uPVx1ODkwN1x1ODhmZFx1OTA3OFx1NTNkNlx1NzY4NFx1NmE5NFx1Njg0OFx1NjY0Mlx1NzY3Y1x1NzUxZlx1OTMyZlx1OGFhNFx1MzAwMlx1NTk4Mlx1OTcwMFx1NzZmOFx1OTVkY1x1OGNjN1x1OGEwYVx1ZmYwY1x1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1MzAwZFx1MzAwMg0KLWVycl9wcm9jZXNzaW5nX2ZpbGVfdGl0bGU9XHU4NjU1XHU3NDA2XHU2YTk0XHU2ODQ4XHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0DQotZWRpdENvbmZpZ3VyYXRpb25fdG9vbHRpcD1cdTdkZThcdThmMmZcdTkxNGRcdTdmNmUNCi1lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQ9SVVQQTAwMTVFOiBcdTcxMjFcdTZjZDVcdTdkZThcdThmMmZcdTUxNDNcdTdkMjANCi1TYXZlVGhpc0FjdGlvbl9zYXZlb2JqZWN0PVx1NTEzMlx1NWI1OFx1OTAxOVx1NTAwYlx1NzI2OVx1NGVmNi4uLg0KLUVsZW1lbnRzVmlld19yZXBsYWNlX3RleHQ9XHU1M2Q2XHU0ZWUzDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRXh0ZW5kPVx1NWVmNlx1NGYzOCgmRSkuLi4NCi1Nb3ZlRGlhbG9nX2Rlc3RpbmF0aW9uX3RleHQ9XHU5MDc4XHU2NGM3XHU5MDc4XHU1YjlhXHU1MTQzXHU3ZDIwXHU3Njg0XHU3NmVlXHU3Njg0XHU1NzMwXHVmZjFhDQotY2hvb3NlRGVmYXVsdERpcmVjdG9yeV90ZXh0PVx1OTA3OFx1NjRjN1x1N2EwYlx1NWYwZlx1NWVhYlx1NzY4NFx1OTgxMFx1OGEyZFx1NzZlZVx1OTMwNFx1ZmYxYQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzPVx1NjZhYlx1NTA1YygmUykNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzczI9XHU3NjdjXHU0ZjQ4XHU5MDc4XHU5ODA1KCZQKS4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0Fzc2lnblVzZXJEaWFncmFtPVx1NGY3Zlx1NzUyOFx1ODAwNVx1NWI5YVx1N2ZhOVx1NzY4NFx1NTcxNlx1ODllMygmVSkuLi4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdGl0bGU9XHU2MzA3XHU1YjlhXHU0ZjdmXHU3NTI4XHU4MDA1XHU1YjlhXHU3ZmE5XHU3Njg0XHU1NzE2XHU4OWUzDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkSW1hZ2U9XHU2ZDNiXHU1MmQ1XHU1NzE2XHVmZjFhDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkZEltYWdlPVx1NmQzYlx1NTJkNVx1NTcxNlx1NjYwZVx1N2QzMFx1ZmYxYQ0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ193cGRJbWFnZT1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTc2ZjhcdTRmOWRcdTk1ZGNcdTRmYzJcdTU3MTZcdWZmMWENCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfbm90YUZpbGU9SVVQQTAwMDRFOiBcdTYzMDdcdTViOWFcdTc2ODRcdThkZWZcdTVmOTFcdTRlMGRcdTY2MmZcdTZhOTRcdTY4NDhcdTMwMDINCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYXNzaWduQnV0dG9uPVx1OTA3OFx1NTNkNi4uLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19lbnRlcmVkSW1hZ2VOb3RGb3VuZD1JVVBBMDAyNEU6IFx1NjMwN1x1NWI5YVx1NzY4NFx1NWY3MVx1NTBjZlx1NGUwZFx1NWI1OFx1NTcyOFx1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZFx1MzAwMlx1OGFjYlx1NzhiYVx1NWI5YVx1OGYzOFx1NTE2NVx1NzZmOFx1NWMwZFx1NjViY1x1N2EwYlx1NWYwZlx1NWVhYlx1NjgzOVx1NzZlZVx1OTMwNFx1NzY4NFx1OGRlZlx1NWY5MVx1MzAwMg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19zZWxlY3RlZEltYWdlTm90Rm91bmQ9SVVQQTAwMzBFOiBcdTYwYThcdTkwNzhcdTUzZDZcdTc2ODRcdTVmNzFcdTUwY2ZcdTRlMGRcdTU3MjhcdTdhMGJcdTVmMGZcdTVlYWJcdTRlMmRcdTMwMDINCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURJbWFnZT1cdTRmN2ZcdTc1MjhcdTZkM2JcdTUyZDVcdTU3MTZcdTVmNzFcdTUwY2ZcdTRmODZcdTcwMGZcdTg5YmRcdTU0OGNcdTc2N2NcdTg4NGMNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURESW1hZ2U9XHU0ZjdmXHU3NTI4XHU2ZDNiXHU1MmQ1XHU2NjBlXHU3ZDMwXHU1NzE2XHU1ZjcxXHU1MGNmXHU0Zjg2XHU3MDBmXHU4OWJkXHU1NDhjXHU3NjdjXHU4ODRjDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZVdQREltYWdlPVx1NGY3Zlx1NzUyOFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1NzZmOFx1NGY5ZFx1OTVkY1x1NGZjMlx1NTcxNlx1NWY3MVx1NTBjZlx1NGY4Nlx1NzAwZlx1ODliZFx1NTQ4Y1x1NzY3Y1x1ODg0Yw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvbnRyaWJ1dGU9XHU2NzJjXHU3YWVmXHU5NjQ0XHU1MmEwXHU4OTgxXHU3ZDIwDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmVwbGFjZT1cdTY3MmNcdTdhZWZcdTdmNmVcdTYzZGINCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9EaWFncmFtcz1cdTU3MTZcdTU3OGIoJkcpDQotUHJvY2Vzc0VkaXRvcl9hY3Rpb25fZGVlcENvcHk9XHU2ZGYxXHU1YzY0XHU4OTA3XHU4OGZkKCZEKS4uLg0KLUZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uPVx1N2MyMVx1ODk4MVx1OGFhYVx1NjYwZVx1ZmYxYQ0KLUNvbmZpZ3VyYXRpb25QYWdlX2hpZGVUb29sVGlwPVx1OTg2Zlx1NzkzYS9cdTk2YjFcdTg1Y2ZcdTY3MmFcdTUyZmVcdTkwNzhcdTc2ODRcdTUxNDNcdTdkMjANCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbj1cdThhYWFcdTY2MGVcdWZmMWENCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc0FsbD1cdTRlMGRcdTc2N2NcdTRmNDgNCi1GaWx0ZXJEaWFsb2dfUGF0dGVybl9kZXNjcmlwdGlvbj1cdTU3OGJcdTZhMjNcdTRlZTVcdTkwMTdcdTllZGVcdTUzNDBcdTk2OTRcdWZmMGNcdTUxNzZcdTRlMmQgKj1cdTRlZmJcdTRmNTVcdTViNTdcdTRlMzJcdWZmMGM/PVx1NGVmYlx1NGY1NVx1NWI1N1x1NTE0Mw0KLUNvbmZpZ3VyYXRpb25QYWdlX1RyZWVUaXRsZUxhYmVsPVx1NTE2N1x1NWJiOVx1ZmYxYQ0KLUNvbmZpZ3VyYXRpb25QYWdlX0xvYWRpbmdNZXNzYWdlPVx1NmI2M1x1NTcyOFx1OGYwOVx1NTE2NVx1OTE0ZFx1N2Y2ZVx1ZmYwY1x1OGFjYlx1N2EwZFx1NTAxOS4uLg0KLU1vdmVEaWFsb2dfdmFsaWRkZXN0aW5hdGlvbl90ZXh0PVx1NjMwN1x1NWI5YVx1NzY4NFx1NzlmYlx1NTJkNVx1NzZlZVx1NzY4NFx1NTczMFx1NzEyMVx1NjU0OFx1MzAwMg0KLU1vdmVEaWFsb2dfY2Fubm90TW9kaWZ5RGVzdGluYXRpb249SVVQQTAwMzRFOiBcdTcxMjFcdTZjZDVcdTRmZWVcdTY1MzlcdTkwNzhcdTUzZDZcdTc2ODRcdTc2ZWVcdTc2ODRcdTU3MzBcdTMwMDINCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGw9XHU1MTY4XHU5MGU4XHU3NjdjXHU0ZjQ4DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkJhc2VBY3Rpdml0eT1cdTk1OGJcdTU1NWZcdTU3ZmFcdTY3MmNcdTZkM2JcdTUyZDUNCi1Qcm9jZXNzRm9ybUVkaXRvcl9leHBhbkFsbEFjdGlvbkxhYmVsPVx1NTE2OFx1OTBlOFx1NWM1NVx1OTU4YigmWCkNCi1Qcm9jZXNzRm9ybUVkaXRvcl9jb2xsYXBzZUFsbEFjdGlvbkxhYmVsPVx1NTE2OFx1OTBlOFx1NjUzNlx1NTQwOCgmTCkNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEaWFncmFtPVx1OTU4Ylx1NTU1Zlx1NmQzYlx1NTJkNVx1NTcxNigmQSkNCi1Qcm9jZXNzRWRpdG9yX3Byb21wdFRvRGVsZXRlQmVmb3JlUmV2ZWFsPVx1NWZjNVx1OTgwOFx1NTIyYVx1OTY2NFx1MzAwY1x1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwZFx1NGUyZFx1NTIxN1x1NTFmYVx1NzY4NFx1NjcyYVx1NjI5MVx1NTIzNlx1NjNjZlx1OGZmMFx1NWI1MFx1ZmYwY1x1NGVlNVx1NTE0ZFx1NTcyOFx1NjNlZFx1OTczMlx1OTA3OFx1NTNkNlx1NzY4NFx1NTE0M1x1N2QyMFx1NGU0Ylx1NWY4Y1x1OTFjZFx1ODkwN1x1MzAwMlx1NTk4Mlx1Njc5Y1x1ODk4MVx1NTIyYVx1OTY2NFx1ZmYwY1x1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1NzhiYVx1NWI5YVx1MzAwZFx1NGUyNlx1N2U3Y1x1N2U4Y1x1MzAwMg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9TZWxlY3RDb2x1bW5zPVx1OTA3OFx1NTNkNlx1ODk4MVx1NjViMFx1NTg5ZVx1NzY4NFx1NzZmNFx1NmIwNA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURldGFpbERpYWdyYW09XHU5NThiXHU1NTVmXHU2ZDNiXHU1MmQ1XHU2NjBlXHU3ZDMwXHU1NzE2KCZEKQ0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9Db2x1bW5TZWxlY3Rpb249XHU3NmY0XHU2YjA0XHU5MDc4XHU2NGM3XHVmZjFhDQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N3aXRjaENvbmZpZ3VyYXRpb249XHU1NTVmXHU1MmQ1XHUzMDBjXHU2ZDQxXHU3YTBiXHU3ZGU4XHU4ZjJmXHU1NjY4XHUzMDBkXHU2NjQyXHU1MjA3XHU2M2RiXHU4MWYzXHUzMDBjXHU2ZDQxXHU3YTBiXHUzMDBkXHU3Njg0XHU5ODEwXHU4YTJkXHU5MTRkXHU3ZjZlDQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N1cHByZXNzaW9uR3JvdXBUaXRsZT1cdTYyOTFcdTUyMzYNCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfaW5oZXJpdFN1cHByZXNzaW9uU3RhdGU9XHU3ZTdjXHU2MjdmXHU2MjkxXHU1MjM2XHU3MmMwXHU2MTRiDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW09XHU5NThiXHU1NTVmXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU3NmY4XHU0ZjlkXHU5NWRjXHU0ZmMyXHU1NzE2KCZXKQ0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19DbGVhckJ1dHRvbkxhYmVsPVx1NmUwNVx1OTY2NA0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsPVx1OTA3OFx1NTNkNi4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0luc2VydE5ld1BoYXNlPVx1NjNkMlx1NTE2NVx1NjViMFx1NzY4NFx1OTY4ZVx1NmJiNQ0KLVZpZXdIZWxwZXJfcmVsb2FkTGliT25Sb2xsYmFja0Vycm9yPVx1NzEyMVx1NmNkNVx1NTZkZVx1NWZhOVx1NjMwMVx1N2U4Y1x1NjAyN1x1OTMyZlx1OGFhNFx1MzAwMlx1N2EwYlx1NWYwZlx1NWVhYlx1NWZjNVx1OTgwOFx1OTFjZFx1NjViMFx1OGYwOVx1NTE2NVx1NGY4Nlx1OTA4NFx1NTM5Zlx1ODFmM1x1NTM5Zlx1NTljYlx1NzJjMFx1NjE0Ylx1MzAwMg0KLVZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRfdGV4dD1cdTVkZjJcdTUyMmFcdTk2NjRcdTUxNDNcdTdkMjAgJyd7MH0nJ1x1MzAwMg0KLVZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRjb25maXJtX3RleHQ9XHU1ZGYyXHU1MjJhXHU5NjY0XHU1MTQzXHU3ZDIwICcnezB9JydcdTMwMDJcDQotXHU2MGE4XHU4OTgxXHU1ZjllICcnezF9JycgXHU0ZTJkXHU3OWZiXHU5NjY0XHU2YjY0XHU1MTQzXHU3ZDIwXHU1NWNlXHVmZjFmDQotQ29uZmlndXJhdGlvblBhZ2VfQWRkTWlzc2luZ1Rvb2xUaXA9XHU2NWIwXHU1ODllXHU5MDdhXHU2ZjBmXHU3Njg0XHU1M2MzXHU3MTY3DQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb249XHU4YWFhXHU2NjBlDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uR2VuZXJhbEluZm89XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhDQotDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXBwbHlQYXR0ZXJuPVx1NTk1N1x1NzUyOFx1NTc4Ylx1NmEyMygmVCkNCi1Nb3ZlRGlhbG9nX3NlbGVjdGRlc3RpbmF0aW9uX3RleHQ9XHU4YWNiXHU5MDc4XHU1M2Q2XHU3NmVlXHU3Njg0XHU1NzMwXHUzMDAyDQotTW92ZURpYWxvZ19ub21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9XHU2NzJhXHU2MzA3XHU1YjlhXHU3OWZiXHU1MmQ1XHU3NmVlXHU3Njg0XHU1NzMwXHUzMDAyDQotTWV0aG9kTGlicmFyeUVkaXRvcl90cm91Ymxlb2JqZWN0PS4gXHU3ZjNhXHU5ZWRlXHU3MjY5XHU0ZWY2XHVmZjFhDQotTWVzc2FnZUxhYmVsUHJvdmlkZXJfZXJyY2hpbGRwa2dzPVx1NWI1MFx1OTgwNVx1NTE2N1x1NWJiOVx1NTk1N1x1NGVmNlx1NjIxNlx1N2EwYlx1NWU4Zlx1NTMwNVx1NTQyYlx1OTA3YVx1NmYwZlx1NTNjM1x1NzE2N1x1NzY4NFx1NTE0M1x1N2QyMA0KLVByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfVGl0bGU9XHU1NzE2XHU4OWUzXHU3NjdjXHU0ZjQ4XHU5MDc4XHU5ODA1DQotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19NZXNzYWdlPVx1OGFjYlx1OTA3OFx1NTNkNlx1ODk4MVx1NzY3Y1x1NGY0OFx1NzY4NFx1NTcxNlx1ODllM1x1NjIxNlx1NTNkNlx1NmQ4OFx1OTA3OFx1NTNkNlx1NGUwZFx1ODk4MVx1NzY3Y1x1NGY0OFx1NzY4NFx1NTcxNlx1ODllMw0KLVByb2Nlc3NFZGl0b3JfVGl0bGU9XHU3YTBiXHU1ZThmXHU3ZGU4XHU4ZjJmXHU1NjY4XHVmZjFhDQotU2F2ZUFzd2l0aGRvdHNfdGV4dD1cdTUzZTZcdTViNThcdTY1YjBcdTZhOTQuLi4NCi1Qcm9jZXNzRWRpdG9yX1dvcmtCcmVha2Rvd25TdHJ1Y3R1cmU9XHU1ZGU1XHU0ZjVjXHU1MjA2XHU4OWUzXHU3ZDUwXHU2OWNiDQotUHJvY2Vzc0VkaXRvcl9UZWFtQWxsb2NhdGlvbj1cdTU3MThcdTk2OGFcdTkxNGRcdTdmNmUNCi1Qcm9jZXNzRWRpdG9yX1dvcmtQcm9kdWN0VXNhZ2U9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU3NTI4XHU2Y2Q1DQotUHJvY2Vzc0VkaXRvcl9Db25zb2xpZGF0ZWRWaWV3PVx1NTQwOFx1NGY3NVx1ODk5Nlx1NTcxNg0KLVByb2Nlc3NFZGl0b3JfY29uZmlybUF1dG9TeW5jaD1cdTZiNjRcdTY0Y2RcdTRmNWNcdTY3MDNcdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDZcdTkwNzhcdTUzZDZcdTc2ODRcdTYzY2ZcdThmZjBcdTViNTBcdTYyMTZcdTkwNzhcdTViOWFcdTZkM2JcdTUyZDVcdTRlMGJcdTc2ODRcdTYyNDBcdTY3MDlcdTYzY2ZcdThmZjBcdTViNTBcdWZmMGNcdTkwMTlcdTRlOWJcdTZkM2JcdTUyZDVcdTU3MjhcdTMwMGNcdTUxNjdcdTViYjlcdTMwMGRcdTg5OTZcdTU3MTZcdTc2ODRcdTMwMGNcdTRlMDBcdTgyMmNcdTMwMGRcdTZhMTlcdTdjNjRcdTRlMmRcdTVkZjJcdTZhMTlcdTc5M2FcdTcwYmFcdTMwMGNcdTgyMDdcdTRmODZcdTZlOTBcdTU0MGNcdTZiNjVcdTUzMTZcdTMwMGRcdTMwMDJcdTVjMDdcdTRlZTVcdTZkNDFcdTdhMGJcdTk4MTBcdThhMmRcdTkxNGRcdTdmNmVcdTRlMGJcdTc2ODRcdTkzYzhcdTdkNTBcdTY1YjlcdTZjZDVcdTUxNjdcdTViYjlcdTUxNDNcdTdkMjBcdTc2ODRcdTUzOWZcdTU5Y2JcdTUxNjdcdTViYjlcdTRmODZcdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDZcdTkwMTlcdTRlOWJcdTYzY2ZcdThmZjBcdTViNTBcdTMwMDJcdThhY2JcdTZjZThcdTYxMGZcdWZmMGNcdTVjMDdcdTRlMGRcdTY3MDNcdTY2ZjRcdTY1YjBcdTRlZmJcdTRmNTVcdTUyZDVcdTYxNGJcdTkwMjNcdTdkNTBcdTc2ODRcdWZmMDhcdTdkYTBcdTgyNzJcdTY1OWNcdTlhZDRcdTViNTdcdWZmMDlcdTYzY2ZcdThmZjBcdTViNTBcdTMwMDJcdTg5ODFcdTdlN2NcdTdlOGNcdTU1Y2VcdWZmMWYNCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjE9XHU5MTRkXHU3ZjZlDQotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24yPVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1NTQ4Y1x1NTk1N1x1NGVmNlx1OTA3OFx1NjRjNw0KLU5ld0xpYnJhcnlEaWFsb2dfbmV3bGlicmFyeV9hcz1cdTUzZTZcdTVlZmFcdTY1YjBcdTc2ODRcdTdhMGJcdTVmMGZcdTVlYWINCi1OZXdQbHVnaW5EaWFsb2dfbmV3cGx1Z2luX3RleHQ9XHU2NWIwXHU1ZWZhXHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotU2VsZWN0RWxlbWVudERpYWxvZ190aXRsZV90ZXh0PVx1OTA3OFx1NTNkNlx1NTE0M1x1N2QyMFx1NjIxNlx1NTE3Nlx1NGUyZFx1NGUwMFx1NTAwYlx1OTY0NFx1NTJhMFx1ODk4MVx1N2QyMFx1ZmYxYQ0KLU9wZW5Db25maWdEaWFsb2duZXdjb25maWdfdGV4dD1cdTY1YjBcdTVlZmFcdTkxNGRcdTdmNmVcdWZmMWENCi1wcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2VfQlNFZGl0b3I9XHU3YTBiXHU1ZThmXHU3ZGU4XHU4ZjJmXHU1NjY4DQotDQotIyBBYnN0cmFjdERpYWdyYW1FZGl0b3INCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9XHU1YzBkXHU5ZjRhDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3JlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQ9XHU1ZjllXHU1N2ZhXHU2NzJjXHU2ZDNiXHU1MmQ1XHU5MWNkXHU2NWIwXHU2NTc0XHU3NDA2DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2Zvcm1hdFRleHRCb3hBY3Rpdml0eV90ZXh0PVx1NjgzY1x1NWYwZlx1NjU4N1x1NWI1N1x1Njg0Ni4uLg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9XHU2YzM0XHU1ZTczXHU1YzBkXHU5ZjRhXHU1ZTczXHU1NzQ3XHU1MDNjDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1cdTZjMzRcdTVlNzNcdTVjMGRcdTlmNGFcdTdiMmNcdTRlMDBcdTUwMGJcdTkwNzhcdTViOWFcdTk4MDVcdTc2ZWUNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVx1NTc4Mlx1NzZmNFx1NWMwZFx1OWY0YVx1NWU3M1x1NTc0N1x1NTAzYw0KLU1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fdGl0bGU9XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhDQotTW92ZURpYWxvZ19pbnZhbGlkX21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9SVVQQTAwNDFFOiBcdTkwNzhcdTUzZDZcdTc2ODRcdTUxNDNcdTdkMjBcdTcxMjFcdTZjZDVcdTc5ZmJcdTgxZjNcdTYzMDdcdTViOWFcdTc2ODRcdTc2ZWVcdTc2ODRcdTU3MzBcdTMwMDINCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3NhdmVtb2RlbGxpYnJhcnk9XHU2YjYzXHU1NzI4XHU1MTMyXHU1YjU4XHU2YTIxXHU1NzhiXHU3YTBiXHU1ZjBmXHU1ZWFiLi4uDQotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJvcl9kaWFsb2dfdGl0bGU9XHU5MzJmXHU4YWE0DQotTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c9SVVQQTAwMzNFOiBcdTUxMzJcdTViNThcdTdhMGJcdTVmMGZcdTVlYWJcdTY2NDJcdTc2N2NcdTc1MWZcdTU1NGZcdTk4NGNcdTMwMDINCi1NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dD1cdTYwYThcdTc4YmFcdTViOWFcdTg5ODFcdTUyMmFcdTk2NjQgJyd7MH0nJyBcdTU1Y2VcdWZmMWYNCi1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19Db250ZW50RWxlbWVudF90ZXh0PVx1NTE2N1x1NWJiOVx1NTE0M1x1N2QyMFx1ZmYxYQ0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfQnJvd3NlQnV0dG9uTGFiZWw9XHU3MDBmXHU4OWJkLi4uDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1cdTYzMDdcdTViOWFcdTY1YjBcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTc2ODRcdTU0MGRcdTdhMzFcdTU0OGNcdThhYWFcdTY2MGVcdTMwMDINCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZVRpdGxlPVx1NTEzMlx1NWI1OFx1OGI4YVx1NjZmNFx1NGUyNlx1OTVkY1x1OTU4OVx1NjI0MFx1NjcwOVx1N2RlOFx1OGYyZlx1NTY2OA0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9XHU1NzgyXHU3NmY0XHU1YzBkXHU5ZjRhXHU3YjJjXHU0ZTAwXHU1MDBiXHU5MDc4XHU1YjlhXHU5ODA1XHU3NmVlDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dD1cdTUxMzJcdTViNTgNCi1BdHRhY2htZW50RGlhbG9nYXR0YWNoRmlsZV90ZXh0PVx1OTY0NFx1NTJhMFx1NmE5NFx1Njg0OA0KLUNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnQ9XHU5MTRkXHU3ZjZlXHU1MTY3XHU1YmI5DQotT3BlbkNvbmZpZ0RpYWxvZ29wZW5jb25maWdfdGV4dD1cdTk1OGJcdTU1NWZcdTkxNGRcdTdmNmUNCi1FbGVtZW50c1ZpZXdfcmVwbGFjZUFjdGlvbl90ZXh0PVx1NTNkNlx1NGVlMy4uLg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9XHU2YjYzXHU1NzI4XHU1MTMyXHU1YjU4IHswfQ0KLUNvbmZpZ3VyYXRpb25QYWdlX1Nob3dFcnJvclRvb2xUaXA9XHU5ODZmXHU3OTNhXHU5MTRkXHU3ZjZlXHU4YjY2XHU1NDRhXHU2NWU1XHU4YThjXHU2YWEyXHU4OTk2XHU1NjY4DQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRm9ybVByZWZpeD1cdTkxNGRcdTdmNmVcdWZmMWENCi0NCi1DaGVja2xpc3RPcmRlcl9jaGVja2xpc3RpdGVtc190ZXh0PVx1NmFhMlx1NjdlNVx1OTgwNVx1NzZlZVx1ZmYxYQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9Nb3ZlTm9kZV9sYWJlbD1cdTc5ZmJcdTUyZDVcdTdiYzBcdTllZGUNCi1Db25maWd1cmF0aW9uUGFnZV9NYWtlQ2xvc3VyZVRvb2xUaXA9XHU0ZmVlXHU2YjYzXHU5MzJmXHU4YWE0XHU0Zjg2XHU1ZWZhXHU3YWNiXHU5MDhhXHU3NTRjDQotTmV3UGx1Z2luRGlhbG9nX3JlZmVyZW5jZXBsdWdpbl90ZXh0PVx1NTNjM1x1NzE2N1x1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1ZmYxYQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9jcmVhdGVGcmVlVGV4dF90ZXh0PVx1NWVmYVx1N2FjYlx1NGVmYlx1NjEwZlx1NjU4N1x1NWI1Nw0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0xhYmVsPVx1N2JjMFx1OWVkZVx1NTcxNlx1NzkzYVx1OTgxMFx1ODliZFx1ZmYxYQ0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0PUlVUEEwMDMyVzogXHU3MTIxXHU2Y2Q1XHU5MDIzXHU2M2E1DQotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX3NhbWVwcmVkYW5kc3VjX3RleHQ9SVVQQTAwMzNXOiBcdTc2ZjhcdTU0MGNcdTc2ODRcdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjBcdTRlMGRcdTgwZmRcdTU0MGNcdTY2NDJcdTcwYmFcdTUyNGRcdTRlMDBcdTcyNDhcdTU0OGNcdTRlMGJcdTRlMDBcdTcyNDgNCi0NCi0jIEVkaXRvckNob29zZXINCi1FZGl0b3JDaG9vc2VyX2xvYWRkRXJyb3JEbGdUaXRsZT1cdTk1OGJcdTU1NWZcdTdkZThcdThmMmZcdTU2NjgNCi1FZGl0b3JDaG9vc2VyX1Jlc291cmNlc0Vycm9yPVx1NmI2NFx1NTE0M1x1N2QyMFx1NzY3Y1x1NzUxZlx1OTMyZlx1OGFhNFx1MzAwMlx1N2U3Y1x1N2U4Y1x1NGU0Ylx1NTI0ZFx1ZmYwY1x1NWVmYVx1OGI3MFx1NTE0OFx1NGZlZVx1NmI2M1x1OTAxOVx1NGU5Ylx1OTMyZlx1OGFhNFx1ZmYwOFx1OGFjYlx1NTNjM1x1OTViMVx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1ZmYwOVx1MzAwMlxuXA0KLVxuXA0KLVx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1NzhiYVx1NWI5YVx1MzAwZFx1NTNlZlx1N2U3Y1x1N2U4Y1x1ZmYwY1x1NGUwZFx1OTU4Ylx1NTU1Zlx1N2RlOFx1OGYyZlx1NTY2OFx1MzAwMlx1OTVkY1x1OTU4OVx1NmI2NFx1NWMwZFx1OGE3MVx1Njg0Nlx1NjcwM1x1OTU4Ylx1NTU1Zlx1N2RlOFx1OGYyZlx1NTY2OFx1MzAwMg0KLUNvbmZpZ3VyYXRpb25QYWdlX0Zvcm1QcmVmaXg9XHU5MTRkXHU3ZjZlXHVmZjFhDQotDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uTmFtZT1cdTU0MGRcdTdhMzFcdWZmMWENCi1BdHRhY2htZW50RGlhbG9nRmlsZVVSTF90ZXh0PVx1NmE5NFx1Njg0OCBVUkxcdWZmMWENCi1TdGVwc09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uPVx1OTA3OFx1NTNkNlx1NmI2NVx1OWE1Zlx1ZmYwY1x1NTE4ZFx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1NGUwYVx1MzAwZFx1NjIxNlx1MzAwY1x1NGUwYlx1MzAwZFx1NGY4Nlx1OGI4YVx1NjZmNFx1NmIyMVx1NWU4Zlx1MzAwMg0KLU1ldGhvZExpYnJhcnlFZGl0b3JfZXJyX3NhdmU9XHU1MTMyXHU1YjU4XHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0DQotTWVzc2FnZVZpZXdfZXJyZWxlbWVudF90ZXh0PVx1NTNjM1x1NzE2N1x1NTE0M1x1N2QyMA0KLU1lc3NhZ2VWaWV3X3JlZmVsZW1lbnRfdGV4dD1cdTg4YWJcdTUzYzNcdTcxNjdcdTUxNDNcdTdkMjANCi0NCi0jQWN0aXZpdHkgRGlhZ3JhbQ0KLUFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9jcmVhdGVTdGFydE5vZGVfdGV4dD1cdTVlZmFcdTdhY2JcdThkNzdcdTU5Y2JcdTdiYzBcdTllZGUNCi1Db25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50RGVzY3JpcHRpb249XHU5MDc4XHU1M2Q2XHU2YjY0XHU5MTRkXHU3ZjZlXHU1YzA3XHU1MzA1XHU1NDJiXHU3Njg0XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHUzMDAxXHU1MTY3XHU1YmI5XHU1OTU3XHU0ZWY2XHU1M2NhXHU3YTBiXHU1ZThmXHUzMDAyDQotQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb25fdGV4dD1cdTgxZWFcdThhMDJcdTdhMmVcdTk4NWVcdTc2ODRcdTUxNjdcdTViYjlcdTUxNDNcdTdkMjBcdTZiMjFcdTVlOGZcdTVjMGRcdThhNzFcdTY4NDYNCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RpcmVjdG9yeUxhYmVsPVx1NzZlZVx1OTMwNFx1ZmYxYQ0KLVJvb3RQcmVmUGFnZV9lbmFibGVwcm9jZXNzY29udHJpYnV0aW9uX3RleHQ9XHU1NTVmXHU3NTI4XHU3YTBiXHU1ZThmXHU5NjQ0XHU1MmEwXHU4OTgxXHU3ZDIwDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25fdGV4dD1cdTYzZDBcdTRmOWJcdTZiNjRcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTc2ODRcdTRlMDBcdTgyMmNcdThjYzdcdThhMGFcdTMwMDINCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbkxhYmVsPVx1OGFhYVx1NjYwZVx1ZmYxYQ0KLUNvbnRyaWJ1dGlvblNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9XHU5MDc4XHU2NGM3ICcnezB9JycgXHU3Njg0XHU5NjQ0XHU1MmEwXHU4OTgxXHU3ZDIwDQotRWxlbWVudHNWaWV3X29wZW5WYXJpYWJpbGl0eURpYWxvZ0FjdGlvbl90ZXh0PVx1OTAwZlx1OTA0ZVx1OGI4YVx1NTMxNlx1NjAyN1x1NTE0M1x1N2QyMFx1OTU4Ylx1NTU1Zg0KLVZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZT1cdTkwNzhcdTY0YzcgJyd7MH0nJyBcdTc2ODRcdThiOGFcdTUzMTZcdTYwMjdcdTUxNDNcdTdkMjANCi1WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdmlld2VyTGFiZWw9Jyd7MH0nJyBcdTc2ODRcdThiOGFcdTUzMTZcdTYwMjdcdTUxNDNcdTdkMjANCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfTGFiZWw9XHU1ZjYyXHU3MmMwXHU1NzE2XHU3OTNhXHU5ODEwXHU4OWJkXHVmZjFhDQotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9kZWxldGVfdGV4dD1cdTcxMjFcdTZjZDVcdTUyMmFcdTk2NjQNCi1BY3Rpdml0eURpYWdyYW1FZGl0b3Jfb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0PVx1OTU4Ylx1NTU1Zlx1NmQzYlx1NTJkNVx1NjYwZVx1N2QzMFx1NTcxNg0KLQ0KLU1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fZGVzY3JpcHRpb249XHU2M2QwXHU0ZjliXHU2YjY0XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1cdTZlMDVcdTk2NjQNCi1XUENvbXBhcnRtZW50RmlndXJlXzA9XHU2NWIwXHU1ZWZhXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU2M2NmXHU4ZmYwXHU1YjUwDQotcHJvbXB0Zm9yX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGRfdGV4dD1cdTc2N2NcdTRmNDhcdTYyMTZcdTcwMGZcdTg5YmRcdTVjMWFcdTY3MmFcdTY1YmNcdTdhMGJcdTVlOGZcdTdkZThcdThmMmZcdTU2NjhcdTRlMmRcdTVlZmFcdTdhY2JcdTc2ODRcdTZkM2JcdTUyZDVcdTY2MGVcdTdkMzBcdTU3MTYNCi1wcm9tcHRfZm9yX3B1Ymxpc2hfZXh0ZW5kX2FjdGl2aXR5X2RpYWdyYW09XHU3NjdjXHU0ZjQ4XHU2MjE2XHU3MDBmXHU4OWJkXHU2ZDNiXHU1MmQ1XHU1NzE2XHU0ZTJkXHU2NzJhXHU0ZmVlXHU2NTM5XHU3Njg0XHU2ZDNiXHU1MmQ1XHU1ZWY2XHU0ZjM4DQotDQotI0NvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfTmFtZVBhdHRlcm49XHU1NDBkXHU3YTMxXHU1NzhiXHU2YTIzXHVmZjA4XHU1YzA3XHU5ODZmXHU3OTNhXHU3NmY4XHU3YjI2XHU3Njg0XHU1NDBkXHU3YTMxXHVmZjA5XHVmZjFhDQotc2hvd0luUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb25fbGFiZWw9XHU1NzI4XHU4Y2M3XHU2ZTkwXHU1YzBlXHU4OWJkXHU1NjY4XHU0ZTJkXHU5ODZmXHU3OTNhDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfUGF0dGVybj1cdTU3OGJcdTZhMjNcdTRlZTVcdTkwMTdcdTllZGVcdTUzNDBcdTk2OTRcdWZmMGNcdTUxNzZcdTRlMmQgKj1cdTRlZmJcdTRmNTVcdTViNTdcdTRlMzJcdWZmMGM/PVx1NGVmYlx1NGY1NVx1NWI1N1x1NTE0Mw0KLWVycl9wcm9jZXNzaW5nX2ZpbGVfZGVzY3JpcHRpb249SVVQQTAwMjlFOiBcdTg2NTVcdTc0MDZcdTkwNzhcdTUzZDZcdTc2ODRcdTZhOTRcdTY4NDhcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdTMwMDJcdTU5ODJcdTk3MDBcdTc2ZjhcdTk1ZGNcdThjYzdcdThhMGFcdWZmMGNcdThhY2JcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTMwMGRcdTMwMDINCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19DYXRlZ29yeVR5cGU9XHU3YTJlXHU5ODVlXHU5ODVlXHU1NzhiXHVmZjFhDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbj1cdTdjMjFcdTg5ODFcdThhYWFcdTY2MGVcdWZmMWENCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19TZWxlY3RDYXRlZ29yaWVzPVx1OTA3OFx1NTNkNlx1N2EyZVx1OTg1ZQ0KLQ0KLSNsb2cgbWVzc2FnZXMNCi1jaGVhdHNoZWV0X2xvYWRfZmFpbHVyZV9sb2dfbXNnPVx1NzEyMVx1NmNkNVx1OTU4Ylx1NTU1Zlx1NjI0MFx1ODk4MVx1NmM0Mlx1NzY4NFx1NjNkMFx1ODk4MVx1ZmYxYQ0KLQ0KLW5ld0NvbmZpZ3VyYXRpb25XaXJhemRfY3JlYXRlRXJyb3I9SVVQQTAwMzVFOiBcdTcxMjFcdTZjZDVcdTk4MDZcdTUyMjlcdTVlZmFcdTdhY2JcdTkxNGRcdTdmNmUNCi1uZXdQbHVnaW5XaXphcmRfY3JlYXRlRXJyb3I9SVVQQTAwMzZFOiBcdTcxMjFcdTZjZDVcdTk4MDZcdTUyMjlcdTVlZmFcdTdhY2JcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGYNCi1lcnJvckRpYWxvZ19tb3ZlRXJyb3I9SVVQQTAwMzdFOiBcdTcxMjFcdTZjZDVcdTk4MDZcdTUyMjlcdTc5ZmJcdTUyZDVcdTUxNDNcdTdkMjANCi1yZW5hbWVEaWFsb2dfcmVuYW1lRXJyb3I9SVVQQTAwMzhFOiBcdTcxMjFcdTZjZDVcdTk4MDZcdTUyMjlcdTkxY2RcdTY1YjBcdTU0N2RcdTU0MGRcdTUxNDNcdTdkMjANCi1lcnJvckRpYWxvZ19jcmVhdGVFcnJvcj1JVVBBMDAzOUU6IFx1NzEyMVx1NmNkNVx1OTgwNlx1NTIyOVx1NWVmYVx1N2FjYlx1NTE0M1x1N2QyMA0KLWR1cGxpY2F0ZVBsdWdpbk5hbWVFcnJvcl9tc2c9SVVQQTAxMDFFOiBcdTU0MGRcdTdhMzEgJyd7MH0nJyBcdTVkZjJcdTViNThcdTU3MjhcdTMwMDJcdThhY2JcdThmMzhcdTUxNjVcdTRlMGRcdTU0MGNcdTU0MGRcdTdhMzFcdWZmMGNcdTcxMzZcdTVmOGNcdTUxOGRcdThhNjZcdTRlMDBcdTZiMjFcdTMwMDINCi0NCi0jTmV3IFN0cmluZ3MgZm9yIFByb2Nlc3NFZGl0b3IgQ29udGV4dCBtZW51IGRpYWdyYW0gaW1hZ2VzDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkQURJbWFnZT1cdTYzMDdcdTViOWEgQUQgXHU1ZjcxXHU1MGNmLi4uDQotUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JUaXRsZT1cdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDZcdTkzMmZcdThhYTQNCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvck1zZz1cdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDZcdTdkZThcdThmMmZcdTU2NjhcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTQNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRBRERJbWFnZT1cdTYzMDdcdTViOWEgQUREIFx1NWY3MVx1NTBjZi4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZFdQREltYWdlPVx1NjMwN1x1NWI5YSBXUEQgXHU1ZjcxXHU1MGNmLi4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURJbWFnZUluUHVibGlzaGluZz1cdTc2N2NcdTg4NGNcdTY2NDJcdTRmN2ZcdTc1MjggQUQgXHU1ZjcxXHU1MGNmDQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVN1cHByZXNzPVx1NWZjNVx1OTgwOFx1NTIyYVx1OTY2NFx1MzAwY1x1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwZFx1NGUyZFx1NTIxN1x1NTFmYVx1NzY4NFx1NjI5MVx1NTIzNlx1NjNjZlx1OGZmMFx1NWI1MFx1ZmYwY1x1NGVlNVx1NTE0ZFx1NTcyOFx1NjI5MVx1NTIzNlx1OTA3OFx1NTNkNlx1NzY4NFx1NTE0M1x1N2QyMFx1NGU0Ylx1NWY4Y1x1OTFjZFx1ODkwN1x1MzAwMlx1NTk4Mlx1Njc5Y1x1ODk4MVx1NTIyYVx1OTY2NFx1ZmYwY1x1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1NzhiYVx1NWI5YVx1MzAwZFx1NGUyNlx1N2U3Y1x1N2U4Y1x1MzAwMg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFEREltYWdlSW5QdWJsaXNoaW5nPVx1NzY3Y1x1ODg0Y1x1NjY0Mlx1NGY3Zlx1NzUyOCBBREQgXHU1ZjcxXHU1MGNmDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlV1BESW1hZ2VJblB1Ymxpc2hpbmc9XHU3NjdjXHU4ODRjXHU2NjQyXHU0ZjdmXHU3NTI4IFdQRCBcdTVmNzFcdTUwY2YNCi1Qcm9jZXNzRWRpdG9yX0RpYWdyYW1JbWFnZV9JbnB1dERpYWxvZ19pbml0aWFsVmFsdWU9XHU1ZjcxXHU1MGNmXHU4ZGVmXHU1ZjkxDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU2hvd0xpbmtlZEVsZW1lbnRpbkxpYnJhcnlWaWV3PVx1NTcyOFx1N2EwYlx1NWYwZlx1NWVhYlx1ODk5Nlx1NTcxNlx1NGUyZFx1OTg2Zlx1NzkzYVx1OTNjOFx1N2Q1MFx1NTE0M1x1N2QyMCgmSCkNCi1Qcm9jZXNzRWRpdG9yX3VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb25fbGFiZWw9XHU1ZjllXHU1N2ZhXHU2NzJjXHU2NmY0XHU2NWIwXHU2MjkxXHU1MjM2KCZCKQ0KLVByb2Nlc3NFZGl0b3JfQ29udGV4dE1lbnVfRGlhZ3JhbUltYWdlcz1cdTU3MTZcdTg5ZTNcdTVmNzFcdTUwY2YNCi0NCi0jU3RyaW5ncyBmb3Igc3luY2hyb25pemF0aW9uIHdpemFyZCBvbiBwcm9jZXNzIGVkaXRvcidzIEJTDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90aXRsZT1cdTU0MGNcdTZiNjVcdTUzMTZcdThhYWFcdTY2MGUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RleHQ9XHU5NWIxXHU4YjgwXHU0ZTBiXHU1MjE3XHU4Y2M3XHU4YTBhXHVmZjBjXHU1MTc2XHU0ZTJkXHU1YzA3XHU4YWFhXHU2NjBlXHU4MWVhXHU4YTAyXHU1NDBjXHU2YjY1XHU1MzE2XHU2NzAzXHU1YjhjXHU2MjEwXHU3Njg0XHU0ZThiXHU5ODA1XHUzMDAyDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9XHU5MDc4XHU1M2Q2XHU5MTRkXHU3ZjZlDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGV4dD1cdTkwNzhcdTUzZDZcdTYwYThcdTg5ODFcdTc1MjhcdTY1YmNcdTU0MGNcdTZiNjVcdTUzMTZcdTc2ODRcdTkxNGRcdTdmNmVcdTMwMDJcDQotXHU2MGE4XHU3Njg0XHU5MDc4XHU2NGM3XHU2NzAzXHU2YzdhXHU1YjlhXHU1NGVhXHU0ZTliXHU5NjQ0XHU1MmEwXHU4OTgxXHU3ZDIwXHU1NDhjXHU2NmY0XHU2M2RiXHU1NGMxXHU1YzA3XHU3NTI4XHU2NWJjXHU1NDBjXHU2YjY1XHU1MzE2XHUzMDAyDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfY29uZmlnTGFiZWw9XHU5MTRkXHU3ZjZlXHVmZjFhDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RpdGxlPVx1OTA3OFx1NTNkNlx1ODk4MVx1NTQwY1x1NmI2NVx1NTMxNlx1NzY4NFx1NTE2N1x1NWJiOQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcm9wZXJ0aWVzX2xhYmxlPVx1NTE2N1x1NWJiOQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9uYW1lX2xhYmxlPVx1NTQwZFx1N2EzMQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmVzZW50YXRpb25OYW1lX2xhYmxlPVx1NTQ0OFx1NzNmZVx1NTQwZFx1N2EzMQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9icmllZkRlc2NfbGFibGU9XHU3YzIxXHU4OTgxXHU4YWFhXHU2NjBlDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX29wdGlvbmFsSW5vdXRzX2xhYmVsPVx1OTA3OFx1NzUyOFx1OGYzOFx1NTE2NQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9tYW5kYXRvcnlJbnB1dHNfbGFibGU9XHU1ZmM1XHU4OTgxXHU4ZjM4XHU1MTY1DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX291dHB1dHNfbGFiZWw9XHU4ZjM4XHU1MWZhDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbGFiZWw9XHU0ZTNiXHU4OTgxXHU1N2Y3XHU4ODRjXHU4MDA1DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2FkZG5QZXJmb3JtZXJzX2xhYmxlPVx1NTE3Nlx1NGVkNlx1NTdmN1x1ODg0Y1x1ODAwNQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9yZXNwb25zaWJsZVJvbGVzX2xhYmxlPVx1OGNhMFx1OGNhY1x1ODlkMlx1ODI3Mg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9jb250bkFydGlmYWN0c19sYWJlbD1cdTUxNjdcdTU0MmJcdTc2ODRcdTY5Y2JcdTRlZjYNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfZGlsdmVkUGFydHNfbGFiZWw9XHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlXHU3ZDQ0XHU0ZWY2DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3NlbFN0ZXBzX2xhYmVsPVx1NmI2NVx1OWE1Zlx1OTA3OFx1NjRjNw0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90ZXh0PVx1OTA3OFx1NjRjN1x1NjBhOFx1ODAwM1x1NjE2ZVx1ODk4MVx1NTQwY1x1NmI2NVx1NTMxNlx1NzY4NFx1NjViOVx1NmNkNVx1NTE2N1x1NWJiOVx1NzY4NFx1NWM2Y1x1NjAyN1x1MzAwMg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90aXRsZT1cdTU0MGNcdTZiNjVcdTUzMTZcdTk4MTBcdTg5YmQNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGV4dD1cdTg5MDdcdTY3ZTVcdTRlMGJcdTUyMTdcdTYzZDBcdTUxZmFcdTc2ODRcdTU0MGNcdTZiNjVcdTUzMTZcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTMwMDINCi1zZWxlY3RFZGl0b3JzVG9EaXNjYXJkQ29uZmxpY3RDaGFuZ2VzPVx1NjcyYVx1NTEzMlx1NWI1OFx1NzY4NFx1OGI4YVx1NjZmNFx1NTQ4Y1x1N2RlOFx1OGYyZlx1NTY2OFx1NGU0Ylx1NTkxNlx1NjI0MFx1NTA1YVx1NzY4NFx1OGI4YVx1NjZmNFx1NzY3Y1x1NzUxZlx1ODg1ZFx1N2E4MVx1MzAwMlxuXA0KLVx1OGFjYlx1OTA3OFx1NTNkNlx1NjBhOFx1ODk4MVx1NjM2OFx1NjhjNFx1OGI4YVx1NjZmNFx1NzY4NFx1N2RlOFx1OGYyZlx1NTY2OFx1MzAwMg0KLXN5bmNocm9uaXphdGlvbldpemFyZF90aXRsZV90ZXh0PVx1NTQwY1x1NmI2NVx1NTMxNlx1N2NiZVx1OTc0OA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfZXhwbGFpblRleHQ9XHU2YjY0XHU3Y2JlXHU5NzQ4XHU2NTJmXHU2M2Y0XHU5MWNkXHU2NWIwXHU2NTc0XHU3NDA2XHU5MDc4XHU1M2Q2XHU3Njg0XHU2M2NmXHU4ZmYwXHU1YjUwXHU2MjE2XHU5MDc4XHU1YjlhXHU2ZDNiXHU1MmQ1XHU0ZTBiXHU3Njg0XHU2MjQwXHU2NzA5XHU2M2NmXHU4ZmYwXHU1YjUwXHVmZjBjXHU5MDE5XHU0ZTliXHU2ZDNiXHU1MmQ1XHU1NzI4XHUzMDBjXHU1MTY3XHU1YmI5XHUzMDBkXHU4OTk2XHU1NzE2XHU3Njg0XHUzMDBjXHU0ZTAwXHU4MjJjXHUzMDBkXHU2YTE5XHU3YzY0XHU0ZTJkXHU1ZGYyXHU2YTE5XHU3OTNhXHU3MGJhXHUzMDBjXHU4MjA3XHU0Zjg2XHU2ZTkwXHU1NDBjXHU2YjY1XHU1MzE2XHUzMDBkXHUzMDAyXA0KLVx1NTNlYVx1NjcwOVx1NTcyOFx1NmI2NFx1N2NiZVx1OTc0OFx1NGUyZFx1OTA3OFx1NTNkNlx1NzY4NFx1NTE2N1x1NWJiOVx1NjcwM1x1NTcyOFx1NjNjZlx1OGZmMFx1NWI1MFx1NGUyZFx1OTFjZFx1NjViMFx1NjU3NFx1NzQwNlx1MzAwMlwNCi1cdTYwYThcdTRlNWZcdTUzZWZcdTRlZTVcdTcwYmFcdTZkNDFcdTdhMGJcdTkwNzhcdTUzZDZcdTU3MjhcdThhMDhcdTdiOTdcdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDZcdTY2NDJcdTg5ODFcdTRmN2ZcdTc1MjhcdTc2ODRcdTRlZmJcdTRmNTVcdTY3MDlcdTY1NDhcdTkxNGRcdTdmNmVcdTMwMDJcDQotXHU4YWNiXHU2Y2U4XHU2MTBmXHVmZjBjXHU3Y2JlXHU5NzQ4XHU1YzA3XHU0ZTBkXHU2NzAzXHU2NmY0XHU2NWIwXHU0ZWZiXHU0ZjU1XHU1MmQ1XHU2MTRiXHU5MDIzXHU3ZDUwXHU3Njg0XHVmZjA4XHU3ZGEwXHU4MjcyXHU2NTljXHU5YWQ0XHU1YjU3XHVmZjA5XHU2M2NmXHU4ZmYwXHU1YjUwXHUzMDAyDQotDQotb3BlblJURT1cdTk1OGJcdTU1NWYgUmljaCBUZXh0IFx1N2RlOFx1OGYyZlx1NTY2OA0KLWNsb3NlUlRFPVx1OTVkY1x1OTU4OSBSaWNoIFRleHQgXHU3ZGU4XHU4ZjJmXHU1NjY4DQotDQotI05ldyBTdHJpbmdzDQotcm9sZXNldHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTkwMTlcdTUwMGJcdTg5ZDJcdTgyNzJcdTk2YzZcdTc2ODRcdTYzMDdcdTVmMTVcdTMwMDINCi1kaXNjaXBsaW5lc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NWM2Y1x1NjViY1x1OTAxOVx1NTAwYlx1ODk4Zlx1N2JjNFx1NzY4NFx1NjMwN1x1NWYxNVx1MzAwMg0KLXdvcmtwcm9kdWN0dHlwZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTkwMTlcdTUwMGJcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTk4NWVcdTU3OGJcdTc2ODRcdTYzMDdcdTVmMTVcdTMwMDINCi1kb21haW5zX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU1YzZjXHU2NWJjXHU5MDE5XHU1MDBiXHU5ODE4XHU1N2RmXHU3Njg0XHU2MzA3XHU1ZjE1XHUzMDAyDQotdG9vbHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTkwMTlcdTUwMGJcdTVkZTVcdTUxNzdcdTc2ODRcdTYzMDdcdTVmMTVcdTMwMDINCi1jdXN0b21jYXRlZ29yeV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NWM2Y1x1NjViY1x1OTAxOVx1NTAwYlx1ODFlYVx1OGEwMlx1N2EyZVx1OTg1ZVx1NzY4NFx1NjMwN1x1NWYxNVx1MzAwMg0KLQ0KLWNvbmNlcHRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTkwMTlcdTUwMGJcdTY5ODJcdTVmZjVcdTc2ODRcdTYzMDdcdTVmMTVcdTMwMDINCi1jaGVja2xpc3RfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTkwMTlcdTUwMGJcdTY4MzhcdTVjMGRcdTZlMDVcdTU1YWVcdTc2ODRcdTYzMDdcdTVmMTVcdTMwMDINCi1leGFtcGxlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU1YzZjXHU2NWJjXHU5MDE5XHU1MDBiXHU3YmM0XHU0ZjhiXHU3Njg0XHU2MzA3XHU1ZjE1XHUzMDAyDQotZ3VpZGVsaW5lX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU1YzZjXHU2NWJjXHU5MDE5XHU1MDBiXHU2ZTk2XHU1MjQ3XHU3Njg0XHU2MzA3XHU1ZjE1XHUzMDAyDQotcm9hZG1hcF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NWM2Y1x1NjViY1x1OTAxOVx1NTAwYlx1ODVjZFx1NTcxNlx1NzY4NFx1NjMwN1x1NWYxNVx1MzAwMg0KLXJldXNhYmxlYXNzZXRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTkwMTlcdTUwMGJcdTUzZWZcdTkxY2RcdTg5MDdcdTRmN2ZcdTc1MjhcdTc2ODRcdThjYzdcdTc1MjJcdTc2ODRcdTYzMDdcdTVmMTVcdTMwMDINCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTkwMTlcdTUwMGJcdThmMTRcdTUyYTlcdThjYzdcdTY1OTlcdTc2ODRcdTYzMDdcdTVmMTVcdTMwMDINCi1yZXBvcnRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTkwMTlcdTUwMGJcdTU4MzFcdTU0NGFcdTc2ODRcdTYzMDdcdTVmMTVcdTMwMDINCi1wcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NWM2Y1x1NjViY1x1OTAxOVx1NTAwYlx1N2RmNFx1N2ZkMlx1NzY4NFx1NjMwN1x1NWYxNVx1MzAwMg0KLXRlbXBsYXRlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU1YzZjXHU2NWJjXHU5MDE5XHU1MDBiXHU3YmM0XHU2NzJjXHU3Njg0XHU2MzA3XHU1ZjE1XHUzMDAyDQotdGVybWRlZmluaXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTdiYTFcdTc0MDZcdTVjNmNcdTY1YmNcdTkwMTlcdTUwMGJcdTg4NTNcdThhOWVcdTViOWFcdTdmYTlcdTc2ODRcdTYzMDdcdTVmMTVcdTMwMDINCi10b29sbWVudG9yX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU1YzZjXHU2NWJjXHU5MDE5XHU1MDBiXHU1ZGU1XHU1MTc3XHU4ZjE0XHU1MmE5XHU3Njg0XHU2MzA3XHU1ZjE1XHUzMDAyDQotd2hpdGVwYXBlcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1N2JhMVx1NzQwNlx1NWM2Y1x1NjViY1x1OTAxOVx1NTAwYlx1NzY3ZFx1NzZhZVx1NjZmOFx1NzY4NFx1NjMwN1x1NWYxNVx1MzAwMg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHU3YmExXHU3NDA2XHU1YzZjXHU2NWJjXHU5MDE5XHU1MDBiXHU5ODEwXHU0ZjMwXHU4MDAzXHU5MWNmXHU3Njg0XHU2MzA3XHU1ZjE1XHUzMDAyDQotDQotDQotI05ldyBTdHJpbmcgU2VjdGlvbiBEZXNjcmlwdGlvbg0KLXJvbGVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1ODlkMlx1ODI3Mlx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwMg0KLXJvbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4OWQyXHU4MjcyXHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotcm9sZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTg5ZDJcdTgyNzJcdTgyMDdcdTUzZTZcdTRlMDBcdTUwMGJcdTg5ZDJcdTgyNzJcdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi1yb2xlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1ODlkMlx1ODI3Mlx1NzY4NFx1NzI0OFx1NjcyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLQ0KLXRhc2tfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1OTAxOVx1OTgwNVx1NGY1Y1x1Njk2ZFx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwMg0KLXRhc2tfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU5MDE5XHU5ODA1XHU0ZjVjXHU2OTZkXHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotdGFza192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTkwMTlcdTk4MDVcdTRmNWNcdTY5NmRcdTgyMDdcdTUzZTZcdTRlMDBcdTk4MDVcdTRmNWNcdTY5NmRcdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi10YXNrX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1OTAxOVx1OTgwNVx1NGY1Y1x1Njk2ZFx1NzY4NFx1NzI0OFx1NjcyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLQ0KLWFydGlmYWN0X2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTY5Y2JcdTRlZjZcdTc2ODRcdThhNzNcdTdkMzBcdThjYzdcdThhMGFcdTMwMDINCi1hcnRpZmFjdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTY5Y2JcdTRlZjZcdTc2ODRcdTRlMDBcdTgyMmNcdThjYzdcdThhMGFcdTMwMDINCi1hcnRpZmFjdF9pY29uU2VjdGlvbl9kZXNjPVx1ODFlYVx1OGEwMlx1NmI2NFx1NjljYlx1NGVmNlx1NzY4NFx1NTcxNlx1NzkzYVx1MzAwMg0KLWFydGlmYWN0X25vdGF0aW9uU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NjljYlx1NGVmNlx1NzY4NFx1NGVhNFx1NGVkOFx1OGNjN1x1OGEwYVx1MzAwMg0KLWFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTY5Y2JcdTRlZjZcdTc2ODRcdThhYmZcdTY1NzRcdThjYzdcdThhMGFcdTMwMDINCi1hcnRpZmFjdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTY5Y2JcdTRlZjZcdTgyMDdcdTUzZTZcdTRlMDBcdTUwMGJcdTY5Y2JcdTRlZjZcdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi1hcnRpZmFjdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTY5Y2JcdTRlZjZcdTc2ODRcdTcyNDhcdTY3MmNcdThjYzdcdThhMGFcdTMwMDINCi0NCi1vdXRjb21lX2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdThmMzhcdTUxZmFcdTdkNTBcdTY3OWNcdTc2ODRcdThhNzNcdTdkMzBcdThjYzdcdThhMGFcdTMwMDINCi1vdXRjb21lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1OGYzOFx1NTFmYVx1N2Q1MFx1Njc5Y1x1NzY4NFx1NGUwMFx1ODIyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLW91dGNvbWVfaWNvblNlY3Rpb25fZGVzYz1cdTgxZWFcdThhMDJcdTZiNjRcdThmMzhcdTUxZmFcdTdkNTBcdTY3OWNcdTc2ODRcdTU3MTZcdTc5M2FcdTMwMDINCi1vdXRjb21lX25vdGF0aW9uU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1OGYzOFx1NTFmYVx1N2Q1MFx1Njc5Y1x1NzY4NFx1NGVhNFx1NGVkOFx1OGNjN1x1OGEwYVx1MzAwMg0KLW91dGNvbWVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1OGYzOFx1NTFmYVx1N2Q1MFx1Njc5Y1x1NzY4NFx1OGFiZlx1NjU3NFx1OGNjN1x1OGEwYVx1MzAwMg0KLW91dGNvbWVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU4ZjM4XHU1MWZhXHU3ZDUwXHU2NzljXHU4MjA3XHU1M2U2XHU0ZTAwXHU1MDBiXHU4ZjM4XHU1MWZhXHU3ZDUwXHU2NzljXHU3Njg0XHU5NWRjXHU0ZmMyXHUzMDAyDQotb3V0Y29tZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdThmMzhcdTUxZmFcdTdkNTBcdTY3OWNcdTc2ODRcdTcyNDhcdTY3MmNcdThjYzdcdThhMGFcdTMwMDINCi0NCi1kZWxpdmVyYWJsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlXHU3Njg0XHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHUzMDAyDQotZGVsaXZlcmFibGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlXHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotZGVsaXZlcmFibGVfaWNvblNlY3Rpb25fZGVzYz1cdTgxZWFcdThhMDJcdTZiNjRcdTRlYTRcdTRlZDhcdTk4MDVcdTc2ZWVcdTc2ODRcdTU3MTZcdTc5M2FcdTMwMDINCi1kZWxpdmVyYWJsZV9ub3RhdGlvblNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTRlYTRcdTRlZDhcdTk4MDVcdTc2ZWVcdTc2ODRcdTRlYTRcdTRlZDhcdThjYzdcdThhMGFcdTMwMDINCi1kZWxpdmVyYWJsZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlXHU3Njg0XHU4YWJmXHU2NTc0XHU4Y2M3XHU4YTBhXHUzMDAyDQotZGVsaXZlcmFibGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlXHU4MjA3XHU1M2U2XHU0ZTAwXHU1MDBiXHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlXHU3Njg0XHU5NWRjXHU0ZmMyXHUzMDAyDQotZGVsaXZlcmFibGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlXHU3Njg0XHU3MjQ4XHU2NzJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotDQotZGlzY2lwbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4OThmXHU3YmM0XHU3Njg0XHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHUzMDAyDQotZGlzY2lwbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTg5OGZcdTdiYzRcdTc2ODRcdTRlMDBcdTgyMmNcdThjYzdcdThhMGFcdTMwMDINCi1kaXNjaXBsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1ODk4Zlx1N2JjNFx1ODIwN1x1NTNlNlx1NGUwMFx1NTAwYlx1ODk4Zlx1N2JjNFx1NzY4NFx1OTVkY1x1NGZjMlx1MzAwMg0KLWRpc2NpcGxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4OThmXHU3YmM0XHU3Njg0XHU3MjQ4XHU2NzJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotDQotZG9tYWluX2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTk4MThcdTU3ZGZcdTc2ODRcdThhNzNcdTdkMzBcdThjYzdcdThhMGFcdTMwMDINCi1kb21haW5fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU5ODE4XHU1N2RmXHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotZG9tYWluX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1OTgxOFx1NTdkZlx1ODIwN1x1NTNlNlx1NGUwMFx1NTAwYlx1OTgxOFx1NTdkZlx1NzY4NFx1OTVkY1x1NGZjMlx1MzAwMg0KLWRvbWFpbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTk4MThcdTU3ZGZcdTc2ODRcdTcyNDhcdTY3MmNcdThjYzdcdThhMGFcdTMwMDINCi0NCi13b3JrcHJvZHVjdHR5cGVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1OTg1ZVx1NTc4Ylx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwMg0KLXdvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTk4NWVcdTU3OGJcdTc2ODRcdTRlMDBcdTgyMmNcdThjYzdcdThhMGFcdTMwMDINCi13b3JrcHJvZHVjdHR5cGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU5ODVlXHU1NzhiXHU4MjA3XHU1M2U2XHU0ZTAwXHU1MDBiXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU5ODVlXHU1NzhiXHU3Njg0XHU5NWRjXHU0ZmMyXHUzMDAyDQotd29ya3Byb2R1Y3R0eXBlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1OTg1ZVx1NTc4Ylx1NzY4NFx1NzI0OFx1NjcyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLQ0KLXJvbGVzZXRfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1ODlkMlx1ODI3Mlx1OTZjNlx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwMg0KLXJvbGVzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4OWQyXHU4MjcyXHU5NmM2XHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotcm9sZXNldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTg5ZDJcdTgyNzJcdTk2YzZcdTgyMDdcdTUzZTZcdTRlMDBcdTUwMGJcdTg5ZDJcdTgyNzJcdTk2YzZcdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi1yb2xlc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1ODlkMlx1ODI3Mlx1OTZjNlx1NzY4NFx1NzI0OFx1NjcyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLQ0KLXRvb2xfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NWRlNVx1NTE3N1x1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwMg0KLXRvb2xfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU1ZGU1XHU1MTc3XHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotdG9vbF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTVkZTVcdTUxNzdcdTgyMDdcdTUzZTZcdTRlMDBcdTUwMGJcdTVkZTVcdTUxNzdcdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi10b29sX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NWRlNVx1NTE3N1x1NzY4NFx1NzI0OFx1NjcyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLQ0KLWNvbmNlcHRfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1Njk4Mlx1NWZmNVx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwMg0KLWNvbmNlcHRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU2OTgyXHU1ZmY1XHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotY29uY2VwdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTY5ODJcdTVmZjVcdTgyMDdcdTUzZTZcdTRlMDBcdTUwMGJcdTY5ODJcdTVmZjVcdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi1jb25jZXB0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1Njk4Mlx1NWZmNVx1NzY4NFx1NzI0OFx1NjcyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLQ0KLWNoZWNrbGlzdF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU2ODM4XHU1YzBkXHU2ZTA1XHU1NWFlXHU3Njg0XHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHUzMDAyDQotY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NjgzOFx1NWMwZFx1NmUwNVx1NTVhZVx1NzY4NFx1NGUwMFx1ODIyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLWNoZWNrbGlzdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTY4MzhcdTVjMGRcdTZlMDVcdTU1YWVcdTgyMDdcdTUzZTZcdTRlMDBcdTUwMGJcdTY4MzhcdTVjMGRcdTZlMDVcdTU1YWVcdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi1jaGVja2xpc3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU2ODM4XHU1YzBkXHU2ZTA1XHU1NWFlXHU3Njg0XHU3MjQ4XHU2NzJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotDQotZXhhbXBsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU3YmM0XHU0ZjhiXHU3Njg0XHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHUzMDAyDQotZXhhbXBsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTdiYzRcdTRmOGJcdTc2ODRcdTRlMDBcdTgyMmNcdThjYzdcdThhMGFcdTMwMDINCi1leGFtcGxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1N2JjNFx1NGY4Ylx1ODIwN1x1NTNlNlx1NGUwMFx1NTAwYlx1N2JjNFx1NGY4Ylx1NzY4NFx1OTVkY1x1NGZjMlx1MzAwMg0KLWV4YW1wbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU3YmM0XHU0ZjhiXHU3Njg0XHU3MjQ4XHU2NzJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotDQotZ3VpZGVsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTZlOTZcdTUyNDdcdTc2ODRcdThhNzNcdTdkMzBcdThjYzdcdThhMGFcdTMwMDINCi1ndWlkZWxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU2ZTk2XHU1MjQ3XHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotZ3VpZGVsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1NmU5Nlx1NTI0N1x1ODIwN1x1NTNlNlx1NGUwMFx1NTAwYlx1NmU5Nlx1NTI0N1x1NzY4NFx1OTVkY1x1NGZjMlx1MzAwMg0KLWd1aWRlbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTZlOTZcdTUyNDdcdTc2ODRcdTcyNDhcdTY3MmNcdThjYzdcdThhMGFcdTMwMDINCi0NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU5ODEwXHU0ZjMwXHU4MDAzXHU5MWNmXHU3Njg0XHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHUzMDAyDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU5ODEwXHU0ZjMwXHU4MDAzXHU5MWNmXHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU5ODEwXHU0ZjMwXHU4MDAzXHU5MWNmXHU4MjA3XHU1M2U2XHU0ZTAwXHU1MDBiXHU5ODEwXHU0ZjMwXHU4MDAzXHU5MWNmXHU3Njg0XHU5NWRjXHU0ZmMyXHUzMDAyDQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU5ODEwXHU0ZjMwXHU4MDAzXHU5MWNmXHU3Njg0XHU3MjQ4XHU2NzJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotDQotcHJhY3RpY2VfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1N2RmNFx1N2ZkMlx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwMg0KLXByYWN0aWNlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1N2RmNFx1N2ZkMlx1NzY4NFx1NGUwMFx1ODIyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLXByYWN0aWNlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1N2RmNFx1N2ZkMlx1ODIwN1x1NTNlNlx1NGUwMFx1NTAwYlx1N2RmNFx1N2ZkMlx1NzY4NFx1OTVkY1x1NGZjMlx1MzAwMg0KLXByYWN0aWNlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1N2RmNFx1N2ZkMlx1NzY4NFx1NzI0OFx1NjcyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLQ0KLXJlcG9ydF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU1ODMxXHU1NDRhXHU3Njg0XHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHUzMDAyDQotcmVwb3J0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NTgzMVx1NTQ0YVx1NzY4NFx1NGUwMFx1ODIyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLXJlcG9ydF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTU4MzFcdTU0NGFcdTgyMDdcdTUzZTZcdTRlMDBcdTUwMGJcdTU4MzFcdTU0NGFcdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi1yZXBvcnRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU1ODMxXHU1NDRhXHU3Njg0XHU3MjQ4XHU2NzJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotDQotcmVzdWFibGVhc3NldF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU1M2VmXHU5MWNkXHU4OTA3XHU0ZjdmXHU3NTI4XHU3Njg0XHU4Y2M3XHU3NTIyXHU3Njg0XHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHUzMDAyDQotcmVzdWFibGVhc3NldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTUzZWZcdTkxY2RcdTg5MDdcdTRmN2ZcdTc1MjhcdTc2ODRcdThjYzdcdTc1MjJcdTc2ODRcdTRlMDBcdTgyMmNcdThjYzdcdThhMGFcdTMwMDINCi1yZXN1YWJsZWFzc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1NTNlZlx1OTFjZFx1ODkwN1x1NGY3Zlx1NzUyOFx1NzY4NFx1OGNjN1x1NzUyMlx1ODIwN1x1NTNlNlx1NGUwMFx1NTAwYlx1NTNlZlx1OTFjZFx1ODkwN1x1NGY3Zlx1NzUyOFx1NzY4NFx1OGNjN1x1NzUyMlx1NzY4NFx1OTVkY1x1NGZjMlx1MzAwMg0KLXJlc3VhYmxlYXNzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU1M2VmXHU5MWNkXHU4OTA3XHU0ZjdmXHU3NTI4XHU3Njg0XHU4Y2M3XHU3NTIyXHU3Njg0XHU3MjQ4XHU2NzJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotDQotcm9hZG1hcF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4NWNkXHU1NzE2XHU3Njg0XHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHUzMDAyDQotcm9hZG1hcF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTg1Y2RcdTU3MTZcdTc2ODRcdTRlMDBcdTgyMmNcdThjYzdcdThhMGFcdTMwMDINCi1yb2FkbWFwX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1ODVjZFx1NTcxNlx1ODIwN1x1NTNlNlx1NGUwMFx1NTAwYlx1ODVjZFx1NTcxNlx1NzY4NFx1OTVkY1x1NGZjMlx1MzAwMg0KLXJvYWRtYXBfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4NWNkXHU1NzE2XHU3Njg0XHU3MjQ4XHU2NzJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotDQotc3VwcG9ydGluZ21hdGVyaWFsX2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdThmMTRcdTUyYTlcdThjYzdcdTY1OTlcdTc2ODRcdThhNzNcdTdkMzBcdThjYzdcdThhMGFcdTMwMDINCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4ZjE0XHU1MmE5XHU4Y2M3XHU2NTk5XHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1OGYxNFx1NTJhOVx1OGNjN1x1NjU5OVx1ODIwN1x1NTNlNlx1NGUwMFx1NTAwYlx1OGYxNFx1NTJhOVx1OGNjN1x1NjU5OVx1NzY4NFx1OTVkY1x1NGZjMlx1MzAwMg0KLXN1cHBvcnRpbmdtYXRlcmlhbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdThmMTRcdTUyYTlcdThjYzdcdTY1OTlcdTc2ODRcdTcyNDhcdTY3MmNcdThjYzdcdThhMGFcdTMwMDINCi0NCi10ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU3YmM0XHU2NzJjXHU3Njg0XHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHUzMDAyDQotdGVtcGxhdGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU3YmM0XHU2NzJjXHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotdGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU3YmM0XHU2NzJjXHU4MjA3XHU1M2U2XHU0ZTAwXHU1MDBiXHU3YmM0XHU2NzJjXHU3Njg0XHU5NWRjXHU0ZmMyXHUzMDAyDQotdGVtcGxhdGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU3YmM0XHU2NzJjXHU3Njg0XHU3MjQ4XHU2NzJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotDQotdGVybWRlZmluaXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1ODg1M1x1OGE5ZVx1NWI5YVx1N2ZhOVx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwMg0KLXRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1ODg1M1x1OGE5ZVx1NWI5YVx1N2ZhOVx1NzY4NFx1NGUwMFx1ODIyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLXRlcm1kZWZpbml0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1ODg1M1x1OGE5ZVx1NWI5YVx1N2ZhOVx1ODIwN1x1NTNlNlx1NGUwMFx1NTAwYlx1ODg1M1x1OGE5ZVx1NWI5YVx1N2ZhOVx1NzY4NFx1OTVkY1x1NGZjMlx1MzAwMg0KLXRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1ODg1M1x1OGE5ZVx1NWI5YVx1N2ZhOVx1NzY4NFx1NzI0OFx1NjcyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLQ0KLXRvb2xtZW50b3JfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NWRlNVx1NTE3N1x1OGYxNFx1NTJhOVx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwMg0KLXRvb2xtZW50b3JfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU1ZGU1XHU1MTc3XHU4ZjE0XHU1MmE5XHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotdG9vbG1lbnRvcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTVkZTVcdTUxNzdcdThmMTRcdTUyYTlcdTgyMDdcdTUzZTZcdTRlMDBcdTUwMGJcdTVkZTVcdTUxNzdcdThmMTRcdTUyYTlcdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi10b29sbWVudG9yX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NWRlNVx1NTE3N1x1OGYxNFx1NTJhOVx1NzY4NFx1NzI0OFx1NjcyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLQ0KLXdoaXRlcGFwZXJfZGV0YWlsU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NzY3ZFx1NzZhZVx1NjZmOFx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwMg0KLXdoaXRlcGFwZXJfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU3NjdkXHU3NmFlXHU2NmY4XHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotd2hpdGVwYXBlcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTc2N2RcdTc2YWVcdTY2ZjhcdTgyMDdcdTUzZTZcdTRlMDBcdTUwMGJcdTc2N2RcdTc2YWVcdTY2ZjhcdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi13aGl0ZXBhcGVyX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NzY3ZFx1NzZhZVx1NjZmOFx1NzY4NFx1NzI0OFx1NjcyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLQ0KLWRpc2NpcGxpbmVncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4OThmXHU3YmM0XHU1MjA2XHU3ZDQ0XHU3Njg0XHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHUzMDAyDQotZGlzY2lwbGluZWdyb3VwaW5nX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1NjNkMFx1NGY5Ylx1NmI2NFx1ODk4Zlx1N2JjNFx1NTIwNlx1N2Q0NFx1NzY4NFx1NGUwMFx1ODIyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLWRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTYzMDdcdTViOWFcdTZiNjRcdTg5OGZcdTdiYzRcdTUyMDZcdTdkNDRcdTgyMDdcdTUzZTZcdTRlMDBcdTUwMGJcdTg5OGZcdTdiYzRcdTUyMDZcdTdkNDRcdTc2ODRcdTk1ZGNcdTRmYzJcdTMwMDINCi1kaXNjaXBsaW5lZ3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4OThmXHU3YmM0XHU1MjA2XHU3ZDQ0XHU3Njg0XHU3MjQ4XHU2NzJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotDQotcm9sZXNldGdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTg5ZDJcdTgyNzJcdTk2YzZcdTUyMDZcdTdkNDRcdTc2ODRcdThhNzNcdTdkMzBcdThjYzdcdThhMGFcdTMwMDINCi1yb2xlc2V0Z3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4OWQyXHU4MjcyXHU5NmM2XHU1MjA2XHU3ZDQ0XHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotcm9sZXNldGdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1NjMwN1x1NWI5YVx1NmI2NFx1ODlkMlx1ODI3Mlx1OTZjNlx1NTIwNlx1N2Q0NFx1ODIwN1x1NTNlNlx1NGUwMFx1NTAwYlx1ODlkMlx1ODI3Mlx1OTZjNlx1NTIwNlx1N2Q0NFx1NzY4NFx1OTVkY1x1NGZjMlx1MzAwMg0KLXJvbGVzZXRncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTYzZDBcdTRmOWJcdTZiNjRcdTg5ZDJcdTgyNzJcdTk2YzZcdTUyMDZcdTdkNDRcdTc2ODRcdTcyNDhcdTY3MmNcdThjYzdcdThhMGFcdTMwMDINCi0NCi1jdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4MWVhXHU4YTAyXHU3YTJlXHU5ODVlXHU3Njg0XHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4MWVhXHU4YTAyXHU3YTJlXHU5ODVlXHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHU2MzA3XHU1YjlhXHU2YjY0XHU4MWVhXHU4YTAyXHU3YTJlXHU5ODVlXHU4MjA3XHU1M2U2XHU0ZTAwXHU1MDBiXHU4MWVhXHU4YTAyXHU3YTJlXHU5ODVlXHU3Njg0XHU5NWRjXHU0ZmMyXHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHU2M2QwXHU0ZjliXHU2YjY0XHU4MWVhXHU4YTAyXHU3YTJlXHU5ODVlXHU3Njg0XHU3MjQ4XHU2NzJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotY3VzdG9tY2F0ZWdvcnlfSWNvblNlY3Rpb25fZGVzYz1cdTgxZWFcdThhMDJcdTkwMTlcdTUwMGJcdTgxZWFcdThhMDJcdTdhMmVcdTk4NWVcdTc2ODRcdTU3MTZcdTc5M2FcdTMwMDINCi0NCi1jb25jZXB0X2ljb25TZWN0aW9uX2Rlc2M9XHU4MWVhXHU4YTAyXHU2YjY0XHU2OTgyXHU1ZmY1XHU3Njg0XHU1NzE2XHU3OTNhXHUzMDAyDQotY2hlY2tsaXN0X2ljb25TZWN0aW9uX2Rlc2M9XHU4MWVhXHU4YTAyXHU2YjY0XHU2ODM4XHU1YzBkXHU2ZTA1XHU1NWFlXHU3Njg0XHU1NzE2XHU3OTNhXHUzMDAyDQotdG9vbG1lbnRvcl9pY29uU2VjdGlvbl9kZXNjPVx1ODFlYVx1OGEwMlx1OTAxOVx1NTAwYlx1NWRlNVx1NTE3N1x1OGYxNFx1NTJhOVx1NzY4NFx1NTcxNlx1NzkzYVx1MzAwMg0KLXdoaXRlcGFwZXJfaWNvblNlY3Rpb25fZGVzYz1cdTgxZWFcdThhMDJcdTZiNjRcdTc2N2RcdTc2YWVcdTY2ZjhcdTc2ODRcdTU3MTZcdTc5M2FcdTMwMDINCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9pY29uU2VjdGlvbl9kZXNjPVx1ODFlYVx1OGEwMlx1OTAxOVx1NTAwYlx1OTgxMFx1NGYzMFx1ODAwM1x1OTFjZlx1NzY4NFx1NTcxNlx1NzkzYVx1MzAwMg0KLXRlcm1kZWZpbml0aW9uX2ljb25TZWN0aW9uX2Rlc2M9XHU4MWVhXHU4YTAyXHU5MDE5XHU1MDBiXHU4ODUzXHU4YTllXHU1YjlhXHU3ZmE5XHU3Njg0XHU1NzE2XHU3OTNhXHUzMDAyDQotdGVtcGxhdGVfaWNvblNlY3Rpb25fZGVzYz1cdTgxZWFcdThhMDJcdTZiNjRcdTdiYzRcdTY3MmNcdTc2ODRcdTU3MTZcdTc5M2FcdTMwMDINCi1yZXVzYWJsZWFzc2V0X2ljb25TZWN0aW9uX2Rlc2M9XHU4MWVhXHU4YTAyXHU5MDE5XHU1MDBiXHU1M2VmXHU5MWNkXHU4OTA3XHU0ZjdmXHU3NTI4XHU3Njg0XHU4Y2M3XHU3NTIyXHU3Njg0XHU1NzE2XHU3OTNhXHUzMDAyDQotcmVwb3J0X2ljb25TZWN0aW9uX2Rlc2M9XHU4MWVhXHU4YTAyXHU2YjY0XHU1ODMxXHU1NDRhXHU3Njg0XHU1NzE2XHU3OTNhXHUzMDAyDQotcHJhY3RpY2VfaWNvblNlY3Rpb25fZGVzYz1cdTgxZWFcdThhMDJcdTZiNjRcdTdkZjRcdTdmZDJcdTc2ODRcdTU3MTZcdTc5M2FcdTMwMDINCi1leGFtcGxlX2ljb25TZWN0aW9uX2Rlc2M9XHU4MWVhXHU4YTAyXHU2YjY0XHU3YmM0XHU0ZjhiXHU3Njg0XHU1NzE2XHU3OTNhXHUzMDAyDQotZ3VpZGVsaW5lX2ljb25TZWN0aW9uX2Rlc2M9XHU4MWVhXHU4YTAyXHU2YjY0XHU2ZTk2XHU1MjQ3XHU3Njg0XHU1NzE2XHU3OTNhXHUzMDAyDQotcm9hZG1hcF9pY29uU2VjdGlvbl9kZXNjPVx1ODFlYVx1OGEwMlx1NmI2NFx1ODVjZFx1NTcxNlx1NzY4NFx1NTcxNlx1NzkzYVx1MzAwMg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9pY29uU2VjdGlvbl9kZXNjPVx1ODFlYVx1OGEwMlx1NmI2NFx1OGYxNFx1NTJhOVx1OGNjN1x1NjU5OVx1NzY4NFx1NTcxNlx1NzkzYVx1MzAwMg0KLQ0KLWVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX3RpdGxlPVx1NmE5NFx1Njg0OFx1NWRmMlx1OGI4YVx1NjZmNA0KLWVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX21lc3NhZ2U9XHU2YTk0XHU2ODQ4XHU3Y2ZiXHU3ZDcxXHU0ZTBhXHU3Njg0XHU2YTk0XHU2ODQ4XHU1ZGYyXHU4YjhhXHU2NmY0XHUzMDAyXHU4OTgxXHU4ZjA5XHU1MTY1XHU4YjhhXHU2NmY0XHU1NWNlXHVmZjFmDQotDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU9XHU2ZDNiXHU1MmQ1XHU4YjhhXHU1MzE2XHU2MDI3DQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnPVx1NzEyMVx1NmNkNVx1NGVlNSAnJ3sxfScnIFx1NGY4Nlx1OGEyZFx1NWI5YVx1NmQzYlx1NTJkNSAnJ3swfScnIFx1NzY4NFx1OGI4YVx1NTMxNlx1NjAyN1x1ZmYwY1x1NTZlMFx1NzBiYSAnJ3sxfScnIFx1NzY4NFx1NWI1MFx1OTgwNVx1NWRmMlx1NTMwNVx1NjJlY1x1NGUwMFx1NjIxNlx1NTkxYVx1NTAwYlx1OTY0NFx1NTJhMC9cdTUzZDZcdTRlZTNcdTc2ODRcdTZkM2JcdTUyZDVcdTMwMDINCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cxPVx1NmQzYlx1NTJkNSAnJ3swfScnIFx1NzEyMVx1NmNkNVx1OGEyZFx1NWI5YVx1NTE3Nlx1NGUyZFx1NGUwMFx1NTAwYlx1NzZmNFx1N2NmYlx1NmJjZFx1OTgwNVx1NTQ4Y1x1NGVmYlx1NGY1NVx1N2EwYlx1NWU4Zlx1NzY4NFx1OGI4YVx1NTMxNlx1NjAyN1x1MzAwMg0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzI9XHU3MTIxXHU2Y2Q1XHU0ZWU1ICcnezF9JycgXHU0Zjg2XHU4YTJkXHU1YjlhXHU2ZDNiXHU1MmQ1ICcnezB9JycgXHU3Njg0XHU4YjhhXHU1MzE2XHU2MDI3XHVmZjBjXHU1NmUwXHU3MGJhXHU1YzA3XHU1YzBlXHU4MWY0XHU1ZmFhXHU3NGIwXHU3NmY4XHU0ZjlkXHU5NWRjXHU0ZmMyXHUzMDAyDQotDQotYXBwbHlfcGF0dGVybl9lcnJvcl90aXRsZT1cdTU5NTdcdTc1MjhcdTU3OGJcdTZhMjMNCi1hcHBseV9wYXR0ZXJuX2Vycm9yX21zZz1cdTcxMjFcdTZjZDVcdTRlZTUgJyd7MX0nJyBcdTRmODZcdTU5NTdcdTc1MjhcdTZkM2JcdTUyZDUgJyd7MH0nJyBcdTc2ODRcdTU3OGJcdTZhMjNcdWZmMGNcdTU2ZTBcdTcwYmFcdTVjMDdcdTVjMGVcdTgxZjRcdTVmYWFcdTc0YjBcdTc2ZjhcdTRmOWRcdTk1ZGNcdTRmYzJcdTMwMDINCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotQ2hhbmdlSGlzdG9yeURpYWxvZ19kZWxpbWl0ZXI9fA0KLU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3Jfc2hvd093bmVySW5MaWJyYXJ5Vmlldz1cdTU3MjhcdTMwMGNcdTdhMGJcdTVmMGZcdTVlYWJcdTMwMGRcdTg5OTZcdTU3MTZcdTRlMmRcdTk4NmZcdTc5M2FcdTkwMTlcdTUwMGJcdTY3MmFcdTg5ZTNcdTY3OTBcdTc2ODRcdTUzYzNcdTcxNjdcdTc2ODRcdTY0YzFcdTY3MDlcdTgwMDUNCi1NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3JlbW92ZVVucmVzb2x2ZWRSZWZlcmVuY2U9XHU3OWZiXHU5NjY0XHU5MDE5XHU1MDBiXHU2NzJhXHU4OWUzXHU2NzkwXHU3Njg0XHU1M2MzXHU3MTY3DQotcHJvbXB0RGVsZXRlQ3VzdG9tQ2F0ZWdvcnlCZWZvcmVSZW1vdmVMYXN0UmVmVG9JdD1cdTYwYThcdTVjMDdcdTU3MjhcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTRlMmRcdTc5ZmJcdTk2NjQgezB9IFx1NzY4NFx1NjcwMFx1NWY4Y1x1NGUwMFx1NTAwYlx1NTNjM1x1NzE2N1x1MzAwMlx1NWMwN1x1NTIyYVx1OTY2NFx1NTE0M1x1N2QyMFx1MzAwMlx1ODk4MVx1N2U3Y1x1N2U4Y1x1NTVjZVx1ZmYxZg0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jQmVsb3cgcHJvcGVydHkgImVkaXRvcl90aXRsZV9jb2xvbl93aXRoX3NwYWNlcyIgc2hvdWxkIG5vdCBiZSB0cmFuc2xhdGVkDQotI0Rvbid0IGRlbGV0ZSBhIHNwYWNlIGFmdGVyICI6ICINCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLWVkaXRvcl90aXRsZV9jb2xvbl93aXRoX3NwYWNlcz1cdWZmMWENCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM5OWI1ODEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvblRpdGxlPUFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbg0KLVByb2Nlc3NfRG9jdW1lbnRJbmZvcm1hdGlvblRpdGxlPURva3VtZW50YXRpb25zaW5mb3JtYXRpb25lbg0KLUFjdGl2aXR5X2d1aWRhbmNlSW5mb3JtYXRpb25UaXRsZT1BbmxlaXR1bmcNCi1CcmVha2Rvd25FbGVtZW50X29wdGlvbkluZm9ybWF0aW9uVGl0bGU9U3RydWt0dXJvcHRpb25lbg0KLVRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvblRpdGxlPVNjaHJpdHRlDQotDQotVGFza0Rlc2NyaXB0b3Jfc3RlcEluZm9ybWF0aW9uRGVzY3JpcHRpb249RGllIFNjaHJpdHRlIGZcdTAwZmNyIGRpZSBBdXNmXHUwMGZjaHJ1bmcgZGllc2VzIEF1ZmdhYmVuZGVza3JpcHRvcnMgYW5nZWJlbi4NCi0NCi1Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiB6dSB7MH0gYW5nZWJlbi4NCi1Qcm9jZXNzX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Eb2t1bWVudGF0aW9uc2luZm9ybWF0aW9uZW4gZlx1MDBmY3IgezB9IGFuZ2ViZW4uDQotDQotRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VtIERlc2tyaXB0b3IgYW5nZWJlbi4NCi1EZXNjcmlwdG9yX2RldGFpbEluZm9ybWF0aW9uRGVzY3JpcHRpb249RGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4genUgZGllc2VtIERlc2tyaXB0b3IgYW5nZWJlbi4NCi1NaWxlc3RvbmVfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBNZWlsZW5zdGVpbiBhbmdlYmVuLg0KLU1pbGVzdG9uZV9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPURldGFpbGxpZXJ0ZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBNZWlsZW5zdGVpbiBhbmdlYmVuLg0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBTdHJ1a3R1cmVsZW1lbnQgYW5nZWJlbi4NCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1BbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGllc2VtIFByb2pla3RzdHJ1a3R1cmVsZW1lbnQgYW5nZWJlbi4NCi1EZXNjcmlwdG9yX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0b249QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlbSBEZXNrcmlwdG9yIGFuZ2ViZW4uDQotQWN0aXZpdHlfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249QWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIHp1IGRpZXNlciBBa3Rpdml0XHUwMGU0dCBhbmdlYmVuLg0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfRG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPURva3VtZW50YXRpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZW0gU3RydWt0dXJlbGVtZW50IGFuZ2ViZW4uDQotQWN0aXZpdHlfRG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPURva3VtZW50YXRpb25zaW5mb3JtYXRpb25lbiB6dSBkaWVzZXIgQWt0aXZpdFx1MDBlNHQgYW5nZWJlbi4NCi1EZXNjcmlwdG9yX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Eb2t1bWVudGF0aW9uc2luZm9ybWF0aW9uZW4genUgZGllc2VtIERlc2tyaXB0b3IgYW5nZWJlbi4NCi1Qcm9jZXNzX05vbmU9PDwgT0hORSA+Pg0KLVByb2Nlc3NfbmFtZT1OYW1lOg0KLVByb2Nlc3NfUHJlc2VudGF0aW9uTmFtZT1Qclx1MDBlNHNlbnRhdGlvbnNuYW1lOg0KLVByb2Nlc3NfYnJpZWZEZXNjcmlwdGlvbj1LdXJ6YmVzY2hyZWlidW5nOg0KLVByb2Nlc3NfbWFpbkRlc2NyaXB0aW9uPSBIYXVwdGJlc2NocmVpYnVuZzoNCi1Qcm9jZXNzX3B1cnBvc2U9WndlY2s6DQotUHJvY2Vzc19wcmVmaXg9UHJcdTAwZTRmaXg6DQotDQotQnJlYWtkb3duRWxlbWVudF9UeXBlX05hbWU9U3RydWt0dXJlbGVtZW50DQotDQotUHJvY2Vzc19UeXBlX1Rhc2s9TWV0aG9kZW5hdWZnYWJlOg0KLVByb2Nlc3NfVHlwZV9Sb2xlPU1ldGhvZGVucm9sbGU6DQotUHJvY2Vzc19UeXBlX1dvcmtQcm9kdWN0PU1ldGhvZGVuYXJiZWl0c2VyZ2VibmlzOg0KLQ0KLVdvcmtQcm9kdWN0X1R5cGU9QXJiZWl0c2VyZ2VibmlzdHlwOg0KLQ0KLUFjdGl2aXR5X01vZGVsSW5mbz1Nb2RlbGxpbmZvcm1hdGlvbmVuOg0KLUFjdGl2aXR5X1R5cGU9QWt0aXZpdFx1MDBlNHRzdHlwOg0KLUFjdGl2aXR5X3ByZXNlbnRhdGlvbk5hbWU9UHJcdTAwZTRzZW50YXRpb25zbmFtZToNCi1BY3Rpdml0eV9hbHRlcm5hdGl2ZXM9QWx0ZXJuYXRpdmVuOg0KLUFjdGl2aXR5X2hvd1RvU3RhZmY9Vm9yZ2VoZW5zd2Vpc2UgYmVpIE1pdGFyYmVpdGVyYXVzd2FobDoNCi1CcmVha2Rvd25FbGVtZW50X2tleUNvbnNpZGVyYXRpb25zPVdpY2h0aWdlIEhpbndlaXNlOg0KLVByb2Nlc3NfdXNhZ2VHdWlkYW5jZT1WZXJ3ZW5kdW5nc2FubGVpdHVuZzoNCi0NCi1BY3Rpdml0eV9Sb2FkbWFwVGl0bGU9Um9hZG1hcHMNCi1BY3Rpdml0eV9Sb2FkbWFwRGVzY3JpcHRpb249TGlua3MgenUgd2VpdGVyZW4gSW5mb3JtYXRpb25lbiBpbiBGb3JtIHZvbiBSb2FkbWFwcyBhbmdlYmVuLg0KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZVRpdGxlPUFsbGdlbWVpbmUgQW5sZWl0dW5nDQotQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlRGVzY3JpcHRpb249TGlua3MgenUgd2VpdGVyZW4gSW5mb3JtYXRpb25lbiBpbiBGb3JtIHZvbiBBbmxlaXR1bmdlbiBhbmdlYmVuLg0KLUFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbFRpdGxlPUtvbW11bmlrYXRpb25zbWF0ZXJpYWwNCi1BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbj1MaW5rcyB6dSB3ZWl0ZXJlbiBJbmZvcm1hdGlvbmVuIGluIEZvcm0gdm9uIEtvbW11bmlrYXRpb25zbWF0ZXJpYWwgYW5nZWJlbi4NCi1BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbFRpdGxlPUxlcm5tYXRlcmlhbA0KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb249TGlua3MgenUgd2VpdGVyZW4gSW5mb3JtYXRpb25lbiBpbiBGb3JtIHZvbiBMZXJubWF0ZXJpYWwgYW5nZWJlbi4NCi0NCi1BY3Rpdml0eV9TZWxlY3RlZF9Sb2FkbWFwPVJvYWRtYXBzOg0KLUFjdGl2aXR5X1NlbGVjdGVkX0dlbmVyYWxHdWlkYW5jZT1BbmxlaXR1bmc6DQotQWN0aXZpdHlfU2VsZWN0ZWRfQ29tbXVuaWNhdGlvbk1hdGVyaWFsPUtvbW11bmlrYXRpb25zbWF0ZXJpYWw6DQotQWN0aXZpdHlfU2VsZWN0ZWRfRWR1Y2F0aW9uTWF0ZXJpYWw9TGVybm1hdGVyaWFsOg0KLQ0KLUFjdGl2aXR5X0RpYWdyYW1UaXRsZT1EaWFncmFtbQ0KLUFjdGl2aXR5X0RpYWdyYW1EZXNjcmlwdGlvbiA9IERpYWdyYW1tZSBmXHUwMGZjciB7MH0gYmVyZWl0c3RlbGxlbi4NCi1BY3Rpdml0eV9BREltYWdlPUFrdGl2aXRcdTAwZTR0c2RpYWdyYW1tDQotQWN0aXZpdHlfQURESW1hZ2U9QWt0aXZpdFx1MDBlNHRzZGV0YWlsZGlhZ3JhbW0NCi1BY3Rpdml0eV9XUERJbWFnZT1BcmJlaXRzZXJnZWJuaXNhYmhcdTAwZTRuZ2lna2VpdHNkaWFncmFtbQ0KLUFjdGl2aXR5X1VzZUFESW1hZ2U9QWt0aXZpdFx1MDBlNHRzZGlhZ3JhbW0gZlx1MDBmY3IgVmVyXHUwMGY2ZmZlbnRsaWNodW5nIHZlcndlbmRlbg0KLUFjdGl2aXR5X1VzZUFEREltYWdlPUFrdGl2aXRcdTAwZTR0c2RldGFpbGRpYWdyYW1tIGZcdTAwZmNyIFZlclx1MDBmNmZmZW50bGljaHVuZyB2ZXJ3ZW5kZW4NCi1BY3Rpdml0eV9Vc2VXUERJbWFnZT1BcmJlaXRzZXJnZWJuaXNhYmhcdTAwZTRuZ2lna2VpdHNkaWFncmFtbSBmXHUwMGZjciBWZXJcdTAwZjZmZmVudGxpY2h1bmcgdmVyd2VuZGVuDQotQWN0aXZpdHlfQXNzaWduPVp1b3JkbmVuLi4uDQotDQotVGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRfU3RlcHM9U2Nocml0dGU6DQotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ1RpdGxlPVNjaHJpdHRlDQotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ01lc3NhZ2U9U2Nocml0dGUgYXVzd1x1MDBlNGhsZW4NCi0NCi1BY3Rpdml0eV9Xb3JrUm9sbHVwPUFyYmVpdHMtUm9sbHVwDQotQWN0aXZpdHlfVGVhbVJvbGx1cD1UZWFtLVJvbGx1cA0KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cD1BcmJlaXRzZXJnLi1Sb2xsdXANCi1BY3Rpdml0eV9Xb3JrUm9sbHVwRGVzY3JpcHRpb249QXJiZWl0cy1Sb2xsdXAgZlx1MDBmY3IgZGllc2UgQWt0aXZpdFx1MDBlNHQgaW4gZGllc2VtIEFic2Nobml0dCBwclx1MDBmY2Zlbg0KLUFjdGl2aXR5X1RlYW1Sb2xsdXBEZXNjcmlwdGlvbj1UZWFtLVJvbGx1cCBmXHUwMGZjciBkaWVzZSBBa3Rpdml0XHUwMGU0dCBpbiBkaWVzZW0gQWJzY2huaXR0IHByXHUwMGZjZmVuDQotQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwRGVzY3JpcHRpb249QXJiZWl0c2VyZ2VibmlzLVJvbGx1cCBmXHUwMGZjciBkaWVzZSBBa3Rpdml0XHUwMGU0dCBpbiBkaWVzZW0gQWJzY2huaXR0IHByXHUwMGZjZmVuDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fTXVsdGlwbGVPY3VycmFuY2U9TWVocmVyZSBWb3Jrb21tZW4NCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9PcHRpb25hbD1PcHRpb25hbA0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1BsYW5uZWQ9R2VwbGFudA0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N1cHJlc3NlZD1VbnRlcmRyXHUwMGZjY2t0DQotDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRXZlbnREcml2ZW49RXJlaWduaXNnZXN0ZXVlcnQNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9PbmdvaW5nPUZvcnRsYXVmZW5kDQotV29ya0JyZWFrZG93bkVsZW1lbnRfUmVwZWF0YWJsZT1XaWVkZXJob2x0IGFud2VuZGJhcg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29ycz1Wb3JnXHUwMGU0bmdlcjoNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5PUFiaFx1MDBlNG5naWdrZWl0Og0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0lEX1RFWFQ9SW5kZXgNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9QUkVTRU5UQVRJT05fTkFNRV9URVhUPVByXHUwMGU0c2VudGF0aW9uc25hbWUNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9ERVBFTkRFTkNZX1RFWFQ9QWJoXHUwMGU0bmdpZ2tlaXQNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0FkZD1IaW56dWZcdTAwZmNnZW4NCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0VkaXQ9QmVhcmJlaXRlbg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfUmVtb3ZlPUVudGZlcm5lbg0KLQ0KLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX1NUQVJUPUVuZGUgYmlzIEFuZmFuZw0KLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX0ZJTklTSD1FbmRlIGJpcyBFbmRlDQotV29ya09yZGVyVHlwZV9TVEFSVF9UT19GSU5JU0g9QW5mYW5nIGJpcyBFbmRlDQotV29ya09yZGVyVHlwZV9TVEFSVF9UT19TVEFSVD1BbmZhbmcgYmlzIEFuZmFuZw0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N5bmNocm9uaXplZD1TeW5jaHJvbmlzaWVydCBtaXQgUXVlbGxlDQotDQotRGVzY3JpcHRvcl9SZWZpbmVkRGVzY3JpcHRpb249UHJcdTAwZTR6aXNpZXJ0ZSBCZXNjaHJlaWJ1bmc6DQotDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvblRpdGxlPVJvbGxlbg0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25EZXNjcmlwdGlvbj1EaWUgUm9sbGVuZGVza3JpcHRvcmVuIGZcdTAwZmNyIGRpZSBBdXNmXHUwMGZjaHJ1bmcgZGllc2VzIEF1ZmdhYmVuZGVza3JpcHRvcnMgenVvcmRuZW4uDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUxPVByaW1cdTAwZTRyZXIgQXVzZlx1MDBmY2hyZW5kZXI6DQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUyPVp1c1x1MDBlNHR6bGljaGUgQXVzZlx1MDBmY2hyZW5kZToNCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTM9VW50ZXJzdFx1MDBmY3R6dCB2b246DQotDQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25UaXRsZT1BcmJlaXRzZXJnZWJuaXNzZQ0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249RGVza3JpcHRvcmVuIGZcdTAwZmNyIEVpbmdhYmUtIHVuZCBBdXNnYWJlYXJiZWl0c2VyZ2Vibmlzc2UgZlx1MDBmY3IgZGllc2VuIEF1ZmdhYmVuZGVza3JpcHRvciBhbmdlYmVuLg0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTE9VmVyYmluZGxpY2hlIEVpbmdhYmU6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMj1PcHRpb25hbGUgRWluZ2FiZToNCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUzPUV4dGVybmUgRWluZ2FiZToNCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGU0PUF1c2dhYmU6DQotDQotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvblRpdGxlPUF1ZmdhYmVuDQotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPURpZXNlciBSb2xsZW5kZXNrcmlwdG9yIGlzdCBBdXNmXHUwMGZjaHJlbmRlciBkZXIgZm9sZ2VuZGVuIEF1ZmdhYmVuZGVza3JpcHRvcmVuLg0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMT1QcmltXHUwMGU0cmVyIEF1c2ZcdTAwZmNocmVuZGVyOg0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMj1adXNcdTAwZTR0emxpY2hlIEF1c2ZcdTAwZmNocmVuZGU6DQotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUzPVVudGVyc3RcdTAwZmN0enQgdm9uOg0KLQ0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9QXJiZWl0c2VyZ2Vibmlzc2UNCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvbkRlc2NyaXB0aW9uPURpZXNlciBSb2xsZW5kZXNrcmlwdG9yIGlzdCBmXHUwMGZjciBkaWUgZm9sZ2VuZGVuIEFyYmVpdHNlcmdlYm5pc2Rlc2tyaXB0b3JlbiB2ZXJhbnR3b3J0bGljaCB1bmQgXHUwMGU0bmRlcnQgZGllc2UuDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1WZXJhbnR3b3J0bGljaCBmXHUwMGZjcjoNCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyPVx1MDBjNG5kZXJ1bmc6DQotDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1Sb2xsZW4NCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPURpZSBmb2xnZW5kZW4gUm9sbGVuZGVza3JpcHRvcmVuIHNpbmQgZlx1MDBmY3IgZGllc2VuIEFyYmVpdHNlcmdlYm5pc2Rlc2tyaXB0b3IgdmVyYW50d29ydGxpY2ggdW5kIFx1MDBlNG5kZXJuIGRpZXNlbi4NCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfVGFibGUxPVZlcmFudHdvcnRsaWNoIGZcdTAwZmNyOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9R2VcdTAwZTRuZGVydCB2b246DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1R5cGU9VHlwOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGU9QW5mYW5nc3p1c3RhbmQgZGVyIEFrdGl2aXRcdTAwZTR0Og0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZT1FbmR6dXN0YW5kIGRlciBBa3Rpdml0XHUwMGU0dDoNCi0NCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25UaXRsZT1UZWlsZSBkZXMgTGllZmVyZ2VnZW5zdGFuZHMNCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25EZXNjcmlwdGlvbj1EZXIgTGllZmVyZ2VnZW5zdGFuZCBoYXQgZGllIGZvbGdlbmRlbiBUZWlsZS4NCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1RhYmxlMT1UZWlsZSBkZXMgTGllZmVyZ2VnZW5zdGFuZHMNCi0NCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25UaXRsZT1UZWFtcw0KLVJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvbkRlc2NyaXB0aW9uPURpZXNlciBSb2xsZW5kZXNrcmlwdG9yIHZlcndlaXN0IGF1ZiBkaWUgZm9sZ2VuZGVuIFRlYW1zLg0KLVJvbGVEZXNjcmlwdG9yX1RlYW1fVGFibGUxPVRlYW1zOg0KLQ0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uVGl0bGU9Um9sbGVuDQotQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbj1EaWVzZSBrb21iaW5pZXJ0ZSBSb2xsZSBoYXQgZGllIGZvbGdlbmRlbiBFaW56ZWxyb2xsZW4uDQotQ29tcG9zaXRlUm9sZV9Sb2xlX1RhYmxlMT1FaW56ZWxyb2xsZW46DQotDQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uVGl0bGU9Um9sbGVuDQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb249Um9sbGVuIHp1bSBUZWFtcHJvZmlsIGhpbnp1Zlx1MDBmY2dlbiBvZGVyIGF1cyBkaWVzZW0gZW50ZmVybmVuLg0KLVRlYW1Qcm9maWxlX1JvbGVfVGFibGUxPVJvbGxlbjoNCi0NCi1Qcm9jZXNzX1JpY2hUZXh0X0NvbGxhcHNlSW1hZ2U9Y29sbGFwc2VkLmdpZg0KLVByb2Nlc3NfUmljaFRleHRfRXhwYW5kSW1hZ2U9ZXhwYW5kZWQuZ2lmDQotUHJvY2Vzc19BZGQ9SGluenVmXHUwMGZjZ2VuLi4uDQotUHJvY2Vzc19BZGRGcm9tUHJvY2Vzcz1IaW56dWZcdTAwZmNnZW4gYXVzIFByb3plc3MuLi4NCi1Qcm9jZXNzX1JlbmFtZV9NZXNzYWdlPVNpZSBzaW5kIGRhYmVpLCBkZW4gTmFtZW4gZGVzIFByb3plc3NlcyB6dSBcdTAwZTRuZGVybi4gQmVpIGRpZXNlciBBa3Rpb24gd2lyZCBkZXIgSW5oYWx0IGRlcyBFZGl0b3JzIGdlc3BlaWNoZXJ0IHVuZCBkZXIgUHJvemVzc29yZG5lciB1bWJlbmFubnQuIEZvcnRmYWhyZW4/DQotUHJvY2Vzc19SZW1vdmU9RW50ZmVybmVuDQotUHJvY2Vzc19VcD1OYWNoIG9iZW4NCi1Qcm9jZXNzX0Rvd249TmFjaCB1bnRlbg0KLVByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb249TWVocmZhY2hhdXN3YWhsDQotUHJvY2Vzc19CdXR0b25fTGlua01ldGhvZEVsZW1lbnQ9TWV0aG9kZW5lbGVtZW50IHZlcmxpbmtlbi4uLg0KLQ0KLSMjIEVycm9yL1dhcm5pbmcNCi1Qcm9jZXNzX0ludmFsaWROYW1lVGl0bGU9VW5nXHUwMGZjbHRpZ2VyIE5hbWUNCi1Qcm9jZXNzX0ludmFsaWROYW1lPUlVUEEwMDgxRTogRGVyIE5hbWUgbXVzcyBhbmdlZ2ViZW4gd2VyZGVuLiBHZWJlbiBTaWUgZWluZW4gZ1x1MDBmY2x0aWdlbiBOYW1lbiBhbi4NCi1Qcm9jZXNzX1JlbmFtZV9UaXRsZT1VbWJlbmVubmVuDQotUHJvY2Vzc19JbnZhbGlkUHJlc2VudGF0aW9uTmFtZT1JVVBBMDA4MkU6IERlciBQclx1MDBlNHNlbnRhdGlvbnNuYW1lIG11c3MgYW5nZWdlYmVuIHdlcmRlbi4gR2ViZW4gU2llIGVpbmVuIGdcdTAwZmNsdGlnZW4gUHJcdTAwZTRzZW50YXRpb25zbmFtZW4gYW4uDQotUHJvY2Vzc19MaW5rTWV0aG9kRWxlbWVudFRpdGxlPU1ldGhvZGVuZWxlbWVudCB2ZXJsaW5rZW4NCi1Qcm9jZXNzX0ludmFsaWRMaW5rTWV0aG9kRWxlbWVudD1JVVBBMDA4M0U6IEVzIGthbm4ga2VpbiBMaW5rIHp1ICcnezB9JycgZXJnZXN0ZWxsdCB3ZXJkZW4sIHdlaWwgZGllc2VzIE1ldGhvZGVuZWxlbWVudCBiZXJlaXRzIGZcdTAwZmNyIGVpbmVuIGFuZGVyZW4gRGVza3JpcHRvciB1bnRlciBkZW1zZWxiZW4gXHUwMGZjYmVyZ2VvcmRuZXRlbiBFbGVtZW50IHZlcndlbmRldCB3aXJkLg0KLVByb2Nlc3NfQXNzaWdubWVudEluZm9UaXRsZT1JbmZvcm1hdGlvbg0KLVByb2Nlc3NfVGVhbUFzc2lnbkVycm9yPUlVUEEwMDg0RTogJyd7MH0nJyBrYW5uIGRlbSBUZWFtICcnezF9JycgbmljaHQgaGluenVnZWZcdTAwZmNndCB3ZXJkZW4uXG5cblJvbGxlbmRlc2tyaXB0b3JlbiBtdXNzIGVpbmUgTWV0aG9kZW5lbGVtZW50cm9sbGUgenVnZW9yZG5ldCBzZWluLCBkYW1pdCBzaWUgZWluZW0gVGVhbSB6dWdlb3JkbmV0IHdlcmRlbiBrXHUwMGY2bm5lbi5cblxuIEtvcnJpZ2llcmVuIFNpZSBkaWUgWnVvcmRudW5nIHVuZCB3aWVkZXJob2xlbiBTaWUgYW5zY2hsaWVcdTAwZGZlbmQgZGVuIFZvcmdhbmcuDQotUHJvY2Vzc19UZWFtRGlhbG9nTWVzc2FnZT1BdXNnZXdcdTAwZTRobHRlIFRlYW1zDQotUHJvY2Vzc19UZWFtRGlhbG9nVGl0bGU9VGVhbXMNCi0NCi1Qcm9jZXNzX0RlbGl2ZXJhYmxlQXNzaWduRXJyb3I9SVVQQTAwODVFOiAnJ3swfScnIGthbm4gZGVtIExpZWZlcmdlZ2Vuc3RhbmQgJyd7MX0nJyBuaWNodCBoaW56dWdlZlx1MDBmY2d0IHdlcmRlbiwgd2VpbCBrZWluIEFyYmVpdHNlcmdlYm5pcyBmXHUwMGZjciBkYXMgTWV0aG9kZW5lbGVtZW50IHp1Z2VvcmRuZXQgaXN0Lg0KLVByb2Nlc3NfQ29tcG9zaXRlUm9sZUFzc2lnbkVycm9yPUlVUEEwMDg2RTogJyd7MH0nJyBrYW5uIGRlciBrb21iaW5pZXJ0ZW4gUm9sbGUgJyd7MX0nJyBuaWNodCBoaW56dWdlZlx1MDBmY2d0IHdlcmRlbiwgd2VpbCBrZWluZSBNZXRob2RlbmVsZW1lbnRyb2xsZSB6dWdlb3JkbmV0IGlzdC4NCi1Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlck1lc3NhZ2U9SVVQQTAwODdXOiBHZWJlbiBTaWUgZWluZSBnXHUwMGZjbHRpZ2UgWmFobCBmXHUwMGZjciBkaWUgVm9yZ1x1MDBlNG5nZXIgYW4uDQotUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJUaXRsZT1VbmdcdTAwZmNsdGlnZSBWb3JnXHUwMGU0bmdlci1JRA0KLQ0KLVByb2Nlc3NfTm9JdGVtcz1FcyB3dXJkZW4ga2VpbmUgRWludHJcdTAwZTRnZSBhdXNnZXdcdTAwZTRobHQNCi1Qcm9jZXNzX0l0ZW1zU2VsZWN0ZWQ9RXMgd3VyZGVuIHswfSBFaW50clx1MDBlNGdlIGF1c2dld1x1MDBlNGhsdA0KLVByb2Nlc3NfTm9Qcm9wZXJ0aWVzQXZhaWxhYmxlPUVzIHNpbmQga2VpbmUgTWVya21hbGUgdmVyZlx1MDBmY2diYXINCi0NCi1QcmVkZWNlc3NvckRpYWxvZ19UaXRsZT1BYmhcdTAwZTRuZ2lna2VpdCB2b20gVm9yZ1x1MDBlNG5nZXINCi1QcmVkZWNlc3NvckRpYWxvZ19IZWFkZXJNZXNzYWdlPUFiaFx1MDBlNG5naWdrZWl0c3R5cCBmXHUwMGZjciBWb3JnXHUwMGU0bmdlciBlaW5nZWJlbjoNCi1QcmVkZWNlc3NvckRpYWxvZ19JbmRleD1JbmRleDoNCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVzZW50YXRpb25OYW1lPVByXHUwMGU0c2VudGF0aW9uc25hbWU6DQotUHJlZGVjZXNzb3JEaWFsb2dfRGVwZW5kZW5jeT1BYmhcdTAwZTRuZ2lna2VpdDoNCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yRGlhbG9nVGl0bGU9Vm9yZ1x1MDBlNG5nZXINCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yTWVzc2FnZT1JVVBBMDA4OEU6IEVzIGlzdCBiZXJlaXRzIGVpbiBWb3JnXHUwMGU0bmdlciBtaXQgZGllc2VyIElEIGZcdTAwZmNyIGRhcyBQcm9qZWt0c3RydWt0dXJlbGVtZW50IHZvcmhhbmRlbi4NCi0NCi1Qcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfdGV4dEVkaXRDZWxsX3Byb2JsZW1fbXNnPUlVUEEwMDkwRTogQmVpbSBCZWFyYmVpdGVuIGVpbmVyIEVpZ2Vuc2NoYWZ0IGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLg0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc19jZWxsRWRpdG9yX2ludmFsaWRQcmVkY2Vzc29yX3Byb2JsZW1fbXNnPUlVUEEwMDg5VzogVW5nXHUwMGZjbHRpZ2UgVm9yZ1x1MDBlNG5nZXJsaXN0ZQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDNkMjBmNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uVGl0bGU9SW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsDQotUHJvY2Vzc19Eb2N1bWVudEluZm9ybWF0aW9uVGl0bGU9SW5mb3JtYWNpXHUwMGYzbiBzb2JyZSBsYSBkb2N1bWVudGFjaVx1MDBmM24NCi1BY3Rpdml0eV9ndWlkYW5jZUluZm9ybWF0aW9uVGl0bGU9R3VcdTAwZWRhDQotQnJlYWtkb3duRWxlbWVudF9vcHRpb25JbmZvcm1hdGlvblRpdGxlPU9wY2lvbmVzIGRlIGRlc2dsb3NlDQotVGFza0Rlc2NyaXB0b3Jfc3RlcEluZm9ybWF0aW9uVGl0bGU9UGFzb3MNCi0NCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Fc3BlY2lmaXF1ZSBsb3MgcGFzb3MgcXVlIGRlYmUgcmVhbGl6YXIgZXN0ZSBkZXNjcmlwdG9yIGRlIHRhcmVhcy4NCi0NCi1Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbCBhY2VyY2EgZGU6IHswfS4NCi1Qcm9jZXNzX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIHNvYnJlIGxhIGRvY3VtZW50YWNpXHUwMGYzbiBkZTogezB9Lg0KLQ0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBnZW5lcmFsIGFjZXJjYSBkZSBlc3RlIGRlc2NyaXB0b3IuDQotRGVzY3JpcHRvcl9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZGV0YWxsYWRhIGFjZXJjYSBkZSBlc3RlIGRlc2NyaXB0b3IuDQotTWlsZXN0b25lX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbCBhY2VyY2EgZGUgZXN0ZSBvYmpldGl2by4NCi1NaWxlc3RvbmVfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBhY2VyY2EgZGUgZXN0ZSBvYmpldGl2by4NCi0NCi1CcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbCBhY2VyY2EgZGUgZXN0ZSBlbGVtZW50byBkZSBkZXNnbG9zZS4NCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm9wb3JjaW9uZSBpbmZvcm1hY2lcdTAwZjNuIGdlbmVyYWwgYWNlcmNhIGRlIGVzdGUgZWxlbWVudG8gZGUgZGVzZ2xvc2UgZGVsIHRyYWJham8uDQotRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdG9uPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbCBhY2VyY2EgZGUgZXN0ZSBkZXNjcmlwdG9yLg0KLUFjdGl2aXR5X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3BvcmNpb25lIGluZm9ybWFjaVx1MDBmM24gZ2VuZXJhbCBhY2VyY2EgZGUgZXN0YSBhY3RpdmlkYWQuDQotDQotQnJlYWtkb3duRWxlbWVudF9Eb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBzb2JyZSBsYSBkb2N1bWVudGFjaVx1MDBmM24gZGUgZXN0ZSBlbGVtZW50byBkZSBkZXNnbG9zZS4NCi1BY3Rpdml0eV9Eb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBzb2JyZSBsYSBkb2N1bWVudGFjaVx1MDBmM24gZGUgZXN0YSBhY3RpdmlkYWQuDQotRGVzY3JpcHRvcl9kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvcG9yY2lvbmUgaW5mb3JtYWNpXHUwMGYzbiBzb2JyZSBsYSBkb2N1bWVudGFjaVx1MDBmM24gZGUgZXN0ZSBkZXNjcmlwdG9yLg0KLVByb2Nlc3NfTm9uZT08PCBOT05FID4+DQotUHJvY2Vzc19uYW1lPU5vbWJyZToNCi1Qcm9jZXNzX1ByZXNlbnRhdGlvbk5hbWU9Tm9tYnJlIGRlIHByZXNlbnRhY2lcdTAwZjNuOg0KLVByb2Nlc3NfYnJpZWZEZXNjcmlwdGlvbj1EZXNjcmlwY2lcdTAwZjNuIGJyZXZlOg0KLVByb2Nlc3NfbWFpbkRlc2NyaXB0aW9uPSBEZXNjcmlwY2lcdTAwZjNuIHByaW5jaXBhbDoNCi1Qcm9jZXNzX3B1cnBvc2U9T2JqZXRpdm86DQotUHJvY2Vzc19wcmVmaXg9UHJlZmlqbzoNCi0NCi1CcmVha2Rvd25FbGVtZW50X1R5cGVfTmFtZT1FbGVtZW50byBkZSBkZXNnbG9zZQ0KLQ0KLVByb2Nlc3NfVHlwZV9UYXNrPVRhcmVhIGRlbCBtXHUwMGU5dG9kbzoNCi1Qcm9jZXNzX1R5cGVfUm9sZT1Sb2wgZGVsIG1cdTAwZTl0b2RvOg0KLVByb2Nlc3NfVHlwZV9Xb3JrUHJvZHVjdD1Qcm9kdWN0byBkZSB0cmFiYWpvIGRlIG1cdTAwZTl0b2RvOg0KLQ0KLVdvcmtQcm9kdWN0X1R5cGU9VGlwbyBkZSBwcm9kdWN0byBkZSB0cmFiYWpvOg0KLQ0KLUFjdGl2aXR5X01vZGVsSW5mbz1JbmZvcm1hY2lcdTAwZjNuIGRlbCBtb2RlbG86DQotQWN0aXZpdHlfVHlwZT1UaXBvIGRlIGFjdGl2aWRhZDoNCi1BY3Rpdml0eV9wcmVzZW50YXRpb25OYW1lPU5vbWJyZSBkZSBwcmVzZW50YWNpXHUwMGYzbjoNCi1BY3Rpdml0eV9hbHRlcm5hdGl2ZXM9QWx0ZXJuYXRpdmFzOg0KLUFjdGl2aXR5X2hvd1RvU3RhZmY9Q1x1MDBmM21vIHByb3ZlZXIgZGUgcGVyc29uYWw6DQotQnJlYWtkb3duRWxlbWVudF9rZXlDb25zaWRlcmF0aW9ucz1GYWN0b3JlcyBjbGF2ZToNCi1Qcm9jZXNzX3VzYWdlR3VpZGFuY2U9R3VcdTAwZWRhIGRlIHV0aWxpemFjaVx1MDBmM246DQotDQotQWN0aXZpdHlfUm9hZG1hcFRpdGxlPU1hcGFzDQotQWN0aXZpdHlfUm9hZG1hcERlc2NyaXB0aW9uPVByb3BvcmNpb25hciBlbmxhY2VzIGEgaW5mb3JtYWNpXHUwMGYzbiBhZGljaW9uYWwgZW4gZm9ybWEgZGUgbWFwYXMuDQotQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlVGl0bGU9R3VcdTAwZWRhIGdlbmVyYWwNCi1BY3Rpdml0eV9HZW5lcmFsR3VpZGFuY2VEZXNjcmlwdGlvbj1Qcm9wb3JjaW9uYXIgZW5sYWNlcyBhIGluZm9ybWFjaVx1MDBmM24gYWRpY2lvbmFsIGVuIGZvcm1hIGRlIGd1XHUwMGVkYS4NCi1BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxUaXRsZT1NYXRlcmlhbGVzIGRlIGNvbXVuaWNhY2lcdTAwZjNuDQotQWN0aXZpdHlfQ29tbXVuaWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb249UHJvcG9yY2lvbmFyIGVubGFjZXMgYSBpbmZvcm1hY2lcdTAwZjNuIGFkaWNpb25hbCBlbiBmb3JtYSBkZSBtYXRlcmlhbGVzIGRlIGNvbXVuaWNhY2lcdTAwZjNuLg0KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsVGl0bGU9TWF0ZXJpYWxlcyBkZSBmb3JtYWNpXHUwMGYzbg0KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb249UHJvcG9yY2lvbmFyIGVubGFjZXMgYSBpbmZvcm1hY2lcdTAwZjNuIGFkaWNpb25hbCBlbiBmb3JtYSBkZSBtYXRlcmlhbGVzIGRlIGZvcm1hY2lcdTAwZjNuLg0KLQ0KLUFjdGl2aXR5X1NlbGVjdGVkX1JvYWRtYXA9TWFwYXM6DQotQWN0aXZpdHlfU2VsZWN0ZWRfR2VuZXJhbEd1aWRhbmNlPUd1XHUwMGVkYToNCi1BY3Rpdml0eV9TZWxlY3RlZF9Db21tdW5pY2F0aW9uTWF0ZXJpYWw9TWF0ZXJpYWxlcyBkZSBjb211bmljYWNpXHUwMGYzbjoNCi1BY3Rpdml0eV9TZWxlY3RlZF9FZHVjYXRpb25NYXRlcmlhbD1NYXRlcmlhbGVzIGRlIGZvcm1hY2lcdTAwZjNuOg0KLQ0KLUFjdGl2aXR5X0RpYWdyYW1UaXRsZT1EaWFncmFtYQ0KLUFjdGl2aXR5X0RpYWdyYW1EZXNjcmlwdGlvbiA9IFByb3BvcmNpb25hciBpbVx1MDBlMWdlbmVzIGRlIGRpYWdyYW1hIHBhcmEgZXN0ZSB7MH0uDQotQWN0aXZpdHlfQURJbWFnZT1EaWFncmFtYSBkZSBsYSBhY3RpdmlkYWQNCi1BY3Rpdml0eV9BRERJbWFnZT1EaWFncmFtYSBkZSBkZXRhbGxlcyBkZSBsYSBhY3RpdmlkYWQNCi1BY3Rpdml0eV9XUERJbWFnZT1EaWFncmFtYSBkZSBkZXBlbmRlbmNpYSBkZWwgcHJvZHVjdG8gZGUgdHJhYmFqbw0KLUFjdGl2aXR5X1VzZUFESW1hZ2U9VXRpbGl6YXIgZWwgZGlhZ3JhbWEgZGUgbGEgYWN0aXZpZGFkIHBhcmEgcHVibGljYXINCi1BY3Rpdml0eV9Vc2VBRERJbWFnZT1VdGlsaXphciBlbCBkaWFncmFtYSBkZSBkZXRhbGxlIGRlIGxhIGFjdGl2aWRhZCBwYXJhIHB1YmxpY2FyDQotQWN0aXZpdHlfVXNlV1BESW1hZ2U9VXRpbGl6YXIgZWwgZGlhZ3JhbWEgZGUgZGVwZW5kZW5jaWEgZGVsIHByb2R1Y3RvIGRlIHRyYWJham8gcGFyYSBwdWJsaWNhcg0KLUFjdGl2aXR5X0Fzc2lnbj1Bc2lnbmFyLi4uDQotDQotVGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRfU3RlcHM9UGFzb3M6DQotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ1RpdGxlPVBhc29zDQotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ01lc3NhZ2U9U2VsZWNjaW9uYXIgcGFzb3MNCi0NCi1BY3Rpdml0eV9Xb3JrUm9sbHVwPVRyYWJhamFyIGNvbiBlbGVtZW50b3MgY29udHJhXHUwMGVkZG9zDQotQWN0aXZpdHlfVGVhbVJvbGx1cD1FbGVtZW50b3MgY29udHJhXHUwMGVkZG9zIGRlIEVxdWlwbw0KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cD1UcmFiYWphciBjb24gZWxlbWVudG9zIGNvbnRyYVx1MDBlZGRvcyBkZSBwcm9kdWN0b3MNCi1BY3Rpdml0eV9Xb3JrUm9sbHVwRGVzY3JpcHRpb249UmV2aXNhciBsb3MgZWxlbWVudG9zIGNvbnRyYVx1MDBlZGRvcyBkZSB0cmFiYWpvIHBhcmEgZXN0YSBhY3RpdmlkYWQgZW4gZXN0YSBzZWNjaVx1MDBmM24uDQotQWN0aXZpdHlfVGVhbVJvbGx1cERlc2NyaXB0aW9uPVJldmlzYXIgbG9zIGVsZW1lbnRvcyBjb250cmFcdTAwZWRkb3MgZGUgZXF1aXBvIHBhcmEgZXN0YSBhY3RpdmlkYWQgZW4gZXN0YSBzZWNjaVx1MDBmM24uDQotQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwRGVzY3JpcHRpb249UmV2aXNhciBsb3MgZWxlbWVudG9zIGNvbnRyYVx1MDBlZGRvcyBkZSBwcm9kdWN0byBkZSB0cmFiYWpvIHBhcmEgZXN0YSBhY3RpdmlkYWQgZW4gZXN0YSBzZWNjaVx1MDBmM24uDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fTXVsdGlwbGVPY3VycmFuY2U9VmFyaWFzIGFwYXJpY2lvbmVzDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fT3B0aW9uYWw9T3BjaW9uYWwNCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9QbGFubmVkPVBsYW5lYWRvDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3VwcmVzc2VkPVN1cHJpbWlkbw0KLQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0V2ZW50RHJpdmVuPUNvbmRpY2lvbmFkbyBwb3Igc3VjZXNvcw0KLVdvcmtCcmVha2Rvd25FbGVtZW50X09uZ29pbmc9Q29udGludW8NCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9SZXBlYXRhYmxlPVNlIHB1ZWRlIHJlcGV0aXINCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9QcmVkZWNlc3NvcnM9UHJlZGVjZXNvcmVzOg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3k9RGVwZW5kZW5jaWE6DQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfSURfVEVYVD1cdTAwY2RuZGljZQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX1BSRVNFTlRBVElPTl9OQU1FX1RFWFQ9Tm9tYnJlIGRlIHByZXNlbnRhY2lcdTAwZjNuDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfREVQRU5ERU5DWV9URVhUPURlcGVuZGVuY2lhDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9BZGQ9QVx1MDBmMWFkaXINCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0VkaXQ9RWRpdGFyDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9SZW1vdmU9RWxpbWluYXINCi0NCi1Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19TVEFSVD1GaW5hbGl6YWNpXHUwMGYzbiBhIGluaWNpbw0KLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX0ZJTklTSD1GaW5hbGl6YWNpXHUwMGYzbiBhIGZpbmFsaXphY2lcdTAwZjNuDQotV29ya09yZGVyVHlwZV9TVEFSVF9UT19GSU5JU0g9SW5pY2lvIGEgZmluYWxpemFjaVx1MDBmM24NCi1Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX1NUQVJUPUluaWNpbyBhIGluaWNpbw0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N5bmNocm9uaXplZD1TaW5jcm9uaXphZG8gY29uIGVsIG9yaWdlbg0KLQ0KLURlc2NyaXB0b3JfUmVmaW5lZERlc2NyaXB0aW9uPURlc2NyaXBjaVx1MDBmM24gcGVyZmVjY2lvbmFkYToNCi0NCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU9Um9sZXMNCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uRGVzY3JpcHRpb249QXNpZ25lIGxvcyBkZXNjcmlwdG9yZXMgZGUgcm9sZXMgcGFyYSBlZmVjdHVhciBlc3RlIGRlc2NyaXB0b3IgZGUgdGFyZWFzLg0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMT1SZWFsaXphZG9yIHByaW5jaXBhbDoNCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9UmVhbGl6YWRvcmVzIGFkaWNpb25hbGVzOg0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMz1Bc2lzdGlkbyBwb3I6DQotDQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25UaXRsZT1Qcm9kdWN0b3MgZGUgdHJhYmFqbw0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249RXNwZWNpZmlxdWUgbG9zIGRlc2NyaXB0b3JlcyBkZSBwcm9kdWN0b3MgZGUgdHJhYmFqbyBkZSBzYWxpZGEgeSBlbnRyYWRhIHBhcmEgZXN0ZSBkZXNjcmlwdG9yIGRlIHRhcmVhcy4NCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxPUVudHJhZGEgb2JsaWdhdG9yaWE6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMj1FbnRyYWRhIG9wY2lvbmFsOg0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTM9RW50cmFkYSBleHRlcm5hOg0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTQ9U2FsaWRhOg0KLQ0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1NlY3Rpb25UaXRsZT1UYXJlYXMNCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uRGVzY3JpcHRpb249RXN0ZSBkZXNjcmlwdG9yIGRlIHJvbGVzIGVzIGVsIHJlYWxpemFkb3IgZGUgbG9zIHNpZ3VpZW50ZXMgZGVzY3JpcHRvcmVzIGRlIHRhcmVhcy4NCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTE9UmVhbGl6YWRvciBwcmluY2lwYWw6DQotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUyPVJlYWxpemFkb3JlcyBhZGljaW9uYWxlczoNCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTM9QXNpc3RpZG8gcG9yOg0KLQ0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9UHJvZHVjdG9zIGRlIHRyYWJham8NCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvbkRlc2NyaXB0aW9uPUVzdGUgZGVzY3JpcHRvciBkZSByb2xlcyBlcyByZXNwb25zYWJsZSBkZSBsb3Mgc2lndWllbnRlcyBkZXNjcmlwdG9yZXMgZGUgcHJvZHVjdG9zIGRlIHRyYWJham8geSBsb3MgbW9kaWZpY2EuDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1SZXNwb25zYWJsZSBkZToNCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyPU1vZGlmaWNhOg0KLQ0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU9Um9sZXMNCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPUxvcyBzaWd1aWVudGVzIGRlc2NyaXB0b3JlcyBkZSByb2xlcyBzb24gcmVzcG9uc2FibGVzIGRlIGVzdGUgZGVzY3JpcHRvciBkZSBwcm9kdWN0b3MgZGUgdHJhYmFqbyB5IGxvIG1vZGlmaWNhbi4NCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfVGFibGUxPVJlc3BvbnNhYmxlIGRlOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9TW9kaWZpY2FkbyBwb3I6DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1R5cGU9VGlwbzoNCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlPUVzdGFkbyBkZSBlbnRyYWRhIGRlIGFjdGl2aWRhZDoNCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGU9RXN0YWRvIGRlIHNhbGlkYSBkZSBhY3RpdmlkYWQ6DQotDQotV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9TZWN0aW9uVGl0bGU9Q29tcG9uZW50ZXMgZGUgcHJvZHVjdG8gZmluYWwNCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25EZXNjcmlwdGlvbj1FbCBwcm9kdWN0byBmaW5hbCB0aWVuZSBsb3Mgc2lndWllbnRlcyBjb21wb25lbnRlcyBkZSBwcm9kdWN0byBmaW5hbC4NCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1RhYmxlMT1Db21wb25lbnRlcyBkZSBwcm9kdWN0byBmaW5hbA0KLQ0KLVJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvblRpdGxlPUVxdWlwb3MNCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25EZXNjcmlwdGlvbj1Fc3RlIGRlc2NyaXB0b3IgZGUgcm9sZXMgaGFjZSByZWZlcmVuY2lhIGEgbG9zIHNpZ3VpZW50ZXMgZXF1aXBvcy4NCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1RhYmxlMT1FcXVpcG9zOg0KLQ0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uVGl0bGU9Um9sZXMNCi1Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uPUVzdGUgcm9sIGNvbXB1ZXN0byB0aWVuZSBsb3Mgc2lndWllbnRlcyByb2xlcyBhZ3JlZ2Fkb3MuDQotQ29tcG9zaXRlUm9sZV9Sb2xlX1RhYmxlMT1Sb2xlcyBhZ3JlZ2Fkb3M6DQotDQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uVGl0bGU9Um9sZXMNCi1UZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbj1BXHUwMGYxYWRpciBvIGVsaW1pbmFyIHJvbGVzIGEvZGVsIHBlcmZpbCBkZWwgZXF1aXBvLg0KLVRlYW1Qcm9maWxlX1JvbGVfVGFibGUxPVJvbGVzOg0KLQ0KLVByb2Nlc3NfUmljaFRleHRfQ29sbGFwc2VJbWFnZT1jb2xsYXBzZWQuZ2lmDQotUHJvY2Vzc19SaWNoVGV4dF9FeHBhbmRJbWFnZT1leHBhbmRlZC5naWYNCi1Qcm9jZXNzX0FkZD1BXHUwMGYxYWRpci4uLg0KLVByb2Nlc3NfQWRkRnJvbVByb2Nlc3M9QVx1MDBmMWFkaXIgZGVzZGUgZWwgcHJvY2Vzby4uLg0KLVByb2Nlc3NfUmVuYW1lX01lc3NhZ2U9RXN0XHUwMGUxIGEgcHVudG8gZGUgY2FtYmlhciBlbCBub21icmUgZGUgZXN0ZSBwcm9jZXNvLiBFc3RhIG9wZXJhY2lcdTAwZjNuIGd1YXJkYXJcdTAwZTEgZWwgZWRpdG9yIHkgY2FtYmlhclx1MDBlMSBlbCBub21icmUgZGUgbGEgY2FycGV0YSBkZWwgcHJvY2VzbyBwb3IgZWwgbm9tYnJlIG51ZXZvLiBcdTAwYmZEZXNlYSBjb250aW51YXI/DQotUHJvY2Vzc19SZW1vdmU9RWxpbWluYXINCi1Qcm9jZXNzX1VwPUFycmliYQ0KLVByb2Nlc3NfRG93bj1BYmFqbw0KLVByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb249U2VsZWNjaVx1MDBmM24gbVx1MDBmYWx0aXBsZQ0KLVByb2Nlc3NfQnV0dG9uX0xpbmtNZXRob2RFbGVtZW50PUVubGF6YXIgZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8uLi4NCi0NCi0jIyBFcnJvci9XYXJuaW5nDQotUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlPU5vbWJyZSBubyB2XHUwMGUxbGlkbw0KLVByb2Nlc3NfSW52YWxpZE5hbWU9SVVQQTAwODFFOiBFbCBub21icmUgbm8gcHVlZGUgZXN0YXIgdmFjXHUwMGVkby4gRXNwZWNpZmlxdWUgdW4gbm9tYnJlIHZcdTAwZTFsaWRvLg0KLVByb2Nlc3NfUmVuYW1lX1RpdGxlPVJlbm9tYnJhcg0KLVByb2Nlc3NfSW52YWxpZFByZXNlbnRhdGlvbk5hbWU9SVVQQTAwODJFOiBFbCBub21icmUgZGUgcHJlc2VudGFjaVx1MDBmM24gbm8gcHVlZGUgZXN0YXIgdmFjXHUwMGVkby4gRXNwZWNpZmlxdWUgdW4gbm9tYnJlIGRlIHByZXNlbnRhY2lcdTAwZjNuIHZcdTAwZTFsaWRvLg0KLVByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZT1FbmxhemFyIGVsZW1lbnRvIGRlIG1cdTAwZTl0b2RvDQotUHJvY2Vzc19JbnZhbGlkTGlua01ldGhvZEVsZW1lbnQ9SVVQQTAwODNFOiBObyBzZSBwdWVkZSBlbmxhemFyIGNvbiAnJ3swfScnIHBvcnF1ZSBoYXkgb3RybyBkZXNjcmlwdG9yIGRlbCBtaXNtbyBwYWRyZSBxdWUgZXN0XHUwMGUxIHV0aWxpemFuZG8gZXN0ZSBlbGVtZW50byBkZSBtXHUwMGU5dG9kby4NCi1Qcm9jZXNzX0Fzc2lnbm1lbnRJbmZvVGl0bGU9SW5mb3JtYWNpXHUwMGYzbg0KLVByb2Nlc3NfVGVhbUFzc2lnbkVycm9yPUlVUEEwMDg0RTogTm8gc2UgcHVlZGUgYVx1MDBmMWFkaXIgJyd7MH0nJyBhbCBlcXVpcG8gJyd7MX0nJyBcblxuRWwgZGVzY3JpcHRvciBkZSByb2xlcyBkZWJlIHRlbmVyIGVsIHJvbCBkZSBlbGVtZW50byBkZSBtXHUwMGU5dG9kbyBxdWUgdGllbmUgYXNvY2lhZG8gYXNpZ25hZG8gYWwgZXF1aXBvLlxuXG4gQXJyZWdsZSBwcmltZXJvIGxhIGFzb2NpYWNpXHUwMGYzbiB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotUHJvY2Vzc19UZWFtRGlhbG9nTWVzc2FnZT1TZWxlY2Npb25hciBlcXVpcG9zDQotUHJvY2Vzc19UZWFtRGlhbG9nVGl0bGU9RXF1aXBvcw0KLQ0KLVByb2Nlc3NfRGVsaXZlcmFibGVBc3NpZ25FcnJvcj1JVVBBMDA4NUU6IE5vIHNlIHB1ZWRlIGFcdTAwZjFhZGlyICcnezB9JycgYWwgcHJvZHVjdG8gZmluYWwgJyd7MX0nJyBwb3JxdWUgbm8gdGllbmUgdW4gcHJvZHVjdG8gZGUgdHJhYmFqbyBkZSBlbGVtZW50byBkZSBtXHUwMGU5dG9kbyBhc29jaWFkby4NCi1Qcm9jZXNzX0NvbXBvc2l0ZVJvbGVBc3NpZ25FcnJvcj1JVVBBMDA4NkU6IE5vIHNlIHB1ZWRlIGFcdTAwZjFhZGlyICcnezB9JycgYWwgcm9sIGNvbXB1ZXN0byAnJ3sxfScnIHBvcnF1ZSBubyB0aWVuZSB1biByb2wgZGUgZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gYXNvY2lhZG8uDQotUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJNZXNzYWdlPUlVUEEwMDg3VzogRXNwZWNpZmlxdWUgdW4gblx1MDBmYW1lcm8gdlx1MDBlMWxpZG8gcGFyYSBsb3MgcHJlZGVjZXNvcmVzLg0KLVByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyVGl0bGU9SUQgZGUgcHJlZGVjZXNvciBubyB2XHUwMGUxbGlkbw0KLQ0KLVByb2Nlc3NfTm9JdGVtcz1ObyBzZSBoYSBzZWxlY2Npb25hZG8gbmluZ1x1MDBmYW4gZWxlbWVudG8NCi1Qcm9jZXNzX0l0ZW1zU2VsZWN0ZWQ9SGF5IHswfSBlbGVtZW50b3Mgc2VsZWNjaW9uYWRvcw0KLVByb2Nlc3NfTm9Qcm9wZXJ0aWVzQXZhaWxhYmxlPU5vIGhheSBwcm9waWVkYWRlcyBkaXNwb25pYmxlcw0KLQ0KLVByZWRlY2Vzc29yRGlhbG9nX1RpdGxlPURlcGVuZGVuY2lhIGRlbCBwcmVkZWNlc29yDQotUHJlZGVjZXNzb3JEaWFsb2dfSGVhZGVyTWVzc2FnZT1Fc3BlY2lmaXF1ZSB1biB0aXBvIGRlIGRlcGVuZGVuY2lhIHBhcmEgZWwgcHJlZGVjZXNvcjoNCi1QcmVkZWNlc3NvckRpYWxvZ19JbmRleD1cdTAwY2RuZGljZToNCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVzZW50YXRpb25OYW1lPU5vbWJyZSBkZSBwcmVzZW50YWNpXHUwMGYzbjoNCi1QcmVkZWNlc3NvckRpYWxvZ19EZXBlbmRlbmN5PURlcGVuZGVuY2lhOg0KLVByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JEaWFsb2dUaXRsZT1QcmVkZWNlc29yDQotUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvck1lc3NhZ2U9SVVQQTAwODhFOiBZYSBleGlzdGUgdW4gcHJlZGVjZXNvciBjb24gZXNlIElEIHBhcmEgZXN0ZSBlbGVtZW50byBkZSBkZXNnbG9zZSBkZSB0cmFiYWpvLg0KLQ0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc190ZXh0RWRpdENlbGxfcHJvYmxlbV9tc2c9SVVQQTAwOTBFOiBTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgZWRpdGFyIGxhIHByb3BpZWRhZC4NCi1Qcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfY2VsbEVkaXRvcl9pbnZhbGlkUHJlZGNlc3Nvcl9wcm9ibGVtX21zZz1JVVBBMDA4OVc6IExpc3RhIGRlIHByZWRlY2Vzb3JlcyBubyB2XHUwMGUxbGlkYQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2UyMjNmNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uVGl0bGU9SW5mb3JtYXRpb25zIGdcdTAwZTluXHUwMGU5cmFsZXMNCi1Qcm9jZXNzX0RvY3VtZW50SW5mb3JtYXRpb25UaXRsZT1JbmZvcm1hdGlvbnMgc3VyIGxhIGRvY3VtZW50YXRpb24NCi1BY3Rpdml0eV9ndWlkYW5jZUluZm9ybWF0aW9uVGl0bGU9Q29uc2VpbA0KLUJyZWFrZG93bkVsZW1lbnRfb3B0aW9uSW5mb3JtYXRpb25UaXRsZT1PcHRpb25zIGRlIHJcdTAwZTlwYXJ0aXRpb24NCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25UaXRsZT1FdGFwZXMNCi0NCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1TcFx1MDBlOWNpZmlleiBsZXMgXHUwMGU5dGFwZXMgXHUwMGUwIHN1aXZyZSBwb3VyIGxhbmNlciBjZSBkZXNjcmlwdGV1ciBkZSB0XHUwMGUyY2hlLg0KLQ0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGdcdTAwZTluXHUwMGU5cmFsZXMgXHUwMGUwIHByb3BvcyBkZSBjZSB7MH0uDQotUHJvY2Vzc19kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIGRvY3VtZW50YXRpb24gXHUwMGUwIHByb3BvcyBkZSBjZSB7MH0uDQotDQotRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNlIGRlc2NyaXB0ZXVyLg0KLURlc2NyaXB0b3JfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZFx1MDBlOXRhaWxsXHUwMGU5ZXMgXHUwMGUwIHByb3BvcyBkZSBjZSBkZXNjcmlwdGV1ci4NCi1NaWxlc3RvbmVfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGdcdTAwZTluXHUwMGU5cmFsZXMgXHUwMGUwIHByb3BvcyBkZSBjZSBqYWxvbi4NCi1NaWxlc3RvbmVfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZFx1MDBlOXRhaWxsXHUwMGU5ZXMgXHUwMGUwIHByb3BvcyBkZSBjZSBqYWxvbi4NCi0NCi1CcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0IFx1MDBlOWxcdTAwZTltZW50IGRlIHJcdTAwZTlwYXJ0aXRpb24uDQotV29ya0JyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGdcdTAwZTluXHUwMGU5cmFsZXMgXHUwMGUwIHByb3BvcyBkZSBjZXQgXHUwMGU5bFx1MDBlOW1lbnQgZGUgclx1MDBlOXBhcnRpdGlvbiBkdSB0cmF2YWlsLg0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRvbj1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZ1x1MDBlOW5cdTAwZTlyYWxlcyBcdTAwZTAgcHJvcG9zIGRlIGNlIGRlc2NyaXB0ZXVyLg0KLUFjdGl2aXR5X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUZvdXJuaXNzZXogZGVzIGluZm9ybWF0aW9ucyBnXHUwMGU5blx1MDBlOXJhbGVzIFx1MDBlMCBwcm9wb3MgZGUgY2V0dGUgYWN0aXZpdFx1MDBlOS4NCi0NCi1CcmVha2Rvd25FbGVtZW50X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZGUgZG9jdW1lbnRhdGlvbiBcdTAwZTAgcHJvcG9zIGRlIGNldCBcdTAwZTlsXHUwMGU5bWVudCBkZSByXHUwMGU5cGFydGl0aW9uLg0KLUFjdGl2aXR5X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3Vybmlzc2V6IGRlcyBpbmZvcm1hdGlvbnMgZGUgZG9jdW1lbnRhdGlvbiBcdTAwZTAgcHJvcG9zIGRlIGNldHRlIGFjdGl2aXRcdTAwZTkuDQotRGVzY3JpcHRvcl9kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249Rm91cm5pc3NleiBkZXMgaW5mb3JtYXRpb25zIGRlIGRvY3VtZW50YXRpb24gXHUwMGUwIHByb3BvcyBkZSBjZSBkZXNjcmlwdGV1ci4NCi1Qcm9jZXNzX05vbmU9PDwgTkVBTlQgPj4NCi1Qcm9jZXNzX25hbWU9Tm9tIDoNCi1Qcm9jZXNzX1ByZXNlbnRhdGlvbk5hbWU9Tm9tIGRlIHByXHUwMGU5c2VudGF0aW9uIDoNCi1Qcm9jZXNzX2JyaWVmRGVzY3JpcHRpb249RGVzY3JpcHRpZiBjb3VydCA6DQotUHJvY2Vzc19tYWluRGVzY3JpcHRpb249IERlc2NyaXB0aWYgcHJpbmNpcGFsIDoNCi1Qcm9jZXNzX3B1cnBvc2U9T2JqZXQgOg0KLVByb2Nlc3NfcHJlZml4PVByXHUwMGU5Zml4ZSA6DQotDQotQnJlYWtkb3duRWxlbWVudF9UeXBlX05hbWU9RWxcdTAwZTltZW50IGRlIHJcdTAwZTlwYXJ0aXRpb24NCi0NCi1Qcm9jZXNzX1R5cGVfVGFzaz1UXHUwMGUyY2hlIGRlIG1cdTAwZTl0aG9kZSA6DQotUHJvY2Vzc19UeXBlX1JvbGU9Ulx1MDBmNGxlIGRlIG1cdTAwZTl0aG9kZSA6DQotUHJvY2Vzc19UeXBlX1dvcmtQcm9kdWN0PVByb2R1aXQgZGUgbVx1MDBlOXRob2RlIDoNCi0NCi1Xb3JrUHJvZHVjdF9UeXBlPVR5cGUgZGUgcHJvZHVpdCA6DQotDQotQWN0aXZpdHlfTW9kZWxJbmZvPUluZm9ybWF0aW9ucyByZWxhdGl2ZXMgYXUgbW9kXHUwMGU4bGUgOg0KLUFjdGl2aXR5X1R5cGU9VHlwZSBkJ2FjdGl2aXRcdTAwZTkgOg0KLUFjdGl2aXR5X3ByZXNlbnRhdGlvbk5hbWU9Tm9tIGRlIHByXHUwMGU5c2VudGF0aW9uIDoNCi1BY3Rpdml0eV9hbHRlcm5hdGl2ZXM9QWx0ZXJuYXRpdmVzIDoNCi1BY3Rpdml0eV9ob3dUb1N0YWZmPURvdGF0aW9uIGVuIHBlcnNvbm5lbCA6DQotQnJlYWtkb3duRWxlbWVudF9rZXlDb25zaWRlcmF0aW9ucz1Db25zaWRcdTAwZTlyYXRpb25zIGNsXHUwMGU5cyA6DQotUHJvY2Vzc191c2FnZUd1aWRhbmNlPUluc3RydWN0aW9ucyBkJ3V0aWxpc2F0aW9uIDoNCi0NCi1BY3Rpdml0eV9Sb2FkbWFwVGl0bGU9Q2FsZW5kcmllcnMNCi1BY3Rpdml0eV9Sb2FkbWFwRGVzY3JpcHRpb249Rm91cm5pdCBkZXMgbGllbnMgdmVycyBkZXMgaW5mb3JtYXRpb25zIGNvbXBsXHUwMGU5bWVudGFpcmVzIHNvdXMgbGEgZm9ybWUgZGUgZmV1aWxsZXMgZGUgcm91dGUuDQotQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlVGl0bGU9Q29uc2VpbHMgZ1x1MDBlOW5cdTAwZTlyYXV4DQotQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlRGVzY3JpcHRpb249Rm91cm5pdCBkZXMgbGllbnMgdmVycyBkZXMgaW5mb3JtYXRpb25zIGNvbXBsXHUwMGU5bWVudGFpcmVzIHNvdXMgbGEgZm9ybWUgZGUgY29uc2VpbHMuDQotQWN0aXZpdHlfQ29tbXVuaWNhdGlvbk1hdGVyaWFsVGl0bGU9RG9jdW1lbnRzIGRlIGNvbW11bmljYXRpb24NCi1BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbj1Gb3Vybml0IGRlcyBsaWVucyB2ZXJzIGRlcyBpbmZvcm1hdGlvbnMgY29tcGxcdTAwZTltZW50YWlyZXMgc291cyBsYSBmb3JtZSBkZSBkb2N1bWVudHMgZGUgY29tbXVuaWNhdGlvbi4NCi1BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbFRpdGxlPURvY3VtZW50cyBkZSBmb3JtYXRpb24NCi1BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uPUZvdXJuaXQgZGVzIGxpZW5zIHZlcnMgZGVzIGluZm9ybWF0aW9ucyBjb21wbFx1MDBlOW1lbnRhaXJlcyBzb3VzIGxhIGZvcm1lIGRlIGRvY3VtZW50cyBkZSBmb3JtYXRpb24uDQotDQotQWN0aXZpdHlfU2VsZWN0ZWRfUm9hZG1hcD1GZXVpbGxlcyBkZSByb3V0ZSA6DQotQWN0aXZpdHlfU2VsZWN0ZWRfR2VuZXJhbEd1aWRhbmNlPUNvbnNlaWwgOg0KLUFjdGl2aXR5X1NlbGVjdGVkX0NvbW11bmljYXRpb25NYXRlcmlhbD1Eb2N1bWVudHMgZGUgY29tbXVuaWNhdGlvbiA6DQotQWN0aXZpdHlfU2VsZWN0ZWRfRWR1Y2F0aW9uTWF0ZXJpYWw9RG9jdW1lbnRzIGRlIGZvcm1hdGlvbiA6DQotDQotQWN0aXZpdHlfRGlhZ3JhbVRpdGxlPURpYWdyYW1tZQ0KLUFjdGl2aXR5X0RpYWdyYW1EZXNjcmlwdGlvbiA9IEZvdXJuaXNzZXogZGVzIGltYWdlcyBkZSBkaWFncmFtbWVzIHBvdXIgY2UgezB9Lg0KLUFjdGl2aXR5X0FESW1hZ2U9RGlhZ3JhbW1lIGQnYWN0aXZpdFx1MDBlOQ0KLUFjdGl2aXR5X0FEREltYWdlPURpYWdyYW1tZSBkXHUwMGU5dGFpbGxcdTAwZTkgZCdhY3Rpdml0XHUwMGU5DQotQWN0aXZpdHlfV1BESW1hZ2U9RGlhZ3JhbW1lIGRlIGRcdTAwZTlwZW5kYW5jZSBkZSBwcm9kdWl0DQotQWN0aXZpdHlfVXNlQURJbWFnZT1VdGlsaXNlciBsZSBkaWFncmFtbWUgZCdhY3Rpdml0XHUwMGU5IHBvdXIgbGEgcHVibGljYXRpb24NCi1BY3Rpdml0eV9Vc2VBRERJbWFnZT1VdGlsaXNlciBsZSBkaWFncmFtbWUgZFx1MDBlOXRhaWxsXHUwMGU5IGQnYWN0aXZpdFx1MDBlOSBwb3VyIGxhIHB1YmxpY2F0aW9uDQotQWN0aXZpdHlfVXNlV1BESW1hZ2U9VXRpbGlzZXIgbGUgZGlhZ3JhbW1lIGRlIGRcdTAwZTlwZW5kYW5jZSBkZSBwcm9kdWl0IHBvdXIgbGEgcHVibGljYXRpb24NCi1BY3Rpdml0eV9Bc3NpZ249QXR0cmlidWVyLi4uDQotDQotVGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRfU3RlcHM9RXRhcGVzIDoNCi1UYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nVGl0bGU9RXRhcGVzDQotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ01lc3NhZ2U9U1x1MDBlOWxlY3Rpb25uZXIgbGVzIFx1MDBlOXRhcGVzDQotDQotQWN0aXZpdHlfV29ya1JvbGx1cD1DdW11bCBkZSB0cmF2YWlsDQotQWN0aXZpdHlfVGVhbVJvbGx1cD1DdW11bCBkZSBsJ1x1MDBlOXF1aXBlDQotQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwPUN1bXVsIGRlIHByb2R1aXRzDQotQWN0aXZpdHlfV29ya1JvbGx1cERlc2NyaXB0aW9uPVJcdTAwZTl2aXNleiBsZSBjdW11bCBkZSB0cmF2YWlsIHBvdXIgY2V0dGUgYWN0aXZpdFx1MDBlOSBkYW5zIGNldHRlIHNlY3Rpb24uDQotQWN0aXZpdHlfVGVhbVJvbGx1cERlc2NyaXB0aW9uPVJcdTAwZTl2aXNleiBsZSBjdW11bCBkJ1x1MDBlOXF1aXBlIHBvdXIgY2V0dGUgYWN0aXZpdFx1MDBlOSBkYW5zIGNldHRlIHNlY3Rpb24uDQotQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwRGVzY3JpcHRpb249Ulx1MDBlOXZpc2V6IGxlIGN1bXVsIGRlIHByb2R1aXQgcG91ciBjZXR0ZSBhY3Rpdml0XHUwMGU5IGRhbnMgY2V0dGUgc2VjdGlvbi4NCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9NdWx0aXBsZU9jdXJyYW5jZT1QbHVzaWV1cnMgb2NjdXJyZW5jZXMNCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9PcHRpb25hbD1GYWN1bHRhdGlmDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fUGxhbm5lZD1QbGFuaWZpXHUwMGU5DQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3VwcmVzc2VkPVN1cHByaW1cdTAwZTkNCi0NCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9FdmVudERyaXZlbj1Db21tYW5kXHUwMGU5IHBhciBsZXMgXHUwMGU5dlx1MDBlOW5lbWVudHMNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9PbmdvaW5nPUVuIGNvdXJzDQotV29ya0JyZWFrZG93bkVsZW1lbnRfUmVwZWF0YWJsZT1SXHUwMGU5aXRcdTAwZTlyYWJsZQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29ycz1Qclx1MDBlOWRcdTAwZTljZXNzZXVycyA6DQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeT1EXHUwMGU5cGVuZGFuY2UgOg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0lEX1RFWFQ9SW5kZXgNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9QUkVTRU5UQVRJT05fTkFNRV9URVhUPU5vbSBkZSBwclx1MDBlOXNlbnRhdGlvbg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0RFUEVOREVOQ1lfVEVYVD1EXHUwMGU5cGVuZGFuY2UNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0FkZD1Bam91dGVyDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9FZGl0PU1vZGlmaWVyDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9SZW1vdmU9U3VwcHJpbWVyDQotDQotV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fU1RBUlQ9RmluIGF1IERcdTAwZTlidXQNCi1Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19GSU5JU0g9RmluIFx1MDBlMCBGaW4NCi1Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX0ZJTklTSD1EXHUwMGU5YnV0IFx1MDBlMCBGaW4NCi1Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX1NUQVJUPURcdTAwZTlidXQgYXUgZFx1MDBlOWJ1dA0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N5bmNocm9uaXplZD1TeW5jaHJvbmlzXHUwMGU5IGF2ZWMgbGEgc291cmNlDQotDQotRGVzY3JpcHRvcl9SZWZpbmVkRGVzY3JpcHRpb249RGVzY3JpcHRpZiBkXHUwMGU5dGFpbGxcdTAwZTkgOg0KLQ0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1SXHUwMGY0bGVzDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPUFmZmVjdGV6IGxlcyBkZXNjcmlwdGV1cnMgZGUgclx1MDBmNGxlIHBvdXIgbGFuY2VyIGNlIGRlc2NyaXB0ZXVyIGRlIHRcdTAwZTJjaGUuDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUxPUV4XHUwMGU5Y3V0YW50IHByaW5jaXBhbCA6DQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUyPUV4XHUwMGU5Y3V0YW50cyBzdXBwbFx1MDBlOW1lbnRhaXJlcyA6DQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUzPUFpZFx1MDBlOSBwYXIgOg0KLQ0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9UHJvZHVpdHMNCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvbkRlc2NyaXB0aW9uPVNwXHUwMGU5Y2lmaWV6IGxlcyBkZXNjcmlwdGV1cnMgZGUgcHJvZHVpdCBkJ2VudHJcdTAwZTllIGV0IGRlIHNvcnRpZSBwb3VyIGNlIGRlc2NyaXB0ZXVyIGRlIHRcdTAwZTJjaGUuDQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1FbnRyXHUwMGU5ZSBvYmxpZ2F0b2lyZSA6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMj1FbnRyXHUwMGU5ZSBmYWN1bHRhdGl2ZSA6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMz1FbnRyXHUwMGU5ZSBleHRlcm5lIDoNCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGU0PVNvcnRpZSA6DQotDQotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvblRpdGxlPVRcdTAwZTJjaGVzDQotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPUNlIGRlc2NyaXB0ZXVyIGRlIHJcdTAwZjRsZSBlc3QgbCdleFx1MDBlOWN1dGFudCBkZXMgZGVzY3JpcHRldXJzIGRlIHRcdTAwZTJjaGUgc3VpdmFudHMuDQotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUxPUV4XHUwMGU5Y3V0YW50IHByaW5jaXBhbCA6DQotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUyPUV4XHUwMGU5Y3V0YW50cyBzdXBwbFx1MDBlOW1lbnRhaXJlcyA6DQotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUzPUFpZFx1MDBlOSBwYXIgOg0KLQ0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9UHJvZHVpdHMNCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvbkRlc2NyaXB0aW9uPUNlIGRlc2NyaXB0ZXVyIGRlIHJcdTAwZjRsZSBlc3QgcmVzcG9uc2FibGUgZGVzIGRlc2NyaXB0ZXVycyBkZSBwcm9kdWl0IHN1aXZhbnRzIGV0IGxlcyBtb2RpZmllLg0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTE9UmVzcG9uc2FibGUgZGUgOg0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI9TW9kaWZpZSA6DQotDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1SXHUwMGY0bGVzDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25EZXNjcmlwdGlvbj1MZXMgZGVzY3JpcHRldXJzIGRlIHJcdTAwZjRsZSBzdWl2YW50cyBzb250IHJlc3BvbnNhYmxlcyBkZSBkZSBjZSBkZXNjcmlwdGV1ciBkZSBwcm9kdWl0IGV0IGxlIG1vZGlmaWVudC4NCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfVGFibGUxPVJlc3BvbnNhYmxlIGRlIDoNCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfVGFibGUyPU1vZGlmaVx1MDBlOSBwYXIgOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9UeXBlPVR5cGUgOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGU9RXRhdCBkJ2VudHJcdTAwZTllIGRlIGwnYWN0aXZpdFx1MDBlOSA6DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlPUV0YXQgZGUgc29ydGllIGRlIGwnYWN0aXZpdFx1MDBlOSA6DQotDQotV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9TZWN0aW9uVGl0bGU9Q29tcG9zYW50cyBsaXZyYWJsZXMNCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25EZXNjcmlwdGlvbj1MZSBsaXZyYWJsZSBjb250aWVudCBsZXMgY29tcG9zYW50cyBsaXZyYWJsZXMgc3VpdmFudHMuDQotV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9UYWJsZTE9Q29tcG9zYW50cyBsaXZyYWJsZXMNCi0NCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25UaXRsZT1FcXVpcGVzDQotUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uRGVzY3JpcHRpb249Q2UgZGVzY3JpcHRldXIgZGUgclx1MDBmNGxlIGZhaXQgclx1MDBlOWZcdTAwZTlyZW5jZSBhdXggXHUwMGU5cXVpcGVzIHN1aXZhbnRlcy4NCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1RhYmxlMT1FcXVpcGVzIDoNCi0NCi1Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvblRpdGxlPVJcdTAwZjRsZXMNCi1Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uPUNlIHJcdTAwZjRsZSBjb21wb3NpdGUgY29udGllbnQgbGVzIHJcdTAwZjRsZXMgYWdyXHUwMGU5Z1x1MDBlOXMgc3VpdmFudHMuDQotQ29tcG9zaXRlUm9sZV9Sb2xlX1RhYmxlMT1SXHUwMGY0bGVzIGFnclx1MDBlOWdcdTAwZTlzIDoNCi0NCi1UZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25UaXRsZT1SXHUwMGY0bGVzDQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb249QWpvdXRleiBvdSBzdXBwcmltZXogZGVzIHJcdTAwZjRsZXMgZGFucyBsZSBwcm9maWwgZCdcdTAwZTlxdWlwZS4NCi1UZWFtUHJvZmlsZV9Sb2xlX1RhYmxlMT1SXHUwMGY0bGVzIDoNCi0NCi1Qcm9jZXNzX1JpY2hUZXh0X0NvbGxhcHNlSW1hZ2U9Y29sbGFwc2VkLmdpZg0KLVByb2Nlc3NfUmljaFRleHRfRXhwYW5kSW1hZ2U9ZXhwYW5kZWQuZ2lmDQotUHJvY2Vzc19BZGQ9QWpvdXRlci4uLg0KLVByb2Nlc3NfQWRkRnJvbVByb2Nlc3M9RWZmZWN0dWVyIHVuIGFqb3V0IGRlcHVpcyBsZSBwcm9jZXNzdXMuLi4NCi1Qcm9jZXNzX1JlbmFtZV9NZXNzYWdlPVZvdXMgXHUwMGVhdGVzIHN1ciBsZSBwb2ludCBkZSBjaGFuZ2VyIGxlIG5vbSBkZSBjZSBwcm9jZXNzdXMuIENldHRlIG9wXHUwMGU5cmF0aW9uIGVucmVnaXN0cmVyYSBjZXQgXHUwMGU5ZGl0ZXVyIGV0IHJlbm9tbWVyYSBsZSBkb3NzaWVyIGR1IHByb2Nlc3N1cy4gVm91bGV6LXZvdXMgY29udGludWVyID8NCi1Qcm9jZXNzX1JlbW92ZT1TdXBwcmltZXINCi1Qcm9jZXNzX1VwPUhhdXQNCi1Qcm9jZXNzX0Rvd249QmFzDQotUHJvY2Vzc19NdWx0aXBsZVNlbGVjdGlvbj1TXHUwMGU5bGVjdGlvbiBtdWx0aXBsZQ0KLVByb2Nlc3NfQnV0dG9uX0xpbmtNZXRob2RFbGVtZW50PUxpZXIgbCdcdTAwZTlsXHUwMGU5bWVudCBkZSBtXHUwMGU5dGhvZGUuLi4NCi0NCi0jIyBFcnJvci9XYXJuaW5nDQotUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlPU5vbSBub24gdmFsaWRlDQotUHJvY2Vzc19JbnZhbGlkTmFtZT1JVVBBMDA4MUUgOiBMZSBub20gbmUgcGV1dCBwYXMgXHUwMGVhdHJlIHZpZGUuIEluZGlxdWV6IHVuIG5vbSB2YWxpZGUuDQotUHJvY2Vzc19SZW5hbWVfVGl0bGU9UmVub21tZXINCi1Qcm9jZXNzX0ludmFsaWRQcmVzZW50YXRpb25OYW1lPUlVUEEwMDgyRSA6IExlIG5vbSBkZSBwclx1MDBlOXNlbnRhdGlvbiBuZSBwZXV0IHBhcyBcdTAwZWF0cmUgdmlkZS4gSW5kaXF1ZXogdW4gbm9tIGRlIHByXHUwMGU5c2VudGF0aW9uIHZhbGlkZS4NCi1Qcm9jZXNzX0xpbmtNZXRob2RFbGVtZW50VGl0bGU9TGllciBsJ1x1MDBlOWxcdTAwZTltZW50IGRlIG1cdTAwZTl0aG9kZQ0KLVByb2Nlc3NfSW52YWxpZExpbmtNZXRob2RFbGVtZW50PUlVUEEwMDgzRSA6IEltcG9zc2libGUgZCcnXHUwMGU5dGFibGlyIHVuIGxpZW4gdmVycyAnJ3swfScnIGNhciBjZXQgXHUwMGU5bFx1MDBlOW1lbnQgZGUgbVx1MDBlOXRob2RlIGVzdCBkXHUwMGU5alx1MDBlMCBlbiBjb3VycyBkJyd1dGlsaXNhdGlvbiBwb3VyIHVuIGF1dHJlIGRlc2NyaXB0ZXVyIGR1IG1cdTAwZWFtZSBwYXJlbnQuDQotUHJvY2Vzc19Bc3NpZ25tZW50SW5mb1RpdGxlPUluZm9ybWF0aW9ucw0KLVByb2Nlc3NfVGVhbUFzc2lnbkVycm9yPUlVUEEwMDg0RSA6IEltcG9zc2libGUgZCcnYWpvdXRlciAnJ3swfScnIFx1MDBlMCBsJydcdTAwZTlxdWlwZSAnJ3sxfScnIFxuXG5MZShzKSBkZXNjcmlwdGV1cihzKSBkZSByXHUwMGY0bGUgZG9pdmVudCBhdm9pciBkZXMgclx1MDBmNGxlcyBkJydcdTAwZTlsXHUwMGU5bWVudHMgZGUgbVx1MDBlOXRob2RlIGFzc29jaVx1MDBlOXMgcG91ciBcdTAwZWF0cmUgYWZmZWN0XHUwMGU5cyBcdTAwZTAgdW5lIFx1MDBlOXF1aXBlLlxuXG4gQ29ycmlnZXogZCcnYWJvcmQgbCcnYXNzb2NpYXRpb24sIHB1aXMgclx1MDBlOWVzc2F5ZXouDQotUHJvY2Vzc19UZWFtRGlhbG9nTWVzc2FnZT1TXHUwMGU5bGVjdGlvbm5leiBsZXMgXHUwMGU5cXVpcGVzDQotUHJvY2Vzc19UZWFtRGlhbG9nVGl0bGU9RXF1aXBlcw0KLQ0KLVByb2Nlc3NfRGVsaXZlcmFibGVBc3NpZ25FcnJvcj1JVVBBMDA4NUUgOiBJbXBvc3NpYmxlIGQnJ2Fqb3V0ZXIgJyd7MH0nJyBhdSBsaXZyYWJsZSAnJ3sxfScnIGNhciBpbCBuZSBjb250aWVudCBhdWN1biBwcm9kdWl0IGQnJ1x1MDBlOWxcdTAwZTltZW50IGRlIG1cdTAwZTl0aG9kZSBhc3NvY2lcdTAwZTkuDQotUHJvY2Vzc19Db21wb3NpdGVSb2xlQXNzaWduRXJyb3I9SVVQQTAwODZFOiBJbXBvc3NpYmxlIGQnJ2Fqb3V0ZXIgJyd7MH0nJyBhdSByXHUwMGY0bGUgY29tcG9zaXRlICcnezF9JycgY2FyIGlsIG5lIGNvbnRpZW50IGF1Y3VuIHJcdTAwZjRsZSBkJydcdTAwZTlsXHUwMGU5bWVudCBkZSBtXHUwMGU5dGhvZGUgYXNzb2NpXHUwMGU5Lg0KLVByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyTWVzc2FnZT1JVVBBMDA4N1cgOiBTYWlzaXNzZXogdW4gbnVtXHUwMGU5cm8gdmFsaWRlIHBvdXIgbGVzIHByXHUwMGU5ZFx1MDBlOWNlc3NldXJzLg0KLVByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyVGl0bGU9SWRlbnRpZmljYXRldXIgZHUgcHJcdTAwZTlkXHUwMGU5Y2Vzc2V1ciBub24gdmFsaWRlDQotDQotUHJvY2Vzc19Ob0l0ZW1zPUF1Y3VuIFx1MDBlOWxcdTAwZTltZW50IHNcdTAwZTlsZWN0aW9ublx1MDBlOQ0KLVByb2Nlc3NfSXRlbXNTZWxlY3RlZD17MH0gXHUwMGU5bFx1MDBlOW1lbnRzIHNcdTAwZTlsZWN0aW9ublx1MDBlOXMNCi1Qcm9jZXNzX05vUHJvcGVydGllc0F2YWlsYWJsZT1BdWN1bmUgcHJvcHJpXHUwMGU5dFx1MDBlOSBkaXNwb25pYmxlDQotDQotUHJlZGVjZXNzb3JEaWFsb2dfVGl0bGU9RFx1MDBlOXBlbmRhbmNlIGRlIHByXHUwMGU5ZFx1MDBlOWNlc3NldXINCi1QcmVkZWNlc3NvckRpYWxvZ19IZWFkZXJNZXNzYWdlPVNhaXNpc3NleiBsZSB0eXBlIGRlIGRcdTAwZTlwZW5kYW5jZSBwb3VyIGxlIHByXHUwMGU5ZFx1MDBlOWNlc3NldXIgOg0KLVByZWRlY2Vzc29yRGlhbG9nX0luZGV4PUluZGV4IDoNCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVzZW50YXRpb25OYW1lPU5vbSBkZSBwclx1MDBlOXNlbnRhdGlvbiA6DQotUHJlZGVjZXNzb3JEaWFsb2dfRGVwZW5kZW5jeT1EXHUwMGU5cGVuZGFuY2UgOg0KLVByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JEaWFsb2dUaXRsZT1Qclx1MDBlOWRcdTAwZTljZXNzZXVyDQotUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvck1lc3NhZ2U9SVVQQTAwODhFIDogTGUgcHJcdTAwZTlkXHUwMGU5Y2Vzc2V1ciBjb250ZW5hbnQgY2V0IGlkZW50aWZpY2F0ZXVyIGV4aXN0ZSBkXHUwMGU5alx1MDBlMCBwb3VyIGNldCBcdTAwZTlsXHUwMGU5bWVudCBkZSByXHUwMGU5cGFydGl0aW9uIGR1IHRyYXZhaWwuDQotDQotUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX3RleHRFZGl0Q2VsbF9wcm9ibGVtX21zZz1JVVBBMDA5MEUgOiBVbmUgZXJyZXVyIHMnZXN0IHByb2R1aXRlIGxvcnMgZGUgbGEgbW9kaWZpY2F0aW9uIGQndW5lIHByb3ByaVx1MDBlOXRcdTAwZTkuDQotUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX2NlbGxFZGl0b3JfaW52YWxpZFByZWRjZXNzb3JfcHJvYmxlbV9tc2c9SVVQQTAwODlXIDogTGlzdGUgZGUgcHJcdTAwZTlkXHUwMGU5Y2Vzc2V1cnMgbm9uIHZhbGlkZQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfaXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2NmOGI1YS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uVGl0bGU9SW5mb3JtYXppb25pIGdlbmVyYWxpDQotUHJvY2Vzc19Eb2N1bWVudEluZm9ybWF0aW9uVGl0bGU9SW5mb3JtYXppb25pIHN1bGxhIGRvY3VtZW50YXppb25lDQotQWN0aXZpdHlfZ3VpZGFuY2VJbmZvcm1hdGlvblRpdGxlPUd1aWRhDQotQnJlYWtkb3duRWxlbWVudF9vcHRpb25JbmZvcm1hdGlvblRpdGxlPU9wemlvbmkgZGkgc3VkZGl2aXNpb25lDQotVGFza0Rlc2NyaXB0b3Jfc3RlcEluZm9ybWF0aW9uVGl0bGU9UGFzc2kNCi0NCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1TcGVjaWZpY2FyZSBpIHBhc3NpIHBlciBlc2VndWlyZSBxdWVzdG8gZGVzY3JpdHRvcmUgZGkgb3BlcmF6aW9uZS4NCi0NCi1Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0byB7MH0uDQotUHJvY2Vzc19kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgZG9jdW1lbnRhemlvbmUgcGVyIHF1ZXN0byB7MH0uDQotDQotRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3JuaXJlIGluZm9ybWF6aW9uaSBnZW5lcmFsaSBzdSBxdWVzdG8gZGVzY3JpdHRvcmUuDQotRGVzY3JpcHRvcl9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUZvcm5pcmUgaW5mb3JtYXppb25pIGRldHRhZ2xpYXRlIHN1IHF1ZXN0byBkZXNjcml0dG9yZS4NCi1NaWxlc3RvbmVfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249Rm9ybmlyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3UgcXVlc3RvIG1pbGVzdG9uZS4NCi1NaWxlc3RvbmVfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3JuaXJlIGluZm9ybWF6aW9uaSBkZXR0YWdsaWF0ZSBzdSBxdWVzdG8gbWlsZXN0b25lLg0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249Rm9ybmlyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3UgcXVlc3RvIGVsZW1lbnRvIGRlbGxhIHN1ZGRpdmlzaW9uZS4NCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3JuaXJlIGluZm9ybWF6aW9uaSBnZW5lcmFsaSBzdSBxdWVzdG8gZWxlbWVudG8gZGVsbGEgc3VkZGl2aXNpb25lIGRlbCBsYXZvcm8uDQotRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdG9uPUZvcm5pcmUgaW5mb3JtYXppb25pIGdlbmVyYWxpIHN1IHF1ZXN0byBkZXNjcml0dG9yZS4NCi1BY3Rpdml0eV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3JuaXJlIGluZm9ybWF6aW9uaSBnZW5lcmFsaSBzdSBxdWVzdGEgYXR0aXZpdFx1MDBlMC4NCi0NCi1CcmVha2Rvd25FbGVtZW50X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3JuaXJlIGluZm9ybWF6aW9uaSBzdWxsYSBkb2N1bWVudGF6aW9uZSBwZXIgcXVlc3RvIGVsZW1lbnRvIGRlbGxhIHN1ZGRpdmlzaW9uZS4NCi1BY3Rpdml0eV9Eb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249Rm9ybmlyZSBpbmZvcm1hemlvbmkgc3VsbGEgZG9jdW1lbnRhemlvbmUgcGVyIHF1ZXN0YSBhdHRpdml0XHUwMGUwLg0KLURlc2NyaXB0b3JfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUZvcm5pcmUgaW5mb3JtYXppb25pIHN1bGxhIGRvY3VtZW50YXppb25lIHBlciBxdWVzdG8gZGVzY3JpdHRvcmUuDQotUHJvY2Vzc19Ob25lPTw8IE5FU1NVTk8gPj4NCi1Qcm9jZXNzX25hbWU9Tm9tZToNCi1Qcm9jZXNzX1ByZXNlbnRhdGlvbk5hbWU9Tm9tZSBwcmVzZW50YXppb25lOg0KLVByb2Nlc3NfYnJpZWZEZXNjcmlwdGlvbj1CcmV2ZSBkZXNjcml6aW9uZToNCi1Qcm9jZXNzX21haW5EZXNjcmlwdGlvbj0gRGVzY3JpemlvbmUgcHJpbmNpcGFsZToNCi1Qcm9jZXNzX3B1cnBvc2U9U2NvcG86DQotUHJvY2Vzc19wcmVmaXg9UHJlZmlzc286DQotDQotQnJlYWtkb3duRWxlbWVudF9UeXBlX05hbWU9RWxlbWVudG8gZGVsbGEgc3VkZGl2aXNpb25lDQotDQotUHJvY2Vzc19UeXBlX1Rhc2s9T3BlcmF6aW9uZSBtZXRvZG86DQotUHJvY2Vzc19UeXBlX1JvbGU9UnVvbG8gbWV0b2RvOg0KLVByb2Nlc3NfVHlwZV9Xb3JrUHJvZHVjdD1Qcm9kb3R0byBkaSBsYXZvcm8gbWV0b2RvOg0KLQ0KLVdvcmtQcm9kdWN0X1R5cGU9VGlwbyBkaSBwcm9kb3R0byBkaSBsYXZvcm86DQotDQotQWN0aXZpdHlfTW9kZWxJbmZvPUluZm9ybWF6aW9uaSBtb2RlbGxvOg0KLUFjdGl2aXR5X1R5cGU9VGlwbyBhdHRpdml0XHUwMGUwOg0KLUFjdGl2aXR5X3ByZXNlbnRhdGlvbk5hbWU9Tm9tZSBwcmVzZW50YXppb25lOg0KLUFjdGl2aXR5X2FsdGVybmF0aXZlcz1BbHRlcm5hdGl2ZToNCi1BY3Rpdml0eV9ob3dUb1N0YWZmPURlZmluaXppb25lIGRlbCBwZXJzb25hbGU6DQotQnJlYWtkb3duRWxlbWVudF9rZXlDb25zaWRlcmF0aW9ucz1Db25zaWRlcmF6aW9uaSBjaGlhdmU6DQotUHJvY2Vzc191c2FnZUd1aWRhbmNlPUd1aWRhIGFsbCd1c286DQotDQotQWN0aXZpdHlfUm9hZG1hcFRpdGxlPVJvYWRtYXANCi1BY3Rpdml0eV9Sb2FkbWFwRGVzY3JpcHRpb249Rm9ybmlyZSBjb2xsZWdhbWVudGkgYSBpbmZvcm1hemlvbmkgYWdnaXVudGl2ZSBzb3R0byBmb3JtYSBkaSByb2FkbWFwLg0KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZVRpdGxlPUd1aWRhIGdlbmVyYWxlDQotQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlRGVzY3JpcHRpb249Rm9ybmlyZSBjb2xsZWdhbWVudGkgYSBpbmZvcm1hemlvbmkgYWdnaXVudGl2ZSBzb3R0byBmb3JtYSBkaSBndWlkYS4NCi1BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxUaXRsZT1NYXRlcmlhbGUgcGVyIGxhIGNvbXVuaWNhemlvbmUNCi1BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbj1Gb3JuaXJlIGNvbGxlZ2FtZW50aSBhIGluZm9ybWF6aW9uaSBhZ2dpdW50aXZlIHNvdHRvIGZvcm1hIGRpIG1hdGVyaWFsZSBwZXIgbGEgY29tdW5pY2F6aW9uZS4NCi1BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbFRpdGxlPU1hdGVyaWFsZSBkaWRhdHRpY28NCi1BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uPUZvcm5pcmUgY29sbGVnYW1lbnRpIGEgaW5mb3JtYXppb25pIGFnZ2l1bnRpdmUgc290dG8gZm9ybWEgZGkgbWF0ZXJpYWxlIGRpZGF0dGljby4NCi0NCi1BY3Rpdml0eV9TZWxlY3RlZF9Sb2FkbWFwPVJvYWRtYXA6DQotQWN0aXZpdHlfU2VsZWN0ZWRfR2VuZXJhbEd1aWRhbmNlPUd1aWRhOg0KLUFjdGl2aXR5X1NlbGVjdGVkX0NvbW11bmljYXRpb25NYXRlcmlhbD1NYXRlcmlhbGUgcGVyIGxhIGNvbXVuaWNhemlvbmU6DQotQWN0aXZpdHlfU2VsZWN0ZWRfRWR1Y2F0aW9uTWF0ZXJpYWw9TWF0ZXJpYWxlIGRpZGF0dGljbzoNCi0NCi1BY3Rpdml0eV9EaWFncmFtVGl0bGU9RGlhZ3JhbW1hDQotQWN0aXZpdHlfRGlhZ3JhbURlc2NyaXB0aW9uID0gRm9ybmlyZSBpbW1hZ2luaSBkaSBkaWFncmFtbWEgcmVsYXRpdmUgYSBxdWVzdG8gezB9Lg0KLUFjdGl2aXR5X0FESW1hZ2U9RGlhZ3JhbW1hIGF0dGl2aXRcdTAwZTANCi1BY3Rpdml0eV9BRERJbWFnZT1EaWFncmFtbWEgZGV0dGFnbGkgYXR0aXZpdFx1MDBlMA0KLUFjdGl2aXR5X1dQREltYWdlPURpYWdyYW1tYSBkaXBlbmRlbnplIHByb2RvdHRvIGRpIGxhdm9ybw0KLUFjdGl2aXR5X1VzZUFESW1hZ2U9VXRpbGl6emFyZSBpbCBEaWFncmFtbWEgZGkgYXR0aXZpdFx1MDBlMCBwZXIgbGEgcHViYmxpY2F6aW9uZQ0KLUFjdGl2aXR5X1VzZUFEREltYWdlPVV0aWxpenphcmUgaWwgRGlhZ3JhbW1hIGRpIGRldHRhZ2xpbyBkaSBhdHRpdml0XHUwMGUwIHBlciBsYSBwdWJibGljYXppb25lDQotQWN0aXZpdHlfVXNlV1BESW1hZ2U9VXRpbGl6emFyZSBpbCBEaWFncmFtbWEgZGkgZGlwZW5kZW56YSBkZWwgcHJvZG90dG8gZGkgbGF2b3JvIHBlciBsYSBwdWJibGljYXppb25lDQotQWN0aXZpdHlfQXNzaWduPUFzc2VnbmF6aW9uZS4uLg0KLQ0KLVRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkX1N0ZXBzPVBhc3NpOg0KLVRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dUaXRsZT1QYXNzaQ0KLVRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dNZXNzYWdlPVNlbGV6aW9uYSBwYXNzaQ0KLQ0KLUFjdGl2aXR5X1dvcmtSb2xsdXA9Um9sbHVwIGxhdm9ybw0KLUFjdGl2aXR5X1RlYW1Sb2xsdXA9Um9sbHVwIHRlYW0NCi1BY3Rpdml0eV9Xb3JrUHJvZHVjdHNSb2xsdXA9Um9sbHVwIHByb2RvdHRpIGRpIGxhdm9ybw0KLUFjdGl2aXR5X1dvcmtSb2xsdXBEZXNjcmlwdGlvbj1SaXZlZGVyZSBpbCByb2xsdXAgZGVsIGxhdm9ybyBwZXIgcXVlc3RhIGF0dGl2aXRcdTAwZTAgaW4gcXVlc3RhIHNlemlvbmUuDQotQWN0aXZpdHlfVGVhbVJvbGx1cERlc2NyaXB0aW9uPVJpdmVkZXJlIGlsIHJvbGx1cCBkZWwgdGVhbSBwZXIgcXVlc3RhIGF0dGl2aXRcdTAwZTAgaW4gcXVlc3RhIHNlemlvbmUuDQotQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwRGVzY3JpcHRpb249Uml2ZWRlcmUgaWwgcm9sbHVwIGRlbCBwcm9kb3R0byBkaSBsYXZvcm8gcGVyIHF1ZXN0YSBhdHRpdml0XHUwMGUwIGluIHF1ZXN0YSBzZXppb25lLg0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX011bHRpcGxlT2N1cnJhbmNlPVJpY29ycmVuemUgbXVsdGlwbGUNCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9PcHRpb25hbD1GYWNvbHRhdGl2bw0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1BsYW5uZWQ9UGlhbmlmaWNhdG8NCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9TdXByZXNzZWQ9RWxpbWluYXRvDQotDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRXZlbnREcml2ZW49QXR0aXZhdG8gZGEgZXZlbnRvDQotV29ya0JyZWFrZG93bkVsZW1lbnRfT25nb2luZz1JbiBjb3Jzbw0KLVdvcmtCcmVha2Rvd25FbGVtZW50X1JlcGVhdGFibGU9UmlwZXRpYmlsZQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29ycz1QcmVkZWNlc3Nvcmk6DQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeT1EaXBlbmRlbnphOg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0lEX1RFWFQ9SW5kaWNlDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfUFJFU0VOVEFUSU9OX05BTUVfVEVYVD1Ob21lIHByZXNlbnRhemlvbmUNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9ERVBFTkRFTkNZX1RFWFQ9RGlwZW5kZW56YQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQWRkPUFnZ2l1bmdpDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9FZGl0PU1vZGlmaWNhDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9SZW1vdmU9UmltdW92aQ0KLQ0KLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX1NUQVJUPUZpbmUtSW5pemlvDQotV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fRklOSVNIPUZpbmUtRmluZQ0KLVdvcmtPcmRlclR5cGVfU1RBUlRfVE9fRklOSVNIPUluaXppby1GaW5lDQotV29ya09yZGVyVHlwZV9TVEFSVF9UT19TVEFSVD1Jbml6aW8tSW5pemlvDQotDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3luY2hyb25pemVkPVNpbmNyb25penphdG8gY29uIGwnb3JpZ2luZQ0KLQ0KLURlc2NyaXB0b3JfUmVmaW5lZERlc2NyaXB0aW9uPURlc2NyaXppb25lIHBlcmZlemlvbmF0YToNCi0NCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU9UnVvbGkNCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uRGVzY3JpcHRpb249QXNzZWduYXJlIGkgZGVzY3JpdHRvcmkgZGkgcnVvbGkgcGVyIGVzZWd1aXJlIHF1ZXN0byBkZXNjcml0dG9yZSBkaSBvcGVyYXppb25pLg0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMT1Fc2VjdXRvcmUgcHJpbWFyaW86DQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUyPUVzZWN1dG9yaSBhZ2dpdW50aXZpOg0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMz1Bc3Npc3RpdG8gZGE6DQotDQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25UaXRsZT1Qcm9kb3R0aSBkaSBsYXZvcm8NCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvbkRlc2NyaXB0aW9uPVNwZWNpZmljYXJlIGkgZGVzY3JpdHRvcmkgZGVpIHByb2RvdHRpIGRpIGxhdm9ybyBpbnB1dCBlIG91dHB1dCBwZXIgcXVlc3RvIGRlc2NyaXR0b3JlIGRpIG9wZXJhemlvbmkuDQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1JbnB1dCBvYmJsaWdhdG9yaW86DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMj1JbnB1dCBmYWNvbHRhdGl2bzoNCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUzPUlucHV0IGVzdGVybm86DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlND1PdXRwdXQ6DQotDQotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvblRpdGxlPU9wZXJhemlvbmkNCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uRGVzY3JpcHRpb249UXVlc3RvIGRlc2NyaXR0b3JlIGRpIHJ1b2xpIFx1MDBlOCBsJ2VzZWN1dG9yZSBkZWkgc2VndWVudGkgZGVzY3JpdHRvcmkgZGkgb3BlcmF6aW9uaS4NCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTE9RXNlY3V0b3JlIHByaW1hcmlvOg0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMj1Fc2VjdXRvcmkgYWdnaXVudGl2aToNCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTM9QXNzaXN0aXRvIGRhOg0KLQ0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9UHJvZG90dGkgZGkgbGF2b3JvDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbj1RdWVzdG8gZGVzY3JpdHRvcmUgZGkgcnVvbGkgXHUwMGU4IHJlc3BvbnNhYmlsZSBlIG1vZGlmaWNhIGkgc2VndWVudGkgZGVzY3JpdHRvcmkgZGkgcHJvZG90dGkgZGkgbGF2b3JvLg0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTE9UmVzcG9uc2FiaWxlIGRpOg0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI9TW9kaWZpY2E6DQotDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1SdW9saQ0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uRGVzY3JpcHRpb249SWwgc2VndWVudGUgZGVzY3JpdHRvcmUgZGkgcnVvbGkgXHUwMGU4IHJlc3BvbnNhYmlsZSBlIG1vZGlmaWNhIHF1ZXN0byBkZXNjcml0dG9yZSBkaSBwcm9kb3R0aSBkaSBsYXZvcm8uDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMT1SZXNwb25zYWJpbGUgZGk6DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMj1Nb2RpZmljYXRvIGRhOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9UeXBlPVRpcG86DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZT1TdGF0byBpbmdyZXNzbyBhdHRpdml0XHUwMGUwOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZT1TdGF0byB1c2NpdGEgYXR0aXZpdFx1MDBlMDoNCi0NCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25UaXRsZT1QYXJ0aSBkaXN0cmlidWliaWxpDQotV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9TZWN0aW9uRGVzY3JpcHRpb249SWwgY29tcG9uZW50ZSBkaXN0cmlidWliaWxlIHByZXNlbnRhIGxlIHNlZ3VlbnRpIHBhcnRpIGRpc3RyaWJ1aWJpbGkuDQotV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9UYWJsZTE9UGFydGkgZGlzdHJpYnVpYmlsaSANCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25UaXRsZT1UZWFtDQotUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uRGVzY3JpcHRpb249UXVlc3RvIGRlc2NyaXR0b3JlIGRpIHJ1b2xpIGZhIHJpZmVyaW1lbnRvIGFpIHNlZ3VlbnRpIHRlYW0uDQotUm9sZURlc2NyaXB0b3JfVGVhbV9UYWJsZTE9VGVhbToNCi0NCi1Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvblRpdGxlPVJ1b2xpDQotQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbj1RdWVzdG8gcnVvbG8gY29tcG9zaXRvIHByZXNlbnRhIGkgc2VndWVudGkgcnVvbGkgYWdncmVnYXRpLg0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9UYWJsZTE9UnVvbGkgYWdncmVnYXRpOg0KLQ0KLVRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvblRpdGxlPVJ1b2xpDQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb249QWdnaXVuZ2VyZSBvIGVsaW1pbmFyZSBpIHJ1b2xpIGEvZGFsIHByb2ZpbG8gZGVsIHRlYW0uDQotVGVhbVByb2ZpbGVfUm9sZV9UYWJsZTE9UnVvbGk6DQotDQotUHJvY2Vzc19SaWNoVGV4dF9Db2xsYXBzZUltYWdlPWNvbGxhcHNlZC5naWYNCi1Qcm9jZXNzX1JpY2hUZXh0X0V4cGFuZEltYWdlPWV4cGFuZGVkLmdpZg0KLVByb2Nlc3NfQWRkPUFnZ2l1bmdpLi4uDQotUHJvY2Vzc19BZGRGcm9tUHJvY2Vzcz1BZ2dpdW5naSBkYSBwcm9jZXNzby4uLg0KLVByb2Nlc3NfUmVuYW1lX01lc3NhZ2U9U2kgc3RhIHBlciBtb2RpZmljYXJlIGlsIG5vbWUgZGkgcXVlc3RvIHByb2Nlc3NvLiBJbiB0YWwgbW9kbywgbCdlZGl0b3IgdmVyclx1MDBlMCBzYWx2YXRvIGUgbGEgY2FydGVsbGEgZGVpIHByb2Nlc3NpIHZlcnJcdTAwZTAgcmlub21pbmF0YS4gQ29udGludWFyZT8NCi1Qcm9jZXNzX1JlbW92ZT1SaW11b3ZpDQotUHJvY2Vzc19VcD1TdQ0KLVByb2Nlc3NfRG93bj1HaVx1MDBmOQ0KLVByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb249U2VsZXppb25lIG11bHRpcGxhDQotUHJvY2Vzc19CdXR0b25fTGlua01ldGhvZEVsZW1lbnQ9Q29sbGVnYSBlbGVtZW50byBtZXRvZG8uLi4NCi0NCi0jIyBFcnJvci9XYXJuaW5nDQotUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlPU5vbWUgbm9uIHZhbGlkbw0KLVByb2Nlc3NfSW52YWxpZE5hbWU9SVVQQTAwODFFOiBJbCBub21lIG5vbiBwdVx1MDBmMiBlc3NlcmUgdnVvdG8uIFNwZWNpZmljYXJlIHVuIG5vbWUgdmFsaWRvLg0KLVByb2Nlc3NfUmVuYW1lX1RpdGxlPVJpbm9taW5hDQotUHJvY2Vzc19JbnZhbGlkUHJlc2VudGF0aW9uTmFtZT1JVVBBMDA4MkU6IElsIG5vbWUgZGVsbGEgcHJlc2VudGF6aW9uZSBub24gcHVcdTAwZjIgZXNzZXJlIHZ1b3RvLiBTcGVjaWZpY2FyZSB1biBub21lIGRpIHByZXNlbnRhemlvbmUgdmFsaWRvLg0KLVByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZT1Db2xsZWdhIGVsZW1lbnRvIG1ldG9kbw0KLVByb2Nlc3NfSW52YWxpZExpbmtNZXRob2RFbGVtZW50PUlVUEEwMDgzRTogSW1wb3NzaWJpbGUgY29sbGVnYXJzaSBhICcnezB9JycgaW4gcXVhbnRvIHF1ZXN0byBlbGVtZW50byBkaSBtZXRvZG8gXHUwMGU4IGdpXHUwMGUwIGluIHVzbyBwZXIgdW4gYWx0cm8gZGVzY3JpdHRvcmUgbmVsbG8gc3Rlc3NvIGVsZW1lbnRvIHBhcmVudC4NCi1Qcm9jZXNzX0Fzc2lnbm1lbnRJbmZvVGl0bGU9SW5mb3JtYXppb25pDQotUHJvY2Vzc19UZWFtQXNzaWduRXJyb3I9SVVQQTAwODRFOiBJbXBvc3NpYmlsZSBhZ2dpdW5nZXJlICcnezB9JycgYWwgdGVhbSAnJ3sxfScnIFxuXG5JIGRlc2NyaXR0b3JpIGRpIHJ1b2xpIGRldm9ubyBlc3NlcmUgYXNzb2NpYXRpIGEgdW4gcnVvbG8gZGVsbCcnZWxlbWVudG8gZGkgbWV0b2RvIGRhIGFzc2VnbmFyZSBhbCB0ZWFtLlxuXG4gQ29ycmVnZ2VyZSBsJydhc3NvY2lhemlvbmUsIHF1aW5kaSBwcm92YXJlIGRpIG51b3ZvLg0KLVByb2Nlc3NfVGVhbURpYWxvZ01lc3NhZ2U9U2VsZXppb25hIHRlYW0NCi1Qcm9jZXNzX1RlYW1EaWFsb2dUaXRsZT1UZWFtDQotDQotUHJvY2Vzc19EZWxpdmVyYWJsZUFzc2lnbkVycm9yPUlVUEEwMDg1RTogSW1wb3NzaWJpbGUgYWdnaXVuZ2VyZSAnJ3swfScnIGFsIGNvbXBvbmVudGUgZGlzdHJpYnVpYmlsZSAnJ3sxfScnIGluIHF1YW50byBub24gZGlzcG9uZSBkaSB1biBwcm9kb3R0byBkaSBsYXZvcm8gZGVsbCcnZWxlbWVudG8gZGkgbWV0b2RvIGFzc29jaWF0by4NCi1Qcm9jZXNzX0NvbXBvc2l0ZVJvbGVBc3NpZ25FcnJvcj1JVVBBMDA4NkU6IEltcG9zc2liaWxlIGFnZ2l1bmdlcmUgJyd7MH0nJyBhbCBydW9sbyBjb21wb3NpdG8gJyd7MX0nJyBpbiBxdWFudG8gbm9uIGRpc3BvbmUgZGkgdW4gcnVvbG8gZGVsbCcnZWxlbWVudG8gZGkgbWV0b2RvIGFzc29jaWF0by4NCi1Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlck1lc3NhZ2U9SVVQQTAwODdXOiBJbW1ldHRlcmUgdW4gbnVtZXJvIHZhbGlkbyBwZXIgaSBwcmVkZWNlc3NvcmkuDQotUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJUaXRsZT1JRCBwcmVkZWNlc3NvcmUgbm9uIHZhbGlkbw0KLQ0KLVByb2Nlc3NfTm9JdGVtcz1OZXNzdW4gZWxlbWVudG8gc2VsZXppb25hdG8NCi1Qcm9jZXNzX0l0ZW1zU2VsZWN0ZWQ9ezB9IGVsZW1lbnRpIHNlbGV6aW9uYXRpDQotUHJvY2Vzc19Ob1Byb3BlcnRpZXNBdmFpbGFibGU9TmVzc3VuYSBwcm9wcmlldFx1MDBlMCBkaXNwb25pYmlsZQ0KLQ0KLVByZWRlY2Vzc29yRGlhbG9nX1RpdGxlPURpcGVuZGVuemEgcHJlZGVjZXNzb3JlDQotUHJlZGVjZXNzb3JEaWFsb2dfSGVhZGVyTWVzc2FnZT1JbW1ldHRlcmUgdGlwbyBkaSBkaXBlbmRlbnphIHBlciBwcmVkZWNlc3NvcmU6DQotUHJlZGVjZXNzb3JEaWFsb2dfSW5kZXg9SW5kaWNlOg0KLVByZWRlY2Vzc29yRGlhbG9nX1ByZXNlbnRhdGlvbk5hbWU9Tm9tZSBwcmVzZW50YXppb25lOg0KLVByZWRlY2Vzc29yRGlhbG9nX0RlcGVuZGVuY3k9RGlwZW5kZW56YToNCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yRGlhbG9nVGl0bGU9UHJlZGVjZXNzb3JlDQotUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvck1lc3NhZ2U9SVVQQTAwODhFOiBFc2lzdGUgZ2lcdTAwZTAgdW4gcHJlZGVjZXNzb3JlIGNvbiBxdWVzdG8gSUQgcGVyIHF1ZXN0byBlbGVtZW50byBkZWxsYSBzdWRkaXZpc2lvbmUgZGVsIGxhdm9yby4NCi0NCi1Qcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfdGV4dEVkaXRDZWxsX3Byb2JsZW1fbXNnPUlVUEEwMDkwRTogU2kgXHUwMGU4IHZlcmlmaWNhdG8gdW4gZXJyb3JlIGR1cmFudGUgbGEgbW9kaWZpY2EgZGkgdW5hIHByb3ByaWV0XHUwMGUwLg0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc19jZWxsRWRpdG9yX2ludmFsaWRQcmVkY2Vzc29yX3Byb2JsZW1fbXNnPUlVUEEwMDg5VzogRWxlbmNvIHByZWRlY2Vzc29yaSBub24gdmFsaWRvDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzIzMjljLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25UaXRsZT1cdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzENCi1Qcm9jZXNzX0RvY3VtZW50SW5mb3JtYXRpb25UaXRsZT1cdTY1ODdcdTY2ZjhcdTYwYzVcdTU4MzENCi1BY3Rpdml0eV9ndWlkYW5jZUluZm9ybWF0aW9uVGl0bGU9XHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5DQotQnJlYWtkb3duRWxlbWVudF9vcHRpb25JbmZvcm1hdGlvblRpdGxlPVx1MzBkNlx1MzBlY1x1MzBmY1x1MzBhZlx1MzBjMFx1MzBhNlx1MzBmM1x1MzBmYlx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmMw0KLVRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvblRpdGxlPVx1MzBiOVx1MzBjNlx1MzBjM1x1MzBkNw0KLQ0KLVRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBiZlx1MzBiOVx1MzBhZlx1OGExOFx1OGZmMFx1NWI1MFx1MzA2ZVx1NWI5Zlx1ODg0Y1x1MzBiOVx1MzBjNlx1MzBjM1x1MzBkN1x1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlezB9XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotUHJvY2Vzc19kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlezB9XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU2NTg3XHU2NmY4XHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdThhMThcdThmZjBcdTViNTBcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTRlMDBcdTgyMmNcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1EZXNjcmlwdG9yX2RldGFpbEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU4YTczXHU3ZDMwXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotTWlsZXN0b25lX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBkZVx1MzBhNFx1MzBlYlx1MzBiOVx1MzBjOFx1MzBmY1x1MzBmM1x1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1NGUwMFx1ODIyY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLU1pbGVzdG9uZV9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBkZVx1MzBhNFx1MzBlYlx1MzBiOVx1MzBjOFx1MzBmY1x1MzBmM1x1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGQ2XHUzMGVjXHUzMGZjXHUzMGFmXHUzMGMwXHUzMGE2XHUzMGYzXHUzMGZiXHUzMGE4XHUzMGVjXHUzMGUxXHUzMGYzXHUzMGM4XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotV29ya0JyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ2XHUzMGVjXHUzMGZjXHUzMGFmXHUzMGMwXHUzMGE2XHUzMGYzXHUzMGZiXHUzMGE4XHUzMGVjXHUzMGUxXHUzMGYzXHUzMGM4XHUzMDZiXHU5NWEyXHUzMDU5XHUzMDhiXHU0ZTAwXHU4MjJjXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdG9uPVx1MzA1M1x1MzA2ZVx1OGExOFx1OGZmMFx1NWI1MFx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1NGUwMFx1ODIyY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLUFjdGl2aXR5X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1NGUwMFx1ODIyY1x1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfRG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBkNlx1MzBlY1x1MzBmY1x1MzBhZlx1MzBjMFx1MzBhNlx1MzBmM1x1MzBmYlx1MzBhOFx1MzBlY1x1MzBlMVx1MzBmM1x1MzBjOFx1MzA2Ylx1OTVhMlx1MzA1OVx1MzA4Ylx1NjU4N1x1NjZmOFx1NjBjNVx1NTgzMVx1MzA5Mlx1NjNkMFx1NGY5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLUFjdGl2aXR5X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTY1ODdcdTY2ZjhcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1EZXNjcmlwdG9yX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdThhMThcdThmZjBcdTViNTBcdTMwNmJcdTk1YTJcdTMwNTlcdTMwOGJcdTY1ODdcdTY2ZjhcdTYwYzVcdTU4MzFcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1Qcm9jZXNzX05vbmU9PDwgTk9ORSA+Pg0KLVByb2Nlc3NfbmFtZT1cdTU0MGRcdTUyNGQ6DQotUHJvY2Vzc19QcmVzZW50YXRpb25OYW1lPVx1ODg2OFx1NzkzYVx1NTQwZDoNCi1Qcm9jZXNzX2JyaWVmRGVzY3JpcHRpb249XHU4OTgxXHU2NWU4Og0KLVByb2Nlc3NfbWFpbkRlc2NyaXB0aW9uPSBcdThhYWNcdTY2MGU6DQotUHJvY2Vzc19wdXJwb3NlPVx1NzZlZVx1NzY4NDoNCi1Qcm9jZXNzX3ByZWZpeD1cdTMwZDdcdTMwZWNcdTMwZDVcdTMwYTNcdTMwYzNcdTMwYWZcdTMwYjk6DQotDQotQnJlYWtkb3duRWxlbWVudF9UeXBlX05hbWU9XHUzMGQ2XHUzMGVjXHUzMGZjXHUzMGFmXHUzMGMwXHUzMGE2XHUzMGYzXHUzMGZiXHUzMGE4XHUzMGVjXHUzMGUxXHUzMGYzXHUzMGM4DQotDQotUHJvY2Vzc19UeXBlX1Rhc2s9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMDZlXHUzMGJmXHUzMGI5XHUzMGFmOg0KLVByb2Nlc3NfVHlwZV9Sb2xlPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYjoNCi1Qcm9jZXNzX1R5cGVfV29ya1Byb2R1Y3Q9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMDZlXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4Og0KLQ0KLVdvcmtQcm9kdWN0X1R5cGU9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDZlXHUzMGJmXHUzMGE0XHUzMGQ3Og0KLQ0KLUFjdGl2aXR5X01vZGVsSW5mbz1cdTMwZTJcdTMwYzdcdTMwZWJcdTYwYzVcdTU4MzE6DQotQWN0aXZpdHlfVHlwZT1cdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTMwZmJcdTMwYmZcdTMwYTRcdTMwZDcNCi1BY3Rpdml0eV9wcmVzZW50YXRpb25OYW1lPVx1ODg2OFx1NzkzYVx1NTQwZDoNCi1BY3Rpdml0eV9hbHRlcm5hdGl2ZXM9XHU0ZWUzXHU2ODQ4Og0KLUFjdGl2aXR5X2hvd1RvU3RhZmY9XHU5MTRkXHU1YzVlXHU2NWI5XHU2Y2Q1Og0KLUJyZWFrZG93bkVsZW1lbnRfa2V5Q29uc2lkZXJhdGlvbnM9XHU0ZTNiXHUzMDZhXHU4MDAzXHU2MTZlXHU0ZThiXHU5ODA1Og0KLVByb2Nlc3NfdXNhZ2VHdWlkYW5jZT1cdTRmN2ZcdTc1MjhcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjk6DQotDQotQWN0aXZpdHlfUm9hZG1hcFRpdGxlPVx1MzBlZFx1MzBmY1x1MzBjOVx1MzBkZVx1MzBjM1x1MzBkNw0KLUFjdGl2aXR5X1JvYWRtYXBEZXNjcmlwdGlvbj1cdThmZmRcdTUyYTBcdTYwYzVcdTU4MzFcdTMwNzhcdTMwNmVcdTMwZWFcdTMwZjNcdTMwYWZcdTMwOTJcdTMwZWRcdTMwZmNcdTMwYzlcdTMwZGVcdTMwYzNcdTMwZDdcdTVmNjJcdTVmMGZcdTMwNjdcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1BY3Rpdml0eV9HZW5lcmFsR3VpZGFuY2VUaXRsZT1cdTRlMDBcdTgyMmNcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjkNCi1BY3Rpdml0eV9HZW5lcmFsR3VpZGFuY2VEZXNjcmlwdGlvbj1cdThmZmRcdTUyYTBcdTYwYzVcdTU4MzFcdTMwNzhcdTMwNmVcdTMwZWFcdTMwZjNcdTMwYWZcdTMwOTJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTVmNjJcdTVmMGZcdTMwNjdcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxUaXRsZT1cdTMwYjNcdTMwZGZcdTMwZTVcdTMwY2JcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdThjYzdcdTY1OTkNCi1BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbj1cdThmZmRcdTUyYTBcdTYwYzVcdTU4MzFcdTMwNzhcdTMwNmVcdTMwZWFcdTMwZjNcdTMwYWZcdTMwOTJcdTMwYjNcdTMwZGZcdTMwZTVcdTMwY2JcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdThjYzdcdTY1OTlcdTMwNmVcdTVmNjJcdTVmMGZcdTMwNjdcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbFRpdGxlPVx1NjU1OVx1ODBiMlx1OGNjN1x1NjU5OQ0KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb249XHU4ZmZkXHU1MmEwXHU2MGM1XHU1ODMxXHUzMDc4XHUzMDZlXHUzMGVhXHUzMGYzXHUzMGFmXHUzMDkyXHU2NTU5XHU4MGIyXHU4Y2M3XHU2NTk5XHUzMDZlXHU1ZjYyXHU1ZjBmXHUzMDY3XHU2M2QwXHU0ZjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotQWN0aXZpdHlfU2VsZWN0ZWRfUm9hZG1hcD1cdTMwZWRcdTMwZmNcdTMwYzlcdTMwZGVcdTMwYzNcdTMwZDc6DQotQWN0aXZpdHlfU2VsZWN0ZWRfR2VuZXJhbEd1aWRhbmNlPVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOToNCi1BY3Rpdml0eV9TZWxlY3RlZF9Db21tdW5pY2F0aW9uTWF0ZXJpYWw9XHUzMGIzXHUzMGRmXHUzMGU1XHUzMGNiXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHU4Y2M3XHU2NTk5Og0KLUFjdGl2aXR5X1NlbGVjdGVkX0VkdWNhdGlvbk1hdGVyaWFsPVx1NjU1OVx1ODBiMlx1OGNjN1x1NjU5OToNCi0NCi1BY3Rpdml0eV9EaWFncmFtVGl0bGU9XHUzMGMwXHUzMGE0XHUzMGEyXHUzMGIwXHUzMGU5XHUzMGUwDQotQWN0aXZpdHlfRGlhZ3JhbURlc2NyaXB0aW9uID0gXHUzMDUzXHUzMDZlIHswfSBcdTMwNmVcdTMwYzBcdTMwYTRcdTMwYTJcdTMwYjBcdTMwZTlcdTMwZTBcdTMwZmJcdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjhcdTMwOTJcdTYzZDBcdTRmOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1BY3Rpdml0eV9BREltYWdlPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1NTZmMw0KLUFjdGl2aXR5X0FEREltYWdlPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1OGE3M1x1N2QzMFx1NTZmMw0KLUFjdGl2aXR5X1dQREltYWdlPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1NGY5ZFx1NWI1OFx1OTVhMlx1NGZjMlx1NTZmMw0KLUFjdGl2aXR5X1VzZUFESW1hZ2U9XHU1MTZjXHU5NThiXHUzMDU5XHUzMDhiXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU1NmYzXHUzMDZlXHU0ZjdmXHU3NTI4DQotQWN0aXZpdHlfVXNlQURESW1hZ2U9XHU1MTZjXHU5NThiXHUzMDU5XHUzMDhiXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU4YTczXHU3ZDMwXHU1NmYzXHUzMDZlXHU0ZjdmXHU3NTI4DQotQWN0aXZpdHlfVXNlV1BESW1hZ2U9XHU1MTZjXHU5NThiXHUzMDU5XHUzMDhiXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU0ZjlkXHU1YjU4XHU5NWEyXHU0ZmMyXHU1NmYzXHUzMDZlXHU0ZjdmXHU3NTI4DQotQWN0aXZpdHlfQXNzaWduPVx1NTI3Mlx1MzA4YVx1NWY1M1x1MzA2Ni4uLg0KLQ0KLVRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkX1N0ZXBzPVx1MzBiOVx1MzBjNlx1MzBjM1x1MzBkNzoNCi1UYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nVGl0bGU9XHUzMGI5XHUzMGM2XHUzMGMzXHUzMGQ3DQotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ01lc3NhZ2U9XHUzMGI5XHUzMGM2XHUzMGMzXHUzMGQ3XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0DQotDQotQWN0aXZpdHlfV29ya1JvbGx1cD1cdTMwZWZcdTMwZmNcdTMwYWZcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwYTJcdTMwYzNcdTMwZDcNCi1BY3Rpdml0eV9UZWFtUm9sbHVwPVx1MzBjMVx1MzBmY1x1MzBlMFx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBhMlx1MzBjM1x1MzBkNw0KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cD1cdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwYTJcdTMwYzNcdTMwZDcNCi1BY3Rpdml0eV9Xb3JrUm9sbHVwRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGJiXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDY3XHUzMDZmXHUzMDAxXHUzMDUzXHUzMDZlXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHUzMDZlXHUzMGVmXHUzMGZjXHUzMGFmXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMGEyXHUzMGMzXHUzMGQ3XHUzMDkyXHU2OTFjXHU4YTBlXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotQWN0aXZpdHlfVGVhbVJvbGx1cERlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBiYlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmM1x1MzA2N1x1MzA2Zlx1MzAwMVx1MzA1M1x1MzA2ZVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1MzA2ZVx1MzBjMVx1MzBmY1x1MzBlMFx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBhMlx1MzBjM1x1MzBkN1x1MzA5Mlx1NjkxY1x1OGEwZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cERlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBiYlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmM1x1MzA2N1x1MzA2Zlx1MzAwMVx1MzA1M1x1MzA2ZVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1MzA2ZVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBhMlx1MzBjM1x1MzBkN1x1MzA5Mlx1NjkxY1x1OGEwZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX011bHRpcGxlT2N1cnJhbmNlPVx1ODkwN1x1NjU3MFx1MzA2ZVx1NTFmYVx1NzNmZQ0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX09wdGlvbmFsPVx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmMw0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1BsYW5uZWQ9XHU4YTA4XHU3NTNiXHU2ZTA4XHUzMDdmDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3VwcmVzc2VkPVx1NjI5MVx1NTIzNg0KLQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0V2ZW50RHJpdmVuPVx1MzBhNFx1MzBkOVx1MzBmM1x1MzBjOFx1OTljNlx1NTJkNQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X09uZ29pbmc9XHU5MDMyXHU4ODRjXHU0ZTJkDQotV29ya0JyZWFrZG93bkVsZW1lbnRfUmVwZWF0YWJsZT1cdTUzY2RcdTVmYTlcdTUzZWZcdTgwZmQNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9QcmVkZWNlc3NvcnM9XHU1MTQ4XHU4ODRjXHUzMGJmXHUzMGI5XHUzMGFmOg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3k9XHU0ZjlkXHU1YjU4XHU5NWEyXHU0ZmMyOg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0lEX1RFWFQ9XHU3ZDIyXHU1ZjE1DQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfUFJFU0VOVEFUSU9OX05BTUVfVEVYVD1cdTg4NjhcdTc5M2FcdTU0MGQNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9ERVBFTkRFTkNZX1RFWFQ9XHU0ZjlkXHU1YjU4XHU5NWEyXHU0ZmMyDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9BZGQ9XHU4ZmZkXHU1MmEwDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9FZGl0PVx1N2RlOFx1OTZjNg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfUmVtb3ZlPVx1OTY2NFx1NTNiYg0KLQ0KLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX1NUQVJUPVx1N2Q0Mlx1NGU4NiAtIFx1OTU4Ylx1NTljYg0KLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX0ZJTklTSD1cdTdkNDJcdTRlODYgLSBcdTdkNDJcdTRlODYNCi1Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX0ZJTklTSD1cdTk1OGJcdTU5Y2IgLSBcdTdkNDJcdTRlODYNCi1Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX1NUQVJUPVx1OTU4Ylx1NTljYiAtIFx1OTU4Ylx1NTljYg0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N5bmNocm9uaXplZD1cdTMwYmRcdTMwZmNcdTMwYjlcdTMwNjhcdTU0MGNcdTY3MWZcdTUzMTYNCi0NCi1EZXNjcmlwdG9yX1JlZmluZWREZXNjcmlwdGlvbj1cdThhNzNcdTdkMzBcdThhYWNcdTY2MGU6DQotDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvblRpdGxlPVx1MzBlZFx1MzBmY1x1MzBlYg0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwYmZcdTMwYjlcdTMwYWZcdThhMThcdThmZjBcdTViNTBcdTMwOTJcdTViOWZcdTg4NGNcdTMwNTlcdTMwOGJcdTMwZWRcdTMwZmNcdTMwZWJcdThhMThcdThmZjBcdTViNTBcdTMwOTJcdTUyNzJcdTMwOGFcdTVmNTNcdTMwNjZcdTMwN2VcdTMwNTlcdTMwMDINCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTE9XHU1N2ZhXHU2NzJjXHU1YjlmXHU4ODRjXHU4MDA1Og0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMj1cdThmZmRcdTUyYTBcdTViOWZcdTg4NGNcdTgwMDU6DQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUzPVx1NjUyZlx1NjNmNFx1ODAwNToNCi0NCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249XHU1MTY1XHU1MjliXHUzMDRhXHUzMDg4XHUzMDczXHU1MWZhXHU1MjliXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDkyXHUzMDUzXHUzMDZlXHUzMGJmXHUzMGI5XHUzMGFmXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDZiXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1cdTVmYzVcdTk4MDhcdTUxNjVcdTUyOWI6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMj1cdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjNcdTUxNjVcdTUyOWI6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMz1cdTU5MTZcdTkwZThcdTUxNjVcdTUyOWI6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlND1cdTUxZmFcdTUyOWI6DQotDQotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvblRpdGxlPVx1MzBiZlx1MzBiOVx1MzBhZg0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTMwNTNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdThhMThcdThmZjBcdTViNTBcdTMwNmZcdTMwMDFcdTZiMjFcdTMwNmVcdTMwYmZcdTMwYjlcdTMwYWZcdThhMThcdThmZjBcdTViNTBcdTMwNmVcdTViOWZcdTg4NGNcdTgwMDVcdTMwNjdcdTMwNTlcdTMwMDINCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTE9XHU1N2ZhXHU2NzJjXHU1YjlmXHU4ODRjXHU4MDA1Og0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMj1cdThmZmRcdTUyYTBcdTViOWZcdTg4NGNcdTgwMDU6DQotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUzPVx1NjUyZlx1NjNmNFx1ODAwNToNCi0NCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDZmXHUzMDAxXHU2YjIxXHUzMDZlXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDkyXHU2MmM1XHU1ZjUzXHUzMDU3XHUzMDAxXHU1OTA5XHU2NmY0XHUzMDkyXHU1MmEwXHUzMDQ4XHUzMDdlXHUzMDU5XHUzMDAyDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1cdTYyYzVcdTVmNTM6DQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMj1cdTU5MDlcdTY2ZjQ6DQotDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1cdTMwZWRcdTMwZmNcdTMwZWINCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPVx1NmIyMVx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1OGExOFx1OGZmMFx1NWI1MFx1MzA2Zlx1MzAwMVx1MzA1M1x1MzA2ZVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1OGExOFx1OGZmMFx1NWI1MFx1MzA5Mlx1NjJjNVx1NWY1M1x1MzA1N1x1MzAwMVx1NTkwOVx1NjZmNFx1MzA5Mlx1NTJhMFx1MzA0OFx1MzA3ZVx1MzA1OVx1MzAwMg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19UYWJsZTE9XHU2MmM1XHU1ZjUzOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9XHU1OTA5XHU2NmY0XHU4MDA1Og0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9UeXBlPVx1MzBiZlx1MzBhNFx1MzBkNzoNCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1OTU4Ylx1NTljYlx1NzJiNlx1NjE0YjoNCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGU9XHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU3ZDQyXHU0ZTg2XHU3MmI2XHU2MTRiOg0KLQ0KLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvblRpdGxlPVx1N2QwZFx1NTE2NVx1NzI2OQ0KLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvbkRlc2NyaXB0aW9uPVx1N2QwZFx1NTE2NVx1NzI2OVx1MzA2Ylx1MzA2Zlx1MzAwMVx1NmIyMVx1MzA2ZVx1MzA4OFx1MzA0Nlx1MzA2YVx1MzA4Mlx1MzA2ZVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMg0KLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfVGFibGUxPVx1N2QwZFx1NTE2NVx1NzI2OQ0KLQ0KLVJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvblRpdGxlPVx1MzBjMVx1MzBmY1x1MzBlMA0KLVJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvbkRlc2NyaXB0aW9uPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1OGExOFx1OGZmMFx1NWI1MFx1MzA2Zlx1MzAwMVx1NmIyMVx1MzA2ZVx1MzBjMVx1MzBmY1x1MzBlMFx1MzA5Mlx1NTNjMlx1NzE2N1x1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLVJvbGVEZXNjcmlwdG9yX1RlYW1fVGFibGUxPVx1MzBjMVx1MzBmY1x1MzBlMDoNCi0NCi1Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvblRpdGxlPVx1MzBlZFx1MzBmY1x1MzBlYg0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb249XHUzMDUzXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGRkXHUzMGI4XHUzMGMzXHUzMGM4XHUzMGZiXHUzMGVkXHUzMGZjXHUzMGViXHUzMDZiXHUzMDZmXHUzMDAxXHU2YjIxXHUzMDZlXHU5NmM2XHU3ZDA0XHUzMGVkXHUzMGZjXHUzMGViXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyDQotQ29tcG9zaXRlUm9sZV9Sb2xlX1RhYmxlMT1cdTk2YzZcdTdkMDRcdTMwZWRcdTMwZmNcdTMwZWI6DQotDQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uVGl0bGU9XHUzMGVkXHUzMGZjXHUzMGViDQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb249XHUzMGMxXHUzMGZjXHUzMGUwXHUzMDZlXHUzMGQ3XHUzMGVkXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMDkyXHU4ZmZkXHU1MmEwXHUzMDdlXHUzMDVmXHUzMDZmXHU1MjRhXHU5NjY0XHUzMDU5XHUzMDhiXHUzMDAyDQotVGVhbVByb2ZpbGVfUm9sZV9UYWJsZTE9XHUzMGVkXHUzMGZjXHUzMGViOg0KLQ0KLVByb2Nlc3NfUmljaFRleHRfQ29sbGFwc2VJbWFnZT1jb2xsYXBzZWQuZ2lmDQotUHJvY2Vzc19SaWNoVGV4dF9FeHBhbmRJbWFnZT1leHBhbmRlZC5naWYNCi1Qcm9jZXNzX0FkZD1cdThmZmRcdTUyYTAuLi4NCi1Qcm9jZXNzX0FkZEZyb21Qcm9jZXNzPVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA0Ylx1MzA4OVx1OGZmZFx1NTJhMC4uLg0KLVByb2Nlc3NfUmVuYW1lX01lc3NhZ2U9XHUzMDUzXHUzMDZlXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDZlXHU1NDBkXHU1MjRkXHUzMDkyXHU1OTA5XHU2NmY0XHUzMDU3XHUzMDg4XHUzMDQ2XHUzMDY4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyIFx1MzA1M1x1MzA2ZVx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA0Y1x1NGZkZFx1N2JhMVx1MzA1NVx1MzA4Y1x1MzAwMVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzBmYlx1MzBkNVx1MzBhOVx1MzBlYlx1MzBjMFx1MzBmY1x1MzA0Y1x1NjViMFx1ODk4Zlx1NTQwZFx1MzA2Ylx1NTkwOVx1NjZmNFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTdkOWFcdTg4NGNcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQotUHJvY2Vzc19SZW1vdmU9XHU5NjY0XHU1M2JiDQotUHJvY2Vzc19VcD1cdTRlMGFcdTMwNzgNCi1Qcm9jZXNzX0Rvd249XHU0ZTBiXHUzMDc4DQotUHJvY2Vzc19NdWx0aXBsZVNlbGVjdGlvbj1cdTg5MDdcdTY1NzBcdTkwNzhcdTYyOWUNCi1Qcm9jZXNzX0J1dHRvbl9MaW5rTWV0aG9kRWxlbWVudD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTg5ODFcdTdkMjBcdTMwNmVcdTMwZWFcdTMwZjNcdTMwYWYuLi4NCi0NCi0jIyBFcnJvci9XYXJuaW5nDQotUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlPVx1NzEyMVx1NTJiOVx1MzA2YVx1NTQwZFx1NTI0ZA0KLVByb2Nlc3NfSW52YWxpZE5hbWU9SVVQQTAwODFFOiBcdTU0MGRcdTUyNGRcdTMwOTJcdTdhN2FcdTMwNmJcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIgXHU2NzA5XHU1MmI5XHUzMDZhXHU1NDBkXHU1MjRkXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotUHJvY2Vzc19SZW5hbWVfVGl0bGU9XHU1NDBkXHU1MjRkXHU1OTA5XHU2NmY0DQotUHJvY2Vzc19JbnZhbGlkUHJlc2VudGF0aW9uTmFtZT1JVVBBMDA4MkU6IFx1ODg2OFx1NzkzYVx1NTQwZFx1MzA5Mlx1N2E3YVx1MzA2Ylx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMiBcdTY3MDlcdTUyYjlcdTMwNmFcdTg4NjhcdTc5M2FcdTU0MGRcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1Qcm9jZXNzX0xpbmtNZXRob2RFbGVtZW50VGl0bGU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU4OTgxXHU3ZDIwXHUzMDZlXHUzMGVhXHUzMGYzXHUzMGFmDQotUHJvY2Vzc19JbnZhbGlkTGlua01ldGhvZEVsZW1lbnQ9SVVQQTAwODNFOiBNZXRob2RFbGVtZW50ICcnezB9JycgXHUzMDZmXHUzMDAxXHU1NDBjXHUzMDU4XHU4OWFhXHUzMDZlXHU1MjI1XHUzMDZlXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDZiXHUzMDU5XHUzMDY3XHUzMDZiXHU0ZjdmXHU3NTI4XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDhiXHUzMDVmXHUzMDgxXHUzMDAxXHUzMGVhXHUzMGYzXHUzMGFmXHU1MTQ4XHUzMDY4XHUzMDU3XHUzMDY2XHU2MzA3XHU1YjlhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotUHJvY2Vzc19Bc3NpZ25tZW50SW5mb1RpdGxlPVx1OTAxYVx1NzdlNQ0KLVByb2Nlc3NfVGVhbUFzc2lnbkVycm9yPUlVUEEwMDg0RTogJyd7MH0nJyBcdTMwOTJcdTMwYzFcdTMwZmNcdTMwZTAgJyd7MX0nJyBcdTMwNmJcdThmZmRcdTUyYTBcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcblxuXHUzMGVkXHUzMGZjXHUzMGViXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDZiXHUzMDZmXHUzMDAxXHUzMGMxXHUzMGZjXHUzMGUwXHUzMDZiXHU1MjcyXHUzMDhhXHU1ZjUzXHUzMDY2XHUzMDhiXHUzMDAxXHU5NWEyXHU5MDIzXHU0ZWQ4XHUzMDUxXHUzMDg5XHUzMDhjXHUzMDVmXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU4OTgxXHU3ZDIwXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5XHUzMDAyXG5cblx1MzA3ZVx1MzA1YVx1MzAwMVx1OTVhMlx1OTAyM1x1NGVkOFx1MzA1MVx1MzA5Mlx1NGZlZVx1NmI2M1x1MzA1N1x1MzA2Nlx1MzA0Ylx1MzA4OVx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLVByb2Nlc3NfVGVhbURpYWxvZ01lc3NhZ2U9XHUzMGMxXHUzMGZjXHUzMGUwXHUzMDZlXHU5MDc4XHU2MjllDQotUHJvY2Vzc19UZWFtRGlhbG9nVGl0bGU9XHUzMGMxXHUzMGZjXHUzMGUwDQotDQotUHJvY2Vzc19EZWxpdmVyYWJsZUFzc2lnbkVycm9yPUlVUEEwMDg1RTogXHU3ZDBkXHU1MTY1XHU3MjY5ICcnezF9JycgXHUzMDZiXHUzMDZmXHU5NWEyXHU5MDIzXHU0ZWQ4XHUzMDUxXHUzMDg5XHUzMDhjXHUzMDVmXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU4OTgxXHU3ZDIwXHUzMDZlXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDRjXHUzMDZhXHUzMDQ0XHUzMDVmXHUzMDgxXHUzMDAxJyd7MH0nJyBcdTMwOTJcdThmZmRcdTUyYTBcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1Qcm9jZXNzX0NvbXBvc2l0ZVJvbGVBc3NpZ25FcnJvcj1JVVBBMDA4NkU6IFx1MzBiM1x1MzBmM1x1MzBkZFx1MzBiOFx1MzBjM1x1MzBjOFx1MzBmYlx1MzBlZFx1MzBmY1x1MzBlYiAnJ3sxfScnIFx1MzA2Ylx1MzA2Zlx1OTVhMlx1OTAyM1x1NGVkOFx1MzA1MVx1MzA4OVx1MzA4Y1x1MzA1Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMFx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzA0Y1x1MzA2YVx1MzA0NFx1MzA1Zlx1MzA4MVx1MzAwMScnezB9JycgXHUzMDkyXHU4ZmZkXHU1MmEwXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJNZXNzYWdlPUlVUEEwMDg3VzogXHU2NzA5XHU1MmI5XHUzMDZhXHU1MTQ4XHU4ODRjXHUzMGJmXHUzMGI5XHUzMGFmXHU2NTcwXHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJUaXRsZT1cdTcxMjFcdTUyYjlcdTMwNmFcdTUxNDhcdTg4NGNcdTMwYmZcdTMwYjlcdTMwYWYgSUQNCi0NCi1Qcm9jZXNzX05vSXRlbXM9XHU5ODA1XHU3NmVlXHUzMDRjXHU5MDc4XHU2MjllXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzDQotUHJvY2Vzc19JdGVtc1NlbGVjdGVkPXswfSBcdTk4MDVcdTc2ZWVcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkNCi1Qcm9jZXNzX05vUHJvcGVydGllc0F2YWlsYWJsZT1cdTkwNzhcdTYyOWVcdTUzZWZcdTgwZmRcdTMwNmFcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwZmNcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMNCi0NCi1QcmVkZWNlc3NvckRpYWxvZ19UaXRsZT1cdTUxNDhcdTg4NGNcdTMwYmZcdTMwYjlcdTMwYWZcdTMwNmVcdTRmOWRcdTViNThcdTk1YTJcdTRmYzINCi1QcmVkZWNlc3NvckRpYWxvZ19IZWFkZXJNZXNzYWdlPVx1NTE0OFx1ODg0Y1x1MzBiZlx1MzBiOVx1MzBhZlx1MzA2ZVx1NGY5ZFx1NWI1OFx1OTVhMlx1NGZjMlx1MzBiZlx1MzBhNFx1MzBkN1x1MzA5Mlx1NTE2NVx1NTI5Ylx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NDoNCi1QcmVkZWNlc3NvckRpYWxvZ19JbmRleD1cdTMwYTRcdTMwZjNcdTMwYzdcdTMwYzNcdTMwYWZcdTMwYjk6DQotUHJlZGVjZXNzb3JEaWFsb2dfUHJlc2VudGF0aW9uTmFtZT1cdTg4NjhcdTc5M2FcdTU0MGQ6DQotUHJlZGVjZXNzb3JEaWFsb2dfRGVwZW5kZW5jeT1cdTRmOWRcdTViNThcdTk1YTJcdTRmYzI6DQotUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvckRpYWxvZ1RpdGxlPVx1NTE0OFx1ODg0Y1x1MzBiZlx1MzBiOVx1MzBhZg0KLVByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JNZXNzYWdlPUlVUEEwMDg4RTogXHUzMDUzXHUzMDZlXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ2XHUzMGVjXHUzMGZjXHUzMGFmXHUzMGMwXHUzMGE2XHUzMGYzXHUzMGZiXHUzMGE4XHUzMGVjXHUzMGUxXHUzMGYzXHUzMGM4XHUzMDZiXHUzMDZmXHUzMDAxXHUzMDVkXHUzMDZlIElEIFx1MzA5Mlx1NjMwMVx1MzA2NFx1NTE0OFx1ODg0Y1x1MzBiZlx1MzBiOVx1MzBhZlx1MzA0Y1x1NjVlMlx1MzA2Ylx1NWI1OFx1NTcyOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc190ZXh0RWRpdENlbGxfcHJvYmxlbV9tc2c9SVVQQTAwOTBFOiBcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwZmNcdTdkZThcdTk2YzZcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi1Qcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfY2VsbEVkaXRvcl9pbnZhbGlkUHJlZGNlc3Nvcl9wcm9ibGVtX21zZz1JVVBBMDA4OVc6IFx1NzEyMVx1NTJiOVx1MzA2YVx1NTE0OFx1ODg0Y1x1MzBiZlx1MzBiOVx1MzBhZlx1MzA2ZVx1MzBlYVx1MzBiOVx1MzBjOA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWQ2ZDUxNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uVGl0bGU9XHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNA0KLVByb2Nlc3NfRG9jdW1lbnRJbmZvcm1hdGlvblRpdGxlPVx1YmIzOFx1YzExYyBcdWM4MTVcdWJjZjQNCi1BY3Rpdml0eV9ndWlkYW5jZUluZm9ybWF0aW9uVGl0bGU9XHVjNTQ4XHViMGI0DQotQnJlYWtkb3duRWxlbWVudF9vcHRpb25JbmZvcm1hdGlvblRpdGxlPVx1YmQ4NFx1Yjk1OCBcdWM2MzVcdWMxNTgNCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25UaXRsZT1cdWIyZThcdWFjYzQNCi0NCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVkMGMwXHVjMmE0XHVkMDZjIFx1YzEyNFx1YmE4NVx1Yzc5MFx1Yjk3YyBcdWMyMThcdWQ1ODlcdWQ1NjAgXHViMmU4XHVhY2M0XHViOTdjIFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCB7MH1cdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLVByb2Nlc3NfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCB7MH1cdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmIzOFx1YzExYyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHVjNzc0IFx1YzEyNFx1YmE4NVx1Yzc5MFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotRGVzY3JpcHRvcl9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWMxMjRcdWJhODVcdWM3OTBcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLU1pbGVzdG9uZV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVjNzc0XHVjODE1XHVkNDVjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1NaWxlc3RvbmVfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVjNzc0XHVjODE1XHVkNDVjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1CcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWM3OTFcdWM1YzVcdWJkODRcdWI5NTggXHVjNjk0XHVjMThjKEJyZWFrZG93biBFbGVtZW50KVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNzdjXHViYzE4IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotV29ya0JyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHVjNzc0IFx1Yzc5MVx1YzVjNVx1YmQ4NFx1Yjk1OCBcdWM2OTRcdWMxOGMoV29yayBCcmVha2Rvd24gRWxlbWVudClcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRvbj1cdWM3NzQgXHVjMTI0XHViYTg1XHVjNzkwXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1BY3Rpdml0eV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVkNjVjXHViM2Q5XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi1CcmVha2Rvd25FbGVtZW50X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVjNzkxXHVjNWM1XHViZDg0XHViOTU4IFx1YzY5NFx1YzE4YyhCcmVha2Rvd24gRWxlbWVudClcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmIzOFx1YzExYyBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLUFjdGl2aXR5X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVkNjVjXHViM2Q5XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJiMzhcdWMxMWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1EZXNjcmlwdG9yX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVjMTI0XHViYTg1XHVjNzkwXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJiMzhcdWMxMWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1Qcm9jZXNzX05vbmU9PDwgXHVjNWM2XHVjNzRjID4+DQotUHJvY2Vzc19uYW1lPVx1Yzc3NFx1Yjk4NDoNCi1Qcm9jZXNzX1ByZXNlbnRhdGlvbk5hbWU9XHVkNDVjXHVjMmRjIFx1Yzc3NFx1Yjk4NDoNCi1Qcm9jZXNzX2JyaWVmRGVzY3JpcHRpb249XHVhYzA0XHViN2I1XHVkNTVjIFx1YzEyNFx1YmE4NToNCi1Qcm9jZXNzX21haW5EZXNjcmlwdGlvbj0gXHVhZTMwXHViY2Y4IFx1YzEyNFx1YmE4NToNCi1Qcm9jZXNzX3B1cnBvc2U9XHViYWE5XHVjODAxOg0KLVByb2Nlc3NfcHJlZml4PVx1YzgxMVx1YjQ1MFx1YmQ4MDoNCi0NCi1CcmVha2Rvd25FbGVtZW50X1R5cGVfTmFtZT1cdWM3OTFcdWM1YzVcdWJkODRcdWI5NTggXHVjNjk0XHVjMThjKEJyZWFrZG93biBFbGVtZW50KQ0KLQ0KLVByb2Nlc3NfVHlwZV9UYXNrPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQwYzBcdWMyYTRcdWQwNmM6DQotUHJvY2Vzc19UeXBlX1JvbGU9XHViYTU0XHVjMThjXHViNGRjIFx1YzVlZFx1ZDU2MDoNCi1Qcm9jZXNzX1R5cGVfV29ya1Byb2R1Y3Q9XHViYTU0XHVjMThjXHViNGRjIFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2M6DQotDQotV29ya1Byb2R1Y3RfVHlwZT1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1YzcyMFx1ZDYxNToNCi0NCi1BY3Rpdml0eV9Nb2RlbEluZm89XHViYWE4XHViMzc4IFx1YzgxNVx1YmNmNDoNCi1BY3Rpdml0eV9UeXBlPVx1ZDY1Y1x1YjNkOSBcdWM3MjBcdWQ2MTU6DQotQWN0aXZpdHlfcHJlc2VudGF0aW9uTmFtZT1cdWQ0NWNcdWMyZGMgXHVjNzc0XHViOTg0Og0KLUFjdGl2aXR5X2FsdGVybmF0aXZlcz1cdWIzMDBcdWM1NDg6DQotQWN0aXZpdHlfaG93VG9TdGFmZj1cdWM3NzhcdWI4MjUgXHVhZDZjXHVjMTMxIFx1YmMyOVx1YmM5NToNCi1CcmVha2Rvd25FbGVtZW50X2tleUNvbnNpZGVyYXRpb25zPVx1ZDU3NVx1YzJlYyBcdWFjZTBcdWI4MjRcdWMwYWNcdWQ1NmQ6DQotUHJvY2Vzc191c2FnZUd1aWRhbmNlPVx1YzBhY1x1YzZhOVx1YmM5NSBcdWM1NDhcdWIwYjQ6DQotDQotQWN0aXZpdHlfUm9hZG1hcFRpdGxlPVx1Yjg1Y1x1YjRkY1x1YjlmNQ0KLUFjdGl2aXR5X1JvYWRtYXBEZXNjcmlwdGlvbj1cdWI4NWNcdWI0ZGNcdWI5ZjUgXHVjNTkxXHVjMmRkXHVjNzNjXHViODVjIFx1Y2Q5NFx1YWMwMCBcdWM4MTVcdWJjZjRcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YjljMVx1ZDA2Y1x1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlVGl0bGU9XHVjNzdjXHViYzE4IFx1YzU0OFx1YjBiNA0KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZURlc2NyaXB0aW9uPVx1YzU0OFx1YjBiNCBcdWQ2MTVcdWMyZGRcdWM3M2NcdWI4NWMgXHVjZDk0XHVhYzAwIFx1YzgxNVx1YmNmNFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHViOWMxXHVkMDZjXHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxUaXRsZT1cdWNlZTRcdWJiYTRcdWIyYzhcdWNmMDBcdWM3NzRcdWMxNTggXHVjNzkwXHViOGNjDQotQWN0aXZpdHlfQ29tbXVuaWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb249XHVjZWU0XHViYmE0XHViMmM4XHVjZjAwXHVjNzc0XHVjMTU4IFx1Yzc5MFx1YjhjYyBcdWM1OTFcdWMyZGRcdWM3M2NcdWI4NWMgXHVjZDk0XHVhYzAwIFx1YzgxNVx1YmNmNFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHViOWMxXHVkMDZjXHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbFRpdGxlPVx1YWQ1MFx1YzcyMSBcdWM3OTBcdWI4Y2MNCi1BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uPVx1YWQ1MFx1YzcyMSBcdWM3OTBcdWI4Y2MgXHVjNTkxXHVjMmRkXHVjNzNjXHViODVjIFx1Y2Q5NFx1YWMwMCBcdWM4MTVcdWJjZjRcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YjljMVx1ZDA2Y1x1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotQWN0aXZpdHlfU2VsZWN0ZWRfUm9hZG1hcD1cdWI4NWNcdWI0ZGNcdWI5ZjU6DQotQWN0aXZpdHlfU2VsZWN0ZWRfR2VuZXJhbEd1aWRhbmNlPVx1YzU0OFx1YjBiNDoNCi1BY3Rpdml0eV9TZWxlY3RlZF9Db21tdW5pY2F0aW9uTWF0ZXJpYWw9XHVjZWU0XHViYmE0XHViMmM4XHVjZjAwXHVjNzc0XHVjMTU4IFx1Yzc5MFx1YjhjYzoNCi1BY3Rpdml0eV9TZWxlY3RlZF9FZHVjYXRpb25NYXRlcmlhbD1cdWFkNTBcdWM3MjEgXHVjNzkwXHViOGNjOg0KLQ0KLUFjdGl2aXR5X0RpYWdyYW1UaXRsZT1cdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTgNCi1BY3Rpdml0eV9EaWFncmFtRGVzY3JpcHRpb24gPSBcdWM3NzQgezB9XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTggXHVjNzc0XHViYmY4XHVjOWMwXHViOTdjIFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1BY3Rpdml0eV9BREltYWdlPVx1ZDY1Y1x1YjNkOSBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTgNCi1BY3Rpdml0eV9BRERJbWFnZT1cdWQ2NWNcdWIzZDkgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOA0KLUFjdGl2aXR5X1dQREltYWdlPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjODg1XHVjMThkXHVjMTMxIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOA0KLUFjdGl2aXR5X1VzZUFESW1hZ2U9XHVhY2Y1XHVhYzFjXHViOTdjIFx1YzcwNFx1ZDU3NCBcdWQ2NWNcdWIzZDkgXHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4IFx1YzBhY1x1YzZhOQ0KLUFjdGl2aXR5X1VzZUFEREltYWdlPVx1YWNmNVx1YWMxY1x1Yjk3YyBcdWM3MDRcdWQ1NzQgXHVkNjVjXHViM2Q5IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZCBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTggXHVjMGFjXHVjNmE5DQotQWN0aXZpdHlfVXNlV1BESW1hZ2U9XHVhY2Y1XHVhYzFjXHViOTdjIFx1YzcwNFx1ZDU3NCBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1Yzg4NVx1YzE4ZFx1YzEzMSBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTggXHVjMGFjXHVjNmE5DQotQWN0aXZpdHlfQXNzaWduPVx1YzljMFx1YzgxNS4uLg0KLQ0KLVRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkX1N0ZXBzPVx1YjJlOFx1YWNjNDoNCi1UYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nVGl0bGU9XHViMmU4XHVhY2M0DQotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ01lc3NhZ2U9XHViMmU4XHVhY2M0IFx1YzEyMFx1ZDBkZA0KLQ0KLUFjdGl2aXR5X1dvcmtSb2xsdXA9XHVjNzkxXHVjNWM1IFx1Yjg2NFx1YzVjNQ0KLUFjdGl2aXR5X1RlYW1Sb2xsdXA9XHVkMzAwIFx1Yjg2NFx1YzVjNQ0KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cD1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1Yjg2NFx1YzVjNQ0KLUFjdGl2aXR5X1dvcmtSb2xsdXBEZXNjcmlwdGlvbj1cdWM3NzQgXHVjMTM5XHVjMTU4XHVjNWQwXHVjMTFjIFx1Yzc3NCBcdWQ2NWNcdWIzZDlcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc5MVx1YzVjNSBcdWI4NjRcdWM1YzVcdWM3NDQgXHVhYzgwXHVkMWEwXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLUFjdGl2aXR5X1RlYW1Sb2xsdXBEZXNjcmlwdGlvbj1cdWM3NzQgXHVjMTM5XHVjMTU4XHVjNWQwXHVjMTFjIFx1Yzc3NCBcdWQ2NWNcdWIzZDlcdWM1ZDAgXHViMzAwXHVkNTVjIFx1ZDMwMCBcdWI4NjRcdWM1YzVcdWM3NDQgXHVhYzgwXHVkMWEwXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cERlc2NyaXB0aW9uPVx1Yzc3NCBcdWMxMzlcdWMxNThcdWM1ZDBcdWMxMWMgXHVjNzc0IFx1ZDY1Y1x1YjNkOVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWI4NjRcdWM1YzVcdWM3NDQgXHVhYzgwXHVkMWEwXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX011bHRpcGxlT2N1cnJhbmNlPVx1YjJlNFx1YzkxMSBcdWJjMWNcdWMwZGQNCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9PcHRpb25hbD1cdWMxMjBcdWQwZGRcdWM4MDENCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9QbGFubmVkPVx1YWNjNFx1ZDY4ZFx1YjQyOA0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N1cHJlc3NlZD1cdWM1YjVcdWM4MWNcdWI0MjgNCi0NCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9FdmVudERyaXZlbj1cdWM3NzRcdWJjYTRcdWQyYjhcdWI4NWMgXHVhZDZjXHViM2Q5XHViNDI4DQotV29ya0JyZWFrZG93bkVsZW1lbnRfT25nb2luZz1cdWM5YzRcdWQ1ODkgXHVjOTExXHVjNzg0DQotV29ya0JyZWFrZG93bkVsZW1lbnRfUmVwZWF0YWJsZT1cdWJjMThcdWJjZjUgXHVhYzAwXHViMmE1XHVkNTY4DQotV29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3JzPVx1YzEyMFx1ZDU4OToNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5PVx1Yzg4NVx1YzE4ZFx1YzEzMToNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9JRF9URVhUPVx1YzBjOVx1Yzc3OA0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX1BSRVNFTlRBVElPTl9OQU1FX1RFWFQ9XHVkNDVjXHVjMmRjIFx1Yzc3NFx1Yjk4NA0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0RFUEVOREVOQ1lfVEVYVD1cdWM4ODVcdWMxOGRcdWMxMzENCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0FkZD1cdWNkOTRcdWFjMDANCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0VkaXQ9XHVkM2I4XHVjOWQxDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9SZW1vdmU9XHVjODFjXHVhYzcwDQotDQotV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fU1RBUlQ9XHVjNjQ0XHViOGNjXHVjNWQwXHVjMTFjIFx1YzJkY1x1Yzc5MQ0KLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX0ZJTklTSD1cdWM2NDRcdWI4Y2NcdWM1ZDBcdWMxMWMgXHVjNjQ0XHViOGNjDQotV29ya09yZGVyVHlwZV9TVEFSVF9UT19GSU5JU0g9XHVjMmRjXHVjNzkxXHVjNWQwXHVjMTFjIFx1YzY0NFx1YjhjYw0KLVdvcmtPcmRlclR5cGVfU1RBUlRfVE9fU1RBUlQ9XHVjMmRjXHVjNzkxXHVjNWQwXHVjMTFjIFx1YzJkY1x1Yzc5MQ0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N5bmNocm9uaXplZD1cdWMxOGNcdWMyYTRcdWM2NDAgXHViM2Q5XHVhZTMwXHVkNjU0DQotDQotRGVzY3JpcHRvcl9SZWZpbmVkRGVzY3JpcHRpb249XHVjNzkwXHVjMTM4XHVkNTVjIFx1YzEyNFx1YmE4NToNCi0NCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU9XHVjNWVkXHVkNTYwDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWQwYzBcdWMyYTRcdWQwNmMgXHVjMTI0XHViYTg1XHVjNzkwXHViOTdjIFx1YzIxOFx1ZDU4OVx1ZDU2MCBcdWM1ZWRcdWQ1NjAgXHVjMTI0XHViYTg1XHVjNzkwXHViOTdjIFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTE9XHVhZTMwXHViY2Y4IFx1YzIxOFx1ZDU4OVx1Yzc5MDoNCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9XHVjZDk0XHVhYzAwIFx1YzIxOFx1ZDU4OVx1Yzc5MDoNCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTM9XHVjOWMwXHVjNmQwXHVjNzkwOg0KLQ0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYw0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249XHVjNzc0IFx1ZDBjMFx1YzJhNFx1ZDA2YyBcdWMxMjRcdWJhODVcdWM3OTBcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yzc4NVx1YjgyNSBcdWJjMGYgXHVjZDljXHViODI1IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjMTI0XHViYTg1XHVjNzkwXHViOTdjIFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxPVx1ZDU0NFx1YzIxOCBcdWM3ODVcdWI4MjU6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMj1cdWMxMjBcdWQwZGRcdWM4MDEgXHVjNzg1XHViODI1Og0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTM9XHVjNjc4XHViZDgwIFx1Yzc4NVx1YjgyNToNCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGU0PVx1Y2Q5Y1x1YjgyNToNCi0NCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uVGl0bGU9XHVkMGMwXHVjMmE0XHVkMDZjDQotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPVx1Yzc3NCBcdWM1ZWRcdWQ1NjAgXHVjMTI0XHViYTg1XHVjNzkwXHViMjk0IFx1YjJlNFx1Yzc0YyBcdWQwYzBcdWMyYTRcdWQwNmMgXHVjMTI0XHViYTg1XHVjNzkwXHVjNzU4IFx1YzIxOFx1ZDU4OVx1Yzc5MFx1Yzc4NVx1YjJjOFx1YjJlNC4NCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTE9XHVhZTMwXHViY2Y4IFx1YzIxOFx1ZDU4OVx1Yzc5MDoNCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTI9XHVjZDk0XHVhYzAwIFx1YzIxOFx1ZDU4OVx1Yzc5MDoNCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTM9XHVjOWMwXHVjNmQwXHVjNzkwOg0KLQ0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYw0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249XHVjNzc0IFx1YzVlZFx1ZDU2MCBcdWMxMjRcdWJhODVcdWM3OTBcdWIyOTQgXHViMmU0XHVjNzRjIFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjMTI0XHViYTg1XHVjNzkwXHViOTdjIFx1Y2M0NVx1Yzc4NFx1YzljMFx1YmE3MCBcdWMyMThcdWM4MTVcdWQ1NjlcdWIyYzhcdWIyZTQuDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1cdWNjNDVcdWM3ODQgXHVjMGFjXHVkNTZkOg0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI9XHVjMjE4XHVjODE1Og0KLQ0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU9XHVjNWVkXHVkNTYwDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25EZXNjcmlwdGlvbj1cdWIyZTRcdWM3NGMgXHVjNWVkXHVkNTYwIFx1YzEyNFx1YmE4NVx1Yzc5MFx1YjI5NCBcdWM3NzQgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWMxMjRcdWJhODVcdWM3OTBcdWI5N2MgXHVjYzQ1XHVjNzg0XHVjOWMwXHViYTcwIFx1YzIxOFx1YzgxNVx1ZDU2OVx1YjJjOFx1YjJlNC4NCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfVGFibGUxPVx1Y2M0NVx1Yzc4NCBcdWMwYWNcdWQ1NmQ6DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMj1cdWMyMThcdWM4MTU6DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1R5cGU9XHVjNzIwXHVkNjE1Og0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGU9XHVkNjVjXHViM2Q5IFx1YzJkY1x1Yzc5MSBcdWMwYzFcdWQwZGM6DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlPVx1ZDY1Y1x1YjNkOSBcdWM4ODVcdWI4Y2MgXHVjMGMxXHVkMGRjOg0KLQ0KLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvblRpdGxlPVx1Yzc3OFx1YjNjNFx1YmIzYyBcdWQzMGNcdWQyYjgNCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25EZXNjcmlwdGlvbj1cdWM3NzhcdWIzYzRcdWJiM2NcdWM1ZDBcdWIyOTQgXHViMmU0XHVjNzRjXHVhY2ZjIFx1YWMxOVx1Yzc0MCBcdWM3NzhcdWIzYzRcdWJiM2MgXHVkMzBjXHVkMmI4XHVhYzAwIFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1RhYmxlMT1cdWM3NzhcdWIzYzRcdWJiM2MgXHVkMzBjXHVkMmI4DQotDQotUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uVGl0bGU9XHVkMzAwDQotUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uRGVzY3JpcHRpb249XHVjNzc0IFx1YzVlZFx1ZDU2MCBcdWMxMjRcdWJhODVcdWM3OTBcdWIyOTQgXHViMmU0XHVjNzRjIFx1ZDMwMFx1Yzc0NCBcdWNjMzhcdWM4NzBcdWQ1NjlcdWIyYzhcdWIyZTQuDQotUm9sZURlc2NyaXB0b3JfVGVhbV9UYWJsZTE9XHVkMzAwOg0KLQ0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uVGl0bGU9XHVjNWVkXHVkNTYwDQotQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbj1cdWM3NzQgXHVjZWY0XHVkM2VjXHVjOWMwXHVkMmI4IFx1YzVlZFx1ZDU2MFx1YzVkMFx1YjI5NCBcdWIyZTRcdWM3NGNcdWFjZmMgXHVhYzE5XHVjNzQwIFx1YzlkMVx1YWNjNFx1YjQxYyBcdWM1ZWRcdWQ1NjBcdWM3NzQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0Lg0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9UYWJsZTE9XHVjOWQxXHVhY2M0XHViNDFjIFx1YzVlZFx1ZDU2MDoNCi0NCi1UZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25UaXRsZT1cdWM1ZWRcdWQ1NjANCi1UZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbj1cdWQzMDAgXHVkNTA0XHViODVjXHVkMzBjXHVjNzdjXHVjNWQwXHVjMTFjIFx1YzVlZFx1ZDU2MFx1Yzc0NCBcdWNkOTRcdWFjMDAgXHViNjEwXHViMjk0IFx1YzgxY1x1YWM3MFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1UZWFtUHJvZmlsZV9Sb2xlX1RhYmxlMT1cdWM1ZWRcdWQ1NjA6DQotDQotUHJvY2Vzc19SaWNoVGV4dF9Db2xsYXBzZUltYWdlPWNvbGxhcHNlZC5naWYNCi1Qcm9jZXNzX1JpY2hUZXh0X0V4cGFuZEltYWdlPWV4cGFuZGVkLmdpZg0KLVByb2Nlc3NfQWRkPVx1Y2Q5NFx1YWMwMC4uLg0KLVByb2Nlc3NfQWRkRnJvbVByb2Nlc3M9XHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHVjNWQwXHVjMTFjIFx1Y2Q5NFx1YWMwMC4uLg0KLVByb2Nlc3NfUmVuYW1lX01lc3NhZ2U9XHVjNzc0IFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1Yzc1OCBcdWM3NzRcdWI5ODRcdWM3NDQgXHViY2MwXHVhY2JkXHVkNTU4XHViODI0XHVhY2UwIFx1ZDU2OVx1YjJjOFx1YjJlNC4gXHVhZGY4XHViN2VjXHViYTc0IFx1Yzc3NCBcdWQzYjhcdWM5ZDFcdWFlMzBcdWFjMDAgXHVjODAwXHVjN2E1XHViNDE4XHVhY2UwIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWQzZjRcdWIzNTQgXHVjNzc0XHViOTg0XHVjNzc0IFx1YzBjOFx1Yjg1Y1x1YzZiNCBcdWM3NzRcdWI5ODRcdWM3M2NcdWI4NWMgXHViYzE0XHViMDFkXHViMmM4XHViMmU0LiBcdWFjYzRcdWMxOGRcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotUHJvY2Vzc19SZW1vdmU9XHVjODFjXHVhYzcwDQotUHJvY2Vzc19VcD1cdWM3MDRcdWI4NWMNCi1Qcm9jZXNzX0Rvd249XHVjNTQ0XHViNzk4XHViODVjDQotUHJvY2Vzc19NdWx0aXBsZVNlbGVjdGlvbj1cdWJjZjVcdWMyMTggXHVjMTIwXHVkMGRkDQotUHJvY2Vzc19CdXR0b25fTGlua01ldGhvZEVsZW1lbnQ9XHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4YyBcdWI5YzFcdWQwNmMuLi4NCi0NCi0jIyBFcnJvci9XYXJuaW5nDQotUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlPVx1YzYyY1x1YmMxNFx1Yjk3NFx1YzljMCBcdWM1NGFcdWM3NDAgXHVjNzc0XHViOTg0DQotUHJvY2Vzc19JbnZhbGlkTmFtZT1JVVBBMDA4MUU6IFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWJlNDRcdWM2Y2NcdWI0NTggXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNjJjXHViYzE0XHViOTc4IFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotUHJvY2Vzc19SZW5hbWVfVGl0bGU9XHVjNzc0XHViOTg0IFx1YmMxNFx1YWZiOFx1YWUzMA0KLVByb2Nlc3NfSW52YWxpZFByZXNlbnRhdGlvbk5hbWU9SVVQQTAwODJFOiBcdWQ0NWNcdWMyZGMgXHVjNzc0XHViOTg0XHVjNzQ0IFx1YmU0NFx1YzZjY1x1YjQ1OCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcdWM2MmNcdWJjMTRcdWI5NzggXHVkNDVjXHVjMmRjIFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotUHJvY2Vzc19MaW5rTWV0aG9kRWxlbWVudFRpdGxlPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWM2OTRcdWMxOGMgXHViOWMxXHVkMDZjDQotUHJvY2Vzc19JbnZhbGlkTGlua01ldGhvZEVsZW1lbnQ9SVVQQTAwODNFOiBcdWM3NzQgXHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4Y1x1Yjk3YyBcdWIzZDlcdWM3N2NcdWQ1NWMgXHVjMGMxXHVjNzA0XHVjNzU4IFx1YjJlNFx1Yjk3OCBcdWMxMjRcdWJhODVcdWM3OTBcdWM1ZDAgXHVjNzc0XHViYmY4IFx1YzBhY1x1YzZhOVx1ZDU1OFx1YWNlMCBcdWM3ODhcdWFlMzAgXHViNTRjXHViYjM4XHVjNWQwICcnezB9JydcdWM1ZDAgXHViOWMxXHVkMDZjXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotUHJvY2Vzc19Bc3NpZ25tZW50SW5mb1RpdGxlPVx1YzgxNVx1YmNmNA0KLVByb2Nlc3NfVGVhbUFzc2lnbkVycm9yPUlVUEEwMDg0RTogJyd7MH0nJ1x1Yzc0NChcdWI5N2MpICcnezF9JycgXHVkMzAwXHVjNWQwIFx1Y2Q5NFx1YWMwMFx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcblxuXHVkMzAwXHVjNWQwIFx1YmMzMFx1YzgxNVx1ZDU1OFx1YjgyNFx1YmE3NCBcdWM1ZWRcdWQ1NjAgXHVjMTI0XHViYTg1XHVjNzkwXHVjNWQwIFx1YzVmMFx1YWQwMFx1YjQxYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNjk0XHVjMThjIFx1YzVlZFx1ZDU2MFx1Yzc3NCBcdWM3ODhcdWM1YjRcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0LlxuXG5cdWJhM2NcdWM4MDAgXHVjNWYwXHVhZDAwXHVjNzQ0IFx1YzIxOFx1YzgxNVx1ZDU1OFx1YWNlMCBcdWIyZTRcdWMyZGMgXHVjMmRjXHViM2M0XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLVByb2Nlc3NfVGVhbURpYWxvZ01lc3NhZ2U9XHVkMzAwIFx1YzEyMFx1ZDBkZA0KLVByb2Nlc3NfVGVhbURpYWxvZ1RpdGxlPVx1ZDMwMA0KLQ0KLVByb2Nlc3NfRGVsaXZlcmFibGVBc3NpZ25FcnJvcj1JVVBBMDA4NUU6IFx1YzVmMFx1YWQwMFx1YjQxYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNjk0XHVjMThjIFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2NcdWM3NzQgXHVjNWM2XHVhZTMwIFx1YjU0Y1x1YmIzOFx1YzVkMCAnJ3swfScnXHVjNzQ0KFx1Yjk3YykgJyd7MX0nJyBcdWM3NzhcdWIzYzRcdWJiM2NcdWM1ZDAgXHVjZDk0XHVhYzAwXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotUHJvY2Vzc19Db21wb3NpdGVSb2xlQXNzaWduRXJyb3I9SVVQQTAwODZFOiBcdWM1ZjBcdWFkMDBcdWI0MWMgXHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4YyBcdWM1ZWRcdWQ1NjBcdWM3NzQgXHVjNWM2XHVhZTMwIFx1YjU0Y1x1YmIzOFx1YzVkMCAnJ3swfScnXHVjNzQ0KFx1Yjk3YykgJyd7MX0nJyBcdWNlZjRcdWQzZWNcdWM5YzBcdWQyYjggXHVjNWVkXHVkNTYwXHVjNWQwIFx1Y2Q5NFx1YWMwMFx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLVByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyTWVzc2FnZT1JVVBBMDA4N1c6IFx1YzEyMFx1ZDU4OVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNjJjXHViYzE0XHViOTc4IFx1YmM4OFx1ZDYzOFx1Yjk3YyBcdWM3ODVcdWI4MjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJUaXRsZT1cdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjNzQwIFx1YzEyMFx1ZDU4OSBJZA0KLQ0KLVByb2Nlc3NfTm9JdGVtcz1cdWQ1NmRcdWJhYTlcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVjOWMwIFx1YzU0YVx1YzU1OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1Qcm9jZXNzX0l0ZW1zU2VsZWN0ZWQ9ezB9XHVhYzFjIFx1ZDU2ZFx1YmFhOVx1Yzc3NCBcdWMxMjBcdWQwZGRcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuDQotUHJvY2Vzc19Ob1Byb3BlcnRpZXNBdmFpbGFibGU9XHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWQyYjlcdWMxMzFcdWM3NzQgXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLVByZWRlY2Vzc29yRGlhbG9nX1RpdGxlPVx1YzEyMFx1ZDU4OSBcdWM4ODVcdWMxOGRcdWMxMzENCi1QcmVkZWNlc3NvckRpYWxvZ19IZWFkZXJNZXNzYWdlPVx1YzEyMFx1ZDU4OVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjODg1XHVjMThkXHVjMTMxIFx1YzcyMFx1ZDYxNVx1Yzc0NCBcdWM3ODVcdWI4MjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotUHJlZGVjZXNzb3JEaWFsb2dfSW5kZXg9XHVjMGM5XHVjNzc4Og0KLVByZWRlY2Vzc29yRGlhbG9nX1ByZXNlbnRhdGlvbk5hbWU9XHVkNDVjXHVjMmRjIFx1Yzc3NFx1Yjk4NDoNCi1QcmVkZWNlc3NvckRpYWxvZ19EZXBlbmRlbmN5PVx1Yzg4NVx1YzE4ZFx1YzEzMToNCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yRGlhbG9nVGl0bGU9XHVjMTIwXHVkNTg5DQotUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvck1lc3NhZ2U9SVVQQTAwODhFOiBcdWQ1NzRcdWIyZjkgSURcdWI5N2MgXHVhYzAwXHVjOWM0IFx1YzEyMFx1ZDU4OVx1Yzc3NCBcdWM3NzQgXHVjNzkxXHVjNWM1XHViZDg0XHViOTU4IFx1YzY5NFx1YzE4Y1x1YzVkMCBcdWM3NzRcdWJiZjggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc190ZXh0RWRpdENlbGxfcHJvYmxlbV9tc2c9SVVQQTAwOTBFOiBcdWQyYjlcdWMxMzFcdWM3NDQgXHVkM2I4XHVjOWQxXHVkNTU4XHViMjk0IFx1YzkxMVx1YzVkMCBcdWM2MjRcdWI5NThcdWFjMDAgXHViYzFjXHVjMGRkXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0Lg0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc19jZWxsRWRpdG9yX2ludmFsaWRQcmVkY2Vzc29yX3Byb2JsZW1fbXNnPUlVUEEwMDg5VzogXHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWMxMjBcdWQ1ODkgXHViYWE5XHViODVkDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZjRhZTYxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25UaXRsZT1JbmZvcm1hXHUwMGU3XHUwMGY1ZXMgR2VyYWlzDQotUHJvY2Vzc19Eb2N1bWVudEluZm9ybWF0aW9uVGl0bGU9SW5mb3JtYVx1MDBlN1x1MDBmNWVzIHNvYnJlIERvY3VtZW50YVx1MDBlN1x1MDBlM28NCi1BY3Rpdml0eV9ndWlkYW5jZUluZm9ybWF0aW9uVGl0bGU9T3JpZW50YVx1MDBlN1x1MDBlM28NCi1CcmVha2Rvd25FbGVtZW50X29wdGlvbkluZm9ybWF0aW9uVGl0bGU9T3BcdTAwZTdcdTAwZjVlcyBkZSBEaXZpc1x1MDBlM28NCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25UaXRsZT1FdGFwYXMNCi0NCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Fc3BlY2lmaXF1ZSBhcyBldGFwYXMgcGFyYSBkZXNlbXBlbmhhciBlc3RlIGRlc2NyaXRvciBkZSB0YXJlZmEuDQotDQotUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RlL2VzdGEgezB9Lg0KLVByb2Nlc3NfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgc29icmUgZG9jdW1lbnRhXHUwMGU3XHUwMGUzbyBzb2JyZSBlc3RlL2VzdGEgezB9Lg0KLQ0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBnZXJhaXMgc29icmUgZXN0ZSBkZXNjcml0b3IuDQotRGVzY3JpcHRvcl9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZGV0YWxoYWRhcyBzb2JyZSBlc3RlIGRlc2NyaXRvci4NCi1NaWxlc3RvbmVfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249Rm9ybmVcdTAwZTdhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBnZXJhaXMgc29icmUgZXN0ZSBtYXJjby4NCi1NaWxlc3RvbmVfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRldGFsaGFkYXMgc29icmUgZXN0ZSBtYXJjby4NCi0NCi1CcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGUgZWxlbWVudG8gZGUgZGl2aXNcdTAwZTNvLg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgZ2VyYWlzIHNvYnJlIGVzdGUgZWxlbWVudG8gZGUgZGl2aXNcdTAwZTNvIGRlIHRyYWJhbGhvLg0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRvbj1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RlIGRlc2NyaXRvci4NCi1BY3Rpdml0eV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGdlcmFpcyBzb2JyZSBlc3RhIGF0aXZpZGFkZS4NCi0NCi1CcmVha2Rvd25FbGVtZW50X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIHNvYnJlIGRvY3VtZW50YVx1MDBlN1x1MDBlM28gc29icmUgZXN0ZSBlbGVtZW50byBkZSBkaXZpc1x1MDBlM28uDQotQWN0aXZpdHlfRG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUZvcm5lXHUwMGU3YSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgc29icmUgZG9jdW1lbnRhXHUwMGU3XHUwMGUzbyBzb2JyZSBlc3RhIGF0aXZpZGFkZS4NCi1EZXNjcmlwdG9yX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Gb3JuZVx1MDBlN2EgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIHNvYnJlIGRvY3VtZW50YVx1MDBlN1x1MDBlM28gc29icmUgZXN0ZSBkZXNjcml0b3IuDQotUHJvY2Vzc19Ob25lPTw8IE5FTkhVTSA+Pg0KLVByb2Nlc3NfbmFtZT1Ob21lOg0KLVByb2Nlc3NfUHJlc2VudGF0aW9uTmFtZT1Ob21lIGRhIGFwcmVzZW50YVx1MDBlN1x1MDBlM286DQotUHJvY2Vzc19icmllZkRlc2NyaXB0aW9uPURlc2NyaVx1MDBlN1x1MDBlM28gcmVzdW1pZGE6DQotUHJvY2Vzc19tYWluRGVzY3JpcHRpb249IERlc2NyaVx1MDBlN1x1MDBlM28gcHJpbmNpcGFsOg0KLVByb2Nlc3NfcHVycG9zZT1PYmpldGl2bzoNCi1Qcm9jZXNzX3ByZWZpeD1QcmVmaXhvOg0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfVHlwZV9OYW1lPUVsZW1lbnRvIGRlIERpdmlzXHUwMGUzbw0KLQ0KLVByb2Nlc3NfVHlwZV9UYXNrPVRhcmVmYSBkbyBtXHUwMGU5dG9kbzoNCi1Qcm9jZXNzX1R5cGVfUm9sZT1GdW5cdTAwZTdcdTAwZTNvIGRvIG1cdTAwZTl0b2RvOg0KLVByb2Nlc3NfVHlwZV9Xb3JrUHJvZHVjdD1Qcm9kdXRvIGRlIHRyYWJhbGhvIGRvIG1cdTAwZTl0b2RvOg0KLQ0KLVdvcmtQcm9kdWN0X1R5cGU9VGlwbyBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvOg0KLQ0KLUFjdGl2aXR5X01vZGVsSW5mbz1JbmZvcm1hXHUwMGU3XHUwMGY1ZXMgc29icmUgbyBtb2RlbG86DQotQWN0aXZpdHlfVHlwZT1UaXBvIGRlIEF0aXZpZGFkZToNCi1BY3Rpdml0eV9wcmVzZW50YXRpb25OYW1lPU5vbWUgZGEgYXByZXNlbnRhXHUwMGU3XHUwMGUzbzoNCi1BY3Rpdml0eV9hbHRlcm5hdGl2ZXM9QWx0ZXJuYXRpdmFzOg0KLUFjdGl2aXR5X2hvd1RvU3RhZmY9Q29tbyBNb250YXIgYSBFcXVpcGU6DQotQnJlYWtkb3duRWxlbWVudF9rZXlDb25zaWRlcmF0aW9ucz1Db25zaWRlcmFcdTAwZTdcdTAwZjVlcyBjaGF2ZToNCi1Qcm9jZXNzX3VzYWdlR3VpZGFuY2U9T3JpZW50YVx1MDBlN1x1MDBlM28gc29icmUgVXNvOg0KLQ0KLUFjdGl2aXR5X1JvYWRtYXBUaXRsZT1NYXBhcyBkZSBSb3Rhcw0KLUFjdGl2aXR5X1JvYWRtYXBEZXNjcmlwdGlvbj1Gb3JuZVx1MDBlN2EgbGlua3MgcGFyYSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcyBuYSBmb3JtYSBkZSByb3RlaXJvcy4NCi1BY3Rpdml0eV9HZW5lcmFsR3VpZGFuY2VUaXRsZT1PcmllbnRhXHUwMGU3XHUwMGUzbyBHZXJhbA0KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZURlc2NyaXB0aW9uPUZvcm5lXHUwMGU3YSBsaW5rcyBwYXJhIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBhZGljaW9uYWlzIG5hIGZvcm1hIGRlIG9yaWVudGFcdTAwZTdcdTAwZTNvLg0KLUFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbFRpdGxlPU1hdGVyaWFpcyBkZSBDb211bmljYVx1MDBlN1x1MDBlM28NCi1BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbj1Gb3JuZVx1MDBlN2EgbGlua3MgcGFyYSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcyBuYSBmb3JtYSBkZSBtYXRlcmlhaXMgZGUgY29tdW5pY2FcdTAwZTdcdTAwZTNvLg0KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsVGl0bGU9TWF0ZXJpYWlzIGRlIEVkdWNhXHUwMGU3XHUwMGUzbw0KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb249Rm9ybmVcdTAwZTdhIGxpbmtzIHBhcmEgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGFkaWNpb25haXMgbmEgZm9ybWEgZGUgbWF0ZXJpYWlzIGRlIGVkdWNhXHUwMGU3XHUwMGUzby4NCi0NCi1BY3Rpdml0eV9TZWxlY3RlZF9Sb2FkbWFwPVJvdGVpcm9zOg0KLUFjdGl2aXR5X1NlbGVjdGVkX0dlbmVyYWxHdWlkYW5jZT1PcmllbnRhXHUwMGU3XHUwMGUzbzoNCi1BY3Rpdml0eV9TZWxlY3RlZF9Db21tdW5pY2F0aW9uTWF0ZXJpYWw9TWF0ZXJpYWlzIGRlIENvbXVuaWNhXHUwMGU3XHUwMGUzbzoNCi1BY3Rpdml0eV9TZWxlY3RlZF9FZHVjYXRpb25NYXRlcmlhbD1NYXRlcmlhaXMgZGUgRWR1Y2FcdTAwZTdcdTAwZTNvOg0KLQ0KLUFjdGl2aXR5X0RpYWdyYW1UaXRsZT1EaWFncmFtYQ0KLUFjdGl2aXR5X0RpYWdyYW1EZXNjcmlwdGlvbiA9IEZvcm5lY2VyIGltYWdlbnMgZGUgZGlhZ3JhbWEgcGFyYSBlc3RlIHswfS4NCi1BY3Rpdml0eV9BREltYWdlPURpYWdyYW1hIGRlIEF0aXZpZGFkZXMNCi1BY3Rpdml0eV9BRERJbWFnZT1EaWFncmFtYSBkZSBEZXRhbGhlcyBkZSBBdGl2aWRhZGVzDQotQWN0aXZpdHlfV1BESW1hZ2U9RGlhZ3JhbWEgZGUgRGVwZW5kXHUwMGVhbmNpYSBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotQWN0aXZpdHlfVXNlQURJbWFnZT1VdGlsaXphciBEaWFncmFtYSBkZSBBdGl2aWRhZGVzIHBhcmEgUHVibGljYVx1MDBlN1x1MDBlM28NCi1BY3Rpdml0eV9Vc2VBRERJbWFnZT1VdGlsaXphciBEaWFncmFtYSBkZSBEZXRhbGhlcyBkZSBBdGl2aWRhZGUgcGFyYSBQdWJsaWNhXHUwMGU3XHUwMGUzbw0KLUFjdGl2aXR5X1VzZVdQREltYWdlPVV0aWxpemFyIERpYWdyYW1hIGRlIERlcGVuZFx1MDBlYW5jaWEgZGUgUHJvZHV0byBwYXJhIFB1YmxpY2FcdTAwZTdcdTAwZTNvDQotQWN0aXZpdHlfQXNzaWduPURlc2lnbmFyLi4uDQotDQotVGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRfU3RlcHM9RXRhcGFzOg0KLVRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dUaXRsZT1FdGFwYXMNCi1UYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nTWVzc2FnZT1TZWxlY2lvbmFyIGFzIGV0YXBhcw0KLQ0KLUFjdGl2aXR5X1dvcmtSb2xsdXA9TGlzdGEgZG8gVHJhYmFsaG8NCi1BY3Rpdml0eV9UZWFtUm9sbHVwPUxpc3RhIGRhIEVxdWlwZQ0KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cD1MaXN0YSBkZSBQcm9kdXRvcyBkZSBUcmFiYWxobw0KLUFjdGl2aXR5X1dvcmtSb2xsdXBEZXNjcmlwdGlvbj1SZXZpc2FyIGEgbGlzdGEgZGUgdHJhYmFsaG9zIHBhcmEgZXN0YSBhdGl2aWRhZGUgbmVzdGEgc2VcdTAwZTdcdTAwZTNvLg0KLUFjdGl2aXR5X1RlYW1Sb2xsdXBEZXNjcmlwdGlvbj1SZXZpc2FyIGEgbGlzdGEgZGUgZXF1aXBlIHBhcmEgZXN0YSBhdGl2aWRhZGUgbmVzdGEgc2VcdTAwZTdcdTAwZTNvLg0KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cERlc2NyaXB0aW9uPVJldmlzYXIgYSBsaXN0YSBkZSBwcm9kdXRvcyBkZSB0cmFiYWxobyBwYXJhIGVzdGEgYXRpdmlkYWRlIG5lc3RhIHNlXHUwMGU3XHUwMGUzby4NCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9NdWx0aXBsZU9jdXJyYW5jZT1NXHUwMGZhbHRpcGxhcyBPY29yclx1MDBlYW5jaWFzDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fT3B0aW9uYWw9T3BjaW9uYWwNCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9QbGFubmVkPVBsYW5lamFkbw0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N1cHJlc3NlZD1TdXByaW1pZG8NCi0NCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9FdmVudERyaXZlbj1PcmllbnRhZG8gcG9yIEV2ZW50bw0KLVdvcmtCcmVha2Rvd25FbGVtZW50X09uZ29pbmc9RW0gQW5kYW1lbnRvDQotV29ya0JyZWFrZG93bkVsZW1lbnRfUmVwZWF0YWJsZT1SZXBldFx1MDBlZHZlbA0KLVdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29ycz1QcmVkZWNlc3NvcmVzOg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3k9RGVwZW5kXHUwMGVhbmNpYToNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9JRF9URVhUPVx1MDBjZG5kaWNlDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfUFJFU0VOVEFUSU9OX05BTUVfVEVYVD1Ob21lIGRlIEFwcmVzZW50YVx1MDBlN1x1MDBlM28NCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9ERVBFTkRFTkNZX1RFWFQ9RGVwZW5kXHUwMGVhbmNpYQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQWRkPUluY2x1aXINCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0VkaXQ9RWRpdGFyDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9SZW1vdmU9UmVtb3Zlcg0KLQ0KLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX1NUQVJUPURvIEZpbmFsIGFvIEluXHUwMGVkY2lvDQotV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fRklOSVNIPURvIEZpbmFsIGFvIEZpbmFsDQotV29ya09yZGVyVHlwZV9TVEFSVF9UT19GSU5JU0g9RG8gSW5cdTAwZWRjaW8gYW8gRmluYWwNCi1Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX1NUQVJUPURvIEluXHUwMGVkY2lvIGFvIEluXHUwMGVkY2lvDQotDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3luY2hyb25pemVkPVNpbmNyb25pemFkbyBjb20gYSBvcmlnZW0NCi0NCi1EZXNjcmlwdG9yX1JlZmluZWREZXNjcmlwdGlvbj1EZXNjcmlcdTAwZTdcdTAwZTNvIHJlZmluYWRhOg0KLQ0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1GdW5cdTAwZTdcdTAwZjVlcw0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25EZXNjcmlwdGlvbj1EZXNpZ25lIG9zIGRlc2NyaXRvcmVzIGRlIGZ1blx1MDBlN1x1MDBlM28gcGFyYSBkZXNlbXBlbmhhciBlc3RlIGRlc2NyaXRvciBkZSB0YXJlZmEuDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUxPUV4ZWN1dG9yIFByaW1cdTAwZTFyaW86DQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUyPUV4ZWN1dG9yZXMgQWRpY2lvbmFpczoNCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTM9QXNzaXN0aWRvIHBvcjoNCi0NCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlPVByb2R1dG9zIGRlIFRyYWJhbGhvDQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbj1Fc3BlY2lmaXF1ZSBvcyBkZXNjcml0b3JlcyBkZSB0cmFiYWxobyBkZSBlbnRyYWRhIGUgZGUgc2FcdTAwZWRkYSBwYXJhIGVzdGUgZGVzY3JpdG9yIGRlIHRhcmVmYS4NCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxPUVudHJhZGEgT2JyaWdhdFx1MDBmM3JpYToNCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyPUVudHJhZGEgT3BjaW9uYWw6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMz1FbnRyYWRhIEV4dGVybmE6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlND1TYVx1MDBlZGRhOg0KLQ0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1NlY3Rpb25UaXRsZT1UYXJlZmFzDQotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPUVzdGUgZGVzY3JpdG9yIGRlIGZ1blx1MDBlN1x1MDBlM28gXHUwMGU5IGV4ZWN1dG9yIGRvcyBkZXNjcml0b3JlcyBkZSB0YXJlZmEgYSBzZWd1aXIuDQotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUxPUV4ZWN1dG9yIFByaW1cdTAwZTFyaW86DQotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUyPUV4ZWN1dG9yZXMgQWRpY2lvbmFpczoNCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTM9QXNzaXN0aWRvIHBvcjoNCi0NCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlPVByb2R1dG9zIGRlIFRyYWJhbGhvDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbj1Fc3RlIGRlc2NyaXRvciBkZSBmdW5cdTAwZTdcdTAwZTNvIFx1MDBlOSByZXNwb25zXHUwMGUxdmVsIHBvciBlIG1vZGlmaWNhIG9zIGRlc2NyaXRvcmVzIGRlIHByb2R1dG8gZGUgdHJhYmFsaG8gYSBzZWd1aXIuDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1SZXNwb25zXHUwMGUxdmVsIHBvcjoNCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyPU1vZGlmaWNhOg0KLQ0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU9RnVuXHUwMGU3XHUwMGY1ZXMNCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPU9zIGRlc2NyaXRvcmVzIGRlIGZ1blx1MDBlN1x1MDBlM28gYSBzZWd1aXIgc1x1MDBlM28gcmVzcG9uc1x1MDBlMXZlaXMgcG9yIGUgbW9kaWZpY2FtIGVzdGUgZGVzY3JpdG9yIGRlIHByb2R1dG8gZGUgdHJhYmFsaG8uDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMT1SZXNwb25zXHUwMGUxdmVsIHBvcjoNCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfVGFibGUyPU1vZGlmaWNhZG8gcG9yOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9UeXBlPVRpcG86DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZT1Fc3RhZG8gZGUgRW50cmFkYSBkYSBBdGl2aWRhZGU6DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlPUVzdGFkbyBkZSBTYVx1MDBlZGRhIGRhIEF0aXZpZGFkZToNCi0NCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25UaXRsZT1QYXJ0ZXMgRGlzdHJpYnVcdTAwZWR2ZWlzDQotV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9TZWN0aW9uRGVzY3JpcHRpb249TyBkaXN0cmlidVx1MDBlZHZlbCB0ZW0gYXMgcGFydGVzIGRpc3RyaWJ1XHUwMGVkdmVpcyBhIHNlZ3Vpci4NCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1RhYmxlMT1QYXJ0ZXMgRGlzdHJpYnVcdTAwZWR2ZWlzDQotDQotUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uVGl0bGU9RXF1aXBlcw0KLVJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvbkRlc2NyaXB0aW9uPUVzdGUgZGVzY3JpdG9yIGRlIGZ1blx1MDBlN1x1MDBlM28gcmVmZXJlLXNlIFx1MDBlMHMgZXF1aXBlcyBhIHNlZ3Vpci4NCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1RhYmxlMT1FcXVpcGVzOg0KLQ0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uVGl0bGU9RnVuXHUwMGU3XHUwMGY1ZXMNCi1Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uPUVzdGEgZnVuXHUwMGU3XHUwMGUzbyBjb21wb3N0YSB0ZW0gYXMgZnVuXHUwMGU3XHUwMGY1ZXMgYWdyZWdhZGFzIGEgc2VndWlyLg0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9UYWJsZTE9RnVuXHUwMGU3XHUwMGY1ZXMgQWdyZWdhZGFzOg0KLQ0KLVRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvblRpdGxlPUZ1blx1MDBlN1x1MDBmNWVzDQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb249SW5jbHVpciBvdSByZW1vdmVyIGZ1blx1MDBlN1x1MDBmNWVzIHBhcmEvZGUgcGVyZmlzIGRlIGVxdWlwZS4NCi1UZWFtUHJvZmlsZV9Sb2xlX1RhYmxlMT1GdW5cdTAwZTdcdTAwZjVlczoNCi0NCi1Qcm9jZXNzX1JpY2hUZXh0X0NvbGxhcHNlSW1hZ2U9Y29sbGFwc2VkLmdpZg0KLVByb2Nlc3NfUmljaFRleHRfRXhwYW5kSW1hZ2U9ZXhwYW5kZWQuZ2lmDQotUHJvY2Vzc19BZGQ9SW5jbHVpci4uLg0KLVByb2Nlc3NfQWRkRnJvbVByb2Nlc3M9SW5jbHVpciBkZSBQcm9jZXNzby4uLg0KLVByb2Nlc3NfUmVuYW1lX01lc3NhZ2U9Vm9jXHUwMGVhIGVzdFx1MDBlMSBwcmVzdGVzIGEgYWx0ZXJhciBvIG5vbWUgZGVzdGUgcHJvY2Vzc28uIElzc28gc2FsdmFyXHUwMGUxIGVzdGUgZWRpdG9yIGUgcmVub21lYXJcdTAwZTEgYSBwYXN0YSBkbyBwcm9jZXNzbyBjb20gbyBub3ZvIG5vbWUuIERlc2VqYSBjb250aW51YXI/DQotUHJvY2Vzc19SZW1vdmU9UmVtb3Zlcg0KLVByb2Nlc3NfVXA9UGFyYSBDaW1hDQotUHJvY2Vzc19Eb3duPVBhcmEgQmFpeG8NCi1Qcm9jZXNzX011bHRpcGxlU2VsZWN0aW9uPVNlbGVcdTAwZTdcdTAwZTNvIE1cdTAwZmFsdGlwbGENCi1Qcm9jZXNzX0J1dHRvbl9MaW5rTWV0aG9kRWxlbWVudD1MaW5rIGRlIEVsZW1lbnRvIGRlIE1cdTAwZTl0b2RvLi4uDQotDQotIyMgRXJyb3IvV2FybmluZw0KLVByb2Nlc3NfSW52YWxpZE5hbWVUaXRsZT1Ob21lIGludlx1MDBlMWxpZG8NCi1Qcm9jZXNzX0ludmFsaWROYW1lPUlVUEEwMDgxRTogTyBub21lIG5cdTAwZTNvIHBvZGUgc2VyIHZhemlvLiBFc3BlY2lmaXF1ZSB1bSBub21lIHZcdTAwZTFsaWRvLg0KLVByb2Nlc3NfUmVuYW1lX1RpdGxlPVJlbm9tZWFyDQotUHJvY2Vzc19JbnZhbGlkUHJlc2VudGF0aW9uTmFtZT1JVVBBMDA4MkU6IE8gbm9tZSBkZSBhcHJlc2VudGFcdTAwZTdcdTAwZTNvIG5cdTAwZTNvIHBvZGUgc2VyIHZhemlvLiBFc3BlY2lmaXF1ZSB1bSBub21lIGRlIGFwcmVzZW50YVx1MDBlN1x1MDBlM28gdlx1MDBlMWxpZG8uDQotUHJvY2Vzc19MaW5rTWV0aG9kRWxlbWVudFRpdGxlPUxpbmsgZGUgRWxlbWVudG8gZGUgTVx1MDBlOXRvZG8NCi1Qcm9jZXNzX0ludmFsaWRMaW5rTWV0aG9kRWxlbWVudD1JVVBBMDA4M0U6IEltcG9zc1x1MDBlZHZlbCBmYXplciBsaW5rIHBhcmEgJyd7MH0nJyBwb3JxdWUgZXNzZSBNZXRob2RFbGVtZW50IGpcdTAwZTEgZXN0XHUwMGUxIHNlbmRvIHV0aWxpemFkbyBwYXJhIG91dHJvIGRlc2NyaXRvciBzb2IgbyBtZXNtbyBwYWkuDQotUHJvY2Vzc19Bc3NpZ25tZW50SW5mb1RpdGxlPUluZm9ybWFcdTAwZTdcdTAwZjVlcw0KLVByb2Nlc3NfVGVhbUFzc2lnbkVycm9yPUlVUEEwMDg0RTogSW1wb3NzXHUwMGVkdmVsIGluY2x1aXIgJyd7MH0nJyBuYSBlcXVpcGUgJyd7MX0nJyBcblxuRGVzY3JpdG9yZXMgZGUgZnVuXHUwMGU3XHUwMGUzbyBkZXZlbSB0ZXIgdW1hIGZ1blx1MDBlN1x1MDBlM28gZGUgZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gYXNzb2NpYWRhIGEgZWxlcyBwYXJhIHNlcmVtIGRlc2lnbmFkb3MgcGFyYSBhIGVxdWlwZS5cblxuIENvcnJpamEgYSBhc3NvY2lhXHUwMGU3XHUwMGUzbyBwcmltZWlybyBlIHRlbnRlIG5vdmFtZW50ZS4NCi1Qcm9jZXNzX1RlYW1EaWFsb2dNZXNzYWdlPVNlbGVjaW9uYXIgZXF1aXBlcw0KLVByb2Nlc3NfVGVhbURpYWxvZ1RpdGxlPUVxdWlwZXMNCi0NCi1Qcm9jZXNzX0RlbGl2ZXJhYmxlQXNzaWduRXJyb3I9SVVQQTAwODVFOiBJbXBvc3NcdTAwZWR2ZWwgaW5jbHVpciAnJ3swfScnIG5vIGRpc3RyaWJ1XHUwMGVkdmVsICcnezF9JycgcG9ycXVlIGVsZSBuXHUwMGUzbyB0ZW0gcHJvZHV0byBkZSB0cmFiYWxobyBkZSBlbGVtZW50byBkZSBtXHUwMGU5dG9kbyBhc3NvY2lhZG8gYSBlbGUuDQotUHJvY2Vzc19Db21wb3NpdGVSb2xlQXNzaWduRXJyb3I9SVVQQTAwODZFOiBJbXBvc3NcdTAwZWR2ZWwgaW5jbHVpciAnJ3swfScnIG5hIHJlZ3JhIGNvbXBvc3RhICcnezF9JycgcG9ycXVlIGVsZSBuXHUwMGUzbyB0ZW0gZnVuXHUwMGU3XHUwMGUzbyBkZSBlbGVtZW50byBkZSBtXHUwMGU5dG9kbyBhc3NvY2lhZGEgYSBlbGUuDQotUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJNZXNzYWdlPUlVUEEwMDg3VzogRGlnaXRlIHVtIG5cdTAwZmFtZXJvIHZcdTAwZTFsaWRvIHBhcmEgb3MgcHJlZGVjZXNzb3Jlcy4NCi1Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlclRpdGxlPUlEIGRlIFByZWRlY2Vzc29yIEludlx1MDBlMWxpZG8NCi0NCi1Qcm9jZXNzX05vSXRlbXM9TmVuaHVtIGl0ZW0gc2VsZWNpb25hZG8NCi1Qcm9jZXNzX0l0ZW1zU2VsZWN0ZWQ9ezB9IGl0ZW5zIHNlbGVjaW9uYWRvcw0KLVByb2Nlc3NfTm9Qcm9wZXJ0aWVzQXZhaWxhYmxlPU5lbmh1bWEgUHJvcHJpZWRhZGUgZGlzcG9uXHUwMGVkdmVsDQotDQotUHJlZGVjZXNzb3JEaWFsb2dfVGl0bGU9RGVwZW5kXHUwMGVhbmNpYSBkZSBQcmVkZWNlc3Nvcg0KLVByZWRlY2Vzc29yRGlhbG9nX0hlYWRlck1lc3NhZ2U9RGlnaXRlIG8gdGlwbyBkZSBkZXBlbmRcdTAwZWFuY2lhIHBhcmEgbyBwcmVkZWNlc3NvcjoNCi1QcmVkZWNlc3NvckRpYWxvZ19JbmRleD1cdTAwY2RuZGljZToNCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVzZW50YXRpb25OYW1lPU5vbWUgZGUgQXByZXNlbnRhXHUwMGU3XHUwMGUzbzoNCi1QcmVkZWNlc3NvckRpYWxvZ19EZXBlbmRlbmN5PURlcGVuZFx1MDBlYW5jaWE6DQotUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvckRpYWxvZ1RpdGxlPVByZWRlY2Vzc29yDQotUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvck1lc3NhZ2U9SVVQQTAwODhFOiBKXHUwMGUxIGV4aXN0ZSB1bSBwcmVkZWNlc3NvciBjb20gZXNzZSBJRCBwYXJhIGVzdGUgZWxlbWVudG8gZGUgZGl2aXNcdTAwZTNvIGRlIHRyYWJhbGhvLg0KLQ0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc190ZXh0RWRpdENlbGxfcHJvYmxlbV9tc2c9SVVQQTAwOTBFOiBPY29ycmV1IHVtIGVycm8gYW8gZWRpdGFyIHVtYSBwcm9wcmllZGFkZS4NCi1Qcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfY2VsbEVkaXRvcl9pbnZhbGlkUHJlZGNlc3Nvcl9wcm9ibGVtX21zZz1JVVBBMDA4OVc6IExpc3RhIGRlIHByZWRlY2Vzc29yZXMgaW52XHUwMGUxbGlkYQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjFkNmY4Mi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uVGl0bGU9XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmDQotUHJvY2Vzc19Eb2N1bWVudEluZm9ybWF0aW9uVGl0bGU9XHU2NTg3XHU2ODYzXHU0ZmUxXHU2MDZmDQotQWN0aXZpdHlfZ3VpZGFuY2VJbmZvcm1hdGlvblRpdGxlPVx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zg0KLUJyZWFrZG93bkVsZW1lbnRfb3B0aW9uSW5mb3JtYXRpb25UaXRsZT1cdTUyMDZcdTg5ZTNcdTkwMDlcdTk4NzkNCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25UaXRsZT1cdTZiNjVcdTlhYTQNCi0NCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTYzMDdcdTViOWFcdTYyNjdcdTg4NGNcdTZiNjRcdTRlZmJcdTUyYTFcdTYzY2ZcdThmZjBcdTdiMjZcdTc2ODRcdTZiNjVcdTlhYTRcdTMwMDINCi0NCi1Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1NjNkMFx1NGY5Ylx1NjcwOVx1NTE3M1x1NmI2NHswfVx1NzY4NFx1NWUzOFx1ODljNFx1NGZlMVx1NjA2Zlx1MzAwMg0KLVByb2Nlc3NfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1NjNkMFx1NGY5Ylx1NjcwOVx1NTE3M1x1NmI2NHswfVx1NzY4NFx1NjU4N1x1Njg2M1x1NGZlMVx1NjA2Zlx1MzAwMg0KLQ0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHU2M2QwXHU0ZjliXHU2NzA5XHU1MTczXHU2YjY0XHU2M2NmXHU4ZmYwXHU3YjI2XHU3Njg0XHU1ZTM4XHU4OWM0XHU0ZmUxXHU2MDZmXHUzMDAyDQotRGVzY3JpcHRvcl9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1NjNkMFx1NGY5Ylx1NjcwOVx1NTE3M1x1NmI2NFx1NjNjZlx1OGZmMFx1N2IyNlx1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLU1pbGVzdG9uZV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTYzZDBcdTRmOWJcdTY3MDlcdTUxNzNcdTZiNjRcdTkxY2NcdTdhMGJcdTc4OTFcdTc2ODRcdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmZcdTMwMDINCi1NaWxlc3RvbmVfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTYzZDBcdTRmOWJcdTY3MDlcdTUxNzNcdTZiNjRcdTkxY2NcdTdhMGJcdTc4OTFcdTc2ODRcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi1CcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1NjNkMFx1NGY5Ylx1NjcwOVx1NTE3M1x1NmI2NFx1NTIwNlx1ODllM1x1NTE0M1x1N2QyMFx1NzY4NFx1NWUzOFx1ODljNFx1NGZlMVx1NjA2Zlx1MzAwMg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1NjNkMFx1NGY5Ylx1NjcwOVx1NTE3M1x1NmI2NFx1NWRlNVx1NGY1Y1x1NTIwNlx1ODllM1x1NTE0M1x1N2QyMFx1NzY4NFx1NWUzOFx1ODljNFx1NGZlMVx1NjA2Zlx1MzAwMg0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRvbj1cdTYzZDBcdTRmOWJcdTY3MDlcdTUxNzNcdTZiNjRcdTYzY2ZcdThmZjBcdTdiMjZcdTc2ODRcdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmZcdTMwMDINCi1BY3Rpdml0eV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTYzZDBcdTRmOWJcdTY3MDlcdTUxNzNcdTZiNjRcdTZkM2JcdTUyYThcdTc2ODRcdTVlMzhcdTg5YzRcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi1CcmVha2Rvd25FbGVtZW50X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTYzZDBcdTRmOWJcdTY3MDlcdTUxNzNcdTZiNjRcdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjBcdTc2ODRcdTY1ODdcdTY4NjNcdTRmZTFcdTYwNmZcdTMwMDINCi1BY3Rpdml0eV9Eb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHU2M2QwXHU0ZjliXHU2NzA5XHU1MTczXHU2YjY0XHU2ZDNiXHU1MmE4XHU3Njg0XHU2NTg3XHU2ODYzXHU0ZmUxXHU2MDZmXHUzMDAyDQotRGVzY3JpcHRvcl9kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHU2M2QwXHU0ZjliXHU2NzA5XHU1MTczXHU2YjY0XHU2M2NmXHU4ZmYwXHU3YjI2XHU3Njg0XHU2NTg3XHU2ODYzXHU0ZmUxXHU2MDZmXHUzMDAyDQotUHJvY2Vzc19Ob25lPTw8IFx1NjVlMCA+Pg0KLVByb2Nlc3NfbmFtZT1cdTU0MGRcdTc5ZjBcdWZmMWENCi1Qcm9jZXNzX1ByZXNlbnRhdGlvbk5hbWU9XHU2NjNlXHU3OTNhXHU1NDBkXHU3OWYwXHVmZjFhDQotUHJvY2Vzc19icmllZkRlc2NyaXB0aW9uPVx1N2I4MFx1ODk4MVx1NjNjZlx1OGZmMFx1ZmYxYQ0KLVByb2Nlc3NfbWFpbkRlc2NyaXB0aW9uPSBcdTRlM2JcdTg5ODFcdTYzY2ZcdThmZjBcdWZmMWENCi1Qcm9jZXNzX3B1cnBvc2U9XHU3NTI4XHU5MDE0XHVmZjFhDQotUHJvY2Vzc19wcmVmaXg9XHU1MjRkXHU3ZjAwXHVmZjFhDQotDQotQnJlYWtkb3duRWxlbWVudF9UeXBlX05hbWU9XHU1MjA2XHU4OWUzXHU1MTQzXHU3ZDIwDQotDQotUHJvY2Vzc19UeXBlX1Rhc2s9XHU2NWI5XHU2Y2Q1XHU0ZWZiXHU1MmExXHVmZjFhDQotUHJvY2Vzc19UeXBlX1JvbGU9XHU2NWI5XHU2Y2Q1XHU4OWQyXHU4MjcyXHVmZjFhDQotUHJvY2Vzc19UeXBlX1dvcmtQcm9kdWN0PVx1NjViOVx1NmNkNVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1ZmYxYQ0KLQ0KLVdvcmtQcm9kdWN0X1R5cGU9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU3YzdiXHU1NzhiXHVmZjFhDQotDQotQWN0aXZpdHlfTW9kZWxJbmZvPVx1NmEyMVx1NTc4Ylx1NGZlMVx1NjA2Zlx1ZmYxYQ0KLUFjdGl2aXR5X1R5cGU9XHU2ZDNiXHU1MmE4XHU3YzdiXHU1NzhiXHVmZjFhDQotQWN0aXZpdHlfcHJlc2VudGF0aW9uTmFtZT1cdTY2M2VcdTc5M2FcdTU0MGRcdTc5ZjBcdWZmMWENCi1BY3Rpdml0eV9hbHRlcm5hdGl2ZXM9XHU2NmZmXHU0ZWUzXHU2NWI5XHU2ODQ4XHVmZjFhDQotQWN0aXZpdHlfaG93VG9TdGFmZj1cdTU5ODJcdTRmNTVcdTkxNGRcdTU5MDdcdTRlYmFcdTU0NThcdWZmMWENCi1CcmVha2Rvd25FbGVtZW50X2tleUNvbnNpZGVyYXRpb25zPVx1NTE3M1x1OTUyZVx1NmNlOFx1NjEwZlx1NGU4Ylx1OTg3OVx1ZmYxYQ0KLVByb2Nlc3NfdXNhZ2VHdWlkYW5jZT1cdTRmN2ZcdTc1MjhcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdWZmMWENCi0NCi1BY3Rpdml0eV9Sb2FkbWFwVGl0bGU9XHU4ZGVmXHU3ZWJmXHU1NmZlDQotQWN0aXZpdHlfUm9hZG1hcERlc2NyaXB0aW9uPVx1NGVlNVx1OGRlZlx1N2ViZlx1NTZmZVx1NzY4NFx1NWY2Mlx1NWYwZlx1NjNkMFx1NGY5Ylx1NTIzMFx1NTE3Nlx1NGVkNlx1NGZlMVx1NjA2Zlx1NzY4NFx1OTRmZVx1NjNhNVx1MzAwMg0KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZVRpdGxlPVx1OTAxYVx1NzUyOFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zg0KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZURlc2NyaXB0aW9uPVx1NGVlNVx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1NzY4NFx1NWY2Mlx1NWYwZlx1NjNkMFx1NGY5Ylx1NTIzMFx1NTE3Nlx1NGVkNlx1NGZlMVx1NjA2Zlx1NzY4NFx1OTRmZVx1NjNhNVx1MzAwMg0KLUFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbFRpdGxlPVx1OTAxYVx1NGZlMVx1Njc1MFx1NjU5OQ0KLUFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uPVx1NGVlNVx1OTAxYVx1NGZlMVx1Njc1MFx1NjU5OVx1NzY4NFx1NWY2Mlx1NWYwZlx1NjNkMFx1NGY5Ylx1NTIzMFx1NTE3Nlx1NGVkNlx1NGZlMVx1NjA2Zlx1NzY4NFx1OTRmZVx1NjNhNVx1MzAwMg0KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsVGl0bGU9XHU2NTU5XHU1YjY2XHU2NzUwXHU2NTk5DQotQWN0aXZpdHlfRWR1Y2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbj1cdTRlZTVcdTY1NTlcdTViNjZcdTY3NTBcdTY1OTlcdTc2ODRcdTVmNjJcdTVmMGZcdTYzZDBcdTRmOWJcdTUyMzBcdTUxNzZcdTRlZDZcdTRmZTFcdTYwNmZcdTc2ODRcdTk0ZmVcdTYzYTVcdTMwMDINCi0NCi1BY3Rpdml0eV9TZWxlY3RlZF9Sb2FkbWFwPVx1OGRlZlx1N2ViZlx1NTZmZVx1ZmYxYQ0KLUFjdGl2aXR5X1NlbGVjdGVkX0dlbmVyYWxHdWlkYW5jZT1cdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdWZmMWENCi1BY3Rpdml0eV9TZWxlY3RlZF9Db21tdW5pY2F0aW9uTWF0ZXJpYWw9XHU5MDFhXHU0ZmUxXHU2NzUwXHU2NTk5XHVmZjFhDQotQWN0aXZpdHlfU2VsZWN0ZWRfRWR1Y2F0aW9uTWF0ZXJpYWw9XHU2NTU5XHU1YjY2XHU2NzUwXHU2NTk5XHVmZjFhDQotDQotQWN0aXZpdHlfRGlhZ3JhbVRpdGxlPVx1NTZmZQ0KLUFjdGl2aXR5X0RpYWdyYW1EZXNjcmlwdGlvbiA9IFx1NGUzYVx1NmI2NCB7MH0gXHU2M2QwXHU0ZjliXHU1NmZlXHU3Njg0XHU1NmZlXHU1MGNmXHUzMDAyDQotQWN0aXZpdHlfQURJbWFnZT1cdTZkM2JcdTUyYThcdTU2ZmUNCi1BY3Rpdml0eV9BRERJbWFnZT1cdTZkM2JcdTUyYThcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTU2ZmUNCi1BY3Rpdml0eV9XUERJbWFnZT1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTRmOWRcdThkNTZcdTUxNzNcdTdjZmJcdTU2ZmUNCi1BY3Rpdml0eV9Vc2VBREltYWdlPVx1NGY3Zlx1NzUyOFx1NmQzYlx1NTJhOFx1NTZmZVx1OGZkYlx1ODg0Y1x1NTNkMVx1NWUwMw0KLUFjdGl2aXR5X1VzZUFEREltYWdlPVx1NGY3Zlx1NzUyOFx1NmQzYlx1NTJhOFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1NTZmZVx1OGZkYlx1ODg0Y1x1NTNkMVx1NWUwMw0KLUFjdGl2aXR5X1VzZVdQREltYWdlPVx1NGY3Zlx1NzUyOFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NGY5ZFx1OGQ1Nlx1NTE3M1x1N2NmYlx1NTZmZVx1OGZkYlx1ODg0Y1x1NTNkMVx1NWUwMw0KLUFjdGl2aXR5X0Fzc2lnbj1cdTUyMDZcdTkxNGQuLi4NCi0NCi1UYXNrRGVzY3JpcHRvcl9TZWxlY3RlZF9TdGVwcz1cdTZiNjVcdTlhYTRcdWZmMWENCi1UYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nVGl0bGU9XHU2YjY1XHU5YWE0DQotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ01lc3NhZ2U9XHU5MDA5XHU2MmU5XHU2YjY1XHU5YWE0DQotDQotQWN0aXZpdHlfV29ya1JvbGx1cD1cdTVkZTVcdTRmNWNcdTRlMGFcdTZlZGENCi1BY3Rpdml0eV9UZWFtUm9sbHVwPVx1NTZlMlx1OTYxZlx1NGUwYVx1NmVkYQ0KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cD1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTRlMGFcdTZlZGENCi1BY3Rpdml0eV9Xb3JrUm9sbHVwRGVzY3JpcHRpb249XHU1NzI4XHU4ZmQ5XHU0ZTJhXHU5MGU4XHU1MjA2XHU0ZTJkXHU2OGMwXHU2N2U1XHU2YjY0XHU2ZDNiXHU1MmE4XHU3Njg0XHU1ZGU1XHU0ZjVjXHU0ZTBhXHU2ZWRhXHUzMDAyDQotQWN0aXZpdHlfVGVhbVJvbGx1cERlc2NyaXB0aW9uPVx1NTcyOFx1OGZkOVx1NGUyYVx1OTBlOFx1NTIwNlx1NGUyZFx1NjhjMFx1NjdlNVx1NmI2NFx1NmQzYlx1NTJhOFx1NzY4NFx1NTZlMlx1OTYxZlx1NGUwYVx1NmVkYVx1MzAwMg0KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cERlc2NyaXB0aW9uPVx1NTcyOFx1OGZkOVx1NGUyYVx1OTBlOFx1NTIwNlx1NGUyZFx1NjhjMFx1NjdlNVx1NmI2NFx1NmQzYlx1NTJhOFx1NzY4NFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NGUwYVx1NmVkYVx1MzAwMg0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX011bHRpcGxlT2N1cnJhbmNlPVx1NTkxYVx1NmIyMVx1NTFmYVx1NzNiMA0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX09wdGlvbmFsPVx1NTNlZlx1OTAwOQ0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1BsYW5uZWQ9XHU1ZGYyXHU4OWM0XHU1MjEyDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3VwcmVzc2VkPVx1NWRmMlx1NjI5MVx1NTIzNg0KLQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0V2ZW50RHJpdmVuPVx1NGU4Ylx1NGVmNlx1OWE3MVx1NTJhOA0KLVdvcmtCcmVha2Rvd25FbGVtZW50X09uZ29pbmc9XHU2YjYzXHU1NzI4XHU4ZmRiXHU4ODRjDQotV29ya0JyZWFrZG93bkVsZW1lbnRfUmVwZWF0YWJsZT1cdTUzZWZcdTkxY2RcdTU5MGQNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9QcmVkZWNlc3NvcnM9XHU1MTQ4XHU4ODRjXHU0ZjVjXHU0ZTFhXHVmZjFhDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeT1cdTRmOWRcdThkNTZcdTUxNzNcdTdjZmJcdWZmMWENCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9JRF9URVhUPVx1N2QyMlx1NWYxNQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX1BSRVNFTlRBVElPTl9OQU1FX1RFWFQ9XHU2NjNlXHU3OTNhXHU1NDBkXHU3OWYwDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfREVQRU5ERU5DWV9URVhUPVx1NGY5ZFx1OGQ1Nlx1NTE3M1x1N2NmYg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQWRkPVx1NmRmYlx1NTJhMA0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfRWRpdD1cdTdmMTZcdThmOTENCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X1JlbW92ZT1cdTk2NjRcdTUzYmINCi0NCi1Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19TVEFSVD1cdTViOGNcdTYyMTBcdWZmMGRcdTVmMDBcdTU5Y2INCi1Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19GSU5JU0g9XHU1YjhjXHU2MjEwXHVmZjBkXHU1YjhjXHU2MjEwDQotV29ya09yZGVyVHlwZV9TVEFSVF9UT19GSU5JU0g9XHU1ZjAwXHU1OWNiXHVmZjBkXHU1YjhjXHU2MjEwDQotV29ya09yZGVyVHlwZV9TVEFSVF9UT19TVEFSVD1cdTVmMDBcdTU5Y2JcdWZmMGRcdTVmMDBcdTU5Y2INCi0NCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9TeW5jaHJvbml6ZWQ9XHU0ZTBlXHU2ZTkwXHU1NDBjXHU2YjY1DQotDQotRGVzY3JpcHRvcl9SZWZpbmVkRGVzY3JpcHRpb249XHU0ZjE4XHU1MzE2XHU3Njg0XHU2M2NmXHU4ZmYwXHVmZjFhDQotDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvblRpdGxlPVx1ODlkMlx1ODI3Mg0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTYzMDdcdTViOWFcdTYyNjdcdTg4NGNcdTZiNjRcdTRlZmJcdTUyYTFcdTYzY2ZcdThmZjBcdTdiMjZcdTc2ODRcdTg5ZDJcdTgyNzJcdTYzY2ZcdThmZjBcdTdiMjZcdTMwMDINCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTE9XHU0ZTNiXHU4OTgxXHU2MjY3XHU4ODRjXHU4MDA1XHVmZjFhDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUyPVx1NTE3Nlx1NGVkNlx1NjI2N1x1ODg0Y1x1ODAwNVx1ZmYxYQ0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMz1cdThmODVcdTUyYTlcdTgwMDVcdWZmMWENCi0NCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlPVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMQ0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249XHU2MjY3XHU4ODRjXHU2YjY0XHU0ZWZiXHU1MmExXHU2M2NmXHU4ZmYwXHU3YjI2XHU3Njg0XHU4ZjkzXHU1MTY1XHU1NDhjXHU4ZjkzXHU1MWZhXHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU2M2NmXHU4ZmYwXHU3YjI2XHUzMDAyDQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1cdTVmYzVcdTk3MDBcdThmOTNcdTUxNjVcdWZmMWENCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyPVx1NTNlZlx1OTAwOVx1OGY5M1x1NTE2NVx1ZmYxYQ0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTM9XHU1OTE2XHU5MGU4XHU4ZjkzXHU1MTY1XHVmZjFhDQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlND1cdThmOTNcdTUxZmFcdWZmMWENCi0NCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uVGl0bGU9XHU0ZWZiXHU1MmExDQotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPVx1NmI2NFx1ODlkMlx1ODI3Mlx1NjNjZlx1OGZmMFx1N2IyNlx1NjYyZlx1NGVlNVx1NGUwYlx1NGVmYlx1NTJhMVx1NjNjZlx1OGZmMFx1N2IyNlx1NzY4NFx1NjI2N1x1ODg0Y1x1ODAwNVx1MzAwMg0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMT1cdTRlM2JcdTg5ODFcdTYyNjdcdTg4NGNcdTgwMDVcdWZmMWENCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTI9XHU1MTc2XHU0ZWQ2XHU2MjY3XHU4ODRjXHU4MDA1XHVmZjFhDQotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUzPVx1OGY4NVx1NTJhOVx1ODAwNVx1ZmYxYQ0KLQ0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTZiNjRcdTg5ZDJcdTgyNzJcdTYzY2ZcdThmZjBcdTdiMjZcdThkMWZcdThkMjNcdTU0OGNcdTRmZWVcdTY1MzlcdTRlZTVcdTRlMGJcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTYzY2ZcdThmZjBcdTdiMjZcdTMwMDINCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxPVx1OGQxZlx1OGQyM1x1ZmYxYQ0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI9XHU0ZmVlXHU2NTM5XHVmZjFhDQotDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1cdTg5ZDJcdTgyNzINCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPVx1NGVlNVx1NGUwYlx1ODlkMlx1ODI3Mlx1NjNjZlx1OGZmMFx1N2IyNlx1OGQxZlx1OGQyM1x1NTQ4Y1x1NGZlZVx1NjUzOVx1NmI2NFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NjNjZlx1OGZmMFx1N2IyNlx1MzAwMg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19UYWJsZTE9XHU4ZDFmXHU4ZDIzXHVmZjFhDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMj1cdTRmZWVcdTY1MzlcdTgwMDVcdWZmMWENCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfVHlwZT1cdTdjN2JcdTU3OGJcdWZmMWENCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlPVx1NmQzYlx1NTJhOFx1OGZkYlx1NTE2NVx1NzJiNlx1NjAwMVx1ZmYxYQ0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZT1cdTZkM2JcdTUyYThcdTkwMDBcdTUxZmFcdTcyYjZcdTYwMDFcdWZmMWENCi0NCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25UaXRsZT1cdTUzZWZcdTRlYTRcdTRlZDhcdTkwZThcdTRlZjYNCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25EZXNjcmlwdGlvbj1cdTUzZWZcdTRlYTRcdTRlZDhcdTRlZjZcdTY3MDlcdTRlZTVcdTRlMGJcdTUzZWZcdTRlYTRcdTRlZDhcdTkwZThcdTRlZjZcdTMwMDINCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1RhYmxlMT1cdTUzZWZcdTRlYTRcdTRlZDhcdTkwZThcdTRlZjYNCi0NCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25UaXRsZT1cdTU2ZTJcdTk2MWYNCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTZiNjRcdTg5ZDJcdTgyNzJcdTYzY2ZcdThmZjBcdTdiMjZcdTZkODlcdTUzY2FcdTRlZTVcdTRlMGJcdTU2ZTJcdTk2MWZcdTMwMDINCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1RhYmxlMT1cdTU2ZTJcdTk2MWZcdWZmMWENCi0NCi1Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvblRpdGxlPVx1ODlkMlx1ODI3Mg0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb249XHU2YjY0XHU3ZWM0XHU1NDA4XHU4OWQyXHU4MjcyXHU2NzA5XHU0ZWU1XHU0ZTBiXHU4MDVhXHU5NmM2XHU4OWQyXHU4MjcyXHUzMDAyDQotQ29tcG9zaXRlUm9sZV9Sb2xlX1RhYmxlMT1cdTgwNWFcdTk2YzZcdTg5ZDJcdTgyNzJcdWZmMWENCi0NCi1UZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25UaXRsZT1cdTg5ZDJcdTgyNzINCi1UZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTU0MTFcdTU2ZTJcdTk2MWZcdTY5ODJcdTg5ODFcdTY1ODdcdTRlZjZcdTZkZmJcdTUyYTBcdTg5ZDJcdTgyNzJcdTYyMTZcdTRlY2VcdTRlMmRcdTk2NjRcdTUzYmJcdTg5ZDJcdTgyNzJcdTMwMDINCi1UZWFtUHJvZmlsZV9Sb2xlX1RhYmxlMT1cdTg5ZDJcdTgyNzJcdWZmMWENCi0NCi1Qcm9jZXNzX1JpY2hUZXh0X0NvbGxhcHNlSW1hZ2U9Y29sbGFwc2VkLmdpZg0KLVByb2Nlc3NfUmljaFRleHRfRXhwYW5kSW1hZ2U9ZXhwYW5kZWQuZ2lmDQotUHJvY2Vzc19BZGQ9XHU2ZGZiXHU1MmEwLi4uDQotUHJvY2Vzc19BZGRGcm9tUHJvY2Vzcz1cdTRlY2VcdTZkNDFcdTdhMGJcdTZkZmJcdTUyYTAuLi4NCi1Qcm9jZXNzX1JlbmFtZV9NZXNzYWdlPVx1NjBhOFx1ODk4MVx1NjZmNFx1NjUzOVx1NmI2NFx1NmQ0MVx1N2EwYlx1NzY4NFx1NTQwZFx1NzlmMFx1MzAwMlx1OGZkOVx1NWMwNlx1NGZkZFx1NWI1OFx1NmI2NFx1N2YxNlx1OGY5MVx1NTY2OFx1NWU3Nlx1NWMwNlx1NmQ0MVx1N2EwYlx1NjU4N1x1NGVmNlx1NTkzOVx1OTFjZFx1NTQ3ZFx1NTQwZFx1NGUzYVx1NjViMFx1NTQwZFx1NzlmMFx1MzAwMlx1ODk4MVx1N2VlN1x1N2VlZFx1NTQxN1x1ZmYxZg0KLVByb2Nlc3NfUmVtb3ZlPVx1OTY2NFx1NTNiYg0KLVByb2Nlc3NfVXA9XHU1NDExXHU0ZTBhDQotUHJvY2Vzc19Eb3duPVx1NTQxMVx1NGUwYg0KLVByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb249XHU1OTFhXHU0ZTJhXHU5MDA5XHU2MmU5DQotUHJvY2Vzc19CdXR0b25fTGlua01ldGhvZEVsZW1lbnQ9XHU5NGZlXHU2M2E1XHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwLi4uDQotDQotIyMgRXJyb3IvV2FybmluZw0KLVByb2Nlc3NfSW52YWxpZE5hbWVUaXRsZT1cdTY1ZTBcdTY1NDhcdTU0MGRcdTc5ZjANCi1Qcm9jZXNzX0ludmFsaWROYW1lPUlVUEEwMDgxRTogXHU1NDBkXHU3OWYwXHU0ZTBkXHU4MGZkXHU0ZTNhXHU3YTdhXHUzMDAyXHU4YmY3XHU2MzA3XHU1YjlhXHU2NzA5XHU2NTQ4XHU1NDBkXHU3OWYwXHUzMDAyDQotUHJvY2Vzc19SZW5hbWVfVGl0bGU9XHU5MWNkXHU1NDdkXHU1NDBkDQotUHJvY2Vzc19JbnZhbGlkUHJlc2VudGF0aW9uTmFtZT1JVVBBMDA4MkU6IFx1NjYzZVx1NzkzYVx1NTQwZFx1NzlmMFx1NGUwZFx1ODBmZFx1NGUzYVx1N2E3YVx1MzAwMlx1OGJmN1x1NjMwN1x1NWI5YVx1NjcwOVx1NjU0OFx1NzY4NFx1NjYzZVx1NzkzYVx1NTQwZFx1NzlmMFx1MzAwMg0KLVByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZT1cdTk0ZmVcdTYzYTVcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjANCi1Qcm9jZXNzX0ludmFsaWRMaW5rTWV0aG9kRWxlbWVudD1JVVBBMDA4M0U6IFx1NjVlMFx1NmNkNVx1OTRmZVx1NjNhNVx1NTIzMFx1MjAxY3swfVx1MjAxZFx1ZmYwY1x1NTZlMFx1NGUzYVx1NmI2NFx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMFx1NWRmMlx1NzUyOFx1NGU4ZVx1NzZmOFx1NTQwY1x1NzIzNlx1NGUwYlx1NzY4NFx1NTE3Nlx1NGVkNlx1NjNjZlx1OGZmMFx1N2IyNlx1MzAwMg0KLVByb2Nlc3NfQXNzaWdubWVudEluZm9UaXRsZT1cdTRmZTFcdTYwNmYNCi1Qcm9jZXNzX1RlYW1Bc3NpZ25FcnJvcj1JVVBBMDA4NEU6IFx1NjVlMFx1NmNkNVx1NWMwNlx1MjAxY3swfVx1MjAxZFx1NmRmYlx1NTJhMFx1NTIzMFx1NTZlMlx1OTYxZlx1MjAxY3sxfVx1MjAxZFxuXG5cdTg5ZDJcdTgyNzJcdTYzY2ZcdThmZjBcdTdiMjZcdTVmYzVcdTk4N2JcdTY3MDlcdTUxNzNcdTgwNTRcdTc2ODRcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTg5ZDJcdTgyNzJcdTRlZTVcdTRmOWJcdTUyMDZcdTkxNGRcdTdlZDlcdTU2ZTJcdTk2MWZcdTMwMDJcblxuXHU4YmY3XHU1MTQ4XHU0ZmVlXHU1OTBkXHU1MTczXHU4MDU0XHVmZjBjXHU3MTM2XHU1NDBlXHU5MWNkXHU4YmQ1XHUzMDAyDQotUHJvY2Vzc19UZWFtRGlhbG9nTWVzc2FnZT1cdTkwMDlcdTYyZTlcdTU2ZTJcdTk2MWYNCi1Qcm9jZXNzX1RlYW1EaWFsb2dUaXRsZT1cdTU2ZTJcdTk2MWYNCi0NCi1Qcm9jZXNzX0RlbGl2ZXJhYmxlQXNzaWduRXJyb3I9SVVQQTAwODVFOiBcdTY1ZTBcdTZjZDVcdTVjMDZcdTIwMWN7MH1cdTIwMWRcdTZkZmJcdTUyYTBcdTUyMzBcdTUzZWZcdTRlYTRcdTRlZDhcdTRlZjZcdTIwMWN7MX1cdTIwMWRcdWZmMGNcdTU2ZTBcdTRlM2FcdTViODNcdTZjYTFcdTY3MDlcdTUxNzNcdTgwNTRcdTc2ODRcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTMwMDINCi1Qcm9jZXNzX0NvbXBvc2l0ZVJvbGVBc3NpZ25FcnJvcj1JVVBBMDA4NkU6IFx1NjVlMFx1NmNkNVx1NWMwNlx1MjAxY3swfVx1MjAxZFx1NmRmYlx1NTJhMFx1NTIzMFx1N2VjNFx1NTQwOFx1ODlkMlx1ODI3Mlx1MjAxY3sxfVx1MjAxZFx1ZmYwY1x1NTZlMFx1NGUzYVx1NWI4M1x1NmNhMVx1NjcwOVx1NTE3M1x1ODA1NFx1NzY4NFx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMFx1ODlkMlx1ODI3Mlx1MzAwMg0KLVByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyTWVzc2FnZT1JVVBBMDA4N1c6IFx1OGJmN1x1OGY5M1x1NTE2NVx1NTE0OFx1ODg0Y1x1NGY1Y1x1NGUxYVx1NzY4NFx1NjcwOVx1NjU0OFx1N2YxNlx1NTNmN1x1MzAwMg0KLVByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyVGl0bGU9XHU1MTQ4XHU4ODRjXHU0ZjVjXHU0ZTFhXHU2ODA3XHU4YmM2XHU2NWUwXHU2NTQ4DQotDQotUHJvY2Vzc19Ob0l0ZW1zPVx1NjcyYVx1OTAwOVx1NjJlOVx1NGVmYlx1NGY1NVx1OTg3OQ0KLVByb2Nlc3NfSXRlbXNTZWxlY3RlZD1cdTkwMDlcdTYyZTlcdTRlODYgezB9IFx1OTg3OQ0KLVByb2Nlc3NfTm9Qcm9wZXJ0aWVzQXZhaWxhYmxlPVx1NjVlMFx1NWM1ZVx1NjAyN1x1NTNlZlx1NzUyOA0KLQ0KLVByZWRlY2Vzc29yRGlhbG9nX1RpdGxlPVx1NTE0OFx1ODg0Y1x1NGY1Y1x1NGUxYVx1NGY5ZFx1OGQ1Nlx1NTE3M1x1N2NmYg0KLVByZWRlY2Vzc29yRGlhbG9nX0hlYWRlck1lc3NhZ2U9XHU4ZjkzXHU1MTY1XHU1MTQ4XHU4ODRjXHU0ZjVjXHU0ZTFhXHU3Njg0XHU0ZjlkXHU4ZDU2XHU1MTczXHU3Y2ZiXHU3YzdiXHU1NzhiXHVmZjFhDQotUHJlZGVjZXNzb3JEaWFsb2dfSW5kZXg9XHU3ZDIyXHU1ZjE1XHVmZjFhDQotUHJlZGVjZXNzb3JEaWFsb2dfUHJlc2VudGF0aW9uTmFtZT1cdTY2M2VcdTc5M2FcdTU0MGRcdTc5ZjBcdWZmMWENCi1QcmVkZWNlc3NvckRpYWxvZ19EZXBlbmRlbmN5PVx1NGY5ZFx1OGQ1Nlx1NTE3M1x1N2NmYlx1ZmYxYQ0KLVByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JEaWFsb2dUaXRsZT1cdTUxNDhcdTg4NGNcdTRmNWNcdTRlMWENCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yTWVzc2FnZT1JVVBBMDA4OEU6IFx1NmI2NFx1NWRlNVx1NGY1Y1x1NTIwNlx1ODllM1x1NTE0M1x1N2QyMFx1NWRmMlx1NWI1OFx1NTcyOFx1NTE3N1x1NjcwOVx1OGJlNVx1NjgwN1x1OGJjNlx1NzY4NFx1NTE0OFx1ODg0Y1x1NGY1Y1x1NGUxYVx1MzAwMg0KLQ0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc190ZXh0RWRpdENlbGxfcHJvYmxlbV9tc2c9SVVQQTAwOTBFOiBcdTdmMTZcdThmOTFcdTVjNWVcdTYwMjdcdTY1ZjZcdTUxZmFcdTk1MTlcdTMwMDINCi1Qcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfY2VsbEVkaXRvcl9pbnZhbGlkUHJlZGNlc3Nvcl9wcm9ibGVtX21zZz1JVVBBMDA4OVc6IFx1NTE0OFx1ODg0Y1x1NGY1Y1x1NGUxYVx1NTIxN1x1ODg2OFx1NjVlMFx1NjU0OA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTVkMjMxYi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uVGl0bGU9XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhDQotUHJvY2Vzc19Eb2N1bWVudEluZm9ybWF0aW9uVGl0bGU9XHU2NTg3XHU0ZWY2XHU4Y2M3XHU4YTBhDQotQWN0aXZpdHlfZ3VpZGFuY2VJbmZvcm1hdGlvblRpdGxlPVx1NjMwN1x1NWYxNQ0KLUJyZWFrZG93bkVsZW1lbnRfb3B0aW9uSW5mb3JtYXRpb25UaXRsZT1cdTUyMDZcdTg5ZTNcdTkwNzhcdTk4MDUNCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25UaXRsZT1cdTZiNjVcdTlhNWYNCi0NCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTYzMDdcdTViOWFcdTU3ZjdcdTg4NGNcdTZiNjRcdTRmNWNcdTY5NmRcdTYzY2ZcdThmZjBcdTViNTBcdTc2ODRcdTZiNjVcdTlhNWZcdTMwMDINCi0NCi1Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1NjNkMFx1NGY5Ylx1NmI2NHswfVx1NzY4NFx1NGUwMFx1ODIyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLVByb2Nlc3NfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1NjNkMFx1NGY5Ylx1NmI2NHswfVx1NzY4NFx1NjU4N1x1NGVmNlx1OGNjN1x1OGEwYVx1MzAwMg0KLQ0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHU2M2QwXHU0ZjliXHU2YjY0XHU2M2NmXHU4ZmYwXHU1YjUwXHU3Njg0XHU0ZTAwXHU4MjJjXHU4Y2M3XHU4YTBhXHUzMDAyDQotRGVzY3JpcHRvcl9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NjNjZlx1OGZmMFx1NWI1MFx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1OGEwYVx1MzAwMg0KLU1pbGVzdG9uZV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTYzZDBcdTRmOWJcdTZiNjRcdTkxY2NcdTdhMGJcdTc4OTFcdTc2ODRcdTRlMDBcdTgyMmNcdThjYzdcdThhMGFcdTMwMDINCi1NaWxlc3RvbmVfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTYzZDBcdTRmOWJcdTZiNjRcdTkxY2NcdTdhMGJcdTc4OTFcdTc2ODRcdThhNzNcdTdkMzBcdThjYzdcdThhMGFcdTMwMDINCi0NCi1CcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NTIwNlx1ODllM1x1NTE0M1x1N2QyMFx1NzY4NFx1NGUwMFx1ODIyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1NjNkMFx1NGY5Ylx1NmI2NFx1NWRlNVx1NGY1Y1x1NTIwNlx1ODllM1x1NTE0M1x1N2QyMFx1NzY4NFx1NGUwMFx1ODIyY1x1OGNjN1x1OGEwYVx1MzAwMg0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRvbj1cdTYzZDBcdTRmOWJcdTZiNjRcdTYzY2ZcdThmZjBcdTViNTBcdTc2ODRcdTRlMDBcdTgyMmNcdThjYzdcdThhMGFcdTMwMDINCi1BY3Rpdml0eV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTYzZDBcdTRmOWJcdTZiNjRcdTZkM2JcdTUyZDVcdTc2ODRcdTRlMDBcdTgyMmNcdThjYzdcdThhMGFcdTMwMDINCi0NCi1CcmVha2Rvd25FbGVtZW50X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTYzZDBcdTRmOWJcdTZiNjRcdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjBcdTc2ODRcdTY1ODdcdTRlZjZcdThjYzdcdThhMGFcdTMwMDINCi1BY3Rpdml0eV9Eb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHU2M2QwXHU0ZjliXHU2YjY0XHU2ZDNiXHU1MmQ1XHU3Njg0XHU2NTg3XHU0ZWY2XHU4Y2M3XHU4YTBhXHUzMDAyDQotRGVzY3JpcHRvcl9kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHU2M2QwXHU0ZjliXHU2YjY0XHU2M2NmXHU4ZmYwXHU1YjUwXHU3Njg0XHU2NTg3XHU0ZWY2XHU4Y2M3XHU4YTBhXHUzMDAyDQotUHJvY2Vzc19Ob25lPTw8IFx1NzEyMSA+Pg0KLVByb2Nlc3NfbmFtZT1cdTU0MGRcdTdhMzFcdWZmMWENCi1Qcm9jZXNzX1ByZXNlbnRhdGlvbk5hbWU9XHU1NDQ4XHU3M2ZlXHU1NDBkXHU3YTMxXHVmZjFhDQotUHJvY2Vzc19icmllZkRlc2NyaXB0aW9uPVx1N2MyMVx1ODk4MVx1OGFhYVx1NjYwZVx1ZmYxYQ0KLVByb2Nlc3NfbWFpbkRlc2NyaXB0aW9uPSBcdTRlM2JcdTg5ODFcdThhYWFcdTY2MGVcdWZmMWENCi1Qcm9jZXNzX3B1cnBvc2U9XHU3NTI4XHU5MDE0XHVmZjFhDQotUHJvY2Vzc19wcmVmaXg9XHU1YjU3XHU5OTk2XHVmZjFhDQotDQotQnJlYWtkb3duRWxlbWVudF9UeXBlX05hbWU9XHU1MjA2XHU4OWUzXHU1MTQzXHU3ZDIwDQotDQotUHJvY2Vzc19UeXBlX1Rhc2s9XHU2NWI5XHU2Y2Q1XHU0ZjVjXHU2OTZkXHVmZjFhDQotUHJvY2Vzc19UeXBlX1JvbGU9XHU2NWI5XHU2Y2Q1XHU4OWQyXHU4MjcyXHVmZjFhDQotUHJvY2Vzc19UeXBlX1dvcmtQcm9kdWN0PVx1NjViOVx1NmNkNVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1ZmYxYQ0KLQ0KLVdvcmtQcm9kdWN0X1R5cGU9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU5ODVlXHU1NzhiXHVmZjFhDQotDQotQWN0aXZpdHlfTW9kZWxJbmZvPVx1NmEyMVx1NTc4Ylx1OGNjN1x1OGEwYVx1ZmYxYQ0KLUFjdGl2aXR5X1R5cGU9XHU2ZDNiXHU1MmQ1XHU5ODVlXHU1NzhiXHVmZjFhDQotQWN0aXZpdHlfcHJlc2VudGF0aW9uTmFtZT1cdTU0NDhcdTczZmVcdTU0MGRcdTdhMzFcdWZmMWENCi1BY3Rpdml0eV9hbHRlcm5hdGl2ZXM9XHU2NmZmXHU0ZWUzXHU2NWI5XHU2ODQ4XHVmZjFhDQotQWN0aXZpdHlfaG93VG9TdGFmZj1cdTU5ODJcdTRmNTVcdTkxNGRcdTdmNmVcdTRlYmFcdTU0ZTFcdWZmMWENCi1CcmVha2Rvd25FbGVtZW50X2tleUNvbnNpZGVyYXRpb25zPVx1NGUzYlx1ODk4MVx1ODAwM1x1OTFjZlx1ZmYxYQ0KLVByb2Nlc3NfdXNhZ2VHdWlkYW5jZT1cdTc1MjhcdTZjZDVcdTYzMDdcdTVmMTVcdWZmMWENCi0NCi1BY3Rpdml0eV9Sb2FkbWFwVGl0bGU9XHU1YzBlXHU4OWJkXHU1NzE2DQotQWN0aXZpdHlfUm9hZG1hcERlc2NyaXB0aW9uPVx1NGVlNVx1ODVjZFx1NTcxNlx1NjgzY1x1NWYwZlx1NjNkMFx1NGY5Ylx1NTE3Nlx1NGVkNlx1OGNjN1x1OGEwYVx1NzY4NFx1OTNjOFx1N2Q1MFx1MzAwMg0KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZVRpdGxlPVx1NGUwMFx1ODIyY1x1NjMwN1x1NWYxNQ0KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZURlc2NyaXB0aW9uPVx1NGVlNVx1NjMwN1x1NWYxNVx1NWY2Mlx1NWYwZlx1NjNkMFx1NGY5Ylx1NTE3Nlx1NGVkNlx1OGNjN1x1OGEwYVx1NzY4NFx1OTNjOFx1N2Q1MFx1MzAwMg0KLUFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbFRpdGxlPVx1OTAxYVx1OGEwYVx1OGNjN1x1NjU5OQ0KLUFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uPVx1NGVlNVx1OTAxYVx1OGEwYVx1OGNjN1x1NjU5OVx1NjgzY1x1NWYwZlx1NjNkMFx1NGY5Ylx1NTE3Nlx1NGVkNlx1OGNjN1x1OGEwYVx1NzY4NFx1OTNjOFx1N2Q1MFx1MzAwMg0KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsVGl0bGU9XHU2NTU5XHU4MGIyXHU4Y2M3XHU2NTk5DQotQWN0aXZpdHlfRWR1Y2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbj1cdTRlZTVcdTY1NTlcdTgwYjJcdThjYzdcdTY1OTlcdTY4M2NcdTVmMGZcdTYzZDBcdTRmOWJcdTUxNzZcdTRlZDZcdThjYzdcdThhMGFcdTc2ODRcdTkzYzhcdTdkNTBcdTMwMDINCi0NCi1BY3Rpdml0eV9TZWxlY3RlZF9Sb2FkbWFwPVx1ODVjZFx1NTcxNlx1ZmYxYQ0KLUFjdGl2aXR5X1NlbGVjdGVkX0dlbmVyYWxHdWlkYW5jZT1cdTYzMDdcdTVmMTVcdWZmMWENCi1BY3Rpdml0eV9TZWxlY3RlZF9Db21tdW5pY2F0aW9uTWF0ZXJpYWw9XHU5MDFhXHU4YTBhXHU4Y2M3XHU2NTk5XHVmZjFhDQotQWN0aXZpdHlfU2VsZWN0ZWRfRWR1Y2F0aW9uTWF0ZXJpYWw9XHU2NTU5XHU4MGIyXHU4Y2M3XHU2NTk5XHVmZjFhDQotDQotQWN0aXZpdHlfRGlhZ3JhbVRpdGxlPVx1NTcxNlx1ODllMw0KLUFjdGl2aXR5X0RpYWdyYW1EZXNjcmlwdGlvbiA9IFx1NjNkMFx1NGY5Ylx1NmI2NHswfVx1NzY4NFx1NTcxNlx1ODllM1x1NWY3MVx1NTBjZlx1MzAwMg0KLUFjdGl2aXR5X0FESW1hZ2U9XHU2ZDNiXHU1MmQ1XHU1NzE2DQotQWN0aXZpdHlfQURESW1hZ2U9XHU2ZDNiXHU1MmQ1XHU2NjBlXHU3ZDMwXHU1NzE2DQotQWN0aXZpdHlfV1BESW1hZ2U9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU3NmY4XHU0ZjlkXHU5NWRjXHU0ZmMyXHU1NzE2DQotQWN0aXZpdHlfVXNlQURJbWFnZT1cdTRmN2ZcdTc1MjhcdTZkM2JcdTUyZDVcdTU3MTZcdTRmODZcdTc2N2NcdTg4NGMNCi1BY3Rpdml0eV9Vc2VBRERJbWFnZT1cdTRmN2ZcdTc1MjhcdTZkM2JcdTUyZDVcdTY2MGVcdTdkMzBcdTU3MTZcdTRmODZcdTc2N2NcdTg4NGMNCi1BY3Rpdml0eV9Vc2VXUERJbWFnZT1cdTRmN2ZcdTc1MjhcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTc2ZjhcdTRmOWRcdTk1ZGNcdTRmYzJcdTU3MTZcdTRmODZcdTc2N2NcdTg4NGMNCi1BY3Rpdml0eV9Bc3NpZ249XHU2MzA3XHU1YjlhLi4uDQotDQotVGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRfU3RlcHM9XHU2YjY1XHU5YTVmXHVmZjFhDQotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ1RpdGxlPVx1NmI2NVx1OWE1Zg0KLVRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dNZXNzYWdlPVx1OTA3OFx1NTNkNlx1NmI2NVx1OWE1Zg0KLQ0KLUFjdGl2aXR5X1dvcmtSb2xsdXA9XHU1ZGU1XHU0ZjVjXHU1ZjU5XHU3ZTNkDQotQWN0aXZpdHlfVGVhbVJvbGx1cD1cdTU3MThcdTk2OGFcdTVmNTlcdTdlM2QNCi1BY3Rpdml0eV9Xb3JrUHJvZHVjdHNSb2xsdXA9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU1ZjU5XHU3ZTNkDQotQWN0aXZpdHlfV29ya1JvbGx1cERlc2NyaXB0aW9uPVx1NTcyOFx1NjcyY1x1N2JjMFx1NWJlOVx1NjdlNVx1NmI2NFx1NmQzYlx1NTJkNVx1NzY4NFx1NWRlNVx1NGY1Y1x1NWY1OVx1N2UzZFx1MzAwMg0KLUFjdGl2aXR5X1RlYW1Sb2xsdXBEZXNjcmlwdGlvbj1cdTU3MjhcdTY3MmNcdTdiYzBcdTViZTlcdTY3ZTVcdTZiNjRcdTZkM2JcdTUyZDVcdTc2ODRcdTU3MThcdTk2OGFcdTVmNTlcdTdlM2RcdTMwMDINCi1BY3Rpdml0eV9Xb3JrUHJvZHVjdHNSb2xsdXBEZXNjcmlwdGlvbj1cdTU3MjhcdTY3MmNcdTdiYzBcdTViZTlcdTY3ZTVcdTZiNjRcdTZkM2JcdTUyZDVcdTc2ODRcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTVmNTlcdTdlM2RcdTMwMDINCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9NdWx0aXBsZU9jdXJyYW5jZT1cdTU5MWFcdTZiMjFcdTUxZmFcdTczZmVcdTc2ODRcdTk4MDVcdTc2ZWUNCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9PcHRpb25hbD1cdTkwNzhcdTc1MjgNCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9QbGFubmVkPVx1ODk4Zlx1NTI4Mw0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N1cHJlc3NlZD1cdTUzZDdcdTYyOTFcdTUyMzYNCi0NCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9FdmVudERyaXZlbj1cdTRlOGJcdTRlZjZcdTlhNDVcdTUyZDUNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9PbmdvaW5nPVx1NjMwMVx1N2U4Y1x1OTAzMlx1ODg0Y1x1NGUyZA0KLVdvcmtCcmVha2Rvd25FbGVtZW50X1JlcGVhdGFibGU9XHU1M2VmXHU5MWNkXHU4OTA3XHU3Njg0DQotV29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3JzPVx1NTI0ZFx1NGUwMFx1NzI0OFx1ZmYxYQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3k9XHU3NmY4XHU0ZjlkXHU5NWRjXHU0ZmMyXHVmZjFhDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfSURfVEVYVD1cdTdkMjJcdTVmMTUNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9QUkVTRU5UQVRJT05fTkFNRV9URVhUPVx1NTQ0OFx1NzNmZVx1NTQwZFx1N2EzMQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0RFUEVOREVOQ1lfVEVYVD1cdTc2ZjhcdTRmOWRcdTk1ZGNcdTRmYzINCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0FkZD1cdTY1YjBcdTU4OWUNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0VkaXQ9XHU3ZGU4XHU4ZjJmDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9SZW1vdmU9XHU3OWZiXHU5NjY0DQotDQotV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fU1RBUlQ9XHU1YjhjXHU2MjEwLVx1OTU4Ylx1NTljYg0KLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX0ZJTklTSD1cdTViOGNcdTYyMTAtXHU1YjhjXHU2MjEwDQotV29ya09yZGVyVHlwZV9TVEFSVF9UT19GSU5JU0g9XHU5NThiXHU1OWNiLVx1NWI4Y1x1NjIxMA0KLVdvcmtPcmRlclR5cGVfU1RBUlRfVE9fU1RBUlQ9XHU5NThiXHU1OWNiLVx1OTU4Ylx1NTljYg0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N5bmNocm9uaXplZD1cdTgyMDdcdTRmODZcdTZlOTBcdTU0MGNcdTZiNjUNCi0NCi1EZXNjcmlwdG9yX1JlZmluZWREZXNjcmlwdGlvbj1cdThhNzNcdTdkMzBcdTc2ODRcdThhYWFcdTY2MGVcdWZmMWENCi0NCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU9XHU4OWQyXHU4MjcyDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPVx1NjMwN1x1NWI5YVx1ODlkMlx1ODI3Mlx1NjNjZlx1OGZmMFx1NWI1MFx1NGY4Nlx1NTdmN1x1ODg0Y1x1NmI2NFx1NGY1Y1x1Njk2ZFx1NjNjZlx1OGZmMFx1NWI1MFx1MzAwMg0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMT1cdTRlM2JcdTg5ODFcdTU3ZjdcdTg4NGNcdTgwMDVcdWZmMWENCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9XHU1MTc2XHU0ZWQ2XHU1N2Y3XHU4ODRjXHU4MDA1XHVmZjFhDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUzPVx1NTJhOVx1NzQwNlx1ZmYxYQ0KLQ0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljDQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTYzMDdcdTViOWFcdTZiNjRcdTRmNWNcdTY5NmRcdTYzY2ZcdThmZjBcdTViNTBcdTc2ODRcdThmMzhcdTUxNjVcdTUzY2FcdThmMzhcdTUxZmFcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTYzY2ZcdThmZjBcdTViNTBcdTMwMDINCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxPVx1NWZjNVx1ODk4MVx1OGYzOFx1NTE2NVx1ZmYxYQ0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI9XHU5MDc4XHU3NTI4XHU4ZjM4XHU1MTY1XHVmZjFhDQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMz1cdTU5MTZcdTkwZThcdThmMzhcdTUxNjVcdWZmMWENCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGU0PVx1OGYzOFx1NTFmYVx1ZmYxYQ0KLQ0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1NlY3Rpb25UaXRsZT1cdTRmNWNcdTY5NmQNCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uRGVzY3JpcHRpb249XHU2YjY0XHU4OWQyXHU4MjcyXHU2M2NmXHU4ZmYwXHU1YjUwXHU2NjJmXHU0ZTBiXHU1MjE3XHU0ZjVjXHU2OTZkXHU2M2NmXHU4ZmYwXHU1YjUwXHU3Njg0XHU1N2Y3XHU4ODRjXHU4MDA1XHUzMDAyDQotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUxPVx1NGUzYlx1ODk4MVx1NTdmN1x1ODg0Y1x1ODAwNVx1ZmYxYQ0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMj1cdTUxNzZcdTRlZDZcdTU3ZjdcdTg4NGNcdTgwMDVcdWZmMWENCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTM9XHU1MmE5XHU3NDA2XHVmZjFhDQotDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25UaXRsZT1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWMNCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvbkRlc2NyaXB0aW9uPVx1NmI2NFx1ODlkMlx1ODI3Mlx1NjNjZlx1OGZmMFx1NWI1MFx1OGNhMFx1OGNhY1x1NTQ4Y1x1NGZlZVx1NjUzOVx1NGUwYlx1NTIxN1x1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1NjNjZlx1OGZmMFx1NWI1MFx1MzAwMg0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTE9XHU4Y2EwXHU4Y2FjXHVmZjFhDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMj1cdTRmZWVcdTY1MzlcdWZmMWENCi0NCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvblRpdGxlPVx1ODlkMlx1ODI3Mg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uRGVzY3JpcHRpb249XHU0ZTBiXHU1MjE3XHU4OWQyXHU4MjcyXHU2M2NmXHU4ZmYwXHU1YjUwXHU4Y2EwXHU4Y2FjXHU1NDhjXHU0ZmVlXHU2NTM5XHU2YjY0XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU2M2NmXHU4ZmYwXHU1YjUwXHUzMDAyDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMT1cdThjYTBcdThjYWNcdWZmMWENCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfVGFibGUyPVx1NGZlZVx1NjUzOVx1ODAwNVx1ZmYxYQ0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9UeXBlPVx1OTg1ZVx1NTc4Ylx1ZmYxYQ0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGU9XHU2ZDNiXHU1MmQ1XHU5MDMyXHU1MTY1XHU3MmMwXHU2MTRiXHVmZjFhDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlPVx1NmQzYlx1NTJkNVx1N2Q1MFx1Njc1Zlx1NzJjMFx1NjE0Ylx1ZmYxYQ0KLQ0KLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvblRpdGxlPVx1NGVhNFx1NGVkOFx1OTgwNVx1NzZlZVx1N2Q0NFx1NGVmNg0KLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvbkRlc2NyaXB0aW9uPVx1NGVhNFx1NGVkOFx1OTgwNVx1NzZlZVx1NjcwOVx1NGUwYlx1NTIxN1x1NGVhNFx1NGVkOFx1OTgwNVx1NzZlZVx1MzAwMg0KLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfVGFibGUxPVx1NGVhNFx1NGVkOFx1OTgwNVx1NzZlZVx1N2Q0NFx1NGVmNg0KLQ0KLVJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvblRpdGxlPVx1NTcxOFx1OTY4YQ0KLVJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvbkRlc2NyaXB0aW9uPVx1NmI2NFx1ODlkMlx1ODI3Mlx1NjNjZlx1OGZmMFx1NWI1MFx1NTNjM1x1NzE2N1x1NGUwYlx1NTIxN1x1NTcxOFx1OTY4YVx1MzAwMg0KLVJvbGVEZXNjcmlwdG9yX1RlYW1fVGFibGUxPVx1NTcxOFx1OTY4YVx1ZmYxYQ0KLQ0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uVGl0bGU9XHU4OWQyXHU4MjcyDQotQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTZiNjRcdTg5MDdcdTU0MDhcdTg5ZDJcdTgyNzJcdTY3MDlcdTRlMGJcdTUyMTdcdTgwNWFcdTk2YzZcdTg5ZDJcdTgyNzJcdTMwMDINCi1Db21wb3NpdGVSb2xlX1JvbGVfVGFibGUxPVx1ODA1YVx1OTZjNlx1ODlkMlx1ODI3Mlx1ZmYxYQ0KLQ0KLVRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvblRpdGxlPVx1ODlkMlx1ODI3Mg0KLVRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uPVx1NTcyOFx1NTcxOFx1OTY4YVx1OGEyZFx1NWI5YVx1NGUyZFx1NjViMFx1NTg5ZVx1NjIxNlx1NzlmYlx1OTY2NFx1ODlkMlx1ODI3Mlx1MzAwMg0KLVRlYW1Qcm9maWxlX1JvbGVfVGFibGUxPVx1ODlkMlx1ODI3Mlx1ZmYxYQ0KLQ0KLVByb2Nlc3NfUmljaFRleHRfQ29sbGFwc2VJbWFnZT1jb2xsYXBzZWQuZ2lmDQotUHJvY2Vzc19SaWNoVGV4dF9FeHBhbmRJbWFnZT1leHBhbmRlZC5naWYNCi1Qcm9jZXNzX0FkZD1cdTY1YjBcdTU4OWUuLi4NCi1Qcm9jZXNzX0FkZEZyb21Qcm9jZXNzPVx1NWY5ZVx1N2EwYlx1NWU4Zlx1NjViMFx1NTg5ZS4uLg0KLVByb2Nlc3NfUmVuYW1lX01lc3NhZ2U9XHU2MGE4XHU1YzA3XHU4YjhhXHU2NmY0XHU2YjY0XHU3YTBiXHU1ZThmXHU3Njg0XHU1NDBkXHU3YTMxXHUzMDAyXHU5MDE5XHU2YTIzXHU2NzAzXHU1MTMyXHU1YjU4XHU2YjY0XHU3ZGU4XHU4ZjJmXHU1NjY4XHVmZjBjXHU0ZTI2XHU1YzA3XHU3YTBiXHU1ZThmXHU4Y2M3XHU2NTk5XHU1OTNlXHU5MWNkXHU2NWIwXHU1NDdkXHU1NDBkXHU3MGJhXHU2NWIwXHU1NDBkXHU3YTMxXHUzMDAyXHU4OTgxXHU3ZTdjXHU3ZThjXHU1NWNlXHVmZjFmDQotUHJvY2Vzc19SZW1vdmU9XHU3OWZiXHU5NjY0DQotUHJvY2Vzc19VcD1cdTRlMGENCi1Qcm9jZXNzX0Rvd249XHU0ZTBiDQotUHJvY2Vzc19NdWx0aXBsZVNlbGVjdGlvbj1cdTU5MWFcdTkxY2RcdTkwNzhcdTk4MDUNCi1Qcm9jZXNzX0J1dHRvbl9MaW5rTWV0aG9kRWxlbWVudD1cdTkzYzhcdTdkNTBcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjAuLi4NCi0NCi0jIyBFcnJvci9XYXJuaW5nDQotUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlPVx1NzEyMVx1NjU0OFx1NTQwZFx1N2EzMQ0KLVByb2Nlc3NfSW52YWxpZE5hbWU9SVVQQTAwODFFOiBcdTU0MGRcdTdhMzFcdTRlMGRcdTgwZmRcdTdhN2FcdTc2N2RcdTMwMDJcdThhY2JcdTYzMDdcdTViOWFcdTY3MDlcdTY1NDhcdTc2ODRcdTU0MGRcdTdhMzFcdTMwMDINCi1Qcm9jZXNzX1JlbmFtZV9UaXRsZT1cdTkxY2RcdTY1YjBcdTU0N2RcdTU0MGQNCi1Qcm9jZXNzX0ludmFsaWRQcmVzZW50YXRpb25OYW1lPUlVUEEwMDgyRTogXHU1NDQ4XHU3M2ZlXHU1NDBkXHU3YTMxXHU0ZTBkXHU4MGZkXHU3YTdhXHU3NjdkXHUzMDAyXHU4YWNiXHU2MzA3XHU1YjlhXHU2NzA5XHU2NTQ4XHU3Njg0XHU1NDQ4XHU3M2ZlXHU1NDBkXHU3YTMxXHUzMDAyDQotUHJvY2Vzc19MaW5rTWV0aG9kRWxlbWVudFRpdGxlPVx1OTNjOFx1N2Q1MFx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMA0KLVByb2Nlc3NfSW52YWxpZExpbmtNZXRob2RFbGVtZW50PUlVUEEwMDgzRTogXHU3MTIxXHU2Y2Q1XHU5MDIzXHU3ZDUwXHU4MWYzICcnezB9JydcdWZmMGNcdTU2ZTBcdTcwYmFcdTZiNjQgTWV0aG9kRWxlbWVudCBcdTVkZjJcdTc1MjhcdTY1YmNcdTc2ZjhcdTU0MGNcdTZiY2RcdTk4MDVcdTc2ODRcdTUxNzZcdTRlZDZcdTYzY2ZcdThmZjBcdTViNTBcdTMwMDINCi1Qcm9jZXNzX0Fzc2lnbm1lbnRJbmZvVGl0bGU9XHU4Y2M3XHU4YTBhDQotUHJvY2Vzc19UZWFtQXNzaWduRXJyb3I9SVVQQTAwODRFOiAnJ3swfScnIFx1NzEyMVx1NmNkNVx1NjViMFx1NTg5ZVx1ODFmM1x1NTcxOFx1OTY4YSAnJ3sxfScnIFxuXG5cdTg5ZDJcdTgyNzJcdTYzY2ZcdThmZjBcdTViNTBcdTVmYzVcdTk4MDhcdTY3MDlcdTc2ZjhcdTk1ZGNcdTc2ODRcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTg5ZDJcdTgyNzJcdWZmMGNcdTYyNGRcdTgwZmRcdTYzMDdcdTViOWFcdTdkNjZcdTU3MThcdTk2OGFcdTMwMDJcblxuXHU4YWNiXHU1MTQ4XHU0ZmVlXHU2YjYzXHU5NWRjXHU4MDZmXHVmZjBjXHU3MTM2XHU1ZjhjXHU1MThkXHU4YTY2XHU0ZTAwXHU2YjIxXHUzMDAyDQotUHJvY2Vzc19UZWFtRGlhbG9nTWVzc2FnZT1cdTkwNzhcdTUzZDZcdTU3MThcdTk2OGENCi1Qcm9jZXNzX1RlYW1EaWFsb2dUaXRsZT1cdTU3MThcdTk2OGENCi0NCi1Qcm9jZXNzX0RlbGl2ZXJhYmxlQXNzaWduRXJyb3I9SVVQQTAwODVFOiAnJ3swfScnIFx1NzEyMVx1NmNkNVx1NjViMFx1NTg5ZVx1ODFmM1x1NGVhNFx1NGVkOFx1OTgwNVx1NzZlZSAnJ3sxfScnXHVmZjBjXHU1NmUwXHU3MGJhXHU2YzkyXHU2NzA5XHU3NmY4XHU5NWRjXHU3Njg0XHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHUzMDAyDQotUHJvY2Vzc19Db21wb3NpdGVSb2xlQXNzaWduRXJyb3I9SVVQQTAwODZFOiAnJ3swfScnIFx1NzEyMVx1NmNkNVx1NjViMFx1NTg5ZVx1ODFmM1x1ODkwN1x1NTQwOFx1ODlkMlx1ODI3MiAnJ3sxfScnXHVmZjBjXHU1NmUwXHU3MGJhXHU2YzkyXHU2NzA5XHU3NmY4XHU5NWRjXHU3Njg0XHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU4OWQyXHU4MjcyXHUzMDAyDQotUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJNZXNzYWdlPUlVUEEwMDg3VzogXHU4YWNiXHU4ZjM4XHU1MTY1XHU2NzA5XHU2NTQ4XHU3Njg0XHU1MjRkXHU0ZTAwXHU3MjQ4XHU2NTc4XHU3NmVlXHUzMDAyDQotUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJUaXRsZT1cdTcxMjFcdTY1NDhcdTc2ODRcdTUyNGRcdTRlMDBcdTcyNDggSUQNCi0NCi1Qcm9jZXNzX05vSXRlbXM9XHU2NzJhXHU5MDc4XHU1M2Q2XHU5ODA1XHU3NmVlDQotUHJvY2Vzc19JdGVtc1NlbGVjdGVkPVx1NWRmMlx1OTA3OFx1NTNkNiB7MH0gXHU1MDBiXHU5ODA1XHU3NmVlDQotUHJvY2Vzc19Ob1Byb3BlcnRpZXNBdmFpbGFibGU9XHU2YzkyXHU2NzA5XHU1M2VmXHU3NTI4XHU3Njg0XHU1MTY3XHU1YmI5DQotDQotUHJlZGVjZXNzb3JEaWFsb2dfVGl0bGU9XHU1MjRkXHU0ZTAwXHU3MjQ4XHU3NmY4XHU0ZjlkXHU5NWRjXHU0ZmMyDQotUHJlZGVjZXNzb3JEaWFsb2dfSGVhZGVyTWVzc2FnZT1cdThmMzhcdTUxNjVcdTUyNGRcdTRlMDBcdTcyNDhcdTc2ODRcdTc2ZjhcdTRmOWRcdTk1ZGNcdTRmYzJcdTk4NWVcdTU3OGJcdWZmMWENCi1QcmVkZWNlc3NvckRpYWxvZ19JbmRleD1cdTdkMjJcdTVmMTVcdWZmMWENCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVzZW50YXRpb25OYW1lPVx1NTQ0OFx1NzNmZVx1NTQwZFx1N2EzMVx1ZmYxYQ0KLVByZWRlY2Vzc29yRGlhbG9nX0RlcGVuZGVuY3k9XHU3NmY4XHU0ZjlkXHU5NWRjXHU0ZmMyXHVmZjFhDQotUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvckRpYWxvZ1RpdGxlPVx1NTI0ZFx1NGUwMFx1NzI0OA0KLVByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JNZXNzYWdlPUlVUEEwMDg4RTogXHU2YjY0XHU1ZGU1XHU0ZjVjXHU1MjA2XHU4OWUzXHU1MTQzXHU3ZDIwXHU1ZGYyXHU1YjU4XHU1NzI4XHU2YjY0IElEIFx1NzY4NFx1NTI0ZFx1NGUwMFx1NzI0OFx1MzAwMg0KLQ0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc190ZXh0RWRpdENlbGxfcHJvYmxlbV9tc2c9SVVQQTAwOTBFOiBcdTdkZThcdThmMmZcdTUxNjdcdTViYjlcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdTMwMDINCi1Qcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfY2VsbEVkaXRvcl9pbnZhbGlkUHJlZGNlc3Nvcl9wcm9ibGVtX21zZz1JVVBBMDA4OVc6IFx1NzEyMVx1NjU0OFx1NzY4NFx1NTI0ZFx1NGUwMFx1NzI0OFx1NmUwNVx1NTVhZQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGRmODBlMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYzFhNzVlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDIuamFyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogZnJhZ21lbnQKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTAzNjlhMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS5ubDIuamFyID0gc3JjLw0KLW91dHB1dC5ubDIuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IG5sMi5qYXIsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIGZyYWdtZW50LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyL2ZyYWdtZW50LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyL2ZyYWdtZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYwZTdjYzIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMi9mcmFnbWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mcmFnbWVudE5hbWU9RVBGIENvbXBvc2VyIEF1dGhvcmluZyBVSSAoTkwyKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MWZmYzJjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgRVBGIC0gXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5IFx1MDQzOFx1MDQzZFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQ0NFx1MDQzNVx1MDQzOVx1MDQ0MQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgQ2F0ZWdvcnkNCi1tZXRob2RDYXRlZ29yeU5hbWU9XHUwNDFjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0DQotDQotIyBQZXJzcGVjdGl2ZQ0KLWF1dGhvcmluZ1BlcnNwZWN0aXZlTmFtZT1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUNCi1icm93c2luZ1BlcnNwZWN0aXZlTmFtZT1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDANCi0NCi0jIFZpZXdzDQotbGlicmFyeVZpZXdOYW1lPVx1MDQxMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzMA0KLWNvbmZpZ3VyYXRpb25WaWV3TmFtZT1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYNCi1jb250ZW50Vmlld05hbWU9XHUwNDFjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiDQotY29uZmlndXJhdGlvbkVycm9yTG9nVmlld05hbWU9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDNhXHUwNDNlXHUwNDNiIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzZVx1MDQzYSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi0NCi0jIEVkaXRvcnMNCi1tZXRob2RFbGVtZW50RWRpdG9yTmFtZT1cdTA0MjBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLWNvbmZpZ3VyYXRpb25FZGl0b3JOYW1lPVx1MDQyMFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1wcm9jZXNzRWRpdG9yTmFtZT1cdTA0MjBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDNlXHUwNDMyDQotYWN0aXZpdHlEaWFncmFtRWRpdG9yTmFtZT1cdTA0MjBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOQ0KLWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvck5hbWU9XHUwNDIwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwIFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2MgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5DQotd29ya1Byb2R1Y3REZXBlZGVuY3lEaWFncmFtRWRpdG9yTmFtZT1cdTA0MjBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjIFx1MDQzN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzOSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwDQotDQotIyBDaGVhdCBTaGVldHMNCi1tZXRob2RBdXRob3JpbmdDaGVhdFNoZWV0c05hbWU9XHUwNDFmXHUwNDMwXHUwNDNjXHUwNDRmXHUwNDQyXHUwNDNhXHUwNDM4IFx1MDQzZlx1MDQzZSBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGUgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotQ2hlYXRzaGVldEdldHN0YXJ0ZWRDYXRlZ29yeVRleHQ9XHUwNDFkXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDNiXHUwNDNlIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQ0Yg0KLUNoZWF0c2hlZXRSZXVzYWJsZUNvbnRlbnRDYXRlZ29yeVRleHQ9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzY1x1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQ0Ylx1MDQzNSBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0NGIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotQ2hlYXRzaGVldFdyaXRlQ29udGVudENhdGVnb3J5VGV4dD1cdTA0MTdcdTA0MzBcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLUNoZWF0c2hlZXRQcm9jZXNzZXNDYXRlZ29yeVRleHQ9XHUwNDIwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDMwIFx1MDQ0MSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzBcdTA0M2NcdTA0MzgNCi1DaGVhdHNoZWV0TmF2aWdhdGVNZXRob2RDb250ZW50PVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MCBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb249XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQzZVx1MDQzMVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZFBsdWdpbj1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDNlXHUwNDMxXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQ0YyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1DaGVhdHNoZWV0QWRkTWV0aG9kQ29udGVudD1cdTA0MTRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMCwgXHUwNDNkXHUwNDMwXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDQwIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzOCwgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4LCBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYNCi1DaGVhdHNoZWV0VGFpbG9yTWV0aG9kRWxlbWVudHM9XHUwNDIzXHUwNDQyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwIChcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzgsIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOCwgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0YiBcdTA0MzggXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmKSBcdTA0NDEgXHUwNDQzXHUwNDQ3XHUwNDM1XHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOQ0KLUNoZWF0c2hlZXRSZXBsYWNlTWVodG9kRWxlbWVudHM9XHUwNDE3XHUwNDMwXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwIChcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzgsIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOCwgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0YiBcdTA0MzggXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmKQ0KLUNoZWF0c2hlZXRBZGRNZXRob2RSZWZPckh5cGVybGluaz1cdTA0MTRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDQzIFx1MDQzZFx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzQgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQzM1x1MDQzOFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQ0MyAoVVJMKQ0KLUNoZWF0c2hlZXRBcHBseUNhcGFiaWxpdHlQYXR0ZXJuPVx1MDQxZlx1MDQ0MFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2QgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5DQotQ2hlYXRzaGVldENyZWF0ZVByb2Nlc3M9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MSAoXHUwNDQ4XHUwNDMwXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNkIFx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzOSBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxIFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYVx1MDQzOCkNCi0NCi0jIEFjdGlvbiBTZXQNCi1hdXRob3JpbmdBY3Rpb25TZXQ9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1DQotY2hlYXRTaGVldHNBY3Rpb25TZXQ9XHUwNDFmXHUwNDMwXHUwNDNjXHUwNDRmXHUwNDQyXHUwNDNhXHUwNDM4DQotDQotIyBHbG9iYWwgQWN0aW9ucw0KLW5ld0xpYnJhcnlBY3Rpb249Jlx1MDQxMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1uZXdMaWJyYXJ5QWN0aW9uVG9vbHRpcD1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLW5ld1BsdWdpbkFjdGlvbj0mXHUwNDFjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRjIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLW5ld1BsdWdpbkFjdGlvblRvb2x0aXA9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQ0YyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1uZXdDb25maWdBY3Rpb249Jlx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1uZXdDb25maWdBY3Rpb25Ub29sdGlwPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotb3BlbkxpYnJhcnlBY3Rpb249Jlx1MDQxMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1vcGVuTGlicmFyeUFjdGlvblRvb2x0aXA9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1vcGVuQ29uZmlnQWN0aW9uPSZcdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotb3BlbkNvbmZpZ0FjdGlvblRvb2x0aXA9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1vcGVuQ2hlYXRTaGVldHM9XHUwNDFmXHUwNDMwXHUwNDNjXHUwNDRmXHUwNDQyXHUwNDNhXHUwNDM4Li4uDQotDQotIyBMaWJyYXJ5IFZpZXcgQWN0aW9ucw0KLWxpbmtXaXRoRWRpdG9yPVx1MDQyMVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDEgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDNjDQotbGlua1dpdGhFZGl0b3JUb29sdGlwPVx1MDQyMVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDEgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDNjDQotc2hvd1ByZXNlbnRhdGlvbk5hbWVzPVx1MDQxZlx1MDQzZVx1MDQzYVx1MDQzMFx1MDQzN1x1MDQ0Ylx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM5DQotc2hvd1ByZXNlbnRhdGlvbk5hbWVzVG9vbHRpcD1cdTA0MWZcdTA0M2VcdTA0M2FcdTA0MzBcdTA0MzdcdTA0NGJcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOQ0KLQ0KLSMgQ29uZmlndXJhdGlvbiBWaWV3IEFjdGlvbnMNCi1yZWZyZXNoQ29uZmlnPVx1MDQxZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0Yw0KLXJlZnJlc2hDb25maWdUb29sdGlwPVx1MDQxZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUNCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLW1ldGhvZEF1dGhvcmluZ1BhZ2U9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLXByb2Nlc3NFZGl0b3I9XHUwNDIwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzZVx1MDQzMg0KLWxpYnJhcnlPcHRpb25zPVx1MDQxZVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzgNCi1kaWFncmFtPVx1MDQxNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQzMA0KLXN0YXJ0dXBBbmRTaHV0ZG93bj1cdTA0MTdcdTA0MzBcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0M2EgXHUwNDM4IFx1MDQzN1x1MDQzMFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0OFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0NGINCi1kZWJ1Zz1cdTA0MWVcdTA0NDJcdTA0M2JcdTA0MzBcdTA0MzRcdTA0M2FcdTA0MzANCi0NCi0jIENvbW1hbmQgSGFuZGxlcg0KLXNlbGVjdEFsbD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDQxXHUwNDM1DQotDQotIyBQcm9wZXJ0aWVzIFZpZXcNCi1fVUlfUHJvY2Vzc0VkaXRvcl9tZW51PVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MQ0KLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09Jlx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzRcdTA0M2VcdTA0NDdcdTA0MzVcdTA0NDBcdTA0M2RcdTA0MzhcdTA0MzkgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyDQotX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyAmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNkXHUwNDNlXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0Mg0KLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPSZcdTA0MWZcdTA0M2VcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNiXHUwNDRjIFx1MDQ0MVx1MDQzMlx1MDQzZVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMg0KLV9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbT0mXHUwNDFlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjDQotX1VJX1Byb3BlcnRpZXNfR2VuZXJhbD1cdTA0MWVcdTA0MzFcdTA0NDlcdTA0MzhcdTA0MzUNCi1fVUlfUHJvcGVydGllc19Eb2N1bWVudGF0aW9uPVx1MDQxNFx1MDQzZVx1MDQzYVx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0Zg0KLV9VSV9Qcm9wZXJ0aWVzX0d1aWRhbmNlPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLV9VSV9Qcm9wZXJ0aWVzX1dvcmtfUm9sbHVwPVx1MDQyMFx1MDQzMFx1MDQzN1x1MDQzMi4gXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4DQotX1VJX1Byb3BlcnRpZXNfVGVhbV9Sb2xsdXA9XHUwNDIwXHUwNDMwXHUwNDM3XHUwNDMyLiBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NGINCi0jIyBUaGUgZm9sbG93aW5nIHZhbHVlIG9mIHN0cmluZyBzaG91bGQgYmUgIldvcmsgUHJvZHVjdCBSb2xsdXAiLiBCdXQNCi0jIyBkdWUgdG8gbGltaXRhdGlvbi9idWcgaW4gRWNsaXBzZSBXVFAsIGl0J3MgYmVlbiB0cnVuY2F0ZWQgdG8gDQotIyMgIldvcmsgUHJvZCBSb2xsdXAiLiBTbyBkdXJpbmcgdHJhbnNsYXRpb24sIHBsZWFzZSB0YWtlIHRoaXMgaW50byBjb25zaWRlcmF0aW9uLg0KLV9VSV9Qcm9wZXJ0aWVzX1dQX1JvbGx1cD1cdTA0MjBcdTA0MzBcdTA0MzdcdTA0MzIuIFx1MDQyMFx1MDQxZg0KLV9VSV9Qcm9wZXJ0aWVzX1JvbGVzPVx1MDQyMFx1MDQzZVx1MDQzYlx1MDQzOA0KLV9VSV9Qcm9wZXJ0aWVzX1dvcmtQcm9kdWN0cz1cdTA0MjBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiDQotX1VJX1Byb3BlcnRpZXNfU3RlcHM9XHUwNDI4XHUwNDMwXHUwNDMzXHUwNDM4DQotX1VJX1Byb3BlcnRpZXNfVGVhbXM9XHUwNDEzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDRiDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM2NzA4NzkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXByZXZpb3VzX25hbWVfbnVsbDE9XHUwNDFkXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQzZVx1MDQ0Mlx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUsIFx1MDQzZlx1MDQzZVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQ0MyBcdTA0M2RcdTA0MzUgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNlx1MDQzZFx1MDQzNVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYuDQotZXJyX25hbWVfZW1wdHk9XHUwNDE4XHUwNDNjXHUwNDRmIFx1MDQzZFx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQ0Ylx1MDQzYy4gXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYuDQotbW92ZUFjdGlvbl9sYWJlbD1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M2NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzhcdTA0NDJcdTA0NGMNCi0NCi1BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDRjDQotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90b29sdGlwPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M2IgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQ0Yw0KLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX3RpdGxlPVx1MDQxNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M2INCi1BYnN0cmFjdERpYWdyYW1fQWRkTm9kZV9lcnJfbXNnPUlYUkQwMDAyVzogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0MzRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDNiIFx1MDQzMiBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0NDMNCi1BYnN0cmFjdERpYWdyYW1fTGlua190ZXh0PVx1MDQyMVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQ0Yw0KLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3NlbGVjdD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDRjDQotQWJzdHJhY3REaWFncmFtX0xpbmtfdG9vbHRpcD1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDRjDQotQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0PVx1MDQxZFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M2INCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXA9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M2INCi1BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dD1cdTA0MjFcdTA0MzJcdTA0M2VcdTA0MzFcdTA0M2VcdTA0MzRcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQxXHUwNDQyDQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXA9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQzMlx1MDQzZVx1MDQzMVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDFcdTA0NDINCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90ZXh0PVx1MDQxZlx1MDQzZVx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQzMCBcdTA0NDFcdTA0MzhcdTA0M2RcdTA0NDVcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90b29sdGlwPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NDMgXHUwNDQxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0PVx1MDQyM1x1MDQzN1x1MDQzNVx1MDQzYiBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0M2RcdTA0NGZcdTA0NDJcdTA0MzhcdTA0NGYgXHUwNDQwXHUwNDM1XHUwNDQ4XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90b29sdGlwPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M2IgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDNkXHUwNDRmXHUwNDQyXHUwNDM4XHUwNDRmIFx1MDQ0MFx1MDQzNVx1MDQ0OFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLUFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3RleHQ9XHUwNDFhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQ0M1x1MDQzN1x1MDQzNVx1MDQzYg0KLUFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9wcmVmaXg9XHUwNDFmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM4IFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzODoNCi1BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90b29sdGlwPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDNiDQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9XHUwNDFlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmDQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXA9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZQ0KLUFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1cdTA0MThcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYNCi1BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3Rvb2x0aXA9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZQ0KLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0PVx1MDQyZFx1MDQ0Mlx1MDQzMFx1MDQzZg0KLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90b29sdGlwPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NGRcdTA0NDJcdTA0MzBcdTA0M2YNCi1BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dD1cdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4DQotQWJzdHJhY3REaWFncmFtX1JvbGVEZXNjcmlwdG9yX3RleHQ9XHUwNDE0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzOA0KLVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4PVx1MDQxNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQzMCBcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDFcdTA0MzhcdTA0M2NcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMDoNCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdG9vbHRpcD1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzOA0KLUFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4DQotQWN0dml0aXZpdHlEaWFncmFtX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0PVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MSBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2FcdTA0MzgNCi1BY3R2aXRpdml0eURpYWdyYW1fQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1cdTA0MjhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2QgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5DQotQWN0dml0aXZpdHlEaWFncmFtX1BoYXNlX3RleD1cdTA0MmRcdTA0NDJcdTA0MzBcdTA0M2YNCi1BY3R2aXRpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ9XHUwNDE4XHUwNDQyXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmDQotQWN0dml0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9XHUwNDFlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmDQotQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0PVx1MDQxNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwDQotQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90b29sdGlwPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMA0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1cdTA0MTJcdTA0NGJcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2RcdTA0MzhcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1cdTA0MWVcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDNlIFx1MDQzMVx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQzZVx1MDQzOSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9XHUwNDFlXHUwNDQyXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MVx1MDQ0Mlx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0MzUuLi4NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVx1MDQxM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQzN1x1MDQzZVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZSBcdTA0M2ZcdTA0M2UgXHUwNDQxXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDNkXHUwNDM1XHUwNDNjXHUwNDQzDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1cdTA0MTNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzdcdTA0M2VcdTA0M2RcdTA0NDJcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2UgXHUwNDNmXHUwNDNlIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMlx1MDQzZVx1MDQzY1x1MDQ0MyBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0M2NcdTA0NDMNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVx1MDQxMlx1MDQzNVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZSBcdTA0M2ZcdTA0M2UgXHUwNDQxXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDNkXHUwNDM1XHUwNDNjXHUwNDQzDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1cdTA0MTJcdTA0MzVcdTA0NDBcdTA0NDJcdTA0MzhcdTA0M2FcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2UgXHUwNDNmXHUwNDNlIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMlx1MDQzZVx1MDQzY1x1MDQ0MyBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0M2NcdTA0NDMNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PVx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0Yw0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9XHUwNDIxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IHswfQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9Nb3ZlTm9kZV9sYWJlbD1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M2NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDNiDQotQWJzdHJhY3REaWFncmFtRWRpdG9ycmVmcmVzaGZyb21iYXNlPVx1MDQxZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0M2UgXHUwNDMxXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDNlXHUwNDM5DQotQWJzdHJhY3REaWFncmFtX0JlbmRQb2ludF9jcmVhdGU9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQzY1x1MDQ0M1x1MDQzYw0KLQ0KLUFjdGl2aXR5RGlhZ3JhbV9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0NDMgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotcmVmcmVzaEFjdGlvbl9sYWJlbD1cdTA0MWVcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMNCi1yZWZyZXNoRnJvbUJhc2VDbWRfbGFiZWw9XHUwNDFlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzZSBcdTA0MzFcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzkNCi1kaWFncmFtX3NhdmVFcnJvcj1JVVBEMDAwMVc6IFx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NGMgXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQ0Mw0KLQ0KLURlbGV0ZURpYWdyYW1fdGV4dD1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDQzDQotRGVsZXRlRGlhZ3JhbV9wcm9tcHQ9XHUwNDE3XHUwNDMwXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzOCBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDQzP1xuXHUwNDJkXHUwNDQyXHUwNDNlIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0M2RcdTA0MzVcdTA0M2JcdTA0NGNcdTA0MzdcdTA0NGYgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDM1XHUwNDQyIFx1MDQzZVx1MDQ0Mlx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0Yy4NCi1hbGlnbl9iZW5kX3BvaW50X3RleHQ9XHUwNDEyXHUwNDRiXHUwNDQwXHUwNDNlXHUwNDMyXHUwNDNkXHUwNDRmXHUwNDQyXHUwNDRjIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQzY1x1MDQ0M1x1MDQzYw0KLUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dF9jb25maWdlZGl0b3IwPVx1MDQyMFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1kaWFncmFtX25vZGVfcHJvcGVydHlfdmFsdWVfcHJvYmxlbV9tc2c9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0NDFcdTA0MzJcdTA0M2VcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzAgXHUwNDQzXHUwNDM3XHUwNDNiXHUwNDMwLg0KLWRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwDQotDQotQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0PVx1MDQyMVx1MDQzMVx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2NcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDIgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDRiDQotZXJyb3JEaWFsb2dfdGl0bGU9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwDQotY29tbWFuZF9jYW5ub3RFZGl0PUlVUEQwMDAzRTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDQzDQotDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RpdGxlPVx1MDQxN1x1MDQzMFx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0MiBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzMA0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90ZXh0PVx1MDQxZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0MiB7MH0gXHUwNDM3XHUwNDMwXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyLiBcdTA0MTdcdTA0MzBcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDQyXHUwNDMwXHUwNDNhXHUwNDM2XHUwNDM1IHsxfT8NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXNfcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTU2OGU5MC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIxMyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRm9ybSBQYWdlIFRpdGxlcw0KLWFzc2lnblBhZ2VfdGl0bGU9XHUwNDFkXHUwNDMwXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotY2F0ZWdvcmllc1BhZ2VfdGl0bGU9XHUwNDFhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4DQotZGVsaXZlcmFibGVQYXJ0c1BhZ2VfdGl0bGU9XHUwNDFhXHUwNDNlXHUwNDNjXHUwNDNmXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQzNVx1MDQ0N1x1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzANCi1kZXNjcmlwdGlvblBhZ2VfdGl0bGU9XHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1DQotZGlzY2lwbGluZXNQYWdlX3RpdGxlPVx1MDQxNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZFx1MDQ0Yg0KLWRpc2NhcmR1bnJlc29sdmVkcmVmPVx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQ0Zlx1MDQ0Mlx1MDQ0YyBcdTA0M2RcdTA0MzVcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0MzBcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4DQotZ3VpZGFuY2VQYWdlX3RpdGxlPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLXByZXZpZXdQYWdlX3RpdGxlPVx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMlx1MDQzMFx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDANCi1yZWZlcmVuY2VzUGFnZV90aXRsZT1cdTA0MjFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzgNCi1yZWZlcmVuY2VfdGV4dD1cdTA0MjFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0Mzg6DQotcmVmZXJlbmNlV29ya2Zsb3dQYWdlX3RpdGxlPVx1MDQyMVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2ZcdTA0M2VcdTA0NDJcdTA0M2VcdTA0M2EgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5DQotcm9sZXNQYWdlX3RpdGxlPVx1MDQyMFx1MDQzZVx1MDQzYlx1MDQzOA0KLXJvbGVTZXRzUGFnZV90aXRsZT1cdTA0MWRcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDBcdTA0NGIgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM1XHUwNDM5DQotc3RlcHNQYWdlX3RpdGxlPVx1MDQyOFx1MDQzMFx1MDQzM1x1MDQzOA0KLXRhc2tzUGFnZV90aXRsZT1cdTA0MTdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzgNCi10b29sTWVudG9yc1BhZ2VfdGl0bGU9XHUwNDIwXHUwNDQzXHUwNDNhXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzZlx1MDQzZSBcdTA0MzhcdTA0M2RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzBcdTA0M2MNCi13b3JrUHJvZHVjdHNQYWdlX3RpdGxlPVx1MDQyMFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGINCi0NCi0jIFNlY3Rpb24gTmFtZXMgJiBEZXNjcmlwdGlvbg0KLWNoZWNrSXRlbXNTZWN0aW9uX25hbWU9XHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0NDJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0NGINCi1jaGVja0l0ZW1zU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIsIFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQ0Zlx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0MzIgXHUwNDQxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQ0My4NCi1kZXBlbmRlbmNpZXNTZWN0aW9uX25hbWU9XHUwNDE3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM4DQotZGVwZW5kZW5jaWVzU2VjdGlvbl9kZXNjPVx1MDQxMiBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQ0YiBcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDFcdTA0MzhcdTA0M2NcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzggXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0Mlx1MDQzMCBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDNlXHUwNDQyIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQ0NSBcdTA0M2ZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzINCi1kZXRhaWxTZWN0aW9uX25hbWU9XHUwNDFmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLWRldGFpbFNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2VcdTA0MzEgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDM1ICJ7MH0iLg0KLWdlbmVyYWxJbmZvU2VjdGlvbl9uYW1lPVx1MDQxZVx1MDQzMVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2VcdTA0MzEgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDM1ICJ7MH0iLg0KLWljb25TZWN0aW9uX25hbWU9XHUwNDE3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNlXHUwNDNhDQotaWNvblNlY3Rpb25fZGVzYz1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNhXHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2VcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDJcdTA0MzAgInswfSIuDQotbm90YXRpb25TZWN0aW9uX25hbWU9XHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZSBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2FcdTA0MzUNCi1ub3RhdGlvblNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZSBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2FcdTA0MzUgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzMCAiezB9Ii4NCi1yZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fbmFtZT1cdTA0MjFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM4Og0KLXJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9kZXNjPVx1MDQxMiBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQ0YiBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzgsIFx1MDQzZFx1MDQzMCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwLg0KLXN0YWZmaW5nU2VjdGlvbl9uYW1lPVx1MDQxOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0M2UgXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDNiXHUwNDM1DQotc3RhZmZpbmdTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2UgXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDNiXHUwNDM1IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM4Lg0KLXN0ZXBzU2VjdGlvbl9uYW1lPVx1MDQyOFx1MDQzMFx1MDQzM1x1MDQzOA0KLXN0ZXBzU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDhcdTA0MzBcdTA0MzNcdTA0MzggXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4Lg0KLXRhaWxvcmluZ1NlY3Rpb25fbmFtZT1cdTA0MTRcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzRcdTA0M2FcdTA0MzANCi10YWlsb3JpbmdTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2UgXHUwNDM0XHUwNDNlXHUwNDMyXHUwNDNlXHUwNDM0XHUwNDNhXHUwNDM1IFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzMCAiezB9Ii4NCi12YXJpYWJpbGl0eVNlY3Rpb25fbmFtZT1cdTA0MTJcdTA0MzBcdTA0NDBcdTA0MzhcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NGMgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyDQotdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1LCBcdTA0M2FcdTA0MzBcdTA0M2EgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyICJ7MH0iIFx1MDQzZVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2EgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDQzICJ7MH0iLg0KLXZlcnNpb25JbmZvU2VjdGlvbl9uYW1lPVx1MDQyMVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4DQotdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzMCAiezB9Ii4NCi0NCi0jIFVJICYgRWxlbWVudCBBdHRyaWJ1dGUgTGFiZWxzDQotYWRkaXRpb25hbEluZm9fdGV4dD1cdTA0MTRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmOg0KLWFwcGxpY2F0aW9uX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDNiXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1Og0KLWFjdGlvbkxhYmVsX2VkaXQ9XHUwNDE4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjDQotYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdj1cdTA0MWZcdTA0M2VcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDMyIFx1MDQzZlx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzYlx1MDQzOCBcdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzANCi1hbHRlcm5hdGl2ZXNfdGV4dD1cdTA0MTBcdTA0M2JcdTA0NGNcdTA0NDJcdTA0MzVcdTA0NDBcdTA0M2RcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0NGI6DQotYXNzaWdubWVudEFwcHJvYWNoZXNfdGV4dD1cdTA0MWZcdTA0M2VcdTA0MzRcdTA0NDVcdTA0M2VcdTA0MzRcdTA0NGIgXHUwNDNhIFx1MDQzZFx1MDQzMFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZToNCi1hdXRob3JzX3RleHQ9XHUwNDEwXHUwNDMyXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiOg0KLWJhY2tncm91bmRfdGV4dD1cdTA0MWZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NGJcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NGY6DQotYmFzZUVsZW1lbnRfdGV4dD1cdTA0MTFcdTA0MzBcdTA0MzdcdTA0MzA6DQotYmFzZUd1aWRhbmNlX3RleHQ9XHUwNDExXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDNlXHUwNDM1IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNToNCi1icmllZkRlc2NyaXB0aW9uX3RleHQ9XHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1Og0KLWRlc2NyaXB0aW9uX3RleHQ9XHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1Og0KLWJhY2t1cGJlZm9yZXNhdmVfdGV4dD1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQwXHUwNDM1XHUwNDM3XHUwNDM1XHUwNDQwXHUwNDMyXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzYVx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0ZSBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzQgXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1XHUwNDNjDQotYnJpZWZPdXRsaW5lX3RleHQ9XHUwNDFhXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDNhXHUwNDMwXHUwNDRmIFx1MDQ0MVx1MDQ0NVx1MDQzNVx1MDQzY1x1MDQzMDoNCi1jaGFuZ2VEYXRlX3RleHQ9XHUwNDE0XHUwNDMwXHUwNDQyXHUwNDMwIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZjoNCi1jaGFuZ2VEZXNjcmlwdGlvbl90ZXh0PVx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGY6DQotY2hlY2tJdGVtc190ZXh0PVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0NDFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDQyXHUwNDMwXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDQ2XHUwNDRiDQotY29udHJpYnV0ZXNfdGV4dD1cdTA0MTRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDINCi1sb2NhbENvbnRyaWJ1dGVzX3RleHQ9XHUwNDFiXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQ0Zlx1MDQzNVx1MDQ0Mg0KLWNvbnRyaWJ1dGVzX3RvX3RleHQ9XHUwNDE0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDRmXHUwNDM1XHUwNDQyDQotY29weXJpZ2h0X3RleHQ9XHUwNDEwXHUwNDMyXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzMDoNCi1lZGl0b3JfdGV4dD1cdTA0MjBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDANCi1leHRlbmRzX3RleHQ9XHUwNDIwXHUwNDMwXHUwNDQxXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDRmXHUwNDM1XHUwNDQyDQotZXh0ZW5kX3RleHQ9XHUwNDIwXHUwNDMwXHUwNDQxXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDRjDQotZXh0ZXJuYWxEZXNjcmlwdGlvbl90ZXh0PVx1MDQxMlx1MDQzZFx1MDQzNVx1MDQ0OFx1MDQzZFx1MDQzNVx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzU6DQotZXh0ZXJuYWxJZF90ZXh0PVx1MDQxMlx1MDQzZFx1MDQzNVx1MDQ0OFx1MDQzZFx1MDQzOFx1MDQzOSBcdTA0MThcdTA0MTQ6DQotZ29hbHNfdGV4dD1cdTA0MjZcdTA0MzVcdTA0M2JcdTA0Mzg6DQotaW1wYWN0T2ZOb3RIYXZpbmdfdGV4dD1cdTA0MWZcdTA0M2VcdTA0NDFcdTA0M2JcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzhcdTA0NGYgXHUwNDNlXHUwNDQyXHUwNDQxXHUwNDQzXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM4XHUwNDRmOg0KLWtleUNvbnNpZGVyYXRpb25zX3RleHQ9XHUwNDFhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDM1XHUwNDMyXHUwNDRiXHUwNDM1IFx1MDQ0M1x1MDQ0MVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0ZjoNCi1sZXZlbHNPZkFkb3B0aW9uX3RleHQ9XHUwNDIzXHUwNDQwXHUwNDNlXHUwNDMyXHUwNDM1XHUwNDNkXHUwNDRjIFx1MDQzMlx1MDQzZFx1MDQzNVx1MDQzNFx1MDQ0MFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZjoNCi1tYWluRGVzY3JpcHRpb25fdGV4dD1cdTA0MWVcdTA0NDFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1Og0KLW5ld0VsZW1lbnRfdGV4dD1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgezB9DQotbmFtZV90ZXh0PVx1MDQxOFx1MDQzY1x1MDQ0ZjoNCi1ub3RBcHBsaWNhYmxlX3RleHQ9XHUwNDFkXHUwNDM1XHUwNDNmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDNjXHUwNDNlDQotcGFja2FnaW5nR3VpZGFuY2VfdGV4dD1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNmXHUwNDNlIFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZSBcdTA0M2ZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDJcdTA0MzA6DQotcHJlc2VudGF0aW9uTmFtZV90ZXh0PVx1MDQxOFx1MDQzY1x1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGY6DQotcHJvbXB0Zm9ybGliYXJ5X3RleHQ9XHUwNDE3XHUwNDMwXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDM4XHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQzY1x1MDQ0ZiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0MzdcdTA0MzBcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzUNCi1lbmFibGVIZWFsdGhDaGVja190ZXh0PVx1MDQxMlx1MDQzYVx1MDQzYlx1MDQ0ZVx1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0M2RcdTA0NDNcdTA0NDJcdTA0NDBcdTA0MzVcdTA0M2RcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzZVx1MDQ0Mlx1MDQzYlx1MDQzMFx1MDQzNFx1MDQzYVx1MDQzOA0KLXByb2JsZW1fdGV4dD1cdTA0MWRcdTA0MzVcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0MzBcdTA0MzRcdTA0M2FcdTA0MzA6DQotcHVycG9zZV90ZXh0PVx1MDQxZFx1MDQzMFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNToNCi1yZWFzb25Gb3JOb3ROZWVkaW5nX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDQ3XHUwNDM4XHUwNDNkXHUwNDMwIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2VcdTA0NDJcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzA6DQotcmVwbGFjZXNfdGV4dD1cdTA0MTdcdTA0MzBcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDINCi1sb2NhbFJlcGxhY2VzX3RleHQ9XHUwNDFiXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlIFx1MDQzN1x1MDQzMFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Zlx1MDQzNVx1MDQ0Mg0KLXJlcHJlc2VudGF0aW9uT3B0aW9uc190ZXh0PVx1MDQxZlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQ0MFx1MDQ0YiBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGY6DQotdGVtcGxhdGVGaWxlX3RleHQ9XHUwNDI0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiIFx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZFx1MDQzZVx1MDQzMjoNCi1za2lsbHNfdGV4dD1cdTA0MWRcdTA0MzBcdTA0MzJcdTA0NGJcdTA0M2FcdTA0Mzg6DQotc3RlcHNfdGV4dD1cdTA0MjhcdTA0MzBcdTA0MzNcdTA0Mzg6DQotc3RlcHNfbmFtZV90ZXh0PVx1MDQxOFx1MDQzY1x1MDQ0ZjoNCi1zdG9wX3RleHQ9XHUwNDIxXHUwNDQyXHUwNDNlXHUwNDNmDQotcHJpbnRfdGV4dD1cdTA0MWZcdTA0MzVcdTA0NDdcdTA0MzBcdTA0NDJcdTA0NGMNCi1zeW5vbnltc190ZXh0PVx1MDQyMVx1MDQzOFx1MDQzZFx1MDQzZVx1MDQzZFx1MDQzOFx1MDQzY1x1MDQ0YjoNCi10eXBlX3RleHQ9XHUwNDIyXHUwNDM4XHUwNDNmOg0KLWNvcHlfdGV4dD1cdTA0MjFcdTA0M2FcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMNCi1kZWVwQ29weV90ZXh0PVx1MDQyMFx1MDQzNVx1MDQzYVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzMlx1MDQzZFx1MDQzZVx1MDQzNSBcdTA0M2FcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUNCi1iYWNrX3RleHQ9XHUwNDFkXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDM0DQotbmV3X3BsdWdpbj1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRjIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLW1vdmU9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDRjLi4uDQotdW5pcXVlSWRfdGV4dD1cdTA0MjNcdTA0M2RcdTA0MzhcdTA0M2FcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDE4XHUwNDE0Og0KLXZhcmlhYmlsaXR5VHlwZV90ZXh0PVx1MDQyMlx1MDQzOFx1MDQzZiBcdTA0MzJcdTA0MzBcdTA0NDBcdTA0MzhcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0Mzg6DQotdmVyc2lvbl90ZXh0PVx1MDQxMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQ0ZjoNCi0NCi0jIEJ1dHRvbiBMYWJlbHMNCi1hZGRCdXR0b25fdGV4dD1cdTA0MTRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMuLi4NCi1hdHRhY2hCdXR0b25fdGV4dD1cdTA0MTJcdTA0M2JcdTA0M2VcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NGMuLi4NCi1icm93c2VCdXR0b25fdGV4dD1cdTA0MWVcdTA0MzFcdTA0MzdcdTA0M2VcdTA0NDAuLi4NCi1jaGFuZ2VUeXBlQnV0dG9uX3RleHQ9XHUwNDE4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0Mlx1MDQzOFx1MDQzZi4uLg0KLWNsZWFyQnV0dG9uX3RleHQ9XHUwNDFlXHUwNDQ3XHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDRjDQotZGVsZXRlQnV0dG9uX3RleHQ9XHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM4XHUwNDQyXHUwNDRjDQotZGV0YWNoQnV0dG9uX3RleHQ9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDM1XHUwNDNmXHUwNDM4XHUwNDQyXHUwNDRjDQotZGlhZ3JhbV9zYXZlRXJyb3I9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0NDFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDRiDQotZG93bkJ1dHRvbl90ZXh0PVx1MDQxMlx1MDQzZFx1MDQzOFx1MDQzNw0KLWRpcmVjdG9yeV90ZXh0PVx1MDQxYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMzoNCi1vcmRlckJ1dHRvbl90ZXh0PVx1MDQxZlx1MDQzZVx1MDQ0MFx1MDQ0Zlx1MDQzNFx1MDQzZVx1MDQzYQ0KLWVkaXRCdXR0b25fdGV4dD1cdTA0MThcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMuLi4NCi1yZW1vdmVCdXR0b25fdGV4dD1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMNCi1yZW5hbWVBY3Rpb25fdGV4dD1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMuLi4NCi1yZW1vdmVfdGV4dD1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMNCi1yZW5hbWVfdGV4dD1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMNCi1TYXZlQXNfdGV4dD1cdTA0MjFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDMwXHUwNDNhDQotc2VsZWN0QnV0dG9uX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDRjLi4uDQotZGVzZWxlY3RCdXR0b25fdGV4dD1cdTA0MWVcdTA0NDJcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDNlXHUwNDQwDQotdXBCdXR0b25fdGV4dD1cdTA0MTJcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDUNCi1tYWtlRGVmYXVsdEJ1dHRvbl90ZXh0PVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0M2UgXHUwNDQzXHUwNDNjXHUwNDNlXHUwNDNiXHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlDQotdmlld0hpc3RvcnlCdXR0b25fdGV4dD1cdTA0MWZcdTA0M2VcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDNlXHUwNDNiXHUwNDNlXHUwNDMzXHUwNDM4XHUwNDRlLi4uDQotDQotIyBSb2xlIEVkaXRvciBUYXNrcyBQYWdlDQotcm9sZVRhc2tzUGFnZV9zZWN0aW9uTmFtZT1cdTA0MTdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzgNCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MmRcdTA0NDJcdTA0MzAgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDRjIFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQ0Zlx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M2JcdTA0MzVcdTA0MzRcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4Lg0KLXJvbGVUYXNrc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHUwNDE0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOA0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTA0MWVcdTA0NDFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjOg0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHUwNDE0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0YzoNCi1yb2xlVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNlIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0NzogezB9Lg0KLQ0KLSMgUm9sZSBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9XHUwNDIwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0YjoNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGIsIFx1MDQzN1x1MDQzMCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNlXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQ3XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0ZFx1MDQ0Mlx1MDQzMCBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGMuDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHUwNDE0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGI6DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTA0MWVcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDdcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDM3XHUwNDMwOg0KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1MDQxMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0NywgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDRmXHUwNDM1XHUwNDNjXHUwNDRiXHUwNDQ1IFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGNcdTA0NGU6DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDQ1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQzMjogezB9Lg0KLQ0KLSMgUm9sZSBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLXJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmDQotcm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOCBcdTA0M2RcdTA0MzAgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzIgXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDM1IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQzOS4NCi1yb2xlR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPVx1MDQxNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGY6DQotcm9sZUd1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZjoNCi1yb2xlR3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNlIFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQzOTogezB9Lg0KLQ0KLSMgUm9sZSBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlDQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPVx1MDQxYVx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQzODoNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NGZcdTA0M2NcdTA0MzgsIFx1MDQzYSBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0M2MgXHUwNDNlXHUwNDQyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDM4XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQ0ZFx1MDQ0Mlx1MDQzMCBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGMuDQotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1MDQxZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0Mzk6DQotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1cdTA0MWZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4Og0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPVx1MDQxZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0Mzk6DQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1MDQxZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzNSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0Mzg6DQotDQotIyBUYXNrIEVkaXRvciBSb2xlcyBQYWdlDQotdGFza1JvbGVzUGFnZV9zZWN0aW9uTmFtZT1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0MzgNCi10YXNrUm9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MWRcdTA0MzBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0NGNcdTA0NDJcdTA0MzUgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOC4NCi10YXNrUm9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1MDQxNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0Mzg6DQotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVx1MDQxZVx1MDQ0MVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGM6DQotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsMj1cdTA0MTRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDM4Og0KLXRhc2tSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM1XHUwNDM5OiB7MH0uDQotdGFza1JvbGVzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX21vZGlmeV9tZXNzYWdlPUlVUEEwMDA0NVc6IFx1MDQyMVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2VcdTA0NDFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2RcdTA0NGJcdTA0M2MgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDM1XHUwNDNjICcnezB9Jyc/DQotdGFza1JvbGVzUGFnZV9jb25maXJtX3RpdGxlPVx1MDQxZlx1MDQzZVx1MDQzNFx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNlXHUwNDQxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzOA0KLQ0KLSMgVGFzayBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9XHUwNDIwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0YiBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOC4NCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTA0MTRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2ZcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9XHUwNDFlXHUwNDMxXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQ0Ylx1MDQzNToNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMj1cdTA0MWRcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NGZcdTA0MzdcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDNkXHUwNDRiXHUwNDM1Og0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwzPVx1MDQxMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQ0Ylx1MDQzNToNCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0NDUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDMyOiB7MH0uDQotDQotIyBUYXNrIEVkaXRvciBHdWlkYW5jZSBQYWdlDQotdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYNCi10YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4IFx1MDQzZFx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzMiBcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzUgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM5Lg0KLXRhc2tHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9XHUwNDE0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZjoNCi10YXNrR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmOg0KLXRhc2tHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM5OiB7MH0uDQotDQotIyBUYXNrIEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9XHUwNDFhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4DQotdGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDRmXHUwNDNjXHUwNDM4LCBcdTA0M2EgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDNjIFx1MDQzZVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0NGRcdTA0NDJcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDMwLg0KLXRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTA0MTRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2RcdTA0NGINCi10YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyPVx1MDQxZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzNSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzgNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTA0MTRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2RcdTA0NGI6DQotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVx1MDQxZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzNSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0Mzg6DQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIFRhc2tzIFBhZ2UNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uTmFtZT1cdTA0MTdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzgNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uRGVzY3JpcHRpb249XHUwNDJkXHUwNDQyXHUwNDNlXHUwNDQyIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDIgXHUwNDRmXHUwNDMyXHUwNDNiXHUwNDRmXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQ0Ylx1MDQzYyBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDMyXHUwNDRiXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDNkXHUwNDRiXHUwNDNjIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDFcdTA0M2JcdTA0MzVcdTA0MzRcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0NDUgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3Lg0KLVdvcmtQcm9kdWN0X1Rhc2tzX0F2YWlsYWJsZUxhYmVsPVx1MDQxNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzgNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsPVx1MDQxZVx1MDQzMVx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0M2RcdTA0M2VcdTA0Mzk6DQotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDI9XHUwNDFkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQzZVx1MDQzOToNCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMz1cdTA0MTJcdTA0NGJcdTA0NDVcdTA0M2VcdTA0MzQ6DQotV29ya1Byb2R1Y3RfVGFza3NfTXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3OiB7MH0uDQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIFJvbGVzIFBhZ2UNCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uTmFtZT1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0MzgNCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUwNDIxXHUwNDNiXHUwNDM1XHUwNDM0XHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzOCBcdTA0M2VcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDdcdTA0MzBcdTA0NGVcdTA0NDIgXHUwNDM3XHUwNDMwIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQ0MiBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGZcdTA0NGVcdTA0NDIgXHUwNDM1XHUwNDMzXHUwNDNlLg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1MDQxNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzgNCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVx1MDQxZVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGM6DQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHUwNDIwXHUwNDNlXHUwNDNiXHUwNDM4IFx1MDQ0MSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzBcdTA0M2NcdTA0MzggXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmOg0KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNlIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOTogezB9Lg0KLQ0KLSMjIFdvcmsgUHJvZHVjdCBFZGl0b3IgRGVsaXZlcmFibGUgUGFydHMgUGFnZQ0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbk5hbWU9XHUwNDFhXHUwNDNlXHUwNDNjXHUwNDNmXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQzNVx1MDQ0N1x1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzANCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0YiwgXHUwNDQxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDRmXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQ0MiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyLg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHUwNDE0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGIgXHUwNDNhXHUwNDMwXHUwNDNhIFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwOg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTA0MjBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0M2FcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMDoNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNlIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQ0NSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0M2VcdTA0MzI6IHswfS4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4IFx1MDQzZFx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzMiBcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzUgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM5Lg0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPVx1MDQxNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGY6DQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGY6DQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM5OiB7MH0uDQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQ0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9XHUwNDFhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Zlx1MDQzY1x1MDQzOCwgXHUwNDNhIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzYyBcdTA0M2VcdTA0NDJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0MzhcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDQyIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDIuDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTA0MTRcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGINCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1cdTA0MjJcdTA0MzhcdTA0M2ZcdTA0NGIgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDQ1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQzMjoNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMz1cdTA0MWZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4Og0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTA0MTRcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2Q6DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1cdTA0MjJcdTA0MzhcdTA0M2ZcdTA0NGIgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDQ1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQzMjoNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwzPVx1MDQxZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzNSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0Mzg6DQotDQotIyBQcmFjdGljZSBFZGl0b3IgUmVmZXJlbmNlcyBQYWdlDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uTmFtZT1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0M2FcdTA0NDJcdTA0MzhcdTA0M2FcdTA0MzggXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHUwNDE0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzI6DQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWxlY3RlZExhYmVsPVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzI6DQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1MDQxYVx1MDQzZVx1MDQzYlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzZSBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMjogezB9Lg0KLQ0KLSMgQ2F0ZWdvcnkgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbk5hbWU9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmXHUwNDNjXHUwNDM4LCBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0M2RcdTA0MzBcdTA0MzRcdTA0M2JcdTA0MzVcdTA0MzZcdTA0MzBcdTA0NDlcdTA0MzhcdTA0M2NcdTA0MzggXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDQzICJ7MH0iLg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTA0MTRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2ZcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmOg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZjoNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM5OiB7MH0uDQotDQotIyBEaXNjaXBsaW5lIEdyb3VwaW5nIEVkaXRvciBEaXNjaXBsaW5lcyBQYWdlDQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlY3Rpb25OYW1lPVx1MDQxNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZFx1MDQ0Yg0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZFx1MDQzMFx1MDQzY1x1MDQzOCwgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDRmXHUwNDQ5XHUwNDM4XHUwNDNjXHUwNDM4IFx1MDQzMiBcdTA0MzRcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDQzIFx1MDQzNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZC4NCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHUwNDE0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZFx1MDQ0YjoNCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTA0MTRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2RcdTA0NGI6DQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNlIFx1MDQzNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZDogezB9Lg0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfVXNlRGVmYXVsdERpcmVjdG9yeUJ1dHRvbkxhYmVsPVx1MDQxOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzMgXHUwNDNmXHUwNDNlIFx1MDQ0M1x1MDQzY1x1MDQzZVx1MDQzYlx1MDQ0N1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZQ0KLQ0KLSMgRGlzY2lwbGluZSBFZGl0b3IgVGFza3MgUGFnZQ0KLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbk5hbWU9XHUwNDE3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4DQotZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzY1x1MDQzOCwgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDRmXHUwNDQ5XHUwNDM4XHUwNDNjXHUwNDM4IFx1MDQzMiBcdTA0MzRcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM0XHUwNDM4XHUwNDQxXHUwNDQ2XHUwNDM4XHUwNDNmXHUwNDNiXHUwNDM4XHUwNDNkXHUwNDQzLg0KLWRpc2NpcGxpbmVUYXNrc1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHUwNDE0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzODoNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw9XHUwNDE3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4Og0KLWRpc2NpcGxpbmVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3OiB7MH0uDQotDQotIyBEaXNjaXBsaW5lIEVkaXRvciBSZWZlcmVuY2UgV29ya2Zsb3cgUGFnZQ0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbk5hbWU9XHUwNDIxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQzYVx1MDQzOCBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzkNCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDNjXHUwNDM4IFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOSwgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDRmXHUwNDQ5XHUwNDM4XHUwNDNjXHUwNDM4IFx1MDQzMiBcdTA0MzRcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM0XHUwNDM4XHUwNDQxXHUwNDQ2XHUwNDM4XHUwNDNmXHUwNDNiXHUwNDM4XHUwNDNkXHUwNDQzLg0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHUwNDE0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0NDJcdTA0M2VcdTA0M2FcdTA0MzggXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5Og0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTA0MjFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDNhXHUwNDM4IFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOToNCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNlIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0M2ZcdTA0M2VcdTA0NDJcdTA0M2VcdTA0M2FcdTA0M2VcdTA0MzIgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5OiB7MH0uDQotDQotIyBEb21haW4gRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9XHUwNDIwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0M2NcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwXHUwNDNjXHUwNDM4LCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNlXHUwNDQyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDRmXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDM0XHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQzLg0KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHUwNDE0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGI6DQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVx1MDQyMFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGI6DQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0NDUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDMyOiB7MH0uDQotDQotIyBXb3JrIFByb2R1Y3QgS2luZCBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1cdTA0MjBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiDQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzY1x1MDQzOCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzBcdTA0M2NcdTA0MzgsIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzNSBcdTA0M2VcdTA0NDJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NGZcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNhIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzY1x1MDQ0MyBcdTA0NDJcdTA0MzhcdTA0M2ZcdTA0NDMgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMC4NCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVx1MDQxNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiOg0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTA0MjBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiOg0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDQ1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQzMjogezB9Lg0KLQ0KLSMgUm9sZSBTZXQgR3JvdXBpbmcgRWRpdG9yIFJvbGUgU2V0cyBQYWdlDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25OYW1lPVx1MDQxZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0M2RcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDBcdTA0MzBcdTA0M2NcdTA0MzggXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM1XHUwNDM5LCBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0NGZcdTA0NDlcdTA0MzhcdTA0M2NcdTA0MzggXHUwNDMyIFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NDMgXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMyIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOS4NCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9XHUwNDE0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0Mzk6DQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw9XHUwNDFkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDRiIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOToNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMyIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOTogezB9Lg0KLQ0KLSMgUm9sZSBTZXQgRWRpdG9yIFJvbGVzIFBhZ2UNCi1yb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25OYW1lPVx1MDQyMFx1MDQzZVx1MDQzYlx1MDQzOA0KLXJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGZcdTA0M2NcdTA0MzgsIFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQ0Zlx1MDQ0OVx1MDQzOFx1MDQzY1x1MDQzOCBcdTA0MzIgXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MCBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkuDQotcm9sZVNldFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTA0MTRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2ZcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM4Og0KLXJvbGVTZXRSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0Mzg6DQotcm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZSBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0Mzk6IHswfS4NCi0NCi0jIFRvb2wgRWRpdG9yIFRvb2wgTWVudG9ycyBQYWdlDQotdG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uTmFtZT1cdTA0MjBcdTA0NDNcdTA0M2FcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzAgXHUwNDNmXHUwNDNlIFx1MDQzOFx1MDQzZFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQzYw0KLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0NDNcdTA0M2FcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzBcdTA0M2NcdTA0MzggXHUwNDNmXHUwNDNlIFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzY1x1MDQ0MyBcdTA0MzhcdTA0M2RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NDMuDQotdG9vbFRvb2xNZW50b3JzUGFnZV9hdmFpbGFibGVMYWJlbD1cdTA0MTRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2ZcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzZlx1MDQzZSBcdTA0MzhcdTA0M2RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzBcdTA0M2M6DQotdG9vbFRvb2xNZW50b3JzUGFnZV9zZWxlY3RlZExhYmVsPVx1MDQyMFx1MDQ0M1x1MDQzYVx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzMCBcdTA0M2ZcdTA0M2UgXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwXHUwNDNjOg0KLXRvb2xUb29sTWVudG9yc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTA0MWFcdTA0M2VcdTA0M2JcdTA0MzhcdTA0NDdcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0M2UgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQ0MFx1MDQ0M1x1MDQzYVx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMiBcdTA0M2ZcdTA0M2UgXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwXHUwNDNjOiB7MH0uDQotDQotIyBDdXN0b20gQ2F0ZWdvcnkgRWRpdG9yIEFzc2lnbiBQYWdlDQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25OYW1lPVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzINCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzBcdTA0M2NcdTA0MzggXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyLCBcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzdcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0M2NcdTA0MzggXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0ZS4NCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfYXZhaWxhYmxlTGFiZWw9XHUwNDE0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzI6DQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlbGVjdGVkTGFiZWw9XHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMjoNCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj1cdTA0MWFcdTA0M2VcdTA0M2JcdTA0MzhcdTA0NDdcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0M2UgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzZVx1MDQzMiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzI6IHswfS4NCi0NCi0jIE5ldyBNZXRob2QgUGx1Zy1pbiBXaXphcmQNCi1uZXdQbHVnaW5XaXphcmRfdGl0bGU9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQ0YyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1uZXdQbHVnaW5XaXphcmRQYWdlX3RpdGxlPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotbmV3UGx1Z2luV2l6YXJkUGFnZV90ZXh0PVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYgXHUwNDM4IFx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzNSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAuDQotbmV3UGx1Z2luRXJyb3JfbXNnPUlVUEEwMDIxRTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRjIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMC4NCi1uZXdQbHVnaW5FcnJvcl9yZWFzb249XHUwNDEyXHUwNDNkXHUwNDQzXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRmXHUwNDRmIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMC5cblwNCi1cblwNCi1cdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZFx1MDQzZVx1MDQzZlx1MDQzYVx1MDQ0MyBcdTA0MjFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuDQotDQotIyBHZW5lcmljIGRpYWxvZyB0aXRsZXMNCi1jcmVhdGVEaWFsb2dfdGl0bGU9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mg0KLWRlbGV0ZURpYWxvZ190aXRsZT1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyDQotZWRpdERpYWxvZ190aXRsZT1cdTA0MThcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyDQotZXJyb3JEaWFsb2dfdGl0bGU9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwDQotbW92ZURpYWxvZ190aXRsZT1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M2NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyDQotcmVuYW1lRGlhbG9nX3RpdGxlPVx1MDQxZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDINCi13YXJuaW5nRGlhbG9nX3RpdGxlPVx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNlx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLQ0KLSMgQWRkIENvbmZpZ3VyYXRpb24gdG8gUHJvY2VzcyBFcnJvciBEaWFsb2cNCi1hZGRDb25maWdFcnJvckRpYWxvZ190aXRsZT1cdTA0MTRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzMiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDENCi0NCi0jIFNldCBEZWZhdWx0IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotc2V0RGVmYXVsdENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNmXHUwNDNlIFx1MDQ0M1x1MDQzY1x1MDQzZVx1MDQzYlx1MDQ0N1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZSBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwDQotDQotIyBFZGl0IFByb2Nlc3MgRXJyb3IgRGlhbG9nDQotZWRpdFByb2Nlc3NFbGVtZW50RXJyb3JEaWFsb2dfdGl0bGU9XHUwNDE4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzANCi0NCi0jIE9wZW4gTGlicmFyeSBEaWFsb2cNCi1vcGVuTGlicmFyeURpYWxvZ190aXRsZT1cdTA0MWVcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLW9wZW5MaWJyYXJ5RGlhbG9nX3RleHQ9XHUwNDIyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDMwXHUwNDRmIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDNkXHUwNDM1IFx1MDQzMVx1MDQ0Ylx1MDQzYlx1MDQzMCBcdTA0NDFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzAuIFx1MDQxOFx1MDQzM1x1MDQzZFx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0NDMgXHUwNDM4IFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0NDNcdTA0NGUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzPw0KLQ0KLSMgU2F2ZSBMaWJyYXJ5IERpYWxvZw0KLXNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlPVx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotc2F2ZUxpYnJhcnlEaWFsb2dfdGV4dD1cdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzMVx1MDQ0Ylx1MDQzYlx1MDQzMCBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzAuIFx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGY/DQotDQotIyBVcGdyYWRlIExpYnJhcnkgRGlhbG9nDQotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGl0bGU9XHUwNDFlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi0NCi0jIERlbGV0ZSBFbGVtZW50IFJlZmVyZW5jZSBEaWFsb2cNCi1kZWxldGVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiAnJ3swfScnIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2QuIFx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDM4XHUwNDM3ICcnezF9Jyc/DQotDQotIyBFcnJvciBNZXNzYWdlcw0KLW5vT3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDBFOiBcdTA0MWRcdTA0MzVcdTA0NDIgXHUwNDNlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuXG5cDQotXG5cDQotXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQzNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIgXHUwNDNkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDNjXHUwNDNlIFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLlxuXA0KLVxuXA0KLVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzOVx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDNlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUuDQotZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZz1JVVBBMDAwMUU6IFx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDM4XHUwNDNjXHUwNDRmIHswfS5cblwNCi1cblwNCi1cdTA0MTJcdTA0NDFcdTA0MzVcdTA0M2MgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwXHUwNDNjIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDNlXHUwNDMyIFx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzZFx1MDQ0YiBcdTA0MzFcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDQxXHUwNDMyXHUwNDNlXHUwNDM1XHUwNDNkXHUwNDRiIFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzMC5cblwNCi1cblwNCi1cdTA0MWRcdTA0MzBcdTA0MzZcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNkXHUwNDNlXHUwNDNmXHUwNDNhXHUwNDQzIE9LIFx1MDQzOCBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDM1IFx1MDQzOFx1MDQzY1x1MDQ0ZiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzAuDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDJFOiBcdTA0MThcdTA0M2NcdTA0NGYgJyd7MH0nJyBcdTA0NDNcdTA0MzZcdTA0MzUgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDM1XHUwNDQyLlxuXA0KLVxuXA0KLVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAgXHUwNDM0XHUwNDNlXHUwNDNiXHUwNDM2XHUwNDM1XHUwNDNkIFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQ0YyBcdTA0NDNcdTA0M2RcdTA0MzhcdTA0M2FcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmLlxuXA0KLVxuXA0KLVx1MDQxZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2RcdTA0M2VcdTA0M2ZcdTA0M2FcdTA0NDMgT0sgXHUwNDM4IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzAuDQotY3JlYXRlQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDAzRTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMC4NCi1kZWxldGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDRXOiBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwLg0KLWludGVybmFsRXJyb3JfbXNnPUlVUEEwMDA1RTogXHUwNDEyXHUwNDNkXHUwNDQzXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRmXHUwNDRmIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMC5cblwNCi1cblwNCi1cdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZFx1MDQzZVx1MDQzZlx1MDQzYVx1MDQ0MyBcdTA0MjFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuDQotaW52YWxpZFByZXNlbnRhdGlvbk5hbWVFcnJvcl9tc2c9SVVQQTAwMDZFOiBcdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDNkXHUwNDM1XHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNkXHUwNDNlXHUwNDM1IFx1MDQzOFx1MDQzY1x1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuIFxuXA0KLVxuXA0KLVx1MDQxZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2RcdTA0M2VcdTA0M2ZcdTA0M2FcdTA0NDMgT0sgXHUwNDM4IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmLg0KLWludmFsaWRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDdFOiBcdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMCAnJ3swfScnIFx1MDQzZFx1MDQzNSBcdTA0NGZcdTA0MzJcdTA0M2JcdTA0NGZcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDNjXHUwNDNkXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDNlXHUwNDNjIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzAgXHUwNDNmXHUwNDNlIFx1MDQ0M1x1MDQzY1x1MDQzZVx1MDQzYlx1MDQ0N1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZS4gXG5cDQotXG5cDQotXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQ0Nlx1MDQzNVx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzOCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzAgXHUwNDNkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDNjXHUwNDNlLCBcdTA0NDdcdTA0NDJcdTA0M2VcdTA0MzFcdTA0NGIgXHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0M2ZcdTA0M2UgXHUwNDQzXHUwNDNjXHUwNDNlXHUwNDNiXHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlIFx1MDQzMVx1MDQ0Ylx1MDQzYlx1MDQzMCBcdTA0M2RcdTA0MzBcdTA0MzRcdTA0M2NcdTA0M2RcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0M2VcdTA0M2MgXHUwNDMyXHUwNDQxXHUwNDM1XHUwNDQ1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQ0NSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzksIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0NDEgXHUwNDNkXHUwNDM4XHUwNDNjLiBcblwNCi1cblwNCi1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDQzXHUwNDRlIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDMyXHUwNDNhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0YiBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzMiBcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M2RcdTA0MzRcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlLg0KLXNldERlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDhFOiBcdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMCAnJ3swfScnIFx1MDQzZFx1MDQzNSBcdTA0NGZcdTA0MzJcdTA0M2JcdTA0NGZcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNkXHUwNDMwXHUwNDM0XHUwNDNjXHUwNDNkXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDNlXHUwNDNjIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQ0NSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzksIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0NDEgIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzZVx1MDQzYy4gXG5cDQotXG5cDQotXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQ0Nlx1MDQzNVx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzOCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzAgXHUwNDNkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDNjXHUwNDNlLCBcdTA0NDdcdTA0NDJcdTA0M2VcdTA0MzFcdTA0NGIgXHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0M2ZcdTA0M2UgXHUwNDQzXHUwNDNjXHUwNDNlXHUwNDNiXHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlIFx1MDQzMVx1MDQ0Ylx1MDQzYlx1MDQzMCBcdTA0M2RcdTA0MzBcdTA0MzRcdTA0M2NcdTA0M2RcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0M2VcdTA0M2MgXHUwNDMyXHUwNDQxXHUwNDM1XHUwNDQ1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQ0NSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzksIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0NDEgXHUwNDNkXHUwNDM4XHUwNDNjLiBcblwNCi1cblwNCi1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDQzXHUwNDRlIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0YiBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlLg0KLW9wZW5MaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDA5RTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzdcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi5cblwNCi1cblwNCi1cdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZFx1MDQzZVx1MDQzZlx1MDQzYVx1MDQ0MyBcdTA0MjFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuDQotc2F2ZUxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTBFOiBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLg0KLXNhdmVMaWJyYXJ5VG9FcnJvcl9tc2c9SVVQQTAwMTBFOiBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzMiAnJ3swfScnLg0KLWVsZW1lbnRBbHJlYWR5RGVsZXRlZEVycm9yX21zZz1JVVBBMDAxMUU6IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiAnJ3swfScnIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2QuDQotdXBncmFkZUxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTJFOiBcdTA0MWRcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2UgXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuDQotDQotIyBFcnJvciBSZWFzb25zDQotZXJyb3JfcmVhc29uPUlVUEEwMDE2RTogXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDQ4XHUwNDNiXHUwNDMwIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMC5cblwNCi1cblwNCi1cdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZFx1MDQzZVx1MDQzZlx1MDQzYVx1MDQ0MyBcdTA0MjFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuDQotaW50ZXJuYWxFcnJvcl9yZWFzb249SVVQQTAwMTdFOiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzhcdTA0MzdcdTA0M2VcdTA0NDhcdTA0M2JcdTA0MzAgXHUwNDMyXHUwNDNkXHUwNDQzXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRmXHUwNDRmIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMC5cblwNCi1cblwNCi1cdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZFx1MDQzZVx1MDQzZlx1MDQzYVx1MDQ0MyBcdTA0MjFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuDQotdXBncmFkZUxpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMThFOiBcdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzYVx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4gXG5cDQotXG5cDQotXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2RcdTA0M2VcdTA0M2ZcdTA0M2FcdTA0NDMgXHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLg0KLXNhdmVVcGdyYWRlZExpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMTlFOiBcdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOCBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4gXG5cDQotXG5cDQotXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2RcdTA0M2VcdTA0M2ZcdTA0M2FcdTA0NDMgXHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1vcGVuaW5nTGlicmFyeVRhc2tfbmFtZT1cdTA0MWVcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDMwIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4uLg0KLXNhdmluZ0xpYnJhcnlUYXNrX25hbWU9XHUwNDIxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuLi4NCi11cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lPVx1MDQxZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLi4uDQotbG9hZGluZ0xpYnJhcnlFbGVtZW50c1Rhc2tfbmFtZT1cdTA0MTdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzdcdTA0M2FcdTA0MzAgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuLi4NCi1zYXZpbmdVcGdyYWRlZEVsZW1lbnRzVGFza19uYW1lPVx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0MzIgXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDNjIFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNS4uLg0KLXNhdmluZ1Rhc2tfbmFtZT1cdTA0MjFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgJyd7MH0nJy4uLg0KLXNhdmluZ0ZpbGVzVGFza19uYW1lPVx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0M2VcdTA0MzIuLi4NCi1maXhpbmdDb250ZW50RGVzY3JpcHRpb25HVUlEc1Rhc2tfbmFtZT1cdTA0MThcdTA0NDFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgR1VJRCBcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyLi4uDQotZGVsZXRpbmdJbnZhbGlkUmVmZXJlbmNlc1Rhc2tfbmFtZT1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNkXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDQ1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzZVx1MDQzYS4uLg0KLQ0KLQ0KLSMgQWRkIEVkaXRvciBUbyBCcm93c2luZyBQZXJzcGVjdGl2ZSBXYXJuaW5nIERpYWxvZw0KLWFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZz1JVVBBMDA0Nlc6IFx1MDQyZFx1MDQ0Mlx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzVcdTA0M2FcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDNmXHUwNDNlXHUwNDM3XHUwNDMyXHUwNDNlXHUwNDNiXHUwNDRmXHUwNDM1XHUwNDQyIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0MzIgXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1IEhUTUwuIFx1MDQxNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzIgXHUwNDNkXHUwNDM1XHUwNDM1IFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0M2RcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2UuDQotDQotIyBDaGFuZ2UgSGlzdG9yeSBEaWFsb2cNCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX3RpdGxlPVx1MDQyNVx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzZVx1MDQzYlx1MDQzZVx1MDQzM1x1MDQzOFx1MDQ0ZiBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM5DQotQ2hhbmdlSGlzdG9yeURpYWxvZ19sYWJlbD1cdTA0MjVcdTA0NDBcdTA0M2VcdTA0M2RcdTA0M2VcdTA0M2JcdTA0M2VcdTA0MzNcdTA0MzhcdTA0NGYgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM5Og0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgRGVsZXRlIEFjdGlvbg0KLWNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU9XHUwNDFmXHUwNDNlXHUwNDM0XHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLWNvbmZpcm1EZWxldGVEaWFsb2dfbXNnPVx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0YyAnJ3swfScnPw0KLWNvbmZpcm1EZWxldGVEaWFsb2dfbXNnV2l0aFJlZmVyZW5jZT1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgJyd7MH0nJz9cblwNCi1cblwNCi1cdTA0MjFcdTA0M2JcdTA0MzVcdTA0MzRcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzkgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQ0MVx1MDQzZVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQ0MiBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzggXHUwNDNkXHUwNDMwIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQ0Zlx1MDQzNVx1MDQzY1x1MDQ0Ylx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGI6IHsxfQ0KLQ0KLSMgTmV3IExpYnJhcnkgRGlhbG9nDQotZXJyb3JEaWFsb2dfbWVzc2FnZT1JVVBBMDAyMkU6IFx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NGMgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgJyd7MH0nJy4NCi1lcnJvckRpYWxvZ19lcnJvcj1cdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzZFx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQ0ZiBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDNkXHUwNDQzXHUwNDQyXHUwNDQwXHUwNDM4IFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzZVx1MDQzOSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLg0KLWVycl9ub29wZW5saWJyYXJ5PUlVUEEwMDQwRTogXHUwNDFkXHUwNDM1XHUwNDQyIFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLlxuXA0KLVxuXA0KLVx1MDQxNFx1MDQzYlx1MDQ0ZiBcdTA0MzRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRmIFx1MDQzZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzY1x1MDQzZSBcdTA0M2VcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi5cblwNCi1cblwNCi1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQzZVx1MDQzOVx1MDQ0Mlx1MDQzNSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlLg0KLWVycl9sb2FkaW5nbGlicmFyeT1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDNhXHUwNDM4IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOA0KLW1zZ19yZWxvYWRMaWJyYXJ5PVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzggXHUwNDNlXHUwNDQyXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1IFx1MDQzZFx1MDQzNVx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzMlx1MDQ0OFx1MDQzNVx1MDQzOVx1MDQ0MVx1MDQ0ZiBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLiBcdTA0MWRcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzhcdTA0M2NcdTA0M2UgXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0M1x1MDQ0OVx1MDQ0M1x1MDQ0ZSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLiANCi0jIFJlbG9hZCBMaWJyYXJ5IERpYWxvZw0KLXJlbG9hZERpYWxvZ19tZXNzYWdlPVx1MDQxZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzMlx1MDQzZVx1MDQ0MVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzVcdTA0MzUgXHUwNDM4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQ0MVx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzZVx1MDQ0Zlx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1yZWxvYWREaWFsb2dfdGl0bGU9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0Mw0KLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvclRpdGxlPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M2NcdTA0MzVcdTA0NDlcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1kaWFsb2dzX01vdmVEaWFsb2dfZXJyb3JNZXNzYWdlPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzggXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM4DQotDQotIyBQcm9jZXNzIEZvcm0gRWRpdG9yDQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX3RpdGxlPVx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0Yw0KLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMT1cdTA0MmRcdTA0NDJcdTA0M2UgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQzYlx1MDQzOFx1MDQ0Zlx1MDQzNVx1MDQ0MiBcdTA0M2RcdTA0MzAgXHUwNDMyXHUwNDQxXHUwNDM1IFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQ0YiBcdTA0MzIgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDM1LiBcdTA0MThcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDMyIFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzNSBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIgXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDRiLiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NGM/DQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UyPVx1MDQxOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzIgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDM1IFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQ0M1x1MDQ0MiBcdTA0NDFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NGIuIFx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQ0Yz8NCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBQYWdlDQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX3RpdGxlPVx1MDQxZlx1MDQzZVx1MDQzNFx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1jb25maWdWaWV3UGFnZVJlbW92ZVZpZXdEaWFsb2dfbWVzc2FnZT1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1ICcnezB9Jyc/DQotY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX3RpdGxlPVx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNlx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb249XHUwNDFhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmOg0KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3cz1cdTA0MWZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotY29uZmlnVmlld1BhZ2Vfdmlld3M9XHUwNDFmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotY29sdW1uc2VsZWN0aW9uX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDNlXHUwNDQwIFx1MDQ0MVx1MDQ0Mlx1MDQzZVx1MDQzYlx1MDQzMVx1MDQ0Nlx1MDQzMDoNCi1jb25maWdWaWV3UGFnZV9hZGRWaWV3QnV0dG9uVGV4dD1cdTA0MTRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1Li4uDQotY29uZmlnVmlld1BhZ2VfcmVtb3ZlVmlld0J1dHRvblRleHQ9XHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLWNvbmZpZ1ZpZXdQYWdlX21ha2VEZWZhdWx0QnV0dG9uVGV4dD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDNlIFx1MDQ0M1x1MDQzY1x1MDQzZVx1MDQzYlx1MDQ0N1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZQ0KLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ19tZXNzYWdlPUlVUEEwMDIzVzogXHUwNDFmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0MSBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2MgJyd7MH0nJyBcdTA0NDNcdTA0MzZcdTA0MzUgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDM1XHUwNDQyLg0KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvblRpdGxlPVx1MDQxZVx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNkXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDMzXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdTZWN0aW9uTWVzc2FnZT1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQzMlx1MDQzYVx1MDQzYlx1MDQ0ZVx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQ0YiBcdTA0MzIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguIFx1MDQxNFx1MDQzYlx1MDQ0ZiBcdTA0NDJcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDQ3XHUwNDQyXHUwNDNlXHUwNDMxXHUwNDRiIFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUsIFx1MDQzZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MTRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQwXHUwNDQyXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0NDNcdTA0NGUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDRlIFx1MDQzMiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguIFx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NGYgXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDQyIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNVx1MDQzYywgXHUwNDMwIFx1MDQzNVx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzggXHUwNDM4IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzIgLSBcdTA0M2JcdTA0MzhcdTA0NDFcdTA0NDJcdTA0NGNcdTA0NGZcdTA0M2NcdTA0MzggXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM1XHUwNDMyXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi0NCi0jIERlc2NyaXB0aW9uIFRhYg0KLWRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX3RpdGxlPVx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUNCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMT1JVVBBMDA0MFc6IFx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDMyIFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzNS4NCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMj1cdTA0MWRcdTA0MzVcdTA0NDIgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM5LCBcdTA0NDFcdTA0M2VcdTA0MzJcdTA0M2NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0NGJcdTA0NDUgXHUwNDQxIFx1MDQ0ZFx1MDQ0Mlx1MDQzOFx1MDQzYyBcdTA0NDJcdTA0MzhcdTA0M2ZcdTA0M2VcdTA0M2MuDQotDQotY2hhbmdlQWN0aXZpdHlUeXBlV2FybmluZ0RpYWxvZ190aXRsZT1cdTA0MWZcdTA0NDBcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlDQotIyBBc3NvY2lhdGlvbiBGb3JtIFBhZ2UNCi1Bc3NvY2lhdGlvbkZvcm1QYWdlX0JyaWVmRGVzY3JpcHRpb25MYWJlbD1cdTA0MWFcdTA0NDBcdTA0MzBcdTA0NDJcdTA0M2FcdTA0M2VcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzA6DQotDQotIyBNZXRob2QgRWxlbWVudCBEZXNjcmlwdGlvbg0KLW1ldGhvZEVsZW1lbnREZXNjcmlwdGlvbkVtcHR5TmFtZURpYWxvZ190aXRsZT1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMA0KLW1ldGhvZEVsZW1lbnREZXNjcmlwdGlvbkVtcHR5TmFtZURpYWxvZ19tZXNzYWdlPVx1MDQxOFx1MDQzY1x1MDQ0ZiBcdTA0M2RcdTA0MzUgXHUwNDNjXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDQyIFx1MDQzMVx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0NGJcdTA0M2MuDQotDQotIyBNZXRob2QgUGx1Zy1pbiBEZXNjcmlwdGlvbg0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUmVtb3ZlUmVmQ29uZmlybV9tZXNzYWdlPVx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzVcdTA0MzkgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRmICcnezB9JycgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzY1x1MDQzOCBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGZcdTA0M2NcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDQyIFx1MDQzYSBcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2RcdTA0MzhcdTA0M2FcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGUgXHUwNDNkXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDQ1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzZVx1MDQzYSwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQ0M1x1MDQ0MiBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2RcdTA0NGIuXG5cDQotXG5cDQotXHUwNDJkXHUwNDQyXHUwNDNlIFx1MDQzNFx1MDQzNVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzOFx1MDQzNSBcdTA0M2RcdTA0MzVcdTA0M2JcdTA0NGNcdTA0MzdcdTA0NGYgXHUwNDNlXHUwNDQyXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjLiBcdTA0MTJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDQyXHUwNDQzIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZT8NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZT1cdTA0MThcdTA0M2NcdTA0NGYgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRmIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMCBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDNlIFx1MDQ0MSAnJ3swfScnIFx1MDQzZFx1MDQzMCAnJ3sxfScnLiBcdTA0MWZcdTA0NDBcdTA0MzggXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0MzIgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDM1IFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQ0M1x1MDQ0MiBcdTA0NDFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NGIsIFx1MDQzMCBcdTA0M2ZcdTA0MzBcdTA0M2ZcdTA0M2FcdTA0MzAgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzMC4gXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDNiXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDRjPw0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jb25maXJtUmVuYW1lX3RpdGxlPVx1MDQxZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2Nhbm5vdFJlbmFtZVBsdWdpbkZvbGRlcj1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0MzBcdTA0M2ZcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5MYWJlbD1cdTA0MTdcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2FcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRjDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5fbWVzc2FnZT1cdTA0MThcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNhXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDNhXHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQ0MiBcdTA0M2EgXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRlIFx1MDQzOCBcdTA0MzdcdTA0MzBcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRiXHUwNDQ1IFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQzMiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIsIFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQzZFx1MDQzMFx1MDQzNFx1MDQzYlx1MDQzNVx1MDQzNlx1MDQzMFx1MDQ0OVx1MDQzOFx1MDQ0NSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGUgJyd7MH0nJy4gXHUwNDEyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0ZFx1MDQ0Mlx1MDQ0MyBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGU/DQotDQotIyBQcm9jZXNzIERlc2NyaXB0aW9uDQotcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fdGl0bGU9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjDQotcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fbWVzc2FnZT1cdTA0MThcdTA0M2NcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwIFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQzNVx1MDQ0MiBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0M2UuIFx1MDQyMVx1MDQzZVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzNSBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzAgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzZSwgXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYyBcdTA0M2ZcdTA0MzBcdTA0M2ZcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwIFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQzNVx1MDQ0MiBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzAuIFx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQ0Yz8NCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbkRlc2NyaXB0aW9uPVx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNToNCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25UaXRsZT1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYNCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25NZXNzYWdlPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzJcdTA0NDFcdTA0MzUgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDRiXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzAuIFx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUsIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzMFx1MDQ0ZiBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDRmXHUwNDQyXHUwNDRjXHUwNDQxXHUwNDRmIFx1MDQzZlx1MDQzZSBcdTA0NDNcdTA0M2NcdTA0M2VcdTA0M2JcdTA0NDdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGUuIFx1MDQyZFx1MDQ0Mlx1MDQzMCBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDM0XHUwNDNlXHUwNDNiXHUwNDM2XHUwNDNkXHUwNDMwIFx1MDQ0MVx1MDQzZVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0NDFcdTA0MzUgXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOC4NCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbnM9XHUwNDFhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Og0KLXByb2Nlc3NEZXNjcmlwdGlvbl9kZWZhdWx0PShcdTA0M2ZcdTA0M2UgXHUwNDQzXHUwNDNjXHUwNDNlXHUwNDNiXHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlKQ0KLVByb2Nlc3NEZXNjcmlwdGlvbl9zZWxlY3RDb25maWd1cmF0aW9uPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLVByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQwPVx1MDQxOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzIgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDM1IFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQ0M1x1MDQ0MiBcdTA0NDFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NGIgXHUwNDM4IFx1MDQzMlx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQ0Zlx1MDQ0MiBcdTA0MzIgXHUwNDQxXHUwNDM4XHUwNDNiXHUwNDQzLiBcdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgJyd7MH0nJz8NCi1Qcm9jZXNzRGVsZXRlQWN0aW9uX3NlbGVjdERlc2NyaXB0b3JzVG9EZWxldGU9XHUwNDFmXHUwNDNlXHUwNDQxXHUwNDNiXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyIFx1MDQ0MVx1MDQzYlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGIgXHUwNDMxXHUwNDNlXHUwNDNiXHUwNDM1XHUwNDM1IFx1MDQzZFx1MDQzOFx1MDQzM1x1MDQzNFx1MDQzNSBcdTA0M2RcdTA0MzUgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDQzXHUwNDRlXHUwNDQyXHUwNDQxXHUwNDRmLlxuXA0KLVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGIgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi0NCi0jIFZpZXcgSGVscGVyDQotdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX3RpdGxlPVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzYVx1MDQzMCBcdTA0NDZcdTA0MzVcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NDJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzggXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4DQotdmlld0hlbHBlcl9wZXJmb3JtSGVhbHRoQ2hlY2s9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNhXHUwNDMwIFx1MDQ0Nlx1MDQzNVx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzOCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzguLi4NCi12aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfbWVzc2FnZT1cdTA0MjZcdTA0MzVcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NDJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NGMgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzZFx1MDQzMC4gXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDJcdTA0M2VcdTA0M2FcdTA0M2VcdTA0M2JcdTA0MzAuDQotDQotIyBBdHRhY2ggVGVtcGxhdGUgRmlsZSBEaWFsb2cNCi1hdHRhY2hUZW1wbGF0ZUZpbGVEaWFsb2dfdGl0bGU9XHUwNDEyXHUwNDNiXHUwNDNlXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYiBcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2RcdTA0MzANCi0NCi0jIENyZWF0ZSBFbGVtZW50IEVycm9yIERpYWxvZw0KLWNyZWF0ZUVsZW1lbnREaWFsb2dfdGl0bGU9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIHswfQ0KLWNyZWF0ZU5ld0VsZW1lbnRFcnJvcl9tc2c9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzggezB9Lg0KLQ0KLWRsZ1RpdGxlX3JlbG9hZExpYnJhcnk9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0Mw0KLWNyZWF0ZUVsZW1lbnRFcnJvcl9yZWFzb249XHUwNDE4XHUwNDNjXHUwNDRmIHswfSBcdTA0M2RcdTA0MzUgXHUwNDNjXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDQyIFx1MDQzMVx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0NGJcdTA0M2MuXG5cDQotXG5cDQotXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYgXHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUuDQotZGVsZXRlQ29uZmlnRXJyb3JfcmVhc29uPVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzAgXHUwNDQxIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzZVx1MDQzYyAnJ3swfScnDQotDQotIyBDaGFuZ2VCb3VuZHNDb21tYW5kDQotZ2VmX2NoYW5nZUJvdW5kc0NvbW1hbmRfbGFiZWw9XHUwNDE4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Nlx1MDQ0Yg0KLSMgQ2hhbmdlTmFtZUNvbW1hbmQNCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfbGFiZWw9XHUwNDE4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQzY1x1MDQ0Zg0KLWdlZl9jaGFuZ2VOYW1lQ29tbWFuZF91bmRvTWVzc2FnZT1cdTA0MWRcdTA0MzVcdTA0M2JcdTA0NGNcdTA0MzdcdTA0NGYgXHUwNDNlXHUwNDQyXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzguXG5cDQotXG5cDQotXHUwNDFkXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQzZVx1MDQ0Mlx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUsIFx1MDQzZlx1MDQzZVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQ0MyBcdTA0M2RcdTA0MzUgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNlx1MDQzZFx1MDQzNVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYuDQotIyBDaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZA0KLWdlZl9jaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZF9sYWJlbD1cdTA0MThcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzZVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzMA0KLSMgQ3JlYXRlQmVuZHBvaW50Q29tbWFuZA0KLWdlZl9jcmVhdGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzVcdTA0M2NcdTA0NDNcdTA0M2MNCi0jIENyZWF0ZUxpbmtDb21tYW5kDQotZ2VmX2NyZWF0ZUxpbmtDb21tYW5kX2xhYmVsPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzgNCi0jIENyZWF0ZU5vZGVDb21tYW5kDQotZ2VmX2NyZWF0ZU5vZGVDb21tYW5kX2xhYmVsPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M2INCi0jIERlbGV0ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfZGVsZXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDNjXHUwNDQzXHUwNDNjDQotIyBEZWxldGVDb21tYW5kDQotZ2VmX2RlbGV0ZUNvbW1hbmRfbGFiZWw9XHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM4XHUwNDQyXHUwNDRjDQotIyBEZWxldGVMaW5rQ29tbWFuZA0KLWdlZl9kZWxldGVMaW5rQ29tbWFuZF9sYWJlbD1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDNlXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1DQotIyBNb3ZlQmVuZHBvaW50Q29tbWFuZA0KLWdlZl9tb3ZlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M2NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDNjXHUwNDQzXHUwNDNjDQotIyBSZWNvbm5lY3RMaW5rQ29tbWFuZA0KLWdlZl9yZWNvbm5lY3RMaW5rQ29tbWFuZF9sYWJlbD1cdTA0MTdcdTA0MzBcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2UgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQ0Yw0KLQ0KLSMgVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyDQotZ2VmX3ZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ9XHUwNDE4XHUwNDNjXHUwNDRmIFx1MDQzZFx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQ0Ylx1MDQzYy4gXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYuDQotIyBWYWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcg0KLWdlZl92YWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ9XHUwNDE4XHUwNDNjXHUwNDRmIFx1MDQzZFx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQ0Ylx1MDQzYy4gXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYuDQotIyBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydA0KLWdlZl93b3JrUHJvZHVjdE5vZGVFZGl0UGFydF92YWxpZGF0ZU1lc3NhZ2U9XHUwNDE4XHUwNDNjXHUwNDRmIFx1MDQzZFx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQ0Ylx1MDQzYy4gXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYuDQotDQotIyBFbGVtZW50c1ZpZXdEZWxldGVBY3Rpb24NCi1hY3Rpb25zX0VsZW1lbnRzVmlld0RlbGV0ZUFjdGlvbl9tZXNzYWdlPVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiAnJ3swfScnIFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQ0M1x1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0M2VcdTA0M2MgJyd7MX0nJyBcdTA0MzggXHUwNDNkXHUwNDM1IFx1MDQzY1x1MDQzZVx1MDQzNlx1MDQzNVx1MDQ0MiBcdTA0MzFcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDMwLg0KLQ0KLSMgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yDQotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JUaXRsZT1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JNZXNzYWdlPVx1MDQxZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzMFx1MDQ0Mlx1MDQ0Ylx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzY1x1MDQzMFx1MDQ0ZiBcdTA0MzhcdTA0NDFcdTA0M2FcdTA0M2JcdTA0NGVcdTA0NDdcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDQxXHUwNDM4XHUwNDQyXHUwNDQzXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmDQotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JSZWFzb249XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLQ0KLSMgTWV0aG9kRWxlbWVudEVkaXRvcg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZT1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOA0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMT1JVVBBMDAyMEU6IFx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzggXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM4IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzMA0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMj1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDQ0XHUwNDM4XHUwNDNhXHUwNDQxXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjE9XHUwNDE0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0NGIgXHUwNDMyIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDJcdTA0M2VcdTA0M2FcdTA0M2VcdTA0M2JcdTA0MzANCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMj1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yVGl0bGU9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9pbnZhbGlkRWRpdG9yTXNnPVx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzNVx1MDQzZFx1MDQ0YiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIsIFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0Ylx1MDQzNSBcdTA0MzIgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDM1LiBcdTA0MjBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDM1XHUwNDQyIFx1MDQzN1x1MDQzMFx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mi4NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvclRpdGxlPVx1MDQxZFx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzNSBcdTA0NDFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NGZcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDMwDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yTWVzc2FnZTE9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDNlXHUwNDMyICcnezB9JycNCi0NCi0jIERlc2NyaXB0aW9uRm9ybVBhZ2UNCi1yZW5hbWVFcnJvcl90aXRsZT1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyDQotcmVuYW1lRXJyb3JfbXNnPUlVUEEwMDEzRTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1TZWxlY3RFbGVtZW50RGlhbG9nX3NlbGVjdGVsZW1lbnRfdGV4dD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyDQotDQotIyBFZGl0b3JDaG9vc2VyDQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX3RpdGxlPVx1MDQxZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZXNjcmlwdGlvbkxhYmVsPVx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNToNCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfU2VsZWN0QWxsQnV0dG9uTGFiZWw9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0MVx1MDQzNQ0KLU9wZW5FbGVtZW50V29ya2JlbmNoQWN0aW9uRGVsZWdhdGVfZWRpdF90ZXh0MD1cdTA0MThcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyDQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNFOiBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfSWNvbkZpbGVDaG9vc2VyRGlhbG9nX3RpdGxlPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeU5hbWU9XHUwNDFkXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDRmIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzMA0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZXNjcmlwdGlvbkxhYmVsPVx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNToNCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMCBcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQxM1x1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQzMlx1MDQzZSwgXHUwNDQ3XHUwNDQyXHUwNDNlXHUwNDMxXHUwNDRiIFx1MDQzOFx1MDQ0NSBcdTA0M2VcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMuDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX0Rlc2VsZWN0QWxsQnV0dG9uTGFiZWw9XHUwNDFlXHUwNDQyXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQzZVx1MDQ0MCBcdTA0MzJcdTA0NDFcdTA0MzVcdTA0NDUNCi1FbGVtZW50c1ZpZXdfbWlncmF0aW9uX2Rpcl9kbGdfZGVzY3JpcHRpb25fdGV4dD1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzZFx1MDQzNVx1MDQ0MVx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzAgezB9IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzdcdTA0MzBcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGIgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMCB7MH0NCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uPVx1MDQyMVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzY1x1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0M2VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAuIFx1MDQxNFx1MDQzYlx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzAgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2RcdTA0MzBcdTA0MzZcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNkXHUwNDNlXHUwNDNmXHUwNDNhXHUwNDQzIFx1MDQyMVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi5cblwNCi1cblwNCi1cdTA0MTdcdTA0MzBcdTA0M2FcdTA0NDBcdTA0M2VcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDNkXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzOFx1MDQzNyBcdTA0M2VcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGJcdTA0NDUgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMyIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlLg0KLQ0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGl0bGU9XHUwNDFkXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDM1IFx1MDQzOFx1MDQzN1x1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzFFOiBcdTA0MjBcdTA0MzBcdTA0MzdcdTA0M2NcdTA0MzVcdTA0NDAgXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmICcnezB9JycgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDMyXHUwNDRiXHUwNDQ4XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQ0Ylx1MDQzOSAoezF9IFx1MDQzZFx1MDQzMCB7Mn0pLiBcdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDNlXHUwNDM1IFx1MDQzOFx1MDQzN1x1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNS4NCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGl0bGU9XHUwNDFkXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDM1IFx1MDQzOFx1MDQzN1x1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190ZW1wbGF0ZT1JVVBBMDAzMkU6IFx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgJyd7MH0nJyBcdTA0M2RcdTA0MzUgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDM1XHUwNDQyLiBcdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDNlXHUwNDM1IFx1MDQzOFx1MDQzN1x1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNS4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDRjLi4uDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeURlc2NyaXB0aW9uPVx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX0RlZmF1bHRCcmllZkRlc2NyaXB0aW9uPVx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VEZXNjcmlwdGlvbj1cdTA0MTdcdTA0MzBcdTA0M2FcdTA0NDBcdTA0M2VcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDMyXHUwNDQxXHUwNDM1IFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Yi4gXHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzYlx1MDQzMCBcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzNSBcdTA0NDJcdTA0NDBcdTA0MzVcdTA0MzFcdTA0NDNcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjLg0KLQ0KLSMgVGVtcGxhdGVEZXNjcmlwdGlvblBhZ2UNCi1mb3Jtc19UZW1wbGF0ZURlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgXHUwNDQzXHUwNDM2XHUwNDM1IFx1MDQzMlx1MDQzYlx1MDQzZVx1MDQzNlx1MDQzNVx1MDQzZCBcdTA0MzIgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDQyIFx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZC4NCi0NCi0jIE5ldyBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLW5ld0xpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTRFOiBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLg0KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24xPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZCBcdTA0M2RcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQzXHUwNDQyXHUwNDRjIFx1MDQzYSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzUgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIC0gJyd7MH0nJy4NCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMj1cdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIgXHUwNDMyICcnezB9JycuDQotbmV3TGlicmFyeUVycm9yX3JlYXNvbjM9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDMwXHUwNDNmXHUwNDNhXHUwNDQzICcnezB9JycgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuDQotbmV3TGlicmFyeUVycm9yX2FkdmljZT1cdTA0MWRcdTA0MzBcdTA0MzZcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzUgT0sgXHUwNDM4IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0M2ZcdTA0NDNcdTA0NDJcdTA0NGMgXHUwNDNhIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzNS4NCi0NCi0jUHJvY2VzcyBsaXRlcmFscw0KLVByb2Nlc3NfRXh0ZXJuYWxJRD1cdTA0MTJcdTA0M2RcdTA0MzVcdTA0NDhcdTA0M2RcdTA0MzhcdTA0MzkgXHUwNDE4XHUwNDE0Og0KLVByb2Nlc3NfUHVycG9zZT1cdTA0MWRcdTA0MzBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzU6DQotUHJvY2Vzc19TY29wZT1cdTA0MWVcdTA0MzFcdTA0M2JcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NGM6DQotUHJvY2Vzc19Vc2FnZU5vdGVzPVx1MDQxN1x1MDQzMFx1MDQzY1x1MDQzNVx1MDQ0N1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2ZcdTA0M2UgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlOg0KLVByb2Nlc3NfQWx0ZXJuYXRpdmVzPVx1MDQxMFx1MDQzYlx1MDQ0Y1x1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzZFx1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQzMlx1MDQ0YjoNCi1Qcm9jZXNzX0hvd1RvU3RhZmY9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDNiOg0KLVByb2Nlc3NfS2V5Q29uc2lkZXJhdGlvbj1cdTA0MWVcdTA0NDFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDM3XHUwNDMwXHUwNDNjXHUwNDM1XHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmOg0KLVByb2Nlc3NfU2NhbGU9XHUwNDFjXHUwNDMwXHUwNDQxXHUwNDQ4XHUwNDQyXHUwNDMwXHUwNDMxOg0KLVByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljcz1cdTA0MjVcdTA0MzBcdTA0NDBcdTA0MzBcdTA0M2FcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2FcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDMwOg0KLVByb2Nlc3NfUmlza0xldmVsPVx1MDQyM1x1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzNVx1MDQzZFx1MDQ0YyBcdTA0NDBcdTA0MzhcdTA0NDFcdTA0M2FcdTA0MzA6DQotUHJvY2Vzc19Fc3RpbWF0aW5nVGVjaG5pcXVlPVx1MDQxY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzYVx1MDQzMCBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0M2RcdTA0M2FcdTA0Mzg6DQotUHJvY2Vzc19Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPVx1MDQxYVx1MDQzMlx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0NDNcdTA0NDdcdTA0MzBcdTA0NDFcdTA0NDJcdTA0M2RcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzIgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDMwOg0KLVByb2Nlc3NfVHlwZU9mQ29udHJhY3Q9XHUwNDIyXHUwNDM4XHUwNDNmIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0Mlx1MDQ0MFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzMDoNCi0NCi0jIEVkaXRvciBQcmV2aWV3IE5hdmlnYXRpb24gQnV0dG9ucw0KLWJhY2tCdXR0b25fdGV4dD1cdTA0MWRcdTA0MzBcdTA0MzdcdTA0MzBcdTA0MzQNCi1mb3J3YXJkQnV0dG9uX3RleHQ9XHUwNDEyXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM0DQotZm9yd2FyZF90ZXh0PVx1MDQxMlx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNA0KLXN0b3BCdXR0b25fdGV4dD1cdTA0MjFcdTA0NDJcdTA0M2VcdTA0M2YNCi1yZWZyZXNoQnV0dG9uX3RleHQ9XHUwNDFlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjDQotcmVmcmVzaF90ZXh0PVx1MDQxZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0Yw0KLW5ld25hbWVfdGV4dD1cdTA0MWRcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmOg0KLXByaW50QnV0dG9uX3RleHQ9XHUwNDFmXHUwNDM1XHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDRjDQotDQotIyBDb250ZXh0IG1lbnVzDQotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPSZcdTA0MWVcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMNCi1fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbT0mXHUwNDFmXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQzMlx1MDQzZVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzMA0KLQ0KLV9VSV9NZXRob2RFZGl0b3JfbWVudT0mXHUwNDIwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09Jlx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0Yw0KLV9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbT1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgJlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZFx1MDQzZVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2VcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDINCi0NCi1fVUlfU2VsZWN0aW9uUGFnZV9sYWJlbD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0M2VcdTA0NDANCi1fVUlfUGFyZW50UGFnZV9sYWJlbD1cdTA0MjBcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzkNCi1fVUlfTGlzdFBhZ2VfbGFiZWw9XHUwNDIxXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDNlXHUwNDNhDQotX1VJX1RyZWVQYWdlX2xhYmVsPVx1MDQxNFx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzMlx1MDQzZQ0KLV9VSV9UYWJsZVBhZ2VfbGFiZWw9XHUwNDIyXHUwNDMwXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDQ2XHUwNDMwDQotX1VJX1RhYmxlVHJlZVBhZ2VfbGFiZWw9XHUwNDE0XHUwNDM1XHUwNDQwXHUwNDM1XHUwNDMyXHUwNDNlDQotX1VJX09iamVjdENvbHVtbl9sYWJlbD1cdTA0MWVcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDINCi1fVUlfU2VsZkNvbHVtbl9sYWJlbD1cdTA0MjJcdTA0MzVcdTA0M2FcdTA0NDNcdTA0NDlcdTA0MzhcdTA0MzkgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyDQotDQotX1VJX05vT2JqZWN0U2VsZWN0ZWQ9XHUwNDFkXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZFx1MDQzNSBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2UNCi1fVUlfU2luZ2xlT2JqZWN0U2VsZWN0ZWQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0MjogezB9DQotX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNlIFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQzMjogezB9DQotDQotX1VJX09wZW5FZGl0b3JFcnJvcl9sYWJlbD1cdTA0MWVcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwDQotDQotX1VJX1dpemFyZF9jYXRlZ29yeT1cdTA0MWNcdTA0MzBcdTA0NDFcdTA0NDJcdTA0MzVcdTA0NDBcdTA0NGIgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQ0MFx1MDQzZVx1MDQzMiBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0MzkgRU1GDQotDQotX1VJX01ldGhvZE1vZGVsV2l6YXJkX2xhYmVsPVx1MDQxY1x1MDQzZVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQ0YyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfZGVzY3JpcHRpb249XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQ0YyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi0NCi1fVUlfTWV0aG9kRWRpdG9yX2xhYmVsPVx1MDQyMFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0MzkgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotDQotX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2U9XHUwNDFjXHUwNDNlXHUwNDM5DQotX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRXh0ZW5zaW9uPVx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNA0KLQ0KLV9VSV9XaXphcmRfbGFiZWw9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjDQotDQotX1dBUk5fRmlsZW5hbWVFeHRlbnNpb249XHUwNDE4XHUwNDNjXHUwNDRmIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0M2RcdTA0M2UgXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDNkXHUwNDQ3XHUwNDM4XHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjXHUwNDQxXHUwNDRmIFx1MDQzZFx1MDQzMCAnJy57MH0nJw0KLQ0KLV9VSV9Nb2RlbE9iamVjdD1cdTA0MWVcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDIgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDNiXHUwNDM4DQotX1VJX1hNTEVuY29kaW5nPVx1MDQxYVx1MDQzZVx1MDQzNFx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzYVx1MDQzMCBYTUwNCi1fVUlfWE1MRW5jb2RpbmdDaG9pY2VzPVVURi04IEFTQ0lJIFVURi0xNiBVVEYtMTZCRSBVVEYtMTZMRSBJU08tODg1OS0xDQotX1VJX1dpemFyZF9pbml0aWFsX29iamVjdF9kZXNjcmlwdGlvbj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNjXHUwNDRiXHUwNDM5IFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0MiBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzgNCi0NCi1fVUlfRmlsZUNvbmZsaWN0X2xhYmVsPVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzYlx1MDQzOFx1MDQzYVx1MDQ0MiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0M2VcdTA0MzINCi1fV0FSTl9GaWxlQ29uZmxpY3Q9XHUwNDFlXHUwNDMxXHUwNDNkXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDRiIFx1MDQzZFx1MDQzNVx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYsIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzYlx1MDQzOFx1MDQzYVx1MDQ0Mlx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NDEgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmXHUwNDNjXHUwNDM4LCBcdTA0MzJcdTA0M2RcdTA0MzVcdTA0NDFcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0M2NcdTA0MzggXHUwNDMyXHUwNDNkXHUwNDM1IFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzMC4gXHUwNDFlXHUwNDQyXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiwgXHUwNDMyXHUwNDNkXHUwNDM1XHUwNDQxXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzMiBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzU/DQotDQotIyBBZGQgTGluayBEaWFsb2cNCi1hZGRMaW5rRGlhbG9nX2xpbmtUeXBlPVx1MDQyMlx1MDQzOFx1MDQzZjoNCi1vcGVuTGlua0NoZWNrYm94X3RleHQ9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQ0MyBcdTA0MzIgXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDNjIFx1MDQzZVx1MDQzYVx1MDQzZFx1MDQzNQ0KLQ0KLSMgQWRkIEltYWdlIERpYWxvZw0KLWhlaWdodExhYmVsX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDQxXHUwNDNlXHUwNDQyXHUwNDMwOg0KLXdpZHRoTGFiZWxfdGV4dD1cdTA0MjhcdTA0MzhcdTA0NDBcdTA0MzhcdTA0M2RcdTA0MzA6DQotRWxlbWVudHNWaWV3XzIwPVx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZCBcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkNCi1FbGVtZW50c1ZpZXdfMjE9XHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxIFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYVx1MDQzOA0KLUVsZW1lbnRzVmlld18yMj1cdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDENCi1FbGVtZW50c1ZpZXdfMzU9ezB9IFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzNVx1MDQzZCBcdTA0NDJcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2FcdTA0M2UgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0N1x1MDQ0Mlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4gXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2RcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzhcdTA0M2NcdTA0M2UgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDQwXHUwNDM1XHUwNDQ4XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzN1x1MDQzMFx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQ0Yy4NCi1FbGVtZW50c1ZpZXdfMzY9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzYVx1MDQzOCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzgNCi1hbHRUYWdMYWJlbF90ZXh0PVx1MDQyMlx1MDQzNVx1MDQzMyBBTFQ6DQotaW1hZ2VTaXplTGFiZWxfdGV4dD1cdTA0MjhcdTA0MzhcdTA0NDBcdTA0MzhcdTA0M2RcdTA0MzAgXHUwNDM4IFx1MDQzMlx1MDQ0Ylx1MDQ0MVx1MDQzZVx1MDQ0Mlx1MDQzMCBcdTA0MzhcdTA0MzdcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDM0XHUwNDNlXHUwNDNiXHUwNDM2XHUwNDNkXHUwNDRiIFx1MDQzMVx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0MzIgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQ1IFx1MDQzZVx1MDQ0MiAxMCBcdTA0MzRcdTA0M2UgNjAwLiBcdTA0MWRcdTA0MzVcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDM4XHUwNDNkXHUwNDMwIFx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0NDFcdTA0M2VcdTA0NDJcdTA0MzAgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQ0YiBcdTA0MzIgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDRiXHUwNDM5IFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQ0MC4NCi0NCi0jIFByb2Nlc3MgRWRpdG9yDQotUHJvY2Vzc0VkaXRvcj1cdTA0MjBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDNlXHUwNDMyDQotUHJvY2Vzc0VkaXRvcl9OYW1lPVx1MDQxOFx1MDQzY1x1MDQ0Zg0KLVByb2Nlc3NFZGl0b3JfUHJlc2VudGF0aW9uTmFtZT1cdTA0MThcdTA0M2NcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotUHJvY2Vzc0VkaXRvcl9JbmRleD1cdTA0MThcdTA0M2RcdTA0MzRcdTA0MzVcdTA0M2FcdTA0NDENCi1Qcm9jZXNzRWRpdG9yX1ByZWRlY2Vzc29ycz1cdTA0MWZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDhcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzVcdTA0M2RcdTA0M2RcdTA0MzhcdTA0M2FcdTA0MzgNCi0jQ29uZmlndXJhdGlvblBhZ2VfU2VsZWN0ZWQ9U2VsZWN0ZWQ6IA0KLUNoZWNrbGlzdE9yZGVyX2Rlc2NyaXB0aW9uPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDM4IFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzY1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDQxIFx1MDQzZlx1MDQzZVx1MDQzY1x1MDQzZVx1MDQ0OVx1MDQ0Y1x1MDQ0ZSBcdTA0M2FcdTA0M2RcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2EgXHUwNDEyXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQ1IFx1MDQzOCBcdTA0MTJcdTA0M2RcdTA0MzhcdTA0MzcuDQotRWxlbWVudHNWaWV3X3JlbmFtaW5nX3RleHQ9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1Li4uDQotUHJvY2Vzc0VkaXRvcl9Nb2RlbEluZm89XHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzgNCi1Qcm9jZXNzRWRpdG9yX1ByZWZpeD1cdTA0MWZcdTA0NDBcdTA0MzVcdTA0NDRcdTA0MzhcdTA0M2FcdTA0NDENCi1Nb3ZlRGlhbG9nX21vdmVfdGV4dD1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M2NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzhcdTA0NDJcdTA0NGMNCi1DaGVja2xpc3RPcmRlcl90aXRsZT1cdTA0MjNcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NGZcdTA0MzRcdTA0M2VcdTA0NDdcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQ0Yg0KLVByb2Nlc3NFZGl0b3JfUmVwZXRhYmxlPVx1MDQxZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Zlx1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzOVx1MDQ0MVx1MDQ0Zg0KLVByb2Nlc3NFZGl0b3JfT25nb2luZz1cdTA0MTJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0NGZcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzlcdTA0NDFcdTA0NGYNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TeW5jaHJvbml6YXRpb249XHUwNDIxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjLi4uDQotUHJvY2Vzc0VkaXRvcl9FdmVudERyaXZlbj1cdTA0MjNcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0NGZcdTA0MzVcdTA0M2NcdTA0NGJcdTA0MzkgXHUwNDQxXHUwNDNlXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDM4XHUwNDRmXHUwNDNjXHUwNDM4DQotUHJvY2Vzc0VkaXRvcl9EZWxpdmVyYWJsZT1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyDQotUHJvY2Vzc0VkaXRvcl9PcHRpb25hbD1cdTA0MWRcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NGZcdTA0MzdcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzkNCi1GaWx0ZXJEaWFsb2dfVHlwZV90ZXh0PVx1MDQyMlx1MDQzOFx1MDQzZiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwOg0KLUZpbHRlckRpYWxvZ19FeHBhbmRBbGw9XHUwNDIwXHUwNDMwXHUwNDM3XHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNkXHUwNDQzXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0MVx1MDQzNQ0KLU1vdmVEaWFsb2dfbW92aW5nX3RleHQ9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1Li4uDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkU2hhcGVJY29uV2FybmluZz1JVVBBMDAyNVc6IFx1MDQxN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzZVx1MDQzYSBcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0NGIgXHUwNDM0XHUwNDNiXHUwNDRmIHswfSBcdTA0M2RcdTA0MzUgXHUwNDNkXHUwNDMwXHUwNDM5XHUwNDM0XHUwNDM1XHUwNDNkIFx1MDQzMiBcdTA0M2ZcdTA0NDNcdTA0NDJcdTA0Mzg6IHsxfQ0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbkVycm9yPUlVUEEwMDI1RTogXHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzMiBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzUgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNhXHUwNDMwIFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQ0YjogezB9DQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9OYW1lTGFiZWw9XHUwNDE4XHUwNDNjXHUwNDRmOg0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGU9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfTmFtZUxhYmVsPVx1MDQxOFx1MDQzY1x1MDQ0ZjoNCi1BdXRob3JpbmdVSVBsdWdpbl9uZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VUaXRsZT1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLW5ld0xpYnJhcnlXaXphcmRfdGl0bGU9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZVRpdGxlPVx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdMaWJyYXJ5TWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYsIFx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzggXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzIFx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzOSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlRGVzY3JpcHRpb249XHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMCBcdTA0MzFcdTA0NGJcdTA0M2JcdTA0MzggXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDRiLiBcdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzNyBcdTA0M2RcdTA0MzhcdTA0NDUsIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzNSBcdTA0NDJcdTA0NDBcdTA0MzVcdTA0MzFcdTA0NDNcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjLg0KLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZVRpdGxlPVx1MDQxZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25XaXphcmRfd2luZG93VGl0bGU9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1FbGVtZW50c1ZpZXdfcmVwbGFjZWluZ3dpdGhmb3JtYXRfdGV4dD1cdTA0MTdcdTA0MzBcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzAgezB9Li4uDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkTm9kZUljb25XYXJuaW5nPUlVUEEwMDI2VzogXHUwNDE3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNlXHUwNDNhIFx1MDQ0M1x1MDQzN1x1MDQzYlx1MDQzMCBcdTA0MzRcdTA0M2JcdTA0NGYgezB9IFx1MDQzZFx1MDQzNSBcdTA0M2RcdTA0MzBcdTA0MzlcdTA0MzRcdTA0MzVcdTA0M2QgXHUwNDMyIFx1MDQzZlx1MDQ0M1x1MDQ0Mlx1MDQzODogezF9DQotTWVzc2FnZUxhYmVsUHJvdmlkZXJfdW5zZWxlY3RlZHBhY2thZ2VzPScnezB9JycgXHUwNDQxXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDQyIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiwgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDMwXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM1XHUwNDQxXHUwNDRmIFx1MDQzZFx1MDQzMCBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDMyIFx1MDQzZFx1MDQzNVx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0M2ZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDJcdTA0MzBcdTA0NDUNCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbkVycm9yPUlVUEEwMDI2RTogXHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzMiBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzUgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNhXHUwNDMwIFx1MDQ0M1x1MDQzN1x1MDQzYlx1MDQzMDogezB9DQotU3RlcHNPcmRlckRpYWxvZ19zdGVwcz1cdTA0MjhcdTA0MzBcdTA0MzNcdTA0Mzg6IA0KLVN0ZXBzT3JkZXJEaWFsb2dfdGl0bGU9XHUwNDFmXHUwNDNlXHUwNDQwXHUwNDRmXHUwNDM0XHUwNDNlXHUwNDNhIFx1MDQ0OFx1MDQzMFx1MDQzM1x1MDQzZVx1MDQzMiBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzgNCi1Qcm9jZXNzRWRpdG9yX1BsYW5uZWQ9XHUwNDE3XHUwNDMwXHUwNDNmXHUwNDNiXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5DQotc3BlY2lmeWRpcmVjdG9yeV90ZXh0PVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzMgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzPVx1MDQxZFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQzZSBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzZcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzkNCi1Qcm9jZXNzRWRpdG9yX0VudHJ5U3RhdGU9XHUwNDIxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDNlXHUwNDRmXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZFx1MDQzMCBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzUNCi1Qcm9jZXNzRWRpdG9yX0V4aXRTdGF0ZT1cdTA0MjFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NGZcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNkXHUwNDMwIFx1MDQzMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzNQ0KLXNlbGVjdENvbHVtbnN0b0FkZF90ZXh0PVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0NDJcdTA0M2VcdTA0M2JcdTA0MzFcdTA0NDZcdTA0NGIgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLVByb2Nlc3NFZGl0b3JfVHlwZT1cdTA0MjJcdTA0MzhcdTA0M2YNCi1Qcm9jZXNzRWRpdG9yX1RlYW09XHUwNDEzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDMwDQotRmlsdGVyRGlhbG9nX3RpdGxlPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGI6IA0KLQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZD1cdTA0MTRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDM3ICZcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLi4uDQotRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsPVx1MDQyMVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzZFx1MDQ0M1x1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0NDFcdTA0MzUNCi1PcGVuQ2hlYXRzaGVldFZpZXdfdGl0bGU9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzYlx1MDQ0YyBcdTA0MWZcdTA0MzBcdTA0M2NcdTA0NGZcdTA0NDJcdTA0M2FcdTA0MzgNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Sb2xsVXA9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDNhXHUwNDQwXHUwNDQzXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0NQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxEb3duPVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQzYVx1MDQ0MFx1MDQ0M1x1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0M2RcdTA0MzhcdTA0MzcNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXA9XHUwNDEyXHUwNDMyJlx1MDQzNVx1MDQ0MFx1MDQ0NQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX01vdmVEb3duPVx1MDQxMiZcdTA0M2RcdTA0MzhcdTA0MzcNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWw9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwJlx1MDQ0Ylx1MDQ0Mlx1MDQ0Yw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvcHk9Jlx1MDQxYVx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0Yy4uLg0KLUZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQ9XHUwNDI4XHUwNDMwXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNkXHUwNDRiIFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZCAoXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQzZlx1MDQzZVx1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQ0YiBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDVcdTA0M2VcdTA0MzRcdTA0NGZcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDMwKTogDQotTWV0aG9kTGlicmFyeUVkaXRvcl90aXRsZT1cdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyOiANCi0jTWVzc2FnZVZpZXdfc2VsZWN0ZWRfdGV4dD1TZWxlY3RlZDogDQotTWVzc2FnZVZpZXdfZXJybXNnX3RleHQ9XHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1DQotRWxlbWVudHNWaWV3X2Vycl9zYXZpbmc9SVVQQTAwMjdFOiBcdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOCAnJ3swfScnezF9DQotDQotZXJyX2NvcHlpbmdfZmlsZV90aXRsZT1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQzYVx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzOCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0MzANCi1lcnJfY29weWluZ19maWxlX2Vycm9yPUlVUEEwMDI4RTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0NDFcdTA0MzJcdTA0M2VcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNlXHUwNDNhLiANCi1lcnJfY29weWluZ19maWxlX3JlYXNvbj1cdTA0MWZcdTA0NDBcdTA0MzggXHUwNDNhXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM4IFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0MzAgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNkXHUwNDM4XHUwNDNhXHUwNDNiXHUwNDMwIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMC4gXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2RcdTA0M2VcdTA0M2ZcdTA0M2FcdTA0NDMgXHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLg0KLWVycl9wcm9jZXNzaW5nX2ZpbGVfdGl0bGU9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0M2FcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDMwDQotZWRpdENvbmZpZ3VyYXRpb25fdG9vbHRpcD1cdTA0MThcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlDQotZWRpdERpYWxvZ19tc2dDYW5ub3RFZGl0PUlVUEEwMDE1RTogXHUwNDFkXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDINCi1TYXZlVGhpc0FjdGlvbl9zYXZlb2JqZWN0PVx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyLi4uDQotRWxlbWVudHNWaWV3X3JlcGxhY2VfdGV4dD1cdTA0MTdcdTA0MzBcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9FeHRlbmQ9Jlx1MDQyMFx1MDQzMFx1MDQ0MVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQ0Yy4uLg0KLU1vdmVEaWFsb2dfZGVzdGluYXRpb25fdGV4dD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNkXHUwNDMwXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzI6DQotY2hvb3NlRGVmYXVsdERpcmVjdG9yeV90ZXh0PVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzMgXHUwNDNmXHUwNDNlIFx1MDQ0M1x1MDQzY1x1MDQzZVx1MDQzYlx1MDQ0N1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZSBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhOg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzPSZcdTA0MWRcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDRiXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3MyPVx1MDQxZiZcdTA0MzBcdTA0NDBcdTA0MzBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0NDBcdTA0NGIgXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Li4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXNzaWduVXNlckRpYWdyYW09XHUwNDFmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM1ICZcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0NGIuLi4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdGl0bGU9XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDQxXHUwNDMyXHUwNDNlXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzNSBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0NGINCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYWRJbWFnZT1cdTA0MTRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0MzAgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5Og0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZGRJbWFnZT1cdTA0MTRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0MzAgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM5IFx1MDQzZVx1MDQzMSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGZcdTA0NDU6DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3dwZEltYWdlPVx1MDQxNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQzMCBcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDFcdTA0MzhcdTA0M2NcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMDoNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfbm90YUZpbGU9SVVQQTAwMDRFOiBcdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQzXHUwNDQyXHUwNDRjIFx1MDQzZFx1MDQzNSBcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDNhIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQ0My4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYXNzaWduQnV0dG9uPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQ0Yy4uLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19lbnRlcmVkSW1hZ2VOb3RGb3VuZD1JVVBBMDAyNEU6IFx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0MzhcdTA0MzdcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNkXHUwNDM1XHUwNDQyIFx1MDQzMiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzUuIFx1MDQyM1x1MDQzMVx1MDQzNVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQ0MVx1MDQ0YyBcdTA0MzIgXHUwNDQyXHUwNDNlXHUwNDNjLCBcdTA0NDdcdTA0NDJcdTA0M2UgXHUwNDNmXHUwNDQzXHUwNDQyXHUwNDRjIFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZCBcdTA0M2VcdTA0NDJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2UgXHUwNDNhXHUwNDNlXHUwNDQwXHUwNDNkXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzM1x1MDQzMCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzguDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3NlbGVjdGVkSW1hZ2VOb3RGb3VuZD1JVVBBMDAzMEU6IFx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0MzhcdTA0MzdcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNkXHUwNDM1XHUwNDQyIFx1MDQzMiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzUuDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZUFESW1hZ2U9XHUwNDE4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQzN1x1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0NGIgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzAgXHUwNDM4IFx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBRERJbWFnZT1cdTA0MThcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQ0YiBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzAgXHUwNDM4IFx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VXUERJbWFnZT1cdTA0MThcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQ0YiBcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDFcdTA0MzhcdTA0M2NcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzAgXHUwNDM4IFx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvbnRyaWJ1dGU9XHUwNDFiXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlXHUwNDM1IFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JlcGxhY2U9XHUwNDFiXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDMwXHUwNDRmIFx1MDQzN1x1MDQzMFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzMA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0RpYWdyYW1zPVx1MDQxNFx1MDQzOFx1MDQzMCZcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0NGINCi1Qcm9jZXNzRWRpdG9yX2FjdGlvbl9kZWVwQ29weT1cdTA0MjAmXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDM4XHUwNDMyXHUwNDNkXHUwNDNlXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNS4uLg0KLUZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uPVx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNToNCi1Db25maWd1cmF0aW9uUGFnZV9oaWRlVG9vbFRpcD1cdTA0MjFcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMvXHUwNDNmXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZFx1MDQzNVx1MDQzZVx1MDQ0Mlx1MDQzY1x1MDQzNVx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGINCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbj1cdTA0MWVcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzU6DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3NBbGw9XHUwNDFkXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZFx1MDQzNSBcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMNCi1GaWx0ZXJEaWFsb2dfUGF0dGVybl9kZXNjcmlwdGlvbj1cdTA0MjhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2RcdTA0NGIgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDRmXHUwNDRlXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzN1x1MDQzMFx1MDQzZlx1MDQ0Zlx1MDQ0Mlx1MDQ0Ylx1MDQzY1x1MDQzOC4gKj1cdTA0M2JcdTA0NGVcdTA0MzFcdTA0MzBcdTA0NGYgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDNhXHUwNDMwLCA/PVx1MDQzYlx1MDQ0ZVx1MDQzMVx1MDQzZVx1MDQzOSBcdTA0NDFcdTA0MzhcdTA0M2NcdTA0MzJcdTA0M2VcdTA0M2INCi1Db25maWd1cmF0aW9uUGFnZV9UcmVlVGl0bGVMYWJlbD1cdTA0MWNcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0NGI6DQotQ29uZmlndXJhdGlvblBhZ2VfTG9hZGluZ01lc3NhZ2U9XHUwNDE3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDNhXHUwNDMwIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCwgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDM2XHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1Li4uDQotTW92ZURpYWxvZ192YWxpZGRlc3RpbmF0aW9uX3RleHQ9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkIFx1MDQzZFx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQ0Ylx1MDQzOSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzMgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzY1x1MDQzNVx1MDQ0OVx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1Nb3ZlRGlhbG9nX2Nhbm5vdE1vZGlmeURlc3RpbmF0aW9uPUlVUEEwMDM0RTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZVx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNS4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGw9XHUwNDFlXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0MVx1MDQzNQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5CYXNlQWN0aXZpdHk9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzMVx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQ0M1x1MDQ0ZSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUNCi1Qcm9jZXNzRm9ybUVkaXRvcl9leHBhbkFsbEFjdGlvbkxhYmVsPSZcdTA0MjBcdTA0MzBcdTA0MzdcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M2RcdTA0NDNcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDQxXHUwNDM1DQotUHJvY2Vzc0Zvcm1FZGl0b3JfY29sbGFwc2VBbGxBY3Rpb25MYWJlbD0mXHUwNDIxXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNkXHUwNDQzXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0MVx1MDQzNQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURpYWdyYW09XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzNCZcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0NDMgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVJldmVhbD1cdTA0MWRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGJcdTA0MzUgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiIFx1MDQzMiBcdTA0M2ZcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2JcdTA0MzggXHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzZFx1MDQ0YiBcdTA0MzFcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDRiIFx1MDQzMlx1MDQzZSBcdTA0MzhcdTA0MzdcdTA0MzFcdTA0MzVcdTA0MzZcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDMyXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMyIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIuIFx1MDQxZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBPSywgXHUwNDQ3XHUwNDQyXHUwNDNlXHUwNDMxXHUwNDRiIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzhcdTA0NDUgXHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQ0Yy4NCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfU2VsZWN0Q29sdW1ucz1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDQyXHUwNDNlXHUwNDNiXHUwNDMxXHUwNDQ2XHUwNDRiIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtPVx1MDQxZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM0Jlx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQ0MyBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfQ29sdW1uU2VsZWN0aW9uPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzZVx1MDQ0MCBcdTA0NDFcdTA0NDJcdTA0M2VcdTA0M2JcdTA0MzFcdTA0NDZcdTA0MzA6DQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N3aXRjaENvbmZpZ3VyYXRpb249XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDRjXHUwNDQxXHUwNDRmIFx1MDQzZFx1MDQzMCBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwIFx1MDQzZlx1MDQzZSBcdTA0NDNcdTA0M2NcdTA0M2VcdTA0M2JcdTA0NDdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGUgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQzOFx1MDQzOCBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwDQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N1cHByZXNzaW9uR3JvdXBUaXRsZT1cdTA0MjFcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0MzhcdTA0MzUNCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfaW5oZXJpdFN1cHByZXNzaW9uU3RhdGU9XHUwNDFkXHUwNDMwXHUwNDQxXHUwNDNiXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzZVx1MDQ0Zlx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0MzhcdTA0NGYNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbT1cdTA0MWVcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDQzICZcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDFcdTA0MzhcdTA0M2NcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMA0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19DbGVhckJ1dHRvbkxhYmVsPVx1MDQxZVx1MDQ0N1x1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQ0Yw0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQ0Yy4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0luc2VydE5ld1BoYXNlPVx1MDQxMlx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2RcdTA0M2VcdTA0MzJcdTA0NGJcdTA0MzkgXHUwNDRkXHUwNDQyXHUwNDMwXHUwNDNmDQotVmlld0hlbHBlcl9yZWxvYWRMaWJPblJvbGxiYWNrRXJyb3I9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0MzJcdTA0M2VcdTA0NDFcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDNlXHUwNDRmXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQ0MVx1MDQzYlx1MDQzNSBcdTA0M2VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzggXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDNiXHUwNDM4XHUwNDQ5XHUwNDMwLiBcdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzdcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzJcdTA0M2VcdTA0NDFcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDM1XHUwNDM1IFx1MDQzOFx1MDQ0MVx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0NDFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NGZcdTA0M2RcdTA0MzhcdTA0NGYuDQotVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZF90ZXh0PVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiAnJ3swfScnIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2QuDQotVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZGNvbmZpcm1fdGV4dD1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgJyd7MH0nJyBcdTA0NDNcdTA0MzZcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkLiBcdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzOFx1MDQzNyAnJ3sxfScnPw0KLUNvbmZpZ3VyYXRpb25QYWdlX0FkZE1pc3NpbmdUb29sVGlwPVx1MDQxNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2RcdTA0MzVcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4DQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb249XHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1DQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uR2VuZXJhbEluZm89XHUwNDFlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiANCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BcHBseVBhdHRlcm49XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjICZcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2QNCi1Nb3ZlRGlhbG9nX3NlbGVjdGRlc3RpbmF0aW9uX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0Nlx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2VcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUuDQotTW92ZURpYWxvZ19ub21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZSBcdTA0NDBcdTA0MzBcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2VcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzY1x1MDQzNVx1MDQ0OVx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3Ryb3VibGVvYmplY3Q9LiAgXHUwNDFlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyIFx1MDQ0MSBcdTA0M2VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0M2VcdTA0Mzk6IA0KLU1lc3NhZ2VMYWJlbFByb3ZpZGVyX2VycmNoaWxkcGtncz1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDEgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQzZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0MiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDM0XHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDQwXHUwNDNkXHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzMCBcdTA0NDFcdTA0M2VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0NDIgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQ0MSBcdTA0M2RcdTA0MzVcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0NGVcdTA0NDlcdTA0MzhcdTA0M2NcdTA0MzggXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDMwXHUwNDNjXHUwNDM4DQotUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19UaXRsZT1cdTA0MWVcdTA0M2ZcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQ0Yg0KLVByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfTWVzc2FnZT1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDRiLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNkXHUwNDQzXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YywgXHUwNDM4IFx1MDQzZVx1MDQ0Mlx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0M2VcdTA0NDAgXHUwNDQyXHUwNDM1XHUwNDQ1LCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZFx1MDQzNSBcdTA0M2RcdTA0NDNcdTA0MzZcdTA0M2RcdTA0M2UNCi1Qcm9jZXNzRWRpdG9yX1RpdGxlPVx1MDQyMFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0M2VcdTA0MzI6IA0KLVNhdmVBc3dpdGhkb3RzX3RleHQ9XHUwNDIxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzYVx1MDQzMFx1MDQzYS4uLg0KLVByb2Nlc3NFZGl0b3JfV29ya0JyZWFrZG93blN0cnVjdHVyZT1cdTA0MjFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NDNcdTA0NDBcdTA0MzAgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDRiDQotUHJvY2Vzc0VkaXRvcl9UZWFtQWxsb2NhdGlvbj1cdTA0MjBcdTA0MzBcdTA0NDFcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmDQotUHJvY2Vzc0VkaXRvcl9Xb3JrUHJvZHVjdFVzYWdlPVx1MDQxOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwDQotUHJvY2Vzc0VkaXRvcl9Db25zb2xpZGF0ZWRWaWV3PVx1MDQxZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzNFx1MDQzOFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1Qcm9jZXNzRWRpdG9yX2NvbmZpcm1BdXRvU3luY2g9XHUwNDJkXHUwNDQyXHUwNDNlIFx1MDQzNFx1MDQzNVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDNhIFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZSBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMyIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0MzJcdTA0NDFcdTA0MzVcdTA0NDUgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMyIFx1MDQzZFx1MDQzOFx1MDQzNlx1MDQzNSBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5LCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDQ1IFx1MDQzZFx1MDQzMCBcdTA0MzJcdTA0M2FcdTA0M2JcdTA0MzBcdTA0MzRcdTA0M2FcdTA0MzUgXHUwNDFlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzYlx1MDQzOCBcdTA0MjFcdTA0MzJcdTA0M2VcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzAgXHUwNDMyXHUwNDNhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDMwIFx1MDQzZVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQ0ZiAiXHUwNDIxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkIFx1MDQ0MSBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0MzhcdTA0M2FcdTA0M2VcdTA0M2MiLiBcdTA0MTRcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0M2MgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDNjIFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQ0M1x1MDQ0MiBcdTA0M2RcdTA0MzBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M2RcdTA0NGIgXHUwNDM4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzZVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzMCBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMCwgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQ0MVx1MDQzZSBcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M2RcdTA0MzRcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM1XHUwNDM5IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMC4gXHUwNDFlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzMlx1MDQzZFx1MDQzOFx1MDQzY1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSwgXHUwNDQ3XHUwNDQyXHUwNDNlIFx1MDQzNFx1MDQzOFx1MDQzZFx1MDQzMFx1MDQzY1x1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzNSBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGIgKFx1MDQzMlx1MDQ0Ylx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzZFx1MDQ0YiBcdTA0M2FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzJcdTA0M2VcdTA0M2MgXHUwNDM4IFx1MDQzN1x1MDQzNVx1MDQzYlx1MDQzNVx1MDQzZFx1MDQ0Ylx1MDQzYyBcdTA0NDZcdTA0MzJcdTA0MzVcdTA0NDJcdTA0M2VcdTA0M2MpIFx1MDQzZFx1MDQzNSBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIgXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDRiLiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NGM/DQotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24xPVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0Zg0KLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMj1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0M2VcdTA0NDAgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM1XHUwNDM5IFx1MDQzOCBcdTA0M2ZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzINCi1OZXdMaWJyYXJ5RGlhbG9nX25ld2xpYnJhcnlfYXM9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2FcdTA0MzBcdTA0M2ENCi1OZXdQbHVnaW5EaWFsb2dfbmV3cGx1Z2luX3RleHQ9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQ0YyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1TZWxlY3RFbGVtZW50RGlhbG9nX3RpdGxlX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDNlXHUwNDM0XHUwNDNkXHUwNDNlIFx1MDQzOFx1MDQzNyBcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM5Og0KLU9wZW5Db25maWdEaWFsb2duZXdjb25maWdfdGV4dD1cdTA0MWRcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmOg0KLXByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZV9CU0VkaXRvcj1cdTA0MjBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDNlXHUwNDMyDQotDQotIyBBYnN0cmFjdERpYWdyYW1FZGl0b3INCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9XHUwNDEyXHUwNDRiXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNkXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3JlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQ9XHUwNDFlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzZSBcdTA0MzFcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzkgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2Zvcm1hdFRleHRCb3hBY3Rpdml0eV90ZXh0PVx1MDQxZVx1MDQ0Mlx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDFcdTA0NDJcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDM1Li4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1cdTA0MTNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzdcdTA0M2VcdTA0M2RcdTA0NDJcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2UgXHUwNDNmXHUwNDNlIFx1MDQ0MVx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzZFx1MDQzNVx1MDQzY1x1MDQ0Mw0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9XHUwNDEzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDNkXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlIFx1MDQzZlx1MDQzZSBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzJcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDNjXHUwNDQzDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1cdTA0MTJcdTA0MzVcdTA0NDBcdTA0NDJcdTA0MzhcdTA0M2FcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2UgXHUwNDNmXHUwNDNlIFx1MDQ0MVx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzZFx1MDQzNVx1MDQzY1x1MDQ0Mw0KLU1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fdGl0bGU9XHUwNDFlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLU1vdmVEaWFsb2dfaW52YWxpZF9tb3ZlX2Rlc3RpbmF0aW9uX3Byb2JsZW1fbXNnPUlVUEEwMDQxRTogXHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2RcdTA0MzVcdTA0M2JcdTA0NGNcdTA0MzdcdTA0NGYgXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzMiBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1Lg0KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZW1vZGVsbGlicmFyeT1cdTA0MjFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzOS4uLg0KLU1ldGhvZExpYnJhcnlFZGl0b3JfZXJyb3JfZGlhbG9nX3RpdGxlPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMA0KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZV9saWJyYXJ5X3Byb2JsZW1fbXNnPUlVUEEwMDMzRTogXHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0NDFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4Lg0KLU1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb25fZGVsZXRlY29uZmlybV90ZXh0PVx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0YyAnJ3swfScnPw0KLUNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX0NvbnRlbnRFbGVtZW50X3RleHQ9XHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMjogDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Ccm93c2VCdXR0b25MYWJlbD1cdTA0MWVcdTA0MzFcdTA0MzdcdTA0M2VcdTA0NDAuLi4NCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYgXHUwNDM4IFx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMC4NCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZVRpdGxlPVx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDM4IFx1MDQzN1x1MDQzMFx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0NDFcdTA0MzUgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1cdTA0MTJcdTA0MzVcdTA0NDBcdTA0NDJcdTA0MzhcdTA0M2FcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2UgXHUwNDNmXHUwNDNlIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMlx1MDQzZVx1MDQzY1x1MDQ0MyBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0M2NcdTA0NDMNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PVx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0Yw0KLUF0dGFjaG1lbnREaWFsb2dhdHRhY2hGaWxlX3RleHQ9XHUwNDEyXHUwNDNiXHUwNDNlXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYg0KLUNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnQ9XHUwNDFjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLU9wZW5Db25maWdEaWFsb2dvcGVuY29uZmlnX3RleHQ9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZQ0KLUVsZW1lbnRzVmlld19yZXBsYWNlQWN0aW9uX3RleHQ9XHUwNDE3XHUwNDMwXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjLi4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfbWVzc2FnZT1cdTA0MjFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgezB9DQotQ29uZmlndXJhdGlvblBhZ2VfU2hvd0Vycm9yVG9vbFRpcD1cdTA0MWZcdTA0M2VcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDNhXHUwNDNlXHUwNDNiIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNlx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25Gb3JtUHJlZml4PVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZjogDQotQ2hlY2tsaXN0T3JkZXJfY2hlY2tsaXN0aXRlbXNfdGV4dD1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDQxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQ0YjogDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsPVx1MDQxZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzY1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M2INCi1Db25maWd1cmF0aW9uUGFnZV9NYWtlQ2xvc3VyZVRvb2xUaXA9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzN1x1MDQzMFx1MDQzY1x1MDQ0Ylx1MDQzYVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSwgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDMyIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzOA0KLU5ld1BsdWdpbkRpYWxvZ19yZWZlcmVuY2VwbHVnaW5fdGV4dD1cdTA0MjFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM4Og0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9jcmVhdGVGcmVlVGV4dF90ZXh0PVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDFcdTA0MzJcdTA0M2VcdTA0MzFcdTA0M2VcdTA0MzRcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQxXHUwNDQyDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfTGFiZWw9XHUwNDE3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNlXHUwNDNhIFx1MDQ0M1x1MDQzN1x1MDQzYlx1MDQzMDoNCi1EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2Nvbm5lY3RfdGV4dD1JVVBBMDAzMlc6IFx1MDQxZFx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZSBcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDNlXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1DQotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX3NhbWVwcmVkYW5kc3VjX3RleHQ9SVVQQTAwMzNXOiBcdTA0MWVcdTA0MzRcdTA0MzhcdTA0M2QgXHUwNDM4IFx1MDQ0Mlx1MDQzZVx1MDQ0MiBcdTA0MzZcdTA0MzUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0M1x1MDQ0MFx1MDQ0YiBcdTA0M2RcdTA0MzUgXHUwNDNjXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDQyIFx1MDQzMVx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0M2VcdTA0MzRcdTA0M2RcdTA0M2VcdTA0MzJcdTA0NDBcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0M2RcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQ4XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDNjIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0NDFcdTA0M2JcdTA0MzVcdTA0MzRcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0M2MNCi0NCi0jIEVkaXRvckNob29zZXINCi1FZGl0b3JDaG9vc2VyX2xvYWRkRXJyb3JEbGdUaXRsZT1cdTA0MWVcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDQwDQotRWRpdG9yQ2hvb3Nlcl9SZXNvdXJjZXNFcnJvcj1cdTA0MmRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQ0MVx1MDQzZVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQ0MiBcdTA0M2VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzguIFx1MDQyMFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQ0M1x1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDQ1IFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzVcdTA0M2MgKFx1MDQ0MVx1MDQzYy4gXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmKS4gXG5cDQotXG5cDQotXHUwNDFkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZFx1MDQzZVx1MDQzZlx1MDQzYVx1MDQ0MyBcdTA0MWVcdTA0MWEgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzFcdTA0MzVcdTA0MzcgXHUwNDM3XHUwNDMwXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwIFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzMC4gXHUwNDE3XHUwNDMwXHUwNDNhXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQ0ZFx1MDQ0Mlx1MDQzZSBcdTA0M2VcdTA0M2FcdTA0M2RcdTA0M2UgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzN1x1MDQzMFx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMCBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzAuDQotQ29uZmlndXJhdGlvblBhZ2VfRm9ybVByZWZpeD1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGY6IA0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbk5hbWU9XHUwNDE4XHUwNDNjXHUwNDRmOg0KLUF0dGFjaG1lbnREaWFsb2dGaWxlVVJMX3RleHQ9VVJMIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzMDoNCi1TdGVwc09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDhcdTA0MzBcdTA0MzMgXHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQzY1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDMyIFx1MDQzZFx1MDQ0M1x1MDQzNlx1MDQzZFx1MDQzZVx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2VcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQxIFx1MDQzZlx1MDQzZVx1MDQzY1x1MDQzZVx1MDQ0OVx1MDQ0Y1x1MDQ0ZSBcdTA0M2FcdTA0M2RcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2EgXHUwNDEyXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQ1IFx1MDQzOCBcdTA0MTJcdTA0M2RcdTA0MzhcdTA0MzcuDQotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJfc2F2ZT1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOA0KLU1lc3NhZ2VWaWV3X2VycmVsZW1lbnRfdGV4dD1cdTA0MjFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0MzBcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzlcdTA0NDFcdTA0NGYgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyDQotTWVzc2FnZVZpZXdfcmVmZWxlbWVudF90ZXh0PVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiwgXHUwNDNkXHUwNDMwIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzOSBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0NGJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDMwDQotDQotI0FjdGl2aXR5IERpYWdyYW0NCi1BY3Rpdml0eURpYWdyYW1FZGl0b3JfY3JlYXRlU3RhcnROb2RlX3RleHQ9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M2INCi1Db25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50RGVzY3JpcHRpb249XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAsIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQ0YiBcdTA0MzggXHUwNDNmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyXHUwNDRiIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMiwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzZFx1MDQ0M1x1MDQzNlx1MDQzZFx1MDQzZSBcdTA0MzJcdTA0M2FcdTA0M2JcdTA0NGVcdTA0NDdcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDMyIFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUuDQotQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb25fdGV4dD1cdTA0MWVcdTA0M2FcdTA0M2RcdTA0M2UgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Zlx1MDQzNFx1MDQzYVx1MDQzMCBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyIFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzOSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzgNCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RpcmVjdG9yeUxhYmVsPVx1MDQxYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMzoNCi1Sb290UHJlZlBhZ2VfZW5hYmxlcHJvY2Vzc2NvbnRyaWJ1dGlvbl90ZXh0PVx1MDQxMlx1MDQzYVx1MDQzYlx1MDQ0ZVx1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25fdGV4dD1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAuDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25MYWJlbD1cdTA0MWVcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzU6DQotQ29udHJpYnV0aW9uU2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZT1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0M2VcdTA0NDAgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM5IFx1MDQzNFx1MDQzYlx1MDQ0ZiAnJ3swfScnDQotRWxlbWVudHNWaWV3X29wZW5WYXJpYWJpbGl0eURpYWxvZ0FjdGlvbl90ZXh0PVx1MDQxZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0NDEgXHUwNDNmXHUwNDNlXHUwNDNjXHUwNDNlXHUwNDQ5XHUwNDRjXHUwNDRlIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzZVx1MDQzMiBcdTA0MzJcdTA0MzBcdTA0NDBcdTA0MzhcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzgNCi1WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9XHUwNDMyXHUwNDRiXHUwNDMxXHUwNDNlXHUwNDQwIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzZVx1MDQzMiBcdTA0MzJcdTA0MzBcdTA0NDBcdTA0MzhcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzggXHUwNDM0XHUwNDNiXHUwNDRmICcnezB9JycNCi1WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdmlld2VyTGFiZWw9XHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQzMlx1MDQzMFx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQzMlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgJyd7MH0nJw0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19MYWJlbD1cdTA0MTdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0M2VcdTA0M2EgXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDRiOg0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfZGVsZXRlX3RleHQ9XHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZFx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZQ0KLUFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0NDMgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl9kZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2UgXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzNSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1cdTA0MWVcdTA0NDdcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzhcdTA0NDJcdTA0NGMNCi1XUENvbXBhcnRtZW50RmlndXJlXzA9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwDQotcHJvbXB0Zm9yX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGRfdGV4dD1cdTA0MWVcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDRiIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOSwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzZFx1MDQzNSBcdTA0MzFcdTA0NGJcdTA0M2JcdTA0MzggXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDRiIFx1MDQzMiBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDNlXHUwNDMyDQotcHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtPVx1MDQxZVx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDQyXHUwNDRjIFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQ0YiBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzkgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZFx1MDQzNVx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0NDBcdTA0MzBcdTA0NDFcdTA0NDhcdTA0MzhcdTA0NDBcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzkgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotDQotI0NvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfTmFtZVBhdHRlcm49XHUwNDI4XHUwNDMwXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNkXHUwNDRiIFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZCAoXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQzZlx1MDQzZVx1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQ0YiBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDVcdTA0M2VcdTA0MzRcdTA0NGZcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDMwKToNCi1zaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbl9sYWJlbD1cdTA0MWZcdTA0M2VcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDMyIFx1MDQzZlx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzYlx1MDQzOCBcdTA0MWRcdTA0MzBcdTA0MzJcdTA0MzhcdTA0MzNcdTA0MzBcdTA0NDJcdTA0M2VcdTA0NDANCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19QYXR0ZXJuPVx1MDQyOFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZFx1MDQ0YiBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzRcdTA0MzVcdTA0M2JcdTA0NGZcdTA0NGVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDM3XHUwNDMwXHUwNDNmXHUwNDRmXHUwNDQyXHUwNDRiXHUwNDNjXHUwNDM4LiAqPVx1MDQzYlx1MDQ0ZVx1MDQzMVx1MDQzMFx1MDQ0ZiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M2VcdTA0M2FcdTA0MzAsID89XHUwNDNiXHUwNDRlXHUwNDMxXHUwNDNlXHUwNDM5IFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQzMlx1MDQzZVx1MDQzYg0KLWVycl9wcm9jZXNzaW5nX2ZpbGVfZGVzY3JpcHRpb249SVVQQTAwMjlFOiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzhcdTA0MzdcdTA0M2VcdTA0NDhcdTA0M2JcdTA0MzAgXHUwNDNlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0M2FcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDMwLiBcdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZFx1MDQzZVx1MDQzZlx1MDQzYVx1MDQ0MyBcdTA0MjFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuDQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQ2F0ZWdvcnlUeXBlPVx1MDQyMlx1MDQzOFx1MDQzZiBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0Mzg6DQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbj1cdTA0MWVcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzU6DQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfU2VsZWN0Q2F0ZWdvcmllcz1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4DQotDQotI2xvZyBtZXNzYWdlcw0KLWNoZWF0c2hlZXRfbG9hZF9mYWlsdXJlX2xvZ19tc2c9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0M2VcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDMwXHUwNDNjXHUwNDRmXHUwNDQyXHUwNDNhXHUwNDQzOiANCi0NCi1uZXdDb25maWd1cmF0aW9uV2lyYXpkX2NyZWF0ZUVycm9yPUlVUEEwMDM1RTogXHUwNDFhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIFx1MDQzZFx1MDQzNSBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzANCi1uZXdQbHVnaW5XaXphcmRfY3JlYXRlRXJyb3I9SVVQQTAwMzZFOiBcdTA0MWNcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGMgXHUwNDNkXHUwNDM1IFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZA0KLWVycm9yRGlhbG9nX21vdmVFcnJvcj1JVVBBMDAzN0U6IFx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NGMgXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mg0KLXJlbmFtZURpYWxvZ19yZW5hbWVFcnJvcj1JVVBBMDAzOEU6IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2RcdTA0MzUgXHUwNDMxXHUwNDRiXHUwNDNiIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZA0KLWVycm9yRGlhbG9nX2NyZWF0ZUVycm9yPUlVUEEwMDM5RTogXHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzZFx1MDQzNSBcdTA0MzFcdTA0NGJcdTA0M2IgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkDQotZHVwbGljYXRlUGx1Z2luTmFtZUVycm9yX21zZz1JVVBBMDEwMUU6IFx1MDQxOFx1MDQzY1x1MDQ0ZiAnJ3swfScnIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIuIFx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlLg0KLQ0KLSNOZXcgU3RyaW5ncyBmb3IgUHJvY2Vzc0VkaXRvciBDb250ZXh0IG1lbnUgZGlhZ3JhbSBpbWFnZXMNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRBREltYWdlPVx1MDQxNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzhcdTA0MzdcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgQUQuLi4NCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvck1zZz1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOCBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzANCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRBRERJbWFnZT1cdTA0MTRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IEFERC4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZFdQREltYWdlPVx1MDQxNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzhcdTA0MzdcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgV1BELi4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURJbWFnZUluUHVibGlzaGluZz1cdTA0MThcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IEFEIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1Qcm9jZXNzRWRpdG9yX3Byb21wdFRvRGVsZXRlQmVmb3JlU3VwcHJlc3M9XHUwNDIxXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRiXHUwNDM1IFx1MDQzNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0MzIgXHUwNDNmXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNiXHUwNDM4IFx1MDQyMVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0M2RcdTA0NGIgXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzNVx1MDQzZFx1MDQ0YiBcdTA0MzJcdTA0M2UgXHUwNDM4XHUwNDM3XHUwNDMxXHUwNDM1XHUwNDM2XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQzMiBcdTA0M2ZcdTA0M2VcdTA0NDFcdTA0M2JcdTA0MzUgXHUwNDQxXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDM4XHUwNDRmIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIuIFx1MDQxZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBPSywgXHUwNDQ3XHUwNDQyXHUwNDNlXHUwNDMxXHUwNDRiIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzhcdTA0NDUgXHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQ0Yy4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VBRERJbWFnZUluUHVibGlzaGluZz1cdTA0MThcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IEFERCBcdTA0M2ZcdTA0NDBcdTA0MzggXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlV1BESW1hZ2VJblB1Ymxpc2hpbmc9XHUwNDE4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQzN1x1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBXUEQgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLVByb2Nlc3NFZGl0b3JfRGlhZ3JhbUltYWdlX0lucHV0RGlhbG9nX2luaXRpYWxWYWx1ZT1cdTA0MWZcdTA0NDNcdTA0NDJcdTA0NGMgXHUwNDNhIFx1MDQzOFx1MDQzN1x1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1Nob3dMaW5rZWRFbGVtZW50aW5MaWJyYXJ5Vmlldz1cdTA0MWZcdTA0M2VcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0NDImXHUwNDRjIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDMyIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzgNCi1Qcm9jZXNzRWRpdG9yX3VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb25fbGFiZWw9XHUwNDFlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2UgXHUwNDQxXHUwNDNlXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDM4XHUwNDM4ICZcdTA0MzhcdTA0MzcgXHUwNDMxXHUwNDMwXHUwNDM3XHUwNDRiDQotUHJvY2Vzc0VkaXRvcl9Db250ZXh0TWVudV9EaWFncmFtSW1hZ2VzPVx1MDQxOFx1MDQzN1x1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2MNCi0NCi0jU3RyaW5ncyBmb3Igc3luY2hyb25pemF0aW9uIHdpemFyZCBvbiBwcm9jZXNzIGVkaXRvcidzIEJTDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90aXRsZT1cdTA0MWVcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90ZXh0PVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0N1x1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDM5IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0MFx1MDQ0YiBcdTA0NDFcdTA0MzhcdTA0M2RcdTA0NDVcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSwgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDRmXHUwNDM1XHUwNDNjXHUwNDQzXHUwNDRlIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDFcdTA0MzhcdTA0M2RcdTA0NDVcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguIFwNCi1cdTA0MmRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDNlXHUwNDQwIFx1MDQzMlx1MDQzYlx1MDQzOFx1MDQ0Zlx1MDQzNVx1MDQ0MiBcdTA0M2RcdTA0MzAgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzOCBcdTA0MzdcdTA0MzBcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGIsIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzNSBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjXHUwNDQxXHUwNDRmIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDFcdTA0MzhcdTA0M2RcdTA0NDVcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfY29uZmlnTGFiZWw9XHUwNDFhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmOg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90aXRsZT1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDNlXHUwNDM5XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDFcdTA0MzhcdTA0M2RcdTA0NDVcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJvcGVydGllc19sYWJsZT1cdTA0MjFcdTA0MzJcdTA0M2VcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzANCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbmFtZV9sYWJsZT1cdTA0MThcdTA0M2NcdTA0NGYNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJlc2VudGF0aW9uTmFtZV9sYWJsZT1cdTA0MThcdTA0M2NcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2JyaWVmRGVzY19sYWJsZT1cdTA0MWVcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3B0aW9uYWxJbm91dHNfbGFiZWw9XHUwNDFkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQ0Yg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9tYW5kYXRvcnlJbnB1dHNfbGFibGU9XHUwNDFlXHUwNDMxXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQ0Yg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9vdXRwdXRzX2xhYmVsPVx1MDQxMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQ0Yg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX2xhYmVsPVx1MDQxZVx1MDQ0MVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYWRkblBlcmZvcm1lcnNfbGFibGU9XHUwNDE0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQzOA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9yZXNwb25zaWJsZVJvbGVzX2xhYmxlPVx1MDQxZVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzgNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfY29udG5BcnRpZmFjdHNfbGFiZWw9XHUwNDIxXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDMwXHUwNDQ5XHUwNDM4XHUwNDM1XHUwNDQxXHUwNDRmIFx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzNVx1MDQ0NFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9kaWx2ZWRQYXJ0c19sYWJlbD1cdTA0MWFcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMA0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9zZWxTdGVwc19sYWJlbD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0M2VcdTA0NDAgXHUwNDQ4XHUwNDMwXHUwNDMzXHUwNDNlXHUwNDMyDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzZVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzMCBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQzYlx1MDQzNVx1MDQzNlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDFcdTA0MzhcdTA0M2RcdTA0NDVcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RpdGxlPVx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMlx1MDQzMFx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDAgXHUwNDQxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzYlx1MDQzMFx1MDQzM1x1MDQzMFx1MDQzNVx1MDQzY1x1MDQ0Ylx1MDQzNSBcdTA0MzRcdTA0MzVcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzhcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQ0MVx1MDQzOFx1MDQzZFx1MDQ0NVx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzOFx1MDQzN1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOC4NCi1zZWxlY3RFZGl0b3JzVG9EaXNjYXJkQ29uZmxpY3RDaGFuZ2VzPVx1MDQxZVx1MDQzMVx1MDQzZFx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQzNlx1MDQzNVx1MDQzZFx1MDQ0YiBcdTA0M2RcdTA0MzVcdTA0NDFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLCBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0M2JcdTA0MzhcdTA0M2FcdTA0NDJcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQxIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zlx1MDQzY1x1MDQzOCwgXHUwNDMyXHUwNDNkXHUwNDM1XHUwNDQxXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDNjXHUwNDM4IFx1MDQzMlx1MDQzZFx1MDQzNSBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzAuXG5cDQotXHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0YiwgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzMiBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0NDUgXHUwNDQxXHUwNDNiXHUwNDM1XHUwNDM0XHUwNDQzXHUwNDM1XHUwNDQyIFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0M1x1MDQzYlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0Yy4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfdGl0bGVfdGV4dD1cdTA0MWNcdTA0MzBcdTA0NDFcdTA0NDJcdTA0MzVcdTA0NDAgXHUwNDQxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV9leHBsYWluVGV4dD1cdTA0MWNcdTA0MzBcdTA0NDFcdTA0NDJcdTA0MzVcdTA0NDAgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyIFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMyIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0MzJcdTA0NDFcdTA0MzVcdTA0NDUgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMyIFx1MDQzZFx1MDQzOFx1MDQzNlx1MDQzNSBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5LCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDQ1IFx1MDQzZFx1MDQzMCBcdTA0MzJcdTA0M2FcdTA0M2JcdTA0MzBcdTA0MzRcdTA0M2FcdTA0MzUgXHUwNDFlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzYlx1MDQzOCBcdTA0MjFcdTA0MzJcdTA0M2VcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzAgXHUwNDMyXHUwNDNhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDMwIFx1MDQzZVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQ0ZiAiXHUwNDIxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkIFx1MDQ0MSBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0MzhcdTA0M2FcdTA0M2VcdTA0M2MiLiAgXA0KLVx1MDQxMiBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzBcdTA0NDUgXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNiXHUwNDRmXHUwNDRlXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQ0Mlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQzZSBcdTA0NDFcdTA0MzJcdTA0M2VcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzAsIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0MzIgXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDNjIFx1MDQzY1x1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzNS4gXA0KLVx1MDQxY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZSBcdTA0NDJcdTA0MzBcdTA0M2FcdTA0MzZcdTA0MzUgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzYlx1MDQ0ZVx1MDQzMVx1MDQ0M1x1MDQ0ZSBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0NDNcdTA0NGUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDMyXHUwNDRiXHUwNDQ3XHUwNDM4XHUwNDQxXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4gXA0KLVx1MDQxZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzJcdTA0M2RcdTA0MzhcdTA0M2NcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUsIFx1MDQ0N1x1MDQ0Mlx1MDQzZSBcdTA0MzRcdTA0MzhcdTA0M2RcdTA0MzBcdTA0M2NcdTA0MzhcdTA0NDdcdTA0MzVcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzUgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiIChcdTA0MzJcdTA0NGJcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0M2RcdTA0NGIgXHUwNDNhXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDM4XHUwNDMyXHUwNDNlXHUwNDNjIFx1MDQzOCBcdTA0MzdcdTA0MzVcdTA0M2JcdTA0MzVcdTA0M2RcdTA0NGJcdTA0M2MgXHUwNDQ2XHUwNDMyXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDNjKSBcdTA0M2RcdTA0MzUgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQ0Yi4NCi0NCi1vcGVuUlRFPVx1MDQxZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDNlXHUwNDQyXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MVx1MDQ0Mlx1MDQzMA0KLWNsb3NlUlRFPVx1MDQxN1x1MDQzMFx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDNlXHUwNDQyXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MVx1MDQ0Mlx1MDQzMA0KLQ0KLSNOZXcgU3RyaW5ncw0KLXJvbGVzZXRzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNlXHUwNDQyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDRmXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDQzIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOS4NCi1kaXNjaXBsaW5lc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzZVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Zlx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZFx1MDQzNS4NCi13b3JrcHJvZHVjdHR5cGVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNlXHUwNDQyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDRmXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDQyXHUwNDM4XHUwNDNmXHUwNDQzIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzAuDQotZG9tYWluc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNlXHUwNDQyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDRmXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDM0XHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQzLg0KLXRvb2xzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNlXHUwNDQyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDRmXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDQzLg0KLWN1c3RvbWNhdGVnb3J5X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNlXHUwNDQyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDRmXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQzOC4NCi0NCi1jb25jZXB0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNlXHUwNDQyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDRmXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ2XHUwNDM1XHUwNDNmXHUwNDQ2XHUwNDM4XHUwNDM4Lg0KLWNoZWNrbGlzdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzZVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Zlx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0NDJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0MzUuDQotZXhhbXBsZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzZVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Zlx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjXHUwNDQzIFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQ0MFx1MDQ0My4NCi1ndWlkZWxpbmVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYsIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzNSBcdTA0M2VcdTA0NDJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NGZcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNhIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0NDBcdTA0MzVcdTA0M2FcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzRcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguDQotcm9hZG1hcF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzZVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Zlx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjXHUwNDQzIFx1MDQzZlx1MDQ0M1x1MDQ0Mlx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0ZS4NCi1yZXVzYWJsZWFzc2V0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNlXHUwNDQyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDRmXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDNjXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDNlXHUwNDNjXHUwNDQzIFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQ0My4NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYsIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzNSBcdTA0M2VcdTA0NDJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NGZcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNhIFx1MDQ0ZFx1MDQ0Mlx1MDQzOFx1MDQzYyBcdTA0MzJcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2NcdTA0M2VcdTA0MzNcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0M2MgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDMwXHUwNDNjLg0KLXJlcG9ydF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzZVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Zlx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjXHUwNDQzIFx1MDQzZVx1MDQ0Mlx1MDQ0N1x1MDQzNVx1MDQ0Mlx1MDQ0My4NCi1wcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzZVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Zlx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDM4XHUwNDNjIFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MVx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzYyBcdTA0M2VcdTA0M2ZcdTA0NDJcdTA0MzhcdTA0M2NcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguDQotdGVtcGxhdGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYsIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzNSBcdTA0M2VcdTA0NDJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NGZcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNhIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzY1x1MDQ0MyBcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2RcdTA0NDMuDQotdGVybWRlZmluaXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYsIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzNSBcdTA0M2VcdTA0NDJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NGZcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNhIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzY1x1MDQ0MyBcdTA0M2VcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGUgXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDNjXHUwNDM4XHUwNDNkXHUwNDMwLg0KLXRvb2xtZW50b3JfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYsIFx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzNSBcdTA0M2VcdTA0NDJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NGZcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNhIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzY1x1MDQ0MyBcdTA0NDBcdTA0NDNcdTA0M2FcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDMgXHUwNDNmXHUwNDNlIFx1MDQzOFx1MDQzZFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0My4NCi13aGl0ZXBhcGVyX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDNlXHUwNDQyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDRmXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDNlXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDNjXHUwNDQzIFx1MDQzMVx1MDQ0ZVx1MDQzYlx1MDQzYlx1MDQzNVx1MDQ0Mlx1MDQzNVx1MDQzZFx1MDQ0ZS4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzZVx1MDQ0Mlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Zlx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQ0MFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0M2UgXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDNkXHUwNDNhXHUwNDM1Lg0KLQ0KLQ0KLSNOZXcgU3RyaW5nIFNlY3Rpb24gRGVzY3JpcHRpb24NCi1yb2xlX2RldGFpbFNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzOC4NCi1yb2xlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM4Lg0KLXJvbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1LCBcdTA0M2FcdTA0MzBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDMwIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQ0YyBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzAgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzZVx1MDQzOSBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGNcdTA0NGUuDQotcm9sZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM4Lg0KLQ0KLXRhc2tfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM1Lg0KLXRhc2tfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzUuDQotdGFza192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDMwIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzMCBcdTA0NDEgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDNlXHUwNDM5IFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzNVx1MDQzOS4NCi10YXNrX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlIFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzguDQotDQotYXJ0aWZhY3RfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDM1XHUwNDQ0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDM1Lg0KLWFydGlmYWN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDM1XHUwNDQ0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDM1Lg0KLWFydGlmYWN0X2ljb25TZWN0aW9uX2Rlc2M9XHUwNDFkXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzYVx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDM1XHUwNDQ0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDMwLg0KLWFydGlmYWN0X25vdGF0aW9uU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlIFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYVx1MDQzNSBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDM1XHUwNDQ0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDMwLg0KLWFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQzXHUwNDQyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDRmXHUwNDRlXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzNVx1MDQ0NFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzNS4NCi1hcnRpZmFjdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDM1XHUwNDQ0XHUwNDMwXHUwNDNhXHUwNDQyIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZCBcdTA0NDEgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDM4XHUwNDNjIFx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzNVx1MDQ0NFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQzYy4NCi1hcnRpZmFjdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDM1XHUwNDQ0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDMwLg0KLQ0KLW91dGNvbWVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDM4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM1Lg0KLW91dGNvbWVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0MzhcdTA0NDFcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzUuDQotb3V0Y29tZV9pY29uU2VjdGlvbl9kZXNjPVx1MDQxZFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzOVx1MDQ0Mlx1MDQzNSBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0M2FcdTA0MzggXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzOFx1MDQ0MVx1MDQ0NVx1MDQzZVx1MDQzNC4NCi1vdXRjb21lX25vdGF0aW9uU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlIFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYVx1MDQzNSBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDM4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDMwLg0KLW91dGNvbWVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDNcdTA0NDJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0NGZcdTA0NGVcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDM4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM1Lg0KLW91dGNvbWVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1LCBcdTA0M2FcdTA0MzBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDQyIFx1MDQzOFx1MDQ0MVx1MDQ0NVx1MDQzZVx1MDQzNCBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2QgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzYyBcdTA0MzhcdTA0NDFcdTA0NDVcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2MuDQotb3V0Y29tZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggXHUwNDM4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDMwLg0KLQ0KLWRlbGl2ZXJhYmxlX2RldGFpbFNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQzNVx1MDQ0N1x1MDQzZFx1MDQzZVx1MDQzYyBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzUuDQotZGVsaXZlcmFibGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0M2VcdTA0M2MgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDM1Lg0KLWRlbGl2ZXJhYmxlX2ljb25TZWN0aW9uX2Rlc2M9XHUwNDFkXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzYVx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQzNVx1MDQ0N1x1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzAuDQotZGVsaXZlcmFibGVfbm90YXRpb25TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2UgXHUwNDM0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNhXHUwNDM1IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwLg0KLWRlbGl2ZXJhYmxlX3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQzXHUwNDQyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDRmXHUwNDRlXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQzNVx1MDQ0N1x1MDQzZFx1MDQzZVx1MDQzYyBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzUuDQotZGVsaXZlcmFibGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1LCBcdTA0M2FcdTA0MzBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDQyIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQzNVx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDIgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkIFx1MDQ0MSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0MzhcdTA0M2MgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDNjIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQzYy4NCi1kZWxpdmVyYWJsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMC4NCi0NCi1kaXNjaXBsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZFx1MDQzNS4NCi1kaXNjaXBsaW5lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDM0XHUwNDM4XHUwNDQxXHUwNDQ2XHUwNDM4XHUwNDNmXHUwNDNiXHUwNDM4XHUwNDNkXHUwNDM1Lg0KLWRpc2NpcGxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1LCBcdTA0M2FcdTA0MzBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDMwIFx1MDQzNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZFx1MDQzMCBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzAgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzZVx1MDQzOSBcdTA0MzRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2RcdTA0M2VcdTA0MzkuDQotZGlzY2lwbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggXHUwNDM0XHUwNDM4XHUwNDQxXHUwNDQ2XHUwNDM4XHUwNDNmXHUwNDNiXHUwNDM4XHUwNDNkXHUwNDRiLg0KLQ0KLWRvbWFpbl9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0MzRcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzUuDQotZG9tYWluX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDM0XHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1Lg0KLWRvbWFpbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDM0XHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZCBcdTA0NDEgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDM4XHUwNDNjIFx1MDQzNFx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZVx1MDQzYy4NCi1kb21haW5fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IFx1MDQzNFx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzMC4NCi0NCi13b3JrcHJvZHVjdHR5cGVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDQyXHUwNDM4XHUwNDNmXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzAuDQotd29ya3Byb2R1Y3R0eXBlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDQyXHUwNDM4XHUwNDNmXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzAuDQotd29ya3Byb2R1Y3R0eXBlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSwgXHUwNDNhXHUwNDMwXHUwNDNhIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQ0MiBcdTA0NDJcdTA0MzhcdTA0M2YgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMCBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2QgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzY1x1MDQzOCBcdTA0NDJcdTA0MzhcdTA0M2ZcdTA0MzBcdTA0M2NcdTA0MzggXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMC4NCi13b3JrcHJvZHVjdHR5cGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IFx1MDQ0Mlx1MDQzOFx1MDQzZlx1MDQzMCBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwLg0KLQ0KLXJvbGVzZXRfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDM1IFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOS4NCi1yb2xlc2V0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDM1IFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOS4NCi1yb2xlc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSwgXHUwNDNhXHUwNDMwXHUwNDNhIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQ0MiBcdTA0M2RcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDAgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM1XHUwNDM5IFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZCBcdTA0NDEgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDM4XHUwNDNjIFx1MDQzZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQzYyBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkuDQotcm9sZXNldF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDMwIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOS4NCi0NCi10b29sX2RldGFpbFNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzOFx1MDQzZFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzNS4NCi10b29sX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDM1Lg0KLXRvb2xfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1LCBcdTA0M2FcdTA0MzBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDQyIFx1MDQzOFx1MDQzZFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2QgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzYyBcdTA0MzhcdTA0M2RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0M2MuDQotdG9vbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwLg0KLQ0KLWNvbmNlcHRfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ2XHUwNDM1XHUwNDNmXHUwNDQ2XHUwNDM4XHUwNDM4Lg0KLWNvbmNlcHRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDZcdTA0MzVcdTA0M2ZcdTA0NDZcdTA0MzhcdTA0MzguDQotY29uY2VwdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0MzAgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ2XHUwNDM1XHUwNDNmXHUwNDQ2XHUwNDM4XHUwNDRmIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzMCBcdTA0NDEgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0Nlx1MDQzNVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQzNVx1MDQzOS4NCi1jb25jZXB0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlIFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDZcdTA0MzVcdTA0M2ZcdTA0NDZcdTA0MzhcdTA0MzguDQotDQotY2hlY2tsaXN0X2RldGFpbFNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0NDJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0MzUuDQotY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDQxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQzNS4NCi1jaGVja2xpc3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1LCBcdTA0M2FcdTA0MzBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDMwIFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0NDJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0MzAgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDMwIFx1MDQ0MSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzkgXHUwNDQxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQzNVx1MDQzOS4NCi1jaGVja2xpc3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0NDJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0NGIuDQotDQotZXhhbXBsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0NDBcdTA0MzUuDQotZXhhbXBsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQ0MFx1MDQzNS4NCi1leGFtcGxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSwgXHUwNDNhXHUwNDMwXHUwNDNhIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQ0MiBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0NDAgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkIFx1MDQ0MSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0MzhcdTA0M2MgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDQwXHUwNDNlXHUwNDNjLg0KLWV4YW1wbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQ0MFx1MDQzMC4NCi0NCi1ndWlkZWxpbmVfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDM1IFx1MDQ0MFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOS4NCi1ndWlkZWxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0M2RcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDBcdTA0MzUgXHUwNDQwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5Lg0KLWd1aWRlbGluZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwIFx1MDQ0MFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOSBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2QgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzYyBcdTA0M2RcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDBcdTA0M2VcdTA0M2MgXHUwNDQwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5Lg0KLWd1aWRlbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDMwIFx1MDQ0MFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOS4NCi0NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0NDBcdTA0MzVcdTA0M2FcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzRcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNmXHUwNDNlIFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQzZFx1MDQzYVx1MDQzNS4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQ0MFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0M2UgXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDNkXHUwNDNhXHUwNDM1Lg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSwgXHUwNDNhXHUwNDMwXHUwNDNhIFx1MDQ0ZFx1MDQ0Mlx1MDQzMCBcdTA0NDBcdTA0MzVcdTA0M2FcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzRcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDNmXHUwNDNlIFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQzZFx1MDQzYVx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzAgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzZVx1MDQzOSBcdTA0NDBcdTA0MzVcdTA0M2FcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzRcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzVcdTA0MzkgXHUwNDNmXHUwNDNlIFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQzZFx1MDQzYVx1MDQzNS4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggXHUwNDQwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQzZSBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0M2RcdTA0M2FcdTA0MzUuDQotDQotcHJhY3RpY2VfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDNhXHUwNDQyXHUwNDM4XHUwNDNhXHUwNDM1IFx1MDQzMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1wcmFjdGljZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzOFx1MDQzYVx1MDQzNSBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuDQotcHJhY3RpY2VfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1LCBcdTA0M2FcdTA0MzBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzOFx1MDQzYVx1MDQzMCBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzAgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzZVx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0M2FcdTA0NDJcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzkgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLg0KLXByYWN0aWNlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlIFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0M2FcdTA0NDJcdTA0MzhcdTA0M2FcdTA0MzggXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLg0KLQ0KLXJlcG9ydF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0M2VcdTA0NDJcdTA0NDdcdTA0MzVcdTA0NDJcdTA0MzUuDQotcmVwb3J0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDNlXHUwNDQyXHUwNDQ3XHUwNDM1XHUwNDQyXHUwNDM1Lg0KLXJlcG9ydF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDNlXHUwNDQyXHUwNDQ3XHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZCBcdTA0NDEgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDM4XHUwNDNjIFx1MDQzZVx1MDQ0Mlx1MDQ0N1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzYy4NCi1yZXBvcnRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IFx1MDQzZVx1MDQ0Mlx1MDQ0N1x1MDQzNVx1MDQ0Mlx1MDQzMC4NCi0NCi1yZXN1YWJsZWFzc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzY1x1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQzZVx1MDQzYyBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDFcdTA0MzUuDQotcmVzdWFibGVhc3NldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzY1x1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQzZVx1MDQzYyBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDFcdTA0MzUuDQotcmVzdWFibGVhc3NldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDNjXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM5IFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MSBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2QgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzYyBcdTA0M2NcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0NGJcdTA0M2MgXHUwNDQwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNlXHUwNDNjLg0KLXJlc3VhYmxlYXNzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IFx1MDQzY1x1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDFcdTA0MzAuDQotDQotcm9hZG1hcF9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0M2ZcdTA0NDNcdTA0NDJcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0MzUuDQotcm9hZG1hcF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzZlx1MDQ0M1x1MDQ0Mlx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQzNS4NCi1yb2FkbWFwX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSwgXHUwNDNhXHUwNDMwXHUwNDNhIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQ0MiBcdTA0M2ZcdTA0NDNcdTA0NDJcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGMgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkIFx1MDQ0MSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0MzhcdTA0M2MgXHUwNDNmXHUwNDQzXHUwNDQyXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDM1XHUwNDNjLg0KLXJvYWRtYXBfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQ0M1x1MDQ0Mlx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Zi4NCi0NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDMyXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNjXHUwNDNlXHUwNDMzXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlXHUwNDNjIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzNS4NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0MzJcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2NcdTA0M2VcdTA0MzNcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0M2MgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDM1Lg0KLXN1cHBvcnRpbmdtYXRlcmlhbF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDMyXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNjXHUwNDNlXHUwNDMzXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYiBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2QgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzYyBcdTA0MzJcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2NcdTA0M2VcdTA0MzNcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0M2NcdTA0MzggXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDNjLg0KLXN1cHBvcnRpbmdtYXRlcmlhbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggXHUwNDMyXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNjXHUwNDNlXHUwNDMzXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzMC4NCi0NCi10ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2RcdTA0MzUuDQotdGVtcGxhdGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2RcdTA0MzUuDQotdGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1LCBcdTA0M2FcdTA0MzBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDQyIFx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZCBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2QgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzYyBcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2RcdTA0M2VcdTA0M2MuDQotdGVtcGxhdGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IFx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZFx1MDQzMC4NCi0NCi10ZXJtZGVmaW5pdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0M2VcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDNjXHUwNDM4XHUwNDNkXHUwNDMwLg0KLXRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDNlXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM4IFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzY1x1MDQzOFx1MDQzZFx1MDQzMC4NCi10ZXJtZGVmaW5pdGlvbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2UgXHUwNDNlXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzY1x1MDQzOFx1MDQzZFx1MDQzMCBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzYyBcdTA0M2VcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzVcdTA0M2MgXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDNjXHUwNDM4XHUwNDNkXHUwNDMwLg0KLXRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlIFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCBcdTA0M2VcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDNjXHUwNDM4XHUwNDNkXHUwNDMwLg0KLQ0KLXRvb2xtZW50b3JfZGV0YWlsU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM1IFx1MDQzZlx1MDQzZSBcdTA0MzhcdTA0M2RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NDMuDQotdG9vbG1lbnRvcl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQ0MFx1MDQ0M1x1MDQzYVx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNSBcdTA0M2ZcdTA0M2UgXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDQzLg0KLXRvb2xtZW50b3JfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1LCBcdTA0M2FcdTA0MzBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDNlIFx1MDQ0MFx1MDQ0M1x1MDQzYVx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzZSBcdTA0M2ZcdTA0M2UgXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDQzIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZSBcdTA0NDEgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDM4XHUwNDNjIFx1MDQ0MFx1MDQ0M1x1MDQzYVx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzZVx1MDQzYyBcdTA0M2ZcdTA0M2UgXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDQzLg0KLXRvb2xtZW50b3JfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlIFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCBcdTA0NDBcdTA0NDNcdTA0M2FcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzAgXHUwNDNmXHUwNDNlIFx1MDQzOFx1MDQzZFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0My4NCi0NCi13aGl0ZXBhcGVyX2RldGFpbFNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzZVx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzYyBcdTA0MzFcdTA0NGVcdTA0M2JcdTA0M2JcdTA0MzVcdTA0NDJcdTA0MzVcdTA0M2RcdTA0MzUuDQotd2hpdGVwYXBlcl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDNjIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzZVx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzYyBcdTA0MzFcdTA0NGVcdTA0M2JcdTA0M2JcdTA0MzVcdTA0NDJcdTA0MzVcdTA0M2RcdTA0MzUuDQotd2hpdGVwYXBlcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDNlXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzMVx1MDQ0ZVx1MDQzYlx1MDQzYlx1MDQzNVx1MDQ0Mlx1MDQzNVx1MDQzZFx1MDQ0YyBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2QgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzYyBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0M2VcdTA0M2RcdTA0M2RcdTA0NGJcdTA0M2MgXHUwNDMxXHUwNDRlXHUwNDNiXHUwNDNiXHUwNDM1XHUwNDQyXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNjLg0KLXdoaXRlcGFwZXJfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzZVx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0MzFcdTA0NGVcdTA0M2JcdTA0M2JcdTA0MzVcdTA0NDJcdTA0MzVcdTA0M2RcdTA0NGYuDQotDQotZGlzY2lwbGluZWdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQzNSBcdTA0MzRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2QuDQotZGlzY2lwbGluZWdyb3VwaW5nX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDM1IFx1MDQzNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZC4NCi1kaXNjaXBsaW5lZ3JvdXBpbmdfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1LCBcdTA0M2FcdTA0MzBcdTA0M2EgXHUwNDRkXHUwNDQyXHUwNDMwIFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQzMCBcdTA0MzRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2QgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDMwIFx1MDQ0MSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzkgXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDNlXHUwNDM5IFx1MDQzNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZC4NCi1kaXNjaXBsaW5lZ3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2UgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0YiBcdTA0MzRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2QuDQotDQotcm9sZXNldGdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQzNSBcdTA0M2RcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDBcdTA0M2VcdTA0MzIgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM1XHUwNDM5Lg0KLXJvbGVzZXRncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQzNSBcdTA0M2RcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDBcdTA0M2VcdTA0MzIgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM1XHUwNDM5Lg0KLXJvbGVzZXRncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0MzAgXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDMwIFx1MDQzZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQzMiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDMwIFx1MDQ0MSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzkgXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDNlXHUwNDM5IFx1MDQzZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQzMiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkuDQotcm9sZXNldGdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlIFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NGIgXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMyIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOS4NCi0NCi1jdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4Lg0KLWN1c3RvbWNhdGVnb3J5X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQzOC4NCi1jdXN0b21jYXRlZ29yeV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUsIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0NGRcdTA0NDJcdTA0MzAgXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0ZiBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzAgXHUwNDQxIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzZVx1MDQzOSBcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM1XHUwNDM5Lg0KLWN1c3RvbWNhdGVnb3J5X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNlIFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4Lg0KLWN1c3RvbWNhdGVnb3J5X0ljb25TZWN0aW9uX2Rlc2M9XHUwNDFkXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzYVx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzOSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzguDQotDQotY29uY2VwdF9pY29uU2VjdGlvbl9kZXNjPVx1MDQxZFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzOVx1MDQ0Mlx1MDQzNSBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0M2FcdTA0MzggXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0Nlx1MDQzNVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQzOC4NCi1jaGVja2xpc3RfaWNvblNlY3Rpb25fZGVzYz1cdTA0MWRcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M2VcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNhXHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDQyXHUwNDMwXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDQ2XHUwNDRiLg0KLXRvb2xtZW50b3JfaWNvblNlY3Rpb25fZGVzYz1cdTA0MWRcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M2VcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNhXHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDBcdTA0NDNcdTA0M2FcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzIgXHUwNDNmXHUwNDNlIFx1MDQzOFx1MDQzZFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0My4NCi13aGl0ZXBhcGVyX2ljb25TZWN0aW9uX2Rlc2M9XHUwNDFkXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzYVx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDNlXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzMVx1MDQ0ZVx1MDQzYlx1MDQzYlx1MDQzNVx1MDQ0Mlx1MDQzNVx1MDQzZFx1MDQ0Zi4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9pY29uU2VjdGlvbl9kZXNjPVx1MDQxZFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzOVx1MDQ0Mlx1MDQzNSBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0M2FcdTA0MzggXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0MFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0M2UgXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDNkXHUwNDNhXHUwNDM1Lg0KLXRlcm1kZWZpbml0aW9uX2ljb25TZWN0aW9uX2Rlc2M9XHUwNDFkXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzYVx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDNlXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzY1x1MDQzOFx1MDQzZFx1MDQzMC4NCi10ZW1wbGF0ZV9pY29uU2VjdGlvbl9kZXNjPVx1MDQxZFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzOVx1MDQ0Mlx1MDQzNSBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0M2FcdTA0MzggXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZFx1MDQzMC4NCi1yZXVzYWJsZWFzc2V0X2ljb25TZWN0aW9uX2Rlc2M9XHUwNDFkXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzYVx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDNjXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzMC4NCi1yZXBvcnRfaWNvblNlY3Rpb25fZGVzYz1cdTA0MWRcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M2VcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNhXHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2VcdTA0NDJcdTA0NDdcdTA0MzVcdTA0NDJcdTA0MzAuDQotcHJhY3RpY2VfaWNvblNlY3Rpb25fZGVzYz1cdTA0MWRcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M2VcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNhXHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDNhXHUwNDQyXHUwNDM4XHUwNDNhXHUwNDM4IFx1MDQzMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1leGFtcGxlX2ljb25TZWN0aW9uX2Rlc2M9XHUwNDFkXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzYVx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDQwXHUwNDMwLg0KLWd1aWRlbGluZV9pY29uU2VjdGlvbl9kZXNjPVx1MDQxZFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzOVx1MDQ0Mlx1MDQzNSBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0M2FcdTA0MzggXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0M2RcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDBcdTA0MzAgXHUwNDQwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5Lg0KLXJvYWRtYXBfaWNvblNlY3Rpb25fZGVzYz1cdTA0MWRcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M2VcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDNhXHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2ZcdTA0NDNcdTA0NDJcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGYuDQotc3VwcG9ydGluZ21hdGVyaWFsX2ljb25TZWN0aW9uX2Rlc2M9XHUwNDFkXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzYVx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDMyXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNjXHUwNDNlXHUwNDMzXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzMC4NCi0NCi1lZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY190aXRsZT1cdTA0MjRcdTA0MzBcdTA0MzlcdTA0M2IgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkDQotZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfbWVzc2FnZT1cdTA0MjRcdTA0MzBcdTA0MzlcdTA0M2IgXHUwNDMxXHUwNDRiXHUwNDNiIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZCBcdTA0MzIgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDM5IFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzY1x1MDQzNS4gXHUwNDE3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zj8NCi0NCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZT1cdTA0MTJcdTA0MzBcdTA0NDBcdTA0MzhcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NGMgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnPVx1MDQxZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiAnJ3swfScnIFx1MDQzZFx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQzMFx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQzMlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0YyBcdTA0NDEgJyd7MX0nJywgXHUwNDNmXHUwNDNlXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDQzICcnezF9JycgXHUwNDQzXHUwNDM2XHUwNDM1IFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzNVx1MDQ0MiBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQzN1x1MDQzMFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0MzRcdTA0M2VcdTA0NDdcdTA0MzVcdTA0NDBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Lg0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzE9XHUwNDFlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmICcnezB9JycgXHUwNDNkXHUwNDM1IFx1MDQzY1x1MDQzZVx1MDQzNlx1MDQzNVx1MDQ0MiBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDMwXHUwNDQwXHUwNDM4XHUwNDMwXHUwNDQyXHUwNDM4XHUwNDMyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDRjIFx1MDQ0MSBcdTA0M2ZcdTA0M2VcdTA0M2NcdTA0M2VcdTA0NDlcdTA0NGNcdTA0NGUgXHUwNDNlXHUwNDM0XHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzOFx1MDQzNyBcdTA0NDFcdTA0MzJcdTA0M2VcdTA0MzhcdTA0NDUgXHUwNDNkXHUwNDM1XHUwNDNmXHUwNDNlXHUwNDQxXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQ0NSBcdTA0M2VcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDJcdTA0M2VcdTA0MzIgXHUwNDM4IFx1MDQzYlx1MDQ0ZVx1MDQzMVx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzAuDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMj1cdTA0MWVcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgJyd7MH0nJyBcdTA0M2RcdTA0MzUgXHUwNDNjXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDQyIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0MzBcdTA0NDBcdTA0MzhcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NGMgXHUwNDQxICcnezF9JycsIFx1MDQzZlx1MDQzZVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQ0MyBcdTA0NGRcdTA0NDJcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDQyIFx1MDQzYSBcdTA0NDZcdTA0MzhcdTA0M2FcdTA0M2JcdTA0MzhcdTA0NDdcdTA0MzVcdTA0NDFcdTA0M2FcdTA0M2VcdTA0MzkgXHUwNDM3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM4Lg0KLQ0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfdGl0bGU9XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZA0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnPVx1MDQxZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiAnJ3swfScnIFx1MDQzZFx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZCBcdTA0NDEgJyd7MX0nJywgXHUwNDNmXHUwNDNlXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDQzIFx1MDQ0ZFx1MDQ0Mlx1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDNhIFx1MDQ0Nlx1MDQzOFx1MDQzYVx1MDQzYlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzOSBcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDFcdTA0MzhcdTA0M2NcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzguDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfZGVsaW1pdGVyPXwNCi1NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3Nob3dPd25lckluTGlicmFyeVZpZXc9XHUwNDFmXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQzYlx1MDQzMFx1MDQzNFx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0Nlx1MDQzMCBcdTA0M2RcdTA0MzVcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4IFx1MDQzZFx1MDQzMCBcdTA0M2ZcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2JcdTA0MzggXHUwNDExXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDMwDQotTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9yZW1vdmVVbnJlc29sdmVkUmVmZXJlbmNlPVx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2RcdTA0MzVcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDQzDQotcHJvbXB0RGVsZXRlQ3VzdG9tQ2F0ZWdvcnlCZWZvcmVSZW1vdmVMYXN0UmVmVG9JdD1cdTA0MTFcdTA0NDNcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDMwIFx1MDQzZlx1MDQzZVx1MDQ0MVx1MDQzYlx1MDQzNVx1MDQzNFx1MDQzZFx1MDQ0Zlx1MDQ0ZiBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzAgXHUwNDNkXHUwNDMwIHswfSBcdTA0MzIgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM1LiBcdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzNVx1MDQzZFx1MDQ0Yi4gXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDNiXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDRjPw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jQmVsb3cgcHJvcGVydHkgImVkaXRvcl90aXRsZV9jb2xvbl93aXRoX3NwYWNlcyIgc2hvdWxkIG5vdCBiZSB0cmFuc2xhdGVkDQotI0Rvbid0IGRlbGV0ZSBhIHNwYWNlIGFmdGVyICI6ICINCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLWVkaXRvcl90aXRsZV9jb2xvbl93aXRoX3NwYWNlcz06IA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2U4ZjAwOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uVGl0bGU9XHUwNDFlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLVByb2Nlc3NfRG9jdW1lbnRJbmZvcm1hdGlvblRpdGxlPVx1MDQyMVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2UgXHUwNDM0XHUwNDNlXHUwNDNhXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotQWN0aXZpdHlfZ3VpZGFuY2VJbmZvcm1hdGlvblRpdGxlPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLUJyZWFrZG93bkVsZW1lbnRfb3B0aW9uSW5mb3JtYXRpb25UaXRsZT1cdTA0MWZcdTA0MzBcdTA0NDBcdTA0MzBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0NDBcdTA0NGIgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDRiDQotVGFza0Rlc2NyaXB0b3Jfc3RlcEluZm9ybWF0aW9uVGl0bGU9XHUwNDI4XHUwNDMwXHUwNDMzXHUwNDM4DQotDQotVGFza0Rlc2NyaXB0b3Jfc3RlcEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0OFx1MDQzMFx1MDQzM1x1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzguDQotDQotUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2VcdTA0MzEgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDM1ICJ7MH0iLg0KLVByb2Nlc3NfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlIFx1MDQzNFx1MDQzZVx1MDQzYVx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0M2UgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDQzICJ7MH0iLg0KLQ0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzUuDQotRGVzY3JpcHRvcl9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDM1Lg0KLU1pbGVzdG9uZV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2VcdTA0MzEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0NDJcdTA0M2VcdTA0NDdcdTA0M2FcdTA0MzUuDQotTWlsZXN0b25lX2RldGFpbEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDJcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDQyXHUwNDNlXHUwNDQ3XHUwNDNhXHUwNDM1Lg0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlXHUwNDMxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDRiLg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0M1x1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0NGIuDQotRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdG9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDM1Lg0KLUFjdGl2aXR5X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZVx1MDQzMSBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Lg0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfRG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlIFx1MDQzNFx1MDQzZVx1MDQzYVx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0M2UgXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDNjXHUwNDQzIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0MyBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NDNcdTA0NDBcdTA0NGIuDQotQWN0aXZpdHlfRG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlIFx1MDQzNFx1MDQzZVx1MDQzYVx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0M2UgXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOC4NCi1EZXNjcmlwdG9yX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZSBcdTA0MzRcdTA0M2VcdTA0M2FcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNmXHUwNDNlIFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzY1x1MDQ0MyBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NDMuDQotUHJvY2Vzc19Ob25lPTw8IFx1MDQzZFx1MDQzNVx1MDQ0MiA+Pg0KLVByb2Nlc3NfbmFtZT1cdTA0MThcdTA0M2NcdTA0NGY6DQotUHJvY2Vzc19QcmVzZW50YXRpb25OYW1lPVx1MDQxOFx1MDQzY1x1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGY6DQotUHJvY2Vzc19icmllZkRlc2NyaXB0aW9uPVx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNToNCi1Qcm9jZXNzX21haW5EZXNjcmlwdGlvbj0gXHUwNDFlXHUwNDQxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNkXHUwNDNlXHUwNDM1IFx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNToNCi1Qcm9jZXNzX3B1cnBvc2U9XHUwNDFkXHUwNDMwXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1Og0KLVByb2Nlc3NfcHJlZml4PVx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQ0MToNCi0NCi1CcmVha2Rvd25FbGVtZW50X1R5cGVfTmFtZT1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDRiDQotDQotUHJvY2Vzc19UeXBlX1Rhc2s9XHUwNDE3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDMwIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMDoNCi1Qcm9jZXNzX1R5cGVfUm9sZT1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0NGMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwOg0KLVByb2Nlc3NfVHlwZV9Xb3JrUHJvZHVjdD1cdTA0MjBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMDoNCi0NCi1Xb3JrUHJvZHVjdF9UeXBlPVx1MDQyMlx1MDQzOFx1MDQzZiBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwOg0KLQ0KLUFjdGl2aXR5X01vZGVsSW5mbz1cdTA0MjFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzODoNCi1BY3Rpdml0eV9UeXBlPVx1MDQyMlx1MDQzOFx1MDQzZiBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0Mzg6DQotQWN0aXZpdHlfcHJlc2VudGF0aW9uTmFtZT1cdTA0MThcdTA0M2NcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmOg0KLUFjdGl2aXR5X2FsdGVybmF0aXZlcz1cdTA0MTBcdTA0M2JcdTA0NGNcdTA0NDJcdTA0MzVcdTA0NDBcdTA0M2RcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0NGI6DQotQWN0aXZpdHlfaG93VG9TdGFmZj1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0NDFcdTA0M2VcdTA0M2RcdTA0MzBcdTA0M2I6DQotQnJlYWtkb3duRWxlbWVudF9rZXlDb25zaWRlcmF0aW9ucz1cdTA0MWFcdTA0M2JcdTA0NGVcdTA0NDdcdTA0MzVcdTA0MzJcdTA0NGJcdTA0MzUgXHUwNDQzXHUwNDQxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDRmOg0KLVByb2Nlc3NfdXNhZ2VHdWlkYW5jZT1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNmXHUwNDNlIFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZToNCi0NCi1BY3Rpdml0eV9Sb2FkbWFwVGl0bGU9XHUwNDFmXHUwNDQzXHUwNDQyXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDM4DQotQWN0aXZpdHlfUm9hZG1hcERlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzggXHUwNDNkXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDMyIFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzNSBcdTA0M2ZcdTA0NDNcdTA0NDJcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0MzVcdTA0MzkuDQotQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlVGl0bGU9XHUwNDFlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZURlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzggXHUwNDNkXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDMyIFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzNSBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzkuDQotQWN0aXZpdHlfQ29tbXVuaWNhdGlvbk1hdGVyaWFsVGl0bGU9XHUwNDEwXHUwNDNkXHUwNDMwXHUwNDNiXHUwNDM4XHUwNDQyXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM1IFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0Yg0KLUFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzggXHUwNDNkXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDMyIFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzNSBcdTA0MzBcdTA0M2RcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0MzhcdTA0NDdcdTA0MzVcdTA0NDFcdTA0M2FcdTA0MzhcdTA0NDUgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyLg0KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsVGl0bGU9XHUwNDIzXHUwNDQ3XHUwNDM1XHUwNDMxXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQ0MVx1MDQzZVx1MDQzMVx1MDQzOFx1MDQ0Zg0KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOCBcdTA0M2RcdTA0MzAgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzIgXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDM1IFx1MDQ0M1x1MDQ0N1x1MDQzNVx1MDQzMVx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0M2ZcdTA0M2VcdTA0NDFcdTA0M2VcdTA0MzFcdTA0MzhcdTA0MzkuDQotDQotQWN0aXZpdHlfU2VsZWN0ZWRfUm9hZG1hcD1cdTA0MWZcdTA0NDNcdTA0NDJcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0Mzg6DQotQWN0aXZpdHlfU2VsZWN0ZWRfR2VuZXJhbEd1aWRhbmNlPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZjoNCi1BY3Rpdml0eV9TZWxlY3RlZF9Db21tdW5pY2F0aW9uTWF0ZXJpYWw9XHUwNDEwXHUwNDNkXHUwNDMwXHUwNDNiXHUwNDM4XHUwNDQyXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM1IFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0YjoNCi1BY3Rpdml0eV9TZWxlY3RlZF9FZHVjYXRpb25NYXRlcmlhbD1cdTA0MjNcdTA0NDdcdTA0MzVcdTA0MzFcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDQxXHUwNDNlXHUwNDMxXHUwNDM4XHUwNDRmOg0KLQ0KLUFjdGl2aXR5X0RpYWdyYW1UaXRsZT1cdTA0MTRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0MzANCi1BY3Rpdml0eV9EaWFncmFtRGVzY3JpcHRpb24gPSBcdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2VcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDJcdTA0MzAgezB9Lg0KLUFjdGl2aXR5X0FESW1hZ2U9XHUwNDE0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDMwIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOQ0KLUFjdGl2aXR5X0FEREltYWdlPVx1MDQxZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0MzAgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5DQotQWN0aXZpdHlfV1BESW1hZ2U9XHUwNDE0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzOSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwDQotQWN0aXZpdHlfVXNlQURJbWFnZT1cdTA0MWZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDQzIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOQ0KLUFjdGl2aXR5X1VzZUFEREltYWdlPVx1MDQxZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDQzIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOQ0KLUFjdGl2aXR5X1VzZVdQREltYWdlPVx1MDQxZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0NDMgXHUwNDM3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQ0NSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0M2VcdTA0MzINCi1BY3Rpdml0eV9Bc3NpZ249XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDQxXHUwNDMyXHUwNDNlXHUwNDM4XHUwNDQyXHUwNDRjLi4uDQotDQotVGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRfU3RlcHM9XHUwNDI4XHUwNDMwXHUwNDMzXHUwNDM4Og0KLVRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dUaXRsZT1cdTA0MjhcdTA0MzBcdTA0MzNcdTA0MzgNCi1UYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nTWVzc2FnZT1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQ4XHUwNDMwXHUwNDMzXHUwNDM4DQotDQotQWN0aXZpdHlfV29ya1JvbGx1cD1cdTA0MjBcdTA0MzBcdTA0MzdcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDJcdTA0NGJcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4DQotQWN0aXZpdHlfVGVhbVJvbGx1cD1cdTA0MjBcdTA0MzBcdTA0MzdcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDJcdTA0NGJcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDRiDQotQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwPVx1MDQyMFx1MDQzMFx1MDQzN1x1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Mlx1MDQ0Ylx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwDQotQWN0aXZpdHlfV29ya1JvbGx1cERlc2NyaXB0aW9uPVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDJcdTA0NGJcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Lg0KLUFjdGl2aXR5X1RlYW1Sb2xsdXBEZXNjcmlwdGlvbj1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQyXHUwNDRiXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0YiBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOC4NCi1BY3Rpdml0eV9Xb3JrUHJvZHVjdHNSb2xsdXBEZXNjcmlwdGlvbj1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQyXHUwNDRiXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzAgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fTXVsdGlwbGVPY3VycmFuY2U9XHUwNDFkXHUwNDM1XHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDNlIFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNlx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOQ0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX09wdGlvbmFsPVx1MDQxZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOQ0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1BsYW5uZWQ9XHUwNDE3XHUwNDMwXHUwNDNmXHUwNDNiXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5DQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3VwcmVzc2VkPVx1MDQyMVx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0Ylx1MDQzOQ0KLQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0V2ZW50RHJpdmVuPVx1MDQyM1x1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzYlx1MDQ0Zlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0NDFcdTA0M2VcdTA0MzFcdTA0NGJcdTA0NDJcdTA0MzhcdTA0NGZcdTA0M2NcdTA0MzgNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9PbmdvaW5nPVx1MDQxMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQ0Zlx1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzOVx1MDQ0MVx1MDQ0Zg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X1JlcGVhdGFibGU9XHUwNDFmXHUwNDNlXHUwNDMyXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRmXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM5XHUwNDQxXHUwNDRmDQotV29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3JzPVx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0OFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzOFx1MDQzYVx1MDQzODoNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5PVx1MDQxN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0YzoNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9JRF9URVhUPVx1MDQxOFx1MDQzZFx1MDQzNFx1MDQzNVx1MDQzYVx1MDQ0MQ0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX1BSRVNFTlRBVElPTl9OQU1FX1RFWFQ9XHUwNDE4XHUwNDNjXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0RFUEVOREVOQ1lfVEVYVD1cdTA0MTdcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDFcdTA0MzhcdTA0M2NcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NGMNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0FkZD1cdTA0MTRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0VkaXQ9XHUwNDE4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9SZW1vdmU9XHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM4XHUwNDQyXHUwNDRjDQotDQotV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fU1RBUlQ9XHUwNDE3XHUwNDMwXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNCBcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzBcdTA0M2JcdTA0M2VcdTA0M2MNCi1Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19GSU5JU0g9XHUwNDE3XHUwNDMwXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNCBcdTA0M2VcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzVcdTA0M2MNCi1Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX0ZJTklTSD1cdTA0MWRcdTA0MzBcdTA0NDdcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM0IFx1MDQzZVx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0N1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNVx1MDQzYw0KLVdvcmtPcmRlclR5cGVfU1RBUlRfVE9fU1RBUlQ9XHUwNDFkXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNCBcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzBcdTA0M2JcdTA0M2VcdTA0M2MNCi0NCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9TeW5jaHJvbml6ZWQ9XHUwNDIxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkIFx1MDQ0MSBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0MzhcdTA0M2FcdTA0M2VcdTA0M2MNCi0NCi1EZXNjcmlwdG9yX1JlZmluZWREZXNjcmlwdGlvbj1cdTA0MjNcdTA0NDJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0MzVcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1Og0KLQ0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0MzgNCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uRGVzY3JpcHRpb249XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDQxXHUwNDMyXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzRcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOC4NCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTE9XHUwNDFlXHUwNDQxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0YzoNCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9XHUwNDE0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQzODoNCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTM9XHUwNDFmXHUwNDNlXHUwNDNjXHUwNDNlXHUwNDQ5XHUwNDNkXHUwNDM4XHUwNDNhOg0KLQ0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9XHUwNDIwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDM4IFx1MDQzMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0NDUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDMyIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzRcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOC4NCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxPVx1MDQxZVx1MDQzMVx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzQ6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMj1cdTA0MWRcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NGZcdTA0MzdcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0Og0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTM9XHUwNDEyXHUwNDNkXHUwNDM1XHUwNDQ4XHUwNDNkXHUwNDM4XHUwNDM5IFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNDoNCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGU0PVx1MDQxMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNDoNCi0NCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uVGl0bGU9XHUwNDE3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4DQotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPVx1MDQyZFx1MDQ0Mlx1MDQzZVx1MDQ0MiBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM4IFx1MDQ0Zlx1MDQzMlx1MDQzYlx1MDQ0Zlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0MzVcdTA0M2MgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0MVx1MDQzYlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQ0NSBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0M2VcdTA0MzIgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4Lg0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMT1cdTA0MWVcdTA0NDFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjOg0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMj1cdTA0MTRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDM4Og0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMz1cdTA0MWZcdTA0M2VcdTA0M2NcdTA0M2VcdTA0NDlcdTA0M2RcdTA0MzhcdTA0M2E6DQotDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25UaXRsZT1cdTA0MjBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MmRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzOCBcdTA0M2VcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDdcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDM3XHUwNDMwIFx1MDQ0MVx1MDQzYlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGIgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDQ1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQzMiBcdTA0MzggXHUwNDM4XHUwNDQ1IFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNS4NCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxPVx1MDQxZVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0N1x1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzdcdTA0MzA6DQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMj1cdTA0MThcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDI6DQotDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0MzgNCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPVx1MDQyMVx1MDQzYlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGIgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM1XHUwNDM5IFx1MDQzZVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0N1x1MDQzMFx1MDQ0ZVx1MDQ0MiBcdTA0MzdcdTA0MzAgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzAgXHUwNDM4IFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Zlx1MDQ0ZVx1MDQ0MiBcdTA0MzVcdTA0MzNcdTA0M2UuDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMT1cdTA0MWVcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDdcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDM3XHUwNDMwOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9XHUwNDI3XHUwNDM1XHUwNDNjIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Zlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZjoNCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfVHlwZT1cdTA0MjJcdTA0MzhcdTA0M2Y6DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZT1cdTA0MjFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NGZcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNkXHUwNDMwIFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0Mzg6DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlPVx1MDQyMVx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzZVx1MDQ0Zlx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0M2RcdTA0MzAgXHUwNDMyXHUwNDRiXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM1IFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzODoNCi0NCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25UaXRsZT1cdTA0MWFcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMA0KLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvbkRlc2NyaXB0aW9uPVx1MDQyZFx1MDQ0Mlx1MDQzZVx1MDQ0MiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyIFx1MDQzMlx1MDQzYVx1MDQzYlx1MDQ0ZVx1MDQ0N1x1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M2JcdTA0MzVcdTA0MzRcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNjXHUwNDNmXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiLg0KLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfVGFibGUxPVx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwDQotDQotUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uVGl0bGU9XHUwNDEzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDRiDQotUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uRGVzY3JpcHRpb249XHUwNDE0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDQxXHUwNDMyXHUwNDNlXHUwNDM1XHUwNDNkIFx1MDQ0MVx1MDQzYlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzYyBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0MzBcdTA0M2MuDQotUm9sZURlc2NyaXB0b3JfVGVhbV9UYWJsZTE9XHUwNDEzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDRiOg0KLQ0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uVGl0bGU9XHUwNDIwXHUwNDNlXHUwNDNiXHUwNDM4DQotQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MTIgXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQ0MVx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGMgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDRmXHUwNDQyIFx1MDQ0MVx1MDQzYlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NGFcdTA0MzVcdTA0MzRcdTA0MzhcdTA0M2RcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM4Lg0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9UYWJsZTE9XHUwNDFlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzODoNCi0NCi1UZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25UaXRsZT1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0MzgNCi1UZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbj1cdTA0MTRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDMwIFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0Yi4NCi1UZWFtUHJvZmlsZV9Sb2xlX1RhYmxlMT1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0Mzg6DQotDQotUHJvY2Vzc19SaWNoVGV4dF9Db2xsYXBzZUltYWdlPWNvbGxhcHNlZC5naWYNCi1Qcm9jZXNzX1JpY2hUZXh0X0V4cGFuZEltYWdlPWV4cGFuZGVkLmdpZg0KLVByb2Nlc3NfQWRkPVx1MDQxNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0Yy4uLg0KLVByb2Nlc3NfQWRkRnJvbVByb2Nlc3M9XHUwNDE0XHUwNDNlXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQzNyBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzAuLi4NCi1Qcm9jZXNzX1JlbmFtZV9NZXNzYWdlPVx1MDQxOFx1MDQzY1x1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzAgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDM1XHUwNDQyIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzZS4gXHUwNDIxXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDNjXHUwNDNlXHUwNDM1IFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzMCBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDNlLCBcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNjIFx1MDQzZlx1MDQzMFx1MDQzZlx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzAgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDM1XHUwNDQyIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzMC4gXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDNiXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDRjPw0KLVByb2Nlc3NfUmVtb3ZlPVx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0Yw0KLVByb2Nlc3NfVXA9XHUwNDEyXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQ1DQotUHJvY2Vzc19Eb3duPVx1MDQxMlx1MDQzZFx1MDQzOFx1MDQzNw0KLVByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb249XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDNlXHUwNDQwIFx1MDQzZFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQzOFx1MDQ0NQ0KLVByb2Nlc3NfQnV0dG9uX0xpbmtNZXRob2RFbGVtZW50PVx1MDQyMVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwLi4uDQotDQotIyMgRXJyb3IvV2FybmluZw0KLVByb2Nlc3NfSW52YWxpZE5hbWVUaXRsZT1cdTA0MWRcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmDQotUHJvY2Vzc19JbnZhbGlkTmFtZT1JVVBBMDA4MUU6IFx1MDQxOFx1MDQzY1x1MDQ0ZiBcdTA0M2RcdTA0MzUgXHUwNDNjXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDQyIFx1MDQzMVx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0NGJcdTA0M2MuIFx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmLg0KLVByb2Nlc3NfUmVuYW1lX1RpdGxlPVx1MDQxZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0Yw0KLVByb2Nlc3NfSW52YWxpZFByZXNlbnRhdGlvbk5hbWU9SVVQQTAwODJFOiBcdTA0MThcdTA0M2NcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZFx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQ0Ylx1MDQzYy4gXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLg0KLVByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZT1cdTA0MjFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLVByb2Nlc3NfSW52YWxpZExpbmtNZXRob2RFbGVtZW50PUlVUEEwMDgzRTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQxICcnezB9JycsIFx1MDQzZlx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQzY1x1MDQ0MyBcdTA0NDdcdTA0NDJcdTA0M2UgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDQyIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAgXHUwNDQzXHUwNDM2XHUwNDM1IFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQ0Zlx1MDQ0MiBcdTA0MzIgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDNlXHUwNDNjIFx1MDQzNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzNSBcdTA0NDEgXHUwNDQyXHUwNDM1XHUwNDNjIFx1MDQzNlx1MDQzNSBcdTA0NDBcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0MzhcdTA0M2MgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDNjLg0KLVByb2Nlc3NfQXNzaWdubWVudEluZm9UaXRsZT1cdTA0MThcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYNCi1Qcm9jZXNzX1RlYW1Bc3NpZ25FcnJvcj1JVVBBMDA4NEU6IFx1MDQxZFx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZSBcdTA0MzRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyICcnezB9JycgXHUwNDMyIFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0MyAnJ3sxfScnIFxuXG5cdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDM0XHUwNDNlXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzMCBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzggXHUwNDMyIFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0MyBcdTA0M2RcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzhcdTA0M2NcdTA0M2UsIFx1MDQ0N1x1MDQ0Mlx1MDQzZVx1MDQzMVx1MDQ0YiBcdTA0NDEgXHUwNDNkXHUwNDM4XHUwNDNjIFx1MDQzMVx1MDQ0Ylx1MDQzYlx1MDQzMCBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzAgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDRjIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAuXG5cblx1MDQxOFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQ0Y1x1MDQ0Mlx1MDQzNSBcdTA0MzJcdTA0MzdcdTA0MzBcdTA0MzhcdTA0M2NcdTA0M2VcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0NGMgXHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUuDQotUHJvY2Vzc19UZWFtRGlhbG9nTWVzc2FnZT1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDRiDQotUHJvY2Vzc19UZWFtRGlhbG9nVGl0bGU9XHUwNDEzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDRiDQotDQotUHJvY2Vzc19EZWxpdmVyYWJsZUFzc2lnbkVycm9yPUlVUEEwMDg1RTogXHUwNDFkXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQzNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NDIgJyd7MH0nJyBcdTA0MzIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0MiAnJ3sxfScnLCBcdTA0M2ZcdTA0M2VcdTA0NDFcdTA0M2FcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2FcdTA0NDMgXHUwNDQxIFx1MDQzZFx1MDQzOFx1MDQzYyBcdTA0M2RcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDIgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMC4NCi1Qcm9jZXNzX0NvbXBvc2l0ZVJvbGVBc3NpZ25FcnJvcj1JVVBBMDA4NkU6IFx1MDQxZFx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZSBcdTA0MzRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyICcnezB9JycgXHUwNDNhIFx1MDQ0MVx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzggJyd7MX0nJywgXHUwNDNmXHUwNDNlXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDQzIFx1MDQ0MSBcdTA0M2RcdTA0MzhcdTA0M2MgXHUwNDNkXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzMCBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGMgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMC4NCi1Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlck1lc3NhZ2U9SVVQQTAwODdXOiBcdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlXHUwNDM1IFx1MDQ0N1x1MDQzOFx1MDQ0MVx1MDQzYlx1MDQzZSBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQ4XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyLg0KLVByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyVGl0bGU9XHUwNDFkXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDRiXHUwNDM5IFx1MDQzOFx1MDQzNFx1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzOFx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDhcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzVcdTA0M2RcdTA0M2RcdTA0MzhcdTA0M2FcdTA0MzANCi0NCi1Qcm9jZXNzX05vSXRlbXM9XHUwNDFkXHUwNDM1IFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQ0YiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGINCi1Qcm9jZXNzX0l0ZW1zU2VsZWN0ZWQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNlIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzZVx1MDQzMjogezB9DQotUHJvY2Vzc19Ob1Byb3BlcnRpZXNBdmFpbGFibGU9XHUwNDIxXHUwNDMyXHUwNDNlXHUwNDM5XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzZFx1MDQzNVx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzZFx1MDQ0Yg0KLQ0KLVByZWRlY2Vzc29yRGlhbG9nX1RpdGxlPVx1MDQxN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDhcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzVcdTA0M2RcdTA0M2RcdTA0MzhcdTA0M2FcdTA0MzANCi1QcmVkZWNlc3NvckRpYWxvZ19IZWFkZXJNZXNzYWdlPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDJcdTA0MzhcdTA0M2YgXHUwNDM3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDhcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzVcdTA0M2RcdTA0M2RcdTA0MzhcdTA0M2FcdTA0MzANCi1QcmVkZWNlc3NvckRpYWxvZ19JbmRleD1cdTA0MThcdTA0M2RcdTA0MzRcdTA0MzVcdTA0M2FcdTA0NDE6DQotUHJlZGVjZXNzb3JEaWFsb2dfUHJlc2VudGF0aW9uTmFtZT1cdTA0MThcdTA0M2NcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmOg0KLVByZWRlY2Vzc29yRGlhbG9nX0RlcGVuZGVuY3k9XHUwNDE3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDRjOg0KLVByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JEaWFsb2dUaXRsZT1cdTA0MWZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDhcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzVcdTA0M2RcdTA0M2RcdTA0MzhcdTA0M2ENCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yTWVzc2FnZT1JVVBBMDA4OEU6IFx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0OFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzOFx1MDQzYSBcdTA0NDEgXHUwNDQyXHUwNDMwXHUwNDNhXHUwNDM4XHUwNDNjIFx1MDQzOFx1MDQzNFx1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzOFx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQzYyBcdTA0NDNcdTA0MzZcdTA0MzUgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDM1XHUwNDQyIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzRcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0M1x1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0NGIuDQotDQotUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX3RleHRFZGl0Q2VsbF9wcm9ibGVtX21zZz1JVVBBMDA5MEU6IFx1MDQxZlx1MDQ0MFx1MDQzOCBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDQxXHUwNDMyXHUwNDNlXHUwNDM5XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzZFx1MDQzOFx1MDQzYVx1MDQzYlx1MDQzMCBcdTA0M2VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAuDQotUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX2NlbGxFZGl0b3JfaW52YWxpZFByZWRjZXNzb3JfcHJvYmxlbV9tc2c9SVVQQTAwODlXOiBcdTA0MWRcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0NGJcdTA0MzkgXHUwNDQxXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDNlXHUwNDNhIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0OFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMmEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMmEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTdjZGQ5NS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDJhPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGVlOGMwMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDJhLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGZyYWdtZW50Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjdlNTRjMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UubmwyYS5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMmEuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IG5sMmEuamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMmEvZnJhZ21lbnQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDJhL2ZyYWdtZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFhYmE1ZDMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMmEvZnJhZ21lbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZnJhZ21lbnROYW1lPUVQRiBDb21wb3NlciBBdXRob3JpbmcgVUkgKE5MMmEpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDY0NjU0YS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIGJydWdlcmdyXHUwMGU2bnNlZmxhZGUgdGlsIHJlZGlnZXJpbmcNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIENhdGVnb3J5DQotbWV0aG9kQ2F0ZWdvcnlOYW1lPU1ldG9kZQ0KLQ0KLSMgUGVyc3BlY3RpdmUNCi1hdXRob3JpbmdQZXJzcGVjdGl2ZU5hbWU9UmVkaWdlcmluZw0KLWJyb3dzaW5nUGVyc3BlY3RpdmVOYW1lPUdlbm5lbXNlDQotDQotIyBWaWV3cw0KLWxpYnJhcnlWaWV3TmFtZT1CaWJsaW90ZWsNCi1jb25maWd1cmF0aW9uVmlld05hbWU9S29uZmlndXJhdGlvbg0KLWNvbnRlbnRWaWV3TmFtZT1JbmRob2xkDQotY29uZmlndXJhdGlvbkVycm9yTG9nVmlld05hbWU9S29uZmlndXJhdGlvbnNmZWpsbG9nDQotDQotIyBFZGl0b3JzDQotbWV0aG9kRWxlbWVudEVkaXRvck5hbWU9TWV0b2RlZWxlbWVudGVkaXRvcg0KLWNvbmZpZ3VyYXRpb25FZGl0b3JOYW1lPUtvbmZpZ3VyYXRpb25zZWRpdG9yDQotcHJvY2Vzc0VkaXRvck5hbWU9UHJvY2VzZWRpdG9yDQotYWN0aXZpdHlEaWFncmFtRWRpdG9yTmFtZT1Ba3Rpdml0ZXRzZGlhZ3JhbWVkaXRvcg0KLWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvck5hbWU9RWRpdG9yIHRpbCBha3Rpdml0ZXRzb3BseXNuaW5nc2RpYWdyYW0NCi13b3JrUHJvZHVjdERlcGVkZW5jeURpYWdyYW1FZGl0b3JOYW1lPUVkaXRvciB0aWwgZGlhZ3JhbSBmb3IgYXJiZWpkc3Byb2R1a3RhZmhcdTAwZTZuZ2lnaGVkDQotDQotIyBDaGVhdCBTaGVldHMNCi1tZXRob2RBdXRob3JpbmdDaGVhdFNoZWV0c05hbWU9U255ZGVhcmsgdGlsIG1ldG9kZXJlZGlnZXJpbmcNCi1DaGVhdHNoZWV0R2V0c3RhcnRlZENhdGVnb3J5VGV4dD1Lb20gZ29kdCBpIGdhbmcNCi1DaGVhdHNoZWV0UmV1c2FibGVDb250ZW50Q2F0ZWdvcnlUZXh0PU9wcmV0IGdlbmFudmVuZGVsaWd0IG1ldG9kZWluZGhvbGQNCi1DaGVhdHNoZWV0V3JpdGVDb250ZW50Q2F0ZWdvcnlUZXh0PVNrcml2IG1ldG9kZWluZGhvbGQNCi1DaGVhdHNoZWV0UHJvY2Vzc2VzQ2F0ZWdvcnlUZXh0PUFyYmVqZCBtZWQgcHJvY2Vzc2VyDQotQ2hlYXRzaGVldE5hdmlnYXRlTWV0aG9kQ29udGVudD1OYXZpZ1x1MDBlOXIgaSBtZXRvZGVpbmRob2xkDQotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb249T3ByZXQgZGluIGVnZW4gbWV0b2Rla29uZmlndXJhdGlvbg0KLUNoZWF0c2hlZXRDcmVhdGVNZXRob2RQbHVnaW49T3ByZXQgZGluIGVnZW4gbWV0b2RlLXBsdWdpbg0KLUNoZWF0c2hlZXRBZGRNZXRob2RDb250ZW50PVRpbGZcdTAwZjhqIG55dCBtZXRvZGVpbmRob2xkLCBmLmVrcy4gcm9sbGVyLCBvcGdhdmVyLCBhcmJlamRzcHJvZHVrdGVyIGVsbGVyIHZlamxlZG5pbmcNCi1DaGVhdHNoZWV0VGFpbG9yTWV0aG9kRWxlbWVudHM9VGlscGFzIGVrc2lzdGVyZW5kZSBtZXRvZGVlbGVtZW50ZXIgKHJvbGxlciwgb3BnYXZlciwgYXJiZWpkc3Byb2R1a3RlciBlbGxlciB2ZWpsZWRuaW5nKSB2aGEuIGJpZHJhZw0KLUNoZWF0c2hlZXRSZXBsYWNlTWVodG9kRWxlbWVudHM9RXJzdGF0IGVrc2lzdGVyZW5kZSBtZXRvZGVlbGVtZW50ZXIgKHJvbGxlciwgb3BnYXZlciwgYXJiZWpkc3Byb2R1a3RlciBlbGxlciB2ZWpsZWRuaW5nKQ0KLUNoZWF0c2hlZXRBZGRNZXRob2RSZWZPckh5cGVybGluaz1UaWxmXHUwMGY4aiBtZXRvZGVyZWZlcmVuY2UgZWxsZXIgaHlwZXJsaW5rIChVUkwpDQotQ2hlYXRzaGVldEFwcGx5Q2FwYWJpbGl0eVBhdHRlcm49QW52ZW5kIGZ1bmt0aW9uc21cdTAwZjhuc3Rlcg0KLUNoZWF0c2hlZXRDcmVhdGVQcm9jZXNzPU9wcmV0IHByb2NlcyAoZnVua3Rpb25zbVx1MDBmOG5zdGVyIGVsbGVyIGxldmVyaW5nc3Byb2NlcykNCi0NCi0jIEFjdGlvbiBTZXQNCi1hdXRob3JpbmdBY3Rpb25TZXQ9UmVkaWdlcmluZw0KLWNoZWF0U2hlZXRzQWN0aW9uU2V0PVNueWRlYXJrDQotDQotIyBHbG9iYWwgQWN0aW9ucw0KLW5ld0xpYnJhcnlBY3Rpb249TWV0b2RlYmliJmxpb3Rlaw0KLW5ld0xpYnJhcnlBY3Rpb25Ub29sdGlwPU9wcmV0IGV0IG55dCBtZXRvZGViaWJsaW90ZWsNCi1uZXdQbHVnaW5BY3Rpb249TWV0b2RlLSZwbHVnaW4NCi1uZXdQbHVnaW5BY3Rpb25Ub29sdGlwPU9wcmV0IGVuIG55IG1ldG9kZS1wbHVnaW4NCi1uZXdDb25maWdBY3Rpb249TWV0b2RlJmtvbmZpZ3VyYXRpb24NCi1uZXdDb25maWdBY3Rpb25Ub29sdGlwPU9wcmV0IGVuIG55IG1ldG9kZWtvbmZpZ3VyYXRpb24NCi1vcGVuTGlicmFyeUFjdGlvbj1NZXRvZGViaWImbGlvdGVrDQotb3BlbkxpYnJhcnlBY3Rpb25Ub29sdGlwPVx1MDBjNWJuIGV0IGVrc2lzdGVyZW5kZSBtZXRvZGViaWJsaW90ZWsNCi1vcGVuQ29uZmlnQWN0aW9uPU1ldG9kZSZrb25maWd1cmF0aW9uDQotb3BlbkNvbmZpZ0FjdGlvblRvb2x0aXA9XHUwMGM1Ym4gZW4gZWtzaXN0ZXJlbmRlIG1ldG9kZWtvbmZpZ3VyYXRpb24NCi1vcGVuQ2hlYXRTaGVldHM9U255ZGVhcmsuLi4NCi0NCi0jIExpYnJhcnkgVmlldyBBY3Rpb25zDQotbGlua1dpdGhFZGl0b3I9TGluayBtZWQgZWRpdG9yDQotbGlua1dpdGhFZGl0b3JUb29sdGlwPUxpbmsgbWVkIGVkaXRvcg0KLXNob3dQcmVzZW50YXRpb25OYW1lcz1WaXMgcHJcdTAwZTZzZW50YXRpb25zbmF2bmUNCi1zaG93UHJlc2VudGF0aW9uTmFtZXNUb29sdGlwPVZpcyBwclx1MDBlNnNlbnRhdGlvbnNuYXZuZQ0KLQ0KLSMgQ29uZmlndXJhdGlvbiBWaWV3IEFjdGlvbnMNCi1yZWZyZXNoQ29uZmlnPU9wZnJpc2sNCi1yZWZyZXNoQ29uZmlnVG9vbHRpcD1PcGZyaXNrIGtvbmZpZ3VyYXRpb24NCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLW1ldGhvZEF1dGhvcmluZ1BhZ2U9TWV0b2RlcmVkaWdlcmluZw0KLXByb2Nlc3NFZGl0b3I9UHJvY2VzZWRpdG9yDQotbGlicmFyeU9wdGlvbnM9QmlibGlvdGVrc2luZHN0aWxsaW5nZXINCi1kaWFncmFtPURpYWdyYW0NCi1zdGFydHVwQW5kU2h1dGRvd249U3RhcnQgb2cgbmVkbHVrbmluZw0KLWRlYnVnPUZlamxmaW5kaW5nDQotDQotIyBDb21tYW5kIEhhbmRsZXINCi1zZWxlY3RBbGw9TWFya1x1MDBlOXIgYWxsZQ0KLQ0KLSMgUHJvcGVydGllcyBWaWV3DQotX1VJX1Byb2Nlc3NFZGl0b3JfbWVudT1Qcm9jZXMNCi1fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtPSZOeSB1bmRlcm9yZG5ldA0KLV9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbT1OJnkgc2lkZW9yZG5ldA0KLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPSZWaXMgb3ZlcnNpZ3RlbiBFZ2Vuc2thYmVyDQotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPU9wZiZyaXNrDQotX1VJX1Byb3BlcnRpZXNfR2VuZXJhbD1HZW5lcmVsdA0KLV9VSV9Qcm9wZXJ0aWVzX0RvY3VtZW50YXRpb249RG9rdW1lbnRhdGlvbg0KLV9VSV9Qcm9wZXJ0aWVzX0d1aWRhbmNlPVZlamxlZG5pbmcNCi1fVUlfUHJvcGVydGllc19Xb3JrX1JvbGx1cD1BcmJlamRza29ucy4NCi1fVUlfUHJvcGVydGllc19UZWFtX1JvbGx1cD1UZWFta29ucy4NCi0jIyBUaGUgZm9sbG93aW5nIHZhbHVlIG9mIHN0cmluZyBzaG91bGQgYmUgIldvcmsgUHJvZHVjdCBSb2xsdXAiLiBCdXQNCi0jIyBkdWUgdG8gbGltaXRhdGlvbi9idWcgaW4gRWNsaXBzZSBXVFAsIGl0J3MgYmVlbiB0cnVuY2F0ZWQgdG8gDQotIyMgIldvcmsgUHJvZCBSb2xsdXAiLiBTbyBkdXJpbmcgdHJhbnNsYXRpb24sIHBsZWFzZSB0YWtlIHRoaXMgaW50byBjb25zaWRlcmF0aW9uLg0KLV9VSV9Qcm9wZXJ0aWVzX1dQX1JvbGx1cD1BcmIucHJvZC5rb25zLg0KLV9VSV9Qcm9wZXJ0aWVzX1JvbGVzPVJvbGxlcg0KLV9VSV9Qcm9wZXJ0aWVzX1dvcmtQcm9kdWN0cz1BcmJlamRzcHJvZHVrdGVyDQotX1VJX1Byb3BlcnRpZXNfU3RlcHM9VHJpbg0KLV9VSV9Qcm9wZXJ0aWVzX1RlYW1zPVRlYW1zDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmFlMjVmNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXNfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXByZXZpb3VzX25hbWVfbnVsbDE9TmF2bmVcdTAwZTZuZHJpbmcga2FuIGlra2UgZm9ydHJ5ZGVzLCBodmlzIGRldCBmb3JyaWdlIG5hdm4gZXIgdG9tdC4NCi1lcnJfbmFtZV9lbXB0eT1OYXZuZXQgc2thbCB1ZGZ5bGRlcy4gQW5naXYgZXQgZ3lsZGlndCBuYXZuLg0KLW1vdmVBY3Rpb25fbGFiZWw9Rmx5dA0KLQ0KLUFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dD1WXHUwMGU2bGcNCi1BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3Rvb2x0aXA9Vlx1MDBlNmxnIG5vZGUgZWxsZXIgbGluaw0KLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX3RpdGxlPVRpbGZcdTAwZjhqIG5vZGUNCi1BYnN0cmFjdERpYWdyYW1fQWRkTm9kZV9lcnJfbXNnPUlYUkQwMDAyVzogTm9kZW4ga2FuIGlra2UgdGlsZlx1MDBmOGplcyB0aWwgZGlhZ3JhbQ0KLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3RleHQ9TGluaw0KLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3NlbGVjdD1WXHUwMGU2bGcgbGluaw0KLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3Rvb2x0aXA9T3ByZXQgbnl0IGxpbmsNCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3RleHQ9U3RhcnRub2RlDQotQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90b29sdGlwPU9wcmV0IG55IHN0YXJ0bm9kZQ0KLUFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90ZXh0PUZyaXRla3N0DQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXA9T3ByZXQgbnkgZnJpdGVrc3QNCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90ZXh0PVN5bmtyb25pc2VyaW5nc2xpbmplDQotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdG9vbHRpcD1PcHJldCBueSBzeW5rcm9uaXNlcmluZ3NsaW5qZQ0KLUFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdGV4dD1CZXNsdXRuaW5nc25vZGUNCi1BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXA9T3ByZXQgbnkgYmVzbHV0bmluZ3Nub2RlDQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dD1TbHV0bm9kZQ0KLUFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9wcmVmaXg9QWt0aXZpdGV0c29wbHlzbmluZzoNCi1BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90b29sdGlwPU9wcmV0IG55IHNsdXRub2RlDQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9QWt0aXZpdGV0DQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXA9T3ByZXQgbnkgYWt0aXZpdGV0DQotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0PUdlbnRhZ2Vsc2UNCi1BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3Rvb2x0aXA9T3ByZXQgbnkgZ2VudGFnZWxzZQ0KLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0PUZhc2UNCi1BY3Rpdml0eURpYWdyYW1fUGhhc2VfdG9vbHRpcD1PcHJldCBueSBmYXNlDQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQ9T3BnYXZlZGVza3JpcHRvcg0KLUFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90ZXh0PVJvbGxlZGVza3JpcHRvcg0KLVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4PURpYWdyYW0gZm9yIGFyYmVqZHNwcm9kdWt0YWZoXHUwMGU2bmdpZ2hlZDoNCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdG9vbHRpcD1PcHJldCBueSByb2xsZWRlc2tyaXB0b3INCi1BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdG9vbHRpcD1PcHJldCBueSBvcGdhdmVkZXNrcmlwdG9yDQotQWN0dml0aXZpdHlEaWFncmFtX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0PUxldmVyaW5nc3Byb2Nlcw0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0PUZ1bmt0aW9uc21cdTAwZjhuc3Rlcg0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXg9RmFzZQ0KLUFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1HZW50YWdlbHNlDQotQWN0dml0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9QWt0aXZpdGV0DQotQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0PUFyYmVqZHNwcm9kdWt0ZGVza3JpcHRvcg0KLUFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcD1PcHJldCBueSBhcmJlamRzcHJvZHVrdGRlc2tyaXB0b3INCi0NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9SnVzdFx1MDBlOXINCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1PcGZyaXNrIGZyYSBiYXNpc2FrdGl2aXRldA0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dD1Gb3JtYXRcdTAwZTlyIHRla3N0Ym9rcy4uLg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9VmFuZHJldCB0aWwgZ2VubmVtc25pdA0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9VmFuZHJldCB0aWwgZlx1MDBmOHJzdGUgdmFsZ3RlDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1Mb2RyZXQgdGlsIGdlbm5lbXNuaXQNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PUxvZHJldCB0aWwgZlx1MDBmOHJzdGUgdmFsZ3RlDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dD1HZW0NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlPUdlbW1lciB7MH0NCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw9Rmx5dCBub2RlDQotQWJzdHJhY3REaWFncmFtRWRpdG9ycmVmcmVzaGZyb21iYXNlPU9wZnJpc2sgZnJhIGJhc2lzDQotQWJzdHJhY3REaWFncmFtX0JlbmRQb2ludF9jcmVhdGU9T3ByZXQgYlx1MDBmOGpuaW5nc3B1bmt0DQotDQotQWN0aXZpdHlEaWFncmFtX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dD1cdTAwYzVibiBha3Rpdml0ZXRzb3BseXNuaW5nc2RpYWdyYW0NCi1yZWZyZXNoQWN0aW9uX2xhYmVsPU9wZnJpc2sNCi1yZWZyZXNoRnJvbUJhc2VDbWRfbGFiZWw9T3BmcmlzayBmcmEgYmFzaXMNCi1kaWFncmFtX3NhdmVFcnJvcj1JVVBEMDAwMVc6IERpYWdyYW0ga2FuIGlra2UgZ2VtbWVzDQotDQotRGVsZXRlRGlhZ3JhbV90ZXh0PVNsZXQgZGlhZ3JhbQ0KLURlbGV0ZURpYWdyYW1fcHJvbXB0PUVyIGR1IHNpa2tlciBwXHUwMGU1LCBhdCBkdSB2aWwgc2xldHRlIGRldHRlIGRpYWdyYW0/XG5cdTAwYzZuZHJpbmdlbiBlciBwZXJtYW5lbnQgb2cga2FuIGlra2UgZm9ydHJ5ZGVzLg0KLWFsaWduX2JlbmRfcG9pbnRfdGV4dD1KdXN0XHUwMGU5ciBiXHUwMGY4am5pbmdzcHVua3QNCi1Db25maWd1cmF0aW9uRWRpdG9ySW5wdXRfY29uZmlnZWRpdG9yMD1Lb25maWd1cmF0aW9uc2VkaXRvcg0KLWRpYWdyYW1fbm9kZV9wcm9wZXJ0eV92YWx1ZV9wcm9ibGVtX21zZz1GZWpsIGkgbm9kZW5zIGVnZW5za2Fic3ZcdTAwZTZyZGkuDQotZGlhZ3JhbV9lcnJvckRpYWxvZ190aXRsZV90ZXh0MD1GZWpsDQotDQotQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0PVJlc2V0IGRpYWdyYW1sYXlvdXQNCi1lcnJvckRpYWxvZ190aXRsZT1GZWpsDQotY29tbWFuZF9jYW5ub3RFZGl0PUlVUEQwMDAzRTogS2FuIGlra2UgcmVkaWdlcmUgZGlhZ3JhbQ0KLQ0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90aXRsZT1PdmVyb3JkbmV0IGVkaXRvciBsdWtrZXQNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGV4dD17MH0gZXIgbHVra2V0LiBWaWwgZHUgb2dzXHUwMGU1IGx1a2tlIHsxfT8NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXNfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MTI3ZjhmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIxNCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRm9ybSBQYWdlIFRpdGxlcw0KLWFzc2lnblBhZ2VfdGl0bGU9VGlsZGVsDQotY2F0ZWdvcmllc1BhZ2VfdGl0bGU9S2F0ZWdvcmllcg0KLWRlbGl2ZXJhYmxlUGFydHNQYWdlX3RpdGxlPUxldmVyYW5jZWRlbGUNCi1kZXNjcmlwdGlvblBhZ2VfdGl0bGU9QmVza3JpdmVsc2UNCi1kaXNjaXBsaW5lc1BhZ2VfdGl0bGU9RGlzY2lwbGluZXINCi1kaXNjYXJkdW5yZXNvbHZlZHJlZj1TbGV0IHVsXHUwMGY4c3RlIHJlZmVyZW5jZXINCi1ndWlkYW5jZVBhZ2VfdGl0bGU9VmVqbGVkbmluZw0KLXByZXZpZXdQYWdlX3RpdGxlPVJlc3VsdGF0DQotcmVmZXJlbmNlc1BhZ2VfdGl0bGU9UmVmZXJlbmNlcg0KLXJlZmVyZW5jZV90ZXh0PVJlZmVyZW5jZXI6DQotcmVmZXJlbmNlV29ya2Zsb3dQYWdlX3RpdGxlPVJlZmVyZW5jZWFyYmVqZHNnYW5nDQotcm9sZXNQYWdlX3RpdGxlPVJvbGxlcg0KLXJvbGVTZXRzUGFnZV90aXRsZT1Sb2xsZXNcdTAwZTZ0DQotc3RlcHNQYWdlX3RpdGxlPVRyaW4NCi10YXNrc1BhZ2VfdGl0bGU9T3BnYXZlcg0KLXRvb2xNZW50b3JzUGFnZV90aXRsZT1WXHUwMGU2cmt0XHUwMGY4anNtZW50b3Jlcg0KLXdvcmtQcm9kdWN0c1BhZ2VfdGl0bGU9QXJiZWpkc3Byb2R1a3Rlcg0KLQ0KLSMgU2VjdGlvbiBOYW1lcyAmIERlc2NyaXB0aW9uDQotY2hlY2tJdGVtc1NlY3Rpb25fbmFtZT1Lb250cm9sZWxlbWVudGVyDQotY2hlY2tJdGVtc1NlY3Rpb25fZGVzYz1BbmdpdiBkZSBrb250cm9sZWxlbWVudGVyLCBzb20gdWRnXHUwMGY4ciBkZW5uZSB0amVrbGlzdGUuDQotZGVwZW5kZW5jaWVzU2VjdGlvbl9uYW1lPUFmaFx1MDBlNm5naWdoZWRlcg0KLWRlcGVuZGVuY2llc1NlY3Rpb25fZGVzYz1BZnNuaXR0ZXQgdmlzZXIgZGVubmUgaW5kaG9sZHNwYWtrZXMgYWZoXHUwMGU2bmdpZ2hlZGVyIGFmIGFuZHJlIGluZGhvbGRzcGFra2VyLg0KLWRldGFpbFNlY3Rpb25fbmFtZT1EZXRhbGplcmVkZSBvcGx5c25pbmdlcg0KLWRldGFpbFNlY3Rpb25fZGVzYz1BbmdpdiBkZXRhbGplcmVkZSBvcGx5c25pbmdlciBvbSB7MH0uDQotZ2VuZXJhbEluZm9TZWN0aW9uX25hbWU9R2VuZXJlbGxlIG9wbHlzbmluZ2VyDQotZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIHswfS4NCi1pY29uU2VjdGlvbl9uYW1lPUlrb24NCi1pY29uU2VjdGlvbl9kZXNjPVRpbHBhcyBpa29uZXJuZSB0aWwgezB9Lg0KLW5vdGF0aW9uU2VjdGlvbl9uYW1lPUxldmVyYW5jZW9wbHlzbmluZ2VyDQotbm90YXRpb25TZWN0aW9uX2Rlc2M9QW5naXYgbGV2ZXJpbmdzb3BseXNuaW5nZXIgb20gezB9Lg0KLXJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9uYW1lPVJlZmVyZXJlZGUgcGx1Z2luczoNCi1yZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fZGVzYz1BZnNuaXR0ZXQgdmlzZXIgcGx1Z2lucywgc29tIGRlbm5lIG1ldG9kZS1wbHVnaW4gcmVmZXJlcmVyIHRpbC4NCi1zdGFmZmluZ1NlY3Rpb25fbmFtZT1CZW1hbmRpbmdzb3BseXNuaW5nZXINCi1zdGFmZmluZ1NlY3Rpb25fZGVzYz1BbmdpdiBiZW1hbmRpbmdzb3BseXNuaW5nZXIgb20gZGVubmUgcm9sbGUuDQotc3RlcHNTZWN0aW9uX25hbWU9VHJpbg0KLXN0ZXBzU2VjdGlvbl9kZXNjPUFuZ2l2IHRyaW5lbmUgdGlsIHVkZlx1MDBmOHJlbHNlIGFmIGRlbm5lIG9wZ2F2ZS4NCi10YWlsb3JpbmdTZWN0aW9uX25hbWU9VGlscGFzbmluZw0KLXRhaWxvcmluZ1NlY3Rpb25fZGVzYz1BbmdpdiB0aWxwYXNuaW5nc29wbHlzbmluZ2VyIG9tIHswfS4NCi12YXJpYWJpbGl0eVNlY3Rpb25fbmFtZT1JbmRob2xkc3ZhcmlhYmlsaXRldA0KLXZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRlbm5lIHswfSBlciByZWxhdGVyZXQgdGlsIGVuIGFuZGVuIHswfS4NCi12ZXJzaW9uSW5mb1NlY3Rpb25fbmFtZT1WZXJzaW9uc29wbHlzbmluZ2VyDQotdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSB7MH0uDQotDQotIyBVSSAmIEVsZW1lbnQgQXR0cmlidXRlIExhYmVscw0KLWFkZGl0aW9uYWxJbmZvX3RleHQ9RmxlcmUgb3BseXNuaW5nZXI6DQotYXBwbGljYXRpb25fdGV4dD1Qcm9ncmFtOg0KLWFjdGlvbkxhYmVsX2VkaXQ9UmVkaWdcdTAwZTlyDQotYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdj1WaXMgaSBvdmVyc2lndGVuIEJpYmxpb3Rlaw0KLWFsdGVybmF0aXZlc190ZXh0PUFsdGVybmF0aXZlcjoNCi1hc3NpZ25tZW50QXBwcm9hY2hlc190ZXh0PVRpbGRlbGluZ3NtXHUwMGU1ZGVyOg0KLWF1dGhvcnNfdGV4dD1Gb3JmYXR0ZXJlOg0KLWJhY2tncm91bmRfdGV4dD1CYWdncnVuZDoNCi1iYXNlRWxlbWVudF90ZXh0PUJhc2lzOg0KLWJhc2VHdWlkYW5jZV90ZXh0PUJhc2lzdmVqbGVkbmluZzoNCi1icmllZkRlc2NyaXB0aW9uX3RleHQ9S29ydCBiZXNrcml2ZWxzZToNCi1kZXNjcmlwdGlvbl90ZXh0PUJlc2tyaXZlbHNlOg0KLWJhY2t1cGJlZm9yZXNhdmVfdGV4dD1TaWtrZXJoZWRza29waVx1MDBlOXIgZlx1MDBmOHIgbGFncmluZw0KLWJyaWVmT3V0bGluZV90ZXh0PUtvcnQgb3ZlcnNpZ3Q6DQotY2hhbmdlRGF0ZV90ZXh0PVx1MDBjNm5kcmluZ3NkYXRvOg0KLWNoYW5nZURlc2NyaXB0aW9uX3RleHQ9XHUwMGM2bmRyaW5nc2Jlc2tyaXZlbHNlOg0KLWNoZWNrSXRlbXNfdGV4dD1Lb250cm9sZWxlbWVudGVyDQotY29udHJpYnV0ZXNfdGV4dD1CaWRyYWdlcg0KLWxvY2FsQ29udHJpYnV0ZXNfdGV4dD1Mb2thbGUgYmlkcmFnDQotY29udHJpYnV0ZXNfdG9fdGV4dD1CaWRyYWdlciB0aWwNCi1jb3B5cmlnaHRfdGV4dD1Db3B5cmlnaHQ6DQotZWRpdG9yX3RleHQ9RWRpdG9yDQotZXh0ZW5kc190ZXh0PVVkdmlkZXINCi1leHRlbmRfdGV4dD1VZHZpZA0KLWV4dGVybmFsRGVzY3JpcHRpb25fdGV4dD1Fa3N0ZXJuIGJlc2tyaXZlbHNlOg0KLWV4dGVybmFsSWRfdGV4dD1Fa3N0ZXJuIGlkOg0KLWdvYWxzX3RleHQ9TVx1MDBlNWw6DQotaW1wYWN0T2ZOb3RIYXZpbmdfdGV4dD1WaXJrbmluZyBhZiBpa2tlIGF0IGhhdmU6DQota2V5Q29uc2lkZXJhdGlvbnNfdGV4dD1OXHUwMGY4Z2xlb3ZlcnZlamVsc2VyOg0KLWxldmVsc09mQWRvcHRpb25fdGV4dD1BZG9wdGlvbnNuaXZlYXU6DQotbWFpbkRlc2NyaXB0aW9uX3RleHQ9T3Zlcm9yZG5ldCBiZXNrcml2ZWxzZToNCi1uZXdFbGVtZW50X3RleHQ9Tnl0IHswfQ0KLW5hbWVfdGV4dD1OYXZuOg0KLW5vdEFwcGxpY2FibGVfdGV4dD1Ja2tlIHJlbGV2YW50DQotcGFja2FnaW5nR3VpZGFuY2VfdGV4dD1QYWtrZXZlamxlZG5pbmc6DQotcHJlc2VudGF0aW9uTmFtZV90ZXh0PVByXHUwMGU2c2VudGF0aW9uc25hdm46DQotcHJvbXB0Zm9ybGliYXJ5X3RleHQ9U3BcdTAwZjhyZyBvbSBtZXRvZGViaWJsaW90ZWsgdmVkIHN0YXJ0DQotZW5hYmxlSGVhbHRoQ2hlY2tfdGV4dD1Ba3Rpdlx1MDBlOXIgaW50ZXJuZSBmZWpsZmluZGluZ3N2XHUwMGU2cmt0XHUwMGY4amVyDQotcHJvYmxlbV90ZXh0PVByb2JsZW06DQotcHVycG9zZV90ZXh0PUZvcm1cdTAwZTVsOg0KLXJlYXNvbkZvck5vdE5lZWRpbmdfdGV4dD1cdTAwYzVyc2FnIHRpbCBpa2tlIGF0IGJlaFx1MDBmOHZlOg0KLXJlcGxhY2VzX3RleHQ9RXJzdGF0dGVyDQotbG9jYWxSZXBsYWNlc190ZXh0PUxva2FsZSBlcnN0YXRuaW5nZXINCi1yZXByZXNlbnRhdGlvbk9wdGlvbnNfdGV4dD1JbmRzdGlsbGluZ2VyIGZvciByZXByXHUwMGU2c2VudGF0aW9uOg0KLXRlbXBsYXRlRmlsZV90ZXh0PVNrYWJlbG9uZmlsKGVyKToNCi1za2lsbHNfdGV4dD1Lb21wZXRlbmNlcjoNCi1zdGVwc190ZXh0PVRyaW46DQotc3RlcHNfbmFtZV90ZXh0PU5hdm46DQotc3RvcF90ZXh0PVN0b3ANCi1wcmludF90ZXh0PVVkc2tyaXYNCi1zeW5vbnltc190ZXh0PVN5bm9ueW1lcjoNCi10eXBlX3RleHQ9VHlwZToNCi1jb3B5X3RleHQ9S29waVx1MDBlOXINCi1kZWVwQ29weV90ZXh0PUR5YiBrb3BpZXJpbmcNCi1iYWNrX3RleHQ9VGlsYmFnZQ0KLW5ld19wbHVnaW49TnkgbWV0b2RlLXBsdWdpbg0KLW1vdmU9Rmx5dC4uLg0KLXVuaXF1ZUlkX3RleHQ9RW50eWRpZyBpZDoNCi12YXJpYWJpbGl0eVR5cGVfdGV4dD1WYXJpYWJpbGl0ZXRzdHlwZToNCi12ZXJzaW9uX3RleHQ9VmVyc2lvbjoNCi0NCi0jIEJ1dHRvbiBMYWJlbHMNCi1hZGRCdXR0b25fdGV4dD1UaWxmXHUwMGY4ai4uLg0KLWF0dGFjaEJ1dHRvbl90ZXh0PVZlZGhcdTAwZTZmdC4uLg0KLWJyb3dzZUJ1dHRvbl90ZXh0PUdlbm5lbXNlLi4uDQotY2hhbmdlVHlwZUJ1dHRvbl90ZXh0PVNraWZ0IHR5cGUuLi4NCi1jbGVhckJ1dHRvbl90ZXh0PVJ5ZA0KLWRlbGV0ZUJ1dHRvbl90ZXh0PVNsZXQNCi1kZXRhY2hCdXR0b25fdGV4dD1GcmlnXHUwMGY4cg0KLWRpYWdyYW1fc2F2ZUVycm9yPUZlamwgdW5kZXIgbGFncmluZyBhZiBkaWFncmFtDQotZG93bkJ1dHRvbl90ZXh0PU5lZA0KLWRpcmVjdG9yeV90ZXh0PUJpYmxpb3RlazoNCi1vcmRlckJ1dHRvbl90ZXh0PVJcdTAwZTZra2VmXHUwMGY4bGdlDQotZWRpdEJ1dHRvbl90ZXh0PVJlZGlnXHUwMGU5ci4uLg0KLXJlbW92ZUJ1dHRvbl90ZXh0PUZqZXJuDQotcmVuYW1lQWN0aW9uX3RleHQ9T21kXHUwMGY4Yi4uLg0KLXJlbW92ZV90ZXh0PUZqZXJuDQotcmVuYW1lX3RleHQ9T21kXHUwMGY4Yg0KLVNhdmVBc190ZXh0PUdlbSBzb20NCi1zZWxlY3RCdXR0b25fdGV4dD1WXHUwMGU2bGcuLi4NCi1kZXNlbGVjdEJ1dHRvbl90ZXh0PU9waFx1MDBlNnYgbWFya2VyaW5nDQotdXBCdXR0b25fdGV4dD1PcA0KLW1ha2VEZWZhdWx0QnV0dG9uX3RleHQ9QW5naXYgc29tIHN0YW5kYXJkDQotdmlld0hpc3RvcnlCdXR0b25fdGV4dD1WaXMgaGlzdG9yaWsuLi4NCi0NCi0jIFJvbGUgRWRpdG9yIFRhc2tzIFBhZ2UNCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25OYW1lPU9wZ2F2ZXINCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1EZW5uZSByb2xsZSB1ZGZcdTAwZjhyZXIgZlx1MDBmOGxnZW5kZSBvcGdhdmVyLg0KLXJvbGVUYXNrc1BhZ2VfYXZhaWxhYmxlTGFiZWw9VGlsZ1x1MDBlNm5nZWxpZ2Ugb3BnYXZlcg0KLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1QcmltXHUwMGU2ciB1ZGZcdTAwZjhyZW5kZToNCi1yb2xlVGFza3NQYWdlX3NlbGVjdGVkTGFiZWwyPVlkZXJsaWdlcmUgdWRmXHUwMGY4cmVuZGU6DQotcm9sZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBvcGdhdmVyIGVyIHZhbGd0Lg0KLQ0KLSMgUm9sZSBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9QXJiZWpkc3Byb2R1a3RlcjoNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QW5naXYgYXJiZWpkc3Byb2R1a3Rlciwgc29tIGRlbm5lIHJvbGxlIGVyIGFuc3ZhcmxpZyBmb3IuDQotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9VGlsZ1x1MDBlNm5nZWxpZ2UgYXJiZWpkc3Byb2R1a3RlcjoNCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPUFuc3ZhcmxpZyBmb3I6DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9QXJiZWpkc3Byb2R1a3RlciBlciBvdXRwdXQgZnJhIG9wZ2F2ZXIsIHNvbSBkZW5uZSByb2xsZSB1ZGZcdTAwZjhyZXI6DQotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gYXJiZWpkc3Byb2R1a3RlciBlciB2YWxndC4NCi0NCi0jIFJvbGUgRWRpdG9yIEd1aWRhbmNlIFBhZ2UNCi1yb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPVZlamxlZG5pbmcNCi1yb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1BbmdpdiBsaW5rIHRpbCBmbGVyZSBvcGx5c25pbmdlciBpIGZvcm0gYWYgdmVqbGVkbmluZy4NCi1yb2xlR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPVRpbGdcdTAwZTZuZ2VsaWcgdmVqbGVkbmluZzoNCi1yb2xlR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9VmVqbGVkbmluZzoNCi1yb2xlR3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHZlamxlZG5pbmdlciBlciB2YWxndC4NCi0NCi0jIFJvbGUgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQ0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1LYXRlZ29yaWVyOg0KLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZSBrYXRlZ29yaWVyLCBzb20gZGVubmUgcm9sbGUgaFx1MDBmOHJlciB0aWwuDQotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVJvbGxlc1x1MDBlNnQ6DQotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1UaWxwYXNzZWRlIGthdGVnb3JpZXI6DQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw9Um9sbGVzXHUwMGU2dDoNCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9VGlscGFzc2VkZSBrYXRlZ29yaWVyOg0KLQ0KLSMgVGFzayBFZGl0b3IgUm9sZXMgUGFnZQ0KLXRhc2tSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU9Um9sbGVyDQotdGFza1JvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249VGlsZGVsIGRlIHJvbGxlciwgc29tIHNrYWwgdWRmXHUwMGY4cmUgZGVubmUgb3BnYXZlLg0KLXRhc2tSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9VGlsZ1x1MDBlNm5nZWxpZ2Ugcm9sbGVyOg0KLXRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1QcmltXHUwMGU2ciB1ZGZcdTAwZjhyZW5kZToNCi10YXNrUm9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVlkZXJsaWdlcmUgdWRmXHUwMGY4cmVuZGU6DQotdGFza1JvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSByb2xsZXIgZXIgdmFsZ3QuDQotdGFza1JvbGVzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX21vZGlmeV9tZXNzYWdlPUlVUEEwMDA0NVc6IFZpbCBkdSBcdTAwZTZuZHJlIGRlbiBwcmltXHUwMGU2cmUgdWRmXHUwMGY4cmVuZGUgdGlsICcnezB9Jyc/DQotdGFza1JvbGVzUGFnZV9jb25maXJtX3RpdGxlPUJla3JcdTAwZTZmdCBcdTAwZTZuZHJpbmcgYWYgcHJpbVx1MDBlNnIgcm9sbGUNCi0NCi0jIFRhc2sgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPUFyYmVqZHNwcm9kdWt0ZXINCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QW5naXYgaW5wdXQtIG9nIG91dHB1dGFyYmVqZHNwcm9kdWt0ZXIgZm9yIGRlbm5lIG9wZ2F2ZS4NCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1UaWxnXHUwMGU2bmdlbGlnZSBhcmJlamRzcHJvZHVrdGVyDQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1QXHUwMGU1a3JcdTAwZTZ2ZWRlIGlucHV0Og0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyPVZhbGdmcmkgaW5wdXQ6DQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDM9T3V0cHV0Og0KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGFyYmVqZHNwcm9kdWt0ZXIgZXIgdmFsZ3QuDQotDQotIyBUYXNrIEVkaXRvciBHdWlkYW5jZSBQYWdlDQotdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1WZWpsZWRuaW5nDQotdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QW5naXYgbGluayB0aWwgZmxlcmUgb3BseXNuaW5nZXIgaSBmb3JtIGFmIHZlamxlZG5pbmcuDQotdGFza0d1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1UaWxnXHUwMGU2bmdlbGlnIHZlamxlZG5pbmc6DQotdGFza0d1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsPVZlamxlZG5pbmc6DQotdGFza0d1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSB2ZWpsZWRuaW5nZXIgZXIgdmFsZ3QuDQotDQotIyBUYXNrIEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UNCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9S2F0ZWdvcmllcg0KLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZSBrYXRlZ29yaWVyLCBzb20gZGVubmUgb3BnYXZlIGhcdTAwZjhyZXIgdGlsLg0KLXRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1EaXNjaXBsaW5lcg0KLXRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9VGlscGFzc2VkZSBrYXRlZ29yaWVyDQotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw9RGlzY2lwbGluZXI6DQotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVRpbHBhc3NlZGUga2F0ZWdvcmllcjoNCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgVGFza3MgUGFnZQ0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25OYW1lPU9wZ2F2ZXINCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uRGVzY3JpcHRpb249RGV0dGUgYXJiZWpkc3Byb2R1a3QgZXIgaW5wdXQgZWxsZXIgb3V0cHV0IGZvciBmXHUwMGY4bGdlbmRlIG9wZ2F2ZXIuDQotV29ya1Byb2R1Y3RfVGFza3NfQXZhaWxhYmxlTGFiZWw9VGlsZ1x1MDBlNm5nZWxpZ2Ugb3BnYXZlcg0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWw9UFx1MDBlNWtyXHUwMGU2dmV0IGlucHV0Og0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwyPVZhbGdmcml0IGlucHV0Og0KLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwzPU91dHB1dDoNCi1Xb3JrUHJvZHVjdF9UYXNrc19NdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBvcGdhdmVyIGVyIHZhbGd0Lg0KLQ0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBSb2xlcyBQYWdlDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU9Um9sbGVyDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUZcdTAwZjhsZ2VuZGUgcm9sbGVyIGVyIGFuc3ZhcmxpZyBmb3IgZWxsZXIgXHUwMGU2bmRyZXIgZGV0dGUgYXJiZWpkc3Byb2R1a3QuDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9VGlsZ1x1MDBlNm5nZWxpZ2Ugcm9sbGVyDQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1BbnN2YXJsaWcgcm9sbGU6DQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9XHUwMGM2bmRyZW5kZSByb2xsZXI6DQotd29ya1Byb2R1Y3RSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gcm9sbGVyIGVyIHZhbGd0Lg0KLQ0KLSMjIFdvcmsgUHJvZHVjdCBFZGl0b3IgRGVsaXZlcmFibGUgUGFydHMgUGFnZQ0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbk5hbWU9TGV2ZXJhbmNlZGVsZQ0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUFuZ2l2IGRlIGFyYmVqZHNwcm9kdWt0ZXIsIHNvbSB1ZGdcdTAwZjhyIGRlbm5lIGxldmVyYW5jZS4NCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX2F2YWlsYWJsZUxhYmVsPVRpbGdcdTAwZTZuZ2VsaWdlIGFyYmVqZHNwcm9kdWt0ZXIgc29tIGRlbGUsIGRlciBrYW4gbGV2ZXJlczoNCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlbGVjdGVkTGFiZWw9QXJiZWpkc3Byb2R1a3RlciBzb20gZGVsZSwgZGVyIGthbiBsZXZlcmVzOg0KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gYXJiZWpkc3Byb2R1a3RlciBlciB2YWxndC4NCi0NCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPVZlamxlZG5pbmcNCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QW5naXYgbGluayB0aWwgZmxlcmUgb3BseXNuaW5nZXIgaSBmb3JtIGFmIHZlamxlZG5pbmcuDQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9VGlsZ1x1MDBlNm5nZWxpZyB2ZWpsZWRuaW5nOg0KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9VmVqbGVkbmluZzoNCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSB2ZWpsZWRuaW5nZXIgZXIgdmFsZ3QuDQotDQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQ0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9S2F0ZWdvcmllcg0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUFkbWluaXN0clx1MDBlOXIgZGUga2F0ZWdvcmllciwgc29tIGRldHRlIGFyYmVqZHNwcm9kdWt0IGhcdTAwZjhyZXIgdGlsLg0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9RG9tXHUwMGU2bmVyDQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9QXJiZWpkc3Byb2R1a3R0eXBlcjoNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMz1UaWxwYXNzZWRlIGthdGVnb3JpZXI6DQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPURvbVx1MDBlNm5lOg0KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9QXJiZWpkc3Byb2R1a3R0eXBlcjoNCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwzPVRpbHBhc3NlZGUga2F0ZWdvcmllcjoNCi0NCi0jIFByYWN0aWNlIEVkaXRvciBSZWZlcmVuY2VzIFBhZ2UNCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25OYW1lPUluZGhvbGRzZWxlbWVudGVyDQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QW5naXYgZGUgaW5kaG9sZHNlbGVtZW50ZXIsIHNvbSBkZW5uZSBcdTAwZjh2ZWxzZSByZWZlcmVyZXIgdGlsLg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9VGlsZ1x1MDBlNm5nZWxpZ2UgaW5kaG9sZHNlbGVtZW50ZXI6DQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWxlY3RlZExhYmVsPUluZGhvbGRzZWxlbWVudGVyOg0KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gaW5kaG9sZHNlbGVtZW50ZXIgZXIgdmFsZ3QuDQotDQotIyBDYXRlZ29yeSBFZGl0b3IgR3VpZGFuY2UgUGFnZQ0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uTmFtZT1WZWpsZWRuaW5nDQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1BZG1pbmlzdHJcdTAwZTlyIGRlbiB2ZWpsZWRuaW5nLCBzb20gaFx1MDBmOHJlciB0aWwgZGVubmUgezB9Lg0KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9hdmFpbGFibGVMYWJlbD1UaWxnXHUwMGU2bmdlbGlnIHZlamxlZG5pbmc6DQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw9VmVqbGVkbmluZzoNCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gdmVqbGVkbmluZ2VyIGVyIHZhbGd0Lg0KLQ0KLSMgRGlzY2lwbGluZSBHcm91cGluZyBFZGl0b3IgRGlzY2lwbGluZXMgUGFnZQ0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uTmFtZT1EaXNjaXBsaW5lcg0KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZSBkaXNjaXBsaW5lciwgc29tIGhcdTAwZjhyZXIgdGlsIGRlbm5lIGRpc2NpcGxpbmdydXBwZS4NCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfYXZhaWxhYmxlTGFiZWw9VGlsZ1x1MDBlNm5nZWxpZ2UgZGlzY2lwbGluZXI6DQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw9RGlzY2lwbGluZXI6DQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGRpc2NpcGxpbmVyIGVyIHZhbGd0Lg0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfVXNlRGVmYXVsdERpcmVjdG9yeUJ1dHRvbkxhYmVsPUJydWcgc3RhbmRhcmRiaWJsaW90ZWsNCi0NCi0jIERpc2NpcGxpbmUgRWRpdG9yIFRhc2tzIFBhZ2UNCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25OYW1lPU9wZ2F2ZXINCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1BZG1pbmlzdHJcdTAwZTlyIGRlIG9wZ2F2ZXIsIHNvbSBoXHUwMGY4cmVyIHRpbCBkZW5uZSBkaXNjaXBsaW4uDQotZGlzY2lwbGluZVRhc2tzUGFnZV9hdmFpbGFibGVMYWJlbD1UaWxnXHUwMGU2bmdlbGlnZSBvcGdhdmVyOg0KLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1PcGdhdmVyOg0KLWRpc2NpcGxpbmVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gb3BnYXZlciBlciB2YWxndC4NCi0NCi0jIERpc2NpcGxpbmUgRWRpdG9yIFJlZmVyZW5jZSBXb3JrZmxvdyBQYWdlDQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uTmFtZT1SZWZlcmVuY2VhcmJlamRzZ2FuZ2UNCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1BZG1pbmlzdHJcdTAwZTlyIGRlIHJlZmVyZW5jZWFyYmVqZHNnYW5nZSwgc29tIGhcdTAwZjhyZXIgdGlsIGRlbm5lIGRpc2NpcGxpbi4NCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX2F2YWlsYWJsZUxhYmVsPVRpbGdcdTAwZTZuZ2VsaWdlIHJlZmVyZW5jZWFyYmVqZHNnYW5nZToNCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlbGVjdGVkTGFiZWw9UmVmZXJlbmNlYXJiZWpkc2dhbmdlOg0KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gcmVmZXJlbmNlYXJiZWpkc2dhbmdlIGVyIHZhbGd0Lg0KLQ0KLSMgRG9tYWluIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UNCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPUFyYmVqZHNwcm9kdWt0ZXINCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1BZG1pbmlzdHJcdTAwZTlyIGRlIGFyYmVqZHNwcm9kdWt0ZXIsIHNvbSBoXHUwMGY4cmVyIHRpbCBkZXR0ZSBkb21cdTAwZTZuZS4NCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVRpbGdcdTAwZTZuZ2VsaWdlIGFyYmVqZHNwcm9kdWt0ZXI6DQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPUFyYmVqZHNwcm9kdWt0ZXI6DQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBhcmJlamRzcHJvZHVrdGVyIGVyIHZhbGd0Lg0KLQ0KLSMgV29yayBQcm9kdWN0IEtpbmQgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQ0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9QXJiZWpkc3Byb2R1a3Rlcg0KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUFkbWluaXN0clx1MDBlOXIgZGUgYXJiZWpkc3Byb2R1a3Rlciwgc29tIGhcdTAwZjhyZXIgdGlsIGRlbm5lIGFyYmVqZHNwcm9kdWt0dHlwZS4NCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPVRpbGdcdTAwZTZuZ2VsaWdlIGFyYmVqZHNwcm9kdWt0ZXI6DQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPUFyYmVqZHNwcm9kdWt0ZXI6DQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBhcmJlamRzcHJvZHVrdGVyIGVyIHZhbGd0Lg0KLQ0KLSMgUm9sZSBTZXQgR3JvdXBpbmcgRWRpdG9yIFJvbGUgU2V0cyBQYWdlDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25OYW1lPVJvbGxlc1x1MDBlNnQNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUFkbWluaXN0clx1MDBlOXIgZGUgcm9sbGVzXHUwMGU2dCwgc29tIGhcdTAwZjhyZXIgdGlsIGRlbm5lIHJvbGxlc1x1MDBlNnRncnVwcGUuDQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX2F2YWlsYWJsZUxhYmVsPVRpbGdcdTAwZTZuZ2VsaWdlIHJvbGxlc1x1MDBlNnQ6DQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw9Um9sbGVzXHUwMGU2dDoNCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gcm9sbGVzXHUwMGU2dCBlciB2YWxndC4NCi0NCi0jIFJvbGUgU2V0IEVkaXRvciBSb2xlcyBQYWdlDQotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uTmFtZT1Sb2xsZXINCi1yb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1BZG1pbmlzdHJcdTAwZTlyIGRlIHJvbGxlciwgc29tIGhcdTAwZjhyZXIgdGlsIGRldHRlIHJvbGxlc1x1MDBlNnQuDQotcm9sZVNldFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1UaWxnXHUwMGU2bmdlbGlnZSByb2xsZXI6DQotcm9sZVNldFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVJvbGxlcjoNCi1yb2xlU2V0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHJvbGxlciBlciB2YWxndC4NCi0NCi0jIFRvb2wgRWRpdG9yIFRvb2wgTWVudG9ycyBQYWdlDQotdG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uTmFtZT1WXHUwMGU2cmt0XHUwMGY4anNtZW50b3Jlcg0KLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUFkbWluaXN0clx1MDBlOXIgZGUgdlx1MDBlNnJrdFx1MDBmOGpzbWVudG9yZXIsIHNvbSBoXHUwMGY4cmVyIHRpbCBkZXR0ZSB2XHUwMGU2cmt0XHUwMGY4ai4NCi10b29sVG9vbE1lbnRvcnNQYWdlX2F2YWlsYWJsZUxhYmVsPVRpbGdcdTAwZTZuZ2VsaWdlIHZcdTAwZTZya3RcdTAwZjhqc21lbnRvcmVyOg0KLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1WXHUwMGU2cmt0XHUwMGY4anNtZW50b3JlcjoNCi10b29sVG9vbE1lbnRvcnNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHZcdTAwZTZya3RcdTAwZjhqc21lbnRvcmVyIGVyIHZhbGd0Lg0KLQ0KLSMgQ3VzdG9tIENhdGVnb3J5IEVkaXRvciBBc3NpZ24gUGFnZQ0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uTmFtZT1JbmRob2xkc2VsZW1lbnRlcg0KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZSBpbmRob2xkc2VsZW1lbnRlciwgc29tIHVkZ1x1MDBmOHIgZGVubmUgdGlscGFzc2VkZSBrYXRlZ29yaS4NCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfYXZhaWxhYmxlTGFiZWw9VGlsZ1x1MDBlNm5nZWxpZ2UgaW5kaG9sZHNlbGVtZW50ZXI6DQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlbGVjdGVkTGFiZWw9SW5kaG9sZHNlbGVtZW50ZXI6DQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGluZGhvbGRzZWxlbWVudGVyIGVyIHZhbGd0Lg0KLQ0KLSMgTmV3IE1ldGhvZCBQbHVnLWluIFdpemFyZA0KLW5ld1BsdWdpbldpemFyZF90aXRsZT1OeSBtZXRvZGUtcGx1Z2luDQotbmV3UGx1Z2luV2l6YXJkUGFnZV90aXRsZT1PcHJldCBlbiBueSBtZXRvZGUtcGx1Z2luDQotbmV3UGx1Z2luV2l6YXJkUGFnZV90ZXh0PUFuZ2l2IGV0IG5hdm4gc2FtdCBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGVuIG55ZSBtZXRvZGUtcGx1Z2luLg0KLW5ld1BsdWdpbkVycm9yX21zZz1JVVBBMDAyMUU6IEthbiBpa2tlIG9wcmV0dGUgbWV0b2RlLXBsdWdpbidlbi4NCi1uZXdQbHVnaW5FcnJvcl9yZWFzb249SW50ZXJuIGZlamwuXG5cDQotXG5cDQotS2xpayBwXHUwMGU1IE9wbHlzbmluZ2VyIGZvciBhdCBmXHUwMGU1IGZsZXJlIG9wbHlzbmluZ2VyLg0KLQ0KLSMgR2VuZXJpYyBkaWFsb2cgdGl0bGVzDQotY3JlYXRlRGlhbG9nX3RpdGxlPU9wcmV0IGVsZW1lbnQNCi1kZWxldGVEaWFsb2dfdGl0bGU9U2xldCBlbGVtZW50DQotZWRpdERpYWxvZ190aXRsZT1SZWRpZ1x1MDBlOXIgZWxlbWVudA0KLWVycm9yRGlhbG9nX3RpdGxlPUZlamwNCi1tb3ZlRGlhbG9nX3RpdGxlPUZseXQgZWxlbWVudA0KLXJlbmFtZURpYWxvZ190aXRsZT1PbWRcdTAwZjhiIGVsZW1lbnQNCi13YXJuaW5nRGlhbG9nX3RpdGxlPUFkdmFyc2VsDQotDQotIyBBZGQgQ29uZmlndXJhdGlvbiB0byBQcm9jZXNzIEVycm9yIERpYWxvZw0KLWFkZENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPVRpbGZcdTAwZjhqIGtvbmZpZ3VyYXRpb24gdGlsIHByb2Nlcw0KLQ0KLSMgU2V0IERlZmF1bHQgQ29uZmlndXJhdGlvbiBFcnJvciBEaWFsb2cNCi1zZXREZWZhdWx0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9QW5naXYgc3RhbmRhcmRrb25maWd1cmF0aW9uIGZvciBwcm9jZXMNCi0NCi0jIEVkaXQgUHJvY2VzcyBFcnJvciBEaWFsb2cNCi1lZGl0UHJvY2Vzc0VsZW1lbnRFcnJvckRpYWxvZ190aXRsZT1SZWRpZ1x1MDBlOXIgcHJvY2VzZWxlbWVudA0KLQ0KLSMgT3BlbiBMaWJyYXJ5IERpYWxvZw0KLW9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlPVx1MDBjNWJuIG1ldG9kZWJpYmxpb3Rlaw0KLW9wZW5MaWJyYXJ5RGlhbG9nX3RleHQ9RGV0IGFrdHVlbGxlIG1ldG9kZWJpYmxpb3RlayBlciBpa2tlIGdlbXQga29ycmVrdC4gVmlsIGR1IGlnbm9yZXJlIGZlamxlbiBvZyBcdTAwZTVibmUgZXQgYW5kZXQgYmlibGlvdGVrPw0KLQ0KLSMgU2F2ZSBMaWJyYXJ5IERpYWxvZw0KLXNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlPUdlbSBtZXRvZGViaWJsaW90ZWsNCi1zYXZlTGlicmFyeURpYWxvZ190ZXh0PURldCBha3R1ZWxsZSBtZXRvZGViaWJsaW90ZWsgZXIgXHUwMGU2bmRyZXQuIFZpbCBkdSBnZW1tZSBcdTAwZTZuZHJpbmdlcm5lPw0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPU9wZ3JhZFx1MDBlOXIgbWV0b2RlYmlibGlvdGVrDQotDQotIyBEZWxldGUgRWxlbWVudCBSZWZlcmVuY2UgRGlhbG9nDQotZGVsZXRlQXNzb2NpYXRpb25EaWFsb2dfdGV4dD1FbGVtZW50ZXQgJyd7MH0nJyBlciBhbGxlcmVkZSBzbGV0dGV0LiBWaWwgZHUgZmplcm5lIGRldCBmcmEgJyd7MX0nJz8NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbm9PcGVuTGlicmFyeUVycm9yX21zZz1JVVBBMDAwMEU6IEludGV0IFx1MDBlNWJlbnQgbWV0b2RlYmlibGlvdGVrLlxuXA0KLVxuXA0KLUV0IG1ldG9kZWJpYmxpb3RlayBza2FsIHZcdTAwZTZyZSBcdTAwZTViZW50LCBmXHUwMGY4ciBldCBueXQgbWV0b2RlZWxlbWVudCBrYW4gdGlsZlx1MDBmOGplcy5cblwNCi1cblwNCi1PcHJldCBldCBueXQgbWV0b2RlYmlibGlvdGVrLCBlbGxlciBcdTAwZTVibiBldCBla3Npc3RlcmVuZGUgb2cgcHJcdTAwZjh2IGlnZW4uDQotZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZz1JVVBBMDAwMUU6IE5hdm5ldCBwXHUwMGU1IHswfSBtYW5nbGVyLlxuXA0KLVxuXA0KLUFsbGUgbWV0b2RlLSBvZyBwcm9jZXNlbGVtZW50ZXIgc2thbCBoYXZlIGV0IG5hdm4uXG5cDQotXG5cDQotS2xpayBwXHUwMGU1IE9LLCBvZyBhbmdpdiBldCBneWxkaWd0IG5hdm4gcFx1MDBlNSBlbGVtZW50ZXQuDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDJFOiBOYXZuZXQgJyd7MH0nJyBmaW5kZXMgYWxsZXJlZGUuXG5cDQotXG5cDQotRXQgbWV0b2RlZWxlbWVudCBza2FsIGhhdmUgZXQgZW50eWRpZ3QgbmF2bi5cblwNCi1cblwNCi1LbGlrIHBcdTAwZTUgT0ssIG9nIGFuZ2l2IGV0IGFuZGV0IG5hdm4gcFx1MDBlNSBlbGVtZW50ZXQuDQotY3JlYXRlQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDAzRTogTWV0b2Rla29uZmlndXJhdGlvbmVuIGthbiBpa2tlIG9wcmV0dGVzLg0KLWRlbGV0ZUNvbmZpZ0Vycm9yX21zZz1JVVBBMDAwNFc6IE1ldG9kZWtvbmZpZ3VyYXRpb25lbiBrYW4gaWtrZSBzbGV0dGVzLg0KLWludGVybmFsRXJyb3JfbXNnPUlVUEEwMDA1RTogRGVyIGVyIG9wc3RcdTAwZTVldCBlbiBpbnRlcm4gZmVqbC5cblwNCi1cblwNCi1LbGlrIHBcdTAwZTUgT3BseXNuaW5nZXIgZm9yIGF0IGZcdTAwZTUgZmxlcmUgb3BseXNuaW5nZXIuDQotaW52YWxpZFByZXNlbnRhdGlvbk5hbWVFcnJvcl9tc2c9SVVQQTAwMDZFOiBEZXQgYW5naXZuZSBwclx1MDBlNnNlbnRhdGlvbnNuYXZuIGVyIHVneWxkaWd0LlxuXA0KLVxuXA0KLUtsaWsgcFx1MDBlNSBPSywgb2cgYW5naXYgZXQgYW5kZXQgbmF2bi4NCi1pbnZhbGlkQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDA3RTogRGVuIHZhbGd0ZSBtZXRvZGVrb25maWd1cmF0aW9uICcnezB9JycgZXIgaWtrZSBldCB1ZHNuaXQgYWYgcHJvY2Vzc2VucyBzdGFuZGFyZGtvbmZpZ3VyYXRpb24uXG5cDQotXG5cDQotRW4gcHJvY2VzJycgc3RhbmRhcmRrb25maWd1cmF0aW9uIHNrYWwgdlx1MDBlNnJlIGV0IHN1cGVyc1x1MDBlNnQgYWYgYWxsZSBhbmRyZSBrb25maWd1cmF0aW9uZXIsIGRlciBlciBrbnl0dGV0IHRpbCBwcm9jZXNzZW4sIGZvciBhdCBvcHJldGhvbGRlIGludGVncml0ZXRlbiBhZiBwcm9jZXNzZW4uXG5cDQotXG5cDQotVlx1MDBlNmxnIGVuIGFuZGVuIGtvbmZpZ3VyYXRpb24sIGVsbGVyIHJldmlkXHUwMGU5ciBzdGFuZGFyZGtvbmZpZ3VyYXRpb25lbiwgc1x1MDBlNSBkZW4gb21mYXR0ZXIgaW5kaG9sZGV0IGFmIGRlbiB2YWxndGUga29uZmlndXJhdGlvbiwgb2cgcHJcdTAwZjh2IGlnZW4uDQotc2V0RGVmYXVsdENvbmZpZ0Vycm9yX21zZz1JVVBBMDAwOEU6IERlbiB2YWxndGUgbWV0b2Rla29uZmlndXJhdGlvbiAnJ3swfScnIGVyIGlra2UgZXQgc3VwZXJzXHUwMGU2dCBhZiBkZSBhbmRyZSBrb25maWd1cmF0aW9uZXIsIHNvbSBwcm9jZXNzZW4gaGVudmlzZXIgdGlsLlxuXA0KLVxuXA0KLUVuIHByb2NlcycnIHN0YW5kYXJka29uZmlndXJhdGlvbiBza2FsIHZcdTAwZTZyZSBldCBzdXBlcnNcdTAwZTZ0IGFmIGFsbGUgYW5kcmUga29uZmlndXJhdGlvbmVyLCBkZXIgZXIga255dHRldCB0aWwgcHJvY2Vzc2VuLCBmb3IgYXQgb3ByZXRob2xkZSBpbnRlZ3JpdGV0ZW4gYWYgcHJvY2Vzc2VuLlxuXA0KLVxuXA0KLVZcdTAwZTZsZyBlbiBhbmRlbiBrb25maWd1cmF0aW9uLCBlbGxlciByZXZpZFx1MDBlOXIgaW5kaG9sZGV0IGFmIGRlbiB2YWxndGUga29uZmlndXJhdGlvbiwgb2cgcHJcdTAwZjh2IGlnZW4uDQotb3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDlFOiBNZXRvZGViaWJsaW90ZWtldCBrYW4gaWtrZSBpbmRsXHUwMGU2c2VzLlxuXA0KLVxuXA0KLUtsaWsgcFx1MDBlNSBPcGx5c25pbmdlciBmb3IgYXQgZlx1MDBlNSBmbGVyZSBvcGx5c25pbmdlci4NCi1zYXZlTGlicmFyeUVycm9yX21zZz1JVVBBMDAxMEU6IE1ldG9kZWJpYmxpb3Rla2V0IGthbiBpa2tlIGdlbW1lcy4NCi1zYXZlTGlicmFyeVRvRXJyb3JfbXNnPUlVUEEwMDEwRTogTWV0b2RlYmlibGlvdGVrZXQga2FuIGlra2UgZ2VtbWVzIGkgJyd7MH0nJy4NCi1lbGVtZW50QWxyZWFkeURlbGV0ZWRFcnJvcl9tc2c9SVVQQTAwMTFFOiBFbGVtZW50ZXQgJyd7MH0nJyBlciBhbGxlcmVkZSBzbGV0dGV0Lg0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEyRTogTWV0b2RlYmlibGlvdGVrZXQga2FuIGlra2Ugb3BncmFkZXJlcy4NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249SVVQQTAwMTZFOiBEZXIgZXIgb3BzdFx1MDBlNWV0IGVuIGZlamwuXG5cDQotXG5cDQotS2xpayBwXHUwMGU1IE9wbHlzbmluZ2VyIGZvciBhdCBmXHUwMGU1IGZsZXJlIG9wbHlzbmluZ2VyLg0KLWludGVybmFsRXJyb3JfcmVhc29uPUlVUEEwMDE3RTogRGVyIGVyIG9wc3RcdTAwZTVldCBlbiBpbnRlcm4gZmVqbC5cblwNCi1cblwNCi1LbGlrIHBcdTAwZTUgT3BseXNuaW5nZXIgZm9yIGF0IGZcdTAwZTUgZmxlcmUgb3BseXNuaW5nZXIuDQotdXBncmFkZUxpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMThFOiBEZXIgZXIgb3BzdFx1MDBlNWV0IGVuIGZlamwgdW5kZXIgaW5kbFx1MDBlNnNuaW5nIGFmIG1ldG9kZWJpYmxpb3Rla3NlbGVtZW50ZXJuZS5cblwNCi1cblwNCi1LbGlrIHBcdTAwZTUgT3BseXNuaW5nZXIgZm9yIGF0IGZcdTAwZTUgZmxlcmUgb3BseXNuaW5nZXIuDQotc2F2ZVVwZ3JhZGVkTGlicmFyeUVycm9yX3JlYXNvbj1JVVBBMDAxOUU6IERlciBlciBvcHN0XHUwMGU1ZXQgZW4gZmVqbCB1bmRlciBsYWdyaW5nIGFmIGRldCBvcGdyYWRlcmVkZSBtZXRvZGViaWJsaW90ZWsuXG5cDQotXG5cDQotS2xpayBwXHUwMGU1IE9wbHlzbmluZ2VyIGZvciBhdCBmXHUwMGU1IGZsZXJlIG9wbHlzbmluZ2VyLg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1vcGVuaW5nTGlicmFyeVRhc2tfbmFtZT1cdTAwYzVibmVyIG1ldG9kZWJpYmxpb3Rlay4uLg0KLXNhdmluZ0xpYnJhcnlUYXNrX25hbWU9R2VtbWVyIG1ldG9kZWJpYmxpb3Rlay4uLg0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9T3BncmFkZXJlciBtZXRvZGViaWJsaW90ZWsuLi4NCi1sb2FkaW5nTGlicmFyeUVsZW1lbnRzVGFza19uYW1lPUluZGxcdTAwZTZzZXIgbWV0b2RlYmlibGlvdGVrc2VsZW1lbnRlci4uLg0KLXNhdmluZ1VwZ3JhZGVkRWxlbWVudHNUYXNrX25hbWU9R2VtbWVyIG1ldG9kZWJpYmxpb3Rla3NlbGVtZW50ZXIgaSBueXQgZmlsZm9ybWF0Li4uDQotc2F2aW5nVGFza19uYW1lPUdlbW1lciAnJ3swfScnLi4uDQotc2F2aW5nRmlsZXNUYXNrX25hbWU9R2VtbWVyIGZpbGVyLi4uDQotZml4aW5nQ29udGVudERlc2NyaXB0aW9uR1VJRHNUYXNrX25hbWU9UmV0dGVyIEdVSUQnZXIgbWVkIGluZGhvbGRzYmVza3JpdmVsc2UuLi4NCi1kZWxldGluZ0ludmFsaWRSZWZlcmVuY2VzVGFza19uYW1lPVNsZXR0ZXIgdWd5bGRpZ2UgcmVmZXJlbmNlci4uLg0KLQ0KLQ0KLSMgQWRkIEVkaXRvciBUbyBCcm93c2luZyBQZXJzcGVjdGl2ZSBXYXJuaW5nIERpYWxvZw0KLWFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZz1JVVBBMDA0Nlc6IFBlcnNwZWt0aXZldCBlciBzcGVjaWVsdCBkZXNpZ25ldCB0aWwgZGVuIGJlZHN0IG11bGlnZSBmcmVtdmlzbmluZyBhZiBIVE1MLXJlcHJcdTAwZTZzZW50YXRpb25lbiBhZiBtZXRvZGViaWJsaW90ZWtzZWxlbWVudGVybmUuIERldCBlciBpa2tlIG11bGlndCBhdCB0aWxmXHUwMGY4amUgZWxsZXIgdmlzZSBlbiBlZGl0b3IgaGVyLg0KLQ0KLSMgQ2hhbmdlIEhpc3RvcnkgRGlhbG9nDQotQ2hhbmdlSGlzdG9yeURpYWxvZ190aXRsZT1IaXN0b3JpayBmb3IgXHUwMGU2bmRyaW5nc2Jlc2tyaXZlbHNlDQotQ2hhbmdlSGlzdG9yeURpYWxvZ19sYWJlbD1cdTAwYzZuZHJpbmdzaGlzdG9yaWs6DQotDQotIyBNZXRob2QgRWxlbWVudCBEZWxldGUgQWN0aW9uDQotY29uZmlybURlbGV0ZURpYWxvZ190aXRsZT1CZWtyXHUwMGU2ZnQgc2xldG5pbmcNCi1jb25maXJtRGVsZXRlRGlhbG9nX21zZz1FciBkdSBzaWtrZXIgcFx1MDBlNSwgYXQgZHUgdmlsIHNsZXR0ZSAnJ3swfScnPw0KLWNvbmZpcm1EZWxldGVEaWFsb2dfbXNnV2l0aFJlZmVyZW5jZT1FciBkdSBzaWtrZXIgcFx1MDBlNSwgYXQgZHUgdmlsIHNsZXR0ZSAnJ3swfScnP1xuXA0KLVxuXA0KLUZcdTAwZjhsZ2VuZGUgZWxlbWVudChlcikgaW5kZWhvbGRlciByZWZlcmVuY2VyIHRpbCBlbGVtZW50KGVyKSwgZGVyIHNrYWwgc2xldHRlczogezF9DQotDQotIyBOZXcgTGlicmFyeSBEaWFsb2cNCi1lcnJvckRpYWxvZ19tZXNzYWdlPUlVUEEwMDIyRTogTWV0b2RlYmlibGlvdGVrZXQgJyd7MH0nJyBrYW4gaWtrZSBvcHJldHRlcy4NCi1lcnJvckRpYWxvZ19lcnJvcj1LYW4gaWtrZSBvcHJldHRlIGV0IG1ldG9kZWJpYmxpb3RlayBpbmRlIGkgZXQgYW5kZXQgbWV0b2RlYmlibGlvdGVrLg0KLWVycl9ub29wZW5saWJyYXJ5PUlVUEEwMDQwRTogSW50ZXQgXHUwMGU1YmVudCBtZXRvZGViaWJsaW90ZWsuXG5cDQotXG5cDQotRXQgbWV0b2RlYmlibGlvdGVrIHNrYWwgdlx1MDBlNnJlIFx1MDBlNWJlbnQsIGZcdTAwZjhyIGVuIG55IG1ldG9kZS1wbHVnaW4ga2FuIHRpbGZcdTAwZjhqZXMuXG5cDQotXG5cDQotT3ByZXQgZXQgbnl0IG1ldG9kZWJpYmxpb3RlaywgZWxsZXIgXHUwMGU1Ym4gZXQgZWtzaXN0ZXJlbmRlIG9nIHByXHUwMGY4diBpZ2VuLg0KLWVycl9sb2FkaW5nbGlicmFyeT1GZWpsIHVuZGVyIGluZGxcdTAwZTZzbmluZyBhZiBiaWJsaW90ZWsNCi1tc2dfcmVsb2FkTGlicmFyeT1GZWpsIHVuZGVyIGZvcnRyeWRlbHNlIGFmIGRlbiBtaXNseWtrZWRlIHNsZXRuaW5nLiBEZXQgYWt0dWVsbGUgbWV0b2RlYmlibGlvdGVrIHNrYWwgZ2VuaW5kbFx1MDBlNnNlcy4NCi0NCi0jIFJlbG9hZCBMaWJyYXJ5IERpYWxvZw0KLXJlbG9hZERpYWxvZ19tZXNzYWdlPUJpYmxpb3Rla2V0IHNrYWwgZ2VuaW5kbFx1MDBlNnNlcyBmb3IgYXQgZ2VuZGFubmUgZGV0cyBvcHJpbmRlbGlnZSB0aWxzdGFuZC4NCi1yZWxvYWREaWFsb2dfdGl0bGU9R2VuaW5kbFx1MDBlNnMgYmlibGlvdGVrDQotZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yVGl0bGU9RmVqbCB1bmRlciBmbHl0bmluZw0KLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvck1lc3NhZ2U9RmVqbCB1bmRlciBmbHl0bmluZw0KLQ0KLSMgUHJvY2VzcyBGb3JtIEVkaXRvcg0KLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ190aXRsZT1HZW0NCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTE9RGVubmUgXHUwMGU2bmRyaW5nIHBcdTAwZTV2aXJrZXIgYWxsZSBkaWFncmFtbWVyIGkgcHJvY2Vzc2VuLiBFZGl0b3JlbiBibGl2ZXIgZ2VtdCBlZnRlciBkaW4gXHUwMGU2bmRyaW5nLiBWaWwgZHUgZm9ydHNcdTAwZTZ0dGU/DQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UyPUVkaXRvcmVuIGJsaXZlciBnZW10IGVmdGVyIGRpbiBcdTAwZTZuZHJpbmcuIFZpbCBkdSBmb3J0c1x1MDBlNnR0ZT8NCi0NCi0jIENvbmZpZ3VyYXRpb24gVmlldyBQYWdlDQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX3RpdGxlPUJla3JcdTAwZTZmdCBzbGV0bmluZw0KLWNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ19tZXNzYWdlPUVyIGR1IHNpa2tlciBwXHUwMGU1LCBhdCBkdSB2aWwgZmplcm5lIG92ZXJzaWd0ZW4gJyd7MH0nJz8NCi1jb25maWdWaWV3UGFnZVZpZXdFeGlzdHNEaWFsb2dfdGl0bGU9QWR2YXJzZWwNCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uPUtvbmZpZ3VyYXRpb246DQotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdzPUtvbmZpZ3VyYXRpb25zb3ZlcnNpZ3Rlcg0KLWNvbmZpZ1ZpZXdQYWdlX3ZpZXdzPU92ZXJzaWd0ZXINCi1jb2x1bW5zZWxlY3Rpb25fdGV4dD1Lb2xvbm5ldmFsZzoNCi1jb25maWdWaWV3UGFnZV9hZGRWaWV3QnV0dG9uVGV4dD1UaWxmXHUwMGY4aiBvdmVyc2lndC4uLg0KLWNvbmZpZ1ZpZXdQYWdlX3JlbW92ZVZpZXdCdXR0b25UZXh0PUZqZXJuIG92ZXJzaWd0DQotY29uZmlnVmlld1BhZ2VfbWFrZURlZmF1bHRCdXR0b25UZXh0PUFuZ2l2IHNvbSBzdGFuZGFyZA0KLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ19tZXNzYWdlPUlVUEEwMDIzVzogT3ZlcnNpZ3RlbiAnJ3swfScnIGZpbmRlcyBhbGxlcmVkZS4NCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25UaXRsZT1QdWJsaWNlcmVkZSBuYXZpZ2F0aW9uc292ZXJzaWd0ZXINCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25NZXNzYWdlPUFuZ2l2IGRlIG92ZXJzaWd0ZXIsIHNvbSBpbmtsdWRlcmVzLCBuXHUwMGU1ciBkZW5uZSBrb25maWd1cmF0aW9uIHB1YmxpY2VyZXMuIER1IG9wcmV0dGVyIGVuIG92ZXJzaWd0IHZlZCBhdCBrbGlra2UgcFx1MDBlNSBUaWxmXHUwMGY4aiBvdmVyc2lndCBvZyB2XHUwMGU2bGdlIGVuIHN0YW5kYXJkIGVsbGVyIHRpbHBhc3NldCBrYXRlZ29yaSBpIGtvbmZpZ3VyYXRpb25lbi4gRGVuIHZhbGd0ZSBrYXRlZ29yaSByZXByXHUwMGU2c2VudGVyZXIgb3ZlcnNpZ3Rlbiwgb2cga2F0ZWdvcmllbnMgdW5kZXJrYXRlZ29yaWVyIG9nIGluZGhvbGRzZWxlbWVudGVyIHJlcHJcdTAwZTZzZW50ZXJlciBvdmVyc2lndGVucyB0clx1MDBlNnN0cnVrdHVyZWxlbWVudGVyLg0KLQ0KLSMgRGVzY3JpcHRpb24gVGFiDQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfdGl0bGU9S29udmVydFx1MDBlOXIgdmVqbGVkbmluZw0KLWRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UxPUlVUEEwMDQwVzogR2VtIGVkaXRvcmVuIGZcdTAwZjhyc3QuDQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTI9RGVyIGVyIGluZ2VuIGtvbXBhdGliZWwgdmVqbGVkbmluZyBmb3IgZGVubmUgdHlwZS4NCi0NCi1jaGFuZ2VBY3Rpdml0eVR5cGVXYXJuaW5nRGlhbG9nX3RpdGxlPUtvbnZlcnRcdTAwZTlyIGFrdGl2aXRldA0KLSMgQXNzb2NpYXRpb24gRm9ybSBQYWdlDQotQXNzb2NpYXRpb25Gb3JtUGFnZV9CcmllZkRlc2NyaXB0aW9uTGFiZWw9S29ydCBiZXNrcml2ZWxzZSBhZiB2YWxndCBlbGVtZW50Og0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgRGVzY3JpcHRpb24NCi1tZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfdGl0bGU9QW5naXYgZWxlbWVudG5hdm4NCi1tZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfbWVzc2FnZT1OYXZuZWZlbHRldCBtXHUwMGU1IGlra2Ugdlx1MDBlNnJlIHRvbXQuDQotDQotIyBNZXRob2QgUGx1Zy1pbiBEZXNjcmlwdGlvbg0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUmVtb3ZlUmVmQ29uZmlybV9tZXNzYWdlPUh2aXMgZHUgZnJhdlx1MDBlNmxnZXIgZGVuIGVsbGVyIGRlIHJlZmVyZXJlZGUgcGx1Z2lucywgZGVyIGVyIGtueXR0ZXQgdGlsIHBsdWdpbicnZW4gJyd7MH0nJywgb3BzdFx1MDBlNXIgZGVyIHVneWxkaWdlIHJlbGF0aW9uZXIsIHNvbSB2aWwgYmxpdmUgc2xldHRldC5cblwNCi1cblwNCi1EZW5uZSBmdW5rdGlvbiBrYW4gaWtrZSBmb3J0cnlkZXMuIFZpbCBkdSBmb3JldGFnZSBkZW5uZSBcdTAwZTZuZHJpbmc/DQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWU9RHUgZXIgdmVkIGF0IFx1MDBlNm5kcmUgbmF2biBwXHUwMGU1IGRlbm5lIG1ldG9kZS1wbHVnaW4gZnJhICcnezB9JycgdGlsIGRldCBueWUgbmF2biAnJ3sxfScnLiBEZW5uZSBmdW5rdGlvbiBnZW1tZXIgZWRpdG9yZW4gb2cgb21kXHUwMGY4YmVyIHBsdWdpbi1mb2xkZXJlbiB0aWwgZGV0IG55ZSBuYXZuLiBWaWwgZHUgZm9ydHNcdTAwZTZ0dGU/DQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWVfdGl0bGU9T21kXHUwMGY4YiBtZXRvZGUtcGx1Z2luDQotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2Nhbm5vdFJlbmFtZVBsdWdpbkZvbGRlcj1LYW4gaWtrZSBvbWRcdTAwZjhiZSBwbHVnaW4tZm9sZGVyIHRpbCBkZXQgbnllIG5hdm4NCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbkxhYmVsPUxcdTAwZTVzIHBsdWdpbg0KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luX21lc3NhZ2U9TFx1MDBlNXNuaW5nIGFmIHBsdWdpbi1cdTAwZTZuZHJpbmcgZ2VtbWVyIG9nIGx1a2tlciBcdTAwZTVibmUgZWRpdG9yZXIgdGlsIGVsZW1lbnRlciwgc29tIGhcdTAwZjhyZXIgdGlsIHBsdWdpbicnZW4gJyd7MH0nJy4gVmlsIGR1IGZvcmV0YWdlIGRlbm5lIFx1MDBlNm5kcmluZz8NCi0NCi0jIFByb2Nlc3MgRGVzY3JpcHRpb24NCi1wcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV90aXRsZT1PbWRcdTAwZjhiDQotcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fbWVzc2FnZT1EdSBlciB2ZWQgYXQgXHUwMGU2bmRyZSBuYXZuZXQgcFx1MDBlNSBwcm9jZXNzZW4uIERlbm5lIGZ1bmt0aW9uIGdlbW1lciBlZGl0b3JlbiBvZyBvbWRcdTAwZjhiZXIgcHJvY2VzZm9sZGVyZW4gdGlsIGRldCBueWUgbmF2bi4gVmlsIGR1IGZvcnRzXHUwMGU2dHRlPw0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uRGVzY3JpcHRpb249QmVza3JpdmVsc2U6DQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uVGl0bGU9S29uZmlndXJhdGlvbg0KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uU2VjdGlvbk1lc3NhZ2U9QW5naXYgYWxsZSBneWxkaWdlIGtvbmZpZ3VyYXRpb25lciBmb3IgZGVubmUgcHJvY2VzLiBWXHUwMGU2bGcgXHUwMGU5biBrb25maWd1cmF0aW9uIHNvbSBzdGFuZGFyZC4gRGVuIHNrYWwgdlx1MDBlNnJlIGV0IHN1cGVyc1x1MDBlNnQgYWYgYWxsZSBkZSBhbmRyZSBrb25maWd1cmF0aW9uZXIuDQotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25zPUtvbmZpZ3VyYXRpb25lcjoNCi1wcm9jZXNzRGVzY3JpcHRpb25fZGVmYXVsdD0oc3RhbmRhcmQpDQotUHJvY2Vzc0Rlc2NyaXB0aW9uX3NlbGVjdENvbmZpZ3VyYXRpb249Vlx1MDBlNmxnIGtvbmZpZ3VyYXRpb25lciwgZGVyIHNrYWwgdGlsZlx1MDBmOGplcw0KLVByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQwPURlbm5lIGZ1bmt0aW9uIGdlbW1lciBkZW4gYWt0dWVsbGUgZWRpdG9yLCBvZyBcdTAwZTZuZHJpbmdlbiB2aWwgdlx1MDBlNnJlIHBlcm1hbmVudC4gRXIgZHUgc2lra2VyIHBcdTAwZTUsIGF0IGR1IHZpbCBzbGV0dGUgJyd7MH0nJz8NCi1Qcm9jZXNzRGVsZXRlQWN0aW9uX3NlbGVjdERlc2NyaXB0b3JzVG9EZWxldGU9Rlx1MDBmOGxnZW5kZSBkZXNrcmlwdG9yZXIgYnJ1Z2VzIGluZ2VuIHN0ZWRlciBlZnRlciBzbGV0bmluZyBhZiBkZSB2YWxndGUgZWxlbWVudGVyLlxuXA0KLVZcdTAwZTZsZyBkZSBkZXNrcmlwdG9yLCBkdSB2aWwgc2xldHRlLg0KLQ0KLSMgVmlldyBIZWxwZXINCi12aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfdGl0bGU9SGVsYnJlZHN1bmRlcnNcdTAwZjhnZWxzZSBhZiBiaWJsaW90ZWsNCi12aWV3SGVscGVyX3BlcmZvcm1IZWFsdGhDaGVjaz1VZGZcdTAwZjhyZXIgaGVsYnJlZHN1bmRlcnNcdTAwZjhnZWxzZSBhZiBiaWJsaW90ZWsuLi4NCi12aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfbWVzc2FnZT1IZWxicmVkc3VuZGVyc1x1MDBmOGdlbHNlbiBhZiBcdTAwZTViZW50IGJpYmxpb3RlayBlciBhZnNsdXR0ZXQuIFJhcHBvcnRlbiBmaW5kZXMgaSBsb2dmaWxlbi4NCi0NCi0jIEF0dGFjaCBUZW1wbGF0ZSBGaWxlIERpYWxvZw0KLWF0dGFjaFRlbXBsYXRlRmlsZURpYWxvZ190aXRsZT1WZWRoXHUwMGU2ZnQgc2thYmVsb25maWwNCi0NCi0jIENyZWF0ZSBFbGVtZW50IEVycm9yIERpYWxvZw0KLWNyZWF0ZUVsZW1lbnREaWFsb2dfdGl0bGU9T3ByZXQgbnl0IHswfQ0KLWNyZWF0ZU5ld0VsZW1lbnRFcnJvcl9tc2c9RmVqbCB1bmRlciBvcHJldHRlbHNlIGFmIG55dCB7MH0uDQotDQotZGxnVGl0bGVfcmVsb2FkTGlicmFyeT1HZW5pbmRsXHUwMGU2cyBiaWJsaW90ZWsNCi1jcmVhdGVFbGVtZW50RXJyb3JfcmVhc29uPU5hdm5ldCBwXHUwMGU1IHswfSBza2FsIHVkZnlsZGVzLlxuXA0KLVxuXA0KLUFuZ2l2IGV0IGd5bGRpZ3QgbmF2biwgb2cgcHJcdTAwZjh2IGlnZW4uDQotZGVsZXRlQ29uZmlnRXJyb3JfcmVhc29uPVByb2Nlc3NlbiAnJ3swfScnIHJlZmVyZXJlciB0aWwga29uZmlndXJhdGlvbmVuDQotDQotIyBDaGFuZ2VCb3VuZHNDb21tYW5kDQotZ2VmX2NoYW5nZUJvdW5kc0NvbW1hbmRfbGFiZWw9UmV2aWRcdTAwZTlyIGdyXHUwMGU2bnNlcg0KLSMgQ2hhbmdlTmFtZUNvbW1hbmQNCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfbGFiZWw9UmV2aWRcdTAwZTlyIG5hdm4NCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfdW5kb01lc3NhZ2U9S2FuIGlra2UgZm9ydHJ5ZGUgbmF2bmVcdTAwZTZuZHJpbmdlbi5cblwNCi1cblwNCi1OYXZuZVx1MDBlNm5kcmluZyBrYW4gaWtrZSBmb3J0cnlkZXMsIGh2aXMgZGV0IGZvcnJpZ2UgbmF2biBlciB0b210Lg0KLSMgQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQNCi1nZWZfY2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmRfbGFiZWw9UmV2aWRcdTAwZTlyIGVnZW5za2Fic3ZcdTAwZTZyZGkNCi0jIENyZWF0ZUJlbmRwb2ludENvbW1hbmQNCi1nZWZfY3JlYXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1PcHJldCBiXHUwMGY4am5pbmdzcHVua3QNCi0jIENyZWF0ZUxpbmtDb21tYW5kDQotZ2VmX2NyZWF0ZUxpbmtDb21tYW5kX2xhYmVsPUxpbmtvcHJldHRlbHNlDQotIyBDcmVhdGVOb2RlQ29tbWFuZA0KLWdlZl9jcmVhdGVOb2RlQ29tbWFuZF9sYWJlbD1PcHJldCBueSBub2RlDQotIyBEZWxldGVCZW5kcG9pbnRDb21tYW5kDQotZ2VmX2RlbGV0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9U2xldCBiXHUwMGY4am5pbmdzcHVua3QNCi0jIERlbGV0ZUNvbW1hbmQNCi1nZWZfZGVsZXRlQ29tbWFuZF9sYWJlbD1TbGV0DQotIyBEZWxldGVMaW5rQ29tbWFuZA0KLWdlZl9kZWxldGVMaW5rQ29tbWFuZF9sYWJlbD1TbGV0IGZvcmJpbmRlbHNlDQotIyBNb3ZlQmVuZHBvaW50Q29tbWFuZA0KLWdlZl9tb3ZlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1GbHl0IGJcdTAwZjhqbmluZ3NwdW5rdA0KLSMgUmVjb25uZWN0TGlua0NvbW1hbmQNCi1nZWZfcmVjb25uZWN0TGlua0NvbW1hbmRfbGFiZWw9Rm9yYmluZCBsaW5rIGlnZW4NCi0NCi0jIFZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcg0KLWdlZl92YWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXJfYnJpbmdEb3duUHJvbXB0PU5hdm5ldCBza2FsIHVkZnlsZGVzLiBBbmdpdiBldCBneWxkaWd0IG5hdm4uDQotIyBWYWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcg0KLWdlZl92YWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ9TmF2bmV0IHNrYWwgdWRmeWxkZXMuIEFuZ2l2IGV0IGd5bGRpZ3QgbmF2bi4NCi0jIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0DQotZ2VmX3dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0X3ZhbGlkYXRlTWVzc2FnZT1OYXZuZXQgc2thbCB1ZGZ5bGRlcy4gQW5naXYgZXQgZ3lsZGlndCBuYXZuLg0KLQ0KLSMgRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uDQotYWN0aW9uc19FbGVtZW50c1ZpZXdEZWxldGVBY3Rpb25fbWVzc2FnZT1Lb25maWd1cmF0aW9uZW4gJyd7MH0nJyBrYW4gaWtrZSBzbGV0dGVzLCBmb3JkaSBkZW4gc3RhZGlnIGJydWdlcyBhZiBwcm9jZXNzZW4gJyd7MX0nJy4NCi0NCi0jIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcg0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yVGl0bGU9RmVqbCB1bmRlciBzbGV0bmluZw0KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yTWVzc2FnZT1VYmVoYW5kbGV0IHVuZHRhZ2Vsc2UNCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclJlYXNvbj1TZSBvcGx5c25pbmdlcg0KLQ0KLSMgTWV0aG9kRWxlbWVudEVkaXRvcg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZT1GZWpsIHVuZGVyIGxhZ3JpbmcNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTE9SVVQQTAwMjBFOiBGZWpsIHVuZGVyIGxhZ3JpbmcgYWYgZmlsDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UyPUZlamwgdW5kZXIgY29tbWl0DQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjE9RGVyIGVyIGZsZXJlIG9wbHlzbmluZ2VyIGkgbG9nZmlsZW4NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMj1TZSBvcGx5c25pbmdlcg0KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvclRpdGxlPUZlamwgdW5kZXIgb21kXHUwMGY4Ym5pbmcNCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvck1zZz1FbiBlbGxlciBtYW5nZSBmaWxlciB0aWwgZGVubmUgZWRpdG9yIGVyIGZqZXJuZXQuIEVkaXRvcmVuIGVyIGlra2UgbFx1MDBlNm5nZXJlIGd5bGRpZyBvZyBza2FsIGx1a2tlcy4NCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvclRpdGxlPVVneWxkaWcgZWRpdG9yDQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yTWVzc2FnZTE9RmVqbCB1bmRlciBvbWRcdTAwZjhibmluZyBhZiBmaWwoZXIpICcnezB9JycNCi0NCi0jIERlc2NyaXB0aW9uRm9ybVBhZ2UNCi1yZW5hbWVFcnJvcl90aXRsZT1PbWRcdTAwZjhiIGVsZW1lbnQNCi1yZW5hbWVFcnJvcl9tc2c9SVVQQTAwMTNFOiBPbWRcdTAwZjhibmluZ2VuIGthbiBpa2tlIHVkZlx1MDBmOHJlcy4NCi1TZWxlY3RFbGVtZW50RGlhbG9nX3NlbGVjdGVsZW1lbnRfdGV4dD1WXHUwMGU2bGcgZWxlbWVudA0KLQ0KLSMgRWRpdG9yQ2hvb3Nlcg0KLWVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ190aXRsZT1cdTAwYzVibiBtZXRvZGVlZGl0b3INCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0Rlc2NyaXB0aW9uTGFiZWw9QmVza3JpdmVsc2U6DQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX1NlbGVjdEFsbEJ1dHRvbkxhYmVsPU1hcmtcdTAwZTlyIGFsbGUNCi1PcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlX2VkaXRfdGV4dDA9UmVkaWdcdTAwZTlyIGVsZW1lbnQNCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfbWVzc2FnZT1JVVBBMDAyM0U6IEthbiBpa2tlIFx1MDBlNWJuZSBlZGl0b3IsIGRlciBlciBrbnl0dGV0IHRpbCBkZXQgdmFsZ3RlIG1ldG9kZWVsZW1lbnQuDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9JY29uRmlsZUNob29zZXJEaWFsb2dfdGl0bGU9Vlx1MDBlNmxnIGJpbGxlZGZpbA0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVmYXVsdExpYnJhcnlOYW1lPU55dCBiaWJsaW90ZWsNCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfRGVzY3JpcHRpb25MYWJlbD1CZXNrcml2ZWxzZToNCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1WXHUwMGU2bGcgZW4gZWxsZXIgZmxlcmUgbWV0b2Rla29uZmlndXJhdGlvbmVyLCBvZyBrbGlrIHBcdTAwZTUgQWZzbHV0IGZvciBhdCBcdTAwZTVibmUgZGVtLg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9EZXNlbGVjdEFsbEJ1dHRvbkxhYmVsPU9waFx1MDBlNnYgbWFya2VyaW5nIGFmIGFsbGUNCi1FbGVtZW50c1ZpZXdfbWlncmF0aW9uX2Rpcl9kbGdfZGVzY3JpcHRpb25fdGV4dD1BbmdpdiBiaWJsaW90ZWtldCBtZWQgbnlsaWd0IG1pZ3JlcmV0IHswfSBmb3IgYXQgZXJzdGF0dGUgZGUgdmFsZ3RlIHswfQ0KLWVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ19yZWFzb249RGVyIGVyIG9wc3RcdTAwZTVldCBlbiBzeXN0ZW1mZWpsLiBLbGlrIHBcdTAwZTUgT3BseXNuaW5nZXIgZm9yIGF0IGZcdTAwZTUgZmxlcmUgb3BseXNuaW5nZXIuXG5cDQotXG5cDQotTHVrIG5vZ2xlIGFmIGRlIFx1MDBlNWJuZSBlZGl0b3Jlciwgb2cgcHJcdTAwZjh2IGlnZW4uDQotDQotIyBEZXNjcmlwdGlvbkZvcm1QYWdlDQotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZVRvb0JpZ0RpYWxvZ190aXRsZT1CaWxsZWRlIGVyIHVneWxkaWd0Lg0KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzFFOiBEZXQgdmFsZ3RlIGJpbGxlZGUgJyd7MH0nJyBlciBzdFx1MDBmOHJyZSBlbmQgZGVuIHRpbGxhZHRlIHN0XHUwMGY4cnJlbHNlICh7MX0geCB7Mn0pLiBWXHUwMGU2bGcgZXQgYW5kZXQgYmlsbGVkZS4NCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGl0bGU9QmlsbGVkZSBlciB1Z3lsZGlndC4NCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzJFOiBEZW4gdmFsZ3RlIGZpbCAnJ3swfScnIGZpbmRlcyBpa2tlLiBWXHUwMGU2bGcgZXQgYW5kZXQgYmlsbGVkZS4NCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9Vlx1MDBlNmxnLi4uDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeURlc2NyaXB0aW9uPUJlc2tyaXZlbHNlIGFmIG1ldG9kZWJpYmxpb3Rlaw0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZWZhdWx0QnJpZWZEZXNjcmlwdGlvbj1CZXNrcml2ZWxzZSBhZiBtZXRvZGVrb25maWd1cmF0aW9uDQotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VEZXNjcmlwdGlvbj1BbGxlIGVkaXRvcmVyIHNrYWwgbHVra2VzLiBWXHUwMGU2bGcgZGVtLCBkZXIgc2thbCBmXHUwMGY4cnN0IHNrYWwgZ2VtbWVzLCBodmlzIGRldCBlciByZWxldmFudC4NCi0NCi0jIFRlbXBsYXRlRGVzY3JpcHRpb25QYWdlDQotZm9ybXNfVGVtcGxhdGVEZXNjcmlwdGlvblBhZ2VfYWxyZWFkeUF0dGFjaGVkX21zZz1EZW4gdmFsZ3RlIGZpbCBlciBhbGxlcmVkZSBlbiB2ZWRoXHUwMGU2ZnRuaW5nIHRpbCBkZW5uZSBza2FiZWxvbi4NCi0NCi0jIE5ldyBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLW5ld0xpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTRFOiBNZXRvZGViaWJsaW90ZWtldCBrYW4gaWtrZSBvcHJldHRlcy4NCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMT1EZW4gYW5naXZuZSBtZXRvZGViaWJsaW90ZWtzc3RpICcnezB9JycgZXIgdWd5bGRpZy4NCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMj1EZXIgZmluZGVzIGFsbGVyZWRlIGV0IG1ldG9kZWJpYmxpb3RlayBpICcnezB9JycuDQotbmV3TGlicmFyeUVycm9yX3JlYXNvbjM9RGVuIGFuZ2l2bmUgbWV0b2RlYmlibGlvdGVrc2ZvbGRlciAnJ3swfScnIGthbiBpa2tlIG9wcmV0dGVzLg0KLW5ld0xpYnJhcnlFcnJvcl9hZHZpY2U9Vlx1MDBlNmxnIE9LIGZvciBhdCBhbmdpdmUgZXQgYW5kZXQgbmF2biBlbGxlciBlbiBhbmRlbiBzdGkgZm9yIGJpYmxpb3Rla2V0Lg0KLQ0KLSNQcm9jZXNzIGxpdGVyYWxzDQotUHJvY2Vzc19FeHRlcm5hbElEPUVrc3Rlcm4gaWQ6DQotUHJvY2Vzc19QdXJwb3NlPUZvcm1cdTAwZTVsOg0KLVByb2Nlc3NfU2NvcGU9T21mYW5nOg0KLVByb2Nlc3NfVXNhZ2VOb3Rlcz1CcnVnc2JlbVx1MDBlNnJrbmluZ2VyOg0KLVByb2Nlc3NfQWx0ZXJuYXRpdmVzPUFsdGVybmF0aXZlcjoNCi1Qcm9jZXNzX0hvd1RvU3RhZmY9QmVtYW5kaW5nOg0KLVByb2Nlc3NfS2V5Q29uc2lkZXJhdGlvbj1OXHUwMGY4Z2xlb3ZlcnZlamVsc2VyOg0KLVByb2Nlc3NfU2NhbGU9U2thbGE6DQotUHJvY2Vzc19Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzPVByb2pla3RrYXJha3RlcmlzdGlrYToNCi1Qcm9jZXNzX1Jpc2tMZXZlbD1SaXNpa29uaXZlYXU6DQotUHJvY2Vzc19Fc3RpbWF0aW5nVGVjaG5pcXVlPUVzdGltZXJpbmdzdGVrbmlrOg0KLVByb2Nlc3NfUHJvamVjdE1lbWJlckV4cGVydGlzZT1Qcm9qZWt0ZGVsdGFnZXItIGtvbXBldGVuY2U6DQotUHJvY2Vzc19UeXBlT2ZDb250cmFjdD1Lb250cmFrdHR5cGU6DQotDQotIyBFZGl0b3IgUHJldmlldyBOYXZpZ2F0aW9uIEJ1dHRvbnMNCi1iYWNrQnV0dG9uX3RleHQ9VGlsYmFnZQ0KLWZvcndhcmRCdXR0b25fdGV4dD1GcmVtDQotZm9yd2FyZF90ZXh0PUZyZW0NCi1zdG9wQnV0dG9uX3RleHQ9U3RvcA0KLXJlZnJlc2hCdXR0b25fdGV4dD1PcGZyaXNrDQotcmVmcmVzaF90ZXh0PU9wZnJpc2sNCi1uZXduYW1lX3RleHQ9Tnl0IG5hdm46DQotcHJpbnRCdXR0b25fdGV4dD1VZHNrcml2DQotDQotIyBDb250ZXh0IG1lbnVzDQotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPSZPcGZyaXNrDQotX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW09JlZpcyBlZ2Vuc2thYmVyDQotDQotX1VJX01ldGhvZEVkaXRvcl9tZW51PSZNZXRvZGVlZGl0b3INCi1fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtPSZOeQ0KLV9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbT1OJnkgc2lkZW9yZG5ldA0KLQ0KLV9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsPVZhbGcNCi1fVUlfUGFyZW50UGFnZV9sYWJlbD1PdmVyb3JkbmV0DQotX1VJX0xpc3RQYWdlX2xhYmVsPUxpc3RlDQotX1VJX1RyZWVQYWdlX2xhYmVsPVRyXHUwMGU2c3RydWt0dXINCi1fVUlfVGFibGVQYWdlX2xhYmVsPVRhYmVsDQotX1VJX1RhYmxlVHJlZVBhZ2VfbGFiZWw9VGFiZWx0clx1MDBlNnN0cnVrdHVyDQotX1VJX09iamVjdENvbHVtbl9sYWJlbD1PYmpla3QNCi1fVUlfU2VsZkNvbHVtbl9sYWJlbD1TZWx2DQotDQotX1VJX05vT2JqZWN0U2VsZWN0ZWQ9SW50ZXQgdmFsZ3QNCi1fVUlfU2luZ2xlT2JqZWN0U2VsZWN0ZWQ9VmFsZ3Qgb2JqZWt0OiB7MH0NCi1fVUlfTXVsdGlPYmplY3RTZWxlY3RlZD17MH0gdmFsZ3RlIG9iamVrdGVyDQotDQotX1VJX09wZW5FZGl0b3JFcnJvcl9sYWJlbD1cdTAwYzVibiBlZGl0b3INCi0NCi1fVUlfV2l6YXJkX2NhdGVnb3J5PUd1aWRlciB0aWwgb3ByZXR0ZWxzZSBhZiBla3NlbXBlbC1FTUYtbW9kZWwNCi0NCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfbGFiZWw9TWV0b2RlbW9kZWwNCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfZGVzY3JpcHRpb249T3ByZXQgZW4gbnkgbWV0b2RlbW9kZWwNCi0NCi1fVUlfTWV0aG9kRWRpdG9yX2xhYmVsPU1ldG9kZW1vZGVsZWRpdG9yDQotDQotX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2U9TWluDQotX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRXh0ZW5zaW9uPW1ldG9kZQ0KLQ0KLV9VSV9XaXphcmRfbGFiZWw9TnkNCi0NCi1fV0FSTl9GaWxlbmFtZUV4dGVuc2lvbj1GaWxuYXZuZXQgc2thbCBzbHV0dGUgbWVkICcnLnswfScnDQotDQotX1VJX01vZGVsT2JqZWN0PU1vZGVsb2JqZWt0DQotX1VJX1hNTEVuY29kaW5nPVhNTC1rb2RuaW5nDQotX1VJX1hNTEVuY29kaW5nQ2hvaWNlcz1VVEYtOCBBU0NJSSBVVEYtMTYgVVRGLTE2QkUgVVRGLTE2TEUgSVNPLTg4NTktMQ0KLV9VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb249Vlx1MDBlNmxnIGV0IG1vZGVsb2JqZWt0LCBkZXIgc2thbCBvcHJldHRlcw0KLQ0KLV9VSV9GaWxlQ29uZmxpY3RfbGFiZWw9Rmlsa29uZmxpa3QNCi1fV0FSTl9GaWxlQ29uZmxpY3Q9RGVyIGVyIGVuIGtvbmZsaWt0IG1lbGxlbSBpa2tlLWdlbXRlIFx1MDBlNm5kcmluZ2VyIG9nIFx1MDBlNm5kcmluZ2VyLCBkZXIgZXIgZm9yZXRhZ2V0IHVkZW4gZm9yIGVkaXRvcmVuLiBWaWwgZHUgc2xldHRlIFx1MDBlNm5kcmluZ2VybmUgaSBlZGl0b3Jlbj8NCi0NCi0jIEFkZCBMaW5rIERpYWxvZw0KLWFkZExpbmtEaWFsb2dfbGlua1R5cGU9VHlwZToNCi1vcGVuTGlua0NoZWNrYm94X3RleHQ9XHUwMGM1Ym4gbGluayBpIHNlcGFyYXQgYnJvd3NlcnZpbmR1ZQ0KLQ0KLSMgQWRkIEltYWdlIERpYWxvZw0KLWhlaWdodExhYmVsX3RleHQ9SFx1MDBmOGpkZToNCi13aWR0aExhYmVsX3RleHQ9QnJlZGRlOg0KLUVsZW1lbnRzVmlld18yMD1mdW5rdGlvbnNtXHUwMGY4bnN0ZXINCi1FbGVtZW50c1ZpZXdfMjE9bGV2ZXJpbmdzcHJvY2VzDQotRWxlbWVudHNWaWV3XzIyPXByb2Nlcw0KLUVsZW1lbnRzVmlld18zNT17MH0gZXIgc2tyaXZlYmVza3l0dGV0LiBHXHUwMGY4ciBkZXQgcmVkaWdcdTAwZTlyYmFydCwgZlx1MDBmOHIgZHUgZm9ydHNcdTAwZTZ0dGVyLg0KLUVsZW1lbnRzVmlld18zNj1GZWpsIHVuZGVyIGluZGxcdTAwZTZzbmluZyBhZiBiaWJsaW90ZWsNCi1hbHRUYWdMYWJlbF90ZXh0PUFMVC1rb2RlOg0KLWltYWdlU2l6ZUxhYmVsX3RleHQ9QmlsbGVkZXRzIGhcdTAwZjhqcmUgb2cgYnJlZGRlIHNrYWwgdlx1MDBlNnJlIG1pbmRzdCAxMCBvZyBoXHUwMGY4anN0IDYwMC4gVWd5bGRpZyBoXHUwMGY4amRlIG9nIGJyZWRkZSBibGl2ZXIga29udmVydGVyZXQgdGlsIGVuIHBhc3NlbmRlIHN0XHUwMGY4cnJlbHNlLg0KLQ0KLSMgUHJvY2VzcyBFZGl0b3INCi1Qcm9jZXNzRWRpdG9yPVByb2Nlc2VkaXRvcg0KLVByb2Nlc3NFZGl0b3JfTmFtZT1OYXZuDQotUHJvY2Vzc0VkaXRvcl9QcmVzZW50YXRpb25OYW1lPVByXHUwMGU2c2VudGF0aW9uc25hdm4NCi1Qcm9jZXNzRWRpdG9yX0luZGV4PUluZGVrcw0KLVByb2Nlc3NFZGl0b3JfUHJlZGVjZXNzb3JzPUZvcmdcdTAwZTZuZ2VyZQ0KLSNDb25maWd1cmF0aW9uUGFnZV9TZWxlY3RlZD1TZWxlY3RlZDogDQotQ2hlY2tsaXN0T3JkZXJfZGVzY3JpcHRpb249Vlx1MDBlNmxnIGV0IGtvbnRyb2xlbGVtZW50LCBvZyBrbGlrIHBcdTAwZTUgT3AgZWxsZXIgTmVkIGZvciBhdCBcdTAwZTZuZHJlIGRldHMgclx1MDBlNmtrZWZcdTAwZjhsZ2UuDQotRWxlbWVudHNWaWV3X3JlbmFtaW5nX3RleHQ9T21kXHUwMGY4YmVyLi4uDQotUHJvY2Vzc0VkaXRvcl9Nb2RlbEluZm89TW9kZWxvcGx5c25pbmdlcg0KLVByb2Nlc3NFZGl0b3JfUHJlZml4PVByXHUwMGU2Zmlrcw0KLU1vdmVEaWFsb2dfbW92ZV90ZXh0PUZseXQNCi1DaGVja2xpc3RPcmRlcl90aXRsZT1SXHUwMGU2a2tlZlx1MDBmOGxnZSBhZiBrb250cm9sZWxlbWVudGVyDQotUHJvY2Vzc0VkaXRvcl9SZXBldGFibGU9S2FuIGdlbnRhZ2VzDQotUHJvY2Vzc0VkaXRvcl9PbmdvaW5nPUlnYW5ndlx1MDBlNnJlbmRlDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3luY2hyb25pemF0aW9uPVN5bmtyb25pc1x1MDBlOXIuLi4NCi1Qcm9jZXNzRWRpdG9yX0V2ZW50RHJpdmVuPUFrdGl2aXRldHNzdHlyZXQNCi1Qcm9jZXNzRWRpdG9yX0RlbGl2ZXJhYmxlPUxldmVyYW5jZQ0KLVByb2Nlc3NFZGl0b3JfT3B0aW9uYWw9VmFsZ2ZyaXQNCi1GaWx0ZXJEaWFsb2dfVHlwZV90ZXh0PU1ldG9kZWVsZW1lbnR0eXBlOg0KLUZpbHRlckRpYWxvZ19FeHBhbmRBbGw9VWR2aWQgYWxsZQ0KLU1vdmVEaWFsb2dfbW92aW5nX3RleHQ9Rmx5dHRlci4uLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbldhcm5pbmc9SVVQQTAwMjVXOiBGb3JtaWtvbiBmb3IgezB9IGZpbmRlcyBpa2tlIGkgc3RpZW46IHsxfQ0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbkVycm9yPUlVUEEwMDI1RTogRmVqbDogRm9ybWlrb25hZnNuaXQ6IHswfQ0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfTmFtZUxhYmVsPU5hdm46DQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1PcHJldCBueSBtZXRvZGVrb25maWd1cmF0aW9uDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX05hbWVMYWJlbD1OYXZuOg0KLUF1dGhvcmluZ1VJUGx1Z2luX25ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGU9TnkgbWV0b2Rla29uZmlndXJhdGlvbg0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0xpYnJhcnlNYWluUGFnZV9wYWdlVGl0bGU9T3ByZXQgbnl0IG1ldG9kZWJpYmxpb3Rlaw0KLW5ld0xpYnJhcnlXaXphcmRfdGl0bGU9Tnl0IG1ldG9kZWJpYmxpb3Rlaw0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlVGl0bGU9R2VtIFx1MDBlNm5kcmluZ2VyDQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3TGlicmFyeU1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1BbmdpdiBuYXZuLCBiZXNrcml2ZWxzZSBvZyBkZXN0aW5hdGlvbnNiaWJsaW90ZWsgZm9yIGRldCBueWUgbWV0b2RlYmlibGlvdGVrLg0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlRGVzY3JpcHRpb249RXQgZWxsZXIgZmxlcmUgbWV0b2RlZWxlbWVudGVyIGVyIFx1MDBlNm5kcmV0LiBWXHUwMGU2bGcgZGVtLCBkZXIgc2thbCBnZW1tZXMuDQotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGU9XHUwMGM1Ym4gbWV0b2Rla29uZmlndXJhdGlvbmVyDQotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25XaXphcmRfd2luZG93VGl0bGU9XHUwMGM1Ym4gbWV0b2Rla29uZmlndXJhdGlvbmVyDQotRWxlbWVudHNWaWV3X3JlcGxhY2Vpbmd3aXRoZm9ybWF0X3RleHQ9RXJzdGF0dGVyIHswfS4uLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uV2FybmluZz1JVVBBMDAyNlc6IE5vZGVpa29uIGZvciB7MH0gZmluZGVzIGlra2UgaSBzdGllbjogezF9DQotTWVzc2FnZUxhYmVsUHJvdmlkZXJfdW5zZWxlY3RlZHBhY2thZ2VzPScnezB9JycgaW5kZWhvbGRlciBlbGVtZW50ZXIsIHNvbSByZWZlcmVyZXIgdGlsIGVsZW1lbnRlciBpIGlra2UtdmFsZ3RlIHBha2tlcg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uRXJyb3I9SVVQQTAwMjZFOiBGZWpsOiBOb2RlaWtvbmFmc25pdDogezB9DQotU3RlcHNPcmRlckRpYWxvZ19zdGVwcz1UcmluOiANCi1TdGVwc09yZGVyRGlhbG9nX3RpdGxlPVJcdTAwZTZra2VmXHUwMGY4bGdlIGFmIG9wZ2F2ZXRyaW4NCi1Qcm9jZXNzRWRpdG9yX1BsYW5uZWQ9UGxhbmxhZ3QNCi1zcGVjaWZ5ZGlyZWN0b3J5X3RleHQ9QW5naXYgZXQgYmlibGlvdGVrLCBodm9yIG1ldG9kZWJpYmxpb3Rla2V0IHNrYWwgZ2VtbWVzDQotUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzPUZsZXJlIGZvcmVrb21zdGVyDQotUHJvY2Vzc0VkaXRvcl9FbnRyeVN0YXRlPUluZGdhbmdzdGlsc3RhbmQNCi1Qcm9jZXNzRWRpdG9yX0V4aXRTdGF0ZT1VZGdhbmdzdGlsc3RhbmQNCi1zZWxlY3RDb2x1bW5zdG9BZGRfdGV4dD1WXHUwMGU2bGcga29sb25uZXIsIGRlciBza2FsIHRpbGZcdTAwZjhqZXMNCi1Qcm9jZXNzRWRpdG9yX1R5cGU9VHlwZQ0KLVByb2Nlc3NFZGl0b3JfVGVhbT1UZWFtDQotRmlsdGVyRGlhbG9nX3RpdGxlPVZcdTAwZTZsZyBkaWFsb2c6IA0KLQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZD1UaWxmXHUwMGY4aiBmcmEgJm1ldG9kZWluZGhvbGQuLi4NCi1GaWx0ZXJEaWFsb2dfQ29sbGFwc2VBbGw9U2tqdWwgYWxsZQ0KLU9wZW5DaGVhdHNoZWV0Vmlld190aXRsZT1cdTAwYzVibiBvdmVyc2lndGVuIFNueWRlYXJrDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbFVwPVJ1bCBvcA0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxEb3duPVJ1bCBuZWQNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXA9RiZseXQgb3ANCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlRG93bj1GbHl0ICZuZWQNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWw9JkFmZFx1MDBlNmsNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Db3B5PSZLb3BpXHUwMGU5ci4uLg0KLUZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQ9TmF2bmVtXHUwMGY4bnN0cmUgKG1hdGNoZW5kZSBuYXZuZSB2aXNlcyk6IA0KLU1ldGhvZExpYnJhcnlFZGl0b3JfdGl0bGU9TWV0b2RlYmlibGlvdGVrOiANCi0jTWVzc2FnZVZpZXdfc2VsZWN0ZWRfdGV4dD1TZWxlY3RlZDogDQotTWVzc2FnZVZpZXdfZXJybXNnX3RleHQ9QmVza3JpdmVsc2UNCi1FbGVtZW50c1ZpZXdfZXJyX3NhdmluZz1JVVBBMDAyN0U6IEZlamwgdW5kZXIgbGFncmluZyBhZiAnJ3swfScnezF9DQotDQotZXJyX2NvcHlpbmdfZmlsZV90aXRsZT1GZWpsIHVuZGVyIGtvcGllcmluZyBhZiBmaWwNCi1lcnJfY29weWluZ19maWxlX2Vycm9yPUlVUEEwMDI4RTogSWtvbmVuIGthbiBpa2tlIHRpbGRlbGVzLiANCi1lcnJfY29weWluZ19maWxlX3JlYXNvbj1EZXIgZXIgb3BzdFx1MDBlNWV0IGVuIGZlamwgdW5kZXJrb3BpZXJpbmcgYWYgZGVuIHZhbGd0ZSBmaWwuIEtsaWsgcFx1MDBlNSBPcGx5c25pbmdlciBmb3IgYXQgZlx1MDBlNSBmbGVyZSBvcGx5c25pbmdlci4NCi1lcnJfcHJvY2Vzc2luZ19maWxlX3RpdGxlPUZlamwgdW5kZXIgYmVoYW5kbGluZyBhZiBmaWwNCi1lZGl0Q29uZmlndXJhdGlvbl90b29sdGlwPVJlZGlnXHUwMGU5ciBrb25maWd1cmF0aW9uDQotZWRpdERpYWxvZ19tc2dDYW5ub3RFZGl0PUlVUEEwMDE1RTogS2FuIGlra2UgcmVkaWdlcmUgZWxlbWVudA0KLVNhdmVUaGlzQWN0aW9uX3NhdmVvYmplY3Q9R2VtIGRldHRlIG9iamVrdC4uLg0KLUVsZW1lbnRzVmlld19yZXBsYWNlX3RleHQ9RXJzdGF0DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRXh0ZW5kPVUmZHZpZC4uLg0KLU1vdmVEaWFsb2dfZGVzdGluYXRpb25fdGV4dD1WXHUwMGU2bGcgZGVzdGluYXRpb24gZm9yIGRldCBlbGxlciBkZSB2YWxndGUgZWxlbWVudGVyOg0KLWNob29zZURlZmF1bHREaXJlY3RvcnlfdGV4dD1WXHUwMGU2bGcgZXQgc3RhbmRhcmRiaWJsaW90ZWsgZm9yIGJpYmxpb3Rla2VyOg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzPSZVbmRlcnRyeWsNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzczI9JlB1YmxpY2VyaW5nc2luZHN0aWxsaW5nZXIuLi4NCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbT0mQnJ1Z2VyZGVmaW5lcmVkZSBkaWFncmFtbWVyLi4uDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3RpdGxlPVRpbGRlbCBicnVnZXJkZWZpbmVyZWRlIGRpYWdyYW1tZXINCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYWRJbWFnZT1Ba3Rpdml0ZXRzZGlhZ3JhbToNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYWRkSW1hZ2U9QWt0aXZpdGV0c29wbHlzbmluZ3NkaWFncmFtOg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ193cGRJbWFnZT1EaWFncmFtIGZvciBhcmJlamRzcHJvZHVrdGFmaFx1MDBlNm5naWdoZWQ6DQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX25vdGFGaWxlPUlVUEEwMDA0RTogRGVuIGFuZ2l2bmUgc3RpIGVyIGlra2UgZW4gZmlsLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hc3NpZ25CdXR0b249Vlx1MDBlNmxnLi4uDQotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2VudGVyZWRJbWFnZU5vdEZvdW5kPUlVUEEwMDI0RTogRGV0IGFuZ2l2bmUgYmlsbGVkZSBmaW5kZXMgaWtrZSBpIGJpYmxpb3Rla2V0LiBBbmdpdiBkZW4gcmVsYXRpdmUgc3RpIHRpbCBiaWJsaW90ZWtldHMgcm9kYmlibGlvdGVrLg0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19zZWxlY3RlZEltYWdlTm90Rm91bmQ9SVVQQTAwMzBFOiBEZXQgdmFsZ3RlIGJpbGxlZGUgZmluZGVzIGlra2UgaSBiaWJsaW90ZWtldC4NCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURJbWFnZT1CcnVnIGJpbGxlZGUgYWYgYWt0aXZpdGV0c2RpYWdyYW0gdGlsIGdlbm5lbXN5biBvZyBwdWJsaWNlcmluZw0KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBRERJbWFnZT1CcnVnIGJpbGxlZGUgYWYgYWt0aXZpdGV0c29wbHlzbmluZ3NkaWFncmFtIHRpbCBnZW5uZW1zeW4gb2cgcHVibGljZXJpbmcNCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlV1BESW1hZ2U9QnJ1ZyBiaWxsZWRlIGFmIGRpYWdyYW0gZm9yIGFyYmVqZHNwcm9kdWt0YWZoXHUwMGU2bmdpZ2hlZCB0aWwgZ2VubmVtc3luIG9nIHB1YmxpY2VyaW5nDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29udHJpYnV0ZT1Mb2thbHQgYmlkcmFnDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmVwbGFjZT1Mb2thbCBlcnN0YXRuaW5nDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRGlhZ3JhbXM9RGlhJmdyYW1tZXINCi1Qcm9jZXNzRWRpdG9yX2FjdGlvbl9kZWVwQ29weT0mRHliIGtvcGllcmluZy4uLg0KLUZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uPUtvcnQgYmVza3JpdmVsc2U6DQotQ29uZmlndXJhdGlvblBhZ2VfaGlkZVRvb2xUaXA9VmlzL3NranVsIHVtYXJrZXJlZGUgZWxlbWVudGVyDQotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb249QmVza3JpdmVsc2U6DQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3NBbGw9UHVibGljXHUwMGU5ciBpbmdlbg0KLUZpbHRlckRpYWxvZ19QYXR0ZXJuX2Rlc2NyaXB0aW9uPU1cdTAwZjhuc3RyZSBhZHNraWxsZXMgYWYga29tbWFlciwgaHZvciAqID0gZW4gdmlsa1x1MDBlNXJsaWcgc3RyZW5nLCA/ID0gZXQgdmlsa1x1MDBlNXJsaWd0IHRlZ24NCi1Db25maWd1cmF0aW9uUGFnZV9UcmVlVGl0bGVMYWJlbD1JbmRob2xkOg0KLUNvbmZpZ3VyYXRpb25QYWdlX0xvYWRpbmdNZXNzYWdlPUluZGxcdTAwZTZzZXIga29uZmlndXJhdGlvbi4gVmVudC4uLg0KLU1vdmVEaWFsb2dfdmFsaWRkZXN0aW5hdGlvbl90ZXh0PURlbiBhbmdpdm5lIGZseXR0ZWRlc3RpbmF0aW9uIGVyIHVneWxkaWcuDQotTW92ZURpYWxvZ19jYW5ub3RNb2RpZnlEZXN0aW5hdGlvbj1JVVBBMDAzNEU6IERlbiB2YWxndGUgZGVzdGluYXRpb24ga2FuIGlra2UgXHUwMGU2bmRyZXMuDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsQWxsPVB1YmxpY1x1MDBlOXIgYWxsZQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5CYXNlQWN0aXZpdHk9XHUwMGM1Ym4gYmFzaXNha3Rpdml0ZXQNCi1Qcm9jZXNzRm9ybUVkaXRvcl9leHBhbkFsbEFjdGlvbkxhYmVsPVVkJnZpZCBhbGxlDQotUHJvY2Vzc0Zvcm1FZGl0b3JfY29sbGFwc2VBbGxBY3Rpb25MYWJlbD1Ta2p1JmwgYWxsZQ0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURpYWdyYW09XHUwMGM1Ym4gJmFrdGl2aXRldHNkaWFncmFtDQotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVJldmVhbD1EZSBpa2tlLXVuZGVydHJ5a3RlIGRlc2tyaXB0b3JlciBpIE9wbHlzbmluZ2VyIHNrYWwgc2xldHRlcyBmb3IgYXQgdW5kZ1x1MDBlNSBzYW1tZW5mYWxkIGVmdGVyIGFmZFx1MDBlNmtuaW5nIGFmIGRlIHZhbGd0ZSBlbGVtZW50ZXIuIEtsaWsgcFx1MDBlNSBPSywgaHZpcyBkdSB2aWwgc2xldHRlIGRlbSBvZyBmb3J0c1x1MDBlNnR0ZS4NCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfU2VsZWN0Q29sdW1ucz1WXHUwMGU2bGcga29sb25uZXIsIGRlciBza2FsIHRpbGZcdTAwZjhqZXMNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtPVx1MDBjNWJuIGFrdGl2aXRldHNvcGx5c25pbmdzJmRpYWdyYW0NCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfQ29sdW1uU2VsZWN0aW9uPUtvbG9ubmV2YWxnOg0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zd2l0Y2hDb25maWd1cmF0aW9uPVNraWZ0IHRpbCBwcm9jZXNzZW5zIHN0YW5kYXJka29uZmlndXJhdGlvbiwgblx1MDBlNXIgZW4gcHJvY2VzZWRpdG9yIGFrdGl2ZXJlcw0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zdXBwcmVzc2lvbkdyb3VwVGl0bGU9VW5kZXJ0cnlra2Vsc2UNCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfaW5oZXJpdFN1cHByZXNzaW9uU3RhdGU9T3ZlcnRhZyB1bmRlcnRyeWtrZWxzZXN0aWxzdGFuZGUNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbT1cdTAwYzVibiBkaWFncmFtICZmb3IgYXJiZWpkc3Byb2R1a3RhZmhcdTAwZTZuZ2lnaGVkDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw9UnlkDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9Vlx1MDBlNmxnLi4uDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fSW5zZXJ0TmV3UGhhc2U9SW5kc1x1MDBlNnQgbnkgZmFzZQ0KLVZpZXdIZWxwZXJfcmVsb2FkTGliT25Sb2xsYmFja0Vycm9yPUthbiBpa2tlIHJldGFibGVyZSBmcmEgZW4gcGVyc2lzdGVuc2ZlamwuIEJpYmxpb3Rla2V0IHNrYWwgZ2VuaW5kbFx1MDBlNnNlcyBmb3IgYXQgZ2VuZGFubmUgZGV0cyBvcHJpbmRlbGlnZSB0aWxzdGFuZC4NCi1WaWV3SGVscGVyX2FscmVhZHlkZWxldGVkX3RleHQ9RWxlbWVudGV0ICcnezB9JycgZXIgYWxsZXJlZGUgc2xldHRldC4NCi1WaWV3SGVscGVyX2FscmVhZHlkZWxldGVkY29uZmlybV90ZXh0PUVsZW1lbnRldCAnJ3swfScnIGVyIGFsbGVyZWRlIHNsZXR0ZXQuIFZpbCBkdSBmamVybmUgZGV0IGZyYSAnJ3sxfScnPw0KLUNvbmZpZ3VyYXRpb25QYWdlX0FkZE1pc3NpbmdUb29sVGlwPVRpbGZcdTAwZjhqIG1hbmdsZW5kZSByZWZlcmVuY2VyDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb249QmVza3JpdmVsc2UNCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25HZW5lcmFsSW5mbz1HZW5lcmVsbGUgb3BseXNuaW5nZXIgDQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXBwbHlQYXR0ZXJuPUFudmVuZCBtXHUwMGY4bnMmdGVyDQotTW92ZURpYWxvZ19zZWxlY3RkZXN0aW5hdGlvbl90ZXh0PVZcdTAwZTZsZyBlbiBkZXN0aW5hdGlvbi4NCi1Nb3ZlRGlhbG9nX25vbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZz1EZXIgZXIgaWtrZSBhbmdpdmV0IGVuIGZseXR0ZWRlc3RpbmF0aW9uLg0KLU1ldGhvZExpYnJhcnlFZGl0b3JfdHJvdWJsZW9iamVjdD0uIFByb2JsZW1vYmpla3Q6IA0KLU1lc3NhZ2VMYWJlbFByb3ZpZGVyX2VycmNoaWxkcGtncz1FbiB1bmRlcm9yZG5ldCBpbmRob2xkc3Bha2tlIGVsbGVyIHByb2NlcyBpbmRlaG9sZGVyIGVsZW1lbnRlciBtZWQgbWFuZ2xlbmRlIHJlZmVyZW5jZXINCi1Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX1RpdGxlPUluZHN0aWxsaW5nZXIgZm9yIGRpYWdyYW1wdWJsaWNlcmluZw0KLVByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfTWVzc2FnZT1WXHUwMGU2bGcgZGV0IGVsbGVyIGRlIGRpYWdyYW1tZXIsIGRlciBza2FsIHB1YmxpY2VyZXMsIGVsbGVyIGZyYXZcdTAwZTZsZyBkZW0gZm9yIGlra2UgYXQgcHVibGljZXJlDQotUHJvY2Vzc0VkaXRvcl9UaXRsZT1Qcm9jZXNlZGl0b3I6IA0KLVNhdmVBc3dpdGhkb3RzX3RleHQ9R2VtIHNvbS4uLg0KLVByb2Nlc3NFZGl0b3JfV29ya0JyZWFrZG93blN0cnVjdHVyZT1BcmJlamRzbmVkYnJ5ZG5pbmdzc3RydWt0dXINCi1Qcm9jZXNzRWRpdG9yX1RlYW1BbGxvY2F0aW9uPVRlYW1hbGxva2VyaW5nDQotUHJvY2Vzc0VkaXRvcl9Xb3JrUHJvZHVjdFVzYWdlPUFyYmVqZHNwcm9kdWt0YnJ1Zw0KLVByb2Nlc3NFZGl0b3JfQ29uc29saWRhdGVkVmlldz1Lb25zb2xpZGVyZXQgb3ZlcnNpZ3QNCi1Qcm9jZXNzRWRpdG9yX2NvbmZpcm1BdXRvU3luY2g9RGVubmUgZnVua3Rpb24gb3Bmcmlza2VyIGRlIHZhbGd0ZSBkZXNrcmlwdG9yZXIgZWxsZXIgYWxsZSBkZXNrcmlwdG9yZXIgdW5kZXIgZGUgdmFsZ3RlIGFrdGl2aXRldGVyLCBkZXIgZXIgbWFya2VyZXQgc29tICJTeW5rcm9uaXNlcmV0IG1lZCBraWxkZSIgcFx1MDBlNSBza2lsbGVibGFkZXQgR2VuZXJlbHQgaSBkZXJlcyBlZ2Vuc2thYnNvdmVyc2lndC4gRGVuIG9wZnJpc2tlciBkZXNrcmlwdG9yZXJuZSBtZWQgZGUgb3ByaW5kZWxpZ2UgZWdlbnNrYWJlciBmb3IgZGUgbGlua2VkZSBtZXRvZGVpbmRob2xkc2VsZW1lbnRlciB1bmRlciBwcm9jZXNzZW5zIHN0YW5kYXJka29uZmlndXJhdGlvbi4gQmVtXHUwMGU2cmssIGF0IGRlbiBpa2tlIG9wZGF0ZXJlciBkeW5hbWlzayBsaW5rZWRlIChnclx1MDBmOG4ga3Vyc2l2KSBkZXNrcmlwdG9yZXIuIFZpbCBkdSBmb3J0c1x1MDBlNnR0ZT8NCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjE9S29uZmlndXJhdGlvbg0KLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMj1WXHUwMGU2bGcgcGx1Z2luIG9nIHBha2tlDQotTmV3TGlicmFyeURpYWxvZ19uZXdsaWJyYXJ5X2FzPU9wcmV0IG55dCBiaWJsaW90ZWsgc29tDQotTmV3UGx1Z2luRGlhbG9nX25ld3BsdWdpbl90ZXh0PU55IG1ldG9kZS1wbHVnaW4NCi1TZWxlY3RFbGVtZW50RGlhbG9nX3RpdGxlX3RleHQ9Vlx1MDBlNmxnIGVsZW1lbnRldCBlbGxlciBlbiBhZiBkZXRzIGJpZHJhZ3lkZXJlOg0KLU9wZW5Db25maWdEaWFsb2duZXdjb25maWdfdGV4dD1OeSBrb25maWd1cmF0aW9uOg0KLXByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZV9CU0VkaXRvcj1Qcm9jZXNlZGl0b3INCi0NCi0jIEFic3RyYWN0RGlhZ3JhbUVkaXRvcg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1KdXN0XHUwMGU5cg0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0PU9wZnJpc2sgZnJhIGJhc2lzYWt0aXZpdGV0DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2Zvcm1hdFRleHRCb3hBY3Rpdml0eV90ZXh0PUZvcm1hdFx1MDBlOXIgdGVrc3Rib2tzLi4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1WYW5kcmV0IHRpbCBnZW5uZW1zbml0DQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1WYW5kcmV0IHRpbCBmXHUwMGY4cnN0ZSB2YWxndGUNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PUxvZHJldCB0aWwgZ2VubmVtc25pdA0KLU1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fdGl0bGU9R2VuZXJlbGxlIG9wbHlzbmluZ2VyDQotTW92ZURpYWxvZ19pbnZhbGlkX21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9SVVQQTAwNDFFOiBEZXQgZWxsZXIgZGUgdmFsZ3RlIGVsZW1lbnRlciBrYW4gaWtrZSBmbHl0dGVzIHRpbCBkZW4gYW5naXZuZSBkZXN0aW5hdGlvbi4NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3NhdmVtb2RlbGxpYnJhcnk9R2VtbWVyIG1vZGVsYmlibGlvdGVrLi4uDQotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJvcl9kaWFsb2dfdGl0bGU9RmVqbA0KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZV9saWJyYXJ5X3Byb2JsZW1fbXNnPUlVUEEwMDMzRTogRGVyIGVyIG9wc3RcdTAwZTVldCBldCBwcm9ibGVtIHVuZGVyIGxhZ3JpbmcgYWYgYmlibGlvdGVrLg0KLU1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb25fZGVsZXRlY29uZmlybV90ZXh0PUVyIGR1IHNpa2tlciBwXHUwMGU1LCBhdCBkdSB2aWwgc2xldHRlICcnezB9Jyc/DQotQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfQ29udGVudEVsZW1lbnRfdGV4dD1JbmRob2xkc2VsZW1lbnRlcjogDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Ccm93c2VCdXR0b25MYWJlbD1HZW5uZW1zZS4uLg0KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb249QW5naXYgbmF2biBwXHUwMGU1IG9nIGVuIGJlc2tyaXZlbHNlIGFmIGRlbiBueWUgbWV0b2Rla29uZmlndXJhdGlvbi4NCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZVRpdGxlPUdlbSBcdTAwZTZuZHJpbmdlciwgb2cgbHVrIGFsbGUgZWRpdG9yZXINCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PUxvZHJldCB0aWwgZlx1MDBmOHJzdGUgdmFsZ3RlDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dD1HZW0NCi1BdHRhY2htZW50RGlhbG9nYXR0YWNoRmlsZV90ZXh0PVZlZGhcdTAwZTZmdCBmaWwNCi1Db25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50PUtvbmZpZ3VyYXRpb25zaW5kaG9sZA0KLU9wZW5Db25maWdEaWFsb2dvcGVuY29uZmlnX3RleHQ9XHUwMGM1Ym4ga29uZmlndXJhdGlvbg0KLUVsZW1lbnRzVmlld19yZXBsYWNlQWN0aW9uX3RleHQ9RXJzdGF0Li4uDQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfbWVzc2FnZT1HZW1tZXIgezB9DQotQ29uZmlndXJhdGlvblBhZ2VfU2hvd0Vycm9yVG9vbFRpcD1WaXMgZnJlbXZpc2VyIHRpbCBrb25maWd1cmF0aW9uc2FkdmFyc2Vsc2xvZw0KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkZvcm1QcmVmaXg9S29uZmlndXJhdGlvbjogDQotQ2hlY2tsaXN0T3JkZXJfY2hlY2tsaXN0aXRlbXNfdGV4dD1Lb250cm9sZWxlbWVudGVyOiANCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw9Rmx5dCBub2RlDQotQ29uZmlndXJhdGlvblBhZ2VfTWFrZUNsb3N1cmVUb29sVGlwPUZvcmV0YWcgbHVrbmluZyB2ZWQgYXQgcmV0dGUgZmVqbA0KLU5ld1BsdWdpbkRpYWxvZ19yZWZlcmVuY2VwbHVnaW5fdGV4dD1SZWZlcmVuY2UtcGx1Z2luczoNCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfY3JlYXRlRnJlZVRleHRfdGV4dD1PcHJldCBmcml0ZWtzdA0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0xhYmVsPVJlc3VsdGF0IGFmIG5vZGVpa29uOg0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0PUlVUEEwMDMyVzogS2FuIGlra2Ugb3ByZXR0ZSBmb3JiaW5kZWxzZQ0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9zYW1lcHJlZGFuZHN1Y190ZXh0PUlVUEEwMDMzVzogS2FuIGlra2UgaGF2ZSBkZXQgc2FtbWUgbmVkYnJ5ZG5pbmdzZWxlbWVudCBzb20gZm9yZ1x1MDBlNm5nZXIgZWxsZXIgZWZ0ZXJmXHUwMGY4bGdlcg0KLQ0KLSMgRWRpdG9yQ2hvb3Nlcg0KLUVkaXRvckNob29zZXJfbG9hZGRFcnJvckRsZ1RpdGxlPVx1MDBjNWJuIGVkaXRvcg0KLUVkaXRvckNob29zZXJfUmVzb3VyY2VzRXJyb3I9RGVyIGVyIGZlamwgaSBkZXR0ZSBlbGVtZW50LiBEdSBiXHUwMGY4ciByZXR0ZSBmZWpsZW5lLCBmXHUwMGY4ciBkdSBmb3J0c1x1MDBlNnR0ZXIgKHNlIG9wbHlzbmluZ2VyKS5cblwNCi1cblwNCi1LbGlrIHBcdTAwZTUgT0sgZm9yIGF0IGZvcnRzXHUwMGU2dHRlIHVkZW4gYXQgXHUwMGU1Ym5lIGVkaXRvcmVuLiBMdWsgZGVubmUgZGlhbG9nIGZvciBhdCBcdTAwZTVibmUgZWRpdG9yZW4uDQotQ29uZmlndXJhdGlvblBhZ2VfRm9ybVByZWZpeD1Lb25maWd1cmF0aW9uOiANCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25OYW1lPU5hdm46DQotQXR0YWNobWVudERpYWxvZ0ZpbGVVUkxfdGV4dD1GaWwtVVJMOg0KLVN0ZXBzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb249Vlx1MDBlNmxnIGV0IHRyaW4sIG9nIGtsaWsgcFx1MDBlNSBPcCBlbGxlciBOZWQgZm9yIGF0IFx1MDBlNm5kcmUgZGV0cyByXHUwMGU2a2tlZlx1MDBmOGxnZS4NCi1NZXRob2RMaWJyYXJ5RWRpdG9yX2Vycl9zYXZlPUZlamwgdW5kZXIgbGFncmluZw0KLU1lc3NhZ2VWaWV3X2VycmVsZW1lbnRfdGV4dD1SZWZlcmVyZW5kZSBlbGVtZW50DQotTWVzc2FnZVZpZXdfcmVmZWxlbWVudF90ZXh0PVJlZmVyZXJldCBlbGVtZW50DQotDQotI0FjdGl2aXR5IERpYWdyYW0NCi1BY3Rpdml0eURpYWdyYW1FZGl0b3JfY3JlYXRlU3RhcnROb2RlX3RleHQ9T3ByZXQgc3RhcnRub2RlDQotQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudERlc2NyaXB0aW9uPVZcdTAwZTZsZyBkZSBtZXRvZGUtcGx1Z2lucywgaW5kaG9sZHNwYWtrZXIgb2cgcHJvY2Vzc2VyLCBkZXIgc2thbCBpbmtsdWRlcmVzIGkgZGVubmUga29uZmlndXJhdGlvbi4NCi1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbl90ZXh0PVJcdTAwZTZra2VmXHUwMGY4bGdlIGFmIGluZGhvbGRzZWxlbWVudGVyIGkgdGlscGFzc2V0IGthdGVnb3JpDQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EaXJlY3RvcnlMYWJlbD1CaWJsaW90ZWs6DQotUm9vdFByZWZQYWdlX2VuYWJsZXByb2Nlc3Njb250cmlidXRpb25fdGV4dD1Ba3Rpdlx1MDBlOXIgcHJvY2VzYmlkcmFnDQotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25fdGV4dD1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGVubmUgbWV0b2Rla29uZmlndXJhdGlvbi4NCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbkxhYmVsPUJlc2tyaXZlbHNlOg0KLUNvbnRyaWJ1dGlvblNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9Vlx1MDBlNmxnZXIgYmlkcmFneWRlcmUgZm9yICcnezB9JycNCi1FbGVtZW50c1ZpZXdfb3BlblZhcmlhYmlsaXR5RGlhbG9nQWN0aW9uX3RleHQ9XHUwMGM1Ym4gdmlhIHZhcmlhYmlsaXRldHNlbGVtZW50ZXINCi1WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGU9Vlx1MDBlNmxnZXIgdmFyaWFiaWxpdGV0c2VsZW1lbnRlciBmb3IgJyd7MH0nJw0KLVZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ192aWV3ZXJMYWJlbD1WYXJpYWJpbGl0ZXRzZWxlbWVudGVyIGZvciAnJ3swfScnDQotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0xhYmVsPVJlc3VsdGF0IGFmIGZvcm1pa29uOg0KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfZGVsZXRlX3RleHQ9S2FuIGlra2Ugc2xldHRlDQotQWN0aXZpdHlEaWFncmFtRWRpdG9yX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dD1cdTAwYzVibiBha3Rpdml0ZXRzb3BseXNuaW5nc2RpYWdyYW0gDQotTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl9kZXNjcmlwdGlvbj1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGV0dGUgbWV0b2RlYmlibGlvdGVrLg0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw9UnlkDQotV1BDb21wYXJ0bWVudEZpZ3VyZV8wPU55IGFyYmVqZHNwcm9kdWt0ZGVza3JpcHRvcg0KLXByb21wdGZvcl9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkX3RleHQ9UHVibGljXHUwMGU5ciBlbGxlciBnZW5uZW1zZSBha3Rpdml0ZXRzb3BseXNuaW5nc2RpYWdyYW1tZXIsIHNvbSBpa2tlIGVyIG9wcmV0dGV0IGkgcHJvY2VzZWRpdG9yZW4NCi1wcm9tcHRfZm9yX3B1Ymxpc2hfZXh0ZW5kX2FjdGl2aXR5X2RpYWdyYW09UHVibGljXHUwMGU5ciBlbGxlciBnZW5uZW1zZSBha3Rpdml0ZXRzZGlhZ3JhbW1lciBmb3IgdVx1MDBlNm5kcmVkZSBha3Rpdml0ZXRzdWR2aWRlbHNlcg0KLQ0KLSNDb25maWdQcm9jZXNzVmlld0RpYWxvZw0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX05hbWVQYXR0ZXJuPU5hdm5lbVx1MDBmOG5zdHJlIChtYXRjaGVuZGUgbmF2bmUgdmlzZXMpOg0KLXNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uX2xhYmVsPVZpcyBpIHJlc3NvdXJjZW5hdmlnYXRvcg0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1BhdHRlcm49TVx1MDBmOG5zdHJlIGFkc2tpbGxlcyBhZiBrb21tYWVyLCBodm9yICogPSBlbiB2aWxrXHUwMGU1cmxpZyBzdHJlbmcsID8gPSBldCB2aWxrXHUwMGU1cmxpZ3QgdGVnbg0KLWVycl9wcm9jZXNzaW5nX2ZpbGVfZGVzY3JpcHRpb249SVVQQTAwMjlFOiBEZXIgZXIgb3BzdFx1MDBlNWV0IGVuIGZlamwgdW5kZXIgYmVoYW5kbGluZyBhZiBkZW4gdmFsZ3RlIGZpbC4gS2xpayBwXHUwMGU1IE9wbHlzbmluZ2VyIGZvciBhdCBmXHUwMGU1IGZsZXJlIG9wbHlzbmluZ2VyLg0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX0NhdGVnb3J5VHlwZT1LYXRlZ29yaXR5cGU6DQotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbj1Lb3J0IGJlc2tyaXZlbHNlOg0KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1NlbGVjdENhdGVnb3JpZXM9Vlx1MDBlNmxnIGthdGVnb3JpZXINCi0NCi0jbG9nIG1lc3NhZ2VzDQotY2hlYXRzaGVldF9sb2FkX2ZhaWx1cmVfbG9nX21zZz1LYW4gaWtrZSBcdTAwZTVibmUgc255ZGVhcmtldDogDQotDQotbmV3Q29uZmlndXJhdGlvbldpcmF6ZF9jcmVhdGVFcnJvcj1JVVBBMDAzNUU6IEtvbmZpZ3VyYXRpb25lbiBrYW4gaWtrZSBvcHJldHRlcw0KLW5ld1BsdWdpbldpemFyZF9jcmVhdGVFcnJvcj1JVVBBMDAzNkU6IFBsdWdpbidlbiBrYW4gaWtrZSBvcHJldHRlcw0KLWVycm9yRGlhbG9nX21vdmVFcnJvcj1JVVBBMDAzN0U6IEVsZW1lbnRldCBrYW4gaWtrZSBmbHl0dGVzDQotcmVuYW1lRGlhbG9nX3JlbmFtZUVycm9yPUlVUEEwMDM4RTogRWxlbWVudGV0IGthbiBpa2tlIG9tZFx1MDBmOGJlcw0KLWVycm9yRGlhbG9nX2NyZWF0ZUVycm9yPUlVUEEwMDM5RTogRWxlbWVudGV0IGthbiBpa2tlIG9wcmV0dGVzDQotZHVwbGljYXRlUGx1Z2luTmFtZUVycm9yX21zZz1JVVBBMDEwMUU6IE5hdm5ldCAnJ3swfScnIGZpbmRlcyBhbGxlcmVkZS4gQW5naXYgZXQgYW5kZXQgbmF2biwgb2cgcHJcdTAwZjh2IGlnZW4uDQotDQotI05ldyBTdHJpbmdzIGZvciBQcm9jZXNzRWRpdG9yIENvbnRleHQgbWVudSBkaWFncmFtIGltYWdlcw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFESW1hZ2U9VGlsZGVsIEFELWJpbGxlZGUuLi4NCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlPU9wZnJpc2tuaW5nc2ZlamwNCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvck1zZz1GZWpsIHVuZGVyIG9wZnJpc2tuaW5nIGFmIGVkaXRvcg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFEREltYWdlPVRpbGRlbCBBREQtYmlsbGVkZS4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZFdQREltYWdlPVRpbGRlbCBXUEQtYmlsbGVkZS4uLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFESW1hZ2VJblB1Ymxpc2hpbmc9QnJ1ZyBBRC1iaWxsZWRlIGkgcHVibGljZXJpbmcNCi1Qcm9jZXNzRWRpdG9yX3Byb21wdFRvRGVsZXRlQmVmb3JlU3VwcHJlc3M9RGUgdW5kZXJ0cnlrdGUgZGVza3JpcHRvcmVyIGkgT3BseXNuaW5nZXIgc2thbCBzbGV0dGVzIGZvciBhdCB1bmRnXHUwMGU1IHNhbW1lbmZhbGQgZWZ0ZXIgdW5kZXJ0cnlra2Vsc2UgYWYgZGUgdmFsZ3RlIGVsZW1lbnRlci4gS2xpayBwXHUwMGU1IE9LLCBodmlzIGR1IHZpbCBzbGV0dGUgZGVtIG9nIGZvcnRzXHUwMGU2dHRlLg0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFEREltYWdlSW5QdWJsaXNoaW5nPUJydWcgQURELWJpbGxlZGUgaSBwdWJsaWNlcmluZw0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZVdQREltYWdlSW5QdWJsaXNoaW5nPUJydWcgV1BELWJpbGxlZGUgaSBwdWJsaWNlcmluZw0KLVByb2Nlc3NFZGl0b3JfRGlhZ3JhbUltYWdlX0lucHV0RGlhbG9nX2luaXRpYWxWYWx1ZT1CaWxsZWRzdGkNCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TaG93TGlua2VkRWxlbWVudGluTGlicmFyeVZpZXc9JlZpcyBsaW5rZXQgZWxlbWVudCBpIG92ZXJzaWd0ZW4gQmlibGlvdGVrDQotUHJvY2Vzc0VkaXRvcl91cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uX2xhYmVsPU9wZGF0XHUwMGU5ciB1bmRlcnRyeWtrZWxzZSBmcmEgJmJhc2lzDQotUHJvY2Vzc0VkaXRvcl9Db250ZXh0TWVudV9EaWFncmFtSW1hZ2VzPURpYWdyYW1iaWxsZWRlcg0KLQ0KLSNTdHJpbmdzIGZvciBzeW5jaHJvbml6YXRpb24gd2l6YXJkIG9uIHByb2Nlc3MgZWRpdG9yJ3MgQlMNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RpdGxlPVN5bmtyb25pc2VyaW5nc2Jlc2tyaXZlbHNlDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90ZXh0PUxcdTAwZTZzIG9wbHlzbmluZ2VybmUgbmVkZW5mb3IsIHNvbSBiZXNrcml2ZXIsIGh2YWQgdGlscGFzc2V0IHN5bmtyb25pc2VyaW5nIHZpbCBtZWRmXHUwMGY4cmUuDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9Vlx1MDBlNmxnIGtvbmZpZ3VyYXRpb24NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0PVZcdTAwZTZsZyBkZW4ga29uZmlndXJhdGlvbiwgZHUgdmlsIGJydWdlIHRpbCBzeW5rcm9uaXNlcmluZ2VuLiBcDQotRGl0IHZhbGcgYmVzdGVtbWVyLCBodmlsa2UgYmlkcmFnIG9nIGVyc3RhdG5pbmdlciBkZXIgdmlsIGJsaXZlIGJydWd0IHRpbCBzeW5rcm9uaXNlcmluZ2VuLg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX2NvbmZpZ0xhYmVsPUtvbmZpZ3VyYXRpb246DQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RpdGxlPVZcdTAwZTZsZyBlZ2Vuc2thYmVyLCBkZXIgc2thbCBzeW5rcm9uaXNlcmVzDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Byb3BlcnRpZXNfbGFibGU9RWdlbnNrYWJlcg0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9uYW1lX2xhYmxlPU5hdm4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJlc2VudGF0aW9uTmFtZV9sYWJsZT1Qclx1MDBlNnNlbnRhdGlvbnNuYXZuDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2JyaWVmRGVzY19sYWJsZT1Lb3J0IGJlc2tyaXZlbHNlDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX29wdGlvbmFsSW5vdXRzX2xhYmVsPVZhbGdmcmkgaW5wdXQNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbWFuZGF0b3J5SW5wdXRzX2xhYmxlPVBcdTAwZTVrclx1MDBlNnZlZGUgaW5wdXQNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3V0cHV0c19sYWJlbD1PdXRwdXQNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJpbWFyeVBlcmZvcm1lcl9sYWJlbD1QcmltXHUwMGU2ciB1ZGZcdTAwZjhyZW5kZQ0KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9hZGRuUGVyZm9ybWVyc19sYWJsZT1ZZGVybGlnZXJlIHVkZlx1MDBmOHJlbmRlDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Jlc3BvbnNpYmxlUm9sZXNfbGFibGU9QW5zdmFybGlnZSByb2xsZXINCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfY29udG5BcnRpZmFjdHNfbGFiZWw9SW5kZWhvbGR0ZSBhcnRlZmFrdGVyDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2RpbHZlZFBhcnRzX2xhYmVsPUxldmVyYW5jZWRlbGUNCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfc2VsU3RlcHNfbGFiZWw9VmFsZyBhZiB0cmluDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RleHQ9Vlx1MDBlNmxnIGVnZW5za2FiZXJuZSBmb3IgZGV0IG1ldG9kZWluZGhvbGQsIGRlciBza2FsIG92ZXJ2ZWplcyBtZWQgaGVuc3luIHRpbCBzeW5rcm9uaXNlcmluZy4NCi1zeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGl0bGU9VmlzIHJlc3VsdGF0IGFmIHN5bmtyb25pc2VyaW5nDQotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RleHQ9R2VubmVtc2UgZGUgZm9yZXNsXHUwMGU1ZWRlIHN5bmtyb25pc2VyaW5nc29wbHlzbmluZ2VyIG5lZGVuZm9yLg0KLXNlbGVjdEVkaXRvcnNUb0Rpc2NhcmRDb25mbGljdENoYW5nZXM9RGVyIGVyIGVuIGtvbmZsaWt0IG1lbGxlbSBpa2tlLWdlbXRlIFx1MDBlNm5kcmluZ2VyIG9nIFx1MDBlNm5kcmluZ2VyLCBkZXIgZXIgZm9yZXRhZ2V0IHVkZW4gZm9yIGVkaXRvcmVybmUuXG5cDQotVlx1MDBlNmxnIGRlIFx1MDBmOG5za2VkZSBlZGl0b3JlciBmb3IgYXQgc2xldHRlIGRlcmVzIFx1MDBlNm5kcmluZ2VyLg0KLXN5bmNocm9uaXphdGlvbldpemFyZF90aXRsZV90ZXh0PVN5bmtyb25pc2VyaW5nc2d1aWRlDQotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV9leHBsYWluVGV4dD1EZW5uZSBndWlkZSBoalx1MDBlNmxwZXIgbWVkIGF0IG9wZnJpc2tlIGRlIHZhbGd0ZSBkZXNrcmlwdG9yZXIgZWxsZXIgYWxsZSBkZXNrcmlwdG9yZXIgdW5kZXIgZGUgdmFsZ3RlIGFrdGl2aXRldGVyLCBkZXIgZXIgbWFya2VyZXQgc29tICJTeW5rcm9uaXNlcmV0IG1lZCBraWxkZSIgcFx1MDBlNSBza2lsbGVibGFkZXQgR2VuZXJlbHQgaSBkZXJlcyBlZ2Vuc2thYnNvdmVyc2lndC4gXA0KLUt1biBkZSBlZ2Vuc2thYmVyLCBzb20gZHUgdlx1MDBlNmxnZXIgaSBkZW5uZSBndWlkZSwgYmxpdmVyIG9wZnJpc2tldCBpIGRlc2tyaXB0b3Jlcm5lLiBcDQotRHUga2FuIG9nc1x1MDBlNSB2XHUwMGU2bGdlIGVuIGd5bGRpZyBrb25maWd1cmF0aW9uIGZvciBkaW4gcHJvY2VzLCBzb20gc2thbCBicnVnZXMgdmVkIGJlcmVnbmluZyBhZiBvcGZyaXNrbmluZ2VuLiBcDQotQmVtXHUwMGU2cmssIGF0IGd1aWRlbiBpa2tlIG9wZGF0ZXJlciBkeW5hbWlzayBsaW5rZWRlIChnclx1MDBmOG4ga3Vyc2l2KSBkZXNrcmlwdG9yZXIuDQotDQotb3BlblJURT1cdTAwYzVibiBSaWNoIFRleHQgRWRpdG9yDQotY2xvc2VSVEU9THVrIFJpY2ggVGV4dCBFZGl0b3INCi0NCi0jTmV3IFN0cmluZ3MNCi1yb2xlc2V0c19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFkbWluaXN0clx1MDBlOXIgZGVuIHZlamxlZG5pbmcsIHNvbSBoXHUwMGY4cmVyIHRpbCBkZXR0ZSByb2xsZXNcdTAwZTZ0Lg0KLWRpc2NpcGxpbmVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZW4gdmVqbGVkbmluZywgc29tIGhcdTAwZjhyZXIgdGlsIGRlbm5lIGRpc2NpcGxpbi4NCi13b3JrcHJvZHVjdHR5cGVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZW4gdmVqbGVkbmluZywgc29tIGhcdTAwZjhyZXIgdGlsIGRlbm5lIGFyYmVqZHNwcm9kdWt0dHlwZS4NCi1kb21haW5zX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZW4gdmVqbGVkbmluZywgc29tIGhcdTAwZjhyZXIgdGlsIGRldHRlIGRvbVx1MDBlNm5lLg0KLXRvb2xzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZW4gdmVqbGVkbmluZywgc29tIGhcdTAwZjhyZXIgdGlsIGRldHRlIHZcdTAwZTZya3RcdTAwZjhqLg0KLWN1c3RvbWNhdGVnb3J5X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZW4gdmVqbGVkbmluZywgc29tIGhcdTAwZjhyZXIgdGlsIGRlbm5lIHRpbHBhc3NlZGUga2F0ZWdvcmkuDQotDQotY29uY2VwdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFkbWluaXN0clx1MDBlOXIgZGVuIHZlamxlZG5pbmcsIHNvbSBoXHUwMGY4cmVyIHRpbCBkZXR0ZSBiZWdyZWIuDQotY2hlY2tsaXN0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZW4gdmVqbGVkbmluZywgc29tIGhcdTAwZjhyZXIgdGlsIGRlbm5lIHRqZWtsaXN0ZS4NCi1leGFtcGxlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZW4gdmVqbGVkbmluZywgc29tIGhcdTAwZjhyZXIgdGlsIGRldHRlIGVrc2VtcGVsLg0KLWd1aWRlbGluZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFkbWluaXN0clx1MDBlOXIgZGVuIHZlamxlZG5pbmcsIHNvbSBoXHUwMGY4cmVyIHRpbCBkZW5uZSByZXRuaW5nc2xpbmplLg0KLXJvYWRtYXBfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1BZG1pbmlzdHJcdTAwZTlyIGRlbiB2ZWpsZWRuaW5nLCBzb20gaFx1MDBmOHJlciB0aWwgZGVubmUgdmVqdmlzZXIuDQotcmV1c2FibGVhc3NldF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFkbWluaXN0clx1MDBlOXIgZGVuIHZlamxlZG5pbmcsIHNvbSBoXHUwMGY4cmVyIHRpbCBkZXR0ZSBnZW5hbnZlbmRlbGlnZSBha3Rpdi4NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1BZG1pbmlzdHJcdTAwZTlyIGRlbiB2ZWpsZWRuaW5nLCBzb20gaFx1MDBmOHJlciB0aWwgZGV0dGUgc3RcdTAwZjh0dGVtYXRlcmlhbGUuDQotcmVwb3J0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZW4gdmVqbGVkbmluZywgc29tIGhcdTAwZjhyZXIgdGlsIGRlbm5lIHJhcHBvcnQuDQotcHJhY3RpY2VfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1BZG1pbmlzdHJcdTAwZTlyIGRlbiB2ZWpsZWRuaW5nLCBzb20gaFx1MDBmOHJlciB0aWwgZGVubmUgXHUwMGY4dmVsc2UuDQotdGVtcGxhdGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1BZG1pbmlzdHJcdTAwZTlyIGRlbiB2ZWpsZWRuaW5nLCBzb20gaFx1MDBmOHJlciB0aWwgZGVubmUgc2thYmVsb24uDQotdGVybWRlZmluaXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1BZG1pbmlzdHJcdTAwZTlyIGRlbiB2ZWpsZWRuaW5nLCBzb20gaFx1MDBmOHJlciB0aWwgZGVubmUgdGVybWRlZmluaXRpb24uDQotdG9vbG1lbnRvcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFkbWluaXN0clx1MDBlOXIgZGVuIHZlamxlZG5pbmcsIHNvbSBoXHUwMGY4cmVyIHRpbCBkZW5uZSB2XHUwMGU2cmt0XHUwMGY4anNtZW50b3IuDQotd2hpdGVwYXBlcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPUFkbWluaXN0clx1MDBlOXIgZGVuIHZlamxlZG5pbmcsIHNvbSBoXHUwMGY4cmVyIHRpbCBkZW5uZSBodmlkYm9nLg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249QWRtaW5pc3RyXHUwMGU5ciBkZW4gdmVqbGVkbmluZywgc29tIGhcdTAwZjhyZXIgdGlsIGRlbm5lIGVzdGltZXJpbmdzb3ZlcnZlamVsc2UuDQotDQotDQotI05ldyBTdHJpbmcgU2VjdGlvbiBEZXNjcmlwdGlvbg0KLXJvbGVfZGV0YWlsU2VjdGlvbl9kZXNjPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIHJvbGxlLg0KLXJvbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIHJvbGxlLg0KLXJvbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5naXYsIGh2b3JkYW4gZGVubmUgcm9sbGUgZXIgcmVsYXRlcmV0IHRpbCBlbiBhbmRlbiByb2xsZS4NCi1yb2xlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGVubmUgcm9sbGUuDQotDQotdGFza19kZXRhaWxTZWN0aW9uX2Rlc2M9QW5naXYgZGV0YWxqZXJlZGUgb3BseXNuaW5nZXIgb20gZGVubmUgb3BnYXZlLg0KLXRhc2tfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIG9wZ2F2ZS4NCi10YXNrX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRlbm5lIG9wZ2F2ZSBlciByZWxhdGVyZXQgdGlsIGVuIGFuZGVuIG9wZ2F2ZS4NCi10YXNrX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGVubmUgb3BnYXZlLg0KLQ0KLWFydGlmYWN0X2RldGFpbFNlY3Rpb25fZGVzYz1BbmdpdiBkZXRhbGplcmVkZSBvcGx5c25pbmdlciBvbSBkZXR0ZSBhcnRlZmFrdC4NCi1hcnRpZmFjdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGV0dGUgYXJ0ZWZha3QuDQotYXJ0aWZhY3RfaWNvblNlY3Rpb25fZGVzYz1UaWxwYXMgaWtvbmVybmUgZm9yIGRldHRlIGFydGVmYWt0Lg0KLWFydGlmYWN0X25vdGF0aW9uU2VjdGlvbl9kZXNjPUFuZ2l2IGxldmVyaW5nc29wbHlzbmluZ2VyIG9tIGRldHRlIGFydGVmYWt0Lg0KLWFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1BbmdpdiB0aWxwYXNuaW5nc29wbHlzbmluZ2VyIG9tIGRldHRlIGFydGVmYWt0Lg0KLWFydGlmYWN0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRldHRlIGFydGVmYWt0IGVyIHJlbGF0ZXJldCB0aWwgZXQgYW5kZXQgYXJ0ZWZha3QuDQotYXJ0aWZhY3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSBkZXR0ZSBhcnRlZmFrdC4NCi0NCi1vdXRjb21lX2RldGFpbFNlY3Rpb25fZGVzYz1BbmdpdiBkZXRhbGplcmVkZSBvcGx5c25pbmdlciBvbSBkZXR0ZSByZXN1bHRhdC4NCi1vdXRjb21lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSBkZXR0ZSByZXN1bHRhdC4NCi1vdXRjb21lX2ljb25TZWN0aW9uX2Rlc2M9VGlscGFzIGlrb25lcm5lIGZvciBkZXR0ZSByZXN1bHRhdC4NCi1vdXRjb21lX25vdGF0aW9uU2VjdGlvbl9kZXNjPUFuZ2l2IGxldmVyaW5nc29wbHlzbmluZ2VyIG9tIGRldHRlIHJlc3VsdGF0Lg0KLW91dGNvbWVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPUFuZ2l2IHRpbHBhc25pbmdzb3BseXNuaW5nZXIgb20gZGV0dGUgcmVzdWx0YXQuDQotb3V0Y29tZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdpdiwgaHZvcmRhbiBkZXR0ZSByZXN1bHRhdCBlciByZWxhdGVyZXQgdGlsIGV0IGFuZGV0IHJlc3VsdGF0Lg0KLW91dGNvbWVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSBkZXR0ZSByZXN1bHRhdC4NCi0NCi1kZWxpdmVyYWJsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9QW5naXYgZGV0YWxqZXJlZGUgb3BseXNuaW5nZXIgb20gZGVubmUgbGV2ZXJhbmNlLg0KLWRlbGl2ZXJhYmxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSBkZW5uZSBsZXZlcmFuY2UuDQotZGVsaXZlcmFibGVfaWNvblNlY3Rpb25fZGVzYz1UaWxwYXMgaWtvbmVybmUgZm9yIGRlbm5lIGxldmVyYW5jZS4NCi1kZWxpdmVyYWJsZV9ub3RhdGlvblNlY3Rpb25fZGVzYz1BbmdpdiBsZXZlcmluZ3NvcGx5c25pbmdlciBvbSBkZW5uZSBsZXZlcmFuY2UuDQotZGVsaXZlcmFibGVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPUFuZ2l2IHRpbHBhc25pbmdzb3BseXNuaW5nZXIgb20gZGVubmUgbGV2ZXJhbmNlLg0KLWRlbGl2ZXJhYmxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRlbm5lIGxldmVyYW5jZSBlciByZWxhdGVyZXQgdGlsIGVuIGFuZGVuIGxldmVyYW5jZS4NCi1kZWxpdmVyYWJsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiB2ZXJzaW9uc29wbHlzbmluZ2VyIG9tIGRlbm5lIGxldmVyYW5jZS4NCi0NCi1kaXNjaXBsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1BbmdpdiBkZXRhbGplcmVkZSBvcGx5c25pbmdlciBvbSBkZW5uZSBkaXNjaXBsaW4uDQotZGlzY2lwbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGVubmUgZGlzY2lwbGluLg0KLWRpc2NpcGxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5naXYsIGh2b3JkYW4gZGVubmUgZGlzY2lwbGluIGVyIHJlbGF0ZXJldCB0aWwgZW4gYW5kZW4gZGlzY2lwbGluLg0KLWRpc2NpcGxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSBkZW5uZSBkaXNjaXBsaW4uDQotDQotZG9tYWluX2RldGFpbFNlY3Rpb25fZGVzYz1BbmdpdiBkZXRhbGplcmVkZSBvcGx5c25pbmdlciBvbSBkZXR0ZSBkb21cdTAwZTZuZS4NCi1kb21haW5fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRldHRlIGRvbVx1MDBlNm5lLg0KLWRvbWFpbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdpdiwgaHZvcmRhbiBkZXR0ZSBkb21cdTAwZTZuZSBlciByZWxhdGVyZXQgdGlsIGV0IGFuZGV0IGRvbVx1MDBlNm5lLg0KLWRvbWFpbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiB2ZXJzaW9uc29wbHlzbmluZ2VyIG9tIGRldHRlIGRvbVx1MDBlNm5lLg0KLQ0KLXdvcmtwcm9kdWN0dHlwZV9kZXRhaWxTZWN0aW9uX2Rlc2M9QW5naXYgZGV0YWxqZXJlZGUgb3BseXNuaW5nZXIgb20gZGVubmUgYXJiZWpkc3Byb2R1a3R0eXBlLg0KLXdvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGVubmUgYXJiZWpkc3Byb2R1a3R0eXBlLg0KLXdvcmtwcm9kdWN0dHlwZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdpdiwgaHZvcmRhbiBkZW5uZSBhcmJlamRzcHJvZHVrdHR5cGUgZXIgcmVsYXRlcmV0IHRpbCBlbiBhbmRlbiBhcmJlamRzcHJvZHVrdHR5cGUuDQotd29ya3Byb2R1Y3R0eXBlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGVubmUgYXJiZWpkc3Byb2R1a3R0eXBlLg0KLQ0KLXJvbGVzZXRfZGV0YWlsU2VjdGlvbl9kZXNjPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRldHRlIHJvbGxlc1x1MDBlNnQuDQotcm9sZXNldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGV0dGUgcm9sbGVzXHUwMGU2dC4NCi1yb2xlc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRldHRlIHJvbGxlc1x1MDBlNnQgZXIgcmVsYXRlcmV0IHRpbCBldCBhbmRldCByb2xsZXNcdTAwZTZ0Lg0KLXJvbGVzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSBkZXR0ZSByb2xsZXNcdTAwZTZ0Lg0KLQ0KLXRvb2xfZGV0YWlsU2VjdGlvbl9kZXNjPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRldHRlIHZcdTAwZTZya3RcdTAwZjhqLg0KLXRvb2xfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRldHRlIHZcdTAwZTZya3RcdTAwZjhqLg0KLXRvb2xfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5naXYsIGh2b3JkYW4gZGV0dGUgdlx1MDBlNnJrdFx1MDBmOGogZXIgcmVsYXRlcmV0IHRpbCBldCBhbmRldCB2XHUwMGU2cmt0XHUwMGY4ai4NCi10b29sX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGV0dGUgdlx1MDBlNnJrdFx1MDBmOGouDQotDQotY29uY2VwdF9kZXRhaWxTZWN0aW9uX2Rlc2M9QW5naXYgZGV0YWxqZXJlZGUgb3BseXNuaW5nZXIgb20gZGV0dGUgYmVncmViLg0KLWNvbmNlcHRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRldHRlIGJlZ3JlYi4NCi1jb25jZXB0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRldHRlIGJlZ3JlYiBlciByZWxhdGVyZXQgdGlsIGV0IGFuZGV0IGJlZ3JlYi4NCi1jb25jZXB0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGV0dGUgYmVncmViLg0KLQ0KLWNoZWNrbGlzdF9kZXRhaWxTZWN0aW9uX2Rlc2M9QW5naXYgZGV0YWxqZXJlZGUgb3BseXNuaW5nZXIgb20gZGVubmUgdGpla2xpc3RlLg0KLWNoZWNrbGlzdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGVubmUgdGpla2xpc3RlLg0KLWNoZWNrbGlzdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdpdiwgaHZvcmRhbiBkZW5uZSB0amVrbGlzdGUgZXIgcmVsYXRlcmV0IHRpbCBlbiBhbmRlbiB0amVrbGlzdGUuDQotY2hlY2tsaXN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGVubmUgdGpla2xpc3RlLg0KLQ0KLWV4YW1wbGVfZGV0YWlsU2VjdGlvbl9kZXNjPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRldHRlIGVrc2VtcGVsDQotZXhhbXBsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGV0dGUgZWtzZW1wZWwuDQotZXhhbXBsZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdpdiwgaHZvcmRhbiBkZXR0ZSBla3NlbXBlbCBlciByZWxhdGVyZXQgdGlsIGV0IGFuZGV0IGVrc2VtcGVsLg0KLWV4YW1wbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSBkZXR0ZSBla3NlbXBlbC4NCi0NCi1ndWlkZWxpbmVfZGV0YWlsU2VjdGlvbl9kZXNjPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIHJldG5pbmdzbGluamUuDQotZ3VpZGVsaW5lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSBkZW5uZSByZXRuaW5nc2xpbmplLg0KLWd1aWRlbGluZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdpdiwgaHZvcmRhbiBkZW5uZSByZXRuaW5nc2xpbmplIGVyIHJlbGF0ZXJldCB0aWwgZW4gYW5kZW4gcmV0bmluZ3NsaW5qZS4NCi1ndWlkZWxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSBkZW5uZSByZXRuaW5nc2xpbmplLg0KLQ0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2RldGFpbFNlY3Rpb25fZGVzYz1BbmdpdiBkZXRhbGplcmVkZSBvcGx5c25pbmdlciBvbSBkZW5uZSBlc3RpbWVyaW5nc292ZXJ2ZWplbHNlLg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSBkZW5uZSBlc3RpbWVyaW5nc292ZXJ2ZWplbHNlLg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRlbm5lIGVzdGltZXJpbmdzb3ZlcnZlamVsc2UgZXIgcmVsYXRlcmV0IHRpbCBlbiBhbmRlbiBlc3RpbWVyaW5nc292ZXJ2ZWplbHNlLg0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGVubmUgZXN0aW1lcmluZ3NvdmVydmVqZWxzZS4NCi0NCi1wcmFjdGljZV9kZXRhaWxTZWN0aW9uX2Rlc2M9QW5naXYgZGV0YWxqZXJlZGUgb3BseXNuaW5nZXIgb20gZGVubmUgXHUwMGY4dmVsc2UuDQotcHJhY3RpY2VfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIFx1MDBmOHZlbHNlLg0KLXByYWN0aWNlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRlbm5lIFx1MDBmOHZlbHNlIGVyIHJlbGF0ZXJldCB0aWwgZW4gYW5kZW4gXHUwMGY4dmVsc2UuDQotcHJhY3RpY2VfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSBkZW5uZSBcdTAwZjh2ZWxzZS4NCi0NCi1yZXBvcnRfZGV0YWlsU2VjdGlvbl9kZXNjPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIHJhcHBvcnQuDQotcmVwb3J0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSBkZW5uZSByYXBwb3J0Lg0KLXJlcG9ydF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdpdiwgaHZvcmRhbiBkZW5uZSByYXBwb3J0IGVyIHJlbGF0ZXJldCB0aWwgZW4gYW5kZW4gcmFwcG9ydC4NCi1yZXBvcnRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSBkZW5uZSByYXBwb3J0Lg0KLQ0KLXJlc3VhYmxlYXNzZXRfZGV0YWlsU2VjdGlvbl9kZXNjPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRldHRlIGdlbmFudmVuZGVsaWdlIGFrdGl2Lg0KLXJlc3VhYmxlYXNzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRldHRlIGdlbmFudmVuZGVsaWdlIGFrdGl2Lg0KLXJlc3VhYmxlYXNzZXRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9QW5naXYsIGh2b3JkYW4gZGV0dGUgZ2VuYW52ZW5kZWxpZ2UgYWt0aXYgZXIgcmVsYXRlcmV0IHRpbCBldCBhbmRldCBnZW5hbnZlbmRlbGlndCBha3Rpdi4NCi1yZXN1YWJsZWFzc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGV0dGUgZ2VuYW52ZW5kZWxpZ2UgYWt0aXYuDQotDQotcm9hZG1hcF9kZXRhaWxTZWN0aW9uX2Rlc2M9QW5naXYgZGV0YWxqZXJlZGUgb3BseXNuaW5nZXIgb20gZGVubmUgdmVqdmlzZXIuDQotcm9hZG1hcF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGVubmUgdmVqdmlzZXIuDQotcm9hZG1hcF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdpdiwgaHZvcmRhbiBkZW5uZSB2ZWp2aXNlciBlciByZWxhdGVyZXQgdGlsIGVuIGFuZGVuIHZlanZpc2VyLg0KLXJvYWRtYXBfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSBkZW5uZSB2ZWp2aXNlci4NCi0NCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZGV0YWlsU2VjdGlvbl9kZXNjPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRldHRlIHN0XHUwMGY4dHRlbWF0ZXJpYWxlLg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGV0dGUgc3RcdTAwZjh0dGVtYXRlcmlhbGUuDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRldHRlIHN0XHUwMGY4dHRlbWF0ZXJpYWxlIGVyIHJlbGF0ZXJldCB0aWwgYW5kZXQgc3RcdTAwZjh0dGVtYXRlcmlhbGUuDQotc3VwcG9ydGluZ21hdGVyaWFsX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGV0dGUgc3RcdTAwZjh0dGVtYXRlcmlhbGUuDQotDQotdGVtcGxhdGVfZGV0YWlsU2VjdGlvbl9kZXNjPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIHNrYWJlbG9uLg0KLXRlbXBsYXRlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSBkZW5uZSBza2FiZWxvbi4NCi10ZW1wbGF0ZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdpdiwgaHZvcmRhbiBkZW5uZSBza2FiZWxvbiBlciByZWxhdGVyZXQgdGlsIGVuIGFuZGVuIHNrYWJlbG9uLg0KLXRlbXBsYXRlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGVubmUgc2thYmVsb24uDQotDQotdGVybWRlZmluaXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIHRlcm1kZWZpbml0aW9uLg0KLXRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSBkZW5uZSB0ZXJtZGVmaW5pdGlvbi4NCi10ZXJtZGVmaW5pdGlvbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdpdiwgaHZvcmRhbiBkZW5uZSB0ZXJtZGVmaW5pdGlvbiBlciByZWxhdGVyZXQgdGlsIGVuIGFuZGVuIHRlcm1kZWZpbml0aW9uLg0KLXRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGVubmUgdGVybWRlZmluaXRpb24uDQotDQotdG9vbG1lbnRvcl9kZXRhaWxTZWN0aW9uX2Rlc2M9QW5naXYgZGV0YWxqZXJlZGUgb3BseXNuaW5nZXIgb20gZGVubmUgdlx1MDBlNnJrdFx1MDBmOGpzbWVudG9yLg0KLXRvb2xtZW50b3JfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIHZcdTAwZTZya3RcdTAwZjhqc21lbnRvci4NCi10b29sbWVudG9yX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRlbm5lIHZcdTAwZTZya3RcdTAwZjhqc21lbnRvciBlciByZWxhdGVyZXQgdGlsIGVuIGFuZGVuIHZcdTAwZTZya3RcdTAwZjhqc21lbnRvci4NCi10b29sbWVudG9yX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IHZlcnNpb25zb3BseXNuaW5nZXIgb20gZGVubmUgdlx1MDBlNnJrdFx1MDBmOGpzbWVudG9yLg0KLQ0KLXdoaXRlcGFwZXJfZGV0YWlsU2VjdGlvbl9kZXNjPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIGh2aWRib2cuDQotd2hpdGVwYXBlcl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGVubmUgaHZpZGJvZy4NCi13aGl0ZXBhcGVyX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRlbm5lIGh2aWRib2cgZXIgcmVsYXRlcmV0IHRpbCBlbiBhbmRlbiBodmlkYm9nLg0KLXdoaXRlcGFwZXJfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSBkZW5uZSBodmlkYm9nLg0KLQ0KLWRpc2NpcGxpbmVncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M9QW5naXYgZGV0YWxqZXJlZGUgb3BseXNuaW5nZXIgb20gZGVubmUgZGlzY2lwbGluZ3J1cHBlcmluZy4NCi1kaXNjaXBsaW5lZ3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIGRpc2NpcGxpbmdydXBwZXJpbmcuDQotZGlzY2lwbGluZWdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRlbm5lIGRpc2NpcGxpbmdydXBwZXJpbmcgZXIgcmVsYXRlcmV0IHRpbCBlbiBhbmRlbiBkaXNjaXBsaW5ncnVwcGVyaW5nLg0KLWRpc2NpcGxpbmVncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiB2ZXJzaW9uc29wbHlzbmluZ2VyIG9tIGRlbm5lIGRpc2NpcGxpbmdydXBwZXJpbmcuDQotDQotcm9sZXNldGdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYz1BbmdpdiBkZXRhbGplcmVkZSBvcGx5c25pbmdlciBvbSBkZW5uZSByb2xsZXNcdTAwZTZ0Z3J1cHBlcmluZy4NCi1yb2xlc2V0Z3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIHJvbGxlc1x1MDBlNnRncnVwcGVyaW5nLg0KLXJvbGVzZXRncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1BbmdpdiwgaHZvcmRhbiBkZW5uZSByb2xsZXNcdTAwZTZ0Z3J1cHBlcmluZyBlciByZWxhdGVyZXQgdGlsIGVuIGFuZGVuIHJvbGxlc1x1MDBlNnRncnVwcGVyaW5nLg0KLXJvbGVzZXRncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1BbmdpdiB2ZXJzaW9uc29wbHlzbmluZ2VyIG9tIGRlbm5lIHJvbGxlc1x1MDBlNnRncnVwcGVyaW5nLg0KLQ0KLWN1c3RvbWNhdGVnb3J5X2RldGFpbFNlY3Rpb25fZGVzYz1BbmdpdiBkZXRhbGplcmVkZSBvcGx5c25pbmdlciBvbSBkZW5uZSB0aWxwYXNzZWRlIGthdGVnb3JpLg0KLWN1c3RvbWNhdGVnb3J5X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPUFuZ2l2IGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSBkZW5uZSB0aWxwYXNzZWRlIGthdGVnb3JpLg0KLWN1c3RvbWNhdGVnb3J5X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPUFuZ2l2LCBodm9yZGFuIGRlbm5lIHRpbHBhc3NlZGUga2F0ZWdvcmkgZXIgcmVsYXRlcmV0IHRpbCBlbiBhbmRlbiB0aWxwYXNzZXQga2F0ZWdvcmkuDQotY3VzdG9tY2F0ZWdvcnlfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9QW5naXYgdmVyc2lvbnNvcGx5c25pbmdlciBvbSBkZW5uZSB0aWxwYXNzZWRlIGthdGVnb3JpLg0KLWN1c3RvbWNhdGVnb3J5X0ljb25TZWN0aW9uX2Rlc2M9VGlscGFzIGlrb25lcm5lIGZvciBkZW5uZSB0aWxwYXNzZWRlIGthdGVnb3JpLg0KLQ0KLWNvbmNlcHRfaWNvblNlY3Rpb25fZGVzYz1UaWxwYXMgaWtvbmVybmUgZm9yIGRldHRlIGJlZ3JlYi4NCi1jaGVja2xpc3RfaWNvblNlY3Rpb25fZGVzYz1UaWxwYXMgaWtvbmVybmUgZm9yIGRlbm5lIHRqZWtsaXN0ZS4NCi10b29sbWVudG9yX2ljb25TZWN0aW9uX2Rlc2M9VGlscGFzIGlrb25lcm5lIGZvciBkZW5uZSB2XHUwMGU2cmt0XHUwMGY4anNtZW50b3IuDQotd2hpdGVwYXBlcl9pY29uU2VjdGlvbl9kZXNjPVRpbHBhcyBpa29uZXJuZSBmb3IgZGVubmUgaHZpZGJvZy4NCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9pY29uU2VjdGlvbl9kZXNjPVRpbHBhcyBpa29uZXJuZSBmb3IgZGVubmUgZXN0aW1lcmluZ3NvdmVydmVqZWxzZS4NCi10ZXJtZGVmaW5pdGlvbl9pY29uU2VjdGlvbl9kZXNjPVRpbHBhcyBpa29uZXJuZSBmb3IgZGVubmUgdGVybWRlZmluaXRpb24uDQotdGVtcGxhdGVfaWNvblNlY3Rpb25fZGVzYz1UaWxwYXMgaWtvbmVybmUgZm9yIGRlbm5lIHNrYWJlbG9uLg0KLXJldXNhYmxlYXNzZXRfaWNvblNlY3Rpb25fZGVzYz1UaWxwYXMgaWtvbmVybmUgZm9yIGRldHRlIGdlbmFudmVuZGVsaWdlIGFrdGl2Lg0KLXJlcG9ydF9pY29uU2VjdGlvbl9kZXNjPVRpbHBhcyBpa29uZXJuZSBmb3IgZGVubmUgcmFwcG9ydC4NCi1wcmFjdGljZV9pY29uU2VjdGlvbl9kZXNjPVRpbHBhcyBpa29uZXJuZSBmb3IgZGVubmUgXHUwMGY4dmVsc2UuDQotZXhhbXBsZV9pY29uU2VjdGlvbl9kZXNjPVRpbHBhcyBpa29uZXJuZSBmb3IgZGV0dGUgZWtzZW1wZWwuDQotZ3VpZGVsaW5lX2ljb25TZWN0aW9uX2Rlc2M9VGlscGFzIGlrb25lcm5lIGZvciBkZW5uZSByZXRuaW5nc2xpbmplLg0KLXJvYWRtYXBfaWNvblNlY3Rpb25fZGVzYz1UaWxwYXMgaWtvbmVybmUgZm9yIGRlbm5lIHZlanZpc2VyLg0KLXN1cHBvcnRpbmdtYXRlcmlhbF9pY29uU2VjdGlvbl9kZXNjPVRpbHBhcyBpa29uZXJuZSBmb3IgZGV0dGUgc3RcdTAwZjh0dGVtYXRlcmlhbGUuDQotDQotZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfdGl0bGU9RmlsZW4gZXIgXHUwMGU2bmRyZXQNCi1lZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY19tZXNzYWdlPUZpbGVuIGVyIFx1MDBlNm5kcmV0IGkgZmlsc3lzdGVtZXQuIFZpbCBkdSBpbmRsXHUwMGU2c2UgXHUwMGU2bmRyaW5nZXJuZT8NCi0NCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZT1Ba3Rpdml0ZXRzdmFyaWFiaWxpdGV0DQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnPUFrdGl2aXRldGVuICcnezB9Jycga2FuIGlra2UgYW5naXZlIHZhcmlhYmlsaXRldCBtZWQgJyd7MX0nJywgZm9yZGkgJyd7MX0nJyBhbGxlcmVkZSBoYXIgZW4gZWxsZXIgZmxlcmUgYmlkcmFnbmUvZXJzdGF0dGVkZSBha3Rpdml0ZXRlciBzb20gZGVucyB1bmRlcm9yZG5lZGUuDQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMT1Ba3Rpdml0ZXRlbiAnJ3swfScnIGthbiBpa2tlIGFuZ2l2ZSB2YXJpYWJpbGl0ZXQgbWVkIGVuIGFmIGRlbnMgZGlyZWt0ZSBvdmVyb3JkbmVkZSBvZyBldmVudHVlbGxlIHByb2Nlc3Nlci4NCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cyPUFrdGl2aXRldGVuICcnezB9Jycga2FuIGlra2UgYW5naXZlIHZhcmlhYmlsaXRldCBtZWQgJyd7MX0nJywgZm9yZGkgZGV0IHZpbCByZXN1bHRlcmUgaSBjaXJrdWxcdTAwZTZyIGFmaFx1MDBlNm5naWdoZWQuDQotDQotYXBwbHlfcGF0dGVybl9lcnJvcl90aXRsZT1BbnZlbmQgbVx1MDBmOG5zdGVyDQotYXBwbHlfcGF0dGVybl9lcnJvcl9tc2c9QWt0aXZpdGV0ZW4gJyd7MH0nJyBrYW4gaWtrZSBhbnZlbmRlIG1cdTAwZjhuc3RlciBtZWQgJyd7MX0nJywgZm9yZGkgZGV0IHZpbCByZXN1bHRlcmUgaSBjaXJrdWxcdTAwZTZyIGFmaFx1MDBlNm5naWdoZWQuDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfZGVsaW1pdGVyPXwNCi1NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3Nob3dPd25lckluTGlicmFyeVZpZXc9VmlzIGVqZXIgYWYgZGVuIHVsXHUwMGY4c3RlIHJlZmVyZW5jZSBpIG92ZXJzaWd0ZW4gQmlibGlvdGVrDQotTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9yZW1vdmVVbnJlc29sdmVkUmVmZXJlbmNlPUZqZXJuIGRlbiB1bFx1MDBmOHN0ZSByZWZlcmVuY2UNCi1wcm9tcHREZWxldGVDdXN0b21DYXRlZ29yeUJlZm9yZVJlbW92ZUxhc3RSZWZUb0l0PUR1IGVyIHZlZCBhdCBzbGV0dGUgZGVuIHNpZHN0ZSByZWZlcmVuY2UgdGlsIHswfSBpIHBsdWdpbicnZW4uIEVsZW1lbnQoZXIpIGJsaXZlciBzbGV0dGV0LiBWaWwgZHUgZm9ydHNcdTAwZTZ0dGU/DQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSNCZWxvdyBwcm9wZXJ0eSAiZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzIiBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQNCi0jRG9uJ3QgZGVsZXRlIGEgc3BhY2UgYWZ0ZXIgIjogIg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzPTogDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ2NmJmMmEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXNfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25UaXRsZT1HZW5lcmVsbGUgb3BseXNuaW5nZXINCi1Qcm9jZXNzX0RvY3VtZW50SW5mb3JtYXRpb25UaXRsZT1Eb2t1bWVudGF0aW9uc29wbHlzbmluZ2VyDQotQWN0aXZpdHlfZ3VpZGFuY2VJbmZvcm1hdGlvblRpdGxlPVZlamxlZG5pbmcNCi1CcmVha2Rvd25FbGVtZW50X29wdGlvbkluZm9ybWF0aW9uVGl0bGU9TmVkYnJ5ZG5pbmdzaW5kc3RpbGxpbmdlcg0KLVRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvblRpdGxlPVRyaW4NCi0NCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1BbmdpdiB0cmluZW5lIHRpbCB1ZGZcdTAwZjhyZWxzZSBhZiBkZW5uZSBvcGdhdmVkZXNrcmlwdG9yLg0KLQ0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIHswfS4NCi1Qcm9jZXNzX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1BbmdpdiBkb2t1bWVudGF0aW9uc29wbHlzbmluZ2VyIG9tIHswfS4NCi0NCi1EZXNjcmlwdG9yX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUFuZ2l2IGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSBkZW5uZSBkZXNrcmlwdG9yLg0KLURlc2NyaXB0b3JfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1BbmdpdiBkZXRhbGplcmVkZSBvcGx5c25pbmdlciBvbSBkZW5uZSBkZXNrcmlwdG9yLg0KLU1pbGVzdG9uZV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1BbmdpdiBnZW5lcmVsbGUgb3BseXNuaW5nZXIgb20gZGVubmUgbWlsZXBcdTAwZTZsLg0KLU1pbGVzdG9uZV9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUFuZ2l2IGRldGFsamVyZWRlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIG1pbGVwXHUwMGU2bC4NCi0NCi1CcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUFuZ2l2IGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSBkZXR0ZSBuZWRicnlkbmluZ3NlbGVtZW50Lg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUFuZ2l2IGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSBkZXR0ZSBhcmJlamRzbmVkYnJ5ZG5pbmdzZWxlbWVudC4NCi1EZXNjcmlwdG9yX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0b249QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIGRlc2tyaXB0b3IuDQotQWN0aXZpdHlfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249QW5naXYgZ2VuZXJlbGxlIG9wbHlzbmluZ2VyIG9tIGRlbm5lIGFrdGl2aXRldC4NCi0NCi1CcmVha2Rvd25FbGVtZW50X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1BbmdpdiBkb2t1bWVudGF0aW9uc29wbHlzbmluZ2VyIG9tIGRldHRlIG5lZGJyeWRuaW5nc2VsZW1lbnQuDQotQWN0aXZpdHlfRG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUFuZ2l2IGRva3VtZW50YXRpb25zb3BseXNuaW5nZXIgb20gZGVubmUgYWt0aXZpdGV0Lg0KLURlc2NyaXB0b3JfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPUFuZ2l2IGRva3VtZW50YXRpb25zb3BseXNuaW5nZXIgb20gZGVubmUgZGVza3JpcHRvci4NCi1Qcm9jZXNzX05vbmU9PDwgSU5HRU4gPj4NCi1Qcm9jZXNzX25hbWU9TmF2bjoNCi1Qcm9jZXNzX1ByZXNlbnRhdGlvbk5hbWU9UHJcdTAwZTZzZW50YXRpb25zbmF2bjoNCi1Qcm9jZXNzX2JyaWVmRGVzY3JpcHRpb249S29ydCBiZXNrcml2ZWxzZToNCi1Qcm9jZXNzX21haW5EZXNjcmlwdGlvbj0gT3Zlcm9yZG5ldCBiZXNrcml2ZWxzZToNCi1Qcm9jZXNzX3B1cnBvc2U9Rm9ybVx1MDBlNWw6DQotUHJvY2Vzc19wcmVmaXg9UHJcdTAwZTZmaWtzOg0KLQ0KLUJyZWFrZG93bkVsZW1lbnRfVHlwZV9OYW1lPU5lZGJyeWRuaW5nc2VsZW1lbnQNCi0NCi1Qcm9jZXNzX1R5cGVfVGFzaz1NZXRvZGVvcGdhdmU6DQotUHJvY2Vzc19UeXBlX1JvbGU9TWV0b2Rlcm9sbGU6DQotUHJvY2Vzc19UeXBlX1dvcmtQcm9kdWN0PU1ldG9kZWFyYmVqZHNwcm9kdWt0Og0KLQ0KLVdvcmtQcm9kdWN0X1R5cGU9QXJiZWpkc3Byb2R1a3R0eXBlOg0KLQ0KLUFjdGl2aXR5X01vZGVsSW5mbz1Nb2RlbG9wbHlzbmluZ2VyOg0KLUFjdGl2aXR5X1R5cGU9QWt0aXZpdGV0c3R5cGU6DQotQWN0aXZpdHlfcHJlc2VudGF0aW9uTmFtZT1Qclx1MDBlNnNlbnRhdGlvbnNuYXZuOg0KLUFjdGl2aXR5X2FsdGVybmF0aXZlcz1BbHRlcm5hdGl2ZXI6DQotQWN0aXZpdHlfaG93VG9TdGFmZj1CZW1hbmRpbmc6DQotQnJlYWtkb3duRWxlbWVudF9rZXlDb25zaWRlcmF0aW9ucz1OXHUwMGY4Z2xlb3ZlcnZlamVsc2VyOg0KLVByb2Nlc3NfdXNhZ2VHdWlkYW5jZT1CcnVnc3ZlamxlZG5pbmc6DQotDQotQWN0aXZpdHlfUm9hZG1hcFRpdGxlPVZlanZpc2VyZQ0KLUFjdGl2aXR5X1JvYWRtYXBEZXNjcmlwdGlvbj1BbmdpdiBsaW5rIHRpbCBmbGVyZSBvcGx5c25pbmdlciBpIGZvcm0gYWYgdmVqdmlzZXJlLg0KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZVRpdGxlPUdlbmVyZWwgdmVqbGVkbmluZw0KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZURlc2NyaXB0aW9uPUFuZ2l2IGxpbmsgdGlsIGZsZXJlIG9wbHlzbmluZ2VyIGkgZm9ybSBhZiB2ZWpsZWRuaW5nLg0KLUFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbFRpdGxlPUtvbW11bmlrYXRpb25zbWF0ZXJpYWxlDQotQWN0aXZpdHlfQ29tbXVuaWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb249QW5naXYgbGluayB0aWwgZmxlcmUgb3BseXNuaW5nZXIgaSBmb3JtIGFmIGtvbW11bmlrYXRpb25zbWF0ZXJpYWxlLg0KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsVGl0bGU9VWRkYW5uZWxzZXNtYXRlcmlhbGUNCi1BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uPUFuZ2l2IGxpbmsgdGlsIGZsZXJlIG9wbHlzbmluZ2VyIGkgZm9ybSBhZiB1ZGRhbm5lbHNlc21hdGVyaWFsZS4NCi0NCi1BY3Rpdml0eV9TZWxlY3RlZF9Sb2FkbWFwPVZlanZpc2VyZToNCi1BY3Rpdml0eV9TZWxlY3RlZF9HZW5lcmFsR3VpZGFuY2U9VmVqbGVkbmluZzoNCi1BY3Rpdml0eV9TZWxlY3RlZF9Db21tdW5pY2F0aW9uTWF0ZXJpYWw9S29tbXVuaWthdGlvbnNtYXRlcmlhbGU6DQotQWN0aXZpdHlfU2VsZWN0ZWRfRWR1Y2F0aW9uTWF0ZXJpYWw9VWRkYW5uZWxzZXNtYXRlcmlhbGU6DQotDQotQWN0aXZpdHlfRGlhZ3JhbVRpdGxlPURpYWdyYW0NCi1BY3Rpdml0eV9EaWFncmFtRGVzY3JpcHRpb24gPSBBbmdpdiBkaWFncmFtYmlsbGVkZXIgdGlsIGRldHRlIHswfS4NCi1BY3Rpdml0eV9BREltYWdlPUFrdGl2aXRldHNkaWFncmFtDQotQWN0aXZpdHlfQURESW1hZ2U9QWt0aXZpdGV0c29wbHlzbmluZ3NkaWFncmFtDQotQWN0aXZpdHlfV1BESW1hZ2U9RGlhZ3JhbSBmb3IgYXJiZWpkc3Byb2R1a3RhZmhcdTAwZTZuZ2lnaGVkDQotQWN0aXZpdHlfVXNlQURJbWFnZT1CcnVnIGFrdGl2aXRldHNkaWFncmFtIHRpbCBwdWJsaWNlcmluZw0KLUFjdGl2aXR5X1VzZUFEREltYWdlPUJydWcgYWt0aXZpdGV0c29wbHlzbmluZ3NkaWFncmFtIHRpbCBwdWJsaWNlcmluZw0KLUFjdGl2aXR5X1VzZVdQREltYWdlPUJydWcgZGlhZ3JhbSBmb3IgYXJiZWpkc3Byb2R1a3RhZmhcdTAwZTZuZ2lnaGVkIHRpbCBwdWJsaWNlcmluZw0KLUFjdGl2aXR5X0Fzc2lnbj1UaWxkZWwuLi4NCi0NCi1UYXNrRGVzY3JpcHRvcl9TZWxlY3RlZF9TdGVwcz1UcmluOg0KLVRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dUaXRsZT1UcmluDQotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ01lc3NhZ2U9Vlx1MDBlNmxnIHRyaW4NCi0NCi1BY3Rpdml0eV9Xb3JrUm9sbHVwPUFyYmVqZHNrb25zb2xpZGVyaW5nDQotQWN0aXZpdHlfVGVhbVJvbGx1cD1UZWFta29uc29saWRlcmluZw0KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cD1BcmJlamRzcHJvZHVrdGtvbnNvbGlkZXJpbmcNCi1BY3Rpdml0eV9Xb3JrUm9sbHVwRGVzY3JpcHRpb249R2VubmVtc2UgYXJiZWpkc2tvbnNvbGlkZXJpbmcgZm9yIGFrdGl2aXRldGVuIGkgZGV0dGUgYWZzbml0Lg0KLUFjdGl2aXR5X1RlYW1Sb2xsdXBEZXNjcmlwdGlvbj1HZW5uZW1zZSB0ZWFta29uc29saWRlcmluZyBmb3IgYWt0aXZpdGV0ZW4gaSBkZXR0ZSBhZnNuaXQuDQotQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwRGVzY3JpcHRpb249R2VubmVtc2UgYXJiZWpkc3Byb2R1a3Rrb25zb2xpZGVyaW5nIGZvciBha3Rpdml0ZXRlbiBpIGRldHRlIGFmc25pdC4NCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9NdWx0aXBsZU9jdXJyYW5jZT1GbGVyZSBmb3Jla29tc3Rlcg0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX09wdGlvbmFsPVZhbGdmcml0DQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fUGxhbm5lZD1QbGFubGFndA0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N1cHJlc3NlZD1VbmRlcnRyeWt0DQotDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRXZlbnREcml2ZW49QWt0aXZpdGV0c3N0eXJldA0KLVdvcmtCcmVha2Rvd25FbGVtZW50X09uZ29pbmc9SWdhbmd2XHUwMGU2cmVuZGUNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9SZXBlYXRhYmxlPUthbiBnZW50YWdlcw0KLVdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29ycz1Gb3JnXHUwMGU2bmdlcmU6DQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeT1BZmhcdTAwZTZuZ2lnaGVkOg0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0lEX1RFWFQ9SW5kZWtzDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfUFJFU0VOVEFUSU9OX05BTUVfVEVYVD1Qclx1MDBlNnNlbnRhdGlvbnNuYXZuDQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfREVQRU5ERU5DWV9URVhUPUFmaFx1MDBlNm5naWdoZWQNCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0FkZD1UaWxmXHUwMGY4ag0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfRWRpdD1SZWRpZ1x1MDBlOXINCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X1JlbW92ZT1GamVybg0KLQ0KLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX1NUQVJUPVNsdXQgdGlsIHN0YXJ0DQotV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fRklOSVNIPVNsdXQgdGlsIHNsdXQNCi1Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX0ZJTklTSD1TdGFydCB0aWwgc2x1dA0KLVdvcmtPcmRlclR5cGVfU1RBUlRfVE9fU1RBUlQ9U3RhcnQgdGlsIHN0YXJ0DQotDQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3luY2hyb25pemVkPVN5bmtyb25pc2VyZXQgbWVkIGtpbGRlDQotDQotRGVzY3JpcHRvcl9SZWZpbmVkRGVzY3JpcHRpb249RGV0YWxqZXJldCBiZXNrcml2ZWxzZToNCi0NCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU9Um9sbGVyDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPVRpbGRlbCByb2xsZWRlc2tyaXB0b3Jlcm5lIHRpbCB1ZGZcdTAwZjhyZWxzZSBhZiBkZW5uZSBvcGdhdmVkZXNrcmlwdG9yDQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUxPVByaW1cdTAwZTZyIHVkZlx1MDBmOHJlbmRlOg0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMj1ZZGVybGlnZXJlIHVkZlx1MDBmOHJlbmRlOg0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMz1Bc3Npc3RlcmV0IGFmOg0KLQ0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9QXJiZWpkc3Byb2R1a3Rlcg0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249QW5naXYgaW5wdXQtIG9nIG91dHB1dGFyYmVqZHNwcm9kdWt0ZGVza3JpcHRvcmVyIGZvciBkZW5uZSBvcGdhdmVkZXNrcmlwdG9yLg0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTE9UFx1MDBlNWtyXHUwMGU2dmV0IGlucHV0Og0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI9VmFsZ2ZyaXQgaW5wdXQ6DQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMz1Fa3N0ZXJudCBpbnB1dDoNCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGU0PU91dHB1dDoNCi0NCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uVGl0bGU9T3BnYXZlcg0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1NlY3Rpb25EZXNjcmlwdGlvbj1EZW5uZSByb2xsZWRlc2tyaXB0b3IgdWRmXHUwMGY4cmVyIGZcdTAwZjhsZ2VuZGUgb3BnYXZlZGVza3JpcHRvcmVyLg0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMT1QcmltXHUwMGU2ciB1ZGZcdTAwZjhyZW5kZToNCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTI9WWRlcmxpZ2VyZSB1ZGZcdTAwZjhyZW5kZToNCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTM9QXNzaXN0ZXJldCBhZjoNCi0NCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlPUFyYmVqZHNwcm9kdWt0ZXINCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvbkRlc2NyaXB0aW9uPURlbm5lIHJvbGxlZGVza3JpcHRvciBlciBhbnN2YXJsaWcgZm9yIG9nIFx1MDBlNm5kcmVyIGZcdTAwZjhsZ2VuZGUgYXJiZWpkc3Byb2R1a3RkZXNrcmlwdG9yZXIuDQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1BbnN2YXJsaWcgZm9yOg0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI9XHUwMGM2bmRyZXI6DQotDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1Sb2xsZXINCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPUZcdTAwZjhsZ2VuZGUgcm9sbGVkZXNrcmlwdG9yZXIgZXIgYW5zdmFybGlnIGZvciBvZyBcdTAwZTZuZHJlciBkZW5uZSBhcmJlamRzcHJvZHVrdGRlc2tyaXB0b3IuDQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMT1BbnN2YXJsaWcgZm9yOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9XHUwMGM2bmRyZXQgYWY6DQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1R5cGU9VHlwZToNCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlPUFrdGl2aXRldHNpbmRnYW5nc3RpbHN0YW5kOg0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZT1Ba3Rpdml0ZXRzdWRnYW5nc3RpbHN0YW5kOg0KLQ0KLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvblRpdGxlPUxldmVyYW5jZWRlbGUNCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25EZXNjcmlwdGlvbj1MZXZlcmFuY2VuIGhhciBmXHUwMGY4bGdlbmRlIGRlbGUsIHNvbSBrYW4gbGV2ZXJlcy4NCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1RhYmxlMT1MZXZlcmFuY2VkZWxlDQotDQotUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uVGl0bGU9VGVhbXMNCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25EZXNjcmlwdGlvbj1EZW5uZSByb2xsZWRlc2tyaXB0b3IgaGVudmlzZXIgdGlsIGZcdTAwZjhsZ2VuZGUgdGVhbXMuDQotUm9sZURlc2NyaXB0b3JfVGVhbV9UYWJsZTE9VGVhbXM6DQotDQotQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25UaXRsZT1Sb2xsZXINCi1Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uPURlbm5lIHNhbW1lbnNhdHRlIHJvbGxlIGhhciBmXHUwMGY4bGdlbmRlIHNhbWxlZGUgcm9sbGVyOg0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9UYWJsZTE9U2FtbGVkZSByb2xsZXI6DQotDQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uVGl0bGU9Um9sbGVyDQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb249VGlsZlx1MDBmOGogdGlsIGVsbGVyIGZqZXJuIHJvbGxlciBmcmEgdGVhbXByb2ZpbGVuLg0KLVRlYW1Qcm9maWxlX1JvbGVfVGFibGUxPVJvbGxlcjoNCi0NCi1Qcm9jZXNzX1JpY2hUZXh0X0NvbGxhcHNlSW1hZ2U9Y29sbGFwc2VkLmdpZg0KLVByb2Nlc3NfUmljaFRleHRfRXhwYW5kSW1hZ2U9ZXhwYW5kZWQuZ2lmDQotUHJvY2Vzc19BZGQ9VGlsZlx1MDBmOGouLi4NCi1Qcm9jZXNzX0FkZEZyb21Qcm9jZXNzPVRpbGZcdTAwZjhqIGZyYSBwcm9jZXMuLi4NCi1Qcm9jZXNzX1JlbmFtZV9NZXNzYWdlPUR1IGVyIHZlZCBhdCBcdTAwZTZuZHJlIG5hdm5ldCBwXHUwMGU1IHByb2Nlc3Nlbi4gRGVubmUgZnVua3Rpb24gZ2VtbWVyIGVkaXRvcmVuIG9nIG9tZFx1MDBmOGJlciBwcm9jZXNmb2xkZXJlbiB0aWwgZGV0IG55ZSBuYXZuLiBWaWwgZHUgZm9ydHNcdTAwZTZ0dGU/DQotUHJvY2Vzc19SZW1vdmU9Rmplcm4NCi1Qcm9jZXNzX1VwPU9wDQotUHJvY2Vzc19Eb3duPU5lZA0KLVByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb249RmxlcmUgdmFsZw0KLVByb2Nlc3NfQnV0dG9uX0xpbmtNZXRob2RFbGVtZW50PUxpbmsgbWV0b2RlZWxlbWVudC4uLg0KLQ0KLSMjIEVycm9yL1dhcm5pbmcNCi1Qcm9jZXNzX0ludmFsaWROYW1lVGl0bGU9VWd5bGRpZ3QgbmF2bg0KLVByb2Nlc3NfSW52YWxpZE5hbWU9SVVQQTAwODFFOiBOYXZuZXQgc2thbCB1ZGZ5bGRlcy4gQW5naXYgZXQgZ3lsZGlndCBuYXZuLg0KLVByb2Nlc3NfUmVuYW1lX1RpdGxlPU9tZFx1MDBmOGINCi1Qcm9jZXNzX0ludmFsaWRQcmVzZW50YXRpb25OYW1lPUlVUEEwMDgyRTogUHJcdTAwZTZzZW50YXRpb25zbmF2bmV0IGthbiB1ZGZ5bGRlcy4gQW5naXYgZXQgZ3lsZGlndCBwclx1MDBlNnNlbnRhdGlvbnNuYXZuLg0KLVByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZT1MaW5rIG1ldG9kZWVsZW1lbnQNCi1Qcm9jZXNzX0ludmFsaWRMaW5rTWV0aG9kRWxlbWVudD1JVVBBMDA4M0U6IEthbiBpa2tlIGxpbmtlIHRpbCAnJ3swfScnLCBmb3JkaSBkZXR0ZSBtZXRvZGVlbGVtZW50IGFsbGVyZWRlIGJydWdlcyB0aWwgZW4gYW5kZW4gZGVza3JpcHRvciB1bmRlciBkZW4gc2FtbWUgb3Zlcm9yZG5lZGUuDQotUHJvY2Vzc19Bc3NpZ25tZW50SW5mb1RpdGxlPU9wbHlzbmluZ2VyDQotUHJvY2Vzc19UZWFtQXNzaWduRXJyb3I9SVVQQTAwODRFOiBLYW4gaWtrZSB0aWxmXHUwMGY4amUgJyd7MH0nJyB0aWwgdGVhbWV0ICcnezF9JycgXG5cblJvbGxlZGVza3JpcHRvcihlcikgc2thbCBoYXZlIHRpbGtueXR0ZXQgbWV0b2RlZWxlbWVudHJvbGxlIGZvciBhdCBrdW5uZSB0aWxkZWxlcyB0aWwgdGVhbS5cblxuUmV0IHRpbGtueXRuaW5nZW4sIG9nIHByXHUwMGY4diBpZ2VuLg0KLVByb2Nlc3NfVGVhbURpYWxvZ01lc3NhZ2U9Vlx1MDBlNmxnIHRlYW1zDQotUHJvY2Vzc19UZWFtRGlhbG9nVGl0bGU9VGVhbXMNCi0NCi1Qcm9jZXNzX0RlbGl2ZXJhYmxlQXNzaWduRXJyb3I9SVVQQTAwODVFOiBLYW4gaWtrZSB0aWxmXHUwMGY4amUgJyd7MH0nJyB0aWwgZGVuIGxldlx1MDBlOXJiYXJlICcnezF9JycsIGZvcmRpIGRlciBpa2tlIGVyIHRpbGtueXR0ZXQgZXQgbWV0b2RlZWxlbWVudCBhZiB0eXBlbiBhcmJlamRzcHJvZHVrdC4NCi1Qcm9jZXNzX0NvbXBvc2l0ZVJvbGVBc3NpZ25FcnJvcj1JVVBBMDA4NkU6IEthbiBpa2tlIHRpbGZcdTAwZjhqZSAnJ3swfScnIHRpbCBkZW4gc2FtbWVuc2F0dGUgcm9sbGUgJyd7MX0nJywgZm9yZGkgZGVyIGlra2UgZXIgdGlsa255dHRldCBlbiBtZXRvZGVlbGVtZW50cm9sbGUuDQotUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJNZXNzYWdlPUlVUEEwMDg3VzogQW5naXYgZXQgZ3lsZGlndCB0YWwgZm9yIGZvcmdcdTAwZTZuZ2VyZS4NCi1Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlclRpdGxlPVVneWxkaWcgZm9yZ1x1MDBlNm5nZXItaWQNCi0NCi1Qcm9jZXNzX05vSXRlbXM9SW5nZW4gZWxlbWVudGVyIHZhbGd0DQotUHJvY2Vzc19JdGVtc1NlbGVjdGVkPXswfSBlbGVtZW50ZXIgdmFsZ3QNCi1Qcm9jZXNzX05vUHJvcGVydGllc0F2YWlsYWJsZT1JbmdlbiBlZ2Vuc2thYmVyIHRpbGdcdTAwZTZuZ2VsaWdlDQotDQotUHJlZGVjZXNzb3JEaWFsb2dfVGl0bGU9Rm9yZ1x1MDBlNm5nZXJhZmhcdTAwZTZuZ2lnaGVkDQotUHJlZGVjZXNzb3JEaWFsb2dfSGVhZGVyTWVzc2FnZT1BbmdpdiBhZmhcdTAwZTZuZ2lnaGVkc3R5cGUgZm9yIGZvcmdcdTAwZTZuZ2VyOg0KLVByZWRlY2Vzc29yRGlhbG9nX0luZGV4PUluZGVrczoNCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVzZW50YXRpb25OYW1lPVByXHUwMGU2c2VudGF0aW9uc25hdm46DQotUHJlZGVjZXNzb3JEaWFsb2dfRGVwZW5kZW5jeT1BZmhcdTAwZTZuZ2lnaGVkOg0KLVByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JEaWFsb2dUaXRsZT1Gb3JnXHUwMGU2bmdlcg0KLVByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JNZXNzYWdlPUlVUEEwMDg4RTogRm9yZ1x1MDBlNm5nZXIgbWVkIGRlbm5lIGlkIGZpbmRlcyBhbGxlcmVkZSBmb3IgZGV0dGUgYXJiZWpkc25lZGJyeWRuaW5nc2VsZW1lbnQuDQotDQotUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX3RleHRFZGl0Q2VsbF9wcm9ibGVtX21zZz1JVVBBMDA5MEU6IERlciBlciBvcHN0XHUwMGU1ZXQgZW4gZmVqbCB1bmRlciByZWRpZ2VyaW5nIGFmIGVuIGVnZW5za2FiLg0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc19jZWxsRWRpdG9yX2ludmFsaWRQcmVkY2Vzc29yX3Byb2JsZW1fbXNnPUlVUEEwMDg5VzogVWd5bGRpZyBmb3JnXHUwMGU2bmdlcmxpc3RlDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2MzFkZTkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJlOTFhMmYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwxLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmJhc2U7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBmcmFnbWVudAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfZGUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdkYTEzZGMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoNCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksDQotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyBhYm91dC5wcm9wZXJ0aWVzDQotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzDQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuDQotDQotZmVhdHVyZU5hbWU9RVBGIC0gQmFzaXMNCi0NCi1mZWF0dXJlVGV4dD1FUEYgLSBCYXNpc1xuXA0KLVxuXA0KLVZlcnNpb246IDEuMC4xLjAwIFxuXA0KLUJ1aWxkLUtlbm51bmc6IDIwMDYwMjA2XzA1NFxuXA0KLVxuXA0KLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiBBbGxlIFJlY2h0ZSB2b3JiZWhhbHRlbi5cblwNCi1cbg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X2VzLmh0bWwgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF9lcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OTFhZGI2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X2VzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPg0KLTx0aXRsZT5BY2VyY2EgZGU8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJFUy1FUyI+DQotPGgyPkFjZXJjYSBkZWwgY29udGVuaWRvPC9oMj4NCi0gDQotPHA+MjQgZGUgZmVicmVybyBkZSAyMDA1PC9wPgkNCi08aDM+TGljZW5jaWE8L2gzPg0KLQ0KLTxwPkxhIEVjbGlwc2UgRm91bmRhdGlvbiBoYSBoZWNobyBxdWUgdG9kbyBlbCBDb250ZW5pZG8gZXN0w6kgZGlzcG9uaWJsZSBlbiBlc3RlDQotcGx1Zy1pbiAoJnF1b3Q7Q29udGVuaWRvJnF1b3Q7KS4gIEEgbWVub3MgcXVlIHNlIGluZGlxdWUgbG8gY29udHJhcmlvIG3DoXMNCi1hZGVsYW50ZSwgZWwgQ29udGVuaWRvIHNlIHByb3BvcmNpb25hIGFsIHVzdWFyaW8gYmFqbyBsb3MgdMOpcm1pbm9zIHkNCi1jb25kaWNpb25lcyBkZSBsYSBMaWNlbmNpYSBww7pibGljYSBkZSBFY2xpcHNlIFZlcnNpw7NuIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIA0KLVVuYSBjb3BpYSBkZSBsYSBFUEwgZXN0w6EgZGlzcG9uaWJsZSBlbg0KLTxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotUGFyYSBsb3MgZmluZXMgZGUgbGEgRVBMLCAmcXVvdDtQcm9ncmFtYSZxdW90OyBxdWllcmUgZGVjaXIgZWwgQ29udGVuaWRvLjwvcD4NCi0NCi08cD5TaSBubyByZWNpYmnDsyBlc3RlIENvbnRlbmlkbyBkaXJlY3RhbWVudGUgZGUgbGEgRWNsaXBzZSBGb3VuZGF0aW9uLCDDqXN0ZQ0KLWVzdMOhIHNpZW5kbyByZWRpc3RyaWJ1aWRvIHBvciB0ZXJjZXJvcyAoJnF1b3Q7UmVkaXN0cmlidWlkb3ImcXVvdDspIHkgcHVlZGVuDQotYXBsaWNhcnNlIHTDqXJtaW5vcyB5IGNvbmRpY2lvbmVzIGRpc3RpbnRvcyBhbCB1c28gZGUgY3VhbHF1aWVyIGPDs2RpZ28gZGUgb2JqZXRvDQotZGVsIENvbnRlbmlkby4NCi1Db21wcnVlYmUgbGEgbGljZW5jaWEgZGVsIFJlZGlzdHJpYnVpZG9yIHF1ZSBzZSBwcm9wb3JjaW9uw7MganVudG8gY29uIGVsDQotQ29udGVuaWRvLiAgU2kgbm8gZXhpc3RlIHRhbCBsaWNlbmNpYSwgcMOzbmdhc2UgZW4gY29udGFjdG8gY29uIGVsDQotUmVkaXN0cmlidWlkb3IuICBBIG1lbm9zIHF1ZSBzZSBpbmRpcXVlIGxvIGNvbnRyYXJpbyBtw6FzIGFkZWxhbnRlLCBsb3MgdMOpcm1pbm9zDQoteSBjb25kaWNpb25lcyBkZSBsYSBFUEwgc2Ugc2VndWlyw6FuIGFwbGljYW5kbyBhIGN1YWxxdWllciBjw7NkaWdvIGZ1ZW50ZSBkZWwNCi1Db250ZW5pZG8uPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRhNWJhNWYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoNCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksDQotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyBhYm91dC5wcm9wZXJ0aWVzDQotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzDQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuDQotDQotZmVhdHVyZU5hbWU9RVBGIEJhc2UNCi0NCi1mZWF0dXJlVGV4dD1FUEYgQmFzZVxuXA0KLVxuXA0KLVZlcnNpXHUwMGYzbjogMS4wLjEuMDAgXG5cDQotRXRpcXVldGEgZGUgYnVpbGQ6IDIwMDYwMjA2XzA1NFxuXA0KLVxuXA0KLShjKSBDb3B5cmlnaHQgQ29sYWJvcmFkb3JlcyBkZSBFY2xpcHNlIHkgb3Ryb3MgMjAwNCwgMjAwNi4gIFJlc2VydmFkb3MgdG9kb3MgbG9zIGRlcmVjaG9zLlxuXA0KLVxuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfZnIuaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X2ZyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4NzMzZTguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfZnIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+DQotPHRpdGxlPkEgcHJvcG9zIGRlPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iRlItRlIiPg0KLTxoMj5BIHByb3BvcyBkZSBjZSBjb250ZW51PC9oMj4NCi0gDQotPHA+MjQgZsOpdnJpZXIgMjAwNTwvcD4JDQotPGgzPkxpY2VuY2U8L2gzPg0KLQ0KLTxwPkxhIEZvbmRhdGlvbiBFY2xpcHNlIGZvdXJuaXQgbCdlbnNlbWJsZSBkdSBjb250ZW51IGZpZ3VyYW50IGRhbnMgY2UgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudSZxdW90OykuICBTYXVmIGluZGljYXRpb24gY29udHJhaXJlIG1lbnRpb25uw6llIGNpLWRlc3NvdXMsIGxlIGNvbnRlbnUgdm91cyBlc3QgZm91cm5pIGNvbmZvcm3DqW1lbnQgYXV4IHRlcm1lcyBldCBjb25kaXRpb25zIGRlDQotbCdFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgVW5lIGNvcGllIGRlIGwnRVBMIGVzdCBkaXNwb25pYmxlIMOgIGwnYWRyZXNzZSBzdWl2YW50ZSA6IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotRGFucyBsZSBjYWRyZSBkZSBsJ0VQTCwgbGUgdGVybWUgJnF1b3Q7UHJvZ3JhbW1lJnF1b3Q7IHNpZ25pZmllICJDb250ZW51Ii48L3A+DQotDQotPHA+U2kgdm91cyBuJ2F2ZXogcGFzIHJlw6d1IGNlIGNvbnRlbnUgZGlyZWN0ZW1lbnQgdmlhIGxhIEZvbmRhdGlvbiBFY2xpcHNlLCB1bmUgYXV0cmUgcGFydGllIGVzdCBlbiB0cmFpbiBkZSBsZSByZWRpc3RyaWJ1ZXIgKCZxdW90O1JlZGlzdHJpYnV0ZXVyJnF1b3Q7KSBldCBkaWZmw6lyZW50cyB0ZXJtZXMgZXQgY29uZGl0aW9ucyBwZXV2ZW50DQotcydhcHBsaXF1ZXIgw6Agdm90cmUgdXRpbGlzYXRpb24gZGUgdG91dCBjb2RlIG9iamV0IGZpZ3VyYW50IGRhbnMgbGUgY29udGVudS4gIFbDqXJpZmlleiBsYSBsaWNlbmNlIGR1IHJlZGlzdHJpYnV0ZXVyIGZvdXJuaWUgYXZlYyBsZSBjb250ZW51LiAgU2kgdW5lIHRlbGxlIGxpY2VuY2UgbidleGlzdGUgcGFzLCBjb250YWN0ZXogbGUgcmVkaXN0cmlidXRldXIuICBTYXVmIGluZGljYXRpb24gY29udHJhaXJlIG1lbnRpb25uw6llIGNpLWRlc3NvdXMsDQotbGVzIHRlcm1lcyBldCBjb25kaXRpb25zIGRlIGwnRVBMIHMnYXBwbGlxdWVudCB0b3Vqb3VycyDDoCBuJ2ltcG9ydGUgcXVlbCBjb2RlIHNvdXJjZSBmaWd1cmFudCBkYW5zIGxlIGNvbnRlbnUuPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI5NmU0MjkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoNCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksDQotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyBhYm91dC5wcm9wZXJ0aWVzDQotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzDQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuDQotDQotZmVhdHVyZU5hbWU9QmFzZSBFUEYNCi0NCi1mZWF0dXJlVGV4dD1CYXNlIEVQRiBcblwNCi1cblwNCi1WZXJzaW9uIDogMS4wLjEuMDAgXG5cDQotTGliZWxsXHUwMGU5IGRlIHZlcnNpb24gOiAyMDA2MDIwNl8wNTRcblwNCi1cblwNCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cDQotXG4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF9pdC5odG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfaXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjY4NjY0Yy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF9pdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4NCi08dGl0bGU+SW5mb3JtYXppb25pIHN1DQotPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iRU4tVVMiPg0KLTxoMj5JbmZvcm1hemlvbmkgc3UgcXVlc3RvIGNvbnRlbnV0bzoNCi08L2gyPg0KLSANCi08cD4yNCBGZWJicmFpbywgMjAwNTwvcD4JDQotPGgzPkxpY2VuemE8L2gzPg0KLQ0KLTxwPkVjbGlwc2UgRm91bmRhdGlvbiByZW5kZSBkaXNwb25pYmlsZSB0dXR0byBpbCBjb250ZW51dG8gaW4gcXVlc3RvIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiBBIG1lbm8gY2hlIG5vbiBzaWEgZGl2ZXJzYW1lbnRlIGluZGljYXRvIGRpIHNlZ3VpdG8sIGlsIENvbnRlbnQgw6ggZm9ybml0byBpbiBiYXNlIGFsbGUgY2xhdXNvbGUgZSBjb25kaXppb25pIGRpIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbmUgMS4wICgmcXVvdDtFUEwmcXVvdDspLiBVbmEgY29waWEgZGkgRVBMIMOoIGRpc3BvbmliaWxlIHByZXNzbyBpbCBzaXRvIDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotICAgUGVyIGdsaSBzY29waSBkaSBFUEwsICZxdW90O1Byb2dyYW1tYSZxdW90OyB2b3Jyw6AgZGlyZSBDb250ZW51dG8uPC9wPg0KLQ0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQ0KLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UNCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmJjNGU2NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOg0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwNCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jIGFib3V0LnByb3BlcnRpZXMNCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MNCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4NCi0NCi1mZWF0dXJlTmFtZT1FUEYgQmFzZQ0KLQ0KLWZlYXR1cmVUZXh0PUVQRiBCYXNlXG5cDQotXG5cDQotVmVyc2lvbmU6IDEuMC4xLjAwIFxuXA0KLUV0aWNoZXR0YSBidWlsZDogMjAwNjAyMDZfMDU0XG5cDQotXG5cDQotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDYuICBUdXR0aSBpIGRpcml0dGkgcmlzZXJ2YXRpLlxuXA0KLVxuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfamEuaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X2phLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiZjZlMzcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfamEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KLTx0aXRsZT7jg5Djg7zjgrjjg6fjg7Pmg4XloLENCi08L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJKQS1KUCI+DQotPGgyPuacrOabuOOBq+OBpOOBhOOBpjwvaDI+DQotIA0KLTxwPjIwMDUg5bm0IDIg5pyIIDI0IOaXpTwvcD4JDQotPGgzPuODqeOCpOOCu+ODs+OCuTwvaDM+DQotDQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQ0KLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQ0KLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UNCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF9qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDE4NjhhNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOg0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwNCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jIGFib3V0LnByb3BlcnRpZXMNCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MNCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4NCi0NCi1mZWF0dXJlTmFtZT1FUEYgQmFzZQ0KLQ0KLWZlYXR1cmVUZXh0PUVQRiBCYXNlXG5cDQotXG5cDQotXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzOiAxLjAuMS4wMCBcblwNCi1cdTMwZDNcdTMwZWJcdTMwYzlcdTMwZmJcdTMwZTlcdTMwZDlcdTMwZWI6IDIwMDYwMjA2XzA1NFxuXA0KLVxuXA0KLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwNCi1cbg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X2tvLmh0bWwgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF9rby5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkN2U5YmZkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X2tvLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCi08dGl0bGU+7KCc7ZKIIOygleuztDwvdGl0bGU+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9IktPLUtSIj4NCi08aDI+7J20IOy7qO2FkOy4oCDsoJXrs7Q8L2gyPg0KLSANCi08cD4yMDA164WEIDLsm5QgMjTsnbw8L3A+CQ0KLTxoMz7rnbzsnbTshLzsiqQ8L2gzPg0KLQ0KLTxwPkVjbGlwc2UgRm91bmRhdGlvbuydgCDrs7gg7ZSM65+s6re47J247J2YIOuqqOuToCDsu6jthZDsuKAo7J207ZWYICZxdW90O+y7qO2FkOy4oCZxdW90Oynrpbwg7IKs7Jqp7ZWgIOyImCDsnojrj4TroZ0g7KCc6rO17ZWp64uI64ukLiDslYTrnpjsl5DshJwg64us66asIOuqheyLnO2VmOyngCDslYrsnYAg7ZWcLCDrs7gg7Luo7YWQ7Lig64qUIEVjbGlwc2Ug6rO17JqpIOudvOydtOyEvOyKpCDrsoTsoIQgMS4wKOydtO2VmCAmcXVvdDtFUEwmcXVvdDsp7J2YIOyhsOqxtOyXkCDsnZjqsbDtlZjsl6wNCi3soJzqs7XrkKnri4jri6QuIEVQTCDsgqzrs7jsnYAgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPuyXkOyEnCDtmZXsnbjtlaAg7IiYIOyeiOyKteuLiOuLpC4NCi1FUEzsnZgg66qp7KCB7IOBLCAmcXVvdDvtlITroZzqt7jrnqgmcXVvdDvsnbTrnoAg7Luo7YWQ7Lig66W8IOydmOuvuO2VqeuLiOuLpC48L3A+DQotDQotPHA+6reA7ZWY6rCAIOuzuCDsu6jthZDsuKDrpbwgRWNsaXBzZSBGb3VuZGF0aW9u7Jy866Gc67aA7YSwIOyngeygkSDsoJzqs7XrsJvsp4Ag7JWK7J2AIOqyveyasCwg67O4IOy7qO2FkOy4oOuKlCDsoJwz7J6QKOydtO2VmCAmcXVvdDvsnqzrsLDtj6zsnpAmcXVvdDsp7JeQIOydmO2VtCDsnqzrsLDtj6zrkJjqs6Ag7J6I7Jy866mwIOq3gO2VmOydmCDrs7gg7Luo7YWQ7Lig7J2YIOyYpOu4jOygne2KuCDsvZTrk5wg7IKs7Jqp7JeQIOuMgO2VmOyXrCDri6Trpbgg7KGw6rG07J20IOyggeyaqeuQqeuLiOuLpC4g67O4IOy7qO2FkOy4oOyZgCDtlajqu5gg7KCc6rO165CcIOyerOuwsO2PrOyekOydmCDrnbzsnbTshLzsiqTrpbwg7ZmV7J247ZWY7Iut7Iuc7JikLiDsnbTrn6ztlZwg65287J207IS87Iqk6rCAIOyXhuuKlCDqsr3smrAsIOyerOuwsO2PrOyekOyXkOqyjCDrrLjsnZjtlZjsi63si5zsmKQuIOyVhOuemOyXkOyEnCDri6zrpqwg66qF7Iuc7ZWY7KeAIOyViuuKlCDtlZwsIEVQTOydmCDsobDqsbTsnbQg67O4IOy7qO2FkOy4oOydmCDrqqjrk6Ag7IaM7IqkIOy9lOuTnOyXkCDsoIHsmqnrkKnri4jri6QuPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZmYjNlMDQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoNCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksDQotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyBhYm91dC5wcm9wZXJ0aWVzDQotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzDQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuDQotDQotZmVhdHVyZU5hbWU9RVBGIFx1YWUzMFx1YmNmOA0KLQ0KLWZlYXR1cmVUZXh0PUVQRiBcdWFlMzBcdWJjZjhcblwNCi1cblwNCi1cdWJjODRcdWM4MDQgMS4wLjEuMDAgXG5cDQotXHViZTRjXHViNGRjIFx1YjgwOFx1Yzc3NFx1YmUxNDogMjAwNjAyMDZfMDU0XG5cDQotXG5cDQotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDYuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cDQotXG4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF9wdF9CUi5odG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfcHRfQlIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI0ODUwMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF9wdF9CUi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4NCi08dGl0bGU+U29icmUgPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iRU4tVVMiPg0KLTxoMj5Tb2JyZSBFc3RlIENvbnRlw7pkbzwvaDI+DQotIA0KLTxwPjI0IGRlIGZldmVyZWlybyBkZSAyMDA1PC9wPgkNCi08aDM+TGljZW7Dp2E8L2gzPg0KLQ0KLTxwPkEgRWNsaXBzZSBGb3VuZGF0aW9uIGRpc3BvbmliaWxpemEgdG9kbyBjb250ZcO6ZG8gbmVzdGUgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICANCi1BIG1lbm9zIHF1ZSBpbmRpY2FkbyBvIGNvbnRyw6FyaW8gYSBzZWd1aXIsIHRvZG8gQ29udGXDumRvIMOpIGZvcm5lY2lkbyBhIHZvY8OqIHNvYiBvcyB0ZXJtb3MNCi1lIGNvbmRpw6fDtWVzIGRvIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc8OjbyAxLjAgKCZxdW90O0VQTCZxdW90OykuICBVbWEgY8OzcGlhIGRvIEVQTA0KLWVzdMOhIGRpc3BvbsOtdmVsIGVtDQotPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi0gICBQYXJhIGZpbnMgZG8gRVBMLCAmcXVvdDtQcm9ncmFtYSZxdW90OyBzaWduaWZpY2Fyw6EgbyBDb250ZcO6ZG8uPC9wPg0KLQ0KLTxwPlNlIHZvY8OqIG7Do28gcmVjZWJldSBlc3RlIENvbnRlw7pkbyBkaXJldGFtZW50ZSBkYSBFY2xpcHNlIEZvdW5kYXRpb24sIG8gQ29udGXDumRvIGVzdMOhDQotc2VuZG8gcmVkaXN0cmlidcOtZG8gcG9yIG91dHJhIHBhcnRlICgmcXVvdDtSZWRpc3RyaWJ1aWRvciZxdW90OykgZSB0ZXJtb3MgZSBjb25kacOnw7Vlcw0KLWRpZmVyZW50ZXMgcG9kZW0gc2UgYXBsaWNhciBhbyB1c28gZGUgcXVhbHF1ZXIgY8OzZGlnbyBkZSBvYmpldG8gbm8gQ29udGXDumRvLiAgVmVyaWZpcXVlIGENCi1saWNlbsOnYSBkbyBSZWRpc3RyaWJ1aWRvciBxdWUgZm9pIGZvcm5lY2lkYSBjb20gbyBDb250ZcO6ZG8uICBTZSBuZW5odW1hIGxpY2Vuw6dhIGV4aXN0aXIsDQotZW50cmUgZW0gY29udGF0byBjb20gbyBSZWRpc3RyaWJ1aWRvci4gIEEgbWVub3MgcXVlIGluZGljYWRvIG8gY29udHLDoXJpbyBhIHNlZ3Vpciwgb3MNCi10ZXJtb3MgZSBjb25kacOnw7VlcyBkbyBFUEwgc2UgYXBsaWNhcsOjbyBhIHF1YWxxdWVyIGPDs2RpZ28tZm9udGUgbm8gQ29udGXDumRvLiAgPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5ODRiMGEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoNCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksDQotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyBhYm91dC5wcm9wZXJ0aWVzDQotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzDQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuDQotDQotZmVhdHVyZU5hbWU9QmFzZSBFUEYNCi0NCi1mZWF0dXJlVGV4dD1CYXNlIEVQRlxuXA0KLVxuXA0KLVZlcnNcdTAwZTNvOiAxLjAuMS4wMCBcblwNCi1SXHUwMGYzdHVsbyBkbyBCdWlsZDogMjAwNjAyMDZfMDU0XG5cDQotXG5cDQotKGMpIENvcHlyaWdodCBjb250cmlidWlkb3JlcyBkbyBFY2xpcHNlIGUgdGVyY2Vpcm9zIDIwMDQsIDIwMDYuICBUb2RvcyBvcyBEaXJlaXRvcyBSZXNlcnZhZG9zLlxuXA0KLVxuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfemhfQ04uaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X3poX0NOLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiM2NiNzIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfemhfQ04uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KLTx0aXRsZT7lhbPkuo48L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJaSC1DTiI+DQotPGgyPuWFs+S6juatpOWGheWuuTwvaDI+DQotIA0KLTxwPjIwMDUg5bm0IDIg5pyIIDI0IOaXpTwvcD4JDQotPGgzPuiuuOWPr+ivgTwvaDM+DQotDQotPHA+RWNsaXBzZSBGb3VuZGF0aW9uIOaPkOS+m+atpOaPkuS7tu+8iOKAnOWGheWuueKAne+8ieS4reeahOaJgOacieWGheWuueOAgumZpOmdnuS4i+aWh+WPpuacieaMh+aYju+8jOWQpuWImeaCqOWcqOS9v+eUqOWGheWuueaXtuW/hemhu+mBteWuiCBFY2xpcHNlIOWFrOWFseiuuOWPr+ivge+8iEVQTO+8iVYxLjAg5Lit55qE5p2h5qy+5ZKM5p2h5Lu244CC5oKo5Y+v5Lul5Yiw5Lul5LiL572R5Z2A6I635b6XIEVQTO+8mgc8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+44CC5ZyoIEVQTCDnmoTkvb/nlKjkuK3vvIzigJznqIvluo/igJ3ljbPmjIfigJzlhoXlrrnigJ3jgII8L3A+DQotDQotPHA+5aaC5p6c5oKo5LiN5piv55u05o6l5LuOIEVjbGlwc2UgRm91bmRhdGlvbiDmlLbliLDmraTigJzlhoXlrrnigJ3vvIzljbPigJzlhoXlrrnigJ3nlLHnrKzkuInmlrnvvIjigJzova/ku7bplIDllK7llYbigJ3vvInlho3mrKHliIblj5HvvIzpgqPkuYgsIOaCqOS9v+eUqOKAnOWGheWuueKAneS4reeahOaJgOacieWvueixoeS7o+eggeaXtuWPr+iDveW/hemhu+mBteWuiOWFtuS7luadoeasvuWSjOadoeS7tuOAguivt+afpemYheKAnOWGheWuueKAnemaj+mZhOeahOeUsemUgOWUruWVhumigeWPkeeahOiuuOWPr+ivgeOAguWmguaenOatpOexu+iuuOWPr+ivgeS4jeWtmOWcqO+8jOivt+iBlOezu+mUgOWUruWVhuOAgumZpOmdnuS4i+aWh+S4reWPpuacieaMh+aYju+8jOWQpuWImSBFUEwg55qE5p2h5qy+5ZKM5p2h5Lu25LuN6YCC55So5LqO4oCc5YaF5a654oCd5Lit55qE5omA5pyJ5rqQ5Luj56CB44CCPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfemhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4ODNjNmEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfemhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoNCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksDQotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyBhYm91dC5wcm9wZXJ0aWVzDQotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzDQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuDQotDQotZmVhdHVyZU5hbWU9RVBGIEJhc2UNCi0NCi1mZWF0dXJlVGV4dD1FUEYgQmFzZVxuXA0KLVxuXA0KLVx1NzI0OFx1NjcyY1x1ZmYxYTEuMC4xLjAwIFxuXA0KLVx1Njc4NFx1NWVmYVx1NjgwN1x1N2I3ZVx1ZmYxYTIwMDYwMjA2XzA1NFxuXA0KLVxuXA0KLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuIFxuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfemhfVFcuaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2Fib3V0X3poX1RXLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3ODQyMjYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfemhfVFcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KLTx0aXRsZT7pl5zmlrw8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJ6aC1UVyI+DQotPGgyPumXnOaWvOacrOWFp+WuuTwvaDI+DQotIA0KLTxwPjIwMDUg5bm0IDIg5pyIIDI0IOaXpTwvcD4JDQotPGgzPuaOiOasijwvaDM+DQotDQotPHA+RWNsaXBzZSBGb3VuZGF0aW9uIOeZvOS9iOacrOWkluaOm+eoi+W8j+S4reeahOaJgOacieWFp+Wuue+8iOOAjOWFp+WuueOAje+8ieOAguS7peS4i+mZpOWPpuacieiou+aYjuiAheWklu+8jOOAjOWFp+WuueOAjeWdh+S+neOAjEVjbGlwc2Ug5YWs5YWx5o6I5qyKIDEuMCDniYjjgI0oJnF1b3Q7RVBMJnF1b3Q7KSDkuYvmop3mrL7ogIzmj5Dkvpvmgqjkvb/nlKjjgIINCi08YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+IOS4iuW3suWFrOS9iOS4gOS7vSBFUEzjgIINCi3lsI0gRVBMIOiAjOiogO+8jOOAjOeoi+W8j+OAjeaEj+aMh+OAjOWFp+WuueOAjeOAgjwvcD4NCi0NCi08cD7oi6XpnZ7nm7TmjqXlvp4gRWNsaXBzZSBGb3VuZGF0aW9uIOaUtuWIsOacrOOAjOWFp+WuueOAje+8jOWJh+OAjOWFp+WuueOAjeeUseesrOS4ieaWue+8iOOAjOWGjeeZvOihjOiAheOAje+8iemHjeaWsOeZvOihjO+8jOOAjOWFp+WuueOAjeS4reS5i+S7u+S9leebrueahOeivOWPr+iDveacieS4jeWQjOeahOS9v+eUqOaineasvuOAgg0KLeiri+WPg+mWseOAjOWFp+WuueOAjemaqOmZhOS5i+OAjOWGjeeZvOihjOiAheOAjeaOiOasiuOAguiLpeacqumZhOS4iuaOiOasiu+8jOiri+iBr+e1oeOAjOWGjeeZvOihjOiAheOAjeOAguS7peS4i+mZpOWPpuacieiou+aYjuiAheWklu+8jEVQTCDmop3mrL7ku43pgannlKjmlrzjgIzlhaflrrnjgI3kuK3kuYvku7vkvZXljp/lp4vnorzjgII8L3A+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYWJvdXRfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU2YTY5NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9hYm91dF96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOg0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwNCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jIGFib3V0LnByb3BlcnRpZXMNCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MNCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4NCi0NCi1mZWF0dXJlTmFtZT1FUEYgQmFzZQ0KLQ0KLWZlYXR1cmVUZXh0PUVQRiBCYXNlXG5cDQotXG5cDQotXHU3MjQ4XHU2NzJjXHVmZjFhMS4wLjEuMDAgXG5cDQotXHU1ZWZhXHU3ZjZlXHU2YTE5XHU3YzY0XHVmZjFhMjAwNjAyMDZfMDU0XG5cDQotXG5cDQotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDYuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXA0KLVxuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRlMDdlOGQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLXNvdXJjZS5ubDEuamFyID0gc3JjLw0KLW91dHB1dC5ubDEuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IG5sMS5qYXIsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9lcy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZnIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2phLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9rby5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcHRfQlIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX0NOLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9UVy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF9lcy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF9pdC5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF9qYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF9rby5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF96aF9DTi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF96aF9UVy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2l0LnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgZnJhZ21lbnQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2ZyYWdtZW50LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYzA5M2Y0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL2ZyYWdtZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZyYWdtZW50TmFtZT1FUEYgQ29tcG9zZXIgQmFzZSAoTkwxKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmOTU0YmUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1mZWF0dXJlUGx1Z2luTmFtZT1FUEYgLSBCYXNpcy1GZWF0dXJlDQotZmVhdHVyZVBsdWdpbk5hbWVOTD1FUEYgLSBCYXNpcy1GZWF0dXJlIChOTDEpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWY2NzJkYi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLWZlYXR1cmVQbHVnaW5OYW1lPUNhcmFjdGVyXHUwMGVkc3RpY2EgYlx1MDBlMXNpY2EgZGUgRVBGDQotZmVhdHVyZVBsdWdpbk5hbWVOTD1DYXJhY3Rlclx1MDBlZHN0aWNhIGJcdTAwZTFzaWNhIGRlIEVQRiAoTkwxKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmZTNiZDYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1mZWF0dXJlUGx1Z2luTmFtZT1Gb25jdGlvbiBkZSBiYXNlIEVQRg0KLWZlYXR1cmVQbHVnaW5OYW1lTkw9Rm9uY3Rpb24gZGUgYmFzZSBFUEYgKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9wbHVnaW5faXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNzNmY2E0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotZmVhdHVyZVBsdWdpbk5hbWU9RnVuemlvbmUgRVBGIEJhc2UNCi1mZWF0dXJlUGx1Z2luTmFtZU5MPUZ1bnppb25lIEVQRiBCYXNlIChOTDEpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9wbHVnaW5famEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWQ5MDA1Yy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9wbHVnaW5famEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLWZlYXR1cmVQbHVnaW5OYW1lPUVQRiBCYXNlIEZlYXR1cmUNCi1mZWF0dXJlUGx1Z2luTmFtZU5MPUVQRiBCYXNlIEZlYXR1cmUgKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZjBjMzIyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotZmVhdHVyZVBsdWdpbk5hbWU9RVBGIFx1YWUzMFx1YmNmOCBcdWFlMzBcdWIyYTUNCi1mZWF0dXJlUGx1Z2luTmFtZU5MPUVQRiBcdWFlMzBcdWJjZjggXHVhZTMwXHViMmE1KE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYmZiOTMwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotZmVhdHVyZVBsdWdpbk5hbWU9UmVjdXJzbyBCYXNlIEVQRg0KLWZlYXR1cmVQbHVnaW5OYW1lTkw9UmVjdXJzbyBCYXNlIEVQRiAoTkwxKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY0YmIyMWIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1mZWF0dXJlUGx1Z2luTmFtZT1FUEYgQmFzZSBcdTUyOWZcdTgwZmRcdTkwZThcdTRlZjYNCi1mZWF0dXJlUGx1Z2luTmFtZU5MPUVQRiBCYXNlIFx1NTI5Zlx1ODBmZFx1OTBlOFx1NGVmNlx1ZmYwOE5MMVx1ZmYwOQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIxZDFjNDUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1mZWF0dXJlUGx1Z2luTmFtZT1FUEYgQmFzZSBcdTcyNzlcdTYwMjcNCi1mZWF0dXJlUGx1Z2luTmFtZU5MPUVQRiBcdTU3ZmFcdTY3MmNcdTcyNzlcdTYwMjcgKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDIvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzkyZWRjMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzkwY2M1Yy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDIuamFyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuYmFzZTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGZyYWdtZW50Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi9hYm91dF9ydS5odG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDIvYWJvdXRfcnUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWIwNTU4Yi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi9hYm91dF9ydS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+DQotDQotPHRpdGxlPtCeINC/0YDQvtC00YPQutGC0LU8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJSVS1SVSI+DQotPGgyPtCe0LEg0Y3RgtC+0Lwg0LzQvtC00YPQu9C1PC9oMj4NCi0gDQotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQ0KLTxoMz7Qm9C40YbQtdC90LfQuNGPPC9oMz4NCi0NCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlDQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+Lg0KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+DQotDQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5DQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQ0KLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyL2Fib3V0X3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi9hYm91dF9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNWIzMjUxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyL2Fib3V0X3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LA0KLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgYWJvdXQucHJvcGVydGllcw0KLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQ0KLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykNCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncw0KLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLg0KLQ0KLWZlYXR1cmVOYW1lPVx1MDQxMVx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQ0Ylx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2JcdTA0MzVcdTA0M2FcdTA0NDIgRVBGDQotDQotZmVhdHVyZVRleHQ9XHUwNDExXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzYlx1MDQzNVx1MDQzYVx1MDQ0MiBFUEZcblwNCi1cblwNCi1cdTA0MTJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0NGY6IDEuMC4xLjAwIFxuXA0KLVx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYVx1MDQzMDogMjAwNjAyMDZfMDU0XG5cDQotXG5cDQotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDYuICBcdTA0MTJcdTA0NDFcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQ0OVx1MDQzOFx1MDQ0OVx1MDQzNVx1MDQzZFx1MDQ0Yi5cblwNCi1cbg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4M2I2N2NlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXNvdXJjZS5ubDIuamFyID0gc3JjLw0KLW91dHB1dC5ubDIuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IG5sMi5qYXIsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF9ydS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF9ydS5odG1sLFwNCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIGZyYWdtZW50LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi9mcmFnbWVudC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDIvZnJhZ21lbnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2JhY2I0Yy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi9mcmFnbWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mcmFnbWVudE5hbWU9RVBGIENvbXBvc2VyIEJhc2UgKE5MMikNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2M2RkYTE1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotZmVhdHVyZVBsdWdpbk5hbWU9XHUwNDExXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzYlx1MDQzNVx1MDQzYVx1MDQ0MiBFUEYNCi1mZWF0dXJlUGx1Z2luTmFtZU5MPVx1MDQxMVx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQ0Ylx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2JcdTA0MzVcdTA0M2FcdTA0NDIgRVBGIChOTDEpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzA5YjZiYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlmN2U3NGMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZnJhZ21lbnROYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDJhLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmJhc2U7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBmcmFnbWVudAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDJhL2Fib3V0X2RhLmh0bWwgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvYWJvdXRfZGEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTczYjNlNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvYWJvdXRfZGEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KLTx0aXRsZT5PbTwvdGl0bGU+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9IkRBLURLIj4NCi08aDI+T20gZGV0dGUgaW5kaG9sZDwvaDI+DQotIA0KLTxwPjI0LiBmZWJydWFyIDIwMDU8L3A+CQ0KLTxoMz5MaWNlbnNlPC9oMz4NCi0NCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUNCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQ0KLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UNCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvYWJvdXRfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyYS9hYm91dF9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMTAzOGU1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyYS9hYm91dF9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOg0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwNCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jIGFib3V0LnByb3BlcnRpZXMNCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MNCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4NCi0NCi1mZWF0dXJlTmFtZT1FUEYgLSBiYXNpcw0KLQ0KLWZlYXR1cmVUZXh0PUVQRiAtIGJhc2lzXG5cDQotXG5cDQotVmVyc2lvbjogMS4wLjEuMDAgXG5cDQotQnlnZ2VldGlrZXQ6IDIwMDYwMjA2XzA1NFxuXA0KLVxuXA0KLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXA0KLVxuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDJhL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjQyMGIyNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotc291cmNlLm5sMmEuamFyID0gc3JjLw0KLW91dHB1dC5ubDJhLmphciA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBubDJhLmphcixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RhLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGFib3V0X2RhLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGFib3V0X2RhLmh0bWwsXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgZnJhZ21lbnQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UubmwyYS9mcmFnbWVudC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDJhL2ZyYWdtZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2NmJhOGUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDJhL2ZyYWdtZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZyYWdtZW50TmFtZT1FUEYgQ29tcG9zZXIgQmFzZSAoTkwyYSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZjOTUwMTMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotZmVhdHVyZVBsdWdpbk5hbWU9RVBGIC0gYmFzaXNmdW5rdGlvbg0KLWZlYXR1cmVQbHVnaW5OYW1lTkw9RVBGIC0gYmFzaXNmdW5rdGlvbiAoTkwxKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzZhNmJhOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMzM4ZTU4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDEuamFyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogZnJhZ21lbnQKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfZGUuaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfZGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWFlMmFjYy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL2Fib3V0X2RlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi0NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCi08TUVUQSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9IklCTSBXZWJTcGhlcmUgU3R1ZGlvIj4NCi08dGl0bGU+UGx1Zy1pbi1MaXplbnp2ZXJlaW5iYXJ1bmc8L3RpdGxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keT4NCi0NCi08aDM+UGx1Zy1pbi1MaXplbnp2ZXJlaW5iYXJ1bmc8L2gzPg0KLQ0KLTxwPkRpZSBWZXJ3ZW5kdW5nIGRpZXNlcyBQbHVnLWlucyB1bnRlcmxpZWd0IGRlbnNlbGJlbiBCZWRpbmd1bmdlbiwgZGllIGbDvHIgZGllIFZlcndlbmR1bmcgZGVzIFByb2R1a3RzIGdlbHRlbiwgZGFzIGRpZXNlcyBQbHVnLWluIGVudGjDpGx0Lg0KLTwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfZXMuaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGEzMTZiOC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL2Fib3V0X2VzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi0NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCi08TUVUQSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9IklCTSBXZWJTcGhlcmUgU3R1ZGlvIj4NCi08dGl0bGU+QWN1ZXJkbyBkZSBsaWNlbmNpYSBkZSBwbHVnLWluPC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotDQotPGgzPkFjdWVyZG8gZGUgbGljZW5jaWEgZGUgcGx1Zy1pbjwvaDM+DQotDQotPHA+RWwgdXNvIGRlIGVzdGUgcGx1Zy1pbiBlc3TDoSBzdWpldG8gYSBsb3MgbWlzbW9zIHTDqXJtaW5vcyB5IGNvbmRpY2lvbmVzIHF1ZQ0KLXJpZ2VuIGVsIHVzbyBkZWwgUHJvZHVjdG8gcXVlIGluY2x1eWUgZXN0ZSBwbHVnLWluLjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfZnIuaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfZnIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTVmZDJkZS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL2Fib3V0X2ZyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi0NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCi08TUVUQSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9IklCTSBXZWJTcGhlcmUgU3R1ZGlvIj4NCi08dGl0bGU+Q29udHJhdCBkZSBsaWNlbmNlIGR1IHBsdWctaW48L3RpdGxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keT4NCi0NCi08aDM+Q29udHJhdCBkZSBsaWNlbmNlIGR1IHBsdWctaW48L2gzPg0KLQ0KLTxwPkwndXRpbGlzYXRpb24gZGUgY2UgcGx1Zy1pbiBk6XBlbmQgZGVzIG3qbWVzIHRlcm1lcyBldCBjb25kaXRpb25zIHF1aSBy6Wdpc3NlbnQgbCd1dGlsaXNhdGlvbiBkdSBwcm9kdWl0IGluY2x1YW50IGNlIHBsdWctaW4uPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9hYm91dF9pdC5odG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9hYm91dF9pdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZDU1ZWM3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfaXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KLTxodG1sPg0KLQ0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPg0KLTxNRVRBIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iSUJNIFdlYlNwaGVyZSBTdHVkaW8iPg0KLTx0aXRsZT5QbHVnLWluIExpY2Vuc2UgQWdyZWVtZW50PC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotDQotPGgzPlBsdWctaW4gTGljZW5zZSBBZ3JlZW1lbnQ8L2gzPg0KLQ0KLTxwPkwndXNvIGRpIHF1ZXN0byBwbHVnLWluIOggc29nZ2V0dG8gYWdsaSBzdGVzc2kgdGVybWluaSBlIGNvbmRpemlvbmkgY2hlIHJlZ29sYW5vIGwndXNvIGRlbCBwcm9kb3R0byBjaGUgZm9ybmlzY2UgdGFsZSBwbHVnLWluLg0KLTwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfamEuaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfamEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWQ2NTYzMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL2Fib3V0X2phLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi0NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+DQotPE1FVEEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJJQk0gV2ViU3BoZXJlIFN0dWRpbyI+DQotPHRpdGxlPuODl+ODqeOCsOOCpOODs+OBruOBlOS9v+eUqOadoeS7tjwvdGl0bGU+DQotPC9oZWFkPg0KLQ0KLTxib2R5Pg0KLQ0KLTxoMz7jg5fjg6njgrDjgqTjg7Pjga7jgZTkvb/nlKjmnaHku7Y8L2gzPg0KLQ0KLTxwPuOBk+OBruODl+ODqeOCsOOCpOODs+OBruS9v+eUqOOBq+OBr+OAgeOBk+OBruODl+ODqeOCsOOCpOODs+OCkuWQq+OCgOijveWTgeOBruS9v+eUqOOBq+WvvuOBl+OBpumBqeeUqOOBleOCjOOCi+OCguOBruOBqOWQjOOBmOOBlOS9v+eUqOadoeS7tuOBjOmBqeeUqOOBleOCjOOBvuOBmeOAgjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfa28uaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfa28uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTE5YjIwYi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL2Fib3V0X2tvLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi0NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQotPE1FVEEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJJQk0gV2ViU3BoZXJlIFN0dWRpbyI+DQotPHRpdGxlPu2UjOufrOq3uOyduCDrnbzsnbTshLzsiqQg6rOE7JW9PC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotDQotPGgzPu2UjOufrOq3uOyduCDrnbzsnbTshLzsiqQg6rOE7JW9PC9oMz4NCi0NCi08cD7rs7gg7ZSM65+s6re47J247J2YIOyCrOyaqeyXkCDrjIDtlbTshJzripQg67O4IO2UjOufrOq3uOyduOydhCDtj6ztlajtlZjripQg7KCc7ZKI7J2YIOyCrOyaqeyXkCDsoIHsmqnrkJjripQg64+Z7J287ZWcIOyhsOqxtOydtCDsoIHsmqnrkKnri4jri6QuPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9hYm91dF9wdF9CUi5odG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9hYm91dF9wdF9CUi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYzE3MmY1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvYWJvdXRfcHRfQlIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KLTxodG1sPg0KLQ0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPg0KLTxNRVRBIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iSUJNIFdlYlNwaGVyZSBTdHVkaW8iPg0KLTx0aXRsZT5Db250cmF0byBkZSBMaWNlbsOnYSBkbyBQbHVnLWluPC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotDQotPGgzPkNvbnRyYXRvIGRlIExpY2Vuw6dhIGRvIFBsdWctaW48L2gzPg0KLQ0KLTxwPk8gdXNvIGRlc3RlIFBsdWctaW4gZXN0w6Egc3VqZWl0byBhb3MgbWVzbW9zIHRlcm1vcyBlIGNvbmRpw6fDtWVzIHF1ZSBjb250cm9sYW0gbyB1c28gZG8NCi1Qcm9kdXRvIHF1ZSBpbmNsdWl1IGVzdGUgUGx1Zy1pbi48L3A+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL2Fib3V0X3poX0NOLmh0bWwgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL2Fib3V0X3poX0NOLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlNDU1NWEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9hYm91dF96aF9DTi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQotPGh0bWw+DQotDQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KLTxNRVRBIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iSUJNIFdlYlNwaGVyZSBTdHVkaW8iPg0KLTx0aXRsZT7mj5Lku7borrjlj6/or4HljY/orq48L3RpdGxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keT4NCi0NCi08aDM+5o+S5Lu26K645Y+v6K+B5Y2P6K6uPC9oMz4NCi0NCi08cD7mraTmj5Lku7bnmoTkvb/nlKjlv4XpobvpgbXlvqrkuI7lhbbmiYDlsZ7kuqflk4Hnm7jlkIznmoTmnaHmrL7lkozmnaHku7bjgII8L3A+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL2Fib3V0X3poX1RXLmh0bWwgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL2Fib3V0X3poX1RXLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVmMDExYWQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9hYm91dF96aF9UVy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQotPGh0bWw+DQotDQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KLTxNRVRBIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iSUJNIFdlYlNwaGVyZSBTdHVkaW8iPg0KLTx0aXRsZT7lpJbmjpvnqIvlvI/mjojmrIrlkIjntIQ8L3RpdGxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keT4NCi0NCi08aDM+5aSW5o6b56iL5byP5o6I5qyK5ZCI57SEPC9oMz4NCi0NCi08cD7kvb/nlKjmnKzlpJbmjpvnqIvlvI/lv4XpoIjpgbXlrojlkKvmnInmnKzlpJbmjpvnqIvlvI/nmoTnlKLlk4HnmoTnm7jlkIzkvb/nlKjmop3mrL7jgII8L3A+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ4OTEyOGYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotc291cmNlLm5sMS5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMS5qYXIgPSBiaW4vDQotYmluLmluY2x1ZGVzID0gbmwxLmphcixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXRfZGUuaHRtbCxcDQotICAgICAgICAgICAgICAgYWJvdXRfZXMuaHRtbCxcDQotICAgICAgICAgICAgICAgYWJvdXRfZnIuaHRtbCxcDQotICAgICAgICAgICAgICAgYWJvdXRfaXQuaHRtbCxcDQotICAgICAgICAgICAgICAgYWJvdXRfamEuaHRtbCxcDQotICAgICAgICAgICAgICAgYWJvdXRfa28uaHRtbCxcDQotICAgICAgICAgICAgICAgYWJvdXRfcHRfQlIuaHRtbCxcDQotICAgICAgICAgICAgICAgYWJvdXRfemhfQ04uaHRtbCxcDQotICAgICAgICAgICAgICAgYWJvdXRfemhfVFcuaHRtbCxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9mcmFnbWVudC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NjlkNGI1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvZnJhZ21lbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZnJhZ21lbnROYW1lPUVQRiBDb21wb3NlciBDb21tb24gKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGVmMWU2ZS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBBbGxnZW1laW4NCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjc3YjgxMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1Db21cdTAwZmFuIGRlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNjcxNTA4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUNvbW1vbiBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9wbHVnaW5faXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWE4YzQxNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgQ29tbW9uDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9wbHVnaW5famEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhOGM0MTYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9wbHVnaW5famEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIENvbW1vbg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNTEwOTNmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdWFjZjVcdWQxYjUNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGI2NTRmOC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgQ29tdW0NCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjBiOWQ1Mi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHU1MTZjXHU1MTcxDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhOGM0MTYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIENvbW1vbg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmM0MjM5ZS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNDIyNDE2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDIuamFyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogZnJhZ21lbnQKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDIvYWJvdXRfcnUuaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDIvYWJvdXRfcnUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjMxNzJlNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyL2Fib3V0X3J1Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi0NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+DQotPE1FVEEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJJQk0gV2ViU3BoZXJlIFN0dWRpbyI+DQotPHRpdGxlPtCb0LjRhtC10L3Qt9C40L7QvdC90L7QtSDRgdC+0LPQu9Cw0YjQtdC90LjQtSDQvNC+0LTRg9C70Y88L3RpdGxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keT4NCi0NCi08aDM+0JvQuNGG0LXQvdC30LjQvtC90L3QvtC1INGB0L7Qs9C70LDRiNC10L3QuNC1INC80L7QtNGD0LvRjzwvaDM+DQotDQotPHA+0JzQvtC00YPQu9GMINC/0YDQtdC00L7RgdGC0LDQstC70Y/QtdGC0YHRjyDQvdCwINGD0YHQu9C+0LLQuNGP0YUg0LvQuNGG0LXQvdC30LjQvtC90L3QvtCz0L4g0YHQvtCz0LvQsNGI0LXQvdC40Y8g0L7RgdC90L7QstC90L7Qs9C+INC/0YDQvtC00YPQutGC0LAsINGBINC60L7RgtC+0YDRi9C8INC+0L0g0L/QvtGB0YLQsNCy0LvRj9C10YLRgdGPLjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2ZkNjc2Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS5ubDIuamFyID0gc3JjLw0KLW91dHB1dC5ubDIuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IG5sMi5qYXIsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dF9ydS5odG1sLFwNCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIGZyYWdtZW50LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyL2ZyYWdtZW50LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyL2ZyYWdtZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFjNzYzNTIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMi9mcmFnbWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mcmFnbWVudE5hbWU9RVBGIENvbXBvc2VyIENvbW1vbiAoTkwyKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMWFjZDA5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIFx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NDRcdTA0NDNcdTA0M2RcdTA0M2FcdTA0NDZcdTA0MzhcdTA0MzgNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyYS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMmEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyYS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMmEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTRjYjU5Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDJhPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjUwM2VmNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDJhLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGZyYWdtZW50Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyYS9hYm91dF9kYS5odG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMmEvYWJvdXRfZGEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTMyMzk0MC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyYS9hYm91dF9kYS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQotPGh0bWw+DQotDQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KLTxNRVRBIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iSUJNIFdlYlNwaGVyZSBTdHVkaW8iPg0KLTx0aXRsZT5QbHVnaW4tbGljZW5zYWZ0YWxlPC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotDQotPGgzPlBsdWdpbi1saWNlbnNhZnRhbGU8L2gzPg0KLQ0KLTxwPkJydWdlbiBhZiBkZW5uZSBwbHVnaW4gZXIgdW5kZXJsYWd0IGRlIHNhbW1lIHZpbGvDpXIsIHNvbSByZWd1bGVyZXIgYnJ1Z2VuIGFmIGRldCBwcm9kdWt0LCBkZXIgaW5kZWhvbGRlciBkZW5uZSBwbHVnaW4uPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMmEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDJhL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1MDNkZjUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMmEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLm5sMmEuamFyID0gc3JjLw0KLW91dHB1dC5ubDJhLmphciA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBubDJhLmphcixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RhLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGFib3V0X2RhLmh0bWwsXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgZnJhZ21lbnQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDJhL2ZyYWdtZW50LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ubmwyYS9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzM2U1NDcyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDJhL2ZyYWdtZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZyYWdtZW50TmFtZT1FUEYgQ29tcG9zZXIgQ29tbW9uIChOTDJhKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY4ZTk3YzQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIGdlbmVyZWwNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGFiZmE2ZS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODNjYWMyOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIENvbW1vbiBXaW4zMiAoTkwxKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4NjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlN2IwMTIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiODlhMWMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIFdpbjMyIGFsbGdlbWVpbg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYxYjFlNGIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUNvbVx1MDBmYW4gV2luMzIgZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS9wbHVnaW5fZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzU4ZmMxMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS9wbHVnaW5fZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9Q29tbW9uIFdpbjMyIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0NWQxYTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBXaW4zMiBDb21tb24NCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS9wbHVnaW5famEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNDVkMWE3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgV2luMzIgQ29tbW9uDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmM2MjE1Zi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFdpbjMyIFx1YWNmNVx1ZDFiNQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIzN2FjMGIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBXaW4zMiBDb211bQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUwOGY1NDkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBXaW4zMiBcdTUxNmNcdTUxNzENCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNDVkMWE3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgV2luMzIgQ29tbW9uDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc3ZGUxMzcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU3MDQ0YTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBDb21tb24gV2luMzIgKE5MMikKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODY7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNTRmY2E3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX3J1LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMi9wbHVnaW5fcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOGIzYjllLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBcdTA0M2VcdTA0MzFcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQ0XHUwNDQzXHUwNDNkXHUwNDNhXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBXaW4zMg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyYS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDJhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMmEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMmEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlZmFkMTIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDJhPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYjA2NWZjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIENvbW1vbiBXaW4zMiAoTkwyYSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Lm5sMmEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGU2ODIzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kYS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NzY5MGQyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFdpbjMyIC0gZ2VuZXJlbA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjg4NDMyOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYmE3MjVhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBEYXRhIEV4Y2hhbmdyZSAoTkwxKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2U7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGI2ZGM2OS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9lcy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZnIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2phLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9rby5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcHRfQlIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX0NOLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9UVy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2l0LnByb3BlcnRpZXMNCi0NCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTA5OTk2NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLXBsdWdpbk5hbWU9RVBGIC0gUGx1Zy1pbiBmXHUwMGZjciBEYXRlbmF1c3RhdXNjaA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDdjNDdhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotcGx1Z2luTmFtZT1QbHVnLWluIGRlIGludGVyY2FtYmlvIGRlIGRhdG9zIGRlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNzVkN2RjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotcGx1Z2luTmFtZT1QbHVnLWluIGQnXHUwMGU5Y2hhbmdlIGRlIGRvbm5cdTAwZTllcyBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMS9wbHVnaW5faXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzk5NTIxNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLXBsdWdpbk5hbWU9UGx1Zy1pbiBzY2FtYmlvIGRhdGkgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMS9wbHVnaW5famEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3YmE5NjYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMS9wbHVnaW5famEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi1wbHVnaW5OYW1lPUVQRiBEYXRhIEV4Y2hhbmdlIFBsdWctaW4NCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWZiZmFjOC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLXBsdWdpbk5hbWU9RVBGIFx1YjM3MFx1Yzc3NFx1ZDEzMCBcdWFkNTBcdWQ2NTggXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyMWNlYzkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi1wbHVnaW5OYW1lPVBsdWctaW4gZGUgVHJvY2EgZGUgRGFkb3MgZG8gRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZhNDRhOGMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi1wbHVnaW5OYW1lPUVQRiBcdTY1NzBcdTYzNmVcdTRlYTRcdTYzNjJcdTYzZDJcdTRlZjYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTdiYTk2Ni4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLXBsdWdpbk5hbWU9RVBGIERhdGEgRXhjaGFuZ2UgUGx1Zy1pbg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQ4ZGQ3MC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMjRjOWZiLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBEYXRhIEV4Y2hhbmdyZSAoTkwyKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2U7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjU0ZmNhNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX3J1LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTIxYWRiYi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLXBsdWdpbk5hbWU9RVBGIC0gXHUwNDNlXHUwNDMxXHUwNDNjXHUwNDM1XHUwNDNkIFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDJhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMGRjNWI2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZTFkZjU5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgRGF0YSBFeGNoYW5ncmUgKE5MMmEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLm5sMmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2U7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDJhL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGU2ODIzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RhLnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YjU5MTQ1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLXBsdWdpbk5hbWU9RVBGIC0gcGx1Z2luIHRpbCBkYXRhdWR2ZWtzbGluZw0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNjgzODAzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2N2IwOTYxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgRGlhZ3JhbSAoTkwxKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlN2IwMTIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3ZjFkYTYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIERpYWdyYW1tbW9kZWxsDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGY2ZjgzYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9TW9kZWxvIGRlIGRpYWdyYW1hIGRlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJjMmMyYTguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPU1vZFx1MDBlOGxlIGRlIGRpYWdyYW1tZSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9wbHVnaW5faXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNjc5NTAxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1Nb2RlbGxvIGRpYWdyYW1taSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9wbHVnaW5famEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxY2UwYzJmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgRGlhZ3JhbSBNb2RlbA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJlM2U2ZWYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTggXHViYWE4XHViMzc4DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDc5MzI1Zi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9TW9kZWxvIGRlIERpYWdyYW1hIGRvIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5NzkxNmUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdTU2ZmVcdTZhMjFcdTU3OGINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxY2UwYzJmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgRGlhZ3JhbSBNb2RlbA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXNfZGUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzUzNTkyNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi10eXBlX2FjdGl2aXR5PUFrdGl2aXRcdTAwZTR0c2RpYWdyYW1tDQotZGVmYXVsdEJhc2VOYW1lPXswfSAtIE5ldQ0KLXR5cGVfV1BEPUFyYmVpdHNlcmdlYm5pc2FiaFx1MDBlNG5naWdrZWl0c2RpYWdyYW1tDQotdHlwZV9hY3Rpdml0eURldGFpbD1Ba3Rpdml0XHUwMGU0dHNkZXRhaWxkaWFncmFtbQ0KLWFkZEZyZWVUeHQ9VGV4dCBtaXQgZnJlaWVtIEZvcm1hdCBoaW56dWZcdTAwZmNnZW4NCi10eXBlX3Vua25vd249VW5iZWthbm50DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNjZkNWQxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXR5cGVfYWN0aXZpdHk9RGlhZ3JhbWEgZGUgbGEgYWN0aXZpZGFkDQotZGVmYXVsdEJhc2VOYW1lPXswfSBudWV2bw0KLXR5cGVfV1BEPURpYWdyYW1hIGRlIGRlcGVuZGVuY2lhIGRlbCBwcm9kdWN0byBkZSB0cmFiYWpvDQotdHlwZV9hY3Rpdml0eURldGFpbD1EaWFncmFtYSBkZSBkZXRhbGxlcyBkZSBsYSBhY3RpdmlkYWQNCi1hZGRGcmVlVHh0PUFcdTAwZjFhZGlyIHRleHRvIGxpYnJlDQotdHlwZV91bmtub3duPURlc2Nvbm9jaWRvDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NjJkM2I2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXR5cGVfYWN0aXZpdHk9RGlhZ3JhbW1lIGQnYWN0aXZpdFx1MDBlOQ0KLWRlZmF1bHRCYXNlTmFtZT1Ob3V2ZWF1IHswfQ0KLXR5cGVfV1BEPURpYWdyYW1tZSBkZSBkXHUwMGU5cGVuZGFuY2UgZGUgcHJvZHVpdA0KLXR5cGVfYWN0aXZpdHlEZXRhaWw9RGlhZ3JhbW1lIGRcdTAwZTl0YWlsbFx1MDBlOSBkJ2FjdGl2aXRcdTAwZTkNCi1hZGRGcmVlVHh0PUFqb3V0ZXIgZHUgdGV4dGUgbGlicmUNCi10eXBlX3Vua25vd249SW5jb25udQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXNfaXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2E5OWY2Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi10eXBlX2FjdGl2aXR5PURpYWdyYW1tYSBhdHRpdml0XHUwMGUwDQotZGVmYXVsdEJhc2VOYW1lPU51b3ZvIHswfQ0KLXR5cGVfV1BEPURpYWdyYW1tYSBkaXBlbmRlbnplIHByb2RvdHRvIGRpIGxhdm9ybw0KLXR5cGVfYWN0aXZpdHlEZXRhaWw9RGlhZ3JhbW1hIGRldHRhZ2xpIGF0dGl2aXRcdTAwZTANCi1hZGRGcmVlVHh0PUFnZ2l1bmdpIHRlc3RvIGxpYmVybw0KLXR5cGVfdW5rbm93bj1TY29ub3NjaXV0byANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmNzUzYjguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotdHlwZV9hY3Rpdml0eT1cdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTU2ZjMNCi1kZWZhdWx0QmFzZU5hbWU9TmV3IHswfQ0KLXR5cGVfV1BEPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1NGY5ZFx1NWI1OFx1OTVhMlx1NGZjMlx1NTZmMw0KLXR5cGVfYWN0aXZpdHlEZXRhaWw9XHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU4YTczXHU3ZDMwXHU1NmYzDQotYWRkRnJlZVR4dD1cdTMwZDVcdTMwZWFcdTMwZmNcdTMwZmJcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwNmVcdThmZmRcdTUyYTANCi10eXBlX3Vua25vd249XHU0ZTBkXHU2NjBlDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjODYwYThiLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXR5cGVfYWN0aXZpdHk9XHVkNjVjXHViM2Q5IFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOA0KLWRlZmF1bHRCYXNlTmFtZT1cdWMwYzggezB9DQotdHlwZV9XUEQ9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWM4ODVcdWMxOGRcdWMxMzEgXHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4DQotdHlwZV9hY3Rpdml0eURldGFpbD1cdWQ2NWNcdWIzZDkgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOA0KLWFkZEZyZWVUeHQ9XHViZTQ0XHVjODE1XHVkNjE1IFx1ZDE0ZFx1YzJhNFx1ZDJiOCBcdWNkOTRcdWFjMDANCi10eXBlX3Vua25vd249XHVjNTRjIFx1YzIxOCBcdWM1YzZcdWM3NGMNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU3YWE3MjMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotdHlwZV9hY3Rpdml0eT1EaWFncmFtYSBkZSBBdGl2aWRhZGVzDQotZGVmYXVsdEJhc2VOYW1lPU5vdm8gezB9DQotdHlwZV9XUEQ9RGlhZ3JhbWEgZGUgRGVwZW5kXHUwMGVhbmNpYSBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotdHlwZV9hY3Rpdml0eURldGFpbD1EaWFncmFtYSBkZSBEZXRhbGhlcyBkZSBBdGl2aWRhZGVzDQotYWRkRnJlZVR4dD1JbmNsdWlyIFRleHRvIExpdnJlDQotdHlwZV91bmtub3duPURlc2NvbmhlY2lkbw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjEzNWE3Yi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi10eXBlX2FjdGl2aXR5PVx1NmQzYlx1NTJhOFx1NTZmZQ0KLWRlZmF1bHRCYXNlTmFtZT1cdTY1YjBcdTVlZmEgezB9DQotdHlwZV9XUEQ9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU0ZjlkXHU4ZDU2XHU1MTczXHU3Y2ZiXHU1NmZlDQotdHlwZV9hY3Rpdml0eURldGFpbD1cdTZkM2JcdTUyYThcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTU2ZmUNCi1hZGRGcmVlVHh0PVx1NmRmYlx1NTJhMFx1ODFlYVx1NzUzMVx1NjU4N1x1NjcyYw0KLXR5cGVfdW5rbm93bj1cdTY3MmFcdTc3ZTUNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3NGMyYjMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotdHlwZV9hY3Rpdml0eT1cdTZkM2JcdTUyZDVcdTU3MTYNCi1kZWZhdWx0QmFzZU5hbWU9XHU2NWIwXHU1ZWZhIHswfQ0KLXR5cGVfV1BEPVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1NzZmOFx1NGY5ZFx1OTVkY1x1NGZjMlx1NTcxNg0KLXR5cGVfYWN0aXZpdHlEZXRhaWw9XHU2ZDNiXHU1MmQ1XHU2NjBlXHU3ZDMwXHU1NzE2DQotYWRkRnJlZVR4dD1cdTY1YjBcdTU4OWVcdTRlZmJcdTYxMGZcdTY1ODdcdTViNTcNCi10eXBlX3Vua25vd249XHU0ZTBkXHU2NjBlDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxZTNhMDEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhNWViYzcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBEaWFncmFtIChOTDIpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMi9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjU0ZmNhNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzMyZGQzMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDNiXHUwNDRjIFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQ0Yg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXNfcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXNfcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWU0OGM0MS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi10eXBlX2FjdGl2aXR5PVx1MDQxNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQzMCBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzkNCi1kZWZhdWx0QmFzZU5hbWU9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIHswfQ0KLXR5cGVfV1BEPVx1MDQxNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQzMCBcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDFcdTA0MzhcdTA0M2NcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMA0KLXR5cGVfYWN0aXZpdHlEZXRhaWw9XHUwNDFmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDMwXHUwNDRmIFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQzMCBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzkNCi1hZGRGcmVlVHh0PVx1MDQxNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDFcdTA0MzJcdTA0M2VcdTA0MzFcdTA0M2VcdTA0MzRcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQxXHUwNDQyDQotdHlwZV91bmtub3duPVx1MDQxZFx1MDQzNVx1MDQzOFx1MDQzN1x1MDQzMlx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzZFx1MDQzZQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyYS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDJhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMmEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMmEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1NjI4YWIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDJhPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYWFiMzZhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIERpYWdyYW0gKE5MMmEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5ubDJhL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDRlNjgyMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMmEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGEucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmI4YmFjZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIGRpYWdyYW1tb2RlbA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiN2E2MGMzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi10eXBlX2FjdGl2aXR5PUFrdGl2aXRldHNkaWFncmFtDQotZGVmYXVsdEJhc2VOYW1lPU55dCB7MH0NCi10eXBlX1dQRD1EaWFncmFtIGZvciBhcmJlamRzcHJvZHVrdGFmaFx1MDBlNm5naWdoZWQNCi10eXBlX2FjdGl2aXR5RGV0YWlsPUFrdGl2aXRldHNvcGx5c25pbmdzZGlhZ3JhbQ0KLWFkZEZyZWVUeHQ9VGlsZlx1MDBmOGogZnJpdGVrc3QNCi10eXBlX3Vua25vd249VWtlbmR0DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5OGVjNjcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFhOTg1N2YuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwxLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBmcmFnbWVudAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkYTJjOTEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLXNvdXJjZS5ubDEuamFyID0gc3JjLw0KLW91dHB1dC5ubDEuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IG5sMS5qYXIsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9lcy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZnIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2phLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9rby5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcHRfQlIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX0NOLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9UVy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2l0LnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgZnJhZ21lbnQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL2ZyYWdtZW50LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NjZiNDE3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL2ZyYWdtZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZyYWdtZW50TmFtZT1FUEYgQ29tcG9zZXIgTVNQIEV4cG9ydCAoTkwxKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk2M2NmNTguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIEV4cG9ydCBuYWNoIE1pY3Jvc29mdCBQcm9qZWN0DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBXaXphcmRzDQotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkTmFtZT1NaWNyb3NvZnQgUHJvamVjdA0KLWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZERlc2NyaXB0aW9uPUVpbmVuIFByb3plc3MgbmFjaCBNaWNyb3NvZnQgUHJvamVjdCBleHBvcnRpZXJlbi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4N2UwODliLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1Qcm95ZWN0byBkZSBNaWNyb3NvZnQgUHJvamVjdCBkZSBleHBvcnRhY2lcdTAwZjNuIGRlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgV2l6YXJkcw0KLWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZE5hbWU9UHJveWVjdG8gZGUgTWljcm9zb2Z0IFByb2plY3QNCi1leHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmREZXNjcmlwdGlvbj1FeHBvcnRhciB1biBwcm9jZXNvIGEgdW4gcHJveWVjdG8gZGUgTWljcm9zb2Z0IFByb2plY3QuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTE3ZmRjMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RXhwb3J0YXRpb24gZCdFUEYgdmVycyB1biBwcm9qZXQgTWljcm9zb2Z0DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBXaXphcmRzDQotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkTmFtZT1Qcm9qZXQgTWljcm9zb2Z0DQotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkRGVzY3JpcHRpb249RXhwb3J0YXRpb24gZCd1biBwcm9jZXNzdXMgdmVycyB1biBwcm9qZXQgTWljcm9zb2Z0Lg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExNGMyY2YuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVByb2dldHRvIE1pY3Jvc29mdCBkaSBlc3BvcnRhemlvbmUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBXaXphcmRzDQotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkTmFtZT1Qcm9nZXR0byBNaWNyb3NvZnQNCi1leHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmREZXNjcmlwdGlvbj1Fc3BvcnRhcmUgdW4gcHJvY2Vzc28gaW4gdW4gcHJvZ2V0dG8gTWljcm9zb2Z0Lg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVjNjBiZGUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIFdpemFyZHMNCi1leHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmROYW1lPU1pY3Jvc29mdCBQcm9qZWN0DQotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkRGVzY3JpcHRpb249TWljcm9zb2Z0IFByb2plY3QgXHUzMDZiXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDkyXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTYxYjU0NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIE1pY3Jvc29mdCBcdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjggXHViMGI0XHViY2Y0XHViMGI0XHVhZTMwDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBXaXphcmRzDQotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkTmFtZT1NaWNyb3NvZnQgXHVkNTA0XHViODVjXHVjODFkXHVkMmI4DQotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkRGVzY3JpcHRpb249XHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHViOTdjIE1pY3Jvc29mdCBcdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjhcdWI4NWMgXHViMGI0XHViY2Y0XHViMGM1XHViMmM4XHViMmU0Lg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2ZTU1M2UuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVByb2pldG8gZGUgRXhwb3J0YVx1MDBlN1x1MDBlM28gZG8gRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBXaXphcmRzDQotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkTmFtZT1NaWNyb3NvZnQgUHJvamVjdA0KLWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZERlc2NyaXB0aW9uPUV4cG9ydGFyIHVtIHByb2Nlc3NvIHBhcmEgdW0gTWljcm9zb2Z0IFByb2plY3QuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWQ3Y2FlNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFx1NWJmY1x1NTFmYSBNaWNyb3NvZnQgUHJvamVjdA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgV2l6YXJkcw0KLWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZE5hbWU9TWljcm9zb2Z0IFByb2plY3QNCi1leHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmREZXNjcmlwdGlvbj1cdTVjMDZcdTZkNDFcdTdhMGJcdTViZmNcdTUxZmFcdTgxZjMgTWljcm9zb2Z0IFByb2plY3RcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OWMxMDkxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBXaXphcmRzDQotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkTmFtZT1NaWNyb3NvZnQgUHJvamVjdA0KLWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZERlc2NyaXB0aW9uPVx1NWMwN1x1N2EwYlx1NWU4Zlx1NTMyZlx1NTFmYVx1NTIzMCBNaWNyb3NvZnQgUHJvamVjdFx1MzAwMg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXNfZGUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDgxYWQ5NS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFdpemFyZA0KLWV4cG9ydE1TUFdpemFyZF90aXRsZT1FeHBvcnQgbmFjaCBNaWNyb3NvZnQgUHJvamVrdA0KLQ0KLSMgU2VsZWN0IFByb2Nlc3MgV2l6YXJkIFBhZ2UNCi1zZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90aXRsZT1Qcm96ZXNzIHVuZCBFeHBvcnRvcHRpb25lbiBhdXN3XHUwMGU0aGxlbg0KLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RleHQ9V1x1MDBlNGhsZW4gU2llIGVpbmVuIHp1IGV4cG9ydGllcmVuZGVuIFByb3plc3MgYXVzIHVuZCBnZWJlbiBTaWUgZGllIEV4cG9ydG9wdGlvbmVuIGFuLg0KLXByb2Nlc3NHcm91cF90ZXh0PVByb3plc3MNCi1jYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uX3RleHQ9UHJvemVzc211c3Rlcg0KLWRlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uX3RleHQ9QmVyZWl0c3RlbGx1bmdzcHJvemVzcw0KLW9wdGlvbnNHcm91cF90ZXh0PUV4cG9ydG9wdGlvbmVuDQotcHJvY2Vzc05hbWVMYWJlbF90ZXh0PU5hbWU6DQotY29udGV4dE5hbWVMYWJlbF90ZXh0PUtvbmZpZ3VyYXRpb246DQotcHVibGlzaENvbmZpZ3VyYXRpb25DaGVja0JveF90ZXh0PUF1c2dld1x1MDBlNGhsdGUgS29uZmlndXJhdGlvbiB2ZXJcdTAwZjZmZmVudGxpY2hlbg0KLWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHNDaGVja0JveF90ZXh0PU51ciBkaWUgZ2VwbGFudGVuIFN0cnVrdHVyZWxlbWVudGUgZXhwb3J0aWVyZW4NCi0NCi0jIFNlbGVjdCBQdWJsaXNoaW5nIE9wdGlvbnMgV2l6YXJkIFBhZ2UNCi1zZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGl0bGU9VmVyXHUwMGY2ZmZlbnRsaWNodW5nc29wdGlvbmVuIGF1c3dcdTAwZTRobGVuDQotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RleHQ9V1x1MDBlNGhsZW4gU2llIGRpZSBWZXJcdTAwZjZmZmVudGxpY2h1bmdzb3B0aW9uZW4gYXVzLCBkaWUgZlx1MDBmY3IgZGllIFZlclx1MDBmNmZmZW50bGljaHVuZyBkZXIgYW5nZWdlYmVuZW4gS29uZmlndXJhdGlvbiB2ZXJ3ZW5kZXQgd2VyZGVuLg0KLQ0KLSMgU2VsZWN0IEV4cG9ydCBEaXJlY3RvcnkgV2l6YXJkIHBhZ2UNCi1zZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RpdGxlPVByb2pla3RuYW1lbiB1bmQgRXhwb3J0dmVyemVpY2huaXMgYW5nZWJlbg0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGV4dD1HZWJlbiBTaWUgZGVuIE1pY3Jvc29mdC1Qcm9qZWN0LU5hbWVuIHVuZCBkYXMgRXhwb3J0dmVyemVpY2huaXMgYW4uDQotcHJvamVjdE5hbWVMYWJlbF90ZXh0PU5hbWU6DQotZGlyTGFiZWxfdGV4dD1WZXJ6ZWljaG5pczoNCi1icm93c2VCdXR0b25fdGV4dD1EdXJjaHN1Y2hlbi4uLg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1leHBvcnRNU1BUYXNrX25hbWU9QXVzZ2V3XHUwMGU0aGx0ZXIgUHJvemVzcyB3aXJkIG5hY2ggTWljcm9zb2Z0IFByb2plY3QgZXhwb3J0aWVydC4uLg0KLQ0KLSMgQ29uZmlybWF0aW9uIE1lc3NhZ2VzDQotb3ZlcndyaXRlVGV4dF9tc2c9RXMgaXN0IGJlcmVpdHMgZWluZSBNaWNyb3NvZnQtUHJvamVjdC1EYXRlaSBtaXQgZGVtIE5hbWVuICcnezB9JycgaW4gJyd7MX0nJyB2b3JoYW5kZW4uXG5NXHUwMGY2Y2h0ZW4gU2llIGRpZXNlIERhdGVpIFx1MDBmY2JlcnNjaHJlaWJlbj8NCi1jb21wbGV0ZWRUZXh0X21zZz1EZXIgYXVzZ2V3XHUwMGU0aGx0ZSBQcm96ZXNzICcnezB9Jycgd3VyZGUgZXJmb2xncmVpY2ggaW4gZGllIE1pY3Jvc29mdC1Qcm9qZWN0LVhNTC1EYXRlaSAnJ3sxfScnIGV4cG9ydGllcnQuDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWV4cG9ydE1TUEVycm9yX21zZz1CZWltIEV4cG9ydGllcmVuIGRlcyBhdXNnZXdcdTAwZTRobHRlbiBQcm96ZXNzZXMgJyd7MH0nJyBpbiBkaWUgTWljcm9zb2Z0LVByb2plY3QtRGF0ZWkgJyd7MX0nJyBpc3QgZWluIEZlaGxlciBhdWZnZXRyZXRlbi4NCi1leHBvcnRNU1BFcnJvcl9yZWFzb249S2xpY2tlbiBTaWUgYXVmIERldGFpbHMsIHVtIHdlaXRlcmUgSW5mb3JtYXRpb25lbiB6dSBlcmhhbHRlbi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDViODQ0ZmIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBXaXphcmQNCi1leHBvcnRNU1BXaXphcmRfdGl0bGU9RXhwb3J0YXIgcHJveWVjdG8gZGUgTWljcm9zb2Z0IFByb2plY3QNCi0NCi0jIFNlbGVjdCBQcm9jZXNzIFdpemFyZCBQYWdlDQotc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGl0bGU9U2VsZWNjaW9uYXIgcHJvY2VzbyB5IG9wY2lvbmVzIGRlIGV4cG9ydGFjaVx1MDBmM24NCi1zZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90ZXh0PVNlbGVjY2lvbmFyIHVuIHByb2Nlc28gcGFyYSBleHBvcnRhcmxvIHkgZXNwZWNpZmljYXIgbGFzIG9wY2lvbmVzIGRlIGV4cG9ydGFjaVx1MDBmM24uDQotcHJvY2Vzc0dyb3VwX3RleHQ9UHJvY2Vzbw0KLWNhcGFiaWxpdHlQYXR0ZXJuUmFkaW9CdXR0b25fdGV4dD1QYXRyXHUwMGYzbiBkZSBwb3NpYmlsaWRhZA0KLWRlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uX3RleHQ9UHJvY2VzbyBkZSBlbnRyZWdhDQotb3B0aW9uc0dyb3VwX3RleHQ9T3BjaW9uZXMgZGUgZXhwb3J0YWNpXHUwMGYzbg0KLXByb2Nlc3NOYW1lTGFiZWxfdGV4dD1Ob21icmU6DQotY29udGV4dE5hbWVMYWJlbF90ZXh0PUNvbmZpZ3VyYWNpXHUwMGYzbjoNCi1wdWJsaXNoQ29uZmlndXJhdGlvbkNoZWNrQm94X3RleHQ9UHVibGljYXIgbGEgY29uZmlndXJhY2lcdTAwZjNuIHNlbGVjY2lvbmFkYQ0KLWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHNDaGVja0JveF90ZXh0PUV4cG9ydGFyIHNcdTAwZjNsbyBsb3MgZWxlbWVudG9zIGRlIGRlc2dsb3NlIHBsYW5pZmljYWRvcw0KLQ0KLSMgU2VsZWN0IFB1Ymxpc2hpbmcgT3B0aW9ucyBXaXphcmQgUGFnZQ0KLXNlbGVjdFB1Ymxpc2hPcHRpb25zV2l6YXJkUGFnZV90aXRsZT1TZWxlY2Npb25hciBvcGNpb25lcyBkZSBwdWJsaWNhY2lcdTAwZjNuDQotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RleHQ9U2VsZWNjaW9uYXIgbGFzIG9wY2lvbmVzIGRlIHB1YmxpY2FjaVx1MDBmM24gcXVlIHNlIHV0aWxpemFyXHUwMGUxbiBwYXJhIHB1YmxpY2FyIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBlc3BlY2lmaWNhZGEuDQotDQotIyBTZWxlY3QgRXhwb3J0IERpcmVjdG9yeSBXaXphcmQgcGFnZQ0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGl0bGU9RXNwZWNpZmljYXIgZWwgbm9tYnJlIGRlIHByb3llY3RvIHkgZWwgZGlyZWN0b3JpbyBkZSBleHBvcnRhY2lcdTAwZjNuLg0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGV4dD1Fc3BlY2lmaWNhciBlbCBub21icmUgZGVsIHByb3llY3RvIGRlIE1pY3Jvc29mdCBQcm9qZWN0IHkgZWwgZGlyZWN0b3JpbyBkZSBleHBvcnRhY2lcdTAwZjNuLg0KLXByb2plY3ROYW1lTGFiZWxfdGV4dD1Ob21icmU6DQotZGlyTGFiZWxfdGV4dD1EaXJlY3RvcmlvOg0KLWJyb3dzZUJ1dHRvbl90ZXh0PUV4YW1pbmFyLi4uDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWV4cG9ydE1TUFRhc2tfbmFtZT1FeHBvcnRhbmRvIGVsIHByb2Nlc28gc2VsZWNjaW9uYWRvIGEgcHJveWVjdG8gZGUgTWljcm9zb2Z0IFByb2plY3QuLi4NCi0NCi0jIENvbmZpcm1hdGlvbiBNZXNzYWdlcw0KLW92ZXJ3cml0ZVRleHRfbXNnPVlhIGV4aXN0ZSB1biBwcm95ZWN0byBkZSBNaWNyb3NvZnQgUHJvamVjdCAnJ3swfScnIGVuICcnezF9JycuXG5cdTAwYmZEZXNlYSBzb2JyZXNjcmliaXJsbz8NCi1jb21wbGV0ZWRUZXh0X21zZz1FbCBwcm9jZXNvIHNlbGVjY2lvbmFkbyAnJ3swfScnIHNlIGhhIGV4cG9ydGFkbyBzYXRpc2ZhY3RvcmlhbWVudGUgYWwgYXJjaGl2byBYTUwgJyd7MX0nJyBkZWwgcHJveWVjdG8gZGUgTWljcm9zb2Z0IFByb2plY3QuDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWV4cG9ydE1TUEVycm9yX21zZz1TZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgZXhwb3J0YXIgZWwgcHJvY2VzbyBzZWxlY2Npb25hZG8gJyd7MH0nJyBhbCBwcm95ZWN0byBkZSBNaWNyb3NvZnQgUHJvamVjdCAnJ3sxfScnLg0KLWV4cG9ydE1TUEVycm9yX3JlYXNvbj1QdWxzZSBlbiBEZXRhbGxlcyBwYXJhIG9idGVuZXIgbVx1MDBlMXMgaW5mb3JtYWNpXHUwMGYzbi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY4MTA3MWQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBXaXphcmQNCi1leHBvcnRNU1BXaXphcmRfdGl0bGU9RXhwb3J0ZXIgdW4gcHJvamV0IE1pY3Jvc29mdA0KLQ0KLSMgU2VsZWN0IFByb2Nlc3MgV2l6YXJkIFBhZ2UNCi1zZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90aXRsZT1TXHUwMGU5bGVjdGlvbm5lciBkZXMgb3B0aW9ucyBkZSBwcm9jZXNzdXMgZXQgZCdleHBvcnRhdGlvbg0KLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RleHQ9U1x1MDBlOWxlY3Rpb25uZXogdW4gcHJvY2Vzc3VzIFx1MDBlMCBleHBvcnRlciBldCBzcFx1MDBlOWNpZmlleiBsZXMgb3B0aW9ucyBkJ2V4cG9ydGF0aW9uLg0KLXByb2Nlc3NHcm91cF90ZXh0PVByb2Nlc3N1cw0KLWNhcGFiaWxpdHlQYXR0ZXJuUmFkaW9CdXR0b25fdGV4dD1QYXR0ZXJuIGRlIGNhcGFjaXRcdTAwZTkNCi1kZWxpdmVyeVByb2Nlc3NSYWRpb0J1dHRvbl90ZXh0PVByb2Nlc3N1cyBkZSBsaXZyYWlzb24NCi1vcHRpb25zR3JvdXBfdGV4dD1PcHRpb25zIGQnZXhwb3J0YXRpb24NCi1wcm9jZXNzTmFtZUxhYmVsX3RleHQ9Tm9tIDoNCi1jb250ZXh0TmFtZUxhYmVsX3RleHQ9Q29uZmlndXJhdGlvbiA6DQotcHVibGlzaENvbmZpZ3VyYXRpb25DaGVja0JveF90ZXh0PVB1YmxpZXIgbGEgY29uZmlndXJhdGlvbiBzXHUwMGU5bGVjdGlvbm5cdTAwZTllDQotZXhwb3J0T25seVBsYW5uZWRFbGVtZW50c0NoZWNrQm94X3RleHQ9RXhwb3J0ZXogdW5pcXVlbWVudCBsZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIHJcdTAwZTlwYXJ0aXRpb24gcXVpIHNvbnQgcGxhbmlmaVx1MDBlOXMNCi0NCi0jIFNlbGVjdCBQdWJsaXNoaW5nIE9wdGlvbnMgV2l6YXJkIFBhZ2UNCi1zZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGl0bGU9U1x1MDBlOWxlY3Rpb25uZXIgbGVzIG9wdGlvbnMgZGUgcHVibGljYXRpb24NCi1zZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGV4dD1TXHUwMGU5bGVjdGlvbm5leiBsZXMgb3B0aW9ucyBkZSBwdWJsaWNhdGlvbiBxdWkgc2Vyb250IHV0aWxpc1x1MDBlOWVzIHBvdXIgcHVibGllciBsYSBjb25maWd1cmF0aW9uIHNwXHUwMGU5Y2lmaVx1MDBlOWUuDQotDQotIyBTZWxlY3QgRXhwb3J0IERpcmVjdG9yeSBXaXphcmQgcGFnZQ0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGl0bGU9U3BcdTAwZTljaWZpZXIgbGUgbm9tIGR1IHByb2pldCBldCBsZSByXHUwMGU5cGVydG9pcmUgZCdleHBvcnRhdGlvbg0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGV4dD1TcFx1MDBlOWNpZmlleiBsZSBub20gZHUgcHJvamV0IE1pY3Jvc29mdCBldCBsZSByXHUwMGU5cGVydG9pcmUgZCdleHBvcnRhdGlvbi4NCi1wcm9qZWN0TmFtZUxhYmVsX3RleHQ9Tm9tIDoNCi1kaXJMYWJlbF90ZXh0PVJcdTAwZTlwZXJ0b2lyZSA6DQotYnJvd3NlQnV0dG9uX3RleHQ9UGFyY291cmlyLi4uDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWV4cG9ydE1TUFRhc2tfbmFtZT1FeHBvcnRhdGlvbiBkdSBwcm9jZXNzdXMgc1x1MDBlOWxlY3Rpb25uXHUwMGU5IHZlcnMgbGUgcHJvamV0IE1pY3Jvc29mdC4uLg0KLQ0KLSMgQ29uZmlybWF0aW9uIE1lc3NhZ2VzDQotb3ZlcndyaXRlVGV4dF9tc2c9VW4gcHJvamV0IE1pY3Jvc29mdCAnJ3swfScnIGV4aXN0ZSBkXHUwMGU5alx1MDBlMCBkYW5zICcnezF9JycuXG5Wb3VsZXotdm91cyBsJydcdTAwZTljcmFzZXIgPw0KLWNvbXBsZXRlZFRleHRfbXNnPUxlIHByb2Nlc3N1cyBzXHUwMGU5bGVjdGlvbm5cdTAwZTkgJyd7MH0nJyBhIFx1MDBlOXRcdTAwZTkgY29ycmVjdGVtZW50IGV4cG9ydFx1MDBlOSBkYW5zIGxlIGZpY2hpZXIgWE1MIGR1IHByb2pldCBNaWNyb3NvZnQgJyd7MX0nJy4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotZXhwb3J0TVNQRXJyb3JfbXNnPVVuZSBlcnJldXIgcycnZXN0IHByb2R1aXRlIGxvcnMgZGUgbCcnZXhwb3J0YXRpb24gZHUgcHJvY2Vzc3VzIHNcdTAwZTlsZWN0aW9ublx1MDBlOSAnJ3swfScnIHZlcnMgbGUgcHJvamV0IE1pY3Jvc29mdCAnJ3sxfScnLg0KLWV4cG9ydE1TUEVycm9yX3JlYXNvbj1DbGlxdWV6IHN1ciBEXHUwMGU5dGFpbHMgcG91ciBwbHVzIGQnaW5mb3JtYXRpb25zLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXNfaXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTU0MWUwMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFdpemFyZA0KLWV4cG9ydE1TUFdpemFyZF90aXRsZT1Fc3BvcnRhemlvbmUgcHJvZ2V0dG8gTWljcm9zb2Z0DQotDQotIyBTZWxlY3QgUHJvY2VzcyBXaXphcmQgUGFnZQ0KLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RpdGxlPVNlbGV6aW9uYSBwcm9jZXNzbyBlIG9wemlvbmkgZGkgZXNwb3J0YXppb25lDQotc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGV4dD1TZWxlemlvbmFyZSB1biBwcm9jZXNzbyBkYSBlc3BvcnRhcmUgZSBzcGVjaWZpY2FyZSBsZSBvcHppb25pIGRpIGVzcG9ydGF6aW9uZS4NCi1wcm9jZXNzR3JvdXBfdGV4dD1Qcm9jZXNzbw0KLWNhcGFiaWxpdHlQYXR0ZXJuUmFkaW9CdXR0b25fdGV4dD1Nb2RlbGxvIGRpIGNhcGFjaXRcdTAwZTANCi1kZWxpdmVyeVByb2Nlc3NSYWRpb0J1dHRvbl90ZXh0PVByb2Nlc3NvIGRpIHByb2R1emlvbmUNCi1vcHRpb25zR3JvdXBfdGV4dD1Fc3BvcnRhIG9wemlvbmkNCi1wcm9jZXNzTmFtZUxhYmVsX3RleHQ9Tm9tZToNCi1jb250ZXh0TmFtZUxhYmVsX3RleHQ9Q29uZmlndXJhemlvbmU6DQotcHVibGlzaENvbmZpZ3VyYXRpb25DaGVja0JveF90ZXh0PVB1YmJsaWNhIGxhIGNvbmZpZ3VyYXppb25lIHNlbGV6aW9uYXRhDQotZXhwb3J0T25seVBsYW5uZWRFbGVtZW50c0NoZWNrQm94X3RleHQ9RXNwb3J0YXJlIHNvbG8gZ2xpIGVsZW1lbnRpIHBpYW5pZmljYXRpIGRlbGxhIHN1ZGRpdmlzaW9uZQ0KLQ0KLSMgU2VsZWN0IFB1Ymxpc2hpbmcgT3B0aW9ucyBXaXphcmQgUGFnZQ0KLXNlbGVjdFB1Ymxpc2hPcHRpb25zV2l6YXJkUGFnZV90aXRsZT1TZWxlemlvbmEgb3B6aW9uaSBkaSBwdWJibGljYXppb25lDQotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RleHQ9U2VsZXppb25hcmUgbGUgb3B6aW9uaSBkaSBwdWJibGljYXppb25lIGNoZSB2ZXJyYW5ubyB1dGlsaXp6YXRlIHBlciBsYSBwdWJibGljYXppb25lIGRlbGxhIGNvbmZpZ3VyYXppb25lIHNwZWNpZmljYXRhLg0KLQ0KLSMgU2VsZWN0IEV4cG9ydCBEaXJlY3RvcnkgV2l6YXJkIHBhZ2UNCi1zZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RpdGxlPVNwZWNpZmljYXJlIGlsIG5vbWUgZGVsIHByb2dldHRvIGUgbGEgZGlyZWN0b3J5IGRpIGVzcG9ydGF6aW9uZQ0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGV4dD1TcGVjaWZpY2FyZSBpbCBub21lIGRlbCBwcm9nZXR0byBNaWNyb3NvZnQgZSBsYSBkaXJlY3RvcnkgZGkgZXNwb3J0YXppb25lLg0KLXByb2plY3ROYW1lTGFiZWxfdGV4dD1Ob21lOg0KLWRpckxhYmVsX3RleHQ9RGlyZWN0b3J5Og0KLWJyb3dzZUJ1dHRvbl90ZXh0PVNmb2dsaWEuLi4NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotZXhwb3J0TVNQVGFza19uYW1lPUVzcG9ydGF6aW9uZSBkZWwgcHJvY2Vzc28gc2VsZXppb25hdG8gbmVsIHByb2dldHRvIE1pY3Jvc29mdC4uLg0KLQ0KLSMgQ29uZmlybWF0aW9uIE1lc3NhZ2VzDQotb3ZlcndyaXRlVGV4dF9tc2c9VW4gcHJvZ2V0dG8gTWljcm9zb2Z0ICcnezB9JycgZXNpc3RlIGdpXHUwMGUwIGluICcnezF9JycuXG5Tb3ZyYXNjcml2ZXJsbz8NCi1jb21wbGV0ZWRUZXh0X21zZz1JbCBwcm9jZXNzbyBzZWxlemlvbmF0byAnJ3swfScnIFx1MDBlOCBzdGF0byBlc3BvcnRhdG8gY29ycmV0dGFtZW50ZSBuZWwgZmlsZSBYTUwgZGVsIHByb2dldHRvIE1pY3Jvc29mdCAnJ3sxfScnLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1leHBvcnRNU1BFcnJvcl9tc2c9U2kgXHUwMGU4IHZlcmlmaWNhdG8gdW4gZXJyb3JlIGR1cmFudGUgbCcnZXNwb3J0YXppb25lIGRlbCBwcm9jZXNzbyBzZWxlemlvbmF0byAnJ3swfScnIG5lbCBwcm9nZXR0byBNaWNyb3NvZnQgJyd7MX0nJy4NCi1leHBvcnRNU1BFcnJvcl9yZWFzb249RmFyZSBjbGljIHN1IERldHRhZ2xpIHBlciB1bHRlcmlvcmkgaW5mb3JtYXppb25pLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXNfamEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXNfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTRiZDNjYi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFdpemFyZA0KLWV4cG9ydE1TUFdpemFyZF90aXRsZT1NaWNyb3NvZnQgUHJvamVjdCBcdTMwNmVcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzgNCi0NCi0jIFNlbGVjdCBQcm9jZXNzIFdpemFyZCBQYWdlDQotc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGl0bGU9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDRhXHUzMDg4XHUzMDczXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMGZiXHUzMGFhXHUzMGQ3XHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHU5MDc4XHU2MjllDQotc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGV4dD1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTlcdTMwOGJcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNjZcdTMwMDFcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1wcm9jZXNzR3JvdXBfdGV4dD1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi1jYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uX3RleHQ9XHUzMGIxXHUzMGZjXHUzMGQxXHUzMGQzXHUzMGVhXHUzMGM2XHUzMGEzXHUzMGZjXHUzMGZiXHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzDQotZGVsaXZlcnlQcm9jZXNzUmFkaW9CdXR0b25fdGV4dD1cdTMwYzdcdTMwZWFcdTMwZDBcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi1vcHRpb25zR3JvdXBfdGV4dD1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjMNCi1wcm9jZXNzTmFtZUxhYmVsX3RleHQ9XHU1NDBkXHU1MjRkOg0KLWNvbnRleHROYW1lTGFiZWxfdGV4dD1cdTY5Y2JcdTYyMTA6DQotcHVibGlzaENvbmZpZ3VyYXRpb25DaGVja0JveF90ZXh0PVx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA1Zlx1NjljYlx1NjIxMFx1MzA2ZVx1NTE2Y1x1OTU4Yg0KLWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHNDaGVja0JveF90ZXh0PVx1OGEwOFx1NzUzYlx1NmUwOFx1MzA3Zlx1MzBkNlx1MzBlY1x1MzBmY1x1MzBhZlx1MzBjMFx1MzBhNlx1MzBmM1x1MzBmYlx1MzBhOFx1MzBlY1x1MzBlMVx1MzBmM1x1MzBjOFx1MzA2ZVx1MzA3Zlx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOA0KLQ0KLSMgU2VsZWN0IFB1Ymxpc2hpbmcgT3B0aW9ucyBXaXphcmQgUGFnZQ0KLXNlbGVjdFB1Ymxpc2hPcHRpb25zV2l6YXJkUGFnZV90aXRsZT1cdTUxNmNcdTk1OGJcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmVcdTkwNzhcdTYyOWUNCi1zZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGV4dD1cdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWZcdTY5Y2JcdTYyMTBcdTMwOTJcdTUxNmNcdTk1OGJcdTMwNTlcdTMwOGJcdTMwNWZcdTMwODFcdTMwNmJcdTRmN2ZcdTc1MjhcdTMwNTlcdTMwOGJcdTUxNmNcdTk1OGJcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIFNlbGVjdCBFeHBvcnQgRGlyZWN0b3J5IFdpemFyZCBwYWdlDQotc2VsZWN0RXhwb3J0RGlyV2l6YXJkUGFnZV90aXRsZT1cdTMwZDdcdTMwZWRcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzhcdTU0MGRcdTMwNGFcdTMwODhcdTMwNzNcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNmVcdTYzMDdcdTViOWENCi1zZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RleHQ9TWljcm9zb2Z0IFByb2plY3QgXHU1NDBkXHUzMDRhXHUzMDg4XHUzMDczXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMGZiXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcHJvamVjdE5hbWVMYWJlbF90ZXh0PVx1NTQwZFx1NTI0ZDoNCi1kaXJMYWJlbF90ZXh0PVx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzBmYzoNCi1icm93c2VCdXR0b25fdGV4dD1cdTUzYzJcdTcxNjcuLi4NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotZXhwb3J0TVNQVGFza19uYW1lPVx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA1Zlx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA5MiBNaWNyb3NvZnQgUHJvamVjdCBcdTMwNmJcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi0NCi0jIENvbmZpcm1hdGlvbiBNZXNzYWdlcw0KLW92ZXJ3cml0ZVRleHRfbXNnPU1pY3Jvc29mdCBQcm9qZWN0ICcnezB9JycgXHUzMDZmICcnezF9JycgXHUzMDZiXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyXG5cdTRlMGFcdTY2ZjhcdTMwNGRcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQotY29tcGxldGVkVGV4dF9tc2c9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5ICcnezB9JycgXHUzMDRjXHUzMDAxTWljcm9zb2Z0IFByb2plY3QgWE1MIFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiAnJ3sxfScnIFx1MzA2Ylx1NmI2M1x1NWUzOFx1MzA2Ylx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1leHBvcnRNU1BFcnJvcl9tc2c9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5ICcnezB9JycgXHUzMDkyXHUzMDAxTWljcm9zb2Z0IFByb2plY3QgJyd7MX0nJyBcdTMwNmJcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi1leHBvcnRNU1BFcnJvcl9yZWFzb249XHU4YTczXHUzMDU3XHUzMDRmXHUzMDZmXHUzMDBjXHU4YTczXHU3ZDMwXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NDdmNTdiLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgV2l6YXJkDQotZXhwb3J0TVNQV2l6YXJkX3RpdGxlPU1pY3Jvc29mdCBcdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjggXHViMGI0XHViY2Y0XHViMGI0XHVhZTMwDQotDQotIyBTZWxlY3QgUHJvY2VzcyBXaXphcmQgUGFnZQ0KLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RpdGxlPVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWJjMGYgXHViMGI0XHViY2Y0XHViMGI0XHVhZTMwIFx1YzYzNVx1YzE1OCBcdWMxMjBcdWQwZGQNCi1zZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90ZXh0PVx1YjBiNFx1YmNmNFx1YjBiYyBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTRcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTU4XHVhY2UwIFx1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMCBcdWM2MzVcdWMxNThcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXByb2Nlc3NHcm91cF90ZXh0PVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNA0KLWNhcGFiaWxpdHlQYXR0ZXJuUmFkaW9CdXR0b25fdGV4dD1cdWFlMzBcdWIyYTUgXHVkMzI4XHVkMTM0DQotZGVsaXZlcnlQcm9jZXNzUmFkaW9CdXR0b25fdGV4dD1cdWM4MDRcdWIyZWMgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0DQotb3B0aW9uc0dyb3VwX3RleHQ9XHViMGI0XHViY2Y0XHViMGI0XHVhZTMwIFx1YzYzNVx1YzE1OA0KLXByb2Nlc3NOYW1lTGFiZWxfdGV4dD1cdWM3NzRcdWI5ODQ6DQotY29udGV4dE5hbWVMYWJlbF90ZXh0PVx1YWQ2Y1x1YzEzMToNCi1wdWJsaXNoQ29uZmlndXJhdGlvbkNoZWNrQm94X3RleHQ9XHVjMTIwXHVkMGRkXHVkNTVjIFx1YWQ2Y1x1YzEzMSBcdWFjZjVcdWFjMWMNCi1leHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzQ2hlY2tCb3hfdGV4dD1cdWFjYzRcdWQ2OGRcdWI0MWMgXHVjNzkxXHVjNWM1XHViZDg0XHViOTU4IFx1YzY5NFx1YzE4Y1x1YjljYyBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzANCi0NCi0jIFNlbGVjdCBQdWJsaXNoaW5nIE9wdGlvbnMgV2l6YXJkIFBhZ2UNCi1zZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGl0bGU9XHVhY2Y1XHVhYzFjIFx1YzYzNVx1YzE1OCBcdWMxMjBcdWQwZGQNCi1zZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGV4dD1cdWM5YzBcdWM4MTVcdWI0MWMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YWNmNVx1YWMxY1x1ZDU1OFx1YWUzMCBcdWM3MDRcdWQ1NzQgXHVjMGFjXHVjNmE5XHViNDIwIFx1YWNmNVx1YWMxYyBcdWM2MzVcdWMxNThcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLSMgU2VsZWN0IEV4cG9ydCBEaXJlY3RvcnkgV2l6YXJkIHBhZ2UNCi1zZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RpdGxlPVx1ZDUwNFx1Yjg1Y1x1YzgxZFx1ZDJiOCBcdWM3NzRcdWI5ODQgXHViYzBmIFx1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMCBcdWI1MTRcdWI4MDlcdWQxYTBcdWI5YWMgXHVjOWMwXHVjODE1DQotc2VsZWN0RXhwb3J0RGlyV2l6YXJkUGFnZV90ZXh0PU1pY3Jvc29mdCBcdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjggXHVjNzc0XHViOTg0IFx1YmMwZiBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzAgXHViNTE0XHViODA5XHVkMWEwXHViOWFjXHViOTdjIFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1wcm9qZWN0TmFtZUxhYmVsX3RleHQ9XHVjNzc0XHViOTg0Og0KLWRpckxhYmVsX3RleHQ9XHViNTE0XHViODA5XHVkMWEwXHViOWFjOg0KLWJyb3dzZUJ1dHRvbl90ZXh0PVx1Y2MzZVx1YzU0NFx1YmNmNFx1YWUzMC4uLg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1leHBvcnRNU1BUYXNrX25hbWU9XHVjMTIwXHVkMGRkXHVkNTVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1Yjk3YyBNaWNyb3NvZnQgXHVkNTA0XHViODVjXHVjODFkXHVkMmI4XHViODVjIFx1YjBiNFx1YmNmNFx1YjBiNFx1YjI5NCBcdWM5MTEuLi4NCi0NCi0jIENvbmZpcm1hdGlvbiBNZXNzYWdlcw0KLW92ZXJ3cml0ZVRleHRfbXNnPU1pY3Jvc29mdCBcdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjggJyd7MH0nJ1x1Yzc3NChcdWFjMDApIFx1Yzc3NFx1YmJmOCAnJ3sxfScnIFx1YzcwNFx1Y2U1OFx1YzVkMCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuXG5cdWFjYjlcdWNjZDBcdWM0ZjBcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotY29tcGxldGVkVGV4dF9tc2c9XHVjMTIwXHVkMGRkXHVkNTVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCAnJ3swfScnXHVjNzQ0KFx1Yjk3YykgTWljcm9zb2Z0IFx1ZDUwNFx1Yjg1Y1x1YzgxZFx1ZDJiOCBYTUwgXHVkMzBjXHVjNzdjICcnezF9JycoXHVjNzNjKVx1Yjg1YyBcdWIwYjRcdWJjZjRcdWIwYzhcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWV4cG9ydE1TUEVycm9yX21zZz1cdWMxMjBcdWQwZGRcdWQ1NWMgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0ICcnezB9JydcdWM3NDQoXHViOTdjKSBNaWNyb3NvZnQgXHVkNTA0XHViODVjXHVjODFkXHVkMmI4ICcnezF9JycoXHVjNzNjKVx1Yjg1YyBcdWIwYjRcdWJjZjRcdWIwYjRcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OFx1YWMwMCBcdWJjMWNcdWMwZGRcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotZXhwb3J0TVNQRXJyb3JfcmVhc29uPVx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHViY2Y0XHViODI0XHViYTc0IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNzNjYTQzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgV2l6YXJkDQotZXhwb3J0TVNQV2l6YXJkX3RpdGxlPUV4cG9ydGFyIE1pY3Jvc29mdCBQcm9qZWN0DQotDQotIyBTZWxlY3QgUHJvY2VzcyBXaXphcmQgUGFnZQ0KLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RpdGxlPVNlbGVjaW9uYXIgcHJvY2Vzc28gZSBvcFx1MDBlN1x1MDBmNWVzIGV4cG9ydGFcdTAwZTdcdTAwZTNvDQotc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGV4dD1TZWxlY2lvbmUgdW0gcHJvY2Vzc28gcGFyYSBleHBvcnRhciBlIGVzcGVjaWZpcXVlIGFzIG9wXHUwMGU3XHUwMGY1ZXMgZGUgZXhwb3J0YVx1MDBlN1x1MDBlM28uDQotcHJvY2Vzc0dyb3VwX3RleHQ9UHJvY2Vzc28NCi1jYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uX3RleHQ9UGFkclx1MDBlM28gZGUgUmVjdXJzbw0KLWRlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uX3RleHQ9UHJvY2Vzc28gZGUgRW50cmVnYQ0KLW9wdGlvbnNHcm91cF90ZXh0PU9wXHUwMGU3XHUwMGY1ZXMgZGUgRXhwb3J0YVx1MDBlN1x1MDBlM28NCi1wcm9jZXNzTmFtZUxhYmVsX3RleHQ9Tm9tZToNCi1jb250ZXh0TmFtZUxhYmVsX3RleHQ9Q29uZmlndXJhXHUwMGU3XHUwMGUzbzoNCi1wdWJsaXNoQ29uZmlndXJhdGlvbkNoZWNrQm94X3RleHQ9UHVibGljYXIgYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHNlbGVjaW9uYWRhDQotZXhwb3J0T25seVBsYW5uZWRFbGVtZW50c0NoZWNrQm94X3RleHQ9RXhwb3J0YXIgc29tZW50ZSBlbGVtZW50b3MgZGUgaW50ZXJydXBcdTAwZTdcdTAwZTNvIHBsYW5lamFkb3MNCi0NCi0jIFNlbGVjdCBQdWJsaXNoaW5nIE9wdGlvbnMgV2l6YXJkIFBhZ2UNCi1zZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGl0bGU9U2VsZWNpb25hciBvcFx1MDBlN1x1MDBmNWVzIGRlIHB1YmxpY2FcdTAwZTdcdTAwZTNvDQotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RleHQ9U2VsZWNpb25lIGFzIG9wXHUwMGU3XHUwMGY1ZXMgZGUgcHVibGljYVx1MDBlN1x1MDBlM28gcXVlIHNlclx1MDBlM28gdXRpbGl6YWRhcyBwYXJhIHB1YmxpY2FyIGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBlc3BlY2lmaWNhZGEuDQotDQotIyBTZWxlY3QgRXhwb3J0IERpcmVjdG9yeSBXaXphcmQgcGFnZQ0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGl0bGU9RXNwZWNpZmlxdWUgbyBub21lIGRvIHByb2pldG8gZSBvIGRpcmV0XHUwMGYzcmlvIGRlIGV4cG9ydGFcdTAwZTdcdTAwZTNvDQotc2VsZWN0RXhwb3J0RGlyV2l6YXJkUGFnZV90ZXh0PUVzcGVjaWZpcXVlIG8gbm9tZSBlIG8gZGlyZXRcdTAwZjNyaW8gZGUgZXhwb3J0YVx1MDBlN1x1MDBlM28gZG8gTWljcm9zb2Z0IFByb2plY3QuDQotcHJvamVjdE5hbWVMYWJlbF90ZXh0PU5vbWU6DQotZGlyTGFiZWxfdGV4dD1EaXJldFx1MDBmM3JpbzoNCi1icm93c2VCdXR0b25fdGV4dD1Qcm9jdXJhci4uLg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1leHBvcnRNU1BUYXNrX25hbWU9RXhwb3J0YW5kbyBvIHByb2Nlc3NvIHNlbGVjaW9uYWRvIHBhcmEgbyBNaWNyb3NvZnQgUHJvamVjdC4uLg0KLQ0KLSMgQ29uZmlybWF0aW9uIE1lc3NhZ2VzDQotb3ZlcndyaXRlVGV4dF9tc2c9VW0gTWljcm9zb2Z0IFByb2plY3QgJyd7MH0nJyBqXHUwMGUxIGV4aXN0ZSBlbSAnJ3sxfScnLlxuRGVzZWphIHNvYnJlc2NyZXZcdTAwZWEtbG8/DQotY29tcGxldGVkVGV4dF9tc2c9TyBwcm9jZXNzbyBzZWxlY2lvbmFkbyAnJ3swfScnIGZvaSBleHBvcnRhZG8gY29tIFx1MDBlYXhpdG8gcGFyYSBvIGFycXVpdm8gWE1MIGRvIE1pY3Jvc29mdCBQcm9qZWN0ICcnezF9JycuDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWV4cG9ydE1TUEVycm9yX21zZz1PY29ycmV1IHVtIGVycm8gYW8gZXhwb3J0YXIgbyBwcm9jZXNzbyBzZWxlY2lvbmFkbyAnJ3swfScnIHBhcmEgbyBNaWNyb3NvZnQgUHJvamVjdCAnJ3sxfScnLg0KLWV4cG9ydE1TUEVycm9yX3JlYXNvbj1DbGlxdWUgZW0gRGV0YWxoZXMgcGFyYSBvYnRlciBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcy4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZjMDM0ZjUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBXaXphcmQNCi1leHBvcnRNU1BXaXphcmRfdGl0bGU9XHU1YmZjXHU1MWZhIE1pY3Jvc29mdCBQcm9qZWN0DQotDQotIyBTZWxlY3QgUHJvY2VzcyBXaXphcmQgUGFnZQ0KLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RpdGxlPVx1OTAwOVx1NjJlOVx1NmQ0MVx1N2EwYlx1NTQ4Y1x1NWJmY1x1NTFmYVx1OTAwOVx1OTg3OQ0KLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RleHQ9XHU5MDA5XHU2MmU5XHU4OTgxXHU1YmZjXHU1MWZhXHU3Njg0XHU2ZDQxXHU3YTBiXHVmZjBjXHU1ZTc2XHU2MzA3XHU1YjlhXHU1YmZjXHU1MWZhXHU5MDA5XHU5ODc5XHUzMDAyDQotcHJvY2Vzc0dyb3VwX3RleHQ9XHU2ZDQxXHU3YTBiDQotY2FwYWJpbGl0eVBhdHRlcm5SYWRpb0J1dHRvbl90ZXh0PVx1ODBmZFx1NTI5Ylx1NmEyMVx1NWYwZg0KLWRlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uX3RleHQ9XHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiDQotb3B0aW9uc0dyb3VwX3RleHQ9XHU1YmZjXHU1MWZhXHU5MDA5XHU5ODc5DQotcHJvY2Vzc05hbWVMYWJlbF90ZXh0PVx1NTQwZFx1NzlmMFx1ZmYxYQ0KLWNvbnRleHROYW1lTGFiZWxfdGV4dD1cdTkxNGRcdTdmNmVcdWZmMWENCi1wdWJsaXNoQ29uZmlndXJhdGlvbkNoZWNrQm94X3RleHQ9XHU1M2QxXHU1ZTAzXHU5MDA5XHU1YjlhXHU3Njg0XHU5MTRkXHU3ZjZlDQotZXhwb3J0T25seVBsYW5uZWRFbGVtZW50c0NoZWNrQm94X3RleHQ9XHU1M2VhXHU1YmZjXHU1MWZhXHU1ZGYyXHU4OWM0XHU1MjEyXHU3Njg0XHU1MjA2XHU4OWUzXHU1MTQzXHU3ZDIwDQotDQotIyBTZWxlY3QgUHVibGlzaGluZyBPcHRpb25zIFdpemFyZCBQYWdlDQotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RpdGxlPVx1OTAwOVx1NjJlOVx1NTNkMVx1NWUwM1x1OTAwOVx1OTg3OQ0KLXNlbGVjdFB1Ymxpc2hPcHRpb25zV2l6YXJkUGFnZV90ZXh0PVx1OTAwOVx1NjJlOVx1NWMwNlx1NzUyOFx1NGU4ZVx1NTNkMVx1NWUwM1x1NjMwN1x1NWI5YVx1OTE0ZFx1N2Y2ZVx1NzY4NFx1NTNkMVx1NWUwM1x1OTAwOVx1OTg3OVx1MzAwMg0KLQ0KLSMgU2VsZWN0IEV4cG9ydCBEaXJlY3RvcnkgV2l6YXJkIHBhZ2UNCi1zZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RpdGxlPVx1NjMwN1x1NWI5YVx1OTg3OVx1NzZlZVx1NTQwZFx1NzlmMFx1NTQ4Y1x1NWJmY1x1NTFmYVx1NzZlZVx1NWY1NQ0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGV4dD1cdTYzMDdcdTViOWEgTWljcm9zb2Z0IFByb2plY3QgXHU1NDBkXHU3OWYwXHU1NDhjXHU1YmZjXHU1MWZhXHU3NmVlXHU1ZjU1XHUzMDAyDQotcHJvamVjdE5hbWVMYWJlbF90ZXh0PVx1NTQwZFx1NzlmMFx1ZmYxYQ0KLWRpckxhYmVsX3RleHQ9XHU3NmVlXHU1ZjU1XHVmZjFhDQotYnJvd3NlQnV0dG9uX3RleHQ9XHU2ZDRmXHU4OWM4Li4uDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWV4cG9ydE1TUFRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTVjMDZcdTkwMDlcdTViOWFcdTc2ODRcdTZkNDFcdTdhMGJcdTViZmNcdTUxZmFcdTgxZjMgTWljcm9zb2Z0IFByb2plY3QuLi4NCi0NCi0jIENvbmZpcm1hdGlvbiBNZXNzYWdlcw0KLW92ZXJ3cml0ZVRleHRfbXNnPVx1MjAxY3sxfVx1MjAxZFx1NGUyZFx1NWRmMlx1NWI1OFx1NTcyOCBNaWNyb3NvZnQgUHJvamVjdFx1MjAxY3swfVx1MjAxZFx1MzAwMlxuXHU4OTgxXHU4OTg2XHU3NmQ2XHU1YjgzXHU1NDE3XHVmZjFmDQotY29tcGxldGVkVGV4dF9tc2c9XHU5MDA5XHU1YjlhXHU3Njg0XHU2ZDQxXHU3YTBiXHUyMDFjezB9XHUyMDFkXHU1ZGYyXHU2MjEwXHU1MjlmXHU1YmZjXHU1MWZhXHU4MWYzIE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBcdTY1ODdcdTRlZjZcdTIwMWN7MX1cdTIwMWRcdTMwMDINCi0jIEVycm9yIE1lc3NhZ2VzDQotZXhwb3J0TVNQRXJyb3JfbXNnPVx1NWMwNlx1OTAwOVx1NWI5YVx1NzY4NFx1NmQ0MVx1N2EwYlx1MjAxY3swfVx1MjAxZFx1NWJmY1x1NTFmYVx1ODFmMyBNaWNyb3NvZnQgUHJvamVjdFx1MjAxY3sxfVx1MjAxZFx1NjVmNlx1NTFmYVx1OTUxOVx1MzAwMg0KLWV4cG9ydE1TUEVycm9yX3JlYXNvbj1cdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTIwMWRcdWZmMGNcdTgzYjdcdTUzZDZcdTY2ZjRcdTU5MWFcdTRmZTFcdTYwNmZcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY4NGMwZmIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBXaXphcmQNCi1leHBvcnRNU1BXaXphcmRfdGl0bGU9XHU1MzJmXHU1MWZhIE1pY3Jvc29mdCBQcm9qZWN0DQotDQotIyBTZWxlY3QgUHJvY2VzcyBXaXphcmQgUGFnZQ0KLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RpdGxlPVx1OTA3OFx1NTNkNlx1NmQ0MVx1N2EwYlx1NTQ4Y1x1NTMyZlx1NTFmYVx1OTA3OFx1OTgwNQ0KLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RleHQ9XHU5MDc4XHU1M2Q2XHU4OTgxXHU1MzJmXHU1MWZhXHU3Njg0XHU3YTBiXHU1ZThmXHVmZjBjXHU0ZTI2XHU2MzA3XHU1YjlhXHU1MzJmXHU1MWZhXHU5MDc4XHU5ODA1XHUzMDAyDQotcHJvY2Vzc0dyb3VwX3RleHQ9XHU3YTBiXHU1ZThmDQotY2FwYWJpbGl0eVBhdHRlcm5SYWRpb0J1dHRvbl90ZXh0PVx1NTI5Zlx1ODBmZFx1NTc4Ylx1NmEyMw0KLWRlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uX3RleHQ9XHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiDQotb3B0aW9uc0dyb3VwX3RleHQ9XHU1MzJmXHU1MWZhXHU5MDc4XHU5ODA1DQotcHJvY2Vzc05hbWVMYWJlbF90ZXh0PVx1NTQwZFx1N2EzMVx1ZmYxYQ0KLWNvbnRleHROYW1lTGFiZWxfdGV4dD1cdTkxNGRcdTdmNmVcdWZmMWENCi1wdWJsaXNoQ29uZmlndXJhdGlvbkNoZWNrQm94X3RleHQ9XHU3NjdjXHU0ZjQ4XHU5MDc4XHU1M2Q2XHU3Njg0XHU5MTRkXHU3ZjZlDQotZXhwb3J0T25seVBsYW5uZWRFbGVtZW50c0NoZWNrQm94X3RleHQ9XHU1M2VhXHU1MzJmXHU1MWZhXHU1ZGYyXHU4OThmXHU1MjgzXHU3Njg0XHU1MjA2XHU4OWUzXHU1MTQzXHU3ZDIwDQotDQotIyBTZWxlY3QgUHVibGlzaGluZyBPcHRpb25zIFdpemFyZCBQYWdlDQotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RpdGxlPVx1OTA3OFx1NTNkNlx1NzY3Y1x1NGY0OFx1OTA3OFx1OTgwNQ0KLXNlbGVjdFB1Ymxpc2hPcHRpb25zV2l6YXJkUGFnZV90ZXh0PVx1OTA3OFx1NTNkNlx1NzY3Y1x1NGY0OFx1OTA3OFx1OTgwNVx1ZmYwY1x1NWMwN1x1NzUyOFx1NGY4Nlx1NzY3Y1x1NGY0OFx1NjMwN1x1NWI5YVx1NzY4NFx1OTE0ZFx1N2Y2ZVx1MzAwMg0KLQ0KLSMgU2VsZWN0IEV4cG9ydCBEaXJlY3RvcnkgV2l6YXJkIHBhZ2UNCi1zZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RpdGxlPVx1NjMwN1x1NWI5YVx1NWMwOFx1Njg0OFx1NTQwZFx1N2EzMVx1NTQ4Y1x1NTMyZlx1NTFmYVx1NzZlZVx1OTMwNA0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGV4dD1cdTYzMDdcdTViOWEgTWljcm9zb2Z0IFByb2plY3QgXHU1NDBkXHU3YTMxXHU1NDhjXHU1MzJmXHU1MWZhXHU3NmVlXHU5MzA0XHUzMDAyDQotcHJvamVjdE5hbWVMYWJlbF90ZXh0PVx1NTQwZFx1N2EzMVx1ZmYxYQ0KLWRpckxhYmVsX3RleHQ9XHU3NmVlXHU5MzA0XHVmZjFhDQotYnJvd3NlQnV0dG9uX3RleHQ9XHU3MDBmXHU4OWJkLi4uDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWV4cG9ydE1TUFRhc2tfbmFtZT1cdTVjMDdcdTkwNzhcdTUzZDZcdTc2ODRcdTdhMGJcdTVlOGZcdTUzMmZcdTUxZmFcdTUyMzAgTWljcm9zb2Z0IFByb2plY3QuLi4NCi0NCi0jIENvbmZpcm1hdGlvbiBNZXNzYWdlcw0KLW92ZXJ3cml0ZVRleHRfbXNnPU1pY3Jvc29mdCBQcm9qZWN0ICcnezB9JycgXHU1ZGYyXHU1YjU4XHU1NzI4ICcnezF9JycgXHU0ZTJkXHUzMDAyXG5cdTYwYThcdTg5ODFcdTg5ODZcdTViZWJcdTViODNcdTU1Y2VcdWZmMWYNCi1jb21wbGV0ZWRUZXh0X21zZz1cdTkwNzhcdTUzZDZcdTc2ODRcdTdhMGJcdTVlOGYgJyd7MH0nJyBcdTVkZjJcdTk4MDZcdTUyMjlcdTUzMmZcdTUxZmFcdTUyMzAgTWljcm9zb2Z0IFByb2plY3QgWE1MIFx1NmE5NCAnJ3sxfScnXHUzMDAyDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWV4cG9ydE1TUEVycm9yX21zZz1cdTVjMDdcdTkwNzhcdTUzZDZcdTc2ODRcdTdhMGJcdTVlOGYgJyd7MH0nJyBcdTUzMmZcdTUxZmFcdTUyMzAgTWljcm9zb2Z0IFByb2plY3QgJyd7MX0nJyBcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdTMwMDINCi1leHBvcnRNU1BFcnJvcl9yZWFzb249XHU1OTgyXHU5NzAwXHU3NmY4XHU5NWRjXHU4Y2M3XHU4YTBhXHVmZjBjXHU4YWNiXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5XHUzMDBkXHUzMDAyDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAxYzA3MTAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlhMTA0YzYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwyLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBmcmFnbWVudAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwMzY5YTAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLm5sMi5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMi5qYXIgPSBiaW4vDQotYmluLmluY2x1ZGVzID0gbmwyLmphcixcDQotICAgICAgICAgICAgICAgcGx1Z2luX3J1LnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgZnJhZ21lbnQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyL2ZyYWdtZW50LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMi9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NmNkYmEwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyL2ZyYWdtZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZyYWdtZW50TmFtZT1FUEYgQ29tcG9zZXIgTVNQIEV4cG9ydCAoTkwyKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDViYzY4ZGIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBcdTA0MzIgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM1XHUwNDNhXHUwNDQyIE1pY3Jvc29mdA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgV2l6YXJkcw0KLWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZE5hbWU9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDM1XHUwNDNhXHUwNDQyIE1pY3Jvc29mdA0KLWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZERlc2NyaXB0aW9uPVx1MDQyZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzAgXHUwNDMyIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNVx1MDQzYVx1MDQ0MiBNaWNyb3NvZnQuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MDg3ZmY4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXNfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgV2l6YXJkDQotZXhwb3J0TVNQV2l6YXJkX3RpdGxlPVx1MDQyZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBcdTA0MzIgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM1XHUwNDNhXHUwNDQyIE1pY3Jvc29mdA0KLQ0KLSMgU2VsZWN0IFByb2Nlc3MgV2l6YXJkIFBhZ2UNCi1zZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90aXRsZT1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxIFx1MDQzOCBcdTA0M2ZcdTA0MzBcdTA0NDBcdTA0MzBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0NDBcdTA0NGIgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwDQotc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGV4dD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzAgXHUwNDM4IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0MzBcdTA0NDBcdTA0MzBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0NDBcdTA0NGIgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwLg0KLXByb2Nlc3NHcm91cF90ZXh0PVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MQ0KLWNhcGFiaWxpdHlQYXR0ZXJuUmFkaW9CdXR0b25fdGV4dD1cdTA0MjhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2QgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5DQotZGVsaXZlcnlQcm9jZXNzUmFkaW9CdXR0b25fdGV4dD1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDEgXHUwNDM0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNhXHUwNDM4DQotb3B0aW9uc0dyb3VwX3RleHQ9XHUwNDFlXHUwNDNmXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzMA0KLXByb2Nlc3NOYW1lTGFiZWxfdGV4dD1cdTA0MThcdTA0M2NcdTA0NGY6DQotY29udGV4dE5hbWVMYWJlbF90ZXh0PVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZjoNCi1wdWJsaXNoQ29uZmlndXJhdGlvbkNoZWNrQm94X3RleHQ9XHUwNDFlXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUNCi1leHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzQ2hlY2tCb3hfdGV4dD1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQyXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDNlIFx1MDQzZlx1MDQzYlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzY1x1MDQ0Ylx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDRiDQotDQotIyBTZWxlY3QgUHVibGlzaGluZyBPcHRpb25zIFdpemFyZCBQYWdlDQotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RpdGxlPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQzOCwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQ0M1x1MDQ0MiBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NGIgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Lg0KLQ0KLSMgU2VsZWN0IEV4cG9ydCBEaXJlY3RvcnkgV2l6YXJkIHBhZ2UNCi1zZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RpdGxlPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDMwIFx1MDQzOCBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzMgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzMA0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGV4dD1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzMCBNaWNyb3NvZnQgXHUwNDM4IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMyBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwLg0KLXByb2plY3ROYW1lTGFiZWxfdGV4dD1cdTA0MThcdTA0M2NcdTA0NGY6DQotZGlyTGFiZWxfdGV4dD1cdTA0MWFcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzM6DQotYnJvd3NlQnV0dG9uX3RleHQ9XHUwNDFlXHUwNDMxXHUwNDM3XHUwNDNlXHUwNDQwLi4uDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWV4cG9ydE1TUFRhc2tfbmFtZT1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMCBcdTA0MzIgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM1XHUwNDNhXHUwNDQyIE1pY3Jvc29mdC4uLg0KLQ0KLSMgQ29uZmlybWF0aW9uIE1lc3NhZ2VzDQotb3ZlcndyaXRlVGV4dF9tc2c9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDM1XHUwNDNhXHUwNDQyIE1pY3Jvc29mdCAnJ3swfScnIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIgXHUwNDMyICcnezF9JycuXG5cdTA0MTdcdTA0MzBcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM1XHUwNDMzXHUwNDNlPw0KLWNvbXBsZXRlZFRleHRfbXNnPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDEgJyd7MH0nJyBcdTA0NDNcdTA0NDFcdTA0M2ZcdTA0MzVcdTA0NDhcdTA0M2RcdTA0M2UgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkIFx1MDQzMiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgWE1MIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzMCBNaWNyb3NvZnQgJyd7MX0nJy4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotZXhwb3J0TVNQRXJyb3JfbXNnPVx1MDQxZlx1MDQ0MFx1MDQzOCBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwICcnezB9JycgXHUwNDMyIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNVx1MDQzYVx1MDQ0MiBNaWNyb3NvZnQgJyd7MX0nJyBcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2RcdTA0MzhcdTA0M2FcdTA0M2JcdTA0MzAgXHUwNDNlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwLg0KLWV4cG9ydE1TUEVycm9yX3JlYXNvbj1cdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZFx1MDQzZVx1MDQzZlx1MDQzYVx1MDQ0MyBcdTA0MjFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTAwY2JhOC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmZjhjYjUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZnJhZ21lbnROYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDJhLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBmcmFnbWVudAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDJhL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjdlNTRjMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLm5sMmEuamFyID0gc3JjLw0KLW91dHB1dC5ubDJhLmphciA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBubDJhLmphcixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RhLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgZnJhZ21lbnQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyYS9mcmFnbWVudC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDJhL2ZyYWdtZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3YTY5ZTYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDJhL2ZyYWdtZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZyYWdtZW50TmFtZT1FUEYgQ29tcG9zZXIgTVNQIEV4cG9ydCAoTkwyYSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiOWM0MDAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBla3Nwb3J0IGFmIE1pY3Jvc29mdCBQcm9qZWN0DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBXaXphcmRzDQotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkTmFtZT1NaWNyb3NvZnQgUHJvamVjdA0KLWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZERlc2NyaXB0aW9uPUVrc3BvcnRcdTAwZTlyIGVuIHByb2NlcyB0aWwgTWljcm9zb2Z0IFByb2plY3QuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXNfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZkYTI3OWYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXNfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgV2l6YXJkDQotZXhwb3J0TVNQV2l6YXJkX3RpdGxlPUVrc3BvcnRcdTAwZTlyIE1pY3Jvc29mdCBQcm9qZWN0DQotDQotIyBTZWxlY3QgUHJvY2VzcyBXaXphcmQgUGFnZQ0KLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RpdGxlPVZcdTAwZTZsZyBwcm9jZXMgb2cgZWtzcG9ydGluZHN0aWxsaW5nZXINCi1zZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90ZXh0PVZcdTAwZTZsZyBlbiBwcm9jZXMsIGRlciBza2FsIGVrc3BvcnRlcmVzLCBvZyBhbmdpdiBla3Nwb3J0dmFsZ2VuZS4NCi1wcm9jZXNzR3JvdXBfdGV4dD1Qcm9jZXMNCi1jYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uX3RleHQ9RnVua3Rpb25zbVx1MDBmOG5zdGVyDQotZGVsaXZlcnlQcm9jZXNzUmFkaW9CdXR0b25fdGV4dD1MZXZlcmluZ3Nwcm9jZXMNCi1vcHRpb25zR3JvdXBfdGV4dD1Fa3Nwb3J0dmFsZw0KLXByb2Nlc3NOYW1lTGFiZWxfdGV4dD1OYXZuOg0KLWNvbnRleHROYW1lTGFiZWxfdGV4dD1Lb25maWd1cmF0aW9uOg0KLXB1Ymxpc2hDb25maWd1cmF0aW9uQ2hlY2tCb3hfdGV4dD1QdWJsaWNcdTAwZTlyIGRlbiB2YWxndGUga29uZmlndXJhdGlvbg0KLWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHNDaGVja0JveF90ZXh0PUVrc3BvcnRcdTAwZTlyIGt1biBwbGFubGFndGUgbmVkYnJ5ZG5pbmdzZWxlbWVudGVyDQotDQotIyBTZWxlY3QgUHVibGlzaGluZyBPcHRpb25zIFdpemFyZCBQYWdlDQotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RpdGxlPVZcdTAwZTZsZyBwdWJsaWNlcmluZ3NpbmRzdGlsbGluZ2VyDQotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RleHQ9Vlx1MDBlNmxnIGRlIHB1YmxpY2VyaW5nc2luZHN0aWxsaW5nZXIsIGRlciBza2FsIGJydWdlcyB0aWwgYXQgcHVibGljZXJlIGRlbiBhbmdpdm5lIGtvbmZpZ3VyYXRpb24uDQotDQotIyBTZWxlY3QgRXhwb3J0IERpcmVjdG9yeSBXaXphcmQgcGFnZQ0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGl0bGU9QW5naXYgcHJvamVrdG5hdm4gb2cgZWtzcG9ydGJpYmxpb3Rlaw0KLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGV4dD1BbmdpdiBNaWNyb3NvZnQgUHJvamVjdC1uYXZuZXQgb2cgZWtzcG9ydGJpYmxpb3Rla2V0Lg0KLXByb2plY3ROYW1lTGFiZWxfdGV4dD1OYXZuOg0KLWRpckxhYmVsX3RleHQ9QmlibGlvdGVrOg0KLWJyb3dzZUJ1dHRvbl90ZXh0PUdlbm5lbXNlLi4uDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWV4cG9ydE1TUFRhc2tfbmFtZT1Fa3Nwb3J0ZXJlciBkZW4gdmFsZ3RlIHByb2NlcyB0aWwgTWljcm9zb2Z0IFByb2plY3QuLi4NCi0NCi0jIENvbmZpcm1hdGlvbiBNZXNzYWdlcw0KLW92ZXJ3cml0ZVRleHRfbXNnPU1pY3Jvc29mdCBQcm9qZWN0LXByb2pla3RldCAnJ3swfScnIGZpbmRlcyBhbGxlcmVkZSBpICcnezF9JycuXG5WaWwgZHUgb3ZlcnNrcml2ZT8NCi1jb21wbGV0ZWRUZXh0X21zZz1EZW4gdmFsZ3RlIHByb2NlcywgJyd7MH0nJywgZXIgZWtzcG9ydGVyZXQgdGlsIE1pY3Jvc29mdCBQcm9qZWN0IFhNTC1maWxlbiAnJ3sxfScnLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1leHBvcnRNU1BFcnJvcl9tc2c9RGVyIGVyIG9wc3RcdTAwZTVldCBlbiBmZWpsIHVuZGVyIGVrc3BvcnQgYWYgcHJvY2Vzc2VuICcnezB9JycgdGlsIE1pY3Jvc29mdCBQcm9qZWN0ICcnezF9JycuDQotZXhwb3J0TVNQRXJyb3JfcmVhc29uPUtsaWsgcFx1MDBlNSBPcGx5c25pbmdlciBmb3IgYXQgZlx1MDBlNSBmbGVyZSBvcGx5c25pbmdlci4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE5YzFlYzguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzg5NmEzOC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgRXhwb3J0IChOTDEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZTdiMDEyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OWZiZDQzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIEV4cG9ydA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgUGVyc3BlY3RpdmUNCi1wYWNrYWdpbmdQZXJzcGVjdGl2ZU5hbWU9UGFja2VuDQotDQotIyBDYXRlZ29yeQ0KLXBhY2thZ2luZ0NhdGVnb3J5TmFtZT1QYWNrZW4NCi0NCi0jIFZpZXdzDQotcGFja2FnaW5nVmlld05hbWU9TWV0aG9kZW5iaWJsaW90aGVrIHBhY2tlbg0KLXBhY2thZ2luZ01lc3NhZ2VWaWV3TmFtZT1OYWNocmljaHRlbiB6dW0gUGFja2VuIGRlciBCaWJsaW90aGVrDQotDQotIyBBY3Rpb24gU2V0DQotcGFja2FnaW5nQWN0aW9uU2V0PVBhY2tlbg0KLQ0KLSMgQWN0aW9ucw0KLW5ld0NvbmZpZ0FjdGlvbj0mS29uZmlndXJhdGlvbg0KLW5ld0NvbmZpZ0FjdGlvblRvb2x0aXA9TmV1ZSBCaWJsaW90aGVrc2tvbmZpZ3VyYXRpb24gZXJzdGVsbGVuDQotb3BlbkNvbmZpZ0FjdGlvbj0mS29uZmlndXJhdGlvbg0KLW9wZW5Db25maWdBY3Rpb25Ub29sdGlwPVZvcmhhbmRlbmUgQmlibGlvdGhla3Nrb25maWd1cmF0aW9uIFx1MDBmNmZmbmVuDQotDQotIyBFeHBvcnQgV2l6YXJkIENhdGVnb3J5DQotZXhwb3J0Q2F0ZWdvcnlOYW1lPU1ldGhvZGUNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lPUJpYmxpb3RoZWtza29uZmlndXJhdGlvbg0KLWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uPUVpbmUgQmlibGlvdGhla3Nrb25maWd1cmF0aW9uIGV4cG9ydGllcmVuDQotDQotIyBFeHBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZA0KLWV4cG9ydE1ldGhvZFBsdWdpbnNXaXphcmROYW1lPU1ldGhvZGVuLVBsdWctaW5zDQotZXhwb3J0TWV0aG9kUGx1Z2lucz1FaW5lIG9kZXIgbWVocmVyZSBNZXRob2Rlbi1QbHVnLWlucyBleHBvcnRpZXJlbi4NCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9wbHVnaW5fZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTc1MTgyMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FeHBvcnRhY2lcdTAwZjNuIGRlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgUGVyc3BlY3RpdmUNCi1wYWNrYWdpbmdQZXJzcGVjdGl2ZU5hbWU9RW1wYXF1ZXRhZG8NCi0NCi0jIENhdGVnb3J5DQotcGFja2FnaW5nQ2F0ZWdvcnlOYW1lPUVtcGFxdWV0YWRvDQotDQotIyBWaWV3cw0KLXBhY2thZ2luZ1ZpZXdOYW1lPUJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGRlIGVtcGFxdWV0YWRvDQotcGFja2FnaW5nTWVzc2FnZVZpZXdOYW1lPU1lbnNhamUgZGUgZW1wYXF1ZXRhZG8gZGUgbGEgYmlibGlvdGVjYQ0KLQ0KLSMgQWN0aW9uIFNldA0KLXBhY2thZ2luZ0FjdGlvblNldD1FbXBhcXVldGFkbw0KLQ0KLSMgQWN0aW9ucw0KLW5ld0NvbmZpZ0FjdGlvbj0mQ29uZmlndXJhY2lcdTAwZjNuDQotbmV3Q29uZmlnQWN0aW9uVG9vbHRpcD1DcmVhciB1bmEgbnVldmEgY29uZmlndXJhY2lcdTAwZjNuIGRlIGJpYmxpb3RlY2ENCi1vcGVuQ29uZmlnQWN0aW9uPSZDb25maWd1cmFjaVx1MDBmM24NCi1vcGVuQ29uZmlnQWN0aW9uVG9vbHRpcD1BYnJpciB1bmEgY29uZmlndXJhY2lcdTAwZjNuIGRlIGJpYmxpb3RlY2EgZXhpc3RlbnRlDQotDQotIyBFeHBvcnQgV2l6YXJkIENhdGVnb3J5DQotZXhwb3J0Q2F0ZWdvcnlOYW1lPU1cdTAwZTl0b2RvDQotDQotIyBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1Db25maWd1cmFjaVx1MDBmM24gZGUgbGEgYmlibGlvdGVjYQ0KLWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uPUV4cG9ydGFyIHVuYSBjb25maWd1cmFjaVx1MDBmM24gZGUgbGEgYmlibGlvdGVjYS4NCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9UGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8NCi1leHBvcnRNZXRob2RQbHVnaW5zPUV4cG9ydGFyIHVubyBvIHZhcmlvcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kby4NCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9wbHVnaW5fZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmEyODA5ZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FeHBvcnRhdGlvbiBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIFBlcnNwZWN0aXZlDQotcGFja2FnaW5nUGVyc3BlY3RpdmVOYW1lPVJlZ3JvdXBlbWVudA0KLQ0KLSMgQ2F0ZWdvcnkNCi1wYWNrYWdpbmdDYXRlZ29yeU5hbWU9UmVncm91cGVtZW50DQotDQotIyBWaWV3cw0KLXBhY2thZ2luZ1ZpZXdOYW1lPUJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZGUgcmVncm91cGVtZW50DQotcGFja2FnaW5nTWVzc2FnZVZpZXdOYW1lPU1lc3NhZ2UgZGUgcmVncm91cGVtZW50IGRlIGJpYmxpb3RoXHUwMGU4cXVlcw0KLQ0KLSMgQWN0aW9uIFNldA0KLXBhY2thZ2luZ0FjdGlvblNldD1SZWdyb3VwZW1lbnQNCi0NCi0jIEFjdGlvbnMNCi1uZXdDb25maWdBY3Rpb249JkNvbmZpZ3VyYXRpb24NCi1uZXdDb25maWdBY3Rpb25Ub29sdGlwPUNyXHUwMGU5ZXIgdW5lIG5vdXZlbGxlIGNvbmZpZ3VyYXRpb24gZGUgYmlibGlvdGhcdTAwZThxdWUNCi1vcGVuQ29uZmlnQWN0aW9uPSZDb25maWd1cmF0aW9uDQotb3BlbkNvbmZpZ0FjdGlvblRvb2x0aXA9T3V2cmlyIHVuZSBjb25maWd1cmF0aW9uIGRlIGJpYmxpb3RoXHUwMGU4cXVlIGV4aXN0YW50ZQ0KLQ0KLSMgRXhwb3J0IFdpemFyZCBDYXRlZ29yeQ0KLWV4cG9ydENhdGVnb3J5TmFtZT1NXHUwMGU5dGhvZGUNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lPUNvbmZpZ3VyYXRpb24gZGUgYmlibGlvdGhcdTAwZThxdWUNCi1leHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbj1FeHBvcnRlciB1bmUgY29uZmlndXJhdGlvbiBkZSBiaWJsaW90aFx1MDBlOHF1ZS4NCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9UGx1Zy1pbnMgZGUgbVx1MDBlOXRob2RlDQotZXhwb3J0TWV0aG9kUGx1Z2lucz1FeHBvcnRlciB1biBvdSBwbHVzaWV1cnMgcGx1Zy1pbnMgZGUgbVx1MDBlOXRob2RlLg0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDE1Nzg2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVzcG9ydGEgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBQZXJzcGVjdGl2ZQ0KLXBhY2thZ2luZ1BlcnNwZWN0aXZlTmFtZT1DcmVhemlvbmUgZGkgcGFjY2hldHRpDQotDQotIyBDYXRlZ29yeQ0KLXBhY2thZ2luZ0NhdGVnb3J5TmFtZT1DcmVhemlvbmUgZGkgcGFjY2hldHRpDQotDQotIyBWaWV3cw0KLXBhY2thZ2luZ1ZpZXdOYW1lPUNyZWF6aW9uZSBwYWNjaGV0dGkgbGlicmVyaWUgZGVpIG1ldG9kaQ0KLXBhY2thZ2luZ01lc3NhZ2VWaWV3TmFtZT1NZXNzYWdnaW8gY3JlYXppb25lIHBhY2NoZXR0aSBkaSBsaWJyZXJpZQ0KLQ0KLSMgQWN0aW9uIFNldA0KLXBhY2thZ2luZ0FjdGlvblNldD1DcmVhemlvbmUgZGkgcGFjY2hldHRpDQotDQotIyBBY3Rpb25zDQotbmV3Q29uZmlnQWN0aW9uPSZDb25maWd1cmF6aW9uZQ0KLW5ld0NvbmZpZ0FjdGlvblRvb2x0aXA9Q3JlYSB1bmEgbnVvdmEgY29uZmlndXJhemlvbmUgZGkgbGlicmVyaWENCi1vcGVuQ29uZmlnQWN0aW9uPSZDb25maWd1cmF6aW9uZQ0KLW9wZW5Db25maWdBY3Rpb25Ub29sdGlwPUFwcmkgdW5hIGNvbmZpZ3VyYXppb25lIGRpIGxpYnJlcmlhIGVzaXN0ZW50ZQ0KLQ0KLSMgRXhwb3J0IFdpemFyZCBDYXRlZ29yeQ0KLWV4cG9ydENhdGVnb3J5TmFtZT1NZXRvZG8NCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lPUNvbmZpZ3VyYXppb25lIGRpIGxpYnJlcmlhDQotZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb249RXNwb3J0YXJlIHVuYSBjb25maWd1cmF6aW9uZSBkaSBsaWJyZXJpYS4NCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9UGx1Zy1pbiBkZWwgbWV0b2RvDQotZXhwb3J0TWV0aG9kUGx1Z2lucz1Fc3BvcnRhcmUgdW5vIG8gcGlcdTAwZjkgcGx1Zy1pbiBkZWwgbWV0b2RvLg0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMmU3MjhmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBFeHBvcnQNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIFBlcnNwZWN0aXZlDQotcGFja2FnaW5nUGVyc3BlY3RpdmVOYW1lPVx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOFx1NTMxNg0KLQ0KLSMgQ2F0ZWdvcnkNCi1wYWNrYWdpbmdDYXRlZ29yeU5hbWU9XHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4XHU1MzE2DQotDQotIyBWaWV3cw0KLXBhY2thZ2luZ1ZpZXdOYW1lPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOFx1NTMxNg0KLXBhY2thZ2luZ01lc3NhZ2VWaWV3TmFtZT1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjhcdTUzMTZcdTMwZTFcdTMwYzNcdTMwYmJcdTMwZmNcdTMwYjgNCi0NCi0jIEFjdGlvbiBTZXQNCi1wYWNrYWdpbmdBY3Rpb25TZXQ9XHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4XHU1MzE2DQotDQotIyBBY3Rpb25zDQotbmV3Q29uZmlnQWN0aW9uPVx1NjljYlx1NjIxMCgmQykNCi1uZXdDb25maWdBY3Rpb25Ub29sdGlwPVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1NjljYlx1NjIxMFx1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMA0KLW9wZW5Db25maWdBY3Rpb249XHU2OWNiXHU2MjEwKCZDKQ0KLW9wZW5Db25maWdBY3Rpb25Ub29sdGlwPVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1NjljYlx1NjIxMFx1MzA5Mlx1OTU4Ylx1MzA0Zg0KLQ0KLSMgRXhwb3J0IFdpemFyZCBDYXRlZ29yeQ0KLWV4cG9ydENhdGVnb3J5TmFtZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzkNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lPVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1NjljYlx1NjIxMA0KLWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uPVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1NjljYlx1NjIxMFx1MzA5Mlx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLSMgRXhwb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1leHBvcnRNZXRob2RQbHVnaW5zV2l6YXJkTmFtZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjMNCi1leHBvcnRNZXRob2RQbHVnaW5zPTEgXHUzMDY0XHU0ZWU1XHU0ZTBhXHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDkyXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlODYxNDQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFx1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgUGVyc3BlY3RpdmUNCi1wYWNrYWdpbmdQZXJzcGVjdGl2ZU5hbWU9XHVkMzI4XHVkMGE0XHVjOWQ1DQotDQotIyBDYXRlZ29yeQ0KLXBhY2thZ2luZ0NhdGVnb3J5TmFtZT1cdWQzMjhcdWQwYTRcdWM5ZDUNCi0NCi0jIFZpZXdzDQotcGFja2FnaW5nVmlld05hbWU9XHVkMzI4XHVkMGE0XHVjOWQ1IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMNCi1wYWNrYWdpbmdNZXNzYWdlVmlld05hbWU9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1ZDMyOFx1ZDBhNFx1YzlkNSBcdWJhNTRcdWMyZGNcdWM5YzANCi0NCi0jIEFjdGlvbiBTZXQNCi1wYWNrYWdpbmdBY3Rpb25TZXQ9XHVkMzI4XHVkMGE0XHVjOWQ1DQotDQotIyBBY3Rpb25zDQotbmV3Q29uZmlnQWN0aW9uPVx1YWQ2Y1x1YzEzMSgmQykNCi1uZXdDb25maWdBY3Rpb25Ub29sdGlwPVx1YzBjOCBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVhZDZjXHVjMTMxIFx1Yzc5MVx1YzEzMQ0KLW9wZW5Db25maWdBY3Rpb249XHVhZDZjXHVjMTMxKCZDKQ0KLW9wZW5Db25maWdBY3Rpb25Ub29sdGlwPVx1YWUzMFx1Yzg3NCBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVhZDZjXHVjMTMxIFx1YzVmNFx1YWUzMA0KLQ0KLSMgRXhwb3J0IFdpemFyZCBDYXRlZ29yeQ0KLWV4cG9ydENhdGVnb3J5TmFtZT1cdWJhNTRcdWMxOGNcdWI0ZGMNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lPVx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWFkNmNcdWMxMzENCi1leHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbj1cdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YjBiNFx1YmNmNFx1YjBjNVx1YjJjOFx1YjJlNC4NCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9XHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OA0KLWV4cG9ydE1ldGhvZFBsdWdpbnM9XHVkNTU4XHViMDk4IFx1Yzc3NFx1YzBjMVx1Yzc1OCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzQ0IFx1YjBiNFx1YmNmNFx1YjBjNVx1YjJjOFx1YjJlNC4NCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjE0NmI3OS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FeHBvcnRhXHUwMGU3XHUwMGUzbyBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIFBlcnNwZWN0aXZlDQotcGFja2FnaW5nUGVyc3BlY3RpdmVOYW1lPUVtcGFjb3RhbWVudG8NCi0NCi0jIENhdGVnb3J5DQotcGFja2FnaW5nQ2F0ZWdvcnlOYW1lPUVtcGFjb3RhbWVudG8NCi0NCi0jIFZpZXdzDQotcGFja2FnaW5nVmlld05hbWU9QmlibGlvdGVjYSBkZSBNXHUwMGU5dG9kb3MgZGUgRW1wYWNvdGFtZW50bw0KLXBhY2thZ2luZ01lc3NhZ2VWaWV3TmFtZT1NZW5zYWdlbSBkZSBFbXBhY290YW1lbnRvIGRlIEJpYmxpb3RlY2ENCi0NCi0jIEFjdGlvbiBTZXQNCi1wYWNrYWdpbmdBY3Rpb25TZXQ9RW1wYWNvdGFtZW50bw0KLQ0KLSMgQWN0aW9ucw0KLW5ld0NvbmZpZ0FjdGlvbj0mQ29uZmlndXJhXHUwMGU3XHUwMGUzbw0KLW5ld0NvbmZpZ0FjdGlvblRvb2x0aXA9Q3JpYXIgdW1hIG5vdmEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBiaWJsaW90ZWNhDQotb3BlbkNvbmZpZ0FjdGlvbj0mQ29uZmlndXJhXHUwMGU3XHUwMGUzbw0KLW9wZW5Db25maWdBY3Rpb25Ub29sdGlwPUFicmlyIHVtYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIGJpYmxpb3RlY2EgZXhpc3RlbnRlDQotDQotIyBFeHBvcnQgV2l6YXJkIENhdGVnb3J5DQotZXhwb3J0Q2F0ZWdvcnlOYW1lPU1cdTAwZTl0b2RvDQotDQotIyBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1Db25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIEJpYmxpb3RlY2ENCi1leHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbj1FeHBvcnRhciB1bWEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBiaWJsaW90ZWNhLg0KLQ0KLSMgRXhwb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1leHBvcnRNZXRob2RQbHVnaW5zV2l6YXJkTmFtZT1QbHVnLWlucyBkZSBNXHUwMGU5dG9kbw0KLWV4cG9ydE1ldGhvZFBsdWdpbnM9RXhwb3J0YXIgdW0gb3UgbWFpcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kby4NCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQ2NmYyNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHU1YmZjXHU1MWZhDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBQZXJzcGVjdGl2ZQ0KLXBhY2thZ2luZ1BlcnNwZWN0aXZlTmFtZT1cdTYyNTNcdTUzMDUNCi0NCi0jIENhdGVnb3J5DQotcGFja2FnaW5nQ2F0ZWdvcnlOYW1lPVx1NjI1M1x1NTMwNQ0KLQ0KLSMgVmlld3MNCi1wYWNrYWdpbmdWaWV3TmFtZT1cdTYyNTNcdTUzMDVcdTY1YjlcdTZjZDVcdTVlOTMNCi1wYWNrYWdpbmdNZXNzYWdlVmlld05hbWU9XHU1ZTkzXHU2MjUzXHU1MzA1XHU2ZDg4XHU2MDZmDQotDQotIyBBY3Rpb24gU2V0DQotcGFja2FnaW5nQWN0aW9uU2V0PVx1NjI1M1x1NTMwNQ0KLQ0KLSMgQWN0aW9ucw0KLW5ld0NvbmZpZ0FjdGlvbj1cdTkxNGRcdTdmNmUoJkMpDQotbmV3Q29uZmlnQWN0aW9uVG9vbHRpcD1cdTUyMWJcdTVlZmFcdTY1YjBcdTVlOTNcdTkxNGRcdTdmNmUNCi1vcGVuQ29uZmlnQWN0aW9uPVx1OTE0ZFx1N2Y2ZSgmQykNCi1vcGVuQ29uZmlnQWN0aW9uVG9vbHRpcD1cdTYyNTNcdTVmMDBcdTczYjBcdTY3MDlcdTVlOTNcdTkxNGRcdTdmNmUNCi0NCi0jIEV4cG9ydCBXaXphcmQgQ2F0ZWdvcnkNCi1leHBvcnRDYXRlZ29yeU5hbWU9XHU2NWI5XHU2Y2Q1DQotDQotIyBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1cdTVlOTNcdTkxNGRcdTdmNmUNCi1leHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbj1cdTViZmNcdTUxZmFcdTVlOTNcdTkxNGRcdTdmNmVcdTMwMDINCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2DQotZXhwb3J0TWV0aG9kUGx1Z2lucz1cdTViZmNcdTUxZmFcdTRlMDBcdTRlMmFcdTYyMTZcdTU5MWFcdTRlMmFcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjZcdTMwMDINCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTcwMjcyNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgRXhwb3J0DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBQZXJzcGVjdGl2ZQ0KLXBhY2thZ2luZ1BlcnNwZWN0aXZlTmFtZT1cdTU5NTdcdTg4ZGQNCi0NCi0jIENhdGVnb3J5DQotcGFja2FnaW5nQ2F0ZWdvcnlOYW1lPVx1NTk1N1x1ODhkZA0KLQ0KLSMgVmlld3MNCi1wYWNrYWdpbmdWaWV3TmFtZT1cdTU5NTdcdTg4ZGRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWINCi1wYWNrYWdpbmdNZXNzYWdlVmlld05hbWU9XHU3YTBiXHU1ZjBmXHU1ZWFiXHU1OTU3XHU4OGRkXHU4YTBhXHU2MDZmDQotDQotIyBBY3Rpb24gU2V0DQotcGFja2FnaW5nQWN0aW9uU2V0PVx1NTk1N1x1ODhkZA0KLQ0KLSMgQWN0aW9ucw0KLW5ld0NvbmZpZ0FjdGlvbj1cdTkxNGRcdTdmNmUoJkMpDQotbmV3Q29uZmlnQWN0aW9uVG9vbHRpcD1cdTVlZmFcdTdhY2JcdTY1YjBcdTc2ODRcdTdhMGJcdTVmMGZcdTVlYWJcdTkxNGRcdTdmNmUNCi1vcGVuQ29uZmlnQWN0aW9uPVx1OTE0ZFx1N2Y2ZSgmQykNCi1vcGVuQ29uZmlnQWN0aW9uVG9vbHRpcD1cdTk1OGJcdTU1NWZcdTczZmVcdTY3MDlcdTc2ODRcdTdhMGJcdTVmMGZcdTVlYWJcdTkxNGRcdTdmNmUNCi0NCi0jIEV4cG9ydCBXaXphcmQgQ2F0ZWdvcnkNCi1leHBvcnRDYXRlZ29yeU5hbWU9XHU2NWI5XHU2Y2Q1DQotDQotIyBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1cdTdhMGJcdTVmMGZcdTVlYWJcdTkxNGRcdTdmNmUNCi1leHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbj1cdTUzMmZcdTUxZmFcdTdhMGJcdTVmMGZcdTVlYWJcdTkxNGRcdTdmNmVcdTMwMDINCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotZXhwb3J0TWV0aG9kUGx1Z2lucz1cdTUzMmZcdTUxZmFcdTRlMDBcdTYyMTZcdTU5MWFcdTUwMGJcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTMwMDINCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWVhMzc4Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQRTAwMDBFIC0gSVVQRTAwOTlFDQotIw0KLQ0KLSMgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1leHBvcnRDb25maWdXaXphcmRfdGl0bGU9QmlibGlvdGhla3Nrb25maWd1cmF0aW9uIGV4cG9ydGllcmVuDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfdGl0bGU9RXhwb3J0dHlwIGF1c3dcdTAwZTRobGVuDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYz1XXHUwMGU0aGxlbiBTaWUgZGVuIFR5cCBkZXIgenUgZXhwb3J0aWVyZW5kZW4gQmlibGlvdGhla3Nrb25maWd1cmF0aW9uIGF1cy4NCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdMYWJlbF90ZXh0PU1ldGhvZGVua29uZmlndXJhdGlvbiBtaXQgYWxsZW4gTWV0aG9kZW4tUGx1Zy1pbnMgZXhwb3J0aWVyZW4NCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdTcGVjc0xhYmVsX3RleHQ9RWluZSBvZGVyIG1laHJlcmUgU3BlemlmaWthdGlvbmVuIGZcdTAwZmNyIE1ldGhvZGVua29uZmlndXJhdGlvbmVuIGV4cG9ydGllcmVuDQotc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1NZXRob2RlbmtvbmZpZ3VyYXRpb24gYXVzd1x1MDBlNGhsZW4NCi1zZWxlY3RDb25maWdQYWdlX2Rlc2M9V1x1MDBlNGhsZW4gU2llIGVpbmUgenUgZXhwb3J0aWVyZW5kZSBNZXRob2RlbmtvbmZpZ3VyYXRpb24gYXVzLiBBbGxlIHJlZmVyZW56aWVydGVuIE1ldGhvZGVuLVBsdWctaW5zIGluIGRlciBhdXNnZXdcdTAwZTRobHRlbiBLb25maWd1cmF0aW9uIHdlcmRlbiBpbiBkZW4gRXhwb3J0IGVpbmdlc2NobG9zc2VuLg0KLXNlbGVjdENvbmZpZ1BhZ2VfY29uZmlnc0xhYmVsX3RleHQ9TWV0aG9kZW5rb25maWd1cmF0aW9uZW46DQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX3RpdGxlPUtvbmZpZ3VyYXRpb25zc3BlemlmaWthdGlvbmVuIGF1c3dcdTAwZTRobGVuDQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2Rlc2M9V1x1MDBlNGhsZW4gU2llIGRpZSB6dSBleHBvcnRpZXJlbmRlbiBTcGV6aWZpa2F0aW9uZW4gZlx1MDBmY3IgTWV0aG9kZW5rb25maWd1cmF0aW9uZW4gYXVzLg0KLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV9jb25maWdzTGFiZWxfdGV4dD1NZXRob2RlbmtvbmZpZ3VyYXRpb25lbjoNCi1jaGVja0NvbmZpZ1BhZ2VfdGl0bGU9S29uZmlndXJhdGlvbnNmZWhsZXIgcHJcdTAwZmNmZW4NCi1jaGVja0NvbmZpZ1BhZ2VfZGVzYz1GXHUwMGZjciBkaWUgYXVzZ2V3XHUwMGU0aGx0ZSBNZXRob2RlbmtvbmZpZ3VyYXRpb24gd3VyZGUgZWluZSBJbnRlZ3JpdFx1MDBlNHRzcHJcdTAwZmNmdW5nIGR1cmNoZ2VmXHUwMGZjaHJ0LiBTZWhlbiBTaWUgc2ljaCBkZW4gRmVobGVyYmVyaWNodCBhbiB1bmQgZlx1MDBmY2hyZW4gU2llIGRpZSBlcmZvcmRlcmxpY2hlbiBGZWhsZXJiZXJpY2h0aWd1bmdlbiBkdXJjaC4NCi1zZWxlY3REZXN0aW5hdGlvblBhZ2VfdGl0bGU9RXhwb3J0dmVyemVpY2huaXMgYW5nZWJlbg0KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV9kZXNjPUdlYmVuIFNpZSBlaW4gWmllbHZlcnplaWNobmlzIGFuLCBpbiBkZW0gZGllIGV4cG9ydGllcnRlIEtvbmZpZ3VyYXRpb24gZ2VzcGVpY2hlcnQgd2VyZGVuIHNvbGwuDQotDQotIyBFeHBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZA0KLWV4cG9ydFBsdWdpbnNXaXphcmRfdGl0bGU9TWV0aG9kZW4tUGx1Zy1pbnMgZXhwb3J0aWVyZW4NCi1zZWxlY3RQbHVnaW5zUGFnZV90aXRsZT1NZXRob2Rlbi1QbHVnLWlucyBhdXN3XHUwMGU0aGxlbg0KLXNlbGVjdFBsdWdpbnNQYWdlX2Rlc2M9V1x1MDBlNGhsZW4gU2llIG1pbmRlc3RlbnMgZWluIHp1IGV4cG9ydGllcmVuZGVzIE1ldGhvZGVuLVBsdWctaW4gYXVzLg0KLXNlbGVjdFBsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0PU1ldGhvZGVuLVBsdWctaW5zOg0KLXJldmlld1BsdWdpbnNQYWdlX3RpdGxlPUFiaFx1MDBlNG5naWdrZWl0ZW4gcHJcdTAwZmNmZW4NCi1yZXZpZXdQbHVnaW5zUGFnZV9kZXNjPVdcdTAwZTRobGVuIFNpZSBqZWRlcyBNZXRob2Rlbi1QbHVnLWluIGF1cywgdW0gZGllIEFiaFx1MDBlNG5naWdrZWl0ZW4genUgcHJcdTAwZmNmZW4uIEtsaWNrZW4gU2llIGF1ZiBadXJcdTAwZmNjaywgdW0gZGllIGFiaFx1MDBlNG5naWdlbiBQbHVnLWlucyBhdXN6dXdcdTAwZTRobGVuLCBmYWxscyBkaWVzZSBpbiBkZW4gRXhwb3J0IGVpbmdlc2NobG9zc2VuIHdlcmRlbiBtXHUwMGZjc3Nlbi4NCi1yZXZpZXdQbHVnaW5zUGFnZV9wbHVnaW5zTGFiZWxfdGV4dD1NZXRob2Rlbi1QbHVnLWluczoNCi1yZXZpZXdQbHVnaW5zUGFnZV9kZXBlbmRlbnRQbHVnaW5zTGFiZWxfdGV4dD1BYmhcdTAwZTRuZ2lnZSBNZXRob2Rlbi1QbHVnLWluczoNCi1yZXZpZXdQbHVnaW5zUGFnZV9hc3NvY2lhdGVkQ29uZmlnc0xhYmVsX3RleHQ9WnVnZW9yZG5ldGUgTWV0aG9kZW5rb25maWd1cmF0aW9uZW46DQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfdGl0bGU9RXhwb3J0IGJlc3RcdTAwZTR0aWdlbg0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX2Rlc2M9QmVzdFx1MDBlNHRpZ2VuIFNpZSBkaWUgenUgZXhwb3J0aWVyZW5kZW4gTWV0aG9kZW4tUGx1Zy1pbnMuDQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2Vfbm9QbHVnaW5fdGV4dD1FcyB3dXJkZSBrZWluIE1ldGhvZGVuLVBsdWctaW4gYXVzZ2V3XHUwMGU0aGx0Lg0KLXNwZWNpZnlQYXRoUGFnZV90aXRsZT1FeHBvcnR2ZXJ6ZWljaG5pcyBhbmdlYmVuDQotc3BlY2lmeVBhdGhQYWdlX2Rlc2M9R2ViZW4gU2llIGVpbiBaaWVsdmVyemVpY2huaXMgYW4sIGluIGRlbSBkaWUgZXhwb3J0aWVydGVuIE1ldGhvZGVuLVBsdWctaW5zIGdlc3BlaWNoZXJ0IHdlcmRlbiBzb2xsZW4uDQotU2F2ZVBsdWdpblBhZ2VfZGVzYz1FeHBvcnRpZXJlbiBTaWUgZGllIGF1c2dld1x1MDBlNGhsdGVuIFBsdWctaW5zIHVuZCBLb25maWd1cmF0aW9uZW4gaW4gZGFzIGFuZ2VnZWJlbmUgWmllbHZlcnplaWNobmlzLg0KLUV4cG9ydFBsdWdpbldpemFyZF90aXRsZT1GZWhsZXIgaW0gRXhwb3J0YXNzaXN0ZW50ZW4gZlx1MDBmY3IgTWV0aG9kZW4tUGx1Zy1pbnMNCi1FeHBvcnRQbHVnaW5FcnJvcl9tc2c9SVVQRTAwMDBFOiBGZWhsZXIgYmVpbSBFeHBvcnQNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9QmlibGlvdGhla3Nrb25maWd1cmF0aW9uIGV4cG9ydGllcmVuDQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfbXNnPUlVUEUwMDAxRTogRGllIEV4cG9ydG9wZXJhdGlvbiBrYW5uIG5pY2h0IGZvcnRnZXNldHp0IHdlcmRlbi4NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotYW5hbHl6aW5nQ29uZmlnVGFza19uYW1lPUJpYmxpb3RoZWtza29uZmlndXJhdGlvbiB3aXJkIGFuYWx5c2llcnQuLi4NCi0NCi0jIFRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgaGF2ZSBub3QgYmVlbiByZXZpZXdlZC4NCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzA9S29uZmlndXJhdGlvbiB3aXJkIGV4cG9ydGllcnQuLi4NCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzE9RGVyIEV4cG9ydCBpc3QgYWJnZXNjaGxvc3Nlbi4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8xPURpZSBJbnRlZ3JpdFx1MDBlNHQgZGVyIGF1c2dld1x1MDBlNGhsdGVuIEtvbmZpZ3VyYXRpb24gd2lyZCBnZXByXHUwMGZjZnQuLi5cbg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzI9RXMgd3VyZGUga2VpbmUgS29uZmlndXJhdGlvbiBhdXNnZXdcdTAwZTRobHQuXG4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8zPUVzIHd1cmRlIGtlaW4gRmVobGVyIGluIGRlciBhdXNnZXdcdTAwZTRobHRlbiBLb25maWd1cmF0aW9uIGdlZnVuZGVuLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfND1FcyB3dXJkZW4gezB9IEZlaGxlciBpbiBkZXIgYXVzZ2V3XHUwMGU0aGx0ZW4gS29uZmlndXJhdGlvbiBnZWZ1bmRlbi5cblNpZSBrXHUwMGY2bm5lbiBkZW4gS29uZmlndXJhdGlvbnNlZGl0b3IgXHUwMGY2ZmZuZW4gdW5kIGRpZXNlIEZlaGxlciBiZWhlYmVuLlxuU2llIGtcdTAwZjZubmVuIGRpZSBGZWhsZXIgYWJlciBhdWNoIGlnbm9yaWVyZW4gdW5kIGRpZSBPcGVyYXRpb24gZm9ydHNldHplbi4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2VfY2hlY2tpbmc9S29uZmlndXJhdGlvbiB3aXJkIGdlcHJcdTAwZmNmdC4gQml0dGUgd2FydGVuLi4uDQotRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZV90aXRsZT1NZXRob2RlbmtvbmZpZ3VyYXRpb24gYXVzd1x1MDBlNGhsZW4NCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfYnJvd3NlPUR1cmNoc3VjaGVuLi4uDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2RlZmF1bHRfZGlyPVN0YW5kYXJkdmVyemVpY2huaXMgdmVyd2VuZGVuDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMD1Lb25maWd1cmF0aW9uIHdpcmQgZXhwb3J0aWVydC4uLg0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzI9SVVQRTAwMDJFOiBFeHBvcnQgZmVobGdlc2NobGFnZW46IEZlaGxlciBiZWltIExhZGVuIGRlciBCaWJsaW90aGVrDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHND1JVVBFMDAwM0U6IEV4cG9ydCBmZWhsZ2VzY2hsYWdlbjogRmVobGVyIGJlaW0gS29waWVyZW4gZGVyIEJpYmxpb3RoZWsNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cxPUlVUEUwMDA0RTogRXhwb3J0IGZlaGxnZXNjaGxhZ2VuOiBGZWhsZXIgYmVpbSBFcnN0ZWxsZW4gZGVyIGFiZ2VzY2hsb3NzZW5lbiBLb25maWd1cmF0aW9uDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHOT1JVVBFMDAwNUU6IEV4cG9ydCBmZWhsZ2VzY2hsYWdlbjogRmVobGVyIGJlaW0gU3BlaWNoZXJuIGRlciBCaWJsaW90aGVrDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX25hbWU9TmFtZToNCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGlyPVZlcnplaWNobmlzOg0KLUV4cG9ydFBsdWdpbldpemFyZF9lcnJvcj1GZWhsZXINCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfdGl0bGU9U3RhbmRhcmR0aXRlbA0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9kZXNjPVN0YW5kYXJkYmVzY2hyZWlidW5nOg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMD1QbHVnLWlucyB3ZXJkZW4gZXhwb3J0aWVydC4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMT1FeHBvcnR2ZXJ6ZWljaG5pcyB3aXJkIGVyc3RlbGx0Li4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cyPURhdGVpZW4gd2VyZGVuIGtvcGllcnQuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzM9QmlibGlvdGhlayB1bmQgUmVzc291cmNlbmRhdGVpIHdlcmRlbiBnZW5lcmllcnQuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzQ9RGVyIEV4cG9ydCBpc3QgYWJnZXNjaGxvc3Nlbi4NCi1TYXZlTGlicmFyeVBhZ2VfdGl0bGU9TWV0aG9kZW4tUGx1Zy1pbiBleHBvcnRpZXJlbg0KLVNhdmVQbHVnaW5QYWdlX2xhYmVsX25hbWU9RXhwb3J0bmFtZToNCi1TYXZlTGlicmFyeVBhZ2VfZGVzYz1FeHBvcnRpZXJlbiBTaWUgZGllIGF1c2dld1x1MDBlNGhsdGVuIE1ldGhvZGVuLVBsdWctaW5zIHVuZCBkaWUgenVnZW9yZG5ldGVuIEtvbmZpZ3VyYXRpb25lbi4NCi1FeHBvcnRQbHVnaW5XaXphcmRfTVNHMT1CaWJsaW90aGVrc2tvbmZpZ3VyYXRpb24gd2lyZCBhbmFseXNpZXJ0Li4uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwYTU1ZTIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMDAwRSAtIElVUEUwMDk5RQ0KLSMNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotZXhwb3J0Q29uZmlnV2l6YXJkX3RpdGxlPUV4cG9ydGFyIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBsYSBiaWJsaW90ZWNhDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfdGl0bGU9U2VsZWNjaW9uYXIgdGlwbyBkZSBleHBvcnRhY2lcdTAwZjNuDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYz1TZWxlY2Npb25lIGVsIHRpcG8gZGUgY29uZmlndXJhY2lcdTAwZjNuIGRlIGxhIGJpYmxpb3RlY2EgcGFyYSBleHBvcnRhci4NCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdMYWJlbF90ZXh0PUV4cG9ydGFyIHVuYSBjb25maWd1cmFjaVx1MDBmM24gZGUgbVx1MDBlOXRvZG8geSB0b2RvcyBzdXMgcGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8NCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdTcGVjc0xhYmVsX3RleHQ9RXhwb3J0YXIgdW5hIG8gdmFyaWFzIGVzcGVjaWZpY2FjaW9uZXMgZGUgbGEgY29uZmlndXJhY2lcdTAwZjNuIGRlIG1cdTAwZTl0b2RvDQotc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1TZWxlY2Npb25hciBjb25maWd1cmFjaVx1MDBmM24gZGUgbVx1MDBlOXRvZG8NCi1zZWxlY3RDb25maWdQYWdlX2Rlc2M9U2VsZWNjaW9uZSB1bmEgY29uZmlndXJhY2lcdTAwZjNuIGRlIG1cdTAwZTl0b2RvIHBhcmEgZXhwb3J0YXIuIFRvZG9zIGxvcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbyBjb24gcmVmZXJlbmNpYXMgZGUgbGEgY29uZmlndXJhY2lcdTAwZjNuIHNlbGVjY2lvbmFkYSBzZSBpbmNsdWlyXHUwMGUxbiBlbiBsYSBleHBvcnRhY2lcdTAwZjNuLg0KLXNlbGVjdENvbmZpZ1BhZ2VfY29uZmlnc0xhYmVsX3RleHQ9Q29uZmlndXJhY2lvbmVzIGRlbCBtXHUwMGU5dG9kbzoNCi1zZWxlY3RDb25maWdTcGVjc1BhZ2VfdGl0bGU9U2VsZWNjaW9uYXIgZXNwZWNpZmljYWNpb25lcyBkZSBsYSBjb25maWd1cmFjaVx1MDBmM24NCi1zZWxlY3RDb25maWdTcGVjc1BhZ2VfZGVzYz1TZWxlY2Npb25lIHVuYSBvIHZhcmlhcyBlc3BlY2lmaWNhY2lvbmVzIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBwYXJhIGV4cG9ydGFyLg0KLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV9jb25maWdzTGFiZWxfdGV4dD1Db25maWd1cmFjaW9uZXMgZGVsIG1cdTAwZTl0b2RvOg0KLWNoZWNrQ29uZmlnUGFnZV90aXRsZT1SZXZpc2FyIGVycm9yZXMgZGUgY29uZmlndXJhY2lcdTAwZjNuDQotY2hlY2tDb25maWdQYWdlX2Rlc2M9U2UgaGEgcmVhbGl6YWRvIHVuYSBjb21wcm9iYWNpXHUwMGYzbiBkZSBpbnRlZ3JpZGFkIGVuIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kbyBzZWxlY2Npb25hZGEuIFJldmlzZSBlbCBpbmZvcm1lIGRlIGVycm9yZXMgeSByZWFsaWNlIGxhcyBhY2Npb25lcyBjb3JyZWN0aXZhcyBuZWNlc2FyaWFzLg0KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV90aXRsZT1Fc3BlY2lmaWNhciBkaXJlY3RvcmlvIGRlIGV4cG9ydGFjaVx1MDBmM24NCi1zZWxlY3REZXN0aW5hdGlvblBhZ2VfZGVzYz1Fc3BlY2lmaXF1ZSB1biBkaXJlY3RvcmlvIGRlIGRlc3Rpbm8gcGFyYSBhbG1hY2VuYXIgbGEgY29uZmlndXJhY2lcdTAwZjNuIGV4cG9ydGFkYS4NCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0UGx1Z2luc1dpemFyZF90aXRsZT1FeHBvcnRhciBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbw0KLXNlbGVjdFBsdWdpbnNQYWdlX3RpdGxlPVNlbGVjY2lvbmFyIHBsdWctaW5zIGRlIG1cdTAwZTl0b2RvDQotc2VsZWN0UGx1Z2luc1BhZ2VfZGVzYz1TZWxlY2Npb25lIHVubyBvIHZhcmlvcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbyBwYXJhIGV4cG9ydGFyLg0KLXNlbGVjdFBsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0PVBsdWctaW5zIGRlIG1cdTAwZTl0b2RvOg0KLXJldmlld1BsdWdpbnNQYWdlX3RpdGxlPVJldmlzYXIgZGVwZW5kZW5jaWFzDQotcmV2aWV3UGx1Z2luc1BhZ2VfZGVzYz1TZWxlY2Npb25lIGNhZGEgcGx1Zy1pbiBkZSBtXHUwMGU5dG9kbyBwYXJhIHJldmlzYXIgc3VzIGRlcGVuZGVuY2lhcy4gUHVsc2UgQW50ZXJpb3IgcGFyYSBzZWxlY2Npb25hciBsb3MgcGx1Zy1pbnMgZGVwZW5kaWVudGVzIHNpIGVzIG5lY2VzYXJpbyBpbmNsdWlybG9zIGVuIGxhIGV4cG9ydGFjaVx1MDBmM24uDQotcmV2aWV3UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQ9UGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG86DQotcmV2aWV3UGx1Z2luc1BhZ2VfZGVwZW5kZW50UGx1Z2luc0xhYmVsX3RleHQ9UGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8gZGVwZW5kaWVudGVzOg0KLXJldmlld1BsdWdpbnNQYWdlX2Fzc29jaWF0ZWRDb25maWdzTGFiZWxfdGV4dD1Db25maWd1cmFjaW9uZXMgZGVsIG1cdTAwZTl0b2RvIGFzb2NpYWRhczoNCi1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV90aXRsZT1Db25maXJtYXIgZXhwb3J0YWNpXHUwMGYzbg0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX2Rlc2M9Q29uZmlybWFyIGxvcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbyBxdWUgc2UgZXhwb3J0YXJcdTAwZTFuLg0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX25vUGx1Z2luX3RleHQ9Tm8gc2UgaGEgc2VsZWNjaW9uYWRvIG5pbmdcdTAwZmFuIHBsdWctaW4gZGUgbVx1MDBlOXRvZG8uDQotc3BlY2lmeVBhdGhQYWdlX3RpdGxlPUVzcGVjaWZpY2FyIGRpcmVjdG9yaW8gZGUgZXhwb3J0YWNpXHUwMGYzbg0KLXNwZWNpZnlQYXRoUGFnZV9kZXNjPUVzcGVjaWZpcXVlIHVuIGRpcmVjdG9yaW8gZGUgZGVzdGlubyBwYXJhIGFsbWFjZW5hciBsb3MgcGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8gZXhwb3J0YWRvcy4NCi1TYXZlUGx1Z2luUGFnZV9kZXNjPUV4cG9ydGUgbG9zIHBsdWctaW5zIHkgbGFzIGNvbmZpZ3VyYWNpb25lcyBzZWxlY2Npb25hZG9zIGFsIGRpcmVjdG9yaW8gZGUgZGVzdGlubyBlc3BlY2lmaWNhZG8uDQotRXhwb3J0UGx1Z2luV2l6YXJkX3RpdGxlPUVycm9yIGRlbCBhc2lzdGVudGUgZGUgZXhwb3J0YWNpXHUwMGYzbiBkZSBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbw0KLUV4cG9ydFBsdWdpbkVycm9yX21zZz1JVVBFMDAwMEU6IFNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBkdXJhbnRlIGxhIGV4cG9ydGFjaVx1MDBmM24NCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9RXhwb3J0YXIgY29uZmlndXJhY2lcdTAwZjNuIGRlIGxhIGJpYmxpb3RlY2ENCi1leHBvcnRDb25maWdFcnJvckRpYWxvZ19tc2c9SVVQRTAwMDFFOiBMYSBvcGVyYWNpXHUwMGYzbiBkZSBleHBvcnRhY2lcdTAwZjNuIG5vIHB1ZWRlIGNvbnRpbnVhci4NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotYW5hbHl6aW5nQ29uZmlnVGFza19uYW1lPUFuYWxpemFuZG8gbGEgY29uZmlndXJhY2lcdTAwZjNuIGRlIGxhIGJpYmxpb3RlY2EuLi4NCi0NCi0jIFRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgaGF2ZSBub3QgYmVlbiByZXZpZXdlZC4NCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzA9RXhwb3J0YW5kbyBjb25maWd1cmFjaVx1MDBmM24uLi4NCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzE9TGEgZXhwb3J0YWNpXHUwMGYzbiBoYSBjb25jbHVpZG8uDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMT1Db21wcm9iYW5kbyBsYSBpbnRlZ3JpZGFkIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBzZWxlY2Npb25hZGEuLi5cbg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzI9Tm8gc2UgaGEgc2VsZWNjaW9uYWRvIG5pbmd1bmEgY29uZmlndXJhY2lcdTAwZjNuLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMz1MYSBjb25maWd1cmFjaVx1MDBmM24gc2VsZWNjaW9uYWRhIG5vIHRpZW5lIG5pbmdcdTAwZmFuIHByb2JsZW1hLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfND1IYXkgezB9IHByb2JsZW1hcyBlbiBsYSBjb25maWd1cmFjaVx1MDBmM24gc2VsZWNjaW9uYWRhLlxuUHVlZGUgYWJyaXIgZWwgZWRpdG9yIGRlIGNvbmZpZ3VyYWNpXHUwMGYzbiB5IGFycmVnbGFyIGVzb3MgcHJvYmxlbWFzLiBcbk8gcHVlZGUgb21pdGlyIGVzb3MgcHJvYmxlbWFzIHkgY29udGludWFyLg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9jaGVja2luZz1Db21wcm9iYW5kbyBsYSBjb25maWd1cmFjaVx1MDBmM24sIGVzcGVyZS4uLg0KLUV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9RXNjb2dlciBjb25maWd1cmFjaVx1MDBmM24gZGUgbVx1MDBlOXRvZG8NCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfYnJvd3NlPUV4YW1pbmFyLi4uDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2RlZmF1bHRfZGlyPVV0aWxpemFyIGRpcmVjdG9yaW8gcG9yIG9taXNpXHUwMGYzbg0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzA9RXhwb3J0YW5kbyBjb25maWd1cmFjaVx1MDBmM24uLi4NCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cyPUlVUEUwMDAyRTogTGEgZXhwb3J0YWNpXHUwMGYzbiBoYSBmYWxsYWRvOiBTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgY2FyZ2FyIGxhIGJpYmxpb3RlY2ENCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c0PUlVUEUwMDAzRTogTGEgZXhwb3J0YWNpXHUwMGYzbiBoYSBmYWxsYWRvOiBTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgY29waWFyIGxhIGJpYmxpb3RlY2ENCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cxPUlVUEUwMDA0RTogTGEgZXhwb3J0YWNpXHUwMGYzbiBoYSBmYWxsYWRvOiBTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgY2VycmFyIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBsYSBiaWJsaW90ZWNhDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHOT1JVVBFMDAwNUU6IExhIGV4cG9ydGFjaVx1MDBmM24gaGEgZmFsbGFkbzogU2UgaGEgcHJvZHVjaWRvIHVuIGVycm9yIGFsIGd1YXJkYXIgbGEgYmlibGlvdGVjYQ0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9uYW1lPU5vbWJyZToNCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGlyPURpcmVjdG9yaW86DQotRXhwb3J0UGx1Z2luV2l6YXJkX2Vycm9yPUVycm9yDQotRGVzdGluYXRpb25Db21tb25QYWdlX3RpdGxlPVRcdTAwZWR0dWxvIHBvciBvbWlzaVx1MDBmM24NCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfZGVzYz1EZXNjcmlwY2lcdTAwZjNuIHBvciBvbWlzaVx1MDBmM246DQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cwPUV4cG9ydGFuZG8gcGx1Zy1pbnMuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzE9Q3JlYW5kbyBkaXJlY3RvcmlvIGRlIGV4cG9ydGFjaVx1MDBmM24uLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzI9Q29waWFuZG8gYXJjaGl2b3MuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzM9R2VuZXJhbmRvIGFyY2hpdm8gZGUgcmVjdXJzb3MgeSBiaWJsaW90ZWNhLi4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0c0PUxhIGV4cG9ydGFjaVx1MDBmM24gaGEgY29uY2x1aWRvLg0KLVNhdmVMaWJyYXJ5UGFnZV90aXRsZT1FeHBvcnRhciBwbHVnLWluIGRlIG1cdTAwZTl0b2RvDQotU2F2ZVBsdWdpblBhZ2VfbGFiZWxfbmFtZT1Ob21icmUgZGUgZXhwb3J0YWNpXHUwMGYzbjoNCi1TYXZlTGlicmFyeVBhZ2VfZGVzYz1FeHBvcnRlIGxvcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbyBzZWxlY2Npb25hZG9zIHkgbGFzIGNvbmZpZ3VyYWNpb25lcyBhc29jaWFkYXMNCi1FeHBvcnRQbHVnaW5XaXphcmRfTVNHMT1BbmFsaXphbmRvIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBsYSBiaWJsaW90ZWNhLi4uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQxZTNkYjIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMDAwRSAtIElVUEUwMDk5RQ0KLSMNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotZXhwb3J0Q29uZmlnV2l6YXJkX3RpdGxlPUV4cG9ydGVyIGxhIGNvbmZpZ3VyYXRpb24gZGUgbGEgYmlibGlvdGhcdTAwZThxdWUNCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV90aXRsZT1TXHUwMGU5bGVjdGlvbm5lciBsZSB0eXBlIGQnZXhwb3J0YXRpb24NCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVNcdTAwZTlsZWN0aW9ubmVyIGxlIHR5cGUgZGUgY29uZmlndXJhdGlvbiBkZSBiaWJsaW90aFx1MDBlOHF1ZSBcdTAwZTAgZXhwb3J0ZXIuDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnTGFiZWxfdGV4dD1FeHBvcnRleiB1bmUgY29uZmlndXJhdGlvbiBkZSBtXHUwMGU5dGhvZGUgZXQgdG91cyBzZXMgcGx1Zy1pbnMgZGUgbVx1MDBlOXRob2RlDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnU3BlY3NMYWJlbF90ZXh0PUV4cG9ydGV6IHVuZSBvdSBwbHVzaWV1cnMgc3BcdTAwZTljaWZpY2F0aW9ucyBkZSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLXNlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9U1x1MDBlOWxlY3Rpb25uZXIgbGEgY29uZmlndXJhdGlvbiBkZSBtXHUwMGU5dGhvZGUNCi1zZWxlY3RDb25maWdQYWdlX2Rlc2M9U1x1MDBlOWxlY3Rpb25uZXogdW5lIGNvbmZpZ3VyYXRpb24gZGUgbVx1MDBlOXRob2RlIFx1MDBlMCBleHBvcnRlci4gVG91cyBsZXMgcGx1Zy1pbnMgZGUgbVx1MDBlOXRob2RlIHJcdTAwZTlmXHUwMGU5cmVuY1x1MDBlOXMgZGFucyBsYSBjb25maWd1cmF0aW9uIHNcdTAwZTlsZWN0aW9ublx1MDBlOWUgc2Vyb250IGluY2x1cyBkYW5zIGwnZXhwb3J0YXRpb24uDQotc2VsZWN0Q29uZmlnUGFnZV9jb25maWdzTGFiZWxfdGV4dD1Db25maWd1cmF0aW9ucyBkZSBtXHUwMGU5dGhvZGUgOg0KLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV90aXRsZT1TXHUwMGU5bGVjdGlvbm5lciBsZXMgc3BcdTAwZTljaWZpY2F0aW9ucyBkZSBjb25maWd1cmF0aW9uDQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2Rlc2M9U1x1MDBlOWxlY3Rpb25uZXogdW5lIG91IHBsdXNpZXVycyBzcFx1MDBlOWNpZmljYXRpb25zIGRlIGNvbmZpZ3VyYXRpb24gZGUgbVx1MDBlOXRob2RlIFx1MDBlMCBleHBvcnRlci4NCi1zZWxlY3RDb25maWdTcGVjc1BhZ2VfY29uZmlnc0xhYmVsX3RleHQ9Q29uZmlndXJhdGlvbnMgZGUgbVx1MDBlOXRob2RlIDoNCi1jaGVja0NvbmZpZ1BhZ2VfdGl0bGU9Ulx1MDBlOXZpc2VyIGxlcyBlcnJldXJzIGRlIGNvbmZpZ3VyYXRpb24NCi1jaGVja0NvbmZpZ1BhZ2VfZGVzYz1VbiBjb250clx1MDBmNGxlIGQnaW50XHUwMGU5Z3JpdFx1MDBlOSBhIFx1MDBlOXRcdTAwZTkgclx1MDBlOWFsaXNcdTAwZTkgc3VyIGxhIGNvbmZpZ3VyYXRpb24gZGUgbVx1MDBlOXRob2RlIHNcdTAwZTlsZWN0aW9ublx1MDBlOWUuIFJcdTAwZTl2aXNleiBsZSByYXBwb3J0IGQnZXJyZXVycyBldCBlZmZlY3R1ZXogbGVzIGFjdGlvbnMgY29ycmVjdGl2ZXMgblx1MDBlOWNlc3NhaXJlcy4NCi1zZWxlY3REZXN0aW5hdGlvblBhZ2VfdGl0bGU9U3BcdTAwZTljaWZpZXIgbGUgclx1MDBlOXBlcnRvaXJlIGQnZXhwb3J0YXRpb24NCi1zZWxlY3REZXN0aW5hdGlvblBhZ2VfZGVzYz1TcFx1MDBlOWNpZmlleiB1biByXHUwMGU5cGVydG9pcmUgZGUgZGVzdGluYXRpb24gcG91ciBzdG9ja2VyIGxhIGNvbmZpZ3VyYXRpb24gZXhwb3J0XHUwMGU5ZS4NCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0UGx1Z2luc1dpemFyZF90aXRsZT1FeHBvcnRlciBsZXMgcGx1Zy1pbnMgZGUgbVx1MDBlOXRob2RlDQotc2VsZWN0UGx1Z2luc1BhZ2VfdGl0bGU9U1x1MDBlOWxlY3Rpb25uZXIgbGVzIHBsdWctaW5zIGRlIG1cdTAwZTl0aG9kZQ0KLXNlbGVjdFBsdWdpbnNQYWdlX2Rlc2M9U1x1MDBlOWxlY3Rpb25uZXogdW4gb3UgcGx1c2lldXJzIHBsdWctaW5zIGRlIG1cdTAwZTl0aG9kZSBcdTAwZTAgZXhwb3J0ZXIuDQotc2VsZWN0UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQ9UGx1Zy1pbnMgZGUgbVx1MDBlOXRob2RlIDoNCi1yZXZpZXdQbHVnaW5zUGFnZV90aXRsZT1SXHUwMGU5dmlzZXIgbGVzIGRcdTAwZTlwZW5kYW5jZXMNCi1yZXZpZXdQbHVnaW5zUGFnZV9kZXNjPVNcdTAwZTlsZWN0aW9ubmV6IGNoYXF1ZSBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZSBwb3VyIHJcdTAwZTl2aXNlciBzZXMgZFx1MDBlOXBlbmRhbmNlcy4gQ2xpcXVleiBzdXIgUHJcdTAwZTljXHUwMGU5ZGVudCBwb3VyIHNcdTAwZTlsZWN0aW9ubmVyIGxlcyBwbHVnLWlucyBkXHUwMGU5cGVuZGFudHMgcydpbHMgZG9pdmVudCBcdTAwZWF0cmUgaW5jbHVzIGRhbnMgbCdleHBvcnRhdGlvbi4NCi1yZXZpZXdQbHVnaW5zUGFnZV9wbHVnaW5zTGFiZWxfdGV4dD1QbHVnLWlucyBkZSBtXHUwMGU5dGhvZGUgOg0KLXJldmlld1BsdWdpbnNQYWdlX2RlcGVuZGVudFBsdWdpbnNMYWJlbF90ZXh0PVBsdWctaW5zIGRlIG1cdTAwZTl0aG9kZSBkXHUwMGU5cGVuZGFudHMgOg0KLXJldmlld1BsdWdpbnNQYWdlX2Fzc29jaWF0ZWRDb25maWdzTGFiZWxfdGV4dD1Db25maWd1cmF0aW9ucyBkZSBtXHUwMGU5dGhvZGUgYXNzb2NpXHUwMGU5ZXMgOg0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX3RpdGxlPUNvbmZpcm1lciBsJ2V4cG9ydGF0aW9uDQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfZGVzYz1Db25maXJtZXogbGVzIHBsdWctaW5zIGRlIG1cdTAwZTl0aG9kZSBcdTAwZTAgZXhwb3J0ZXIuDQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2Vfbm9QbHVnaW5fdGV4dD1BdWN1biBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZSBuJ2EgXHUwMGU5dFx1MDBlOSBzXHUwMGU5bGVjdGlvbm5cdTAwZTkuDQotc3BlY2lmeVBhdGhQYWdlX3RpdGxlPVNwXHUwMGU5Y2lmaWVyIGxlIHJcdTAwZTlwZXJ0b2lyZSBkJ2V4cG9ydGF0aW9uDQotc3BlY2lmeVBhdGhQYWdlX2Rlc2M9U3BcdTAwZTljaWZpZXogdW4gclx1MDBlOXBlcnRvaXJlIGRlIGRlc3RpbmF0aW9uIHBvdXIgc3RvY2tlciBsZXMgcGx1Zy1pbnMgZGUgbVx1MDBlOXRob2RlIGV4cG9ydFx1MDBlOXMuDQotU2F2ZVBsdWdpblBhZ2VfZGVzYz1FeHBvcnRleiBsZXMgcGx1Zy1pbnMgZXQgY29uZmlndXJhdGlvbnMgc1x1MDBlOWxlY3Rpb25uXHUwMGU5cyB2ZXJzIGxlIHJcdTAwZTlwZXJ0b2lyZSBkZSBkZXN0aW5hdGlvbiBpbmRpcXVcdTAwZTkuDQotRXhwb3J0UGx1Z2luV2l6YXJkX3RpdGxlPUVycmV1ciBkZSBsJ2Fzc2lzdGFudCBFeHBvcnRlciBsZSBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZQ0KLUV4cG9ydFBsdWdpbkVycm9yX21zZz1JVVBFMDAwMEUgOiBFcnJldXIgbG9ycyBkZSBsJ2V4cG9ydGF0aW9uDQotDQotIyBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIEVycm9yIERpYWxvZw0KLWV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPUV4cG9ydGVyIGxhIGNvbmZpZ3VyYXRpb24gZGUgbGEgYmlibGlvdGhcdTAwZThxdWUNCi1leHBvcnRDb25maWdFcnJvckRpYWxvZ19tc2c9SVVQRTAwMDFFIDogTCdvcFx1MDBlOXJhdGlvbiBkJ2V4cG9ydGF0aW9uIG5lIHBldXQgcGFzIHNlIHBvdXJzdWl2cmUuDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWFuYWx5emluZ0NvbmZpZ1Rhc2tfbmFtZT1BbmFseXNlIGRlIGxhIGNvbmZpZ3VyYXRpb24gZGUgbGEgYmlibGlvdGhcdTAwZThxdWUuLi4NCi0NCi0jIFRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgaGF2ZSBub3QgYmVlbiByZXZpZXdlZC4NCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzA9RXhwb3J0YXRpb24gZGUgbGEgY29uZmlndXJhdGlvbi4uLg0KLUNvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2VfTVNHMT1FeHBvcnRhdGlvbiB0ZXJtaW5cdTAwZTllLg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzE9Vlx1MDBlOXJpZmljYXRpb24gZGUgbCdpbnRcdTAwZTlncml0XHUwMGU5IGRlIGxhIGNvbmZpZ3VyYXRpb24gc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZS4uLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMj1BdWN1bmUgY29uZmlndXJhdGlvbiBzXHUwMGU5bGVjdGlvbm5cdTAwZTllLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMz1BdWN1biBwcm9ibFx1MDBlOG1lIGRhbnMgbGEgY29uZmlndXJhdGlvbiBzXHUwMGU5bGVjdGlvbm5cdTAwZTllLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfND1MYSBjb25maWd1cmF0aW9uIHNcdTAwZTlsZWN0aW9ublx1MDBlOWUgY29udGllbnQgezB9IHByb2JsXHUwMGU4bWVzLiBcblZvdXMgcG91dmV6IG91dnJpciBsJydcdTAwZTlkaXRldXIgZGUgY29uZmlndXJhdGlvbiBldCBjb3JyaWdlciBjZXMgcHJvYmxcdTAwZThtZXMuIFxuVm91cyBwb3V2ZXogXHUwMGU5Z2FsZW1lbnQgY2hvaXNpciBkJydpZ25vcmVyIGNlcyBwcm9ibFx1MDBlOG1lcyBldCBjb250aW51ZXIuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX2NoZWNraW5nPVZcdTAwZTlyaWZpY2F0aW9uIGRlIGxhIGNvbmZpZ3VyYXRpb24sIHZldWlsbGV6IHBhdGllbnRlci4uLg0KLUV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9Q2hvaXNpciBsYSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9icm93c2U9UGFyY291cmlyLi4uDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2RlZmF1bHRfZGlyPVV0aWxpc2VyIGxlIHJcdTAwZTlwZXJ0b2lyZSBwYXIgZFx1MDBlOWZhdXQNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cwPUV4cG9ydGF0aW9uIGRlIGxhIGNvbmZpZ3VyYXRpb24uLi4NCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cyPUlVUEUwMDAyRSA6IEVjaGVjIGRlIGwnZXhwb3J0YXRpb24gOiBFcnJldXIgbG9ycyBkdSBjaGFyZ2VtZW50IGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHND1JVVBFMDAwM0UgOiBFY2hlYyBkZSBsJ2V4cG9ydGF0aW9uIDogRXJyZXVyIGxvcnMgZGUgbGEgY29waWUgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cxPUlVUEUwMDA0RSA6IEVjaGVjIGRlIGwnZXhwb3J0YXRpb24gOiBFcnJldXIgbG9ycyBkZSBsYSBmZXJtZXR1cmUgZGUgbGEgY29uZmlndXJhdGlvbiBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZQ0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzk9SVVQRTAwMDVFIDogRWNoZWMgZGUgbCdleHBvcnRhdGlvbiA6IEVycmV1ciBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUNCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfbmFtZT1Ob20gOg0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9kaXI9Ulx1MDBlOXBlcnRvaXJlIDoNCi1FeHBvcnRQbHVnaW5XaXphcmRfZXJyb3I9RXJyZXVyDQotRGVzdGluYXRpb25Db21tb25QYWdlX3RpdGxlPVRpdHJlIHBhciBkXHUwMGU5ZmF1dA0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9kZXNjPURlc2NyaXB0aW9uIHBhciBkXHUwMGU5ZmF1dCA6DQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cwPUV4cG9ydGF0aW9uIGRlcyBwbHVnLWlucy4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMT1Dclx1MDBlOWF0aW9uIGR1IHJcdTAwZTlwZXJ0b2lyZSBkJ2V4cG9ydGF0aW9uLi4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cyPUNvcGllIGRlcyBmaWNoaWVycyBlbiBjb3Vycy4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMz1HXHUwMGU5blx1MDBlOXJhdGlvbiBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBldCBkZXMgZmljaGllcnMgZGUgcmVzc291cmNlcy4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHND1FeHBvcnRhdGlvbiB0ZXJtaW5cdTAwZTllLg0KLVNhdmVMaWJyYXJ5UGFnZV90aXRsZT1FeHBvcnRlciB1biBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZQ0KLVNhdmVQbHVnaW5QYWdlX2xhYmVsX25hbWU9Tm9tIGQnZXhwb3J0YXRpb24gOg0KLVNhdmVMaWJyYXJ5UGFnZV9kZXNjPUV4cG9ydGVyIGxlcyBwbHVnLWlucyBkZSBtXHUwMGU5dGhvZGUgc1x1MDBlOWxlY3Rpb25uXHUwMGU5cyBldCBsZXMgY29uZmlndXJhdGlvbnMgYXNzb2NpXHUwMGU5ZXMNCi1FeHBvcnRQbHVnaW5XaXphcmRfTVNHMT1BbmFseXNlIGRlIGxhIGNvbmZpZ3VyYXRpb24gZGUgbGEgYmlibGlvdGhcdTAwZThxdWUuLi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDI5NjI2ZS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQRTAwMDBFIC0gSVVQRTAwOTlFDQotIw0KLQ0KLSMgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1leHBvcnRDb25maWdXaXphcmRfdGl0bGU9RXNwb3J0YSBjb25maWd1cmF6aW9uZSBsaWJyZXJpYQ0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX3RpdGxlPVNlbGV6aW9uYSB0aXBvIGRpIGVzcG9ydGF6aW9uZQ0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2Rlc2M9U2VsZXppb25hcmUgaWwgdGlwbyBkaSBjb25maWd1cmF6aW9uZSBkaSBsaWJyZXJpYSBkYSBlc3BvcnRhcmUuDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnTGFiZWxfdGV4dD1Fc3BvcnRhcmUgdW5hIGNvbmZpZ3VyYXppb25lIGRpIG1ldG9kbyBlIHR1dHRpIGkgcmVsYXRpdmkgcGx1Zy1pbiBkaSBtZXRvZG8uDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnU3BlY3NMYWJlbF90ZXh0PUVzcG9ydGFyZSB1bmEgbyBwaVx1MDBmOSBzcGVjaWZpY2hlIGRpIGNvbmZpZ3VyYXppb25lIGRpIG1ldG9kby4NCi1zZWxlY3RDb25maWdQYWdlX3RpdGxlPVNlbGV6aW9uYSBjb25maWd1cmF6aW9uZSBtZXRvZG8NCi1zZWxlY3RDb25maWdQYWdlX2Rlc2M9U2VsZXppb25hcmUgdW5hIGNvbmZpZ3VyYXppb25lIGRpIG1ldG9kbyBkYSBlc3BvcnRhcmUuIFR1dHRpIGkgcGx1Zy1pbiBkaSBtZXRvZG8gYSBjdWkgc2kgZmEgcmlmZXJpbWVudG8gbmVsbGEgY29uZmlndXJhemlvbmUgc2VsZXppb25hdGEgdmVycmFubm8gaW5jbHVzaSBuZWxsJ2VzcG9ydGF6aW9uZS4NCi1zZWxlY3RDb25maWdQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PUNvbmZpZ3VyYXppb25pIGRpIG1ldG9kbzoNCi1zZWxlY3RDb25maWdTcGVjc1BhZ2VfdGl0bGU9U2VsZXppb25hIHNwZWNpZmljaGUgZGkgY29uZmlndXJhemlvbmUNCi1zZWxlY3RDb25maWdTcGVjc1BhZ2VfZGVzYz1TZWxlemlvbmFyZSB1bmEgbyBwaVx1MDBmOSBzcGVjaWZpY2hlIGRpIGNvbmZpZ3VyYXppb25lIGRpIG1ldG9kbyBkYSBlc3BvcnRhcmUuDQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PUNvbmZpZ3VyYXppb25pIGRpIG1ldG9kbzoNCi1jaGVja0NvbmZpZ1BhZ2VfdGl0bGU9RXNhbWluYSBlcnJvcmkgZGkgY29uZmlndXJhemlvbmUNCi1jaGVja0NvbmZpZ1BhZ2VfZGVzYz1cdTAwYzggc3RhdGEgZXNlZ3VpdGEgdW5hIHZlcmlmaWNhIGRlbGwnaW50ZWdyaXRcdTAwZTAgc3VsbGEgY29uZmlndXJhemlvbmUgZGkgbWV0b2RvIHNlbGV6aW9uYXRhLiBFc2FtaW5hcmUgaWwgcmVwb3J0IGRlZ2xpIGVycm9yaSBlZCBlc2VndWlyZSBsZSBhemlvbmkgY29ycmV0dGl2ZSBuZWNlc3NhcmllLg0KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV90aXRsZT1TcGVjaWZpY2EgZGlyZWN0b3J5IGRpIGVzcG9ydGF6aW9uZQ0KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV9kZXNjPVNwZWNpZmljYXJlIHVuYSBkaXJlY3RvcnkgZGkgZGVzdGluYXppb25lIGluIGN1aSBtZW1vcml6emFyZSBsYSBjb25maWd1cmF6aW9uZSBlc3BvcnRhdGEuDQotDQotIyBFeHBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZA0KLWV4cG9ydFBsdWdpbnNXaXphcmRfdGl0bGU9RXNwb3J0YSBwbHVnLWluIGRpIG1ldG9kbw0KLXNlbGVjdFBsdWdpbnNQYWdlX3RpdGxlPVNlbGV6aW9uYSBwbHVnLWluIGRpIG1ldG9kbw0KLXNlbGVjdFBsdWdpbnNQYWdlX2Rlc2M9U2VsZXppb25hcmUgdW5vIG8gcGlcdTAwZjkgcGx1Zy1pbiBkaSBtZXRvZG8gZGEgZXNwb3J0YXJlLg0KLXNlbGVjdFBsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0PVBsdWctaW4gZGkgbWV0b2RvOg0KLXJldmlld1BsdWdpbnNQYWdlX3RpdGxlPUVzYW1pbmEgZGlwZW5kZW56ZQ0KLXJldmlld1BsdWdpbnNQYWdlX2Rlc2M9U2VsZXppb25hcmUgY2lhc2N1biBwbHVnLWluIGRpIG1ldG9kbyBwZXIgZXNhbWluYXJuZSBsZSBkaXBlbmRlbnplLiBGYXJlIGNsaWMgc3UgSW5kaWV0cm8gcGVyIHNlbGV6aW9uYXJlIGkgcGx1Zy1pbiBkaXBlbmRlbnRpIG5lbCBjYXNvIGluIGN1aSBkZWJiYW5vIGVzc2VyZSBpbmNsdXNpIG5lbGwnZXNwb3J0YXppb25lLg0KLXJldmlld1BsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0PVBsdWctaW4gZGkgbWV0b2RvOg0KLXJldmlld1BsdWdpbnNQYWdlX2RlcGVuZGVudFBsdWdpbnNMYWJlbF90ZXh0PVBsdWctaW4gZGkgbWV0b2RvIGRpcGVuZGVudGk6DQotcmV2aWV3UGx1Z2luc1BhZ2VfYXNzb2NpYXRlZENvbmZpZ3NMYWJlbF90ZXh0PUNvbmZpZ3VyYXppb25pIGRpIG1ldG9kbyBhc3NvY2lhdGU6DQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfdGl0bGU9Q29uZmVybWEgZXNwb3J0YXppb25lDQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfZGVzYz1Db25mZXJtYXJlIGkgcGx1Zy1pbiBkaSBtZXRvZG8gY2hlIHZlcnJhbm5vIGVzcG9ydGF0aS4NCi1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9ub1BsdWdpbl90ZXh0PU5vbiBcdTAwZTggc3RhdG8gc2VsZXppb25hdG8gYWxjdW4gcGx1Zy1pbiBkaSBtZXRvZG8uDQotc3BlY2lmeVBhdGhQYWdlX3RpdGxlPVNwZWNpZmljYSBkaXJlY3RvcnkgZGkgZXNwb3J0YXppb25lDQotc3BlY2lmeVBhdGhQYWdlX2Rlc2M9U3BlY2lmaWNhcmUgdW5hIGRpcmVjdG9yeSBkaSBlc3BvcnRhemlvbmUgaW4gY3VpIG1lbW9yaXp6YXJlIGkgcGx1Zy1pbiBkaSBtZXRvZG8gZXNwb3J0YXRpLg0KLVNhdmVQbHVnaW5QYWdlX2Rlc2M9RXNwb3J0YXJlIGkgcGx1Zy1pbiBlIGxlIGNvbmZpZ3VyYXppb25pIHNlbGV6aW9uYXRlIG5lbGxhIGRpcmVjdG9yeSBkaSBkZXN0aW5hemlvbmUgc3BlY2lmaWNhdGEuDQotRXhwb3J0UGx1Z2luV2l6YXJkX3RpdGxlPUVycm9yZSBwcm9jZWR1cmEgZ3VpZGF0YSBFc3BvcnRhIHBsdWctaW4gZGkgbWV0b2RvDQotRXhwb3J0UGx1Z2luRXJyb3JfbXNnPUlVUEUwMDAwRTogUmlsZXZhdG8gZXJyb3JlIGR1cmFudGUgbCdlc3BvcnRhemlvbmUNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9RXNwb3J0YSBjb25maWd1cmF6aW9uZSBsaWJyZXJpYQ0KLWV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX21zZz1JVVBFMDAwMUU6IEltcG9zc2liaWxlIGNvbnRpbnVhcmUgbCdlc3BvcnRhemlvbmUuDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWFuYWx5emluZ0NvbmZpZ1Rhc2tfbmFtZT1BbmFsaXNpIGRlbGxhIGNvbmZpZ3VyYXppb25lIGRlbGxhIGxpYnJlcmlhIGluIGNvcnNvLi4uDQotDQotIyBUaGUgZm9sbG93aW5nIG1lc3NhZ2VzIGhhdmUgbm90IGJlZW4gcmV2aWV3ZWQuDQotQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cwPUVzcG9ydGF6aW9uZSBkZWxsYSBjb25maWd1cmF6aW9uZSBpbiBjb3Jzby4uLg0KLUNvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2VfTVNHMT1Fc3BvcnRhemlvbmUgY29tcGxldGF0YQ0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzE9VmVyaWZpY2EgZGVsbCdpbnRlZ3JpdFx1MDBlMCBkZWxsYSBjb25maWd1cmF6aW9uZSBzZWxlemlvbmF0YSBpbiBjb3Jzby4uLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMj1OZXNzdW5hIGNvbmZpZ3VyYXppb25lIHNlbGV6aW9uYXRhLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMz1Ob24gYydcdTAwZTggYWxjdW4gcHJvYmxlbWEgbmVsbGEgY29uZmlndXJhemlvbmUgc2VsZXppb25hdGEuXG4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV80PUNpIHNvbm8gezB9IHByb2JsZW1pIG5lbGxhIGNvbmZpZ3VyYXppb25lIHNlbGV6aW9uYXRhLiBcblx1MDBjOCBwb3NzaWJpbGUgYXByaXJlIGwnJ2VkaXRvciBkaSBjb25maWd1cmF6aW9uaSBlIHJpc29sdmVyZSBxdWVzdGkgcHJvYmxlbWkuIFxuT3BwdXJlIFx1MDBlOCBwb3NzaWJpbGUgc2NlZ2xpZXJlIGRpIGlnbm9yYXJlIHF1ZXN0aSBwcm9ibGVtaSBlIGNvbnRpbnVhcmUuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX2NoZWNraW5nPVx1MDBjOCBpbiBjb3JzbyBsYSB2ZXJpZmljYSBkZWxsYSBjb25maWd1cmF6aW9uZSwgYXR0ZW5kZXJlLi4uDQotRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZV90aXRsZT1TY2VnbGkgY29uZmlndXJhemlvbmUgbWV0b2RvDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Jyb3dzZT1TZm9nbGlhLi4uDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2RlZmF1bHRfZGlyPVV0aWxpenphIGRpcmVjdG9yeSBwcmVkZWZpbml0YQ0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzA9RXNwb3J0YXppb25lIGRlbGxhIGNvbmZpZ3VyYXppb25lIGluIGNvcnNvLi4uDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMj1JVVBFMDAwMkU6IEVzcG9ydGF6aW9uZSBub24gcml1c2NpdGE6IEVycm9yZSBkdXJhbnRlIGlsIGNhcmljYW1lbnRvIGRlbGxhIGxpYnJlcmlhDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHND1JVVBFMDAwM0U6IEVzcG9ydGF6aW9uZSBub24gcml1c2NpdGE6IEVycm9yZSBkdXJhbnRlIGxhIGNvcGlhIGRlbGxhIGxpYnJlcmlhDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMT1JVVBFMDAwNEU6IEVzcG9ydGF6aW9uZSBub24gcml1c2NpdGE6IEVycm9yZSBkdXJhbnRlIGxhIGNyZWF6aW9uZSBkZWxsYSBjaGl1c3VyYSBkZWxsYSBjb25maWd1cmF6aW9uZSBkZWxsYSBsaWJyZXJpYQ0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzk9SVVQRTAwMDVFOiBFc3BvcnRhemlvbmUgbm9uIHJpdXNjaXRhOiBFcnJvcmUgZHVyYW50ZSBpbCBzYWx2YXRhZ2dpbyBkZWxsYSBsaWJyZXJpYQ0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9uYW1lPU5vbWU6DQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Rpcj1EaXJlY3Rvcnk6DQotRXhwb3J0UGx1Z2luV2l6YXJkX2Vycm9yPUVycm9yZQ0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV90aXRsZT1UaXRvbG8gcHJlZGVmaW5pdG8NCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfZGVzYz1EZXNjcml6aW9uZSBwcmVkZWZpbml0YToNCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzA9RXNwb3J0YXppb25lIGRlaSBwbHVnLWluIGluIGNvcnNvLi4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cxPUNyZWF6aW9uZSBkZWxsYSBkaXJlY3RvcnkgZGkgZXNwb3J0YXppb25lIGluIGNvcnNvLi4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cyPUNvcGlhIGRlaSBmaWxlIGluIGNvcnNvLi4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0czPUdlbmVyYXppb25lIGRlbGxhIGxpYnJlcmlhIGUgZGVsIGZpbGUgZGkgcmlzb3JzZSBpbiBjb3Jzby4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHND1Fc3BvcnRhemlvbmUgY29tcGxldGF0YQ0KLVNhdmVMaWJyYXJ5UGFnZV90aXRsZT1Fc3BvcnRhIHBsdWctaW4gZGkgbWV0b2RvDQotU2F2ZVBsdWdpblBhZ2VfbGFiZWxfbmFtZT1Ob21lIGRpIGVzcG9ydGF6aW9uZToNCi1TYXZlTGlicmFyeVBhZ2VfZGVzYz1Fc3BvcnRhcmUgaSBwbHVnLWluIGRpIG1ldG9kbyBzZWxlemlvbmF0aSBlIGxlIGNvbmZpZ3VyYXppb25pIGFzc29jaWF0ZQ0KLUV4cG9ydFBsdWdpbldpemFyZF9NU0cxPUFuYWxpc2kgZGVsbGEgY29uZmlndXJhemlvbmUgZGVsbGEgbGlicmVyaWEgaW4gY29yc28uLi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDE0ZDdkMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQRTAwMDBFIC0gSVVQRTAwOTlFDQotIw0KLQ0KLSMgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1leHBvcnRDb25maWdXaXphcmRfdGl0bGU9XHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHU2OWNiXHU2MjEwXHUzMDZlXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4DQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfdGl0bGU9XHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMGZiXHUzMGJmXHUzMGE0XHUzMGQ3XHUzMDZlXHU5MDc4XHU2MjllDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYz1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTlcdTMwOGJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTY5Y2JcdTYyMTBcdTMwNmVcdTMwYmZcdTMwYTRcdTMwZDdcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdMYWJlbF90ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA2OFx1MzA1ZFx1MzA2ZVx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOA0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ1NwZWNzTGFiZWxfdGV4dD0xIFx1MzA2NFx1NGVlNVx1NGUwYVx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1NGVkNVx1NjlkOFx1MzA5Mlx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOA0KLXNlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OWNiXHU2MjEwXHUzMDZlXHU5MDc4XHU2MjllDQotc2VsZWN0Q29uZmlnUGFnZV9kZXNjPVx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1OVx1MzA4Ylx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTY5Y2JcdTYyMTBcdTUxODVcdTMwNjdcdTUzYzJcdTcxNjdcdTMwNTVcdTMwOGNcdTMwOGJcdTMwNTlcdTMwNzlcdTMwNjZcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNGNcdTMwMDFcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNmJcdTU0MmJcdTMwN2VcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDINCi1zZWxlY3RDb25maWdQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMDoNCi1zZWxlY3RDb25maWdTcGVjc1BhZ2VfdGl0bGU9XHU2OWNiXHU2MjEwXHU0ZWQ1XHU2OWQ4XHUzMDZlXHU5MDc4XHU2MjllDQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2Rlc2M9XHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU5XHUzMDhiIDEgXHUzMDY0XHU0ZWU1XHU0ZTBhXHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OWNiXHU2MjEwXHU0ZWQ1XHU2OWQ4XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMDoNCi1jaGVja0NvbmZpZ1BhZ2VfdGl0bGU9XHU2OWNiXHU2MjEwXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDZlXHU2OTFjXHU4YTBlDQotY2hlY2tDb25maWdQYWdlX2Rlc2M9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OWNiXHU2MjEwXHUzMDY3XHU2NTc0XHU1NDA4XHU2MDI3XHU2OTFjXHU2N2ZiXHUzMDRjXHU1YjlmXHU4ODRjXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyIFx1MzBhOFx1MzBlOVx1MzBmY1x1MzBmYlx1MzBlY1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA5Mlx1NjkxY1x1OGEwZVx1MzA1N1x1MzA2Nlx1MzAwMVx1NWZjNVx1ODk4MVx1MzA2YVx1NGZlZVx1NmI2M1x1MzBhMlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1NWI5Zlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV90aXRsZT1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNmVcdTYzMDdcdTViOWENCi1zZWxlY3REZXN0aW5hdGlvblBhZ2VfZGVzYz1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTdcdTMwNWZcdTY5Y2JcdTYyMTBcdTMwOTJcdTRmZGRcdTdiYTFcdTMwNTlcdTMwOGJcdTViOWJcdTUxNDhcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0UGx1Z2luc1dpemFyZF90aXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNmVcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzgNCi1zZWxlY3RQbHVnaW5zUGFnZV90aXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNmVcdTkwNzhcdTYyOWUNCi1zZWxlY3RQbHVnaW5zUGFnZV9kZXNjPVx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1OVx1MzA4YiAxIFx1MzA2NFx1NGVlNVx1NGUwYVx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLXNlbGVjdFBsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmMzoNCi1yZXZpZXdQbHVnaW5zUGFnZV90aXRsZT1cdTRmOWRcdTViNThcdTk1YTJcdTRmYzJcdTMwNmVcdTY5MWNcdThhMGUNCi1yZXZpZXdQbHVnaW5zUGFnZV9kZXNjPVx1NTQwNFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzAwMVx1MzA1ZFx1MzA2ZVx1NGY5ZFx1NWI1OFx1OTVhMlx1NGZjMlx1MzA5Mlx1NjkxY1x1OGEwZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwMGNcdTYyM2JcdTMwOGJcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwMDFcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNmJcdTdkNDRcdTMwN2ZcdThmYmNcdTMwODBcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGJcdTRmOWRcdTViNThcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNGNcdTMwNDJcdTMwOGNcdTMwNzBcdTkwNzhcdTYyOWVcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1yZXZpZXdQbHVnaW5zUGFnZV9wbHVnaW5zTGFiZWxfdGV4dD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjM6DQotcmV2aWV3UGx1Z2luc1BhZ2VfZGVwZW5kZW50UGx1Z2luc0xhYmVsX3RleHQ9XHU0ZjlkXHU1YjU4XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzOg0KLXJldmlld1BsdWdpbnNQYWdlX2Fzc29jaWF0ZWRDb25maWdzTGFiZWxfdGV4dD1cdTk1YTJcdTkwMjNcdTMwNTlcdTMwOGJcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5Y2JcdTYyMTA6DQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfdGl0bGU9XHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDZlXHU3OGJhXHU4YThkDQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfZGVzYz1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTlcdTMwOGJcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwOTJcdTc4YmFcdThhOGRcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9ub1BsdWdpbl90ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLXNwZWNpZnlQYXRoUGFnZV90aXRsZT1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNmVcdTYzMDdcdTViOWENCi1zcGVjaWZ5UGF0aFBhZ2VfZGVzYz1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTdcdTMwNWZcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwOTJcdTRmZGRcdTdiYTFcdTMwNTlcdTMwOGJcdTViOWJcdTUxNDhcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1TYXZlUGx1Z2luUGFnZV9kZXNjPVx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA1Zlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA2OFx1NjljYlx1NjIxMFx1MzA5Mlx1MzAwMVx1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA1Zlx1NWI5Ylx1NTE0OFx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzBmY1x1MzA2Ylx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLUV4cG9ydFBsdWdpbldpemFyZF90aXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwZmJcdTMwYTZcdTMwYTNcdTMwYjZcdTMwZmNcdTMwYzlcdTMwNjdcdTMwNmVcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYThcdTMwZTlcdTMwZmMNCi1FeHBvcnRQbHVnaW5FcnJvcl9tc2c9SVVQRTAwMDBFOiBcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTY2NDJcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9XHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHU2OWNiXHU2MjEwXHUzMDZlXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4DQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfbXNnPUlVUEUwMDAxRTogXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHU2NGNkXHU0ZjVjXHUzMDkyXHU3ZDlhXHU4ODRjXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWFuYWx5emluZ0NvbmZpZ1Rhc2tfbmFtZT1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTY5Y2JcdTYyMTBcdTMwOTJcdTUyMDZcdTY3OTBcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi0NCi0jIFRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgaGF2ZSBub3QgYmVlbiByZXZpZXdlZC4NCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzA9XHU2OWNiXHU2MjEwXHUzMDkyXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cxPVx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA0Y1x1NWI4Y1x1NGU4Nlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzE9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHU2OWNiXHU2MjEwXHUzMDZlXHU2NTc0XHU1NDA4XHU2MDI3XHUzMDkyXHU2OTFjXHU2N2ZiXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uXG4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8yPVx1NjljYlx1NjIxMFx1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMz1cdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTY5Y2JcdTYyMTBcdTMwNmJcdTU1NGZcdTk4NGNcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcbg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzQ9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHU2OWNiXHU2MjEwXHUzMDZiIHswfSBcdTUwMGJcdTMwNmVcdTU1NGZcdTk4NGNcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDJcblx1NjljYlx1NjIxMFx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0NFx1MzA2Nlx1MzAwMVx1MzA1M1x1MzA4Y1x1MzA4OVx1MzA2ZVx1NTU0Zlx1OTg0Y1x1MzA5Mlx1NGZlZVx1NmI2M1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1OVx1MzAwMlxuXHUzMDdlXHUzMDVmXHUzMDZmXHUzMDAxXHUzMDUzXHUzMDhjXHUzMDg5XHUzMDZlXHU1NTRmXHU5ODRjXHUzMDkyXHU3MTIxXHU4OTk2XHUzMDU3XHUzMDY2XHU3ZDlhXHU4ODRjXHUzMDU5XHUzMDhiXHUzMDUzXHUzMDY4XHUzMDgyXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDU5XHUzMDAyDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX2NoZWNraW5nPVx1NjljYlx1NjIxMFx1MzA2ZVx1NjkxY1x1NjdmYlx1NGUyZFx1MzA2N1x1MzA1OVx1MzAwMVx1MzA0YVx1NWY4NVx1MzA2MVx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NC4uLg0KLUV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OWNiXHU2MjEwXHUzMDZlXHU5MDc4XHU2MjllDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Jyb3dzZT1cdTUzYzJcdTcxNjcuLi4NCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGVmYXVsdF9kaXI9XHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMGZiXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHUzMDZlXHU0ZjdmXHU3NTI4DQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMD1cdTY5Y2JcdTYyMTBcdTMwOTJcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cyPUlVUEUwMDAyRTogXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwYzlcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c0PUlVUEUwMDAzRTogXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwYjNcdTMwZDRcdTMwZmNcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cxPUlVUEUwMDA0RTogXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTY5Y2JcdTYyMTBcdTMwNmVcdTY4M2NcdTdkMGRcdTZhNWZcdTY5Y2JcdTMwOTJcdTRmNWNcdTYyMTBcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c5PUlVUEUwMDA1RTogXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTRmZGRcdTdiYTFcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYNCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfbmFtZT1cdTU0MGRcdTUyNGQ6DQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Rpcj1cdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmM6DQotRXhwb3J0UGx1Z2luV2l6YXJkX2Vycm9yPVx1MzBhOFx1MzBlOVx1MzBmYw0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV90aXRsZT1cdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwNmVcdTg4NjhcdTk4NGMNCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfZGVzYz1cdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwNmVcdThhYWNcdTY2MGU6DQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cwPVx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMT1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwOTJcdTRmNWNcdTYyMTBcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzI9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDkyXHUzMGIzXHUzMGQ0XHUzMGZjXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0czPVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2OFx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzBmYlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NzUxZlx1NjIxMFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHND1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNGNcdTViOGNcdTRlODZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi1TYXZlTGlicmFyeVBhZ2VfdGl0bGU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDZlXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4DQotU2F2ZVBsdWdpblBhZ2VfbGFiZWxfbmFtZT1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTU0MGQ6DQotU2F2ZUxpYnJhcnlQYWdlX2Rlc2M9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDRhXHUzMDg4XHUzMDczXHU5NWEyXHU5MDIzXHUzMDU5XHUzMDhiXHU2OWNiXHU2MjEwXHUzMDkyXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotRXhwb3J0UGx1Z2luV2l6YXJkX01TRzE9XHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHU2OWNiXHU2MjEwXHUzMDkyXHU1MjA2XHU2NzkwXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNiMDJjYWUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMDAwRSAtIElVUEUwMDk5RQ0KLSMNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotZXhwb3J0Q29uZmlnV2l6YXJkX3RpdGxlPVx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWFkNmNcdWMxMzEgXHViMGI0XHViY2Y0XHViMGI0XHVhZTMwDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfdGl0bGU9XHViMGI0XHViY2Y0XHViMGI0XHVhZTMwIFx1YzcyMFx1ZDYxNSBcdWMxMjBcdWQwZGQNCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVx1YjBiNFx1YmNmNFx1YjBiYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVhZDZjXHVjMTMxIFx1YzcyMFx1ZDYxNVx1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnTGFiZWxfdGV4dD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxXHVhY2ZjIFx1ZDU3NFx1YjJmOVx1ZDU1OFx1YjI5NCBcdWJhYThcdWI0ZTAgXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OCBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzANCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdTcGVjc0xhYmVsX3RleHQ9XHVkNTU4XHViMDk4IFx1Yzc3NFx1YzBjMVx1Yzc1OCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxIFx1YzJhNFx1ZDM5OSBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzANCi1zZWxlY3RDb25maWdQYWdlX3RpdGxlPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzEgXHVjMTIwXHVkMGRkDQotc2VsZWN0Q29uZmlnUGFnZV9kZXNjPVx1YjBiNFx1YmNmNFx1YjBiYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4gXHVjMTIwXHVkMGRkXHVkNTVjIFx1YWQ2Y1x1YzEzMVx1Yzc1OCBcdWJhYThcdWI0ZTAgXHVjYzM4XHVjODcwXHViNDFjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NzQgXHViMGI0XHViY2Y0XHViMGI0XHVhZTMwXHVjNWQwIFx1ZDNlY1x1ZDU2OFx1YjQyOVx1YjJjOFx1YjJlNC4NCi1zZWxlY3RDb25maWdQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzE6DQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX3RpdGxlPVx1YWQ2Y1x1YzEzMSBcdWMyYTRcdWQzOTkgXHVjMTIwXHVkMGRkDQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2Rlc2M9XHViMGI0XHViY2Y0XHViMGJjIFx1ZDU1OFx1YjA5OCBcdWM3NzRcdWMwYzFcdWM3NTggXHViYTU0XHVjMThjXHViNGRjIFx1YWQ2Y1x1YzEzMSBcdWMyYTRcdWQzOTlcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV9jb25maWdzTGFiZWxfdGV4dD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxOg0KLWNoZWNrQ29uZmlnUGFnZV90aXRsZT1cdWFkNmNcdWMxMzEgXHVjNjI0XHViOTU4IFx1YWM4MFx1ZDFhMA0KLWNoZWNrQ29uZmlnUGFnZV9kZXNjPVx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJiMzRcdWFjYjBcdWMxMzEgXHVhYzgwXHVjMGFjXHVhYzAwIFx1YzIxOFx1ZDU4OVx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNjI0XHViOTU4IFx1YmNmNFx1YWNlMFx1YzExY1x1Yjk3YyBcdWFjODBcdWQxYTBcdWQ1NThcdWFjZTAgXHVkNTQ0XHVjNjk0XHVkNTVjIFx1YzIxOFx1YzgxNSBcdWM4NzBcdWNlNThcdWI5N2MgXHVjMjE4XHVkNTg5XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV90aXRsZT1cdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzAgXHViNTE0XHViODA5XHVkMWEwXHViOWFjIFx1YzljMFx1YzgxNQ0KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV9kZXNjPVx1YjBiNFx1YmNmNFx1YjBiNFx1YjI5NCBcdWFkNmNcdWMxMzFcdWM3NDQgXHVjODAwXHVjN2E1XHVkNTYwIFx1YjMwMFx1YzBjMSBcdWI1MTRcdWI4MDlcdWQxYTBcdWI5YWNcdWI5N2MgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLSMgRXhwb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1leHBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzggXHViMGI0XHViY2Y0XHViMGI0XHVhZTMwDQotc2VsZWN0UGx1Z2luc1BhZ2VfdGl0bGU9XHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OCBcdWMxMjBcdWQwZGQNCi1zZWxlY3RQbHVnaW5zUGFnZV9kZXNjPVx1YjBiNFx1YmNmNFx1YjBiYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzQ0IFx1ZDU1OFx1YjA5OCBcdWM3NzRcdWMwYzEgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXNlbGVjdFBsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0PVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3Nzg6DQotcmV2aWV3UGx1Z2luc1BhZ2VfdGl0bGU9XHVjODg1XHVjMThkXHVjMTMxIFx1YWM4MFx1ZDFhMA0KLXJldmlld1BsdWdpbnNQYWdlX2Rlc2M9XHVjODg1XHVjMThkXHVjMTMxXHVjNzQ0IFx1YWM4MFx1ZDFhMFx1ZDU2MCBcdWFjMDEgXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuIFx1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMFx1YzVkMCBcdWQzZWNcdWQ1NjhcdWQ1NzRcdWM1N2MgXHVkNTYwIFx1Yzg4NVx1YzE4ZFx1YzgwMSBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHViODI0XHViYTc0IFx1Yzc3NFx1YzgwNFx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcmV2aWV3UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQ9XHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3ODoNCi1yZXZpZXdQbHVnaW5zUGFnZV9kZXBlbmRlbnRQbHVnaW5zTGFiZWxfdGV4dD1cdWM4ODVcdWMxOGRcdWM4MDEgXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3ODoNCi1yZXZpZXdQbHVnaW5zUGFnZV9hc3NvY2lhdGVkQ29uZmlnc0xhYmVsX3RleHQ9XHVjNWYwXHVhZDAwXHViNDFjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzE6DQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfdGl0bGU9XHViMGI0XHViY2Y0XHViMGI0XHVhZTMwIFx1ZDY1NVx1Yzc3OA0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX2Rlc2M9XHViMGI0XHViY2Y0XHViMGJjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NDQgXHVkNjU1XHVjNzc4XHVkNTY5XHViMmM4XHViMmU0Lg0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX25vUGx1Z2luX3RleHQ9XHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWM5YzAgXHVjNTRhXHVjNTU4XHVjMmI1XHViMmM4XHViMmU0Lg0KLXNwZWNpZnlQYXRoUGFnZV90aXRsZT1cdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzAgXHViNTE0XHViODA5XHVkMWEwXHViOWFjIFx1YzljMFx1YzgxNQ0KLXNwZWNpZnlQYXRoUGFnZV9kZXNjPVx1YjBiNFx1YmNmNFx1YjBiNFx1YjI5NCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzQ0IFx1YzgwMFx1YzdhNVx1ZDU2MCBcdWIzMDBcdWMwYzEgXHViNTE0XHViODA5XHVkMWEwXHViOWFjXHViOTdjIFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1TYXZlUGx1Z2luUGFnZV9kZXNjPVx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWFjZmMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YzljMFx1YzgxNVx1YjQxYyBcdWIzMDBcdWMwYzEgXHViNTE0XHViODA5XHVkMWEwXHViOWFjXHViODVjIFx1YjBiNFx1YmNmNFx1YjBjNVx1YjJjOFx1YjJlNC4NCi1FeHBvcnRQbHVnaW5XaXphcmRfdGl0bGU9XHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OCBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzAgXHViOWM4XHViYzk1XHVjMGFjIFx1YzYyNFx1Yjk1OA0KLUV4cG9ydFBsdWdpbkVycm9yX21zZz1JVVBFMDAwMEU6IFx1YjBiNFx1YmNmNFx1YjBiNFx1YjI5NCBcdWM5MTFcdWM1ZDAgXHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YWQ2Y1x1YzEzMSBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzANCi1leHBvcnRDb25maWdFcnJvckRpYWxvZ19tc2c9SVVQRTAwMDFFOiBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzAgXHVjODcwXHVjNzkxXHVjNzQ0IFx1YzljNFx1ZDU4OVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1hbmFseXppbmdDb25maWdUYXNrX25hbWU9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YWQ2Y1x1YzEzMSBcdWJkODRcdWMxMWQgXHVjOTExLi4uDQotDQotIyBUaGUgZm9sbG93aW5nIG1lc3NhZ2VzIGhhdmUgbm90IGJlZW4gcmV2aWV3ZWQuDQotQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cwPVx1YWQ2Y1x1YzEzMVx1Yzc0NCBcdWIwYjRcdWJjZjRcdWIwYjRcdWIyOTQgXHVjOTExLi4uDQotQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cxPVx1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMFx1YWMwMCBcdWM2NDRcdWI4Y2NcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMT1cdWMxMjBcdWQwZGRcdWQ1NWMgXHVhZDZjXHVjMTMxXHVjNzU4IFx1YmIzNFx1YWNiMFx1YzEzMVx1Yzc0NCBcdWFjODBcdWMwYWNcdWQ1NThcdWIyOTQgXHVjOTExLi4uXG4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8yPVx1YWQ2Y1x1YzEzMVx1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWM5YzAgXHVjNTRhXHVjNTU4XHVjMmI1XHViMmM4XHViMmU0LlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMz1cdWMxMjBcdWQwZGRcdWQ1NWMgXHVhZDZjXHVjMTMxXHVjNWQwIFx1YmIzOFx1YzgxY1x1YWMwMCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuXG4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV80PVx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWFkNmNcdWMxMzFcdWM1ZDAgezB9IFx1YmIzOFx1YzgxY1x1YzgxMFx1Yzc3NCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuXG5cdWFkNmNcdWMxMzEgXHVkM2I4XHVjOWQxXHVhZTMwXHViOTdjIFx1YzVmNFx1YWNlMCBcdWM3NzQgXHViYjM4XHVjODFjXHVjODEwXHVjNzQ0IFx1YzIxOFx1YzgxNVx1ZDU2MCBcdWMyMTggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LlxuXHViNjEwXHViMjk0IFx1Yzc3NCBcdWJiMzhcdWM4MWNcdWM4MTBcdWM3NDQgXHViYjM0XHVjMmRjXHVkNTU4XHVhY2UwIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YjNjNFx1Yjg1ZCBcdWMxMjBcdWQwZGRcdWQ1NjAgXHVjMjE4IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2VfY2hlY2tpbmc9XHVhZDZjXHVjMTMxXHVjNzQ0IFx1YWM4MFx1YzBhY1x1ZDU1OFx1YjI5NCBcdWM5MTFcdWM3ODVcdWIyYzhcdWIyZTQuIFx1YWUzMFx1YjJlNFx1YjlhY1x1YzJlZFx1YzJkY1x1YzYyNC4NCi1FeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlX3RpdGxlPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzEgXHVjMTIwXHVkMGRkDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Jyb3dzZT1cdWNjM2VcdWM1NDRcdWJjZjRcdWFlMzAuLi4NCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGVmYXVsdF9kaXI9XHVhZTMwXHViY2Y4IFx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhYyBcdWMwYWNcdWM2YTkNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cwPVx1YWQ2Y1x1YzEzMVx1Yzc0NCBcdWIwYjRcdWJjZjRcdWIwYjRcdWIyOTQgXHVjOTExLi4uDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMj1JVVBFMDAwMkU6IFx1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMCBcdWMyZTRcdWQzMjg6IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWI4NWNcdWI0ZGNcdWQ1NThcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OFx1YWMwMCBcdWJjMWNcdWMwZGRcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHND1JVVBFMDAwM0U6IFx1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMCBcdWMyZTRcdWQzMjg6IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWJjZjVcdWMwYWNcdWQ1NThcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OFx1YWMwMCBcdWJjMWNcdWMwZGRcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMT1JVVBFMDAwNEU6IFx1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMCBcdWMyZTRcdWQzMjg6IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWFkNmNcdWMxMzFcdWM3NDQgXHViMmViXHViMjk0IFx1YzkxMVx1YzVkMCBcdWM2MjRcdWI5NThcdWFjMDAgXHViYzFjXHVjMGRkXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0Lg0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzk9SVVQRTAwMDVFOiBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzAgXHVjMmU0XHVkMzI4OiBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHVjODAwXHVjN2E1XHVkNTU4XHViMjk0IFx1YzkxMVx1YzVkMCBcdWM2MjRcdWI5NThcdWFjMDAgXHViYzFjXHVjMGRkXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0Lg0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9uYW1lPVx1Yzc3NFx1Yjk4NDoNCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGlyPVx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhYzoNCi1FeHBvcnRQbHVnaW5XaXphcmRfZXJyb3I9XHVjNjI0XHViOTU4DQotRGVzdGluYXRpb25Db21tb25QYWdlX3RpdGxlPVx1YWUzMFx1YmNmOCBcdWM4MWNcdWJhYTkNCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfZGVzYz1cdWFlMzBcdWJjZjggXHVjMTI0XHViYTg1Og0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMD1cdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NDQgXHViMGI0XHViY2Y0XHViMGI0XHViMjk0IFx1YzkxMS4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMT1cdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzAgXHViNTE0XHViODA5XHVkMWEwXHViOWFjXHViOTdjIFx1Yzc5MVx1YzEzMVx1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzI9XHVkMzBjXHVjNzdjXHVjNzQ0IFx1YmNmNVx1YzBhY1x1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzM9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YmMwZiBcdWM3OTBcdWM2ZDAgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YzBkZFx1YzEzMVx1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzQ9XHViMGI0XHViY2Y0XHViMGI0XHVhZTMwXHVhYzAwIFx1YzY0NFx1YjhjY1x1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1TYXZlTGlicmFyeVBhZ2VfdGl0bGU9XHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OCBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzANCi1TYXZlUGx1Z2luUGFnZV9sYWJlbF9uYW1lPVx1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMCBcdWM3NzRcdWI5ODQ6DQotU2F2ZUxpYnJhcnlQYWdlX2Rlc2M9XHVjMTIwXHVkMGRkXHVkNTVjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzggXHViYzBmIFx1YzVmMFx1YWQwMFx1YjQxYyBcdWFkNmNcdWMxMzFcdWM3NDQgXHViMGI0XHViY2Y0XHViMGM1XHViMmM4XHViMmU0Lg0KLUV4cG9ydFBsdWdpbldpemFyZF9NU0cxPVx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWFkNmNcdWMxMzEgXHViZDg0XHVjMTFkIFx1YzkxMS4uLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNGRlNjk5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOiBJVVBFMDAwMEUgLSBJVVBFMDA5OUUNCi0jDQotDQotIyBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWV4cG9ydENvbmZpZ1dpemFyZF90aXRsZT1FeHBvcnRhciBDb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIEJpYmxpb3RlY2ENCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV90aXRsZT1TZWxlY2lvbmFyIHRpcG8gZGUgZXhwb3J0YVx1MDBlN1x1MDBlM28NCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVNlbGVjaW9uZSBvIHRpcG8gZGUgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBiaWJsaW90ZWNhIGEgc2VyIGV4cG9ydGFkYS4NCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdMYWJlbF90ZXh0PUV4cG9ydGFyIHVtYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIG1cdTAwZTl0b2RvIGUgdG9kb3Mgb3Mgc2V1cyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbw0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ1NwZWNzTGFiZWxfdGV4dD1FeHBvcnRhciB1bWEgb3UgbWFpcyBlc3BlY2lmaWNhXHUwMGU3XHUwMGY1ZXMgZGUgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBtXHUwMGU5dG9kbw0KLXNlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9U2VsZWNpb25hciBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIG1cdTAwZTl0b2RvDQotc2VsZWN0Q29uZmlnUGFnZV9kZXNjPVNlbGVjaW9uZSB1bWEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBtXHUwMGU5dG9kbyBwYXJhIGV4cG9ydGFyLiBUb2RvcyBvcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbyByZWZlcmVuY2lhZG9zIG5hIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gc2VsZWNpb25hZGEgc2VyXHUwMGUzbyBpbmNsdVx1MDBlZGRvcyBuYSBleHBvcnRhXHUwMGU3XHUwMGUzby4NCi1zZWxlY3RDb25maWdQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PUNvbmZpZ3VyYVx1MDBlN1x1MDBmNWVzIGRlIG1cdTAwZTl0b2RvOg0KLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV90aXRsZT1TZWxlY2lvbmFyIGVzcGVjaWZpY2FcdTAwZTdcdTAwZjVlcyBkZSBjb25maWd1cmFcdTAwZTdcdTAwZTNvDQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2Rlc2M9U2VsZWNpb25lIHVtYSBvdSBtYWlzIGNvbmZpZ3VyYVx1MDBlN1x1MDBmNWVzIGRlIG1cdTAwZTl0b2RvIHBhcmEgZXhwb3J0YVx1MDBlN1x1MDBlM28uDQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PUNvbmZpZ3VyYVx1MDBlN1x1MDBmNWVzIGRlIG1cdTAwZTl0b2RvOg0KLWNoZWNrQ29uZmlnUGFnZV90aXRsZT1SZXZpc2FyIGVycm9zIGRlIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28NCi1jaGVja0NvbmZpZ1BhZ2VfZGVzYz1VbWEgdmVyaWZpY2FcdTAwZTdcdTAwZTNvIGRlIGludGVncmlkYWRlIGZvaSBleGVjdXRhZGEgbmEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBtXHUwMGU5dG9kbyBzZWxlY2lvbmFkYS4gUmV2aXNlIG8gcmVsYXRcdTAwZjNyaW8gZGUgZXJyb3MgZSBleGVjdXRlIGFzIGFcdTAwZTdcdTAwZjVlcyBjb3JyZXRpdmFzIG5lY2Vzc1x1MDBlMXJpYXMuDQotc2VsZWN0RGVzdGluYXRpb25QYWdlX3RpdGxlPUVzcGVjaWZpY2FyIGRpcmV0XHUwMGYzcmlvIGRlIGV4cG9ydGFcdTAwZTdcdTAwZTNvDQotc2VsZWN0RGVzdGluYXRpb25QYWdlX2Rlc2M9RXNwZWNpZmlxdWUgdW0gZGlyZXRcdTAwZjNyaW8gZGUgZGVzdGlubyBwYXJhIGFybWF6ZW5hciBhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZXhwb3J0YWRhLg0KLQ0KLSMgRXhwb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1leHBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlPUV4cG9ydGFyIFBsdWctaW5zIGRlIE1cdTAwZTl0b2RvDQotc2VsZWN0UGx1Z2luc1BhZ2VfdGl0bGU9U2VsZWNpb25hciBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbw0KLXNlbGVjdFBsdWdpbnNQYWdlX2Rlc2M9U2VsZWNpb25lIHVtIG91IG1haXMgcGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8gcGFyYSBleHBvcnRhXHUwMGU3XHUwMGUzby4NCi1zZWxlY3RQbHVnaW5zUGFnZV9wbHVnaW5zTGFiZWxfdGV4dD1QbHVnLWlucyBkZSBtXHUwMGU5dG9kbzoNCi1yZXZpZXdQbHVnaW5zUGFnZV90aXRsZT1SZXZpc2FyIGRlcGVuZFx1MDBlYW5jaWFzDQotcmV2aWV3UGx1Z2luc1BhZ2VfZGVzYz1TZWxlY2lvbmUgY2FkYSBwbHVnLWluIGRlIG1cdTAwZTl0b2RvIHBhcmEgcmV2aXNhciBzdWFzIGRlcGVuZFx1MDBlYW5jaWFzLiBDbGlxdWUgZW0gVm9sdGFyIHBhcmEgc2VsZWNpb25hciBvcyBwbHVnLWlucyBkZXBlbmRlbnRlcyBzZSBlbGVzIHByZWNpc2FyZW0gc2VyIGluY2x1XHUwMGVkZG9zIG5hIGV4cG9ydGFcdTAwZTdcdTAwZTNvLg0KLXJldmlld1BsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0PVBsdWctaW5zIGRlIE1cdTAwZTl0b2RvOg0KLXJldmlld1BsdWdpbnNQYWdlX2RlcGVuZGVudFBsdWdpbnNMYWJlbF90ZXh0PVBsdWctaW5zIGRlIG1cdTAwZTl0b2RvIGRlcGVuZGVudGVzOg0KLXJldmlld1BsdWdpbnNQYWdlX2Fzc29jaWF0ZWRDb25maWdzTGFiZWxfdGV4dD1Db25maWd1cmFcdTAwZTdcdTAwZjVlcyBkZSBtXHUwMGU5dG9kbyBhc3NvY2lhZGFzOg0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX3RpdGxlPUNvbmZpcm1hciBleHBvcnRhXHUwMGU3XHUwMGUzbw0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX2Rlc2M9Q29uZmlybWUgb3MgcGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8gcXVlIHNlclx1MDBlM28gZXhwb3J0YWRvcy4NCi1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9ub1BsdWdpbl90ZXh0PU5lbmh1bSBwbHVnLWluIGRlIG1cdTAwZTl0b2RvIGZvaSBzZWxlY2lvbmFkby4NCi1zcGVjaWZ5UGF0aFBhZ2VfdGl0bGU9RXNwZWNpZmljYXIgZGlyZXRcdTAwZjNyaW8gZGUgZXhwb3J0YVx1MDBlN1x1MDBlM28NCi1zcGVjaWZ5UGF0aFBhZ2VfZGVzYz1Fc3BlY2lmaXF1ZSB1bSBkaXJldFx1MDBmM3JpbyBkZSBkZXN0aW5vIHBhcmEgYXJtYXplbmFyIG9zIHBsdWctaW5zIGRlIG1cdTAwZTl0b2RvIGV4cG9ydGFkb3MuDQotU2F2ZVBsdWdpblBhZ2VfZGVzYz1FeHBvcnRlIG9zIFBsdWctaW5zIGUgYXMgQ29uZmlndXJhXHUwMGU3XHUwMGY1ZXMgc2VsZWNpb25hZG9zIHBhcmEgbyBkaXJldFx1MDBmM3JpbyBkZSBkZXN0aW5vIGVzcGVjaWZpY2Fkby4NCi1FeHBvcnRQbHVnaW5XaXphcmRfdGl0bGU9RXJybyBkbyBBc3Npc3RlbnRlIGRlIEV4cG9ydGFcdTAwZTdcdTAwZTNvIGRlIFBsdWctaW4gZGUgTVx1MDBlOXRvZG8NCi1FeHBvcnRQbHVnaW5FcnJvcl9tc2c9SVVQRTAwMDBFOiBFcnJvIGVuY29udHJhZG8gbmEgZXhwb3J0YVx1MDBlN1x1MDBlM28NCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9RXhwb3J0YXIgQ29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBCaWJsaW90ZWNhDQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfbXNnPUlVUEUwMDAxRTogTlx1MDBlM28gXHUwMGU5IHBvc3NcdTAwZWR2ZWwgcHJvc3NlZ3VpciBhIG9wZXJhXHUwMGU3XHUwMGUzbyBkZSBleHBvcnRhXHUwMGU3XHUwMGUzby4NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotYW5hbHl6aW5nQ29uZmlnVGFza19uYW1lPUFuYWxpc2FuZG8gYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRhIGJpYmxpb3RlY2EuLi4NCi0NCi0jIFRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgaGF2ZSBub3QgYmVlbiByZXZpZXdlZC4NCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzA9RXhwb3J0YW5kbyBjb25maWd1cmFcdTAwZTdcdTAwZTNvLi4uDQotQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cxPUV4cG9ydGFcdTAwZTdcdTAwZTNvIGNvbmNsdVx1MDBlZGRhLg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzE9VmVyaWZpY2FuZG8gYSBpbnRlZ3JpZGFkZSBkYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHNlbGVjaW9uYWRhLi4uXG4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8yPU5lbmh1bWEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBzZWxlY2lvbmFkYS5cbg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzM9Tlx1MDBlM28gZXhpc3RlIG5lbmh1bSBwcm9ibGVtYSBuYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHNlbGVjaW9uYWRhLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfND1FeGlzdGVtIHswfSBwcm9ibGVtYXMgbmEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBzZWxlY2lvbmFkYS4gXG5BYnJhIG8gZWRpdG9yIGRlIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZSBjb3JyaWphIGVzc2VzIHByb2JsZW1hcy4gXG5PdSBvcHRlIHBvciBpZ25vcmFyIGVzc2VzIHByb2JsZW1hcyBlIGNvbnRpbnVhci4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2VfY2hlY2tpbmc9VmVyaWZpY2FuZG8gYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvLCBhZ3VhcmRlLi4uDQotRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZV90aXRsZT1Fc2NvbGhlciBDb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIE1cdTAwZTl0b2RvDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Jyb3dzZT1Qcm9jdXJhci4uLg0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9kZWZhdWx0X2Rpcj1VdGlsaXphciBkaXJldFx1MDBmM3JpbyBwYWRyXHUwMGUzbw0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzA9RXhwb3J0YW5kbyBjb25maWd1cmFcdTAwZTdcdTAwZTNvLi4uDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMj1JVVBFMDAwMkU6IEZhbGhhIG5hIGV4cG9ydGFcdTAwZTdcdTAwZTNvOiBFcnJvIGFvIGNhcnJlZ2FyIGJpYmxpb3RlY2ENCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c0PUlVUEUwMDAzRTogRmFsaGEgbmEgZXhwb3J0YVx1MDBlN1x1MDBlM286IEVycm8gYW8gY29waWFyIGJpYmxpb3RlY2ENCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cxPUlVUEUwMDA0RTogRmFsaGEgbmEgZXhwb3J0YVx1MDBlN1x1MDBlM286IEVycm8gYW8gZmF6ZXIgbyBmZWNoYW1lbnRvIGRhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGEgYmlibGlvdGVjYQ0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzk9SVVQRTAwMDVFOiBGYWxoYSBuYSBleHBvcnRhXHUwMGU3XHUwMGUzbzogRXJybyBhbyBzYWx2YXIgYmlibGlvdGVjYQ0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9uYW1lPU5vbWU6DQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Rpcj1EaXJldFx1MDBmM3JpbzoNCi1FeHBvcnRQbHVnaW5XaXphcmRfZXJyb3I9RXJybw0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV90aXRsZT1UXHUwMGVkdHVsbyBQYWRyXHUwMGUzbw0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9kZXNjPURlc2NyaVx1MDBlN1x1MDBlM28gUGFkclx1MDBlM286DQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cwPUV4cG9ydGFuZG8gcGx1Zy1pbnMuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzE9Q3JpYW5kbyBkaXJldFx1MDBmM3JpbyBkZSBleHBvcnRhXHUwMGU3XHUwMGUzby4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMj1Db3BpYW5kbyBhcnF1aXZvcy4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMz1HZXJhbmRvIGJpYmxpb3RlY2EgZSBhcnF1aXZvIGRlIHJlY3Vyc29zLi4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0c0PUV4cG9ydGFcdTAwZTdcdTAwZTNvIGNvbmNsdVx1MDBlZGRhLg0KLVNhdmVMaWJyYXJ5UGFnZV90aXRsZT1FeHBvcnRhciBQbHVnLWluIGRlIE1cdTAwZTl0b2RvDQotU2F2ZVBsdWdpblBhZ2VfbGFiZWxfbmFtZT1Ob21lIGRhIGV4cG9ydGFcdTAwZTdcdTAwZTNvOg0KLVNhdmVMaWJyYXJ5UGFnZV9kZXNjPUV4cG9ydGUgb3MgcGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8gc2VsZWNpb25hZG9zIGUgYXMgY29uZmlndXJhXHUwMGU3XHUwMGY1ZXMgYXNzb2NpYWRhcw0KLUV4cG9ydFBsdWdpbldpemFyZF9NU0cxPUFuYWxpc2FuZG8gYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRhIGJpYmxpb3RlY2EuLi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTY1MzVlOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQRTAwMDBFIC0gSVVQRTAwOTlFDQotIw0KLQ0KLSMgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1leHBvcnRDb25maWdXaXphcmRfdGl0bGU9XHU1YmZjXHU1MWZhXHU1ZTkzXHU5MTRkXHU3ZjZlDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfdGl0bGU9XHU5MDA5XHU2MmU5XHU1YmZjXHU1MWZhXHU3YzdiXHU1NzhiDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYz1cdTkwMDlcdTYyZTlcdTg5ODFcdTViZmNcdTUxZmFcdTc2ODRcdTVlOTNcdTkxNGRcdTdmNmVcdTdjN2JcdTU3OGJcdTMwMDINCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdMYWJlbF90ZXh0PVx1NWJmY1x1NTFmYVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1NTNjYVx1NTE3Nlx1NjI0MFx1NjcwOVx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNg0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ1NwZWNzTGFiZWxfdGV4dD1cdTViZmNcdTUxZmFcdTRlMDBcdTRlMmFcdTYyMTZcdTU5MWFcdTRlMmFcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTg5YzRcdTgzMDMNCi1zZWxlY3RDb25maWdQYWdlX3RpdGxlPVx1OTAwOVx1NjJlOVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZQ0KLXNlbGVjdENvbmZpZ1BhZ2VfZGVzYz1cdTkwMDlcdTYyZTlcdTg5ODFcdTViZmNcdTUxZmFcdTc2ODRcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTMwMDJcdThiZTVcdTViZmNcdTUxZmFcdTVjMDZcdTUzMDVcdTU0MmJcdTkwMDlcdTViOWFcdTkxNGRcdTdmNmVcdTRlMmRcdTYyNDBcdTY3MDlcdTVmMTVcdTc1MjhcdTc2ODRcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjZcdTMwMDINCi1zZWxlY3RDb25maWdQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1ZmYxYQ0KLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV90aXRsZT1cdTkwMDlcdTYyZTlcdTkxNGRcdTdmNmVcdTg5YzRcdTgzMDMNCi1zZWxlY3RDb25maWdTcGVjc1BhZ2VfZGVzYz1cdTkwMDlcdTYyZTlcdTg5ODFcdTViZmNcdTUxZmFcdTc2ODRcdTRlMDBcdTRlMmFcdTYyMTZcdTU5MWFcdTRlMmFcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTg5YzRcdTgzMDNcdTMwMDINCi1zZWxlY3RDb25maWdTcGVjc1BhZ2VfY29uZmlnc0xhYmVsX3RleHQ9XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlXHVmZjFhDQotY2hlY2tDb25maWdQYWdlX3RpdGxlPVx1NjhjMFx1NjdlNVx1OTE0ZFx1N2Y2ZVx1OTUxOVx1OGJlZg0KLWNoZWNrQ29uZmlnUGFnZV9kZXNjPVx1NWRmMlx1NWJmOVx1OTAwOVx1NWI5YVx1NzY4NFx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1NjI2N1x1ODg0Y1x1NWI4Y1x1NjU3NFx1NjAyN1x1NjhjMFx1NjdlNVx1MzAwMlx1OGJmN1x1OTYwNVx1OGJmYlx1OTUxOVx1OGJlZlx1NjJhNVx1NTQ0YVx1ZmYwY1x1NzEzNlx1NTQwZVx1NjI2N1x1ODg0Y1x1NWZjNVx1ODk4MVx1NzY4NFx1NjZmNFx1NmI2M1x1NjRjZFx1NGY1Y1x1MzAwMg0KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV90aXRsZT1cdTYzMDdcdTViOWFcdTViZmNcdTUxZmFcdTc2ZWVcdTVmNTUNCi1zZWxlY3REZXN0aW5hdGlvblBhZ2VfZGVzYz1cdTYzMDdcdTViOWFcdTViNThcdTUwYThcdTViZmNcdTUxZmFcdTkxNGRcdTdmNmVcdTc2ODRcdTc2ZWVcdTY4MDdcdTc2ZWVcdTVmNTVcdTMwMDINCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0UGx1Z2luc1dpemFyZF90aXRsZT1cdTViZmNcdTUxZmFcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjYNCi1zZWxlY3RQbHVnaW5zUGFnZV90aXRsZT1cdTkwMDlcdTYyZTlcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjYNCi1zZWxlY3RQbHVnaW5zUGFnZV9kZXNjPVx1OTAwOVx1NjJlOVx1ODk4MVx1NWJmY1x1NTFmYVx1NzY4NFx1NGUwMFx1NGUyYVx1NjIxNlx1NTkxYVx1NGUyYVx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNlx1MzAwMg0KLXNlbGVjdFBsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0PVx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNlx1ZmYxYQ0KLXJldmlld1BsdWdpbnNQYWdlX3RpdGxlPVx1NjhjMFx1NjdlNVx1NGY5ZFx1OGQ1Nlx1NTE3M1x1N2NmYg0KLXJldmlld1BsdWdpbnNQYWdlX2Rlc2M9XHU5MDA5XHU2MmU5XHU2YmNmXHU0ZTJhXHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHVmZjBjXHU2N2U1XHU3NzBiXHU1MTc2XHU0ZjlkXHU4ZDU2XHU1MTczXHU3Y2ZiXHUzMDAyXHU1OTgyXHU2NzljXHU1YmZjXHU1MWZhXHU0ZTJkXHU1ZmM1XHU5ODdiXHU1MzA1XHU1NDJiXHU0ZjlkXHU4ZDU2XHU2M2QyXHU0ZWY2XHVmZjBjXHU4YmY3XHU1MzU1XHU1MWZiXHUyMDFjXHU0ZTBhXHU0ZTAwXHU2YjY1XHUyMDFkXHU5MDA5XHU2MmU5XHU0ZjlkXHU4ZDU2XHU2M2QyXHU0ZWY2XHUzMDAyDQotcmV2aWV3UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQ9XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHVmZjFhDQotcmV2aWV3UGx1Z2luc1BhZ2VfZGVwZW5kZW50UGx1Z2luc0xhYmVsX3RleHQ9XHU0ZjlkXHU4ZDU2XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHVmZjFhDQotcmV2aWV3UGx1Z2luc1BhZ2VfYXNzb2NpYXRlZENvbmZpZ3NMYWJlbF90ZXh0PVx1NTE3M1x1ODA1NFx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1ZmYxYQ0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX3RpdGxlPVx1Nzg2ZVx1OGJhNFx1NWJmY1x1NTFmYQ0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX2Rlc2M9XHU3ODZlXHU4YmE0XHU1YzA2XHU1YmZjXHU1MWZhXHU3Njg0XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHUzMDAyDQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2Vfbm9QbHVnaW5fdGV4dD1cdTY3MmFcdTkwMDlcdTYyZTlcdTRlZmJcdTRmNTVcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjZcdTMwMDINCi1zcGVjaWZ5UGF0aFBhZ2VfdGl0bGU9XHU2MzA3XHU1YjlhXHU1YmZjXHU1MWZhXHU3NmVlXHU1ZjU1DQotc3BlY2lmeVBhdGhQYWdlX2Rlc2M9XHU2MzA3XHU1YjlhXHU1YjU4XHU1MGE4XHU1YmZjXHU1MWZhXHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHU3Njg0XHU3NmVlXHU2ODA3XHU3NmVlXHU1ZjU1XHUzMDAyDQotU2F2ZVBsdWdpblBhZ2VfZGVzYz1cdTVjMDZcdTkwMDlcdTViOWFcdTc2ODRcdTYzZDJcdTRlZjZcdTU0OGNcdTkxNGRcdTdmNmVcdTViZmNcdTUxZmFcdTUyMzBcdTYzMDdcdTViOWFcdTc2ZWVcdTY4MDdcdTc2ZWVcdTVmNTVcdTMwMDINCi1FeHBvcnRQbHVnaW5XaXphcmRfdGl0bGU9XHU1YmZjXHU1MWZhXHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHU1NDExXHU1YmZjXHU5NTE5XHU4YmVmDQotRXhwb3J0UGx1Z2luRXJyb3JfbXNnPUlVUEUwMDAwRTogXHU1YmZjXHU1MWZhXHU2NWY2XHU1M2QxXHU3NTFmXHU5NTE5XHU4YmVmDQotDQotIyBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIEVycm9yIERpYWxvZw0KLWV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPVx1NWJmY1x1NTFmYVx1NWU5M1x1OTE0ZFx1N2Y2ZQ0KLWV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX21zZz1JVVBFMDAwMUU6IFx1NWJmY1x1NTFmYVx1NjRjZFx1NGY1Y1x1NjVlMFx1NmNkNVx1N2VlN1x1N2VlZFx1MzAwMg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1hbmFseXppbmdDb25maWdUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU1MjA2XHU2NzkwXHU1ZTkzXHU5MTRkXHU3ZjZlLi4uDQotDQotIyBUaGUgZm9sbG93aW5nIG1lc3NhZ2VzIGhhdmUgbm90IGJlZW4gcmV2aWV3ZWQuDQotQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cwPVx1NmI2M1x1NTcyOFx1NWJmY1x1NTFmYVx1OTE0ZFx1N2Y2ZS4uLg0KLUNvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2VfTVNHMT1cdTViZmNcdTUxZmFcdTViOGNcdTYyMTBcdTMwMDINCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8xPVx1NmI2M1x1NTcyOFx1NjhjMFx1NjdlNVx1OTAwOVx1NWI5YVx1OTE0ZFx1N2Y2ZVx1NzY4NFx1NWI4Y1x1NjU3NFx1NjAyNy4uLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMj1cdTY3MmFcdTkwMDlcdTYyZTlcdTRlZmJcdTRmNTVcdTkxNGRcdTdmNmVcdTMwMDJcbg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzM9XHU5MDA5XHU1YjlhXHU3Njg0XHU5MTRkXHU3ZjZlXHU0ZTJkXHU2NWUwXHU0ZWZiXHU0ZjU1XHU5NWVlXHU5ODk4XHUzMDAyXG4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV80PVx1OTAwOVx1NWI5YVx1NzY4NFx1OTE0ZFx1N2Y2ZVx1NGUyZFx1NjcwOSB7MH0gXHU0ZTJhXHU5NWVlXHU5ODk4XHUzMDAyXG5cdTYwYThcdTUzZWZcdTRlZTVcdTYyNTNcdTVmMDBcdTkxNGRcdTdmNmVcdTdmMTZcdThmOTFcdTU2NjhcdWZmMGNcdTRmZWVcdTU5MGRcdThmZDlcdTRlOWJcdTk1ZWVcdTk4OThcdTMwMDJcblx1NGU1Zlx1NTNlZlx1NGVlNVx1OTAwOVx1NjJlOVx1NWZmZFx1NzU2NVx1OGZkOVx1NGU5Ylx1OTVlZVx1OTg5OFx1NWU3Nlx1N2VlN1x1N2VlZFx1NjRjZFx1NGY1Y1x1MzAwMg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9jaGVja2luZz1cdTZiNjNcdTU3MjhcdTY4YzBcdTY3ZTVcdTkxNGRcdTdmNmVcdWZmMGNcdThiZjdcdTdhMGRcdTUwMTkuLi4NCi1FeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlX3RpdGxlPVx1OTAwOVx1NjJlOVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZQ0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9icm93c2U9XHU2ZDRmXHU4OWM4Li4uDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2RlZmF1bHRfZGlyPVx1NGY3Zlx1NzUyOFx1N2YzYVx1NzcwMVx1NzZlZVx1NWY1NQ0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzA9XHU2YjYzXHU1NzI4XHU1YmZjXHU1MWZhXHU5MTRkXHU3ZjZlLi4uDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMj1JVVBFMDAwMkU6IFx1NWJmY1x1NTFmYVx1NTkzMVx1OGQyNVx1ZmYxYVx1ODhjNVx1NTE2NVx1NWU5M1x1NjVmNlx1NTFmYVx1OTUxOQ0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzQ9SVVQRTAwMDNFOiBcdTViZmNcdTUxZmFcdTU5MzFcdThkMjVcdWZmMWFcdTU5MGRcdTUyMzZcdTVlOTNcdTY1ZjZcdTUxZmFcdTk1MTkNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cxPUlVUEUwMDA0RTogXHU1YmZjXHU1MWZhXHU1OTMxXHU4ZDI1XHVmZjFhXHU3ZWQzXHU2NzVmXHU1ZTkzXHU5MTRkXHU3ZjZlXHU2NWY2XHU1MWZhXHU5NTE5DQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHOT1JVVBFMDAwNUU6IFx1NWJmY1x1NTFmYVx1NTkzMVx1OGQyNVx1ZmYxYVx1NGZkZFx1NWI1OFx1NWU5M1x1NjVmNlx1NTFmYVx1OTUxOQ0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9uYW1lPVx1NTQwZFx1NzlmMFx1ZmYxYQ0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9kaXI9XHU3NmVlXHU1ZjU1XHVmZjFhDQotRXhwb3J0UGx1Z2luV2l6YXJkX2Vycm9yPVx1OTUxOVx1OGJlZg0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV90aXRsZT1cdTdmM2FcdTc3MDFcdTY4MDdcdTk4OTgNCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfZGVzYz1cdTdmM2FcdTc3MDFcdTYzY2ZcdThmZjBcdWZmMWENCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzA9XHU2YjYzXHU1NzI4XHU1YmZjXHU1MWZhXHU2M2QyXHU0ZWY2Li4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cxPVx1NmI2M1x1NTcyOFx1NTIxYlx1NWVmYVx1NWJmY1x1NTFmYVx1NzZlZVx1NWY1NS4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMj1cdTZiNjNcdTU3MjhcdTU5MGRcdTUyMzZcdTY1ODdcdTRlZjYuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzM9XHU2YjYzXHU1NzI4XHU3NTFmXHU2MjEwXHU1ZTkzXHU1NDhjXHU4ZDQ0XHU2ZTkwXHU2NTg3XHU0ZWY2Li4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0c0PVx1NWJmY1x1NTFmYVx1NWI4Y1x1NjIxMFx1MzAwMg0KLVNhdmVMaWJyYXJ5UGFnZV90aXRsZT1cdTViZmNcdTUxZmFcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjYNCi1TYXZlUGx1Z2luUGFnZV9sYWJlbF9uYW1lPVx1NWJmY1x1NTFmYVx1NTQwZFx1NzlmMFx1ZmYxYQ0KLVNhdmVMaWJyYXJ5UGFnZV9kZXNjPVx1NWJmY1x1NTFmYVx1OTAwOVx1NWI5YVx1NzY4NFx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNlx1NTQ4Y1x1NTE3M1x1ODA1NFx1OTE0ZFx1N2Y2ZQ0KLUV4cG9ydFBsdWdpbldpemFyZF9NU0cxPVx1NmI2M1x1NTcyOFx1NTIwNlx1Njc5MFx1NWU5M1x1OTE0ZFx1N2Y2ZS4uLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYWU1MjllLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOiBJVVBFMDAwMEUgLSBJVVBFMDA5OUUNCi0jDQotDQotIyBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWV4cG9ydENvbmZpZ1dpemFyZF90aXRsZT1cdTUzMmZcdTUxZmFcdTdhMGJcdTVmMGZcdTVlYWJcdTkxNGRcdTdmNmUNCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV90aXRsZT1cdTkwNzhcdTUzZDZcdTUzMmZcdTUxZmFcdTk4NWVcdTU3OGINCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVx1OTA3OFx1NTNkNlx1ODk4MVx1NTMyZlx1NTFmYVx1NzY4NFx1N2EwYlx1NWYwZlx1NWVhYlx1OTE0ZFx1N2Y2ZVx1OTg1ZVx1NTc4Ylx1MzAwMg0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ0xhYmVsX3RleHQ9XHU1MzJmXHU1MWZhXHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlXHU1M2NhXHU1MTc2XHU2MjQwXHU2NzA5XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnU3BlY3NMYWJlbF90ZXh0PVx1NTMyZlx1NTFmYVx1NGUwMFx1NjIxNlx1NTkxYVx1NTAwYlx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1ODk4Zlx1NjgzYw0KLXNlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9XHU5MDc4XHU1M2Q2XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotc2VsZWN0Q29uZmlnUGFnZV9kZXNjPVx1OTA3OFx1NTNkNlx1ODk4MVx1NTMyZlx1NTFmYVx1NzY4NFx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1MzAwMlx1NTcyOFx1OTA3OFx1NTNkNlx1NzY4NFx1OTE0ZFx1N2Y2ZVx1NGUyZFx1NTNjM1x1NzE2N1x1NzY4NFx1NjI0MFx1NjcwOVx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1OTBmZFx1NWMwN1x1NTMyZlx1NTFmYVx1MzAwMg0KLXNlbGVjdENvbmZpZ1BhZ2VfY29uZmlnc0xhYmVsX3RleHQ9XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlXHVmZjFhDQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX3RpdGxlPVx1OTA3OFx1NTNkNlx1OTE0ZFx1N2Y2ZVx1ODk4Zlx1NjgzYw0KLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV9kZXNjPVx1OTA3OFx1NTNkNlx1ODk4MVx1NTMyZlx1NTFmYVx1NzY4NFx1NGUwMFx1NjIxNlx1NTkxYVx1NTAwYlx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1ODk4Zlx1NjgzY1x1MzAwMg0KLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV9jb25maWdzTGFiZWxfdGV4dD1cdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdWZmMWENCi1jaGVja0NvbmZpZ1BhZ2VfdGl0bGU9XHU1YmU5XHU2N2U1XHU5MTRkXHU3ZjZlXHU5MzJmXHU4YWE0DQotY2hlY2tDb25maWdQYWdlX2Rlc2M9XHU5MDc4XHU1M2Q2XHU3Njg0XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlXHU0ZTBhXHU1ZGYyXHU1N2Y3XHU4ODRjXHU1YjhjXHU2NTc0XHU2MDI3XHU2YWEyXHU2N2U1XHUzMDAyXHU4YWNiXHU1YmU5XHU2N2U1XHU5MzJmXHU4YWE0XHU1ODMxXHU1NDRhXHVmZjBjXHU0ZTI2XHU2M2ExXHU1M2Q2XHU1ZmM1XHU4OTgxXHU3Njg0XHU2NmY0XHU2YjYzXHU1MmQ1XHU0ZjVjXHUzMDAyDQotc2VsZWN0RGVzdGluYXRpb25QYWdlX3RpdGxlPVx1NjMwN1x1NWI5YVx1NTMyZlx1NTFmYVx1NzZlZVx1OTMwNA0KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV9kZXNjPVx1NjMwN1x1NWI5YVx1NzZlZVx1NmExOVx1NzZlZVx1OTMwNFx1NGY4Nlx1NTEzMlx1NWI1OFx1NTMyZlx1NTFmYVx1NzY4NFx1OTE0ZFx1N2Y2ZVx1MzAwMg0KLQ0KLSMgRXhwb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1leHBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlPVx1NTMyZlx1NTFmYVx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZg0KLXNlbGVjdFBsdWdpbnNQYWdlX3RpdGxlPVx1OTA3OFx1NTNkNlx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZg0KLXNlbGVjdFBsdWdpbnNQYWdlX2Rlc2M9XHU5MDc4XHU1M2Q2XHU4OTgxXHU1MzJmXHU1MWZhXHU3Njg0XHU0ZTAwXHU2MjE2XHU1OTFhXHU1MDBiXHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHUzMDAyDQotc2VsZWN0UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQ9XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHVmZjFhDQotcmV2aWV3UGx1Z2luc1BhZ2VfdGl0bGU9XHU1YmU5XHU2N2U1XHU3NmY4XHU0ZjlkXHU5NWRjXHU0ZmMyDQotcmV2aWV3UGx1Z2luc1BhZ2VfZGVzYz1cdTkwNzhcdTUzZDZcdTZiY2ZcdTRlMDBcdTUwMGJcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTRmODZcdTZhYTJcdTg5OTZcdTc2ZjhcdTRmOWRcdTk1ZGNcdTRmYzJcdTMwMDJcdTU5ODJcdTY3OWNcdTY3MDlcdTc2ZjhcdTRmOWRcdTc2ODRcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTVmYzVcdTk4MDhcdTUzMmZcdTUxZmFcdWZmMGNcdThhY2JcdTYzMDlcdTMwMGNcdTRlMGFcdTRlMDBcdTZiNjVcdTMwMGRcdTRmODZcdTkwNzhcdTUzZDZcdTMwMDINCi1yZXZpZXdQbHVnaW5zUGFnZV9wbHVnaW5zTGFiZWxfdGV4dD1cdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdWZmMWENCi1yZXZpZXdQbHVnaW5zUGFnZV9kZXBlbmRlbnRQbHVnaW5zTGFiZWxfdGV4dD1cdTc2ZjhcdTRmOWRcdTc2ODRcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdWZmMWENCi1yZXZpZXdQbHVnaW5zUGFnZV9hc3NvY2lhdGVkQ29uZmlnc0xhYmVsX3RleHQ9XHU3NmY4XHU5NWRjXHU3Njg0XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlXHVmZjFhDQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfdGl0bGU9XHU3OGJhXHU4YThkXHU1MzJmXHU1MWZhDQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfZGVzYz1cdTc4YmFcdThhOGRcdTVjMDdcdTUzMmZcdTUxZmFcdTc2ODRcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTMwMDINCi1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9ub1BsdWdpbl90ZXh0PVx1NjcyYVx1OTA3OFx1NTNkNlx1NGVmYlx1NGY1NVx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1MzAwMg0KLXNwZWNpZnlQYXRoUGFnZV90aXRsZT1cdTYzMDdcdTViOWFcdTUzMmZcdTUxZmFcdTc2ZWVcdTkzMDQNCi1zcGVjaWZ5UGF0aFBhZ2VfZGVzYz1cdTYzMDdcdTViOWFcdTc2ZWVcdTZhMTlcdTc2ZWVcdTkzMDRcdTRmODZcdTUxMzJcdTViNThcdTUzMmZcdTUxZmFcdTc2ODRcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTMwMDINCi1TYXZlUGx1Z2luUGFnZV9kZXNjPVx1NWMwN1x1OTA3OFx1NTNkNlx1NzY4NFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1NTQ4Y1x1OTE0ZFx1N2Y2ZVx1NTMyZlx1NTFmYVx1ODFmM1x1NjMwN1x1NWI5YVx1NzY4NFx1NzZlZVx1NmExOVx1NzZlZVx1OTMwNFx1MzAwMg0KLUV4cG9ydFBsdWdpbldpemFyZF90aXRsZT1cdTUzMmZcdTUxZmFcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTdjYmVcdTk3NDhcdTkzMmZcdThhYTQNCi1FeHBvcnRQbHVnaW5FcnJvcl9tc2c9SVVQRTAwMDBFOiBcdTUzMmZcdTUxZmFcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTQNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9XHU1MzJmXHU1MWZhXHU3YTBiXHU1ZjBmXHU1ZWFiXHU5MTRkXHU3ZjZlDQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfbXNnPUlVUEUwMDAxRTogXHU3MTIxXHU2Y2Q1XHU3ZTdjXHU3ZThjXHU1MzJmXHU1MWZhXHU0ZjVjXHU2OTZkXHUzMDAyDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWFuYWx5emluZ0NvbmZpZ1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTUyMDZcdTY3OTBcdTdhMGJcdTVmMGZcdTVlYWJcdTkxNGRcdTdmNmUuLi4NCi0NCi0jIFRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgaGF2ZSBub3QgYmVlbiByZXZpZXdlZC4NCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzA9XHU2YjYzXHU1NzI4XHU1MzJmXHU1MWZhXHU5MTRkXHU3ZjZlLi4uDQotQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cxPVx1NTMyZlx1NTFmYVx1NWI4Y1x1NjIxMFx1MzAwMg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzE9XHU2YjYzXHU1NzI4XHU2YWEyXHU2N2U1XHU5MDc4XHU1YjlhXHU5MTRkXHU3ZjZlXHU3Njg0XHU1YjhjXHU2NTc0XHU2MDI3Li4uXG4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8yPVx1NjcyYVx1OTA3OFx1NTNkNlx1OTE0ZFx1N2Y2ZVx1MzAwMlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMz1cdTkwNzhcdTUzZDZcdTc2ODRcdTkxNGRcdTdmNmVcdTZjOTJcdTY3MDlcdTU1NGZcdTk4NGNcdTMwMDJcbg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzQ9XHU5MDc4XHU1M2Q2XHU3Njg0XHU5MTRkXHU3ZjZlXHU2NzA5IHswfSBcdTUwMGJcdTU1NGZcdTk4NGNcdTMwMDJcblx1NjBhOFx1NTNlZlx1NGVlNVx1OTU4Ylx1NTU1Zlx1OTE0ZFx1N2Y2ZVx1N2RlOFx1OGYyZlx1NTY2OFx1ZmYwY1x1NGUyNlx1NGZlZVx1NmI2M1x1OTAxOVx1NGU5Ylx1NTU0Zlx1OTg0Y1x1MzAwMlxuXHU2MjE2XHU4MDA1XHVmZjBjXHU5MDc4XHU2NGM3XHU1ZmZkXHU3NTY1XHU5MDE5XHU0ZTliXHU1NTRmXHU5ODRjXHVmZjBjXHU0ZTI2XHU3ZTdjXHU3ZThjXHU5MDMyXHU4ODRjXHUzMDAyDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX2NoZWNraW5nPVx1NmI2M1x1NTcyOFx1NmFhMlx1NjdlNVx1OTE0ZFx1N2Y2ZVx1ZmYwY1x1OGFjYlx1N2EwZFx1NTAxOS4uLg0KLUV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9XHU5MDc4XHU2NGM3XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Jyb3dzZT1cdTcwMGZcdTg5YmQuLi4NCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGVmYXVsdF9kaXI9XHU0ZjdmXHU3NTI4XHU5ODEwXHU4YTJkXHU3NmVlXHU5MzA0DQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMD1cdTZiNjNcdTU3MjhcdTUzMmZcdTUxZmFcdTkxNGRcdTdmNmUuLi4NCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cyPUlVUEUwMDAyRTogXHU1MzJmXHU1MWZhXHU1OTMxXHU2NTU3XHVmZjFhXHU4ZjA5XHU1MTY1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0DQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHND1JVVBFMDAwM0U6IFx1NTMyZlx1NTFmYVx1NTkzMVx1NjU1N1x1ZmYxYVx1ODkwN1x1ODhmZFx1N2EwYlx1NWYwZlx1NWVhYlx1NjY0Mlx1NzY3Y1x1NzUxZlx1OTMyZlx1OGFhNA0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzE9SVVQRTAwMDRFOiBcdTUzMmZcdTUxZmFcdTU5MzFcdTY1NTdcdWZmMWFcdTVlZmFcdTdhY2JcdTdhMGJcdTVmMGZcdTVlYWJcdTkxNGRcdTdmNmVcdTkwOGFcdTc1NGNcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTQNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c5PUlVUEUwMDA1RTogXHU1MzJmXHU1MWZhXHU1OTMxXHU2NTU3XHVmZjFhXHU1MTMyXHU1YjU4XHU3YTBiXHU1ZjBmXHU1ZWFiXHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0DQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX25hbWU9XHU1NDBkXHU3YTMxXHVmZjFhDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Rpcj1cdTc2ZWVcdTkzMDRcdWZmMWENCi1FeHBvcnRQbHVnaW5XaXphcmRfZXJyb3I9XHU5MzJmXHU4YWE0DQotRGVzdGluYXRpb25Db21tb25QYWdlX3RpdGxlPVx1OTgxMFx1OGEyZFx1NmExOVx1OTg0Yw0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9kZXNjPVx1OTgxMFx1OGEyZFx1OGFhYVx1NjYwZVx1ZmYxYQ0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMD1cdTZiNjNcdTU3MjhcdTUzMmZcdTUxZmFcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGYuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzE9XHU2YjYzXHU1NzI4XHU1ZWZhXHU3YWNiXHU1MzJmXHU1MWZhXHU3NmVlXHU5MzA0Li4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cyPVx1NmI2M1x1NTcyOFx1ODkwN1x1ODhmZFx1NmE5NFx1Njg0OC4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMz1cdTZiNjNcdTU3MjhcdTc1MjJcdTc1MWZcdTdhMGJcdTVmMGZcdTVlYWJcdTU0OGNcdThjYzdcdTZlOTBcdTZhOTQuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzQ9XHU1MzJmXHU1MWZhXHU1YjhjXHU2MjEwXHUzMDAyDQotU2F2ZUxpYnJhcnlQYWdlX3RpdGxlPVx1NTMyZlx1NTFmYVx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZg0KLVNhdmVQbHVnaW5QYWdlX2xhYmVsX25hbWU9XHU1MzJmXHU1MWZhXHU1NDBkXHU3YTMxXHVmZjFhDQotU2F2ZUxpYnJhcnlQYWdlX2Rlc2M9XHU1MzJmXHU1MWZhXHU5MDc4XHU1M2Q2XHU3Njg0XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHU1M2NhXHU3NmY4XHU5NWRjXHU3Njg0XHU5MTRkXHU3ZjZlDQotRXhwb3J0UGx1Z2luV2l6YXJkX01TRzE9XHU2YjYzXHU1NzI4XHU1MjA2XHU2NzkwXHU3YTBiXHU1ZjBmXHU1ZWFiXHU5MTRkXHU3ZjZlLi4uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMi8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDIvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MWU3ZTZiLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZhZWMxMDAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIEV4cG9ydCAoTkwyKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQ7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjU0ZmNhNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX3J1LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMi9wbHVnaW5fcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODY4NDgwYi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBQZXJzcGVjdGl2ZQ0KLXBhY2thZ2luZ1BlcnNwZWN0aXZlTmFtZT1cdTA0MWZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDJcdTA0NGINCi0NCi0jIENhdGVnb3J5DQotcGFja2FnaW5nQ2F0ZWdvcnlOYW1lPVx1MDQxZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0Mlx1MDQ0Yg0KLQ0KLSMgVmlld3MNCi1wYWNrYWdpbmdWaWV3TmFtZT1cdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2ZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzINCi1wYWNrYWdpbmdNZXNzYWdlVmlld05hbWU9XHUwNDIxXHUwNDNlXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZSBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDNmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyXHUwNDMwIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOA0KLQ0KLSMgQWN0aW9uIFNldA0KLXBhY2thZ2luZ0FjdGlvblNldD1cdTA0MWZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDJcdTA0NGINCi0NCi0jIEFjdGlvbnMNCi1uZXdDb25maWdBY3Rpb249Jlx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0Zg0KLW5ld0NvbmZpZ0FjdGlvblRvb2x0aXA9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzgNCi1vcGVuQ29uZmlnQWN0aW9uPSZcdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYNCi1vcGVuQ29uZmlnQWN0aW9uVG9vbHRpcD1cdTA0MWVcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOA0KLQ0KLSMgRXhwb3J0IFdpemFyZCBDYXRlZ29yeQ0KLWV4cG9ydENhdGVnb3J5TmFtZT1cdTA0MWNcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzQNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lPVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzgNCi1leHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbj1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOC4NCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9XHUwNDFjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLWV4cG9ydE1ldGhvZFBsdWdpbnM9XHUwNDJkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzZCBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDNkXHUwNDM1XHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDNlIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzNVx1MDQzOSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1ZjMxMmEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMDAwRSAtIElVUEUwMDk5RQ0KLSMNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotZXhwb3J0Q29uZmlnV2l6YXJkX3RpdGxlPVx1MDQyZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4DQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfdGl0bGU9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0Mlx1MDQzOFx1MDQzZiBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzANCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDJcdTA0MzhcdTA0M2YgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwLg0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ0xhYmVsX3RleHQ9XHUwNDJkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAgXHUwNDM4IFx1MDQzMlx1MDQ0MVx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnU3BlY3NMYWJlbF90ZXh0PVx1MDQyZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2VcdTA0MzRcdTA0MzhcdTA0M2QgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQzZFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQzZSBcdTA0NDFcdTA0M2ZcdTA0MzVcdTA0NDZcdTA0MzhcdTA0NDRcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLXNlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1zZWxlY3RDb25maWdQYWdlX2Rlc2M9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzMC4gXHUwNDExXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQ0YiBcdTA0NDJcdTA0MzBcdTA0M2FcdTA0MzZcdTA0MzUgXHUwNDMyXHUwNDQxXHUwNDM1IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAsIFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0MzIgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOC4NCi1zZWxlY3RDb25maWdQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzA6DQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX3RpdGxlPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0M2ZcdTA0MzVcdTA0NDZcdTA0MzhcdTA0NDRcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5DQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2Rlc2M9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzY1x1MDQ0Ylx1MDQzNSBcdTA0NDFcdTA0M2ZcdTA0MzVcdTA0NDZcdTA0MzhcdTA0NDRcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMC4NCi1zZWxlY3RDb25maWdTcGVjc1BhZ2VfY29uZmlnc0xhYmVsX3RleHQ9XHUwNDFhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMDoNCi1jaGVja0NvbmZpZ1BhZ2VfdGl0bGU9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDQyXHUwNDRjIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzOCBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1jaGVja0NvbmZpZ1BhZ2VfZGVzYz1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M2RcdTA0MzAgXHUwNDQxXHUwNDNlXHUwNDMzXHUwNDNiXHUwNDMwXHUwNDQxXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwLiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDNlXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZVx1MDQzMSBcdTA0M2VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzBcdTA0NDUgXHUwNDM4IFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQ0Y1x1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0NDUuDQotc2VsZWN0RGVzdGluYXRpb25QYWdlX3RpdGxlPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzMgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzMA0KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDZcdTA0MzVcdTA0M2JcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOC4NCi0NCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotZXhwb3J0UGx1Z2luc1dpemFyZF90aXRsZT1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLXNlbGVjdFBsdWdpbnNQYWdlX3RpdGxlPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotc2VsZWN0UGx1Z2luc1BhZ2VfZGVzYz1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwLg0KLXNlbGVjdFBsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0PVx1MDQxY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzI6DQotcmV2aWV3UGx1Z2luc1BhZ2VfdGl0bGU9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwIFx1MDQzN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzOQ0KLXJldmlld1BsdWdpbnNQYWdlX2Rlc2M9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQ0YyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzMCBcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDM3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5LiBcdTA0MWRcdTA0MzBcdTA0MzZcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDFkXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDM0IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0M2VcdTA0NDBcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNjXHUwNDRiXHUwNDQ1IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzNVx1MDQzOSwgXHUwNDM1XHUwNDQxXHUwNDNiXHUwNDM4IFx1MDQzOFx1MDQ0NSBcdTA0NDJcdTA0MzBcdTA0M2FcdTA0MzZcdTA0MzUgXHUwNDNkXHUwNDQzXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0Yy4NCi1yZXZpZXdQbHVnaW5zUGFnZV9wbHVnaW5zTGFiZWxfdGV4dD1cdTA0MWNcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyOg0KLXJldmlld1BsdWdpbnNQYWdlX2RlcGVuZGVudFBsdWdpbnNMYWJlbF90ZXh0PVx1MDQxN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQ0Ylx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyOg0KLXJldmlld1BsdWdpbnNQYWdlX2Fzc29jaWF0ZWRDb25maWdzTGFiZWxfdGV4dD1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMjoNCi1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV90aXRsZT1cdTA0MWZcdTA0M2VcdTA0MzRcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwDQotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfZGVzYz1cdTA0MWZcdTA0M2VcdTA0MzRcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDNlXHUwNDQwIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzNVx1MDQzOSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzMC4NCi1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9ub1BsdWdpbl90ZXh0PVx1MDQxZFx1MDQzNSBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0NGIgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4NCi1zcGVjaWZ5UGF0aFBhZ2VfdGl0bGU9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMyBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwDQotc3BlY2lmeVBhdGhQYWdlX2Rlc2M9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0Nlx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzOSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzMgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzY1x1MDQ0Ylx1MDQ0NSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzVcdTA0MzkgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotU2F2ZVBsdWdpblBhZ2VfZGVzYz1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzOCBcdTA0MzggXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzMiBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzLg0KLUV4cG9ydFBsdWdpbldpemFyZF90aXRsZT1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNjXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDMwIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzMCBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzVcdTA0MzkgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotRXhwb3J0UGx1Z2luRXJyb3JfbXNnPUlVUEUwMDAwRTogXHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzMA0KLQ0KLSMgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBFcnJvciBEaWFsb2cNCi1leHBvcnRDb25maWdFcnJvckRpYWxvZ190aXRsZT1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOA0KLWV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX21zZz1JVVBFMDAwMUU6IFx1MDQxZFx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyLg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1hbmFseXppbmdDb25maWdUYXNrX25hbWU9XHUwNDEwXHUwNDNkXHUwNDMwXHUwNDNiXHUwNDM4XHUwNDM3IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzguLi4NCi0NCi0jIFRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgaGF2ZSBub3QgYmVlbiByZXZpZXdlZC4NCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzA9XHUwNDJkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOC4uLg0KLUNvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2VfTVNHMT1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkLg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzE9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNhXHUwNDMwIFx1MDQ0MVx1MDQzZVx1MDQzM1x1MDQzYlx1MDQzMFx1MDQ0MVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Li4uXG4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8yPVx1MDQxZFx1MDQzNSBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzAgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMz1cdTA0MTIgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2RcdTA0MzVcdTA0NDIgXHUwNDNlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNlXHUwNDNhLlxuDQotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfND1cdTA0MTIgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCB7MH0gXHUwNDNlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNlXHUwNDNhLlxuXHUwNDE4XHUwNDQxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0ZFx1MDQ0Mlx1MDQzOCBcdTA0M2VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQzMiBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4LiBcblx1MDQxOFx1MDQ0NSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2UgXHUwNDQyXHUwNDMwXHUwNDNhXHUwNDM2XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzOFx1MDQzM1x1MDQzZFx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDNiXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDRjLg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9jaGVja2luZz1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M2FcdTA0MzAgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4LCBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzZcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzUuLi4NCi1FeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlX3RpdGxlPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Jyb3dzZT1cdTA0MWVcdTA0MzFcdTA0MzdcdTA0M2VcdTA0NDAuLi4NCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGVmYXVsdF9kaXI9XHUwNDE4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMyBcdTA0M2ZcdTA0M2UgXHUwNDQzXHUwNDNjXHUwNDNlXHUwNDNiXHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMD1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Li4uDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMj1JVVBFMDAwMkU6IFx1MDQyZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBcdTA0M2RcdTA0MzUgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkOiBcdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDNhXHUwNDM4IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOA0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzQ9SVVQRTAwMDNFOiBcdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgXHUwNDNkXHUwNDM1IFx1MDQzMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZDogXHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzYVx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzgNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cxPUlVUEUwMDA0RTogXHUwNDJkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyIFx1MDQzZFx1MDQzNSBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2Q6IFx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQyXHUwNDM1XHUwNDM5XHUwNDNkXHUwNDM1XHUwNDQwXHUwNDMwIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzgNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c5PUlVUEUwMDA1RTogXHUwNDJkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyIFx1MDQzZFx1MDQzNSBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2Q6IFx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzggXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM4IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOA0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9uYW1lPVx1MDQxOFx1MDQzY1x1MDQ0ZjoNCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGlyPVx1MDQxYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMzoNCi1FeHBvcnRQbHVnaW5XaXphcmRfZXJyb3I9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwDQotRGVzdGluYXRpb25Db21tb25QYWdlX3RpdGxlPVx1MDQxZFx1MDQzMFx1MDQzN1x1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0M2UgXHUwNDQzXHUwNDNjXHUwNDNlXHUwNDNiXHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlDQotRGVzdGluYXRpb25Db21tb25QYWdlX2Rlc2M9XHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQzZSBcdTA0NDNcdTA0M2NcdTA0M2VcdTA0M2JcdTA0NDdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGU6DQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cwPVx1MDQyZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzVcdTA0MzkuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzE9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzM1x1MDQzMCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwLi4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cyPVx1MDQxYVx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0M2VcdTA0MzIuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzM9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0MzggXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDMwIFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzZVx1MDQzMi4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHND1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkLg0KLVNhdmVMaWJyYXJ5UGFnZV90aXRsZT1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRjIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLVNhdmVQbHVnaW5QYWdlX2xhYmVsX25hbWU9XHUwNDE4XHUwNDNjXHUwNDRmIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzMDoNCi1TYXZlTGlicmFyeVBhZ2VfZGVzYz1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDM4IFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1FeHBvcnRQbHVnaW5XaXphcmRfTVNHMT1cdTA0MTBcdTA0M2RcdTA0MzBcdTA0M2JcdTA0MzhcdTA0MzcgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOC4uLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOTk4ZGIwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NWY5OGY3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgRXhwb3J0IChOTDJhKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyYS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDRlNjgyMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kYS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWQ1MjdjMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gZWtzcG9ydA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgUGVyc3BlY3RpdmUNCi1wYWNrYWdpbmdQZXJzcGVjdGl2ZU5hbWU9UGFrbmluZw0KLQ0KLSMgQ2F0ZWdvcnkNCi1wYWNrYWdpbmdDYXRlZ29yeU5hbWU9UGFrbmluZw0KLQ0KLSMgVmlld3MNCi1wYWNrYWdpbmdWaWV3TmFtZT1QYWtrZW1ldG9kZWJpYmxpb3Rlaw0KLXBhY2thZ2luZ01lc3NhZ2VWaWV3TmFtZT1CaWJsaW90ZWtzcGFra2VtZWRkZWxlbHNlDQotDQotIyBBY3Rpb24gU2V0DQotcGFja2FnaW5nQWN0aW9uU2V0PVBha25pbmcNCi0NCi0jIEFjdGlvbnMNCi1uZXdDb25maWdBY3Rpb249JktvbmZpZ3VyYXRpb24NCi1uZXdDb25maWdBY3Rpb25Ub29sdGlwPU9wcmV0IG55IGJpYmxpb3Rla3Nrb25maWd1cmF0aW9uDQotb3BlbkNvbmZpZ0FjdGlvbj0mS29uZmlndXJhdGlvbg0KLW9wZW5Db25maWdBY3Rpb25Ub29sdGlwPVx1MDBjNWJuIGVuIGVrc2lzdGVyZW5kZSBiaWJsaW90ZWtza29uZmlndXJhdGlvbg0KLQ0KLSMgRXhwb3J0IFdpemFyZCBDYXRlZ29yeQ0KLWV4cG9ydENhdGVnb3J5TmFtZT1NZXRvZGUNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lPUJpYmxpb3Rla3Nrb25maWd1cmF0aW9uDQotZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb249RWtzcG9ydFx1MDBlOXIgZW4gYmlibGlvdGVrc2tvbmZpZ3VyYXRpb24uDQotDQotIyBFeHBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZA0KLWV4cG9ydE1ldGhvZFBsdWdpbnNXaXphcmROYW1lPU1ldG9kZS1wbHVnaW5zDQotZXhwb3J0TWV0aG9kUGx1Z2lucz1Fa3Nwb3J0XHUwMGU5ciBlbiBlbGxlciBmbGVyZSBtZXRvZGUtcGx1Z2lucy4NCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXNfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDBlMTZmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQRTAwMDBFIC0gSVVQRTAwOTlFDQotIw0KLQ0KLSMgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1leHBvcnRDb25maWdXaXphcmRfdGl0bGU9RWtzcG9ydFx1MDBlOXIgYmlibGlvdGVrc2tvbmZpZ3VyYXRpb24NCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV90aXRsZT1WXHUwMGU2bGcgZWtzcG9ydHR5cGUNCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVZcdTAwZTZsZyBkZW4gdHlwZSBiaWJsaW90ZWtza29uZmlndXJhdGlvbiwgZGVyIHNrYWwgZWtzcG9ydGVyZXMuDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnTGFiZWxfdGV4dD1Fa3Nwb3J0XHUwMGU5ciBlbiBtZXRvZGVrb25maWd1cmF0aW9uIG9nIGFsbGUgZGVucyBtZXRvZGUtcGx1Z2lucw0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ1NwZWNzTGFiZWxfdGV4dD1Fa3Nwb3J0XHUwMGU5ciBlbiBlbGxlciBmbGVyZSBtZXRvZGVrb25maWd1cmF0aW9uc3NwZWNpZmlrYXRpb25lcg0KLXNlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9Vlx1MDBlNmxnIG1ldG9kZWtvbmZpZ3VyYXRpb24NCi1zZWxlY3RDb25maWdQYWdlX2Rlc2M9Vlx1MDBlNmxnIGVuIG1ldG9kZWtvbmZpZ3VyYXRpb24sIGRlciBza2FsIGVrc3BvcnRlcmVzLiBBbGxlIHJlZmVyZXJlZGUgbWV0b2RlLXBsdWdpbnMgaSBkZW4gdmFsZ3RlIGtvbmZpZ3VyYXRpb24gYmxpdmVyIGlua2x1ZGVyZXQgaSBla3Nwb3J0ZW4uDQotc2VsZWN0Q29uZmlnUGFnZV9jb25maWdzTGFiZWxfdGV4dD1NZXRvZGVrb25maWd1cmF0aW9uZXI6DQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX3RpdGxlPVZcdTAwZTZsZyBrb25maWd1cmF0aW9uc3NwZWNpZmlrYXRpb25lcg0KLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV9kZXNjPVZcdTAwZTZsZyBlbiBlbGxlciBmbGVyZSBtZXRvZGVrb25maWd1cmF0aW9uc3NwZWNpZmlrYXRpb25lciwgZGVyIHNrYWwgZWtzcG9ydGVyZXMuDQotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PU1ldG9kZWtvbmZpZ3VyYXRpb25lcjoNCi1jaGVja0NvbmZpZ1BhZ2VfdGl0bGU9R2VubmVtc2Uga29uZmlndXJhdGlvbnNmZWpsDQotY2hlY2tDb25maWdQYWdlX2Rlc2M9RGVyIGVyIHVkZlx1MDBmOHJ0IGludGVncml0ZXRza29udHJvbCBhZiBkZW4gdmFsZ3RlIG1ldG9kZWtvbmZpZ3VyYXRpb24uIEdlbm5lbXNlIGZlamxyYXBwb3J0ZW4sIG9nIGZvcmV0YWcgZGUgblx1MDBmOGR2ZW5kaWdlIHJldHRlbHNlci4NCi1zZWxlY3REZXN0aW5hdGlvblBhZ2VfdGl0bGU9QW5naXYgZWtzcG9ydGJpYmxpb3Rlaw0KLXNlbGVjdERlc3RpbmF0aW9uUGFnZV9kZXNjPUFuZ2l2IGV0IGRlc3RpbmF0aW9uc2JpYmxpb3RlayB0aWwgbGFncmluZyBhZiBkZW4gZWtzcG9ydGVyZWRlIGtvbmZpZ3VyYXRpb24uDQotDQotIyBFeHBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZA0KLWV4cG9ydFBsdWdpbnNXaXphcmRfdGl0bGU9RWtzcG9ydFx1MDBlOXIgbWV0b2RlLXBsdWdpbnMNCi1zZWxlY3RQbHVnaW5zUGFnZV90aXRsZT1WXHUwMGU2bGcgbWV0b2RlLXBsdWdpbnMNCi1zZWxlY3RQbHVnaW5zUGFnZV9kZXNjPVZcdTAwZTZsZyBlbiBlbGxlciBmbGVyZSBtZXRvZGUtcGx1Z2lucywgZGVyIHNrYWwgZWtzcG9ydGVyZXMuDQotc2VsZWN0UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQ9TWV0b2RlLXBsdWdpbnM6DQotcmV2aWV3UGx1Z2luc1BhZ2VfdGl0bGU9R2VubmVtc2UgYWZoXHUwMGU2bmdpZ2hlZGVyDQotcmV2aWV3UGx1Z2luc1BhZ2VfZGVzYz1WXHUwMGU2bGcgaHZlciBtZXRvZGUtcGx1Z2luIGZvciBhdCBnZW5uZW1zZSBkZW5zIGFmaFx1MDBlNm5naWdoZWRlci4gS2xpayBwXHUwMGU1IFRpbGJhZ2UgZm9yIGF0IHZcdTAwZTZsZ2UgZGUgYWZoXHUwMGU2bmdpZ2UgcGx1Z2lucywgaHZpcyBkZSBza2FsIGlua2x1ZGVyZXMgaSBla3Nwb3J0ZW4uDQotcmV2aWV3UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQ9TWV0b2RlLXBsdWdpbnM6DQotcmV2aWV3UGx1Z2luc1BhZ2VfZGVwZW5kZW50UGx1Z2luc0xhYmVsX3RleHQ9QWZoXHUwMGU2bmdpZ2UgbWV0b2RlLXBsdWdpbnM6DQotcmV2aWV3UGx1Z2luc1BhZ2VfYXNzb2NpYXRlZENvbmZpZ3NMYWJlbF90ZXh0PVRpbGtueXR0ZWRlIG1ldG9kZWtvbmZpZ3VyYXRpb25lcjoNCi1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV90aXRsZT1CZWtyXHUwMGU2ZnQgZWtzcG9ydA0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX2Rlc2M9QmVrclx1MDBlNmZ0IGRlIG1ldG9kZS1wbHVnaW5zLCBkZXIgdmlsIGJsaXZlIGVrc3BvcnRlcmV0Lg0KLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX25vUGx1Z2luX3RleHQ9RGVyIGVyIGlra2UgdmFsZ3QgZW4gbWV0b2RlLXBsdWdpbi4NCi1zcGVjaWZ5UGF0aFBhZ2VfdGl0bGU9QW5naXYgZWtzcG9ydGJpYmxpb3Rlaw0KLXNwZWNpZnlQYXRoUGFnZV9kZXNjPUFuZ2l2IGV0IGRlc3RpbmF0aW9uc2JpYmxpb3RlayB0aWwgbGFncmluZyBhZiBkZSBla3Nwb3J0ZXJlZGUgbWV0b2RlLXBsdWdpbnMuDQotU2F2ZVBsdWdpblBhZ2VfZGVzYz1Fa3Nwb3J0XHUwMGU5ciBkZSB2YWxndGUgcGx1Z2lucyBvZyBrb25maWd1cmF0aW9uZXIgdGlsIGRldCBhbmdpdm5lIGRlc3RpbmF0aW9uc2JpYmxpb3Rlay4NCi1FeHBvcnRQbHVnaW5XaXphcmRfdGl0bGU9RmVqbCBpIGd1aWRlbiBFa3Nwb3J0XHUwMGU5ciBtZXRvZGUtcGx1Z2luDQotRXhwb3J0UGx1Z2luRXJyb3JfbXNnPUlVUEUwMDAwRTogRGVyIGVyIG9wc3RcdTAwZTVldCBmZWpsIHVuZGVyIGVrc3BvcnQNCi0NCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nDQotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9RWtzcG9ydFx1MDBlOXIgYmlibGlvdGVrc2tvbmZpZ3VyYXRpb24NCi1leHBvcnRDb25maWdFcnJvckRpYWxvZ19tc2c9SVVQRTAwMDFFOiBFa3Nwb3J0ZW4ga2FuIGlra2UgZm9ydHNcdTAwZTZ0dGUuDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWFuYWx5emluZ0NvbmZpZ1Rhc2tfbmFtZT1BbmFseXNlcmVyIGJpYmxpb3Rla3Nrb25maWd1cmF0aW9uLi4uDQotDQotIyBUaGUgZm9sbG93aW5nIG1lc3NhZ2VzIGhhdmUgbm90IGJlZW4gcmV2aWV3ZWQuDQotQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cwPUVrc3BvcnRlcmVyIGtvbmZpZ3VyYXRpb24uLi4NCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzE9RWtzcG9ydCBlciB1ZGZcdTAwZjhydC4NCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8xPUtvbnRyb2xsZXJlciBkZW4gdmFsZ3RlIGtvbmZpZ3VyYXRpb25zIGludGVncml0ZXQuLi5cbg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzI9RGVyIGVyIGlra2UgdmFsZ3QgZW4ga29uZmlndXJhdGlvbi5cbg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzM9RGVyIGVyIGluZ2VuIHByb2JsZW1lciBpIGRlbiB2YWxndGUga29uZmlndXJhdGlvbi5cbg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzQ9RGVyIGVyIHswfSBwcm9ibGVtZXIgaSBkZW4gdmFsZ3RlIGtvbmZpZ3VyYXRpb24uIFxuRHUga2FuIFx1MDBlNWJuZSBrb25maWd1cmF0aW9uc2VkaXRvcmVuIG9nIHJldHRlIGZlamxlbmUuIFxuRHUga2FuIG9nc1x1MDBlNSB2XHUwMGU2bGdlIGF0IGlnbm9yZXJlIHByb2JsZW1lcm5lIG9nIGZvcnRzXHUwMGU2dHRlLg0KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9jaGVja2luZz1Lb250cm9sbGVyZXIga29uZmlndXJhdGlvbi4gVmVudC4uLg0KLUV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9Vlx1MDBlNmxnIG1ldG9kZWtvbmZpZ3VyYXRpb24NCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfYnJvd3NlPUdlbm5lbXNlLi4uDQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2RlZmF1bHRfZGlyPUJydWcgc3RhbmRhcmRiaWJsaW90ZWsNCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cwPUVrc3BvcnRlcmVyIGtvbmZpZ3VyYXRpb24uLi4NCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cyPUlVUEUwMDAyRTogRWtzcG9ydCBlciBpa2tlIHVkZlx1MDBmOHJ0LiBGZWpsIHVuZGVyIGluZGxcdTAwZTZzbmluZyBhZiBiaWJsaW90ZWsuDQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHND1JVVBFMDAwM0U6IEVrc3BvcnQgZXIgaWtrZSB1ZGZcdTAwZjhydC4gRmVqbCB1bmRlciBrb3BpZXJpbmcgYWYgYmlibGlvdGVrLg0KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzE9SVVQRTAwMDRFOiBFa3Nwb3J0IGVyIGlra2UgdWRmXHUwMGY4cnQuIEZlamwgdW5kZXIgbHVrbmluZyBhZiBiaWJsaW90ZWtza29uZmlndXJhdGlvbi4NCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c5PUlVUEUwMDA1RTogRWtzcG9ydCBlciBpa2tlIHVkZlx1MDBmOHJ0LiBGZWpsIHVuZGVyIGxhZ3JpbmcgYWYgYmlibGlvdGVrLg0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9uYW1lPU5hdm46DQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Rpcj1CaWJsaW90ZWs6DQotRXhwb3J0UGx1Z2luV2l6YXJkX2Vycm9yPUZlamwNCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfdGl0bGU9U3RhbmRhcmR0aXRlbA0KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9kZXNjPVN0YW5kYXJkYmVza3JpdmVsc2U6DQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cwPUVrc3BvcnRlcmVyIHBsdWdpbnMuLi4NCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzE9T3ByZXR0ZXIgZWtzcG9ydGJpYmxpb3Rlay4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMj1Lb3BpZXJlciBmaWxlci4uLg0KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMz1PcHJldHRlciBiaWJsaW90ZWsgb2cgcmVzc291cmNlZmlsLi4uDQotUGx1Z2luRXhwb3J0U2VydmljZV9NU0c0PUVrc3BvcnQgZXIgdWRmXHUwMGY4cnQuDQotU2F2ZUxpYnJhcnlQYWdlX3RpdGxlPUVrc3BvcnRcdTAwZTlyIG1ldG9kZS1wbHVnaW4NCi1TYXZlUGx1Z2luUGFnZV9sYWJlbF9uYW1lPUVrc3BvcnRuYXZuOg0KLVNhdmVMaWJyYXJ5UGFnZV9kZXNjPUVrc3BvcnRcdTAwZTlyIGRlIHZhbGd0ZSBtZXRvZGUtcGx1Z2lucyBvZyB0aWxrbnl0dGVkZSBrb25maWd1cmF0aW9uZXINCi1FeHBvcnRQbHVnaW5XaXphcmRfTVNHMT1BbmFseXNlcmVyIGJpYmxpb3Rla3Nrb25maWd1cmF0aW9uLi4uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRjYzkxZDAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMxYTY1MDkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBYTUwgRXhwb3J0IChOTDEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmU3YjAxMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZXMucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2ZyLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9qYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9DTi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RlLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9pdC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzQ5OWE3OC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIFBsdWctaW4gZlx1MDBmY3IgWE1MLUV4cG9ydA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgRXhwb3J0IFhNTCBXaXphcmQNCi1leHBvcnRYTUxXaXphcmROYW1lPVhNTA0KLWV4cG9ydFhNTFdpemFyZERlc2NyaXB0aW9uPUluaGFsdCBlaW5lciBNZXRob2RlbmJpYmxpb3RoZWsgaW4gZWluZSBYTUwtRGF0ZWkgZXhwb3J0aWVyZW4uDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmY3ODU1Mi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVBsdWctaW4gZGUgWE1MIGRlIGV4cG9ydGFjaVx1MDBmM24gZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBFeHBvcnQgWE1MIFdpemFyZA0KLWV4cG9ydFhNTFdpemFyZE5hbWU9WE1MDQotZXhwb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249RXhwb3J0YXIgY29udGVuaWRvIGRlIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGEgdW4gYXJjaGl2byBYTUwuDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGU2ZjI2Zi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVBsdWctaW4gWE1MIGQnZXhwb3J0YXRpb24gRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBFeHBvcnQgWE1MIFdpemFyZA0KLWV4cG9ydFhNTFdpemFyZE5hbWU9WE1MDQotZXhwb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249RXhwb3J0ZXogbGUgY29udGVudSBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIHZlcnMgdW4gZmljaGllciBYTUwuDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5faXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGFkNTFiOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5faXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVBsdWctaW4gWE1MIGRpIGVzcG9ydGF6aW9uZSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIEV4cG9ydCBYTUwgV2l6YXJkDQotZXhwb3J0WE1MV2l6YXJkTmFtZT1YTUwNCi1leHBvcnRYTUxXaXphcmREZXNjcmlwdGlvbj1Fc3BvcnRhIGlsIGNvbnRlbnV0byBkZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIHN1IHVuIGZpbGUgWE1MLg0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI4N2JiOWMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgRXhwb3J0IFhNTCBQbHVnLWluDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBFeHBvcnQgWE1MIFdpemFyZA0KLWV4cG9ydFhNTFdpemFyZE5hbWU9WE1MDQotZXhwb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMDkyIFhNTCBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmJcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYjlmZTU1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFhNTCBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzAgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBFeHBvcnQgWE1MIFdpemFyZA0KLWV4cG9ydFhNTFdpemFyZE5hbWU9WE1MDQotZXhwb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWNlZThcdWQxNTBcdWNlMjBcdWI5N2MgWE1MIFx1ZDMwY1x1Yzc3Y1x1Yjg1YyBcdWIwYjRcdWJjZjRcdWIwYzVcdWIyYzhcdWIyZTQuDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzQ5ZTY2MC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVBsdWctaW4gWE1MIGRlIEV4cG9ydGFcdTAwZTdcdTAwZTNvIGRvIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgRXhwb3J0IFhNTCBXaXphcmQNCi1leHBvcnRYTUxXaXphcmROYW1lPVhNTA0KLWV4cG9ydFhNTFdpemFyZERlc2NyaXB0aW9uPUV4cG9ydGUgbyBjb250ZVx1MDBmYWRvIGRhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG8gcGFyYSB1bSBhcnF1aXZvIFhNTC4NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYWNmNzliLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFx1NWJmY1x1NTFmYSBYTUwgXHU2M2QyXHU0ZWY2DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBFeHBvcnQgWE1MIFdpemFyZA0KLWV4cG9ydFhNTFdpemFyZE5hbWU9WE1MDQotZXhwb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249XHU1YzA2XHU2NWI5XHU2Y2Q1XHU1ZTkzXHU1MTg1XHU1YmI5XHU1YmZjXHU1MWZhXHU1MjMwIFhNTCBcdTY1ODdcdTRlZjZcdTMwMDINCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyOGVkYTEyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIEV4cG9ydCBYTUwgUGx1Zy1pbg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgRXhwb3J0IFhNTCBXaXphcmQNCi1leHBvcnRYTUxXaXphcmROYW1lPVhNTA0KLWV4cG9ydFhNTFdpemFyZERlc2NyaXB0aW9uPVx1NWMwN1x1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NzY4NFx1NTE2N1x1NWJiOVx1NTMyZlx1NTFmYVx1NTIzMCBYTUwgXHU2YTk0XHUzMDAyDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNTRiMDEyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6DQotIw0KLQ0KLSMgRXhwb3J0IFhNTCBXaXphcmQNCi1leHBvcnRYTUxXaXphcmRfdGl0bGU9WE1MIGV4cG9ydGllcmVuDQotDQotIyBTZWxlY3QgRXhwb3J0IFR5cGUgV2l6YXJkIFBhZ2UNCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVdcdTAwZTRobGVuIFNpZSBkZW4gVHlwIGRlcyB6dSBleHBvcnRpZXJlbmRlbiBNZXRob2RlbmJpYmxpb3RoZWtzaW5oYWx0cyBhdXMuDQotZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uX3RleHQ9R2VzYW10ZSBNZXRob2RlbmJpYmxpb3RoZWsgZXhwb3J0aWVyZW4NCi1leHBvcnRQbHVnaW5zUmFkaW9CdXR0b25fdGV4dD1NZXRob2Rlbi1QbHVnLWlucyBleHBvcnRpZXJlbg0KLWV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbl90ZXh0PU1ldGhvZGVua29uZmlndXJhdGlvbiBleHBvcnRpZXJlbg0KLQ0KLSMgU2VsZWN0IERlc3RpbmF0aW9uIFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9RXhwb3J0ZGF0ZWkgYW5nZWJlbg0KLXNlbGVjdFhNTEZpbGVQYWdlX2Rlc2M9R2ViZW4gU2llIGVpbmUgWE1MLVppZWxkYXRlaSBhbiwgaW4gZGVyIGRlciBleHBvcnRpZXJ0ZSBNZXRob2RlbmJpYmxpb3RoZWtzaW5oYWx0IGdlc3BlaWNoZXJ0IHdlcmRlbiBzb2xsLg0KLWZpbGVMYWJlbF90ZXh0PVhNTC1EYXRlaToNCi1icm93c2VCdXR0b25fdGV4dD1EdXJjaHN1Y2hlbi4uLg0KLQ0KLSMgT3ZlcndyaXRlIENvbmZpcm1hdGlvbiBEaWFsb2cNCi1vdmVyd3JpdGVUZXh0X21zZz0nJ3swfScnIGlzdCBiZXJlaXRzIHZvcmhhbmRlbi5cbk1cdTAwZjZjaHRlbiBTaWUgZGllc2UgRGF0ZWkgXHUwMGZjYmVyc2NocmVpYmVuPw0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1leHBvcnRpbmdYTUxfdGV4dD1JbmhhbHQgZWluZXIgTWV0aG9kZW5iaWJsaW90aGVrIGluIGVpbmUgWE1MLURhdGVpIGV4cG9ydGllcmVuLi4uDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWludmFsaWRYTUxGaWxlX2Vycm9yPURpZSBhbmdlZ2ViZW5lIFhNTC1EYXRlaSBpc3QgbmljaHQgZ1x1MDBmY2x0aWcuDQotZXhwb3J0WE1MV2l6YXJkX2Vycm9yPUlVUE0wMDAwRTogRXhwb3J0IGZlaGxnZXNjaGxhZ2VuOiB7MH0NCi1leHBvcnRYTUxXaXphcmRfcmV2aWV3TG9nPURlciBFeHBvcnQgaXN0IGFiZ2VzY2hsb3NzZW4uIFNlaGVuIFNpZSBzaWNoIGRpZSBQcm90b2tvbGxkYXRlaWVuIGltIEV4cG9ydHZlcnplaWNobmlzIGFuLg0KLWV4cG9ydFhNTFNlcnZpY2VfZXJyb3I9RmVobGVyIGJlaW0gRXhwb3J0aWVyZW4gZGVyIEJpYmxpb3RoZWs6IHswfQ0KLWV4cG9ydFhNTFNlcnZpY2VfZmVhdHVyZV9lcnJvcj1GZWhsZXIgYmVpbSBTZXR6ZW4gZGVzIEZlYXR1cmUtV2VydHM6OiBFbGVtZW50PXswfSwgRmVhdHVyZT17MX0NCi14bWxMaWJyYXJ5X2Vycm9yX2xvYWRfeG1sPURpZSBYTUwtUXVlbGxlICcnezB9Jycga2FubiBuaWNodCBnZWxhZGVuIHdlcmRlbi4NCi14bWxMaWJyYXJ5X25vX3BsdWdpbj1FcyBpc3Qga2VpbiBNZXRob2Rlbi1QbHVnLWluIGZcdTAwZmNyIElEIHswfSB2b3JoYW5kZW4uDQoteG1sTGlicmFyeV9ub19mZWF0dXJlPURhcyBYTUwtRmVhdHVyZSBmXHUwMGZjciB7MH1fezF9IGthbm4gbmljaHQgYWJnZXJ1ZmVuIHdlcmRlbi4NCi14bWxMaWJyYXJ5X25vX2NsYXNzPURpZSBFQ2xhc3MgZlx1MDBmY3IgezB9IGthbm4gbmljaHQgYWJnZXJ1ZmVuIHdlcmRlbi4NCi14bWxMaWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50PUZlaGxlciBiZWltIEVyc3RlbGxlbiBkZXMgRWxlbWVudHMuIEVzIGthbm4gbmljaHQgYmVzdGltbXQgd2VyZGVuLCB3aWUgZGVyIFdlcnQgZlx1MDBmY3IgZGFzIEZlYXR1cmUgezB9IGdlc2V0enQgd2lyZC4NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZT1GZWhsZXIgYmVpbSBFcnN0ZWxsZW4gZGVzIEVsZW1lbnRzLiBEZXIgV2VydCB7MH0ga2FubiBuaWNodCBhdWYgZGVuIENvbnRhaW5lciB7MX0gZ2VzZXR6dCB3ZXJkZW4uDQoteG1sTGlicmFyeV9pbnZhbGlkX2ZlYXR1cmVfdmFsdWU9VW5nXHUwMGZjbHRpZ2VyIEF0dHJpYnV0LUZlYXR1cmUtV2VydCBmXHUwMGZjciBGZWF0dXJlIHswfSBtaXQgZGVtIFdlcnQgezF9DQoteG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMj1GZWhsZXIgYmVpbSBTZXR6ZW4gZGVzIEF0dHJpYnV0cy4gRGVyIFdlcnQgZlx1MDBmY3IgRmVhdHVyZSB7MH0sIE9iamVrdCB7MX0sIFdlcnQgezJ9IGthbm4gbmljaHQgZ2VzZXR6dCB3ZXJkZW4uDQoteG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMz1FcyBrYW5uIG5pY2h0IGJlc3RpbW10IHdlcmRlbiwgd2llIGRlciBXZXJ0IGZcdTAwZmNyIEZlYXR1cmUgezB9LCBPYmpla3QgezF9LCBXZXJ0IHsyfSBnZXNldHp0IHdpcmQuDQoteG1sTGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlPUZlaGxlciBiZWltIERlZmluaWVyZW4gZGVyIFJlZmVyZW56LiBEZXIgV2VydCBmXHUwMGZjciBGZWF0dXJlIHswfSwgT2JqZWt0IHsxfSwgV2VydCB7Mn0ga2FubiBuaWNodCBnZXNldHp0IHdlcmRlbi4NCi14bWxMaWJyYXJ5X2Vycm9yX3Byb2Nlc3Nfd3JvbmdfY29udGFpbmVyPURlciBQcm96ZXNzICcnezB9JycgaGF0IGtlaW5lbiBnXHUwMGZjbHRpZ2VuIENvbnRhaW5lci4gRGVyIENvbnRhaW5lciBoYXQgZGVuIFR5cCAnJ3sxfScnIHVuZCBpc3QgZGFtaXQga2VpbiBQcm96ZXNzcGFrZXQuDQoteG1sTGlicmFyeV9uZXdfaWQ9RGVtIEVsZW1lbnQgezB9IHd1cmRlIGRpZSBuZXVlIElEIHsxfSB6dWdlb3JkbmV0LCB3ZWlsIGVzIGtlaW5lIGdcdTAwZmNsdGlnZSBJRCBoYXR0ZS4NCi14bWxMaWJyYXJ5X2lkX25vdF91bmlxdWU9RGllIEVsZW1lbnQtSUQgJyd7MH0nJyB3aXJkIHZvbiBtZWhyZXJlbiBFbGVtZW50ZW4gdmVyd2VuZGV0Lg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXNfZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGQyZDg0OS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOg0KLSMNCi0NCi0jIEV4cG9ydCBYTUwgV2l6YXJkDQotZXhwb3J0WE1MV2l6YXJkX3RpdGxlPUV4cG9ydGFyIFhNTA0KLQ0KLSMgU2VsZWN0IEV4cG9ydCBUeXBlIFdpemFyZCBQYWdlDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYz1TZWxlY2Npb25lIGVsIHRpcG8gZGUgY29udGVuaWRvIGRlIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIHBhcmEgZXhwb3J0YXIuDQotZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uX3RleHQ9RXhwb3J0YXIgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZW50ZXJhDQotZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uX3RleHQ9RXhwb3J0YXIgdW5vIG8gbVx1MDBlMXMgcGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8NCi1leHBvcnRDb25maWdzUmFkaW9CdXR0b25fdGV4dD1FeHBvcnRhciB1bmEgY29uZmlndXJhY2lcdTAwZjNuIGRlIG1cdTAwZTl0b2RvDQotDQotIyBTZWxlY3QgRGVzdGluYXRpb24gWE1MIEZpbGUgV2l6YXJkIFBhZ2UNCi1zZWxlY3RYTUxGaWxlUGFnZV90aXRsZT1Fc3BlY2lmaWNhciBhcmNoaXZvIGRlIGV4cG9ydGFjaVx1MDBmM24NCi1zZWxlY3RYTUxGaWxlUGFnZV9kZXNjPUVzcGVjaWZpcXVlIHVuIGFyY2hpdm8gWE1MIGRlIGRlc3Rpbm8gcGFyYSBhbG1hY2VuYXIgZWwgY29udGVuaWRvIGRlIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGV4cG9ydGFkYS4NCi1maWxlTGFiZWxfdGV4dD1BcmNoaXZvIFhNTDoNCi1icm93c2VCdXR0b25fdGV4dD1FeGFtaW5hci4uLg0KLQ0KLSMgT3ZlcndyaXRlIENvbmZpcm1hdGlvbiBEaWFsb2cNCi1vdmVyd3JpdGVUZXh0X21zZz0nJ3swfScnIHlhIGV4aXN0ZS5cblx1MDBiZkRlc2VhIHNvYnJlc2NyaWJpcmxvPw0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1leHBvcnRpbmdYTUxfdGV4dD1FeHBvcnRhbmRvIGNvbnRlbmlkbyBkZSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBhIGFyY2hpdm8gWE1MLi4uDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWludmFsaWRYTUxGaWxlX2Vycm9yPUVsIGFyY2hpdm8gWE1MIGVzcGVjaWZpY2FkbyBubyBlcyB2XHUwMGUxbGlkby4NCi1leHBvcnRYTUxXaXphcmRfZXJyb3I9SVVQTTAwMDBFOiBMYSBleHBvcnRhY2lcdTAwZjNuIGhhIGZhbGxhZG86IHswfQ0KLWV4cG9ydFhNTFdpemFyZF9yZXZpZXdMb2c9TGEgZXhwb3J0YWNpXHUwMGYzbiBoYSBjb25jbHVpZG8uIFJldmlzZSBsb3MgYXJjaGl2b3MgZGUgcmVnaXN0cm8gYmFqbyBlbCBkaXJlY3RvcmlvIGRlIGV4cG9ydGFjaVx1MDBmM24uDQotZXhwb3J0WE1MU2VydmljZV9lcnJvcj1FcnJvciBhbCBleHBvcnRhciBsYSBiaWJsaW90ZWNhOiB7MH0NCi1leHBvcnRYTUxTZXJ2aWNlX2ZlYXR1cmVfZXJyb3I9RXJyb3IgYWwgZXN0YWJsZWNlciBlbCB2YWxvciBkZSBsYSBjYXJhY3Rlclx1MDBlZHN0aWNhOiBFbGVtZW50bz17MH0sIGNhcmFjdGVyXHUwMGVkc3RpY2E9ezF9DQoteG1sTGlicmFyeV9lcnJvcl9sb2FkX3htbD1ObyBzZSBoYSBwb2RpZG8gY2FyZ2FyIGVsIGFyY2hpdm8gZnVlbnRlIFhNTCAnJ3swfScnDQoteG1sTGlicmFyeV9ub19wbHVnaW49Tm8gaGF5IG5pbmdcdTAwZmFuIE1ldGhvZFBsdWdpbiBwYXJhIGVsIElEIHswfQ0KLXhtbExpYnJhcnlfbm9fZmVhdHVyZT1ObyBzZSBoYSBwb2RpZG8gb2J0ZW5lciBsYSBjYXJhY3Rlclx1MDBlZHN0aWNhIFhtbCBwYXJhIHswfV97MX0NCi14bWxMaWJyYXJ5X25vX2NsYXNzPU5vIHNlIGhhIHBvZGlkbyBvYnRlbmVyIEVDbGFzcyBwYXJhIHswfQ0KLXhtbExpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9RXJyb3IgYWwgY3JlYXIgZWxlbWVudG8sIG5vIHNlIHNhYmUgY1x1MDBmM21vIGVzdGFibGVjZXIgZWwgdmFsb3IgcGFyYSBsYSBjYXJhY3Rlclx1MDBlZHN0aWNhIHswfQ0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlPUVycm9yIGFsIGNyZWFyIGVsZW1lbnRvLCBubyBzZSBwdWVkZSBlc3RhYmxlY2VyIGVsIHZhbG9yIHswfSBlbiBlbCBjb250ZW5lZG9yIHsxfQ0KLXhtbExpYnJhcnlfaW52YWxpZF9mZWF0dXJlX3ZhbHVlPVZhbG9yIGRlIGNhcmFjdGVyXHUwMGVkc3RpY2EgZGUgYXRyaWJ1dG8gbm8gdlx1MDBlMWxpZG8gcGFyYSBsYSBjYXJhY3Rlclx1MDBlZHN0aWNhIHswfSwgY29uIGVsIHZhbG9yIHsxfQ0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzI9RXJyb3IgYWwgZXN0YWJsZWNlciBhdHJpYnV0bywgbm8gc2UgcHVlZGUgZXN0YWJsZWNlciBlbCB2YWxvciBwYXJhIGxhIGNhcmFjdGVyXHUwMGVkc3RpY2E9ezB9LCBvYmpldG89ezF9LCB2YWxvcj17Mn0NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8zPU5vIHNlIHNhYmUgY1x1MDBmM21vIGVzdGFibGVjZXIgZWwgdmFsb3IgcGFyYSBsYSBjYXJhY3Rlclx1MDBlZHN0aWNhPXswfSwgb2JqZXRvPXsxfSwgdmFsb3I9ezJ9DQoteG1sTGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlPUVycm9yIGFsIGVzdGFibGVjZXIgcmVmZXJlbmNpYSwgbm8gc2UgcHVlZGUgZXN0YWJsZWNlciBlbCB2YWxvciBwYXJhIGxhIGNhcmFjdGVyXHUwMGVkc3RpY2E9ezB9LCBvYmpldG89ezF9LCB2YWxvcj17Mn0NCi14bWxMaWJyYXJ5X2Vycm9yX3Byb2Nlc3Nfd3JvbmdfY29udGFpbmVyPUVsIHByb2Nlc28gJyd7MH0nJyBubyB0aWVuZSB1biBjb250ZW5lZG9yIHZcdTAwZTFsaWRvLiBFbCBjb250ZW5lZG9yIGVzIGRlbCB0aXBvICcnezF9JycsIHF1ZSBubyBlcyB1biBQcm9jZXNzcGFja2FnZQ0KLXhtbExpYnJhcnlfbmV3X2lkPUVsIGVsZW1lbnRvIHswfSBzZSBoYSBhc2lnbmFkbyBjb24gdW4gSUQgbnVldm8gezF9IHBvcnF1ZSBubyB0aWVuZSB1bm8gdlx1MDBlMWxpZG8NCi14bWxMaWJyYXJ5X2lkX25vdF91bmlxdWU9TVx1MDBlMXMgZGUgdW4gZWxlbWVudG8gdXRpbGl6YSBlbCBJRCBkZSBlbGVtZW50byAnJ3swfScnDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZWVmMWUwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6DQotIw0KLQ0KLSMgRXhwb3J0IFhNTCBXaXphcmQNCi1leHBvcnRYTUxXaXphcmRfdGl0bGU9RXhwb3J0ZXIgZW4gbGFuZ2FnZSBYTUwNCi0NCi0jIFNlbGVjdCBFeHBvcnQgVHlwZSBXaXphcmQgUGFnZQ0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2Rlc2M9U1x1MDBlOWxlY3Rpb25uZXogbGUgdHlwZSBkZSBjb250ZW51IGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgXHUwMGUwIGV4cG9ydGVyLg0KLWV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbl90ZXh0PUV4cG9ydGVyIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZW50aVx1MDBlOHJlDQotZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uX3RleHQ9RXhwb3J0ZXIgdW4gb3UgcGx1c2lldXJzIHBsdWctaW5zIGRlIG1cdTAwZTl0aG9kZQ0KLWV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbl90ZXh0PUV4cG9ydGVyIHVuZSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLQ0KLSMgU2VsZWN0IERlc3RpbmF0aW9uIFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9U3BcdTAwZTljaWZpZXIgdW4gZmljaGllciBkJ2V4cG9ydGF0aW9uDQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1TcFx1MDBlOWNpZmlleiB1biBmaWNoaWVyIFhNTCBkZSBkZXN0aW5hdGlvbiBwb3VyIHN0b2NrZXIgbGUgY29udGVudSBleHBvcnRcdTAwZTkgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcy4NCi1maWxlTGFiZWxfdGV4dD1GaWNoaWVyIFhNTCA6DQotYnJvd3NlQnV0dG9uX3RleHQ9UGFyY291cmlyLi4uDQotDQotIyBPdmVyd3JpdGUgQ29uZmlybWF0aW9uIERpYWxvZw0KLW92ZXJ3cml0ZVRleHRfbXNnPScnezB9JycgZXhpc3RlIGRcdTAwZTlqXHUwMGUwLlxuVm91bGV6LXZvdXMgbCcnXHUwMGU5Y3Jhc2VyID8NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotZXhwb3J0aW5nWE1MX3RleHQ9RXhwb3J0YXRpb24gZHUgY29udGVudSBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIGRhbnMgbGUgZmljaGllciBYTUwuLi4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZFhNTEZpbGVfZXJyb3I9TGUgZmljaGllciBYTUwgc3BcdTAwZTljaWZpXHUwMGU5IGVzdCBub24gdmFsaWRlLg0KLWV4cG9ydFhNTFdpemFyZF9lcnJvcj1JVVBNMDAwMEUgOiBFY2hlYyBkZSBsJydleHBvcnRhdGlvbiA6IHswfQ0KLWV4cG9ydFhNTFdpemFyZF9yZXZpZXdMb2c9RXhwb3J0YXRpb24gdGVybWluXHUwMGU5ZS4gQ29uc3VsdGV6IGxlcyBmaWNoaWVycyBqb3VybmF1eCBkYW5zIGxlIHJcdTAwZTlwZXJ0b2lyZSBkJ2V4cG9ydGF0aW9uLg0KLWV4cG9ydFhNTFNlcnZpY2VfZXJyb3I9RXJyZXVyIGxvcnMgZGUgbCcnZXhwb3J0YXRpb24gZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgOiB7MH0NCi1leHBvcnRYTUxTZXJ2aWNlX2ZlYXR1cmVfZXJyb3I9RXJyZXVyIGxvcnMgZGUgbGEgZFx1MDBlOWZpbml0aW9uIGRlIGxhIHZhbGV1ciBkZSBsYSBmb25jdGlvbiA6IEVsZW1lbnQ9ezB9LCBmZWF0dXJlPXsxfQ0KLXhtbExpYnJhcnlfZXJyb3JfbG9hZF94bWw9SW1wb3NzaWJsZSBkZSBjaGFyZ2VyIGxhIHNvdXJjZSBYTUwgJyd7MH0nJw0KLXhtbExpYnJhcnlfbm9fcGx1Z2luPVBhcyBkZSBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZSBwb3VyIGwnJ2lkZW50aWZpY2F0ZXVyIHswfQ0KLXhtbExpYnJhcnlfbm9fZmVhdHVyZT1JbXBvc3NpYmxlIGQnJ29idGVuaXIgbGEgZm9uY3Rpb24gWE1MIHBvdXIgezB9X3sxfQ0KLXhtbExpYnJhcnlfbm9fY2xhc3M9SW1wb3NzaWJsZSBkJydvYnRlbmlyIEVDbGFzcyBwb3VyIHswfQ0KLXhtbExpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9RXJyZXVyIGxvcnMgZGUgbGEgY3JcdTAwZTlhdGlvbiBkJyd1biBcdTAwZTlsXHUwMGU5bWVudCwgSWdub3JlIGNvbW1lbnQgZFx1MDBlOWZpbmlyIGxhIHZhbGV1ciBkZSBsYSBmb25jdGlvbiB7MH0NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZT1FcnJldXIgbG9ycyBkZSBsYSBjclx1MDBlOWF0aW9uIGQnJ3VuIFx1MDBlOWxcdTAwZTltZW50LCBJbXBvc3NpYmxlIGRlIGRcdTAwZTlmaW5pciBsYSB2YWxldXIgezB9IHBvdXIgbGUgY29udGVuZXVyIHsxfQ0KLXhtbExpYnJhcnlfaW52YWxpZF9mZWF0dXJlX3ZhbHVlPVZhbGV1ciBkZSBsYSBmb25jdGlvbiBkJydhdHRyaWJ1dCBub24gdmFsaWRlIHBvdXIgbGEgZm9uY3Rpb24gezB9LCBhdmVjIGxhIHZhbGV1ciB7MX0NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8yPUVycmV1ciBsb3JzIGRlIGxhIGRcdTAwZTlmaW5pdGlvbiBkJyd1biBhdHRyaWJ1dCwgSW1wb3NzaWJsZSBkZSBkXHUwMGU5ZmluaXIgdW5lIHZhbGV1ciBwb3VyIGZlYXR1cmU9ezB9LCBvYmplY3Q9ezF9LCB2YWx1ZT17Mn0NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8zPUlnbm9yZSBjb21tZW50IGRcdTAwZTlmaW5pciB1bmUgdmFsZXVyIHBvdXIgZmVhdHVyZT17MH0sIG9iamVjdD17MX0sIHZhbHVlPXsyfQ0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZT1FcnJldXIgbG9ycyBkZSBsYSBkXHUwMGU5ZmluaXRpb24gZCcndW5lIHJcdTAwZTlmXHUwMGU5cmVuY2UsIEltcG9zc2libGUgZGUgZFx1MDBlOWZpbmlyIHVuZSB2YWxldXIgcG91ciBmZWF0dXJlPXswfSwgb2JqZWN0PXsxfSwgdmFsdWU9ezJ9DQoteG1sTGlicmFyeV9lcnJvcl9wcm9jZXNzX3dyb25nX2NvbnRhaW5lcj1MZSBwcm9jZXNzdXMgJyd7MH0nJyBuJydhIHBhcyBkZSBjb250ZW5ldXIgdmFsaWRlLiBMZSBjb250ZW5ldXIgZXN0IGRlIHR5cGUgJyd7MX0nJyBxdWkgbicnZXN0IHBhcyB1biBwYWNrYWdlIGRlIHByb2Nlc3N1cw0KLXhtbExpYnJhcnlfbmV3X2lkPUwnJ1x1MDBlOWxcdTAwZTltZW50IHswfSBlc3QgYWZmZWN0XHUwMGU5IFx1MDBlMCB1biBub3V2ZWwgaWRlbnRpZmljYXRldXIgezF9IGNhciBpbCBuZSBkaXNwb3NlIHBhcyBkJyd1biBpZGVudGlmaWNhdGV1ciB2YWxpZGUNCi14bWxMaWJyYXJ5X2lkX25vdF91bmlxdWU9TCcnaWRlbnRpZmljYXRldXIgZGUgbCcnXHUwMGU5bFx1MDBlOW1lbnQgJyd7MH0nJyBlc3QgdXRpbGlzXHUwMGU5IHBhciBwbHVzaWV1cnMgXHUwMGU5bFx1MDBlOW1lbnRzDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZDllZTI0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6DQotIw0KLQ0KLSMgRXhwb3J0IFhNTCBXaXphcmQNCi1leHBvcnRYTUxXaXphcmRfdGl0bGU9RXNwb3J0YSBYTUwNCi0NCi0jIFNlbGVjdCBFeHBvcnQgVHlwZSBXaXphcmQgUGFnZQ0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2Rlc2M9U2VsZXppb25hcmUgaWwgdGlwbyBkaSBjb250ZW51dG8gZGVsbGEgbGlicmVyaWEgZGVsIG1ldG9kbyBkYSBlc3BvcnRhcmUuDQotZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uX3RleHQ9RXNwb3J0YSBsJ2ludGVyYSBsaWJyZXJpYSBkZWwgbWV0b2RvDQotZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uX3RleHQ9RXNwb3J0YSB1bm8gbyBwaVx1MDBmOSBwbHVnLWluIGRlbCBtZXRvZG8NCi1leHBvcnRDb25maWdzUmFkaW9CdXR0b25fdGV4dD1Fc3BvcnRhIHVuYSBjb25maWd1cmF6aW9uZSBtZXRvZG8NCi0NCi0jIFNlbGVjdCBEZXN0aW5hdGlvbiBYTUwgRmlsZSBXaXphcmQgUGFnZQ0KLXNlbGVjdFhNTEZpbGVQYWdlX3RpdGxlPVNwZWNpZmljYSBpbCBmaWxlIGRpIGVzcG9ydGF6aW9uZQ0KLXNlbGVjdFhNTEZpbGVQYWdlX2Rlc2M9U3BlY2lmaWNhcmUgdW4gZmlsZSBkaSBkZXN0aW5hemlvbmUgWE1MIHBlciBtZW1vcml6emFyZSBpbCBjb250ZW51dG8gZGVsbGEgbGlicmVyaWEgZGVsIG1ldG9kbyBlc3BvcnRhdG8uDQotZmlsZUxhYmVsX3RleHQ9RmlsZSBYTUw6DQotYnJvd3NlQnV0dG9uX3RleHQ9U2ZvZ2xpYS4uLg0KLQ0KLSMgT3ZlcndyaXRlIENvbmZpcm1hdGlvbiBEaWFsb2cNCi1vdmVyd3JpdGVUZXh0X21zZz0nJ3swfScnIGVzaXN0ZSBnaVx1MDBlMC5cblNvdnJhc2NyaXZlcmxvPw0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1leHBvcnRpbmdYTUxfdGV4dD1Fc3BvcnRhemlvbmUgZGVsIGNvbnRlbnV0byBkZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIHN1IHVuIGZpbGUgWE1MIGluIGNvcnNvLi4uDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWludmFsaWRYTUxGaWxlX2Vycm9yPUlsIGZpbGUgWE1MIHNwZWNpZmljYXRvIG5vbiBcdTAwZTggdmFsaWRvLg0KLWV4cG9ydFhNTFdpemFyZF9lcnJvcj1JVVBNMDAwMEU6IEVzcG9ydGF6aW9uZSBub24gcml1c2NpdGE6IHswfQ0KLWV4cG9ydFhNTFdpemFyZF9yZXZpZXdMb2c9RXNwb3J0YXppb25lIGNvbXBsZXRhdGEuIFJpZXNhbWluYXJlIGkgZmlsZSBkaSBsb2cgbmVsbGEgZGlyZWN0b3J5IGRpIGVzcG9ydGF6aW9uZS4NCi1leHBvcnRYTUxTZXJ2aWNlX2Vycm9yPUVycm9yZSBkdXJhbnRlIGwnJ2VzcG9ydGF6aW9uZSBkZWxsYSBsaWJyZXJpYTogezB9DQotZXhwb3J0WE1MU2VydmljZV9mZWF0dXJlX2Vycm9yPUVycm9yZSBkdXJhbnRlIGwnJ2ltcG9zdGF6aW9uZSBkZWwgdmFsb3JlIGZ1bnppb25lOjogRWxlbWVudG89ezB9LCBmdW56aW9uZT17MX0NCi14bWxMaWJyYXJ5X2Vycm9yX2xvYWRfeG1sPUltcG9zc2liaWxlIGNhcmljYXJlIGwnJ29yaWdpbmUgeG1sICcnezB9JycNCi14bWxMaWJyYXJ5X25vX3BsdWdpbj1OZXNzdW4gTWV0aG9kUGx1Z2luIHBlciBsJydpZCB7MH0NCi14bWxMaWJyYXJ5X25vX2ZlYXR1cmU9SW1wb3NzaWJpbGUgb3R0ZW5lcmUgbGEgZnVuemlvbmUgWG1sIHBlciB7MH1fezF9DQoteG1sTGlicmFyeV9ub19jbGFzcz1JbXBvc3NpYmlsZSBvdHRlbmVyZSBFQ2xhc3MgcGVyIHswfQ0KLXhtbExpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9RXJyb3JlIGR1cmFudGUgbGEgY3JlYXppb25lIGRlbGwnJ2VsZW1lbnRvLiBJbXBvc3NpYmlsZSBpbXBvc3RhcmUgaWwgdmFsb3JlIGRlbGxhIGZ1bnppb25lIHswfQ0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlPUVycm9yZSBkdXJhbnRlIGxhIGNyZWF6aW9uZSBkZWxsJydlbGVtZW50by4gSW1wb3NzaWJpbGUgaW1wb3N0YXJlICBpbCB2YWxvcmUgezB9IHN1bCBjb250ZW5pdG9yZSB7MX0NCi14bWxMaWJyYXJ5X2ludmFsaWRfZmVhdHVyZV92YWx1ZT1WYWxvcmUgZnVuemlvbmUgYXR0cmlidXRvIG5vbiB2YWxpZG8gcGVyIGxhIGZ1bnppb25lIHswfSwgY29uIHZhbG9yZSB7MX0NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8yPUVycm9yZSBkdXJhbnRlIGwnJ2ltcG9zdGF6aW9uZSBkZWxsJydhdHRyaWJ1dG8uIEltcG9zc2liaWxlIGltcG9zdGFyZSBpbCB2YWxvcmUgcGVyIGZ1bnppb25lPXswfSwgb2dnZXR0bz17MX0sIHZhbG9yZT17Mn0NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8zPUltcG9zc2liaWxlIGltcG9zdGFyZSBpbCB2YWxvcmUgcGVyIGZ1bnppb25lPXswfSwgb2dnZXR0bz17MX0sIHZhbG9yZT17Mn0NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U9RXJyb3JlIGR1cmFudGUgbCcnaW1wb3N0YXppb25lIGRlbCByaWZlcmltZW50by4gSW1wb3NzaWJpbGUgaW1wb3N0YXJlIGlsIHZhbG9yZSBwZXIgZnVuemlvbmU9ezB9LCBvZ2dldHRvPXsxfSwgdmFsb3JlPXsyfQ0KLXhtbExpYnJhcnlfZXJyb3JfcHJvY2Vzc193cm9uZ19jb250YWluZXI9SWwgcHJvY2Vzc28gJyd7MH0nJyBub24gZGlzcG9uZSBkaSB1biBjb250ZW5pdG9yZSB2YWxpZG8uIElsIGNvbnRlbml0b3JlIFx1MDBlOCBkaSB0aXBvICcnezF9JycsIGNoZSBub24gXHUwMGU4IHVuIFByb2Nlc3NwYWNrYWdlDQoteG1sTGlicmFyeV9uZXdfaWQ9QWxsJydlbGVtZW50byB7MH0gdmllbmUgYXNzZWduYXRvIHVuIG51b3ZvIGlkIHsxfSBwb2ljaFx1MDBlOSBub24gbmUgZGlzcG9uZSBkaSB1bm8gdmFsaWRvDQoteG1sTGlicmFyeV9pZF9ub3RfdW5pcXVlPUwnJ0lkIGVsZW1lbnRvICcnezB9JycgdmllbmUgdXNhdG8gZGEgcGlcdTAwZjkgZGkgdW4gZWxlbWVudG8gDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NWViNjYxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXNfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6DQotIw0KLQ0KLSMgRXhwb3J0IFhNTCBXaXphcmQNCi1leHBvcnRYTUxXaXphcmRfdGl0bGU9WE1MIFx1MzA2ZVx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOA0KLQ0KLSMgU2VsZWN0IEV4cG9ydCBUeXBlIFdpemFyZCBQYWdlDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYz1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTlcdTMwOGJcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwNmVcdTMwYmZcdTMwYTRcdTMwZDdcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1leHBvcnRMaWJyYXJ5UmFkaW9CdXR0b25fdGV4dD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTUxNjhcdTRmNTNcdTMwOTJcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzgNCi1leHBvcnRQbHVnaW5zUmFkaW9CdXR0b25fdGV4dD0xIFx1MzA2NFx1NGVlNVx1NGUwYVx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOA0KLWV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbl90ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA5Mlx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOA0KLQ0KLSMgU2VsZWN0IERlc3RpbmF0aW9uIFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9XHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHU2MzA3XHU1YjlhDQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1cdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTVcdTMwOGNcdTMwNWZcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwOTJcdTRmZGRcdTdiYTFcdTMwNTlcdTMwOGIgWE1MIFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWZpbGVMYWJlbF90ZXh0PVhNTCBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWI6DQotYnJvd3NlQnV0dG9uX3RleHQ9XHU1M2MyXHU3MTY3Li4uDQotDQotIyBPdmVyd3JpdGUgQ29uZmlybWF0aW9uIERpYWxvZw0KLW92ZXJ3cml0ZVRleHRfbXNnPScnezB9JycgXHUzMDZmXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyXG5cdTRlMGFcdTY2ZjhcdTMwNGRcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWV4cG9ydGluZ1hNTF90ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzA5MiBYTUwgXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZiXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU3XHUzMDdlXHUzMDU5Li4uDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWludmFsaWRYTUxGaWxlX2Vycm9yPVx1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA1ZiBYTUwgXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyDQotZXhwb3J0WE1MV2l6YXJkX2Vycm9yPUlVUE0wMDAwRTogXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDZmXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiB7MH0NCi1leHBvcnRYTUxXaXphcmRfcmV2aWV3TG9nPVx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA0Y1x1NWI4Y1x1NGU4Nlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiBcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNmJcdTMwNDJcdTMwOGJcdTMwZWRcdTMwYjBcdTMwZmJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwOTJcdTc4YmFcdThhOGRcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1leHBvcnRYTUxTZXJ2aWNlX2Vycm9yPVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzBmYlx1MzBhOFx1MzBlOVx1MzBmYzogezB9DQotZXhwb3J0WE1MU2VydmljZV9mZWF0dXJlX2Vycm9yPVx1MzBkNVx1MzBhM1x1MzBmY1x1MzBjMVx1MzBlM1x1MzBmY1x1NTAyNDo6IFx1ODk4MVx1N2QyMD17MH1cdTMwMDFcdTMwZDVcdTMwYTNcdTMwZmNcdTMwYzFcdTMwZTNcdTMwZmM9ezF9IFx1MzA2ZVx1OGEyZFx1NWI5YVx1MzBhOFx1MzBlOVx1MzBmYw0KLXhtbExpYnJhcnlfZXJyb3JfbG9hZF94bWw9eG1sIFx1MzBiZFx1MzBmY1x1MzBiOSAnJ3swfScnIFx1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLXhtbExpYnJhcnlfbm9fcGx1Z2luPUlEIHswfSBcdTMwNmUgTWV0aG9kUGx1Z2luIFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLXhtbExpYnJhcnlfbm9fZmVhdHVyZT17MH1fezF9IFx1MzA2ZSBYbWwgXHUzMGQ1XHUzMGEzXHUzMGZjXHUzMGMxXHUzMGUzXHUzMGZjXHUzMDkyXHU1M2Q2XHU1Zjk3XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzDQoteG1sTGlicmFyeV9ub19jbGFzcz17MH0gXHUzMDZlIEVDbGFzcyBcdTMwOTJcdTUzZDZcdTVmOTdcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMNCi14bWxMaWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50PVx1ODk4MVx1N2QyMFx1MzA2ZVx1NGY1Y1x1NjIxMFx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2N1x1MzA1OVx1MzAwMlx1MzBkNVx1MzBhM1x1MzBmY1x1MzBjMVx1MzBlM1x1MzBmYyB7MH0gXHUzMDZlXHU1MDI0XHUzMDZlXHU4YTJkXHU1YjlhXHU2NWI5XHU2Y2Q1XHUzMDRjXHU0ZTBkXHU2NjBlXHUzMDY3XHUzMDU5DQoteG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWU9XHU4OTgxXHU3ZDIwXHUzMDZlXHU0ZjVjXHU2MjEwXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5XHUzMDAyXHU1MDI0IHswfSBcdTMwOTJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2FcdTMwZmMgezF9IFx1MzA2Ylx1OGEyZFx1NWI5YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLXhtbExpYnJhcnlfaW52YWxpZF9mZWF0dXJlX3ZhbHVlPVx1NTAyNCB7MX0gXHUzMDkyXHU2MzAxXHUzMDY0XHUzMGQ1XHUzMGEzXHUzMGZjXHUzMGMxXHUzMGUzXHUzMGZjIHswfSBcdTMwNmVcdTVjNWVcdTYwMjdcdTMwZDVcdTMwYTNcdTMwZmNcdTMwYzFcdTMwZTNcdTMwZmNcdTUwMjRcdTMwNGNcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTkNCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8yPVx1NWM1ZVx1NjAyN1x1MzA2ZVx1OGEyZFx1NWI5YVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2N1x1MzA1OVx1MzAwMlx1MzBkNVx1MzBhM1x1MzBmY1x1MzBjMVx1MzBlM1x1MzBmYz17MH1cdTMwMDFcdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzg9ezF9XHUzMDAxXHU1MDI0PXsyfSBcdTMwNmVcdTUwMjRcdTMwOTJcdThhMmRcdTViOWFcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMNCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8zPVx1MzBkNVx1MzBhM1x1MzBmY1x1MzBjMVx1MzBlM1x1MzBmYz17MH1cdTMwMDFcdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzg9ezF9XHUzMDAxXHU1MDI0PXsyfSBcdTMwNmVcdTUwMjRcdTMwNmVcdThhMmRcdTViOWFcdTY1YjlcdTZjZDVcdTMwNGNcdTRlMGRcdTY2MGVcdTMwNjdcdTMwNTkNCi14bWxMaWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U9XHU1M2MyXHU3MTY3XHUzMDZlXHU4YTJkXHU1YjlhXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5XHUzMDAyXHUzMGQ1XHUzMGEzXHUzMGZjXHUzMGMxXHUzMGUzXHUzMGZjPXswfVx1MzAwMVx1MzBhYVx1MzBkNlx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjOD17MX1cdTMwMDFcdTUwMjQ9ezJ9IFx1MzA2ZVx1NTAyNFx1MzA5Mlx1OGEyZFx1NWI5YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLXhtbExpYnJhcnlfZXJyb3JfcHJvY2Vzc193cm9uZ19jb250YWluZXI9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5ICcnezB9JycgXHUzMDZiXHU2NzA5XHU1MmI5XHUzMDZhXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGNhXHUzMGZjXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyIFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzBmY1x1MzA2ZVx1MzBiZlx1MzBhNFx1MzBkNyAnJ3sxfScnIFx1MzA2ZiBQcm9jZXNzcGFja2FnZSBcdTMwNjdcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMNCi14bWxMaWJyYXJ5X25ld19pZD1cdTg5ODFcdTdkMjAgezB9IFx1MzA2Ylx1NjcwOVx1NTJiOVx1MzA2YSBJRCBcdTMwNGNcdTMwNmFcdTMwNDRcdTMwNWZcdTMwODFcdTMwMDFcdTY1YjBcdTg5OGYgSUQgezF9IFx1MzA0Y1x1NTI3Mlx1MzA4YVx1NWY1M1x1MzA2Nlx1MzA4OVx1MzA4Y1x1MzA3ZVx1MzA1OQ0KLXhtbExpYnJhcnlfaWRfbm90X3VuaXF1ZT1cdTg5ODFcdTdkMjAgSUQgJyd7MH0nJyBcdTMwNmZcdTg5MDdcdTY1NzBcdTMwNmVcdTg5ODFcdTdkMjBcdTMwNmJcdTMwODhcdTMwNjNcdTMwNjZcdTRmN2ZcdTc1MjhcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkNCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ2Y2MzM2IuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZToNCi0jDQotDQotIyBFeHBvcnQgWE1MIFdpemFyZA0KLWV4cG9ydFhNTFdpemFyZF90aXRsZT1YTUwgXHViMGI0XHViY2Y0XHViMGI0XHVhZTMwDQotDQotIyBTZWxlY3QgRXhwb3J0IFR5cGUgV2l6YXJkIFBhZ2UNCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVx1YjBiNFx1YmNmNFx1YjBiYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1Y2VlOFx1ZDE1MFx1Y2UyMFx1Yzc1OCBcdWM3MjBcdWQ2MTVcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbl90ZXh0PVx1YzgwNFx1Y2NiNCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMA0KLWV4cG9ydFBsdWdpbnNSYWRpb0J1dHRvbl90ZXh0PVx1ZDU1OFx1YjA5OCBcdWM3NzRcdWMwYzFcdWM3NTggXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OCBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzANCi1leHBvcnRDb25maWdzUmFkaW9CdXR0b25fdGV4dD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxIFx1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMA0KLQ0KLSMgU2VsZWN0IERlc3RpbmF0aW9uIFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9XHViMGI0XHViY2Y0XHViMGI0XHVhZTMwIFx1ZDMwY1x1Yzc3YyBcdWM5YzBcdWM4MTUNCi1zZWxlY3RYTUxGaWxlUGFnZV9kZXNjPVx1YjBiNFx1YmNmNFx1YjBiYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1Y2VlOFx1ZDE1MFx1Y2UyMFx1Yjk3YyBcdWM4MDBcdWM3YTVcdWQ1NjAgXHViMzAwXHVjMGMxIFhNTCBcdWQzMGNcdWM3N2NcdWM3NDQgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWZpbGVMYWJlbF90ZXh0PVhNTCBcdWQzMGNcdWM3N2M6DQotYnJvd3NlQnV0dG9uX3RleHQ9XHVjYzNlXHVjNTQ0XHViY2Y0XHVhZTMwLi4uDQotDQotIyBPdmVyd3JpdGUgQ29uZmlybWF0aW9uIERpYWxvZw0KLW92ZXJ3cml0ZVRleHRfbXNnPScnezB9JycgXHVkNTZkXHViYWE5XHVjNzc0IFx1Yzc3NFx1YmJmOCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuXG5cdWFjYjlcdWNjZDBcdWM0ZjBcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWV4cG9ydGluZ1hNTF90ZXh0PVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVjZWU4XHVkMTUwXHVjZTIwXHViOTdjIFhNTCBcdWQzMGNcdWM3N2NcdWI4NWMgXHViMGI0XHViY2Y0XHViMGI0XHVhZTMwLi4uDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWludmFsaWRYTUxGaWxlX2Vycm9yPVx1YzljMFx1YzgxNVx1ZDU1YyBYTUwgXHVkMzBjXHVjNzdjXHVjNzc0IFx1YzYyY1x1YmMxNFx1Yjk3NFx1YzljMCBcdWM1NGFcdWMyYjVcdWIyYzhcdWIyZTQuDQotZXhwb3J0WE1MV2l6YXJkX2Vycm9yPUlVUE0wMDAwRTogXHViMGI0XHViY2Y0XHViMGI0XHVhZTMwIFx1YzJlNFx1ZDMyODogezB9DQotZXhwb3J0WE1MV2l6YXJkX3Jldmlld0xvZz1cdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzBcdWFjMDAgXHVjNjQ0XHViOGNjXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0LiBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzAgXHViNTE0XHViODA5XHVkMWEwXHViOWFjXHVjNWQwIFx1Yzc4OFx1YjI5NCBcdWI4NWNcdWFkZjggXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YWM4MFx1ZDFhMFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1leHBvcnRYTUxTZXJ2aWNlX2Vycm9yPVx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWIwYjRcdWJjZjRcdWIwYjRcdWFlMzAgXHVjNjI0XHViOTU4OiB7MH0NCi1leHBvcnRYTUxTZXJ2aWNlX2ZlYXR1cmVfZXJyb3I9XHVhZTMwXHViMmE1IFx1YWMxMiBcdWMxMjRcdWM4MTUgXHVjNjI0XHViOTU4OjogXHVjNjk0XHVjMThjPXswfSwgXHVhZTMwXHViMmE1PXsxfQ0KLXhtbExpYnJhcnlfZXJyb3JfbG9hZF94bWw9WE1MIFx1YzE4Y1x1YzJhNCAnJ3swfScnXHVjNzQ0KFx1Yjk3YykgXHViODVjXHViNGRjXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQoteG1sTGlicmFyeV9ub19wbHVnaW49SUQgezB9XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzc0IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi14bWxMaWJyYXJ5X25vX2ZlYXR1cmU9ezB9X3sxfVx1YzVkMCBcdWIzMDBcdWQ1NWMgWE1MIFx1YWUzMFx1YjJhNVx1Yzc0NCBcdWFjMDBcdWM4MzhcdWM2MmMgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi14bWxMaWJyYXJ5X25vX2NsYXNzPXswfVx1YzVkMCBcdWIzMDBcdWQ1NWMgRUNsYXNzXHViOTdjIFx1YWMwMFx1YzgzOFx1YzYyYyBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXhtbExpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9XHVjNjk0XHVjMThjIFx1Yzc5MVx1YzEzMSBcdWM2MjRcdWI5NTguIFx1YWUzMFx1YjJhNSB7MH1cdWM1ZDAgXHViMzAwXHVkNTVjIFx1YWMxMlx1Yzc0NCBcdWMxMjRcdWM4MTVcdWQ1NThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzQ0IFx1YzU0YyBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlPVx1YzY5NFx1YzE4YyBcdWM3OTFcdWMxMzEgXHVjNjI0XHViOTU4LiB7MH0gXHVhYzEyXHVjNzQ0IHsxfSBcdWNlZThcdWQxNGNcdWM3NzRcdWIxMDhcdWI4NWMgXHVjMTI0XHVjODE1XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQoteG1sTGlicmFyeV9pbnZhbGlkX2ZlYXR1cmVfdmFsdWU9XHVhYzEyIHsxfVx1Yzc0NChcdWI5N2MpIFx1YWMwMFx1YzljNCBcdWFlMzBcdWIyYTUgezB9XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjNzQwIFx1YzE4ZFx1YzEzMSBcdWFlMzBcdWIyYTUgXHVhYzEyDQoteG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMj1cdWMxOGRcdWMxMzEgXHVjMTI0XHVjODE1IFx1YzYyNFx1Yjk1OC4gXHVhZTMwXHViMmE1PXswfSwgXHVjNjI0XHViZTBjXHVjODFkXHVkMmI4PXsxfSwgXHVhYzEyPXsyfVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVhYzEyXHVjNzQ0IFx1YzEyNFx1YzgxNVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzM9XHVhZTMwXHViMmE1PXswfSwgXHVjNjI0XHViZTBjXHVjODFkXHVkMmI4PXsxfSwgXHVhYzEyPXsyfVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVhYzEyXHVjNzQ0IFx1YzEyNFx1YzgxNVx1ZDU1OFx1YjI5NCBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjNTRjIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQoteG1sTGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlPVx1Y2MzOFx1Yzg3MCBcdWMxMjRcdWM4MTUgXHVjNjI0XHViOTU4LiBcdWFlMzBcdWIyYTU9ezB9LCBcdWM2MjRcdWJlMGNcdWM4MWRcdWQyYjg9ezF9LCBcdWFjMTI9ezJ9XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWFjMTJcdWM3NDQgXHVjMTI0XHVjODE1XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQoteG1sTGlicmFyeV9lcnJvcl9wcm9jZXNzX3dyb25nX2NvbnRhaW5lcj0nJ3swfScnIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1YWMwMCBcdWM2MmNcdWJjMTRcdWI5NzggXHVjZWU4XHVkMTRjXHVjNzc0XHViMTA4XHViOTdjIFx1YWMwMFx1YzljMFx1YWNlMCBcdWM3ODhcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0LiBcdWNlZThcdWQxNGNcdWM3NzRcdWIxMDhcdWM3NTggXHVjNzIwXHVkNjE1XHVjNzc0ICcnezF9JydcdWM3NzRcdWJhNzAgUHJvY2Vzc3BhY2thZ2VcdWFjMDAgXHVjNTQ0XHViMmQ5XHViMmM4XHViMmU0Lg0KLXhtbExpYnJhcnlfbmV3X2lkPXswfSBcdWM2OTRcdWMxOGNcdWFjMDAgXHVjNjJjXHViYzE0XHViOTc4IElEXHViOTdjIFx1YWMwMFx1YzljMFx1YzljMCBcdWM1NGFcdWFlMzAgXHViNTRjXHViYjM4XHVjNWQwIFx1YzBjOCBJRCB7MX1cdWM3NzQoXHVhYzAwKSBcdWM5YzBcdWM4MTVcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuDQoteG1sTGlicmFyeV9pZF9ub3RfdW5pcXVlPVx1YzY5NFx1YzE4YyBJRCAnJ3swfScnXHVjNzQwKFx1YjI5NCkgXHViNDU4IFx1Yzc3NFx1YzBjMVx1Yzc1OCBcdWM2OTRcdWMxOGNcdWM1ZDAgXHVjNzU4XHVkNTc0IFx1YzBhY1x1YzZhOVx1YjQyOVx1YjJjOFx1YjJlNC4NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdhNjk3NzEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZToNCi0jDQotDQotIyBFeHBvcnQgWE1MIFdpemFyZA0KLWV4cG9ydFhNTFdpemFyZF90aXRsZT1FeHBvcnRhciBYTUwNCi0NCi0jIFNlbGVjdCBFeHBvcnQgVHlwZSBXaXphcmQgUGFnZQ0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2Rlc2M9U2VsZWNpb25lIG8gdGlwbyBkZSBjb250ZVx1MDBmYWRvIGRlIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG8gYSBzZXIgZXhwb3J0YWRvLg0KLWV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbl90ZXh0PUV4cG9ydGFyIGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kbyBpbnRlaXJhDQotZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uX3RleHQ9RXhwb3J0YXIgdW0gb3UgbWFpcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbw0KLWV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbl90ZXh0PUV4cG9ydGFyIHVtYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIG1cdTAwZTl0b2RvDQotDQotIyBTZWxlY3QgRGVzdGluYXRpb24gWE1MIEZpbGUgV2l6YXJkIFBhZ2UNCi1zZWxlY3RYTUxGaWxlUGFnZV90aXRsZT1Fc3BlY2lmaWNhciBhcnF1aXZvIGRlIGV4cG9ydGFcdTAwZTdcdTAwZTNvDQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1Fc3BlY2lmaXF1ZSB1bSBhcnF1aXZvIFhNTCBkZSBkZXN0aW5vIHBhcmEgYXJtYXplbmFyIG8gY29udGVcdTAwZmFkbyBleHBvcnRhZG8gZGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kby4NCi1maWxlTGFiZWxfdGV4dD1BcnF1aXZvIFhNTDoNCi1icm93c2VCdXR0b25fdGV4dD1Qcm9jdXJhci4uLg0KLQ0KLSMgT3ZlcndyaXRlIENvbmZpcm1hdGlvbiBEaWFsb2cNCi1vdmVyd3JpdGVUZXh0X21zZz0nJ3swfScnIGpcdTAwZTEgZXhpc3RlLlxuRGVzZWphIHNvYnJlc2NyZXZcdTAwZWEtbG8/DQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWV4cG9ydGluZ1hNTF90ZXh0PUV4cG9ydGFyIGNvbnRlXHUwMGZhZG8gZGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kbyBwYXJhIG8gYXJxdWl2byBYTUwuLi4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZFhNTEZpbGVfZXJyb3I9TyBhcnF1aXZvIFhNTCBlc3BlY2lmaWNhZG8gblx1MDBlM28gXHUwMGU5IHZcdTAwZTFsaWRvLg0KLWV4cG9ydFhNTFdpemFyZF9lcnJvcj1JVVBNMDAwMEU6IEEgZXhwb3J0YVx1MDBlN1x1MDBlM28gZmFsaG91OiB7MH0NCi1leHBvcnRYTUxXaXphcmRfcmV2aWV3TG9nPUV4cG9ydGFcdTAwZTdcdTAwZTNvIGNvbmNsdVx1MDBlZGRhLiBSZXZpc2Ugb3MgYXJxdWl2b3MgZGUgbG9nIG5vIGRpcmV0XHUwMGYzcmlvIGRlIGV4cG9ydGFcdTAwZTdcdTAwZTNvLg0KLWV4cG9ydFhNTFNlcnZpY2VfZXJyb3I9RXJybyBhbyBleHBvcnRhciBiaWJsaW90ZWNhOiB7MH0NCi1leHBvcnRYTUxTZXJ2aWNlX2ZlYXR1cmVfZXJyb3I9RXJybyBhbyBkZWZpbmlyIHZhbG9yIGRlIHJlY3Vyc286OiBFbGVtZW50bz17MH0sIHJlY3Vyc289ezF9DQoteG1sTGlicmFyeV9lcnJvcl9sb2FkX3htbD1JbXBvc3NcdTAwZWR2ZWwgY2FycmVnYXIgb3JpZ2VtIHhtbCAnJ3swfScnDQoteG1sTGlicmFyeV9ub19wbHVnaW49TmVuaHVtIE1ldGhvZFBsdWdpbiBwYXJhIG8gaWQgezB9DQoteG1sTGlicmFyeV9ub19mZWF0dXJlPUltcG9zc1x1MDBlZHZlbCBvYnRlciByZWN1cnNvIFhtbCBwYXJhIHswfV97MX0NCi14bWxMaWJyYXJ5X25vX2NsYXNzPUltcG9zc1x1MDBlZHZlbCBvYnRlciBFQ2xhc3MgcGFyYSB7MH0NCi14bWxMaWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50PUVycm8gYW8gY3JpYXIgZWxlbWVudG87IHNlbSBzYWJlciBjb21vIGRlZmluaXIgbyB2YWxvciBkbyByZWN1cnNvIHswfQ0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlPUVycm8gYW8gY3JpYXIgZWxlbWVudG87IG5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIGRlZmluaXIgbyB2YWxvciB7MH0gcGFyYSBvIGNvbnRcdTAwZWFpbmVyIHsxfQ0KLXhtbExpYnJhcnlfaW52YWxpZF9mZWF0dXJlX3ZhbHVlPVZhbG9yIGRlIHJlY3Vyc28gZGUgYXRyaWJ1dG8gaW52XHUwMGUxbGlkbyBwYXJhIG8gcmVjdXJzbyB7MH0sIGNvbSBvIHZhbG9yIHsxfQ0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzI9RXJybyBhbyBkZWZpbmlyIGF0cmlidXRvOyBuXHUwMGUzbyBcdTAwZTkgcG9zc1x1MDBlZHZlbCBkZWZpbmlyIHZhbG9yIHBhcmEgcmVjdXJzbz17MH0sIG9iamV0bz17MX0sIHZhbG9yPXsyfQ0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzM9U2VtIHNhYmVyIGNvbW8gZGVmaW5pciB2YWxvciBwYXJhIHJlY3Vyc289ezB9LCBvYmpldG89ezF9LCB2YWxvcj17Mn0NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U9RXJybyBhbyBkZWZpbmlyIHJlZmVyXHUwMGVhbmNpYTsgblx1MDBlM28gXHUwMGU5IHBvc3NcdTAwZWR2ZWwgZGVmaW5pciB2YWxvciBwYXJhIHJlY3Vyc289ezB9LCBvYmpldG89ezF9LCB2YWxvcj17Mn0NCi14bWxMaWJyYXJ5X2Vycm9yX3Byb2Nlc3Nfd3JvbmdfY29udGFpbmVyPXByb2Nlc3NvICcnezB9Jycgblx1MDBlM28gdGVtIHVtIGNvbnRcdTAwZWFpbmVyIHZcdTAwZTFsaWRvLiBPIGNvbnRcdTAwZWFpbmVyIFx1MDBlOSBkbyB0aXBvICcnezF9JycsIHF1ZSBuXHUwMGUzbyBcdTAwZTkgdW0gUHJvY2Vzc3BhY2thZ2UNCi14bWxMaWJyYXJ5X25ld19pZD1PIGVsZW1lbnRvIHswfSByZWNlYmV1IHVtIG5vdm8gaWQgezF9IHBvcnF1ZSBuXHUwMGUzbyB0ZW0gdW0gdlx1MDBlMWxpZG8NCi14bWxMaWJyYXJ5X2lkX25vdF91bmlxdWU9TyBJZCAnJ3swfScnIGRvIGVsZW1lbnRvIFx1MDBlOSB1dGlsaXphZG8gcG9yIG1haXMgZGUgdW0gZWxlbWVudG8NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDViNTdiMzcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZToNCi0jDQotDQotIyBFeHBvcnQgWE1MIFdpemFyZA0KLWV4cG9ydFhNTFdpemFyZF90aXRsZT1cdTViZmNcdTUxZmEgWE1MDQotDQotIyBTZWxlY3QgRXhwb3J0IFR5cGUgV2l6YXJkIFBhZ2UNCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVx1OTAwOVx1NjJlOVx1ODk4MVx1NWJmY1x1NTFmYVx1NzY4NFx1NjViOVx1NmNkNVx1NWU5M1x1NTE4NVx1NWJiOVx1NzY4NFx1N2M3Ylx1NTc4Ylx1MzAwMg0KLWV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbl90ZXh0PVx1NWJmY1x1NTFmYVx1NjU3NFx1NGUyYVx1NjViOVx1NmNkNVx1NWU5Mw0KLWV4cG9ydFBsdWdpbnNSYWRpb0J1dHRvbl90ZXh0PVx1NWJmY1x1NTFmYVx1NGUwMFx1NGUyYVx1NjIxNlx1NTkxYVx1NGUyYVx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNg0KLWV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbl90ZXh0PVx1NWJmY1x1NTFmYVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZQ0KLQ0KLSMgU2VsZWN0IERlc3RpbmF0aW9uIFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9XHU2MzA3XHU1YjlhXHU1YmZjXHU1MWZhXHU2NTg3XHU0ZWY2DQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1cdTYzMDdcdTViOWFcdTRlMDBcdTRlMmFcdTc2ZWVcdTY4MDcgWE1MIFx1NjU4N1x1NGVmNlx1ZmYwY1x1NzUyOFx1NGU4ZVx1NWI1OFx1NTBhOFx1NWJmY1x1NTFmYVx1NzY4NFx1NjViOVx1NmNkNVx1NWU5M1x1NTE4NVx1NWJiOVx1MzAwMg0KLWZpbGVMYWJlbF90ZXh0PVhNTCBcdTY1ODdcdTRlZjZcdWZmMWENCi1icm93c2VCdXR0b25fdGV4dD1cdTZkNGZcdTg5YzguLi4NCi0NCi0jIE92ZXJ3cml0ZSBDb25maXJtYXRpb24gRGlhbG9nDQotb3ZlcndyaXRlVGV4dF9tc2c9XHUyMDFjezB9XHUyMDFkXHU1ZGYyXHU3ZWNmXHU1YjU4XHU1NzI4XHUzMDAyXG5cdTg5ODFcdTg5ODZcdTc2ZDZcdTViODNcdTU0MTdcdWZmMWYNCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotZXhwb3J0aW5nWE1MX3RleHQ9XHU1YzA2XHU2NWI5XHU2Y2Q1XHU1ZTkzXHU1MTg1XHU1YmI5XHU1YmZjXHU1MWZhXHU1MjMwIFhNTCBcdTY1ODdcdTRlZjYuLi4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZFhNTEZpbGVfZXJyb3I9XHU2MzA3XHU1YjlhXHU3Njg0IFhNTCBcdTY1ODdcdTRlZjZcdTY1ZTBcdTY1NDhcdTMwMDINCi1leHBvcnRYTUxXaXphcmRfZXJyb3I9SVVQTTAwMDBFOiBcdTViZmNcdTUxZmFcdTU5MzFcdThkMjVcdWZmMWF7MH0NCi1leHBvcnRYTUxXaXphcmRfcmV2aWV3TG9nPVx1NWJmY1x1NTFmYVx1NWI4Y1x1NjIxMFx1MzAwMlx1OGJmN1x1NjdlNVx1NzcwYlx1NWJmY1x1NTFmYVx1NzZlZVx1NWY1NVx1NGUwYlx1NzY4NFx1NjVlNVx1NWZkN1x1NjU4N1x1NGVmNlx1MzAwMg0KLWV4cG9ydFhNTFNlcnZpY2VfZXJyb3I9XHU1YmZjXHU1MWZhXHU1ZTkzXHU2NWY2XHU1MWZhXHU5NTE5XHVmZjFhezB9DQotZXhwb3J0WE1MU2VydmljZV9mZWF0dXJlX2Vycm9yPVx1OGJiZVx1N2Y2ZVx1NTI5Zlx1ODBmZFx1OTBlOFx1NGVmNlx1NTAzY1x1NjVmNlx1NTFmYVx1OTUxOVx1ZmYxYUVsZW1lbnQ9ezB9XHVmZjBjZmVhdHVyZT17MX0NCi14bWxMaWJyYXJ5X2Vycm9yX2xvYWRfeG1sPVx1NjVlMFx1NmNkNVx1ODhjNVx1NTE2NSBYTUwgXHU2ZTkwXHUyMDFjezB9XHUyMDFkDQoteG1sTGlicmFyeV9ub19wbHVnaW49XHU0ZTBkXHU1YjU4XHU1NzI4XHU2ODA3XHU4YmM2XHU0ZTNhIHswfSBcdTc2ODRcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjYNCi14bWxMaWJyYXJ5X25vX2ZlYXR1cmU9XHU2NWUwXHU2Y2Q1XHU4M2I3XHU1Zjk3IHswfV97MX0gXHU3Njg0IFhtTCBcdTUyOWZcdTgwZmRcdTkwZThcdTRlZjYNCi14bWxMaWJyYXJ5X25vX2NsYXNzPVx1NjVlMFx1NmNkNVx1ODNiN1x1NWY5NyB7MH0gXHU3Njg0IEVDbGFzcw0KLXhtbExpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9XHU1MjFiXHU1ZWZhXHU1MTQzXHU3ZDIwXHU2NWY2XHU1MWZhXHU5NTE5XHVmZjBjXHU0ZTBkXHU3N2U1XHU5MDUzXHU1OTgyXHU0ZjU1XHU4YmJlXHU3ZjZlXHU1MjlmXHU4MGZkXHU5MGU4XHU0ZWY2IHswfSBcdTc2ODRcdTUwM2NcdTMwMDINCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZT1cdTUyMWJcdTVlZmFcdTUxNDNcdTdkMjBcdTY1ZjZcdTUxZmFcdTk1MTlcdWZmMGNcdTY1ZTBcdTZjZDVcdTRlM2FcdTViYjlcdTU2NjggezF9IFx1OGJiZVx1N2Y2ZVx1NTAzYyB7MH1cdTMwMDINCi14bWxMaWJyYXJ5X2ludmFsaWRfZmVhdHVyZV92YWx1ZT1cdTUyOWZcdTgwZmRcdTkwZThcdTRlZjYgezB9IFx1NzY4NFx1NWM1ZVx1NjAyN1x1NTI5Zlx1ODBmZFx1OTBlOFx1NGVmNlx1NTAzYyB7MX0gXHU2NWUwXHU2NTQ4DQoteG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMj1cdThiYmVcdTdmNmVcdTVjNWVcdTYwMjdcdTY1ZjZcdTUxZmFcdTk1MTlcdWZmMGNcdTY1ZTBcdTZjZDVcdThiYmVcdTdmNmVcdTUwM2NcdWZmMGNcdTUzNzNcdTY1ZTBcdTZjZDVcdThiYmVcdTdmNmUgZmVhdHVyZT17MH1cdTMwMDFvYmplY3Q9ezF9XHUzMDAxdmFsdWU9ezJ9DQoteG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMz1cdTRlMGRcdTc3ZTVcdTkwNTNcdTU5ODJcdTRmNTVcdThiYmVcdTdmNmVcdTUwM2NcdWZmMGNcdTUzNzNcdTRlMGRcdTc3ZTVcdTkwNTNcdTU5ODJcdTRmNTVcdThiYmVcdTdmNmUgZmVhdHVyZT17MH1cdTMwMDFvYmplY3Q9ezF9XHUzMDAxdmFsdWU9ezJ9DQoteG1sTGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlPVx1OGJiZVx1N2Y2ZVx1NWYxNVx1NzUyOFx1NjVmNlx1NTFmYVx1OTUxOVx1ZmYwY1x1NjVlMFx1NmNkNVx1OGJiZVx1N2Y2ZVx1NTAzY1x1ZmYwY1x1NTM3M1x1NjVlMFx1NmNkNVx1OGJiZVx1N2Y2ZSBmZWF0dXJlPXswfVx1MzAwMW9iamVjdD17MX1cdTMwMDF2YWx1ZT17Mn0NCi14bWxMaWJyYXJ5X2Vycm9yX3Byb2Nlc3Nfd3JvbmdfY29udGFpbmVyPVx1NmQ0MVx1N2EwYiB7MH0gXHU2Y2ExXHU2NzA5XHU2NzA5XHU2NTQ4XHU3Njg0XHU1YmI5XHU1NjY4XHUzMDAyIFx1NWJiOVx1NTY2OFx1N2M3Ylx1NTc4Ylx1NGUzYVx1MjAxY3sxfVx1MjAxZFx1ZmYwY1x1OGJlNVx1N2M3Ylx1NTc4Ylx1NGUwZFx1NjYyZlx1NmQ0MVx1N2EwYlx1NTMwNQ0KLXhtbExpYnJhcnlfbmV3X2lkPVx1NzUzMVx1NGU4ZVx1NTE0M1x1N2QyMCB7MH0gXHU2Y2ExXHU2NzA5XHU2NzA5XHU2NTQ4XHU3Njg0XHU2ODA3XHU4YmM2XHVmZjBjXHU1NmUwXHU4MDBjXHU1ZGYyXHU4OGFiXHU1MjA2XHU5MTRkXHU0ZTg2XHU2NWIwXHU2ODA3XHU4YmM2IHsxfQ0KLXhtbExpYnJhcnlfaWRfbm90X3VuaXF1ZT1cdTUxNDNcdTdkMjBcdTY4MDdcdThiYzYgezB9IFx1ODhhYlx1NTkxYVx1NGUyYVx1NTE0M1x1N2QyMFx1NGY3Zlx1NzUyOA0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2EwY2Y4Ni4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOg0KLSMNCi0NCi0jIEV4cG9ydCBYTUwgV2l6YXJkDQotZXhwb3J0WE1MV2l6YXJkX3RpdGxlPVx1NTMyZlx1NTFmYSBYTUwNCi0NCi0jIFNlbGVjdCBFeHBvcnQgVHlwZSBXaXphcmQgUGFnZQ0KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2Rlc2M9XHU5MDc4XHU1M2Q2XHU4OTgxXHU1MzJmXHU1MWZhXHU3Njg0XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU1MTY3XHU1YmI5XHU3Njg0XHU5ODVlXHU1NzhiXHUzMDAyDQotZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uX3RleHQ9XHU1MzJmXHU1MWZhXHU2NTc0XHU1MDBiXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiDQotZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uX3RleHQ9XHU1MzJmXHU1MWZhXHU0ZTAwXHU2MjE2XHU1OTFhXHU1MDBiXHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotZXhwb3J0Q29uZmlnc1JhZGlvQnV0dG9uX3RleHQ9XHU1MzJmXHU1MWZhXHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotDQotIyBTZWxlY3QgRGVzdGluYXRpb24gWE1MIEZpbGUgV2l6YXJkIFBhZ2UNCi1zZWxlY3RYTUxGaWxlUGFnZV90aXRsZT1cdTYzMDdcdTViOWFcdTUzMmZcdTUxZmFcdTZhOTQNCi1zZWxlY3RYTUxGaWxlUGFnZV9kZXNjPVx1NjMwN1x1NWI5YVx1NzZlZVx1NzY4NFx1NTczMCBYTUwgXHU2YTk0XHVmZjBjXHU3NTI4XHU0Zjg2XHU1MTMyXHU1YjU4XHU1MzJmXHU1MWZhXHU3Njg0XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU1MTY3XHU1YmI5XHUzMDAyDQotZmlsZUxhYmVsX3RleHQ9WE1MIFx1NmE5NFx1ZmYxYQ0KLWJyb3dzZUJ1dHRvbl90ZXh0PVx1NzAwZlx1ODliZC4uLg0KLQ0KLSMgT3ZlcndyaXRlIENvbmZpcm1hdGlvbiBEaWFsb2cNCi1vdmVyd3JpdGVUZXh0X21zZz0nJ3swfScnIFx1NWRmMlx1NWI1OFx1NTcyOFx1MzAwMlxuXHU2MGE4XHU4OTgxXHU4OTg2XHU1YmViXHU1YjgzXHU1NWNlXHVmZjFmDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWV4cG9ydGluZ1hNTF90ZXh0PVx1NWMwN1x1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NzY4NFx1NTE2N1x1NWJiOVx1NTMyZlx1NTFmYVx1NTIzMCBYTUwgXHU2YTk0Li4uDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWludmFsaWRYTUxGaWxlX2Vycm9yPVx1NjMwN1x1NWI5YVx1NzY4NCBYTUwgXHU2YTk0XHU3MTIxXHU2NTQ4XHUzMDAyDQotZXhwb3J0WE1MV2l6YXJkX2Vycm9yPUlVUE0wMDAwRTogXHU1MzJmXHU1MWZhXHU1OTMxXHU2NTU3XHVmZjFhezB9DQotZXhwb3J0WE1MV2l6YXJkX3Jldmlld0xvZz1cdTUzMmZcdTUxZmFcdTViOGNcdTYyMTBcdTMwMDJcDQotXHU4YWNiXHU2N2U1XHU5NWIxXHU1MzJmXHU1MWZhXHU3NmVlXHU5MzA0XHU0ZTBiXHU3Njg0XHU2NWU1XHU4YThjXHU2YTk0XHUzMDAyDQotZXhwb3J0WE1MU2VydmljZV9lcnJvcj1cdTUzMmZcdTUxZmFcdTdhMGJcdTVmMGZcdTVlYWJcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdWZmMWF7MH0NCi1leHBvcnRYTUxTZXJ2aWNlX2ZlYXR1cmVfZXJyb3I9XHU4YTJkXHU1YjlhXHU3Mjc5XHU2MDI3XHU1MDNjXHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0XHVmZjFhXHU1MTQzXHU3ZDIwPXswfVx1ZmYwY1x1NzI3OVx1NjAyNz17MX0NCi14bWxMaWJyYXJ5X2Vycm9yX2xvYWRfeG1sPVx1NzEyMVx1NmNkNVx1OGYwOVx1NTE2NSBYTUwgXHU0Zjg2XHU2ZTkwICcnezB9JycNCi14bWxMaWJyYXJ5X25vX3BsdWdpbj1JRCB7MH0gXHU2YzkyXHU2NzA5IE1ldGhvZFBsdWdpbg0KLXhtbExpYnJhcnlfbm9fZmVhdHVyZT1cdTcxMjFcdTZjZDVcdTUzZDZcdTVmOTcgezB9X3sxfSBcdTc2ODQgWE1MIFx1NzI3OVx1NjAyNw0KLXhtbExpYnJhcnlfbm9fY2xhc3M9XHU3MTIxXHU2Y2Q1XHU1M2Q2XHU1Zjk3IHswfSBcdTc2ODQgRUNsYXNzDQoteG1sTGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudD1cdTVlZmFcdTdhY2JcdTUxNDNcdTdkMjBcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdWZmMGNcdTRlMGRcdTc3ZTVcdTU5ODJcdTRmNTVcdThhMmRcdTViOWFcdTcyNzlcdTYwMjcgezB9IFx1NzY4NFx1NTAzYw0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlPVx1NWVmYVx1N2FjYlx1NTE0M1x1N2QyMFx1NjY0Mlx1NzY3Y1x1NzUxZlx1OTMyZlx1OGFhNFx1ZmYwY1x1NzEyMVx1NmNkNVx1NWMwN1x1NTAzYyB7MH0gXHU4YTJkXHU3MGJhXHU1MTMyXHU1YjU4XHU1NjY4IHsxfQ0KLXhtbExpYnJhcnlfaW52YWxpZF9mZWF0dXJlX3ZhbHVlPVx1NzI3OVx1NjAyNyB7MH0gXHU3Njg0XHU1YzZjXHU2MDI3XHU3Mjc5XHU2MDI3XHU1MDNjXHU3MTIxXHU2NTQ4XHVmZjBjXHU1MDNjXHU3MGJhIHsxfQ0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzI9XHU4YTJkXHU1YjlhXHU1YzZjXHU2MDI3XHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0XHVmZjBjXHU3MTIxXHU2Y2Q1XHU4YTJkXHU1YjlhXHU1MDNjXHVmZjBjXHU3Mjc5XHU2MDI3PXswfVx1ZmYwY1x1NzI2OVx1NGVmNj17MX1cdWZmMGNcdTUwM2M9ezJ9DQoteG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMz1cdTRlMGRcdTc3ZTVcdTU5ODJcdTRmNTVcdThhMmRcdTViOWFcdTUwM2NcdWZmMGNcdTcyNzlcdTYwMjc9ezB9XHVmZjBjXHU3MjY5XHU0ZWY2PXsxfVx1ZmYwY1x1NTAzYz17Mn0NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U9XHU4YTJkXHU1YjlhXHU1M2MzXHU3MTY3XHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0XHVmZjBjXHU3MTIxXHU2Y2Q1XHU4YTJkXHU1YjlhXHU1MDNjXHVmZjBjXHU3Mjc5XHU2MDI3PXswfVx1ZmYwY1x1NzI2OVx1NGVmNj17MX1cdWZmMGNcdTUwM2M9ezJ9DQoteG1sTGlicmFyeV9lcnJvcl9wcm9jZXNzX3dyb25nX2NvbnRhaW5lcj1cdTZkNDFcdTdhMGIgJyd7MH0nJyBcdTdmM2FcdTVjMTFcdTY3MDlcdTY1NDhcdTc2ODRcdTUxMzJcdTViNThcdTU2NjhcdTMwMDJcdTUxMzJcdTViNThcdTU2NjhcdTY2MmYgJyd7MX0nJyBcdTk4NWVcdTU3OGJcdWZmMGNcdTRlMGRcdTY2MmYgUHJvY2Vzc3BhY2thZ2UNCi14bWxMaWJyYXJ5X25ld19pZD1cdTUxNDNcdTdkMjAgezB9IFx1N2YzYVx1NWMxMVx1NjcwOVx1NjU0OFx1NzY4NCBJRFx1ZmYwY1x1NWRmMlx1NjMwN1x1NmQzZVx1NjViMFx1NzY4NCBJRCB7MX0NCi14bWxMaWJyYXJ5X2lkX25vdF91bmlxdWU9XHU2NzA5XHU1OTFhXHU1MDBiXHU1MTQzXHU3ZDIwXHU0ZjdmXHU3NTI4XHU1MTQzXHU3ZDIwIElEICcnezB9JycNCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMi8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDIvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGJiNjU3Zi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGY2YWIxNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIFhNTCBFeHBvcnQgKE5MMikKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWw7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNTRmY2E3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX3J1LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMjMxNGFhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyIFx1MDQzMiBYTUwNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIEV4cG9ydCBYTUwgV2l6YXJkDQotZXhwb3J0WE1MV2l6YXJkTmFtZT1YTUwNCi1leHBvcnRYTUxXaXphcmREZXNjcmlwdGlvbj1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDMyIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYiBYTUwuDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZDg0MzUxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXNfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6DQotIw0KLQ0KLSMgRXhwb3J0IFhNTCBXaXphcmQNCi1leHBvcnRYTUxXaXphcmRfdGl0bGU9XHUwNDJkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyIFhNTA0KLQ0KLSMgU2VsZWN0IEV4cG9ydCBUeXBlIFdpemFyZCBQYWdlDQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYz1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQyXHUwNDM4XHUwNDNmIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzAuDQotZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uX3RleHQ9XHUwNDJkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0MVx1MDQ0ZSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uX3RleHQ9XHUwNDJkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzZCBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDNkXHUwNDM1XHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDNlIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzNVx1MDQzOSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1leHBvcnRDb25maWdzUmFkaW9CdXR0b25fdGV4dD1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLQ0KLSMgU2VsZWN0IERlc3RpbmF0aW9uIFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYiBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwDQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiIFhNTCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMiBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M2NcdTA0M2VcdTA0MzkgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4NCi1maWxlTGFiZWxfdGV4dD1cdTA0MjRcdTA0MzBcdTA0MzlcdTA0M2IgWE1MOg0KLWJyb3dzZUJ1dHRvbl90ZXh0PVx1MDQxZVx1MDQzMVx1MDQzN1x1MDQzZVx1MDQ0MC4uLg0KLQ0KLSMgT3ZlcndyaXRlIENvbmZpcm1hdGlvbiBEaWFsb2cNCi1vdmVyd3JpdGVUZXh0X21zZz0nJ3swfScnIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIuXG5cdTA0MTdcdTA0MzBcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM1XHUwNDMzXHUwNDNlPw0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1leHBvcnRpbmdYTUxfdGV4dD1cdTA0MmRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDMyIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYiBYTUwuLi4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZFhNTEZpbGVfZXJyb3I9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkIFx1MDQzZFx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQ0Ylx1MDQzOSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgWE1MLg0KLWV4cG9ydFhNTFdpemFyZF9lcnJvcj1JVVBNMDAwMEU6IFx1MDQyZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBcdTA0M2RcdTA0MzUgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkOiB7MH0NCi1leHBvcnRYTUxXaXphcmRfcmV2aWV3TG9nPVx1MDQyZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDhcdTA0MzVcdTA0M2QuIFx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDMwIFx1MDQzMiBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzNcdTA0MzUgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwLg0KLWV4cG9ydFhNTFNlcnZpY2VfZXJyb3I9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4OiB7MH0NCi1leHBvcnRYTUxTZXJ2aWNlX2ZlYXR1cmVfZXJyb3I9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmOiBFbGVtZW50PXswfSwgZmVhdHVyZT17MX0NCi14bWxMaWJyYXJ5X2Vycm9yX2xvYWRfeG1sPVx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQ0MVx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDFcdTA0NDIgeG1sICcnezB9JycNCi14bWxMaWJyYXJ5X25vX3BsdWdpbj1cdTA0MWRcdTA0MzVcdTA0NDIgTWV0aG9kUGx1Z2luIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MThcdTA0MTQgezB9DQoteG1sTGlicmFyeV9ub19mZWF0dXJlPVx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDQzXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDRjIFhtbCBcdTA0MzRcdTA0M2JcdTA0NGYgezB9X3sxfQ0KLXhtbExpYnJhcnlfbm9fY2xhc3M9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NDNcdTA0NDdcdTA0MzhcdTA0NDJcdTA0NGMgRUNsYXNzIFx1MDQzNFx1MDQzYlx1MDQ0ZiB7MH0NCi14bWxMaWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50PVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwLiBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkIFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MVx1MDQzZVx1MDQzMSBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzNFx1MDQzYlx1MDQ0ZiB7MH0NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZT1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMC4gXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0NDFcdTA0MzJcdTA0M2VcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IHswfSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDJcdTA0MzVcdTA0MzlcdTA0M2RcdTA0MzVcdTA0NDBcdTA0NDMgezF9DQoteG1sTGlicmFyeV9pbnZhbGlkX2ZlYXR1cmVfdmFsdWU9XHUwNDFkXHUwNDM1XHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNkXHUwNDNlXHUwNDM1IFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzBcdTA0NDJcdTA0NDBcdTA0MzhcdTA0MzFcdTA0NDNcdTA0NDJcdTA0MzAgXHUwNDM0XHUwNDNiXHUwNDRmIHswfSwgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IHsxfQ0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzI9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzMFx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQzMVx1MDQ0M1x1MDQ0Mlx1MDQzMCwgZmVhdHVyZT17MH0sIG9iamVjdD17MX0sIHZhbHVlPXsyfQ0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzM9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZCBcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDFcdTA0M2VcdTA0MzEgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDQxXHUwNDMyXHUwNDNlXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiwgZmVhdHVyZT17MH0sIG9iamVjdD17MX0sIHZhbHVlPXsyfQ0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZT1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzOCBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4LCBmZWF0dXJlPXswfSwgb2JqZWN0PXsxfSwgdmFsdWU9ezJ9DQoteG1sTGlicmFyeV9lcnJvcl9wcm9jZXNzX3dyb25nX2NvbnRhaW5lcj1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDEgJyd7MH0nJyBcdTA0M2RcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDM1XHUwNDQyIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzM1x1MDQzZSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDJcdTA0MzVcdTA0MzlcdTA0M2RcdTA0MzVcdTA0NDBcdTA0MzAuIFx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0Mlx1MDQzNVx1MDQzOVx1MDQzZFx1MDQzNVx1MDQ0MCBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0MzVcdTA0NDIgXHUwNDQyXHUwNDM4XHUwNDNmICcnezF9JycsIFx1MDQzZVx1MDQ0Mlx1MDQzYlx1MDQzOFx1MDQ0N1x1MDQzMFx1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzOVx1MDQ0MVx1MDQ0ZiBcdTA0M2VcdTA0NDIgUHJvY2Vzc3BhY2thZ2UNCi14bWxMaWJyYXJ5X25ld19pZD1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NDMgezB9IFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQ0MVx1MDQzMlx1MDQzZVx1MDQzNVx1MDQzZCBcdTA0M2RcdTA0M2VcdTA0MzJcdTA0NGJcdTA0MzkgXHUwNDE4XHUwNDE0IHsxfSwgXHUwNDQyXHUwNDMwXHUwNDNhIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0M2VcdTA0M2QgXHUwNDNkXHUwNDM1IFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzYiBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDE4XHUwNDE0DQoteG1sTGlicmFyeV9pZF9ub3RfdW5pcXVlPVx1MDQxOFx1MDQxNCBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzAgJyd7MH0nJyBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0NDNcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNkXHUwNDM1XHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDM4XHUwNDNjXHUwNDM4IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQzY1x1MDQzOA0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyYS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMmEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMmEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU2MWU2YzguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMzBkYWI3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIFhNTCBFeHBvcnQgKE5MMmEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDRlNjgyMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMmEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGEucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDNlMDEyNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBwbHVnaW4gdGlsIGVrc3BvcnQgYWYgWE1MDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBFeHBvcnQgWE1MIFdpemFyZA0KLWV4cG9ydFhNTFdpemFyZE5hbWU9WE1MDQotZXhwb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249RWtzcG9ydFx1MDBlOXIgbWV0b2RlYmlibGlvdGVrc2luZGhvbGQgdGlsIGVuIFhNTC1maWwuDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXNfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEyZDQ2YTEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXNfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6DQotIw0KLQ0KLSMgRXhwb3J0IFhNTCBXaXphcmQNCi1leHBvcnRYTUxXaXphcmRfdGl0bGU9RWtzcG9ydFx1MDBlOXIgWE1MDQotDQotIyBTZWxlY3QgRXhwb3J0IFR5cGUgV2l6YXJkIFBhZ2UNCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVZcdTAwZTZsZyBkZW4gdHlwZSBtZXRvZGViaWJsaW90ZWtzaW5kaG9sZCwgZGVyIHNrYWwgZWtzcG9ydGVyZXMuDQotZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uX3RleHQ9RWtzcG9ydFx1MDBlOXIgaGVsZSBtZXRvZGViaWJsaW90ZWtldA0KLWV4cG9ydFBsdWdpbnNSYWRpb0J1dHRvbl90ZXh0PUVrc3BvcnRcdTAwZTlyIGVuIGVsbGVyIGZsZXJlIG1ldG9kZS1wbHVnaW5zDQotZXhwb3J0Q29uZmlnc1JhZGlvQnV0dG9uX3RleHQ9RWtzcG9ydFx1MDBlOXIgZW4gbWV0b2Rla29uZmlndXJhdGlvbg0KLQ0KLSMgU2VsZWN0IERlc3RpbmF0aW9uIFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9QW5naXYgZWtzcG9ydGZpbA0KLXNlbGVjdFhNTEZpbGVQYWdlX2Rlc2M9QW5naXYgZW4gWE1MLWRlc3RpbmF0aW9uc2ZpbCwgaHZvciBkZXQgZWtzcG9ydGVyZWRlIG1ldG9kZWJpYmxpb3Rla3NpbmRob2xkIHNrYWwgZ2VtbWVzLg0KLWZpbGVMYWJlbF90ZXh0PVhNTC1maWw6DQotYnJvd3NlQnV0dG9uX3RleHQ9R2VubmVtc2UuLi4NCi0NCi0jIE92ZXJ3cml0ZSBDb25maXJtYXRpb24gRGlhbG9nDQotb3ZlcndyaXRlVGV4dF9tc2c9Jyd7MH0nJyBmaW5kZXMgYWxsZXJlZGUuXG5WaWwgZHUgb3ZlcnNrcml2ZT8NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotZXhwb3J0aW5nWE1MX3RleHQ9RWtzcG9ydGVyZXIgbWV0b2RlYmlibGlvdGVrc2luZGhvbGQgdGlsIFhNTC1maWwuLi4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZFhNTEZpbGVfZXJyb3I9RGVuIGFuZ2l2bmUgWE1MLWZpbCBlciBpa2tlIGd5bGRpZy4NCi1leHBvcnRYTUxXaXphcmRfZXJyb3I9SVVQTTAwMDBFOiBFa3Nwb3J0IGVyIGlra2UgdWRmXHUwMGY4cnQ6IHswfQ0KLWV4cG9ydFhNTFdpemFyZF9yZXZpZXdMb2c9RWtzcG9ydCBlciB1ZGZcdTAwZjhydC4gR2VubmVtc2UgbG9nZmlsZXJuZSBpIGVrc3BvcnRiaWJsaW90ZWtldC4NCi1leHBvcnRYTUxTZXJ2aWNlX2Vycm9yPUZlamwgdW5kZXIgZWtzcG9ydCBhZiBiaWJsaW90ZWs6IHswfQ0KLWV4cG9ydFhNTFNlcnZpY2VfZmVhdHVyZV9lcnJvcj1GZWpsIHVuZGVyIGFuZ2l2ZWxzZSBhZiBmdW5rdGlvbnN2XHUwMGU2cmRpOiBFbGVtZW50PXswfSwgZnVua3Rpb249ezF9DQoteG1sTGlicmFyeV9lcnJvcl9sb2FkX3htbD1LYW4gaWtrZSBpbmRsXHUwMGU2c2UgWE1MLWtpbGRlbiAnJ3swfScnDQoteG1sTGlicmFyeV9ub19wbHVnaW49SW5nZW4gbWV0b2RlLXBsdWdpbiBmb3IgaWQnJ2VuIHswfQ0KLXhtbExpYnJhcnlfbm9fZmVhdHVyZT1LYW4gaWtrZSBoZW50ZSBYTUwtZnVua3Rpb24gZm9yIHswfV97MX0NCi14bWxMaWJyYXJ5X25vX2NsYXNzPUthbiBpa2tlIGhlbnRlIEVDbGFzcyBmb3IgezB9DQoteG1sTGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudD1GZWpsIHVuZGVyIG9wcmV0dGVsc2UgYWYgZWxlbWVudC4gRGV0IHZpZGVzIGlra2UsIGh2b3JkYW4gdlx1MDBlNnJkaSBmb3IgZnVua3Rpb25lbiB7MH0gc2thbCBhbmdpdmVzLg0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlPUZlamwgdW5kZXIgb3ByZXR0ZWxzZSBhZiBlbGVtZW50LiBLYW4gaWtrZSBhbmdpdmUgdlx1MDBlNnJkaWVuIHswfSBmb3Igb3BiZXZhcmluZ3NzdGVkZXQgezF9DQoteG1sTGlicmFyeV9pbnZhbGlkX2ZlYXR1cmVfdmFsdWU9VWd5bGRpZyBhdHRyaWJ1dGZ1bmt0aW9uc3ZcdTAwZTZyZGkgZm9yIGZ1bmt0aW9uZW4gezB9IG1lZCB2XHUwMGU2cmRpZW4gezF9DQoteG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMj1GZWpsIHVuZGVyIGFuZ2l2ZWxzZSBhZiBhdHRyaWJ1dC4gS2FuIGlra2UgYW5naXZlIHZcdTAwZTZyZGkgZm9yIGZ1bmt0aW9uPXswfSwgb2JqZWt0PXsxfSwgdlx1MDBlNnJkaT17Mn0NCi14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8zPURldCB2aWRlcyBpa2tlLCBodm9yZGFuIHZcdTAwZTZyZGkgZm9yIGZ1bmt0aW9uPXswfSwgb2JqZWt0PXsxfSwgdlx1MDBlNnJkaT17Mn0gc2thbCBhbmdpdmVzLg0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZT1GZWpsIHVuZGVyIGFuZ2l2ZWxzZSBhZiByZWZlcmVuY2UuIEthbiBpa2tlIGFuZ2l2ZSB2XHUwMGU2cmRpIGZvciBmdW5rdGlvbj17MH0sIG9iamVrdD17MX0sIHZcdTAwZTZyZGk9ezJ9DQoteG1sTGlicmFyeV9lcnJvcl9wcm9jZXNzX3dyb25nX2NvbnRhaW5lcj1wcm9jZXNzZW4gJyd7MH0nJyBoYXIgaWtrZSBldCBneWxkaWd0IG9wYmV2YXJpbmdzc3RlZC4gT3BiZXZhcmluZ3NzdGVkZXQgZXIgYWYgdHlwZW4gJyd7MX0nJywgc29tIGlra2UgZXIgZW4gcHJvY2VzcGFra2UuDQoteG1sTGlicmFyeV9uZXdfaWQ9RWxlbWVudGV0IHswfSBlciB0aWxkZWx0IG1lZCBlbiBueSBpZCwgezF9LCBmb3JkaSBkZXQgaWtrZSBoYXIgZW4gZ3lsZGlnLg0KLXhtbExpYnJhcnlfaWRfbm90X3VuaXF1ZT1FbGVtZW50LWlkJydlbiAnJ3swfScnIGJydWdlcyBhZiBtZXJlIGVuZCBldCBlbGVtZW50Lg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4ODEzMmUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MWQwNTdkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwxLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogZnJhZ21lbnQKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE2NGYzMTQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1zb3VyY2UubmwxLmphciA9IHNyYy8NCi1vdXRwdXQubmwxLmphciA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBubDEuamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZXMucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2ZyLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9qYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9DTi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgbmwvLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2l0LnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgZnJhZ21lbnQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMS9mcmFnbWVudC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL2ZyYWdtZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmOTFjMjYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL2ZyYWdtZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZyYWdtZW50TmFtZT1FUEYgQ29tcG9zZXIgSGVscCBEb2N1bWVudHMgKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwMDZkMTguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBEb2t1bWVudGF0aW9uDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxM2U3ZTE0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RG9jdW1lbnRhY2lcdTAwZjNuIGRlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzAxNzE2Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPURvY3VtZW50YXRpb24gRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YzVjZDZhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMS9wbHVnaW5faXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RG9jdW1lbnRhemlvbmUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NmExN2Y5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMS9wbHVnaW5famEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIERvY3VtZW50YXRpb24NCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJjMmIyNzUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHViYjM4XHVjMTFjDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OGMxNmYzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RG9jdW1lbnRhXHUwMGU3XHUwMGUzbyBkbyBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc5YTgxNDMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHU2NTg3XHU2ODYzDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NmExN2Y5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIERvY3VtZW50YXRpb24NCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiY2I1YTg3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQwMDMzZS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc3BhdGg6IG5sMi5qYXIKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYztidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGZyYWdtZW50Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NTZhOTJlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UubmwyLmphciA9IHNyYy8NCi1vdXRwdXQubmwyLmphciA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBubDIuamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcnUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgbmwvLFwNCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIGZyYWdtZW50LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDIvZnJhZ21lbnQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMi9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZTM1ODQ0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMi9mcmFnbWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mcmFnbWVudE5hbWU9RVBGIENvbXBvc2VyIEhlbHAgRG9jdW1lbnRzIChOTDIpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNmE1ZDcwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9XHUwNDE0XHUwNDNlXHUwNDNhXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMmEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMmEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDJhLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwyYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzQ3NWNkNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwyYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YWNmOTg0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDJhLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogZnJhZ21lbnQKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMmEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDJjNDVmMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS5ubDJhLmphciA9IHNyYy8NCi1vdXRwdXQubmwyYS5qYXIgPSBiaW4vDQotYmluLmluY2x1ZGVzID0gbmwyYS5qYXIsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBubC8sXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgZnJhZ21lbnQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMmEvZnJhZ21lbnQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMmEvZnJhZ21lbnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjkwMjNlNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5ubDJhL2ZyYWdtZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZyYWdtZW50TmFtZT1FUEYgQ29tcG9zZXIgSGVscCBEb2N1bWVudHMgKE5MMmEpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzZGU2MzEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gZG9rdW1lbnRhdGlvbg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODE5NmEzMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMThkYmMwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBJbXBvcnQgKE5MMSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2YTRhNmYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZXMucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2ZyLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9qYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9UVy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RlLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9pdC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5fZGUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIyNTk3ZDMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5fZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gSW1wb3J0aWVyZW4NCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIEltcG9ydCBXaXphcmQgQ2F0ZWdvcnkNCi1pbXBvcnRDYXRlZ29yeU5hbWU9TWV0aG9kZQ0KLQ0KLSMgSW1wb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1pbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZE5hbWU9QmlibGlvdGhla3Nrb25maWd1cmF0aW9uDQotaW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmRUZXh0PUltcG9ydGllcmVuIFNpZSBlaW5lIEJpYmxpb3RoZWtza29uZmlndXJhdGlvbi4NCi0NCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotaW1wb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9TWV0aG9kZW4tUGx1Zy1pbnMNCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkVGV4dD1JbXBvcnRpZXJlbiBTaWUgZWluZSBvZGVyIG1laHJlcmUgTWV0aG9kZW4tUGx1Zy1pbnMuDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5fZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhYzBkZDYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9SW1wb3J0YWNpXHUwMGYzbiBkZSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIEltcG9ydCBXaXphcmQgQ2F0ZWdvcnkNCi1pbXBvcnRDYXRlZ29yeU5hbWU9TVx1MDBlOXRvZG8NCi0NCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotaW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lPUNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBsYSBiaWJsaW90ZWNhDQotaW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmRUZXh0PUltcG9ydGFyIHVuYSBjb25maWd1cmFjaVx1MDBmM24gZGUgbGEgYmlibGlvdGVjYS4NCi0NCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotaW1wb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9UGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8NCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkVGV4dD1JbXBvcnRhciB1bm8gbyB2YXJpb3MgcGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8uDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5fZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyMGIwY2IuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5fZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9SW1wb3J0YXRpb24gRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBJbXBvcnQgV2l6YXJkIENhdGVnb3J5DQotaW1wb3J0Q2F0ZWdvcnlOYW1lPU1cdTAwZTl0aG9kZQ0KLQ0KLSMgSW1wb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1pbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZE5hbWU9Q29uZmlndXJhdGlvbiBkZSBiaWJsaW90aFx1MDBlOHF1ZQ0KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkVGV4dD1JbXBvcnRhdGlvbiBkJ3VuZSBjb25maWd1cmF0aW9uIGRlIGJpYmxpb3RoXHUwMGU4cXVlLg0KLQ0KLSMgSW1wb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkTmFtZT1QbHVnLWlucyBkZSBtXHUwMGU5dGhvZGUNCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkVGV4dD1JbXBvcnRhdGlvbiBkJ3VuIG91IHBsdXNpZXVycyBwbHVnLWlucyBkZSBtXHUwMGU5dGhvZGUuDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5faXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQxY2UyNmYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5faXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9SW1wb3J0YSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIEltcG9ydCBXaXphcmQgQ2F0ZWdvcnkNCi1pbXBvcnRDYXRlZ29yeU5hbWU9TWV0b2RvDQotDQotIyBJbXBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1Db25maWd1cmF6aW9uZSBkaSBsaWJyZXJpYQ0KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkVGV4dD1JbXBvcnRhcmUgdW5hIGNvbmZpZ3VyYXppb25lIGRpIGxpYnJlcmlhLg0KLQ0KLSMgSW1wb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkTmFtZT1QbHVnLWluIGRlbCBtZXRvZG8NCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkVGV4dD1JbXBvcnRhcmUgdW5vIG8gcGlcdTAwZjkgcGx1Zy1pbiBkaSBtZXRvZG8uDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5famEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0MTIyOTEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5famEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIEltcG9ydA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgSW1wb3J0IFdpemFyZCBDYXRlZ29yeQ0KLWltcG9ydENhdGVnb3J5TmFtZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzkNCi0NCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotaW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lPVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1NjljYlx1NjIxMA0KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkVGV4dD1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTY5Y2JcdTYyMTBcdTMwOTJcdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotaW1wb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzDQotaW1wb3J0TWV0aG9kUGx1Z2luc1dpemFyZFRleHQ9MSBcdTMwNjRcdTRlZTVcdTRlMGFcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwOTJcdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTNmMzJlNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHVhYzAwXHVjODM4XHVjNjI0XHVhZTMwDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBJbXBvcnQgV2l6YXJkIENhdGVnb3J5DQotaW1wb3J0Q2F0ZWdvcnlOYW1lPVx1YmE1NFx1YzE4Y1x1YjRkYw0KLQ0KLSMgSW1wb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1pbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZE5hbWU9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YWQ2Y1x1YzEzMQ0KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkVGV4dD1cdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YWMwMFx1YzgzOFx1YzYzNVx1YjJjOFx1YjJlNC4NCi0NCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotaW1wb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9XHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OA0KLWltcG9ydE1ldGhvZFBsdWdpbnNXaXphcmRUZXh0PVx1ZDU1OFx1YjA5OCBcdWM3NzRcdWMwYzFcdWM3NTggXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc0NCBcdWFjMDBcdWM4MzhcdWM2MzVcdWIyYzhcdWIyZTQuDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVjNDE3ODMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9SW1wb3J0YVx1MDBlN1x1MDBlM28gZG8gRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBJbXBvcnQgV2l6YXJkIENhdGVnb3J5DQotaW1wb3J0Q2F0ZWdvcnlOYW1lPU1cdTAwZTl0b2RvDQotDQotIyBJbXBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1Db25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIEJpYmxpb3RlY2ENCi1pbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZFRleHQ9SW1wb3J0YXIgdW1hIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGUgYmlibGlvdGVjYS4NCi0NCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotaW1wb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9UGx1Zy1pbnMgZGUgTVx1MDBlOXRvZG8NCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkVGV4dD1JbXBvcnRhciB1bSBvdSBtYWlzIHBsdWctaW5zIGRlIG1cdTAwZTl0b2RvLg0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMzEyMGFlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdTViZmNcdTUxNjUNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIEltcG9ydCBXaXphcmQgQ2F0ZWdvcnkNCi1pbXBvcnRDYXRlZ29yeU5hbWU9XHU2NWI5XHU2Y2Q1DQotDQotIyBJbXBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1cdTVlOTNcdTkxNGRcdTdmNmUNCi1pbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZFRleHQ9XHU1YmZjXHU1MTY1XHU1ZTkzXHU5MTRkXHU3ZjZlXHUzMDAyDQotDQotIyBJbXBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZA0KLWltcG9ydE1ldGhvZFBsdWdpbnNXaXphcmROYW1lPVx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNg0KLWltcG9ydE1ldGhvZFBsdWdpbnNXaXphcmRUZXh0PVx1NWJmY1x1NTE2NVx1NGUwMFx1NGUyYVx1NjIxNlx1NTkxYVx1NGUyYVx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNlx1MzAwMg0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MWUzOGQzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBJbXBvcnQNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIEltcG9ydCBXaXphcmQgQ2F0ZWdvcnkNCi1pbXBvcnRDYXRlZ29yeU5hbWU9XHU2NWI5XHU2Y2Q1DQotDQotIyBJbXBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1cdTdhMGJcdTVmMGZcdTVlYWJcdTkxNGRcdTdmNmUNCi1pbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZFRleHQ9XHU1MzJmXHU1MTY1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU5MTRkXHU3ZjZlXHUzMDAyDQotDQotIyBJbXBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZA0KLWltcG9ydE1ldGhvZFBsdWdpbnNXaXphcmROYW1lPVx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZg0KLWltcG9ydE1ldGhvZFBsdWdpbnNXaXphcmRUZXh0PVx1NTMyZlx1NTE2NVx1NGUwMFx1NjIxNlx1NTkxYVx1NTAwYlx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1MzAwMg0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOTg4ZTg4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOiBJVVBFMDIwMEUgLSBJVVBFMDI5OUUNCi0jDQotDQotIyBJbXBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWltcG9ydENvbmZpZ1dpemFyZF90aXRsZT1CaWJsaW90aGVrc2tvbmZpZ3VyYXRpb24gaW1wb3J0aWVyZW4NCi1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RpdGxlPUltcG9ydHZlcnplaWNobmlzIGFuZ2ViZW4NCi1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RleHQ9R2ViZW4gU2llIGRhcyBWZXJ6ZWljaG5pcyBtaXQgZGVyIHp1IGltcG9ydGllcmVuZGVuIEJpYmxpb3RoZWtza29uZmlndXJhdGlvbiBhbi4NCi1yZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90aXRsZT1BbiBkZXIgQmlibGlvdGhlayB2b3JnZW5vbW1lbmUgXHUwMGM0bmRlcnVuZ2VuIHByXHUwMGZjZmVuDQotcmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGV4dD1Qclx1MDBmY2ZlbiBTaWUgZGllIFx1MDBjNG5kZXJ1bmdlbiwgZGllIGFuIGRlciBha3R1ZWxsZW4gTWV0aG9kZW5iaWJsaW90aGVrIHZvcmdlbm9tbWVuIHdlcmRlbi4NCi1zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGl0bGU9S29uZmlndXJhdGlvbnNzcGV6aWZpa2F0aW9uZW4gYXVzd1x1MDBlNGhsZW4NCi1zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGV4dD1XXHUwMGU0aGxlbiBTaWUgbWluZGVzdGVucyBlaW5lIHp1IGltcG9ydGllcmVuZGUgS29uZmlndXJhdGlvbnNzcGV6aWZpa2F0aW9uIGF1cy4NCi0NCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotaW1wb3J0UGx1Z2luc1dpemFyZF90aXRsZT1NZXRob2Rlbi1QbHVnLWlucyBpbXBvcnRpZXJlbg0KLXNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RpdGxlPUltcG9ydHZlcnplaWNobmlzIGFuZ2ViZW4NCi1zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90ZXh0PUdlYmVuIFNpZSBkYXMgVmVyemVpY2huaXMgbWl0IGRlbiB6dSBpbXBvcnRpZXJlbmRlbiBNZXRob2Rlbi1QbHVnLWlucyBhbi4NCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90aXRsZT1NZXRob2Rlbi1QbHVnLWlucyBhdXN3XHUwMGU0aGxlbg0KLXNlbGVjdFBsdWdpbnNXaXphcmRQYWdlX3RleHQ9V1x1MDBlNGhsZW4gU2llIG1pbmRlc3RlbnMgZWluIHp1IGltcG9ydGllcmVuZGVzIE1ldGhvZGVuLVBsdWctaW4gYXVzLiBXZW5uIGVpbiBhdXNnZXdcdTAwZTRobHRlcyBQbHVnLWluIGJlcmVpdHMgaW4gZGVyIGFrdHVlbGxlbiBNZXRob2RlbmJpYmxpb3RoZWsgdm9yaGFuZGVuIGlzdCwgXHUwMGZjYmVycHJcdTAwZmNmZW4gU2llIGRpZSBWZXJzaW9uc2RpZmZlcmVuemVuLg0KLWltcG9ydFBsdWdpbnNXaXphcmRfRVJSX0ltcG9ydF9wbHVnaW49SW1wb3J0IGRlcyBQbHVnLWlucyBmZWhsZ2VzY2hsYWdlbg0KLQ0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzA9QXVzZ2V3XHUwMGU0aGx0ZSBCaWJsaW90aGVrc2tvbmZpZ3VyYXRpb24gd2lyZCB2YWxpZGllcnQuLi4NCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cxPURhcyBhbmdlZ2ViZW5lIFZlcnplaWNobmlzIGVudGhcdTAwZTRsdCBrZWluZSBnXHUwMGZjbHRpZ2UgS29uZmlndXJhdGlvbi4NCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0czPU1ldGhvZGVua29uZmlndXJhdGlvbiB3aXJkIGltcG9ydGllcnQuLi4NCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cyPURpZSBkZXJ6ZWl0IGdlXHUwMGY2ZmZuZXRlIEJpYmxpb3RoZWsga2FubiBuaWNodCBpbiBzaWNoIHNlbGJzdCBpbXBvcnRpZXJ0IHdlcmRlbi4NCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX01TRzE9TWV0aG9kZW5rb25maWd1cmF0aW9uIHdpcmQgaW1wb3J0aWVydC4uLg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfRVJSX0ltcG9ydF9jb25maWd1cmF0aW9uPUltcG9ydCBkZXIgS29uZmlndXJhdGlvbiBmZWhsZ2VzY2hsYWdlbg0KLQ0KLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF90aXRsZT1BdXNjaGVja2VuIGZlaGxnZXNjaGxhZ2VuDQotRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX21zZz1FaW5pZ2UgRGF0ZWllbiB3dXJkZW4gbmljaHQgYXVzZ2VjaGVja3QuIE1cdTAwZjZjaHRlbiBTaWUgZGVuIFZvcmdhbmcgd2llZGVyaG9sZW4/DQotDQotSW1wb3J0Q29uZmlnUmVwb3J0UGFnZV90aXRsZT1Lb25maWd1cmF0aW9uc2JlcmljaHQgaW1wb3J0aWVyZW4NCi1JbXBvcnRQbHVnaW5XaXphcmRfcmVhZG9ubHk9SVVQRTAyMDFFOiBEaWUgQmlibGlvdGhlayBpc3Qgc2NocmVpYmdlc2NoXHUwMGZjdHp0Lg0KLUltcG9ydFBsdWdpbldpemFyZF9NU0cxPU1ldGhvZGVuLVBsdWctaW4gd2lyZCBpbXBvcnRpZXJ0Li4uDQotSW1wb3J0UGx1Z2luV2l6YXJkX2Vycm9yPUZlaGxlcg0KLUltcG9ydFBsdWdpbldpemFyZF93YXJuX2V4aXN0aW5nX3BsdWdpbnM9SVVQRTAyMDBFOiBEaWUgZm9sZ2VuZGVuIGF1c2dld1x1MDBlNGhsdGVuIFBsdWctaW5zIHNpbmQgYmVyZWl0cyB2b3JoYW5kZW4uIFdlbm4gU2llIGRpZXNlIFBsdWctaW5zIGVybmV1dCBpbXBvcnRpZXJlbiwgd2VyZGVuIGRpZSB2b3JoYW5kZW5lbiBcdTAwZmNiZXJzY2hyaWViZW46XG5cbiB7MH0gXG5cbk1cdTAwZjZjaHRlbiBTaWUgZGVuIFZvcmdhbmcgZm9ydHNldHplbj8NCi1JbXBvcnRQbHVnaW5XaXphcmRfY29uZmlybV9jb250aW51ZT1cblxuTVx1MDBmNmNodGVuIFNpZSBkZW4gVm9yZ2FuZyB3aXJrbGljaCBmb3J0c2V0emVuPw0KLQ0KLVNlbGVjdENvbmZpZ3NUb0ltcG9ydF9sYWJlbDE9RGllIGZvbGdlbmRlbiBFbGVtZW50ZSB3ZXJkZW4gaW1wb3J0aWVydDoNCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yPUZlaGxlcg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfTVNHMT1BbmFseXNlIGxcdTAwZTR1ZnQNCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV90aXRsZTI9WnUgaW1wb3J0aWVyZW5kZSBLb25maWd1cmF0aW9uc3NwZXppZmlrYXRpb25lbiBhdXN3XHUwMGU0aGxlbg0KLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub3RfdXNlZD1ub3RfdXNlZA0KLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19wYXRoPURhcyBhbmdlZ2ViZW5lIFZlcnplaWNobmlzIGlzdCBuaWNodCB2b3JoYW5kZW4uDQotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX2Rpcj1FcyB3dXJkZSBrZWluIFZlcnplaWNobmlzIGFuZ2VnZWJlbi4NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfcGx1Z2lucz1WZXJmXHUwMGZjZ2JhcmUgUGx1Zy1pbnMgaW0gSW1wb3J0dmVyemVpY2huaXM6DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvcj1BdXRvcjoNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfdmVyc2lvbj1WZXJzaW9uOg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9kZXNjPUt1cnpiZXNjaHJlaWJ1bmc6DQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUU6IERpZSBCaWJsaW90aGVrIGlzdCBzY2hyZWliZ2VzY2hcdTAwZmN0enQuDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cwPUF1c2dld1x1MDBlNGhsdGUgUGx1Zy1pbnMgd2VyZGVuIHZhbGlkaWVydC4uLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMT1EZXIgYW5nZWdlYmVuZSBQZmFkIGVudGhcdTAwZTRsdCBrZWluIGdcdTAwZmNsdGlnZXMgTWV0aG9kZW4tUGx1Zy1pbi4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzM9TWV0aG9kZW4tUGx1Zy1pbiB3aXJkIGltcG9ydGllcnQuLi4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzU9RGFzIGF1c2dld1x1MDBlNGhsdGUgTWV0aG9kZW4tUGx1Zy1pbiBrYW5uIG5pY2h0IGltcG9ydGllcnQgd2VyZGVuLiBEYXMgenVnZWhcdTAwZjZyaWdlIGFiaFx1MDBlNG5naWdlIFBsdWctaW4gJyd7MH0nJyB3dXJkZSBuaWNodCBpbiBkZXIgYWt0dWVsbGVuIE1ldGhvZGVuYmlibGlvdGhlayBnZWZ1bmRlbi4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzY9RGFzIGF1c2dld1x1MDBlNGhsdGUgTWV0aG9kZW4tUGx1Zy1pbiBrYW5uIG5pY2h0IGltcG9ydGllcnQgd2VyZGVuLiBFaW4genVnZWhcdTAwZjZyaWdlcyBhYmhcdTAwZTRuZ2lnZXMgUGx1Zy1pbiB3dXJkZSBuaWNodCBpbiBkZXIgYWt0dWVsbGVuIE1ldGhvZGVuYmlibGlvdGhlayBnZWZ1bmRlbi4NCi1EaWZmUmVwb3J0Vmlld2VyX2NvbnRlbnQ9SW5oYWx0DQotRGlmZlJlcG9ydFZpZXdlcl9pbl9pbXBvcnQ9SW0gSW1wb3J0DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X01TRzE9RGF0ZWllbiB3ZXJkZW4gYW5hbHlzaWVydC4uLg0KLURpZmZSZXBvcnRMYWJlbFByb3ZpZGVyX3llcz1KYQ0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9lcnJvcj1GZWhsZXINCi1EaWZmUmVwb3J0Vmlld2VyX2luX2xpYj1JbiBkZXIgQmlibGlvdGhlaw0KLURpZmZSZXBvcnRWaWV3ZXJfc3RhdHVzPVN0YXR1cw0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luRXhpc3RzPUF1c2dld1x1MDBlNGhsdGVzIFBsdWctaW4gd3VyZGUgaW4gYWt0dWVsbGVyIEJpYmxpb3RoZWsgZ2VmdW5kZW4NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGlicmFyeVBsdWdpbk5vdEV4aXN0cz1BdXNnZXdcdTAwZTRobHRlcyBQbHVnLWluIHd1cmRlIG5pY2h0IGluIGFrdHVlbGxlciBCaWJsaW90aGVrIGdlZnVuZGVuDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNFeGlzdHM9S29uZmlndXJhdGlvbiB3dXJkZSBpbiBkZXIgYWt0dWVsbGVuIEJpYmxpb3RoZWsgZ2VmdW5kZW4NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjTm9TZWxlY3Rpb249RXMgd3VyZGUga2VpbmUgS29uZmlndXJhdGlvbnNzcGV6aWZpa2F0aW9uIGF1c2dld1x1MDBlNGhsdC4NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjRGF0YUxhYmVsPUF1c2dld1x1MDBlNGhsdGUgS29uZmlndXJhdGlvbiBpbSBJbXBvcnR2ZXJ6ZWljaG5pcw0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2NvbmZpZ3M9VmVyZlx1MDBmY2diYXJlIEtvbmZpZ3VyYXRpb25zc3BlemlmaWthdGlvbmVuIGltIEltcG9ydHZlcnplaWNobmlzOg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm90X3VzZWQ9bm90X3VzZWQNCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9kZXNjPUt1cnpiZXNjaHJlaWJ1bmc6DQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19wYXRoPURlciBhbmdlZ2ViZW5lIFBmYWQgaXN0IG5pY2h0IHZvcmhhbmRlbi4NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luTm9TZWxlY3Rpb249RXMgd3VyZGUga2VpbiBQbHVnLWluIGF1c2dld1x1MDBlNGhsdC4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX2Rpcj1FcyB3dXJkZSBrZWluIFZlcnplaWNobmlzIGFuZ2VnZWJlbi4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9yZWFkb25seT1EYXMgUGx1Zy1pbiB7MH0gaXN0IHNjaHJlaWJnZXNjaFx1MDBmY3R6dC5cbg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX2xvY2tlZD1JVVBFMDIwM0U6IERhcyBQbHVnLWluIHswfSBpc3QgZ2VzcGVycnQuXG4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX2Vycm9yX25vdF91cGRhdGFibGU9RWluaWdlIGRlciBQbHVnLWlucyBpbiBkZXIgQmlibGlvdGhlayBpc3QgZ2VzcGVycnQgb2RlciBzY2hyZWliZ2VzY2hcdTAwZmN0enQuXG5HZWJlbiBTaWUgZGllIFBsdWctaW5zIGZyZWkgdW5kIHN0ZWxsZW4gU2llIHNpY2hlciwgZGFzcyBkaWUgRGF0ZWllbiBha3R1YWxpc2llcnQgd2VyZGVuIGtcdTAwZjZubmVuLg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5EYXRhTGFiZWw9QXVzZ2V3XHUwMGU0aGx0ZXMgUGx1Zy1pbiBpbSBJbXBvcnR2ZXJ6ZWljaG5pcw0KLURpZmZSZXBvcnRWaWV3ZXJfdHlwZT1JbmhhbHRzdHlwDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNOb3RFeGlzdHM9RGllIGF1c2dld1x1MDBlNGhsdGUgS29uZmlndXJhdGlvbiB3dXJkZSBuaWNodCBpbiBkZXIgYWt0dWVsbGVuIEJpYmxpb3RoZWsgZ2VmdW5kZW4uDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGE9SVVQRTAyMDRFOiBEaWUgYW5nZWdlYmVuZW4gRGF0ZWllbiB3dXJkZW4gbWl0IGVpbmVyIGZyXHUwMGZjaGVyZW4gVmVyc2lvbiAoezB9KSB2b24gezF9IGV4cG9ydGllcnQuIFNpZSBtXHUwMGZjc3NlbiBEYXRlaWVuIG1pdCBkZXIgYWt0dWVsbGVuIFZlcnNpb24gdm9uIHsxfSBleHBvcnRpZXJlbi4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duPUlVUEUwMjA1RTogRGllIGFuZ2VnZWJlbmVuIERhdGVpZW4gd3VyZGVuIG1pdCBlaW5lciBmclx1MDBmY2hlcmVuIFZlcnNpb24gdm9uIHswfSBleHBvcnRpZXJ0LiBTaWUgbVx1MDBmY3NzZW4gRGF0ZWllbiBtaXQgZGVyIGFrdHVlbGxlbiBWZXJzaW9uIHZvbiB7MH0gZXhwb3J0aWVyZW4uDQotdmVyc2lvbk1pc21hdGNoX29sZFRvb2w9SVVQRTAyMDZFOiBEaWUgYW5nZWdlYmVuZW4gRGF0ZWllbiB3dXJkZW4gbWl0IGVpbmVyIG5ldWVyZW4gVmVyc2lvbiAoezB9KSB2b24gezF9IGV4cG9ydGllcnQuIFNpZSBtXHUwMGZjc3NlbiBlaW5lbiBVcGdyYWRlIHZvbiB7MX0gZHVyY2hmXHUwMGZjaHJlbiwgdW0gZGllIERhdGVpZW4gaW1wb3J0aWVyZW4genUga1x1MDBmNm5uZW4uIA0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQRTAyMDdFOiBEaWUgYW5nZWdlYmVuZW4gRGF0ZWllbiBrXHUwMGY2bm5lbiBuaWNodCBnZVx1MDBmNmZmbmV0IHdlcmRlbi4gU2llIG1cdTAwZmNzc2VuIGVpbmVuIFVwZ3JhZGUgdm9uIHswfSBkdXJjaGZcdTAwZmNocmVuLCB1bSBkaWUgRGF0ZWllbiBpbXBvcnRpZXJlbiB6dSBrXHUwMGY2bm5lbi4gDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlMWU2MDYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMjAwRSAtIElVUEUwMjk5RQ0KLSMNCi0NCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlPUltcG9ydGFyIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBsYSBiaWJsaW90ZWNhDQotc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90aXRsZT1Fc3BlY2lmaWNhciBkaXJlY3RvcmlvIGRlIGltcG9ydGFjaVx1MDBmM24NCi1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RleHQ9RXNwZWNpZmlxdWUgZWwgZGlyZWN0b3JpbyBxdWUgY29udGllbmUgbGEgY29uZmlndXJhY2lcdTAwZjNuIGRlIGxhIGJpYmxpb3RlY2EgcGFyYSBpbXBvcnRhci4NCi1yZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90aXRsZT1SZXZpc2FyIGNhbWJpb3MgZGUgbGEgYmlibGlvdGVjYQ0KLXJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RleHQ9UmV2aXNlIGxvcyBjYW1iaW9zIHF1ZSBzZSByZWFsaXphclx1MDBlMW4gZW4gbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgYWN0dWFsLg0KLXNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90aXRsZT1TZWxlY2Npb25hciBlc3BlY2lmaWNhY2lvbmVzIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbg0KLXNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90ZXh0PVNlbGVjY2lvbmUgdW5hIG8gdmFyaWFzIGVzcGVjaWZpY2FjaW9uZXMgZGUgbGEgY29uZmlndXJhY2lcdTAwZjNuIHBhcmEgaW1wb3J0YXIuDQotDQotIyBJbXBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZA0KLWltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGU9SW1wb3J0YXIgcGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8NCi1zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90aXRsZT1Fc3BlY2lmaWNhciBkaXJlY3RvcmlvIGRlIGltcG9ydGFjaVx1MDBmM24NCi1zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90ZXh0PUVzcGVjaWZpcXVlIGVsIGRpcmVjdG9yaW8gcXVlIGNvbnRpZW5lIGxvcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbyBwYXJhIGltcG9ydGFyLg0KLXNlbGVjdFBsdWdpbnNXaXphcmRQYWdlX3RpdGxlPVNlbGVjY2lvbmFyIHBsdWctaW5zIGRlIG1cdTAwZTl0b2RvDQotc2VsZWN0UGx1Z2luc1dpemFyZFBhZ2VfdGV4dD1TZWxlY2Npb25lIHVubyBvIHZhcmlvcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbyBwYXJhIGltcG9ydGFyLiBTaSB5YSBoYXkgdW4gcGx1Zy1pbiBzZWxlY2Npb25hZG8gZW4gbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgYWN0dWFsLCBjb21wcnVlYmUgbGFzIGRpZmVyZW5jaWFzIGRlIGxhIHZlcnNpXHUwMGYzbi4NCi1pbXBvcnRQbHVnaW5zV2l6YXJkX0VSUl9JbXBvcnRfcGx1Z2luPUxhIGltcG9ydGFjaVx1MDBmM24gZGVsIHBsdWctaW4gaGEgZmFsbGFkbw0KLQ0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzA9VmFsaWRhbmRvIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBsYSBiaWJsaW90ZWNhIHNlbGVjY2lvbmFkYS4uLg0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzE9RWwgZGlyZWN0b3JpbyBlc3BlY2lmaWNhZG8gbm8gY29udGllbmUgdW5hIGNvbmZpZ3VyYWNpXHUwMGYzbiB2XHUwMGUxbGlkYS4NCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0czPUltcG9ydGFuZG8gbGEgY29uZmlndXJhY2lcdTAwZjNuIGRlIG1cdTAwZTl0b2RvLi4uDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMj1ObyBwdWVkZSBpbXBvcnRhcnNlIHNvYnJlIHNcdTAwZWQgbWlzbWEgbGEgYmlibGlvdGVjYSBhYmllcnRhIGFjdHVhbG1lbnRlLg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfTVNHMT1JbXBvcnRhbmRvIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kby4uLg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfRVJSX0ltcG9ydF9jb25maWd1cmF0aW9uPUxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBsYSBpbXBvcnRhY2lcdTAwZjNuIGhhIGZhbGxhZG8NCi0NCi1GaWxlTW9kaWZ5Q2hlY2tlcl9DaGVja291dF9mYWlsZWRfdGl0bGU9TGEgY29uZmlybWFjaVx1MDBmM24gaGEgZmFsbGFkbw0KLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF9tc2c9QWxndW5vcyBhcmNoaXZvcyBubyBzZSBoYW4gY29uZmlybWFkbywgXHUwMGJmZGVzZWEgaW50ZW50YXJsbyBkZSBudWV2bz8NCi0NCi1JbXBvcnRDb25maWdSZXBvcnRQYWdlX3RpdGxlPUltcG9ydGFuZG8gZWwgaW5mb3JtZSBkZSBjb25maWd1cmFjaVx1MDBmM24NCi1JbXBvcnRQbHVnaW5XaXphcmRfcmVhZG9ubHk9SVVQRTAyMDFFOiBMYSBiaWJsaW90ZWNhIGVzIGRlIHNcdTAwZjNsbyBsZWN0dXJhLg0KLUltcG9ydFBsdWdpbldpemFyZF9NU0cxPUltcG9ydGFuZG8gZWwgcGx1Zy1pbiBkZSBtXHUwMGU5dG9kby4uLg0KLUltcG9ydFBsdWdpbldpemFyZF9lcnJvcj1FcnJvcg0KLUltcG9ydFBsdWdpbldpemFyZF93YXJuX2V4aXN0aW5nX3BsdWdpbnM9SVVQRTAyMDBFOiBFbCBzaWd1aWVudGUgcGx1Zy1pbiBzZWxlY2Npb25hZG8geWEgZXhpc3RlIHksIHNpIHNlIHZ1ZWx2ZSBhIGltcG9ydGFyLCBzb2JyZXNjcmliaXJcdTAwZTEgZWwgcGx1Zy1pbiBleGlzdGVudGU6XG5cbiB7MH0gXG5cblx1MDBiZkVzdFx1MDBlMSBzZWd1cm8gZGUgcXVlIGRlc2VhIGNvbnRpbnVhcj8NCi1JbXBvcnRQbHVnaW5XaXphcmRfY29uZmlybV9jb250aW51ZT1cblxuXHUwMGJmRXN0XHUwMGUxIHNlZ3VybyBkZSBxdWUgZGVzZWEgY29udGludWFyPw0KLQ0KLVNlbGVjdENvbmZpZ3NUb0ltcG9ydF9sYWJlbDE9U2UgaW1wb3J0YXJcdTAwZTFuIGxvcyBzaWd1aWVudGVzIGVsZW1lbnRvczoNCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yPUVycm9yDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9NU0cxPUFuYWxpemFuZG8NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV90aXRsZTI9U2VsZWNjaW9uYXIgZXNwZWNpZmljYWNpb25lcyBkZSBsYSBjb25maWd1cmFjaVx1MDBmM24gcGFyYSBpbXBvcnRhcg0KLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub3RfdXNlZD1ubyBzZSB1dGlsaXphDQotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX3BhdGg9RWwgZGlyZWN0b3JpbyBlc3BlY2lmaWNhZG8gbm8gZXhpc3RlLg0KLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19kaXI9Tm8gc2UgaGEgZXNwZWNpZmljYWRvIG5pbmdcdTAwZmFuIGRpcmVjdG9yaW8NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfcGx1Z2lucz1QbHVnLWlucyBkaXNwb25pYmxlcyBlbiBlbCBkaXJlY3RvcmlvIGRlIGltcG9ydGFjaVx1MDBmM246DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvcj1BdXRvcjoNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfdmVyc2lvbj1WZXJzaVx1MDBmM246DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2Rlc2M9RGVzY3JpcGNpXHUwMGYzbiBicmV2ZToNCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX3JlYWRvbmx5PUlVUEUwMjAxRTogTGEgYmlibGlvdGVjYSBlcyBkZSBzXHUwMGYzbG8gbGVjdHVyYS4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzA9VmFsaWRhbmRvIGxvcyBwbHVnLWlucyBzZWxlY2Npb25hZG9zLi4uDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cxPUxhIHZcdTAwZWRhIGRlIGFjY2VzbyBlc3BlY2lmaWNhZGEgbm8gY29udGllbmUgdW4gcGx1Zy1pbiBkZSBtXHUwMGU5dG9kbyB2XHUwMGUxbGlkby4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzM9SW1wb3J0YW5kbyBlbCBwbHVnLWluIGRlIG1cdTAwZTl0b2RvLi4uDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c1PU5vIHNlIHB1ZWRlIGltcG9ydGFyIGVsIHBsdWctaW4gZGUgbVx1MDBlOXRvZG8gc2VsZWNjaW9uYWRvLiBFbCBwbHVnLWluIGRlcGVuZGllbnRlICcnezB9Jycgbm8gc2UgcHVlZGUgZW5jb250cmFyIGVuIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGFjdHVhbC4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzY9Tm8gc2UgcHVlZGUgaW1wb3J0YXIgZWwgcGx1Zy1pbiBkZSBtXHUwMGU5dG9kbyBzZWxlY2Npb25hZG8uIE5vIHNlIHB1ZWRlIGVuY29udHJhciB1biBwbHVnLWluIGRlcGVuZGllbnRlIGVuIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGFjdHVhbC4NCi1EaWZmUmVwb3J0Vmlld2VyX2NvbnRlbnQ9Q29udGVuaWRvDQotRGlmZlJlcG9ydFZpZXdlcl9pbl9pbXBvcnQ9RW4gaW1wb3J0YWNpXHUwMGYzbg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9NU0cxPUFuYWxpemFuZG8gYXJjaGl2b3MuLi4NCi1EaWZmUmVwb3J0TGFiZWxQcm92aWRlcl95ZXM9U1x1MDBlZA0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9lcnJvcj1FcnJvcg0KLURpZmZSZXBvcnRWaWV3ZXJfaW5fbGliPUVuIGxhIGJpYmxpb3RlY2ENCi1EaWZmUmVwb3J0Vmlld2VyX3N0YXR1cz1Fc3RhZG8NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGlicmFyeVBsdWdpbkV4aXN0cz1TZSBoYSBlbmNvbnRyYWRvIGVsIHBsdWctaW4gc2VsZWNjaW9uYWRvIGVuIGxhIGJpYmxpb3RlY2EgYWN0dWFsDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5Ob3RFeGlzdHM9Tm8gc2UgaGEgcG9kaWRvIGVuY29udHJhciBlbCBwbHVnLWluIHNlbGVjY2lvbmFkbyBlbiBsYSBiaWJsaW90ZWNhIGFjdHVhbA0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjRXhpc3RzPVNlIGhhIGVuY29udHJhZG8gbGEgY29uZmlndXJhY2lcdTAwZjNuIGVuIGxhIGJpYmxpb3RlY2EgYWN0dWFsDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY05vU2VsZWN0aW9uPU5vIHNlIGhhIHNlbGVjY2lvbmFkbyBuaW5ndW5hIGVzcGVjaWZpY2FjaVx1MDBmM24gZGUgbGEgY29uZmlndXJhY2lcdTAwZjNuLg0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNEYXRhTGFiZWw9Q29uZmlndXJhY2lcdTAwZjNuIHNlbGVjY2lvbmFkYSBlbiBlbCBkaXJlY3RvcmlvIGRlIGltcG9ydGFjaVx1MDBmM24NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9jb25maWdzPUVzcGVjaWZpY2FjaW9uZXMgZGUgbGEgY29uZmlndXJhY2lcdTAwZjNuIGRpc3BvbmlibGVzIGVuIGVsIGRpcmVjdG9yaW8gZGUgaW1wb3J0YWNpXHUwMGYzbjoNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkPW5vIHNlIHV0aWxpemENCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9kZXNjPURlc2NyaXBjaVx1MDBmM24gYnJldmU6DQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19wYXRoPUxhIHZcdTAwZWRhIGRlIGFjY2VzbyBlc3BlY2lmaWNhZGEgbm8gZXhpc3RlLg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5Ob1NlbGVjdGlvbj1ObyBzZSBoYSBzZWxlY2Npb25hZG8gbmluZ1x1MDBmYW4gcGx1Zy1pbi4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX2Rpcj1ObyBzZSBoYSBlc3BlY2lmaWNhZG8gbmluZ1x1MDBmYW4gZGlyZWN0b3Jpbw0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX3JlYWRvbmx5PUVsIHBsdWctaW4gezB9IGVzIGRlIHNcdTAwZjNsbyBsZWN0dXJhXG4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9sb2NrZWQ9SVVQRTAyMDNFOiBFbCBwbHVnLWluIHswfSBlc3RcdTAwZTEgYmxvcXVlYWRvXG4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX2Vycm9yX25vdF91cGRhdGFibGU9QWxndW5vcyBkZSBsb3MgcGx1Zy1pbnMgZGUgbGEgYmlibGlvdGVjYSBlc3RcdTAwZTFuIGJsb3F1ZWFkb3MgbyBzb24gZGUgc1x1MDBmM2xvIGxlY3R1cmEuXG4gRGVzYmxvcXVlZSBsb3MgcGx1Zy1pbnMgeSBhc2VnXHUwMGZhcmVzZSBkZSBxdWUgbG9zIGFyY2hpdm9zIHNlIHB1ZWRlbiBhY3R1YWxpemFyLg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5EYXRhTGFiZWw9UGx1Zy1pbiBzZWxlY2Npb25hZG8gZW4gZWwgZGlyZWN0b3JpbyBkZSBpbXBvcnRhY2lcdTAwZjNuDQotRGlmZlJlcG9ydFZpZXdlcl90eXBlPVRpcG8gZGUgY29udGVuaWRvDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNOb3RFeGlzdHM9Tm8gc2UgaGEgcG9kaWRvIGVuY29udHJhciBsYSBjb25maWd1cmFjaVx1MDBmM24gc2VsZWNjaW9uYWRhIGVuIGxhIGJpYmxpb3RlY2EgYWN0dWFsLg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUEUwMjA0RTogVW5hIHZlcnNpXHUwMGYzbiBhbnRlcmlvciAoezB9KSBkZSB7MX0gaGEgZXhwb3J0YWRvIGxvcyBhcmNoaXZvcyBlc3BlY2lmaWNhZG9zLiBEZWJlIGV4cG9ydGFyIGFyY2hpdm9zIHV0aWxpemFuZG8gbGEgdmVyc2lcdTAwZjNuIGFjdHVhbCBkZSB7MX0uDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBFMDIwNUU6IFVuYSB2ZXJzaVx1MDBmM24gYW50ZXJpb3IgZGUgezB9IGhhIGV4cG9ydGFkbyBsb3MgYXJjaGl2b3MgZXNwZWNpZmljYWRvcy4gRGViZSBleHBvcnRhciBhcmNoaXZvcyB1dGlsaXphbmRvIGxhIHZlcnNpXHUwMGYzbiBhY3R1YWwgZGUgezB9Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUEUwMjA2RTogVW5hIHZlcnNpXHUwMGYzbiBtXHUwMGUxcyByZWNpZW50ZSAoezB9KSBkZSB7MX0gaGEgZXhwb3J0YWRvIGxvcyBhcmNoaXZvcyBlc3BlY2lmaWNhZG9zLiBEZWJlIGFjdHVhbGl6YXIgezF9IHBhcmEgaW1wb3J0YXIgbG9zIGFyY2hpdm9zLiAgDQotdmVyc2lvbk1pc21hdGNoX29sZFRvb2xfdW5rbm93bj1JVVBFMDIwN0U6IE5vIHNlIHB1ZWRlbiBhYnJpciBsb3MgYXJjaGl2b3MgZXNwZWNpZmljYWRvcy4gRGViZSBhY3R1YWxpemFyIHswfSBwYXJhIGltcG9ydGFyIGxvcyBhcmNoaXZvcy4gIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NWU1OGJkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOiBJVVBFMDIwMEUgLSBJVVBFMDI5OUUNCi0jDQotDQotIyBJbXBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWltcG9ydENvbmZpZ1dpemFyZF90aXRsZT1JbXBvcnRlciB1bmUgY29uZmlndXJhdGlvbiBkZSBiaWJsaW90aFx1MDBlOHF1ZQ0KLXNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGl0bGU9U3BcdTAwZTljaWZpZXIgdW4gclx1MDBlOXBlcnRvaXJlIGQnaW1wb3J0YXRpb24NCi1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RleHQ9U3BcdTAwZTljaWZpZXogbGUgclx1MDBlOXBlcnRvaXJlIGNvbnRlbmFudCBsYSBjb25maWd1cmF0aW9uIGRlIGJpYmxpb3RoXHUwMGU4cXVlIFx1MDBlMCBpbXBvcnRlci4NCi1yZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90aXRsZT1SXHUwMGU5dmlzZXIgbGVzIG1vZGlmaWNhdGlvbnMgYXBwb3J0XHUwMGU5ZXMgXHUwMGUwIGxhIGJpYmxpb3RoXHUwMGU4cXVlDQotcmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGV4dD1SXHUwMGU5dmlzZXogbGVzIG1vZGlmaWNhdGlvbnMgcXVpIHNlcm9udCBhcHBvcnRcdTAwZTllcyBcdTAwZTAgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBlbiBjb3Vycy4NCi1zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGl0bGU9U1x1MDBlOWxlY3Rpb25uZXIgbGVzIHNwXHUwMGU5Y2lmaWNhdGlvbnMgZGUgY29uZmlndXJhdGlvbg0KLXNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90ZXh0PVNcdTAwZTlsZWN0aW9ubmV6IHVuZSBvdSBwbHVzaWV1cnMgc3BcdTAwZTljaWZpY2F0aW9ucyBkZSBjb25maWd1cmF0aW9uIFx1MDBlMCBpbXBvcnRlci4NCi0NCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotaW1wb3J0UGx1Z2luc1dpemFyZF90aXRsZT1JbXBvcnRlciBkZXMgcGx1Zy1pbnMgZGUgbVx1MDBlOXRob2RlDQotc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGl0bGU9U3BcdTAwZTljaWZpZXIgdW4gclx1MDBlOXBlcnRvaXJlIGQnaW1wb3J0YXRpb24NCi1zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90ZXh0PVNwXHUwMGU5Y2lmaWV6IGxlIHJcdTAwZTlwZXJ0b2lyZSBjb250ZW5hbnQgbGVzIHBsdWctaW5zIGRlIG1cdTAwZTl0aG9kZSBcdTAwZTAgaW1wb3J0ZXIuDQotc2VsZWN0UGx1Z2luc1dpemFyZFBhZ2VfdGl0bGU9U1x1MDBlOWxlY3Rpb25uZXIgbGVzIHBsdWctaW5zIGRlIG1cdTAwZTl0aG9kZQ0KLXNlbGVjdFBsdWdpbnNXaXphcmRQYWdlX3RleHQ9U1x1MDBlOWxlY3Rpb25uZXogdW4gb3UgcGx1c2lldXJzIHBsdWctaW5zIGRlIG1cdTAwZTl0aG9kZSBcdTAwZTAgaW1wb3J0ZXIuIFNpIHVuIHBsdWctaW4gc1x1MDBlOWxlY3Rpb25uXHUwMGU5IGV4aXN0ZSBkXHUwMGU5alx1MDBlMCBkYW5zIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZW4gY291cnMsIHZcdTAwZTlyaWZpZXogbGVzIGRpZmZcdTAwZTlyZW5jZXMgZW50cmUgbGVzIHZlcnNpb25zLg0KLWltcG9ydFBsdWdpbnNXaXphcmRfRVJSX0ltcG9ydF9wbHVnaW49RWNoZWMgZGUgbCdpbXBvcnRhdGlvbiBkdSBwbHVnLWluDQotDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMD1WYWxpZGF0aW9uIGRlIGxhIGNvbmZpZ3VyYXRpb24gZGUgYmlibGlvdGhcdTAwZThxdWUgc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZS4uLg0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzE9TGUgclx1MDBlOXBlcnRvaXJlIHNwXHUwMGU5Y2lmaVx1MDBlOSBuZSBjb250aWVudCBwYXMgZGUgY29uZmlndXJhdGlvbiB2YWxpZGUuDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMz1JbXBvcnRhdGlvbiBkZSBsYSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZS4uLg0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzI9SW1wb3NzaWJsZSBkJ2ltcG9ydGVyIGxhIGJpYmxpb3RoXHUwMGU4cXVlIG91dmVydGUgZGFucyBlbGxlLW1cdTAwZWFtZS4NCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX01TRzE9SW1wb3J0YXRpb24gZGUgbGEgY29uZmlndXJhdGlvbiBkZSBtXHUwMGU5dGhvZGUuLi4NCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX0VSUl9JbXBvcnRfY29uZmlndXJhdGlvbj1FY2hlYyBkZSBsJ2ltcG9ydGF0aW9uIGRlIGxhIGNvbmZpZ3VyYXRpb24NCi0NCi1GaWxlTW9kaWZ5Q2hlY2tlcl9DaGVja291dF9mYWlsZWRfdGl0bGU9RWNoZWMgZGUgbGEgclx1MDBlOXNlcnZhdGlvbg0KLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF9tc2c9Q2VydGFpbnMgZmljaGllcnMgbmUgc29udCBwYXMgclx1MDBlOXNlcnZcdTAwZTlzLCB2b3VsZXotdm91cyByXHUwMGU5ZXNzYXllciA/DQotDQotSW1wb3J0Q29uZmlnUmVwb3J0UGFnZV90aXRsZT1JbXBvcnRlciB1biByYXBwb3J0IGRlIGNvbmZpZ3VyYXRpb24NCi1JbXBvcnRQbHVnaW5XaXphcmRfcmVhZG9ubHk9SVVQRTAyMDFFIDogTGEgYmlibGlvdGhcdTAwZThxdWUgZXN0IGVuIGxlY3R1cmUgc2V1bGVtZW50Lg0KLUltcG9ydFBsdWdpbldpemFyZF9NU0cxPUltcG9ydGF0aW9uIGR1IHBsdWctaW4gZGUgbVx1MDBlOXRob2RlLi4uDQotSW1wb3J0UGx1Z2luV2l6YXJkX2Vycm9yPUVycmV1cg0KLUltcG9ydFBsdWdpbldpemFyZF93YXJuX2V4aXN0aW5nX3BsdWdpbnM9SVVQRTAyMDBFIDogTGUocykgcGx1Zy1pbihzKSBzXHUwMGU5bGVjdGlvbm5cdTAwZTkocykgc3VpdmFudChzKSBleGlzdGUobnQpIGRcdTAwZTlqXHUwMGUwIGV0IGxlIGZhaXQgZGUgclx1MDBlOWltcG9ydGVyIGxlKHMpIG1cdTAwZWFtZShzKSBwbHVnLWluKHMpIFx1MDBlOWNyYXNlcmEgbGUocykgcGx1Zy1pbihzKSBleGlzdGFudChzKSA6XG5cbiB7MH0gXG5cbkV0ZXMtdm91cyBzXHUwMGZiciBkZSB2b3Vsb2lyIGNvbnRpbnVlciA/DQotSW1wb3J0UGx1Z2luV2l6YXJkX2NvbmZpcm1fY29udGludWU9XG5cbkV0ZXMtdm91cyBzXHUwMGZiciBkZSB2b3Vsb2lyIGNvbnRpbnVlciA/DQotDQotU2VsZWN0Q29uZmlnc1RvSW1wb3J0X2xhYmVsMT1MZXMgXHUwMGU5bFx1MDBlOW1lbnRzIHN1aXZhbnRzIHNlcm9udCBpbXBvcnRcdTAwZTlzIDoNCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yPUVycmV1cg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfTVNHMT1BbmFseXNlIGVuIGNvdXJzDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfdGl0bGUyPVNcdTAwZTlsZWN0aW9ubmVyIGxlcyBzcFx1MDBlOWNpZmljYXRpb25zIGRlIGNvbmZpZ3VyYXRpb24gXHUwMGUwIGltcG9ydGVyDQotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vdF91c2VkPW5vbl91dGlsaXNcdTAwZTkNCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fcGF0aD1MZSByXHUwMGU5cGVydG9pcmUgc3BcdTAwZTljaWZpXHUwMGU5IG4nZXhpc3RlIHBhcy4NCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fZGlyPUF1Y3VuIHJcdTAwZTlwZXJ0b2lyZSBuJ2EgXHUwMGU5dFx1MDBlOSBzcFx1MDBlOWNpZmlcdTAwZTkNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfcGx1Z2lucz1QbHVnLWlucyBkaXNwb25pYmxlcyBkYW5zIGxlIHJcdTAwZTlwZXJ0b2lyZSBkJ2ltcG9ydGF0aW9uIDoNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfYXV0aG9yPUF1dGV1ciA6DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3ZlcnNpb249VmVyc2lvbiA6DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2Rlc2M9RGVzY3JpcHRpZiBjb3VydCA6DQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUUgOiBMYSBiaWJsaW90aFx1MDBlOHF1ZSBlc3QgZW4gbGVjdHVyZSBzZXVsZW1lbnQuDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cwPVZhbGlkYXRpb24gZGVzIHBsdWctaW5zIHNcdTAwZTlsZWN0aW9ublx1MDBlOXMuLi4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzE9TGUgY2hlbWluIHNwXHUwMGU5Y2lmaVx1MDBlOSBuZSBjb250aWVudCBwYXMgZGUgcGx1Zy1pbiBkZSBtXHUwMGU5dGhvZGUgdmFsaWRlLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMz1JbXBvcnRhdGlvbiBkdSBwbHVnLWluIGRlIG1cdTAwZTl0aG9kZS4uLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNT1JbXBvc3NpYmxlIGQnJ2ltcG9ydGVyIGxlIHBsdWctaW4gZGUgbVx1MDBlOXRob2RlIHNcdTAwZTlsZWN0aW9ublx1MDBlOS4gU29uIHBsdWctaW4gZFx1MDBlOXBlbmRhbnQgJyd7MH0nJyBlc3QgaW50cm91dmFibGUgZGFucyBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIGVuIGNvdXJzLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNj1JbXBvc3NpYmxlIGQnaW1wb3J0ZXIgbGUgcGx1Zy1pbiBkZSBtXHUwMGU5dGhvZGUgc1x1MDBlOWxlY3Rpb25uXHUwMGU5LiBBdWN1biBwbHVnLWluIGRcdTAwZTlwZW5kYW50IG4nYSBcdTAwZTl0XHUwMGU5IHRyb3V2XHUwMGU5IGRhbnMgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBlbiBjb3Vycy4NCi1EaWZmUmVwb3J0Vmlld2VyX2NvbnRlbnQ9Q29udGVudQ0KLURpZmZSZXBvcnRWaWV3ZXJfaW5faW1wb3J0PURhbnMgbCdpbXBvcnRhdGlvbg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9NU0cxPUFuYWx5c2UgZGVzIGZpY2hpZXJzLi4uDQotRGlmZlJlcG9ydExhYmVsUHJvdmlkZXJfeWVzPU91aQ0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9lcnJvcj1FcnJldXINCi1EaWZmUmVwb3J0Vmlld2VyX2luX2xpYj1EYW5zIGxhIGJpYmxpb3RoXHUwMGU4cXVlDQotRGlmZlJlcG9ydFZpZXdlcl9zdGF0dXM9RXRhdA0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luRXhpc3RzPVBsdWctaW4gc1x1MDBlOWxlY3Rpb25uXHUwMGU5IHRyb3V2XHUwMGU5IGRhbnMgbGEgYmlibGlvdGhcdTAwZThxdWUgZW4gY291cnMNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGlicmFyeVBsdWdpbk5vdEV4aXN0cz1QbHVnLWluIHNcdTAwZTlsZWN0aW9ublx1MDBlOSBpbnRyb3V2YWJsZSBkYW5zIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGVuIGNvdXJzDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNFeGlzdHM9Q29uZmlndXJhdGlvbiB0cm91dlx1MDBlOWUgZGFucyBsYSBiaWJsaW90aFx1MDBlOHF1ZSBlbiBjb3Vycw0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNOb1NlbGVjdGlvbj1BdWN1bmUgc3BcdTAwZTljaWZpY2F0aW9uIGRlIGNvbmZpZ3VyYXRpb24gbidhIFx1MDBlOXRcdTAwZTkgc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZS4NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjRGF0YUxhYmVsPUNvbmZpZ3VyYXRpb24gc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZSBkYW5zIGxlIHJcdTAwZTlwZXJ0b2lyZSBkJ2ltcG9ydGF0aW9uDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGFiZWxfY29uZmlncz1TcFx1MDBlOWNpZmljYXRpb25zIGRlIGNvbmZpZ3VyYXRpb24gZGlzcG9uaWJsZXMgZGFucyBsZSByXHUwMGU5cGVydG9pcmUgZCdpbXBvcnRhdGlvbiA6DQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZD1ub25fdXRpbGlzXHUwMGU5DQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGFiZWxfZGVzYz1EZXNjcmlwdGlmIGNvdXJ0IDoNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX3BhdGg9TGUgY2hlbWluIHNwXHUwMGU5Y2lmaVx1MDBlOSBuJ2V4aXN0ZSBwYXMuDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X3BsdWdpbk5vU2VsZWN0aW9uPUF1Y3VuIHBsdWctaW4gc1x1MDBlOWxlY3Rpb25uXHUwMGU5Lg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm9fZGlyPUF1Y3VuIHJcdTAwZTlwZXJ0b2lyZSBuJ2EgXHUwMGU5dFx1MDBlOSBzcFx1MDBlOWNpZmlcdTAwZTkNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9yZWFkb25seT1MZSBwbHVnLWluIHswfSBlc3QgZW4gbGVjdHVyZSBzZXVsZW1lbnRcbg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX2xvY2tlZD1JVVBFMDIwM0UgOiBMZSBwbHVnLWluIHswfSBlc3QgdmVycm91aWxsXHUwMGU5XG4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX2Vycm9yX25vdF91cGRhdGFibGU9VW4gb3UgcGx1c2lldXJzIGRlcyBwbHVnLWluKHMpIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIHNvbnQgdmVycm91aWxsXHUwMGU5cyBvdSBlbiBsZWN0dXJlIHNldWxlbWVudC5cbiBEXHUwMGU5dmVycm91aWxsZXogbGVzIHBsdWctaW5zIGV0IGFzc3VyZXotdm91cyBxdWUgbGVzIGZpY2hpZXJzIHBldXZlbnQgXHUwMGVhdHJlIG1pcyBcdTAwZTAgam91ci4NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luRGF0YUxhYmVsPVBsdWctaW4gc1x1MDBlOWxlY3Rpb25uXHUwMGU5IGRhbnMgbGUgclx1MDBlOXBlcnRvaXJlIGQnaW1wb3J0YXRpb24NCi1EaWZmUmVwb3J0Vmlld2VyX3R5cGU9VHlwZSBkZSBjb250ZW51DQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNOb3RFeGlzdHM9Q29uZmlndXJhdGlvbiBzXHUwMGU5bGVjdGlvbm5cdTAwZTllIGludHJvdXZhYmxlIGRhbnMgbGEgYmlibGlvdGhcdTAwZThxdWUgZW4gY291cnMuDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGE9SVVQRTAyMDRFIDogTGVzIGZpY2hpZXJzIHNwXHUwMGU5Y2lmaVx1MDBlOXMgb250IFx1MDBlOXRcdTAwZTkgZXhwb3J0XHUwMGU5cyBwYXIgdW5lIHZlcnNpb24gYW50XHUwMGU5cmlldXJlICh7MH0pIGRlIHsxfS4gVm91cyBkZXZleiBleHBvcnRlciBsZXMgZmljaGllcnMgZW4gdXRpbGlzYW50IGxhIHZlcnNpb24gYWN0dWVsbGUgZGUgezF9Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd249SVVQRTAyMDVFIDogTGVzIGZpY2hpZXJzIHNwXHUwMGU5Y2lmaVx1MDBlOXMgb250IFx1MDBlOXRcdTAwZTkgZXhwb3J0XHUwMGU5cyBwYXIgdW5lIHZlcnNpb24gYW50XHUwMGU5cmlldXJlIGRlIHswfS4gVm91cyBkZXZleiBleHBvcnRlciBsZXMgZmljaGllcnMgZW4gdXRpbGlzYW50IGxhIHZlcnNpb24gYWN0dWVsbGUgZGUgezB9Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUEUwMjA2RSA6IExlcyBmaWNoaWVycyBzcFx1MDBlOWNpZmlcdTAwZTlzIG9udCBcdTAwZTl0XHUwMGU5IGV4cG9ydFx1MDBlOXMgcGFyIHVuZSB2ZXJzaW9uIHBsdXMgclx1MDBlOWNlbnRlICh7MH0pIGRlIHsxfS4gVm91cyBkZXZleiBlZmZlY3R1ZXIgdW5lIG1pc2UgXHUwMGUwIG5pdmVhdSBkZSB7MX0gcG91ciBpbXBvcnRlciBsZXMgZmljaGllcnMuICANCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUEUwMjA3RTogSW1wb3NzaWJsZSBkJydvdXZyaXIgbGVzIGZpY2hpZXJzIHNwXHUwMGU5Y2lmaVx1MDBlOXMuIFZvdXMgZGV2ZXogZWZmZWN0dWVyIHVuZSBtaXNlIFx1MDBlMCBuaXZlYXUgZGUgezB9IHBvdXIgaW1wb3J0ZXIgbGVzIGZpY2hpZXJzLiAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfaXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhjMGU1NDEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMjAwRSAtIElVUEUwMjk5RQ0KLSMNCi0NCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlPUltcG9ydGEgY29uZmlndXJhemlvbmUgZGkgbGlicmVyaWENCi1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RpdGxlPVNwZWNpZmljYSBkaXJlY3RvcnkgZGkgaW1wb3J0YXppb25lDQotc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90ZXh0PVNwZWNpZmljYXJlIGxhIGRpcmVjdG9yeSBjaGUgY29udGllbmUgbGEgY29uZmlndXJhemlvbmUgZGkgbGlicmVyaWEgZGEgaW1wb3J0YXJlLg0KLXJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RpdGxlPUVzYW1pbmEgbW9kaWZpY2hlIGxpYnJlcmlhDQotcmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGV4dD1Fc2FtaW5hcmUgbGUgbW9kaWZpY2hlIGNoZSB2ZXJyYW5ubyBhcHBvcnRhdGUgYWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGNvcnJlbnRlLg0KLXNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90aXRsZT1TZWxlemlvbmEgc3BlY2lmaWNoZSBkaSBjb25maWd1cmF6aW9uZQ0KLXNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90ZXh0PVNlbGV6aW9uYXJlIHVuYSBvIHBpXHUwMGY5IHNwZWNpZmljaGUgZGkgY29uZmlndXJhemlvbmUgZGEgaW1wb3J0YXJlLg0KLQ0KLSMgSW1wb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1pbXBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlPUltcG9ydGEgcGx1Zy1pbiBkaSBtZXRvZG8NCi1zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90aXRsZT1TcGVjaWZpY2EgZGlyZWN0b3J5IGRpIGltcG9ydGF6aW9uZQ0KLXNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RleHQ9U3BlY2lmaWNhcmUgbGEgZGlyZWN0b3J5IGNoZSBjb250aWVuZSBpIHBsdWctaW4gZGkgbWV0b2RvIGRhIGltcG9ydGFyZS4NCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90aXRsZT1TZWxlemlvbmEgcGx1Zy1pbiBkaSBtZXRvZG8NCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90ZXh0PVNlbGV6aW9uYXJlIHVubyBvIHBpXHUwMGY5IHBsdWctaW4gZGkgbWV0b2RvIGRhIGltcG9ydGFyZS4gU2UgdW4gcGx1Zy1pbiBzZWxlemlvbmF0byBlc2lzdGUgZ2lcdTAwZTAgbmVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBjb3JyZW50ZSwgdmVyaWZpY2FyZSBsZSBkaWZmZXJlbnplIHRyYSBsZSB2ZXJzaW9uaS4NCi1pbXBvcnRQbHVnaW5zV2l6YXJkX0VSUl9JbXBvcnRfcGx1Z2luPUltcG9ydGF6aW9uZSBkZWwgcGx1Z2luIG5vbiByaXVzY2l0YQ0KLQ0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzA9Q29udmFsaWRhIGRlbGxhIGNvbmZpZ3VyYXppb25lIGRpIGxpYnJlcmlhIHNlbGV6aW9uYXRhIGluIGNvcnNvLi4uDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMT1MYSBkaXJlY3Rvcnkgc3BlY2lmaWNhdGEgbm9uIGNvbnRpZW5lIHVuYSBjb25maWd1cmF6aW9uZSB2YWxpZGEuDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMz1JbXBvcnRhemlvbmUgZGVsbGEgY29uZmlndXJhemlvbmUgZGkgbWV0b2RvIGluIGNvcnNvLi4uDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMj1JbXBvc3NpYmlsZSBpbXBvcnRhcmUgbGEgbGlicmVyaWEgYXR0dWFsbWVudGUgYXBlcnRhIGRlbnRybyBzXHUwMGU5IHN0ZXNzYS4NCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX01TRzE9SW1wb3J0YXppb25lIGRlbGxhIGNvbmZpZ3VyYXppb25lIGRpIG1ldG9kbyBpbiBjb3Jzby4uLg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfRVJSX0ltcG9ydF9jb25maWd1cmF0aW9uPUltcG9ydGF6aW9uZSBkZWxsYSBjb25maWd1cmF6aW9uZSBub24gcml1c2NpdGENCi0NCi1GaWxlTW9kaWZ5Q2hlY2tlcl9DaGVja291dF9mYWlsZWRfdGl0bGU9RXN0cmF6aW9uZSBub24gcml1c2NpdGENCi1GaWxlTW9kaWZ5Q2hlY2tlcl9DaGVja291dF9mYWlsZWRfbXNnPUFsY3VuaSBmaWxlIG5vbiBzb25vIHN0YXRpIGNvbnRyb2xsYXRpLCByaXBldGVyZSBsJ29wZXJhemlvbmU/DQotDQotSW1wb3J0Q29uZmlnUmVwb3J0UGFnZV90aXRsZT1JbXBvcnRhemlvbmUgZGVsIHJlcG9ydCBkaSBjb25maWd1cmF6aW9uZQ0KLUltcG9ydFBsdWdpbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUU6IExhIGxpYnJlcmlhIFx1MDBlOCBkaSBzb2xhIGxldHR1cmEuDQotSW1wb3J0UGx1Z2luV2l6YXJkX01TRzE9SW1wb3J0YXppb25lIGRlbCBwbHVnLWluIGRpIG1ldG9kbyBpbiBjb3Jzby4uLg0KLUltcG9ydFBsdWdpbldpemFyZF9lcnJvcj1FcnJvcmUNCi1JbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9leGlzdGluZ19wbHVnaW5zPUlVUEUwMjAwRTogSSBzZWd1ZW50aSBwbHVnLWluIHNlbGV6aW9uYXRpIGVzaXN0b25vIGdpXHUwMGUwIGUgc2Ugc2kgcmVpbXBvcnRhbm8gZ2xpIHN0ZXNzaSBwbHVnLWluLCBxdWVsbGkgZXNpc3RlbnRpIHZlcnJhbm5vIHNvdnJhc2NyaXR0aTpcblxuIHswfSBcblxuQ29udGludWFyZT8NCi1JbXBvcnRQbHVnaW5XaXphcmRfY29uZmlybV9jb250aW51ZT1cblxuQ29udGludWFyZT8NCi0NCi1TZWxlY3RDb25maWdzVG9JbXBvcnRfbGFiZWwxPUkgc2VndWVudGkgZWxlbWVudGkgdmVycmFubm8gaW1wb3J0YXRpOg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfZXJyb3I9RXJyb3JlDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9NU0cxPUFuYWxpc2kNCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV90aXRsZTI9U2VsZXppb25hIHNwZWNpZmljaGUgZGVsbGEgY29uZmlndXJhemlvbmUgZGEgaW1wb3J0YXJlDQotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vdF91c2VkPW5vdF91c2VkDQotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX3BhdGg9TGEgZGlyZWN0b3J5IHNwZWNpZmljYXRhIG5vbiBlc2lzdGUuDQotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX2Rpcj1OZXNzdW5hIGRpcmVjdG9yeSBzcGVjaWZpY2F0YQ0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9wbHVnaW5zPVBsdWctaW4gZGlzcG9uaWJpbGkgbmVsbGEgZGlyZWN0b3J5IGRpIGltcG9ydGF6aW9uZToNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfYXV0aG9yPUF1dG9yZToNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfdmVyc2lvbj1WZXJzaW9uZToNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfZGVzYz1CcmV2ZSBkZXNjcml6aW9uZToNCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX3JlYWRvbmx5PUlVUEUwMjAxRTogTGEgbGlicmVyaWEgXHUwMGU4IGRpIHNvbGEgbGV0dHVyYS4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzA9Q29udmFsaWRhIGRlaSBwbHVnLWluIHNlbGV6aW9uYXRpIGluIGNvcnNvLi4uDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cxPUlsIHBlcmNvcnNvIHNwZWNpZmljYXRvIG5vbiBjb250aWVuZSB1biBwbHVnLWluIGRpIG1ldG9kbyB2YWxpZG8uDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0czPUltcG9ydGF6aW9uZSBkZWwgcGx1Zy1pbiBkaSBtZXRvZG8gaW4gY29yc28uLi4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzU9SWwgcGx1Zy1pbiBzZWxlemlvbmF0byBub24gcHVcdTAwZjIgZXNzZXJlIGltcG9ydGF0by4gSW1wb3NzaWJpbGUgdHJvdmFyZSBpbCByZWxhdGl2byBwbHVnLWluIGRpcGVuZGVudGUgJyd7MH0nJyBuZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGNvcnJlbnRlLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNj1JbCBwbHVnLWluIHNlbGV6aW9uYXRvIG5vbiBwdVx1MDBmMiBlc3NlcmUgaW1wb3J0YXRvLiBJbXBvc3NpYmlsZSB0cm92YXJlIHVuIHBsdWctaW4gZGlwZW5kZW50ZSBuZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGNvcnJlbnRlLg0KLURpZmZSZXBvcnRWaWV3ZXJfY29udGVudD1Db250ZW51dG8NCi1EaWZmUmVwb3J0Vmlld2VyX2luX2ltcG9ydD1JbiBpbXBvcnRhemlvbmUNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfTVNHMT1BbmFsaXNpIGRlaSBmaWxlIGluIGNvcnNvLi4uDQotRGlmZlJlcG9ydExhYmVsUHJvdmlkZXJfeWVzPVNcdTAwZWMNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfZXJyb3I9RXJyb3JlDQotRGlmZlJlcG9ydFZpZXdlcl9pbl9saWI9TmVsbGEgbGlicmVyaWENCi1EaWZmUmVwb3J0Vmlld2VyX3N0YXR1cz1TdGF0bw0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luRXhpc3RzPVBsdWctaW4gc2VsZXppb25hdG8gdHJvdmF0byBuZWxsYSBsaWJyZXJpYSBjb3JyZW50ZQ0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luTm90RXhpc3RzPVBsdWctaW4gc2VsZXppb25hdG8gbm9uIHRyb3ZhdG8gbmVsbGEgbGlicmVyaWEgY29ycmVudGUNCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9saWJyYXJ5Q29uZmlnU3BlY0V4aXN0cz1Db25maWd1cmF6aW9uZSB0cm92YXRhIG5lbGxhIGxpYnJlcmlhIGNvcnJlbnRlDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY05vU2VsZWN0aW9uPU5lc3N1bmEgc3BlY2lmaWNhIGRlbGxhIGNvbmZpZ3VyYXppb25lIHNlbGV6aW9uYXRhLg0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNEYXRhTGFiZWw9Q29uZmlndXJhemlvbmUgc2VsZXppb25hdGEgbmVsbGEgZGlyZWN0b3J5IGRpIGltcG9ydGF6aW9uZQ0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2NvbmZpZ3M9U3BlY2lmaWNoZSBkZWxsYSBjb25maWd1cmF6aW9uZSBkaXNwb25pYmlsaSBuZWxsYSBkaXJlY3RvcnkgZGkgaW1wb3J0YXppb25lOg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm90X3VzZWQ9bm90X3VzZWQNCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9kZXNjPUJyZXZlIGRlc2NyaXppb25lOg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm9fcGF0aD1JbCBwZXJjb3JzbyBzcGVjaWZpY2F0byBub24gZXNpc3RlLg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5Ob1NlbGVjdGlvbj1OZXNzdW4gcGx1Zy1pbiBzZWxlemlvbmF0by4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX2Rpcj1OZXNzdW5hIGRpcmVjdG9yeSBzcGVjaWZpY2F0YQ0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX3JlYWRvbmx5PUlsIHBsdWdpbiB7MH0gXHUwMGU4IGRpIHNvbGEgbGV0dHVyYSBcbg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX2xvY2tlZD1JVVBFMDIwM0U6IElsIHBsdWdpbiB7MH0gXHUwMGU4IGJsb2NjYXRvXG4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX2Vycm9yX25vdF91cGRhdGFibGU9QWxjdW5pIHBsdWdpbiBkZWxsYSBsaWJyZXJpYSBzb25vIGJsb2NjYXRpIG8gZGkgc29sYSBsZXR0dXJhLlxuU2Jsb2NjYXJlIGkgcGx1Z2luIGUgdmVyaWZpY2FyZSBjaGUgaSBmaWxlIHNpYW5vIGFnZ2lvcm5hYmlsaS4NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luRGF0YUxhYmVsPVBsdWctaW4gc2VsZXppb25hdG8gbmVsbGEgZGlyZWN0b3J5IGRpIGltcG9ydGF6aW9uZQ0KLURpZmZSZXBvcnRWaWV3ZXJfdHlwZT1UaXBvIGRpIGNvbnRlbnV0bw0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzPUNvbmZpZ3VyYXppb25lIHNlbGV6aW9uYXRhIG5vbiB0cm92YXRhIG5lbGxhIGxpYnJlcmlhIGNvcnJlbnRlLg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUEUwMjA0RTogaSBmaWxlIHNwZWNpZmljYXRpIHNvbm8gc3RhdGkgZXNwb3J0YXRpIGRhIHVuYSBwcmVjZWRlbnRlIHZlcnNpb25lICh7MH0pIGRpIHsxfS4gXHUwMGM4IG5lY2Vzc2FyaW8gZXNwb3J0YXJlIGkgZmlsZSB1dGlsaXp6YW5kbyBsYSB2ZXJzaW9uZSBjb3JyZW50ZSBkaSB7MX0uDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBFMDIwNUU6IGkgZmlsZSBzcGVjaWZpY2F0aSBzb25vIHN0YXRpIGVzcG9ydGF0aSBkYSB1bmEgcHJlY2VkZW50ZSB2ZXJzaW9uZSBkaSB7MH0uIFx1MDBjOCBuZWNlc3NhcmlvIGVzcG9ydGFyZSBpIGZpbGUgdXRpbGl6emFuZG8gbGEgdmVyc2lvbmUgY29ycmVudGUgZGkgezB9Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUEUwMjA2RTogaSBmaWxlIHNwZWNpZmljYXRpIHNvbm8gc3RhdGkgZXNwb3J0YXRpIGRhIHVuYSB2ZXJzaW9uZSBwaVx1MDBmOSBhZ2dpb3JuYXRhICh7MH0pIGRpIHsxfS4gXHUwMGM4IG5lY2Vzc2FyaW8gYWdnaW9ybmFyZSB7MX0gcGVyIGltcG9ydGFyZSBpIGZpbGUuICANCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUEUwMjA3RTogSW1wb3NzaWJpbGUgYXByaXJlIGkgZmlsZSBzcGVjaWZpY2F0aS4gXHUwMGM4IG5lY2Vzc2FyaW8gYWdnaW9ybmFyZSB7MH0gcGVyIGltcG9ydGFyZSBpIGZpbGUuICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmRmNGY1OS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQRTAyMDBFIC0gSVVQRTAyOTlFDQotIw0KLQ0KLSMgSW1wb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1pbXBvcnRDb25maWdXaXphcmRfdGl0bGU9XHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHU2OWNiXHU2MjEwXHUzMDZlXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4DQotc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90aXRsZT1cdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNmVcdTYzMDdcdTViOWENCi1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RleHQ9XHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU5XHUzMDhiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHU2OWNiXHU2MjEwXHUzMDkyXHU1NDJiXHUzMDgwXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGl0bGU9XHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZlXHU1OTA5XHU2NmY0XHU1MTg1XHU1YmI5XHUzMDZlXHU2OTFjXHU4YTBlDQotcmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGV4dD1cdTczZmVcdTg4NGNcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmJcdTUyYTBcdTMwNDhcdTMwODlcdTMwOGNcdTMwOGJcdTU5MDlcdTY2ZjRcdTMwOTJcdTY5MWNcdThhMGVcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGl0bGU9XHU2OWNiXHU2MjEwXHU0ZWQ1XHU2OWQ4XHUzMDZlXHU5MDc4XHU2MjllDQotc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RleHQ9XHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU5XHUzMDhiIDEgXHUzMDY0XHU0ZWU1XHU0ZTBhXHUzMDZlXHU2OWNiXHU2MjEwXHU0ZWQ1XHU2OWQ4XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBJbXBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZA0KLWltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDZlXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4DQotc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGl0bGU9XHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMGZiXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHUzMDZlXHU2MzA3XHU1YjlhDQotc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGV4dD1cdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTlcdTMwOGJcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwOTJcdTU0MmJcdTMwODBcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90aXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNmVcdTkwNzhcdTYyOWUNCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90ZXh0PVx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA1OVx1MzA4YiAxIFx1MzA2NFx1NGVlNVx1NGUwYVx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNGNcdTczZmVcdTg4NGNcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmJcdTViNThcdTU3MjhcdTMwNTlcdTMwOGJcdTU4MzRcdTU0MDhcdTMwMDFcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjNcdTMwNmVcdTkwNTVcdTMwNDRcdTMwOTJcdTc4YmFcdThhOGRcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1pbXBvcnRQbHVnaW5zV2l6YXJkX0VSUl9JbXBvcnRfcGx1Z2luPVx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA0Y1x1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zg0KLQ0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzA9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHU2OWNiXHU2MjEwXHUzMDkyXHU2OTFjXHU4YTNjXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMT1cdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNmJcdTMwNmZcdTY3MDlcdTUyYjlcdTMwNmFcdTY5Y2JcdTYyMTBcdTMwNGNcdTU0MmJcdTMwN2VcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0czPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA5Mlx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzI9XHU3M2ZlXHU1NzI4XHU5NThiXHUzMDQ0XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDkyXHUzMDVkXHUzMDZlXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHU4MWVhXHU0ZjUzXHUzMDZiXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU5XHUzMDhiXHUzMDUzXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9NU0cxPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA5Mlx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfRVJSX0ltcG9ydF9jb25maWd1cmF0aW9uPVx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1NjljYlx1NjIxMFx1MzA0Y1x1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zg0KLQ0KLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF90aXRsZT1cdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTMwYTJcdTMwYTZcdTMwYzhcdTU5MzFcdTY1NTcNCi1GaWxlTW9kaWZ5Q2hlY2tlcl9DaGVja291dF9mYWlsZWRfbXNnPVx1NGUwMFx1OTBlOFx1MzA2ZVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2Zlx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1MzBhMlx1MzBhNlx1MzBjOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi0NCi1JbXBvcnRDb25maWdSZXBvcnRQYWdlX3RpdGxlPVx1NjljYlx1NjIxMFx1MzBlY1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA2ZVx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOA0KLUltcG9ydFBsdWdpbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUU6IFx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2Zlx1OGFhZFx1MzA3Zlx1NTNkNlx1MzA4YVx1NWMwMlx1NzUyOFx1MzA2N1x1MzA1OVx1MzAwMg0KLUltcG9ydFBsdWdpbldpemFyZF9NU0cxPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLUltcG9ydFBsdWdpbldpemFyZF9lcnJvcj1cdTMwYThcdTMwZTlcdTMwZmMNCi1JbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9leGlzdGluZ19wbHVnaW5zPUlVUEUwMjAwRTogXHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHU2YjIxXHUzMDZlXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDZmXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyXHU1NDBjXHUzMDU4XHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDkyXHU1MThkXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU5XHUzMDhiXHUzMDY4XHU2NWUyXHU1YjU4XHUzMDZlXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDRjXHU0ZTBhXHU2NmY4XHUzMDRkXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU5OlxuXG4gezB9IFxuXG5cdTdkOWFcdTg4NGNcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQotSW1wb3J0UGx1Z2luV2l6YXJkX2NvbmZpcm1fY29udGludWU9XG5cblx1N2Q5YVx1ODg0Y1x1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi0NCi1TZWxlY3RDb25maWdzVG9JbXBvcnRfbGFiZWwxPVx1NmIyMVx1MzA2ZVx1ODk4MVx1N2QyMFx1MzA0Y1x1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1OToNCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yPVx1MzBhOFx1MzBlOVx1MzBmYw0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfTVNHMT1cdTUyMDZcdTY3OTBcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkNCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV90aXRsZTI9XHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU5XHUzMDhiXHU2OWNiXHU2MjEwXHU0ZWQ1XHU2OWQ4XHUzMDZlXHU5MDc4XHU2MjllDQotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vdF91c2VkPW5vdF91c2VkDQotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX3BhdGg9XHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHUzMDZmXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX2Rpcj1cdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNGNcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfcGx1Z2lucz1cdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTUxODVcdTMwNmVcdTkwNzhcdTYyOWVcdTUzZWZcdTgwZmRcdTMwNmFcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjM6DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvcj1cdTRmNWNcdTYyMTBcdTgwMDU6DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3ZlcnNpb249XHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzOg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9kZXNjPVx1ODk4MVx1NjVlODoNCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX3JlYWRvbmx5PUlVUEUwMjAxRTogXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZmXHU4YWFkXHUzMDdmXHU1M2Q2XHUzMDhhXHU1YzAyXHU3NTI4XHUzMDY3XHUzMDU5XHUzMDAyDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cwPVx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA1Zlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1NjkxY1x1OGEzY1x1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMT1cdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNWZcdTMwZDFcdTMwYjlcdTMwNmJcdTMwNmZcdTY3MDlcdTUyYjlcdTMwNmFcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNGNcdTU0MmJcdTMwN2VcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzM9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDkyXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c1PVx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA1Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMiBcdTRmOWRcdTViNThcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNjdcdTMwNDJcdTMwOGIgJyd7MH0nJyBcdTMwNGNcdTMwMDFcdTczZmVcdTg4NGNcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmJcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzY9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMDkyXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyIFx1NGY5ZFx1NWI1OFx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA0Y1x1NzNmZVx1ODg0Y1x1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2Ylx1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLURpZmZSZXBvcnRWaWV3ZXJfY29udGVudD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQNCi1EaWZmUmVwb3J0Vmlld2VyX2luX2ltcG9ydD1cdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTUxODUNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfTVNHMT1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwOTJcdTUyMDZcdTY3OTBcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi1EaWZmUmVwb3J0TGFiZWxQcm92aWRlcl95ZXM9XHUzMDZmXHUzMDQ0DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2Vycm9yPVx1MzBhOFx1MzBlOVx1MzBmYw0KLURpZmZSZXBvcnRWaWV3ZXJfaW5fbGliPVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1NTE4NQ0KLURpZmZSZXBvcnRWaWV3ZXJfc3RhdHVzPVx1NzJiNlx1NmNjMQ0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luRXhpc3RzPVx1NzNmZVx1ODg0Y1x1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1NTE4NVx1MzA2ZVx1OTA3OFx1NjI5ZVx1NmUwOFx1MzA3Zlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmMw0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luTm90RXhpc3RzPVx1NzNmZVx1ODg0Y1x1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2Ylx1MzA2YVx1MzA0NFx1OTA3OFx1NjI5ZVx1NmUwOFx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmMw0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjRXhpc3RzPVx1NzNmZVx1ODg0Y1x1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1NTE4NVx1MzA2ZVx1NjljYlx1NjIxMA0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNOb1NlbGVjdGlvbj1cdTY5Y2JcdTYyMTBcdTRlZDVcdTY5ZDhcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjRGF0YUxhYmVsPVx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1MzBmYlx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzBmY1x1NTE4NVx1MzA2ZVx1OTA3OFx1NjI5ZVx1NmUwOFx1MzA3Zlx1MzA2ZVx1NjljYlx1NjIxMA0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2NvbmZpZ3M9XHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMGZiXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHU1MTg1XHUzMDZlXHU5MDc4XHU2MjllXHU1M2VmXHU4MGZkXHUzMDZhXHU2OWNiXHU2MjEwXHU0ZWQ1XHU2OWQ4Og0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm90X3VzZWQ9bm90X3VzZWQNCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9kZXNjPVx1ODk4MVx1NjVlODoNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX3BhdGg9XHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGQxXHUzMGI5XHUzMDZmXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X3BsdWdpbk5vU2VsZWN0aW9uPVx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm9fZGlyPVx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzBmY1x1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX3JlYWRvbmx5PVx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmMyB7MH0gXHUzMDZmXHU4YWFkXHUzMDdmXHU1M2Q2XHUzMDhhXHU1YzAyXHU3NTI4XHUzMDY3XHUzMDU5XG4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9sb2NrZWQ9SVVQRTAyMDNFOiBcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjMgezB9IFx1MzA2Zlx1MzBlZFx1MzBjM1x1MzBhZlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVxuDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9lcnJvcl9ub3RfdXBkYXRhYmxlPVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1NTE4NVx1MzA2ZVx1NGUwMFx1OTBlOFx1MzA2ZVx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA0Y1x1MzAwMVx1MzBlZFx1MzBjM1x1MzBhZlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzA0Ylx1OGFhZFx1MzA3Zlx1NTNkNlx1MzA4YVx1NWMwMlx1NzUyOFx1MzA2Ylx1MzA2YVx1MzA2M1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMlxuIFx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1MzBhMlx1MzBmM1x1MzBlZFx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzAwMVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1NjZmNFx1NjViMFx1NTNlZlx1ODBmZFx1MzA2N1x1MzA0Mlx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA5Mlx1NzhiYVx1OGE4ZFx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5EYXRhTGFiZWw9XHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMGZiXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHU1MTg1XHUzMDZlXHU5MDc4XHU2MjllXHU2ZTA4XHUzMDdmXHUzMDZlXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzDQotRGlmZlJlcG9ydFZpZXdlcl90eXBlPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzBmYlx1MzBiZlx1MzBhNFx1MzBkNw0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzPVx1NzNmZVx1ODg0Y1x1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2Ylx1MzA2YVx1MzA0NFx1NjljYlx1NjIxMFx1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUEUwMjA0RTogXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDRjXHUzMDAxezF9IFx1MzA2ZVx1NTI0ZFx1MzA2ZVx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmMyAoezB9KSBcdTMwNmJcdTMwODhcdTMwNjNcdTMwNjZcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmVcdTMwYThcdTMwYWZcdTMwYjlcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNmYgezF9IFx1MzA2ZVx1NzNmZVx1ODg0Y1x1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1MzA5Mlx1NGY3Zlx1MzA2M1x1MzA2Nlx1ODg0Y1x1MzA0Nlx1NWZjNVx1ODk4MVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd249SVVQRTAyMDVFOiBcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWZcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNGNcdTMwMDF7MH0gXHUzMDZlXHU1MjRkXHUzMDZlXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHUzMDZiXHUzMDg4XHUzMDYzXHUzMDY2XHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDZmIHswfSBcdTMwNmVcdTczZmVcdTg4NGNcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjNcdTMwOTJcdTRmN2ZcdTMwNjNcdTMwNjZcdTg4NGNcdTMwNDZcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDINCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1JVVBFMDIwNkU6IFx1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1MzAwMXsxfSBcdTMwNmVcdTY1YjBcdTg5OGZcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjMgKHswfSkgXHUzMDZiXHUzMDg4XHUzMDYzXHUzMDY2XHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDkyXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU5XHUzMDhiXHUzMDZiXHUzMDZmXHUzMDAxezF9IFx1MzA2Ylx1MzBhMlx1MzBjM1x1MzBkN1x1MzBiMFx1MzBlY1x1MzBmY1x1MzBjOVx1MzA1OVx1MzA4Ylx1NWZjNVx1ODk4MVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQRTAyMDdFOiBcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWZcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwOTJcdTk1OGJcdTMwNGZcdTMwNTNcdTMwNjhcdTMwNGNcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwOTJcdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTlcdTMwOGJcdTMwNmJcdTMwNmZcdTMwMDF7MH0gXHUzMDZiXHUzMGEyXHUzMGMzXHUzMGQ3XHUzMGIwXHUzMGVjXHUzMGZjXHUzMGM5XHUzMDU5XHUzMDhiXHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY4ZmY3YjYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMjAwRSAtIElVUEUwMjk5RQ0KLSMNCi0NCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlPVx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWFkNmNcdWMxMzEgXHVhYzAwXHVjODM4XHVjNjI0XHVhZTMwDQotc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90aXRsZT1cdWFjMDBcdWM4MzhcdWM2MjRcdWFlMzAgXHViNTE0XHViODA5XHVkMWEwXHViOWFjIFx1YzljMFx1YzgxNQ0KLXNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGV4dD1cdWFjMDBcdWM4MzhcdWM2MmMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YWQ2Y1x1YzEzMVx1Yzc0NCBcdWQzZWNcdWQ1NjhcdWQ1NThcdWIyOTQgXHViNTE0XHViODA5XHVkMWEwXHViOWFjXHViOTdjIFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1yZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90aXRsZT1cdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHViY2MwXHVhY2JkXHVjMGFjXHVkNTZkIFx1YWM4MFx1ZDFhMA0KLXJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RleHQ9XHVkNjA0XHVjN2FjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM3NTggXHViY2MwXHVhY2JkXHVjMGFjXHVkNTZkXHVjNzQ0IFx1YWM4MFx1ZDFhMFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGl0bGU9XHVhZDZjXHVjMTMxIFx1YzJhNFx1ZDM5OSBcdWMxMjBcdWQwZGQNCi1zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGV4dD1cdWFjMDBcdWM4MzhcdWM2MmMgXHVkNTU4XHViMDk4IFx1Yzc3NFx1YzBjMVx1Yzc1OCBcdWFkNmNcdWMxMzEgXHVjMmE0XHVkMzk5XHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotaW1wb3J0UGx1Z2luc1dpemFyZF90aXRsZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4IFx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMA0KLXNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RpdGxlPVx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMCBcdWI1MTRcdWI4MDlcdWQxYTBcdWI5YWMgXHVjOWMwXHVjODE1DQotc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGV4dD1cdWFjMDBcdWM4MzhcdWM2MmMgXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc0NCBcdWQzZWNcdWQ1NjhcdWQ1NThcdWIyOTQgXHViNTE0XHViODA5XHVkMWEwXHViOWFjXHViOTdjIFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90aXRsZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4IFx1YzEyMFx1ZDBkZA0KLXNlbGVjdFBsdWdpbnNXaXphcmRQYWdlX3RleHQ9XHVhYzAwXHVjODM4XHVjNjJjIFx1ZDU1OFx1YjA5OCBcdWM3NzRcdWMwYzFcdWM3NTggXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuIFx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NzQgXHVkNjA0XHVjN2FjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM1ZDAgXHVjNzc0XHViYmY4IFx1Yzc4OFx1Yzc0NCBcdWFjYmRcdWM2YjAgXHViYzg0XHVjODA0IFx1Y2MyOFx1Yzc3NFx1Yjk3YyBcdWQ2NTVcdWM3NzhcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotaW1wb3J0UGx1Z2luc1dpemFyZF9FUlJfSW1wb3J0X3BsdWdpbj1cdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NDQgXHVhYzAwXHVjODM4XHVjNjI0XHVjOWMwIFx1YmFiYlx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cwPVx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVhZDZjXHVjMTMxXHVjNzU4IFx1YzcyMFx1ZDZhOFx1YzEzMSBcdWFjODBcdWM5OWQgXHVjOTExLi4uDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMT1cdWM5YzBcdWM4MTVcdWQ1NWMgXHViNTE0XHViODA5XHVkMWEwXHViOWFjXHVjNWQwIFx1YzYyY1x1YmMxNFx1Yjk3OCBcdWFkNmNcdWMxMzFcdWM3NzQgXHVkM2VjXHVkNTY4XHViNDE4XHVjNWI0IFx1Yzc4OFx1YzljMCBcdWM1NGFcdWMyYjVcdWIyYzhcdWIyZTQuDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMz1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YWMwMFx1YzgzOFx1YzYyNFx1YjI5NCBcdWM5MTEuLi4NCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cyPVx1ZDYwNFx1YzdhYyBcdWM1ZjRcdWI5YjAgXHVjMGMxXHVkMGRjXHVjNzc4IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWM3OTBcdWNjYjRcdWI4NWMgXHVhYzAwXHVjODM4XHVjNjJjIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9NU0cxPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzFcdWM3NDQgXHVhYzAwXHVjODM4XHVjNjI0XHViMjk0IFx1YzkxMS4uLg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfRVJSX0ltcG9ydF9jb25maWd1cmF0aW9uPVx1YWQ2Y1x1YzEzMVx1Yzc0NCBcdWFjMDBcdWM4MzhcdWM2MjRcdWM5YzAgXHViYWJiXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF90aXRsZT1cdWNjYjRcdWQwNmNcdWM1NDRcdWM2YzMgXHVjMmU0XHVkMzI4DQotRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX21zZz1cdWM3N2NcdWJkODAgXHVkMzBjXHVjNzdjXHVjNzc0IFx1Y2NiNFx1ZDA2Y1x1YzU0NFx1YzZjM1x1YjQxOFx1YzljMCBcdWM1NGFcdWM1NThcdWMyYjVcdWIyYzhcdWIyZTQuIFx1YjJlNFx1YzJkYyBcdWMyZGNcdWIzYzRcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotDQotSW1wb3J0Q29uZmlnUmVwb3J0UGFnZV90aXRsZT1cdWFkNmNcdWMxMzEgXHViY2Y0XHVhY2UwXHVjMTFjIFx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMA0KLUltcG9ydFBsdWdpbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUU6IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YWMwMCBcdWM3N2RcdWFlMzAgXHVjODA0XHVjNmE5XHVjNzg1XHViMmM4XHViMmU0Lg0KLUltcG9ydFBsdWdpbldpemFyZF9NU0cxPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NDQgXHVhYzAwXHVjODM4XHVjNjI0XHViMjk0IFx1YzkxMS4uLg0KLUltcG9ydFBsdWdpbldpemFyZF9lcnJvcj1cdWM2MjRcdWI5NTgNCi1JbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9leGlzdGluZ19wbHVnaW5zPUlVUEUwMjAwRTogXHVjMTIwXHVkMGRkXHVkNTVjIFx1YjJlNFx1Yzc0YyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NzQgXHVjNzc0XHViYmY4IFx1Yzc4OFx1YWUzMCBcdWI1NGNcdWJiMzhcdWM1ZDAgXHViM2Q5XHVjNzdjXHVkNTVjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc0NCBcdWIyZTRcdWMyZGMgXHVhYzAwXHVjODM4XHVjNjI0XHViYTc0IFx1YWUzMFx1Yzg3NCBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NDQgXHVhY2I5XHVjY2QwXHVjNTAxXHViMmM4XHViMmU0LlxuXG4gezB9IFxuXG5cdWFjYzRcdWMxOGRcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotSW1wb3J0UGx1Z2luV2l6YXJkX2NvbmZpcm1fY29udGludWU9XG5cblx1YWNjNFx1YzE4ZFx1ZDU1OFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8NCi0NCi1TZWxlY3RDb25maWdzVG9JbXBvcnRfbGFiZWwxPVx1YWMwMFx1YzgzOFx1YzYyYyBcdWM2OTRcdWMxOGM6DQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9lcnJvcj1cdWM2MjRcdWI5NTgNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX01TRzE9XHViZDg0XHVjMTFkIFx1YzkxMQ0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX3RpdGxlMj1cdWFjMDBcdWM4MzhcdWM2MmMgXHVhZDZjXHVjMTMxIFx1YzJhNFx1ZDM5OSBcdWMxMjBcdWQwZGQNCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm90X3VzZWQ9bm90X3VzZWQNCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fcGF0aD1cdWM5YzBcdWM4MTVcdWQ1NWMgXHViNTE0XHViODA5XHVkMWEwXHViOWFjXHVhYzAwIFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fZGlyPVx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhY1x1Yjk3YyBcdWM5YzBcdWM4MTVcdWQ1NThcdWM5YzAgXHVjNTRhXHVjNTU4XHVjMmI1XHViMmM4XHViMmU0Lg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9wbHVnaW5zPVx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMCBcdWI1MTRcdWI4MDlcdWQxYTBcdWI5YWNcdWM1ZDBcdWMxMWMgXHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3Nzg6DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvcj1cdWM3OTFcdWMxMzFcdWM3OTA6DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3ZlcnNpb249XHViYzg0XHVjODA0Og0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9kZXNjPVx1YWMwNFx1YjdiNVx1ZDU1YyBcdWMxMjRcdWJhODU6DQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUU6IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YWMwMCBcdWM3N2RcdWFlMzAgXHVjODA0XHVjNmE5XHVjNzg1XHViMmM4XHViMmU0Lg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMD1cdWMxMjBcdWQwZGRcdWQ1NWMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzU4IFx1YzcyMFx1ZDZhOFx1YzEzMSBcdWFjODBcdWM5OWQgXHVjOTExLi4uDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cxPVx1YzljMFx1YzgxNVx1ZDU1YyBcdWFjYmRcdWI4NWNcdWM1ZDAgXHVjNjJjXHViYzE0XHViOTc4IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NzQgXHVkM2VjXHVkNTY4XHViNDE4XHVjNWI0IFx1Yzc4OFx1YzljMCBcdWM1NGFcdWMyYjVcdWIyYzhcdWIyZTQuDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0czPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NDQgXHVhYzAwXHVjODM4XHVjNjI0XHViMjk0IFx1YzkxMS4uLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNT1cdWMxMjBcdWQwZGRcdWQ1NWMgXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc0NCBcdWFjMDBcdWM4MzhcdWM2MmMgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gXHVkNjA0XHVjN2FjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM1ZDBcdWMxMWMgXHVkNTc0XHViMmY5XHVkNTU4XHViMjk0IFx1Yzg4NVx1YzE4ZFx1YzgwMSBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzggJyd7MH0nJ1x1Yzc0NChcdWI5N2MpIFx1Y2MzZVx1Yzc0NCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNj1cdWMxMjBcdWQwZGRcdWQ1NWMgXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc0NCBcdWFjMDBcdWM4MzhcdWM2MmMgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gXHVkNjA0XHVjN2FjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM1ZDBcdWMxMWMgXHVkNTc0XHViMmY5XHVkNTU4XHViMjk0IFx1Yzg4NVx1YzE4ZFx1YzgwMSBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NDQgXHVjYzNlXHVjNzQ0IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotRGlmZlJlcG9ydFZpZXdlcl9jb250ZW50PVx1Y2VlOFx1ZDE1MFx1Y2UyMA0KLURpZmZSZXBvcnRWaWV3ZXJfaW5faW1wb3J0PVx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMCBcdWIwYjRcdWJkODANCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfTVNHMT1cdWQzMGNcdWM3N2MgXHViZDg0XHVjMTFkIFx1YzkxMS4uLg0KLURpZmZSZXBvcnRMYWJlbFByb3ZpZGVyX3llcz1cdWM2MDgNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfZXJyb3I9XHVjNjI0XHViOTU4DQotRGlmZlJlcG9ydFZpZXdlcl9pbl9saWI9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YjBiNFx1YmQ4MA0KLURpZmZSZXBvcnRWaWV3ZXJfc3RhdHVzPVx1YzBjMVx1ZDBkYw0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luRXhpc3RzPVx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NzQgXHVkNjA0XHVjN2FjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YzVkMCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5Ob3RFeGlzdHM9XHVjMTIwXHVkMGRkXHVkNTVjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc3NCBcdWQ2MDRcdWM3YWMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVjNWQwIFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9saWJyYXJ5Q29uZmlnU3BlY0V4aXN0cz1cdWFkNmNcdWMxMzFcdWM3NzQgXHVkNjA0XHVjN2FjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YzVkMCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY05vU2VsZWN0aW9uPVx1YWQ2Y1x1YzEzMSBcdWMyYTRcdWQzOTlcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVjOWMwIFx1YzU0YVx1YzU1OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjRGF0YUxhYmVsPVx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMCBcdWI1MTRcdWI4MDlcdWQxYTBcdWI5YWNcdWM3NTggXHVjMTIwXHVkMGRkXHViNDFjIFx1YWQ2Y1x1YzEzMQ0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2NvbmZpZ3M9XHVhYzAwXHVjODM4XHVjNjI0XHVhZTMwIFx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhY1x1YzVkMFx1YzExYyBcdWMwYWNcdWM2YTkgXHVhYzAwXHViMmE1XHVkNTVjIFx1YWQ2Y1x1YzEzMSBcdWMyYTRcdWQzOTk6DQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZD1ub3RfdXNlZA0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2Rlc2M9XHVhYzA0XHViN2I1XHVkNTVjIFx1YzEyNFx1YmE4NToNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX3BhdGg9XHVjOWMwXHVjODE1XHVkNTVjIFx1YWNiZFx1Yjg1Y1x1YWMwMCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X3BsdWdpbk5vU2VsZWN0aW9uPVx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWM5YzAgXHVjNTRhXHVjNTU4XHVjMmI1XHViMmM4XHViMmU0Lg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm9fZGlyPVx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhY1x1Yjk3YyBcdWM5YzBcdWM4MTVcdWQ1NThcdWM5YzAgXHVjNTRhXHVjNTU4XHVjMmI1XHViMmM4XHViMmU0Lg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX3JlYWRvbmx5PXswfSBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NzQgXHVjNzdkXHVhZTMwIFx1YzgwNFx1YzZhOVx1Yzc4NVx1YjJjOFx1YjJlNC5cbg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX2xvY2tlZD1JVVBFMDIwM0U6IHswfSBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NzQgXHVjN2EwXHVhZTA4IFx1YzBjMVx1ZDBkY1x1Yzc4NVx1YjJjOFx1YjJlNC5cbg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfZXJyb3Jfbm90X3VwZGF0YWJsZT1cdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM3NTggXHVjNzdjXHViZDgwIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OFx1Yzc3NCBcdWM3YTBcdWFlMDggXHVjMGMxXHVkMGRjXHVjNzc0XHVhYzcwXHViMDk4IFx1Yzc3ZFx1YWUzMCBcdWM4MDRcdWM2YTlcdWM3ODVcdWIyYzhcdWIyZTQuXG4gXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzU4IFx1YzdhMFx1YWUwOFx1Yzc0NCBcdWQ1NzRcdWM4MWNcdWQ1NThcdWFjNzBcdWIwOTggXHVkMzBjXHVjNzdjXHVjNzc0IFx1YWMzMVx1YzJlMCBcdWFjMDBcdWIyYTVcdWQ1NWNcdWM5YzAgXHVkNjU1XHVjNzc4XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5EYXRhTGFiZWw9XHVhYzAwXHVjODM4XHVjNjI0XHVhZTMwIFx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhY1x1YzVkMFx1YzExYyBcdWMxMjBcdWQwZGRcdWI0MWMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4DQotRGlmZlJlcG9ydFZpZXdlcl90eXBlPVx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWM3MjBcdWQ2MTUNCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9saWJyYXJ5Q29uZmlnU3BlY05vdEV4aXN0cz1cdWMxMjBcdWQwZGRcdWQ1NWMgXHVhZDZjXHVjMTMxXHVjNzc0IFx1ZDYwNFx1YzdhYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM1ZDAgXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUEUwMjA0RTogXHVjOWMwXHVjODE1XHViNDFjIFx1ZDMwY1x1Yzc3Y1x1Yzc3NCB7MX0gXHVjNzc0XHVjODA0IFx1YmM4NFx1YzgwNCh7MH0pXHVjNWQwXHVjMTFjIFx1YjBiNFx1YmNmNFx1YjBiNFx1Yzg0Y1x1YzJiNVx1YjJjOFx1YjJlNC4gezF9IFx1ZDYwNFx1YzdhYyBcdWJjODRcdWM4MDRcdWM3NDQgXHVjMGFjXHVjNmE5XHVkNTU4XHVjNWVjIFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWIwYjRcdWJjZjRcdWIwYjRcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd249SVVQRTAyMDVFOiBcdWM5YzBcdWM4MTVcdWI0MWMgXHVkMzBjXHVjNzdjXHVjNzc0IHswfSBcdWM3NzRcdWM4MDQgXHViYzg0XHVjODA0XHVjNWQwXHVjMTFjIFx1YjBiNFx1YmNmNFx1YjBiNFx1Yzg0Y1x1YzJiNVx1YjJjOFx1YjJlNC4gezB9IFx1ZDYwNFx1YzdhYyBcdWJjODRcdWM4MDRcdWM3NDQgXHVjMGFjXHVjNmE5XHVkNTU4XHVjNWVjIFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWIwYjRcdWJjZjRcdWIwYjRcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUEUwMjA2RTogXHVjOWMwXHVjODE1XHViNDFjIFx1ZDMwY1x1Yzc3Y1x1Yzc3NCB7MX0gXHVjMGM4IFx1YmM4NFx1YzgwNCh7MH0pXHVjNWQwXHVjMTFjIFx1YjBiNFx1YmNmNFx1YjBiNFx1Yzg0Y1x1YzJiNVx1YjJjOFx1YjJlNC4gXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YWMwMFx1YzgzOFx1YzYyNFx1YjgyNFx1YmE3NCB7MX0gXHViYzg0XHVjODA0XHVjNzQ0IFx1YzVjNVx1YWRmOFx1YjgwOFx1Yzc3NFx1YjRkY1x1ZDU3NFx1YzU3YyBcdWQ1NjlcdWIyYzhcdWIyZTQuIA0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQRTAyMDdFOiBcdWM5YzBcdWM4MTVcdWQ1NWMgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YzVmNCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcdWQzMGNcdWM3N2NcdWM3NDQgXHVhYzAwXHVjODM4XHVjNjI0XHViODI0XHViYTc0IHswfSBcdWJjODRcdWM4MDRcdWM3NDQgXHVjNWM1XHVhZGY4XHViODA4XHVjNzc0XHViNGRjXHVkNTc0XHVjNTdjIFx1ZDU2OVx1YjJjOFx1YjJlNC4gDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2YzE0NzIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMjAwRSAtIElVUEUwMjk5RQ0KLSMNCi0NCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlPUltcG9ydGFyIENvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGUgQmlibGlvdGVjYQ0KLXNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGl0bGU9RXNwZWNpZmljYXIgZGlyZXRcdTAwZjNyaW8gZGUgaW1wb3J0YVx1MDBlN1x1MDBlM28NCi1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RleHQ9RXNwZWNpZmlxdWUgbyBkaXJldFx1MDBmM3JpbyBxdWUgY29udFx1MDBlOW0gYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIGJpYmxpb3RlY2EgcGFyYSBpbXBvcnRhXHUwMGU3XHUwMGUzby4NCi1yZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90aXRsZT1SZXZpc2FyIGFsdGVyYVx1MDBlN1x1MDBmNWVzIGRhIGJpYmxpb3RlY2ENCi1yZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90ZXh0PVJldmlzZSBhcyBhbHRlcmFcdTAwZTdcdTAwZjVlcyBxdWUgc2VyXHUwMGUzbyBmZWl0YXMgbmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgYXR1YWwuDQotc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RpdGxlPVNlbGVjaW9uYXIgZXNwZWNpZmljYVx1MDBlN1x1MDBmNWVzIGRlIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28NCi1zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGV4dD1TZWxlY2lvbmUgdW1hIG91IG1haXMgZXNwZWNpZmljYVx1MDBlN1x1MDBmNWVzIGRlIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gcGFyYSBpbXBvcnRhXHUwMGU3XHUwMGUzby4NCi0NCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkDQotaW1wb3J0UGx1Z2luc1dpemFyZF90aXRsZT1JbXBvcnRhciBQbHVnLWlucyBkZSBNXHUwMGU5dG9kbw0KLXNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RpdGxlPUVzcGVjaWZpY2FyIGRpcmV0XHUwMGYzcmlvIGRlIGltcG9ydGFcdTAwZTdcdTAwZTNvDQotc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGV4dD1Fc3BlY2lmaXF1ZSBvIGRpcmV0XHUwMGYzcmlvIHF1ZSBjb250XHUwMGU5bSBvcyBwbHVnLWlucyBkZSBtXHUwMGU5dG9kbyBwYXJhIGltcG9ydGFcdTAwZTdcdTAwZTNvLg0KLXNlbGVjdFBsdWdpbnNXaXphcmRQYWdlX3RpdGxlPVNlbGVjaW9uYXIgcGx1Zy1pbnMgZGUgbVx1MDBlOXRvZG8NCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90ZXh0PVNlbGVjaW9uZSB1bSBvdSBtYWlzIHBsdWctaW5zIGRlIG1cdTAwZTl0b2RvIHBhcmEgaW1wb3J0YVx1MDBlN1x1MDBlM28uIFNlIHVtIHBsdWctaW4gc2VsZWNpb25hZG8galx1MDBlMSBleGlzdGlyIG5hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGF0dWFsLCB2ZXJpZmlxdWUgYXMgZGlmZXJlblx1MDBlN2FzIGRlIHZlcnNcdTAwZjVlcy4NCi1pbXBvcnRQbHVnaW5zV2l6YXJkX0VSUl9JbXBvcnRfcGx1Z2luPUZhbGhhIGFvIGltcG9ydGFyIHBsdWdpbg0KLQ0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzA9VmFsaWRhbmRvIGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkYSBiaWJsaW90ZWNhIHNlbGVjaW9uYWRhLi4uDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMT1PIGRpcmV0XHUwMGYzcmlvIGVzcGVjaWZpY2FkbyBuXHUwMGUzbyBjb250XHUwMGU5bSB1bWEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyB2XHUwMGUxbGlkYS4NCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0czPUltcG9ydGFuZG8gY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBtXHUwMGU5dG9kby4uLg0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzI9SW1wb3NzXHUwMGVkdmVsIGltcG9ydGFyIGEgYmlibGlvdGVjYSBhYmVydGEgYXR1YWxtZW50ZSBwYXJhIGRlbnRybyBkZWxhIG1lc21hLg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfTVNHMT1JbXBvcnRhbmRvIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGUgbVx1MDBlOXRvZG8uLi4NCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX0VSUl9JbXBvcnRfY29uZmlndXJhdGlvbj1GYWxoYSBhbyBpbXBvcnRhciBjb25maWd1cmFcdTAwZTdcdTAwZTNvDQotDQotRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX3RpdGxlPUZhbGhhIG5vIHJlZ2lzdHJvIGRlIHNhXHUwMGVkZGENCi1GaWxlTW9kaWZ5Q2hlY2tlcl9DaGVja291dF9mYWlsZWRfbXNnPUEgc2FcdTAwZWRkYSBkZSBhbGd1bnMgYXJxdWl2b3Mgblx1MDBlM28gZm9pIGVmZXR1YWRhOyBkZXNlamEgdGVudGFyIG5vdmFtZW50ZT8NCi0NCi1JbXBvcnRDb25maWdSZXBvcnRQYWdlX3RpdGxlPUltcG9ydGFuZG8gUmVsYXRcdTAwZjNyaW8gZGUgQ29uZmlndXJhXHUwMGU3XHUwMGUzbw0KLUltcG9ydFBsdWdpbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUU6IEEgYmlibGlvdGVjYSBcdTAwZTkgZGUgbGVpdHVyYS4NCi1JbXBvcnRQbHVnaW5XaXphcmRfTVNHMT1JbXBvcnRhbmRvIHBsdWctaW4gZGUgbVx1MDBlOXRvZG8uLi4NCi1JbXBvcnRQbHVnaW5XaXphcmRfZXJyb3I9RXJybw0KLUltcG9ydFBsdWdpbldpemFyZF93YXJuX2V4aXN0aW5nX3BsdWdpbnM9SVVQRTAyMDBFOiBPcyBzZWd1aW50ZXMgcGx1Zy1pbnMgc2VsZWNpb25hZG9zIGpcdTAwZTEgZXhpc3RlbSBlIGEgcmVpbXBvcnRhXHUwMGU3XHUwMGUzbyBkb3MgbWVzbW9zIHBsdWctaW5zIHNvYnJlc2NyZXZlclx1MDBlMSBvcyBleGlzdGVudGVzOlxuXG4gezB9IFxuXG5UZW0gY2VydGV6YSBkZSBxdWUgZGVzZWphIGNvbnRpbnVhcj8NCi1JbXBvcnRQbHVnaW5XaXphcmRfY29uZmlybV9jb250aW51ZT1cblxuVGVtIGNlcnRlemEgZGUgcXVlIGRlc2VqYSBjb250aW51YXI/DQotDQotU2VsZWN0Q29uZmlnc1RvSW1wb3J0X2xhYmVsMT1PcyBzZWd1aW50ZXMgZWxlbWVudG9zIHNlclx1MDBlM28gaW1wb3J0YWRvczoNCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yPUVycm8NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX01TRzE9QW5hbGlzYW5kbw0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX3RpdGxlMj1TZWxlY2lvbmFyIGVzcGVjaWZpY2FcdTAwZTdcdTAwZjVlcyBkZSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHBhcmEgaW1wb3J0YVx1MDBlN1x1MDBlM28NCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm90X3VzZWQ9blx1MDBlM29fdXRpbGl6YWRvDQotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX3BhdGg9TyBkaXJldFx1MDBmM3JpbyBlc3BlY2lmaWNhZG8gblx1MDBlM28gZXhpc3RlLg0KLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19kaXI9TmVuaHVtIGRpcmV0XHUwMGYzcmlvIGVzcGVjaWZpY2Fkbw0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9wbHVnaW5zPVBsdWctaW5zIGRpc3Bvblx1MDBlZHZlaXMgbm8gZGlyZXRcdTAwZjNyaW8gZGUgaW1wb3J0YVx1MDBlN1x1MDBlM286DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvcj1BdXRvcjoNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfdmVyc2lvbj1WZXJzXHUwMGUzbzoNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfZGVzYz1EZXNjcmlcdTAwZTdcdTAwZTNvIHJlc3VtaWRhOg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfcmVhZG9ubHk9SVVQRTAyMDFFOiBBIGJpYmxpb3RlY2EgXHUwMGU5IGRlIGxlaXR1cmEuDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cwPVZhbGlkYW5kbyBvcyBwbHVnLWlucyBzZWxlY2lvbmFkb3MuLi4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzE9TyBjYW1pbmhvIGVzcGVjaWZpY2FkbyBuXHUwMGUzbyBjb250XHUwMGU5bSB1bSBwbHVnLWluIGRlIG1cdTAwZTl0b2RvIHZcdTAwZTFsaWRvLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMz1JbXBvcnRhbmRvIHBsdWctaW4gZGUgbVx1MDBlOXRvZG8uLi4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzU9Tlx1MDBlM28gXHUwMGU5IHBvc3NcdTAwZWR2ZWwgaW1wb3J0YXIgbyBwbHVnLWluIGRlIG1cdTAwZTl0b2RvIHNlbGVjaW9uYWRvLiBTZXUgcGx1Zy1pbiBkZXBlbmRlbnRlICcnezB9Jycgblx1MDBlM28gZm9pIGxvY2FsaXphZG8gbmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgYXR1YWwuDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c2PU5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIGltcG9ydGFyIG8gcGx1Zy1pbiBkZSBtXHUwMGU5dG9kbyBzZWxlY2lvbmFkby4gTlx1MDBlM28gZm9pIHBvc3NcdTAwZWR2ZWwgbG9jYWxpemFyIHVtIHBsdWctaW4gZGVwZW5kZW50ZSBuYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBhdHVhbC4NCi1EaWZmUmVwb3J0Vmlld2VyX2NvbnRlbnQ9Q29udGVcdTAwZmFkbw0KLURpZmZSZXBvcnRWaWV3ZXJfaW5faW1wb3J0PU5hIEltcG9ydGFcdTAwZTdcdTAwZTNvDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X01TRzE9QW5hbGlzYW5kbyBhcnF1aXZvcy4uLg0KLURpZmZSZXBvcnRMYWJlbFByb3ZpZGVyX3llcz1TaW0NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfZXJyb3I9RXJybw0KLURpZmZSZXBvcnRWaWV3ZXJfaW5fbGliPU5hIEJpYmxpb3RlY2ENCi1EaWZmUmVwb3J0Vmlld2VyX3N0YXR1cz1TdGF0dXMNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGlicmFyeVBsdWdpbkV4aXN0cz1PIHBsdWctaW4gc2VsZWNpb25hZG8gZm9pIGxvY2FsaXphZG8gbmEgYmlibGlvdGVjYSBhdHVhbC4NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGlicmFyeVBsdWdpbk5vdEV4aXN0cz1PIHBsdWctaW4gc2VsZWNpb25hZG8gblx1MDBlM28gZm9pIGxvY2FsaXphZG8gbmEgYmlibGlvdGVjYSBhdHVhbC4NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9saWJyYXJ5Q29uZmlnU3BlY0V4aXN0cz1BIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZm9pIGxvY2FsaXphZGEgbmEgYmlibGlvdGVjYSBhdHVhbC4NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjTm9TZWxlY3Rpb249TmVuaHVtYSBlc3BlY2lmaWNhXHUwMGU3XHUwMGUzbyBkZSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHNlbGVjaW9uYWRhLg0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNEYXRhTGFiZWw9Q29uZmlndXJhXHUwMGU3XHUwMGUzbyBzZWxlY2lvbmFkYSBubyBkaXJldFx1MDBmM3JpbyBkZSBpbXBvcnRhXHUwMGU3XHUwMGUzby4NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9jb25maWdzPUVzcGVjaWZpY2FcdTAwZTdcdTAwZjVlcyBkZSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRpc3Bvblx1MDBlZHZlaXMgbm8gZGlyZXRcdTAwZjNyaW8gZGUgaW1wb3J0YVx1MDBlN1x1MDBlM286DQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZD1uXHUwMGUzb191dGlsaXphZG8NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9kZXNjPURlc2NyaVx1MDBlN1x1MDBlM28gcmVzdW1pZGE6DQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19wYXRoPU8gY2FtaW5obyBlc3BlY2lmaWNhZG8gblx1MDBlM28gZXhpc3RlLg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5Ob1NlbGVjdGlvbj1OZW5odW0gcGx1Zy1pbiBzZWxlY2lvbmFkby4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX2Rpcj1OZW5odW0gZGlyZXRcdTAwZjNyaW8gZXNwZWNpZmljYWRvDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fcmVhZG9ubHk9TyBwbHVnLWluIHswfSBcdTAwZTkgZGUgbGVpdHVyYVxuDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fbG9ja2VkPUlVUEUwMjAzRTogTyBwbHVnLWluIHswfSBlc3RcdTAwZTEgYmxvcXVlYWRvXG4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX2Vycm9yX25vdF91cGRhdGFibGU9QWxndW0obnMpIGRvKHMpIHBsdWctaW4ocykgZGEgYmlibGlvdGVjYSBlc3RcdTAwZTNvIGJsb3F1ZWFkb3Mgb3Ugc1x1MDBlM28gZGUgbGVpdHVyYS5cbkRlc2Jsb3F1ZWllIG9zIHBsdWctaW5zIGUgY2VydGlmaXF1ZS1zZSBkZSBxdWUgb3MgYXJxdWl2b3Mgc1x1MDBlM28gYXR1YWxpelx1MDBlMXZlaXMuDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X3BsdWdpbkRhdGFMYWJlbD1QbHVnLWluIHNlbGVjaW9uYWRvIG5vIGRpcmV0XHUwMGYzcmlvIGRlIGltcG9ydGFcdTAwZTdcdTAwZTNvLg0KLURpZmZSZXBvcnRWaWV3ZXJfdHlwZT1UaXBvIGRlIENvbnRlXHUwMGZhZG8NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9saWJyYXJ5Q29uZmlnU3BlY05vdEV4aXN0cz1BIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gc2VsZWNpb25hZGEgblx1MDBlM28gZm9pIGxvY2FsaXphZGEgbmEgYmlibGlvdGVjYSBhdHVhbC4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YT1JVVBFMDIwNEU6IE9zIGFycXVpdm9zIGVzcGVjaWZpY2Fkb3MgZm9yYW0gZXhwb3J0YWRvcyBwb3IgdW1hIHZlcnNcdTAwZTNvIGFudGVyaW9yICh7MH0pIGRlIHsxfS4gT3MgYXJxdWl2b3MgZGV2ZW0gc2VyIGV4cG9ydGFkb3MgdXNhbmRvIGEgdmVyc1x1MDBlM28gYXR1YWwgZG8gezF9Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd249SVVQRTAyMDVFOiBPcyBhcnF1aXZvcyBlc3BlY2lmaWNhZG9zIGZvcmFtIGV4cG9ydGFkb3MgcG9yIHVtYSB2ZXJzXHUwMGUzbyBhbnRlcmlvciBkZSB7MH0uIE9zIGFycXVpdm9zIGRldmVtIHNlciBleHBvcnRhZG9zIHVzYW5kbyBhIHZlcnNcdTAwZTNvIGF0dWFsIGRvIHswfS4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1JVVBFMDIwNkU6IE9zIGFycXVpdm9zIGVzcGVjaWZpY2Fkb3MgZm9yYW0gZXhwb3J0YWRvcyBwb3IgdW1hIHZlcnNcdTAwZTNvIG1haXMgcmVjZW50ZSAoezB9KSBkZSB7MX0uIFZvY1x1MDBlYSBkZXZlIGZhemVyIHVwZ3JhZGUgZGUgezF9IHBhcmEgaW1wb3J0YXIgb3MgYXJxdWl2b3MuICANCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUEUwMjA3RTogT3MgYXJxdWl2b3MgZXNwZWNpZmljYWRvcyBuXHUwMGUzbyBwdWRlcmFtIHNlciBhYmVydG9zLiBWb2NcdTAwZWEgZGV2ZSBmYXplciB1cGdyYWRlIGRlIHswfSBwYXJhIGltcG9ydGFyIG9zIGFycXVpdm9zLiAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1ZGQ5ZmQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMjAwRSAtIElVUEUwMjk5RQ0KLSMNCi0NCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlPVx1NWJmY1x1NTE2NVx1NWU5M1x1OTE0ZFx1N2Y2ZQ0KLXNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGl0bGU9XHU2MzA3XHU1YjlhXHU1YmZjXHU1MTY1XHU3NmVlXHU1ZjU1DQotc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90ZXh0PVx1NjMwN1x1NWI5YVx1NTMwNVx1NTQyYlx1ODk4MVx1NWJmY1x1NTE2NVx1NzY4NFx1NWU5M1x1OTE0ZFx1N2Y2ZVx1NzY4NFx1NzZlZVx1NWY1NVx1MzAwMg0KLXJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RpdGxlPVx1NjhjMFx1NjdlNVx1NWU5M1x1NjZmNFx1NjUzOQ0KLXJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RleHQ9XHU2OGMwXHU2N2U1XHU1YzA2XHU1YmY5XHU1ZjUzXHU1MjRkXHU2NWI5XHU2Y2Q1XHU1ZTkzXHU0ZjVjXHU1MWZhXHU3Njg0XHU2NmY0XHU2NTM5XHUzMDAyDQotc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RpdGxlPVx1OTAwOVx1NjJlOVx1OTE0ZFx1N2Y2ZVx1ODljNFx1ODMwMw0KLXNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90ZXh0PVx1OTAwOVx1NjJlOVx1ODk4MVx1NWJmY1x1NTE2NVx1NzY4NFx1NGUwMFx1NGUyYVx1NjIxNlx1NTkxYVx1NGUyYVx1OTE0ZFx1N2Y2ZVx1ODljNFx1ODMwM1x1MzAwMg0KLQ0KLSMgSW1wb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1pbXBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlPVx1NWJmY1x1NTE2NVx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNg0KLXNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RpdGxlPVx1NjMwN1x1NWI5YVx1NWJmY1x1NTE2NVx1NzZlZVx1NWY1NQ0KLXNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RleHQ9XHU2MzA3XHU1YjlhXHU1MzA1XHU1NDJiXHU4OTgxXHU1YmZjXHU1MTY1XHU3Njg0XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHU3Njg0XHU3NmVlXHU1ZjU1XHUzMDAyDQotc2VsZWN0UGx1Z2luc1dpemFyZFBhZ2VfdGl0bGU9XHU5MDA5XHU2MmU5XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2DQotc2VsZWN0UGx1Z2luc1dpemFyZFBhZ2VfdGV4dD1cdTkwMDlcdTYyZTlcdTg5ODFcdTViZmNcdTUxNjVcdTc2ODRcdTRlMDBcdTRlMmFcdTYyMTZcdTU5MWFcdTRlMmFcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjZcdTMwMDJcdTU5ODJcdTY3OWNcdTkwMDlcdTViOWFcdTc2ODRcdTYzZDJcdTRlZjZcdTVkZjJcdTViNThcdTU3MjhcdTRlOGVcdTVmNTNcdTUyNGRcdTY1YjlcdTZjZDVcdTVlOTNcdTRlMmRcdWZmMGNcdThiZjdcdTlhOGNcdThiYzFcdTcyNDhcdTY3MmNcdTY3MDlcdTRlYzBcdTRlNDhcdTVkZWVcdTVmMDJcdTMwMDINCi1pbXBvcnRQbHVnaW5zV2l6YXJkX0VSUl9JbXBvcnRfcGx1Z2luPVx1NWJmY1x1NTE2NVx1NjNkMlx1NGVmNlx1NTkzMVx1OGQyNQ0KLQ0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzA9XHU2YjYzXHU1NzI4XHU5YThjXHU4YmMxXHU5MDA5XHU1YjlhXHU3Njg0XHU1ZTkzXHU5MTRkXHU3ZjZlLi4uDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMT1cdTYzMDdcdTViOWFcdTc2ODRcdTc2ZWVcdTVmNTVcdTRlMGRcdTUzMDVcdTU0MmJcdTY3MDlcdTY1NDhcdTkxNGRcdTdmNmVcdTMwMDINCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0czPVx1NmI2M1x1NTcyOFx1NWJmY1x1NTE2NVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZS4uLg0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzI9XHU2NWUwXHU2Y2Q1XHU1YzA2XHU1ZjUzXHU1MjRkXHU2MjUzXHU1ZjAwXHU3Njg0XHU1ZTkzXHU1YmZjXHU1MTY1XHU1MTc2XHU2NzJjXHU4ZWFiXHUzMDAyDQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9NU0cxPVx1NmI2M1x1NTcyOFx1NWJmY1x1NTE2NVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZS4uLg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfRVJSX0ltcG9ydF9jb25maWd1cmF0aW9uPVx1NWJmY1x1NTE2NVx1OTE0ZFx1N2Y2ZVx1NTkzMVx1OGQyNQ0KLQ0KLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF90aXRsZT1cdTY4YzBcdTUxZmFcdTU5MzFcdThkMjUNCi1GaWxlTW9kaWZ5Q2hlY2tlcl9DaGVja291dF9mYWlsZWRfbXNnPVx1NjcwOVx1NGU5Ylx1NjU4N1x1NGVmNlx1NWMxYVx1NjcyYVx1NjhjMFx1NTFmYVx1ZmYwY1x1NjYyZlx1NTQyNlx1ODk4MVx1OTFjZFx1OGJkNVx1ZmYxZg0KLQ0KLUltcG9ydENvbmZpZ1JlcG9ydFBhZ2VfdGl0bGU9XHU1YmZjXHU1MTY1XHU5MTRkXHU3ZjZlXHU2MmE1XHU1NDRhDQotSW1wb3J0UGx1Z2luV2l6YXJkX3JlYWRvbmx5PUlVUEUwMjAxRTogXHU1ZTkzXHU0ZTNhXHU1M2VhXHU4YmZiXHUzMDAyDQotSW1wb3J0UGx1Z2luV2l6YXJkX01TRzE9XHU2YjYzXHU1NzI4XHU1YmZjXHU1MTY1XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2Li4uDQotSW1wb3J0UGx1Z2luV2l6YXJkX2Vycm9yPVx1OTUxOVx1OGJlZg0KLUltcG9ydFBsdWdpbldpemFyZF93YXJuX2V4aXN0aW5nX3BsdWdpbnM9SVVQRTAyMDBFOiBcdTRlZTVcdTRlMGJcdTkwMDlcdTViOWFcdTc2ODRcdTYzZDJcdTRlZjZcdTVkZjJcdTViNThcdTU3MjhcdWZmMGNcdTkxY2RcdTY1YjBcdTViZmNcdTUxNjVcdTc2ZjhcdTU0MGNcdTYzZDJcdTRlZjZcdTVjMDZcdTg5ODZcdTc2ZDZcdTczYjBcdTY3MDlcdTYzZDJcdTRlZjZcdWZmMWFcblxuIHswfSBcblxuXHU3ODZlXHU1YjllXHU4OTgxXHU3ZWU3XHU3ZWVkXHU1NDE3XHVmZjFmDQotSW1wb3J0UGx1Z2luV2l6YXJkX2NvbmZpcm1fY29udGludWU9XG5cblx1Nzg2ZVx1NWI5YVx1ODk4MVx1N2VlN1x1N2VlZFx1NTQxN1x1ZmYxZg0KLQ0KLVNlbGVjdENvbmZpZ3NUb0ltcG9ydF9sYWJlbDE9XHU1YzA2XHU1YmZjXHU1MTY1XHU0ZWU1XHU0ZTBiXHU1MTQzXHU3ZDIwXHVmZjFhDQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9lcnJvcj1cdTk1MTlcdThiZWYNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX01TRzE9XHU2YjYzXHU1NzI4XHU1MjA2XHU2NzkwDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfdGl0bGUyPVx1OTAwOVx1NjJlOVx1ODk4MVx1NWJmY1x1NTE2NVx1NzY4NFx1OTE0ZFx1N2Y2ZVx1ODljNFx1ODMwMw0KLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub3RfdXNlZD1cdTY3MmFcdTRmN2ZcdTc1MjgNCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fcGF0aD1cdTYzMDdcdTViOWFcdTc2ODRcdTc2ZWVcdTVmNTVcdTRlMGRcdTViNThcdTU3MjhcdTMwMDINCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fZGlyPVx1NjcyYVx1NjMwN1x1NWI5YVx1NGVmYlx1NGY1NVx1NzZlZVx1NWY1NQ0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9wbHVnaW5zPVx1NWJmY1x1NTE2NVx1NzZlZVx1NWY1NVx1NGUyZFx1NzY4NFx1NTNlZlx1NzUyOFx1NjNkMlx1NGVmNlx1ZmYxYQ0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9hdXRob3I9XHU0ZjVjXHU4MDA1XHVmZjFhDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3ZlcnNpb249XHU3MjQ4XHU2NzJjXHVmZjFhDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2Rlc2M9XHU3YjgwXHU4OTgxXHU2M2NmXHU4ZmYwXHVmZjFhDQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUU6IFx1NWU5M1x1NGUzYVx1NTNlYVx1OGJmYlx1MzAwMg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMD1cdTZiNjNcdTU3MjhcdTlhOGNcdThiYzFcdTkwMDlcdTViOWFcdTc2ODRcdTYzZDJcdTRlZjYuLi4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzE9XHU2MzA3XHU1YjlhXHU4ZGVmXHU1Zjg0XHU0ZTBkXHU1MzA1XHU1NDJiXHU2NzA5XHU2NTQ4XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHUzMDAyDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0czPVx1NmI2M1x1NTcyOFx1NWJmY1x1NTE2NVx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNi4uLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNT1cdTY1ZTBcdTZjZDVcdTViZmNcdTUxNjVcdTkwMDlcdTViOWFcdTc2ODRcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjZcdTMwMDJcdTY1ZTBcdTZjZDVcdTU3MjhcdTVmNTNcdTUyNGRcdTY1YjlcdTZjZDVcdTVlOTNcdTRlMmRcdTYyN2VcdTUyMzBcdTViODNcdTc2ODRcdTRmOWRcdThkNTZcdTYzZDJcdTRlZjZcdTIwMWN7MH1cdTIwMWRcdTMwMDINCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzY9XHU2NWUwXHU2Y2Q1XHU1YmZjXHU1MTY1XHU5MDA5XHU1YjlhXHU3Njg0XHU2NWI5XHU2Y2Q1XHU2M2QyXHU0ZWY2XHUzMDAyXHU2N2QwXHU0ZTJhXHU0ZjlkXHU4ZDU2XHU2M2QyXHU0ZWY2XHU1NzI4XHU1ZjUzXHU1MjRkXHU2NWI5XHU2Y2Q1XHU1ZTkzXHU0ZTJkXHU2NWUwXHU2Y2Q1XHU2MjdlXHU1MjMwXHUzMDAyDQotRGlmZlJlcG9ydFZpZXdlcl9jb250ZW50PVx1NTE4NVx1NWJiOQ0KLURpZmZSZXBvcnRWaWV3ZXJfaW5faW1wb3J0PVx1NWJmY1x1NTE2NVx1NGUyZA0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9NU0cxPVx1NmI2M1x1NTcyOFx1NTIwNlx1Njc5MFx1NjU4N1x1NGVmNi4uLg0KLURpZmZSZXBvcnRMYWJlbFByb3ZpZGVyX3llcz1cdTY2MmYNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfZXJyb3I9XHU5NTE5XHU4YmVmDQotRGlmZlJlcG9ydFZpZXdlcl9pbl9saWI9XHU1NzI4XHU1ZTkzXHU0ZTJkDQotRGlmZlJlcG9ydFZpZXdlcl9zdGF0dXM9XHU3MmI2XHU2MDAxDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5FeGlzdHM9XHU1ZjUzXHU1MjRkXHU1ZTkzXHU0ZTJkXHU2MjdlXHU1MjMwXHU3Njg0XHU5MDA5XHU1YjlhXHU2M2QyXHU0ZWY2DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5Ob3RFeGlzdHM9XHU2NzJhXHU1NzI4XHU1ZjUzXHU1MjRkXHU1ZTkzXHU0ZTJkXHU2MjdlXHU1MjMwXHU5MDA5XHU1YjlhXHU3Njg0XHU2M2QyXHU0ZWY2DQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNFeGlzdHM9XHU1NzI4XHU1ZjUzXHU1MjRkXHU1ZTkzXHU0ZTJkXHU2MjdlXHU1MjMwXHU0ZTg2XHU5MTRkXHU3ZjZlDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY05vU2VsZWN0aW9uPVx1NjcyYVx1OTAwOVx1NjJlOVx1NGVmYlx1NGY1NVx1OTE0ZFx1N2Y2ZVx1ODljNFx1ODMwM1x1MzAwMg0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNEYXRhTGFiZWw9XHU1YmZjXHU1MTY1XHU3NmVlXHU1ZjU1XHU0ZTJkXHU3Njg0XHU5MDA5XHU1YjlhXHU5MTRkXHU3ZjZlDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGFiZWxfY29uZmlncz1cdTViZmNcdTUxNjVcdTc2ZWVcdTVmNTVcdTRlMmRcdTc2ODRcdTUzZWZcdTc1MjhcdTkxNGRcdTdmNmVcdTg5YzRcdTgzMDNcdWZmMWENCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkPVx1NjcyYVx1NGY3Zlx1NzUyOA0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2Rlc2M9XHU3YjgwXHU4OTgxXHU2M2NmXHU4ZmYwXHVmZjFhDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19wYXRoPVx1NjMwN1x1NWI5YVx1OGRlZlx1NWY4NFx1NGUwZFx1NWI1OFx1NTcyOFx1MzAwMg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5Ob1NlbGVjdGlvbj1cdTY3MmFcdTkwMDlcdTYyZTlcdTRlZmJcdTRmNTVcdTYzZDJcdTRlZjZcdTMwMDINCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX2Rpcj1cdTY3MmFcdTYzMDdcdTViOWFcdTRlZmJcdTRmNTVcdTc2ZWVcdTVmNTUNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9yZWFkb25seT1cdTYzZDJcdTRlZjYgezB9IFx1NGUzYVx1NTNlYVx1OGJmYlxuDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fbG9ja2VkPUlVUEUwMjAzRTogXHU1ZGYyXHU5NTAxXHU1YjlhXHU2M2QyXHU0ZWY2IHswfVxuDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9lcnJvcl9ub3RfdXBkYXRhYmxlPVx1NWU5M1x1NGUyZFx1NzY4NFx1NjdkMFx1NGU5Ylx1NjNkMlx1NGVmNlx1ODhhYlx1OTUwMVx1NWI5YVx1NjIxNlx1NGUzYVx1NTNlYVx1OGJmYlx1MzAwMlxuIFx1OGJmN1x1ODllM1x1OTUwMVx1OGZkOVx1NGU5Ylx1NjNkMlx1NGVmNlx1ZmYwY1x1NWU3Nlx1Nzg2ZVx1NGZkZFx1NjU4N1x1NGVmNlx1NTNlZlx1NjZmNFx1NjViMFx1MzAwMg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5EYXRhTGFiZWw9XHU1YmZjXHU1MTY1XHU3NmVlXHU1ZjU1XHU0ZTJkXHU3Njg0XHU5MDA5XHU1YjlhXHU2M2QyXHU0ZWY2DQotRGlmZlJlcG9ydFZpZXdlcl90eXBlPVx1NTE4NVx1NWJiOVx1N2M3Ylx1NTc4Yg0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzPVx1NjcyYVx1NTcyOFx1NWY1M1x1NTI0ZFx1NWU5M1x1NGUyZFx1NjI3ZVx1NTIzMFx1OTAwOVx1NWI5YVx1NzY4NFx1OTE0ZFx1N2Y2ZVx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUEUwMjA0RTogXHU2MzA3XHU1YjlhXHU3Njg0XHU2NTg3XHU0ZWY2XHU2NjJmXHU3NTMxIHsxfSBcdTc2ODRcdTUxNDhcdTUyNGRcdTcyNDhcdTY3MmMgezB9IFx1NWJmY1x1NTFmYVx1NzY4NFx1MzAwMlx1NWZjNVx1OTg3Ylx1NGY3Zlx1NzUyOCB7MX0gXHU3Njg0XHU1ZjUzXHU1MjRkXHU3MjQ4XHU2NzJjXHU1YmZjXHU1MWZhXHU4ZmQ5XHU0ZTliXHU2NTg3XHU0ZWY2XHUzMDAyDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBFMDIwNUU6IFx1NjMwN1x1NWI5YVx1NzY4NFx1NjU4N1x1NGVmNlx1NjYyZlx1NzUzMSB7MH0gXHU3Njg0XHU1MTQ4XHU1MjRkXHU3MjQ4XHU2NzJjXHU1YmZjXHU1MWZhXHU3Njg0XHUzMDAyXHU1ZmM1XHU5ODdiXHU0ZjdmXHU3NTI4IHswfSBcdTc2ODRcdTVmNTNcdTUyNGRcdTcyNDhcdTY3MmNcdTViZmNcdTUxZmFcdThmZDlcdTRlOWJcdTY1ODdcdTRlZjZcdTMwMDINCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1JVVBFMDIwNkU6IFx1NjMwN1x1NWI5YVx1NzY4NFx1NjU4N1x1NGVmNlx1NjYyZlx1NzUzMSB7MX0gXHU3Njg0XHU2NmY0XHU2NWIwXHU3MjQ4XHU2NzJjIHswfSBcdTViZmNcdTUxZmFcdTc2ODRcdTMwMDJcdTYwYThcdTVmYzVcdTk4N2JcdTUzNDdcdTdlYTcgezF9IFx1NjI0ZFx1ODBmZFx1NWJmY1x1NTE2NVx1OGZkOVx1NGU5Ylx1NjU4N1x1NGVmNlx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQRTAyMDdFXHVmZjFhXHU2NWUwXHU2Y2Q1XHU2MjUzXHU1ZjAwXHU2MzA3XHU1YjlhXHU3Njg0XHU2NTg3XHU0ZWY2XHUzMDAyXHU2MGE4XHU1ZmM1XHU5ODdiXHU1MzQ3XHU3ZWE3IHswfSBcdTYyNGRcdTgwZmRcdTViZmNcdTUxNjVcdThmZDlcdTRlOWJcdTY1ODdcdTRlZjZcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTFjODg0OS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQRTAyMDBFIC0gSVVQRTAyOTlFDQotIw0KLQ0KLSMgSW1wb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1pbXBvcnRDb25maWdXaXphcmRfdGl0bGU9XHU1MzJmXHU1MTY1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU5MTRkXHU3ZjZlDQotc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90aXRsZT1cdTYzMDdcdTViOWFcdTUzMmZcdTUxNjVcdTc2ZWVcdTkzMDQNCi1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RleHQ9XHU2MzA3XHU1YjlhXHU4OTgxXHU1MzJmXHU1MTY1XHU3Njg0XHU3YTBiXHU1ZjBmXHU1ZWFiXHU5MTRkXHU3ZjZlXHU2MjQwXHU1NzI4XHU3Njg0XHU3NmVlXHU5MzA0XHUzMDAyDQotcmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGl0bGU9XHU1YmU5XHU2N2U1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU4YjhhXHU2NmY0DQotcmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGV4dD1cdTViZTlcdTY3ZTVcdTg5ODFcdTVjMGRcdTczZmVcdTg4NGNcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTYyNDBcdTUwNWFcdTc2ODRcdThiOGFcdTY2ZjRcdTMwMDINCi1zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGl0bGU9XHU5MDc4XHU1M2Q2XHU5MTRkXHU3ZjZlXHU4OThmXHU2ODNjDQotc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RleHQ9XHU5MDc4XHU1M2Q2XHU4OTgxXHU1MzJmXHU1MTY1XHU3Njg0XHU0ZTAwXHU2MjE2XHU1OTFhXHU1MDBiXHU5MTRkXHU3ZjZlXHU4OThmXHU2ODNjXHUzMDAyDQotDQotIyBJbXBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZA0KLWltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGU9XHU1MzJmXHU1MTY1XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGl0bGU9XHU2MzA3XHU1YjlhXHU1MzJmXHU1MTY1XHU3NmVlXHU5MzA0DQotc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGV4dD1cdTYzMDdcdTViOWFcdTg5ODFcdTUzMmZcdTUxNjVcdTc2ODRcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTYyNDBcdTU3MjhcdTc2ODRcdTc2ZWVcdTkzMDRcdTMwMDINCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90aXRsZT1cdTkwNzhcdTUzZDZcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGYNCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90ZXh0PVx1OTA3OFx1NTNkNlx1ODk4MVx1NTMyZlx1NTE2NVx1NzY4NFx1NGUwMFx1NjIxNlx1NTkxYVx1NTAwYlx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1MzAwMlx1NTk4Mlx1Njc5Y1x1OTA3OFx1NTNkNlx1NzY4NFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1NWRmMlx1NWI1OFx1NTcyOFx1NzNmZVx1ODg0Y1x1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZFx1ZmYwY1x1OGFjYlx1OWE1N1x1OGI0OVx1NzI0OFx1NjcyY1x1NWRlZVx1NzU3MFx1MzAwMg0KLWltcG9ydFBsdWdpbnNXaXphcmRfRVJSX0ltcG9ydF9wbHVnaW49XHU1MzJmXHU1MTY1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHU1OTMxXHU2NTU3DQotDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMD1cdTZiNjNcdTU3MjhcdTlhNTdcdThiNDlcdTkwNzhcdTUzZDZcdTc2ODRcdTdhMGJcdTVmMGZcdTVlYWJcdTkxNGRcdTdmNmUuLi4NCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cxPVx1NjMwN1x1NWI5YVx1NzY4NFx1NzZlZVx1OTMwNFx1NGUwZFx1NTQyYlx1NjcwOVx1NjU0OFx1NzY4NFx1OTE0ZFx1N2Y2ZVx1MzAwMg0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzM9XHU2YjYzXHU1NzI4XHU1MzJmXHU1MTY1XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlLi4uDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMj1cdTc2ZWVcdTUyNGRcdTk1OGJcdTU1NWZcdTc2ODRcdTdhMGJcdTVmMGZcdTVlYWJcdTcxMjFcdTZjZDVcdTUzMmZcdTUxNjVcdTY3MmNcdThlYWJcdTMwMDINCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX01TRzE9XHU2YjYzXHU1NzI4XHU1MzJmXHU1MTY1XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlLi4uDQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9FUlJfSW1wb3J0X2NvbmZpZ3VyYXRpb249XHU1MzJmXHU1MTY1XHU5MTRkXHU3ZjZlXHU1OTMxXHU2NTU3DQotDQotRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX3RpdGxlPVx1NzlmYlx1NTFmYVx1NTkzMVx1NjU1Nw0KLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF9tc2c9XHU5MGU4XHU0ZWZkXHU2YTk0XHU2ODQ4XHU2NzJhXHU3OWZiXHU1MWZhXHVmZjBjXHU4OTgxXHU5MWNkXHU4YTY2XHU1NWNlXHVmZjFmDQotDQotSW1wb3J0Q29uZmlnUmVwb3J0UGFnZV90aXRsZT1cdTZiNjNcdTU3MjhcdTUzMmZcdTUxNjVcdTkxNGRcdTdmNmVcdTU4MzFcdTU0NGENCi1JbXBvcnRQbHVnaW5XaXphcmRfcmVhZG9ubHk9SVVQRTAyMDFFOiBcdTdhMGJcdTVmMGZcdTVlYWJcdTY2MmZcdTU1MmZcdThiODBcdTc2ODRcdTMwMDINCi1JbXBvcnRQbHVnaW5XaXphcmRfTVNHMT1cdTZiNjNcdTU3MjhcdTUzMmZcdTUxNjVcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGYuLi4NCi1JbXBvcnRQbHVnaW5XaXphcmRfZXJyb3I9XHU5MzJmXHU4YWE0DQotSW1wb3J0UGx1Z2luV2l6YXJkX3dhcm5fZXhpc3RpbmdfcGx1Z2lucz1JVVBFMDIwMEU6IFx1NGUwYlx1NTIxN1x1OTA3OFx1NTNkNlx1NzY4NFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1NWRmMlx1NWI1OFx1NTcyOFx1ZmYwY1x1OTFjZFx1NjViMFx1NTMyZlx1NTE2NVx1NzZmOFx1NTQwY1x1NzY4NFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1NjcwM1x1ODk4Nlx1NWJlYlx1NzNmZVx1NjcwOVx1NzY4NFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1ZmYxYVxuXG57MH1cblxuXHU2MGE4XHU3OGJhXHU1YjlhXHU4OTgxXHU3ZTdjXHU3ZThjXHU1NWNlXHVmZjFmDQotSW1wb3J0UGx1Z2luV2l6YXJkX2NvbmZpcm1fY29udGludWU9XG5cblx1NzhiYVx1NWI5YVx1ODk4MVx1N2U3Y1x1N2U4Y1x1NTVjZVx1ZmYxZg0KLQ0KLVNlbGVjdENvbmZpZ3NUb0ltcG9ydF9sYWJlbDE9XHU1YzA3XHU1MzJmXHU1MTY1XHU0ZTBiXHU1MjE3XHU1MTQzXHU3ZDIwXHVmZjFhDQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9lcnJvcj1cdTkzMmZcdThhYTQNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX01TRzE9XHU2YjYzXHU1NzI4XHU1MjA2XHU2NzkwDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfdGl0bGUyPVx1OTA3OFx1NTNkNlx1ODk4MVx1NTMyZlx1NTE2NVx1NzY4NFx1OTE0ZFx1N2Y2ZVx1ODk4Zlx1NjgzYw0KLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub3RfdXNlZD1ub3RfdXNlZA0KLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19wYXRoPVx1NjMwN1x1NWI5YVx1NzY4NFx1NzZlZVx1OTMwNFx1NGUwZFx1NWI1OFx1NTcyOFx1MzAwMg0KLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19kaXI9XHU2NzJhXHU2MzA3XHU1YjlhXHU3NmVlXHU5MzA0DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3BsdWdpbnM9XHU1NzI4XHU1MzJmXHU1MTY1XHU3NmVlXHU5MzA0XHU0ZTJkXHU1M2VmXHU3NTI4XHU3Njg0XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHVmZjFhDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvcj1cdTRmNWNcdTgwMDVcdWZmMWENCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfdmVyc2lvbj1cdTcyNDhcdTY3MmNcdWZmMWENCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfZGVzYz1cdTdjMjFcdTg5ODFcdThhYWFcdTY2MGVcdWZmMWENCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX3JlYWRvbmx5PUlVUEUwMjAxRTogXHU3YTBiXHU1ZjBmXHU1ZWFiXHU2NjJmXHU1NTJmXHU4YjgwXHU3Njg0XHUzMDAyDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cwPVx1NmI2M1x1NTcyOFx1OWE1N1x1OGI0OVx1OTA3OFx1NTNkNlx1NzY4NFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZi4uLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMT1cdTYzMDdcdTViOWFcdTc2ODRcdThkZWZcdTVmOTFcdTRlMGRcdTU0MmJcdTY3MDlcdTY1NDhcdTc2ODRcdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTMwMDINCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzM9XHU2YjYzXHU1NzI4XHU1MzJmXHU1MTY1XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmLi4uDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c1PVx1NzEyMVx1NmNkNVx1NTMyZlx1NTE2NVx1OTA3OFx1NTNkNlx1NzY4NFx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1MzAwMlx1NTcyOFx1NzNmZVx1ODg0Y1x1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZFx1NjI3ZVx1NGUwZFx1NTIzMFx1NTE3Nlx1NzZmOFx1NGY5ZFx1NzY4NFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZiAnJ3swfScnXHUzMDAyDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c2PVx1NzEyMVx1NmNkNVx1NTMyZlx1NTE2NVx1OTA3OFx1NTNkNlx1NzY4NFx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1MzAwMlx1NTcyOFx1NzNmZVx1ODg0Y1x1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZFx1NjI3ZVx1NGUwZFx1NTIzMFx1NzZmOFx1NGY5ZFx1NzY4NFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1MzAwMg0KLURpZmZSZXBvcnRWaWV3ZXJfY29udGVudD1cdTUxNjdcdTViYjkNCi1EaWZmUmVwb3J0Vmlld2VyX2luX2ltcG9ydD1cdTU3MjhcdTUzMmZcdTUxNjVcdTRlMmQNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfTVNHMT1cdTZiNjNcdTU3MjhcdTUyMDZcdTY3OTBcdTZhOTRcdTY4NDguLi4NCi1EaWZmUmVwb3J0TGFiZWxQcm92aWRlcl95ZXM9XHU2NjJmDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2Vycm9yPVx1OTMyZlx1OGFhNA0KLURpZmZSZXBvcnRWaWV3ZXJfaW5fbGliPVx1NTcyOFx1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZA0KLURpZmZSZXBvcnRWaWV3ZXJfc3RhdHVzPVx1NzJjMFx1NjE0Yg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luRXhpc3RzPVx1NTcyOFx1NzNmZVx1ODg0Y1x1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZFx1NjI3ZVx1NTIzMFx1OTA3OFx1NTNkNlx1NzY4NFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luTm90RXhpc3RzPVx1NTcyOFx1NzNmZVx1ODg0Y1x1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZFx1NjI3ZVx1NGUwZFx1NTIzMFx1OTA3OFx1NTNkNlx1NzY4NFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZg0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjRXhpc3RzPVx1NTcyOFx1NzNmZVx1ODg0Y1x1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZFx1NjI3ZVx1NTIzMFx1OTE0ZFx1N2Y2ZQ0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNOb1NlbGVjdGlvbj1cdTY3MmFcdTkwNzhcdTUzZDZcdTkxNGRcdTdmNmVcdTg5OGZcdTY4M2NcdTMwMDINCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjRGF0YUxhYmVsPVx1NTcyOFx1NTMyZlx1NTE2NVx1NzZlZVx1OTMwNFx1NGUyZFx1OTA3OFx1NTNkNlx1NzY4NFx1OTE0ZFx1N2Y2ZQ0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2NvbmZpZ3M9XHU1NzI4XHU1MzJmXHU1MTY1XHU3NmVlXHU5MzA0XHU0ZTJkXHU1M2VmXHU3NTI4XHU3Njg0XHU5MTRkXHU3ZjZlXHU4OThmXHU2ODNjXHVmZjFhDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZD1ub3RfdXNlZA0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2Rlc2M9XHU3YzIxXHU4OTgxXHU4YWFhXHU2NjBlXHVmZjFhDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19wYXRoPVx1NjMwN1x1NWI5YVx1NzY4NFx1OGRlZlx1NWY5MVx1NGUwZFx1NWI1OFx1NTcyOFx1MzAwMg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5Ob1NlbGVjdGlvbj1cdTY3MmFcdTkwNzhcdTUzZDZcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTMwMDINCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX2Rpcj1cdTY3MmFcdTYzMDdcdTViOWFcdTc2ZWVcdTkzMDQNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9yZWFkb25seT1cdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGYgezB9IFx1NjYyZlx1NTUyZlx1OGI4MFx1NzY4NFxuDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fbG9ja2VkPUlVUEUwMjAzRTogXHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmIHswfSBcdTVkZjJcdTkzOTZcdTViOWFcbg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfZXJyb3Jfbm90X3VwZGF0YWJsZT1cdTdhMGJcdTVmMGZcdTVlYWJcdTRlMmRcdTY3MDlcdTRlOWJcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTVkZjJcdTkzOTZcdTViOWFcdTYyMTZcdTU1MmZcdThiODBcdTMwMDJcblx1OGFjYlx1ODllM1x1OTY2NFx1OTM5Nlx1NWI5YVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1ZmYwY1x1NzhiYVx1NWI5YVx1NTNlZlx1NGVlNVx1NjZmNFx1NjViMFx1NmE5NFx1Njg0OFx1MzAwMg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5EYXRhTGFiZWw9XHU1NzI4XHU1MzJmXHU1MTY1XHU3NmVlXHU5MzA0XHU0ZTJkXHU5MDc4XHU1M2Q2XHU3Njg0XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotRGlmZlJlcG9ydFZpZXdlcl90eXBlPVx1NTE2N1x1NWJiOVx1OTg1ZVx1NTc4Yg0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzPVx1NTcyOFx1NzNmZVx1ODg0Y1x1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZFx1NjI3ZVx1NGUwZFx1NTIzMFx1OTA3OFx1NTNkNlx1NzY4NFx1OTE0ZFx1N2Y2ZQ0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUEUwMjA0RTogXHU2MzA3XHU1YjlhXHU3Njg0XHU2YTk0XHU2ODQ4XHU2NjJmXHU1ZjllXHU4MjBhXHU3MjQ4ICh7MH0pIFx1NzY4NCB7MX0gXHU1MzJmXHU1MWZhXHUzMDAyXHU2YTk0XHU2ODQ4XHU1ZmM1XHU5ODA4XHU0ZWU1IHsxfSBcdTczZmVcdTg4NGNcdTcyNDhcdTY3MmNcdTUzMmZcdTUxZmFcdTMwMDINCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duPUlVUEUwMjA1RTogXHU2MzA3XHU1YjlhXHU3Njg0XHU2YTk0XHU2ODQ4XHU2NjJmXHU1ZjllXHU4MjBhXHU3MjQ4XHU3Njg0IHswfSBcdTUzMmZcdTUxZmFcdTMwMDJcdTZhOTRcdTY4NDhcdTVmYzVcdTk4MDhcdTRlZTUgezB9IFx1NzNmZVx1ODg0Y1x1NzI0OFx1NjcyY1x1NTMyZlx1NTFmYVx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUEUwMjA2RTogXHU2MzA3XHU1YjlhXHU3Njg0XHU2YTk0XHU2ODQ4XHU2NjJmXHU1ZjllXHU4ZjAzXHU2NWIwXHU3MjQ4ICh7MH0pIFx1NzY4NCB7MX0gXHU1MzJmXHU1MWZhXHUzMDAyXHU2MGE4XHU1ZmM1XHU5ODA4XHU1MzQ3XHU3ZDFhIHsxfSBcdTYyNGRcdTgwZmRcdTUzMmZcdTUxNjVcdTZhOTRcdTY4NDhcdTMwMDINCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUEUwMjA3RTogXHU3MTIxXHU2Y2Q1XHU5NThiXHU1NTVmXHU2MzA3XHU1YjlhXHU3Njg0XHU2YTk0XHU2ODQ4XHUzMDAyXHU2MGE4XHU1ZmM1XHU5ODA4XHU1MzQ3XHU3ZDFhIHswfSBcdTYyNGRcdTgwZmRcdTUzMmZcdTUxNjVcdTZhOTRcdTY4NDhcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMi8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlNGY1ZmEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDI8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmRjNGY4YS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgSW1wb3J0IChOTDIpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmltcG9ydDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMi9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNTRmY2E3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcnUucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ODdlMTRlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVx1MDQxOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIEltcG9ydCBXaXphcmQgQ2F0ZWdvcnkNCi1pbXBvcnRDYXRlZ29yeU5hbWU9XHUwNDFjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0DQotDQotIyBJbXBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4DQotaW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmRUZXh0PVx1MDQxOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4Lg0KLQ0KLSMgSW1wb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkTmFtZT1cdTA0MWNcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotaW1wb3J0TWV0aG9kUGx1Z2luc1dpemFyZFRleHQ9XHUwNDE4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzZCBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDNkXHUwNDM1XHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDNlIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzNVx1MDQzOSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4OGRlODguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMjAwRSAtIElVUEUwMjk5RQ0KLSMNCi0NCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlPVx1MDQxOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4DQotc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90aXRsZT1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzANCi1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RleHQ9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMyBcdTA0NDEgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM1XHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwLg0KLXJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RpdGxlPVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MCBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzkgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4DQotcmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGV4dD1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NGNcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQzMlx1MDQzZFx1MDQzNVx1MDQ0MVx1MDQzNVx1MDQzZFx1MDQ0YiBcdTA0MzIgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuDQotc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RpdGxlPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0M2ZcdTA0MzVcdTA0NDZcdTA0MzhcdTA0NDRcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5DQotc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzNFx1MDQzZFx1MDQ0MyBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDNkXHUwNDM1XHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDNlIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOSBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwLg0KLQ0KLSMgSW1wb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1pbXBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlPVx1MDQxOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGl0bGU9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMyBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwDQotc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGV4dD1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzIFx1MDQ0MSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGZcdTA0M2NcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzAuDQotc2VsZWN0UGx1Z2luc1dpemFyZFBhZ2VfdGl0bGU9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90ZXh0PVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzAuIFx1MDQxNVx1MDQ0MVx1MDQzYlx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRjIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIgXHUwNDMyIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzNSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIsIFx1MDQ0MVx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0NDUgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4Lg0KLWltcG9ydFBsdWdpbnNXaXphcmRfRVJSX0ltcG9ydF9wbHVnaW49XHUwNDE4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQ0ZiBcdTA0M2RcdTA0MzUgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkDQotDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMD1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M2FcdTA0MzAgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOC4uLg0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzE9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMyBcdTA0M2RcdTA0MzUgXHUwNDQxXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDQyIFx1MDQzZFx1MDQ0M1x1MDQzNlx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUuDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMz1cdTA0MThcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4uLg0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzI9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDQzXHUwNDRlIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2RcdTA0MzVcdTA0M2JcdTA0NGNcdTA0MzdcdTA0NGYgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMiBcdTA0NDFcdTA0MzBcdTA0M2NcdTA0NDMgXHUwNDQxXHUwNDM1XHUwNDMxXHUwNDRmLg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfTVNHMT1cdTA0MThcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4uLg0KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfRVJSX0ltcG9ydF9jb25maWd1cmF0aW9uPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzAgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotDQotRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX3RpdGxlPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzggXHUwNDM4XHUwNDM3XHUwNDMyXHUwNDNiXHUwNDM1XHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM4DQotRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX21zZz1cdTA0MWRcdTA0MzVcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiIFx1MDQzZFx1MDQzNSBcdTA0MzFcdTA0NGJcdTA0M2JcdTA0MzggXHUwNDM4XHUwNDM3XHUwNDMyXHUwNDNiXHUwNDM1XHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDRiLCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDNlXHUwNDNmXHUwNDRiXHUwNDQyXHUwNDNhXHUwNDQzPw0KLQ0KLUltcG9ydENvbmZpZ1JlcG9ydFBhZ2VfdGl0bGU9XHUwNDFlXHUwNDQyXHUwNDQ3XHUwNDM1XHUwNDQyIFx1MDQzZVx1MDQzMSBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotSW1wb3J0UGx1Z2luV2l6YXJkX3JlYWRvbmx5PUlVUEUwMjAxRTogXHUwNDExXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzZFx1MDQzMCBcdTA0NDJcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2FcdTA0M2UgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0N1x1MDQ0Mlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1JbXBvcnRQbHVnaW5XaXphcmRfTVNHMT1cdTA0MThcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQ0Zi4uLg0KLUltcG9ydFBsdWdpbldpemFyZF9lcnJvcj1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzANCi1JbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9leGlzdGluZ19wbHVnaW5zPUlVUEUwMjAwRTogXHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzOCBcdTA0NDNcdTA0MzZcdTA0MzUgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRlXHUwNDQyLiBcdTA0MWZcdTA0NDBcdTA0MzggXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzZFx1MDQzOCBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIgXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM3XHUwNDMwXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDRiOlxuIFxuIHswfSBcblxuXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDNiXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDRjPw0KLUltcG9ydFBsdWdpbldpemFyZF9jb25maXJtX2NvbnRpbnVlPVxuXG5cdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NGM/DQotDQotU2VsZWN0Q29uZmlnc1RvSW1wb3J0X2xhYmVsMT1cdTA0MTFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDRiIFx1MDQ0MVx1MDQzYlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGI6DQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9lcnJvcj1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzANCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX01TRzE9XHUwNDEwXHUwNDNkXHUwNDMwXHUwNDNiXHUwNDM4XHUwNDM3DQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfdGl0bGUyPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0M2ZcdTA0MzVcdTA0NDZcdTA0MzhcdTA0NDRcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzANCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm90X3VzZWQ9bm90X3VzZWQNCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fcGF0aD1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzIFx1MDQzZFx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIuDQotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX2Rpcj1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkIFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMw0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9wbHVnaW5zPVx1MDQxNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzggXHUwNDMyIFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzM1x1MDQzNSBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzA6DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvcj1cdTA0MTBcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDA6DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3ZlcnNpb249XHUwNDEyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDRmOg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9kZXNjPVx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNToNCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX3JlYWRvbmx5PUlVUEUwMjAxRTogXHUwNDExXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzZFx1MDQzMCBcdTA0NDJcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2FcdTA0M2UgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0N1x1MDQ0Mlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzA9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNhXHUwNDMwIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0MzVcdTA0MzkuLi4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzE9XHUwNDEyIFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzYyBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzNcdTA0MzUgXHUwNDNkXHUwNDM1XHUwNDQyIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzM1x1MDQzZSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGYgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMz1cdTA0MThcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQ0Zi4uLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNT1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQ0Zi4gXHUwNDE1XHUwNDMzXHUwNDNlIFx1MDQzN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQ0Ylx1MDQzOSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGMgJyd7MH0nJyBcdTA0M2RcdTA0MzUgXHUwNDNkXHUwNDMwXHUwNDM5XHUwNDM0XHUwNDM1XHUwNDNkIFx1MDQzMiBcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDNcdTA0NDlcdTA0MzVcdTA0MzkgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM1IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzY9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNCBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGYuIFx1MDQxN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQ0Ylx1MDQzOSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGMgXHUwNDNkXHUwNDM1IFx1MDQzZFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzZCBcdTA0MzIgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzNSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuDQotRGlmZlJlcG9ydFZpZXdlcl9jb250ZW50PVx1MDQxY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0Yg0KLURpZmZSZXBvcnRWaWV3ZXJfaW5faW1wb3J0PVx1MDQxMiBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzUNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfTVNHMT1cdTA0MTBcdTA0M2RcdTA0MzBcdTA0M2JcdTA0MzhcdTA0MzcgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDNlXHUwNDMyLi4uDQotRGlmZlJlcG9ydExhYmVsUHJvdmlkZXJfeWVzPVx1MDQxNFx1MDQzMA0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9lcnJvcj1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzANCi1EaWZmUmVwb3J0Vmlld2VyX2luX2xpYj1cdTA0MTIgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM1DQotRGlmZlJlcG9ydFZpZXdlcl9zdGF0dXM9XHUwNDIxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDNlXHUwNDRmXHUwNDNkXHUwNDM4XHUwNDM1DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5FeGlzdHM9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQ0YyBcdTA0MzIgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzNQ0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luTm90RXhpc3RzPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGMgXHUwNDNkXHUwNDM1IFx1MDQzZFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzZCBcdTA0MzIgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzNQ0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjRXhpc3RzPVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0MzIgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzNQ0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNOb1NlbGVjdGlvbj1cdTA0MWRcdTA0MzUgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDMwIFx1MDQ0MVx1MDQzZlx1MDQzNVx1MDQ0Nlx1MDQzOFx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY0RhdGFMYWJlbD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIFx1MDQzMiBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzNcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGFiZWxfY29uZmlncz1cdTA0MTRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2ZcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQxXHUwNDNmXHUwNDM1XHUwNDQ2XHUwNDM4XHUwNDQ0XHUwNDM4XHUwNDNhXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0MzIgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzXHUwNDM1IFx1MDQzOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzMDoNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkPW5vdF91c2VkDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGFiZWxfZGVzYz1cdTA0MWVcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzU6DQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19wYXRoPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzMgXHUwNDNkXHUwNDM1IFx1MDQ0MVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQzNVx1MDQ0Mi4NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luTm9TZWxlY3Rpb249XHUwNDFkXHUwNDM1IFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZCBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGMuDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19kaXI9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZCBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzMNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9yZWFkb25seT1cdTA0MWNcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGMgezB9IFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzZlx1MDQzNVx1MDQzZCBcdTA0NDJcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2FcdTA0M2UgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0N1x1MDQ0Mlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZlxuDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fbG9ja2VkPUlVUEUwMjAzRTogXHUwNDFjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRjIHswfSBcdTA0MzdcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2FcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2Rcbg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfZXJyb3Jfbm90X3VwZGF0YWJsZT1cdTA0MWRcdTA0MzVcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDM4XHUwNDM3IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzNVx1MDQzOSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNhXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDRiIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2ZcdTA0M2RcdTA0NGIgXHUwNDQyXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDNlIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDdcdTA0NDJcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuXG5cdTA0MjBcdTA0MzBcdTA0MzdcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2FcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM4IFx1MDQzOCBcdTA0M2VcdTA0MzFcdTA0MzVcdTA0NDFcdTA0M2ZcdTA0MzVcdTA0NDdcdTA0NGNcdTA0NDJcdTA0MzUgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDRjIFx1MDQzN1x1MDQzMFx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzOC4NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luRGF0YUxhYmVsPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGMgXHUwNDMyIFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzM1x1MDQzNSBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzANCi1EaWZmUmVwb3J0Vmlld2VyX3R5cGU9XHUwNDIyXHUwNDM4XHUwNDNmIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMg0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDNkXHUwNDM1IFx1MDQzZFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzMCBcdTA0MzIgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzNS4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YT1JVVBFMDIwNEU6IFx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDRiIFx1MDQzMiBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NGJcdTA0MzRcdTA0NDNcdTA0NDlcdTA0MzVcdTA0MzkgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4ICh7MH0pIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMCB7MX0uIFx1MDQxZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzY1x1MDQzZSBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiIFx1MDQ0MSBcdTA0M2ZcdTA0M2VcdTA0M2NcdTA0M2VcdTA0NDlcdTA0NGNcdTA0NGUgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCB7MX0uDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBFMDIwNUU6IFx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIgXHUwNDMxXHUwNDRiXHUwNDNiXHUwNDM4IFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQ0YiBcdTA0MzIgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDRiXHUwNDM0XHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCB7MH0uIFx1MDQxZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzY1x1MDQzZSBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiIFx1MDQ0MSBcdTA0M2ZcdTA0M2VcdTA0M2NcdTA0M2VcdTA0NDlcdTA0NGNcdTA0NGUgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCB7MH0uDQotdmVyc2lvbk1pc21hdGNoX29sZFRvb2w9SVVQRTAyMDZFOiBcdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiIFx1MDQzMVx1MDQ0Ylx1MDQzYlx1MDQzOCBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0NGIgXHUwNDMyIFx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzOSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggKHswfSkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwIHsxfS4gXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQzOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzMCBcdTA0NGRcdTA0NDJcdTA0MzhcdTA0NDUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDNlXHUwNDMyIFx1MDQzZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzY1x1MDQzZSBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgezF9Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQRTAyMDdFOiBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiLiBcdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwIFx1MDQ0ZFx1MDQ0Mlx1MDQzOFx1MDQ0NSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDNkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDNjXHUwNDNlIFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyB7MH0uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMmEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDJhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMmEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDJhLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMmEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdlMzkyMWUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMmEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxZDA3ODcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBJbXBvcnQgKE5MMmEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQ7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDJhL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGU2ODIzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RhLnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNjQ1ODcyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBpbXBvcnQNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIEltcG9ydCBXaXphcmQgQ2F0ZWdvcnkNCi1pbXBvcnRDYXRlZ29yeU5hbWU9TWV0b2RlDQotDQotIyBJbXBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZA0KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1CaWJsaW90ZWtza29uZmlndXJhdGlvbg0KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkVGV4dD1JbXBvcnRcdTAwZTlyIGVuIGJpYmxpb3Rla3Nrb25maWd1cmF0aW9uLg0KLQ0KLSMgSW1wb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkTmFtZT1NZXRvZGUtcGx1Z2lucw0KLWltcG9ydE1ldGhvZFBsdWdpbnNXaXphcmRUZXh0PUltcG9ydFx1MDBlOXIgZW4gZWxsZXIgZmxlcmUgbWV0b2RlLXBsdWdpbnMuDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjdhNTUzZS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXNfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMjAwRSAtIElVUEUwMjk5RQ0KLSMNCi0NCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkDQotaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlPUltcG9ydFx1MDBlOXIgYmlibGlvdGVrc2tvbmZpZ3VyYXRpb24NCi1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RpdGxlPUFuZ2l2IGltcG9ydGJpYmxpb3Rlaw0KLXNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGV4dD1BbmdpdiBiaWJsaW90ZWtldCBtZWQgZGVuIGJpYmxpb3Rla3Nrb25maWd1cmF0aW9uLCBkZXIgc2thbCBpbXBvcnRlcmVzLg0KLXJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RpdGxlPUdlbm5lbXNlIGJpYmxpb3Rla3NcdTAwZTZuZHJpbmdlcg0KLXJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RleHQ9R2VubmVtc2UgZGUgXHUwMGU2bmRyaW5nZXIsIGRlciB2aWwgYmxpdmUgZm9yZXRhZ2V0IGkgZGV0IGFrdHVlbGxlIG1ldG9kZWJpYmxpb3Rlay4NCi1zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGl0bGU9Vlx1MDBlNmxnIGtvbmZpZ3VyYXRpb25zc3BlY2lmaWthdGlvbmVyDQotc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RleHQ9Vlx1MDBlNmxnIGVuIGVsbGVyIGZsZXJlIGtvbmZpZ3VyYXRpb25zc3BlY2lmaWthdGlvbmVyLCBkZXIgc2thbCBpbXBvcnRlcmVzLg0KLQ0KLSMgSW1wb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQNCi1pbXBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlPUltcG9ydFx1MDBlOXIgbWV0b2RlLXBsdWdpbnMNCi1zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90aXRsZT1BbmdpdiBpbXBvcnRiaWJsaW90ZWsNCi1zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90ZXh0PUFuZ2l2IGJpYmxpb3Rla2V0IG1lZCBkZSBtZXRvZGUtcGx1Z2lucywgZGVyIHNrYWwgaW1wb3J0ZXJlcy4NCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90aXRsZT1WXHUwMGU2bGcgbWV0b2RlLXBsdWdpbnMNCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90ZXh0PVZcdTAwZTZsZyBlbiBlbGxlciBmbGVyZSBtZXRvZGUtcGx1Z2lucywgZGVyIHNrYWwgaW1wb3J0ZXJlcy4gSHZpcyBlbiB2YWxndCBwbHVnaW4gYWxsZXJlZGUgZmluZGVzIGkgZGV0IGFrdHVlbGxlIG1ldG9kZWJpYmxpb3Rlaywgc2thbCBkdSBrb250cm9sbGVyZSB2ZXJzaW9uc2ZvcnNrZWxsZW5lLg0KLWltcG9ydFBsdWdpbnNXaXphcmRfRVJSX0ltcG9ydF9wbHVnaW49SW1wb3J0IGFmIHBsdWdpbiBpa2tlIHVkZlx1MDBmOHJ0DQotDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMD1WYWxpZGVyZXIgdmFsZ3QgYmlibGlvdGVrc2tvbmZpZ3VyYXRpb24uLi4NCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cxPURldCBhbmdpdm5lIGJpYmxpb3RlayBpbmRlaG9sZGVyIGlra2UgZW4gZ3lsZGlnIGtvbmZpZ3VyYXRpb24uDQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMz1JbXBvcnRlcmVyIG1ldG9kZWtvbmZpZ3VyYXRpb24uLi4NCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cyPUthbiBpa2tlIGltcG9ydGVyZSBkZXQgYWt0dWVsdCBcdTAwZTVibmUgYmlibGlvdGVrIHRpbCBzaWcgc2Vsdi4NCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX01TRzE9SW1wb3J0ZXJlciBtZXRvZGVrb25maWd1cmF0aW9uLi4uDQotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9FUlJfSW1wb3J0X2NvbmZpZ3VyYXRpb249SW1wb3J0IGFmIGtvbmZpZ3VyYXRpb24gaWtrZSB1ZGZcdTAwZjhydA0KLQ0KLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF90aXRsZT1GZWpsIGkgdWR0amVrbmluZw0KLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF9tc2c9Tm9nbGUgYWYgZmlsZXJuZSBlciBpa2tlIHRqZWtrZXQgdWQuIFZpbCBkdSBwclx1MDBmOHZlIGlnZW4/DQotDQotSW1wb3J0Q29uZmlnUmVwb3J0UGFnZV90aXRsZT1JbXBvcnRlcmVyIGtvbmZpZ3VyYXRpb25zcmFwcG9ydA0KLUltcG9ydFBsdWdpbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUU6IEJpYmxpb3RlayBlciBza3JpdmViZXNreXR0ZXQuDQotSW1wb3J0UGx1Z2luV2l6YXJkX01TRzE9SW1wb3J0ZXJlciBtZXRvZGUtcGx1Z2luLi4uDQotSW1wb3J0UGx1Z2luV2l6YXJkX2Vycm9yPUZlamwNCi1JbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9leGlzdGluZ19wbHVnaW5zPUlVUEUwMjAwRTogRlx1MDBmOGxnZW5kZSB2YWxndGUgcGx1Z2lucyBmaW5kZXMgYWxsZXJlZGUuIEh2aXMgZHUgaW1wb3J0ZXJlciBkZSBzYW1tZSBwbHVnaW5zIGlnZW4sIG92ZXJza3JpdmVzIGRlIGVrc2lzdGVyZW5kZTpcblxuIHswfSBcblxuRXIgZHUgc2lra2VyIHBcdTAwZTUsIGF0IGR1IHZpbCBmb3J0c1x1MDBlNnR0ZT8NCi1JbXBvcnRQbHVnaW5XaXphcmRfY29uZmlybV9jb250aW51ZT1cblxuIEVyIGR1IHNpa2tlciBwXHUwMGU1LCBhdCBkdSB2aWwgZm9ydHNcdTAwZTZ0dGU/DQotDQotU2VsZWN0Q29uZmlnc1RvSW1wb3J0X2xhYmVsMT1GXHUwMGY4bGdlbmRlIGVsZW1lbnRlciBibGl2ZXIgaW1wb3J0ZXJldDoNCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yPUZlamwNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX01TRzE9QW5hbHlzZXJlcg0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX3RpdGxlMj1WXHUwMGU2bGcga29uZmlndXJhdGlvbnNzcGVjaWZpa2F0aW9uZXIsIGRlciBza2FsIGltcG9ydGVyZXMNCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm90X3VzZWQ9aWtrZV9iZW55dHRldA0KLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19wYXRoPURldCBhbmdpdm5lIGJpYmxpb3RlayBmaW5kZXMgaWtrZS4NCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fZGlyPURlciBlciBpa2tlIGFuZ2l2ZXQgZXQgYmlibGlvdGVrDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3BsdWdpbnM9VGlsZ1x1MDBlNm5nZWxpZ2UgcGx1Z2lucyBpIGltcG9ydGJpYmxpb3Rla2V0Og0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9hdXRob3I9Rm9yZmF0dGVyOg0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF92ZXJzaW9uPVZlcnNpb246DQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2Rlc2M9S29ydCBiZXNrcml2ZWxzZToNCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX3JlYWRvbmx5PUlVUEUwMjAxRTogQmlibGlvdGVrIGVyIHNrcml2ZWJlc2t5dHRldC4NCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzA9VmFsaWRlcmVyIHZhbGd0ZSBwbHVnaW5zLi4uDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cxPURlbiBhbmdpdm5lIHN0aSBpbmRlaG9sZGVyIGlra2UgZW4gZ3lsZGlnIHBsdWdpbi1tZXRvZGUuDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0czPUltcG9ydGVyZXIgbWV0b2RlLXBsdWdpbi4uLg0KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNT1EZW4gdmFsZ3RlIG1ldG9kZS1wbHVnaW4ga2FuIGlra2UgaW1wb3J0ZXJlcy4gRGVucyBhZmhcdTAwZTZuZ2lnZSBwbHVnaW4gJyd7MH0nJyBmaW5kZXMgaWtrZSBpIGRldCBha3R1ZWxsZSBtZXRvZGViaWJsaW90ZWsuDQotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c2PURlbiB2YWxndGUgbWV0b2RlLXBsdWdpbiBrYW4gaWtrZSBpbXBvcnRlcmVzLiBFbiBhZmhcdTAwZTZuZ2lnIHBsdWdpbiBmaW5kZXMgaWtrZSBpIGRldCBha3R1ZWxsZSBtZXRvZGViaWJsaW90ZWsuDQotRGlmZlJlcG9ydFZpZXdlcl9jb250ZW50PUluZGhvbGQNCi1EaWZmUmVwb3J0Vmlld2VyX2luX2ltcG9ydD1JIGltcG9ydA0KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9NU0cxPUFuYWx5c2VyZXIgZmlsZXIuLi4NCi1EaWZmUmVwb3J0TGFiZWxQcm92aWRlcl95ZXM9SmENCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfZXJyb3I9RmVqbA0KLURpZmZSZXBvcnRWaWV3ZXJfaW5fbGliPUkgYmlibGlvdGVrDQotRGlmZlJlcG9ydFZpZXdlcl9zdGF0dXM9U3RhdHVzDQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5FeGlzdHM9VmFsZ3QgcGx1Z2luIGZpbmRlcyBpIGRldCBha3R1ZWxsZSBiaWJsaW90ZWsNCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGlicmFyeVBsdWdpbk5vdEV4aXN0cz1WYWxndCBwbHVnaW4gZmluZGVzIGlra2UgaSBkZXQgYWt0dWVsbGUgYmlibGlvdGVrDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNFeGlzdHM9S29uZmlndXJhdGlvbiBmaW5kZXMgaSBkZXQgYWt0dWVsbGUgYmlibGlvdGVrDQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY05vU2VsZWN0aW9uPURlciBlciBpa2tlIHZhbGd0IGVuIGtvbmZpZ3VyYXRpb25zc3BlY2lmaWthdGlvbi4NCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjRGF0YUxhYmVsPVZhbGd0IGtvbmZpZ3VyYXRpb24gaSBpbXBvcnRiaWJsaW90ZWtldA0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2NvbmZpZ3M9VGlsZ1x1MDBlNm5nZWxpZ2Uga29uZmlndXJhdGlvbnNzcGVjaWZpa2F0aW9uZXIgaSBpbXBvcnRiaWJsaW90ZWtldDoNCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkPWlra2VfYmVueXR0ZXQNCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9kZXNjPUtvcnQgYmVza3JpdmVsc2U6DQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19wYXRoPURlbiBhbmdpdm5lIHN0aSBmaW5kZXMgaWtrZS4NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luTm9TZWxlY3Rpb249RGVyIGVyIGlra2UgdmFsZ3QgZW4gcGx1Z2luLg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm9fZGlyPURlciBlciBpa2tlIGFuZ2l2ZXQgZXQgYmlibGlvdGVrDQotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fcmVhZG9ubHk9UGx1Z2luJydlbiB7MH0gZXIgc2tyaXZlYmVza3l0dGV0XG4NCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9sb2NrZWQ9SVVQRTAyMDNFOiBQbHVnaW4nJ2VuIHswfSBlciBsXHUwMGU1c3Rcbg0KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfZXJyb3Jfbm90X3VwZGF0YWJsZT1Ob2dsZSBwbHVnaW5zIGkgYmlibGlvdGVrZXQgZXIgbFx1MDBlNXN0IGVsbGVyIHNrcml2ZWJlc2t5dHRldC5cbkxcdTAwZTVzIGRlIHJlbGV2YW50ZSBwbHVnaW5zIG9wLCBvZyBrb250cm9sbFx1MDBlOXIsIGF0IGZpbGVybmUga2FuIG9wZGF0ZXJlcy4NCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luRGF0YUxhYmVsPVZhbGd0IHBsdWdpbiBpIGltcG9ydGJpYmxpb3Rla2V0DQotRGlmZlJlcG9ydFZpZXdlcl90eXBlPUluZGhvbGRzdHlwZQ0KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzPVZhbGd0IGtvbmZpZ3VyYXRpb24gZmluZGVzIGlra2UgaSBkZXQgYWt0dWVsbGUgYmlibGlvdGVrLg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUEUwMjA0RTogRGUgYW5naXZuZSBmaWxlciBlciBla3Nwb3J0ZXJldCBtZWQgZW4gdGlkbGlnZXJlIHZlcnNpb24gKHswfSkgYWYgezF9LiBGaWxlcm5lIHNrYWwgZWtzcG9ydGVyZXMgbWVkIGRlbiBha3R1ZWxsZSB2ZXJzaW9uIGFmIHsxfS4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duPUlVUEUwMjA1RTogRGUgYW5naXZuZSBmaWxlciBlciBla3Nwb3J0ZXJldCBtZWQgZW4gdGlkbGlnZXJlIHZlcnNpb24gYWYgezB9LiBGaWxlcm5lIHNrYWwgZWtzcG9ydGVyZXMgbWVkIGRlbiBha3R1ZWxsZSB2ZXJzaW9uIGFmIHswfS4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1JVVBFMDIwNkU6IERlIGFuZ2l2bmUgZmlsZXIgZXIgZWtzcG9ydGVyZXQgbWVkIGVuIG55ZXJlIHZlcnNpb24gKHswfSkgYWYgezF9LiBEdSBza2FsIG9wZ3JhZGVyZSB7MX0gZm9yIGF0IGt1bm5lIGltcG9ydGVyZSBmaWxlcm5lLiANCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUEUwMjA3RTogRGUgYW5naXZuZSBmaWxlciBrYW4gaWtrZSBcdTAwZTVibmVzLiBEdSBza2FsIG9wZ3JhZGVyZSB7MH0gZm9yIGF0IGt1bm5lIGltcG9ydGVyZSBmaWxlcm5lLiANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmMyN2E5NS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODE1YTY0NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIFhNTCBJbXBvcnQgKE5MMSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWw7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZTdiMDEyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9lcy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZnIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2phLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9rby5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcHRfQlIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX0NOLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9UVy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2l0LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYjNmMDQxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gUGx1Zy1pbiBmXHUwMGZjciBYTUwtSW1wb3J0DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBJbXBvcnQgWE1MIFdpemFyZA0KLWltcG9ydFhNTFdpemFyZE5hbWU9WE1MDQotaW1wb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249RGVuIGluIGVpbmVyIFhNTC1EYXRlaSBnZXNwZWljaGVydGVuIEluaGFsdCBlaW5lciBNZXRob2RlbmJpYmxpb3RoZWsgaW1wb3J0aWVyZW4uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGRmOWQ0Yi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVBsdWctaW4gZGUgWE1MIGRlIGltcG9ydGFjaVx1MDBmM24gZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBJbXBvcnQgWE1MIFdpemFyZA0KLWltcG9ydFhNTFdpemFyZE5hbWU9WE1MDQotaW1wb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249SW1wb3J0YXIgY29udGVuaWRvIGRlIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGVuIHVuIGFyY2hpdm8gWE1MLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1MDJmNDEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1QbHVnLWluIFhNTCBkJ2ltcG9ydGF0aW9uIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgSW1wb3J0IFhNTCBXaXphcmQNCi1pbXBvcnRYTUxXaXphcmROYW1lPVhNTA0KLWltcG9ydFhNTFdpemFyZERlc2NyaXB0aW9uPUltcG9ydGV6IGxlIGNvbnRlbnUgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBzdG9ja1x1MDBlOSBkYW5zIHVuIGZpY2hpZXIgWE1MLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQwMmI1NDIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1QbHVnLWluIFhNTCBkaSBpbXBvcnRhemlvbmUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBJbXBvcnQgWE1MIFdpemFyZA0KLWltcG9ydFhNTFdpemFyZE5hbWU9WE1MDQotaW1wb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249SW1wb3J0YSBpbCBjb250ZW51dG8gZGVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBtZW1vcml6emF0byBpbiB1biBmaWxlIFhNTC4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9wbHVnaW5famEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ODQyMGUwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIEltcG9ydCBYTUwgUGx1Zy1pbg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgSW1wb3J0IFhNTCBXaXphcmQNCi1pbXBvcnRYTUxXaXphcmROYW1lPVhNTA0KLWltcG9ydFhNTFdpemFyZERlc2NyaXB0aW9uPVhNTCBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmJcdTRmZGRcdTdiYTFcdTMwNTVcdTMwOGNcdTMwNWZcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwOTJcdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZjA4YTI0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFhNTCBcdWFjMDBcdWM4MzhcdWM2MjRcdWFlMzAgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBJbXBvcnQgWE1MIFdpemFyZA0KLWltcG9ydFhNTFdpemFyZE5hbWU9WE1MDQotaW1wb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249WE1MIFx1ZDMwY1x1Yzc3Y1x1YzVkMCBcdWM4MDBcdWM3YTVcdWI0MWMgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWNlZThcdWQxNTBcdWNlMjBcdWI5N2MgXHVhYzAwXHVjODM4XHVjNjM1XHViMmM4XHViMmU0Lg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ3NTdhZmIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1QbHVnLWluIFhNTCBkZSBJbXBvcnRhXHUwMGU3XHUwMGUzbyBkbyBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIEltcG9ydCBYTUwgV2l6YXJkDQotaW1wb3J0WE1MV2l6YXJkTmFtZT1YTUwNCi1pbXBvcnRYTUxXaXphcmREZXNjcmlwdGlvbj1JbXBvcnRlIG8gY29udGVcdTAwZmFkbyBkYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvIGVtIHVtIGFycXVpdm8gWE1MLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1YTYzYzEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHU1YmZjXHU1MTY1IFhNTCBcdTYzZDJcdTRlZjYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIEltcG9ydCBYTUwgV2l6YXJkDQotaW1wb3J0WE1MV2l6YXJkTmFtZT1YTUwNCi1pbXBvcnRYTUxXaXphcmREZXNjcmlwdGlvbj1cdTViZmNcdTUxNjVcdTViNThcdTUwYThcdTU3MjggWE1MIFx1NjU4N1x1NGVmNlx1NGUyZFx1NzY4NFx1NWI1OFx1NTBhOFx1NWU5M1x1NTE4NVx1NWJiOVx1MzAwMg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljYmU0ZGUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgSW1wb3J0IFhNTCBQbHVnLWluDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBJbXBvcnQgWE1MIFdpemFyZA0KLWltcG9ydFhNTFdpemFyZE5hbWU9WE1MDQotaW1wb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249XHU1MzJmXHU1MTY1IFhNTCBcdTZhOTRcdTRlMmRcdTUxMzJcdTViNThcdTc2ODRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTUxNjdcdTViYjlcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmY2U3OGIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZToNCi0jDQotDQotIyBJbXBvcnQgWE1MIFdpemFyZA0KLWltcG9ydFhNTFdpemFyZF90aXRsZT1YTUwgaW1wb3J0aWVyZW4NCi0NCi0jIFNlbGVjdCBJbXBvcnQgWE1MIEZpbGUgV2l6YXJkIFBhZ2UNCi1zZWxlY3RYTUxGaWxlUGFnZV90aXRsZT1JbXBvcnRkYXRlaSBhbmdlYmVuDQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1HZWJlbiBTaWUgZGllIFhNTC1EYXRlaSBhbiwgZGllIGRlbiB6dSBpbXBvcnRpZXJlbmRlbiBJbmhhbHQgZGVyIE1ldGhvZGVuYmlibGlvdGhlayBlbnRoXHUwMGU0bHQsIHVuZCB3XHUwMGU0aGxlbiBTaWUgZGllIGF1c3p1Zlx1MDBmY2hyZW5kZSBJbXBvcnRvcGVyYXRpb24gYXVzLg0KLWZpbGVMYWJlbF90ZXh0PVhNTC1EYXRlaToNCi1icm93c2VCdXR0b25fdGV4dD1EdXJjaHN1Y2hlbi4uLg0KLW9wdGlvbkdyb3VwX3RleHQ9SW1wb3J0b3B0aW9uDQotb3ZlcndyaXRlUmFkaW9CdXR0b25fdGV4dD1Wb3JoYW5kZW5lbiBJbmhhbHQgZGVyIE1ldGhvZGVuYmlibGlvdGhlayBkdXJjaCBkZW4gaW1wb3J0aWVydGVuIEluaGFsdCBcdTAwZmNiZXJzY2hyZWliZW4NCi1tZXJnZVJhZGlvQnV0dG9uX3RleHQ9SW1wb3J0aWVydGVuIEluaGFsdCBpbiBkaWUgdm9yaGFuZGVuZSBNZXRob2RlbmJpYmxpb3RoZWsgZWluZlx1MDBmY2dlbg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1pbXBvcnRpbmdYTUxfdGV4dD1YTUwtQmlibGlvdGhla3NpbmhhbHQgaW4gZGllIGFrdHVlbGxlIE1ldGhvZGVuYmlibGlvdGhlayBpbXBvcnRpZXJlbi4uLg0KLQ0KLSMgSW1wb3J0IFhNTCBFcnJvciBEaWFsb2cNCi1yZXZpZXdfbG9nX2ZpbGVzPURpZSBJbXBvcnRvcGVyYXRpb24gaXN0IGFiZ2VzY2hsb3NzZW4uIFN1Y2hlbiBTaWUgaW4gZGVuIFByb3Rva29sbGRhdGVpZW5cbmltIE9yZG5lciAnJ3swfScnIG5hY2ggRmVobGVybi4NCi1pbXBvcnRYTUxFcnJvcl9tc2c9SVVQTTAwMDBFOiBEaWUgSW1wb3J0b3BlcmF0aW9uIGthbm4gbmljaHQgZm9ydGdlc2V0enQgd2VyZGVuLg0KLWltcG9ydFhNTEVycm9yX3JlYXNvbj1JVVBNMDAwOUU6IERpZSBha3R1ZWxsZSBCaWJsaW90aGVrIGlzdCBzY2hyZWliZ2VzY2hcdTAwZmN0enQuXG5cblN0ZWxsZW4gU2llIHNpY2hlciwgZGFzcyBkZXIgU2NocmVpYnp1Z3JpZmYgYXVmICcnezB9JycgbVx1MDBmNmdsaWNoIGlzdCwgb2RlciBlcnN0ZWxsZW4gU2llIGVpbmUgbmV1ZSBNZXRob2RlbmJpYmxpb3RoZWsgdW5kIHdpZWRlcmhvbGVuIFNpZSBkZW4gVm9yZ2FuZy4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZFhNTEZpbGVfZXJyb3I9RGllIGFuZ2VnZWJlbmUgWE1MLURhdGVpIGlzdCBuaWNodCBnXHUwMGZjbHRpZy4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YT1JVVBNMDAxMEU6IERpZSBhbmdlZ2ViZW5lIFhNTC1EYXRlaSB3dXJkZSBtaXQgZWluZXIgZnJcdTAwZmNoZXJlbiBWZXJzaW9uICh7MH0pIHZvbiB7MX0gZXhwb3J0aWVydC4gRGllIERhdGVpZW4gbVx1MDBmY3NzZW4gbWl0IGRlciBha3R1ZWxsZW4gVmVyc2lvbiB2b24gezF9IGV4cG9ydGllcnQgd2VyZGVuLg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd249SVVQTTAwMTFFOiBEaWUgYW5nZWdlYmVuZSBYTUwtRGF0ZWkgd3VyZGUgbWl0IGVpbmVyIGZyXHUwMGZjaGVyZW4gVmVyc2lvbiB2b24gezB9IGV4cG9ydGllcnQuIERpZSBEYXRlaWVuIG1cdTAwZmNzc2VuIG1pdCBkZXIgYWt0dWVsbGVuIFZlcnNpb24gdm9uIHswfSBleHBvcnRpZXJ0IHdlcmRlbi4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1JVVBNMDAxMkU6IERpZSBhbmdlZ2ViZW5lIFhNTC1EYXRlaSB3dXJkZSBtaXQgZWluZXIgbmV1ZXJlbiBWZXJzaW9uICh7MH0pIHZvbiB7MX0gZXhwb3J0aWVydC4gU2llIG1cdTAwZmNzc2VuIGVpbmVuIFVwZ3JhZGUgdm9uIHsxfSBkdXJjaGZcdTAwZmNocmVuLCB1bSBkaWUgRGF0ZWkgaW1wb3J0aWVyZW4genUga1x1MDBmNm5uZW4uIA0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQTTAwMTNFOiBEaWUgYXVzZ2V3XHUwMGU0aGx0ZSBYTUwtRGF0ZWkga2FubiBuaWNodCBnZVx1MDBmNmZmbmV0IHdlcmRlbi4gU2llIG1cdTAwZmNzc2VuIGVpbmVuIFVwZ3JhZGUgdm9uIHswfSBkdXJjaGZcdTAwZmNocmVuLCB1bSBkaWUgRGF0ZWkgaW1wb3J0aWVyZW4genUga1x1MDBmNm5uZW4uIA0KLQ0KLWltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF9ub3RfaGFuZGxlZD1OaWNodCBiZWFyYmVpdGV0ZXMgRWxlbWVudDogezB9DQotaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X3dpdGhvdXRfaWQ9RWxlbWVudCBvaG5lIElEOiB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX2ltcG9ydF9mYWlsZWQ9SW1wb3J0IGZlaGxnZXNjaGxhZ2VuOiB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX21pc3NpbmdfcGx1Z2luPURhcyBlcmZvcmRlcmxpY2hlIFBsdWctaW4gezB9IGZlaGx0Lg0KLWltcG9ydFhNTFNlcnZpY2VfZXJyb3JfbWlzc2luZ19wbHVnaW5zPUVzIGZlaGxlbiBlcmZvcmRlcmxpY2hlIFBsdWctaW5zLiBTdWNoZW4gU2llIGluIGRlbiBQcm90b2tvbGxkYXRlaWVuIG5hY2ggRWluemVsaGVpdGVuLg0KLQ0KLWxpYnJhcnlfZXJyb3Jfbm9fZWNsYXNzPUZlaGxlciBiZWltIEVyc3RlbGxlbiBkZXIgSW5oYWx0c2thdGVnb3JpZTogRGllIEVDbGFzcyBmXHUwMGZjciB7MH0ga2FubiBuaWNodCBhYmdlcnVmZW4gd2VyZGVuLg0KLWxpYnJhcnlfbm9fcGFja2FnZT1EYXMgUGFrZXQgZlx1MDBmY3IgZGFzIE9iamVrdCB7MH0gd3VyZGUgbmljaHQgZ2VmdW5kZW4uDQotbGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudD1GZWhsZXIgYmVpbSBFcnN0ZWxsZW4gZGVzIEVsZW1lbnRzOiB7MH0NCi1saWJyYXJ5X29iamVjdF9zdHJpbmc9T2JqZWt0IHswfSwgRmVhdHVyZSB7MX0NCi1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMj1GZWhsZXIgYmVpbSBTZXR6ZW4gZGVzIEF0dHJpYnV0czogRGVyIEZlYXR1cmUtV2VydCB7MH0gaXN0IHVuZ1x1MDBmY2x0aWcuDQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlPUZlaGxlciBiZWltIFNldHplbiBkZXMgQXR0cmlidXRzIGZcdTAwZmNyIE9iamVrdCB7MH0sIEZlYXR1cmUgezF9IHVuZCBXZXJ0IHsyfQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8zPUVzIGthbm4gbmljaHQgYmVzdGltbXQgd2VyZGVuLCB3aWUgZGFzIEF0dHJpYnV0IGZcdTAwZmNyIE9iamVrdCB7MH0sIEZlYXR1cmUgezF9IHVuZCBXZXJ0IHsyfSBnZXNldHp0IHdlcmRlbiBrYW5uLg0KLWxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZT1GZWhsZXIgYmVpbSBEZWZpbmllcmVuIGRlciBSZWZlcmVueiBmXHUwMGZjciBGZWF0dXJlIHswfTogRXMgaXN0IGtlaW4gRWxlbWVudCBtaXQgZGVyIElEIHsxfSB2b3JoYW5kZW4uDQotbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlXzI9RmVobGVyIGJlaW0gRGVmaW5pZXJlbiBkZXIgUmVmZXJlbnogZlx1MDBmY3IgT2JqZWt0IHswfSwgRmVhdHVyZSB7MX0gdW5kIFdlcnQgezJ9DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YTIyYzE3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6DQotIw0KLQ0KLSMgSW1wb3J0IFhNTCBXaXphcmQNCi1pbXBvcnRYTUxXaXphcmRfdGl0bGU9SW1wb3J0YXIgWE1MDQotDQotIyBTZWxlY3QgSW1wb3J0IFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9RXNwZWNpZmljYXIgYXJjaGl2byBkZSBpbXBvcnRhY2lcdTAwZjNuDQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1Fc3BlY2lmaXF1ZSBlbCBhcmNoaXZvIFhNTCBlbiBlbCBxdWUgc2UgZW5jdWVudHJhIGVsIGNvbnRlbmlkbyBkZSBsYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyB5IHNlbGVjY2lvbmUgbGEgb3BlcmFjaVx1MDBmM24gZGUgaW1wb3J0YWNpXHUwMGYzbiBhZGVjdWFkYSBxdWUgc2UgZGViZSByZWFsaXphci4NCi1maWxlTGFiZWxfdGV4dD1BcmNoaXZvIFhNTDoNCi1icm93c2VCdXR0b25fdGV4dD1FeGFtaW5hci4uLg0KLW9wdGlvbkdyb3VwX3RleHQ9T3BjaVx1MDBmM24gSW1wb3J0YXINCi1vdmVyd3JpdGVSYWRpb0J1dHRvbl90ZXh0PVNvYnJlZXNjcmliaXIgZWwgY29udGVuaWRvIGRlIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGV4aXN0ZW50ZSBjb24gZWwgY29udGVuaWRvIGltcG9ydGFkbw0KLW1lcmdlUmFkaW9CdXR0b25fdGV4dD1GdXNpb25hciBlbCBjb250ZW5pZG8gaW1wb3J0YWRvIGVuIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGV4aXN0ZW50ZQ0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1pbXBvcnRpbmdYTUxfdGV4dD1JbXBvcnRhbmRvIGNvbnRlbmlkbyBkZSBsYSBiaWJsaW90ZWNhIFhNTCBhIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGFjdHVhbC4uLg0KLQ0KLSMgSW1wb3J0IFhNTCBFcnJvciBEaWFsb2cNCi1yZXZpZXdfbG9nX2ZpbGVzPUxhIG9wZXJhY2lcdTAwZjNuIGRlIGltcG9ydGFjaVx1MDBmM24gc2UgaGEgY29tcGxldGFkby4gUmV2aXNlIGxvcyBhcmNoaXZvcyBkZSByZWdpc3RybyBkZVxubGEgY2FycGV0YSAnJ3swfScnIHBhcmEgdmVyIHNpIGhheSBlcnJvcmVzLg0KLWltcG9ydFhNTEVycm9yX21zZz1JVVBNMDAwMEU6IExhIG9wZXJhY2lcdTAwZjNuIGRlIGltcG9ydGFjaVx1MDBmM24gbm8gcHVlZGUgY29udGludWFyLg0KLWltcG9ydFhNTEVycm9yX3JlYXNvbj1JVVBNMDAwOUU6IExhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGFjdHVhbCBlcyBkZSBzXHUwMGYzbG8gbGVjdHVyYS5cblxuQXNlZ1x1MDBmYXJlc2UgZGUgcXVlICcnezB9JycgZXMgZ3JhYmFibGUgbyBjcmVlIHVuYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBudWV2YSB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWludmFsaWRYTUxGaWxlX2Vycm9yPUVsIGFyY2hpdm8gWE1MIGVzcGVjaWZpY2FkbyBubyBlcyB2XHUwMGUxbGlkby4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YT1JVVBNMDAxMEU6IFVuYSB2ZXJzaVx1MDBmM24gYW50ZXJpb3IgezB9KSBkZSB7MX0gaGEgZXhwb3J0YWRvIGVsIGFyY2hpdm8gWE1MIGVzcGVjaWZpY2Fkby4gIExvcyBhcmNoaXZvcyBzZSBkZWJlbiBleHBvcnRhciBjb24gbGEgdmVyc2lcdTAwZjNuIGFjdHVhbCBkZSB7MX0uDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBNMDAxMUU6IFVuYSB2ZXJzaVx1MDBmM24gYW50ZXJpb3IgZGUgezB9IGhhIGV4cG9ydGFkbyBlbCBhcmNoaXZvIFhNTCBlc3BlY2lmaWNhZG8uICBMb3MgYXJjaGl2b3Mgc2UgZGViZW4gZXhwb3J0YXIgY29uIGxhIHZlcnNpXHUwMGYzbiBhY3R1YWwgZGUgezB9Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUE0wMDEyRTogVW5hIHZlcnNpXHUwMGYzbiBtXHUwMGUxcyByZWNpZW50ZSAoezB9KSBkZSB7MX0gaGEgZXhwb3J0YWRvIGVsIGFyY2hpdm8gWE1MIGVzcGVjaWZpY2Fkby4gRGViZSBhY3R1YWxpemFyIHsxfSBwYXJhIGltcG9ydGFyIGVsIGFyY2hpdm8uICANCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUE0wMDEzRTogTm8gc2UgcHVlZGUgYWJyaXIgZWwgYXJjaGl2byBYTUwgZXNwZWNpZmljYWRvLiBEZWJlIGFjdHVhbGl6YXIgezB9IHBhcmEgaW1wb3J0YXIgZWwgYXJjaGl2by4gIA0KLQ0KLWltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF9ub3RfaGFuZGxlZD1FbGVtZW50byBubyBnZXN0aW9uYWRvOiB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfd2l0aG91dF9pZD1FbGVtZW50byBzaW4gSUQ6IHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfaW1wb3J0X2ZhaWxlZD1MYSBpbXBvcnRhY2lcdTAwZjNuIGhhIGZhbGxhZG86IHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfbWlzc2luZ19wbHVnaW49RmFsdGEgZWwgcGx1Zy1pbiBuZWNlc2FyaW8gezB9DQotaW1wb3J0WE1MU2VydmljZV9lcnJvcl9taXNzaW5nX3BsdWdpbnM9RmFsdGEobikgcGx1Zy1pbihzKSBuZWNlc2FyaW8ocykuIENvbXBydWViZSBsb3MgZGV0YWxsZXMgZW4gbG9zIGFyY2hpdm9zIGRlIHJlZ2lzdHJvDQotDQotbGlicmFyeV9lcnJvcl9ub19lY2xhc3M9RXJyb3IgYWwgY3JlYXIgQ29udGVudENhdGVnb3J5OiBObyBzZSBoYSBwb2RpZG8gb2J0ZW5lciBFQ2xhc3MgcGFyYSB7MH0NCi1saWJyYXJ5X25vX3BhY2thZ2U9Tm8gc2UgaGEgcG9kaWRvIGVuY29udHJhciBlbCBwYXF1ZXRlIGRlIHByb3BpZWRhZCBkZWwgb2JqZXRvIHswfQ0KLWxpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9RXJyb3IgYWwgY3JlYXIgZWwgZWxlbWVudG86IHswfQ0KLWxpYnJhcnlfb2JqZWN0X3N0cmluZz1vYmpldG8gezB9LCBjYXJhY3Rlclx1MDBlZHN0aWNhIHsxfQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8yPUVycm9yIGFsIGVzdGFibGVjZXIgZWwgYXRyaWJ1dG86IFZhbG9yIGRlIGNhcmFjdGVyXHUwMGVkc3RpY2EgZGUgYXRyaWJ1dG8gbm8gdlx1MDBlMWxpZGEgezB9DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlPUVycm9yIGFsIGVzdGFibGVjZXIgZWwgYXRyaWJ1dG8gZGVsIG9iamV0byB7MH0sIGNhcmFjdGVyXHUwMGVkc3RpY2EgezF9IHkgdmFsb3IgezJ9DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzM9U2UgaWdub3JhIGNcdTAwZjNtbyBlc3RhYmxlY2VyIGVsIGF0cmlidXRvIGRlbCBvYmpldG8gezB9LCBjYXJhY3Rlclx1MDBlZHN0aWNhIHsxfSB5IHZhbG9yIHsyfQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZT1FcnJvciBhbCBlc3RhYmxlY2VyIHJlZmVyZW5jaWEgcGFyYSBsYSBjYXJhY3Rlclx1MDBlZHN0aWNhIHswfTogbm8gaGF5IG5pbmdcdTAwZmFuIGVsZW1lbnRvIGNvbiBlbCBJRCB7MX0NCi1saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2VfMj1FcnJvciBhbCBlc3RhYmxlY2VyIHJlZmVyZW5jaWEgcGFyYSBlbCBvYmpldG8gezB9LCBjYXJhY3Rlclx1MDBlZHN0aWNhIHsxfSB5IHZhbG9yIHsyfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmY4NTAyNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOg0KLSMNCi0NCi0jIEltcG9ydCBYTUwgV2l6YXJkDQotaW1wb3J0WE1MV2l6YXJkX3RpdGxlPUltcG9ydGVyIGR1IGxhbmdhZ2UgWE1MDQotDQotIyBTZWxlY3QgSW1wb3J0IFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9U3BcdTAwZTljaWZpZXIgdW4gZmljaGllciBkJ2ltcG9ydGF0aW9uDQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1TcFx1MDBlOWNpZmlleiBsZSBmaWNoaWVyIFhNTCBpbmNsdWFudCBsZSBjb250ZW51IGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgXHUwMGUwIGltcG9ydGVyIGV0IHNcdTAwZTlsZWN0aW9ubmV6IGwnb3BcdTAwZTlyYXRpb24gZCdpbXBvcnRhdGlvbiBhZFx1MDBlOXF1YXRlIFx1MDBlMCBlZmZlY3R1ZXIuDQotZmlsZUxhYmVsX3RleHQ9RmljaGllciBYTUwgOg0KLWJyb3dzZUJ1dHRvbl90ZXh0PVBhcmNvdXJpci4uLg0KLW9wdGlvbkdyb3VwX3RleHQ9T3B0aW9uIGQnaW1wb3J0YXRpb24NCi1vdmVyd3JpdGVSYWRpb0J1dHRvbl90ZXh0PUVjcmFzZXogbGUgY29udGVudSBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIGV4aXN0YW50ZSBhdmVjIGxlIGNvbnRlbnUgaW1wb3J0XHUwMGU5DQotbWVyZ2VSYWRpb0J1dHRvbl90ZXh0PUZ1c2lvbm5leiBsZSBjb250ZW51IGltcG9ydFx1MDBlOSBkYW5zIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZXhpc3RhbnRlDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWltcG9ydGluZ1hNTF90ZXh0PUltcG9ydGF0aW9uIGR1IGNvbnRlbnUgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgWE1MIGRhbnMgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBlbiBjb3Vycy4uLg0KLQ0KLSMgSW1wb3J0IFhNTCBFcnJvciBEaWFsb2cNCi1yZXZpZXdfbG9nX2ZpbGVzPUwnJ29wXHUwMGU5cmF0aW9uIGQnJ2ltcG9ydGF0aW9uIGVzdCB0ZXJtaW5cdTAwZTllLiBSXHUwMGU5dmlzZXogbGVzIGZpY2hpZXJzIGpvdXJuYXV4IGRhbnMgbGUgZG9zc2llciBcbicnezB9JycgZW4gY2FzIGQnJ2VycmV1ci4NCi1pbXBvcnRYTUxFcnJvcl9tc2c9SVVQTTAwMDBFIDogTCdvcFx1MDBlOXJhdGlvbiBkJ2ltcG9ydGF0aW9uIG5lIHBldXQgcGFzIHNlIHBvdXJzdWl2cmUuDQotaW1wb3J0WE1MRXJyb3JfcmVhc29uPUlVUE0wMDA5RSA6IExhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZW4gY291cnMgZXN0IGVuIGxlY3R1cmUgc2V1bGVtZW50LlxuXG5Bc3N1cmV6LXZvdXMgcXVlICcnezB9JycgZXN0IG1vZGlmaWFibGUgb3UgY3JcdTAwZTlleiB1bmUgbm91dmVsbGUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBldCByXHUwMGU5ZXNzYXllei4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZFhNTEZpbGVfZXJyb3I9TGUgZmljaGllciBYTUwgc3BcdTAwZTljaWZpXHUwMGU5IGVzdCBub24gdmFsaWRlLg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUE0wMDEwRSA6IExlIGZpY2hpZXIgWE1MIHNwXHUwMGU5Y2lmaVx1MDBlOSBhIFx1MDBlOXRcdTAwZTkgZXhwb3J0XHUwMGU5IHBhciB1bmUgdmVyc2lvbiBhbnRcdTAwZTlyaWV1cmUgKHswfSkgZGUgezF9LiBWb3VzIGRldmV6IGV4cG9ydGVyIGxlcyBmaWNoaWVycyBlbiB1dGlsaXNhbnQgbGEgdmVyc2lvbiBhY3R1ZWxsZSBkZSB7MX0uDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBNMDAxMUUgOiBMZSBmaWNoaWVyIFhNTCBzcFx1MDBlOWNpZmlcdTAwZTkgYSBcdTAwZTl0XHUwMGU5IGV4cG9ydFx1MDBlOSBwYXIgdW5lIHZlcnNpb24gYW50XHUwMGU5cmlldXJlIGRlIHswfS4gVm91cyBkZXZleiBleHBvcnRlciBsZXMgZmljaGllcnMgZW4gdXRpbGlzYW50IGxhIHZlcnNpb24gYWN0dWVsbGUgZGUgezB9Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUE0wMDEyRSA6IExlIGZpY2hpZXIgWE1MIHNwXHUwMGU5Y2lmaVx1MDBlOSBhIFx1MDBlOXRcdTAwZTkgZXhwb3J0XHUwMGU5IHBhciB1bmUgdmVyc2lvbiBwbHVzIHJcdTAwZTljZW50ZSAoezB9KSBkZSB7MX0uIFZvdXMgZGV2ZXogZWZmZWN0dWVyIHVuZSBtaXNlIFx1MDBlMCBuaXZlYXUgZGUgezF9IHBvdXIgaW1wb3J0ZXIgbGUgZmljaGllci4gIA0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQTTAwMTNFOiBJbXBvc3NpYmxlIGQnJ291dnJpciBsZSBmaWNoaWVyIFhNTCBzcFx1MDBlOWNpZmlcdTAwZTkuIFZvdXMgZGV2ZXogZWZmZWN0dWVyIHVuZSBtaXNlIFx1MDBlMCBuaXZlYXUgZGUgezB9IHBvdXIgaW1wb3J0ZXIgbGUgZmljaGllci4gIA0KLQ0KLWltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF9ub3RfaGFuZGxlZD1FbFx1MDBlOW1lbnQgbm9uIGdcdTAwZTlyXHUwMGU5IDogezB9DQotaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X3dpdGhvdXRfaWQ9RWxcdTAwZTltZW50IHNhbnMgaWRlbnRpZmljYXRldXIgOiB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX2ltcG9ydF9mYWlsZWQ9RWNoZWMgZGUgbCcnaW1wb3J0YXRpb24gOiB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX21pc3NpbmdfcGx1Z2luPVBsdWctaW4gcmVxdWlzIG1hbnF1YW50IHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfZXJyb3JfbWlzc2luZ19wbHVnaW5zPVBsdWctaW4ocykgcmVxdWlzIG1hbnF1YW50cy4gVlx1MDBlOXJpZmlleiBsZXMgZmljaGllcnMgam91cm5hdXggcG91ciBwbHVzIGRlIGRcdTAwZTl0YWlscy4NCi0NCi1saWJyYXJ5X2Vycm9yX25vX2VjbGFzcz1FcnJldXIgbG9ycyBkZSBsYSBjclx1MDBlOWF0aW9uIGQnJ3VuZSBjYXRcdTAwZTlnb3JpZSBkZSBjb250ZW51IDogSW1wb3NzaWJsZSBkJydvYnRlbmlyIEVDbGFzcyBwb3VyIHswfQ0KLWxpYnJhcnlfbm9fcGFja2FnZT1JbXBvc3NpYmxlIGRlIHRyb3V2ZXIgbGUgcGFja2FnZSBkJydhcHBhcnRlbmFuY2UgcG91ciBsJydvYmpldCB7MH0NCi1saWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50PUVycmV1ciBsb3JzIGRlIGxhIGNyXHUwMGU5YXRpb24gZGUgbCcnXHUwMGU5bFx1MDBlOW1lbnQgOiB7MH0NCi1saWJyYXJ5X29iamVjdF9zdHJpbmc9b2JqZXQgezB9LCBmb25jdGlvbiB7MX0NCi1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMj1FcnJldXIgbG9ycyBkZSBsYSBkXHUwMGU5ZmluaXRpb24gZCcndW4gYXR0cmlidXQgOiBWYWxldXIgZGUgbGEgZm9uY3Rpb24gZCcnYXR0cmlidXQgbm9uIHZhbGlkZSB7MH0NCi1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGU9RXJyZXVyIGxvcnMgZGUgbGEgZFx1MDBlOWZpbml0aW9uIGQnJ3VuIGF0dHJpYnV0IHBvdXIgbCcnb2JqZXQgezB9LCBsYSBmb25jdGlvbiB7MX0gZXQgbGEgdmFsZXVyIHsyfQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8zPUlnbm9yZSBjb21tZW50IGRcdTAwZTlmaW5pciB1biBhdHRyaWJ1dCBwb3VyIGwnJ29iamV0IHswfSwgbGEgZm9uY3Rpb24gezF9IGV0IGxhIHZhbGV1ciB7Mn0NCi1saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U9RXJyZXVyIGxvcnMgZGUgbGEgZFx1MDBlOWZpbml0aW9uIGQnJ3VuZSByXHUwMGU5Zlx1MDBlOXJlbmNlIHBvdXIgbGEgZm9uY3Rpb24gezB9OiBhdWN1biBcdTAwZTlsXHUwMGU5bWVudCBjb250ZW5hbnQgdW4gaWRlbnRpZmljYXRldXIgezF9DQotbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlXzI9RXJyZXVyIGxvcnMgZGUgbGEgZFx1MDBlOWZpbml0aW9uIGQnJ3VuZSByXHUwMGU5Zlx1MDBlOXJlbmNlIHBvdXIgbCcnb2JqZXQgezB9LCBsYSBmb25jdGlvbiB7MX0gZXQgbGEgdmFsZXVyIHsyfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfaXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzYyMmJmZi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOg0KLSMNCi0NCi0jIEltcG9ydCBYTUwgV2l6YXJkDQotaW1wb3J0WE1MV2l6YXJkX3RpdGxlPUltcG9ydGEgWE1MDQotDQotIyBTZWxlY3QgSW1wb3J0IFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9U3BlY2lmaWNhIGZpbGUgZGkgaW1wb3J0YXppb25lDQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1TcGVjaWZpY2FyZSBpbCBmaWxlIFhNTCBpbiBjdWkgc2kgdHJvdmEgaWwgY29udGVudXRvIGRlbGxhIGxpYnJlcmlhIGRlaSBtZXRvZGkgZGEgaW1wb3J0YXJlIGUgc2VsZXppb25hcmUgbCdvcGVyYXppb25lIGRpIGltcG9ydGF6aW9uZSBhcHByb3ByaWF0YSBkYSBlc2VndWlyZS4NCi1maWxlTGFiZWxfdGV4dD1GaWxlIFhNTDoNCi1icm93c2VCdXR0b25fdGV4dD1TZm9nbGlhLi4uDQotb3B0aW9uR3JvdXBfdGV4dD1JbXBvcnRhIG9wemlvbmUNCi1vdmVyd3JpdGVSYWRpb0J1dHRvbl90ZXh0PVNvdnJhc2NyaXZpIGlsIGNvbnRlbnV0byBkZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGVzaXN0ZW50ZSBjb24gaWwgY29udGVudXRvIGltcG9ydGF0bw0KLW1lcmdlUmFkaW9CdXR0b25fdGV4dD1VbmlzY2kgaWwgY29udGVudXRvIGltcG9ydGF0byBuZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGVzaXN0ZW50ZQ0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1pbXBvcnRpbmdYTUxfdGV4dD1JbXBvcnRhemlvbmUgZGVsIGNvbnRlbnV0byBkZWxsYSBsaWJyZXJpYSBYTUwgbmVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBjb3JyZW50ZSBpbiBjb3Jzby4uLg0KLQ0KLSMgSW1wb3J0IFhNTCBFcnJvciBEaWFsb2cNCi1yZXZpZXdfbG9nX2ZpbGVzPUwnJ29wZXJhemlvbmUgZGkgaW1wb3J0YXppb25lIFx1MDBlOCBzdGF0YSBjb21wbGV0YXRhLiBQZXIgZXZlbnR1YWxpIGVycm9yaSwgcml2ZWRlcmUgaSBmaWxlIGRpIGxvZyBuZWxsYSBjYXJ0ZWxsYSBcbiAnJ3swfScnLg0KLWltcG9ydFhNTEVycm9yX21zZz1JVVBNMDAwMEU6IEltcG9zc2liaWxlIGNvbnRpbnVhcmUgbCdvcGVyYXppb25lIGRpIGltcG9ydGF6aW9uZS4NCi1pbXBvcnRYTUxFcnJvcl9yZWFzb249SVVQTTAwMDlFOiBMYSBMaWJyZXJpYSBkZWkgbWV0b2RpIGNvcnJlbnRlIFx1MDBlOCBkaSBzb2xhIGxldHR1cmEuXG5cbkFzc2ljdXJhcnNpIGNoZSAnJ3swfScnIHNpYSBzY3JpdmliaWxlIG9wcHVyZSBjcmVhcmUgdW5hIG51b3ZhIGxpYnJlcmlhIGRlaSBtZXRvZGkgZSBwcm92YXJlIGRpIG51b3ZvLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1pbnZhbGlkWE1MRmlsZV9lcnJvcj1JbCBmaWxlIFhNTCBzcGVjaWZpY2F0byBub24gXHUwMGU4IHZhbGlkby4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YT1JVVBNMDAxMEU6IGlsIGZpbGUgWE1MIHNwZWNpZmljYXRvIFx1MDBlOCBzdGF0byBlc3BvcnRhdG8gZGEgdW5hIHByZWNlZGVudGUgdmVyc2lvbmUgKHswfSkgZGkgezF9LiBFJycgbmVjZXNzYXJpbyBlc3BvcnRhcmUgaSBmaWxlIHV0aWxpenphbmRvIGxhIHZlcnNpb25lIGNvcnJlbnRlIGRpIHsxfS4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duPUlVUE0wMDExRTogaWwgZmlsZSBYTUwgc3BlY2lmaWNhdG8gXHUwMGU4IHN0YXRvIGVzcG9ydGF0byBkYSB1bmEgcHJlY2VkZW50ZSB2ZXJzaW9uZSBkaSB7MH0uIEUnJyBuZWNlc3NhcmlvIGVzcG9ydGFyZSBpIGZpbGUgdXRpbGl6emFuZG8gbGEgdmVyc2lvbmUgY29ycmVudGUgZGkgezB9Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUE0wMDEyRTogaWwgZmlsZSBYTUwgc3BlY2lmaWNhdG8gXHUwMGU4IHN0YXRvIGVzcG9ydGF0byBkYSB1bmEgdmVyc2lvbmUgcGlcdTAwZjkgYWdnaW9ybmF0YSAoezB9KSBkaSB7MX0uIFx1MDBjOCBuZWNlc3NhcmlvIGFnZ2lvcm5hcmUgezF9IHBlciBpbXBvcnRhcmUgaWwgZmlsZS4gIA0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQTTAwMTNFOiBpbXBvc3NpYmlsZSBhcHJpcmUgaWwgZmlsZSBYTUwgc3BlY2lmaWNhdG8uIFx1MDBjOCBuZWNlc3NhcmlvIGFnZ2lvcm5hcmUgezB9IHBlciBpbXBvcnRhcmUgaWwgZmlsZS4gIA0KLQ0KLWltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF9ub3RfaGFuZGxlZD1FbGVtZW50byBub24gZ2VzdGl0bzogezB9DQotaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X3dpdGhvdXRfaWQ9RWxlbWVudG8gc2VuemEgSUQ6IHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfaW1wb3J0X2ZhaWxlZD1JbXBvcnRhemlvbmUgbm9uIHJpdXNjaXRhOiB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX21pc3NpbmdfcGx1Z2luPVBsdWdpbiByaWNoaWVzdG8gbWFuY2FudGUgezB9DQotaW1wb3J0WE1MU2VydmljZV9lcnJvcl9taXNzaW5nX3BsdWdpbnM9UGx1Z2luIHJpY2hpZXN0byBtYW5jYW50ZS4gUGVyIHVsdGVyaW9yaSBkZXR0YWdsaSwgY29udHJvbGxhcmUgaSBmaWxlIGRpIGxvZw0KLQ0KLWxpYnJhcnlfZXJyb3Jfbm9fZWNsYXNzPUVycm9yZSBkdXJhbnRlIGxhIGNyZWF6aW9uZSBkaSBDb250ZW50Q2F0ZWdvcnk6IGltcG9zc2liaWxlIHJpY2hpYW1hcmUgRUNsYXNzIHBlciB7MH0NCi1saWJyYXJ5X25vX3BhY2thZ2U9SW1wb3NzaWJpbGUgdHJvdmFyZSBpbCBwYWNjaGV0dG8gZGkgb3JpZ2luZSBkZWxsJydvZ2dldHRvIHswfQ0KLWxpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9RXJyb3JlIGR1cmFudGUgbGEgY3JlYXppb25lIGRlbGwnJ2VsZW1lbnRvOiB7MH0NCi1saWJyYXJ5X29iamVjdF9zdHJpbmc9b2dnZXR0byB7MH0sIGZ1bnppb25lIHsxfQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8yPUVycm9yZSBkdXJhbnRlIGwnJ2ltcG9zdGF6aW9uZSBkZWxsJydhdHRyaWJ1dG86IHZhbG9yZSBmdW56aW9uZSBhdHRyaWJ1dG8gbm9uIHZhbGlkbyB7MH0NCi1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGU9RXJyb3JlIGR1cmFudGUgbCcnaW1wb3N0YXppb25lIGRlbGwnJ2F0dHJpYnV0byBwZXIgbCcnb2dnZXR0byB7MH0sIGxhIGZ1bnppb25lIHsxfSBlIGlsIHZhbG9yZSB7Mn0NCi1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMz1JbXBvc3NpYmlsZSBpbXBvc3RhcmUgbCcnYXR0cmlidXRvIHBlciBsJydvZ2dldHRvIHswfSwgbGEgZnVuemlvbmUgezF9IGUgaWwgdmFsb3JlIHsyfQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZT1FcnJvcmUgZHVyYW50ZSBsJydpbXBvc3RhemlvbmUgZGVsIHJpZmVyaW1lbnRvIHBlciBsYSBmdW56aW9uZSB7MH06IG5lc3N1biBlbGVtZW50byBjb24gaWQgezF9DQotbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlXzI9RXJyb3JlIGR1cmFudGUgbCcnaW1wb3N0YXppb25lIGRlbCByaWZlcmltZW50byBwZXIgbCcnb2dnZXR0byB7MH0sIGxhIGZ1bnppb25lIHsxfSBlIGlsIHZhbG9yZSB7Mn0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJlZTI5ZWEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZToNCi0jDQotDQotIyBJbXBvcnQgWE1MIFdpemFyZA0KLWltcG9ydFhNTFdpemFyZF90aXRsZT1YTUwgXHUzMDZlXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4DQotDQotIyBTZWxlY3QgSW1wb3J0IFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9XHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHU2MzA3XHU1YjlhDQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1cdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTlcdTMwOGJcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwOTJcdTU0MmJcdTMwODAgWE1MIFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzAwMVx1NWI5Zlx1ODg0Y1x1MzA1OVx1MzA4Ylx1OTA2OVx1NTIwN1x1MzA2YVx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1NjRjZFx1NGY1Y1x1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWZpbGVMYWJlbF90ZXh0PVhNTCBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWI6DQotYnJvd3NlQnV0dG9uX3RleHQ9XHU1M2MyXHU3MTY3Li4uDQotb3B0aW9uR3JvdXBfdGV4dD1cdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjMNCi1vdmVyd3JpdGVSYWRpb0J1dHRvbl90ZXh0PVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzA5Mlx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzA2N1x1MzBhYVx1MzBmY1x1MzBkMFx1MzBmY1x1MzBlOVx1MzBhNFx1MzBjOQ0KLW1lcmdlUmFkaW9CdXR0b25fdGV4dD1cdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTVcdTMwOGNcdTMwNWZcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwOTJcdTY1ZTJcdTViNThcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmJcdTMwZGVcdTMwZmNcdTMwYjgNCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotaW1wb3J0aW5nWE1MX3RleHQ9WE1MIFx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzA5Mlx1NzNmZVx1ODg0Y1x1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2Ylx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1NGUyZC4uLg0KLQ0KLSMgSW1wb3J0IFhNTCBFcnJvciBEaWFsb2cNCi1yZXZpZXdfbG9nX2ZpbGVzPVx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1NjRjZFx1NGY1Y1x1MzA0Y1x1NWI4Y1x1NGU4Nlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiBcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTMwNmFcdTMwNDRcdTMwNGJcdTMwNjlcdTMwNDZcdTMwNGIgJyd7MH0nJyBcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzBcdTMwZmNcdTUxODVcdTMwNmVcblx1MzBlZFx1MzBiMFx1MzBmYlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NzhiYVx1OGE4ZFx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLWltcG9ydFhNTEVycm9yX21zZz1JVVBNMDAwMEU6IFx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1NjRjZFx1NGY1Y1x1MzA5Mlx1N2Q5YVx1ODg0Y1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLWltcG9ydFhNTEVycm9yX3JlYXNvbj1JVVBNMDAwOUU6IFx1NzNmZVx1ODg0Y1x1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2Zlx1OGFhZFx1MzA3Zlx1NTNkNlx1MzA4YVx1NWMwMlx1NzUyOFx1MzA2N1x1MzA1OVx1MzAwMlxuXG4nJ3swfScnIFx1MzA0Y1x1NjZmOFx1MzA0ZFx1OGZiY1x1MzA3Zlx1NTNlZlx1ODBmZFx1MzA2N1x1MzA0Mlx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA5Mlx1NzhiYVx1OGE4ZFx1MzA1OVx1MzA4Ylx1MzA0Ylx1MzAwMVx1NjViMFx1ODk4Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA1N1x1MzA2Nlx1MzA0Ylx1MzA4OVx1MzAwMVx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1pbnZhbGlkWE1MRmlsZV9lcnJvcj1cdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWYgWE1MIFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2Zlx1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OVx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUE0wMDEwRTogXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmIFhNTCBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNGNcdTMwMDF7MX0gXHUzMDZlXHU1MjRkXHUzMDZlXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzICh7MH0pIFx1MzA2Ylx1MzA4OFx1MzA2M1x1MzA2Nlx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2ZVx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA2ZiB7MX0gXHUzMDZlXHU3M2ZlXHU4ODRjXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHUzMDkyXHU0ZjdmXHUzMDYzXHUzMDY2XHU4ODRjXHUzMDQ2XHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBNMDAxMUU6IFx1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA1ZiBYTUwgXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDRjXHUzMDAxezB9IFx1MzA2ZVx1NTI0ZFx1MzA2ZVx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1MzA2Ylx1MzA4OFx1MzA2M1x1MzA2Nlx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2ZVx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA2ZiB7MH0gXHUzMDZlXHU3M2ZlXHU4ODRjXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHUzMDkyXHU0ZjdmXHUzMDYzXHUzMDY2XHU4ODRjXHUzMDQ2XHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyDQotdmVyc2lvbk1pc21hdGNoX29sZFRvb2w9SVVQTTAwMTJFOiBcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWYgWE1MIFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1MzAwMXsxfSBcdTMwNmVcdTY1YjBcdTg5OGZcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjMgKHswfSkgXHUzMDZiXHUzMDg4XHUzMDYzXHUzMDY2XHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDkyXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU5XHUzMDhiXHUzMDZiXHUzMDZmXHUzMDAxezF9IFx1MzA2Ylx1MzBhMlx1MzBjM1x1MzBkN1x1MzBiMFx1MzBlY1x1MzBmY1x1MzBjOVx1MzA1OVx1MzA4Ylx1NWZjNVx1ODk4MVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQTTAwMTNFOiBcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWYgWE1MIFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1OTU4Ylx1MzA0Zlx1MzA1M1x1MzA2OFx1MzA0Y1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA1OVx1MzA4Ylx1MzA2Ylx1MzA2Zlx1MzAwMXswfSBcdTMwNmJcdTMwYTJcdTMwYzNcdTMwZDdcdTMwYjBcdTMwZWNcdTMwZmNcdTMwYzlcdTMwNTlcdTMwOGJcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi1pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfbm90X2hhbmRsZWQ9XHU1MWU2XHU3NDA2XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDZhXHUzMDQ0XHU4OTgxXHU3ZDIwOiB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfd2l0aG91dF9pZD1JRCBcdTMwNmVcdTMwNmFcdTMwNDRcdTg5ODFcdTdkMjA6IHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfaW1wb3J0X2ZhaWxlZD1cdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNmZcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWY6IHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfbWlzc2luZ19wbHVnaW49XHU1ZmM1XHU4OTgxXHUzMDZhXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzIHswfSBcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMNCi1pbXBvcnRYTUxTZXJ2aWNlX2Vycm9yX21pc3NpbmdfcGx1Z2lucz1cdTVmYzVcdTg5ODFcdTMwNmFcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjNcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIgXHU4YTczXHU3ZDMwXHUzMDZiXHUzMDY0XHUzMDQ0XHUzMDY2XHUzMDZmXHUzMDAxXHUzMGVkXHUzMGIwXHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDkyXHU3OGJhXHU4YThkXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0DQotDQotbGlicmFyeV9lcnJvcl9ub19lY2xhc3M9Q29udGVudENhdGVnb3J5IFx1MzA2ZVx1NGY1Y1x1NjIxMFx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2N1x1MzA1OVx1MzAwMnswfSBcdTMwNmUgRUNsYXNzIFx1MzA5Mlx1NTNkNlx1NWY5N1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLWxpYnJhcnlfbm9fcGFja2FnZT1cdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzggezB9IFx1MzA2ZVx1NjI0MFx1NjcwOVx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOFx1MzA5Mlx1NjkxY1x1N2QyMlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLWxpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9XHU4OTgxXHU3ZDIwIHswfSBcdTMwNmVcdTRmNWNcdTYyMTBcdTMwYThcdTMwZTlcdTMwZmMNCi1saWJyYXJ5X29iamVjdF9zdHJpbmc9XHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4IHswfVx1MzAwMVx1MzBkNVx1MzBhM1x1MzBmY1x1MzBjMVx1MzBlM1x1MzBmYyB7MX0NCi1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMj1cdTVjNWVcdTYwMjdcdTMwNmVcdThhMmRcdTViOWFcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTlcdTMwMDJcdTcxMjFcdTUyYjlcdTMwNmFcdTVjNWVcdTYwMjdcdTMwZDVcdTMwYTNcdTMwZmNcdTMwYzFcdTMwZTNcdTMwZmNcdTUwMjQgezB9IFx1MzA2N1x1MzA1OQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZT1cdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzggezB9XHUzMDAxXHUzMGQ1XHUzMGEzXHUzMGZjXHUzMGMxXHUzMGUzXHUzMGZjIHsxfVx1MzAwMVx1MzA0YVx1MzA4OFx1MzA3M1x1NTAyNCB7Mn0gXHUzMDZlXHU1YzVlXHU2MDI3XHUzMDZlXHU4YTJkXHU1YjlhXHUzMGE4XHUzMGU5XHUzMGZjDQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzM9XHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4IHswfVx1MzAwMVx1MzBkNVx1MzBhM1x1MzBmY1x1MzBjMVx1MzBlM1x1MzBmYyB7MX1cdTMwMDFcdTMwNGFcdTMwODhcdTMwNzNcdTUwMjQgezJ9IFx1MzA2ZVx1NWM1ZVx1NjAyN1x1MzA2ZVx1OGEyZFx1NWI5YVx1NjViOVx1NmNkNVx1MzA0Y1x1NGUwZFx1NjYwZVx1MzA2N1x1MzA1OQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZT1cdTMwZDVcdTMwYTNcdTMwZmNcdTMwYzFcdTMwZTNcdTMwZmMgezB9IFx1MzA2ZVx1NTNjMlx1NzE2N1x1MzA2ZVx1OGEyZFx1NWI5YVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2N1x1MzA1OVx1MzAwMklEIHsxfSBcdTMwNmVcdTg5ODFcdTdkMjBcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMNCi1saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2VfMj1cdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzggezB9XHUzMDAxXHUzMGQ1XHUzMGEzXHUzMGZjXHUzMGMxXHUzMGUzXHUzMGZjIHsxfVx1MzAwMVx1MzA0YVx1MzA4OFx1MzA3M1x1NTAyNCB7Mn0gXHUzMDZlXHU1M2MyXHU3MTY3XHUzMDZlXHU4YTJkXHU1YjlhXHUzMGE4XHUzMGU5XHUzMGZjDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYjg5ZjBjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6DQotIw0KLQ0KLSMgSW1wb3J0IFhNTCBXaXphcmQNCi1pbXBvcnRYTUxXaXphcmRfdGl0bGU9WE1MIFx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMA0KLQ0KLSMgU2VsZWN0IEltcG9ydCBYTUwgRmlsZSBXaXphcmQgUGFnZQ0KLXNlbGVjdFhNTEZpbGVQYWdlX3RpdGxlPVx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMCBcdWQzMGNcdWM3N2MgXHVjOWMwXHVjODE1DQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1cdWFjMDBcdWM4MzhcdWM2MjRcdWFlMzBcdWQ1NjAgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWNlZThcdWQxNTBcdWNlMjBcdWI5N2MgXHVkM2VjXHVkNTY4XHVkNTU4XHVhY2UwIFx1Yzc4OFx1YjI5NCBYTUwgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YWNlMCBcdWMyMThcdWQ1ODlcdWQ1NjAgXHVjODAxXHVjODA4XHVkNTVjIFx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMCBcdWM4NzBcdWM3OTFcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWZpbGVMYWJlbF90ZXh0PVhNTCBcdWQzMGNcdWM3N2M6DQotYnJvd3NlQnV0dG9uX3RleHQ9XHVjYzNlXHVjNTQ0XHViY2Y0XHVhZTMwLi4uDQotb3B0aW9uR3JvdXBfdGV4dD1cdWFjMDBcdWM4MzhcdWM2MjRcdWFlMzAgXHVjNjM1XHVjMTU4DQotb3ZlcndyaXRlUmFkaW9CdXR0b25fdGV4dD1cdWFlMzBcdWM4NzQgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWNlZThcdWQxNTBcdWNlMjBcdWI5N2MgXHVhYzAwXHVjODM4XHVjNjI0XHViMjk0IFx1Y2VlOFx1ZDE1MFx1Y2UyMFx1Yjg1YyBcdWFjYjlcdWNjZDBcdWM1MDFcdWIyYzhcdWIyZTQuDQotbWVyZ2VSYWRpb0J1dHRvbl90ZXh0PVx1YWMwMFx1YzgzOFx1YzYyNFx1YjI5NCBcdWNlZThcdWQxNTBcdWNlMjBcdWI5N2MgXHVhZTMwXHVjODc0IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM1ZDAgXHViY2QxXHVkNTY5XHVkNTY5XHViMmM4XHViMmU0Lg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1pbXBvcnRpbmdYTUxfdGV4dD1YTUwgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1Y2VlOFx1ZDE1MFx1Y2UyMFx1Yjk3YyBcdWQ2MDRcdWM3YWMgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjg1YyBcdWFjMDBcdWM4MzhcdWM2MjRcdWFlMzAgXHVjOTExLi4uDQotDQotIyBJbXBvcnQgWE1MIEVycm9yIERpYWxvZw0KLXJldmlld19sb2dfZmlsZXM9XHVhYzAwXHVjODM4XHVjNjI0XHVhZTMwIFx1Yzg3MFx1Yzc5MVx1Yzc3NCBcdWM2NDRcdWI4Y2NcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1YzYyNFx1Yjk1OFx1YzVkMCBcdWIzMDBcdWQ1NzRcdWMxMWNcdWIyOTQgJyd7MH0nJyBcdWQzZjRcdWIzNTRcdWM1ZDAgXHVjNzg4XHViMjk0XG5cdWI4NWNcdWFkZjggXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YWM4MFx1ZDFhMFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1pbXBvcnRYTUxFcnJvcl9tc2c9SVVQTTAwMDBFOiBcdWFjMDBcdWM4MzhcdWM2MjRcdWFlMzAgXHVjODcwXHVjNzkxXHVjNzQ0IFx1YzljNFx1ZDU4OVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWltcG9ydFhNTEVycm9yX3JlYXNvbj1JVVBNMDAwOUU6IFx1ZDYwNFx1YzdhYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViMjk0IFx1Yzc3ZFx1YWUzMCBcdWM4MDRcdWM2YTlcdWM3ODVcdWIyYzhcdWIyZTQuXG5cbicnezB9JydcdWM3NzQoXHVhYzAwKSBcdWM0ZjBcdWFlMzAgXHVhYzAwXHViMmE1XHVkNTVjXHVjOWMwIFx1ZDY1NVx1Yzc3OFx1ZDU1OFx1YWM3MFx1YjA5OCBcdWMwYzggXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWM3OTFcdWMxMzFcdWQ1NThcdWFjZTAgXHViMmU0XHVjMmRjIFx1YzJkY1x1YjNjNFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZFhNTEZpbGVfZXJyb3I9XHVjOWMwXHVjODE1XHVkNTVjIFhNTCBcdWQzMGNcdWM3N2NcdWM3NzQgXHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YT1JVVBNMDAxMEU6IFx1YzljMFx1YzgxNVx1YjQxYyBYTUwgXHVkMzBjXHVjNzdjXHVjNzc0IHsxfSBcdWM3NzRcdWM4MDQgXHViYzg0XHVjODA0KHswfSlcdWM1ZDBcdWMxMWMgXHViMGI0XHViY2Y0XHViMGI0XHVjODRjXHVjMmI1XHViMmM4XHViMmU0LiB7MX0gXHVkNjA0XHVjN2FjIFx1YmM4NFx1YzgwNFx1Yzc0NCBcdWMwYWNcdWM2YTlcdWQ1NThcdWM1ZWMgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YjBiNFx1YmNmNFx1YjBiNFx1YzU3YyBcdWQ1NjlcdWIyYzhcdWIyZTQuDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBNMDAxMUU6IFx1YzljMFx1YzgxNVx1YjQxYyBYTUwgXHVkMzBjXHVjNzdjXHVjNzc0IHswfSBcdWM3NzRcdWM4MDQgXHViYzg0XHVjODA0XHVjNWQwXHVjMTFjIFx1YjBiNFx1YmNmNFx1YjBiNFx1Yzg0Y1x1YzJiNVx1YjJjOFx1YjJlNC4gezB9IFx1ZDYwNFx1YzdhYyBcdWJjODRcdWM4MDRcdWM3NDQgXHVjMGFjXHVjNmE5XHVkNTU4XHVjNWVjIFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWIwYjRcdWJjZjRcdWIwYjRcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUE0wMDEyRTogXHVjOWMwXHVjODE1XHViNDFjIFhNTCBcdWQzMGNcdWM3N2NcdWM3NzQgezF9IFx1YzBjOCBcdWJjODRcdWM4MDQoezB9KVx1YzVkMFx1YzExYyBcdWIwYjRcdWJjZjRcdWIwYjRcdWM4NGNcdWMyYjVcdWIyYzhcdWIyZTQuIFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWFjMDBcdWM4MzhcdWM2MjRcdWI4MjRcdWJhNzQgezF9IFx1YmM4NFx1YzgwNFx1Yzc0NCBcdWM1YzVcdWFkZjhcdWI4MDhcdWM3NzRcdWI0ZGNcdWQ1NzRcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0LiANCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUE0wMDEzRTogXHVjOWMwXHVjODE1XHVkNTVjIFhNTCBcdWQzMGNcdWM3N2NcdWM3NDQgXHVjNWY0IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuIFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWFjMDBcdWM4MzhcdWM2MjRcdWI4MjRcdWJhNzQgezB9IFx1YmM4NFx1YzgwNFx1Yzc0NCBcdWM1YzVcdWFkZjhcdWI4MDhcdWM3NzRcdWI0ZGNcdWQ1NzRcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0LiANCi0NCi1pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfbm90X2hhbmRsZWQ9XHVjYzk4XHViOWFjXHViNDE4XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWM2OTRcdWMxOGM6IHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF93aXRob3V0X2lkPUlEXHVhYzAwIFx1YzVjNlx1YjI5NCBcdWM2OTRcdWMxOGM6IHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfaW1wb3J0X2ZhaWxlZD1cdWFjMDBcdWM4MzhcdWM2MjRcdWFlMzAgXHVjMmU0XHVkMzI4OiB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX21pc3NpbmdfcGx1Z2luPVx1ZDU0NFx1YzIxOCBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzggezB9IFx1YjIwNFx1Yjc3ZA0KLWltcG9ydFhNTFNlcnZpY2VfZXJyb3JfbWlzc2luZ19wbHVnaW5zPVx1ZDU0NFx1YzIxOCBcdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NzQgXHViMjA0XHViNzdkXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0LiBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmRcdWM3NDAgXHViODVjXHVhZGY4IFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWQ2NTVcdWM3NzhcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotbGlicmFyeV9lcnJvcl9ub19lY2xhc3M9Q29udGVudENhdGVnb3J5IFx1Yzc5MVx1YzEzMSBcdWM2MjRcdWI5NTg6IHswfVx1YzVkMCBcdWIzMDBcdWQ1NWMgRUNsYXNzXHViOTdjIFx1YWMwMFx1YzgzOFx1YzYyYyBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWxpYnJhcnlfbm9fcGFja2FnZT1cdWM2MjRcdWJlMGNcdWM4MWRcdWQyYjggezB9XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWMxOGNcdWM3MjAgXHVkMzI4XHVkMGE0XHVjOWMwXHViOTdjIFx1Y2MzZVx1Yzc0NCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWxpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9XHVjNjk0XHVjMThjIFx1Yzc5MVx1YzEzMSBcdWM2MjRcdWI5NTg6IHswfQ0KLWxpYnJhcnlfb2JqZWN0X3N0cmluZz1cdWM2MjRcdWJlMGNcdWM4MWRcdWQyYjggezB9LCBcdWFlMzBcdWIyYTUgezF9DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzI9XHVjMThkXHVjMTMxIFx1YzEyNFx1YzgxNSBcdWM2MjRcdWI5NTg6IFx1YzYyY1x1YmMxNFx1Yjk3NFx1YzljMCBcdWM1NGFcdWM3NDAgXHVjMThkXHVjMTMxIFx1YWUzMFx1YjJhNSBcdWFjMTIgezB9DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlPVx1YzYyNFx1YmUwY1x1YzgxZFx1ZDJiOCB7MH0sIFx1YWUzMFx1YjJhNSB7MX0gXHViYzBmIFx1YWMxMiB7Mn1cdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzE4ZFx1YzEzMSBcdWMxMjRcdWM4MTUgXHVjNjI0XHViOTU4DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzM9XHVjNjI0XHViZTBjXHVjODFkXHVkMmI4IHswfSwgXHVhZTMwXHViMmE1IHsxfSBcdWJjMGYgXHVhYzEyIHsyfVx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjMThkXHVjMTMxIFx1YzEyNFx1YzgxNSBcdWJjMjlcdWJjOTVcdWM3NDQgXHVjNTRjIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlPVx1YWUzMFx1YjJhNSB7MH1cdWM1ZDAgXHViMzAwXHVkNTVjIFx1Y2MzOFx1Yzg3MCBcdWMxMjRcdWM4MTUgXHVjNjI0XHViOTU4OiBJRCB7MX1cdWM3NDQoXHViOTdjKSBcdWFjMDBcdWM5YzQgXHVjNjk0XHVjMThjXHVhYzAwIFx1YzVjNlx1Yzc0Yw0KLWxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZV8yPVx1YzYyNFx1YmUwY1x1YzgxZFx1ZDJiOCB7MH0sIFx1YWUzMFx1YjJhNSB7MX0gXHViYzBmIFx1YWMxMiB7Mn1cdWM1ZDAgXHViMzAwXHVkNTVjIFx1Y2MzOFx1Yzg3MCBcdWMxMjRcdWM4MTUgXHVjNjI0XHViOTU4DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlN2RhYTVjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6DQotIw0KLQ0KLSMgSW1wb3J0IFhNTCBXaXphcmQNCi1pbXBvcnRYTUxXaXphcmRfdGl0bGU9SW1wb3J0YXIgWE1MDQotDQotIyBTZWxlY3QgSW1wb3J0IFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9RXNwZWNpZmljYXIgYXJxdWl2byBkZSBpbXBvcnRhXHUwMGU3XHUwMGUzbw0KLXNlbGVjdFhNTEZpbGVQYWdlX2Rlc2M9RXNwZWNpZmlxdWUgbyBhcnF1aXZvIFhNTCBxdWUgY29udFx1MDBlOW0gbyBjb250ZVx1MDBmYWRvIGRhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG8gYSBzZXIgaW1wb3J0YWRvIGUgc2VsZWNpb25lIGEgb3BlcmFcdTAwZTdcdTAwZTNvIGRlIGltcG9ydGFcdTAwZTdcdTAwZTNvIGFwcm9wcmlhZGEgYSBzZXIgZXhlY3V0YWRhLg0KLWZpbGVMYWJlbF90ZXh0PUFycXVpdm8gWE1MOg0KLWJyb3dzZUJ1dHRvbl90ZXh0PVByb2N1cmFyLi4uDQotb3B0aW9uR3JvdXBfdGV4dD1PcFx1MDBlN1x1MDBlM28gZGUgaW1wb3J0YVx1MDBlN1x1MDBlM28NCi1vdmVyd3JpdGVSYWRpb0J1dHRvbl90ZXh0PVN1YnN0aXR1aXIgY29udGVcdTAwZmFkbyBkYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvIGV4aXN0ZW50ZSBwZWxvIGNvbnRlXHUwMGZhZG8gaW1wb3J0YWRvDQotbWVyZ2VSYWRpb0J1dHRvbl90ZXh0PU1lc2NsYXIgY29udGVcdTAwZmFkbyBpbXBvcnRhZG8gbmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kbyBleGlzdGVudGUNCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotaW1wb3J0aW5nWE1MX3RleHQ9SW1wb3J0YW5kbyBvIGNvbnRlXHUwMGZhZG8gZGEgYmlibGlvdGVjYSBYTUwgbmEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kbyBhdHVhbC4uLg0KLQ0KLSMgSW1wb3J0IFhNTCBFcnJvciBEaWFsb2cNCi1yZXZpZXdfbG9nX2ZpbGVzPUEgb3BlcmFcdTAwZTdcdTAwZTNvIGRlIGltcG9ydGFcdTAwZTdcdTAwZTNvIGZvaSBjb25jbHVcdTAwZWRkYS4gUmV2ZWphIG9zIGFycXVpdm9zIGRlIHJlZ2lzdHJvIG5hIFxucGFzdGEgJyd7MH0nJyBlbSBidXNjYSBkZSBxdWFscXVlciBlcnJvLg0KLWltcG9ydFhNTEVycm9yX21zZz1JVVBNMDAwMEU6IEEgb3BlcmFcdTAwZTdcdTAwZTNvIGRlIGltcG9ydGFcdTAwZTdcdTAwZTNvIG5cdTAwZTNvIHBvZGUgY29udGludWFyLg0KLWltcG9ydFhNTEVycm9yX3JlYXNvbj1JVVBNMDAwOUU6IEEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kbyBhdHVhbCBcdTAwZTkgZGUgbGVpdHVyYS5cblxuQ2VydGlmaXF1ZS1zZSBkZSBxdWUgJyd7MH0nJyBzZWphIGdyYXZcdTAwZTF2ZWwgb3UgY3JpZSB1bWEgbm92YSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvIGUgdGVudGUgbm92YW1lbnRlLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1pbnZhbGlkWE1MRmlsZV9lcnJvcj1PIGFycXVpdm8gWE1MIGVzcGVjaWZpY2FkbyBuXHUwMGUzbyBcdTAwZTkgdlx1MDBlMWxpZG8uDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGE9SVVQTTAwMTBFOiBPIGFycXVpdm8gWE1MIGVzcGVjaWZpY2FkbyBmb2kgZXhwb3J0YWRvIHBvciB1bWEgdmVyc1x1MDBlM28gYW50ZXJpb3IgKHswfSkgZGUgezF9LiBPcyBhcnF1aXZvcyBkZXZlbSBzZXIgZXhwb3J0YWRvcyB1c2FuZG8gYSB2ZXJzXHUwMGUzbyBhdHVhbCBkbyB7MX0uDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBNMDAxMUU6IE8gYXJxdWl2byBYTUwgZXNwZWNpZmljYWRvIGZvaSBleHBvcnRhZG8gcG9yIHVtYSB2ZXJzXHUwMGUzbyBhbnRlcmlvciBkZSB7MH0uIE9zIGFycXVpdm9zIGRldmVtIHNlciBleHBvcnRhZG9zIHVzYW5kbyBhIHZlcnNcdTAwZTNvIGF0dWFsIGRvIHswfS4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1JVVBNMDAxMkU6IE8gYXJxdWl2byBYTUwgZXNwZWNpZmljYWRvIGZvaSBleHBvcnRhZG8gcG9yIHVtYSB2ZXJzXHUwMGUzbyBtYWlzIHJlY2VudGUgKHswfSkgZGUgezF9LiBWb2NcdTAwZWEgZGV2ZSBmYXplciB1cGdyYWRlIGRlIHsxfSBwYXJhIGltcG9ydGFyIG8gYXJxdWl2by4gIA0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQTTAwMTNFOiBPIGFycXVpdm8gWE1MIGVzcGVjaWZpY2FkbyBuXHUwMGUzbyBwb2RlIHNlciBhYmVydG8uIFZvY1x1MDBlYSBkZXZlIGZhemVyIHVwZ3JhZGUgZGUgezB9IHBhcmEgaW1wb3J0YXIgbyBhcnF1aXZvLiAgDQotDQotaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X25vdF9oYW5kbGVkPUVsZW1lbnRvIG5cdTAwZTNvIGlkZW50aWZpY2FkbzogezB9DQotaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X3dpdGhvdXRfaWQ9RWxlbWVudG8gc2VtIElEOiB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX2ltcG9ydF9mYWlsZWQ9RmFsaGEgYW8gaW1wb3J0YXI6IHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfbWlzc2luZ19wbHVnaW49RmFsdGEgbyBwbHVnaW4gb2JyaWdhdFx1MDBmM3JpbyB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX2Vycm9yX21pc3NpbmdfcGx1Z2lucz1Fc3RcdTAwZTNvIGZhbHRhbmRvIHBsdWdpbihzKSBvYnJpZ2F0XHUwMGYzcmlvKHMpLiBWZXJpZmlxdWUgZGV0YWxoZXMgbm9zIGFycXVpdm9zIGRlIHJlZ2lzdHJvDQotDQotbGlicmFyeV9lcnJvcl9ub19lY2xhc3M9RXJybyBhbyBjcmlhciBDb250ZW50Q2F0ZWdvcnk6IGltcG9zc1x1MDBlZHZlbCBvYnRlciBFQ2xhc3MgcGFyYSB7MH0NCi1saWJyYXJ5X25vX3BhY2thZ2U9SW1wb3NzXHUwMGVkdmVsIGVuY29udHJhciBwYWNvdGUgcHJvcHJpZXRcdTAwZTFyaW8gZG8gb2JqZXRvIHswfQ0KLWxpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9RXJybyBhbyBjcmlhciBlbGVtZW50bzogezB9DQotbGlicmFyeV9vYmplY3Rfc3RyaW5nPW9iamV0byB7MH0sIHJlY3Vyc28gezF9DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzI9RXJybyBhbyBkZWZpbmlyIGF0cmlidXRvOiB2YWxvciBkZSByZWN1cnNvIGRlIGF0cmlidXRvIGludlx1MDBlMWxpZG8gezB9DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlPUVycm8gYW8gZGVmaW5pciBhdHJpYnV0byBwYXJhIG9iamV0byB7MH0sIHJlY3Vyc28gezF9IGUgdmFsb3IgezJ9DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzM9U2VtIHNhYmVyIGNvbW8gZGVmaW5pciBhdHJpYnV0byBwYXJhIG9iamV0byB7MH0sIHJlY3Vyc28gezF9IGUgdmFsb3IgezJ9DQotbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlPUVycm8gYW8gZGVmaW5pciByZWZlclx1MDBlYW5jaWEgcGFyYSByZWN1cnNvIHswfTogbmVuaHVtIGVsZW1lbnRvIGNvbSBvIGlkIHsxfQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZV8yPUVycm8gYW8gZGVmaW5pciByZWZlclx1MDBlYW5jaWEgcGFyYSBvYmpldG8gezB9LCByZWN1cnNvIHsxfSBlIHZhbG9yIHsyfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGQxNmZlOC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOg0KLSMNCi0NCi0jIEltcG9ydCBYTUwgV2l6YXJkDQotaW1wb3J0WE1MV2l6YXJkX3RpdGxlPVx1NWJmY1x1NTE2NSBYTUwNCi0NCi0jIFNlbGVjdCBJbXBvcnQgWE1MIEZpbGUgV2l6YXJkIFBhZ2UNCi1zZWxlY3RYTUxGaWxlUGFnZV90aXRsZT1cdTYzMDdcdTViOWFcdTViZmNcdTUxNjVcdTY1ODdcdTRlZjYNCi1zZWxlY3RYTUxGaWxlUGFnZV9kZXNjPVx1OGJmN1x1NjMwN1x1NWI5YVx1NTMwNVx1NTQyYlx1ODk4MVx1NWJmY1x1NTE2NVx1NzY4NFx1NjViOVx1NmNkNVx1NWU5M1x1NzY4NCBYTUwgXHU2NTg3XHU0ZWY2XHVmZjBjXHU1ZTc2XHU5MDA5XHU2MmU5XHU4OTgxXHU2MjY3XHU4ODRjXHU3Njg0XHU3NmY4XHU1ZTk0XHU1YmZjXHU1MTY1XHU2NGNkXHU0ZjVjXHUzMDAyDQotZmlsZUxhYmVsX3RleHQ9WE1MIFx1NjU4N1x1NGVmNlx1ZmYxYQ0KLWJyb3dzZUJ1dHRvbl90ZXh0PVx1NmQ0Zlx1ODljOC4uLg0KLW9wdGlvbkdyb3VwX3RleHQ9XHU1YmZjXHU1MTY1XHU5MDA5XHU5ODc5DQotb3ZlcndyaXRlUmFkaW9CdXR0b25fdGV4dD1cdTc1MjhcdTViZmNcdTUxNjVcdTc2ODRcdTUxODVcdTViYjlcdTg5ODZcdTc2ZDZcdTczYjBcdTY3MDlcdTc2ODRcdTY1YjlcdTZjZDVcdTVlOTNcdTUxODVcdTViYjkNCi1tZXJnZVJhZGlvQnV0dG9uX3RleHQ9XHU1YzA2XHU1YmZjXHU1MTY1XHU3Njg0XHU1MTg1XHU1YmI5XHU1NDA4XHU1ZTc2XHU1MjMwXHU3M2IwXHU2NzA5XHU3Njg0XHU2NWI5XHU2Y2Q1XHU1ZTkzXHU0ZTJkDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWltcG9ydGluZ1hNTF90ZXh0PVx1NmI2M1x1NTcyOFx1NWMwNiBYTUwgXHU1ZTkzXHU1MTg1XHU1YmI5XHU1YmZjXHU1MTY1XHU1MjMwXHU1ZjUzXHU1MjRkXHU2NWI5XHU2Y2Q1XHU1ZTkzXHU0ZTJkLi4uDQotDQotIyBJbXBvcnQgWE1MIEVycm9yIERpYWxvZw0KLXJldmlld19sb2dfZmlsZXM9XHU1YmZjXHU1MTY1XHU2NGNkXHU0ZjVjXHU1ZGYyXHU1YjhjXHU2MjEwXHUzMDAyXHU4YmY3XHU2N2U1XHU3NzBiIHswfSBcdTY1ODdcdTRlZjZcdTU5MzlcdTRlMmRcdTc2ODRcblx1NjVlNVx1NWZkN1x1NjU4N1x1NGVmNlx1ZmYwY1x1NGVlNVx1Nzg2ZVx1OGJhNFx1NjYyZlx1NTQyNlx1NWI1OFx1NTcyOFx1OTUxOVx1OGJlZlx1MzAwMg0KLWltcG9ydFhNTEVycm9yX21zZz1JVVBNMDAwMEU6IFx1NWJmY1x1NTE2NVx1NjRjZFx1NGY1Y1x1NjVlMFx1NmNkNVx1N2VlN1x1N2VlZFx1MzAwMg0KLWltcG9ydFhNTEVycm9yX3JlYXNvbj1JVVBNMDAwOUU6IFx1NWY1M1x1NTI0ZFx1NjViOVx1NmNkNVx1NWU5M1x1NGUzYVx1NTNlYVx1OGJmYlx1MzAwMlxuXG5cdThiZjdcdTc4NmVcdTRmZGRcdTIwMWN7MH1cdTIwMWRcdTRlM2FcdTUzZWZcdThiZmJcdWZmMGNcdTYyMTZcdTUyMWJcdTVlZmFcdTY1YjBcdTY1YjlcdTZjZDVcdTVlOTNcdTVlNzZcdTkxY2RcdThiZDVcdTMwMDINCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZFhNTEZpbGVfZXJyb3I9XHU2MzA3XHU1YjlhXHU3Njg0IFhNTCBcdTY1ODdcdTRlZjZcdTY1ZTBcdTY1NDhcdTMwMDINCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YT1JVVBNMDAxMEU6IFx1NjMwN1x1NWI5YVx1NzY4NCBYTUwgXHU2NTg3XHU0ZWY2XHU2NjJmXHU3NTMxIHsxfSBcdTc2ODRcdTUxNDhcdTUyNGRcdTcyNDhcdTY3MmMgezB9IFx1NWJmY1x1NTFmYVx1NzY4NFx1MzAwMlx1NWZjNVx1OTg3Ylx1NGY3Zlx1NzUyOCB7MX0gXHU3Njg0XHU1ZjUzXHU1MjRkXHU3MjQ4XHU2NzJjXHU1YmZjXHU1MWZhXHU4ZmQ5XHU0ZTliXHU2NTg3XHU0ZWY2XHUzMDAyDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBNMDAxMUU6IFx1NjMwN1x1NWI5YVx1NzY4NCBYTUwgXHU2NTg3XHU0ZWY2XHU2NjJmXHU3NTMxIHswfSBcdTc2ODRcdTUxNDhcdTUyNGRcdTcyNDhcdTY3MmNcdTViZmNcdTUxZmFcdTc2ODRcdTMwMDJcdTVmYzVcdTk4N2JcdTRmN2ZcdTc1MjggezB9IFx1NzY4NFx1NWY1M1x1NTI0ZFx1NzI0OFx1NjcyY1x1NWJmY1x1NTFmYVx1OGZkOVx1NGU5Ylx1NjU4N1x1NGVmNlx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUE0wMDEyRTogXHU2MzA3XHU1YjlhXHU3Njg0IFhNTCBcdTY1ODdcdTRlZjZcdTY2MmZcdTc1MzEgezF9IFx1NzY4NFx1NjZmNFx1NjViMFx1NzI0OFx1NjcyYyB7MH0gXHU1YmZjXHU1MWZhXHU3Njg0XHUzMDAyXHU2MGE4XHU1ZmM1XHU5ODdiXHU1MzQ3XHU3ZWE3IHsxfSBcdTYyNGRcdTgwZmRcdTViZmNcdTUxNjVcdThmZDlcdTRlOWJcdTY1ODdcdTRlZjZcdTMwMDINCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUE0wMDEzRVx1ZmYxYVx1NjVlMFx1NmNkNVx1NjI1M1x1NWYwMFx1NjMwN1x1NWI5YVx1NzY4NCBYTUwgXHU2NTg3XHU0ZWY2XHUzMDAyXHU2MGE4XHU1ZmM1XHU5ODdiXHU1MzQ3XHU3ZWE3IHswfSBcdTYyNGRcdTgwZmRcdTViZmNcdTUxNjVcdThiZTVcdTY1ODdcdTRlZjZcdTMwMDINCi0NCi1pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfbm90X2hhbmRsZWQ9XHU1MTQzXHU3ZDIwXHU2NzJhXHU1OTA0XHU3NDA2XHVmZjFhezB9DQotaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X3dpdGhvdXRfaWQ9XHU2NWUwXHU2ODA3XHU4YmM2XHU3Njg0XHU1MTQzXHU3ZDIwXHVmZjFhezB9DQotaW1wb3J0WE1MU2VydmljZV9pbXBvcnRfZmFpbGVkPVx1NWJmY1x1NTE2NVx1NTkzMVx1OGQyNVx1ZmYxYXswfQ0KLWltcG9ydFhNTFNlcnZpY2VfbWlzc2luZ19wbHVnaW49XHU3ZjNhXHU1YzExXHU1ZmM1XHU5NzAwXHU3Njg0XHU2M2QyXHU0ZWY2IHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfZXJyb3JfbWlzc2luZ19wbHVnaW5zPVx1N2YzYVx1NWMxMVx1NWZjNVx1OTcwMFx1NzY4NFx1NjNkMlx1NGVmNlx1MzAwMlx1OGJmN1x1NjdlNVx1OTYwNVx1NjVlNVx1NWZkN1x1NjU4N1x1NGVmNlx1ZmYwY1x1NGVlNVx1NGU4Nlx1ODllM1x1OGJlNlx1N2VjNlx1NmQ4OFx1NjA2Zg0KLQ0KLWxpYnJhcnlfZXJyb3Jfbm9fZWNsYXNzPVx1NTIxYlx1NWVmYVx1NTE4NVx1NWJiOVx1N2M3Ylx1NTIyYlx1NjVmNlx1NTFmYVx1OTUxOVx1ZmYxYVx1NjVlMFx1NmNkNVx1ODNiN1x1NWY5NyB7MH0gXHU3Njg0IEVDbGFzc1x1MzAwMg0KLWxpYnJhcnlfbm9fcGFja2FnZT1cdTY1ZTBcdTZjZDVcdTYyN2VcdTUyMzBcdTViZjlcdThjNjEgezB9IFx1NjI0MFx1NWM1ZVx1NzY4NFx1NjU3MFx1NjM2ZVx1NTMwNVx1MzAwMg0KLWxpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9XHU1MjFiXHU1ZWZhXHU1MTQzXHU3ZDIwXHU2NWY2XHU1MWZhXHU5NTE5XHVmZjFhezB9DQotbGlicmFyeV9vYmplY3Rfc3RyaW5nPVx1NWJmOVx1OGM2MSB7MH1cdWZmMGNcdTUyOWZcdTgwZmRcdTkwZThcdTRlZjYgezF9DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzI9XHU4YmJlXHU3ZjZlXHU1YzVlXHU2MDI3XHU2NWY2XHU1MWZhXHU5NTE5XHVmZjFhXHU2NWUwXHU2NTQ4XHU3Njg0XHU1YzVlXHU2MDI3XHU1MjlmXHU4MGZkXHU5MGU4XHU0ZWY2XHU1MDNjIHswfQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZT1cdThiYmVcdTdmNmVcdTViZjlcdThjNjEgezB9XHUzMDAxXHU1MjlmXHU4MGZkXHU5MGU4XHU0ZWY2IHsxfSBcdTU0OGNcdTUwM2MgezJ9IFx1NzY4NFx1NWM1ZVx1NjAyN1x1NjVmNlx1NTFmYVx1OTUxOVx1MzAwMg0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8zPVx1NGUwZFx1NzdlNVx1OTA1M1x1NTk4Mlx1NGY1NVx1OGJiZVx1N2Y2ZVx1NWJmOVx1OGM2MSB7MH1cdTMwMDFcdTUyOWZcdTgwZmRcdTkwZThcdTRlZjYgezF9IFx1NTQ4Y1x1NTAzYyB7Mn0gXHU3Njg0XHU1YzVlXHU2MDI3XHUzMDAyDQotbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlPVx1OGJiZVx1N2Y2ZVx1NTI5Zlx1ODBmZFx1OTBlOFx1NGVmNiB7MH0gXHU3Njg0XHU1ZjE1XHU3NTI4XHU2NWY2XHU1MWZhXHU5NTE5XHVmZjFhXHU0ZTBkXHU1YjU4XHU1NzI4XHU1ZTI2XHU2NzA5XHU2ODA3XHU4YmM2IHsxfSBcdTc2ODRcdTUxNDNcdTdkMjANCi1saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2VfMj1cdThiYmVcdTdmNmVcdTViZjlcdThjNjEgezB9XHUzMDAxXHU1MjlmXHU4MGZkXHU5MGU4XHU0ZWY2IHsxfSBcdTU0OGNcdTUwM2MgezJ9IFx1NzY4NFx1NWYxNVx1NzUyOFx1NjVmNlx1NTFmYVx1OTUxOVx1MzAwMg0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDA5NGI2Yi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOg0KLSMNCi0NCi0jIEltcG9ydCBYTUwgV2l6YXJkDQotaW1wb3J0WE1MV2l6YXJkX3RpdGxlPVx1NTMyZlx1NTE2NSBYTUwNCi0NCi0jIFNlbGVjdCBJbXBvcnQgWE1MIEZpbGUgV2l6YXJkIFBhZ2UNCi1zZWxlY3RYTUxGaWxlUGFnZV90aXRsZT1cdTYzMDdcdTViOWFcdTUzMmZcdTUxNjVcdTZhOTQNCi1zZWxlY3RYTUxGaWxlUGFnZV9kZXNjPVx1NjMwN1x1NWI5YSBYTUwgXHU2YTk0XHVmZjBjXHU1MTY3XHU1NDJiXHU4OTgxXHU1MzJmXHU1MTY1XHU3Njg0XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU1MTY3XHU1YmI5XHVmZjBjXHU0ZTI2XHU5MDc4XHU1M2Q2XHU5MDY5XHU3NTc2XHU3Njg0XHU1MzJmXHU1MTY1XHU0ZjVjXHU2OTZkXHU0Zjg2XHU1N2Y3XHU4ODRjXHUzMDAyDQotZmlsZUxhYmVsX3RleHQ9WE1MIFx1NmE5NFx1ZmYxYQ0KLWJyb3dzZUJ1dHRvbl90ZXh0PVx1NzAwZlx1ODliZC4uLg0KLW9wdGlvbkdyb3VwX3RleHQ9XHU1MzJmXHU1MTY1XHU5MDc4XHU5ODA1DQotb3ZlcndyaXRlUmFkaW9CdXR0b25fdGV4dD1cdTRlZTVcdTUzMmZcdTUxNjVcdTc2ODRcdTUxNjdcdTViYjlcdTRmODZcdTdmNmVcdTYzZGJcdTczZmVcdTY3MDlcdTc2ODRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTUxNjdcdTViYjkNCi1tZXJnZVJhZGlvQnV0dG9uX3RleHQ9XHU1YzA3XHU1MzJmXHU1MTY1XHU3Njg0XHU1MTY3XHU1YmI5XHU1NDA4XHU0Zjc1XHU4MWYzXHU3M2ZlXHU2NzA5XHU3Njg0XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWltcG9ydGluZ1hNTF90ZXh0PVx1NmI2M1x1NTcyOFx1NWMwNyBYTUwgXHU3YTBiXHU1ZjBmXHU1ZWFiXHU1MTY3XHU1YmI5XHU1MzJmXHU1MTY1XHU3M2ZlXHU4ODRjXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiLi4uDQotDQotIyBJbXBvcnQgWE1MIEVycm9yIERpYWxvZw0KLXJldmlld19sb2dfZmlsZXM9XHU1MzJmXHU1MTY1XHU0ZjVjXHU2OTZkXHU1ZGYyXHU1YjhjXHU2MjEwXHUzMDAyXHU4YWNiXHU2N2U1XHU5NWIxXG4nJ3swfScnIFx1OGNjN1x1NjU5OVx1NTkzZVx1NGUyZFx1NzY4NFx1NjVlNVx1OGE4Y1x1NmE5NFx1NjYyZlx1NTQyNlx1NjcwOVx1NGVmYlx1NGY1NVx1OTMyZlx1OGFhNFx1MzAwMg0KLWltcG9ydFhNTEVycm9yX21zZz1JVVBNMDAwMEU6IFx1NzEyMVx1NmNkNVx1N2U3Y1x1N2U4Y1x1NTMyZlx1NTE2NVx1NGY1Y1x1Njk2ZFx1MzAwMg0KLWltcG9ydFhNTEVycm9yX3JlYXNvbj1JVVBNMDAwOUU6IFx1NzNmZVx1ODg0Y1x1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NjYyZlx1NTUyZlx1OGI4MFx1NzY4NFx1MzAwMlxuXG5cdThhY2JcdTc4YmFcdTViOWFcdTUzZWZcdTViZWJcdTUxNjUgJyd7MH0nJ1x1ZmYwY1x1NjIxNlx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1ZmYwY1x1NzEzNlx1NWY4Y1x1NTE4ZFx1OGE2Nlx1NGUwMFx1NmIyMVx1MzAwMg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1pbnZhbGlkWE1MRmlsZV9lcnJvcj1cdTYzMDdcdTViOWFcdTc2ODQgWE1MIFx1NmE5NFx1NzEyMVx1NjU0OFx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUE0wMDEwRTogXHU2MzA3XHU1YjlhXHU3Njg0IFhNTCBcdTZhOTRcdTY2MmZcdTVmOWVcdTgyMGFcdTcyNDggKHswfSkgXHU3Njg0IHsxfSBcdTUzMmZcdTUxZmFcdTMwMDJcdTZhOTRcdTY4NDhcdTVmYzVcdTk4MDhcdTRlZTUgezF9IFx1NzNmZVx1ODg0Y1x1NzI0OFx1NjcyY1x1NTMyZlx1NTFmYVx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd249SVVQTTAwMTFFOiBcdTYzMDdcdTViOWFcdTc2ODQgWE1MIFx1NmE5NFx1NjYyZlx1NWY5ZVx1ODIwYVx1NzI0OFx1NzY4NCB7MH0gXHU1MzJmXHU1MWZhXHUzMDAyXHU2YTk0XHU2ODQ4XHU1ZmM1XHU5ODA4XHU0ZWU1IHswfSBcdTczZmVcdTg4NGNcdTcyNDhcdTY3MmNcdTUzMmZcdTUxZmFcdTMwMDINCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1JVVBNMDAxMkU6IFx1NjMwN1x1NWI5YVx1NzY4NCBYTUwgXHU2YTk0XHU2NjJmXHU1ZjllXHU4ZjAzXHU2NWIwXHU3MjQ4ICh7MH0pIFx1NzY4NCB7MX0gXHU1MzJmXHU1MWZhXHUzMDAyXHU2MGE4XHU1ZmM1XHU5ODA4XHU1MzQ3XHU3ZDFhIHsxfSBcdTYyNGRcdTgwZmRcdTUzMmZcdTUxNjVcdTZhOTRcdTY4NDhcdTMwMDINCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUE0wMDEzRTogXHU3MTIxXHU2Y2Q1XHU5NThiXHU1NTVmXHU2MzA3XHU1YjlhXHU3Njg0IFhNTCBcdTZhOTRcdTY4NDhcdTMwMDJcdTYwYThcdTVmYzVcdTk4MDhcdTUzNDdcdTdkMWEgezB9IFx1NjI0ZFx1ODBmZFx1NTMyZlx1NTE2NVx1NmE5NFx1Njg0OFx1MzAwMg0KLQ0KLWltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF9ub3RfaGFuZGxlZD1cdTY3MmFcdTg2NTVcdTc0MDZcdTc2ODRcdTUxNDNcdTdkMjBcdWZmMWF7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfd2l0aG91dF9pZD1cdTcxMjEgSUQgXHU3Njg0XHU1MTQzXHU3ZDIwXHVmZjFhezB9DQotaW1wb3J0WE1MU2VydmljZV9pbXBvcnRfZmFpbGVkPVx1NTMyZlx1NTE2NVx1NTkzMVx1NjU1N1x1ZmYxYXswfQ0KLWltcG9ydFhNTFNlcnZpY2VfbWlzc2luZ19wbHVnaW49XHU5MDdhXHU2ZjBmXHU1ZmM1XHU4OTgxXHU3Njg0XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmIHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfZXJyb3JfbWlzc2luZ19wbHVnaW5zPVx1OTA3YVx1NmYwZlx1NWZjNVx1ODk4MVx1NzY4NFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1MzAwMlx1NTk4Mlx1OTcwMFx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1ZmYwY1x1OGFjYlx1NTNjM1x1OTViMVx1NjVlNVx1OGE4Y1x1NmE5NA0KLQ0KLWxpYnJhcnlfZXJyb3Jfbm9fZWNsYXNzPVx1NWVmYVx1N2FjYiBDb250ZW50Q2F0ZWdvcnkgXHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0XHVmZjFhXHU3MTIxXHU2Y2Q1XHU1M2Q2XHU1Zjk3IHswfSBcdTc2ODQgRUNsYXNzDQotbGlicmFyeV9ub19wYWNrYWdlPVx1NjI3ZVx1NGUwZFx1NTIzMFx1NzI2OVx1NGVmNiB7MH0gXHU3Njg0XHU0ZTNiXHU2M2E3XHU1OTU3XHU0ZWY2DQotbGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudD1cdTVlZmFcdTdhY2JcdTUxNDNcdTdkMjBcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdWZmMWF7MH0NCi1saWJyYXJ5X29iamVjdF9zdHJpbmc9XHU3MjY5XHU0ZWY2IHswfVx1ZmYwY1x1NzI3OVx1NjAyNyB7MX0NCi1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMj1cdThhMmRcdTViOWFcdTVjNmNcdTYwMjdcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdWZmMWFcdTVjNmNcdTYwMjdcdTcyNzlcdTYwMjdcdTUwM2MgezB9IFx1NzEyMVx1NjU0OA0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZT1cdThhMmRcdTViOWFcdTVjNmNcdTYwMjdcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdWZmMWFcdTcyNjlcdTRlZjYgezB9XHVmZjBjXHU3Mjc5XHU2MDI3IHsxfVx1ZmYwY1x1NTAzYyB7Mn0NCi1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMz1cdTRlMGRcdTc3ZTVcdTU5ODJcdTRmNTVcdThhMmRcdTViOWFcdTVjNmNcdTYwMjdcdWZmMWFcdTcyNjlcdTRlZjYgezB9XHVmZjBjXHU3Mjc5XHU2MDI3IHsxfVx1ZmYwY1x1NTAzYyB7Mn0NCi1saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U9XHU4YTJkXHU1YjlhXHU3Mjc5XHU2MDI3IHswfSBcdTc2ODRcdTUzYzNcdTcxNjdcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdWZmMWFcdTYyN2VcdTRlMGRcdTUyMzAgSUQgezF9IFx1NzY4NFx1NTE0M1x1N2QyMA0KLWxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZV8yPVx1OGEyZFx1NWI5YVx1NTNjM1x1NzE2N1x1NjY0Mlx1NzY3Y1x1NzUxZlx1OTMyZlx1OGFhNFx1ZmYxYVx1NzI2OVx1NGVmNiB7MH1cdWZmMGNcdTcyNzlcdTYwMjcgezF9XHVmZjBjXHU1MDNjIHsyfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMi8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNjRiMDZkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDI8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYjBkNTkwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgWE1MIEltcG9ydCAoTkwyKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1NGZjYTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcnUucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFmN2YzMjIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDIgWE1MDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBJbXBvcnQgWE1MIFdpemFyZA0KLWltcG9ydFhNTFdpemFyZE5hbWU9WE1MDQotaW1wb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249XHUwNDE4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzOFx1MDQzNyBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0M2VcdTA0MzIgWE1MLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXNfcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjllYzljZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOg0KLSMNCi0NCi0jIEltcG9ydCBYTUwgV2l6YXJkDQotaW1wb3J0WE1MV2l6YXJkX3RpdGxlPVx1MDQxOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBYTUwNCi0NCi0jIFNlbGVjdCBJbXBvcnQgWE1MIEZpbGUgV2l6YXJkIFBhZ2UNCi1zZWxlY3RYTUxGaWxlUGFnZV90aXRsZT1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzANCi1zZWxlY3RYTUxGaWxlUGFnZV9kZXNjPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgWE1MIFx1MDQ0MSBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0MzBcdTA0M2NcdTA0MzggXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwIFx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDNlXHUwNDNlXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDQzXHUwNDRlIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzAuDQotZmlsZUxhYmVsX3RleHQ9XHUwNDI0XHUwNDMwXHUwNDM5XHUwNDNiIFhNTDoNCi1icm93c2VCdXR0b25fdGV4dD1cdTA0MWVcdTA0MzFcdTA0MzdcdTA0M2VcdTA0NDAuLi4NCi1vcHRpb25Hcm91cF90ZXh0PVx1MDQxZVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzANCi1vdmVyd3JpdGVSYWRpb0J1dHRvbl90ZXh0PVx1MDQxN1x1MDQzMFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDNjXHUwNDM4IFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzMFx1MDQzY1x1MDQzOA0KLW1lcmdlUmFkaW9CdXR0b25fdGV4dD1cdTA0MWVcdTA0MzFcdTA0NGFcdTA0MzVcdTA0MzRcdTA0MzhcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0YiBcdTA0NDEgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzOSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotaW1wb3J0aW5nWE1MX3RleHQ9XHUwNDE4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggWE1MIFx1MDQzMiBcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDNcdTA0NDlcdTA0NDNcdTA0NGUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4uLg0KLQ0KLSMgSW1wb3J0IFhNTCBFcnJvciBEaWFsb2cNCi1yZXZpZXdfbG9nX2ZpbGVzPVx1MDQxOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2QuIFx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDMwIFx1MDQzMiBcblx1MDQzZlx1MDQzMFx1MDQzZlx1MDQzYVx1MDQzNSAnJ3swfScnIFx1MDQzZFx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M2NcdTA0MzVcdTA0NDIgXHUwNDNlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNlXHUwNDNhLg0KLWltcG9ydFhNTEVycm9yX21zZz1JVVBNMDAwMEU6IFx1MDQxZFx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyLg0KLWltcG9ydFhNTEVycm9yX3JlYXNvbj1JVVBNMDAwOUU6IFx1MDQxMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDM0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDNkXHUwNDMwIFx1MDQ0Mlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQzZSBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDQ3XHUwNDQyXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLlxuXG5cdTA0MjNcdTA0MzFcdTA0MzVcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0NDFcdTA0NGMsIFx1MDQ0N1x1MDQ0Mlx1MDQzZSBcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDRjIFx1MDQzMiAnJ3swfScnLCBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzZFx1MDQzZVx1MDQzMlx1MDQ0M1x1MDQ0ZSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDNmXHUwNDRiXHUwNDQyXHUwNDNhXHUwNDQzLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1pbnZhbGlkWE1MRmlsZV9lcnJvcj1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2QgXHUwNDNkXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDRiXHUwNDM5IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYiBYTUwuDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGE9SVVQTTAwMTBFOiBcdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiIFhNTCBcdTA0MzFcdTA0NGJcdTA0M2IgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkIFx1MDQzMiBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NGJcdTA0MzRcdTA0NDNcdTA0NDlcdTA0MzVcdTA0MzkgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4ICh7MH0pIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMCB7MX0uIFx1MDQxZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzY1x1MDQzZSBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiIFx1MDQ0MSBcdTA0M2ZcdTA0M2VcdTA0M2NcdTA0M2VcdTA0NDlcdTA0NGNcdTA0NGUgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCB7MX0uDQotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBNMDAxMUU6IFx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgWE1MIFx1MDQzMVx1MDQ0Ylx1MDQzYiBcdTA0NGRcdTA0M2FcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2QgXHUwNDMyIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0Ylx1MDQzNFx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQzOSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggezB9LiBcdTA0MWRcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzhcdTA0M2NcdTA0M2UgXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQ0YiBcdTA0NDEgXHUwNDNmXHUwNDNlXHUwNDNjXHUwNDNlXHUwNDQ5XHUwNDRjXHUwNDRlIFx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQzOSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzggezB9Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUE0wMDEyRTogXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYiBYTUwgXHUwNDMxXHUwNDRiXHUwNDNiIFx1MDQ0ZFx1MDQzYVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZCBcdTA0MzIgXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDM5IFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCAoezB9KSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzAgezF9LiBcdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDM4XHUwNDNjXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0MzAgXHUwNDNkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDNjXHUwNDNlIFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyB7MX0uIA0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQTTAwMTNFOiBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiIFhNTC4gXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQzOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Mlx1MDQzMCBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDMwIFx1MDQzZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzY1x1MDQzZSBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgezB9LiANCi0NCi1pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfbm90X2hhbmRsZWQ9XHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzZFx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0MzBcdTA0M2Q6IHswfS4NCi1pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfd2l0aG91dF9pZD1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDMxXHUwNDM1XHUwNDM3IFx1MDQxOFx1MDQxNDogezB9DQotaW1wb3J0WE1MU2VydmljZV9pbXBvcnRfZmFpbGVkPVx1MDQxOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBcdTA0M2RcdTA0MzUgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkOiB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX21pc3NpbmdfcGx1Z2luPVx1MDQxZVx1MDQ0Mlx1MDQ0MVx1MDQ0M1x1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQzNVx1MDQ0MiBcdTA0M2VcdTA0MzFcdTA0NGZcdTA0MzdcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRjIHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfZXJyb3JfbWlzc2luZ19wbHVnaW5zPVx1MDQxZVx1MDQ0Mlx1MDQ0MVx1MDQ0M1x1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQ0ZVx1MDQ0MiBcdTA0M2VcdTA0MzFcdTA0NGZcdTA0MzdcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM4LiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzMiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDJcdTA0M2VcdTA0M2FcdTA0M2VcdTA0M2JcdTA0MzUuDQotDQotbGlicmFyeV9lcnJvcl9ub19lY2xhc3M9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzggQ29udGVudENhdGVnb3J5OiBcdTA0M2RcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0M1x1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0YyBFQ2xhc3MgXHUwNDM0XHUwNDNiXHUwNDRmIHswfQ0KLWxpYnJhcnlfbm9fcGFja2FnZT1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzZFx1MDQzMFx1MDQzOVx1MDQ0Mlx1MDQzOCBcdTA0MzJcdTA0M2JcdTA0MzBcdTA0MzRcdTA0MzVcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzkgXHUwNDNmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2VcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDJcdTA0MzAgezB9DQotbGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudD1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzOCBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzA6IHswfQ0KLWxpYnJhcnlfb2JqZWN0X3N0cmluZz1cdTA0M2VcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDIgezB9LCBcdTA0M2FcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2JcdTA0MzVcdTA0M2FcdTA0NDIgezF9DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzI9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDMwXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDMxXHUwNDQzXHUwNDQyXHUwNDMwOiBcdTA0M2RcdTA0MzVcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQ0M1x1MDQ0OVx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzOCBcdTA0MzBcdTA0NDJcdTA0NDBcdTA0MzhcdTA0MzFcdTA0NDNcdTA0NDJcdTA0MzAgezB9DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzggXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM4IFx1MDQzMFx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQzMVx1MDQ0M1x1MDQ0Mlx1MDQzMDogXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyIHswfSwgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDRjIHsxfSwgXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IHsyfQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8zPVx1MDQxZFx1MDQzNSBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0M2QgXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQxXHUwNDNlXHUwNDMxIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzBcdTA0NDJcdTA0NDBcdTA0MzhcdTA0MzFcdTA0NDNcdTA0NDJcdTA0MzA6IFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0MiB7MH0sIFx1MDQ0MVx1MDQ0M1x1MDQ0OVx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0YyB7MX0sIFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSB7Mn0NCi1saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4IFx1MDQzZFx1MDQzMCBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NGMgezB9OiBcdTA0M2RcdTA0MzVcdTA0NDIgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwIFx1MDQ0MSBcdTA0MThcdTA0MTQgezF9DQotbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlXzI9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4OiBcdTA0M2VcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDIgezB9LCBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NGMgezF9LCBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgezJ9DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMmEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMmEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzJhODA4MC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMmEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRkOWNlZDEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgWE1MIEltcG9ydCAoTkwyYSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMmEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGU2ODIzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kYS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYTQzZGNkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIHBsdWdpbiB0aWwgaW1wb3J0IGFmIFhNTA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgSW1wb3J0IFhNTCBXaXphcmQNCi1pbXBvcnRYTUxXaXphcmROYW1lPVhNTA0KLWltcG9ydFhNTFdpemFyZERlc2NyaXB0aW9uPUltcG9ydFx1MDBlOXIgbWV0b2RlYmlibGlvdGVrc2luZGhvbGQgaSBlbiBYTUwtZmlsLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZTY5YWNhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOg0KLSMNCi0NCi0jIEltcG9ydCBYTUwgV2l6YXJkDQotaW1wb3J0WE1MV2l6YXJkX3RpdGxlPUltcG9ydFx1MDBlOXIgWE1MDQotDQotIyBTZWxlY3QgSW1wb3J0IFhNTCBGaWxlIFdpemFyZCBQYWdlDQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9QW5naXYgaW1wb3J0ZmlsDQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1BbmdpdiBkZW4gWE1MLWZpbCwgc29tIGluZGVob2xkZXIgZGV0IG1ldG9kZWJpYmxpb3Rla3NpbmRob2xkLCBkdSB2aWwgaW1wb3J0ZXJlLCBvZyB2XHUwMGU2bGcgZGVuIHJlbGV2YW50ZSBpbXBvcnRmdW5rdGlvbiwgZGVyIHNrYWwgdWRmXHUwMGY4cmVzLg0KLWZpbGVMYWJlbF90ZXh0PVhNTC1maWw6DQotYnJvd3NlQnV0dG9uX3RleHQ9R2VubmVtc2UuLi4NCi1vcHRpb25Hcm91cF90ZXh0PUltcG9ydHZhbGcNCi1vdmVyd3JpdGVSYWRpb0J1dHRvbl90ZXh0PVRpbHNpZGVzXHUwMGU2dCBla3Npc3RlcmVuZGUgbWV0b2RlYmlibGlvdGVrc2luZGhvbGQgbWVkIGltcG9ydGVyZXQgaW5kaG9sZA0KLW1lcmdlUmFkaW9CdXR0b25fdGV4dD1GbGV0IGltcG9ydGVyZXQgaW5kaG9sZCBpbmQgaSBla3Npc3RlcmVuZGUgbWV0b2RlYmlibGlvdGVrDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWltcG9ydGluZ1hNTF90ZXh0PUltcG9ydGVyZXIgWE1MLWJpYmxpb3Rla3NpbmRob2xkIHRpbCBkZXQgYWt0dWVsbGUgbWV0b2RlYmlibGlvdGVrLi4uDQotDQotIyBJbXBvcnQgWE1MIEVycm9yIERpYWxvZw0KLXJldmlld19sb2dfZmlsZXM9SW1wb3J0ZW4gZXIgdWRmXHUwMGY4cnQuIEdlbm5lbXNlIGxvZ2ZpbGVybmUgaSBcbmZvbGRlcmVuICcnezB9JycgZm9yIGF0IGZpbmRlIGV2ZW50dWVsbGUgZmVqbC4NCi1pbXBvcnRYTUxFcnJvcl9tc2c9SVVQTTAwMDBFOiBJbXBvcnRlbiBrYW4gaWtrZSBmb3J0c1x1MDBlNnR0ZS4NCi1pbXBvcnRYTUxFcnJvcl9yZWFzb249SVVQTTAwMDlFOiBEZXQgYWt0dWVsbGUgbWV0b2RlYmlibGlvdGVrIGVyIHNrcml2ZWJlc2t5dHRldC5cblxuS29udHJvbGxcdTAwZTlyLCBhdCAnJ3swfScnIGthbiByZWRpZ2VyZXMsIGVsbGVyIG9wcmV0IGV0IG55dCBtZXRvZGViaWJsaW90ZWssIG9nIHByXHUwMGY4diBpZ2VuLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1pbnZhbGlkWE1MRmlsZV9lcnJvcj1EZW4gYW5naXZuZSBYTUwtZmlsIGVyIGlra2UgZ3lsZGlnLg0KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUE0wMDEwRTogRGVuIGFuZ2l2bmUgWE1MLWZpbCBlciBla3Nwb3J0ZXJldCBtZWQgZW4gdGlkbGlnZXJlIHZlcnNpb24gKHswfSkgYWYgezF9LiBGaWxlcm5lIHNrYWwgZWtzcG9ydGVyZXMgbWVkIGRlbiBha3R1ZWxsZSB2ZXJzaW9uIGFmIHsxfS4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duPUlVUE0wMDExRTogRGVuIGFuZ2l2bmUgWE1MLWZpbCBlciBla3Nwb3J0ZXJldCBtZWQgZW4gdGlkbGlnZXJlIHZlcnNpb24gYWYgezB9LiBGaWxlcm5lIHNrYWwgZWtzcG9ydGVyZXMgbWVkIGRlbiBha3R1ZWxsZSB2ZXJzaW9uIGFmIHswfS4NCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1JVVBNMDAxMkU6IERlbiBhbmdpdm5lIFhNTC1maWwgZXIgZWtzcG9ydGVyZXQgbWVkIGVuIG55ZXJlIHZlcnNpb24gKHswfSkgYWYgezF9LiBEdSBza2FsIG9wZ3JhZGVyZSB7MX0gZm9yIGF0IGt1bm5lIGltcG9ydGVyZSBmaWxlbi4gDQotdmVyc2lvbk1pc21hdGNoX29sZFRvb2xfdW5rbm93bj1JVVBNMDAxM0U6IERlbiBhbmdpdm5lIFhNTC1maWwga2FuIGlra2UgXHUwMGU1Ym5lcy4gRHUgc2thbCBvcGdyYWRlcmUgezB9IGZvciBhdCBrdW5uZSBpbXBvcnRlcmUgZmlsZW4uIA0KLQ0KLWltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF9ub3RfaGFuZGxlZD1FbGVtZW50IGlra2UgaFx1MDBlNW5kdGVyZXQ6IHswfQ0KLWltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF93aXRob3V0X2lkPUVsZW1lbnQgdWRlbiBpZDogezB9DQotaW1wb3J0WE1MU2VydmljZV9pbXBvcnRfZmFpbGVkPUltcG9ydCBlciBpa2tlIHVkZlx1MDBmOHJ0OiB7MH0NCi1pbXBvcnRYTUxTZXJ2aWNlX21pc3NpbmdfcGx1Z2luPU1hbmdsZXIgcFx1MDBlNWtyXHUwMGU2dmV0IHBsdWdpbjogezB9DQotaW1wb3J0WE1MU2VydmljZV9lcnJvcl9taXNzaW5nX3BsdWdpbnM9TWFuZ2xlciBlbiBlbGxlciBmbGVyZSBwXHUwMGU1a3JcdTAwZTZ2ZWRlIHBsdWdpbnMuIERlciBlciBmbGVyZSBvcGx5c25pbmdlciBpIGxvZ2ZpbGVuLg0KLQ0KLWxpYnJhcnlfZXJyb3Jfbm9fZWNsYXNzPUZlamwgdW5kZXIgb3ByZXR0ZWxzZSBhZiBpbmRob2xkc2thdGVnb3JpLiBLYW4gaWtrZSBoZW50ZSBFQ2xhc3MgZm9yIHswfQ0KLWxpYnJhcnlfbm9fcGFja2FnZT1LYW4gaWtrZSBmaW5kZSBlamVycGFra2UgZm9yIG9iamVrdGV0IHswfQ0KLWxpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9RmVqbCB1bmRlciBvcHJldHRlbHNlIGFmIGVsZW1lbnQ6IHswfQ0KLWxpYnJhcnlfb2JqZWN0X3N0cmluZz1vYmpla3QgezB9LCBmdW5rdGlvbiB7MX0NCi1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMj1GZWpsIHVuZGVyIGFuZ2l2ZWxzZSBhZiBhdHRyaWJ1dDogVWd5bGRpZyBhdHRyaWJ1dGZ1bmt0aW9uc3ZcdTAwZTZyZGk6IHswfQ0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZT1GZWpsIHVuZGVyIGFuZ2l2ZWxzZSBhZiBhdHRyaWJ1dCBmb3Igb2JqZWt0IHswfSwgZnVua3Rpb24gezF9IG9nIHZcdTAwZTZyZGkgezJ9DQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzM9VmVkIGlra2UsIGh2b3JkYW4gYXR0cmlidXQgZm9yIG9iamVrdCB7MH0sIGZ1bmt0aW9uIHsxfSBvZyB2XHUwMGU2cmRpIHsyfSBza2FsIGFuZ2l2ZXMNCi1saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U9RmVqbCB1bmRlciBhbmdpdmVsc2UgYWYgcmVmZXJlbmNlIGZvciBmdW5rdGlvbiB7MH06IEluZ2VuIGVsZW1lbnQgbWVkIGlkJydlbiB7MX0NCi1saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2VfMj1GZWpsIHVuZGVyIGFuZ2l2ZWxzZSBhZiByZWZlcmVuY2UgZm9yIG9iamVrdCB7MH0sIGZ1bmt0aW9uIHsxfSBvZyB2XHUwMGU2cmRpIHsyfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTk5ZTE5Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYzI0ZmNiLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBMaWJyYXJ5IEVkaXQgKE5MMSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlN2IwMTIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZXMucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2ZyLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9qYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9DTi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RlLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9pdC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9wbHVnaW5fZGUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdkYTkzMWQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9wbHVnaW5fZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gQmlibGlvdGhlayBiZWFyYmVpdGVuDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotX1VJX0NvbnRlbnRfZ3JvdXA9TWV0aG9kZW5pbmhhbHQNCi0NCi1fVUlfRGlzY2lwbGluZXNfZ3JvdXA9RGlzemlwbGluZW4NCi1fVUlfRG9tYWluc19ncm91cD1Eb21cdTAwZTRuZW4NCi1fVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cD1BcnRlbiB2b24gQXJiZWl0c2VyZ2Vibmlzc2VuDQotX1VJX1JvbGVfU2V0c19ncm91cD1Sb2xsZW5ncnVwcGVuDQotX1VJX1Rvb2xzX2dyb3VwPVRvb2xzDQotX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXA9U3RhbmRhcmRrYXRlZ29yaWVuDQotX1VJX0N1c3RvbV9DYXRlZ29yaWVzX2dyb3VwPUFuZ2VwYXNzdGUgS2F0ZWdvcmllbg0KLV9VSV9NZXRob2RDb250ZW50X2dyb3VwPUluaGFsdHNwYWtldGUNCi0NCi1fVUlfUHJvY2Vzc2VzX2dyb3VwPVByb3plc3NlDQotX1VJX1BsYW5uaW5nVGVtcGxhdGVzX2dyb3VwPVBsYW51bmdzdm9ybGFnZW4NCi0NCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5zX3RleHQ9UHJvemVzc211c3Rlcg0KLV9VSV9EZWxpdmVyeVByb2Nlc3Nlc190ZXh0PUJlcmVpdHN0ZWxsdW5nc3Byb3plc3NlDQotX1VJX1Byb2Nlc3NDb250cmlidXRpb25zX3RleHQ9VW50ZXJzY2hpZWRsaWNoZSBQcm96ZXNzZQ0KLV9VSV9QbGFubmluZ1RlbXBsYXRlc190ZXh0PVBsYW51bmdzdm9ybGFnZW4NCi0NCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1Qcm96ZXNzbXVzdGVyDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0PUJlcmVpdHN0ZWxsdW5nc3Byb3plc3MNCi1fVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0PVVudGVyc2NoaWVkbGljaGVyIFByb3plc3MNCi0NCi1fVUlfQ29uZmlndXJhdGlvbnNfdGV4dD1Lb25maWd1cmF0aW9uZW4NCi0NCi1fVUlfUHJvY2Vzc0ZhbWlsaWVzX3RleHQ9UHJvemVzc2ZhbWlsaWVuDQotDQotX1VJX1VuY2F0ZWdvcml6ZWRfdGV4dD1OaWNodCBrYXRlZ29yaXNpZXJ0DQotX1VJX1VuY2F0ZWdvcml6ZWRfVGFza3NfdGV4dD1OaWNodCBrYXRlZ29yaXNpZXJ0ZSBBdWZnYWJlbg0KLV9VSV9VbmNhdGVnb3JpemVkX1JvbGVzX3RleHQ9TmljaHQga2F0ZWdvcmlzaWVydGUgUm9sbGVuDQotDQotX1VJX0d1aWRhbmNlc19ncm91cD1BbmxlaXR1bmcNCi1fVUlfR3VpZGFuY2VzX0NoZWNrbGlzdHM9UHJcdTAwZmNmbGlzdGVuDQotX1VJX0d1aWRhbmNlc19Db25jZXB0cz1Lb256ZXB0ZQ0KLV9VSV9HdWlkYW5jZXNfRXhhbXBsZXM9QmVpc3BpZWxlDQotX1VJX0d1aWRhbmNlc19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM9SGlud2Vpc2UgenVtIFNjaFx1MDBlNHR6ZW4NCi1fVUlfR3VpZGFuY2VzX1ByYWN0aWNlcz1WZXJmYWhyZW4NCi1fVUlfR3VpZGFuY2VzX1JlcG9ydHM9QmVyaWNodGUNCi1fVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzPVdpZWRlcnZlcndlbmRiYXJlIEFzc2V0cw0KLV9VSV9HdWlkYW5jZXNfUm9hZG1hcD1Sb2FkbWFwDQotX1VJX0d1aWRhbmNlc19TdXBwb3J0aW5nTWF0ZXJpYWxzPVVudGVyc3RcdTAwZmN0emVuZGVzIE1hdGVyaWFsDQotX1VJX0d1aWRhbmNlc19UZWNobmlxdWVzPVRlY2huaWtlbg0KLV9VSV9HdWlkYW5jZXNfVGVtcGxhdGVzPVZvcmxhZ2VuDQotX1VJX0d1aWRhbmNlc19UZXJtRGVmaW5pdGlvbnM9QmVncmlmZnNkZWZpbml0aW9uZW4NCi1fVUlfR3VpZGFuY2VzX1Rvb2xNZW50b3JzPVRvb2xtZW50b3Jlbg0KLV9VSV9HdWlkYW5jZXNfV2hpdGVwYXBlcnM9V2hpdGUgUGFwZXINCi1fVUlfR3VpZGFuY2VzX1dvcmtQcm9kdWN0R3VpZGVsaW5lcz1SaWNodGxpbmllbg0KLQ0KLQ0KLV9VSV9Sb2xlc19ncm91cD1Sb2xsZW4NCi1fVUlfVGFza3NfZ3JvdXA9QXVmZ2FiZW4NCi1fVUlfV29ya1Byb2R1Y3RzX2dyb3VwPUFyYmVpdHNlcmdlYm5pc3NlDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9wbHVnaW5fZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI5NDljYWQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RWRpY2lcdTAwZjNuIGRlIGJpYmxpb3RlY2EgZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotX1VJX0NvbnRlbnRfZ3JvdXA9Q29udGVuaWRvIGRlbCBtXHUwMGU5dG9kbw0KLQ0KLV9VSV9EaXNjaXBsaW5lc19ncm91cD1EaXNjaXBsaW5hcw0KLV9VSV9Eb21haW5zX2dyb3VwPURvbWluaW9zDQotX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXA9Q2xhc2VzIGRlIHByb2R1Y3RvIGRlIHRyYWJham8NCi1fVUlfUm9sZV9TZXRzX2dyb3VwPUNvbmp1bnRvcyBkZSByb2xlcw0KLV9VSV9Ub29sc19ncm91cD1IZXJyYW1pZW50YXMNCi1fVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cD1DYXRlZ29yXHUwMGVkYXMgZXN0XHUwMGUxbmRhcg0KLV9VSV9DdXN0b21fQ2F0ZWdvcmllc19ncm91cD1DYXRlZ29yXHUwMGVkYXMgcGVyc29uYWxpemFkYXMNCi1fVUlfTWV0aG9kQ29udGVudF9ncm91cD1QYXF1ZXRlcyBkZSBjb250ZW5pZG8NCi0NCi1fVUlfUHJvY2Vzc2VzX2dyb3VwPVByb2Nlc29zDQotX1VJX1BsYW5uaW5nVGVtcGxhdGVzX2dyb3VwPVBsYW50aWxsYXMgZGUgcGxhbmlmaWNhY2lcdTAwZjNuDQotDQotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuc190ZXh0PVBhdHJvbmVzIGRlIHBvc2liaWxpZGFkDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQ9UHJvY2Vzb3MgZGUgZW50cmVnYQ0KLV9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uc190ZXh0PVByb2Nlc29zIGRpZmVyZW5jaWFsZXMNCi1fVUlfUGxhbm5pbmdUZW1wbGF0ZXNfdGV4dD1QbGFudGlsbGFzIGRlIHBsYW5pZmljYWNpXHUwMGYzbg0KLQ0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0PVBhdHJcdTAwZjNuIGRlIHBvc2liaWxpZGFkDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0PVByb2Nlc28gZGUgZW50cmVnYQ0KLV9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uX3RleHQ9UHJvY2VzbyBkaWZlcmVuY2lhbA0KLQ0KLV9VSV9Db25maWd1cmF0aW9uc190ZXh0PUNvbmZpZ3VyYWNpb25lcw0KLQ0KLV9VSV9Qcm9jZXNzRmFtaWxpZXNfdGV4dD1GYW1pbGlhcyBkZWwgcHJvY2Vzbw0KLQ0KLV9VSV9VbmNhdGVnb3JpemVkX3RleHQ9U2luIGNhdGVnb3JpemFyDQotX1VJX1VuY2F0ZWdvcml6ZWRfVGFza3NfdGV4dD1UYXJlYXMgc2luIGNhdGVnb3JpemFyDQotX1VJX1VuY2F0ZWdvcml6ZWRfUm9sZXNfdGV4dD1Sb2xlcyBzaW4gY2F0ZWdvcml6YXINCi0NCi1fVUlfR3VpZGFuY2VzX2dyb3VwPUd1XHUwMGVkYQ0KLV9VSV9HdWlkYW5jZXNfQ2hlY2tsaXN0cz1MaXN0YXMgZGUgY29tcHJvYmFjaVx1MDBmM24NCi1fVUlfR3VpZGFuY2VzX0NvbmNlcHRzPUNvbmNlcHRvcw0KLV9VSV9HdWlkYW5jZXNfRXhhbXBsZXM9RWplbXBsb3MNCi1fVUlfR3VpZGFuY2VzX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucz1Db25zaWRlcmFjaW9uZXMgc29icmUgZWwgY1x1MDBlMWxjdWxvDQotX1VJX0d1aWRhbmNlc19QcmFjdGljZXM9UHJcdTAwZTFjdGljYXMNCi1fVUlfR3VpZGFuY2VzX1JlcG9ydHM9SW5mb3JtZXMNCi1fVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzPUFjdGl2b3MgcmV1dGlsaXphYmxlcw0KLV9VSV9HdWlkYW5jZXNfUm9hZG1hcD1NYXBhDQotX1VJX0d1aWRhbmNlc19TdXBwb3J0aW5nTWF0ZXJpYWxzPU1hdGVyaWFsZXMgZGUgc29wb3J0ZQ0KLV9VSV9HdWlkYW5jZXNfVGVjaG5pcXVlcz1UXHUwMGU5Y25pY2FzDQotX1VJX0d1aWRhbmNlc19UZW1wbGF0ZXM9UGxhbnRpbGxhcw0KLV9VSV9HdWlkYW5jZXNfVGVybURlZmluaXRpb25zPURlZmluaWNpb25lcyBkZWwgdFx1MDBlOXJtaW5vDQotX1VJX0d1aWRhbmNlc19Ub29sTWVudG9ycz1HdVx1MDBlZGFzIGRlIGxhIGhlcnJhbWllbnRhDQotX1VJX0d1aWRhbmNlc19XaGl0ZXBhcGVycz1Eb2N1bWVudGFjaVx1MDBmM24NCi1fVUlfR3VpZGFuY2VzX1dvcmtQcm9kdWN0R3VpZGVsaW5lcz1EaXJlY3RyaWNlcw0KLQ0KLQ0KLV9VSV9Sb2xlc19ncm91cD1Sb2xlcw0KLV9VSV9UYXNrc19ncm91cD1UYXJlYXMNCi1fVUlfV29ya1Byb2R1Y3RzX2dyb3VwPVByb2R1Y3RvcyBkZSB0cmFiYWpvDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9wbHVnaW5fZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZhZWVkNTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9wbHVnaW5fZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9TW9kaWZpY2F0aW9uIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLV9VSV9Db250ZW50X2dyb3VwPUNvbnRlbnUgZGUgbGEgbVx1MDBlOXRob2RlDQotDQotX1VJX0Rpc2NpcGxpbmVzX2dyb3VwPURpc2NpcGxpbmVzDQotX1VJX0RvbWFpbnNfZ3JvdXA9RG9tYWluZXMNCi1fVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cD1UeXBlcyBkZSBwcm9kdWl0cw0KLV9VSV9Sb2xlX1NldHNfZ3JvdXA9RW5zZW1ibGVzIGRlIHJcdTAwZjRsZXMNCi1fVUlfVG9vbHNfZ3JvdXA9T3V0aWxzDQotX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXA9Q2F0XHUwMGU5Z29yaWVzIHN0YW5kYXJkDQotX1VJX0N1c3RvbV9DYXRlZ29yaWVzX2dyb3VwPUNhdFx1MDBlOWdvcmllcyBwZXJzb25uYWxpc1x1MDBlOWVzDQotX1VJX01ldGhvZENvbnRlbnRfZ3JvdXA9UGFja2FnZXMgZGUgY29udGVudQ0KLQ0KLV9VSV9Qcm9jZXNzZXNfZ3JvdXA9UHJvY2Vzc3VzDQotX1VJX1BsYW5uaW5nVGVtcGxhdGVzX2dyb3VwPUNhbmV2YXMgZGUgcGxhbmlmaWNhdGlvbg0KLQ0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybnNfdGV4dD1QYXR0ZXJucyBkZSBjYXBhY2l0XHUwMGU5DQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQ9UHJvY2Vzc3VzIGRlIGxpdnJhaXNvbg0KLV9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uc190ZXh0PVByb2Nlc3N1cyBkaWZmXHUwMGU5cmVudGllbHMNCi1fVUlfUGxhbm5pbmdUZW1wbGF0ZXNfdGV4dD1DYW5ldmFzIGRlIHBsYW5pZmljYXRpb24NCi0NCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1QYXR0ZXJuIGRlIGNhcGFjaXRcdTAwZTkNCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3RleHQ9UHJvY2Vzc3VzIGRlIGxpdnJhaXNvbg0KLV9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uX3RleHQ9UHJvY2Vzc3VzIGRpZmZcdTAwZTlyZW50aWVsDQotDQotX1VJX0NvbmZpZ3VyYXRpb25zX3RleHQ9Q29uZmlndXJhdGlvbnMNCi0NCi1fVUlfUHJvY2Vzc0ZhbWlsaWVzX3RleHQ9RmFtaWxsZXMgZGUgcHJvY2Vzc3VzDQotDQotX1VJX1VuY2F0ZWdvcml6ZWRfdGV4dD1Ob24gYWZmZWN0XHUwMGU5IFx1MDBlMCB1bmUgY2F0XHUwMGU5Z29yaWUNCi1fVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0PVRcdTAwZTJjaGVzIG5vbiBhZmZlY3RcdTAwZTllcyBcdTAwZTAgdW5lIGNhdFx1MDBlOWdvcmllDQotX1VJX1VuY2F0ZWdvcml6ZWRfUm9sZXNfdGV4dD1SXHUwMGY0bGVzIG5vbiBhZmZlY3RcdTAwZTlzIFx1MDBlMCB1bmUgY2F0XHUwMGU5Z29yaWUNCi0NCi1fVUlfR3VpZGFuY2VzX2dyb3VwPUNvbnNlaWwNCi1fVUlfR3VpZGFuY2VzX0NoZWNrbGlzdHM9TGlzdGVzIGRlIGNvbnRyXHUwMGY0bGUNCi1fVUlfR3VpZGFuY2VzX0NvbmNlcHRzPUNvbmNlcHRzDQotX1VJX0d1aWRhbmNlc19FeGFtcGxlcz1FeGVtcGxlcw0KLV9VSV9HdWlkYW5jZXNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPUNvbnNpZFx1MDBlOXJhdGlvbnMgcmVsYXRpdmVzIFx1MDBlMCBsJ2VzdGltYXRpb24NCi1fVUlfR3VpZGFuY2VzX1ByYWN0aWNlcz1QcmF0aXF1ZXMNCi1fVUlfR3VpZGFuY2VzX1JlcG9ydHM9UmFwcG9ydHMNCi1fVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzPVJlc3NvdXJjZXMgclx1MDBlOXV0aWxpc2FibGVzDQotX1VJX0d1aWRhbmNlc19Sb2FkbWFwPUZldWlsbGUgZGUgcm91dGUNCi1fVUlfR3VpZGFuY2VzX1N1cHBvcnRpbmdNYXRlcmlhbHM9RG9jdW1lbnRzIGQnYWNjb21wYWduZW1lbnQNCi1fVUlfR3VpZGFuY2VzX1RlY2huaXF1ZXM9VGVjaG5pcXVlcw0KLV9VSV9HdWlkYW5jZXNfVGVtcGxhdGVzPUNhbmV2YXMNCi1fVUlfR3VpZGFuY2VzX1Rlcm1EZWZpbml0aW9ucz1EXHUwMGU5ZmluaXRpb25zIGRlIHRlcm1lcw0KLV9VSV9HdWlkYW5jZXNfVG9vbE1lbnRvcnM9R3VpZGVzIGQndXRpbGlzYXRpb24gZGUgbCdvdXRpbA0KLV9VSV9HdWlkYW5jZXNfV2hpdGVwYXBlcnM9TGl2cmVzIGJsYW5jcw0KLV9VSV9HdWlkYW5jZXNfV29ya1Byb2R1Y3RHdWlkZWxpbmVzPUluc3RydWN0aW9ucw0KLQ0KLQ0KLV9VSV9Sb2xlc19ncm91cD1SXHUwMGY0bGVzDQotX1VJX1Rhc2tzX2dyb3VwPVRcdTAwZTJjaGVzDQotX1VJX1dvcmtQcm9kdWN0c19ncm91cD1Qcm9kdWl0cw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYjk2ZTljLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPU1vZGlmaWNhIGxpYnJlcmlhIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLV9VSV9Db250ZW50X2dyb3VwPUNvbnRlbnV0byBkaSBtZXRvZG8NCi0NCi1fVUlfRGlzY2lwbGluZXNfZ3JvdXA9RGlzY2lwbGluZQ0KLV9VSV9Eb21haW5zX2dyb3VwPURvbWluaQ0KLV9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwPVRpcGkgZGkgcHJvZG90dG8gZGkgbGF2b3JvDQotX1VJX1JvbGVfU2V0c19ncm91cD1JbnNpZW1pIGRpIHJ1b2xpDQotX1VJX1Rvb2xzX2dyb3VwPVRvb2wNCi1fVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cD1DYXRlZ29yaWUgc3RhbmRhcmQNCi1fVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXA9Q2F0ZWdvcmllIHBlcnNvbmFsaXp6YXRlDQotX1VJX01ldGhvZENvbnRlbnRfZ3JvdXA9UGFjY2hldHRpIGRlbCBjb250ZW51dG8NCi0NCi1fVUlfUHJvY2Vzc2VzX2dyb3VwPVByb2Nlc3NpDQotX1VJX1BsYW5uaW5nVGVtcGxhdGVzX2dyb3VwPVBpYW5pZmljYXppb25lIGRlaSBtb2RlbGxpDQotDQotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuc190ZXh0PU1vZGVsbGkgZGkgY2FwYWNpdFx1MDBlMA0KLV9VSV9EZWxpdmVyeVByb2Nlc3Nlc190ZXh0PVByb2Nlc3NpIGRpIHByb2R1emlvbmUNCi1fVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbnNfdGV4dD1Qcm9jZXNzaSBkaWZmZXJlbnppYWxpDQotX1VJX1BsYW5uaW5nVGVtcGxhdGVzX3RleHQ9UGlhbmlmaWNhemlvbmUgZGVpIG1vZGVsbGkNCi0NCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1Nb2RlbGxvIGRpIGNhcGFjaXRcdTAwZTANCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3RleHQ9UHJvY2Vzc28gZGkgcHJvZHV6aW9uZQ0KLV9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uX3RleHQ9UHJvY2Vzc28gZGlmZmVyZW56aWFsZQ0KLQ0KLV9VSV9Db25maWd1cmF0aW9uc190ZXh0PUNvbmZpZ3VyYXppb25pDQotDQotX1VJX1Byb2Nlc3NGYW1pbGllc190ZXh0PUZhbWlnbGllIHByb2Nlc3NpDQotDQotX1VJX1VuY2F0ZWdvcml6ZWRfdGV4dD1TZW56YSBjYXRlZ29yaWENCi1fVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0PU9wZXJhemlvbmkgc2VuemEgY2F0ZWdvcmlhDQotX1VJX1VuY2F0ZWdvcml6ZWRfUm9sZXNfdGV4dD1SdW9saSBzZW56YSBjYXRlZ29yaWENCi0NCi1fVUlfR3VpZGFuY2VzX2dyb3VwPUd1aWRhDQotX1VJX0d1aWRhbmNlc19DaGVja2xpc3RzPUVsZW5jaGkgZGkgY29udHJvbGxvDQotX1VJX0d1aWRhbmNlc19Db25jZXB0cz1Db25jZXR0aQ0KLV9VSV9HdWlkYW5jZXNfRXhhbXBsZXM9RXNlbXBpDQotX1VJX0d1aWRhbmNlc19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM9Q29uc2lkZXJhemlvbmkgc3VsbGEgdmFsdXRhemlvbmUNCi1fVUlfR3VpZGFuY2VzX1ByYWN0aWNlcz1QcmF0aWNoZQ0KLV9VSV9HdWlkYW5jZXNfUmVwb3J0cz1SZXBvcnQNCi1fVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzPVJpc29yc2Ugcml1dGlsaXp6YWJpbGkNCi1fVUlfR3VpZGFuY2VzX1JvYWRtYXA9Um9hZG1hcA0KLV9VSV9HdWlkYW5jZXNfU3VwcG9ydGluZ01hdGVyaWFscz1NYXRlcmlhbGUgZGkgc3VwcG9ydG8NCi1fVUlfR3VpZGFuY2VzX1RlY2huaXF1ZXM9VGVjbmljaGUNCi1fVUlfR3VpZGFuY2VzX1RlbXBsYXRlcz1Nb2RlbGxpDQotX1VJX0d1aWRhbmNlc19UZXJtRGVmaW5pdGlvbnM9RGVmaW5pemlvbmkgdGVybWluaQ0KLV9VSV9HdWlkYW5jZXNfVG9vbE1lbnRvcnM9R3VpZGEgYWwgdG9vbA0KLV9VSV9HdWlkYW5jZXNfV2hpdGVwYXBlcnM9V2hpdGVwYXBlcg0KLV9VSV9HdWlkYW5jZXNfV29ya1Byb2R1Y3RHdWlkZWxpbmVzPUxpbmVlIGd1aWRhDQotDQotDQotX1VJX1JvbGVzX2dyb3VwPVJ1b2xpDQotX1VJX1Rhc2tzX2dyb3VwPU9wZXJhemlvbmkNCi1fVUlfV29ya1Byb2R1Y3RzX2dyb3VwPVByb2RvdHRpIGRpIGxhdm9ybw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YTU4ZDVlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBMaWJyYXJ5IEVkaXQNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi1fVUlfQ29udGVudF9ncm91cD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQNCi0NCi1fVUlfRGlzY2lwbGluZXNfZ3JvdXA9XHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlDQotX1VJX0RvbWFpbnNfZ3JvdXA9XHUzMGM5XHUzMGUxXHUzMGE0XHUzMGYzDQotX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXA9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU5ODVlDQotX1VJX1JvbGVfU2V0c19ncm91cD1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzgNCi1fVUlfVG9vbHNfZ3JvdXA9XHUzMGM0XHUzMGZjXHUzMGViDQotX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXA9XHU2YTE5XHU2ZTk2XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjDQotX1VJX0N1c3RvbV9DYXRlZ29yaWVzX2dyb3VwPVx1MzBhYlx1MzBiOVx1MzBiZlx1MzBlMFx1MzBmYlx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmYw0KLV9VSV9NZXRob2RDb250ZW50X2dyb3VwPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzBmYlx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOA0KLQ0KLV9VSV9Qcm9jZXNzZXNfZ3JvdXA9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5DQotX1VJX1BsYW5uaW5nVGVtcGxhdGVzX2dyb3VwPVx1OGEwOFx1NzUzYlx1MzBjNlx1MzBmM1x1MzBkN1x1MzBlY1x1MzBmY1x1MzBjOA0KLQ0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybnNfdGV4dD1cdTMwYjFcdTMwZmNcdTMwZDFcdTMwZDNcdTMwZWFcdTMwYzZcdTMwYTNcdTMwZmNcdTMwZmJcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjMNCi1fVUlfRGVsaXZlcnlQcm9jZXNzZXNfdGV4dD1cdTMwYzdcdTMwZWFcdTMwZDBcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi1fVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbnNfdGV4dD1cdTVmYWVcdTUyMDZcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi1fVUlfUGxhbm5pbmdUZW1wbGF0ZXNfdGV4dD1cdThhMDhcdTc1M2JcdTMwYzZcdTMwZjNcdTMwZDdcdTMwZWNcdTMwZmNcdTMwYzgNCi0NCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1cdTMwYjFcdTMwZmNcdTMwZDFcdTMwZDNcdTMwZWFcdTMwYzZcdTMwYTNcdTMwZmNcdTMwZmJcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjMNCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3RleHQ9XHUzMGM3XHUzMGVhXHUzMGQwXHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5DQotX1VJX1Byb2Nlc3NDb250cmlidXRpb25fdGV4dD1cdTVmYWVcdTUyMDZcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi0NCi1fVUlfQ29uZmlndXJhdGlvbnNfdGV4dD1cdTY5Y2JcdTYyMTANCi0NCi1fVUlfUHJvY2Vzc0ZhbWlsaWVzX3RleHQ9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGRmXHUzMGVhXHUzMGZjDQotDQotX1VJX1VuY2F0ZWdvcml6ZWRfdGV4dD1cdTY3MmFcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmNcdTUzMTYNCi1fVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0PVx1NjcyYVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmY1x1NTMxNlx1MzBiZlx1MzBiOVx1MzBhZg0KLV9VSV9VbmNhdGVnb3JpemVkX1JvbGVzX3RleHQ9XHU2NzJhXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHU1MzE2XHUzMGVkXHUzMGZjXHUzMGViDQotDQotX1VJX0d1aWRhbmNlc19ncm91cD1cdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjkNCi1fVUlfR3VpZGFuY2VzX0NoZWNrbGlzdHM9XHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHUzMGVhXHUzMGI5XHUzMGM4DQotX1VJX0d1aWRhbmNlc19Db25jZXB0cz1cdTY5ODJcdTVmZjUNCi1fVUlfR3VpZGFuY2VzX0V4YW1wbGVzPVx1NGY4Yg0KLV9VSV9HdWlkYW5jZXNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPVx1ODk4Ylx1N2E0ZFx1MzA4Mlx1MzA4YVx1ODAwM1x1NjE2ZVx1NGU4Ylx1OTgwNQ0KLV9VSV9HdWlkYW5jZXNfUHJhY3RpY2VzPVx1MzBkN1x1MzBlOVx1MzBhZlx1MzBjNlx1MzBhM1x1MzBiOQ0KLV9VSV9HdWlkYW5jZXNfUmVwb3J0cz1cdTMwZWNcdTMwZGRcdTMwZmNcdTMwYzgNCi1fVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzPVx1NTE4ZFx1NTIyOVx1NzUyOFx1NTNlZlx1ODBmZFx1MzA2YVx1MzBhMlx1MzBiYlx1MzBjM1x1MzBjOA0KLV9VSV9HdWlkYW5jZXNfUm9hZG1hcD1cdTMwZWRcdTMwZmNcdTMwYzlcdTMwZGVcdTMwYzNcdTMwZDcNCi1fVUlfR3VpZGFuY2VzX1N1cHBvcnRpbmdNYXRlcmlhbHM9XHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHU4Y2M3XHU2NTk5DQotX1VJX0d1aWRhbmNlc19UZWNobmlxdWVzPVx1NjI4MFx1NmNkNQ0KLV9VSV9HdWlkYW5jZXNfVGVtcGxhdGVzPVx1MzBjNlx1MzBmM1x1MzBkN1x1MzBlY1x1MzBmY1x1MzBjOA0KLV9VSV9HdWlkYW5jZXNfVGVybURlZmluaXRpb25zPVx1NzUyOFx1OGE5ZVx1NWI5YVx1N2ZhOQ0KLV9VSV9HdWlkYW5jZXNfVG9vbE1lbnRvcnM9XHUzMGM0XHUzMGZjXHUzMGViXHUzMGZiXHUzMGUxXHUzMGYzXHUzMGJmXHUzMGZjDQotX1VJX0d1aWRhbmNlc19XaGl0ZXBhcGVycz1cdTMwZGJcdTMwZWZcdTMwYTRcdTMwYzhcdTMwZmJcdTMwZGFcdTMwZmNcdTMwZDFcdTMwZmMNCi1fVUlfR3VpZGFuY2VzX1dvcmtQcm9kdWN0R3VpZGVsaW5lcz1cdTMwYWNcdTMwYTRcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZjMNCi0NCi0NCi1fVUlfUm9sZXNfZ3JvdXA9XHUzMGVkXHUzMGZjXHUzMGViDQotX1VJX1Rhc2tzX2dyb3VwPVx1MzBiZlx1MzBiOVx1MzBhZg0KLV9VSV9Xb3JrUHJvZHVjdHNfZ3JvdXA9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIyYWMwNGMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWQzYjhcdWM5ZDENCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi1fVUlfQ29udGVudF9ncm91cD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVjZWU4XHVkMTUwXHVjZTIwDQotDQotX1VJX0Rpc2NpcGxpbmVzX2dyb3VwPVx1YzZkMFx1Y2U1OQ0KLV9VSV9Eb21haW5zX2dyb3VwPVx1YjNjNFx1YmE1NFx1Yzc3OA0KLV9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjNzIwXHVkNjE1DQotX1VJX1JvbGVfU2V0c19ncm91cD1cdWM1ZWRcdWQ1NjAgXHVjMTM4XHVkMmI4DQotX1VJX1Rvb2xzX2dyb3VwPVx1YjNjNFx1YWQ2Yw0KLV9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwPVx1ZDQ1Y1x1YzkwMCBcdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMNCi1fVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXA9XHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OCBcdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMNCi1fVUlfTWV0aG9kQ29udGVudF9ncm91cD1cdWNlZThcdWQxNTBcdWNlMjAgXHVkMzI4XHVkMGE0XHVjOWMwDQotDQotX1VJX1Byb2Nlc3Nlc19ncm91cD1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQNCi1fVUlfUGxhbm5pbmdUZW1wbGF0ZXNfZ3JvdXA9XHVhY2M0XHVkNjhkIFx1ZDE1Y1x1ZDUwY1x1YjlhY1x1ZDJiOA0KLQ0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybnNfdGV4dD1cdWFlMzBcdWIyYTUgXHVkMzI4XHVkMTM0DQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQ9XHVjODA0XHViMmVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNA0KLV9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uc190ZXh0PVx1Y2MyOFx1YjRmMSBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQNCi1fVUlfUGxhbm5pbmdUZW1wbGF0ZXNfdGV4dD1cdWFjYzRcdWQ2OGQgXHVkMTVjXHVkNTBjXHViOWFjXHVkMmI4DQotDQotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9XHVhZTMwXHViMmE1IFx1ZDMyOFx1ZDEzNA0KLV9VSV9EZWxpdmVyeVByb2Nlc3NfdGV4dD1cdWM4MDRcdWIyZWMgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0DQotX1VJX1Byb2Nlc3NDb250cmlidXRpb25fdGV4dD1cdWNjMjhcdWI0ZjEgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0DQotDQotX1VJX0NvbmZpZ3VyYXRpb25zX3RleHQ9XHVhZDZjXHVjMTMxDQotDQotX1VJX1Byb2Nlc3NGYW1pbGllc190ZXh0PVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWFjYzRcdWM1ZjQNCi0NCi1fVUlfVW5jYXRlZ29yaXplZF90ZXh0PVx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhY1x1ZDY1NFx1YjQxOFx1YzljMCBcdWM1NGFcdWM3NGMNCi1fVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0PVx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhY1x1ZDY1NFx1YjQxOFx1YzljMCBcdWM1NGFcdWM3NDAgXHVkMGMwXHVjMmE0XHVkMDZjDQotX1VJX1VuY2F0ZWdvcml6ZWRfUm9sZXNfdGV4dD1cdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWNcdWQ2NTRcdWI0MThcdWM5YzAgXHVjNTRhXHVjNzQwIFx1YzVlZFx1ZDU2MA0KLQ0KLV9VSV9HdWlkYW5jZXNfZ3JvdXA9XHVjNTQ4XHViMGI0DQotX1VJX0d1aWRhbmNlc19DaGVja2xpc3RzPVx1Y2NiNFx1ZDA2Y1x1YjlhY1x1YzJhNFx1ZDJiOA0KLV9VSV9HdWlkYW5jZXNfQ29uY2VwdHM9XHVhYzFjXHViMTUwDQotX1VJX0d1aWRhbmNlc19FeGFtcGxlcz1cdWM2MDhcdWM4MWMNCi1fVUlfR3VpZGFuY2VzX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucz1cdWM2MDhcdWMwYzEgXHVhY2UwXHViODI0XHVjMGFjXHVkNTZkDQotX1VJX0d1aWRhbmNlc19QcmFjdGljZXM9XHVjMGFjXHViODQwDQotX1VJX0d1aWRhbmNlc19SZXBvcnRzPVx1YmNmNFx1YWNlMFx1YzExYw0KLV9VSV9HdWlkYW5jZXNfUmV1c2FibGVBc3NldHM9XHVjN2FjXHVjMGFjXHVjNmE5XHVhYzAwXHViMmE1XHVkNTVjIFx1Yzc5MFx1YzBiMA0KLV9VSV9HdWlkYW5jZXNfUm9hZG1hcD1cdWI4NWNcdWI0ZGNcdWI5ZjUNCi1fVUlfR3VpZGFuY2VzX1N1cHBvcnRpbmdNYXRlcmlhbHM9XHVjOWMwXHVjNmQwIFx1Yzc5MFx1YjhjYw0KLV9VSV9HdWlkYW5jZXNfVGVjaG5pcXVlcz1cdWFlMzBcdWJjOTUNCi1fVUlfR3VpZGFuY2VzX1RlbXBsYXRlcz1cdWQxNWNcdWQ1MGNcdWI5YWNcdWQyYjgNCi1fVUlfR3VpZGFuY2VzX1Rlcm1EZWZpbml0aW9ucz1cdWM2YTlcdWM1YjQgXHVjODE1XHVjNzU4DQotX1VJX0d1aWRhbmNlc19Ub29sTWVudG9ycz1cdWIzYzRcdWFkNmMgXHVjMGFjXHVjNmE5IFx1YjNjNFx1YzZjMFx1YjlkMA0KLV9VSV9HdWlkYW5jZXNfV2hpdGVwYXBlcnM9XHViYzMxXHVjMTFjDQotX1VJX0d1aWRhbmNlc19Xb3JrUHJvZHVjdEd1aWRlbGluZXM9XHVhYzAwXHVjNzc0XHViNGRjXHViNzdjXHVjNzc4DQotDQotDQotX1VJX1JvbGVzX2dyb3VwPVx1YzVlZFx1ZDU2MA0KLV9VSV9UYXNrc19ncm91cD1cdWQwYzBcdWMyYTRcdWQwNmMNCi1fVUlfV29ya1Byb2R1Y3RzX2dyb3VwPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTU2NTA2ZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FZGlcdTAwZTdcdTAwZTNvIGRhIEJpYmxpb3RlY2EgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotX1VJX0NvbnRlbnRfZ3JvdXA9Q29udGVcdTAwZmFkbyBkbyBNXHUwMGU5dG9kbw0KLQ0KLV9VSV9EaXNjaXBsaW5lc19ncm91cD1EaXNjaXBsaW5hcw0KLV9VSV9Eb21haW5zX2dyb3VwPURvbVx1MDBlZG5pb3MNCi1fVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cD1UaXBvcyBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotX1VJX1JvbGVfU2V0c19ncm91cD1Db25qdW50b3MgZGUgRnVuXHUwMGU3XHUwMGY1ZXMNCi1fVUlfVG9vbHNfZ3JvdXA9RmVycmFtZW50YXMNCi1fVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cD1DYXRlZ29yaWFzIFBhZHJcdTAwZTNvDQotX1VJX0N1c3RvbV9DYXRlZ29yaWVzX2dyb3VwPUNhdGVnb3JpYXMgUGVyc29uYWxpemFkYXMNCi1fVUlfTWV0aG9kQ29udGVudF9ncm91cD1QYWNvdGVzIGRlIENvbnRlXHUwMGZhZG8NCi0NCi1fVUlfUHJvY2Vzc2VzX2dyb3VwPVByb2Nlc3Nvcw0KLV9VSV9QbGFubmluZ1RlbXBsYXRlc19ncm91cD1HYWJhcml0b3MgZGUgUGxhbmVqYW1lbnRvDQotDQotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuc190ZXh0PVBhZHJcdTAwZjVlcyBkZSBSZWN1cnNvDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQ9UHJvY2Vzc29zIGRlIEVudHJlZ2ENCi1fVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbnNfdGV4dD1Qcm9jZXNzb3MgRGlmZXJlbmNpYWlzDQotX1VJX1BsYW5uaW5nVGVtcGxhdGVzX3RleHQ9R2FiYXJpdG9zIGRlIFBsYW5lamFtZW50bw0KLQ0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0PVBhZHJcdTAwZTNvIGRlIFJlY3Vyc28NCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3RleHQ9UHJvY2Vzc28gZGUgRW50cmVnYQ0KLV9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uX3RleHQ9UHJvY2Vzc28gRGlmZXJlbmNpYWwNCi0NCi1fVUlfQ29uZmlndXJhdGlvbnNfdGV4dD1Db25maWd1cmFcdTAwZTdcdTAwZjVlcw0KLQ0KLV9VSV9Qcm9jZXNzRmFtaWxpZXNfdGV4dD0gICAgRmFtXHUwMGVkbGlhcyBkZSBQcm9jZXNzb3MNCi0NCi1fVUlfVW5jYXRlZ29yaXplZF90ZXh0PVNlbSBDYXRlZ29yaWENCi1fVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0PVRhcmVmYXMgc2VtIENhdGVnb3JpYQ0KLV9VSV9VbmNhdGVnb3JpemVkX1JvbGVzX3RleHQ9RnVuXHUwMGU3XHUwMGY1ZXMgc2VtIENhdGVnb3JpYQ0KLQ0KLV9VSV9HdWlkYW5jZXNfZ3JvdXA9T3JpZW50YVx1MDBlN1x1MDBlM28NCi1fVUlfR3VpZGFuY2VzX0NoZWNrbGlzdHM9TGlzdGFzIGRlIFZlcmlmaWNhXHUwMGU3XHUwMGUzbw0KLV9VSV9HdWlkYW5jZXNfQ29uY2VwdHM9Q29uY2VpdG9zDQotX1VJX0d1aWRhbmNlc19FeGFtcGxlcz1FeGVtcGxvcw0KLV9VSV9HdWlkYW5jZXNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPUNvbnNpZGVyYVx1MDBlN1x1MDBmNWVzIEVzdGltYXRpdmFzDQotX1VJX0d1aWRhbmNlc19QcmFjdGljZXM9UHJcdTAwZTF0aWNhcw0KLV9VSV9HdWlkYW5jZXNfUmVwb3J0cz1SZWxhdFx1MDBmM3Jpb3MNCi1fVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzPVJlY3Vyc29zIFJldXRpbGl6XHUwMGUxdmVpcw0KLV9VSV9HdWlkYW5jZXNfUm9hZG1hcD1Sb3RlaXJvDQotX1VJX0d1aWRhbmNlc19TdXBwb3J0aW5nTWF0ZXJpYWxzPU1hdGVyaWFpcyBkZSBTdXBvcnRlDQotX1VJX0d1aWRhbmNlc19UZWNobmlxdWVzPVRcdTAwZTljbmljYXMNCi1fVUlfR3VpZGFuY2VzX1RlbXBsYXRlcz1HYWJhcml0b3MNCi1fVUlfR3VpZGFuY2VzX1Rlcm1EZWZpbml0aW9ucz1EZWZpbmlcdTAwZTdcdTAwZjVlcyBkZSBUZXJtb3MNCi1fVUlfR3VpZGFuY2VzX1Rvb2xNZW50b3JzPU1lbnRvcmVzIGRlIEZlcnJhbWVudGFzDQotX1VJX0d1aWRhbmNlc19XaGl0ZXBhcGVycz1XaGl0ZSBwYXBlcnMNCi1fVUlfR3VpZGFuY2VzX1dvcmtQcm9kdWN0R3VpZGVsaW5lcz1EaXJldHJpemVzDQotDQotDQotX1VJX1JvbGVzX2dyb3VwPUZ1blx1MDBlN1x1MDBmNWVzDQotX1VJX1Rhc2tzX2dyb3VwPVRhcmVmYXMNCi1fVUlfV29ya1Byb2R1Y3RzX2dyb3VwPVByb2R1dG9zICAgICAgICAgICBkZSBUcmFiYWxobw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOWM5N2IxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdTVlOTNcdTdmMTZcdThmOTENCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi1fVUlfQ29udGVudF9ncm91cD1cdTY1YjlcdTZjZDVcdTUxODVcdTViYjkNCi0NCi1fVUlfRGlzY2lwbGluZXNfZ3JvdXA9XHU4OWM0XHU3YTBiDQotX1VJX0RvbWFpbnNfZ3JvdXA9XHU1N2RmDQotX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXA9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU3YzdiXHU1NzhiDQotX1VJX1JvbGVfU2V0c19ncm91cD1cdTg5ZDJcdTgyNzJcdTk2YzYNCi1fVUlfVG9vbHNfZ3JvdXA9XHU1ZGU1XHU1MTc3DQotX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXA9XHU2ODA3XHU1MWM2XHU3YzdiXHU1MjJiDQotX1VJX0N1c3RvbV9DYXRlZ29yaWVzX2dyb3VwPVx1NWI5YVx1NTIzNlx1N2M3Ylx1NTIyYg0KLV9VSV9NZXRob2RDb250ZW50X2dyb3VwPVx1NTE4NVx1NWJiOVx1NTMwNQ0KLQ0KLV9VSV9Qcm9jZXNzZXNfZ3JvdXA9XHU2ZDQxXHU3YTBiDQotX1VJX1BsYW5uaW5nVGVtcGxhdGVzX2dyb3VwPVx1ODljNFx1NTIxMlx1NmEyMVx1Njc3Zg0KLQ0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybnNfdGV4dD1cdTgwZmRcdTUyOWJcdTZhMjFcdTVmMGYNCi1fVUlfRGVsaXZlcnlQcm9jZXNzZXNfdGV4dD1cdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGINCi1fVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbnNfdGV4dD1cdTVkZWVcdTVmMDJcdTUzMTZcdThmYzdcdTdhMGINCi1fVUlfUGxhbm5pbmdUZW1wbGF0ZXNfdGV4dD1cdTg5YzRcdTUyMTJcdTZhMjFcdTY3N2YNCi0NCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1cdTgwZmRcdTUyOWJcdTZhMjFcdTVmMGYNCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3RleHQ9XHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiDQotX1VJX1Byb2Nlc3NDb250cmlidXRpb25fdGV4dD1cdTVkZWVcdTVmMDJcdTUzMTZcdThmYzdcdTdhMGINCi0NCi1fVUlfQ29uZmlndXJhdGlvbnNfdGV4dD1cdTkxNGRcdTdmNmUNCi0NCi1fVUlfUHJvY2Vzc0ZhbWlsaWVzX3RleHQ9XHU2ZDQxXHU3YTBiXHU3Y2ZiXHU1MjE3DQotDQotX1VJX1VuY2F0ZWdvcml6ZWRfdGV4dD1cdTY3MmFcdTUyMDZcdTdjN2INCi1fVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0PVx1NjcyYVx1NTIwNlx1N2M3Ylx1NGVmYlx1NTJhMQ0KLV9VSV9VbmNhdGVnb3JpemVkX1JvbGVzX3RleHQ9XHU2NzJhXHU1MjA2XHU3YzdiXHU4OWQyXHU4MjcyDQotDQotX1VJX0d1aWRhbmNlc19ncm91cD1cdTYzMDdcdTViZmNcdTRmZTFcdTYwNmYNCi1fVUlfR3VpZGFuY2VzX0NoZWNrbGlzdHM9XHU2ODM4XHU1YmY5XHU4ODY4DQotX1VJX0d1aWRhbmNlc19Db25jZXB0cz1cdTY5ODJcdTVmZjUNCi1fVUlfR3VpZGFuY2VzX0V4YW1wbGVzPVx1NzkzYVx1NGY4Yg0KLV9VSV9HdWlkYW5jZXNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPVx1NGYzMFx1N2I5N1x1NmNlOFx1NjEwZlx1NGU4Ylx1OTg3OQ0KLV9VSV9HdWlkYW5jZXNfUHJhY3RpY2VzPVx1NWI5ZVx1OGRmNQ0KLV9VSV9HdWlkYW5jZXNfUmVwb3J0cz1cdTYyYTVcdTU0NGENCi1fVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzPVx1NTNlZlx1OTFjZFx1NzUyOFx1OGQ0NFx1NGVhNw0KLV9VSV9HdWlkYW5jZXNfUm9hZG1hcD1cdThkZWZcdTdlYmZcdTU2ZmUNCi1fVUlfR3VpZGFuY2VzX1N1cHBvcnRpbmdNYXRlcmlhbHM9XHU2NTJmXHU2MzAxXHU2NzUwXHU2NTk5DQotX1VJX0d1aWRhbmNlc19UZWNobmlxdWVzPVx1NjI4MFx1NjcyZg0KLV9VSV9HdWlkYW5jZXNfVGVtcGxhdGVzPVx1NmEyMVx1Njc3Zg0KLV9VSV9HdWlkYW5jZXNfVGVybURlZmluaXRpb25zPVx1NjcyZlx1OGJlZFx1NWI5YVx1NGU0OQ0KLV9VSV9HdWlkYW5jZXNfVG9vbE1lbnRvcnM9XHU1ZGU1XHU1MTc3XHU1NDExXHU1YmZjDQotX1VJX0d1aWRhbmNlc19XaGl0ZXBhcGVycz1cdTc2N2RcdTc2YWVcdTRlNjYNCi1fVUlfR3VpZGFuY2VzX1dvcmtQcm9kdWN0R3VpZGVsaW5lcz1cdTYzMDdcdTUzNTcNCi0NCi1fVUlfUm9sZXNfZ3JvdXA9XHU4OWQyXHU4MjcyDQotX1VJX1Rhc2tzX2dyb3VwPVx1NGVmYlx1NTJhMQ0KLV9VSV9Xb3JrUHJvZHVjdHNfZ3JvdXA9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZkMTcwODguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIExpYnJhcnkgRWRpdA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLV9VSV9Db250ZW50X2dyb3VwPVx1NjViOVx1NmNkNVx1NTE2N1x1NWJiOQ0KLQ0KLV9VSV9EaXNjaXBsaW5lc19ncm91cD1cdTg5OGZcdTdiYzQNCi1fVUlfRG9tYWluc19ncm91cD1cdTk4MThcdTU3ZGYNCi1fVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cD1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTk4NWVcdTU3OGINCi1fVUlfUm9sZV9TZXRzX2dyb3VwPVx1ODlkMlx1ODI3Mlx1OTZjNg0KLV9VSV9Ub29sc19ncm91cD1cdTVkZTVcdTUxNzcNCi1fVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cD1cdTZhMTlcdTZlOTZcdTdhMmVcdTk4NWUNCi1fVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXA9XHU4MWVhXHU4YTAyXHU3YTJlXHU5ODVlDQotX1VJX01ldGhvZENvbnRlbnRfZ3JvdXA9XHU1MTY3XHU1YmI5XHU1OTU3XHU0ZWY2DQotDQotX1VJX1Byb2Nlc3Nlc19ncm91cD1cdTdhMGJcdTVlOGYNCi1fVUlfUGxhbm5pbmdUZW1wbGF0ZXNfZ3JvdXA9XHU4OThmXHU1MjgzXHU3YmM0XHU2NzJjDQotDQotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuc190ZXh0PVx1NTI5Zlx1ODBmZFx1NTc4Ylx1NmEyMw0KLV9VSV9EZWxpdmVyeVByb2Nlc3Nlc190ZXh0PVx1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYg0KLV9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uc190ZXh0PVx1NWRlZVx1NzU3MFx1NmQ0MVx1N2EwYg0KLV9VSV9QbGFubmluZ1RlbXBsYXRlc190ZXh0PVx1ODk4Zlx1NTI4M1x1N2JjNFx1NjcyYw0KLQ0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0PVx1NTI5Zlx1ODBmZFx1NTc4Ylx1NmEyMw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NfdGV4dD1cdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGINCi1fVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0PVx1NWRlZVx1NzU3MFx1NmQ0MVx1N2EwYg0KLQ0KLV9VSV9Db25maWd1cmF0aW9uc190ZXh0PVx1OTE0ZFx1N2Y2ZQ0KLQ0KLV9VSV9Qcm9jZXNzRmFtaWxpZXNfdGV4dD1cdTdhMGJcdTVlOGZcdTdjZmJcdTUyMTcNCi0NCi1fVUlfVW5jYXRlZ29yaXplZF90ZXh0PVx1NjcyYVx1NTIwNlx1OTg1ZQ0KLV9VSV9VbmNhdGVnb3JpemVkX1Rhc2tzX3RleHQ9XHU2NzJhXHU1MjA2XHU5ODVlXHU0ZjVjXHU2OTZkDQotX1VJX1VuY2F0ZWdvcml6ZWRfUm9sZXNfdGV4dD1cdTY3MmFcdTUyMDZcdTk4NWVcdTg5ZDJcdTgyNzINCi0NCi1fVUlfR3VpZGFuY2VzX2dyb3VwPVx1NjMwN1x1NWYxNQ0KLV9VSV9HdWlkYW5jZXNfQ2hlY2tsaXN0cz1cdTY4MzhcdTVjMGRcdTZlMDVcdTU1YWUNCi1fVUlfR3VpZGFuY2VzX0NvbmNlcHRzPVx1Njk4Mlx1NWZmNQ0KLV9VSV9HdWlkYW5jZXNfRXhhbXBsZXM9XHU3YmM0XHU0ZjhiDQotX1VJX0d1aWRhbmNlc19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM9XHU5ODEwXHU0ZjMwXHU4MDAzXHU5MWNmDQotX1VJX0d1aWRhbmNlc19QcmFjdGljZXM9XHU3ZGY0XHU3ZmQyDQotX1VJX0d1aWRhbmNlc19SZXBvcnRzPVx1NTgzMVx1NTQ0YQ0KLV9VSV9HdWlkYW5jZXNfUmV1c2FibGVBc3NldHM9XHU1M2VmXHU5MWNkXHU4OTA3XHU0ZjdmXHU3NTI4XHU3Njg0XHU4Y2M3XHU3NTIyDQotX1VJX0d1aWRhbmNlc19Sb2FkbWFwPVx1NWMwZVx1ODliZFx1NTcxNg0KLV9VSV9HdWlkYW5jZXNfU3VwcG9ydGluZ01hdGVyaWFscz1cdTY1MmZcdTYzZjRcdThjYzdcdTY1OTkNCi1fVUlfR3VpZGFuY2VzX1RlY2huaXF1ZXM9XHU2MjgwXHU4ODUzDQotX1VJX0d1aWRhbmNlc19UZW1wbGF0ZXM9XHU3YmM0XHU2NzJjDQotX1VJX0d1aWRhbmNlc19UZXJtRGVmaW5pdGlvbnM9XHU4YTVlXHU1ZjU5XHU1YjlhXHU3ZmE5DQotX1VJX0d1aWRhbmNlc19Ub29sTWVudG9ycz1cdTVkZTVcdTUxNzdcdThmMTRcdTUyYTkNCi1fVUlfR3VpZGFuY2VzX1doaXRlcGFwZXJzPVx1NzY3ZFx1NzZhZVx1NjZmOA0KLV9VSV9HdWlkYW5jZXNfV29ya1Byb2R1Y3RHdWlkZWxpbmVzPVx1NmU5Nlx1NTI0Nw0KLQ0KLQ0KLV9VSV9Sb2xlc19ncm91cD1cdTg5ZDJcdTgyNzINCi1fVUlfVGFza3NfZ3JvdXA9XHU0ZjVjXHU2OTZkDQotX1VJX1dvcmtQcm9kdWN0c19ncm91cD1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWMNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzFlNmZiZS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgR2VuZXJpYyBEaWFsb2cgVGl0bGVzDQotbW92ZURpYWxvZ190aXRsZT1WZXJzY2hpZWJlbg0KLWRlbGV0ZURpYWxvZ190aXRsZT1FbGVtZW50IGxcdTAwZjZzY2hlbg0KLWVycm9yRGlhbG9nX3RpdGxlPUZlaGxlcg0KLWVycm9yRGlhbG9nX2Nhbm5vdFJlbmFtZT17MH0gJyd7MX0nJyBrYW5uIG5pY2h0IGluICcnezJ9JycgdW1iZW5hbm50IHdlcmRlbi4gQmVoZWJlbiBTaWUgZGFzIGluIGRlbiBEZXRhaWxzIGJlc2NocmllYmVuZSBQcm9ibGVtIHVuZCBrbGlja2VuIFNpZSBhbnNjaGxpZVx1MDBkZmVuZCBhdWYgT0ssIHVtIGRpZSBPcGVyYXRpb24gZm9ydHp1c2V0emVuLCBvZGVyIGF1ZiBBYmJyZWNoZW4sIHVtIGRpZSBPcGVyYXRpb24gYWJ6dWJyZWNoZW4uDQotDQotIyBDb25maXJtIFJlZmVyZW5jZXMgUmVtb3ZhbCBEaWFsb2cNCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RpdGxlPUVudGZlcm5lbiBkZXIgUmVmZXJlbnplbiBiZXN0XHUwMGU0dGlnZW4NCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RleHQ9QXVmIGRpZSBFbGVtZW50ZSwgZGllIFNpZSB6dW0gTFx1MDBmNnNjaGVuIGF1c2dld1x1MDBlNGhsdCBoYWJlbiwgdmVyd2Vpc2VuIG5vY2ggYW5kZXJlIEVsZW1lbnRlIGluIGRlciBNZXRob2RlbmJpYmxpb3RoZWsuIFdlbm4gU2llIGRpZXNlIEVsZW1lbnRlIGxcdTAwZjZzY2hlbiwgd2VyZGVuIGRpZSBSZWZlcmVuemVuIGF1ZiBkaWVzZSBFbGVtZW50ZSBnZWxcdTAwZjZzY2h0LiBEZXNoYWxiIHdlcmRlbiBkaWUgcmVmZXJlbnppZXJlbmRlbiBFbGVtZW50ZSBlYmVuZmFsbHMgYWt0dWFsaXNpZXJ0LiBWZXJnZXdpc3Nlcm4gU2llIHNpY2ggdm9yIGRlbSBBbmtsaWNrZW4gdm9uIE9LLCBkYXNzIFNpZSBiZXJlY2h0aWd0IHNpbmQsIGRpZSByZWZlcmVuemllcmVuZGVuIEVsZW1lbnRlIHp1IGFrdHVhbGlzaWVyZW4uIEtsaWNrZW4gU2llIGF1ZiBEZXRhaWxzLCB1bSBkaWUgTGlzdGUgZGVyIEVsZW1lbnRlIHp1IHByXHUwMGZjZmVuLCBkaWUgYXVmIGRpZSBFbGVtZW50ZSB2ZXJ3ZWlzZW4sIGRpZSBTaWUgbFx1MDBmNnNjaGVuIG1cdTAwZjZjaHRlbi4NCi0NCi0jIFJlc29sdmUgTmFtZSBDb25mbGljdCBEaWFsb2cNCi1yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RpdGxlPUtvbmZsaWt0IGJlaSBFbGVtZW50bmFtZW4gYmVoZWJlbg0KLXJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGV4dD17MH0gKG5ldSkgZlx1MDBmY3IgJyd7MX0nJyBlaW5nZWJlbjoNCi0NCi0jIFNlbGVjdCBEZWxpdmVyYWJsZXMgRGlhbG9nDQotc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RpdGxlPUxpZWZlcmdlZ2Vuc3RcdTAwZTRuZGUgYXVzd1x1MDBlNGhsZW4NCi1zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGV4dD1XXHUwMGU0aGxlbiBTaWUgZWluZW4gTGllZmVyZ2VnZW5zdGFuZCBhdXMsIGRlbSBTaWUgZGFzIEFyYmVpdHNlcmdlYm5pcyAnJ3swfScnIHp1b3JkbmVuIG1cdTAwZjZjaHRlbi4NCi0NCi0jIE5ldyBQcm9jZXNzIENvbXBvbmVudCBEaWFsb2cNCi1uZXdQcm9jZXNzQ29tcG9uZW50RGlhbG9nX3RpdGxlPU5ldWUgUHJvemVzc2tvbXBvbmVudGUNCi1uYW1lTGFiZWxfdGV4dD1OYW1lOg0KLWRlZmF1bHRDb25maWdMYWJlbF90ZXh0PVN0YW5kYXJka29uZmlndXJhdGlvbjoNCi1iYXNlUHJvY2Vzc0xhYmVsX3RleHQ9QmFzaXNwcm96ZXNzOg0KLWJhc2VkT25Qcm9jZXNzZXNMYWJlbF90ZXh0PUJhc2llcnQgYXVmIFByb3plc3NlbjoNCi0NCi0jIFJvbGUgQXNzb2NpYXRpb24gRGlhbG9nDQotc2VsZWN0QXNzb2NpYXRpb25MYWJlbF90ZXh0PVp1b3JkbnVuZyBmXHUwMGZjciBkaWUgQXVmZ2FiZSAnJ3swfScnIGF1c3dcdTAwZTRobGVuDQotDQotIyBSZW1vdmUgQXNzb2NpYXRpb24gZGlhbG9nDQotcmVtb3ZlQXNzb2NpYXRpb25EaWFsb2dfdGV4dD1adW9yZG51bmcgZW50ZmVybmVuDQotDQotIyBTZWxlY3QgVGVhbXMgRGlhbG9nDQotc2VsZWN0VGVhbXNEaWFsb2dfdGl0bGU9VGVhbXMgYXVzd1x1MDBlNGhsZW4NCi1zZWxlY3RUZWFtc0RpYWxvZ190ZXh0PVdcdTAwZTRobGVuIFNpZSBlaW4gVGVhbSBhdXMsIGRlbSBTaWUgZWluZSBSb2xsZSAnJ3swfScnIHp1b3JkbmVuIG1cdTAwZjZjaHRlbi4NCi0NCi0jIFRhc2wgU2VsZWN0aW9uIERpYWxvZw0KLXRhc2tTZWxlY3Rpb25EaWFsb2dfdGl0bGU9QXVmZ2FiZW5hdXN3YWhsDQotdGl0bGVMYWJlbF90ZXh0PUF1ZmdhYmVuIGF1c3dcdTAwZTRobGVuLi4uDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQTDAxMDBFOiBEZXIgTmFtZSBmXHUwMGZjciB7MH0gZmVobHQuXG5cbkFsbGUgTWV0aG9kZW4tIHVuZCBQcm96ZXNzZWxlbWVudGUgbVx1MDBmY3NzZW4gZWluZW4gTmFtZW4gaGFiZW4uXG5cbkdlYmVuIFNpZSBlaW5lbiBnXHUwMGZjbHRpZ2VuIE5hbWVuIGVpbiB1bmQgd2llZGVyaG9sZW4gU2llIGRlbiBWb3JnYW5nLg0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnPURlciBOYW1lIG11c3MgYW5nZWdlYmVuIHdlcmRlbi4gR2ViZW4gU2llIGVpbmVuIGdcdTAwZmNsdGlnZW4gTmFtZW4gYW4uDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQTDAxMDFFOiBEZXIgTmFtZSAnJ3swfScnIGlzdCBiZXJlaXRzIHZvcmhhbmRlbi5cblxuRWluIE1ldGhvZGVuZWxlbWVudCBtdXNzIGVpbmVuIGVpbmRldXRpZ2VuIE5hbWVuIGhhYmVuLlxuXG5HZWJlbiBTaWUgZWluZW4gYW5kZXJlbiBOYW1lbiBlaW4gdW5kIHdpZWRlcmhvbGVuIFNpZSBkZW4gVm9yZ2FuZy4NCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c9RGVyIEVsZW1lbnRuYW1lIGlzdCBiZXJlaXRzIHZvcmhhbmRlbi4gR2ViZW4gU2llIGVpbmVuIGFuZGVyZW4gTmFtZW4gYW4uDQotaW52YWxpZEVsZW1lbnROYW1lRXJyb3IxX21zZz1JVVBMMDEwMkU6IERlciBOYW1lICcnezB9JycgaXN0IHVuZ1x1MDBmY2x0aWcuXG5cbkRlciBOYW1lIGVpbmVzIE1ldGhvZGVuZWxlbWVudHMgZGFyZiBuaWNodCBtaXQgZWluZW0gTGVlcnplaWNoZW4gYmVnaW5uZW4uXG5cbkdlYmVuIFNpZSBlaW5lbiBnXHUwMGZjbHRpZ2VuIE5hbWVuIGVpbiB1bmQgd2llZGVyaG9sZW4gU2llIGRlbiBWb3JnYW5nLg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMl9tc2c9SVVQTDAxMDNFOiBEZXIgTmFtZSAnJ3swfScnIGlzdCB1bmdcdTAwZmNsdGlnLlxuXG5EZXIgTmFtZSBlaW5lcyBNZXRob2RlbmVsZW1lbnRzIGRhcmYgbmljaHQgbWl0IGVpbmVtIFB1bmt0IGVuZGVuLlxuXG5HZWJlbiBTaWUgZWluZW4gZ1x1MDBmY2x0aWdlbiBOYW1lbiBlaW4gdW5kIHdpZWRlcmhvbGVuIFNpZSBkZW4gVm9yZ2FuZy4NCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjNfbXNnPUlVUEwwMTA0RTogRGVyIE5hbWUgJyd7MH0nJyBpc3QgdW5nXHUwMGZjbHRpZy5cblxuRGllIGZvbGdlbmRlbiBaZWljaGVuIHNpbmQgaW4gTmFtZW4gZlx1MDBmY3IgTWV0aG9kZW5lbGVtZW50IG5pY2h0IHp1bFx1MDBlNHNzaWc6IFxcIC8gOiAqID8gIiA8ID4gOyB8XG5cbkdlYmVuIFNpZSBlaW5lbiBnXHUwMGZjbHRpZ2VuIE5hbWVuIGVpbiwgdW5kIHdpZWRlcmhvbGVuIFNpZSBkZW4gVm9yZ2FuZy4NCi1ub0NvbmZpZ0Vycm9yX21zZz1JVVBMMDEwNUU6IERpZSBha3R1ZWxsZSBNZXRob2RlbmJpYmxpb3RoZWsgZW50aFx1MDBlNGx0IGtlaW5lIE1ldGhvZGVua29uZmlndXJhdGlvbi5cblxuWnVtIEVyc3RlbGxlbiBlaW5lcyBuZXVlbiBQcm96ZXNzZXMgaXN0IGVpbmUgTWV0aG9kZW5rb25maWd1cmF0aW9uIGVyZm9yZGVybGljaC5cblxuRXJzdGVsbGVuIFNpZSBlaW5lIE1ldGhvZGVua29uZmlndXJhdGlvbiB1bmQgd2llZGVyaG9sZW4gU2llIGRlbiBWb3JnYW5nLg0KLW5vRGVsaXZlcnlQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA2RTogRGllIGFrdHVlbGxlIE1ldGhvZGVuYmlibGlvdGhlayBlbnRoXHUwMGU0bHQga2VpbmVuIEJlcmVpdHN0ZWxsdW5nc3Byb3plc3MuXG5cblp1bSBFcnN0ZWxsZW4gZWluZXMgbmV1ZW4gUHJvemVzc2JlaXRyYWdzIGlzdCBlaW4gQmFzaXNiZXJlaXRzdGVsbHVuZ3Nwcm96ZXNzIGVyZm9yZGVybGljaC5cblxuRXJzdGVsbGVuIFNpZSBlaW5lbiBCZXJlaXRzdGVsbHVuZ3Nwcm96ZXNzIHVuZCB3aWVkZXJob2xlbiBTaWUgZGVuIFZvcmdhbmcuDQotbm9EZWZhdWx0Q29uZmlnRXJyb3JfbXNnPUlVUEwwMTA3RTogRXMgd3VyZGUga2VpbmUgTWV0aG9kZW5rb25maWd1cmF0aW9uIGF1c2dld1x1MDBlNGhsdC5cblxuRGVtIG5ldWVuIFByb3plc3MgbXVzcyBlaW5lIFN0YW5kYXJkbWV0aG9kZW5rb25maWd1cmF0aW9uIHp1Z2VvcmRuZXQgd2VyZGVuLlxuXG5XXHUwMGU0aGxlbiBTaWUgZWluZSBNZXRob2RlbmtvbmZpZ3VyYXRpb24gYXVzIHVuZCB3aWVkZXJob2xlbiBTaWUgZGVuIFZvcmdhbmcuDQotbm9CYXNlUHJvY2Vzc0Vycm9yX21zZz1JVVBMMDEwOEU6IEVzIHd1cmRlIGtlaW4gQmVyZWl0c3RlbGx1bmdzcHJvemVzcyBhdXNnZXdcdTAwZTRobHQuXG5cbkVpbiBQcm96ZXNzYmVpdHJhZyBzZXR6dCBlaW5lbiBCYXNpc2JlcmVpdHN0ZWxsdW5nc3Byb3plc3Mgdm9yYXVzLlxuXG5XXHUwMGU0aGxlbiBTaWUgZWluZW4gQmVyZWl0c3RlbGx1bmdzcHJvemVzcyBhdXMgdW5kIHdpZWRlcmhvbGVuIFNpZSBkZW4gVm9yZ2FuZy4NCi1jcmVhdGVQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA5RTogRGVyIFByb3plc3Mga2FubiBuaWNodCBmZWhsZXJmcmVpIGVyc3RlbGx0IHdlcmRlbi4NCi1jcmVhdGVFbGVtZW50RXJyb3JfbXNnPUlVUEwwMTEwRTogRGFzIEVsZW1lbnQga2FubiBuaWNodCBmZWhsZXJmcmVpIGVyc3RlbGx0IHdlcmRlbi4NCi1kZWxldGVFbGVtZW50RXJyb3JfbXNnPUlVUEwwMTExRTogRGFzIEVsZW1lbnQga2FubiBuaWNodCBmZWhsZXJmcmVpIGdlbFx1MDBmNnNjaHQgd2VyZGVuLg0KLWR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3JfbXNnPUlVUEwwMTEyRTogRGllIEluaGFsdHNkYXRlaSBmXHUwMGZjciBkYXMgRWxlbWVudCBrYW5uIG5pY2h0IGVyc3RlbGx0IHdlcmRlbi5cblxuRGllIERhdGVpICcnezB9JycgaXN0IGJlcmVpdHMgdm9yaGFuZGVuLlxuXG5HZWJlbiBTaWUgZWluZW4gYW5kZXJlbiBOYW1lbiBlaW4gdW5kIHdpZWRlcmhvbGVuIFNpZSBkZW4gVm9yZ2FuZy4NCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX3NpbXBsZV9tc2c9RXMgaXN0IGJlcmVpdHMgZWluZSBJbmhhbHRzZGF0ZWkgbWl0IGRpZXNlbSBOYW1lbiB2b3JoYW5kZW4uIEdlYmVuIFNpZSBlaW5lbiBhbmRlcmVuIE5hbWVuIGFuLg0KLXVuZG9Db21tYW5kRXJyb3JfbXNnPUlVUEwwMTEzRTogRGVyIFdpZGVycnVmYmVmZWhsICcnezB9Jycga2FubiBuaWNodCBhdXNnZWZcdTAwZmNocnQgd2VyZGVuLlxuXG5FcyBpc3QgZWluIEZlaGxlciBhdWZnZXRyZXRlbjogezF9DQotaW52YWxpZFByZWRlY2Vzc29yRXJyb3JfbXNnPUlVUEwwMTE0RTogRGVyIGFuZ2VnZWJlbmUgVm9yZ1x1MDBlNG5nZXJpbmRleCBpc3QgdW5nXHUwMGZjbHRpZy5cblxuRWluIFZvcmdcdTAwZTRuZ2VyaW5kZXggbXVzcyBlaW4gZ2FuenphaGxpZ2VyIFdlcnQgYXVzIGRlciBTcGFsdGUgJ0luZGV4JyBzZWluLlxuXG5HZWJlbiBTaWUgZWluZW4gZ1x1MDBmY2x0aWdlbiBXZXJ0IGVpbiB1bmQgd2llZGVyaG9sZW4gU2llIGRlbiBWb3JnYW5nLg0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHM9SVVQTDAxMDBXOiAnJ3swfScnIGlzdCBiZXJlaXRzICcnezF9JycgenVnZW9yZG5ldC4gRXMgaXN0IG51ciBlaW5lIFp1b3JkbnVuZyBkaWVzZXIgQXJ0IHp1bFx1MDBlNHNzaWcuIFdlbm4gU2llICcnezB9JycgJyd7Mn0nJyB6dW9yZG5lbiBtXHUwMGY2Y2h0ZW4sIG1cdTAwZmNzc2VuIFNpZSBkYXMgRWxlbWVudCBlcnN0IGF1cyAnJ3sxfScnIGVudGZlcm5lbi4NCi1lcnJvcl9tc2dXaXRoRGV0YWlscz1JVVBMMDExNkU6IEVzIGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLiBLbGlja2VuIFNpZSBhdWYgRGV0YWlscywgdW0gd2VpdGVyZSBJbmZvcm1hdGlvbmVuIHp1IGVyaGFsdGVuLg0KLWVycm9yX21zZz1JVVBMMDExN0U6IEVzIGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLiBTdWNoZW4gU2llIGluIGRlciBQcm90b2tvbGxkYXRlaSBuYWNoIHdlaXRlcmVuIEVpbnplbGhlaXRlbi4NCi1TdXBwcmVzc2lvbl9uYW1lRHVwbGljYXRpb249SVVQTDAxMThFOiBOYWNoIGRpZXNlciBPcGVyYXRpb24gdHJpdHQgZWluZSBOYW1lbnN1bnZlcnRyXHUwMGU0Z2xpY2hrZWl0IGF1Zi4gXHUwMGRjYmVycHJcdTAwZmNmZW4gU2llLCBvYiBkZXIgRWxlbWVudG5hbWUgYmVyZWl0cyB2b3JoYW5kZW4gaXN0LCB1bmQgd2llZGVyaG9sZW4gU2llIGRhbm4gZGllIE9wZXJhdGlvbi4NCi1TdXBwcmVzc2lvbl9wcmVzZW50YXRpb25OYW1lRHVwbGljYXRpb249SVVQTDAxMTlFOiBOYWNoIGRpZXNlciBPcGVyYXRpb24gdHJpdHQgZWluZSBOYW1lbnN1bnZlcnRyXHUwMGU0Z2xpY2hrZWl0IGF1Zi4gXHUwMGRjYmVycHJcdTAwZmNmZW4gU2llLCBvYiBkZXIgUHJcdTAwZTRzZW50YXRpb25zbmFtZSBkZXMgRWxlbWVudHMgYmVyZWl0cyB2b3JoYW5kZW4gaXN0LCB1bmQgd2llZGVyaG9sZW4gU2llIGRhbm4gZGllIE9wZXJhdGlvbi4NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249RXMgaXN0IGVpbiBGZWhsZXIgYXVmZ2V0cmV0ZW4uIEtsaWNrZW4gU2llIGF1ZiBEZXRhaWxzLCB1bSB3ZWl0ZXJlIEluZm9ybWF0aW9uZW4genUgZXJoYWx0ZW4uDQotc2F2ZVByb2Nlc3NFcnJvcl9yZWFzb249QmVpbSBTcGVpY2hlcm4gZGVzIFByb3plc3NlcyAnJ3swfScnIGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLiBLbGlja2VuIFNpZSBhdWYgRGV0YWlscywgdW0gd2VpdGVyZSBJbmZvcm1hdGlvbmVuIHp1IGVyaGFsdGVuLg0KLWRlbGV0ZVJlZmVyZW5jZXNFcnJvcl9yZWFzb249QmVpbSBFbnRmZXJuZW4gZGVyIFJlZmVyZW56ZW4sIGRpZSBkaWVzZW0gRWxlbWVudCB6dWdlb3JkbmV0IHNpbmQsIGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLiBLbGlja2VuIFNpZSBhdWYgRGV0YWlscywgdW0gd2VpdGVyZSBJbmZvcm1hdGlvbmVuIHp1IGVyaGFsdGVuLg0KLXNhdmVGaWxlRXJyb3JfcmVhc29uPUJlaW0gU3BlaWNoZXJuIGRlciBEYXRlaSAnJ3swfScnIGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLiBLbGlja2VuIFNpZSBhdWYgRGV0YWlscywgdW0gd2VpdGVyZSBJbmZvcm1hdGlvbmVuIHp1IGVyaGFsdGVuLg0KLWludmFsaWRSZWZlcmVuY2VzRXJyb3JfcmVhc29uPUVzIHd1cmRlbiBNZXRob2RlbmVsZW1lbnRlIG1pdCB1bmdcdTAwZmNsdGlnZW4gUmVmZXJlbnplbiBnZWZ1bmRlbiwgZGllIGF1ZiBlaW5lIFBsdWctaW4tXHUwMGZjYmVyZ3JlaWZlbmRlIEtvcGllcm9wZXJhdGlvbiB6dXJcdTAwZmNja3p1Zlx1MDBmY2hyZW4gc2luZC5cbkRpZXNlIFJlZmVyZW56ZW4gd2VyZGVuIGVudGZlcm50LiBGb3J0ZmFocmVuPw0KLXVucmVzb2x2ZWRPYmplY3RFcnJvcl9yZWFzb249RWluIG5pY2h0IGF1ZmdlbFx1MDBmNnN0ZXMgT2JqZWt0IGthbm4gbmljaHQgZ2VcdTAwZTRuZGVydCB3ZXJkZW46IHswfShVUkkgPSB7MX0pezJ9DQotDQotIyBXYXJuaW5nIG1lc3NhZ2VzDQotTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE4VzogTWluZGVzdGVucyBlaW4gUXVlbGxlbmVsZW1lbnQgd3VyZGUgbmljaHQgZ2VmdW5kZW4uIERpZSB6dWdlb3JkbmV0ZW4gRGF0ZWllbiBpbSBSZXNzb3VyY2Vub3JkbmVyIHdlcmRlbiBuaWNodCBrb3BpZXJ0Lg0KLUFjdGl2aXR5QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c9SVVQTDAxMTlXOiBNaW5kZXN0ZW5zIGVpbiBRdWVsbGVuZWxlbWVudCB3dXJkZSBuaWNodCBnZWZ1bmRlbi4gRGllIHp1Z2VvcmRuZXRlbiBQcm96ZXNzcGFrZXRlIHdlcmRlbiBuaWNodCBrb3BpZXJ0Lg0KLUFjdGl2aXR5RHJvcENvbW1hbmRfZGVlcENvcHlfcHJvbXB0Q29uZmlndXJhdGlvbk1zZz1NXHUwMGY2Y2h0ZW4gU2llIGFsbGUgRGVza3JpcHRvcmVuIGtvcGllcmVuP1xuXG5XZW5uIFNpZSBhdWYgTmVpbiBrbGlja2VuLCB3ZXJkZW4gbnVyIGRpZSBEZXNrcmlwdG9yZW4ga29waWVydCwgZGllIHp1ciBha3R1ZWxsZW4gS29uZmlndXJhdGlvbiBnZWhcdTAwZjZyZW4uDQotZGVlcENvcHlfcHJvbXB0TXNnPVNpZSBlcmhhbHRlbiBlaW5lIEtvcGllIGFsbGVyIGR5bmFtaXNjaCB2ZXJrblx1MDBmY3BmdGVuIEVsZW1lbnRlLCBkaWUgU2llIGFiIHNvZm9ydCBzZXBhcmF0IHZlcndhbHRlbiBtXHUwMGZjc3Nlbi4gRm9ydGZhaHJlbj8NCi1kZWVwQ29weV90aXRsZT1UaWVmZSBLb3BpZQ0KLQ0KLSMgUHJvZ3Jlc3MgbWVzc2FnZXMNCi1jcmVhdGluZ1Byb2Nlc3NDb21wb25lbnRUYXNrX25hbWU9UHJvemVzc2tvbXBvbmVudGUgJyd7MH0nJyB3aXJkIGVyc3RlbGx0Li4uDQotcHJvY2Vzc2luZ1JlZmVyZW5jZXNUYXNrX25hbWU9UmVmZXJlbnplbiB3ZXJkZW4gdmVyYXJiZWl0ZXQuLi4NCi1kZWxldGluZ0VsZW1lbnRzVGFza19uYW1lPUVsZW1lbnRlIHVuZCB6dWdlb3JkbmV0ZSBEYXRlaWVuIHdlcmRlbiBnZWxcdTAwZjZzY2h0Li4uDQotY2hlY2tpbmdSZWZlcmVuY2VzVGFza19uYW1lPVJlZmVyZW56ZW4gd2VyZGVuIGdlc3VjaHQuLi4NCi1yZW1vdmluZ1JlZmVyZW5jZXN0YXNrX25hbWU9UmVmZXJlbnplbiB3ZXJkZW4gZW50ZmVybnQuLi4NCi1zYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lPUdlXHUwMGU0bmRlcnRlIERhdGVpZW4gd2VyZGVuIGdlc3BlaWNoZXJ0Li4uDQotY2hlY2tBZmZlY3RlZFJlc291cmNlc1Rhc2tfbmFtZT1CZXRyb2ZmZW5lIFJlc3NvdXJjZW4gd2VyZGVuIGdlcHJcdTAwZmNmdC4uLg0KLW1vdmluZ1Rhc2tfbmFtZT1WZXJzY2hpZWJlbi4uLg0KLW1vdmluZ0ZpbGVzVGFza19uYW1lPURhdGVpZW4gd2VyZGVuIHZlcnNjaG9iZW4uLi4NCi1jb3B5aW5nUmVzb3VyY2VzVGFza19uYW1lPVJlc3NvdXJjZW4gd2VyZGVuIGtvcGllcnQuLi4NCi1jb3B5aW5nQWN0aXZpdGllc19tc2c9QWt0aXZpdFx1MDBlNHQgJyd7MH0nJyB3aXJkIGtvcGllcnQNCi1zYXZpbmdGaWxlVGFza19uYW1lPURhdGVpICcnezB9Jycgd2lyZCBnZXNwZWljaGVydC4uLg0KLQ0KLSMgVUkgVGV4dA0KLWVsZW1lbnRfdGV4dD1FbGVtZW50DQotY3JlYXRlRWxlbWVudF90ZXh0PUVsZW1lbnQgZXJzdGVsbGVuDQotY3JlYXRlUHJvY2Vzc190ZXh0PVByb3plc3MgZXJzdGVsbGVuDQotY29udHJpYnV0ZXNUb190ZXh0PUJlaXRyYWcgenUNCi1sb2NhbENvbnRyaWJ1dGVzVG9fdGV4dD1Mb2thbGVyIEJlaXRyYWcgenUNCi1leHRlbmRzX3RleHQ9RXJ3ZWl0ZXJ1bmcNCi1yZXBsYWNlc190ZXh0PUVyc2V0enVuZw0KLWxvY2FsUmVwbGFjZXNfdGV4dD1Mb2thbGUgRXJzZXR6dW5nIGZcdTAwZmNyDQotbG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5X3RleHQ9TG9rYWxlIEVyc2V0enVuZyB1bmQgdGllZmUgS29waWUNCi1lbGVtZW50VHlwZV90ZXh0PXswfTogezF9DQotZGVsaXZlcmFibGVzX3RleHQ9TGllZmVyZ2VnZW5zdFx1MDBlNG5kZQ0KLWNvbnRyaWJ1dGVUb0FjdGl2aXR5X3RleHQ9QmVpdHJhZyB6dSBBa3Rpdml0XHUwMGU0dA0KLUFjdGl2aXR5RHJvcENvbW1hbmRfbGFiZWw9QWt0aXZpdFx1MDBlNHQgbFx1MDBmNnNjaGVuDQotcmVwbGFjZUFjdGl2aXR5X3RleHQ9QWt0aXZpdFx1MDBlNHQgZXJzZXR6ZW4NCi1maWxlX3RleHQ9RGF0ZWkNCi1kaXJlY3RvcnlfdGV4dD1WZXJ6ZWljaG5pcw0KLXVucmVzb2x2ZWRfdGV4dD0oJyd7MH0nJyBuaWNodCBhdWZnZWxcdTAwZjZzdCkNCi1hc3Npc3RzX3RleHQ9VW50ZXJzdFx1MDBmY3R6dA0KLXVua25vd25fdGV4dD1VbmJla2FubnQNCi1jb21tYW5kX2RvbmU9RmVydGlnDQotDQotIyBUaGUgZm9sbG93aW5nIFVJIHRleHQgc2hvdWxkIGJlIHJldmlld2VkLg0KLVV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5d2l0aHBsdWdpbl9pbmZvPXswfSAoezF9ICcnezJ9JycgaW4gJyd7M30nJykNCi1VdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eV9pbmZvPXswfSAoezF9ICcnezJ9JycpDQotdWlfcmVmX2RlbGV0ZT1EZXIgRGVza3JpcHRvciAnJ3swfScnIGhhdCBkaWUgZm9sZ2VuZGVuIFJlZmVyZW56ZW4sIGRpZSBuaWNodCB2ZXJ3ZW5kZXQgd2VyZGVuLlxuV1x1MDBlNGhsZW4gU2llIGRpZSBSZWZlcmVuemVuIGF1cywgZGllIFNpZSBsXHUwMGY2c2NoZW4gbVx1MDBmNmNodGVuOg0KLXVpX3JlZl9kZWxldGUyPURpZSBmb2xnZW5kZW4gUmVmZXJlbnplbiB3ZXJkZW4gbmljaHQgdmVyd2VuZGV0LlxuV1x1MDBlNGhsZW4gU2llIGRpZSBSZWZlcmVuemVuIGF1cywgZGllIFNpZSBsXHUwMGY2c2NoZW4gbVx1MDBmNmNodGVuOg0KLXVpX3JlZmVyZW5jZXM9UmVmZXJlbnplbg0KLXVpX3dvcmtwcm9kdWN0X2Rlc2NyaXB0b3JfZGVzY3JpcHRpb249RGVyIEFyYmVpdHNlcmdlYm5pc2Rlc2tyaXB0b3IgJyd7MH0nJyBpc3QgKGRlciBBdXNnYWJlIHZvbikgQXVmZ2FiZW5kZXNrcmlwdG9yICcnezF9JycgenVnZW9yZG5ldC4NCi11aV93b3JrcHJvZHVjdGRlc2NyaXB0b3Jfb3B0aW9ucz1PcHRpb25lbg0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vdXRwdXRsYWJlbD1BcmJlaXRzZXJnZWJuaXNkZXNrcmlwdG9yIGFscyBBdXNnYWJlIGRlcyBBdWZnYWJlbmRlc2tyaXB0b3JzIGVudGZlcm5lbg0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9kZWxldGVfdGFzaz1BdWZnYWJlbmRlc2tyaXB0b3IgYXVzIEFrdGl2aXRcdTAwZTR0IGxcdTAwZjZzY2hlbg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9kZWZhdWx0Y29uZmlnY2hlY2s9RGFzIGF1c2dld1x1MDBlNGhsdGUgRWxlbWVudCAnJ3swfScnIGlzdCBuaWNodCBpbiBkZXIgU3RhbmRhcmRrb25maWd1cmF0aW9uIGRlcyBQcm96ZXNzZXMgZW50aGFsdGVuLlxuTVx1MDBmNmNodGVuIFNpZSBkYXMgRWxlbWVudCB1bmQgZGllIEFiaFx1MDBlNG5naWdrZWl0ZW4gZGVyIFN0YW5kYXJka29uZmlndXJhdGlvbiBoaW56dWZcdTAwZmNnZW4/DQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX2dlbmVyaWNFcnJfbWVzc2FnZV90ZXh0PUVzIHNpbmQgRmVobGVyIGluIGRlciBPcGVyYXRpb24gYXVmZ2V0cmV0ZW4uIEtsaWNrZW4gU2llIGF1ZiBEZXRhaWxzLCB1bSB3ZWl0ZXJlIEluZm9ybWF0aW9uZW4genUgZXJoYWx0ZW4uDQotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9ub0Rlc2NyaXB0b3JUb1N5bmNoPUVzIHd1cmRlIGtlaW4gRGVza3JpcHRvciBtaXQgZGVtIHZlcmxpbmt0ZW4gTWV0aG9kZW5lbGVtZW50IGdlZnVuZGVuLCBkZXIgc3luY2hyb25pc2llcnQgd2VyZGVuIGtcdTAwZjZubnRlLg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3JlZmVyc2hpbmd2aWV3ZXI9RmVobGVyIGJlaW0gQWt0dWFsaXNpZXJlbiBkZXMgVmlld2VyDQotY29uZmlybV9yZW1vdmVfcmVmZXJlbmNlc190ZXh0PURpZSB1bnRlciBEZXRhaWxzIGF1ZmdlZlx1MDBmY2hydGVuIEVsZW1lbnRlIGVudGhhbHRlbiBuYWNoIGRlciBLb252ZXJ0aWVydW5nIG1cdTAwZjZnbGljaGVyd2Vpc2UgdW5nXHUwMGZjbHRpZ2UgUmVmZXJlbnplbiBhdWYgZGllc2UgQW5sZWl0dW5nLiBLbGlja2VuIFNpZSBhdWYgT0ssIHdlbm4gU2llIHNpZSBsXHUwMGY2c2NoZW4gdW5kIGZvcnRmYWhyZW4gbVx1MDBmNmNodGVuLg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3VuaGFuZGxlZF9leGNlcHRpb249TmljaHQgYmVoYW5kZWx0ZSBBdXNuYWhtZQ0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfYnJlYWtkb3duX2VsZW1lbnQ9RWluIFN0cnVrdHVyZWxlbWVudCBrYW5uIG5pY2h0IGdsZWljaHplaXRpZyBWb3JnXHUwMGU0bmdlciB1bmQgTmFjaGZvbGdlciBzZWluLg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93cGxpc3RkbGdfbXNnPURhcyBBcmJlaXRzZXJnZWJuaXMgJyd7MH0nJyBpc3QgZWluZSBBdXNnYWJlIGZcdTAwZmNyIGRpZSBmb2xnZW5kZW4gQXVmZ2FiZW4uXG5XXHUwMGU0aGxlbiBTaWUgZGllIEF1ZmdhYmVuIGF1cywgZlx1MDBmY3IgZGllIFNpZSBkaWUgZW50c3ByZWNoZW5kZW4gRGVza3JpcHRvcmVuIGVyc3RlbGxlbiBtXHUwMGY2Y2h0ZW4uDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3JvbGVsaXN0ZGxnX21zZz1EaWUgUm9sbGUgJyd7MH0nJyBpc3QgZlx1MDBmY3IgZGllIGZvbGdlbmRlbiBBcmJlaXRzZXJnZWJuaXNzZSB2ZXJhbnR3b3J0bGljaC5cbldcdTAwZTRobGVuIFNpZSBkaWUgQXJiZWl0c2VyZ2Vibmlzc2UgYXVzLCBmXHUwMGZjciBkaWUgU2llIGRpZSBlbnRzcHJlY2hlbmRlbiBEZXNrcmlwdG9yZW4gZXJzdGVsbGVuIG1cdTAwZjZjaHRlbi4NCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9mYXRhbGVycj1TY2h3ZXJ3aWVnZW5kZXIgRmVobGVyDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dvcmtwcm9kdWN0cz1BcmJlaXRzZXJnZWJuaXNzZQ0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfc3ViX2VsZW1lbnQ9RWluIFN0cnVrdHVyZWxlbWVudCBrYW5uIG5pY2h0IG1pdCBlaW5lbSBzZWluZXIgVW50ZXJlbGVtZW50ZSB2ZXJsaW5rdCB3ZXJkZW4uDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfd3JvbmdfZWxlbWVudD1WZXJsaW5rZW4gaXN0IG51ciBtaXQgZWluZW0gUHJvamVrdHN0cnVrdHVyZWxlbWVudCBtXHUwMGY2Z2xpY2guDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfY2hpbGRfZWxlbWVudD1FaW4gU3RydWt0dXJlbGVtZW50IGthbm4gbmljaHQgbWl0IGVpbmVtIHNlaW5lciBVbnRlcmVsZW1lbnRlIHZlcmxpbmt0IHdlcmRlbi4NCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfdGFza3M9QXVmZ2FiZW4NCi11aV9hc3NvY2lhdGlvbl90YXNrX3NlbGVjdGlvbj1BdWZnYWJlbmF1c3dhaGwuLi4NCi11dGlsX1Byb2Nlc3NVdGlsX2NoaWxkYWRhcHRlcj1cIFwgdW50ZXJnZW9yZG5ldGVyIEFkYXB0ZXI6IA0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NldHBhcmVudD1cdTAwZGNiZXJnZW9yZG5ldGVyIEVpbnRyYWcgZlx1MDBmY3IgRWludHJhZyBrb25udGUgbmljaHQgZ2VzZXR6dCB3ZXJkZW4uDQotdXRpbF90bmd1dGlsX2Nhbm5vdF9lZGl0X3Jlc291cmNlPVJlc3NvdXJjZSBrYW5uIG5pY2h0IGJlYXJiZWl0ZXQgd2VyZGVuLg0KLXV0aWxfUHJvY2Vzc1V0aWxfY29udHJpYnV0ZXN0bz1pc3QgZWluIEJlaXRyYWcgenUgJyd7MH0nJw0KLXV0aWxfUHJvY2Vzc1V0aWxfbG9jYWxDb250cmlidXRlc3RvPUxva2FsZXIgQmVpdHJhZyBmXHUwMGZjciAnJ3swfScnDQotcHJvY2Vzc19leHRlbmRzPUVyd2VpdGVydW5nIGZcdTAwZmNyICcnezB9JycNCi1wcm9jZXNzX3JlcGxhY2VzPWVyc2V0enQgJyd7MH0nJw0KLXByb2Nlc3NfbG9jYWxSZXBsYWNlcz1Mb2thbGUgRXJzZXR6dW5nIGZcdTAwZmNyICcnezB9JycNCi0jIEZpbHRlciBjb25zdGFudHMgZXh0ZXJuYWxpemVkIHN0cmluZ3MuDQotRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVzX3RleHQ9RGlzemlwbGluZW4NCi1GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZWdyb3VwaW5nc190ZXh0PVp1c2FtbWVuZmFzc3VuZ2VuIHZvbiBEaXN6aXBsaW5lbg0KLUZpbHRlckNvbnN0YW50c193aGl0ZXBhcGVyc190ZXh0PVdoaXRlIFBhcGVyDQotRmlsdGVyQ29uc3RhbnRzX3Rvb2xtZW50b3JzX3RleHQ9VG9vbG1lbnRvcmVuDQotRmlsdGVyQ29uc3RhbnRzX3Rvb2xzX3RleHQ9VG9vbHMNCi1GaWx0ZXJDb25zdGFudHNfcm9sZXNfdGV4dD1Sb2xsZW4NCi1GaWx0ZXJDb25zdGFudHNfdGFza3NfdGV4dD1BdWZnYWJlbg0KLUZpbHRlckNvbnN0YW50c19yZXVzYWJsZWFzc2V0c190ZXh0PVdpZWRlcnZlcndlbmRiYXJlIEFzc2V0cw0KLUZpbHRlckNvbnN0YW50c19hbGxfdGV4dD1BbGxlDQotRmlsdGVyQ29uc3RhbnRzX3Byb2Nlc3Nlc190ZXh0PVByb3plc3NlDQotRmlsdGVyQ29uc3RhbnRzX3ByYWN0aWNlc190ZXh0PVZlcmZhaHJlbg0KLUZpbHRlckNvbnN0YW50c190ZW1wbGF0ZXNfdGV4dD1Wb3JsYWdlbg0KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHNfdGV4dD1BcmJlaXRzZXJnZWJuaXNzZQ0KLUZpbHRlckNvbnN0YW50c19jaGVja2xpc3RzX3RleHQ9UHJcdTAwZmNmbGlzdGVuDQotRmlsdGVyQ29uc3RhbnRzX2d1aWRlbGluZXNfdGV4dD1SaWNodGxpbmllbg0KLUZpbHRlckNvbnN0YW50c19yb2xlc2V0c190ZXh0PVJvbGxlbmdydXBwZW4NCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGFuY2VfdGV4dD1BbmxlaXR1bmcNCi1GaWx0ZXJDb25zdGFudHNfY29uY2VwdHNfdGV4dD1Lb256ZXB0ZQ0KLUZpbHRlckNvbnN0YW50c19leGFtcGxlc190ZXh0PUJlaXNwaWVsZQ0KLUZpbHRlckNvbnN0YW50c19jb250ZW50cGFja2FnZXNfdGV4dD1JbmhhbHRzcGFrZXRlDQotRmlsdGVyQ29uc3RhbnRzX3JvbGVkZXNjcmlwdG9yc190ZXh0PVJvbGxlbmRlc2tyaXB0b3Jlbg0KLUZpbHRlckNvbnN0YW50c19yb2xlc2V0Z3JvcHVpbmdzX3RleHQ9WnVzYW1tZW5mYXNzdW5nZW4gdm9uIFJvbGxlbmdydXBwZW4NCi1GaWx0ZXJDb25zdGFudHNfdGFza2Rlc2NyaXB0b3JzX3RleHQ9QXVmZ2FiZW5kZXNrcmlwdG9yZW4NCi1GaWx0ZXJDb25zdGFudHNfY29udGVudGVsZW1lbnRzX3RleHQ9SW5oYWx0c2VsZW1lbnRlDQotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9wcmVwYXJlPVN5bmNocm9uaXNhdGlvbiB3aXJkIHZvcmJlcmVpdGV0Li4uDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcnNfdGV4dD1BcmJlaXRzZXJnZWJuaXNkZXNrcmlwdG9yZW4NCi1GaWx0ZXJDb25zdGFudHNfYWxsY29udGVudGVsZW1lbnRzX3RleHQ9QWxsZSBJbmhhbHRzZWxlbWVudGUNCi1GaWx0ZXJDb25zdGFudHNfc3VwcG9ydGluZ21hdGVyaWFsc190ZXh0PVVudGVyc3RcdTAwZmN0emVuZGVzIE1hdGVyaWFsDQotTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfZXJyb3JTYXZpbmdGaWxlcz1GZWhsZXIgYmVpbSBTcGVpY2hlcm4gZGVyIERhdGVpKGVuKQ0KLUZpbHRlckNvbnN0YW50c19jdXN0b21jYXRlZ29yaWVzX3RleHQ9QW5nZXBhc3N0ZSBLYXRlZ29yaWVuDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0dHlwZXNfdGV4dD1BcnRlbiB2b24gQXJiZWl0c2VyZ2Vibmlzc2VuDQotRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRfd2FybmluZ01zZz1MXHUwMGY2c2Nodm9yZ2FuZyBtaXQgV2FybnVuZyBhYmdlc2NobG9zc2VuDQotRmlsdGVyQ29uc3RhbnRzX21ldGhvZHBsdWdpbnNfdGV4dD1NZXRob2Rlbi1QbHVnLWlucw0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9sb2NrZWRQbHVnaW49SVVQTDAxMjBFOiBEYXMgUGx1Zy1pbiAnJ3swfScnIGlzdCBnZXNwZXJydC4NCi1GaWx0ZXJDb25zdGFudHNfZG9tYWluc190ZXh0PURvbVx1MDBlNG5lbg0KLUZpbHRlckNvbnN0YW50c19yb2FkbWFwX3RleHQ9Um9hZG1hcHMNCi1GaWx0ZXJDb25zdGFudHNfcmVwb3J0c190ZXh0PUJlcmljaHRlDQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9sYWJlbD0mU3RhbmRhcmRzeW5jaHJvbmlzYXRpb25zIGF1cyBNZXRob2RlbmluaGFsdA0KLU1hbnVhbFN5bmNocm9uaXplQ29tbWFuZF9sYWJlbD1BbmdlcGFzc3RlIFN5bmNocm9uJmlzYXRpb24uLi4NCi1BdXRvU3luY2hyb25pemVDb21tYW5kX3N1Y2Vzc2Z1bD1EaWUgU3luY2hyb25pc2F0aW9uIHd1cmRlIGZlaGxlcmZyZWkgZHVyY2hnZWZcdTAwZmNocnQuDQotDQotIyBVc2VySW50ZXJhY3Rpb25IZWxwZXINCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfUHJvY2Vzc1BhY2thZ2VfTmFtZT1OYW1lOg0KLQ0KLSMgTWV0aG9kQ3JlYXRlQ2hpbGRDb21tYW5kDQotbmV3RWxlbWVudF90ZXh0PXswfSAtIE5ldQ0KLXVwZGF0ZV9vdXRvZnN5bmNoX3RpdGxlPUFrdHVhbGlzaWVydW5nc2tvbmZsaWt0DQotdXBkYXRlX291dG9mc3luY2hfbXNnPURpZSBEYXRlaShlbikgd3VyZGUobikgaW0gRGF0ZWlzeXN0ZW0gZ2VcdTAwZTRuZGVydC4gTVx1MDBmNmNodGVuIFNpZSBkaWUgXHUwMGM0bmRlcnVuZ2VuIHNwZWljaGVybj8NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTJiMGY4Yy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgR2VuZXJpYyBEaWFsb2cgVGl0bGVzDQotbW92ZURpYWxvZ190aXRsZT1Nb3Zlcg0KLWRlbGV0ZURpYWxvZ190aXRsZT1TdXByaW1pciBlbGVtZW50bw0KLWVycm9yRGlhbG9nX3RpdGxlPUVycm9yDQotZXJyb3JEaWFsb2dfY2Fubm90UmVuYW1lPU5vIHNlIHB1ZWRlIGNhbWJpYXIgZWwgbm9tYnJlIGRlIHswfSAnJ3sxfScnIHBvciAnJ3syfScnLiBTb2x1Y2lvbmUgZWwgcHJvYmxlbWEgcXVlIHNlIG11ZXN0cmEgZW4gZGV0YWxsZXMgeSBwdWxzZSBBY2VwdGFyIHBhcmEgY29udGludWFyIG8gQ2FuY2VsYXIgcGFyYSBjYW5jZWxhciBsYSBvcGVyYWNpXHUwMGYzbiBhbm9ybWFsbWVudGUuDQotDQotIyBDb25maXJtIFJlZmVyZW5jZXMgUmVtb3ZhbCBEaWFsb2cNCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RpdGxlPUNvbmZpcm1hciBlbGltaW5hY2lcdTAwZjNuIGRlIHJlZmVyZW5jaWFzDQotZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190ZXh0PUVsIGVsZW1lbnRvIHF1ZSBlc3RcdTAwZTEgYSBwdW50byBkZSBzdXByaW1pciB0b2Rhdlx1MDBlZGEgdGllbmUgcmVmZXJlbmNpYXMgZGUgb3Ryb3MgZWxlbWVudG9zIGRlIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLiBTaSBzdXByaW1lIGVzdG9zIGVsZW1lbnRvcywgc2Ugc3VwcmltaXJcdTAwZTFuIHRvZGFzIGxhcyByZWZlcmVuY2lhcyBhIGVsbG9zLCBwb3IgbG8gcXVlIHRhbWJpXHUwMGU5biBzZSBhY3R1YWxpemFyXHUwMGUxbiBsb3MgZWxlbWVudG9zIHF1ZSBoYWNlbiBsYSByZWZlcmVuY2lhLiAgQXNlZ1x1MDBmYXJlc2UgZGUgcXVlIHRpZW5lIHBlcm1pc28gcGFyYSBhY3R1YWxpemFyIGxvcyBlbGVtZW50b3MgcXVlIGhhY2VuIHJlZmVyZW5jaWEgYW50ZXMgZGUgcHVsc2FyIEFjZXB0YXIuICBQdWxzZSBEZXRhbGxlcyBwYXJhIHJldmlzYXIgbGEgbGlzdGEgZGUgZWxlbWVudG9zIHF1ZSBoYWNlbiByZWZlcmVuY2lhIGFsIGVsZW1lbnRvIHF1ZSB2YSBhIHN1cHJpbWlyLg0KLQ0KLSMgUmVzb2x2ZSBOYW1lIENvbmZsaWN0IERpYWxvZw0KLXJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGl0bGU9UmVzb2x2ZXIgY29uZmxpY3RvIGRlIG5vbWJyZXMgZGUgZWxlbWVudG8NCi1yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RleHQ9RXNjcmliYSB1biB7MH0gbnVldm8gcGFyYSAnJ3sxfScnOg0KLQ0KLSMgU2VsZWN0IERlbGl2ZXJhYmxlcyBEaWFsb2cNCi1zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGl0bGU9U2VsZWNjaW9uYXIgcHJvZHVjdG9zIGZpbmFsZXMNCi1zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGV4dD1TZWxlY2Npb25lIHVuIHByb2R1Y3RvIGZpbmFsIGRvbmRlIGRlc2VlIHF1ZSBzZSBhc2lnbmUgZWwgcHJvZHVjdG8gZGUgdHJhYmFqbyAnJ3swfScnLg0KLQ0KLSMgTmV3IFByb2Nlc3MgQ29tcG9uZW50IERpYWxvZw0KLW5ld1Byb2Nlc3NDb21wb25lbnREaWFsb2dfdGl0bGU9TnVldm8gY29tcG9uZW50ZSBkZWwgcHJvY2Vzbw0KLW5hbWVMYWJlbF90ZXh0PU5vbWJyZToNCi1kZWZhdWx0Q29uZmlnTGFiZWxfdGV4dD1Db25maWd1cmFjaVx1MDBmM24gcG9yIG9taXNpXHUwMGYzbjoNCi1iYXNlUHJvY2Vzc0xhYmVsX3RleHQ9UHJvY2VzbyBiXHUwMGUxc2ljbzoNCi1iYXNlZE9uUHJvY2Vzc2VzTGFiZWxfdGV4dD1CYXNhZG8gZW4gcHJvY2Vzb3M6DQotDQotIyBSb2xlIEFzc29jaWF0aW9uIERpYWxvZw0KLXNlbGVjdEFzc29jaWF0aW9uTGFiZWxfdGV4dD1TZWxlY2Npb25lIHVuYSBhc29jaWFjaVx1MDBmM24gcGFyYSBsYSB0YXJlYSAnJ3swfScnDQotDQotIyBSZW1vdmUgQXNzb2NpYXRpb24gZGlhbG9nDQotcmVtb3ZlQXNzb2NpYXRpb25EaWFsb2dfdGV4dD1FbGltaW5hciBhc29jaWFjaVx1MDBmM24NCi0NCi0jIFNlbGVjdCBUZWFtcyBEaWFsb2cNCi1zZWxlY3RUZWFtc0RpYWxvZ190aXRsZT1TZWxlY2Npb25hciBlcXVpcG9zDQotc2VsZWN0VGVhbXNEaWFsb2dfdGV4dD1TZWxlY2Npb25lIHVuIGVxdWlwbyBkb25kZSBkZXNlZSBxdWUgc2UgYXNpZ25lIHVuIHJvbCAnJ3swfScnLg0KLQ0KLSMgVGFzbCBTZWxlY3Rpb24gRGlhbG9nDQotdGFza1NlbGVjdGlvbkRpYWxvZ190aXRsZT1TZWxlY2NpXHUwMGYzbiBkZSB0YXJlYXMNCi10aXRsZUxhYmVsX3RleHQ9U2VsZWNjaW9uZSBsYXMgdGFyZWFzLi4uDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQTDAxMDBFOiBGYWx0YSBlbCBub21icmUgZGUgezB9LlxuXG5Ub2RvcyBsb3MgZWxlbWVudG9zIGRlIHByb2Nlc28geSBtXHUwMGU5dG9kbyBkZWJlbiB0ZW5lciB1biBub21icmUuXG5cbkVzY3JpYmEgdW4gbm9tYnJlIHZcdTAwZTFsaWRvIHkgdnVlbHZhIGEgaW50ZW50YXJsby4NCi1lbXB0eUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZz1FbCBub21icmUgbm8gcHVlZGUgZXN0YXIgdmFjXHUwMGVkby4gRXNwZWNpZmlxdWUgdW4gbm9tYnJlIHZcdTAwZTFsaWRvLg0KLWR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEwwMTAxRTogRWwgbm9tYnJlICcnezB9JycgeWEgZXhpc3RlLiBcblxuVW4gZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gZGViZSB0ZW5lciB1biBub21icmUgZXhjbHVzaXZvLlxuXG5Fc2NyaWJhIHVuIG5vbWJyZSBkaWZlcmVudGUgeSB2dWVsdmEgYSBpbnRlbnRhcmxvLg0KLWR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZz1ZYSBleGlzdGUgZWwgbWlzbW8gbm9tYnJlIGRlIGVsZW1lbnRvLiBFc3BlY2lmaXF1ZSBvdHJvIG5vbWJyZS4NCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjFfbXNnPUlVUEwwMTAyRTogRWwgbm9tYnJlICcnezB9Jycgbm8gZXMgdlx1MDBlMWxpZG8uXG5cblVuIG5vbWJyZSBkZSBlbGVtZW50byBkZSBtXHUwMGU5dG9kbyBubyBwdWVkZSBlbXBlemFyIGNvbiB1biBlc3BhY2lvLlxuXG5Fc2NyaWJhIHVuIG5vbWJyZSB2XHUwMGUxbGlkbyB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotaW52YWxpZEVsZW1lbnROYW1lRXJyb3IyX21zZz1JVVBMMDEwM0U6IEVsIG5vbWJyZSAnJ3swfScnIG5vIGVzIHZcdTAwZTFsaWRvLlxuXG5VbiBub21icmUgZGUgZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gbm8gcHVlZGUgdGVybWluYXIgY29uIHVuIHB1bnRvLlxuXG5Fc2NyaWJhIHVuIG5vbWJyZSB2XHUwMGUxbGlkbyB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotaW52YWxpZEVsZW1lbnROYW1lRXJyb3IzX21zZz1JVVBMMDEwNEU6IEVsIG5vbWJyZSAnJ3swfScnIG5vIGVzIHZcdTAwZTFsaWRvLlxuXG5VbiBub21icmUgZGUgZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gbm8gcHVlZGUgY29udGVuZXIgZXN0b3MgY2FyYWN0ZXJlczogXFwgLyA6ICogPyAiIDwgPiA7IHxcblxuRXNjcmliYSB1biBub21icmUgdlx1MDBlMWxpZG8geSB2dWVsdmEgYSBpbnRlbnRhcmxvLg0KLW5vQ29uZmlnRXJyb3JfbXNnPUlVUEwwMTA1RTogTGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgYWN0dWFsIG5vIGNvbnRpZW5lIG5pbmd1bmEgY29uZmlndXJhY2lcdTAwZjNuIGRlIG1cdTAwZTl0b2RvLlxuXG5FcyBuZWNlc2FyaWEgdW5hIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kbyBwYXJhIGNyZWFyIHVuIHByb2Nlc28gbnVldm8uXG5cbkNyZWUgdW5hIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kbyB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotbm9EZWxpdmVyeVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDZFOiBMYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBhY3R1YWwgbm8gY29udGllbmUgbmluZ1x1MDBmYW4gcHJvY2VzbyBkZSBlbnRyZWdhLlxuXG5FcyBuZWNlc2FyaW8gdW4gcHJvY2VzbyBkZSBlbnRyZWdhIGJcdTAwZTFzaWNvIHBhcmEgY3JlYXIgdW5hIGNvbnRyaWJ1Y2lcdTAwZjNuIG51ZXZhIGFsIHByb2Nlc28uXG5cbkNyZWUgdW4gcHJvY2VzbyBkZSBlbnRyZWdhIHkgdnVlbHZhIGEgaW50ZW50YXJsby4NCi1ub0RlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQTDAxMDdFOiBObyBzZSBoYSBzZWxlY2Npb25hZG8gbmluZ3VuYSBjb25maWd1cmFjaVx1MDBmM24gZGUgbVx1MDBlOXRvZG8uXG5cbkRlYmUgYXNpZ25hciB1bmEgY29uZmlndXJhY2lcdTAwZjNuIGRlIG1cdTAwZTl0b2RvIHBvciBvbWlzaVx1MDBmM24gYWwgcHJvY2VzbyBudWV2by5cblxuU2VsZWNjaW9uZSB1bmEgY29uZmlndXJhY2lcdTAwZjNuIGRlIG1cdTAwZTl0b2RvIHkgdnVlbHZhIGEgaW50ZW50YXJsby4NCi1ub0Jhc2VQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA4RTogTm8gc2UgaGEgc2VsZWNjaW9uYWRvIG5pbmdcdTAwZmFuIHByb2Nlc28gZGUgZW50cmVnYS5cblxuVW5hIGNvbnRyaWJ1Y2lcdTAwZjNuIGFsIHByb2Nlc28gcmVxdWllcmUgdW4gcHJvY2VzbyBkZSBlbnRyZWdhIGJcdTAwZTFzaWNvLlxuXG5TZWxlY2Npb25lIHVuIHByb2Nlc28gZGUgZW50cmVnYSB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotY3JlYXRlUHJvY2Vzc0Vycm9yX21zZz1JVVBMMDEwOUU6IE5vIHNlIHB1ZWRlIGNyZWFyIGVsIHByb2Nlc28gc2F0aXNmYWN0b3JpYW1lbnRlLg0KLWNyZWF0ZUVsZW1lbnRFcnJvcl9tc2c9SVVQTDAxMTBFOiBObyBzZSBwdWVkZSBjcmVhciBlbCBlbGVtZW50byBzYXRpc2ZhY3RvcmlhbWVudGUuDQotZGVsZXRlRWxlbWVudEVycm9yX21zZz1JVVBMMDExMUU6IE5vIHNlIHB1ZWRlIHN1cHJpbWlyIGVsIGVsZW1lbnRvIHNhdGlzZmFjdG9yaWFtZW50ZS4NCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX21zZz1JVVBMMDExMkU6IE5vIHNlIHB1ZWRlIGNyZWFyIGVsIGFyY2hpdm8gZGUgY29udGVuaWRvIHBhcmEgZWwgZWxlbWVudG8uXG5cbllhIGV4aXN0ZSB1biBhcmNoaXZvICcnezB9JycuXG5cbkVzY3JpYmEgdW4gbm9tYnJlIGRpZmVyZW50ZSB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotZHVwbGljYXRlQ29udGVudEZpbGVFcnJvcl9zaW1wbGVfbXNnPVlhIGV4aXN0ZSB1biBhcmNoaXZvIGRlIGNvbnRlbmlkbyBjb24gZWwgbWlzbW8gbm9tYnJlLiBFc3BlY2lmaXF1ZSBvdHJvIG5vbWJyZS4NCi11bmRvQ29tbWFuZEVycm9yX21zZz1JVVBMMDExM0U6IEVsIG1hbmRhdG8gZGUgZGVzaGFjZXIgJyd7MH0nJyBubyBzZSBwdWVkZSBjb21wbGV0YXIuXG5cblNlIGhhIHByb2R1Y2lkbyB1biBlcnJvcjogezF9DQotaW52YWxpZFByZWRlY2Vzc29yRXJyb3JfbXNnPUlVUEwwMTE0RTogRWwgXHUwMGVkbmRpY2UgZGUgcHJlZGVjZXNvciBlc3BlY2lmaWNhZG8gbm8gZXMgdlx1MDBlMWxpZG8uXG5cblVuIFx1MDBlZG5kaWNlIGRlIHByZWRlY2Vzb3IgZGViZSBzZXIgdW4gdmFsb3IgZW50ZXJvIGRlIGxhIGNvbHVtbmEgJ1x1MDBjZG5kaWNlJy5cblxuRXNwZWNpZmlxdWUgdW4gdmFsb3Igdlx1MDBlMWxpZG8geSB2dWVsdmEgYSBpbnRlbnRhcmxvLg0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHM9SVVQTDAxMDBXOiAnJ3swfScnIHlhIGVzdFx1MDBlMSBhc29jaWFkbyBhICcnezF9JycuICBTXHUwMGYzbG8gc2UgcGVybWl0ZSB1bmEgYXNvY2lhY2lcdTAwZjNuIGRlIGVzdGEgY2xhc2UuICBQYXJhIGFzaWduYXIgJyd7MH0nJyBhICcnezJ9JycsIGFudGVzIGRlYmUgZWxpbWluYXJsbyBkZSAnJ3sxfScnLg0KLWVycm9yX21zZ1dpdGhEZXRhaWxzPUlVUEwwMTE2RTogU2UgaGEgcHJvZHVjaWRvIHVuIGVycm9yLiBQdWxzZSBlbiBEZXRhbGxlcyBwYXJhIG9idGVuZXIgbVx1MDBlMXMgaW5mb3JtYWNpXHUwMGYzbi4NCi1lcnJvcl9tc2c9SVVQTDAxMTdFOiBTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IuIENvbnN1bHRlIGVsIHJlZ2lzdHJvIGRlIGVycm9yZXMgcGFyYSBvYnRlbmVyIG1cdTAwZTFzIGRldGFsbGVzLg0KLVN1cHByZXNzaW9uX25hbWVEdXBsaWNhdGlvbj1JVVBMMDExOEU6IFNlIHByb2R1Y2UgdW4gY29uZmxpY3RvIGRlIG5vbWJyZXMgZGVzcHVcdTAwZTlzIGRlIGVzdGEgb3BlcmFjaVx1MDBmM24uIENvbXBydWViZSBlbCBub21icmUgZGVsIGVsZW1lbnRvIHBhcmEgdmVyIGxhIGR1cGxpY2FjaVx1MDBmM24geSB2dWVsdmEgYSBpbnRlbnRhcmxvDQotU3VwcHJlc3Npb25fcHJlc2VudGF0aW9uTmFtZUR1cGxpY2F0aW9uPUlVUEwwMTE5RTogU2UgcHJvZHVjZSB1biBjb25mbGljdG8gZGUgbm9tYnJlcyBkZXNwdVx1MDBlOXMgZGUgZXN0YSBvcGVyYWNpXHUwMGYzbi4gQ29tcHJ1ZWJlIGVsIG5vbWJyZSBkZSBwcmVzZW50YWNpXHUwMGYzbiBkZWwgZWxlbWVudG8gcGFyYSB2ZXIgbGEgZHVwbGljYWNpXHUwMGYzbiB5IHZ1ZWx2YSBhIGludGVudGFybG8NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249U2UgaGEgcHJvZHVjaWRvIHVuIGVycm9yLiBQdWxzZSBlbiBEZXRhbGxlcyBwYXJhIG9idGVuZXIgbVx1MDBlMXMgaW5mb3JtYWNpXHUwMGYzbi4NCi1zYXZlUHJvY2Vzc0Vycm9yX3JlYXNvbj1TZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgZ3VhcmRhciBlbCBwcm9jZXNvICcnezB9JycuIFB1bHNlIGVuIERldGFsbGVzIHBhcmEgb2J0ZW5lciBtXHUwMGUxcyBpbmZvcm1hY2lcdTAwZjNuLg0KLWRlbGV0ZVJlZmVyZW5jZXNFcnJvcl9yZWFzb249U2UgaGEgcHJvZHVjaWRvIHVuIGVycm9yIGFsIGVsaW1pbmFyIGxhcyByZWZlcmVuY2lhcyBhc29jaWFkYXMgYSBlc3RlIGVsZW1lbnRvLiBQdWxzZSBlbiBEZXRhbGxlcyBwYXJhIG9idGVuZXIgbVx1MDBlMXMgaW5mb3JtYWNpXHUwMGYzbi4NCi1zYXZlRmlsZUVycm9yX3JlYXNvbj1TZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgZ3VhcmRhciBlbCBhcmNoaXZvICcnezB9JycuIFB1bHNlIGVuIERldGFsbGVzIHBhcmEgb2J0ZW5lciBtXHUwMGUxcyBpbmZvcm1hY2lcdTAwZjNuLg0KLWludmFsaWRSZWZlcmVuY2VzRXJyb3JfcmVhc29uPVNlIGhhbiBkZXRlY3RhZG8gZWxlbWVudG9zIGRlIG1cdTAwZTl0b2RvIGNvbiByZWZlcmVuY2lhcyBubyB2XHUwMGUxbGlkYXMgY29tbyByZXN1bHRhZG8gZGUgbGEgY29waWEgZGUgcGx1Zy1pbnMgY3J1emFkb3MuXG5Fc3RhcyByZWZlcmVuY2lhcyBzZSBoYW4gZWxpbWluYWRvLiBcdTAwYmZEZXNlYSBjb250aW51YXI/DQotdW5yZXNvbHZlZE9iamVjdEVycm9yX3JlYXNvbj1ObyBzZSBwdWVkZSBtb2RpZmljYXIgdW4gb2JqZXRvIHNpbiByZXNvbHZlcjogezB9KFVSSSA9IHsxfSl7Mn0NCi0NCi0jIFdhcm5pbmcgbWVzc2FnZXMNCi1NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c9SVVQTDAxMThXOiBObyBzZSBoYSBwb2RpZG8gZW5jb250cmFyIHVubyBvIG1cdTAwZTFzIGVsZW1lbnRvcyBkZSBvcmlnZW4uIExvcyBhcmNoaXZvcyBhc29jaWFkb3MgZGUgbGEgY2FycGV0YSBkZSByZWN1cnNvcyBubyBzZSBjb3BpYXJcdTAwZTFuLg0KLUFjdGl2aXR5QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c9SVVQTDAxMTlXOiBObyBzZSBoYSBwb2RpZG8gZW5jb250cmFyIHVubyBvIG1cdTAwZTFzIGVsZW1lbnRvcyBkZSBvcmlnZW4uIExvcyBwYXF1ZXRlcyBkZSBwcm9jZXNvIGFzb2NpYWRvcyBubyBzZSBjb3BpYXJcdTAwZTFuLg0KLUFjdGl2aXR5RHJvcENvbW1hbmRfZGVlcENvcHlfcHJvbXB0Q29uZmlndXJhdGlvbk1zZz1cdTAwYmZEZXNlYSBjb3BpYXIgdG9kb3MgbG9zIGRlc2NyaXB0b3Jlcz9cblxuU2kgcHVsc2EgZW4gTm8gc2UgY29waWFyXHUwMGUxbiBzXHUwMGYzbG8gbG9zIGRlc2NyaXB0b3JlcyBxdWUgZm9ybWVuIHBhcnRlIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBhY3R1YWwuDQotZGVlcENvcHlfcHJvbXB0TXNnPU9idGVuZHJcdTAwZTEgdW5hIGNvcGlhIGRlIHRvZG9zIGxvcyBlbGVtZW50b3MgZW5sYXphZG9zIGRlIGZvcm1hIGRpblx1MDBlMW1pY2EgcXVlIHRlbmdhIHF1ZSBtYW50ZW5lciBwb3Igc2VwYXJhZG8gZGUgYWhvcmEgZW4gYWRlbGFudGUuIFx1MDBiZkRlc2VhIGNvbnRpbnVhcj8NCi1kZWVwQ29weV90aXRsZT1Db3BpYSBlbiBwcm9mdW5kaWRhZA0KLQ0KLSMgUHJvZ3Jlc3MgbWVzc2FnZXMNCi1jcmVhdGluZ1Byb2Nlc3NDb21wb25lbnRUYXNrX25hbWU9Q3JlYW5kbyBjb21wb25lbnRlIGRlbCBwcm9jZXNvICcnezB9JycuLi4NCi1wcm9jZXNzaW5nUmVmZXJlbmNlc1Rhc2tfbmFtZT1Qcm9jZXNhbmRvIHJlZmVyZW5jaWFzLi4uDQotZGVsZXRpbmdFbGVtZW50c1Rhc2tfbmFtZT1TdXByaW1pZW5kbyBlbGVtZW50b3MgeSBhcmNoaXZvcyBhc29jaWFkb3MuLi4NCi1jaGVja2luZ1JlZmVyZW5jZXNUYXNrX25hbWU9Q29tcHJvYmFuZG8gcmVmZXJlbmNpYXMuLi4NCi1yZW1vdmluZ1JlZmVyZW5jZXN0YXNrX25hbWU9RWxpbWluYW5kbyByZWZlcmVuY2lhcy4uLg0KLXNhdmluZ01vZGlmaWVkRmlsZXNUYXNrX25hbWU9R3VhcmRhbmRvIGFyY2hpdm8ocykgbW9kaWZpY2FkbyhzKS4uLg0KLWNoZWNrQWZmZWN0ZWRSZXNvdXJjZXNUYXNrX25hbWU9Q29tcHJvYmFuZG8gbG9zIHJlY3Vyc29zIGFmZWN0YWRvcy4uLg0KLW1vdmluZ1Rhc2tfbmFtZT1Nb3ZpZW5kby4uLg0KLW1vdmluZ0ZpbGVzVGFza19uYW1lPU1vdmllbmRvIGFyY2hpdm9zLi4uDQotY29weWluZ1Jlc291cmNlc1Rhc2tfbmFtZT1Db3BpYW5kbyByZWN1cnNvcy4uLg0KLWNvcHlpbmdBY3Rpdml0aWVzX21zZz1Db3BpYW5kbyBhY3RpdmlkYWQgJyd7MH0nJw0KLXNhdmluZ0ZpbGVUYXNrX25hbWU9R3VhcmRhbmRvIGVsIGFyY2hpdm8gJyd7MH0nJy4uLg0KLQ0KLSMgVUkgVGV4dA0KLWVsZW1lbnRfdGV4dD1lbGVtZW50bw0KLWNyZWF0ZUVsZW1lbnRfdGV4dD1DcmVhciBlbGVtZW50bw0KLWNyZWF0ZVByb2Nlc3NfdGV4dD1DcmVhciBwcm9jZXNvDQotY29udHJpYnV0ZXNUb190ZXh0PUNvbnRyaWJ1eWUgYQ0KLWxvY2FsQ29udHJpYnV0ZXNUb190ZXh0PUNvbnRyaWJ1eWUgbG9jYWxtZW50ZSBhDQotZXh0ZW5kc190ZXh0PUFtcGxcdTAwZWRhDQotcmVwbGFjZXNfdGV4dD1SZWVtcGxhemENCi1sb2NhbFJlcGxhY2VzX3RleHQ9U3VzdGl0dXllIGxvY2FsbWVudGUNCi1sb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHlfdGV4dD1TdXN0aXR1Y2lcdTAwZjNuIGxvY2FsIHkgY29waWEgZW4gcHJvZnVuZGlkYWQNCi1lbGVtZW50VHlwZV90ZXh0PXswfTogezF9DQotZGVsaXZlcmFibGVzX3RleHQ9UHJvZHVjdG9zIGZpbmFsZXMNCi1jb250cmlidXRlVG9BY3Rpdml0eV90ZXh0PUNvbnRyaWJ1aXIgYSBsYSBhY3RpdmlkYWQNCi1BY3Rpdml0eURyb3BDb21tYW5kX2xhYmVsPVNvbHRhciBhY3RpdmlkYWQNCi1yZXBsYWNlQWN0aXZpdHlfdGV4dD1SZWVtcGxhemFyIGFjdGl2aWRhZA0KLWZpbGVfdGV4dD1hcmNoaXZvDQotZGlyZWN0b3J5X3RleHQ9ZGlyZWN0b3Jpbw0KLXVucmVzb2x2ZWRfdGV4dD0oJyd7MH0nJyBzaW4gcmVzb2x2ZXIpDQotYXNzaXN0c190ZXh0PUF5dWRhIGENCi11bmtub3duX3RleHQ9RGVzY29ub2NpZG8NCi1jb21tYW5kX2RvbmU9VGVybWluYWRvDQotDQotIyBUaGUgZm9sbG93aW5nIFVJIHRleHQgc2hvdWxkIGJlIHJldmlld2VkLg0KLVV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5d2l0aHBsdWdpbl9pbmZvPXswfSAoezF9ICcnezJ9JycgZW4gJyd7M30nJykNCi1VdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eV9pbmZvPXswfSAoezF9ICcnezJ9JycpDQotdWlfcmVmX2RlbGV0ZT1FbCBkZXNjcmlwdG9yICcnezB9JycgdGllbmUgbGFzIHNpZ3VpZW50ZXMgcmVmZXJlbmNpYXMgcXVlIG5vIHNlIHV0aWxpemFuIGVuIG5pbmdcdTAwZmFuIHNpdGlvLlxuU2VsZWNjaW9uZSBsYXMgcXVlIGRlc2VlIHN1cHJpbWlyOg0KLXVpX3JlZl9kZWxldGUyPUxhcyByZWZlcmVuY2lhcyBzaWd1aWVudGVzIG5vIHNlIHV0aWxpemFuIGVuIG5pbmd1bmEgcGFydGUuXG5TZWxlY2Npb25lIGxhcyBxdWUgZGVzZWUgc3VwcmltaXI6DQotdWlfcmVmZXJlbmNlcz1SZWZlcmVuY2lhcw0KLXVpX3dvcmtwcm9kdWN0X2Rlc2NyaXB0b3JfZGVzY3JpcHRpb249RWwgZGVzY3JpcHRvciBkZSBwcm9kdWN0b3MgZGUgdHJhYmFqbyAnJ3swfScnIGVzdFx1MDBlMSBhc29jaWFkbyAoU2FsaWRhIGRlKSBjb24gZWwgZGVzY3JpcHRvciBkZSB0YXJlYXMgJyd7MX0nJw0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vcHRpb25zPU9wY2lvbmVzDQotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX291dHB1dGxhYmVsPUVsaW1pbmFyIGVsIGRlc2NyaXB0b3IgZGUgcHJvZHVjdG9zIGRlIHRyYWJham8gY29tbyBzYWxpZGEgZGVsIGRlc2NyaXB0b3IgZGUgdGFyZWFzDQotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX2RlbGV0ZV90YXNrPVN1cHJpbWlyIGVsIGRlc2NyaXB0b3IgZGUgdGFyZWFzIGRlIGxhIGFjdGl2aWRhZA0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9kZWZhdWx0Y29uZmlnY2hlY2s9RWwgZWxlbWVudG8gc2VsZWNjaW9uYWRvICcnezB9Jycgbm8gc2UgZW5jdWVudHJhIGVuIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBwb3Igb21pc2lcdTAwZjNuIGRlbCBwcm9jZXNvLlxuXHUwMGJmRGVzZWEgYVx1MDBmMWFkaXIgZWwgZWxlbWVudG8geSBzdXMgZGVwZW5kZW5jaWFzIGEgbGEgY29uZmlndXJhY2lcdTAwZjNuIHBvciBvbWlzaVx1MDBmM24/DQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX2dlbmVyaWNFcnJfbWVzc2FnZV90ZXh0PVNlIGhhbiBwcm9kdWNpZG8gZXJyb3JlcyBkdXJhbnRlIGxhIG9wZXJhY2lcdTAwZjNuLiBQdWxzZSBlbiBEZXRhbGxlcyBwYXJhIG9idGVuZXIgbVx1MDBlMXMgaW5mb3JtYWNpXHUwMGYzbg0KLVByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fbm9EZXNjcmlwdG9yVG9TeW5jaD1ObyBzZSBoYSBlbmNvbnRyYWRvIG5pbmdcdTAwZmFuIGRlc2NyaXB0b3IgY29uIGVsZW1lbnRvIGRlIG1cdTAwZTl0b2RvIGVubGF6YWRvIHBhcmEgc2luY3Jvbml6YXINCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9yZWZlcnNoaW5ndmlld2VyPVNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCByZW5vdmFyIGVsIHZpc29yDQotY29uZmlybV9yZW1vdmVfcmVmZXJlbmNlc190ZXh0PVB1ZWRlIHF1ZSBsb3MgZWxlbWVudG9zIGxpc3RhZG9zIGVuIERldGFsbGVzIHRlbmdhbiByZWZlcmVuY2lhcyBubyB2XHUwMGUxbGlkYXMgYSBlc3RhIGd1XHUwMGVkYSwgZGVzcHVcdTAwZTlzIGRlIGxhIGNvbnZlcnNpXHUwMGYzbi4gUHVsc2UgQWNlcHRhciBzaSBkZXNlYSBzdXByaW1pcmxvcyB5IGNvbnRpbnVhci4NCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl91bmhhbmRsZWRfZXhjZXB0aW9uPUV4Y2VwY2lcdTAwZjNuIG5vIGNvbnRyb2xhZGENCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX2JyZWFrZG93bl9lbGVtZW50PU5vIHNlIHB1ZWRlIHRlbmVyIGVsIG1pc21vIGVsZW1lbnRvIGRlIGRlc2dsb3NlIGNvbW8gcHJlZGVjZXNvciB5IHN1Y2Vzb3IuDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dwbGlzdGRsZ19tc2c9RWwgcHJvZHVjdG8gZGUgdHJhYmFqbyAnJ3swfScnIGVzIHVuYSBzYWxpZGEgZGUgbGFzIHRhcmVhcyBzaWd1aWVudGVzLlxuU2VsZWNjaW9uZSBsYXMgdGFyZWFzIHBhcmEgbGFzIHF1ZSBkZXNlZSBjcmVhciBsb3MgZGVzY3JpcHRvcmVzIGNvcnJlc3BvbmRpZW50ZXMuDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3JvbGVsaXN0ZGxnX21zZz1FbCByb2wgJyd7MH0nJyB0aWVuZSBsb3Mgc2lndWllbnRlcyBwcm9kdWN0b3MgZGUgdHJhYmFqbyByZXNwb25zYWJsZXMuXG5TZWxlY2Npb25lIGxvcyBwcm9kdWN0b3MgZGUgdHJhYmFqbyBwYXJhIGxvcyBxdWUgZGVzZWUgY3JlYXIgbG9zIGRlc2NyaXB0b3JlcyBjb3JyZXNwb25kaWVudGVzLg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX2ZhdGFsZXJyPUVycm9yIG11eSBncmF2ZQ0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93b3JrcHJvZHVjdHM9UHJvZHVjdG9zIGRlIHRyYWJham8NCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX3N1Yl9lbGVtZW50PU5vIHNlIHB1ZWRlIGVubGF6YXIgdW4gZWxlbWVudG8gZGUgZGVzZ2xvc2UgYSB1bm8gZGUgc3VzIHN1YmVsZW1lbnRvcw0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3dyb25nX2VsZW1lbnQ9QWwgZWxlbWVudG8gc1x1MDBmM2xvIHNlIHB1ZWRlIGVubGF6YXIgZWwgZWxlbWVudG8gZGUgZGVzZ2xvc2UgZGUgdHJhYmFqby4NCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9jaGlsZF9lbGVtZW50PU5vIHNlIHB1ZWRlIGVubGF6YXIgdW4gZWxlbWVudG8gZGUgZGVzZ2xvc2UgYSB1bm8gZGUgc3VzIGhpam9zLg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl90YXNrcz1UYXJlYXMNCi11aV9hc3NvY2lhdGlvbl90YXNrX3NlbGVjdGlvbj1TZWxlY2NpXHUwMGYzbiBkZSB0YXJlYXMuLi4NCi11dGlsX1Byb2Nlc3NVdGlsX2NoaWxkYWRhcHRlcj1cIFwgYWRhcHRhZG9yIGRlbCBoaWpvOg0KLQ0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NldHBhcmVudD1ObyBzZSBoYSBwb2RpZG8gZXN0YWJsZWNlciBlbCBwYWRyZSBkZWwgaGlqbw0KLXV0aWxfdG5ndXRpbF9jYW5ub3RfZWRpdF9yZXNvdXJjZT1ObyBzZSBwdWVkZSBlZGl0YXIgZWwgcmVjdXJzby4NCi11dGlsX1Byb2Nlc3NVdGlsX2NvbnRyaWJ1dGVzdG89Y29udHJpYnV5ZSBhICcnezB9JycNCi11dGlsX1Byb2Nlc3NVdGlsX2xvY2FsQ29udHJpYnV0ZXN0bz1sb2NhbG1lbnRlIGNvbnRyaWJ1eWUgYSAnJ3swfScnDQotcHJvY2Vzc19leHRlbmRzPWFtcGxcdTAwZWRhICcnezB9JycNCi1wcm9jZXNzX3JlcGxhY2VzPXJlZW1wbGF6YSAnJ3swfScnDQotcHJvY2Vzc19sb2NhbFJlcGxhY2VzPWxvY2FsbWVudGUgcmVlbXBsYXphIGEgJyd7MH0nJw0KLSMgRmlsdGVyIGNvbnN0YW50cyBleHRlcm5hbGl6ZWQgc3RyaW5ncy4NCi1GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZXNfdGV4dD1EaXNjaXBsaW5hcw0KLUZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lZ3JvdXBpbmdzX3RleHQ9QWdydXBhY2lvbmVzIGRlIGRpc2NpcGxpbmFzDQotRmlsdGVyQ29uc3RhbnRzX3doaXRlcGFwZXJzX3RleHQ9RG9jdW1lbnRhY2lcdTAwZjNuDQotRmlsdGVyQ29uc3RhbnRzX3Rvb2xtZW50b3JzX3RleHQ9R3VcdTAwZWRhcyBkZSBsYSBoZXJyYW1pZW50YQ0KLUZpbHRlckNvbnN0YW50c190b29sc190ZXh0PUhlcnJhbWllbnRhcw0KLUZpbHRlckNvbnN0YW50c19yb2xlc190ZXh0PVJvbGVzDQotRmlsdGVyQ29uc3RhbnRzX3Rhc2tzX3RleHQ9VGFyZWFzDQotRmlsdGVyQ29uc3RhbnRzX3JldXNhYmxlYXNzZXRzX3RleHQ9QWN0aXZvcyByZXV0aWxpemFibGVzDQotRmlsdGVyQ29uc3RhbnRzX2FsbF90ZXh0PVRvZG9zDQotRmlsdGVyQ29uc3RhbnRzX3Byb2Nlc3Nlc190ZXh0PVByb2Nlc29zDQotRmlsdGVyQ29uc3RhbnRzX3ByYWN0aWNlc190ZXh0PVByXHUwMGUxY3RpY2FzDQotRmlsdGVyQ29uc3RhbnRzX3RlbXBsYXRlc190ZXh0PVBsYW50aWxsYXMNCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RzX3RleHQ9UHJvZHVjdG9zIGRlIHRyYWJham8NCi1GaWx0ZXJDb25zdGFudHNfY2hlY2tsaXN0c190ZXh0PUxpc3RhcyBkZSBjb21wcm9iYWNpXHUwMGYzbg0KLUZpbHRlckNvbnN0YW50c19ndWlkZWxpbmVzX3RleHQ9RGlyZWN0cmljZXMNCi1GaWx0ZXJDb25zdGFudHNfcm9sZXNldHNfdGV4dD1Db25qdW50b3MgZGUgcm9sZXMNCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGFuY2VfdGV4dD1HdVx1MDBlZGENCi1GaWx0ZXJDb25zdGFudHNfY29uY2VwdHNfdGV4dD1Db25jZXB0b3MNCi1GaWx0ZXJDb25zdGFudHNfZXhhbXBsZXNfdGV4dD1FamVtcGxvcw0KLUZpbHRlckNvbnN0YW50c19jb250ZW50cGFja2FnZXNfdGV4dD1QYXF1ZXRlcyBkZSBjb250ZW5pZG8NCi1GaWx0ZXJDb25zdGFudHNfcm9sZWRlc2NyaXB0b3JzX3RleHQ9RGVzY3JpcHRvcmVzIGRlIHJvbGVzDQotRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRncm9wdWluZ3NfdGV4dD1BZ3J1cGFjaW9uZXMgZGVsIGNvbmp1bnRvIGRlIHJvbGVzDQotRmlsdGVyQ29uc3RhbnRzX3Rhc2tkZXNjcmlwdG9yc190ZXh0PURlc2NyaXB0b3JlcyBkZSB0YXJlYQ0KLUZpbHRlckNvbnN0YW50c19jb250ZW50ZWxlbWVudHNfdGV4dD1FbGVtZW50b3MgZGUgY29udGVuaWRvDQotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9wcmVwYXJlPVByZXBhcmFuZG8gbGEgc2luY3Jvbml6YWNpXHUwMGYzbi4uLg0KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdGRlc2NyaXB0b3JzX3RleHQ9RGVzY3JpcHRvcmVzIGRlbCBwcm9kdWN0byBkZSB0cmFiYWpvDQotRmlsdGVyQ29uc3RhbnRzX2FsbGNvbnRlbnRlbGVtZW50c190ZXh0PVRvZG9zIGxvcyBlbGVtZW50b3MgZGUgY29udGVuaWRvDQotRmlsdGVyQ29uc3RhbnRzX3N1cHBvcnRpbmdtYXRlcmlhbHNfdGV4dD1NYXRlcmlhbGVzIGRlIHNvcG9ydGUNCi1NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9lcnJvclNhdmluZ0ZpbGVzPVNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBndWFyZGFyIGVsIGFyY2hpdm8NCi1GaWx0ZXJDb25zdGFudHNfY3VzdG9tY2F0ZWdvcmllc190ZXh0PUNhdGVnb3JcdTAwZWRhcyBwZXJzb25hbGl6YWRhcw0KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHR5cGVzX3RleHQ9Q2xhc2VzIGRlIHByb2R1Y3RvIGRlIHRyYWJham8NCi1EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZF93YXJuaW5nTXNnPVN1cHJlc2lcdTAwZjNuIGZpbmFsaXphZGEgY29uIGF2aXNvDQotRmlsdGVyQ29uc3RhbnRzX21ldGhvZHBsdWdpbnNfdGV4dD1QbHVnLWlucyBkZSBtXHUwMGU5dG9kbw0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9sb2NrZWRQbHVnaW49SVVQTDAxMjBFOiBFbCBwbHVnLWluICcnezB9JycgZXN0XHUwMGUxIGJsb3F1ZWFkby4NCi1GaWx0ZXJDb25zdGFudHNfZG9tYWluc190ZXh0PURvbWluaW9zDQotRmlsdGVyQ29uc3RhbnRzX3JvYWRtYXBfdGV4dD1NYXBhcw0KLUZpbHRlckNvbnN0YW50c19yZXBvcnRzX3RleHQ9SW5mb3JtZXMNCi1BdXRvU3luY2hyb25pemVDb21tYW5kX2xhYmVsPVNpbmNyb25pemFjaVx1MDBmM24gcG9yIG9taXNpXHUwMGYzbiBkZXNkZSBlbCBjb250ZW5pZG8gZGVsIG1cdTAwZTl0b2RvDQotTWFudWFsU3luY2hyb25pemVDb21tYW5kX2xhYmVsPVBlcnNvbmFsaXphciBzaW5jcm9uaXphY2lcdTAwZjNuLi4uDQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9zdWNlc3NmdWw9TGEgc2luY3Jvbml6YWNpXHUwMGYzbiBzZSBoYSBjb21wbGV0YWRvIHNhdGlzZmFjdG9yaWFtZW50ZS4NCi0NCi0jIFVzZXJJbnRlcmFjdGlvbkhlbHBlcg0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9Qcm9jZXNzUGFja2FnZV9OYW1lPU5vbWJyZToNCi0NCi0jIE1ldGhvZENyZWF0ZUNoaWxkQ29tbWFuZA0KLW5ld0VsZW1lbnRfdGV4dD17MH0gbnVldm8NCi11cGRhdGVfb3V0b2ZzeW5jaF90aXRsZT1Db25mbGljdG8gZGUgYWN0dWFsaXphY2lvbmVzDQotdXBkYXRlX291dG9mc3luY2hfbXNnPUVsIGFyY2hpdm8gbyBhcmNoaXZvcyBzZSBoYW4gY2FtYmlhZG8gZW4gZWwgc2lzdGVtYSBkZSBhcmNoaXZvcy4gXHUwMGJmRGVzZWEgc29icmVzY3JpYmlyIGxvcyBjYW1iaW9zPw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YTNjOGZlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBHZW5lcmljIERpYWxvZyBUaXRsZXMNCi1tb3ZlRGlhbG9nX3RpdGxlPURcdTAwZTlwbGFjZXINCi1kZWxldGVEaWFsb2dfdGl0bGU9U3VwcHJpbWVyIHVuIFx1MDBlOWxcdTAwZTltZW50DQotZXJyb3JEaWFsb2dfdGl0bGU9RXJyZXVyDQotZXJyb3JEaWFsb2dfY2Fubm90UmVuYW1lPUltcG9zc2libGUgZGUgcmVub21tZXIgezB9ICcnezF9JycgZW4gJyd7Mn0nJy4gUlx1MDBlOXNvbHZleiBsZSBwcm9ibFx1MDBlOG1lIGFmZmljaFx1MDBlOSBkYW5zIERcdTAwZTl0YWlscyBldCBjbGlxdWV6IHN1ciBPSyBwb3VyIGNvbnRpbnVlciBvdSBzdXIgQW5udWxlciBwb3VyIGFiYW5kb25uZXIgY2V0dGUgb3BcdTAwZTlyYXRpb24uDQotDQotIyBDb25maXJtIFJlZmVyZW5jZXMgUmVtb3ZhbCBEaWFsb2cNCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RpdGxlPUNvbmZpcm1lciBsYSBzdXBwcmVzc2lvbiBkZXMgclx1MDBlOWZcdTAwZTlyZW5jZXMNCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RleHQ9TGUocykgXHUwMGU5bFx1MDBlOW1lbnQocykgcXVlIHZvdXMgXHUwMGVhdGVzIHN1ciBsZSBwb2ludCBkZSBzdXBwcmltZXIgc29udCB0b3Vqb3VycyB1dGlsaXNcdTAwZTlzIHBhciBkJ2F1dHJlcyBcdTAwZTlsXHUwMGU5bWVudHMgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcy4gTGEgc3VwcHJlc3Npb24gZGUgY2VzIFx1MDBlOWxcdTAwZTltZW50cyBlbnRyYVx1MDBlZW5lcmEgbGEgc3VwcHJlc3Npb24gZGUgbGV1cnMgclx1MDBlOWZcdTAwZTlyZW5jZXMgZXQgbWV0dHJhIGRvbmMgXHUwMGUwIGpvdXIgbGVzIFx1MDBlOWxcdTAwZTltZW50cyBkZSByXHUwMGU5Zlx1MDBlOXJlbmNlbWVudC4gIFZcdTAwZTlyaWZpZXogcXVlIHZvdXMgXHUwMGVhdGVzIGF1dG9yaXNcdTAwZTkgXHUwMGUwIG1ldHRyZSBcdTAwZTAgam91ciBsZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIHJcdTAwZTlmXHUwMGU5cmVuY2VtZW50IGF2YW50IGRlIGNsaXF1ZXIgc3VyIE9LLiAgQ2xpcXVleiBzdXIgRFx1MDBlOXRhaWxzIHBvdXIgclx1MDBlOXZpc2VyIGxhIGxpc3RlIGRlcyBcdTAwZTlsXHUwMGU5bWVudHMgdXRpbGlzYW50IGxlKHMpIFx1MDBlOWxcdTAwZTltZW50KHMpIHF1ZSB2b3VzIFx1MDBlYXRlcyBzdXIgbGUgcG9pbnQgZGUgc3VwcHJpbWVyLg0KLQ0KLSMgUmVzb2x2ZSBOYW1lIENvbmZsaWN0IERpYWxvZw0KLXJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGl0bGU9Ulx1MDBlOXNvdWRyZSB1biBjb25mbGl0IGRlIG5vbSBkJ1x1MDBlOWxcdTAwZTltZW50DQotcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0PVNhaXNpc3NleiB1biBub3V2ZWF1IHswfSBwb3VyICcnezF9JycgOg0KLQ0KLSMgU2VsZWN0IERlbGl2ZXJhYmxlcyBEaWFsb2cNCi1zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGl0bGU9U1x1MDBlOWxlY3Rpb25uZXIgbGVzIGxpdnJhYmxlcw0KLXNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190ZXh0PVNcdTAwZTlsZWN0aW9ubmV6IHVuIGxpdnJhYmxlIGRhbnMgbGVxdWVsIHZvdXMgdm91bGV6IGFmZmVjdGVyIGxlIHByb2R1aXQgJyd7MH0nJy4NCi0NCi0jIE5ldyBQcm9jZXNzIENvbXBvbmVudCBEaWFsb2cNCi1uZXdQcm9jZXNzQ29tcG9uZW50RGlhbG9nX3RpdGxlPU5vdXZlYXUgY29tcG9zYW50IGRlIHByb2Nlc3N1cw0KLW5hbWVMYWJlbF90ZXh0PU5vbSA6DQotZGVmYXVsdENvbmZpZ0xhYmVsX3RleHQ9Q29uZmlndXJhdGlvbiBwYXIgZFx1MDBlOWZhdXQgOg0KLWJhc2VQcm9jZXNzTGFiZWxfdGV4dD1Qcm9jZXNzdXMgZGUgYmFzZSA6DQotYmFzZWRPblByb2Nlc3Nlc0xhYmVsX3RleHQ9QmFzXHUwMGU5IHN1ciBsZXMgcHJvY2Vzc3VzIDoNCi0NCi0jIFJvbGUgQXNzb2NpYXRpb24gRGlhbG9nDQotc2VsZWN0QXNzb2NpYXRpb25MYWJlbF90ZXh0PVNcdTAwZTlsZWN0aW9ubmV6IHVuZSBhc3NvY2lhdGlvbiBwb3VyIGxhIHRcdTAwZTJjaGUgJyd7MH0nJw0KLQ0KLSMgUmVtb3ZlIEFzc29jaWF0aW9uIGRpYWxvZw0KLXJlbW92ZUFzc29jaWF0aW9uRGlhbG9nX3RleHQ9U3VwcHJpbWV6IHVuZSBhc3NvY2lhdGlvbg0KLQ0KLSMgU2VsZWN0IFRlYW1zIERpYWxvZw0KLXNlbGVjdFRlYW1zRGlhbG9nX3RpdGxlPVNcdTAwZTlsZWN0aW9ubmVyIGxlcyBcdTAwZTlxdWlwZXMNCi1zZWxlY3RUZWFtc0RpYWxvZ190ZXh0PVNcdTAwZTlsZWN0aW9ubmV6IHVuZSBcdTAwZTlxdWlwZSBcdTAwZTAgbGFxdWVsbGUgdm91cyBzb3VoYWl0ZXogYWZmZWN0ZXIgdW4gclx1MDBmNGxlICcnezB9JycuDQotDQotIyBUYXNsIFNlbGVjdGlvbiBEaWFsb2cNCi10YXNrU2VsZWN0aW9uRGlhbG9nX3RpdGxlPVNcdTAwZTlsZWN0aW9ubmVyIGRlcyB0XHUwMGUyY2hlcw0KLXRpdGxlTGFiZWxfdGV4dD1TXHUwMGU5bGVjdGlvbm5leiBkZXMgdFx1MDBlMmNoZXMuLi4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZz1JVVBMMDEwMEUgOiBMZSBub20gezB9IGVzdCBtYW5xdWFudC5cblxuVG91cyBsZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIG1cdTAwZTl0aG9kZSBldCBkZSBwcm9jZXNzdXMgZG9pdmVudCBhdm9pciB1biBub20uXG5cblNhaXNzZXogdW4gbm9tIHZhbGlkZSBldCByXHUwMGU5ZXNzYXllei4NCi1lbXB0eUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZz1MZSBub20gbmUgcGV1dCBwYXMgXHUwMGVhdHJlIHZpZGUuIFZldWlsbGV6IGluZGlxdWVyIHVuIG5vbSB2YWxpZGUuDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQTDAxMDFFOiBMZSBub20gJyd7MH0nJyBleGlzdGUgZFx1MDBlOWpcdTAwZTAuIFxuXG5VbiBcdTAwZTlsXHUwMGU5bWVudCBkZSBtXHUwMGU5dGhvZGUgZG9pdCBhdm9pciB1biBub20gdW5pcXVlLlxuXG5TYWlzaXNzZXogdW4gYXV0cmUgbm9tIGV0IHJcdTAwZTllc3NheWV6Lg0KLWR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZz1DZSBub20gZCdcdTAwZTlsXHUwMGU5bWVudCBleGlzdGUgZFx1MDBlOWpcdTAwZTAuIENob2lzaXNzZXogdW4gYXV0cmUgbm9tLg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMV9tc2c9SVVQTDAxMDJFIDogTGUgbm9tICcnezB9JycgZXN0IG5vbiB2YWxpZGUuXG5cblVuIG5vbSBkJydcdTAwZTlsXHUwMGU5bWVudCBkZSBtXHUwMGU5dGhvZGUgbmUgcGV1dCBwYXMgY29tbWVuY2VyIHBhciB1biBlc3BhY2UuXG5cblNhaXNzZXogdW4gbm9tIHZhbGlkZSBldCByXHUwMGU5ZXNzYXllei4NCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjJfbXNnPUlVUEwwMTAzRSA6IExlIG5vbSAnJ3swfScnIGVzdCBub24gdmFsaWRlLlxuXG5VbiBub20gZCcnXHUwMGU5bFx1MDBlOW1lbnQgZGUgbVx1MDBlOXRob2RlIG5lIHBldXQgcGFzIHNlIHRlcm1pbmVyIHBhciB1biBwb2ludC5cblxuU2Fpc3NleiB1biBub20gdmFsaWRlIGV0IHJcdTAwZTllc3NheWV6Lg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yM19tc2c9SVVQTDAxMDRFIDogTGUgbm9tICcnezB9JycgZXN0IG5vbiB2YWxpZGUuXG5cblVuIG5vbSBkJydcdTAwZTlsXHUwMGU5bWVudCBkZSBtXHUwMGU5dGhvZGUgbmUgcGV1dCBwYXMgY29udGVuaXIgbGVzIGNhcmFjdFx1MDBlOHJlcyBzdWl2YW50cyA6IFxcIC8gOiAqID8gIiA8ID4gOyB8XG5cblNhaXNpc3NleiB1biBub20gdmFsaWRlIGV0IHJcdTAwZTllc3NheWV6Lg0KLW5vQ29uZmlnRXJyb3JfbXNnPUlVUEwwMTA1RSA6IExhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZW4gY291cnMgbmUgY29udGllbnQgYXVjdW5lIGNvbmZpZ3VyYXRpb24gZGUgbVx1MDBlOXRob2RlLlxuXG5VbmUgY29uZmlndXJhdGlvbiBkZSBtXHUwMGU5dGhvZGUgZXN0IG5cdTAwZTljZXNzYWlyZSBwb3VyIGNyXHUwMGU5ZXIgdW4gbm91dmVhdSBwcm9jZXNzdXMuXG5cbkNyXHUwMGU5ZXogdW5lIGNvbmZpZ3VyYXRpb24gZGUgbVx1MDBlOXRob2RlIGV0IHJcdTAwZTllc3NheWV6Lg0KLW5vRGVsaXZlcnlQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA2RSA6IExhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZW4gY291cnMgbmUgY29udGllbnQgYXVjdW4gcHJvY2Vzc3VzIGRlIGxpdnJhaXNvbi5cblxuVW4gcHJvY2Vzc3VzIGRlIGxpdnJhaXNvbiBkZSBiYXNlIGVzdCBuXHUwMGU5Y2Vzc2FpcmUgcG91ciBjclx1MDBlOWVyIHVuZSBub3V2ZWxsZSBjb250cmlidXRpb24gZGUgcHJvY2Vzc3VzLlxuXG5Dclx1MDBlOWV6IHVuIHByb2Nlc3N1cyBkZSBsaXZyYWlzb24gZXQgclx1MDBlOWVzc2F5ZXouDQotbm9EZWZhdWx0Q29uZmlnRXJyb3JfbXNnPUlVUEwwMTA3RSA6IEF1Y3VuZSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZSBuJ2EgXHUwMGU5dFx1MDBlOSBzXHUwMGU5bGVjdGlvbm5cdTAwZTllLlxuXG5VbmUgY29uZmlndXJhdGlvbiBkZSBtXHUwMGU5dGhvZGUgcGFyIGRcdTAwZTlmYXV0IGRvaXQgXHUwMGVhdHJlIGFmZmVjdFx1MDBlOWUgYXUgbm91dmVhdSBwcm9jZXNzdXMuXG5cblNcdTAwZTlsZWN0aW9ubmV6IHVuZSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZSBldCByXHUwMGU5ZXNzYXllei4NCi1ub0Jhc2VQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA4RSA6IEF1Y3VuIHByb2Nlc3N1cyBkZSBsaXZyYWlzb24gbidhIFx1MDBlOXRcdTAwZTkgc1x1MDBlOWxlY3Rpb25uXHUwMGU5LlxuXG5VbmUgY29udHJpYnV0aW9uIGRlIHByb2Nlc3N1cyByZXF1aWVydCB1biBwcm9jZXNzdXMgZGUgbGl2cmFpc29uIGRlIGJhc2UuXG5cblNcdTAwZTlsZWN0aW9ubmV6IHVuIHByb2Nlc3N1cyBkZSBsaXZyYWlzb24gZXQgclx1MDBlOWVzc2F5ZXouDQotY3JlYXRlUHJvY2Vzc0Vycm9yX21zZz1JVVBMMDEwOUUgOiBJbXBvc3NpYmxlIGRlIGNyXHUwMGU5ZXIgdW4gcHJvY2Vzc3VzLg0KLWNyZWF0ZUVsZW1lbnRFcnJvcl9tc2c9SVVQTDAxMTBFIDogSW1wb3NzaWJsZSBkZSBjclx1MDBlOWVyIHVuIFx1MDBlOWxcdTAwZTltZW50Lg0KLWRlbGV0ZUVsZW1lbnRFcnJvcl9tc2c9SVVQTDAxMTFFIDogSW1wb3NzaWJsZSBkZSBzdXBwcmltZXIgdW4gXHUwMGU5bFx1MDBlOW1lbnQuDQotZHVwbGljYXRlQ29udGVudEZpbGVFcnJvcl9tc2c9SVVQTDAxMTJFIDogSW1wb3NzaWJsZSBkZSBjclx1MDBlOWVyIGxlIGZpY2hpZXIgZGUgY29udGVudSBkZSBsJydcdTAwZTlsXHUwMGU5bWVudC5cblxuVW4gZmljaGllciAnJ3swfScnIGV4aXN0ZSBkXHUwMGU5alx1MDBlMC5cblxuU2Fpc2lzc2V6IHVuIGF1dHJlIG5vbSBldCByXHUwMGU5ZXNzYXllei4NCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX3NpbXBsZV9tc2c9VW4gZmljaGllciBkZSBjb250ZW51IHBvcnRhbnQgbGUgbVx1MDBlYW1lIG5vbSBleGlzdGUgZFx1MDBlOWpcdTAwZTAuIENob2lzaXNzZXogdW4gYXV0cmUgbm9tLg0KLXVuZG9Db21tYW5kRXJyb3JfbXNnPUlVUEwwMTEzRSA6IEltcG9zc2libGUgZCcnYXBwbGlxdWVyIGxhIGNvbW1hbmRlIGQnJ2FubnVsYXRpb24gJyd7MH0nJy5cblxuVW5lIGVycmV1ciBzJydlc3QgcHJvZHVpdGUgOiB7MX0NCi1pbnZhbGlkUHJlZGVjZXNzb3JFcnJvcl9tc2c9SVVQTDAxMTRFIDogTCdpbmRleCBkdSBwclx1MDBlOWRcdTAwZTljZXNzZXVyIHNwXHUwMGU5Y2lmaVx1MDBlOSBlc3Qgbm9uIHZhbGlkZS5cblxuVW4gaW5kZXggZGUgcHJcdTAwZTlkXHUwMGU5Y2Vzc2V1ciBkb2l0IFx1MDBlYXRyZSB1biBlbnRpZXIgZGFucyBsYSBjb2xvbm5lICdJbmRleCcuXG5cblNwXHUwMGU5Y2lmaWV6IHVuZSB2YWxldXIgdmFsaWRlIGV0IHJcdTAwZTllc3NheWV6Lg0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHM9SVVQTDAxMDBXIDogJyd7MH0nJyBlc3QgZFx1MDBlOWpcdTAwZTAgYXNzb2NpXHUwMGU5IFx1MDBlMCAnJ3sxfScnLiAgVW5lIHNldWxlIGFzc29jaWF0aW9uIGRlIGNlIHR5cGUgZXN0IHBlcm1pc2UuICBQb3VyIGFmZmVjdGVyICcnezB9JycgXHUwMGUwICcnezJ9JycsIHZvdXMgZGV2ZXogYXUgcHJcdTAwZTlhbGFibGUgbGUgc3VwcHJpbWVyIGRlICcnezF9JycuDQotZXJyb3JfbXNnV2l0aERldGFpbHM9SVVQTDAxMTZFIDogVW5lIGVycmV1ciBzJ2VzdCBwcm9kdWl0ZS4gQ2xpcXVleiBzdXIgRFx1MDBlOXRhaWxzIHBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucy4NCi1lcnJvcl9tc2c9SVVQTDAxMTdFIDogVW5lIGVycmV1ciBzJ2VzdCBwcm9kdWl0ZS4gQWZmaWNoZXogbGUgam91cm5hbCBkZXMgZXJyZXVycyBwb3VyIHBsdXMgZCdpbmZvcm1hdGlvbnMuDQotU3VwcHJlc3Npb25fbmFtZUR1cGxpY2F0aW9uPUlVUEwwMTE4RSA6IFVuIGNvbmZsaXQgZGUgbm9tIHZhIHNlIHByb2R1aXJlIHN1aXRlIFx1MDBlMCBjZXR0ZSBvcFx1MDBlOXJhdGlvbi4gPlZcdTAwZTlyaWZpZXogcXVlIGxlIG5vbSBkZSBsJ1x1MDBlOWxcdTAwZTltZW50IG4nZXN0IHBhcyBlbiBkb3VibGUgZXQgclx1MDBlOWVzc2F5ZXoNCi1TdXBwcmVzc2lvbl9wcmVzZW50YXRpb25OYW1lRHVwbGljYXRpb249SVVQTDAxMTlFIDogVW4gY29uZmxpdCBkZSBub20gdmEgc2UgcHJvZHVpcmUgc3VpdGUgXHUwMGUwIGNldHRlIG9wXHUwMGU5cmF0aW9uLiA+Vlx1MDBlOXJpZmlleiBxdWUgbGUgbm9tIGRlIHByXHUwMGU5c2VudGF0aW9uIGRlIGwnXHUwMGU5bFx1MDBlOW1lbnQgbidlc3QgcGFzIGVuIGRvdWJsZSBldCByXHUwMGU5ZXNzYXlleg0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVycm9yX3JlYXNvbj1VbmUgZXJyZXVyIHMnZXN0IHByb2R1aXRlLiBDbGlxdWV6IHN1ciBEXHUwMGU5dGFpbHMgcG91ciBwbHVzIGQnaW5mb3JtYXRpb25zLg0KLXNhdmVQcm9jZXNzRXJyb3JfcmVhc29uPVVuZSBlcnJldXIgcycnZXN0IHByb2R1aXRlIGxvcnMgZGUgbGEgc2F1dmVnYXJkZSBkdSBwcm9jZXNzdXMgJyd7MH0nJy4gQ2xpcXVleiBzdXIgRFx1MDBlOXRhaWxzIHBvdXIgcGx1cyBkJydpbmZvcm1hdGlvbnMuDQotZGVsZXRlUmVmZXJlbmNlc0Vycm9yX3JlYXNvbj1VbmUgZXJyZXVyIHMnZXN0IHByb2R1aXRlIGxvcnMgZGUgbGEgc3VwcHJlc3Npb24gZGVzIHJcdTAwZTlmXHUwMGU5cmVuY2VzIGFzc29jaVx1MDBlOWVzIFx1MDBlMCBjZXQgXHUwMGU5bFx1MDBlOW1lbnQuIENsaXF1ZXogc3VyIERcdTAwZTl0YWlscyBwb3VyIHBsdXMgZCdpbmZvcm1hdGlvbnMuDQotc2F2ZUZpbGVFcnJvcl9yZWFzb249VW5lIGVycmV1ciBzJydlc3QgcHJvZHVpdGUgbG9ycyBkZSBsYSBzYXV2ZWdhcmRlIGR1IGZpY2hpZXIgJyd7MH0nJy4gQ2xpcXVleiBzdXIgRFx1MDBlOXRhaWxzIHBvdXIgcGx1cyBkJydpbmZvcm1hdGlvbnMuDQotaW52YWxpZFJlZmVyZW5jZXNFcnJvcl9yZWFzb249RGVzIFx1MDBlOWxcdTAwZTltZW50cyBkZSBtXHUwMGU5dGhvZGUgY29udGVuYW50IGRlcyByXHUwMGU5Zlx1MDBlOXJlbmNlcyBub24gdmFsaWRlcyBpc3N1ZXMgZGUgY29waWVzIGVudHJlIHBsdWctaW5zIG9udCBcdTAwZTl0XHUwMGU5IGRcdTAwZTl0ZWN0XHUwMGU5cy5cbkNlcyByXHUwMGU5Zlx1MDBlOXJlbmNlcyBzZXJvbnQgc3VwcHJpbVx1MDBlOWVzLiBWb3VsZXotdm91cyBjb250aW51ZXIgPw0KLXVucmVzb2x2ZWRPYmplY3RFcnJvcl9yZWFzb249TW9kaWZpY2F0aW9uIGQnJ3VuIG9iamV0IG5vbiByXHUwMGU5c29sdSBpbXBvc3NpYmxlIDogezB9KFVSSSA9IHsxfSl7Mn0NCi0NCi0jIFdhcm5pbmcgbWVzc2FnZXMNCi1NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c9SVVQTDAxMThXIDogVW4gb3UgcGx1c2lldXJzIFx1MDBlOWxcdTAwZTltZW50cyBzb3VyY2Ugc29udCBpbnRyb3V2YWJsZXMuIExlcyBmaWNoaWVycyBhc3NvY2lcdTAwZTlzIGR1IGRvc3NpZXIgZGVzIHJlc3NvdXJjZXMgbmUgc2Vyb250IHBhcyBjb3BpXHUwMGU5cy4NCi1BY3Rpdml0eUFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE5VyA6IFVuIG91IHBsdXNpZXVycyBcdTAwZTlsXHUwMGU5bWVudHMgc291cmNlIHNvbnQgaW50cm91dmFibGVzLiBMZXMgcGFja2FnZXMgZGUgcHJvY2Vzc3VzIGFzc29jaVx1MDBlOXMgbmUgc2Vyb250IHBhcyBjb3BpXHUwMGU5cy4NCi1BY3Rpdml0eURyb3BDb21tYW5kX2RlZXBDb3B5X3Byb21wdENvbmZpZ3VyYXRpb25Nc2c9Vm91bGV6LXZvdXMgY29waWVyIHRvdXMgbGVzIGRlc2NyaXB0ZXVycyA/XG5cblNpIHZvdXMgY2xpcXVleiBzdXIgTm9uLCBzZXVscyBsZXMgZGVzY3JpcHRldXJzIGZhaXNhbnQgcGFydGllIGRlIGxhIGNvbmZpZ3VyYXRpb24gZW4gY291cnMgc2Vyb250IGNvcGlcdTAwZTlzLg0KLWRlZXBDb3B5X3Byb21wdE1zZz1Wb3VzIG9idGllbmRyZXogdW5lIGNvcGllIGRlIHRvdXMgbGVzIFx1MDBlOWxcdTAwZTltZW50cyBsaVx1MDBlOXMgZHluYW1pcXVlbWVudCBxdWUgdm91cyBkZXZleiBkXHUwMGU5c29ybWFpcyBjb25zZXJ2ZXIgc1x1MDBlOXBhclx1MDBlOW1lbnQuIFZvdWxlei12b3VzIGNvbnRpbnVlciA/DQotZGVlcENvcHlfdGl0bGU9Q29waWUgcHJvZm9uZGUNCi0NCi0jIFByb2dyZXNzIG1lc3NhZ2VzDQotY3JlYXRpbmdQcm9jZXNzQ29tcG9uZW50VGFza19uYW1lPUNyXHUwMGU5YXRpb24gZHUgY29tcG9zYW50IGRlIHByb2Nlc3N1cyAnJ3swfScnLi4uDQotcHJvY2Vzc2luZ1JlZmVyZW5jZXNUYXNrX25hbWU9VHJhaXRlbWVudCBkZXMgclx1MDBlOWZcdTAwZTlyZW5jZXMuLi4NCi1kZWxldGluZ0VsZW1lbnRzVGFza19uYW1lPVN1cHByZXNzaW9uIGRlcyBcdTAwZTlsXHUwMGU5bWVudHMgZXQgZmljaGllcnMgYXNzb2NpXHUwMGU5cy4uLg0KLWNoZWNraW5nUmVmZXJlbmNlc1Rhc2tfbmFtZT1SZWNoZXJjaGUgZGUgclx1MDBlOWZcdTAwZTlyZW5jZXMuLi4NCi1yZW1vdmluZ1JlZmVyZW5jZXN0YXNrX25hbWU9U3VwcHJlc3Npb24gZGUgclx1MDBlOWZcdTAwZTlyZW5jZXMuLi4NCi1zYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lPVNhdXZlZ2FyZGUgZHUoZGVzKSBmaWNoaWVyKHMpIG1vZGlmaVx1MDBlOShzKS4uLg0KLWNoZWNrQWZmZWN0ZWRSZXNvdXJjZXNUYXNrX25hbWU9Vlx1MDBlOXJpZmljYXRpb24gZGVzIHJlc3NvdXJjZXMgYWZmZWN0XHUwMGU5ZXMuLi4NCi1tb3ZpbmdUYXNrX25hbWU9RFx1MDBlOXBsYWNlbWVudC4uLg0KLW1vdmluZ0ZpbGVzVGFza19uYW1lPURcdTAwZTlwbGFjZW1lbnQgZGUgZmljaGllcnMuLi4NCi1jb3B5aW5nUmVzb3VyY2VzVGFza19uYW1lPUNvcGllIGRlIHJlc3NvdXJjZXMuLi4NCi1jb3B5aW5nQWN0aXZpdGllc19tc2c9Q29waWUgZGUgbCcnYWN0aXZpdFx1MDBlOSAnJ3swfScnDQotc2F2aW5nRmlsZVRhc2tfbmFtZT1TYXV2ZWdhcmRlIGR1IGZpY2hpZXIgJyd7MH0nJy4uLg0KLQ0KLSMgVUkgVGV4dA0KLWVsZW1lbnRfdGV4dD1cdTAwZTlsXHUwMGU5bWVudA0KLWNyZWF0ZUVsZW1lbnRfdGV4dD1Dclx1MDBlOWVyIHVuIFx1MDBlOWxcdTAwZTltZW50DQotY3JlYXRlUHJvY2Vzc190ZXh0PUNyXHUwMGU5ZXIgdW4gcHJvY2Vzc3VzDQotY29udHJpYnV0ZXNUb190ZXh0PUNvbnRyaWJ1ZSBcdTAwZTANCi1sb2NhbENvbnRyaWJ1dGVzVG9fdGV4dD1Db250cmlidWUgbG9jYWxlbWVudCBcdTAwZTANCi1leHRlbmRzX3RleHQ9RXRlbmQNCi1yZXBsYWNlc190ZXh0PVJlbXBsYWNlDQotbG9jYWxSZXBsYWNlc190ZXh0PVJlbXBsYWNlIGxvY2FsZW1lbnQNCi1sb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHlfdGV4dD1SZW1wbGFjZW1lbnQgbG9jYWwgZXQgY29waWUgcHJvZm9uZGUNCi1lbGVtZW50VHlwZV90ZXh0PXswfSA6IHsxfQ0KLWRlbGl2ZXJhYmxlc190ZXh0PUxpdnJhYmxlcw0KLWNvbnRyaWJ1dGVUb0FjdGl2aXR5X3RleHQ9Q29udHJpYnVlciBcdTAwZTAgbCdhY3Rpdml0XHUwMGU5DQotQWN0aXZpdHlEcm9wQ29tbWFuZF9sYWJlbD1TdXBwcmltZXIgbCdhY3Rpdml0XHUwMGU5DQotcmVwbGFjZUFjdGl2aXR5X3RleHQ9UmVtcGxhY2VyIGwnYWN0aXZpdFx1MDBlOQ0KLWZpbGVfdGV4dD1maWNoaWVyDQotZGlyZWN0b3J5X3RleHQ9clx1MDBlOXBlcnRvaXJlDQotdW5yZXNvbHZlZF90ZXh0PSgnJ3swfScnIG5vbiByXHUwMGU5c29sdSkNCi1hc3Npc3RzX3RleHQ9Rm91cm5pdCBkZSBsJ2FpZGUNCi11bmtub3duX3RleHQ9SW5jb25udQ0KLWNvbW1hbmRfZG9uZT1UZXJtaW5cdTAwZTkNCi0NCi0jIFRoZSBmb2xsb3dpbmcgVUkgdGV4dCBzaG91bGQgYmUgcmV2aWV3ZWQuDQotVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHl3aXRocGx1Z2luX2luZm89ezB9ICh7MX0gJyd7Mn0nJyBkYW5zICcnezN9JycpDQotVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHlfaW5mbz17MH0gKHsxfSAnJ3syfScnKQ0KLXVpX3JlZl9kZWxldGU9TGUgZGVzY3JpcHRldXIgJyd7MH0nJyBjb250aWVudCBsZXMgclx1MDBlOWZcdTAwZTlyZW5jZXMgc3VpdmFudGVzIHF1aSBuZSBzb250IHV0aWxpc1x1MDBlOWVzIG51bGxlIHBhcnQuXG5TXHUwMGU5bGVjdGlvbm5leiBjZWxsZXMgcXVlIHZvdXMgc291aGFpdGV6IHN1cHByaW1lciA6DQotdWlfcmVmX2RlbGV0ZTI9TGVzIHJcdTAwZTlmXHUwMGU5cmVuY2VzIHN1aXZhbnRlcyBuZSBzb250IHV0aWxpc1x1MDBlOWVzIG51bGxlIHBhcnQuXG5TXHUwMGU5bGVjdGlvbm5leiBjZWxsZXMgcXVlIHZvdXMgc291aGFpdGV6IHN1cHByaW1lciA6DQotdWlfcmVmZXJlbmNlcz1SXHUwMGU5Zlx1MDBlOXJlbmNlcw0KLXVpX3dvcmtwcm9kdWN0X2Rlc2NyaXB0b3JfZGVzY3JpcHRpb249TGUgZGVzY3JpcHRldXIgZGUgcHJvZHVpdCAnJ3swfScnIGVzdCBhc3NvY2lcdTAwZTkgKHNvcnRpZSBkZSkgYXUgZGVzY3JpcHRldXIgZGUgdFx1MDBlMmNoZSAnJ3sxfScnDQotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX29wdGlvbnM9T3B0aW9ucw0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vdXRwdXRsYWJlbD1TdXBwcmltZXIgbGUgZGVzY3JpcHRldXIgZGUgcHJvZHVpdCBlbiB0YW50IHF1ZSBzb3J0aWUgZHUgZGVzY3JpcHRldXIgZGUgdFx1MDBlMmNoZQ0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9kZWxldGVfdGFzaz1TdXBwcmltZXIgbGUgZGVzY3JpcHRldXIgZGUgdFx1MDBlMmNoZSBkZSBsJ2FjdGl2aXRcdTAwZTkNCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZGVmYXVsdGNvbmZpZ2NoZWNrPUwnJ1x1MDBlOWxcdTAwZTltZW50IHNcdTAwZTlsZWN0aW9ublx1MDBlOSAnJ3swfScnIG5lIGZpZ3VyZSBwYXMgZGFucyBsYSBjb25maWd1cmF0aW9uIHBhciBkXHUwMGU5ZmF1dCBkZSB2b3RyZSBwcm9jZXNzdXMuXG5Tb3VoYWl0ZXotdm91cyBham91dGVyIGNlIGRlcm5pZXIgZXQgc2VzIGRcdTAwZTlwZW5kYW5jZXMgXHUwMGUwIGxhIGNvbmZpZ3VyYXRpb24gcGFyIGRcdTAwZTlmYXV0ID8NCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZ2VuZXJpY0Vycl9tZXNzYWdlX3RleHQ9RGVzIGVycmV1cnMgc2Ugc29udCBwcm9kdWl0ZXMgcGVuZGFudCBsJ29wXHUwMGU5cmF0aW9uLiBDbGlxdWV6IHN1ciBEXHUwMGU5dGFpbHMgcG91ciBwbHVzIGQnaW5mb3JtYXRpb25zLg0KLVByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fbm9EZXNjcmlwdG9yVG9TeW5jaD1BdWN1biBkZXNjcmlwdGV1ciBjb250ZW5hbnQgdW4gXHUwMGU5bFx1MDBlOW1lbnQgZGUgbVx1MDBlOXRob2RlIGxpXHUwMGU5IG4nYSBcdTAwZTl0XHUwMGU5IHRyb3V2XHUwMGU5IGVuIHZ1ZSBkJ3VuZSBzeW5jaHJvbmlzYXRpb24NCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9yZWZlcnNoaW5ndmlld2VyPUVycmV1ciBkJ2FjdHVhbGlzYXRpb24gZGUgbCdhZmZpY2hldXINCi1jb25maXJtX3JlbW92ZV9yZWZlcmVuY2VzX3RleHQ9TGUgb3UgbGVzIFx1MDBlOWxcdTAwZTltZW50cyByXHUwMGU5cGVydG9yaVx1MDBlOXMgZGFucyBEXHUwMGU5dGFpbHMgc29udCBzdXNjZXB0aWJsZXMgZGUgY29tcG9ydGVyIHVuZSByXHUwMGU5Zlx1MDBlOXJlbmNlIGludGVyZGl0ZSBcdTAwZTAgY2UgbWVzc2FnZSBkXHUwMGU5Y2lzaW9ubmVsIGFwclx1MDBlOHMgY29udmVyc2lvbi4gQ2xpcXVleiBzdXIgT0sgcG91ciBsZXMgc3VwcHJpbWVyIGV0IGNvbnRpbnVlci4NCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl91bmhhbmRsZWRfZXhjZXB0aW9uPUV4Y2VwdGlvbiBub24gZ1x1MDBlOXJcdTAwZTllDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9icmVha2Rvd25fZWxlbWVudD1OZSBwZXV0IHBhcyBhdm9pciBsZSBtXHUwMGVhbWUgXHUwMGU5bFx1MDBlOW1lbnQgZGUgclx1MDBlOXBhcnRpdGlvbiBxdWUgbGUgcHJcdTAwZTlkXHUwMGU5Y2Vzc2V1ciBldCBsZSBzdWNjZXNzZXVyDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dwbGlzdGRsZ19tc2c9TGUgcHJvZHVpdCAnJ3swfScnIGVzdCB1bmUgc29ydGllIGRlcyB0XHUwMGUyY2hlcyBzdWl2YW50ZXMuXG5TXHUwMGU5bGVjdGlvbm5leiBsZXMgdFx1MDBlMmNoZXMgcG91ciBsZXNxdWVsbGVzIHZvdXMgc291aGFpdGV6IGNyXHUwMGU5ZXIgbGVzIGRlc2NyaXB0ZXVycyBjb3JyZXNwb25kYW50cy4NCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfcm9sZWxpc3RkbGdfbXNnPUxlIHJcdTAwZjRsZSAnJ3swfScnIGNvbXBvcnRlIGxlcyBwcm9kdWl0cyByZXNwb25zYWJsZXMgc3VpdmFudHMuXG5TXHUwMGU5bGVjdGlvbm5leiBsZXMgcHJvZHVpdHMgcG91ciBsZXNxdWVscyB2b3VzIHNvdWhhaXRleiBjclx1MDBlOWVyIGxlcyBkZXNjcmlwdGV1cnMgY29ycmVzcG9uZGFudHMuDQotdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfZmF0YWxlcnI9RXJyZXVyIGJsb3F1YW50ZQ0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93b3JrcHJvZHVjdHM9UHJvZHVpdHMNCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX3N1Yl9lbGVtZW50PUltcG9zc2libGUgZGUgcmVsaWVyIHVuIFx1MDBlOWxcdTAwZTltZW50IGRlIHJcdTAwZTlwYXJ0aXRpb24gXHUwMGUwIGwndW4gZGUgc2VzIHNvdXMtXHUwMGU5bFx1MDBlOW1lbnRzDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfd3JvbmdfZWxlbWVudD1JbXBvc3NpYmxlIGRlIHJlbGllciBcdTAwZTAgdW4gXHUwMGU5bFx1MDBlOW1lbnQgYXV0cmUgcXUndW4gXHUwMGU5bFx1MDBlOW1lbnQgZGUgclx1MDBlOXBhcnRpdGlvbiBkdSB0cmF2YWlsLg0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX2NoaWxkX2VsZW1lbnQ9SW1wb3NzaWJsZSBkZSByZWxpZXIgdW4gXHUwMGU5bFx1MDBlOW1lbnQgZGUgclx1MDBlOXBhcnRpdGlvbiBcdTAwZTAgbCd1biBkZSBzZXMgZW5mYW50cy4NCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfdGFza3M9VFx1MDBlMmNoZXMNCi11aV9hc3NvY2lhdGlvbl90YXNrX3NlbGVjdGlvbj1TXHUwMGU5bGVjdGlvbiBkZXMgdFx1MDBlMmNoZXMuLi4NCi11dGlsX1Byb2Nlc3NVdGlsX2NoaWxkYWRhcHRlcj1cIFwgYWRhcHRhdGV1ciBkZSBsJ2VuZmFudCA6DQotDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2V0cGFyZW50PUltcG9zc2libGUgZGUgZFx1MDBlOWZpbmlyIHVuIHBhcmVudCBwb3VyIGwnZW5mYW50DQotdXRpbF90bmd1dGlsX2Nhbm5vdF9lZGl0X3Jlc291cmNlPUltcG9zc2libGUgZGUgbW9kaWZpZXIgbGEgcmVzc291cmNlLg0KLXV0aWxfUHJvY2Vzc1V0aWxfY29udHJpYnV0ZXN0bz1jb250cmlidWUgXHUwMGUwICcnezB9JycNCi11dGlsX1Byb2Nlc3NVdGlsX2xvY2FsQ29udHJpYnV0ZXN0bz1jb250cmlidWUgbG9jYWxlbWVudCBcdTAwZTAgJyd7MH0nJw0KLXByb2Nlc3NfZXh0ZW5kcz1cdTAwZTl0ZW5kICcnezB9JycNCi1wcm9jZXNzX3JlcGxhY2VzPXJlbXBsYWNlICcnezB9JycNCi1wcm9jZXNzX2xvY2FsUmVwbGFjZXM9cmVtcGxhY2UgbG9jYWxlbWVudCAnJ3swfScnDQotIyBGaWx0ZXIgY29uc3RhbnRzIGV4dGVybmFsaXplZCBzdHJpbmdzLg0KLUZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lc190ZXh0PURpc2NpcGxpbmVzDQotRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVncm91cGluZ3NfdGV4dD1SZWdyb3VwZW1lbnRzIGRlIGRpc2NpcGxpbmVzDQotRmlsdGVyQ29uc3RhbnRzX3doaXRlcGFwZXJzX3RleHQ9TGl2cmVzIGJsYW5jcw0KLUZpbHRlckNvbnN0YW50c190b29sbWVudG9yc190ZXh0PUd1aWRlcyBkJ3V0aWxpc2F0aW9uIGRlIGwnb3V0aWwNCi1GaWx0ZXJDb25zdGFudHNfdG9vbHNfdGV4dD1PdXRpbHMNCi1GaWx0ZXJDb25zdGFudHNfcm9sZXNfdGV4dD1SXHUwMGY0bGVzDQotRmlsdGVyQ29uc3RhbnRzX3Rhc2tzX3RleHQ9VFx1MDBlMmNoZXMNCi1GaWx0ZXJDb25zdGFudHNfcmV1c2FibGVhc3NldHNfdGV4dD1SZXNzb3VyY2VzIHJcdTAwZTl1dGlsaXNhYmxlcw0KLUZpbHRlckNvbnN0YW50c19hbGxfdGV4dD1Ub3VzDQotRmlsdGVyQ29uc3RhbnRzX3Byb2Nlc3Nlc190ZXh0PVByb2Nlc3N1cw0KLUZpbHRlckNvbnN0YW50c19wcmFjdGljZXNfdGV4dD1QcmF0aXF1ZXMNCi1GaWx0ZXJDb25zdGFudHNfdGVtcGxhdGVzX3RleHQ9Q2FuZXZhcw0KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHNfdGV4dD1Qcm9kdWl0cw0KLUZpbHRlckNvbnN0YW50c19jaGVja2xpc3RzX3RleHQ9TGlzdGVzIGRlIGNvbnRyXHUwMGY0bGUNCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGVsaW5lc190ZXh0PUluc3RydWN0aW9ucw0KLUZpbHRlckNvbnN0YW50c19yb2xlc2V0c190ZXh0PUVuc2VtYmxlcyBkZSByXHUwMGY0bGVzDQotRmlsdGVyQ29uc3RhbnRzX2d1aWRhbmNlX3RleHQ9Q29uc2VpbA0KLUZpbHRlckNvbnN0YW50c19jb25jZXB0c190ZXh0PUNvbmNlcHRzDQotRmlsdGVyQ29uc3RhbnRzX2V4YW1wbGVzX3RleHQ9RXhlbXBsZXMNCi1GaWx0ZXJDb25zdGFudHNfY29udGVudHBhY2thZ2VzX3RleHQ9UGFja2FnZXMgZGUgY29udGVudQ0KLUZpbHRlckNvbnN0YW50c19yb2xlZGVzY3JpcHRvcnNfdGV4dD1EZXNjcmlwdGV1cnMgZGUgclx1MDBmNGxlDQotRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRncm9wdWluZ3NfdGV4dD1SZWdyb3VwZW1lbnRzIGQnZW5zZW1ibGVzIGRlIHJcdTAwZjRsZXMNCi1GaWx0ZXJDb25zdGFudHNfdGFza2Rlc2NyaXB0b3JzX3RleHQ9RGVzY3JpcHRldXJzIGRlIHRcdTAwZTJjaGVzDQotRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRlbGVtZW50c190ZXh0PUVsXHUwMGU5bWVudHMgZGUgY29udGVudQ0KLVByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fcHJlcGFyZT1Qclx1MDBlOXBhcmF0aW9uIGRlIGxhIHN5bmNocm9uaXNhdGlvbi4uLg0KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdGRlc2NyaXB0b3JzX3RleHQ9RGVzY3JpcHRldXJzIGRlIHByb2R1aXRzDQotRmlsdGVyQ29uc3RhbnRzX2FsbGNvbnRlbnRlbGVtZW50c190ZXh0PVRvdXMgbGVzIFx1MDBlOWxcdTAwZTltZW50cyBkZSBjb250ZW51DQotRmlsdGVyQ29uc3RhbnRzX3N1cHBvcnRpbmdtYXRlcmlhbHNfdGV4dD1Eb2N1bWVudHMgZCdhY2NvbXBhZ25lbWVudA0KLU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX2Vycm9yU2F2aW5nRmlsZXM9RXJyZXVyIGxvcnMgZGUgbGEgc2F1dmVnYXJkZSBkdShkZXMpIGZpY2hpZXIocykNCi1GaWx0ZXJDb25zdGFudHNfY3VzdG9tY2F0ZWdvcmllc190ZXh0PUNhdFx1MDBlOWdvcmllcyBwZXJzb25uYWxpc1x1MDBlOWVzDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0dHlwZXNfdGV4dD1UeXBlcyBkZSBwcm9kdWl0cw0KLURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kX3dhcm5pbmdNc2c9U3VwcHJlc3Npb24gdGVybWluXHUwMGU5ZSBhdmVjIGF2ZXJ0aXNzZW1lbnQNCi1GaWx0ZXJDb25zdGFudHNfbWV0aG9kcGx1Z2luc190ZXh0PVBsdWctaW5zIGRlIG1cdTAwZTl0aG9kZQ0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9sb2NrZWRQbHVnaW49SVVQTDAxMjBFIDogTGUgcGx1Zy1pbiAnJ3swfScnIGVzdCB2ZXJyb3VpbGxcdTAwZTkuDQotRmlsdGVyQ29uc3RhbnRzX2RvbWFpbnNfdGV4dD1Eb21haW5lcw0KLUZpbHRlckNvbnN0YW50c19yb2FkbWFwX3RleHQ9RmV1aWxsZXMgZGUgcm91dGUNCi1GaWx0ZXJDb25zdGFudHNfcmVwb3J0c190ZXh0PVJhcHBvcnRzDQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9sYWJlbD1TJnluY2hyb25pc2F0aW9uIHBhciBkXHUwMGU5ZmF1dCBcdTAwZTAgcGFydGlyIGR1IGNvbnRlbnUgZGUgbVx1MDBlOXRob2RlDQotTWFudWFsU3luY2hyb25pemVDb21tYW5kX2xhYmVsPVN5bmNocm9uaSZzYXRpb24gcGVyc29ubmFsaXNcdTAwZTllLi4uDQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9zdWNlc3NmdWw9U3luY2hyb25pc2F0aW9uIHRlcm1pblx1MDBlOWUgYXZlYyBzdWNjXHUwMGU4cy4NCi0NCi0jIFVzZXJJbnRlcmFjdGlvbkhlbHBlcg0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9Qcm9jZXNzUGFja2FnZV9OYW1lPU5vbSA6DQotDQotIyBNZXRob2RDcmVhdGVDaGlsZENvbW1hbmQNCi1uZXdFbGVtZW50X3RleHQ9Tm91dmVhdShub3V2ZWxsZSkgezB9DQotdXBkYXRlX291dG9mc3luY2hfdGl0bGU9Q29uZmxpdCBkZSBtaXNlIFx1MDBlMCBqb3VyDQotdXBkYXRlX291dG9mc3luY2hfbXNnPUxlIG91IGxlcyBmaWNoaWVycyBvbnQgXHUwMGU5dFx1MDBlOSBtb2RpZmlcdTAwZTlzIHN1ciBsZSBzeXN0XHUwMGU4bWUgZGUgZmljaGllcnMuIFNvdWhhaXRlei12b3VzIFx1MDBlOWNyYXNlciBsZXMgbW9kaWZpY2F0aW9ucyA/DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfaXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwZWQ3NGEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEdlbmVyaWMgRGlhbG9nIFRpdGxlcw0KLW1vdmVEaWFsb2dfdGl0bGU9U3Bvc3RhDQotZGVsZXRlRGlhbG9nX3RpdGxlPUVsaW1pbmEgZWxlbWVudG8NCi1lcnJvckRpYWxvZ190aXRsZT1FcnJvcmUNCi1lcnJvckRpYWxvZ19jYW5ub3RSZW5hbWU9SW1wb3NzaWJpbGUgcmlub21pbmFyZSB7MH0gJyd7MX0nJyBpbiAnJ3syfScnLiBSaXNvbHZlcmUgaWwgcHJvYmxlbWEgcmlwb3J0YXRvIGluIERldHRhZ2xpIGUgZmFyZSBjbGljIHN1IE9LIHBlciBjb250aW51YXJlIG9wcHVyZSBzdSBBbm51bGxhIHBlciBpbnRlcnJvbXBlcmUgcXVlc3RhIG9wZXJhemlvbmUuDQotDQotIyBDb25maXJtIFJlZmVyZW5jZXMgUmVtb3ZhbCBEaWFsb2cNCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RpdGxlPUNvbmZlcm1hIHJpbW96aW9uZSByaWZlcmltZW50aQ0KLWRlbGV0ZVJlZmVyZW5jZXNEaWFsb2dfdGV4dD1BbGwnZWxlbWVudG8gbyBhZ2xpIGVsZW1lbnRpIGNoZSBzaSBzdGFubm8gcGVyIGVsaW1pbmFyZSBzb25vIGFuY29yYSBhc3NvY2lhdGkgcmlmZXJpbWVudGkgZGkgYWx0cmkgZWxlbWVudGkgZGVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaS4gQ29uIGwnZWxpbWluYXppb25lIHZlcnJhbm5vIHJpbW9zc2kgaSByaWZlcmltZW50aSBlIG5lbCBjb250ZW1wbyB2ZXJyYW5ubyBhZ2dpb3JuYXRpIGdsaSBlbGVtZW50aSBjaGUgbmUgZmFubm8gdXNvLiAgQXNzaWN1cmFyc2kgZGkgZGlzcG9ycmUgZGVsbCdhdXRvcml6emF6aW9uZSBwZXIgYWdnaW9ybmFyZSBnbGkgZWxlbWVudGkgY2hlIGZhbm5vIHVzbyBkaSByaWZlcmltZW50aSBwcmltYSBkaSBzY2VnbGllcmUgT0suICBGYXJlIGNsaWMgc3UgRGV0dGFnbGkgcGVyIGVzYW1pbmFyZSBsJ2VsZW5jbyBkZWdsaSBlbGVtZW50aSBjaGUgZmFubm8gcmlmZXJpbWVudG8gYWdsaSBlbGVtZW50aSBjaGUgc2kgc3RhIHBlciBlbGltaW5hcmUuDQotDQotIyBSZXNvbHZlIE5hbWUgQ29uZmxpY3QgRGlhbG9nDQotcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190aXRsZT1SaXNvbHZpIGNvbmZsaXR0byBub21pIGVsZW1lbnRpDQotcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0PUltbWV0dGVyZSB1biBudW92byB7MH0gcGVyICcnezF9Jyc6DQotDQotIyBTZWxlY3QgRGVsaXZlcmFibGVzIERpYWxvZw0KLXNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190aXRsZT1TZWxlemlvbmEgY29tcG9uZW50ZSBkaXN0cmlidWliaWxlDQotc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RleHQ9U2VsZXppb25hcmUgdW4gY29tcG9uZW50ZSBkaXN0cmlidWliaWxlIGluIGN1aSBzaSBkZXNpZGVyYSBhc3NlZ25hcmUgaWwgcHJvZG90dG8gZGkgbGF2b3JvICcnezB9JycuDQotDQotIyBOZXcgUHJvY2VzcyBDb21wb25lbnQgRGlhbG9nDQotbmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZ190aXRsZT1OdW92byBjb21wb25lbnRlIHByb2Nlc3NvDQotbmFtZUxhYmVsX3RleHQ9Tm9tZToNCi1kZWZhdWx0Q29uZmlnTGFiZWxfdGV4dD1Db25maWd1cmF6aW9uZSBwcmVkZWZpbml0YToNCi1iYXNlUHJvY2Vzc0xhYmVsX3RleHQ9UHJvY2Vzc28gZGkgYmFzZToNCi1iYXNlZE9uUHJvY2Vzc2VzTGFiZWxfdGV4dD1CYXNhdG8gc3UgcHJvY2Vzc2k6DQotDQotIyBSb2xlIEFzc29jaWF0aW9uIERpYWxvZw0KLXNlbGVjdEFzc29jaWF0aW9uTGFiZWxfdGV4dD1TZWxlemlvbmEgYXNzb2NpYXppb25lIHBlciBsJydvcGVyYXppb25lICcnezB9JycNCi0NCi0jIFJlbW92ZSBBc3NvY2lhdGlvbiBkaWFsb2cNCi1yZW1vdmVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PVJpbXVvdmkgYXNzb2NpYXppb25lDQotDQotIyBTZWxlY3QgVGVhbXMgRGlhbG9nDQotc2VsZWN0VGVhbXNEaWFsb2dfdGl0bGU9U2VsZXppb25hIHRlYW0NCi1zZWxlY3RUZWFtc0RpYWxvZ190ZXh0PVNlbGV6aW9uYXJlIHVuIHRlYW0gaW4gY3VpIHNpIGRlc2lkZXJhIGFzc2VnbmFyZSB1biBydW9sbyAnJ3swfScnLg0KLQ0KLSMgVGFzbCBTZWxlY3Rpb24gRGlhbG9nDQotdGFza1NlbGVjdGlvbkRpYWxvZ190aXRsZT1TZWxlemlvbmUgb3BlcmF6aW9uZQ0KLXRpdGxlTGFiZWxfdGV4dD1TZWxlemlvbmEgb3BlcmF6aW9uaS4uDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQTDAxMDBFOiBJbCBub21lIHswfSBtYW5jYS5cblxuVHV0dGkgZ2xpIGVsZW1lbnRpIGRpIG1ldG9kbyBlIGRpIHByb2Nlc3NvIGRldm9ubyBhdmVyZSB1biBub21lLlxuXG5JbW1ldHRlcmUgdW4gbm9tZSB2YWxpZG8gZSBwcm92YXJlIGRpIG51b3ZvLg0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnPUlsIG5vbWUgbm9uIHB1XHUwMGYyIGVzc2VyZSB2dW90by4gU3BlY2lmaWNhcmUgdW4gbm9tZSB2YWxpZG8uDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQTDAxMDFFOiBJbCBub21lICcnezB9JycgZXNpc3RlIGdpXHUwMGUwLiBcblxuR2xpIGVsZW1lbnRpIGRpIG1ldG9kbyBkZXZvbm8gYXZlcmUgdW4gbm9tZSB1bml2b2NvLlxuXG5JbW1ldHRlcmUgdW4gYWx0cm8gbm9tZSBlIHByb3ZhcmUgZGkgbnVvdm8uDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnPUxvIHN0ZXNzbyBub21lIGRpIGVsZW1lbnRvIGVzaXN0ZSBnaVx1MDBlMC4gU3BlY2lmaWNhcmUgdW4gYWx0cm8gbm9tZS4NCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjFfbXNnPUlVUEwwMTAyRTogSWwgbm9tZSAnJ3swfScnIG5vbiBcdTAwZTggdmFsaWRvLlxuXG5JIG5vbWkgZGVnbGkgZWxlbWVudGkgZGkgbWV0b2RvIG5vbiBwb3Nzb25vIGluaXppYXJlIGNvbiB1bm8gc3BhemlvLlxuXG5JbW1ldHRlcmUgdW4gbm9tZSB2YWxpZG8gZSBwcm92YXJlIGRpIG51b3ZvLg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMl9tc2c9SVVQTDAxMDNFOiBJbCBub21lICcnezB9Jycgbm9uIFx1MDBlOCB2YWxpZG8uXG5cbkkgbm9taSBkZWdsaSBlbGVtZW50aSBkaSBtZXRvZG8gbm9uIHBvc3Nvbm8gdGVybWluYXJlIGNvbiB1biBwdW50by5cblxuSW1tZXR0ZXJlIHVuIG5vbWUgdmFsaWRvIGUgcHJvdmFyZSBkaSBudW92by4NCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjNfbXNnPUlVUEwwMTA0RTogSWwgbm9tZSAnJ3swfScnIG5vbiBcdTAwZTggdmFsaWRvLlxuXG5JIG5vbWkgZGVnbGkgZWxlbWVudGkgZGkgbWV0b2RvIG5vbiBwb3Nzb25vIGNvbnRlbmVyZSBpIHNlZ3VlbnRpIGNhcmF0dGVyaTogXFwgLyA6ICogPyAiIDwgPiA7IHxcblxuSW1tZXR0ZXJlIHVuIG5vbWUgdmFsaWRvIGUgcmlwcm92YXJlIGRpIG51b3ZvLg0KLW5vQ29uZmlnRXJyb3JfbXNnPUlVUEwwMTA1RTogTGEgbGlicmVyaWEgZGVpIG1ldG9kaSBjb3JyZW50ZSBub24gY29udGllbmUgY29uZmlndXJhemlvbmkgZGkgbWV0b2RvLlxuXG5QZXIgY3JlYXJlIHVuIG51b3ZvIHByb2Nlc3NvLCBvY2NvcnJlIHVuYSBjb25maWd1cmF6aW9uZSBkaSBtZXRvZG8uXG5cbkNyZWFyZSB1bmEgY29uZmlndXJhemlvbmUgZGkgbWV0b2RvIGUgcHJvdmFyZSBkaSBudW92by4NCi1ub0RlbGl2ZXJ5UHJvY2Vzc0Vycm9yX21zZz1JVVBMMDEwNkU6IExhIGxpYnJlcmlhIGRlaSBtZXRvZGkgY29ycmVudGUgbm9uIGNvbnRpZW5lIHByb2Nlc3NpIGRpIHByb2R1emlvbmUuXG5cblBlciBjcmVhcmUgdW4gbnVvdm8gY29udHJpYnV0byBhbCBwcm9jZXNzbywgb2Njb3JyZSB1biBwcm9jZXNzbyBkaSBwcm9kdXppb25lIGRpIGJhc2UuXG5cbkNyZWFyZSB1biBwcm9jZXNzbyBkaSBwcm9kdXppb25lIGUgcHJvdmFyZSBkaSBudW92by4NCi1ub0RlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQTDAxMDdFOiBOb24gXHUwMGU4IHN0YXRhIHNlbGV6aW9uYXRhIGFsY3VuYSBjb25maWd1cmF6aW9uZSBkaSBtZXRvZG8uXG5cblx1MDBjOCBuZWNlc3NhcmlvIGFzc2VnbmFyZSBhbCBudW92byBwcm9jZXNzbyB1bmEgY29uZmlndXJhemlvbmUgZGkgbWV0b2RvIHByZWRlZmluaXRhLlxuXG5TZWxlemlvbmFyZSB1bmEgY29uZmlndXJhemlvbmUgZGkgbWV0b2RvIGUgcHJvdmFyZSBkaSBudW92by4NCi1ub0Jhc2VQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA4RTogTm9uIFx1MDBlOCBzdGF0byBzZWxlemlvbmF0byBhbGN1biBwcm9jZXNzbyBkaSBwcm9kdXppb25lLlxuXG5JIGNvbnRyaWJ1dGkgYWkgcHJvY2Vzc2kgcmljaGllZG9ubyB1biBwcm9jZXNzbyBkaSBwcm9kdXppb25lIGRpIGJhc2UuXG5cblNlbGV6aW9uYXJlIHVuIHByb2Nlc3NvIGRpIHByb2R1emlvbmUgZSBwcm92YXJlIGRpIG51b3ZvLg0KLWNyZWF0ZVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDlFOiBJbXBvc3NpYmlsZSBjcmVhcmUgaWwgcHJvY2Vzc28gY29ycmV0dGFtZW50ZS4NCi1jcmVhdGVFbGVtZW50RXJyb3JfbXNnPUlVUEwwMTEwRTogSW1wb3NzaWJpbGUgY3JlYXJlIGwnZWxlbWVudG8gY29ycmV0dGFtZW50ZS4NCi1kZWxldGVFbGVtZW50RXJyb3JfbXNnPUlVUEwwMTExRTogSW1wb3NzaWJpbGUgZWxpbWluYXJlIGwnZWxlbWVudG8gY29ycmV0dGFtZW50ZS4NCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX21zZz1JVVBMMDExMkU6IEltcG9zc2liaWxlIGNyZWFyZSBpbCBmaWxlIGRlbCBjb250ZW51dG8gcGVyIGwnJ2VsZW1lbnRvLlxuXG5VbiBmaWxlICcnezB9JycgZXNpc3RlIGdpXHUwMGUwLlxuXG5JbW1ldHRlcmUgdW4gYWx0cm8gbm9tZSBlIHByb3ZhcmUgZGkgbnVvdm8uDQotZHVwbGljYXRlQ29udGVudEZpbGVFcnJvcl9zaW1wbGVfbXNnPVVuIGZpbGUgZGVsIGNvbnRlbnV0byBjb24gbG8gc3Rlc3NvIG5vbWUgZXNpc3RlIGdpXHUwMGUwLiBTcGVjaWZpY2FyZSB1biBhbHRybyBub21lLg0KLXVuZG9Db21tYW5kRXJyb3JfbXNnPUlVUEwwMTEzRTogSW1wb3NzaWJpbGUgY29tcGxldGFyZSBpbCBjb21hbmRvICcnezB9JycuXG5cblNpIFx1MDBlOCB2ZXJpZmljYXRvIHVuIGVycm9yZTogezF9DQotaW52YWxpZFByZWRlY2Vzc29yRXJyb3JfbXNnPUlVUEwwMTE0RTogTCdpbmRpY2UgZGVsIHByZWRlY2Vzc29yZSBzcGVjaWZpY2F0byBub24gXHUwMGU4IHZhbGlkby5cblxuR2xpIGluZGljaSBkZWkgcHJlZGVjZXNzb3JpIGRldm9ubyBlc3NlcmUgdmFsb3JpIGludGVyaSBwcmVzZW50aSBuZWxsYSBjb2xvbm5hICdJbmRpY2UnLlxuXG5TcGVjaWZpY2FyZSB1biB2YWxvcmUgdmFsaWRvIGUgcHJvdmFyZSBkaSBudW92by4NCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzPUlVUEwwMTAwVzogJyd7MH0nJyBcdTAwZTggZ2lcdTAwZTAgYXNzb2NpYXRvIGEgJyd7MX0nJy4gIFx1MDBjOCBjb25zZW50aXRhIHVuYSBzb2xhIGFzc29jaWF6aW9uZSBkaSBxdWVzdG8gdGlwby4gIFBlciBhc3NlZ25hcmUgJyd7MH0nJyBhICcnezJ9JycgXHUwMGU4IG5lY2Vzc2FyaW8gcHJpbWEgZWxpbWluYXJsbyBkYSAnJ3sxfScnLg0KLWVycm9yX21zZ1dpdGhEZXRhaWxzPUlVUEwwMTE2RTogU2kgXHUwMGU4IHZlcmlmaWNhdG8gdW4gZXJyb3JlLiBGYXJlIGNsaWMgc3UgRGV0dGFnbGkgcGVyIHVsdGVyaW9yaSBpbmZvcm1hemlvbmkuDQotZXJyb3JfbXNnPUlVUEwwMTE3RTogU2kgXHUwMGU4IHZlcmlmaWNhdG8gdW4gZXJyb3JlLiBDb250cm9sbGFyZSBpbCBsb2cgZGVnbGkgZXJyb3JpIHBlciB1bHRlcmlvcmkgZGV0dGFnbGkuDQotU3VwcHJlc3Npb25fbmFtZUR1cGxpY2F0aW9uPUlVUEwwMTE4RTogRG9wbyBxdWVzdGEgb3BlcmF6aW9uZSBzaSB2ZXJpZmljaGVyXHUwMGUwIHVuIGNvbmZsaXR0byBkaSBub21lLiBDb250cm9sbGFyZSBpbCBub21lIGRlbGwnZWxlbWVudG8gcGVyIGxhIGR1cGxpY2F6aW9uZSBlIHByb3ZhcmUgbnVvdmFtZW50ZQ0KLVN1cHByZXNzaW9uX3ByZXNlbnRhdGlvbk5hbWVEdXBsaWNhdGlvbj1JVVBMMDExOUU6IERvcG8gcXVlc3RhIG9wZXJhemlvbmUgc2kgdmVyaWZpY2hlclx1MDBlMCB1biBjb25mbGl0dG8gZGkgbm9tZS4gQ29udHJvbGxhcmUgaWwgbm9tZSBkZWxsYSBwcmVzZW50YXppb25lIGRlbGwnZWxlbWVudG8gcGVyIGxhIGR1cGxpY2F6aW9uZSBlIHByb3ZhcmUgbnVvdmFtZW50ZQ0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVycm9yX3JlYXNvbj1TaSBcdTAwZTggdmVyaWZpY2F0byB1biBlcnJvcmUuIEZhcmUgY2xpYyBzdSBEZXR0YWdsaSBwZXIgdWx0ZXJpb3JpIGluZm9ybWF6aW9uaS4NCi1zYXZlUHJvY2Vzc0Vycm9yX3JlYXNvbj1TaSBcdTAwZTggdmVyaWZpY2F0byB1biBlcnJvcmUgZHVyYW50ZSBpbCBzYWx2YXRhZ2dpbyBkZWwgcHJvY2Vzc28gJyd7MH0nJy4gRmFyZSBjbGljIHN1IERldHRhZ2xpIHBlciB1bHRlcmlvcmkgaW5mb3JtYXppb25pLg0KLWRlbGV0ZVJlZmVyZW5jZXNFcnJvcl9yZWFzb249U2kgXHUwMGU4IHZlcmlmaWNhdG8gdW4gZXJyb3JlIGR1cmFudGUgbGEgcmltb3ppb25lIGRlaSByaWZlcmltZW50aSBhc3NvY2lhdGkgYSBxdWVzdG8gZWxlbWVudG8uIEZhcmUgY2xpYyBzdSBEZXR0YWdsaSBwZXIgdWx0ZXJpb3JpIGluZm9ybWF6aW9uaS4NCi1zYXZlRmlsZUVycm9yX3JlYXNvbj1TaSBcdTAwZTggdmVyaWZpY2F0byB1biBlcnJvcmUgZHVyYW50ZSBpbCBzYWx2YXRhZ2dpbyBkZWwgZmlsZSAnJ3swfScnLiBGYXJlIGNsaWMgc3UgRGV0dGFnbGkgcGVyIHVsdGVyaW9yaSBpbmZvcm1hemlvbmkuDQotaW52YWxpZFJlZmVyZW5jZXNFcnJvcl9yZWFzb249UmlsZXZhdGkgZWxlbWVudGkgZGkgbWV0b2RvIGNvbiByaWZlcmltZW50aSBub24gdmFsaWRpIGNvbWUgcmlzdWx0YXRvIGRpIHVuYSBjb3BpYSBkYSB1biBwbHVnLWluIGFsbCdhbHRyby5cblF1ZXN0aSByaWZlcmltZW50aSB2ZXJyYW5ubyByaW1vc3NpLiBDb250aW51YXJlPw0KLXVucmVzb2x2ZWRPYmplY3RFcnJvcl9yZWFzb249Tm9uIFx1MDBlOCBwb3NzaWJpbGUgbW9kaWZpY2FyZSB1biBvZ2dldHRvIGNoZSBub24gXHUwMGU4IHN0YXRvIHJpc29sdG86IHswfShVUkkgPSB7MX0pezJ9DQotDQotIyBXYXJuaW5nIG1lc3NhZ2VzDQotTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE4VzogSW1wb3NzaWJpbGUgdHJvdmFyZSB1bm8gbyBwaVx1MDBmOSBlbGVtZW50aSBkaSBvcmlnaW5lLiBJIGZpbGUgYXNzb2NpYXRpIG5lbGxhIGNhcnRlbGxhIGRlbGxlIHJpc29yc2Ugbm9uIHZlcnJcdTAwZTAgY29waWF0by4NCi1BY3Rpdml0eUFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE5VzogSW1wb3NzaWJpbGUgdHJvdmFyZSB1bm8gbyBwaVx1MDBmOSBlbGVtZW50aSBkaSBvcmlnaW5lLiBJIHBhY2NoZXR0aSBkZWwgcHJvY2Vzc28gYXNzb2NpYXRpIG5vbiB2ZXJyYW5ubyBjb3BpYXRpLg0KLUFjdGl2aXR5RHJvcENvbW1hbmRfZGVlcENvcHlfcHJvbXB0Q29uZmlndXJhdGlvbk1zZz1Db3BpYXJlIHR1dHRpIGkgZGVzY3JpdHRvcmk/XG5cbkZhY2VuZG8gY2xpYyBzdSBObyBzaSBjb3BpYW5vIHNvbG8gaSBkZXNjcml0dG9yaSBjaGUgZmFubm8gcGFydGUgZGVsbGEgY29uZmlndXJhemlvbmUgY29ycmVudGUuDQotZGVlcENvcHlfcHJvbXB0TXNnPVNpIG90dGllbmUgdW5hIGNvcGlhIGRpIHR1dHRpIGdsaSBlbGVtZW50aSBjb2xsZWdhdGkgaW4gbW9kbyBkaW5hbWljbyBuZWNlc3NhcmlhIHBlciBtYW50ZW5lcmxpIHNlcGFyYXRpIGQnb3JhIGluIHBvaS4gQ29udGludWFyZT8NCi1kZWVwQ29weV90aXRsZT1Db3BpYSBwcm9mb25kYQ0KLQ0KLSMgUHJvZ3Jlc3MgbWVzc2FnZXMNCi1jcmVhdGluZ1Byb2Nlc3NDb21wb25lbnRUYXNrX25hbWU9Q3JlYXppb25lIGRlbCBjb21wb25lbnRlIGRlbCBwcm9jZXNzbyAnJ3swfScnIGluIGNvcnNvLi4uDQotcHJvY2Vzc2luZ1JlZmVyZW5jZXNUYXNrX25hbWU9RWxhYm9yYXppb25lIGRlaSByaWZlcmltZW50aSBpbiBjb3Jzby4uLg0KLWRlbGV0aW5nRWxlbWVudHNUYXNrX25hbWU9RWxpbWluYXppb25lIGRlZ2xpIGVsZW1lbnRpIGUgZGVpIGZpbGUgYXNzb2NpYXRpIGluIGNvcnNvLi4uDQotY2hlY2tpbmdSZWZlcmVuY2VzVGFza19uYW1lPVZlcmlmaWNhIGRlaSByaWZlcmltZW50aSBpbiBjb3Jzby4uLg0KLXJlbW92aW5nUmVmZXJlbmNlc3Rhc2tfbmFtZT1SaW1vemlvbmUgZGVpIHJpZmVyaW1lbnRpIGluIGNvcnNvLi4uDQotc2F2aW5nTW9kaWZpZWRGaWxlc1Rhc2tfbmFtZT1TYWx2YXRhZ2dpbyBkZWkgZmlsZSBtb2RpZmljYXRpIGluIGNvcnNvLi4uDQotY2hlY2tBZmZlY3RlZFJlc291cmNlc1Rhc2tfbmFtZT1WZXJpZmljYSBkZWxsZSByaXNvcnNlIGNvaW52b2x0ZS4uLg0KLW1vdmluZ1Rhc2tfbmFtZT1TcG9zdGFtZW50byBpbiBjb3Jzby4uLg0KLW1vdmluZ0ZpbGVzVGFza19uYW1lPVNwb3N0YW1lbnRvIGRlaSBmaWxlIGluIGNvcnNvLi4uDQotY29weWluZ1Jlc291cmNlc1Rhc2tfbmFtZT1Db3BpYSBkZWxsZSByaXNvcnNlIGluIGNvcnNvLi4uDQotY29weWluZ0FjdGl2aXRpZXNfbXNnPUNvcGlhIGRlbGwnJ2F0dGl2aXRcdTAwZTAgJyd7MH0nJw0KLXNhdmluZ0ZpbGVUYXNrX25hbWU9U2FsdmF0YWdnaW8gZGVsIGZpbGUgJyd7MH0nJyBpbiBjb3Jzby4uLg0KLQ0KLSMgVUkgVGV4dA0KLWVsZW1lbnRfdGV4dD1lbGVtZW50bw0KLWNyZWF0ZUVsZW1lbnRfdGV4dD1DcmVhIGVsZW1lbnRvDQotY3JlYXRlUHJvY2Vzc190ZXh0PUNyZWEgcHJvY2Vzc28NCi1jb250cmlidXRlc1RvX3RleHQ9Q29udHJpYnVpc2NlIGENCi1sb2NhbENvbnRyaWJ1dGVzVG9fdGV4dD1Db250cmlidWlzY2UgbG9jYWxtZW50ZSBhDQotZXh0ZW5kc190ZXh0PUVzdGVuZGUNCi1yZXBsYWNlc190ZXh0PVNvc3RpdHVpc2NlDQotbG9jYWxSZXBsYWNlc190ZXh0PVNvc3RpdHVpc2NlIGxvY2FsbWVudGUNCi1sb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHlfdGV4dD1Tb3N0aXR1emlvbmUgbG9jYWxlIGUgY29waWEgcHJvZm9uZGENCi1lbGVtZW50VHlwZV90ZXh0PXswfTogezF9DQotZGVsaXZlcmFibGVzX3RleHQ9Q29tcG9uZW50aSBkaXN0cmlidWliaWxpDQotY29udHJpYnV0ZVRvQWN0aXZpdHlfdGV4dD1Db250cmlidWlzY2kgYWQgYXR0aXZpdFx1MDBlMA0KLUFjdGl2aXR5RHJvcENvbW1hbmRfbGFiZWw9QXR0aXZpdFx1MDBlMCBkaSByaWxhc2Npbw0KLXJlcGxhY2VBY3Rpdml0eV90ZXh0PVNvc3RpdHVpc2NpIGF0dGl2aXRcdTAwZTANCi1maWxlX3RleHQ9ZmlsZQ0KLWRpcmVjdG9yeV90ZXh0PWRpcmVjdG9yeQ0KLXVucmVzb2x2ZWRfdGV4dD0obm9uIHJpc29sdG8gJyd7MH0nJykNCi1hc3Npc3RzX3RleHQ9QXNzaXN0ZQ0KLXVua25vd25fdGV4dD1TY29ub3NjaXV0byANCi1jb21tYW5kX2RvbmU9Q29tcGxldGF0bw0KLQ0KLSMgVGhlIGZvbGxvd2luZyBVSSB0ZXh0IHNob3VsZCBiZSByZXZpZXdlZC4NCi1VdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eXdpdGhwbHVnaW5faW5mbz17MH0gKHsxfSAnJ3syfScnIGluICcnezN9JycpDQotVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHlfaW5mbz17MH0gKHsxfSAnJ3syfScnKQ0KLXVpX3JlZl9kZWxldGU9SWwgZGVzY3JpdHRvcmUgJyd7MH0nJyBkaXNwb25lIGRlaSBzZWd1ZW50aSByaWZlcmltZW50aSBjaGUgbm9uIHNvbm8gdXRpbGl6emF0aSBhbHRyb3ZlLlxuU2VsZXppb25hcmUgaSByaWZlcmltZW50aSBjaGUgc2kgZGVzaWRlcmEgZWxpbWluYXJlOg0KLXVpX3JlZl9kZWxldGUyPUkgc2VndWVudGkgcmlmZXJpbWVudGkgbm9uIHNvbm8gdXRpbGl6emF0aSBkYSBuZXNzdW5hIHBhcnRlLlxuU2VsZXppb25hcmUgaSByaWZlcmltZW50aSBjaGUgc2kgZGVzaWRlcmEgZWxpbWluYXJlOg0KLXVpX3JlZmVyZW5jZXM9UmlmZXJpbWVudGkNCi11aV93b3JrcHJvZHVjdF9kZXNjcmlwdG9yX2Rlc2NyaXB0aW9uPUlsIGRlc2NyaXR0b3JlIGRpIHByb2RvdHRpIGRpIGxhdm9ybyAnJ3swfScnIFx1MDBlOCBhc3NvY2lhdG8gKE91dHB1dCBkaSkgYWwgZGVzY3JpdHRvcmUgZGkgb3BlcmF6aW9uaSAnJ3sxfScnDQotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX29wdGlvbnM9T3B6aW9uaQ0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vdXRwdXRsYWJlbD1SaW11b3ZpIGRlc2NyaXR0b3JlIGRpIHByb2RvdHRpIGRpIGxhdm9ybyBjb21lIG91dHB1dCBkZWwgZGVzY3JpdHRvcmUgZGkgb3BlcmF6aW9uaQ0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9kZWxldGVfdGFzaz1FbGltaW5hIGRlc2NyaXR0b3JlIGRpIG9wZXJhemlvbmkgZGFsbCdhdHRpdml0XHUwMGUwDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX2RlZmF1bHRjb25maWdjaGVjaz1MJydlbGVtZW50byBzZWxlemlvbmF0byAnJ3swfScnIG5vbiBcdTAwZTggbGEgY29uZmlndXJhemlvbmUgcHJlZGVmaW5pdGEgZGVsIHByb2Nlc3NvLlxuQWdnaXVuZ2VyZSBxdWVzdG8gZWxlbWVudG8gZSBsZSByZWxhdGl2ZSBkaXBlbmRlbnplIGFsbGEgY29uZmlndXJhemlvbmUgcHJlZGVmaW5pdGE/DQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX2dlbmVyaWNFcnJfbWVzc2FnZV90ZXh0PUVycm9yaSBkdXJhbnRlIGwnb3BlcmF6aW9uZS4gRmFyZSBjbGljIHN1IGRldHRhZ2xpIHBlciB1bHRlcmlvcmkgaW5mb3JtYXppb25pLg0KLVByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fbm9EZXNjcmlwdG9yVG9TeW5jaD1OZXNzdW4gZGVzY3JpdHRvcmUgY29uIGVsZW1lbnRvIGRpIG1ldG9kbyBjb2xsZWdhdG8gcmlsZXZhdG8gcGVyIGxhIHNpbmNyb25penphemlvbmUNCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9yZWZlcnNoaW5ndmlld2VyPUVycm9yZSBkdXJhbnRlIGwnYWdnaW9ybmFtZW50byBkZWwgdmlzdWFsaXp6YXRvcmUNCi1jb25maXJtX3JlbW92ZV9yZWZlcmVuY2VzX3RleHQ9R2xpIGVsZW1lbnRpIGVsZW5jYXRpIG5laSBkZXR0YWdsaSBwb3RyZWJiZXJvIGF2ZXJlIHJpZmVyaW1lbnRpIGlsbGVnYWxpIGEgcXVlc3RhIGd1aWRhIGRvcG8gbGEgY29udmVyc2lvbmUuIEZhcmUgY2xpYyBzdSBPSyBwZXIgcmltdW92ZXJsaSBlIGNvbnRpbnVhcmUuDQotdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfdW5oYW5kbGVkX2V4Y2VwdGlvbj1FY2NlemlvbmUgbm9uIGdlc3RpdGENCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX2JyZWFrZG93bl9lbGVtZW50PUltcG9zc2liaWxlIGF2ZXJlIGxvIHN0ZXNzbyBlbGVtZW50byBkaSBpbnRlcnJ1emlvbmUgY29tZSBwcmVkZWNlc3NvcmUgZSBzdWNjZXNzb3JlDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dwbGlzdGRsZ19tc2c9SWwgcHJvZG90dG8gZGVsIGxhdm9ybyAnJ3swfScnIFx1MDBlOCB1biBvdXRwdXQgZGVsbGUgc2VndWVudGkgb3BlcmF6aW9uaS5cblNlbGV6aW9uYXJlIGxlIG9wZXJhemlvbmkgcGVyIGxlIHF1YWxpIHNpIGRlc2lkZXJhIGNyZWFyZSBpIGRlc2NyaXR0b3JpIGNvcnJpc3BvbmRlbnRpLg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9yb2xlbGlzdGRsZ19tc2c9TGEgcmVnb2xhICcnezB9JycgXHUwMGU4IHJlc3BvbnNhYmlsZSBkZWkgc2VndWVudGkgcHJvZG90dGkgZGkgbGF2b3JvLlxuU2VsZXppb25hcmUgaSBwcm9kb3R0aSBkaSBsYXZvcm8gcGVyIGkgcXVhbGkgc2kgZGVzaWRlcmEgY3JlYXJlIGkgZGVzY3JpdHRvcmkgY29ycmlzcG9uZGVudGkuDQotdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfZmF0YWxlcnI9RXJyb3JlIGlycmV2ZXJzaWJpbGUNCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd29ya3Byb2R1Y3RzPVByb2RvdHRpIGRpIGxhdm9ybw0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfc3ViX2VsZW1lbnQ9SW1wb3NzaWJpbGUgY29sbGVnYXJlIHVuIGVsZW1lbnRvIGRlbGxhIHN1ZGRpdmlzaW9uZSBhIHVubyBkZWkgcmVsYXRpdmkgZWxlbWVudGkgY2hpbGQNCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl93cm9uZ19lbGVtZW50PUltcG9zc2liaWxlIGNvbGxlZ2FyZSBhbGwnZWxlbWVudG8gdW4gZWxlbWVudG8gZGl2ZXJzbyBkYSBxdWVsbG8gZGVsbGEgc3VkZGl2aXNpb25lIGRpIGxhdm9yby4NCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9jaGlsZF9lbGVtZW50PUltcG9zc2liaWxlIGNvbGxlZ2FyZSB1biBlbGVtZW50byBkZWxsYSBzdWRkaXZpc2lvbmUgYSB1bm8gZGVpIHJlbGF0aXZpIGVsZW1lbnRpIGNoaWxkLg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl90YXNrcz1PcGVyYXppb25pDQotdWlfYXNzb2NpYXRpb25fdGFza19zZWxlY3Rpb249U2VsZXppb25lIG9wZXJhemlvbmkuLi4NCi11dGlsX1Byb2Nlc3NVdGlsX2NoaWxkYWRhcHRlcj1cIFwgYWRhdHRhdG9yZSBkZWxsJ2VsZW1lbnRvIGNoaWxkOiANCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zZXRwYXJlbnQ9SW1wb3NzaWJpbGUgaW1wb3N0YXJlIGVsZW1lbnRvIHBhcmVudCBwZXIgZWxlbWVudG8gY2hpbGQNCi11dGlsX3RuZ3V0aWxfY2Fubm90X2VkaXRfcmVzb3VyY2U9SW1wb3NzaWJpbGUgbW9kaWZpY2FyZSByaXNvcnNhLg0KLXV0aWxfUHJvY2Vzc1V0aWxfY29udHJpYnV0ZXN0bz1jb250cmlidWlzY2UgYSAnJ3swfScnDQotdXRpbF9Qcm9jZXNzVXRpbF9sb2NhbENvbnRyaWJ1dGVzdG89Y29udHJpYnVpc2NlIGxvY2FsbWVudGUgYSAnJ3swfScnDQotcHJvY2Vzc19leHRlbmRzPWVzdGVuZGUgJyd7MH0nJw0KLXByb2Nlc3NfcmVwbGFjZXM9c29zdGl0dWlzY2UgJyd7MH0nJw0KLXByb2Nlc3NfbG9jYWxSZXBsYWNlcz1zb3N0aXR1aXNjZSBsb2NhbG1lbnRlICcnezB9JycNCi0jIEZpbHRlciBjb25zdGFudHMgZXh0ZXJuYWxpemVkIHN0cmluZ3MuDQotRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVzX3RleHQ9RGlzY2lwbGluZQ0KLUZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lZ3JvdXBpbmdzX3RleHQ9UmFnZ3J1cHBhbWVudGkgZGlzY2lwbGluZQ0KLUZpbHRlckNvbnN0YW50c193aGl0ZXBhcGVyc190ZXh0PVdoaXRlcGFwZXINCi1GaWx0ZXJDb25zdGFudHNfdG9vbG1lbnRvcnNfdGV4dD1HdWlkYSBhbCB0b29sDQotRmlsdGVyQ29uc3RhbnRzX3Rvb2xzX3RleHQ9VG9vbA0KLUZpbHRlckNvbnN0YW50c19yb2xlc190ZXh0PVJ1b2xpDQotRmlsdGVyQ29uc3RhbnRzX3Rhc2tzX3RleHQ9T3BlcmF6aW9uaQ0KLUZpbHRlckNvbnN0YW50c19yZXVzYWJsZWFzc2V0c190ZXh0PVJpc29yc2Ugcml1dGlsaXp6YWJpbGkNCi1GaWx0ZXJDb25zdGFudHNfYWxsX3RleHQ9VHV0dG8NCi1GaWx0ZXJDb25zdGFudHNfcHJvY2Vzc2VzX3RleHQ9UHJvY2Vzc2kNCi1GaWx0ZXJDb25zdGFudHNfcHJhY3RpY2VzX3RleHQ9UHJhdGljaGUNCi1GaWx0ZXJDb25zdGFudHNfdGVtcGxhdGVzX3RleHQ9TW9kZWxsaQ0KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHNfdGV4dD1Qcm9kb3R0aSBkaSBsYXZvcm8NCi1GaWx0ZXJDb25zdGFudHNfY2hlY2tsaXN0c190ZXh0PUVsZW5jaGkgZGkgY29udHJvbGxvDQotRmlsdGVyQ29uc3RhbnRzX2d1aWRlbGluZXNfdGV4dD1MaW5lZSBndWlkYQ0KLUZpbHRlckNvbnN0YW50c19yb2xlc2V0c190ZXh0PUluc2llbWkgZGkgcnVvbGkNCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGFuY2VfdGV4dD1HdWlkYQ0KLUZpbHRlckNvbnN0YW50c19jb25jZXB0c190ZXh0PUNvbmNldHRpDQotRmlsdGVyQ29uc3RhbnRzX2V4YW1wbGVzX3RleHQ9RXNlbXBpDQotRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRwYWNrYWdlc190ZXh0PVBhY2NoZXR0aSBkZWwgY29udGVudXRvDQotRmlsdGVyQ29uc3RhbnRzX3JvbGVkZXNjcmlwdG9yc190ZXh0PURlc2NyaXR0b3JpIGRpIHJ1b2xpDQotRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRncm9wdWluZ3NfdGV4dD1SYWdncnVwcGFtZW50aSBpbnNpZW1pIGRpIHJ1b2xpDQotRmlsdGVyQ29uc3RhbnRzX3Rhc2tkZXNjcmlwdG9yc190ZXh0PURlc2NyaXR0b3JpIGRpIG9wZXJhemlvbmkNCi1GaWx0ZXJDb25zdGFudHNfY29udGVudGVsZW1lbnRzX3RleHQ9RWxlbWVudGkgZGVsIGNvbnRlbnV0bw0KLVByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fcHJlcGFyZT1QcmVwYXJhemlvbmUgYWxsYSBzaW5jcm9uaXp6YXppb25lIGluIGNvcnNvLi4uDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcnNfdGV4dD1EZXNjcml0dG9yaSBkaSBwcm9kb3R0aSBkaSBsYXZvcm8NCi1GaWx0ZXJDb25zdGFudHNfYWxsY29udGVudGVsZW1lbnRzX3RleHQ9VHV0dGkgZ2xpIGVsZW1lbnRpIGRlbCBjb250ZW51dG8NCi1GaWx0ZXJDb25zdGFudHNfc3VwcG9ydGluZ21hdGVyaWFsc190ZXh0PU1hdGVyaWFsZSBkaSBzdXBwb3J0bw0KLU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX2Vycm9yU2F2aW5nRmlsZXM9RXJyb3JlIGR1cmFudGUgaWwgc2FsdmF0YWdnaW8gZGVpIGZpbGUNCi1GaWx0ZXJDb25zdGFudHNfY3VzdG9tY2F0ZWdvcmllc190ZXh0PUNhdGVnb3JpZSBwZXJzb25hbGl6emF0ZQ0KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHR5cGVzX3RleHQ9VGlwaSBkaSBwcm9kb3R0byBkaSBsYXZvcm8NCi1EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZF93YXJuaW5nTXNnPUVsaW1pbmF6aW9uZSBjb21wbGV0YXRhIGNvbiBhdnZpc28NCi1GaWx0ZXJDb25zdGFudHNfbWV0aG9kcGx1Z2luc190ZXh0PVBsdWctaW4gZGVsIG1ldG9kbw0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9sb2NrZWRQbHVnaW49SVVQTDAxMjBFOiBJbCBwbHVnaW4gJyd7MH0nJyBcdTAwZTggYmxvY2NhdG8uDQotRmlsdGVyQ29uc3RhbnRzX2RvbWFpbnNfdGV4dD1Eb21pbmkNCi1GaWx0ZXJDb25zdGFudHNfcm9hZG1hcF90ZXh0PVJvYWRtYXANCi1GaWx0ZXJDb25zdGFudHNfcmVwb3J0c190ZXh0PVJlcG9ydA0KLUF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWw9UyZpbmNyb25penphemlvbmUgcHJlZGVmaW5pdGEgZGFsIGNvbnRlbnV0byBkZWwgbWV0b2RvDQotTWFudWFsU3luY2hyb25pemVDb21tYW5kX2xhYmVsPVNpbmNyb25penphemlvbmUgJnBlcnNvbmFsaXp6YXRhIGluIGNvcnNvLi4uDQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9zdWNlc3NmdWw9U2luY3Jvbml6emF6aW9uZSBjb21wbGV0YXRhIGNvcnJldHRhbWVudGUuDQotDQotIyBVc2VySW50ZXJhY3Rpb25IZWxwZXINCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfUHJvY2Vzc1BhY2thZ2VfTmFtZT1Ob21lOiANCi0jIE1ldGhvZENyZWF0ZUNoaWxkQ29tbWFuZA0KLW5ld0VsZW1lbnRfdGV4dD1OdW92byB7MH0NCi11cGRhdGVfb3V0b2ZzeW5jaF90aXRsZT1Db25mbGl0dG8gZGkgYWdnaW9ybmFtZW50bw0KLXVwZGF0ZV9vdXRvZnN5bmNoX21zZz1JIGZpbGUgc29ubyBzdGF0aSBtb2RpZmljYXRpIG5lbCBmaWxlIHN5c3RlbS4gU292cmFzY3JpdmVyZSBsZSBtb2RpZmljaGU/DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfamEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczMGJjZDQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEdlbmVyaWMgRGlhbG9nIFRpdGxlcw0KLW1vdmVEaWFsb2dfdGl0bGU9XHU3OWZiXHU1MmQ1DQotZGVsZXRlRGlhbG9nX3RpdGxlPVx1ODk4MVx1N2QyMFx1MzA2ZVx1NTI0YVx1OTY2NA0KLWVycm9yRGlhbG9nX3RpdGxlPVx1MzBhOFx1MzBlOVx1MzBmYw0KLWVycm9yRGlhbG9nX2Nhbm5vdFJlbmFtZT17MH0gJyd7MX0nJyBcdTMwOTIgJyd7Mn0nJyBcdTMwNmJcdTU0MGRcdTUyNGRcdTU5MDlcdTY2ZjRcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIgXHUzMDBjXHU4YTczXHU3ZDMwXHUzMDBkXHUzMDZiXHU3OTNhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDhiXHU1NTRmXHU5ODRjXHUzMDkyXHU4OWUzXHU2YzdhXHUzMDU3XHUzMDY2XHUzMDRiXHUzMDg5XHUzMDBjT0tcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTdkOWFcdTg4NGNcdTMwNTlcdTMwOGJcdTMwNGJcdTMwMDFcdTMwMGNcdTMwYWRcdTMwZTNcdTMwZjNcdTMwYmJcdTMwZWJcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTY0Y2RcdTRmNWNcdTMwOTJcdTYyNTNcdTMwNjFcdTUyMDdcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIENvbmZpcm0gUmVmZXJlbmNlcyBSZW1vdmFsIERpYWxvZw0KLWRlbGV0ZVJlZmVyZW5jZXNEaWFsb2dfdGl0bGU9XHU1M2MyXHU3MTY3XHUzMDZlXHU5NjY0XHU1M2JiXHUzMDZlXHU3OGJhXHU4YThkDQotZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190ZXh0PVx1NTI0YVx1OTY2NFx1MzA1N1x1MzA4OFx1MzA0Nlx1MzA2OFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1ODk4MVx1N2QyMFx1MzA2Zlx1MzAwMVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1NTE4NVx1MzA2ZVx1NTIyNVx1MzA2ZVx1ODk4MVx1N2QyMFx1MzA2Ylx1MzA4OFx1MzA2M1x1MzA2Nlx1NTNjMlx1NzE2N1x1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwNTNcdTMwOGNcdTMwODlcdTMwNmVcdTg5ODFcdTdkMjBcdTMwOTJcdTUyNGFcdTk2NjRcdTMwNTlcdTMwOGJcdTMwNjhcdTMwMDFcdTMwNWRcdTMwNmVcdTg5ODFcdTdkMjBcdTMwNzhcdTMwNmVcdTUzYzJcdTcxNjdcdTMwODJcdTUyNGFcdTk2NjRcdTMwNTVcdTMwOGNcdTMwOGJcdTMwNWZcdTMwODFcdTMwMDFcdTUzYzJcdTcxNjdcdTMwNTlcdTMwOGJcdTUwNzRcdTMwNmVcdTg5ODFcdTdkMjBcdTMwODJcdTU0MGNcdTY5ZDhcdTMwNmJcdTY2ZjRcdTY1YjBcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDIgIFx1MzAwY09LXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU5XHUzMDhiXHU1MjRkXHUzMDZiXHUzMDAxXHU1M2MyXHU3MTY3XHUzMDU5XHUzMDhiXHU1MDc0XHUzMDZlXHU4OTgxXHU3ZDIwXHUzMDkyXHU2NmY0XHU2NWIwXHUzMDU5XHUzMDhiXHU4YTMxXHU1M2VmXHUzMDRjXHUzMDQyXHUzMDhiXHUzMDUzXHUzMDY4XHUzMDkyXHU3OGJhXHU4YThkXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyICBcdTMwMGNcdThhNzNcdTdkMzBcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwMDFcdTUyNGFcdTk2NjRcdTViZmVcdThjNjFcdTMwNjdcdTMwNDJcdTMwOGJcdTg5ODFcdTdkMjBcdTMwOTJcdTUzYzJcdTcxNjdcdTMwNTlcdTMwOGJcdTg5ODFcdTdkMjBcdTMwNmVcdTMwZWFcdTMwYjlcdTMwYzhcdTMwOTJcdTY5MWNcdThhMGVcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi0NCi0jIFJlc29sdmUgTmFtZSBDb25mbGljdCBEaWFsb2cNCi1yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RpdGxlPVx1ODk4MVx1N2QyMFx1NTQwZFx1MzA2ZVx1N2FmNlx1NTQwOFx1MzA2ZVx1ODllM1x1NmM3YQ0KLXJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGV4dD0nJ3sxfScnIFx1MzA2Ylx1NWJmZVx1MzA1N1x1MzA2Nlx1NjViMFx1ODk4ZiB7MH0gXHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0Og0KLQ0KLSMgU2VsZWN0IERlbGl2ZXJhYmxlcyBEaWFsb2cNCi1zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGl0bGU9XHU3ZDBkXHU1MTY1XHU3MjY5XHUzMDZlXHU5MDc4XHU2MjllDQotc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4ICcnezB9JycgXHUzMDkyXHU1MjcyXHUzMDhhXHU1ZjUzXHUzMDY2XHUzMDVmXHUzMDQ0XHU3ZDBkXHU1MTY1XHU3MjY5XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBOZXcgUHJvY2VzcyBDb21wb25lbnQgRGlhbG9nDQotbmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZ190aXRsZT1cdTY1YjBcdTg5OGZcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwZmJcdTMwYjNcdTMwZjNcdTMwZGRcdTMwZmNcdTMwY2RcdTMwZjNcdTMwYzgNCi1uYW1lTGFiZWxfdGV4dD1cdTU0MGRcdTUyNGQ6DQotZGVmYXVsdENvbmZpZ0xhYmVsX3RleHQ9XHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHU2OWNiXHU2MjEwOg0KLWJhc2VQcm9jZXNzTGFiZWxfdGV4dD1cdTU3ZmFcdTY3MmNcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjk6DQotYmFzZWRPblByb2Nlc3Nlc0xhYmVsX3RleHQ9XHU1N2ZhXHU2NzJjXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5Og0KLQ0KLSMgUm9sZSBBc3NvY2lhdGlvbiBEaWFsb2cNCi1zZWxlY3RBc3NvY2lhdGlvbkxhYmVsX3RleHQ9XHUzMGJmXHUzMGI5XHUzMGFmICcnezB9JycgXHUzMDZlXHU5NWEyXHU5MDIzXHUzMDkyXHU5MDc4XHU2MjllDQotDQotIyBSZW1vdmUgQXNzb2NpYXRpb24gZGlhbG9nDQotcmVtb3ZlQXNzb2NpYXRpb25EaWFsb2dfdGV4dD1cdTk1YTJcdTkwMjNcdTMwNmVcdTk2NjRcdTUzYmINCi0NCi0jIFNlbGVjdCBUZWFtcyBEaWFsb2cNCi1zZWxlY3RUZWFtc0RpYWxvZ190aXRsZT1cdTMwYzFcdTMwZmNcdTMwZTBcdTMwNmVcdTkwNzhcdTYyOWUNCi1zZWxlY3RUZWFtc0RpYWxvZ190ZXh0PVx1MzBlZFx1MzBmY1x1MzBlYiAnJ3swfScnIFx1MzA5Mlx1NTI3Mlx1MzA4YVx1NWY1M1x1MzA2Nlx1MzA1Zlx1MzA0NFx1MzBjMVx1MzBmY1x1MzBlMFx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLSMgVGFzbCBTZWxlY3Rpb24gRGlhbG9nDQotdGFza1NlbGVjdGlvbkRpYWxvZ190aXRsZT1cdTMwYmZcdTMwYjlcdTMwYWZcdTMwNmVcdTkwNzhcdTYyOWUNCi10aXRsZUxhYmVsX3RleHQ9XHUzMGJmXHUzMGI5XHUzMGFmXHUzMDZlXHU5MDc4XHU2MjllLi4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZz1JVVBMMDEwMEU6IHswfSBcdTMwNmVcdTU0MGRcdTUyNGRcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcblxuXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMDRhXHUzMDg4XHUzMDczXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHU4OTgxXHU3ZDIwXHUzMDZiXHUzMDZmXHU1NDBkXHU1MjRkXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5XHUzMDAyXG5cblx1NjcwOVx1NTJiOVx1MzA2YVx1NTQwZFx1NTI0ZFx1MzA5Mlx1NTE2NVx1NTI5Ylx1MzA1N1x1MzA2Nlx1MzA0Ylx1MzA4OVx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnPVx1NTQwZFx1NTI0ZFx1MzA5Mlx1N2E3YVx1MzA2Ylx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMiBcdTY3MDlcdTUyYjlcdTMwNmFcdTU0MGRcdTUyNGRcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZz1JVVBMMDEwMUU6IFx1NTQwZFx1NTI0ZCAnJ3swfScnIFx1MzA2Zlx1NjVlMlx1MzA2Ylx1NWI1OFx1NTcyOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMlxuXG5cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTg5ODFcdTdkMjBcdTMwNmVcdTU0MGRcdTUyNGRcdTMwNmZcdTU2ZmFcdTY3MDlcdTMwNjdcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNmFcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcblxuXHU1MjI1XHUzMDZlXHU1NDBkXHU1MjRkXHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDY2XHUzMDRiXHUzMDg5XHU1MThkXHU4YTY2XHU4ODRjXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnPVx1NTQwY1x1MzA1OFx1ODk4MVx1N2QyMFx1NTQwZFx1MzA0Y1x1NjVlMlx1MzA2Ylx1NWI1OFx1NTcyOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMiBcdTUyMjVcdTMwNmVcdTU0MGRcdTUyNGRcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjFfbXNnPUlVUEwwMTAyRTogXHU1NDBkXHU1MjRkICcnezB9JycgXHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyXG5cblx1MzBiOVx1MzBkYVx1MzBmY1x1MzBiOVx1MzA2N1x1NTljYlx1MzA3ZVx1MzA4Ylx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMFx1NTQwZFx1MzA2Zlx1NjMwN1x1NWI5YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXG5cdTY3MDlcdTUyYjlcdTMwNmFcdTU0MGRcdTUyNGRcdTMwOTJcdTUxNjVcdTUyOWJcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjJfbXNnPUlVUEwwMTAzRTogXHU1NDBkXHU1MjRkICcnezB9JycgXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyXG5cblx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMFx1NTQwZFx1MzA2ZVx1NjcyYlx1NWMzZVx1MzA2Ylx1MzBkNFx1MzBlYVx1MzBhYVx1MzBjOVx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXG5cdTY3MDlcdTUyYjlcdTMwNmFcdTU0MGRcdTUyNGRcdTMwOTJcdTUxNjVcdTUyOWJcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjNfbXNnPUlVUEwwMTA0RTogXHU1NDBkXHU1MjRkICcnezB9JycgXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyXG5cblx1NmIyMVx1MzA2ZVx1NjU4N1x1NWI1N1x1MzA5Mlx1NTQyYlx1MzA4MFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMFx1NTQwZFx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MzogXFwgLyA6ICogPyAiIDwgPiA7IHxcblxuXHU2NzA5XHU1MmI5XHUzMDZhXHU1NDBkXHU1MjRkXHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDY2XHUzMDRiXHUzMDg5XHU1MThkXHU4YTY2XHU4ODRjXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotbm9Db25maWdFcnJvcl9tc2c9SVVQTDAxMDVFOiBcdTczZmVcdTg4NGNcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmJcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5Y2JcdTYyMTBcdTMwNGNcdTU0MmJcdTMwN2VcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcblxuXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OWNiXHU2MjEwXHUzMDZmXHUzMDAxXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDZlXHU2NWIwXHU4OThmXHU0ZjVjXHU2MjEwXHUzMDZiXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5XHUzMDAyXG5cblx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA1N1x1MzA2Nlx1MzA0Ylx1MzA4OVx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLW5vRGVsaXZlcnlQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA2RTogXHU3M2ZlXHU1NzI4XHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZiXHUzMGM3XHUzMGVhXHUzMGQwXHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDRjXHU1NDJiXHUzMDdlXHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXG5cblx1NTdmYVx1NjcyY1x1MzBjN1x1MzBlYVx1MzBkMFx1MzBlYVx1MzBmY1x1MzBmYlx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA2Zlx1MzAwMVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1NWJjNFx1NGUwZVx1MzA2ZVx1NjViMFx1ODk4Zlx1NGY1Y1x1NjIxMFx1MzA2Ylx1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OVx1MzAwMlxuXG5cdTMwYzdcdTMwZWFcdTMwZDBcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwOTJcdTRmNWNcdTYyMTBcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1ub0RlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQTDAxMDdFOiBcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5Y2JcdTYyMTBcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcblxuXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OWNiXHU2MjEwXHUzMDkyXHU2NWIwXHU4OThmXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDZiXHU1MjcyXHUzMDhhXHU1ZjUzXHUzMDY2XHUzMDhiXHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyXG5cblx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA2Nlx1MzA0Ylx1MzA4OVx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLW5vQmFzZVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDhFOiBcdTMwYzdcdTMwZWFcdTMwZDBcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcblxuXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHU1YmM0XHU0ZTBlXHUzMDZiXHUzMDZmXHUzMDAxXHU1N2ZhXHU2NzJjXHUzMGM3XHUzMGVhXHUzMGQwXHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5XHUzMDAyXG5cblx1MzBjN1x1MzBlYVx1MzBkMFx1MzBlYVx1MzBmY1x1MzBmYlx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA2Nlx1MzA0Ylx1MzA4OVx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLWNyZWF0ZVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDlFOiBcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwOTJcdTZiNjNcdTVlMzhcdTMwNmJcdTRmNWNcdTYyMTBcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1jcmVhdGVFbGVtZW50RXJyb3JfbXNnPUlVUEwwMTEwRTogXHU4OTgxXHU3ZDIwXHUzMDkyXHU2YjYzXHU1ZTM4XHUzMDZiXHU0ZjVjXHU2MjEwXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotZGVsZXRlRWxlbWVudEVycm9yX21zZz1JVVBMMDExMUU6IFx1ODk4MVx1N2QyMFx1MzA5Mlx1NmI2M1x1NWUzOFx1MzA2Ylx1NTI0YVx1OTY2NFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLWR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3JfbXNnPUlVUEwwMTEyRTogXHU4OTgxXHU3ZDIwXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDkyXHU0ZjVjXHU2MjEwXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXG5cblx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiAnJ3swfScnIFx1MzA2Zlx1NjVlMlx1MzA2Ylx1NWI1OFx1NTcyOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMlxuXG5cdTUyMjVcdTMwNmVcdTU0MGRcdTUyNGRcdTMwOTJcdTUxNjVcdTUyOWJcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX3NpbXBsZV9tc2c9XHU1NDBjXHUzMDU4XHU1NDBkXHU1MjRkXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDRjXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyIFx1NTIyNVx1MzA2ZVx1NTQwZFx1NTI0ZFx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXVuZG9Db21tYW5kRXJyb3JfbXNnPUlVUEwwMTEzRTogXHU1M2Q2XHUzMDhhXHU2ZDg4XHUzMDU3XHUzMGIzXHUzMGRlXHUzMGYzXHUzMGM5ICcnezB9JycgXHUzMDkyXHU1YjhjXHU0ZTg2XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXG5cblx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZjogezF9DQotaW52YWxpZFByZWRlY2Vzc29yRXJyb3JfbXNnPUlVUEwwMTE0RTogXHU3MTIxXHU1MmI5XHUzMDZhXHU1MTQ4XHU4ODRjXHUzMGJmXHUzMGI5XHUzMGFmXHUzMDZlXHUzMGE0XHUzMGYzXHUzMGM3XHUzMGMzXHUzMGFmXHUzMGI5XHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyXG5cblx1NTE0OFx1ODg0Y1x1MzBiZlx1MzBiOVx1MzBhZlx1MzA2ZVx1MzBhNFx1MzBmM1x1MzBjN1x1MzBjM1x1MzBhZlx1MzBiOVx1MzA2Zlx1MzAwY1x1MzBhNFx1MzBmM1x1MzBjN1x1MzBjM1x1MzBhZlx1MzBiOVx1MzAwZFx1NTIxN1x1MzA2Ylx1MzA0Mlx1MzA4Ylx1NjU3NFx1NjU3MFx1NTAyNFx1MzA2N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA2YVx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXG5cdTY3MDlcdTUyYjlcdTMwNmFcdTUwMjRcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzPUlVUEwwMTAwVzogJyd7MH0nJyBcdTMwNmZcdTY1ZTJcdTMwNmIgJyd7MX0nJyBcdTMwNmJcdTk1YTJcdTkwMjNcdTRlZDhcdTMwNTFcdTMwODlcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDIgIFx1MzA1M1x1MzA2ZVx1N2EyZVx1OTg1ZVx1MzA2ZVx1OTVhMlx1OTAyM1x1NGVkOFx1MzA1MVx1MzA2ZiAxIFx1MzA2NFx1MzA1N1x1MzA0Ylx1OGEzMVx1NTNlZlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMiAgJyd7MH0nJyBcdTMwOTIgJyd7Mn0nJyBcdTMwNmJcdTUyNzJcdTMwOGFcdTVmNTNcdTMwNjZcdTMwOGJcdTMwNmJcdTMwNmZcdTMwMDFcdTY3MDBcdTUyMWRcdTMwNmIgJyd7MX0nJyBcdTMwNGJcdTMwODlcdTUyNGFcdTk2NjRcdTMwNTlcdTMwOGJcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDINCi1lcnJvcl9tc2dXaXRoRGV0YWlscz1JVVBMMDExNkU6IFx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiBcdThhNzNcdTMwNTdcdTMwNGZcdTMwNmZcdTMwMGNcdThhNzNcdTdkMzBcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1lcnJvcl9tc2c9SVVQTDAxMTdFOiBcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIgXHU4YTczXHUzMDU3XHUzMDRmXHUzMDZmXHUzMGE4XHUzMGU5XHUzMGZjXHUzMGZiXHUzMGVkXHUzMGIwXHUzMDkyXHU1M2MyXHU3MTY3XHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotU3VwcHJlc3Npb25fbmFtZUR1cGxpY2F0aW9uPUlVUEwwMTE4RTogXHUzMDUzXHUzMDZlXHU2NGNkXHU0ZjVjXHUzMDZlXHU1ZjhjXHUzMDY3XHUzMDAxXHU1NDBkXHU1MjRkXHUzMDZlXHU3YWY2XHU1NDA4XHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyIFx1ODk4MVx1N2QyMFx1MzA2ZVx1NTQwZFx1NTI0ZFx1MzA0Y1x1OTFjZFx1ODkwN1x1MzA1N1x1MzA2Nlx1MzA0NFx1MzA2YVx1MzA0NFx1MzA1M1x1MzA2OFx1MzA5Mlx1NzhiYVx1OGE4ZFx1MzA1N1x1MzA2Nlx1MzA0Ylx1MzA4OVx1MzAwMVx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLVN1cHByZXNzaW9uX3ByZXNlbnRhdGlvbk5hbWVEdXBsaWNhdGlvbj1JVVBMMDExOUU6IFx1MzA1M1x1MzA2ZVx1NjRjZFx1NGY1Y1x1MzA2ZVx1NWY4Y1x1MzA2N1x1MzAwMVx1NTQwZFx1NTI0ZFx1MzA2ZVx1N2FmNlx1NTQwOFx1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTg5ODFcdTdkMjBcdTMwNmVcdTg4NjhcdTc5M2FcdTU0MGRcdTMwNGNcdTkxY2RcdTg5MDdcdTMwNTdcdTMwNjZcdTMwNDRcdTMwNmFcdTMwNDRcdTMwNTNcdTMwNjhcdTMwOTJcdTc4YmFcdThhOGRcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTMwMDFcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249XHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyIFx1OGE3M1x1MzA1N1x1MzA0Zlx1MzA2Zlx1MzAwY1x1OGE3M1x1N2QzMFx1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXNhdmVQcm9jZXNzRXJyb3JfcmVhc29uPVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOSAnJ3swfScnIFx1MzA2ZVx1NGZkZFx1N2JhMVx1NGUyZFx1MzA2Ylx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiBcdThhNzNcdTMwNTdcdTMwNGZcdTMwNmZcdTMwMGNcdThhNzNcdTdkMzBcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1kZWxldGVSZWZlcmVuY2VzRXJyb3JfcmVhc29uPVx1MzA1M1x1MzA2ZVx1ODk4MVx1N2QyMFx1MzA2Ylx1OTVhMlx1OTAyM1x1MzA1OVx1MzA4Ylx1NTNjMlx1NzE2N1x1MzA2ZVx1OTY2NFx1NTNiYlx1NGUyZFx1MzA2Ylx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiBcdThhNzNcdTMwNTdcdTMwNGZcdTMwNmZcdTMwMGNcdThhNzNcdTdkMzBcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1zYXZlRmlsZUVycm9yX3JlYXNvbj1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgJyd7MH0nJyBcdTMwNmVcdTRmZGRcdTdiYTFcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIgXHU4YTczXHUzMDU3XHUzMDRmXHUzMDZmXHUzMDBjXHU4YTczXHU3ZDMwXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotaW52YWxpZFJlZmVyZW5jZXNFcnJvcl9yZWFzb249XHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHU5NTkzXHUzMGIzXHUzMGQ0XHUzMGZjXHUzMDZlXHU3ZDUwXHU2NzljXHUzMDY4XHUzMDU3XHUzMDY2XHUzMDAxXHU3MTIxXHU1MmI5XHUzMDZhXHU1M2MyXHU3MTY3XHUzMDkyXHU2MzAxXHUzMDY0XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU4OTgxXHU3ZDIwXHUzMDkyXHU2OTFjXHU1MWZhXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyXG5cdTMwNTNcdTMwOGNcdTMwODlcdTMwNmVcdTUzYzJcdTcxNjdcdTMwNmZcdTk2NjRcdTUzYmJcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDIgXHU3ZDlhXHU4ODRjXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiPw0KLXVucmVzb2x2ZWRPYmplY3RFcnJvcl9yZWFzb249XHU2NzJhXHU4OWUzXHU2YzdhXHUzMDZlXHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4XHUzMDZmXHU1OTA5XHU2NmY0XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzOiB7MH0oVVJJID0gezF9KXsyfQ0KLQ0KLSMgV2FybmluZyBtZXNzYWdlcw0KLU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZz1JVVBMMDExOFc6IDEgXHUzMDY0XHU0ZWU1XHU0ZTBhXHUzMDZlXHUzMGJkXHUzMGZjXHUzMGI5XHU4OTgxXHU3ZDIwXHUzMDRjXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmXHUzMDAyIFx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzBmYlx1MzBkNVx1MzBhOVx1MzBlYlx1MzBjMFx1MzBmY1x1NTE4NVx1MzA2ZVx1OTVhMlx1OTAyM1x1MzA1OVx1MzA4Ylx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2Zlx1MzBiM1x1MzBkNFx1MzBmY1x1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLUFjdGl2aXR5QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c9SVVQTDAxMTlXOiAxIFx1MzA2NFx1NGVlNVx1NGUwYVx1MzA2ZVx1MzBiZFx1MzBmY1x1MzBiOVx1ODk4MVx1N2QyMFx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMiBcdTk1YTJcdTkwMjNcdTMwNTlcdTMwOGJcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwZmJcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjhcdTMwNmZcdTMwYjNcdTMwZDRcdTMwZmNcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1BY3Rpdml0eURyb3BDb21tYW5kX2RlZXBDb3B5X3Byb21wdENvbmZpZ3VyYXRpb25Nc2c9XHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDkyXHUzMDU5XHUzMDc5XHUzMDY2XHUzMGIzXHUzMGQ0XHUzMGZjXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiP1xuXG5cdTMwMGNcdTMwNDRcdTMwNDRcdTMwNDhcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTlcdTMwOGJcdTMwNjhcdTMwMDFcdTczZmVcdTg4NGNcdTY5Y2JcdTYyMTBcdTMwNmVcdTRlMDBcdTkwZThcdTMwNjdcdTMwNDJcdTMwOGJcdThhMThcdThmZjBcdTViNTBcdTMwNmVcdTMwN2ZcdTMwNGNcdTMwYjNcdTMwZDRcdTMwZmNcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDINCi1kZWVwQ29weV9wcm9tcHRNc2c9XHU0ZWNhXHU1ZjhjXHUzMDZmXHU1MDBiXHU1MjI1XHUzMDZiXHU0ZmRkXHU1Yjg4XHUzMDU5XHUzMDhiXHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhiXHUzMDAxXHU1MmQ1XHU3Njg0XHUzMDZiXHUzMGVhXHUzMGYzXHUzMGFmXHUzMDU1XHUzMDhjXHUzMDVmXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZlXHU4OTgxXHU3ZDIwXHUzMDZlXHUzMGIzXHUzMGQ0XHUzMGZjXHUzMDkyXHU1M2Q2XHU1Zjk3XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyIFx1N2Q5YVx1ODg0Y1x1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi1kZWVwQ29weV90aXRsZT1cdTMwYzdcdTMwYTNcdTMwZmNcdTMwZDdcdTMwZmJcdTMwYjNcdTMwZDRcdTMwZmMNCi0NCi0jIFByb2dyZXNzIG1lc3NhZ2VzDQotY3JlYXRpbmdQcm9jZXNzQ29tcG9uZW50VGFza19uYW1lPVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzBmYlx1MzBiM1x1MzBmM1x1MzBkZFx1MzBmY1x1MzBjZFx1MzBmM1x1MzBjOCAnJ3swfScnIFx1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLXByb2Nlc3NpbmdSZWZlcmVuY2VzVGFza19uYW1lPVx1NTNjMlx1NzE2N1x1MzA5Mlx1NTFlNlx1NzQwNlx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLWRlbGV0aW5nRWxlbWVudHNUYXNrX25hbWU9XHU4OTgxXHU3ZDIwXHUzMDRhXHUzMDg4XHUzMDczXHU5NWEyXHU5MDIzXHUzMDU5XHUzMDhiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDkyXHU1MjRhXHU5NjY0XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotY2hlY2tpbmdSZWZlcmVuY2VzVGFza19uYW1lPVx1NTNjMlx1NzE2N1x1MzA5Mlx1NjkxY1x1NjdmYlx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLXJlbW92aW5nUmVmZXJlbmNlc3Rhc2tfbmFtZT1cdTUzYzJcdTcxNjdcdTMwOTJcdTk2NjRcdTUzYmJcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi1zYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lPVx1NTkwOVx1NjZmNFx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NGZkZFx1N2JhMVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLWNoZWNrQWZmZWN0ZWRSZXNvdXJjZXNUYXNrX25hbWU9XHU1ZjcxXHU5N2ZmXHUzMDkyXHU1M2Q3XHUzMDUxXHUzMDhiXHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDkyXHU2OTFjXHU2N2ZiXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotbW92aW5nVGFza19uYW1lPVx1NzlmYlx1NTJkNVx1NGUyZC4uLg0KLW1vdmluZ0ZpbGVzVGFza19uYW1lPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NzlmYlx1NTJkNVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLWNvcHlpbmdSZXNvdXJjZXNUYXNrX25hbWU9XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDkyXHUzMGIzXHUzMGQ0XHUzMGZjXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotY29weWluZ0FjdGl2aXRpZXNfbXNnPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmYyAnJ3swfScnIFx1MzA5Mlx1MzBiM1x1MzBkNFx1MzBmY1x1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQ0KLXNhdmluZ0ZpbGVUYXNrX25hbWU9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViICcnezB9JycgXHUzMDkyXHU0ZmRkXHU3YmExXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotDQotIyBVSSBUZXh0DQotZWxlbWVudF90ZXh0PVx1ODk4MVx1N2QyMA0KLWNyZWF0ZUVsZW1lbnRfdGV4dD1cdTg5ODFcdTdkMjBcdTMwNmVcdTRmNWNcdTYyMTANCi1jcmVhdGVQcm9jZXNzX3RleHQ9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDZlXHU0ZjVjXHU2MjEwDQotY29udHJpYnV0ZXNUb190ZXh0PVx1NWJjNFx1NGUwZVx1NWJmZVx1OGM2MQ0KLWxvY2FsQ29udHJpYnV0ZXNUb190ZXh0PVx1MzBlZFx1MzBmY1x1MzBhYlx1MzBlYlx1MzA2N1x1MzA2ZVx1NWJjNFx1NGUwZVx1NWJmZVx1OGM2MQ0KLWV4dGVuZHNfdGV4dD1cdTYyZTFcdTVmMzUNCi1yZXBsYWNlc190ZXh0PVx1N2Y2ZVx1NjNkYg0KLWxvY2FsUmVwbGFjZXNfdGV4dD1cdTMwZWRcdTMwZmNcdTMwYWJcdTMwZWJcdTMwNjdcdTdmNmVcdTYzZGINCi1sb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHlfdGV4dD1cdTMwZWRcdTMwZmNcdTMwYWJcdTMwZWJcdTdmNmVcdTYzZGJcdTMwNGFcdTMwODhcdTMwNzNcdTMwYzdcdTMwYTNcdTMwZmNcdTMwZDdcdTMwZmJcdTMwYjNcdTMwZDRcdTMwZmMNCi1lbGVtZW50VHlwZV90ZXh0PXswfTogezF9DQotZGVsaXZlcmFibGVzX3RleHQ9XHU3ZDBkXHU1MTY1XHU3MjY5DQotY29udHJpYnV0ZVRvQWN0aXZpdHlfdGV4dD1cdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTMwNzhcdTMwNmVcdTViYzRcdTRlMGUNCi1BY3Rpdml0eURyb3BDb21tYW5kX2xhYmVsPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1MzA2ZVx1OTY2NFx1NTNiYg0KLXJlcGxhY2VBY3Rpdml0eV90ZXh0PVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1MzA2ZVx1N2Y2ZVx1NjNkYg0KLWZpbGVfdGV4dD1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWINCi1kaXJlY3RvcnlfdGV4dD1cdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmMNCi11bnJlc29sdmVkX3RleHQ9KFx1NjcyYVx1ODllM1x1NmM3YVx1MzA2ZSAnJ3swfScnKQ0KLWFzc2lzdHNfdGV4dD1cdTY1MmZcdTYzZjQNCi11bmtub3duX3RleHQ9XHU0ZTBkXHU2NjBlDQotY29tbWFuZF9kb25lPVx1NWI4Y1x1NGU4Ng0KLQ0KLSMgVGhlIGZvbGxvd2luZyBVSSB0ZXh0IHNob3VsZCBiZSByZXZpZXdlZC4NCi1VdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eXdpdGhwbHVnaW5faW5mbz17MH0gKCcnezN9JycgXHUzMDZlIHsxfSAnJ3syfScnKQ0KLVV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5X2luZm89ezB9ICh7MX0gJyd7Mn0nJykNCi11aV9yZWZfZGVsZXRlPVx1OGExOFx1OGZmMFx1NWI1MCAnJ3swfScnIFx1MzA2ZVx1NmIyMVx1MzA2ZVx1NTNjMlx1NzE2N1x1MzA2Zlx1NGY3Zlx1NzUyOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXHU1MjRhXHU5NjY0XHUzMDU5XHUzMDhiXHUzMDgyXHUzMDZlXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotdWlfcmVmX2RlbGV0ZTI9XHU2YjIxXHUzMDZlXHU1M2MyXHU3MTY3XHUzMDZmXHUzMDQ0XHUzMDVhXHUzMDhjXHUzMDgyXHU0ZjdmXHU3NTI4XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXG5cdTUyNGFcdTk2NjRcdTMwNTlcdTMwOGJcdTMwODJcdTMwNmVcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi11aV9yZWZlcmVuY2VzPVx1NTNjMlx1NzE2Nw0KLXVpX3dvcmtwcm9kdWN0X2Rlc2NyaXB0b3JfZGVzY3JpcHRpb249XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU4YTE4XHU4ZmYwXHU1YjUwICcnezB9JycgXHUzMDZmXHUzMGJmXHUzMGI5XHUzMGFmXHU4YTE4XHU4ZmYwXHU1YjUwICcnezF9JycgXHUzMDZiXHU5NWEyXHU5MDIzXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5IChcdTMwNTNcdTMwNmVcdTMwYmZcdTMwYjlcdTMwYWZcdThhMThcdThmZjBcdTViNTBcdTMwNGNcdTUxZmFcdTUyOWJcdTUxNDMpXHUzMDAyDQotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX29wdGlvbnM9XHUzMGFhXHUzMGQ3XHUzMGI3XHUzMGU3XHUzMGYzDQotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX291dHB1dGxhYmVsPVx1MzBiZlx1MzBiOVx1MzBhZlx1OGExOFx1OGZmMFx1NWI1MFx1MzA2ZVx1NTFmYVx1NTI5Ylx1MzA2OFx1MzA1N1x1MzA2Nlx1NzUxZlx1MzA1OFx1MzA4Ylx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1OGExOFx1OGZmMFx1NWI1MFx1MzA2ZVx1OTY2NFx1NTNiYg0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9kZWxldGVfdGFzaz1cdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTMwNGJcdTMwODlcdTMwNmVcdTMwYmZcdTMwYjlcdTMwYWZcdThhMThcdThmZjBcdTViNTBcdTMwNmVcdTUyNGFcdTk2NjQNCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZGVmYXVsdGNvbmZpZ2NoZWNrPVx1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA1Zlx1ODk4MVx1N2QyMCAnJ3swfScnIFx1MzA2Zlx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA2ZVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1NjljYlx1NjIxMFx1MzA2Ylx1NTQyYlx1MzA3ZVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHU2OWNiXHU2MjEwXHUzMDZiXHUzMDUzXHUzMDZlXHU4OTgxXHU3ZDIwXHUzMDRhXHUzMDg4XHUzMDczXHUzMDVkXHUzMDZlXHU0ZjlkXHU1YjU4XHU5NWEyXHU0ZmMyXHUzMDkyXHU4ZmZkXHU1MmEwXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiPw0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9nZW5lcmljRXJyX21lc3NhZ2VfdGV4dD1cdTY0Y2RcdTRmNWNcdTMwNjdcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIgXHU4YTczXHUzMDU3XHUzMDRmXHUzMDZmXHUzMDBjXHU4YTczXHU3ZDMwXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9ub0Rlc2NyaXB0b3JUb1N5bmNoPVx1NTQwY1x1NjcxZlx1NWJmZVx1OGM2MVx1MzA2ZVx1MzAwMVx1MzBlYVx1MzBmM1x1MzBhZlx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMFx1MzA5Mlx1NjMwMVx1MzA2NFx1OGExOFx1OGZmMFx1NWI1MFx1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3JlZmVyc2hpbmd2aWV3ZXI9XHUzMGQzXHUzMGU1XHUzMGZjXHUzMGEyXHUzMGZjXHUzMDZlXHU2NmY0XHU2NWIwXHU0ZTJkXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjDQotY29uZmlybV9yZW1vdmVfcmVmZXJlbmNlc190ZXh0PVx1NTkwOVx1NjNkYlx1NWY4Y1x1MzAwMVx1MzAwY1x1OGE3M1x1N2QzMFx1MzAwZFx1MzA2Ylx1MzBlYVx1MzBiOVx1MzBjOFx1MzA1NVx1MzA4Y1x1MzA1Zlx1ODk4MVx1N2QyMFx1MzA2Ylx1MzA2Zlx1MzA1M1x1MzA2ZVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1MzA3OFx1MzA2ZVx1NzEyMVx1OGEzMVx1NTNlZlx1MzA2ZVx1NTNjMlx1NzE2N1x1MzA0Y1x1NTQyYlx1MzA3ZVx1MzA4Y1x1MzA4Ylx1NTNlZlx1ODBmZFx1NjAyN1x1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMlx1MzAwY09LXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDVkXHUzMDhjXHUzMDg5XHUzMDkyXHU5NjY0XHU1M2JiXHUzMDU3XHUzMDAxXHU3ZDlhXHU4ODRjXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfdW5oYW5kbGVkX2V4Y2VwdGlvbj1cdTY3MmFcdTUxZTZcdTc0MDZcdTMwNmVcdTRmOGJcdTU5MTYNCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX2JyZWFrZG93bl9lbGVtZW50PVx1NTE0OFx1ODg0Y1x1MzBiZlx1MzBiOVx1MzBhZlx1MzA0YVx1MzA4OFx1MzA3M1x1NWY4Y1x1N2Q5YVx1MzBiZlx1MzBiOVx1MzBhZlx1MzA2OFx1NTQwY1x1MzA1OFx1MzBkNlx1MzBlY1x1MzBmY1x1MzBhZlx1MzBjMFx1MzBhNlx1MzBmM1x1MzBmYlx1MzBhOFx1MzBlY1x1MzBlMVx1MzBmM1x1MzBjOFx1MzA2Zlx1NjMwMVx1MzA2Nlx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93cGxpc3RkbGdfbXNnPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOCAnJ3swfScnIFx1MzA2Zlx1NmIyMVx1MzA2ZVx1MzBiZlx1MzBiOVx1MzBhZlx1MzA2Ylx1NWJmZVx1MzA1OVx1MzA4Ylx1NTFmYVx1NTI5Ylx1MzA2N1x1MzA1OVx1MzAwMlxuXHU1YmZlXHU1ZmRjXHUzMDU5XHUzMDhiXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDkyXHU0ZjVjXHU2MjEwXHUzMDU3XHUzMDVmXHUzMDQ0XHUzMGJmXHUzMGI5XHUzMGFmXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3JvbGVsaXN0ZGxnX21zZz1cdTMwZWRcdTMwZmNcdTMwZWIgJyd7MH0nJyBcdTMwNmJcdTMwNmZcdTZiMjFcdTMwNmVcdTYyYzVcdTVmNTNcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDJcblx1NWJmZVx1NWZkY1x1MzA1OVx1MzA4Ylx1OGExOFx1OGZmMFx1NWI1MFx1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA1N1x1MzA1Zlx1MzA0NFx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX2ZhdGFsZXJyPVx1ODFmNFx1NTQ3ZFx1NzY4NFx1MzBhOFx1MzBlOVx1MzBmYw0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93b3JrcHJvZHVjdHM9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4DQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9zdWJfZWxlbWVudD1cdTMwZDZcdTMwZWNcdTMwZmNcdTMwYWZcdTMwYzBcdTMwYTZcdTMwZjNcdTMwZmJcdTMwYThcdTMwZWNcdTMwZTFcdTMwZjNcdTMwYzhcdTMwOTJcdTMwMDFcdTMwNWRcdTMwNmVcdTMwNDRcdTMwNWFcdTMwOGNcdTMwNGJcdTMwNmVcdTMwYjVcdTMwZDZcdTg5ODFcdTdkMjBcdTMwNmJcdTMwZWFcdTMwZjNcdTMwYWZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl93cm9uZ19lbGVtZW50PVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkNlx1MzBlY1x1MzBmY1x1MzBhZlx1MzBjMFx1MzBhNlx1MzBmM1x1MzBmYlx1MzBhOFx1MzBlY1x1MzBlMVx1MzBmM1x1MzBjOFx1NGVlNVx1NTkxNlx1MzA2ZVx1ODk4MVx1N2QyMFx1MzA2Ylx1MzA2Zlx1MzBlYVx1MzBmM1x1MzBhZlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX2NoaWxkX2VsZW1lbnQ9XHUzMGQ2XHUzMGVjXHUzMGZjXHUzMGFmXHUzMGMwXHUzMGE2XHUzMGYzXHUzMGZiXHUzMGE4XHUzMGVjXHUzMGUxXHUzMGYzXHUzMGM4XHUzMDkyXHUzMDAxXHUzMDVkXHUzMDZlXHUzMDQ0XHUzMDVhXHUzMDhjXHUzMDRiXHUzMDZlXHU1YjUwXHUzMDZiXHUzMGVhXHUzMGYzXHUzMGFmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3Rhc2tzPVx1MzBiZlx1MzBiOVx1MzBhZg0KLXVpX2Fzc29jaWF0aW9uX3Rhc2tfc2VsZWN0aW9uPVx1MzBiZlx1MzBiOVx1MzBhZlx1MzA2ZVx1OTA3OFx1NjI5ZS4uLg0KLXV0aWxfUHJvY2Vzc1V0aWxfY2hpbGRhZGFwdGVyPVwgXCBcdTViNTBcdTMwNmVcdTMwYTJcdTMwYzBcdTMwZDdcdTMwYmZcdTMwZmM6DQotDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2V0cGFyZW50PVx1NWI1MFx1MzA2ZVx1ODlhYVx1MzA5Mlx1OGEyZFx1NWI5YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zg0KLXV0aWxfdG5ndXRpbF9jYW5ub3RfZWRpdF9yZXNvdXJjZT1cdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwOTJcdTdkZThcdTk2YzZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi11dGlsX1Byb2Nlc3NVdGlsX2NvbnRyaWJ1dGVzdG89Jyd7MH0nJyBcdTMwNzhcdTMwNmVcdTViYzRcdTRlMGUNCi11dGlsX1Byb2Nlc3NVdGlsX2xvY2FsQ29udHJpYnV0ZXN0bz1cdTMwZWRcdTMwZmNcdTMwYWJcdTMwZWJcdTMwNjcgJyd7MH0nJyBcdTMwNzhcdTViYzRcdTRlMGUNCi1wcm9jZXNzX2V4dGVuZHM9Jyd7MH0nJyBcdTMwOTJcdTYyZTFcdTVmMzUNCi1wcm9jZXNzX3JlcGxhY2VzPScnezB9JycgXHUzMDkyXHU3ZjZlXHU2M2RiDQotcHJvY2Vzc19sb2NhbFJlcGxhY2VzPVx1MzBlZFx1MzBmY1x1MzBhYlx1MzBlYlx1MzA2NyAnJ3swfScnIFx1MzA5Mlx1N2Y2ZVx1NjNkYg0KLSMgRmlsdGVyIGNvbnN0YW50cyBleHRlcm5hbGl6ZWQgc3RyaW5ncy4NCi1GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZXNfdGV4dD1cdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2UNCi1GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZWdyb3VwaW5nc190ZXh0PVx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZVx1MzA2ZVx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1NTMxNg0KLUZpbHRlckNvbnN0YW50c193aGl0ZXBhcGVyc190ZXh0PVx1MzBkYlx1MzBlZlx1MzBhNFx1MzBjOFx1MzBmYlx1MzBkYVx1MzBmY1x1MzBkMVx1MzBmYw0KLUZpbHRlckNvbnN0YW50c190b29sbWVudG9yc190ZXh0PVx1MzBjNFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBlMVx1MzBmM1x1MzBiZlx1MzBmYw0KLUZpbHRlckNvbnN0YW50c190b29sc190ZXh0PVx1MzBjNFx1MzBmY1x1MzBlYg0KLUZpbHRlckNvbnN0YW50c19yb2xlc190ZXh0PVx1MzBlZFx1MzBmY1x1MzBlYg0KLUZpbHRlckNvbnN0YW50c190YXNrc190ZXh0PVx1MzBiZlx1MzBiOVx1MzBhZg0KLUZpbHRlckNvbnN0YW50c19yZXVzYWJsZWFzc2V0c190ZXh0PVx1NTE4ZFx1NTIyOVx1NzUyOFx1NTNlZlx1ODBmZFx1MzA2YVx1MzBhMlx1MzBiYlx1MzBjM1x1MzBjOA0KLUZpbHRlckNvbnN0YW50c19hbGxfdGV4dD1cdTMwNTlcdTMwNzlcdTMwNjYNCi1GaWx0ZXJDb25zdGFudHNfcHJvY2Vzc2VzX3RleHQ9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5DQotRmlsdGVyQ29uc3RhbnRzX3ByYWN0aWNlc190ZXh0PVx1MzBkN1x1MzBlOVx1MzBhZlx1MzBjNlx1MzBhM1x1MzBiOQ0KLUZpbHRlckNvbnN0YW50c190ZW1wbGF0ZXNfdGV4dD1cdTMwYzZcdTMwZjNcdTMwZDdcdTMwZWNcdTMwZmNcdTMwYzgNCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RzX3RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4DQotRmlsdGVyQ29uc3RhbnRzX2NoZWNrbGlzdHNfdGV4dD1cdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTMwZWFcdTMwYjlcdTMwYzgNCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGVsaW5lc190ZXh0PVx1MzBhY1x1MzBhNFx1MzBjOVx1MzBlOVx1MzBhNFx1MzBmMw0KLUZpbHRlckNvbnN0YW50c19yb2xlc2V0c190ZXh0PVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjOA0KLUZpbHRlckNvbnN0YW50c19ndWlkYW5jZV90ZXh0PVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOQ0KLUZpbHRlckNvbnN0YW50c19jb25jZXB0c190ZXh0PVx1Njk4Mlx1NWZmNQ0KLUZpbHRlckNvbnN0YW50c19leGFtcGxlc190ZXh0PVx1NGY4Yg0KLUZpbHRlckNvbnN0YW50c19jb250ZW50cGFja2FnZXNfdGV4dD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwZmJcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjgNCi1GaWx0ZXJDb25zdGFudHNfcm9sZWRlc2NyaXB0b3JzX3RleHQ9XHUzMGVkXHUzMGZjXHUzMGViXHU4YTE4XHU4ZmYwXHU1YjUwDQotRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRncm9wdWluZ3NfdGV4dD1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzhcdTMwNmVcdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTUzMTYNCi1GaWx0ZXJDb25zdGFudHNfdGFza2Rlc2NyaXB0b3JzX3RleHQ9XHUzMGJmXHUzMGI5XHUzMGFmXHU4YTE4XHU4ZmYwXHU1YjUwDQotRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRlbGVtZW50c190ZXh0PVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1ODk4MVx1N2QyMA0KLVByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fcHJlcGFyZT1cdTU0MGNcdTY3MWZcdTMwNmVcdTZlOTZcdTUwOTlcdTRlMmQuLi4NCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RkZXNjcmlwdG9yc190ZXh0PVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1OGExOFx1OGZmMFx1NWI1MA0KLUZpbHRlckNvbnN0YW50c19hbGxjb250ZW50ZWxlbWVudHNfdGV4dD1cdTMwNTlcdTMwNzlcdTMwNjZcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTg5ODFcdTdkMjANCi1GaWx0ZXJDb25zdGFudHNfc3VwcG9ydGluZ21hdGVyaWFsc190ZXh0PVx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1OGNjN1x1NjU5OQ0KLU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX2Vycm9yU2F2aW5nRmlsZXM9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU0ZmRkXHU3YmExXHU2NjQyXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjDQotRmlsdGVyQ29uc3RhbnRzX2N1c3RvbWNhdGVnb3JpZXNfdGV4dD1cdTMwYWJcdTMwYjlcdTMwYmZcdTMwZTBcdTMwZmJcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmMNCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3R0eXBlc190ZXh0PVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1OTg1ZQ0KLURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kX3dhcm5pbmdNc2c9XHU1MjRhXHU5NjY0XHUzMDRjXHU4YjY2XHU1NDRhXHUzMDkyXHU1MWZhXHUzMDU3XHUzMDY2XHU1YjhjXHU0ZTg2XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyDQotRmlsdGVyQ29uc3RhbnRzX21ldGhvZHBsdWdpbnNfdGV4dD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDdcdTMwZTlcdTMwYjBcdTMwYTRcdTMwZjMNCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfbG9ja2VkUGx1Z2luPUlVUEwwMTIwRTogXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzICcnezB9JycgXHUzMDZmXHUzMGVkXHUzMGMzXHUzMGFmXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyDQotRmlsdGVyQ29uc3RhbnRzX2RvbWFpbnNfdGV4dD1cdTMwYzlcdTMwZTFcdTMwYTRcdTMwZjMNCi1GaWx0ZXJDb25zdGFudHNfcm9hZG1hcF90ZXh0PVx1MzBlZFx1MzBmY1x1MzBjOVx1MzBkZVx1MzBjM1x1MzBkNw0KLUZpbHRlckNvbnN0YW50c19yZXBvcnRzX3RleHQ9XHUzMGVjXHUzMGRkXHUzMGZjXHUzMGM4DQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9sYWJlbD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwNGJcdTMwODlcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTU0MGNcdTY3MWYoJlkpDQotTWFudWFsU3luY2hyb25pemVDb21tYW5kX2xhYmVsPVx1MzBhYlx1MzBiOVx1MzBiZlx1MzBlMFx1NTQwY1x1NjcxZigmWikuLi4NCi1BdXRvU3luY2hyb25pemVDb21tYW5kX3N1Y2Vzc2Z1bD1cdTU0MGNcdTY3MWZcdTMwNmZcdTZiNjNcdTVlMzhcdTMwNmJcdTViOGNcdTRlODZcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIFVzZXJJbnRlcmFjdGlvbkhlbHBlcg0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9Qcm9jZXNzUGFja2FnZV9OYW1lPVx1NTQwZFx1NTI0ZDoNCi0NCi0jIE1ldGhvZENyZWF0ZUNoaWxkQ29tbWFuZA0KLW5ld0VsZW1lbnRfdGV4dD1cdTY1YjBcdTg5OGYgezB9DQotdXBkYXRlX291dG9mc3luY2hfdGl0bGU9XHU2NmY0XHU2NWIwXHUzMDZlXHU3YWY2XHU1NDA4DQotdXBkYXRlX291dG9mc3luY2hfbXNnPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzBmYlx1MzBiN1x1MzBiOVx1MzBjNlx1MzBlMFx1MzA2N1x1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1NTkwOVx1NjZmNFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiBcdTU5MDlcdTY2ZjRcdTUxODVcdTViYjlcdTMwOTJcdTRlMGFcdTY2ZjhcdTMwNGRcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzZDM0MTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEdlbmVyaWMgRGlhbG9nIFRpdGxlcw0KLW1vdmVEaWFsb2dfdGl0bGU9XHVjNzc0XHViM2Q5DQotZGVsZXRlRGlhbG9nX3RpdGxlPVx1YzY5NFx1YzE4YyBcdWMwYWRcdWM4MWMNCi1lcnJvckRpYWxvZ190aXRsZT1cdWM2MjRcdWI5NTgNCi1lcnJvckRpYWxvZ19jYW5ub3RSZW5hbWU9ezB9ICcnezF9JydcdWM3NDQoXHViOTdjKSAnJ3syfScnKFx1YzczYylcdWI4NWMgXHVjNzc0XHViOTg0XHVjNzQ0IFx1YmMxNFx1YWZjMCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmRcdWM1ZDAgXHVkNDVjXHVjMmRjXHViNDFjIFx1YmIzOFx1YzgxY1x1YzgxMFx1Yzc0NCBcdWQ1NzRcdWFjYjBcdWQ1NThcdWFjZTAsIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YjgyNFx1YmE3NCBcdWQ2NTVcdWM3NzhcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVhY2UwIFx1Yzc3NCBcdWM4NzBcdWM3OTFcdWM3NDQgXHVjOTExXHViMmU4XHVkNTU4XHViODI0XHViYTc0IFx1Y2RlOFx1YzE4Y1x1Yjk3YyBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotIyBDb25maXJtIFJlZmVyZW5jZXMgUmVtb3ZhbCBEaWFsb2cNCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RpdGxlPVx1Y2MzOFx1Yzg3MCBcdWM4MWNcdWFjNzAgXHVkNjU1XHVjNzc4DQotZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190ZXh0PVx1YzBhZFx1YzgxY1x1ZDU1OFx1YjgyNFx1YjI5NCBcdWM2OTRcdWMxOGNcdWI5N2MgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yzc1OCBcdWIyZTRcdWI5NzggXHVjNjk0XHVjMThjXHVjNWQwXHVjMTFjIFx1Y2MzOFx1Yzg3MFx1ZDU1OFx1YWNlMCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1Yzc3NCBcdWM2OTRcdWMxOGNcdWI5N2MgXHVjMGFkXHVjODFjXHVkNTU4XHViYTc0IFx1Yzc3NCBcdWM2OTRcdWMxOGNcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Y2MzOFx1Yzg3MFx1YWMwMCBcdWM4MWNcdWFjNzBcdWI0MThcdWJiYzBcdWI4NWMsIFx1Y2MzOFx1Yzg3MFx1ZDU1OFx1YjI5NCBcdWM2OTRcdWMxOGNcdWIzYzQgXHVhYzMxXHVjMmUwXHViNDI5XHViMmM4XHViMmU0LiBcdWQ2NTVcdWM3NzhcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVhZTMwIFx1YzgwNFx1YzVkMCBcdWNjMzhcdWM4NzBcdWQ1NThcdWIyOTQgXHVjNjk0XHVjMThjXHViOTdjIFx1YWMzMVx1YzJlMFx1ZDU2MCBcdWMyMTggXHVjNzg4XHViMjk0IFx1YWQ4Y1x1ZDU1Y1x1Yzc3NCBcdWM3ODhcdWIyOTRcdWM5YzAgXHVkNjU1XHVjNzc4XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiBcdWMwYWRcdWM4MWNcdWQ1NThcdWI4MjRcdWIyOTQgXHVjNjk0XHVjMThjXHViOTdjIFx1Y2MzOFx1Yzg3MFx1ZDU1OFx1YjI5NCBcdWM2OTRcdWMxOGMgXHViYWE5XHViODVkXHVjNzQ0IFx1YWM4MFx1ZDFhMFx1ZDU1OFx1YjgyNFx1YmE3NCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmRcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLSMgUmVzb2x2ZSBOYW1lIENvbmZsaWN0IERpYWxvZw0KLXJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGl0bGU9XHVjNjk0XHVjMThjIFx1Yzc3NFx1Yjk4NCBcdWNkYTlcdWIzY2MgXHVkNTc0XHVhY2IwDQotcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0PScnezF9JydcdWM1ZDAgXHViMzAwXHVkNTc0IFx1YzBjOFx1Yjg1Y1x1YzZiNCB7MH1cdWM3NDQoXHViOTdjKSBcdWM3ODVcdWI4MjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotIyBTZWxlY3QgRGVsaXZlcmFibGVzIERpYWxvZw0KLXNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190aXRsZT1cdWM3NzhcdWIzYzRcdWJiM2MgXHVjMTIwXHVkMGRkDQotc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RleHQ9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyAnJ3swfScnXHVjNzQ0KFx1Yjk3YykgXHVjOWMwXHVjODE1XHVkNTYwIFx1Yzc3OFx1YjNjNFx1YmIzY1x1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotIyBOZXcgUHJvY2VzcyBDb21wb25lbnQgRGlhbG9nDQotbmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZ190aXRsZT1cdWMwYzggXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1Y2VmNFx1ZDNlY1x1YjEwY1x1ZDJiOA0KLW5hbWVMYWJlbF90ZXh0PVx1Yzc3NFx1Yjk4NDoNCi1kZWZhdWx0Q29uZmlnTGFiZWxfdGV4dD1cdWFlMzBcdWM4NzQgXHVhZDZjXHVjMTMxOg0KLWJhc2VQcm9jZXNzTGFiZWxfdGV4dD1cdWFlMzBcdWJjZjggXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0Og0KLWJhc2VkT25Qcm9jZXNzZXNMYWJlbF90ZXh0PVx1YWUzMFx1YmNmOCBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQ6DQotDQotIyBSb2xlIEFzc29jaWF0aW9uIERpYWxvZw0KLXNlbGVjdEFzc29jaWF0aW9uTGFiZWxfdGV4dD0nJ3swfScnIFx1ZDBjMFx1YzJhNFx1ZDA2Y1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNWYwXHVhZDAwXHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jIFJlbW92ZSBBc3NvY2lhdGlvbiBkaWFsb2cNCi1yZW1vdmVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PVx1YzVmMFx1YWQwMCBcdWM4MWNcdWFjNzANCi0NCi0jIFNlbGVjdCBUZWFtcyBEaWFsb2cNCi1zZWxlY3RUZWFtc0RpYWxvZ190aXRsZT1cdWQzMDAgXHVjMTIwXHVkMGRkDQotc2VsZWN0VGVhbXNEaWFsb2dfdGV4dD0nJ3swfScnIFx1YzVlZFx1ZDU2MFx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NjAgXHVkMzAwXHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jIFRhc2wgU2VsZWN0aW9uIERpYWxvZw0KLXRhc2tTZWxlY3Rpb25EaWFsb2dfdGl0bGU9XHVkMGMwXHVjMmE0XHVkMDZjIFx1YzEyMFx1ZDBkZA0KLXRpdGxlTGFiZWxfdGV4dD1cdWQwYzBcdWMyYTRcdWQwNmMgXHVjMTIwXHVkMGRkLi4uDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQTDAxMDBFOiB7MH0gXHVjNzc0XHViOTg0XHVjNzc0IFx1YjIwNFx1Yjc3ZFx1YjQxOFx1YzViNCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuXG5cblx1YmFhOFx1YjRlMCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViYzBmIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWM2OTRcdWMxOGNcdWM1ZDBcdWIyOTQgXHVjNzc0XHViOTg0XHVjNzc0IFx1Yzc4OFx1YzViNFx1YzU3YyBcdWQ1NjlcdWIyYzhcdWIyZTQuXG5cblx1YzYyY1x1YmMxNFx1Yjk3OCBcdWM3NzRcdWI5ODRcdWM3NDQgXHVjNzg1XHViODI1XHVkNTU4XHVhY2UwIFx1YjJlNFx1YzJkYyBcdWMyZGNcdWIzYzRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZW1wdHlFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c9XHVjNzc0XHViOTg0XHVjNzQ0IFx1YmU0NFx1YzZjY1x1YjQ1OCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcdWM2MmNcdWJjMTRcdWI5NzggXHVjNzc0XHViOTg0XHVjNzQ0IFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZz1JVVBMMDEwMUU6IFx1Yzc3NFx1Yjk4NFx1Yzc3NCAnJ3swfScnXHVjNzc4IFx1ZDU2ZFx1YmFhOVx1Yzc3NCBcdWM3NzRcdWJiZjggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LlxuXG5cdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNjk0XHVjMThjXHVjNWQwIFx1YWNlMFx1YzcyMFx1ZDU1YyBcdWM3NzRcdWI5ODRcdWM3NzQgXHVjNzg4XHVjNWI0XHVjNTdjIFx1ZDU2OVx1YjJjOFx1YjJlNC5cblxuXHViMmU0XHViOTc4IFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWM3ODVcdWI4MjVcdWQ1NThcdWFjZTAgXHViMmU0XHVjMmRjIFx1YzJkY1x1YjNjNFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c9XHViM2Q5XHVjNzdjXHVkNTVjIFx1YzY5NFx1YzE4YyBcdWM3NzRcdWI5ODRcdWM3NzQgXHVjNzc0XHViYmY4IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHViMmU0XHViOTc4IFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotaW52YWxpZEVsZW1lbnROYW1lRXJyb3IxX21zZz1JVVBMMDEwMkU6ICcnezB9JycgXHVjNzc0XHViOTg0XHVjNzc0IFx1YzYyY1x1YmMxNFx1Yjk3NFx1YzljMCBcdWM1NGFcdWMyYjVcdWIyYzhcdWIyZTQuXG5cblx1YmE1NFx1YzE4Y1x1YjRkYyBcdWM2OTRcdWMxOGMgXHVjNzc0XHViOTg0XHVjNzQwIFx1YWNmNVx1YmMzMVx1YzczY1x1Yjg1YyBcdWMyZGNcdWM3OTFcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC5cblxuXHVjNjJjXHViYzE0XHViOTc4IFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWM3ODVcdWI4MjVcdWQ1NThcdWFjZTAgXHViMmU0XHVjMmRjIFx1YzJkY1x1YjNjNFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjJfbXNnPUlVUEwwMTAzRTogJyd7MH0nJyBcdWM3NzRcdWI5ODRcdWM3NzQgXHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC5cblxuXHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4YyBcdWM3NzRcdWI5ODRcdWM3NDAgXHViOWM4XHVjZTY4XHVkNDVjXHViODVjIFx1YjA1ZFx1YjBhMCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LlxuXG5cdWM2MmNcdWJjMTRcdWI5NzggXHVjNzc0XHViOTg0XHVjNzQ0IFx1Yzc4NVx1YjgyNVx1ZDU1OFx1YWNlMCBcdWIyZTRcdWMyZGMgXHVjMmRjXHViM2M0XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yM19tc2c9SVVQTDAxMDRFOiAnJ3swfScnIFx1Yzc3NFx1Yjk4NFx1Yzc3NCBcdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0LlxuXG5cdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNjk0XHVjMThjIFx1Yzc3NFx1Yjk4NFx1YzVkMCBcXCAvIDogKiA/ICIgPCA+IDsgfCBcdWJiMzhcdWM3OTBcdWFjMDAgXHVkM2VjXHVkNTY4XHViNDIwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuXG5cblx1YzYyY1x1YmMxNFx1Yjk3OCBcdWM3NzRcdWI5ODRcdWM3NDQgXHVjNzg1XHViODI1XHVkNTU4XHVhY2UwIFx1YjJlNFx1YzJkYyBcdWMyZGNcdWIzYzRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotbm9Db25maWdFcnJvcl9tc2c9SVVQTDAxMDVFOiBcdWQ2MDRcdWM3YWMgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YzVkMCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxXHVjNzc0IFx1ZDNlY1x1ZDU2OFx1YjQxOFx1YzViNCBcdWM3ODhcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0LiBcblxuXHVjMGM4IFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1Yjk3YyBcdWM3OTFcdWMxMzFcdWQ1NThcdWI4MjRcdWJhNzQgXHViYTU0XHVjMThjXHViNGRjIFx1YWQ2Y1x1YzEzMVx1Yzc3NCBcdWQ1NDRcdWM2OTRcdWQ1NjlcdWIyYzhcdWIyZTQuXG5cblx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzFcdWM3NDQgXHVjNzkxXHVjMTMxXHVkNTU4XHVhY2UwIFx1YjJlNFx1YzJkYyBcdWMyZGNcdWIzYzRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotbm9EZWxpdmVyeVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDZFOiBcdWQ2MDRcdWM3YWMgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YzVkMCBcdWM4MDRcdWIyZWMgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHVhYzAwIFx1ZDNlY1x1ZDU2OFx1YjQxOFx1YzViNCBcdWM3ODhcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0LiBcblxuXHVjMGM4IFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWNlZThcdWQyYjhcdWI5YWNcdWJkZjBcdWMxNThcdWM3NDQgXHVjNzkxXHVjMTMxXHVkNTU4XHViODI0XHViYTc0IFx1YWUzMFx1YmNmOCBcdWM4MDRcdWIyZWMgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHVhYzAwIFx1ZDU0NFx1YzY5NFx1ZDU2OVx1YjJjOFx1YjJlNC5cblxuXHVjODA0XHViMmVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1Yjk3YyBcdWM3OTFcdWMxMzFcdWQ1NThcdWFjZTAgXHViMmU0XHVjMmRjIFx1YzJkY1x1YjNjNFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1ub0RlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQTDAxMDdFOiBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzljMCBcdWM1NGFcdWM1NThcdWMyYjVcdWIyYzhcdWIyZTQuXG5cblx1YWUzMFx1YmNmOCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YzBjOCBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTRcdWM1ZDAgXHVjOWMwXHVjODE1XHVkNTc0XHVjNTdjIFx1ZDU2OVx1YjJjOFx1YjJlNC5cblxuXHViYTU0XHVjMThjXHViNGRjIFx1YWQ2Y1x1YzEzMVx1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWFjZTAgXHViMmU0XHVjMmRjIFx1YzJkY1x1YjNjNFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1ub0Jhc2VQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA4RTogXHVjODA0XHViMmVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWM5YzAgXHVjNTRhXHVjNTU4XHVjMmI1XHViMmM4XHViMmU0LlxuXG5cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVjZWU4XHVkMmI4XHViOWFjXHViZGYwXHVjMTU4XHVjNWQwXHViMjk0IFx1YWUzMFx1YmNmOCBcdWM4MDRcdWIyZWMgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHVhYzAwIFx1ZDU0NFx1YzY5NFx1ZDU2OVx1YjJjOFx1YjJlNC5cblxuXHVjODA0XHViMmVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWFjZTAgXHViMmU0XHVjMmRjIFx1YzJkY1x1YjNjNFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1jcmVhdGVQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA5RTogXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHViOTdjIFx1Yzc5MVx1YzEzMVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWNyZWF0ZUVsZW1lbnRFcnJvcl9tc2c9SVVQTDAxMTBFOiBcdWM2OTRcdWMxOGNcdWI5N2MgXHVjNzkxXHVjMTMxXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotZGVsZXRlRWxlbWVudEVycm9yX21zZz1JVVBMMDExMUU6IFx1YzY5NFx1YzE4Y1x1Yjk3YyBcdWMwYWRcdWM4MWNcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX21zZz1JVVBMMDExMkU6IFx1YzY5NFx1YzE4Y1x1Yzc1OCBcdWNlZThcdWQxNTBcdWNlMjAgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1Yzc5MVx1YzEzMVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LlxuXG4nJ3swfScnIFx1ZDMwY1x1Yzc3Y1x1Yzc3NCBcdWM3NzRcdWJiZjggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LlxuXG5cdWIyZTRcdWI5NzggXHVjNzc0XHViOTg0XHVjNzQ0IFx1Yzc4NVx1YjgyNVx1ZDU1OFx1YWNlMCBcdWIyZTRcdWMyZGMgXHVjMmRjXHViM2M0XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3Jfc2ltcGxlX21zZz1cdWIzZDlcdWM3N2NcdWQ1NWMgXHVjNzc0XHViOTg0XHVjNzU4IFx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWQzMGNcdWM3N2NcdWM3NzQgXHVjNzc0XHViYmY4IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHViMmU0XHViOTc4IFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdW5kb0NvbW1hbmRFcnJvcl9tc2c9SVVQTDAxMTNFOiAnJ3swfScnIFx1YzJlNFx1ZDU4OSBcdWNkZThcdWMxOGMgXHViYTg1XHViODM5XHVjNzQ0IFx1YzY0NFx1YjhjY1x1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LlxuXG57MX0gXHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1pbnZhbGlkUHJlZGVjZXNzb3JFcnJvcl9tc2c9SVVQTDAxMTRFOiBcdWM5YzBcdWM4MTVcdWQ1NWMgXHVjMTIwXHVkNTg5IFx1YzBjOVx1Yzc3OFx1Yzc3NCBcdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0LlxuXG5cdWMxMjBcdWQ1ODkgXHVjMGM5XHVjNzc4XHVjNzQwICdcdWMwYzlcdWM3NzgnIFx1YzVmNFx1Yzc1OCBcdWM4MTVcdWMyMTggXHVhYzEyXHVjNzc0XHVjNWI0XHVjNTdjIFx1ZDU2OVx1YjJjOFx1YjJlNC5cblxuXHVjNjJjXHViYzE0XHViOTc4IFx1YWMxMlx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWFjZTAgXHViMmU0XHVjMmRjIFx1YzJkY1x1YjNjNFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzPUlVUEwwMTAwVzogJyd7MH0nJyBcdWQ1NmRcdWJhYTlcdWM3NzQgXHVjNzc0XHViYmY4ICcnezF9JydcdWFjZmMoXHVjNjQwKSBcdWM1ZjBcdWFkMDBcdWI0MThcdWM1YjQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LiBcdWM3NzQgXHVjNzIwXHVkNjE1XHVjNzU4IFx1YzVmMFx1YWQwMFx1Yzc0MCBcdWQ1NThcdWIwOThcdWI5Y2MgXHVkNWM4XHVjNmE5XHViNDI5XHViMmM4XHViMmU0LiAnJ3swfScnXHVjNzQ0KFx1Yjk3YykgJyd7Mn0nJ1x1YzVkMCBcdWM5YzBcdWM4MTVcdWQ1NThcdWI4MjRcdWJhNzQgXHViYTNjXHVjODAwICcnezF9JydcdWM1ZDBcdWMxMWMgXHVjODFjXHVhYzcwXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWVycm9yX21zZ1dpdGhEZXRhaWxzPUlVUEwwMTE2RTogXHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWJjZjRcdWI4MjRcdWJhNzQgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkXHVjNzQ0IFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1lcnJvcl9tc2c9SVVQTDAxMTdFOiBcdWM2MjRcdWI5NThcdWFjMDAgXHViYzFjXHVjMGRkXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0LiBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YzYyNFx1Yjk1OCBcdWI4NWNcdWFkZjhcdWI5N2MgXHVjYzM4XHVjODcwXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLVN1cHByZXNzaW9uX25hbWVEdXBsaWNhdGlvbj1JVVBMMDExOEU6IFx1Yzc3NCBcdWM4NzBcdWM3OTFcdWM3NzQgXHViMDVkXHViMDljIFx1ZDZjNCwgXHVjNzc0XHViOTg0IFx1Y2RhOVx1YjNjY1x1Yzc3NCBcdWJjMWNcdWMwZGRcdWQ1NjlcdWIyYzhcdWIyZTQuIFx1YzY5NFx1YzE4Y1x1Yzc1OCBcdWM5MTFcdWJjZjVcdWI0MWMgXHVjNzc0XHViOTg0XHVjNzQ0IFx1ZDY1NVx1Yzc3OFx1ZDU1OFx1YWNlMCBcdWIyZTRcdWMyZGMgXHVjMmRjXHViM2M0XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLVN1cHByZXNzaW9uX3ByZXNlbnRhdGlvbk5hbWVEdXBsaWNhdGlvbj1JVVBMMDExOUU6IFx1Yzc3NCBcdWM4NzBcdWM3OTFcdWM3NzQgXHViMDVkXHViMDljIFx1ZDZjNCwgXHVjNzc0XHViOTg0IFx1Y2RhOVx1YjNjY1x1Yzc3NCBcdWJjMWNcdWMwZGRcdWQ1NjlcdWIyYzhcdWIyZTQuIFx1YzY5NFx1YzE4Y1x1Yzc1OCBcdWM5MTFcdWJjZjVcdWI0MWMgXHVkNDVjXHVjMmRjIFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWQ2NTVcdWM3NzhcdWQ1NThcdWFjZTAgXHViMmU0XHVjMmRjIFx1YzJkY1x1YjNjNFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249XHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWJjZjRcdWI4MjRcdWJhNzQgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkXHVjNzQ0IFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1zYXZlUHJvY2Vzc0Vycm9yX3JlYXNvbj0nJ3swfScnIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1Yjk3YyBcdWM4MDBcdWM3YTVcdWQ1NThcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OFx1YWMwMCBcdWJjMWNcdWMwZGRcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHViY2Y0XHViODI0XHViYTc0IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZGVsZXRlUmVmZXJlbmNlc0Vycm9yX3JlYXNvbj1cdWM3NzQgXHVjNjk0XHVjMThjXHVjNjQwIFx1YzVmMFx1YWQwMFx1YjQxYyBcdWNjMzhcdWM4NzBcdWI5N2MgXHVjODFjXHVhYzcwXHVkNTU4XHViMjk0IFx1YzkxMVx1YzVkMCBcdWM2MjRcdWI5NThcdWFjMDAgXHViYzFjXHVjMGRkXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0LiBcdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHViOTdjIFx1YmNmNFx1YjgyNFx1YmE3NCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmRcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXNhdmVGaWxlRXJyb3JfcmVhc29uPScnezB9JycgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YzgwMFx1YzdhNVx1ZDU1OFx1YjI5NCBcdWM5MTFcdWM1ZDAgXHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWJjZjRcdWI4MjRcdWJhNzQgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkXHVjNzQ0IFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1pbnZhbGlkUmVmZXJlbmNlc0Vycm9yX3JlYXNvbj1cdWQ1MGNcdWI3ZWNcdWFkZjhcdWM3NzhcdWM3NDQgXHVhZDUwXHVjYzI4IFx1YmNmNVx1YzBhY1x1ZDU1YyBcdWFjYjBcdWFjZmMsIFx1YzYyY1x1YmMxNFx1Yjk3NFx1YzljMCBcdWM1NGFcdWM3NDAgXHVjYzM4XHVjODcwXHViOTdjIFx1YWMwMFx1YzljNCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNjk0XHVjMThjXHVhYzAwIFx1YmMxY1x1YWNhY1x1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4gXG5cdWM3NzQgXHVjYzM4XHVjODcwXHViMjk0IFx1YzgxY1x1YWM3MFx1YjQyOVx1YjJjOFx1YjJlNC4gXHVhY2M0XHVjMThkXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLXVucmVzb2x2ZWRPYmplY3RFcnJvcl9yZWFzb249XHVkNTc0XHVjMTFkXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWIyOTQgXHVjNjI0XHViZTBjXHVjODFkXHVkMmI4XHViOTdjIFx1YzIxOFx1YzgxNVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjNzRjOiB7MH0oVVJJID0gezF9KXsyfQ0KLQ0KLSMgV2FybmluZyBtZXNzYWdlcw0KLU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZz1JVVBMMDExOFc6IFx1ZDU1OFx1YjA5OCBcdWM3NzRcdWMwYzFcdWM3NTggXHVjNmQwXHViY2Y4IFx1YzY5NFx1YzE4Y1x1Yjk3YyBcdWNjM2VcdWM3NDQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzkwXHVjNmQwIFx1ZDNmNFx1YjM1NFx1Yzc1OCBcdWM1ZjBcdWFkMDBcdWI0MWMgXHVkMzBjXHVjNzdjXHVjNzc0IFx1YmNmNVx1YzBhY1x1YjQxOFx1YzljMCBcdWM1NGFcdWMyYjVcdWIyYzhcdWIyZTQuDQotQWN0aXZpdHlBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZz1JVVBMMDExOVc6IFx1ZDU1OFx1YjA5OCBcdWM3NzRcdWMwYzFcdWM3NTggXHVjNmQwXHViY2Y4IFx1YzY5NFx1YzE4Y1x1Yjk3YyBcdWNjM2VcdWM3NDQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNWYwXHVhZDAwXHViNDFjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWQzMjhcdWQwYTRcdWM5YzBcdWFjMDAgXHViY2Y1XHVjMGFjXHViNDE4XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4NCi1BY3Rpdml0eURyb3BDb21tYW5kX2RlZXBDb3B5X3Byb21wdENvbmZpZ3VyYXRpb25Nc2c9XHViYWE4XHViNGUwIFx1YzEyNFx1YmE4NVx1Yzc5MFx1Yjk3YyBcdWJjZjVcdWMwYWNcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/XG5cblx1YzU0NFx1YjJjOFx1YzYyNFx1Yjk3YyBcdWQwNzRcdWI5YWRcdWQ1NThcdWJhNzQgXHVkNjA0XHVjN2FjIFx1YWQ2Y1x1YzEzMVx1Yzc1OCBcdWM3N2NcdWJkODBcdWM3NzggXHVjMTI0XHViYTg1XHVjNzkwXHViOWNjIFx1YmNmNVx1YzBhY1x1ZDU2OVx1YjJjOFx1YjJlNC4NCi1kZWVwQ29weV9wcm9tcHRNc2c9XHVjNzc0XHVjODFjXHViZDgwXHVkMTMwIFx1YWMxY1x1YmNjNFx1YzgwMVx1YzczY1x1Yjg1YyBcdWM3MjBcdWM5YzBcdWJjZjRcdWMyMThcdWQ1NThcdWFlMzAgXHVjNzA0XHVkNTc0IFx1ZDU0NFx1YzY5NFx1ZDU1YyBcdWJhYThcdWI0ZTAgXHViM2Q5XHVjODAxIFx1YjljMVx1ZDA2YyBcdWM2OTRcdWMxOGNcdWM3NTggXHVjMGFjXHViY2Y4XHVjNzQ0IFx1YzViYlx1YWM4YyBcdWI0MjlcdWIyYzhcdWIyZTQuIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8NCi1kZWVwQ29weV90aXRsZT1cdWM4MDRcdWNjYjQgXHViY2Y1XHVjMGFjKERlZXAgQ29weSkNCi0NCi0jIFByb2dyZXNzIG1lc3NhZ2VzDQotY3JlYXRpbmdQcm9jZXNzQ29tcG9uZW50VGFza19uYW1lPVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWNlZjRcdWQzZWNcdWIxMGNcdWQyYjggJyd7MH0nJ1x1Yzc0NChcdWI5N2MpIFx1Yzc5MVx1YzEzMVx1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1wcm9jZXNzaW5nUmVmZXJlbmNlc1Rhc2tfbmFtZT1cdWNjMzhcdWM4NzBcdWI5N2MgXHVjYzk4XHViOWFjXHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLWRlbGV0aW5nRWxlbWVudHNUYXNrX25hbWU9XHVjNjk0XHVjMThjIFx1YmMwZiBcdWM1ZjBcdWFkMDBcdWI0MWMgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YzBhZFx1YzgxY1x1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1jaGVja2luZ1JlZmVyZW5jZXNUYXNrX25hbWU9XHVjYzM4XHVjODcwXHViOTdjIFx1YWM4MFx1YzBhY1x1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1yZW1vdmluZ1JlZmVyZW5jZXN0YXNrX25hbWU9XHVjYzM4XHVjODcwXHViOTdjIFx1YzgxY1x1YWM3MFx1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1zYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lPVx1YzIxOFx1YzgxNVx1YjQxYyBcdWQzMGNcdWM3N2NcdWM3NDQgXHVjODAwXHVjN2E1XHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLWNoZWNrQWZmZWN0ZWRSZXNvdXJjZXNUYXNrX25hbWU9XHVjNjAxXHVkNWE1IFx1YmMxYlx1YjI5NCBcdWM3OTBcdWM2ZDBcdWM3NDQgXHVhYzgwXHVjMGFjXHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLW1vdmluZ1Rhc2tfbmFtZT1cdWM3NzRcdWIzZDkgXHVjOTExLi4uDQotbW92aW5nRmlsZXNUYXNrX25hbWU9XHVkMzBjXHVjNzdjXHVjNzQ0IFx1Yzc3NFx1YjNkOVx1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1jb3B5aW5nUmVzb3VyY2VzVGFza19uYW1lPVx1Yzc5MFx1YzZkMFx1Yzc0NCBcdWJjZjVcdWMwYWNcdWQ1NThcdWIyOTQgXHVjOTExLi4uDQotY29weWluZ0FjdGl2aXRpZXNfbXNnPScnezB9JycgXHVkNjVjXHViM2Q5XHVjNzQ0IFx1YmNmNVx1YzBhY1x1ZDU1OFx1YjI5NCBcdWM5MTENCi1zYXZpbmdGaWxlVGFza19uYW1lPScnezB9JycgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YzgwMFx1YzdhNVx1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi0NCi0jIFVJIFRleHQNCi1lbGVtZW50X3RleHQ9XHVjNjk0XHVjMThjDQotY3JlYXRlRWxlbWVudF90ZXh0PVx1YzY5NFx1YzE4YyBcdWM3OTFcdWMxMzENCi1jcmVhdGVQcm9jZXNzX3RleHQ9XHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1Yzc5MVx1YzEzMQ0KLWNvbnRyaWJ1dGVzVG9fdGV4dD1cdWNlZThcdWQyYjhcdWI5YWNcdWJkZjBcdWMxNTggXHViMzAwXHVjMGMxDQotbG9jYWxDb250cmlidXRlc1RvX3RleHQ9XHViODVjXHVjZWVjIFx1Y2VlOFx1ZDJiOFx1YjlhY1x1YmRmMFx1YzE1OCBcdWIzMDBcdWMwYzENCi1leHRlbmRzX3RleHQ9XHVkNjU1XHVjN2E1DQotcmVwbGFjZXNfdGV4dD1cdWJjMTRcdWFmYjhcdWFlMzANCi1sb2NhbFJlcGxhY2VzX3RleHQ9XHViODVjXHVjZWVjIFx1YmMxNFx1YWZiOFx1YWUzMA0KLWxvY2FsUmVwbGFjZW1lbnRBbmREZWVwQ29weV90ZXh0PVx1Yjg1Y1x1Y2VlYyBcdWJjMTRcdWFmYjhcdWFlMzAgXHViYzBmIFx1YzgwNFx1Y2NiNCBcdWJjZjVcdWMwYWMNCi1lbGVtZW50VHlwZV90ZXh0PXswfTogezF9DQotZGVsaXZlcmFibGVzX3RleHQ9XHVjNzc4XHViM2M0XHViYjNjDQotY29udHJpYnV0ZVRvQWN0aXZpdHlfdGV4dD1cdWNlZThcdWQyYjhcdWI5YWNcdWJkZjBcdWMxNTggXHViMzAwXHVjMGMxIFx1ZDY1Y1x1YjNkOQ0KLUFjdGl2aXR5RHJvcENvbW1hbmRfbGFiZWw9XHVkNjVjXHViM2Q5IFx1YjE5M1x1YWUzMA0KLXJlcGxhY2VBY3Rpdml0eV90ZXh0PVx1ZDY1Y1x1YjNkOSBcdWJjMTRcdWFmYjhcdWFlMzANCi1maWxlX3RleHQ9XHVkMzBjXHVjNzdjDQotZGlyZWN0b3J5X3RleHQ9XHViNTE0XHViODA5XHVkMWEwXHViOWFjDQotdW5yZXNvbHZlZF90ZXh0PShcdWQ1NzRcdWMxMWRcdWI0MThcdWM5YzAgXHVjNTRhXHVjNzQwICcnezB9JycpDQotYXNzaXN0c190ZXh0PVx1YzljMFx1YzZkMA0KLXVua25vd25fdGV4dD1cdWM1NGMgXHVjMjE4IFx1YzVjNlx1Yzc0Yw0KLWNvbW1hbmRfZG9uZT1cdWM2NDRcdWI4Y2MNCi0NCi0jIFRoZSBmb2xsb3dpbmcgVUkgdGV4dCBzaG91bGQgYmUgcmV2aWV3ZWQuDQotVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHl3aXRocGx1Z2luX2luZm89ezB9ICgnJ3szfScnXHVjNzU4IHsxfSAnJ3syfScnKQ0KLVV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5X2luZm89ezB9ICh7MX0gJyd7Mn0nJykNCi11aV9yZWZfZGVsZXRlPScnezB9JycgXHVjMTI0XHViYTg1XHVjNzkwXHVjNWQwIFx1YzBhY1x1YzZhOVx1YjQxOFx1YzljMCBcdWM1NGFcdWM3NDAgXHViMmU0XHVjNzRjIFx1Y2MzOFx1Yzg3MFx1YWMwMCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuXG5cdWMwYWRcdWM4MWNcdWQ1NjAgXHVkNTZkXHViYWE5XHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi11aV9yZWZfZGVsZXRlMj1cdWIyZTRcdWM3NGMgXHVjYzM4XHVjODcwXHViMjk0IFx1YzViNFx1YjI5MCBcdWFjZjNcdWM1ZDBcdWMxMWNcdWIzYzQgXHVjMGFjXHVjNmE5XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuXG5cdWMwYWRcdWM4MWNcdWQ1NjAgXHVkNTZkXHViYWE5XHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi11aV9yZWZlcmVuY2VzPVx1Y2MzOFx1Yzg3MA0KLXVpX3dvcmtwcm9kdWN0X2Rlc2NyaXB0b3JfZGVzY3JpcHRpb249XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWMxMjRcdWJhODVcdWM3OTAgJyd7MH0nJ1x1Yzc3NChcdWFjMDApICcnezF9JycgXHVkMGMwXHVjMmE0XHVkMDZjIFx1YzEyNFx1YmE4NVx1Yzc5MFx1YzY0MCBcdWM1ZjBcdWFkMDBcdWI0MThcdWM1YjQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0KFx1YzBiMFx1Y2Q5YyBcdWM5YzBcdWM4MTApLg0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vcHRpb25zPVx1YzYzNVx1YzE1OA0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vdXRwdXRsYWJlbD1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1YzEyNFx1YmE4NVx1Yzc5MFx1Yjk3YyBcdWQwYzBcdWMyYTRcdWQwNmMgXHVjMTI0XHViYTg1XHVjNzkwXHVjNzU4IFx1YzBiMFx1Y2Q5Y1x1YmIzY1x1Yjg1YyBcdWM4MWNcdWFjNzANCi11aV93b3JrcHJvZHVjdGRlc2NyaXB0b3JfZGVsZXRlX3Rhc2s9XHVkMGMwXHVjMmE0XHVkMDZjIFx1YzEyNFx1YmE4NVx1Yzc5MFx1Yjk3YyBcdWQ2NWNcdWIzZDlcdWM1ZDBcdWMxMWMgXHVjMGFkXHVjODFjDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX2RlZmF1bHRjb25maWdjaGVjaz1cdWMxMjBcdWQwZGRcdWQ1NWMgJyd7MH0nJyBcdWM2OTRcdWMxOGNcdWFjMDAgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHVjNzU4IFx1YWUzMFx1YmNmOCBcdWFkNmNcdWMxMzFcdWM1ZDAgXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LlxuXHVjNzc0IFx1YzY5NFx1YzE4Y1x1YzY0MCBcdWM2OTRcdWMxOGNcdWM3NTggXHVjODg1XHVjMThkXHVjMTMxXHVjNzQ0IFx1YWUzMFx1YmNmOCBcdWFkNmNcdWMxMzFcdWM1ZDAgXHVjZDk0XHVhYzAwXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9nZW5lcmljRXJyX21lc3NhZ2VfdGV4dD1cdWM4NzBcdWM3OTEgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OFx1YWMwMCBcdWJjMWNcdWMwZGRcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHViY2Y0XHViODI0XHViYTc0IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9ub0Rlc2NyaXB0b3JUb1N5bmNoPVx1YjNkOVx1YWUzMFx1ZDY1NFx1YjQyMCBcdWI5YzFcdWQwNmNcdWI0MWMgXHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4Y1x1Yzc1OCBcdWMxMjRcdWJhODVcdWM3OTBcdWFjMDAgXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3JlZmVyc2hpbmd2aWV3ZXI9XHVkNDVjXHVjMmRjXHVhZTMwXHViOTdjIFx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNThcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OCBcdWJjMWNcdWMwZGQNCi1jb25maXJtX3JlbW92ZV9yZWZlcmVuY2VzX3RleHQ9XHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkXHVjNWQwIFx1YjA5OFx1YzVmNFx1YjQxYyBcdWM2OTRcdWMxOGNcdWFjMDAgXHVjNzc0IFx1YzU0OFx1YjBiNFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWNjMzhcdWM4NzBcdWI5N2MgXHViY2MwXHVkNjU4IFx1ZDZjNFx1YzVkMCBcdWFjMTZcdWFjOGMgXHViNDI5XHViMmM4XHViMmU0LiBcdWM3OTBcdWIzZDlcdWM3M2NcdWI4NWMgXHVjODFjXHVhYzcwXHVkNTU4XHVhY2UwIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YjgyNFx1YmE3NCBcdWQ2NTVcdWM3NzhcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3VuaGFuZGxlZF9leGNlcHRpb249XHVjYzk4XHViOWFjXHViNDE4XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWM2MDhcdWM2NzgNCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX2JyZWFrZG93bl9lbGVtZW50PVx1YzEyMFx1ZDU4OSBcdWJjMGYgXHVkNmM0XHVkNTg5XHVhY2ZjIFx1YjNkOVx1Yzc3Y1x1ZDU1YyBcdWJkODRcdWI5NTggXHVjNjk0XHVjMThjXHViOTdjIFx1YWMwMFx1YzljOCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93cGxpc3RkbGdfbXNnPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgJyd7MH0nJ1x1Yzc0MChcdWIyOTQpIFx1YjJlNFx1Yzc0YyBcdWQwYzBcdWMyYTRcdWQwNmNcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzBiMFx1Y2Q5Y1x1YmIzY1x1Yzc4NVx1YjJjOFx1YjJlNC5cblx1ZDU3NFx1YjJmOVx1ZDU1OFx1YjI5NCBcdWMxMjRcdWJhODVcdWM3OTBcdWI5N2MgXHVjNzkxXHVjMTMxXHVkNTYwIFx1ZDBjMFx1YzJhNFx1ZDA2Y1x1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3JvbGVsaXN0ZGxnX21zZz1cdWM1ZWRcdWQ1NjAgJyd7MH0nJ1x1YzVkMCBcdWIyZTRcdWM3NGNcdWFjZmMgXHVhYzE5XHVjNzQwIFx1Y2M0NVx1Yzc4NCBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjXHVjNzc0IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC5cblx1ZDU3NFx1YjJmOVx1ZDU1OFx1YjI5NCBcdWMxMjRcdWJhODVcdWM3OTBcdWI5N2MgXHVjNzkxXHVjMTMxXHVkNTYwIFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2NcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX2ZhdGFsZXJyPVx1YzJlY1x1YWMwMVx1ZDU1YyBcdWM2MjRcdWI5NTgNCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd29ya3Byb2R1Y3RzPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX3N1Yl9lbGVtZW50PVx1YmQ4NFx1Yjk1OCBcdWM2OTRcdWMxOGNcdWI5N2MgXHVkNTc0XHViMmY5XHVkNTU4XHViMjk0IFx1ZDU1OFx1YzcwNCBcdWM2OTRcdWMxOGMgXHVjOTExIFx1ZDU1OFx1YjA5OFx1YzVkMCBcdWI5YzFcdWQwNmNcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl93cm9uZ19lbGVtZW50PVx1Yzc5MVx1YzVjNVx1YmQ4NFx1Yjk1OCBcdWM2OTRcdWMxOGMgXHVjNzc0XHVjNjc4XHVjNzU4IFx1YzY5NFx1YzE4Y1x1YzVkMCBcdWI5YzFcdWQwNmNcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9jaGlsZF9lbGVtZW50PVx1YmQ4NFx1Yjk1OCBcdWM2OTRcdWMxOGNcdWI5N2MgXHVkNTc0XHViMmY5XHVkNTU4XHViMjk0IFx1ZDU1OFx1YzcwNCBcdWM5MTEgXHVkNTU4XHViMDk4XHVjNWQwIFx1YjljMVx1ZDA2Y1x1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl90YXNrcz1cdWQwYzBcdWMyYTRcdWQwNmMNCi11aV9hc3NvY2lhdGlvbl90YXNrX3NlbGVjdGlvbj1cdWQwYzBcdWMyYTRcdWQwNmMgXHVjMTIwXHVkMGRkLi4uDQotdXRpbF9Qcm9jZXNzVXRpbF9jaGlsZGFkYXB0ZXI9XCBcIFx1ZDU1OFx1YzcwNFx1Yzc1OCBcdWM1YjRcdWIzMTFcdWQxMzA6DQotDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2V0cGFyZW50PVx1ZDU1OFx1YzcwNFx1YzVkMCBcdWIzMDBcdWQ1NWMgXHVjMGMxXHVjNzA0XHViOTdjIFx1YzEyNFx1YzgxNVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjNzRjDQotdXRpbF90bmd1dGlsX2Nhbm5vdF9lZGl0X3Jlc291cmNlPVx1Yzc5MFx1YzZkMFx1Yzc0NCBcdWQzYjhcdWM5ZDFcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi11dGlsX1Byb2Nlc3NVdGlsX2NvbnRyaWJ1dGVzdG89Jyd7MH0nJyhcdWM3M2MpXHViODVjIFx1Y2VlOFx1ZDJiOFx1YjlhY1x1YmRmMFx1YzE1OA0KLXV0aWxfUHJvY2Vzc1V0aWxfbG9jYWxDb250cmlidXRlc3RvPScnezB9JydcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Yjg1Y1x1Y2VlYyBcdWNlZThcdWQyYjhcdWI5YWNcdWJkZjBcdWMxNTgNCi1wcm9jZXNzX2V4dGVuZHM9Jyd7MH0nJyBcdWQ2NTVcdWM3YTUNCi1wcm9jZXNzX3JlcGxhY2VzPScnezB9JycgXHViYzE0XHVhZmI4XHVhZTMwDQotcHJvY2Vzc19sb2NhbFJlcGxhY2VzPScnezB9JycgXHViODVjXHVjZWVjIFx1YmMxNFx1YWZiOFx1YWUzMA0KLSMgRmlsdGVyIGNvbnN0YW50cyBleHRlcm5hbGl6ZWQgc3RyaW5ncy4NCi1GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZXNfdGV4dD1cdWM2ZDBcdWNlNTkNCi1GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZWdyb3VwaW5nc190ZXh0PVx1YzZkMFx1Y2U1OSBcdWFkZjhcdWI4ZjkNCi1GaWx0ZXJDb25zdGFudHNfd2hpdGVwYXBlcnNfdGV4dD1cdWJjMzFcdWMxMWMNCi1GaWx0ZXJDb25zdGFudHNfdG9vbG1lbnRvcnNfdGV4dD1cdWIzYzRcdWFkNmMgXHVjMGFjXHVjNmE5IFx1YjNjNFx1YzZjMFx1YjlkMA0KLUZpbHRlckNvbnN0YW50c190b29sc190ZXh0PVx1YjNjNFx1YWQ2Yw0KLUZpbHRlckNvbnN0YW50c19yb2xlc190ZXh0PVx1YzVlZFx1ZDU2MA0KLUZpbHRlckNvbnN0YW50c190YXNrc190ZXh0PVx1ZDBjMFx1YzJhNFx1ZDA2Yw0KLUZpbHRlckNvbnN0YW50c19yZXVzYWJsZWFzc2V0c190ZXh0PVx1YzdhY1x1YzBhY1x1YzZhOVx1YWMwMFx1YjJhNVx1ZDU1YyBcdWM3OTBcdWMwYjANCi1GaWx0ZXJDb25zdGFudHNfYWxsX3RleHQ9XHViYWE4XHViNDUwDQotRmlsdGVyQ29uc3RhbnRzX3Byb2Nlc3Nlc190ZXh0PVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNA0KLUZpbHRlckNvbnN0YW50c19wcmFjdGljZXNfdGV4dD1cdWMwYWNcdWI4NDANCi1GaWx0ZXJDb25zdGFudHNfdGVtcGxhdGVzX3RleHQ9XHVkMTVjXHVkNTBjXHViOWFjXHVkMmI4DQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0c190ZXh0PVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi1GaWx0ZXJDb25zdGFudHNfY2hlY2tsaXN0c190ZXh0PVx1Y2NiNFx1ZDA2Y1x1YjlhY1x1YzJhNFx1ZDJiOA0KLUZpbHRlckNvbnN0YW50c19ndWlkZWxpbmVzX3RleHQ9XHVhYzAwXHVjNzc0XHViNGRjXHViNzdjXHVjNzc4DQotRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRzX3RleHQ9XHVjNWVkXHVkNTYwIFx1YzEzOFx1ZDJiOA0KLUZpbHRlckNvbnN0YW50c19ndWlkYW5jZV90ZXh0PVx1YzU0OFx1YjBiNA0KLUZpbHRlckNvbnN0YW50c19jb25jZXB0c190ZXh0PVx1YWMxY1x1YjE1MA0KLUZpbHRlckNvbnN0YW50c19leGFtcGxlc190ZXh0PVx1YzYwOFx1YzgxYw0KLUZpbHRlckNvbnN0YW50c19jb250ZW50cGFja2FnZXNfdGV4dD1cdWNlZThcdWQxNTBcdWNlMjAgXHVkMzI4XHVkMGE0XHVjOWMwDQotRmlsdGVyQ29uc3RhbnRzX3JvbGVkZXNjcmlwdG9yc190ZXh0PVx1YzVlZFx1ZDU2MCBcdWMxMjRcdWJhODVcdWM3OTANCi1GaWx0ZXJDb25zdGFudHNfcm9sZXNldGdyb3B1aW5nc190ZXh0PVx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjggXHVhZGY4XHViOGY5DQotRmlsdGVyQ29uc3RhbnRzX3Rhc2tkZXNjcmlwdG9yc190ZXh0PVx1ZDBjMFx1YzJhNFx1ZDA2YyBcdWMxMjRcdWJhODVcdWM3OTANCi1GaWx0ZXJDb25zdGFudHNfY29udGVudGVsZW1lbnRzX3RleHQ9XHVjZWU4XHVkMTUwXHVjZTIwIFx1YzY5NFx1YzE4Yw0KLVByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fcHJlcGFyZT1cdWIzZDlcdWFlMzBcdWQ2NTQgXHVjOTAwXHViZTQ0IFx1YzkxMS4uLg0KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdGRlc2NyaXB0b3JzX3RleHQ9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWMxMjRcdWJhODVcdWM3OTANCi1GaWx0ZXJDb25zdGFudHNfYWxsY29udGVudGVsZW1lbnRzX3RleHQ9XHViYWE4XHViNGUwIFx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWM2OTRcdWMxOGMNCi1GaWx0ZXJDb25zdGFudHNfc3VwcG9ydGluZ21hdGVyaWFsc190ZXh0PVx1YzljMFx1YzZkMCBcdWM3OTBcdWI4Y2MNCi1NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9lcnJvclNhdmluZ0ZpbGVzPVx1ZDMwY1x1Yzc3YyBcdWM4MDBcdWM3YTUgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OCBcdWJjMWNcdWMwZGQNCi1GaWx0ZXJDb25zdGFudHNfY3VzdG9tY2F0ZWdvcmllc190ZXh0PVx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NTggXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0dHlwZXNfdGV4dD1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1YzcyMFx1ZDYxNQ0KLURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kX3dhcm5pbmdNc2c9XHVhY2JkXHVhY2UwXHVjNjQwIFx1ZDU2OFx1YWVkOCBcdWMwYWRcdWM4MWMgXHVjNjQ0XHViOGNjDQotRmlsdGVyQ29uc3RhbnRzX21ldGhvZHBsdWdpbnNfdGV4dD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4DQotVXNlckludGVyYWN0aW9uSGVscGVyX2xvY2tlZFBsdWdpbj1JVVBMMDEyMEU6ICcnezB9JycgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzc0IFx1YzdhMFx1YWNhOCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotRmlsdGVyQ29uc3RhbnRzX2RvbWFpbnNfdGV4dD1cdWIzYzRcdWJhNTRcdWM3NzgNCi1GaWx0ZXJDb25zdGFudHNfcm9hZG1hcF90ZXh0PVx1Yjg1Y1x1YjRkY1x1YjlmNQ0KLUZpbHRlckNvbnN0YW50c19yZXBvcnRzX3RleHQ9XHViY2Y0XHVhY2UwXHVjMTFjDQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9sYWJlbD1cdWJhNTRcdWMxOGNcdWQyYjggXHVjZWU4XHVkMTUwXHVjZTIwXHVjNWQwXHVjMTFjIFx1YWUzMFx1YmNmOCBcdWIzZDlcdWFlMzBcdWQ2NTQoJlkpDQotTWFudWFsU3luY2hyb25pemVDb21tYW5kX2xhYmVsPVx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NTggXHViM2Q5XHVhZTMwXHVkNjU0KCZaKS4uLg0KLUF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfc3VjZXNzZnVsPVx1YjNkOVx1YWUzMFx1ZDY1NFx1YWMwMCBcdWMxMzFcdWFjZjVcdWM4MDFcdWM3M2NcdWI4NWMgXHVjNjQ0XHViOGNjXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLSMgVXNlckludGVyYWN0aW9uSGVscGVyDQotVXNlckludGVyYWN0aW9uSGVscGVyX1Byb2Nlc3NQYWNrYWdlX05hbWU9XHVjNzc0XHViOTg0Og0KLQ0KLSMgTWV0aG9kQ3JlYXRlQ2hpbGRDb21tYW5kDQotbmV3RWxlbWVudF90ZXh0PVx1YzBjOCB7MH0NCi11cGRhdGVfb3V0b2ZzeW5jaF90aXRsZT1cdWFjMzFcdWMyZTAgXHVjZGE5XHViM2NjDQotdXBkYXRlX291dG9mc3luY2hfbXNnPVx1ZDMwY1x1Yzc3Y1x1Yzc3NCBcdWQzMGNcdWM3N2MgXHVjMmRjXHVjMmE0XHVkMTVjXHVjNWQwXHVjMTFjIFx1YmNjMFx1YWNiZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4gXHViY2MwXHVhY2JkXHVjMGFjXHVkNTZkXHVjNzQ0IFx1YWNiOVx1Y2NkMFx1YzRmMFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2QyZmMxOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgR2VuZXJpYyBEaWFsb2cgVGl0bGVzDQotbW92ZURpYWxvZ190aXRsZT1Nb3Zlcg0KLWRlbGV0ZURpYWxvZ190aXRsZT1FeGNsdWlyIEVsZW1lbnRvDQotZXJyb3JEaWFsb2dfdGl0bGU9RXJybw0KLWVycm9yRGlhbG9nX2Nhbm5vdFJlbmFtZT1JbXBvc3NcdTAwZWR2ZWwgcmVub21lYXIgezB9ICcnezF9JycgcGFyYSAnJ3syfScnLiBSZXNvbHZhIG8gcHJvYmxlbWEgbW9zdHJhZG8gZW0gRGV0YWxoZXMgZSBjbGlxdWUgZW0gT0sgcGFyYSBjb250aW51YXIgb3UgZW0gQ2FuY2VsYXIgcGFyYSBpbnRlcnJvbXBlciBlc3RhIG9wZXJhXHUwMGU3XHUwMGUzby4NCi0NCi0jIENvbmZpcm0gUmVmZXJlbmNlcyBSZW1vdmFsIERpYWxvZw0KLWRlbGV0ZVJlZmVyZW5jZXNEaWFsb2dfdGl0bGU9Q29uZmlybWFyIFJlbW9cdTAwZTdcdTAwZTNvIGRlIFJlZmVyXHUwMGVhbmNpYXMNCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RleHQ9T3MgZWxlbWVudG9zIHF1ZSB2b2NcdTAwZWEgZXN0XHUwMGUxIHByZXN0ZXMgYSBleGNsdWlyIGFpbmRhIGVzdFx1MDBlM28gc2VuZG8gcmVmZXJlbmNpYWRvcyBwb3Igb3V0cm9zIGVsZW1lbnRvcyBuYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy4gQSBleGNsdXNcdTAwZTNvIGRlc3NlcyBlbGVtZW50b3MgcmVtb3Zlclx1MDBlMSByZWZlclx1MDBlYW5jaWFzIGEgZWxlcywgcG9ydGFudG8sIHRhbWJcdTAwZTltIGF0dWFsaXphclx1MDBlMSBvcyBlbGVtZW50b3MgcXVlIGZhemVtIGFzIHJlZmVyXHUwMGVhbmNpYXMuIENlcnRpZmlxdWUtc2UgZGUgdGVyIHBlcm1pc3NcdTAwZTNvIHBhcmEgYXR1YWxpemFyIG9zIGVsZW1lbnRvcyBxdWUgZmF6ZW0gYXMgcmVmZXJcdTAwZWFuY2lhcyBhbnRlcyBkZSBjbGljYXIgZW0gT0suIENsaXF1ZSBlbSBEZXRhbGhlcyBwYXJhIHJldmlzYXIgYSBsaXN0YSBkZSBlbGVtZW50b3MgcXVlIHJlZmVyZW5jaWFtIG9zIGVsZW1lbnRvcyBxdWUgdm9jXHUwMGVhIGVzdFx1MDBlMSBwcmVzdGVzIGEgZXhjbHVpci4NCi0NCi0jIFJlc29sdmUgTmFtZSBDb25mbGljdCBEaWFsb2cNCi1yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RpdGxlPVJlc29sdmVyIENvbmZsaXRvIGRlIE5vbWVzIGRlIEVsZW1lbnRvcw0KLXJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGV4dD1EaWdpdGUgdW0gbm92byB7MH0gcGFyYSAnJ3sxfScnOg0KLQ0KLSMgU2VsZWN0IERlbGl2ZXJhYmxlcyBEaWFsb2cNCi1zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGl0bGU9U2VsZWNpb25hciBEaXN0cmlidVx1MDBlZHZlaXMNCi1zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGV4dD1TZWxlY2lvbmUgdW0gZGlzdHJpYnVcdTAwZWR2ZWwgbm8gcXVhbCB2b2NcdTAwZWEgZGVzZWphIHF1ZSBvIHByb2R1dG8gZGUgdHJhYmFsaG8gJyd7MH0nJyBzZWphIGRlc2lnbmFkby4NCi0NCi0jIE5ldyBQcm9jZXNzIENvbXBvbmVudCBEaWFsb2cNCi1uZXdQcm9jZXNzQ29tcG9uZW50RGlhbG9nX3RpdGxlPU5vdm8gQ29tcG9uZW50ZSBkZSBQcm9jZXNzbw0KLW5hbWVMYWJlbF90ZXh0PU5vbWU6DQotZGVmYXVsdENvbmZpZ0xhYmVsX3RleHQ9Q29uZmlndXJhXHUwMGU3XHUwMGUzbyBQYWRyXHUwMGUzbzoNCi1iYXNlUHJvY2Vzc0xhYmVsX3RleHQ9UHJvY2Vzc28gZGUgQmFzZToNCi1iYXNlZE9uUHJvY2Vzc2VzTGFiZWxfdGV4dD1CYXNlYWRvIG5vcyBQcm9jZXNzb3M6DQotDQotIyBSb2xlIEFzc29jaWF0aW9uIERpYWxvZw0KLXNlbGVjdEFzc29jaWF0aW9uTGFiZWxfdGV4dD1TZWxlY2lvbmFyIGFzc29jaWFcdTAwZTdcdTAwZTNvIHBhcmEgYSB0YXJlZmEgJyd7MH0nJw0KLQ0KLSMgUmVtb3ZlIEFzc29jaWF0aW9uIGRpYWxvZw0KLXJlbW92ZUFzc29jaWF0aW9uRGlhbG9nX3RleHQ9UmVtb3ZlciBBc3NvY2lhXHUwMGU3XHUwMGUzbw0KLQ0KLSMgU2VsZWN0IFRlYW1zIERpYWxvZw0KLXNlbGVjdFRlYW1zRGlhbG9nX3RpdGxlPVNlbGVjaW9uYXIgRXF1aXBlcw0KLXNlbGVjdFRlYW1zRGlhbG9nX3RleHQ9U2VsZWNpb25lIHVtYSBlcXVpcGUgbmEgcXVhbCB2b2NcdTAwZWEgZGVzZWphIHF1ZSB1bWEgZnVuXHUwMGU3XHUwMGUzbyAnJ3swfScnIHNlamEgZGVzaWduYWRhLg0KLQ0KLSMgVGFzbCBTZWxlY3Rpb24gRGlhbG9nDQotdGFza1NlbGVjdGlvbkRpYWxvZ190aXRsZT1TZWxlXHUwMGU3XHUwMGUzbyBkZSBUYXJlZmFzDQotdGl0bGVMYWJlbF90ZXh0PVNlbGVjaW9uYXIgdGFyZWZhcy4uLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEwwMTAwRTogTyBub21lIHswfSBcdTAwZTkgbmVjZXNzXHUwMGUxcmlvLlxuXG5Ub2RvcyBvcyBlbGVtZW50b3MgZGUgbVx1MDBlOXRvZG8gZSBkZSBwcm9jZXNzbyBkZXZlbSB0ZXIgdW0gbm9tZS5cblxuRGlnaXRlIHVtIG5vbWUgdlx1MDBlMWxpZG8gZSB0ZW50ZSBub3ZhbWVudGUuDQotZW1wdHlFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c9TyBub21lIG5cdTAwZTNvIHBvZGUgZXN0YXIgdmF6aW8uIEVzcGVjaWZpcXVlIHVtIG5vbWUgdlx1MDBlMWxpZG8uDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQTDAxMDFFOiBPIG5vbWUgJyd7MH0nJyBqXHUwMGUxIGV4aXN0ZS5cblxuVW0gZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gZGV2ZSB0ZXIgdW0gbm9tZSBleGNsdXNpdm8uXG5cbkRpZ2l0ZSB1bSBub21lIGRpZmVyZW50ZSBlIHRlbnRlIG5vdmFtZW50ZS4NCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c9TyBtZXNtbyBub21lIGRlIGVsZW1lbnRvIGpcdTAwZTEgZXhpc3RlLiBFc3BlY2lmaXF1ZSBvdXRybyBub21lLg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMV9tc2c9SVVQTDAxMDJFOiBPIG5vbWUgJyd7MH0nJyBcdTAwZTkgaW52XHUwMGUxbGlkby5cblxuVW0gbm9tZSBkZSBlbGVtZW50byBkZSBtXHUwMGU5dG9kbyBuXHUwMGUzbyBwb2RlIGluaWNpYXIgY29tIHVtIGVzcGFcdTAwZTdvLlxuXG5EaWdpdGUgdW0gbm9tZSB2XHUwMGUxbGlkbyBlIHRlbnRlIG5vdmFtZW50ZS4NCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjJfbXNnPUlVUEwwMTAzRTogTyBub21lICcnezB9JycgXHUwMGU5IGludlx1MDBlMWxpZG8uXG5cblVtIG5vbWUgZGUgZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gblx1MDBlM28gcG9kZSB0ZXJtaW5hciBjb20gdW0gcG9udG8uXG5cbkRpZ2l0ZSB1bSBub21lIHZcdTAwZTFsaWRvIGUgdGVudGUgbm92YW1lbnRlLg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yM19tc2c9SVVQTDAxMDRFOiBPIG5vbWUgJyd7MH0nJyBcdTAwZTkgaW52XHUwMGUxbGlkby5cblxuVW0gbm9tZSBkZSBlbGVtZW50byBkZSBtXHUwMGU5dG9kbyBuXHUwMGUzbyBwb2RlIGNvbnRlciBlc3RlcyBjYXJhY3RlcmVzOiBcXCAvIDogKiA/ICIgPCA+IDsgfFxuXG5EaWdpdGUgdW0gbm9tZSB2XHUwMGUxbGlkbyBlIHRlbnRlIG5vdmFtZW50ZS4NCi1ub0NvbmZpZ0Vycm9yX21zZz1JVVBMMDEwNUU6IEEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgYXR1YWwgblx1MDBlM28gY29udFx1MDBlOW0gbmVuaHVtYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIG1cdTAwZTl0b2RvLlxuXG5cdTAwYzkgbmVjZXNzXHUwMGUxcmlhIHVtYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIG1cdTAwZTl0b2RvIHBhcmEgY3JpYXIgdW0gbm92byBwcm9jZXNzby5cblxuQ3JpZSB1bWEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBtXHUwMGU5dG9kbyBlIHRlbnRlIG5vdmFtZW50ZS4NCi1ub0RlbGl2ZXJ5UHJvY2Vzc0Vycm9yX21zZz1JVVBMMDEwNkU6IEEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgYXR1YWwgblx1MDBlM28gY29udFx1MDBlOW0gbmVuaHVtIHByb2Nlc3NvIGRlIGVudHJlZ2EuXG5cblx1MDBjOSBuZWNlc3NcdTAwZTFyaW8gdW0gcHJvY2Vzc28gZGUgZW50cmVnYSBkZSBiYXNlIHBhcmEgY3JpYXIgdW1hIG5vdmEgY29udHJpYnVpXHUwMGU3XHUwMGUzbyBkZSBwcm9jZXNzby5cblxuQ3JpZSB1bSBwcm9jZXNzbyBkZSBlbnRyZWdhIGUgdGVudGUgbm92YW1lbnRlLg0KLW5vRGVmYXVsdENvbmZpZ0Vycm9yX21zZz1JVVBMMDEwN0U6IE5lbmh1bWEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBtXHUwMGU5dG9kbyBmb2kgc2VsZWNpb25hZGEuXG5cblVtYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIG1cdTAwZTl0b2RvIHBhZHJcdTAwZTNvIGRldmUgc2VyIGRlc2lnbmFkYSBwYXJhIG8gbm92byBwcm9jZXNzby5cblxuU2VsZWNpb25lIHVtYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIG1cdTAwZTl0b2RvIGUgdGVudGUgbm92YW1lbnRlLg0KLW5vQmFzZVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDhFOiBOZW5odW0gcHJvY2Vzc28gZGUgZW50cmVnYSBmb2kgc2VsZWNpb25hZG8uXG5cblVtYSBjb250cmlidWlcdTAwZTdcdTAwZTNvIGRlIHByb2Nlc3NvIGV4aWdlIHVtIHByb2Nlc3NvIGRlIGVudHJlZ2EgZGUgYmFzZS5cblxuU2VsZWNpb25lIHVtIHByb2Nlc3NvIGRlIGVudHJlZ2EgZSB0ZW50ZSBub3ZhbWVudGUuDQotY3JlYXRlUHJvY2Vzc0Vycm9yX21zZz1JVVBMMDEwOUU6IE5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIGNyaWFyIG8gcHJvY2Vzc28gY29tIFx1MDBlYXhpdG8uDQotY3JlYXRlRWxlbWVudEVycm9yX21zZz1JVVBMMDExMEU6IE5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIGNyaWFyIG8gZWxlbWVudG8gY29tIFx1MDBlYXhpdG8uDQotZGVsZXRlRWxlbWVudEVycm9yX21zZz1JVVBMMDExMUU6IE5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIGV4Y2x1aXIgbyBlbGVtZW50byBjb20gXHUwMGVheGl0by4NCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX21zZz1JVVBMMDExMkU6IE5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIGNyaWFyIG8gYXJxdWl2byBkZSBjb250ZVx1MDBmYWRvIHBhcmEgbyBlbGVtZW50by5cblxuSlx1MDBlMSBleGlzdGUgdW0gYXJxdWl2byAnJ3swfScnLlxuXG5EaWdpdGUgdW0gbm9tZSBkaWZlcmVudGUgZSB0ZW50ZSBub3ZhbWVudGUuDQotZHVwbGljYXRlQ29udGVudEZpbGVFcnJvcl9zaW1wbGVfbXNnPUV4aXN0ZSB1bSBhcnF1aXZvIGRlIGNvbnRlXHUwMGZhZG8gY29tIG8gbWVzbW8gbm9tZS4gRXNwZWNpZmlxdWUgb3V0cm8gbm9tZS4NCi11bmRvQ29tbWFuZEVycm9yX21zZz1JVVBMMDExM0U6IE5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIGNvbmNsdWlyIG8gY29tYW5kbyBkZSBkZXNmYXplciAnJ3swfScnLlxuXG5PY29ycmV1IHVtIGVycm86IHsxfQ0KLWludmFsaWRQcmVkZWNlc3NvckVycm9yX21zZz1JVVBMMDExNEU6IE8gXHUwMGVkbmRpY2UgZGUgcHJlZGVjZXNzb3IgZXNwZWNpZmljYWRvIFx1MDBlOSBpbnZcdTAwZTFsaWRvLlxuXG5VbSBcdTAwZWRuZGljZSBkZSBwcmVkZWNlc3NvciBkZXZlIHNlciB1bSB2YWxvciBpbnRlaXJvIGRhIGNvbHVuYSAnXHUwMGNkbmRpY2UnLlxuXG5Fc3BlY2lmaXF1ZSB1bSB2YWxvciB2XHUwMGUxbGlkbyBlIHRlbnRlIG5vdmFtZW50ZS4NCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzPUlVUEwwMTAwVzogJyd7MH0nJyBqXHUwMGUxIGVzdFx1MDBlMSBhc3NvY2lhZG8gYSAnJ3sxfScnLiAgU29tZW50ZSB1bWEgYXNzb2NpYVx1MDBlN1x1MDBlM28gZGVzdGUgdGlwbyBcdTAwZTkgcGVybWl0aWRhLiBQYXJhIGRlc2lnbmFyICcnezB9JycgcGFyYSAnJ3syfScnLCBwcmltZWlybyBcdTAwZTkgbmVjZXNzXHUwMGUxcmlvIHJlbW92XHUwMGVhLWxvIGRlICcnezF9JycuDQotZXJyb3JfbXNnV2l0aERldGFpbHM9SVVQTDAxMTZFOiBPY29ycmV1IHVtIGVycm8uIENsaXF1ZSBlbSBEZXRhbGhlcyBwYXJhIG9idGVyIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBhZGljaW9uYWlzLg0KLWVycm9yX21zZz1JVVBMMDExN0U6IE9jb3JyZXUgdW0gZXJyby4gQ29uc3VsdGUgbyByZWdpc3RybyBkZSBlcnJvcyBwYXJhIG9idGVyIGRldGFsaGVzIGFkaWNpb25haXMuDQotU3VwcHJlc3Npb25fbmFtZUR1cGxpY2F0aW9uPUlVUEwwMTE4RTogT2NvcnJlclx1MDBlMSB1bSBjb25mbGl0byBkZSBub21lcyBhcFx1MDBmM3MgZXN0YSBvcGVyYVx1MDBlN1x1MDBlM28uIFByb2N1cmUgcG9yIGR1cGxpY2FcdTAwZTdcdTAwZjVlcyBubyBub21lIGRvIGVsZW1lbnRvIGUgdGVudGUgbm92YW1lbnRlLg0KLVN1cHByZXNzaW9uX3ByZXNlbnRhdGlvbk5hbWVEdXBsaWNhdGlvbj1JVVBMMDExOUU6IE9jb3JyZXJcdTAwZTEgdW0gY29uZmxpdG8gZGUgbm9tZXMgYXBcdTAwZjNzIGVzdGEgb3BlcmFcdTAwZTdcdTAwZTNvLiBQcm9jdXJlIHBvciBkdXBsaWNhXHUwMGU3XHUwMGY1ZXMgbm8gbm9tZSBkZSBhcHJlc2VudGFcdTAwZTdcdTAwZTNvIGUgdGVudGUgbm92YW1lbnRlLg0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVycm9yX3JlYXNvbj1PY29ycmV1IHVtIGVycm8uIENsaXF1ZSBlbSBEZXRhbGhlcyBwYXJhIG9idGVyIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBhZGljaW9uYWlzLg0KLXNhdmVQcm9jZXNzRXJyb3JfcmVhc29uPU9jb3JyZXUgdW0gZXJybyBhbyBzYWx2YXIgbyBwcm9jZXNzbyAnJ3swfScnLiBDbGlxdWUgZW0gRGV0YWxoZXMgcGFyYSBvYnRlciBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcy4NCi1kZWxldGVSZWZlcmVuY2VzRXJyb3JfcmVhc29uPU9jb3JyZXUgdW0gZXJybyBhbyByZW1vdmVyIHJlZmVyXHUwMGVhbmNpYXMgYXNzb2NpYWRhcyBhIGVzdGUgZWxlbWVudG8uIENsaXF1ZSBlbSBEZXRhbGhlcyBwYXJhIG9idGVyIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBhZGljaW9uYWlzLg0KLXNhdmVGaWxlRXJyb3JfcmVhc29uPU9jb3JyZXUgdW0gZXJybyBhbyBzYWx2YXIgbyBhcnF1aXZvICcnezB9JycuIENsaXF1ZSBlbSBEZXRhbGhlcyBwYXJhIG9idGVyIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBhZGljaW9uYWlzLg0KLWludmFsaWRSZWZlcmVuY2VzRXJyb3JfcmVhc29uPUZvcmFtIGRldGVjdGFkb3MgZWxlbWVudG9zIGRlIG1cdTAwZTl0b2RvIGNvbSByZWZlclx1MDBlYW5jaWFzIGludlx1MDBlMWxpZGFzIGNvbW8gcmVzdWx0YWRvIGRlIGNcdTAwZjNwaWEgZW50cmUgcGx1Zy1pbnMuXG5Fc3NhcyByZWZlclx1MDBlYW5jaWFzIHNlclx1MDBlM28gcmVtb3ZpZGFzLiBEZXNlamEgY29udGludWFyPw0KLXVucmVzb2x2ZWRPYmplY3RFcnJvcl9yZWFzb249SW1wb3NzXHUwMGVkdmVsIG1vZGlmaWNhciB1bSBvYmpldG8gblx1MDBlM28gcmVzb2x2aWRvOiB7MH0oVVJJID0gezF9KXsyfQ0KLQ0KLSMgV2FybmluZyBtZXNzYWdlcw0KLU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZz1JVVBMMDExOFc6IE5cdTAwZTNvIGZvaSBwb3NzXHUwMGVkdmVsIGxvY2FsaXphciB1bSBvdSBtYWlzIGVsZW1lbnRvcyBkZSBvcmlnZW0uIE9zIGFycXVpdm9zIGFzc29jaWFkb3MgbmEgcGFzdGEgZGUgcmVjdXJzb3Mgblx1MDBlM28gc2VyXHUwMGUzbyBjb3BpYWRvcy4NCi1BY3Rpdml0eUFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE5VzogTlx1MDBlM28gZm9pIHBvc3NcdTAwZWR2ZWwgbG9jYWxpemFyIHVtIG91IG1haXMgZWxlbWVudG9zIGRlIG9yaWdlbS4gT3MgUGFjb3RlcyBkZSBQcm9jZXNzbyBhc3NvY2lhZG9zIG5cdTAwZTNvIHNlclx1MDBlM28gY29waWFkb3MuDQotQWN0aXZpdHlEcm9wQ29tbWFuZF9kZWVwQ29weV9wcm9tcHRDb25maWd1cmF0aW9uTXNnPURlc2VqYSBjb3BpYXIgdG9kb3Mgb3MgZGVzY3JpdG9yZXM/XG5cbkNsaWNhciBlbSBOXHUwMGUzbyBjb3BpYXJcdTAwZTEgc29tZW50ZSBvcyBkZXNjcml0b3JlcyBxdWUgZmF6ZW0gcGFydGUgZGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBhdHVhbC4NCi1kZWVwQ29weV9wcm9tcHRNc2c9Vm9jXHUwMGVhIHJlY2ViZXJcdTAwZTEgdW1hIGNcdTAwZjNwaWEgZGUgdG9kb3Mgb3MgZWxlbWVudG9zIHZpbmN1bGFkb3MgZGluYW1pY2FtZW50ZSBxdWUgcHJlY2lzYSBtYW50ZXIgc2VwYXJhZG9zIGRhcXVpIHBvciBkaWFudGUuIERlc2VqYSBjb250aW51YXI/DQotZGVlcENvcHlfdGl0bGU9Q1x1MDBmM3BpYSBQcm9mdW5kYQ0KLQ0KLSMgUHJvZ3Jlc3MgbWVzc2FnZXMNCi1jcmVhdGluZ1Byb2Nlc3NDb21wb25lbnRUYXNrX25hbWU9Q3JpYW5kbyBvIGNvbXBvbmVudGUgZGUgcHJvY2Vzc28gJyd7MH0nJy4uLg0KLXByb2Nlc3NpbmdSZWZlcmVuY2VzVGFza19uYW1lPVByb2Nlc3NhbmRvIHJlZmVyXHUwMGVhbmNpYXMuLi4NCi1kZWxldGluZ0VsZW1lbnRzVGFza19uYW1lPUV4Y2x1aW5kbyBlbGVtZW50b3MgZSBhcnF1aXZvcyBhc3NvY2lhZG9zLi4uDQotY2hlY2tpbmdSZWZlcmVuY2VzVGFza19uYW1lPVZlcmlmaWNhbmRvIHJlZmVyXHUwMGVhbmNpYXMuLi4NCi1yZW1vdmluZ1JlZmVyZW5jZXN0YXNrX25hbWU9UmVtb3ZlbmRvIHJlZmVyXHUwMGVhbmNpYXMuLi4NCi1zYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lPVNhbHZhbmRvIGFycXVpdm9zIG1vZGlmaWNhZG9zLi4uDQotY2hlY2tBZmZlY3RlZFJlc291cmNlc1Rhc2tfbmFtZT1WZXJpZmljYW5kbyByZWN1cnNvcyBhZmV0YWRvcy4uLg0KLW1vdmluZ1Rhc2tfbmFtZT1Nb3ZlbmRvLi4uDQotbW92aW5nRmlsZXNUYXNrX25hbWU9TW92ZW5kbyBhcnF1aXZvcy4uLg0KLWNvcHlpbmdSZXNvdXJjZXNUYXNrX25hbWU9Q29waWFuZG8gcmVjdXJzb3MuLi4NCi1jb3B5aW5nQWN0aXZpdGllc19tc2c9Q29waWFuZG8gYXRpdmlkYWRlICcnezB9JycNCi1zYXZpbmdGaWxlVGFza19uYW1lPVNhbHZhbmRvIG8gYXJxdWl2byAnJ3swfScnLi4uDQotDQotIyBVSSBUZXh0DQotZWxlbWVudF90ZXh0PWVsZW1lbnRvDQotY3JlYXRlRWxlbWVudF90ZXh0PUNyaWFyIEVsZW1lbnRvDQotY3JlYXRlUHJvY2Vzc190ZXh0PUNyaWFyIFByb2Nlc3NvDQotY29udHJpYnV0ZXNUb190ZXh0PUNvbnRyaWJ1aSBwYXJhDQotbG9jYWxDb250cmlidXRlc1RvX3RleHQ9Q29udHJpYnVpIGxvY2FsbWVudGUgcGFyYQ0KLWV4dGVuZHNfdGV4dD1FeHRlbnNcdTAwZjVlcw0KLXJlcGxhY2VzX3RleHQ9U3Vic3RpdHVpDQotbG9jYWxSZXBsYWNlc190ZXh0PVN1YnN0aXR1aSBsb2NhbG1lbnRlDQotbG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5X3RleHQ9U3Vic3RpdHVpXHUwMGU3XHUwMGUzbyBMb2NhbCBlIENcdTAwZjNwaWEgUHJvZnVuZGENCi1lbGVtZW50VHlwZV90ZXh0PXswfTp7MX0NCi1kZWxpdmVyYWJsZXNfdGV4dD1EaXN0cmlidVx1MDBlZHZlaXMNCi1jb250cmlidXRlVG9BY3Rpdml0eV90ZXh0PUNvbnRyaWJ1aXIgcGFyYSBBdGl2aWRhZGUNCi1BY3Rpdml0eURyb3BDb21tYW5kX2xhYmVsPUF0aXZpZGFkZSBkZSBRdWVkYQ0KLXJlcGxhY2VBY3Rpdml0eV90ZXh0PVN1YnN0aXR1aXIgQXRpdmlkYWRlDQotZmlsZV90ZXh0PWFycXVpdm8NCi1kaXJlY3RvcnlfdGV4dD1kaXJldFx1MDBmM3Jpbw0KLXVucmVzb2x2ZWRfdGV4dD0oJyd7MH0nJyBuXHUwMGUzbyByZXNvbHZpZG8pDQotYXNzaXN0c190ZXh0PUFzc2lzdGUNCi11bmtub3duX3RleHQ9RGVzY29uaGVjaWRvDQotY29tbWFuZF9kb25lPUNvbmNsdVx1MDBlZGRvDQotDQotIyBUaGUgZm9sbG93aW5nIFVJIHRleHQgc2hvdWxkIGJlIHJldmlld2VkLg0KLVV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5d2l0aHBsdWdpbl9pbmZvPXswfSAoezF9ICcnezJ9JycgZW0gJyd7M30nJykNCi1VdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eV9pbmZvPXswfSAoezF9ICcnezJ9JycpDQotdWlfcmVmX2RlbGV0ZT1PIGRlc2NyaXRvciAnJ3swfScnIHRlbSBhcyByZWZlclx1MDBlYW5jaWFzIGEgc2VndWlyLCBxdWUgblx1MDBlM28gc1x1MDBlM28gdXRpbGl6YWRhcyBlbSBuZW5odW0gbHVnYXIuXG5TZWxlY2lvbmUgYXF1ZWxhcyBxdWUgdm9jXHUwMGVhIGRlc2VqZSBleGNsdWlyOg0KLXVpX3JlZl9kZWxldGUyPUFzIHNlZ3VpbnRlcyByZWZlclx1MDBlYW5jaWFzIG5cdTAwZTNvIGVzdFx1MDBlM28gc2VuZG8gdXRpbGl6YWRhcyBlbSBuZW5odW0gbHVnYXIuXG5TZWxlY2lvbmUgYXF1ZWxhcyBxdWUgdm9jXHUwMGVhIGRlc2VqZSBleGNsdWlyOg0KLXVpX3JlZmVyZW5jZXM9UmVmZXJcdTAwZWFuY2lhcw0KLXVpX3dvcmtwcm9kdWN0X2Rlc2NyaXB0b3JfZGVzY3JpcHRpb249TyBkZXNjcml0b3IgZGUgcHJvZHV0byBkZSB0cmFiYWxobyAnJ3swfScnIGVzdFx1MDBlMSBhc3NvY2lhZG8gKFNhXHUwMGVkZGEgRGUpIGFvIGRlc2NyaXRvciBkZSB0YXJlZmEgJyd7MX0nJw0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vcHRpb25zPU9wY2lvbmFpcw0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vdXRwdXRsYWJlbD1SZW1vdmVyIGRlc2NyaXRvciBkZSBwcm9kdXRvIGNvbSBzYVx1MDBlZGRhIGRvIGRlc2NyaXRvciBkZSB0YXJlZmENCi11aV93b3JrcHJvZHVjdGRlc2NyaXB0b3JfZGVsZXRlX3Rhc2s9RXhjbHVpciBkZXNjcml0b3IgZGUgdGFyZWZhIGRhIGF0aXZpZGFkZQ0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9kZWZhdWx0Y29uZmlnY2hlY2s9TyBlbGVtZW50byBzZWxlY2lvbmFkbyAnJ3swfScnIG5cdTAwZTNvIGVzdFx1MDBlMSBuYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHBhZHJcdTAwZTNvIGRvIHByb2Nlc3NvLlxuRGVzZWphIGluY2x1XHUwMGVkLWxvIGUgc3VhcyBkZXBlbmRcdTAwZWFuY2lhcyBuYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHBhZHJcdTAwZTNvPw0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9nZW5lcmljRXJyX21lc3NhZ2VfdGV4dD1PY29ycmVyYW0gZXJyb3MgbmEgb3BlcmFcdTAwZTdcdTAwZTNvLiBDbGlxdWUgZW0gRGV0YWxoZXMgcGFyYSBvYnRlciBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgYWRpY2lvbmFpcy4NCi1Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uX25vRGVzY3JpcHRvclRvU3luY2g9Tlx1MDBlM28gZm9pIGxvY2FsaXphZG8gbmVuaHVtIGRlc2NyaXRvciBjb20gZWxlbWVudG8gZGUgbVx1MDBlOWRvY28gdmluY3VsYWRvIHBhcmEgc2luY3Jvbml6YXIuDQotdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfcmVmZXJzaGluZ3ZpZXdlcj1FcnJvIGFvIGF0dWFsaXphciBvIHZpc3VhbGl6YWRvcg0KLWNvbmZpcm1fcmVtb3ZlX3JlZmVyZW5jZXNfdGV4dD1EZXBvaXMgZGEgY29udmVyc1x1MDBlM28sIG8ocykgZWxlbWVudG8ocykgbGlzdGFkbyhzKSBlbSBEZXRhbGhlcyBwb2RlKG0pIHRlciByZWZlclx1MDBlYW5jaWFzIGlsZWdhaXMgZW0gcmVsYVx1MDBlN1x1MDBlM28gYSBlc3RhIG9yaWVudGFcdTAwZTdcdTAwZTNvLiBDbGlxdWUgZW0gT0sgcGFyYSByZW1vdlx1MDBlYS1sb3MgZSBjb250aW51YXIuDQotdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfdW5oYW5kbGVkX2V4Y2VwdGlvbj1FeGNlXHUwMGU3XHUwMGUzbyBuXHUwMGUzbyBtYW5pcHVsYWRhDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9icmVha2Rvd25fZWxlbWVudD1OXHUwMGUzbyBcdTAwZTkgcG9zc1x1MDBlZHZlbCB0ZXIgbyBtZXNtbyBlbGVtZW50byBkZSBkaXZpc1x1MDBlM28gY29tbyBwcmVkZWNlc3NvciBlIHN1Y2Vzc29yDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dwbGlzdGRsZ19tc2c9TyBwcm9kdXRvIGRlIHRyYWJhbGhvICcnezB9JycgXHUwMGU5IHVtYSBzYVx1MDBlZGRhIHBhcmEgYXMgdGFyZWZhcyBhIHNlZ3Vpci5cblNlbGVjaW9uZSBhcyB0YXJlZmFzIHBhcmEgYXMgcXVhaXMgZGVzZWplIGNyaWFyIG9zIGRlc2NyaXRvcmVzIGNvcnJlc3BvbmRlbnRlcy4NCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfcm9sZWxpc3RkbGdfbXNnPUEgZnVuXHUwMGU3XHUwMGUzbyAnJ3swfScnIHBvc3N1aSBvcyBzZWd1aW50ZXMgcHJvZHV0b3MgZGUgdHJhYmFsaG8gcmVzcG9uc1x1MDBlMXZlaXMuXG5TZWxlY2lvbmUgb3MgcHJvZHV0b3MgZGUgdHJhYmFsaG8gcGFyYSBvcyBxdWFpcyBkZXNlamUgY3JpYXIgb3MgZGVzY3JpdG9yZXMgY29ycmVzcG9uZGVudGVzLg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX2ZhdGFsZXJyPUVycm8gZmF0YWwNCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd29ya3Byb2R1Y3RzPVByb2R1dG9zIGRlIFRyYWJhbGhvDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9zdWJfZWxlbWVudD1JbXBvc3NcdTAwZWR2ZWwgdmluY3VsYXIgdW0gZWxlbWVudG8gZGUgZGl2aXNcdTAwZTNvIGEgdW0gZGUgc2V1cyBzdWJlbGVtZW50b3MNCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl93cm9uZ19lbGVtZW50PUltcG9zc1x1MDBlZHZlbCB2aW5jdWxhciBhIHVtIGVsZW1lbnRvIHF1ZSBuXHUwMGUzbyBzZWphIHVtIGVsZW1lbnRvIGRlIGRpdmlzXHUwMGUzbyBkZSB0cmFiYWxoby4NCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9jaGlsZF9lbGVtZW50PUltcG9zc1x1MDBlZHZlbCB2aW5jdWxhciB1bSBlbGVtZW50byBkZSBkaXZpc1x1MDBlM28gYSB1bSBkZSBzZXVzIGZpbGhvcy4NCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfdGFza3M9VGFyZWZhcw0KLXVpX2Fzc29jaWF0aW9uX3Rhc2tfc2VsZWN0aW9uPVNlbGVcdTAwZTdcdTAwZTNvIGRlIFRhcmVmYXMuLi4NCi11dGlsX1Byb2Nlc3NVdGlsX2NoaWxkYWRhcHRlcj1cIFwgYWRhcHRhZG9yIGRvIGZpbGhvOiANCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zZXRwYXJlbnQ9Tlx1MDBlM28gZm9pIHBvc3NcdTAwZWR2ZWwgY29uZmlndXJhciBwYWkgcGFyYSBvIGZpbGhvDQotdXRpbF90bmd1dGlsX2Nhbm5vdF9lZGl0X3Jlc291cmNlPUltcG9zc1x1MDBlZHZlbCBlZGl0YXIgbyByZWN1cnNvLg0KLXV0aWxfUHJvY2Vzc1V0aWxfY29udHJpYnV0ZXN0bz1jb250cmlidWkgcGFyYSAnJ3swfScnDQotdXRpbF9Qcm9jZXNzVXRpbF9sb2NhbENvbnRyaWJ1dGVzdG89Y29udHJpYnVpIGxvY2FsbWVudGUgcGFyYSAnJ3swfScnDQotcHJvY2Vzc19leHRlbmRzPWVzdGVuZGUgJyd7MH0nJw0KLXByb2Nlc3NfcmVwbGFjZXM9c3Vic3RpdHVpICcnezB9JycNCi1wcm9jZXNzX2xvY2FsUmVwbGFjZXM9c3Vic3RpdHVpIGxvY2FsbWVudGUgJyd7MH0nJw0KLSMgRmlsdGVyIGNvbnN0YW50cyBleHRlcm5hbGl6ZWQgc3RyaW5ncy4NCi1GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZXNfdGV4dD1EaXNjaXBsaW5hcw0KLUZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lZ3JvdXBpbmdzX3RleHQ9QWdydXBhbWVudG9zIGRlIERpc2NpcGxpbmFzDQotRmlsdGVyQ29uc3RhbnRzX3doaXRlcGFwZXJzX3RleHQ9V2hpdGUgcGFwZXJzDQotRmlsdGVyQ29uc3RhbnRzX3Rvb2xtZW50b3JzX3RleHQ9TWVudG9yZXMgZGUgRmVycmFtZW50YXMNCi1GaWx0ZXJDb25zdGFudHNfdG9vbHNfdGV4dD1GZXJyYW1lbnRhcw0KLUZpbHRlckNvbnN0YW50c19yb2xlc190ZXh0PUZ1blx1MDBlN1x1MDBmNWVzDQotRmlsdGVyQ29uc3RhbnRzX3Rhc2tzX3RleHQ9VGFyZWZhcw0KLUZpbHRlckNvbnN0YW50c19yZXVzYWJsZWFzc2V0c190ZXh0PVJlY3Vyc29zIFJldXRpbGl6XHUwMGUxdmVpcw0KLUZpbHRlckNvbnN0YW50c19hbGxfdGV4dD1Ub2Rvcw0KLUZpbHRlckNvbnN0YW50c19wcm9jZXNzZXNfdGV4dD1Qcm9jZXNzb3MNCi1GaWx0ZXJDb25zdGFudHNfcHJhY3RpY2VzX3RleHQ9UHJcdTAwZTF0aWNhcw0KLUZpbHRlckNvbnN0YW50c190ZW1wbGF0ZXNfdGV4dD1HYWJhcml0b3MNCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RzX3RleHQ9UHJvZHV0b3MgZGUgVHJhYmFsaG8NCi1GaWx0ZXJDb25zdGFudHNfY2hlY2tsaXN0c190ZXh0PUxpc3RhcyBkZSBWZXJpZmljYVx1MDBlN1x1MDBlM28NCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGVsaW5lc190ZXh0PURpcmV0cml6ZXMNCi1GaWx0ZXJDb25zdGFudHNfcm9sZXNldHNfdGV4dD1Db25qdW50b3MgZGUgRnVuXHUwMGU3XHUwMGY1ZXMNCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGFuY2VfdGV4dD1PcmllbnRhXHUwMGU3XHUwMGUzbw0KLUZpbHRlckNvbnN0YW50c19jb25jZXB0c190ZXh0PUNvbmNlaXRvcw0KLUZpbHRlckNvbnN0YW50c19leGFtcGxlc190ZXh0PUV4ZW1wbG9zDQotRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRwYWNrYWdlc190ZXh0PVBhY290ZXMgZGUgQ29udGVcdTAwZmFkbw0KLUZpbHRlckNvbnN0YW50c19yb2xlZGVzY3JpcHRvcnNfdGV4dD1EZXNjcml0b3JlcyBkZSBGdW5cdTAwZTdcdTAwZTNvDQotRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRncm9wdWluZ3NfdGV4dD1BZ3J1cGFtZW50b3MgZGUgQ29uanVudG8gZGUgRnVuXHUwMGU3XHUwMGY1ZXMNCi1GaWx0ZXJDb25zdGFudHNfdGFza2Rlc2NyaXB0b3JzX3RleHQ9RGVzY3JpdG9yZXMgZGUgVGFyZWZhDQotRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRlbGVtZW50c190ZXh0PUVsZW1lbnRvcyBkZSBDb250ZVx1MDBmYWRvDQotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9wcmVwYXJlPVByZXBhcmFuZG8gc2luY3Jvbml6YVx1MDBlN1x1MDBlM28uLi4NCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RkZXNjcmlwdG9yc190ZXh0PURlc2NyaXRvcmVzIGRlIFByb2R1dG8gZGUgVHJhYmFsaG8NCi1GaWx0ZXJDb25zdGFudHNfYWxsY29udGVudGVsZW1lbnRzX3RleHQ9VG9kb3Mgb3MgRWxlbWVudG9zIGRlIENvbnRlXHUwMGZhZG8NCi1GaWx0ZXJDb25zdGFudHNfc3VwcG9ydGluZ21hdGVyaWFsc190ZXh0PU1hdGVyaWFpcyBkZSBTdXBvcnRlDQotTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfZXJyb3JTYXZpbmdGaWxlcz1FcnJvIGFvIHNhbHZhciBhcnF1aXZvKHMpDQotRmlsdGVyQ29uc3RhbnRzX2N1c3RvbWNhdGVnb3JpZXNfdGV4dD1DYXRlZ29yaWFzIFBlcnNvbmFsaXphZGFzDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0dHlwZXNfdGV4dD1UaXBvcyBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRfd2FybmluZ01zZz1FeGNsdXNcdTAwZTNvIGNvbmNsdVx1MDBlZGRhIGNvbSBhdmlzbw0KLUZpbHRlckNvbnN0YW50c19tZXRob2RwbHVnaW5zX3RleHQ9UGx1Zy1pbnMgZGUgTVx1MDBlOXRvZG8NCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfbG9ja2VkUGx1Z2luPUlVUEwwMTIwRTogTyBwbHVnaW4gJyd7MH0nJyBlc3RcdTAwZTEgYmxvcXVlYWRvLg0KLUZpbHRlckNvbnN0YW50c19kb21haW5zX3RleHQ9RG9tXHUwMGVkbmlvcw0KLUZpbHRlckNvbnN0YW50c19yb2FkbWFwX3RleHQ9TWFwYXMgZGUgUm90YXMNCi1GaWx0ZXJDb25zdGFudHNfcmVwb3J0c190ZXh0PVJlbGF0XHUwMGYzcmlvcw0KLUF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWw9UyZpbmNyb25pemFcdTAwZTdcdTAwZTNvIFBhZHJcdTAwZTNvIGRvIENvbnRlXHUwMGZhZG8gZG8gTVx1MDBlOXRvZG8NCi1NYW51YWxTeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWw9U2luY3JvbmkmemFcdTAwZTdcdTAwZTNvIEN1c3RvbWl6YWRhLi4uDQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9zdWNlc3NmdWw9QSBzaW5jcm9uaXphXHUwMGU3XHUwMGUzbyBmb2kgY29uY2x1XHUwMGVkZGEgY29tIFx1MDBlYXhpdG8uDQotDQotIyBVc2VySW50ZXJhY3Rpb25IZWxwZXINCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfUHJvY2Vzc1BhY2thZ2VfTmFtZT1Ob21lOg0KLQ0KLSMgTWV0aG9kQ3JlYXRlQ2hpbGRDb21tYW5kDQotbmV3RWxlbWVudF90ZXh0PU5vdm8gezB9DQotdXBkYXRlX291dG9mc3luY2hfdGl0bGU9Q29uZmxpdG8gZGUgYXR1YWxpemFcdTAwZTdcdTAwZTNvDQotdXBkYXRlX291dG9mc3luY2hfbXNnPU9zIGFycXVpdm9zIGZvcmFtIGFsdGVyYWRvcyBubyBzaXN0ZW1hIGRlIGFycXVpdm9zLiBEZXNlamEgc29icmVzY3JldmVyIGFzIGFsdGVyYVx1MDBlN1x1MDBmNWVzPw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZGEyYzUzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBHZW5lcmljIERpYWxvZyBUaXRsZXMNCi1tb3ZlRGlhbG9nX3RpdGxlPVx1NzlmYlx1NTJhOA0KLWRlbGV0ZURpYWxvZ190aXRsZT1cdTUyMjBcdTk2NjRcdTUxNDNcdTdkMjANCi1lcnJvckRpYWxvZ190aXRsZT1cdTk1MTlcdThiZWYNCi1lcnJvckRpYWxvZ19jYW5ub3RSZW5hbWU9XHU2NWUwXHU2Y2Q1XHU1YzA2IHswfVx1MjAxY3sxfVx1MjAxZFx1OTFjZFx1NTQ3ZFx1NTQwZFx1NGUzYVx1MjAxY3syfVx1MjAxZFx1MzAwMlx1OGJmN1x1ODllM1x1NTFiM1x1MjAxY1x1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MjAxZFx1NGUyZFx1NjYzZVx1NzkzYVx1NzY4NFx1OTVlZVx1OTg5OFx1ZmYwY1x1NzEzNlx1NTQwZVx1NTM1NVx1NTFmYlx1MjAxY1x1Nzg2ZVx1NWI5YVx1MjAxZFx1N2VlN1x1N2VlZFx1ZmYwY1x1NjIxNlx1NTM1NVx1NTFmYlx1MjAxY1x1NTNkNlx1NmQ4OFx1MjAxZFx1NjUzZVx1NWYwM1x1NmI2NFx1NjRjZFx1NGY1Y1x1MzAwMg0KLQ0KLSMgQ29uZmlybSBSZWZlcmVuY2VzIFJlbW92YWwgRGlhbG9nDQotZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190aXRsZT1cdTc4NmVcdThiYTRcdTk2NjRcdTUzYmJcdTVmMTVcdTc1MjgNCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RleHQ9XHU2NWI5XHU2Y2Q1XHU1ZTkzXHU0ZTJkXHU3Njg0XHU1MTc2XHU0ZWQ2XHU1MTQzXHU3ZDIwXHU0ZWNkXHU3MTM2XHU1NzI4XHU1ZjE1XHU3NTI4XHU1YzA2XHU4OTgxXHU1MjIwXHU5NjY0XHU3Njg0XHU1MTQzXHU3ZDIwXHUzMDAyXHU1MjIwXHU5NjY0XHU4ZmQ5XHU0ZTliXHU1MTQzXHU3ZDIwXHU1YzA2XHU5NjY0XHU1M2JiXHU1YmY5XHU4ZmQ5XHU0ZTliXHU1MTQzXHU3ZDIwXHU3Njg0XHU1ZjE1XHU3NTI4XHVmZjBjXHU1NmUwXHU2YjY0XHU4YmU1XHU2NGNkXHU0ZjVjXHU4ZmQ4XHU1YzA2XHU2NmY0XHU2NWIwXHU1ZjE1XHU3NTI4XHU1MTQzXHU3ZDIwXHUzMDAyXHU1NzI4XHU1MzU1XHU1MWZiXHUyMDFjXHU3ODZlXHU1YjlhXHUyMDFkXHU0ZTRiXHU1MjRkXHVmZjBjXHU4YmY3XHU3ODZlXHU0ZmRkXHU2MGE4XHU2NzA5XHU2NzQzXHU2NmY0XHU2NWIwXHU1ZjE1XHU3NTI4XHU1MTQzXHU3ZDIwXHUzMDAyXHU1MzU1XHU1MWZiXHUyMDFjXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUyMDFkXHVmZjBjXHU1M2VmXHU2OGMwXHU2N2U1XHU1ZjE1XHU3NTI4XHU1Zjg1XHU1MjIwXHU5NjY0XHU1MTQzXHU3ZDIwXHU3Njg0XHU1MTQzXHU3ZDIwXHU1MjE3XHU4ODY4XHUzMDAyDQotDQotIyBSZXNvbHZlIE5hbWUgQ29uZmxpY3QgRGlhbG9nDQotcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190aXRsZT1cdTg5ZTNcdTUxYjNcdTUxNDNcdTdkMjBcdTU0MGRcdTc5ZjBcdTUxYjJcdTdhODENCi1yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RleHQ9XHU0ZTNhXHUyMDFjezF9XHUyMDFkXHU4ZjkzXHU1MTY1XHU2NWIwIHswfVx1ZmYxYQ0KLQ0KLSMgU2VsZWN0IERlbGl2ZXJhYmxlcyBEaWFsb2cNCi1zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGl0bGU9XHU5MDA5XHU2MmU5XHU1M2VmXHU0ZWE0XHU0ZWQ4XHU0ZWY2DQotc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RleHQ9XHU5MDA5XHU2MmU5XHU1ZTBjXHU2NzFiXHU1MjA2XHU5MTRkXHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHUyMDFjezB9XHUyMDFkXHU3Njg0XHU1M2VmXHU0ZWE0XHU0ZWQ4XHU0ZWY2XHUzMDAyDQotDQotIyBOZXcgUHJvY2VzcyBDb21wb25lbnQgRGlhbG9nDQotbmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZ190aXRsZT1cdTY1YjBcdTVlZmFcdTZkNDFcdTdhMGJcdTdlYzRcdTRlZjYNCi1uYW1lTGFiZWxfdGV4dD1cdTU0MGRcdTc5ZjBcdWZmMWENCi1kZWZhdWx0Q29uZmlnTGFiZWxfdGV4dD1cdTdmM2FcdTc3MDFcdTkxNGRcdTdmNmVcdWZmMWENCi1iYXNlUHJvY2Vzc0xhYmVsX3RleHQ9XHU1N2ZhXHU2NzJjXHU2ZDQxXHU3YTBiXHVmZjFhDQotYmFzZWRPblByb2Nlc3Nlc0xhYmVsX3RleHQ9XHU1N2ZhXHU0ZThlXHU2ZDQxXHU3YTBiXHVmZjFhDQotDQotIyBSb2xlIEFzc29jaWF0aW9uIERpYWxvZw0KLXNlbGVjdEFzc29jaWF0aW9uTGFiZWxfdGV4dD1cdTkwMDlcdTYyZTlcdTRlZmJcdTUyYTFcdTIwMWN7MH1cdTIwMWRcdTc2ODRcdTUxNzNcdTgwNTQNCi0NCi0jIFJlbW92ZSBBc3NvY2lhdGlvbiBkaWFsb2cNCi1yZW1vdmVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PVx1OTY2NFx1NTNiYlx1NTE3M1x1ODA1NA0KLQ0KLSMgU2VsZWN0IFRlYW1zIERpYWxvZw0KLXNlbGVjdFRlYW1zRGlhbG9nX3RpdGxlPVx1OTAwOVx1NjJlOVx1NTZlMlx1OTYxZg0KLXNlbGVjdFRlYW1zRGlhbG9nX3RleHQ9XHU5MDA5XHU2MmU5XHU1ZTBjXHU2NzFiXHU1MjA2XHU5MTRkXHU4OWQyXHU4MjcyXHUyMDFjezB9XHUyMDFkXHU3Njg0XHU1NmUyXHU5NjFmXHUzMDAyDQotDQotIyBUYXNsIFNlbGVjdGlvbiBEaWFsb2cNCi10YXNrU2VsZWN0aW9uRGlhbG9nX3RpdGxlPVx1NGVmYlx1NTJhMVx1OTAwOVx1NjJlOQ0KLXRpdGxlTGFiZWxfdGV4dD1cdTkwMDlcdTYyZTlcdTRlZmJcdTUyYTEuLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEwwMTAwRTogXHU3ZjNhXHU1YzExezB9XHU1NDBkXHU3OWYwXHUzMDAyXG5cblx1NjI0MFx1NjcwOVx1NjViOVx1NmNkNVx1NTQ4Y1x1NmQ0MVx1N2EwYlx1NTE0M1x1N2QyMFx1OTBmZFx1NWZjNVx1OTg3Ylx1NjcwOVx1NTQwZFx1NzlmMFx1MzAwMlxuXG5cdThiZjdcdThmOTNcdTUxNjVcdTY3MDlcdTY1NDhcdTU0MGRcdTc5ZjBcdWZmMGNcdTcxMzZcdTU0MGVcdTkxY2RcdThiZDVcdTMwMDINCi1lbXB0eUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZz1cdTU0MGRcdTc5ZjBcdTRlMGRcdTgwZmRcdTRlM2FcdTdhN2FcdTMwMDJcdThiZjdcdTYzMDdcdTViOWFcdTY3MDlcdTY1NDhcdTU0MGRcdTc5ZjBcdTMwMDINCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZz1JVVBMMDEwMUU6IFx1NTQwZFx1NzlmMFx1MjAxY3swfVx1MjAxZFx1NWRmMlx1NWI1OFx1NTcyOFx1MzAwMlxuXG5cdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTVmYzVcdTk4N2JcdTY3MDlcdTU1MmZcdTRlMDBcdTU0MGRcdTc5ZjBcdTMwMDJcblxuXHU4YmY3XHU4ZjkzXHU1MTY1XHU1M2U2XHU0ZTAwXHU0ZTJhXHU1NDBkXHU3OWYwXHVmZjBjXHU3MTM2XHU1NDBlXHU5MWNkXHU4YmQ1XHUzMDAyDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnPVx1NzZmOFx1NTQwY1x1NTE0M1x1N2QyMFx1NTQwZFx1NzlmMFx1NWRmMlx1NWI1OFx1NTcyOFx1MzAwMlx1OGJmN1x1NjMwN1x1NWI5YVx1NTNlNlx1NGUwMFx1NGUyYVx1NTQwZFx1NzlmMFx1MzAwMg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMV9tc2c9SVVQTDAxMDJFOiBcdTU0MGRcdTc5ZjBcdTIwMWN7MH1cdTIwMWRcdTY1ZTBcdTY1NDhcdTMwMDJcblxuXHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU1NDBkXHU3OWYwXHU0ZTBkXHU4MGZkXHU0ZWU1XHU3YTdhXHU2ODNjXHU1ZjAwXHU1OTM0XHUzMDAyXG5cblx1OGJmN1x1OGY5M1x1NTE2NVx1NjcwOVx1NjU0OFx1NTQwZFx1NzlmMFx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNVx1MzAwMg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMl9tc2c9SVVQTDAxMDNFOiBcdTU0MGRcdTc5ZjBcdTIwMWN7MH1cdTIwMWRcdTY1ZTBcdTY1NDhcdTMwMDJcblxuXHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU1NDBkXHU3OWYwXHU0ZTBkXHU4MGZkXHU0ZWU1XHU1M2U1XHU3MGI5XHU3ZWQzXHU1YzNlXHUzMDAyXG5cblx1OGJmN1x1OGY5M1x1NTE2NVx1NjcwOVx1NjU0OFx1NTQwZFx1NzlmMFx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNVx1MzAwMg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yM19tc2c9SVVQTDAxMDRFOiBcdTU0MGRcdTc5ZjBcdTIwMWN7MH1cdTIwMWRcdTY1ZTBcdTY1NDhcdTMwMDJcblxuXHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU1NDBkXHU3OWYwXHU0ZTBkXHU4MGZkXHU1MzA1XHU1NDJiXHU0ZWU1XHU0ZTBiXHU1YjU3XHU3YjI2XHVmZjFhXFwgLyA6ICogPyAiIDwgPiA7IHxcblxuXHU4YmY3XHU4ZjkzXHU1MTY1XHU2NzA5XHU2NTQ4XHU1NDBkXHU3OWYwXHVmZjBjXHU3MTM2XHU1NDBlXHU5MWNkXHU4YmQ1XHUzMDAyDQotbm9Db25maWdFcnJvcl9tc2c9SVVQTDAxMDVFOiBcdTVmNTNcdTUyNGRcdTY1YjlcdTZjZDVcdTVlOTNcdTRlMGRcdTUzMDVcdTU0MmJcdTRlZmJcdTRmNTVcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTMwMDJcblxuXHU1ZmM1XHU5ODdiXHU2NzA5XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlXHVmZjBjXHU2MjRkXHU4MGZkXHU1MjFiXHU1ZWZhXHU2NWIwXHU2ZDQxXHU3YTBiXHUzMDAyXG5cblx1OGJmN1x1NTIxYlx1NWVmYVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNVx1MzAwMg0KLW5vRGVsaXZlcnlQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA2RTogXHU1ZjUzXHU1MjRkXHU2NWI5XHU2Y2Q1XHU1ZTkzXHU0ZTBkXHU1MzA1XHU1NDJiXHU0ZWZiXHU0ZjU1XHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiXHUzMDAyXG5cblx1NWZjNVx1OTg3Ylx1NjcwOVx1NTdmYVx1NjcyY1x1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYlx1ZmYwY1x1NjI0ZFx1ODBmZFx1NTIxYlx1NWVmYVx1NjViMFx1NmQ0MVx1N2EwYlx1NjNkMFx1NGY5Ylx1MzAwMlxuXG5cdThiZjdcdTUyMWJcdTVlZmFcdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGJcdWZmMGNcdTcxMzZcdTU0MGVcdTkxY2RcdThiZDVcdTMwMDINCi1ub0RlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQTDAxMDdFOiBcdTY3MmFcdTkwMDlcdTYyZTlcdTRlZmJcdTRmNTVcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTMwMDJcblxuXHU1ZmM1XHU5ODdiXHU0ZTNhXHU2NWIwXHU2ZDQxXHU3YTBiXHU1MjA2XHU5MTRkXHU3ZjNhXHU3NzAxXHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlXHUzMDAyXG5cblx1OGJmN1x1OTAwOVx1NjJlOVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNVx1MzAwMg0KLW5vQmFzZVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDhFOiBcdTY3MmFcdTkwMDlcdTYyZTlcdTRlZmJcdTRmNTVcdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGJcdTMwMDJcblxuXHU2ZDQxXHU3YTBiXHU2M2QwXHU0ZjliXHU4OTgxXHU2YzQyXHU2NzA5XHU1N2ZhXHU2NzJjXHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiXHUzMDAyXG5cblx1OGJmN1x1OTAwOVx1NjJlOVx1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYlx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNVx1MzAwMg0KLWNyZWF0ZVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDlFOiBcdTY1ZTBcdTZjZDVcdTYyMTBcdTUyOWZcdTUyMWJcdTVlZmFcdTZkNDFcdTdhMGJcdTMwMDINCi1jcmVhdGVFbGVtZW50RXJyb3JfbXNnPUlVUEwwMTEwRTogXHU2NWUwXHU2Y2Q1XHU2MjEwXHU1MjlmXHU1MjFiXHU1ZWZhXHU1MTQzXHU3ZDIwXHUzMDAyDQotZGVsZXRlRWxlbWVudEVycm9yX21zZz1JVVBMMDExMUU6IFx1NjVlMFx1NmNkNVx1NjIxMFx1NTI5Zlx1NTIyMFx1OTY2NFx1NTE0M1x1N2QyMFx1MzAwMg0KLWR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3JfbXNnPUlVUEwwMTEyRTogXHU2NWUwXHU2Y2Q1XHU1MjFiXHU1ZWZhXHU1MTQzXHU3ZDIwXHU3Njg0XHU1MTg1XHU1YmI5XHU2NTg3XHU0ZWY2XHUzMDAyXG5cblx1NjU4N1x1NGVmNlx1MjAxY3swfVx1MjAxZFx1NWRmMlx1NWI1OFx1NTcyOFx1MzAwMlxuXG5cdThiZjdcdThmOTNcdTUxNjVcdTUzZTZcdTRlMDBcdTRlMmFcdTU0MGRcdTc5ZjBcdWZmMGNcdTcxMzZcdTU0MGVcdTkxY2RcdThiZDVcdTMwMDINCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX3NpbXBsZV9tc2c9XHU1MTc3XHU2NzA5XHU3NmY4XHU1NDBjXHU1NDBkXHU3OWYwXHU3Njg0XHU1MTg1XHU1YmI5XHU2NTg3XHU0ZWY2XHU1ZGYyXHU1YjU4XHU1NzI4XHUzMDAyXHU4YmY3XHU2MzA3XHU1YjlhXHU1M2U2XHU0ZTAwXHU0ZTJhXHU1NDBkXHU3OWYwXHUzMDAyDQotdW5kb0NvbW1hbmRFcnJvcl9tc2c9SVVQTDAxMTNFOiBcdTY0YTRcdTZkODhcdTU0N2RcdTRlZTRcdTIwMWN7MH1cdTIwMWRcdTY1ZTBcdTZjZDVcdTViOGNcdTYyMTBcdTMwMDJcblxuXHU1M2QxXHU3NTFmXHU5NTE5XHU4YmVmXHVmZjFhezF9DQotaW52YWxpZFByZWRlY2Vzc29yRXJyb3JfbXNnPUlVUEwwMTE0RTogXHU2MzA3XHU1YjlhXHU3Njg0XHU1MTQ4XHU4ODRjXHU0ZjVjXHU0ZTFhXHU3ZDIyXHU1ZjE1XHU2NWUwXHU2NTQ4XHUzMDAyXG5cblx1NTE0OFx1ODg0Y1x1NGY1Y1x1NGUxYVx1N2QyMlx1NWYxNVx1NWZjNVx1OTg3Ylx1NjYyZlx1Njc2NVx1ODFlYVx1MjAxY1x1N2QyMlx1NWYxNVx1MjAxZFx1NTIxN1x1NzY4NFx1NjU3NFx1NjU3MFx1NTAzY1x1MzAwMlxuXG5cdThiZjdcdTYzMDdcdTViOWFcdTY3MDlcdTY1NDhcdTUwM2NcdWZmMGNcdTcxMzZcdTU0MGVcdTkxY2RcdThiZDVcdTMwMDINCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzPUlVUEwwMTAwVzpcdTIwMWN7MH1cdTIwMWRcdTVkZjJcdTRlMGVcdTIwMWN7MX1cdTIwMWRcdTUxNzNcdTgwNTRcdTMwMDJcdTUzZWFcdTUxNDFcdThiYjhcdTRlMDBcdTRlMmFcdTZiNjRcdTdjN2JcdTU3OGJcdTc2ODRcdTUxNzNcdTgwNTRcdTMwMDJcdTg5ODFcdTVjMDZcdTIwMWN7MH1cdTIwMWRcdTUyMDZcdTkxNGRcdTdlZDlcdTIwMWN7Mn1cdTIwMWRcdWZmMGNcdTk3MDBcdTg5ODFcdTk5OTZcdTUxNDhcdTVjMDZcdTViODNcdTRlY2VcdTIwMWN7MX1cdTIwMWRcdTk2NjRcdTUzYmJcdTMwMDINCi1lcnJvcl9tc2dXaXRoRGV0YWlscz1JVVBMMDExNkU6IFx1NTNkMVx1NzUxZlx1OTUxOVx1OGJlZlx1MzAwMlx1OGJmN1x1NTM1NVx1NTFmYlx1MjAxY1x1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MjAxZFx1ZmYwY1x1ODNiN1x1NTNkNlx1NjZmNFx1NTkxYVx1NGZlMVx1NjA2Zlx1MzAwMg0KLWVycm9yX21zZz1JVVBMMDExN0U6IFx1NTNkMVx1NzUxZlx1OTUxOVx1OGJlZlx1MzAwMlx1OGJmN1x1NTNjMlx1OTYwNVx1OTUxOVx1OGJlZlx1NjVlNVx1NWZkN1x1ZmYwY1x1ODNiN1x1NTNkNlx1NjZmNFx1NTkxYVx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMg0KLVN1cHByZXNzaW9uX25hbWVEdXBsaWNhdGlvbj1JVVBMMDExOEU6IFx1NTcyOFx1NmI2NFx1NjRjZFx1NGY1Y1x1NTQwZVx1NWMwNlx1NTFmYVx1NzNiMFx1NTQwZFx1NzlmMFx1NTFiMlx1N2E4MVx1MzAwMlx1OGJmN1x1NjhjMFx1NjdlNVx1NTE0M1x1N2QyMFx1NTQwZFx1NzlmMFx1NjYyZlx1NTQyNlx1OTFjZFx1NTkwZFx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNQ0KLVN1cHByZXNzaW9uX3ByZXNlbnRhdGlvbk5hbWVEdXBsaWNhdGlvbj1JVVBMMDExOUU6IFx1NTcyOFx1NmI2NFx1NjRjZFx1NGY1Y1x1NTQwZVx1NWMwNlx1NTFmYVx1NzNiMFx1NTQwZFx1NzlmMFx1NTFiMlx1N2E4MVx1MzAwMlx1OGJmN1x1NjhjMFx1NjdlNVx1NTE0M1x1N2QyMFx1NjYzZVx1NzkzYVx1NTQwZFx1NzlmMFx1NjYyZlx1NTQyNlx1OTFjZFx1NTkwZFx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNQ0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVycm9yX3JlYXNvbj1cdTUzZDFcdTc1MWZcdTk1MTlcdThiZWZcdTMwMDJcdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTIwMWRcdWZmMGNcdTgzYjdcdTUzZDZcdTY2ZjRcdTU5MWFcdTRmZTFcdTYwNmZcdTMwMDINCi1zYXZlUHJvY2Vzc0Vycm9yX3JlYXNvbj1cdTRmZGRcdTViNThcdTZkNDFcdTdhMGJcdTIwMWN7MH1cdTIwMWRcdTY1ZjZcdTUzZDFcdTc1MWZcdTk1MTlcdThiZWZcdTMwMDJcdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTIwMWRcdWZmMGNcdTgzYjdcdTUzZDZcdTY2ZjRcdTU5MWFcdTRmZTFcdTYwNmZcdTMwMDINCi1kZWxldGVSZWZlcmVuY2VzRXJyb3JfcmVhc29uPVx1OTY2NFx1NTNiYlx1NGUwZVx1NmI2NFx1NTE0M1x1N2QyMFx1NTE3M1x1ODA1NFx1NzY4NFx1NWYxNVx1NzUyOFx1NjVmNlx1NTNkMVx1NzUxZlx1OTUxOVx1OGJlZlx1MzAwMlx1OGJmN1x1NTM1NVx1NTFmYlx1MjAxY1x1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MjAxZFx1ZmYwY1x1ODNiN1x1NTNkNlx1NjZmNFx1NTkxYVx1NGZlMVx1NjA2Zlx1MzAwMg0KLXNhdmVGaWxlRXJyb3JfcmVhc29uPVx1NGZkZFx1NWI1OFx1NjU4N1x1NGVmNlx1MjAxY3swfVx1MjAxZFx1NjVmNlx1NTNkMVx1NzUxZlx1OTUxOVx1OGJlZlx1MzAwMlx1OGJmN1x1NTM1NVx1NTFmYlx1MjAxY1x1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MjAxZFx1ZmYwY1x1ODNiN1x1NTNkNlx1NjZmNFx1NTkxYVx1NGZlMVx1NjA2Zlx1MzAwMg0KLWludmFsaWRSZWZlcmVuY2VzRXJyb3JfcmVhc29uPVx1NjhjMFx1NmQ0Ylx1NTIzMFx1NzUzMVx1NGU4ZVx1NGVhNFx1NTNjOVx1NjNkMlx1NGVmNlx1NTkwZFx1NTIzNlx1ODAwY1x1NWYxNVx1OGQ3N1x1NzY4NFx1NWUyNlx1NjcwOVx1NjVlMFx1NjU0OFx1NWYxNVx1NzUyOFx1NzY4NFx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMFx1MzAwMlxuXHU1YzA2XHU5NjY0XHU1M2JiXHU4ZmQ5XHU0ZTliXHU1ZjE1XHU3NTI4XHUzMDAyXHU4OTgxXHU3ZWU3XHU3ZWVkXHU1NDE3XHVmZjFmDQotdW5yZXNvbHZlZE9iamVjdEVycm9yX3JlYXNvbj1cdTY1ZTBcdTZjZDVcdTRmZWVcdTY1MzlcdTY3MmFcdTg5ZTNcdTY3OTBcdTc2ODRcdTViZjlcdThjNjFcdWZmMWF7MH1cdWZmMDhVUkkgPSB7MX1cdWZmMDl7Mn0NCi0NCi0jIFdhcm5pbmcgbWVzc2FnZXMNCi1NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c9SVVQTDAxMThXOiBcdTY1ZTBcdTZjZDVcdTYyN2VcdTUyMzBcdTRlMDBcdTRlMmFcdTYyMTZcdTU5MWFcdTRlMmFcdTZlOTBcdTUxNDNcdTdkMjBcdTMwMDJcdTVjMDZcdTRlMGRcdTU5MGRcdTUyMzZcdThkNDRcdTZlOTBcdTY1ODdcdTRlZjZcdTU5MzlcdTRlMmRcdTc2ODRcdTUxNzNcdTgwNTRcdTY1ODdcdTRlZjZcdTMwMDINCi1BY3Rpdml0eUFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE5VzogXHU2NWUwXHU2Y2Q1XHU2MjdlXHU1MjMwXHU0ZTAwXHU0ZTJhXHU2MjE2XHU1OTFhXHU0ZTJhXHU2ZTkwXHU1MTQzXHU3ZDIwXHUzMDAyXHU1YzA2XHU0ZTBkXHU1OTBkXHU1MjM2XHU1MTczXHU4MDU0XHU3Njg0XHU2ZDQxXHU3YTBiXHU1MzA1XHUzMDAyDQotQWN0aXZpdHlEcm9wQ29tbWFuZF9kZWVwQ29weV9wcm9tcHRDb25maWd1cmF0aW9uTXNnPVx1ODk4MVx1NTkwZFx1NTIzNlx1NjI0MFx1NjcwOVx1NzY4NFx1NjNjZlx1OGZmMFx1N2IyNlx1NTQxN1x1ZmYxZlxuXG5cdTU5ODJcdTY3OWNcdTUzNTVcdTUxZmJcdTIwMWNcdTU0MjZcdTIwMWRcdTVjMDZcdTUzZWFcdTU5MGRcdTUyMzZcdTRmNWNcdTRlM2FcdTVmNTNcdTUyNGRcdTkxNGRcdTdmNmVcdTRlMDBcdTkwZThcdTUyMDZcdTc2ODRcdTYzY2ZcdThmZjBcdTdiMjZcdTMwMDINCi1kZWVwQ29weV9wcm9tcHRNc2c9XHU2MGE4XHU1YzA2XHU4M2I3XHU1Zjk3XHU0ZWNlXHU3M2IwXHU1NzI4XHU4ZDc3XHU1YzA2XHU5NzAwXHU4OTgxXHU1MzU1XHU3MmVjXHU3ZWY0XHU2MmE0XHU3Njg0XHU2MjQwXHU2NzA5XHU1MmE4XHU2MDAxXHU5NGZlXHU2M2E1XHU1MTQzXHU3ZDIwXHU3Njg0XHU1MjZmXHU2NzJjXHUzMDAyXHU4OTgxXHU3ZWU3XHU3ZWVkXHU1NDE3XHVmZjFmDQotZGVlcENvcHlfdGl0bGU9XHU2ZGYxXHU1YzQyXHU1OTBkXHU1MjM2DQotDQotIyBQcm9ncmVzcyBtZXNzYWdlcw0KLWNyZWF0aW5nUHJvY2Vzc0NvbXBvbmVudFRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTUyMWJcdTVlZmFcdTZkNDFcdTdhMGJcdTdlYzRcdTRlZjZcdTIwMWN7MH1cdTIwMWQuLi4NCi1wcm9jZXNzaW5nUmVmZXJlbmNlc1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTU5MDRcdTc0MDZcdTVmMTVcdTc1MjguLi4NCi1kZWxldGluZ0VsZW1lbnRzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NTIyMFx1OTY2NFx1NTE0M1x1N2QyMFx1NTQ4Y1x1NTE3M1x1ODA1NFx1NzY4NFx1NjU4N1x1NGVmNi4uLg0KLWNoZWNraW5nUmVmZXJlbmNlc1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTY4YzBcdTY3ZTVcdTVmMTVcdTc1MjguLi4NCi1yZW1vdmluZ1JlZmVyZW5jZXN0YXNrX25hbWU9XHU2YjYzXHU1NzI4XHU5NjY0XHU1M2JiXHU1ZjE1XHU3NTI4Li4uDQotc2F2aW5nTW9kaWZpZWRGaWxlc1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTRmZGRcdTViNThcdTRmZWVcdTY1MzlcdTc2ODRcdTY1ODdcdTRlZjYuLi4NCi1jaGVja0FmZmVjdGVkUmVzb3VyY2VzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NjhjMFx1NjdlNVx1NTNkN1x1NWY3MVx1NTRjZFx1NzY4NFx1OGQ0NFx1NmU5MC4uLg0KLW1vdmluZ1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTc5ZmJcdTUyYTguLi4NCi1tb3ZpbmdGaWxlc1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTc5ZmJcdTUyYThcdTY1ODdcdTRlZjYuLi4NCi1jb3B5aW5nUmVzb3VyY2VzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NTkwZFx1NTIzNlx1OGQ0NFx1NmU5MC4uLg0KLWNvcHlpbmdBY3Rpdml0aWVzX21zZz1cdTZiNjNcdTU3MjhcdTU5MGRcdTUyMzZcdTZkM2JcdTUyYThcdTIwMWN7MH1cdTIwMWQNCi1zYXZpbmdGaWxlVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NGZkZFx1NWI1OFx1NjU4N1x1NGVmNlx1MjAxY3swfVx1MjAxZC4uLg0KLQ0KLSMgVUkgVGV4dA0KLWVsZW1lbnRfdGV4dD1cdTUxNDNcdTdkMjANCi1jcmVhdGVFbGVtZW50X3RleHQ9XHU1MjFiXHU1ZWZhXHU1MTQzXHU3ZDIwDQotY3JlYXRlUHJvY2Vzc190ZXh0PVx1NTIxYlx1NWVmYVx1NmQ0MVx1N2EwYg0KLWNvbnRyaWJ1dGVzVG9fdGV4dD1cdTYzZDBcdTRmOWJcdTUyMzANCi1sb2NhbENvbnRyaWJ1dGVzVG9fdGV4dD1cdTRlY2VcdTY3MmNcdTU3MzBcdTYzZDBcdTRmOWJcdTUyMzANCi1leHRlbmRzX3RleHQ9XHU2MjY5XHU1YzU1DQotcmVwbGFjZXNfdGV4dD1cdTY2ZmZcdTYzNjINCi1sb2NhbFJlcGxhY2VzX3RleHQ9XHU2NzJjXHU1NzMwXHU2NmZmXHU2MzYyDQotbG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5X3RleHQ9XHU2NzJjXHU1NzMwXHU2NmZmXHU2MzYyXHU1NDhjXHU2ZGYxXHU1YzQyXHU1OTBkXHU1MjM2DQotZWxlbWVudFR5cGVfdGV4dD17MH1cdWZmMWF7MX0NCi1kZWxpdmVyYWJsZXNfdGV4dD1cdTUzZWZcdTRlYTRcdTRlZDhcdTRlZjYNCi1jb250cmlidXRlVG9BY3Rpdml0eV90ZXh0PVx1NjNkMFx1NGY5Ylx1NTIzMFx1NmQzYlx1NTJhOA0KLUFjdGl2aXR5RHJvcENvbW1hbmRfbGFiZWw9XHU1ZTlmXHU1ZjAzXHU2ZDNiXHU1MmE4DQotcmVwbGFjZUFjdGl2aXR5X3RleHQ9XHU2NmZmXHU2MzYyXHU2ZDNiXHU1MmE4DQotZmlsZV90ZXh0PVx1NjU4N1x1NGVmNg0KLWRpcmVjdG9yeV90ZXh0PVx1NzZlZVx1NWY1NQ0KLXVucmVzb2x2ZWRfdGV4dD1cdWZmMDhcdTY3MmFcdTg5ZTNcdTY3OTBcdTc2ODRcdTIwMWN7MH1cdTIwMWRcdWZmMDkNCi1hc3Npc3RzX3RleHQ9XHU4Zjg1XHU1MmE5DQotdW5rbm93bl90ZXh0PVx1NjcyYVx1NzdlNQ0KLWNvbW1hbmRfZG9uZT1cdTViOGNcdTYyMTANCi0NCi0jIFRoZSBmb2xsb3dpbmcgVUkgdGV4dCBzaG91bGQgYmUgcmV2aWV3ZWQuDQotVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHl3aXRocGx1Z2luX2luZm89ezB9XHVmZjA4XHUyMDFjezN9XHUyMDFkXHU0ZTJkXHU3Njg0IHsxfVx1MjAxY3syfVx1MjAxZFx1ZmYwOQ0KLVV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5X2luZm89ezB9XHVmZjA4ezF9XHUyMDFjezJ9XHUyMDFkXHVmZjA5DQotdWlfcmVmX2RlbGV0ZT1cdTYzY2ZcdThmZjBcdTdiMjZcdTIwMWN7MH1cdTIwMWRcdTY3MDlcdTRlZTVcdTRlMGJcdTY3MmFcdTU3MjhcdTRlZmJcdTRmNTVcdTRmNGRcdTdmNmVcdTRmN2ZcdTc1MjhcdTc2ODRcdTVmMTVcdTc1MjhcdTMwMDJcblx1OGJmN1x1OTAwOVx1NjJlOVx1NWUwY1x1NjcxYlx1NTIyMFx1OTY2NFx1NzY4NFx1NWYxNVx1NzUyOFx1ZmYxYQ0KLXVpX3JlZl9kZWxldGUyPVx1NjVlMFx1NGVmYlx1NGY1NVx1NTczMFx1NjViOVx1NTcyOFx1NGY3Zlx1NzUyOFx1NGVlNVx1NGUwYlx1OGZkOVx1NGU5Ylx1NWYxNVx1NzUyOFx1MzAwMlxuXHU4YmY3XHU5MDA5XHU2MmU5XHU1ZTBjXHU2NzFiXHU1MjIwXHU5NjY0XHU3Njg0XHU1ZjE1XHU3NTI4XHVmZjFhDQotdWlfcmVmZXJlbmNlcz1cdTVmMTVcdTc1MjgNCi11aV93b3JrcHJvZHVjdF9kZXNjcmlwdG9yX2Rlc2NyaXB0aW9uPVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NjNjZlx1OGZmMFx1N2IyNlx1MjAxY3swfVx1MjAxZFx1NGUwZVx1NGVmYlx1NTJhMVx1NjNjZlx1OGZmMFx1N2IyNlx1MjAxY3sxfVx1MjAxZFx1NTE3M1x1ODA1NFx1ZmYwOFx1OGY5M1x1NTFmYVx1ODFlYVx1ZmYwOQ0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vcHRpb25zPVx1OTAwOVx1OTg3OQ0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vdXRwdXRsYWJlbD1cdTRmNWNcdTRlM2FcdTRlZmJcdTUyYTFcdTYzY2ZcdThmZjBcdTdiMjZcdTc2ODRcdThmOTNcdTUxZmFcdTk2NjRcdTUzYmJcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTYzY2ZcdThmZjBcdTdiMjYNCi11aV93b3JrcHJvZHVjdGRlc2NyaXB0b3JfZGVsZXRlX3Rhc2s9XHU0ZWNlXHU2ZDNiXHU1MmE4XHU1MjIwXHU5NjY0XHU0ZWZiXHU1MmExXHU2M2NmXHU4ZmYwXHU3YjI2DQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX2RlZmF1bHRjb25maWdjaGVjaz1cdTkwMDlcdTViOWFcdTc2ODRcdTUxNDNcdTdkMjBcdTIwMWN7MH1cdTIwMWRcdTRlMGRcdTU3MjhcdTZkNDFcdTdhMGJcdTc2ODRcdTdmM2FcdTc3MDFcdTkxNGRcdTdmNmVcdTRlMmRcdTMwMDJcblx1NjYyZlx1NTQyNlx1ODk4MVx1NWMwNlx1OGJlNVx1NTE0M1x1N2QyMFx1NTNjYVx1NTE3Nlx1NGY5ZFx1OGQ1Nlx1NTE3M1x1N2NmYlx1NmRmYlx1NTJhMFx1NTIzMFx1N2YzYVx1NzcwMVx1OTE0ZFx1N2Y2ZVx1ZmYxZg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9nZW5lcmljRXJyX21lc3NhZ2VfdGV4dD1cdTY0Y2RcdTRmNWNcdTRlMmRcdTUzZDFcdTc1MWZcdTk1MTlcdThiZWZcdTMwMDJcdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTIwMWRcdWZmMGNcdTgzYjdcdTUzZDZcdTY2ZjRcdTU5MWFcdTRmZTFcdTYwNmYNCi1Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uX25vRGVzY3JpcHRvclRvU3luY2g9XHU2NWUwXHU0ZWZiXHU0ZjU1XHU2M2NmXHU4ZmYwXHU3YjI2XHU1MzA1XHU1NDJiXHU4OTgxXHU1NDBjXHU2YjY1XHU3Njg0XHU5NGZlXHU2M2E1XHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwDQotdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfcmVmZXJzaGluZ3ZpZXdlcj1cdTUyMzdcdTY1YjBcdTY3ZTVcdTc3MGJcdTU2NjhcdTY1ZjZcdTUzZDFcdTc1MWZcdTk1MTlcdThiZWYNCi1jb25maXJtX3JlbW92ZV9yZWZlcmVuY2VzX3RleHQ9XHU4ZjZjXHU2MzYyXHU1NDBlXHVmZjBjXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHU0ZTJkXHU2MjQwXHU1MjE3XHU3Njg0XHU1MTQzXHU3ZDIwXHU1M2VmXHU4MGZkXHU2NzA5XHU1YmY5XHU2YjY0XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHU3Njg0XHU5NzVlXHU2Y2Q1XHU1ZjE1XHU3NTI4XHUzMDAyXHU1MzU1XHU1MWZiXHUyMDFjXHU3ODZlXHU1YjlhXHUyMDFkXHU5NjY0XHU1M2JiXHU4ZmQ5XHU0ZTliXHU1ZjE1XHU3NTI4XHU1ZTc2XHU3ZWU3XHU3ZWVkXHUzMDAyDQotdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfdW5oYW5kbGVkX2V4Y2VwdGlvbj1cdTY3MmFcdTU5MDRcdTc0MDZcdTc2ODRcdTVmMDJcdTVlMzgNCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX2JyZWFrZG93bl9lbGVtZW50PVx1NGUwZFx1ODBmZFx1NWMwNlx1NTQwY1x1NGUwMFx1NTIwNlx1ODllM1x1NTE0M1x1N2QyMFx1NTQwY1x1NjVmNlx1NGY1Y1x1NGUzYVx1NTE0OFx1ODg0Y1x1NGY1Y1x1NGUxYVx1NTQ4Y1x1NTQwZVx1N2VlZFx1NGY1Y1x1NGUxYQ0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93cGxpc3RkbGdfbXNnPVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1MjAxY3swfVx1MjAxZFx1NjYyZlx1NGVlNVx1NGUwYlx1NGVmYlx1NTJhMVx1NzY4NFx1OGY5M1x1NTFmYVx1MzAwMlxuXHU4YmY3XHU5MDA5XHU2MmU5XHU1ZTBjXHU2NzFiXHU1MjFiXHU1ZWZhXHU3NmY4XHU1ZTk0XHU2M2NmXHU4ZmYwXHU3YjI2XHU3Njg0XHU0ZWZiXHU1MmExXHUzMDAyDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3JvbGVsaXN0ZGxnX21zZz1cdTg5ZDJcdTgyNzJcdTIwMWN7MH1cdTIwMWRcdThkMWZcdThkMjNcdTRlZTVcdTRlMGJcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTMwMDJcblx1OGJmN1x1OTAwOVx1NjJlOVx1NWUwY1x1NjcxYlx1NTIxYlx1NWVmYVx1NzZmOFx1NWU5NFx1NjNjZlx1OGZmMFx1N2IyNlx1NzY4NFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1MzAwMg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX2ZhdGFsZXJyPVx1ODFmNFx1NTQ3ZFx1OTUxOVx1OGJlZg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93b3JrcHJvZHVjdHM9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9zdWJfZWxlbWVudD1cdTY1ZTBcdTZjZDVcdTVjMDZcdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjBcdTk0ZmVcdTYzYTVcdTUyMzBcdTViODNcdTc2ODRcdTRlMDBcdTRlMmFcdTViNTBcdTUxNDNcdTdkMjANCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl93cm9uZ19lbGVtZW50PVx1NjVlMFx1NmNkNVx1OTRmZVx1NjNhNVx1NTIzMFx1OTY2NFx1NWRlNVx1NGY1Y1x1NTIwNlx1ODllM1x1NTE0M1x1N2QyMFx1NGU0Ylx1NTkxNlx1NzY4NFx1NTE0M1x1N2QyMFx1MzAwMg0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX2NoaWxkX2VsZW1lbnQ9XHU2NWUwXHU2Y2Q1XHU1YzA2XHU1MjA2XHU4OWUzXHU1MTQzXHU3ZDIwXHU5NGZlXHU2M2E1XHU1MjMwXHU1YjgzXHU3Njg0XHU0ZTAwXHU0ZTJhXHU1YjUwXHU1MTQzXHU3ZDIwXHUzMDAyDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3Rhc2tzPVx1NGVmYlx1NTJhMQ0KLXVpX2Fzc29jaWF0aW9uX3Rhc2tfc2VsZWN0aW9uPVx1NGVmYlx1NTJhMVx1OTAwOVx1NjJlOS4uLg0KLXV0aWxfUHJvY2Vzc1V0aWxfY2hpbGRhZGFwdGVyPVwgXCBcdTViNTBcdTRlZTNcdTc2ODRcdTkwMDJcdTkxNGRcdTU2NjhcdWZmMWENCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zZXRwYXJlbnQ9XHU2NWUwXHU2Y2Q1XHU4YmJlXHU3ZjZlXHU1YjUwXHU0ZWUzXHU3Njg0XHU3MjM2XHU0ZWUzDQotdXRpbF90bmd1dGlsX2Nhbm5vdF9lZGl0X3Jlc291cmNlPVx1NjVlMFx1NmNkNVx1N2YxNlx1OGY5MVx1OGQ0NFx1NmU5MFx1MzAwMg0KLXV0aWxfUHJvY2Vzc1V0aWxfY29udHJpYnV0ZXN0bz1cdTYzZDBcdTRmOWJcdTUyMzBcdTIwMWN7MH1cdTIwMWQNCi11dGlsX1Byb2Nlc3NVdGlsX2xvY2FsQ29udHJpYnV0ZXN0bz1cdTY3MmNcdTU3MzBcdTYzZDBcdTRmOWJcdTUyMzBcdTIwMWN7MH1cdTIwMWQNCi1wcm9jZXNzX2V4dGVuZHM9XHU2MjY5XHU1YzU1XHUyMDFjezB9XHUyMDFkDQotcHJvY2Vzc19yZXBsYWNlcz1cdTY2ZmZcdTYzNjJcdTIwMWN7MH1cdTIwMWQNCi1wcm9jZXNzX2xvY2FsUmVwbGFjZXM9XHU2NzJjXHU1NzMwXHU2NmZmXHU2MzYyXHUyMDFjezB9XHUyMDFkDQotIyBGaWx0ZXIgY29uc3RhbnRzIGV4dGVybmFsaXplZCBzdHJpbmdzLg0KLUZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lc190ZXh0PVx1ODljNFx1N2EwYg0KLUZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lZ3JvdXBpbmdzX3RleHQ9XHU4OWM0XHU3YTBiXHU1MjA2XHU3ZWM0DQotRmlsdGVyQ29uc3RhbnRzX3doaXRlcGFwZXJzX3RleHQ9XHU3NjdkXHU3NmFlXHU0ZTY2DQotRmlsdGVyQ29uc3RhbnRzX3Rvb2xtZW50b3JzX3RleHQ9XHU1ZGU1XHU1MTc3XHU1NDExXHU1YmZjDQotRmlsdGVyQ29uc3RhbnRzX3Rvb2xzX3RleHQ9XHU1ZGU1XHU1MTc3DQotRmlsdGVyQ29uc3RhbnRzX3JvbGVzX3RleHQ9XHU4OWQyXHU4MjcyDQotRmlsdGVyQ29uc3RhbnRzX3Rhc2tzX3RleHQ9XHU0ZWZiXHU1MmExDQotRmlsdGVyQ29uc3RhbnRzX3JldXNhYmxlYXNzZXRzX3RleHQ9XHU1M2VmXHU5MWNkXHU3NTI4XHU4ZDQ0XHU0ZWE3DQotRmlsdGVyQ29uc3RhbnRzX2FsbF90ZXh0PVx1NTE2OFx1OTBlOA0KLUZpbHRlckNvbnN0YW50c19wcm9jZXNzZXNfdGV4dD1cdTZkNDFcdTdhMGINCi1GaWx0ZXJDb25zdGFudHNfcHJhY3RpY2VzX3RleHQ9XHU1YjllXHU4ZGY1DQotRmlsdGVyQ29uc3RhbnRzX3RlbXBsYXRlc190ZXh0PVx1NmEyMVx1Njc3Zg0KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHNfdGV4dD1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzENCi1GaWx0ZXJDb25zdGFudHNfY2hlY2tsaXN0c190ZXh0PVx1NjgzOFx1NWJmOVx1ODg2OA0KLUZpbHRlckNvbnN0YW50c19ndWlkZWxpbmVzX3RleHQ9XHU2MzA3XHU1MzU3DQotRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRzX3RleHQ9XHU4OWQyXHU4MjcyXHU5NmM2DQotRmlsdGVyQ29uc3RhbnRzX2d1aWRhbmNlX3RleHQ9XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmDQotRmlsdGVyQ29uc3RhbnRzX2NvbmNlcHRzX3RleHQ9XHU2OTgyXHU1ZmY1DQotRmlsdGVyQ29uc3RhbnRzX2V4YW1wbGVzX3RleHQ9XHU3OTNhXHU0ZjhiDQotRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRwYWNrYWdlc190ZXh0PVx1NTE4NVx1NWJiOVx1NTMwNQ0KLUZpbHRlckNvbnN0YW50c19yb2xlZGVzY3JpcHRvcnNfdGV4dD1cdTg5ZDJcdTgyNzJcdTYzY2ZcdThmZjBcdTdiMjYNCi1GaWx0ZXJDb25zdGFudHNfcm9sZXNldGdyb3B1aW5nc190ZXh0PVx1ODlkMlx1ODI3Mlx1OTZjNlx1NTIwNlx1N2VjNA0KLUZpbHRlckNvbnN0YW50c190YXNrZGVzY3JpcHRvcnNfdGV4dD1cdTRlZmJcdTUyYTFcdTYzY2ZcdThmZjBcdTdiMjYNCi1GaWx0ZXJDb25zdGFudHNfY29udGVudGVsZW1lbnRzX3RleHQ9XHU1MTg1XHU1YmI5XHU1MTQzXHU3ZDIwDQotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9wcmVwYXJlPVx1NmI2M1x1NTcyOFx1NTFjNlx1NTkwN1x1NTQwY1x1NmI2NS4uLg0KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdGRlc2NyaXB0b3JzX3RleHQ9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU2M2NmXHU4ZmYwXHU3YjI2DQotRmlsdGVyQ29uc3RhbnRzX2FsbGNvbnRlbnRlbGVtZW50c190ZXh0PVx1NjI0MFx1NjcwOVx1NTE4NVx1NWJiOVx1NTE0M1x1N2QyMA0KLUZpbHRlckNvbnN0YW50c19zdXBwb3J0aW5nbWF0ZXJpYWxzX3RleHQ9XHU2NTJmXHU2MzAxXHU2NzUwXHU2NTk5DQotTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfZXJyb3JTYXZpbmdGaWxlcz1cdTRmZGRcdTViNThcdTY1ODdcdTRlZjZcdTUxZmFcdTk1MTkNCi1GaWx0ZXJDb25zdGFudHNfY3VzdG9tY2F0ZWdvcmllc190ZXh0PVx1NWI5YVx1NTIzNlx1N2M3Ylx1NTIyYg0KLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHR5cGVzX3RleHQ9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU3YzdiXHU1NzhiDQotRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRfd2FybmluZ01zZz1cdTUyMjBcdTk2NjRcdTViOGNcdTYyMTBcdWZmMGNcdTRmNDZcdTVlMjZcdTY3MDlcdThiNjZcdTU0NGFcdTMwMDINCi1GaWx0ZXJDb25zdGFudHNfbWV0aG9kcGx1Z2luc190ZXh0PVx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNg0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9sb2NrZWRQbHVnaW49SVVQTDAxMjBFOiBcdTYzZDJcdTRlZjZcdTIwMWN7MH1cdTIwMWRcdTVkZjJcdTk1MDFcdTViOWFcdTMwMDINCi1GaWx0ZXJDb25zdGFudHNfZG9tYWluc190ZXh0PVx1NTdkZg0KLUZpbHRlckNvbnN0YW50c19yb2FkbWFwX3RleHQ9XHU4ZGVmXHU3ZWJmXHU1NmZlDQotRmlsdGVyQ29uc3RhbnRzX3JlcG9ydHNfdGV4dD1cdTYyYTVcdTU0NGENCi1BdXRvU3luY2hyb25pemVDb21tYW5kX2xhYmVsPVx1NGVjZVx1NjViOVx1NmNkNVx1NTE4NVx1NWJiOVx1N2YzYVx1NzcwMVx1NTQwY1x1NmI2NSgmWSkNCi1NYW51YWxTeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWw9XHU1YjlhXHU1MjM2XHU1NDBjXHU2YjY1KCZaKS4uLg0KLUF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfc3VjZXNzZnVsPVx1NTQwY1x1NmI2NVx1NWRmMlx1NjIxMFx1NTI5Zlx1NWI4Y1x1NjIxMFx1MzAwMg0KLQ0KLSMgVXNlckludGVyYWN0aW9uSGVscGVyDQotVXNlckludGVyYWN0aW9uSGVscGVyX1Byb2Nlc3NQYWNrYWdlX05hbWU9XHU1NDBkXHU3OWYwXHVmZjFhDQotDQotIyBNZXRob2RDcmVhdGVDaGlsZENvbW1hbmQNCi1uZXdFbGVtZW50X3RleHQ9XHU2NWIwXHU1ZWZhIHswfQ0KLXVwZGF0ZV9vdXRvZnN5bmNoX3RpdGxlPVx1NjZmNFx1NjViMFx1NTFiMlx1N2E4MQ0KLXVwZGF0ZV9vdXRvZnN5bmNoX21zZz1cdTVkZjJcdTU3MjhcdTY1ODdcdTRlZjZcdTdjZmJcdTdlZGZcdTRlMGFcdTY2ZjRcdTY1MzlcdTRlODZcdTY1ODdcdTRlZjZcdTMwMDJcdTg5ODFcdTg5ODZcdTc2ZDZcdTY2ZjRcdTY1MzlcdTU0MTdcdWZmMWYNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDkwODMxZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgR2VuZXJpYyBEaWFsb2cgVGl0bGVzDQotbW92ZURpYWxvZ190aXRsZT1cdTc5ZmJcdTUyZDUNCi1kZWxldGVEaWFsb2dfdGl0bGU9XHU1MjJhXHU5NjY0XHU1MTQzXHU3ZDIwDQotZXJyb3JEaWFsb2dfdGl0bGU9XHU5MzJmXHU4YWE0DQotZXJyb3JEaWFsb2dfY2Fubm90UmVuYW1lPXswfSAnJ3sxfScnIFx1NzEyMVx1NmNkNVx1OTFjZFx1NjViMFx1NTQ3ZFx1NTQwZFx1NzBiYSAnJ3syfScnXHUzMDAyXHU4YWNiXHU4OWUzXHU2YzdhXHUzMDBjXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5XHUzMDBkXHU0ZTJkXHU5ODZmXHU3OTNhXHU3Njg0XHU1NTRmXHU5ODRjXHVmZjBjXHU1MThkXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU3OGJhXHU1YjlhXHUzMDBkXHU3ZTdjXHU3ZThjXHVmZjBjXHU2MjE2XHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU1M2Q2XHU2ZDg4XHUzMDBkXHU0ZTJkXHU2YjYyXHU5MDE5XHU5ODA1XHU0ZjVjXHU2OTZkXHUzMDAyDQotDQotIyBDb25maXJtIFJlZmVyZW5jZXMgUmVtb3ZhbCBEaWFsb2cNCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RpdGxlPVx1NzhiYVx1OGE4ZFx1NTNjM1x1NzE2N1x1NzlmYlx1OTY2NA0KLWRlbGV0ZVJlZmVyZW5jZXNEaWFsb2dfdGV4dD1cdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTRlMmRcdTY3MDlcdTUxNzZcdTRlZDZcdTUxNDNcdTdkMjBcdTRlY2RcdTU3MjhcdTUzYzNcdTcxNjdcdTYwYThcdTVjMDdcdTg5ODFcdTUyMmFcdTk2NjRcdTc2ODRcdTUxNDNcdTdkMjBcdTMwMDJcdTUyMmFcdTk2NjRcdTkwMTlcdTRlOWJcdTUxNDNcdTdkMjBcdTVjMDdcdTc5ZmJcdTk2NjRcdTUzYzNcdTcxNjdcdWZmMGNcdTU2ZTBcdTZiNjRcdWZmMGNcdTRlNWZcdTVjMDdcdTY2ZjRcdTY1YjBcdTkwMTlcdTRlOWJcdTUzYzNcdTcxNjdcdTUxNDNcdTdkMjBcdTMwMDJcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdTc4YmFcdTViOWFcdTMwMGRcdTRlNGJcdTUyNGRcdWZmMGNcdThhY2JcdTc4YmFcdTViOWFcdTYwYThcdTY3MDlcdTZiMGFcdTk2NTBcdTY2ZjRcdTY1YjBcdTkwMTlcdTRlOWJcdTUzYzNcdTcxNjdcdTUxNDNcdTdkMjBcdTMwMDJcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTMwMGRcdWZmMGNcdTg5MDdcdTY3ZTVcdTUxNDNcdTdkMjBcdTZlMDVcdTU1YWVcdWZmMGNcdTkwMTlcdTRlOWJcdTUxNDNcdTdkMjBcdTUzYzNcdTcxNjdcdTYwYThcdTVjMDdcdTg5ODFcdTUyMmFcdTk2NjRcdTc2ODRcdTUxNDNcdTdkMjBcdTMwMDINCi0NCi0jIFJlc29sdmUgTmFtZSBDb25mbGljdCBEaWFsb2cNCi1yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RpdGxlPVx1ODllM1x1NmM3YVx1NTE0M1x1N2QyMFx1NTQwZFx1N2EzMVx1ODg1ZFx1N2E4MQ0KLXJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGV4dD1cdTcwYmEgJyd7MX0nJyBcdThmMzhcdTUxNjVcdTY1YjBcdTc2ODQgezB9XHVmZjFhDQotDQotIyBTZWxlY3QgRGVsaXZlcmFibGVzIERpYWxvZw0KLXNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190aXRsZT1cdTkwNzhcdTUzZDZcdTRlYTRcdTRlZDhcdTk4MDVcdTc2ZWUNCi1zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGV4dD1cdTkwNzhcdTUzZDZcdTYwYThcdTg5ODFcdTYzMDdcdTViOWFcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWMgJyd7MH0nJyBcdTc2ODRcdTRlYTRcdTRlZDhcdTk4MDVcdTc2ZWVcdTMwMDINCi0NCi0jIE5ldyBQcm9jZXNzIENvbXBvbmVudCBEaWFsb2cNCi1uZXdQcm9jZXNzQ29tcG9uZW50RGlhbG9nX3RpdGxlPVx1NjViMFx1NWVmYVx1N2EwYlx1NWU4Zlx1NTE0M1x1NGVmNg0KLW5hbWVMYWJlbF90ZXh0PVx1NTQwZFx1N2EzMVx1ZmYxYQ0KLWRlZmF1bHRDb25maWdMYWJlbF90ZXh0PVx1OTgxMFx1OGEyZFx1OTE0ZFx1N2Y2ZVx1ZmYxYQ0KLWJhc2VQcm9jZXNzTGFiZWxfdGV4dD1cdTU3ZmFcdTY3MmNcdTdhMGJcdTVlOGZcdWZmMWENCi1iYXNlZE9uUHJvY2Vzc2VzTGFiZWxfdGV4dD1cdTU3ZmFcdTY1YmNcdTdhMGJcdTVlOGZcdWZmMWENCi0NCi0jIFJvbGUgQXNzb2NpYXRpb24gRGlhbG9nDQotc2VsZWN0QXNzb2NpYXRpb25MYWJlbF90ZXh0PVx1OTA3OFx1NTNkNlx1NGY1Y1x1Njk2ZCAnJ3swfScnIFx1NzY4NFx1OTVkY1x1ODA2Zg0KLQ0KLSMgUmVtb3ZlIEFzc29jaWF0aW9uIGRpYWxvZw0KLXJlbW92ZUFzc29jaWF0aW9uRGlhbG9nX3RleHQ9XHU3OWZiXHU5NjY0XHU5NWRjXHU4MDZmDQotDQotIyBTZWxlY3QgVGVhbXMgRGlhbG9nDQotc2VsZWN0VGVhbXNEaWFsb2dfdGl0bGU9XHU5MDc4XHU1M2Q2XHU1NzE4XHU5NjhhDQotc2VsZWN0VGVhbXNEaWFsb2dfdGV4dD1cdTkwNzhcdTUzZDZcdTYwYThcdTg5ODFcdTYzMDdcdTViOWFcdTg5ZDJcdTgyNzIgJyd7MH0nJyBcdTc2ODRcdTU3MThcdTk2OGFcdTMwMDINCi0NCi0jIFRhc2wgU2VsZWN0aW9uIERpYWxvZw0KLXRhc2tTZWxlY3Rpb25EaWFsb2dfdGl0bGU9XHU0ZjVjXHU2OTZkXHU5MDc4XHU2NGM3DQotdGl0bGVMYWJlbF90ZXh0PVx1OTA3OFx1NTNkNlx1NGY1Y1x1Njk2ZFx1MzAwMg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEwwMTAwRTogXHU5MDdhXHU2ZjBmezB9XHU1NDBkXHU3YTMxXHUzMDAyXG5cblx1NjI0MFx1NjcwOVx1NjViOVx1NmNkNVx1NTQ4Y1x1N2EwYlx1NWU4Zlx1NTE0M1x1N2QyMFx1OTBmZFx1NWZjNVx1OTgwOFx1NjcwOVx1NTQwZFx1N2EzMVx1MzAwMlxuXG5cdThhY2JcdThmMzhcdTUxNjVcdTY3MDlcdTY1NDhcdTc2ODRcdTU0MGRcdTdhMzFcdWZmMGNcdTcxMzZcdTVmOGNcdTUxOGRcdThhNjZcdTRlMDBcdTZiMjFcdTMwMDINCi1lbXB0eUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZz1cdTU0MGRcdTdhMzFcdTRlMGRcdTgwZmRcdTdhN2FcdTc2N2RcdTMwMDJcdThhY2JcdTYzMDdcdTViOWFcdTY3MDlcdTY1NDhcdTc2ODRcdTU0MGRcdTdhMzFcdTMwMDINCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZz1JVVBMMDEwMUU6IFx1NTQwZFx1N2EzMSAnJ3swfScnIFx1NWRmMlx1NWI1OFx1NTcyOFx1MzAwMlxuXG5cdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTVmYzVcdTk4MDhcdTY3MDlcdTU1MmZcdTRlMDBcdTU0MGRcdTdhMzFcdTMwMDJcblxuXHU4YWNiXHU4ZjM4XHU1MTY1XHU0ZTBkXHU1NDBjXHU1NDBkXHU3YTMxXHVmZjBjXHU3MTM2XHU1ZjhjXHU1MThkXHU4YTY2XHU0ZTAwXHU2YjIxXHUzMDAyDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnPVx1NzZmOFx1NTQwY1x1NzY4NFx1NTE0M1x1N2QyMFx1NTQwZFx1N2EzMVx1NWRmMlx1NWI1OFx1NTcyOFx1MzAwMlx1OGFjYlx1NjMwN1x1NWI5YVx1NTNlNlx1NGUwMFx1NTAwYlx1NTQwZFx1N2EzMVx1MzAwMg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMV9tc2c9SVVQTDAxMDJFOiBcdTU0MGRcdTdhMzEgJyd7MH0nJyBcdTcxMjFcdTY1NDhcdTMwMDJcblxuXHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU1NDBkXHU3YTMxXHU0ZTBkXHU4MGZkXHU0ZWU1XHU3YTdhXHU2ODNjXHU1MDVhXHU3MGJhXHU5NThiXHU5ODJkXHUzMDAyXG5cblx1OGFjYlx1OGYzOFx1NTE2NVx1NjcwOVx1NjU0OFx1NzY4NFx1NTQwZFx1N2EzMVx1ZmYwY1x1NzEzNlx1NWY4Y1x1NTE4ZFx1OGE2Nlx1NGUwMFx1NmIyMVx1MzAwMg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMl9tc2c9SVVQTDAxMDNFOiBcdTU0MGRcdTdhMzEgJyd7MH0nJyBcdTcxMjFcdTY1NDhcdTMwMDJcblxuXHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU1NDBkXHU3YTMxXHU0ZTBkXHU4MGZkXHU0ZWU1XHU1M2U1XHU5ZWRlXHU1MDVhXHU3MGJhXHU3ZDUwXHU1YzNlXHUzMDAyXG5cblx1OGFjYlx1OGYzOFx1NTE2NVx1NjcwOVx1NjU0OFx1NzY4NFx1NTQwZFx1N2EzMVx1ZmYwY1x1NzEzNlx1NWY4Y1x1NTE4ZFx1OGE2Nlx1NGUwMFx1NmIyMVx1MzAwMg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yM19tc2c9SVVQTDAxMDRFOiBcdTU0MGRcdTdhMzEgJyd7MH0nJyBcdTcxMjFcdTY1NDhcdTMwMDJcblxuXHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU1NDBkXHU3YTMxXHU0ZTBkXHU4MGZkXHU1MzA1XHU1NDJiXHU5MDE5XHU0ZTliXHU1YjU3XHU1MTQzXHVmZjFhXFwgLyA6ICogPyAiIDwgPiA7IHxcblxuXHU4YWNiXHU4ZjM4XHU1MTY1XHU2NzA5XHU2NTQ4XHU3Njg0XHU1NDBkXHU3YTMxXHVmZjBjXHU3MTM2XHU1ZjhjXHU1MThkXHU4YTY2XHU0ZTAwXHU2YjIxXHUzMDAyDQotbm9Db25maWdFcnJvcl9tc2c9SVVQTDAxMDVFOiBcdTczZmVcdTg4NGNcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTRlMGRcdTU0MmJcdTRlZmJcdTRmNTVcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTMwMDJcblxuXHU5NzAwXHU4OTgxXHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlXHU2MjRkXHU4MGZkXHU1ZWZhXHU3YWNiXHU2NWIwXHU3Njg0XHU3YTBiXHU1ZThmXHUzMDAyXG5cblx1OGFjYlx1NWVmYVx1N2FjYlx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1ZmYwY1x1NzEzNlx1NWY4Y1x1NTE4ZFx1OGE2Nlx1NGUwMFx1NmIyMVx1MzAwMg0KLW5vRGVsaXZlcnlQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA2RTogXHU3M2ZlXHU4ODRjXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU0ZTBkXHU1NDJiXHU0ZWZiXHU0ZjU1XHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiXHUzMDAyXG5cblx1OTcwMFx1ODk4MVx1NTdmYVx1NjcyY1x1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYlx1NjI0ZFx1ODBmZFx1NWVmYVx1N2FjYlx1NjViMFx1NzY4NFx1N2EwYlx1NWU4Zlx1OTY0NFx1NTJhMFx1ODk4MVx1N2QyMFx1MzAwMlxuXG5cdThhY2JcdTVlZmFcdTdhY2JcdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGJcdWZmMGNcdTcxMzZcdTVmOGNcdTUxOGRcdThhNjZcdTRlMDBcdTZiMjFcdTMwMDINCi1ub0RlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQTDAxMDdFOiBcdTY3MmFcdTkwNzhcdTUzZDZcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTMwMDJcblxuXHU1ZmM1XHU5ODA4XHU2MzA3XHU1YjlhXHU5ODEwXHU4YTJkXHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlXHU3ZDY2XHU2NWIwXHU3Njg0XHU3YTBiXHU1ZThmXHUzMDAyXG5cblx1OGFjYlx1OTA3OFx1NTNkNlx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1ZmYwY1x1NzEzNlx1NWY4Y1x1NTE4ZFx1OGE2Nlx1NGUwMFx1NmIyMVx1MzAwMg0KLW5vQmFzZVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDhFOiBcdTY3MmFcdTkwNzhcdTUzZDZcdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGJcdTMwMDJcblxuXHU3YTBiXHU1ZThmXHU5NjQ0XHU1MmEwXHU4OTgxXHU3ZDIwXHU5NzAwXHU4OTgxXHU1N2ZhXHU2NzJjXHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiXHUzMDAyXG5cblx1OGFjYlx1OTA3OFx1NTNkNlx1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYlx1ZmYwY1x1NzEzNlx1NWY4Y1x1NTE4ZFx1OGE2Nlx1NGUwMFx1NmIyMVx1MzAwMg0KLWNyZWF0ZVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDlFOiBcdTcxMjFcdTZjZDVcdTk4MDZcdTUyMjlcdTVlZmFcdTdhY2JcdTdhMGJcdTVlOGZcdTMwMDINCi1jcmVhdGVFbGVtZW50RXJyb3JfbXNnPUlVUEwwMTEwRTogXHU3MTIxXHU2Y2Q1XHU5ODA2XHU1MjI5XHU1ZWZhXHU3YWNiXHU1MTQzXHU3ZDIwXHUzMDAyDQotZGVsZXRlRWxlbWVudEVycm9yX21zZz1JVVBMMDExMUU6IFx1NzEyMVx1NmNkNVx1OTgwNlx1NTIyOVx1NTIyYVx1OTY2NFx1NTE0M1x1N2QyMFx1MzAwMg0KLWR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3JfbXNnPUlVUEwwMTEyRTogXHU3MTIxXHU2Y2Q1XHU1ZWZhXHU3YWNiXHU1MTQzXHU3ZDIwXHU3Njg0XHU1MTY3XHU1YmI5XHU2YTk0XHU2ODQ4XHUzMDAyXG5cblx1NmE5NFx1Njg0OCAnJ3swfScnIFx1NWRmMlx1NWI1OFx1NTcyOFx1MzAwMlxuXG5cdThhY2JcdThmMzhcdTUxNjVcdTRlMGRcdTU0MGNcdTU0MGRcdTdhMzFcdWZmMGNcdTcxMzZcdTVmOGNcdTUxOGRcdThhNjZcdTRlMDBcdTZiMjFcdTMwMDINCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX3NpbXBsZV9tc2c9XHU3NmY4XHU1NDBjXHU1NDBkXHU3YTMxXHU3Njg0XHU1MTY3XHU1YmI5XHU2YTk0XHU2ODQ4XHU1ZGYyXHU1YjU4XHU1NzI4XHUzMDAyXHU4YWNiXHU2MzA3XHU1YjlhXHU1M2U2XHU0ZTAwXHU1MDBiXHU1NDBkXHU3YTMxXHUzMDAyDQotdW5kb0NvbW1hbmRFcnJvcl9tc2c9SVVQTDAxMTNFOiBcdTcxMjFcdTZjZDVcdTViOGNcdTYyMTBcdTVmYTlcdTUzOWZcdTYzMDdcdTRlZTQgJyd7MH0nJ1x1MzAwMlxuXG5cdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdWZmMWF7MX0NCi1pbnZhbGlkUHJlZGVjZXNzb3JFcnJvcl9tc2c9SVVQTDAxMTRFOiBcdTYzMDdcdTViOWFcdTc2ODRcdTUyNGRcdTRlMDBcdTcyNDhcdTdkMjJcdTVmMTVcdTcxMjFcdTY1NDhcdTMwMDJcblxuXHU1MjRkXHU0ZTAwXHU3MjQ4XHU3ZDIyXHU1ZjE1XHU1ZmM1XHU5ODA4XHU2NjJmICdJbmRleCcgXHU3NmY0XHU2YjA0XHU0ZTJkXHU3Njg0XHU2NTc0XHU2NTc4XHU1MDNjXHUzMDAyXG5cblx1OGFjYlx1NjMwN1x1NWI5YVx1NjcwOVx1NjU0OFx1NzY4NFx1NTAzY1x1ZmYwY1x1NzEzNlx1NWY4Y1x1NTE4ZFx1OGE2Nlx1NGUwMFx1NmIyMVx1MzAwMg0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHM9SVVQTDAxMDBXOiAnJ3swfScnIFx1ODIwNyAnJ3sxfScnIFx1NWRmMlx1NjcwOVx1OTVkY1x1ODA2Zlx1MzAwMlx1NTNlYVx1NWJiOVx1OGEzMVx1NGUwMFx1NTAwYlx1OTAxOVx1N2EyZVx1OTVkY1x1ODA2Zlx1MzAwMlx1ODJlNVx1ODk4MVx1NWMwNyAnJ3swfScnIFx1NjMwN1x1NWI5YVx1ODFmMyAnJ3syfScnXHVmZjBjXHU1ZmM1XHU5ODA4XHU1MTQ4XHU1ZjllICcnezF9JycgXHU0ZTJkXHU3OWZiXHU5NjY0XHUzMDAyDQotZXJyb3JfbXNnV2l0aERldGFpbHM9SVVQTDAxMTZFOiBcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdTMwMDJcdTU5ODJcdTk3MDBcdTc2ZjhcdTk1ZGNcdThjYzdcdThhMGFcdWZmMGNcdThhY2JcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTMwMGRcdTMwMDINCi1lcnJvcl9tc2c9SVVQTDAxMTdFOiBcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdTMwMDJcdTU5ODJcdTk3MDBcdThhNzNcdTdkMzBcdThjYzdcdThhMGFcdWZmMGNcdThhY2JcdTUzYzNcdTk1YjFcdTkzMmZcdThhYTRcdTY1ZTVcdThhOGNcdTMwMDINCi1TdXBwcmVzc2lvbl9uYW1lRHVwbGljYXRpb249SVVQTDAxMThFOiBcdTU3MjhcdTZiNjRcdTY0Y2RcdTRmNWNcdTRlNGJcdTVmOGNcdTY3MDNcdTc2N2NcdTc1MWZcdTU0MGRcdTdhMzFcdTg4NWRcdTdhODFcdTMwMDJcdTZhYTJcdTY3ZTVcdTUxNDNcdTdkMjBcdTc2ODRcdTU0MGRcdTdhMzFcdTY2MmZcdTU0MjZcdTkxY2RcdTg5MDdcdWZmMGNcdTcxMzZcdTVmOGNcdTUxOGRcdThhNjZcdTRlMDBcdTZiMjENCi1TdXBwcmVzc2lvbl9wcmVzZW50YXRpb25OYW1lRHVwbGljYXRpb249SVVQTDAxMTlFOiBcdTU3MjhcdTZiNjRcdTY0Y2RcdTRmNWNcdTRlNGJcdTVmOGNcdTY3MDNcdTc2N2NcdTc1MWZcdTU0MGRcdTdhMzFcdTg4NWRcdTdhODFcdTMwMDJcdTZhYTJcdTY3ZTVcdTUxNDNcdTdkMjBcdTc2ODRcdTU0NDhcdTczZmVcdTU0MGRcdTdhMzFcdTY2MmZcdTU0MjZcdTkxY2RcdTg5MDdcdWZmMGNcdTcxMzZcdTVmOGNcdTUxOGRcdThhNjZcdTRlMDBcdTZiMjENCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249XHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0XHUzMDAyXHU1OTgyXHU5NzAwXHU3NmY4XHU5NWRjXHU4Y2M3XHU4YTBhXHVmZjBjXHU4YWNiXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5XHUzMDBkXHUzMDAyDQotc2F2ZVByb2Nlc3NFcnJvcl9yZWFzb249XHU1MTMyXHU1YjU4XHU3YTBiXHU1ZThmICcnezB9JycgXHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0XHUzMDAyXHU1OTgyXHU5NzAwXHU3NmY4XHU5NWRjXHU4Y2M3XHU4YTBhXHVmZjBjXHU4YWNiXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5XHUzMDBkXHUzMDAyDQotZGVsZXRlUmVmZXJlbmNlc0Vycm9yX3JlYXNvbj1cdTc5ZmJcdTk2NjRcdTZiNjRcdTUxNDNcdTdkMjBcdTc2ZjhcdTk1ZGNcdTc2ODRcdTUzYzNcdTcxNjdcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdTMwMDJcdTU5ODJcdTk3MDBcdTc2ZjhcdTk1ZGNcdThjYzdcdThhMGFcdWZmMGNcdThhY2JcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTMwMGRcdTMwMDINCi1zYXZlRmlsZUVycm9yX3JlYXNvbj1cdTUxMzJcdTViNThcdTZhOTRcdTY4NDggJyd7MH0nJyBcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdTMwMDJcdTU5ODJcdTk3MDBcdTc2ZjhcdTk1ZGNcdThjYzdcdThhMGFcdWZmMGNcdThhY2JcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTMwMGRcdTMwMDINCi1pbnZhbGlkUmVmZXJlbmNlc0Vycm9yX3JlYXNvbj1cdThkZThcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGZcdTg5MDdcdTg4ZmRcdTc2ODRcdTdkNTBcdTY3OWNcdTUwNzVcdTZlMmNcdTUyMzBcdTUxNzdcdTY3MDlcdTcxMjFcdTY1NDhcdTUzYzNcdTcxNjdcdTc2ODRcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTMwMDJcblx1NWMwN1x1NzlmYlx1OTY2NFx1OTAxOVx1NGU5Ylx1NTNjM1x1NzE2N1x1MzAwMlx1ODk4MVx1N2U3Y1x1N2U4Y1x1NTVjZVx1ZmYxZg0KLXVucmVzb2x2ZWRPYmplY3RFcnJvcl9yZWFzb249XHU3MTIxXHU2Y2Q1XHU0ZmVlXHU2NTM5XHU2NzJhXHU4OWUzXHU2NzkwXHU3Njg0XHU3MjY5XHU0ZWY2XHVmZjFhezB9KFVSSSA9IHsxfSl7Mn0NCi0NCi0jIFdhcm5pbmcgbWVzc2FnZXMNCi1NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c9SVVQTDAxMThXOiBcdTYyN2VcdTRlMGRcdTUyMzBcdTRlMDBcdTYyMTZcdTU5MWFcdTUwMGJcdTRmODZcdTZlOTBcdTUxNDNcdTdkMjBcdTMwMDJcdTVjMDdcdTRlMGRcdTY3MDNcdTg5MDdcdTg4ZmRcdThjYzdcdTZlOTBcdThjYzdcdTY1OTlcdTU5M2VcdTRlMmRcdTc2ODRcdTc2ZjhcdTk1ZGNcdTZhOTRcdTY4NDhcdTMwMDINCi1BY3Rpdml0eUFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE5VzogXHU2MjdlXHU0ZTBkXHU1MjMwXHU0ZTAwXHU2MjE2XHU1OTFhXHU1MDBiXHU0Zjg2XHU2ZTkwXHU1MTQzXHU3ZDIwXHUzMDAyXHU1YzA3XHU0ZTBkXHU2NzAzXHU4OTA3XHU4OGZkXHU3NmY4XHU5NWRjXHU3Njg0XHUzMDBjXHU2ZDQxXHU3YTBiXHU1OTU3XHU0ZWY2XHUzMDBkXHUzMDAyDQotQWN0aXZpdHlEcm9wQ29tbWFuZF9kZWVwQ29weV9wcm9tcHRDb25maWd1cmF0aW9uTXNnPVx1ODk4MVx1ODkwN1x1ODhmZFx1NjI0MFx1NjcwOVx1NjNjZlx1OGZmMFx1NWI1MFx1NTVjZVx1ZmYxZlxuXG5cdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdTU0MjZcdTMwMGRcdTUzZWFcdTY3MDNcdTg5MDdcdTg4ZmRcdTczZmVcdTg4NGNcdTkxNGRcdTdmNmVcdTRlMmRcdTc2ODRcdTYzY2ZcdThmZjBcdTViNTBcdTMwMDINCi1kZWVwQ29weV9wcm9tcHRNc2c9XHU2MGE4XHU1YzA3XHU1M2Q2XHU1Zjk3XHU1ZjllXHU3M2ZlXHU1NzI4XHU5NThiXHU1OWNiXHU4OTgxXHU1MjA2XHU5NThiXHU3ZGFkXHU4Yjc3XHU3Njg0XHU2MjQwXHU2NzA5XHU1MmQ1XHU2MTRiXHU5MDIzXHU3ZDUwXHU1MTQzXHU3ZDIwXHU3Njg0XHU4OTA3XHU2NzJjXHUzMDAyXHU4OTgxXHU3ZTdjXHU3ZThjXHU1NWNlXHVmZjFmDQotZGVlcENvcHlfdGl0bGU9XHU2ZGYxXHU1YzY0XHU4OTA3XHU4OGZkDQotDQotIyBQcm9ncmVzcyBtZXNzYWdlcw0KLWNyZWF0aW5nUHJvY2Vzc0NvbXBvbmVudFRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTVlZmFcdTdhY2JcdTdhMGJcdTVlOGZcdTUxNDNcdTRlZjYgJyd7MH0nJy4uLg0KLXByb2Nlc3NpbmdSZWZlcmVuY2VzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1ODY1NVx1NzQwNlx1NTNjM1x1NzE2Ny4uLg0KLWRlbGV0aW5nRWxlbWVudHNUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU1MjJhXHU5NjY0XHU1MTQzXHU3ZDIwXHU1M2NhXHU3NmY4XHU5NWRjXHU2YTk0XHU2ODQ4Li4uDQotY2hlY2tpbmdSZWZlcmVuY2VzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NmFhMlx1NjdlNVx1NTNjM1x1NzE2Ny4uLg0KLXJlbW92aW5nUmVmZXJlbmNlc3Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTc5ZmJcdTk2NjRcdTUzYzNcdTcxNjcuLi4NCi1zYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NTEzMlx1NWI1OFx1NWRmMlx1NGZlZVx1NjUzOVx1NzY4NFx1NmE5NFx1Njg0OC4uLg0KLWNoZWNrQWZmZWN0ZWRSZXNvdXJjZXNUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU2YWEyXHU2N2U1XHU1M2Q3XHU1ZjcxXHU5N2ZmXHU3Njg0XHU4Y2M3XHU2ZTkwLi4uDQotbW92aW5nVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NzlmYlx1NTJkNS4uLg0KLW1vdmluZ0ZpbGVzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NzlmYlx1NTJkNVx1NmE5NFx1Njg0OC4uLg0KLWNvcHlpbmdSZXNvdXJjZXNUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU4OTA3XHU4OGZkXHU4Y2M3XHU2ZTkwLi4uDQotY29weWluZ0FjdGl2aXRpZXNfbXNnPVx1NmI2M1x1NTcyOFx1ODkwN1x1ODhmZFx1NmQzYlx1NTJkNSAnJ3swfScnDQotc2F2aW5nRmlsZVRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTUxMzJcdTViNThcdTZhOTRcdTY4NDggJyd7MH0nJy4uLg0KLQ0KLSMgVUkgVGV4dA0KLWVsZW1lbnRfdGV4dD1cdTUxNDNcdTdkMjANCi1jcmVhdGVFbGVtZW50X3RleHQ9XHU1ZWZhXHU3YWNiXHU1MTQzXHU3ZDIwDQotY3JlYXRlUHJvY2Vzc190ZXh0PVx1NWVmYVx1N2FjYlx1N2EwYlx1NWU4Zg0KLWNvbnRyaWJ1dGVzVG9fdGV4dD1cdTYzZDBcdTUxZmFcdTgxZjMNCi1sb2NhbENvbnRyaWJ1dGVzVG9fdGV4dD1cdTU3MjhcdTY3MmNcdTdhZWZcdTYzZDBcdTUxZmFcdTgxZjMNCi1leHRlbmRzX3RleHQ9XHU1ZWY2XHU0ZjM4DQotcmVwbGFjZXNfdGV4dD1cdTUzZDZcdTRlZTMNCi1sb2NhbFJlcGxhY2VzX3RleHQ9XHU1NzI4XHU2NzJjXHU3YWVmXHU1M2Q2XHU0ZWUzDQotbG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5X3RleHQ9XHU2NzJjXHU3YWVmXHU1M2Q2XHU0ZWUzXHU1NDhjXHU2ZGYxXHU1YzY0XHU4OTA3XHU4OGZkDQotZWxlbWVudFR5cGVfdGV4dD17MH06IHsxfQ0KLWRlbGl2ZXJhYmxlc190ZXh0PVx1NGVhNFx1NGVkOFx1OTgwNVx1NzZlZQ0KLWNvbnRyaWJ1dGVUb0FjdGl2aXR5X3RleHQ9XHU2M2QwXHU1MWZhXHU4MWYzXHU2ZDNiXHU1MmQ1DQotQWN0aXZpdHlEcm9wQ29tbWFuZF9sYWJlbD1cdTYzNjhcdTY4YzRcdTZkM2JcdTUyZDUNCi1yZXBsYWNlQWN0aXZpdHlfdGV4dD1cdTUzZDZcdTRlZTNcdTZkM2JcdTUyZDUNCi1maWxlX3RleHQ9XHU2YTk0XHU2ODQ4DQotZGlyZWN0b3J5X3RleHQ9XHU3NmVlXHU5MzA0DQotdW5yZXNvbHZlZF90ZXh0PVx1ZmYwOFx1NjcyYVx1ODllM1x1Njc5MFx1NzY4NCAnJ3swfScnXHVmZjA5DQotYXNzaXN0c190ZXh0PVx1OGYxNFx1NTJhOQ0KLXVua25vd25fdGV4dD1cdTRlMGRcdTY2MGUNCi1jb21tYW5kX2RvbmU9XHU1YjhjXHU2MjEwDQotDQotIyBUaGUgZm9sbG93aW5nIFVJIHRleHQgc2hvdWxkIGJlIHJldmlld2VkLg0KLVV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5d2l0aHBsdWdpbl9pbmZvPXswfVx1ZmYwOCcnezN9JycgXHU0ZTJkXHU3Njg0IHsxfSAnJ3syfScnXHVmZjA5DQotVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHlfaW5mbz17MH0gKHsxfSAnJ3syfScnKQ0KLXVpX3JlZl9kZWxldGU9XHU2M2NmXHU4ZmYwXHU1YjUwICcnezB9JycgXHU1MTc3XHU2NzA5XHU0ZTBiXHU1MjE3XHU2NzJhXHU0ZjdmXHU3NTI4XHU3Njg0XHU1M2MzXHU3MTY3XHUzMDAyXG5cdThhY2JcdTkwNzhcdTUzZDZcdTYwYThcdTg5ODFcdTUyMmFcdTk2NjRcdTc2ODRcdTUzYzNcdTcxNjdcdWZmMWENCi11aV9yZWZfZGVsZXRlMj1cdTRlMGJcdTUyMTdcdTkwMTlcdTRlOWJcdTUzYzNcdTcxNjdcdTY3MmFcdTRmN2ZcdTc1MjhcdTMwMDJcblx1OGFjYlx1OTA3OFx1NTNkNlx1NjBhOFx1ODk4MVx1NTIyYVx1OTY2NFx1NzY4NFx1NTNjM1x1NzE2N1x1ZmYxYQ0KLXVpX3JlZmVyZW5jZXM9XHU1M2MzXHU3MTY3DQotdWlfd29ya3Byb2R1Y3RfZGVzY3JpcHRvcl9kZXNjcmlwdGlvbj1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTYzY2ZcdThmZjBcdTViNTAgJyd7MH0nJyBcdTgyMDdcdTRmNWNcdTY5NmRcdTYzY2ZcdThmZjBcdTViNTAgJyd7MX0nJyBcdTY3MDlcdTk1ZGNcdTgwNmZcdWZmMDhcdThmMzhcdTUxZmFcdTRmODZcdTZlOTBcdWZmMDkNCi11aV93b3JrcHJvZHVjdGRlc2NyaXB0b3Jfb3B0aW9ucz1cdTkwNzhcdTk4MDUNCi11aV93b3JrcHJvZHVjdGRlc2NyaXB0b3Jfb3V0cHV0bGFiZWw9XHU3OWZiXHU5NjY0XHU1MDVhXHU3MGJhXHU0ZjVjXHU2OTZkXHU2M2NmXHU4ZmYwXHU1YjUwXHU4ZjM4XHU1MWZhXHU3Njg0XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU2M2NmXHU4ZmYwXHU1YjUwDQotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX2RlbGV0ZV90YXNrPVx1NWY5ZVx1NmQzYlx1NTJkNVx1NGUyZFx1NTIyYVx1OTY2NFx1NGY1Y1x1Njk2ZFx1NjNjZlx1OGZmMFx1NWI1MA0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9kZWZhdWx0Y29uZmlnY2hlY2s9XHU5MDc4XHU1M2Q2XHU3Njg0XHU1MTQzXHU3ZDIwICcnezB9JycgXHU0ZTBkXHU1NzI4XHU3YTBiXHU1ZThmXHU3Njg0XHU5ODEwXHU4YTJkXHU5MTRkXHU3ZjZlXHU0ZTJkXHUzMDAyXG5cdTYwYThcdTg5ODFcdTVjMDdcdTZiNjRcdTUxNDNcdTdkMjBcdTUzY2FcdTc2ZjhcdTRmOWRcdTk1ZGNcdTRmYzJcdTY1YjBcdTU4OWVcdTgxZjNcdTk4MTBcdThhMmRcdTkxNGRcdTdmNmVcdTU1Y2VcdWZmMWYNCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZ2VuZXJpY0Vycl9tZXNzYWdlX3RleHQ9XHU0ZjVjXHU2OTZkXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0XHUzMDAyXHU1OTgyXHU5NzAwXHU3NmY4XHU5NWRjXHU4Y2M3XHU4YTBhXHVmZjBjXHU4YWNiXHU2MzA5XHU0ZTAwXHU0ZTBiXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5XHUzMDAyDQotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9ub0Rlc2NyaXB0b3JUb1N5bmNoPVx1NjI3ZVx1NGUwZFx1NTIzMFx1NTE3N1x1NjcwOVx1OTNjOFx1N2Q1MFx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMFx1NzY4NFx1NjNjZlx1OGZmMFx1NWI1MFx1NTNlZlx1NTQwY1x1NmI2NVx1NTMxNg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3JlZmVyc2hpbmd2aWV3ZXI9XHU5MWNkXHU2NWIwXHU2NTc0XHU3NDA2XHU2YWEyXHU4OTk2XHU1NjY4XHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0DQotY29uZmlybV9yZW1vdmVfcmVmZXJlbmNlc190ZXh0PVx1MzAwY1x1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1MzAwZFx1NGUyZFx1NTIxN1x1NTFmYVx1NzY4NFx1NTE0M1x1N2QyMFx1NTcyOFx1OGY0OVx1NjNkYlx1NGU0Ylx1NWY4Y1x1ZmYwY1x1NWMwZFx1OTAxOVx1NTAwYlx1NjMwN1x1NWYxNVx1NzY4NFx1NTNjM1x1NzE2N1x1NTNlZlx1ODBmZFx1NjcwM1x1NzEyMVx1NjU0OFx1MzAwMlx1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1NzhiYVx1NWI5YVx1MzAwZFx1NGY4Nlx1NzlmYlx1OTY2NFx1ZmYwY1x1NGUyNlx1N2U3Y1x1N2U4Y1x1OTAzMlx1ODg0Y1x1MzAwMg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3VuaGFuZGxlZF9leGNlcHRpb249XHU3MTIxXHU2Y2Q1XHU4NjU1XHU3NDA2XHU3Njg0XHU3NTcwXHU1ZTM4XHU3MmMwXHU2Y2MxDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9icmVha2Rvd25fZWxlbWVudD1cdTc2ZjhcdTU0MGNcdTc2ODRcdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjBcdTRlMGRcdTgwZmRcdTU0MGNcdTY2NDJcdTcwYmFcdTUyNGRcdTRlMDBcdTcyNDhcdTU0OGNcdTRlMGJcdTRlMDBcdTcyNDgNCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd3BsaXN0ZGxnX21zZz1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWMgJyd7MH0nJyBcdTY2MmZcdTYzZDBcdTRmOWJcdTdkNjZcdTRlMGJcdTUyMTdcdTRmNWNcdTY5NmRcdTc2ODRcdThmMzhcdTUxZmFcdTMwMDJcblx1OTA3OFx1NTNkNlx1NjBhOFx1ODk4MVx1NWVmYVx1N2FjYlx1NzZmOFx1NWMwZFx1NjFjOVx1NjNjZlx1OGZmMFx1NWI1MFx1NzY4NFx1NGY1Y1x1Njk2ZFx1MzAwMg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9yb2xlbGlzdGRsZ19tc2c9XHU4OWQyXHU4MjcyICcnezB9JycgXHU4Y2EwXHU4Y2FjXHU0ZTBiXHU1MjE3XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHUzMDAyXG5cdTkwNzhcdTUzZDZcdTYwYThcdTg5ODFcdTVlZmFcdTdhY2JcdTc2ZjhcdTVjMGRcdTYxYzlcdTYzY2ZcdThmZjBcdTViNTBcdTc2ODRcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTMwMDINCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9mYXRhbGVycj1cdTU2YjRcdTkxY2RcdTkzMmZcdThhYTQNCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd29ya3Byb2R1Y3RzPVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfc3ViX2VsZW1lbnQ9XHU3MTIxXHU2Y2Q1XHU1YzA3XHU1MjA2XHU4OWUzXHU1MTQzXHU3ZDIwXHU5MDIzXHU3ZDUwXHU4MWYzXHU1MTc2XHU0ZTJkXHU0ZTAwXHU1MDBiXHU1YjUwXHU1MTQzXHU3ZDIwXHUzMDAyDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfd3JvbmdfZWxlbWVudD1cdTcxMjFcdTZjZDVcdTkwMjNcdTdkNTBcdTgxZjNcdTVkZTVcdTRmNWNcdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjBcdTRlZTVcdTU5MTZcdTc2ODRcdTUxNDNcdTdkMjBcdTMwMDINCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9jaGlsZF9lbGVtZW50PVx1NzEyMVx1NmNkNVx1NWMwN1x1NTIwNlx1ODllM1x1NTE0M1x1N2QyMFx1OTAyM1x1N2Q1MFx1ODFmM1x1NTE3Nlx1NGUyZFx1NGUwMFx1NTAwYlx1NWI1MFx1NTE0M1x1N2QyMFx1MzAwMg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl90YXNrcz1cdTRmNWNcdTY5NmQNCi11aV9hc3NvY2lhdGlvbl90YXNrX3NlbGVjdGlvbj1cdTRmNWNcdTY5NmRcdTkwNzhcdTY0YzcuLi4NCi11dGlsX1Byb2Nlc3NVdGlsX2NoaWxkYWRhcHRlcj1cIFwgXHU1YjUwXHU5ODA1XHU5MTRkXHU2M2E1XHU1NjY4XHVmZjFhDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2V0cGFyZW50PVx1NzEyMVx1NmNkNVx1OGEyZFx1NWI5YVx1NWI1MFx1OTgwNVx1NzY4NFx1NmJjZFx1OTgwNQ0KLXV0aWxfdG5ndXRpbF9jYW5ub3RfZWRpdF9yZXNvdXJjZT1cdTcxMjFcdTZjZDVcdTdkZThcdThmMmZcdThjYzdcdTZlOTBcdTMwMDINCi11dGlsX1Byb2Nlc3NVdGlsX2NvbnRyaWJ1dGVzdG89XHU2M2QwXHU1MWZhXHU4MWYzICcnezB9JycNCi11dGlsX1Byb2Nlc3NVdGlsX2xvY2FsQ29udHJpYnV0ZXN0bz1cdTU3MjhcdTY3MmNcdTdhZWZcdTYzZDBcdTUxZmFcdTgxZjMgJyd7MH0nJw0KLXByb2Nlc3NfZXh0ZW5kcz1cdTVlZjZcdTRmMzggJyd7MH0nJw0KLXByb2Nlc3NfcmVwbGFjZXM9XHU1M2Q2XHU0ZWUzICcnezB9JycNCi1wcm9jZXNzX2xvY2FsUmVwbGFjZXM9XHU1NzI4XHU2NzJjXHU3YWVmXHU1M2Q2XHU0ZWUzICcnezB9JycNCi0jIEZpbHRlciBjb25zdGFudHMgZXh0ZXJuYWxpemVkIHN0cmluZ3MuDQotRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVzX3RleHQ9XHU4OThmXHU3YmM0DQotRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVncm91cGluZ3NfdGV4dD1cdTg5OGZcdTdiYzRcdTUyMDZcdTdkNDQNCi1GaWx0ZXJDb25zdGFudHNfd2hpdGVwYXBlcnNfdGV4dD1cdTc2N2RcdTc2YWVcdTY2ZjgNCi1GaWx0ZXJDb25zdGFudHNfdG9vbG1lbnRvcnNfdGV4dD1cdTVkZTVcdTUxNzdcdThmMTRcdTUyYTkNCi1GaWx0ZXJDb25zdGFudHNfdG9vbHNfdGV4dD1cdTVkZTVcdTUxNzcNCi1GaWx0ZXJDb25zdGFudHNfcm9sZXNfdGV4dD1cdTg5ZDJcdTgyNzINCi1GaWx0ZXJDb25zdGFudHNfdGFza3NfdGV4dD1cdTRmNWNcdTY5NmQNCi1GaWx0ZXJDb25zdGFudHNfcmV1c2FibGVhc3NldHNfdGV4dD1cdTUzZWZcdTkxY2RcdTg5MDdcdTRmN2ZcdTc1MjhcdTc2ODRcdThjYzdcdTc1MjINCi1GaWx0ZXJDb25zdGFudHNfYWxsX3RleHQ9XHU1MTY4XHU5MGU4DQotRmlsdGVyQ29uc3RhbnRzX3Byb2Nlc3Nlc190ZXh0PVx1N2EwYlx1NWU4Zg0KLUZpbHRlckNvbnN0YW50c19wcmFjdGljZXNfdGV4dD1cdTdkZjRcdTdmZDINCi1GaWx0ZXJDb25zdGFudHNfdGVtcGxhdGVzX3RleHQ9XHU3YmM0XHU2NzJjDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0c190ZXh0PVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLUZpbHRlckNvbnN0YW50c19jaGVja2xpc3RzX3RleHQ9XHU2ODM4XHU1YzBkXHU2ZTA1XHU1NWFlDQotRmlsdGVyQ29uc3RhbnRzX2d1aWRlbGluZXNfdGV4dD1cdTZlOTZcdTUyNDcNCi1GaWx0ZXJDb25zdGFudHNfcm9sZXNldHNfdGV4dD1cdTg5ZDJcdTgyNzJcdTk2YzYNCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGFuY2VfdGV4dD1cdTYzMDdcdTVmMTUNCi1GaWx0ZXJDb25zdGFudHNfY29uY2VwdHNfdGV4dD1cdTY5ODJcdTVmZjUNCi1GaWx0ZXJDb25zdGFudHNfZXhhbXBsZXNfdGV4dD1cdTdiYzRcdTRmOGINCi1GaWx0ZXJDb25zdGFudHNfY29udGVudHBhY2thZ2VzX3RleHQ9XHU1MTY3XHU1YmI5XHU1OTU3XHU0ZWY2DQotRmlsdGVyQ29uc3RhbnRzX3JvbGVkZXNjcmlwdG9yc190ZXh0PVx1ODlkMlx1ODI3Mlx1NjNjZlx1OGZmMFx1NWI1MA0KLUZpbHRlckNvbnN0YW50c19yb2xlc2V0Z3JvcHVpbmdzX3RleHQ9XHU4OWQyXHU4MjcyXHU5NmM2XHU1MjA2XHU3ZDQ0DQotRmlsdGVyQ29uc3RhbnRzX3Rhc2tkZXNjcmlwdG9yc190ZXh0PVx1NGY1Y1x1Njk2ZFx1NjNjZlx1OGZmMFx1NWI1MA0KLUZpbHRlckNvbnN0YW50c19jb250ZW50ZWxlbWVudHNfdGV4dD1cdTUxNjdcdTViYjlcdTUxNDNcdTdkMjANCi1Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uX3ByZXBhcmU9XHU2YjYzXHU1NzI4XHU2ZTk2XHU1MDk5XHU1NDBjXHU2YjY1XHU1MzE2Li4uDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcnNfdGV4dD1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTYzY2ZcdThmZjBcdTViNTANCi1GaWx0ZXJDb25zdGFudHNfYWxsY29udGVudGVsZW1lbnRzX3RleHQ9XHU2MjQwXHU2NzA5XHU1MTY3XHU1YmI5XHU1MTQzXHU3ZDIwDQotRmlsdGVyQ29uc3RhbnRzX3N1cHBvcnRpbmdtYXRlcmlhbHNfdGV4dD1cdTY1MmZcdTYzZjRcdThjYzdcdTY1OTkNCi1NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9lcnJvclNhdmluZ0ZpbGVzPVx1NTEzMlx1NWI1OFx1NmE5NFx1Njg0OFx1NjY0Mlx1NzY3Y1x1NzUxZlx1OTMyZlx1OGFhNA0KLUZpbHRlckNvbnN0YW50c19jdXN0b21jYXRlZ29yaWVzX3RleHQ9XHU4MWVhXHU4YTAyXHU3YTJlXHU5ODVlDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0dHlwZXNfdGV4dD1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTk4NWVcdTU3OGINCi1EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZF93YXJuaW5nTXNnPVx1NTIyYVx1OTY2NFx1NWI4Y1x1NjIxMFx1NGY0Nlx1NjcwOVx1OGI2Nlx1NTQ0YQ0KLUZpbHRlckNvbnN0YW50c19tZXRob2RwbHVnaW5zX3RleHQ9XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotVXNlckludGVyYWN0aW9uSGVscGVyX2xvY2tlZFBsdWdpbj1JVVBMMDEyMEU6IFx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZiAnJ3swfScnIFx1NWRmMlx1OTM5Nlx1NWI5YVx1MzAwMg0KLUZpbHRlckNvbnN0YW50c19kb21haW5zX3RleHQ9XHU5ODE4XHU1N2RmDQotRmlsdGVyQ29uc3RhbnRzX3JvYWRtYXBfdGV4dD1cdTVjMGVcdTg5YmRcdTU3MTYNCi1GaWx0ZXJDb25zdGFudHNfcmVwb3J0c190ZXh0PVx1NTgzMVx1NTQ0YQ0KLUF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWw9XHU5ODEwXHU4YTJkXHU1ZjllXHU2NWI5XHU2Y2Q1XHU1MTY3XHU1YmI5XHU1NDBjXHU2YjY1XHU1MzE2KCZZKQ0KLU1hbnVhbFN5bmNocm9uaXplQ29tbWFuZF9sYWJlbD1cdTgxZWFcdThhMDJcdTU0MGNcdTZiNjVcdTUzMTYoJlopLi4uDQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9zdWNlc3NmdWw9XHU1ZGYyXHU5ODA2XHU1MjI5XHU1YjhjXHU2MjEwXHU1NDBjXHU2YjY1XHU1MzE2XHUzMDAyDQotDQotIyBVc2VySW50ZXJhY3Rpb25IZWxwZXINCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfUHJvY2Vzc1BhY2thZ2VfTmFtZT1cdTU0MGRcdTdhMzFcdWZmMWENCi0NCi0jIE1ldGhvZENyZWF0ZUNoaWxkQ29tbWFuZA0KLW5ld0VsZW1lbnRfdGV4dD1cdTY1YjBcdTVlZmEgezB9DQotdXBkYXRlX291dG9mc3luY2hfdGl0bGU9XHU2NmY0XHU2NWIwXHU4ODVkXHU3YTgxDQotdXBkYXRlX291dG9mc3luY2hfbXNnPVx1NmE5NFx1Njg0OFx1N2NmYlx1N2Q3MVx1NGUwYVx1NzY4NFx1NmE5NFx1Njg0OFx1NWRmMlx1OGI4YVx1NjZmNFx1MzAwMlx1ODk4MVx1NjUzOVx1NWJlYlx1OGI4YVx1NjZmNFx1NTVjZVx1ZmYxZg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQ2Zjg2ZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNDU0OGY5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBMaWJyYXJ5IEVkaXQgKE5MMikKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1NGZjYTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMi9wbHVnaW5fcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM2ZTJlZGUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMi9wbHVnaW5fcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9XHUwNDExXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDMwIEVQRiAtIFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLV9VSV9Db250ZW50X2dyb3VwPVx1MDQxY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0YiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi0NCi1fVUlfRGlzY2lwbGluZXNfZ3JvdXA9XHUwNDE0XHUwNDM4XHUwNDQxXHUwNDQ2XHUwNDM4XHUwNDNmXHUwNDNiXHUwNDM4XHUwNDNkXHUwNDRiDQotX1VJX0RvbWFpbnNfZ3JvdXA9XHUwNDE0XHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDRiDQotX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXA9XHUwNDIyXHUwNDM4XHUwNDNmXHUwNDRiIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQ0NSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0M2VcdTA0MzINCi1fVUlfUm9sZV9TZXRzX2dyb3VwPVx1MDQxZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkNCi1fVUlfVG9vbHNfZ3JvdXA9XHUwNDE4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiDQotX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXA9XHUwNDIxXHUwNDQyXHUwNDMwXHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQwXHUwNDQyXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQzOA0KLV9VSV9DdXN0b21fQ2F0ZWdvcmllc19ncm91cD1cdTA0MWZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4DQotX1VJX01ldGhvZENvbnRlbnRfZ3JvdXA9XHUwNDFmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyXHUwNDRiIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMg0KLQ0KLV9VSV9Qcm9jZXNzZXNfZ3JvdXA9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDRiDQotX1VJX1BsYW5uaW5nVGVtcGxhdGVzX2dyb3VwPVx1MDQyOFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZFx1MDQ0YiBcdTA0M2ZcdTA0M2JcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYNCi0NCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5zX3RleHQ9XHUwNDI4XHUwNDMwXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNkXHUwNDRiIFx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzOQ0KLV9VSV9EZWxpdmVyeVByb2Nlc3Nlc190ZXh0PVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQ0YiBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2FcdTA0MzgNCi1fVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbnNfdGV4dD1cdTA0MTRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNhIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMFx1MDQzYw0KLV9VSV9QbGFubmluZ1RlbXBsYXRlc190ZXh0PVx1MDQyOFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZFx1MDQ0YiBcdTA0M2ZcdTA0M2JcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYNCi0NCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1cdTA0MjhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2QgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5DQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0PVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MSBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2FcdTA0MzgNCi1fVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0PVx1MDQxNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0M2EgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDQzDQotDQotX1VJX0NvbmZpZ3VyYXRpb25zX3RleHQ9XHUwNDFhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotDQotX1VJX1Byb2Nlc3NGYW1pbGllc190ZXh0PVx1MDQyMVx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0M2VcdTA0MzINCi0NCi1fVUlfVW5jYXRlZ29yaXplZF90ZXh0PVx1MDQxMVx1MDQzNVx1MDQzNyBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzgNCi1fVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0PVx1MDQxN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOCBcdTA0MzJcdTA0M2RcdTA0MzUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM5DQotX1VJX1VuY2F0ZWdvcml6ZWRfUm9sZXNfdGV4dD1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0MzggXHUwNDMyXHUwNDNkXHUwNDM1IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQzOQ0KLQ0KLV9VSV9HdWlkYW5jZXNfZ3JvdXA9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmDQotX1VJX0d1aWRhbmNlc19DaGVja2xpc3RzPVx1MDQyMVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0NGINCi1fVUlfR3VpZGFuY2VzX0NvbmNlcHRzPVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0Nlx1MDQzNVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQzOA0KLV9VSV9HdWlkYW5jZXNfRXhhbXBsZXM9XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDQwXHUwNDRiDQotX1VJX0d1aWRhbmNlc19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM9XHUwNDIwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQzZSBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0M2RcdTA0M2FcdTA0MzUNCi1fVUlfR3VpZGFuY2VzX1ByYWN0aWNlcz1cdTA0MWZcdTA0NDBcdTA0MzBcdTA0M2FcdTA0NDJcdTA0MzhcdTA0M2FcdTA0MzggXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotX1VJX0d1aWRhbmNlc19SZXBvcnRzPVx1MDQxZVx1MDQ0Mlx1MDQ0N1x1MDQzNVx1MDQ0Mlx1MDQ0Yg0KLV9VSV9HdWlkYW5jZXNfUmV1c2FibGVBc3NldHM9XHUwNDFjXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM1IFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQ0Yg0KLV9VSV9HdWlkYW5jZXNfUm9hZG1hcD1cdTA0MWZcdTA0NDNcdTA0NDJcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGMNCi1fVUlfR3VpZGFuY2VzX1N1cHBvcnRpbmdNYXRlcmlhbHM9XHUwNDIxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0Yg0KLV9VSV9HdWlkYW5jZXNfVGVjaG5pcXVlcz1cdTA0MWNcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0M2FcdTA0MzgNCi1fVUlfR3VpZGFuY2VzX1RlbXBsYXRlcz1cdTA0MjhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2RcdTA0NGINCi1fVUlfR3VpZGFuY2VzX1Rlcm1EZWZpbml0aW9ucz1cdTA0MWVcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDNjXHUwNDM4XHUwNDNkXHUwNDNlXHUwNDMyDQotX1VJX0d1aWRhbmNlc19Ub29sTWVudG9ycz1cdTA0MjBcdTA0NDNcdTA0M2FcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzAgXHUwNDNmXHUwNDNlIFx1MDQzOFx1MDQzZFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQzYw0KLV9VSV9HdWlkYW5jZXNfV2hpdGVwYXBlcnM9XHUwNDE4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDNlXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzMVx1MDQ0ZVx1MDQzYlx1MDQzYlx1MDQzNVx1MDQ0Mlx1MDQzNVx1MDQzZFx1MDQzOA0KLV9VSV9HdWlkYW5jZXNfV29ya1Byb2R1Y3RHdWlkZWxpbmVzPVx1MDQyMFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLQ0KLQ0KLV9VSV9Sb2xlc19ncm91cD1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0MzgNCi1fVUlfVGFza3NfZ3JvdXA9XHUwNDE3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4DQotX1VJX1dvcmtQcm9kdWN0c19ncm91cD1cdTA0MjBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBkOTI5NTMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEdlbmVyaWMgRGlhbG9nIFRpdGxlcw0KLW1vdmVEaWFsb2dfdGl0bGU9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDRjDQotZGVsZXRlRGlhbG9nX3RpdGxlPVx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDINCi1lcnJvckRpYWxvZ190aXRsZT1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzANCi1lcnJvckRpYWxvZ19jYW5ub3RSZW5hbWU9XHUwNDFkXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyB7MH0gJyd7MX0nJyBcdTA0MzIgJyd7Mn0nJy4gXHUwNDIzXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQ0N1x1MDQzOFx1MDQzZFx1MDQ0MyBcdTA0M2VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzgsIFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzIgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zlx1MDQ0NSwgXHUwNDM4IFx1MDQzZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MWVcdTA0MWEgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDFlXHUwNDQyXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDMwIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2VcdTA0NDJcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzAgXHUwNDNlXHUwNDQyIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguDQotDQotIyBDb25maXJtIFJlZmVyZW5jZXMgUmVtb3ZhbCBEaWFsb2cNCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RpdGxlPVx1MDQxZlx1MDQzZVx1MDQzNFx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNlXHUwNDNhDQotZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190ZXh0PVx1MDQxZFx1MDQzMCBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0NGZcdTA0MzVcdTA0M2NcdTA0NGJcdTA0MzUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQ0YyBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzggXHUwNDM4XHUwNDM3IFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQ0NSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4gXHUwNDFmXHUwNDQwXHUwNDM4IFx1MDQzOFx1MDQ0NSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzNVx1MDQzZFx1MDQ0YiBcdTA0NDJcdTA0MzBcdTA0M2FcdTA0MzZcdTA0MzUgXHUwNDRkXHUwNDQyXHUwNDM4IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOCwgXHUwNDQyXHUwNDNlIFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQ0YyBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0NGIgXHUwNDM4IFx1MDQ0MVx1MDQzZVx1MDQzZVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIuIFx1MDQyM1x1MDQzMVx1MDQzNVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQ0MVx1MDQ0YywgXHUwNDQ3XHUwNDQyXHUwNDNlIFx1MDQ0MyBcdTA0MzJcdTA0MzBcdTA0NDEgXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2ZcdTA0MzAgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0MzhcdTA0NDUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyLCBcdTA0MzdcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2MgXHUwNDNkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IE9LLiAgXHUwNDFkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQyMVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiwgXHUwNDQ3XHUwNDQyXHUwNDNlXHUwNDMxXHUwNDRiIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQ0Mlx1MDQ0YyBcdTA0NDFcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0M2VcdTA0M2EgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyLCBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0MzBcdTA0NGVcdTA0NDlcdTA0MzhcdTA0NDVcdTA0NDFcdTA0NGYgXHUwNDNkXHUwNDMwIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQ0Zlx1MDQzNVx1MDQzY1x1MDQ0Ylx1MDQzOSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIuDQotDQotIyBSZXNvbHZlIE5hbWUgQ29uZmxpY3QgRGlhbG9nDQotcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190aXRsZT1cdTA0MjNcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDNiXHUwNDM4XHUwNDNhXHUwNDQyIFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZCBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzINCi1yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RleHQ9XHUwNDEyXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZFx1MDQzZVx1MDQzMlx1MDQ0Ylx1MDQzOSB7MH0gXHUwNDM0XHUwNDNiXHUwNDRmICcnezF9Jyc6DQotDQotIyBTZWxlY3QgRGVsaXZlcmFibGVzIERpYWxvZw0KLXNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190aXRsZT1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLXNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190ZXh0PVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDM1XHUwNDQyIFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQ0MVx1MDQzMlx1MDQzZVx1MDQzNVx1MDQzZCBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyICcnezB9JycuDQotDQotIyBOZXcgUHJvY2VzcyBDb21wb25lbnQgRGlhbG9nDQotbmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZ190aXRsZT1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNjXHUwNDNmXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMA0KLW5hbWVMYWJlbF90ZXh0PVx1MDQxOFx1MDQzY1x1MDQ0ZjoNCi1kZWZhdWx0Q29uZmlnTGFiZWxfdGV4dD1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDNmXHUwNDNlIFx1MDQ0M1x1MDQzY1x1MDQzZVx1MDQzYlx1MDQ0N1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZToNCi1iYXNlUHJvY2Vzc0xhYmVsX3RleHQ9XHUwNDExXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM5IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MToNCi1iYXNlZE9uUHJvY2Vzc2VzTGFiZWxfdGV4dD1cdTA0MWRcdTA0MzAgXHUwNDNlXHUwNDQxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzZVx1MDQzMjoNCi0NCi0jIFJvbGUgQXNzb2NpYXRpb24gRGlhbG9nDQotc2VsZWN0QXNzb2NpYXRpb25MYWJlbF90ZXh0PVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0NGMgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOCAnJ3swfScnDQotDQotIyBSZW1vdmUgQXNzb2NpYXRpb24gZGlhbG9nDQotcmVtb3ZlQXNzb2NpYXRpb25EaWFsb2dfdGV4dD1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDRjDQotDQotIyBTZWxlY3QgVGVhbXMgRGlhbG9nDQotc2VsZWN0VGVhbXNEaWFsb2dfdGl0bGU9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0Yg0KLXNlbGVjdFRlYW1zRGlhbG9nX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0MywgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDM5IFx1MDQzZFx1MDQ0M1x1MDQzNlx1MDQzZFx1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0NDFcdTA0MzJcdTA0M2VcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDRjICcnezB9JycuDQotDQotIyBUYXNsIFNlbGVjdGlvbiBEaWFsb2cNCi10YXNrU2VsZWN0aW9uRGlhbG9nX3RpdGxlPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzZVx1MDQ0MCBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzgNCi10aXRsZUxhYmVsX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOC4uLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEwwMTAwRTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZSBcdTA0MzhcdTA0M2NcdTA0NGYgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwICJ7MH0iLlxuXG5cdTA0MTJcdTA0NDFcdTA0MzVcdTA0M2MgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwXHUwNDNjIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDNlXHUwNDMyIFx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzZFx1MDQ0YiBcdTA0MzFcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDQxXHUwNDMyXHUwNDNlXHUwNDM1XHUwNDNkXHUwNDRiIFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzMC5cblxuXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzOFx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYgXHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0M2ZcdTA0NGJcdTA0NDJcdTA0M2FcdTA0NDMuDQotZW1wdHlFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c9XHUwNDE4XHUwNDNjXHUwNDRmIFx1MDQzZFx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQ0Ylx1MDQzYy4gXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYuDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQTDAxMDFFOiBcdTA0MThcdTA0M2NcdTA0NGYgJyd7MH0nJyBcdTA0NDNcdTA0MzZcdTA0MzUgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDM1XHUwNDQyLiBcblxuXHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzVcdTA0M2QgXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDQyXHUwNDRjIFx1MDQ0M1x1MDQzZFx1MDQzOFx1MDQzYVx1MDQzMFx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYuXG5cblx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDNmXHUwNDRiXHUwNDQyXHUwNDNhXHUwNDQzLg0KLWR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZz1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDQxIFx1MDQ0Mlx1MDQzMFx1MDQzYVx1MDQzOFx1MDQzYyBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2MgXHUwNDQzXHUwNDM2XHUwNDM1IFx1MDQ0MVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQzNVx1MDQ0Mi4gXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzZVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYuDQotaW52YWxpZEVsZW1lbnROYW1lRXJyb3IxX21zZz1JVVBMMDEwMkU6IFx1MDQxZFx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzNSBcdTA0MzhcdTA0M2NcdTA0NGYgJyd7MH0nJy5cblxuXHUwNDE4XHUwNDNjXHUwNDRmIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAgXHUwNDNkXHUwNDM1IFx1MDQzY1x1MDQzZVx1MDQzNlx1MDQzNVx1MDQ0MiBcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzhcdTA0M2RcdTA0MzBcdTA0NDJcdTA0NGNcdTA0NDFcdTA0NGYgXHUwNDQxIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzMVx1MDQzNVx1MDQzYlx1MDQzMC4gXG5cblx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDNmXHUwNDRiXHUwNDQyXHUwNDNhXHUwNDQzLg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMl9tc2c9SVVQTDAxMDNFOiBcdTA0MWRcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmICcnezB9JycuXG5cblx1MDQxOFx1MDQzY1x1MDQ0ZiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwIFx1MDQzZFx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDNkXHUwNDQ3XHUwNDM4XHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjXHUwNDQxXHUwNDRmIFx1MDQ0Mlx1MDQzZVx1MDQ0N1x1MDQzYVx1MDQzZVx1MDQzOS4gXG5cblx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDNmXHUwNDRiXHUwNDQyXHUwNDNhXHUwNDQzLg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yM19tc2c9SVVQTDAxMDRFOiBcdTA0MWRcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmICcnezB9JycuXG5cblx1MDQxOFx1MDQzY1x1MDQ0ZiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwIFx1MDQzZFx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDMyXHUwNDNhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQzMlx1MDQzZVx1MDQzYlx1MDQ0YiBcXCAvIDogKiA/ICIgPCA+IDsgfFxuXG5cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDM1IFx1MDQzOFx1MDQzY1x1MDQ0ZiBcdTA0MzggXHUwNDNmXHUwNDNlXHUwNDMyXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZS4NCi1ub0NvbmZpZ0Vycm9yX21zZz1JVVBMMDEwNUU6IFx1MDQxMiBcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDNcdTA0NDlcdTA0MzVcdTA0MzkgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM1IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0M2RcdTA0MzVcdTA0NDIgXHUwNDNkXHUwNDM4IFx1MDQzZVx1MDQzNFx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwLlxuXG5cdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzZVx1MDQzMiBcdTA0NDJcdTA0NDBcdTA0MzVcdTA0MzFcdTA0NDNcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi5cblxuXHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0M2ZcdTA0NGJcdTA0NDJcdTA0M2FcdTA0NDMuDQotbm9EZWxpdmVyeVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDZFOiBcdTA0MTIgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzNSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDNkXHUwNDM1XHUwNDQyIFx1MDQzZFx1MDQzOCBcdTA0M2VcdTA0MzRcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwIFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYVx1MDQzOC5cblxuXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwIFx1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQzMVx1MDQ0M1x1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0MzFcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxIFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYVx1MDQzOC5cblxuXHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MSBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2FcdTA0MzggXHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUuDQotbm9EZWZhdWx0Q29uZmlnRXJyb3JfbXNnPUlVUEwwMTA3RTogXHUwNDFkXHUwNDM1IFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzMCBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwLlxuXG5cdTA0MWRcdTA0M2VcdTA0MzJcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDQzIFx1MDQzZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzY1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0NDFcdTA0MzJcdTA0M2VcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0M2ZcdTA0M2UgXHUwNDQzXHUwNDNjXHUwNDNlXHUwNDNiXHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlLlxuXG5cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0MzggXHUwNDNmXHUwNDNlXHUwNDMyXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzZlx1MDQ0Ylx1MDQ0Mlx1MDQzYVx1MDQ0My4NCi1ub0Jhc2VQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA4RTogXHUwNDFkXHUwNDM1IFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDEgXHUwNDM0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNhXHUwNDM4LlxuXG5cdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2EgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDQzIFx1MDQzZFx1MDQ0M1x1MDQzNlx1MDQzNVx1MDQzZCBcdTA0MzFcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxIFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYVx1MDQzOC4gXG5cblx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDEgXHUwNDM0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNhXHUwNDM4IFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlLg0KLWNyZWF0ZVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDlFOiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDEgXHUwNDNkXHUwNDM1IFx1MDQzMVx1MDQ0Ylx1MDQzYiBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2QuDQotY3JlYXRlRWxlbWVudEVycm9yX21zZz1JVVBMMDExMEU6IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2RcdTA0MzUgXHUwNDMxXHUwNDRiXHUwNDNiIFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZC4NCi1kZWxldGVFbGVtZW50RXJyb3JfbXNnPUlVUEwwMTExRTogXHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzZFx1MDQzNSBcdTA0MzFcdTA0NGJcdTA0M2IgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkLg0KLWR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3JfbXNnPUlVUEwwMTEyRTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzAuXG5cblx1MDQyNFx1MDQzMFx1MDQzOVx1MDQzYiAnJ3swfScnIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIuXG5cblx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDNmXHUwNDRiXHUwNDQyXHUwNDNhXHUwNDQzLg0KLWR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3Jfc2ltcGxlX21zZz1cdTA0MjRcdTA0MzBcdTA0MzlcdTA0M2IgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyIFx1MDQ0MSBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0M2MgXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNjIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIuIFx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmLg0KLXVuZG9Db21tYW5kRXJyb3JfbXNnPUlVUEwwMTEzRTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNjXHUwNDMwXHUwNDNkXHUwNDM0XHUwNDQzIFx1MDQzZVx1MDQ0Mlx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0YiAnJ3swfScnLlxuXG5cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzA6IHsxfQ0KLWludmFsaWRQcmVkZWNlc3NvckVycm9yX21zZz1JVVBMMDExNEU6IFx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZCBcdTA0M2RcdTA0MzVcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDM4XHUwNDNkXHUwNDM0XHUwNDM1XHUwNDNhXHUwNDQxIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0OFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzOFx1MDQzYVx1MDQzMC5cblxuXHUwNDE4XHUwNDNkXHUwNDM0XHUwNDM1XHUwNDNhXHUwNDQxIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0OFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzOFx1MDQzYVx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzVcdTA0M2QgXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQ0Nlx1MDQzNVx1MDQzYlx1MDQ0Ylx1MDQzYyBcdTA0NDdcdTA0MzhcdTA0NDFcdTA0M2JcdTA0M2VcdTA0M2MgXHUwNDM4XHUwNDM3IFx1MDQ0MVx1MDQ0Mlx1MDQzZVx1MDQzYlx1MDQzMVx1MDQ0Nlx1MDQzMCAnXHUwNDE4XHUwNDNkXHUwNDM0XHUwNDM1XHUwNDNhXHUwNDQxJy5cblxuXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzZVx1MDQzNSBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUuDQotVXNlckludGVyYWN0aW9uSGVscGVyX2VyclJlbGF0aW9uc2hpcEV4aXN0cz1JVVBMMDEwMFc6ICcnezB9JycgXHUwNDQzXHUwNDM2XHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZCBcdTA0NDEgJyd7MX0nJy4gIFx1MDQxNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQzMCBcdTA0NDJcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2FcdTA0M2UgXHUwNDNlXHUwNDM0XHUwNDNkXHUwNDMwIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQ0YyBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDMyXHUwNDM4XHUwNDM0XHUwNDMwLiBcdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDQyXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQ0N1x1MDQ0Mlx1MDQzZVx1MDQzMVx1MDQ0YiBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0NDJcdTA0NGMgJyd7MH0nJyBcdTA0NDEgJyd7Mn0nJywgXHUwNDQxXHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDNiXHUwNDMwIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0NGMgXHUwNDQxICcnezF9JycuDQotZXJyb3JfbXNnV2l0aERldGFpbHM9SVVQTDAxMTZFOiBcdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAuIFx1MDQxNFx1MDQzYlx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzAgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2RcdTA0MzBcdTA0MzZcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNkXHUwNDNlXHUwNDNmXHUwNDNhXHUwNDQzIFx1MDQyMVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1lcnJvcl9tc2c9SVVQTDAxMTdFOiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzhcdTA0MzdcdTA0M2VcdTA0NDhcdTA0M2JcdTA0MzAgXHUwNDNlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwLiBcdTA0MWZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzMCBcdTA0MzIgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDM1IFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzZVx1MDQzYS4NCi1TdXBwcmVzc2lvbl9uYW1lRHVwbGljYXRpb249SVVQTDAxMThFOiBcdTA0MmRcdTA0NDJcdTA0MzAgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQ0MiBcdTA0M2EgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDNiXHUwNDM4XHUwNDNhXHUwNDQyXHUwNDQzIFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZC4gXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDRjXHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Zlx1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNVx1MDQ0MVx1MDQ0ZiBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzAgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDNmXHUwNDRiXHUwNDQyXHUwNDNhXHUwNDQzDQotU3VwcHJlc3Npb25fcHJlc2VudGF0aW9uTmFtZUR1cGxpY2F0aW9uPUlVUEwwMTE5RTogXHUwNDJkXHUwNDQyXHUwNDMwIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDNhIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzYlx1MDQzOFx1MDQzYVx1MDQ0Mlx1MDQ0MyBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2QuIFx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Y1x1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGZcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzVcdTA0NDFcdTA0NGYgXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIgXHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0M2ZcdTA0NGJcdTA0NDJcdTA0M2FcdTA0NDMNCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDQ4XHUwNDNiXHUwNDMwIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMC4gXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2RcdTA0M2VcdTA0M2ZcdTA0M2FcdTA0NDMgXHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLg0KLXNhdmVQcm9jZXNzRXJyb3JfcmVhc29uPVx1MDQxZlx1MDQ0MFx1MDQzOCBcdTA0NDFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwICcnezB9JycgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDQ4XHUwNDNiXHUwNDMwIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMC4gXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2RcdTA0M2VcdTA0M2ZcdTA0M2FcdTA0NDMgXHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLg0KLWRlbGV0ZVJlZmVyZW5jZXNFcnJvcl9yZWFzb249XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNlXHUwNDNhLCBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDQxIFx1MDQ0ZFx1MDQ0Mlx1MDQzOFx1MDQzYyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0M2MuIFx1MDQxNFx1MDQzYlx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzAgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2RcdTA0MzBcdTA0MzZcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNkXHUwNDNlXHUwNDNmXHUwNDNhXHUwNDQzIFx1MDQyMVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1zYXZlRmlsZUVycm9yX3JlYXNvbj1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0MzAgJyd7MH0nJy4gXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2RcdTA0M2VcdTA0M2ZcdTA0M2FcdTA0NDMgXHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLg0KLWludmFsaWRSZWZlcmVuY2VzRXJyb3JfcmVhc29uPVx1MDQxZVx1MDQzMVx1MDQzZFx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQzNlx1MDQzNVx1MDQzZFx1MDQ0YiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwIFx1MDQ0MSBcdTA0M2RcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0NGJcdTA0M2NcdTA0MzggXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDMwXHUwNDNjXHUwNDM4LCBcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2RcdTA0MzhcdTA0M2FcdTA0NDhcdTA0MzhcdTA0M2NcdTA0MzggXHUwNDMyIFx1MDQ0MFx1MDQzNVx1MDQzN1x1MDQ0M1x1MDQzYlx1MDQ0Y1x1MDQ0Mlx1MDQzMFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyIFx1MDQzOFx1MDQzNyBcdTA0M2VcdTA0MzRcdTA0M2RcdTA0MzhcdTA0NDUgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM1XHUwNDM5IFx1MDQzMiBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0MzhcdTA0MzUuIFxuXHUwNDJkXHUwNDQyXHUwNDM4IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOCBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDRiLiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NGM/DQotdW5yZXNvbHZlZE9iamVjdEVycm9yX3JlYXNvbj1cdTA0MWRcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2UgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZFx1MDQzNVx1MDQzZVx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2VcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDI6IHswfShVUkkgPSB7MX0pezJ9DQotDQotIyBXYXJuaW5nIG1lc3NhZ2VzDQotTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE4VzogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0M2RcdTA0MzBcdTA0MzlcdTA0NDJcdTA0MzggXHUwNDNlXHUwNDM0XHUwNDM4XHUwNDNkIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0M2RcdTA0MzVcdTA0NDFcdTA0M2FcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2FcdTA0M2UgXHUwNDM4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzZVx1MDQzMi4gXHUwNDIxXHUwNDNlXHUwNDNlXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQ0YiBcdTA0MzhcdTA0MzcgXHUwNDNmXHUwNDMwXHUwNDNmXHUwNDNhXHUwNDM4IFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzZVx1MDQzMiBcdTA0M2RcdTA0MzUgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQ0Yi4NCi1BY3Rpdml0eUFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE5VzogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0M2RcdTA0MzBcdTA0MzlcdTA0NDJcdTA0MzggXHUwNDNlXHUwNDM0XHUwNDM4XHUwNDNkIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0M2RcdTA0MzVcdTA0NDFcdTA0M2FcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2FcdTA0M2UgXHUwNDM4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzZVx1MDQzMi4gXHUwNDIxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0Mlx1MDQ0YiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0M2VcdTA0MzIgXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDRiIFx1MDQzZFx1MDQzNSBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIuDQotQWN0aXZpdHlEcm9wQ29tbWFuZF9kZWVwQ29weV9wcm9tcHRDb25maWd1cmF0aW9uTXNnPVx1MDQyMVx1MDQzYVx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0NDFcdTA0MzUgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiP1xuXG5cdTA0MWZcdTA0NDBcdTA0MzggXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDM1IFx1MDQxZFx1MDQzNVx1MDQ0MiBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIgXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDRiIFx1MDQ0Mlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQzZSBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGIsIFx1MDQ0Zlx1MDQzMlx1MDQzYlx1MDQ0Zlx1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNVx1MDQ0MVx1MDQ0ZiBcdTA0NDdcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NGNcdTA0NGUgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOC4NCi1kZWVwQ29weV9wcm9tcHRNc2c9XHUwNDExXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZFx1MDQ0YiBcdTA0M2FcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0MzggXHUwNDMyXHUwNDQxXHUwNDM1XHUwNDQ1IFx1MDQzNFx1MDQzOFx1MDQzZFx1MDQzMFx1MDQzY1x1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzOCBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyLCBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0MzUgXHUwNDMyXHUwNDNmXHUwNDNlXHUwNDQxXHUwNDNiXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQzMVx1MDQ0M1x1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2JcdTA0NGZcdTA0NDJcdTA0NGMuIFx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQ0Yz8NCi1kZWVwQ29weV90aXRsZT1cdTA0MjBcdTA0MzVcdTA0M2FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzJcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1DQotDQotIyBQcm9ncmVzcyBtZXNzYWdlcw0KLWNyZWF0aW5nUHJvY2Vzc0NvbXBvbmVudFRhc2tfbmFtZT1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNjXHUwNDNmXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMCAnJ3swfScnLi4uDQotcHJvY2Vzc2luZ1JlZmVyZW5jZXNUYXNrX25hbWU9XHUwNDFlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDNhXHUwNDMwIFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzZVx1MDQzYS4uLg0KLWRlbGV0aW5nRWxlbWVudHNUYXNrX25hbWU9XHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzZVx1MDQzMiBcdTA0MzggXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzZVx1MDQzMi4uLg0KLWNoZWNraW5nUmVmZXJlbmNlc1Rhc2tfbmFtZT1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M2FcdTA0MzAgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNlXHUwNDNhLi4uDQotcmVtb3ZpbmdSZWZlcmVuY2VzdGFza19uYW1lPVx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2VcdTA0M2EuLi4NCi1zYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lPVx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDNlXHUwNDMyLi4uDQotY2hlY2tBZmZlY3RlZFJlc291cmNlc1Rhc2tfbmFtZT1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M2FcdTA0MzAgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzZVx1MDQzMi4uLg0KLW1vdmluZ1Rhc2tfbmFtZT1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M2NcdTA0MzVcdTA0NDlcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUuLi4NCi1tb3ZpbmdGaWxlc1Rhc2tfbmFtZT1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M2NcdTA0MzVcdTA0NDlcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDNlXHUwNDMyLi4uDQotY29weWluZ1Jlc291cmNlc1Rhc2tfbmFtZT1cdTA0MWFcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNlXHUwNDMyLi4uDQotc2F2aW5nRmlsZVRhc2tfbmFtZT1cdTA0MjFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDMwICcnezB9JycuLi4NCi0NCi0jIFVJIFRleHQNCi1lbGVtZW50X3RleHQ9XHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyDQotY3JlYXRlRWxlbWVudF90ZXh0PVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDINCi1jcmVhdGVQcm9jZXNzX3RleHQ9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MQ0KLWNvbnRyaWJ1dGVzVG9fdGV4dD1cdTA0MTRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDINCi1sb2NhbENvbnRyaWJ1dGVzVG9fdGV4dD1cdTA0MWJcdTA0M2VcdTA0M2FcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2UgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDRmXHUwNDM1XHUwNDQyDQotZXh0ZW5kc190ZXh0PVx1MDQyMFx1MDQzMFx1MDQ0MVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQ0Zlx1MDQzNVx1MDQ0Mg0KLXJlcGxhY2VzX3RleHQ9XHUwNDE3XHUwNDMwXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDRmXHUwNDM1XHUwNDQyDQotbG9jYWxSZXBsYWNlc190ZXh0PVx1MDQxYlx1MDQzZVx1MDQzYVx1MDQzMFx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZSBcdTA0MzdcdTA0MzBcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDINCi1sb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHlfdGV4dD1cdTA0MWJcdTA0M2VcdTA0M2FcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDM3XHUwNDMwXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDMwIFx1MDQzOCBcdTA0NDBcdTA0MzVcdTA0M2FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzJcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1DQotZWxlbWVudFR5cGVfdGV4dD17MH06IHsxfQ0KLWRlbGl2ZXJhYmxlc190ZXh0PVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQzNVx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGINCi1jb250cmlidXRlVG9BY3Rpdml0eV90ZXh0PVx1MDQxZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1BY3Rpdml0eURyb3BDb21tYW5kX2xhYmVsPVx1MDQxZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1yZXBsYWNlQWN0aXZpdHlfdGV4dD1cdTA0MWVcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDM3XHUwNDMwXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDRiDQotZmlsZV90ZXh0PVx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYg0KLWRpcmVjdG9yeV90ZXh0PVx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMw0KLXVucmVzb2x2ZWRfdGV4dD0oXHUwNDNkXHUwNDM1XHUwNDNlXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0MiAnJ3swfScnKQ0KLWFzc2lzdHNfdGV4dD1cdTA0MWZcdTA0M2VcdTA0M2NcdTA0M2VcdTA0MzNcdTA0MzBcdTA0MzVcdTA0NDINCi11bmtub3duX3RleHQ9XHUwNDFkXHUwNDM1XHUwNDM4XHUwNDM3XHUwNDMyXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDNkXHUwNDNlDQotY29tbWFuZF9kb25lPVx1MDQxM1x1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQzMlx1MDQzZQ0KLQ0KLSMgVGhlIGZvbGxvd2luZyBVSSB0ZXh0IHNob3VsZCBiZSByZXZpZXdlZC4NCi1VdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eXdpdGhwbHVnaW5faW5mbz17MH0gKHsxfSAnJ3syfScnIFx1MDQzMiAnJ3szfScnKQ0KLVV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5X2luZm89ezB9ICh7MX0gJyd7Mn0nJykNCi11aV9yZWZfZGVsZXRlPVx1MDQxNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MCAnJ3swfScnIFx1MDQ0MVx1MDQzZVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQ0MiBcdTA0M2RcdTA0MzVcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0NDNcdTA0MzVcdTA0M2NcdTA0NGJcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4LlxuXHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmOg0KLXVpX3JlZl9kZWxldGUyPVx1MDQyMVx1MDQzYlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzggXHUwNDNkXHUwNDM4XHUwNDMzXHUwNDM0XHUwNDM1IFx1MDQzZFx1MDQzNSBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0NDNcdTA0NGVcdTA0NDJcdTA0NDFcdTA0NGYuXG5cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGY6DQotdWlfcmVmZXJlbmNlcz1cdTA0MjFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzgNCi11aV93b3JrcHJvZHVjdF9kZXNjcmlwdG9yX2Rlc2NyaXB0aW9uPVx1MDQxNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwICcnezB9JycgXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkIChcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0NGZcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDNlXHUwNDMxXHUwNDNlXHUwNDM5IFx1MDQzMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNCkgXHUwNDQxIFx1MDQzNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQzYyBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzggJyd7MX0nJw0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vcHRpb25zPVx1MDQxZlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQ0MFx1MDQ0Yg0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vdXRwdXRsYWJlbD1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzAgXHUwNDMyIFx1MDQzYVx1MDQzMFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNSBcdTA0MzJcdTA0NGJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzAgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOA0KLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9kZWxldGVfdGFzaz1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOCBcdTA0MzhcdTA0MzcgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX2RlZmF1bHRjb25maWdjaGVjaz1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyICcnezB9JycgXHUwNDNkXHUwNDM1IFx1MDQ0MVx1MDQzZVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0MzIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMCBcdTA0M2ZcdTA0M2UgXHUwNDQzXHUwNDNjXHUwNDNlXHUwNDNiXHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlLlxuXHUwNDE0XHUwNDNlXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzNVx1MDQzM1x1MDQzZSBcdTA0MzggXHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzOCBcdTA0MzIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzZlx1MDQzZSBcdTA0NDNcdTA0M2NcdTA0M2VcdTA0M2JcdTA0NDdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGU/DQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX2dlbmVyaWNFcnJfbWVzc2FnZV90ZXh0PVx1MDQxZlx1MDQ0MFx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzggXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzZFx1MDQzOFx1MDQzYVx1MDQzYlx1MDQzMCBcdTA0M2VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAuIFx1MDQxNFx1MDQzYlx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzAgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2RcdTA0MzBcdTA0MzZcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNkXHUwNDNlXHUwNDNmXHUwNDNhXHUwNDQzIFx1MDQyMVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uX25vRGVzY3JpcHRvclRvU3luY2g9XHUwNDFkXHUwNDM1IFx1MDQzZFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzZCBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDQxXHUwNDNlIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzYyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDFcdTA0MzhcdTA0M2RcdTA0NDVcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9yZWZlcnNoaW5ndmlld2VyPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzggXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzMA0KLWNvbmZpcm1fcmVtb3ZlX3JlZmVyZW5jZXNfdGV4dD1cdTA0MWZcdTA0M2VcdTA0NDFcdTA0M2JcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzMiBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0NDdcdTA0MzhcdTA0NDFcdTA0M2JcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwXHUwNDQ1IFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzZFx1MDQ0M1x1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2RcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0NGJcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4IFx1MDQzZFx1MDQzMCBcdTA0NGRcdTA0NDJcdTA0M2UgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1LiBcdTA0MWRcdTA0MzBcdTA0MzZcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDFlXHUwNDFhLCBcdTA0NDdcdTA0NDJcdTA0M2VcdTA0MzFcdTA0NGIgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQ0NSBcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDNiXHUwNDM2XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZS4NCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl91bmhhbmRsZWRfZXhjZXB0aW9uPVx1MDQxZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzMFx1MDQ0Mlx1MDQ0Ylx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzY1x1MDQzMFx1MDQ0ZiBcdTA0MzhcdTA0NDFcdTA0M2FcdTA0M2JcdTA0NGVcdTA0NDdcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDQxXHUwNDM4XHUwNDQyXHUwNDQzXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9icmVha2Rvd25fZWxlbWVudD1cdTA0MWVcdTA0MzRcdTA0MzhcdTA0M2QgXHUwNDM4IFx1MDQ0Mlx1MDQzZVx1MDQ0MiBcdTA0MzZcdTA0MzUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0M1x1MDQ0MFx1MDQ0YiBcdTA0M2RcdTA0MzUgXHUwNDNjXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDQyIFx1MDQzMVx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0M2VcdTA0MzRcdTA0M2RcdTA0M2VcdTA0MzJcdTA0NDBcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0M2RcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQ4XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDNjIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0NDFcdTA0M2JcdTA0MzVcdTA0MzRcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0M2MNCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd3BsaXN0ZGxnX21zZz1cdTA0MjBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyICcnezB9JycgXHUwNDRmXHUwNDMyXHUwNDNiXHUwNDRmXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQ0Ylx1MDQzYyBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDQxXHUwNDNiXHUwNDM1XHUwNDM0XHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDQ1IFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0Ny5cblx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzgsIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGJcdTA0NDUgXHUwNDQxXHUwNDNiXHUwNDM1XHUwNDM0XHUwNDQzXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDFcdTA0M2VcdTA0M2VcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDM0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiLg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9yb2xlbGlzdGRsZ19tc2c9XHUwNDIwXHUwNDNlXHUwNDNiXHUwNDRjICcnezB9JycgXHUwNDQxXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDQyIFx1MDQzZFx1MDQzOFx1MDQzNlx1MDQzNVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQ0N1x1MDQzOFx1MDQ0MVx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2VcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0Yi5cblx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiLCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDQ1IFx1MDQ0MVx1MDQzYlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDNlXHUwNDNlXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQzNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Yi4NCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9mYXRhbGVycj1cdTA0MWRcdTA0MzVcdTA0NDNcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0M2NcdTA0MzBcdTA0NGYgXHUwNDNlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dvcmtwcm9kdWN0cz1cdTA0MjBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9zdWJfZWxlbWVudD1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDRiIFx1MDQ0MVx1MDQzZSBcdTA0NDFcdTA0MzJcdTA0M2VcdTA0MzhcdTA0M2MgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDNjDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfd3JvbmdfZWxlbWVudD1cdTA0MWNcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2UgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQ0YyBcdTA0NDJcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2FcdTA0M2UgXHUwNDQxIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQzY1x1MDQzOCBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NDNcdTA0NDBcdTA0NGIgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmLg0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX2NoaWxkX2VsZW1lbnQ9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0M1x1MDQ0MFx1MDQ0YiBcdTA0NDEgXHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzNFx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQ0MFx1MDQzZFx1MDQzOFx1MDQzYyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0M2MuDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3Rhc2tzPVx1MDQxN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOA0KLXVpX2Fzc29jaWF0aW9uX3Rhc2tfc2VsZWN0aW9uPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzZVx1MDQ0MCBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzguLi4NCi11dGlsX1Byb2Nlc3NVdGlsX2NoaWxkYWRhcHRlcj1cIFwgXHUwNDMwXHUwNDM0XHUwNDMwXHUwNDNmXHUwNDQyXHUwNDM1XHUwNDQwIFx1MDQzNFx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQ0MFx1MDQzZFx1MDQzNVx1MDQzM1x1MDQzZToNCi0NCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zZXRwYXJlbnQ9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzRcdTA0M2VcdTA0NDdcdTA0MzVcdTA0NDBcdTA0M2RcdTA0MzVcdTA0MzNcdTA0M2UNCi11dGlsX3RuZ3V0aWxfY2Fubm90X2VkaXRfcmVzb3VyY2U9XHUwNDFkXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDEuDQotdXRpbF9Qcm9jZXNzVXRpbF9jb250cmlidXRlc3RvPVx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQ0Zlx1MDQzNVx1MDQ0MiAnJ3swfScnDQotdXRpbF9Qcm9jZXNzVXRpbF9sb2NhbENvbnRyaWJ1dGVzdG89XHUwNDNiXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQ0Zlx1MDQzNVx1MDQ0MiAnJ3swfScnDQotcHJvY2Vzc19leHRlbmRzPVx1MDQ0MFx1MDQzMFx1MDQ0MVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQ0Zlx1MDQzNVx1MDQ0MiAnJ3swfScnDQotcHJvY2Vzc19yZXBsYWNlcz1cdTA0MzdcdTA0MzBcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDIgJyd7MH0nJw0KLXByb2Nlc3NfbG9jYWxSZXBsYWNlcz1cdTA0M2JcdTA0M2VcdTA0M2FcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2UgXHUwNDM3XHUwNDMwXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDRmXHUwNDM1XHUwNDQyICcnezB9JycNCi0jIEZpbHRlciBjb25zdGFudHMgZXh0ZXJuYWxpemVkIHN0cmluZ3MuDQotRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVzX3RleHQ9XHUwNDE0XHUwNDM4XHUwNDQxXHUwNDQ2XHUwNDM4XHUwNDNmXHUwNDNiXHUwNDM4XHUwNDNkXHUwNDRiDQotRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVncm91cGluZ3NfdGV4dD1cdTA0MTNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NGIgXHUwNDM0XHUwNDM4XHUwNDQxXHUwNDQ2XHUwNDM4XHUwNDNmXHUwNDNiXHUwNDM4XHUwNDNkDQotRmlsdGVyQ29uc3RhbnRzX3doaXRlcGFwZXJzX3RleHQ9XHUwNDE4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDNlXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzMVx1MDQ0ZVx1MDQzYlx1MDQzYlx1MDQzNVx1MDQ0Mlx1MDQzNVx1MDQzZFx1MDQzOA0KLUZpbHRlckNvbnN0YW50c190b29sbWVudG9yc190ZXh0PVx1MDQyMFx1MDQ0M1x1MDQzYVx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzMCBcdTA0M2ZcdTA0M2UgXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwXHUwNDNjDQotRmlsdGVyQ29uc3RhbnRzX3Rvb2xzX3RleHQ9XHUwNDE4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiDQotRmlsdGVyQ29uc3RhbnRzX3JvbGVzX3RleHQ9XHUwNDIwXHUwNDNlXHUwNDNiXHUwNDM4DQotRmlsdGVyQ29uc3RhbnRzX3Rhc2tzX3RleHQ9XHUwNDE3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4DQotRmlsdGVyQ29uc3RhbnRzX3JldXNhYmxlYXNzZXRzX3RleHQ9XHUwNDFjXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM1IFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQ0Yg0KLUZpbHRlckNvbnN0YW50c19hbGxfdGV4dD1cdTA0MTJcdTA0NDFcdTA0MzUNCi1GaWx0ZXJDb25zdGFudHNfcHJvY2Vzc2VzX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDRiDQotRmlsdGVyQ29uc3RhbnRzX3ByYWN0aWNlc190ZXh0PVx1MDQxZlx1MDQ0MFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzOFx1MDQzYVx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1GaWx0ZXJDb25zdGFudHNfdGVtcGxhdGVzX3RleHQ9XHUwNDI4XHUwNDMwXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNkXHUwNDRiDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0c190ZXh0PVx1MDQyMFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGINCi1GaWx0ZXJDb25zdGFudHNfY2hlY2tsaXN0c190ZXh0PVx1MDQyMVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0NGINCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGVsaW5lc190ZXh0PVx1MDQyMFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLUZpbHRlckNvbnN0YW50c19yb2xlc2V0c190ZXh0PVx1MDQxZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkNCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGFuY2VfdGV4dD1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYNCi1GaWx0ZXJDb25zdGFudHNfY29uY2VwdHNfdGV4dD1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDZcdTA0MzVcdTA0M2ZcdTA0NDZcdTA0MzhcdTA0MzgNCi1GaWx0ZXJDb25zdGFudHNfZXhhbXBsZXNfdGV4dD1cdTA0MWZcdTA0NDBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0NDBcdTA0NGINCi1GaWx0ZXJDb25zdGFudHNfY29udGVudHBhY2thZ2VzX3RleHQ9XHUwNDFmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyXHUwNDRiIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMg0KLUZpbHRlckNvbnN0YW50c19yb2xlZGVzY3JpcHRvcnNfdGV4dD1cdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGIgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM1XHUwNDM5DQotRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRncm9wdWluZ3NfdGV4dD1cdTA0MTNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NGIgXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMyIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOQ0KLUZpbHRlckNvbnN0YW50c190YXNrZGVzY3JpcHRvcnNfdGV4dD1cdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGIgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3DQotRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRlbGVtZW50c190ZXh0PVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzINCi1Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uX3ByZXBhcmU9XHUwNDFmXHUwNDNlXHUwNDM0XHUwNDMzXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDMyXHUwNDNhXHUwNDMwIFx1MDQzYSBcdTA0NDFcdTA0MzhcdTA0M2RcdTA0NDVcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguLi4NCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RkZXNjcmlwdG9yc190ZXh0PVx1MDQxNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0NDUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDMyDQotRmlsdGVyQ29uc3RhbnRzX2FsbGNvbnRlbnRlbGVtZW50c190ZXh0PVx1MDQxMlx1MDQ0MVx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyDQotRmlsdGVyQ29uc3RhbnRzX3N1cHBvcnRpbmdtYXRlcmlhbHNfdGV4dD1cdTA0MjFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiDQotTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfZXJyb3JTYXZpbmdGaWxlcz1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0M2VcdTA0MzINCi1GaWx0ZXJDb25zdGFudHNfY3VzdG9tY2F0ZWdvcmllc190ZXh0PVx1MDQxZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzNSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzgNCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3R0eXBlc190ZXh0PVx1MDQyMlx1MDQzOFx1MDQzZlx1MDQ0YiBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0NDUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDMyDQotRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRfd2FybmluZ01zZz1cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDNlIFx1MDQ0MSBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDNcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzZcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGZcdTA0M2NcdTA0MzgNCi1GaWx0ZXJDb25zdGFudHNfbWV0aG9kcGx1Z2luc190ZXh0PVx1MDQxY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfbG9ja2VkUGx1Z2luPUlVUEwwMTIwRTogXHUwNDFjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRjICcnezB9JycgXHUwNDM3XHUwNDMwXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNhXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkLg0KLUZpbHRlckNvbnN0YW50c19kb21haW5zX3RleHQ9XHUwNDE0XHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDRiDQotRmlsdGVyQ29uc3RhbnRzX3JvYWRtYXBfdGV4dD1cdTA0MWZcdTA0NDNcdTA0NDJcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0MzgNCi1GaWx0ZXJDb25zdGFudHNfcmVwb3J0c190ZXh0PVx1MDQxZVx1MDQ0Mlx1MDQ0N1x1MDQzNVx1MDQ0Mlx1MDQ0Yg0KLUF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWw9Jlx1MDQyMVx1MDQzOFx1MDQzZFx1MDQ0NVx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzOFx1MDQzN1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0M2ZcdTA0M2UgXHUwNDQzXHUwNDNjXHUwNDNlXHUwNDNiXHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlIFx1MDQzOFx1MDQzNyBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotTWFudWFsU3luY2hyb25pemVDb21tYW5kX2xhYmVsPSZcdTA0MWZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgXHUwNDQxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmLi4uDQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9zdWNlc3NmdWw9XHUwNDIxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIFx1MDQzMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzMCBcdTA0NDNcdTA0NDFcdTA0M2ZcdTA0MzVcdTA0NDhcdTA0M2RcdTA0M2UuDQotDQotIyBVc2VySW50ZXJhY3Rpb25IZWxwZXINCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfUHJvY2Vzc1BhY2thZ2VfTmFtZT1cdTA0MThcdTA0M2NcdTA0NGY6DQotDQotIyBNZXRob2RDcmVhdGVDaGlsZENvbW1hbmQNCi1uZXdFbGVtZW50X3RleHQ9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIHswfQ0KLXVwZGF0ZV9vdXRvZnN5bmNoX3RpdGxlPVx1MDQxZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0M2JcdTA0MzhcdTA0M2FcdTA0NDINCi11cGRhdGVfb3V0b2ZzeW5jaF9tc2c9XHUwNDI0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiIFx1MDQzMVx1MDQ0Ylx1MDQzYlx1MDQzOCBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NGIgXHUwNDMyIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzOSBcdTA0NDFcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzVcdTA0M2NcdTA0MzUuIFx1MDQxN1x1MDQzMFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGY/DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMmEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDJhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMmEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDJhLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMmEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRjYzYzNDEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMmEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ3MGJiYjMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBMaWJyYXJ5IEVkaXQgKE5MMmEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDJhL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGU2ODIzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RhLnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZmVjMjJlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBiaWJsaW90ZWtzcmVkaWdlcmluZw0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLV9VSV9Db250ZW50X2dyb3VwPU1ldG9kZWluZGhvbGQNCi0NCi1fVUlfRGlzY2lwbGluZXNfZ3JvdXA9RGlzY2lwbGluZXINCi1fVUlfRG9tYWluc19ncm91cD1Eb21cdTAwZTZuZXINCi1fVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cD1BcmJlamRzcHJvZHVrdHR5cGVyDQotX1VJX1JvbGVfU2V0c19ncm91cD1Sb2xsZXNcdTAwZTZ0DQotX1VJX1Rvb2xzX2dyb3VwPVZcdTAwZTZya3RcdTAwZjhqZXINCi1fVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cD1TdGFuZGFyZGthdGVnb3JpZXINCi1fVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXA9VGlscGFzc2VkZSBrYXRlZ29yaWVyDQotX1VJX01ldGhvZENvbnRlbnRfZ3JvdXA9SW5kaG9sZHNwYWtrZXINCi0NCi1fVUlfUHJvY2Vzc2VzX2dyb3VwPVByb2Nlc3Nlcg0KLV9VSV9QbGFubmluZ1RlbXBsYXRlc19ncm91cD1QbGFubFx1MDBlNmduaW5nc3NrYWJlbG9uZXINCi0NCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5zX3RleHQ9RnVua3Rpb25zbVx1MDBmOG5zdHJlDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQ9TGV2ZXJpbmdzcHJvY2Vzc2VyDQotX1VJX1Byb2Nlc3NDb250cmlidXRpb25zX3RleHQ9Rm9yc2tlbHNwcm9jZXNzZXINCi1fVUlfUGxhbm5pbmdUZW1wbGF0ZXNfdGV4dD1QbGFubFx1MDBlNmduaW5nc3NrYWJlbG9uZXINCi0NCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1GdW5rdGlvbnNtXHUwMGY4bnN0ZXINCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3RleHQ9TGV2ZXJpbmdzcHJvY2VzDQotX1VJX1Byb2Nlc3NDb250cmlidXRpb25fdGV4dD1Gb3Jza2Vsc3Byb2Nlcw0KLQ0KLV9VSV9Db25maWd1cmF0aW9uc190ZXh0PUtvbmZpZ3VyYXRpb25lcg0KLQ0KLV9VSV9Qcm9jZXNzRmFtaWxpZXNfdGV4dD1Qcm9jZXNmYW1pbGllcg0KLQ0KLV9VSV9VbmNhdGVnb3JpemVkX3RleHQ9VWthdGVnb3Jpc2VyZXQNCi1fVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0PVVrYXRlZ29yaXNlcmVkZSBvcGdhdmVyDQotX1VJX1VuY2F0ZWdvcml6ZWRfUm9sZXNfdGV4dD1Va2F0YWdvcmlzZXJlZGUgcm9sbGVyDQotDQotX1VJX0d1aWRhbmNlc19ncm91cD1WZWpsZWRuaW5nDQotX1VJX0d1aWRhbmNlc19DaGVja2xpc3RzPVRqZWtsaXN0ZXINCi1fVUlfR3VpZGFuY2VzX0NvbmNlcHRzPUJlZ3JlYmVyDQotX1VJX0d1aWRhbmNlc19FeGFtcGxlcz1Fa3NlbXBsZXINCi1fVUlfR3VpZGFuY2VzX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucz1Fc3RpbWVyaW5nc292ZXJ2ZWplbHNlcg0KLV9VSV9HdWlkYW5jZXNfUHJhY3RpY2VzPVx1MDBkOHZlbHNlcg0KLV9VSV9HdWlkYW5jZXNfUmVwb3J0cz1SYXBwb3J0ZXINCi1fVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzPUdlbmFudmVuZGVsaWdlIGFrdGl2ZXINCi1fVUlfR3VpZGFuY2VzX1JvYWRtYXA9VmVqdmlzZXINCi1fVUlfR3VpZGFuY2VzX1N1cHBvcnRpbmdNYXRlcmlhbHM9U3RcdTAwZjh0dGVtYXRlcmlhbGUNCi1fVUlfR3VpZGFuY2VzX1RlY2huaXF1ZXM9VGVrbmlra2VyDQotX1VJX0d1aWRhbmNlc19UZW1wbGF0ZXM9U2thYmVsb25lcg0KLV9VSV9HdWlkYW5jZXNfVGVybURlZmluaXRpb25zPVVkdHJ5a3NkZWZpbml0aW9uZXINCi1fVUlfR3VpZGFuY2VzX1Rvb2xNZW50b3JzPVZcdTAwZTZya3RcdTAwZjhqc21lbnRvcmVyDQotX1VJX0d1aWRhbmNlc19XaGl0ZXBhcGVycz1IdmlkYlx1MDBmOGdlcg0KLV9VSV9HdWlkYW5jZXNfV29ya1Byb2R1Y3RHdWlkZWxpbmVzPVJldG5pbmdzbGluamVyDQotDQotDQotX1VJX1JvbGVzX2dyb3VwPVJvbGxlcg0KLV9VSV9UYXNrc19ncm91cD1PcGdhdmVyDQotX1VJX1dvcmtQcm9kdWN0c19ncm91cD1BcmJlamRzcHJvZHVrdGVyDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2FlNTc5NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXNfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEdlbmVyaWMgRGlhbG9nIFRpdGxlcw0KLW1vdmVEaWFsb2dfdGl0bGU9Rmx5dA0KLWRlbGV0ZURpYWxvZ190aXRsZT1TbGV0IGVsZW1lbnQNCi1lcnJvckRpYWxvZ190aXRsZT1GZWpsDQotZXJyb3JEaWFsb2dfY2Fubm90UmVuYW1lPUthbiBpa2tlIG9tZFx1MDBmOGJlIHswfSAnJ3sxfScnIHRpbCAnJ3syfScnLiBMXHUwMGY4cyBwcm9ibGVtZXQsIHNvbSBlciB2aXN0IGkgT3BseXNuaW5nZXIsIG9nIGtsaWsgcFx1MDBlNSBPSyBmb3IgYXQgZm9ydHNcdTAwZTZ0dGUgZWxsZXIgQW5udWxsXHUwMGU5ciBmb3IgYXQgYWZicnlkZSBmdW5rdGlvbmVuLg0KLQ0KLSMgQ29uZmlybSBSZWZlcmVuY2VzIFJlbW92YWwgRGlhbG9nDQotZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190aXRsZT1CZWtyXHUwMGU2ZnQgZmplcm5lbHNlIGFmIHJlZmVyZW5jZXINCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RleHQ9QW5kcmUgZWxlbWVudGVyIGkgbWV0b2RlYmlibGlvdGVrZXQgcmVmZXJlcmVyIHN0YWRpZyB0aWwgZGV0IGVsbGVyIGRlIGVsZW1lbnRlciwgZHUgZXIgdmVkIGF0IHNsZXR0ZS4gSHZpcyBkdSBzbGV0dGVyIGVsZW1lbnRlcm5lLCBibGl2ZXIgcmVmZXJlbmNlcm5lIHRpbCBkZW0gZmplcm5ldCwgb2cgZGUgcmVmZXJlcmVuZGUgZWxlbWVudGVyIGJsaXZlciBkZXJmb3Igb2dzXHUwMGU1IG9wZGF0ZXJldC4gS29udHJvbGxcdTAwZTlyLCBhdCBkdSBoYXIgdGlsbGFkZWxzZSB0aWwgYXQgb3BkYXRlcmUgZGUgcmVmZXJlcmVuZGUgZWxlbWVudGVyLCBmXHUwMGY4ciBkdSBrbGlra2VyIHBcdTAwZTUgT0suIEtsaWsgcFx1MDBlNSBPcGx5c25pbmdlciBmb3IgYXQgZ2VubmVtc2UgbGlzdGVuIG92ZXIgZWxlbWVudGVyLCBzb20gcmVmZXJlcmVyIHRpbCBkZXQgZWxsZXIgZGUgZWxlbWVudGVyLCBkdSBlciB2ZWQgYXQgc2xldHRlLg0KLQ0KLSMgUmVzb2x2ZSBOYW1lIENvbmZsaWN0IERpYWxvZw0KLXJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGl0bGU9QWZrbGFyIGVsZW1lbnRuYXZuZWtvbmZsaWt0DQotcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0PUFuZ2l2IGV0IG55dCB7MH0gZm9yICcnezF9Jyc6DQotDQotIyBTZWxlY3QgRGVsaXZlcmFibGVzIERpYWxvZw0KLXNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190aXRsZT1WXHUwMGU2bGcgbGV2ZXJhbmNlcg0KLXNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190ZXh0PVZcdTAwZTZsZyBlbiBsZXZlcmFuY2UsIGh2b3IgYXJiZWpkc3Byb2R1a3RldCAnJ3swfScnIHNrYWwgdGlsZGVsZXMuDQotDQotIyBOZXcgUHJvY2VzcyBDb21wb25lbnQgRGlhbG9nDQotbmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZ190aXRsZT1OeSBwcm9jZXNrb21wb25lbnQNCi1uYW1lTGFiZWxfdGV4dD1OYXZuOg0KLWRlZmF1bHRDb25maWdMYWJlbF90ZXh0PVN0YW5kYXJka29uZmlndXJhdGlvbjoNCi1iYXNlUHJvY2Vzc0xhYmVsX3RleHQ9QmFzaXNwcm9jZXM6DQotYmFzZWRPblByb2Nlc3Nlc0xhYmVsX3RleHQ9QmFzZXJldCBwXHUwMGU1IHByb2Nlc3NlcjoNCi0NCi0jIFJvbGUgQXNzb2NpYXRpb24gRGlhbG9nDQotc2VsZWN0QXNzb2NpYXRpb25MYWJlbF90ZXh0PVZcdTAwZTZsZyB0aWxrbnl0bmluZyBmb3Igb3BnYXZlbiAnJ3swfScnDQotDQotIyBSZW1vdmUgQXNzb2NpYXRpb24gZGlhbG9nDQotcmVtb3ZlQXNzb2NpYXRpb25EaWFsb2dfdGV4dD1GamVybiB0aWxrbnl0bmluZw0KLQ0KLSMgU2VsZWN0IFRlYW1zIERpYWxvZw0KLXNlbGVjdFRlYW1zRGlhbG9nX3RpdGxlPVZcdTAwZTZsZyB0ZWFtcw0KLXNlbGVjdFRlYW1zRGlhbG9nX3RleHQ9Vlx1MDBlNmxnIGV0IHRlYW0sIGh2b3Igcm9sbGVuICcnezB9Jycgc2thbCB0aWxkZWxlcy4NCi0NCi0jIFRhc2wgU2VsZWN0aW9uIERpYWxvZw0KLXRhc2tTZWxlY3Rpb25EaWFsb2dfdGl0bGU9T3BnYXZldmFsZw0KLXRpdGxlTGFiZWxfdGV4dD1WXHUwMGU2bGcgb3BnYXZlci4uLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEwwMTAwRTogTmF2bmV0IHBcdTAwZTUgezB9IG1hbmdsZXIuXG5cbkFsbGUgbWV0b2RlLSBvZyBwcm9jZXNlbGVtZW50ZXIgc2thbCBoYXZlIGV0IG5hdm4uXG5cbkFuZ2l2IGV0IGd5bGRpZ3QgbmF2biwgb2cgcHJcdTAwZjh2IGlnZW4uDQotZW1wdHlFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c9TmF2bmV0IHNrYWwgdWRmeWxkZXMuIEFuZ2l2IGV0IGd5bGRpZ3QgbmF2bi4NCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZz1JVVBMMDEwMUU6IE5hdm5ldCAnJ3swfScnIGZpbmRlcyBhbGxlcmVkZS5cblxuRXQgbWV0b2RlZWxlbWVudCBza2FsIGhhdmUgZXQgZW50eWRpZ3QgbmF2bi5cblxuQW5naXYgZXQgYW5kZXQgbmF2biwgb2cgcHJcdTAwZjh2IGlnZW4uDQotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnPUVsZW1lbnRuYXZuZXQgZmluZGVzIGFsbGVyZWRlLiBBbmdpdiBldCBhbmRldCBuYXZuLg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMV9tc2c9SVVQTDAxMDJFOiBOYXZuZXQgJyd7MH0nJyBlciB1Z3lsZGlndC5cblxuRXQgbWV0b2RlZWxlbWVudG5hdm4gbVx1MDBlNSBpa2tlIHN0YXJ0ZSBtZWQgZXQgbWVsbGVtcnVtLlxuXG5BbmdpdiBldCBneWxkaWd0IG5hdm4sIG9nIHByXHUwMGY4diBpZ2VuLg0KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMl9tc2c9SVVQTDAxMDNFOiBOYXZuZXQgJyd7MH0nJyBlciB1Z3lsZGlndC5cblxuRXQgbWV0b2RlZWxlbWVudG5hdm4gbVx1MDBlNSBpa2tlIHNsdXR0ZSBtZWQgZXQgcHVua3R1bS5cblxuQW5naXYgZXQgZ3lsZGlndCBuYXZuLCBvZyBwclx1MDBmOHYgaWdlbi4NCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjNfbXNnPUlVUEwwMTA0RTogTmF2bmV0ICcnezB9JycgZXIgdWd5bGRpZ3QuXG5cbkV0IG1ldG9kZWVsZW1lbnRuYXZuIG1cdTAwZTUgaWtrZSBpbmRlaG9sZGUgZlx1MDBmOGxnZW5kZSB0ZWduOiBcXCAvIDogKiA/ICIgPCA+IDsgfFxuXG5BbmdpdiBldCBneWxkaWd0IG5hdm4sIG9nIHByXHUwMGY4diBpZ2VuLg0KLW5vQ29uZmlnRXJyb3JfbXNnPUlVUEwwMTA1RTogRGV0IGFrdHVlbGxlIG1ldG9kZWJpYmxpb3RlayBpbmRlaG9sZGVyIGluZ2VuIG1ldG9kZWtvbmZpZ3VyYXRpb24uXG5cbkRlciBza2FsIGJydWdlcyBlbiBtZXRvZGVrb25maWd1cmF0aW9uIHRpbCBhdCBvcHJldHRlIGVuIG55IHByb2Nlcy5cblxuT3ByZXQgZW4gbWV0b2Rla29uZmlndXJhdGlvbiwgb2cgcHJcdTAwZjh2IGlnZW4uDQotbm9EZWxpdmVyeVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDZFOiBEZXQgYWt0dWVsbGUgbWV0b2RlYmlibGlvdGVrIGluZGVob2xkZXIgaW5nZW4gbGV2ZXJpbmdzcHJvY2VzLlxuXG5EZXIgc2thbCBicnVnZXMgZW4gYmFzaXNsZXZlcmluZ3Nwcm9jZXMgdGlsIGF0IG9wcmV0dGUgZXQgbnl0IHByb2Nlc2JpZHJhZy5cblxuT3ByZXQgZW4gbGV2ZXJpbmdzcHJvY2VzLCBvZyBwclx1MDBmOHYgaWdlbi4NCi1ub0RlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQTDAxMDdFOiBEZXIgZXIgaWtrZSB2YWxndCBlbiBtZXRvZGVrb25maWd1cmF0aW9uLlxuXG5EZXIgc2thbCB0aWxkZWxlcyBlbiBzdGFuZGFyZG1ldG9kZWtvbmZpZ3VyYXRpb24gdGlsIGRlbiBueWUgcHJvY2VzLlxuXG5WXHUwMGU2bGcgZW4gbWV0b2Rla29uZmlndXJhdGlvbiwgb2cgcHJcdTAwZjh2IGlnZW4uDQotbm9CYXNlUHJvY2Vzc0Vycm9yX21zZz1JVVBMMDEwOEU6IERlciBlciBpa2tlIHZhbGd0IGVuIGxldmVyaW5nc3Byb2Nlcy5cblxuRXQgcHJvY2VzYmlkcmFnIGtyXHUwMGU2dmVyIGVuIGJhc2lzbGV2ZXJpbmdzcHJvY2VzLlxuXG5WXHUwMGU2bGcgZW4gbGV2ZXJpbmdzcHJvY2VzLCBvZyBwclx1MDBmOHYgaWdlbi4NCi1jcmVhdGVQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA5RTogUHJvY2Vzc2VuIGthbiBpa2tlIG9wcmV0dGVzLg0KLWNyZWF0ZUVsZW1lbnRFcnJvcl9tc2c9SVVQTDAxMTBFOiBFbGVtZW50ZXQga2FuIGlra2Ugb3ByZXR0ZXMuDQotZGVsZXRlRWxlbWVudEVycm9yX21zZz1JVVBMMDExMUU6IEVsZW1lbnRldCBrYW4gaWtrZSBzbGV0dGVzLg0KLWR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3JfbXNnPUlVUEwwMTEyRTogSW5kaG9sZHNmaWxlbiBmb3IgZWxlbWVudGV0IGthbiBpa2tlIG9wcmV0dGVzLlxuXG5GaWxlbiAnJ3swfScnIGZpbmRlcyBhbGxlcmVkZS5cblxuQW5naXYgZXQgYW5kZXQgbmF2biwgb2cgcHJcdTAwZjh2IGlnZW4uDQotZHVwbGljYXRlQ29udGVudEZpbGVFcnJvcl9zaW1wbGVfbXNnPUVuIGluZGhvbGRzZmlsIG1lZCBzYW1tZSBuYXZuIGZpbmRlcyBhbGxlcmVkZS4gQW5naXYgZXQgYW5kZXQgbmF2bi4NCi11bmRvQ29tbWFuZEVycm9yX21zZz1JVVBMMDExM0U6IEZvcnRyeWRlbHNlc2tvbW1hbmRvZW4gJyd7MH0nJyBrYW4gaWtrZSB1ZGZcdTAwZjhyZXMuXG5cbkRlciBlciBvcHN0XHUwMGU1ZXQgZW4gZmVqbDogezF9DQotaW52YWxpZFByZWRlY2Vzc29yRXJyb3JfbXNnPUlVUEwwMTE0RTogRGV0IGFuZ2l2bmUgZm9yZ1x1MDBlNm5nZXJpbmRla3MgZXIgdWd5bGRpZ3QuXG5cbkV0IGZvcmdcdTAwZTZuZ2VyaW5kZWtzIHNrYWwgdlx1MDBlNnJlIGVuIGhlbHRhbHN2XHUwMGU2cmRpIGZyYSBrb2xvbm5lbiAnSW5kZWtzJy5cblxuQW5naXYgZW4gZ3lsZGlnIHZcdTAwZTZyZGksIG9nIHByXHUwMGY4diBpZ2VuLg0KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHM9SVVQTDAxMDBXOiAnJ3swfScnIGVyIGFsbGVyZWRlIGtueXR0ZXQgdGlsICcnezF9JycuIEt1biBcdTAwZTluIHRpbGtueXRuaW5nIGFmIGRlbm5lIHR5cGUgZXIgdGlsbGFkdC4gSHZpcyBkdSB2aWwga255dHRlICcnezB9JycgdGlsICcnezJ9JycsIHNrYWwgZHUgZlx1MDBmOHJzdCBmamVybmUgZGVuIGZyYSAnJ3sxfScnLg0KLWVycm9yX21zZ1dpdGhEZXRhaWxzPUlVUEwwMTE2RTogRGVyIGVyIG9wc3RcdTAwZTVldCBlbiBmZWpsLiBLbGlrIHBcdTAwZTUgT3BseXNuaW5nZXIgZm9yIGF0IGZcdTAwZTUgZmxlcmUgb3BseXNuaW5nZXIuDQotZXJyb3JfbXNnPUlVUEwwMTE3RTogRGVyIGVyIG9wc3RcdTAwZTVldCBlbiBmZWpsLiBEZXIgZXIgZmxlcmUgb3BseXNuaW5nZXIgaSBmZWpsbG9nZ2VuLg0KLVN1cHByZXNzaW9uX25hbWVEdXBsaWNhdGlvbj1JVVBMMDExOEU6IERlciB2aWwgb3BzdFx1MDBlNSBlbiBuYXZuZWtvbmZsaWt0IGVmdGVyIGRlbm5lIGZ1bmt0aW9uLiBVbmRlcnNcdTAwZjhnLCBvbSBkZXIgZXIgc2FtbWVuZmFsZCBtaHQuIGVsZW1lbnRldHMgbmF2biwgb2cgcHJcdTAwZjh2IGlnZW4uDQotU3VwcHJlc3Npb25fcHJlc2VudGF0aW9uTmFtZUR1cGxpY2F0aW9uPUlVUEwwMTE5RTogRGVyIHZpbCBvcHN0XHUwMGU1IGVuIG5hdm5la29uZmxpa3QgZWZ0ZXIgZGVubmUgZnVua3Rpb24uIFVuZGVyc1x1MDBmOGcsIG9tIGRlciBlciBzYW1tZW5mYWxkIG1odC4gZWxlbWVudGV0cyBwclx1MDBlNnNlbnRhdGlvbnNuYXZuLCBvZyBwclx1MDBmOHYgaWdlbi4NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249RGVyIGVyIG9wc3RcdTAwZTVldCBlbiBmZWpsLiBLbGlrIHBcdTAwZTUgT3BseXNuaW5nZXIgZm9yIGF0IGZcdTAwZTUgZmxlcmUgb3BseXNuaW5nZXIuDQotc2F2ZVByb2Nlc3NFcnJvcl9yZWFzb249RGVyIGVyIG9wc3RcdTAwZTVldCBlbiBmZWpsIHVuZGVyIGxhZ3JpbmcgYWYgcHJvY2Vzc2VuICcnezB9JycuIEtsaWsgcFx1MDBlNSBPcGx5c25pbmdlciBmb3IgYXQgZlx1MDBlNSBmbGVyZSBvcGx5c25pbmdlci4NCi1kZWxldGVSZWZlcmVuY2VzRXJyb3JfcmVhc29uPURlciBlciBvcHN0XHUwMGU1ZXQgZW4gZmVqbCB1bmRlciBmamVybmVsc2UgYWYgcmVmZXJlbmNlciwgZGVyIGVyIGtueXR0ZXQgdGlsIGRldHRlIGVsZW1lbnQuIEtsaWsgcFx1MDBlNSBPcGx5c25pbmdlciBmb3IgYXQgZlx1MDBlNSBmbGVyZSBvcGx5c25pbmdlci4NCi1zYXZlRmlsZUVycm9yX3JlYXNvbj1EZXIgZXIgb3BzdFx1MDBlNWV0IGVuIGZlamwgdW5kZXIgbGFncmluZyBhZiBmaWxlbiAnJ3swfScnLiBLbGlrIHBcdTAwZTUgT3BseXNuaW5nZXIgZm9yIGF0IGZcdTAwZTUgZmxlcmUgb3BseXNuaW5nZXIuDQotaW52YWxpZFJlZmVyZW5jZXNFcnJvcl9yZWFzb249RGVyIGVyIGZ1bmRldCBtZXRvZGVlbGVtZW50ZXIgbWVkIHVneWxkaWdlIHJlZmVyZW5jZXIgc29tIGZcdTAwZjhsZ2UgYWYga29waWVyaW5nIHBcdTAwZTUgdHZcdTAwZTZycyBhZiBwbHVnaW5zLlxuUmVmZXJlbmNlcm5lIGJsaXZlciBmamVybmV0LiBWaWwgZHUgZm9ydHNcdTAwZTZ0dGU/DQotdW5yZXNvbHZlZE9iamVjdEVycm9yX3JlYXNvbj1LYW4gaWtrZSBcdTAwZTZuZHJlIGV0IHVhZmtsYXJldCBvYmpla3Q6IHswfShVUkkgPSB7MX0pezJ9DQotDQotIyBXYXJuaW5nIG1lc3NhZ2VzDQotTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE4VzogRXQgZWxsZXIgZmxlcmUga2lsZGVlbGVtZW50ZXIgZmluZGVzIGlra2UuIFRpbGtueXR0ZWRlIGZpbGVyIGkgcmVzc291cmNlZm9sZGVyZW4gYmxpdmVyIGlra2Uga29waWVyZXQuDQotQWN0aXZpdHlBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZz1JVVBMMDExOVc6IEV0IGVsbGVyIGZsZXJlIGtpbGRlZWxlbWVudGVyIGZpbmRlcyBpa2tlLiBUaWxrbnl0dGVkZSBwcm9jZXNwYWtrZXIgYmxpdmVyIGlra2Uga29waWVyZXQuDQotQWN0aXZpdHlEcm9wQ29tbWFuZF9kZWVwQ29weV9wcm9tcHRDb25maWd1cmF0aW9uTXNnPVZpbCBkdSBrb3BpZXJlIGFsbGUgZGVza3JpcHRvcmVyP1xuXG5IdmlzIGR1IGtsaWtrZXIgcFx1MDBlNSBOZWosIGtvcGllcmVzIGt1biBkZSBkZXNrcmlwdG9yZXIsIGRlciBlciBkZWwgYWYgZGVuIGFrdHVlbGxlIGtvbmZpZ3VyYXRpb24uDQotZGVlcENvcHlfcHJvbXB0TXNnPUR1IG9wcmV0dGVyIGVuIGtvcGkgYWYgYWxsZSBkeW5hbWlzayBsaW5rZWRlIGVsZW1lbnRlciwgc29tIGR1IGZyZW1vdmVyIHNrYWwgdmVkbGlnZWhvbGRlIHNlcGFyYXQuIFZpbCBkdSBmb3J0c1x1MDBlNnR0ZT8NCi1kZWVwQ29weV90aXRsZT1EeWIga29waWVyaW5nDQotDQotIyBQcm9ncmVzcyBtZXNzYWdlcw0KLWNyZWF0aW5nUHJvY2Vzc0NvbXBvbmVudFRhc2tfbmFtZT1PcHJldHRlciBwcm9jZXNrb21wb25lbnRlbiAnJ3swfScnLi4uDQotcHJvY2Vzc2luZ1JlZmVyZW5jZXNUYXNrX25hbWU9QmVoYW5kbGVyIHJlZmVyZW5jZXIuLi4NCi1kZWxldGluZ0VsZW1lbnRzVGFza19uYW1lPVNsZXR0ZXIgZWxlbWVudGVyIG9nIHRpbGtueXR0ZWRlIGZpbGVyLi4uDQotY2hlY2tpbmdSZWZlcmVuY2VzVGFza19uYW1lPVVuZGVyc1x1MDBmOGdlciByZWZlcmVuY2VyLi4uDQotcmVtb3ZpbmdSZWZlcmVuY2VzdGFza19uYW1lPUZqZXJuZXIgcmVmZXJlbmNlci4uLg0KLXNhdmluZ01vZGlmaWVkRmlsZXNUYXNrX25hbWU9R2VtbWVyIFx1MDBlNm5kcmVkZSBmaWxlci4uLg0KLWNoZWNrQWZmZWN0ZWRSZXNvdXJjZXNUYXNrX25hbWU9VW5kZXJzXHUwMGY4Z2VyIHBcdTAwZTV2aXJrZWRlIHJlc3NvdXJjZXIuLi4NCi1tb3ZpbmdUYXNrX25hbWU9Rmx5dHRlci4uLg0KLW1vdmluZ0ZpbGVzVGFza19uYW1lPUZseXR0ZXIgZmlsZXIuLi4NCi1jb3B5aW5nUmVzb3VyY2VzVGFza19uYW1lPUtvcGllcmVyIHJlc3NvdXJjZXIuLi4NCi1jb3B5aW5nQWN0aXZpdGllc19tc2c9S29waWVyZXIgYWt0aXZpdGV0ZW4gJyd7MH0nJw0KLXNhdmluZ0ZpbGVUYXNrX25hbWU9R2VtbWVyIGZpbGVuICcnezB9JycuLi4NCi0NCi0jIFVJIFRleHQNCi1lbGVtZW50X3RleHQ9ZWxlbWVudA0KLWNyZWF0ZUVsZW1lbnRfdGV4dD1PcHJldCBlbGVtZW50DQotY3JlYXRlUHJvY2Vzc190ZXh0PU9wcmV0IHByb2Nlcw0KLWNvbnRyaWJ1dGVzVG9fdGV4dD1CaWRyYWdlciB0aWwNCi1sb2NhbENvbnRyaWJ1dGVzVG9fdGV4dD1CaWRyYWdlciBsb2thbHQgdGlsDQotZXh0ZW5kc190ZXh0PVVkdmlkZXINCi1yZXBsYWNlc190ZXh0PUVyc3RhdHRlcg0KLWxvY2FsUmVwbGFjZXNfdGV4dD1FcnN0YXR0ZXIgbG9rYWx0DQotbG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5X3RleHQ9TG9rYWwgZXJzdGF0bmluZyBvZyBkeWIga29waWVyaW5nDQotZWxlbWVudFR5cGVfdGV4dD17MH06IHsxfQ0KLWRlbGl2ZXJhYmxlc190ZXh0PUxldmVyYW5jZXINCi1jb250cmlidXRlVG9BY3Rpdml0eV90ZXh0PUJpZHJhZyB0aWwgYWt0aXZpdGV0DQotQWN0aXZpdHlEcm9wQ29tbWFuZF9sYWJlbD1TbGV0IGFrdGl2aXRldA0KLXJlcGxhY2VBY3Rpdml0eV90ZXh0PUVyc3RhdCBha3Rpdml0ZXQNCi1maWxlX3RleHQ9ZmlsDQotZGlyZWN0b3J5X3RleHQ9YmlibGlvdGVrDQotdW5yZXNvbHZlZF90ZXh0PSh1bFx1MDBmOHN0ICcnezB9JycpDQotYXNzaXN0c190ZXh0PUhqXHUwMGU2bHBlcg0KLXVua25vd25fdGV4dD1Va2VuZHQNCi1jb21tYW5kX2RvbmU9VWRmXHUwMGY4cnQNCi0NCi0jIFRoZSBmb2xsb3dpbmcgVUkgdGV4dCBzaG91bGQgYmUgcmV2aWV3ZWQuDQotVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHl3aXRocGx1Z2luX2luZm89ezB9ICh7MX0gJyd7Mn0nJyBpICcnezN9JycpDQotVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHlfaW5mbz17MH0gKHsxfSAnJ3syfScnKQ0KLXVpX3JlZl9kZWxldGU9RGVza3JpcHRvcmVuICcnezB9JycgaGFyIGZcdTAwZjhsZ2VuZGUgcmVmZXJlbmNlciwgc29tIGlra2UgYnJ1Z2VzIG5vZ2VuIHN0ZWRlci5cblZcdTAwZTZsZyBkZW0sIGR1IHZpbCBzbGV0dGU6DQotdWlfcmVmX2RlbGV0ZTI9Rlx1MDBmOGxnZW5kZSByZWZlcmVuY2VyIGJydWdlcyBpbmdlbiBzdGVkZXIuXG5WXHUwMGU2bGcgZGVtLCBkdSB2aWwgc2xldHRlOg0KLXVpX3JlZmVyZW5jZXM9UmVmZXJlbmNlcg0KLXVpX3dvcmtwcm9kdWN0X2Rlc2NyaXB0b3JfZGVzY3JpcHRpb249QXJiZWpkc3Byb2R1a3RkZXNrcmlwdG9yZW4gJyd7MH0nJyBlciB0aWxrbnl0dGV0IChPdXRwdXQgZnJhKSBtZWQgb3BnYXZlZGVza3JpcHRvcmVuICcnezF9JycNCi11aV93b3JrcHJvZHVjdGRlc2NyaXB0b3Jfb3B0aW9ucz1JbmRzdGlsbGluZ2VyDQotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX291dHB1dGxhYmVsPUZqZXJuIGFyYmVqZHNwcm9kdWt0ZGVza3JpcHRvciBzb20gb3V0cHV0IGZvciBvcGdhdmVkZXNrcmlwdG9yZW4NCi11aV93b3JrcHJvZHVjdGRlc2NyaXB0b3JfZGVsZXRlX3Rhc2s9U2xldCBvcGdhdmVkZXNrcmlwdG9yIGZyYSBha3Rpdml0ZXRlbg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9kZWZhdWx0Y29uZmlnY2hlY2s9RGVuIHZhbGd0ZSBlbGVtZW50ICcnezB9JycgZmluZGVzIGlra2UgaSBzdGFuZGFyZGtvbmZpZ3VyYXRpb25lbiBhZiBkaW4gcHJvY2VzLlxuVmlsIGR1IHRpbGZcdTAwZjhqZSBkZW4gb2cgZGVucyBhZmhcdTAwZTZuZ2lnaGVkZXIgdGlsIHN0YW5kYXJka29uZmlndXJhdGlvbmVuPw0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9nZW5lcmljRXJyX21lc3NhZ2VfdGV4dD1EZXIgZXIgb3BzdFx1MDBlNWV0IGZlamwgaSBmdW5rdGlvbmVuLiBLbGlrIHBcdTAwZTUgT3BseXNuaW5nZXIgZm9yIGF0IGZcdTAwZTUgZmxlcmUgb3BseXNuaW5nZXIuDQotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9ub0Rlc2NyaXB0b3JUb1N5bmNoPURlciBlciBpbmdlbiBkZXNrcmlwdG9yIG1lZCBsaW5rZXQgbWV0b2RlZWxlbWVudCwgc29tIGthbiBzeW5rcm9uaXNlcmVzLg0KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3JlZmVyc2hpbmd2aWV3ZXI9RmVqbCB1bmRlciBvcGZyaXNrbmluZyBhZiBmcmVtdmlzZXINCi1jb25maXJtX3JlbW92ZV9yZWZlcmVuY2VzX3RleHQ9RWxlbWVudChlciksIHNvbSBlciB2aXN0IHVuZGVyIE9wbHlzbmluZ2VyLCBrYW4gbXVsaWd2aXMgaGF2ZSB1Z3lsZGlnIHJlZmVyZW5jZSB0aWwgZGVubmUgdmVqbGVkbmluZyBlZnRlciBrb252ZXJ0ZXJpbmcuIEtsaWsgcFx1MDBlNSBPSyBmb3IgYXQgZmplcm5lIGRlbSBvZyBmb3J0c1x1MDBlNnR0ZS4NCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl91bmhhbmRsZWRfZXhjZXB0aW9uPVViZWhhbmRsZXQgdW5kdGFnZWxzZQ0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfYnJlYWtkb3duX2VsZW1lbnQ9S2FuIGlra2UgaGF2ZSBkZXQgc2FtbWUgbmVkYnJ5ZG5pbmdzZWxlbWVudCBzb20gZm9yZ1x1MDBlNm5nZXIgZWxsZXIgZWZ0ZXJmXHUwMGY4bGdlcg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93cGxpc3RkbGdfbXNnPUFyYmVqZHNwcm9kdWt0ZXQgJyd7MH0nJyBlciBldCBvdXRwdXQgdGlsIGZcdTAwZjhsZ2VuZGUgb3BnYXZlci5cblZcdTAwZTZsZyBkZSBvcGdhdmVyLCBzb20gZHUgdmlsIG9wcmV0dGUgZGUgdGlsc3ZhcmVuZGUgZGVza3JpcHRvcmVyIGZvci4NCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfcm9sZWxpc3RkbGdfbXNnPVJvbGxlbiAnJ3swfScnIGhhciBmXHUwMGY4bGdlbmRlIGFuc3ZhcmxpZ2UgYXJiZWpkc3Byb2R1a3Rlci5cblZcdTAwZTZsZyBkZSBhcmJlamRzcHJvZHVrdGVyLCBzb20gZHUgdmlsIG9wcmV0dGUgZGUgdGlsc3ZhcmVuZGUgZGVza3JpcHRvcmVyIGZvci4NCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9mYXRhbGVycj1Vb3ByZXR0ZWxpZyBmZWpsDQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dvcmtwcm9kdWN0cz1BcmJlamRzcHJvZHVrdGVyDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9zdWJfZWxlbWVudD1LYW4gaWtrZSBsaW5rZSBldCBuZWRicnlkbmluZ3NlbGVtZW50IHRpbCBldCBhZiBkZXRzIHVuZGVyZWxlbWVudGVyDQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfd3JvbmdfZWxlbWVudD1LYW4gaWtrZSBsaW5rZSB0aWwgZXQgYW5kZXQgZWxlbWVudCBlbmQgYXJiZWpkc25lZGJyeWRuaW5nc2VsZW1lbnRldC4NCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9jaGlsZF9lbGVtZW50PUthbiBpa2tlIGxpbmtlIGV0IG5lZGJyeWRuaW5nc2VsZW1lbnQgdGlsIGVuIGFmIGRldHMgdW5kZXJvcmRuZWRlLg0KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl90YXNrcz1PcGdhdmVyDQotdWlfYXNzb2NpYXRpb25fdGFza19zZWxlY3Rpb249T3BnYXZldmFsZy4uLg0KLXV0aWxfUHJvY2Vzc1V0aWxfY2hpbGRhZGFwdGVyPVwgXCB1bmRlcm9yZG5ldHMgYWRhcHRlcjoNCi0NCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zZXRwYXJlbnQ9S2FuIGlra2UgYW5naXZlIG92ZXJvcmRuZXQgZm9yIHVuZGVyb3JkbmV0DQotdXRpbF90bmd1dGlsX2Nhbm5vdF9lZGl0X3Jlc291cmNlPUthbiBpa2tlIHJlZGlnZXJlIHJlc3NvdXJjZS4NCi11dGlsX1Byb2Nlc3NVdGlsX2NvbnRyaWJ1dGVzdG89YmlkcmFnZXIgdGlsICcnezB9JycNCi11dGlsX1Byb2Nlc3NVdGlsX2xvY2FsQ29udHJpYnV0ZXN0bz1iaWRyYWdlciBsb2thbHQgdGlsICcnezB9JycNCi1wcm9jZXNzX2V4dGVuZHM9dWR2aWRlciAnJ3swfScnDQotcHJvY2Vzc19yZXBsYWNlcz1lcnN0YXR0ZXIgJyd7MH0nJw0KLXByb2Nlc3NfbG9jYWxSZXBsYWNlcz1lcnN0YXR0ZXIgJyd7MH0nJyBsb2thbHQNCi0jIEZpbHRlciBjb25zdGFudHMgZXh0ZXJuYWxpemVkIHN0cmluZ3MuDQotRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVzX3RleHQ9RGlzY2lwbGluZXINCi1GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZWdyb3VwaW5nc190ZXh0PURpc2NpcGxpbmdydXBwZXJpbmcNCi1GaWx0ZXJDb25zdGFudHNfd2hpdGVwYXBlcnNfdGV4dD1IdmlkYlx1MDBmOGdlcg0KLUZpbHRlckNvbnN0YW50c190b29sbWVudG9yc190ZXh0PVZcdTAwZTZya3RcdTAwZjhqc21lbnRvcmVyDQotRmlsdGVyQ29uc3RhbnRzX3Rvb2xzX3RleHQ9Vlx1MDBlNnJrdFx1MDBmOGplcg0KLUZpbHRlckNvbnN0YW50c19yb2xlc190ZXh0PVJvbGxlcg0KLUZpbHRlckNvbnN0YW50c190YXNrc190ZXh0PU9wZ2F2ZXINCi1GaWx0ZXJDb25zdGFudHNfcmV1c2FibGVhc3NldHNfdGV4dD1HZW5hbnZlbmRlbGlnZSBha3RpdmVyDQotRmlsdGVyQ29uc3RhbnRzX2FsbF90ZXh0PUFsbGUNCi1GaWx0ZXJDb25zdGFudHNfcHJvY2Vzc2VzX3RleHQ9UHJvY2Vzc2VyDQotRmlsdGVyQ29uc3RhbnRzX3ByYWN0aWNlc190ZXh0PVx1MDBkOHZlbHNlcg0KLUZpbHRlckNvbnN0YW50c190ZW1wbGF0ZXNfdGV4dD1Ta2FiZWxvbmVyDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0c190ZXh0PUFyYmVqZHNwcm9kdWt0ZXINCi1GaWx0ZXJDb25zdGFudHNfY2hlY2tsaXN0c190ZXh0PVRqZWtsaXN0ZXINCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGVsaW5lc190ZXh0PVJldG5pbmdzbGluamVyDQotRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRzX3RleHQ9Um9sbGVzXHUwMGU2dA0KLUZpbHRlckNvbnN0YW50c19ndWlkYW5jZV90ZXh0PVZlamxlZG5pbmcNCi1GaWx0ZXJDb25zdGFudHNfY29uY2VwdHNfdGV4dD1CZWdyZWJlcg0KLUZpbHRlckNvbnN0YW50c19leGFtcGxlc190ZXh0PUVrc2VtcGxlcg0KLUZpbHRlckNvbnN0YW50c19jb250ZW50cGFja2FnZXNfdGV4dD1JbmRob2xkc3Bha2tlcg0KLUZpbHRlckNvbnN0YW50c19yb2xlZGVzY3JpcHRvcnNfdGV4dD1Sb2xsZWRlc2tyaXB0b3Jlcg0KLUZpbHRlckNvbnN0YW50c19yb2xlc2V0Z3JvcHVpbmdzX3RleHQ9Um9sbGVzXHUwMGU2dHNncnVwcGVyaW5nZXINCi1GaWx0ZXJDb25zdGFudHNfdGFza2Rlc2NyaXB0b3JzX3RleHQ9T3BnYXZlZGVza3JpcHRvcmVyDQotRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRlbGVtZW50c190ZXh0PUluZGhvbGRzZWxlbWVudGVyDQotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9wcmVwYXJlPUZvcmJlcmVkZXIgc3lua3JvbmlzZXJpbmcuLi4NCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RkZXNjcmlwdG9yc190ZXh0PUFyYmVqZHNwcm9kdWt0ZGVza3JpcHRvcmVyDQotRmlsdGVyQ29uc3RhbnRzX2FsbGNvbnRlbnRlbGVtZW50c190ZXh0PUFsbGUgaW5kaG9sZHNlbGVtZW50ZXINCi1GaWx0ZXJDb25zdGFudHNfc3VwcG9ydGluZ21hdGVyaWFsc190ZXh0PVN0XHUwMGY4dHRlbWF0ZXJpYWxlDQotTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfZXJyb3JTYXZpbmdGaWxlcz1GZWpsIHVuZGVyIGxhZ3JpbmcgYWYgZmlsKGVyKQ0KLUZpbHRlckNvbnN0YW50c19jdXN0b21jYXRlZ29yaWVzX3RleHQ9VGlscGFzc2VkZSBrYXRlZ29yaWVyDQotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0dHlwZXNfdGV4dD1BcmJlamRzcHJvZHVrdHR5cGVyDQotRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRfd2FybmluZ01zZz1TbGV0bmluZyBlciB1ZGZcdTAwZjhydCBtZWQgYWR2YXJzZWwNCi1GaWx0ZXJDb25zdGFudHNfbWV0aG9kcGx1Z2luc190ZXh0PU1ldG9kZS1wbHVnaW5zDQotVXNlckludGVyYWN0aW9uSGVscGVyX2xvY2tlZFBsdWdpbj1JVVBMMDEyMEU6IFBsdWdpbicnZW4gJyd7MH0nJyBlciBsXHUwMGU1c3QuDQotRmlsdGVyQ29uc3RhbnRzX2RvbWFpbnNfdGV4dD1Eb21cdTAwZTZuZXINCi1GaWx0ZXJDb25zdGFudHNfcm9hZG1hcF90ZXh0PVZlanZpc2VyZQ0KLUZpbHRlckNvbnN0YW50c19yZXBvcnRzX3RleHQ9UmFwcG9ydGVyDQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9sYWJlbD1TdGFuZGFyZHMmeW5rcm9uaXNlcmluZyBmcmEgbWV0b2RlaW5kaG9sZA0KLU1hbnVhbFN5bmNocm9uaXplQ29tbWFuZF9sYWJlbD0mVGlscGFzc2V0IHN5bmtyb25pc2VyaW5nLi4uDQotQXV0b1N5bmNocm9uaXplQ29tbWFuZF9zdWNlc3NmdWw9U3lua3JvbmlzZXJpbmcgZXIgdWRmXHUwMGY4cnQuDQotDQotIyBVc2VySW50ZXJhY3Rpb25IZWxwZXINCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfUHJvY2Vzc1BhY2thZ2VfTmFtZT1OYXZuOiANCi0NCi0jIE1ldGhvZENyZWF0ZUNoaWxkQ29tbWFuZA0KLW5ld0VsZW1lbnRfdGV4dD1OeXQgezB9DQotdXBkYXRlX291dG9mc3luY2hfdGl0bGU9T3BkYXRlcmluZ3Nrb25mbGlrdA0KLXVwZGF0ZV9vdXRvZnN5bmNoX21zZz1GaWwoZXJuZSkgZXIgXHUwMGU2bmRyZXQgaSBmaWxzeXN0ZW1ldC4gVmlsIGR1IG92ZXJza3JpdmUgXHUwMGU2bmRyaW5nZXJuZT8NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTRmNmI2Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWQxN2UyMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDEuamFyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGZyYWdtZW50Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTZmYTk5ZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotc291cmNlLm5sMS5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMS5qYXIgPSBiaW4vDQotYmluLmluY2x1ZGVzID0gbmwxLmphcixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGxheW91dC8sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvZnJhZ21lbnQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2ZyYWdtZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0M2RlMWIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvZnJhZ21lbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZnJhZ21lbnROYW1lPUVQRiBDb21wb3NlciBMaWJyYXJ5IChOTDEpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvY29udGVudHBhZ2VfZGUuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9kZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzA1MTgzMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9kZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi12YXIgY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCA9IGZhbHNlOw0KLXZhciBmaXJzdFNlY3Rpb247DQotdmFyIGV4cGFuZEltYWdlOw0KLXZhciBjb2xsYXBzZUltYWdlOw0KLXZhciBleHBhbmRBbGxJbWFnZTsNCi12YXIgY29sbGFwc2VBbGxJbWFnZTsNCi12YXIgYmFja1RvVG9wSW1hZ2U7DQotdmFyIHNoaW1JbWFnZTsNCi12YXIgZXhwYW5kTWVzc2FnZSA9ICJBbGxlIEFic2Nobml0dHN0cnVrdHVyZW4gZWluYmxlbmRlbiI7DQotdmFyIGNvbGxhcHNlTWVzc2FnZSA9ICJBbGxlIEFic2Nobml0dHNzdHJ1a3R1cmVuIGF1c2JsZW5kZW4iOw0KLXZhciBiYWNrTWVzc2FnZSA9ICJTZWl0ZW5hbmZhbmciOw0KLQ0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHNlY3Rpb24gbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlU2VjdGlvbkxpbmtzKHRhZ05hbWUsIGNsYXNzU2VsZWN0b3IsIGltZ1BhdGgpIHsNCi0JZXhwYW5kSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZC5naWYnOwkNCi0JY29sbGFwc2VJbWFnZSA9IGltZ1BhdGggKyAnY29sbGFwc2UuZ2lmJzsNCi0JZXhwYW5kQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZF9hbGwuZ2lmJzsJDQotCWNvbGxhcHNlQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2NvbGxhcHNlX2FsbC5naWYnOw0KLQliYWNrVG9Ub3BJbWFnZSA9IGltZ1BhdGggKyAnYmFja190b190b3AuZ2lmJzsNCi0Jc2hpbUltYWdlID0gaW1nUGF0aCArICdzaGltLmdpZic7DQotCQ0KLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsNCi0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOw0KLQkJdmFyIHNlY3Rpb25FbGVtZW50cyA9IG5ldyBBcnJheShlbGVtZW50cy5sZW5ndGgpOw0KLQkJdmFyIHRvdGFsTGlua3MgPSAwOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07DQotCQkJaWYgKGVsZW1lbnQuY2xhc3NOYW1lID09IGNsYXNzU2VsZWN0b3IpIHsNCi0JCQkJc2VjdGlvbkVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50Ow0KLQkJCX0NCi0JCX0NCi0JCXNlY3Rpb25FbGVtZW50cy5sZW5ndGggPSB0b3RhbExpbmtzOw0KLQkJc2VjdGlvbkNvbGxhcHNlRGl2cyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJZmlyc3RTZWN0aW9uID0gc2VjdGlvbkVsZW1lbnRzWzBdOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uRWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IHNlY3Rpb25FbGVtZW50c1tpXTsNCi0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsNCi0JCQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoc2libGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSAmJiBzaWJsaW5nQ29udGFpbmVyLnN0eWxlKSB7CQ0KLQkJCQl2YXIgbmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHRTaWJsaW5nOw0KLQkJCQllbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNpYmxpbmdDb250YWluZXIsIG5leHRTaWJsaW5nKTsNCi0JCQkJdmFyIG5leHRFbGVtZW50ID0gc2VjdGlvbkVsZW1lbnRzW2kgKyAxXTsNCi0JCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG5leHRFbGVtZW50ICYmIG5leHRTaWJsaW5nICE9IG51bGwgJiYgbmV4dFNpYmxpbmcuY2xhc3NOYW1lICE9ICdjb3B5cmlnaHQnKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2VjdGlvbkNvbGxhcHNlRGl2c1tpXSA9IHNpYmxpbmdDb250YWluZXI7DQotICAgIAkJCWNyZWF0ZUNvbGxhcHNpYmxlU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3Moc2VjdGlvbkVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc2VjdGlvbi4NCi1mdW5jdGlvbiBjcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCS8vIEFkZCBhIHNwYWNpbmcgYmV0d2VlbiB0aGUgc2VjdGlvbnMuDQotCQl2YXIgc2VjdGlvblNlcGFyYXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJc2VjdGlvblNlcGFyYXRvci5zcmMgPSBzaGltSW1hZ2U7DQotCQlzZWN0aW9uU2VwYXJhdG9yLmhlaWdodCA9ICczJzsNCi0JCXNlY3Rpb25TZXBhcmF0b3IuYm9yZGVyID0gJzAnOw0KLQkJc2VjdGlvblNlcGFyYXRvci5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzZWN0aW9uU2VwYXJhdG9yLCBlbGVtZW50KTsNCi0JCQ0KLQkJLy8gQWRkIGEgZXhwYW5kL2NvbGxhcHNlIGxpbmsgdG8gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTZWN0aW9uOw0KLQkJc2VjdGlvbkNvbGxhcHNlTGlua3NbaW5kZXhdID0gbGluazsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50Lmluc2VydEJlZm9yZShzcGFuLCBlbGVtZW50LmZpcnN0Q2hpbGQpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotICAgIAkNCi0JCS8vIEFkZCBhIEJhY2sgVG8gVG9wIGxpbmsgaW4gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCWNyZWF0ZUJhY2tUb1RvcExpbmsoc2libGluZ0NvbnRhaW5lcik7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIEJhY2sgdG8gdG9wIGxpbmsuDQotZnVuY3Rpb24gY3JlYXRlQmFja1RvVG9wTGluayhlbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQ0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKSB7DQotCQlkaXYuY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gYmFja1RvVG9wSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYmFja01lc3NhZ2UpKTsJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZGl2KTsNCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHNlY3Rpb24gYmFzZWQgb24gdGhlIHJlY2VpdmVkIGV2ZW50Lg0KLWZ1bmN0aW9uIGV4cGFuZENvbGxhcHNlU2VjdGlvbihldnQpIHsNCi0JaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQllbHNlIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgdGhlIEV4cGFuZCBBbGwgYW5kIENvbGxhcHNlIEFsbCBTZWN0aW9ucyBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3MoZmlyc3RFbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQkNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gZXhwYW5kQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGw7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGV4cGFuZE1lc3NhZ2UpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7CQkJCQkJDQotCQkNCi0JCWltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gY29sbGFwc2VBbGw7DQotCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29sbGFwc2VNZXNzYWdlKSk7CQkJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJLyoNCi0JCXZhciBvdmVydmlld1NlcGFyYXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdmVydmlld1NlcGFyYXRvciIpOw0KLQkJb3ZlcnZpZXdTZXBhcmF0b3IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBvdmVydmlld1NlcGFyYXRvcik7DQotCQkqLw0KLQkJaWYgKGZpcnN0U2VjdGlvbiAhPSBudWxsKSB7DQotCQkJZmlyc3RTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTZWN0aW9uKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIGFsbCBzZWN0aW9ucy4NCi1mdW5jdGlvbiBleHBhbmRBbGwoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHNlY3Rpb25zLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsKGV2dCkgew0KLQlmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JCXNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gVGhpcyB0ZW1wb3JhcnkgZnVuY3Rpb24gaGVscHMgdG8gcmVzb2x2ZSBKYXZhc2NyaXB0IGVycm9ycyBpbiB0aGUgbWlncmF0ZWQgUlVQDQotLy8gY29udGVudCBwYWdlcy4gSXQgd2lsbCBiZSByZW1vdmVkIG9uY2UgdGhlIGNvcnJlc3BvbmRpbmcgLmpzIGZpbGVzIGFyZSBiZWluZw0KLS8vIG1pZ3JhdGVkIGFsb25nIHdpdGggdGhlIEhUTUwgY29udGVudCBwYWdlcy4NCi1mdW5jdGlvbiBSZWZlcmVuY2VIZWxwVG9waWMgKHRvcGljTmFtZSwgYm9vayAsIGZpbGVOYW1lKSB7DQotICAgZG9jdW1lbnQud3JpdGUoIjxpPiIrIHRvcGljTmFtZSArICI8XC9pPiIpOw0KLX0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9lcy5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL2NvbnRlbnRwYWdlX2VzLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MmZlYjVjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL2NvbnRlbnRwYWdlX2VzLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLXZhciBjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0ID0gZmFsc2U7DQotdmFyIGZpcnN0U2VjdGlvbjsNCi12YXIgZXhwYW5kSW1hZ2U7DQotdmFyIGNvbGxhcHNlSW1hZ2U7DQotdmFyIGV4cGFuZEFsbEltYWdlOw0KLXZhciBjb2xsYXBzZUFsbEltYWdlOw0KLXZhciBiYWNrVG9Ub3BJbWFnZTsNCi12YXIgc2hpbUltYWdlOw0KLXZhciBleHBhbmRNZXNzYWdlID0gIkV4cGFuZGlyIHRvZGFzIGxhcyBzZWNjaW9uZXMiOw0KLXZhciBjb2xsYXBzZU1lc3NhZ2UgPSAiQ29udHJhZXIgdG9kYXMgbGFzIHNlY2Npb25lcyI7DQotdmFyIGJhY2tNZXNzYWdlID0gIlZvbHZlciBhbCBpbmljaW8iOw0KLQ0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHNlY3Rpb24gbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlU2VjdGlvbkxpbmtzKHRhZ05hbWUsIGNsYXNzU2VsZWN0b3IsIGltZ1BhdGgpIHsNCi0JZXhwYW5kSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZC5naWYnOwkNCi0JY29sbGFwc2VJbWFnZSA9IGltZ1BhdGggKyAnY29sbGFwc2UuZ2lmJzsNCi0JZXhwYW5kQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZF9hbGwuZ2lmJzsJDQotCWNvbGxhcHNlQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2NvbGxhcHNlX2FsbC5naWYnOw0KLQliYWNrVG9Ub3BJbWFnZSA9IGltZ1BhdGggKyAnYmFja190b190b3AuZ2lmJzsNCi0Jc2hpbUltYWdlID0gaW1nUGF0aCArICdzaGltLmdpZic7DQotCQ0KLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsNCi0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOw0KLQkJdmFyIHNlY3Rpb25FbGVtZW50cyA9IG5ldyBBcnJheShlbGVtZW50cy5sZW5ndGgpOw0KLQkJdmFyIHRvdGFsTGlua3MgPSAwOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07DQotCQkJaWYgKGVsZW1lbnQuY2xhc3NOYW1lID09IGNsYXNzU2VsZWN0b3IpIHsNCi0JCQkJc2VjdGlvbkVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50Ow0KLQkJCX0NCi0JCX0NCi0JCXNlY3Rpb25FbGVtZW50cy5sZW5ndGggPSB0b3RhbExpbmtzOw0KLQkJc2VjdGlvbkNvbGxhcHNlRGl2cyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJZmlyc3RTZWN0aW9uID0gc2VjdGlvbkVsZW1lbnRzWzBdOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uRWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IHNlY3Rpb25FbGVtZW50c1tpXTsNCi0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsNCi0JCQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoc2libGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSAmJiBzaWJsaW5nQ29udGFpbmVyLnN0eWxlKSB7CQ0KLQkJCQl2YXIgbmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHRTaWJsaW5nOw0KLQkJCQllbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNpYmxpbmdDb250YWluZXIsIG5leHRTaWJsaW5nKTsNCi0JCQkJdmFyIG5leHRFbGVtZW50ID0gc2VjdGlvbkVsZW1lbnRzW2kgKyAxXTsNCi0JCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG5leHRFbGVtZW50ICYmIG5leHRTaWJsaW5nICE9IG51bGwgJiYgbmV4dFNpYmxpbmcuY2xhc3NOYW1lICE9ICdjb3B5cmlnaHQnKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2VjdGlvbkNvbGxhcHNlRGl2c1tpXSA9IHNpYmxpbmdDb250YWluZXI7DQotICAgIAkJCWNyZWF0ZUNvbGxhcHNpYmxlU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3Moc2VjdGlvbkVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc2VjdGlvbi4NCi1mdW5jdGlvbiBjcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCS8vIEFkZCBhIHNwYWNpbmcgYmV0d2VlbiB0aGUgc2VjdGlvbnMuDQotCQl2YXIgc2VjdGlvblNlcGFyYXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJc2VjdGlvblNlcGFyYXRvci5zcmMgPSBzaGltSW1hZ2U7DQotCQlzZWN0aW9uU2VwYXJhdG9yLmhlaWdodCA9ICczJzsNCi0JCXNlY3Rpb25TZXBhcmF0b3IuYm9yZGVyID0gJzAnOw0KLQkJc2VjdGlvblNlcGFyYXRvci5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzZWN0aW9uU2VwYXJhdG9yLCBlbGVtZW50KTsNCi0JCQ0KLQkJLy8gQWRkIGEgZXhwYW5kL2NvbGxhcHNlIGxpbmsgdG8gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTZWN0aW9uOw0KLQkJc2VjdGlvbkNvbGxhcHNlTGlua3NbaW5kZXhdID0gbGluazsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50Lmluc2VydEJlZm9yZShzcGFuLCBlbGVtZW50LmZpcnN0Q2hpbGQpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotICAgIAkNCi0JCS8vIEFkZCBhIEJhY2sgVG8gVG9wIGxpbmsgaW4gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCWNyZWF0ZUJhY2tUb1RvcExpbmsoc2libGluZ0NvbnRhaW5lcik7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIEJhY2sgdG8gdG9wIGxpbmsuDQotZnVuY3Rpb24gY3JlYXRlQmFja1RvVG9wTGluayhlbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQ0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKSB7DQotCQlkaXYuY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gYmFja1RvVG9wSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYmFja01lc3NhZ2UpKTsJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZGl2KTsNCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHNlY3Rpb24gYmFzZWQgb24gdGhlIHJlY2VpdmVkIGV2ZW50Lg0KLWZ1bmN0aW9uIGV4cGFuZENvbGxhcHNlU2VjdGlvbihldnQpIHsNCi0JaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQllbHNlIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgdGhlIEV4cGFuZCBBbGwgYW5kIENvbGxhcHNlIEFsbCBTZWN0aW9ucyBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3MoZmlyc3RFbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQkNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gZXhwYW5kQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGw7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGV4cGFuZE1lc3NhZ2UpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7CQkJCQkJDQotCQkNCi0JCWltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gY29sbGFwc2VBbGw7DQotCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29sbGFwc2VNZXNzYWdlKSk7CQkJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJLyoNCi0JCXZhciBvdmVydmlld1NlcGFyYXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdmVydmlld1NlcGFyYXRvciIpOw0KLQkJb3ZlcnZpZXdTZXBhcmF0b3IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBvdmVydmlld1NlcGFyYXRvcik7DQotCQkqLw0KLQkJaWYgKGZpcnN0U2VjdGlvbiAhPSBudWxsKSB7DQotCQkJZmlyc3RTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTZWN0aW9uKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIGFsbCBzZWN0aW9ucy4NCi1mdW5jdGlvbiBleHBhbmRBbGwoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHNlY3Rpb25zLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsKGV2dCkgew0KLQlmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JCXNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gVGhpcyB0ZW1wb3JhcnkgZnVuY3Rpb24gaGVscHMgdG8gcmVzb2x2ZSBKYXZhc2NyaXB0IGVycm9ycyBpbiB0aGUgbWlncmF0ZWQgUlVQDQotLy8gY29udGVudCBwYWdlcy4gSXQgd2lsbCBiZSByZW1vdmVkIG9uY2UgdGhlIGNvcnJlc3BvbmRpbmcgLmpzIGZpbGVzIGFyZSBiZWluZw0KLS8vIG1pZ3JhdGVkIGFsb25nIHdpdGggdGhlIEhUTUwgY29udGVudCBwYWdlcy4NCi1mdW5jdGlvbiBSZWZlcmVuY2VIZWxwVG9waWMgKHRvcGljTmFtZSwgYm9vayAsIGZpbGVOYW1lKSB7DQotICAgZG9jdW1lbnQud3JpdGUoIjxpPiIrIHRvcGljTmFtZSArICI8XC9pPiIpOw0KLX0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9mci5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL2NvbnRlbnRwYWdlX2ZyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkODllNmExLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL2NvbnRlbnRwYWdlX2ZyLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLXZhciBjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0ID0gZmFsc2U7DQotdmFyIGZpcnN0U2VjdGlvbjsNCi12YXIgZXhwYW5kSW1hZ2U7DQotdmFyIGNvbGxhcHNlSW1hZ2U7DQotdmFyIGV4cGFuZEFsbEltYWdlOw0KLXZhciBjb2xsYXBzZUFsbEltYWdlOw0KLXZhciBiYWNrVG9Ub3BJbWFnZTsNCi12YXIgc2hpbUltYWdlOw0KLXZhciBleHBhbmRNZXNzYWdlID0gIkTDqXZlbG9wcGVyIHRvdXRlcyBsZXMgc2VjdGlvbnMiOw0KLXZhciBjb2xsYXBzZU1lc3NhZ2UgPSAiQ29uZGVuc2VyIHRvdXRlcyBsZXMgc2VjdGlvbnMiOw0KLXZhciBiYWNrTWVzc2FnZSA9ICJIYXV0IGRlIHBhZ2UiOw0KLQ0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHNlY3Rpb24gbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlU2VjdGlvbkxpbmtzKHRhZ05hbWUsIGNsYXNzU2VsZWN0b3IsIGltZ1BhdGgpIHsNCi0JZXhwYW5kSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZC5naWYnOwkNCi0JY29sbGFwc2VJbWFnZSA9IGltZ1BhdGggKyAnY29sbGFwc2UuZ2lmJzsNCi0JZXhwYW5kQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZF9hbGwuZ2lmJzsJDQotCWNvbGxhcHNlQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2NvbGxhcHNlX2FsbC5naWYnOw0KLQliYWNrVG9Ub3BJbWFnZSA9IGltZ1BhdGggKyAnYmFja190b190b3AuZ2lmJzsNCi0Jc2hpbUltYWdlID0gaW1nUGF0aCArICdzaGltLmdpZic7DQotCQ0KLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsNCi0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOw0KLQkJdmFyIHNlY3Rpb25FbGVtZW50cyA9IG5ldyBBcnJheShlbGVtZW50cy5sZW5ndGgpOw0KLQkJdmFyIHRvdGFsTGlua3MgPSAwOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07DQotCQkJaWYgKGVsZW1lbnQuY2xhc3NOYW1lID09IGNsYXNzU2VsZWN0b3IpIHsNCi0JCQkJc2VjdGlvbkVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50Ow0KLQkJCX0NCi0JCX0NCi0JCXNlY3Rpb25FbGVtZW50cy5sZW5ndGggPSB0b3RhbExpbmtzOw0KLQkJc2VjdGlvbkNvbGxhcHNlRGl2cyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJZmlyc3RTZWN0aW9uID0gc2VjdGlvbkVsZW1lbnRzWzBdOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uRWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IHNlY3Rpb25FbGVtZW50c1tpXTsNCi0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsNCi0JCQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoc2libGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSAmJiBzaWJsaW5nQ29udGFpbmVyLnN0eWxlKSB7CQ0KLQkJCQl2YXIgbmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHRTaWJsaW5nOw0KLQkJCQllbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNpYmxpbmdDb250YWluZXIsIG5leHRTaWJsaW5nKTsNCi0JCQkJdmFyIG5leHRFbGVtZW50ID0gc2VjdGlvbkVsZW1lbnRzW2kgKyAxXTsNCi0JCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG5leHRFbGVtZW50ICYmIG5leHRTaWJsaW5nICE9IG51bGwgJiYgbmV4dFNpYmxpbmcuY2xhc3NOYW1lICE9ICdjb3B5cmlnaHQnKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2VjdGlvbkNvbGxhcHNlRGl2c1tpXSA9IHNpYmxpbmdDb250YWluZXI7DQotICAgIAkJCWNyZWF0ZUNvbGxhcHNpYmxlU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3Moc2VjdGlvbkVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc2VjdGlvbi4NCi1mdW5jdGlvbiBjcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCS8vIEFkZCBhIHNwYWNpbmcgYmV0d2VlbiB0aGUgc2VjdGlvbnMuDQotCQl2YXIgc2VjdGlvblNlcGFyYXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJc2VjdGlvblNlcGFyYXRvci5zcmMgPSBzaGltSW1hZ2U7DQotCQlzZWN0aW9uU2VwYXJhdG9yLmhlaWdodCA9ICczJzsNCi0JCXNlY3Rpb25TZXBhcmF0b3IuYm9yZGVyID0gJzAnOw0KLQkJc2VjdGlvblNlcGFyYXRvci5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzZWN0aW9uU2VwYXJhdG9yLCBlbGVtZW50KTsNCi0JCQ0KLQkJLy8gQWRkIGEgZXhwYW5kL2NvbGxhcHNlIGxpbmsgdG8gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTZWN0aW9uOw0KLQkJc2VjdGlvbkNvbGxhcHNlTGlua3NbaW5kZXhdID0gbGluazsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50Lmluc2VydEJlZm9yZShzcGFuLCBlbGVtZW50LmZpcnN0Q2hpbGQpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotICAgIAkNCi0JCS8vIEFkZCBhIEJhY2sgVG8gVG9wIGxpbmsgaW4gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCWNyZWF0ZUJhY2tUb1RvcExpbmsoc2libGluZ0NvbnRhaW5lcik7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIEJhY2sgdG8gdG9wIGxpbmsuDQotZnVuY3Rpb24gY3JlYXRlQmFja1RvVG9wTGluayhlbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQ0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKSB7DQotCQlkaXYuY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gYmFja1RvVG9wSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYmFja01lc3NhZ2UpKTsJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZGl2KTsNCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHNlY3Rpb24gYmFzZWQgb24gdGhlIHJlY2VpdmVkIGV2ZW50Lg0KLWZ1bmN0aW9uIGV4cGFuZENvbGxhcHNlU2VjdGlvbihldnQpIHsNCi0JaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQllbHNlIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgdGhlIEV4cGFuZCBBbGwgYW5kIENvbGxhcHNlIEFsbCBTZWN0aW9ucyBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3MoZmlyc3RFbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQkNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gZXhwYW5kQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGw7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGV4cGFuZE1lc3NhZ2UpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7CQkJCQkJDQotCQkNCi0JCWltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gY29sbGFwc2VBbGw7DQotCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29sbGFwc2VNZXNzYWdlKSk7CQkJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJLyoNCi0JCXZhciBvdmVydmlld1NlcGFyYXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdmVydmlld1NlcGFyYXRvciIpOw0KLQkJb3ZlcnZpZXdTZXBhcmF0b3IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBvdmVydmlld1NlcGFyYXRvcik7DQotCQkqLw0KLQkJaWYgKGZpcnN0U2VjdGlvbiAhPSBudWxsKSB7DQotCQkJZmlyc3RTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTZWN0aW9uKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIGFsbCBzZWN0aW9ucy4NCi1mdW5jdGlvbiBleHBhbmRBbGwoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHNlY3Rpb25zLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsKGV2dCkgew0KLQlmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JCXNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gVGhpcyB0ZW1wb3JhcnkgZnVuY3Rpb24gaGVscHMgdG8gcmVzb2x2ZSBKYXZhc2NyaXB0IGVycm9ycyBpbiB0aGUgbWlncmF0ZWQgUlVQDQotLy8gY29udGVudCBwYWdlcy4gSXQgd2lsbCBiZSByZW1vdmVkIG9uY2UgdGhlIGNvcnJlc3BvbmRpbmcgLmpzIGZpbGVzIGFyZSBiZWluZw0KLS8vIG1pZ3JhdGVkIGFsb25nIHdpdGggdGhlIEhUTUwgY29udGVudCBwYWdlcy4NCi1mdW5jdGlvbiBSZWZlcmVuY2VIZWxwVG9waWMgKHRvcGljTmFtZSwgYm9vayAsIGZpbGVOYW1lKSB7DQotICAgZG9jdW1lbnQud3JpdGUoIjxpPiIrIHRvcGljTmFtZSArICI8XC9pPiIpOw0KLX0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9pdC5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL2NvbnRlbnRwYWdlX2l0LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNGU0Y2RlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL2NvbnRlbnRwYWdlX2l0LmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLXZhciBjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0ID0gZmFsc2U7DQotdmFyIGZpcnN0U2VjdGlvbjsNCi12YXIgZXhwYW5kSW1hZ2U7DQotdmFyIGNvbGxhcHNlSW1hZ2U7DQotdmFyIGV4cGFuZEFsbEltYWdlOw0KLXZhciBjb2xsYXBzZUFsbEltYWdlOw0KLXZhciBiYWNrVG9Ub3BJbWFnZTsNCi12YXIgc2hpbUltYWdlOw0KLXZhciBleHBhbmRNZXNzYWdlID0gIkVzcGFuZGkgdHV0dGUgbGUgc2V6aW9uaSI7DQotdmFyIGNvbGxhcHNlTWVzc2FnZSA9ICJDb21wcmltaSB0dXR0ZSBsZSBzZXppb25pIjsNCi12YXIgYmFja01lc3NhZ2UgPSAiVG9ybmEgYWxsJ2luaXppbyI7DQotDQotLy8gQ3JlYXRlcyB0aGUgY29sbGFwc2libGUgc2VjdGlvbiBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVTZWN0aW9uTGlua3ModGFnTmFtZSwgY2xhc3NTZWxlY3RvciwgaW1nUGF0aCkgew0KLQlleHBhbmRJbWFnZSA9IGltZ1BhdGggKyAnZXhwYW5kLmdpZic7CQ0KLQljb2xsYXBzZUltYWdlID0gaW1nUGF0aCArICdjb2xsYXBzZS5naWYnOw0KLQlleHBhbmRBbGxJbWFnZSA9IGltZ1BhdGggKyAnZXhwYW5kX2FsbC5naWYnOwkNCi0JY29sbGFwc2VBbGxJbWFnZSA9IGltZ1BhdGggKyAnY29sbGFwc2VfYWxsLmdpZic7DQotCWJhY2tUb1RvcEltYWdlID0gaW1nUGF0aCArICdiYWNrX3RvX3RvcC5naWYnOw0KLQlzaGltSW1hZ2UgPSBpbWdQYXRoICsgJ3NoaW0uZ2lmJzsNCi0JDQotCWlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkgew0KLQkJdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7DQotCQl2YXIgc2VjdGlvbkVsZW1lbnRzID0gbmV3IEFycmF5KGVsZW1lbnRzLmxlbmd0aCk7DQotCQl2YXIgdG90YWxMaW5rcyA9IDA7DQotCQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsNCi0JCQlpZiAoZWxlbWVudC5jbGFzc05hbWUgPT0gY2xhc3NTZWxlY3Rvcikgew0KLQkJCQlzZWN0aW9uRWxlbWVudHNbdG90YWxMaW5rcysrXSA9IGVsZW1lbnQ7DQotCQkJfQ0KLQkJfQ0KLQkJc2VjdGlvbkVsZW1lbnRzLmxlbmd0aCA9IHRvdGFsTGlua3M7DQotCQlzZWN0aW9uQ29sbGFwc2VEaXZzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJc2VjdGlvbkNvbGxhcHNlTGlua3MgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlmaXJzdFNlY3Rpb24gPSBzZWN0aW9uRWxlbWVudHNbMF07DQotCQlmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25FbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gc2VjdGlvbkVsZW1lbnRzW2ldOw0KLQkJCXZhciBzaWJsaW5nQ29udGFpbmVyOw0KLQkJCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChzaWJsaW5nQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpICYmIHNpYmxpbmdDb250YWluZXIuc3R5bGUpIHsJDQotCQkJCXZhciBuZXh0U2libGluZyA9IGVsZW1lbnQubmV4dFNpYmxpbmc7DQotCQkJCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2libGluZ0NvbnRhaW5lciwgbmV4dFNpYmxpbmcpOw0KLQkJCQl2YXIgbmV4dEVsZW1lbnQgPSBzZWN0aW9uRWxlbWVudHNbaSArIDFdOw0KLQkJCQl3aGlsZSAobmV4dFNpYmxpbmcgIT0gbmV4dEVsZW1lbnQgJiYgbmV4dFNpYmxpbmcgIT0gbnVsbCAmJiBuZXh0U2libGluZy5jbGFzc05hbWUgIT0gJ2NvcHlyaWdodCcpIHsNCi0JCQkJCXZhciB0b01vdmUgPSBuZXh0U2libGluZzsNCi0JCQkJCW5leHRTaWJsaW5nID0gbmV4dFNpYmxpbmcubmV4dFNpYmxpbmc7DQotCQkJCQlzaWJsaW5nQ29udGFpbmVyLmFwcGVuZENoaWxkKHRvTW92ZSk7DQotCQkJCX0NCi0JCQkJaWYgKGNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQpIHsNCi0gICAgCQkJCXNpYmxpbmdDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0gICAgCQkJfQ0KLSAgICAJCQlzZWN0aW9uQ29sbGFwc2VEaXZzW2ldID0gc2libGluZ0NvbnRhaW5lcjsNCi0gICAgCQkJY3JlYXRlQ29sbGFwc2libGVTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGkpOw0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCX0NCi0JCWNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU2VjdGlvbnNMaW5rcyhzZWN0aW9uRWxlbWVudHNbMF0pOw0KLQl9DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSBjb2xsYXBzaWJsZSBzZWN0aW9uLg0KLWZ1bmN0aW9uIGNyZWF0ZUNvbGxhcHNpYmxlU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpbmRleCkgew0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCkgew0KLQkJLy8gQWRkIGEgc3BhY2luZyBiZXR3ZWVuIHRoZSBzZWN0aW9ucy4NCi0JCXZhciBzZWN0aW9uU2VwYXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlzZWN0aW9uU2VwYXJhdG9yLnNyYyA9IHNoaW1JbWFnZTsNCi0JCXNlY3Rpb25TZXBhcmF0b3IuaGVpZ2h0ID0gJzMnOw0KLQkJc2VjdGlvblNlcGFyYXRvci5ib3JkZXIgPSAnMCc7DQotCQlzZWN0aW9uU2VwYXJhdG9yLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQllbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNlY3Rpb25TZXBhcmF0b3IsIGVsZW1lbnQpOw0KLQkJDQotCQkvLyBBZGQgYSBleHBhbmQvY29sbGFwc2UgbGluayB0byB0aGUgc2VjdGlvbiBoZWFkaW5nLg0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQl2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY29sbGFwc2VEaXYgPSBzaWJsaW5nQ29udGFpbmVyOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpZiAoY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCkgew0KLQkJCWltYWdlLnNyYyA9IGV4cGFuZEltYWdlOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJaW1hZ2Uuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JCX0NCi0JCWltYWdlLndpZHRoID0gJzE3JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNSc7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRDb2xsYXBzZVNlY3Rpb247DQotCQlzZWN0aW9uQ29sbGFwc2VMaW5rc1tpbmRleF0gPSBsaW5rOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWVsZW1lbnQuaW5zZXJ0QmVmb3JlKHNwYW4sIGVsZW1lbnQuZmlyc3RDaGlsZCk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0gICAgCQ0KLQkJLy8gQWRkIGEgQmFjayBUbyBUb3AgbGluayBpbiB0aGUgc2VjdGlvbiBoZWFkaW5nLg0KLQkJY3JlYXRlQmFja1RvVG9wTGluayhzaWJsaW5nQ29udGFpbmVyKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgQmFjayB0byB0b3AgbGluay4NCi1mdW5jdGlvbiBjcmVhdGVCYWNrVG9Ub3BMaW5rKGVsZW1lbnQpIHsNCi0JdmFyIGRpdjsNCi0JDQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpIHsNCi0JCWRpdi5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7DQotCQlkaXYuYWxpZ24gPSAncmlnaHQnOw0KLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBiYWNrVG9Ub3BJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOwkJDQotCQl2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShiYWNrTWVzc2FnZSkpOwkJDQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOw0KLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkaXYpOw0KLQl9DQotfQ0KLQ0KLS8vIEV4cGFuZHMgb3IgY29sbGFwc2VzIGEgc2VjdGlvbiBiYXNlZCBvbiB0aGUgcmVjZWl2ZWQgZXZlbnQuDQotZnVuY3Rpb24gZXhwYW5kQ29sbGFwc2VTZWN0aW9uKGV2dCkgew0KLQlpZiAodGhpcy5jb2xsYXBzZURpdi5zdHlsZS5kaXNwbGF5ID09ICcnKSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWVsc2Ugew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ3JlYXRlcyB0aGUgRXhwYW5kIEFsbCBhbmQgQ29sbGFwc2UgQWxsIFNlY3Rpb25zIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU2VjdGlvbnNMaW5rcyhmaXJzdEVsZW1lbnQpIHsNCi0JdmFyIGRpdjsNCi0JCQ0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKSB7DQotCQlkaXYuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlkaXYuYWxpZ24gPSAncmlnaHQnOw0KLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBleHBhbmRBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOwkJDQotCQl2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGV4cGFuZEFsbDsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZXhwYW5kTWVzc2FnZSkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsJCQkJCQkNCi0JCQ0KLQkJaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGNvbGxhcHNlQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBjb2xsYXBzZUFsbDsNCi0JCXNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb2xsYXBzZU1lc3NhZ2UpKTsJCQkJDQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOw0KLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOw0KLQkJDQotCQkvKg0KLQkJdmFyIG92ZXJ2aWV3U2VwYXJhdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm92ZXJ2aWV3U2VwYXJhdG9yIik7DQotCQlvdmVydmlld1NlcGFyYXRvci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIG92ZXJ2aWV3U2VwYXJhdG9yKTsNCi0JCSovDQotCQlpZiAoZmlyc3RTZWN0aW9uICE9IG51bGwpIHsNCi0JCQlmaXJzdFNlY3Rpb24ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBmaXJzdFNlY3Rpb24pOw0KLQkJfQ0KLQl9DQotfQ0KLQ0KLS8vIEV4cGFuZHMgYWxsIHNlY3Rpb25zLg0KLWZ1bmN0aW9uIGV4cGFuZEFsbChldnQpIHsNCi0JIGZvciAodmFyIGkgPSAwOyBpIDwgc2VjdGlvbkNvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgew0KLQkgCXNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkgCXNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JIH0NCi0JIGlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCSAJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCSB9DQotCSByZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENvbGxhcHNlcyBhbGwgc2VjdGlvbnMuDQotZnVuY3Rpb24gY29sbGFwc2VBbGwoZXZ0KSB7DQotCWZvciAodmFyIGkgPSAwOyBpIDwgc2VjdGlvbkNvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgew0KLQkJc2VjdGlvbkNvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJc2VjdGlvbkNvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBUaGlzIHRlbXBvcmFyeSBmdW5jdGlvbiBoZWxwcyB0byByZXNvbHZlIEphdmFzY3JpcHQgZXJyb3JzIGluIHRoZSBtaWdyYXRlZCBSVVANCi0vLyBjb250ZW50IHBhZ2VzLiBJdCB3aWxsIGJlIHJlbW92ZWQgb25jZSB0aGUgY29ycmVzcG9uZGluZyAuanMgZmlsZXMgYXJlIGJlaW5nDQotLy8gbWlncmF0ZWQgYWxvbmcgd2l0aCB0aGUgSFRNTCBjb250ZW50IHBhZ2VzLg0KLWZ1bmN0aW9uIFJlZmVyZW5jZUhlbHBUb3BpYyAodG9waWNOYW1lLCBib29rICwgZmlsZU5hbWUpIHsNCi0gICBkb2N1bWVudC53cml0ZSgiPGk+IisgdG9waWNOYW1lICsgIjxcL2k+Iik7DQotfQ0KLQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL2NvbnRlbnRwYWdlX2phLmpzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvY29udGVudHBhZ2VfamEuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkZDI0ZjkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvY29udGVudHBhZ2VfamEuanMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotdmFyIGNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQgPSBmYWxzZTsNCi12YXIgZmlyc3RTZWN0aW9uOw0KLXZhciBleHBhbmRJbWFnZTsNCi12YXIgY29sbGFwc2VJbWFnZTsNCi12YXIgZXhwYW5kQWxsSW1hZ2U7DQotdmFyIGNvbGxhcHNlQWxsSW1hZ2U7DQotdmFyIGJhY2tUb1RvcEltYWdlOw0KLXZhciBzaGltSW1hZ2U7DQotdmFyIGV4cGFuZE1lc3NhZ2UgPSAi44K744Kv44K344On44Oz44KS44GZ44G544Gm5bGV6ZaLIjsNCi12YXIgY29sbGFwc2VNZXNzYWdlID0gIuOCu+OCr+OCt+ODp+ODs+OCkuOBmeOBueOBpue4ruWwj+ihqOekuiAiOw0KLXZhciBiYWNrTWVzc2FnZSA9ICLkuIrjgavmiLvjgosgIjsNCi0NCi0vLyBDcmVhdGVzIHRoZSBjb2xsYXBzaWJsZSBzZWN0aW9uIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZVNlY3Rpb25MaW5rcyh0YWdOYW1lLCBjbGFzc1NlbGVjdG9yLCBpbWdQYXRoKSB7DQotCWV4cGFuZEltYWdlID0gaW1nUGF0aCArICdleHBhbmQuZ2lmJzsJDQotCWNvbGxhcHNlSW1hZ2UgPSBpbWdQYXRoICsgJ2NvbGxhcHNlLmdpZic7DQotCWV4cGFuZEFsbEltYWdlID0gaW1nUGF0aCArICdleHBhbmRfYWxsLmdpZic7CQ0KLQljb2xsYXBzZUFsbEltYWdlID0gaW1nUGF0aCArICdjb2xsYXBzZV9hbGwuZ2lmJzsNCi0JYmFja1RvVG9wSW1hZ2UgPSBpbWdQYXRoICsgJ2JhY2tfdG9fdG9wLmdpZic7DQotCXNoaW1JbWFnZSA9IGltZ1BhdGggKyAnc2hpbS5naWYnOw0KLQkNCi0JaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7DQotCQl2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsNCi0JCXZhciBzZWN0aW9uRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsNCi0JCXZhciB0b3RhbExpbmtzID0gMDsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOw0KLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7DQotCQkJCXNlY3Rpb25FbGVtZW50c1t0b3RhbExpbmtzKytdID0gZWxlbWVudDsNCi0JCQl9DQotCQl9DQotCQlzZWN0aW9uRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsNCi0JCXNlY3Rpb25Db2xsYXBzZURpdnMgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlzZWN0aW9uQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCWZpcnN0U2VjdGlvbiA9IHNlY3Rpb25FbGVtZW50c1swXTsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgc2VjdGlvbkVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJdmFyIGVsZW1lbnQgPSBzZWN0aW9uRWxlbWVudHNbaV07DQotCQkJdmFyIHNpYmxpbmdDb250YWluZXI7DQotCQkJaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKHNpYmxpbmdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkgJiYgc2libGluZ0NvbnRhaW5lci5zdHlsZSkgewkNCi0JCQkJdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0U2libGluZzsNCi0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7DQotCQkJCXZhciBuZXh0RWxlbWVudCA9IHNlY3Rpb25FbGVtZW50c1tpICsgMV07DQotCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBuZXh0RWxlbWVudCAmJiBuZXh0U2libGluZyAhPSBudWxsICYmIG5leHRTaWJsaW5nLmNsYXNzTmFtZSAhPSAnY29weXJpZ2h0Jykgew0KLQkJCQkJdmFyIHRvTW92ZSA9IG5leHRTaWJsaW5nOw0KLQkJCQkJbmV4dFNpYmxpbmcgPSBuZXh0U2libGluZy5uZXh0U2libGluZzsNCi0JCQkJCXNpYmxpbmdDb250YWluZXIuYXBwZW5kQ2hpbGQodG9Nb3ZlKTsNCi0JCQkJfQ0KLQkJCQlpZiAoY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCkgew0KLSAgICAJCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQl9DQotICAgIAkJCXNlY3Rpb25Db2xsYXBzZURpdnNbaV0gPSBzaWJsaW5nQ29udGFpbmVyOw0KLSAgICAJCQljcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaSk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJfQ0KLQkJY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTZWN0aW9uc0xpbmtzKHNlY3Rpb25FbGVtZW50c1swXSk7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIGNvbGxhcHNpYmxlIHNlY3Rpb24uDQotZnVuY3Rpb24gY3JlYXRlQ29sbGFwc2libGVTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGluZGV4KSB7DQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7DQotCQkvLyBBZGQgYSBzcGFjaW5nIGJldHdlZW4gdGhlIHNlY3Rpb25zLg0KLQkJdmFyIHNlY3Rpb25TZXBhcmF0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCXNlY3Rpb25TZXBhcmF0b3Iuc3JjID0gc2hpbUltYWdlOw0KLQkJc2VjdGlvblNlcGFyYXRvci5oZWlnaHQgPSAnMyc7DQotCQlzZWN0aW9uU2VwYXJhdG9yLmJvcmRlciA9ICcwJzsNCi0JCXNlY3Rpb25TZXBhcmF0b3IuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2VjdGlvblNlcGFyYXRvciwgZWxlbWVudCk7DQotCQkNCi0JCS8vIEFkZCBhIGV4cGFuZC9jb2xsYXBzZSBsaW5rIHRvIHRoZSBzZWN0aW9uIGhlYWRpbmcuDQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jb2xsYXBzZURpdiA9IHNpYmxpbmdDb250YWluZXI7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWlmIChjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0KSB7DQotCQkJaW1hZ2Uuc3JjID0gZXhwYW5kSW1hZ2U7DQotCQl9DQotCQllbHNlIHsNCi0JCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkJfQ0KLQkJaW1hZ2Uud2lkdGggPSAnMTcnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE1JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGV4cGFuZENvbGxhcHNlU2VjdGlvbjsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzW2luZGV4XSA9IGxpbms7DQotCQlzcGFuLmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLSAgICAJDQotCQkvLyBBZGQgYSBCYWNrIFRvIFRvcCBsaW5rIGluIHRoZSBzZWN0aW9uIGhlYWRpbmcuDQotCQljcmVhdGVCYWNrVG9Ub3BMaW5rKHNpYmxpbmdDb250YWluZXIpOw0KLQl9DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSBCYWNrIHRvIHRvcCBsaW5rLg0KLWZ1bmN0aW9uIGNyZWF0ZUJhY2tUb1RvcExpbmsoZWxlbWVudCkgew0KLQl2YXIgZGl2Ow0KLQkNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCWRpdi5hbGlnbiA9ICdyaWdodCc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGJhY2tUb1RvcEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7CQkNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGJhY2tNZXNzYWdlKSk7CQkNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRpdik7DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBvciBjb2xsYXBzZXMgYSBzZWN0aW9uIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBldmVudC4NCi1mdW5jdGlvbiBleHBhbmRDb2xsYXBzZVNlY3Rpb24oZXZ0KSB7DQotCWlmICh0aGlzLmNvbGxhcHNlRGl2LnN0eWxlLmRpc3BsYXkgPT0gJycpIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JZWxzZSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDcmVhdGVzIHRoZSBFeHBhbmQgQWxsIGFuZCBDb2xsYXBzZSBBbGwgU2VjdGlvbnMgbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTZWN0aW9uc0xpbmtzKGZpcnN0RWxlbWVudCkgew0KLQl2YXIgZGl2Ow0KLQkJDQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpIHsNCi0JCWRpdi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWRpdi5hbGlnbiA9ICdyaWdodCc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGV4cGFuZEFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7CQkNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQWxsOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShleHBhbmRNZXNzYWdlKSk7DQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOw0KLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOwkJCQkJCQ0KLQkJDQotCQlpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gY29sbGFwc2VBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGNvbGxhcHNlQWxsOw0KLQkJc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbGxhcHNlTWVzc2FnZSkpOwkJCQkNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQkNCi0JCS8qDQotCQl2YXIgb3ZlcnZpZXdTZXBhcmF0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3ZlcnZpZXdTZXBhcmF0b3IiKTsNCi0JCW92ZXJ2aWV3U2VwYXJhdG9yLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgb3ZlcnZpZXdTZXBhcmF0b3IpOw0KLQkJKi8NCi0JCWlmIChmaXJzdFNlY3Rpb24gIT0gbnVsbCkgew0KLQkJCWZpcnN0U2VjdGlvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIGZpcnN0U2VjdGlvbik7DQotCQl9DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBhbGwgc2VjdGlvbnMuDQotZnVuY3Rpb24gZXhwYW5kQWxsKGV2dCkgew0KLQkgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCSAJc2VjdGlvbkNvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCSAJc2VjdGlvbkNvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkgfQ0KLQkgaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JIAlldnQucHJldmVudERlZmF1bHQoKTsNCi0JIH0NCi0JIHJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ29sbGFwc2VzIGFsbCBzZWN0aW9ucy4NCi1mdW5jdGlvbiBjb2xsYXBzZUFsbChldnQpIHsNCi0JZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCQlzZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQlzZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIFRoaXMgdGVtcG9yYXJ5IGZ1bmN0aW9uIGhlbHBzIHRvIHJlc29sdmUgSmF2YXNjcmlwdCBlcnJvcnMgaW4gdGhlIG1pZ3JhdGVkIFJVUA0KLS8vIGNvbnRlbnQgcGFnZXMuIEl0IHdpbGwgYmUgcmVtb3ZlZCBvbmNlIHRoZSBjb3JyZXNwb25kaW5nIC5qcyBmaWxlcyBhcmUgYmVpbmcNCi0vLyBtaWdyYXRlZCBhbG9uZyB3aXRoIHRoZSBIVE1MIGNvbnRlbnQgcGFnZXMuDQotZnVuY3Rpb24gUmVmZXJlbmNlSGVscFRvcGljICh0b3BpY05hbWUsIGJvb2sgLCBmaWxlTmFtZSkgew0KLSAgIGRvY3VtZW50LndyaXRlKCI8aT4iKyB0b3BpY05hbWUgKyAiPFwvaT4iKTsNCi19DQotDQotDQotDQotDQotDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvY29udGVudHBhZ2Vfa28uanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9rby5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjc1MGU3OS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9rby5qcworKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi12YXIgY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCA9IGZhbHNlOw0KLXZhciBmaXJzdFNlY3Rpb247DQotdmFyIGV4cGFuZEltYWdlOw0KLXZhciBjb2xsYXBzZUltYWdlOw0KLXZhciBleHBhbmRBbGxJbWFnZTsNCi12YXIgY29sbGFwc2VBbGxJbWFnZTsNCi12YXIgYmFja1RvVG9wSW1hZ2U7DQotdmFyIHNoaW1JbWFnZTsNCi12YXIgZXhwYW5kTWVzc2FnZSA9ICLrqqjrk6Ag7IS57IWYIO2OvOy5mOq4sCI7DQotdmFyIGNvbGxhcHNlTWVzc2FnZSA9ICLrqqjrk6Ag7IS57IWYIOygkeq4sCI7DQotdmFyIGJhY2tNZXNzYWdlID0gIuunqCDsnITroZwiOw0KLQ0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHNlY3Rpb24gbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlU2VjdGlvbkxpbmtzKHRhZ05hbWUsIGNsYXNzU2VsZWN0b3IsIGltZ1BhdGgpIHsNCi0JZXhwYW5kSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZC5naWYnOwkNCi0JY29sbGFwc2VJbWFnZSA9IGltZ1BhdGggKyAnY29sbGFwc2UuZ2lmJzsNCi0JZXhwYW5kQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZF9hbGwuZ2lmJzsJDQotCWNvbGxhcHNlQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2NvbGxhcHNlX2FsbC5naWYnOw0KLQliYWNrVG9Ub3BJbWFnZSA9IGltZ1BhdGggKyAnYmFja190b190b3AuZ2lmJzsNCi0Jc2hpbUltYWdlID0gaW1nUGF0aCArICdzaGltLmdpZic7DQotCQ0KLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsNCi0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOw0KLQkJdmFyIHNlY3Rpb25FbGVtZW50cyA9IG5ldyBBcnJheShlbGVtZW50cy5sZW5ndGgpOw0KLQkJdmFyIHRvdGFsTGlua3MgPSAwOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07DQotCQkJaWYgKGVsZW1lbnQuY2xhc3NOYW1lID09IGNsYXNzU2VsZWN0b3IpIHsNCi0JCQkJc2VjdGlvbkVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50Ow0KLQkJCX0NCi0JCX0NCi0JCXNlY3Rpb25FbGVtZW50cy5sZW5ndGggPSB0b3RhbExpbmtzOw0KLQkJc2VjdGlvbkNvbGxhcHNlRGl2cyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJZmlyc3RTZWN0aW9uID0gc2VjdGlvbkVsZW1lbnRzWzBdOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uRWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IHNlY3Rpb25FbGVtZW50c1tpXTsNCi0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsNCi0JCQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoc2libGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSAmJiBzaWJsaW5nQ29udGFpbmVyLnN0eWxlKSB7CQ0KLQkJCQl2YXIgbmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHRTaWJsaW5nOw0KLQkJCQllbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNpYmxpbmdDb250YWluZXIsIG5leHRTaWJsaW5nKTsNCi0JCQkJdmFyIG5leHRFbGVtZW50ID0gc2VjdGlvbkVsZW1lbnRzW2kgKyAxXTsNCi0JCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG5leHRFbGVtZW50ICYmIG5leHRTaWJsaW5nICE9IG51bGwgJiYgbmV4dFNpYmxpbmcuY2xhc3NOYW1lICE9ICdjb3B5cmlnaHQnKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2VjdGlvbkNvbGxhcHNlRGl2c1tpXSA9IHNpYmxpbmdDb250YWluZXI7DQotICAgIAkJCWNyZWF0ZUNvbGxhcHNpYmxlU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3Moc2VjdGlvbkVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc2VjdGlvbi4NCi1mdW5jdGlvbiBjcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCS8vIEFkZCBhIHNwYWNpbmcgYmV0d2VlbiB0aGUgc2VjdGlvbnMuDQotCQl2YXIgc2VjdGlvblNlcGFyYXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJc2VjdGlvblNlcGFyYXRvci5zcmMgPSBzaGltSW1hZ2U7DQotCQlzZWN0aW9uU2VwYXJhdG9yLmhlaWdodCA9ICczJzsNCi0JCXNlY3Rpb25TZXBhcmF0b3IuYm9yZGVyID0gJzAnOw0KLQkJc2VjdGlvblNlcGFyYXRvci5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzZWN0aW9uU2VwYXJhdG9yLCBlbGVtZW50KTsNCi0JCQ0KLQkJLy8gQWRkIGEgZXhwYW5kL2NvbGxhcHNlIGxpbmsgdG8gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTZWN0aW9uOw0KLQkJc2VjdGlvbkNvbGxhcHNlTGlua3NbaW5kZXhdID0gbGluazsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50Lmluc2VydEJlZm9yZShzcGFuLCBlbGVtZW50LmZpcnN0Q2hpbGQpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotICAgIAkNCi0JCS8vIEFkZCBhIEJhY2sgVG8gVG9wIGxpbmsgaW4gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCWNyZWF0ZUJhY2tUb1RvcExpbmsoc2libGluZ0NvbnRhaW5lcik7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIEJhY2sgdG8gdG9wIGxpbmsuDQotZnVuY3Rpb24gY3JlYXRlQmFja1RvVG9wTGluayhlbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQ0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKSB7DQotCQlkaXYuY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gYmFja1RvVG9wSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYmFja01lc3NhZ2UpKTsJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZGl2KTsNCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHNlY3Rpb24gYmFzZWQgb24gdGhlIHJlY2VpdmVkIGV2ZW50Lg0KLWZ1bmN0aW9uIGV4cGFuZENvbGxhcHNlU2VjdGlvbihldnQpIHsNCi0JaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQllbHNlIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgdGhlIEV4cGFuZCBBbGwgYW5kIENvbGxhcHNlIEFsbCBTZWN0aW9ucyBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3MoZmlyc3RFbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQkNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gZXhwYW5kQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGw7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGV4cGFuZE1lc3NhZ2UpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7CQkJCQkJDQotCQkNCi0JCWltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gY29sbGFwc2VBbGw7DQotCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29sbGFwc2VNZXNzYWdlKSk7CQkJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJLyoNCi0JCXZhciBvdmVydmlld1NlcGFyYXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdmVydmlld1NlcGFyYXRvciIpOw0KLQkJb3ZlcnZpZXdTZXBhcmF0b3IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBvdmVydmlld1NlcGFyYXRvcik7DQotCQkqLw0KLQkJaWYgKGZpcnN0U2VjdGlvbiAhPSBudWxsKSB7DQotCQkJZmlyc3RTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTZWN0aW9uKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIGFsbCBzZWN0aW9ucy4NCi1mdW5jdGlvbiBleHBhbmRBbGwoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHNlY3Rpb25zLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsKGV2dCkgew0KLQlmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JCXNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gVGhpcyB0ZW1wb3JhcnkgZnVuY3Rpb24gaGVscHMgdG8gcmVzb2x2ZSBKYXZhc2NyaXB0IGVycm9ycyBpbiB0aGUgbWlncmF0ZWQgUlVQDQotLy8gY29udGVudCBwYWdlcy4gSXQgd2lsbCBiZSByZW1vdmVkIG9uY2UgdGhlIGNvcnJlc3BvbmRpbmcgLmpzIGZpbGVzIGFyZSBiZWluZw0KLS8vIG1pZ3JhdGVkIGFsb25nIHdpdGggdGhlIEhUTUwgY29udGVudCBwYWdlcy4NCi1mdW5jdGlvbiBSZWZlcmVuY2VIZWxwVG9waWMgKHRvcGljTmFtZSwgYm9vayAsIGZpbGVOYW1lKSB7DQotICAgZG9jdW1lbnQud3JpdGUoIjxpPiIrIHRvcGljTmFtZSArICI8XC9pPiIpOw0KLX0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9wdF9CUi5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL2NvbnRlbnRwYWdlX3B0X0JSLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YWY2MGRhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL2NvbnRlbnRwYWdlX3B0X0JSLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLXZhciBjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0ID0gZmFsc2U7DQotdmFyIGZpcnN0U2VjdGlvbjsNCi12YXIgZXhwYW5kSW1hZ2U7DQotdmFyIGNvbGxhcHNlSW1hZ2U7DQotdmFyIGV4cGFuZEFsbEltYWdlOw0KLXZhciBjb2xsYXBzZUFsbEltYWdlOw0KLXZhciBiYWNrVG9Ub3BJbWFnZTsNCi12YXIgc2hpbUltYWdlOw0KLXZhciBleHBhbmRNZXNzYWdlID0gIkV4cGFuZGlyIFRvZGFzIGFzIFNlw6fDtWVzIjsNCi12YXIgY29sbGFwc2VNZXNzYWdlID0gIlJlZHV6aXIgVG9kYXMgYXMgU2XDp8O1ZXMiOw0KLXZhciBiYWNrTWVzc2FnZSA9ICJWb2x0YXIgYW8gSW7DrWNpbyBkYSBQw6FnaW5hIjsNCi0NCi0vLyBDcmVhdGVzIHRoZSBjb2xsYXBzaWJsZSBzZWN0aW9uIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZVNlY3Rpb25MaW5rcyh0YWdOYW1lLCBjbGFzc1NlbGVjdG9yLCBpbWdQYXRoKSB7DQotCWV4cGFuZEltYWdlID0gaW1nUGF0aCArICdleHBhbmQuZ2lmJzsJDQotCWNvbGxhcHNlSW1hZ2UgPSBpbWdQYXRoICsgJ2NvbGxhcHNlLmdpZic7DQotCWV4cGFuZEFsbEltYWdlID0gaW1nUGF0aCArICdleHBhbmRfYWxsLmdpZic7CQ0KLQljb2xsYXBzZUFsbEltYWdlID0gaW1nUGF0aCArICdjb2xsYXBzZV9hbGwuZ2lmJzsNCi0JYmFja1RvVG9wSW1hZ2UgPSBpbWdQYXRoICsgJ2JhY2tfdG9fdG9wLmdpZic7DQotCXNoaW1JbWFnZSA9IGltZ1BhdGggKyAnc2hpbS5naWYnOw0KLQkNCi0JaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7DQotCQl2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsNCi0JCXZhciBzZWN0aW9uRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsNCi0JCXZhciB0b3RhbExpbmtzID0gMDsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOw0KLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7DQotCQkJCXNlY3Rpb25FbGVtZW50c1t0b3RhbExpbmtzKytdID0gZWxlbWVudDsNCi0JCQl9DQotCQl9DQotCQlzZWN0aW9uRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsNCi0JCXNlY3Rpb25Db2xsYXBzZURpdnMgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlzZWN0aW9uQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCWZpcnN0U2VjdGlvbiA9IHNlY3Rpb25FbGVtZW50c1swXTsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgc2VjdGlvbkVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJdmFyIGVsZW1lbnQgPSBzZWN0aW9uRWxlbWVudHNbaV07DQotCQkJdmFyIHNpYmxpbmdDb250YWluZXI7DQotCQkJaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKHNpYmxpbmdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkgJiYgc2libGluZ0NvbnRhaW5lci5zdHlsZSkgewkNCi0JCQkJdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0U2libGluZzsNCi0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7DQotCQkJCXZhciBuZXh0RWxlbWVudCA9IHNlY3Rpb25FbGVtZW50c1tpICsgMV07DQotCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBuZXh0RWxlbWVudCAmJiBuZXh0U2libGluZyAhPSBudWxsICYmIG5leHRTaWJsaW5nLmNsYXNzTmFtZSAhPSAnY29weXJpZ2h0Jykgew0KLQkJCQkJdmFyIHRvTW92ZSA9IG5leHRTaWJsaW5nOw0KLQkJCQkJbmV4dFNpYmxpbmcgPSBuZXh0U2libGluZy5uZXh0U2libGluZzsNCi0JCQkJCXNpYmxpbmdDb250YWluZXIuYXBwZW5kQ2hpbGQodG9Nb3ZlKTsNCi0JCQkJfQ0KLQkJCQlpZiAoY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCkgew0KLSAgICAJCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQl9DQotICAgIAkJCXNlY3Rpb25Db2xsYXBzZURpdnNbaV0gPSBzaWJsaW5nQ29udGFpbmVyOw0KLSAgICAJCQljcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaSk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJfQ0KLQkJY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTZWN0aW9uc0xpbmtzKHNlY3Rpb25FbGVtZW50c1swXSk7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIGNvbGxhcHNpYmxlIHNlY3Rpb24uDQotZnVuY3Rpb24gY3JlYXRlQ29sbGFwc2libGVTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGluZGV4KSB7DQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7DQotCQkvLyBBZGQgYSBzcGFjaW5nIGJldHdlZW4gdGhlIHNlY3Rpb25zLg0KLQkJdmFyIHNlY3Rpb25TZXBhcmF0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCXNlY3Rpb25TZXBhcmF0b3Iuc3JjID0gc2hpbUltYWdlOw0KLQkJc2VjdGlvblNlcGFyYXRvci5oZWlnaHQgPSAnMyc7DQotCQlzZWN0aW9uU2VwYXJhdG9yLmJvcmRlciA9ICcwJzsNCi0JCXNlY3Rpb25TZXBhcmF0b3IuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2VjdGlvblNlcGFyYXRvciwgZWxlbWVudCk7DQotCQkNCi0JCS8vIEFkZCBhIGV4cGFuZC9jb2xsYXBzZSBsaW5rIHRvIHRoZSBzZWN0aW9uIGhlYWRpbmcuDQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jb2xsYXBzZURpdiA9IHNpYmxpbmdDb250YWluZXI7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWlmIChjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0KSB7DQotCQkJaW1hZ2Uuc3JjID0gZXhwYW5kSW1hZ2U7DQotCQl9DQotCQllbHNlIHsNCi0JCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkJfQ0KLQkJaW1hZ2Uud2lkdGggPSAnMTcnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE1JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGV4cGFuZENvbGxhcHNlU2VjdGlvbjsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzW2luZGV4XSA9IGxpbms7DQotCQlzcGFuLmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLSAgICAJDQotCQkvLyBBZGQgYSBCYWNrIFRvIFRvcCBsaW5rIGluIHRoZSBzZWN0aW9uIGhlYWRpbmcuDQotCQljcmVhdGVCYWNrVG9Ub3BMaW5rKHNpYmxpbmdDb250YWluZXIpOw0KLQl9DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSBCYWNrIHRvIHRvcCBsaW5rLg0KLWZ1bmN0aW9uIGNyZWF0ZUJhY2tUb1RvcExpbmsoZWxlbWVudCkgew0KLQl2YXIgZGl2Ow0KLQkNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCWRpdi5hbGlnbiA9ICdyaWdodCc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGJhY2tUb1RvcEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7CQkNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGJhY2tNZXNzYWdlKSk7CQkNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRpdik7DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBvciBjb2xsYXBzZXMgYSBzZWN0aW9uIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBldmVudC4NCi1mdW5jdGlvbiBleHBhbmRDb2xsYXBzZVNlY3Rpb24oZXZ0KSB7DQotCWlmICh0aGlzLmNvbGxhcHNlRGl2LnN0eWxlLmRpc3BsYXkgPT0gJycpIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JZWxzZSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDcmVhdGVzIHRoZSBFeHBhbmQgQWxsIGFuZCBDb2xsYXBzZSBBbGwgU2VjdGlvbnMgbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTZWN0aW9uc0xpbmtzKGZpcnN0RWxlbWVudCkgew0KLQl2YXIgZGl2Ow0KLQkJDQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpIHsNCi0JCWRpdi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWRpdi5hbGlnbiA9ICdyaWdodCc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGV4cGFuZEFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7CQkNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQWxsOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShleHBhbmRNZXNzYWdlKSk7DQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOw0KLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOwkJCQkJCQ0KLQkJDQotCQlpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gY29sbGFwc2VBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGNvbGxhcHNlQWxsOw0KLQkJc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbGxhcHNlTWVzc2FnZSkpOwkJCQkNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQkNCi0JCS8qDQotCQl2YXIgb3ZlcnZpZXdTZXBhcmF0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3ZlcnZpZXdTZXBhcmF0b3IiKTsNCi0JCW92ZXJ2aWV3U2VwYXJhdG9yLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgb3ZlcnZpZXdTZXBhcmF0b3IpOw0KLQkJKi8NCi0JCWlmIChmaXJzdFNlY3Rpb24gIT0gbnVsbCkgew0KLQkJCWZpcnN0U2VjdGlvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIGZpcnN0U2VjdGlvbik7DQotCQl9DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBhbGwgc2VjdGlvbnMuDQotZnVuY3Rpb24gZXhwYW5kQWxsKGV2dCkgew0KLQkgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCSAJc2VjdGlvbkNvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCSAJc2VjdGlvbkNvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkgfQ0KLQkgaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JIAlldnQucHJldmVudERlZmF1bHQoKTsNCi0JIH0NCi0JIHJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ29sbGFwc2VzIGFsbCBzZWN0aW9ucy4NCi1mdW5jdGlvbiBjb2xsYXBzZUFsbChldnQpIHsNCi0JZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCQlzZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQlzZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIFRoaXMgdGVtcG9yYXJ5IGZ1bmN0aW9uIGhlbHBzIHRvIHJlc29sdmUgSmF2YXNjcmlwdCBlcnJvcnMgaW4gdGhlIG1pZ3JhdGVkIFJVUA0KLS8vIGNvbnRlbnQgcGFnZXMuIEl0IHdpbGwgYmUgcmVtb3ZlZCBvbmNlIHRoZSBjb3JyZXNwb25kaW5nIC5qcyBmaWxlcyBhcmUgYmVpbmcNCi0vLyBtaWdyYXRlZCBhbG9uZyB3aXRoIHRoZSBIVE1MIGNvbnRlbnQgcGFnZXMuDQotZnVuY3Rpb24gUmVmZXJlbmNlSGVscFRvcGljICh0b3BpY05hbWUsIGJvb2sgLCBmaWxlTmFtZSkgew0KLSAgIGRvY3VtZW50LndyaXRlKCI8aT4iKyB0b3BpY05hbWUgKyAiPFwvaT4iKTsNCi19DQotDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvY29udGVudHBhZ2VfemhfQ04uanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV96aF9DTi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODNhMzI3OC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV96aF9DTi5qcworKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi12YXIgY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCA9IGZhbHNlOw0KLXZhciBmaXJzdFNlY3Rpb247DQotdmFyIGV4cGFuZEltYWdlOw0KLXZhciBjb2xsYXBzZUltYWdlOw0KLXZhciBleHBhbmRBbGxJbWFnZTsNCi12YXIgY29sbGFwc2VBbGxJbWFnZTsNCi12YXIgYmFja1RvVG9wSW1hZ2U7DQotdmFyIHNoaW1JbWFnZTsNCi12YXIgZXhwYW5kTWVzc2FnZSA9ICLlsZXlvIDmiYDmnInpg6jliIYiOw0KLXZhciBjb2xsYXBzZU1lc3NhZ2UgPSAi5oqY5Y+g5omA5pyJ6YOo5YiGIjsNCi12YXIgYmFja01lc3NhZ2UgPSAi5Zue5Yiw6aG26YOoIjsNCi0NCi0vLyBDcmVhdGVzIHRoZSBjb2xsYXBzaWJsZSBzZWN0aW9uIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZVNlY3Rpb25MaW5rcyh0YWdOYW1lLCBjbGFzc1NlbGVjdG9yLCBpbWdQYXRoKSB7DQotCWV4cGFuZEltYWdlID0gaW1nUGF0aCArICdleHBhbmQuZ2lmJzsJDQotCWNvbGxhcHNlSW1hZ2UgPSBpbWdQYXRoICsgJ2NvbGxhcHNlLmdpZic7DQotCWV4cGFuZEFsbEltYWdlID0gaW1nUGF0aCArICdleHBhbmRfYWxsLmdpZic7CQ0KLQljb2xsYXBzZUFsbEltYWdlID0gaW1nUGF0aCArICdjb2xsYXBzZV9hbGwuZ2lmJzsNCi0JYmFja1RvVG9wSW1hZ2UgPSBpbWdQYXRoICsgJ2JhY2tfdG9fdG9wLmdpZic7DQotCXNoaW1JbWFnZSA9IGltZ1BhdGggKyAnc2hpbS5naWYnOw0KLQkNCi0JaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7DQotCQl2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsNCi0JCXZhciBzZWN0aW9uRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsNCi0JCXZhciB0b3RhbExpbmtzID0gMDsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOw0KLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7DQotCQkJCXNlY3Rpb25FbGVtZW50c1t0b3RhbExpbmtzKytdID0gZWxlbWVudDsNCi0JCQl9DQotCQl9DQotCQlzZWN0aW9uRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsNCi0JCXNlY3Rpb25Db2xsYXBzZURpdnMgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlzZWN0aW9uQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCWZpcnN0U2VjdGlvbiA9IHNlY3Rpb25FbGVtZW50c1swXTsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgc2VjdGlvbkVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJdmFyIGVsZW1lbnQgPSBzZWN0aW9uRWxlbWVudHNbaV07DQotCQkJdmFyIHNpYmxpbmdDb250YWluZXI7DQotCQkJaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKHNpYmxpbmdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkgJiYgc2libGluZ0NvbnRhaW5lci5zdHlsZSkgewkNCi0JCQkJdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0U2libGluZzsNCi0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7DQotCQkJCXZhciBuZXh0RWxlbWVudCA9IHNlY3Rpb25FbGVtZW50c1tpICsgMV07DQotCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBuZXh0RWxlbWVudCAmJiBuZXh0U2libGluZyAhPSBudWxsICYmIG5leHRTaWJsaW5nLmNsYXNzTmFtZSAhPSAnY29weXJpZ2h0Jykgew0KLQkJCQkJdmFyIHRvTW92ZSA9IG5leHRTaWJsaW5nOw0KLQkJCQkJbmV4dFNpYmxpbmcgPSBuZXh0U2libGluZy5uZXh0U2libGluZzsNCi0JCQkJCXNpYmxpbmdDb250YWluZXIuYXBwZW5kQ2hpbGQodG9Nb3ZlKTsNCi0JCQkJfQ0KLQkJCQlpZiAoY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCkgew0KLSAgICAJCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQl9DQotICAgIAkJCXNlY3Rpb25Db2xsYXBzZURpdnNbaV0gPSBzaWJsaW5nQ29udGFpbmVyOw0KLSAgICAJCQljcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaSk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJfQ0KLQkJY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTZWN0aW9uc0xpbmtzKHNlY3Rpb25FbGVtZW50c1swXSk7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIGNvbGxhcHNpYmxlIHNlY3Rpb24uDQotZnVuY3Rpb24gY3JlYXRlQ29sbGFwc2libGVTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGluZGV4KSB7DQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7DQotCQkvLyBBZGQgYSBzcGFjaW5nIGJldHdlZW4gdGhlIHNlY3Rpb25zLg0KLQkJdmFyIHNlY3Rpb25TZXBhcmF0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCXNlY3Rpb25TZXBhcmF0b3Iuc3JjID0gc2hpbUltYWdlOw0KLQkJc2VjdGlvblNlcGFyYXRvci5oZWlnaHQgPSAnMyc7DQotCQlzZWN0aW9uU2VwYXJhdG9yLmJvcmRlciA9ICcwJzsNCi0JCXNlY3Rpb25TZXBhcmF0b3IuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2VjdGlvblNlcGFyYXRvciwgZWxlbWVudCk7DQotCQkNCi0JCS8vIEFkZCBhIGV4cGFuZC9jb2xsYXBzZSBsaW5rIHRvIHRoZSBzZWN0aW9uIGhlYWRpbmcuDQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jb2xsYXBzZURpdiA9IHNpYmxpbmdDb250YWluZXI7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWlmIChjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0KSB7DQotCQkJaW1hZ2Uuc3JjID0gZXhwYW5kSW1hZ2U7DQotCQl9DQotCQllbHNlIHsNCi0JCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkJfQ0KLQkJaW1hZ2Uud2lkdGggPSAnMTcnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE1JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGV4cGFuZENvbGxhcHNlU2VjdGlvbjsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzW2luZGV4XSA9IGxpbms7DQotCQlzcGFuLmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLSAgICAJDQotCQkvLyBBZGQgYSBCYWNrIFRvIFRvcCBsaW5rIGluIHRoZSBzZWN0aW9uIGhlYWRpbmcuDQotCQljcmVhdGVCYWNrVG9Ub3BMaW5rKHNpYmxpbmdDb250YWluZXIpOw0KLQl9DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSBCYWNrIHRvIHRvcCBsaW5rLg0KLWZ1bmN0aW9uIGNyZWF0ZUJhY2tUb1RvcExpbmsoZWxlbWVudCkgew0KLQl2YXIgZGl2Ow0KLQkNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCWRpdi5hbGlnbiA9ICdyaWdodCc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGJhY2tUb1RvcEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7CQkNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGJhY2tNZXNzYWdlKSk7CQkNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRpdik7DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBvciBjb2xsYXBzZXMgYSBzZWN0aW9uIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBldmVudC4NCi1mdW5jdGlvbiBleHBhbmRDb2xsYXBzZVNlY3Rpb24oZXZ0KSB7DQotCWlmICh0aGlzLmNvbGxhcHNlRGl2LnN0eWxlLmRpc3BsYXkgPT0gJycpIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JZWxzZSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDcmVhdGVzIHRoZSBFeHBhbmQgQWxsIGFuZCBDb2xsYXBzZSBBbGwgU2VjdGlvbnMgbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTZWN0aW9uc0xpbmtzKGZpcnN0RWxlbWVudCkgew0KLQl2YXIgZGl2Ow0KLQkJDQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpIHsNCi0JCWRpdi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWRpdi5hbGlnbiA9ICdyaWdodCc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGV4cGFuZEFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7CQkNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQWxsOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShleHBhbmRNZXNzYWdlKSk7DQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOw0KLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOwkJCQkJCQ0KLQkJDQotCQlpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gY29sbGFwc2VBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGNvbGxhcHNlQWxsOw0KLQkJc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbGxhcHNlTWVzc2FnZSkpOwkJCQkNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQkNCi0JCS8qDQotCQl2YXIgb3ZlcnZpZXdTZXBhcmF0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3ZlcnZpZXdTZXBhcmF0b3IiKTsNCi0JCW92ZXJ2aWV3U2VwYXJhdG9yLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgb3ZlcnZpZXdTZXBhcmF0b3IpOw0KLQkJKi8NCi0JCWlmIChmaXJzdFNlY3Rpb24gIT0gbnVsbCkgew0KLQkJCWZpcnN0U2VjdGlvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIGZpcnN0U2VjdGlvbik7DQotCQl9DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBhbGwgc2VjdGlvbnMuDQotZnVuY3Rpb24gZXhwYW5kQWxsKGV2dCkgew0KLQkgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCSAJc2VjdGlvbkNvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCSAJc2VjdGlvbkNvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkgfQ0KLQkgaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JIAlldnQucHJldmVudERlZmF1bHQoKTsNCi0JIH0NCi0JIHJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ29sbGFwc2VzIGFsbCBzZWN0aW9ucy4NCi1mdW5jdGlvbiBjb2xsYXBzZUFsbChldnQpIHsNCi0JZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCQlzZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQlzZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIFRoaXMgdGVtcG9yYXJ5IGZ1bmN0aW9uIGhlbHBzIHRvIHJlc29sdmUgSmF2YXNjcmlwdCBlcnJvcnMgaW4gdGhlIG1pZ3JhdGVkIFJVUA0KLS8vIGNvbnRlbnQgcGFnZXMuIEl0IHdpbGwgYmUgcmVtb3ZlZCBvbmNlIHRoZSBjb3JyZXNwb25kaW5nIC5qcyBmaWxlcyBhcmUgYmVpbmcNCi0vLyBtaWdyYXRlZCBhbG9uZyB3aXRoIHRoZSBIVE1MIGNvbnRlbnQgcGFnZXMuDQotZnVuY3Rpb24gUmVmZXJlbmNlSGVscFRvcGljICh0b3BpY05hbWUsIGJvb2sgLCBmaWxlTmFtZSkgew0KLSAgIGRvY3VtZW50LndyaXRlKCI8aT4iKyB0b3BpY05hbWUgKyAiPFwvaT4iKTsNCi19DQotDQotDQotDQotDQotDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvY29udGVudHBhZ2VfemhfVFcuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV96aF9UVy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTEzZjJhMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV96aF9UVy5qcworKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi12YXIgY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCA9IGZhbHNlOw0KLXZhciBmaXJzdFNlY3Rpb247DQotdmFyIGV4cGFuZEltYWdlOw0KLXZhciBjb2xsYXBzZUltYWdlOw0KLXZhciBleHBhbmRBbGxJbWFnZTsNCi12YXIgY29sbGFwc2VBbGxJbWFnZTsNCi12YXIgYmFja1RvVG9wSW1hZ2U7DQotdmFyIHNoaW1JbWFnZTsNCi12YXIgZXhwYW5kTWVzc2FnZSA9ICLlsZXplovlhajpg6jljYDmrrUiOw0KLXZhciBjb2xsYXBzZU1lc3NhZ2UgPSAi5pS25ZCI5YWo6YOo5Y2A5q61IjsNCi12YXIgYmFja01lc3NhZ2UgPSAi5Zue5Yiw6aCC56uvIjsNCi0NCi0vLyBDcmVhdGVzIHRoZSBjb2xsYXBzaWJsZSBzZWN0aW9uIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZVNlY3Rpb25MaW5rcyh0YWdOYW1lLCBjbGFzc1NlbGVjdG9yLCBpbWdQYXRoKSB7DQotCWV4cGFuZEltYWdlID0gaW1nUGF0aCArICdleHBhbmQuZ2lmJzsJDQotCWNvbGxhcHNlSW1hZ2UgPSBpbWdQYXRoICsgJ2NvbGxhcHNlLmdpZic7DQotCWV4cGFuZEFsbEltYWdlID0gaW1nUGF0aCArICdleHBhbmRfYWxsLmdpZic7CQ0KLQljb2xsYXBzZUFsbEltYWdlID0gaW1nUGF0aCArICdjb2xsYXBzZV9hbGwuZ2lmJzsNCi0JYmFja1RvVG9wSW1hZ2UgPSBpbWdQYXRoICsgJ2JhY2tfdG9fdG9wLmdpZic7DQotCXNoaW1JbWFnZSA9IGltZ1BhdGggKyAnc2hpbS5naWYnOw0KLQkNCi0JaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7DQotCQl2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsNCi0JCXZhciBzZWN0aW9uRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsNCi0JCXZhciB0b3RhbExpbmtzID0gMDsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOw0KLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7DQotCQkJCXNlY3Rpb25FbGVtZW50c1t0b3RhbExpbmtzKytdID0gZWxlbWVudDsNCi0JCQl9DQotCQl9DQotCQlzZWN0aW9uRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsNCi0JCXNlY3Rpb25Db2xsYXBzZURpdnMgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlzZWN0aW9uQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCWZpcnN0U2VjdGlvbiA9IHNlY3Rpb25FbGVtZW50c1swXTsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgc2VjdGlvbkVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJdmFyIGVsZW1lbnQgPSBzZWN0aW9uRWxlbWVudHNbaV07DQotCQkJdmFyIHNpYmxpbmdDb250YWluZXI7DQotCQkJaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKHNpYmxpbmdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkgJiYgc2libGluZ0NvbnRhaW5lci5zdHlsZSkgewkNCi0JCQkJdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0U2libGluZzsNCi0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7DQotCQkJCXZhciBuZXh0RWxlbWVudCA9IHNlY3Rpb25FbGVtZW50c1tpICsgMV07DQotCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBuZXh0RWxlbWVudCAmJiBuZXh0U2libGluZyAhPSBudWxsICYmIG5leHRTaWJsaW5nLmNsYXNzTmFtZSAhPSAnY29weXJpZ2h0Jykgew0KLQkJCQkJdmFyIHRvTW92ZSA9IG5leHRTaWJsaW5nOw0KLQkJCQkJbmV4dFNpYmxpbmcgPSBuZXh0U2libGluZy5uZXh0U2libGluZzsNCi0JCQkJCXNpYmxpbmdDb250YWluZXIuYXBwZW5kQ2hpbGQodG9Nb3ZlKTsNCi0JCQkJfQ0KLQkJCQlpZiAoY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCkgew0KLSAgICAJCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQl9DQotICAgIAkJCXNlY3Rpb25Db2xsYXBzZURpdnNbaV0gPSBzaWJsaW5nQ29udGFpbmVyOw0KLSAgICAJCQljcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaSk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJfQ0KLQkJY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTZWN0aW9uc0xpbmtzKHNlY3Rpb25FbGVtZW50c1swXSk7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIGNvbGxhcHNpYmxlIHNlY3Rpb24uDQotZnVuY3Rpb24gY3JlYXRlQ29sbGFwc2libGVTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGluZGV4KSB7DQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7DQotCQkvLyBBZGQgYSBzcGFjaW5nIGJldHdlZW4gdGhlIHNlY3Rpb25zLg0KLQkJdmFyIHNlY3Rpb25TZXBhcmF0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCXNlY3Rpb25TZXBhcmF0b3Iuc3JjID0gc2hpbUltYWdlOw0KLQkJc2VjdGlvblNlcGFyYXRvci5oZWlnaHQgPSAnMyc7DQotCQlzZWN0aW9uU2VwYXJhdG9yLmJvcmRlciA9ICcwJzsNCi0JCXNlY3Rpb25TZXBhcmF0b3IuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2VjdGlvblNlcGFyYXRvciwgZWxlbWVudCk7DQotCQkNCi0JCS8vIEFkZCBhIGV4cGFuZC9jb2xsYXBzZSBsaW5rIHRvIHRoZSBzZWN0aW9uIGhlYWRpbmcuDQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jb2xsYXBzZURpdiA9IHNpYmxpbmdDb250YWluZXI7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWlmIChjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0KSB7DQotCQkJaW1hZ2Uuc3JjID0gZXhwYW5kSW1hZ2U7DQotCQl9DQotCQllbHNlIHsNCi0JCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkJfQ0KLQkJaW1hZ2Uud2lkdGggPSAnMTcnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE1JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGV4cGFuZENvbGxhcHNlU2VjdGlvbjsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzW2luZGV4XSA9IGxpbms7DQotCQlzcGFuLmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLSAgICAJDQotCQkvLyBBZGQgYSBCYWNrIFRvIFRvcCBsaW5rIGluIHRoZSBzZWN0aW9uIGhlYWRpbmcuDQotCQljcmVhdGVCYWNrVG9Ub3BMaW5rKHNpYmxpbmdDb250YWluZXIpOw0KLQl9DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSBCYWNrIHRvIHRvcCBsaW5rLg0KLWZ1bmN0aW9uIGNyZWF0ZUJhY2tUb1RvcExpbmsoZWxlbWVudCkgew0KLQl2YXIgZGl2Ow0KLQkNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCWRpdi5hbGlnbiA9ICdyaWdodCc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGJhY2tUb1RvcEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7CQkNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGJhY2tNZXNzYWdlKSk7CQkNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRpdik7DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBvciBjb2xsYXBzZXMgYSBzZWN0aW9uIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBldmVudC4NCi1mdW5jdGlvbiBleHBhbmRDb2xsYXBzZVNlY3Rpb24oZXZ0KSB7DQotCWlmICh0aGlzLmNvbGxhcHNlRGl2LnN0eWxlLmRpc3BsYXkgPT0gJycpIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JZWxzZSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDcmVhdGVzIHRoZSBFeHBhbmQgQWxsIGFuZCBDb2xsYXBzZSBBbGwgU2VjdGlvbnMgbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTZWN0aW9uc0xpbmtzKGZpcnN0RWxlbWVudCkgew0KLQl2YXIgZGl2Ow0KLQkJDQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpIHsNCi0JCWRpdi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWRpdi5hbGlnbiA9ICdyaWdodCc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGV4cGFuZEFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7CQkNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQWxsOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShleHBhbmRNZXNzYWdlKSk7DQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOw0KLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOwkJCQkJCQ0KLQkJDQotCQlpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gY29sbGFwc2VBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGNvbGxhcHNlQWxsOw0KLQkJc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbGxhcHNlTWVzc2FnZSkpOwkJCQkNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQkNCi0JCS8qDQotCQl2YXIgb3ZlcnZpZXdTZXBhcmF0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3ZlcnZpZXdTZXBhcmF0b3IiKTsNCi0JCW92ZXJ2aWV3U2VwYXJhdG9yLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgb3ZlcnZpZXdTZXBhcmF0b3IpOw0KLQkJKi8NCi0JCWlmIChmaXJzdFNlY3Rpb24gIT0gbnVsbCkgew0KLQkJCWZpcnN0U2VjdGlvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIGZpcnN0U2VjdGlvbik7DQotCQl9DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBhbGwgc2VjdGlvbnMuDQotZnVuY3Rpb24gZXhwYW5kQWxsKGV2dCkgew0KLQkgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCSAJc2VjdGlvbkNvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCSAJc2VjdGlvbkNvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkgfQ0KLQkgaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JIAlldnQucHJldmVudERlZmF1bHQoKTsNCi0JIH0NCi0JIHJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ29sbGFwc2VzIGFsbCBzZWN0aW9ucy4NCi1mdW5jdGlvbiBjb2xsYXBzZUFsbChldnQpIHsNCi0JZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCQlzZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQlzZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIFRoaXMgdGVtcG9yYXJ5IGZ1bmN0aW9uIGhlbHBzIHRvIHJlc29sdmUgSmF2YXNjcmlwdCBlcnJvcnMgaW4gdGhlIG1pZ3JhdGVkIFJVUA0KLS8vIGNvbnRlbnQgcGFnZXMuIEl0IHdpbGwgYmUgcmVtb3ZlZCBvbmNlIHRoZSBjb3JyZXNwb25kaW5nIC5qcyBmaWxlcyBhcmUgYmVpbmcNCi0vLyBtaWdyYXRlZCBhbG9uZyB3aXRoIHRoZSBIVE1MIGNvbnRlbnQgcGFnZXMuDQotZnVuY3Rpb24gUmVmZXJlbmNlSGVscFRvcGljICh0b3BpY05hbWUsIGJvb2sgLCBmaWxlTmFtZSkgew0KLSAgIGRvY3VtZW50LndyaXRlKCI8aT4iKyB0b3BpY05hbWUgKyAiPFwvaT4iKTsNCi19DQotDQotDQotDQotDQotDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvc3RlcHNfZGUuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc19kZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTFlZjdlOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc19kZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi12YXIgY29sbGFwc2VTdGVwc0J5RGVmYXVsdCA9IHRydWU7DQotdmFyIHN0ZXBJbWdCYWNrUGF0aCA9ICcuLi8uLi8nOw0KLXZhciBleHBhbmRBbGxUZXh0ID0gIkFsbGUgU2Nocml0dHN0cnVrdHVyZW4gZWluYmxlbmRlbiI7DQotdmFyIGNvbGxhcHNlQWxsVGV4dCA9ICJBbGxlIFNjaHJpdHRzdHJ1a3R1cmVuIGF1c2JsZW5kZW4iOw0KLXZhciBmaXJzdFN0ZXBTZWN0aW9uOw0KLQ0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHN0ZXAgc2VjdGlvbiBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVTdGVwTGlua3ModGFnTmFtZSwgY2xhc3NTZWxlY3Rvcikgew0KLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsNCi0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOw0KLQkJaWYgKGVsZW1lbnRzLmxlbmd0aCA9PSAwKSByZXR1cm47DQotCQl2YXIgc3RlcEVsZW1lbnRzID0gbmV3IEFycmF5KGVsZW1lbnRzLmxlbmd0aCk7DQotCQl2YXIgdG90YWxMaW5rcyA9IDA7DQotCQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsNCi0JCQlpZiAoZWxlbWVudC5jbGFzc05hbWUgPT0gY2xhc3NTZWxlY3Rvcikgew0KLQkJCQlzdGVwRWxlbWVudHNbdG90YWxMaW5rcysrXSA9IGVsZW1lbnQ7DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKHRvdGFsTGlua3MgPT0gMCkgcmV0dXJuOw0KLQkJc3RlcEVsZW1lbnRzLmxlbmd0aCA9IHRvdGFsTGlua3M7DQotCQlzdGVwQ29sbGFwc2VEaXZzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJc3RlcENvbGxhcHNlTGlua3MgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlmaXJzdFN0ZXBTZWN0aW9uID0gc3RlcEVsZW1lbnRzWzBdOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpXTsNCi0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsNCi0JCQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoc2libGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSAmJiBzaWJsaW5nQ29udGFpbmVyLnN0eWxlKSB7DQotCQkJCXZhciBuZXh0U2libGluZyA9IGVsZW1lbnQubmV4dFNpYmxpbmc7DQotCQkJCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2libGluZ0NvbnRhaW5lciwgbmV4dFNpYmxpbmcpOw0KLQkJCQl2YXIgbmV4dEVsZW1lbnQgPSBzdGVwRWxlbWVudHNbaSArIDFdOw0KLQkJCQl3aGlsZSAobmV4dFNpYmxpbmcgIT0gbmV4dEVsZW1lbnQgJiYgbmV4dFNpYmxpbmcgIT0gbnVsbCkgew0KLQkJCQkJdmFyIHRvTW92ZSA9IG5leHRTaWJsaW5nOw0KLQkJCQkJbmV4dFNpYmxpbmcgPSBuZXh0U2libGluZy5uZXh0U2libGluZzsNCi0JCQkJCXNpYmxpbmdDb250YWluZXIuYXBwZW5kQ2hpbGQodG9Nb3ZlKTsNCi0JCQkJfQ0KLQkJCQlpZiAoY29sbGFwc2VTdGVwc0J5RGVmYXVsdCkgew0KLSAgICAJCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQl9DQotICAgIAkJCXNpYmxpbmdDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0gICAgCQkJc3RlcENvbGxhcHNlRGl2c1tpXSA9IHNpYmxpbmdDb250YWluZXI7DQotICAgIAkJCWNyZWF0ZUNvbGxhcHNpYmxlU3RlcFNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaSk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJfQ0KLQkJY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTdGVwc0xpbmtzKHN0ZXBFbGVtZW50c1swXSk7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIGNvbGxhcHNpYmxlIHN0ZXAgc2VjdGlvbi4NCi1mdW5jdGlvbiBjcmVhdGVDb2xsYXBzaWJsZVN0ZXBTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGluZGV4KSB7DQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jb2xsYXBzZURpdiA9IHNpYmxpbmdDb250YWluZXI7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWlmIChjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0KSB7DQotCQkJaW1hZ2Uuc3JjID0gZXhwYW5kSW1hZ2U7DQotCQl9DQotCQllbHNlIHsNCi0JCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkJfQ0KLQkJaW1hZ2Uud2lkdGggPSAnMTcnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE1JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGV4cGFuZENvbGxhcHNlU3RlcFNlY3Rpb247DQotCQlzdGVwQ29sbGFwc2VMaW5rc1tpbmRleF0gPSBsaW5rOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWVsZW1lbnQuaW5zZXJ0QmVmb3JlKHNwYW4sIGVsZW1lbnQuZmlyc3RDaGlsZCk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHN0ZXAgc2VjdGlvbiBiYXNlZCBvbiB0aGUgcmVjZWl2ZWQgZXZlbnQuDQotZnVuY3Rpb24gZXhwYW5kQ29sbGFwc2VTdGVwU2VjdGlvbihldnQpIHsNCi0JaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQllbHNlIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgdGhlIEV4cGFuZCBBbGwgYW5kIENvbGxhcHNlIEFsbCBTdGVwcyBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFN0ZXBzTGlua3MoZmlyc3RFbGVtZW50KSB7DQotCXZhciBkaXY7DQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpIHsNCi0JCWRpdi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWRpdi5hbGlnbiA9ICdyaWdodCc7CQkNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gZXhwYW5kQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQWxsU3RlcHM7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGV4cGFuZEFsbFRleHQpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQkNCi0JCWltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gY29sbGFwc2VBbGxTdGVwczsNCi0JCXNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb2xsYXBzZUFsbFRleHQpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQkNCi0JCWlmIChmaXJzdFN0ZXBTZWN0aW9uKSB7DQotCQkJZmlyc3RTdGVwU2VjdGlvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIGZpcnN0U3RlcFNlY3Rpb24pOw0KLQkJfQ0KLQl9DQotfQ0KLQ0KLS8vIEV4cGFuZHMgYWxsIHN0ZXBzLg0KLWZ1bmN0aW9uIGV4cGFuZEFsbFN0ZXBzKGV2dCkgew0KLQkgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCSAJc3RlcENvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCSAJc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkgfQ0KLQkgaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JIAlldnQucHJldmVudERlZmF1bHQoKTsNCi0JIH0NCi0JIHJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ29sbGFwc2VzIGFsbCBzdGVwcy4NCi1mdW5jdGlvbiBjb2xsYXBzZUFsbFN0ZXBzKGV2dCkgew0KLQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBDb2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JCXN0ZXBDb2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXN0ZXBDb2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvc3RlcHNfZXMuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc19lcy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2I1NmFjYi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc19lcy5qcworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi12YXIgY29sbGFwc2VTdGVwc0J5RGVmYXVsdCA9IHRydWU7DQotdmFyIHN0ZXBJbWdCYWNrUGF0aCA9ICcuLi8uLi8nOw0KLXZhciBleHBhbmRBbGxUZXh0ID0gIkV4cGFuZGlyIHRvZG9zIGxvcyBwYXNvcyI7DQotdmFyIGNvbGxhcHNlQWxsVGV4dCA9ICJDb250cmFlciB0b2RvcyBsb3MgcGFzb3MiOw0KLXZhciBmaXJzdFN0ZXBTZWN0aW9uOw0KLQ0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHN0ZXAgc2VjdGlvbiBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVTdGVwTGlua3ModGFnTmFtZSwgY2xhc3NTZWxlY3Rvcikgew0KLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsNCi0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOw0KLQkJaWYgKGVsZW1lbnRzLmxlbmd0aCA9PSAwKSByZXR1cm47DQotCQl2YXIgc3RlcEVsZW1lbnRzID0gbmV3IEFycmF5KGVsZW1lbnRzLmxlbmd0aCk7DQotCQl2YXIgdG90YWxMaW5rcyA9IDA7DQotCQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsNCi0JCQlpZiAoZWxlbWVudC5jbGFzc05hbWUgPT0gY2xhc3NTZWxlY3Rvcikgew0KLQkJCQlzdGVwRWxlbWVudHNbdG90YWxMaW5rcysrXSA9IGVsZW1lbnQ7DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKHRvdGFsTGlua3MgPT0gMCkgcmV0dXJuOw0KLQkJc3RlcEVsZW1lbnRzLmxlbmd0aCA9IHRvdGFsTGlua3M7DQotCQlzdGVwQ29sbGFwc2VEaXZzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJc3RlcENvbGxhcHNlTGlua3MgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlmaXJzdFN0ZXBTZWN0aW9uID0gc3RlcEVsZW1lbnRzWzBdOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpXTsNCi0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsNCi0JCQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoc2libGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSAmJiBzaWJsaW5nQ29udGFpbmVyLnN0eWxlKSB7DQotCQkJCXZhciBuZXh0U2libGluZyA9IGVsZW1lbnQubmV4dFNpYmxpbmc7DQotCQkJCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2libGluZ0NvbnRhaW5lciwgbmV4dFNpYmxpbmcpOw0KLQkJCQl2YXIgbmV4dEVsZW1lbnQgPSBzdGVwRWxlbWVudHNbaSArIDFdOw0KLQkJCQl3aGlsZSAobmV4dFNpYmxpbmcgIT0gbmV4dEVsZW1lbnQgJiYgbmV4dFNpYmxpbmcgIT0gbnVsbCkgew0KLQkJCQkJdmFyIHRvTW92ZSA9IG5leHRTaWJsaW5nOw0KLQkJCQkJbmV4dFNpYmxpbmcgPSBuZXh0U2libGluZy5uZXh0U2libGluZzsNCi0JCQkJCXNpYmxpbmdDb250YWluZXIuYXBwZW5kQ2hpbGQodG9Nb3ZlKTsNCi0JCQkJfQ0KLQkJCQlpZiAoY29sbGFwc2VTdGVwc0J5RGVmYXVsdCkgew0KLSAgICAJCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQl9DQotICAgIAkJCXNpYmxpbmdDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0gICAgCQkJc3RlcENvbGxhcHNlRGl2c1tpXSA9IHNpYmxpbmdDb250YWluZXI7DQotICAgIAkJCWNyZWF0ZUNvbGxhcHNpYmxlU3RlcFNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaSk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJfQ0KLQkJY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTdGVwc0xpbmtzKHN0ZXBFbGVtZW50c1swXSk7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIGNvbGxhcHNpYmxlIHN0ZXAgc2VjdGlvbi4NCi1mdW5jdGlvbiBjcmVhdGVDb2xsYXBzaWJsZVN0ZXBTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGluZGV4KSB7DQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jb2xsYXBzZURpdiA9IHNpYmxpbmdDb250YWluZXI7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWlmIChjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0KSB7DQotCQkJaW1hZ2Uuc3JjID0gZXhwYW5kSW1hZ2U7DQotCQl9DQotCQllbHNlIHsNCi0JCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkJfQ0KLQkJaW1hZ2Uud2lkdGggPSAnMTcnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE1JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGV4cGFuZENvbGxhcHNlU3RlcFNlY3Rpb247DQotCQlzdGVwQ29sbGFwc2VMaW5rc1tpbmRleF0gPSBsaW5rOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWVsZW1lbnQuaW5zZXJ0QmVmb3JlKHNwYW4sIGVsZW1lbnQuZmlyc3RDaGlsZCk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHN0ZXAgc2VjdGlvbiBiYXNlZCBvbiB0aGUgcmVjZWl2ZWQgZXZlbnQuDQotZnVuY3Rpb24gZXhwYW5kQ29sbGFwc2VTdGVwU2VjdGlvbihldnQpIHsNCi0JaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQllbHNlIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgdGhlIEV4cGFuZCBBbGwgYW5kIENvbGxhcHNlIEFsbCBTdGVwcyBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFN0ZXBzTGlua3MoZmlyc3RFbGVtZW50KSB7DQotCXZhciBkaXY7DQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpIHsNCi0JCWRpdi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWRpdi5hbGlnbiA9ICdyaWdodCc7CQkNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gZXhwYW5kQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQWxsU3RlcHM7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGV4cGFuZEFsbFRleHQpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQkNCi0JCWltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gY29sbGFwc2VBbGxTdGVwczsNCi0JCXNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb2xsYXBzZUFsbFRleHQpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQkNCi0JCWlmIChmaXJzdFN0ZXBTZWN0aW9uKSB7DQotCQkJZmlyc3RTdGVwU2VjdGlvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIGZpcnN0U3RlcFNlY3Rpb24pOw0KLQkJfQ0KLQl9DQotfQ0KLQ0KLS8vIEV4cGFuZHMgYWxsIHN0ZXBzLg0KLWZ1bmN0aW9uIGV4cGFuZEFsbFN0ZXBzKGV2dCkgew0KLQkgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCSAJc3RlcENvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCSAJc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkgfQ0KLQkgaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JIAlldnQucHJldmVudERlZmF1bHQoKTsNCi0JIH0NCi0JIHJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ29sbGFwc2VzIGFsbCBzdGVwcy4NCi1mdW5jdGlvbiBjb2xsYXBzZUFsbFN0ZXBzKGV2dCkgew0KLQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBDb2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JCXN0ZXBDb2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXN0ZXBDb2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvc3RlcHNfZnIuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc19mci5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzUzZGI0YS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc19mci5qcworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi12YXIgY29sbGFwc2VTdGVwc0J5RGVmYXVsdCA9IHRydWU7DQotdmFyIHN0ZXBJbWdCYWNrUGF0aCA9ICcuLi8uLi8nOw0KLXZhciBleHBhbmRBbGxUZXh0ID0gIkTDqXZlbG9wcGVyIHRvdXRlcyBsZXMgw6l0YXBlcyI7DQotdmFyIGNvbGxhcHNlQWxsVGV4dCA9ICJDb25kZW5zZXIgdG91dGVzIGxlcyDDqXRhcGVzIjsNCi12YXIgZmlyc3RTdGVwU2VjdGlvbjsNCi0NCi0vLyBDcmVhdGVzIHRoZSBjb2xsYXBzaWJsZSBzdGVwIHNlY3Rpb24gbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlU3RlcExpbmtzKHRhZ05hbWUsIGNsYXNzU2VsZWN0b3IpIHsNCi0JaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7DQotCQl2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsNCi0JCWlmIChlbGVtZW50cy5sZW5ndGggPT0gMCkgcmV0dXJuOw0KLQkJdmFyIHN0ZXBFbGVtZW50cyA9IG5ldyBBcnJheShlbGVtZW50cy5sZW5ndGgpOw0KLQkJdmFyIHRvdGFsTGlua3MgPSAwOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07DQotCQkJaWYgKGVsZW1lbnQuY2xhc3NOYW1lID09IGNsYXNzU2VsZWN0b3IpIHsNCi0JCQkJc3RlcEVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50Ow0KLQkJCX0NCi0JCX0NCi0JCWlmICh0b3RhbExpbmtzID09IDApIHJldHVybjsNCi0JCXN0ZXBFbGVtZW50cy5sZW5ndGggPSB0b3RhbExpbmtzOw0KLQkJc3RlcENvbGxhcHNlRGl2cyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCXN0ZXBDb2xsYXBzZUxpbmtzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJZmlyc3RTdGVwU2VjdGlvbiA9IHN0ZXBFbGVtZW50c1swXTsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgc3RlcEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJdmFyIGVsZW1lbnQgPSBzdGVwRWxlbWVudHNbaV07DQotCQkJdmFyIHNpYmxpbmdDb250YWluZXI7DQotCQkJaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKHNpYmxpbmdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkgJiYgc2libGluZ0NvbnRhaW5lci5zdHlsZSkgew0KLQkJCQl2YXIgbmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHRTaWJsaW5nOw0KLQkJCQllbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNpYmxpbmdDb250YWluZXIsIG5leHRTaWJsaW5nKTsNCi0JCQkJdmFyIG5leHRFbGVtZW50ID0gc3RlcEVsZW1lbnRzW2kgKyAxXTsNCi0JCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG5leHRFbGVtZW50ICYmIG5leHRTaWJsaW5nICE9IG51bGwpIHsNCi0JCQkJCXZhciB0b01vdmUgPSBuZXh0U2libGluZzsNCi0JCQkJCW5leHRTaWJsaW5nID0gbmV4dFNpYmxpbmcubmV4dFNpYmxpbmc7DQotCQkJCQlzaWJsaW5nQ29udGFpbmVyLmFwcGVuZENoaWxkKHRvTW92ZSk7DQotCQkJCX0NCi0JCQkJaWYgKGNvbGxhcHNlU3RlcHNCeURlZmF1bHQpIHsNCi0gICAgCQkJCXNpYmxpbmdDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0gICAgCQkJfQ0KLSAgICAJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCXN0ZXBDb2xsYXBzZURpdnNbaV0gPSBzaWJsaW5nQ29udGFpbmVyOw0KLSAgICAJCQljcmVhdGVDb2xsYXBzaWJsZVN0ZXBTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGkpOw0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCX0NCi0JCWNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU3RlcHNMaW5rcyhzdGVwRWxlbWVudHNbMF0pOw0KLQl9DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSBjb2xsYXBzaWJsZSBzdGVwIHNlY3Rpb24uDQotZnVuY3Rpb24gY3JlYXRlQ29sbGFwc2libGVTdGVwU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpbmRleCkgew0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCkgew0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQl2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY29sbGFwc2VEaXYgPSBzaWJsaW5nQ29udGFpbmVyOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpZiAoY29sbGFwc2VTdGVwc0J5RGVmYXVsdCkgew0KLQkJCWltYWdlLnNyYyA9IGV4cGFuZEltYWdlOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJaW1hZ2Uuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JCX0NCi0JCWltYWdlLndpZHRoID0gJzE3JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNSc7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRDb2xsYXBzZVN0ZXBTZWN0aW9uOw0KLQkJc3RlcENvbGxhcHNlTGlua3NbaW5kZXhdID0gbGluazsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50Lmluc2VydEJlZm9yZShzcGFuLCBlbGVtZW50LmZpcnN0Q2hpbGQpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBvciBjb2xsYXBzZXMgYSBzdGVwIHNlY3Rpb24gYmFzZWQgb24gdGhlIHJlY2VpdmVkIGV2ZW50Lg0KLWZ1bmN0aW9uIGV4cGFuZENvbGxhcHNlU3RlcFNlY3Rpb24oZXZ0KSB7DQotCWlmICh0aGlzLmNvbGxhcHNlRGl2LnN0eWxlLmRpc3BsYXkgPT0gJycpIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JZWxzZSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDcmVhdGVzIHRoZSBFeHBhbmQgQWxsIGFuZCBDb2xsYXBzZSBBbGwgU3RlcHMgbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTdGVwc0xpbmtzKGZpcnN0RWxlbWVudCkgew0KLQl2YXIgZGl2Ow0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKSB7DQotCQlkaXYuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlkaXYuYWxpZ24gPSAncmlnaHQnOwkJDQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGV4cGFuZEFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQl2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGV4cGFuZEFsbFN0ZXBzOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShleHBhbmRBbGxUZXh0KSk7DQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOw0KLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJDQotCQlpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gY29sbGFwc2VBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGNvbGxhcHNlQWxsU3RlcHM7DQotCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29sbGFwc2VBbGxUZXh0KSk7DQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOw0KLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOw0KLQkJDQotCQlpZiAoZmlyc3RTdGVwU2VjdGlvbikgew0KLQkJCWZpcnN0U3RlcFNlY3Rpb24ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBmaXJzdFN0ZXBTZWN0aW9uKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIGFsbCBzdGVwcy4NCi1mdW5jdGlvbiBleHBhbmRBbGxTdGVwcyhldnQpIHsNCi0JIGZvciAodmFyIGkgPSAwOyBpIDwgc3RlcENvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgew0KLQkgCXN0ZXBDb2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkgCXN0ZXBDb2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JIH0NCi0JIGlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCSAJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCSB9DQotCSByZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENvbGxhcHNlcyBhbGwgc3RlcHMuDQotZnVuY3Rpb24gY29sbGFwc2VBbGxTdGVwcyhldnQpIHsNCi0JZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCQlzdGVwQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQlzdGVwQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3N0ZXBzX2l0LmpzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvc3RlcHNfaXQuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdlOTRmNzIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvc3RlcHNfaXQuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotdmFyIGNvbGxhcHNlU3RlcHNCeURlZmF1bHQgPSB0cnVlOw0KLXZhciBzdGVwSW1nQmFja1BhdGggPSAnLi4vLi4vJzsNCi12YXIgZXhwYW5kQWxsVGV4dCA9ICJFc3BhbmRpIHR1dHRpIGkgcGFzc2kiOw0KLXZhciBjb2xsYXBzZUFsbFRleHQgPSAiQ29tcHJpbWkgdHV0dGkgaSBwYXNzaSI7DQotdmFyIGZpcnN0U3RlcFNlY3Rpb247DQotDQotLy8gQ3JlYXRlcyB0aGUgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZVN0ZXBMaW5rcyh0YWdOYW1lLCBjbGFzc1NlbGVjdG9yKSB7DQotCWlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkgew0KLQkJdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7DQotCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDApIHJldHVybjsNCi0JCXZhciBzdGVwRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsNCi0JCXZhciB0b3RhbExpbmtzID0gMDsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOw0KLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7DQotCQkJCXN0ZXBFbGVtZW50c1t0b3RhbExpbmtzKytdID0gZWxlbWVudDsNCi0JCQl9DQotCQl9DQotCQlpZiAodG90YWxMaW5rcyA9PSAwKSByZXR1cm47DQotCQlzdGVwRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsNCi0JCXN0ZXBDb2xsYXBzZURpdnMgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlzdGVwQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCWZpcnN0U3RlcFNlY3Rpb24gPSBzdGVwRWxlbWVudHNbMF07DQotCQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBFbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gc3RlcEVsZW1lbnRzW2ldOw0KLQkJCXZhciBzaWJsaW5nQ29udGFpbmVyOw0KLQkJCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChzaWJsaW5nQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpICYmIHNpYmxpbmdDb250YWluZXIuc3R5bGUpIHsNCi0JCQkJdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0U2libGluZzsNCi0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7DQotCQkJCXZhciBuZXh0RWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpICsgMV07DQotCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBuZXh0RWxlbWVudCAmJiBuZXh0U2libGluZyAhPSBudWxsKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQlzdGVwQ29sbGFwc2VEaXZzW2ldID0gc2libGluZ0NvbnRhaW5lcjsNCi0gICAgCQkJY3JlYXRlQ29sbGFwc2libGVTdGVwU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFN0ZXBzTGlua3Moc3RlcEVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uLg0KLWZ1bmN0aW9uIGNyZWF0ZUNvbGxhcHNpYmxlU3RlcFNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU3RlcHNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTdGVwU2VjdGlvbjsNCi0JCXN0ZXBDb2xsYXBzZUxpbmtzW2luZGV4XSA9IGxpbms7DQotCQlzcGFuLmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQl9DQotfQ0KLQ0KLS8vIEV4cGFuZHMgb3IgY29sbGFwc2VzIGEgc3RlcCBzZWN0aW9uIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBldmVudC4NCi1mdW5jdGlvbiBleHBhbmRDb2xsYXBzZVN0ZXBTZWN0aW9uKGV2dCkgew0KLQlpZiAodGhpcy5jb2xsYXBzZURpdi5zdHlsZS5kaXNwbGF5ID09ICcnKSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWVsc2Ugew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ3JlYXRlcyB0aGUgRXhwYW5kIEFsbCBhbmQgQ29sbGFwc2UgQWxsIFN0ZXBzIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU3RlcHNMaW5rcyhmaXJzdEVsZW1lbnQpIHsNCi0JdmFyIGRpdjsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsJCQ0KLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBleHBhbmRBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGxTdGVwczsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZXhwYW5kQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCQ0KLQkJaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGNvbGxhcHNlQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBjb2xsYXBzZUFsbFN0ZXBzOw0KLQkJc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbGxhcHNlQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJaWYgKGZpcnN0U3RlcFNlY3Rpb24pIHsNCi0JCQlmaXJzdFN0ZXBTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTdGVwU2VjdGlvbik7DQotCQl9DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBhbGwgc3RlcHMuDQotZnVuY3Rpb24gZXhwYW5kQWxsU3RlcHMoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBDb2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzdGVwQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzdGVwQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHN0ZXBzLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsU3RlcHMoZXZ0KSB7DQotCWZvciAodmFyIGkgPSAwOyBpIDwgc3RlcENvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgew0KLQkJc3RlcENvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc19qYS5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3N0ZXBzX2phLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMjFmODFiLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3N0ZXBzX2phLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLXZhciBjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0ID0gdHJ1ZTsNCi12YXIgc3RlcEltZ0JhY2tQYXRoID0gJy4uLy4uLyc7DQotdmFyIGV4cGFuZEFsbFRleHQgPSAi44K544OG44OD44OX44KS44GZ44G544Gm5bGV6ZaLIjsNCi12YXIgY29sbGFwc2VBbGxUZXh0ID0gIuOCueODhuODg+ODl+OCkuOBmeOBueOBpue4ruWwj+ihqOekuiI7DQotdmFyIGZpcnN0U3RlcFNlY3Rpb247DQotDQotLy8gQ3JlYXRlcyB0aGUgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZVN0ZXBMaW5rcyh0YWdOYW1lLCBjbGFzc1NlbGVjdG9yKSB7DQotCWlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkgew0KLQkJdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7DQotCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDApIHJldHVybjsNCi0JCXZhciBzdGVwRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsNCi0JCXZhciB0b3RhbExpbmtzID0gMDsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOw0KLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7DQotCQkJCXN0ZXBFbGVtZW50c1t0b3RhbExpbmtzKytdID0gZWxlbWVudDsNCi0JCQl9DQotCQl9DQotCQlpZiAodG90YWxMaW5rcyA9PSAwKSByZXR1cm47DQotCQlzdGVwRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsNCi0JCXN0ZXBDb2xsYXBzZURpdnMgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlzdGVwQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCWZpcnN0U3RlcFNlY3Rpb24gPSBzdGVwRWxlbWVudHNbMF07DQotCQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBFbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gc3RlcEVsZW1lbnRzW2ldOw0KLQkJCXZhciBzaWJsaW5nQ29udGFpbmVyOw0KLQkJCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChzaWJsaW5nQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpICYmIHNpYmxpbmdDb250YWluZXIuc3R5bGUpIHsNCi0JCQkJdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0U2libGluZzsNCi0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7DQotCQkJCXZhciBuZXh0RWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpICsgMV07DQotCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBuZXh0RWxlbWVudCAmJiBuZXh0U2libGluZyAhPSBudWxsKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQlzdGVwQ29sbGFwc2VEaXZzW2ldID0gc2libGluZ0NvbnRhaW5lcjsNCi0gICAgCQkJY3JlYXRlQ29sbGFwc2libGVTdGVwU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFN0ZXBzTGlua3Moc3RlcEVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uLg0KLWZ1bmN0aW9uIGNyZWF0ZUNvbGxhcHNpYmxlU3RlcFNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU3RlcHNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTdGVwU2VjdGlvbjsNCi0JCXN0ZXBDb2xsYXBzZUxpbmtzW2luZGV4XSA9IGxpbms7DQotCQlzcGFuLmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQl9DQotfQ0KLQ0KLS8vIEV4cGFuZHMgb3IgY29sbGFwc2VzIGEgc3RlcCBzZWN0aW9uIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBldmVudC4NCi1mdW5jdGlvbiBleHBhbmRDb2xsYXBzZVN0ZXBTZWN0aW9uKGV2dCkgew0KLQlpZiAodGhpcy5jb2xsYXBzZURpdi5zdHlsZS5kaXNwbGF5ID09ICcnKSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWVsc2Ugew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ3JlYXRlcyB0aGUgRXhwYW5kIEFsbCBhbmQgQ29sbGFwc2UgQWxsIFN0ZXBzIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU3RlcHNMaW5rcyhmaXJzdEVsZW1lbnQpIHsNCi0JdmFyIGRpdjsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsJCQ0KLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBleHBhbmRBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGxTdGVwczsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZXhwYW5kQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCQ0KLQkJaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGNvbGxhcHNlQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBjb2xsYXBzZUFsbFN0ZXBzOw0KLQkJc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbGxhcHNlQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJaWYgKGZpcnN0U3RlcFNlY3Rpb24pIHsNCi0JCQlmaXJzdFN0ZXBTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTdGVwU2VjdGlvbik7DQotCQl9DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBhbGwgc3RlcHMuDQotZnVuY3Rpb24gZXhwYW5kQWxsU3RlcHMoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBDb2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzdGVwQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzdGVwQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHN0ZXBzLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsU3RlcHMoZXZ0KSB7DQotCWZvciAodmFyIGkgPSAwOyBpIDwgc3RlcENvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgew0KLQkJc3RlcENvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc19rby5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3N0ZXBzX2tvLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NWFlNDU1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3N0ZXBzX2tvLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLXZhciBjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0ID0gdHJ1ZTsNCi12YXIgc3RlcEltZ0JhY2tQYXRoID0gJy4uLy4uLyc7DQotdmFyIGV4cGFuZEFsbFRleHQgPSAi66qo65OgIOuLqOqzhCDtjrzsuZjquLAiOw0KLXZhciBjb2xsYXBzZUFsbFRleHQgPSAi66qo65OgIOuLqOqzhCDsoJHquLAiOw0KLXZhciBmaXJzdFN0ZXBTZWN0aW9uOw0KLQ0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHN0ZXAgc2VjdGlvbiBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVTdGVwTGlua3ModGFnTmFtZSwgY2xhc3NTZWxlY3Rvcikgew0KLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsNCi0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOw0KLQkJaWYgKGVsZW1lbnRzLmxlbmd0aCA9PSAwKSByZXR1cm47DQotCQl2YXIgc3RlcEVsZW1lbnRzID0gbmV3IEFycmF5KGVsZW1lbnRzLmxlbmd0aCk7DQotCQl2YXIgdG90YWxMaW5rcyA9IDA7DQotCQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsNCi0JCQlpZiAoZWxlbWVudC5jbGFzc05hbWUgPT0gY2xhc3NTZWxlY3Rvcikgew0KLQkJCQlzdGVwRWxlbWVudHNbdG90YWxMaW5rcysrXSA9IGVsZW1lbnQ7DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKHRvdGFsTGlua3MgPT0gMCkgcmV0dXJuOw0KLQkJc3RlcEVsZW1lbnRzLmxlbmd0aCA9IHRvdGFsTGlua3M7DQotCQlzdGVwQ29sbGFwc2VEaXZzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJc3RlcENvbGxhcHNlTGlua3MgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlmaXJzdFN0ZXBTZWN0aW9uID0gc3RlcEVsZW1lbnRzWzBdOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpXTsNCi0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsNCi0JCQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoc2libGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSAmJiBzaWJsaW5nQ29udGFpbmVyLnN0eWxlKSB7DQotCQkJCXZhciBuZXh0U2libGluZyA9IGVsZW1lbnQubmV4dFNpYmxpbmc7DQotCQkJCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2libGluZ0NvbnRhaW5lciwgbmV4dFNpYmxpbmcpOw0KLQkJCQl2YXIgbmV4dEVsZW1lbnQgPSBzdGVwRWxlbWVudHNbaSArIDFdOw0KLQkJCQl3aGlsZSAobmV4dFNpYmxpbmcgIT0gbmV4dEVsZW1lbnQgJiYgbmV4dFNpYmxpbmcgIT0gbnVsbCkgew0KLQkJCQkJdmFyIHRvTW92ZSA9IG5leHRTaWJsaW5nOw0KLQkJCQkJbmV4dFNpYmxpbmcgPSBuZXh0U2libGluZy5uZXh0U2libGluZzsNCi0JCQkJCXNpYmxpbmdDb250YWluZXIuYXBwZW5kQ2hpbGQodG9Nb3ZlKTsNCi0JCQkJfQ0KLQkJCQlpZiAoY29sbGFwc2VTdGVwc0J5RGVmYXVsdCkgew0KLSAgICAJCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQl9DQotICAgIAkJCXNpYmxpbmdDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0gICAgCQkJc3RlcENvbGxhcHNlRGl2c1tpXSA9IHNpYmxpbmdDb250YWluZXI7DQotICAgIAkJCWNyZWF0ZUNvbGxhcHNpYmxlU3RlcFNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaSk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJfQ0KLQkJY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTdGVwc0xpbmtzKHN0ZXBFbGVtZW50c1swXSk7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIGNvbGxhcHNpYmxlIHN0ZXAgc2VjdGlvbi4NCi1mdW5jdGlvbiBjcmVhdGVDb2xsYXBzaWJsZVN0ZXBTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGluZGV4KSB7DQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jb2xsYXBzZURpdiA9IHNpYmxpbmdDb250YWluZXI7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWlmIChjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0KSB7DQotCQkJaW1hZ2Uuc3JjID0gZXhwYW5kSW1hZ2U7DQotCQl9DQotCQllbHNlIHsNCi0JCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkJfQ0KLQkJaW1hZ2Uud2lkdGggPSAnMTcnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE1JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGV4cGFuZENvbGxhcHNlU3RlcFNlY3Rpb247DQotCQlzdGVwQ29sbGFwc2VMaW5rc1tpbmRleF0gPSBsaW5rOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWVsZW1lbnQuaW5zZXJ0QmVmb3JlKHNwYW4sIGVsZW1lbnQuZmlyc3RDaGlsZCk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHN0ZXAgc2VjdGlvbiBiYXNlZCBvbiB0aGUgcmVjZWl2ZWQgZXZlbnQuDQotZnVuY3Rpb24gZXhwYW5kQ29sbGFwc2VTdGVwU2VjdGlvbihldnQpIHsNCi0JaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQllbHNlIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgdGhlIEV4cGFuZCBBbGwgYW5kIENvbGxhcHNlIEFsbCBTdGVwcyBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFN0ZXBzTGlua3MoZmlyc3RFbGVtZW50KSB7DQotCXZhciBkaXY7DQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpIHsNCi0JCWRpdi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWRpdi5hbGlnbiA9ICdyaWdodCc7CQkNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gZXhwYW5kQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQWxsU3RlcHM7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGV4cGFuZEFsbFRleHQpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQkNCi0JCWltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gY29sbGFwc2VBbGxTdGVwczsNCi0JCXNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb2xsYXBzZUFsbFRleHQpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQkNCi0JCWlmIChmaXJzdFN0ZXBTZWN0aW9uKSB7DQotCQkJZmlyc3RTdGVwU2VjdGlvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIGZpcnN0U3RlcFNlY3Rpb24pOw0KLQkJfQ0KLQl9DQotfQ0KLQ0KLS8vIEV4cGFuZHMgYWxsIHN0ZXBzLg0KLWZ1bmN0aW9uIGV4cGFuZEFsbFN0ZXBzKGV2dCkgew0KLQkgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCSAJc3RlcENvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCSAJc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQkgfQ0KLQkgaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JIAlldnQucHJldmVudERlZmF1bHQoKTsNCi0JIH0NCi0JIHJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ29sbGFwc2VzIGFsbCBzdGVwcy4NCi1mdW5jdGlvbiBjb2xsYXBzZUFsbFN0ZXBzKGV2dCkgew0KLQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBDb2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JCXN0ZXBDb2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXN0ZXBDb2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvc3RlcHNfcHRfQlIuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc19wdF9CUi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjg3YmI5Ni4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc19wdF9CUi5qcworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi12YXIgY29sbGFwc2VTdGVwc0J5RGVmYXVsdCA9IHRydWU7DQotdmFyIHN0ZXBJbWdCYWNrUGF0aCA9ICcuLi8uLi8nOw0KLXZhciBleHBhbmRBbGxUZXh0ID0gIkV4cGFuZGlyIFRvZGFzIGFzIEV0YXBhcyI7DQotdmFyIGNvbGxhcHNlQWxsVGV4dCA9ICJSZWR1emlyIFRvZGFzIGFzIEV0YXBhcyI7DQotdmFyIGZpcnN0U3RlcFNlY3Rpb247DQotDQotLy8gQ3JlYXRlcyB0aGUgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZVN0ZXBMaW5rcyh0YWdOYW1lLCBjbGFzc1NlbGVjdG9yKSB7DQotCWlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkgew0KLQkJdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7DQotCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDApIHJldHVybjsNCi0JCXZhciBzdGVwRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsNCi0JCXZhciB0b3RhbExpbmtzID0gMDsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOw0KLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7DQotCQkJCXN0ZXBFbGVtZW50c1t0b3RhbExpbmtzKytdID0gZWxlbWVudDsNCi0JCQl9DQotCQl9DQotCQlpZiAodG90YWxMaW5rcyA9PSAwKSByZXR1cm47DQotCQlzdGVwRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsNCi0JCXN0ZXBDb2xsYXBzZURpdnMgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlzdGVwQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCWZpcnN0U3RlcFNlY3Rpb24gPSBzdGVwRWxlbWVudHNbMF07DQotCQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBFbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gc3RlcEVsZW1lbnRzW2ldOw0KLQkJCXZhciBzaWJsaW5nQ29udGFpbmVyOw0KLQkJCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChzaWJsaW5nQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpICYmIHNpYmxpbmdDb250YWluZXIuc3R5bGUpIHsNCi0JCQkJdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0U2libGluZzsNCi0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7DQotCQkJCXZhciBuZXh0RWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpICsgMV07DQotCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBuZXh0RWxlbWVudCAmJiBuZXh0U2libGluZyAhPSBudWxsKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQlzdGVwQ29sbGFwc2VEaXZzW2ldID0gc2libGluZ0NvbnRhaW5lcjsNCi0gICAgCQkJY3JlYXRlQ29sbGFwc2libGVTdGVwU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFN0ZXBzTGlua3Moc3RlcEVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uLg0KLWZ1bmN0aW9uIGNyZWF0ZUNvbGxhcHNpYmxlU3RlcFNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU3RlcHNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTdGVwU2VjdGlvbjsNCi0JCXN0ZXBDb2xsYXBzZUxpbmtzW2luZGV4XSA9IGxpbms7DQotCQlzcGFuLmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQl9DQotfQ0KLQ0KLS8vIEV4cGFuZHMgb3IgY29sbGFwc2VzIGEgc3RlcCBzZWN0aW9uIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBldmVudC4NCi1mdW5jdGlvbiBleHBhbmRDb2xsYXBzZVN0ZXBTZWN0aW9uKGV2dCkgew0KLQlpZiAodGhpcy5jb2xsYXBzZURpdi5zdHlsZS5kaXNwbGF5ID09ICcnKSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWVsc2Ugew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ3JlYXRlcyB0aGUgRXhwYW5kIEFsbCBhbmQgQ29sbGFwc2UgQWxsIFN0ZXBzIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU3RlcHNMaW5rcyhmaXJzdEVsZW1lbnQpIHsNCi0JdmFyIGRpdjsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsJCQ0KLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBleHBhbmRBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGxTdGVwczsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZXhwYW5kQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCQ0KLQkJaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGNvbGxhcHNlQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBjb2xsYXBzZUFsbFN0ZXBzOw0KLQkJc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbGxhcHNlQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJaWYgKGZpcnN0U3RlcFNlY3Rpb24pIHsNCi0JCQlmaXJzdFN0ZXBTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTdGVwU2VjdGlvbik7DQotCQl9DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBhbGwgc3RlcHMuDQotZnVuY3Rpb24gZXhwYW5kQWxsU3RlcHMoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBDb2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzdGVwQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzdGVwQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHN0ZXBzLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsU3RlcHMoZXZ0KSB7DQotCWZvciAodmFyIGkgPSAwOyBpIDwgc3RlcENvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgew0KLQkJc3RlcENvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc196aF9DTi5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3N0ZXBzX3poX0NOLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDc4MDc0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3N0ZXBzX3poX0NOLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLXZhciBjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0ID0gdHJ1ZTsNCi12YXIgc3RlcEltZ0JhY2tQYXRoID0gJy4uLy4uLyc7DQotdmFyIGV4cGFuZEFsbFRleHQgPSAi5bGV5byA5omA5pyJ5q2l6aqkIjsNCi12YXIgY29sbGFwc2VBbGxUZXh0ID0gIuaKmOWPoOaJgOacieatpemqpCI7DQotdmFyIGZpcnN0U3RlcFNlY3Rpb247DQotDQotLy8gQ3JlYXRlcyB0aGUgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZVN0ZXBMaW5rcyh0YWdOYW1lLCBjbGFzc1NlbGVjdG9yKSB7DQotCWlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkgew0KLQkJdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7DQotCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDApIHJldHVybjsNCi0JCXZhciBzdGVwRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsNCi0JCXZhciB0b3RhbExpbmtzID0gMDsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOw0KLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7DQotCQkJCXN0ZXBFbGVtZW50c1t0b3RhbExpbmtzKytdID0gZWxlbWVudDsNCi0JCQl9DQotCQl9DQotCQlpZiAodG90YWxMaW5rcyA9PSAwKSByZXR1cm47DQotCQlzdGVwRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsNCi0JCXN0ZXBDb2xsYXBzZURpdnMgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlzdGVwQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCWZpcnN0U3RlcFNlY3Rpb24gPSBzdGVwRWxlbWVudHNbMF07DQotCQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBFbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gc3RlcEVsZW1lbnRzW2ldOw0KLQkJCXZhciBzaWJsaW5nQ29udGFpbmVyOw0KLQkJCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChzaWJsaW5nQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpICYmIHNpYmxpbmdDb250YWluZXIuc3R5bGUpIHsNCi0JCQkJdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0U2libGluZzsNCi0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7DQotCQkJCXZhciBuZXh0RWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpICsgMV07DQotCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBuZXh0RWxlbWVudCAmJiBuZXh0U2libGluZyAhPSBudWxsKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQlzdGVwQ29sbGFwc2VEaXZzW2ldID0gc2libGluZ0NvbnRhaW5lcjsNCi0gICAgCQkJY3JlYXRlQ29sbGFwc2libGVTdGVwU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFN0ZXBzTGlua3Moc3RlcEVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uLg0KLWZ1bmN0aW9uIGNyZWF0ZUNvbGxhcHNpYmxlU3RlcFNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU3RlcHNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTdGVwU2VjdGlvbjsNCi0JCXN0ZXBDb2xsYXBzZUxpbmtzW2luZGV4XSA9IGxpbms7DQotCQlzcGFuLmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQl9DQotfQ0KLQ0KLS8vIEV4cGFuZHMgb3IgY29sbGFwc2VzIGEgc3RlcCBzZWN0aW9uIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBldmVudC4NCi1mdW5jdGlvbiBleHBhbmRDb2xsYXBzZVN0ZXBTZWN0aW9uKGV2dCkgew0KLQlpZiAodGhpcy5jb2xsYXBzZURpdi5zdHlsZS5kaXNwbGF5ID09ICcnKSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWVsc2Ugew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ3JlYXRlcyB0aGUgRXhwYW5kIEFsbCBhbmQgQ29sbGFwc2UgQWxsIFN0ZXBzIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU3RlcHNMaW5rcyhmaXJzdEVsZW1lbnQpIHsNCi0JdmFyIGRpdjsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsJCQ0KLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBleHBhbmRBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGxTdGVwczsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZXhwYW5kQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCQ0KLQkJaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGNvbGxhcHNlQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBjb2xsYXBzZUFsbFN0ZXBzOw0KLQkJc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbGxhcHNlQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJaWYgKGZpcnN0U3RlcFNlY3Rpb24pIHsNCi0JCQlmaXJzdFN0ZXBTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTdGVwU2VjdGlvbik7DQotCQl9DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBhbGwgc3RlcHMuDQotZnVuY3Rpb24gZXhwYW5kQWxsU3RlcHMoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBDb2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzdGVwQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzdGVwQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHN0ZXBzLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsU3RlcHMoZXZ0KSB7DQotCWZvciAodmFyIGkgPSAwOyBpIDwgc3RlcENvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgew0KLQkJc3RlcENvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy9zdGVwc196aF9UVy5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3N0ZXBzX3poX1RXLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMjE5Yjc5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3N0ZXBzX3poX1RXLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLXZhciBjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0ID0gdHJ1ZTsNCi12YXIgc3RlcEltZ0JhY2tQYXRoID0gJy4uLy4uLyc7DQotdmFyIGV4cGFuZEFsbFRleHQgPSAi5bGV6ZaL5YWo6YOo5q2l6amfIjsNCi12YXIgY29sbGFwc2VBbGxUZXh0ID0gIuaUtuWQiOWFqOmDqOatpempnyI7DQotdmFyIGZpcnN0U3RlcFNlY3Rpb247DQotDQotLy8gQ3JlYXRlcyB0aGUgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZVN0ZXBMaW5rcyh0YWdOYW1lLCBjbGFzc1NlbGVjdG9yKSB7DQotCWlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkgew0KLQkJdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7DQotCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDApIHJldHVybjsNCi0JCXZhciBzdGVwRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsNCi0JCXZhciB0b3RhbExpbmtzID0gMDsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOw0KLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7DQotCQkJCXN0ZXBFbGVtZW50c1t0b3RhbExpbmtzKytdID0gZWxlbWVudDsNCi0JCQl9DQotCQl9DQotCQlpZiAodG90YWxMaW5rcyA9PSAwKSByZXR1cm47DQotCQlzdGVwRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsNCi0JCXN0ZXBDb2xsYXBzZURpdnMgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlzdGVwQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCWZpcnN0U3RlcFNlY3Rpb24gPSBzdGVwRWxlbWVudHNbMF07DQotCQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBFbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gc3RlcEVsZW1lbnRzW2ldOw0KLQkJCXZhciBzaWJsaW5nQ29udGFpbmVyOw0KLQkJCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChzaWJsaW5nQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpICYmIHNpYmxpbmdDb250YWluZXIuc3R5bGUpIHsNCi0JCQkJdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0U2libGluZzsNCi0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7DQotCQkJCXZhciBuZXh0RWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpICsgMV07DQotCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBuZXh0RWxlbWVudCAmJiBuZXh0U2libGluZyAhPSBudWxsKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQlzdGVwQ29sbGFwc2VEaXZzW2ldID0gc2libGluZ0NvbnRhaW5lcjsNCi0gICAgCQkJY3JlYXRlQ29sbGFwc2libGVTdGVwU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFN0ZXBzTGlua3Moc3RlcEVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uLg0KLWZ1bmN0aW9uIGNyZWF0ZUNvbGxhcHNpYmxlU3RlcFNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU3RlcHNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTdGVwU2VjdGlvbjsNCi0JCXN0ZXBDb2xsYXBzZUxpbmtzW2luZGV4XSA9IGxpbms7DQotCQlzcGFuLmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQl9DQotfQ0KLQ0KLS8vIEV4cGFuZHMgb3IgY29sbGFwc2VzIGEgc3RlcCBzZWN0aW9uIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBldmVudC4NCi1mdW5jdGlvbiBleHBhbmRDb2xsYXBzZVN0ZXBTZWN0aW9uKGV2dCkgew0KLQlpZiAodGhpcy5jb2xsYXBzZURpdi5zdHlsZS5kaXNwbGF5ID09ICcnKSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWVsc2Ugew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ3JlYXRlcyB0aGUgRXhwYW5kIEFsbCBhbmQgQ29sbGFwc2UgQWxsIFN0ZXBzIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU3RlcHNMaW5rcyhmaXJzdEVsZW1lbnQpIHsNCi0JdmFyIGRpdjsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsJCQ0KLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBleHBhbmRBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGxTdGVwczsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZXhwYW5kQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCQ0KLQkJaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGNvbGxhcHNlQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBjb2xsYXBzZUFsbFN0ZXBzOw0KLQkJc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbGxhcHNlQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJaWYgKGZpcnN0U3RlcFNlY3Rpb24pIHsNCi0JCQlmaXJzdFN0ZXBTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTdGVwU2VjdGlvbik7DQotCQl9DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBhbGwgc3RlcHMuDQotZnVuY3Rpb24gZXhwYW5kQWxsU3RlcHMoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBDb2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzdGVwQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzdGVwQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHN0ZXBzLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsU3RlcHMoZXZ0KSB7DQotCWZvciAodmFyIGkgPSAwOyBpIDwgc3RlcENvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgew0KLQkJc3RlcENvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy90cmVlYnJvd3Nlcl9kZS5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX2RlLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNWUxMDY5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX2RlLmpzCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLy8gSGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMSA9ICJEaWUgS29uZmlndXJhdGlvbiB3aXJkIGJlcmVpdHMgbWl0IFNpY2h0ZW4gYW5nZXplaWd0IjsNCi12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTIgPSAiU2ljaHRlbiBhbnplaWdlbiI7DQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UzID0gIkhvbWUiOw0KLQ0KLWZ1bmN0aW9uIGxvYWRUb3AoKQ0KLXsNCi0gIGlmKHBhcmVudC5mcmFtZXMubGVuZ3RoIT0wICYmIChwYXJlbnQuZnJhbWVzWzFdLm5hbWU9PSJvcnlfdG9jIiB8fCBwYXJlbnQuZnJhbWVzWzFdLm5hbWU9PSJvcnlfdG9jX2ZyYW1lIikgKQ0KLSAgew0KLSAgICAgYWxlcnQodHJlZWJyb3dzZXJfanNfTUVTU0FHRTEpOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICB2YXIgZXhwaXJlcyA9IG5ldyBEYXRlKCk7DQotICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7DQotICAgIGRvY3VtZW50LmNvb2tpZSA9ICJydXBfb3J5X2RvYz0iICsgZXNjYXBlIChkb2N1bWVudC5VUkwpICsNCi0gICAgIjsgZXhwaXJlcz0iICsgZXhwaXJlcy50b1VUQ1N0cmluZygpICsgICI7IHBhdGg9LyI7DQotICAgIAkNCi0gICAgdmFyIG1haW5JbmRleF9hID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIm1haW5JbmRleCIpOyANCi0JdmFyIG5ld19vcnlfZG9jX2xvYyA9IG51bGw7IA0KLQlpZiAoICBtYWluSW5kZXhfYSAhPSBudWxsICkgeyANCi0gICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZjsgDQotCX0gDQotDQotICAgIGlmKG5ld19vcnlfZG9jX2xvYyE9bnVsbCkNCi0gICAgew0KLQlpZiggc2VsZi5uYW1lID09ICJvcnlfZG9jIiApDQotCXsNCi0JCXdpbmRvdy5jbG9zZSgpOw0KLQkJd2luZG93Lm9wZW4oIG5ld19vcnlfZG9jX2xvYyApOwkJDQotCX0NCi0JZWxzZQ0KLQl7DQotCSAgICAgICAJdG9wLmxvY2F0aW9uID0gbmV3X29yeV9kb2NfbG9jOw0KLQl9DQotICAgIH0NCi0gICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldEltYWdlVXJsKGltYWdlKQ0KLXsNCi0gICAgdmFyIG5ld19vcnlfZG9jX2xvYz1udWxsOyAgICANCi0gICAgdmFyIG1haW5JbmRleF9hID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIm1haW5JbmRleCIpOyANCi0gICAgbmV3X29yeV9kb2NfbG9jID0gbWFpbkluZGV4X2EuaXRlbSgwKS5ocmVmLnN1YnN0cmluZygwLG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZi5sYXN0SW5kZXhPZigiLyIpKTsNCi0gICAgbmV3X29yeV9kb2NfbG9jID0gbmV3X29yeV9kb2NfbG9jICsgIiIgKyBpbWFnZTsNCi0gICAgcmV0dXJuIG5ld19vcnlfZG9jX2xvYzsgICAgDQotfQ0KLQ0KLU1TRlBob3ZlciA9DQotKCgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk5ldHNjYXBlIikgJiYNCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gMyApKSB8fA0KLSAgKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIikgJiYNCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gNCApKSk7DQotDQotICBmdW5jdGlvbiBNU0ZQcHJlbG9hZChpbWcpDQotICB7DQotICAgICB2YXIgYT1uZXcgSW1hZ2UoKTsNCi0gICAgIGEuc3JjPWltZzsNCi0gICAgIHJldHVybiBhOw0KLSAgfQ0KLQ0KLSAgICBpZihNU0ZQaG92ZXIpDQotICAgIHsNCi0gICAgICAgIFJ1cEdyYXk9TVNGUHByZWxvYWQoZ2V0SW1hZ2VVcmwoJy9pbWFnZXMvZGlzcGxheV92aWV3cy5naWYnKSk7DQotICAgICAgICBSdXBCbHVlPU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3NfYS5naWYnKSk7DQotICAgIH0NCi0NCi0NCi0vL25ldyBjb2RlIHRvIGRpc3BsYXkgdGhlIGxvYWQgYnV0dG9uIG9yIG5vdA0KLXZhciBvcnlfdG9jX2V4aXN0ID0gdHlwZW9mIHBhcmVudC5vcnlfdG9jOw0KLWlmIChvcnlfdG9jX2V4aXN0ID09ICJ1bmRlZmluZWQiKSB7DQotICAgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvY19mcmFtZTsNCi19DQotDQotaWYgKG9yeV90b2NfZXhpc3QgPT0gInVuZGVmaW5lZCIpIHsNCi0JZG9jdW1lbnQud3JpdGUoIjxhIGNsYXNzPVwiZXhwYW5kQ29sbGFwc2VMaW5rXCIgaHJlZj1cIkphdmFTY3JpcHQ6bG9hZFRvcCgpO1wiIG9ubW91c2VvdmVyPVwiaWYoTVNGUGhvdmVyKSBkb2N1bWVudFsnSG9tZSddLnNyYz1SdXBCbHVlLnNyYzsgc2VsZi5zdGF0dXM9dHJlZWJyb3dzZXJfanNfTUVTU0FHRTI7IHJldHVybiB0cnVlXCIgb25tb3VzZW91dD1cImlmKE1TRlBob3ZlcikgZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwR3JheS5zcmM7IHNlbGYuc3RhdHVzPSAnICc7cmV0dXJuIHRydWVcIj4gPGJyPiA8aW1nIHNyYz1cIiIgKyBiYWNrUGF0aCArICJpbWFnZXMvZGlzcGxheV92aWV3cy5naWYiKTsNCi0JZG9jdW1lbnQud3JpdGUoIlwiICBib3JkZXI9XCIwXCIgYWxpZ249XCJhYnNtaWRkbGVcIiBhbHQ9XCIiICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTIgKyAiXCIgbmFtZT1cIiIgKyB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMyArICJcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj4iICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTIgKyAiPFwvYT4iKTsNCi19DQotZWxzZSB7DQotCWRvY3VtZW50LndyaXRlKCImbmJzcDsiKTsNCi19DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfZXMuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy90cmVlYnJvd3Nlcl9lcy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmUyOTA5Zi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy90cmVlYnJvd3Nlcl9lcy5qcworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8vIEhlcmUgZGVmaW5lcyBhbGwgdGhlIEkxOE4gc3BlY2lmaWMgbWVzc2FnZXMgdXNlZCBpbiB0aGUgamF2YXNjcmlwdHMNCi12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTEgPSAiTGEgY29uZmlndXJhY2nDs24geWEgc2UgbXVlc3RyYSBtZWRpYW50ZSBsYXMgdmlzdGFzIjsNCi12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTIgPSAiTW9zdHJhciBsYXMgdmlzdGFzIjsNCi12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTMgPSAiSW5pY2lvIjsNCi0NCi1mdW5jdGlvbiBsb2FkVG9wKCkNCi17DQotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiAocGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIgfHwgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvY19mcmFtZSIpICkNCi0gIHsNCi0gICAgIGFsZXJ0KHRyZWVicm93c2VyX2pzX01FU1NBR0UxKTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOw0KLSAgICBleHBpcmVzLnNldFRpbWUgKGV4cGlyZXMuZ2V0VGltZSgpICsgKDEwMDAgKiAyMCkpOw0KLSAgICBkb2N1bWVudC5jb29raWUgPSAicnVwX29yeV9kb2M9IiArIGVzY2FwZSAoZG9jdW1lbnQuVVJMKSArDQotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOw0KLSAgICAJDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotCXZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOyANCi0JaWYgKCAgbWFpbkluZGV4X2EgIT0gbnVsbCApIHsgDQotICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBtYWluSW5kZXhfYS5pdGVtKDApLmhyZWY7IA0KLQl9IA0KLQ0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpDQotICAgIHsNCi0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQ0KLQl7DQotCQl3aW5kb3cuY2xvc2UoKTsNCi0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsJCQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsNCi0JfQ0KLSAgICB9DQotICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBnZXRJbWFnZVVybChpbWFnZSkNCi17DQotICAgIHZhciBuZXdfb3J5X2RvY19sb2M9bnVsbDsgICAgDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZi5zdWJzdHJpbmcoMCxtYWluSW5kZXhfYS5pdGVtKDApLmhyZWYubGFzdEluZGV4T2YoIi8iKSk7DQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG5ld19vcnlfZG9jX2xvYyArICIiICsgaW1hZ2U7DQotICAgIHJldHVybiBuZXdfb3J5X2RvY19sb2M7ICAgIA0KLX0NCi0NCi1NU0ZQaG92ZXIgPQ0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwNCi0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOw0KLQ0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQ0KLSAgew0KLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7DQotICAgICBhLnNyYz1pbWc7DQotICAgICByZXR1cm4gYTsNCi0gIH0NCi0NCi0gICAgaWYoTVNGUGhvdmVyKQ0KLSAgICB7DQotICAgICAgICBSdXBHcmF5PU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmJykpOw0KLSAgICAgICAgUnVwQmx1ZT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzX2EuZ2lmJykpOw0KLSAgICB9DQotDQotDQotLy9uZXcgY29kZSB0byBkaXNwbGF5IHRoZSBsb2FkIGJ1dHRvbiBvciBub3QNCi12YXIgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYzsNCi1pZiAob3J5X3RvY19leGlzdCA9PSAidW5kZWZpbmVkIikgew0KLSAgIG9yeV90b2NfZXhpc3QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2NfZnJhbWU7DQotfQ0KLQ0KLWlmIChvcnlfdG9jX2V4aXN0ID09ICJ1bmRlZmluZWQiKSB7DQotCWRvY3VtZW50LndyaXRlKCI8YSBjbGFzcz1cImV4cGFuZENvbGxhcHNlTGlua1wiIGhyZWY9XCJKYXZhU2NyaXB0OmxvYWRUb3AoKTtcIiBvbm1vdXNlb3Zlcj1cImlmKE1TRlBob3ZlcikgZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwQmx1ZS5zcmM7IHNlbGYuc3RhdHVzPXRyZWVicm93c2VyX2pzX01FU1NBR0UyOyByZXR1cm4gdHJ1ZVwiIG9ubW91c2VvdXQ9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEdyYXkuc3JjOyBzZWxmLnN0YXR1cz0gJyAnO3JldHVybiB0cnVlXCI+IDxicj4gPGltZyBzcmM9XCIiICsgYmFja1BhdGggKyAiaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmIik7DQotLy9TVEFSVCBOT04tVFJBTlNMQVRBQkxFDQotCWRvY3VtZW50LndyaXRlKCJcIiAgYm9yZGVyPVwiMFwiIGFsaWduPVwiYWJzbWlkZGxlXCIgYWx0PVwiIiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIlwiIG5hbWU9XCIiICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTMgKyAiXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+IiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIjxcL2E+Iik7DQotLy9FTkQgTk9OLVRSQU5TTEFUQUJMRQ0KLX0NCi1lbHNlIHsNCi0JZG9jdW1lbnQud3JpdGUoIiZuYnNwOyIpOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy90cmVlYnJvd3Nlcl9mci5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX2ZyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNTE4MGQyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX2ZyLmpzCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLy8gSGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMSA9ICJMYSBjb25maWd1cmF0aW9uIGVzdCBkw6lqw6AgYWZmaWNow6llIMOgIGwnYWlkZSBkZXMgdnVlcyI7DQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UyID0gIkFmZmljaGVyIGxlcyB2dWVzIjsNCi12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTMgPSAiSG9tZSI7DQotDQotZnVuY3Rpb24gbG9hZFRvcCgpDQotew0KLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgKHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2MiIHx8IHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2NfZnJhbWUiKSApDQotICB7DQotICAgICBhbGVydCh0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMSk7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIHZhciBleHBpcmVzID0gbmV3IERhdGUoKTsNCi0gICAgZXhwaXJlcy5zZXRUaW1lIChleHBpcmVzLmdldFRpbWUoKSArICgxMDAwICogMjApKTsNCi0gICAgZG9jdW1lbnQuY29va2llID0gInJ1cF9vcnlfZG9jPSIgKyBlc2NhcGUgKGRvY3VtZW50LlVSTCkgKw0KLSAgICAiOyBleHBpcmVzPSIgKyBleHBpcmVzLnRvVVRDU3RyaW5nKCkgKyAgIjsgcGF0aD0vIjsNCi0gICAgCQ0KLSAgICB2YXIgbWFpbkluZGV4X2EgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgibWFpbkluZGV4Iik7IA0KLQl2YXIgbmV3X29yeV9kb2NfbG9jID0gbnVsbDsgDQotCWlmICggIG1haW5JbmRleF9hICE9IG51bGwgKSB7IA0KLSAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gbWFpbkluZGV4X2EuaXRlbSgwKS5ocmVmOyANCi0JfSANCi0NCi0gICAgaWYobmV3X29yeV9kb2NfbG9jIT1udWxsKQ0KLSAgICB7DQotCWlmKCBzZWxmLm5hbWUgPT0gIm9yeV9kb2MiICkNCi0Jew0KLQkJd2luZG93LmNsb3NlKCk7DQotCQl3aW5kb3cub3BlbiggbmV3X29yeV9kb2NfbG9jICk7CQkNCi0JfQ0KLQllbHNlDQotCXsNCi0JICAgICAgIAl0b3AubG9jYXRpb24gPSBuZXdfb3J5X2RvY19sb2M7DQotCX0NCi0gICAgfQ0KLSAgIH0NCi19DQotDQotZnVuY3Rpb24gZ2V0SW1hZ2VVcmwoaW1hZ2UpDQotew0KLSAgICB2YXIgbmV3X29yeV9kb2NfbG9jPW51bGw7ICAgIA0KLSAgICB2YXIgbWFpbkluZGV4X2EgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgibWFpbkluZGV4Iik7IA0KLSAgICBuZXdfb3J5X2RvY19sb2MgPSBtYWluSW5kZXhfYS5pdGVtKDApLmhyZWYuc3Vic3RyaW5nKDAsbWFpbkluZGV4X2EuaXRlbSgwKS5ocmVmLmxhc3RJbmRleE9mKCIvIikpOw0KLSAgICBuZXdfb3J5X2RvY19sb2MgPSBuZXdfb3J5X2RvY19sb2MgKyAiIiArIGltYWdlOw0KLSAgICByZXR1cm4gbmV3X29yeV9kb2NfbG9jOyAgICANCi19DQotDQotTVNGUGhvdmVyID0NCi0oKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTmV0c2NhcGUiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSAzICkpIHx8DQotICAoKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpKTsNCi0NCi0gIGZ1bmN0aW9uIE1TRlBwcmVsb2FkKGltZykNCi0gIHsNCi0gICAgIHZhciBhPW5ldyBJbWFnZSgpOw0KLSAgICAgYS5zcmM9aW1nOw0KLSAgICAgcmV0dXJuIGE7DQotICB9DQotDQotICAgIGlmKE1TRlBob3ZlcikNCi0gICAgew0KLSAgICAgICAgUnVwR3JheT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzLmdpZicpKTsNCi0gICAgICAgIFJ1cEJsdWU9TVNGUHByZWxvYWQoZ2V0SW1hZ2VVcmwoJy9pbWFnZXMvZGlzcGxheV92aWV3c19hLmdpZicpKTsNCi0gICAgfQ0KLQ0KLQ0KLS8vbmV3IGNvZGUgdG8gZGlzcGxheSB0aGUgbG9hZCBidXR0b24gb3Igbm90DQotdmFyIG9yeV90b2NfZXhpc3QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2M7DQotaWYgKG9yeV90b2NfZXhpc3QgPT0gInVuZGVmaW5lZCIpIHsNCi0gICBvcnlfdG9jX2V4aXN0ID0gdHlwZW9mIHBhcmVudC5vcnlfdG9jX2ZyYW1lOw0KLX0NCi0NCi1pZiAob3J5X3RvY19leGlzdCA9PSAidW5kZWZpbmVkIikgew0KLQlkb2N1bWVudC53cml0ZSgiPGEgY2xhc3M9XCJleHBhbmRDb2xsYXBzZUxpbmtcIiBocmVmPVwiSmF2YVNjcmlwdDpsb2FkVG9wKCk7XCIgb25tb3VzZW92ZXI9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEJsdWUuc3JjOyBzZWxmLnN0YXR1cz10cmVlYnJvd3Nlcl9qc19NRVNTQUdFMjsgcmV0dXJuIHRydWVcIiBvbm1vdXNlb3V0PVwiaWYoTVNGUGhvdmVyKSBkb2N1bWVudFsnSG9tZSddLnNyYz1SdXBHcmF5LnNyYzsgc2VsZi5zdGF0dXM9ICcgJztyZXR1cm4gdHJ1ZVwiPiA8YnI+IDxpbWcgc3JjPVwiIiArIGJhY2tQYXRoICsgImltYWdlcy9kaXNwbGF5X3ZpZXdzLmdpZiIpOw0KLQlkb2N1bWVudC53cml0ZSgiXCIgIGJvcmRlcj1cIjBcIiBhbGlnbj1cImFic21pZGRsZVwiIGFsdD1cIiIgKyB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMiArICJcIiBuYW1lPVwiIiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UzICsgIlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPiIgKyB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMiArICI8XC9hPiIpOw0KLX0NCi1lbHNlIHsNCi0JZG9jdW1lbnQud3JpdGUoIiZuYnNwOyIpOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy90cmVlYnJvd3Nlcl9pdC5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX2l0LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZTJmYWEwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX2l0LmpzCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLy8gSGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMSA9ICJMYSBjb25maWd1cmF6aW9uZSB2aWVuZSBnacOgIHZpc3VhbGl6emF0YSBtZWRpYW50ZSBsZSB2aXN0ZSI7DQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UyID0gIlZpc3VhbGl6emEgdmlzdGUiOw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMyA9ICJIb21lIjsNCi0NCi1mdW5jdGlvbiBsb2FkVG9wKCkNCi17DQotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiAocGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIgfHwgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvY19mcmFtZSIpICkNCi0gIHsNCi0gICAgIGFsZXJ0KHRyZWVicm93c2VyX2pzX01FU1NBR0UxKTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOw0KLSAgICBleHBpcmVzLnNldFRpbWUgKGV4cGlyZXMuZ2V0VGltZSgpICsgKDEwMDAgKiAyMCkpOw0KLSAgICBkb2N1bWVudC5jb29raWUgPSAicnVwX29yeV9kb2M9IiArIGVzY2FwZSAoZG9jdW1lbnQuVVJMKSArDQotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOw0KLSAgICAJDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotCXZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOyANCi0JaWYgKCAgbWFpbkluZGV4X2EgIT0gbnVsbCApIHsgDQotICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBtYWluSW5kZXhfYS5pdGVtKDApLmhyZWY7IA0KLQl9IA0KLQ0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpDQotICAgIHsNCi0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQ0KLQl7DQotCQl3aW5kb3cuY2xvc2UoKTsNCi0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsJCQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsNCi0JfQ0KLSAgICB9DQotICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBnZXRJbWFnZVVybChpbWFnZSkNCi17DQotICAgIHZhciBuZXdfb3J5X2RvY19sb2M9bnVsbDsgICAgDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZi5zdWJzdHJpbmcoMCxtYWluSW5kZXhfYS5pdGVtKDApLmhyZWYubGFzdEluZGV4T2YoIi8iKSk7DQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG5ld19vcnlfZG9jX2xvYyArICIiICsgaW1hZ2U7DQotICAgIHJldHVybiBuZXdfb3J5X2RvY19sb2M7ICAgIA0KLX0NCi0NCi1NU0ZQaG92ZXIgPQ0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwNCi0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOw0KLQ0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQ0KLSAgew0KLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7DQotICAgICBhLnNyYz1pbWc7DQotICAgICByZXR1cm4gYTsNCi0gIH0NCi0NCi0gICAgaWYoTVNGUGhvdmVyKQ0KLSAgICB7DQotICAgICAgICBSdXBHcmF5PU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmJykpOw0KLSAgICAgICAgUnVwQmx1ZT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzX2EuZ2lmJykpOw0KLSAgICB9DQotDQotDQotLy9uZXcgY29kZSB0byBkaXNwbGF5IHRoZSBsb2FkIGJ1dHRvbiBvciBub3QNCi12YXIgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYzsNCi1pZiAob3J5X3RvY19leGlzdCA9PSAidW5kZWZpbmVkIikgew0KLSAgIG9yeV90b2NfZXhpc3QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2NfZnJhbWU7DQotfQ0KLQ0KLWlmIChvcnlfdG9jX2V4aXN0ID09ICJ1bmRlZmluZWQiKSB7DQotCWRvY3VtZW50LndyaXRlKCI8YSBjbGFzcz1cImV4cGFuZENvbGxhcHNlTGlua1wiIGhyZWY9XCJKYXZhU2NyaXB0OmxvYWRUb3AoKTtcIiBvbm1vdXNlb3Zlcj1cImlmKE1TRlBob3ZlcikgZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwQmx1ZS5zcmM7IHNlbGYuc3RhdHVzPXRyZWVicm93c2VyX2pzX01FU1NBR0UyOyByZXR1cm4gdHJ1ZVwiIG9ubW91c2VvdXQ9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEdyYXkuc3JjOyBzZWxmLnN0YXR1cz0gJyAnO3JldHVybiB0cnVlXCI+IDxicj4gPGltZyBzcmM9XCIiICsgYmFja1BhdGggKyAiaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmIik7DQotCWRvY3VtZW50LndyaXRlKCJcIiAgYm9yZGVyPVwiMFwiIGFsaWduPVwiYWJzbWlkZGxlXCIgYWx0PVwiIiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIlwiIG5hbWU9XCIiICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTMgKyAiXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+IiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIjxcL2E+Iik7DQotfQ0KLWVsc2Ugew0KLQlkb2N1bWVudC53cml0ZSgiJm5ic3A7Iik7DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX2phLmpzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfamEuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlZTU5N2QuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfamEuanMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBIZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UxID0gIuani+aIkOOBr+aXouOBq+ODk+ODpeODvOOCkuS9v+eUqOOBl+OBpuihqOekuuOBleOCjOOBpuOBhOOBvuOBmeOAgiAiOw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMiA9ICLjg5Pjg6Xjg7zjga7ooajnpLoiOw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMyA9ICLjg5vjg7zjg6AiOw0KLQ0KLWZ1bmN0aW9uIGxvYWRUb3AoKQ0KLXsNCi0gIGlmKHBhcmVudC5mcmFtZXMubGVuZ3RoIT0wICYmIChwYXJlbnQuZnJhbWVzWzFdLm5hbWU9PSJvcnlfdG9jIiB8fCBwYXJlbnQuZnJhbWVzWzFdLm5hbWU9PSJvcnlfdG9jX2ZyYW1lIikgKQ0KLSAgew0KLSAgICAgYWxlcnQodHJlZWJyb3dzZXJfanNfTUVTU0FHRTEpOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICB2YXIgZXhwaXJlcyA9IG5ldyBEYXRlKCk7DQotICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7DQotICAgIGRvY3VtZW50LmNvb2tpZSA9ICJydXBfb3J5X2RvYz0iICsgZXNjYXBlIChkb2N1bWVudC5VUkwpICsNCi0gICAgIjsgZXhwaXJlcz0iICsgZXhwaXJlcy50b1VUQ1N0cmluZygpICsgICI7IHBhdGg9LyI7DQotICAgIAkNCi0gICAgdmFyIG1haW5JbmRleF9hID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIm1haW5JbmRleCIpOyANCi0JdmFyIG5ld19vcnlfZG9jX2xvYyA9IG51bGw7IA0KLQlpZiAoICBtYWluSW5kZXhfYSAhPSBudWxsICkgeyANCi0gICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZjsgDQotCX0gDQotDQotICAgIGlmKG5ld19vcnlfZG9jX2xvYyE9bnVsbCkNCi0gICAgew0KLQlpZiggc2VsZi5uYW1lID09ICJvcnlfZG9jIiApDQotCXsNCi0JCXdpbmRvdy5jbG9zZSgpOw0KLQkJd2luZG93Lm9wZW4oIG5ld19vcnlfZG9jX2xvYyApOwkJDQotCX0NCi0JZWxzZQ0KLQl7DQotCSAgICAgICAJdG9wLmxvY2F0aW9uID0gbmV3X29yeV9kb2NfbG9jOw0KLQl9DQotICAgIH0NCi0gICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldEltYWdlVXJsKGltYWdlKQ0KLXsNCi0gICAgdmFyIG5ld19vcnlfZG9jX2xvYz1udWxsOyAgICANCi0gICAgdmFyIG1haW5JbmRleF9hID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIm1haW5JbmRleCIpOyANCi0gICAgbmV3X29yeV9kb2NfbG9jID0gbWFpbkluZGV4X2EuaXRlbSgwKS5ocmVmLnN1YnN0cmluZygwLG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZi5sYXN0SW5kZXhPZigiLyIpKTsNCi0gICAgbmV3X29yeV9kb2NfbG9jID0gbmV3X29yeV9kb2NfbG9jICsgIiIgKyBpbWFnZTsNCi0gICAgcmV0dXJuIG5ld19vcnlfZG9jX2xvYzsgICAgDQotfQ0KLQ0KLU1TRlBob3ZlciA9DQotKCgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk5ldHNjYXBlIikgJiYNCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gMyApKSB8fA0KLSAgKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIikgJiYNCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gNCApKSk7DQotDQotICBmdW5jdGlvbiBNU0ZQcHJlbG9hZChpbWcpDQotICB7DQotICAgICB2YXIgYT1uZXcgSW1hZ2UoKTsNCi0gICAgIGEuc3JjPWltZzsNCi0gICAgIHJldHVybiBhOw0KLSAgfQ0KLQ0KLSAgICBpZihNU0ZQaG92ZXIpDQotICAgIHsNCi0gICAgICAgIFJ1cEdyYXk9TVNGUHByZWxvYWQoZ2V0SW1hZ2VVcmwoJy9pbWFnZXMvZGlzcGxheV92aWV3cy5naWYnKSk7DQotICAgICAgICBSdXBCbHVlPU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3NfYS5naWYnKSk7DQotICAgIH0NCi0NCi0NCi0vL25ldyBjb2RlIHRvIGRpc3BsYXkgdGhlIGxvYWQgYnV0dG9uIG9yIG5vdA0KLXZhciBvcnlfdG9jX2V4aXN0ID0gdHlwZW9mIHBhcmVudC5vcnlfdG9jOw0KLWlmIChvcnlfdG9jX2V4aXN0ID09ICJ1bmRlZmluZWQiKSB7DQotICAgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvY19mcmFtZTsNCi19DQotDQotaWYgKG9yeV90b2NfZXhpc3QgPT0gInVuZGVmaW5lZCIpIHsNCi0JZG9jdW1lbnQud3JpdGUoIjxhIGNsYXNzPVwiZXhwYW5kQ29sbGFwc2VMaW5rXCIgaHJlZj1cIkphdmFTY3JpcHQ6bG9hZFRvcCgpO1wiIG9ubW91c2VvdmVyPVwiaWYoTVNGUGhvdmVyKSBkb2N1bWVudFsnSG9tZSddLnNyYz1SdXBCbHVlLnNyYzsgc2VsZi5zdGF0dXM9dHJlZWJyb3dzZXJfanNfTUVTU0FHRTI7IHJldHVybiB0cnVlXCIgb25tb3VzZW91dD1cImlmKE1TRlBob3ZlcikgZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwR3JheS5zcmM7IHNlbGYuc3RhdHVzPSAnICc7cmV0dXJuIHRydWVcIj4gPGJyPiA8aW1nIHNyYz1cIiIgKyBiYWNrUGF0aCArICJpbWFnZXMvZGlzcGxheV92aWV3cy5naWYiKTsNCi0vL1NUQVJUIE5PTi1UUkFOU0xBVEFCTEUNCi0JZG9jdW1lbnQud3JpdGUoIlwiICBib3JkZXI9XCIwXCIgYWxpZ249XCJhYnNtaWRkbGVcIiBhbHQ9XCIiICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTIgKyAiXCIgbmFtZT1cIiIgKyB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMyArICJcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj4iICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTIgKyAiPFwvYT4iKTsNCi0vL0VORCBOT04tVFJBTlNMQVRBQkxFDQotfQ0KLWVsc2Ugew0KLQlkb2N1bWVudC53cml0ZSgiJm5ic3A7Iik7DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX2tvLmpzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfa28uanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlMzc0MzUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfa28uanMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBIZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UxID0gIuq1rOyEseydtCDsnbTrr7gg67O06riw66W8IOyCrOyaqe2VmOyXrCDtkZzsi5zrkJjsl4jsirXri4jri6QuIjsNCi12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTIgPSAi67O06riwIO2RnOyLnCI7DQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UzID0gIu2ZiCI7DQotDQotZnVuY3Rpb24gbG9hZFRvcCgpDQotew0KLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgKHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2MiIHx8IHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2NfZnJhbWUiKSApDQotICB7DQotICAgICBhbGVydCh0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMSk7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIHZhciBleHBpcmVzID0gbmV3IERhdGUoKTsNCi0gICAgZXhwaXJlcy5zZXRUaW1lIChleHBpcmVzLmdldFRpbWUoKSArICgxMDAwICogMjApKTsNCi0gICAgZG9jdW1lbnQuY29va2llID0gInJ1cF9vcnlfZG9jPSIgKyBlc2NhcGUgKGRvY3VtZW50LlVSTCkgKw0KLSAgICAiOyBleHBpcmVzPSIgKyBleHBpcmVzLnRvVVRDU3RyaW5nKCkgKyAgIjsgcGF0aD0vIjsNCi0gICAgCQ0KLSAgICB2YXIgbWFpbkluZGV4X2EgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgibWFpbkluZGV4Iik7IA0KLQl2YXIgbmV3X29yeV9kb2NfbG9jID0gbnVsbDsgDQotCWlmICggIG1haW5JbmRleF9hICE9IG51bGwgKSB7IA0KLSAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gbWFpbkluZGV4X2EuaXRlbSgwKS5ocmVmOyANCi0JfSANCi0NCi0gICAgaWYobmV3X29yeV9kb2NfbG9jIT1udWxsKQ0KLSAgICB7DQotCWlmKCBzZWxmLm5hbWUgPT0gIm9yeV9kb2MiICkNCi0Jew0KLQkJd2luZG93LmNsb3NlKCk7DQotCQl3aW5kb3cub3BlbiggbmV3X29yeV9kb2NfbG9jICk7CQkNCi0JfQ0KLQllbHNlDQotCXsNCi0JICAgICAgIAl0b3AubG9jYXRpb24gPSBuZXdfb3J5X2RvY19sb2M7DQotCX0NCi0gICAgfQ0KLSAgIH0NCi19DQotDQotZnVuY3Rpb24gZ2V0SW1hZ2VVcmwoaW1hZ2UpDQotew0KLSAgICB2YXIgbmV3X29yeV9kb2NfbG9jPW51bGw7ICAgIA0KLSAgICB2YXIgbWFpbkluZGV4X2EgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgibWFpbkluZGV4Iik7IA0KLSAgICBuZXdfb3J5X2RvY19sb2MgPSBtYWluSW5kZXhfYS5pdGVtKDApLmhyZWYuc3Vic3RyaW5nKDAsbWFpbkluZGV4X2EuaXRlbSgwKS5ocmVmLmxhc3RJbmRleE9mKCIvIikpOw0KLSAgICBuZXdfb3J5X2RvY19sb2MgPSBuZXdfb3J5X2RvY19sb2MgKyAiIiArIGltYWdlOw0KLSAgICByZXR1cm4gbmV3X29yeV9kb2NfbG9jOyAgICANCi19DQotDQotTVNGUGhvdmVyID0NCi0oKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTmV0c2NhcGUiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSAzICkpIHx8DQotICAoKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpKTsNCi0NCi0gIGZ1bmN0aW9uIE1TRlBwcmVsb2FkKGltZykNCi0gIHsNCi0gICAgIHZhciBhPW5ldyBJbWFnZSgpOw0KLSAgICAgYS5zcmM9aW1nOw0KLSAgICAgcmV0dXJuIGE7DQotICB9DQotDQotICAgIGlmKE1TRlBob3ZlcikNCi0gICAgew0KLSAgICAgICAgUnVwR3JheT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzLmdpZicpKTsNCi0gICAgICAgIFJ1cEJsdWU9TVNGUHByZWxvYWQoZ2V0SW1hZ2VVcmwoJy9pbWFnZXMvZGlzcGxheV92aWV3c19hLmdpZicpKTsNCi0gICAgfQ0KLQ0KLQ0KLS8vbmV3IGNvZGUgdG8gZGlzcGxheSB0aGUgbG9hZCBidXR0b24gb3Igbm90DQotdmFyIG9yeV90b2NfZXhpc3QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2M7DQotaWYgKG9yeV90b2NfZXhpc3QgPT0gInVuZGVmaW5lZCIpIHsNCi0gICBvcnlfdG9jX2V4aXN0ID0gdHlwZW9mIHBhcmVudC5vcnlfdG9jX2ZyYW1lOw0KLX0NCi0NCi1pZiAob3J5X3RvY19leGlzdCA9PSAidW5kZWZpbmVkIikgew0KLQlkb2N1bWVudC53cml0ZSgiPGEgY2xhc3M9XCJleHBhbmRDb2xsYXBzZUxpbmtcIiBocmVmPVwiSmF2YVNjcmlwdDpsb2FkVG9wKCk7XCIgb25tb3VzZW92ZXI9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEJsdWUuc3JjOyBzZWxmLnN0YXR1cz10cmVlYnJvd3Nlcl9qc19NRVNTQUdFMjsgcmV0dXJuIHRydWVcIiBvbm1vdXNlb3V0PVwiaWYoTVNGUGhvdmVyKSBkb2N1bWVudFsnSG9tZSddLnNyYz1SdXBHcmF5LnNyYzsgc2VsZi5zdGF0dXM9ICcgJztyZXR1cm4gdHJ1ZVwiPiA8YnI+IDxpbWcgc3JjPVwiIiArIGJhY2tQYXRoICsgImltYWdlcy9kaXNwbGF5X3ZpZXdzLmdpZiIpOw0KLS8vU1RBUlQgTk9OLVRSQU5TTEFUQUJMRQ0KLQlkb2N1bWVudC53cml0ZSgiXCIgIGJvcmRlcj1cIjBcIiBhbGlnbj1cImFic21pZGRsZVwiIGFsdD1cIiIgKyB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMiArICJcIiBuYW1lPVwiIiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UzICsgIlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPiIgKyB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMiArICI8XC9hPiIpOw0KLS8vRU5EIE5PTi1UUkFOU0xBVEFCTEUNCi19DQotZWxzZSB7DQotCWRvY3VtZW50LndyaXRlKCImbmJzcDsiKTsNCi19DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfcHRfQlIuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy90cmVlYnJvd3Nlcl9wdF9CUi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmNkN2EzZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy90cmVlYnJvd3Nlcl9wdF9CUi5qcworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8vIEhlcmUgZGVmaW5lcyBhbGwgdGhlIEkxOE4gc3BlY2lmaWMgbWVzc2FnZXMgdXNlZCBpbiB0aGUgamF2YXNjcmlwdHMNCi12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTEgPSAiQSBjb25maWd1cmHDp8OjbyBqw6Egw6kgZXhpYmlkYSB1dGlsaXphbmRvIHZpc3VhbGl6YcOnw7VlcyI7DQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UyID0gIkV4aWJpciB2aXN1YWxpemHDp8O1ZXMiOw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMyA9ICJIb21lIjsNCi0NCi1mdW5jdGlvbiBsb2FkVG9wKCkNCi17DQotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiAocGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIgfHwgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvY19mcmFtZSIpICkNCi0gIHsNCi0gICAgIGFsZXJ0KHRyZWVicm93c2VyX2pzX01FU1NBR0UxKTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOw0KLSAgICBleHBpcmVzLnNldFRpbWUgKGV4cGlyZXMuZ2V0VGltZSgpICsgKDEwMDAgKiAyMCkpOw0KLSAgICBkb2N1bWVudC5jb29raWUgPSAicnVwX29yeV9kb2M9IiArIGVzY2FwZSAoZG9jdW1lbnQuVVJMKSArDQotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOw0KLSAgICAJDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotCXZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOyANCi0JaWYgKCAgbWFpbkluZGV4X2EgIT0gbnVsbCApIHsgDQotICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBtYWluSW5kZXhfYS5pdGVtKDApLmhyZWY7IA0KLQl9IA0KLQ0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpDQotICAgIHsNCi0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQ0KLQl7DQotCQl3aW5kb3cuY2xvc2UoKTsNCi0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsJCQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsNCi0JfQ0KLSAgICB9DQotICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBnZXRJbWFnZVVybChpbWFnZSkNCi17DQotICAgIHZhciBuZXdfb3J5X2RvY19sb2M9bnVsbDsgICAgDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZi5zdWJzdHJpbmcoMCxtYWluSW5kZXhfYS5pdGVtKDApLmhyZWYubGFzdEluZGV4T2YoIi8iKSk7DQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG5ld19vcnlfZG9jX2xvYyArICIiICsgaW1hZ2U7DQotICAgIHJldHVybiBuZXdfb3J5X2RvY19sb2M7ICAgIA0KLX0NCi0NCi1NU0ZQaG92ZXIgPQ0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwNCi0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOw0KLQ0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQ0KLSAgew0KLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7DQotICAgICBhLnNyYz1pbWc7DQotICAgICByZXR1cm4gYTsNCi0gIH0NCi0NCi0gICAgaWYoTVNGUGhvdmVyKQ0KLSAgICB7DQotICAgICAgICBSdXBHcmF5PU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmJykpOw0KLSAgICAgICAgUnVwQmx1ZT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzX2EuZ2lmJykpOw0KLSAgICB9DQotDQotDQotLy9uZXcgY29kZSB0byBkaXNwbGF5IHRoZSBsb2FkIGJ1dHRvbiBvciBub3QNCi12YXIgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYzsNCi1pZiAob3J5X3RvY19leGlzdCA9PSAidW5kZWZpbmVkIikgew0KLSAgIG9yeV90b2NfZXhpc3QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2NfZnJhbWU7DQotfQ0KLQ0KLWlmIChvcnlfdG9jX2V4aXN0ID09ICJ1bmRlZmluZWQiKSB7DQotCWRvY3VtZW50LndyaXRlKCI8YSBjbGFzcz1cImV4cGFuZENvbGxhcHNlTGlua1wiIGhyZWY9XCJKYXZhU2NyaXB0OmxvYWRUb3AoKTtcIiBvbm1vdXNlb3Zlcj1cImlmKE1TRlBob3ZlcikgZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwQmx1ZS5zcmM7IHNlbGYuc3RhdHVzPXRyZWVicm93c2VyX2pzX01FU1NBR0UyOyByZXR1cm4gdHJ1ZVwiIG9ubW91c2VvdXQ9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEdyYXkuc3JjOyBzZWxmLnN0YXR1cz0gJyAnO3JldHVybiB0cnVlXCI+IDxicj4gPGltZyBzcmM9XCIiICsgYmFja1BhdGggKyAiaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmIik7DQotCWRvY3VtZW50LndyaXRlKCJcIiAgYm9yZGVyPVwiMFwiIGFsaWduPVwiYWJzbWlkZGxlXCIgYWx0PVwiIiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIlwiIG5hbWU9XCIiICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTMgKyAiXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+IiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIjxcL2E+Iik7DQotfQ0KLWVsc2Ugew0KLQlkb2N1bWVudC53cml0ZSgiJm5ic3A7Iik7DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX3poX0NOLmpzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfemhfQ04uanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ3MjY1NTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfemhfQ04uanMKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBIZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UxID0gIumFjee9ruW3suS9v+eUqOinhuWbvuaYvuekuiI7DQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UyID0gIuaYvuekuuinhuWbviI7DQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UzID0gIuS4u+mhtSI7DQotDQotZnVuY3Rpb24gbG9hZFRvcCgpDQotew0KLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgKHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2MiIHx8IHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2NfZnJhbWUiKSApDQotICB7DQotICAgICBhbGVydCh0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMSk7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIHZhciBleHBpcmVzID0gbmV3IERhdGUoKTsNCi0gICAgZXhwaXJlcy5zZXRUaW1lIChleHBpcmVzLmdldFRpbWUoKSArICgxMDAwICogMjApKTsNCi0gICAgZG9jdW1lbnQuY29va2llID0gInJ1cF9vcnlfZG9jPSIgKyBlc2NhcGUgKGRvY3VtZW50LlVSTCkgKw0KLSAgICAiOyBleHBpcmVzPSIgKyBleHBpcmVzLnRvVVRDU3RyaW5nKCkgKyAgIjsgcGF0aD0vIjsNCi0gICAgCQ0KLSAgICB2YXIgbWFpbkluZGV4X2EgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgibWFpbkluZGV4Iik7IA0KLQl2YXIgbmV3X29yeV9kb2NfbG9jID0gbnVsbDsgDQotCWlmICggIG1haW5JbmRleF9hICE9IG51bGwgKSB7IA0KLSAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gbWFpbkluZGV4X2EuaXRlbSgwKS5ocmVmOyANCi0JfSANCi0NCi0gICAgaWYobmV3X29yeV9kb2NfbG9jIT1udWxsKQ0KLSAgICB7DQotCWlmKCBzZWxmLm5hbWUgPT0gIm9yeV9kb2MiICkNCi0Jew0KLQkJd2luZG93LmNsb3NlKCk7DQotCQl3aW5kb3cub3BlbiggbmV3X29yeV9kb2NfbG9jICk7CQkNCi0JfQ0KLQllbHNlDQotCXsNCi0JICAgICAgIAl0b3AubG9jYXRpb24gPSBuZXdfb3J5X2RvY19sb2M7DQotCX0NCi0gICAgfQ0KLSAgIH0NCi19DQotDQotZnVuY3Rpb24gZ2V0SW1hZ2VVcmwoaW1hZ2UpDQotew0KLSAgICB2YXIgbmV3X29yeV9kb2NfbG9jPW51bGw7ICAgIA0KLSAgICB2YXIgbWFpbkluZGV4X2EgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgibWFpbkluZGV4Iik7IA0KLSAgICBuZXdfb3J5X2RvY19sb2MgPSBtYWluSW5kZXhfYS5pdGVtKDApLmhyZWYuc3Vic3RyaW5nKDAsbWFpbkluZGV4X2EuaXRlbSgwKS5ocmVmLmxhc3RJbmRleE9mKCIvIikpOw0KLSAgICBuZXdfb3J5X2RvY19sb2MgPSBuZXdfb3J5X2RvY19sb2MgKyAiIiArIGltYWdlOw0KLSAgICByZXR1cm4gbmV3X29yeV9kb2NfbG9jOyAgICANCi19DQotDQotTVNGUGhvdmVyID0NCi0oKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTmV0c2NhcGUiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSAzICkpIHx8DQotICAoKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpKTsNCi0NCi0gIGZ1bmN0aW9uIE1TRlBwcmVsb2FkKGltZykNCi0gIHsNCi0gICAgIHZhciBhPW5ldyBJbWFnZSgpOw0KLSAgICAgYS5zcmM9aW1nOw0KLSAgICAgcmV0dXJuIGE7DQotICB9DQotDQotICAgIGlmKE1TRlBob3ZlcikNCi0gICAgew0KLSAgICAgICAgUnVwR3JheT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzLmdpZicpKTsNCi0gICAgICAgIFJ1cEJsdWU9TVNGUHByZWxvYWQoZ2V0SW1hZ2VVcmwoJy9pbWFnZXMvZGlzcGxheV92aWV3c19hLmdpZicpKTsNCi0gICAgfQ0KLQ0KLQ0KLS8vbmV3IGNvZGUgdG8gZGlzcGxheSB0aGUgbG9hZCBidXR0b24gb3Igbm90DQotdmFyIG9yeV90b2NfZXhpc3QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2M7DQotaWYgKG9yeV90b2NfZXhpc3QgPT0gInVuZGVmaW5lZCIpIHsNCi0gICBvcnlfdG9jX2V4aXN0ID0gdHlwZW9mIHBhcmVudC5vcnlfdG9jX2ZyYW1lOw0KLX0NCi0NCi1pZiAob3J5X3RvY19leGlzdCA9PSAidW5kZWZpbmVkIikgew0KLQlkb2N1bWVudC53cml0ZSgiPGEgY2xhc3M9XCJleHBhbmRDb2xsYXBzZUxpbmtcIiBocmVmPVwiSmF2YVNjcmlwdDpsb2FkVG9wKCk7XCIgb25tb3VzZW92ZXI9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEJsdWUuc3JjOyBzZWxmLnN0YXR1cz10cmVlYnJvd3Nlcl9qc19NRVNTQUdFMjsgcmV0dXJuIHRydWVcIiBvbm1vdXNlb3V0PVwiaWYoTVNGUGhvdmVyKSBkb2N1bWVudFsnSG9tZSddLnNyYz1SdXBHcmF5LnNyYzsgc2VsZi5zdGF0dXM9ICcgJztyZXR1cm4gdHJ1ZVwiPiA8YnI+IDxpbWcgc3JjPVwiIiArIGJhY2tQYXRoICsgImltYWdlcy9kaXNwbGF5X3ZpZXdzLmdpZiIpOw0KLQlkb2N1bWVudC53cml0ZSgiXCIgIGJvcmRlcj1cIjBcIiBhbGlnbj1cImFic21pZGRsZVwiIGFsdD1cIiIgKyB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMiArICJcIiBuYW1lPVwiIiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UzICsgIlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPiIgKyB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMiArICI8XC9hPiIpOw0KLX0NCi1lbHNlIHsNCi0JZG9jdW1lbnQud3JpdGUoIiZuYnNwOyIpOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQvc2NyaXB0cy90cmVlYnJvd3Nlcl96aF9UVy5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX3poX1RXLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YzYxYmNiLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX3poX1RXLmpzCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLy8gSGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMSA9ICLlt7Lkvb/nlKjoppblnJbkvobpoa/npLrphY3nva4iOw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMiA9ICLpoa/npLroppblnJYiOw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMyA9ICJIb21lIjsNCi0NCi1mdW5jdGlvbiBsb2FkVG9wKCkNCi17DQotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiAocGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIgfHwgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvY19mcmFtZSIpICkNCi0gIHsNCi0gICAgIGFsZXJ0KHRyZWVicm93c2VyX2pzX01FU1NBR0UxKTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOw0KLSAgICBleHBpcmVzLnNldFRpbWUgKGV4cGlyZXMuZ2V0VGltZSgpICsgKDEwMDAgKiAyMCkpOw0KLSAgICBkb2N1bWVudC5jb29raWUgPSAicnVwX29yeV9kb2M9IiArIGVzY2FwZSAoZG9jdW1lbnQuVVJMKSArDQotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOw0KLSAgICAJDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotCXZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOyANCi0JaWYgKCAgbWFpbkluZGV4X2EgIT0gbnVsbCApIHsgDQotICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBtYWluSW5kZXhfYS5pdGVtKDApLmhyZWY7IA0KLQl9IA0KLQ0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpDQotICAgIHsNCi0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQ0KLQl7DQotCQl3aW5kb3cuY2xvc2UoKTsNCi0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsJCQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsNCi0JfQ0KLSAgICB9DQotICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBnZXRJbWFnZVVybChpbWFnZSkNCi17DQotICAgIHZhciBuZXdfb3J5X2RvY19sb2M9bnVsbDsgICAgDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZi5zdWJzdHJpbmcoMCxtYWluSW5kZXhfYS5pdGVtKDApLmhyZWYubGFzdEluZGV4T2YoIi8iKSk7DQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG5ld19vcnlfZG9jX2xvYyArICIiICsgaW1hZ2U7DQotICAgIHJldHVybiBuZXdfb3J5X2RvY19sb2M7ICAgIA0KLX0NCi0NCi0NCi1NU0ZQaG92ZXIgPQ0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwNCi0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOw0KLQ0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQ0KLSAgew0KLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7DQotICAgICBhLnNyYz1pbWc7DQotICAgICByZXR1cm4gYTsNCi0gIH0NCi0NCi0gICAgaWYoTVNGUGhvdmVyKQ0KLSAgICB7DQotICAgICAgICBSdXBHcmF5PU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmJykpOw0KLSAgICAgICAgUnVwQmx1ZT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzX2EuZ2lmJykpOw0KLSAgICB9DQotDQotDQotLy9uZXcgY29kZSB0byBkaXNwbGF5IHRoZSBsb2FkIGJ1dHRvbiBvciBub3QNCi12YXIgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYzsNCi1pZiAob3J5X3RvY19leGlzdCA9PSAidW5kZWZpbmVkIikgew0KLSAgIG9yeV90b2NfZXhpc3QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2NfZnJhbWU7DQotfQ0KLQ0KLWlmIChvcnlfdG9jX2V4aXN0ID09ICJ1bmRlZmluZWQiKSB7DQotCWRvY3VtZW50LndyaXRlKCI8YSBjbGFzcz1cImV4cGFuZENvbGxhcHNlTGlua1wiIGhyZWY9XCJKYXZhU2NyaXB0OmxvYWRUb3AoKTtcIiBvbm1vdXNlb3Zlcj1cImlmKE1TRlBob3ZlcikgZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwQmx1ZS5zcmM7IHNlbGYuc3RhdHVzPXRyZWVicm93c2VyX2pzX01FU1NBR0UyOyByZXR1cm4gdHJ1ZVwiIG9ubW91c2VvdXQ9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEdyYXkuc3JjOyBzZWxmLnN0YXR1cz0gJyAnO3JldHVybiB0cnVlXCI+IDxicj4gPGltZyBzcmM9XCIiICsgYmFja1BhdGggKyAiaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmIik7DQotCWRvY3VtZW50LndyaXRlKCJcIiAgYm9yZGVyPVwiMFwiIGFsaWduPVwiYWJzbWlkZGxlXCIgYWx0PVwiIiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIlwiIG5hbWU9XCIiICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTMgKyAiXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+IiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIjxcL2E+Iik7DQotfQ0KLWVsc2Ugew0KLQlkb2N1bWVudC53cml0ZSgiJm5ic3A7Iik7DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQveHNsL3Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNDYwZDEyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBUaGUgVUkgdGV4dCBpbiB0aGUgWFNMIHN0eWxlc2hlZXRzLg0KLQ0KLWFkZGl0aW9uYWxJbmZvVGV4dD1adXNcdTAwZTR0emxpY2hlIEluZm9ybWF0aW9uZW4NCi1hZGRpdGlvbmFsUGVyZm9ybWVyVGV4dD1adXNcdTAwZTR0emxpY2hlIEF1c2ZcdTAwZmNocmVuZGUNCi1hZ2dyZWdhdGVzVGV4dD1adXNhbW1lbmZhc3N1bmdlbg0KLWFsdGVybmF0aXZlc1RleHQ9QWx0ZXJuYXRpdmVuDQotYXBwbGljYXRpb25UZXh0PUFud2VuZHVuZw0KLWFydGlmYWN0VGV4dD1BcnRlZmFrdA0KLWFzc2V0c1RleHQ9QXNzZXRzDQotYXNzaWdubWVudEFwcHJvYWNoZXNUZXh0PVp1b3JkbnVuZ3NzdHJhdGVnaWVuDQotYXNzaXN0aW5nVGV4dD1VbnRlcnN0XHUwMGZjdHplbmRlIFJvbGxlbg0KLWJhY2tncm91bmRUZXh0PUhpbnRlcmdydW5kDQotYnJpZWZPdXRsaW5lVGV4dD1LdXJ6ZSBHbGllZGVydW5nDQotY2hlY2tJdGVtc1RleHQ9UHJcdTAwZmNmbGlzdGVuZWludHJcdTAwZTRnZQ0KLWNoZWNrbGlzdHNUZXh0PVByXHUwMGZjZmxpc3Rlbg0KLWNvbGxhcHNlQWxsVGV4dD1BbGxlIFByXHUwMGZjZmxpc3RlbmVpbnRyXHUwMGU0Z2UgYXVzYmxlbmRlbg0KLWNvbXBvc2l0ZVJvbGVUZXh0PUtvbWJpbmllcnRlIFJvbGxlDQotY29uY2VwdHNUZXh0PUtvbnplcHRlDQotY29udGFpbmVkQXJ0aWZhY3RzVGV4dD1FbnRoYWx0ZW5lIEFydGVmYWt0ZQ0KLWNvbnRhaW5lckFydGlmYWN0VGV4dD1Db250YWluZXJhcnRlZmFrdA0KLWNvbnRlbnRFbGVtZW50c1RleHQ9S2F0ZWdvcmlzaWVydGUgRWxlbWVudGUNCi1jb250ZW50UmVmZXJlbmNlc1RleHQ9SW5oYWx0c3JlZmVyZW56ZW4NCi1kZWxpdmVyYWJsZVRleHQ9TGllZmVyZ2VnZW5zdGFuZA0KLWRlbGl2ZXJhYmxlUHJvcGVydGllc1RleHQ9TWVya21hbGUgZGVzIExpZWZlcmdlZ2Vuc3RhbmRzDQotZGVsaXZlcmVkUGFydHNUZXh0PVRlaWxlIGRlcyBMaWVmZXJnZWdlbnN0YW5kcw0KLWRlbGl2ZXJlZFdvcmtQcm9kdWN0c1RleHQ9R2VsaWVmZXJ0ZSBBcmJlaXRzZXJnZWJuaXNzZQ0KLWRlcGVuZGVudFRleHQ9QWJoXHUwMGU0bmdpZ2UgQXJiZWl0c2VyZ2Vibmlzc2UNCi1kZXNjcmlwdGlvblRleHQ9QmVzY2hyZWlidW5nDQotZGlzY2lwbGluZVRleHQ9RGlzemlwbGluDQotZGlzY2lwbGluZXNUZXh0PURpc3ppcGxpbmVuDQotc3ViZGlzY2lwbGluZXNUZXh0PVVudGVyZGlzemlwbGluZW4NCi1kb21haW5UZXh0PURvbVx1MDBlNG5lDQotZG9tYWluc1RleHQ9RG9tXHUwMGU0bmVuDQotZXhhbXBsZXNUZXh0PUJlaXNwaWVsZQ0KLWV4cGFuZEFsbFRleHQ9QWxsZSBQclx1MDBmY2ZsaXN0ZW5laW50clx1MDBlNGdlIGVpbmJsZW5kZW4NCi1leHRlbmRzVGV4dD1FcndlaXRlcnVuZw0KLWV4dGVybmFsVGV4dD1FeHRlcm4NCi1leHRlcm5hbERlc2NyaXB0aW9uVGV4dD1FeHRlcm5lIEJlc2NocmVpYnVuZw0KLWdvYWxzVGV4dD1aaWVsZQ0KLWd1aWRlbGluZXNUZXh0PVJpY2h0bGluaWVuDQotaWxsdXN0cmF0aW9uc1RleHQ9QWJiaWxkdW5nZW4NCi1pbXBhY3RPZk5vdEhhdmluZ1RleHQ9QXVzd2lya3VuZ2VuIGJlaSBOaWNodHZlcndlbmR1bmcNCi1pbXBhY3RpbmdUZXh0PU1hXHUwMGRmZ2VibGljaGUgQXJiZWl0c2VyZ2Vibmlzc2UNCi1pbnB1dHNUZXh0PUVpbmdhYmVuDQotaW5wdXRUb1RleHQ9RWluZ2FiZSBmXHUwMGZjcg0KLWl0ZW1zVGV4dD1FaW50clx1MDBlNGdlDQota2V5Q29uc2lkZXJhdGlvbnNUZXh0PVdpY2h0aWdlIEhpbndlaXNlDQotbGV2ZWxzT2ZBZG9wdGlvblRleHQ9RWluZlx1MDBmY2hydW5nc3N0dWZlbg0KLW1hbmRhdG9yeVRleHQ9VmVyYmluZGxpY2gNCi1tYWluVGV4dD1IYXVwdHJvbGxlbg0KLW1haW5EZXNjcmlwdGlvblRleHQ9SGF1cHRiZXNjaHJlaWJ1bmcNCi1tYWluUmVzcG9uc2libGVUZXh0PUhhdXB0dmVyYW50d29ydGxpY2hlDQotbWV0aG9kVGV4dD1NZXRob2RlbmFyYmVpdHNlcmdlYm5pcw0KLW1vZGlmaWVkQnlUZXh0PUdlXHUwMGU0bmRlcnQgdm9uDQotbW9yZUluZm9UZXh0PVdlaXRlcmUgSW5mb3JtYXRpb25lbg0KLW5vdGF0aW9uVGV4dD1Ob3RhdGlvbg0KLW9wdGlvbmFsVGV4dD1PcHRpb25hbA0KLW91dGNvbWVUZXh0PVJlc3VsdGF0DQotb3V0cHV0RnJvbVRleHQ9QXVzZ2FiZSB2b24NCi1vdXRwdXRzVGV4dD1BdXNnYWJlbg0KLXBhY2thZ2luZ0luc3RydWN0aW9uc1RleHQ9QW53ZWlzdW5nZW4genVtIFBhY2tlbg0KLXBhY2thZ2luZ0d1aWRhbmNlVGV4dD1BbmxlaXR1bmcgenVtIFBhY2tlbg0KLXBlcmZvcm1pbmdSb2xlc1RleHQ9QXVzZlx1MDBmY2hyZW5kZSBSb2xsZW4NCi1wcmltYXJ5UGVyZm9ybWVyVGV4dD1QcmltXHUwMGU0cmVyIEF1c2ZcdTAwZmNocmVuZGVyDQotcHJvYmxlbVRleHQ9UHJvYmxlbQ0KLXByb3BlcnRpZXNUZXh0PUVpZ2Vuc2NoYWZ0ZW4NCi1wdXJwb3NlVGV4dD1ad2Vjaw0KLXJlYXNvbnNGb3JOb3ROZWVkaW5nVGV4dD1Hclx1MDBmY25kZSBmXHUwMGZjciBOaWNodHZlcndlbmR1bmcNCi1yZWZlcmVuY2VXb3JrZmxvd3NUZXh0PVJlZmVyZW56d29ya2Zsb3dzDQotcmVsYXRlZEVsZW1lbnRzVGV4dD1adWdlaFx1MDBmNnJpZ2UgRWxlbWVudGUNCi1yZWxhdGlvbnNoaXBzVGV4dD1CZXppZWh1bmdlbg0KLXJlcG9ydHNUZXh0PUJlcmljaHRlDQotcmVwcmVzZW50YXRpb25PcHRpb25zVGV4dD1EYXJzdGVsbHVuZ3NvcHRpb25lbg0KLXJlc3BvbnNpYmxlVGV4dD1WZXJhbnR3b3J0bGljaA0KLXJlc3BvbnNpYmxlRm9yVGV4dD1WZXJhbnR3b3J0bGljaCBmXHUwMGZjcg0KLXJldXNhYmxlQXNzZXRzVGV4dD1XaWVkZXJ2ZXJ3ZW5kYmFyZSBBc3NldHMNCi1yb2xlVGV4dD1Sb2xsZQ0KLXJvbGVzVGV4dD1Sb2xsZW4NCi1yb2xlU2V0c1RleHQ9Um9sbGVuZ3J1cHBlbg0KLXNraWxsc1RleHQ9S25vdy1ob3cNCi1zdGFmZmluZ1RleHQ9TWl0YXJiZWl0ZXJhdXN3YWhsDQotc3RlcHNUZXh0PVNjaHJpdHRlDQotc3ViY2F0ZWdvcmllc1RleHQ9VW50ZXJrYXRlZ29yaWVuIA0KLXN1YmRvbWFpbnNUZXh0PVVudGVyZG9tXHUwMGU0bmVuDQotc3ViUHJhY3RpY2VzVGV4dD1VbnRlcmdlb3JkbmV0ZSBWZXJmYWhyZW4NCi1zdXBlclRlYW1UZXh0PVByb2ZpbCBkZXMgU3VwZXJ0ZWFtcw0KLXN1cHBvcnRpbmdNYXRlcmlhbHNUZXh0PVVudGVyc3RcdTAwZmN0emVuZGVzIE1hdGVyaWFsDQotc3VidGVhbXNUZXh0PVByb2ZpbGUgdm9uIHVudGVyZ2VvcmRuZXRlbiBUZWFtcw0KLXN5bm9ueW1zVGV4dD1TeW5vbnltZQ0KLXRhaWxvcmluZ1RleHQ9QW5wYXNzdW5nDQotdGFza1RleHQ9QXVmZ2FiZQ0KLXRhc2tzVGV4dD1BdWZnYWJlbg0KLXRic1RleHQ9VGVhbXp1b3JkbnVuZw0KLXRlYW1Qcm9maWxlVGV4dD1UZWFtcHJvZmlsDQotdGVhbVJvbGVzVGV4dD1Sb2xsZW4gaW0gVGVhbXByb2ZpbA0KLXRlY2huaXF1ZXNUZXh0PVJpY2h0bGluaWVuDQotdGVtcGxhdGVGaWxlc1RleHQ9Vm9ybGFnZW5kYXRlaWVuDQotdGVtcGxhdGVzVGV4dD1Wb3JsYWdlbg0KLXRvb2xNZW50b3JzVGV4dD1Ub29sbWVudG9yZW4NCi10b29sVGV4dD1Ub29sDQotdXNhZ2VUZXh0PVZlcndlbmR1bmcNCi13YnNUZXh0PVByb2pla3RzdHJ1a3R1cnBsYW4NCi13aGl0ZXBhcGVyc1RleHQ9V2hpdGUgUGFwZXINCi13b3JrUHJvZHVjdHNUZXh0PUFyYmVpdHNlcmdlYm5pc3NlDQotd29ya1Byb2R1Y3RUeXBlc1RleHQ9QXJ0ZW4gdm9uIEFyYmVpdHNlcmdlYm5pc3Nlbg0KLXdwYnNUZXh0PVZlcndlbmR1bmcgZGVyIEFyYmVpdHNlcmdlYm5pc3NlDQotd29ya0JyZWFrZG93blRleHQ9UHJvamVrdHN0cnVrdHVyDQotd29ya2Zsb3dUZXh0PVdvcmtmbG93DQotd29ya1Byb2R1Y3RCcmVha2Rvd25UZXh0PUFyYmVpdHNlcmdlYm5pc3N0cnVrdHVyDQotd29ya1Byb2R1Y3REZXBlbmRlbmNpZXNUZXh0PUFyYmVpdHNlcmdlYm5pc2FiaFx1MDBlNG5naWdrZWl0ZW4NCi10ZWFtUHJvZmlsZUJyZWFrZG93blRleHQ9VGVhbXN0cnVrdHVyDQotdGVhbVN0cnVjdHVyZVRleHQ9VGVhbXp1c2FtbWVuc2V0enVuZw0KLXBhZ2VOb3RJbnN0YWxsZWRUZXh0PVNlaXRlIG5pY2h0IGluc3RhbGxpZXJ0DQotZWxlbWVudERvZXNOb3RFeGlzdFRleHQ9RWxlbWVudCBuaWNodCB2b3JoYW5kZW4NCi1pc05vdFZhbGlkVGV4dD1EYXMgcmVmZXJlbnppZXJ0ZSBFbGVtZW50IGlzdCBrZWluIGdcdTAwZmNsdGlnZXMgRWxlbWVudCBpbiBkZXIgYWt0dWVsbGVuIEJpYmxpb3RoZWsuDQotZWxlbWVudE1pZ2h0QmVEZWxldGVkVGV4dD1EYXMgRWxlbWVudCB3dXJkZSBtXHUwMGY2Z2xpY2hlcndlaXNlIGF1cyBkZXIgQmlibGlvdGhlayBnZWxcdTAwZjZzY2h0Lg0KLXBsZWFzZUZpeExpbmtUZXh0PVx1MDBkY2JlcnByXHUwMGZjZmVuIFNpZSBkaWUgSW5oYWx0c2JpYmxpb3RoZWsgdW5kIGtvcnJpZ2llcmVuIFNpZSBkZW4gTGluay4NCi1pbmZvQWJvdXRNaXNzaW5nRWxlbWVudFRleHQ9SW5mb3JtYXRpb25lbiB6dW0gZmVobGVuZGVuIEVsZW1lbnQ6DQotZWxlbWVudE5hbWVUZXh0PUVsZW1lbnRuYW1lOg0KLWd1aWRUZXh0PUdVSUQ6DQotbWlzc2luZ0VsZW1lbnRUZXh0PURpZSByZWZlcmVuemllcnRlIFNlaXRlIGlzdCBuaWNodCBpbiBkZXIgS29uZmlndXJhdGlvbiBlbnRoYWx0ZW4uDQotbm90QXZhaWxhYmxlVGV4dD1EaWUgcmVmZXJlbnppZXJ0ZSBTZWl0ZSBpc3QgbmljaHQgaW4gZGVyIGFrdHVlbGxlbiBLb25maWd1cmF0aW9uIHZlcmZcdTAwZmNnYmFyLiBNXHUwMGY2Z2xpY2hlcndlaXNlIGlzdCBkaWVzZSBTZWl0ZSBpbiBlaW5lciBhbmRlcmVuIFByb3plc3Nrb25maWd1cmF0aW9uIHZlcmZcdTAwZmNnYmFyLg0KLWVsZW1lbnRUeXBlVGV4dD1FbGVtZW50dHlwOg0KLXBsdWdpbk5hbWVUZXh0PVBsdWctaW4tTmFtZToNCi1wcmVkZWNlc3NvclRleHQ9Vm9yZ1x1MDBlNG5nZXINCi1wbGFubmluZ0RhdGFUZXh0PVBsYW5uaW5nRGF0YQ0KLW11bHRpcGxlT2NjdXJyZW5jZXNUZXh0PU1laHJlcmUgVm9ya29tbWVuDQotZXZlbnREcml2ZW5UZXh0PUVyZWlnbmlzZ2VzdGV1ZXJ0DQotb25nb2luZ1RleHQ9Rm9ydGxhdWZlbmQNCi1wbGFubmVkVGV4dD1HZXBsYW50DQotcmVwZWF0YWJsZVRleHQ9V2llZGVyaG9sdCBhbndlbmRiYXINCi11c2FnZUd1aWRhbmNlVGV4dD1BbmxlaXR1bmcgenVyIFZlcndlbmR1bmcNCi1pbnB1dHNUZXh0PUVpbmdhYmVuDQotb3V0cHV0c1RleHQ9QXVzZ2FiZW4NCi1hY3Rpdml0eUVudHJ5U3RhdGVUZXh0PUFuZmFuZ3N6dXN0YW5kIGRlciBBa3Rpdml0XHUwMGU0dA0KLWFjdGl2aXR5RXhpdFN0YXRlVGV4dD1FbmR6dXN0YW5kIGRlciBBa3Rpdml0XHUwMGU0dA0KLXByZWZpeFRleHQ9UHJcdTAwZTRmaXgNCi1leHRlcm5hbElkVGV4dD1FeHRlcm5lIElEDQotc2NvcGVUZXh0PVNjb3BlDQotcm9hZG1hcFRleHQ9Um9hZG1hcA0KLXR5cGVvZkNvbnRyYWN0VGV4dD1UeXAgZGVzIFZlcnRyYWdzDQotcHJvamVjdENoYXJhY3RlcmlzdGljc1RleHQ9UHJvamVrdG1lcmttYWxlDQotcHJvamVjdE1lbWJlckV4cGVydGlzZVRleHQ9S25vdy1ob3cgZGVyIFByb2pla3RtaXRhcmJlaXRlcg0KLXJpc2tMZXZlbFRleHQ9UmlzaWtvc3R1ZmUNCi1zY2FsZVRleHQ9U2thbGllcnVuZw0KLXVzYWdlTm90ZXNUZXh0PVZlcndlbmR1bmdzaGlud2Vpc2UNCi1jb250ZXh0VGV4dD1Lb250ZXh0DQotcGFyZW50QWN0aXZpdGllc1RleHQ9XHUwMGRjYmVyZ2VvcmRuZXRlIEFrdGl2aXRcdTAwZTR0ZW4NCi1pbmNsdWRlZFBhdHRlcm5zVGV4dD1FaW5nZXNjaGxvc3NlbmUgTXVzdGVyDQotY2hlY2tsaXN0VGV4dD1Qclx1MDBmY2ZsaXN0ZQ0KLWNvbW11bmljYXRpb25zTWF0ZXJpYWxzVGV4dD1Lb21tdW5pa2F0aW9uc21hdGVyaWFsDQotZWR1Y2F0aW9uTWF0ZXJpYWxzVGV4dD1MZXJubWF0ZXJpYWwNCi1lc3RpbWF0aW5nVGVjaG5pcXVlVGV4dD1TY2hcdTAwZTR0enZlcmZhaHJlbg0KLWFkZGl0aW9uYWxUZXh0PVp1c1x1MDBlNHR6bGljaGUgUm9sbGVuDQotbW9kaWZpZXNUZXh0PVx1MDBjNG5kZXJ1bmcNCi1hZGRpdGlvbmFsbHlQZXJmb3Jtc1RleHQ9WnVzXHUwMGU0dHpsaWNoZSBBdWZnYWJlbjoNCi1pbmRleFRleHQ9SW5kZXgNCi1wcmVmaXhUZXh0PVByXHUwMGU0Zml4DQotYnJlYWtkb3duRWxlbWVudFRleHQ9U3RydWt0dXJlbGVtZW50DQotc3RlcHNUZXh0PVNjaHJpdHRlDQotcHJlZGVjZXNzb3JzVGV4dD1Wb3JnXHUwMGU0bmdlcg0KLXJlcGVhdGFibGVUZXh0PVdpZWRlcmhvbHQgYW53ZW5kYmFyDQotdHlwZVRleHQ9VHlwDQotb25nb2luZ1RleHQ9Rm9ydGxhdWZlbmQNCi1ldmVudERyaXZlblRleHQ9RXJlaWduaXNnZXN0ZXVlcnQNCi1tb2RlbEluZm9UZXh0PU1vZGVsbGluZm8NCi1lbnRyeVN0YXRlVGV4dD1BbmZhbmdzenVzdGFuZA0KLWV4aXRTdGF0ZVRleHQ9RW5kenVzdGFuZA0KLXRlYW1UZXh0PVRlYW0NCi1wYXJlbnRQYWNrYWdlVGV4dD1cdTAwZGNiZXJnZW9yZG5ldGUgUGFrZXRlDQotY29udGFpbmVkUGFja2FnZXNUZXh0PUVudGhhbHRlbmUgUGFrZXRlDQotY29udGVudHNUZXh0PUluaGFsdA0KLWJhc2VkT25NZXRob2RSb2xlVGV4dD1CYXNpZXJ0IGF1ZiBNZXRob2RlbnJvbGxlDQotYmFzZWRPbk1ldGhvZFRhc2tUZXh0PUJhc2llcnQgYXVmIE1ldGhvZGVuYXVmZ2FiZQ0KLWJhc2VkT25NZXRob2RXb3JrUHJvZHVjdFRleHQ9QmFzaWVydCBhdWYgTWV0aG9kZW5hcmJlaXRzZXJnZWJuaXMNCi1zdW1tYXJ5VGV4dD1adXNhbW1lbmZhc3N1bmcNCi1wZXJmb3Jtc1RleHQ9QXVzZlx1MDBmY2hydW5nDQotcmVwbGFjZXNUZXh0PUVyc2V0enVuZw0KLWNvbnRyaWJ1dGVzVGV4dD1CZWl0cmFnDQotbm9uZVRleHQ9T2huZQ0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc1RleHQ9SGlud2Vpc2UgenVtIFNjaFx1MDBlNHR6ZW4NCi1hY3Rpdml0eVJlZmVyZW5jZXNUZXh0PUFrdGl2aXRcdTAwZTR0c3JlZmVyZW56ZW4NCi1uYW1lVGV4dD1OYW1lDQotcHJlc2VudGF0aW9uTmFtZVRleHQ9UHJcdTAwZTRzZW50YXRpb25zbmFtZQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQveHNsL3Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZDcxZWJhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBUaGUgVUkgdGV4dCBpbiB0aGUgWFNMIHN0eWxlc2hlZXRzLg0KLQ0KLWFkZGl0aW9uYWxJbmZvVGV4dD1JbmZvcm1hY2lcdTAwZjNuIGFkaWNpb25hbA0KLWFkZGl0aW9uYWxQZXJmb3JtZXJUZXh0PU90cmFzIGFjdGl2aWRhZGVzIGFkaWNpb25hbGVzIHF1ZSByZWFsaXphDQotYWdncmVnYXRlc1RleHQ9QVx1MDBmMWFkZQ0KLWFsdGVybmF0aXZlc1RleHQ9QWx0ZXJuYXRpdmFzDQotYXBwbGljYXRpb25UZXh0PUFwbGljYWNpXHUwMGYzbg0KLWFydGlmYWN0VGV4dD1BcnRlZmFjdG8NCi1hc3NldHNUZXh0PUFjdGl2b3MNCi1hc3NpZ25tZW50QXBwcm9hY2hlc1RleHQ9UHJvcHVlc3RhcyBkZSBhc2lnbmFjaVx1MDBmM24NCi1hc3Npc3RpbmdUZXh0PUFzaXN0ZW5jaWENCi1iYWNrZ3JvdW5kVGV4dD1Gb25kbw0KLWJyaWVmT3V0bGluZVRleHQ9RXNxdWVtYXRpemFjaVx1MDBmM24gYnJldmUNCi1jaGVja0l0ZW1zVGV4dD1FbGVtZW50b3MgZGUgY29tcHJvYmFjaVx1MDBmM24NCi1jaGVja2xpc3RzVGV4dD1MaXN0YXMgZGUgY29tcHJvYmFjaVx1MDBmM24NCi1jb2xsYXBzZUFsbFRleHQ9Q29udHJhZXIgdG9kb3MgbG9zIGVsZW1lbnRvcyBkZSBjb21wcm9iYWNpXHUwMGYzbg0KLWNvbXBvc2l0ZVJvbGVUZXh0PVJvbCBjb21wdWVzdG8NCi1jb25jZXB0c1RleHQ9Q29uY2VwdG9zDQotY29udGFpbmVkQXJ0aWZhY3RzVGV4dD1BcnRlZmFjdG9zIGNvbnRlbmlkb3MNCi1jb250YWluZXJBcnRpZmFjdFRleHQ9QXJ0ZWZhY3RvIGRlbCBjb250ZW5lZG9yDQotY29udGVudEVsZW1lbnRzVGV4dD1FbGVtZW50b3MgY2F0ZWdvcml6YWRvcw0KLWNvbnRlbnRSZWZlcmVuY2VzVGV4dD1SZWZlcmVuY2lhcyBkZSBjb250ZW5pZG8NCi1kZWxpdmVyYWJsZVRleHQ9UHJvZHVjdG8gZmluYWwNCi1kZWxpdmVyYWJsZVByb3BlcnRpZXNUZXh0PVByb3BpZWRhZGVzIGRlIHByb2R1Y3RvIGZpbmFsDQotZGVsaXZlcmVkUGFydHNUZXh0PUNvbXBvbmVudGVzIGRlIHByb2R1Y3RvIGZpbmFsDQotZGVsaXZlcmVkV29ya1Byb2R1Y3RzVGV4dD1Qcm9kdWN0b3MgZGUgdHJhYmFqbyBlbnRyZWdhZG9zDQotZGVwZW5kZW50VGV4dD1Qcm9kdWN0b3MgZGUgdHJhYmFqbyBkZXBlbmRpZW50ZXMNCi1kZXNjcmlwdGlvblRleHQ9RGVzY3JpcGNpXHUwMGYzbg0KLWRpc2NpcGxpbmVUZXh0PURpc2NpcGxpbmENCi1kaXNjaXBsaW5lc1RleHQ9RGlzY2lwbGluYXMNCi1zdWJkaXNjaXBsaW5lc1RleHQ9U3ViZGlzY2lwbGluYXMNCi1kb21haW5UZXh0PURvbWluaW8NCi1kb21haW5zVGV4dD1Eb21pbmlvcw0KLWV4YW1wbGVzVGV4dD1FamVtcGxvcw0KLWV4cGFuZEFsbFRleHQ9RXhwYW5kaXIgdG9kb3MgbG9zIGVsZW1lbnRvcyBkZSBjb21wcm9iYWNpXHUwMGYzbg0KLWV4dGVuZHNUZXh0PUFtcGxcdTAwZWRhDQotZXh0ZXJuYWxUZXh0PUV4dGVybmENCi1leHRlcm5hbERlc2NyaXB0aW9uVGV4dD1EZXNjcmlwY2lcdTAwZjNuIGV4dGVybmENCi1nb2Fsc1RleHQ9T2JqZXRpdm9zDQotZ3VpZGVsaW5lc1RleHQ9RGlyZWN0cmljZXMNCi1pbGx1c3RyYXRpb25zVGV4dD1JbHVzdHJhY2lvbmVzCQ0KLWltcGFjdE9mTm90SGF2aW5nVGV4dD1JbXBhY3RvIGRlIG5vIHRlbmVyDQotaW1wYWN0aW5nVGV4dD1Qcm9kdWN0b3MgZGUgdHJhYmFqbyBhZmVjdGFkb3MNCi1pbnB1dHNUZXh0PUVudHJhZGFzDQotaW5wdXRUb1RleHQ9RW50cmFkYSBhDQotaXRlbXNUZXh0PUVsZW1lbnRvcw0KLWtleUNvbnNpZGVyYXRpb25zVGV4dD1GYWN0b3JlcyBjbGF2ZQ0KLWxldmVsc09mQWRvcHRpb25UZXh0PU5pdmVsZXMgZGUgYWRvcGNpXHUwMGYzbg0KLW1hbmRhdG9yeVRleHQ9T2JsaWdhdG9yaWENCi1tYWluVGV4dD1QcmluY2lwYWwNCi1tYWluRGVzY3JpcHRpb25UZXh0PURlc2NyaXBjaVx1MDBmM24gcHJpbmNpcGFsDQotbWFpblJlc3BvbnNpYmxlVGV4dD1SZXNwb25zYWJsZSBwcmluY2lwYWwNCi1tZXRob2RUZXh0PVByb2R1Y3RvIGRlIHRyYWJham8gZGUgbVx1MDBlOXRvZG8NCi1tb2RpZmllZEJ5VGV4dD1Nb2RpZmljYWRvIHBvcg0KLW1vcmVJbmZvVGV4dD1NXHUwMGUxcyBpbmZvcm1hY2lcdTAwZjNuDQotbm90YXRpb25UZXh0PU5vdGFjaVx1MDBmM24NCi1vcHRpb25hbFRleHQ9T3BjaW9uYWwNCi1vdXRjb21lVGV4dD1SZXN1bHRhZG8NCi1vdXRwdXRGcm9tVGV4dD1TYWxpZGEgZGUNCi1vdXRwdXRzVGV4dD1TYWxpZGFzDQotcGFja2FnaW5nSW5zdHJ1Y3Rpb25zVGV4dD1JbnN0cnVjY2lvbmVzIGRlIGVtcGFxdWV0YWRvDQotcGFja2FnaW5nR3VpZGFuY2VUZXh0PUd1XHUwMGVkYSBkZSBlbXBhcXVldGFkbw0KLXBlcmZvcm1pbmdSb2xlc1RleHQ9Um9sZXMgZGUgcmVhbGl6YWNpXHUwMGYzbg0KLXByaW1hcnlQZXJmb3JtZXJUZXh0PVJlYWxpemFkb3IgcHJpbmNpcGFsDQotcHJvYmxlbVRleHQ9UHJvYmxlbWENCi1wcm9wZXJ0aWVzVGV4dD1Qcm9waWVkYWRlcw0KLXB1cnBvc2VUZXh0PU9iamV0aXZvDQotcmVhc29uc0Zvck5vdE5lZWRpbmdUZXh0PVJhem9uZXMgcGFyYSBubyBuZWNlc2l0YXINCi1yZWZlcmVuY2VXb3JrZmxvd3NUZXh0PUZsdWpvcyBkZSB0cmFiYWpvIGRlIHJlZmVyZW5jaWENCi1yZWxhdGVkRWxlbWVudHNUZXh0PUVsZW1lbnRvcyByZWxhY2lvbmFkb3MNCi1yZWxhdGlvbnNoaXBzVGV4dD1SZWxhY2lvbmVzDQotcmVwb3J0c1RleHQ9SW5mb3JtZXMNCi1yZXByZXNlbnRhdGlvbk9wdGlvbnNUZXh0PU9wY2lvbmVzIGRlIHJlcHJlc2VudGFjaVx1MDBmM24NCi1yZXNwb25zaWJsZVRleHQ9UmVzcG9uc2FibGUNCi1yZXNwb25zaWJsZUZvclRleHQ9UmVzcG9uc2FibGUgZGUNCi1yZXVzYWJsZUFzc2V0c1RleHQ9QWN0aXZvcyByZXV0aWxpemFibGVzDQotcm9sZVRleHQ9Um9sDQotcm9sZXNUZXh0PVJvbGVzDQotcm9sZVNldHNUZXh0PUNvbmp1bnRvcyBkZSByb2xlcw0KLXNraWxsc1RleHQ9SGFiaWxpZGFkZXMNCi1zdGFmZmluZ1RleHQ9UGVyc29uYWwNCi1zdGVwc1RleHQ9UGFzb3MNCi1zdWJjYXRlZ29yaWVzVGV4dD1TdWJjYXRlZ29yXHUwMGVkYXMNCi1zdWJkb21haW5zVGV4dD1TdWJkb21pbmlvcw0KLXN1YlByYWN0aWNlc1RleHQ9U3VicHJcdTAwZTFjdGljYXMNCi1zdXBlclRlYW1UZXh0PVBlcmZpbCBkZSBzdXBlcmVxdWlwbw0KLXN1cHBvcnRpbmdNYXRlcmlhbHNUZXh0PU1hdGVyaWFsZXMgZGUgc29wb3J0ZQ0KLXN1YnRlYW1zVGV4dD1QZXJmaWxlcyBkZSBzdWJlcXVpcG9zDQotc3lub255bXNUZXh0PVNpblx1MDBmM25pbW9zDQotdGFpbG9yaW5nVGV4dD1QZXJzb25hbGl6YWNpXHUwMGYzbg0KLXRhc2tUZXh0PVRhcmVhDQotdGFza3NUZXh0PVRhcmVhcw0KLXRic1RleHQ9QXNpZ25hY2lcdTAwZjNuIGRlIGVxdWlwb3MNCi10ZWFtUHJvZmlsZVRleHQ9UGVyZmlsIGRlbCBlcXVpcG8NCi10ZWFtUm9sZXNUZXh0PVJvbGVzIGRlbCBwZXJmaWwgZGVsIGVxdWlwbw0KLXRlY2huaXF1ZXNUZXh0PURpcmVjdHJpY2VzDQotdGVtcGxhdGVGaWxlc1RleHQ9QXJjaGl2b3MgZGUgcGxhbnRpbGxhDQotdGVtcGxhdGVzVGV4dD1QbGFudGlsbGFzDQotdG9vbE1lbnRvcnNUZXh0PUd1XHUwMGVkYXMgZGUgbGEgaGVycmFtaWVudGENCi10b29sVGV4dD1IZXJyYW1pZW50YQ0KLXVzYWdlVGV4dD1VdGlsaXphY2lcdTAwZjNuDQotd2JzVGV4dD1Fc3RydWN0dXJhIGRlIGRlc2dsb3NlIGRlIHRyYWJham8NCi13aGl0ZXBhcGVyc1RleHQ9RG9jdW1lbnRhY2lcdTAwZjNuDQotd29ya1Byb2R1Y3RzVGV4dD1Qcm9kdWN0b3MgZGUgdHJhYmFqbw0KLXdvcmtQcm9kdWN0VHlwZXNUZXh0PUNsYXNlcyBkZSBwcm9kdWN0byBkZSB0cmFiYWpvDQotd3Bic1RleHQ9VXRpbGl6YWNpXHUwMGYzbiBkZWwgcHJvZHVjdG8gZGUgdHJhYmFqbw0KLXdvcmtCcmVha2Rvd25UZXh0PUFub21hbFx1MDBlZGEgZGVsIHRyYWJham8NCi13b3JrZmxvd1RleHQ9Rmx1am8gZGUgdHJhYmFqbw0KLXdvcmtQcm9kdWN0QnJlYWtkb3duVGV4dD1Bbm9tYWxcdTAwZWRhIGRlbCBwcm9kdWN0byBkZSB0cmFiYWpvDQotd29ya1Byb2R1Y3REZXBlbmRlbmNpZXNUZXh0PURlcGVuZGVuY2lhcyBkZWwgcHJvZHVjdG8gZGUgdHJhYmFqbw0KLXRlYW1Qcm9maWxlQnJlYWtkb3duVGV4dD1Bbm9tYWxcdTAwZWRhIGRlbCBlcXVpcG8NCi10ZWFtU3RydWN0dXJlVGV4dD1Fc3RydWN0dXJhIGRlbCBlcXVpcG8NCi1wYWdlTm90SW5zdGFsbGVkVGV4dD1QXHUwMGUxZ2luYSBubyBpbnN0YWxhZGENCi1lbGVtZW50RG9lc05vdEV4aXN0VGV4dD1FbCBlbGVtZW50byBubyBleGlzdGUNCi1pc05vdFZhbGlkVGV4dD1FbCBlbGVtZW50byBhbCBxdWUgc2UgaGEgaGVjaG8gcmVmZXJlbmNpYSBubyBlcyB1biBlbGVtZW50byB2XHUwMGUxbGlkbyBkZSBsYSBiaWJsaW90ZWNhIGFjdHVhbC4NCi1lbGVtZW50TWlnaHRCZURlbGV0ZWRUZXh0PUVzIHBvc2libGUgcXVlIGVsIGVsZW1lbnRvIHNlIGhheWEgc3VwcmltaWRvIGRlIGxhIGJpYmxpb3RlY2EuDQotcGxlYXNlRml4TGlua1RleHQ9Q29tcHJ1ZWJlIGVsIGNvbnRlbmlkbyBkZSBsYSBiaWJsaW90ZWNhIHkgYXJyZWdsZSBlbCBlbmxhY2UuDQotaW5mb0Fib3V0TWlzc2luZ0VsZW1lbnRUZXh0PUluZm9ybWFjaVx1MDBmM24gc29icmUgZWwgZWxlbWVudG8gcXVlIGZhbHRhOg0KLWVsZW1lbnROYW1lVGV4dD1Ob21icmUgZGVsIGVsZW1lbnRvDQotZ3VpZFRleHQ9R1VJRDoNCi1taXNzaW5nRWxlbWVudFRleHQ9TGEgcFx1MDBlMWdpbmEgYSBsYSBxdWUgc2UgaGEgaGVjaG8gcmVmZXJlbmNpYSBubyBzZSBlbmN1ZW50cmEgZW4gZXN0YSBjb25maWd1cmFjaVx1MDBmM24NCi1ub3RBdmFpbGFibGVUZXh0PUxhIHBcdTAwZTFnaW5hIGEgbGEgcXVlIHNlIGhhIGhlY2hvIHJlZmVyZW5jaWEgbm8gc2UgZW5jdWVudHJhIGVuIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBhY3R1YWwuIEVzIHBvc2libGUgcXVlIGVzdGEgcFx1MDBlMWdpbmEgZXN0XHUwMGU5IGVuIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBvdHJvIHByb2Nlc28uDQotZWxlbWVudFR5cGVUZXh0PVRpcG8gZGUgZWxlbWVudG86DQotcGx1Z2luTmFtZVRleHQ9Tm9tYnJlIGRlbCBwbHVnLWluOg0KLXByZWRlY2Vzc29yVGV4dD1QcmVkZWNlc29yDQotcGxhbm5pbmdEYXRhVGV4dD1EYXRvcyBkZSBwbGFuaWZpY2FjaVx1MDBmM24NCi1tdWx0aXBsZU9jY3VycmVuY2VzVGV4dD1WYXJpYXMgYXBhcmljaW9uZXMNCi1ldmVudERyaXZlblRleHQ9Q29uZGljaW9uYWRvIHBvciBzdWNlc29zDQotb25nb2luZ1RleHQ9Q29udGludW8NCi1wbGFubmVkVGV4dD1QbGFuZWFkbw0KLXJlcGVhdGFibGVUZXh0PVNlIHB1ZWRlIHJlcGV0aXINCi11c2FnZUd1aWRhbmNlVGV4dD1HdVx1MDBlZGEgZGUgdXRpbGl6YWNpXHUwMGYzbg0KLWlucHV0c1RleHQ9RW50cmFkYXMNCi1vdXRwdXRzVGV4dD1TYWxpZGFzDQotYWN0aXZpdHlFbnRyeVN0YXRlVGV4dD1Fc3RhZG8gZGUgZW50cmFkYSBkZSBhY3RpdmlkYWQNCi1hY3Rpdml0eUV4aXRTdGF0ZVRleHQ9RXN0YWRvIGRlIHNhbGlkYSBkZSBhY3RpdmlkYWQNCi1wcmVmaXhUZXh0PVByZWZpam8NCi1leHRlcm5hbElkVGV4dD1JRCBleHRlcm5vDQotc2NvcGVUZXh0PVx1MDBjMW1iaXRvDQotcm9hZG1hcFRleHQ9TWFwYQ0KLXR5cGVvZkNvbnRyYWN0VGV4dD1UaXBvIGRlIGNvbnRyYXRvDQotcHJvamVjdENoYXJhY3RlcmlzdGljc1RleHQ9Q2FyYWN0ZXJcdTAwZWRzdGljYXMgZGVsIHByb3llY3RvDQotcHJvamVjdE1lbWJlckV4cGVydGlzZVRleHQ9RXNwZWNpYWxpZGFkIGRlIG1pZW1icm8gZGVsIHByb3llY3RvDQotcmlza0xldmVsVGV4dD1OaXZlbCBkZSByaWVzZ28NCi1zY2FsZVRleHQ9RXNjYWxhDQotdXNhZ2VOb3Rlc1RleHQ9Tm90YXMgZGUgdXRpbGl6YWNpXHUwMGYzbg0KLWNvbnRleHRUZXh0PUNvbnRleHRvDQotcGFyZW50QWN0aXZpdGllc1RleHQ9QWN0aXZpZGFkZXMgcHJpbmNpcGFsZXMNCi1pbmNsdWRlZFBhdHRlcm5zVGV4dD1QYXRyb25lcyBpbmNsdWlkb3MNCi1jaGVja2xpc3RUZXh0PUxpc3RhIGRlIGNvbXByb2JhY2lcdTAwZjNuDQotY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNUZXh0PU1hdGVyaWFsZXMgZGUgY29tdW5pY2FjaVx1MDBmM24NCi1lZHVjYXRpb25NYXRlcmlhbHNUZXh0PU1hdGVyaWFsZXMgZGUgZm9ybWFjaVx1MDBmM24NCi1lc3RpbWF0aW5nVGVjaG5pcXVlVGV4dD1UXHUwMGU5Y25pY2EgZGUgY1x1MDBlMWxjdWxvDQotYWRkaXRpb25hbFRleHQ9QWRpY2lvbmFsDQotbW9kaWZpZXNUZXh0PU1vZGlmaWNhDQotYWRkaXRpb25hbGx5UGVyZm9ybXNUZXh0PUFkaWNpb25hbG1lbnRlIHJlYWxpemENCi1pbmRleFRleHQ9XHUwMGNkbmRpY2UNCi1wcmVmaXhUZXh0PVByZWZpam8NCi1icmVha2Rvd25FbGVtZW50VGV4dD1FbGVtZW50byBkZSBkZXNnbG9zZQ0KLXN0ZXBzVGV4dD1QYXNvcw0KLXByZWRlY2Vzc29yc1RleHQ9UHJlZGVjZXNvcmVzDQotcmVwZWF0YWJsZVRleHQ9U2UgcHVlZGUgcmVwZXRpcg0KLXR5cGVUZXh0PVRpcG8NCi1vbmdvaW5nVGV4dD1Db250aW51bw0KLWV2ZW50RHJpdmVuVGV4dD1Db25kaWNpb25hZG8gcG9yIHN1Y2Vzb3MNCi1tb2RlbEluZm9UZXh0PUluZm9ybWFjaVx1MDBmM24gZGVsIG1vZGVsbw0KLWVudHJ5U3RhdGVUZXh0PUVzdGFkbyBkZSBlbnRyYWRhDQotZXhpdFN0YXRlVGV4dD1Fc3RhZG8gZGUgc2FsaWRhDQotdGVhbVRleHQ9RXF1aXBvDQotcGFyZW50UGFja2FnZVRleHQ9UGFxdWV0ZSBwYWRyZQ0KLWNvbnRhaW5lZFBhY2thZ2VzVGV4dD1QYXF1ZXRlcyBjb250ZW5pZG9zDQotY29udGVudHNUZXh0PUNvbnRlbmlkbw0KLWJhc2VkT25NZXRob2RSb2xlVGV4dD1CYXNhZG8gZW4gZWwgcm9sIGRlIG1cdTAwZTl0b2RvDQotYmFzZWRPbk1ldGhvZFRhc2tUZXh0PUJhc2FkbyBlbiBsYSB0YXJlYSBkZSBtXHUwMGU5dG9kbw0KLWJhc2VkT25NZXRob2RXb3JrUHJvZHVjdFRleHQ9QmFzYWRvIGVuIGVsIHByb2R1Y3RvIGRlIHRyYWJham8gZGUgbVx1MDBlOXRvZG8NCi1zdW1tYXJ5VGV4dD1SZXN1bWVuDQotcGVyZm9ybXNUZXh0PVJlYWxpemENCi1yZXBsYWNlc1RleHQ9UmVlbXBsYXphDQotY29udHJpYnV0ZXNUZXh0PUNvbnRyaWJ1eWUNCi1ub25lVGV4dD1OaW5ndW5vDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zVGV4dD1Db25zaWRlcmFjaW9uZXMgc29icmUgZWwgY1x1MDBlMWxjdWxvDQotYWN0aXZpdHlSZWZlcmVuY2VzVGV4dD1SZWZlcmVuY2lhcyBkZSBhY3RpdmlkYWQNCi1uYW1lVGV4dD1Ob21icmUNCi1wcmVzZW50YXRpb25OYW1lVGV4dD1Ob21icmUgZGUgcHJlc2VudGFjaVx1MDBmM24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQveHNsL3Jlc291cmNlc19mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3hzbC9yZXNvdXJjZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU5MDVkYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQveHNsL3Jlc291cmNlc19mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMgVGhlIFVJIHRleHQgaW4gdGhlIFhTTCBzdHlsZXNoZWV0cy4NCi0NCi1hZGRpdGlvbmFsSW5mb1RleHQ9SW5mb3JtYXRpb24gY29tcGxcdTAwZTltZW50YWlyZXMNCi1hZGRpdGlvbmFsUGVyZm9ybWVyVGV4dD1FeFx1MDBlOWN1dGFudCBzdXBwbFx1MDBlOW1lbnRhaXJlcw0KLWFnZ3JlZ2F0ZXNUZXh0PUFnclx1MDBlOWdhdHMNCi1hbHRlcm5hdGl2ZXNUZXh0PUFsdGVybmF0aXZlcw0KLWFwcGxpY2F0aW9uVGV4dD1BcHBsaWNhdGlvbg0KLWFydGlmYWN0VGV4dD1BcnRlZmFjdA0KLWFzc2V0c1RleHQ9UmVzc291cmNlcw0KLWFzc2lnbm1lbnRBcHByb2FjaGVzVGV4dD1BcHByb2NoZXMgZCdhZmZlY3RhdGlvbg0KLWFzc2lzdGluZ1RleHQ9QXV4aWxpYWlyZQ0KLWJhY2tncm91bmRUZXh0PUFycmlcdTAwZThyZS1wbGFuDQotYnJpZWZPdXRsaW5lVGV4dD1CcmVmIGFwZXJcdTAwZTd1DQotY2hlY2tJdGVtc1RleHQ9RWxcdTAwZTltZW50cyBkZSB2XHUwMGU5cmlmaWNhdGlvbg0KLWNoZWNrbGlzdHNUZXh0PUxpc3RlcyBkZSBjb250clx1MDBmNGxlDQotY29sbGFwc2VBbGxUZXh0PUNvbmRlbnNlciB0b3VzIGxlcyBcdTAwZTlsXHUwMGU5bWVudHMgZGUgdlx1MDBlOXJpZmljYXRpb24NCi1jb21wb3NpdGVSb2xlVGV4dD1SXHUwMGY0bGUgY29tcG9zaXRlDQotY29uY2VwdHNUZXh0PUNvbmNlcHRzDQotY29udGFpbmVkQXJ0aWZhY3RzVGV4dD1BcnRlZmFjdHMgY29udGVudXMNCi1jb250YWluZXJBcnRpZmFjdFRleHQ9QXJ0ZWZhY3QgZGUgY29udGVuZXVyDQotY29udGVudEVsZW1lbnRzVGV4dD1FbFx1MDBlOW1lbnRzIGNhdFx1MDBlOWdvcmlzXHUwMGU5cw0KLWNvbnRlbnRSZWZlcmVuY2VzVGV4dD1SXHUwMGU5Zlx1MDBlOXJlbmNlcyBkZSBjb250ZW51DQotZGVsaXZlcmFibGVUZXh0PUxpdnJhYmxlDQotZGVsaXZlcmFibGVQcm9wZXJ0aWVzVGV4dD1Qcm9wcmlcdTAwZTl0XHUwMGU5cyBsaXZyYWJsZXMNCi1kZWxpdmVyZWRQYXJ0c1RleHQ9Q29tcG9zYW50cyBsaXZyYWJsZXMNCi1kZWxpdmVyZWRXb3JrUHJvZHVjdHNUZXh0PVByb2R1aXRzIGxpdnJcdTAwZTlzDQotZGVwZW5kZW50VGV4dD1Qcm9kdWl0cyBkXHUwMGU5cGVuZGFudHMNCi1kZXNjcmlwdGlvblRleHQ9RGVzY3JpcHRpb24NCi1kaXNjaXBsaW5lVGV4dD1EaXNjaXBsaW5lDQotZGlzY2lwbGluZXNUZXh0PURpc2NpcGxpbmVzDQotc3ViZGlzY2lwbGluZXNUZXh0PVNvdXMtZGlzY2lwbGluZXMNCi1kb21haW5UZXh0PURvbWFpbmUNCi1kb21haW5zVGV4dD1Eb21haW5lcw0KLWV4YW1wbGVzVGV4dD1FeGVtcGxlcw0KLWV4cGFuZEFsbFRleHQ9RFx1MDBlOXZlbG9wcGVyIHRvdXMgbGVzIFx1MDBlOWxcdTAwZTltZW50cyBkZSB2XHUwMGU5cmlmaWNhdGlvbg0KLWV4dGVuZHNUZXh0PUV0ZW5kDQotZXh0ZXJuYWxUZXh0PUV4dGVybmUNCi1leHRlcm5hbERlc2NyaXB0aW9uVGV4dD1EZXNjcmlwdGlvbiBleHRlcm5lDQotZ29hbHNUZXh0PU9iamVjdGlmcw0KLWd1aWRlbGluZXNUZXh0PUluc3RydWN0aW9ucw0KLWlsbHVzdHJhdGlvbnNUZXh0PUlsbHVzdHJhdGlvbnMJDQotaW1wYWN0T2ZOb3RIYXZpbmdUZXh0PUluY2lkZW5jZSBkdSBtYW5xdWUNCi1pbXBhY3RpbmdUZXh0PVByb2R1aXRzIGF5YW50IHVuZSBpbmNpZGVuY2UNCi1pbnB1dHNUZXh0PUVudHJcdTAwZTllcw0KLWlucHV0VG9UZXh0PUVudHJcdTAwZTllIHZlcnMNCi1pdGVtc1RleHQ9RWxcdTAwZTltZW50cw0KLWtleUNvbnNpZGVyYXRpb25zVGV4dD1Db25zaWRcdTAwZTlyYXRpb25zIGNsXHUwMGU5cw0KLWxldmVsc09mQWRvcHRpb25UZXh0PU5pdmVhdXggZCdhZG9wdGlvbg0KLW1hbmRhdG9yeVRleHQ9T2JsaWdhdG9pcmUNCi1tYWluVGV4dD1QcmluY2lwYWwNCi1tYWluRGVzY3JpcHRpb25UZXh0PURlc2NyaXB0aW9uIHByaW5jaXBhbGUNCi1tYWluUmVzcG9uc2libGVUZXh0PVByaW5jaXBhbCByZXNwb25zYWJsZQ0KLW1ldGhvZFRleHQ9UHJvZHVpdCBkZSBtXHUwMGU5dGhvZGUNCi1tb2RpZmllZEJ5VGV4dD1Nb2RpZmlcdTAwZTkgcGFyDQotbW9yZUluZm9UZXh0PVBsdXMgZCdpbmZvcm1hdGlvbnMNCi1ub3RhdGlvblRleHQ9Tm90YXRpb24NCi1vcHRpb25hbFRleHQ9RmFjdWx0YXRpZg0KLW91dGNvbWVUZXh0PVNvcnRpZQ0KLW91dHB1dEZyb21UZXh0PVNvcnRpZSBkZQ0KLW91dHB1dHNUZXh0PVNvcnRpZXMNCi1wYWNrYWdpbmdJbnN0cnVjdGlvbnNUZXh0PUluc3RydWN0aW9ucyBkZSBtaXNlIGVuIGZvcm1lDQotcGFja2FnaW5nR3VpZGFuY2VUZXh0PUNvbnNlaWwgZGUgbWlzZSBlbiBmb3JtZQ0KLXBlcmZvcm1pbmdSb2xlc1RleHQ9RXhcdTAwZTljdXRpb24gZGVzIHJcdTAwZjRsZXMNCi1wcmltYXJ5UGVyZm9ybWVyVGV4dD1FeFx1MDBlOWN1dGFudCBwcmluY2lwYWwNCi1wcm9ibGVtVGV4dD1Qcm9ibFx1MDBlOG1lDQotcHJvcGVydGllc1RleHQ9UHJvcHJpXHUwMGU5dFx1MDBlOXMNCi1wdXJwb3NlVGV4dD1PYmpldA0KLXJlYXNvbnNGb3JOb3ROZWVkaW5nVGV4dD1DYXVzZXMganVzdGlmaWFudCBsZSBtYW5xdWUgZGUgblx1MDBlOWNlc3NpdFx1MDBlOQ0KLXJlZmVyZW5jZVdvcmtmbG93c1RleHQ9RW5jaGFcdTAwZWVuZW1lbnRzIGQnYWN0aXZpdFx1MDBlOXMgZGUgclx1MDBlOWZcdTAwZTlyZW5jZQ0KLXJlbGF0ZWRFbGVtZW50c1RleHQ9RWxcdTAwZTltZW50cyBjb25uZXhlcw0KLXJlbGF0aW9uc2hpcHNUZXh0PVJlbGF0aW9ucw0KLXJlcG9ydHNUZXh0PVJhcHBvcnRzDQotcmVwcmVzZW50YXRpb25PcHRpb25zVGV4dD1PcHRpb25zIGRlIHJlcHJcdTAwZTlzZW50YXRpb24NCi1yZXNwb25zaWJsZVRleHQ9UmVzcG9uc2FibGUNCi1yZXNwb25zaWJsZUZvclRleHQ9UmVzcG9uc2FibGUgZGUNCi1yZXVzYWJsZUFzc2V0c1RleHQ9UmVzc291cmNlcyByXHUwMGU5dXRpbGlzYWJsZXMNCi1yb2xlVGV4dD1SXHUwMGY0bGUNCi1yb2xlc1RleHQ9Ulx1MDBmNGxlcw0KLXJvbGVTZXRzVGV4dD1FbnNlbWJsZXMgZGUgclx1MDBmNGxlcw0KLXNraWxsc1RleHQ9Q29tcFx1MDBlOXRlbmNlcw0KLXN0YWZmaW5nVGV4dD1BZmZlY3RhdGlvbiBkdSBwZXJzb25uZWwNCi1zdGVwc1RleHQ9RXRhcGVzDQotc3ViY2F0ZWdvcmllc1RleHQ9U291cy1jYXRcdTAwZTlnb3JpZXMJDQotc3ViZG9tYWluc1RleHQ9U291cy1kb21haW5lcw0KLXN1YlByYWN0aWNlc1RleHQ9U291cy1wcmF0aXF1ZXMNCi1zdXBlclRlYW1UZXh0PVByb2ZpbCBkZSBzdXBlciBcdTAwZTlxdWlwZQ0KLXN1cHBvcnRpbmdNYXRlcmlhbHNUZXh0PURvY3VtZW50cyBkJ2FjY29tcGFnbmVtZW50DQotc3VidGVhbXNUZXh0PVByb2ZpbHMgZGVzIHNvdXMtXHUwMGU5cXVpcGVzDQotc3lub255bXNUZXh0PVN5bm9ueW1lcw0KLXRhaWxvcmluZ1RleHQ9UGVyc29ubmFsaXNhdGlvbg0KLXRhc2tUZXh0PVRcdTAwZTJjaGUNCi10YXNrc1RleHQ9VFx1MDBlMmNoZXMNCi10YnNUZXh0PUFmZmVjdGF0aW9uIGRlIGwnXHUwMGU5cXVpcGUNCi10ZWFtUHJvZmlsZVRleHQ9UHJvZmlsIGRlIGwnXHUwMGU5cXVpcGUNCi10ZWFtUm9sZXNUZXh0PVJcdTAwZjRsZXMgZHUgcHJvZmlsIGRlIGwnXHUwMGU5cXVpcGUNCi10ZWNobmlxdWVzVGV4dD1JbnN0cnVjdGlvbnMNCi10ZW1wbGF0ZUZpbGVzVGV4dD1GaWNoaWVycyBtb2RcdTAwZThsZXMNCi10ZW1wbGF0ZXNUZXh0PUNhbmV2YXMNCi10b29sTWVudG9yc1RleHQ9R3VpZGVzIGQndXRpbGlzYXRpb24gZGUgbCdvdXRpbA0KLXRvb2xUZXh0PU91dGlsDQotdXNhZ2VUZXh0PVV0aWxpc2F0aW9uDQotd2JzVGV4dD1TdHJ1Y3R1cmUgZGUgclx1MDBlOXBhcnRpdGlvbiBkdSB0cmF2YWlsDQotd2hpdGVwYXBlcnNUZXh0PUxpdnJlcyBibGFuY3MNCi13b3JrUHJvZHVjdHNUZXh0PVByb2R1aXRzDQotd29ya1Byb2R1Y3RUeXBlc1RleHQ9VHlwZXMgZGUgcHJvZHVpdHMNCi13cGJzVGV4dD1VdGlsaXNhdGlvbiBkdSBwcm9kdWl0DQotd29ya0JyZWFrZG93blRleHQ9Ulx1MDBlOXBhcnRpdGlvbiBkdSB0cmF2YWlsDQotd29ya2Zsb3dUZXh0PUVuY2hhXHUwMGVlbmVtZW50IGQnYWN0aXZpdFx1MDBlOXMNCi13b3JrUHJvZHVjdEJyZWFrZG93blRleHQ9Ulx1MDBlOXBhcnRpdGlvbiBkZXMgcHJvZHVpdHMNCi13b3JrUHJvZHVjdERlcGVuZGVuY2llc1RleHQ9RFx1MDBlOXBlbmRhbmNlcyBkZXMgcHJvZHVpdHMNCi10ZWFtUHJvZmlsZUJyZWFrZG93blRleHQ9Ulx1MDBlOXBhcnRpdGlvbiBkZSBsJ1x1MDBlOXF1aXBlDQotdGVhbVN0cnVjdHVyZVRleHQ9U3RydWN0dXJlIGRlIGwnXHUwMGU5cXVpcGUNCi1wYWdlTm90SW5zdGFsbGVkVGV4dD1QYWdlIG5vbiBpbnN0YWxsXHUwMGU5ZQ0KLWVsZW1lbnREb2VzTm90RXhpc3RUZXh0PUNldCBcdTAwZTlsXHUwMGU5bWVudCBuJ2V4aXN0ZSBwYXMNCi1pc05vdFZhbGlkVGV4dD1MJ1x1MDBlOWxcdTAwZTltZW50IHJcdTAwZTlmXHUwMGU5cmVuY1x1MDBlOSBuJ2VzdCBwYXMgdW4gXHUwMGU5bFx1MDBlOW1lbnQgdmFsaWRlIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGVuIGNvdXJzLg0KLWVsZW1lbnRNaWdodEJlRGVsZXRlZFRleHQ9Q2V0IFx1MDBlOWxcdTAwZTltZW50IHBldXQgYXZvaXIgXHUwMGU5dFx1MDBlOSBzdXBwcmltXHUwMGU5IGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlLg0KLXBsZWFzZUZpeExpbmtUZXh0PVZcdTAwZTlyaWZpZXogdm90cmUgYmlibGlvdGhcdTAwZThxdWUgZGUgY29udGVudSBldCBjb3JyaWdleiBsZSBsaWVuLg0KLWluZm9BYm91dE1pc3NpbmdFbGVtZW50VGV4dD1JbmZvcm1hdGlvbnMgcmVsYXRpdmVzIFx1MDBlMCBsJ1x1MDBlOWxcdTAwZTltZW50IG1hbnF1YW50IDoNCi1lbGVtZW50TmFtZVRleHQ9Tm9tIGRlIGwnXHUwMGU5bFx1MDBlOW1lbnQgOg0KLWd1aWRUZXh0PUlkZW50aWZpY2F0ZXVyIGdsb2JhbCB1bmlxdWUgOg0KLW1pc3NpbmdFbGVtZW50VGV4dD1MYSBwYWdlIHJcdTAwZTlmXHUwMGU5cmVuY1x1MDBlOWUgbmUgZmlndXJlIHBhcyBkYW5zIGNldHRlIGNvbmZpZ3VyYXRpb24NCi1ub3RBdmFpbGFibGVUZXh0PUxhIHBhZ2Ugclx1MDBlOWZcdTAwZTlyZW5jXHUwMGU5ZSBuJ2VzdCBwYXMgZGlzcG9uaWJsZSBkYW5zIGxhIGNvbmZpZ3VyYXRpb24gZW4gY291cnMuIENldHRlIHBhZ2UgZXN0IHBldXQtXHUwMGVhdHJlIGRpc3BvbmlibGUgZGFucyB1bmUgYXV0cmUgY29uZmlndXJhdGlvbiBkZSBwcm9jZXNzdXMuDQotZWxlbWVudFR5cGVUZXh0PVR5cGUgZCdcdTAwZTlsXHUwMGU5bWVudCA6DQotcGx1Z2luTmFtZVRleHQ9Tm9tIGRlIHBsdWctaW4gOg0KLXByZWRlY2Vzc29yVGV4dD1Qclx1MDBlOWRcdTAwZTljZXNzZXVyDQotcGxhbm5pbmdEYXRhVGV4dD1Eb25uXHUwMGU5ZXMgZGUgcGxhbmlmaWNhdGlvbg0KLW11bHRpcGxlT2NjdXJyZW5jZXNUZXh0PVBsdXNpZXVycyBvY2N1cnJlbmNlcw0KLWV2ZW50RHJpdmVuVGV4dD1Db21tYW5kXHUwMGU5IHBhciBsZXMgXHUwMGU5dlx1MDBlOW5lbWVudHMNCi1vbmdvaW5nVGV4dD1FbiBjb3Vycw0KLXBsYW5uZWRUZXh0PVBsYW5pZmlcdTAwZTkNCi1yZXBlYXRhYmxlVGV4dD1SXHUwMGU5aXRcdTAwZTlyYWJsZQ0KLXVzYWdlR3VpZGFuY2VUZXh0PUNvbnNlaWxzIGQndXRpbGlzYXRpb24NCi1pbnB1dHNUZXh0PUVudHJcdTAwZTllcw0KLW91dHB1dHNUZXh0PVNvcnRpZXMNCi1hY3Rpdml0eUVudHJ5U3RhdGVUZXh0PUV0YXQgZCdlbnRyXHUwMGU5ZSBkJ2FjdGl2aXRcdTAwZTkNCi1hY3Rpdml0eUV4aXRTdGF0ZVRleHQ9RXRhdCBkZSBzb3J0aWUgZCdhY3Rpdml0XHUwMGU5DQotcHJlZml4VGV4dD1Qclx1MDBlOWZpeGUNCi1leHRlcm5hbElkVGV4dD1JZGVudGlmaWNhdGV1ciBleHRlcm5lDQotc2NvcGVUZXh0PVBvcnRcdTAwZTllDQotcm9hZG1hcFRleHQ9RmV1aWxsZSBkZSByb3V0ZQ0KLXR5cGVvZkNvbnRyYWN0VGV4dD1UeXBlIGRlIGNvbnRyYXQNCi1wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzVGV4dD1DYXJhY3RcdTAwZTlyaXN0aXF1ZXMgZGUgcHJvamV0DQotcHJvamVjdE1lbWJlckV4cGVydGlzZVRleHQ9RXhwZXJ0aXNlIGR1IG1lbWJyZSBkZSBwcm9qZXQNCi1yaXNrTGV2ZWxUZXh0PU5pdmVhdSBkZSByaXNxdWUNCi1zY2FsZVRleHQ9RWNoZWxsZQ0KLXVzYWdlTm90ZXNUZXh0PU5vdGVzIGQndXRpbGlzYXRpb24NCi1jb250ZXh0VGV4dD1Db250ZXh0ZQ0KLXBhcmVudEFjdGl2aXRpZXNUZXh0PUFjdGl2aXRcdTAwZTlzIHBhcmVudGVzDQotaW5jbHVkZWRQYXR0ZXJuc1RleHQ9UGF0dGVybnMgaW5jbHVzDQotY2hlY2tsaXN0VGV4dD1MaXN0ZSBkZSBjb250clx1MDBmNGxlDQotY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNUZXh0PVN1cHBvcnRzIGRlIGNvbW11bmljYXRpb24NCi1lZHVjYXRpb25NYXRlcmlhbHNUZXh0PURvY3VtZW50cyBkZSBmb3JtYXRpb24NCi1lc3RpbWF0aW5nVGVjaG5pcXVlVGV4dD1UZWNobmlxdWUgZCdlc3RpbWF0aW9uDQotYWRkaXRpb25hbFRleHQ9Q29tcGxcdTAwZTltZW50YWlyZQ0KLW1vZGlmaWVzVGV4dD1Nb2RpZmllDQotYWRkaXRpb25hbGx5UGVyZm9ybXNUZXh0PUVmZmVjdHVlIFx1MDBlOWdhbGVtZW50DQotaW5kZXhUZXh0PUluZGV4DQotcHJlZml4VGV4dD1Qclx1MDBlOWZpeGUNCi1icmVha2Rvd25FbGVtZW50VGV4dD1FbFx1MDBlOW1lbnQgZGUgclx1MDBlOXBhcnRpdGlvbg0KLXN0ZXBzVGV4dD1FdGFwZXMNCi1wcmVkZWNlc3NvcnNUZXh0PVByXHUwMGU5ZFx1MDBlOWNlc3NldXJzDQotcmVwZWF0YWJsZVRleHQ9Ulx1MDBlOWl0XHUwMGU5cmFibGUNCi10eXBlVGV4dD1UeXBlDQotb25nb2luZ1RleHQ9RW4gY291cnMNCi1ldmVudERyaXZlblRleHQ9Q29tbWFuZFx1MDBlOSBwYXIgbGVzIFx1MDBlOXZcdTAwZTluZW1lbnRzDQotbW9kZWxJbmZvVGV4dD1JbmZvcm1hdGlvbnMgcmVsYXRpdmVzIGF1IG1vZFx1MDBlOGxlDQotZW50cnlTdGF0ZVRleHQ9RXRhdCBkJ2VudHJcdTAwZTllDQotZXhpdFN0YXRlVGV4dD1FdGF0IGRlIHNvcnRpZQ0KLXRlYW1UZXh0PUVxdWlwZQ0KLXBhcmVudFBhY2thZ2VUZXh0PVBhY2thZ2UgcGFyZW50DQotY29udGFpbmVkUGFja2FnZXNUZXh0PVBhY2thZ2VzIGNvbnRlbnVzDQotY29udGVudHNUZXh0PVNvbW1haXJlDQotYmFzZWRPbk1ldGhvZFJvbGVUZXh0PUJhc1x1MDBlOSBzdXIgdW4gclx1MDBmNGxlIGRlIG1cdTAwZTl0aG9kZQ0KLWJhc2VkT25NZXRob2RUYXNrVGV4dD1CYXNcdTAwZTkgc3VyIHVuZSB0XHUwMGUyY2hlIGRlIG1cdTAwZTl0aG9kZQ0KLWJhc2VkT25NZXRob2RXb3JrUHJvZHVjdFRleHQ9QmFzXHUwMGU5IHN1ciB1biBwcm9kdWl0IGRlIG1cdTAwZTl0aG9kZQ0KLXN1bW1hcnlUZXh0PVJcdTAwZTlzdW1cdTAwZTkNCi1wZXJmb3Jtc1RleHQ9RWZmZWN0dWUNCi1yZXBsYWNlc1RleHQ9UmVtcGxhY2UNCi1jb250cmlidXRlc1RleHQ9Q29udHJpYnVlDQotbm9uZVRleHQ9QXVjdW4NCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNUZXh0PUNvbnNpZFx1MDBlOXJhdGlvbnMgcmVsYXRpdmVzIFx1MDBlMCBsJ2VzdGltYXRpb24NCi1hY3Rpdml0eVJlZmVyZW5jZXNUZXh0PVJcdTAwZTlmXHUwMGU5cmVuY2VzIGQnYWN0aXZpdFx1MDBlOQ0KLW5hbWVUZXh0PU5vbQ0KLXByZXNlbnRhdGlvbk5hbWVUZXh0PU5vbSBkZSBwclx1MDBlOXNlbnRhdGlvbg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQveHNsL3Jlc291cmNlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmN2NkNmIxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBUaGUgVUkgdGV4dCBpbiB0aGUgWFNMIHN0eWxlc2hlZXRzLg0KLQ0KLWFkZGl0aW9uYWxJbmZvVGV4dD1JbmZvcm1hemlvbmkgYWdnaXVudGl2ZQ0KLWFkZGl0aW9uYWxQZXJmb3JtZXJUZXh0PUVzZWN1dG9yaSBhZ2dpdW50aXZpDQotYWdncmVnYXRlc1RleHQ9QWdncmVnYQ0KLWFsdGVybmF0aXZlc1RleHQ9QWx0ZXJuYXRpdm8NCi1hcHBsaWNhdGlvblRleHQ9QXBwbGljYXppb25lDQotYXJ0aWZhY3RUZXh0PUFydGVmYXR0bw0KLWFzc2V0c1RleHQ9Umlzb3JzZQ0KLWFzc2lnbm1lbnRBcHByb2FjaGVzVGV4dD1BcHByb2NjaSBhc3NlZ25hemlvbmUNCi1hc3Npc3RpbmdUZXh0PUFzc2lzdGVuemENCi1iYWNrZ3JvdW5kVGV4dD1CYWNrZ3JvdW5kDQotYnJpZWZPdXRsaW5lVGV4dD1CcmV2ZSBwcm9maWxvDQotY2hlY2tJdGVtc1RleHQ9Vm9jaSBlbGVuY2hpIGRpIG9wZXJhemlvbmkNCi1jaGVja2xpc3RzVGV4dD1FbGVuY2hpIGRpIGNvbnRyb2xsbw0KLWNvbGxhcHNlQWxsVGV4dD1Db21wcmltaSB0dXR0ZSBsZSB2b2NpIGRpIGVsZW5jbyBkaSBjb250cm9sbG8NCi1jb21wb3NpdGVSb2xlVGV4dD1SdW9sbyBjb21wb3NpdG8NCi1jb25jZXB0c1RleHQ9Q29uY2V0dGkNCi1jb250YWluZWRBcnRpZmFjdHNUZXh0PUFydGVmYXR0aSBjb250ZW51dGkNCi1jb250YWluZXJBcnRpZmFjdFRleHQ9Q29udGVuaXRvcmUgQXJ0ZWZhdHRvDQotY29udGVudEVsZW1lbnRzVGV4dD1FbGVtZW50aSBjYXRlZ29yaXp6YXRpDQotY29udGVudFJlZmVyZW5jZXNUZXh0PVJpZmVyaW1lbnRpIGNvbnRlbnV0bw0KLWRlbGl2ZXJhYmxlVGV4dD1Db21wb25lbnRlIGRpc3RyaWJ1aWJpbGUNCi1kZWxpdmVyYWJsZVByb3BlcnRpZXNUZXh0PVByb3ByaWV0XHUwMGUwIGNvbXBvbmVudGkgZGlzdHJpYnVpYmlsaQ0KLWRlbGl2ZXJlZFBhcnRzVGV4dD1QYXJ0aSBkaXN0cmlidWliaWxpDQotZGVsaXZlcmVkV29ya1Byb2R1Y3RzVGV4dD1Qcm9kb3R0aSBkaSBsYXZvcm8gZGlzdHJpYnVpdGkNCi1kZXBlbmRlbnRUZXh0PVByb2RvdHRpIGRpIGxhdm9ybyBkaXBlbmRlbnRpDQotZGVzY3JpcHRpb25UZXh0PURlc2NyaXppb25lDQotZGlzY2lwbGluZVRleHQ9RGlzY2lwbGluYQ0KLWRpc2NpcGxpbmVzVGV4dD1EaXNjaXBsaW5hcw0KLXN1YmRpc2NpcGxpbmVzVGV4dD1Tb3R0b2Rpc2NpcGxpbmFzDQotZG9tYWluVGV4dD1Eb21pbmlvDQotZG9tYWluc1RleHQ9RG9taW5pDQotZXhhbXBsZXNUZXh0PUVzZW1waQ0KLWV4cGFuZEFsbFRleHQ9RXNwYW5kaSB0dXR0ZSBsZSB2b2NpIGRpIGVsZW5jbyBkaSBjb250cm9sbG8NCi1leHRlbmRzVGV4dD1Fc3RlbmRlDQotZXh0ZXJuYWxUZXh0PUVzdGVybm8NCi1leHRlcm5hbERlc2NyaXB0aW9uVGV4dD1EZXNjcml6aW9uZSBlc3Rlcm5hDQotZ29hbHNUZXh0PU9iaWV0dGl2aQ0KLWd1aWRlbGluZXNUZXh0PUxpbmVlIGd1aWRhDQotaWxsdXN0cmF0aW9uc1RleHQ9SWxsdXN0cmF6aW9uaQkNCi1pbXBhY3RPZk5vdEhhdmluZ1RleHQ9SW1wYXR0byBkZWxsYSBub24gZGlzcG9uaWJpbGl0XHUwMGUwDQotaW1wYWN0aW5nVGV4dD1Qcm9kb3R0aSBkaSBsYXZvcm8gY2hlIGdlbmVyYW5vIGltcGF0dG8NCi1pbnB1dHNUZXh0PUlucHV0DQotaW5wdXRUb1RleHQ9SW5wdXQgaW4NCi1pdGVtc1RleHQ9RWxlbWVudGkNCi1rZXlDb25zaWRlcmF0aW9uc1RleHQ9Q29uc2lkZXJhemlvbmkgY2hpYXZlDQotbGV2ZWxzT2ZBZG9wdGlvblRleHQ9TGl2ZWxsaSBkaSBhZG96aW9uZQ0KLW1hbmRhdG9yeVRleHQ9T2JibGlnYXRvcmlvDQotbWFpblRleHQ9UHJpbmNpcGFsZQ0KLW1haW5EZXNjcmlwdGlvblRleHQ9RGVzY3JpemlvbmUgcHJpbmNpcGFsZQ0KLW1haW5SZXNwb25zaWJsZVRleHQ9UmVzcG9uc2FiaWxlIHByaW5jaXBhbGUNCi1tZXRob2RUZXh0PVByb2RvdHRpIGRpIGxhdm9ybyBkaSBtZXRvZG8NCi1tb2RpZmllZEJ5VGV4dD1Nb2RpZmljYXRvIGRhDQotbW9yZUluZm9UZXh0PVVsdGVyaW9yaSBpbmZvcm1hemlvbmkNCi1ub3RhdGlvblRleHQ9Tm90YXppb25lDQotb3B0aW9uYWxUZXh0PUZhY29sdGF0aXZvDQotb3V0Y29tZVRleHQ9UmlzdWx0YXRvDQotb3V0cHV0RnJvbVRleHQ9T3V0cHV0IGRpDQotb3V0cHV0c1RleHQ9T3V0cHV0DQotcGFja2FnaW5nSW5zdHJ1Y3Rpb25zVGV4dD1Jc3RydXppb25pIHBlciBsYSBjcmVhemlvbmUgZGkgcGFjY2hldHRpDQotcGFja2FnaW5nR3VpZGFuY2VUZXh0PUd1aWRhIGFsbGEgY3JlYXppb25lIHBhY2NoZXR0aQ0KLXBlcmZvcm1pbmdSb2xlc1RleHQ9UnVvbGkgZXNlY3V0aXZpDQotcHJpbWFyeVBlcmZvcm1lclRleHQ9RXNlY3V0b3JlIHByaW1hcmlvDQotcHJvYmxlbVRleHQ9UHJvYmxlbWENCi1wcm9wZXJ0aWVzVGV4dD1Qcm9wcmlldFx1MDBlMA0KLXB1cnBvc2VUZXh0PVNjb3BvDQotcmVhc29uc0Zvck5vdE5lZWRpbmdUZXh0PU1vdGl2byBkZWxsYSBub24gbmVjZXNzaXRcdTAwZTANCi1yZWZlcmVuY2VXb3JrZmxvd3NUZXh0PUZsdXNzaSBkaSBsYXZvcm8gZGkgcmlmZXJpbWVudG8NCi1yZWxhdGVkRWxlbWVudHNUZXh0PUVsZW1lbnRpIGNvcnJlbGF0aQ0KLXJlbGF0aW9uc2hpcHNUZXh0PVJlbGF6aW9uaQ0KLXJlcG9ydHNUZXh0PVJlcG9ydA0KLXJlcHJlc2VudGF0aW9uT3B0aW9uc1RleHQ9T3B6aW9uaSBkaSByYXBwcmVzZW50YXppb25lDQotcmVzcG9uc2libGVUZXh0PVJlc3BvbnNhYmlsZQ0KLXJlc3BvbnNpYmxlRm9yVGV4dD1SZXNwb25zYWJpbGUgZGkNCi1yZXVzYWJsZUFzc2V0c1RleHQ9Umlzb3JzZSByaXV0aWxpenphYmlsaQ0KLXJvbGVUZXh0PVJ1b2xvDQotcm9sZXNUZXh0PVJ1b2xpDQotcm9sZVNldHNUZXh0PUluc2llbWkgZGkgcnVvbGkNCi1za2lsbHNUZXh0PVNraWxsDQotc3RhZmZpbmdUZXh0PVBlcnNvbmFsZQ0KLXN0ZXBzVGV4dD1QYXNzaQ0KLXN1YmNhdGVnb3JpZXNUZXh0PVNvdHRvY2F0ZWdvcmllCQ0KLXN1YmRvbWFpbnNUZXh0PVNvdHRvZG9taW5pDQotc3ViUHJhY3RpY2VzVGV4dD1Tb3R0b3ByYXRpY2hlDQotc3VwZXJUZWFtVGV4dD1Qcm9maWxvIHN1cGVydGVhbQ0KLXN1cHBvcnRpbmdNYXRlcmlhbHNUZXh0PU1hdGVyaWFsZSBkaSBzdXBwb3J0bw0KLXN1YnRlYW1zVGV4dD1Qcm9maWxpIHNvdHRvdGVhbQ0KLXN5bm9ueW1zVGV4dD1TaW5vbmltaQ0KLXRhaWxvcmluZ1RleHQ9UGVyc29uYWxpenphemlvbmUNCi10YXNrVGV4dD1PcGVyYXppb25lDQotdGFza3NUZXh0PU9wZXJhemlvbmkNCi10YnNUZXh0PUFsbG9jYXppb25lIHRlYW0NCi10ZWFtUHJvZmlsZVRleHQ9UHJvZmlsbyB0ZWFtDQotdGVhbVJvbGVzVGV4dD1SdW9saSBwcm9maWxvIHRlYW0NCi10ZWNobmlxdWVzVGV4dD1MaW5lZSBndWlkYQ0KLXRlbXBsYXRlRmlsZXNUZXh0PUZpbGUgZGkgbW9kZWxsbw0KLXRlbXBsYXRlc1RleHQ9TW9kZWxsaQ0KLXRvb2xNZW50b3JzVGV4dD1HdWlkYSBhbCB0b29sDQotdG9vbFRleHQ9VG9vbA0KLXVzYWdlVGV4dD1VdGlsaXp6bw0KLXdic1RleHQ9RWxlbWVudG8gZGVsbGEgc3VkZGl2aXNpb25lIGRlbCBsYXZvcm8NCi13aGl0ZXBhcGVyc1RleHQ9V2hpdGVwYXBlcg0KLXdvcmtQcm9kdWN0c1RleHQ9UHJvZG90dGkgZGkgbGF2b3JvDQotd29ya1Byb2R1Y3RUeXBlc1RleHQ9VGlwaSBkaSBwcm9kb3R0byBkaSBsYXZvcm8NCi13cGJzVGV4dD1VdGlsaXp6byBkZWwgcHJvZG90dG8gZGkgbGF2b3JvDQotd29ya0JyZWFrZG93blRleHQ9U3VkZGl2aXNpb25lIGxhdm9ybw0KLXdvcmtmbG93VGV4dD1GbHVzc28gZGkgbGF2b3JvDQotd29ya1Byb2R1Y3RCcmVha2Rvd25UZXh0PVN1ZGRpdmlzaW9uZSBwcm9kb3R0byBkaSBsYXZvcm8NCi13b3JrUHJvZHVjdERlcGVuZGVuY2llc1RleHQ9RGlwZW5kZW56ZSBwcm9kb3R0aSBkaSBsYXZvcm8NCi10ZWFtUHJvZmlsZUJyZWFrZG93blRleHQ9U3VkZGl2aXNpb25lIHRlYW0NCi10ZWFtU3RydWN0dXJlVGV4dD1TdHJ1dHR1cmEgdGVhbQ0KLXBhZ2VOb3RJbnN0YWxsZWRUZXh0PVBhZ2luYSBub24gaW5zdGFsbGF0YQ0KLWVsZW1lbnREb2VzTm90RXhpc3RUZXh0PUwnZWxlbWVudG8gbm9uIGVzaXN0ZQ0KLWlzTm90VmFsaWRUZXh0PUwnZWxlbWVudG8gYSBjdWkgc2kgZmEgcmlmZXJpbWVudG8gbm9uIFx1MDBlOCB1biBlbGVtZW50byB2YWxpZG8gZGVsbGEgbGlicmVyaWEgY29ycmVudGUuDQotZWxlbWVudE1pZ2h0QmVEZWxldGVkVGV4dD1cdTAwYzggcG9zc2liaWxlIGNoZSBsJ2VsZW1lbnRvIHNpYSBzdGF0byBlbGltaW5hdG8gZGFsbGEgbGlicmVyaWEuDQotcGxlYXNlRml4TGlua1RleHQ9Q29udHJvbGxhcmUgbGEgbGlicmVyaWEgZGVsIGNvbnRlbnV0byBlIHJpcGFyYXJlIGlsIGNvbGxlZ2FtZW50by4NCi1pbmZvQWJvdXRNaXNzaW5nRWxlbWVudFRleHQ9SW5mb3JtYXppb25pIHN1bGwnZWxlbWVudG8gbWFuY2FudGU6DQotZWxlbWVudE5hbWVUZXh0PU5vbWUgZWxlbWVudG86DQotZ3VpZFRleHQ9R1VJRDoNCi1taXNzaW5nRWxlbWVudFRleHQ9TGEgcGFnaW5hIGEgY3VpIHNpIGZhIHJpZmVyaW1lbnRvIG5vbiBzaSB0cm92YSBpbiBxdWVzdGEgY29uZmlndXJhemlvbmUNCi1ub3RBdmFpbGFibGVUZXh0PUxhIHBhZ2luYSBhIGN1aSBzaSBmYSByaWZlcmltZW50byBub24gXHUwMGU4IGRpc3BvbmliaWxpIG5lbGxhIGNvbmZpZ3VyYXppb25lIGNvcnJlbnRlLiBcdTAwYzggcG9zc2liaWxlIGNoZSBxdWVzdGEgcGFnaW5hIHNpYSBkaXNwb25pYmlsZSBpbiB1biBhbHRyYSBjb25maWd1cmF6aW9uZSBkaSBwcm9jZXNzby4NCi1lbGVtZW50VHlwZVRleHQ9VGlwbyBkaSBlbGVtZW50bzoNCi1wbHVnaW5OYW1lVGV4dD1Ob21lIHBsdWctaW46DQotcHJlZGVjZXNzb3JUZXh0PVByZWRlY2Vzc29yZQ0KLXBsYW5uaW5nRGF0YVRleHQ9UGlhbmlmaWNhemlvbmUgZGF0aQ0KLW11bHRpcGxlT2NjdXJyZW5jZXNUZXh0PVJpY29ycmVuemUgbXVsdGlwbGUNCi1ldmVudERyaXZlblRleHQ9QXR0aXZhdG8gZGEgZXZlbnRvDQotb25nb2luZ1RleHQ9SW4gY29yc28NCi1wbGFubmVkVGV4dD1QaWFuaWZpY2F0bw0KLXJlcGVhdGFibGVUZXh0PVJpcGV0aWJpbGUNCi11c2FnZUd1aWRhbmNlVGV4dD1HdWlkYSBhbGwndXNvDQotaW5wdXRzVGV4dD1JbnB1dA0KLW91dHB1dHNUZXh0PU91dHB1dA0KLWFjdGl2aXR5RW50cnlTdGF0ZVRleHQ9U3RhdG8gaW5ncmVzc28gYXR0aXZpdFx1MDBlMA0KLWFjdGl2aXR5RXhpdFN0YXRlVGV4dD1TdGF0byB1c2NpdGEgYXR0aXZpdFx1MDBlMA0KLXByZWZpeFRleHQ9UHJlZmlzc28NCi1leHRlcm5hbElkVGV4dD1JRCBlc3Rlcm5vDQotc2NvcGVUZXh0PUFtYml0bw0KLXJvYWRtYXBUZXh0PVJvYWRtYXANCi10eXBlb2ZDb250cmFjdFRleHQ9VGlwbyBkaSBjb250cmF0dG8NCi1wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzVGV4dD1DYXJhdHRlcmlzdGljaGUgZGVsIHByb2dldHRvDQotcHJvamVjdE1lbWJlckV4cGVydGlzZVRleHQ9RXNwZXJpZW56YSBtZW1icm8gZGVsIHByb2dldHRvDQotcmlza0xldmVsVGV4dD1MaXZlbGxvIGRpIHJpc2NoaW8NCi1zY2FsZVRleHQ9U2NhbGENCi11c2FnZU5vdGVzVGV4dD1Ob3RlIHN1bGwndXRpbGl6em8NCi1jb250ZXh0VGV4dD1Db250ZXN0bw0KLXBhcmVudEFjdGl2aXRpZXNUZXh0PUF0dGl2aXRcdTAwZTAgcGFyZW50DQotaW5jbHVkZWRQYXR0ZXJuc1RleHQ9TW9kZWxsbyBpbmNsdXNpDQotY2hlY2tsaXN0VGV4dD1FbGVuY28gZGkgY29udHJvbGxvDQotY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNUZXh0PU1hdGVyaWFsaSBwZXIgbGEgY29tdW5pY2F6aW9uZQ0KLWVkdWNhdGlvbk1hdGVyaWFsc1RleHQ9TWF0ZXJpYWxlIGRpZGF0dGljbw0KLWVzdGltYXRpbmdUZWNobmlxdWVUZXh0PVZhbHV0YXppb25lIGRlbGxhIHRlY25pY2ENCi1hZGRpdGlvbmFsVGV4dD1BZ2dpdW50aXZvDQotbW9kaWZpZXNUZXh0PU1vZGlmaWNhDQotYWRkaXRpb25hbGx5UGVyZm9ybXNUZXh0PUVzZWd1ZSBhbmNoZQ0KLWluZGV4VGV4dD1JbmRpY2UNCi1wcmVmaXhUZXh0PVByZWZpc3NvDQotYnJlYWtkb3duRWxlbWVudFRleHQ9RWxlbWVudG8gZGVsbGEgc3VkZGl2aXNpb25lDQotc3RlcHNUZXh0PVBhc3NpDQotcHJlZGVjZXNzb3JzVGV4dD1QcmVkZWNlc3NvcmkNCi1yZXBlYXRhYmxlVGV4dD1SaXBldGliaWxlDQotdHlwZVRleHQ9VGlwbw0KLW9uZ29pbmdUZXh0PUluIGNvcnNvDQotZXZlbnREcml2ZW5UZXh0PUF0dGl2YXRvIGRhIGV2ZW50bw0KLW1vZGVsSW5mb1RleHQ9SW5mbyBtb2RlbGxvDQotZW50cnlTdGF0ZVRleHQ9U3RhdG8gZGkgaW5ncmVzc28NCi1leGl0U3RhdGVUZXh0PVN0YXRvIGRpIHVzY2l0YQ0KLXRlYW1UZXh0PVRlYW0NCi1wYXJlbnRQYWNrYWdlVGV4dD1QYWNjaGV0dG8gcGFyZW50DQotY29udGFpbmVkUGFja2FnZXNUZXh0PVBhY2NoZXR0aSBjb250ZW51dGkNCi1jb250ZW50c1RleHQ9Q29udGVudXRvDQotYmFzZWRPbk1ldGhvZFJvbGVUZXh0PUJhc2F0byBzdSBydW9sbyBtZXRvZG8NCi1iYXNlZE9uTWV0aG9kVGFza1RleHQ9QmFzYXRvIHN1IG9wZXJhemlvbmUgbWV0b2RvDQotYmFzZWRPbk1ldGhvZFdvcmtQcm9kdWN0VGV4dD1CYXNhdG8gc3UgcHJvZG90dG8gZGkgbGF2b3JvIG1ldG9kbw0KLXN1bW1hcnlUZXh0PVJpZXBpbG9nbw0KLXBlcmZvcm1zVGV4dD1Fc2VndWUNCi1yZXBsYWNlc1RleHQ9U29zdGl0dWlzY2UNCi1jb250cmlidXRlc1RleHQ9Q29udHJpYnVpc2NlDQotbm9uZVRleHQ9TmVzc3Vubw0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc1RleHQ9Q29uc2lkZXJhemlvbmkgc3VsbGEgdmFsdXRhemlvbmUNCi1hY3Rpdml0eVJlZmVyZW5jZXNUZXh0PVJpZmVyaW1lbnRpIGF0dGl2aXRcdTAwZTANCi1uYW1lVGV4dD1Ob21lDQotcHJlc2VudGF0aW9uTmFtZVRleHQ9Tm9tZSBwcmVzZW50YXppb25lDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3hzbC9yZXNvdXJjZXNfamEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4MGFhYWMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3hzbC9yZXNvdXJjZXNfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIFRoZSBVSSB0ZXh0IGluIHRoZSBYU0wgc3R5bGVzaGVldHMuDQotDQotYWRkaXRpb25hbEluZm9UZXh0PVx1OGZmZFx1NTJhMFx1NjBjNVx1NTgzMQ0KLWFkZGl0aW9uYWxQZXJmb3JtZXJUZXh0PVx1OGZmZFx1NTJhMFx1NWI5Zlx1ODg0Y1x1ODAwNQ0KLWFnZ3JlZ2F0ZXNUZXh0PVx1OTZjNlx1N2QwNA0KLWFsdGVybmF0aXZlc1RleHQ9XHU0ZWUzXHU2ODQ4DQotYXBwbGljYXRpb25UZXh0PVx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmMw0KLWFydGlmYWN0VGV4dD1cdTYyMTBcdTY3OWNcdTcyNjkNCi1hc3NldHNUZXh0PVx1MzBhMlx1MzBiYlx1MzBjM1x1MzBjOA0KLWFzc2lnbm1lbnRBcHByb2FjaGVzVGV4dD1cdTUyNzJcdTMwOGFcdTVmNTNcdTMwNjZcdTY1YjlcdTZjZDUNCi1hc3Npc3RpbmdUZXh0PVx1NjUyZlx1NjNmNA0KLWJhY2tncm91bmRUZXh0PVx1ODBjY1x1NjY2Zg0KLWJyaWVmT3V0bGluZVRleHQ9XHU2OTgyXHU4OTgxDQotY2hlY2tJdGVtc1RleHQ9XHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHU5ODA1XHU3NmVlDQotY2hlY2tsaXN0c1RleHQ9XHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHUzMGVhXHUzMGI5XHUzMGM4DQotY29sbGFwc2VBbGxUZXh0PVx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1OTgwNVx1NzZlZVx1MzA5Mlx1MzA1OVx1MzA3OVx1MzA2Nlx1N2UyZVx1NWMwZlx1ODg2OFx1NzkzYQ0KLWNvbXBvc2l0ZVJvbGVUZXh0PVx1MzBiM1x1MzBmM1x1MzBkZFx1MzBiOFx1MzBjM1x1MzBjOFx1MzBmYlx1MzBlZFx1MzBmY1x1MzBlYg0KLWNvbmNlcHRzVGV4dD1cdTY5ODJcdTVmZjUNCi1jb250YWluZWRBcnRpZmFjdHNUZXh0PVx1NTQyYlx1MzA3ZVx1MzA4Y1x1MzA4Ylx1NjIxMFx1Njc5Y1x1NzI2OQ0KLWNvbnRhaW5lckFydGlmYWN0VGV4dD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2FcdTMwZmNcdTYyMTBcdTY3OWNcdTcyNjkNCi1jb250ZW50RWxlbWVudHNUZXh0PVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmY1x1NTMxNlx1ODk4MVx1N2QyMA0KLWNvbnRlbnRSZWZlcmVuY2VzVGV4dD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTUzYzJcdTcxNjcNCi1kZWxpdmVyYWJsZVRleHQ9XHU3ZDBkXHU1MTY1XHU3MjY5DQotZGVsaXZlcmFibGVQcm9wZXJ0aWVzVGV4dD1cdTdkMGRcdTUxNjVcdTcyNjlcdTMwNmVcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwZmMNCi1kZWxpdmVyZWRQYXJ0c1RleHQ9XHU3ZDBkXHU1MTY1XHU3MjY5DQotZGVsaXZlcmVkV29ya1Byb2R1Y3RzVGV4dD1cdTdkMGRcdTUxNjVcdTMwNTVcdTMwOGNcdTMwNWZcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzgNCi1kZXBlbmRlbnRUZXh0PVx1NWY5M1x1NWM1ZVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLWRlc2NyaXB0aW9uVGV4dD1cdThhYWNcdTY2MGUNCi1kaXNjaXBsaW5lVGV4dD1cdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2UNCi1kaXNjaXBsaW5lc1RleHQ9XHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlDQotc3ViZGlzY2lwbGluZXNUZXh0PVx1MzBiNVx1MzBkNlx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZQ0KLWRvbWFpblRleHQ9XHUzMGM5XHUzMGUxXHUzMGE0XHUzMGYzDQotZG9tYWluc1RleHQ9XHUzMGM5XHUzMGUxXHUzMGE0XHUzMGYzDQotZXhhbXBsZXNUZXh0PVx1NGY4Yg0KLWV4cGFuZEFsbFRleHQ9XHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHU5ODA1XHU3NmVlXHUzMDkyXHUzMDU5XHUzMDc5XHUzMDY2XHU2MmUxXHU1ZjM1XHU4ODY4XHU3OTNhDQotZXh0ZW5kc1RleHQ9XHU2MmUxXHU1ZjM1DQotZXh0ZXJuYWxUZXh0PVx1NTkxNlx1OTBlOA0KLWV4dGVybmFsRGVzY3JpcHRpb25UZXh0PVx1NTkxNlx1OTBlOFx1OGExOFx1OGZmMA0KLWdvYWxzVGV4dD1cdTc2ZWVcdTZhMTkNCi1ndWlkZWxpbmVzVGV4dD1cdTMwYWNcdTMwYTRcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZjMNCi1pbGx1c3RyYXRpb25zVGV4dD1cdTU2ZjMJDQotaW1wYWN0T2ZOb3RIYXZpbmdUZXh0PVx1MzA2YVx1MzA0NFx1NTgzNFx1NTQwOFx1MzA2ZVx1NWY3MVx1OTdmZg0KLWltcGFjdGluZ1RleHQ9XHU1ZjcxXHU5N2ZmXHUzMDkyXHU0ZTBlXHUzMDQ4XHUzMDhiXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4DQotaW5wdXRzVGV4dD1cdTUxNjVcdTUyOWINCi1pbnB1dFRvVGV4dD1cdTUxNjVcdTUyOWJcdTUxNDgNCi1pdGVtc1RleHQ9XHU5ODA1XHU3NmVlDQota2V5Q29uc2lkZXJhdGlvbnNUZXh0PVx1NGUzYlx1MzA2YVx1ODAwM1x1NjE2ZVx1NGU4Ylx1OTgwNQ0KLWxldmVsc09mQWRvcHRpb25UZXh0PVx1NjNhMVx1NzUyOFx1MzA2ZVx1MzBlY1x1MzBkOVx1MzBlYg0KLW1hbmRhdG9yeVRleHQ9XHU1ZmM1XHU5ODA4DQotbWFpblRleHQ9XHU0ZTNiXHU4OTgxDQotbWFpbkRlc2NyaXB0aW9uVGV4dD1cdThhYWNcdTY2MGUNCi1tYWluUmVzcG9uc2libGVUZXh0PVx1NGUzYlx1NjJjNVx1NWY1M1x1ODAwNQ0KLW1ldGhvZFRleHQ9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMDZlXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4DQotbW9kaWZpZWRCeVRleHQ9XHU1OTA5XHU2NmY0XHU4MDA1DQotbW9yZUluZm9UZXh0PVx1OGE3M1x1N2QzMFx1NjBjNVx1NTgzMQ0KLW5vdGF0aW9uVGV4dD1cdTg4NjhcdThhMTgNCi1vcHRpb25hbFRleHQ9XHUzMGFhXHUzMGQ3XHUzMGI3XHUzMGU3XHUzMGYzDQotb3V0Y29tZVRleHQ9XHU3ZDUwXHU2NzljDQotb3V0cHV0RnJvbVRleHQ9XHU1MWZhXHU1MjliXHU1MTQzDQotb3V0cHV0c1RleHQ9XHU1MWZhXHU1MjliDQotcGFja2FnaW5nSW5zdHJ1Y3Rpb25zVGV4dD1cdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjhcdTUzMTZcdTMwNmVcdThhYWNcdTY2MGUNCi1wYWNrYWdpbmdHdWlkYW5jZVRleHQ9XHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4XHU1MzE2XHUzMDZlXHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5DQotcGVyZm9ybWluZ1JvbGVzVGV4dD1cdTViOWZcdTg4NGNcdTMwZWRcdTMwZmNcdTMwZWINCi1wcmltYXJ5UGVyZm9ybWVyVGV4dD1cdTU3ZmFcdTY3MmNcdTViOWZcdTg4NGNcdTgwMDUNCi1wcm9ibGVtVGV4dD1cdTU1NGZcdTk4NGMNCi1wcm9wZXJ0aWVzVGV4dD1cdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwZmMNCi1wdXJwb3NlVGV4dD1cdTc2ZWVcdTc2ODQNCi1yZWFzb25zRm9yTm90TmVlZGluZ1RleHQ9XHU1ZmM1XHU4OTgxXHUzMDZlXHUzMDZhXHUzMDQ0XHU3NDA2XHU3NTMxDQotcmVmZXJlbmNlV29ya2Zsb3dzVGV4dD1cdTUzYzJcdTcxNjdcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZDVcdTMwZWRcdTMwZmMNCi1yZWxhdGVkRWxlbWVudHNUZXh0PVx1OTVhMlx1NGZjMlx1MzA1OVx1MzA4Ylx1ODk4MVx1N2QyMA0KLXJlbGF0aW9uc2hpcHNUZXh0PVx1OTVhMlx1NGZjMg0KLXJlcG9ydHNUZXh0PVx1MzBlY1x1MzBkZFx1MzBmY1x1MzBjOA0KLXJlcHJlc2VudGF0aW9uT3B0aW9uc1RleHQ9XHU4ODY4XHU3OTNhXHUzMGFhXHUzMGQ3XHUzMGI3XHUzMGU3XHUzMGYzDQotcmVzcG9uc2libGVUZXh0PVx1NjJjNVx1NWY1M1x1ODAwNQ0KLXJlc3BvbnNpYmxlRm9yVGV4dD1cdTYyYzVcdTVmNTMNCi1yZXVzYWJsZUFzc2V0c1RleHQ9XHU1MThkXHU1MjI5XHU3NTI4XHU1M2VmXHU4MGZkXHUzMDZhXHUzMGEyXHUzMGJiXHUzMGMzXHUzMGM4DQotcm9sZVRleHQ9XHUzMGVkXHUzMGZjXHUzMGViDQotcm9sZXNUZXh0PVx1MzBlZFx1MzBmY1x1MzBlYg0KLXJvbGVTZXRzVGV4dD1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzgNCi1za2lsbHNUZXh0PVx1MzBiOVx1MzBhZFx1MzBlYg0KLXN0YWZmaW5nVGV4dD1cdTkxNGRcdTVjNWUNCi1zdGVwc1RleHQ9XHUzMGI5XHUzMGM2XHUzMGMzXHUzMGQ3DQotc3ViY2F0ZWdvcmllc1RleHQ9XHUzMGI1XHUzMGQ2XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjCQ0KLXN1YmRvbWFpbnNUZXh0PVx1MzBiNVx1MzBkNlx1MzBjOVx1MzBlMVx1MzBhNFx1MzBmMw0KLXN1YlByYWN0aWNlc1RleHQ9XHUzMGI1XHUzMGQ2XHUzMGQ3XHUzMGU5XHUzMGFmXHUzMGM2XHUzMGEzXHUzMGI5DQotc3VwZXJUZWFtVGV4dD1cdTMwYjlcdTMwZmNcdTMwZDFcdTMwZmNcdTMwZmJcdTMwYzFcdTMwZmNcdTMwZTBcdTMwNmVcdTMwZDdcdTMwZWRcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWINCi1zdXBwb3J0aW5nTWF0ZXJpYWxzVGV4dD1cdTMwYjVcdTMwZGRcdTMwZmNcdTMwYzhcdThjYzdcdTY1OTkNCi1zdWJ0ZWFtc1RleHQ9XHUzMGI1XHUzMGQ2XHUzMGMxXHUzMGZjXHUzMGUwXHUzMDZlXHUzMGQ3XHUzMGVkXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViDQotc3lub255bXNUZXh0PVx1NTQwY1x1N2ZhOVx1OGE5ZQ0KLXRhaWxvcmluZ1RleHQ9XHU4YWJmXHU2NTc0DQotdGFza1RleHQ9XHUzMGJmXHUzMGI5XHUzMGFmDQotdGFza3NUZXh0PVx1MzBiZlx1MzBiOVx1MzBhZg0KLXRic1RleHQ9XHUzMGMxXHUzMGZjXHUzMGUwXHUzMDZlXHU1MjcyXHUzMDhhXHU2MzJmXHUzMDhhDQotdGVhbVByb2ZpbGVUZXh0PVx1MzBjMVx1MzBmY1x1MzBlMFx1MzBmYlx1MzBkN1x1MzBlZFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYg0KLXRlYW1Sb2xlc1RleHQ9XHUzMGMxXHUzMGZjXHUzMGUwXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMGZiXHUzMGVkXHUzMGZjXHUzMGViDQotdGVjaG5pcXVlc1RleHQ9XHUzMGFjXHUzMGE0XHUzMGM5XHUzMGU5XHUzMGE0XHUzMGYzDQotdGVtcGxhdGVGaWxlc1RleHQ9XHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViDQotdGVtcGxhdGVzVGV4dD1cdTMwYzZcdTMwZjNcdTMwZDdcdTMwZWNcdTMwZmNcdTMwYzgNCi10b29sTWVudG9yc1RleHQ9XHUzMGM0XHUzMGZjXHUzMGViXHUzMGZiXHUzMGUxXHUzMGYzXHUzMGJmXHUzMGZjDQotdG9vbFRleHQ9XHUzMGM0XHUzMGZjXHUzMGViDQotdXNhZ2VUZXh0PVx1NGY3Zlx1NzUyOFx1NmNkNQ0KLXdic1RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ2XHUzMGVjXHUzMGZjXHUzMGFmXHUzMGMwXHUzMGE2XHUzMGYzXHUzMGZiXHUzMGI5XHUzMGM4XHUzMGU5XHUzMGFmXHUzMGMxXHUzMGUzXHUzMGZjDQotd2hpdGVwYXBlcnNUZXh0PVx1MzBkYlx1MzBlZlx1MzBhNFx1MzBjOFx1MzBmYlx1MzBkYVx1MzBmY1x1MzBkMVx1MzBmYw0KLXdvcmtQcm9kdWN0c1RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4DQotd29ya1Byb2R1Y3RUeXBlc1RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU5ODVlDQotd3Bic1RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDZlXHU0ZjdmXHU3NTI4XHU3MmI2XHU2Y2MxDQotd29ya0JyZWFrZG93blRleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ2XHUzMGVjXHUzMGZjXHUzMGFmXHUzMGMwXHUzMGE2XHUzMGYzDQotd29ya2Zsb3dUZXh0PVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBkNVx1MzBlZFx1MzBmYw0KLXdvcmtQcm9kdWN0QnJlYWtkb3duVGV4dD1cdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTMwNmVcdTMwZDZcdTMwZWNcdTMwZmNcdTMwYWZcdTMwYzBcdTMwYTZcdTMwZjMNCi13b3JrUHJvZHVjdERlcGVuZGVuY2llc1RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDZlXHU0ZjlkXHU1YjU4XHU5NWEyXHU0ZmMyDQotdGVhbVByb2ZpbGVCcmVha2Rvd25UZXh0PVx1MzBjMVx1MzBmY1x1MzBlMFx1MzA2ZVx1MzBkNlx1MzBlY1x1MzBmY1x1MzBhZlx1MzBjMFx1MzBhNlx1MzBmMw0KLXRlYW1TdHJ1Y3R1cmVUZXh0PVx1MzBjMVx1MzBmY1x1MzBlMFx1NjljYlx1NjIxMA0KLXBhZ2VOb3RJbnN0YWxsZWRUZXh0PVx1NjcyYVx1MzBhNFx1MzBmM1x1MzBiOVx1MzBjOFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBkYVx1MzBmY1x1MzBiOA0KLWVsZW1lbnREb2VzTm90RXhpc3RUZXh0PVx1ODk4MVx1N2QyMFx1MzA0Y1x1NWI1OFx1NTcyOFx1MzA1N1x1MzA3ZVx1MzA1Ylx1MzA5Mw0KLWlzTm90VmFsaWRUZXh0PVx1NTNjMlx1NzE2N1x1NWJmZVx1OGM2MVx1MzA2ZVx1ODk4MVx1N2QyMFx1MzA2Zlx1MzAwMVx1NzNmZVx1ODg0Y1x1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2N1x1NjcwOVx1NTJiOVx1MzA2YVx1ODk4MVx1N2QyMFx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLWVsZW1lbnRNaWdodEJlRGVsZXRlZFRleHQ9XHUzMDUzXHUzMDZlXHU4OTgxXHU3ZDIwXHUzMDZmXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDRiXHUzMDg5XHU1MjRhXHU5NjY0XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDhiXHU1M2VmXHU4MGZkXHU2MDI3XHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyDQotcGxlYXNlRml4TGlua1RleHQ9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDkyXHU3OGJhXHU4YThkXHUzMDU3XHUzMDY2XHUzMDAxXHUzMGVhXHUzMGYzXHUzMGFmXHUzMDkyXHU0ZmVlXHU2YjYzXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotaW5mb0Fib3V0TWlzc2luZ0VsZW1lbnRUZXh0PVx1NmIyMFx1ODQzZFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1ODk4MVx1N2QyMFx1MzA2ZVx1NjBjNVx1NTgzMToNCi1lbGVtZW50TmFtZVRleHQ9XHU4OTgxXHU3ZDIwXHU1NDBkOg0KLWd1aWRUZXh0PUdVSUQ6DQotbWlzc2luZ0VsZW1lbnRUZXh0PVx1NTNjMlx1NzE2N1x1NWJmZVx1OGM2MVx1MzA2ZVx1MzBkYVx1MzBmY1x1MzBiOFx1MzA2Zlx1MzA1M1x1MzA2ZVx1NjljYlx1NjIxMFx1MzA2Ylx1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLW5vdEF2YWlsYWJsZVRleHQ9XHU1M2MyXHU3MTY3XHU1YmZlXHU4YzYxXHUzMDZlXHUzMGRhXHUzMGZjXHUzMGI4XHUzMDZmXHU3M2ZlXHU1NzI4XHUzMDZlXHU2OWNiXHU2MjEwXHUzMDY3XHUzMDZmXHU0ZjdmXHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyIFx1MzA1M1x1MzA2ZVx1MzBkYVx1MzBmY1x1MzBiOFx1MzA2Zlx1NGVkNlx1MzA2ZVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1NjljYlx1NjIxMFx1MzA2N1x1NGY3Zlx1NzUyOFx1NTNlZlx1ODBmZFx1MzA2YVx1NTgzNFx1NTQwOFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMg0KLWVsZW1lbnRUeXBlVGV4dD1cdTg5ODFcdTdkMjBcdTMwYmZcdTMwYTRcdTMwZDc6DQotcGx1Z2luTmFtZVRleHQ9XHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHU1NDBkOg0KLXByZWRlY2Vzc29yVGV4dD1cdTUxNDhcdTg4NGNcdTMwYmZcdTMwYjlcdTMwYWYNCi1wbGFubmluZ0RhdGFUZXh0PVBsYW5uaW5nRGF0YQ0KLW11bHRpcGxlT2NjdXJyZW5jZXNUZXh0PVx1ODkwN1x1NjU3MFx1MzA2ZVx1NTFmYVx1NzNmZQ0KLWV2ZW50RHJpdmVuVGV4dD1cdTMwYTRcdTMwZDlcdTMwZjNcdTMwYzhcdTk5YzZcdTUyZDUNCi1vbmdvaW5nVGV4dD1cdTkwMzJcdTg4NGNcdTRlMmQNCi1wbGFubmVkVGV4dD1cdThhMDhcdTc1M2JcdTZlMDhcdTMwN2YNCi1yZXBlYXRhYmxlVGV4dD1cdTUzY2RcdTVmYTlcdTUzZWZcdTgwZmQNCi11c2FnZUd1aWRhbmNlVGV4dD1cdTRmN2ZcdTc1MjhcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjkNCi1pbnB1dHNUZXh0PVx1NTE2NVx1NTI5Yg0KLW91dHB1dHNUZXh0PVx1NTFmYVx1NTI5Yg0KLWFjdGl2aXR5RW50cnlTdGF0ZVRleHQ9XHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU5NThiXHU1OWNiXHU3MmI2XHU2MTRiDQotYWN0aXZpdHlFeGl0U3RhdGVUZXh0PVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1N2Q0Mlx1NGU4Nlx1NzJiNlx1NjE0Yg0KLXByZWZpeFRleHQ9XHUzMGQ3XHUzMGVjXHUzMGQ1XHUzMGEzXHUzMGMzXHUzMGFmXHUzMGI5DQotZXh0ZXJuYWxJZFRleHQ9XHU1OTE2XHU5MGU4IElEDQotc2NvcGVUZXh0PVx1MzBiOVx1MzBiM1x1MzBmY1x1MzBkNw0KLXJvYWRtYXBUZXh0PVx1MzBlZFx1MzBmY1x1MzBjOVx1MzBkZVx1MzBjM1x1MzBkNw0KLXR5cGVvZkNvbnRyYWN0VGV4dD1cdTU5NTFcdTdkMDRcdTMwNmVcdTMwYmZcdTMwYTRcdTMwZDcNCi1wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzVGV4dD1cdTMwZDdcdTMwZWRcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzhcdTMwNmVcdTcyNzlcdTYwMjcNCi1wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlVGV4dD1cdTMwZDdcdTMwZWRcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzhcdTMwZmJcdTMwZTFcdTMwZjNcdTMwZDBcdTMwZmNcdTMwNmVcdTVjMDJcdTk1ODBcdTc3ZTVcdThiNTgNCi1yaXNrTGV2ZWxUZXh0PVx1MzBlYVx1MzBiOVx1MzBhZlx1MzBmYlx1MzBlY1x1MzBkOVx1MzBlYg0KLXNjYWxlVGV4dD1cdTMwYjlcdTMwYjFcdTMwZmNcdTMwZWINCi11c2FnZU5vdGVzVGV4dD1cdTRmN2ZcdTc1MjhcdTRlMGFcdTMwNmVcdTZjZThcdTYxMGYNCi1jb250ZXh0VGV4dD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzgNCi1wYXJlbnRBY3Rpdml0aWVzVGV4dD1cdTg5YWFcdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmMNCi1pbmNsdWRlZFBhdHRlcm5zVGV4dD1cdTUzMDVcdTU0MmJcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjMNCi1jaGVja2xpc3RUZXh0PVx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1MzBlYVx1MzBiOVx1MzBjOA0KLWNvbW11bmljYXRpb25zTWF0ZXJpYWxzVGV4dD1cdTMwYjNcdTMwZGZcdTMwZTVcdTMwY2JcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdThjYzdcdTY1OTkNCi1lZHVjYXRpb25NYXRlcmlhbHNUZXh0PVx1NjU1OVx1ODBiMlx1OGNjN1x1NjU5OQ0KLWVzdGltYXRpbmdUZWNobmlxdWVUZXh0PVx1ODk4Ylx1N2E0ZFx1MzA4Mlx1MzA4YVx1NjI0Ylx1NmNkNQ0KLWFkZGl0aW9uYWxUZXh0PVx1OGZmZFx1NTJhMA0KLW1vZGlmaWVzVGV4dD1cdTU5MDlcdTY2ZjQNCi1hZGRpdGlvbmFsbHlQZXJmb3Jtc1RleHQ9XHU4ZmZkXHU1MmEwXHU1YjlmXHU4ODRjDQotaW5kZXhUZXh0PVx1N2QyMlx1NWYxNQ0KLXByZWZpeFRleHQ9XHUzMGQ3XHUzMGVjXHUzMGQ1XHUzMGEzXHUzMGMzXHUzMGFmXHUzMGI5DQotYnJlYWtkb3duRWxlbWVudFRleHQ9XHUzMGQ2XHUzMGVjXHUzMGZjXHUzMGFmXHUzMGMwXHUzMGE2XHUzMGYzXHUzMGZiXHUzMGE4XHUzMGVjXHUzMGUxXHUzMGYzXHUzMGM4DQotc3RlcHNUZXh0PVx1MzBiOVx1MzBjNlx1MzBjM1x1MzBkNw0KLXByZWRlY2Vzc29yc1RleHQ9XHU1MTQ4XHU4ODRjXHUzMGJmXHUzMGI5XHUzMGFmDQotcmVwZWF0YWJsZVRleHQ9XHU1M2NkXHU1ZmE5XHU1M2VmXHU4MGZkDQotdHlwZVRleHQ9XHUzMGJmXHUzMGE0XHUzMGQ3DQotb25nb2luZ1RleHQ9XHU5MDMyXHU4ODRjXHU0ZTJkDQotZXZlbnREcml2ZW5UZXh0PVx1MzBhNFx1MzBkOVx1MzBmM1x1MzBjOFx1OTljNlx1NTJkNQ0KLW1vZGVsSW5mb1RleHQ9XHUzMGUyXHUzMGM3XHUzMGViXHU2MGM1XHU1ODMxDQotZW50cnlTdGF0ZVRleHQ9XHU5NThiXHU1OWNiXHU3MmI2XHU2MTRiDQotZXhpdFN0YXRlVGV4dD1cdTdkNDJcdTRlODZcdTcyYjZcdTYxNGINCi10ZWFtVGV4dD1cdTMwYzFcdTMwZmNcdTMwZTANCi1wYXJlbnRQYWNrYWdlVGV4dD1cdTg5YWFcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjgNCi1jb250YWluZWRQYWNrYWdlc1RleHQ9XHU1NDJiXHUzMDdlXHUzMDhjXHUzMDhiXHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4DQotY29udGVudHNUZXh0PVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNA0KLWJhc2VkT25NZXRob2RSb2xlVGV4dD1cdTU3ZmFcdTY3MmNcdTMwNjhcdTMwNmFcdTMwOGJcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWINCi1iYXNlZE9uTWV0aG9kVGFza1RleHQ9XHU1N2ZhXHU2NzJjXHUzMDY4XHUzMDZhXHUzMDhiXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMDZlXHUzMGJmXHUzMGI5XHUzMGFmDQotYmFzZWRPbk1ldGhvZFdvcmtQcm9kdWN0VGV4dD1cdTU3ZmFcdTY3MmNcdTMwNjhcdTMwNmFcdTMwOGJcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwNmVcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzgNCi1zdW1tYXJ5VGV4dD1cdTg5ODFcdTdkMDQNCi1wZXJmb3Jtc1RleHQ9XHU1YjlmXHU4ODRjDQotcmVwbGFjZXNUZXh0PVx1N2Y2ZVx1NjNkYg0KLWNvbnRyaWJ1dGVzVGV4dD1cdTViYzRcdTRlMGUNCi1ub25lVGV4dD1cdTMwNmFcdTMwNTcNCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNUZXh0PVx1ODk4Ylx1N2E0ZFx1MzA4Mlx1MzA4YVx1ODAwM1x1NjE2ZVx1NGU4Ylx1OTgwNQ0KLWFjdGl2aXR5UmVmZXJlbmNlc1RleHQ9XHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHU1M2MyXHU3MTY3DQotbmFtZVRleHQ9XHU1NDBkXHU1MjRkDQotcHJlc2VudGF0aW9uTmFtZVRleHQ9XHU4ODY4XHU3OTNhXHU1NDBkDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3hzbC9yZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBjNTI2Y2MuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3hzbC9yZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIFRoZSBVSSB0ZXh0IGluIHRoZSBYU0wgc3R5bGVzaGVldHMuDQotDQotYWRkaXRpb25hbEluZm9UZXh0PVx1Y2Q5NFx1YWMwMCBcdWM4MTVcdWJjZjQNCi1hZGRpdGlvbmFsUGVyZm9ybWVyVGV4dD1cdWNkOTRcdWFjMDAgXHVjMjE4XHVkNTg5XHVjNzkwDQotYWdncmVnYXRlc1RleHQ9XHVjOWQxXHVhY2M0DQotYWx0ZXJuYXRpdmVzVGV4dD1cdWIzMDBcdWNjYjQNCi1hcHBsaWNhdGlvblRleHQ9XHVjNzUxXHVjNmE5XHVkNTA0XHViODVjXHVhZGY4XHViN2E4DQotYXJ0aWZhY3RUZXh0PVx1YzU0NFx1ZDJmMFx1ZDMyOVx1ZDJiOA0KLWFzc2V0c1RleHQ9XHVjNzkwXHVjMGIwDQotYXNzaWdubWVudEFwcHJvYWNoZXNUZXh0PVx1YzljMFx1YzgxNSBcdWM4MTFcdWFkZmMgXHViYzI5XHVjMmRkDQotYXNzaXN0aW5nVGV4dD1cdWM5YzBcdWM2ZDANCi1iYWNrZ3JvdW5kVGV4dD1cdWJjMzBcdWFjYmQNCi1icmllZk91dGxpbmVUZXh0PVx1YWMwNFx1YjdiNVx1ZDU1YyBcdWM1NDRcdWM2YzNcdWI3N2NcdWM3NzgNCi1jaGVja0l0ZW1zVGV4dD1cdWFjODBcdWMwYWMgXHVkNTZkXHViYWE5DQotY2hlY2tsaXN0c1RleHQ9XHVjY2I0XHVkMDZjXHViOWFjXHVjMmE0XHVkMmI4DQotY29sbGFwc2VBbGxUZXh0PVx1YzEyMFx1ZDBkZCBcdWQ1NmRcdWJhYTkgXHViYWE4XHViNDUwIFx1YzgxMVx1YWUzMA0KLWNvbXBvc2l0ZVJvbGVUZXh0PVx1Y2VmNFx1ZDNlY1x1YzljMFx1ZDJiOCBcdWM1ZWRcdWQ1NjANCi1jb25jZXB0c1RleHQ9XHVhYzFjXHViMTUwDQotY29udGFpbmVkQXJ0aWZhY3RzVGV4dD1cdWQzZWNcdWQ1NjhcdWI0MWMgXHVjNTQ0XHVkMmYwXHVkMzI5XHVkMmI4DQotY29udGFpbmVyQXJ0aWZhY3RUZXh0PVx1Y2VlOFx1ZDE0Y1x1Yzc3NFx1YjEwOCBcdWM1NDRcdWQyZjBcdWQzMjlcdWQyYjgNCi1jb250ZW50RWxlbWVudHNUZXh0PVx1YmQ4NFx1Yjk1OFx1YjQxYyBcdWM2OTRcdWMxOGMNCi1jb250ZW50UmVmZXJlbmNlc1RleHQ9XHVjZWU4XHVkMTUwXHVjZTIwIFx1Y2MzOFx1Yzg3MA0KLWRlbGl2ZXJhYmxlVGV4dD1cdWM3NzhcdWIzYzRcdWJiM2MNCi1kZWxpdmVyYWJsZVByb3BlcnRpZXNUZXh0PVx1Yzc3OFx1YjNjNFx1YmIzYyBcdWQyYjlcdWMxMzENCi1kZWxpdmVyZWRQYXJ0c1RleHQ9XHVjNzc4XHViM2M0XHViYjNjIFx1ZDMwY1x1ZDJiOA0KLWRlbGl2ZXJlZFdvcmtQcm9kdWN0c1RleHQ9XHVjNzc4XHViM2M0XHViNDFjIFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi1kZXBlbmRlbnRUZXh0PVx1Yzg4NVx1YzE4ZCBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjDQotZGVzY3JpcHRpb25UZXh0PVx1YzEyNFx1YmE4NQ0KLWRpc2NpcGxpbmVUZXh0PVx1YzZkMFx1Y2U1OQ0KLWRpc2NpcGxpbmVzVGV4dD1cdWM2ZDBcdWNlNTkNCi1zdWJkaXNjaXBsaW5lc1RleHQ9XHVjNmQwXHVjZTU5DQotZG9tYWluVGV4dD1cdWIzYzRcdWJhNTRcdWM3NzgNCi1kb21haW5zVGV4dD1cdWIzYzRcdWJhNTRcdWM3NzgNCi1leGFtcGxlc1RleHQ9XHVjNjA4XHVjODFjDQotZXhwYW5kQWxsVGV4dD1cdWMxMjBcdWQwZGQgXHVkNTZkXHViYWE5IFx1YmFhOFx1YjQ1MCBcdWQzYmNcdWNlNThcdWFlMzANCi1leHRlbmRzVGV4dD1cdWQ2NTVcdWM3YTUNCi1leHRlcm5hbFRleHQ9XHVjNjc4XHViZDgwDQotZXh0ZXJuYWxEZXNjcmlwdGlvblRleHQ9XHVjNjc4XHViZDgwIFx1YzEyNFx1YmE4NQ0KLWdvYWxzVGV4dD1cdWJhYTlcdWM4MDENCi1ndWlkZWxpbmVzVGV4dD1cdWFjMDBcdWM3NzRcdWI0ZGNcdWI3N2NcdWM3NzgNCi1pbGx1c3RyYXRpb25zVGV4dD1cdWM2MDhcdWMyZGMNCi1pbXBhY3RPZk5vdEhhdmluZ1RleHQ9XHViZDgwXHVjN2FjXHVjNWQwIFx1YjUzMFx1Yjk3OCBcdWM2MDFcdWQ1YTUNCi1pbXBhY3RpbmdUZXh0PVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2NcdWM1ZDAgXHVjNjAxXHVkNWE1IFx1YzhmY1x1YWUzMA0KLWlucHV0c1RleHQ9XHVjNzg1XHViODI1DQotaW5wdXRUb1RleHQ9XHVjNzg1XHViODI1IFx1YjMwMFx1YzBjMQ0KLWl0ZW1zVGV4dD1cdWQ1NmRcdWJhYTkNCi1rZXlDb25zaWRlcmF0aW9uc1RleHQ9XHVkNTc1XHVjMmVjIFx1YWNlMFx1YjgyNFx1YzBhY1x1ZDU2ZA0KLWxldmVsc09mQWRvcHRpb25UZXh0PVx1Y2M0NFx1ZDBkZCBcdWI4MDhcdWJjYTgNCi1tYW5kYXRvcnlUZXh0PVx1ZDU0NFx1YzIxOA0KLW1haW5UZXh0PVx1YWUzMFx1YmNmOA0KLW1haW5EZXNjcmlwdGlvblRleHQ9XHVhZTMwXHViY2Y4IFx1YzEyNFx1YmE4NQ0KLW1haW5SZXNwb25zaWJsZVRleHQ9XHVhZTMwXHViY2Y4IFx1Y2M0NVx1Yzc4NA0KLW1ldGhvZFRleHQ9XHViYTU0XHVjMThjXHViNGRjIFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi1tb2RpZmllZEJ5VGV4dD1cdWMyMThcdWM4MTVcdWM3OTANCi1tb3JlSW5mb1RleHQ9XHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNA0KLW5vdGF0aW9uVGV4dD1cdWQ0NWNcdWFlMzBcdWJjOTUNCi1vcHRpb25hbFRleHQ9XHVjMTIwXHVkMGRkXHVjODAxDQotb3V0Y29tZVRleHQ9XHVhY2IwXHVhY2ZjXHViYjNjDQotb3V0cHV0RnJvbVRleHQ9XHVjMGIwXHVjZDljIFx1YzljMFx1YzgxMA0KLW91dHB1dHNUZXh0PVx1YzBiMFx1Y2Q5Y1x1YmIzYw0KLXBhY2thZ2luZ0luc3RydWN0aW9uc1RleHQ9XHVkMzI4XHVkMGE0XHVjOWQ1IFx1YzljMFx1YzJkY1x1YzBhY1x1ZDU2ZA0KLXBhY2thZ2luZ0d1aWRhbmNlVGV4dD1cdWQzMjhcdWQwYTRcdWM5ZDUgXHVjNTQ4XHViMGI0DQotcGVyZm9ybWluZ1JvbGVzVGV4dD1cdWMyMThcdWQ1ODkgXHVjNWVkXHVkNTYwDQotcHJpbWFyeVBlcmZvcm1lclRleHQ9XHVhZTMwXHViY2Y4IFx1YzIxOFx1ZDU4OVx1Yzc5MA0KLXByb2JsZW1UZXh0PVx1YmIzOFx1YzgxY1x1YzgxMA0KLXByb3BlcnRpZXNUZXh0PVx1ZDJiOVx1YzEzMQ0KLXB1cnBvc2VUZXh0PVx1YmFhOVx1YzgwMQ0KLXJlYXNvbnNGb3JOb3ROZWVkaW5nVGV4dD1cdWQ1NDRcdWM2OTQgXHVjNWM2XHViMjk0IFx1Yzc3NFx1YzcyMA0KLXJlZmVyZW5jZVdvcmtmbG93c1RleHQ9XHVjYzM4XHVjODcwIFx1YzZjY1x1ZDA2Y1x1ZDUwY1x1Yjg1Y1x1YzZiMA0KLXJlbGF0ZWRFbGVtZW50c1RleHQ9XHVhZDAwXHViODI4IFx1YzY5NFx1YzE4Yw0KLXJlbGF0aW9uc2hpcHNUZXh0PVx1YWQwMFx1YWNjNA0KLXJlcG9ydHNUZXh0PVx1YmNmNFx1YWNlMFx1YzExYw0KLXJlcHJlc2VudGF0aW9uT3B0aW9uc1RleHQ9XHVkNDVjXHVjMmRjIFx1YzYzNVx1YzE1OA0KLXJlc3BvbnNpYmxlVGV4dD1cdWNjNDVcdWM3ODRcdWM3NzQgXHVjNzg4XHVjNzRjDQotcmVzcG9uc2libGVGb3JUZXh0PVx1Y2M0NVx1Yzc4NCBcdWMwYWNcdWQ1NmQ6DQotcmV1c2FibGVBc3NldHNUZXh0PVx1YzdhY1x1YzBhY1x1YzZhOVx1YWMwMFx1YjJhNVx1ZDU1YyBcdWM3OTBcdWMwYjANCi1yb2xlVGV4dD1cdWM1ZWRcdWQ1NjANCi1yb2xlc1RleHQ9XHVjNWVkXHVkNTYwDQotcm9sZVNldHNUZXh0PVx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjgNCi1za2lsbHNUZXh0PVx1YzJhNFx1ZDBhYw0KLXN0YWZmaW5nVGV4dD1cdWM3NzhcdWI4MjUgXHVhZDZjXHVjMTMxDQotc3RlcHNUZXh0PVx1YjJlOFx1YWNjNA0KLXN1YmNhdGVnb3JpZXNUZXh0PVx1YzExY1x1YmUwY1x1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYw0KLXN1YmRvbWFpbnNUZXh0PVx1YzExY1x1YmUwYyBcdWIzYzRcdWJhNTRcdWM3NzgNCi1zdWJQcmFjdGljZXNUZXh0PVx1ZDU1OFx1YzcwNCBcdWMyZTRcdWQ1ODkNCi1zdXBlclRlYW1UZXh0PVx1YzBjMVx1YzcwNCBcdWQzMDAgXHVkNTA0XHViODVjXHVkMzBjXHVjNzdjDQotc3VwcG9ydGluZ01hdGVyaWFsc1RleHQ9XHVjOWMwXHVjNmQwIFx1Yzc5MFx1YjhjYw0KLXN1YnRlYW1zVGV4dD1cdWQ1NThcdWM3MDQgXHVkMzAwIFx1ZDUwNFx1Yjg1Y1x1ZDMwY1x1Yzc3Yw0KLXN5bm9ueW1zVGV4dD1cdWIzZDlcdWM3NThcdWM1YjQNCi10YWlsb3JpbmdUZXh0PVx1Yzg3MFx1YzgxNQ0KLXRhc2tUZXh0PVx1ZDBjMFx1YzJhNFx1ZDA2Yw0KLXRhc2tzVGV4dD1cdWQwYzBcdWMyYTRcdWQwNmMNCi10YnNUZXh0PVx1ZDMwMCBcdWQ1NjBcdWIyZjkNCi10ZWFtUHJvZmlsZVRleHQ9XHVkMzAwIFx1ZDUwNFx1Yjg1Y1x1ZDMwY1x1Yzc3Yw0KLXRlYW1Sb2xlc1RleHQ9XHVkMzAwIFx1ZDUwNFx1Yjg1Y1x1ZDMwY1x1Yzc3YyBcdWM1ZWRcdWQ1NjANCi10ZWNobmlxdWVzVGV4dD1cdWFjMDBcdWM3NzRcdWI0ZGNcdWI3N2NcdWM3NzgNCi10ZW1wbGF0ZUZpbGVzVGV4dD1cdWQxNWNcdWQ1MGNcdWI5YWNcdWQyYjggXHVkMzBjXHVjNzdjDQotdGVtcGxhdGVzVGV4dD1cdWQxNWNcdWQ1MGNcdWI5YWNcdWQyYjgNCi10b29sTWVudG9yc1RleHQ9XHViM2M0XHVhZDZjIFx1YzBhY1x1YzZhOSBcdWIzYzRcdWM2YzBcdWI5ZDANCi10b29sVGV4dD1cdWIzYzRcdWFkNmMNCi11c2FnZVRleHQ9XHVjMGFjXHVjNmE5DQotd2JzVGV4dD1cdWM3OTFcdWM1YzVcdWJkODRcdWI5NThcdWNjYjRcdWFjYzQoV0JTKQ0KLXdoaXRlcGFwZXJzVGV4dD1cdWJjMzFcdWMxMWMNCi13b3JrUHJvZHVjdHNUZXh0PVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi13b3JrUHJvZHVjdFR5cGVzVGV4dD1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1YzcyMFx1ZDYxNQ0KLXdwYnNUZXh0PVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjMGFjXHVjNmE5XHViYzk1DQotd29ya0JyZWFrZG93blRleHQ9XHVjNzkxXHVjNWM1XHViZDg0XHViOTU4DQotd29ya2Zsb3dUZXh0PVx1YzZjY1x1ZDA2Y1x1ZDUwY1x1Yjg1Y1x1YzZiMA0KLXdvcmtQcm9kdWN0QnJlYWtkb3duVGV4dD1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1Yzc5MVx1YzVjNVx1YmQ4NFx1Yjk1OA0KLXdvcmtQcm9kdWN0RGVwZW5kZW5jaWVzVGV4dD1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1Yzg4NVx1YzE4ZFx1YzEzMQ0KLXRlYW1Qcm9maWxlQnJlYWtkb3duVGV4dD1cdWQzMDAgXHVjNzkxXHVjNWM1XHViZDg0XHViOTU4DQotdGVhbVN0cnVjdHVyZVRleHQ9XHVkMzAwIFx1YWQ2Y1x1Yzg3MA0KLXBhZ2VOb3RJbnN0YWxsZWRUZXh0PVx1ZDM5OFx1Yzc3NFx1YzljMFx1YWMwMCBcdWMxMjRcdWNlNThcdWI0MThcdWM5YzAgXHVjNTRhXHVjNzRjDQotZWxlbWVudERvZXNOb3RFeGlzdFRleHQ9XHVjNjk0XHVjMThjXHVhYzAwIFx1YzVjNlx1Yzc0Yw0KLWlzTm90VmFsaWRUZXh0PVx1Y2MzOFx1Yzg3MCBcdWM2OTRcdWMxOGNcdWFjMDAgXHVkNjA0XHVjN2FjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YzVkMFx1YzExYyBcdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0Lg0KLWVsZW1lbnRNaWdodEJlRGVsZXRlZFRleHQ9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVjNWQwXHVjMTFjIFx1YzY5NFx1YzE4Y1x1YWMwMCBcdWMwYWRcdWM4MWNcdWI0MThcdWM1YzhcdWM3NDQgXHVjMjE4XHViM2M0IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1wbGVhc2VGaXhMaW5rVGV4dD1cdWQ2MDRcdWM3YWMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1ZDY1NVx1Yzc3OFx1ZDU1OFx1YWNlMCBcdWI5YzFcdWQwNmNcdWI5N2MgXHVjMjE4XHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWluZm9BYm91dE1pc3NpbmdFbGVtZW50VGV4dD1cdWIyMDRcdWI3N2RcdWI0MWMgXHVjNjk0XHVjMThjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM4MTVcdWJjZjQ6DQotZWxlbWVudE5hbWVUZXh0PVx1YzY5NFx1YzE4YyBcdWM3NzRcdWI5ODQ6DQotZ3VpZFRleHQ9R1VJRDoNCi1taXNzaW5nRWxlbWVudFRleHQ9XHVjYzM4XHVjODcwIFx1ZDM5OFx1Yzc3NFx1YzljMFx1YWMwMCBcdWM3NzQgXHVhZDZjXHVjMTMxXHVjNWQwIFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1ub3RBdmFpbGFibGVUZXh0PVx1ZDYwNFx1YzdhYyBcdWFkNmNcdWMxMzFcdWM1ZDBcdWMxMWMgXHVjYzM4XHVjODcwIFx1ZDM5OFx1Yzc3NFx1YzljMFx1Yjk3YyBcdWMwYWNcdWM2YTlcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzc0IFx1ZDM5OFx1Yzc3NFx1YzljMFx1YjI5NCBcdWIyZTRcdWI5NzggXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1YWQ2Y1x1YzEzMVx1YzVkMFx1YzExYyBcdWMwYWNcdWM2YTkgXHVhYzAwXHViMmE1XHVkNTYwIFx1YzIxOCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotZWxlbWVudFR5cGVUZXh0PVx1YzY5NFx1YzE4YyBcdWM3MjBcdWQ2MTU6DQotcGx1Z2luTmFtZVRleHQ9XHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4IFx1Yzc3NFx1Yjk4NDoNCi1wcmVkZWNlc3NvclRleHQ9XHVjMTIwXHVkNTg5DQotcGxhbm5pbmdEYXRhVGV4dD1QbGFubmluZ0RhdGENCi1tdWx0aXBsZU9jY3VycmVuY2VzVGV4dD1cdWIyZTRcdWM5MTEgXHViYzFjXHVjMGRkDQotZXZlbnREcml2ZW5UZXh0PVx1Yzc3NFx1YmNhNFx1ZDJiOFx1Yjg1YyBcdWFkNmNcdWIzZDlcdWI0MjgNCi1vbmdvaW5nVGV4dD1cdWM5YzRcdWQ1ODkgXHVjOTExXHVjNzg0DQotcGxhbm5lZFRleHQ9XHVhY2M0XHVkNjhkXHViNDI4DQotcmVwZWF0YWJsZVRleHQ9XHViYzE4XHViY2Y1IFx1YWMwMFx1YjJhNVx1ZDU2OA0KLXVzYWdlR3VpZGFuY2VUZXh0PVx1YzBhY1x1YzZhOVx1YmM5NSBcdWM1NDhcdWIwYjQNCi1pbnB1dHNUZXh0PVx1Yzc4NVx1YjgyNQ0KLW91dHB1dHNUZXh0PVx1YzBiMFx1Y2Q5Y1x1YmIzYw0KLWFjdGl2aXR5RW50cnlTdGF0ZVRleHQ9XHVkNjVjXHViM2Q5IFx1YzJkY1x1Yzc5MSBcdWMwYzFcdWQwZGMNCi1hY3Rpdml0eUV4aXRTdGF0ZVRleHQ9XHVkNjVjXHViM2Q5IFx1Yzg4NVx1YjhjYyBcdWMwYzFcdWQwZGMNCi1wcmVmaXhUZXh0PVx1YzgxMVx1YjQ1MFx1YmQ4MA0KLWV4dGVybmFsSWRUZXh0PVx1YzY3OFx1YmQ4MCBJRA0KLXNjb3BlVGV4dD1cdWJjOTRcdWM3MDQNCi1yb2FkbWFwVGV4dD1cdWI4NWNcdWI0ZGNcdWI5ZjUNCi10eXBlb2ZDb250cmFjdFRleHQ9XHVhY2M0XHVjNTdkIFx1YzcyMFx1ZDYxNQ0KLXByb2plY3RDaGFyYWN0ZXJpc3RpY3NUZXh0PVx1ZDUwNFx1Yjg1Y1x1YzgxZFx1ZDJiOCBcdWQyYjlcdWMxMzENCi1wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlVGV4dD1cdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjggXHVhZDZjXHVjMTMxXHVjNmQwIFx1YzgwNFx1YmIzOCBcdWM5YzBcdWMyZGQNCi1yaXNrTGV2ZWxUZXh0PVx1YzcwNFx1ZDVkOFx1YzEzMSBcdWI4MDhcdWJjYTgNCi1zY2FsZVRleHQ9XHVjMmE0XHVjZjAwXHVjNzdjDQotdXNhZ2VOb3Rlc1RleHQ9XHVjMGFjXHVjNmE5XHViYzk1IFx1YjE3OFx1ZDJiOA0KLWNvbnRleHRUZXh0PVx1Y2VlOFx1ZDE0ZFx1YzJhNFx1ZDJiOA0KLXBhcmVudEFjdGl2aXRpZXNUZXh0PVx1YzBjMVx1YzcwNCBcdWQ2NWNcdWIzZDkNCi1pbmNsdWRlZFBhdHRlcm5zVGV4dD1cdWQzZWNcdWQ1NjhcdWI0MWMgXHVkMzI4XHVkMTM0DQotY2hlY2tsaXN0VGV4dD1cdWNjYjRcdWQwNmNcdWI5YWNcdWMyYTRcdWQyYjgNCi1jb21tdW5pY2F0aW9uc01hdGVyaWFsc1RleHQ9XHVjZWU0XHViYmE0XHViMmM4XHVjZjAwXHVjNzc0XHVjMTU4IFx1Yzc5MFx1YjhjYw0KLWVkdWNhdGlvbk1hdGVyaWFsc1RleHQ9XHVhZDUwXHVjNzIxIFx1Yzc5MFx1YjhjYw0KLWVzdGltYXRpbmdUZWNobmlxdWVUZXh0PVx1YzYwOFx1YzBjMSBcdWFlMzBcdWJjOTUNCi1hZGRpdGlvbmFsVGV4dD1cdWNkOTRcdWFjMDANCi1tb2RpZmllc1RleHQ9XHVjMjE4XHVjODE1DQotYWRkaXRpb25hbGx5UGVyZm9ybXNUZXh0PVx1Y2Q5NFx1YWMwMCBcdWMyMThcdWQ1ODkNCi1pbmRleFRleHQ9XHVjMGM5XHVjNzc4DQotcHJlZml4VGV4dD1cdWM4MTFcdWI0NTBcdWJkODANCi1icmVha2Rvd25FbGVtZW50VGV4dD1cdWM3OTFcdWM1YzVcdWJkODRcdWI5NTggXHVjNjk0XHVjMThjKEJyZWFrZG93biBFbGVtZW50KQ0KLXN0ZXBzVGV4dD1cdWIyZThcdWFjYzQNCi1wcmVkZWNlc3NvcnNUZXh0PVx1YzEyMFx1ZDU4OQ0KLXJlcGVhdGFibGVUZXh0PVx1YmMxOFx1YmNmNSBcdWFjMDBcdWIyYTVcdWQ1NjgNCi10eXBlVGV4dD1cdWM3MjBcdWQ2MTUNCi1vbmdvaW5nVGV4dD1cdWM5YzRcdWQ1ODkgXHVjOTExXHVjNzg0DQotZXZlbnREcml2ZW5UZXh0PVx1Yzc3NFx1YmNhNFx1ZDJiOFx1Yjg1YyBcdWFkNmNcdWIzZDlcdWI0MjgNCi1tb2RlbEluZm9UZXh0PVx1YmFhOFx1YjM3OCBcdWM4MTVcdWJjZjQNCi1lbnRyeVN0YXRlVGV4dD1cdWMyZGNcdWM3OTEgXHVjMGMxXHVkMGRjDQotZXhpdFN0YXRlVGV4dD1cdWM4ODVcdWI4Y2MgXHVjMGMxXHVkMGRjDQotdGVhbVRleHQ9XHVkMzAwDQotcGFyZW50UGFja2FnZVRleHQ9XHVjMGMxXHVjNzA0IFx1ZDMyOFx1ZDBhNFx1YzljMA0KLWNvbnRhaW5lZFBhY2thZ2VzVGV4dD1cdWQzZWNcdWQ1NjhcdWI0MWMgXHVkMzI4XHVkMGE0XHVjOWMwDQotY29udGVudHNUZXh0PVx1Y2VlOFx1ZDE1MFx1Y2UyMA0KLWJhc2VkT25NZXRob2RSb2xlVGV4dD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNWVkXHVkNTYwXHVjNzQ0IFx1YWUzMFx1Y2QwOFx1Yjg1YyBcdWQ1NjgNCi1iYXNlZE9uTWV0aG9kVGFza1RleHQ9XHViYTU0XHVjMThjXHViNGRjIFx1ZDBjMFx1YzJhNFx1ZDA2Y1x1Yjk3YyBcdWFlMzBcdWNkMDhcdWI4NWMgXHVkNTY4DQotYmFzZWRPbk1ldGhvZFdvcmtQcm9kdWN0VGV4dD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzY1x1Yzc0NCBcdWFlMzBcdWNkMDhcdWI4NWMgXHVkNTY4DQotc3VtbWFyeVRleHQ9XHVjNjk0XHVjNTdkDQotcGVyZm9ybXNUZXh0PVx1YzIxOFx1ZDU4OVx1ZDU2OA0KLXJlcGxhY2VzVGV4dD1cdWJjMTRcdWFmYjhcdWFlMzANCi1jb250cmlidXRlc1RleHQ9XHVjZWU4XHVkMmI4XHViOWFjXHViZGYwXHVjMTU4DQotbm9uZVRleHQ9XHVjNWM2XHVjNzRjDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zVGV4dD1cdWM2MDhcdWMwYzEgXHVhY2UwXHViODI0XHVjMGFjXHVkNTZkDQotYWN0aXZpdHlSZWZlcmVuY2VzVGV4dD1cdWQ2NWNcdWIzZDkgXHVjYzM4XHVjODcwDQotbmFtZVRleHQ9XHVjNzc0XHViOTg0DQotcHJlc2VudGF0aW9uTmFtZVRleHQ9XHVkNDVjXHVjMmRjIFx1Yzc3NFx1Yjk4NA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQveHNsL3Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ODRjMGUyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBUaGUgVUkgdGV4dCBpbiB0aGUgWFNMIHN0eWxlc2hlZXRzLg0KLQ0KLWFkZGl0aW9uYWxJbmZvVGV4dD1JbmZvcm1hXHUwMGU3XHUwMGY1ZXMgQWRpY2lvbmFpcw0KLWFkZGl0aW9uYWxQZXJmb3JtZXJUZXh0PUV4ZWN1dG9yZXMgQWRpY2lvbmFpcw0KLWFnZ3JlZ2F0ZXNUZXh0PUFncmVnYWRvcw0KLWFsdGVybmF0aXZlc1RleHQ9QWx0ZXJuYXRpdmFzDQotYXBwbGljYXRpb25UZXh0PUFwbGljYXRpdm8NCi1hcnRpZmFjdFRleHQ9QXJ0ZWZhdG8NCi1hc3NldHNUZXh0PUF0aXZvcw0KLWFzc2lnbm1lbnRBcHByb2FjaGVzVGV4dD1BYm9yZGFnZW5zIGRhIERlc2lnbmFcdTAwZTdcdTAwZTNvDQotYXNzaXN0aW5nVGV4dD1Bc3Npc3RlbnRlDQotYmFja2dyb3VuZFRleHQ9SW5mb3JtYVx1MDBlN1x1MDBmNWVzIERldGFsaGFkYXMNCi1icmllZk91dGxpbmVUZXh0PUJyZXZlIFJlc3Vtbw0KLWNoZWNrSXRlbXNUZXh0PUl0ZW5zIGRlIFZlcmlmaWNhXHUwMGU3XHUwMGUzbw0KLWNoZWNrbGlzdHNUZXh0PUxpc3RhcyBkZSBWZXJpZmljYVx1MDBlN1x1MDBlM28NCi1jb2xsYXBzZUFsbFRleHQ9UmVkdXppciBUb2RvcyBvcyBJdGVucyBkZSBWZXJpZmljYVx1MDBlN1x1MDBlM28NCi1jb21wb3NpdGVSb2xlVGV4dD1GdW5cdTAwZTdcdTAwZTNvIGRlIENvbXBvc2lcdTAwZTdcdTAwZTNvDQotY29uY2VwdHNUZXh0PUNvbmNlaXRvcw0KLWNvbnRhaW5lZEFydGlmYWN0c1RleHQ9QXJ0ZWZhdG8gQ29udGlkbw0KLWNvbnRhaW5lckFydGlmYWN0VGV4dD1BcnRlZmF0byBkbyBDb250XHUwMGVhaW5lcg0KLWNvbnRlbnRFbGVtZW50c1RleHQ9RWxlbWVudG9zIENhdGVnb3JpemFkb3MNCi1jb250ZW50UmVmZXJlbmNlc1RleHQ9UmVmZXJcdTAwZWFuY2lhcyBkZSBDb250ZVx1MDBmYWRvDQotZGVsaXZlcmFibGVUZXh0PURpc3RyaWJ1XHUwMGVkdmVsDQotZGVsaXZlcmFibGVQcm9wZXJ0aWVzVGV4dD1Qcm9wcmllZGFkZXMgRGlzdHJpYnVcdTAwZWR2ZWlzDQotZGVsaXZlcmVkUGFydHNUZXh0PVBhcnRlcyBEaXN0cmlidVx1MDBlZHZlaXMNCi1kZWxpdmVyZWRXb3JrUHJvZHVjdHNUZXh0PVByb2R1dG9zIGRlIFRyYWJhbGhvIEVudHJlZ3Vlcw0KLWRlcGVuZGVudFRleHQ9UHJvZHV0b3MgZGUgVHJhYmFsaG8gRGVwZW5kZW50ZXMNCi1kZXNjcmlwdGlvblRleHQ9RGVzY3JpXHUwMGU3XHUwMGUzbw0KLWRpc2NpcGxpbmVUZXh0PURpc2NpcGxpbmENCi1kaXNjaXBsaW5lc1RleHQ9RGlzY2lwbGluYXMNCi1zdWJkaXNjaXBsaW5lc1RleHQ9U3ViZGlzY2lwbGluYXMNCi1kb21haW5UZXh0PURvbVx1MDBlZG5pbw0KLWRvbWFpbnNUZXh0PURvbVx1MDBlZG5pb3MNCi1leGFtcGxlc1RleHQ9RXhlbXBsb3MNCi1leHBhbmRBbGxUZXh0PUV4cGFuZGlyIFRvZG9zIG9zIEl0ZW5zIGRlIFZlcmlmaWNhXHUwMGU3XHUwMGUzbw0KLWV4dGVuZHNUZXh0PUV4dGVuc1x1MDBmNWVzDQotZXh0ZXJuYWxUZXh0PUV4dGVybm8NCi1leHRlcm5hbERlc2NyaXB0aW9uVGV4dD1EZXNjcmlcdTAwZTdcdTAwZTNvIEV4dGVybmENCi1nb2Fsc1RleHQ9TWV0YXMNCi1ndWlkZWxpbmVzVGV4dD1EaXJldHJpemVzDQotaWxsdXN0cmF0aW9uc1RleHQ9SWx1c3RyYVx1MDBlN1x1MDBmNWVzCQ0KLWltcGFjdE9mTm90SGF2aW5nVGV4dD1JbXBhY3RvIGRlIG5cdTAwZTNvIHRlcg0KLWltcGFjdGluZ1RleHQ9UHJvZHV0b3MgZGUgVHJhYmFsaG8gSW1wYWN0YW50ZXMNCi1pbnB1dHNUZXh0PUVudHJhZGFzDQotaW5wdXRUb1RleHQ9RW50cmFkYSBwYXJhDQotaXRlbXNUZXh0PUl0ZW5zDQota2V5Q29uc2lkZXJhdGlvbnNUZXh0PUNvbnNpZGVyYVx1MDBlN1x1MDBmNWVzIGRlIFRlY2xhcw0KLWxldmVsc09mQWRvcHRpb25UZXh0PU5cdTAwZWR2ZWlzIGRlIEFkb1x1MDBlN1x1MDBlM28NCi1tYW5kYXRvcnlUZXh0PU9icmlnYXRcdTAwZjNyaW8NCi1tYWluVGV4dD1QcmluY2lwYWwNCi1tYWluRGVzY3JpcHRpb25UZXh0PURlc2NyaVx1MDBlN1x1MDBlM28gUHJpbmNpcGFsDQotbWFpblJlc3BvbnNpYmxlVGV4dD1SZXNwb25zXHUwMGUxdmVsIFByaW5jaXBhbA0KLW1ldGhvZFRleHQ9TVx1MDBlOXRvZG8gZG8gUHJvZHV0byBkZSBUcmFiYWxobw0KLW1vZGlmaWVkQnlUZXh0PU1vZGlmaWNhZG8gUG9yDQotbW9yZUluZm9UZXh0PUluZm9ybWFcdTAwZTdcdTAwZjVlcyBBZGljaW9uYWlzDQotbm90YXRpb25UZXh0PU5vdGFcdTAwZTdcdTAwZTNvDQotb3B0aW9uYWxUZXh0PU9wY2lvbmFsDQotb3V0Y29tZVRleHQ9UmVzdWx0YWRvDQotb3V0cHV0RnJvbVRleHQ9U2FcdTAwZWRkYSBkZQ0KLW91dHB1dHNUZXh0PVNhXHUwMGVkZGFzDQotcGFja2FnaW5nSW5zdHJ1Y3Rpb25zVGV4dD1JbnN0cnVcdTAwZTdcdTAwZjVlcyBkZSBFbWJhbGFnZW0NCi1wYWNrYWdpbmdHdWlkYW5jZVRleHQ9T3JpZW50YVx1MDBlN1x1MDBlM28gZGUgUGFjb3RlDQotcGVyZm9ybWluZ1JvbGVzVGV4dD1EZXNlbXBlbmhhbmRvIEZ1blx1MDBlN1x1MDBmNWVzDQotcHJpbWFyeVBlcmZvcm1lclRleHQ9RXhlY3V0b3IgUHJpbVx1MDBlMXJpbw0KLXByb2JsZW1UZXh0PVByb2JsZW1hDQotcHJvcGVydGllc1RleHQ9UHJvcHJpZWRhZGVzDQotcHVycG9zZVRleHQ9T2JqZXRpdm8NCi1yZWFzb25zRm9yTm90TmVlZGluZ1RleHQ9TW90aXZvcyBQYXJhIE5cdTAwZTNvIFByZWNpc2FyDQotcmVmZXJlbmNlV29ya2Zsb3dzVGV4dD1GbHV4b3MgZGUgVHJhYmFsaG8gZGUgUmVmZXJcdTAwZWFuY2lhDQotcmVsYXRlZEVsZW1lbnRzVGV4dD1FbGVtZW50b3MgUmVsYWNpb25hZG9zDQotcmVsYXRpb25zaGlwc1RleHQ9UmVsYWNpb25hbWVudG9zDQotcmVwb3J0c1RleHQ9UmVsYXRcdTAwZjNyaW9zDQotcmVwcmVzZW50YXRpb25PcHRpb25zVGV4dD1PcFx1MDBlN1x1MDBmNWVzIGRlIFJlcHJlc2VudGFcdTAwZTdcdTAwZTNvDQotcmVzcG9uc2libGVUZXh0PVJlc3BvbnNcdTAwZTF2ZWwNCi1yZXNwb25zaWJsZUZvclRleHQ9UmVzcG9uc1x1MDBlMXZlbCBwb3INCi1yZXVzYWJsZUFzc2V0c1RleHQ9UmVjdXJzb3MgUmV1dGlsaXpcdTAwZTF2ZWlzDQotcm9sZVRleHQ9RnVuXHUwMGU3XHUwMGUzbw0KLXJvbGVzVGV4dD1GdW5cdTAwZTdcdTAwZjVlcw0KLXJvbGVTZXRzVGV4dD1Db25qdW50b3MgZGUgRnVuXHUwMGU3XHUwMGY1ZXMNCi1za2lsbHNUZXh0PUhhYmlsaWRhZGVzDQotc3RhZmZpbmdUZXh0PUNyaWFcdTAwZTdcdTAwZTNvIGRhIEVxdWlwZQ0KLXN0ZXBzVGV4dD1FdGFwYXMNCi1zdWJjYXRlZ29yaWVzVGV4dD1TdWJjYXRlZ29yaWFzDQotc3ViZG9tYWluc1RleHQ9U3ViZG9tXHUwMGVkbmlvcw0KLXN1YlByYWN0aWNlc1RleHQ9U3VicHJcdTAwZTF0aWNhcw0KLXN1cGVyVGVhbVRleHQ9UGVyZmlsIGRhIFN1cGVyIEVxdWlwZQ0KLXN1cHBvcnRpbmdNYXRlcmlhbHNUZXh0PU1hdGVyaWFpcyBkZSBTdXBvcnRlDQotc3VidGVhbXNUZXh0PVBlcmZpcyBkYXMgU3ViLWVxdWlwZXMNCi1zeW5vbnltc1RleHQ9U2luXHUwMGY0bmltb3MNCi10YWlsb3JpbmdUZXh0PUFkYXB0YVx1MDBlN1x1MDBlM28NCi10YXNrVGV4dD1UYXJlZmENCi10YXNrc1RleHQ9VGFyZWZhcw0KLXRic1RleHQ9QWxvY2FcdTAwZTdcdTAwZTNvIGRlIEVxdWlwZQ0KLXRlYW1Qcm9maWxlVGV4dD1QZXJmaWwgZGEgRXF1aXBlDQotdGVhbVJvbGVzVGV4dD1GdW5cdTAwZTdcdTAwZjVlcyBkbyBQZXJmaWwgZGEgRXF1aXBlDQotdGVjaG5pcXVlc1RleHQ9RGlyZXRyaXplcw0KLXRlbXBsYXRlRmlsZXNUZXh0PUFycXVpdm9zIGRlIEdhYmFyaXRvDQotdGVtcGxhdGVzVGV4dD1HYWJhcml0b3MNCi10b29sTWVudG9yc1RleHQ9TWVudG9yZXMgZGUgRmVycmFtZW50YXMNCi10b29sVGV4dD1GZXJyYW1lbnRhDQotdXNhZ2VUZXh0PVVzbw0KLXdic1RleHQ9RXN0cnV0dXJhIGRlIERlY29tcG9zaVx1MDBlN1x1MDBlM28gZGUgVHJhYmFsaG8NCi13aGl0ZXBhcGVyc1RleHQ9V2hpdGUgcGFwZXJzDQotd29ya1Byb2R1Y3RzVGV4dD1Qcm9kdXRvcyAgICAgICAgICAgZGUgVHJhYmFsaG8NCi13b3JrUHJvZHVjdFR5cGVzVGV4dD1UaXBvcyBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotd3Bic1RleHQ9VXNvIGRlIFByb2R1dG8gZGUgVHJhYmFsaG8NCi13b3JrQnJlYWtkb3duVGV4dD1JbnRlcnJ1cFx1MDBlN1x1MDBlM28gZG8gVHJhYmFsaG8NCi13b3JrZmxvd1RleHQ9RGV0YWxoZSBkbyBGbHV4byBkZSBUcmFiYWxobzoNCi13b3JrUHJvZHVjdEJyZWFrZG93blRleHQ9SW50ZXJydXBcdTAwZTdcdTAwZTNvIGRvIFByb2R1dG8gZGUgVHJhYmFsaG8NCi13b3JrUHJvZHVjdERlcGVuZGVuY2llc1RleHQ9RGVwZW5kXHUwMGVhbmNpYXMgZG8gUHJvZHV0byBkZSBUcmFiYWxobw0KLXRlYW1Qcm9maWxlQnJlYWtkb3duVGV4dD1JbnRlcnJ1cFx1MDBlN1x1MDBlM28gZGUgRXF1aXBlDQotdGVhbVN0cnVjdHVyZVRleHQ9RXN0cnV0dXJhIGRhIEVxdWlwZQ0KLXBhZ2VOb3RJbnN0YWxsZWRUZXh0PVBcdTAwZTFnaW5hIE5cdTAwZTNvIEluc3RhbGFkYQ0KLWVsZW1lbnREb2VzTm90RXhpc3RUZXh0PUVsZW1lbnRvIE5cdTAwZTNvIEV4aXN0ZQ0KLWlzTm90VmFsaWRUZXh0PU8gZWxlbWVudG8gcmVmZXJlbmNpYWRvIG5cdTAwZTNvIFx1MDBlOSB1bSBlbGVtZW50byB2XHUwMGUxbGlkbyBuYSBiaWJsaW90ZWNhIGF0dWFsLg0KLWVsZW1lbnRNaWdodEJlRGVsZXRlZFRleHQ9TyBlbGVtZW50byBwb2RlIHRlciBzaWRvIGV4Y2x1XHUwMGVkZG8gZGEgYmlibGlvdGVjYS4NCi1wbGVhc2VGaXhMaW5rVGV4dD1WZXJpZmlxdWUgc3VhIGJpYmxpb3RlY2EgZGUgY29udGVcdTAwZmFkbyBlIGNvcnJpamEgbyBsaW5rLg0KLWluZm9BYm91dE1pc3NpbmdFbGVtZW50VGV4dD1JbmZvcm1hXHUwMGU3XHUwMGY1ZXMgc29icmUgbyBlbGVtZW50byBhdXNlbnRlOg0KLWVsZW1lbnROYW1lVGV4dD1Ob21lIGRvIEVsZW1lbnRvOg0KLWd1aWRUZXh0PUdVSUQ6DQotbWlzc2luZ0VsZW1lbnRUZXh0PUEgcFx1MDBlMWdpbmEgcmVmZXJlbmNpYWRhIG5cdTAwZTNvIGVzdFx1MDBlMSBuZXN0YSBjb25maWd1cmFcdTAwZTdcdTAwZTNvDQotbm90QXZhaWxhYmxlVGV4dD1BIHBcdTAwZTFnaW5hIHJlZmVyZW5jaWFkYSBuXHUwMGUzbyBlc3RcdTAwZTEgZGlzcG9uXHUwMGVkdmVsIG5hIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gYXR1YWwuIEVzdGEgcFx1MDBlMWdpbmEgcG9kZSBlc3RhciBkaXNwb25cdTAwZWR2ZWwgZW0gb3V0cmEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBkbyBwcm9jZXNzby4NCi1lbGVtZW50VHlwZVRleHQ9VGlwbyBkZSBFbGVtZW50bzoNCi1wbHVnaW5OYW1lVGV4dD1Ob21lIGRvIFBsdWctaW46DQotcHJlZGVjZXNzb3JUZXh0PVByZWRlY2Vzc29yDQotcGxhbm5pbmdEYXRhVGV4dD1QbGFubmluZ0RhdGENCi1tdWx0aXBsZU9jY3VycmVuY2VzVGV4dD1NXHUwMGZhbHRpcGxhcyBPY29yclx1MDBlYW5jaWFzDQotZXZlbnREcml2ZW5UZXh0PU9yaWVudGFkbyBwb3IgRXZlbnRvDQotb25nb2luZ1RleHQ9RW0gQW5kYW1lbnRvDQotcGxhbm5lZFRleHQ9UGxhbmVqYWRvDQotcmVwZWF0YWJsZVRleHQ9UmVwZXRcdTAwZWR2ZWwNCi11c2FnZUd1aWRhbmNlVGV4dD1PcmllbnRhXHUwMGU3XHUwMGUzbyBkZSBVc28NCi1pbnB1dHNUZXh0PUVudHJhZGFzDQotb3V0cHV0c1RleHQ9U2FcdTAwZWRkYXMNCi1hY3Rpdml0eUVudHJ5U3RhdGVUZXh0PUVzdGFkbyBkZSBFbnRyYWRhIGRhIEF0aXZpZGFkZQ0KLWFjdGl2aXR5RXhpdFN0YXRlVGV4dD1Fc3RhZG8gZGUgU2FcdTAwZWRkYSBkYSBBdGl2aWRhZGUNCi1wcmVmaXhUZXh0PVByZWZpeG8NCi1leHRlcm5hbElkVGV4dD1JRCBleHRlcm5vDQotc2NvcGVUZXh0PUVzY29wbw0KLXJvYWRtYXBUZXh0PVJvdGVpcm8NCi10eXBlb2ZDb250cmFjdFRleHQ9VGlwbyBkZSBDb250cmF0bw0KLXByb2plY3RDaGFyYWN0ZXJpc3RpY3NUZXh0PUNhcmFjdGVyXHUwMGVkc3RpY2FzIGRvIFByb2pldG8NCi1wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlVGV4dD1Db25oZWNpbWVudG8gZG8gTWVtYnJvIGRvIFByb2pldG8NCi1yaXNrTGV2ZWxUZXh0PU5cdTAwZWR2ZWwgZGUgUmlzY28NCi1zY2FsZVRleHQ9RXNjYWxhDQotdXNhZ2VOb3Rlc1RleHQ9Tm90YXMgZGUgVXNvDQotY29udGV4dFRleHQ9Q29udGV4dG8NCi1wYXJlbnRBY3Rpdml0aWVzVGV4dD1BdGl2aWRhZGVzIFBhaQ0KLWluY2x1ZGVkUGF0dGVybnNUZXh0PVBhZHJcdTAwZTNvIEluY2x1XHUwMGVkZG8NCi1jaGVja2xpc3RUZXh0PUxpc3RhIGRlIFZlcmlmaWNhXHUwMGU3XHUwMGUzbw0KLWNvbW11bmljYXRpb25zTWF0ZXJpYWxzVGV4dD1NYXRlcmlhaXMgZGUgQ29tdW5pY2FcdTAwZTdcdTAwZjVlcw0KLWVkdWNhdGlvbk1hdGVyaWFsc1RleHQ9TWF0ZXJpYWlzIGRlIEVkdWNhXHUwMGU3XHUwMGUzbw0KLWVzdGltYXRpbmdUZWNobmlxdWVUZXh0PVRcdTAwZTljbmljYSBkZSBFc3RpbWF0aXZhDQotYWRkaXRpb25hbFRleHQ9QWRpY2lvbmFsDQotbW9kaWZpZXNUZXh0PU1vZGlmaWNhDQotYWRkaXRpb25hbGx5UGVyZm9ybXNUZXh0PUFkaWNpb25hbG1lbnRlIERlc2VtcGVuaGENCi1pbmRleFRleHQ9XHUwMGNkbmRpY2UNCi1wcmVmaXhUZXh0PVByZWZpeG8NCi1icmVha2Rvd25FbGVtZW50VGV4dD1FbGVtZW50byBkZSBEaXZpc1x1MDBlM28NCi1zdGVwc1RleHQ9RXRhcGFzDQotcHJlZGVjZXNzb3JzVGV4dD1QcmVkZWNlc3NvcmVzDQotcmVwZWF0YWJsZVRleHQ9UmVwZXRcdTAwZWR2ZWwNCi10eXBlVGV4dD1UaXBvDQotb25nb2luZ1RleHQ9RW0gQW5kYW1lbnRvDQotZXZlbnREcml2ZW5UZXh0PU9yaWVudGFkbyBhIEV2ZW50bw0KLW1vZGVsSW5mb1RleHQ9SW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRvIE1vZGVsbw0KLWVudHJ5U3RhdGVUZXh0PUVzdGFkbyBkZSBFbnRyYWRhDQotZXhpdFN0YXRlVGV4dD1Fc3RhZG8gZGUgU2FcdTAwZWRkYQ0KLXRlYW1UZXh0PUVxdWlwZQ0KLXBhcmVudFBhY2thZ2VUZXh0PVBhY290ZSBQYWkNCi1jb250YWluZWRQYWNrYWdlc1RleHQ9UGFjb3RlcyBJbmNsdVx1MDBlZGRvcw0KLWNvbnRlbnRzVGV4dD1Db250ZVx1MDBmYWRvDQotYmFzZWRPbk1ldGhvZFJvbGVUZXh0PUJhc2VhZG8gZW0gRnVuXHUwMGU3XHUwMGUzbyBkZSBNXHUwMGU5dG9kbw0KLWJhc2VkT25NZXRob2RUYXNrVGV4dD1CYXNlYWRvIGVtIFRhcmVmYSBkZSBNXHUwMGU5dG9kbw0KLWJhc2VkT25NZXRob2RXb3JrUHJvZHVjdFRleHQ9QmFzZWFkbyBubyBNXHUwMGU5dG9kbyBkbyBQcm9kdXRvIGRlIFRyYWJhbGhvDQotc3VtbWFyeVRleHQ9UmVzdW1vDQotcGVyZm9ybXNUZXh0PURlc2VtcGVuaGENCi1yZXBsYWNlc1RleHQ9U3Vic3RpdHVpDQotY29udHJpYnV0ZXNUZXh0PUNvbnRyaWJ1aQ0KLW5vbmVUZXh0PU5lbmh1bQ0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc1RleHQ9Q29uc2lkZXJhXHUwMGU3XHUwMGY1ZXMgRXN0aW1hdGl2YXMNCi1hY3Rpdml0eVJlZmVyZW5jZXNUZXh0PVJlZmVyXHUwMGVhbmNpYXMgZGUgQXRpdmlkYWRlDQotbmFtZVRleHQ9Tm9tZQ0KLXByZXNlbnRhdGlvbk5hbWVUZXh0PU5vbWUgZGEgYXByZXNlbnRhXHUwMGU3XHUwMGUzbw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQveHNsL3Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDI0ZmE5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL2xheW91dC94c2wvcmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBUaGUgVUkgdGV4dCBpbiB0aGUgWFNMIHN0eWxlc2hlZXRzLg0KLQ0KLWFkZGl0aW9uYWxJbmZvVGV4dD1cdTUxNzZcdTRlZDZcdTRmZTFcdTYwNmYNCi1hZGRpdGlvbmFsUGVyZm9ybWVyVGV4dD1cdTUxNzZcdTRlZDZcdTYyNjdcdTg4NGNcdTgwMDUNCi1hZ2dyZWdhdGVzVGV4dD1cdTgwNWFcdTk2YzYNCi1hbHRlcm5hdGl2ZXNUZXh0PVx1NjZmZlx1NGVlM1x1NjViOVx1Njg0OA0KLWFwcGxpY2F0aW9uVGV4dD1cdTVlOTRcdTc1MjhcdTdhMGJcdTVlOGYNCi1hcnRpZmFjdFRleHQ9XHU1ZGU1XHU0ZWY2DQotYXNzZXRzVGV4dD1cdThkNDRcdTRlYTcNCi1hc3NpZ25tZW50QXBwcm9hY2hlc1RleHQ9XHU1MjA2XHU5MTRkXHU2NWI5XHU2Y2Q1DQotYXNzaXN0aW5nVGV4dD1cdThmODVcdTUyYTkNCi1iYWNrZ3JvdW5kVGV4dD1cdTgwY2NcdTY2NmYNCi1icmllZk91dGxpbmVUZXh0PVx1N2I4MFx1OGZmMA0KLWNoZWNrSXRlbXNUZXh0PVx1NjhjMFx1NjdlNVx1OTg3OQ0KLWNoZWNrbGlzdHNUZXh0PVx1NjgzOFx1NWJmOVx1ODg2OA0KLWNvbGxhcHNlQWxsVGV4dD1cdTYyOThcdTUzZTBcdTYyNDBcdTY3MDlcdTY4YzBcdTY3ZTVcdTk4NzkNCi1jb21wb3NpdGVSb2xlVGV4dD1cdTdlYzRcdTU0MDhcdTg5ZDJcdTgyNzINCi1jb25jZXB0c1RleHQ9XHU2OTgyXHU1ZmY1DQotY29udGFpbmVkQXJ0aWZhY3RzVGV4dD1cdTUzMDVcdTU0MmJcdTc2ODRcdTVkZTVcdTRlZjYNCi1jb250YWluZXJBcnRpZmFjdFRleHQ9XHU1YmI5XHU1NjY4XHU1ZGU1XHU0ZWY2DQotY29udGVudEVsZW1lbnRzVGV4dD1cdTUyMDZcdTdjN2JcdTUxNDNcdTdkMjANCi1jb250ZW50UmVmZXJlbmNlc1RleHQ9XHU1MTg1XHU1YmI5XHU1ZjE1XHU3NTI4DQotZGVsaXZlcmFibGVUZXh0PVx1NTNlZlx1NGVhNFx1NGVkOFx1NGVmNg0KLWRlbGl2ZXJhYmxlUHJvcGVydGllc1RleHQ9XHU1M2VmXHU0ZWE0XHU0ZWQ4XHU0ZWY2XHU1YzVlXHU2MDI3DQotZGVsaXZlcmVkUGFydHNUZXh0PVx1NTNlZlx1NGVhNFx1NGVkOFx1OTBlOFx1NGVmNg0KLWRlbGl2ZXJlZFdvcmtQcm9kdWN0c1RleHQ9XHU0ZWE0XHU0ZWQ4XHU3Njg0XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotZGVwZW5kZW50VGV4dD1cdTRmOWRcdThkNTZcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzENCi1kZXNjcmlwdGlvblRleHQ9XHU2M2NmXHU4ZmYwDQotZGlzY2lwbGluZVRleHQ9XHU4OWM0XHU3YTBiDQotZGlzY2lwbGluZXNUZXh0PVx1ODljNFx1N2EwYg0KLXN1YmRpc2NpcGxpbmVzVGV4dD1cdTViNTBcdTg5YzRcdTdhMGINCi1kb21haW5UZXh0PVx1NTdkZg0KLWRvbWFpbnNUZXh0PVx1NTdkZg0KLWV4YW1wbGVzVGV4dD1cdTc5M2FcdTRmOGINCi1leHBhbmRBbGxUZXh0PVx1NWM1NVx1NWYwMFx1NjI0MFx1NjcwOVx1NjhjMFx1NjdlNVx1OTg3OQ0KLWV4dGVuZHNUZXh0PVx1NjI2OVx1NWM1NQ0KLWV4dGVybmFsVGV4dD1cdTU5MTZcdTkwZTgNCi1leHRlcm5hbERlc2NyaXB0aW9uVGV4dD1cdTU5MTZcdTkwZThcdTYzY2ZcdThmZjANCi1nb2Fsc1RleHQ9XHU3NmVlXHU2ODA3DQotZ3VpZGVsaW5lc1RleHQ9XHU2MzA3XHU1MzU3DQotaWxsdXN0cmF0aW9uc1RleHQ9XHU1NmZlXHU3OTNhDQotaW1wYWN0T2ZOb3RIYXZpbmdUZXh0PVx1NGUwZFx1NTE3N1x1NjcwOVx1NzY4NFx1NWY3MVx1NTRjZA0KLWltcGFjdGluZ1RleHQ9XHU0ZWE3XHU3NTFmXHU1ZjcxXHU1NGNkXHU3Njg0XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotaW5wdXRzVGV4dD1cdThmOTNcdTUxNjUNCi1pbnB1dFRvVGV4dD1cdThmOTNcdTUxNjVcdTgxZjMNCi1pdGVtc1RleHQ9XHU5ODc5DQota2V5Q29uc2lkZXJhdGlvbnNUZXh0PVx1NTE3M1x1OTUyZVx1NmNlOFx1NjEwZlx1NGU4Ylx1OTg3OQ0KLWxldmVsc09mQWRvcHRpb25UZXh0PVx1OTFjN1x1NzUyOFx1NzY4NFx1N2VhN1x1NTIyYg0KLW1hbmRhdG9yeVRleHQ9XHU1ZmM1XHU5NzAwDQotbWFpblRleHQ9XHU0ZTNiXHU4OTgxDQotbWFpbkRlc2NyaXB0aW9uVGV4dD1cdTRlM2JcdTg5ODFcdTYzY2ZcdThmZjANCi1tYWluUmVzcG9uc2libGVUZXh0PVx1NGUzYlx1ODk4MVx1OGQyM1x1NGVmYg0KLW1ldGhvZFRleHQ9XHU2NWI5XHU2Y2Q1XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotbW9kaWZpZWRCeVRleHQ9XHU0ZmVlXHU2NTM5XHU4MDA1DQotbW9yZUluZm9UZXh0PVx1NjZmNFx1NTkxYVx1NGZlMVx1NjA2Zg0KLW5vdGF0aW9uVGV4dD1cdTZjZThcdTkxY2ENCi1vcHRpb25hbFRleHQ9XHU1M2VmXHU5MDA5DQotb3V0Y29tZVRleHQ9XHU3ZWQzXHU2NzljDQotb3V0cHV0RnJvbVRleHQ9XHU4ZjkzXHU1MWZhXHU4MWVhDQotb3V0cHV0c1RleHQ9XHU4ZjkzXHU1MWZhDQotcGFja2FnaW5nSW5zdHJ1Y3Rpb25zVGV4dD1cdTYyNTNcdTUzMDVcdTc2ODRcdTYzMDdcdTc5M2FcdTRmZTFcdTYwNmYNCi1wYWNrYWdpbmdHdWlkYW5jZVRleHQ9XHU2MjUzXHU1MzA1XHU3Njg0XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmDQotcGVyZm9ybWluZ1JvbGVzVGV4dD1cdTYyNjdcdTg4NGNcdTg5ZDJcdTgyNzINCi1wcmltYXJ5UGVyZm9ybWVyVGV4dD1cdTRlM2JcdTYyNjdcdTg4NGNcdTgwMDUNCi1wcm9ibGVtVGV4dD1cdTk1ZWVcdTk4OTgNCi1wcm9wZXJ0aWVzVGV4dD1cdTVjNWVcdTYwMjcNCi1wdXJwb3NlVGV4dD1cdTc1MjhcdTkwMTQNCi1yZWFzb25zRm9yTm90TmVlZGluZ1RleHQ9XHU0ZTBkXHU5NzAwXHU4OTgxXHU3Njg0XHU1MzlmXHU1NmUwDQotcmVmZXJlbmNlV29ya2Zsb3dzVGV4dD1cdTVmMTVcdTc1MjhcdTVkZTVcdTRmNWNcdTZkNDENCi1yZWxhdGVkRWxlbWVudHNUZXh0PVx1NzZmOFx1NTE3M1x1NTE0M1x1N2QyMA0KLXJlbGF0aW9uc2hpcHNUZXh0PVx1NTE3M1x1N2NmYg0KLXJlcG9ydHNUZXh0PVx1NjJhNVx1NTQ0YQ0KLXJlcHJlc2VudGF0aW9uT3B0aW9uc1RleHQ9XHU4YmY0XHU2NjBlXHU5MDA5XHU5ODc5DQotcmVzcG9uc2libGVUZXh0PVx1OGQxZlx1OGQyM1x1NGViYQ0KLXJlc3BvbnNpYmxlRm9yVGV4dD1cdThkMWZcdThkMjMNCi1yZXVzYWJsZUFzc2V0c1RleHQ9XHU1M2VmXHU5MWNkXHU3NTI4XHU4ZDQ0XHU0ZWE3DQotcm9sZVRleHQ9XHU4OWQyXHU4MjcyDQotcm9sZXNUZXh0PVx1ODlkMlx1ODI3Mg0KLXJvbGVTZXRzVGV4dD1cdTg5ZDJcdTgyNzJcdTk2YzYNCi1za2lsbHNUZXh0PVx1NjI4MFx1ODBmZA0KLXN0YWZmaW5nVGV4dD1cdTRlYmFcdTU0NThcdTkxNGRcdTU5MDcNCi1zdGVwc1RleHQ9XHU2YjY1XHU5YWE0DQotc3ViY2F0ZWdvcmllc1RleHQ9XHU1YjUwXHU3YzdiXHU1MjJiDQotc3ViZG9tYWluc1RleHQ9XHU1YjUwXHU1N2RmDQotc3ViUHJhY3RpY2VzVGV4dD1cdTViNTBcdTViOWVcdThkZjUNCi1zdXBlclRlYW1UZXh0PVx1OGQ4NVx1NTZlMlx1OTYxZlx1Njk4Mlx1ODk4MVx1NjU4N1x1NGVmNg0KLXN1cHBvcnRpbmdNYXRlcmlhbHNUZXh0PVx1NjUyZlx1NjMwMVx1Njc1MFx1NjU5OQ0KLXN1YnRlYW1zVGV4dD1cdTViNTBcdTU2ZTJcdTk2MWZcdTY5ODJcdTg5ODFcdTY1ODdcdTRlZjYNCi1zeW5vbnltc1RleHQ9XHU1NDBjXHU0ZTQ5XHU4YmNkDQotdGFpbG9yaW5nVGV4dD1cdTViOWFcdTUyMzYNCi10YXNrVGV4dD1cdTRlZmJcdTUyYTENCi10YXNrc1RleHQ9XHU0ZWZiXHU1MmExDQotdGJzVGV4dD1cdTU2ZTJcdTk2MWZcdTUyMDZcdTkxNGQNCi10ZWFtUHJvZmlsZVRleHQ9XHU1NmUyXHU5NjFmXHU2OTgyXHU4OTgxXHU2NTg3XHU0ZWY2DQotdGVhbVJvbGVzVGV4dD1cdTU2ZTJcdTk2MWZcdTY5ODJcdTg5ODFcdTY1ODdcdTRlZjZcdTg5ZDJcdTgyNzINCi10ZWNobmlxdWVzVGV4dD1cdTYzMDdcdTUzNTcNCi10ZW1wbGF0ZUZpbGVzVGV4dD1cdTZhMjFcdTY3N2ZcdTY1ODdcdTRlZjYNCi10ZW1wbGF0ZXNUZXh0PVx1NmEyMVx1Njc3Zg0KLXRvb2xNZW50b3JzVGV4dD1cdTVkZTVcdTUxNzdcdTU0MTFcdTViZmMNCi10b29sVGV4dD1cdTVkZTVcdTUxNzcNCi11c2FnZVRleHQ9XHU0ZjdmXHU3NTI4DQotd2JzVGV4dD1cdTVkZTVcdTRmNWNcdTUyMDZcdTg5ZTNcdTdlZDNcdTY3ODQNCi13aGl0ZXBhcGVyc1RleHQ9XHU3NjdkXHU3NmFlXHU0ZTY2DQotd29ya1Byb2R1Y3RzVGV4dD1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzENCi13b3JrUHJvZHVjdFR5cGVzVGV4dD1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTdjN2JcdTU3OGINCi13cGJzVGV4dD1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTRmN2ZcdTc1MjgNCi13b3JrQnJlYWtkb3duVGV4dD1cdTVkZTVcdTRmNWNcdTUyMDZcdTg5ZTMNCi13b3JrZmxvd1RleHQ9XHU1ZGU1XHU0ZjVjXHU2ZDQxDQotd29ya1Byb2R1Y3RCcmVha2Rvd25UZXh0PVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NTIwNlx1ODllMw0KLXdvcmtQcm9kdWN0RGVwZW5kZW5jaWVzVGV4dD1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTRmOWRcdThkNTZcdTUxNzNcdTdjZmINCi10ZWFtUHJvZmlsZUJyZWFrZG93blRleHQ9XHU1NmUyXHU5NjFmXHU1MjA2XHU4OWUzDQotdGVhbVN0cnVjdHVyZVRleHQ9XHU1NmUyXHU5NjFmXHU3ZWQzXHU2Nzg0DQotcGFnZU5vdEluc3RhbGxlZFRleHQ9XHU5ODc1XHU5NzYyXHU2NzJhXHU1Yjg5XHU4OGM1DQotZWxlbWVudERvZXNOb3RFeGlzdFRleHQ9XHU1MTQzXHU3ZDIwXHU0ZTBkXHU1YjU4XHU1NzI4DQotaXNOb3RWYWxpZFRleHQ9XHU1ZjE1XHU3NTI4XHU3Njg0XHU1MTQzXHU3ZDIwXHU1NzI4XHU1ZjUzXHU1MjRkXHU1ZTkzXHU0ZTJkXHU0ZTBkXHU2NjJmXHU2NzA5XHU2NTQ4XHU1MTQzXHU3ZDIwXHUzMDAyDQotZWxlbWVudE1pZ2h0QmVEZWxldGVkVGV4dD1cdThiZTVcdTUxNDNcdTdkMjBcdTUzZWZcdTgwZmRcdTVkZjJcdTRlY2VcdTVlOTNcdTRlMmRcdTUyMjBcdTk2NjRcdTMwMDINCi1wbGVhc2VGaXhMaW5rVGV4dD1cdThiZjdcdTY4YzBcdTY3ZTVcdTUxODVcdTViYjlcdTVlOTNcdTVlNzZcdTRmZWVcdTZiNjNcdTk0ZmVcdTYzYTVcdTMwMDINCi1pbmZvQWJvdXRNaXNzaW5nRWxlbWVudFRleHQ9XHU1MTczXHU0ZThlXHU3ZjNhXHU1YzExXHU3Njg0XHU1MTQzXHU3ZDIwXHU3Njg0XHU0ZmUxXHU2MDZmXHVmZjFhDQotZWxlbWVudE5hbWVUZXh0PVx1NTE0M1x1N2QyMFx1NTQwZFx1NzlmMFx1ZmYxYQ0KLWd1aWRUZXh0PUdVSURcdWZmMWENCi1taXNzaW5nRWxlbWVudFRleHQ9XHU1ZjE1XHU3NTI4XHU3Njg0XHU5ODc1XHU5NzYyXHU0ZTBkXHU1NzI4XHU2YjY0XHU5MTRkXHU3ZjZlXHU0ZTJkDQotbm90QXZhaWxhYmxlVGV4dD1cdTVmMTVcdTc1MjhcdTc2ODRcdTk4NzVcdTk3NjJcdTU3MjhcdTVmNTNcdTUyNGRcdTkxNGRcdTdmNmVcdTRlMmRcdTRlMGRcdTUzZWZcdTc1MjhcdTMwMDJcdTZiNjRcdTk4NzVcdTk3NjJcdTU3MjhcdTUzZTZcdTRlMDBcdTZkNDFcdTdhMGJcdTkxNGRcdTdmNmVcdTRlMmRcdTUzZWZcdTgwZmRcdTUzZWZcdTc1MjhcdTMwMDINCi1lbGVtZW50VHlwZVRleHQ9XHU1MTQzXHU3ZDIwXHU3YzdiXHU1NzhiXHVmZjFhDQotcGx1Z2luTmFtZVRleHQ9XHU2M2QyXHU0ZWY2XHU1NDBkXHU3OWYwXHVmZjFhDQotcHJlZGVjZXNzb3JUZXh0PVx1NTE0OFx1ODg0Y1x1NGY1Y1x1NGUxYQ0KLXBsYW5uaW5nRGF0YVRleHQ9XHU4OWM0XHU1MjEyXHU2NTcwXHU2MzZlDQotbXVsdGlwbGVPY2N1cnJlbmNlc1RleHQ9XHU1OTFhXHU2YjIxXHU1MWZhXHU3M2IwDQotZXZlbnREcml2ZW5UZXh0PVx1NGU4Ylx1NGVmNlx1OWE3MVx1NTJhOA0KLW9uZ29pbmdUZXh0PVx1NmI2M1x1NTcyOFx1OGZkYlx1ODg0Yw0KLXBsYW5uZWRUZXh0PVx1NWRmMlx1ODljNFx1NTIxMg0KLXJlcGVhdGFibGVUZXh0PVx1NTNlZlx1OTFjZFx1NTkwZA0KLXVzYWdlR3VpZGFuY2VUZXh0PVx1NGY3Zlx1NzUyOFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zg0KLWlucHV0c1RleHQ9XHU4ZjkzXHU1MTY1DQotb3V0cHV0c1RleHQ9XHU4ZjkzXHU1MWZhDQotYWN0aXZpdHlFbnRyeVN0YXRlVGV4dD1cdTZkM2JcdTUyYThcdThmZGJcdTUxNjVcdTcyYjZcdTYwMDENCi1hY3Rpdml0eUV4aXRTdGF0ZVRleHQ9XHU2ZDNiXHU1MmE4XHU5MDAwXHU1MWZhXHU3MmI2XHU2MDAxDQotcHJlZml4VGV4dD1cdTUyNGRcdTdmMDANCi1leHRlcm5hbElkVGV4dD1cdTU5MTZcdTkwZThcdTY4MDdcdThiYzYNCi1zY29wZVRleHQ9XHU4MzAzXHU1NmY0DQotcm9hZG1hcFRleHQ9XHU4ZGVmXHU3ZWJmXHU1NmZlDQotdHlwZW9mQ29udHJhY3RUZXh0PVx1NTQwOFx1NTQwY1x1NzY4NFx1N2M3Ylx1NTc4Yg0KLXByb2plY3RDaGFyYWN0ZXJpc3RpY3NUZXh0PVx1OTg3OVx1NzZlZVx1NzI3OVx1NWY4MQ0KLXByb2plY3RNZW1iZXJFeHBlcnRpc2VUZXh0PVx1OTg3OVx1NzZlZVx1NjIxMFx1NTQ1OFx1NGUxM1x1OTU3Zg0KLXJpc2tMZXZlbFRleHQ9XHU5OGNlXHU5NjY5XHU3ZWE3XHU1MjJiDQotc2NhbGVUZXh0PVx1N2YyOVx1NjUzZVx1NmJkNFx1NGY4Yg0KLXVzYWdlTm90ZXNUZXh0PVx1NGY3Zlx1NzUyOFx1OGJmNFx1NjYwZQ0KLWNvbnRleHRUZXh0PVx1NzNhZlx1NTg4Mw0KLXBhcmVudEFjdGl2aXRpZXNUZXh0PVx1NzIzNlx1NGVlM1x1NmQzYlx1NTJhOA0KLWluY2x1ZGVkUGF0dGVybnNUZXh0PVx1NTMwNVx1NTQyYlx1NzY4NFx1NmEyMVx1NWYwZg0KLWNoZWNrbGlzdFRleHQ9XHU2ODM4XHU1YmY5XHU4ODY4DQotY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNUZXh0PVx1OTAxYVx1NGZlMVx1Njc1MFx1NjU5OQ0KLWVkdWNhdGlvbk1hdGVyaWFsc1RleHQ9XHU2NTU5XHU1YjY2XHU2NzUwXHU2NTk5DQotZXN0aW1hdGluZ1RlY2huaXF1ZVRleHQ9XHU0ZjMwXHU3Yjk3XHU2MjgwXHU2NzJmDQotYWRkaXRpb25hbFRleHQ9XHU1MTc2XHU0ZWQ2DQotbW9kaWZpZXNUZXh0PVx1NGZlZVx1NjUzOQ0KLWFkZGl0aW9uYWxseVBlcmZvcm1zVGV4dD1cdThmZDhcdTYyNjdcdTg4NGMNCi1pbmRleFRleHQ9XHU3ZDIyXHU1ZjE1DQotcHJlZml4VGV4dD1cdTUyNGRcdTdmMDANCi1icmVha2Rvd25FbGVtZW50VGV4dD1cdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjANCi1zdGVwc1RleHQ9XHU2YjY1XHU5YWE0DQotcHJlZGVjZXNzb3JzVGV4dD1cdTUxNDhcdTg4NGNcdTRmNWNcdTRlMWENCi1yZXBlYXRhYmxlVGV4dD1cdTUzZWZcdTkxY2RcdTU5MGQNCi10eXBlVGV4dD1cdTdjN2JcdTU3OGINCi1vbmdvaW5nVGV4dD1cdTZiNjNcdTU3MjhcdThmZGJcdTg4NGMNCi1ldmVudERyaXZlblRleHQ9XHU0ZThiXHU0ZWY2XHU5YTcxXHU1MmE4DQotbW9kZWxJbmZvVGV4dD1cdTZhMjFcdTU3OGJcdTRmZTFcdTYwNmYNCi1lbnRyeVN0YXRlVGV4dD1cdThmZGJcdTUxNjVcdTcyYjZcdTYwMDENCi1leGl0U3RhdGVUZXh0PVx1OTAwMFx1NTFmYVx1NzJiNlx1NjAwMQ0KLXRlYW1UZXh0PVx1NTZlMlx1OTYxZg0KLXBhcmVudFBhY2thZ2VUZXh0PVx1NzIzNlx1NGVlM1x1NTMwNQ0KLWNvbnRhaW5lZFBhY2thZ2VzVGV4dD1cdTUzMDVcdTU0MmJcdTc2ODRcdTUzMDUNCi1jb250ZW50c1RleHQ9XHU1MTg1XHU1YmI5DQotYmFzZWRPbk1ldGhvZFJvbGVUZXh0PVx1NTdmYVx1NGU4ZVx1NjViOVx1NmNkNVx1ODlkMlx1ODI3Mg0KLWJhc2VkT25NZXRob2RUYXNrVGV4dD1cdTU3ZmFcdTRlOGVcdTY1YjlcdTZjZDVcdTRlZmJcdTUyYTENCi1iYXNlZE9uTWV0aG9kV29ya1Byb2R1Y3RUZXh0PVx1NTdmYVx1NGU4ZVx1NjViOVx1NmNkNVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMQ0KLXN1bW1hcnlUZXh0PVx1NjQ1OFx1ODk4MQ0KLXBlcmZvcm1zVGV4dD1cdTYyNjdcdTg4NGMNCi1yZXBsYWNlc1RleHQ9XHU2NmZmXHU2MzYyDQotY29udHJpYnV0ZXNUZXh0PVx1NjNkMFx1NGY5Yg0KLW5vbmVUZXh0PVx1NjVlMA0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc1RleHQ9XHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5DQotYWN0aXZpdHlSZWZlcmVuY2VzVGV4dD1cdTZkM2JcdTUyYThcdTVmMTVcdTc1MjgNCi1uYW1lVGV4dD1cdTU0MGRcdTc5ZjANCi1wcmVzZW50YXRpb25OYW1lVGV4dD1cdTY2M2VcdTc5M2FcdTU0MGRcdTc5ZjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQveHNsL3Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvbGF5b3V0L3hzbC9yZXNvdXJjZXNfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmRiOTlhNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9sYXlvdXQveHNsL3Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMgVGhlIFVJIHRleHQgaW4gdGhlIFhTTCBzdHlsZXNoZWV0cy4NCi0NCi1hZGRpdGlvbmFsSW5mb1RleHQ9XHU1MTc2XHU0ZWQ2XHU4Y2M3XHU4YTBhDQotYWRkaXRpb25hbFBlcmZvcm1lclRleHQ9XHU1MTc2XHU0ZWQ2XHU1N2Y3XHU4ODRjXHU4MDA1DQotYWdncmVnYXRlc1RleHQ9XHU1ZjU5XHU3ZTNkDQotYWx0ZXJuYXRpdmVzVGV4dD1cdTY2ZmZcdTRlZTNcdTY1YjlcdTY4NDgNCi1hcHBsaWNhdGlvblRleHQ9XHU2MWM5XHU3NTI4XHU3YTBiXHU1ZjBmDQotYXJ0aWZhY3RUZXh0PVx1NjljYlx1NGVmNg0KLWFzc2V0c1RleHQ9XHU4Y2M3XHU3NTIyDQotYXNzaWdubWVudEFwcHJvYWNoZXNUZXh0PVx1NjMwN1x1NmQzZVx1NjViOVx1NmNkNQ0KLWFzc2lzdGluZ1RleHQ9XHU1MzU0XHU1MmE5DQotYmFja2dyb3VuZFRleHQ9XHU4MGNjXHU2NjZmDQotYnJpZWZPdXRsaW5lVGV4dD1cdTY5ODJcdTc1NjVcdThmMmFcdTVlZDMNCi1jaGVja0l0ZW1zVGV4dD1cdTZhYTJcdTY3ZTVcdTk4MDVcdTc2ZWUNCi1jaGVja2xpc3RzVGV4dD1cdTY4MzhcdTVjMGRcdTZlMDVcdTU1YWUNCi1jb2xsYXBzZUFsbFRleHQ9XHU2NTM2XHU1NDA4XHU1MTY4XHU5MGU4XHU2YWEyXHU2N2U1XHU5ODA1XHU3NmVlDQotY29tcG9zaXRlUm9sZVRleHQ9XHU4OTA3XHU1NDA4XHU4OWQyXHU4MjcyDQotY29uY2VwdHNUZXh0PVx1Njk4Mlx1NWZmNQ0KLWNvbnRhaW5lZEFydGlmYWN0c1RleHQ9XHU1MTY3XHU1NDJiXHU3Njg0XHU2OWNiXHU0ZWY2DQotY29udGFpbmVyQXJ0aWZhY3RUZXh0PVx1NTEzMlx1NWI1OFx1NTY2OFx1NjljYlx1NGVmNg0KLWNvbnRlbnRFbGVtZW50c1RleHQ9XHU1ZGYyXHU1MjA2XHU5ODVlXHU3Njg0XHU1MTQzXHU3ZDIwDQotY29udGVudFJlZmVyZW5jZXNUZXh0PVx1NTE2N1x1NWJiOVx1NTNjM1x1NzE2Nw0KLWRlbGl2ZXJhYmxlVGV4dD1cdTRlYTRcdTRlZDhcdTk4MDVcdTc2ZWUNCi1kZWxpdmVyYWJsZVByb3BlcnRpZXNUZXh0PVx1NGVhNFx1NGVkOFx1OTgwNVx1NzZlZVx1NTE2N1x1NWJiOQ0KLWRlbGl2ZXJlZFBhcnRzVGV4dD1cdTRlYTRcdTRlZDhcdTk4MDVcdTc2ZWVcdTdkNDRcdTRlZjYNCi1kZWxpdmVyZWRXb3JrUHJvZHVjdHNUZXh0PVx1OTA1ZVx1OTAwMVx1NzY4NFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLWRlcGVuZGVudFRleHQ9XHU3NmY4XHU0ZjlkXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljDQotZGVzY3JpcHRpb25UZXh0PVx1OGFhYVx1NjYwZQ0KLWRpc2NpcGxpbmVUZXh0PVx1ODk4Zlx1N2JjNA0KLWRpc2NpcGxpbmVzVGV4dD1cdTg5OGZcdTdiYzQNCi1zdWJkaXNjaXBsaW5lc1RleHQ9XHU1YjUwXHU4OThmXHU3YmM0DQotZG9tYWluVGV4dD1cdTk4MThcdTU3ZGYNCi1kb21haW5zVGV4dD1cdTk4MThcdTU3ZGYNCi1leGFtcGxlc1RleHQ9XHU3YmM0XHU0ZjhiDQotZXhwYW5kQWxsVGV4dD1cdTVjNTVcdTk1OGJcdTUxNjhcdTkwZThcdTZhYTJcdTY3ZTVcdTk4MDVcdTc2ZWUNCi1leHRlbmRzVGV4dD1cdTVlZjZcdTRmMzgNCi1leHRlcm5hbFRleHQ9XHU1OTE2XHU5MGU4DQotZXh0ZXJuYWxEZXNjcmlwdGlvblRleHQ9XHU1OTE2XHU5MGU4XHU4YWFhXHU2NjBlDQotZ29hbHNUZXh0PVx1NzZlZVx1NmExOQ0KLWd1aWRlbGluZXNUZXh0PVx1NmU5Nlx1NTI0Nw0KLWlsbHVzdHJhdGlvbnNUZXh0PVx1NTcxNlx1NGY4Yg0KLWltcGFjdE9mTm90SGF2aW5nVGV4dD1cdTZiMjBcdTdmM2FcdTRlMGJcdTUyMTdcdTk4MDVcdTc2ZWVcdTc2ODRcdTVmNzFcdTk3ZmYNCi1pbXBhY3RpbmdUZXh0PVx1NWY3MVx1OTdmZlx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLWlucHV0c1RleHQ9XHU4ZjM4XHU1MTY1DQotaW5wdXRUb1RleHQ9XHU4ZjM4XHU1MTY1XHU4MWYzDQotaXRlbXNUZXh0PVx1OTgwNVx1NzZlZQ0KLWtleUNvbnNpZGVyYXRpb25zVGV4dD1cdTRlM2JcdTg5ODFcdTgwMDNcdTkxY2YNCi1sZXZlbHNPZkFkb3B0aW9uVGV4dD1cdTYzYTFcdTc1MjhcdTVjNjRcdTZiMjENCi1tYW5kYXRvcnlUZXh0PVx1NWYzN1x1NTIzNg0KLW1haW5UZXh0PVx1NGUzYlx1ODk4MQ0KLW1haW5EZXNjcmlwdGlvblRleHQ9XHU0ZTNiXHU4OTgxXHU4YWFhXHU2NjBlDQotbWFpblJlc3BvbnNpYmxlVGV4dD1cdTRlM2JcdTg5ODFcdThjYWNcdTRlZmINCi1tZXRob2RUZXh0PVx1NjViOVx1NmNkNVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLW1vZGlmaWVkQnlUZXh0PVx1NGZlZVx1NjUzOVx1ODAwNQ0KLW1vcmVJbmZvVGV4dD1cdThhNzNcdTdkMzBcdThjYzdcdThhMGENCi1ub3RhdGlvblRleHQ9XHU4ODY4XHU3OTNhXHU2Y2Q1DQotb3B0aW9uYWxUZXh0PVx1OTA3OFx1NzUyOA0KLW91dGNvbWVUZXh0PVx1OGYzOFx1NTFmYVx1N2Q1MFx1Njc5Yw0KLW91dHB1dEZyb21UZXh0PVx1OGYzOFx1NTFmYVx1NGY4Nlx1NmU5MA0KLW91dHB1dHNUZXh0PVx1OGYzOFx1NTFmYQ0KLXBhY2thZ2luZ0luc3RydWN0aW9uc1RleHQ9XHU1MzA1XHU4OGRkXHU2MzA3XHU3OTNhDQotcGFja2FnaW5nR3VpZGFuY2VUZXh0PVx1NTMwNVx1ODhkZFx1NjMwN1x1NWYxNQ0KLXBlcmZvcm1pbmdSb2xlc1RleHQ9XHU1N2Y3XHU4ODRjXHU4OWQyXHU4MjcyDQotcHJpbWFyeVBlcmZvcm1lclRleHQ9XHU0ZTNiXHU4OTgxXHU1N2Y3XHU4ODRjXHU4MDA1DQotcHJvYmxlbVRleHQ9XHU1NTRmXHU5ODRjDQotcHJvcGVydGllc1RleHQ9XHU1MTY3XHU1YmI5DQotcHVycG9zZVRleHQ9XHU3NmVlXHU3Njg0DQotcmVhc29uc0Zvck5vdE5lZWRpbmdUZXh0PVx1NGUwZFx1OTcwMFx1ODk4MVx1NzY4NFx1NTM5Zlx1NTZlMA0KLXJlZmVyZW5jZVdvcmtmbG93c1RleHQ9XHU1M2MzXHU3MTY3XHU1ZGU1XHU0ZjVjXHU2ZDQxXHU3YTBiDQotcmVsYXRlZEVsZW1lbnRzVGV4dD1cdTc2ZjhcdTk1ZGNcdTUxNDNcdTdkMjANCi1yZWxhdGlvbnNoaXBzVGV4dD1cdTk1ZGNcdTRmYzINCi1yZXBvcnRzVGV4dD1cdTU4MzFcdTU0NGENCi1yZXByZXNlbnRhdGlvbk9wdGlvbnNUZXh0PVx1ODg2OFx1NzkzYVx1NmNkNVx1OTA3OFx1OTgwNQ0KLXJlc3BvbnNpYmxlVGV4dD1cdThjYTBcdThjYWMNCi1yZXNwb25zaWJsZUZvclRleHQ9XHU4Y2EwXHU4Y2FjXHU1YzBkXHU4YzYxDQotcmV1c2FibGVBc3NldHNUZXh0PVx1NTNlZlx1OTFjZFx1ODkwN1x1NGY3Zlx1NzUyOFx1NzY4NFx1OGNjN1x1NzUyMg0KLXJvbGVUZXh0PVx1ODlkMlx1ODI3Mg0KLXJvbGVzVGV4dD1cdTg5ZDJcdTgyNzINCi1yb2xlU2V0c1RleHQ9XHU4OWQyXHU4MjcyXHU5NmM2DQotc2tpbGxzVGV4dD1cdTYyODBcdTVkZTcNCi1zdGFmZmluZ1RleHQ9XHU0ZWJhXHU1NGUxXHU5MTRkXHU3ZjZlDQotc3RlcHNUZXh0PVx1NmI2NVx1OWE1Zg0KLXN1YmNhdGVnb3JpZXNUZXh0PVx1NWI1MFx1N2EyZVx1OTg1ZQ0KLXN1YmRvbWFpbnNUZXh0PVx1NWI1MFx1OTgxOFx1NTdkZg0KLXN1YlByYWN0aWNlc1RleHQ9XHU1YjUwXHU3ZGY0XHU3ZmQyDQotc3VwZXJUZWFtVGV4dD1cdThkODVcdTdkMWFcdTU3MThcdTk2OGFcdThjYzdcdTY1OTkNCi1zdXBwb3J0aW5nTWF0ZXJpYWxzVGV4dD1cdTY1MmZcdTYzZjRcdThjYzdcdTY1OTkNCi1zdWJ0ZWFtc1RleHQ9XHU4ZDg1XHU3ZDFhXHU1NzE4XHU5NjhhXHU4Y2M3XHU2NTk5DQotc3lub255bXNUZXh0PVx1NTQwY1x1N2ZhOVx1NWI1Nw0KLXRhaWxvcmluZ1RleHQ9XHU4YWJmXHU2NTc0DQotdGFza1RleHQ9XHU0ZjVjXHU2OTZkDQotdGFza3NUZXh0PVx1NGY1Y1x1Njk2ZA0KLXRic1RleHQ9XHU1NzE4XHU5NjhhXHU5MTRkXHU3ZjZlDQotdGVhbVByb2ZpbGVUZXh0PVx1NTcxOFx1OTY4YVx1OGEyZFx1NWI5YVx1NmE5NA0KLXRlYW1Sb2xlc1RleHQ9XHU1NzE4XHU5NjhhXHU4Y2M3XHU2NTk5XHU4OWQyXHU4MjcyDQotdGVjaG5pcXVlc1RleHQ9XHU2ZTk2XHU1MjQ3DQotdGVtcGxhdGVGaWxlc1RleHQ9XHU3YmM0XHU2NzJjXHU2YTk0DQotdGVtcGxhdGVzVGV4dD1cdTdiYzRcdTY3MmMNCi10b29sTWVudG9yc1RleHQ9XHU1ZGU1XHU1MTc3XHU4ZjE0XHU1MmE5DQotdG9vbFRleHQ9XHU1ZGU1XHU1MTc3DQotdXNhZ2VUZXh0PVx1NzUyOFx1NmNkNQ0KLXdic1RleHQ9XHU1ZGU1XHU0ZjVjXHU1MjA2XHU4OWUzXHU3ZDUwXHU2OWNiDQotd2hpdGVwYXBlcnNUZXh0PVx1NzY3ZFx1NzZhZVx1NjZmOA0KLXdvcmtQcm9kdWN0c1RleHQ9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljDQotd29ya1Byb2R1Y3RUeXBlc1RleHQ9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU5ODVlXHU1NzhiDQotd3Bic1RleHQ9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU3NTI4XHU2Y2Q1DQotd29ya0JyZWFrZG93blRleHQ9XHU5MDRiXHU0ZjVjXHU1MjA2XHU4OWUzDQotd29ya2Zsb3dUZXh0PVx1NWRlNVx1NGY1Y1x1NmQ0MVx1N2EwYg0KLXdvcmtQcm9kdWN0QnJlYWtkb3duVGV4dD1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTUyMDZcdTg5ZTMNCi13b3JrUHJvZHVjdERlcGVuZGVuY2llc1RleHQ9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU3NmY4XHU0ZjlkXHU2MDI3DQotdGVhbVByb2ZpbGVCcmVha2Rvd25UZXh0PVx1NTcxOFx1OTY4YVx1NTIwNlx1ODllMw0KLXRlYW1TdHJ1Y3R1cmVUZXh0PVx1NTcxOFx1OTY4YVx1N2Q1MFx1NjljYg0KLXBhZ2VOb3RJbnN0YWxsZWRUZXh0PVx1NjcyYVx1NWI4OVx1ODhkZFx1NzY4NFx1OTgwMVx1OTc2Mg0KLWVsZW1lbnREb2VzTm90RXhpc3RUZXh0PVx1NGUwZFx1NWI1OFx1NTcyOFx1NzY4NFx1NTE0M1x1N2QyMA0KLWlzTm90VmFsaWRUZXh0PVx1NTNjM1x1NzE2N1x1NzY4NFx1NTE0M1x1N2QyMFx1NTcyOFx1NzNmZVx1ODg0Y1x1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZFx1NGUwZFx1NjYyZlx1NjcwOVx1NjU0OFx1NTE0M1x1N2QyMFx1MzAwMg0KLWVsZW1lbnRNaWdodEJlRGVsZXRlZFRleHQ9XHU3YTBiXHU1ZjBmXHU1ZWFiXHU1M2VmXHU4MGZkXHU1ZGYyXHU1MjJhXHU5NjY0XHU1MTQzXHU3ZDIwXHUzMDAyDQotcGxlYXNlRml4TGlua1RleHQ9XHU4YWNiXHU2YWEyXHU2N2U1XHU1MTY3XHU1YmI5XHU3YTBiXHU1ZjBmXHU1ZWFiXHU0ZTI2XHU0ZmVlXHU2YjYzXHU5M2M4XHU3ZDUwXHUzMDAyDQotaW5mb0Fib3V0TWlzc2luZ0VsZW1lbnRUZXh0PVx1OTA3YVx1NmYwZlx1NTE0M1x1N2QyMFx1NzY4NFx1NzZmOFx1OTVkY1x1OGNjN1x1OGEwYVx1ZmYxYQ0KLWVsZW1lbnROYW1lVGV4dD1cdTUxNDNcdTdkMjBcdTU0MGRcdTdhMzFcdWZmMWENCi1ndWlkVGV4dD1HVUlEXHVmZjFhDQotbWlzc2luZ0VsZW1lbnRUZXh0PVx1NTNjM1x1NzE2N1x1NzY4NFx1OTgwMVx1OTc2Mlx1NGUwZFx1NTcyOFx1NmI2NFx1OTE0ZFx1N2Y2ZVx1NGUyZA0KLW5vdEF2YWlsYWJsZVRleHQ9XHU1M2MzXHU3MTY3XHU3Njg0XHU5ODAxXHU5NzYyXHU0ZTBkXHU1YjU4XHU1NzI4XHU3M2ZlXHU4ODRjXHU5MTRkXHU3ZjZlXHU0ZTJkXHUzMDAyXHU2YjY0XHU5ODAxXHU5NzYyXHU1M2VmXHU4MGZkXHU1NzI4XHU1MTc2XHU0ZWQ2XHU2ZDQxXHU3YTBiXHU5MTRkXHU3ZjZlXHU0ZTJkXHUzMDAyDQotZWxlbWVudFR5cGVUZXh0PVx1NTE0M1x1N2QyMFx1OTg1ZVx1NTc4Ylx1ZmYxYQ0KLXBsdWdpbk5hbWVUZXh0PVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1NTQwZFx1N2EzMVx1ZmYxYQ0KLXByZWRlY2Vzc29yVGV4dD1cdTUyNGRcdTRlMDBcdTcyNDgNCi1wbGFubmluZ0RhdGFUZXh0PVBsYW5uaW5nRGF0YQ0KLW11bHRpcGxlT2NjdXJyZW5jZXNUZXh0PVx1NTkxYVx1NmIyMVx1NTFmYVx1NzNmZVx1NzY4NFx1OTgwNVx1NzZlZQ0KLWV2ZW50RHJpdmVuVGV4dD1cdTRlOGJcdTRlZjZcdTlhNDVcdTUyZDUNCi1vbmdvaW5nVGV4dD1cdTYzMDFcdTdlOGNcdTkwMzJcdTg4NGNcdTRlMmQNCi1wbGFubmVkVGV4dD1cdTg5OGZcdTUyODMNCi1yZXBlYXRhYmxlVGV4dD1cdTUzZWZcdTkxY2RcdTg5MDdcdTc2ODQNCi11c2FnZUd1aWRhbmNlVGV4dD1cdTc1MjhcdTZjZDVcdTYzMDdcdTVmMTUNCi1pbnB1dHNUZXh0PVx1OGYzOFx1NTE2NQ0KLW91dHB1dHNUZXh0PVx1OGYzOFx1NTFmYQ0KLWFjdGl2aXR5RW50cnlTdGF0ZVRleHQ9XHU2ZDNiXHU1MmQ1XHU5MDMyXHU1MTY1XHU3MmMwXHU2MTRiDQotYWN0aXZpdHlFeGl0U3RhdGVUZXh0PVx1NmQzYlx1NTJkNVx1N2Q1MFx1Njc1Zlx1NzJjMFx1NjE0Yg0KLXByZWZpeFRleHQ9XHU1YjU3XHU5OTk2DQotZXh0ZXJuYWxJZFRleHQ9XHU1OTE2XHU5MGU4IElEDQotc2NvcGVUZXh0PVx1N2JjNFx1NTcwZA0KLXJvYWRtYXBUZXh0PVx1NWMwZVx1ODliZFx1NTcxNg0KLXR5cGVvZkNvbnRyYWN0VGV4dD1cdTU0MDhcdTdkMDRcdTk4NWVcdTU3OGINCi1wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzVGV4dD1cdTVjMDhcdTY4NDhcdTYwMjdcdThjZWENCi1wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlVGV4dD1cdTVjMDhcdTY4NDhcdTYyMTBcdTU0ZTFcdTVjMDhcdTY5NmRcdTc3ZTVcdThiNTgNCi1yaXNrTGV2ZWxUZXh0PVx1OThhOFx1OTZhYVx1NWM2NFx1NmIyMQ0KLXNjYWxlVGV4dD1cdThhYmZcdTY1NzRcdTZiZDRcdTRmOGINCi11c2FnZU5vdGVzVGV4dD1cdTRmN2ZcdTc1MjhcdTZjZThcdTYxMGZcdTRlOGJcdTk4MDUNCi1jb250ZXh0VGV4dD1cdTc0YjBcdTU4ODNcdTViOWFcdTdmYTkNCi1wYXJlbnRBY3Rpdml0aWVzVGV4dD1cdTZiY2RcdTk4MDVcdTZkM2JcdTUyZDUNCi1pbmNsdWRlZFBhdHRlcm5zVGV4dD1cdTUxNjdcdTU0MmJcdTU3OGJcdTZhMjMNCi1jaGVja2xpc3RUZXh0PVx1NjgzOFx1NWMwZFx1NmUwNVx1NTVhZQ0KLWNvbW11bmljYXRpb25zTWF0ZXJpYWxzVGV4dD1cdTZlOWRcdTkwMWFcdThjYzdcdTY1OTkNCi1lZHVjYXRpb25NYXRlcmlhbHNUZXh0PVx1NjU1OVx1ODBiMlx1OGNjN1x1NjU5OQ0KLWVzdGltYXRpbmdUZWNobmlxdWVUZXh0PVx1OTgxMFx1NGYzMFx1NjI4MFx1ODg1Mw0KLWFkZGl0aW9uYWxUZXh0PVx1NTE3Nlx1NGVkNlx1NzY4NA0KLW1vZGlmaWVzVGV4dD1cdTRmZWVcdTY1MzlcdTk4MDVcdTc2ZWUNCi1hZGRpdGlvbmFsbHlQZXJmb3Jtc1RleHQ9XHU5ODRkXHU1OTE2XHU1N2Y3XHU4ODRjDQotaW5kZXhUZXh0PVx1N2QyMlx1NWYxNQ0KLXByZWZpeFRleHQ9XHU1YjU3XHU5OTk2DQotYnJlYWtkb3duRWxlbWVudFRleHQ9XHU1MjA2XHU4OWUzXHU1MTQzXHU3ZDIwDQotc3RlcHNUZXh0PVx1NmI2NVx1OWE1Zg0KLXByZWRlY2Vzc29yc1RleHQ9XHU1MjRkXHU0ZTAwXHU3MjQ4DQotcmVwZWF0YWJsZVRleHQ9XHU1M2VmXHU5MWNkXHU4OTA3XHU3Njg0DQotdHlwZVRleHQ9XHU5ODVlXHU1NzhiDQotb25nb2luZ1RleHQ9XHU2MzAxXHU3ZThjXHU5MDMyXHU4ODRjXHU0ZTJkDQotZXZlbnREcml2ZW5UZXh0PVx1NGU4Ylx1NGVmNlx1OWE0NVx1NTJkNQ0KLW1vZGVsSW5mb1RleHQ9XHU2YTIxXHU1NzhiXHU4Y2M3XHU4YTBhDQotZW50cnlTdGF0ZVRleHQ9XHU5MDMyXHU1MTY1XHU3MmMwXHU2MTRiDQotZXhpdFN0YXRlVGV4dD1cdTdkNTBcdTY3NWZcdTcyYzBcdTYxNGINCi10ZWFtVGV4dD1cdTU3MThcdTk2OGENCi1wYXJlbnRQYWNrYWdlVGV4dD1cdTZiY2RcdTk4MDVcdTU5NTdcdTRlZjYNCi1jb250YWluZWRQYWNrYWdlc1RleHQ9XHU1MTY3XHU1NDJiXHU1OTU3XHU0ZWY2DQotY29udGVudHNUZXh0PVx1NTE2N1x1NWJiOQ0KLWJhc2VkT25NZXRob2RSb2xlVGV4dD1cdTY4MzlcdTY0ZGFcdTY1YjlcdTZjZDVcdTg5ZDJcdTgyNzINCi1iYXNlZE9uTWV0aG9kVGFza1RleHQ9XHU2ODM5XHU2NGRhXHU2NWI5XHU2Y2Q1XHU0ZjVjXHU2OTZkDQotYmFzZWRPbk1ldGhvZFdvcmtQcm9kdWN0VGV4dD1cdTY4MzlcdTY0ZGFcdTY1YjlcdTZjZDVcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWMNCi1zdW1tYXJ5VGV4dD1cdTY0NThcdTg5ODENCi1wZXJmb3Jtc1RleHQ9XHU1N2Y3XHU4ODRjDQotcmVwbGFjZXNUZXh0PVx1NTNkNlx1NGVlMw0KLWNvbnRyaWJ1dGVzVGV4dD1cdTYzZDBcdTUxZmENCi1ub25lVGV4dD1cdTcxMjENCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNUZXh0PVx1OTgxMFx1NGYzMFx1ODAwM1x1OTFjZg0KLWFjdGl2aXR5UmVmZXJlbmNlc1RleHQ9XHU2ZDNiXHU1MmQ1XHU1M2MzXHU3MTY3DQotbmFtZVRleHQ9XHU1NDBkXHU3YTMxDQotcHJlc2VudGF0aW9uTmFtZVRleHQ9XHU1NDQ4XHU3M2ZlXHU1NDBkXHU3YTMxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5fZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTAyNDllMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5fZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gQmlibGlvdGhlaw0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxMDMwNzkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUJpYmxpb3RlY2EgZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5fZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTA0ODNlNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5fZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9QmlibGlvdGhcdTAwZThxdWUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5faXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTU2MGYyMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5faXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9TGlicmVyaWEgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5famEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGE1ZmU4My4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5famEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIExpYnJhcnkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzU2ZTgwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjhlMDEwYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9QmlibGlvdGVjYSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNzcxYzE3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHU1ZTkzDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGE1ZmU4My4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIExpYnJhcnkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1OTExMjMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXVua25vd25fdGV4dD1VbmJla2FubnQNCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lbXB0eUxpYnJhcnlQYXRoRXJyb3JfcmVhc29uPURlciBQZmFkIGRlciBNZXRob2RlbmJpYmxpb3RoZWsgaXN0IGxlZXIuDQotbWlzc2luZ0xpYnJhcnlGaWxlRXJyb3JfcmVhc29uPURpZSBNb2RlbGxkYXRlaSBmXHUwMGZjciBkaWUgTWV0aG9kZW5iaWJsaW90aGVrIGlzdCBuaWNodCB2b3JoYW5kZW4uDQotdW5yZXNvbHZlZFByb3h5RXJyb3JfcmVhc29uPURpZSBhdXNnZXdcdTAwZTRobHRlIE1ldGhvZGVuYmlibGlvdGhlayBlbnRoXHUwMGU0bHQgbmljaHQgYXVmZ2VsXHUwMGY2c3RlIEVsZW1lbnRyZWZlcmVuemVuLiBEaWVzZXMgUHJvYmxlbSB0cml0dCBpbiBkZXIgUmVnZWwgYXVmLCB3ZW5uIFhNSS1EYXRlaWVuIGltIEJpYmxpb3RoZWtzb3JkbmVyIGZlaGxlbiBvZGVyIGFuIGRpZSBmYWxzY2hlIFBvc2l0aW9uIGtvcGllcnQgd3VyZGVuLlxuXG5TY2hsaWVcdTAwZGZlbiBTaWUgZGVuIERpYWxvZyB1bmQgcnVmZW4gU2llIGRpZSBTaWNodCAiUHJvYmxlbWUiIGF1ZiwgdW0gZGllIG5pY2h0IGF1ZmdlbFx1MDBmNnN0ZW4gUmVmZXJlbnplbiB6dSBlcm1pdHRlbG4uIFVtIGRpZSBCaWJsaW90aGVrIG5pY2h0IHp1IGJlc2NoXHUwMGU0ZGlnZW4sIHdpcmQgZHJpbmdlbmQgZW1wZm9obGVuLCBkaWUgUmVmZXJlbnplbiB6dWVyc3QgYXVmenVsXHUwMGY2c2VuLCBiZXZvciBkZXIgQmlibGlvdGhlayB3ZWl0ZXJlIFx1MDBjNG5kZXJ1bmdlbiBoaW56dWdlZlx1MDBmY2d0IHdlcmRlbi4NCi0NCi0jIFdhcm5pbmcgTWVzc2FnZXMNCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cxPUlVUEwwMDA3VzogSW4gbWluZGVzdGVucyBlaW5lbSB1bnRlcmdlb3JkbmV0ZW4gRWxlbWVudCBmZWhsZW4gUmVmZXJlbnplbi4NCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cyPUlVUEwwMDA4VzogRGllc2VzIEVsZW1lbnQgc29sbHRlIGF1c2dld1x1MDBlNGhsdCB3ZXJkZW4sIHVtIGZlaGxlbmRlIFJlZmVyZW56ZW4gYXVmenVsXHUwMGY2c2VuLg0KLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzM9SVVQTDAwMDlXOiBEaWVzZXMgRWxlbWVudCB2ZXJ3ZWlzdCBhdWYgbWluZGVzdGVucyBlaW4gRWxlbWVudCBpbiBlaW5lbSBuaWNodCBhdXNnZXdcdTAwZTRobHRlbiBQYWtldC4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbG9hZFJlc291cmNlc0Vycm9yX21zZz1JVVBMMDAwMEU6IERpZSBNZXRob2RlbmJpYmxpb3RoZWsgd3VyZGUgendhciBnZWxhZGVuLCBhYmVyIGVzIHNpbmQgZWluaWdlIEZlaGxlciBhdWZnZXRyZXRlbi4NCi11bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX21zZz1JVVBMMDAwMUU6IERpZXNlIEFubGVpdHVuZyBrYW5uIG5pY2h0IGluIGVpbmVuIGFuZGVyZW4gVHlwIGtvbnZlcnRpZXJ0IHdlcmRlbi4NCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDJFOiBEaWVzZSBBbmxlaXR1bmcga2FubiBuaWNodCBpbiBkZW4gWmllbHR5cCBrb252ZXJ0aWVydCB3ZXJkZW4uDQotc2F2ZUNvbnZlcnRlZEd1aWRhbmNlRXJyb3JfbXNnPUlVUEwwMDAzRTogRGllIGtvbnZlcnRpZXJ0ZSBBbmxlaXR1bmcgJyd7MH0nJyBrYW5uIG5pY2h0IGdlc3BlaWNoZXJ0IHdlcmRlbi4NCi0NCi0jIENvbnZlcnQgYWN0aXZpdHkNCi1jb252ZXJ0QWN0aXZpdHlFcnJvcl90aXRsZT1GZWhsZXIgYmVpbSBLb252ZXJ0aWVyZW4gZGVzIEFrdGl2aXRcdTAwZTR0c3R5cHMNCi1jb252ZXJ0QWN0aXZpdHlFcnJvcl9tc2c9SVVQTDAwMDZFOiBEaWVzZSBBa3Rpdml0XHUwMGU0dCBrYW5uIG5pY2h0IGluIGRlbiBaaWVsdHlwIGtvbnZlcnRpZXJ0IHdlcmRlbi4NCi1zYXZlQ29udmVydGVkQWN0aXZpdHlFcnJvcl9tc2c9SVVQTDAwMDdFOiBEaWUga29udmVydGllcnRlIEFrdGl2aXRcdTAwZTR0ICcnezB9Jycga2FubiBuaWNodCBnZXNwZWljaGVydCB3ZXJkZW4uDQotDQotIyBFcnJvciBSZWFzb25zDQotZXJyb3JfcmVhc29uPUlVUEwwMDA0RTogRXMgaXN0IGVpbiBGZWhsZXIgYXVmZ2V0cmV0ZW4uIEtsaWNrZW4gU2llIGF1ZiAiT0siLCB1bSB3ZWl0ZXJlIEluZm9ybWF0aW9uZW4genUgZXJoYWx0ZW4uDQotdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9yZWFzb249RXMgaXN0IGtlaW4ga29tcGF0aWJsZXIgQW5sZWl0dW5nc3R5cCBmXHUwMGZjciB7MH0gdm9yaGFuZGVuLg0KLWludmFsaWRMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1VbmdcdTAwZmNsdGlnZXIgQmlibGlvdGhla3NwZmFkLiBEaWUgRGF0ZWkgbWl0IGRlciBFcndlaXRlcnVuZyAucHJvamVjdCBrb25udGUgbmljaHQgZXJzdGVsbHQgd2VyZGVuLg0KLWNvdWxkTm90TG9ja0xpYnJhcnlfcmVhc29uPURpZSBCaWJsaW90aGVrIGtvbm50ZSBuaWNodCBnZXNwZXJydCB3ZXJkZW4uDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWNvcHlpbmdBdHRhY2htZW50c1Rhc2tfbmFtZT1BbmhcdTAwZTRuZ2Ugd2VyZGVuIGtvcGllcnQuLi4NCi0NCi0jIENvbnZlcnQgR3VpZGFuY2UgRGlhbG9nDQotY29udmVydEd1aWRhbmNlRGlhbG9nX3RpdGxlPUFubGVpdHVuZ3N0eXAga29udmVydGllcmVuDQotY29udmVydEd1aWRhbmNlRGlhbG9nX3RleHQ9V1x1MDBlNGhsZW4gU2llIGRlbiBaaWVsYW5sZWl0dW5nc3R5cCBhdXMuDQotDQotIyBHdWlkYW5jZSB0eXBlIG5hbWVzIGZvciBDb252ZXJ0IEd1aWRhbmNlIERpYWxvZyAtIHNob3VsZCBiZSByZWZhY3RvcmVkIGludG8gbGlicmFyeS51aQ0KLWNoZWNrbGlzdF90ZXh0PVByXHUwMGZjZmxpc3RlDQotY29uY2VwdF90ZXh0PUtvbnplcHQNCi1leGFtcGxlX3RleHQ9QmVpc3BpZWwNCi1ndWlkZWxpbmVfdGV4dD1SaWNodGxpbmllDQotZXN0aW1hdGVfdGV4dD1TY2hcdTAwZTR0emVuDQotZXN0aW1hdGluZ01ldHJpY190ZXh0PVNjaFx1MDBlNHR6bWV0cmlrDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ9SGlud2Vpc2UgenVtIFNjaFx1MDBlNHR6ZW4NCi1yZXBvcnRfdGV4dD1CZXJpY2h0DQotdGVtcGxhdGVfdGV4dD1Wb3JsYWdlDQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ9VW50ZXJzdFx1MDBmY3R6ZW5kZXMgTWF0ZXJpYWwNCi10b29sTWVudG9yX3RleHQ9VG9vbG1lbnRvcg0KLXdoaXRlcGFwZXJfdGV4dD1XaGl0ZSBQYXBlcg0KLXRlcm1EZWZpbml0aW9uX3RleHQ9QmVncmlmZnNkZWZpbml0aW9uDQotcHJhY3RpY2VfdGV4dD1WZXJmYWhyZW4NCi1yZXVzYWJsZUFzc2V0X3RleHQ9V2llZGVydmVyd2VuZGJhcmVzIEFzc2V0DQotDQotI2FjdGl2aXR5IGJyZWFrZG93biBpbmZvIHN0cmluZ3MNCi1BY3Rpdml0eUxheW91dF9wcmltYXJ5VGFza3NfdGV4dD1BdXNmXHUwMGZjaHJ1bmcgYWxzIEVpZ25lcg0KLUFjdGl2aXR5TGF5b3V0X2FkZGl0aW9uYWxUYXNrc190ZXh0PUF1c2ZcdTAwZmNocnVuZyBhbHMgenVzXHUwMGU0dHpsaWNoZXIgQXVzZlx1MDBmY2hyZW5kZXINCi0NCi0NCi0jIENvbnZlcnQgR3VpZGFuY2UgRXJyb3IgTWVzc2FnZXMNCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl90aXRsZT1GZWhsZXIgYmVpbSBLb252ZXJ0aWVyZW4gZGVzIEFubGVpdHVuZ3N0eXBzDQotDQotIyBMb2FkIFJlc291cmNlcyBFcnJvciBEaWFsb2cNCi1sb2FkUmVzb3VyY2VzRXJyb3JfdGl0bGU9RmVobGVyIGJlaW0gXHUwMGQ2ZmZuZW4gZGVyIE1ldGhvZGVuYmlibGlvdGhlaw0KLWxvYWRSZXNvdXJjZXNFcnJvcl9yZWFzb249RWluaWdlIEJpYmxpb3RoZWtzcmVzc291cmNlbiBrb25udGVuIG5pY2h0IGdlbGFkZW4gd2VyZGVuLlxuXG5LbGlja2VuIFNpZSBhdWYgRGV0YWlscywgdW0gc2ljaCBkaWUgRmVobGVyIGFuenVzZWhlbiB1bmQgenUgYmVoZWJlbiwgYmV2b3IgU2llIGRlciBCaWJsaW90aGVrIHdlaXRlcmUgXHUwMGM0bmRlcnVuZ2VuIGhpbnp1Zlx1MDBmY2dlbi4NCi0NCi0jIFJvbGUgRGlhZ3JhbXMNCi1yb2xlRGlhZ3JhbVBlcmZvcm1zX3RleHQ9Zlx1MDBmY2hydCBhdXMNCi1yb2xlRGlhZ3JhbVJlc3BvbnNpYmxlRm9yX3RleHQ9dmVyYW50d29ydGxpY2ggZlx1MDBmY3INCi0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cwPVJlZmVyZW56aWVydGVzIEVsZW1lbnQ6IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE9SW5mbzogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHND1XYXJudW5nOiB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0c3PUZlaGxlcjogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTA9RGFzIHJlZmVyZW56aWVydGUgRWxlbWVudCB7MH0gaXN0IG5pY2h0IHZvcmhhbmRlbi4NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMT1FbGVtZW50IGZcdTAwZmNyIGd1aWQgezB9IHd1cmRlIG5pY2h0IGdlZnVuZGVuLg0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEyPURpZSBEYXRlaSAnJ3swfScnIHZlcndlaXN0IGF1ZiBkaWUgbmljaHQgdm9yaGFuZGVuZSBSZXNzb3VyY2UgJyd7MX0nJy4NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNT1EaWUgUmVzc291cmNlbmRhdGVpICcnezB9JycgaXN0IG5pY2h0IHZvcmhhbmRlbi4NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNz1FcyBrYW5uIGtlaW5lIFZlcmJpbmR1bmcgenVtIFVSTCAnJ3swfScnIGhlcmdlc3RlbGx0IHdlcmRlbi4NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxOT1FcyBrYW5uIGtlaW5lIFZlcmJpbmR1bmcgenVtIFVSTCAnJ3swfScnIGhlcmdlc3RlbGx0IHdlcmRlbjogezF9DQotSW1wb3J0RXhwb3J0VXRpbF9NU0c4PURpZSBEYXRlaSAnJ3swfScnIHd1cmRlIG5pY2h0IGdlZnVuZGVuLg0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOT1EYXMgdGVtcG9yXHUwMGU0cmUgVmVyemVpY2huaXMgJyd7MH0nJyBrb25udGUgbmljaHQgZXJzdGVsbHQgd2VyZGVuLg0KLXVua25vd25HdWlkYW5jZV90ZXh0PVVuYmVrYW5udA0KLQ0KLUNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb25fbG9nX25vQ29udGVudFBhdGg9Q29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbi5IYW5kbGVBdHRhY2htZW50c1BsdWdpbjogRXMgaXN0IGtlaW4gY29udGVudFBhdGggZlx1MDBmY3IgezB9IHZvcmhhbmRlbi4NCi1MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyX2Nhbm5vdFVwZGF0ZT1JVVBMMDAwNlc6IHswfSB7MX0ga2FubiBuaWNodCBha3R1YWxpc2llcnQgd2VyZGVuLg0KLXdhcm5pbmdEbGdfdGl0bGU9V2FybnVuZw0KLWVycm9yRGxnX3RpdGxlPUZlaGxlcg0KLWVycm9yRGxnX3NhdmVFcnJvcj1JVVBMMDAwNUU6IEZlaGxlciBiZWltIFNwZWljaGVybiBkZXIgXHUwMGM0bmRlcnVuZ2VuIGluIGRlciBEYXRlaSAnJ3swfScnDQotDQotIyBhY3Rpdml0eSBkaWFncmFtIG5hbWVzDQotYWN0aXZpdHlEaWFncmFtTmFtZT1Ba3Rpdml0XHUwMGU0dHNkaWFncmFtbTogezB9DQotYWN0aXZpdHlEZXRhaWxEaWFncmFtTmFtZT1Ba3Rpdml0XHUwMGU0dHNkZXRhaWxkaWFncmFtbTogezB9DQotd3BEZXBlbmRlbmN5RGlhZ3JhbU5hbWU9QXJiZWl0c2VyZ2VibmlzYWJoXHUwMGU0bmdpZ2tlaXRzZGlhZ3JhbW06IHswfQ0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIFJvbGUgZGlhZ3JhbSBmb250cyBhbmQgbGF5b3V0DQotcm9sZURpYWdyYW1Gb250X25hbWU9QXJpYWwNCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMj1BcmlhbA0KLXJvbGVEaWFncmFtRm9udF9zaXplPTEwDQotcm9sZURpYWdyYW1Gb250X3NpemVfd2luMzI9MTANCi1yb2xlRGlhZ3JhbV94TWFyZ2luPTIwMA0KLXJvbGVEaWFncmFtX3hTcGFjaW5nPTcwDQotcm9sZURpYWdyYW1feVNwYWNpbmc9MzANCi0NCi0jIGxvY2FsaXplIHRoZSB2YWx1ZSBiYXNlZCBvbiBsb2NhbGUuICBmb3IgZXhhbXBsZSwgDQotIyBmb3IgRW5nbGlzaCwgdGhlIHZhbHVlIGlzICIuICINCi0jY29sb25fd2l0aF9zcGFjZT06IA0KLSMgZm9yIGZyZW5jaCwgdGhlIHZhbHVlIGlzICIgLiAiLCB5b3UgbmVlZCB0byB1c2UgYSBcIHRvIHByZXNlcnZlIHRoZSBsZWFkaW5nIHNwYWNlDQotI2NvbG9uX3dpdGhfc3BhY2U9XCA6IA0KLSMgZm9yIGNoaW5lc2UsIHRoZSBjb2xvbiBzaG91bGQgYmUgZG91YmxlIGJ5dGVzDQotIyBEb250IHRyaW0gdGhlIHNwYWNlcyBhZnRlciB0aGUgY29sb24uDQotY29sb25fd2l0aF9zcGFjZT06IA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXNfZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAyNTYwZS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotdW5rbm93bl90ZXh0PURlc2Nvbm9jaWRvDQotDQotIyBFcnJvciBSZWFzb25zDQotZW1wdHlMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1MYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBlc3RcdTAwZTEgdmFjXHUwMGVkYS4NCi1taXNzaW5nTGlicmFyeUZpbGVFcnJvcl9yZWFzb249RmFsdGEgZWwgYXJjaGl2byBkZWwgbW9kZWxvIGRlIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLg0KLXVucmVzb2x2ZWRQcm94eUVycm9yX3JlYXNvbj1MYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBzZWxlY2Npb25hZGEgY29udGllbmUgcmVmZXJlbmNpYXMgYSBlbGVtZW50b3Mgc2luIHJlc29sdmVyLiBFc3RvIHN1ZWxlIGRlYmVyc2UgYSBhcmNoaXZvcyBYTUkgcXVlIGZhbHRhbiBvIHF1ZSBlc3RcdTAwZTFuIGRlc3BsYXphZG9zIGVuIGxhIGNhcnBldGEgZGUgYmlibGlvdGVjYS5cblxuQ2llcnJlIGVzdGUgZGlcdTAwZTFsb2dvIHkgYWJyYSBsYSB2aXN0YSBQcm9ibGVtYXMgcGFyYSBpZGVudGlmaWNhciBsYXMgcmVmZXJlbmNpYXMgbm8gcmVzdWVsdGFzLiBQYXJhIG5vIGRhXHUwMGYxYXIgbGEgYmlibGlvdGVjYSwgZXMgbXV5IHJlY29tZW5kYWJsZSByZXNvbHZlciBlc3RhcyByZWZlcmVuY2lhcyBhbnRlcyBkZSBhXHUwMGYxYWRpciBtXHUwMGUxcyBjYW1iaW9zIGEgbGEgYmlibGlvdGVjYS4NCi0NCi0jIFdhcm5pbmcgTWVzc2FnZXMNCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cxPUlVUEwwMDA3VzogSGF5IHVubyBvIHZhcmlvcyBlbGVtZW50b3MgaGlqbyBxdWUgY29udGllbmVuIHJlZmVyZW5jaWFzIGF1c2VudGVzDQotY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMj1JVVBMMDAwOFc6IERlYmUgc2VsZWNjaW9uYXIgZXN0ZSBlbGVtZW50byBwYXJhIHJlc29sdmVyIHVuYSBvIHZhcmlhcyBkZSBsYXMgcmVmZXJlbmNpYXMgYXVzZW50ZXMNCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2czPUlVUEwwMDA5VzogRXN0ZSBlbGVtZW50byBoYWNlIHJlZmVyZW5jaWEgYSB1bm8gbyB2YXJpb3MgZWxlbWVudG9zIGRlIHVuIHBhcXVldGUgbm8gc2VsZWNjaW9uYWRvDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWxvYWRSZXNvdXJjZXNFcnJvcl9tc2c9SVVQTDAwMDBFOiBTZSBoYSBjYXJnYWRvIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLCBwZXJvIHNlIGhhbiBkZXRlY3RhZG8gdmFyaW9zIGVycm9yZXMuDQotdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9tc2c9SVVQTDAwMDFFOiBFc3RhIGd1XHUwMGVkYSBubyBzZSBwdWVkZSBjb252ZXJ0aXIgZW4gb3RybyB0aXBvLg0KLWNvbnZlcnRHdWlkYW5jZUVycm9yX21zZz1JVVBMMDAwMkU6IEVzdGEgZ3VcdTAwZWRhIG5vIHNlIHB1ZWRlIGNvbnZlcnRpciBlbiBvdHJvIHRpcG8gZGUgZGVzdGluby4NCi1zYXZlQ29udmVydGVkR3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDNFOiBMYSBndVx1MDBlZGEgY29udmVydGlkYSAnJ3swfScnIG5vIHNlIHB1ZWRlIGd1YXJkYXIuDQotDQotIyBDb252ZXJ0IGFjdGl2aXR5DQotY29udmVydEFjdGl2aXR5RXJyb3JfdGl0bGU9Q29udmVydGlyIGVycm9yIGRlIHRpcG8gZGUgYWN0aXZpZGFkDQotY29udmVydEFjdGl2aXR5RXJyb3JfbXNnPUlVUEwwMDA2RTogRXN0YSBhY3RpdmlkYWQgbm8gc2UgcHVlZGUgY29udmVydGlyIGVuIG90cm8gdGlwbyBkZSBkZXN0aW5vLg0KLXNhdmVDb252ZXJ0ZWRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwN0U6IExhIGFjdGl2aWRhZCBjb252ZXJ0aWRhICcnezB9Jycgbm8gc2UgcHVlZGUgZ3VhcmRhci4NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249SVVQTDAwMDRFOiBTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IuIFB1bHNlIEFjZXB0YXIgcGFyYSBvYnRlbmVyIG1cdTAwZTFzIGluZm9ybWFjaVx1MDBmM24uDQotdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9yZWFzb249Tm8gaGF5IG5pbmdcdTAwZmFuIHRpcG8gZGUgZ3VcdTAwZWRhIGNvbXBhdGlibGUgcGFyYSB7MH0uDQotaW52YWxpZExpYnJhcnlQYXRoRXJyb3JfcmVhc29uPUxhIHZcdTAwZWRhIGRlIGFjY2VzbyBkZSBsYSBiaWJsaW90ZWNhIG5vIGVzIHZcdTAwZTFsaWRhLiBObyBzZSBoYSBwb2RpZG8gY3JlYXIgZWwgYXJjaGl2byAucHJvamVjdC4NCi1jb3VsZE5vdExvY2tMaWJyYXJ5X3JlYXNvbj1ObyBzZSBoYSBwb2RpZG8gYmxvcXVlYXIgbGEgYmlibGlvdGVjYS4NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotY29weWluZ0F0dGFjaG1lbnRzVGFza19uYW1lPUNvcGlhbmRvIGFyY2hpdm9zIGRlIGRhdG9zIGFkanVudG9zLi4uDQotDQotIyBDb252ZXJ0IEd1aWRhbmNlIERpYWxvZw0KLWNvbnZlcnRHdWlkYW5jZURpYWxvZ190aXRsZT1Db252ZXJ0aXIgdGlwbyBkZSBndVx1MDBlZGENCi1jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGV4dD1TZWxlY2Npb25lIGVsIHRpcG8gZGUgZ3VcdTAwZWRhIGRlIGRlc3Rpbm8uDQotDQotIyBHdWlkYW5jZSB0eXBlIG5hbWVzIGZvciBDb252ZXJ0IEd1aWRhbmNlIERpYWxvZyAtIHNob3VsZCBiZSByZWZhY3RvcmVkIGludG8gbGlicmFyeS51aQ0KLWNoZWNrbGlzdF90ZXh0PUxpc3RhIGRlIGNvbXByb2JhY2lcdTAwZjNuDQotY29uY2VwdF90ZXh0PUNvbmNlcHRvDQotZXhhbXBsZV90ZXh0PUVqZW1wbG8NCi1ndWlkZWxpbmVfdGV4dD1EaXJlY3RyaXoNCi1lc3RpbWF0ZV90ZXh0PUNcdTAwZTFsY3Vsbw0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dD1DXHUwMGUxbGN1bG8gZGUgbGEgbWVkaWRhDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ9Q29uc2lkZXJhY2lvbmVzIHNvYnJlIGVsIGNcdTAwZTFsY3Vsbw0KLXJlcG9ydF90ZXh0PUluZm9ybWUNCi10ZW1wbGF0ZV90ZXh0PVBsYW50aWxsYQ0KLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0PU1hdGVyaWFsIGRlIHNvcG9ydGUNCi10b29sTWVudG9yX3RleHQ9R3VcdTAwZWRhIGRlIGxhIGhlcnJhbWllbnRhDQotd2hpdGVwYXBlcl90ZXh0PURvY3VtZW50YWNpXHUwMGYzbg0KLXRlcm1EZWZpbml0aW9uX3RleHQ9RGVmaW5pY2lcdTAwZjNuIGRlIHRcdTAwZTlybWlub3MNCi1wcmFjdGljZV90ZXh0PVByXHUwMGUxY3RpY2ENCi1yZXVzYWJsZUFzc2V0X3RleHQ9QWN0aXZvIHJldXRpbGl6YWJsZQ0KLQ0KLSNhY3Rpdml0eSBicmVha2Rvd24gaW5mbyBzdHJpbmdzDQotQWN0aXZpdHlMYXlvdXRfcHJpbWFyeVRhc2tzX3RleHQ9QWN0XHUwMGZhYSBjb21vIHByb3BpZXRhcmlvDQotQWN0aXZpdHlMYXlvdXRfYWRkaXRpb25hbFRhc2tzX3RleHQ9QWN0XHUwMGZhYSBjb21vIGFkaWNpb25hbA0KLQ0KLQ0KLSMgQ29udmVydCBHdWlkYW5jZSBFcnJvciBNZXNzYWdlcw0KLWNvbnZlcnRHdWlkYW5jZUVycm9yX3RpdGxlPUNvbnZlcnRpciBlcnJvciBkZSB0aXBvIGRlIGd1XHUwMGVkYQ0KLQ0KLSMgTG9hZCBSZXNvdXJjZXMgRXJyb3IgRGlhbG9nDQotbG9hZFJlc291cmNlc0Vycm9yX3RpdGxlPVNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBhYnJpciBsYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcw0KLWxvYWRSZXNvdXJjZXNFcnJvcl9yZWFzb249Tm8gc2UgaGFuIHBvZGlkbyBjYXJnYXIgYWxndW5vcyByZWN1cnNvcyBkZSBsYSBiaWJsaW90ZWNhLlxuXG5QdWxzZSBEZXRhbGxlcyBwYXJhIHJldmlzYXIgbG9zIGVycm9yZXMgeSBzb2x1Y2lvbmFybG9zIGFudGVzIGRlIGFcdTAwZjFhZGlyIG1cdTAwZTFzIGNhbWJpb3MgYSBsYSBiaWJsaW90ZWNhLg0KLQ0KLSMgUm9sZSBEaWFncmFtcw0KLXJvbGVEaWFncmFtUGVyZm9ybXNfdGV4dD1yZWFsaXphDQotcm9sZURpYWdyYW1SZXNwb25zaWJsZUZvcl90ZXh0PXJlc3BvbnNhYmxlIGRlDQotDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMD1FbGVtZW50byBjb24gcmVmZXJlbmNpYXM6IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE9SW5mb3JtYWNpXHUwMGYzbjogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHND1BdmlzbzogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHNz1FcnJvcjogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTA9RWxlbWVudG8gY29uIHJlZmVyZW5jaWFzIGF1c2VudGUgezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTE9Tm8gc2UgaGEgcG9kaWRvIGVuY29udHJhciBlbCBlbGVtZW50byBwYXJhIGVsIEdVSUQgezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTI9RWwgYXJjaGl2byAnJ3swfScnIGhhY2UgcmVmZXJlbmNpYSBhbCByZWN1cnNvIGF1c2VudGUgJyd7MX0nJw0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE1PWZhbHRhIGVsIGFyY2hpdm8gZGUgcmVjdXJzb3MgJyd7MH0nJw0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE3PU5vIHNlIGhhIHBvZGlkbyBjb25lY3RhciBhIGxhIHVybCAnJ3swfScnDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTk9Tm8gc2UgaGEgcG9kaWRvIGNvbmVjdGFyIGEgbGEgdXJsICcnezB9Jyc6IHsxfQ0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOD1ObyBzZSBoYSBwb2RpZG8gZW5jb250cmFyIGVsIGFyY2hpdm8gJyd7MH0nJy4NCi1JbXBvcnRFeHBvcnRVdGlsX01TRzk9Tm8gc2UgaGEgcG9kaWRvIGNyZWFyIGVsIGRpcmVjdG9yaW8gdGVtcG9yYWwgJyd7MH0nJy4NCi11bmtub3duR3VpZGFuY2VfdGV4dD1EZXNjb25vY2lkbw0KLQ0KLUNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb25fbG9nX25vQ29udGVudFBhdGg9Q29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbi5IYW5kbGVBdHRhY2htZW50c1BsdWdpbjogbm8gaGF5IG5pbmd1bmEgdlx1MDBlZGEgZGUgYWNjZXNvIGRlIGNvbnRlbmlkbyBwYXJhIHswfQ0KLUxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXJfY2Fubm90VXBkYXRlPUlVUEwwMDA2VzogTm8gc2UgcHVlZGUgYWN0dWFsaXphciB7MH0gezF9DQotd2FybmluZ0RsZ190aXRsZT1Bdmlzbw0KLWVycm9yRGxnX3RpdGxlPUVycm9yDQotZXJyb3JEbGdfc2F2ZUVycm9yPUlVUEwwMDA1RTogU2UgaGEgcHJvZHVjaWRvIHVuIGVycm9yIGFsIGd1YXJkYXIgbG9zIGNhbWJpb3MgZW4gZWwgYXJjaGl2byAnJ3swfScnDQotDQotIyBhY3Rpdml0eSBkaWFncmFtIG5hbWVzDQotYWN0aXZpdHlEaWFncmFtTmFtZT1EaWFncmFtYSBkZSBsYSBhY3RpdmlkYWQ6IHswfQ0KLWFjdGl2aXR5RGV0YWlsRGlhZ3JhbU5hbWU9RGlhZ3JhbWEgZGUgZGV0YWxsZSBkZSBsYSBhY3RpdmlkYWQ6IHswfQ0KLXdwRGVwZW5kZW5jeURpYWdyYW1OYW1lPURpYWdyYW1hIGRlIGRlcGVuZGVuY2lhIGRlbCBwcm9kdWN0byBkZSB0cmFiYWpvOiB7MH0NCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBSb2xlIGRpYWdyYW0gZm9udHMgYW5kIGxheW91dA0KLXJvbGVEaWFncmFtRm9udF9uYW1lPUFyaWFsDQotcm9sZURpYWdyYW1Gb250X25hbWVfd2luMzI9QXJpYWwNCi1yb2xlRGlhZ3JhbUZvbnRfc2l6ZT0xMA0KLXJvbGVEaWFncmFtRm9udF9zaXplX3dpbjMyPTEwDQotcm9sZURpYWdyYW1feE1hcmdpbj0yMDANCi1yb2xlRGlhZ3JhbV94U3BhY2luZz03MA0KLXJvbGVEaWFncmFtX3lTcGFjaW5nPTMwDQotDQotIyBsb2NhbGl6ZSB0aGUgdmFsdWUgYmFzZWQgb24gbG9jYWxlLiAgZm9yIGV4YW1wbGUsIA0KLSMgZm9yIEVuZ2xpc2gsIHRoZSB2YWx1ZSBpcyAiLiAiDQotI2NvbG9uX3dpdGhfc3BhY2U9OiANCi0jIGZvciBmcmVuY2gsIHRoZSB2YWx1ZSBpcyAiIC4gIiwgeW91IG5lZWQgdG8gdXNlIGEgXCB0byBwcmVzZXJ2ZSB0aGUgbGVhZGluZyBzcGFjZQ0KLSNjb2xvbl93aXRoX3NwYWNlPVwgOiANCi0jIGZvciBjaGluZXNlLCB0aGUgY29sb24gc2hvdWxkIGJlIGRvdWJsZSBieXRlcw0KLSMgRG9udCB0cmltIHRoZSBzcGFjZXMgYWZ0ZXIgdGhlIGNvbG9uLg0KLWNvbG9uX3dpdGhfc3BhY2U9OiANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE1ZTdmYzYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlc19mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXVua25vd25fdGV4dD1JbmNvbm51DQotDQotIyBFcnJvciBSZWFzb25zDQotZW1wdHlMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1MZSBjaGVtaW4gZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBlc3QgdmlkZS4NCi1taXNzaW5nTGlicmFyeUZpbGVFcnJvcl9yZWFzb249TGUgZmljaGllciBkZSBtb2RcdTAwZThsZSBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIGVzdCBtYW5xdWFudC4NCi11bnJlc29sdmVkUHJveHlFcnJvcl9yZWFzb249TGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBzXHUwMGU5bGVjdGlvbm5cdTAwZTllIGNvbnRpZW50IGRlcyByXHUwMGU5Zlx1MDBlOXJlbmNlcyBkJ1x1MDBlOWxcdTAwZTltZW50cyBub24gclx1MDBlOXNvbHVlcy4gQ2VjaSBlc3QgZ1x1MDBlOW5cdTAwZTlyYWxlbWVudCBkXHUwMGZiIFx1MDBlMCBkZXMgZmljaGllcnMgWE1JIG1hbnF1YW50cyBvdSBheWFudCBcdTAwZTl0XHUwMGU5IGRcdTAwZTlwbGFjXHUwMGU5cyBkYW5zIGxlIGRvc3NpZXIgQmlibGlvdGhcdTAwZThxdWUuXG5cbkZlcm1leiBjZXR0ZSBib1x1MDBlZXRlIGRlIGRpYWxvZ3VlIGV0IGFmZmljaGV6IGxhIHZ1ZSBQcm9ibFx1MDBlOG1lcyBhZmluIGQnaWRlbnRpZmllciBsZXMgclx1MDBlOWZcdTAwZTlyZW5jZXMgbm9uIHJcdTAwZTlzb2x1ZXMuIEFmaW4gZCdcdTAwZTl2aXRlciBkJ2VuZG9tbWFnZXIgbGEgYmlibGlvdGhcdTAwZThxdWUsIGlsIGVzdCBmb3J0ZW1lbnQgcmVjb21tYW5kXHUwMGU5IGRlIGNvbW1lbmNlciBwYXIgclx1MDBlOXNvdWRyZSBjZXMgclx1MDBlOWZcdTAwZTlyZW5jZXMgYXZhbnQgZCdham91dGVyIGQnYXV0cmVzIG1vZGlmaWNhdGlvbnMgXHUwMGUwIGxhIGJpYmxpb3RoXHUwMGU4cXVlLg0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcw0KLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzE9SVVQTDAwMDdXIDogdW4gb3UgcGx1c2lldXJzIFx1MDBlOWxcdTAwZTltZW50cyBlbmZhbnQgY29udGllbm5lbnQgZGVzIHJcdTAwZTlmXHUwMGU5cmVuY2VzIG1hbnF1YW50ZXMNCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cyPUlVUEwwMDA4VzogQ2V0IFx1MDBlOWxcdTAwZTltZW50IGRvaXQgXHUwMGVhdHJlIHNcdTAwZTlsZWN0aW9ublx1MDBlOSBhZmluIGRlIHJcdTAwZTlzb3VkcmUgdW5lIG91IHBsdXNpZXVycyByXHUwMGU5Zlx1MDBlOXJlbmNlcyBtYW5xdWFudGVzDQotY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMz1JVVBMMDAwOVc6IENldCBcdTAwZTlsXHUwMGU5bWVudCByXHUwMGU5Zlx1MDBlOXJlbmNlIHVuIG91IHBsdXNpZXVycyBcdTAwZTlsXHUwMGU5bWVudHMgZCd1biBwYWNrYWdlIG5vbiBzXHUwMGU5bGVjdGlvbm5cdTAwZTkNCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbG9hZFJlc291cmNlc0Vycm9yX21zZz1JVVBMMDAwMEUgOiBMYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIGEgXHUwMGU5dFx1MDBlOSBjaGFyZ1x1MDBlOWUgbWFpcyBkZXMgZXJyZXVycyBvbnQgXHUwMGU5dFx1MDBlOSBkXHUwMGU5dGVjdFx1MDBlOWVzLg0KLXVuc3VwcG9ydGVkR3VpZGFuY2VUeXBlRXJyb3JfbXNnPUlVUEwwMDAxRSA6IENlIGNvbnNlaWwgbmUgcGV1dCBwYXMgXHUwMGVhdHJlIGNvbnZlcnRpIGRhbnMgdW4gYXV0cmUgdHlwZS4NCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDJFIDogQ2UgY29uc2VpbCBuZSBwZXV0IHBhcyBcdTAwZWF0cmUgY29udmVydGkgZGFucyBsZSB0eXBlIGNpYmxlLg0KLXNhdmVDb252ZXJ0ZWRHdWlkYW5jZUVycm9yX21zZz1JVVBMMDAwM0UgOiBJbXBvc3NpYmxlIGRlIHNhdXZlZ2FyZGVyIGxlIGNvbnNlaWwgY29udmVydGkgJyd7MH0nJy4NCi0NCi0jIENvbnZlcnQgYWN0aXZpdHkNCi1jb252ZXJ0QWN0aXZpdHlFcnJvcl90aXRsZT1FcnJldXIgZGUgY29udmVyc2lvbiBkZSB0eXBlIGQnYWN0aXZpdFx1MDBlOQ0KLWNvbnZlcnRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwNkUgOiBDZXR0ZSBhY3Rpdml0XHUwMGU5IG5lIHBldXQgcGFzIFx1MDBlYXRyZSBjb252ZXJ0aWUgZGFucyBsZSB0eXBlIGNpYmxlLg0KLXNhdmVDb252ZXJ0ZWRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwN0UgOiBJbXBvc3NpYmxlIGRlIHNhdXZlZ2FyZGVyIGwnJ2FjdGl2aXRcdTAwZTkgY29udmVydGllICcnezB9JycuDQotDQotIyBFcnJvciBSZWFzb25zDQotZXJyb3JfcmVhc29uPUlVUEwwMDA0RSA6IFVuZSBlcnJldXIgcydlc3QgcHJvZHVpdGUuIENsaXF1ZXogc3VyIE9LIHBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucy4NCi11bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX3JlYXNvbj1JbCBuJydleGlzdGUgYXVjdW4gdHlwZSBkZSBjb25zZWlsIGNvbXBhdGlibGUgcG91ciB7MH0uDQotaW52YWxpZExpYnJhcnlQYXRoRXJyb3JfcmVhc29uPUNoZW1pbiBkZSBiaWJsaW90aFx1MDBlOHF1ZSBub24gdmFsaWRlLiBMZSBmaWNoaWVyIHByb2pldCBuJ2EgcGFzIHB1IFx1MDBlYXRyZSBjclx1MDBlOVx1MDBlOS4NCi1jb3VsZE5vdExvY2tMaWJyYXJ5X3JlYXNvbj1JbXBvc3NpYmxlIGRlIHZlcnJvdWlsbGVyIGxhIGJpYmxpb3RoXHUwMGU4cXVlLg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1jb3B5aW5nQXR0YWNobWVudHNUYXNrX25hbWU9Q29waWUgZGVzIHBpXHUwMGU4Y2VzIGpvaW50ZXMuLi4NCi0NCi0jIENvbnZlcnQgR3VpZGFuY2UgRGlhbG9nDQotY29udmVydEd1aWRhbmNlRGlhbG9nX3RpdGxlPUNvbnZlcnRpciBsZSB0eXBlIGRlIGNvbnNlaWwNCi1jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGV4dD1TXHUwMGU5bGVjdGlvbm5leiBsZSB0eXBlIGRlIGNvbnNlaWwgY2libGUuDQotDQotIyBHdWlkYW5jZSB0eXBlIG5hbWVzIGZvciBDb252ZXJ0IEd1aWRhbmNlIERpYWxvZyAtIHNob3VsZCBiZSByZWZhY3RvcmVkIGludG8gbGlicmFyeS51aQ0KLWNoZWNrbGlzdF90ZXh0PUxpc3RlIGRlIGNvbnRyXHUwMGY0bGUNCi1jb25jZXB0X3RleHQ9Q29uY2VwdA0KLWV4YW1wbGVfdGV4dD1FeGVtcGxlDQotZ3VpZGVsaW5lX3RleHQ9SW5zdHJ1Y3Rpb25zDQotZXN0aW1hdGVfdGV4dD1Fc3RpbWF0aW9uDQotZXN0aW1hdGluZ01ldHJpY190ZXh0PU1lc3VyZSBkJ2VzdGltYXRpb24NCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dD1Db25zaWRcdTAwZTlyYXRpb25zIHJlbGF0aXZlcyBcdTAwZTAgbCdlc3RpbWF0aW9uDQotcmVwb3J0X3RleHQ9UmFwcG9ydA0KLXRlbXBsYXRlX3RleHQ9Q2FuZXZhcw0KLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0PURvY3VtZW50IGQnYWNjb21wYWduZW1lbnQNCi10b29sTWVudG9yX3RleHQ9R3VpZGUgZCd1dGlsaXNhdGlvbiBkZSBsJ291dGlsDQotd2hpdGVwYXBlcl90ZXh0PUxpdnJlIGJsYW5jDQotdGVybURlZmluaXRpb25fdGV4dD1EXHUwMGU5ZmluaXRpb24gZGUgdGVybWUNCi1wcmFjdGljZV90ZXh0PVByYXRpcXVlDQotcmV1c2FibGVBc3NldF90ZXh0PVJlc3NvdXJjZSByXHUwMGU5dXRpbGlzYWJsZQ0KLQ0KLSNhY3Rpdml0eSBicmVha2Rvd24gaW5mbyBzdHJpbmdzDQotQWN0aXZpdHlMYXlvdXRfcHJpbWFyeVRhc2tzX3RleHQ9RWZmZWN0dWUgZW4gdGFudCBxdWUgcHJvcHJpXHUwMGU5dGFpcmUNCi1BY3Rpdml0eUxheW91dF9hZGRpdGlvbmFsVGFza3NfdGV4dD1FZmZlY3R1ZSBlbiBzdXBwbFx1MDBlOW1lbnQNCi0NCi0NCi0jIENvbnZlcnQgR3VpZGFuY2UgRXJyb3IgTWVzc2FnZXMNCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl90aXRsZT1FcnJldXIgZGUgY29udmVyc2lvbiBkdSB0eXBlIGRlIGNvbnNlaWwNCi0NCi0jIExvYWQgUmVzb3VyY2VzIEVycm9yIERpYWxvZw0KLWxvYWRSZXNvdXJjZXNFcnJvcl90aXRsZT1FcnJldXIgZCdvdXZlcnR1cmUgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcw0KLWxvYWRSZXNvdXJjZXNFcnJvcl9yZWFzb249Q2VydGFpbmVzIHJlc3NvdXJjZXMgZGUgYmlibGlvdGhcdTAwZThxdWUgbidvbnQgcGFzIHB1IFx1MDBlYXRyZSBjaGFyZ1x1MDBlOWVzLlxuXG5DbGlxdWV6IHN1ciBEXHUwMGU5dGFpbHMgcG91ciByXHUwMGU5dmlzZXIgbGVzIGVycmV1cnMgZXQgbGVzIHJcdTAwZTlzb3VkcmUgYXZhbnQgZCdham91dGVyIGRhdmFudGFnZSBkZSBtb2RpZmljYXRpb25zIFx1MDBlMCBsYSBiaWJsaW90aFx1MDBlOHF1ZS4NCi0NCi0jIFJvbGUgRGlhZ3JhbXMNCi1yb2xlRGlhZ3JhbVBlcmZvcm1zX3RleHQ9ZXhcdTAwZTljdXRlDQotcm9sZURpYWdyYW1SZXNwb25zaWJsZUZvcl90ZXh0PXJlc3BvbnNhYmxlIGRlDQotDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMD1FbFx1MDBlOW1lbnQgclx1MDBlOWZcdTAwZTlyZW5jXHUwMGU5IDogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMT1JbmZvIDogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHND1BdmVydGlzc2VtZW50IDogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHNz1FcnJldXIgOiB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMD1FbFx1MDBlOW1lbnQgclx1MDBlOWZcdTAwZTlyZW5jXHUwMGU5IHswfSBtYW5xdWFudA0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzExPUltcG9zc2libGUgZGUgdHJvdXZlciBkJydcdTAwZTlsXHUwMGU5bWVudCBwb3VyIGwnJ2lkZW50aWZpY2F0ZXVyIGdsb2JhbCB1bmlxdWUgezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTI9TGUgZmljaGllciAnJ3swfScnIHJcdTAwZTlmXHUwMGU5cmVuY2UgbGEgcmVzc291cmNlIG1hbnF1YW50ZSAnJ3sxfScnDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTU9RmljaGllciBkZSByZXNzb3VyY2VzICcnezB9JycgbWFucXVhbnQNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNz1Db25uZXhpb24gXHUwMGUwIGwnJ1VSTCAnJ3swfScnIGltcG9zc2libGUNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxOT1Db25uZXhpb24gXHUwMGUwIGwnJ1VSTCAnJ3swfScnIGltcG9zc2libGUgOiB7MX0NCi1JbXBvcnRFeHBvcnRVdGlsX01TRzg9RmljaGllciAnJ3swfScnIGludHJvdXZhYmxlLg0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOT1JbXBvc3NpYmxlIGRlIGNyXHUwMGU5ZXIgbGUgclx1MDBlOXBlcnRvaXJlIHRlbXBvcmFpcmUgJyd7MH0nJy4NCi11bmtub3duR3VpZGFuY2VfdGV4dD1JbmNvbm51DQotDQotQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbl9sb2dfbm9Db250ZW50UGF0aD1Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uLkhhbmRsZUF0dGFjaG1lbnRzUGx1Z2luOiBhdWN1biBjaGVtaW4gZGUgY29udGVudSBwb3VyIHswfQ0KLUxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXJfY2Fubm90VXBkYXRlPUlVUEwwMDA2VyA6IEltcG9zc2libGUgZGUgbWV0dHJlIFx1MDBlMCBqb3VyIHswfSB7MX0NCi13YXJuaW5nRGxnX3RpdGxlPUF2ZXJ0aXNzZW1lbnQNCi1lcnJvckRsZ190aXRsZT1FcnJldXINCi1lcnJvckRsZ19zYXZlRXJyb3I9SVVQTDAwMDVFIDogRXJyZXVyIGxvcnMgZGUgbCcnZW5yZWdpc3RyZW1lbnQgZGVzIG1vZGlmaWNhdGlvbnMgZGFucyBsZSBmaWNoaWVyICcnezB9JycNCi0NCi0jIGFjdGl2aXR5IGRpYWdyYW0gbmFtZXMNCi1hY3Rpdml0eURpYWdyYW1OYW1lPURpYWdyYW1tZSBkJydhY3Rpdml0XHUwMGU5IDogezB9DQotYWN0aXZpdHlEZXRhaWxEaWFncmFtTmFtZT1EaWFncmFtbWUgZFx1MDBlOXRhaWxsXHUwMGU5IGQnJ2FjdGl2aXRcdTAwZTkgOiB7MH0NCi13cERlcGVuZGVuY3lEaWFncmFtTmFtZT1EaWFncmFtbWUgZGUgZFx1MDBlOXBlbmRhbmNlIGRlIHByb2R1aXQgZGUgdHJhdmFpbCA6IHswfQ0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIFJvbGUgZGlhZ3JhbSBmb250cyBhbmQgbGF5b3V0DQotcm9sZURpYWdyYW1Gb250X25hbWU9QXJpYWwNCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMj1BcmlhbA0KLXJvbGVEaWFncmFtRm9udF9zaXplPTEwDQotcm9sZURpYWdyYW1Gb250X3NpemVfd2luMzI9MTANCi1yb2xlRGlhZ3JhbV94TWFyZ2luPTIwMA0KLXJvbGVEaWFncmFtX3hTcGFjaW5nPTcwDQotcm9sZURpYWdyYW1feVNwYWNpbmc9MzANCi0NCi0jIGxvY2FsaXplIHRoZSB2YWx1ZSBiYXNlZCBvbiBsb2NhbGUuICBmb3IgZXhhbXBsZSwgDQotIyBmb3IgRW5nbGlzaCwgdGhlIHZhbHVlIGlzICIuICINCi0jY29sb25fd2l0aF9zcGFjZT06IA0KLSMgZm9yIGZyZW5jaCwgdGhlIHZhbHVlIGlzICIgLiAiLCB5b3UgbmVlZCB0byB1c2UgYSBcIHRvIHByZXNlcnZlIHRoZSBsZWFkaW5nIHNwYWNlDQotI2NvbG9uX3dpdGhfc3BhY2U9XCA6IA0KLSMgZm9yIGNoaW5lc2UsIHRoZSBjb2xvbiBzaG91bGQgYmUgZG91YmxlIGJ5dGVzDQotIyBEb250IHRyaW0gdGhlIHNwYWNlcyBhZnRlciB0aGUgY29sb24uDQotY29sb25fd2l0aF9zcGFjZT1cIDogDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMTdhYzkzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi11bmtub3duX3RleHQ9U2Nvbm9zY2l1dG8gDQotIyBFcnJvciBSZWFzb25zDQotZW1wdHlMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1JbCBwZXJjb3JzbyBkZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIFx1MDBlOCB2dW90by4NCi1taXNzaW5nTGlicmFyeUZpbGVFcnJvcl9yZWFzb249SWwgZmlsZSBkZWwgbW9kZWxsbyBkZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIG1hbmNhLg0KLXVucmVzb2x2ZWRQcm94eUVycm9yX3JlYXNvbj1MYSBsaWJyZXJpYSBkZWkgbWV0b2RpIHNlbGV6aW9uYXRhIGNvbnRpZW5lIHJpZmVyaW1lbnRpIGFkIGVsZW1lbnRpIG5vbiByaXNvbHRpLiBEaSBzb2xpdG8sIHF1ZXN0byBwcm9ibGVtYSBcdTAwZTggY2F1c2F0byBkYSBmaWxlIFhNSSBjaGUgbWFuY2FubyBvIGNoZSBzb25vIHN0YXRpIHNwb3N0YXRpIG5lbGxhIGNhcnRlbGxhIGRlbGxlIGxpYnJlcmllLlxuXG5DaGl1ZGVyZSBxdWVzdGEgZmluZXN0cmEgZGkgZGlhbG9nbyBlIHZpc3VhbGl6emFyZSBsYSB2aXN0YSBQcm9ibGVtaSBwZXIgaWRlbnRpZmljYXJlIGkgcmlmZXJpbWVudGkgbm9uIHJpc29sdGkuIFBlciBldml0YXJlIGNoZSBsYSBsaWJyZXJpYSBzaSBkYW5uZWdnaSwgc2kgY29uc2lnbGlhIGRpIHJpc29sdmVyZSBxdWVzdGkgcmlmZXJpbWVudGkgcHJpbWEgZGkgYXBwb3J0YXJlIHVsdGVyaW9yaSBtb2RpZmljaGUgYWxsYSBsaWJyZXJpYS4NCi0NCi0jIFdhcm5pbmcgTWVzc2FnZXMNCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cxPUlVUEwwMDA3VzogVW5vIG8gcGlcdTAwZjkgZWxlbWVudGkgY2hpbGQgY29udGVuZ29ubyByaWZlcmltZW50aSBtYW5jYW50aQ0KLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzI9SVVQTDAwMDhXOiBRdWVzdG8gZWxlbWVudG8gZG92cmViYmUgZXNzZXJlIHNlbGV6aW9uYXRvIHBlciByaXNvbHZlcmUgdW5vIG8gcGlcdTAwZjkgZWxlbWVudGkgbWFuY2FudGkNCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2czPUlVUEwwMDA5VzogUXVlc3RvIGVsZW1lbnRvIGZhIHJpZmVyaW1lbnRvIGEgdW5vIG8gcGlcdTAwZjkgZWxlbWVudGkgZGkgdW4gcGFjY2hldHRvIG5vbiBzZWxlemlvbmF0bw0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1sb2FkUmVzb3VyY2VzRXJyb3JfbXNnPUlVUEwwMDAwRTogTGEgbGlicmVyaWEgZGVpIG1ldG9kaSBcdTAwZTggc3RhdGEgY2FyaWNhdGEsIG1hIHNvbm8gc3RhdGkgcmlsZXZhdGkgYWxjdW5pIGVycm9yaS4NCi11bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX21zZz1JVVBMMDAwMUU6IFF1ZXN0YSBndWlkYSBub24gcHVcdTAwZjIgZXNzZXJlIGNvbnZlcnRpdGEgaW4gdW4gYWx0cm8gdGlwby4NCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDJFOiBRdWVzdGEgZ3VpZGEgbm9uIHB1XHUwMGYyIGVzc2VyZSBjb252ZXJ0aXRhIG5lbCB0aXBvIGRpIGRlc3RpbmF6aW9uZS4NCi1zYXZlQ29udmVydGVkR3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDNFOiBMYSBndWlkYSBjb252ZXJ0aXRhICcnezB9Jycgbm9uIHB1XHUwMGYyIGVzc2VyZSBzYWx2YXRhLg0KLQ0KLSMgQ29udmVydCBhY3Rpdml0eQ0KLWNvbnZlcnRBY3Rpdml0eUVycm9yX3RpdGxlPUVycm9yZSBkdXJhbnRlIGxhIGNvbnZlcnNpb25lIGRlbCB0aXBvIGRpIGF0dGl2aXRcdTAwZTANCi1jb252ZXJ0QWN0aXZpdHlFcnJvcl9tc2c9SVVQTDAwMDZFOiBRdWVzdGEgYXR0aXZpdFx1MDBlMCBub24gcHVcdTAwZjIgZXNzZXJlIGNvbnZlcnRpdGEgbmVsIHRpcG8gZGkgZGVzdGluYXppb25lLg0KLXNhdmVDb252ZXJ0ZWRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwN0U6IEwnJ2F0dGl2aXRcdTAwZTAgY29udmVydGl0YSAnJ3swfScnIG5vbiBwdVx1MDBmMiBlc3NlcmUgc2FsdmF0YS4NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249SVVQTDAwMDRFOiBTaSBcdTAwZTggdmVyaWZpY2F0byB1biBlcnJvcmUuIEZhcmUgY2xpYyBzdSBPSyBwZXIgdWx0ZXJpb3JpIGluZm9ybWF6aW9uaS4NCi11bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX3JlYXNvbj1Ob24gYycnXHUwMGU4IHVuIHRpcG8gZGkgZ3VpZGEgY29tcGF0aWJpbGUgcGVyIHswfS4NCi1pbnZhbGlkTGlicmFyeVBhdGhFcnJvcl9yZWFzb249UGVyY29yc28gZGVsbGEgbGlicmVyaWEgbm9uIHZhbGlkby4gSW1wb3NzaWJpbGUgY3JlYXJlIGlsIGZpbGUgLnByb2plY3QuDQotY291bGROb3RMb2NrTGlicmFyeV9yZWFzb249SW1wb3NzaWJpbGUgYmxvY2NhcmUgbGEgbGlicmVyaWEuDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWNvcHlpbmdBdHRhY2htZW50c1Rhc2tfbmFtZT1Db3BpYSBkZWdsaSBhbGxlZ2F0aSBpbiBjb3Jzby4uLg0KLQ0KLSMgQ29udmVydCBHdWlkYW5jZSBEaWFsb2cNCi1jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGl0bGU9Q29udmVydGkgdGlwbyBkaSBndWlkYQ0KLWNvbnZlcnRHdWlkYW5jZURpYWxvZ190ZXh0PVNlbGV6aW9uYXJlIGlsIHRpcG8gZGkgZ3VpZGEgZGkgZGVzdGluYXppb25lLg0KLQ0KLSMgR3VpZGFuY2UgdHlwZSBuYW1lcyBmb3IgQ29udmVydCBHdWlkYW5jZSBEaWFsb2cgLSBzaG91bGQgYmUgcmVmYWN0b3JlZCBpbnRvIGxpYnJhcnkudWkNCi1jaGVja2xpc3RfdGV4dD1FbGVuY28gZGkgY29udHJvbGxvDQotY29uY2VwdF90ZXh0PUNvbmNldHRvDQotZXhhbXBsZV90ZXh0PUVzZW1waW8NCi1ndWlkZWxpbmVfdGV4dD1MaW5lYSBndWlkYQ0KLWVzdGltYXRlX3RleHQ9VmFsdXRhemlvbmUNCi1lc3RpbWF0aW5nTWV0cmljX3RleHQ9TWV0cmljYSBkaSB2YWx1dGF6aW9uZQ0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0PUNvbnNpZGVyYXppb25pIHN1bGxhIHZhbHV0YXppb25lDQotcmVwb3J0X3RleHQ9UmVwb3J0DQotdGVtcGxhdGVfdGV4dD1Nb2RlbGxvDQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ9TWF0ZXJpYWxlIGRpIHN1cHBvcnRvDQotdG9vbE1lbnRvcl90ZXh0PUd1aWRhIGFsIHRvb2wNCi13aGl0ZXBhcGVyX3RleHQ9V2hpdGVwYXBlcg0KLXRlcm1EZWZpbml0aW9uX3RleHQ9RGVmaW5pemlvbmUgdGVybWluZQ0KLXByYWN0aWNlX3RleHQ9UHJvY2VkdXJhDQotcmV1c2FibGVBc3NldF90ZXh0PVJpc29yc2Egcml1dGlsaXp6YWJpbGUNCi0NCi0jYWN0aXZpdHkgYnJlYWtkb3duIGluZm8gc3RyaW5ncw0KLUFjdGl2aXR5TGF5b3V0X3ByaW1hcnlUYXNrc190ZXh0PUVzZWd1ZSBjb21lIHByb3ByaWV0YXJpbw0KLUFjdGl2aXR5TGF5b3V0X2FkZGl0aW9uYWxUYXNrc190ZXh0PUVzZWd1ZSBjb21lIGFnZ2l1bnRpdm8NCi0NCi0NCi0jIENvbnZlcnQgR3VpZGFuY2UgRXJyb3IgTWVzc2FnZXMNCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl90aXRsZT1FcnJvcmUgZHVyYW50ZSBsYSBjb252ZXJzaW9uZSBkZWwgdGlwbyBkaSBndWlkYQ0KLQ0KLSMgTG9hZCBSZXNvdXJjZXMgRXJyb3IgRGlhbG9nDQotbG9hZFJlc291cmNlc0Vycm9yX3RpdGxlPUVycm9yZSBkdXJhbnRlIGwnYXBlcnR1cmEgZGVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaQ0KLWxvYWRSZXNvdXJjZXNFcnJvcl9yZWFzb249Tm9uIFx1MDBlOCBzdGF0byBwb3NzaWJpbGUgY2FyaWNhcmUgYWxjdW5lIHJpc29yc2UgZGVsbGEgbGlicmVyaWEuXG5cbkZhcmUgY2xpYyBzdSBEZXR0YWdsaSBwZXIgZXNhbWluYXJlIGdsaSBlcnJvcmkgZSByaXNvbHZlcmxpIHByaW1hIGRpIGFwcG9ydGFyZSB1bHRlcmlvcmkgbW9kaWZpY2hlIGFsbGEgbGlicmVyaWEuDQotDQotIyBSb2xlIERpYWdyYW1zDQotcm9sZURpYWdyYW1QZXJmb3Jtc190ZXh0PWVzZWd1ZQ0KLXJvbGVEaWFncmFtUmVzcG9uc2libGVGb3JfdGV4dD1yZXNwb25zYWJpbGUgZGkNCi0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cwPUVsZW1lbnRvIGEgY3VpIHNpIGZhIHJpZmVyaW1lbnRvOiB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxPUluZm86IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzQ9QXZ2aXNvOiB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0c3PUVycm9yZTogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTA9RWxlbWVudG8gYSBjdWkgc2kgZmEgcmlmZXJpbWVudG8gbWFuY2FudGUgezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTE9SW1wb3NzaWJpbGUgdHJvdmFyZSBsJydlbGVtZW50byBwZXIgaWwgZ3VpZCB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMj1JbCBmaWxlICcnezB9JycgZmEgcmlmZXJpbWVudG8gYWxsYSByaXNvcnNhIG1hbmNhbnRlICcnezF9JycNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNT1GaWxlIGRpIHJpc29yc2UgbWFuY2FudGUgJyd7MH0nJw0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE3PUltcG9zc2liaWxlIGNvbm5ldHRlcnNpIGFsbCcnVVJMICcnezB9JycNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxOT1JbXBvc3NpYmlsZSBjb25uZXR0ZXJzaSBhbGwnJ1VSTCAnJ3swfScnOiB7MX0NCi1JbXBvcnRFeHBvcnRVdGlsX01TRzg9SW1wb3NzaWJpbGUgdHJvdmFyZSBpbCBmaWxlICcnezB9JycuDQotSW1wb3J0RXhwb3J0VXRpbF9NU0c5PUltcG9zc2liaWxlIGNyZWFyZSBsYSBkaXJlY3RvcnkgdGVtcCAnJ3swfScnLg0KLXVua25vd25HdWlkYW5jZV90ZXh0PVNjb25vc2NpdXRvIA0KLUNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb25fbG9nX25vQ29udGVudFBhdGg9Q29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbi5IYW5kbGVBdHRhY2htZW50c1BsdWdpbjogbm8gY29udGVudFBhdGggZm9yIHswfQ0KLUxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXJfY2Fubm90VXBkYXRlPUlVUEwwMDA2VzogSW1wb3NzaWJpbGUgYWdnaW9ybmFyZSB7MH0gezF9DQotd2FybmluZ0RsZ190aXRsZT1BdnZpc28NCi1lcnJvckRsZ190aXRsZT1FcnJvcmUNCi1lcnJvckRsZ19zYXZlRXJyb3I9SVVQTDAwMDVFOiBTaSBcdTAwZTggdmVyaWZpY2F0byB1biBlcnJvcmUgZHVyYW50ZSBsZSBtb2RpZmljaGUgYWwgZmlsZSAnJ3swfScnDQotDQotIyBhY3Rpdml0eSBkaWFncmFtIG5hbWVzDQotYWN0aXZpdHlEaWFncmFtTmFtZT1EaWFncmFtbWEgYXR0aXZpdFx1MDBlMDogezB9DQotYWN0aXZpdHlEZXRhaWxEaWFncmFtTmFtZT1EaWFncmFtbWEgZGV0dGFnbGkgYXR0aXZpdFx1MDBlMDogezB9DQotd3BEZXBlbmRlbmN5RGlhZ3JhbU5hbWU9RGlhZ3JhbW1hIGRpcGVuZGVuemUgcHJvZG90dG8gZGkgbGF2b3JvOiB7MH0NCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBSb2xlIGRpYWdyYW0gZm9udHMgYW5kIGxheW91dA0KLXJvbGVEaWFncmFtRm9udF9uYW1lPUFyaWFsDQotcm9sZURpYWdyYW1Gb250X25hbWVfd2luMzI9QXJpYWwNCi1yb2xlRGlhZ3JhbUZvbnRfc2l6ZT0xMA0KLXJvbGVEaWFncmFtRm9udF9zaXplX3dpbjMyPTEwDQotcm9sZURpYWdyYW1feE1hcmdpbj0yMDANCi1yb2xlRGlhZ3JhbV94U3BhY2luZz03MA0KLXJvbGVEaWFncmFtX3lTcGFjaW5nPTMwDQotDQotIyBsb2NhbGl6ZSB0aGUgdmFsdWUgYmFzZWQgb24gbG9jYWxlLiAgZm9yIGV4YW1wbGUsIA0KLSMgZm9yIEVuZ2xpc2gsIHRoZSB2YWx1ZSBpcyAiLiAiDQotI2NvbG9uX3dpdGhfc3BhY2U9OiANCi0jIGZvciBmcmVuY2gsIHRoZSB2YWx1ZSBpcyAiIC4gIiwgeW91IG5lZWQgdG8gdXNlIGEgXCB0byBwcmVzZXJ2ZSB0aGUgbGVhZGluZyBzcGFjZQ0KLSNjb2xvbl93aXRoX3NwYWNlPVwgOiANCi0jIGZvciBjaGluZXNlLCB0aGUgY29sb24gc2hvdWxkIGJlIGRvdWJsZSBieXRlcw0KLSMgRG9udCB0cmltIHRoZSBzcGFjZXMgYWZ0ZXIgdGhlIGNvbG9uLg0KLWNvbG9uX3dpdGhfc3BhY2U9OiANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhZGUzYTAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXVua25vd25fdGV4dD1cdTRlMGRcdTY2MGUNCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lbXB0eUxpYnJhcnlQYXRoRXJyb3JfcmVhc29uPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzBmYlx1MzBkMVx1MzBiOVx1MzA0Y1x1N2E3YVx1MzA2N1x1MzA1OVx1MzAwMg0KLW1pc3NpbmdMaWJyYXJ5RmlsZUVycm9yX3JlYXNvbj1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZTJcdTMwYzdcdTMwZWJcdTMwZmJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi11bnJlc29sdmVkUHJveHlFcnJvcl9yZWFzb249XHU2NzJhXHU4OWUzXHU2YzdhXHUzMDZlXHU4OTgxXHU3ZDIwXHU1M2MyXHU3MTY3XHUzMDRjXHU1NDJiXHUzMDdlXHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDRjXHU5MDc4XHU2MjllXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyIFx1MzA1M1x1MzA4Y1x1MzA2Zlx1OTAxYVx1NWUzOFx1MzAwMVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzBmYlx1MzBkNVx1MzBhOVx1MzBlYlx1MzBjMFx1MzBmY1x1NTE4NVx1MzA2YiBYTUkgXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDRjXHUzMDZhXHUzMDQ0XHUzMDRiXHU3OWZiXHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDVmXHUzMDUzXHUzMDY4XHUzMDRjXHU1MzlmXHU1NmUwXHUzMDY3XHUzMDU5XHUzMDAyXG5cblx1MzA1M1x1MzA2ZVx1MzBjMFx1MzBhNFx1MzBhMlx1MzBlZFx1MzBiMFx1MzA5Mlx1OTU4OVx1MzA1OFx1MzA2Nlx1MzAwMVx1NjcyYVx1ODllM1x1NmM3YVx1MzA2ZVx1NTNjMlx1NzE2N1x1MzA5Mlx1OGI1OFx1NTIyNVx1MzA1OVx1MzA4Ylx1MzA2ZVx1MzA2Ylx1NGZiZlx1NTIyOVx1MzA2YVx1MzAwY1x1NTU0Zlx1OTg0Y1x1MzAwZFx1MzBkM1x1MzBlNVx1MzBmY1x1MzA5Mlx1OGQ3N1x1NTJkNVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTc4MzRcdTY0MGRcdTMwOTJcdTk2MzJcdTMwNTBcdTMwNWZcdTMwODFcdTMwMDFcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmJcdTMwNTVcdTMwODlcdTMwNmJcdTU5MDlcdTY2ZjRcdTMwOTJcdTUyYTBcdTMwNDhcdTMwOGJcdTUyNGRcdTMwNmJcdTMwMDFcdTMwNTNcdTMwOGNcdTMwODlcdTMwNmVcdTUzYzJcdTcxNjdcdTMwOTJcdTg5ZTNcdTZjN2FcdTMwNTdcdTMwNjZcdTMwNGFcdTMwNGZcdTMwNTNcdTMwNjhcdTMwOTJcdTVmMzdcdTMwNGZcdTMwNGFcdTUyZTdcdTMwODFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIFdhcm5pbmcgTWVzc2FnZXMNCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cxPUlVUEwwMDA3VzogMSBcdTMwNjRcdTRlZTVcdTRlMGFcdTMwNmVcdTViNTBcdTg5ODFcdTdkMjBcdTMwNmJcdTMwMDFcdTZiMjBcdTg0M2RcdTMwNTdcdTMwNWZcdTUzYzJcdTcxNjdcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDINCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cyPUlVUEwwMDA4VzogMSBcdTMwNjRcdTRlZTVcdTRlMGFcdTMwNmVcdTZiMjBcdTg0M2RcdTMwNTdcdTMwNWZcdTUzYzJcdTcxNjdcdTMwOTJcdTg5ZTNcdTZjN2FcdTMwNTlcdTMwOGJcdTMwNWZcdTMwODFcdTMwNmJcdTMwMDFcdTMwNTNcdTMwNmVcdTg5ODFcdTdkMjBcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2czPUlVUEwwMDA5VzogXHUzMDUzXHUzMDZlXHU4OTgxXHU3ZDIwXHUzMDZmXHUzMDAxXHU2NzJhXHU5MDc4XHU2MjllXHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4XHU1MTg1XHUzMDZlIDEgXHUzMDY0XHU0ZWU1XHU0ZTBhXHUzMDZlXHU4OTgxXHU3ZDIwXHUzMDkyXHU1M2MyXHU3MTY3XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWxvYWRSZXNvdXJjZXNFcnJvcl9tc2c9SVVQTDAwMDBFOiBcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNGNcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwNGNcdTMwMDFcdTMwNDRcdTMwNGZcdTMwNjRcdTMwNGJcdTMwNmVcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTY5MWNcdTUxZmFcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi11bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX21zZz1JVVBMMDAwMUU6IFx1MzA1M1x1MzA2ZVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1MzA2Zlx1NTIyNVx1MzA2ZVx1MzBiZlx1MzBhNFx1MzBkN1x1MzA2Ylx1NTkwOVx1NjNkYlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLWNvbnZlcnRHdWlkYW5jZUVycm9yX21zZz1JVVBMMDAwMkU6IFx1MzA1M1x1MzA2ZVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1MzA2Zlx1MzBiZlx1MzBmY1x1MzBiMlx1MzBjM1x1MzBjOFx1MzBmYlx1MzBiZlx1MzBhNFx1MzBkN1x1MzA2Ylx1NTkwOVx1NjNkYlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLXNhdmVDb252ZXJ0ZWRHdWlkYW5jZUVycm9yX21zZz1JVVBMMDAwM0U6IFx1NTkwOVx1NjNkYlx1NmUwOFx1MzA3Zlx1MzA2ZVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOSAnJ3swfScnIFx1MzA5Mlx1NGZkZFx1N2JhMVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLQ0KLSMgQ29udmVydCBhY3Rpdml0eQ0KLWNvbnZlcnRBY3Rpdml0eUVycm9yX3RpdGxlPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1MzBmYlx1MzBiZlx1MzBhNFx1MzBkN1x1MzBmYlx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2ZVx1NTkwOVx1NjNkYg0KLWNvbnZlcnRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwNkU6IFx1MzA1M1x1MzA2ZVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1MzA2Zlx1MzBiZlx1MzBmY1x1MzBiMlx1MzBjM1x1MzBjOFx1MzBmYlx1MzBiZlx1MzBhNFx1MzBkN1x1MzA2Ylx1NTkwOVx1NjNkYlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLXNhdmVDb252ZXJ0ZWRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwN0U6IFx1NTkwOVx1NjNkYlx1NmUwOFx1MzA3Zlx1MzA2ZVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmYyAnJ3swfScnIFx1MzA5Mlx1NGZkZFx1N2JhMVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVycm9yX3JlYXNvbj1JVVBMMDAwNEU6IFx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiBcdThhNzNcdTMwNTdcdTMwNGZcdTMwNmZcdTMwMDFcdTMwMGNPS1x1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXVuc3VwcG9ydGVkR3VpZGFuY2VUeXBlRXJyb3JfcmVhc29uPXswfSBcdTMwNmJcdTMwNmZcdTMwMDFcdTRlOTJcdTYzZGJcdTYwMjdcdTMwNmVcdTMwNDJcdTMwOGJcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwZmJcdTMwYmZcdTMwYTRcdTMwZDdcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1pbnZhbGlkTGlicmFyeVBhdGhFcnJvcl9yZWFzb249XHU3MTIxXHU1MmI5XHUzMDZhXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQxXHUzMGI5XHUzMDAyIC5wcm9qZWN0IFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMg0KLWNvdWxkTm90TG9ja0xpYnJhcnlfcmVhc29uPVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1MzBlZFx1MzBjM1x1MzBhZlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMg0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1jb3B5aW5nQXR0YWNobWVudHNUYXNrX25hbWU9XHU2ZGZiXHU0ZWQ4XHUzMDkyXHUzMGIzXHUzMGQ0XHUzMGZjXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotDQotIyBDb252ZXJ0IEd1aWRhbmNlIERpYWxvZw0KLWNvbnZlcnRHdWlkYW5jZURpYWxvZ190aXRsZT1cdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwZmJcdTMwYmZcdTMwYTRcdTMwZDdcdTMwNmVcdTU5MDlcdTYzZGINCi1jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGV4dD1cdTMwYmZcdTMwZmNcdTMwYjJcdTMwYzNcdTMwYzhcdTMwNmVcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwZmJcdTMwYmZcdTMwYTRcdTMwZDdcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi0jIEd1aWRhbmNlIHR5cGUgbmFtZXMgZm9yIENvbnZlcnQgR3VpZGFuY2UgRGlhbG9nIC0gc2hvdWxkIGJlIHJlZmFjdG9yZWQgaW50byBsaWJyYXJ5LnVpDQotY2hlY2tsaXN0X3RleHQ9XHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHUzMGVhXHUzMGI5XHUzMGM4DQotY29uY2VwdF90ZXh0PVx1Njk4Mlx1NWZmNQ0KLWV4YW1wbGVfdGV4dD1cdTRmOGINCi1ndWlkZWxpbmVfdGV4dD1cdTMwYWNcdTMwYTRcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZjMNCi1lc3RpbWF0ZV90ZXh0PVx1ODk4Ylx1N2E0ZFx1MzA4Mlx1MzA4YQ0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dD1cdTg5OGJcdTdhNGRcdTMwODJcdTMwOGFcdTMwZTFcdTMwYzhcdTMwZWFcdTMwYzNcdTMwYWYNCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dD1cdTg5OGJcdTdhNGRcdTMwODJcdTMwOGFcdTgwMDNcdTYxNmVcdTRlOGJcdTk4MDUNCi1yZXBvcnRfdGV4dD1cdTMwZWNcdTMwZGRcdTMwZmNcdTMwYzgNCi10ZW1wbGF0ZV90ZXh0PVx1MzBjNlx1MzBmM1x1MzBkN1x1MzBlY1x1MzBmY1x1MzBjOA0KLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0PVx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1OGNjN1x1NjU5OQ0KLXRvb2xNZW50b3JfdGV4dD1cdTMwYzRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwZTFcdTMwZjNcdTMwYmZcdTMwZmMNCi13aGl0ZXBhcGVyX3RleHQ9XHUzMGRiXHUzMGVmXHUzMGE0XHUzMGM4XHUzMGZiXHUzMGRhXHUzMGZjXHUzMGQxXHUzMGZjDQotdGVybURlZmluaXRpb25fdGV4dD1cdTc1MjhcdThhOWVcdTViOWFcdTdmYTkNCi1wcmFjdGljZV90ZXh0PVx1MzBkN1x1MzBlOVx1MzBhZlx1MzBjNlx1MzBhM1x1MzBiOQ0KLXJldXNhYmxlQXNzZXRfdGV4dD1cdTUxOGRcdTUyMjlcdTc1MjhcdTUzZWZcdTgwZmRcdTMwNmFcdTMwYTJcdTMwYmJcdTMwYzNcdTMwYzgNCi0NCi0jYWN0aXZpdHkgYnJlYWtkb3duIGluZm8gc3RyaW5ncw0KLUFjdGl2aXR5TGF5b3V0X3ByaW1hcnlUYXNrc190ZXh0PVx1NjI0MFx1NjcwOVx1ODAwNVx1MzA2OFx1MzA1N1x1MzA2Nlx1NWI5Zlx1ODg0Yw0KLUFjdGl2aXR5TGF5b3V0X2FkZGl0aW9uYWxUYXNrc190ZXh0PVx1OGZmZFx1NTJhMFx1MzA2OFx1MzA1N1x1MzA2Nlx1NWI5Zlx1ODg0Yw0KLQ0KLQ0KLSMgQ29udmVydCBHdWlkYW5jZSBFcnJvciBNZXNzYWdlcw0KLWNvbnZlcnRHdWlkYW5jZUVycm9yX3RpdGxlPVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOVx1MzBmYlx1MzBiZlx1MzBhNFx1MzBkN1x1MzBmYlx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2ZVx1NTkwOVx1NjNkYg0KLQ0KLSMgTG9hZCBSZXNvdXJjZXMgRXJyb3IgRGlhbG9nDQotbG9hZFJlc291cmNlc0Vycm9yX3RpdGxlPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzBmYlx1MzBhOFx1MzBlOVx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0Zg0KLWxvYWRSZXNvdXJjZXNFcnJvcl9yZWFzb249XHU0ZTAwXHU5MGU4XHUzMDZlXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDkyXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmXHUzMDAyXG5cblx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2Ylx1MzA1NVx1MzA4OVx1MzA2Ylx1NTkwOVx1NjZmNFx1MzA5Mlx1NTJhMFx1MzA0OFx1MzA4Ylx1NTI0ZFx1MzA2Ylx1MzAwMVx1MzAwY1x1OGE3M1x1N2QzMFx1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzBhOFx1MzBlOVx1MzBmY1x1MzA5Mlx1NjkxY1x1OGEwZVx1MzA1N1x1MzAwMVx1ODllM1x1NmM3YVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLQ0KLSMgUm9sZSBEaWFncmFtcw0KLXJvbGVEaWFncmFtUGVyZm9ybXNfdGV4dD1cdTViOWZcdTg4NGMNCi1yb2xlRGlhZ3JhbVJlc3BvbnNpYmxlRm9yX3RleHQ9XHU2MmM1XHU1ZjUzDQotDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMD1cdTUzYzJcdTcxNjdcdTViZmVcdThjNjFcdTMwNmVcdTg5ODFcdTdkMjA6IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE9XHU2MGM1XHU1ODMxOiB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0c0PVx1OGI2Nlx1NTQ0YTogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHNz1cdTMwYThcdTMwZTlcdTMwZmM6IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEwPVx1NTNjMlx1NzE2N1x1NWJmZVx1OGM2MVx1MzA2ZVx1ODk4MVx1N2QyMFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MyB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMT1ndWlkIHswfSBcdTMwNmVcdTg5ODFcdTdkMjBcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMj1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgJyd7MH0nJyBcdTMwNmZcdTMwMDFcdTZiMjBcdTg0M2RcdTMwNTdcdTMwNWZcdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjkgJyd7MX0nJyBcdTMwOTJcdTUzYzJcdTcxNjdcdTMwNTdcdTMwN2VcdTMwNTkNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNT1cdTZiMjBcdTg0M2RcdTMwNTdcdTMwNWZcdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwZmJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgJyd7MH0nJw0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE3PVVSTCAnJ3swfScnIFx1MzA2Ylx1NjNhNVx1N2Q5YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE5PVVSTCAnJ3swfScnOiB7MX0gXHUzMDZiXHU2M2E1XHU3ZDlhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzDQotSW1wb3J0RXhwb3J0VXRpbF9NU0c4PVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiAnJ3swfScnIFx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMg0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOT1cdTRlMDBcdTY2NDJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmMgJyd7MH0nJyBcdTMwOTJcdTRmNWNcdTYyMTBcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDINCi11bmtub3duR3VpZGFuY2VfdGV4dD1cdTRlMGRcdTY2MGUNCi0NCi1Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uX2xvZ19ub0NvbnRlbnRQYXRoPUNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24uSGFuZGxlQXR0YWNobWVudHNQbHVnaW46IHswfSBcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwZmJcdTMwZDFcdTMwYjlcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMNCi1MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyX2Nhbm5vdFVwZGF0ZT1JVVBMMDAwNlc6IHswfSB7MX0gXHUzMDkyXHU2NmY0XHU2NWIwXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzDQotd2FybmluZ0RsZ190aXRsZT1cdThiNjZcdTU0NGENCi1lcnJvckRsZ190aXRsZT1cdTMwYThcdTMwZTlcdTMwZmMNCi1lcnJvckRsZ19zYXZlRXJyb3I9SVVQTDAwMDVFOiBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgJyd7MH0nJyBcdTMwNzhcdTMwNmVcdTU5MDlcdTY2ZjRcdTMwNmVcdTRmZGRcdTdiYTFcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYNCi0NCi0jIGFjdGl2aXR5IGRpYWdyYW0gbmFtZXMNCi1hY3Rpdml0eURpYWdyYW1OYW1lPVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1NTZmMzogezB9DQotYWN0aXZpdHlEZXRhaWxEaWFncmFtTmFtZT1cdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdThhNzNcdTdkMzBcdTU2ZjM6IHswfQ0KLXdwRGVwZW5kZW5jeURpYWdyYW1OYW1lPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1NGY5ZFx1NWI1OFx1OTVhMlx1NGZjMlx1NTZmMzogezB9DQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgUm9sZSBkaWFncmFtIGZvbnRzIGFuZCBsYXlvdXQNCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZT1cdTMwYzBcdTMwYTRcdTMwYTJcdTMwZWRcdTMwYjANCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMj1NUyBHb3RoaWMNCi1yb2xlRGlhZ3JhbUZvbnRfc2l6ZT0xMA0KLXJvbGVEaWFncmFtRm9udF9zaXplX3dpbjMyPTEwDQotcm9sZURpYWdyYW1feE1hcmdpbj0yMDANCi1yb2xlRGlhZ3JhbV94U3BhY2luZz03MA0KLXJvbGVEaWFncmFtX3lTcGFjaW5nPTMwDQotDQotIyBsb2NhbGl6ZSB0aGUgdmFsdWUgYmFzZWQgb24gbG9jYWxlLiAgZm9yIGV4YW1wbGUsIA0KLSMgZm9yIEVuZ2xpc2gsIHRoZSB2YWx1ZSBpcyAiLiAiDQotI2NvbG9uX3dpdGhfc3BhY2U9OiANCi0jIGZvciBmcmVuY2gsIHRoZSB2YWx1ZSBpcyAiIC4gIiwgeW91IG5lZWQgdG8gdXNlIGEgXCB0byBwcmVzZXJ2ZSB0aGUgbGVhZGluZyBzcGFjZQ0KLSNjb2xvbl93aXRoX3NwYWNlPVwgOiANCi0jIGZvciBjaGluZXNlLCB0aGUgY29sb24gc2hvdWxkIGJlIGRvdWJsZSBieXRlcw0KLSMgRG9udCB0cmltIHRoZSBzcGFjZXMgYWZ0ZXIgdGhlIGNvbG9uLg0KLWNvbG9uX3dpdGhfc3BhY2U9OiANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkN2IzOTguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlc19rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXVua25vd25fdGV4dD1cdWM1NGMgXHVjMjE4IFx1YzVjNlx1Yzc0Yw0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVtcHR5TGlicmFyeVBhdGhFcnJvcl9yZWFzb249XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWFjYmRcdWI4NWNcdWFjMDAgXHViZTQ0XHVjNWI0IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1taXNzaW5nTGlicmFyeUZpbGVFcnJvcl9yZWFzb249XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWJhYThcdWIzNzggXHVkMzBjXHVjNzdjXHVjNzc0IFx1YjIwNFx1Yjc3ZFx1YjQxOFx1YzViNCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotdW5yZXNvbHZlZFByb3h5RXJyb3JfcmVhc29uPVx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVjNWQwIFx1ZDU3NFx1YzExZFx1ZDU2MCBcdWMyMTggXHVjNWM2XHViMjk0IFx1YzY5NFx1YzE4YyBcdWNjMzhcdWM4NzBcdWFjMDAgXHVkM2VjXHVkNTY4XHViNDE4XHVjNWI0IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHViMzAwXHVhYzFjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWQzZjRcdWIzNTRcdWM3NTggWE1JIFx1ZDMwY1x1Yzc3Y1x1Yzc3NCBcdWIyMDRcdWI3N2RcdWI0MThcdWM1YzhcdWFjNzBcdWIwOTggXHVjNzA0XHVjZTU4XHVhYzAwIFx1YmMxNFx1YjAwY1x1YzVjOFx1YWUzMCBcdWI1NGNcdWJiMzhcdWM3ODVcdWIyYzhcdWIyZTQuXG5cblx1Yzc3NCBcdWIzMDBcdWQ2NTQgXHVjMGMxXHVjNzkwXHViOTdjIFx1YjJlYlx1YWNlMCBcdWJiMzhcdWM4MWNcdWM4MTAgXHViY2Y0XHVhZTMwXHViOTdjIFx1ZDQ1Y1x1YzJkY1x1ZDU1OFx1YzVlYyBcdWQ1NzRcdWMxMWRcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YjI5NCBcdWNjMzhcdWM4NzBcdWI5N2MgXHVjMmRkXHViY2M0XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM3NTggXHVjMTkwXHVjMGMxXHVjNzQ0IFx1YmMyOVx1YzljMFx1ZDU1OFx1YjgyNFx1YmE3NCBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM1ZDAgXHViMmU0XHViOTc4IFx1YmNjMFx1YWNiZFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWNkOTRcdWFjMDBcdWQ1NThcdWFlMzAgXHVjODA0XHVjNWQwIFx1Yzc3NCBcdWNjMzhcdWM4NzBcdWI5N2MgXHVkNTc0XHVjMTFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcw0KLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzE9SVVQTDAwMDdXOiBcdWQ1NThcdWIwOTggXHVjNzc0XHVjMGMxXHVjNzU4IFx1ZDU1OFx1YzcwNCBcdWM2OTRcdWMxOGNcdWM1ZDAgXHViMjA0XHViNzdkXHViNDFjIFx1Y2MzOFx1Yzg3MFx1YWMwMCBcdWQzZWNcdWQ1NjhcdWI0MThcdWM1YjQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0Lg0KLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzI9SVVQTDAwMDhXOiBcdWQ1NThcdWIwOTggXHVjNzc0XHVjMGMxXHVjNzU4IFx1YjIwNFx1Yjc3ZFx1YjQxYyBcdWNjMzhcdWM4NzBcdWI5N2MgXHVkNTc0XHVjMTFkXHVkNTU4XHViODI0XHViYTc0IFx1Yzc3NCBcdWM2OTRcdWMxOGNcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTc0XHVjNTdjIFx1ZDU2OVx1YjJjOFx1YjJlNC4NCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2czPUlVUEwwMDA5VzogXHVjNzc0IFx1YzY5NFx1YzE4Y1x1YzVkMFx1YzExYyBcdWMxMjBcdWQwZGRcdWQ1NThcdWM5YzAgXHVjNTRhXHVjNzQwIFx1ZDMyOFx1ZDBhNFx1YzljMFx1Yzc1OCBcdWM2OTRcdWMxOGNcdWI5N2MgXHVkNTU4XHViMDk4IFx1Yzc3NFx1YzBjMSBcdWNjMzhcdWM4NzBcdWQ1NjlcdWIyYzhcdWIyZTQuDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWxvYWRSZXNvdXJjZXNFcnJvcl9tc2c9SVVQTDAwMDBFOiBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1Yjg1Y1x1YjRkY1x1ZDU4OFx1YzljMFx1YjljYyBcdWM3N2NcdWJkODAgXHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YWNhY1x1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi11bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX21zZz1JVVBMMDAwMUU6IFx1Yzc3NCBcdWM1NDhcdWIwYjRcdWI5N2MgXHViMmU0XHViOTc4IFx1YzcyMFx1ZDYxNVx1YzczY1x1Yjg1YyBcdWJjYzBcdWQ2NThcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDJFOiBcdWM3NzQgXHVjNTQ4XHViMGI0XHViOTdjIFx1YjMwMFx1YzBjMSBcdWM3MjBcdWQ2MTVcdWM3M2NcdWI4NWMgXHViY2MwXHVkNjU4XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotc2F2ZUNvbnZlcnRlZEd1aWRhbmNlRXJyb3JfbXNnPUlVUEwwMDAzRTogXHViY2MwXHVkNjU4XHViNDFjIFx1YzU0OFx1YjBiNCAnJ3swfScnXHVjNzQ0KFx1Yjk3YykgXHVjODAwXHVjN2E1XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotIyBDb252ZXJ0IGFjdGl2aXR5DQotY29udmVydEFjdGl2aXR5RXJyb3JfdGl0bGU9XHVkNjVjXHViM2Q5IFx1YzcyMFx1ZDYxNSBcdWJjYzBcdWQ2NTggXHVjNjI0XHViOTU4DQotY29udmVydEFjdGl2aXR5RXJyb3JfbXNnPUlVUEwwMDA2RTogXHVjNzc0IFx1ZDY1Y1x1YjNkOVx1Yzc0NCBcdWIzMDBcdWMwYzEgXHVjNzIwXHVkNjE1XHVjNzNjXHViODVjIFx1YmNjMFx1ZDY1OFx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXNhdmVDb252ZXJ0ZWRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwN0U6IFx1YmNjMFx1ZDY1OFx1YjQxYyBcdWM1NDhcdWIwYjQgJyd7MH0nJ1x1Yzc0NChcdWI5N2MpIFx1YzgwMFx1YzdhNVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVycm9yX3JlYXNvbj1JVVBMMDAwNEU6IFx1YzYyNFx1Yjk1OFx1YWMwMCBcdWJjMWNcdWMwZGRcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWM4MTVcdWJjZjRcdWI5N2MgXHViY2Y0XHViODI0XHViYTc0IFx1ZDY1NVx1Yzc3OFx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9yZWFzb249ezB9XHVjNWQwIFx1YjMwMFx1ZDU3NCBcdWQ2MzhcdWQ2NTggXHVhYzAwXHViMmE1XHVkNTVjIFx1YzU0OFx1YjBiNCBcdWM3MjBcdWQ2MTVcdWM3NzQgXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWludmFsaWRMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1cdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjNzQwIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWFjYmRcdWI4NWNcdWM3ODVcdWIyYzhcdWIyZTQuIC5wcm9qZWN0IFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWM3OTFcdWMxMzFcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1jb3VsZE5vdExvY2tMaWJyYXJ5X3JlYXNvbj1cdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHVjN2EwXHVhZTAwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWNvcHlpbmdBdHRhY2htZW50c1Rhc2tfbmFtZT1cdWNjYThcdWJkODBcdWI5N2MgXHViY2Y1XHVjMGFjXHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLQ0KLSMgQ29udmVydCBHdWlkYW5jZSBEaWFsb2cNCi1jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGl0bGU9XHVjNTQ4XHViMGI0IFx1YzcyMFx1ZDYxNSBcdWJjYzBcdWQ2NTgNCi1jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGV4dD1cdWIzMDBcdWMwYzEgXHVjNTQ4XHViMGI0IFx1YzcyMFx1ZDYxNVx1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotIyBHdWlkYW5jZSB0eXBlIG5hbWVzIGZvciBDb252ZXJ0IEd1aWRhbmNlIERpYWxvZyAtIHNob3VsZCBiZSByZWZhY3RvcmVkIGludG8gbGlicmFyeS51aQ0KLWNoZWNrbGlzdF90ZXh0PVx1Y2NiNFx1ZDA2Y1x1YjlhY1x1YzJhNFx1ZDJiOA0KLWNvbmNlcHRfdGV4dD1cdWFjMWNcdWIxNTANCi1leGFtcGxlX3RleHQ9XHVjNjA4XHVjODFjDQotZ3VpZGVsaW5lX3RleHQ9XHVhYzAwXHVjNzc0XHViNGRjXHViNzdjXHVjNzc4DQotZXN0aW1hdGVfdGV4dD1cdWM2MDhcdWMwYzENCi1lc3RpbWF0aW5nTWV0cmljX3RleHQ9XHVjNjA4XHVjMGMxIFx1YmE1NFx1ZDJiOFx1YjlhZA0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0PVx1YzYwOFx1YzBjMSBcdWFjZTBcdWI4MjRcdWMwYWNcdWQ1NmQNCi1yZXBvcnRfdGV4dD1cdWJjZjRcdWFjZTBcdWMxMWMNCi10ZW1wbGF0ZV90ZXh0PVx1ZDE1Y1x1ZDUwY1x1YjlhY1x1ZDJiOA0KLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0PVx1YzljMFx1YzZkMCBcdWM3OTBcdWI4Y2MNCi10b29sTWVudG9yX3RleHQ9XHViM2M0XHVhZDZjIFx1YzBhY1x1YzZhOSBcdWIzYzRcdWM2YzBcdWI5ZDANCi13aGl0ZXBhcGVyX3RleHQ9XHViYzMxXHVjMTFjDQotdGVybURlZmluaXRpb25fdGV4dD1cdWM2YTlcdWM1YjQgXHVjODE1XHVjNzU4DQotcHJhY3RpY2VfdGV4dD1cdWMwYWNcdWI4NDANCi1yZXVzYWJsZUFzc2V0X3RleHQ9XHVjN2FjXHVjMGFjXHVjNmE5XHVhYzAwXHViMmE1XHVkNTVjIFx1Yzc5MFx1YzBiMA0KLQ0KLSNhY3Rpdml0eSBicmVha2Rvd24gaW5mbyBzdHJpbmdzDQotQWN0aXZpdHlMYXlvdXRfcHJpbWFyeVRhc2tzX3RleHQ9XHVjMThjXHVjNzIwXHVjNzkwXHViODVjIFx1YzIxOFx1ZDU4OVx1ZDU2OA0KLUFjdGl2aXR5TGF5b3V0X2FkZGl0aW9uYWxUYXNrc190ZXh0PVx1Y2Q5NFx1YWMwMFx1Yjg1YyBcdWMyMThcdWQ1ODlcdWQ1NjgNCi0NCi0NCi0jIENvbnZlcnQgR3VpZGFuY2UgRXJyb3IgTWVzc2FnZXMNCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl90aXRsZT1cdWM1NDhcdWIwYjQgXHVjNzIwXHVkNjE1IFx1YmNjMFx1ZDY1OCBcdWM2MjRcdWI5NTgNCi0NCi0jIExvYWQgUmVzb3VyY2VzIEVycm9yIERpYWxvZw0KLWxvYWRSZXNvdXJjZXNFcnJvcl90aXRsZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YzVmNFx1YWUzMCBcdWM2MjRcdWI5NTgNCi1sb2FkUmVzb3VyY2VzRXJyb3JfcmVhc29uPVx1Yzc3Y1x1YmQ4MCBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVjNzkwXHVjNmQwXHVjNzQ0IFx1Yjg1Y1x1YjRkY1x1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LlxuXG5cdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM1ZDAgXHViMmU0XHViOTc4IFx1YmNjMFx1YWNiZFx1YzBhY1x1ZDU2ZFx1Yzc0NCBcdWNkOTRcdWFjMDBcdWQ1NThcdWFlMzAgXHVjODA0XHVjNWQwIFx1YzYyNFx1Yjk1OFx1Yjk3YyBcdWFjODBcdWQxYTAgXHViYzBmIFx1ZDU3NFx1YWNiMFx1ZDU1OFx1YjgyNFx1YmE3NCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmRcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLSMgUm9sZSBEaWFncmFtcw0KLXJvbGVEaWFncmFtUGVyZm9ybXNfdGV4dD1cdWMyMThcdWQ1ODkNCi1yb2xlRGlhZ3JhbVJlc3BvbnNpYmxlRm9yX3RleHQ9XHVjYzQ1XHVjNzg0IFx1YzBhY1x1ZDU2ZDoNCi0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cwPVx1Y2MzOFx1Yzg3MFx1YjQxYyBcdWM2OTRcdWMxOGM6IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE9XHVjODE1XHViY2Y0OiB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0c0PVx1YWNiZFx1YWNlMDogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHNz1cdWM2MjRcdWI5NTg6IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEwPVx1Y2MzOFx1Yzg3MFx1YjQxYyBcdWM2OTRcdWMxOGMgezB9XHVjNzc0KFx1YWMwMCkgXHViMjA0XHViNzdkXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0Lg0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzExPUdVSUQgezB9XHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWM2OTRcdWMxOGNcdWI5N2MgXHVjYzNlXHVjNzQ0IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTI9Jyd7MH0nJyBcdWQzMGNcdWM3N2NcdWM1ZDBcdWMxMWMgXHViMjA0XHViNzdkXHViNDFjIFx1Yzc5MFx1YzZkMCAnJ3sxfScnXHVjNzQ0KFx1Yjk3YykgXHVjYzM4XHVjODcwXHVkNTY5XHViMmM4XHViMmU0Lg0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE1PScnezB9JycgXHVjNzkwXHVjNmQwIFx1ZDMwY1x1Yzc3Y1x1Yzc3NCBcdWIyMDRcdWI3N2RcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTc9Jyd7MH0nJyBVUkxcdWM1ZDAgXHVjNWYwXHVhY2IwXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTk9Jyd7MH0nJyBVUkxcdWM1ZDAgXHVjNWYwXHVhY2IwXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWM3NGM6IHsxfQ0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOD0nJ3swfScnIFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWNjM2VcdWM3NDQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1JbXBvcnRFeHBvcnRVdGlsX01TRzk9Jyd7MH0nJyBcdWM3ODRcdWMyZGMgXHViNTE0XHViODA5XHVkMWEwXHViOWFjXHViOTdjIFx1Yzc5MVx1YzEzMVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXVua25vd25HdWlkYW5jZV90ZXh0PVx1YzU0YyBcdWMyMTggXHVjNWM2XHVjNzRjDQotDQotQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbl9sb2dfbm9Db250ZW50UGF0aD1Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uLkhhbmRsZUF0dGFjaG1lbnRzUGx1Z2luOiB7MH1cdWM1ZDAgXHViMzAwXHVkNTVjIFx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWFjYmRcdWI4NWNcdWFjMDAgXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLUxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXJfY2Fubm90VXBkYXRlPUlVUEwwMDA2VzogezB9IHsxfVx1Yzc0NChcdWI5N2MpIFx1YWMzMVx1YzJlMFx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXdhcm5pbmdEbGdfdGl0bGU9XHVhY2JkXHVhY2UwDQotZXJyb3JEbGdfdGl0bGU9XHVjNjI0XHViOTU4DQotZXJyb3JEbGdfc2F2ZUVycm9yPUlVUEwwMDA1RTogJyd7MH0nJyBcdWQzMGNcdWM3N2NcdWM3NTggXHViY2MwXHVhY2JkXHVjMGFjXHVkNTZkXHVjNzQ0IFx1YzgwMFx1YzdhNVx1ZDU1OFx1YjI5NCBcdWM5MTFcdWM1ZDAgXHVjNjI0XHViOTU4IFx1YmMxY1x1YzBkZA0KLQ0KLSMgYWN0aXZpdHkgZGlhZ3JhbSBuYW1lcw0KLWFjdGl2aXR5RGlhZ3JhbU5hbWU9XHVkNjVjXHViM2Q5IFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhODogezB9DQotYWN0aXZpdHlEZXRhaWxEaWFncmFtTmFtZT1cdWQ2NWNcdWIzZDkgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhODogezB9DQotd3BEZXBlbmRlbmN5RGlhZ3JhbU5hbWU9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWM4ODVcdWMxOGRcdWMxMzEgXHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4OiB7MH0NCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBSb2xlIGRpYWdyYW0gZm9udHMgYW5kIGxheW91dA0KLXJvbGVEaWFncmFtRm9udF9uYW1lPVx1YjMwMFx1ZDY1NCBcdWMwYzFcdWM3OTANCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMj1cdWFkNzRcdWI5YmNcdWNjYjQNCi1yb2xlRGlhZ3JhbUZvbnRfc2l6ZT0xMA0KLXJvbGVEaWFncmFtRm9udF9zaXplX3dpbjMyPTEwDQotcm9sZURpYWdyYW1feE1hcmdpbj0yMDANCi1yb2xlRGlhZ3JhbV94U3BhY2luZz03MA0KLXJvbGVEaWFncmFtX3lTcGFjaW5nPTMwDQotDQotIyBsb2NhbGl6ZSB0aGUgdmFsdWUgYmFzZWQgb24gbG9jYWxlLiAgZm9yIGV4YW1wbGUsIA0KLSMgZm9yIEVuZ2xpc2gsIHRoZSB2YWx1ZSBpcyAiLiAiDQotI2NvbG9uX3dpdGhfc3BhY2U9OiANCi0jIGZvciBmcmVuY2gsIHRoZSB2YWx1ZSBpcyAiIC4gIiwgeW91IG5lZWQgdG8gdXNlIGEgXCB0byBwcmVzZXJ2ZSB0aGUgbGVhZGluZyBzcGFjZQ0KLSNjb2xvbl93aXRoX3NwYWNlPVwgOiANCi0jIGZvciBjaGluZXNlLCB0aGUgY29sb24gc2hvdWxkIGJlIGRvdWJsZSBieXRlcw0KLSMgRG9udCB0cmltIHRoZSBzcGFjZXMgYWZ0ZXIgdGhlIGNvbG9uLg0KLWNvbG9uX3dpdGhfc3BhY2U9OiANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzMzA4YTYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXVua25vd25fdGV4dD1EZXNjb25oZWNpZG8NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lbXB0eUxpYnJhcnlQYXRoRXJyb3JfcmVhc29uPU8gY2FtaW5obyBkYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBlc3RcdTAwZTEgdmF6aW8uDQotbWlzc2luZ0xpYnJhcnlGaWxlRXJyb3JfcmVhc29uPU8gYXJxdWl2byBkZSBtb2RlbG8gZGUgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZXN0XHUwMGUxIGF1c2VudGUuDQotdW5yZXNvbHZlZFByb3h5RXJyb3JfcmVhc29uPUEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3Mgc2VsZWNpb25hZGEgY29udFx1MDBlOW0gcmVmZXJcdTAwZWFuY2lhcyBkZSBlbGVtZW50b3Mgblx1MDBlM28gcmVzb2x2aWRhcy4gSXNzbyBnZXJhbG1lbnRlIFx1MDBlOSBjYXVzYWRvIHBvciBhcnF1aXZvcyBYTUkgYXVzZW50ZXMgb3UgY29sb2NhZG9zIGVtIGxvY2FsIGluY29ycmV0byBuYSBwYXN0YSBkYSBiaWJsaW90ZWNhLlxuXG5GZWNoZSBlc3RlIGRpXHUwMGUxbG9nbyBlIHRvcm5lIHZpc1x1MDBlZHZlbCBhIHZpc3VhbGl6YVx1MDBlN1x1MDBlM28gUHJvYmxlbWFzIHBhcmEgYWp1ZGFyIGEgaWRlbnRpZmljYXIgYXMgcmVmZXJcdTAwZWFuY2lhcyBuXHUwMGUzbyByZXNvbHZpZGFzLiBQYXJhIGV2aXRhciBjb3Jyb21wZXIgYSBiaWJsaW90ZWNhLCBcdTAwZTkgYWx0YW1lbnRlIHJlY29tZW5kXHUwMGUxdmVsIHJlc29sdmVyIGVzc2FzIHJlZmVyXHUwMGVhbmNpYXMgcHJpbWVpcm8sIGFudGVzIGRlIGluY2x1aXIgbWFpcyBhbHRlcmFcdTAwZTdcdTAwZjVlcyBuYSBiaWJsaW90ZWNhLg0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcw0KLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzE9SVVQTDAwMDdXOiBIXHUwMGUxIHJlZmVyXHUwMGVhbmNpYXMgYXVzZW50ZXMgZW0gdW0gb3UgbWFpcyBlbGVtZW50b3MgZmlsaG9zDQotY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMj1JVVBMMDAwOFc6IEVzdGUgZWxlbWVudG8gZGV2ZXJpYSBzZXIgc2VsZWNpb25hZG8gcGFyYSByZXNvbHZlciB1bWEgb3UgbWFpcyByZWZlclx1MDBlYW5jaWFzIGF1c2VudGVzDQotY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMz1JVVBMMDAwOVc6IEVzdGUgZWxlbWVudG8gcmVmZXJlbmNpYSB1bSBvdSBtYWlzIGVsZW1lbnRvcyBlbSB1bSBwYWNvdGUgblx1MDBlM28tc2VsZWNpb25hZG8gDQotIyBFcnJvciBNZXNzYWdlcw0KLWxvYWRSZXNvdXJjZXNFcnJvcl9tc2c9SVVQTDAwMDBFOiBBIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGZvaSBjYXJyZWdhZGEsIG1hcyBhbGd1bnMgZXJyb3MgZm9yYW0gZGV0ZWN0YWRvcy4NCi11bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX21zZz1JVVBMMDAwMUU6IEVzdGEgb3JpZW50YVx1MDBlN1x1MDBlM28gblx1MDBlM28gcG9kZSBzZXIgY29udmVydGlkYSBlbSBvdXRybyB0aXBvLg0KLWNvbnZlcnRHdWlkYW5jZUVycm9yX21zZz1JVVBMMDAwMkU6IEVzdGEgb3JpZW50YVx1MDBlN1x1MDBlM28gblx1MDBlM28gcG9kZSBzZXIgY29udmVydGlkYSBubyB0aXBvIGRlIGRlc3Rpbm8uDQotc2F2ZUNvbnZlcnRlZEd1aWRhbmNlRXJyb3JfbXNnPUlVUEwwMDAzRTogTlx1MDBlM28gXHUwMGU5IHBvc3NcdTAwZWR2ZWwgc2FsdmFyIGEgb3JpZW50YVx1MDBlN1x1MDBlM28gY29udmVydGlkYSAnJ3swfScnLg0KLQ0KLSMgQ29udmVydCBhY3Rpdml0eQ0KLWNvbnZlcnRBY3Rpdml0eUVycm9yX3RpdGxlPUNvbnZlcnRlciBFcnJvIGRlIFRpcG8gZGUgQXRpdmlkYWRlDQotY29udmVydEFjdGl2aXR5RXJyb3JfbXNnPUlVUEwwMDA2RTogRXN0YSBhdGl2aWRhZGUgblx1MDBlM28gcG9kZSBzZXIgY29udmVydGlkYSBwYXJhIG8gdGlwbyBkZSBkZXN0aW5vLg0KLXNhdmVDb252ZXJ0ZWRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwN0U6IEEgYXRpdmlkYWRlIGNvbnZlcnRpZGEgJyd7MH0nJyBuXHUwMGUzbyBwb2RlIHNlciBzYWx2YS4NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249SVVQTDAwMDRFOiBPY29ycmV1IHVtIGVycm8uIENsaXF1ZSBlbSBPSyBwYXJhIG9idGVyIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBhZGljaW9uYWlzLg0KLXVuc3VwcG9ydGVkR3VpZGFuY2VUeXBlRXJyb3JfcmVhc29uPU5cdTAwZTNvIGV4aXN0ZSB1bSB0aXBvIGRlIG9yaWVudGFcdTAwZTdcdTAwZTNvIGNvbXBhdFx1MDBlZHZlbCBwYXJhIHswfS4NCi1pbnZhbGlkTGlicmFyeVBhdGhFcnJvcl9yZWFzb249Q2FtaW5obyBkZSBiaWJsaW90ZWNhIGludlx1MDBlMWxpZG8uIE5cdTAwZTNvIGZvaSBwb3NzXHUwMGVkdmVsIGNyaWFyIG8gYXJxdWl2byAucHJvamVjdC4NCi1jb3VsZE5vdExvY2tMaWJyYXJ5X3JlYXNvbj1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBibG9xdWVhciBhIGJpYmxpb3RlY2EuDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWNvcHlpbmdBdHRhY2htZW50c1Rhc2tfbmFtZT1Db3BpYW5kbyBhbmV4b3MuLi4NCi0NCi0jIENvbnZlcnQgR3VpZGFuY2UgRGlhbG9nDQotY29udmVydEd1aWRhbmNlRGlhbG9nX3RpdGxlPUNvbnZlcnRlciBUaXBvIGRlIE9yaWVudGFcdTAwZTdcdTAwZTNvDQotY29udmVydEd1aWRhbmNlRGlhbG9nX3RleHQ9U2VsZWNpb25lIG8gdGlwbyBkZSBvcmllbnRhXHUwMGU3XHUwMGUzbyBkZSBkZXN0aW5vLg0KLQ0KLSMgR3VpZGFuY2UgdHlwZSBuYW1lcyBmb3IgQ29udmVydCBHdWlkYW5jZSBEaWFsb2cgLSBzaG91bGQgYmUgcmVmYWN0b3JlZCBpbnRvIGxpYnJhcnkudWkNCi1jaGVja2xpc3RfdGV4dD1MaXN0YSBkZSBWZXJpZmljYVx1MDBlN1x1MDBlM28NCi1jb25jZXB0X3RleHQ9Q29uY2VpdG8NCi1leGFtcGxlX3RleHQ9RXhlbXBsbw0KLWd1aWRlbGluZV90ZXh0PURpcmV0cml6DQotZXN0aW1hdGVfdGV4dD1Fc3RpbWFyDQotZXN0aW1hdGluZ01ldHJpY190ZXh0PU1cdTAwZTl0cmljYSBFc3RpbWF0aXZhDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ9Q29uc2lkZXJhXHUwMGU3XHUwMGY1ZXMgRXN0aW1hdGl2YXMNCi1yZXBvcnRfdGV4dD1SZWxhdFx1MDBmM3Jpbw0KLXRlbXBsYXRlX3RleHQ9VGVtcGxhdGUNCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dD1NYXRlcmlhbCBTdXBvcnRhZG8NCi10b29sTWVudG9yX3RleHQ9TWVudG9yIGRlIEZlcnJhbWVudGFzDQotd2hpdGVwYXBlcl90ZXh0PVdoaXRlcGFwZXINCi10ZXJtRGVmaW5pdGlvbl90ZXh0PURlZmluaVx1MDBlN1x1MDBlM28gZGUgVGVybW8NCi1wcmFjdGljZV90ZXh0PVByXHUwMGUxdGljYQ0KLXJldXNhYmxlQXNzZXRfdGV4dD1SZWN1cnNvIFJldXRpbGl6XHUwMGUxdmVsDQotDQotI2FjdGl2aXR5IGJyZWFrZG93biBpbmZvIHN0cmluZ3MNCi1BY3Rpdml0eUxheW91dF9wcmltYXJ5VGFza3NfdGV4dD1FeGVjdXRhIGNvbW8gUHJvcHJpZXRcdTAwZTFyaW8NCi1BY3Rpdml0eUxheW91dF9hZGRpdGlvbmFsVGFza3NfdGV4dD1FeGVjdXRhIGNvbW8gQWRpY2lvbmFsDQotDQotDQotIyBDb252ZXJ0IEd1aWRhbmNlIEVycm9yIE1lc3NhZ2VzDQotY29udmVydEd1aWRhbmNlRXJyb3JfdGl0bGU9RXJybyBkZSBDb252ZXJzXHUwMGUzbyBkZSBUaXBvIGRlIE9yaWVudGFcdTAwZTdcdTAwZTNvDQotDQotIyBMb2FkIFJlc291cmNlcyBFcnJvciBEaWFsb2cNCi1sb2FkUmVzb3VyY2VzRXJyb3JfdGl0bGU9RXJybyBkZSBBYmVydHVyYSBkZSBCaWJsaW90ZWNhIGRlIE1cdTAwZTl0b2Rvcw0KLWxvYWRSZXNvdXJjZXNFcnJvcl9yZWFzb249Tlx1MDBlM28gZm9pIHBvc3NcdTAwZWR2ZWwgY2FycmVnYXIgYWxndW5zIHJlY3Vyc29zIGRhIGJpYmxpb3RlY2EuXG5cbkNsaXF1ZSBlbSBEZXRhbGhlcyBwYXJhIHJldmlzYXIgb3MgZXJyb3MgZSByZXNvbHZcdTAwZWEtbG9zIGFudGVzIGRlIGluY2x1aXIgbWFpcyBhbHRlcmFcdTAwZTdcdTAwZjVlcyBuYSBiaWJsaW90ZWNhLg0KLQ0KLSMgUm9sZSBEaWFncmFtcw0KLXJvbGVEaWFncmFtUGVyZm9ybXNfdGV4dD1kZXNlbXBlbmhhDQotcm9sZURpYWdyYW1SZXNwb25zaWJsZUZvcl90ZXh0PXJlc3BvbnNcdTAwZTF2ZWwgcG9yDQotDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMD1FbGVtZW50byByZWZlcmVuY2lhZG86IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE9SW5mb3JtYVx1MDBlN1x1MDBlM286IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzQ9QXZpc286IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzc9RXJybzogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTA9RWxlbWVudG8gcmVmZXJlbmNpYWRvIGF1c2VudGUgezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTE9Tlx1MDBlM28gZm9pIHBvc3NcdTAwZWR2ZWwgbG9jYWxpemFyIG8gZWxlbWVudG8gcGFyYSBvIGd1aWQgezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTI9TyBhcnF1aXZvICcnezB9JycgcmVmZXJlbmNpYSBvIHJlY3Vyc28gYXVzZW50ZSAnJ3sxfScnDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTU9YXJxdWl2byBkZSByZWN1cnNvcyBhdXNlbnRlICcnezB9JycNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNz1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBjb25lY3RhciBjb20gYSBVUkwgJyd7MH0nJw0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE5PU5cdTAwZTNvIGZvaSBwb3NzXHUwMGVkdmVsIGNvbmVjdGFyIGNvbSBhIFVSTCAnJ3swfScnOiB7MX0NCi1JbXBvcnRFeHBvcnRVdGlsX01TRzg9Tlx1MDBlM28gZm9pIHBvc3NcdTAwZWR2ZWwgbG9jYWxpemFyIG8gYXJxdWl2byAnJ3swfScnLg0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOT1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBjcmlhciBvIGRpcmV0XHUwMGYzcmlvICcnezB9JycuDQotdW5rbm93bkd1aWRhbmNlX3RleHQ9RGVzY29uaGVjaWRvDQotDQotQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbl9sb2dfbm9Db250ZW50UGF0aD1Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uLkhhbmRsZUF0dGFjaG1lbnRzUGx1Z2luOiBuXHUwMGUzbyBleGlzdGUgY29udGVudFBhdGggcGFyYSB7MH0NCi1MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyX2Nhbm5vdFVwZGF0ZT1JVVBMMDAwNlc6IE5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIGF0dWFsaXphciB7MH0gezF9DQotd2FybmluZ0RsZ190aXRsZT1Bdmlzbw0KLWVycm9yRGxnX3RpdGxlPUVycm8NCi1lcnJvckRsZ19zYXZlRXJyb3I9SVVQTDAwMDVFOiBFcnJvIGFvIHNhbHZhciBhbHRlcmFcdTAwZTdcdTAwZTNvIG5vIGFycXVpdm8gJyd7MH0nJw0KLQ0KLSMgYWN0aXZpdHkgZGlhZ3JhbSBuYW1lcw0KLWFjdGl2aXR5RGlhZ3JhbU5hbWU9RGlhZ3JhbWEgZGUgYXRpdmlkYWRlOiB7MH0NCi1hY3Rpdml0eURldGFpbERpYWdyYW1OYW1lPURpYWdyYW1hIGRlIGRldGFsaGUgZGUgYXRpdmlkYWRlOiB7MH0NCi13cERlcGVuZGVuY3lEaWFncmFtTmFtZT1EaWFncmFtYSBkZSBkZXBlbmRcdTAwZWFuY2lhIGRvIHByb2R1dG8gZGUgdHJhYmFsaG86IHswfQ0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIFJvbGUgZGlhZ3JhbSBmb250cyBhbmQgbGF5b3V0DQotcm9sZURpYWdyYW1Gb250X25hbWU9QXJpYWwNCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMj1BcmlhbA0KLXJvbGVEaWFncmFtRm9udF9zaXplPTEwDQotcm9sZURpYWdyYW1Gb250X3NpemVfd2luMzI9MTANCi1yb2xlRGlhZ3JhbV94TWFyZ2luPTIwMA0KLXJvbGVEaWFncmFtX3hTcGFjaW5nPTcwDQotcm9sZURpYWdyYW1feVNwYWNpbmc9MzANCi0NCi0jIGxvY2FsaXplIHRoZSB2YWx1ZSBiYXNlZCBvbiBsb2NhbGUuICBmb3IgZXhhbXBsZSwgDQotIyBmb3IgRW5nbGlzaCwgdGhlIHZhbHVlIGlzICIuICINCi0jY29sb25fd2l0aF9zcGFjZT06IA0KLSMgZm9yIGZyZW5jaCwgdGhlIHZhbHVlIGlzICIgLiAiLCB5b3UgbmVlZCB0byB1c2UgYSBcIHRvIHByZXNlcnZlIHRoZSBsZWFkaW5nIHNwYWNlDQotI2NvbG9uX3dpdGhfc3BhY2U9XCA6IA0KLSMgZm9yIGNoaW5lc2UsIHRoZSBjb2xvbiBzaG91bGQgYmUgZG91YmxlIGJ5dGVzDQotIyBEb250IHRyaW0gdGhlIHNwYWNlcyBhZnRlciB0aGUgY29sb24uDQotY29sb25fd2l0aF9zcGFjZT06IA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2EyYzExNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotdW5rbm93bl90ZXh0PVx1NjcyYVx1NzdlNQ0KLQ0KLSMgRXJyb3IgUmVhc29ucw0KLWVtcHR5TGlicmFyeVBhdGhFcnJvcl9yZWFzb249XHU2NWI5XHU2Y2Q1XHU1ZTkzXHU4ZGVmXHU1Zjg0XHU0ZTNhXHU3YTdhXHUzMDAyDQotbWlzc2luZ0xpYnJhcnlGaWxlRXJyb3JfcmVhc29uPVx1N2YzYVx1NWMxMVx1NjViOVx1NmNkNVx1NWU5M1x1NmEyMVx1NTc4Ylx1NjU4N1x1NGVmNlx1MzAwMg0KLXVucmVzb2x2ZWRQcm94eUVycm9yX3JlYXNvbj1cdTkwMDlcdTViOWFcdTc2ODRcdTY1YjlcdTZjZDVcdTVlOTNcdTUzMDVcdTU0MmJcdTY3MmFcdTg5ZTNcdTY3OTBcdTc2ODRcdTUxNDNcdTdkMjBcdTVmMTVcdTc1MjhcdTMwMDJcdTZiNjRcdTYwYzVcdTUxYjVcdTkwMWFcdTVlMzhcdTY2MmZcdTc1MzFcdTRlOGVcdTVlOTNcdTY1ODdcdTRlZjZcdTU5MzlcdTRlMmRcdTdmM2FcdTVjMTEgWE1JIFx1NjU4N1x1NGVmNlx1NjIxNiBYTUkgXHU2NTg3XHU0ZWY2XHU2NTNlXHU3ZjZlXHU5NTE5XHU4YmVmXHU4MDBjXHU1ZjE1XHU4ZDc3XHU3Njg0XHUzMDAyXG5cblx1OGJmN1x1NTE3M1x1OTVlZFx1NmI2NFx1NWJmOVx1OGJkZFx1Njg0Nlx1ZmYwY1x1NzEzNlx1NTQwZVx1NjI1M1x1NWYwMFx1MjAxY1x1OTVlZVx1OTg5OFx1MjAxZFx1ODljNlx1NTZmZVx1ZmYwY1x1NWUyZVx1NTJhOVx1Nzg2ZVx1NWI5YVx1NjcyYVx1ODllM1x1Njc5MFx1NzY4NFx1NWYxNVx1NzUyOFx1MzAwMlx1NGUzYVx1OTA3Zlx1NTE0ZFx1NjM1Zlx1NTc0Zlx1NWU5M1x1ZmYwY1x1NWYzYVx1NzBjOFx1NWVmYVx1OGJhZVx1NTcyOFx1NWJmOVx1NWU5M1x1NjI2N1x1ODg0Y1x1NjZmNFx1NTkxYVx1NjZmNFx1NjUzOVx1NGU0Ylx1NTI0ZFx1NTE0OFx1ODllM1x1Njc5MFx1OGZkOVx1NGU5Ylx1NWYxNVx1NzUyOFx1MzAwMg0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcw0KLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzE9SVVQTDAwMDdXOiBcdTRlMDBcdTRlMmFcdTYyMTZcdTU5MWFcdTRlMmFcdTViNTBcdTUxNDNcdTdkMjBcdTUzMDVcdTU0MmJcdTdmM2FcdTVjMTFcdTc2ODRcdTVmMTVcdTc1MjgNCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cyPUlVUEwwMDA4VzogXHU1ZTk0XHU5MDA5XHU2MmU5XHU2YjY0XHU1MTQzXHU3ZDIwXHU0ZWU1XHU4OWUzXHU2NzkwXHU0ZTAwXHU0ZTJhXHU2MjE2XHU1OTFhXHU0ZTJhXHU3ZjNhXHU1YzExXHU3Njg0XHU1ZjE1XHU3NTI4DQotY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMz1JVVBMMDAwOVc6IFx1NmI2NFx1NTE0M1x1N2QyMFx1NWYxNVx1NzUyOFx1NjcyYVx1OTAwOVx1NWI5YVx1N2EwYlx1NWU4Zlx1NTMwNVx1NGUyZFx1NzY4NFx1NGUwMFx1NGUyYVx1NjIxNlx1NTkxYVx1NGUyYVx1NTE0M1x1N2QyMA0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1sb2FkUmVzb3VyY2VzRXJyb3JfbXNnPUlVUEwwMDAwRTogXHU1ZGYyXHU4OGM1XHU1MTY1XHU2NWI5XHU2Y2Q1XHU1ZTkzXHVmZjBjXHU0ZjQ2XHU2NjJmXHU2OGMwXHU2ZDRiXHU1MjMwXHU0ZTAwXHU0ZTliXHU5NTE5XHU4YmVmXHUzMDAyDQotdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9tc2c9SVVQTDAwMDFFOiBcdTY1ZTBcdTZjZDVcdTVjMDZcdTZiNjRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdThmNmNcdTYzNjJcdTRlM2FcdTUzZTZcdTRlMDBcdTc5Y2RcdTdjN2JcdTU3OGJcdTMwMDINCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDJFOiBcdTY1ZTBcdTZjZDVcdTVjMDZcdTZiNjRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdThmNmNcdTYzNjJcdTRlM2FcdTc2ZWVcdTY4MDdcdTdjN2JcdTU3OGJcdTMwMDINCi1zYXZlQ29udmVydGVkR3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDNFOiBcdTY1ZTBcdTZjZDVcdTRmZGRcdTViNThcdThmNmNcdTYzNjJcdTc2ODRcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTIwMWN7MH1cdTIwMWRcdTMwMDINCi0NCi0jIENvbnZlcnQgYWN0aXZpdHkNCi1jb252ZXJ0QWN0aXZpdHlFcnJvcl90aXRsZT1cdThmNmNcdTYzNjJcdTZkM2JcdTUyYThcdTdjN2JcdTU3OGJcdTk1MTlcdThiZWYNCi1jb252ZXJ0QWN0aXZpdHlFcnJvcl9tc2c9SVVQTDAwMDZFOiBcdTY1ZTBcdTZjZDVcdTVjMDZcdTZiNjRcdTZkM2JcdTUyYThcdThmNmNcdTYzNjJcdTRlM2FcdTc2ZWVcdTY4MDdcdTdjN2JcdTU3OGJcdTMwMDINCi1zYXZlQ29udmVydGVkQWN0aXZpdHlFcnJvcl9tc2c9SVVQTDAwMDdFOiBcdTY1ZTBcdTZjZDVcdTRmZGRcdTViNThcdThmNmNcdTYzNjJcdTc2ODRcdTZkM2JcdTUyYThcdTIwMWN7MH1cdTIwMWRcdTMwMDINCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249SVVQTDAwMDRFOiBcdTUzZDFcdTc1MWZcdTk1MTlcdThiZWZcdTMwMDJcdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdTc4NmVcdTViOWFcdTIwMWRcdWZmMGNcdTgzYjdcdTUzZDZcdTY2ZjRcdTU5MWFcdTRmZTFcdTYwNmZcdTMwMDINCi11bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX3JlYXNvbj17MH0gXHU2Y2ExXHU2NzA5XHU1MTdjXHU1YmI5XHU3Njg0XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHU3YzdiXHU1NzhiXHUzMDAyDQotaW52YWxpZExpYnJhcnlQYXRoRXJyb3JfcmVhc29uPVx1NWU5M1x1OGRlZlx1NWY4NFx1NjVlMFx1NjU0OFx1MzAwMlx1NjVlMFx1NmNkNVx1NTIxYlx1NWVmYSAucHJvamVjdCBcdTY1ODdcdTRlZjZcdTMwMDINCi1jb3VsZE5vdExvY2tMaWJyYXJ5X3JlYXNvbj1cdTY1ZTBcdTZjZDVcdTk1MDFcdTViOWFcdTVlOTNcdTMwMDINCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotY29weWluZ0F0dGFjaG1lbnRzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NTkwZFx1NTIzNlx1OTY0NFx1NGVmNi4uLg0KLQ0KLSMgQ29udmVydCBHdWlkYW5jZSBEaWFsb2cNCi1jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGl0bGU9XHU4ZjZjXHU2MzYyXHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHU3YzdiXHU1NzhiDQotY29udmVydEd1aWRhbmNlRGlhbG9nX3RleHQ9XHU5MDA5XHU2MmU5XHU3NmVlXHU2ODA3XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmXHU3YzdiXHU1NzhiXHUzMDAyDQotDQotIyBHdWlkYW5jZSB0eXBlIG5hbWVzIGZvciBDb252ZXJ0IEd1aWRhbmNlIERpYWxvZyAtIHNob3VsZCBiZSByZWZhY3RvcmVkIGludG8gbGlicmFyeS51aQ0KLWNoZWNrbGlzdF90ZXh0PVx1NjgzOFx1NWJmOVx1ODg2OA0KLWNvbmNlcHRfdGV4dD1cdTY5ODJcdTVmZjUNCi1leGFtcGxlX3RleHQ9XHU3OTNhXHU0ZjhiDQotZ3VpZGVsaW5lX3RleHQ9XHU2MzA3XHU1MzU3DQotZXN0aW1hdGVfdGV4dD1cdTRmMzBcdTdiOTcNCi1lc3RpbWF0aW5nTWV0cmljX3RleHQ9XHU0ZjMwXHU3Yjk3XHU1ZWE2XHU5MWNmXHU1MDNjDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ9XHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5DQotcmVwb3J0X3RleHQ9XHU2MmE1XHU1NDRhDQotdGVtcGxhdGVfdGV4dD1cdTZhMjFcdTY3N2YNCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dD1cdTY1MmZcdTYzMDFcdTY3NTBcdTY1OTkNCi10b29sTWVudG9yX3RleHQ9XHU1ZGU1XHU1MTc3XHU1NDExXHU1YmZjDQotd2hpdGVwYXBlcl90ZXh0PVx1NzY3ZFx1NzZhZVx1NGU2Ng0KLXRlcm1EZWZpbml0aW9uX3RleHQ9XHU2NzJmXHU4YmVkXHU1YjlhXHU0ZTQ5DQotcHJhY3RpY2VfdGV4dD1cdTViOWVcdThkZjUNCi1yZXVzYWJsZUFzc2V0X3RleHQ9XHU1M2VmXHU5MWNkXHU3NTI4XHU4ZDQ0XHU0ZWE3DQotDQotI2FjdGl2aXR5IGJyZWFrZG93biBpbmZvIHN0cmluZ3MNCi1BY3Rpdml0eUxheW91dF9wcmltYXJ5VGFza3NfdGV4dD1cdTRmNWNcdTRlM2FcdTYyZTVcdTY3MDlcdTgwMDVcdTYyNjdcdTg4NGMNCi1BY3Rpdml0eUxheW91dF9hZGRpdGlvbmFsVGFza3NfdGV4dD1cdTRmNWNcdTRlM2FcdTUxNzZcdTRlZDZcdTc1MjhcdTYyMzdcdTYyNjdcdTg4NGMNCi0NCi0NCi0jIENvbnZlcnQgR3VpZGFuY2UgRXJyb3IgTWVzc2FnZXMNCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl90aXRsZT1cdThmNmNcdTYzNjJcdTYzMDdcdTViZmNcdTRmZTFcdTYwNmZcdTdjN2JcdTU3OGJcdTk1MTlcdThiZWYNCi0NCi0jIExvYWQgUmVzb3VyY2VzIEVycm9yIERpYWxvZw0KLWxvYWRSZXNvdXJjZXNFcnJvcl90aXRsZT1cdTYyNTNcdTVmMDBcdTY1YjlcdTZjZDVcdTVlOTNcdTk1MTlcdThiZWYNCi1sb2FkUmVzb3VyY2VzRXJyb3JfcmVhc29uPVx1NjVlMFx1NmNkNVx1ODhjNVx1NTE2NVx1NjdkMFx1NGU5Ylx1NWU5M1x1OGQ0NFx1NmU5MFx1MzAwMlxuXG5cdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTIwMWRcdWZmMGNcdTY4YzBcdTY3ZTVcdTk1MTlcdThiZWZcdTVlNzZcdTg5ZTNcdTUxYjNcdTViODNcdTRlZWNcdWZmMGNcdTcxMzZcdTU0MGVcdTUxOGRcdTViZjlcdTVlOTNcdTYyNjdcdTg4NGNcdTY2ZjRcdTU5MWFcdTY2ZjRcdTY1MzlcdTMwMDINCi0NCi0jIFJvbGUgRGlhZ3JhbXMNCi1yb2xlRGlhZ3JhbVBlcmZvcm1zX3RleHQ9XHU2MjY3XHU4ODRjDQotcm9sZURpYWdyYW1SZXNwb25zaWJsZUZvcl90ZXh0PVx1OGQxZlx1OGQyMw0KLQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzA9XHU4OGFiXHU1ZjE1XHU3NTI4XHU1MTQzXHU3ZDIwXHVmZjFhezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMT1cdTRmZTFcdTYwNmZcdWZmMWF7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0c0PVx1OGI2Nlx1NTQ0YVx1ZmYxYXswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzc9XHU5NTE5XHU4YmVmXHVmZjFhezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTA9XHU3ZjNhXHU1YzExXHU4OGFiXHU1ZjE1XHU3NTI4XHU1MTQzXHU3ZDIwIHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzExPVx1NjVlMFx1NmNkNVx1NjI3ZVx1NTIzMCBndWlkIHswfSBcdTc2ODRcdTUxNDNcdTdkMjANCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMj1cdTY1ODdcdTRlZjZcdTIwMWN7MH1cdTIwMWRcdTVmMTVcdTc1MjhcdTdmM2FcdTVjMTFcdThkNDRcdTZlOTBcdTIwMWN7MX1cdTIwMWQNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNT1cdTdmM2FcdTVjMTFcdThkNDRcdTZlOTBcdTY1ODdcdTRlZjZcdTIwMWN7MH1cdTIwMWQNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNz1cdTY1ZTBcdTZjZDVcdThmZGVcdTYzYTVcdTUyMzAgdXJsXHUyMDFjezB9XHUyMDFkDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTk9XHU2NWUwXHU2Y2Q1XHU4ZmRlXHU2M2E1XHU1MjMwIHVybFx1MjAxY3swfVx1MjAxZFx1ZmYxYXsxfQ0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOD1cdTY1ZTBcdTZjZDVcdTYyN2VcdTUyMzBcdTY1ODdcdTRlZjZcdTIwMWN7MH1cdTIwMWRcdTMwMDINCi1JbXBvcnRFeHBvcnRVdGlsX01TRzk9XHU2NWUwXHU2Y2Q1XHU1MjFiXHU1ZWZhXHU0ZTM0XHU2NWY2XHU3NmVlXHU1ZjU1XHUyMDFjezB9XHUyMDFkXHUzMDAyDQotdW5rbm93bkd1aWRhbmNlX3RleHQ9XHU2NzJhXHU3N2U1DQotDQotQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbl9sb2dfbm9Db250ZW50UGF0aD1Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uLkhhbmRsZUF0dGFjaG1lbnRzUGx1Z2luXHVmZjFhXHU2NWUwIHswfSBcdTc2ODRcdTUxODVcdTViYjlcdThkZWZcdTVmODQNCi1MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyX2Nhbm5vdFVwZGF0ZT1JVVBMMDAwNlc6IFx1NjVlMFx1NmNkNVx1NjZmNFx1NjViMCB7MH0gezF9DQotd2FybmluZ0RsZ190aXRsZT1cdThiNjZcdTU0NGENCi1lcnJvckRsZ190aXRsZT1cdTk1MTlcdThiZWYNCi1lcnJvckRsZ19zYXZlRXJyb3I9SVVQTDAwMDVFOiBcdTVjMDZcdTY2ZjRcdTY1MzlcdTRmZGRcdTViNThcdTUyMzBcdTY1ODdcdTRlZjZcdTIwMWN7MH1cdTIwMWRcdTY1ZjZcdTUxZmFcdTk1MTkNCi0NCi0jIGFjdGl2aXR5IGRpYWdyYW0gbmFtZXMNCi1hY3Rpdml0eURpYWdyYW1OYW1lPVx1NmQzYlx1NTJhOFx1NTZmZVx1ZmYxYXswfQ0KLWFjdGl2aXR5RGV0YWlsRGlhZ3JhbU5hbWU9XHU2ZDNiXHU1MmE4XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHU1NmZlXHVmZjFhezB9DQotd3BEZXBlbmRlbmN5RGlhZ3JhbU5hbWU9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU0ZjlkXHU4ZDU2XHU1MTczXHU3Y2ZiXHU1NmZlXHVmZjFhezB9DQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgUm9sZSBkaWFncmFtIGZvbnRzIGFuZCBsYXlvdXQNCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZT1cdTViZjlcdThiZGRcdTY4NDYNCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMj1cdTllZDFcdTRmNTMNCi1yb2xlRGlhZ3JhbUZvbnRfc2l6ZT0xMA0KLXJvbGVEaWFncmFtRm9udF9zaXplX3dpbjMyPTEwDQotcm9sZURpYWdyYW1feE1hcmdpbj0yMDANCi1yb2xlRGlhZ3JhbV94U3BhY2luZz03MA0KLXJvbGVEaWFncmFtX3lTcGFjaW5nPTMwDQotDQotIyBsb2NhbGl6ZSB0aGUgdmFsdWUgYmFzZWQgb24gbG9jYWxlLiAgZm9yIGV4YW1wbGUsIA0KLSMgZm9yIEVuZ2xpc2gsIHRoZSB2YWx1ZSBpcyAiLiAiDQotI2NvbG9uX3dpdGhfc3BhY2U9OiANCi0jIGZvciBmcmVuY2gsIHRoZSB2YWx1ZSBpcyAiIC4gIiwgeW91IG5lZWQgdG8gdXNlIGEgXCB0byBwcmVzZXJ2ZSB0aGUgbGVhZGluZyBzcGFjZQ0KLSNjb2xvbl93aXRoX3NwYWNlPVwgOiANCi0jIGZvciBjaGluZXNlLCB0aGUgY29sb24gc2hvdWxkIGJlIGRvdWJsZSBieXRlcw0KLSMgRG9udCB0cmltIHRoZSBzcGFjZXMgYWZ0ZXIgdGhlIGNvbG9uLg0KLWNvbG9uX3dpdGhfc3BhY2U9XHVmZjFhDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZDgyZTY2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi11bmtub3duX3RleHQ9XHU0ZTBkXHU2NjBlDQotDQotIyBFcnJvciBSZWFzb25zDQotZW1wdHlMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1cdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdThkZWZcdTVmOTFcdTdhN2FcdTc2N2RcdTMwMDINCi1taXNzaW5nTGlicmFyeUZpbGVFcnJvcl9yZWFzb249XHU5MDdhXHU2ZjBmXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU2YTIxXHU1NzhiXHU2YTk0XHUzMDAyDQotdW5yZXNvbHZlZFByb3h5RXJyb3JfcmVhc29uPVx1OTA3OFx1NTNkNlx1NzY4NFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NTMwNVx1NTQyYlx1NjcyYVx1ODllM1x1Njc5MFx1NzY4NFx1NTE0M1x1N2QyMFx1NTNjM1x1NzE2N1x1MzAwMlx1OTAxOVx1OTAxYVx1NWUzOFx1NjYyZlx1NTZlMFx1NzBiYVx1N2EwYlx1NWYwZlx1NWVhYlx1OGNjN1x1NjU5OVx1NTkzZVx1NGUyZFx1OTA3YVx1NmYwZlx1NjIxNlx1NzlmYlx1OTY2NCBYTUkgXHU2YTk0XHU2ODQ4XHUzMDAyXG5cblx1OGFjYlx1OTVkY1x1OTU4OVx1NmI2NFx1NWMwZFx1OGE3MVx1Njg0Nlx1NGY4Nlx1OTg2Zlx1NzkzYVx1MzAwY1x1NTU0Zlx1OTg0Y1x1MzAwZFx1ODk5Nlx1NTcxNlx1ZmYwY1x1NjI3ZVx1NTFmYVx1NjcyYVx1ODllM1x1Njc5MFx1NzY4NFx1NTNjM1x1NzE2N1x1MzAwMlx1NzBiYVx1NGU4Nlx1OTA3Zlx1NTE0ZFx1N2EwYlx1NWYwZlx1NWVhYlx1NmJjMFx1NjQwZFx1ZmYwY1x1NTcyOFx1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZFx1NTJhMFx1NTE2NVx1NjZmNFx1NTkxYVx1OGI4YVx1NjZmNFx1NGU0Ylx1NTI0ZFx1ZmYwY1x1NWVmYVx1OGI3MFx1NjBhOFx1NGUwMFx1NWI5YVx1ODk4MVx1NTE0OFx1ODllM1x1Njc5MFx1OTAxOVx1NGU5Ylx1NTNjM1x1NzE2N1x1MzAwMg0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcw0KLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzE9SVVQTDAwMDdXOiBcdTRlMDBcdTYyMTZcdTU5MWFcdTUwMGJcdTViNTBcdTUxNDNcdTdkMjBcdTUzMDVcdTU0MmJcdTkwN2FcdTZmMGZcdTc2ODRcdTUzYzNcdTcxNjcNCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cyPUlVUEwwMDA4VzogXHU2MWM5XHU4YTcyXHU5MDc4XHU1M2Q2XHU2YjY0XHU1MTQzXHU3ZDIwXHU0Zjg2XHU4OWUzXHU2NzkwXHU0ZTAwXHU2MjE2XHU1OTFhXHU1MDBiXHU5MDdhXHU2ZjBmXHU3Njg0XHU1M2MzXHU3MTY3DQotY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMz1JVVBMMDAwOVc6IFx1NmI2NFx1NTE0M1x1N2QyMFx1NTNjM1x1NzE2N1x1NjcyYVx1OTA3OFx1NTNkNlx1NzY4NFx1NTk1N1x1NGVmNlx1NGUyZFx1NzY4NFx1NGUwMFx1NjIxNlx1NTkxYVx1NTAwYlx1NTE0M1x1N2QyMA0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1sb2FkUmVzb3VyY2VzRXJyb3JfbXNnPUlVUEwwMDAwRTogXHU1ZGYyXHU4ZjA5XHU1MTY1XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHVmZjBjXHU0ZjQ2XHU1MDc1XHU2ZTJjXHU1MjMwXHU0ZTAwXHU0ZTliXHU5MzJmXHU4YWE0XHUzMDAyDQotdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9tc2c9SVVQTDAwMDFFOiBcdTZiNjRcdTYzMDdcdTVmMTVcdTcxMjFcdTZjZDVcdThmNDlcdTYzZGJcdTcwYmFcdTUzZTZcdTRlMDBcdTdhMmVcdTk4NWVcdTU3OGJcdTMwMDINCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDJFOiBcdTZiNjRcdTYzMDdcdTVmMTVcdTcxMjFcdTZjZDVcdThmNDlcdTYzZGJcdTcwYmFcdTc2ZWVcdTZhMTlcdTk4NWVcdTU3OGJcdTMwMDINCi1zYXZlQ29udmVydGVkR3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDNFOiBcdTcxMjFcdTZjZDVcdTUxMzJcdTViNThcdTVkZjJcdThmNDlcdTYzZGJcdTc2ODRcdTYzMDdcdTVmMTUgJyd7MH0nJ1x1MzAwMg0KLQ0KLSMgQ29udmVydCBhY3Rpdml0eQ0KLWNvbnZlcnRBY3Rpdml0eUVycm9yX3RpdGxlPVx1OGY0OVx1NjNkYlx1NmQzYlx1NTJkNVx1OTg1ZVx1NTc4Ylx1OTMyZlx1OGFhNA0KLWNvbnZlcnRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwNkU6IFx1NmI2NFx1NmQzYlx1NTJkNVx1NzEyMVx1NmNkNVx1OGY0OVx1NjNkYlx1NzBiYVx1NzZlZVx1NmExOVx1OTg1ZVx1NTc4Ylx1MzAwMg0KLXNhdmVDb252ZXJ0ZWRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwN0U6IFx1NzEyMVx1NmNkNVx1NTEzMlx1NWI1OFx1NWRmMlx1OGY0OVx1NjNkYlx1NzY4NFx1NmQzYlx1NTJkNSAnJ3swfScnXHUzMDAyDQotDQotIyBFcnJvciBSZWFzb25zDQotZXJyb3JfcmVhc29uPUlVUEwwMDA0RTogXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0XHUzMDAyXHU1OTgyXHU5NzAwXHU3NmY4XHU5NWRjXHU4Y2M3XHU4YTBhXHVmZjBjXHU4YWNiXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU3OGJhXHU1YjlhXHUzMDBkXHUzMDAyDQotdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9yZWFzb249ezB9IFx1NmM5Mlx1NjcwOVx1NzZmOFx1NWJiOVx1NzY4NFx1NjMwN1x1NWYxNVx1OTg1ZVx1NTc4Ylx1MzAwMg0KLWludmFsaWRMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1cdTdhMGJcdTVmMGZcdTVlYWJcdThkZWZcdTVmOTFcdTcxMjFcdTY1NDhcdTMwMDJcdTcxMjFcdTZjZDVcdTVlZmFcdTdhY2IgLnByb2plY3QgXHU2YTk0XHU2ODQ4XHUzMDAyDQotY291bGROb3RMb2NrTGlicmFyeV9yZWFzb249XHU3MTIxXHU2Y2Q1XHU5Mzk2XHU1YjlhXHU3YTBiXHU1ZjBmXHU1ZWFiXHUzMDAyDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWNvcHlpbmdBdHRhY2htZW50c1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTg5MDdcdTg4ZmRcdTk2NDRcdTRlZjYuLi4NCi0NCi0jIENvbnZlcnQgR3VpZGFuY2UgRGlhbG9nDQotY29udmVydEd1aWRhbmNlRGlhbG9nX3RpdGxlPVx1OGY0OVx1NjNkYlx1NjMwN1x1NWYxNVx1OTg1ZVx1NTc4Yg0KLWNvbnZlcnRHdWlkYW5jZURpYWxvZ190ZXh0PVx1OTA3OFx1NTNkNlx1NzZlZVx1NmExOVx1NjMwN1x1NWYxNVx1OTg1ZVx1NTc4Ylx1MzAwMg0KLQ0KLSMgR3VpZGFuY2UgdHlwZSBuYW1lcyBmb3IgQ29udmVydCBHdWlkYW5jZSBEaWFsb2cgLSBzaG91bGQgYmUgcmVmYWN0b3JlZCBpbnRvIGxpYnJhcnkudWkNCi1jaGVja2xpc3RfdGV4dD1cdTY4MzhcdTVjMGRcdTZlMDVcdTU1YWUNCi1jb25jZXB0X3RleHQ9XHU2OTgyXHU1ZmY1DQotZXhhbXBsZV90ZXh0PVx1N2JjNFx1NGY4Yg0KLWd1aWRlbGluZV90ZXh0PVx1NmU5Nlx1NTI0Nw0KLWVzdGltYXRlX3RleHQ9XHU5ODEwXHU0ZjMwDQotZXN0aW1hdGluZ01ldHJpY190ZXh0PVx1OTgxMFx1NGYzMFx1NmUyY1x1OTFjZlx1NTAzYw0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0PVx1OTgxMFx1NGYzMFx1ODAwM1x1OTFjZg0KLXJlcG9ydF90ZXh0PVx1NTgzMVx1NTQ0YQ0KLXRlbXBsYXRlX3RleHQ9XHU3YmM0XHU2NzJjDQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ9XHU2NTJmXHU2M2Y0XHU4Y2M3XHU2NTk5DQotdG9vbE1lbnRvcl90ZXh0PVx1NWRlNVx1NTE3N1x1OGYxNFx1NTJhOQ0KLXdoaXRlcGFwZXJfdGV4dD1cdTc2N2RcdTc2YWVcdTY2ZjgNCi10ZXJtRGVmaW5pdGlvbl90ZXh0PVx1OGE1ZVx1NWY1OVx1NWI5YVx1N2ZhOQ0KLXByYWN0aWNlX3RleHQ9XHU3ZGY0XHU3ZmQyDQotcmV1c2FibGVBc3NldF90ZXh0PVx1NTNlZlx1OTFjZFx1ODkwN1x1NGY3Zlx1NzUyOFx1NzY4NFx1OGNjN1x1NzUyMg0KLQ0KLSNhY3Rpdml0eSBicmVha2Rvd24gaW5mbyBzdHJpbmdzDQotQWN0aXZpdHlMYXlvdXRfcHJpbWFyeVRhc2tzX3RleHQ9XHU0ZWU1XHU2NGMxXHU2NzA5XHU4MDA1XHU4ZWFiXHU1MjA2XHU0Zjg2XHU1N2Y3XHU4ODRjDQotQWN0aXZpdHlMYXlvdXRfYWRkaXRpb25hbFRhc2tzX3RleHQ9XHU0ZWU1XHU1MTc2XHU0ZWQ2XHU4ZWFiXHU1MjA2XHU0Zjg2XHU1N2Y3XHU4ODRjDQotDQotDQotIyBDb252ZXJ0IEd1aWRhbmNlIEVycm9yIE1lc3NhZ2VzDQotY29udmVydEd1aWRhbmNlRXJyb3JfdGl0bGU9XHU4ZjQ5XHU2M2RiXHU2MzA3XHU1ZjE1XHU5ODVlXHU1NzhiXHU5MzJmXHU4YWE0DQotDQotIyBMb2FkIFJlc291cmNlcyBFcnJvciBEaWFsb2cNCi1sb2FkUmVzb3VyY2VzRXJyb3JfdGl0bGU9XHU5NThiXHU1NTVmXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU5MzJmXHU4YWE0DQotbG9hZFJlc291cmNlc0Vycm9yX3JlYXNvbj1cdTcxMjFcdTZjZDVcdThmMDlcdTUxNjVcdTRlMDBcdTRlOWJcdTdhMGJcdTVmMGZcdTVlYWJcdThjYzdcdTZlOTBcdTMwMDJcblxuXHU4YWNiXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5XHUzMDBkXHU0Zjg2XHU2YWEyXHU4OTk2XHU5MzJmXHU4YWE0XHVmZjBjXHU0ZTI2XHU2NWJjXHU3YTBiXHU1ZjBmXHU1ZWFiXHU0ZTJkXHU1MmEwXHU1MTY1XHU2NmY0XHU1OTFhXHU4YjhhXHU2NmY0XHU0ZTRiXHU1MjRkXHU4OWUzXHU2YzdhXHU5MzJmXHU4YWE0XHUzMDAyDQotDQotIyBSb2xlIERpYWdyYW1zDQotcm9sZURpYWdyYW1QZXJmb3Jtc190ZXh0PVx1NTdmN1x1ODg0Yw0KLXJvbGVEaWFncmFtUmVzcG9uc2libGVGb3JfdGV4dD1cdThjYTBcdThjYWMNCi0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cwPVx1NTNjM1x1NzE2N1x1NzY4NFx1NTE0M1x1N2QyMFx1ZmYxYXswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE9XHU4Y2M3XHU4YTBhXHVmZjFhezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHND1cdThiNjZcdTU0NGFcdWZmMWF7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0c3PVx1OTMyZlx1OGFhNFx1ZmYxYXswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEwPVx1OTA3YVx1NmYwZlx1NTNjM1x1NzE2N1x1NzY4NFx1NTE0M1x1N2QyMCB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMT1cdTYyN2VcdTRlMGRcdTUyMzAgZ3VpZCB7MH0gXHU3Njg0XHU1MTQzXHU3ZDIwDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTI9XHU2YTk0XHU2ODQ4ICcnezB9JycgXHU1M2MzXHU3MTY3XHU1MjMwXHU5MDdhXHU2ZjBmXHU3Njg0XHU4Y2M3XHU2ZTkwICcnezF9JycNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNT1cdTkwN2FcdTZmMGZcdThjYzdcdTZlOTBcdTZhOTQgJyd7MH0nJw0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE3PVx1NzEyMVx1NmNkNVx1OTAyM1x1NjNhNSB1cmwgJyd7MH0nJw0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE5PVx1NzEyMVx1NmNkNVx1OTAyM1x1NjNhNSB1cmwgJyd7MH0nJ1x1ZmYxYXsxfQ0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOD1cdTYyN2VcdTRlMGRcdTUyMzBcdTZhOTRcdTY4NDggJyd7MH0nJ1x1MzAwMg0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOT1cdTcxMjFcdTZjZDVcdTVlZmFcdTdhY2JcdTY2YWJcdTY2NDJcdTc2ZWVcdTkzMDQgJyd7MH0nJ1x1MzAwMg0KLXVua25vd25HdWlkYW5jZV90ZXh0PVx1NGUwZFx1NjYwZQ0KLQ0KLUNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb25fbG9nX25vQ29udGVudFBhdGg9Q29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbi5IYW5kbGVBdHRhY2htZW50c1BsdWdpbjogezB9IFx1NmM5Mlx1NjcwOSBjb250ZW50UGF0aA0KLUxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXJfY2Fubm90VXBkYXRlPUlVUEwwMDA2VzogXHU3MTIxXHU2Y2Q1XHU2NmY0XHU2NWIwezB9IHsxfQ0KLXdhcm5pbmdEbGdfdGl0bGU9XHU4YjY2XHU1NDRhDQotZXJyb3JEbGdfdGl0bGU9XHU5MzJmXHU4YWE0DQotZXJyb3JEbGdfc2F2ZUVycm9yPUlVUEwwMDA1RTogXHU1MTMyXHU1YjU4XHU2YTk0XHU2ODQ4ICcnezB9JycgXHU3Njg0XHU4YjhhXHU2NmY0XHU2NjQyXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0DQotDQotIyBhY3Rpdml0eSBkaWFncmFtIG5hbWVzDQotYWN0aXZpdHlEaWFncmFtTmFtZT1cdTZkM2JcdTUyZDVcdTU3MTZcdWZmMWF7MH0NCi1hY3Rpdml0eURldGFpbERpYWdyYW1OYW1lPVx1NmQzYlx1NTJkNVx1NjYwZVx1N2QzMFx1NTcxNlx1ZmYxYXswfQ0KLXdwRGVwZW5kZW5jeURpYWdyYW1OYW1lPVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1NzZmOFx1NGY5ZFx1OTVkY1x1NGZjMlx1NTcxNlx1ZmYxYXswfQ0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIFJvbGUgZGlhZ3JhbSBmb250cyBhbmQgbGF5b3V0DQotcm9sZURpYWdyYW1Gb250X25hbWU9RGlhbG9nDQotcm9sZURpYWdyYW1Gb250X25hbWVfd2luMzI9XHU3ZDMwXHU2NjBlXHU5YWQ0DQotcm9sZURpYWdyYW1Gb250X3NpemU9MTANCi1yb2xlRGlhZ3JhbUZvbnRfc2l6ZV93aW4zMj0xMA0KLXJvbGVEaWFncmFtX3hNYXJnaW49MjAwDQotcm9sZURpYWdyYW1feFNwYWNpbmc9NzANCi1yb2xlRGlhZ3JhbV95U3BhY2luZz0zMA0KLQ0KLSMgbG9jYWxpemUgdGhlIHZhbHVlIGJhc2VkIG9uIGxvY2FsZS4gIGZvciBleGFtcGxlLCANCi0jIGZvciBFbmdsaXNoLCB0aGUgdmFsdWUgaXMgIi4gIg0KLSNjb2xvbl93aXRoX3NwYWNlPTogDQotIyBmb3IgZnJlbmNoLCB0aGUgdmFsdWUgaXMgIiAuICIsIHlvdSBuZWVkIHRvIHVzZSBhIFwgdG8gcHJlc2VydmUgdGhlIGxlYWRpbmcgc3BhY2UNCi0jY29sb25fd2l0aF9zcGFjZT1cIDogDQotIyBmb3IgY2hpbmVzZSwgdGhlIGNvbG9uIHNob3VsZCBiZSBkb3VibGUgYnl0ZXMNCi0jIERvbnQgdHJpbSB0aGUgc3BhY2VzIGFmdGVyIHRoZSBjb2xvbi4NCi1jb2xvbl93aXRoX3NwYWNlPVx1ZmYxYSANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDBhNGZiMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGYwYzJlNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDIuamFyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGZyYWdtZW50Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODNiMmIzNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UubmwyLmphciA9IHNyYy8NCi1vdXRwdXQubmwyLmphciA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBubDIuamFyLFwNCi0gICAgICAgICAgICAgICBsYXlvdXQvLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcnUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvZnJhZ21lbnQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyL2ZyYWdtZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxZDk2MWMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvZnJhZ21lbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZnJhZ21lbnROYW1lPUVQRiBDb21wb3NlciBMaWJyYXJ5IChOTDIpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvbGF5b3V0L3NjcmlwdHMvY29udGVudHBhZ2VfcnUuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9ydS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTNiMTg0OS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9ydS5qcworKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi12YXIgY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCA9IGZhbHNlOw0KLXZhciBmaXJzdFNlY3Rpb247DQotdmFyIGV4cGFuZEltYWdlOw0KLXZhciBjb2xsYXBzZUltYWdlOw0KLXZhciBleHBhbmRBbGxJbWFnZTsNCi12YXIgY29sbGFwc2VBbGxJbWFnZTsNCi12YXIgYmFja1RvVG9wSW1hZ2U7DQotdmFyIHNoaW1JbWFnZTsNCi12YXIgZXhwYW5kTWVzc2FnZSA9ICLQoNCw0LfQstC10YDQvdGD0YLRjCDQstGB0LUg0YDQsNC30LTQtdC70YsiOw0KLXZhciBjb2xsYXBzZU1lc3NhZ2UgPSAi0KHQstC10YDQvdGD0YLRjCDQstGB0LUg0YDQsNC30LTQtdC70YsiOw0KLXZhciBiYWNrTWVzc2FnZSA9ICLQkiDQvdCw0YfQsNC70L4iOw0KLQ0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHNlY3Rpb24gbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlU2VjdGlvbkxpbmtzKHRhZ05hbWUsIGNsYXNzU2VsZWN0b3IsIGltZ1BhdGgpIHsNCi0JZXhwYW5kSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZC5naWYnOwkNCi0JY29sbGFwc2VJbWFnZSA9IGltZ1BhdGggKyAnY29sbGFwc2UuZ2lmJzsNCi0JZXhwYW5kQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZF9hbGwuZ2lmJzsJDQotCWNvbGxhcHNlQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2NvbGxhcHNlX2FsbC5naWYnOw0KLQliYWNrVG9Ub3BJbWFnZSA9IGltZ1BhdGggKyAnYmFja190b190b3AuZ2lmJzsNCi0Jc2hpbUltYWdlID0gaW1nUGF0aCArICdzaGltLmdpZic7DQotCQ0KLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsNCi0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOw0KLQkJdmFyIHNlY3Rpb25FbGVtZW50cyA9IG5ldyBBcnJheShlbGVtZW50cy5sZW5ndGgpOw0KLQkJdmFyIHRvdGFsTGlua3MgPSAwOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07DQotCQkJaWYgKGVsZW1lbnQuY2xhc3NOYW1lID09IGNsYXNzU2VsZWN0b3IpIHsNCi0JCQkJc2VjdGlvbkVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50Ow0KLQkJCX0NCi0JCX0NCi0JCXNlY3Rpb25FbGVtZW50cy5sZW5ndGggPSB0b3RhbExpbmtzOw0KLQkJc2VjdGlvbkNvbGxhcHNlRGl2cyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJZmlyc3RTZWN0aW9uID0gc2VjdGlvbkVsZW1lbnRzWzBdOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uRWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IHNlY3Rpb25FbGVtZW50c1tpXTsNCi0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsNCi0JCQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoc2libGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSAmJiBzaWJsaW5nQ29udGFpbmVyLnN0eWxlKSB7CQ0KLQkJCQl2YXIgbmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHRTaWJsaW5nOw0KLQkJCQllbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNpYmxpbmdDb250YWluZXIsIG5leHRTaWJsaW5nKTsNCi0JCQkJdmFyIG5leHRFbGVtZW50ID0gc2VjdGlvbkVsZW1lbnRzW2kgKyAxXTsNCi0JCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG5leHRFbGVtZW50ICYmIG5leHRTaWJsaW5nICE9IG51bGwgJiYgbmV4dFNpYmxpbmcuY2xhc3NOYW1lICE9ICdjb3B5cmlnaHQnKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2VjdGlvbkNvbGxhcHNlRGl2c1tpXSA9IHNpYmxpbmdDb250YWluZXI7DQotICAgIAkJCWNyZWF0ZUNvbGxhcHNpYmxlU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3Moc2VjdGlvbkVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc2VjdGlvbi4NCi1mdW5jdGlvbiBjcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCS8vIEFkZCBhIHNwYWNpbmcgYmV0d2VlbiB0aGUgc2VjdGlvbnMuDQotCQl2YXIgc2VjdGlvblNlcGFyYXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJc2VjdGlvblNlcGFyYXRvci5zcmMgPSBzaGltSW1hZ2U7DQotCQlzZWN0aW9uU2VwYXJhdG9yLmhlaWdodCA9ICczJzsNCi0JCXNlY3Rpb25TZXBhcmF0b3IuYm9yZGVyID0gJzAnOw0KLQkJc2VjdGlvblNlcGFyYXRvci5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzZWN0aW9uU2VwYXJhdG9yLCBlbGVtZW50KTsNCi0JCQ0KLQkJLy8gQWRkIGEgZXhwYW5kL2NvbGxhcHNlIGxpbmsgdG8gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTZWN0aW9uOw0KLQkJc2VjdGlvbkNvbGxhcHNlTGlua3NbaW5kZXhdID0gbGluazsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50Lmluc2VydEJlZm9yZShzcGFuLCBlbGVtZW50LmZpcnN0Q2hpbGQpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotICAgIAkNCi0JCS8vIEFkZCBhIEJhY2sgVG8gVG9wIGxpbmsgaW4gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCWNyZWF0ZUJhY2tUb1RvcExpbmsoc2libGluZ0NvbnRhaW5lcik7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIEJhY2sgdG8gdG9wIGxpbmsuDQotZnVuY3Rpb24gY3JlYXRlQmFja1RvVG9wTGluayhlbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQ0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKSB7DQotCQlkaXYuY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gYmFja1RvVG9wSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYmFja01lc3NhZ2UpKTsJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZGl2KTsNCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHNlY3Rpb24gYmFzZWQgb24gdGhlIHJlY2VpdmVkIGV2ZW50Lg0KLWZ1bmN0aW9uIGV4cGFuZENvbGxhcHNlU2VjdGlvbihldnQpIHsNCi0JaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQllbHNlIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgdGhlIEV4cGFuZCBBbGwgYW5kIENvbGxhcHNlIEFsbCBTZWN0aW9ucyBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3MoZmlyc3RFbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQkNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gZXhwYW5kQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGw7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGV4cGFuZE1lc3NhZ2UpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7CQkJCQkJDQotCQkNCi0JCWltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gY29sbGFwc2VBbGw7DQotCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29sbGFwc2VNZXNzYWdlKSk7CQkJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJLyoNCi0JCXZhciBvdmVydmlld1NlcGFyYXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdmVydmlld1NlcGFyYXRvciIpOw0KLQkJb3ZlcnZpZXdTZXBhcmF0b3IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBvdmVydmlld1NlcGFyYXRvcik7DQotCQkqLw0KLQkJaWYgKGZpcnN0U2VjdGlvbiAhPSBudWxsKSB7DQotCQkJZmlyc3RTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTZWN0aW9uKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIGFsbCBzZWN0aW9ucy4NCi1mdW5jdGlvbiBleHBhbmRBbGwoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHNlY3Rpb25zLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsKGV2dCkgew0KLQlmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JCXNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gVGhpcyB0ZW1wb3JhcnkgZnVuY3Rpb24gaGVscHMgdG8gcmVzb2x2ZSBKYXZhc2NyaXB0IGVycm9ycyBpbiB0aGUgbWlncmF0ZWQgUlVQDQotLy8gY29udGVudCBwYWdlcy4gSXQgd2lsbCBiZSByZW1vdmVkIG9uY2UgdGhlIGNvcnJlc3BvbmRpbmcgLmpzIGZpbGVzIGFyZSBiZWluZw0KLS8vIG1pZ3JhdGVkIGFsb25nIHdpdGggdGhlIEhUTUwgY29udGVudCBwYWdlcy4NCi1mdW5jdGlvbiBSZWZlcmVuY2VIZWxwVG9waWMgKHRvcGljTmFtZSwgYm9vayAsIGZpbGVOYW1lKSB7DQotICAgZG9jdW1lbnQud3JpdGUoIjxpPiIrIHRvcGljTmFtZSArICI8XC9pPiIpOw0KLX0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi9sYXlvdXQvc2NyaXB0cy9zdGVwc19ydS5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyL2xheW91dC9zY3JpcHRzL3N0ZXBzX3J1LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDYxYTY1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyL2xheW91dC9zY3JpcHRzL3N0ZXBzX3J1LmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLXZhciBjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0ID0gdHJ1ZTsNCi12YXIgc3RlcEltZ0JhY2tQYXRoID0gJy4uLy4uLyc7DQotdmFyIGV4cGFuZEFsbFRleHQgPSAi0KDQsNC30LLQtdGA0L3Rg9GC0Ywg0LLRgdC1INGI0LDQs9C4IjsNCi12YXIgY29sbGFwc2VBbGxUZXh0ID0gItCh0LLQtdGA0L3Rg9GC0Ywg0LLRgdC1INGI0LDQs9C4IjsNCi12YXIgZmlyc3RTdGVwU2VjdGlvbjsNCi0NCi0vLyBDcmVhdGVzIHRoZSBjb2xsYXBzaWJsZSBzdGVwIHNlY3Rpb24gbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlU3RlcExpbmtzKHRhZ05hbWUsIGNsYXNzU2VsZWN0b3IpIHsNCi0JaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7DQotCQl2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsNCi0JCWlmIChlbGVtZW50cy5sZW5ndGggPT0gMCkgcmV0dXJuOw0KLQkJdmFyIHN0ZXBFbGVtZW50cyA9IG5ldyBBcnJheShlbGVtZW50cy5sZW5ndGgpOw0KLQkJdmFyIHRvdGFsTGlua3MgPSAwOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07DQotCQkJaWYgKGVsZW1lbnQuY2xhc3NOYW1lID09IGNsYXNzU2VsZWN0b3IpIHsNCi0JCQkJc3RlcEVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50Ow0KLQkJCX0NCi0JCX0NCi0JCWlmICh0b3RhbExpbmtzID09IDApIHJldHVybjsNCi0JCXN0ZXBFbGVtZW50cy5sZW5ndGggPSB0b3RhbExpbmtzOw0KLQkJc3RlcENvbGxhcHNlRGl2cyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCXN0ZXBDb2xsYXBzZUxpbmtzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJZmlyc3RTdGVwU2VjdGlvbiA9IHN0ZXBFbGVtZW50c1swXTsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgc3RlcEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJdmFyIGVsZW1lbnQgPSBzdGVwRWxlbWVudHNbaV07DQotCQkJdmFyIHNpYmxpbmdDb250YWluZXI7DQotCQkJaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKHNpYmxpbmdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkgJiYgc2libGluZ0NvbnRhaW5lci5zdHlsZSkgew0KLQkJCQl2YXIgbmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHRTaWJsaW5nOw0KLQkJCQllbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNpYmxpbmdDb250YWluZXIsIG5leHRTaWJsaW5nKTsNCi0JCQkJdmFyIG5leHRFbGVtZW50ID0gc3RlcEVsZW1lbnRzW2kgKyAxXTsNCi0JCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG5leHRFbGVtZW50ICYmIG5leHRTaWJsaW5nICE9IG51bGwpIHsNCi0JCQkJCXZhciB0b01vdmUgPSBuZXh0U2libGluZzsNCi0JCQkJCW5leHRTaWJsaW5nID0gbmV4dFNpYmxpbmcubmV4dFNpYmxpbmc7DQotCQkJCQlzaWJsaW5nQ29udGFpbmVyLmFwcGVuZENoaWxkKHRvTW92ZSk7DQotCQkJCX0NCi0JCQkJaWYgKGNvbGxhcHNlU3RlcHNCeURlZmF1bHQpIHsNCi0gICAgCQkJCXNpYmxpbmdDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0gICAgCQkJfQ0KLSAgICAJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCXN0ZXBDb2xsYXBzZURpdnNbaV0gPSBzaWJsaW5nQ29udGFpbmVyOw0KLSAgICAJCQljcmVhdGVDb2xsYXBzaWJsZVN0ZXBTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGkpOw0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCX0NCi0JCWNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU3RlcHNMaW5rcyhzdGVwRWxlbWVudHNbMF0pOw0KLQl9DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSBjb2xsYXBzaWJsZSBzdGVwIHNlY3Rpb24uDQotZnVuY3Rpb24gY3JlYXRlQ29sbGFwc2libGVTdGVwU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpbmRleCkgew0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCkgew0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQl2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY29sbGFwc2VEaXYgPSBzaWJsaW5nQ29udGFpbmVyOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpZiAoY29sbGFwc2VTdGVwc0J5RGVmYXVsdCkgew0KLQkJCWltYWdlLnNyYyA9IGV4cGFuZEltYWdlOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJaW1hZ2Uuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JCX0NCi0JCWltYWdlLndpZHRoID0gJzE3JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNSc7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRDb2xsYXBzZVN0ZXBTZWN0aW9uOw0KLQkJc3RlcENvbGxhcHNlTGlua3NbaW5kZXhdID0gbGluazsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50Lmluc2VydEJlZm9yZShzcGFuLCBlbGVtZW50LmZpcnN0Q2hpbGQpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBvciBjb2xsYXBzZXMgYSBzdGVwIHNlY3Rpb24gYmFzZWQgb24gdGhlIHJlY2VpdmVkIGV2ZW50Lg0KLWZ1bmN0aW9uIGV4cGFuZENvbGxhcHNlU3RlcFNlY3Rpb24oZXZ0KSB7DQotCWlmICh0aGlzLmNvbGxhcHNlRGl2LnN0eWxlLmRpc3BsYXkgPT0gJycpIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JZWxzZSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDcmVhdGVzIHRoZSBFeHBhbmQgQWxsIGFuZCBDb2xsYXBzZSBBbGwgU3RlcHMgbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTdGVwc0xpbmtzKGZpcnN0RWxlbWVudCkgew0KLQl2YXIgZGl2Ow0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKSB7DQotCQlkaXYuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlkaXYuYWxpZ24gPSAncmlnaHQnOwkJDQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGV4cGFuZEFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQl2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGV4cGFuZEFsbFN0ZXBzOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOw0KLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShleHBhbmRBbGxUZXh0KSk7DQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOw0KLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQkJDQotCQlpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gY29sbGFwc2VBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCi0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7DQotCQlsaW5rLmhyZWYgPSAnIyc7DQotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsNCi0JCWxpbmsub25jbGljayA9IGNvbGxhcHNlQWxsU3RlcHM7DQotCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29sbGFwc2VBbGxUZXh0KSk7DQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOw0KLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOw0KLQkJDQotCQlpZiAoZmlyc3RTdGVwU2VjdGlvbikgew0KLQkJCWZpcnN0U3RlcFNlY3Rpb24ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBmaXJzdFN0ZXBTZWN0aW9uKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIGFsbCBzdGVwcy4NCi1mdW5jdGlvbiBleHBhbmRBbGxTdGVwcyhldnQpIHsNCi0JIGZvciAodmFyIGkgPSAwOyBpIDwgc3RlcENvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgew0KLQkgCXN0ZXBDb2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkgCXN0ZXBDb2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gY29sbGFwc2VJbWFnZTsNCi0JIH0NCi0JIGlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCSAJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCSB9DQotCSByZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENvbGxhcHNlcyBhbGwgc3RlcHMuDQotZnVuY3Rpb24gY29sbGFwc2VBbGxTdGVwcyhldnQpIHsNCi0JZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7DQotCQlzdGVwQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQlzdGVwQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX3J1LmpzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfcnUuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgxOGMwNzIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfcnUuanMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBIZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UxID0gItCa0L7QvdGE0LjQs9GD0YDQsNGG0LjRjyDRg9C20LUg0L/QvtC60LDQt9Cw0L3QsCDQsiDQv9Cw0L3QtdC70Y/RhSI7DQotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UyID0gItCf0L7QutCw0LfQsNGC0Ywg0L/QsNC90LXQu9C4IjsNCi12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTMgPSAi0JIg0L3QsNGH0LDQu9C+IjsNCi0NCi1mdW5jdGlvbiBsb2FkVG9wKCkNCi17DQotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiAocGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIgfHwgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvY19mcmFtZSIpICkNCi0gIHsNCi0gICAgIGFsZXJ0KHRyZWVicm93c2VyX2pzX01FU1NBR0UxKTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOw0KLSAgICBleHBpcmVzLnNldFRpbWUgKGV4cGlyZXMuZ2V0VGltZSgpICsgKDEwMDAgKiAyMCkpOw0KLSAgICBkb2N1bWVudC5jb29raWUgPSAicnVwX29yeV9kb2M9IiArIGVzY2FwZSAoZG9jdW1lbnQuVVJMKSArDQotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOw0KLSAgICAJDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotCXZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOyANCi0JaWYgKCAgbWFpbkluZGV4X2EgIT0gbnVsbCApIHsgDQotICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBtYWluSW5kZXhfYS5pdGVtKDApLmhyZWY7IA0KLQl9IA0KLQ0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpDQotICAgIHsNCi0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQ0KLQl7DQotCQl3aW5kb3cuY2xvc2UoKTsNCi0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsJCQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsNCi0JfQ0KLSAgICB9DQotICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBnZXRJbWFnZVVybChpbWFnZSkNCi17DQotICAgIHZhciBuZXdfb3J5X2RvY19sb2M9bnVsbDsgICAgDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZi5zdWJzdHJpbmcoMCxtYWluSW5kZXhfYS5pdGVtKDApLmhyZWYubGFzdEluZGV4T2YoIi8iKSk7DQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG5ld19vcnlfZG9jX2xvYyArICIiICsgaW1hZ2U7DQotICAgIHJldHVybiBuZXdfb3J5X2RvY19sb2M7ICAgIA0KLX0NCi0NCi1NU0ZQaG92ZXIgPQ0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwNCi0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOw0KLQ0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQ0KLSAgew0KLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7DQotICAgICBhLnNyYz1pbWc7DQotICAgICByZXR1cm4gYTsNCi0gIH0NCi0NCi0gICAgaWYoTVNGUGhvdmVyKQ0KLSAgICB7DQotICAgICAgICBSdXBHcmF5PU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmJykpOw0KLSAgICAgICAgUnVwQmx1ZT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzX2EuZ2lmJykpOw0KLSAgICB9DQotDQotDQotLy9uZXcgY29kZSB0byBkaXNwbGF5IHRoZSBsb2FkIGJ1dHRvbiBvciBub3QNCi12YXIgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYzsNCi1pZiAob3J5X3RvY19leGlzdCA9PSAidW5kZWZpbmVkIikgew0KLSAgIG9yeV90b2NfZXhpc3QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2NfZnJhbWU7DQotfQ0KLQ0KLWlmIChvcnlfdG9jX2V4aXN0ID09ICJ1bmRlZmluZWQiKSB7DQotCWRvY3VtZW50LndyaXRlKCI8YSBjbGFzcz1cImV4cGFuZENvbGxhcHNlTGlua1wiIGhyZWY9XCJKYXZhU2NyaXB0OmxvYWRUb3AoKTtcIiBvbm1vdXNlb3Zlcj1cImlmKE1TRlBob3ZlcikgZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwQmx1ZS5zcmM7IHNlbGYuc3RhdHVzPXRyZWVicm93c2VyX2pzX01FU1NBR0UyOyByZXR1cm4gdHJ1ZVwiIG9ubW91c2VvdXQ9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEdyYXkuc3JjOyBzZWxmLnN0YXR1cz0gJyAnO3JldHVybiB0cnVlXCI+IDxicj4gPGltZyBzcmM9XCIiICsgYmFja1BhdGggKyAiaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmIik7DQotLy9TVEFSVCBOT04tVFJBTlNMQVRBQkxFDQotCWRvY3VtZW50LndyaXRlKCJcIiAgYm9yZGVyPVwiMFwiIGFsaWduPVwiYWJzbWlkZGxlXCIgYWx0PVwiIiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIlwiIG5hbWU9XCIiICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTMgKyAiXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+IiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIjxcL2E+Iik7DQotLy9FTkQgTk9OLVRSQU5TTEFUQUJMRQ0KLX0NCi1lbHNlIHsNCi0JZG9jdW1lbnQud3JpdGUoIiZuYnNwOyIpOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi9sYXlvdXQveHNsL3Jlc291cmNlc19ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvbGF5b3V0L3hzbC9yZXNvdXJjZXNfcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjA5ZDUwOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi9sYXlvdXQveHNsL3Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMgVGhlIFVJIHRleHQgaW4gdGhlIFhTTCBzdHlsZXNoZWV0cy4NCi0NCi1hZGRpdGlvbmFsSW5mb1RleHQ9XHUwNDE0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLWFkZGl0aW9uYWxQZXJmb3JtZXJUZXh0PVx1MDQxNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0MzgNCi1hZ2dyZWdhdGVzVGV4dD1cdTA0MjFcdTA0M2VcdTA0MzJcdTA0M2VcdTA0M2FcdTA0NDNcdTA0M2ZcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDMyXHUwNDM1XHUwNDNiXHUwNDM4XHUwNDQ3XHUwNDM4XHUwNDNkXHUwNDRiDQotYWx0ZXJuYXRpdmVzVGV4dD1cdTA0MTBcdTA0M2JcdTA0NGNcdTA0NDJcdTA0MzVcdTA0NDBcdTA0M2RcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0NGINCi1hcHBsaWNhdGlvblRleHQ9XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDNiXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1DQotYXJ0aWZhY3RUZXh0PVx1MDQxMFx1MDQ0MFx1MDQ0Mlx1MDQzNVx1MDQ0NFx1MDQzMFx1MDQzYVx1MDQ0Mg0KLWFzc2V0c1RleHQ9XHUwNDIwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDRiDQotYXNzaWdubWVudEFwcHJvYWNoZXNUZXh0PVx1MDQxZlx1MDQzZVx1MDQzNFx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQ0YiBcdTA0M2EgXHUwNDNkXHUwNDMwXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRlDQotYXNzaXN0aW5nVGV4dD1cdTA0MWZcdTA0M2VcdTA0M2NcdTA0M2VcdTA0NDlcdTA0NGMNCi1iYWNrZ3JvdW5kVGV4dD1cdTA0MWZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NGJcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NGYNCi1icmllZk91dGxpbmVUZXh0PVx1MDQxYVx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQzYVx1MDQzMFx1MDQ0ZiBcdTA0NDFcdTA0NDVcdTA0MzVcdTA0M2NcdTA0MzANCi1jaGVja0l0ZW1zVGV4dD1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDQxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQ0Yg0KLWNoZWNrbGlzdHNUZXh0PVx1MDQyMVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0NGINCi1jb2xsYXBzZUFsbFRleHQ9XHUwNDIxXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNkXHUwNDQzXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0MVx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGINCi1jb21wb3NpdGVSb2xlVGV4dD1cdTA0MjFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDRjDQotY29uY2VwdHNUZXh0PVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0Nlx1MDQzNVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQzOA0KLWNvbnRhaW5lZEFydGlmYWN0c1RleHQ9XHUwNDIxXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDMwXHUwNDQ5XHUwNDM4XHUwNDM1XHUwNDQxXHUwNDRmIFx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzNVx1MDQ0NFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLWNvbnRhaW5lckFydGlmYWN0VGV4dD1cdTA0MTBcdTA0NDBcdTA0NDJcdTA0MzVcdTA0NDRcdTA0MzBcdTA0M2FcdTA0NDItXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQyXHUwNDM1XHUwNDM5XHUwNDNkXHUwNDM1XHUwNDQwDQotY29udGVudEVsZW1lbnRzVGV4dD1cdTA0MWFcdTA0M2JcdTA0MzBcdTA0NDFcdTA0NDFcdTA0MzhcdTA0NDRcdTA0MzhcdTA0NDZcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiDQotY29udGVudFJlZmVyZW5jZXNUZXh0PVx1MDQyMVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOCBcdTA0M2RcdTA0MzAgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiDQotZGVsaXZlcmFibGVUZXh0PVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQzNVx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDINCi1kZWxpdmVyYWJsZVByb3BlcnRpZXNUZXh0PVx1MDQyMVx1MDQzMlx1MDQzZVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzMCBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwDQotZGVsaXZlcmVkUGFydHNUZXh0PVx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwDQotZGVsaXZlcmVkV29ya1Byb2R1Y3RzVGV4dD1cdTA0MTRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLWRlcGVuZGVudFRleHQ9XHUwNDE3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNjXHUwNDRiXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGINCi1kZXNjcmlwdGlvblRleHQ9XHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1DQotZGlzY2lwbGluZVRleHQ9XHUwNDE0XHUwNDM4XHUwNDQxXHUwNDQ2XHUwNDM4XHUwNDNmXHUwNDNiXHUwNDM4XHUwNDNkXHUwNDMwDQotZGlzY2lwbGluZXNUZXh0PVx1MDQxNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZFx1MDQ0Yg0KLXN1YmRpc2NpcGxpbmVzVGV4dD1cdTA0MTRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2RcdTA0NGINCi1kb21haW5UZXh0PVx1MDQxNFx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZA0KLWRvbWFpbnNUZXh0PVx1MDQxNFx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Yg0KLWV4YW1wbGVzVGV4dD1cdTA0MWZcdTA0NDBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0NDBcdTA0NGINCi1leHBhbmRBbGxUZXh0PVx1MDQyMFx1MDQzMFx1MDQzN1x1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzZFx1MDQ0M1x1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0NDFcdTA0MzUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiDQotZXh0ZW5kc1RleHQ9XHUwNDIwXHUwNDMwXHUwNDQxXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDRmXHUwNDM1XHUwNDQyDQotZXh0ZXJuYWxUZXh0PVx1MDQxMlx1MDQzZFx1MDQzNVx1MDQ0OFx1MDQzZFx1MDQzOFx1MDQzOQ0KLWV4dGVybmFsRGVzY3JpcHRpb25UZXh0PVx1MDQxMlx1MDQzZFx1MDQzNVx1MDQ0OFx1MDQzZFx1MDQzNVx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUNCi1nb2Fsc1RleHQ9XHUwNDI2XHUwNDM1XHUwNDNiXHUwNDM4DQotZ3VpZGVsaW5lc1RleHQ9XHUwNDIwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotaWxsdXN0cmF0aW9uc1RleHQ9XHUwNDE4XHUwNDNiXHUwNDNiXHUwNDRlXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IA0KLWltcGFjdE9mTm90SGF2aW5nVGV4dD1cdTA0MWZcdTA0M2VcdTA0NDFcdTA0M2JcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzhcdTA0NGYgXHUwNDNlXHUwNDQyXHUwNDQxXHUwNDQzXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM4XHUwNDRmDQotaW1wYWN0aW5nVGV4dD1cdTA0MTJcdTA0M2JcdTA0MzhcdTA0NGZcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLWlucHV0c1RleHQ9XHUwNDEyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDRiDQotaW5wdXRUb1RleHQ9XHUwNDEyXHUwNDQ1XHUwNDNlXHUwNDM0IFx1MDQzNFx1MDQzYlx1MDQ0Zg0KLWl0ZW1zVGV4dD1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGINCi1rZXlDb25zaWRlcmF0aW9uc1RleHQ9XHUwNDFhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDM1XHUwNDMyXHUwNDRiXHUwNDM1IFx1MDQ0M1x1MDQ0MVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Zg0KLWxldmVsc09mQWRvcHRpb25UZXh0PVx1MDQyM1x1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzZFx1MDQzOCBcdTA0MzJcdTA0M2RcdTA0MzVcdTA0MzRcdTA0NDBcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1tYW5kYXRvcnlUZXh0PVx1MDQxZVx1MDQzMVx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOQ0KLW1haW5UZXh0PVx1MDQxM1x1MDQzYlx1MDQzMFx1MDQzMlx1MDQzZFx1MDQ0Ylx1MDQzOQ0KLW1haW5EZXNjcmlwdGlvblRleHQ9XHUwNDFlXHUwNDQxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNkXHUwNDNlXHUwNDM1IFx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNQ0KLW1haW5SZXNwb25zaWJsZVRleHQ9XHUwNDEzXHUwNDNiXHUwNDMwXHUwNDMyXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzZVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOQ0KLW1ldGhvZFRleHQ9XHUwNDIwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM5IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0MiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1tb2RpZmllZEJ5VGV4dD1cdTA0MThcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2QNCi1tb3JlSW5mb1RleHQ9XHUwNDE0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLW5vdGF0aW9uVGV4dD1cdTA0MWRcdTA0M2VcdTA0NDJcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYNCi1vcHRpb25hbFRleHQ9XHUwNDFkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM5DQotb3V0Y29tZVRleHQ9XHUwNDE4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0DQotb3V0cHV0RnJvbVRleHQ9XHUwNDEyXHUwNDRiXHUwNDQ1XHUwNDNlXHUwNDM0IFx1MDQzOFx1MDQzNw0KLW91dHB1dHNUZXh0PVx1MDQxMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQ0Yg0KLXBhY2thZ2luZ0luc3RydWN0aW9uc1RleHQ9XHUwNDE4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQzZSBcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGUgXHUwNDNmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDMyDQotcGFja2FnaW5nR3VpZGFuY2VUZXh0PVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2ZcdTA0M2UgXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlIFx1MDQzZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzMg0KLXBlcmZvcm1pbmdSb2xlc1RleHQ9XHUwNDIwXHUwNDNlXHUwNDNiXHUwNDM4IFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzOQ0KLXByaW1hcnlQZXJmb3JtZXJUZXh0PVx1MDQxZVx1MDQ0MVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGMNCi1wcm9ibGVtVGV4dD1cdTA0MWRcdTA0MzVcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0MzBcdTA0MzRcdTA0M2FcdTA0MzANCi1wcm9wZXJ0aWVzVGV4dD1cdTA0MjFcdTA0MzJcdTA0M2VcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzANCi1wdXJwb3NlVGV4dD1cdTA0MWRcdTA0MzBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1yZWFzb25zRm9yTm90TmVlZGluZ1RleHQ9XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDQ3XHUwNDM4XHUwNDNkXHUwNDRiIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2VcdTA0NDJcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzANCi1yZWZlcmVuY2VXb3JrZmxvd3NUZXh0PVx1MDQyMVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0NDJcdTA0M2VcdTA0M2FcdTA0MzggXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5DQotcmVsYXRlZEVsZW1lbnRzVGV4dD1cdTA0MjFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiDQotcmVsYXRpb25zaGlwc1RleHQ9XHUwNDEyXHUwNDM3XHUwNDMwXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDQxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDM4DQotcmVwb3J0c1RleHQ9XHUwNDFlXHUwNDQyXHUwNDQ3XHUwNDM1XHUwNDQyXHUwNDRiDQotcmVwcmVzZW50YXRpb25PcHRpb25zVGV4dD1cdTA0MWVcdTA0M2ZcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotcmVzcG9uc2libGVUZXh0PVx1MDQxZVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOQ0KLXJlc3BvbnNpYmxlRm9yVGV4dD1cdTA0MWVcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDM3XHUwNDMwDQotcmV1c2FibGVBc3NldHNUZXh0PVx1MDQxY1x1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQ0Ylx1MDQzNSBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDFcdTA0NGINCi1yb2xlVGV4dD1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0NGMNCi1yb2xlc1RleHQ9XHUwNDIwXHUwNDNlXHUwNDNiXHUwNDM4DQotcm9sZVNldHNUZXh0PVx1MDQxZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkNCi1za2lsbHNUZXh0PVx1MDQxYVx1MDQzMlx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0Zg0KLXN0YWZmaW5nVGV4dD1cdTA0MWZcdTA0MzVcdTA0NDBcdTA0NDFcdTA0M2VcdTA0M2RcdTA0MzBcdTA0M2INCi1zdGVwc1RleHQ9XHUwNDI4XHUwNDMwXHUwNDMzXHUwNDM4DQotc3ViY2F0ZWdvcmllc1RleHQ9XHUwNDFmXHUwNDNlXHUwNDM0XHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4IA0KLXN1YmRvbWFpbnNUZXh0PVx1MDQxZlx1MDQzZVx1MDQzNFx1MDQzNFx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Yg0KLXN1YlByYWN0aWNlc1RleHQ9XHUwNDEyXHUwNDNiXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzOFx1MDQzYVx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1zdXBlclRlYW1UZXh0PVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYiBcdTA0MzFcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzkgXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDRiDQotc3VwcG9ydGluZ01hdGVyaWFsc1RleHQ9XHUwNDIxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0Yg0KLXN1YnRlYW1zVGV4dD1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIgXHUwNDMyXHUwNDNiXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZg0KLXN5bm9ueW1zVGV4dD1cdTA0MjFcdTA0MzhcdTA0M2RcdTA0M2VcdTA0M2RcdTA0MzhcdTA0M2NcdTA0NGINCi10YWlsb3JpbmdUZXh0PVx1MDQxNFx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQzYVx1MDQzMA0KLXRhc2tUZXh0PVx1MDQxN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzMA0KLXRhc2tzVGV4dD1cdTA0MTdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzgNCi10YnNUZXh0PVx1MDQyMFx1MDQzMFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2YNCi10ZWFtUHJvZmlsZVRleHQ9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiIFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0Yg0KLXRlYW1Sb2xlc1RleHQ9XHUwNDIwXHUwNDNlXHUwNDNiXHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzMCBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NGINCi10ZWNobmlxdWVzVGV4dD1cdTA0MjBcdTA0MzVcdTA0M2FcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzRcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi10ZW1wbGF0ZUZpbGVzVGV4dD1cdTA0MjRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIgXHUwNDQ4XHUwNDMwXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNkXHUwNDNlXHUwNDMyDQotdGVtcGxhdGVzVGV4dD1cdTA0MjhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2RcdTA0NGINCi10b29sTWVudG9yc1RleHQ9XHUwNDIwXHUwNDQzXHUwNDNhXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzZlx1MDQzZSBcdTA0MzhcdTA0M2RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzBcdTA0M2MNCi10b29sVGV4dD1cdTA0MThcdTA0M2RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDINCi11c2FnZVRleHQ9XHUwNDE4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1DQotd2JzVGV4dD1cdTA0MjFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NDNcdTA0NDBcdTA0MzAgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDRiDQotd2hpdGVwYXBlcnNUZXh0PVx1MDQxOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzZVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0MzFcdTA0NGVcdTA0M2JcdTA0M2JcdTA0MzVcdTA0NDJcdTA0MzVcdTA0M2RcdTA0MzgNCi13b3JrUHJvZHVjdHNUZXh0PVx1MDQyMFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGINCi13b3JrUHJvZHVjdFR5cGVzVGV4dD1cdTA0MjJcdTA0MzhcdTA0M2ZcdTA0NGIgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDQ1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQzMg0KLXdwYnNUZXh0PVx1MDQxOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwDQotd29ya0JyZWFrZG93blRleHQ9XHUwNDIxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDMwDQotd29ya2Zsb3dUZXh0PVx1MDQxZlx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQzYSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzkNCi13b3JrUHJvZHVjdEJyZWFrZG93blRleHQ9XHUwNDIxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDMwIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzANCi13b3JrUHJvZHVjdERlcGVuZGVuY2llc1RleHQ9XHUwNDE3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM4IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzANCi10ZWFtUHJvZmlsZUJyZWFrZG93blRleHQ9XHUwNDIxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDMwIFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0Yg0KLXRlYW1TdHJ1Y3R1cmVUZXh0PVx1MDQyMVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0M1x1MDQ0MFx1MDQzMCBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NGINCi1wYWdlTm90SW5zdGFsbGVkVGV4dD1cdTA0MjFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDZcdTA0MzAgXHUwNDNkXHUwNDM1IFx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzMA0KLWVsZW1lbnREb2VzTm90RXhpc3RUZXh0PVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2RcdTA0MzUgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDM1XHUwNDQyDQotaXNOb3RWYWxpZFRleHQ9XHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyLCBcdTA0M2RcdTA0MzAgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM5IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQ0Ylx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzAsIFx1MDQzZFx1MDQzNSBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDIgXHUwNDMyIFx1MDQ0N1x1MDQzOFx1MDQ0MVx1MDQzYlx1MDQzZSBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0NGJcdTA0NDUgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyIFx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQzOSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzguDQotZWxlbWVudE1pZ2h0QmVEZWxldGVkVGV4dD1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDNjXHUwNDNlXHUwNDMzIFx1MDQzMVx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzVcdTA0M2QgXHUwNDM4XHUwNDM3IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOC4NCi1wbGVhc2VGaXhMaW5rVGV4dD1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NGNcdTA0NDJcdTA0MzUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMiBcdTA0MzggXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDRjXHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQ0My4NCi1pbmZvQWJvdXRNaXNzaW5nRWxlbWVudFRleHQ9XHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZSBcdTA0M2RcdTA0MzVcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0NGVcdTA0NDlcdTA0MzVcdTA0M2MgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDM1Og0KLWVsZW1lbnROYW1lVGV4dD1cdTA0MThcdTA0M2NcdTA0NGYgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwOg0KLWd1aWRUZXh0PUdVSUQ6DQotbWlzc2luZ0VsZW1lbnRUZXh0PVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDZcdTA0MzAgXHUwNDNkXHUwNDM1IFx1MDQzZFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzMCBcdTA0MzIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotbm90QXZhaWxhYmxlVGV4dD1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQ2XHUwNDMwIFx1MDQzZFx1MDQzNSBcdTA0M2RcdTA0MzBcdTA0MzlcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzAgXHUwNDMyIFx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguIFx1MDQxNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDZcdTA0MzAgXHUwNDNjXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDQyIFx1MDQzMVx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2ZcdTA0M2RcdTA0MzAgXHUwNDMyIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzZVx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwLg0KLWVsZW1lbnRUeXBlVGV4dD1cdTA0MjJcdTA0MzhcdTA0M2YgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwOg0KLXBsdWdpbk5hbWVUZXh0PVx1MDQxOFx1MDQzY1x1MDQ0ZiBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2JcdTA0NGY6DQotcHJlZGVjZXNzb3JUZXh0PVx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0OFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzOFx1MDQzYQ0KLXBsYW5uaW5nRGF0YVRleHQ9XHUwNDE0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQzYlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLW11bHRpcGxlT2NjdXJyZW5jZXNUZXh0PVx1MDQxZFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQzZSBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzZcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzkNCi1ldmVudERyaXZlblRleHQ9XHUwNDIzXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDRmXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQ0MVx1MDQzZVx1MDQzMVx1MDQ0Ylx1MDQ0Mlx1MDQzOFx1MDQ0Zlx1MDQzY1x1MDQzOA0KLW9uZ29pbmdUZXh0PVx1MDQxMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQ0Zlx1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzOVx1MDQ0MVx1MDQ0Zg0KLXBsYW5uZWRUZXh0PVx1MDQxN1x1MDQzMFx1MDQzZlx1MDQzYlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOQ0KLXJlcGVhdGFibGVUZXh0PVx1MDQxZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Zlx1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzOVx1MDQ0MVx1MDQ0Zg0KLXVzYWdlR3VpZGFuY2VUZXh0PVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2ZcdTA0M2UgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlDQotaW5wdXRzVGV4dD1cdTA0MTJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0NGINCi1vdXRwdXRzVGV4dD1cdTA0MTJcdTA0NGJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0NGINCi1hY3Rpdml0eUVudHJ5U3RhdGVUZXh0PVx1MDQyMVx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzZVx1MDQ0Zlx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0M2RcdTA0MzAgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM1IFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLWFjdGl2aXR5RXhpdFN0YXRlVGV4dD1cdTA0MjFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NGZcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNkXHUwNDMwIFx1MDQzMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1wcmVmaXhUZXh0PVx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQ0MQ0KLWV4dGVybmFsSWRUZXh0PVx1MDQxMlx1MDQzZFx1MDQzNVx1MDQ0OFx1MDQzZFx1MDQzOFx1MDQzOSBcdTA0MThcdTA0MTQNCi1zY29wZVRleHQ9XHUwNDFlXHUwNDMxXHUwNDNiXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDRjDQotcm9hZG1hcFRleHQ9XHUwNDFmXHUwNDQzXHUwNDQyXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjDQotdHlwZW9mQ29udHJhY3RUZXh0PVx1MDQyMlx1MDQzOFx1MDQzZiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2FcdTA0NDJcdTA0MzANCi1wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzVGV4dD1cdTA0MjVcdTA0MzBcdTA0NDBcdTA0MzBcdTA0M2FcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2FcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDMwDQotcHJvamVjdE1lbWJlckV4cGVydGlzZVRleHQ9XHUwNDFhXHUwNDMyXHUwNDMwXHUwNDNiXHUwNDM4XHUwNDQ0XHUwNDM4XHUwNDNhXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIFx1MDQ0M1x1MDQ0N1x1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQzZFx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzVcdTA0M2FcdTA0NDJcdTA0MzANCi1yaXNrTGV2ZWxUZXh0PVx1MDQyMVx1MDQ0Mlx1MDQzNVx1MDQzZlx1MDQzNVx1MDQzZFx1MDQ0YyBcdTA0NDBcdTA0MzhcdTA0NDFcdTA0M2FcdTA0MzANCi1zY2FsZVRleHQ9XHUwNDFjXHUwNDMwXHUwNDQxXHUwNDQ4XHUwNDQyXHUwNDMwXHUwNDMxDQotdXNhZ2VOb3Rlc1RleHQ9XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZlx1MDQzZSBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGUNCi1jb250ZXh0VGV4dD1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDFcdTA0NDINCi1wYXJlbnRBY3Rpdml0aWVzVGV4dD1cdTA0MjBcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotaW5jbHVkZWRQYXR0ZXJuc1RleHQ9XHUwNDEyXHUwNDNhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZFx1MDQ0Yg0KLWNoZWNrbGlzdFRleHQ9XHUwNDIxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDMwXHUwNDRmIFx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQzMA0KLWNvbW11bmljYXRpb25zTWF0ZXJpYWxzVGV4dD1cdTA0MTBcdTA0M2RcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0MzhcdTA0NDdcdTA0MzVcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzUgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiDQotZWR1Y2F0aW9uTWF0ZXJpYWxzVGV4dD1cdTA0MjNcdTA0NDdcdTA0MzVcdTA0MzFcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDQxXHUwNDNlXHUwNDMxXHUwNDM4XHUwNDRmDQotZXN0aW1hdGluZ1RlY2huaXF1ZVRleHQ9XHUwNDFjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDM4XHUwNDNhXHUwNDMwIFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQzZFx1MDQzYVx1MDQzOA0KLWFkZGl0aW9uYWxUZXh0PVx1MDQxNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZQ0KLW1vZGlmaWVzVGV4dD1cdTA0MThcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDINCi1hZGRpdGlvbmFsbHlQZXJmb3Jtc1RleHQ9XHUwNDE0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlIFx1MDQzMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQ0Zlx1MDQzNVx1MDQ0Mg0KLWluZGV4VGV4dD1cdTA0MThcdTA0M2RcdTA0MzRcdTA0MzVcdTA0M2FcdTA0NDENCi1wcmVmaXhUZXh0PVx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQ0MQ0KLWJyZWFrZG93bkVsZW1lbnRUZXh0PVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NDNcdTA0NDBcdTA0NGINCi1zdGVwc1RleHQ9XHUwNDI4XHUwNDMwXHUwNDMzXHUwNDM4DQotcHJlZGVjZXNzb3JzVGV4dD1cdTA0MWZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDhcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzVcdTA0M2RcdTA0M2RcdTA0MzhcdTA0M2FcdTA0MzgNCi1yZXBlYXRhYmxlVGV4dD1cdTA0MWZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGZcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzlcdTA0NDFcdTA0NGYNCi10eXBlVGV4dD1cdTA0MjJcdTA0MzhcdTA0M2YNCi1vbmdvaW5nVGV4dD1cdTA0MTJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0NGZcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzlcdTA0NDFcdTA0NGYNCi1ldmVudERyaXZlblRleHQ9XHUwNDIzXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDRmXHUwNDM1XHUwNDNjXHUwNDRiXHUwNDM5IFx1MDQ0MVx1MDQzZVx1MDQzMVx1MDQ0Ylx1MDQ0Mlx1MDQzOFx1MDQ0Zlx1MDQzY1x1MDQzOA0KLW1vZGVsSW5mb1RleHQ9XHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZSBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzgNCi1lbnRyeVN0YXRlVGV4dD1cdTA0MjFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NGZcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNkXHUwNDMwIFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzNQ0KLWV4aXRTdGF0ZVRleHQ9XHUwNDIxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDNlXHUwNDRmXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZFx1MDQzMCBcdTA0MzJcdTA0NGJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzUNCi10ZWFtVGV4dD1cdTA0MTNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0MzANCi1wYXJlbnRQYWNrYWdlVGV4dD1cdTA0MjBcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzkgXHUwNDNmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyDQotY29udGFpbmVkUGFja2FnZXNUZXh0PVx1MDQyMVx1MDQzZVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzMFx1MDQ0OVx1MDQzOFx1MDQzNVx1MDQ0MVx1MDQ0ZiBcdTA0M2ZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDJcdTA0NGINCi1jb250ZW50c1RleHQ9XHUwNDFjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiDQotYmFzZWRPbk1ldGhvZFJvbGVUZXh0PVx1MDQxZFx1MDQzMCBcdTA0M2VcdTA0NDFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzUgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLWJhc2VkT25NZXRob2RUYXNrVGV4dD1cdTA0MWRcdTA0MzAgXHUwNDNlXHUwNDQxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM1IFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1iYXNlZE9uTWV0aG9kV29ya1Byb2R1Y3RUZXh0PVx1MDQxZFx1MDQzMCBcdTA0M2VcdTA0NDFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1zdW1tYXJ5VGV4dD1cdTA0MjFcdTA0MzJcdTA0M2VcdTA0MzRcdTA0M2FcdTA0MzANCi1wZXJmb3Jtc1RleHQ9XHUwNDEyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDRmXHUwNDM1XHUwNDQyDQotcmVwbGFjZXNUZXh0PVx1MDQxN1x1MDQzMFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Zlx1MDQzNVx1MDQ0Mg0KLWNvbnRyaWJ1dGVzVGV4dD1cdTA0MTRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDINCi1ub25lVGV4dD1cdTA0MWRcdTA0MzVcdTA0NDINCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNUZXh0PVx1MDQyMFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0M2UgXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDNkXHUwNDNhXHUwNDM1DQotYWN0aXZpdHlSZWZlcmVuY2VzVGV4dD1cdTA0MjFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzggXHUwNDNkXHUwNDMwIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLW5hbWVUZXh0PVx1MDQxOFx1MDQzY1x1MDQ0Zg0KLXByZXNlbnRhdGlvbk5hbWVUZXh0PVx1MDQxOFx1MDQzY1x1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMi9wbHVnaW5fcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNmZkMWMzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1cdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzAgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YjI0NmRkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXNfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi11bmtub3duX3RleHQ9XHUwNDFkXHUwNDM1XHUwNDM4XHUwNDM3XHUwNDMyXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDNkXHUwNDNlDQotDQotIyBFcnJvciBSZWFzb25zDQotZW1wdHlMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1cdTA0MWZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDNmXHUwNDQzXHUwNDQyXHUwNDRjIFx1MDQzYSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzUgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLg0KLW1pc3NpbmdMaWJyYXJ5RmlsZUVycm9yX3JlYXNvbj1cdTA0MWVcdTA0NDJcdTA0NDFcdTA0NDNcdTA0NDJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzOCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLg0KLXVucmVzb2x2ZWRQcm94eUVycm9yX3JlYXNvbj1cdTA0MTIgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzNSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDRjIFx1MDQzZFx1MDQzNVx1MDQzZVx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzggXHUwNDNkXHUwNDMwIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0Yi4gXHUwNDFlXHUwNDMxXHUwNDRiXHUwNDQ3XHUwNDNkXHUwNDNlIFx1MDQ0ZFx1MDQ0Mlx1MDQzZSBcdTA0MzJcdTA0NGJcdTA0MzdcdTA0MzJcdTA0MzBcdTA0M2RcdTA0M2UgXHUwNDNlXHUwNDQyXHUwNDQxXHUwNDQzXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM4XHUwNDM1XHUwNDNjIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0M2RcdTA0MzVcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0M2MgXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1XHUwNDNjIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzZVx1MDQzMiBYTUkgXHUwNDMyIFx1MDQzZlx1MDQzMFx1MDQzZlx1MDQzYVx1MDQzNSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzguIFxuXG5cdTA0MTdcdTA0MzBcdTA0M2FcdTA0NDBcdTA0M2VcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDRkXHUwNDQyXHUwNDNlIFx1MDQzZVx1MDQzYVx1MDQzZFx1MDQzZSBcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQzZVx1MDQzZVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2VcdTA0MzEgXHUwNDNlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwXHUwNDQ1IFx1MDQzMiBcdTA0M2ZcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2JcdTA0MzggXHUwNDFkXHUwNDM1XHUwNDNmXHUwNDNlXHUwNDNiXHUwNDMwXHUwNDM0XHUwNDNhXHUwNDM4LiBcdTA0MTJcdTA0M2UgXHUwNDM4XHUwNDM3XHUwNDMxXHUwNDM1XHUwNDM2XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0MFx1MDQzNVx1MDQzNlx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDQwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDQzXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQ0MVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0NDFcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzY1x1MDQzOCBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzQgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmXHUwNDNjXHUwNDM4IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOC4NCi0NCi0jIFdhcm5pbmcgTWVzc2FnZXMNCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cxPUlVUEwwMDA3VzogXHUwNDEyIFx1MDQzZVx1MDQzNFx1MDQzZFx1MDQzZVx1MDQzYyBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDNkXHUwNDM1XHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDM4XHUwNDQ1IFx1MDQzNFx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQ0MFx1MDQzZFx1MDQzOFx1MDQ0NSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzBcdTA0NDUgXHUwNDNkXHUwNDM1IFx1MDQ0NVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2VcdTA0M2ENCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cyPUlVUEwwMDA4VzogXHUwNDFkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDNjXHUwNDNlIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NGRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlXHUwNDQyXHUwNDQxXHUwNDQzXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDQ1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzZVx1MDQzYQ0KLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzM9SVVQTDAwMDlXOiBcdTA0MmRcdTA0NDJcdTA0M2VcdTA0NDIgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2RcdTA0MzAgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQzMiBcdTA0M2RcdTA0MzVcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0M2MgXHUwNDNmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyXHUwNDM1DQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWxvYWRSZXNvdXJjZXNFcnJvcl9tc2c9SVVQTDAwMDBFOiBcdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzMVx1MDQ0Ylx1MDQzYlx1MDQzMCBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzAgXHUwNDQxIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMFx1MDQzY1x1MDQzOC4NCi11bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX21zZz1JVVBMMDAwMUU6IFx1MDQxNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzNSBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNkXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDM3XHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2EgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDNlXHUwNDNjXHUwNDQzIFx1MDQ0Mlx1MDQzOFx1MDQzZlx1MDQ0My4NCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDJFOiBcdTA0MTRcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZFx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNhIFx1MDQ0Nlx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzY1x1MDQ0MyBcdTA0NDJcdTA0MzhcdTA0M2ZcdTA0NDMuDQotc2F2ZUNvbnZlcnRlZEd1aWRhbmNlRXJyb3JfbXNnPUlVUEwwMDAzRTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0NDFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDM1IFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSAnJ3swfScnLg0KLQ0KLSMgQ29udmVydCBhY3Rpdml0eQ0KLWNvbnZlcnRBY3Rpdml0eUVycm9yX3RpdGxlPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDQyXHUwNDM4XHUwNDNmXHUwNDMwIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLWNvbnZlcnRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwNkU6IFx1MDQyZFx1MDQ0Mlx1MDQzMCBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDNkXHUwNDM1IFx1MDQzY1x1MDQzZVx1MDQzNlx1MDQzNVx1MDQ0MiBcdTA0MzFcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDMwIFx1MDQzMiBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDQyXHUwNDM4XHUwNDNmLg0KLXNhdmVDb252ZXJ0ZWRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwN0U6IFx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NGMgXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgJyd7MH0nJy4NCi0NCi0jIEVycm9yIFJlYXNvbnMNCi1lcnJvcl9yZWFzb249SVVQTDAwMDRFOiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzhcdTA0MzdcdTA0M2VcdTA0NDhcdTA0M2JcdTA0MzAgXHUwNDNlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwLiBcdTA0MTRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDQzXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IE9LLg0KLXVuc3VwcG9ydGVkR3VpZGFuY2VUeXBlRXJyb3JfcmVhc29uPVx1MDQxNFx1MDQzYlx1MDQ0ZiB7MH0gXHUwNDNkXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzZVx1MDQzMlx1MDQzY1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQ0Ylx1MDQ0NSBcdTA0NDJcdTA0MzhcdTA0M2ZcdTA0M2VcdTA0MzIgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM5Lg0KLWludmFsaWRMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1cdTA0MWRcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQzXHUwNDQyXHUwNDRjIFx1MDQzYSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzUuIFx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NGMgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYiAucHJvamVjdC4NCi1jb3VsZE5vdExvY2tMaWJyYXJ5X3JlYXNvbj1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzN1x1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzYVx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMuDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWNvcHlpbmdBdHRhY2htZW50c1Rhc2tfbmFtZT1cdTA0MWFcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDMyXHUwNDNiXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM5Li4uDQotDQotIyBDb252ZXJ0IEd1aWRhbmNlIERpYWxvZw0KLWNvbnZlcnRHdWlkYW5jZURpYWxvZ190aXRsZT1cdTA0MWZcdTA0NDBcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQyXHUwNDM4XHUwNDNmIFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLWNvbnZlcnRHdWlkYW5jZURpYWxvZ190ZXh0PVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDZcdTA0MzVcdTA0M2JcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzkgXHUwNDQyXHUwNDM4XHUwNDNmIFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi0NCi0jIEd1aWRhbmNlIHR5cGUgbmFtZXMgZm9yIENvbnZlcnQgR3VpZGFuY2UgRGlhbG9nIC0gc2hvdWxkIGJlIHJlZmFjdG9yZWQgaW50byBsaWJyYXJ5LnVpDQotY2hlY2tsaXN0X3RleHQ9XHUwNDIxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDMwXHUwNDRmIFx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQzMA0KLWNvbmNlcHRfdGV4dD1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDZcdTA0MzVcdTA0M2ZcdTA0NDZcdTA0MzhcdTA0NGYNCi1leGFtcGxlX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDQwDQotZ3VpZGVsaW5lX3RleHQ9XHUwNDIwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmDQotZXN0aW1hdGVfdGV4dD1cdTA0MWVcdTA0NDZcdTA0MzVcdTA0M2RcdTA0M2FcdTA0MzANCi1lc3RpbWF0aW5nTWV0cmljX3RleHQ9XHUwNDFmXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjIFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQzZFx1MDQzYVx1MDQzOA0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0PVx1MDQyMFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0M2UgXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDNkXHUwNDNhXHUwNDM1DQotcmVwb3J0X3RleHQ9XHUwNDFlXHUwNDQyXHUwNDQ3XHUwNDM1XHUwNDQyDQotdGVtcGxhdGVfdGV4dD1cdTA0MjhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2QNCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dD1cdTA0MjFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiDQotdG9vbE1lbnRvcl90ZXh0PVx1MDQyMFx1MDQ0M1x1MDQzYVx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzZSBcdTA0M2ZcdTA0M2UgXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDQzDQotd2hpdGVwYXBlcl90ZXh0PVx1MDQxOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzZVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0MzFcdTA0NGVcdTA0M2JcdTA0M2JcdTA0MzVcdTA0NDJcdTA0MzVcdTA0M2RcdTA0NGMNCi10ZXJtRGVmaW5pdGlvbl90ZXh0PVx1MDQxZVx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0M2NcdTA0MzhcdTA0M2RcdTA0MzANCi1wcmFjdGljZV90ZXh0PVx1MDQxZlx1MDQ0MFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzOFx1MDQzYVx1MDQzMCBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1yZXVzYWJsZUFzc2V0X3RleHQ9XHUwNDFjXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM5IFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MQ0KLQ0KLSNhY3Rpdml0eSBicmVha2Rvd24gaW5mbyBzdHJpbmdzDQotQWN0aXZpdHlMYXlvdXRfcHJpbWFyeVRhc2tzX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDRmXHUwNDM1XHUwNDQyIFx1MDQzYVx1MDQzMFx1MDQzYSBcdTA0MzJcdTA0M2JcdTA0MzBcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0NDYNCi1BY3Rpdml0eUxheW91dF9hZGRpdGlvbmFsVGFza3NfdGV4dD1cdTA0MTJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDIgXHUwNDNhXHUwNDMwXHUwNDNhIFx1MDQzNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0M1x1MDQ0ZQ0KLQ0KLQ0KLSMgQ29udmVydCBHdWlkYW5jZSBFcnJvciBNZXNzYWdlcw0KLWNvbnZlcnRHdWlkYW5jZUVycm9yX3RpdGxlPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDQyXHUwNDM4XHUwNDNmXHUwNDMwIFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLQ0KLSMgTG9hZCBSZXNvdXJjZXMgRXJyb3IgRGlhbG9nDQotbG9hZFJlc291cmNlc0Vycm9yX3RpdGxlPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzggXHUwNDNlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDM4XHUwNDM4IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1sb2FkUmVzb3VyY2VzRXJyb3JfcmVhc29uPVx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NGMgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzNSBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDFcdTA0NGIgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4LlxuXG5cdTA0MWRcdTA0MzBcdTA0MzZcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNkXHUwNDNlXHUwNDNmXHUwNDNhXHUwNDQzIFx1MDQyMVx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiwgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2VcdTA0MzEgXHUwNDNlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDMwXHUwNDQ1IFx1MDQzOCBcdTA0NDNcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDM4IFx1MDQzNFx1MDQzZSBcdTA0MzJcdTA0M2RcdTA0MzVcdTA0NDFcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDM1XHUwNDM5XHUwNDQ4XHUwNDM4XHUwNDQ1IFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOSBcdTA0MzIgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzLg0KLQ0KLSMgUm9sZSBEaWFncmFtcw0KLXJvbGVEaWFncmFtUGVyZm9ybXNfdGV4dD1cdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDINCi1yb2xlRGlhZ3JhbVJlc3BvbnNpYmxlRm9yX3RleHQ9XHUwNDNlXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQ3XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzN1x1MDQzMA0KLQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzA9XHUwNDIxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MjogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMT1cdTA0MThcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGY6IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzQ9XHUwNDFmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQzXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1OiB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0c3PVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMDogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTA9XHUwNDFlXHUwNDQyXHUwNDQxXHUwNDQzXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTE9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0M2RcdTA0MzBcdTA0MzlcdTA0NDJcdTA0MzggXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzNFx1MDQzYlx1MDQ0ZiBHVUlEIHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEyPVx1MDQyNFx1MDQzMFx1MDQzOVx1MDQzYiAnJ3swfScnIFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2RcdTA0MzAgXHUwNDNlXHUwNDQyXHUwNDQxXHUwNDQzXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM5IFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MSAnJ3sxfScnDQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTU9XHUwNDNlXHUwNDQyXHUwNDQxXHUwNDQzXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDM1XHUwNDQyIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYiBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M2VcdTA0MzIgJyd7MH0nJw0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE3PVx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDNhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDRjXHUwNDQxXHUwNDRmIFx1MDQzYSB1cmwgJyd7MH0nJw0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE5PVx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDNhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDRjXHUwNDQxXHUwNDRmIFx1MDQzYSB1cmwgJyd7MH0nJzogezF9DQotSW1wb3J0RXhwb3J0VXRpbF9NU0c4PVx1MDQyNFx1MDQzMFx1MDQzOVx1MDQzYiAnJ3swfScnIFx1MDQzZFx1MDQzNSBcdTA0M2RcdTA0MzBcdTA0MzlcdTA0MzRcdTA0MzVcdTA0M2QuDQotSW1wb3J0RXhwb3J0VXRpbF9NU0c5PVx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0MFx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzMgJyd7MH0nJy4NCi11bmtub3duR3VpZGFuY2VfdGV4dD1cdTA0MWRcdTA0MzVcdTA0MzhcdTA0MzdcdTA0MzJcdTA0MzVcdTA0NDFcdTA0NDJcdTA0M2RcdTA0M2UNCi0NCi1Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uX2xvZ19ub0NvbnRlbnRQYXRoPUNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24uSGFuZGxlQXR0YWNobWVudHNQbHVnaW46IFx1MDQzZFx1MDQzNVx1MDQ0MiBjb250ZW50UGF0aCBcdTA0MzRcdTA0M2JcdTA0NGYgezB9DQotTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlcl9jYW5ub3RVcGRhdGU9SVVQTDAwMDZXOiBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyB7MH0gezF9DQotd2FybmluZ0RsZ190aXRsZT1cdTA0MWZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDNcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzZcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1lcnJvckRsZ190aXRsZT1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzANCi1lcnJvckRsZ19zYXZlRXJyb3I9SVVQTDAwMDVFOiBcdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOCBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzkgXHUwNDMyIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzNSAnJ3swfScnDQotDQotIyBhY3Rpdml0eSBkaWFncmFtIG5hbWVzDQotYWN0aXZpdHlEaWFncmFtTmFtZT1cdTA0MTRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0MzAgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5OiB7MH0NCi1hY3Rpdml0eURldGFpbERpYWdyYW1OYW1lPVx1MDQxNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQzMCBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzkgXHUwNDNlXHUwNDMxIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0Zlx1MDQ0NTogezB9DQotd3BEZXBlbmRlbmN5RGlhZ3JhbU5hbWU9XHUwNDE0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzOSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwOiB7MH0NCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBSb2xlIGRpYWdyYW0gZm9udHMgYW5kIGxheW91dA0KLXJvbGVEaWFncmFtRm9udF9uYW1lPUFyaWFsDQotcm9sZURpYWdyYW1Gb250X25hbWVfd2luMzI9QXJpYWwNCi1yb2xlRGlhZ3JhbUZvbnRfc2l6ZT0xMA0KLXJvbGVEaWFncmFtRm9udF9zaXplX3dpbjMyPTEwDQotcm9sZURpYWdyYW1feE1hcmdpbj0yMDANCi1yb2xlRGlhZ3JhbV94U3BhY2luZz03MA0KLXJvbGVEaWFncmFtX3lTcGFjaW5nPTMwDQotDQotIyBsb2NhbGl6ZSB0aGUgdmFsdWUgYmFzZWQgb24gbG9jYWxlLiAgZm9yIGV4YW1wbGUsIA0KLSMgZm9yIEVuZ2xpc2gsIHRoZSB2YWx1ZSBpcyAiLiAiDQotI2NvbG9uX3dpdGhfc3BhY2U9OiANCi0jIGZvciBmcmVuY2gsIHRoZSB2YWx1ZSBpcyAiIC4gIiwgeW91IG5lZWQgdG8gdXNlIGEgXCB0byBwcmVzZXJ2ZSB0aGUgbGVhZGluZyBzcGFjZQ0KLSNjb2xvbl93aXRoX3NwYWNlPVwgOiANCi0jIGZvciBjaGluZXNlLCB0aGUgY29sb24gc2hvdWxkIGJlIGRvdWJsZSBieXRlcw0KLSMgRG9udCB0cmltIHRoZSBzcGFjZXMgYWZ0ZXIgdGhlIGNvbG9uLg0KLWNvbG9uX3dpdGhfc3BhY2U9OiANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDJhLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDJhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjE2NTMyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWViYmE2NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc3BhdGg6IG5sMmEuamFyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGZyYWdtZW50Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjRhNTI2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UubmwyYS5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMmEuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IG5sMmEuamFyLFwNCi0gICAgICAgICAgICAgICBsYXlvdXQvLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDJhL2ZyYWdtZW50LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEvZnJhZ21lbnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzFkMmExNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEvZnJhZ21lbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZnJhZ21lbnROYW1lPUVQRiBDb21wb3NlciBMaWJyYXJ5IChOTDJhKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9kYS5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS9sYXlvdXQvc2NyaXB0cy9jb250ZW50cGFnZV9kYS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2E0M2E2Yy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEvbGF5b3V0L3NjcmlwdHMvY29udGVudHBhZ2VfZGEuanMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotdmFyIGNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQgPSBmYWxzZTsNCi12YXIgZmlyc3RTZWN0aW9uOw0KLXZhciBleHBhbmRJbWFnZTsNCi12YXIgY29sbGFwc2VJbWFnZTsNCi12YXIgZXhwYW5kQWxsSW1hZ2U7DQotdmFyIGNvbGxhcHNlQWxsSW1hZ2U7DQotdmFyIGJhY2tUb1RvcEltYWdlOw0KLXZhciBzaGltSW1hZ2U7DQotdmFyIGV4cGFuZE1lc3NhZ2UgPSAiVWR2aWQgYWxsZSBhZnNuaXQiOw0KLXZhciBjb2xsYXBzZU1lc3NhZ2UgPSAiU2tqdWwgYWxsZSBhZnNuaXQiOw0KLXZhciBiYWNrTWVzc2FnZSA9ICJUaWxiYWdlIHRpbCB0b3AiOw0KLQ0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHNlY3Rpb24gbGlua3MuDQotZnVuY3Rpb24gY3JlYXRlU2VjdGlvbkxpbmtzKHRhZ05hbWUsIGNsYXNzU2VsZWN0b3IsIGltZ1BhdGgpIHsNCi0JZXhwYW5kSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZC5naWYnOwkNCi0JY29sbGFwc2VJbWFnZSA9IGltZ1BhdGggKyAnY29sbGFwc2UuZ2lmJzsNCi0JZXhwYW5kQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2V4cGFuZF9hbGwuZ2lmJzsJDQotCWNvbGxhcHNlQWxsSW1hZ2UgPSBpbWdQYXRoICsgJ2NvbGxhcHNlX2FsbC5naWYnOw0KLQliYWNrVG9Ub3BJbWFnZSA9IGltZ1BhdGggKyAnYmFja190b190b3AuZ2lmJzsNCi0Jc2hpbUltYWdlID0gaW1nUGF0aCArICdzaGltLmdpZic7DQotCQ0KLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsNCi0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOw0KLQkJdmFyIHNlY3Rpb25FbGVtZW50cyA9IG5ldyBBcnJheShlbGVtZW50cy5sZW5ndGgpOw0KLQkJdmFyIHRvdGFsTGlua3MgPSAwOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07DQotCQkJaWYgKGVsZW1lbnQuY2xhc3NOYW1lID09IGNsYXNzU2VsZWN0b3IpIHsNCi0JCQkJc2VjdGlvbkVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50Ow0KLQkJCX0NCi0JCX0NCi0JCXNlY3Rpb25FbGVtZW50cy5sZW5ndGggPSB0b3RhbExpbmtzOw0KLQkJc2VjdGlvbkNvbGxhcHNlRGl2cyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOw0KLQkJZmlyc3RTZWN0aW9uID0gc2VjdGlvbkVsZW1lbnRzWzBdOw0KLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uRWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IHNlY3Rpb25FbGVtZW50c1tpXTsNCi0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsNCi0JCQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoc2libGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSAmJiBzaWJsaW5nQ29udGFpbmVyLnN0eWxlKSB7CQ0KLQkJCQl2YXIgbmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHRTaWJsaW5nOw0KLQkJCQllbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNpYmxpbmdDb250YWluZXIsIG5leHRTaWJsaW5nKTsNCi0JCQkJdmFyIG5leHRFbGVtZW50ID0gc2VjdGlvbkVsZW1lbnRzW2kgKyAxXTsNCi0JCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG5leHRFbGVtZW50ICYmIG5leHRTaWJsaW5nICE9IG51bGwgJiYgbmV4dFNpYmxpbmcuY2xhc3NOYW1lICE9ICdjb3B5cmlnaHQnKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVNlY3Rpb25zQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2VjdGlvbkNvbGxhcHNlRGl2c1tpXSA9IHNpYmxpbmdDb250YWluZXI7DQotICAgIAkJCWNyZWF0ZUNvbGxhcHNpYmxlU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3Moc2VjdGlvbkVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc2VjdGlvbi4NCi1mdW5jdGlvbiBjcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCS8vIEFkZCBhIHNwYWNpbmcgYmV0d2VlbiB0aGUgc2VjdGlvbnMuDQotCQl2YXIgc2VjdGlvblNlcGFyYXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJc2VjdGlvblNlcGFyYXRvci5zcmMgPSBzaGltSW1hZ2U7DQotCQlzZWN0aW9uU2VwYXJhdG9yLmhlaWdodCA9ICczJzsNCi0JCXNlY3Rpb25TZXBhcmF0b3IuYm9yZGVyID0gJzAnOw0KLQkJc2VjdGlvblNlcGFyYXRvci5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzZWN0aW9uU2VwYXJhdG9yLCBlbGVtZW50KTsNCi0JCQ0KLQkJLy8gQWRkIGEgZXhwYW5kL2NvbGxhcHNlIGxpbmsgdG8gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTZWN0aW9uOw0KLQkJc2VjdGlvbkNvbGxhcHNlTGlua3NbaW5kZXhdID0gbGluazsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQobGluayk7DQotCQllbGVtZW50Lmluc2VydEJlZm9yZShzcGFuLCBlbGVtZW50LmZpcnN0Q2hpbGQpOw0KLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotICAgIAkNCi0JCS8vIEFkZCBhIEJhY2sgVG8gVG9wIGxpbmsgaW4gdGhlIHNlY3Rpb24gaGVhZGluZy4NCi0JCWNyZWF0ZUJhY2tUb1RvcExpbmsoc2libGluZ0NvbnRhaW5lcik7DQotCX0NCi19DQotDQotLy8gQ3JlYXRlcyBhIEJhY2sgdG8gdG9wIGxpbmsuDQotZnVuY3Rpb24gY3JlYXRlQmFja1RvVG9wTGluayhlbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQ0KLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKSB7DQotCQlkaXYuY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gYmFja1RvVG9wSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQotCQlzcGFuLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYmFja01lc3NhZ2UpKTsJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZGl2KTsNCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHNlY3Rpb24gYmFzZWQgb24gdGhlIHJlY2VpdmVkIGV2ZW50Lg0KLWZ1bmN0aW9uIGV4cGFuZENvbGxhcHNlU2VjdGlvbihldnQpIHsNCi0JaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQllbHNlIHsNCi0JCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBjb2xsYXBzZUltYWdlOw0KLQl9DQotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7DQotCQlldnQucHJldmVudERlZmF1bHQoKTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgdGhlIEV4cGFuZCBBbGwgYW5kIENvbGxhcHNlIEFsbCBTZWN0aW9ucyBsaW5rcy4NCi1mdW5jdGlvbiBjcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFNlY3Rpb25zTGlua3MoZmlyc3RFbGVtZW50KSB7DQotCXZhciBkaXY7DQotCQkNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaW1hZ2Uuc3JjID0gZXhwYW5kQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQ0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGw7DQotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGV4cGFuZE1lc3NhZ2UpKTsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7DQotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7CQkJCQkJDQotCQkNCi0JCWltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBjb2xsYXBzZUFsbEltYWdlOw0KLQkJaW1hZ2Uud2lkdGggPSAnMTYnOw0KLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsNCi0JCWltYWdlLmJvcmRlciA9ICcwJzsNCi0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7DQotCQlsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gY29sbGFwc2VBbGw7DQotCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29sbGFwc2VNZXNzYWdlKSk7CQkJCQ0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJLyoNCi0JCXZhciBvdmVydmlld1NlcGFyYXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdmVydmlld1NlcGFyYXRvciIpOw0KLQkJb3ZlcnZpZXdTZXBhcmF0b3IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBvdmVydmlld1NlcGFyYXRvcik7DQotCQkqLw0KLQkJaWYgKGZpcnN0U2VjdGlvbiAhPSBudWxsKSB7DQotCQkJZmlyc3RTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTZWN0aW9uKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0vLyBFeHBhbmRzIGFsbCBzZWN0aW9ucy4NCi1mdW5jdGlvbiBleHBhbmRBbGwoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHNlY3Rpb25zLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsKGV2dCkgew0KLQlmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JCXNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCXNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gZXhwYW5kSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gVGhpcyB0ZW1wb3JhcnkgZnVuY3Rpb24gaGVscHMgdG8gcmVzb2x2ZSBKYXZhc2NyaXB0IGVycm9ycyBpbiB0aGUgbWlncmF0ZWQgUlVQDQotLy8gY29udGVudCBwYWdlcy4gSXQgd2lsbCBiZSByZW1vdmVkIG9uY2UgdGhlIGNvcnJlc3BvbmRpbmcgLmpzIGZpbGVzIGFyZSBiZWluZw0KLS8vIG1pZ3JhdGVkIGFsb25nIHdpdGggdGhlIEhUTUwgY29udGVudCBwYWdlcy4NCi1mdW5jdGlvbiBSZWZlcmVuY2VIZWxwVG9waWMgKHRvcGljTmFtZSwgYm9vayAsIGZpbGVOYW1lKSB7DQotICAgZG9jdW1lbnQud3JpdGUoIjxpPiIrIHRvcGljTmFtZSArICI8XC9pPiIpOw0KLX0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEvbGF5b3V0L3NjcmlwdHMvc3RlcHNfZGEuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEvbGF5b3V0L3NjcmlwdHMvc3RlcHNfZGEuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0YmZjNjIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDJhL2xheW91dC9zY3JpcHRzL3N0ZXBzX2RhLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLXZhciBjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0ID0gdHJ1ZTsNCi12YXIgc3RlcEltZ0JhY2tQYXRoID0gJy4uLy4uLyc7DQotdmFyIGV4cGFuZEFsbFRleHQgPSAiVWR2aWQgYWxsZSB0cmluIjsNCi12YXIgY29sbGFwc2VBbGxUZXh0ID0gIlNranVsIGFsbGUgdHJpbiI7DQotdmFyIGZpcnN0U3RlcFNlY3Rpb247DQotDQotLy8gQ3JlYXRlcyB0aGUgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZVN0ZXBMaW5rcyh0YWdOYW1lLCBjbGFzc1NlbGVjdG9yKSB7DQotCWlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkgew0KLQkJdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7DQotCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDApIHJldHVybjsNCi0JCXZhciBzdGVwRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsNCi0JCXZhciB0b3RhbExpbmtzID0gMDsNCi0JCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOw0KLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7DQotCQkJCXN0ZXBFbGVtZW50c1t0b3RhbExpbmtzKytdID0gZWxlbWVudDsNCi0JCQl9DQotCQl9DQotCQlpZiAodG90YWxMaW5rcyA9PSAwKSByZXR1cm47DQotCQlzdGVwRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsNCi0JCXN0ZXBDb2xsYXBzZURpdnMgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7DQotCQlzdGVwQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsNCi0JCWZpcnN0U3RlcFNlY3Rpb24gPSBzdGVwRWxlbWVudHNbMF07DQotCQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBFbGVtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCXZhciBlbGVtZW50ID0gc3RlcEVsZW1lbnRzW2ldOw0KLQkJCXZhciBzaWJsaW5nQ29udGFpbmVyOw0KLQkJCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChzaWJsaW5nQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpICYmIHNpYmxpbmdDb250YWluZXIuc3R5bGUpIHsNCi0JCQkJdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0U2libGluZzsNCi0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7DQotCQkJCXZhciBuZXh0RWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpICsgMV07DQotCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBuZXh0RWxlbWVudCAmJiBuZXh0U2libGluZyAhPSBudWxsKSB7DQotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7DQotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOw0KLQkJCQkJc2libGluZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0b01vdmUpOw0KLQkJCQl9DQotCQkJCWlmIChjb2xsYXBzZVN0ZXBzQnlEZWZhdWx0KSB7DQotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotICAgIAkJCX0NCi0gICAgCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLSAgICAJCQlzdGVwQ29sbGFwc2VEaXZzW2ldID0gc2libGluZ0NvbnRhaW5lcjsNCi0gICAgCQkJY3JlYXRlQ29sbGFwc2libGVTdGVwU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQljcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFN0ZXBzTGlua3Moc3RlcEVsZW1lbnRzWzBdKTsNCi0JfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uLg0KLWZ1bmN0aW9uIGNyZWF0ZUNvbGxhcHNpYmxlU3RlcFNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgpIHsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsNCi0JCWxpbmsuaHJlZiA9ICcjJzsNCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KLQkJaWYgKGNvbGxhcHNlU3RlcHNCeURlZmF1bHQpIHsNCi0JCQlpbWFnZS5zcmMgPSBleHBhbmRJbWFnZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWltYWdlLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCQl9DQotCQlpbWFnZS53aWR0aCA9ICcxNyc7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOw0KLQkJbGluay5vbmNsaWNrID0gZXhwYW5kQ29sbGFwc2VTdGVwU2VjdGlvbjsNCi0JCXN0ZXBDb2xsYXBzZUxpbmtzW2luZGV4XSA9IGxpbms7DQotCQlzcGFuLmFwcGVuZENoaWxkKGxpbmspOw0KLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsNCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7DQotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOw0KLQl9DQotfQ0KLQ0KLS8vIEV4cGFuZHMgb3IgY29sbGFwc2VzIGEgc3RlcCBzZWN0aW9uIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBldmVudC4NCi1mdW5jdGlvbiBleHBhbmRDb2xsYXBzZVN0ZXBTZWN0aW9uKGV2dCkgew0KLQlpZiAodGhpcy5jb2xsYXBzZURpdi5zdHlsZS5kaXNwbGF5ID09ICcnKSB7DQotCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGV4cGFuZEltYWdlOw0KLQl9DQotCWVsc2Ugew0KLQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCX0NCi0JaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsNCi0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLy8gQ3JlYXRlcyB0aGUgRXhwYW5kIEFsbCBhbmQgQ29sbGFwc2UgQWxsIFN0ZXBzIGxpbmtzLg0KLWZ1bmN0aW9uIGNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU3RlcHNMaW5rcyhmaXJzdEVsZW1lbnQpIHsNCi0JdmFyIGRpdjsNCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgew0KLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsJCQ0KLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7DQotCQlpbWFnZS5zcmMgPSBleHBhbmRBbGxJbWFnZTsNCi0JCWltYWdlLndpZHRoID0gJzE2JzsNCi0JCWltYWdlLmhlaWdodCA9ICcxNic7DQotCQlpbWFnZS5ib3JkZXIgPSAnMCc7DQotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOw0KLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBleHBhbmRBbGxTdGVwczsNCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsNCi0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZXhwYW5kQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsNCi0JCQ0KLQkJaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCi0JCWltYWdlLnNyYyA9IGNvbGxhcHNlQWxsSW1hZ2U7DQotCQlpbWFnZS53aWR0aCA9ICcxNic7DQotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOw0KLQkJaW1hZ2UuYm9yZGVyID0gJzAnOw0KLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsNCi0JCWxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOw0KLQkJbGluay5ocmVmID0gJyMnOw0KLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7DQotCQlsaW5rLm9uY2xpY2sgPSBjb2xsYXBzZUFsbFN0ZXBzOw0KLQkJc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCi0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7DQotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbGxhcHNlQWxsVGV4dCkpOw0KLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsNCi0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsNCi0JCQ0KLQkJaWYgKGZpcnN0U3RlcFNlY3Rpb24pIHsNCi0JCQlmaXJzdFN0ZXBTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZmlyc3RTdGVwU2VjdGlvbik7DQotCQl9DQotCX0NCi19DQotDQotLy8gRXhwYW5kcyBhbGwgc3RlcHMuDQotZnVuY3Rpb24gZXhwYW5kQWxsU3RlcHMoZXZ0KSB7DQotCSBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBDb2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsNCi0JIAlzdGVwQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JIAlzdGVwQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IGNvbGxhcHNlSW1hZ2U7DQotCSB9DQotCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkgfQ0KLQkgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBDb2xsYXBzZXMgYWxsIHN0ZXBzLg0KLWZ1bmN0aW9uIGNvbGxhcHNlQWxsU3RlcHMoZXZ0KSB7DQotCWZvciAodmFyIGkgPSAwOyBpIDwgc3RlcENvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgew0KLQkJc3RlcENvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBleHBhbmRJbWFnZTsNCi0JfQ0KLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgew0KLQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfZGEuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEvbGF5b3V0L3NjcmlwdHMvdHJlZWJyb3dzZXJfZGEuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhNDU0NzguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDJhL2xheW91dC9zY3JpcHRzL3RyZWVicm93c2VyX2RhLmpzCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLy8gSGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMSA9ICJLb25maWd1cmF0aW9uIGVyIGFsbGVyZWRlIHZpc3QgaSBvdmVyc2lndGVyIjsNCi12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTIgPSAiVmlzIG92ZXJzaWd0ZXIiOw0KLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMyA9ICJIamVtIjsNCi0NCi1mdW5jdGlvbiBsb2FkVG9wKCkNCi17DQotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiAocGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIgfHwgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvY19mcmFtZSIpICkNCi0gIHsNCi0gICAgIGFsZXJ0KHRyZWVicm93c2VyX2pzX01FU1NBR0UxKTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOw0KLSAgICBleHBpcmVzLnNldFRpbWUgKGV4cGlyZXMuZ2V0VGltZSgpICsgKDEwMDAgKiAyMCkpOw0KLSAgICBkb2N1bWVudC5jb29raWUgPSAicnVwX29yeV9kb2M9IiArIGVzY2FwZSAoZG9jdW1lbnQuVVJMKSArDQotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOw0KLSAgICAJDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotCXZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOyANCi0JaWYgKCAgbWFpbkluZGV4X2EgIT0gbnVsbCApIHsgDQotICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBtYWluSW5kZXhfYS5pdGVtKDApLmhyZWY7IA0KLQl9IA0KLQ0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpDQotICAgIHsNCi0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQ0KLQl7DQotCQl3aW5kb3cuY2xvc2UoKTsNCi0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsJCQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsNCi0JfQ0KLSAgICB9DQotICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBnZXRJbWFnZVVybChpbWFnZSkNCi17DQotICAgIHZhciBuZXdfb3J5X2RvY19sb2M9bnVsbDsgICAgDQotICAgIHZhciBtYWluSW5kZXhfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtYWluSW5kZXgiKTsgDQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZi5zdWJzdHJpbmcoMCxtYWluSW5kZXhfYS5pdGVtKDApLmhyZWYubGFzdEluZGV4T2YoIi8iKSk7DQotICAgIG5ld19vcnlfZG9jX2xvYyA9IG5ld19vcnlfZG9jX2xvYyArICIiICsgaW1hZ2U7DQotICAgIHJldHVybiBuZXdfb3J5X2RvY19sb2M7ICAgIA0KLX0NCi0NCi1NU0ZQaG92ZXIgPQ0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwNCi0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOw0KLQ0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQ0KLSAgew0KLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7DQotICAgICBhLnNyYz1pbWc7DQotICAgICByZXR1cm4gYTsNCi0gIH0NCi0NCi0gICAgaWYoTVNGUGhvdmVyKQ0KLSAgICB7DQotICAgICAgICBSdXBHcmF5PU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmJykpOw0KLSAgICAgICAgUnVwQmx1ZT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzX2EuZ2lmJykpOw0KLSAgICB9DQotDQotDQotLy9uZXcgY29kZSB0byBkaXNwbGF5IHRoZSBsb2FkIGJ1dHRvbiBvciBub3QNCi12YXIgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYzsNCi1pZiAob3J5X3RvY19leGlzdCA9PSAidW5kZWZpbmVkIikgew0KLSAgIG9yeV90b2NfZXhpc3QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2NfZnJhbWU7DQotfQ0KLQ0KLWlmIChvcnlfdG9jX2V4aXN0ID09ICJ1bmRlZmluZWQiKSB7DQotCWRvY3VtZW50LndyaXRlKCI8YSBjbGFzcz1cImV4cGFuZENvbGxhcHNlTGlua1wiIGhyZWY9XCJKYXZhU2NyaXB0OmxvYWRUb3AoKTtcIiBvbm1vdXNlb3Zlcj1cImlmKE1TRlBob3ZlcikgZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwQmx1ZS5zcmM7IHNlbGYuc3RhdHVzPXRyZWVicm93c2VyX2pzX01FU1NBR0UyOyByZXR1cm4gdHJ1ZVwiIG9ubW91c2VvdXQ9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEdyYXkuc3JjOyBzZWxmLnN0YXR1cz0gJyAnO3JldHVybiB0cnVlXCI+IDxicj4gPGltZyBzcmM9XCIiICsgYmFja1BhdGggKyAiaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmIik7DQotLy9TVEFSVCBOT04tVFJBTlNMQVRBQkxFDQotCWRvY3VtZW50LndyaXRlKCJcIiAgYm9yZGVyPVwiMFwiIGFsaWduPVwiYWJzbWlkZGxlXCIgYWx0PVwiIiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIlwiIG5hbWU9XCIiICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTMgKyAiXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+IiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UyICsgIjxcL2E+Iik7DQotLy9FTkQgTk9OLVRSQU5TTEFUQUJMRQ0KLX0NCi1lbHNlIHsNCi0JZG9jdW1lbnQud3JpdGUoIiZuYnNwOyIpOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEvbGF5b3V0L3hzbC9yZXNvdXJjZXNfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS9sYXlvdXQveHNsL3Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYjNlNDgzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS9sYXlvdXQveHNsL3Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMgVGhlIFVJIHRleHQgaW4gdGhlIFhTTCBzdHlsZXNoZWV0cy4NCi0NCi1hZGRpdGlvbmFsSW5mb1RleHQ9RmxlcmUgb3BseXNuaW5nZXINCi1hZGRpdGlvbmFsUGVyZm9ybWVyVGV4dD1ZZGVybGlnZXJlIHVkZlx1MDBmOHJlbmRlDQotYWdncmVnYXRlc1RleHQ9U2FtbGluZ2VyDQotYWx0ZXJuYXRpdmVzVGV4dD1BbHRlcm5hdGl2ZXINCi1hcHBsaWNhdGlvblRleHQ9UHJvZ3JhbQ0KLWFydGlmYWN0VGV4dD1BcnRlZmFrdA0KLWFzc2V0c1RleHQ9QWt0aXZlcg0KLWFzc2lnbm1lbnRBcHByb2FjaGVzVGV4dD1UaWxkZWxpbmdzbVx1MDBlNWRlcg0KLWFzc2lzdGluZ1RleHQ9SGpcdTAwZTZscGVyDQotYmFja2dyb3VuZFRleHQ9QmFnZ3J1bmQNCi1icmllZk91dGxpbmVUZXh0PUtvcnQgb3ZlcnNpZ3QNCi1jaGVja0l0ZW1zVGV4dD1Lb250cm9sZWxlbWVudGVyDQotY2hlY2tsaXN0c1RleHQ9VGpla2xpc3Rlcg0KLWNvbGxhcHNlQWxsVGV4dD1Ta2p1bCBhbGxlIGtvbnRyb2xlbGVtZW50ZXINCi1jb21wb3NpdGVSb2xlVGV4dD1TYW1tZW5zYXQgcm9sbGUNCi1jb25jZXB0c1RleHQ9QmVncmViZXINCi1jb250YWluZWRBcnRpZmFjdHNUZXh0PUluZGVob2xkdGUgYXJ0ZWZha3Rlcg0KLWNvbnRhaW5lckFydGlmYWN0VGV4dD1PcGJldmFyaW5nc3N0ZWRzYXJ0ZWZha3QNCi1jb250ZW50RWxlbWVudHNUZXh0PUthdGVnb3Jpc2VyZWRlIGVsZW1lbnRlcg0KLWNvbnRlbnRSZWZlcmVuY2VzVGV4dD1JbmRob2xkc3JlZmVyZW5jZXINCi1kZWxpdmVyYWJsZVRleHQ9TGV2ZXJhbmNlDQotZGVsaXZlcmFibGVQcm9wZXJ0aWVzVGV4dD1MZXZlcmFuY2VlZ2Vuc2thYmVyDQotZGVsaXZlcmVkUGFydHNUZXh0PUxldmVyYW5jZWRlbGUNCi1kZWxpdmVyZWRXb3JrUHJvZHVjdHNUZXh0PUxldmVyZWRlIGFyYmVqZHNwcm9kdWt0ZXINCi1kZXBlbmRlbnRUZXh0PUFmaFx1MDBlNm5naWdlIGFyYmVqZHNwcm9kdWt0ZXINCi1kZXNjcmlwdGlvblRleHQ9QmVza3JpdmVsc2UNCi1kaXNjaXBsaW5lVGV4dD1EaXNjaXBsaW4NCi1kaXNjaXBsaW5lc1RleHQ9RGlzY2lwbGluZXINCi1zdWJkaXNjaXBsaW5lc1RleHQ9VW5kZXJkaXNjaXBsaW5lcg0KLWRvbWFpblRleHQ9RG9tXHUwMGU2bmUNCi1kb21haW5zVGV4dD1Eb21cdTAwZTZuZXINCi1leGFtcGxlc1RleHQ9RWtzZW1wbGVyDQotZXhwYW5kQWxsVGV4dD1VZHZpZCBhbGxlIGtvbnRyb2xlbGVtZW50ZXINCi1leHRlbmRzVGV4dD1VZHZpZGVyDQotZXh0ZXJuYWxUZXh0PUVrc3Rlcm4NCi1leHRlcm5hbERlc2NyaXB0aW9uVGV4dD1Fa3N0ZXJuIGJlc2tyaXZlbHNlDQotZ29hbHNUZXh0PU1cdTAwZTVsDQotZ3VpZGVsaW5lc1RleHQ9UmV0bmluZ3NsaW5qZXINCi1pbGx1c3RyYXRpb25zVGV4dD1JbGx1c3RyYXRpb25lcgkNCi1pbXBhY3RPZk5vdEhhdmluZ1RleHQ9Vmlya25pbmcgYWYgaWtrZSBhdCBoYXZlDQotaW1wYWN0aW5nVGV4dD1QXHUwMGU1dmlya2VyIGFyYmVqZHNwcm9kdWt0ZXINCi1pbnB1dHNUZXh0PUlucHV0DQotaW5wdXRUb1RleHQ9SW5wdXQgdGlsDQotaXRlbXNUZXh0PUVsZW1lbnRlcg0KLWtleUNvbnNpZGVyYXRpb25zVGV4dD1OXHUwMGY4Z2xlb3ZlcnZlamVsc2VyDQotbGV2ZWxzT2ZBZG9wdGlvblRleHQ9QWRvcHRpb25zbml2ZWF1ZXINCi1tYW5kYXRvcnlUZXh0PVBcdTAwZTVrclx1MDBlNnZldA0KLW1haW5UZXh0PU92ZXJvcmRuZXQNCi1tYWluRGVzY3JpcHRpb25UZXh0PU92ZXJvcmRuZXQgYmVza3JpdmVsc2UNCi1tYWluUmVzcG9uc2libGVUZXh0PU92ZXJvcmRuZXQgYW5zdmFybGlnDQotbWV0aG9kVGV4dD1NZXRvZGVhcmJlamRzcHJvZHVrdA0KLW1vZGlmaWVkQnlUZXh0PVx1MDBjNm5kcmV0IGFmDQotbW9yZUluZm9UZXh0PUZsZXJlIG9wbHlzbmluZ2VyDQotbm90YXRpb25UZXh0PU5vdGF0aW9uDQotb3B0aW9uYWxUZXh0PVZhbGdmcml0DQotb3V0Y29tZVRleHQ9UmVzdWx0YXQNCi1vdXRwdXRGcm9tVGV4dD1PdXRwdXQgZnJhDQotb3V0cHV0c1RleHQ9T3V0cHV0DQotcGFja2FnaW5nSW5zdHJ1Y3Rpb25zVGV4dD1QYWtrZWluc3RydWt0aW9uZXINCi1wYWNrYWdpbmdHdWlkYW5jZVRleHQ9UGFra2V2ZWpsZWRuaW5nDQotcGVyZm9ybWluZ1JvbGVzVGV4dD1VZGZcdTAwZjhyZW5kZSByb2xsZXINCi1wcmltYXJ5UGVyZm9ybWVyVGV4dD1QcmltXHUwMGU2ciB1ZGZcdTAwZjhyZW5kZQ0KLXByb2JsZW1UZXh0PVByb2JsZW0NCi1wcm9wZXJ0aWVzVGV4dD1FZ2Vuc2thYmVyDQotcHVycG9zZVRleHQ9Rm9ybVx1MDBlNWwNCi1yZWFzb25zRm9yTm90TmVlZGluZ1RleHQ9XHUwMGM1cnNhZ2VyIHRpbCBpa2tlIGF0IGJlaFx1MDBmOHZlDQotcmVmZXJlbmNlV29ya2Zsb3dzVGV4dD1SZWZlcmVuY2VhcmJlamRzZ2FuZ2UNCi1yZWxhdGVkRWxlbWVudHNUZXh0PVJlbGF0ZXJlZGUgZWxlbWVudGVyDQotcmVsYXRpb25zaGlwc1RleHQ9UmVsYXRpb25lcg0KLXJlcG9ydHNUZXh0PVJhcHBvcnRlcg0KLXJlcHJlc2VudGF0aW9uT3B0aW9uc1RleHQ9SW5kc3RpbGxpbmdlciBmb3IgcmVwclx1MDBlNnNlbnRhdGlvbg0KLXJlc3BvbnNpYmxlVGV4dD1BbnN2YXJsaWcNCi1yZXNwb25zaWJsZUZvclRleHQ9QW5zdmFybGlnIGZvcg0KLXJldXNhYmxlQXNzZXRzVGV4dD1HZW5hbnZlbmRlbGlnZSBha3RpdmVyDQotcm9sZVRleHQ9Um9sbGUNCi1yb2xlc1RleHQ9Um9sbGVyDQotcm9sZVNldHNUZXh0PVJvbGxlc1x1MDBlNnQNCi1za2lsbHNUZXh0PUtvbXBldGVuY2VyDQotc3RhZmZpbmdUZXh0PUJlbWFuZGluZw0KLXN0ZXBzVGV4dD1UcmluDQotc3ViY2F0ZWdvcmllc1RleHQ9VW5kZXJrYXRlZ29yaWVyCQ0KLXN1YmRvbWFpbnNUZXh0PVVuZGVyZG9tXHUwMGU2bmVyDQotc3ViUHJhY3RpY2VzVGV4dD1VbmRlclx1MDBmOHZlbHNlcg0KLXN1cGVyVGVhbVRleHQ9U3VwZXJ0ZWFtcHJvZmlsDQotc3VwcG9ydGluZ01hdGVyaWFsc1RleHQ9U3RcdTAwZjh0dGVtYXRlcmlhbGUNCi1zdWJ0ZWFtc1RleHQ9VW5kZXJ0ZWFtcHJvZmlsDQotc3lub255bXNUZXh0PVN5bm9ueW1lcg0KLXRhaWxvcmluZ1RleHQ9VGlscGFzbmluZw0KLXRhc2tUZXh0PU9wZ2F2ZQ0KLXRhc2tzVGV4dD1PcGdhdmVyDQotdGJzVGV4dD1UZWFtYWxsb2tlcmluZw0KLXRlYW1Qcm9maWxlVGV4dD1UZWFtcHJvZmlsDQotdGVhbVJvbGVzVGV4dD1UZWFtcHJvZmlscm9sbGVyDQotdGVjaG5pcXVlc1RleHQ9UmV0bmluZ3NsaW5qZXINCi10ZW1wbGF0ZUZpbGVzVGV4dD1Ta2FiZWxvbmZpbGVyDQotdGVtcGxhdGVzVGV4dD1Ta2FiZWxvbmVyDQotdG9vbE1lbnRvcnNUZXh0PVZcdTAwZTZya3RcdTAwZjhqc21lbnRvcmVyDQotdG9vbFRleHQ9Vlx1MDBlNnJrdFx1MDBmOGoNCi11c2FnZVRleHQ9QnJ1Zw0KLXdic1RleHQ9QXJiZWpkc25lZGJyeWRuaW5nc3N0cnVrdHVyDQotd2hpdGVwYXBlcnNUZXh0PUh2aWRiXHUwMGY4Z2VyDQotd29ya1Byb2R1Y3RzVGV4dD1BcmJlamRzcHJvZHVrdGVyDQotd29ya1Byb2R1Y3RUeXBlc1RleHQ9QXJiZWpkc3Byb2R1a3R0eXBlcg0KLXdwYnNUZXh0PUFyYmVqZHNwcm9kdWt0YnJ1Zw0KLXdvcmtCcmVha2Rvd25UZXh0PUFyYmVqZHNuZWRicnlkbmluZw0KLXdvcmtmbG93VGV4dD1BcmJlamRzZ2FuZw0KLXdvcmtQcm9kdWN0QnJlYWtkb3duVGV4dD1BcmJlamRzcHJvZHVrdG5lZGJyeWRuaW5nDQotd29ya1Byb2R1Y3REZXBlbmRlbmNpZXNUZXh0PUFyYmVqZHNwcm9kdWt0YWZoXHUwMGU2bmdpZ2hlZGVyDQotdGVhbVByb2ZpbGVCcmVha2Rvd25UZXh0PVRlYW1uZWRicnlkbmluZw0KLXRlYW1TdHJ1Y3R1cmVUZXh0PVRlYW1zdHJ1a3R1cg0KLXBhZ2VOb3RJbnN0YWxsZWRUZXh0PVNpZGUgZXIgaWtrZSBpbnN0YWxsZXJldA0KLWVsZW1lbnREb2VzTm90RXhpc3RUZXh0PUVsZW1lbnQgZmluZGVzIGlra2UNCi1pc05vdFZhbGlkVGV4dD1EZXQgcmVmZXJlcmVkZSBlbGVtZW50IGVyIGlra2UgZXQgZ3lsZGlndCBlbGVtZW50IGkgZGV0IGFrdHVlbGxlIGJpYmxpb3Rlay4NCi1lbGVtZW50TWlnaHRCZURlbGV0ZWRUZXh0PUVsZW1lbnRldCBlciBtdWxpZ3ZpcyBzbGV0dGV0IGZyYSBiaWJsaW90ZWtldC4NCi1wbGVhc2VGaXhMaW5rVGV4dD1Lb250cm9sbFx1MDBlOXIgaW5kaG9sZHNiaWJsaW90ZWtldCwgb2cgcmV0IGxpbmtldC4NCi1pbmZvQWJvdXRNaXNzaW5nRWxlbWVudFRleHQ9T3BseXNuaW5nZXIgb20gZGV0IG1hbmdsZW5kZSBlbGVtZW50Og0KLWVsZW1lbnROYW1lVGV4dD1FbGVtZW50bmF2bjoNCi1ndWlkVGV4dD1HVUlEOg0KLW1pc3NpbmdFbGVtZW50VGV4dD1SZWZlcmVyZXQgc2lkZSBmaW5kZXMgaWtrZSBpIGRlbm5lIGtvbmZpZ3VyYXRpb24NCi1ub3RBdmFpbGFibGVUZXh0PURlbiByZWZlcmVyZWRlIHNpZGUgZXIgaWtrZSB0aWxnXHUwMGU2bmdlbGlnIGkgZGVuIGFrdHVlbGxlIGtvbmZpZ3VyYXRpb24uIFNpZGVuIGVyIG11bGlndmlzIHRpbGdcdTAwZTZuZ2VsaWcgaSBlbiBhbmRlbiBwcm9jZXNrb25maWd1cmF0aW9uLg0KLWVsZW1lbnRUeXBlVGV4dD1FbGVtZW50dHlwZToNCi1wbHVnaW5OYW1lVGV4dD1QbHVnaW4tbmF2bjoNCi1wcmVkZWNlc3NvclRleHQ9Rm9yZ1x1MDBlNm5nZXINCi1wbGFubmluZ0RhdGFUZXh0PVBsYW5sXHUwMGU2Z25pbmdzZGF0YQ0KLW11bHRpcGxlT2NjdXJyZW5jZXNUZXh0PUZsZXJlIGZvcmVrb21zdGVyDQotZXZlbnREcml2ZW5UZXh0PUFrdGl2aXRldHNzdHlyZXQNCi1vbmdvaW5nVGV4dD1JZ2FuZ3ZcdTAwZTZyZW5kZQ0KLXBsYW5uZWRUZXh0PVBsYW5sYWd0DQotcmVwZWF0YWJsZVRleHQ9S2FuIGdlbnRhZ2VzDQotdXNhZ2VHdWlkYW5jZVRleHQ9QnJ1Z3N2ZWpsZWRuaW5nDQotaW5wdXRzVGV4dD1JbnB1dA0KLW91dHB1dHNUZXh0PU91dHB1dA0KLWFjdGl2aXR5RW50cnlTdGF0ZVRleHQ9QWt0aXZpdGV0c2luZGdhbmdzdGlsc3RhbmQNCi1hY3Rpdml0eUV4aXRTdGF0ZVRleHQ9QWt0aXZpdGV0c3VkZ2FuZ3N0aWxzdGFuZA0KLXByZWZpeFRleHQ9UHJcdTAwZTZmaWtzDQotZXh0ZXJuYWxJZFRleHQ9RWtzdGVybiBpZA0KLXNjb3BlVGV4dD1PbWZhbmcNCi1yb2FkbWFwVGV4dD1WZWp2aXNlcg0KLXR5cGVvZkNvbnRyYWN0VGV4dD1Lb250cmFrdHR5cGUNCi1wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzVGV4dD1Qcm9qZWt0a2FyYWt0ZXJpc3Rpa2ENCi1wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlVGV4dD1Qcm9qZWt0ZGVsdGFnZXJrb21wZXRlbmNlDQotcmlza0xldmVsVGV4dD1SaXNpa29uaXZlYXUNCi1zY2FsZVRleHQ9U2thbGENCi11c2FnZU5vdGVzVGV4dD1CcnVnc2JlbVx1MDBlNnJrbmluZ2VyDQotY29udGV4dFRleHQ9S29udGVrc3QNCi1wYXJlbnRBY3Rpdml0aWVzVGV4dD1PdmVyb3JkbmVkZSBha3Rpdml0ZXRlcg0KLWluY2x1ZGVkUGF0dGVybnNUZXh0PUlua2x1ZGVyZWRlIG1cdTAwZjhuc3RyZQ0KLWNoZWNrbGlzdFRleHQ9VGpla2xpc3RlDQotY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNUZXh0PUtvbW11bmlrYXRpb25zbWF0ZXJpYWxlDQotZWR1Y2F0aW9uTWF0ZXJpYWxzVGV4dD1VZGRhbm5lbHNlc21hdGVyaWFsZQ0KLWVzdGltYXRpbmdUZWNobmlxdWVUZXh0PUVzdGltZXJpbmdzdGVrbmlrDQotYWRkaXRpb25hbFRleHQ9WWRlcmxpZ2VyZQ0KLW1vZGlmaWVzVGV4dD1cdTAwYzZuZHJlcg0KLWFkZGl0aW9uYWxseVBlcmZvcm1zVGV4dD1VZGZcdTAwZjhyZXIgeWRlcmxpZ2VyZQ0KLWluZGV4VGV4dD1JbmRla3MNCi1wcmVmaXhUZXh0PVByXHUwMGU2Zmlrcw0KLWJyZWFrZG93bkVsZW1lbnRUZXh0PU5lZGJyeWRuaW5nc2VsZW1lbnQNCi1zdGVwc1RleHQ9VHJpbg0KLXByZWRlY2Vzc29yc1RleHQ9Rm9yZ1x1MDBlNm5nZXJlDQotcmVwZWF0YWJsZVRleHQ9S2FuIGdlbnRhZ2VzDQotdHlwZVRleHQ9VHlwZQ0KLW9uZ29pbmdUZXh0PUlnYW5ndlx1MDBlNnJlbmRlDQotZXZlbnREcml2ZW5UZXh0PUFrdGl2aXRldHNzdHlyZXQNCi1tb2RlbEluZm9UZXh0PU1vZGVsb3BseXNuaW5nZXINCi1lbnRyeVN0YXRlVGV4dD1JbmRnYW5nc3RpbHN0YW5kDQotZXhpdFN0YXRlVGV4dD1VZGdhbmdzdGlsc3RhbmQNCi10ZWFtVGV4dD1UZWFtDQotcGFyZW50UGFja2FnZVRleHQ9T3Zlcm9yZG5ldCBwYWtrZQ0KLWNvbnRhaW5lZFBhY2thZ2VzVGV4dD1JbmRlaG9sZHRlIHBha2tlcg0KLWNvbnRlbnRzVGV4dD1JbmRob2xkDQotYmFzZWRPbk1ldGhvZFJvbGVUZXh0PUJhc2VyZXQgcFx1MDBlNSBtZXRvZGVyb2xsZQ0KLWJhc2VkT25NZXRob2RUYXNrVGV4dD1CYXNlcmV0IHBcdTAwZTUgbWV0b2Rlb3BnYXZlDQotYmFzZWRPbk1ldGhvZFdvcmtQcm9kdWN0VGV4dD1CYXNlcmV0IHBcdTAwZTUgbWV0b2RlYXJiZWpkc3Byb2R1a3QNCi1zdW1tYXJ5VGV4dD1PdmVyc2lndA0KLXBlcmZvcm1zVGV4dD1VZGZcdTAwZjhyZXINCi1yZXBsYWNlc1RleHQ9RXJzdGF0dGVyDQotY29udHJpYnV0ZXNUZXh0PUJpZHJhZ2VyDQotbm9uZVRleHQ9SW5nZW4NCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNUZXh0PUVzdGltZXJpbmdzb3ZlcnZlamVsc2VyDQotYWN0aXZpdHlSZWZlcmVuY2VzVGV4dD1Ba3Rpdml0ZXRzcmVmZXJlbmNlcg0KLW5hbWVUZXh0PU5hdm4NCi1wcmVzZW50YXRpb25OYW1lVGV4dD1Qclx1MDBlNnNlbnRhdGlvbnNuYXZuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MTlkNjQ0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gYmlibGlvdGVrDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXNfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhNjhmZmEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXNfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi11bmtub3duX3RleHQ9VWtlbmR0DQotDQotIyBFcnJvciBSZWFzb25zDQotZW1wdHlMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1TdGllbiB0aWwgbWV0b2RlYmlibGlvdGVrIGVyIHRvbS4NCi1taXNzaW5nTGlicmFyeUZpbGVFcnJvcl9yZWFzb249TW9kZWxmaWxlbiB0aWwgbWV0b2RlYmlibGlvdGVrIG1hbmdsZXIuDQotdW5yZXNvbHZlZFByb3h5RXJyb3JfcmVhc29uPURldCB2YWxndGUgbWV0b2RlYmlibGlvdGVrIGluZGVob2xkZSB1bFx1MDBmOHN0ZSBlbGVtZW50cmVmZXJlbmNlci4gRGV0IHNreWxkZXMgbm9ybWFsdCBtYW5nbGVuZGUgZWxsZXIgZm9ya2VydCBwbGFjZXJlZGUgWE1JLWZpbGVyIGkgYmlibGlvdGVrc2ZvbGRlcmVuLlxuXG5MdWsgZGVubmUgZGlhbG9nLCBvZyBcdTAwZTVibiBvdmVyc2lndGVuIFByb2JsZW1lciBmb3IgYXQgZmluZGUgZGUgdWxcdTAwZjhzdGUgcmVmZXJlbmNlci4gRHUgYlx1MDBmOHIgbFx1MDBmOHNlIGRpc3NlIHJlZmVyZW5jZXIsIGZcdTAwZjhyIGR1IGZvcmV0YWdlciBmbGVyZSBcdTAwZTZuZHJpbmdlciBpIGJpYmxpb3Rla2V0LCBmb3IgYXQgdW5kZ1x1MDBlNSBhdCBiZXNrYWRpZ2UgYmlibGlvdGVrZXQuDQotDQotIyBXYXJuaW5nIE1lc3NhZ2VzDQotY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMT1JVVBMMDAwN1c6IEVuIGVsbGVyIGZsZXJlIHVuZGVyb3JkbmVkZSBlbGVtZW50ZXIgaW5kZWhvbGRlciBtYW5nbGVuZGUgcmVmZXJlbmNlcg0KLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzI9SVVQTDAwMDhXOiBWXHUwMGU2bGcgZWxlbWVudGV0IGZvciBhdCBsXHUwMGY4c2UgZW4gZWxsZXIgZmxlcmUgbWFuZ2xlbmRlIHJlZmVyZW5jZXINCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2czPUlVUEwwMDA5VzogRWxlbWVudGV0IHJlZmVyZXJlciB0aWwgZW4gZWxsZXIgZmxlcmUgZWxlbWVudGVyIGkgZW4gaWtrZSB2YWxndCBwYWtrZQ0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1sb2FkUmVzb3VyY2VzRXJyb3JfbXNnPUlVUEwwMDAwRTogTWV0b2RlYmlibGlvdGVrZXQgZXIgaW5kbFx1MDBmOHN0LCBtZW4gZGVyIGVyIHJlZ2lzdHJlcmV0IGZlamwuDQotdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9tc2c9SVVQTDAwMDFFOiBWZWpsZWRuaW5nZW4ga2FuIGlra2Uga29udmVydGVyZXMgdGlsIGVuIGFuZGVuIHR5cGUuDQotY29udmVydEd1aWRhbmNlRXJyb3JfbXNnPUlVUEwwMDAyRTogVmVqbGVkbmluZ2VuIGthbiBpa2tlIGtvbnZlcnRlcmVzIHRpbCBtXHUwMGU1bHR5cGVuLg0KLXNhdmVDb252ZXJ0ZWRHdWlkYW5jZUVycm9yX21zZz1JVVBMMDAwM0U6IERlbiBrb252ZXJ0ZXJlZGUgdmVqbGVkbmluZyAnJ3swfScnIGthbiBpa2tlIGdlbW1lcy4NCi0NCi0jIENvbnZlcnQgYWN0aXZpdHkNCi1jb252ZXJ0QWN0aXZpdHlFcnJvcl90aXRsZT1GZWpsIGkga29udmVydGVyaW5nIGFmIGFrdGl2aXRldHN0eXBlDQotY29udmVydEFjdGl2aXR5RXJyb3JfbXNnPUlVUEwwMDA2RTogQWt0aXZpdGV0ZW4ga2FuIGlra2Uga29udmVydGVyZXMgdGlsIG1cdTAwZTVsdHlwZW4uDQotc2F2ZUNvbnZlcnRlZEFjdGl2aXR5RXJyb3JfbXNnPUlVUEwwMDA3RTogRGVuIGtvbnZlcnRlcmVkZSBha3Rpdml0ZXQgJyd7MH0nJyBrYW4gaWtrZSBnZW1tZXMuDQotDQotIyBFcnJvciBSZWFzb25zDQotZXJyb3JfcmVhc29uPUlVUEwwMDA0RTogRGVyIGVyIG9wc3RcdTAwZTVldCBlbiBmZWpsLiBLbGlrIHBcdTAwZTUgT0sgZm9yIGF0IGZcdTAwZTUgZmxlcmUgb3BseXNuaW5nZXIuDQotdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9yZWFzb249RGVyIGVyIGluZ2VuIGtvbXBhdGliZWwgdmVqbGVkbmluZ3N0eXBlIGZvciB7MH0uDQotaW52YWxpZExpYnJhcnlQYXRoRXJyb3JfcmVhc29uPVVneWxkaWcgYmlibGlvdGVrc3N0aS4gRmlsZW4gLnByb2plY3Qga2FuIGlra2Ugb3ByZXR0ZXMuDQotY291bGROb3RMb2NrTGlicmFyeV9yZWFzb249S2FuIGlra2UgbFx1MDBlNXNlIGJpYmxpb3Rlay4NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotY29weWluZ0F0dGFjaG1lbnRzVGFza19uYW1lPUtvcGllcmVyIHZlZGhcdTAwZTZmdG5pbmdlci4uLg0KLQ0KLSMgQ29udmVydCBHdWlkYW5jZSBEaWFsb2cNCi1jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGl0bGU9S29udmVydFx1MDBlOXIgdmVqbGVkbmluZ3N0eXBlDQotY29udmVydEd1aWRhbmNlRGlhbG9nX3RleHQ9Vlx1MDBlNmxnIG1cdTAwZTVsdmVqbGVkbmluZ3N0eXBlbi4NCi0NCi0jIEd1aWRhbmNlIHR5cGUgbmFtZXMgZm9yIENvbnZlcnQgR3VpZGFuY2UgRGlhbG9nIC0gc2hvdWxkIGJlIHJlZmFjdG9yZWQgaW50byBsaWJyYXJ5LnVpDQotY2hlY2tsaXN0X3RleHQ9VGpla2xpc3RlDQotY29uY2VwdF90ZXh0PUJlZ3JlYg0KLWV4YW1wbGVfdGV4dD1Fa3NlbXBlbA0KLWd1aWRlbGluZV90ZXh0PVJldG5pbmdzbGluamUNCi1lc3RpbWF0ZV90ZXh0PUVzdGltYXQNCi1lc3RpbWF0aW5nTWV0cmljX3RleHQ9RXN0aW1lcmluZ3NtXHUwMGU1bGVzeXN0ZW0NCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dD1Fc3RpbWVyaW5nc292ZXJ2ZWplbHNlcg0KLXJlcG9ydF90ZXh0PVJhcHBvcnQNCi10ZW1wbGF0ZV90ZXh0PVNrYWJlbG9uDQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ9U3RcdTAwZjh0dGVtYXRlcmlhbGUNCi10b29sTWVudG9yX3RleHQ9Vlx1MDBlNnJrdFx1MDBmOGpzbWVudG9yDQotd2hpdGVwYXBlcl90ZXh0PUh2aWRib2cNCi10ZXJtRGVmaW5pdGlvbl90ZXh0PVRlcm1kZWZpbml0aW9uDQotcHJhY3RpY2VfdGV4dD1cdTAwZDh2ZWxzZQ0KLXJldXNhYmxlQXNzZXRfdGV4dD1HZW5hbnZlbmRlbGlndCBha3Rpdg0KLQ0KLSNhY3Rpdml0eSBicmVha2Rvd24gaW5mbyBzdHJpbmdzDQotQWN0aXZpdHlMYXlvdXRfcHJpbWFyeVRhc2tzX3RleHQ9VWRmXHUwMGY4cmVyIHNvbSBlamVyDQotQWN0aXZpdHlMYXlvdXRfYWRkaXRpb25hbFRhc2tzX3RleHQ9VWRmXHUwMGY4cmVyIHNvbSB5ZGVybGlnZXJlDQotDQotDQotIyBDb252ZXJ0IEd1aWRhbmNlIEVycm9yIE1lc3NhZ2VzDQotY29udmVydEd1aWRhbmNlRXJyb3JfdGl0bGU9RmVqbCBpIGtvbnZlcnRlcmluZyBhZiB2ZWpsZWRuaW5nDQotDQotIyBMb2FkIFJlc291cmNlcyBFcnJvciBEaWFsb2cNCi1sb2FkUmVzb3VyY2VzRXJyb3JfdGl0bGU9RmVqbCBpIFx1MDBlNWJuaW5nIGFmIG1ldG9kZWJpYmxpb3Rlaw0KLWxvYWRSZXNvdXJjZXNFcnJvcl9yZWFzb249Tm9nbGUgYmlibGlvdGVrc3Jlc3NvdXJjZXIga2FuIGlra2UgaW5kbFx1MDBlNnNlcy5cblxuS2xpayBwXHUwMGU1IE9wbHlzbmluZ2VyIGZvciBhdCBnZW5uZW1zZSBmZWpsZW5lLCBvZyByZXQgZGVtLCBmXHUwMGY4ciBkdSBmb3JldGFnZXIgZmxlcmUgXHUwMGU2bmRyaW5nZXIgaSBiaWJsaW90ZWtldC4NCi0NCi0jIFJvbGUgRGlhZ3JhbXMNCi1yb2xlRGlhZ3JhbVBlcmZvcm1zX3RleHQ9dWRmXHUwMGY4cmVyDQotcm9sZURpYWdyYW1SZXNwb25zaWJsZUZvcl90ZXh0PWFuc3ZhcmxpZyBmb3INCi0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cwPVJlZmVyZXJldCBlbGVtZW50OiB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxPUluZm86IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzQ9QWR2YXJzZWw6IHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzc9RmVqbDogezB9DQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTA9TWFuZ2xlciByZWZlcmVyZXQgZWxlbWVudCB7MH0NCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMT1LYW4gaWtrZSBmaW5kZSBlbGVtZW50IGZvciBHVUlEIHswfQ0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEyPUZpbGVuICcnezB9JycgcmVmZXJlcmVyIHRpbCBkZW4gbWFuZ2xlZGUgcmVzc291cmNlICcnezF9JycNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNT1tYW5nbGVyIHJlc3NvdXJjZWZpbGVuICcnezB9JycNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNz1LYW4gaWtrZSBvcHJldHRlIGZvcmJpbmRlbHNlIHRpbCBVUkwnJ2VuICcnezB9JycNCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxOT1LYW4gaWtrZSBvcHJldHRlIGZvcmJpbmRlbHNlIHRpbCBVUkwnJ2VuICcnezB9Jyc6IHsxfQ0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOD1LYW4gaWtrZSBmaW5kZSBmaWxlbiAnJ3swfScnLg0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOT1LYW4gaWtrZSBvcHJldHRlIGRldCBtaWRsZXJ0aWRpZ2UgYmlibGlvdGVrICcnezB9JycuDQotdW5rbm93bkd1aWRhbmNlX3RleHQ9VWtlbmR0DQotDQotQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbl9sb2dfbm9Db250ZW50UGF0aD1Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uLkhhbmRsZUF0dGFjaG1lbnRzUGx1Z2luOiBpbmdlbiBjb250ZW50UGF0aCB0aWwgezB9DQotTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlcl9jYW5ub3RVcGRhdGU9SVVQTDAwMDZXOiBLYW4gaWtrZSBvcGRhdGVyZSB7MH0gezF9DQotd2FybmluZ0RsZ190aXRsZT1BZHZhcnNlbA0KLWVycm9yRGxnX3RpdGxlPUZlamwNCi1lcnJvckRsZ19zYXZlRXJyb3I9SVVQTDAwMDVFOiBGZWpsIHVuZGVyIGxhZ3JpbmcgYWYgXHUwMGU2bmRyaW5nZXIgdGlsIGZpbGVuICcnezB9JycNCi0NCi0jIGFjdGl2aXR5IGRpYWdyYW0gbmFtZXMNCi1hY3Rpdml0eURpYWdyYW1OYW1lPUFrdGl2aXRldHNkaWFncmFtOiB7MH0NCi1hY3Rpdml0eURldGFpbERpYWdyYW1OYW1lPUFrdGl2aXRldHNvcGx5c25pbmdzZGlhZ3JhbTogezB9DQotd3BEZXBlbmRlbmN5RGlhZ3JhbU5hbWU9RGlhZ3JhbSBmb3IgYXJiZWpkc3Byb2R1a3RhZmhcdTAwZTZuZ2lnaGVkOiB7MH0NCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBSb2xlIGRpYWdyYW0gZm9udHMgYW5kIGxheW91dA0KLXJvbGVEaWFncmFtRm9udF9uYW1lPUFyaWFsDQotcm9sZURpYWdyYW1Gb250X25hbWVfd2luMzI9QXJpYWwNCi1yb2xlRGlhZ3JhbUZvbnRfc2l6ZT0xMA0KLXJvbGVEaWFncmFtRm9udF9zaXplX3dpbjMyPTEwDQotcm9sZURpYWdyYW1feE1hcmdpbj0yMDANCi1yb2xlRGlhZ3JhbV94U3BhY2luZz03MA0KLXJvbGVEaWFncmFtX3lTcGFjaW5nPTMwDQotDQotIyBsb2NhbGl6ZSB0aGUgdmFsdWUgYmFzZWQgb24gbG9jYWxlLiAgZm9yIGV4YW1wbGUsIA0KLSMgZm9yIEVuZ2xpc2gsIHRoZSB2YWx1ZSBpcyAiLiAiDQotI2NvbG9uX3dpdGhfc3BhY2U9OiANCi0jIGZvciBmcmVuY2gsIHRoZSB2YWx1ZSBpcyAiIC4gIiwgeW91IG5lZWQgdG8gdXNlIGEgXCB0byBwcmVzZXJ2ZSB0aGUgbGVhZGluZyBzcGFjZQ0KLSNjb2xvbl93aXRoX3NwYWNlPVwgOiANCi0jIGZvciBjaGluZXNlLCB0aGUgY29sb24gc2hvdWxkIGJlIGRvdWJsZSBieXRlcw0KLSMgRG9udCB0cmltIHRoZSBzcGFjZXMgYWZ0ZXIgdGhlIGNvbG9uLg0KLWNvbG9uX3dpdGhfc3BhY2U9OiANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTc4ZDZmMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjVjYjk0Yi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIExpYnJhcnkgUGVyc2lzdGVuY2UgKE5MMSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2U7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZTdiMDEyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9lcy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZnIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2phLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9rby5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcHRfQlIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX0NOLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9UVy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2l0LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYzM5MWVmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBCaWJsaW90aGVrc3BlcnNpc3RlbnoNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjdmNGIyMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9UGVyc2lzdGVuY2lhIGRlIGJpYmxpb3RlY2EgZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExM2Q5ODguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVBlcnNpc3RhbmNlIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5faXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5Y2MwZmI2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1QZXJzaXN0ZW56YSBsaWJyZXJpYSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5famEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2IyYWFiZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5famEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIExpYnJhcnkgUGVyc2lzdGVuY2UNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjIzMzVkZi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWM5YzBcdWMxOGRcdWMxMzENCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTAzMjczNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9UGVyc2lzdFx1MDBlYW5jaWEgZGEgQmlibGlvdGVjYSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTliNTg3ZS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFx1NWU5M1x1NjMwMVx1NGU0NVx1NjAyNw0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjJhYWJkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgTGlicmFyeSBQZXJzaXN0ZW5jZQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk5NGNjMjAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWludmFsaWROYW1lRXJyb3JfbXNnPURlciBOYW1lICcnezB9JycgaXN0IHVuZ1x1MDBmY2x0aWcuIERpZSBmb2xnZW5kZW4gWmVpY2hlbiBzaW5kIGluIE5hbWVuIGZcdTAwZmNyIE1ldGhvZGVuZWxlbWVudGUgbmljaHQgenVsXHUwMGU0c3NpZzogXFwgLyA6ICogPyAiIDwgPiB8DQotb2JqTm90Rm91bmRFcnJvcl9tc2c9RXMgd3VyZGUga2VpbiBPYmpla3QgbWl0IGRlciBJRCAnJ3swfScnIGdlZnVuZGVuLg0KLWxvYWRMaWJyYXJ5RXJyb3JfbXNnPUZlaGxlciBiZWltIExhZGVuIGRlciBNZXRob2RlbmJpYmxpb3RoZWs6DQotbG9hZExpYnJhcnlFcnJvcl9kZXRhaWxzPVwgXCBaZWlsZTogezB9LCBTcGFsdGU6IHsxfSwgTmFjaHJpY2h0OiB7Mn0NCi1yZXN0b3JlUmVzb3VyY2VFcnJvcl9tc2c9RGllIFJlc3NvdXJjZSAnJ3swfScnIGtvbm50ZSBuaWNodCB3aWVkZXJoZXJnZXN0ZWxsdCB3ZXJkZW4uDQotRmlsZU1hbmFnZXJfZmlsZVJlYWRPbmx5PURpZSBEYXRlaSAnJ3swfScnIGlzdCBzY2hyZWliZ2VzY2hcdTAwZmN0enQuDQotRXJyTXNnX0NvdWxkTm90RGVsZXRlPXswfSBrb25udGUgbmljaHQgZ2VsXHUwMGY2c2NodCB3ZXJkZW4uIHsxfQ0KLXJlbmFtZUVycm9yX21zZz0nJ3swfScnIGtvbm50ZSBuaWNodCBpbiAnJ3sxfScnIHVtYmVuYW5udCB3ZXJkZW4uDQotYmFja3VwRXJyb3JfbXNnPURpZSBSZXNzb3VyY2UgJyd7MH0nJyBrb25udGUgbmljaHQgZ2VzaWNoZXJ0IHdlcmRlbi4NCi1tYXJrZXJfZXJyX2Nhbm5vdFJlc29sdmVQcm94eT1EZXIgUHJveHkgezB9IGtvbm50ZSBuaWNodCBhdWZnZWxcdTAwZjZzdCB3ZXJkZW4uDQotbW9kaWZ5RmlsZUVycm9yX21zZz1EaWUgRGF0ZWkgJyd7MH0nJyBrYW5uIG5pY2h0IGdlXHUwMGU0bmRlcnQgd2VyZGVuLg0KLWxvYWRSZXNvdXJjZUVycm9yX21zZz1EaWUgUmVzc291cmNlICcnezB9Jycga29ubnRlIG5pY2h0IGdlbGFkZW4gd2VyZGVuLg0KLWxvYWRSZXNvdXJjZUVycm9yV2l0aFJlYXNvbl9tc2c9RGllIFJlc3NvdXJjZSAnJ3swfScnIGtvbm50ZSBuaWNodCBnZWxhZGVuIHdlcmRlbi4gVXJzYWNoZTogezF9DQotaW52YWxpZExpYnJhcnlGaWxlRXJyb3JfbXNnPVVuZ1x1MDBmY2x0aWdlIE1ldGhvZGVuYmlibGlvdGhla3NkYXRlaToNCi1maWxlTm90Rm91bmRFcnJvcl9tc2c9IEVzIHd1cmRlIGtlaW5lIE1ldGhvZGVuYmlibGlvdGhla3NkYXRlaSBpbSBBcmJlaXRzYmVyZWljaCAnJ3swfScnIGdlZnVuZGVuLg0KLW5vcm1hbGl6ZVVSSUVycm9yX21zZz1EZXIgbm9ybWFsaXNpZXJ0ZSBVUkkgZlx1MDBmY3IgJyd7MH0nJyB3dXJkZSBuaWNodCBnZWZ1bmRlbi4NCi1tb3ZlRXJyb3JfbXNnPScnezB9Jycga29ubnRlIG5pY2h0IG5hY2ggJyd7MX0nJyB2ZXJzY2hvYmVuIHdlcmRlbi4gRGFzIFppZWwgaXN0IGJlcmVpdHMgdm9yaGFuZGVuLg0KLW1vZGlmeVJlYWRPbmx5RmlsZUVycm9yX21zZz1EaWUgZm9sZ2VuZGVuIHNjaHJlaWJnZXNjaFx1MDBmY3R6dGVuIERhdGVpZW4ga1x1MDBmNm5uZW4gbmljaHQgZ2VcdTAwZTRuZGVydCB3ZXJkZW46IHswfQ0KLW1vdmVSZXNvdXJjZUVycm9yX21zZz1EaWUgUmVzc291cmNlICcnezB9JycgaXN0IGFuIGVpbmVyIFBlcnNpc3RlbnpvcGVyYXRpb24gYmV0ZWlsaWd0LCBkaWUgbm9jaCBuaWNodCBmZXN0Z2VzY2hyaWViZW4gd3VyZGUuDQotbW9kaWZ5RmlsZXNFcnJvcl9tc2c9TWluZGVzdGVucyBlaW5lIERhdGVpIGtvbm50ZSBuaWNodCBnZVx1MDBlNG5kZXJ0IHdlcmRlbi4NCi1yZXNvdXJjZU91dE9mU3luY2hfbXNnPURpZSBSZXNzb3VyY2UgaXN0IG5pY2h0IHN5bmNocm9uaXNpZXJ0IHVuZCBtdXNzIGVybmV1dCBnZWxhZGVuIHdlcmRlbjogezB9DQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWxvYWRMaWJyYXJ5VGFza19uYW1lPU1ldGhvZGVuYmlibGlvdGhlayB3aXJkIGdlbGFkZW4uLi4NCi1tb3ZlRGF0YVRhc2tfbmFtZT1EYXRlbiB3ZXJkZW4gdmVyc2Nob2Jlbi4uLg0KLXNhdmVMaWJyYXJ5VGFza19uYW1lPU1ldGhvZGVuYmlibGlvdGhlayB3aXJkIGdlc3BlaWNoZXJ0Li4uDQotbG9hZFJlc291cmNlc1Rhc2tfbmFtZT1BbGxlIFJlc3NvdXJjZW4gd2VyZGVuIGluIGRlbiBIYXVwdHNwZWljaGVyIGdlbGFkZW4uLi4NCi1taWdyYXRlQ29udGVudERlc2NyaXB0aW9uc1Rhc2tfbmFtZT1Qcm96ZXNzaW5oYWx0c2Jlc2NocmVpYnVuZ2VuIHdlcmRlbiBtaWdyaWVydC4uLg0KLWZpeFByZXNlbnRhdGlvbk5hbWVUYXNrX25hbWU9TmljaHQgdm9yaGFuZGVuZXIvbGVlcmVyIFByXHUwMGU0c2VudGF0aW9uc25hbWUgamVkZXMgU3RydWt0dXJlbGVtZW50cyB3aXJkIGF1ZiBkZW4gZW50c3ByZWNoZW5kZW4gTmFtZW4gZ2VzZXR6dC4uLg0KLVVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXJfY291bGROb3RSZXNvbHZlUHJveHk9RGVyIFByb3h5ICcnezB9Jycga29ubnRlIG5pY2h0IGF1ZmdlbFx1MDBmNnN0IHdlcmRlbi4NCi1yZWZyZXNoTGlicmFyeUZpbGVzVGFza19uYW1lPUJpYmxpb3RoZWtzZGF0ZWllbiBpbSBBcmJlaXRzYmVyZWljaCB3ZXJkZW4gYWt0dWFsaXNpZXJ0Lg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPURpZSBhdXNnZXdcdTAwZTRobHRlbiBEYXRlaWVuIHdlcmRlbiBuaWNodCB1bnRlcnN0XHUwMGZjdHp0LiBGXHUwMGZjaHJlbiBTaWUgZWluZW4gVXBncmFkZSBhdWYgZWluZSBuZXVlcmUgVmVyc2lvbiB2b24gezB9IGR1cmNoLiANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3MDFjYjAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWludmFsaWROYW1lRXJyb3JfbXNnPUVsIG5vbWJyZSAnJ3swfScnIG5vIGVzIHZcdTAwZTFsaWRvLiBFbCBub21icmUgZGUgZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gbm8gcHVlZGUgY29udGVuZXIgZXN0b3MgY2FyYWN0ZXJlczogXFwgLyA6ICogPyAiIDwgPiB8DQotb2JqTm90Rm91bmRFcnJvcl9tc2c9Tm8gc2UgaGEgcG9kaWRvIGVuY29udHJhciBlbCBvYmpldG8gY29uIGVsIElEICcnezB9JycNCi1sb2FkTGlicmFyeUVycm9yX21zZz1TZSBoYW4gcHJvZHVjaWRvIGVycm9yZXMgYWwgY2FyZ2FyIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zOg0KLWxvYWRMaWJyYXJ5RXJyb3JfZGV0YWlscz1cIFwgbFx1MDBlZG5lYTogezB9LCBjb2x1bW5hOiB7MX0sIG1zZzogezJ9DQotcmVzdG9yZVJlc291cmNlRXJyb3JfbXNnPU5vIHNlIGhhIHBvZGlkbyByZXN0YXVyYXIgZWwgcmVjdXJzbyAnJ3swfScnDQotRmlsZU1hbmFnZXJfZmlsZVJlYWRPbmx5PUVsIGFyY2hpdm8gJyd7MH0nJyBlcyBkZSBzXHUwMGYzbG8gbGVjdHVyYQ0KLUVyck1zZ19Db3VsZE5vdERlbGV0ZT1ObyBzZSBoYSBwb2RpZG8gc3VwcmltaXIgezB9LiB7MX0NCi1yZW5hbWVFcnJvcl9tc2c9Tm8gc2UgaGEgcG9kaWRvIHJlbm9tYnJhciAnJ3swfScnIGNvbW8gJyd7MX0nJw0KLWJhY2t1cEVycm9yX21zZz1ObyBzZSBwb2RpZG8gcmVhbGl6YXIgdW5hIGNvcGlhIGRlIHNlZ3VyaWRhZCBkZWwgcmVjdXJzbyAnJ3swfScnDQotbWFya2VyX2Vycl9jYW5ub3RSZXNvbHZlUHJveHk9Tm8gc2UgaGEgcG9kaWRvIHJlc29sdmVyIGVsIHByb3h5IHswfQ0KLW1vZGlmeUZpbGVFcnJvcl9tc2c9Tm8gc2UgcHVlZGUgbW9kaWZpY2FyIGVsIGFyY2hpdm8gJyd7MH0nJw0KLWxvYWRSZXNvdXJjZUVycm9yX21zZz1ObyBzZSBoYSBwb2RpZG8gY2FyZ2FyIGVsIHJlY3Vyc28gJyd7MH0nJw0KLWxvYWRSZXNvdXJjZUVycm9yV2l0aFJlYXNvbl9tc2c9Tm8gc2UgaGEgcG9kaWRvIGNhcmdhciBlbCByZWN1cnNvICcnezB9JycuIE1vdGl2bzogezF9DQotaW52YWxpZExpYnJhcnlGaWxlRXJyb3JfbXNnPUFyY2hpdm8gZGUgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3Mgbm8gdlx1MDBlMWxpZG86DQotZmlsZU5vdEZvdW5kRXJyb3JfbXNnPU5vIHNlIGhhIHBvZGlkbyB1YmljYXIgbmluZ1x1MDBmYW4gYXJjaGl2byBkZSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBlbiBlbCBlc3BhY2lvIGRlIHRyYWJham8gJyd7MH0nJw0KLW5vcm1hbGl6ZVVSSUVycm9yX21zZz1ObyBzZSBoYSBwb2RpZG8gZW5jb250cmFyIGVsIFVSSSBub3JtYWxpemFkbyBwYXJhICcnezB9JycNCi1tb3ZlRXJyb3JfbXNnPU5vIHNlIGhhIHBvZGlkbyBtb3ZlciAnJ3swfScnIGEgJyd7MX0nJy4gRWwgZGVzdGlubyB5YSBleGlzdGUuDQotbW9kaWZ5UmVhZE9ubHlGaWxlRXJyb3JfbXNnPU5vIHNlIHB1ZWRlIG1vZGlmaWNhciBlbCBhcmNoaXZvIGRlIHNcdTAwZjNsbyBsZWN0dXJhOiB7MH0NCi1tb3ZlUmVzb3VyY2VFcnJvcl9tc2c9RWwgcmVjdXJzbyAnJ3swfScnIGVzdFx1MDBlMSBpbXBsaWNhZG8gZW4gdW5hIG9wZXJhY2lcdTAwZjNuIGRlIHBlcm1hbmVuY2lhIHF1ZSBubyBzZSBoYSBjb25maXJtYWRvLg0KLW1vZGlmeUZpbGVzRXJyb3JfbXNnPU5vIHNlIGhhbiBwb2RpZG8gbW9kaWZpY2FyIHVubyBvIHZhcmlvcyBhcmNoaXZvcw0KLXJlc291cmNlT3V0T2ZTeW5jaF9tc2c9RWwgcmVjdXJzbyBubyBlc3RcdTAwZTEgc2luY3Jvbml6YWRvIHkgc2UgdGllbmUgcXVlIGNhcmdhciBkZSBudWV2bzogezB9DQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWxvYWRMaWJyYXJ5VGFza19uYW1lPUNhcmdhbmRvIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLi4uDQotbW92ZURhdGFUYXNrX25hbWU9TW92aWVuZG8gbG9zIGRhdG9zLi4uDQotc2F2ZUxpYnJhcnlUYXNrX25hbWU9R3VhcmRhbmRvIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLi4uDQotbG9hZFJlc291cmNlc1Rhc2tfbmFtZT1DYXJnYW5kbyB0b2RvcyBsb3MgcmVjdXJzb3MgZW4gbGEgbWVtb3JpYS4uLg0KLW1pZ3JhdGVDb250ZW50RGVzY3JpcHRpb25zVGFza19uYW1lPU1pZ3JhbmRvIGxhcyBkZXNjcmlwY2lvbmVzIGRlIGNvbnRlbmlkbyBkZWwgcHJvY2Vzby4uLg0KLWZpeFByZXNlbnRhdGlvbk5hbWVUYXNrX25hbWU9RXN0YWJsZWNpZW5kbyBlbCBub21icmUgZGUgcHJlc2VudGFjaVx1MDBmM24gbnVsby92YWNcdTAwZWRvIGRlIHRvZG9zIGxvcyBlbGVtZW50b3MgZGUgZGVzZ2xvc2UgZW4gc3Ugbm9tYnJlLi4uDQotVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcl9jb3VsZE5vdFJlc29sdmVQcm94eT1ObyBzZSBoYSBwb2RpZG8gcmVzb2x2ZXIgZWwgcHJveHkgJyd7MH0nJw0KLXJlZnJlc2hMaWJyYXJ5RmlsZXNUYXNrX25hbWU9UmVub3ZhbmRvIGFyY2hpdm9zIGRlIGJpYmxpb3RlY2EgZW4gZWwgZXNwYWNpbyBkZSB0cmFiYWpvDQotdmVyc2lvbk1pc21hdGNoX29sZFRvb2w9TG9zIGFyY2hpdm9zIHNlbGVjY2lvbmFkb3Mgbm8gZXN0XHUwMGUxbiBzb3BvcnRhZG9zLCBhY3R1YWxpY2UgYSB1bmEgdmVyc2lcdTAwZjNuIG1cdTAwZTFzIHJlY2llbnRlIGRlIHswfS4gDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOGE5YWNmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1pbnZhbGlkTmFtZUVycm9yX21zZz1MZSBub20gJyd7MH0nJyBlc3Qgbm9uIHZhbGlkZS4gTGUgbm9tIGRlIGwnJ1x1MDBlOWxcdTAwZTltZW50IGRlIG1cdTAwZTl0aG9kZSBuZSBwZXV0IHBhcyBjb250ZW5pciBsZXMgY2FyYWN0XHUwMGU4cmVzIHN1aXZhbnRzIDogXFwgLyA6ICogPyAiIDwgPiB8DQotb2JqTm90Rm91bmRFcnJvcl9tc2c9SW1wb3NzaWJsZSBkZSB0cm91dmVyIGRlcyBvYmpldHMgZG9udCBsJydpZGVudGlmaWNhdGV1ciBlc3QgJyd7MH0nJw0KLWxvYWRMaWJyYXJ5RXJyb3JfbXNnPURlcyBlcnJldXJzIHNlIHNvbnQgcHJvZHVpdGVzIGxvcnMgZHUgY2hhcmdlbWVudCBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIDoNCi1sb2FkTGlicmFyeUVycm9yX2RldGFpbHM9XCBcIGxpZ25lIDogezB9LCBjb2xvbm5lIDogezF9LCBtZXNzYWdlIDogezJ9DQotcmVzdG9yZVJlc291cmNlRXJyb3JfbXNnPUltcG9zc2libGUgZGUgcmVzdGF1cmVyIGxhIHJlc3NvdXJjZSAnJ3swfScnDQotRmlsZU1hbmFnZXJfZmlsZVJlYWRPbmx5PUxlIGZpY2hpZXIgJyd7MH0nJyBlc3QgZW4gbGVjdHVyZSBzZXVsZW1lbnQNCi1FcnJNc2dfQ291bGROb3REZWxldGU9SW1wb3NzaWJsZSBkZSBzdXBwcmltZXIgezB9LiB7MX0NCi1yZW5hbWVFcnJvcl9tc2c9SW1wb3NzaWJsZSBkZSByZW5vbW1lciAnJ3swfScnIGVuICcnezF9JycNCi1iYWNrdXBFcnJvcl9tc2c9SW1wb3NzaWJsZSBkZSBzYXV2ZWdhcmRlciBsYSByZXNzb3VyY2UgJyd7MH0nJw0KLW1hcmtlcl9lcnJfY2Fubm90UmVzb2x2ZVByb3h5PUltcG9zc2libGUgZGUgclx1MDBlOXNvdWRyZSBsZSBwcm94eSB7MH0NCi1tb2RpZnlGaWxlRXJyb3JfbXNnPUltcG9zc2libGUgZGUgbW9kaWZpZXIgbGUgZmljaGllciAnJ3swfScnDQotbG9hZFJlc291cmNlRXJyb3JfbXNnPUltcG9zc2libGUgZGUgY2hhcmdlciBsYSByZXNzb3VyY2UgJyd7MH0nJw0KLWxvYWRSZXNvdXJjZUVycm9yV2l0aFJlYXNvbl9tc2c9SW1wb3NzaWJsZSBkZSBjaGFyZ2VyIGxhIHJlc3NvdXJjZSAnJ3swfScnLiBDYXVzZSA6IHsxfQ0KLWludmFsaWRMaWJyYXJ5RmlsZUVycm9yX21zZz1GaWNoaWVyIGRlIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgbm9uIHZhbGlkZSA6DQotZmlsZU5vdEZvdW5kRXJyb3JfbXNnPUltcG9zc2libGUgZGUgbG9jYWxpc2VyIHVuIGZpY2hpZXIgZGUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBkYW5zIGwnJ2VzcGFjZSBkZSB0cmF2YWlsICcnezB9JycNCi1ub3JtYWxpemVVUklFcnJvcl9tc2c9SW1wb3NzaWJsZSBkZSBsb2NhbGlzZXIgbCcnaWRlbnRpZmljYXRldXIgVVJJIG5vcm1hbGlzXHUwMGU5IHBvdXIgJyd7MH0nJw0KLW1vdmVFcnJvcl9tc2c9SW1wb3NzaWJsZSBkZSBkXHUwMGU5cGxhY2VyICcnezB9JycgdmVycyAnJ3sxfScnLiBDZXR0ZSBkZXN0aW5hdGlvbiBleGlzdGUgZFx1MDBlOWpcdTAwZTAuDQotbW9kaWZ5UmVhZE9ubHlGaWxlRXJyb3JfbXNnPUltcG9zc2libGUgZGUgbW9kaWZpZXIgbGUocykgZmljaGllcihzKSBlbiBsZWN0dXJlIHNldWxlbWVudCA6IHswfQ0KLW1vdmVSZXNvdXJjZUVycm9yX21zZz1MYSByZXNzb3VyY2UgJyd7MH0nJyBlc3QgdXRpbGlzXHUwMGU5ZSBkYW5zIHVuZSBvcFx1MDBlOXJhdGlvbiBkZSBwZXJzaXN0YW5jZSBub24gdmFsaWRcdTAwZTllLg0KLW1vZGlmeUZpbGVzRXJyb3JfbXNnPUltcG9zc2libGUgZGUgbW9kaWZpZXIgdW4gb3UgcGx1c2lldXJzIGZpY2hpZXJzDQotcmVzb3VyY2VPdXRPZlN5bmNoX21zZz1MYSByZXNzb3VyY2UgZXN0IGluY29oXHUwMGU5cmVudGUgZXQgZG9pdCBcdTAwZWF0cmUgcmVjaGFyZ1x1MDBlOWUgOiB7MH0NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotbG9hZExpYnJhcnlUYXNrX25hbWU9Q2hhcmdlbWVudCBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzLi4uDQotbW92ZURhdGFUYXNrX25hbWU9RFx1MDBlOXBsYWNlbWVudCBkZXMgZG9ublx1MDBlOWVzLi4uDQotc2F2ZUxpYnJhcnlUYXNrX25hbWU9U2F1dmVnYXJkZSBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzLi4uDQotbG9hZFJlc291cmNlc1Rhc2tfbmFtZT1DaGFyZ2VtZW50IGRlIHRvdXRlcyBsZXMgcmVzc291cmNlcyBkYW5zIGxhIG1cdTAwZTltb2lyZS4uLg0KLW1pZ3JhdGVDb250ZW50RGVzY3JpcHRpb25zVGFza19uYW1lPU1pZ3JhdGlvbiBkZXMgZGVzY3JpcHRpb25zIGR1IGNvbnRlbnUgZGUgcHJvY2Vzc3VzLi4uDQotZml4UHJlc2VudGF0aW9uTmFtZVRhc2tfbmFtZT1DaGFuZ2VtZW50IGR1IG5vbSBkZSBwclx1MDBlOXNlbnRhdGlvbiBudWxsL3ZpZGUgZGUgY2hhcXVlIFx1MDBlOWxcdTAwZTltZW50IGRlIHJcdTAwZTlwYXJ0aXRpb24gYXUgcHJvZml0IGRlIHNvbiBub20uLi4NCi1VbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyX2NvdWxkTm90UmVzb2x2ZVByb3h5PUltcG9zc2libGUgZGUgclx1MDBlOXNvdWRyZSBsZSBwcm94eSAnJ3swfScnDQotcmVmcmVzaExpYnJhcnlGaWxlc1Rhc2tfbmFtZT1BY3R1YWxpc2F0aW9uIGRlcyBmaWNoaWVycyBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkYW5zIGwnZXNwYWNlIGRlIHRyYXZhaWwNCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1MZXMgZmljaGllcnMgc1x1MDBlOWxlY3Rpb25uXHUwMGU5cyBuZSBzb250IHBhcyBwcmlzIGVuIGNoYXJnZSAtIGVmZmVjdHVleiB1bmUgbWlzZSBcdTAwZTAgbml2ZWF1IHZlcnMgdW5lIHZlcnNpb24gcGx1cyByXHUwMGU5Y2VudGUgZGUgezB9LiANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5OTAxNGEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLWludmFsaWROYW1lRXJyb3JfbXNnPUlsIG5vbWUgJyd7MH0nJyBub24gXHUwMGU4IHZhbGlkby4gSWwgbm9tZSBkZWxsJydlbGVtZW50byBkZWwgbWV0b2RvIG5vbiBwdVx1MDBmMiBjb250ZW5lcmUgaSBzZWd1ZW50aSBjYXJhdHRlcmk6IFxcIC8gOiAqID8gIiA8ID4gfA0KLW9iak5vdEZvdW5kRXJyb3JfbXNnPUltcG9zc2liaWxlIHRyb3ZhcmUgbCcnb2dnZXR0byBjb24gbCcnaWQgJyd7MH0nJw0KLWxvYWRMaWJyYXJ5RXJyb3JfbXNnPVJpbGV2YXRpIGVycm9yaSBkdXJhbnRlIGlsIGNhcmljYW1lbnRvIGRlbGxhIGxpYnJlcmlhIGRlaSBtZXRvZGk6DQotbG9hZExpYnJhcnlFcnJvcl9kZXRhaWxzPVwgXCByaWdhOiB7MH0sIGNvbG9ubmE6IHsxfSwgbXNnOiB7Mn0NCi1yZXN0b3JlUmVzb3VyY2VFcnJvcl9tc2c9SW1wb3NzaWJpbGUgcmlwcmlzdGluYXJlIGxhIHJpc29yc2EgJyd7MH0nJw0KLUZpbGVNYW5hZ2VyX2ZpbGVSZWFkT25seT1JbCBmaWxlICcnezB9JycgXHUwMGU4IGRpIHNvbGEgbGV0dHVyYQ0KLUVyck1zZ19Db3VsZE5vdERlbGV0ZT1JbXBvc3NpYmlsZSBlbGltaW5hcmUgezB9LiB7MX0NCi1yZW5hbWVFcnJvcl9tc2c9SW1wb3NzaWJpbGUgcmlub21pbmFyZSAnJ3swfScnIGluICcnezF9JycNCi1iYWNrdXBFcnJvcl9tc2c9SW1wb3NzaWJpbGUgZXNlZ3VpcmUgaWwgYmFja3VwIGRlbGxhIHJpc29yc2EgJyd7MH0nJw0KLW1hcmtlcl9lcnJfY2Fubm90UmVzb2x2ZVByb3h5PUltcG9zc2liaWxlIHJpc29sdmVyZSBpbCBwcm94eSB7MH0NCi1tb2RpZnlGaWxlRXJyb3JfbXNnPUltcG9zc2liaWxlIG1vZGlmaWNhcmUgaWwgZmlsZSAnJ3swfScnDQotbG9hZFJlc291cmNlRXJyb3JfbXNnPUltcG9zc2liaWxlIGNhcmljYXJlIGxhIHJpc29yc2EgJyd7MH0nJw0KLWxvYWRSZXNvdXJjZUVycm9yV2l0aFJlYXNvbl9tc2c9SW1wb3NzaWJpbGUgY2FyaWNhcmUgbGEgcmlzb3JzYSAnJ3swfScnLiBNb3Rpdm86IHsxfQ0KLWludmFsaWRMaWJyYXJ5RmlsZUVycm9yX21zZz1GaWxlIGRlbGxhIGxpYnJlcmlhIGRlaSBtZXRvZGkgbm9uIHZhbGlkbzoNCi1maWxlTm90Rm91bmRFcnJvcl9tc2c9SW1wb3NzaWJpbGUgaW5kaXZpZHVhcmUgZmlsZSBsaWJyZXJpYSBkZWkgbWV0b2RpIG5lbGxvIHNwYXppbyBkaSBsYXZvcm8gJyd7MH0nJw0KLW5vcm1hbGl6ZVVSSUVycm9yX21zZz1JbXBvc3NpYmlsZSB0cm92YXJlIGwnJ1VSSSBub3JtYWxpenphdG8gcGVyICcnezB9JycNCi1tb3ZlRXJyb3JfbXNnPUltcG9zc2liaWxlIHNwb3N0YXJlICcnezB9JycgaW4gJyd7MX0nJy4gTGEgZGVzdGluYXppb25lIGVzaXN0ZSBnaVx1MDBlMC4NCi1tb2RpZnlSZWFkT25seUZpbGVFcnJvcl9tc2c9SW1wb3NzaWJpbGUgbW9kaWZpY2FyZSBmaWxlIGRpIHNvbGEgbGV0dHVyYTogezB9DQotbW92ZVJlc291cmNlRXJyb3JfbXNnPUxhIHJpc29yc2EgJyd7MH0nJyBcdTAwZTggY29pbnZvbHRhIGluIHVuJydvcGVyYXppb25lIGRpIHBlcnNpc3RlbnphIGNoZSBub24gXHUwMGU4IHN0YXRhIGVzZWd1aXRhLg0KLW1vZGlmeUZpbGVzRXJyb3JfbXNnPUltcG9zc2liaWxlIG1vZGlmaWNhcmUgdW5vIG8gcGlcdTAwZjkgZmlsZQ0KLXJlc291cmNlT3V0T2ZTeW5jaF9tc2c9TGEgcmlzb3JzYSBub24gXHUwMGU4IHNpbmNyb25penphdGEgZSBkZXZlIGVzc2VyZSByaWNhcmljYXRhOiB7MH0NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotbG9hZExpYnJhcnlUYXNrX25hbWU9Q2FyaWNhbWVudG8gZGVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBpbiBjb3Jzby4uLg0KLW1vdmVEYXRhVGFza19uYW1lPVRyYXNmZXJpbWVudG8gZGVpIGRhdGkgaW4gY29yc28uLi4NCi1zYXZlTGlicmFyeVRhc2tfbmFtZT1TYWx2YXRhZ2dpbyBkZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGluIGNvcnNvLi4uDQotbG9hZFJlc291cmNlc1Rhc2tfbmFtZT1DYXJpY2FtZW50byBkaSB0dXR0ZSBsZSByaXNvcnNlIG5lbGxhIG1lbW9yaWEgaW4gY29yc28uLi4NCi1taWdyYXRlQ29udGVudERlc2NyaXB0aW9uc1Rhc2tfbmFtZT1NaWdyYXppb25lIGRlbGxlIGRlc2NyaXppb25pIGRlaSBjb250ZW51dGkgZGVpIHByb2Nlc3NpIGluIGNvcnNvLi4uDQotZml4UHJlc2VudGF0aW9uTmFtZVRhc2tfbmFtZT1JbXBvc3RhemlvbmUgaW4gY29yc28gZGVsIG5vbWUgZGkgcHJlc2VudGF6aW9uZSB2dW90by9udWxsbyBkaSBvZ25pIGVsZW1lbnRvIGRlbGxhIHN1ZGRpdmlzaW9uZSBzdWwgcmVsYXRpdm8gbm9tZS4uLg0KLVVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXJfY291bGROb3RSZXNvbHZlUHJveHk9SW1wb3NzaWJpbGUgcmlzb2x2ZXJlIGlsIHByb3h5ICcnezB9JycNCi1yZWZyZXNoTGlicmFyeUZpbGVzVGFza19uYW1lPUFnZ2lvcm5hbWVudG8gZGVpIGZpbGUgZGVsbGEgbGlicmVyaWEgbmVsbCdhcmVhIGRpIGxhdm9ybw0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUkgZmlsZSBzZWxlemlvbmF0aSBub24gc29ubyBzdXBwb3J0YXRpIC0gcGFzc2FyZSBhZCB1bmEgdmVyc2lvbmUgcGlcdTAwZjkgYWdnaW9ybmF0YSBkaSB7MH0uIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfamEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjEwOTdiMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZE5hbWVFcnJvcl9tc2c9XHU1NDBkXHU1MjRkICcnezB9JycgXHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyIFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMFx1NTQwZFx1MzA2N1x1MzA2Zlx1MzAwMVx1NmIyMVx1MzA2ZVx1NjU4N1x1NWI1N1x1MzA2Zlx1NGY3Zlx1NzUyOFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MzogXFwgLyA6ICogPyAiIDwgPiB8DQotb2JqTm90Rm91bmRFcnJvcl9tc2c9SUQgXHUzMDRjICcnezB9JycgXHUzMDZlXHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4XHUzMDZmXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmXHUzMDAyDQotbG9hZExpYnJhcnlFcnJvcl9tc2c9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGM5XHU0ZTJkXHUzMDZiXHUzMDAxXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOg0KLWxvYWRMaWJyYXJ5RXJyb3JfZGV0YWlscz1cIFwgXHU4ODRjOiB7MH1cdTMwMDFcdTUyMTc6IHsxfVx1MzAwMVx1MzBlMVx1MzBjM1x1MzBiYlx1MzBmY1x1MzBiODogezJ9DQotcmVzdG9yZVJlc291cmNlRXJyb3JfbXNnPVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOSAnJ3swfScnIFx1MzA5Mlx1NWZhOVx1NTE0M1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMg0KLUZpbGVNYW5hZ2VyX2ZpbGVSZWFkT25seT1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgJyd7MH0nJyBcdTMwNmZcdThhYWRcdTMwN2ZcdTUzZDZcdTMwOGFcdTVjMDJcdTc1MjhcdTMwNjdcdTMwNTlcdTMwMDINCi1FcnJNc2dfQ291bGROb3REZWxldGU9ezB9IFx1MzA5Mlx1NTI0YVx1OTY2NFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMiB7MX0NCi1yZW5hbWVFcnJvcl9tc2c9XHU1NDBkXHU1MjRkICcnezB9JycgXHUzMDkyICcnezF9JycgXHUzMDZiXHU1OTA5XHU2NmY0XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmXHUzMDAyDQotYmFja3VwRXJyb3JfbXNnPVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOSAnJ3swfScnIFx1MzA5Mlx1MzBkMFx1MzBjM1x1MzBhZlx1MzBhMlx1MzBjM1x1MzBkN1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMg0KLW1hcmtlcl9lcnJfY2Fubm90UmVzb2x2ZVByb3h5PVx1MzBkN1x1MzBlZFx1MzBhZFx1MzBiN1x1MzBmYyB7MH0gXHUzMDkyXHU4OWUzXHU2YzdhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmXHUzMDAyDQotbW9kaWZ5RmlsZUVycm9yX21zZz1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgJyd7MH0nJyBcdTMwNmZcdTU5MDlcdTY2ZjRcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1sb2FkUmVzb3VyY2VFcnJvcl9tc2c9XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5ICcnezB9JycgXHUzMDkyXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmXHUzMDAyDQotbG9hZFJlc291cmNlRXJyb3JXaXRoUmVhc29uX21zZz1cdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjkgJyd7MH0nJyBcdTMwOTJcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDIgXHU3NDA2XHU3NTMxOiB7MX0NCi1pbnZhbGlkTGlicmFyeUZpbGVFcnJvcl9tc2c9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyDQotZmlsZU5vdEZvdW5kRXJyb3JfbXNnPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBiOVx1MzBkYVx1MzBmY1x1MzBiOSAnJ3swfScnIFx1MzA2N1x1MzA2Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzBmYlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMg0KLW5vcm1hbGl6ZVVSSUVycm9yX21zZz0nJ3swfScnIFx1MzA2Ylx1NWJmZVx1MzA1OVx1MzA4Ylx1NmI2M1x1ODk4Zlx1NTMxNlx1MzA1NVx1MzA4Y1x1MzA1ZiBVUkkgXHUzMDRjXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmXHUzMDAyDQotbW92ZUVycm9yX21zZz0nJ3swfScnIFx1MzA5MiAnJ3sxfScnIFx1MzA2Ylx1NzlmYlx1NTJkNVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMiBcdTMwNTNcdTMwNmVcdTViOWJcdTUxNDhcdTMwNmZcdTY1ZTJcdTMwNmJcdTViNThcdTU3MjhcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi1tb2RpZnlSZWFkT25seUZpbGVFcnJvcl9tc2c9XHU4YWFkXHUzMDdmXHU1M2Q2XHUzMDhhXHU1YzAyXHU3NTI4XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZmXHU1OTA5XHU2NmY0XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzOiB7MH0NCi1tb3ZlUmVzb3VyY2VFcnJvcl9tc2c9XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5ICcnezB9JycgXHUzMDRjXHUzMDAxXHUzMGIzXHUzMGRmXHUzMGMzXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDZhXHUzMDQ0XHUzMGQxXHUzMGZjXHUzMGI3XHUzMGI5XHUzMGJmXHUzMGYzXHUzMGI5XHU2NGNkXHU0ZjVjXHUzMDZiXHU1NDJiXHUzMDdlXHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyDQotbW9kaWZ5RmlsZXNFcnJvcl9tc2c9MSBcdTMwNjRcdTRlZTVcdTRlMGFcdTMwNmVcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwOTJcdTU5MDlcdTY2ZjRcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDINCi1yZXNvdXJjZU91dE9mU3luY2hfbXNnPVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOSB7MH0gXHUzMDZmXHU1NDBjXHU2NzFmXHUzMDRjXHU1M2Q2XHUzMDhjXHUzMDY2XHUzMDRhXHUzMDg5XHUzMDVhXHUzMDAxXHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDU5XHUzMDhiXHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWxvYWRMaWJyYXJ5VGFza19uYW1lPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLW1vdmVEYXRhVGFza19uYW1lPVx1MzBjN1x1MzBmY1x1MzBiZlx1MzA5Mlx1NzlmYlx1NTJkNVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLXNhdmVMaWJyYXJ5VGFza19uYW1lPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1NGZkZFx1N2JhMVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLWxvYWRSZXNvdXJjZXNUYXNrX25hbWU9XHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZlXHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDkyXHUzMGUxXHUzMGUyXHUzMGVhXHUzMGZjXHUzMDZiXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotbWlncmF0ZUNvbnRlbnREZXNjcmlwdGlvbnNUYXNrX25hbWU9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMGZiXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMDZlXHU4YWFjXHU2NjBlXHUzMDkyXHUzMGRlXHUzMGE0XHUzMGIwXHUzMGVjXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotZml4UHJlc2VudGF0aW9uTmFtZVRhc2tfbmFtZT1cdTMwNTlcdTMwNzlcdTMwNjZcdTMwNmVcdTMwZDZcdTMwZWNcdTMwZmNcdTMwYWZcdTMwYzBcdTMwYTZcdTMwZjNcdTMwZmJcdTMwYThcdTMwZWNcdTMwZTFcdTMwZjNcdTMwYzhcdTMwNmVcdTU0MGRcdTUyNGRcdTMwNmJcdTMwY2NcdTMwZWIvXHU3YTdhXHUzMDZlXHU4ODY4XHU3OTNhXHU1NDBkXHUzMDkyXHU4YTJkXHU1YjlhXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcl9jb3VsZE5vdFJlc29sdmVQcm94eT1cdTMwZDdcdTMwZWRcdTMwYWRcdTMwYjdcdTMwZmMgJyd7MH0nJyBcdTMwOTJcdTg5ZTNcdTZjN2FcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDINCi1yZWZyZXNoTGlicmFyeUZpbGVzVGFza19uYW1lPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBiOVx1MzBkYVx1MzBmY1x1MzBiOVx1MzA2N1x1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzBmYlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NjZmNFx1NjViMFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMg0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPVx1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2Zlx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlx1NjViMFx1MzA1N1x1MzA0NFx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1MzA2ZSB7MH0gXHUzMDZiXHUzMGEyXHUzMGMzXHUzMGQ3XHUzMGIwXHUzMGVjXHUzMGZjXHUzMGM5XHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTNiMGU2NS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZE5hbWVFcnJvcl9tc2c9Jyd7MH0nJyBcdWM3NzRcdWI5ODRcdWM3NzQgXHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4gXHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4YyBcdWM3NzRcdWI5ODRcdWM1ZDBcdWIyOTQgXHViMmU0XHVjNzRjIFx1YmIzOFx1Yzc5MFx1Yjk3YyBcdWQzZWNcdWQ1NjhcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNDogXFwgLyA6ICogPyAiIDwgPiB8DQotb2JqTm90Rm91bmRFcnJvcl9tc2c9SURcdWFjMDAgJyd7MH0nJ1x1Yzc3OCBcdWM2MjRcdWJlMGNcdWM4MWRcdWQyYjhcdWI5N2MgXHVjYzNlXHVjNzQ0IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotbG9hZExpYnJhcnlFcnJvcl9tc2c9XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWI4NWNcdWI0ZGNcdWQ1NThcdWIyOTQgXHVjOTExXHVjNWQwIFx1YzYyNFx1Yjk1OFx1YWMwMCBcdWJjMWNcdWMwZGRcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotbG9hZExpYnJhcnlFcnJvcl9kZXRhaWxzPVwgXCBcdWQ1ODk6IHswfSwgXHVjNWY0OiB7MX0sIFx1YmE1NFx1YzJkY1x1YzljMDogezJ9DQotcmVzdG9yZVJlc291cmNlRXJyb3JfbXNnPScnezB9JycgXHVjNzkwXHVjNmQwXHVjNzQ0IFx1YmNmNVx1YzZkMFx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLUZpbGVNYW5hZ2VyX2ZpbGVSZWFkT25seT0nJ3swfScnIFx1ZDMwY1x1Yzc3Y1x1Yzc0MCBcdWM3N2RcdWFlMzAgXHVjODA0XHVjNmE5XHVjNzg1XHViMmM4XHViMmU0Lg0KLUVyck1zZ19Db3VsZE5vdERlbGV0ZT17MH0gXHVkNTZkXHViYWE5XHVjNzQ0IFx1YzBhZFx1YzgxY1x1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiB7MX0NCi1yZW5hbWVFcnJvcl9tc2c9XHVjNzc0XHViOTg0XHVjNzQ0ICcnezB9JydcdWM1ZDBcdWMxMWMgJyd7MX0nJyhcdWM3M2MpXHViODVjIFx1YmMxNFx1YWZjMCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWJhY2t1cEVycm9yX21zZz0nJ3swfScnIFx1Yzc5MFx1YzZkMFx1Yzc0NCBcdWJjMzFcdWM1YzVcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1tYXJrZXJfZXJyX2Nhbm5vdFJlc29sdmVQcm94eT17MH0gXHVkNTA0XHViODVkXHVjMmRjXHViOTdjIFx1ZDU3NFx1YzExZFx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLW1vZGlmeUZpbGVFcnJvcl9tc2c9Jyd7MH0nJyBcdWQzMGNcdWM3N2NcdWM3NDQgXHVjMjE4XHVjODE1XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotbG9hZFJlc291cmNlRXJyb3JfbXNnPScnezB9JycgXHVjNzkwXHVjNmQwXHVjNzQ0IFx1Yjg1Y1x1YjRkY1x1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWxvYWRSZXNvdXJjZUVycm9yV2l0aFJlYXNvbl9tc2c9Jyd7MH0nJyBcdWM3OTBcdWM2ZDBcdWM3NDQgXHViODVjXHViNGRjXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuIFx1Yzc3NFx1YzcyMDogezF9DQotaW52YWxpZExpYnJhcnlGaWxlRXJyb3JfbXNnPVx1YzYyY1x1YmMxNFx1Yjk3NFx1YzljMCBcdWM1NGFcdWM3NDAgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWQzMGNcdWM3N2M6DQotZmlsZU5vdEZvdW5kRXJyb3JfbXNnPVx1Yzc5MVx1YzVjNVx1YWNmNVx1YWMwNCAnJ3swfScnXHVjNWQwXHVjMTFjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1Y2MzZVx1Yzc0NCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLW5vcm1hbGl6ZVVSSUVycm9yX21zZz0nJ3swfScnXHVjNzU4IFx1Yzc3Y1x1YmMxOFx1ZDY1NFx1YjQxYyBVUklcdWI5N2MgXHVjYzNlXHVjNzQ0IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotbW92ZUVycm9yX21zZz0nJ3swfScnXHVjNzQ0KFx1Yjk3YykgJyd7MX0nJyhcdWM3M2MpXHViODVjIFx1Yzc3NFx1YjNkOVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcdWIzMDBcdWMwYzFcdWM3NzQgXHVjNzc0XHViYmY4IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1tb2RpZnlSZWFkT25seUZpbGVFcnJvcl9tc2c9XHVjNzdkXHVhZTMwIFx1YzgwNFx1YzZhOSBcdWQzMGNcdWM3N2NcdWM3NDQgXHVjMjE4XHVjODE1XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWM3NGM6IHswfQ0KLW1vdmVSZXNvdXJjZUVycm9yX21zZz0nJ3swfScnIFx1Yzc5MFx1YzZkMFx1Yzc3NCBcdWQ2NTVcdWM1N2RcdWI0MThcdWM5YzAgXHVjNTRhXHVjNzQwIFx1YzljMFx1YzE4ZFx1YzEzMSBcdWM4NzBcdWM3OTFcdWM1ZDAgXHVhZDAwXHViODI4XHViNDI5XHViMmM4XHViMmU0Lg0KLW1vZGlmeUZpbGVzRXJyb3JfbXNnPVx1ZDU1OFx1YjA5OCBcdWM3NzRcdWMwYzFcdWM3NTggXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YzIxOFx1YzgxNVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLXJlc291cmNlT3V0T2ZTeW5jaF9tc2c9XHVjNzkwXHVjNmQwXHVjNzc0IFx1YjNkOVx1YWUzMFx1ZDY1NFx1YjQxOFx1YzljMCBcdWM1NGFcdWM3M2NcdWJhNzAgXHViMmU0XHVjMmRjIFx1Yjg1Y1x1YjRkY1x1YjQxOFx1YzViNFx1YzU3YyBcdWQ1NjlcdWIyYzhcdWIyZTQuIHswfQ0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1sb2FkTGlicmFyeVRhc2tfbmFtZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1Yjg1Y1x1YjRkYyBcdWM5MTEuLi4NCi1tb3ZlRGF0YVRhc2tfbmFtZT1cdWIzNzBcdWM3NzRcdWQxMzAgXHVjNzc0XHViM2Q5IFx1YzkxMS4uLg0KLXNhdmVMaWJyYXJ5VGFza19uYW1lPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVjODAwXHVjN2E1IFx1YzkxMS4uLg0KLWxvYWRSZXNvdXJjZXNUYXNrX25hbWU9XHViYWE4XHViNGUwIFx1Yzc5MFx1YzZkMFx1Yzc0NCBcdWJhNTRcdWJhYThcdWI5YWNcdWM1ZDAgXHViODVjXHViNGRjXHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLW1pZ3JhdGVDb250ZW50RGVzY3JpcHRpb25zVGFza19uYW1lPVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWNlZThcdWQxNTBcdWNlMjAgXHVjMTI0XHViYTg1IFx1Yzc3NFx1YzhmYyBcdWM5MTEuLi4NCi1maXhQcmVzZW50YXRpb25OYW1lVGFza19uYW1lPVx1YmFhOFx1YjRlMCBcdWM3OTFcdWM1YzVcdWJkODRcdWI5NTggXHVjNjk0XHVjMThjXHVjNzU4IFx1YjExMChudWxsKSBcdWI2MTBcdWIyOTQgXHViZTQ4IFx1ZDQ1Y1x1YzJkYyBcdWM3NzRcdWI5ODRcdWM3NDQgXHVkNTc0XHViMmY5IFx1Yzc3NFx1Yjk4NFx1YzczY1x1Yjg1YyBcdWMxMjRcdWM4MTVcdWQ1NThcdWIyOTQgXHVjOTExLi4uDQotVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcl9jb3VsZE5vdFJlc29sdmVQcm94eT0nJ3swfScnIFx1ZDUwNFx1Yjg1ZFx1YzJkY1x1Yjk3YyBcdWQ1NzRcdWMxMWRcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1yZWZyZXNoTGlicmFyeUZpbGVzVGFza19uYW1lPVx1Yzc5MVx1YzVjNVx1YWNmNVx1YWMwNFx1Yzc1OCBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVkMzBjXHVjNzdjIFx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNThcdWFlMzANCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1cdWMxMjBcdWQwZGRcdWQ1NWMgXHVkMzBjXHVjNzdjXHVjNzQwIFx1YzljMFx1YzZkMFx1YjQxOFx1YzljMCBcdWM1NGFcdWMyYjVcdWIyYzhcdWIyZTQuIHswfSBcdWMwYzggXHViYzg0XHVjODA0XHVjNzNjXHViODVjIFx1YzVjNVx1YWRmOFx1YjgwOFx1Yzc3NFx1YjRkY1x1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4gDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhM2I0Y2U0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1pbnZhbGlkTmFtZUVycm9yX21zZz1PIG5vbWUgJyd7MH0nJyBcdTAwZTkgaW52XHUwMGUxbGlkby4gTyBub21lIGRvIGVsZW1lbnRvIGRlIG1cdTAwZTl0b2RvIG5cdTAwZTNvIHBvZGUgY29udGVyIG9zIHNlZ3VpbnRlcyBjYXJhY3RlcmVzOiBcXCAvIDogKiA/ICIgPCA+IHwNCi1vYmpOb3RGb3VuZEVycm9yX21zZz1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBsb2NhbGl6YXIgbyBvYmpldG8gY29tIG8gaWQgJyd7MH0nJw0KLWxvYWRMaWJyYXJ5RXJyb3JfbXNnPUVycm9zIGVuY29udHJhZG9zIGR1cmFudGUgbyBjYXJyZWdhbWVudG8gZGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3M6DQotbG9hZExpYnJhcnlFcnJvcl9kZXRhaWxzPVwgXCBsaW5oYTogezB9LCBjb2x1bmE6IHsxfSwgbWVuc2FnZW06IHsyfQ0KLXJlc3RvcmVSZXNvdXJjZUVycm9yX21zZz1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCByZXN0YXVyYXIgbyByZWN1cnNvICcnezB9JycNCi1GaWxlTWFuYWdlcl9maWxlUmVhZE9ubHk9TyBhcnF1aXZvICcnezB9JycgXHUwMGU5IGRlIGxlaXR1cmENCi1FcnJNc2dfQ291bGROb3REZWxldGU9Tlx1MDBlM28gZm9pIHBvc3NcdTAwZWR2ZWwgZXhjbHVpciB7MH0uIHsxfQ0KLXJlbmFtZUVycm9yX21zZz1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCByZW5vbWVhciAnJ3swfScnIHBhcmEgJyd7MX0nJw0KLWJhY2t1cEVycm9yX21zZz1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBmYXplciBvIGJhY2t1cCBkbyByZWN1cnNvICcnezB9JycNCi1tYXJrZXJfZXJyX2Nhbm5vdFJlc29sdmVQcm94eT1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCByZXNvbHZlciBvIHByb3h5IHswfQ0KLW1vZGlmeUZpbGVFcnJvcl9tc2c9Tlx1MDBlM28gZm9pIHBvc3NcdTAwZWR2ZWwgbW9kaWZpY2FyIG8gYXJxdWl2byAnJ3swfScnDQotbG9hZFJlc291cmNlRXJyb3JfbXNnPU5cdTAwZTNvIGZvaSBwb3NzXHUwMGVkdmVsIGNhcnJlZ2FyIG8gcmVjdXJzbyAnJ3swfScnDQotbG9hZFJlc291cmNlRXJyb3JXaXRoUmVhc29uX21zZz1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBjYXJyZWdhciBvIHJlY3Vyc28gJyd7MH0nJy4gTW90aXZvOiB7MX0NCi1pbnZhbGlkTGlicmFyeUZpbGVFcnJvcl9tc2c9QXJxdWl2byBkZSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBpbnZcdTAwZTFsaWRvOg0KLWZpbGVOb3RGb3VuZEVycm9yX21zZz1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBsb2NhbGl6YXIgcXVhbHF1ZXIgYXJxdWl2byBkYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBubyBlc3BhXHUwMGU3byBkZSB0cmFiYWxobyAnJ3swfScnDQotbm9ybWFsaXplVVJJRXJyb3JfbXNnPU5cdTAwZTNvIGZvaSBwb3NzXHUwMGVkdmVsIGxvY2FsaXphciBvIFVSSSBub3JtYWxpemFkbyBwYXJhICcnezB9JycNCi1tb3ZlRXJyb3JfbXNnPU5cdTAwZTNvIGZvaSBwb3NzXHUwMGVkdmVsIG1vdmVyICcnezB9JycgcGFyYSAnJ3sxfScnLiBPIGRlc3Rpbm8galx1MDBlMSBleGlzdGUuDQotbW9kaWZ5UmVhZE9ubHlGaWxlRXJyb3JfbXNnPU5cdTAwZTNvIGZvaSBwb3NzXHUwMGVkdmVsIG1vZGlmaWNhciBvKHMpIGFycXVpdm8ocykgZGUgbGVpdHVyYTogezB9DQotbW92ZVJlc291cmNlRXJyb3JfbXNnPU8gcmVjdXJzbyAnJ3swfScnIGVzdFx1MDBlMSBlbnZvbHZpZG8gZW0gdW1hIG9wZXJhXHUwMGU3XHUwMGUzbyBwZXJzaXN0ZW50ZSBxdWUgblx1MDBlM28gZm9pIGNvbmZpcm1hZGEuDQotbW9kaWZ5RmlsZXNFcnJvcl9tc2c9Tlx1MDBlM28gZm9pIHBvc3NcdTAwZWR2ZWwgbW9kaWZpY2FyIHVtIG91IG1haXMgYXJxdWl2b3MNCi1yZXNvdXJjZU91dE9mU3luY2hfbXNnPU8gcmVjdXJzbyBlc3RcdTAwZTEgZm9yYSBkZSBzaW5jcm9uaXphXHUwMGU3XHUwMGUzbyBlIHByZWNpc2Egc2VyIHJlY2FycmVnYWRvOiB7MH0NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotbG9hZExpYnJhcnlUYXNrX25hbWU9Q2FycmVnYW5kbyBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy4uLg0KLW1vdmVEYXRhVGFza19uYW1lPU1vdmVuZG8gZGFkb3MuLi4NCi1zYXZlTGlicmFyeVRhc2tfbmFtZT1TYWx2YW5kbyBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy4uLg0KLWxvYWRSZXNvdXJjZXNUYXNrX25hbWU9Q2FycmVnYW5kbyB0b2RvcyBvcyByZWN1cnNvcyBuYSBtZW1cdTAwZjNyaWEuLi4NCi1taWdyYXRlQ29udGVudERlc2NyaXB0aW9uc1Rhc2tfbmFtZT1NaWdyYW5kbyBkZXNjcmlcdTAwZTdcdTAwZjVlcyBkZSBjb250ZVx1MDBmYWRvIGRlIHByb2Nlc3Nvcy4uLg0KLWZpeFByZXNlbnRhdGlvbk5hbWVUYXNrX25hbWU9Q29uZmlndXJhbmRvIG8gbm9tZSBkYSBhcHJlc2VudGFcdTAwZTdcdTAwZTNvIG51bGEvdmF6aWEgZGUgdG9kb3Mgb3MgZWxlbWVudG9zIGRlIGRpdmlzXHUwMGUzbyBwYXJhIHNldXMgbm9tZXMuLi4NCi1VbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyX2NvdWxkTm90UmVzb2x2ZVByb3h5PU5cdTAwZTNvIGZvaSBwb3NzXHUwMGVkdmVsIHJlc29sdmVyIG8gcHJveHkgJyd7MH0nJw0KLXJlZnJlc2hMaWJyYXJ5RmlsZXNUYXNrX25hbWU9QXR1YWxpemFuZG8gYXJxdWl2b3MgZGUgYmlibGlvdGVjYSBubyBlc3BhXHUwMGU3byBkZSB0cmFiYWxobw0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPU9zIGFycXVpdm9zIHNlbGVjaW9uYWRvcyBuXHUwMGUzbyBzXHUwMGUzbyBzdXBvcnRhZG9zIC0gZmFcdTAwZTdhIHVwZ3JhZGUgcGFyYSB1bWEgdmVyc1x1MDBlM28gbWFpcyByZWNlbnRlIGRvIHswfS4gDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZTk3OGFjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1pbnZhbGlkTmFtZUVycm9yX21zZz1cdTU0MGRcdTc5ZjBcdTIwMWN7MH1cdTIwMWRcdTY1ZTBcdTY1NDhcdTMwMDJcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTU0MGRcdTc5ZjBcdTRlMGRcdTgwZmRcdTUzMDVcdTU0MmJcdThmZDlcdTRlOWJcdTViNTdcdTdiMjZcdWZmMWFcXCAvIDogKiA/ICIgPCA+IHwNCi1vYmpOb3RGb3VuZEVycm9yX21zZz1cdTYyN2VcdTRlMGRcdTUyMzBcdTY4MDdcdThiYzZcdTRlM2FcdTIwMWN7MH1cdTIwMWRcdTc2ODRcdTViZjlcdThjNjENCi1sb2FkTGlicmFyeUVycm9yX21zZz1cdTg4YzVcdTUxNjVcdTY1YjlcdTZjZDVcdTVlOTNcdTY1ZjZcdTkwNDdcdTUyMzBcdTk1MTlcdThiZWZcdWZmMWENCi1sb2FkTGlicmFyeUVycm9yX2RldGFpbHM9XCBcIFx1ODg0Y1x1ZmYxYXswfVx1ZmYwY1x1NTIxN1x1ZmYxYXsxfVx1ZmYwY1x1NmQ4OFx1NjA2Zlx1ZmYxYXsyfQ0KLXJlc3RvcmVSZXNvdXJjZUVycm9yX21zZz1cdTY1ZTBcdTZjZDVcdTYwNjJcdTU5MGRcdThkNDRcdTZlOTBcdTIwMWN7MH1cdTIwMWQNCi1GaWxlTWFuYWdlcl9maWxlUmVhZE9ubHk9XHU2NTg3XHU0ZWY2XHUyMDFjezB9XHUyMDFkXHU0ZTNhXHU1M2VhXHU4YmZiDQotRXJyTXNnX0NvdWxkTm90RGVsZXRlPVx1NjcyYVx1ODBmZFx1NTIyMFx1OTY2NCB7MH1cdTMwMDJ7MX0NCi1yZW5hbWVFcnJvcl9tc2c9XHU2NWUwXHU2Y2Q1XHU1YzA2XHUyMDFjezB9XHUyMDFkXHU5MWNkXHU1NDdkXHU1NDBkXHU0ZTNhXHUyMDFjezF9XHUyMDFkDQotYmFja3VwRXJyb3JfbXNnPVx1NjVlMFx1NmNkNVx1NTkwN1x1NGVmZFx1OGQ0NFx1NmU5MFx1MjAxY3swfVx1MjAxZA0KLW1hcmtlcl9lcnJfY2Fubm90UmVzb2x2ZVByb3h5PVx1NjVlMFx1NmNkNVx1ODllM1x1Njc5MFx1NGVlM1x1NzQwNlx1NjcwZFx1NTJhMVx1NTY2OCB7MH0NCi1tb2RpZnlGaWxlRXJyb3JfbXNnPVx1NjVlMFx1NmNkNVx1NGZlZVx1NjUzOVx1NjU4N1x1NGVmNlx1MjAxY3swfVx1MjAxZA0KLWxvYWRSZXNvdXJjZUVycm9yX21zZz1cdTY1ZTBcdTZjZDVcdTg4YzVcdTUxNjVcdThkNDRcdTZlOTBcdTIwMWN7MH1cdTIwMWQNCi1sb2FkUmVzb3VyY2VFcnJvcldpdGhSZWFzb25fbXNnPVx1NjVlMFx1NmNkNVx1ODhjNVx1NTE2NVx1OGQ0NFx1NmU5MFx1MjAxY3swfVx1MjAxZFx1MzAwMlx1NTM5Zlx1NTZlMFx1ZmYxYXsxfQ0KLWludmFsaWRMaWJyYXJ5RmlsZUVycm9yX21zZz1cdTY1YjlcdTZjZDVcdTVlOTNcdTY1ODdcdTRlZjZcdTY1ZTBcdTY1NDhcdWZmMWENCi1maWxlTm90Rm91bmRFcnJvcl9tc2c9XHU1NzI4XHU1ZGU1XHU0ZjVjXHU3YTdhXHU5NWY0XHUyMDFjezB9XHUyMDFkXHU0ZTJkXHU2MjdlXHU0ZTBkXHU1MjMwXHU0ZWZiXHU0ZjU1XHU2NWI5XHU2Y2Q1XHU1ZTkzXHU2NTg3XHU0ZWY2DQotbm9ybWFsaXplVVJJRXJyb3JfbXNnPVx1NjI3ZVx1NGUwZFx1NTIzMFx1MjAxY3swfVx1MjAxZFx1NzY4NFx1ODljNFx1ODMwM1x1NTMxNiBVUkkNCi1tb3ZlRXJyb3JfbXNnPVx1NjVlMFx1NmNkNVx1NWMwNlx1MjAxY3swfVx1MjAxZFx1NzlmYlx1NTJhOFx1NTIzMFx1MjAxY3sxfVx1MjAxZFx1MzAwMlx1NzZlZVx1NjgwN1x1NGY0ZFx1N2Y2ZVx1NWRmMlx1NWI1OFx1NTcyOFx1MzAwMg0KLW1vZGlmeVJlYWRPbmx5RmlsZUVycm9yX21zZz1cdTY1ZTBcdTZjZDVcdTRmZWVcdTY1MzlcdTUzZWFcdThiZmJcdTY1ODdcdTRlZjZcdWZmMWF7MH0NCi1tb3ZlUmVzb3VyY2VFcnJvcl9tc2c9XHU4ZDQ0XHU2ZTkwXHUyMDFjezB9XHUyMDFkXHU2ZDg5XHU1M2NhXHU1MjMwXHU4ZmQ4XHU2NzJhXHU2M2QwXHU0ZWE0XHU3Njg0XHU2MzAxXHU0ZTQ1XHU2MDI3XHU2NGNkXHU0ZjVjXHUzMDAyDQotbW9kaWZ5RmlsZXNFcnJvcl9tc2c9XHU2NWUwXHU2Y2Q1XHU0ZmVlXHU2NTM5XHU0ZTAwXHU0ZTJhXHU2MjE2XHU1OTFhXHU0ZTJhXHU2NTg3XHU0ZWY2DQotcmVzb3VyY2VPdXRPZlN5bmNoX21zZz1cdThkNDRcdTZlOTBcdTRlMGRcdTU0MGNcdTZiNjVcdWZmMGNcdTk3MDBcdTg5ODFcdTkxY2RcdTY1YjBcdTg4YzVcdTUxNjVcdWZmMWF7MH0NCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotbG9hZExpYnJhcnlUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU4OGM1XHU1MTY1XHU2NWI5XHU2Y2Q1XHU1ZTkzLi4uDQotbW92ZURhdGFUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU3OWZiXHU1MmE4XHU2NTcwXHU2MzZlLi4uDQotc2F2ZUxpYnJhcnlUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU0ZmRkXHU1YjU4XHU2NWI5XHU2Y2Q1XHU1ZTkzLi4uDQotbG9hZFJlc291cmNlc1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTVjMDZcdTYyNDBcdTY3MDlcdThkNDRcdTZlOTBcdTg4YzVcdTUxNjVcdTUxODVcdTViNTguLi4NCi1taWdyYXRlQ29udGVudERlc2NyaXB0aW9uc1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdThmYzFcdTc5ZmJcdTZkNDFcdTdhMGJcdTUxODVcdTViYjlcdTYzY2ZcdThmZjAuLi4NCi1maXhQcmVzZW50YXRpb25OYW1lVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NWMwNlx1NmJjZlx1NGUyYVx1NTIwNlx1ODllM1x1NTE0M1x1N2QyMFx1NzY4NFx1N2E3YVx1NjYzZVx1NzkzYVx1NTQwZFx1NzlmMFx1OGJiZVx1N2Y2ZVx1NGUzYVx1NTE0M1x1N2QyMFx1NTQwNFx1ODFlYVx1NzY4NFx1NTQwZFx1NzlmMC4uLg0KLVVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXJfY291bGROb3RSZXNvbHZlUHJveHk9XHU2NWUwXHU2Y2Q1XHU4OWUzXHU2NzkwXHU0ZWUzXHU3NDA2XHU2NzBkXHU1MmExXHU1NjY4XHUyMDFjezB9XHUyMDFkDQotcmVmcmVzaExpYnJhcnlGaWxlc1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTUyMzdcdTY1YjBcdTVkZTVcdTRmNWNcdTdhN2FcdTk1ZjRcdTRlMmRcdTc2ODRcdTVlOTNcdTY1ODdcdTRlZjYNCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1cdTkwMDlcdTViOWFcdTc2ODRcdTY1ODdcdTRlZjZcdTRlMGRcdTUzZDdcdTY1MmZcdTYzMDFcdWZmMGNcdThiZjdcdTUzNDdcdTdlYTdcdTUyMzAgezB9IFx1NzY4NFx1NjZmNFx1NjViMFx1NzI0OFx1NjcyY1x1MzAwMg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU2ZjMwMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZE5hbWVFcnJvcl9tc2c9XHU1NDBkXHU3YTMxICcnezB9JycgXHU3MTIxXHU2NTQ4XHUzMDAyXHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU1NDBkXHU3YTMxXHU0ZTBkXHU4MGZkXHU1MzA1XHU1NDJiXHU0ZTBiXHU1MjE3XHU1YjU3XHU1MTQzXHVmZjFhXFwgLyA6ICogPyAiIDwgPiB8DQotb2JqTm90Rm91bmRFcnJvcl9tc2c9XHU2MjdlXHU0ZTBkXHU1MjMwIElEIFx1NzBiYSAnJ3swfScnIFx1NzY4NFx1NzI2OVx1NGVmNg0KLWxvYWRMaWJyYXJ5RXJyb3JfbXNnPVx1NTcyOFx1OGYwOVx1NTE2NVx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NjY0Mlx1NzY3Y1x1NzNmZVx1OTMyZlx1OGFhNFx1ZmYxYQ0KLWxvYWRMaWJyYXJ5RXJyb3JfZGV0YWlscz1cIFwgXHU4ODRjXHVmZjFhezB9XHVmZjBjXHU3NmY0XHU2YjA0XHVmZjFhezF9XHVmZjBjXHU4YTBhXHU2MDZmXHVmZjFhezJ9DQotcmVzdG9yZVJlc291cmNlRXJyb3JfbXNnPVx1NzEyMVx1NmNkNVx1OTA4NFx1NTM5Zlx1OGNjN1x1NmU5MCAnJ3swfScnDQotRmlsZU1hbmFnZXJfZmlsZVJlYWRPbmx5PVx1NmE5NFx1Njg0OCAnJ3swfScnIFx1NjYyZlx1NTUyZlx1OGI4MFx1NzY4NA0KLUVyck1zZ19Db3VsZE5vdERlbGV0ZT1cdTcxMjFcdTZjZDVcdTUyMmFcdTk2NjQgezB9XHUzMDAyezF9DQotcmVuYW1lRXJyb3JfbXNnPVx1NzEyMVx1NmNkNVx1NWMwNyAnJ3swfScnIFx1OTFjZFx1NjViMFx1NTQ3ZFx1NTQwZFx1NzBiYSAnJ3sxfScnDQotYmFja3VwRXJyb3JfbXNnPVx1NzEyMVx1NmNkNVx1NTA5OVx1NGVmZFx1OGNjN1x1NmU5MCAnJ3swfScnDQotbWFya2VyX2Vycl9jYW5ub3RSZXNvbHZlUHJveHk9XHU3MTIxXHU2Y2Q1XHU4OWUzXHU2NzkwIFByb3h5IHswfQ0KLW1vZGlmeUZpbGVFcnJvcl9tc2c9XHU3MTIxXHU2Y2Q1XHU0ZmVlXHU2NTM5XHU2YTk0XHU2ODQ4ICcnezB9JycNCi1sb2FkUmVzb3VyY2VFcnJvcl9tc2c9XHU3MTIxXHU2Y2Q1XHU4ZjA5XHU1MTY1XHU4Y2M3XHU2ZTkwICcnezB9JycNCi1sb2FkUmVzb3VyY2VFcnJvcldpdGhSZWFzb25fbXNnPVx1NzEyMVx1NmNkNVx1OGYwOVx1NTE2NVx1OGNjN1x1NmU5MCAnJ3swfScnXHUzMDAyXHU1MzlmXHU1NmUwXHVmZjFhezF9DQotaW52YWxpZExpYnJhcnlGaWxlRXJyb3JfbXNnPVx1NzEyMVx1NjU0OFx1NzY4NFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1NmE5NFx1ZmYxYQ0KLWZpbGVOb3RGb3VuZEVycm9yX21zZz1cdTU3MjhcdTVkZTVcdTRmNWNcdTUzNDAgJyd7MH0nJyBcdTRlMmRcdTYyN2VcdTRlMGRcdTUyMzBcdTRlZmJcdTRmNTVcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTZhOTRcdTY4NDgNCi1ub3JtYWxpemVVUklFcnJvcl9tc2c9XHU2MjdlXHU0ZTBkXHU1MjMwICcnezB9JycgXHU3Njg0XHU2YTE5XHU2ZTk2XHU1MzE2IFVSSQ0KLW1vdmVFcnJvcl9tc2c9XHU3MTIxXHU2Y2Q1XHU1YzA3ICcnezB9JycgXHU3OWZiXHU4MWYzICcnezF9JydcdTMwMDJcdTc2ZWVcdTc2ODRcdTU3MzBcdTVkZjJcdTViNThcdTU3MjhcdTMwMDINCi1tb2RpZnlSZWFkT25seUZpbGVFcnJvcl9tc2c9XHU3MTIxXHU2Y2Q1XHU0ZmVlXHU2NTM5XHU1NTJmXHU4YjgwXHU2YTk0XHVmZjFhezB9DQotbW92ZVJlc291cmNlRXJyb3JfbXNnPVx1OGNjN1x1NmU5MCAnJ3swfScnIFx1NmQ4OVx1NTNjYVx1NWMxYVx1NjcyYVx1NzhiYVx1NWI5YVx1NzY4NFx1NjMwMVx1N2U4Y1x1NjAyN1x1NGY1Y1x1Njk2ZFx1MzAwMg0KLW1vZGlmeUZpbGVzRXJyb3JfbXNnPVx1NzEyMVx1NmNkNVx1NGZlZVx1NjUzOVx1NGUwMFx1NjIxNlx1NTkxYVx1NTAwYlx1NmE5NFx1Njg0OA0KLXJlc291cmNlT3V0T2ZTeW5jaF9tc2c9XHU4Y2M3XHU2ZTkwXHU0ZTBkXHU1NDBjXHU2YjY1XHVmZjBjXHU1ZmM1XHU5ODA4XHU5MWNkXHU2NWIwXHU4ZjA5XHU1MTY1XHVmZjFhezB9DQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWxvYWRMaWJyYXJ5VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1OGYwOVx1NTE2NVx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYi4uLg0KLW1vdmVEYXRhVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NzlmYlx1NTJkNVx1OGNjN1x1NjU5OS4uLg0KLXNhdmVMaWJyYXJ5VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NTEzMlx1NWI1OFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYi4uLg0KLWxvYWRSZXNvdXJjZXNUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU1YzA3XHU2MjQwXHU2NzA5XHU3Njg0XHU4Y2M3XHU2ZTkwXHU4ZjA5XHU1MTY1XHU1MjMwXHU4YTE4XHU2MWI2XHU5YWQ0XHU0ZTJkLi4uDQotbWlncmF0ZUNvbnRlbnREZXNjcmlwdGlvbnNUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU3OWZiXHU4ZjQ5XHU3YTBiXHU1ZThmXHU1MTY3XHU1YmI5XHU4YWFhXHU2NjBlLi4uDQotZml4UHJlc2VudGF0aW9uTmFtZVRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTVjMDdcdTZiY2ZcdTRlMDBcdTUwMGJcdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjBcdTc2ODRcdTdhN2FcdTUwM2MvXHU3YTdhXHU3NjdkXHU1NDQ4XHU3M2ZlXHU1NDBkXHU3YTMxXHU4YTJkXHU1YjlhXHU3MGJhXHU1MTc2XHU1NDBkXHU3YTMxLi4uDQotVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcl9jb3VsZE5vdFJlc29sdmVQcm94eT1cdTcxMjFcdTZjZDVcdTg5ZTNcdTY3OTAgUHJveHkgJyd7MH0nJw0KLXJlZnJlc2hMaWJyYXJ5RmlsZXNUYXNrX25hbWU9XHU5MWNkXHU2NWIwXHU2NTc0XHU3NDA2XHU1ZGU1XHU0ZjVjXHU1MzQwXHU3Njg0XHU3YTBiXHU1ZjBmXHU1ZWFiXHU2YTk0XHU2ODQ4DQotdmVyc2lvbk1pc21hdGNoX29sZFRvb2w9XHU0ZTBkXHU2NTJmXHU2M2Y0XHU5MDc4XHU1M2Q2XHU3Njg0XHU2YTk0XHU2ODQ4IC0gXHU4YWNiXHU1MzQ3XHU3ZDFhXHU4MWYzXHU4ZjAzXHU2NWIwXHU3Njg0IHswfSBcdTcyNDhcdTY3MmNcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMi8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDIvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNThlNWE5MS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjdlMWU0Yi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIExpYnJhcnkgUGVyc2lzdGVuY2UgKE5MMikKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2U7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNTRmY2E3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX3J1LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZWRkYWRiLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1cdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzAgRVBGIC0gXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDNiXHUwNDM4XHUwNDQ5XHUwNDM1DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODExZmZhMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotaW52YWxpZE5hbWVFcnJvcl9tc2c9XHUwNDFkXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDM1IFx1MDQzOFx1MDQzY1x1MDQ0ZiAnJ3swfScnLiBcdTA0MTIgXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAgXHUwNDNkXHUwNDM1IFx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzZFx1MDQzZSBcdTA0MzFcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDNiXHUwNDM1XHUwNDM0XHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDQ1IFx1MDQ0MVx1MDQzOFx1MDQzY1x1MDQzMlx1MDQzZVx1MDQzYlx1MDQzZVx1MDQzMjogXFwgLyA6ICogPyAiIDwgPiB8DQotb2JqTm90Rm91bmRFcnJvcl9tc2c9XHUwNDFkXHUwNDM1IFx1MDQzZFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzZCBcdTA0M2VcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDIgXHUwNDQxIFx1MDQxOFx1MDQxNCAnJ3swfScnDQotbG9hZExpYnJhcnlFcnJvcl9tc2c9XHUwNDFlXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNhXHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzdcdTA0M2FcdTA0MzUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMjoNCi1sb2FkTGlicmFyeUVycm9yX2RldGFpbHM9XCBcIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzYVx1MDQzMDogezB9LCBcdTA0NDFcdTA0NDJcdTA0M2VcdTA0M2JcdTA0MzFcdTA0MzVcdTA0NDY6IHsxfSwgXHUwNDQxXHUwNDNlXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1OiB7Mn0NCi1yZXN0b3JlUmVzb3VyY2VFcnJvcl9tc2c9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0MzJcdTA0M2VcdTA0NDFcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxICcnezB9JycNCi1GaWxlTWFuYWdlcl9maWxlUmVhZE9ubHk9XHUwNDI0XHUwNDMwXHUwNDM5XHUwNDNiICcnezB9JycgXHUwNDM0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDM1XHUwNDNkIFx1MDQ0Mlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQzZSBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDQ3XHUwNDQyXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotRXJyTXNnX0NvdWxkTm90RGVsZXRlPVx1MDQxZFx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgezB9LiB7MX0NCi1yZW5hbWVFcnJvcl9tc2c9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgJyd7MH0nJyBcdTA0MzIgJyd7MX0nJw0KLWJhY2t1cEVycm9yX21zZz1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDBcdTA0MzVcdTA0MzdcdTA0MzVcdTA0NDBcdTA0MzJcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDNhXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDRlIFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzMCAnJ3swfScnDQotbWFya2VyX2Vycl9jYW5ub3RSZXNvbHZlUHJveHk9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0MzBcdTA0NDJcdTA0NGMgcHJveHkgezB9DQotbW9kaWZ5RmlsZUVycm9yX21zZz1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgJyd7MH0nJw0KLWxvYWRSZXNvdXJjZUVycm9yX21zZz1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDEgJyd7MH0nJw0KLWxvYWRSZXNvdXJjZUVycm9yV2l0aFJlYXNvbl9tc2c9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzdcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxICcnezB9JycuIFx1MDQxZlx1MDQ0MFx1MDQzOFx1MDQ0N1x1MDQzOFx1MDQzZFx1MDQzMDogIHsxfQ0KLWludmFsaWRMaWJyYXJ5RmlsZUVycm9yX21zZz1cdTA0MWRcdTA0MzVcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzI6DQotZmlsZU5vdEZvdW5kRXJyb3JfbXNnPVx1MDQxZFx1MDQzNSBcdTA0M2RcdTA0MzBcdTA0MzlcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzAgXHUwNDNkXHUwNDM4IFx1MDQzZVx1MDQzNFx1MDQzZFx1MDQzMCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzMiBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzkgXHUwNDNlXHUwNDMxXHUwNDNiXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDM4ICcnezB9JycNCi1ub3JtYWxpemVVUklFcnJvcl9tc2c9XHUwNDFkXHUwNDM1IFx1MDQzZFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzZCBcdTA0M2RcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0M2JcdTA0MzhcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgVVJJIFx1MDQzNFx1MDQzYlx1MDQ0ZiAnJ3swfScnDQotbW92ZUVycm9yX21zZz1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzY1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQ0YyAnJ3swfScnIFx1MDQzMiAnJ3sxfScnLiBcdTA0MjZcdTA0MzVcdTA0M2JcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIuDQotbW9kaWZ5UmVhZE9ubHlGaWxlRXJyb3JfbXNnPVx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NGMgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQ0YiwgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDNkXHUwNDMwXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0Mlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQzZSBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDQ3XHUwNDQyXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmOiB7MH0NCi1tb3ZlUmVzb3VyY2VFcnJvcl9tc2c9XHUwNDIwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxICcnezB9JycgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzMiBcdTA0M2RcdTA0MzVcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDhcdTA0MzVcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzYlx1MDQzOFx1MDQ0OVx1MDQzMC4NCi1tb2RpZnlGaWxlc0Vycm9yX21zZz1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQzOFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2VcdTA0MzRcdTA0MzhcdTA0M2QgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQzZFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzYVx1MDQzZSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0M2VcdTA0MzINCi1yZXNvdXJjZU91dE9mU3luY2hfbXNnPVx1MDQyMFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MSBcdTA0M2RcdTA0MzUgXHUwNDQxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkIFx1MDQzOCBcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzVcdTA0M2QgXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZDogezB9DQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWxvYWRMaWJyYXJ5VGFza19uYW1lPVx1MDQxN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzYVx1MDQzMCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLi4uDQotbW92ZURhdGFUYXNrX25hbWU9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NS4uLg0KLXNhdmVMaWJyYXJ5VGFza19uYW1lPVx1MDQyMVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLi4uDQotbG9hZFJlc291cmNlc1Rhc2tfbmFtZT1cdTA0MTdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzdcdTA0M2FcdTA0MzAgXHUwNDMyXHUwNDQxXHUwNDM1XHUwNDQ1IFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzZVx1MDQzMiBcdTA0MzIgXHUwNDNmXHUwNDMwXHUwNDNjXHUwNDRmXHUwNDQyXHUwNDRjLi4uDQotbWlncmF0ZUNvbnRlbnREZXNjcmlwdGlvbnNUYXNrX25hbWU9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzOSBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDNlXHUwNDMyLi4uDQotZml4UHJlc2VudGF0aW9uTmFtZVRhc2tfbmFtZT1cdTA0MTdcdTA0MzBcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzAgXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDRiXHUwNDQ1IFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZCBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDQwXHUwNDM1XHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDNjXHUwNDM4IFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzMFx1MDQzY1x1MDQzOCBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDRiLi4uDQotVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcl9jb3VsZE5vdFJlc29sdmVQcm94eT1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQzMFx1MDQ0Mlx1MDQ0YyBwcm94eSAnJ3swfScnDQotcmVmcmVzaExpYnJhcnlGaWxlc1Rhc2tfbmFtZT1cdTA0MWVcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDNlXHUwNDMyIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0MzIgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDM5IFx1MDQzZVx1MDQzMVx1MDQzYlx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQzOA0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIgXHUwNDNkXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQ0ZVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiAtIFx1MDQzMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4IHswfS4gDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMmEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMmEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmEwMmQwMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMmEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDliZTdiM2QuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgTGlicmFyeSBQZXJzaXN0ZW5jZSAoTkwyYSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMmEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGU2ODIzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kYS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMGQ3ZTI4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gYmlibGlvdGVrc3BlcnNpc3RlbnMNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIzMDVjY2UuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXNfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1pbnZhbGlkTmFtZUVycm9yX21zZz1OYXZuZXQgJyd7MH0nJyBlciB1Z3lsZGlndC4gTWV0b2RlZWxlbWVudG5hdm5ldCBtXHUwMGU1IGlra2UgaW5kZWhvbGRlIGZcdTAwZjhsZ2VuZGUgdGVnbjogXFwgLyA6ICogPyAiIDwgPiB8DQotb2JqTm90Rm91bmRFcnJvcl9tc2c9S2FuIGlra2UgZmluZGUgb2JqZWt0IG1lZCBpZCcnZW4gJyd7MH0nJw0KLWxvYWRMaWJyYXJ5RXJyb3JfbXNnPURlciBlciBvcHN0XHUwMGU1ZXQgZmVqbCB1bmRlciBpbmRsXHUwMGU2c25pbmcgYWYgbWV0b2RlYmlibGlvdGVrOg0KLWxvYWRMaWJyYXJ5RXJyb3JfZGV0YWlscz1cIFwgbGluamU6IHswfSwga29sb25uZTogezF9LCBtZWRkZWxlbHNlOiB7Mn0NCi1yZXN0b3JlUmVzb3VyY2VFcnJvcl9tc2c9S2FuIGlra2UgZ2VuZGFubmUgcmVzc291cmNlbiAnJ3swfScnDQotRmlsZU1hbmFnZXJfZmlsZVJlYWRPbmx5PUZpbGVuICcnezB9JycgZXIgc2tyaXZlYmVza3l0dGV0DQotRXJyTXNnX0NvdWxkTm90RGVsZXRlPUthbiBpa2tlIHNsZXR0ZSB7MH0uIHsxfQ0KLXJlbmFtZUVycm9yX21zZz1LYW4gaWtrZSBvbWRcdTAwZjhiZSAnJ3swfScnIHRpbCAnJ3sxfScnDQotYmFja3VwRXJyb3JfbXNnPUthbiBpa2tlIHNpa2tlcmhlZHNrb3BpZXJlIHJlc3NvdXJjZW4gJyd7MH0nJw0KLW1hcmtlcl9lcnJfY2Fubm90UmVzb2x2ZVByb3h5PUthbiBpa2tlIG9wbFx1MDBmOHNlIHByb3h5ZW4gezB9DQotbW9kaWZ5RmlsZUVycm9yX21zZz1LYW4gaWtrZSBcdTAwZTZuZHJlIGZpbGVuICcnezB9JycNCi1sb2FkUmVzb3VyY2VFcnJvcl9tc2c9S2FuIGlra2UgaW5kbFx1MDBlNnNlIHJlc3NvdXJjZW4gJyd7MH0nJw0KLWxvYWRSZXNvdXJjZUVycm9yV2l0aFJlYXNvbl9tc2c9S2FuIGlra2UgaW5kbFx1MDBlNnNlIHJlc3NvdXJjZW4gJyd7MH0nJy4gXHUwMGM1cnNhZzogezF9DQotaW52YWxpZExpYnJhcnlGaWxlRXJyb3JfbXNnPVVneWxkaWcgbWV0b2RlYmlibGlvdGVrc2ZpbDoNCi1maWxlTm90Rm91bmRFcnJvcl9tc2c9S2FuIGlra2UgZmluZGUgbm9nZW4gbWV0b2RlYmlibGlvdGVrc2ZpbCBpIGFyYmVqZHNvbXJcdTAwZTVkZXQgJyd7MH0nJw0KLW5vcm1hbGl6ZVVSSUVycm9yX21zZz1LYW4gaWtrZSBmaW5kZSBub3JtYWxpc2VyZXQgVVJJIGZvciAnJ3swfScnDQotbW92ZUVycm9yX21zZz1LYW4gaWtrZSBmbHl0dGUgJyd7MH0nJyB0aWwgJyd7MX0nJy4gRGVzdGluYXRpb25lbiBmaW5kZXMgYWxsZXJlZGUuDQotbW9kaWZ5UmVhZE9ubHlGaWxlRXJyb3JfbXNnPUthbiBpa2tlIFx1MDBlNm5kcmUgZW4gZWxsZXIgZmxlcmUgc2tyaXZlYmVza3l0dGVkZSBmaWxlcjogezB9DQotbW92ZVJlc291cmNlRXJyb3JfbXNnPVJlc3NvdXJjZW4gJyd7MH0nJyBlciBvbWZhdHRldCBhZiBlbiBwZXJzaXN0ZW5zZnVua3Rpb24sIHNvbSBpa2tlIGVyIGNvbW1pdHRldC4NCi1tb2RpZnlGaWxlc0Vycm9yX21zZz1LYW4gaWtrZSBcdTAwZTZuZHJlIGVuIGVsbGVyIGZsZXJlIGZpbGVyDQotcmVzb3VyY2VPdXRPZlN5bmNoX21zZz1SZXNzb3VyY2VuIGVyIGlra2Ugc3lua3JvbmlzZXJldCBvZyBza2FsIGluZGxcdTAwZTZzZXMgaWdlbjogezB9DQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLWxvYWRMaWJyYXJ5VGFza19uYW1lPUluZGxcdTAwZTZzZXIgbWV0b2RlYmlibGlvdGVrLi4uDQotbW92ZURhdGFUYXNrX25hbWU9Rmx5dHRlciBkYXRhLi4uDQotc2F2ZUxpYnJhcnlUYXNrX25hbWU9R2VtbWVyIG1ldG9kZWJpYmxpb3Rlay4uLg0KLWxvYWRSZXNvdXJjZXNUYXNrX25hbWU9SW5kbFx1MDBlNnNlciBhbGxlIHJlc3NvdXJjZXIgaSBodWtvbW1lbHNlLi4uDQotbWlncmF0ZUNvbnRlbnREZXNjcmlwdGlvbnNUYXNrX25hbWU9T3ZlcmZcdTAwZjhyZXIgcHJvY2VzaW5kaG9sZHNiZXNrcml2ZWxzZXIuLi4NCi1maXhQcmVzZW50YXRpb25OYW1lVGFza19uYW1lPUluZHN0aWxsZXIgTlVMTC90b210IHByXHUwMGU2c2VudGF0aW9uc25hdm4gcFx1MDBlNSBodmVydCBuZWRicnlkbmluZ3NlbGVtZW50IHRpbCBkZXRzIG5hdm4uLi4NCi1VbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyX2NvdWxkTm90UmVzb2x2ZVByb3h5PUthbiBpa2tlIG9wbFx1MDBmOHNlIHByb3h5ZW4gJyd7MH0nJw0KLXJlZnJlc2hMaWJyYXJ5RmlsZXNUYXNrX25hbWU9T3Bmcmlza2VyIGJpYmxpb3Rla3NmaWxlciBpIGFyYmVqZHNvbXJcdTAwZTVkZQ0KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPURlIHZhbGd0ZSBmaWxlciB1bmRlcnN0XHUwMGY4dHRlcyBpa2tlLiBPcGdyYWRcdTAwZTlyIHRpbCBlbiBueWVyZSB2ZXJzaW9uIGFmIHswfS4gDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY3YjY1OTguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBjY2M1ZGYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBMaWJyYXJ5IFVJIChOTDEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmU3YjAxMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZXMucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2ZyLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9qYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9DTi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RlLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9pdC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWZjODU5YS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gQmVudXR6ZXJzY2huaXR0c3RlbGxlIGZcdTAwZmNyIEJpYmxpb3RoZWtlbg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIERlZmF1bHQgTWV0aG9kIExpYnJhcnkgUGF0aC4NCi1saWJyYXJ5UGF0aD08dXNlci5ob21lPi88YXBwLm5hbWU+L01ldGhvZCBMaWJyYXJpZXMvbGlicmFyeTENCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YzUwNDhhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1VSSBkZSBiaWJsaW90ZWNhIGRlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIERlZmF1bHQgTWV0aG9kIExpYnJhcnkgUGF0aC4NCi1saWJyYXJ5UGF0aD08dXNlci5ob21lPi88YXBwLm5hbWU+L01ldGhvZCBMaWJyYXJpZXMvbGlicmFyeTENCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNGZlZjliLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1JbnRlcmZhY2UgdXRpbGlzYXRldXIgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgRGVmYXVsdCBNZXRob2QgTGlicmFyeSBQYXRoLg0KLWxpYnJhcnlQYXRoPTx1c2VyLmhvbWU+LzxhcHAubmFtZT4vTWV0aG9kIExpYnJhcmllcy9saWJyYXJ5MQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhjZjQ2MTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVVJIGxpYnJlcmlhIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIERlZmF1bHQgTWV0aG9kIExpYnJhcnkgUGF0aC4NCi1saWJyYXJ5UGF0aD08dXNlci5ob21lPi88YXBwLm5hbWU+L01ldGhvZCBMaWJyYXJpZXMvbGlicmFyeTENCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9wbHVnaW5famEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTBiOWY2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgTGlicmFyeSBVSQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIERlZmF1bHQgTWV0aG9kIExpYnJhcnkgUGF0aC4NCi1saWJyYXJ5UGF0aD08dXNlci5ob21lPi88YXBwLm5hbWU+L01ldGhvZCBMaWJyYXJpZXMvbGlicmFyeTENCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OGMzNGViLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFVJDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgRGVmYXVsdCBNZXRob2QgTGlicmFyeSBQYXRoLg0KLWxpYnJhcnlQYXRoPTx1c2VyLmhvbWU+LzxhcHAubmFtZT4vTWV0aG9kIExpYnJhcmllcy9saWJyYXJ5MQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4YzhmOWYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVVJIGRhIEJpYmxpb3RlY2EgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgRGVmYXVsdCBNZXRob2QgTGlicmFyeSBQYXRoLg0KLWxpYnJhcnlQYXRoPTx1c2VyLmhvbWU+LzxhcHAubmFtZT4vTWV0aG9kIExpYnJhcmllcy9saWJyYXJ5MQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkMGVhZjcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdTVlOTNcdTc1MjhcdTYyMzdcdTc1NGNcdTk3NjINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBEZWZhdWx0IE1ldGhvZCBMaWJyYXJ5IFBhdGguDQotbGlicmFyeVBhdGg9PHVzZXIuaG9tZT4vPGFwcC5uYW1lPi9NZXRob2QgTGlicmFyaWVzL2xpYnJhcnkxDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWUwYjlmNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIExpYnJhcnkgVUkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBEZWZhdWx0IE1ldGhvZCBMaWJyYXJ5IFBhdGguDQotbGlicmFyeVBhdGg9PHVzZXIuaG9tZT4vPGFwcC5uYW1lPi9NZXRob2QgTGlicmFyaWVzL2xpYnJhcnkxDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjODZmMDE5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChTaW5ndWxhcikNCi1hY3Rpdml0eV90ZXh0PUFrdGl2aXRcdTAwZTR0DQotYXJ0aWZhY3RfdGV4dD1BcnRlZmFrdA0KLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9UHJvemVzc211c3Rlcg0KLWNoZWNrbGlzdF90ZXh0PVByXHUwMGZjZmxpc3RlDQotY2hlY2tJdGVtX3RleHQ9UHJcdTAwZmNmbGlzdGVuZWludHJhZw0KLWNvbXBvc2l0ZVJvbGVfdGV4dD1Lb21iaW5pZXJ0ZSBSb2xsZQ0KLWNvbmNlcHRfdGV4dD1Lb256ZXB0DQotY29udGVudFBhY2thZ2VfdGV4dD1JbmhhbHRzcGFrZXQNCi1jdXN0b21DYXRlZ29yeV90ZXh0PUFuZ2VwYXNzdGUgS2F0ZWdvcmllDQotZGVsaXZlcmFibGVfdGV4dD1MaWVmZXJnZWdlbnN0YW5kDQotZGVsaXZlcnlQcm9jZXNzX3RleHQ9QmVyZWl0c3RlbGx1bmdzcHJvemVzcw0KLWRlc2NyaXB0b3JfdGV4dD1EZXNrcmlwdG9yDQotZGlzY2lwbGluZV90ZXh0PURpc3ppcGxpbg0KLWRpc2NpcGxpbmVHcm91cGluZ190ZXh0PVp1c2FtbWVuZmFzc3VuZyB2b24gRGlzemlwbGluZW4NCi1kb21haW5fdGV4dD1Eb21cdTAwZTRuZQ0KLWVzdGltYXRlX3RleHQ9U2NoXHUwMGU0dHplbg0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dD1TY2hcdTAwZTR0em1ldHJpaw0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0PUhpbndlaXNlIHp1bSBTY2hcdTAwZTR0emVuDQotZXhhbXBsZV90ZXh0PUJlaXNwaWVsDQotZ3VpZGFuY2VfdGV4dD1BbmxlaXR1bmcNCi1ndWlkZWxpbmVfdGV4dD1SaWNodGxpbmllDQotaXRlcmF0aW9uX3RleHQ9SXRlcmF0aW9uDQotbWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0PU1ldGhvZGVua29uZmlndXJhdGlvbg0KLW1ldGhvZENvbnRlbnRfdGV4dD1NZXRob2RlbmluaGFsdA0KLW1ldGhvZExpYnJhcnlfdGV4dD1NZXRob2RlbmJpYmxpb3RoZWsNCi1tZXRob2RQYWNrYWdlX3RleHQ9TWV0aG9kZW5wYWtldA0KLW1ldGhvZFBsdWdpbl90ZXh0PU1ldGhvZGVuLVBsdWctaW4NCi1taWxlc3RvbmVfdGV4dD1NZWlsZW5zdGVpbg0KLW91dGNvbWVfdGV4dD1SZXN1bHRhdA0KLXBoYXNlX3RleHQ9UGhhc2UNCi1wcmFjdGljZV90ZXh0PVZlcmZhaHJlbg0KLXByb2Nlc3NfdGV4dD1Qcm96ZXNzDQotcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0PVVudGVyc2NoaWVkbGljaGVyIFByb3plc3MNCi1wcm9jZXNzRmFtaWx5X3RleHQ9UHJvemVzc2ZhbWlsaWUNCi1wcm9jZXNzUGFja2FnZV90ZXh0PVByb3plc3NwYWtldA0KLXJlcG9ydF90ZXh0PUJlcmljaHQNCi1yZXVzYWJsZUFzc2V0X3RleHQ9V2llZGVydmVyd2VuZGJhcmVzIEFzc2V0DQotcm9hZG1hcF90ZXh0PVJvYWRtYXANCi1yb2xlRGVzY3JpcHRvcl90ZXh0PVJvbGxlbmRlc2tyaXB0b3INCi1yb2xlX3RleHQ9Um9sbGUNCi1yb2xlU2V0X3RleHQ9Um9sbGVuZ3J1cHBlDQotcm9sZVNldEdyb3VwaW5nX3RleHQ9WnVzYW1tZW5mYXNzdW5nIHZvbiBSb2xsZW5ncnVwcGVuDQotc3RhbmRhcmRDYXRlZ29yeV90ZXh0PVN0YW5kYXJka2F0ZWdvcmllDQotc3RlcF90ZXh0PVNjaHJpdHQNCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dD1VbnRlcnN0XHUwMGZjdHplbmRlcyBNYXRlcmlhbA0KLXRhc2tfdGV4dD1BdWZnYWJlDQotdGFza0Rlc2NyaXB0b3JfdGV4dD1BdWZnYWJlbmRlc2tyaXB0b3INCi10ZWFtUHJvZmlsZV90ZXh0PVRlYW1wcm9maWwNCi10ZW1wbGF0ZV90ZXh0PVZvcmxhZ2UNCi10ZXJtRGVmaW5pdGlvbl90ZXh0PUJlZ3JpZmZzZGVmaW5pdGlvbg0KLXRvb2xfdGV4dD1Ub29sDQotdG9vbE1lbnRvcl90ZXh0PVRvb2xtZW50b3INCi13aGl0ZXBhcGVyX3RleHQ9V2hpdGUgUGFwZXINCi13b3JrUHJvZHVjdF90ZXh0PUFyYmVpdHNlcmdlYm5pcw0KLXdvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0PUFyYmVpdHNlcmdlYm5pc2Rlc2tyaXB0b3INCi13b3JrUHJvZHVjdEVsZW1lbnRfdGV4dD1BcmJlaXRzZXJnZWJuaXNlbGVtZW50DQotd29ya1Byb2R1Y3RUeXBlX3RleHQ9QXJ0IGRlcyBBcmJlaXRzZXJnZWJuaXNzZXMNCi0NCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChQbHVyYWwpDQotYWN0aXZpdHlfdGV4dF9wbHVyYWw9QWt0aXZpdFx1MDBlNHRlbg0KLWFydGlmYWN0X3RleHRfcGx1cmFsPUFydGVmYWt0ZQ0KLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHRfcGx1cmFsPVByb3plc3NtdXN0ZXINCi1jaGVja2xpc3RfdGV4dF9wbHVyYWw9UHJcdTAwZmNmbGlzdGVuDQotY2hlY2tJdGVtX3RleHRfcGx1cmFsPVByXHUwMGZjZmxpc3RlbmVpbnRyXHUwMGU0Z2UNCi1jb21wb3NpdGVSb2xlX3RleHRfcGx1cmFsPUtvbWJpbmllcnRlIFJvbGxlbg0KLWNvbmNlcHRfdGV4dF9wbHVyYWw9S29uemVwdGUNCi1jb250ZW50UGFja2FnZV90ZXh0X3BsdXJhbD1JbmhhbHRzcGFrZXRlDQotY3VzdG9tQ2F0ZWdvcnlfdGV4dF9wbHVyYWw9QW5nZXBhc3N0ZSBLYXRlZ29yaWVuDQotZGVsaXZlcmFibGVfdGV4dF9wbHVyYWw9TGllZmVyZ2VnZW5zdFx1MDBlNG5kZQ0KLWRlbGl2ZXJ5UHJvY2Vzc190ZXh0X3BsdXJhbD1CZXJlaXRzdGVsbHVuZ3Nwcm96ZXNzZQ0KLWRlc2NyaXB0b3JfdGV4dF9wbHVyYWw9RGVza3JpcHRvcmVuDQotZGlzY2lwbGluZV90ZXh0X3BsdXJhbD1EaXN6aXBsaW5lbg0KLWRpc2NpcGxpbmVHcm91cGluZ190ZXh0X3BsdXJhbD1adXNhbW1lbmZhc3N1bmdlbiB2b24gRGlzemlwbGluZW4NCi1kb21haW5fdGV4dF9wbHVyYWw9RG9tXHUwMGU0bmVuDQotZXN0aW1hdGVfdGV4dF9wbHVyYWw9U2NoXHUwMGU0dHp1bmdlbg0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dF9wbHVyYWw9U2NoXHUwMGU0dHptZXRyaWtlbg0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0X3BsdXJhbD1IaW53ZWlzZSB6dW0gU2NoXHUwMGU0dHplbg0KLWV4YW1wbGVfdGV4dF9wbHVyYWw9QmVpc3BpZWxlDQotZ3VpZGFuY2VfdGV4dF9wbHVyYWw9QW5sZWl0dW5nZW4NCi1ndWlkZWxpbmVfdGV4dF9wbHVyYWw9UmljaHRsaW5pZW4NCi1pdGVyYXRpb25fdGV4dF9wbHVyYWw9SXRlcmF0aW9uZW4NCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHRfcGx1cmFsPU1ldGhvZGVua29uZmlndXJhdGlvbmVuDQotbWV0aG9kQ29udGVudF90ZXh0X3BsdXJhbD1NZXRob2RlbmluaGFsdA0KLW1ldGhvZExpYnJhcnlfdGV4dF9wbHVyYWw9TWV0aG9kZW5iaWJsaW90aGVrZW4NCi1tZXRob2RQYWNrYWdlX3RleHRfcGx1cmFsPU1ldGhvZGVucGFrZXRlDQotbWV0aG9kUGx1Z2luX3RleHRfcGx1cmFsPU1ldGhvZGVuLVBsdWctaW5zDQotbWlsZXN0b25lX3RleHRfcGx1cmFsPU1laWxlbnN0ZWluZQ0KLW91dGNvbWVfdGV4dF9wbHVyYWw9UmVzdWx0YXRlDQotcGhhc2VfdGV4dF9wbHVyYWw9UGhhc2VuDQotcHJhY3RpY2VfdGV4dF9wbHVyYWw9VmVyZmFocmVuDQotcHJvY2Vzc190ZXh0X3BsdXJhbD1Qcm96ZXNzZQ0KLXByb2Nlc3NDb250cmlidXRpb25fdGV4dF9wbHVyYWw9VW50ZXJzY2hpZWRsaWNoZSBQcm96ZXNzZQ0KLXByb2Nlc3NGYW1pbHlfdGV4dF9wbHVyYWw9UHJvemVzc2ZhbWlsaWVuDQotcHJvY2Vzc1BhY2thZ2VfdGV4dF9wbHVyYWw9UHJvemVzc3Bha2V0ZQ0KLXJlcG9ydF90ZXh0X3BsdXJhbD1CZXJpY2h0ZQ0KLXJldXNhYmxlQXNzZXRfdGV4dF9wbHVyYWw9V2llZGVydmVyd2VuZGJhcmUgQXNzZXRzDQotcm9hZG1hcF90ZXh0X3BsdXJhbD1Sb2FkbWFwcw0KLXJvbGVEZXNjcmlwdG9yX3RleHRfcGx1cmFsPVJvbGxlbmRlc2tyaXB0b3Jlbg0KLXJvbGVfdGV4dF9wbHVyYWw9Um9sbGVuDQotcm9sZVNldF90ZXh0X3BsdXJhbD1Sb2xsZW5ncnVwcGVuDQotcm9sZVNldEdyb3VwaW5nX3RleHRfcGx1cmFsPVp1c2FtbWVuZmFzc3VuZ2VuIHZvbiBSb2xsZW5ncnVwcGVuDQotc3RhbmRhcmRDYXRlZ29yeV90ZXh0X3BsdXJhbD1TdGFuZGFyZGthdGVnb3JpZW4NCi1zdGVwX3RleHRfcGx1cmFsPVNjaHJpdHRlDQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHRfcGx1cmFsPVVudGVyc3RcdTAwZmN0emVuZGVzIE1hdGVyaWFsDQotdGFza190ZXh0X3BsdXJhbD1BdWZnYWJlbg0KLXRhc2tEZXNjcmlwdG9yX3RleHRfcGx1cmFsPUF1ZmdhYmVuZGVza3JpcHRvcmVuDQotdGVhbVByb2ZpbGVfdGV4dF9wbHVyYWw9VGVhbXByb2ZpbGUNCi10ZW1wbGF0ZV90ZXh0X3BsdXJhbD1Wb3JsYWdlbg0KLXRlcm1EZWZpbml0aW9uX3RleHRfcGx1cmFsPUJlZ3JpZmZzZGVmaW5pdGlvbmVuDQotdG9vbF90ZXh0X3BsdXJhbD1Ub29scw0KLXRvb2xNZW50b3JfdGV4dF9wbHVyYWw9VG9vbG1lbnRvcmVuDQotd2hpdGVwYXBlcl90ZXh0X3BsdXJhbD1XaGl0ZSBQYXBlcg0KLXdvcmtQcm9kdWN0X3RleHRfcGx1cmFsPUFyYmVpdHNlcmdlYm5pc3NlDQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHRfcGx1cmFsPUFyYmVpdHNlcmdlYm5pc2Rlc2tyaXB0b3Jlbg0KLXdvcmtQcm9kdWN0RWxlbWVudF90ZXh0X3BsdXJhbD1BcmJlaXRzZXJnZWJuaXNlbGVtZW50ZQ0KLXdvcmtQcm9kdWN0VHlwZV90ZXh0X3BsdXJhbD1BcnRlbiB2b24gQXJiZWl0c2VyZ2Vibmlzc2VuDQotDQotIyBBcHBsaWNhdGlvbiB0aXRsZS4NCi1hcHBsaWNhdGlvbl90aXRsZT17MH0gLSB7MX0NCi0NCi0jIE9wZW4gTWV0aG9kIExpYnJhcnkgRGlhbG9nDQotb3BlbkxpYnJhcnlEaWFsb2dfdGl0bGU9TWV0aG9kZW5iaWJsaW90aGVrIFx1MDBmNmZmbmVuDQotb3BlbkxpYnJhcnlEaWFsb2dBcmVhX3RpdGxlPU1ldGhvZGVuYmlibGlvdGhlayBhdXN3XHUwMGU0aGxlbg0KLW9wZW5MaWJyYXJ5RGlhbG9nQXJlYV90ZXh0PXswfSBzcGVpY2hlcnQgTWV0aG9kZW4gdW5kIFByb3plc3NlIGluIGVpbmVtIE9yZG5lciwgZGVyXG5hbHMgTWV0aG9kZW5iaWJsaW90aGVrIGJlemVpY2huZXQgd2lyZC4gV1x1MDBlNGhsZW4gU2llIGVpbmVuIE1ldGhvZGVuYmlibGlvdGhla3NvcmRuZXIgZlx1MDBmY3IgZGllc2UgU2l0enVuZyBhdXMuDQotbGlicmFyeUxhYmVsX3RleHQ9QmlibGlvdGhlazoNCi1icm93c2VCdXR0b25fdGV4dD1EdXJjaHN1Y2hlbi4uLg0KLXByb21wdEZvckxpYnJhcnlDaGVja2JveF90ZXh0PUFscyBTdGFuZGFyZCB2ZXJ3ZW5kZW4gdW5kIG5pY2h0IGVybmV1dCBhbmZyYWdlbi4NCi1vcGVuTGlicmFyeURpYWxvZ19uZXdMaWJyYXJ5X3RleHQ9RXMgaXN0IGtlaW5lIE1ldGhvZGVuYmlibGlvdGhlayBpbiAnJ3swfScnIHZvcmhhbmRlbi5cbkVzIHdpcmQgZWluZSBuZXVlIE1ldGhvZGVuYmlibGlvdGhlayBpbSBhbmdlZ2ViZW5lbiBWZXJ6ZWljaG5pcyBlcnN0ZWxsdCB1bmQgZ2VcdTAwZjZmZm5ldC5cblxuS2xpY2tlbiBTaWUgYXVmIE9LLCB1bSBkaWUgT3BlcmF0aW9uIGZvcnR6dXNldHplbiwgb2RlciBrbGlja2VuIFNpZSBhdWYgQWJicmVjaGVuLFxudW0gZWluZW4gYW5kZXJlbiBNZXRob2RlbmJpYmxpb3RoZWtzcGZhZCBhbnp1Z2ViZW4uDQotDQotIyBTZWxlY3QgTWV0aG9kIExpYnJhcnkgRm9sZGVyIERpYWxvZw0KLXNlbGVjdExpYnJhcnlGb2xkZXJEaWFsb2dfdGl0bGU9TWV0aG9kZW5iaWJsaW90aGVrIGF1c3dcdTAwZTRobGVuDQotc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190ZXh0PVdcdTAwZTRobGVuIFNpZSBlaW5lbiBNZXRob2RlbmJpYmxpb3RoZWtzb3JkbmVyIGF1cy4NCi0NCi0jIE9wZW4gTGlicmFyeSBQcm9ncmVzcyBNZXNzYWdlDQotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9TWV0aG9kZW5iaWJsaW90aGVrIHdpcmQgZ2VcdTAwZjZmZm5ldC4uLg0KLQ0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBFcnJvciBEaWFsb2cNCi1pbnZhbGlkTGlicmFyeVBhdGhfbXNnPUlVUEwwMzAwRTogRGllIGFuZ2VnZWJlbmUgTWV0aG9kZW5iaWJsaW90aGVrIGthbm4gbmljaHQgZ2VcdTAwZjZmZm5ldCB3ZXJkZW4uDQotaW52YWxpZExpYnJhcnlQYXRoX3JlYXNvbj1EZXIgYXVzZ2V3XHUwMGU0aGx0ZSBNZXRob2RlbmJpYmxpb3RoZWtzb3JkbmVyIGlzdCB1bmdcdTAwZmNsdGlnLCBuaWNodCB2b3JoYW5kZW4sIG9kZXIgU2llIHNpbmQgbmljaHQgYmVyZWNodGlndCwgYXVmIGRlbiBPcmRuZXIgenV6dWdyZWlmZW4uXG5cbktsaWNrZW4gU2llIGF1ZiBPSywgdW0gZWluZW4gYW5kZXJlbiBCaWJsaW90aGVrc29yZG5lciBhdXN6dXdcdTAwZTRobGVuLg0KLQ0KLSMgTGlicmFyeSBMb2NrZWQgRXJyb3IgRGlhbG9nDQotbGlicmFyeUxvY2tlZF9tc2c9SVVQTDAzMDNFOiBEaWUgYW5nZWdlYmVuZSBNZXRob2RlbmJpYmxpb3RoZWsga2FubiBuaWNodCBnZVx1MDBmNmZmbmV0IHdlcmRlbi5cblxuRGllIGF1c2dld1x1MDBlNGhsdGUgTWV0aG9kZW5iaWJsaW90aGVrIHNjaGVpbnQgaW0gR2VicmF1Y2ggenUgc2Vpbi4gS2xpY2tlbiBTaWUgYXVmIEFiYnJlY2hlbiwgdW0gZWluZW4gYW5kZXJlbiBCaWJsaW90aGVrc29yZG5lciBhdXN6dXdcdTAwZTRobGVuLCBvZGVyIGtsaWNrZW4gU2llIGF1ZiBcdTAwZDZmZm5lbiBlcnp3aW5nZW4sIHdlbm4gU2llIGRpZSBCaWJsaW90aGVrIHRyb3R6ZGVtIFx1MDBmNmZmbmVuIG1cdTAwZjZjaHRlbi5cblxuV0FSTlVORzogRGllIHBhcmFsbGVsZSBWZXJ3ZW5kdW5nIGVpbmVyIE1ldGhvZGVuYmlibGlvdGhlayBrYW5uIHp1ciBCZXNjaFx1MDBlNGRpZ3VuZyBkaWVzZXIgQmlibGlvdGhlayBmXHUwMGZjaHJlbi4NCi1saWJyYXJ5TG9ja2VkX29wZW5CdXR0b25fdGV4dD1cdTAwZDZmZm5lbiBlcnp3aW5nZW4NCi0NCi0jIFJlYWQtb25seSBQcm9qZWN0IEZpbGUgRXJyb3IgRGlhbG9nDQotcmVhZE9ubHlQcm9qZWN0RmlsZV90ZXh0PUlVUEwwMzAyRTogJyd7MH0nJyBpc3Qgc2NocmVpYmdlc2NoXHUwMGZjdHp0LiBCZXZvciBTaWUgZGVuIFZvcmdhbmcgZm9ydHNldHplbiwgbVx1MDBmY3NzZW4gU2llIGRhZlx1MDBmY3Igc29yZ2VuLCBkYXNzIGluIGRpZSBEYXRlaSBnZXNjaHJpZWJlbiB3ZXJkZW4ga2Fubi4NCi1yZXRyeUJ1dHRvbl90ZXh0PVdpZWRlcmhvbGVuDQotY2FuY2VsQnV0dG9uX3RleHQ9QWJicmVjaGVuDQotDQotIyBWZXJzaW9uIE1pc21hdGNoIERpYWxvZw0KLXZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0PUlVUEwzMDVFOiBEaWUgYXVzZ2V3XHUwMGU0aGx0ZSBCaWJsaW90aGVrIGthbm4gbmljaHQgZ2VcdTAwZjZmZm5ldCB3ZXJkZW4uIFNpZSBtXHUwMGZjc3NlbiBlaW5lbiBVcGdyYWRlIHZvbiB7MH0gYXVmIFZlcnNpb24gezF9IG9kZXIgaFx1MDBmNmhlciBkdXJjaGZcdTAwZmNocmVuLCB1bSBkaWVzZSBCaWJsaW90aGVrIFx1MDBmNmZmbmVuIHp1IGtcdTAwZjZubmVuLg0KLXZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0X3Vua25vd249SVVQTDMwNkU6IERpZSBhdXNnZXdcdTAwZTRobHRlIEJpYmxpb3RoZWsga2FubiBuaWNodCBnZVx1MDBmNmZmbmV0IHdlcmRlbi4gU2llIG1cdTAwZmNzc2VuIGVpbmVuIFVwZ3JhZGUgdm9uIHswfSBhdWYgZWluZSBoXHUwMGY2aGVyZSBWZXJzaW9uIGR1cmNoZlx1MDBmY2hyZW4sIHVtIGRpZXNlIEJpYmxpb3RoZWsgXHUwMGY2ZmZuZW4genUga1x1MDBmNm5uZW4uDQotDQotIyBVcGdyYWRlIE1ldGhvZCBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPU1ldGhvZGVuYmlibGlvdGhlayBha3R1YWxpc2llcmVuDQotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGV4dD1EaWUgYXVzZ2V3XHUwMGU0aGx0ZSBCaWJsaW90aGVrIG11c3MgYXVmIGRpZSBuZXVlIEJpYmxpb3RoZWtzc3RydWt0dXIgYWt0dWFsaXNpZXJ0IHdlcmRlbi5cblxuTVx1MDBmNmNodGVuIFNpZSBkZW4gVXBncmFkZSBmb3J0c2V0emVuPw0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9VXBncmFkZSBmXHUwMGZjciBNZXRob2RlbmJpYmxpb3RoZWsgd2lyZCBkdXJjaGdlZlx1MDBmY2hydC4uLg0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEwwMzAxRTogRmVobGVyIGJlaW0gVXBncmFkZSBkZXIgTWV0aG9kZW5iaWJsaW90aGVrLiBTdWNoZW4gU2llIGluIGRlciBQcm90b2tvbGxkYXRlaSBuYWNoIHdlaXRlcmVuIEVpbnplbGhlaXRlbi4NCi0NCi0jIFN3aXRjaCBDb25maWd1cmF0aW9uIERpYWxvZw0KLXN3aXRjaENvbmZpZ0RpYWxvZ190aXRsZT1Lb25maWd1cmF0aW9uIHdlY2hzZWxuDQotc3dpdGNoQ29uZmlnRGlhbG9nX3RleHQ9TVx1MDBmNmNodGVuIFNpZSB2b24gZGVyIGFrdHVlbGxlbiBLb25maWd1cmF0aW9uIHp1ciBTdGFuZGFyZGtvbmZpZ3VyYXRpb24gJyd7MH0nJywgZGllIGRlbSBhdXNnZXdcdTAwZTRobHRlbiBQcm96ZXNzIHp1Z2VvcmRuZXQgaXN0LCB3ZWNoc2Vsbj8NCi0JDQotIyBDb25maWd1cmF0aW9uIENvbWJvDQotY3VycmVudENvbmZpZ0xhYmVsX3RleHQ9QWt0dWVsbGUgS29uZmlndXJhdGlvbjoNCi1zZWxlY3RDb25maWdMYWJlbF90ZXh0PVdcdTAwZTRobGVuIFNpZSBlaW5lIEtvbmZpZ3VyYXRpb24gYXVzLg0KLQ0KLSMgRGVsZXRlIEZpbGVzIENvbmZpcm1hdGlvbiBNZXNzYWdlDQotZGVsZXRlRmlsZXNDb25maXJtYXRpb25fbXNnPURlciBhbmdlZ2ViZW5lIFBmYWQgJyd7MH0nJyBpc3QgYmVyZWl0cyB2b3JoYW5kZW4uIEVzIHdlcmRlbiBhbGxlIERhdGVpZW4gaW0gT3JkbmVyIGdlbFx1MDBmNnNjaHQuIEZvcnRmYWhyZW4/DQotDQotIyBQYXRocy9GaWxlcyBFcnJvciBNZXNzYWdlcw0KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPURlciBQZmFkICcnezB9JycgZW50aFx1MDBlNGx0IG1pbmRlc3RlbnMgZWluZSBEYXRlaSwgZGllIG5pY2h0IGdlbFx1MDBmNnNjaHQgd2VyZGVuIGthbm4uXG5cbldcdTAwZTRobGVuIFNpZSBlaW5lbiBhbmRlcmVuIFBmYWQgYXVzIHVuZCB3aWVkZXJob2xlbiBTaWUgZGVuIFZvcmdhbmcuDQotY3JlYXRlUGF0aEVycm9yX3JlYXNvbj1EZXIgUGZhZCAnJ3swfScnIGthbm4gbmljaHQgZXJzdGVsbHQgd2VyZGVuLlxuXG5XXHUwMGU0aGxlbiBTaWUgZWluZW4gYW5kZXJlbiBQZmFkIGF1cyB1bmQgd2llZGVyaG9sZW4gU2llIGRlbiBWb3JnYW5nLg0KLWludmFsaWRQYXRoX21zZz1EZXIgYW5nZWdlYmVuZSBQZmFkIGlzdCBuaWNodCBnXHUwMGZjbHRpZy4NCi0NCi0jIEJhY2t1cCBMaWJyYXJ5IERpYWxvZw0KLWJhY2t1cExpYnJhcnlEaWFsb2dfdGl0bGU9U2ljaGVydW5nc2JpYmxpb3RoZWsNCi1iYWNrdXBMaWJyYXJ5RGlhbG9nX3RleHQ9RXMgd2lyZCBkcmluZ2VuZCBlbXBmb2hsZW4sIGRpZSBha3R1ZWxsZSBNZXRob2RlbmJpYmxpb3RoZWsgenUgc2ljaGVybiwgYmV2b3IgU2llIGRlbiBWb3JnYW5nIGZvcnRzZXR6ZW4uXG5cbktsaWNrZW4gU2llIGF1ZiBPSywgdW0gZWluZSBTaWNoZXJ1bmdza29waWUgZGVyIEJpYmxpb3RoZWsgaW0gYW5nZWdlYmVuZW4gVmVyemVpY2huaXMgenUgZXJzdGVsbGVuLiBLbGlja2VuIFNpZSBhdWYgIlx1MDBkY2JlcnNwcmluZ2VuIiwgdW0gZGVuIFZvcmdhbmcgb2huZSBFcnN0ZWxsdW5nIGRlciBTaWNoZXJ1bmcgZm9ydHp1c2V0emVuLg0KLWJhY2tpbmdVcExpYnJhcnlUYXNrX25hbWU9U2ljaGVydW5nc2tvcGllIGRlciBCaWJsaW90aGVrc2RhdGVpZW4gd2lyZCBlcnN0ZWxsdC4uLg0KLQ0KLSMgUGF0aCBTZWxlY3Rpb24gRGlhbG9nDQotcGF0aFNlbGVjdGlvbkVycm9yX21zZz1WZXJ6ZWljaG5pcyBrYW5uIG5pY2h0IGVyc3RlbGx0IHdlcmRlbg0KLW9rQnV0dG9uX3RleHQ9T0sNCi1za2lwQnV0dG9uX3RleHQ9XHUwMGRjYmVyc3ByaW5nZW4NCi0NCi0jIFByb2Nlc3MgRWRpdG9yIHByZWZlcmVuY2VzDQotYWx3YXlzQnV0dG9uX3RleHQ9SW1tZXINCi1uZXZlckJ1dHRvbl90ZXh0PU5pZQ0KLXByb21wdEJ1dHRvbl90ZXh0PUFuZnJhZ2UNCi0NCi0jIEFkZCBMaW5rIERpYWxvZw0KLWxpbmtUb1VSTF9uYW1lPVVSTA0KLWxpbmtUb0ZpbGVfbmFtZT1EYXRlaQ0KLWVsZW1lbnRMaW5rX25hbWU9TWV0aG9kZW5lbGVtZW50DQotZWxlbWVudExpbmtXaXRoVHlwZV9uYW1lPU1ldGhvZGVuZWxlbWVudCBtaXQgVHlwcHJcdTAwZTRmaXgNCi1lbGVtZW50TGlua1dpdGhVc2VyVGV4dF9uYW1lPU1ldGhvZGVuZWxlbWVudCBtaXQgYmVudXR6ZXJkZWZpbmllcnRlbSBUZXh0DQotDQotIyBDb252ZXJ0IEFjdGl2aXR5IFR5cGUgRGlhbG9nDQotY29udmVydEFjdGl2aXR5RGlhbG9nX3RpdGxlPUFrdGl2aXRcdTAwZTR0c3R5cCBrb252ZXJ0aWVyZW4NCi1jb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGV4dD1XXHUwMGU0aGxlbiBTaWUgZGVuIFppZWxha3Rpdml0XHUwMGU0dHN0eXAgYXVzLg0KLXVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX21zZz1JVVBMMDMwNEU6IERpZXNlIEFrdGl2aXRcdTAwZTR0IGthbm4gbmljaHQgaW4gZWluZW4gYW5kZXJlbiBUeXAga29udmVydGllcnQgd2VyZGVuLg0KLXVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX3JlYXNvbj1FcyBnaWJ0IGtlaW5lbiBrb21wYXRpYmxlbiBBa3Rpdml0XHUwMGU0dHN0eXAgZlx1MDBmY3IgezB9Lg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXNfZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODY2OWU0ZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBNZXRob2QgRWxlbWVudCBOYW1lcyAoU2luZ3VsYXIpDQotYWN0aXZpdHlfdGV4dD1BY3RpdmlkYWQNCi1hcnRpZmFjdF90ZXh0PUFydGVmYWN0bw0KLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9UGF0clx1MDBmM24gZGUgcG9zaWJpbGlkYWQNCi1jaGVja2xpc3RfdGV4dD1MaXN0YSBkZSBjb21wcm9iYWNpXHUwMGYzbg0KLWNoZWNrSXRlbV90ZXh0PUVsZW1lbnRvIGRlIGNvbXByb2JhY2lcdTAwZjNuDQotY29tcG9zaXRlUm9sZV90ZXh0PVJvbCBjb21wdWVzdG8NCi1jb25jZXB0X3RleHQ9Q29uY2VwdG8NCi1jb250ZW50UGFja2FnZV90ZXh0PVBhcXVldGUgZGUgY29udGVuaWRvDQotY3VzdG9tQ2F0ZWdvcnlfdGV4dD1DYXRlZ29yXHUwMGVkYSBwZXJzb25hbGl6YWRhDQotZGVsaXZlcmFibGVfdGV4dD1Qcm9kdWN0byBmaW5hbA0KLWRlbGl2ZXJ5UHJvY2Vzc190ZXh0PVByb2Nlc28gZGUgZW50cmVnYQ0KLWRlc2NyaXB0b3JfdGV4dD1EZXNjcmlwdG9yDQotZGlzY2lwbGluZV90ZXh0PURpc2NpcGxpbmENCi1kaXNjaXBsaW5lR3JvdXBpbmdfdGV4dD1BZ3J1cGFjaVx1MDBmM24gZGUgZGlzY2lwbGluYXMNCi1kb21haW5fdGV4dD1Eb21pbmlvDQotZXN0aW1hdGVfdGV4dD1DXHUwMGUxbGN1bG8NCi1lc3RpbWF0aW5nTWV0cmljX3RleHQ9Q1x1MDBlMWxjdWxvIGRlIGxhIG1lZGlkYQ0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0PUNvbnNpZGVyYWNpb25lcyBzb2JyZSBlbCBjXHUwMGUxbGN1bG8NCi1leGFtcGxlX3RleHQ9RWplbXBsbw0KLWd1aWRhbmNlX3RleHQ9R3VcdTAwZWRhDQotZ3VpZGVsaW5lX3RleHQ9RGlyZWN0cml6DQotaXRlcmF0aW9uX3RleHQ9SXRlcmFjaVx1MDBmM24NCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHQ9Q29uZmlndXJhY2lcdTAwZjNuIGRlIG1cdTAwZTl0b2RvDQotbWV0aG9kQ29udGVudF90ZXh0PUNvbnRlbmlkbyBkZWwgbVx1MDBlOXRvZG8NCi1tZXRob2RMaWJyYXJ5X3RleHQ9QmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MNCi1tZXRob2RQYWNrYWdlX3RleHQ9UGFxdWV0ZSBkZWwgbVx1MDBlOXRvZG8NCi1tZXRob2RQbHVnaW5fdGV4dD1QbHVnLWluIGRlIG1cdTAwZTl0b2RvDQotbWlsZXN0b25lX3RleHQ9T2JqZXRpdm8NCi1vdXRjb21lX3RleHQ9UmVzdWx0YWRvDQotcGhhc2VfdGV4dD1GYXNlDQotcHJhY3RpY2VfdGV4dD1Qclx1MDBlMWN0aWNhDQotcHJvY2Vzc190ZXh0PVByb2Nlc28NCi1wcm9jZXNzQ29udHJpYnV0aW9uX3RleHQ9UHJvY2VzbyBkaWZlcmVuY2lhbA0KLXByb2Nlc3NGYW1pbHlfdGV4dD1GYW1pbGlhIGRlbCBwcm9jZXNvDQotcHJvY2Vzc1BhY2thZ2VfdGV4dD1QYXF1ZXRlIGRlIHByb2Nlc28NCi1yZXBvcnRfdGV4dD1JbmZvcm1lDQotcmV1c2FibGVBc3NldF90ZXh0PUFjdGl2byByZXV0aWxpemFibGUNCi1yb2FkbWFwX3RleHQ9TWFwYQ0KLXJvbGVEZXNjcmlwdG9yX3RleHQ9RGVzY3JpcHRvciBkZSByb2xlcw0KLXJvbGVfdGV4dD1Sb2wNCi1yb2xlU2V0X3RleHQ9Q29uanVudG8gZGUgcm9sZXMNCi1yb2xlU2V0R3JvdXBpbmdfdGV4dD1BZ3J1cGFjaVx1MDBmM24gZGUgY29uanVudG9zIGRlIHJvbGVzDQotc3RhbmRhcmRDYXRlZ29yeV90ZXh0PUNhdGVnb3JcdTAwZWRhIGVzdFx1MDBlMW5kYXINCi1zdGVwX3RleHQ9UGFzbw0KLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0PU1hdGVyaWFsIGRlIHNvcG9ydGUNCi10YXNrX3RleHQ9VGFyZWENCi10YXNrRGVzY3JpcHRvcl90ZXh0PURlc2NyaXB0b3IgZGUgdGFyZWFzDQotdGVhbVByb2ZpbGVfdGV4dD1QZXJmaWwgZGVsIGVxdWlwbw0KLXRlbXBsYXRlX3RleHQ9UGxhbnRpbGxhDQotdGVybURlZmluaXRpb25fdGV4dD1EZWZpbmljaVx1MDBmM24gZGUgdFx1MDBlOXJtaW5vcw0KLXRvb2xfdGV4dD1IZXJyYW1pZW50YQ0KLXRvb2xNZW50b3JfdGV4dD1HdVx1MDBlZGEgZGUgbGEgaGVycmFtaWVudGENCi13aGl0ZXBhcGVyX3RleHQ9RG9jdW1lbnRhY2lcdTAwZjNuDQotd29ya1Byb2R1Y3RfdGV4dD1Qcm9kdWN0byBkZSB0cmFiYWpvDQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9RGVzY3JpcHRvciBkZSBwcm9kdWN0b3MgZGUgdHJhYmFqbw0KLXdvcmtQcm9kdWN0RWxlbWVudF90ZXh0PUVsZW1lbnRvIGRlIHByb2R1Y3RvIGRlIHRyYWJham8NCi13b3JrUHJvZHVjdFR5cGVfdGV4dD1DbGFzZSBkZSBwcm9kdWN0byBkZSB0cmFiYWpvDQotDQotIyBNZXRob2QgRWxlbWVudCBOYW1lcyAoUGx1cmFsKQ0KLWFjdGl2aXR5X3RleHRfcGx1cmFsPUFjdGl2aWRhZGVzDQotYXJ0aWZhY3RfdGV4dF9wbHVyYWw9QXJ0ZWZhY3Rvcw0KLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHRfcGx1cmFsPVBhdHJvbmVzIGRlIHBvc2liaWxpZGFkDQotY2hlY2tsaXN0X3RleHRfcGx1cmFsPUxpc3RhcyBkZSBjb21wcm9iYWNpXHUwMGYzbg0KLWNoZWNrSXRlbV90ZXh0X3BsdXJhbD1FbGVtZW50b3MgZGUgY29tcHJvYmFjaVx1MDBmM24NCi1jb21wb3NpdGVSb2xlX3RleHRfcGx1cmFsPVJvbGVzIGNvbXB1ZXN0b3MNCi1jb25jZXB0X3RleHRfcGx1cmFsPUNvbmNlcHRvcw0KLWNvbnRlbnRQYWNrYWdlX3RleHRfcGx1cmFsPVBhcXVldGVzIGRlIGNvbnRlbmlkbw0KLWN1c3RvbUNhdGVnb3J5X3RleHRfcGx1cmFsPUNhdGVnb3JcdTAwZWRhcyBwZXJzb25hbGl6YWRhcw0KLWRlbGl2ZXJhYmxlX3RleHRfcGx1cmFsPVByb2R1Y3RvcyBmaW5hbGVzDQotZGVsaXZlcnlQcm9jZXNzX3RleHRfcGx1cmFsPVByb2Nlc29zIGRlIGVudHJlZ2ENCi1kZXNjcmlwdG9yX3RleHRfcGx1cmFsPURlc2NyaXB0b3Jlcw0KLWRpc2NpcGxpbmVfdGV4dF9wbHVyYWw9RGlzY2lwbGluYXMNCi1kaXNjaXBsaW5lR3JvdXBpbmdfdGV4dF9wbHVyYWw9QWdydXBhY2lvbmVzIGRlIGRpc2NpcGxpbmFzDQotZG9tYWluX3RleHRfcGx1cmFsPURvbWluaW9zDQotZXN0aW1hdGVfdGV4dF9wbHVyYWw9Q1x1MDBlMWxjdWxvcw0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dF9wbHVyYWw9Q1x1MDBlMWxjdWxvIGRlIGxhIG1lZGlkYQ0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0X3BsdXJhbD1Db25zaWRlcmFjaW9uZXMgc29icmUgZWwgY1x1MDBlMWxjdWxvDQotZXhhbXBsZV90ZXh0X3BsdXJhbD1FamVtcGxvcw0KLWd1aWRhbmNlX3RleHRfcGx1cmFsPUd1XHUwMGVkYXMNCi1ndWlkZWxpbmVfdGV4dF9wbHVyYWw9RGlyZWN0cmljZXMNCi1pdGVyYXRpb25fdGV4dF9wbHVyYWw9SXRlcmFjaW9uZXMNCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHRfcGx1cmFsPUNvbmZpZ3VyYWNpb25lcyBkZWwgbVx1MDBlOXRvZG8NCi1tZXRob2RDb250ZW50X3RleHRfcGx1cmFsPUNvbnRlbmlkbyBkZWwgbVx1MDBlOXRvZG8NCi1tZXRob2RMaWJyYXJ5X3RleHRfcGx1cmFsPUJpYmxpb3RlY2FzIGRlIG1cdTAwZTl0b2Rvcw0KLW1ldGhvZFBhY2thZ2VfdGV4dF9wbHVyYWw9UGFxdWV0ZXMgZGVsIG1cdTAwZTl0b2RvDQotbWV0aG9kUGx1Z2luX3RleHRfcGx1cmFsPVBsdWctaW5zIGRlIG1cdTAwZTl0b2RvDQotbWlsZXN0b25lX3RleHRfcGx1cmFsPU9iamV0aXZvcw0KLW91dGNvbWVfdGV4dF9wbHVyYWw9UmVzdWx0YWRvcw0KLXBoYXNlX3RleHRfcGx1cmFsPUZhc2VzDQotcHJhY3RpY2VfdGV4dF9wbHVyYWw9UHJcdTAwZTFjdGljYXMNCi1wcm9jZXNzX3RleHRfcGx1cmFsPVByb2Nlc29zDQotcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0X3BsdXJhbD1Qcm9jZXNvcyBkaWZlcmVuY2lhbGVzDQotcHJvY2Vzc0ZhbWlseV90ZXh0X3BsdXJhbD1GYW1pbGlhcyBkZWwgcHJvY2Vzbw0KLXByb2Nlc3NQYWNrYWdlX3RleHRfcGx1cmFsPVBhcXVldGVzIGRlbCBwcm9jZXNvDQotcmVwb3J0X3RleHRfcGx1cmFsPUluZm9ybWVzDQotcmV1c2FibGVBc3NldF90ZXh0X3BsdXJhbD1BY3Rpdm9zIHJldXRpbGl6YWJsZXMNCi1yb2FkbWFwX3RleHRfcGx1cmFsPU1hcGFzDQotcm9sZURlc2NyaXB0b3JfdGV4dF9wbHVyYWw9RGVzY3JpcHRvcmVzIGRlIHJvbGVzDQotcm9sZV90ZXh0X3BsdXJhbD1Sb2xlcw0KLXJvbGVTZXRfdGV4dF9wbHVyYWw9Q29uanVudG9zIGRlIHJvbGVzDQotcm9sZVNldEdyb3VwaW5nX3RleHRfcGx1cmFsPUFncnVwYWNpb25lcyBkZWwgY29uanVudG8gZGUgcm9sZXMNCi1zdGFuZGFyZENhdGVnb3J5X3RleHRfcGx1cmFsPUNhdGVnb3JcdTAwZWRhcyBlc3RcdTAwZTFuZGFyDQotc3RlcF90ZXh0X3BsdXJhbD1QYXNvcw0KLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0X3BsdXJhbD1NYXRlcmlhbGVzIGRlIHNvcG9ydGUNCi10YXNrX3RleHRfcGx1cmFsPVRhcmVhcw0KLXRhc2tEZXNjcmlwdG9yX3RleHRfcGx1cmFsPURlc2NyaXB0b3JlcyBkZSB0YXJlYQ0KLXRlYW1Qcm9maWxlX3RleHRfcGx1cmFsPVBlcmZpbGVzIGRlbCBlcXVpcG8NCi10ZW1wbGF0ZV90ZXh0X3BsdXJhbD1QbGFudGlsbGFzDQotdGVybURlZmluaXRpb25fdGV4dF9wbHVyYWw9RGVmaW5pY2lvbmVzIGRlbCB0XHUwMGU5cm1pbm8NCi10b29sX3RleHRfcGx1cmFsPUhlcnJhbWllbnRhcw0KLXRvb2xNZW50b3JfdGV4dF9wbHVyYWw9R3VcdTAwZWRhcyBkZSBsYSBoZXJyYW1pZW50YQ0KLXdoaXRlcGFwZXJfdGV4dF9wbHVyYWw9RG9jdW1lbnRhY2lcdTAwZjNuDQotd29ya1Byb2R1Y3RfdGV4dF9wbHVyYWw9UHJvZHVjdG9zIGRlIHRyYWJham8NCi13b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dF9wbHVyYWw9RGVzY3JpcHRvcmVzIGRlbCBwcm9kdWN0byBkZSB0cmFiYWpvDQotd29ya1Byb2R1Y3RFbGVtZW50X3RleHRfcGx1cmFsPUVsZW1lbnRvcyBkZSBwcm9kdWN0byBkZSB0cmFiYWpvDQotd29ya1Byb2R1Y3RUeXBlX3RleHRfcGx1cmFsPUNsYXNlcyBkZSBwcm9kdWN0byBkZSB0cmFiYWpvDQotDQotIyBBcHBsaWNhdGlvbiB0aXRsZS4NCi1hcHBsaWNhdGlvbl90aXRsZT17MH0gLSB7MX0NCi0NCi0jIE9wZW4gTWV0aG9kIExpYnJhcnkgRGlhbG9nDQotb3BlbkxpYnJhcnlEaWFsb2dfdGl0bGU9QWJyaXIgdW5hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zDQotb3BlbkxpYnJhcnlEaWFsb2dBcmVhX3RpdGxlPVNlbGVjY2lvbmFyIHVuYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcw0KLW9wZW5MaWJyYXJ5RGlhbG9nQXJlYV90ZXh0PXswfSBhbG1hY2VuYSBtXHUwMGU5dG9kb3MgeSBwcm9jZXNvcyBlbiB1bmEgY2FycGV0YSBsbGFtYWRhIFxuYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuIFNlbGVjY2lvbmUgdW5hIGNhcnBldGEgZGUgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgcGFyYSB1dGlsaXphciBlbiBlc3RhIHNlc2lcdTAwZjNuLg0KLWxpYnJhcnlMYWJlbF90ZXh0PUJpYmxpb3RlY2E6DQotYnJvd3NlQnV0dG9uX3RleHQ9RXhhbWluYXIuLi4NCi1wcm9tcHRGb3JMaWJyYXJ5Q2hlY2tib3hfdGV4dD1VdGlsaXphciBlc3RhIGJpYmxpb3RlY2EgY29tbyBwb3Igb21pc2lcdTAwZjNuIHkgbm8gdm9sdmVyIGEgcHJlZ3VudGFyLg0KLW9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dD1ObyBleGlzdGUgbmluZ3VuYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBlbiAnJ3swfScnLiBcblNlIGNyZWFyXHUwMGUxIHkgYWJyaXJcdTAwZTEgYXV0b21cdTAwZTF0aWNhbWVudGUgdW5hIG51ZXZhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGVuIGVsIGRpcmVjdG9yaW8gZXNwZWNpZmljYWRvLlxuXG5QdWxzZSBBY2VwdGFyIHBhcmEgY29udGludWFyIG8gQ2FuY2VsYXIgcGFyYSBlc3BlY2lmaWNhciBvdHJhIHZcdTAwZWRhIGRlIGFjY2VzbyBwYXJhIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLg0KLQ0KLSMgU2VsZWN0IE1ldGhvZCBMaWJyYXJ5IEZvbGRlciBEaWFsb2cNCi1zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RpdGxlPVNlbGVjY2lvbmFyIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zDQotc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190ZXh0PVNlbGVjY2lvbmUgdW5hIGNhcnBldGEgZGUgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuDQotDQotIyBPcGVuIExpYnJhcnkgUHJvZ3Jlc3MgTWVzc2FnZQ0KLW9wZW5pbmdMaWJyYXJ5VGFza19uYW1lPUFicmllbmRvIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLi4uDQotDQotIyBPcGVuIE1ldGhvZCBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLWludmFsaWRMaWJyYXJ5UGF0aF9tc2c9SVVQTDAzMDBFOiBObyBzZSBoYSBwb2RpZG8gYWJyaXIgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZXNwZWNpZmljYWRhLg0KLWludmFsaWRMaWJyYXJ5UGF0aF9yZWFzb249TGEgY2FycGV0YSBkZSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBzZWxlY2Npb25hZGEgbm8gZXMgdlx1MDBlMWxpZGEsIG5vIGV4aXN0ZSBvIG5vIHRpZW5lIGVsIHBlcm1pc28gYWRlY3VhZG8gcGFyYSBhY2NlZGVyIGEgZWxsYS5cblxuUHVsc2UgQWNlcHRhciBwYXJhIHNlbGVjY2lvbmFyIG90cmEgY2FycGV0YSBkZSBiaWJsaW90ZWNhLg0KLQ0KLSMgTGlicmFyeSBMb2NrZWQgRXJyb3IgRGlhbG9nDQotbGlicmFyeUxvY2tlZF9tc2c9SVVQTDAzMDNFOiBObyBzZSBoYSBwb2RpZG8gYWJyaXIgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZXNwZWNpZmljYWRhLlxuXG5MYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBzZWxlY2Npb25hZGEgcGFyZWNlIHF1ZSBzZSBlc3RcdTAwZTEgdXRpbGl6YW5kby4gUHVsc2UgQ2FuY2VsYXIgcGFyYSBzZWxlY2Npb25hciBvdHJhIGNhcnBldGEgZGUgYmlibGlvdGVjYSwgbyBwdWxzZSBGb3J6YXIgYWJyaXIgc2kgZGVzZWEgYWJyaXIgbGEgYmlibGlvdGVjYSBkZSB0b2RhcyBmb3JtYXMuXG5cbkFWSVNPOiBFbCB1c28gY29uY3VycmVudGUgZGUgdW5hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIHB1ZWRlIGNvcnJvbXBlciBsYSBiaWJsaW90ZWNhLg0KLWxpYnJhcnlMb2NrZWRfb3BlbkJ1dHRvbl90ZXh0PUZvcnphciBhYnJpcg0KLQ0KLSMgUmVhZC1vbmx5IFByb2plY3QgRmlsZSBFcnJvciBEaWFsb2cNCi1yZWFkT25seVByb2plY3RGaWxlX3RleHQ9SVVQTDAzMDJFOiAnJ3swfScnIGVzIGRlIHNcdTAwZjNsbyBsZWN0dXJhLiBTZWxlY2Npb25lIGxhIG9wY2lcdTAwZjNuIHBhcmEgcXVlIHNlIHB1ZWRhIGVzY3JpYmlyIGFudGVzIGRlIGNvbnRpbnVhci4NCi1yZXRyeUJ1dHRvbl90ZXh0PVJlaW50ZW50YXINCi1jYW5jZWxCdXR0b25fdGV4dD1DYW5jZWxhcg0KLQ0KLSMgVmVyc2lvbiBNaXNtYXRjaCBEaWFsb2cNCi12ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dD1JVVBMMzA1RTogTm8gc2UgcHVlZGUgYWJyaXIgbGEgYmlibGlvdGVjYSBzZWxlY2Npb25hZGEuIERlYmUgYWN0dWFsaXphciB7MH0gYSB1bmEgdmVyc2lcdTAwZjNuIHsxfSBvIHN1cGVyaW9yIHBhcmEgYWJyaXIgZXN0YSBiaWJsaW90ZWNhLg0KLXZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0X3Vua25vd249SVVQTDMwNkU6IE5vIHNlIHB1ZWRlIGFicmlyIGxhIGJpYmxpb3RlY2Egc2VsZWNjaW9uYWRhLiBEZWJlIGFjdHVhbGl6YXIgezB9IGEgdW5hIHZlcnNpXHUwMGYzbiBzdXBlcmlvciBwYXJhIGFicmlyIGVzdGEgYmlibGlvdGVjYS4NCi0NCi0jIFVwZ3JhZGUgTWV0aG9kIExpYnJhcnkgRGlhbG9nDQotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGl0bGU9QWN0dWFsaXphciBsYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RleHQ9TGEgYmlibGlvdGVjYSBxdWUgaGEgc2VsZWNjaW9uYWRvIHRpZW5lIHF1ZSBhY3R1YWxpemFyc2UgYSBsYSBudWV2YSBlc3RydWN0dXJhIGRlIGJpYmxpb3RlY2FzLlxuXG5cdTAwYmZEZXNlYSBjb250aW51YXIgY29uIGxhIGFjdHVhbGl6YWNpXHUwMGYzbj8NCi11cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lPUFjdHVhbGl6YW5kbyBsYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy4uLg0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEwwMzAxRTogTm8gc2UgaGEgcG9kaWRvIGFjdHVhbGl6YXIgbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuIENvbnN1bHRlIGVsIGFyY2hpdm8gZGUgcmVnaXN0cm8gcGFyYSBvYnRlbmVyIG1cdTAwZTFzIGRldGFsbGVzLg0KLQ0KLSMgU3dpdGNoIENvbmZpZ3VyYXRpb24gRGlhbG9nDQotc3dpdGNoQ29uZmlnRGlhbG9nX3RpdGxlPUNhbWJpYXIgY29uZmlndXJhY2lcdTAwZjNuDQotc3dpdGNoQ29uZmlnRGlhbG9nX3RleHQ9XHUwMGJmRGVzZWEgY2FtYmlhciBsYSBjb25maWd1cmFjaVx1MDBmM24gYWN0dWFsIHBvciBsYSBjb25maWd1cmFjaVx1MDBmM24gcG9yIG9taXNpXHUwMGYzbiwgJyd7MH0nJywgYXNvY2lhZGEgY29uIGVsIHByb2Nlc28gc2VsZWNjaW9uYWRvPw0KLQkNCi0jIENvbmZpZ3VyYXRpb24gQ29tYm8NCi1jdXJyZW50Q29uZmlnTGFiZWxfdGV4dD1Db25maWd1cmFjaVx1MDBmM24gYWN0dWFsOg0KLXNlbGVjdENvbmZpZ0xhYmVsX3RleHQ9U2VsZWNjaW9uZSB1bmEgY29uZmlndXJhY2lcdTAwZjNuDQotDQotIyBEZWxldGUgRmlsZXMgQ29uZmlybWF0aW9uIE1lc3NhZ2UNCi1kZWxldGVGaWxlc0NvbmZpcm1hdGlvbl9tc2c9TGEgdlx1MDBlZGEgZGUgYWNjZXNvIGVzcGVjaWZpY2FkYSAnJ3swfScnIHlhIGV4aXN0ZS4gU2Ugc3VwcmltaXJcdTAwZTFuIHRvZG9zIGxvcyBhcmNoaXZvcyBkZSBsYSBjYXJwZXRhLiBcdTAwYmZEZXNlYSBjb250aW51YXI/DQotDQotIyBQYXRocy9GaWxlcyBFcnJvciBNZXNzYWdlcw0KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPUxhIHZcdTAwZWRhIGRlIGFjY2VzbyAnJ3swfScnIGNvbnRpZW5lIHVubyBvIHZhcmlvcyBhcmNoaXZvcyBxdWUgbm8gc2UgcHVlZGVuIHN1cHJpbWlyLlxuXG5TZWxlY2Npb25lIG90cmEgdlx1MDBlZGEgZGUgYWNjZXNvIHkgdnVlbHZhIGEgaW50ZW50YXJsby4NCi1jcmVhdGVQYXRoRXJyb3JfcmVhc29uPU5vIHNlIGhhIHBvZGlkbyBsYSB2XHUwMGVkYSBkZSBhY2Nlc28gJyd7MH0nJy5cblxuU2VsZWNjaW9uZSBvdHJhIHZcdTAwZWRhIGRlIGFjY2VzbyB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotaW52YWxpZFBhdGhfbXNnPUxhIHZcdTAwZWRhIGRlIGFjY2VzbyBlc3BlY2lmaWNhZGEgbm8gZXMgdlx1MDBlMWxpZGEuDQotDQotIyBCYWNrdXAgTGlicmFyeSBEaWFsb2cNCi1iYWNrdXBMaWJyYXJ5RGlhbG9nX3RpdGxlPVJlYWxpemFyIGNvcGlhIGRlIHNlZ3VyaWRhZCBkZSBsYSBiaWJsaW90ZWNhDQotYmFja3VwTGlicmFyeURpYWxvZ190ZXh0PUVzIG11eSByZWNvbWVuZGFibGUgcXVlIGhhZ2EgdW5hIGNvcGlhIGRlIHNlZ3VyaWRhZCBkZSBsYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBhY3R1YWwgYW50ZXMgZGUgY29udGludWFyLlxuXG5QdWxzZSBBY2VwdGFyIHBhcmEgY3JlYXIgdW5hIGNvcGlhIGRlIHNlZ3VyaWRhZCBkZSBsYSBiaWJsaW90ZWNhIGVuIGVsIGRpcmVjdG9yaW8gZXNwZWNpZmljYWRvLiBQdWxzZSBPbWl0aXIgcGFyYSBjb250aW51YXIgc2luIGNyZWFyIHVuYSBjb3BpYSBkZSBzZWd1cmlkYWQuDQotYmFja2luZ1VwTGlicmFyeVRhc2tfbmFtZT1SZWFsaXphbmRvIHVuYSBjb3BpYSBkZSBzZWd1cmlkYWQgZGUgbG9zIGFyY2hpdm9zIGRlIGxhIGJpYmxpb3RlY2EuLi4NCi0NCi0jIFBhdGggU2VsZWN0aW9uIERpYWxvZw0KLXBhdGhTZWxlY3Rpb25FcnJvcl9tc2c9Tm8gc2UgaGEgcG9kaWRvIGNyZWFyIGVsIGRpcmVjdG9yaW8NCi1va0J1dHRvbl90ZXh0PUFjZXB0YXINCi1za2lwQnV0dG9uX3RleHQ9T21pdGlyDQotDQotIyBQcm9jZXNzIEVkaXRvciBwcmVmZXJlbmNlcw0KLWFsd2F5c0J1dHRvbl90ZXh0PVNpZW1wcmUNCi1uZXZlckJ1dHRvbl90ZXh0PU51bmNhDQotcHJvbXB0QnV0dG9uX3RleHQ9UHJlZ3VudGFyDQotDQotIyBBZGQgTGluayBEaWFsb2cNCi1saW5rVG9VUkxfbmFtZT1VUkwNCi1saW5rVG9GaWxlX25hbWU9QXJjaGl2bw0KLWVsZW1lbnRMaW5rX25hbWU9RWxlbWVudG8gZGUgbVx1MDBlOXRvZG8NCi1lbGVtZW50TGlua1dpdGhUeXBlX25hbWU9RWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gY29uIHByZWZpam8gdGlwbw0KLWVsZW1lbnRMaW5rV2l0aFVzZXJUZXh0X25hbWU9RWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gY29uIHRleHRvIHBlcnNvbmFsaXphZG8NCi0NCi0jIENvbnZlcnQgQWN0aXZpdHkgVHlwZSBEaWFsb2cNCi1jb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGl0bGU9Q29udmVydGlyIHRpcG8gZGUgYWN0aXZpZGFkDQotY29udmVydEFjdGl2aXR5RGlhbG9nX3RleHQ9U2VsZWNjaW9uYXIgdGlwbyBkZSBhY3RpdmlkYWQgZGUgZGVzdGluby4NCi11bnN1cHBvcnRlZEFjdGl2aXR5VHlwZV9tc2c9SVVQTDAzMDRFOiBFc3RhIGFjdGl2aWRhZCBubyBzZSBwdWVkZSBjb252ZXJ0aXIgZW4gb3RybyB0aXBvLg0KLXVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX3JlYXNvbj1ObyBoYXkgbmluZ1x1MDBmYW4gdGlwbyBkZSBhY3RpdmlkYWQgY29tcGF0aWJsZSBwYXJhIHswfS4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlMzI3MzcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgTmFtZXMgKFNpbmd1bGFyKQ0KLWFjdGl2aXR5X3RleHQ9QWN0aXZpdFx1MDBlOQ0KLWFydGlmYWN0X3RleHQ9QXJ0ZWZhY3QNCi1jYXBhYmlsaXR5UGF0dGVybl90ZXh0PVBhdHRlcm4gZGUgY2FwYWNpdFx1MDBlOQ0KLWNoZWNrbGlzdF90ZXh0PUxpc3RlIGRlIGNvbnRyXHUwMGY0bGUNCi1jaGVja0l0ZW1fdGV4dD1FbFx1MDBlOW1lbnQgZGUgdlx1MDBlOXJpZmljYXRpb24NCi1jb21wb3NpdGVSb2xlX3RleHQ9Ulx1MDBmNGxlIGNvbXBvc2l0ZQ0KLWNvbmNlcHRfdGV4dD1Db25jZXB0DQotY29udGVudFBhY2thZ2VfdGV4dD1QYWNrYWdlIGRlIGNvbnRlbnUNCi1jdXN0b21DYXRlZ29yeV90ZXh0PUNhdFx1MDBlOWdvcmllIHBlcnNvbm5hbGlzXHUwMGU5ZQ0KLWRlbGl2ZXJhYmxlX3RleHQ9TGl2cmFibGUNCi1kZWxpdmVyeVByb2Nlc3NfdGV4dD1Qcm9jZXNzdXMgZGUgbGl2cmFpc29uDQotZGVzY3JpcHRvcl90ZXh0PURlc2NyaXB0ZXVyDQotZGlzY2lwbGluZV90ZXh0PURpc2NpcGxpbmUNCi1kaXNjaXBsaW5lR3JvdXBpbmdfdGV4dD1SZWdyb3VwZW1lbnQgZGUgZGlzY2lwbGluZQ0KLWRvbWFpbl90ZXh0PURvbWFpbmUNCi1lc3RpbWF0ZV90ZXh0PUVzdGltYXRpb24NCi1lc3RpbWF0aW5nTWV0cmljX3RleHQ9TWVzdXJlIGQnZXN0aW1hdGlvbg0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0PUNvbnNpZFx1MDBlOXJhdGlvbnMgcmVsYXRpdmVzIFx1MDBlMCBsJ2VzdGltYXRpb24NCi1leGFtcGxlX3RleHQ9RXhlbXBsZQ0KLWd1aWRhbmNlX3RleHQ9Q29uc2VpbA0KLWd1aWRlbGluZV90ZXh0PUluc3RydWN0aW9ucw0KLWl0ZXJhdGlvbl90ZXh0PUl0XHUwMGU5cmF0aW9uDQotbWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0PUNvbmZpZ3VyYXRpb24gZGUgbVx1MDBlOXRob2RlDQotbWV0aG9kQ29udGVudF90ZXh0PUNvbnRlbnUgZGUgbGEgbVx1MDBlOXRob2RlDQotbWV0aG9kTGlicmFyeV90ZXh0PUJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMNCi1tZXRob2RQYWNrYWdlX3RleHQ9UGFja2FnZSBkZSBtXHUwMGU5dGhvZGUNCi1tZXRob2RQbHVnaW5fdGV4dD1QbHVnLWluIGRlIG1cdTAwZTl0aG9kZQ0KLW1pbGVzdG9uZV90ZXh0PUphbG9uDQotb3V0Y29tZV90ZXh0PVNvcnRpZQ0KLXBoYXNlX3RleHQ9UGhhc2UNCi1wcmFjdGljZV90ZXh0PVByYXRpcXVlDQotcHJvY2Vzc190ZXh0PVByb2Nlc3N1cw0KLXByb2Nlc3NDb250cmlidXRpb25fdGV4dD1Qcm9jZXNzdXMgZGlmZlx1MDBlOXJlbnRpZWwNCi1wcm9jZXNzRmFtaWx5X3RleHQ9RmFtaWxsZSBkZSBwcm9jZXNzdXMNCi1wcm9jZXNzUGFja2FnZV90ZXh0PVBhY2thZ2UgZGUgcHJvY2Vzc3VzDQotcmVwb3J0X3RleHQ9UmFwcG9ydA0KLXJldXNhYmxlQXNzZXRfdGV4dD1SZXNzb3VyY2Ugclx1MDBlOXV0aWxpc2FibGUNCi1yb2FkbWFwX3RleHQ9RmV1aWxsZSBkZSByb3V0ZQ0KLXJvbGVEZXNjcmlwdG9yX3RleHQ9RGVzY3JpcHRldXIgZGUgclx1MDBmNGxlDQotcm9sZV90ZXh0PVJcdTAwZjRsZQ0KLXJvbGVTZXRfdGV4dD1FbnNlbWJsZSBkZSByXHUwMGY0bGVzDQotcm9sZVNldEdyb3VwaW5nX3RleHQ9UmVncm91cGVtZW50IGQnZW5zZW1ibGVzIGRlIHJcdTAwZjRsZXMNCi1zdGFuZGFyZENhdGVnb3J5X3RleHQ9Q2F0XHUwMGU5Z29yaWUgc3RhbmRhcmQNCi1zdGVwX3RleHQ9RXRhcGUNCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dD1Eb2N1bWVudCBkJ2FjY29tcGFnbmVtZW50DQotdGFza190ZXh0PVRcdTAwZTJjaGUNCi10YXNrRGVzY3JpcHRvcl90ZXh0PURlc2NyaXB0ZXVyIGRlIHRcdTAwZTJjaGUNCi10ZWFtUHJvZmlsZV90ZXh0PVByb2ZpbCBkZSBsJ1x1MDBlOXF1aXBlDQotdGVtcGxhdGVfdGV4dD1DYW5ldmFzDQotdGVybURlZmluaXRpb25fdGV4dD1EXHUwMGU5ZmluaXRpb24gZGUgdGVybWUNCi10b29sX3RleHQ9T3V0aWwNCi10b29sTWVudG9yX3RleHQ9R3VpZGUgZCd1dGlsaXNhdGlvbiBkZSBsJ291dGlsDQotd2hpdGVwYXBlcl90ZXh0PUxpdnJlIGJsYW5jDQotd29ya1Byb2R1Y3RfdGV4dD1Qcm9kdWl0DQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9RGVzY3JpcHRldXIgZGUgcHJvZHVpdA0KLXdvcmtQcm9kdWN0RWxlbWVudF90ZXh0PUVsXHUwMGU5bWVudCBkZSBwcm9kdWl0DQotd29ya1Byb2R1Y3RUeXBlX3RleHQ9VHlwZSBkZSBwcm9kdWl0DQotDQotIyBNZXRob2QgRWxlbWVudCBOYW1lcyAoUGx1cmFsKQ0KLWFjdGl2aXR5X3RleHRfcGx1cmFsPUFjdGl2aXRcdTAwZTlzDQotYXJ0aWZhY3RfdGV4dF9wbHVyYWw9QXJ0ZWZhY3RzDQotY2FwYWJpbGl0eVBhdHRlcm5fdGV4dF9wbHVyYWw9UGF0dGVybnMgZGUgY2FwYWNpdFx1MDBlOQ0KLWNoZWNrbGlzdF90ZXh0X3BsdXJhbD1MaXN0ZXMgZGUgY29udHJcdTAwZjRsZQ0KLWNoZWNrSXRlbV90ZXh0X3BsdXJhbD1FbFx1MDBlOW1lbnRzIGRlIHZcdTAwZTlyaWZpY2F0aW9uDQotY29tcG9zaXRlUm9sZV90ZXh0X3BsdXJhbD1SXHUwMGY0bGVzIGNvbXBvc2l0ZXMNCi1jb25jZXB0X3RleHRfcGx1cmFsPUNvbmNlcHRzDQotY29udGVudFBhY2thZ2VfdGV4dF9wbHVyYWw9UGFja2FnZXMgZGUgY29udGVudQ0KLWN1c3RvbUNhdGVnb3J5X3RleHRfcGx1cmFsPUNhdFx1MDBlOWdvcmllcyBwZXJzb25uYWxpc1x1MDBlOWVzDQotZGVsaXZlcmFibGVfdGV4dF9wbHVyYWw9TGl2cmFibGVzDQotZGVsaXZlcnlQcm9jZXNzX3RleHRfcGx1cmFsPVByb2Nlc3N1cyBkZSBsaXZyYWlzb24NCi1kZXNjcmlwdG9yX3RleHRfcGx1cmFsPURlc2NyaXB0ZXVycw0KLWRpc2NpcGxpbmVfdGV4dF9wbHVyYWw9RGlzY2lwbGluZXMNCi1kaXNjaXBsaW5lR3JvdXBpbmdfdGV4dF9wbHVyYWw9UmVncm91cGVtZW50cyBkZSBkaXNjaXBsaW5lcw0KLWRvbWFpbl90ZXh0X3BsdXJhbD1Eb21haW5lcw0KLWVzdGltYXRlX3RleHRfcGx1cmFsPUVzdGltYXRpb25zDQotZXN0aW1hdGluZ01ldHJpY190ZXh0X3BsdXJhbD1NZXN1cmVzIGQnZXN0aW1hdGlvbg0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0X3BsdXJhbD1Db25zaWRcdTAwZTlyYXRpb25zIHJlbGF0aXZlcyBcdTAwZTAgbCdlc3RpbWF0aW9uDQotZXhhbXBsZV90ZXh0X3BsdXJhbD1FeGVtcGxlcw0KLWd1aWRhbmNlX3RleHRfcGx1cmFsPUNvbnNlaWxzDQotZ3VpZGVsaW5lX3RleHRfcGx1cmFsPUluc3RydWN0aW9ucw0KLWl0ZXJhdGlvbl90ZXh0X3BsdXJhbD1JdFx1MDBlOXJhdGlvbnMNCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHRfcGx1cmFsPUNvbmZpZ3VyYXRpb25zIGRlIG1cdTAwZTl0aG9kZQ0KLW1ldGhvZENvbnRlbnRfdGV4dF9wbHVyYWw9Q29udGVudXMgZGUgbVx1MDBlOXRob2RlDQotbWV0aG9kTGlicmFyeV90ZXh0X3BsdXJhbD1CaWJsaW90aFx1MDBlOHF1ZXMgZGUgbVx1MDBlOXRob2Rlcw0KLW1ldGhvZFBhY2thZ2VfdGV4dF9wbHVyYWw9UGFja2FnZXMgZGUgbVx1MDBlOXRob2RlDQotbWV0aG9kUGx1Z2luX3RleHRfcGx1cmFsPVBsdWctaW5zIGRlIG1cdTAwZTl0aG9kZQ0KLW1pbGVzdG9uZV90ZXh0X3BsdXJhbD1KYWxvbnMNCi1vdXRjb21lX3RleHRfcGx1cmFsPVNvcnRpZXMNCi1waGFzZV90ZXh0X3BsdXJhbD1QaGFzZXMNCi1wcmFjdGljZV90ZXh0X3BsdXJhbD1QcmF0aXF1ZXMNCi1wcm9jZXNzX3RleHRfcGx1cmFsPVByb2Nlc3N1cw0KLXByb2Nlc3NDb250cmlidXRpb25fdGV4dF9wbHVyYWw9UHJvY2Vzc3VzIGRpZmZcdTAwZTlyZW50aWVscw0KLXByb2Nlc3NGYW1pbHlfdGV4dF9wbHVyYWw9RmFtaWxsZXMgZGUgcHJvY2Vzc3VzDQotcHJvY2Vzc1BhY2thZ2VfdGV4dF9wbHVyYWw9UGFja2FnZXMgZGUgcHJvY2Vzc3VzDQotcmVwb3J0X3RleHRfcGx1cmFsPVJhcHBvcnRzDQotcmV1c2FibGVBc3NldF90ZXh0X3BsdXJhbD1SZXNzb3VyY2VzIHJcdTAwZTl1dGlsaXNhYmxlcw0KLXJvYWRtYXBfdGV4dF9wbHVyYWw9Q2FsZW5kcmllcnMNCi1yb2xlRGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1EZXNjcmlwdGV1cnMgZGUgclx1MDBmNGxlDQotcm9sZV90ZXh0X3BsdXJhbD1SXHUwMGY0bGVzDQotcm9sZVNldF90ZXh0X3BsdXJhbD1FbnNlbWJsZXMgZGUgclx1MDBmNGxlcw0KLXJvbGVTZXRHcm91cGluZ190ZXh0X3BsdXJhbD1SZWdyb3VwZW1lbnRzIGQnZW5zZW1ibGVzIGRlIHJcdTAwZjRsZXMNCi1zdGFuZGFyZENhdGVnb3J5X3RleHRfcGx1cmFsPUNhdFx1MDBlOWdvcmllcyBzdGFuZGFyZA0KLXN0ZXBfdGV4dF9wbHVyYWw9RXRhcGVzDQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHRfcGx1cmFsPURvY3VtZW50cyBkJ2FjY29tcGFnbmVtZW50DQotdGFza190ZXh0X3BsdXJhbD1UXHUwMGUyY2hlcw0KLXRhc2tEZXNjcmlwdG9yX3RleHRfcGx1cmFsPURlc2NyaXB0ZXVycyBkZSB0XHUwMGUyY2hlcw0KLXRlYW1Qcm9maWxlX3RleHRfcGx1cmFsPVByb2ZpbHMgZGUgbCdcdTAwZTlxdWlwZQ0KLXRlbXBsYXRlX3RleHRfcGx1cmFsPUNhbmV2YXMNCi10ZXJtRGVmaW5pdGlvbl90ZXh0X3BsdXJhbD1EXHUwMGU5ZmluaXRpb25zIGRlIHRlcm1lcw0KLXRvb2xfdGV4dF9wbHVyYWw9T3V0aWxzDQotdG9vbE1lbnRvcl90ZXh0X3BsdXJhbD1HdWlkZXMgZCd1dGlsaXNhdGlvbiBkZSBsJ291dGlsDQotd2hpdGVwYXBlcl90ZXh0X3BsdXJhbD1MaXZyZXMgYmxhbmNzDQotd29ya1Byb2R1Y3RfdGV4dF9wbHVyYWw9UHJvZHVpdHMNCi13b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dF9wbHVyYWw9RGVzY3JpcHRldXJzIGRlIHByb2R1aXRzDQotd29ya1Byb2R1Y3RFbGVtZW50X3RleHRfcGx1cmFsPUVsXHUwMGU5bWVudHMgZGUgcHJvZHVpdA0KLXdvcmtQcm9kdWN0VHlwZV90ZXh0X3BsdXJhbD1UeXBlcyBkZSBwcm9kdWl0cw0KLQ0KLSMgQXBwbGljYXRpb24gdGl0bGUuDQotYXBwbGljYXRpb25fdGl0bGU9ezB9IC0gezF9DQotDQotIyBPcGVuIE1ldGhvZCBMaWJyYXJ5IERpYWxvZw0KLW9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlPU91dnJpciB1bmUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcw0KLW9wZW5MaWJyYXJ5RGlhbG9nQXJlYV90aXRsZT1TXHUwMGU5bGVjdGlvbm5lciB1bmUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcw0KLW9wZW5MaWJyYXJ5RGlhbG9nQXJlYV90ZXh0PXswfSBzdG9ja2UgbGVzIG1cdTAwZTl0aG9kZXMgZXQgbGVzIHByb2Nlc3N1cyBkYW5zIHVuIGRvc3NpZXIgZFx1MDBlOW5vbW1cdTAwZTkgXG5iaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzLiBTXHUwMGU5bGVjdGlvbm5leiBsZSBkb3NzaWVyIGRlIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgXHUwMGUwIHV0aWxpc2VyIHBvdXIgY2V0dGUgc2Vzc2lvbi4NCi1saWJyYXJ5TGFiZWxfdGV4dD1CaWJsaW90aFx1MDBlOHF1ZSA6DQotYnJvd3NlQnV0dG9uX3RleHQ9UGFyY291cmlyLi4uDQotcHJvbXB0Rm9yTGlicmFyeUNoZWNrYm94X3RleHQ9VXRpbGlzZXotbGUgcGFyIGRcdTAwZTlmYXV0IGV0IG5lIHBsdXMgcmVwb3NlciBsYSBxdWVzdGlvbi4NCi1vcGVuTGlicmFyeURpYWxvZ19uZXdMaWJyYXJ5X3RleHQ9QXVjdW5lIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZGFucyAnJ3swfScnLlxuVW5lIG5vdXZlbGxlIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgc2VyYSBjclx1MDBlOVx1MDBlOWUgZXQgb3V2ZXJ0ZSBhdXRvbWF0aXF1ZW1lbnQgZGFucyBsZSByXHUwMGU5cGVydG9pcmUgaW5kaXF1XHUwMGU5LlxuXG5DbGlxdWV6IHN1ciBPSyBwb3VyIGNvbnRpbnVlciBvdSBzdXIgQW5udWxlciBwb3VyIGluZGlxdWVyIHVuIGF1dHJlIGNoZW1pbiBkZSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzLg0KLQ0KLSMgU2VsZWN0IE1ldGhvZCBMaWJyYXJ5IEZvbGRlciBEaWFsb2cNCi1zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RpdGxlPVNcdTAwZTlsZWN0aW9ubmVyIHVuZSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzDQotc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190ZXh0PVNcdTAwZTlsZWN0aW9ubmV6IHVuIGRvc3NpZXIgZGUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcy4NCi0NCi0jIE9wZW4gTGlicmFyeSBQcm9ncmVzcyBNZXNzYWdlDQotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9T3V2ZXJ0dXJlIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMuLi4NCi0NCi0jIE9wZW4gTWV0aG9kIExpYnJhcnkgRXJyb3IgRGlhbG9nDQotaW52YWxpZExpYnJhcnlQYXRoX21zZz1JVVBMMDMwMEUgOiBJbXBvc3NpYmxlIGQnb3V2cmlyIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgc3BcdTAwZTljaWZpXHUwMGU5ZS4NCi1pbnZhbGlkTGlicmFyeVBhdGhfcmVhc29uPUxlIGRvc3NpZXIgZGUgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2RlcyBzXHUwMGU5bGVjdGlvbm5cdTAwZTkgZXN0IG5vbiB2YWxpZGUsIG4nZXhpc3RlIHBhcyBvdSB2b3VzIG4nXHUwMGVhdGVzIHBhcyBhdXRvcmlzXHUwMGU5IFx1MDBlMCB5IGFjY1x1MDBlOWRlci5cblxuQ2xpcXVleiBzdXIgT0sgcG91ciBzXHUwMGU5bGVjdGlvbm5lciB1biBhdXRyZSBkb3NzaWVyIGRlIGJpYmxpb3RoXHUwMGU4cXVlLg0KLQ0KLSMgTGlicmFyeSBMb2NrZWQgRXJyb3IgRGlhbG9nDQotbGlicmFyeUxvY2tlZF9tc2c9SVVQTDAzMDNFIDogSW1wb3NzaWJsZSBkJ291dnJpciBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIHNwXHUwMGU5Y2lmaVx1MDBlOWUuXG5cbkxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZSBzZW1ibGUgXHUwMGVhdHJlIGVuIGNvdXJzIGQndXRpbGlzYXRpb24uIENsaXF1ZXogc3VyIEFubnVsZXIgcG91ciBzXHUwMGU5bGVjdGlvbm5lciB1biBhdXRyZSByXHUwMGU5cGVydG9pcmUgZGUgYmlibGlvdGhcdTAwZThxdWUgb3UgY2xpcXVleiBzdXIgRm9yY2VyIGwnb3V2ZXJ0dXJlIHNpIHZvdXMgc291aGFpdGV6IGVuY29yZSBvdXZyaXIgbGEgYmlibGlvdGhcdTAwZThxdWUuXG5cbkFWRVJUSVNTRU1FTlQgOiBMJ3V0aWxpc2F0aW9uIHNpbXVsdGFuXHUwMGU5ZSBkJ3VuZSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIHBldXQgZW5kb21tYWdlciBjZXR0ZSBkZXJuaVx1MDBlOHJlLg0KLWxpYnJhcnlMb2NrZWRfb3BlbkJ1dHRvbl90ZXh0PUZvcmNlciBsJ291dmVydHVyZQ0KLQ0KLSMgUmVhZC1vbmx5IFByb2plY3QgRmlsZSBFcnJvciBEaWFsb2cNCi1yZWFkT25seVByb2plY3RGaWxlX3RleHQ9SVVQTDAzMDJFIDogJyd7MH0nJyBlc3QgZW4gbGVjdHVyZSBzZXVsZW1lbnQuIEF2YW50IGRlIGNvbnRpbnVlciwgZmFpdGVzIGVuIHNvcnRlIHF1JydpbCBzb2l0IG1vZGlmaWFibGUuDQotcmV0cnlCdXR0b25fdGV4dD1SXHUwMGU5ZXNzYXllcg0KLWNhbmNlbEJ1dHRvbl90ZXh0PUFubnVsZXINCi0NCi0jIFZlcnNpb24gTWlzbWF0Y2ggRGlhbG9nDQotdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHQ9SVVQTDMwNUUgOiBJbXBvc3NpYmxlIGQnJ291dnJpciBsYSBiaWJsaW90aFx1MDBlOHF1ZSBzXHUwMGU5bGVjdGlvbm5cdTAwZTllLiBWb3VzIGRldmV6IGVmZmVjdHVlciB1bmUgbWlzZSBcdTAwZTAgbml2ZWF1IGRlIHswfSB2ZXJzIGxhIHZlcnNpb24gezF9IG91IHN1cFx1MDBlOXJpZXVyZSBhZmluIGQnJ291dnJpciBjZXR0ZSBiaWJsaW90aFx1MDBlOHF1ZS4NCi12ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dF91bmtub3duPUlVUEwzMDZFOiBJbXBvc3NpYmxlIGQnJ291dnJpciBsYSBiaWJsaW90aFx1MDBlOHF1ZSBzXHUwMGU5bGVjdGlvbm5cdTAwZTllLiBWb3VzIGRldmV6IGVmZmVjdHVlciB1bmUgbWlzZSBcdTAwZTAgbml2ZWF1IGRlIGxhIHZlcnNpb24gezB9IFx1MDBlMCB1bmUgdmVyc2lvbiBzdXBcdTAwZTlyaWV1cmUgYWZpbiBkJydvdXZyaXIgY2V0dGUgYmlibGlvdGhcdTAwZThxdWUuDQotDQotIyBVcGdyYWRlIE1ldGhvZCBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPU1ldHRyZSBcdTAwZTAgbml2ZWF1IGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMNCi11cGdyYWRlTGlicmFyeURpYWxvZ190ZXh0PUxhIGJpYmxpb3RoXHUwMGU4cXVlIHF1ZSB2b3VzIGF2ZXogc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZSBkb2l0IFx1MDBlYXRyZSBtaXNlIFx1MDBlMCBuaXZlYXUgdmVycyBsYSBub3V2ZWxsZSBzdHJ1Y3R1cmUgZGUgYmlibGlvdGhcdTAwZThxdWUuXG5cblZvdWxlei12b3VzIGVmZmVjdHVlciBsYSBtaXNlIFx1MDBlMCBuaXZlYXUgPw0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9TWlzZSBcdTAwZTAgbml2ZWF1IGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMuLi4NCi0NCi0jIFVwZ3JhZGUgTGlicmFyeSBFcnJvciBEaWFsb2cNCi11cGdyYWRlTGlicmFyeUVycm9yX21zZz1JVVBMMDMwMUUgOiBFY2hlYyBkZSBsYSBtaXNlIFx1MDBlMCBuaXZlYXUgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUgZGUgbVx1MDBlOXRob2Rlcy4gQ29uc3VsdGV6IGxlIGZpY2hpZXIgam91cm5hbCBwb3VyIHBsdXMgZGUgZFx1MDBlOXRhaWxzLg0KLQ0KLSMgU3dpdGNoIENvbmZpZ3VyYXRpb24gRGlhbG9nDQotc3dpdGNoQ29uZmlnRGlhbG9nX3RpdGxlPUNoYW5nZXIgbGEgY29uZmlndXJhdGlvbg0KLXN3aXRjaENvbmZpZ0RpYWxvZ190ZXh0PVZvdWxlei12b3VzIGNoYW5nZXIgbGEgY29uZmlndXJhdGlvbiBlbiBjb3VycyBhdSBwcm9maXQgZGUgbGEgY29uZmlndXJhdGlvbiBwYXIgZFx1MDBlOWZhdXQsICcnezB9JycsIGFzc29jaVx1MDBlOWUgYXUgcHJvY2Vzc3VzIHNcdTAwZTlsZWN0aW9ublx1MDBlOSA/DQotCQ0KLSMgQ29uZmlndXJhdGlvbiBDb21ibw0KLWN1cnJlbnRDb25maWdMYWJlbF90ZXh0PUNvbmZpZ3VyYXRpb24gZW4gY291cnMgOg0KLXNlbGVjdENvbmZpZ0xhYmVsX3RleHQ9U1x1MDBlOWxlY3Rpb25uZXogdW5lIGNvbmZpZ3VyYXRpb24NCi0NCi0jIERlbGV0ZSBGaWxlcyBDb25maXJtYXRpb24gTWVzc2FnZQ0KLWRlbGV0ZUZpbGVzQ29uZmlybWF0aW9uX21zZz1MZSBjaGVtaW4gc3BcdTAwZTljaWZpXHUwMGU5ICcnezB9JycgZXhpc3RlIGRcdTAwZTlqXHUwMGUwLiBUb3VzIGxlcyBmaWNoaWVycyBkdSBkb3NzaWVyIHNlcm9udCBzdXBwcmltXHUwMGU5cy4gVm91bGV6LXZvdXMgY29udGludWVyID8NCi0NCi0jIFBhdGhzL0ZpbGVzIEVycm9yIE1lc3NhZ2VzDQotZGVsZXRlRmlsZXNFcnJvcl9yZWFzb249TGUgY2hlbWluICcnezB9JycgY29udGllbnQgdW4gb3UgcGx1c2lldXJzIGZpY2hpZXJzIHF1aSBuZSBwZXV2ZW50IHBhcyBcdTAwZWF0cmUgc3VwcHJpbVx1MDBlOXMuXG5cblNcdTAwZTlsZWN0aW9ubmV6IHVuIGF1dHJlIGNoZW1pbiBldCByXHUwMGU5ZXNzYXllei4NCi1jcmVhdGVQYXRoRXJyb3JfcmVhc29uPUltcG9zc2libGUgZGUgY3JcdTAwZTllciBsZSBjaGVtaW4gJyd7MH0nJy5cblxuU1x1MDBlOWxlY3Rpb25uZXogdW4gYXV0cmUgY2hlbWluIGV0IHJcdTAwZTllc3NheWV6Lg0KLWludmFsaWRQYXRoX21zZz1MZSBjaGVtaW4gc3BcdTAwZTljaWZpXHUwMGU5IGVzdCBub24gdmFsaWRlLg0KLQ0KLSMgQmFja3VwIExpYnJhcnkgRGlhbG9nDQotYmFja3VwTGlicmFyeURpYWxvZ190aXRsZT1TYXV2ZWdhcmRlciBsYSBiaWJsaW90aFx1MDBlOHF1ZQ0KLWJhY2t1cExpYnJhcnlEaWFsb2dfdGV4dD1JbCBlc3QgZm9ydGVtZW50IGNvbnNlaWxsXHUwMGU5IGRlIHNhdXZlZ2FyZGVyIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZW4gY291cnMgYXZhbnQgZGUgcG91cnN1aXZyZS5cblxuQ2xpcXVleiBzdXIgT0sgcG91ciBjclx1MDBlOWVyIHVuZSBjb3BpZSBkZSBzYXV2ZWdhcmRlIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRhbnMgbGUgclx1MDBlOXBlcnRvaXJlIHNwXHUwMGU5Y2lmaVx1MDBlOS4gQ2xpcXVleiBzdXIgSWdub3JlciBwb3VyIGNvbnRpbnVlciBzYW5zIGNyXHUwMGU5ZXIgbGEgc2F1dmVnYXJkZS4NCi1iYWNraW5nVXBMaWJyYXJ5VGFza19uYW1lPUNyXHUwMGU5YXRpb24gZCd1bmUgY29waWUgZGUgc2F1dmVnYXJkZSBkZXMgZmljaGllcnMgZGUgYmlibGlvdGhcdTAwZThxdWUuLi4NCi0NCi0jIFBhdGggU2VsZWN0aW9uIERpYWxvZw0KLXBhdGhTZWxlY3Rpb25FcnJvcl9tc2c9SW1wb3NzaWJsZSBkZSBjclx1MDBlOWVyIGxlIHJcdTAwZTlwZXJ0b2lyZQ0KLW9rQnV0dG9uX3RleHQ9T0sNCi1za2lwQnV0dG9uX3RleHQ9SWdub3Jlcg0KLQ0KLSMgUHJvY2VzcyBFZGl0b3IgcHJlZmVyZW5jZXMNCi1hbHdheXNCdXR0b25fdGV4dD1Ub3Vqb3Vycw0KLW5ldmVyQnV0dG9uX3RleHQ9SmFtYWlzDQotcHJvbXB0QnV0dG9uX3RleHQ9RGVtYW5kZXINCi0NCi0jIEFkZCBMaW5rIERpYWxvZw0KLWxpbmtUb1VSTF9uYW1lPVVSTA0KLWxpbmtUb0ZpbGVfbmFtZT1GaWNoaWVyDQotZWxlbWVudExpbmtfbmFtZT1FbFx1MDBlOW1lbnQgZGUgbVx1MDBlOXRob2RlDQotZWxlbWVudExpbmtXaXRoVHlwZV9uYW1lPUVsXHUwMGU5bWVudCBkZSBtXHUwMGU5dGhvZGUgYXZlYyBwclx1MDBlOWZpeGUgZGUgdHlwZQ0KLWVsZW1lbnRMaW5rV2l0aFVzZXJUZXh0X25hbWU9RWxcdTAwZTltZW50IGRlIG1cdTAwZTl0aG9kZSBhdmVjIHRleHRlIHBlcnNvbm5hbGlzXHUwMGU5DQotDQotIyBDb252ZXJ0IEFjdGl2aXR5IFR5cGUgRGlhbG9nDQotY29udmVydEFjdGl2aXR5RGlhbG9nX3RpdGxlPUNvbnZlcnRpciBsZSB0eXBlIGQnYWN0aXZpdFx1MDBlOQ0KLWNvbnZlcnRBY3Rpdml0eURpYWxvZ190ZXh0PVNcdTAwZTlsZWN0aW9ubmVyIGxlIHR5cGUgZCdhY3Rpdml0XHUwMGU5IGNpYmxlLg0KLXVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX21zZz1JVVBMMDMwNEUgOiBDZXR0ZSBhY3Rpdml0XHUwMGU5IG5lIHBldXQgcGFzIFx1MDBlYXRyZSBjb252ZXJ0aWUgZGFucyB1biBhdXRyZSB0eXBlLg0KLXVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX3JlYXNvbj1BdWN1biB0eXBlIGQnJ2FjdGl2aXRcdTAwZTkgbicnZXN0IGNvbXBhdGlibGUgcG91ciB7MH0uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZjA4NjQwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChTaW5ndWxhcikNCi1hY3Rpdml0eV90ZXh0PUF0dGl2aXRcdTAwZTANCi1hcnRpZmFjdF90ZXh0PUFydGVmYXR0bw0KLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9TW9kZWxsbyBkaSBjYXBhY2l0XHUwMGUwDQotY2hlY2tsaXN0X3RleHQ9RWxlbmNvIGRpIGNvbnRyb2xsbw0KLWNoZWNrSXRlbV90ZXh0PVZvY2UgZWxlbmNvIGRpIGNvbnRyb2xsbw0KLWNvbXBvc2l0ZVJvbGVfdGV4dD1SdW9sbyBjb21wb3NpdG8NCi1jb25jZXB0X3RleHQ9Q29uY2V0dG8NCi1jb250ZW50UGFja2FnZV90ZXh0PVBhY2NoZXR0byBkZWwgY29udGVudXRvDQotY3VzdG9tQ2F0ZWdvcnlfdGV4dD1DYXRlZ29yaWEgcGVyc29uYWxpenphdGENCi1kZWxpdmVyYWJsZV90ZXh0PUNvbXBvbmVudGUgZGlzdHJpYnVpYmlsZQ0KLWRlbGl2ZXJ5UHJvY2Vzc190ZXh0PVByb2Nlc3NvIGRpIHByb2R1emlvbmUNCi1kZXNjcmlwdG9yX3RleHQ9RGVzY3JpdHRvcmUNCi1kaXNjaXBsaW5lX3RleHQ9RGlzY2lwbGluYQ0KLWRpc2NpcGxpbmVHcm91cGluZ190ZXh0PVJhZ2dydXBwYW1lbnRvIGRpc2NpcGxpbmUNCi1kb21haW5fdGV4dD1Eb21pbmlvDQotZXN0aW1hdGVfdGV4dD1WYWx1dGF6aW9uZQ0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dD1NZXRyaWNhIGRpIHZhbHV0YXppb25lDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ9Q29uc2lkZXJhemlvbmkgc3VsbGEgdmFsdXRhemlvbmUNCi1leGFtcGxlX3RleHQ9RXNlbXBpbw0KLWd1aWRhbmNlX3RleHQ9R3VpZGENCi1ndWlkZWxpbmVfdGV4dD1MaW5lYSBndWlkYQ0KLWl0ZXJhdGlvbl90ZXh0PUl0ZXJhemlvbmUNCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHQ9Q29uZmlndXJhemlvbmUgZGkgbWV0b2RvDQotbWV0aG9kQ29udGVudF90ZXh0PUNvbnRlbnV0byBkaSBtZXRvZG8NCi1tZXRob2RMaWJyYXJ5X3RleHQ9TGlicmVyaWEgZGVpIG1ldG9kaQ0KLW1ldGhvZFBhY2thZ2VfdGV4dD1QYWNjaGV0dG8gZGkgbWV0b2RvDQotbWV0aG9kUGx1Z2luX3RleHQ9UGx1Zy1pbiBkaSBtZXRvZG8NCi1taWxlc3RvbmVfdGV4dD1NaWxlc3RvbmUNCi1vdXRjb21lX3RleHQ9UmlzdWx0YXRvDQotcGhhc2VfdGV4dD1GYXNlDQotcHJhY3RpY2VfdGV4dD1Qcm9jZWR1cmENCi1wcm9jZXNzX3RleHQ9UHJvY2Vzc28NCi1wcm9jZXNzQ29udHJpYnV0aW9uX3RleHQ9UHJvY2Vzc28gZGlmZmVyZW56aWFsZQ0KLXByb2Nlc3NGYW1pbHlfdGV4dD1GYW1pZ2xpYSBwcm9jZXNzbw0KLXByb2Nlc3NQYWNrYWdlX3RleHQ9UGFjY2hldHRvIHByb2Nlc3NvDQotcmVwb3J0X3RleHQ9UmVwb3J0DQotcmV1c2FibGVBc3NldF90ZXh0PVJpc29yc2Egcml1dGlsaXp6YWJpbGUNCi1yb2FkbWFwX3RleHQ9Um9hZG1hcA0KLXJvbGVEZXNjcmlwdG9yX3RleHQ9RGVzY3JpdHRvcmUgZGkgcnVvbGkNCi1yb2xlX3RleHQ9UnVvbG8NCi1yb2xlU2V0X3RleHQ9SW5zaWVtZSBkaSBydW9saQ0KLXJvbGVTZXRHcm91cGluZ190ZXh0PVJhZ2dydXBwYW1lbnRvIGluc2llbWkgZGkgcnVvbGkNCi1zdGFuZGFyZENhdGVnb3J5X3RleHQ9Q2F0ZWdvcmlhIHN0YW5kYXJkDQotc3RlcF90ZXh0PVBhc3NvDQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ9TWF0ZXJpYWxlIGRpIHN1cHBvcnRvDQotdGFza190ZXh0PU9wZXJhemlvbmUNCi10YXNrRGVzY3JpcHRvcl90ZXh0PURlc2NyaXR0b3JlIGRpIG9wZXJhemlvbmkNCi10ZWFtUHJvZmlsZV90ZXh0PVByb2ZpbG8gdGVhbQ0KLXRlbXBsYXRlX3RleHQ9TW9kZWxsbw0KLXRlcm1EZWZpbml0aW9uX3RleHQ9RGVmaW5pemlvbmUgdGVybWluZQ0KLXRvb2xfdGV4dD1Ub29sDQotdG9vbE1lbnRvcl90ZXh0PUd1aWRhIGFsIHRvb2wNCi13aGl0ZXBhcGVyX3RleHQ9V2hpdGVwYXBlcg0KLXdvcmtQcm9kdWN0X3RleHQ9UHJvZG90dG8gZGkgbGF2b3JvDQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9RGVzY3JpdHRvcmUgZGkgcHJvZG90dGkgZGkgbGF2b3JvDQotd29ya1Byb2R1Y3RFbGVtZW50X3RleHQ9RWxlbWVudG8gcHJvZG90dG8gZGkgbGF2b3JvDQotd29ya1Byb2R1Y3RUeXBlX3RleHQ9VGlwbyBkaSBwcm9kb3R0byBkaSBsYXZvcm8NCi0NCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChQbHVyYWwpDQotYWN0aXZpdHlfdGV4dF9wbHVyYWw9QXR0aXZpdFx1MDBlMA0KLWFydGlmYWN0X3RleHRfcGx1cmFsPUFydGVmYXR0aQ0KLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHRfcGx1cmFsPU1vZGVsbGkgZGkgY2FwYWNpdFx1MDBlMA0KLWNoZWNrbGlzdF90ZXh0X3BsdXJhbD1FbGVuY2hpIGRpIGNvbnRyb2xsbw0KLWNoZWNrSXRlbV90ZXh0X3BsdXJhbD1Wb2NpIGVsZW5jaGkgZGkgb3BlcmF6aW9uaQ0KLWNvbXBvc2l0ZVJvbGVfdGV4dF9wbHVyYWw9UnVvbGkgY29tcG9zaXRpDQotY29uY2VwdF90ZXh0X3BsdXJhbD1Db25jZXR0aQ0KLWNvbnRlbnRQYWNrYWdlX3RleHRfcGx1cmFsPVBhY2NoZXR0aSBkZWwgY29udGVudXRvDQotY3VzdG9tQ2F0ZWdvcnlfdGV4dF9wbHVyYWw9Q2F0ZWdvcmllIHBlcnNvbmFsaXp6YXRlDQotZGVsaXZlcmFibGVfdGV4dF9wbHVyYWw9Q29tcG9uZW50aSBkaXN0cmlidWliaWxpDQotZGVsaXZlcnlQcm9jZXNzX3RleHRfcGx1cmFsPVByb2Nlc3NpIGRpIHByb2R1emlvbmUNCi1kZXNjcmlwdG9yX3RleHRfcGx1cmFsPURlc2NyaXR0b3JpDQotZGlzY2lwbGluZV90ZXh0X3BsdXJhbD1EaXNjaXBsaW5lDQotZGlzY2lwbGluZUdyb3VwaW5nX3RleHRfcGx1cmFsPVJhZ2dydXBwYW1lbnRpIGRpc2NpcGxpbmUNCi1kb21haW5fdGV4dF9wbHVyYWw9RG9taW5pDQotZXN0aW1hdGVfdGV4dF9wbHVyYWw9VmFsdXRhemlvbmkNCi1lc3RpbWF0aW5nTWV0cmljX3RleHRfcGx1cmFsPU1ldHJpY2hlIGRpIHZhbHV0YXppb25lDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHRfcGx1cmFsPUNvbnNpZGVyYXppb25pIHN1bGxhIHZhbHV0YXppb25lDQotZXhhbXBsZV90ZXh0X3BsdXJhbD1Fc2VtcGkNCi1ndWlkYW5jZV90ZXh0X3BsdXJhbD1HdWlkZQ0KLWd1aWRlbGluZV90ZXh0X3BsdXJhbD1MaW5lZSBndWlkYQ0KLWl0ZXJhdGlvbl90ZXh0X3BsdXJhbD1JdGVyYXppb25pDQotbWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0X3BsdXJhbD1Db25maWd1cmF6aW9uaSBkaSBtZXRvZG8NCi1tZXRob2RDb250ZW50X3RleHRfcGx1cmFsPUNvbnRlbnV0aSBkaSBtZXRvZG8NCi1tZXRob2RMaWJyYXJ5X3RleHRfcGx1cmFsPUxpYnJlcmllIGRlaSBtZXRvZGkNCi1tZXRob2RQYWNrYWdlX3RleHRfcGx1cmFsPVBhY2NoZXR0aSBtZXRvZG8NCi1tZXRob2RQbHVnaW5fdGV4dF9wbHVyYWw9UGx1Zy1pbiBkZWwgbWV0b2RvDQotbWlsZXN0b25lX3RleHRfcGx1cmFsPU1pbGVzdG9uZQ0KLW91dGNvbWVfdGV4dF9wbHVyYWw9UmlzdWx0YXRpDQotcGhhc2VfdGV4dF9wbHVyYWw9RmFzaQ0KLXByYWN0aWNlX3RleHRfcGx1cmFsPVByYXRpY2hlDQotcHJvY2Vzc190ZXh0X3BsdXJhbD1Qcm9jZXNzaQ0KLXByb2Nlc3NDb250cmlidXRpb25fdGV4dF9wbHVyYWw9UHJvY2Vzc2kgZGlmZmVyZW56aWFsaQ0KLXByb2Nlc3NGYW1pbHlfdGV4dF9wbHVyYWw9RmFtaWdsaWUgcHJvY2Vzc2kNCi1wcm9jZXNzUGFja2FnZV90ZXh0X3BsdXJhbD1QYWNjaGV0dGkgcHJvY2Vzc28NCi1yZXBvcnRfdGV4dF9wbHVyYWw9UmVwb3J0DQotcmV1c2FibGVBc3NldF90ZXh0X3BsdXJhbD1SaXNvcnNlIHJpdXRpbGl6emFiaWxpDQotcm9hZG1hcF90ZXh0X3BsdXJhbD1Sb2FkbWFwDQotcm9sZURlc2NyaXB0b3JfdGV4dF9wbHVyYWw9RGVzY3JpdHRvcmkgZGkgcnVvbGkNCi1yb2xlX3RleHRfcGx1cmFsPVJ1b2xpDQotcm9sZVNldF90ZXh0X3BsdXJhbD1JbnNpZW1pIGRpIHJ1b2xpDQotcm9sZVNldEdyb3VwaW5nX3RleHRfcGx1cmFsPVJhZ2dydXBwYW1lbnRpIGluc2llbWkgZGkgcnVvbGkNCi1zdGFuZGFyZENhdGVnb3J5X3RleHRfcGx1cmFsPUNhdGVnb3JpZSBzdGFuZGFyZA0KLXN0ZXBfdGV4dF9wbHVyYWw9UGFzc2kNCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dF9wbHVyYWw9TWF0ZXJpYWxlIGRpIHN1cHBvcnRvDQotdGFza190ZXh0X3BsdXJhbD1PcGVyYXppb25pDQotdGFza0Rlc2NyaXB0b3JfdGV4dF9wbHVyYWw9RGVzY3JpdHRvcmkgZGkgb3BlcmF6aW9uaQ0KLXRlYW1Qcm9maWxlX3RleHRfcGx1cmFsPVByb2ZpbGkgdGVhbQ0KLXRlbXBsYXRlX3RleHRfcGx1cmFsPU1vZGVsbGkNCi10ZXJtRGVmaW5pdGlvbl90ZXh0X3BsdXJhbD1EZWZpbml6aW9uaSB0ZXJtaW5pDQotdG9vbF90ZXh0X3BsdXJhbD1Ub29sDQotdG9vbE1lbnRvcl90ZXh0X3BsdXJhbD1HdWlkYSBhbCB0b29sDQotd2hpdGVwYXBlcl90ZXh0X3BsdXJhbD1XaGl0ZXBhcGVyDQotd29ya1Byb2R1Y3RfdGV4dF9wbHVyYWw9UHJvZG90dGkgZGkgbGF2b3JvDQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHRfcGx1cmFsPURlc2NyaXR0b3JpIGRpIHByb2RvdHRpIGRpIGxhdm9ybw0KLXdvcmtQcm9kdWN0RWxlbWVudF90ZXh0X3BsdXJhbD1FbGVtZW50aSBwcm9kb3R0byBkaSBsYXZvcm8NCi13b3JrUHJvZHVjdFR5cGVfdGV4dF9wbHVyYWw9VGlwaSBkaSBwcm9kb3R0byBkaSBsYXZvcm8NCi0NCi0jIEFwcGxpY2F0aW9uIHRpdGxlLg0KLWFwcGxpY2F0aW9uX3RpdGxlPXswfSAtIHsxfQ0KLQ0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBEaWFsb2cNCi1vcGVuTGlicmFyeURpYWxvZ190aXRsZT1BcHJpIGxpYnJlcmlhIGRlaSBtZXRvZGkNCi1vcGVuTGlicmFyeURpYWxvZ0FyZWFfdGl0bGU9U2VsZXppb25hIGxpYnJlcmlhIGRlaSBtZXRvZGkNCi1vcGVuTGlicmFyeURpYWxvZ0FyZWFfdGV4dD17MH0gbWVtb3JpenphIG1ldG9kaSBlIHByb2Nlc3NpIGluIHVuYSBjYXJ0ZWxsYSBjaGlhbWF0YSBcbmxpYnJlcmlhIGRlaSBtZXRvZGkuIFNlbGV6aW9uYXJlIHVuYSBjYXJ0ZWxsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIHBlciBxdWVzdGEgc2Vzc2lvbmUuDQotbGlicmFyeUxhYmVsX3RleHQ9TGlicmVyaWE6DQotYnJvd3NlQnV0dG9uX3RleHQ9U2ZvZ2xpYS4uLg0KLXByb21wdEZvckxpYnJhcnlDaGVja2JveF90ZXh0PVV0aWxpenphIHF1ZXN0YSBjb21lIHByZWRlZmluaXRhIGUgbm9uIHZpc3VhbGl6emFyZSBwaVx1MDBmOSBxdWVzdG8gbWVzc2FnZ2lvLg0KLW9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dD1Ob24gZXNpc3RlIGFsY3VuYSBsaWJyZXJpYSBkaSBtZXRvZGkgaW4gJyd7MH0nJy5cblVuYSBudW92YSBsaWJyZXJpYSBkZWkgbWV0b2RpIHZlcnJcdTAwZTAgY3JlYXRhIGUgYXBlcnRhIG5lbGxhIGRpcmVjdG9yeSBzcGVjaWZpY2F0YS5cblxuRmFyZSBjbGljIHN1IE9LIHBlciBwcm9jZWRlcmUgb3BwdXJlIEFubnVsbGEgcGVyIHNwZWNpZmljYXJlIHVuIGFsdHJvIHBlcmNvcnNvIGRlbGxhIGxpYnJlcmlhIGRlaSBtZXRvZGkuDQotDQotIyBTZWxlY3QgTWV0aG9kIExpYnJhcnkgRm9sZGVyIERpYWxvZw0KLXNlbGVjdExpYnJhcnlGb2xkZXJEaWFsb2dfdGl0bGU9U2VsZXppb25hIGxpYnJlcmlhIGRlaSBtZXRvZGkNCi1zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RleHQ9U2VsZXppb25hcmUgdW5hIGNhcnRlbGxhIGxpYnJlcmlhIGRlaSBtZXRvZGkuDQotDQotIyBPcGVuIExpYnJhcnkgUHJvZ3Jlc3MgTWVzc2FnZQ0KLW9wZW5pbmdMaWJyYXJ5VGFza19uYW1lPUFwZXJ0dXJhIGRlbGxhIGxpYnJlcmlhIGRlaSBtZXRvZGkgaW4gY29yc28uLi4NCi0NCi0jIE9wZW4gTWV0aG9kIExpYnJhcnkgRXJyb3IgRGlhbG9nDQotaW52YWxpZExpYnJhcnlQYXRoX21zZz1JVVBMMDMwMEU6IEltcG9zc2liaWxlIGFwcmlyZSBsYSBsaWJyZXJpYSBkZWkgbWV0b2RpIHNwZWNpZmljYXRhLg0KLWludmFsaWRMaWJyYXJ5UGF0aF9yZWFzb249TGEgY2FydGVsbGEgZGVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBzZWxlemlvbmF0YSBub24gXHUwMGU4IHZhbGlkYSwgbm9uIGVzaXN0ZSBvcHB1cmUgbm9uIHNpIGRpc3BvbmUgZGVsbGUgYXV0b3JpenphemlvbmkgYXBwcm9wcmlhdGUgcGVyIGFjY2VkZXJ2aS5cblxuRmFyZSBjbGljIHN1IE9LIHBlciBzZWxlemlvbmFyZSB1bidhbHRyYSBjYXJ0ZWxsYSBkaSBsaWJyZXJpYSBkZWkgbWV0b2RpLg0KLQ0KLSMgTGlicmFyeSBMb2NrZWQgRXJyb3IgRGlhbG9nDQotbGlicmFyeUxvY2tlZF9tc2c9SVVQTDAzMDNFOiBJbXBvc3NpYmlsZSBhcHJpcmUgbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBzcGVjaWZpY2F0YS5cblxuTGEgbGlicmVyaWEgZGVpIG1ldG9kaSBzZWxlemlvbmF0YSBcdTAwZTggaW4gdXNvLiBGYXJlIGNsaWMgc3UgQW5udWxsYSBwZXIgc2VsZXppb25hcmUgdW4nYWx0cmEgY2FydGVsbGEgbGlicmVyaWEgbyBmYXJlIGNsaWMgc3UgRm9yemEgYXBlcnR1cmEgcGVyIGFwcmlyZSBjb211bnF1ZSBsYSBsaWJyZXJpYS5cblxuQVZWSVNPOiBsJ3VzbyBzaW11bHRhbmVvIGRpIHVuYSBsaWJyZXJpYSBkZWkgbWV0b2RpIHBvdHJlYmJlIGRhbm5lZ2dpYXJlIHF1ZWxsYSBsaWJyZXJpYS4NCi1saWJyYXJ5TG9ja2VkX29wZW5CdXR0b25fdGV4dD1Gb3J6YSBhcGVydHVyYQ0KLQ0KLSMgUmVhZC1vbmx5IFByb2plY3QgRmlsZSBFcnJvciBEaWFsb2cNCi1yZWFkT25seVByb2plY3RGaWxlX3RleHQ9SVVQTDAzMDJFOiAnJ3swfScnIFx1MDBlOCBkaSBzb2xhIGxldHR1cmEuIFBlciBjb250aW51YXJlLCBcdTAwZTggbmVjZXNzYXJpbyByZW5kZXJsbyBzY3JpdmliaWxlLg0KLXJldHJ5QnV0dG9uX3RleHQ9Umlwcm92YQ0KLWNhbmNlbEJ1dHRvbl90ZXh0PUFubnVsbGENCi0NCi0jIFZlcnNpb24gTWlzbWF0Y2ggRGlhbG9nDQotdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHQ9SVVQTDMwNUU6IGltcG9zc2liaWxlIGFwcmlyZSBsYSBsaWJyZXJpYSBzZWxlemlvbmF0YS4gXHUwMGM4IG5lY2Vzc2FyaW8gYWdnaW9ybmFyZSB7MH0gYSB1bmEgdmVyc2lvbmUgezF9IG8gc3VwZXJpb3JlIHBlciBhcHJpcmUgcXVlc3RhIGxpYnJlcmlhLg0KLXZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0X3Vua25vd249SVVQTDMwNkU6IGltcG9zc2liaWxlIGFwcmlyZSBsYSBsaWJyZXJpYSBzZWxlemlvbmF0YS4gXHUwMGM4IG5lY2Vzc2FyaW8gYWdnaW9ybmFyZSB7MH0gYSB1bmEgdmVyc2lvbmUgc3VwZXJpb3JlIHBlciBwb3RlciBhcHJpcmUgcXVlc3RhIGxpYnJlcmlhLg0KLQ0KLSMgVXBncmFkZSBNZXRob2QgTGlicmFyeSBEaWFsb2cNCi11cGdyYWRlTGlicmFyeURpYWxvZ190aXRsZT1BZ2dpb3JuYSBsaWJyZXJpYSBkZWkgbWV0b2RpDQotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGV4dD1MYSBsaWJyZXJpYSBzZWxlemlvbmF0YSBkZXZlIGVzc2VyZSBhZ2dpb3JuYXRhIGFsbGEgbnVvdmEgc3RydXR0dXJhIGRpIGxpYnJlcmlhLlxuXG5Db250aW51YXJlIGwnYWdnaW9ybmFtZW50bz8NCi11cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lPUFnZ2lvcm5hbWVudG8gZGVsbGEgbGlicmVyaWEgZGVpIG1ldG9kaSBpbiBjb3Jzby4uLg0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEwwMzAxRTogSW1wb3NzaWJpbGUgYWdnaW9ybmFyZSBsYSBsaWJyZXJpYSBkZWkgbWV0b2RpLiBDb250cm9sbGFyZSBpbCBmaWxlIGRpIGxvZyBwZXIgdWx0ZXJpb3JpIGRldHRhZ2xpLg0KLQ0KLSMgU3dpdGNoIENvbmZpZ3VyYXRpb24gRGlhbG9nDQotc3dpdGNoQ29uZmlnRGlhbG9nX3RpdGxlPUNhbWJpYSBjb25maWd1cmF6aW9uZQ0KLXN3aXRjaENvbmZpZ0RpYWxvZ190ZXh0PVBhc3NhcmUgZGFsbGEgY29uZmlndXJhemlvbmUgY29ycmVudGUgYSBxdWVsbGEgcHJlZGVmaW5pdGEsICcnezB9JycsIGFzc29jaWF0YSBhbCBwcm9jZXNzbyBzZWxlemlvbmF0bz8NCi0JDQotIyBDb25maWd1cmF0aW9uIENvbWJvDQotY3VycmVudENvbmZpZ0xhYmVsX3RleHQ9Q29uZmlndXJhemlvbmUgY29ycmVudGU6DQotc2VsZWN0Q29uZmlnTGFiZWxfdGV4dD1TZWxlemlvbmEgY29uZmlndXJhemlvbmUNCi0NCi0jIERlbGV0ZSBGaWxlcyBDb25maXJtYXRpb24gTWVzc2FnZQ0KLWRlbGV0ZUZpbGVzQ29uZmlybWF0aW9uX21zZz1JbCBwZXJjb3JzbyBzcGVjaWZpY2F0byAnJ3swfScnIGVzaXN0ZSBnaVx1MDBlMC4gVHV0dGkgaSBmaWxlIG5lbGxhIGNhcnRlbGxhIHZlcnJhbm5vIGVsaW1pbmF0aS4gUHJvY2VkZXJlPw0KLQ0KLSMgUGF0aHMvRmlsZXMgRXJyb3IgTWVzc2FnZXMNCi1kZWxldGVGaWxlc0Vycm9yX3JlYXNvbj1JbCBwZXJjb3JzbyAnJ3swfScnIGNvbnRpZW5lIHVubyBvIHBpXHUwMGY5IGZpbGUgY2hlIG5vbiBwb3Nzb25vIGVzc2VyZSBlbGltaW5hdGkuXG5cblNlbGV6aW9uYXJlIHVuIGFsdHJvIHBlcmNvcnNvIGUgcHJvdmFyZSBkaSBudW92by4NCi1jcmVhdGVQYXRoRXJyb3JfcmVhc29uPUltcG9zc2liaWxlIGNyZWFyZSBpbCBwZXJjb3JzbyAnJ3swfScnLlxuXG5TZWxlemlvbmFyZSB1biBhbHRybyBwZXJjb3JzbyBlIHByb3ZhcmUgZGkgbnVvdm8uDQotaW52YWxpZFBhdGhfbXNnPUlsIHBlcmNvcnNvIHNwZWNpZmljYXRvIG5vbiBcdTAwZTggdmFsaWRvLg0KLQ0KLSMgQmFja3VwIExpYnJhcnkgRGlhbG9nDQotYmFja3VwTGlicmFyeURpYWxvZ190aXRsZT1Fc2VndWkgYmFja3VwIGxpYnJlcmlhDQotYmFja3VwTGlicmFyeURpYWxvZ190ZXh0PVNpIGNvbnNpZ2xpYSBkaSBlc2VndWlyZSBpbCBiYWNrdXAgZGVsbGEgbGlicmVyaWEgY29ycmVudGUgcHJpbWEgZGkgcHJvY2VkZXJlIGNvbiBsJ2FnZ2lvcm5hbWVudG8uXG5cbkZhcmUgY2xpYyBzdSBPSyBwZXIgY3JlYXJlIHVuYSBjb3BpYSBkaSBiYWNrdXAgZGVsbGEgbGlicmVyaWEgbmVsbGEgZGlyZWN0b3J5IHNwZWNpZmljYXRhLiBGYXJlIGNsaWMgc3UgSWdub3JhIHBlciBjb250aW51YXJlIHNlbnphIGNyZWFyZSBpbCBiYWNrdXAuDQotYmFja2luZ1VwTGlicmFyeVRhc2tfbmFtZT1Fc2VjdXppb25lIGRpIHVuYSBjb3BpYSBkaSBiYWNrdXAgZGVpIGZpbGUgZGVsbGEgbGlicmVyaWEgaW4gY29yc28uLi4NCi0NCi0jIFBhdGggU2VsZWN0aW9uIERpYWxvZw0KLXBhdGhTZWxlY3Rpb25FcnJvcl9tc2c9SW1wb3NzaWJpbGUgY3JlYXJlIGRpcg0KLW9rQnV0dG9uX3RleHQ9T0sNCi1za2lwQnV0dG9uX3RleHQ9SWdub3JhDQotDQotIyBQcm9jZXNzIEVkaXRvciBwcmVmZXJlbmNlcw0KLWFsd2F5c0J1dHRvbl90ZXh0PVNlbXByZQ0KLW5ldmVyQnV0dG9uX3RleHQ9TWFpDQotcHJvbXB0QnV0dG9uX3RleHQ9UmljaGllZGkNCi0NCi0jIEFkZCBMaW5rIERpYWxvZw0KLWxpbmtUb1VSTF9uYW1lPVVSTA0KLWxpbmtUb0ZpbGVfbmFtZT1JbCBmaWxlDQotZWxlbWVudExpbmtfbmFtZT1FbGVtZW50byBkZWwgbWV0b2RvDQotZWxlbWVudExpbmtXaXRoVHlwZV9uYW1lPUVsZW1lbnRvIGRlbCBtZXRvZG8gY29uIHByZWZpc3NvIHRpcG8NCi1lbGVtZW50TGlua1dpdGhVc2VyVGV4dF9uYW1lPUVsZW1lbnRvIGRlbCBtZXRvZG8gY29uIHRlc3RvIHBlcnNvbmFsaXp6YXRvDQotDQotIyBDb252ZXJ0IEFjdGl2aXR5IFR5cGUgRGlhbG9nDQotY29udmVydEFjdGl2aXR5RGlhbG9nX3RpdGxlPUNvbnZlcnRpIHRpcG8gZGkgYXR0aXZpdFx1MDBlMA0KLWNvbnZlcnRBY3Rpdml0eURpYWxvZ190ZXh0PVNlbGV6aW9uYXJlIGlsIHRpcG8gZGkgYXR0aXZpdFx1MDBlMCBkaSBkZXN0aW5hemlvbmUuDQotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfbXNnPUlVUEwwMzA0RTogUXVlc3RhIGF0dGl2aXRcdTAwZTAgbm9uIHB1XHUwMGYyIGVzc2VyZSBjb252ZXJ0aXRhIGluIHVuIGFsdHJvIHRpcG8uDQotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfcmVhc29uPU5vbiBjJydcdTAwZTggdW4gdGlwbyBkaSBhdHRpdml0XHUwMGUwIGNvbXBhdGliaWxlIHBlciB7MH0uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YjIyYmUyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXNfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChTaW5ndWxhcikNCi1hY3Rpdml0eV90ZXh0PVx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmYw0KLWFydGlmYWN0X3RleHQ9XHU2MjEwXHU2NzljXHU3MjY5DQotY2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1cdTMwYjFcdTMwZmNcdTMwZDFcdTMwZDNcdTMwZWFcdTMwYzZcdTMwYTNcdTMwZmNcdTMwZmJcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjMNCi1jaGVja2xpc3RfdGV4dD1cdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTMwZWFcdTMwYjlcdTMwYzgNCi1jaGVja0l0ZW1fdGV4dD1cdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTk4MDVcdTc2ZWUNCi1jb21wb3NpdGVSb2xlX3RleHQ9XHUzMGIzXHUzMGYzXHUzMGRkXHUzMGI4XHUzMGMzXHUzMGM4XHUzMGZiXHUzMGVkXHUzMGZjXHUzMGViDQotY29uY2VwdF90ZXh0PVx1Njk4Mlx1NWZmNQ0KLWNvbnRlbnRQYWNrYWdlX3RleHQ9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMGZiXHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4DQotY3VzdG9tQ2F0ZWdvcnlfdGV4dD1cdTMwYWJcdTMwYjlcdTMwYmZcdTMwZTBcdTMwZmJcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmMNCi1kZWxpdmVyYWJsZV90ZXh0PVx1N2QwZFx1NTE2NVx1NzI2OQ0KLWRlbGl2ZXJ5UHJvY2Vzc190ZXh0PVx1MzBjN1x1MzBlYVx1MzBkMFx1MzBlYVx1MzBmY1x1MzBmYlx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOQ0KLWRlc2NyaXB0b3JfdGV4dD1cdThhMThcdThmZjBcdTViNTANCi1kaXNjaXBsaW5lX3RleHQ9XHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlDQotZGlzY2lwbGluZUdyb3VwaW5nX3RleHQ9XHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3DQotZG9tYWluX3RleHQ9XHUzMGM5XHUzMGUxXHUzMGE0XHUzMGYzDQotZXN0aW1hdGVfdGV4dD1cdTg5OGJcdTdhNGRcdTMwODJcdTMwOGENCi1lc3RpbWF0aW5nTWV0cmljX3RleHQ9XHU4OThiXHU3YTRkXHUzMDgyXHUzMDhhXHUzMGUxXHUzMGM4XHUzMGVhXHUzMGMzXHUzMGFmDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ9XHU4OThiXHU3YTRkXHUzMDgyXHUzMDhhXHU4MDAzXHU2MTZlXHU0ZThiXHU5ODA1DQotZXhhbXBsZV90ZXh0PVx1NGY4Yg0KLWd1aWRhbmNlX3RleHQ9XHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5DQotZ3VpZGVsaW5lX3RleHQ9XHUzMGFjXHUzMGE0XHUzMGM5XHUzMGU5XHUzMGE0XHUzMGYzDQotaXRlcmF0aW9uX3RleHQ9XHU1M2NkXHU1ZmE5DQotbWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMA0KLW1ldGhvZENvbnRlbnRfdGV4dD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQNCi1tZXRob2RMaWJyYXJ5X3RleHQ9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjDQotbWV0aG9kUGFja2FnZV90ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOA0KLW1ldGhvZFBsdWdpbl90ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmMw0KLW1pbGVzdG9uZV90ZXh0PVx1MzBkZVx1MzBhNFx1MzBlYlx1MzBiOVx1MzBjOFx1MzBmY1x1MzBmMw0KLW91dGNvbWVfdGV4dD1cdTdkNTBcdTY3OWMNCi1waGFzZV90ZXh0PVx1MzBkNVx1MzBhN1x1MzBmY1x1MzBiYQ0KLXByYWN0aWNlX3RleHQ9XHUzMGQ3XHUzMGU5XHUzMGFmXHUzMGM2XHUzMGEzXHUzMGI5DQotcHJvY2Vzc190ZXh0PVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOQ0KLXByb2Nlc3NDb250cmlidXRpb25fdGV4dD1cdTVmYWVcdTUyMDZcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi1wcm9jZXNzRmFtaWx5X3RleHQ9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGRmXHUzMGVhXHUzMGZjDQotcHJvY2Vzc1BhY2thZ2VfdGV4dD1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwZmJcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjgNCi1yZXBvcnRfdGV4dD1cdTMwZWNcdTMwZGRcdTMwZmNcdTMwYzgNCi1yZXVzYWJsZUFzc2V0X3RleHQ9XHU1MThkXHU1MjI5XHU3NTI4XHU1M2VmXHU4MGZkXHUzMDZhXHUzMGEyXHUzMGJiXHUzMGMzXHUzMGM4DQotcm9hZG1hcF90ZXh0PVx1MzBlZFx1MzBmY1x1MzBjOVx1MzBkZVx1MzBjM1x1MzBkNw0KLXJvbGVEZXNjcmlwdG9yX3RleHQ9XHUzMGVkXHUzMGZjXHUzMGViXHU4YTE4XHU4ZmYwXHU1YjUwDQotcm9sZV90ZXh0PVx1MzBlZFx1MzBmY1x1MzBlYg0KLXJvbGVTZXRfdGV4dD1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzgNCi1yb2xlU2V0R3JvdXBpbmdfdGV4dD1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzhcdTMwZmJcdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDcNCi1zdGFuZGFyZENhdGVnb3J5X3RleHQ9XHU2YTE5XHU2ZTk2XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjDQotc3RlcF90ZXh0PVx1MzBiOVx1MzBjNlx1MzBjM1x1MzBkNw0KLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0PVx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1OGNjN1x1NjU5OQ0KLXRhc2tfdGV4dD1cdTMwYmZcdTMwYjlcdTMwYWYNCi10YXNrRGVzY3JpcHRvcl90ZXh0PVx1MzBiZlx1MzBiOVx1MzBhZlx1OGExOFx1OGZmMFx1NWI1MA0KLXRlYW1Qcm9maWxlX3RleHQ9XHUzMGMxXHUzMGZjXHUzMGUwXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViDQotdGVtcGxhdGVfdGV4dD1cdTMwYzZcdTMwZjNcdTMwZDdcdTMwZWNcdTMwZmNcdTMwYzgNCi10ZXJtRGVmaW5pdGlvbl90ZXh0PVx1NzUyOFx1OGE5ZVx1NWI5YVx1N2ZhOQ0KLXRvb2xfdGV4dD1cdTMwYzRcdTMwZmNcdTMwZWINCi10b29sTWVudG9yX3RleHQ9XHUzMGM0XHUzMGZjXHUzMGViXHUzMGZiXHUzMGUxXHUzMGYzXHUzMGJmXHUzMGZjDQotd2hpdGVwYXBlcl90ZXh0PVx1MzBkYlx1MzBlZlx1MzBhNFx1MzBjOFx1MzBmYlx1MzBkYVx1MzBmY1x1MzBkMVx1MzBmYw0KLXdvcmtQcm9kdWN0X3RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4DQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU4YTE4XHU4ZmYwXHU1YjUwDQotd29ya1Byb2R1Y3RFbGVtZW50X3RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU4OTgxXHU3ZDIwDQotd29ya1Byb2R1Y3RUeXBlX3RleHQ9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU5ODVlDQotDQotIyBNZXRob2QgRWxlbWVudCBOYW1lcyAoUGx1cmFsKQ0KLWFjdGl2aXR5X3RleHRfcGx1cmFsPVx1NGY1Y1x1Njk2ZA0KLWFydGlmYWN0X3RleHRfcGx1cmFsPVx1NjIxMFx1Njc5Y1x1NzI2OQ0KLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHRfcGx1cmFsPVx1MzBiMVx1MzBmY1x1MzBkMVx1MzBkM1x1MzBlYVx1MzBjNlx1MzBhM1x1MzBmY1x1MzBmYlx1MzBkMVx1MzBiZlx1MzBmY1x1MzBmMw0KLWNoZWNrbGlzdF90ZXh0X3BsdXJhbD1cdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTMwZWFcdTMwYjlcdTMwYzgNCi1jaGVja0l0ZW1fdGV4dF9wbHVyYWw9XHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHU5ODA1XHU3NmVlDQotY29tcG9zaXRlUm9sZV90ZXh0X3BsdXJhbD1cdTMwYjNcdTMwZjNcdTMwZGRcdTMwYjhcdTMwYzNcdTMwYzhcdTMwZmJcdTMwZWRcdTMwZmNcdTMwZWINCi1jb25jZXB0X3RleHRfcGx1cmFsPVx1Njk4Mlx1NWZmNQ0KLWNvbnRlbnRQYWNrYWdlX3RleHRfcGx1cmFsPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzBmYlx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOA0KLWN1c3RvbUNhdGVnb3J5X3RleHRfcGx1cmFsPVx1MzBhYlx1MzBiOVx1MzBiZlx1MzBlMFx1MzBmYlx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmYw0KLWRlbGl2ZXJhYmxlX3RleHRfcGx1cmFsPVx1N2QwZFx1NTE2NVx1NzI2OQ0KLWRlbGl2ZXJ5UHJvY2Vzc190ZXh0X3BsdXJhbD1cdTMwYzdcdTMwZWFcdTMwZDBcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi1kZXNjcmlwdG9yX3RleHRfcGx1cmFsPVx1OGExOFx1OGZmMFx1NWI1MA0KLWRpc2NpcGxpbmVfdGV4dF9wbHVyYWw9XHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlDQotZGlzY2lwbGluZUdyb3VwaW5nX3RleHRfcGx1cmFsPVx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZVx1MzA2ZVx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1NTMxNg0KLWRvbWFpbl90ZXh0X3BsdXJhbD1cdTMwYzlcdTMwZTFcdTMwYTRcdTMwZjMNCi1lc3RpbWF0ZV90ZXh0X3BsdXJhbD1cdTg5OGJcdTdhNGRcdTMwODJcdTMwOGENCi1lc3RpbWF0aW5nTWV0cmljX3RleHRfcGx1cmFsPVx1ODk4Ylx1N2E0ZFx1MzA4Mlx1MzA4YVx1MzBlMVx1MzBjOFx1MzBlYVx1MzBjM1x1MzBhZg0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0X3BsdXJhbD1cdTg5OGJcdTdhNGRcdTMwODJcdTMwOGFcdTgwMDNcdTYxNmVcdTRlOGJcdTk4MDUNCi1leGFtcGxlX3RleHRfcGx1cmFsPVx1NGY4Yg0KLWd1aWRhbmNlX3RleHRfcGx1cmFsPVx1MzBhY1x1MzBhNFx1MzBjMFx1MzBmM1x1MzBiOQ0KLWd1aWRlbGluZV90ZXh0X3BsdXJhbD1cdTMwYWNcdTMwYTRcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZjMNCi1pdGVyYXRpb25fdGV4dF9wbHVyYWw9XHU1M2NkXHU1ZmE5DQotbWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0X3BsdXJhbD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5Y2JcdTYyMTANCi1tZXRob2RDb250ZW50X3RleHRfcGx1cmFsPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNA0KLW1ldGhvZExpYnJhcnlfdGV4dF9wbHVyYWw9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjDQotbWV0aG9kUGFja2FnZV90ZXh0X3BsdXJhbD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjgNCi1tZXRob2RQbHVnaW5fdGV4dF9wbHVyYWw9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzDQotbWlsZXN0b25lX3RleHRfcGx1cmFsPVx1MzBkZVx1MzBhNFx1MzBlYlx1MzBiOVx1MzBjOFx1MzBmY1x1MzBmMw0KLW91dGNvbWVfdGV4dF9wbHVyYWw9XHU3ZDUwXHU2NzljDQotcGhhc2VfdGV4dF9wbHVyYWw9XHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGJhDQotcHJhY3RpY2VfdGV4dF9wbHVyYWw9XHUzMGQ3XHUzMGU5XHUzMGFmXHUzMGM2XHUzMGEzXHUzMGI5DQotcHJvY2Vzc190ZXh0X3BsdXJhbD1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi1wcm9jZXNzQ29udHJpYnV0aW9uX3RleHRfcGx1cmFsPVx1NWZhZVx1NTIwNlx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOQ0KLXByb2Nlc3NGYW1pbHlfdGV4dF9wbHVyYWw9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGRmXHUzMGVhXHUzMGZjDQotcHJvY2Vzc1BhY2thZ2VfdGV4dF9wbHVyYWw9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMGZiXHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4DQotcmVwb3J0X3RleHRfcGx1cmFsPVx1MzBlY1x1MzBkZFx1MzBmY1x1MzBjOA0KLXJldXNhYmxlQXNzZXRfdGV4dF9wbHVyYWw9XHU1MThkXHU1MjI5XHU3NTI4XHU1M2VmXHU4MGZkXHUzMDZhXHUzMGEyXHUzMGJiXHUzMGMzXHUzMGM4DQotcm9hZG1hcF90ZXh0X3BsdXJhbD1cdTMwZWRcdTMwZmNcdTMwYzlcdTMwZGVcdTMwYzNcdTMwZDcNCi1yb2xlRGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1cdTMwZWRcdTMwZmNcdTMwZWJcdThhMThcdThmZjBcdTViNTANCi1yb2xlX3RleHRfcGx1cmFsPVx1MzBlZFx1MzBmY1x1MzBlYg0KLXJvbGVTZXRfdGV4dF9wbHVyYWw9XHUzMGVkXHUzMGZjXHUzMGViXHUzMGZiXHUzMGJiXHUzMGMzXHUzMGM4DQotcm9sZVNldEdyb3VwaW5nX3RleHRfcGx1cmFsPVx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjOFx1MzA2ZVx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1NTMxNg0KLXN0YW5kYXJkQ2F0ZWdvcnlfdGV4dF9wbHVyYWw9XHU2YTE5XHU2ZTk2XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjDQotc3RlcF90ZXh0X3BsdXJhbD1cdTMwYjlcdTMwYzZcdTMwYzNcdTMwZDcNCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dF9wbHVyYWw9XHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHU4Y2M3XHU2NTk5DQotdGFza190ZXh0X3BsdXJhbD1cdTMwYmZcdTMwYjlcdTMwYWYNCi10YXNrRGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1cdTMwYmZcdTMwYjlcdTMwYWZcdThhMThcdThmZjBcdTViNTANCi10ZWFtUHJvZmlsZV90ZXh0X3BsdXJhbD1cdTMwYzFcdTMwZmNcdTMwZTBcdTMwZmJcdTMwZDdcdTMwZWRcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWINCi10ZW1wbGF0ZV90ZXh0X3BsdXJhbD1cdTMwYzZcdTMwZjNcdTMwZDdcdTMwZWNcdTMwZmNcdTMwYzgNCi10ZXJtRGVmaW5pdGlvbl90ZXh0X3BsdXJhbD1cdTc1MjhcdThhOWVcdTViOWFcdTdmYTkNCi10b29sX3RleHRfcGx1cmFsPVx1MzBjNFx1MzBmY1x1MzBlYg0KLXRvb2xNZW50b3JfdGV4dF9wbHVyYWw9XHUzMGM0XHUzMGZjXHUzMGViXHUzMGZiXHUzMGUxXHUzMGYzXHUzMGJmXHUzMGZjDQotd2hpdGVwYXBlcl90ZXh0X3BsdXJhbD1cdTMwZGJcdTMwZWZcdTMwYTRcdTMwYzhcdTMwZmJcdTMwZGFcdTMwZmNcdTMwZDFcdTMwZmMNCi13b3JrUHJvZHVjdF90ZXh0X3BsdXJhbD1cdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzgNCi13b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dF9wbHVyYWw9XHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU4YTE4XHU4ZmYwXHU1YjUwDQotd29ya1Byb2R1Y3RFbGVtZW50X3RleHRfcGx1cmFsPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1ODk4MVx1N2QyMA0KLXdvcmtQcm9kdWN0VHlwZV90ZXh0X3BsdXJhbD1cdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTk4NWUNCi0NCi0jIEFwcGxpY2F0aW9uIHRpdGxlLg0KLWFwcGxpY2F0aW9uX3RpdGxlPXswfSAtIHsxfQ0KLQ0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBEaWFsb2cNCi1vcGVuTGlicmFyeURpYWxvZ190aXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNGYNCi1vcGVuTGlicmFyeURpYWxvZ0FyZWFfdGl0bGU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZlXHU5MDc4XHU2MjllDQotb3BlbkxpYnJhcnlEaWFsb2dBcmVhX3RleHQ9ezB9IFx1MzA2Zlx1MzAwMVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2OFx1NTQ3Y1x1MzA3MFx1MzA4Y1x1MzA4Ylx1MzBkNVx1MzBhOVx1MzBlYlx1MzBjMFx1MzBmY1x1MzA2YlxuXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMDY4XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDkyXHU0ZmRkXHU3YmExXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyXHUzMDUzXHUzMDZlXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZiXHU0ZjdmXHU3NTI4XHUzMDU5XHUzMDhiXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQ1XHUzMGE5XHUzMGViXHUzMGMwXHUzMGZjXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotbGlicmFyeUxhYmVsX3RleHQ9XHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjOg0KLWJyb3dzZUJ1dHRvbl90ZXh0PVx1NTNjMlx1NzE2Ny4uLg0KLXByb21wdEZvckxpYnJhcnlDaGVja2JveF90ZXh0PVx1MzA1M1x1MzA2ZVx1OTA3OFx1NjI5ZVx1MzA5Mlx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzA2OFx1MzA1N1x1MzA2Nlx1NGY3Zlx1NzUyOFx1MzA1N1x1MzAwMVx1NGVjYVx1NWY4Y1x1MzA1M1x1MzA2ZVx1OGNlYVx1NTU0Zlx1MzA5Mlx1ODg2OFx1NzkzYVx1MzA1N1x1MzA2YVx1MzA0NFx1MzAwMg0KLW9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dD0nJ3swfScnIFx1MzA2Ylx1MzA2Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA0Y1x1NWI1OFx1NTcyOFx1MzA1N1x1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXHU2NWIwXHUzMDU3XHUzMDQ0XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZmXHUzMDAxXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDVmXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHUzMDY3XHU0ZjVjXHU2MjEwXHUzMDU1XHUzMDhjXHUzMDY2XHU5NThiXHUzMDRiXHUzMDhjXHUzMDdlXHUzMDU5XHUzMDAyXG5cblx1MzAwY09LXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHU1MTQ4XHUzMDc4XHU5MDMyXHUzMDgwXHUzMDRiXHUzMDAxXHUzMDBjXHUzMGFkXHUzMGUzXHUzMGYzXHUzMGJiXHUzMGViXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHU0ZWQ2XHUzMDZlXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQxXHUzMGI5XHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotDQotIyBTZWxlY3QgTWV0aG9kIExpYnJhcnkgRm9sZGVyIERpYWxvZw0KLXNlbGVjdExpYnJhcnlGb2xkZXJEaWFsb2dfdGl0bGU9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZlXHU5MDc4XHU2MjllDQotc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzBmYlx1MzBkNVx1MzBhOVx1MzBlYlx1MzBjMFx1MzBmY1x1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLSMgT3BlbiBMaWJyYXJ5IFByb2dyZXNzIE1lc3NhZ2UNCi1vcGVuaW5nTGlicmFyeVRhc2tfbmFtZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNDRcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi0NCi0jIE9wZW4gTWV0aG9kIExpYnJhcnkgRXJyb3IgRGlhbG9nDQotaW52YWxpZExpYnJhcnlQYXRoX21zZz1JVVBMMDMwMEU6IFx1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLWludmFsaWRMaWJyYXJ5UGF0aF9yZWFzb249XHU5MDc4XHU2MjllXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQ1XHUzMGE5XHUzMGViXHUzMGMwXHUzMGZjXHUzMDRjXHU3MTIxXHU1MmI5XHUzMDdlXHUzMDVmXHUzMDZmXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDZhXHUzMDQ0XHUzMDRiXHUzMDAxXHUzMDUzXHUzMDZlXHUzMGQ1XHUzMGE5XHUzMGViXHUzMGMwXHUzMGZjXHUzMDZiXHUzMGEyXHUzMGFmXHUzMGJiXHUzMGI5XHUzMDU5XHUzMDhiXHU5MDY5XHU1MjA3XHUzMDZhXHU4YTMxXHU1M2VmXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXG5cblx1MzAwY09LXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDAxXHU1MjI1XHUzMDZlXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQ1XHUzMGE5XHUzMGViXHUzMGMwXHUzMGZjXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotDQotIyBMaWJyYXJ5IExvY2tlZCBFcnJvciBEaWFsb2cNCi1saWJyYXJ5TG9ja2VkX21zZz1JVVBMMDMwM0U6IFx1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXG5cdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNWZcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmZcdTRmN2ZcdTc1MjhcdTRlMmRcdTMwNmVcdTMwODhcdTMwNDZcdTMwNjdcdTMwNTlcdTMwMDIgXHUzMDBjXHUzMGFkXHUzMGUzXHUzMGYzXHUzMGJiXHUzMGViXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHU1MjI1XHUzMDZlXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQ1XHUzMGE5XHUzMGViXHUzMGMwXHUzMGZjXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU5XHUzMDhiXHUzMDRiXHUzMDAxXHUzMDVkXHUzMDZlXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDkyXHU5NThiXHUzMDRmXHU1ODM0XHU1NDA4XHUzMDZiXHUzMDZmXHUzMDBjXHU1ZjM3XHU1MjM2XHUzMGFhXHUzMGZjXHUzMGQ3XHUzMGYzXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyXG5cblx1OGI2Nlx1NTQ0YTogXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGFiXHUzMGVjXHUzMGYzXHUzMGM4XHU0ZjdmXHU3NTI4XHUzMDZmXHUzMDAxXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHU3ODM0XHU2NDBkXHUzMDZlXHU1MzlmXHU1NmUwXHUzMDZiXHUzMDZhXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyDQotbGlicmFyeUxvY2tlZF9vcGVuQnV0dG9uX3RleHQ9XHU1ZjM3XHU1MjM2XHUzMGFhXHUzMGZjXHUzMGQ3XHUzMGYzDQotDQotIyBSZWFkLW9ubHkgUHJvamVjdCBGaWxlIEVycm9yIERpYWxvZw0KLXJlYWRPbmx5UHJvamVjdEZpbGVfdGV4dD1JVVBMMDMwMkU6ICcnezB9JycgXHUzMDZmXHU4YWFkXHUzMDdmXHU1M2Q2XHUzMDhhXHU1YzAyXHU3NTI4XHUzMDY3XHUzMDU5XHUzMDAyIFx1N2Q5YVx1ODg0Y1x1MzA1OVx1MzA4Ylx1NTI0ZFx1MzA2Ylx1NjZmOFx1MzA0ZFx1OGZiY1x1MzA3Zlx1NTNlZlx1ODBmZFx1MzA2Ylx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXJldHJ5QnV0dG9uX3RleHQ9XHU1MThkXHU4YTY2XHU4ODRjDQotY2FuY2VsQnV0dG9uX3RleHQ9XHUzMGFkXHUzMGUzXHUzMGYzXHUzMGJiXHUzMGViDQotDQotIyBWZXJzaW9uIE1pc21hdGNoIERpYWxvZw0KLXZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0PUlVUEwzMDVFOiBcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNGZcdTMwNTNcdTMwNjhcdTMwNGNcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcdTMwNTNcdTMwNmVcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNGZcdTMwNmJcdTMwNmZcdTMwMDF7MH0gXHUzMDkyXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzIHsxfSBcdTRlZTVcdTk2NGRcdTMwNmJcdTMwYTJcdTMwYzNcdTMwZDdcdTMwYjBcdTMwZWNcdTMwZmNcdTMwYzlcdTMwNTlcdTMwOGJcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDINCi12ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dF91bmtub3duPUlVUEwzMDZFOiBcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNGZcdTMwNTNcdTMwNjhcdTMwNGNcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcdTMwNTNcdTMwNmVcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTk1OGJcdTMwNGZcdTMwNmJcdTMwNmZcdTMwMDF7MH0gXHUzMDkyXHUzMDg4XHUzMDhhXHU5YWQ4XHUzMDQ0XHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHUzMDZiXHUzMGEyXHUzMGMzXHUzMGQ3XHUzMGIwXHUzMGVjXHUzMGZjXHUzMGM5XHUzMDU5XHUzMDhiXHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyDQotDQotIyBVcGdyYWRlIE1ldGhvZCBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBhMlx1MzBjM1x1MzBkN1x1MzBiMFx1MzBlY1x1MzBmY1x1MzBjOQ0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RleHQ9XHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZmXHUzMDAxXHU2NWIwXHU4OThmXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHU2OWNiXHU5MDIwXHUzMDZiXHUzMGEyXHUzMGMzXHUzMGQ3XHUzMGIwXHUzMGVjXHUzMGZjXHUzMGM5XHUzMDU5XHUzMDhiXHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyXG5cblx1MzBhMlx1MzBjM1x1MzBkN1x1MzBiMFx1MzBlY1x1MzBmY1x1MzBjOVx1MzA5Mlx1N2Q5YVx1ODg0Y1x1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8NCi11cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1MzBhMlx1MzBjM1x1MzBkN1x1MzBiMFx1MzBlY1x1MzBmY1x1MzBjOVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEwwMzAxRTogXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDZlXHUzMGEyXHUzMGMzXHUzMGQ3XHUzMGIwXHUzMGVjXHUzMGZjXHUzMGM5XHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyIFx1OGE3M1x1MzA1N1x1MzA0Zlx1MzA2Zlx1MzAwMVx1MzBlZFx1MzBiMFx1MzBmYlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NTNjMlx1NzE2N1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLQ0KLSMgU3dpdGNoIENvbmZpZ3VyYXRpb24gRGlhbG9nDQotc3dpdGNoQ29uZmlnRGlhbG9nX3RpdGxlPVx1NjljYlx1NjIxMFx1MzA2ZVx1NTIwN1x1MzA4YVx1NjZmZlx1MzA0OA0KLXN3aXRjaENvbmZpZ0RpYWxvZ190ZXh0PVx1NzNmZVx1ODg0Y1x1MzA2ZVx1NjljYlx1NjIxMFx1MzA5Mlx1MzAwMVx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA1Zlx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA2Ylx1OTVhMlx1OTAyM1x1MzA1OVx1MzA4Ylx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1NjljYlx1NjIxMCAnJ3swfScnIFx1MzA2Ylx1NTIwN1x1MzA4YVx1NjZmZlx1MzA0OFx1MzA3ZVx1MzA1OVx1MzA0Yj8NCi0JDQotIyBDb25maWd1cmF0aW9uIENvbWJvDQotY3VycmVudENvbmZpZ0xhYmVsX3RleHQ9XHU3M2ZlXHU4ODRjXHUzMDZlXHU2OWNiXHU2MjEwOg0KLXNlbGVjdENvbmZpZ0xhYmVsX3RleHQ9XHU2OWNiXHU2MjEwXHUzMDZlXHU5MDc4XHU2MjllDQotDQotIyBEZWxldGUgRmlsZXMgQ29uZmlybWF0aW9uIE1lc3NhZ2UNCi1kZWxldGVGaWxlc0NvbmZpcm1hdGlvbl9tc2c9XHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGQxXHUzMGI5ICcnezB9JycgXHUzMDZmXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyIFx1MzA1M1x1MzA2ZVx1MzBkNVx1MzBhOVx1MzBlYlx1MzBjMFx1MzBmY1x1NTE4NVx1MzA2ZVx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2ZVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1NTI0YVx1OTY2NFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTdkOWFcdTg4NGNcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQotDQotIyBQYXRocy9GaWxlcyBFcnJvciBNZXNzYWdlcw0KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPVx1MzBkMVx1MzBiOSAnJ3swfScnIFx1MzA2Ylx1MzAwMVx1NTI0YVx1OTY2NFx1MzA2N1x1MzA0ZFx1MzA2YVx1MzA0NCAxIFx1MzA2NFx1NGVlNVx1NGUwYVx1MzA2ZVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1NTQyYlx1MzA3ZVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMlxuXG5cdTUyMjVcdTMwNmVcdTMwZDFcdTMwYjlcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1jcmVhdGVQYXRoRXJyb3JfcmVhc29uPVx1MzBkMVx1MzBiOSAnJ3swfScnIFx1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXG5cdTUyMjVcdTMwNmVcdTMwZDFcdTMwYjlcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTUxOGRcdThhNjZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1pbnZhbGlkUGF0aF9tc2c9XHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGQxXHUzMGI5XHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyDQotDQotIyBCYWNrdXAgTGlicmFyeSBEaWFsb2cNCi1iYWNrdXBMaWJyYXJ5RGlhbG9nX3RpdGxlPVx1MzBkMFx1MzBjM1x1MzBhZlx1MzBhMlx1MzBjM1x1MzBkN1x1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmYw0KLWJhY2t1cExpYnJhcnlEaWFsb2dfdGV4dD1cdTdkOWFcdTg4NGNcdTMwNTlcdTMwOGJcdTUyNGRcdTMwNmJcdTMwMDFcdTczZmVcdTg4NGNcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwOTJcdTMwZDBcdTMwYzNcdTMwYWZcdTMwYTJcdTMwYzNcdTMwZDdcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwOTJcdTVmMzdcdTMwNGZcdTMwNGFcdTUyZTdcdTMwODFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDJcblxuXHUzMDBjT0tcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTlcdTMwOGJcdTMwNjhcdTMwMDFcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWZcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNmJcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwZDBcdTMwYzNcdTMwYWZcdTMwYTJcdTMwYzNcdTMwZDdcdTMwZmJcdTMwYjNcdTMwZDRcdTMwZmNcdTMwNGNcdTRmNWNcdTYyMTBcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDIgXHUzMDBjXHUzMGI5XHUzMGFkXHUzMGMzXHUzMGQ3XHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU5XHUzMDhiXHUzMDY4XHUzMDAxXHUzMGQwXHUzMGMzXHUzMGFmXHUzMGEyXHUzMGMzXHUzMGQ3XHUzMDkyXHU0ZjVjXHU2MjEwXHUzMDViXHUzMDVhXHUzMDZiXHU3ZDlhXHU4ODRjXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotYmFja2luZ1VwTGlicmFyeVRhc2tfbmFtZT1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmVcdTMwZDBcdTMwYzNcdTMwYWZcdTMwYTJcdTMwYzNcdTMwZDdcdTMwZmJcdTMwYjNcdTMwZDRcdTMwZmNcdTMwOTJcdTRmNWNcdTYyMTBcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkgLi4uDQotDQotIyBQYXRoIFNlbGVjdGlvbiBEaWFsb2cNCi1wYXRoU2VsZWN0aW9uRXJyb3JfbXNnPVx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzBmY1x1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLW9rQnV0dG9uX3RleHQ9T0sNCi1za2lwQnV0dG9uX3RleHQ9XHUzMGI5XHUzMGFkXHUzMGMzXHUzMGQ3DQotDQotIyBQcm9jZXNzIEVkaXRvciBwcmVmZXJlbmNlcw0KLWFsd2F5c0J1dHRvbl90ZXh0PVx1NWUzOFx1NjY0Mg0KLW5ldmVyQnV0dG9uX3RleHQ9XHU4ODRjXHUzMDhmXHUzMDZhXHUzMDQ0DQotcHJvbXB0QnV0dG9uX3RleHQ9XHUzMGQ3XHUzMGVkXHUzMGYzXHUzMGQ3XHUzMGM4XHUzMDkyXHU1MWZhXHUzMDU5DQotDQotIyBBZGQgTGluayBEaWFsb2cNCi1saW5rVG9VUkxfbmFtZT1VUkwNCi1saW5rVG9GaWxlX25hbWU9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViDQotZWxlbWVudExpbmtfbmFtZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTg5ODFcdTdkMjANCi1lbGVtZW50TGlua1dpdGhUeXBlX25hbWU9XHUzMGJmXHUzMGE0XHUzMGQ3XHUzMGZiXHUzMGQ3XHUzMGVjXHUzMGQ1XHUzMGEzXHUzMGMzXHUzMGFmXHUzMGI5XHU0ZWQ4XHUzMDRkXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU4OTgxXHU3ZDIwDQotZWxlbWVudExpbmtXaXRoVXNlclRleHRfbmFtZT1cdTMwYWJcdTMwYjlcdTMwYmZcdTMwZTBcdTMwZmJcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTRlZDhcdTMwNGRcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTg5ODFcdTdkMjANCi0NCi0jIENvbnZlcnQgQWN0aXZpdHkgVHlwZSBEaWFsb2cNCi1jb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGl0bGU9XHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHUzMGZiXHUzMGJmXHUzMGE0XHUzMGQ3XHUzMDZlXHU1OTA5XHU2M2RiDQotY29udmVydEFjdGl2aXR5RGlhbG9nX3RleHQ9XHUzMGJmXHUzMGZjXHUzMGIyXHUzMGMzXHUzMGM4XHUzMDZlXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHUzMGZiXHUzMGJmXHUzMGE0XHUzMGQ3XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfbXNnPUlVUEwwMzA0RTogXHUzMDUzXHUzMDZlXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjXHUzMDZmXHU1MjI1XHUzMDZlXHUzMGJmXHUzMGE0XHUzMGQ3XHUzMDZiXHU1OTA5XHU2M2RiXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfcmVhc29uPXswfSBcdTMwNmJcdTMwNmZcdTMwMDFcdTRlOTJcdTYzZGJcdTYwMjdcdTMwNmVcdTMwNDJcdTMwOGJcdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTMwZmJcdTMwYmZcdTMwYTRcdTMwZDdcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIxMTMwYWUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgTmFtZXMgKFNpbmd1bGFyKQ0KLWFjdGl2aXR5X3RleHQ9XHVkNjVjXHViM2Q5DQotYXJ0aWZhY3RfdGV4dD1cdWM1NDRcdWQyZjBcdWQzMjlcdWQyYjgNCi1jYXBhYmlsaXR5UGF0dGVybl90ZXh0PVx1YWUzMFx1YjJhNSBcdWQzMjhcdWQxMzQNCi1jaGVja2xpc3RfdGV4dD1cdWNjYjRcdWQwNmNcdWI5YWNcdWMyYTRcdWQyYjgNCi1jaGVja0l0ZW1fdGV4dD1cdWFjODBcdWMwYWMgXHVkNTZkXHViYWE5DQotY29tcG9zaXRlUm9sZV90ZXh0PVx1Y2VmNFx1ZDNlY1x1YzljMFx1ZDJiOCBcdWM1ZWRcdWQ1NjANCi1jb25jZXB0X3RleHQ9XHVhYzFjXHViMTUwDQotY29udGVudFBhY2thZ2VfdGV4dD1cdWNlZThcdWQxNTBcdWNlMjAgXHVkMzI4XHVkMGE0XHVjOWMwDQotY3VzdG9tQ2F0ZWdvcnlfdGV4dD1cdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4IFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYw0KLWRlbGl2ZXJhYmxlX3RleHQ9XHVjNzc4XHViM2M0XHViYjNjDQotZGVsaXZlcnlQcm9jZXNzX3RleHQ9XHVjODA0XHViMmVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNA0KLWRlc2NyaXB0b3JfdGV4dD1cdWMxMjRcdWJhODVcdWM3OTANCi1kaXNjaXBsaW5lX3RleHQ9XHVjNmQwXHVjZTU5DQotZGlzY2lwbGluZUdyb3VwaW5nX3RleHQ9XHVjNmQwXHVjZTU5IFx1YWRmOFx1YjhmOVx1ZDY1NA0KLWRvbWFpbl90ZXh0PVx1YjNjNFx1YmE1NFx1Yzc3OA0KLWVzdGltYXRlX3RleHQ9XHVjNjA4XHVjMGMxDQotZXN0aW1hdGluZ01ldHJpY190ZXh0PVx1YzYwOFx1YzBjMSBcdWJhNTRcdWQyYjhcdWI5YWQNCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dD1cdWM2MDhcdWMwYzEgXHVhY2UwXHViODI0XHVjMGFjXHVkNTZkDQotZXhhbXBsZV90ZXh0PVx1YzYwOFx1YzgxYw0KLWd1aWRhbmNlX3RleHQ9XHVjNTQ4XHViMGI0DQotZ3VpZGVsaW5lX3RleHQ9XHVhYzAwXHVjNzc0XHViNGRjXHViNzdjXHVjNzc4DQotaXRlcmF0aW9uX3RleHQ9XHViYzE4XHViY2Y1DQotbWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0PVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzENCi1tZXRob2RDb250ZW50X3RleHQ9XHViYTU0XHVjMThjXHViNGRjIFx1Y2VlOFx1ZDE1MFx1Y2UyMA0KLW1ldGhvZExpYnJhcnlfdGV4dD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjDQotbWV0aG9kUGFja2FnZV90ZXh0PVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWQzMjhcdWQwYTRcdWM5YzANCi1tZXRob2RQbHVnaW5fdGV4dD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4DQotbWlsZXN0b25lX3RleHQ9XHVjNzc0XHVjODE1XHVkNDVjDQotb3V0Y29tZV90ZXh0PVx1YWNiMFx1YWNmY1x1YmIzYw0KLXBoYXNlX3RleHQ9XHViMmU4XHVhY2M0DQotcHJhY3RpY2VfdGV4dD1cdWMwYWNcdWI4NDANCi1wcm9jZXNzX3RleHQ9XHVkNTA0XHViODVjXHVjMTM4XHVjMmE0DQotcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0PVx1Y2MyOFx1YjRmMSBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQNCi1wcm9jZXNzRmFtaWx5X3RleHQ9XHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1YWNjNFx1YzVmNA0KLXByb2Nlc3NQYWNrYWdlX3RleHQ9XHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1ZDMyOFx1ZDBhNFx1YzljMA0KLXJlcG9ydF90ZXh0PVx1YmNmNFx1YWNlMFx1YzExYw0KLXJldXNhYmxlQXNzZXRfdGV4dD1cdWM3YWNcdWMwYWNcdWM2YTlcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjNzkwXHVjMGIwDQotcm9hZG1hcF90ZXh0PVx1Yjg1Y1x1YjRkY1x1YjlmNQ0KLXJvbGVEZXNjcmlwdG9yX3RleHQ9XHVjNWVkXHVkNTYwIFx1YzEyNFx1YmE4NVx1Yzc5MA0KLXJvbGVfdGV4dD1cdWM1ZWRcdWQ1NjANCi1yb2xlU2V0X3RleHQ9XHVjNWVkXHVkNTYwIFx1YzEzOFx1ZDJiOA0KLXJvbGVTZXRHcm91cGluZ190ZXh0PVx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjggXHVhZGY4XHViOGY5XHVkNjU0DQotc3RhbmRhcmRDYXRlZ29yeV90ZXh0PVx1ZDQ1Y1x1YzkwMCBcdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMNCi1zdGVwX3RleHQ9XHViMmU4XHVhY2M0DQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ9XHVjOWMwXHVjNmQwIFx1Yzc5MFx1YjhjYw0KLXRhc2tfdGV4dD1cdWQwYzBcdWMyYTRcdWQwNmMNCi10YXNrRGVzY3JpcHRvcl90ZXh0PVx1ZDBjMFx1YzJhNFx1ZDA2YyBcdWMxMjRcdWJhODVcdWM3OTANCi10ZWFtUHJvZmlsZV90ZXh0PVx1ZDMwMCBcdWQ1MDRcdWI4NWNcdWQzMGNcdWM3N2MNCi10ZW1wbGF0ZV90ZXh0PVx1ZDE1Y1x1ZDUwY1x1YjlhY1x1ZDJiOA0KLXRlcm1EZWZpbml0aW9uX3RleHQ9XHVjNmE5XHVjNWI0IFx1YzgxNVx1Yzc1OA0KLXRvb2xfdGV4dD1cdWIzYzRcdWFkNmMNCi10b29sTWVudG9yX3RleHQ9XHViM2M0XHVhZDZjIFx1YzBhY1x1YzZhOSBcdWIzYzRcdWM2YzBcdWI5ZDANCi13aGl0ZXBhcGVyX3RleHQ9XHViYzMxXHVjMTFjDQotd29ya1Byb2R1Y3RfdGV4dD1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjDQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWMxMjRcdWJhODVcdWM3OTANCi13b3JrUHJvZHVjdEVsZW1lbnRfdGV4dD1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjIFx1YzY5NFx1YzE4Yw0KLXdvcmtQcm9kdWN0VHlwZV90ZXh0PVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjNzIwXHVkNjE1DQotDQotIyBNZXRob2QgRWxlbWVudCBOYW1lcyAoUGx1cmFsKQ0KLWFjdGl2aXR5X3RleHRfcGx1cmFsPVx1ZDY1Y1x1YjNkOQ0KLWFydGlmYWN0X3RleHRfcGx1cmFsPVx1YzU0NFx1ZDJmMFx1ZDMyOVx1ZDJiOA0KLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHRfcGx1cmFsPVx1YWUzMFx1YjJhNSBcdWQzMjhcdWQxMzQNCi1jaGVja2xpc3RfdGV4dF9wbHVyYWw9XHVjY2I0XHVkMDZjXHViOWFjXHVjMmE0XHVkMmI4DQotY2hlY2tJdGVtX3RleHRfcGx1cmFsPVx1YWM4MFx1YzBhYyBcdWQ1NmRcdWJhYTkNCi1jb21wb3NpdGVSb2xlX3RleHRfcGx1cmFsPVx1Y2VmNFx1ZDNlY1x1YzljMFx1ZDJiOCBcdWM1ZWRcdWQ1NjANCi1jb25jZXB0X3RleHRfcGx1cmFsPVx1YWMxY1x1YjE1MA0KLWNvbnRlbnRQYWNrYWdlX3RleHRfcGx1cmFsPVx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWQzMjhcdWQwYTRcdWM5YzANCi1jdXN0b21DYXRlZ29yeV90ZXh0X3BsdXJhbD1cdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4IFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYw0KLWRlbGl2ZXJhYmxlX3RleHRfcGx1cmFsPVx1Yzc3OFx1YjNjNFx1YmIzYw0KLWRlbGl2ZXJ5UHJvY2Vzc190ZXh0X3BsdXJhbD1cdWM4MDRcdWIyZWMgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0DQotZGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1cdWMxMjRcdWJhODVcdWM3OTANCi1kaXNjaXBsaW5lX3RleHRfcGx1cmFsPVx1YzZkMFx1Y2U1OQ0KLWRpc2NpcGxpbmVHcm91cGluZ190ZXh0X3BsdXJhbD1cdWM2ZDBcdWNlNTkgXHVhZGY4XHViOGY5DQotZG9tYWluX3RleHRfcGx1cmFsPVx1YjNjNFx1YmE1NFx1Yzc3OA0KLWVzdGltYXRlX3RleHRfcGx1cmFsPVx1YzYwOFx1YzBjMQ0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dF9wbHVyYWw9XHVjNjA4XHVjMGMxIFx1YmE1NFx1ZDJiOFx1YjlhZA0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0X3BsdXJhbD1cdWM2MDhcdWMwYzEgXHVhY2UwXHViODI0XHVjMGFjXHVkNTZkDQotZXhhbXBsZV90ZXh0X3BsdXJhbD1cdWM2MDhcdWM4MWMNCi1ndWlkYW5jZV90ZXh0X3BsdXJhbD1cdWM1NDhcdWIwYjQNCi1ndWlkZWxpbmVfdGV4dF9wbHVyYWw9XHVhYzAwXHVjNzc0XHViNGRjXHViNzdjXHVjNzc4DQotaXRlcmF0aW9uX3RleHRfcGx1cmFsPVx1YmMxOFx1YmNmNQ0KLW1ldGhvZENvbmZpZ3VyYXRpb25fdGV4dF9wbHVyYWw9XHViYTU0XHVjMThjXHViNGRjIFx1YWQ2Y1x1YzEzMQ0KLW1ldGhvZENvbnRlbnRfdGV4dF9wbHVyYWw9XHViYTU0XHVjMThjXHViNGRjIFx1Y2VlOFx1ZDE1MFx1Y2UyMA0KLW1ldGhvZExpYnJhcnlfdGV4dF9wbHVyYWw9XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYw0KLW1ldGhvZFBhY2thZ2VfdGV4dF9wbHVyYWw9XHViYTU0XHVjMThjXHViNGRjIFx1ZDMyOFx1ZDBhNFx1YzljMA0KLW1ldGhvZFBsdWdpbl90ZXh0X3BsdXJhbD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4DQotbWlsZXN0b25lX3RleHRfcGx1cmFsPVx1Yzc3NFx1YzgxNVx1ZDQ1Yw0KLW91dGNvbWVfdGV4dF9wbHVyYWw9XHVhY2IwXHVhY2ZjXHViYjNjDQotcGhhc2VfdGV4dF9wbHVyYWw9XHViMmU4XHVhY2M0DQotcHJhY3RpY2VfdGV4dF9wbHVyYWw9XHVjMGFjXHViODQwDQotcHJvY2Vzc190ZXh0X3BsdXJhbD1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQNCi1wcm9jZXNzQ29udHJpYnV0aW9uX3RleHRfcGx1cmFsPVx1Y2MyOFx1YjRmMSBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQNCi1wcm9jZXNzRmFtaWx5X3RleHRfcGx1cmFsPVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWFjYzRcdWM1ZjQNCi1wcm9jZXNzUGFja2FnZV90ZXh0X3BsdXJhbD1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVkMzI4XHVkMGE0XHVjOWMwDQotcmVwb3J0X3RleHRfcGx1cmFsPVx1YmNmNFx1YWNlMFx1YzExYw0KLXJldXNhYmxlQXNzZXRfdGV4dF9wbHVyYWw9XHVjN2FjXHVjMGFjXHVjNmE5XHVhYzAwXHViMmE1XHVkNTVjIFx1Yzc5MFx1YzBiMA0KLXJvYWRtYXBfdGV4dF9wbHVyYWw9XHViODVjXHViNGRjXHViOWY1DQotcm9sZURlc2NyaXB0b3JfdGV4dF9wbHVyYWw9XHVjNWVkXHVkNTYwIFx1YzEyNFx1YmE4NVx1Yzc5MA0KLXJvbGVfdGV4dF9wbHVyYWw9XHVjNWVkXHVkNTYwDQotcm9sZVNldF90ZXh0X3BsdXJhbD1cdWM1ZWRcdWQ1NjAgXHVjMTM4XHVkMmI4DQotcm9sZVNldEdyb3VwaW5nX3RleHRfcGx1cmFsPVx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjggXHVhZGY4XHViOGY5DQotc3RhbmRhcmRDYXRlZ29yeV90ZXh0X3BsdXJhbD1cdWQ0NWNcdWM5MDAgXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjDQotc3RlcF90ZXh0X3BsdXJhbD1cdWIyZThcdWFjYzQNCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dF9wbHVyYWw9XHVjOWMwXHVjNmQwIFx1Yzc5MFx1YjhjYw0KLXRhc2tfdGV4dF9wbHVyYWw9XHVkMGMwXHVjMmE0XHVkMDZjDQotdGFza0Rlc2NyaXB0b3JfdGV4dF9wbHVyYWw9XHVkMGMwXHVjMmE0XHVkMDZjIFx1YzEyNFx1YmE4NVx1Yzc5MA0KLXRlYW1Qcm9maWxlX3RleHRfcGx1cmFsPVx1ZDMwMCBcdWQ1MDRcdWI4NWNcdWQzMGNcdWM3N2MNCi10ZW1wbGF0ZV90ZXh0X3BsdXJhbD1cdWQxNWNcdWQ1MGNcdWI5YWNcdWQyYjgNCi10ZXJtRGVmaW5pdGlvbl90ZXh0X3BsdXJhbD1cdWM2YTlcdWM1YjQgXHVjODE1XHVjNzU4DQotdG9vbF90ZXh0X3BsdXJhbD1cdWIzYzRcdWFkNmMNCi10b29sTWVudG9yX3RleHRfcGx1cmFsPVx1YjNjNFx1YWQ2YyBcdWMwYWNcdWM2YTkgXHViM2M0XHVjNmMwXHViOWQwDQotd2hpdGVwYXBlcl90ZXh0X3BsdXJhbD1cdWJjMzFcdWMxMWMNCi13b3JrUHJvZHVjdF90ZXh0X3BsdXJhbD1cdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjDQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHRfcGx1cmFsPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjMTI0XHViYTg1XHVjNzkwDQotd29ya1Byb2R1Y3RFbGVtZW50X3RleHRfcGx1cmFsPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjNjk0XHVjMThjDQotd29ya1Byb2R1Y3RUeXBlX3RleHRfcGx1cmFsPVx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjNzIwXHVkNjE1DQotDQotIyBBcHBsaWNhdGlvbiB0aXRsZS4NCi1hcHBsaWNhdGlvbl90aXRsZT17MH0gLSB7MX0NCi0NCi0jIE9wZW4gTWV0aG9kIExpYnJhcnkgRGlhbG9nDQotb3BlbkxpYnJhcnlEaWFsb2dfdGl0bGU9XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWM1ZjRcdWFlMzANCi1vcGVuTGlicmFyeURpYWxvZ0FyZWFfdGl0bGU9XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWMxMjBcdWQwZGQNCi1vcGVuTGlicmFyeURpYWxvZ0FyZWFfdGV4dD17MH0gXHVjODFjXHVkNDg4XHVjNzQwIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI3N2NcdWIyOTQgXHVkM2Y0XHViMzU0XHVjNWQwIFx1YmE1NFx1YzE4Y1x1YjRkY1x1YzY0MFxuXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHViOTdjIFx1YzgwMFx1YzdhNVx1ZDU2OVx1YjJjOFx1YjJlNC4gXHVjNzc0IFx1YzEzOFx1YzE1OFx1YzVkMCBcdWMwYWNcdWM2YTlcdWQ1NjAgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWQzZjRcdWIzNTRcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWxpYnJhcnlMYWJlbF90ZXh0PVx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYzoNCi1icm93c2VCdXR0b25fdGV4dD1cdWNjM2VcdWM1NDRcdWJjZjRcdWFlMzAuLi4NCi1wcm9tcHRGb3JMaWJyYXJ5Q2hlY2tib3hfdGV4dD1cdWM3NzRcdWI5N2MgXHVhZTMwXHViY2Y4XHVhYzEyXHVjNzNjXHViODVjIFx1YzBhY1x1YzZhOVx1ZDU1OFx1YWNlMCBcdWIyZTRcdWMyZGMgXHVkNDVjXHVjMmRjXHVkNTU4XHVjOWMwIFx1YzU0YVx1Yzc0Yw0KLW9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVhYzAwICcnezB9JydcdWM1ZDAgXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LlxuXHVjMGM4IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWFjMDAgXHVjOWMwXHVjODE1XHViNDFjIFx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhY1x1YzVkMFx1YzExYyBcdWM3OTFcdWMxMzFcdWI0MThcdWM1YjQgXHVjNWY0XHViOWJkXHViMmM4XHViMmU0LlxuXG5cdWQ2NTVcdWM3NzhcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjNWVjIFx1YzljNFx1ZDU4OVx1ZDU1OFx1YWM3MFx1YjA5OCBcdWNkZThcdWMxOGNcdWI5N2MgXHVkMDc0XHViOWFkXHVkNTU4XHVjNWVjIFx1YjJlNFx1Yjk3OCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YWNiZFx1Yjg1Y1x1Yjk3YyBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotIyBTZWxlY3QgTWV0aG9kIExpYnJhcnkgRm9sZGVyIERpYWxvZw0KLXNlbGVjdExpYnJhcnlGb2xkZXJEaWFsb2dfdGl0bGU9XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWMxMjBcdWQwZGQNCi1zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RleHQ9XHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWQzZjRcdWIzNTRcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLQ0KLSMgT3BlbiBMaWJyYXJ5IFByb2dyZXNzIE1lc3NhZ2UNCi1vcGVuaW5nTGlicmFyeVRhc2tfbmFtZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzVlY1x1YjI5NCBcdWM5MTEuLi4NCi0NCi0jIE9wZW4gTWV0aG9kIExpYnJhcnkgRXJyb3IgRGlhbG9nDQotaW52YWxpZExpYnJhcnlQYXRoX21zZz1JVVBMMDMwMEU6IFx1YzljMFx1YzgxNVx1ZDU1YyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzVmNCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWludmFsaWRMaWJyYXJ5UGF0aF9yZWFzb249XHVjMTIwXHVkMGRkXHVkNTVjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVkM2Y0XHViMzU0XHVhYzAwIFx1YzYyY1x1YmMxNFx1Yjk3NFx1YzljMCBcdWM1NGFcdWFjNzBcdWIwOTgsIFx1YzVjNlx1YWM3MFx1YjA5OCwgXHVjMGFjXHVjNmE5XHVjNzkwXHVhYzAwIFx1Yzc3NFx1Yjk3YyBcdWM1NjFcdWMxMzhcdWMyYTRcdWQ1NjAgXHVjMjE4IFx1Yzc4OFx1YjI5NCBcdWM2MmNcdWJjMTRcdWI5NzggXHVhZDhjXHVkNTVjXHVjNzQ0IFx1YWMxNlx1YWNlMCBcdWM3ODhcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0LlxuXG5cdWIyZTRcdWI5NzggXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1ZDNmNFx1YjM1NFx1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWI4MjRcdWJhNzQgXHVkNjU1XHVjNzc4XHVjNzQ0IFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jIExpYnJhcnkgTG9ja2VkIEVycm9yIERpYWxvZw0KLWxpYnJhcnlMb2NrZWRfbXNnPUlVUEwwMzAzRTogXHVjOWMwXHVjODE1XHVkNTVjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHVjNWY0IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuXG5cblx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVhYzAwIFx1YzBhY1x1YzZhOSBcdWM5MTFcdWM3ODVcdWIyYzhcdWIyZTQuIFx1Y2RlOFx1YzE4Y1x1Yjk3YyBcdWQwNzRcdWI5YWRcdWQ1NThcdWM1ZWMgXHViMmU0XHViOTc4IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWQzZjRcdWIzNTRcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHVjNWY0XHViODI0XHViYTc0IFx1YWMxNVx1YzgxYyBcdWM1ZjRcdWFlMzBcdWI5N2MgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LlxuXG5cdWFjYmRcdWFjZTA6IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHViM2Q5XHVjMmRjXHVjNWQwIFx1YzBhY1x1YzZhOVx1ZDU1OFx1YmE3NCBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWFjMDAgXHVjMTkwXHVjMGMxXHViNDIwIFx1YzIxOCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotbGlicmFyeUxvY2tlZF9vcGVuQnV0dG9uX3RleHQ9XHVhYzE1XHVjODFjIFx1YzVmNFx1YWUzMA0KLQ0KLSMgUmVhZC1vbmx5IFByb2plY3QgRmlsZSBFcnJvciBEaWFsb2cNCi1yZWFkT25seVByb2plY3RGaWxlX3RleHQ9SVVQTDAzMDJFOiAnJ3swfScnXHVjNzQwKFx1YjI5NCkgXHVjNzdkXHVhZTMwIFx1YzgwNFx1YzZhOVx1Yzc4NVx1YjJjOFx1YjJlNC4gXHVhY2M0XHVjMThkXHVkNTU4XHVhZTMwIFx1YzgwNFx1YzVkMCBcdWM0ZjBcdWFlMzAgXHVhYzAwXHViMmE1XHVjNzNjXHViODVjIFx1YjljY1x1YjRkY1x1YzJlZFx1YzJkY1x1YzYyNC4NCi1yZXRyeUJ1dHRvbl90ZXh0PVx1YzdhY1x1YzJkY1x1YjNjNA0KLWNhbmNlbEJ1dHRvbl90ZXh0PVx1Y2RlOFx1YzE4Yw0KLQ0KLSMgVmVyc2lvbiBNaXNtYXRjaCBEaWFsb2cNCi12ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dD1JVVBMMzA1RTogXHVjMTIwXHVkMGRkXHVkNTVjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWM1ZjQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzc0IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWM1ZjRcdWI4MjRcdWJhNzQgezB9IFx1YmM4NFx1YzgwNFx1Yzc0NCB7MX0gXHVjNzc0XHVjMGMxXHVjNzNjXHViODVjIFx1YzVjNVx1YWRmOFx1YjgwOFx1Yzc3NFx1YjRkY1x1ZDU3NFx1YzU3YyBcdWQ1NjlcdWIyYzhcdWIyZTQuDQotdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHRfdW5rbm93bj1JVVBMMzA2RTogXHVjMTIwXHVkMGRkXHVkNTVjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWM1ZjQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzc0IFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1Yjk3YyBcdWM1ZjRcdWI4MjRcdWJhNzQgezB9IFx1YmM4NFx1YzgwNFx1Yzc0NCBcdWMwYzFcdWM3MDQgXHViYzg0XHVjODA0XHVjNzNjXHViODVjIFx1YzVjNVx1YWRmOFx1YjgwOFx1Yzc3NFx1YjRkY1x1ZDU3NFx1YzU3YyBcdWQ1NjlcdWIyYzhcdWIyZTQuDQotDQotIyBVcGdyYWRlIE1ldGhvZCBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVjNWM1XHVhZGY4XHViODA4XHVjNzc0XHViNGRjDQotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGV4dD1cdWMxMjBcdWQwZGRcdWQ1NWMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzBjOCBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVhZDZjXHVjODcwXHViODVjIFx1YzVjNVx1YWRmOFx1YjgwOFx1Yzc3NFx1YjRkY1x1ZDU3NFx1YzU3YyBcdWQ1NjlcdWIyYzhcdWIyZTQuXG5cblx1YzVjNVx1YWRmOFx1YjgwOFx1Yzc3NFx1YjRkY1x1Yjk3YyBcdWFjYzRcdWMxOGRcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotdXBncmFkaW5nTGlicmFyeVRhc2tfbmFtZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YzVjNVx1YWRmOFx1YjgwOFx1Yzc3NFx1YjRkY1x1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi0NCi0jIFVwZ3JhZGUgTGlicmFyeSBFcnJvciBEaWFsb2cNCi11cGdyYWRlTGlicmFyeUVycm9yX21zZz1JVVBMMDMwMUU6IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHVjNWM1XHVhZGY4XHViODA4XHVjNzc0XHViNGRjXHVkNTU4XHVjOWMwIFx1YmFiYlx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWI4NWNcdWFkZjggXHVkMzBjXHVjNzdjXHVjNzQ0IFx1Y2MzOFx1Yzg3MFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi0NCi0jIFN3aXRjaCBDb25maWd1cmF0aW9uIERpYWxvZw0KLXN3aXRjaENvbmZpZ0RpYWxvZ190aXRsZT1cdWFkNmNcdWMxMzEgXHVjODA0XHVkNjU4DQotc3dpdGNoQ29uZmlnRGlhbG9nX3RleHQ9XHVkNjA0XHVjN2FjIFx1YWQ2Y1x1YzEzMVx1Yzc0NCBcdWMxMjBcdWQwZGRcdWI0MWMgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0XHVjNjQwIFx1YzVmMFx1YWQwMFx1YjQxYyBcdWFlMzBcdWJjZjggXHVhZDZjXHVjMTMxXHVjNzc4ICcnezB9JycoXHVjNzNjKVx1Yjg1YyBcdWM4MDRcdWQ2NThcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/DQotCQ0KLSMgQ29uZmlndXJhdGlvbiBDb21ibw0KLWN1cnJlbnRDb25maWdMYWJlbF90ZXh0PVx1ZDYwNFx1YzdhYyBcdWFkNmNcdWMxMzE6DQotc2VsZWN0Q29uZmlnTGFiZWxfdGV4dD1cdWFkNmNcdWMxMzEgXHVjMTIwXHVkMGRkDQotDQotIyBEZWxldGUgRmlsZXMgQ29uZmlybWF0aW9uIE1lc3NhZ2UNCi1kZWxldGVGaWxlc0NvbmZpcm1hdGlvbl9tc2c9XHVjOWMwXHVjODE1XHVkNTVjICcnezB9JycgXHVhY2JkXHViODVjXHVhYzAwIFx1Yzc3NFx1YmJmOCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1ZDNmNFx1YjM1NFx1Yzc1OCBcdWJhYThcdWI0ZTAgXHVkMzBjXHVjNzdjXHVjNzc0IFx1YzBhZFx1YzgxY1x1YjQyOVx1YjJjOFx1YjJlNC4gXHVhY2M0XHVjMThkXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLQ0KLSMgUGF0aHMvRmlsZXMgRXJyb3IgTWVzc2FnZXMNCi1kZWxldGVGaWxlc0Vycm9yX3JlYXNvbj0nJ3swfScnIFx1YWNiZFx1Yjg1Y1x1YzVkMCBcdWMwYWRcdWM4MWNcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YjI5NCBcdWQ1NThcdWIwOTggXHVjNzc0XHVjMGMxXHVjNzU4IFx1ZDMwY1x1Yzc3Y1x1Yzc3NCBcdWQzZWNcdWQ1NjhcdWI0MThcdWM1YjQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LlxuXG5cdWIyZTRcdWI5NzggXHVhY2JkXHViODVjXHViOTdjIFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YWNlMCBcdWIyZTRcdWMyZGMgXHVjMmRjXHViM2M0XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWNyZWF0ZVBhdGhFcnJvcl9yZWFzb249Jyd7MH0nJyBcdWFjYmRcdWI4NWNcdWI5N2MgXHVjNzkxXHVjMTMxXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuXG5cblx1YjJlNFx1Yjk3OCBcdWFjYmRcdWI4NWNcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTU4XHVhY2UwIFx1YjJlNFx1YzJkYyBcdWMyZGNcdWIzYzRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotaW52YWxpZFBhdGhfbXNnPVx1YzljMFx1YzgxNVx1ZDU1YyBcdWFjYmRcdWI4NWNcdWFjMDAgXHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIEJhY2t1cCBMaWJyYXJ5IERpYWxvZw0KLWJhY2t1cExpYnJhcnlEaWFsb2dfdGl0bGU9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YmMzMVx1YzVjNQ0KLWJhY2t1cExpYnJhcnlEaWFsb2dfdGV4dD1cdWFjYzRcdWMxOGRcdWQ1NThcdWFlMzAgXHVjODA0XHVjNWQwIFx1ZDYwNFx1YzdhYyBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHViOTdjIFx1YmMzMVx1YzVjNVx1ZDU2MCBcdWFjODNcdWM3NDQgXHVhZDhjXHVjN2E1XHVkNTY5XHViMmM4XHViMmU0LiBcblxuXHVjOWMwXHVjODE1XHVkNTVjIFx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhY1x1YzVkMCBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM3NTggXHViYzMxXHVjNWM1IFx1YzBhY1x1YmNmOFx1Yzc0NCBcdWM3OTFcdWMxMzFcdWQ1NThcdWI4MjRcdWJhNzQgXHVkNjU1XHVjNzc4XHVjNzQ0IFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC5cblx1YmMzMVx1YzVjNVx1Yzc0NCBcdWM3OTFcdWMxMzFcdWQ1NThcdWM5YzAgXHVjNTRhXHVhY2UwIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YjgyNFx1YmE3NCBcdWFjNzRcdWIxMDhcdWI2ZjBcdWFlMzBcdWI5N2MgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWJhY2tpbmdVcExpYnJhcnlUYXNrX25hbWU9XHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1ZDMwY1x1Yzc3Y1x1Yzc1OCBcdWJjMzFcdWM1YzUgXHVjMGFjXHViY2Y4XHVjNzQ0IFx1Yzc5MVx1YzEzMVx1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi0NCi0jIFBhdGggU2VsZWN0aW9uIERpYWxvZw0KLXBhdGhTZWxlY3Rpb25FcnJvcl9tc2c9XHViNTE0XHViODA5XHVkMWEwXHViOWFjXHViOTdjIFx1Yzc5MVx1YzEzMVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjNzRjDQotb2tCdXR0b25fdGV4dD1cdWQ2NTVcdWM3NzgNCi1za2lwQnV0dG9uX3RleHQ9XHVhYzc0XHViMTA4XHViNmYwXHVhZTMwDQotDQotIyBQcm9jZXNzIEVkaXRvciBwcmVmZXJlbmNlcw0KLWFsd2F5c0J1dHRvbl90ZXh0PVx1ZDU2ZFx1YzBjMQ0KLW5ldmVyQnV0dG9uX3RleHQ9XHVjMjE4XHVkNTg5IFx1YzU0OFx1ZDU2OA0KLXByb21wdEJ1dHRvbl90ZXh0PVx1ZDUwNFx1Yjg2Y1x1ZDUwNFx1ZDJiOA0KLQ0KLSMgQWRkIExpbmsgRGlhbG9nDQotbGlua1RvVVJMX25hbWU9VVJMDQotbGlua1RvRmlsZV9uYW1lPVx1ZDMwY1x1Yzc3Y1x1Yzc3NA0KLWVsZW1lbnRMaW5rX25hbWU9XHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4Yw0KLWVsZW1lbnRMaW5rV2l0aFR5cGVfbmFtZT1cdWM3MjBcdWQ2MTUgXHVjODExXHViNDUwXHViZDgwXHVhYzAwIFx1Yzc4OFx1YjI5NCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNjk0XHVjMThjDQotZWxlbWVudExpbmtXaXRoVXNlclRleHRfbmFtZT1cdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4IFx1ZDE0ZFx1YzJhNFx1ZDJiOFx1YWMwMCBcdWM3ODhcdWIyOTQgXHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4Yw0KLQ0KLSMgQ29udmVydCBBY3Rpdml0eSBUeXBlIERpYWxvZw0KLWNvbnZlcnRBY3Rpdml0eURpYWxvZ190aXRsZT1cdWQ2NWNcdWIzZDkgXHVjNzIwXHVkNjE1IFx1YmNjMFx1ZDY1OA0KLWNvbnZlcnRBY3Rpdml0eURpYWxvZ190ZXh0PVx1YjMwMFx1ZDU2ZCBcdWQ2NWNcdWIzZDkgXHVjNzIwXHVkNjE1XHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi11bnN1cHBvcnRlZEFjdGl2aXR5VHlwZV9tc2c9SVVQTDAzMDRFOiBcdWM3NzQgXHVkNjVjXHViM2Q5XHVjNzQ0IFx1YjJlNFx1Yjk3OCBcdWM3MjBcdWQ2MTVcdWM3M2NcdWI4NWMgXHViY2MwXHVkNjU4XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfcmVhc29uPXswfVx1YzVkMCBcdWIzMDBcdWQ1NzQgXHVkNjM4XHVkNjU4IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWQ2NWNcdWIzZDkgXHVjNzIwXHVkNjE1XHVjNzc0IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVmNDgyNDIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgTmFtZXMgKFNpbmd1bGFyKQ0KLWFjdGl2aXR5X3RleHQ9QXRpdmlkYWRlDQotYXJ0aWZhY3RfdGV4dD1BcnRlZmF0bw0KLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9UGFkclx1MDBlM28gZGUgUmVjdXJzbw0KLWNoZWNrbGlzdF90ZXh0PUxpc3RhIGRlIFZlcmlmaWNhXHUwMGU3XHUwMGUzbw0KLWNoZWNrSXRlbV90ZXh0PUl0ZW0gZGUgVmVyaWZpY2FcdTAwZTdcdTAwZTNvDQotY29tcG9zaXRlUm9sZV90ZXh0PUZ1blx1MDBlN1x1MDBlM28gZGUgQ29tcG9zaVx1MDBlN1x1MDBlM28NCi1jb25jZXB0X3RleHQ9Q29uY2VpdG8NCi1jb250ZW50UGFja2FnZV90ZXh0PVBhY290ZSBkZSBDb250ZVx1MDBmYWRvDQotY3VzdG9tQ2F0ZWdvcnlfdGV4dD1DYXRlZ29yaWEgUGVyc29uYWxpemFkYQ0KLWRlbGl2ZXJhYmxlX3RleHQ9RGlzdHJpYnVcdTAwZWR2ZWwNCi1kZWxpdmVyeVByb2Nlc3NfdGV4dD1Qcm9jZXNzbyBkZSBFbnRyZWdhDQotZGVzY3JpcHRvcl90ZXh0PURlc2NyaXRvcg0KLWRpc2NpcGxpbmVfdGV4dD1EaXNjaXBsaW5hDQotZGlzY2lwbGluZUdyb3VwaW5nX3RleHQ9QWdydXBhbWVudG8gZGUgRGlzY2lwbGluYQ0KLWRvbWFpbl90ZXh0PURvbVx1MDBlZG5pbw0KLWVzdGltYXRlX3RleHQ9RXN0aW1hcg0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dD1NXHUwMGU5dHJpY2EgRXN0aW1hdGl2YQ0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0PUNvbnNpZGVyYVx1MDBlN1x1MDBmNWVzIEVzdGltYXRpdmFzDQotZXhhbXBsZV90ZXh0PUV4ZW1wbG8NCi1ndWlkYW5jZV90ZXh0PU9yaWVudGFcdTAwZTdcdTAwZTNvDQotZ3VpZGVsaW5lX3RleHQ9RGlyZXRyaXoNCi1pdGVyYXRpb25fdGV4dD1JdGVyYVx1MDBlN1x1MDBlM28NCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHQ9Q29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBNXHUwMGU5dG9kbw0KLW1ldGhvZENvbnRlbnRfdGV4dD1Db250ZVx1MDBmYWRvIGRvIE1cdTAwZTl0b2RvDQotbWV0aG9kTGlicmFyeV90ZXh0PUJpYmxpb3RlY2EgZGUgTVx1MDBlOXRvZG9zDQotbWV0aG9kUGFja2FnZV90ZXh0PVBhY290ZSBkZSBNXHUwMGU5dG9kbw0KLW1ldGhvZFBsdWdpbl90ZXh0PVBsdWctaW4gZGUgTVx1MDBlOXRvZG8NCi1taWxlc3RvbmVfdGV4dD1NYXJjbw0KLW91dGNvbWVfdGV4dD1SZXN1bHRhZG8NCi1waGFzZV90ZXh0PUZhc2UNCi1wcmFjdGljZV90ZXh0PVByXHUwMGUxdGljYQ0KLXByb2Nlc3NfdGV4dD1Qcm9jZXNzbw0KLXByb2Nlc3NDb250cmlidXRpb25fdGV4dD1Qcm9jZXNzbyBEaWZlcmVuY2lhbA0KLXByb2Nlc3NGYW1pbHlfdGV4dD1GYW1cdTAwZWRsaWEgZGUgUHJvY2Vzc28NCi1wcm9jZXNzUGFja2FnZV90ZXh0PVBhY290ZSBkZSBQcm9jZXNzbw0KLXJlcG9ydF90ZXh0PVJlbGF0XHUwMGYzcmlvDQotcmV1c2FibGVBc3NldF90ZXh0PVJlY3Vyc28gUmV1dGlsaXpcdTAwZTF2ZWwNCi1yb2FkbWFwX3RleHQ9Um90ZWlybw0KLXJvbGVEZXNjcmlwdG9yX3RleHQ9RGVzY3JpdG9yIGRhIEZ1blx1MDBlN1x1MDBlM28NCi1yb2xlX3RleHQ9RnVuXHUwMGU3XHUwMGUzbw0KLXJvbGVTZXRfdGV4dD1EZWZpbmlcdTAwZTdcdTAwZTNvIGRlIEZ1blx1MDBlN1x1MDBlM28NCi1yb2xlU2V0R3JvdXBpbmdfdGV4dD1BZ3J1cGFtZW50byBkZSBDb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIEZ1blx1MDBlN1x1MDBmNWVzDQotc3RhbmRhcmRDYXRlZ29yeV90ZXh0PUNhdGVnb3JpYSBQYWRyXHUwMGUzbw0KLXN0ZXBfdGV4dD1FdGFwYQ0KLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0PU1hdGVyaWFsIFN1cG9ydGFkbw0KLXRhc2tfdGV4dD1UYXJlZmENCi10YXNrRGVzY3JpcHRvcl90ZXh0PURlc2NyaXRvciBkZSBUYXJlZmFzDQotdGVhbVByb2ZpbGVfdGV4dD1QZXJmaWwgZGEgRXF1aXBlDQotdGVtcGxhdGVfdGV4dD1UZW1wbGF0ZQ0KLXRlcm1EZWZpbml0aW9uX3RleHQ9RGVmaW5pXHUwMGU3XHUwMGUzbyBkZSBUZXJtbw0KLXRvb2xfdGV4dD1GZXJyYW1lbnRhDQotdG9vbE1lbnRvcl90ZXh0PU1lbnRvciBkZSBGZXJyYW1lbnRhcw0KLXdoaXRlcGFwZXJfdGV4dD1XaGl0ZXBhcGVyDQotd29ya1Byb2R1Y3RfdGV4dD1Qcm9kdXRvIGRlIFRyYWJhbGhvDQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9RGVzY3JpdG9yIGRvIFByb2R1dG8gZGUgVHJhYmFsaG8NCi13b3JrUHJvZHVjdEVsZW1lbnRfdGV4dD1FbGVtZW50byBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotd29ya1Byb2R1Y3RUeXBlX3RleHQ9VGlwbyBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotDQotIyBNZXRob2QgRWxlbWVudCBOYW1lcyAoUGx1cmFsKQ0KLWFjdGl2aXR5X3RleHRfcGx1cmFsPUF0aXZpZGFkZXMNCi1hcnRpZmFjdF90ZXh0X3BsdXJhbD1BcnRlZmF0b3MNCi1jYXBhYmlsaXR5UGF0dGVybl90ZXh0X3BsdXJhbD1QYWRyXHUwMGY1ZXMgZGUgUmVjdXJzbw0KLWNoZWNrbGlzdF90ZXh0X3BsdXJhbD1MaXN0YXMgZGUgVmVyaWZpY2FcdTAwZTdcdTAwZTNvDQotY2hlY2tJdGVtX3RleHRfcGx1cmFsPUl0ZW5zIGRlIFZlcmlmaWNhXHUwMGU3XHUwMGUzbw0KLWNvbXBvc2l0ZVJvbGVfdGV4dF9wbHVyYWw9RnVuXHUwMGU3XHUwMGY1ZXMgQ29tcG9zdGFzDQotY29uY2VwdF90ZXh0X3BsdXJhbD1Db25jZWl0b3MNCi1jb250ZW50UGFja2FnZV90ZXh0X3BsdXJhbD1QYWNvdGVzIGRlIENvbnRlXHUwMGZhZG8NCi1jdXN0b21DYXRlZ29yeV90ZXh0X3BsdXJhbD1DYXRlZ29yaWFzIFBlcnNvbmFsaXphZGFzDQotZGVsaXZlcmFibGVfdGV4dF9wbHVyYWw9RGlzdHJpYnVcdTAwZWR2ZWlzDQotZGVsaXZlcnlQcm9jZXNzX3RleHRfcGx1cmFsPVByb2Nlc3NvcyBkZSBFbnRyZWdhDQotZGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1EZXNjcml0b3Jlcw0KLWRpc2NpcGxpbmVfdGV4dF9wbHVyYWw9RGlzY2lwbGluYXMNCi1kaXNjaXBsaW5lR3JvdXBpbmdfdGV4dF9wbHVyYWw9QWdydXBhbWVudG9zIGRlIERpc2NpcGxpbmFzDQotZG9tYWluX3RleHRfcGx1cmFsPURvbVx1MDBlZG5pb3MNCi1lc3RpbWF0ZV90ZXh0X3BsdXJhbD1Fc3RpbWF0aXZhcw0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dF9wbHVyYWw9TVx1MDBlOXRyaWNhcyBkZSBFc3RpbWF0aXZhDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHRfcGx1cmFsPUNvbnNpZGVyYVx1MDBlN1x1MDBmNWVzIEVzdGltYXRpdmFzDQotZXhhbXBsZV90ZXh0X3BsdXJhbD1FeGVtcGxvcw0KLWd1aWRhbmNlX3RleHRfcGx1cmFsPU9yaWVudGFcdTAwZTdcdTAwZjVlcw0KLWd1aWRlbGluZV90ZXh0X3BsdXJhbD1EaXJldHJpemVzDQotaXRlcmF0aW9uX3RleHRfcGx1cmFsPUl0ZXJhXHUwMGU3XHUwMGY1ZXMNCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHRfcGx1cmFsPUNvbmZpZ3VyYVx1MDBlN1x1MDBmNWVzIGRlIE1cdTAwZTl0b2RvDQotbWV0aG9kQ29udGVudF90ZXh0X3BsdXJhbD1Db250ZVx1MDBmYWRvcyBkZSBNXHUwMGU5dG9kbw0KLW1ldGhvZExpYnJhcnlfdGV4dF9wbHVyYWw9QmlibGlvdGVjYXMgZGUgTVx1MDBlOXRvZG9zDQotbWV0aG9kUGFja2FnZV90ZXh0X3BsdXJhbD1QYWNvdGVzIGRlIE1cdTAwZTl0b2RvDQotbWV0aG9kUGx1Z2luX3RleHRfcGx1cmFsPVBsdWctaW5zIGRlIE1cdTAwZTl0b2RvDQotbWlsZXN0b25lX3RleHRfcGx1cmFsPU1hcmNvcw0KLW91dGNvbWVfdGV4dF9wbHVyYWw9UmVzdWx0YWRvcw0KLXBoYXNlX3RleHRfcGx1cmFsPUZhc2VzDQotcHJhY3RpY2VfdGV4dF9wbHVyYWw9UHJcdTAwZTF0aWNhcw0KLXByb2Nlc3NfdGV4dF9wbHVyYWw9UHJvY2Vzc29zDQotcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0X3BsdXJhbD1Qcm9jZXNzb3MgRGlmZXJlbmNpYWlzDQotcHJvY2Vzc0ZhbWlseV90ZXh0X3BsdXJhbD0gICAgRmFtXHUwMGVkbGlhcyBkZSBQcm9jZXNzb3MNCi1wcm9jZXNzUGFja2FnZV90ZXh0X3BsdXJhbD1QYWNvdGVzIGRlIFByb2Nlc3NvDQotcmVwb3J0X3RleHRfcGx1cmFsPVJlbGF0XHUwMGYzcmlvcw0KLXJldXNhYmxlQXNzZXRfdGV4dF9wbHVyYWw9UmVjdXJzb3MgUmV1dGlsaXpcdTAwZTF2ZWlzDQotcm9hZG1hcF90ZXh0X3BsdXJhbD1NYXBhcyBkZSBSb3Rhcw0KLXJvbGVEZXNjcmlwdG9yX3RleHRfcGx1cmFsPURlc2NyaXRvcmVzIGRlIEZ1blx1MDBlN1x1MDBlM28NCi1yb2xlX3RleHRfcGx1cmFsPUZ1blx1MDBlN1x1MDBmNWVzDQotcm9sZVNldF90ZXh0X3BsdXJhbD1Db25qdW50b3MgZGUgRnVuXHUwMGU3XHUwMGY1ZXMNCi1yb2xlU2V0R3JvdXBpbmdfdGV4dF9wbHVyYWw9QWdydXBhbWVudG9zIGRlIENvbmp1bnRvIGRlIEZ1blx1MDBlN1x1MDBmNWVzDQotc3RhbmRhcmRDYXRlZ29yeV90ZXh0X3BsdXJhbD1DYXRlZ29yaWFzIFBhZHJcdTAwZTNvDQotc3RlcF90ZXh0X3BsdXJhbD1FdGFwYXMNCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dF9wbHVyYWw9TWF0ZXJpYWlzIGRlIFN1cG9ydGUNCi10YXNrX3RleHRfcGx1cmFsPVRhcmVmYXMNCi10YXNrRGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1EZXNjcml0b3JlcyBkZSBUYXJlZmENCi10ZWFtUHJvZmlsZV90ZXh0X3BsdXJhbD1QZXJmaXMgZGUgRXF1aXBlDQotdGVtcGxhdGVfdGV4dF9wbHVyYWw9R2FiYXJpdG9zDQotdGVybURlZmluaXRpb25fdGV4dF9wbHVyYWw9RGVmaW5pXHUwMGU3XHUwMGY1ZXMgZGUgVGVybW9zDQotdG9vbF90ZXh0X3BsdXJhbD1GZXJyYW1lbnRhcw0KLXRvb2xNZW50b3JfdGV4dF9wbHVyYWw9TWVudG9yZXMgZGUgRmVycmFtZW50YXMNCi13aGl0ZXBhcGVyX3RleHRfcGx1cmFsPVdoaXRlIHBhcGVycw0KLXdvcmtQcm9kdWN0X3RleHRfcGx1cmFsPVByb2R1dG9zICAgICAgICAgICBkZSBUcmFiYWxobw0KLXdvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1EZXNjcml0b3JlcyBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotd29ya1Byb2R1Y3RFbGVtZW50X3RleHRfcGx1cmFsPUVsZW1lbnRvcyBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotd29ya1Byb2R1Y3RUeXBlX3RleHRfcGx1cmFsPVRpcG9zIGRlIFByb2R1dG8gZGUgVHJhYmFsaG8NCi0NCi0jIEFwcGxpY2F0aW9uIHRpdGxlLg0KLWFwcGxpY2F0aW9uX3RpdGxlPXswfSAtIHsxfQ0KLQ0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBEaWFsb2cNCi1vcGVuTGlicmFyeURpYWxvZ190aXRsZT1BYnJpciBCaWJsaW90ZWNhIGRlIE1cdTAwZTl0b2Rvcw0KLW9wZW5MaWJyYXJ5RGlhbG9nQXJlYV90aXRsZT1TZWxlY2lvbmUgdW1hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zDQotb3BlbkxpYnJhcnlEaWFsb2dBcmVhX3RleHQ9TyB7MH0gYXJtYXplbmEgbVx1MDBlOXRvZG9zIGUgcHJvY2Vzc29zIGVtIHVtYSBwYXN0YSBjaGFtYWRhIFxudW1hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLiBTZWxlY2lvbmUgdW1hIHBhc3RhIGRlIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIHBhcmEgdXRpbGl6YXIgcGFyYSBlc3RhIHNlc3NcdTAwZTNvLg0KLWxpYnJhcnlMYWJlbF90ZXh0PUJpYmxpb3RlY2E6DQotYnJvd3NlQnV0dG9uX3RleHQ9UHJvY3VyYXIuLi4NCi1wcm9tcHRGb3JMaWJyYXJ5Q2hlY2tib3hfdGV4dD1VdGlsaXphciBlc3RhIGNvbW8gcGFkclx1MDBlM28gZSBuXHUwMGUzbyBwZXJndW50YXIgbm92YW1lbnRlLg0KLW9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dD1OXHUwMGUzbyBoXHUwMGUxIG5lbmh1bWEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZW0gJyd7MH0nJy5cblVtYSBub3ZhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIHNlclx1MDBlMSBjcmlhZGEgZSBhYmVydGEgcGFyYSB2b2NcdTAwZWEgbm8gZGlyZXRcdTAwZjNyaW8gZXNwZWNpZmljYWRvLlxuXG5DbGlxdWUgZW0gT0sgcGFyYSBwcm9zc2VndWlyIG91IENhbmNlbGFyIHBhcmEgZXNwZWNpZmljYXIgb3V0cm8gY2FtaW5obyBwYXJhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLg0KLQ0KLSMgU2VsZWN0IE1ldGhvZCBMaWJyYXJ5IEZvbGRlciBEaWFsb2cNCi1zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RpdGxlPVNlbGVjaW9uYXIgQmlibGlvdGVjYSBkZSBNXHUwMGU5dG9kb3MNCi1zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RleHQ9U2VsZWNpb25lIHVtYSBwYXN0YSBkZSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2Rvcy4NCi0NCi0jIE9wZW4gTGlicmFyeSBQcm9ncmVzcyBNZXNzYWdlDQotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9QWJyaW5kbyBhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLi4uDQotDQotIyBPcGVuIE1ldGhvZCBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLWludmFsaWRMaWJyYXJ5UGF0aF9tc2c9SVVQTDAzMDBFOiBOXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBhYnJpciBhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGVzcGVjaWZpY2FkYS4NCi1pbnZhbGlkTGlicmFyeVBhdGhfcmVhc29uPUEgcGFzdGEgZGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3Mgc2VsZWNpb25hZGEgXHUwMGU5IGludlx1MDBlMWxpZGEsIG5cdTAwZTNvIGV4aXN0ZSBvdSB2b2NcdTAwZWEgblx1MDBlM28gdGVtIGEgcGVybWlzc1x1MDBlM28gY29ycmV0YSBwYXJhIGFjZXNzXHUwMGUxLWxhLlxuXG5DbGlxdWUgZW0gT0sgcGFyYSBzZWxlY2lvbmFyIG91dHJhIHBhc3RhIGRlIGJpYmxpb3RlY2EuDQotDQotIyBMaWJyYXJ5IExvY2tlZCBFcnJvciBEaWFsb2cNCi1saWJyYXJ5TG9ja2VkX21zZz1JVVBMMDMwM0U6IE5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIGFicmlyIGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kbyBlc3BlY2lmaWNhZGEuXG5cbkEgYmlibGl0ZWNhIGRlIG1cdTAwZTl0b2RvIHNlbGVjaW9uYWRhIHBhcmVjZSBlc3RhciBzZW5kbyB1dGlsaXphZGEuIENsaXF1ZSBlbSBDYW5jZWxhciBwYXJhIHNlbGVjaW9uYXIgb3V0cmEgcGFzdGEgZGEgYmlibGlvdGVjYSBvdSBjbGlxdWUgZW0gRm9yXHUwMGU3YXIgQWJlcnR1cmEgc2UgZGVzZWphciBhYnJpciBhIGJpYmxpb3RlY2EgZGUgcXVhbHF1ZXIgbWFuZWlyYS5cblxuQVZJU086IEEgdXRpbGl6YVx1MDBlN1x1MDBlM28gc2ltdWx0XHUwMGUybmVhIGRlIHVtYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvIHBvZGUgY29ycm9tcGVyIGEgYmlibGlvdGVjYS4NCi1saWJyYXJ5TG9ja2VkX29wZW5CdXR0b25fdGV4dD1Gb3JcdTAwZTdhciBBYmVydHVyYQ0KLQ0KLSMgUmVhZC1vbmx5IFByb2plY3QgRmlsZSBFcnJvciBEaWFsb2cNCi1yZWFkT25seVByb2plY3RGaWxlX3RleHQ9SVVQTDAzMDJFOiAnJ3swfScnIFx1MDBlOSBkZSBsZWl0dXJhLiBUb3JuZS1vIGdyYXZcdTAwZTF2ZWwgYW50ZXMgZGUgY29udGludWFyLg0KLXJldHJ5QnV0dG9uX3RleHQ9UmVwZXRpcg0KLWNhbmNlbEJ1dHRvbl90ZXh0PUNhbmNlbGFyDQotDQotIyBWZXJzaW9uIE1pc21hdGNoIERpYWxvZw0KLXZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0PUlVUEwzMDVFOiBBIGJpYmxpb3RlY2Egc2VsZWNpb25hZGEgblx1MDBlM28gcG9kZSBzZXIgYWJlcnRhLiBWb2NcdTAwZWEgZGV2ZSBmYXplciBvIHVwZ3JhZGUgZGUgezB9IHBhcmEgYSB2ZXJzXHUwMGUzbyB7MX0gb3Ugc3VwZXJpb3IgcGFyYSBhYnJpciBlc3NhIGJpYmxpb3RlY2EuDQotdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHRfdW5rbm93bj1JVVBMMzA2RTogQSBiaWJsaW90ZWNhIHNlbGVjaW9uYWRhIG5cdTAwZTNvIHBvZGUgc2VyIGFiZXJ0YS4gVm9jXHUwMGVhIGRldmUgZmF6ZXIgbyB1cGdyYWRlIGRlIHswfSBwYXJhIHVtYSB2ZXJzXHUwMGUzbyBtYWlzIHJlY2VudGUgcGFyYSBhYnJpciBlc3NhIGJpYmxpb3RlY2EuDQotDQotIyBVcGdyYWRlIE1ldGhvZCBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPUZhemVyIFVwZ3JhZGUgZGUgQmlibGlvdGVjYSBkZSBNXHUwMGU5dG9kb3MNCi11cGdyYWRlTGlicmFyeURpYWxvZ190ZXh0PUEgYmlibGlvdGVjYSBzZWxlY2lvbmFkYSBwcmVjaXNhIHRlciB1cGdyYWRlIGZlaXRvIHBhcmEgYSBub3ZhIGVzdHJ1dHVyYSBkYSBiaWJsaW90ZWNhLlxuXG5EZXNlamEgcHJvc3NlZ3VpciBjb20gbyB1cGdyYWRlPw0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9RmF6ZW5kbyB1cGdyYWRlIGRhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLi4uDQotDQotIyBVcGdyYWRlIExpYnJhcnkgRXJyb3IgRGlhbG9nDQotdXBncmFkZUxpYnJhcnlFcnJvcl9tc2c9SVVQTDAzMDFFOiBOXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBmYXplciB1cGdyYWRlIGRhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zLiBDb25zdWx0ZSBvIGFycXVpdm8gZGUgcmVnaXN0cm8gcGFyYSBvYnRlciBkZXRhbGhlcyBhZGljaW9uYWlzLg0KLQ0KLSMgU3dpdGNoIENvbmZpZ3VyYXRpb24gRGlhbG9nDQotc3dpdGNoQ29uZmlnRGlhbG9nX3RpdGxlPUFsdGVybmFyIENvbmZpZ3VyYVx1MDBlN1x1MDBlM28NCi1zd2l0Y2hDb25maWdEaWFsb2dfdGV4dD1EZXNlamEgYWx0ZXJuYXIgYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIGF0dWFsIHBhcmEgYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHBhZHJcdTAwZTNvLCAnJ3swfScnLCBhc3NvY2lhZGEgYW8gcHJvY2Vzc28gc2VsZWNpb25hZG8/DQotCQ0KLSMgQ29uZmlndXJhdGlvbiBDb21ibw0KLWN1cnJlbnRDb25maWdMYWJlbF90ZXh0PUNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gYXR1YWw6DQotc2VsZWN0Q29uZmlnTGFiZWxfdGV4dD1TZWxlY2lvbmUgdW1hIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28NCi0NCi0jIERlbGV0ZSBGaWxlcyBDb25maXJtYXRpb24gTWVzc2FnZQ0KLWRlbGV0ZUZpbGVzQ29uZmlybWF0aW9uX21zZz1PIGNhbWluaG8gZXNwZWNpZmljYWRvICcnezB9Jycgalx1MDBlMSBleGlzdGUuIFRvZG9zIG9zIGFycXVpdm9zIG5hIHBhc3RhIHNlclx1MDBlM28gZXhjbHVcdTAwZWRkb3MuIERlc2VqYSBjb250aW51YXI/DQotDQotIyBQYXRocy9GaWxlcyBFcnJvciBNZXNzYWdlcw0KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPU8gY2FtaW5obyAnJ3swfScnIGNvbnRcdTAwZTltIHVtIG91IG1haXMgYXJxdWl2b3MgcXVlIG5cdTAwZTNvIHBvZGVtIHNlciBleGNsdVx1MDBlZGRvcy5cblxuU2VsZWNpb25lIG91dHJvIGNhbWluaG8gZSB0ZW50ZSBub3ZhbWVudGUuDQotY3JlYXRlUGF0aEVycm9yX3JlYXNvbj1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBjcmlhciBvIGNhbWluaG8gJyd7MH0nJy5cblxuU2VsZWNpb25lIG91dHJvIGNhbWluaG8gZSB0ZW50ZSBub3ZhbWVudGUuDQotaW52YWxpZFBhdGhfbXNnPU8gY2FtaW5obyBlc3BlY2lmaWNhZG8gblx1MDBlM28gXHUwMGU5IHZcdTAwZTFsaWRvLg0KLQ0KLSMgQmFja3VwIExpYnJhcnkgRGlhbG9nDQotYmFja3VwTGlicmFyeURpYWxvZ190aXRsZT1GYXplciBCYWNrdXAgZGEgQmlibGlvdGVjYQ0KLWJhY2t1cExpYnJhcnlEaWFsb2dfdGV4dD1cdTAwYzkgYWx0YW1lbnRlIHJlY29tZW5kXHUwMGUxdmVsIGZhemVyIGJhY2t1cCBkYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBhdHVhbCBhbnRlcyBkZSBwcm9zc2VndWlyLlxuXG5DbGlxdWUgZW0gT0sgcGFyYSBjcmlhciB1bWEgY1x1MDBmM3BpYSBkZSBiYWNrdXAgZGEgYmlibGlvdGVjYSBubyBkaXJldFx1MDBmM3JpbyBlc3BlY2lmaWNhZG8uIENsaXF1ZSBlbSBJZ25vcmFyIHBhcmEgY29udGludWFyIHNlbSBjcmlhciBvIGJhY2t1cC4NCi1iYWNraW5nVXBMaWJyYXJ5VGFza19uYW1lPUZhemVuZG8gdW1hIGNcdTAwZjNwaWEgZGUgYmFja3VwIGRvcyBhcnF1aXZvcyBkYSBiaWJsaW90ZWNhLi4uDQotDQotIyBQYXRoIFNlbGVjdGlvbiBEaWFsb2cNCi1wYXRoU2VsZWN0aW9uRXJyb3JfbXNnPU5cdTAwZTNvIGZvaSBwb3NzXHUwMGVkdmVsIGNyaWFyIG8gZGlyZXRcdTAwZjNyaW8NCi1va0J1dHRvbl90ZXh0PU9LDQotc2tpcEJ1dHRvbl90ZXh0PUlnbm9yYXINCi0NCi0jIFByb2Nlc3MgRWRpdG9yIHByZWZlcmVuY2VzDQotYWx3YXlzQnV0dG9uX3RleHQ9U2VtcHJlDQotbmV2ZXJCdXR0b25fdGV4dD1OdW5jYQ0KLXByb21wdEJ1dHRvbl90ZXh0PUF2aXNhcg0KLQ0KLSMgQWRkIExpbmsgRGlhbG9nDQotbGlua1RvVVJMX25hbWU9VVJMDQotbGlua1RvRmlsZV9uYW1lPUFycXVpdm8NCi1lbGVtZW50TGlua19uYW1lPUVsZW1lbnRvIGRlIE1cdTAwZTl0b2RvDQotZWxlbWVudExpbmtXaXRoVHlwZV9uYW1lPUVsZW1lbnRvIGRlIG1cdTAwZTl0b2RvIGNvbSBwcmVmaXhvIGRlIHRpcG8NCi1lbGVtZW50TGlua1dpdGhVc2VyVGV4dF9uYW1lPUVsZW1lbnRvIGRlIG1cdTAwZTl0b2RvIGNvbSB0ZXh0byBwZXJzb25hbGl6YWRvDQotDQotIyBDb252ZXJ0IEFjdGl2aXR5IFR5cGUgRGlhbG9nDQotY29udmVydEFjdGl2aXR5RGlhbG9nX3RpdGxlPUNvbnZlcnRlciBUaXBvIGRlIEF0aXZpZGFkZQ0KLWNvbnZlcnRBY3Rpdml0eURpYWxvZ190ZXh0PVNlbGVjaW9uYXIgbyB0aXBvIGRlIGF0aXZpZGFkZSBkZSBkZXN0aW5vLg0KLXVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX21zZz1JVVBMMDMwNEU6IEVzdGEgYXRpdmlkYWRlIG5cdTAwZTNvIHBvZGUgc2VyIGNvbnZlcnRpZGEgcGFyYSBvdXRybyB0aXBvLg0KLXVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX3JlYXNvbj1OXHUwMGUzbyBoXHUwMGUxIHRpcG8gZGUgYXRpdmlkYWRlIGNvbXBhdFx1MDBlZHZlbCBjb20gezB9Lg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGVjMWU2NS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBNZXRob2QgRWxlbWVudCBOYW1lcyAoU2luZ3VsYXIpDQotYWN0aXZpdHlfdGV4dD1cdTZkM2JcdTUyYTgNCi1hcnRpZmFjdF90ZXh0PVx1NWRlNVx1NGVmNg0KLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9XHU4MGZkXHU1MjliXHU2YTIxXHU1ZjBmDQotY2hlY2tsaXN0X3RleHQ9XHU2ODM4XHU1YmY5XHU4ODY4DQotY2hlY2tJdGVtX3RleHQ9XHU2OGMwXHU2N2U1XHU5ODc5DQotY29tcG9zaXRlUm9sZV90ZXh0PVx1N2VjNFx1NTQwOFx1ODlkMlx1ODI3Mg0KLWNvbmNlcHRfdGV4dD1cdTY5ODJcdTVmZjUNCi1jb250ZW50UGFja2FnZV90ZXh0PVx1NTE4NVx1NWJiOVx1NTMwNQ0KLWN1c3RvbUNhdGVnb3J5X3RleHQ9XHU1YjlhXHU1MjM2XHU3YzdiXHU1MjJiDQotZGVsaXZlcmFibGVfdGV4dD1cdTUzZWZcdTRlYTRcdTRlZDhcdTRlZjYNCi1kZWxpdmVyeVByb2Nlc3NfdGV4dD1cdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGINCi1kZXNjcmlwdG9yX3RleHQ9XHU2M2NmXHU4ZmYwXHU3YjI2DQotZGlzY2lwbGluZV90ZXh0PVx1ODljNFx1N2EwYg0KLWRpc2NpcGxpbmVHcm91cGluZ190ZXh0PVx1ODljNFx1N2EwYlx1NTIwNlx1N2VjNA0KLWRvbWFpbl90ZXh0PVx1NTdkZg0KLWVzdGltYXRlX3RleHQ9XHU0ZjMwXHU3Yjk3DQotZXN0aW1hdGluZ01ldHJpY190ZXh0PVx1NGYzMFx1N2I5N1x1NWVhNlx1OTFjZlx1NTAzYw0KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0PVx1NGYzMFx1N2I5N1x1NmNlOFx1NjEwZlx1NGU4Ylx1OTg3OQ0KLWV4YW1wbGVfdGV4dD1cdTc5M2FcdTRmOGINCi1ndWlkYW5jZV90ZXh0PVx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zg0KLWd1aWRlbGluZV90ZXh0PVx1NjMwN1x1NTM1Nw0KLWl0ZXJhdGlvbl90ZXh0PVx1OGZlZFx1NGVlMw0KLW1ldGhvZENvbmZpZ3VyYXRpb25fdGV4dD1cdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmUNCi1tZXRob2RDb250ZW50X3RleHQ9XHU2NWI5XHU2Y2Q1XHU1MTg1XHU1YmI5DQotbWV0aG9kTGlicmFyeV90ZXh0PVx1NjViOVx1NmNkNVx1NWU5Mw0KLW1ldGhvZFBhY2thZ2VfdGV4dD1cdTY1YjlcdTZjZDVcdTUzMDUNCi1tZXRob2RQbHVnaW5fdGV4dD1cdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjYNCi1taWxlc3RvbmVfdGV4dD1cdTkxY2NcdTdhMGJcdTc4OTENCi1vdXRjb21lX3RleHQ9XHU3ZWQzXHU2NzljDQotcGhhc2VfdGV4dD1cdTk2MzZcdTZiYjUNCi1wcmFjdGljZV90ZXh0PVx1NWI5ZVx1OGRmNQ0KLXByb2Nlc3NfdGV4dD1cdTZkNDFcdTdhMGINCi1wcm9jZXNzQ29udHJpYnV0aW9uX3RleHQ9XHU1ZGVlXHU1ZjAyXHU1MzE2XHU4ZmM3XHU3YTBiDQotcHJvY2Vzc0ZhbWlseV90ZXh0PVx1NmQ0MVx1N2EwYlx1N2NmYlx1NTIxNw0KLXByb2Nlc3NQYWNrYWdlX3RleHQ9XHU2ZDQxXHU3YTBiXHU1MzA1DQotcmVwb3J0X3RleHQ9XHU2MmE1XHU1NDRhDQotcmV1c2FibGVBc3NldF90ZXh0PVx1NTNlZlx1OTFjZFx1NzUyOFx1OGQ0NFx1NGVhNw0KLXJvYWRtYXBfdGV4dD1cdThkZWZcdTdlYmZcdTU2ZmUNCi1yb2xlRGVzY3JpcHRvcl90ZXh0PVx1ODlkMlx1ODI3Mlx1NjNjZlx1OGZmMFx1N2IyNg0KLXJvbGVfdGV4dD1cdTg5ZDJcdTgyNzINCi1yb2xlU2V0X3RleHQ9XHU4OWQyXHU4MjcyXHU5NmM2DQotcm9sZVNldEdyb3VwaW5nX3RleHQ9XHU4OWQyXHU4MjcyXHU5NmM2XHU1MjA2XHU3ZWM0DQotc3RhbmRhcmRDYXRlZ29yeV90ZXh0PVx1NjgwN1x1NTFjNlx1N2M3Ylx1NTIyYg0KLXN0ZXBfdGV4dD1cdTZiNjVcdTlhYTQNCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dD1cdTY1MmZcdTYzMDFcdTY3NTBcdTY1OTkNCi10YXNrX3RleHQ9XHU0ZWZiXHU1MmExDQotdGFza0Rlc2NyaXB0b3JfdGV4dD1cdTRlZmJcdTUyYTFcdTYzY2ZcdThmZjBcdTdiMjYNCi10ZWFtUHJvZmlsZV90ZXh0PVx1NTZlMlx1OTYxZlx1Njk4Mlx1ODk4MVx1NjU4N1x1NGVmNg0KLXRlbXBsYXRlX3RleHQ9XHU2YTIxXHU2NzdmDQotdGVybURlZmluaXRpb25fdGV4dD1cdTY3MmZcdThiZWRcdTViOWFcdTRlNDkNCi10b29sX3RleHQ9XHU1ZGU1XHU1MTc3DQotdG9vbE1lbnRvcl90ZXh0PVx1NWRlNVx1NTE3N1x1NTQxMVx1NWJmYw0KLXdoaXRlcGFwZXJfdGV4dD1cdTc2N2RcdTc2YWVcdTRlNjYNCi13b3JrUHJvZHVjdF90ZXh0PVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMQ0KLXdvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0PVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NjNjZlx1OGZmMFx1N2IyNg0KLXdvcmtQcm9kdWN0RWxlbWVudF90ZXh0PVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NTE0M1x1N2QyMA0KLXdvcmtQcm9kdWN0VHlwZV90ZXh0PVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1N2M3Ylx1NTc4Yg0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgTmFtZXMgKFBsdXJhbCkNCi1hY3Rpdml0eV90ZXh0X3BsdXJhbD1cdTZkM2JcdTUyYTgNCi1hcnRpZmFjdF90ZXh0X3BsdXJhbD1cdTVkZTVcdTRlZjYNCi1jYXBhYmlsaXR5UGF0dGVybl90ZXh0X3BsdXJhbD1cdTgwZmRcdTUyOWJcdTZhMjFcdTVmMGYNCi1jaGVja2xpc3RfdGV4dF9wbHVyYWw9XHU2ODM4XHU1YmY5XHU4ODY4DQotY2hlY2tJdGVtX3RleHRfcGx1cmFsPVx1NjhjMFx1NjdlNVx1OTg3OQ0KLWNvbXBvc2l0ZVJvbGVfdGV4dF9wbHVyYWw9XHU3ZWM0XHU1NDA4XHU4OWQyXHU4MjcyDQotY29uY2VwdF90ZXh0X3BsdXJhbD1cdTY5ODJcdTVmZjUNCi1jb250ZW50UGFja2FnZV90ZXh0X3BsdXJhbD1cdTUxODVcdTViYjlcdTUzMDUNCi1jdXN0b21DYXRlZ29yeV90ZXh0X3BsdXJhbD1cdTViOWFcdTUyMzZcdTdjN2JcdTUyMmINCi1kZWxpdmVyYWJsZV90ZXh0X3BsdXJhbD1cdTUzZWZcdTRlYTRcdTRlZDhcdTRlZjYNCi1kZWxpdmVyeVByb2Nlc3NfdGV4dF9wbHVyYWw9XHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiDQotZGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1cdTYzY2ZcdThmZjBcdTdiMjYNCi1kaXNjaXBsaW5lX3RleHRfcGx1cmFsPVx1ODljNFx1N2EwYg0KLWRpc2NpcGxpbmVHcm91cGluZ190ZXh0X3BsdXJhbD1cdTg5YzRcdTdhMGJcdTUyMDZcdTdlYzQNCi1kb21haW5fdGV4dF9wbHVyYWw9XHU1N2RmDQotZXN0aW1hdGVfdGV4dF9wbHVyYWw9XHU0ZjMwXHU3Yjk3DQotZXN0aW1hdGluZ01ldHJpY190ZXh0X3BsdXJhbD1cdTRmMzBcdTdiOTdcdTVlYTZcdTkxY2YNCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dF9wbHVyYWw9XHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5DQotZXhhbXBsZV90ZXh0X3BsdXJhbD1cdTc5M2FcdTRmOGINCi1ndWlkYW5jZV90ZXh0X3BsdXJhbD1cdTYzMDdcdTViZmNcdTRmZTFcdTYwNmYNCi1ndWlkZWxpbmVfdGV4dF9wbHVyYWw9XHU2MzA3XHU1MzU3DQotaXRlcmF0aW9uX3RleHRfcGx1cmFsPVx1OGZlZFx1NGVlMw0KLW1ldGhvZENvbmZpZ3VyYXRpb25fdGV4dF9wbHVyYWw9XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotbWV0aG9kQ29udGVudF90ZXh0X3BsdXJhbD1cdTY1YjlcdTZjZDVcdTUxODVcdTViYjkNCi1tZXRob2RMaWJyYXJ5X3RleHRfcGx1cmFsPVx1NjViOVx1NmNkNVx1NWU5Mw0KLW1ldGhvZFBhY2thZ2VfdGV4dF9wbHVyYWw9XHU2NWI5XHU2Y2Q1XHU1MzA1DQotbWV0aG9kUGx1Z2luX3RleHRfcGx1cmFsPVx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNg0KLW1pbGVzdG9uZV90ZXh0X3BsdXJhbD1cdTkxY2NcdTdhMGJcdTc4OTENCi1vdXRjb21lX3RleHRfcGx1cmFsPVx1N2VkM1x1Njc5Yw0KLXBoYXNlX3RleHRfcGx1cmFsPVx1OTYzNlx1NmJiNQ0KLXByYWN0aWNlX3RleHRfcGx1cmFsPVx1NWI5ZVx1OGRmNQ0KLXByb2Nlc3NfdGV4dF9wbHVyYWw9XHU2ZDQxXHU3YTBiDQotcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0X3BsdXJhbD1cdTVkZWVcdTVmMDJcdTUzMTZcdThmYzdcdTdhMGINCi1wcm9jZXNzRmFtaWx5X3RleHRfcGx1cmFsPVx1NmQ0MVx1N2EwYlx1N2NmYlx1NTIxNw0KLXByb2Nlc3NQYWNrYWdlX3RleHRfcGx1cmFsPVx1NmQ0MVx1N2EwYlx1NTMwNQ0KLXJlcG9ydF90ZXh0X3BsdXJhbD1cdTYyYTVcdTU0NGENCi1yZXVzYWJsZUFzc2V0X3RleHRfcGx1cmFsPVx1NTNlZlx1OTFjZFx1NzUyOFx1OGQ0NFx1NGVhNw0KLXJvYWRtYXBfdGV4dF9wbHVyYWw9XHU4ZGVmXHU3ZWJmXHU1NmZlDQotcm9sZURlc2NyaXB0b3JfdGV4dF9wbHVyYWw9XHU4OWQyXHU4MjcyXHU2M2NmXHU4ZmYwXHU3YjI2DQotcm9sZV90ZXh0X3BsdXJhbD1cdTg5ZDJcdTgyNzINCi1yb2xlU2V0X3RleHRfcGx1cmFsPVx1ODlkMlx1ODI3Mlx1OTZjNg0KLXJvbGVTZXRHcm91cGluZ190ZXh0X3BsdXJhbD1cdTg5ZDJcdTgyNzJcdTk2YzZcdTUyMDZcdTdlYzQNCi1zdGFuZGFyZENhdGVnb3J5X3RleHRfcGx1cmFsPVx1NjgwN1x1NTFjNlx1N2M3Ylx1NTIyYg0KLXN0ZXBfdGV4dF9wbHVyYWw9XHU2YjY1XHU5YWE0DQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHRfcGx1cmFsPVx1NjUyZlx1NjMwMVx1Njc1MFx1NjU5OQ0KLXRhc2tfdGV4dF9wbHVyYWw9XHU0ZWZiXHU1MmExDQotdGFza0Rlc2NyaXB0b3JfdGV4dF9wbHVyYWw9XHU0ZWZiXHU1MmExXHU2M2NmXHU4ZmYwXHU3YjI2DQotdGVhbVByb2ZpbGVfdGV4dF9wbHVyYWw9XHU1NmUyXHU5NjFmXHU2OTgyXHU4OTgxXHU2NTg3XHU0ZWY2DQotdGVtcGxhdGVfdGV4dF9wbHVyYWw9XHU2YTIxXHU2NzdmDQotdGVybURlZmluaXRpb25fdGV4dF9wbHVyYWw9XHU2NzJmXHU4YmVkXHU1YjlhXHU0ZTQ5DQotdG9vbF90ZXh0X3BsdXJhbD1cdTVkZTVcdTUxNzcNCi10b29sTWVudG9yX3RleHRfcGx1cmFsPVx1NWRlNVx1NTE3N1x1NTQxMVx1NWJmYw0KLXdoaXRlcGFwZXJfdGV4dF9wbHVyYWw9XHU3NjdkXHU3NmFlXHU0ZTY2DQotd29ya1Byb2R1Y3RfdGV4dF9wbHVyYWw9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHRfcGx1cmFsPVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMVx1NjNjZlx1OGZmMFx1N2IyNg0KLXdvcmtQcm9kdWN0RWxlbWVudF90ZXh0X3BsdXJhbD1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTUxNDNcdTdkMjANCi13b3JrUHJvZHVjdFR5cGVfdGV4dF9wbHVyYWw9XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxXHU3YzdiXHU1NzhiDQotDQotIyBBcHBsaWNhdGlvbiB0aXRsZS4NCi1hcHBsaWNhdGlvbl90aXRsZT17MH0gXHVmZjBkIHsxfQ0KLQ0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBEaWFsb2cNCi1vcGVuTGlicmFyeURpYWxvZ190aXRsZT1cdTYyNTNcdTVmMDBcdTY1YjlcdTZjZDVcdTVlOTMNCi1vcGVuTGlicmFyeURpYWxvZ0FyZWFfdGl0bGU9XHU5MDA5XHU2MmU5XHU2NWI5XHU2Y2Q1XHU1ZTkzDQotb3BlbkxpYnJhcnlEaWFsb2dBcmVhX3RleHQ9ezB9IFx1NWMwNlx1NjViOVx1NmNkNVx1NTQ4Y1x1NmQ0MVx1N2EwYlx1NWI1OFx1NTBhOFx1NTcyOFx1NzlmMFx1NGUzYVx1NjViOVx1NmNkNVx1NWU5M1x1NzY4NFxuXHU2NTg3XHU0ZWY2XHU1OTM5XHU0ZTJkXHUzMDAyXHU4YmY3XHU5MDA5XHU2MmU5XHU3NTI4XHU0ZThlXHU2YjY0XHU0ZjFhXHU4YmRkXHU3Njg0XHU2NWI5XHU2Y2Q1XHU1ZTkzXHU2NTg3XHU0ZWY2XHU1OTM5XHUzMDAyDQotbGlicmFyeUxhYmVsX3RleHQ9XHU1ZTkzXHVmZjFhDQotYnJvd3NlQnV0dG9uX3RleHQ9XHU2ZDRmXHU4OWM4Li4uDQotcHJvbXB0Rm9yTGlicmFyeUNoZWNrYm94X3RleHQ9XHU0ZjdmXHU3NTI4XHU1YjgzXHU0ZjVjXHU0ZTNhXHU3ZjNhXHU3NzAxXHU1MDNjXHVmZjBjXHU0ZWU1XHU1NDBlXHU0ZTBkXHU4OTgxXHU1MThkXHU4YmUyXHU5NWVlXHUzMDAyDQotb3BlbkxpYnJhcnlEaWFsb2dfbmV3TGlicmFyeV90ZXh0PVx1MjAxY3swfVx1MjAxZFx1NGUyZFx1NmNhMVx1NjcwOVx1NjViOVx1NmNkNVx1NWU5M1x1MzAwMlxuXHU1YzA2XHU1NzI4XHU2MzA3XHU1YjlhXHU3NmVlXHU1ZjU1XHU0ZTNhXHU2MGE4XHU1MjFiXHU1ZWZhXHU1ZTc2XHU2MjUzXHU1ZjAwXHU2NWIwXHU2NWI5XHU2Y2Q1XHU1ZTkzXHUzMDAyXG5cblx1NTM1NVx1NTFmYlx1MjAxY1x1Nzg2ZVx1NWI5YVx1MjAxZFx1N2VlN1x1N2VlZFx1ZmYwY1x1NjIxNlx1NTM1NVx1NTFmYlx1MjAxY1x1NTNkNlx1NmQ4OFx1MjAxZFx1NjMwN1x1NWI5YVx1NTNlNlx1NGUwMFx1NGUyYVx1NjViOVx1NmNkNVx1NWU5M1x1OGRlZlx1NWY4NFx1MzAwMg0KLQ0KLSMgU2VsZWN0IE1ldGhvZCBMaWJyYXJ5IEZvbGRlciBEaWFsb2cNCi1zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RpdGxlPVx1OTAwOVx1NjJlOVx1NjViOVx1NmNkNVx1NWU5Mw0KLXNlbGVjdExpYnJhcnlGb2xkZXJEaWFsb2dfdGV4dD1cdTkwMDlcdTYyZTlcdTY1YjlcdTZjZDVcdTVlOTNcdTY1ODdcdTRlZjZcdTU5MzlcdTMwMDINCi0NCi0jIE9wZW4gTGlicmFyeSBQcm9ncmVzcyBNZXNzYWdlDQotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU2MjUzXHU1ZjAwXHU2NWI5XHU2Y2Q1XHU1ZTkzLi4uDQotDQotIyBPcGVuIE1ldGhvZCBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLWludmFsaWRMaWJyYXJ5UGF0aF9tc2c9SVVQTDAzMDBFOiBcdTY1ZTBcdTZjZDVcdTYyNTNcdTVmMDBcdTYzMDdcdTViOWFcdTc2ODRcdTY1YjlcdTZjZDVcdTVlOTNcdTMwMDINCi1pbnZhbGlkTGlicmFyeVBhdGhfcmVhc29uPVx1OTAwOVx1NWI5YVx1NzY4NFx1NjViOVx1NmNkNVx1NWU5M1x1NjU4N1x1NGVmNlx1NTkzOVx1NjVlMFx1NjU0OFx1MzAwMVx1NGUwZFx1NWI1OFx1NTcyOFx1NjIxNlx1NjBhOFx1NmNhMVx1NjcwOVx1OTAwMlx1NWY1M1x1NzY4NFx1OGJiOFx1NTNlZlx1Njc0M1x1OGJiZlx1OTVlZVx1NmI2NFx1NjViOVx1NmNkNVx1NWU5M1x1NjU4N1x1NGVmNlx1NTkzOVx1MzAwMlxuXG5cdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdTc4NmVcdTViOWFcdTIwMWRcdWZmMGNcdTkwMDlcdTYyZTlcdTUzZTZcdTRlMDBcdTRlMmFcdTVlOTNcdTY1ODdcdTRlZjZcdTU5MzlcdTMwMDINCi0NCi0jIExpYnJhcnkgTG9ja2VkIEVycm9yIERpYWxvZw0KLWxpYnJhcnlMb2NrZWRfbXNnPUlVUEwwMzAzRTogXHU2NWUwXHU2Y2Q1XHU2MjUzXHU1ZjAwXHU2MzA3XHU1YjlhXHU3Njg0XHU2NWI5XHU2Y2Q1XHU1ZTkzXHUzMDAyXG5cblx1NGYzY1x1NGU0ZVx1NmI2M1x1NTcyOFx1NGY3Zlx1NzUyOFx1OTAwOVx1NWI5YVx1NzY4NFx1NjViOVx1NmNkNVx1NWU5M1x1MzAwMlx1NTM1NVx1NTFmYlx1MjAxY1x1NTNkNlx1NmQ4OFx1MjAxZFx1OTAwOVx1NjJlOVx1NTNlNlx1NGUwMFx1NGUyYVx1NWU5M1x1NjU4N1x1NGVmNlx1NTkzOVx1ZmYwY1x1NjIxNlx1NTM1NVx1NTFmYlx1MjAxY1x1NWYzYVx1NTIzNlx1NjI1M1x1NWYwMFx1MjAxZFx1ZmYwY1x1OGZkOVx1NjgzN1x1NjVlMFx1OGJiYVx1NTk4Mlx1NGY1NVx1OTBmZFx1NjI1M1x1NWYwMFx1NWU5M1x1MzAwMlxuXG5cdThiNjZcdTU0NGFcdWZmMWFcdTVlNzZcdTg4NGNcdTRmN2ZcdTc1MjhcdTY1YjlcdTZjZDVcdTVlOTNcdTUzZWZcdTgwZmRcdTRmMWFcdTYzNWZcdTU3NGZcdThiZTVcdTVlOTNcdTMwMDINCi1saWJyYXJ5TG9ja2VkX29wZW5CdXR0b25fdGV4dD1cdTVmM2FcdTUyMzZcdTYyNTNcdTVmMDANCi0NCi0jIFJlYWQtb25seSBQcm9qZWN0IEZpbGUgRXJyb3IgRGlhbG9nDQotcmVhZE9ubHlQcm9qZWN0RmlsZV90ZXh0PUlVUEwwMzAyRTogXHUyMDFjezB9XHUyMDFkXHU0ZTNhXHU1M2VhXHU4YmZiXHUzMDAyXHU4YmY3XHU1YzA2XHU1YjgzXHU4YmJlXHU0ZTNhXHU1M2VmXHU1MTk5XHVmZjBjXHU3MTM2XHU1NDBlXHU1MThkXHU3ZWU3XHU3ZWVkXHUzMDAyDQotcmV0cnlCdXR0b25fdGV4dD1cdTkxY2RcdThiZDUNCi1jYW5jZWxCdXR0b25fdGV4dD1cdTUzZDZcdTZkODgNCi0NCi0jIFZlcnNpb24gTWlzbWF0Y2ggRGlhbG9nDQotdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHQ9SVVQTDMwNUU6IFx1NjVlMFx1NmNkNVx1NjI1M1x1NWYwMFx1OTAwOVx1NWI5YVx1NzY4NFx1NWU5M1x1MzAwMlx1NWZjNVx1OTg3Ylx1NWMwNiB7MH0gXHU1MzQ3XHU3ZWE3XHU1MjMwIFZ7MX0gXHU2MjE2XHU2NmY0XHU5YWQ4XHU3MjQ4XHU2NzJjXHU2MjRkXHU4MGZkXHU2MjUzXHU1ZjAwXHU4YmU1XHU1ZTkzXHUzMDAyDQotdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHRfdW5rbm93bj1JVVBMMzA2RVx1ZmYxYVx1NjVlMFx1NmNkNVx1NjI1M1x1NWYwMFx1OTAwOVx1NWI5YVx1NzY4NFx1NWU5M1x1MzAwMlx1NWZjNVx1OTg3Ylx1NWMwNiB7MH0gXHU1MzQ3XHU3ZWE3XHU1MjMwXHU2NmY0XHU5YWQ4XHU3MjQ4XHU2NzJjXHU2MjRkXHU4MGZkXHU2MjUzXHU1ZjAwXHU4YmU1XHU1ZTkzXHUzMDAyDQotDQotIyBVcGdyYWRlIE1ldGhvZCBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPVx1NTM0N1x1N2VhN1x1NjViOVx1NmNkNVx1NWU5Mw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RleHQ9XHU2MGE4XHU5MDA5XHU1YjlhXHU3Njg0XHU1ZTkzXHU5NzAwXHU4OTgxXHU1MzQ3XHU3ZWE3XHU1MjMwXHU2NWIwXHU3Njg0XHU1ZTkzXHU3ZWQzXHU2Nzg0XHUzMDAyXG5cblx1ODk4MVx1N2VlN1x1N2VlZFx1NTM0N1x1N2VhN1x1NTQxN1x1ZmYxZg0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU1MzQ3XHU3ZWE3XHU2NWI5XHU2Y2Q1XHU1ZTkzLi4uDQotDQotIyBVcGdyYWRlIExpYnJhcnkgRXJyb3IgRGlhbG9nDQotdXBncmFkZUxpYnJhcnlFcnJvcl9tc2c9SVVQTDAzMDFFOiBcdTY3MmFcdTgwZmRcdTUzNDdcdTdlYTdcdTY1YjlcdTZjZDVcdTVlOTNcdTMwMDJcdThiZjdcdTUzYzJcdTk2MDVcdTY1ZTVcdTVmZDdcdTY1ODdcdTRlZjZcdWZmMGNcdTgzYjdcdTUzZDZcdTY2ZjRcdTU5MWFcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTMwMDINCi0NCi0jIFN3aXRjaCBDb25maWd1cmF0aW9uIERpYWxvZw0KLXN3aXRjaENvbmZpZ0RpYWxvZ190aXRsZT1cdTUyMDdcdTYzNjJcdTkxNGRcdTdmNmUNCi1zd2l0Y2hDb25maWdEaWFsb2dfdGV4dD1cdTY2MmZcdTU0MjZcdTg5ODFcdTVjMDZcdTVmNTNcdTUyNGRcdTkxNGRcdTdmNmVcdTUyMDdcdTYzNjJcdTRlM2FcdTRlMGVcdTkwMDlcdTViOWFcdTZkNDFcdTdhMGJcdTUxNzNcdTgwNTRcdTc2ODRcdTdmM2FcdTc3MDFcdTkxNGRcdTdmNmVcdTIwMWN7MH1cdTIwMWRcdWZmMWYNCi0JDQotIyBDb25maWd1cmF0aW9uIENvbWJvDQotY3VycmVudENvbmZpZ0xhYmVsX3RleHQ9XHU1ZjUzXHU1MjRkXHU5MTRkXHU3ZjZlXHVmZjFhDQotc2VsZWN0Q29uZmlnTGFiZWxfdGV4dD1cdTkwMDlcdTYyZTlcdTkxNGRcdTdmNmUNCi0NCi0jIERlbGV0ZSBGaWxlcyBDb25maXJtYXRpb24gTWVzc2FnZQ0KLWRlbGV0ZUZpbGVzQ29uZmlybWF0aW9uX21zZz1cdTYzMDdcdTViOWFcdThkZWZcdTVmODRcdTIwMWN7MH1cdTIwMWRcdTVkZjJcdTViNThcdTU3MjhcdTMwMDJcdTVjMDZcdTUyMjBcdTk2NjRcdThiZTVcdTY1ODdcdTRlZjZcdTU5MzlcdTRlMmRcdTc2ODRcdTYyNDBcdTY3MDlcdTY1ODdcdTRlZjZcdTMwMDJcdTY2MmZcdTU0MjZcdTg5ODFcdTdlZTdcdTdlZWRcdWZmMWYNCi0NCi0jIFBhdGhzL0ZpbGVzIEVycm9yIE1lc3NhZ2VzDQotZGVsZXRlRmlsZXNFcnJvcl9yZWFzb249XHU4ZGVmXHU1Zjg0XHUyMDFjezB9XHUyMDFkXHU1MzA1XHU1NDJiXHU0ZTAwXHU0ZTJhXHU2MjE2XHU1OTFhXHU0ZTJhXHU2NWUwXHU2Y2Q1XHU1MjIwXHU5NjY0XHU3Njg0XHU2NTg3XHU0ZWY2XHUzMDAyXG5cblx1OGJmN1x1OTAwOVx1NjJlOVx1NTNlNlx1NGUwMFx1NGUyYVx1OGRlZlx1NWY4NFx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNVx1MzAwMg0KLWNyZWF0ZVBhdGhFcnJvcl9yZWFzb249XHU2NWUwXHU2Y2Q1XHU1MjFiXHU1ZWZhXHU4ZGVmXHU1Zjg0XHUyMDFjezB9XHUyMDFkXHUzMDAyXG5cblx1OGJmN1x1OTAwOVx1NjJlOVx1NTNlNlx1NGUwMFx1NGUyYVx1OGRlZlx1NWY4NFx1ZmYwY1x1NzEzNlx1NTQwZVx1OTFjZFx1OGJkNVx1MzAwMg0KLWludmFsaWRQYXRoX21zZz1cdTYzMDdcdTViOWFcdThkZWZcdTVmODRcdTY1ZTBcdTY1NDhcdTMwMDINCi0NCi0jIEJhY2t1cCBMaWJyYXJ5IERpYWxvZw0KLWJhY2t1cExpYnJhcnlEaWFsb2dfdGl0bGU9XHU1OTA3XHU0ZWZkXHU1ZTkzDQotYmFja3VwTGlicmFyeURpYWxvZ190ZXh0PVx1NWYzYVx1NzBjOFx1NWVmYVx1OGJhZVx1NTcyOFx1N2VlN1x1N2VlZFx1NjRjZFx1NGY1Y1x1NGU0Ylx1NTI0ZFx1NTkwN1x1NGVmZFx1NWY1M1x1NTI0ZFx1NjViOVx1NmNkNVx1NWU5M1x1MzAwMlxuXG5cdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdTc4NmVcdTViOWFcdTIwMWRcdWZmMGNcdTU3MjhcdTYzMDdcdTViOWFcdTc2ZWVcdTVmNTVcdTRlMmRcdTUyMWJcdTVlZmFcdTVlOTNcdTc2ODRcdTU5MDdcdTRlZmRcdTUyNmZcdTY3MmNcdTMwMDJcdTUzNTVcdTUxZmJcdTIwMWNcdThkZjNcdThmYzdcdTIwMWRcdTUzZWZcdTdlZTdcdTdlZWRcdTY0Y2RcdTRmNWNcdWZmMGNcdTgwMGNcdTRlMGRcdTUyMWJcdTVlZmFcdTU5MDdcdTRlZmRcdTMwMDINCi1iYWNraW5nVXBMaWJyYXJ5VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NWVmYVx1N2FjYlx1NWU5M1x1NjU4N1x1NGVmNlx1NzY4NFx1NTkwN1x1NGVmZFx1NTI2Zlx1NjcyYyAuLi4NCi0NCi0jIFBhdGggU2VsZWN0aW9uIERpYWxvZw0KLXBhdGhTZWxlY3Rpb25FcnJvcl9tc2c9XHU2NWUwXHU2Y2Q1XHU1MjFiXHU1ZWZhXHU3NmVlXHU1ZjU1DQotb2tCdXR0b25fdGV4dD1cdTc4NmVcdTViOWENCi1za2lwQnV0dG9uX3RleHQ9XHU4ZGYzXHU4ZmM3DQotDQotIyBQcm9jZXNzIEVkaXRvciBwcmVmZXJlbmNlcw0KLWFsd2F5c0J1dHRvbl90ZXh0PVx1NTljYlx1N2VjOA0KLW5ldmVyQnV0dG9uX3RleHQ9XHU0ZWNlXHU0ZTBkDQotcHJvbXB0QnV0dG9uX3RleHQ9XHU2M2QwXHU3OTNhDQotDQotIyBBZGQgTGluayBEaWFsb2cNCi1saW5rVG9VUkxfbmFtZT1VUkwNCi1saW5rVG9GaWxlX25hbWU9XHU2NTg3XHU0ZWY2DQotZWxlbWVudExpbmtfbmFtZT1cdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjANCi1lbGVtZW50TGlua1dpdGhUeXBlX25hbWU9XHU1ZTI2XHU2NzA5XHU3YzdiXHU1NzhiXHU1MjRkXHU3ZjAwXHU3Njg0XHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwDQotZWxlbWVudExpbmtXaXRoVXNlclRleHRfbmFtZT1cdTVlMjZcdTY3MDlcdTViOWFcdTUyMzZcdTY1ODdcdTY3MmNcdTc2ODRcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjANCi0NCi0jIENvbnZlcnQgQWN0aXZpdHkgVHlwZSBEaWFsb2cNCi1jb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGl0bGU9XHU4ZjZjXHU2MzYyXHU2ZDNiXHU1MmE4XHU3YzdiXHU1NzhiDQotY29udmVydEFjdGl2aXR5RGlhbG9nX3RleHQ9XHU5MDA5XHU2MmU5XHU3NmVlXHU2ODA3XHU2ZDNiXHU1MmE4XHU3YzdiXHU1NzhiXHUzMDAyDQotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfbXNnPUlVUEwwMzA0RTogXHU2NWUwXHU2Y2Q1XHU1YzA2XHU2YjY0XHU2ZDNiXHU1MmE4XHU4ZjZjXHU2MzYyXHU0ZTNhXHU1M2U2XHU0ZTAwXHU3OWNkXHU3YzdiXHU1NzhiXHUzMDAyDQotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfcmVhc29uPXswfSBcdTZjYTFcdTY3MDlcdTUxN2NcdTViYjlcdTc2ODRcdTZkM2JcdTUyYThcdTdjN2JcdTU3OGJcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ0ZDRhYWYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgTmFtZXMgKFNpbmd1bGFyKQ0KLWFjdGl2aXR5X3RleHQ9XHU2ZDNiXHU1MmQ1DQotYXJ0aWZhY3RfdGV4dD1cdTY5Y2JcdTRlZjYNCi1jYXBhYmlsaXR5UGF0dGVybl90ZXh0PVx1NTI5Zlx1ODBmZFx1NTc4Ylx1NmEyMw0KLWNoZWNrbGlzdF90ZXh0PVx1NjgzOFx1NWMwZFx1NmUwNVx1NTVhZQ0KLWNoZWNrSXRlbV90ZXh0PVx1NmFhMlx1NjdlNVx1OTgwNVx1NzZlZQ0KLWNvbXBvc2l0ZVJvbGVfdGV4dD1cdTg5MDdcdTU0MDhcdTg5ZDJcdTgyNzINCi1jb25jZXB0X3RleHQ9XHU2OTgyXHU1ZmY1DQotY29udGVudFBhY2thZ2VfdGV4dD1cdTUxNjdcdTViYjlcdTU5NTdcdTRlZjYNCi1jdXN0b21DYXRlZ29yeV90ZXh0PVx1ODFlYVx1OGEwMlx1N2EyZVx1OTg1ZQ0KLWRlbGl2ZXJhYmxlX3RleHQ9XHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlDQotZGVsaXZlcnlQcm9jZXNzX3RleHQ9XHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiDQotZGVzY3JpcHRvcl90ZXh0PVx1NjNjZlx1OGZmMFx1NWI1MA0KLWRpc2NpcGxpbmVfdGV4dD1cdTg5OGZcdTdiYzQNCi1kaXNjaXBsaW5lR3JvdXBpbmdfdGV4dD1cdTg5OGZcdTdiYzRcdTUyMDZcdTdkNDQNCi1kb21haW5fdGV4dD1cdTk4MThcdTU3ZGYNCi1lc3RpbWF0ZV90ZXh0PVx1OTgxMFx1NGYzMA0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dD1cdTk4MTBcdTRmMzBcdTZlMmNcdTkxY2ZcdTUwM2MNCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dD1cdTk4MTBcdTRmMzBcdTgwMDNcdTkxY2YNCi1leGFtcGxlX3RleHQ9XHU3YmM0XHU0ZjhiDQotZ3VpZGFuY2VfdGV4dD1cdTYzMDdcdTVmMTUNCi1ndWlkZWxpbmVfdGV4dD1cdTZlOTZcdTUyNDcNCi1pdGVyYXRpb25fdGV4dD1cdTUzY2RcdTg5ODYNCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHQ9XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotbWV0aG9kQ29udGVudF90ZXh0PVx1NjViOVx1NmNkNVx1NTE2N1x1NWJiOQ0KLW1ldGhvZExpYnJhcnlfdGV4dD1cdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWINCi1tZXRob2RQYWNrYWdlX3RleHQ9XHU2NWI5XHU2Y2Q1XHU1OTU3XHU0ZWY2DQotbWV0aG9kUGx1Z2luX3RleHQ9XHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotbWlsZXN0b25lX3RleHQ9XHU3YmExXHU1MjM2XHU5ZWRlDQotb3V0Y29tZV90ZXh0PVx1OGYzOFx1NTFmYVx1N2Q1MFx1Njc5Yw0KLXBoYXNlX3RleHQ9XHU5NjhlXHU2YmI1DQotcHJhY3RpY2VfdGV4dD1cdTdkZjRcdTdmZDINCi1wcm9jZXNzX3RleHQ9XHU3YTBiXHU1ZThmDQotcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0PVx1NWRlZVx1NzU3MFx1NmQ0MVx1N2EwYg0KLXByb2Nlc3NGYW1pbHlfdGV4dD1cdTdhMGJcdTVlOGZcdTdjZmJcdTUyMTcNCi1wcm9jZXNzUGFja2FnZV90ZXh0PVx1N2EwYlx1NWU4Zlx1NTk1N1x1NGVmNg0KLXJlcG9ydF90ZXh0PVx1NTgzMVx1NTQ0YQ0KLXJldXNhYmxlQXNzZXRfdGV4dD1cdTUzZWZcdTkxY2RcdTg5MDdcdTRmN2ZcdTc1MjhcdTc2ODRcdThjYzdcdTc1MjINCi1yb2FkbWFwX3RleHQ9XHU1YzBlXHU4OWJkXHU1NzE2DQotcm9sZURlc2NyaXB0b3JfdGV4dD1cdTg5ZDJcdTgyNzJcdTYzY2ZcdThmZjBcdTViNTANCi1yb2xlX3RleHQ9XHU4OWQyXHU4MjcyDQotcm9sZVNldF90ZXh0PVx1ODlkMlx1ODI3Mlx1OTZjNg0KLXJvbGVTZXRHcm91cGluZ190ZXh0PVx1ODlkMlx1ODI3Mlx1OTZjNlx1NTIwNlx1N2Q0NA0KLXN0YW5kYXJkQ2F0ZWdvcnlfdGV4dD1cdTZhMTlcdTZlOTZcdTdhMmVcdTk4NWUNCi1zdGVwX3RleHQ9XHU2YjY1XHU5YTVmDQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ9XHU2NTJmXHU2M2Y0XHU4Y2M3XHU2NTk5DQotdGFza190ZXh0PVx1NGY1Y1x1Njk2ZA0KLXRhc2tEZXNjcmlwdG9yX3RleHQ9XHU0ZjVjXHU2OTZkXHU2M2NmXHU4ZmYwXHU1YjUwDQotdGVhbVByb2ZpbGVfdGV4dD1cdTU3MThcdTk2OGFcdThhMmRcdTViOWFcdTZhOTQNCi10ZW1wbGF0ZV90ZXh0PVx1N2JjNFx1NjcyYw0KLXRlcm1EZWZpbml0aW9uX3RleHQ9XHU4YTVlXHU1ZjU5XHU1YjlhXHU3ZmE5DQotdG9vbF90ZXh0PVx1NWRlNVx1NTE3Nw0KLXRvb2xNZW50b3JfdGV4dD1cdTVkZTVcdTUxNzdcdThmMTRcdTUyYTkNCi13aGl0ZXBhcGVyX3RleHQ9XHU3NjdkXHU3NmFlXHU2NmY4DQotd29ya1Byb2R1Y3RfdGV4dD1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWMNCi13b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dD1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTYzY2ZcdThmZjBcdTViNTANCi13b3JrUHJvZHVjdEVsZW1lbnRfdGV4dD1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTUxNDNcdTdkMjANCi13b3JrUHJvZHVjdFR5cGVfdGV4dD1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTk4NWVcdTU3OGINCi0NCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChQbHVyYWwpDQotYWN0aXZpdHlfdGV4dF9wbHVyYWw9XHU2ZDNiXHU1MmQ1DQotYXJ0aWZhY3RfdGV4dF9wbHVyYWw9XHU2OWNiXHU0ZWY2DQotY2FwYWJpbGl0eVBhdHRlcm5fdGV4dF9wbHVyYWw9XHU1MjlmXHU4MGZkXHU1NzhiXHU2YTIzDQotY2hlY2tsaXN0X3RleHRfcGx1cmFsPVx1NjgzOFx1NWMwZFx1NmUwNVx1NTVhZQ0KLWNoZWNrSXRlbV90ZXh0X3BsdXJhbD1cdTZhYTJcdTY3ZTVcdTk4MDVcdTc2ZWUNCi1jb21wb3NpdGVSb2xlX3RleHRfcGx1cmFsPVx1ODkwN1x1NTQwOFx1ODlkMlx1ODI3Mg0KLWNvbmNlcHRfdGV4dF9wbHVyYWw9XHU2OTgyXHU1ZmY1DQotY29udGVudFBhY2thZ2VfdGV4dF9wbHVyYWw9XHU1MTY3XHU1YmI5XHU1OTU3XHU0ZWY2DQotY3VzdG9tQ2F0ZWdvcnlfdGV4dF9wbHVyYWw9XHU4MWVhXHU4YTAyXHU3YTJlXHU5ODVlDQotZGVsaXZlcmFibGVfdGV4dF9wbHVyYWw9XHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlDQotZGVsaXZlcnlQcm9jZXNzX3RleHRfcGx1cmFsPVx1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYg0KLWRlc2NyaXB0b3JfdGV4dF9wbHVyYWw9XHU2M2NmXHU4ZmYwXHU1YjUwDQotZGlzY2lwbGluZV90ZXh0X3BsdXJhbD1cdTg5OGZcdTdiYzQNCi1kaXNjaXBsaW5lR3JvdXBpbmdfdGV4dF9wbHVyYWw9XHU4OThmXHU3YmM0XHU1MjA2XHU3ZDQ0DQotZG9tYWluX3RleHRfcGx1cmFsPVx1OTgxOFx1NTdkZg0KLWVzdGltYXRlX3RleHRfcGx1cmFsPVx1OTgxMFx1NGYzMA0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dF9wbHVyYWw9XHU5ODEwXHU0ZjMwXHU2ZTJjXHU5MWNmXHU1MDNjDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHRfcGx1cmFsPVx1OTgxMFx1NGYzMFx1ODAwM1x1OTFjZg0KLWV4YW1wbGVfdGV4dF9wbHVyYWw9XHU3YmM0XHU0ZjhiDQotZ3VpZGFuY2VfdGV4dF9wbHVyYWw9XHU2MzA3XHU1ZjE1DQotZ3VpZGVsaW5lX3RleHRfcGx1cmFsPVx1NmU5Nlx1NTI0Nw0KLWl0ZXJhdGlvbl90ZXh0X3BsdXJhbD1cdTUzY2RcdTg5ODYNCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHRfcGx1cmFsPVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZQ0KLW1ldGhvZENvbnRlbnRfdGV4dF9wbHVyYWw9XHU2NWI5XHU2Y2Q1XHU1MTY3XHU1YmI5DQotbWV0aG9kTGlicmFyeV90ZXh0X3BsdXJhbD1cdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWINCi1tZXRob2RQYWNrYWdlX3RleHRfcGx1cmFsPVx1NjViOVx1NmNkNVx1NTk1N1x1NGVmNg0KLW1ldGhvZFBsdWdpbl90ZXh0X3BsdXJhbD1cdTY1YjlcdTZjZDVcdTU5MTZcdTYzOWJcdTdhMGJcdTVmMGYNCi1taWxlc3RvbmVfdGV4dF9wbHVyYWw9XHU5MWNjXHU3YTBiXHU3ODkxDQotb3V0Y29tZV90ZXh0X3BsdXJhbD1cdThmMzhcdTUxZmFcdTdkNTBcdTY3OWMNCi1waGFzZV90ZXh0X3BsdXJhbD1cdTk2OGVcdTZiYjUNCi1wcmFjdGljZV90ZXh0X3BsdXJhbD1cdTdkZjRcdTdmZDINCi1wcm9jZXNzX3RleHRfcGx1cmFsPVx1N2EwYlx1NWU4Zg0KLXByb2Nlc3NDb250cmlidXRpb25fdGV4dF9wbHVyYWw9XHU1ZGVlXHU3NTcwXHU2ZDQxXHU3YTBiDQotcHJvY2Vzc0ZhbWlseV90ZXh0X3BsdXJhbD1cdTdhMGJcdTVlOGZcdTdjZmJcdTUyMTcNCi1wcm9jZXNzUGFja2FnZV90ZXh0X3BsdXJhbD1cdTdhMGJcdTVlOGZcdTU5NTdcdTRlZjYNCi1yZXBvcnRfdGV4dF9wbHVyYWw9XHU1ODMxXHU1NDRhDQotcmV1c2FibGVBc3NldF90ZXh0X3BsdXJhbD1cdTUzZWZcdTkxY2RcdTg5MDdcdTRmN2ZcdTc1MjhcdTc2ODRcdThjYzdcdTc1MjINCi1yb2FkbWFwX3RleHRfcGx1cmFsPVx1NWMwZVx1ODliZFx1NTcxNg0KLXJvbGVEZXNjcmlwdG9yX3RleHRfcGx1cmFsPVx1ODlkMlx1ODI3Mlx1NjNjZlx1OGZmMFx1NWI1MA0KLXJvbGVfdGV4dF9wbHVyYWw9XHU4OWQyXHU4MjcyDQotcm9sZVNldF90ZXh0X3BsdXJhbD1cdTg5ZDJcdTgyNzJcdTk2YzYNCi1yb2xlU2V0R3JvdXBpbmdfdGV4dF9wbHVyYWw9XHU4OWQyXHU4MjcyXHU5NmM2XHU1MjA2XHU3ZDQ0DQotc3RhbmRhcmRDYXRlZ29yeV90ZXh0X3BsdXJhbD1cdTZhMTlcdTZlOTZcdTdhMmVcdTk4NWUNCi1zdGVwX3RleHRfcGx1cmFsPVx1NmI2NVx1OWE1Zg0KLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0X3BsdXJhbD1cdTY1MmZcdTYzZjRcdThjYzdcdTY1OTkNCi10YXNrX3RleHRfcGx1cmFsPVx1NGY1Y1x1Njk2ZA0KLXRhc2tEZXNjcmlwdG9yX3RleHRfcGx1cmFsPVx1NGY1Y1x1Njk2ZFx1NjNjZlx1OGZmMFx1NWI1MA0KLXRlYW1Qcm9maWxlX3RleHRfcGx1cmFsPVx1NTcxOFx1OTY4YVx1OGEyZFx1NWI5YVx1NmE5NA0KLXRlbXBsYXRlX3RleHRfcGx1cmFsPVx1N2JjNFx1NjcyYw0KLXRlcm1EZWZpbml0aW9uX3RleHRfcGx1cmFsPVx1OGE1ZVx1NWY1OVx1NWI5YVx1N2ZhOQ0KLXRvb2xfdGV4dF9wbHVyYWw9XHU1ZGU1XHU1MTc3DQotdG9vbE1lbnRvcl90ZXh0X3BsdXJhbD1cdTVkZTVcdTUxNzdcdThmMTRcdTUyYTkNCi13aGl0ZXBhcGVyX3RleHRfcGx1cmFsPVx1NzY3ZFx1NzZhZVx1NjZmOA0KLXdvcmtQcm9kdWN0X3RleHRfcGx1cmFsPVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLXdvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1cdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTYzY2ZcdThmZjBcdTViNTANCi13b3JrUHJvZHVjdEVsZW1lbnRfdGV4dF9wbHVyYWw9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU1MTQzXHU3ZDIwDQotd29ya1Byb2R1Y3RUeXBlX3RleHRfcGx1cmFsPVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Y1x1OTg1ZVx1NTc4Yg0KLQ0KLSMgQXBwbGljYXRpb24gdGl0bGUuDQotYXBwbGljYXRpb25fdGl0bGU9ezB9IC0gezF9DQotDQotIyBPcGVuIE1ldGhvZCBMaWJyYXJ5IERpYWxvZw0KLW9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlPVx1OTU4Ylx1NTU1Zlx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYg0KLW9wZW5MaWJyYXJ5RGlhbG9nQXJlYV90aXRsZT1cdTkwNzhcdTUzZDZcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWINCi1vcGVuTGlicmFyeURpYWxvZ0FyZWFfdGV4dD17MH0gXHU2NzAzXHU1YzA3XHU2NWI5XHU2Y2Q1XHU1NDhjXHU3YTBiXHU1ZThmXHU1MTMyXHU1YjU4XHU1NzI4XHU4Y2M3XHU2NTk5XHU1OTNlXHVmZjBjXHU2YjY0XHU4Y2M3XHU2NTk5XHU1OTNlXHU3YTMxXHU3MGJhXG5cdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTMwMDJcdThhY2JcdTkwNzhcdTUzZDZcdTZiNjRcdTk2OGVcdTZiYjVcdTRmNWNcdTY5NmRcdTRmN2ZcdTc1MjhcdTc2ODRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdThjYzdcdTY1OTlcdTU5M2VcdTMwMDINCi1saWJyYXJ5TGFiZWxfdGV4dD1cdTdhMGJcdTVmMGZcdTVlYWJcdWZmMWENCi1icm93c2VCdXR0b25fdGV4dD1cdTcwMGZcdTg5YmQuLi4NCi1wcm9tcHRGb3JMaWJyYXJ5Q2hlY2tib3hfdGV4dD1cdTRlZTVcdTZiNjRcdTcwYmFcdTk4MTBcdThhMmRcdTUwM2NcdWZmMGNcdTRlMGRcdTg5ODFcdTUxOGRcdThhNjJcdTU1NGZcdTMwMDINCi1vcGVuTGlicmFyeURpYWxvZ19uZXdMaWJyYXJ5X3RleHQ9Jyd7MH0nJyBcdTRlMGFcdTZjOTJcdTY3MDlcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTMwMDJcblx1NWMwN1x1NTcyOFx1NjMwN1x1NWI5YVx1NzY4NFx1NzZlZVx1OTMwNFx1NGUyZFx1NWVmYVx1N2FjYlx1NGUyNlx1OTU4Ylx1NTU1Zlx1NjViMFx1NzY4NFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1MzAwMlxuXG5cdThhY2JcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdTc4YmFcdTViOWFcdTMwMGRcdWZmMGNcdTYyMTZcdTYzMDlcdTMwMGNcdTUzZDZcdTZkODhcdTMwMGRcdTRlMjZcdTYzMDdcdTViOWFcdTUzZTZcdTRlMDBcdTUwMGJcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdThkZWZcdTVmOTFcdTMwMDINCi0NCi0jIFNlbGVjdCBNZXRob2QgTGlicmFyeSBGb2xkZXIgRGlhbG9nDQotc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190aXRsZT1cdTkwNzhcdTUzZDZcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWINCi1zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RleHQ9XHU5MDc4XHU1M2Q2XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU4Y2M3XHU2NTk5XHU1OTNlXHUzMDAyDQotDQotIyBPcGVuIExpYnJhcnkgUHJvZ3Jlc3MgTWVzc2FnZQ0KLW9wZW5pbmdMaWJyYXJ5VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1OTU4Ylx1NTU1Zlx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYi4uLg0KLQ0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBFcnJvciBEaWFsb2cNCi1pbnZhbGlkTGlicmFyeVBhdGhfbXNnPUlVUEwwMzAwRTogXHU3MTIxXHU2Y2Q1XHU5NThiXHU1NTVmXHU2MzA3XHU1YjlhXHU3Njg0XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHUzMDAyDQotaW52YWxpZExpYnJhcnlQYXRoX3JlYXNvbj1cdTkwNzhcdTUzZDZcdTc2ODRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdThjYzdcdTY1OTlcdTU5M2VcdTcxMjFcdTY1NDhcdTMwMDFcdTRlMGRcdTViNThcdTU3MjhcdTYyMTZcdTYwYThcdTZjOTJcdTY3MDlcdTkwNjlcdTc1NzZcdTc2ODRcdTViNThcdTUzZDZcdTZiMGFcdTk2NTBcdTMwMDJcblxuXHU4YWNiXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU3OGJhXHU1YjlhXHUzMDBkXHVmZjBjXHU5MDc4XHU1M2Q2XHU1M2U2XHU0ZTAwXHU1MDBiXHU3YTBiXHU1ZjBmXHU1ZWFiXHU4Y2M3XHU2NTk5XHU1OTNlXHUzMDAyDQotDQotIyBMaWJyYXJ5IExvY2tlZCBFcnJvciBEaWFsb2cNCi1saWJyYXJ5TG9ja2VkX21zZz1JVVBMMDMwM0U6IFx1NzEyMVx1NmNkNVx1OTU4Ylx1NTU1Zlx1NjMwN1x1NWI5YVx1NzY4NFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1MzAwMlxuXG5cdTkwNzhcdTUzZDZcdTc2ODRcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTk4NmZcdTc5M2FcdTZiNjNcdTU3MjhcdTRmN2ZcdTc1MjhcdTRlMmRcdTMwMDJcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdTUzZDZcdTZkODhcdTMwMGRcdTRmODZcdTkwNzhcdTUzZDZcdTUzZTZcdTRlMDBcdTUwMGJcdTdhMGJcdTVmMGZcdTVlYWJcdThjYzdcdTY1OTlcdTU5M2VcdWZmMGNcdTU5ODJcdTY3OWNcdTRlMDBcdTViOWFcdTg5ODFcdTk1OGJcdTU1NWZcdTdhMGJcdTVmMGZcdTVlYWJcdWZmMGNcdThhY2JcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdTVmMzdcdTUyMzZcdTk1OGJcdTU1NWZcdTMwMGRcdTMwMDJcblxuXHU4YjY2XHU1NDRhXHVmZjFhXHU0ZTI2XHU4ODRjXHU0ZjdmXHU3NTI4XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU1M2VmXHU4MGZkXHU1YzBlXHU4MWY0XHU3YTBiXHU1ZjBmXHU1ZWFiXHU2YmMwXHU2NDBkXHUzMDAyDQotbGlicmFyeUxvY2tlZF9vcGVuQnV0dG9uX3RleHQ9XHU1ZjM3XHU1MjM2XHU5NThiXHU1NTVmDQotDQotIyBSZWFkLW9ubHkgUHJvamVjdCBGaWxlIEVycm9yIERpYWxvZw0KLXJlYWRPbmx5UHJvamVjdEZpbGVfdGV4dD1JVVBMMDMwMkU6ICcnezB9JycgXHU2NjJmXHU1NTJmXHU4YjgwXHU3Njg0XHUzMDAyXHU3ZTdjXHU3ZThjXHU0ZTRiXHU1MjRkXHVmZjBjXHU4YWNiXHU1MTQ4XHU4YTJkXHU3MGJhXHU1M2VmXHU1YmViXHU1MTY1XHUzMDAyDQotcmV0cnlCdXR0b25fdGV4dD1cdTkxY2RcdThhNjYNCi1jYW5jZWxCdXR0b25fdGV4dD1cdTUzZDZcdTZkODgNCi0NCi0jIFZlcnNpb24gTWlzbWF0Y2ggRGlhbG9nDQotdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHQ9SVVQTDMwNUU6IFx1NzEyMVx1NmNkNVx1OTU4Ylx1NTU1Zlx1OTA3OFx1NTNkNlx1NzY4NFx1N2EwYlx1NWYwZlx1NWVhYlx1MzAwMlx1NjBhOFx1NWZjNVx1OTgwOFx1NWMwNyB7MH0gXHU1MzQ3XHU3ZDFhXHU1MjMwIHsxfSBcdTcyNDhcdTYyMTZcdTY2ZjRcdTY1YjBcdTc2ODRcdTcyNDhcdTY3MmNcdWZmMGNcdTYyNGRcdTgwZmRcdTk1OGJcdTU1NWZcdTkwMTlcdTUwMGJcdTdhMGJcdTVmMGZcdTVlYWJcdTMwMDINCi12ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dF91bmtub3duPUlVUEwzMDZFOiBcdTcxMjFcdTZjZDVcdTk1OGJcdTU1NWZcdTkwNzhcdTUzZDZcdTc2ODRcdTdhMGJcdTVmMGZcdTVlYWJcdTMwMDJcdTYwYThcdTVmYzVcdTk4MDhcdTVjMDcgezB9IFx1NTM0N1x1N2QxYVx1NTIzMFx1NjZmNFx1NjViMFx1NzY4NFx1NzI0OFx1NjcyY1x1ZmYwY1x1NjI0ZFx1ODBmZFx1OTU4Ylx1NTU1Zlx1OTAxOVx1NTAwYlx1N2EwYlx1NWYwZlx1NWVhYlx1MzAwMg0KLQ0KLSMgVXBncmFkZSBNZXRob2QgTGlicmFyeSBEaWFsb2cNCi11cGdyYWRlTGlicmFyeURpYWxvZ190aXRsZT1cdTUzNDdcdTdkMWFcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWINCi11cGdyYWRlTGlicmFyeURpYWxvZ190ZXh0PVx1NjBhOFx1OTA3OFx1NTNkNlx1NzY4NFx1N2EwYlx1NWYwZlx1NWVhYlx1NWZjNVx1OTgwOFx1NTM0N1x1N2QxYVx1NTIzMFx1NjViMFx1NzY4NFx1N2EwYlx1NWYwZlx1NWVhYlx1N2Q1MFx1NjljYlx1MzAwMlxuXG5cdTg5ODFcdTdlN2NcdTdlOGNcdTUzNDdcdTdkMWFcdTU1Y2VcdWZmMWYNCi11cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NTM0N1x1N2QxYVx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYi4uLg0KLQ0KLSMgVXBncmFkZSBMaWJyYXJ5IEVycm9yIERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEwwMzAxRTogXHU3MTIxXHU2Y2Q1XHU1MzQ3XHU3ZDFhXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHUzMDAyXHU1OTgyXHU5NzAwXHU4YTczXHU3ZDMwXHU4Y2M3XHU4YTBhXHVmZjBjXHU4YWNiXHU1M2MzXHU5NWIxXHU2NWU1XHU4YThjXHU2YTk0XHUzMDAyDQotDQotIyBTd2l0Y2ggQ29uZmlndXJhdGlvbiBEaWFsb2cNCi1zd2l0Y2hDb25maWdEaWFsb2dfdGl0bGU9XHU1MjA3XHU2M2RiXHU5MTRkXHU3ZjZlDQotc3dpdGNoQ29uZmlnRGlhbG9nX3RleHQ9XHU2MGE4XHU4OTgxXHU1ZjllXHU3M2ZlXHU4ODRjXHU5MTRkXHU3ZjZlXHU1MjA3XHU2M2RiXHU4MWYzXHU5MDc4XHU1YjlhXHU3YTBiXHU1ZThmXHU3NmY4XHU5NWRjXHU3Njg0XHU5ODEwXHU4YTJkXHU5MTRkXHU3ZjZlICcnezB9JycgXHU1NWNlXHVmZjFmDQotCQ0KLSMgQ29uZmlndXJhdGlvbiBDb21ibw0KLWN1cnJlbnRDb25maWdMYWJlbF90ZXh0PVx1NzNmZVx1ODg0Y1x1OTE0ZFx1N2Y2ZVx1ZmYxYQ0KLXNlbGVjdENvbmZpZ0xhYmVsX3RleHQ9XHU5MDc4XHU1M2Q2XHU5MTRkXHU3ZjZlDQotDQotIyBEZWxldGUgRmlsZXMgQ29uZmlybWF0aW9uIE1lc3NhZ2UNCi1kZWxldGVGaWxlc0NvbmZpcm1hdGlvbl9tc2c9XHU2MzA3XHU1YjlhXHU3Njg0XHU4ZGVmXHU1ZjkxICcnezB9JycgXHU1ZGYyXHU1YjU4XHU1NzI4XHUzMDAyXHU1YzA3XHU1MjJhXHU5NjY0XHU4Y2M3XHU2NTk5XHU1OTNlXHU0ZTJkXHU3Njg0XHU2MjQwXHU2NzA5XHU2YTk0XHU2ODQ4XHUzMDAyXHU4OTgxXHU3ZTdjXHU3ZThjXHU1NWNlXHVmZjFmDQotDQotIyBQYXRocy9GaWxlcyBFcnJvciBNZXNzYWdlcw0KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPVx1OGRlZlx1NWY5MSAnJ3swfScnIFx1NTMwNVx1NTQyYlx1NGUwMFx1NjIxNlx1NTkxYVx1NTAwYlx1NzEyMVx1NmNkNVx1NTIyYVx1OTY2NFx1NzY4NFx1NmE5NFx1Njg0OFx1MzAwMlxuXG5cdThhY2JcdTkwNzhcdTUzZDZcdTUzZTZcdTRlMDBcdTUwMGJcdThkZWZcdTVmOTFcdWZmMGNcdTcxMzZcdTVmOGNcdTUxOGRcdThhNjZcdTRlMDBcdTZiMjFcdTMwMDINCi1jcmVhdGVQYXRoRXJyb3JfcmVhc29uPVx1NzEyMVx1NmNkNVx1NWVmYVx1N2FjYlx1OGRlZlx1NWY5MSAnJ3swfScnXHUzMDAyXG5cblx1OGFjYlx1OTA3OFx1NTNkNlx1NTNlNlx1NGUwMFx1NTAwYlx1OGRlZlx1NWY5MVx1ZmYwY1x1NzEzNlx1NWY4Y1x1NTE4ZFx1OGE2Nlx1NGUwMFx1NmIyMVx1MzAwMg0KLWludmFsaWRQYXRoX21zZz1cdTYzMDdcdTViOWFcdTc2ODRcdThkZWZcdTVmOTFcdTcxMjFcdTY1NDhcdTMwMDINCi0NCi0jIEJhY2t1cCBMaWJyYXJ5IERpYWxvZw0KLWJhY2t1cExpYnJhcnlEaWFsb2dfdGl0bGU9XHU1MDk5XHU0ZWZkXHU3YTBiXHU1ZjBmXHU1ZWFiDQotYmFja3VwTGlicmFyeURpYWxvZ190ZXh0PVx1N2U3Y1x1N2U4Y1x1NGU0Ylx1NTI0ZFx1ZmYwY1x1NWYzN1x1NzBjOFx1NWVmYVx1OGI3MFx1NjBhOFx1NTA5OVx1NGVmZFx1NzNmZVx1ODg0Y1x1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYlx1MzAwMlxuXG5cdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdTc4YmFcdTViOWFcdTMwMGRcdWZmMGNcdTUzZWZcdTRlZTVcdTU3MjhcdTYzMDdcdTViOWFcdTc2ODRcdTc2ZWVcdTkzMDRcdTRlMmRcdTVlZmFcdTdhY2JcdTdhMGJcdTVmMGZcdTVlYWJcdTc2ODRcdTUwOTlcdTRlZmRcdTMwMDJcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdThkZjNcdTkwNGVcdTMwMGRcdTUzZWZcdTdlN2NcdTdlOGNcdWZmMGNcdTRmNDZcdTRlMGRcdTVlZmFcdTdhY2JcdTUwOTlcdTRlZmRcdTMwMDINCi1iYWNraW5nVXBMaWJyYXJ5VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NWVmYVx1N2FjYlx1N2EwYlx1NWYwZlx1NWVhYlx1NmE5NFx1Njg0OFx1NzY4NFx1NTA5OVx1NGVmZC4uLg0KLQ0KLSMgUGF0aCBTZWxlY3Rpb24gRGlhbG9nDQotcGF0aFNlbGVjdGlvbkVycm9yX21zZz1cdTcxMjFcdTZjZDVcdTVlZmFcdTdhY2JcdTc2ZWVcdTkzMDQNCi1va0J1dHRvbl90ZXh0PVx1NzhiYVx1NWI5YQ0KLXNraXBCdXR0b25fdGV4dD1cdThkZjNcdTkwNGUNCi0NCi0jIFByb2Nlc3MgRWRpdG9yIHByZWZlcmVuY2VzDQotYWx3YXlzQnV0dG9uX3RleHQ9XHU0ZTAwXHU1ZjhiDQotbmV2ZXJCdXR0b25fdGV4dD1cdTdkNTVcdTRlMGQNCi1wcm9tcHRCdXR0b25fdGV4dD1cdTYzZDBcdTc5M2ENCi0NCi0jIEFkZCBMaW5rIERpYWxvZw0KLWxpbmtUb1VSTF9uYW1lPVVSTA0KLWxpbmtUb0ZpbGVfbmFtZT1cdTZhOTRcdTY4NDgNCi1lbGVtZW50TGlua19uYW1lPVx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMA0KLWVsZW1lbnRMaW5rV2l0aFR5cGVfbmFtZT1cdTUxNzdcdTY3MDlcdTk4NWVcdTU3OGJcdTViNTdcdTk5OTZcdTc2ODRcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjANCi1lbGVtZW50TGlua1dpdGhVc2VyVGV4dF9uYW1lPVx1NTE3N1x1NjcwOVx1ODFlYVx1OGEwMlx1NjU4N1x1NWI1N1x1NzY4NFx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMA0KLQ0KLSMgQ29udmVydCBBY3Rpdml0eSBUeXBlIERpYWxvZw0KLWNvbnZlcnRBY3Rpdml0eURpYWxvZ190aXRsZT1cdThmNDlcdTYzZGJcdTZkM2JcdTUyZDVcdTk4NWVcdTU3OGINCi1jb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGV4dD1cdTkwNzhcdTUzZDZcdTc2ZWVcdTZhMTlcdTZkM2JcdTUyZDVcdTk4NWVcdTU3OGJcdTMwMDINCi11bnN1cHBvcnRlZEFjdGl2aXR5VHlwZV9tc2c9SVVQTDAzMDRFOiBcdTZiNjRcdTZkM2JcdTUyZDVcdTcxMjFcdTZjZDVcdThmNDlcdTYzZGJcdTcwYmFcdTUzZTZcdTRlMDBcdTdhMmVcdTk4NWVcdTU3OGJcdTMwMDINCi11bnN1cHBvcnRlZEFjdGl2aXR5VHlwZV9yZWFzb249ezB9XHU2YzkyXHU2NzA5XHU3NmY4XHU1YmI5XHU3Njg0XHU2ZDNiXHU1MmQ1XHU5ODVlXHU1NzhiXHUzMDAyDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxYzVlYjMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjMWUyNWIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBMaWJyYXJ5IFVJIChOTDIpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMi9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjU0ZmNhNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTEwOGU2NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9XHUwNDExXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDMwIEVQRiAtIFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0NDJcdTA0MzVcdTA0NDBcdTA0NDRcdTA0MzVcdTA0MzlcdTA0NDENCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBEZWZhdWx0IE1ldGhvZCBMaWJyYXJ5IFBhdGguDQotbGlicmFyeVBhdGg9PHVzZXIuaG9tZT4vPGFwcC5uYW1lPi9NZXRob2QgTGlicmFyaWVzL2xpYnJhcnkxDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMzUyZmI1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXNfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChTaW5ndWxhcikNCi1hY3Rpdml0eV90ZXh0PVx1MDQxZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0Zg0KLWFydGlmYWN0X3RleHQ9XHUwNDEwXHUwNDQwXHUwNDQyXHUwNDM1XHUwNDQ0XHUwNDMwXHUwNDNhXHUwNDQyDQotY2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1cdTA0MjhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2QgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5DQotY2hlY2tsaXN0X3RleHQ9XHUwNDIxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDMwXHUwNDRmIFx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQzMA0KLWNoZWNrSXRlbV90ZXh0PVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0NDFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDQyXHUwNDMwXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDQ2XHUwNDRiDQotY29tcG9zaXRlUm9sZV90ZXh0PVx1MDQyMVx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGMNCi1jb25jZXB0X3RleHQ9XHUwNDFhXHUwNDNlXHUwNDNkXHUwNDQ2XHUwNDM1XHUwNDNmXHUwNDQ2XHUwNDM4XHUwNDRmDQotY29udGVudFBhY2thZ2VfdGV4dD1cdTA0MWZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDIgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyDQotY3VzdG9tQ2F0ZWdvcnlfdGV4dD1cdTA0MWZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDRmDQotZGVsaXZlcmFibGVfdGV4dD1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyDQotZGVsaXZlcnlQcm9jZXNzX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxIFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYVx1MDQzOA0KLWRlc2NyaXB0b3JfdGV4dD1cdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDANCi1kaXNjaXBsaW5lX3RleHQ9XHUwNDE0XHUwNDM4XHUwNDQxXHUwNDQ2XHUwNDM4XHUwNDNmXHUwNDNiXHUwNDM4XHUwNDNkXHUwNDMwDQotZGlzY2lwbGluZUdyb3VwaW5nX3RleHQ9XHUwNDEzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDMwIFx1MDQzNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZA0KLWRvbWFpbl90ZXh0PVx1MDQxNFx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZA0KLWVzdGltYXRlX3RleHQ9XHUwNDFlXHUwNDQ2XHUwNDM1XHUwNDNkXHUwNDNhXHUwNDMwDQotZXN0aW1hdGluZ01ldHJpY190ZXh0PVx1MDQxZlx1MDQzZVx1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0YyBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0M2RcdTA0M2FcdTA0MzgNCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dD1cdTA0MjBcdTA0MzVcdTA0M2FcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzRcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNmXHUwNDNlIFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQzZFx1MDQzYVx1MDQzNQ0KLWV4YW1wbGVfdGV4dD1cdTA0MWZcdTA0NDBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0NDANCi1ndWlkYW5jZV90ZXh0PVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLWd1aWRlbGluZV90ZXh0PVx1MDQyMFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0Zg0KLWl0ZXJhdGlvbl90ZXh0PVx1MDQxOFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0Zg0KLW1ldGhvZENvbmZpZ3VyYXRpb25fdGV4dD1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotbWV0aG9kQ29udGVudF90ZXh0PVx1MDQxY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0YiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1tZXRob2RMaWJyYXJ5X3RleHQ9XHUwNDExXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDMwIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLW1ldGhvZFBhY2thZ2VfdGV4dD1cdTA0MWZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotbWV0aG9kUGx1Z2luX3RleHQ9XHUwNDFjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRjIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLW1pbGVzdG9uZV90ZXh0PVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0NDJcdTA0M2VcdTA0NDdcdTA0M2FcdTA0MzANCi1vdXRjb21lX3RleHQ9XHUwNDE4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0DQotcGhhc2VfdGV4dD1cdTA0MmRcdTA0NDJcdTA0MzBcdTA0M2YNCi1wcmFjdGljZV90ZXh0PVx1MDQxZlx1MDQ0MFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzOFx1MDQzYVx1MDQzMCBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1wcm9jZXNzX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxDQotcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0PVx1MDQxNFx1MDQzZVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0M2EgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDQzDQotcHJvY2Vzc0ZhbWlseV90ZXh0PVx1MDQyMVx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0M2VcdTA0MzINCi1wcm9jZXNzUGFja2FnZV90ZXh0PVx1MDQxZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0MiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0M2VcdTA0MzINCi1yZXBvcnRfdGV4dD1cdTA0MWVcdTA0NDJcdTA0NDdcdTA0MzVcdTA0NDINCi1yZXVzYWJsZUFzc2V0X3RleHQ9XHUwNDFjXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM5IFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MQ0KLXJvYWRtYXBfdGV4dD1cdTA0MWZcdTA0NDNcdTA0NDJcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGMNCi1yb2xlRGVzY3JpcHRvcl90ZXh0PVx1MDQxNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzgNCi1yb2xlX3RleHQ9XHUwNDIwXHUwNDNlXHUwNDNiXHUwNDRjDQotcm9sZVNldF90ZXh0PVx1MDQxZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MCBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkNCi1yb2xlU2V0R3JvdXBpbmdfdGV4dD1cdTA0MTNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NGIgXHUwNDNkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDMyIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOQ0KLXN0YW5kYXJkQ2F0ZWdvcnlfdGV4dD1cdTA0MjFcdTA0NDJcdTA0MzBcdTA0M2RcdTA0MzRcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDRmDQotc3RlcF90ZXh0PVx1MDQyOFx1MDQzMFx1MDQzMw0KLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0PVx1MDQyMVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0NGINCi10YXNrX3RleHQ9XHUwNDE3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDMwDQotdGFza0Rlc2NyaXB0b3JfdGV4dD1cdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4DQotdGVhbVByb2ZpbGVfdGV4dD1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDRiDQotdGVtcGxhdGVfdGV4dD1cdTA0MjhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2QNCi10ZXJtRGVmaW5pdGlvbl90ZXh0PVx1MDQxZVx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0M2NcdTA0MzhcdTA0M2RcdTA0MzANCi10b29sX3RleHQ9XHUwNDE4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyDQotdG9vbE1lbnRvcl90ZXh0PVx1MDQyMFx1MDQ0M1x1MDQzYVx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzZSBcdTA0M2ZcdTA0M2UgXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDQzDQotd2hpdGVwYXBlcl90ZXh0PVx1MDQxOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzZVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0MzFcdTA0NGVcdTA0M2JcdTA0M2JcdTA0MzVcdTA0NDJcdTA0MzVcdTA0M2RcdTA0NGMNCi13b3JrUHJvZHVjdF90ZXh0PVx1MDQyMFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDINCi13b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dD1cdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMA0KLXdvcmtQcm9kdWN0RWxlbWVudF90ZXh0PVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzANCi13b3JrUHJvZHVjdFR5cGVfdGV4dD1cdTA0MjJcdTA0MzhcdTA0M2YgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMA0KLQ0KLSMgTWV0aG9kIEVsZW1lbnQgTmFtZXMgKFBsdXJhbCkNCi1hY3Rpdml0eV90ZXh0X3BsdXJhbD1cdTA0MWVcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1hcnRpZmFjdF90ZXh0X3BsdXJhbD1cdTA0MTBcdTA0NDBcdTA0NDJcdTA0MzVcdTA0NDRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0NGINCi1jYXBhYmlsaXR5UGF0dGVybl90ZXh0X3BsdXJhbD1cdTA0MjhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2RcdTA0NGIgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5DQotY2hlY2tsaXN0X3RleHRfcGx1cmFsPVx1MDQyMVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0NGINCi1jaGVja0l0ZW1fdGV4dF9wbHVyYWw9XHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQzZVx1MDQzOSBcdTA0NDJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0NGINCi1jb21wb3NpdGVSb2xlX3RleHRfcGx1cmFsPVx1MDQyMVx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzgNCi1jb25jZXB0X3RleHRfcGx1cmFsPVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0Nlx1MDQzNVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQzOA0KLWNvbnRlbnRQYWNrYWdlX3RleHRfcGx1cmFsPVx1MDQxZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0Mlx1MDQ0YiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzINCi1jdXN0b21DYXRlZ29yeV90ZXh0X3BsdXJhbD1cdTA0MWZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4DQotZGVsaXZlcmFibGVfdGV4dF9wbHVyYWw9XHUwNDFhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLWRlbGl2ZXJ5UHJvY2Vzc190ZXh0X3BsdXJhbD1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0NGIgXHUwNDM0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNhXHUwNDM4DQotZGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1cdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGINCi1kaXNjaXBsaW5lX3RleHRfcGx1cmFsPVx1MDQxNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZFx1MDQ0Yg0KLWRpc2NpcGxpbmVHcm91cGluZ190ZXh0X3BsdXJhbD1cdTA0MTNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NGIgXHUwNDM0XHUwNDM4XHUwNDQxXHUwNDQ2XHUwNDM4XHUwNDNmXHUwNDNiXHUwNDM4XHUwNDNkDQotZG9tYWluX3RleHRfcGx1cmFsPVx1MDQxNFx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Yg0KLWVzdGltYXRlX3RleHRfcGx1cmFsPVx1MDQxZVx1MDQ0Nlx1MDQzNVx1MDQzZFx1MDQzYVx1MDQzOA0KLWVzdGltYXRpbmdNZXRyaWNfdGV4dF9wbHVyYWw9XHUwNDFmXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDM4IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0M2RcdTA0M2FcdTA0MzgNCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dF9wbHVyYWw9XHUwNDIwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQzZSBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0M2RcdTA0M2FcdTA0MzUNCi1leGFtcGxlX3RleHRfcGx1cmFsPVx1MDQxZlx1MDQ0MFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQ0MFx1MDQ0Yg0KLWd1aWRhbmNlX3RleHRfcGx1cmFsPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLWd1aWRlbGluZV90ZXh0X3BsdXJhbD1cdTA0MjBcdTA0MzVcdTA0M2FcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzRcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1pdGVyYXRpb25fdGV4dF9wbHVyYWw9XHUwNDE4XHUwNDQyXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotbWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0X3BsdXJhbD1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotbWV0aG9kQ29udGVudF90ZXh0X3BsdXJhbD1cdTA0MWNcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0NGIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotbWV0aG9kTGlicmFyeV90ZXh0X3BsdXJhbD1cdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotbWV0aG9kUGFja2FnZV90ZXh0X3BsdXJhbD1cdTA0MWZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDJcdTA0NGIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotbWV0aG9kUGx1Z2luX3RleHRfcGx1cmFsPVx1MDQxY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1taWxlc3RvbmVfdGV4dF9wbHVyYWw9XHUwNDFhXHUwNDNlXHUwNDNkXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0Mlx1MDQzZVx1MDQ0N1x1MDQzYVx1MDQzOA0KLW91dGNvbWVfdGV4dF9wbHVyYWw9XHUwNDE4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDRiDQotcGhhc2VfdGV4dF9wbHVyYWw9XHUwNDJkXHUwNDQyXHUwNDMwXHUwNDNmXHUwNDRiDQotcHJhY3RpY2VfdGV4dF9wbHVyYWw9XHUwNDFmXHUwNDQwXHUwNDMwXHUwNDNhXHUwNDQyXHUwNDM4XHUwNDNhXHUwNDM4IFx1MDQzMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLXByb2Nlc3NfdGV4dF9wbHVyYWw9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDRiDQotcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0X3BsdXJhbD1cdTA0MTRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNhIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMFx1MDQzYw0KLXByb2Nlc3NGYW1pbHlfdGV4dF9wbHVyYWw9XHUwNDIxXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDM5XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzZVx1MDQzMg0KLXByb2Nlc3NQYWNrYWdlX3RleHRfcGx1cmFsPVx1MDQxZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0Mlx1MDQ0YiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0M2VcdTA0MzINCi1yZXBvcnRfdGV4dF9wbHVyYWw9XHUwNDFlXHUwNDQyXHUwNDQ3XHUwNDM1XHUwNDQyXHUwNDRiDQotcmV1c2FibGVBc3NldF90ZXh0X3BsdXJhbD1cdTA0MWNcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0NGJcdTA0MzUgXHUwNDQwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDRiDQotcm9hZG1hcF90ZXh0X3BsdXJhbD1cdTA0MWZcdTA0NDNcdTA0NDJcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0MzgNCi1yb2xlRGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1cdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGIgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM1XHUwNDM5DQotcm9sZV90ZXh0X3BsdXJhbD1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0MzgNCi1yb2xlU2V0X3RleHRfcGx1cmFsPVx1MDQxZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkNCi1yb2xlU2V0R3JvdXBpbmdfdGV4dF9wbHVyYWw9XHUwNDEzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDRiIFx1MDQzZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQzMiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkNCi1zdGFuZGFyZENhdGVnb3J5X3RleHRfcGx1cmFsPVx1MDQyMVx1MDQ0Mlx1MDQzMFx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzgNCi1zdGVwX3RleHRfcGx1cmFsPVx1MDQyOFx1MDQzMFx1MDQzM1x1MDQzOA0KLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0X3BsdXJhbD1cdTA0MjFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiDQotdGFza190ZXh0X3BsdXJhbD1cdTA0MTdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzgNCi10YXNrRGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1cdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGIgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3DQotdGVhbVByb2ZpbGVfdGV4dF9wbHVyYWw9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiIFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZg0KLXRlbXBsYXRlX3RleHRfcGx1cmFsPVx1MDQyOFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZFx1MDQ0Yg0KLXRlcm1EZWZpbml0aW9uX3RleHRfcGx1cmFsPVx1MDQxZVx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0M2NcdTA0MzhcdTA0M2RcdTA0M2VcdTA0MzINCi10b29sX3RleHRfcGx1cmFsPVx1MDQxOFx1MDQzZFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0Yg0KLXRvb2xNZW50b3JfdGV4dF9wbHVyYWw9XHUwNDIwXHUwNDQzXHUwNDNhXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzZlx1MDQzZSBcdTA0MzhcdTA0M2RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzBcdTA0M2MNCi13aGl0ZXBhcGVyX3RleHRfcGx1cmFsPVx1MDQxOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzZVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0MzFcdTA0NGVcdTA0M2JcdTA0M2JcdTA0MzVcdTA0NDJcdTA0MzVcdTA0M2RcdTA0MzgNCi13b3JrUHJvZHVjdF90ZXh0X3BsdXJhbD1cdTA0MjBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiDQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHRfcGx1cmFsPVx1MDQxNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0NDUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDMyDQotd29ya1Byb2R1Y3RFbGVtZW50X3RleHRfcGx1cmFsPVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzANCi13b3JrUHJvZHVjdFR5cGVfdGV4dF9wbHVyYWw9XHUwNDIyXHUwNDM4XHUwNDNmXHUwNDRiIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQ0NSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0M2VcdTA0MzINCi0NCi0jIEFwcGxpY2F0aW9uIHRpdGxlLg0KLWFwcGxpY2F0aW9uX3RpdGxlPXswfSAtIHsxfQ0KLQ0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBEaWFsb2cNCi1vcGVuTGlicmFyeURpYWxvZ190aXRsZT1cdTA0MWVcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLW9wZW5MaWJyYXJ5RGlhbG9nQXJlYV90aXRsZT1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLW9wZW5MaWJyYXJ5RGlhbG9nQXJlYV90ZXh0PXswfSBcdTA0NDFcdTA0M2VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDRiIFx1MDQzOCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0NGIgXHUwNDMyIFx1MDQzZlx1MDQzMFx1MDQzZlx1MDQzYVx1MDQzNSwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDRmIFx1MDQzZFx1MDQzMFx1MDQzN1x1MDQ0Ylx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcblx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzOSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuIFx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0MzBcdTA0M2ZcdTA0M2FcdTA0NDMgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQ0MVx1MDQzNVx1MDQzMFx1MDQzZFx1MDQ0MVx1MDQzMC4NCi1saWJyYXJ5TGFiZWxfdGV4dD1cdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzA6DQotYnJvd3NlQnV0dG9uX3RleHQ9XHUwNDFlXHUwNDMxXHUwNDM3XHUwNDNlXHUwNDQwLi4uDQotcHJvbXB0Rm9yTGlicmFyeUNoZWNrYm94X3RleHQ9XHUwNDE4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0ZFx1MDQ0Mlx1MDQzZSBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDNlIFx1MDQ0M1x1MDQzY1x1MDQzZVx1MDQzYlx1MDQ0N1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZSBcdTA0MzIgXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDM1XHUwNDM5XHUwNDQ4XHUwNDM1XHUwNDNjLg0KLW9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dD1cdTA0MTFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzAgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzZVx1MDQ0Mlx1MDQ0MVx1MDQ0M1x1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQzNVx1MDQ0MiBcdTA0MzIgJyd7MH0nJy5cblx1MDQxMiBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0M2MgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzXHUwNDM1IFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzAgXHUwNDM4IFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQzMCBcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NGYgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDMwIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4gXG5cblx1MDQxZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBPSyBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDNiXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0MWVcdTA0NDJcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzAgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQzMCBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzkgXHUwNDNmXHUwNDMwXHUwNDNmXHUwNDNhXHUwNDM4IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuDQotDQotIyBTZWxlY3QgTWV0aG9kIExpYnJhcnkgRm9sZGVyIERpYWxvZw0KLXNlbGVjdExpYnJhcnlGb2xkZXJEaWFsb2dfdGl0bGU9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzMFx1MDQzZlx1MDQzYVx1MDQ0MyBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi4NCi0NCi0jIE9wZW4gTGlicmFyeSBQcm9ncmVzcyBNZXNzYWdlDQotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuLi4NCi0NCi0jIE9wZW4gTWV0aG9kIExpYnJhcnkgRXJyb3IgRGlhbG9nDQotaW52YWxpZExpYnJhcnlQYXRoX21zZz1JVVBMMDMwMEU6IFx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NGMgXHUwNDNlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLg0KLWludmFsaWRMaWJyYXJ5UGF0aF9yZWFzb249XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDMwXHUwNDRmIFx1MDQzZlx1MDQzMFx1MDQzZlx1MDQzYVx1MDQzMCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyIFx1MDQzZFx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQ0MyBcdTA0MzJcdTA0MzBcdTA0NDEgXHUwNDNkXHUwNDM1XHUwNDQyIFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMiBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2ZcdTA0MzAgXHUwNDNhIFx1MDQzZFx1MDQzNVx1MDQzOS5cblxuXHUwNDFkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZFx1MDQzZVx1MDQzZlx1MDQzYVx1MDQ0MyBPSyBcdTA0MzggXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQ0M1x1MDQ0ZSBcdTA0M2ZcdTA0MzBcdTA0M2ZcdTA0M2FcdTA0NDMgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4Lg0KLQ0KLSMgTGlicmFyeSBMb2NrZWQgRXJyb3IgRGlhbG9nDQotbGlicmFyeUxvY2tlZF9tc2c9SVVQTDAzMDNFOiBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi5cblxuXHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDMwXHUwNDRmIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDQzXHUwNDM2XHUwNDM1IFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQ0M1x1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Zi4gXHUwNDFkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQxZVx1MDQ0Mlx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzMCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDMwIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzZVx1MDQzOSBcdTA0M2ZcdTA0MzBcdTA0M2ZcdTA0M2FcdTA0MzggXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0MWVcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDNkXHUwNDQzXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlLCBcdTA0NDdcdTA0NDJcdTA0M2VcdTA0MzFcdTA0NGIgXHUwNDNlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZFx1MDQzZSBcdTA0NGRcdTA0NDJcdTA0NDMgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzLlxuXG5cdTA0MTJcdTA0M2RcdTA0MzhcdTA0M2NcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzU6IFx1MDQzZVx1MDQzNFx1MDQzZFx1MDQzZVx1MDQzMlx1MDQ0MFx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzNSBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDMyXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDM4IFx1MDQzYSBcdTA0MzVcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDMyXHUwNDQwXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRlLg0KLWxpYnJhcnlMb2NrZWRfb3BlbkJ1dHRvbl90ZXh0PVx1MDQxZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0M2RcdTA0NDNcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2UNCi0NCi0jIFJlYWQtb25seSBQcm9qZWN0IEZpbGUgRXJyb3IgRGlhbG9nDQotcmVhZE9ubHlQcm9qZWN0RmlsZV90ZXh0PUlVUEwwMzAyRTogJyd7MH0nJyBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2ZcdTA0MzVcdTA0M2QgXHUwNDQyXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDNlIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDdcdTA0NDJcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuIFx1MDQxNFx1MDQzYlx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDNjXHUwNDNlIFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQ0MFx1MDQzNVx1MDQ0OFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzdcdTA0MzBcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0NGMuDQotcmV0cnlCdXR0b25fdGV4dD1cdTA0MWZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0NGMNCi1jYW5jZWxCdXR0b25fdGV4dD1cdTA0MWVcdTA0NDJcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzANCi0NCi0jIFZlcnNpb24gTWlzbWF0Y2ggRGlhbG9nDQotdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHQ9SVVQTDMwNUU6IFx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NGMgXHUwNDNlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0M1x1MDQ0ZSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMuIFx1MDQxNFx1MDQzYlx1MDQ0ZiBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0NGIgXHUwNDQxIFx1MDQ0ZFx1MDQ0Mlx1MDQzZVx1MDQzOSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0M2VcdTA0MzkgXHUwNDNkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDNjXHUwNDNlIFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyB7MH0gXHUwNDM0XHUwNDNlIFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCB7MX0gXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQzMVx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzdcdTA0MzRcdTA0M2RcdTA0MzVcdTA0MzkuDQotdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHRfdW5rbm93bj1JVVBMMzA2RTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0M2VcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0My4gXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQ0YiBcdTA0NDEgXHUwNDRkXHUwNDQyXHUwNDNlXHUwNDM5IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzOSBcdTA0M2RcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzhcdTA0M2NcdTA0M2UgXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIHswfSBcdTA0MzRcdTA0M2UgXHUwNDMxXHUwNDNlXHUwNDNiXHUwNDM1XHUwNDM1IFx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzOSBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzguDQotDQotIyBVcGdyYWRlIE1ldGhvZCBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPVx1MDQxZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDMgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGV4dD1cdTA0MWRcdTA0MzVcdTA0M2VcdTA0MzFcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzhcdTA0M2NcdTA0M2UgXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0M1x1MDQ0MFx1MDQ0MyBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4LlxuXG5cdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1Pw0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9XHUwNDFlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuLi4NCi0NCi0jIFVwZ3JhZGUgTGlicmFyeSBFcnJvciBEaWFsb2cNCi11cGdyYWRlTGlicmFyeUVycm9yX21zZz1JVVBMMDMwMUU6IFx1MDQxZFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NGMgXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIuIFx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzhcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDMyIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQzYVx1MDQzZVx1MDQzYlx1MDQzNS4NCi0NCi0jIFN3aXRjaCBDb25maWd1cmF0aW9uIERpYWxvZw0KLXN3aXRjaENvbmZpZ0RpYWxvZ190aXRsZT1cdTA0MjFcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlDQotc3dpdGNoQ29uZmlnRGlhbG9nX3RleHQ9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDRjXHUwNDQxXHUwNDRmIFx1MDQzZFx1MDQzMCBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUgXHUwNDNmXHUwNDNlIFx1MDQ0M1x1MDQzY1x1MDQzZVx1MDQzYlx1MDQ0N1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZSAnJ3swfScnLCBcdTA0NDFcdTA0MzJcdTA0NGZcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDQxIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzYyBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0M2VcdTA0M2M/DQotCQ0KLSMgQ29uZmlndXJhdGlvbiBDb21ibw0KLWN1cnJlbnRDb25maWdMYWJlbF90ZXh0PVx1MDQyMlx1MDQzNVx1MDQzYVx1MDQ0M1x1MDQ0OVx1MDQzMFx1MDQ0ZiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGY6DQotc2VsZWN0Q29uZmlnTGFiZWxfdGV4dD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlDQotDQotIyBEZWxldGUgRmlsZXMgQ29uZmlybWF0aW9uIE1lc3NhZ2UNCi1kZWxldGVGaWxlc0NvbmZpcm1hdGlvbl9tc2c9XHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMyAnJ3swfScnIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIuIFx1MDQxMlx1MDQ0MVx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIgXHUwNDMyIFx1MDQzZlx1MDQzMFx1MDQzZlx1MDQzYVx1MDQzNSBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDRiLiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NGM/DQotDQotIyBQYXRocy9GaWxlcyBFcnJvciBNZXNzYWdlcw0KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPVx1MDQxMiBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzNcdTA0MzUgJyd7MH0nJyBcdTA0M2RcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2UgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Ylx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIuXG5cblx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0MzkgXHUwNDNmXHUwNDQzXHUwNDQyXHUwNDRjIFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDNmXHUwNDRiXHUwNDQyXHUwNDNhXHUwNDQzLg0KLWNyZWF0ZVBhdGhFcnJvcl9yZWFzb249XHUwNDFkXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0MzBcdTA0M2ZcdTA0M2FcdTA0NDMgJyd7MH0nJy5cblxuXHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzZVx1MDQzOSBcdTA0M2ZcdTA0NDNcdTA0NDJcdTA0NGMgXHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0M2ZcdTA0NGJcdTA0NDJcdTA0M2FcdTA0NDMuDQotaW52YWxpZFBhdGhfbXNnPVx1MDQyM1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZCBcdTA0M2RcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0NGJcdTA0MzkgXHUwNDNmXHUwNDQzXHUwNDQyXHUwNDRjLg0KLQ0KLSMgQmFja3VwIExpYnJhcnkgRGlhbG9nDQotYmFja3VwTGlicmFyeURpYWxvZ190aXRsZT1cdTA0MjBcdTA0MzVcdTA0MzdcdTA0MzVcdTA0NDBcdTA0MzJcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOA0KLWJhY2t1cExpYnJhcnlEaWFsb2dfdGV4dD1cdTA0MWRcdTA0MzBcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NGZcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2UgXHUwNDQwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDQzXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQ0MVx1MDQzZVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2FcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NGUgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzggXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLlxuXG5cdTA0MWRcdTA0MzBcdTA0MzZcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzUgT0sgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0NDBcdTA0MzVcdTA0MzdcdTA0MzVcdTA0NDBcdTA0MzJcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDM4IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOCBcdTA0MzIgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDNjIFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzM1x1MDQzNS4gXHUwNDFkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQ0YywgXHUwNDQ3XHUwNDQyXHUwNDNlXHUwNDMxXHUwNDRiIFx1MDQzZFx1MDQzNSBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQwXHUwNDM1XHUwNDM3XHUwNDM1XHUwNDQwXHUwNDMyXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzYVx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0ZS4NCi1iYWNraW5nVXBMaWJyYXJ5VGFza19uYW1lPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0MzVcdTA0MzdcdTA0MzVcdTA0NDBcdTA0MzJcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDM4IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzZVx1MDQzMiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzguLi4NCi0NCi0jIFBhdGggU2VsZWN0aW9uIERpYWxvZw0KLXBhdGhTZWxlY3Rpb25FcnJvcl9tc2c9XHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzDQotb2tCdXR0b25fdGV4dD1cdTA0MWVcdTA0MWENCi1za2lwQnV0dG9uX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDRjDQotDQotIyBQcm9jZXNzIEVkaXRvciBwcmVmZXJlbmNlcw0KLWFsd2F5c0J1dHRvbl90ZXh0PVx1MDQxMlx1MDQ0MVx1MDQzNVx1MDQzM1x1MDQzNFx1MDQzMA0KLW5ldmVyQnV0dG9uX3RleHQ9XHUwNDFkXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMzXHUwNDM0XHUwNDMwDQotcHJvbXB0QnV0dG9uX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDMzXHUwNDNiXHUwNDMwXHUwNDQ4XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1DQotDQotIyBBZGQgTGluayBEaWFsb2cNCi1saW5rVG9VUkxfbmFtZT1VUkwNCi1saW5rVG9GaWxlX25hbWU9XHUwNDI0XHUwNDMwXHUwNDM5XHUwNDNiDQotZWxlbWVudExpbmtfbmFtZT1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotZWxlbWVudExpbmtXaXRoVHlwZV9uYW1lPVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAgXHUwNDQxIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQ0MVx1MDQzZVx1MDQzYyBcdTA0NDJcdTA0MzhcdTA0M2ZcdTA0MzANCi1lbGVtZW50TGlua1dpdGhVc2VyVGV4dF9uYW1lPVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAgXHUwNDQxIFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzYyBcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDFcdTA0NDJcdTA0M2VcdTA0M2MNCi0NCi0jIENvbnZlcnQgQWN0aXZpdHkgVHlwZSBEaWFsb2cNCi1jb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGl0bGU9XHUwNDFmXHUwNDQwXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0Mlx1MDQzOFx1MDQzZiBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1jb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGV4dD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQ2XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM5IFx1MDQ0Mlx1MDQzOFx1MDQzZiBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguDQotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfbXNnPUlVUEwwMzA0RTogXHUwNDE0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2RcdTA0MzVcdTA0M2JcdTA0NGNcdTA0MzdcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzYSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDQyXHUwNDM4XHUwNDNmXHUwNDQzLg0KLXVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX3JlYXNvbj1cdTA0MTRcdTA0M2JcdTA0NGYgezB9IFx1MDQzZFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M2VcdTA0MzJcdTA0M2NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0NGJcdTA0NDUgXHUwNDQyXHUwNDM4XHUwNDNmXHUwNDNlXHUwNDMyIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOS4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMmEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyYS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDJhLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDJhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MjI0NmNmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWZlZmQ0MC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBMaWJyYXJ5IFVJIChOTDJhKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyYQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyYS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDJhL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0ZTY4MjMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RhLnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlkOTA2OTUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBicnVnZXJnclx1MDBlNm5zZWZsYWRlIHRpbCBiaWJsaW90ZWsNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBEZWZhdWx0IE1ldGhvZCBMaWJyYXJ5IFBhdGguDQotbGlicmFyeVBhdGg9PHVzZXIuaG9tZT4vPGFwcC5uYW1lPi9NZXRob2QgTGlicmFyaWVzL2xpYnJhcnkxDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXNfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ2ODMzMTUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXNfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChTaW5ndWxhcikNCi1hY3Rpdml0eV90ZXh0PUFrdGl2aXRldA0KLWFydGlmYWN0X3RleHQ9QXJ0ZWZha3QNCi1jYXBhYmlsaXR5UGF0dGVybl90ZXh0PUZ1bmt0aW9uc21cdTAwZjhuc3Rlcg0KLWNoZWNrbGlzdF90ZXh0PVRqZWtsaXN0ZQ0KLWNoZWNrSXRlbV90ZXh0PUtvbnRyb2xlbGVtZW50DQotY29tcG9zaXRlUm9sZV90ZXh0PVNhbW1lbnNhdCByb2xsZQ0KLWNvbmNlcHRfdGV4dD1CZWdyZWINCi1jb250ZW50UGFja2FnZV90ZXh0PUluZGhvbGRzcGFra2UNCi1jdXN0b21DYXRlZ29yeV90ZXh0PVRpbHBhc3NldCBrYXRlZ29yaQ0KLWRlbGl2ZXJhYmxlX3RleHQ9TGV2ZXJhbmNlDQotZGVsaXZlcnlQcm9jZXNzX3RleHQ9TGV2ZXJpbmdzcHJvY2VzDQotZGVzY3JpcHRvcl90ZXh0PURlc2tyaXB0b3INCi1kaXNjaXBsaW5lX3RleHQ9RGlzY2lwbGluDQotZGlzY2lwbGluZUdyb3VwaW5nX3RleHQ9RGlzY2lwbGluZ3J1cHBlcmluZw0KLWRvbWFpbl90ZXh0PURvbVx1MDBlNm5lDQotZXN0aW1hdGVfdGV4dD1Fc3RpbWF0DQotZXN0aW1hdGluZ01ldHJpY190ZXh0PUVzdGltZXJpbmdzbVx1MDBlNWxlc3lzdGVtDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ9RXN0aW1lcmluZ3NvdmVydmVqZWxzZXINCi1leGFtcGxlX3RleHQ9RWtzZW1wZWwNCi1ndWlkYW5jZV90ZXh0PVZlamxlZG5pbmcNCi1ndWlkZWxpbmVfdGV4dD1SZXRuaW5nc2xpbmplDQotaXRlcmF0aW9uX3RleHQ9R2VudGFnZWxzZQ0KLW1ldGhvZENvbmZpZ3VyYXRpb25fdGV4dD1NZXRvZGVrb25maWd1cmF0aW9uDQotbWV0aG9kQ29udGVudF90ZXh0PU1ldG9kZWluZGhvbGQNCi1tZXRob2RMaWJyYXJ5X3RleHQ9TWV0b2RlYmlibGlvdGVrDQotbWV0aG9kUGFja2FnZV90ZXh0PU1ldG9kZXBha2tlDQotbWV0aG9kUGx1Z2luX3RleHQ9TWV0b2RlLXBsdWdpbg0KLW1pbGVzdG9uZV90ZXh0PU1pbGVwXHUwMGU2bA0KLW91dGNvbWVfdGV4dD1SZXN1bHRhdA0KLXBoYXNlX3RleHQ9RmFzZQ0KLXByYWN0aWNlX3RleHQ9XHUwMGQ4dmVsc2UNCi1wcm9jZXNzX3RleHQ9UHJvY2VzDQotcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0PUZvcnNrZWxzcHJvY2VzDQotcHJvY2Vzc0ZhbWlseV90ZXh0PVByb2Nlc2ZhbWlsaWUNCi1wcm9jZXNzUGFja2FnZV90ZXh0PVByb2Nlc3Bha2tlDQotcmVwb3J0X3RleHQ9UmFwcG9ydA0KLXJldXNhYmxlQXNzZXRfdGV4dD1HZW5hbnZlbmRlbGlndCBha3Rpdg0KLXJvYWRtYXBfdGV4dD1WZWp2aXNlcg0KLXJvbGVEZXNjcmlwdG9yX3RleHQ9Um9sbGVkZXNrcmlwdG9yDQotcm9sZV90ZXh0PVJvbGxlDQotcm9sZVNldF90ZXh0PVJvbGxlc1x1MDBlNnQNCi1yb2xlU2V0R3JvdXBpbmdfdGV4dD1Sb2xsZXNcdTAwZTZ0c2dydXBwZXJpbmcNCi1zdGFuZGFyZENhdGVnb3J5X3RleHQ9U3RhbmRhcmRrYXRlZ29yaQ0KLXN0ZXBfdGV4dD1UcmluDQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ9U3RcdTAwZjh0dGVtYXRlcmlhbGUNCi10YXNrX3RleHQ9T3BnYXZlDQotdGFza0Rlc2NyaXB0b3JfdGV4dD1PcGdhdmVkZXNrcmlwdG9yDQotdGVhbVByb2ZpbGVfdGV4dD1UZWFtcHJvZmlsDQotdGVtcGxhdGVfdGV4dD1Ta2FiZWxvbg0KLXRlcm1EZWZpbml0aW9uX3RleHQ9VGVybWRlZmluaXRpb24NCi10b29sX3RleHQ9Vlx1MDBlNnJrdFx1MDBmOGoNCi10b29sTWVudG9yX3RleHQ9Vlx1MDBlNnJrdFx1MDBmOGpzbWVudG9yDQotd2hpdGVwYXBlcl90ZXh0PUh2aWRib2cNCi13b3JrUHJvZHVjdF90ZXh0PUFyYmVqZHNwcm9kdWt0DQotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9QXJiZWpkc3Byb2R1a3RkZXNrcmlwdG9yDQotd29ya1Byb2R1Y3RFbGVtZW50X3RleHQ9QXJiZWpkc3Byb2R1a3RlbGVtZW50DQotd29ya1Byb2R1Y3RUeXBlX3RleHQ9QXJiZWpkc3Byb2R1a3R0eXBlDQotDQotIyBNZXRob2QgRWxlbWVudCBOYW1lcyAoUGx1cmFsKQ0KLWFjdGl2aXR5X3RleHRfcGx1cmFsPUFrdGl2aXRldGVyDQotYXJ0aWZhY3RfdGV4dF9wbHVyYWw9QXJ0ZWZha3Rlcg0KLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHRfcGx1cmFsPUZ1bmt0aW9uc21cdTAwZjhuc3RyZQ0KLWNoZWNrbGlzdF90ZXh0X3BsdXJhbD1UamVrbGlzdGVyDQotY2hlY2tJdGVtX3RleHRfcGx1cmFsPUtvbnRyb2xlbGVtZW50ZXINCi1jb21wb3NpdGVSb2xlX3RleHRfcGx1cmFsPVNhbW1lbnNhdHRlIHJvbGxlcg0KLWNvbmNlcHRfdGV4dF9wbHVyYWw9QmVncmViZXINCi1jb250ZW50UGFja2FnZV90ZXh0X3BsdXJhbD1JbmRob2xkc3Bha2tlcg0KLWN1c3RvbUNhdGVnb3J5X3RleHRfcGx1cmFsPVRpbHBhc3NlZGUga2F0ZWdvcmllcg0KLWRlbGl2ZXJhYmxlX3RleHRfcGx1cmFsPUxldmVyYW5jZXINCi1kZWxpdmVyeVByb2Nlc3NfdGV4dF9wbHVyYWw9TGV2ZXJpbmdzcHJvY2Vzc2VyDQotZGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1EZXNrcmlwdG9yZXINCi1kaXNjaXBsaW5lX3RleHRfcGx1cmFsPURpc2NpcGxpbmVyDQotZGlzY2lwbGluZUdyb3VwaW5nX3RleHRfcGx1cmFsPURpc2NpcGxpbmdydXBwZXJpbmcNCi1kb21haW5fdGV4dF9wbHVyYWw9RG9tXHUwMGU2bmVyDQotZXN0aW1hdGVfdGV4dF9wbHVyYWw9RXN0aW1hdGVyDQotZXN0aW1hdGluZ01ldHJpY190ZXh0X3BsdXJhbD1Fc3RpbWVyaW5nc21cdTAwZTVsZXN5c3RlbWVyDQotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHRfcGx1cmFsPUVzdGltZXJpbmdzb3ZlcnZlamVsc2VyDQotZXhhbXBsZV90ZXh0X3BsdXJhbD1Fa3NlbXBsZXINCi1ndWlkYW5jZV90ZXh0X3BsdXJhbD1WZWpsZWRuaW5nZXINCi1ndWlkZWxpbmVfdGV4dF9wbHVyYWw9UmV0bmluZ3NsaW5qZXINCi1pdGVyYXRpb25fdGV4dF9wbHVyYWw9R2VudGFnZWxzZXINCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHRfcGx1cmFsPU1ldG9kZWtvbmZpZ3VyYXRpb25lcg0KLW1ldGhvZENvbnRlbnRfdGV4dF9wbHVyYWw9TWV0b2RlaW5kaG9sZA0KLW1ldGhvZExpYnJhcnlfdGV4dF9wbHVyYWw9TWV0b2RlYmlibGlvdGVrZXINCi1tZXRob2RQYWNrYWdlX3RleHRfcGx1cmFsPU1ldG9kZXBha2tlcg0KLW1ldGhvZFBsdWdpbl90ZXh0X3BsdXJhbD1NZXRvZGUtcGx1Z2lucw0KLW1pbGVzdG9uZV90ZXh0X3BsdXJhbD1NaWxlcFx1MDBlNmxlDQotb3V0Y29tZV90ZXh0X3BsdXJhbD1SZXN1bHRhdGVyDQotcGhhc2VfdGV4dF9wbHVyYWw9RmFzZXINCi1wcmFjdGljZV90ZXh0X3BsdXJhbD1cdTAwZDh2ZWxzZXINCi1wcm9jZXNzX3RleHRfcGx1cmFsPVByb2Nlc3Nlcg0KLXByb2Nlc3NDb250cmlidXRpb25fdGV4dF9wbHVyYWw9Rm9yc2tlbHNwcm9jZXNzZXINCi1wcm9jZXNzRmFtaWx5X3RleHRfcGx1cmFsPVByb2Nlc2ZhbWlsaWVyDQotcHJvY2Vzc1BhY2thZ2VfdGV4dF9wbHVyYWw9UHJvY2VzcGFra2VyDQotcmVwb3J0X3RleHRfcGx1cmFsPVJhcHBvcnRlcg0KLXJldXNhYmxlQXNzZXRfdGV4dF9wbHVyYWw9R2VuYW52ZW5kZWxpZ2UgYWt0aXZlcg0KLXJvYWRtYXBfdGV4dF9wbHVyYWw9VmVqdmlzZXJlDQotcm9sZURlc2NyaXB0b3JfdGV4dF9wbHVyYWw9Um9sbGVkZXNrcmlwdG9yZXINCi1yb2xlX3RleHRfcGx1cmFsPVJvbGxlcg0KLXJvbGVTZXRfdGV4dF9wbHVyYWw9Um9sbGVzXHUwMGU2dA0KLXJvbGVTZXRHcm91cGluZ190ZXh0X3BsdXJhbD1Sb2xsZXNcdTAwZTZ0c2dydXBwZXJpbmdlcg0KLXN0YW5kYXJkQ2F0ZWdvcnlfdGV4dF9wbHVyYWw9U3RhbmRhcmRrYXRlZ29yaWVyDQotc3RlcF90ZXh0X3BsdXJhbD1UcmluDQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHRfcGx1cmFsPVN0XHUwMGY4dHRlbWF0ZXJpYWxlDQotdGFza190ZXh0X3BsdXJhbD1PcGdhdmVyDQotdGFza0Rlc2NyaXB0b3JfdGV4dF9wbHVyYWw9T3BnYXZlZGVza3JpcHRvcmVyDQotdGVhbVByb2ZpbGVfdGV4dF9wbHVyYWw9VGVhbXByb2ZpbGVyDQotdGVtcGxhdGVfdGV4dF9wbHVyYWw9U2thYmVsb25lcg0KLXRlcm1EZWZpbml0aW9uX3RleHRfcGx1cmFsPVVkdHJ5a3NkZWZpbml0aW9uZXINCi10b29sX3RleHRfcGx1cmFsPVZcdTAwZTZya3RcdTAwZjhqZXINCi10b29sTWVudG9yX3RleHRfcGx1cmFsPVZcdTAwZTZya3RcdTAwZjhqc21lbnRvcmVyDQotd2hpdGVwYXBlcl90ZXh0X3BsdXJhbD1IdmlkYlx1MDBmOGdlcg0KLXdvcmtQcm9kdWN0X3RleHRfcGx1cmFsPUFyYmVqZHNwcm9kdWt0ZXINCi13b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dF9wbHVyYWw9QXJiZWpkc3Byb2R1a3RkZXNrcmlwdG9yZXINCi13b3JrUHJvZHVjdEVsZW1lbnRfdGV4dF9wbHVyYWw9QXJiZWpkc3Byb2R1a3RlbGVtZW50ZXINCi13b3JrUHJvZHVjdFR5cGVfdGV4dF9wbHVyYWw9QXJiZWpkc3Byb2R1a3R0eXBlcg0KLQ0KLSMgQXBwbGljYXRpb24gdGl0bGUuDQotYXBwbGljYXRpb25fdGl0bGU9ezB9IC0gezF9DQotDQotIyBPcGVuIE1ldGhvZCBMaWJyYXJ5IERpYWxvZw0KLW9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlPVx1MDBjNWJuIG1ldG9kZWJpYmxpb3Rlaw0KLW9wZW5MaWJyYXJ5RGlhbG9nQXJlYV90aXRsZT1WXHUwMGU2bGcgZXQgbWV0b2RlYmlibGlvdGVrDQotb3BlbkxpYnJhcnlEaWFsb2dBcmVhX3RleHQ9ezB9IGdlbW1lciBtZXRvZGVyIG9nIHByb2Nlc3NlciBpIGVuIGZvbGRlciwgXG5zb20ga2FsZGVzIGV0IG1ldG9kZWJpYmxpb3Rlay4gVlx1MDBlNmxnIGVuIG1ldG9kZWJpYmxpb3Rla3Nmb2xkZXIsIHNvbSBkdSB2aWwgYnJ1Z2UgdGlsIGRlbm5lIHNlc3Npb24uDQotbGlicmFyeUxhYmVsX3RleHQ9QmlibGlvdGVrOg0KLWJyb3dzZUJ1dHRvbl90ZXh0PUdlbm5lbXNlLi4uDQotcHJvbXB0Rm9yTGlicmFyeUNoZWNrYm94X3RleHQ9QnJ1ZyBkZXR0ZSBzb20gc3RhbmRhcmQsIG9nIHNwXHUwMGY4cmcgaWtrZSBpZ2VuLg0KLW9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dD1EZXIgZXIgaWtrZSBub2dldCBtZXRvZGViaWJsaW90ZWsgaSAnJ3swfScnLlxuRGVyIG9wcmV0dGVzIG9nIFx1MDBlNWJuZXMgZXQgbnl0IG1ldG9kZWJpYmxpb3RlayBpIGRldCBhbmdpdm5lIGJpYmxpb3Rlay5cblxuS2xpayBwXHUwMGU1IE9LIGZvciBhdCBmb3J0c1x1MDBlNnR0ZSBlbGxlciBBbm51bGxcdTAwZTlyIGZvciBhdCBhbmdpdmUgZW4gYW5kZW4gc3RpIHRpbCBtZXRvZGViaWJsaW90ZWtldC4NCi0NCi0jIFNlbGVjdCBNZXRob2QgTGlicmFyeSBGb2xkZXIgRGlhbG9nDQotc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190aXRsZT1WXHUwMGU2bGcgbWV0b2RlYmlibGlvdGVrDQotc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190ZXh0PVZcdTAwZTZsZyBlbiBtZXRvZGViaWJsaW90ZWtzZm9sZGVyLg0KLQ0KLSMgT3BlbiBMaWJyYXJ5IFByb2dyZXNzIE1lc3NhZ2UNCi1vcGVuaW5nTGlicmFyeVRhc2tfbmFtZT1cdTAwYzVibmVyIG1ldG9kZWJpYmxpb3Rlay4uLg0KLQ0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBFcnJvciBEaWFsb2cNCi1pbnZhbGlkTGlicmFyeVBhdGhfbXNnPUlVUEwwMzAwRTogRGV0IGFuZ2l2bmUgbWV0b2RlYmlibGlvdGVrIGthbiBpa2tlIFx1MDBlNWJuZXMuDQotaW52YWxpZExpYnJhcnlQYXRoX3JlYXNvbj1EZW4gdmFsZ3RlIG1ldG9kZWJpYmxpb3Rla3Nmb2xkZXIgZXIgdWd5bGRpZywgZWxsZXIgZHUgaGFyIGlra2UgZGVuIHJldHRlIHRpbGxhZGVsc2UgdGlsIGF0IGZcdTAwZTUgYWRnYW5nIHRpbCBkZW4uXG5cbktsaWsgcFx1MDBlNSBPSyBmb3IgYXQgdlx1MDBlNmxnZSBlbiBhbmRlbiBiaWJsaW90ZWtzZm9sZGVyLg0KLQ0KLSMgTGlicmFyeSBMb2NrZWQgRXJyb3IgRGlhbG9nDQotbGlicmFyeUxvY2tlZF9tc2c9SVVQTDAzMDNFOiBEZXQgYW5naXZuZSBtZXRvZGViaWJsaW90ZWsga2FuIGlra2UgXHUwMGU1Ym5lcy5cblxuRGV0IGFuZ2l2bmUgbWV0b2RlYmlibGlvdGVrIGVyIG11bGlnaGVkIGFsbGVyZWRlIGkgYnJ1Zy4gS2xpayBwXHUwMGU1IEFubnVsbFx1MDBlOXIgZm9yIGF0IHZcdTAwZTZsZ2UgZW4gYW5kZW4gYmlibGlvdGVrc2ZvbGRlciwgZWxsZXIga2xpayBwXHUwMGU1IEdlbm5lbXR2aW5nIFx1MDBlNWJuaW5nIGZvciBhdCBcdTAwZTVibmUgYmlibGlvdGVrZXQgYWxsaWdldmVsLlxuXG5BZHZhcnNlbDogU2FtdGlkaWcgYnJ1ZyBhZiBldCBtZXRvZGViaWJsaW90ZWsga2FuIGJlc2thZGlnZSBiaWJsaW90ZWtldC4NCi1saWJyYXJ5TG9ja2VkX29wZW5CdXR0b25fdGV4dD1HZW5uZW10dmluZyBcdTAwZTVibmluZw0KLQ0KLSMgUmVhZC1vbmx5IFByb2plY3QgRmlsZSBFcnJvciBEaWFsb2cNCi1yZWFkT25seVByb2plY3RGaWxlX3RleHQ9SVVQTDAzMDJFOiAnJ3swfScnIGVyIHNrcml2ZWJlc2t5dHRldC4gR1x1MDBmOHIgZGV0IHJlZGlnXHUwMGU5cmJhcnQsIGZcdTAwZjhyIGR1IGZvcnRzXHUwMGU2dHRlci4NCi1yZXRyeUJ1dHRvbl90ZXh0PVByXHUwMGY4diBpZ2VuDQotY2FuY2VsQnV0dG9uX3RleHQ9QW5udWxsXHUwMGU5cg0KLQ0KLSMgVmVyc2lvbiBNaXNtYXRjaCBEaWFsb2cNCi12ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dD1JVVBMMzA1RTogRGV0IHZhbGd0ZSBiaWJsaW90ZWsga2FuIGlra2UgXHUwMGU1Ym5lcy4gRHUgc2thbCBvcGdyYWRlcmUgezB9IHRpbCB2ZXJzaW9uIHsxfSBlbGxlciBueWVyZSBmb3IgYXQga3VubmUgXHUwMGU1Ym5lIGRldHRlIGJpYmxpb3Rlay4NCi12ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dF91bmtub3duPUlVUEwzMDZFOiBEZXQgdmFsZ3RlIGJpYmxpb3RlayBrYW4gaWtrZSBcdTAwZTVibmVzLiBEdSBza2FsIG9wZ3JhZGVyZSB7MH0gdGlsIGVuIG55ZXJlIHZlcnNpb24gZm9yIGF0IGt1bm5lIFx1MDBlNWJuZSBkZXR0ZSBiaWJsaW90ZWsuDQotDQotIyBVcGdyYWRlIE1ldGhvZCBMaWJyYXJ5IERpYWxvZw0KLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPU9wZ3JhZFx1MDBlOXIgbWV0b2RlYmlibGlvdGVrDQotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGV4dD1EZXQgdmFsZ3RlIGJpYmxpb3RlayBza2FsIG9wZ3JhZGVyZXMgdGlsIGRlbiBueWUgYmlibGlvdGVrc3N0cnVrdHVyLiBcblxuVmlsIGR1IGZvcmV0YWdlIGRlbm5lIG9wZ3JhZGVyaW5nPw0KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9T3BncmFkZXJlciBtZXRvZGViaWJsaW90ZWsuLi4NCi0NCi0jIFVwZ3JhZGUgTGlicmFyeSBFcnJvciBEaWFsb2cNCi11cGdyYWRlTGlicmFyeUVycm9yX21zZz1JVVBMMDMwMUU6IE1ldG9kZWJpYmxpb3Rla2V0IGthbiBpa2tlIG9wZ3JhZGVyZXMuIERlciBlciBmbGVyZSBvcGx5c25pbmdlciBpIGxvZ2ZpbGVuLg0KLQ0KLSMgU3dpdGNoIENvbmZpZ3VyYXRpb24gRGlhbG9nDQotc3dpdGNoQ29uZmlnRGlhbG9nX3RpdGxlPVNraWZ0IGtvbmZpZ3VyYXRpb24NCi1zd2l0Y2hDb25maWdEaWFsb2dfdGV4dD1WaWwgZHUgc2tpZnRlIGRlbiBha3R1ZWxsZSBrb25maWd1cmF0aW9uIHRpbCBzdGFuZGFyZGtvbmZpZ3VyYXRpb25lbiAnJ3swfScnLCBzb20gZXIga255dHRldCB0aWwgZGVuIHZhbGd0ZSBwcm9jZXM/DQotCQ0KLSMgQ29uZmlndXJhdGlvbiBDb21ibw0KLWN1cnJlbnRDb25maWdMYWJlbF90ZXh0PUFrdHVlbCBrb25maWd1cmF0aW9uOg0KLXNlbGVjdENvbmZpZ0xhYmVsX3RleHQ9Vlx1MDBlNmxnIGVuIGtvbmZpZ3VyYXRpb24NCi0NCi0jIERlbGV0ZSBGaWxlcyBDb25maXJtYXRpb24gTWVzc2FnZQ0KLWRlbGV0ZUZpbGVzQ29uZmlybWF0aW9uX21zZz1TdGllbiAnJ3swfScnIGZpbmRlcyBhbGxlcmVkZS4gQWxsZSBmaWxlciBpIGZvbGRlcmVuIGJsaXZlciBzbGV0dGV0LiBWaWwgZHUgZm9ydHNcdTAwZTZ0dGU/DQotDQotIyBQYXRocy9GaWxlcyBFcnJvciBNZXNzYWdlcw0KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPVN0aWVuICcnezB9JycgaW5kZWhvbGRlciBlbiBlbGxlciBmbGVyZSBmaWxlciwgc29tIGlra2Uga2FuIHNsZXR0ZXMuXG5cblZcdTAwZTZsZyBlbiBhbmRlbiBzdGksIG9nIHByXHUwMGY4diBpZ2VuLg0KLWNyZWF0ZVBhdGhFcnJvcl9yZWFzb249S2FuIGlra2Ugb3ByZXR0ZSBzdGllbiAnJ3swfScnLlxuXG5WXHUwMGU2bGcgZW4gYW5kZW4gc3RpLCBvZyBwclx1MDBmOHYgaWdlbi4NCi1pbnZhbGlkUGF0aF9tc2c9U3RpZW4gZXIgaWtrZSBneWxkaWcuDQotDQotIyBCYWNrdXAgTGlicmFyeSBEaWFsb2cNCi1iYWNrdXBMaWJyYXJ5RGlhbG9nX3RpdGxlPVNpa2tlcmhlZHNrb3BpYmlibGlvdGVrDQotYmFja3VwTGlicmFyeURpYWxvZ190ZXh0PURldCBhbmJlZmFsZXMsIGF0IGR1IHNpa2tlcmhlZHNrb3BpZXJlciBkZXQgYWt0dWVsbGUgbWV0b2RlYmlibGlvdGVrLCBmXHUwMGY4ciBkdSBmb3J0c1x1MDBlNnR0ZXIuXG5cbktsaWsgcFx1MDBlNSBPSyBmb3IgYXQgb3ByZXR0ZSBlbiBzaWtrZXJoZWRza29waSBhZiBiaWJsaW90ZWtldCBpIGRldCBhbmdpdm5lIGJpYmxpb3Rlay4gS2xpayBwXHUwMGU1IFNwcmluZyBvdmVyIGZvciBhdCBmb3J0c1x1MDBlNnR0ZSB1ZGVuIGF0IHNpa2tlcmhlZHNrb3BpZXJlLg0KLWJhY2tpbmdVcExpYnJhcnlUYXNrX25hbWU9T3ByZXR0ZXIgZW4gc2lra2VyaGVkc2tvcGkgYWYgYmlibGlvdGVrc2ZpbGVyLi4uDQotDQotIyBQYXRoIFNlbGVjdGlvbiBEaWFsb2cNCi1wYXRoU2VsZWN0aW9uRXJyb3JfbXNnPUthbiBpa2tlIG9wcmV0dGUgYmlibGlvdGVrDQotb2tCdXR0b25fdGV4dD1PSw0KLXNraXBCdXR0b25fdGV4dD1TcHJpbmcgb3Zlcg0KLQ0KLSMgUHJvY2VzcyBFZGl0b3IgcHJlZmVyZW5jZXMNCi1hbHdheXNCdXR0b25fdGV4dD1BbHRpZA0KLW5ldmVyQnV0dG9uX3RleHQ9QWxkcmlnDQotcHJvbXB0QnV0dG9uX3RleHQ9U3BcdTAwZjhyZw0KLQ0KLSMgQWRkIExpbmsgRGlhbG9nDQotbGlua1RvVVJMX25hbWU9VVJMDQotbGlua1RvRmlsZV9uYW1lPUZpbA0KLWVsZW1lbnRMaW5rX25hbWU9TWV0b2RlZWxlbWVudA0KLWVsZW1lbnRMaW5rV2l0aFR5cGVfbmFtZT1NZXRvZGVlbGVtZW50IG1lZCB0eXBlcHJcdTAwZTZmaWtzDQotZWxlbWVudExpbmtXaXRoVXNlclRleHRfbmFtZT1NZXRvZGVlbGVtZW50IG1lZCB0aWxwYXNzZXQgdGVrc3QNCi0NCi0jIENvbnZlcnQgQWN0aXZpdHkgVHlwZSBEaWFsb2cNCi1jb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGl0bGU9S29udmVydFx1MDBlOXIgYWt0aXZpdGV0c3R5cGUNCi1jb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGV4dD1WXHUwMGU2bGcgbVx1MDBlNWxha3Rpdml0ZXRzdHlwZW4uDQotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfbXNnPUlVUEwwMzA0RTogQWt0aXZpdGV0ZW4ga2FuIGlra2Uga29udmVydGVyZXMgdGlsIGVuIGFuZGVuIHR5cGUuDQotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfcmVhc29uPURlciBlciBpbmdlbiBrb21wYXRpYmVsIGFrdGl2aXRldHN0eXBlIGZvciB7MH0uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGY0NmQ2MC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZmOGUwNzkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgTGlicmFyeSBYTUkgKE5MMSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmU3YjAxMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmRkYzIxNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIFhNSS1CaWJsaW90aGVrDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDhmMTk4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9QmlibGlvdGVjYSBYTUkgZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjI0ZWI5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9QmlibGlvdGhcdTAwZThxdWUgWE1ZIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9wbHVnaW5faXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9wbHVnaW5faXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTRiZTU3NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUxpYnJlcmlhIFhNSSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgyNjFlYTQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgWE1JIExpYnJhcnkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY4Y2Y0OWYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgWE1JIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYw0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2QwYjhhYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUJpYmxpb3RlY2EgRVBGIFhNSQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzE5NjBkZi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBYTUkgXHU1ZTkzDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MjYxZWE0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFhNSSBMaWJyYXJ5DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjJhYTA3NS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZpbGVQYXRoPURhdGVpcGZhZA0KLWNhbm5vdFdyaXRlVG9GaWxlcz1TY2hyZWliZW4gaW4gRGF0ZWkoZW4pIGlzdCBuaWNodCBtXHUwMGY2Z2xpY2guDQotcmVhZE9ubHlGaWxlc190aXRsZT1TY2hyZWliZ2VzY2hcdTAwZmN0enRlIERhdGVpKGVuKQ0KLXJlYWRPbmx5RmlsZXNfbXNnPURpZSBEYXRlaWVuIHVudGVyIERldGFpbHMgc2luZCBzY2hyZWliZ2VzY2hcdTAwZmN0enQuIEhlYmVuIFNpZSBkZW4gU2NocmVpYnNjaHV0eiBhdWYsIHVuZCBrbGlja2VuIFNpZSBhdWYgV2llZGVyaG9sZW4sIHVtIGZvcnR6dWZhaHJlbi4NCi1lbGVtZW50UGF0aD1FbGVtZW50cGZhZA0KLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb01pc3NpbmdGaWxlc19tc2c9RGllIGZvbGdlbmRlbiBEYXRlaWVuIGZlaGxlbi4gS2xpY2tlbiBTaWUgYXVmIE9LLCB3ZW5uIFNpZSBhbGxlIFJlZmVyZW56ZW4gYXVmIGRpZSBhdXNnZXdcdTAwZTRobHRlbiBEYXRlaWVuIGluIGRlciBCaWJsaW90aGVrIGxcdTAwZjZzY2hlbiBtXHUwMGY2Y2h0ZW4uDQotbWlzc2luZ0ZpbGVzX3RpdGxlPUZlaGxlbmRlIERhdGVpKGVuKQ0KLWxvYWRFcnJvcj1GZWhsZXIgYmVpbSBMYWRlbg0KLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb0ZpbGVzV2l0aExvYWRFcnJvcnNfbXNnPURpZSBmb2xnZW5kZW4gRGF0ZWllbiBrXHUwMGY2bm5lbiBuaWNodCBnZWxhZGVuIHdlcmRlbi4gS2xpY2tlbiBTaWUgYXVmIE9LLCB3ZW5uIFNpZSBhbGxlIFJlZmVyZW56ZW4gYXVmIGRpZSBhdXNnZXdcdTAwZTRobHRlbiBEYXRlaWVuIGluIGRlciBCaWJsaW90aGVrIGxcdTAwZjZzY2hlbiBtXHUwMGY2Y2h0ZW4uDQotZmlsZXNXaXRoTG9hZEVycm9yc190aXRsZT1EYXRlaShlbikgbWl0IEZlaGxlcm4gYmVpbSBMYWRlbg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI5Nzg0ZTQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1maWxlUGF0aD1WXHUwMGVkYSBkZSBhY2Nlc28gZGUgYXJjaGl2byhzKQ0KLWNhbm5vdFdyaXRlVG9GaWxlcz1ObyBzZSBwdWVkZSBlc2NyaWJpciBlbiBlbCBhcmNoaXZvIG8gYXJjaGl2b3MNCi1yZWFkT25seUZpbGVzX3RpdGxlPUFyY2hpdm8ocykgc29sYW1lbnRlIGRlIGxlY3R1cmENCi1yZWFkT25seUZpbGVzX21zZz1Mb3MgYXJjaGl2b3MgbGlzdGFkb3MgZW4gRGV0YWxsZXMgc29uIHNvbGFtZW50ZSBkZSBsZWN0dXJhLiBIXHUwMGUxZ2Fsb3Mgc29icmVlc2NyaWJpYmxlcyB5IHB1bHNlIGVuIFJlaW50ZW50YXIgcGFyYSBjb250aW51YXIuDQotZWxlbWVudFBhdGg9Vlx1MDBlZGEgZGUgYWNjZXNvIGEgZWxlbWVudG8NCi1wcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9NaXNzaW5nRmlsZXNfbXNnPUZhbHRhbiBsb3MgYXJjaGl2b3Mgc2lndWllbnRlcy4gUHVsc2UgQWNlcHRhciBzaSBkZXNlYSBlbGltaW5hciBjdWFscXVpZXIgcmVmZXJlbmNpYSBhIGxvcyBhcmNoaXZvcyBzZWxlY2Npb25hZG9zIGVuIGxhIGJpYmxpb3RlY2ENCi1taXNzaW5nRmlsZXNfdGl0bGU9QXJjaGl2b3MgcXVlIGZhbHRhbg0KLWxvYWRFcnJvcj1FcnJvciBkZSBjYXJnYQ0KLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb0ZpbGVzV2l0aExvYWRFcnJvcnNfbXNnPU5vIHNlIGhhbiBwb2RpZG8gY2FyZ2FyIGxvcyBhcmNoaXZvcyBzaWd1aWVudGVzLiBQdWxzZSBBY2VwdGFyIHNpIGRlc2VhIGVsaW1pbmFyIGN1YWxxdWllciByZWZlcmVuY2lhIGEgbG9zIGFyY2hpdm9zIHNlbGVjY2lvbmFkb3MgZW4gbGEgYmlibGlvdGVjYQ0KLWZpbGVzV2l0aExvYWRFcnJvcnNfdGl0bGU9QXJjaGl2byhzKSBjb24gZXJyb3JlcyBkZSBjYXJnYQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5ZDUwYTkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1maWxlUGF0aD1DaGVtaW4gZCdhY2NcdTAwZThzIGR1IGZpY2hpZXINCi1jYW5ub3RXcml0ZVRvRmlsZXM9SW1wb3NzaWJsZSBkJ2VucmVnaXN0cmVyIGRhbnMgbGUocykgZmljaGllcihzKQ0KLXJlYWRPbmx5RmlsZXNfdGl0bGU9RmljaGllcihzKSBlbiBsZWN0dXJlIHNldWxlbWVudA0KLXJlYWRPbmx5RmlsZXNfbXNnPUxlcyBmaWNoaWVycyByXHUwMGU5cGVydG9yaVx1MDBlOXMgZGFucyBEXHUwMGU5dGFpbHMgc29udCBlbiBsZWN0dXJlIHNldWxlbWVudC4gUmVuZGV6LWxlcyBpbnNjcmlwdGlibGVzIGV0IGNsaXF1ZXogc3VyIFJcdTAwZTllc3NheWVyIHBvdXIgY29udGludWVyLg0KLWVsZW1lbnRQYXRoPUNoZW1pbiBkJ2FjY1x1MDBlOHMgZGUgbCdcdTAwZTlsXHUwMGU5bWVudA0KLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb01pc3NpbmdGaWxlc19tc2c9TGVzIGZpY2hpZXJzIHN1aXZhbnRzIHNvbnQgbWFucXVhbnRzLiBDbGlxdWV6IHN1ciBPSyBzaSB2b3VzIHZvdWxleiBzdXBwcmltZXIgY2hhcXVlIHJcdTAwZTlmXHUwMGU5cmVuY2UgYXV4IGZpY2hpZXJzIHNcdTAwZTlsZWN0aW9ublx1MDBlOXMgZGFucyBsYSBiaWJsaW90aFx1MDBlOHF1ZQ0KLW1pc3NpbmdGaWxlc190aXRsZT1GaWNoaWVyKHMpIG1hbnF1YW50KHMpDQotbG9hZEVycm9yPUVycmV1ciBkZSBjaGFyZ2VtZW50DQotcHJvbXB0UmVtb3ZlUmVmZXJlbmNlc1RvRmlsZXNXaXRoTG9hZEVycm9yc19tc2c9SW1wb3NzaWJsZSBkZSBjaGFyZ2VyIGxlKHMpIGZpY2hpZXIocykgc3VpdmFudChzKS4gQ2xpcXVleiBzdXIgT0sgc2kgdm91cyB2b3VsZXogc3VwcHJpbWVyIGNoYXF1ZSByXHUwMGU5Zlx1MDBlOXJlbmNlIGF1eCBmaWNoaWVycyBzXHUwMGU5bGVjdGlvbm5cdTAwZTlzIGRhbnMgbGEgYmlibGlvdGhcdTAwZThxdWUNCi1maWxlc1dpdGhMb2FkRXJyb3JzX3RpdGxlPUZpY2hpZXIocykgcHJcdTAwZTlzZW50YW50IHVuZSBlcnJldXIgZGUgY2hhcmdlbWVudA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0NjZlZTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1maWxlUGF0aD1QZXJjb3JzbyBmaWxlDQotY2Fubm90V3JpdGVUb0ZpbGVzPUltcG9zc2liaWxlIHNjcml2ZXJlIHN1aSBmaWxlDQotcmVhZE9ubHlGaWxlc190aXRsZT1GaWxlIGEgc29sYSBsZXR0dXJhDQotcmVhZE9ubHlGaWxlc19tc2c9SSBmaWxlIGVsZW5jYXRpIGluIERldHRhZ2xpIHNvbm8gYSBzb2xhIGxldHR1cmEuIFJlbmRlcmxpIGFjY2Vzc2liaWxpIGluIHNjcml0dHVyYSBlIGUgZmFyZSBjbGljIHN1IFJpcHJvdmEgcGVyIGNvbnRpbnVhcmUuDQotZWxlbWVudFBhdGg9UGVyY29yc28gZWxlbWVudG8NCi1wcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9NaXNzaW5nRmlsZXNfbXNnPU1hbmNhbm8gaSBzZWd1ZW50aSBmaWxlLiBGYXJlIGNsaWMgc3UgT0sgcGVyIGVsaW1pbmFyZSB0dXR0aSBpIHJpZmVyaW1lbnRpIGFpIGZpbGUgc2VsZXppb25hdGkgbmVsbGEgbGlicmVyaWEuDQotbWlzc2luZ0ZpbGVzX3RpdGxlPUZpbGUgbWFuY2FudGkNCi1sb2FkRXJyb3I9RXJyb3JlIGRpIGNhcmljYW1lbnRvDQotcHJvbXB0UmVtb3ZlUmVmZXJlbmNlc1RvRmlsZXNXaXRoTG9hZEVycm9yc19tc2c9SW1wb3NzaWJpbGUgY2FyaWNhcmUgaSBzZWd1ZW50aSBmaWxlLiBGYXJlIAdjbGljIHN1IE9LIHBlciBlbGltaW5hcmUgdHV0dGkgaSByaWZlcmltZW50aSBhaSBmaWxlIHNlbGV6aW9uYXRpIG5lbGxhIGxpYnJlcmlhLg0KLWZpbGVzV2l0aExvYWRFcnJvcnNfdGl0bGU9RmlsZSBjb24gZXJyb3JpIGRpIGNhcmljYW1lbnRvDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXNfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTljMjU5Yi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXNfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZpbGVQYXRoPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzBmYlx1MzBkMVx1MzBiOQ0KLWNhbm5vdFdyaXRlVG9GaWxlcz1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmJcdTY2ZjhcdTMwNGRcdThmYmNcdTMwODFcdTMwN2VcdTMwNWJcdTMwOTMNCi1yZWFkT25seUZpbGVzX3RpdGxlPVx1OGFhZFx1MzA3Zlx1NTNkNlx1MzA4YVx1NWMwMlx1NzUyOFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYg0KLXJlYWRPbmx5RmlsZXNfbXNnPVx1MzAwY1x1OGE3M1x1N2QzMFx1MzAwZFx1MzA2Ylx1MzBlYVx1MzBiOVx1MzBjOFx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2Zlx1OGFhZFx1MzA3Zlx1NTNkNlx1MzA4YVx1NWMwMlx1NzUyOFx1MzA2N1x1MzA1OVx1MzAwMlx1N2Q5YVx1ODg0Y1x1MzA1OVx1MzA4Ylx1MzA2Ylx1MzA2Zlx1MzAwMVx1NjZmOFx1MzA0ZFx1OGZiY1x1MzA3Zlx1NTNlZlx1ODBmZFx1MzA2Ylx1MzA1N1x1MzA2Nlx1MzA0Ylx1MzA4OVx1MzAwY1x1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLWVsZW1lbnRQYXRoPVx1ODk4MVx1N2QyMFx1MzBkMVx1MzBiOQ0KLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb01pc3NpbmdGaWxlc19tc2c9XHU2YjIxXHUzMDZlXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHU1MTg1XHUzMDZlXHU5MDc4XHU2MjllXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDc4XHUzMDZlXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZlXHU1M2MyXHU3MTY3XHUzMDkyXHU1MjRhXHU5NjY0XHUzMDU5XHUzMDhiXHUzMDZiXHUzMDZmXHUzMDBjT0tcdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1taXNzaW5nRmlsZXNfdGl0bGU9XHU2YjIwXHU4NDNkXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViDQotbG9hZEVycm9yPVx1MzBlZFx1MzBmY1x1MzBjOVx1MzBmYlx1MzBhOFx1MzBlOVx1MzBmYw0KLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb0ZpbGVzV2l0aExvYWRFcnJvcnNfbXNnPVx1NmIyMVx1MzA2ZVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1NTE4NVx1MzA2ZVx1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA3OFx1MzA2ZVx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2ZVx1NTNjMlx1NzE2N1x1MzA5Mlx1NTI0YVx1OTY2NFx1MzA1OVx1MzA4Ylx1MzA2Ylx1MzA2Zlx1MzAwY09LXHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotZmlsZXNXaXRoTG9hZEVycm9yc190aXRsZT1cdTMwZWRcdTMwZmNcdTMwYzlcdTMwZmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNmVcdTMwNDJcdTMwOGJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZmQzOTAzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotZmlsZVBhdGg9XHVkMzBjXHVjNzdjIFx1YWNiZFx1Yjg1Yw0KLWNhbm5vdFdyaXRlVG9GaWxlcz1cdWQzMGNcdWM3N2NcdWM1ZDAgXHVhZTMwXHViODVkXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuDQotcmVhZE9ubHlGaWxlc190aXRsZT1cdWM3N2RcdWFlMzAgXHVjODA0XHVjNmE5IFx1ZDMwY1x1Yzc3Yw0KLXJlYWRPbmx5RmlsZXNfbXNnPVx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZFx1YzVkMCBcdWIwOThcdWM1ZjRcdWI0MWMgXHVkMzBjXHVjNzdjXHVjNzc0IFx1Yzc3ZFx1YWUzMCBcdWM4MDRcdWM2YTlcdWM3ODVcdWIyYzhcdWIyZTQuIFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWM0ZjBcdWFlMzAgXHVhYzAwXHViMmE1XHVjNzNjXHViODVjIFx1YjljY1x1YjRlNFx1YWNlMCBcdWM3YWNcdWMyZGNcdWIzYzRcdWI5N2MgXHVkMDc0XHViOWFkXHVkNTU4XHVjNWVjIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1lbGVtZW50UGF0aD1cdWM2OTRcdWMxOGMgXHVhY2JkXHViODVjDQotcHJvbXB0UmVtb3ZlUmVmZXJlbmNlc1RvTWlzc2luZ0ZpbGVzX21zZz1cdWIyZTRcdWM3NGMgXHVkMzBjXHVjNzdjXHVjNzc0IFx1YjIwNFx1Yjc3ZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4gXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVjNWQwXHVjMTFjIFx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWQzMGNcdWM3N2NcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YmFhOFx1YjRlMCBcdWNjMzhcdWM4NzBcdWI5N2MgXHVjODFjXHVhYzcwXHVkNTU4XHViODI0XHViYTc0IFx1ZDY1NVx1Yzc3OFx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotbWlzc2luZ0ZpbGVzX3RpdGxlPVx1YjIwNFx1Yjc3ZFx1YjQxYyBcdWQzMGNcdWM3N2MNCi1sb2FkRXJyb3I9XHViODVjXHViNGRjIFx1YzYyNFx1Yjk1OA0KLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb0ZpbGVzV2l0aExvYWRFcnJvcnNfbXNnPVx1YjJlNFx1Yzc0YyBcdWQzMGNcdWM3N2NcdWM3NDQgXHViODVjXHViNGRjXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YzVkMFx1YzExYyBcdWMxMjBcdWQwZGRcdWQ1NWMgXHVkMzBjXHVjNzdjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWJhYThcdWI0ZTAgXHVjYzM4XHVjODcwXHViOTdjIFx1YzgxY1x1YWM3MFx1ZDU1OFx1YjgyNFx1YmE3NCBcdWQ2NTVcdWM3NzhcdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWZpbGVzV2l0aExvYWRFcnJvcnNfdGl0bGU9XHViODVjXHViNGRjIFx1YzYyNFx1Yjk1OFx1YWMwMCBcdWJjMWNcdWMwZGRcdWQ1NWMgXHVkMzBjXHVjNzdjDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDk2Yzk1OC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZpbGVQYXRoPUNhbWluaG8gZG8gYXJxdWl2bw0KLWNhbm5vdFdyaXRlVG9GaWxlcz1OXHUwMGUzbyBcdTAwZTkgcG9zc1x1MDBlZHZlbCBncmF2YXIgbm8ocykgYXJxdWl2byhzKQ0KLXJlYWRPbmx5RmlsZXNfdGl0bGU9QXJxdWl2byhzKSBkZSBsZWl0dXJhDQotcmVhZE9ubHlGaWxlc19tc2c9T3MgYXJxdWl2b3MgbGlzdGFkb3Mgbm9zIERldGFsaGVzIHNcdTAwZTNvIGRlIGxlaXR1cmEuIFRvcm5lLW9zIGdyYXZcdTAwZTF2ZWlzIGUgY2xpcXVlIGVtIFRlbnRhciBOb3ZhbWVudGUgcGFyYSBjb250aW51YXIuDQotZWxlbWVudFBhdGg9Q2FtaW5obyBkZSBFbGVtZW50bw0KLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb01pc3NpbmdGaWxlc19tc2c9T3MgYXJxdWl2b3MgYSBzZWd1aXIgZXN0XHUwMGUzbyBhdXNlbnRlcy4gQ2xpcXVlIGVtIE9LIHNlIGRlc2VqYXIgcmVtb3ZlciB0b2RhcyBhcyByZWZlclx1MDBlYW5jaWFzIGFvcyBhcnF1aXZvcyBzZWxlY2lvbmFkb3MgbmEgYmlibGlvdGVjYQ0KLW1pc3NpbmdGaWxlc190aXRsZT1BcnF1aXZvKHMpIGF1c2VudGUocykNCi1sb2FkRXJyb3I9RXJybyBkZSBjYXJyZWdhbWVudG8NCi1wcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9GaWxlc1dpdGhMb2FkRXJyb3JzX21zZz1PKHMpIHNlZ3VpbnRlKHMpIGFycXVpdm8ocykgblx1MDBlM28gcFx1MDBmNGRlKHB1ZGVyYW0pIHNlciBjYXJyZWdhZG8ocykuIENsaXF1ZSBlbSBPSyBzZSBkZXNlamFyIHJlbW92ZXIgdG9kYXMgYXMgcmVmZXJcdTAwZWFuY2lhcyBhb3MgYXJxdWl2b3Mgc2VsZWNpb25hZG9zIG5hIGJpYmxpb3RlY2ENCi1maWxlc1dpdGhMb2FkRXJyb3JzX3RpdGxlPUFycXVpdm8ocykgY29tIGVycm8gZGUgY2FycmVnYW1lbnRvDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTc2MzhmOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWZpbGVQYXRoPVx1NjU4N1x1NGVmNlx1OGRlZlx1NWY4NA0KLWNhbm5vdFdyaXRlVG9GaWxlcz1cdTY1ZTBcdTZjZDVcdTUxOTlcdTUxNjVcdTY1ODdcdTRlZjYNCi1yZWFkT25seUZpbGVzX3RpdGxlPVx1NTNlYVx1OGJmYlx1NjU4N1x1NGVmNg0KLXJlYWRPbmx5RmlsZXNfbXNnPVx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1NGUyZFx1NjI0MFx1NTIxN1x1NzY4NFx1NjU4N1x1NGVmNlx1NjYyZlx1NTNlYVx1OGJmYlx1NjU4N1x1NGVmNlx1MzAwMlx1OGJmN1x1NGY3Zlx1NWI4M1x1NGVlY1x1NTNlZlx1NTE5OVx1NWU3Nlx1NTM1NVx1NTFmYlx1MjAxY1x1OTFjZFx1OGJkNVx1MjAxZFx1N2VlN1x1N2VlZFx1MzAwMg0KLWVsZW1lbnRQYXRoPVx1NTE0M1x1N2QyMFx1OGRlZlx1NWY4NA0KLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb01pc3NpbmdGaWxlc19tc2c9XHU3ZjNhXHU1YzExXHU0ZWU1XHU0ZTBiXHU2NTg3XHU0ZWY2XHUzMDAyXHU1OTgyXHU2NzljXHU4OTgxXHU5NjY0XHU1M2JiXHU1YmY5XHU1ZTkzXHU0ZTJkXHU5MDA5XHU1YjlhXHU2NTg3XHU0ZWY2XHU3Njg0XHU2MjQwXHU2NzA5XHU1ZjE1XHU3NTI4XHVmZjBjXHU4YmY3XHU1MzU1XHU1MWZiXHUyMDFjXHU3ODZlXHU1YjlhXHUyMDFkXHUzMDAyDQotbWlzc2luZ0ZpbGVzX3RpdGxlPVx1N2YzYVx1NWMxMVx1NzY4NFx1NjU4N1x1NGVmNg0KLWxvYWRFcnJvcj1cdTg4YzVcdTUxNjVcdTk1MTlcdThiZWYNCi1wcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9GaWxlc1dpdGhMb2FkRXJyb3JzX21zZz1cdTY1ZTBcdTZjZDVcdTg4YzVcdTUxNjVcdTRlZTVcdTRlMGJcdTY1ODdcdTRlZjZcdTMwMDJcdTU5ODJcdTY3OWNcdTg5ODFcdTk2NjRcdTUzYmJcdTViZjlcdTVlOTNcdTRlMmRcdTkwMDlcdTViOWFcdTY1ODdcdTRlZjZcdTc2ODRcdTYyNDBcdTY3MDlcdTVmMTVcdTc1MjhcdWZmMGNcdThiZjdcdTUzNTVcdTUxZmJcdTIwMWNcdTc4NmVcdTViOWFcdTIwMWRcdTMwMDINCi1maWxlc1dpdGhMb2FkRXJyb3JzX3RpdGxlPVx1NTNkMVx1NzUxZlx1ODhjNVx1NTE2NVx1OTUxOVx1OGJlZlx1NzY4NFx1NjU4N1x1NGVmNg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyZjIwMjUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1maWxlUGF0aD1cdTZhOTRcdTY4NDhcdThkZWZcdTVmOTENCi1jYW5ub3RXcml0ZVRvRmlsZXM9XHU3MTIxXHU2Y2Q1XHU1YmViXHU1MTY1XHU2YTk0XHU2ODQ4DQotcmVhZE9ubHlGaWxlc190aXRsZT1cdTU1MmZcdThiODBcdTZhOTRcdTY4NDgNCi1yZWFkT25seUZpbGVzX21zZz1cdTMwMGNcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTMwMGRcdTRlMmRcdTUyMTdcdTUxZmFcdTc2ODRcdTZhOTRcdTY4NDhcdTY2MmZcdTU1MmZcdThiODBcdTc2ODRcdTMwMDJcdThhY2JcdThhMmRcdTcwYmFcdTUzZWZcdTViZWJcdTUxNjVcdWZmMGNcdTUxOGRcdTYzMDlcdTRlMDBcdTRlMGJcdTMwMGNcdTkxY2RcdThhNjZcdTMwMGRcdTRmODZcdTdlN2NcdTdlOGNcdTkwMzJcdTg4NGNcdTMwMDINCi1lbGVtZW50UGF0aD1cdTUxNDNcdTdkMjBcdThkZWZcdTVmOTENCi1wcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9NaXNzaW5nRmlsZXNfbXNnPVx1OTA3YVx1NmYwZlx1NGUwYlx1NTIxN1x1NmE5NFx1Njg0OFx1MzAwMlx1ODJlNVx1ODk4MVx1NTcyOFx1N2EwYlx1NWYwZlx1NWVhYlx1NGUyZFx1NzlmYlx1OTY2NFx1NWMwZFx1NjI0MFx1OTA3OFx1NmE5NFx1Njg0OFx1NzY4NFx1NmJjZlx1NGUwMFx1NTAwYlx1NTNjM1x1NzE2N1x1ZmYwY1x1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1MzAwY1x1NzhiYVx1NWI5YVx1MzAwZFx1MzAwMg0KLW1pc3NpbmdGaWxlc190aXRsZT1cdTkwN2FcdTZmMGZcdTZhOTRcdTY4NDgNCi1sb2FkRXJyb3I9XHU4ZjA5XHU1MTY1XHU5MzJmXHU4YWE0DQotcHJvbXB0UmVtb3ZlUmVmZXJlbmNlc1RvRmlsZXNXaXRoTG9hZEVycm9yc19tc2c9XHU3MTIxXHU2Y2Q1XHU4ZjA5XHU1MTY1XHU0ZTBiXHU1MjE3XHU2YTk0XHU2ODQ4XHUzMDAyXHU4MmU1XHU4OTgxXHU1NzI4XHU3YTBiXHU1ZjBmXHU1ZWFiXHU0ZTJkXHU3OWZiXHU5NjY0XHU1YzBkXHU2MjQwXHU5MDc4XHU2YTk0XHU2ODQ4XHU3Njg0XHU2YmNmXHU0ZTAwXHU1MDBiXHU1M2MzXHU3MTY3XHVmZjBjXHU4YWNiXHU2MzA5XHU0ZTAwXHU0ZTBiXHUzMDBjXHU3OGJhXHU1YjlhXHUzMDBkXHUzMDAyDQotZmlsZXNXaXRoTG9hZEVycm9yc190aXRsZT1cdThmMDlcdTUxNjVcdTkzMmZcdThhYTRcdTc2ODRcdTZhOTRcdTY4NDgNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZTNlOGE4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjBjYzBlNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBMaWJyYXJ5IFhNSSAoTkwyKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNTRmY2E3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMjE2ZTUwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDMwIFhNSQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJlYzcyNjEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1maWxlUGF0aD1cdTA0MWZcdTA0NDNcdTA0NDJcdTA0NGMgXHUwNDNhIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQ0Mw0KLWNhbm5vdFdyaXRlVG9GaWxlcz1cdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQzN1x1MDQzMFx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzOCBcdTA0MzIgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiDQotcmVhZE9ubHlGaWxlc190aXRsZT1cdTA0MjRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIgXHUwNDQyXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDNlIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDdcdTA0NDJcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1yZWFkT25seUZpbGVzX21zZz1cdTA0MjRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIsIFx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQ0N1x1MDQzOFx1MDQ0MVx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0MzIgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmXHUwNDQ1LCBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M2RcdTA0MzBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M2RcdTA0NGIgXHUwNDQyXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDNlIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDdcdTA0NDJcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYuIFx1MDQyMFx1MDQzMFx1MDQzN1x1MDQ0MFx1MDQzNVx1MDQ0OFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzdcdTA0MzBcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0NGMgXHUwNDMyIFx1MDQzZFx1MDQzOFx1MDQ0NSBcdTA0MzggXHUwNDNkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZFx1MDQzZVx1MDQzZlx1MDQzYVx1MDQ0MyBcdTA0MWZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzYlx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4NCi1lbGVtZW50UGF0aD1cdTA0MWZcdTA0NDNcdTA0NDJcdTA0NGMgXHUwNDNhIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0Mw0KLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb01pc3NpbmdGaWxlc19tc2c9XHUwNDIxXHUwNDNiXHUwNDM1XHUwNDM0XHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQ0YiBcdTA0M2RcdTA0MzUgXHUwNDNkXHUwNDMwXHUwNDM5XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDRiLiBcdTA0MWRcdTA0MzBcdTA0MzZcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDFlXHUwNDFhLCBcdTA0NDdcdTA0NDJcdTA0M2VcdTA0MzFcdTA0NGIgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0MVx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzggXHUwNDNkXHUwNDMwIFx1MDQ0ZFx1MDQ0Mlx1MDQzOCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIgXHUwNDM4XHUwNDM3IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQzOA0KLW1pc3NpbmdGaWxlc190aXRsZT1cdTA0MWVcdTA0NDJcdTA0NDFcdTA0NDNcdTA0NDJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiDQotbG9hZEVycm9yPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzggXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDNhXHUwNDM1DQotcHJvbXB0UmVtb3ZlUmVmZXJlbmNlc1RvRmlsZXNXaXRoTG9hZEVycm9yc19tc2c9XHUwNDFmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDQ3XHUwNDM4XHUwNDQxXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQ0YiBcdTA0M2RcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzOFx1MDQ0Mlx1MDQ0Yy4gXHUwNDFkXHUwNDMwXHUwNDM2XHUwNDNjXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQxZVx1MDQxYSwgXHUwNDQ3XHUwNDQyXHUwNDNlXHUwNDMxXHUwNDRiIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0NDFcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4IFx1MDQzZFx1MDQzMCBcdTA0NGRcdTA0NDJcdTA0MzggXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiIFx1MDQzOFx1MDQzNyBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzgNCi1maWxlc1dpdGhMb2FkRXJyb3JzX3RpdGxlPVx1MDQxZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0MzggXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDNhXHUwNDM1IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzZVx1MDQzMg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMmEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMmEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTY2YWYyZi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMDk2MzhmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBMaWJyYXJ5IFhNSSAoTkwyYSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWk7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMmEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDRlNjgyMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RhLnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGQ5NTJhOC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgWE1JLWJpYmxpb3Rlaw0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXNfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXNfZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTc2NWRmZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1maWxlUGF0aD1GaWxzdGkNCi1jYW5ub3RXcml0ZVRvRmlsZXM9S2FuIGlra2Ugc2tyaXZlIHRpbCBmaWwoZXIpDQotcmVhZE9ubHlGaWxlc190aXRsZT1Ta3JpdmViZXNreXR0ZWRlIGZpbChlcikNCi1yZWFkT25seUZpbGVzX21zZz1GaWxlcm5lIHVuZGVyIE9wbHlzbmluZ2VyIGVyIHNrcml2ZWJlc2t5dHRlZGUuIE9waFx1MDBlNnYgc2tyaXZlYmVza3l0dGVsc2VuLCBvZyBrbGlrIHBcdTAwZTUgUHJcdTAwZjh2IGlnZW4gZm9yIGF0IGZvcnRzXHUwMGU2dHRlLg0KLWVsZW1lbnRQYXRoPUVsZW1lbnRzdGkNCi1wcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9NaXNzaW5nRmlsZXNfbXNnPUZcdTAwZjhsZ2VuZGUgZmlsZXIgbWFuZ2xlci4gS2xpayBwXHUwMGU1IE9LLCBodmlzIGR1IHZpbCBzbGV0dGUgYWxsZSByZWZlcmVuY2VyIHRpbCBkZSB2YWxndGUgZmlsZXIgaSBiaWJsaW90ZWtldC4NCi1taXNzaW5nRmlsZXNfdGl0bGU9TWFuZ2xlbmRlIGZpbChlcikNCi1sb2FkRXJyb3I9SW5kbFx1MDBlNnNuaW5nc2ZlamwNCi1wcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9GaWxlc1dpdGhMb2FkRXJyb3JzX21zZz1GXHUwMGY4bGdlbmRlIGZpbChlcikga2FuIGlra2UgaW5kbFx1MDBlNnNlcy4gS2xpayBwXHUwMGU1IE9LLCBodmlzIGR1IHZpbCBzbGV0dGUgYWxsZSByZWZlcmVuY2VyIHRpbCBkZSB2YWxndGUgZmlsZXIgaSBiaWJsaW90ZWtldC4NCi1maWxlc1dpdGhMb2FkRXJyb3JzX3RpdGxlPUZpbChlcikgbWVkIGluZGxcdTAwZTZzbmluZ3NmZWpsDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwxLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MjBmMDUzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwxPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk3Y2ZiMGUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIE1TUHJvamVjdCAoTkwxKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmU3YjAxMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwxL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9lcy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZnIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2phLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9rby5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcHRfQlIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX0NOLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9UVy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2l0LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9wbHVnaW5fZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmVmYzdjYy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyA8Y29weXJpZ2h0Pg0KLSMgPC9jb3B5cmlnaHQ+DQotIw0KLSMgJElkOiBwbHVnaW5fZGUucHJvcGVydGllcyx2IDEuMSAyMDA2LzExLzAyIDAwOjUwOjM3IGp0aGFtIEV4cCAkDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXBsdWdpbk5hbWUgPSBNb2RlbGwgZlx1MDBmY3IgTWljcm9zb2Z0IFByb2plY3QgMjAwMw0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9wbHVnaW5fZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiZTllZmUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgPGNvcHlyaWdodD4NCi0jIDwvY29weXJpZ2h0Pg0KLSMNCi0jICRJZDogcGx1Z2luX2VzLnByb3BlcnRpZXMsdiAxLjEgMjAwNi8xMS8wMiAwMDo1MDozNyBqdGhhbSBFeHAgJA0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIFRvIGNvZGUgZGV2ZWxvcGVyOg0KLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUNCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4NCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlDQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5Lg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1wbHVnaW5OYW1lID0gTW9kZWxvIE1pY3Jvc29mdCBQcm9qZWN0IDIwMDMNCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjFmYTIyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIDxjb3B5cmlnaHQ+DQotIyA8L2NvcHlyaWdodD4NCi0jDQotIyAkSWQ6IHBsdWdpbl9mci5wcm9wZXJ0aWVzLHYgMS4xIDIwMDYvMTEvMDIgMDA6NTA6MzcganRoYW0gRXhwICQNCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotcGx1Z2luTmFtZSA9IE1vZFx1MDBlOGxlIE1pY3Jvc29mdCBQcm9qZWN0IDIwMDMNCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OTMzODVmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIDxjb3B5cmlnaHQ+DQotIyA8L2NvcHlyaWdodD4NCi0jDQotIyAkSWQ6IHBsdWdpbl9pdC5wcm9wZXJ0aWVzLHYgMS4xIDIwMDYvMTEvMDIgMDA6NTA6MzcganRoYW0gRXhwICQNCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotcGx1Z2luTmFtZSA9IE1vZGVsbG8gTWljcm9zb2Z0IFByb2plY3QgMjAwMw0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9wbHVnaW5famEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5NjEyZDEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9wbHVnaW5famEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgPGNvcHlyaWdodD4NCi0jIDwvY29weXJpZ2h0Pg0KLSMNCi0jICRJZDogcGx1Z2luX2phLnByb3BlcnRpZXMsdiAxLjEgMjAwNi8xMS8wMiAwMDo1MDozNyBqdGhhbSBFeHAgJA0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIFRvIGNvZGUgZGV2ZWxvcGVyOg0KLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUNCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4NCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlDQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5Lg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1wbHVnaW5OYW1lID0gTWljcm9zb2Z0IFByb2plY3QgMjAwMyBNb2RlbA0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMxNzc0ZjkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgPGNvcHlyaWdodD4NCi0jIDwvY29weXJpZ2h0Pg0KLSMNCi0jICRJZDogcGx1Z2luX2tvLnByb3BlcnRpZXMsdiAxLjEgMjAwNi8xMS8wMiAwMDo1MDozNyBqdGhhbSBFeHAgJA0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIFRvIGNvZGUgZGV2ZWxvcGVyOg0KLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUNCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4NCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlDQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5Lg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1wbHVnaW5OYW1lID0gTWljcm9zb2Z0IFByb2plY3QgMjAwMyBcdWJhYThcdWIzNzgNCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZTQ5MTI1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIDxjb3B5cmlnaHQ+DQotIyA8L2NvcHlyaWdodD4NCi0jDQotIyAkSWQ6IHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLHYgMS4xIDIwMDYvMTEvMDIgMDA6NTA6MzcganRoYW0gRXhwICQNCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotcGx1Z2luTmFtZSA9IE1vZGVsbyBNaWNyb3NvZnQgUHJvamVjdCAyMDAzDQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWQ0YjE2OC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyA8Y29weXJpZ2h0Pg0KLSMgPC9jb3B5cmlnaHQ+DQotIw0KLSMgJElkOiBwbHVnaW5femhfQ04ucHJvcGVydGllcyx2IDEuMSAyMDA2LzExLzAyIDAwOjUwOjM3IGp0aGFtIEV4cCAkDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXBsdWdpbk5hbWUgPSBNaWNyb3NvZnQgUHJvamVjdCAyMDAzIFx1NmEyMVx1NTc4Yg0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwZDExZWMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgPGNvcHlyaWdodD4NCi0jIDwvY29weXJpZ2h0Pg0KLSMNCi0jICRJZDogcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsdiAxLjEgMjAwNi8xMS8wMiAwMDo1MDozNyBqdGhhbSBFeHAgJA0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIFRvIGNvZGUgZGV2ZWxvcGVyOg0KLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUNCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4NCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlDQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5Lg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1wbHVnaW5OYW1lID0gTWljcm9zb2Z0IFByb2plY3QgMjAwMyBNb2RlbA0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMi8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDIvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MDY3MzQ5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxMDZhMDIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIE1TUHJvamVjdCAoTkwyKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjU0ZmNhNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX3J1LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMi9wbHVnaW5fcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDdkYTQwNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyA8Y29weXJpZ2h0Pg0KLSMgPC9jb3B5cmlnaHQ+DQotIw0KLSMgJElkOiBwbHVnaW5fcnUucHJvcGVydGllcyx2IDEuMSAyMDA2LzExLzAyIDAwOjUwOjM3IGp0aGFtIEV4cCAkDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXBsdWdpbk5hbWUgPSBcdTA0MWNcdTA0M2VcdTA0MzRcdTA0MzVcdTA0M2JcdTA0NGMgTWljcm9zb2Z0IFByb2plY3QgMjAwMw0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMmEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDJhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMmEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDJhLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMmEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI1YzI3ODQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMmEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwyYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIxNDNkYjEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBNU1Byb2plY3QgKE5MMmEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lm5sMmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDJhL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwyYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGU2ODIzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RhLnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZGMzZDlkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyA8Y29weXJpZ2h0Pg0KLSMgPC9jb3B5cmlnaHQ+DQotIw0KLSMgJElkOiBwbHVnaW5fZGEucHJvcGVydGllcyx2IDEuMSAyMDA2LzExLzAyIDAwOjUwOjQ4IGp0aGFtIEV4cCAkDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXBsdWdpbk5hbWUgPSBNb2RlbCB0aWwgTWljcm9zb2Z0IFByb2plY3QgMjAwMw0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTM0ODUxMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI2MTc4M2UuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgUGxhdGZvcm0gKE5MMSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmYzN2E4NS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIGFib3V0LnByb3BlcnRpZXMNCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MNCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4NCi0jDQotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQ0KLQ0KLWZlYXR1cmVOYW1lPUVjbGlwc2UgUGxhdGZvcm0gMy4xLjEgbWl0IEVNRiB1bmQgR0VGIA0KLQ0KLWJsdXJiPUVjbGlwc2UgUGxhdGZvcm1cblwNCi1cblwNCi1WZXJzaW9uOiAzLjEuMVxuXA0KLUJ1aWxkLUlEOiBNMjAwNTA5MjktMDg0MFxuXA0KLVxuXA0KLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA1LiBBbGxlIFJlY2h0ZSB2b3JiZWhhbHRlbi5cblwNCi1CZXN1Y2hlbiBTaWUgZGllIFdlYnNlaXRlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGxhdGZvcm0uXG5cDQotXG5cDQotRGllc2VzIFByb2R1a3QgZW50aFx1MDBlNGx0IFNvZnR3YXJlLCBkaWUgdm9uIGRlclxuXA0KLUFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKSBlbnR3aWNrZWx0IHd1cmRlLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9hYm91dF9lcy5odG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2VzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc5MWFkYjYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2VzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPg0KLTx0aXRsZT5BY2VyY2EgZGU8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJFUy1FUyI+DQotPGgyPkFjZXJjYSBkZWwgY29udGVuaWRvPC9oMj4NCi0gDQotPHA+MjQgZGUgZmVicmVybyBkZSAyMDA1PC9wPgkNCi08aDM+TGljZW5jaWE8L2gzPg0KLQ0KLTxwPkxhIEVjbGlwc2UgRm91bmRhdGlvbiBoYSBoZWNobyBxdWUgdG9kbyBlbCBDb250ZW5pZG8gZXN0w6kgZGlzcG9uaWJsZSBlbiBlc3RlDQotcGx1Zy1pbiAoJnF1b3Q7Q29udGVuaWRvJnF1b3Q7KS4gIEEgbWVub3MgcXVlIHNlIGluZGlxdWUgbG8gY29udHJhcmlvIG3DoXMNCi1hZGVsYW50ZSwgZWwgQ29udGVuaWRvIHNlIHByb3BvcmNpb25hIGFsIHVzdWFyaW8gYmFqbyBsb3MgdMOpcm1pbm9zIHkNCi1jb25kaWNpb25lcyBkZSBsYSBMaWNlbmNpYSBww7pibGljYSBkZSBFY2xpcHNlIFZlcnNpw7NuIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIA0KLVVuYSBjb3BpYSBkZSBsYSBFUEwgZXN0w6EgZGlzcG9uaWJsZSBlbg0KLTxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotUGFyYSBsb3MgZmluZXMgZGUgbGEgRVBMLCAmcXVvdDtQcm9ncmFtYSZxdW90OyBxdWllcmUgZGVjaXIgZWwgQ29udGVuaWRvLjwvcD4NCi0NCi08cD5TaSBubyByZWNpYmnDsyBlc3RlIENvbnRlbmlkbyBkaXJlY3RhbWVudGUgZGUgbGEgRWNsaXBzZSBGb3VuZGF0aW9uLCDDqXN0ZQ0KLWVzdMOhIHNpZW5kbyByZWRpc3RyaWJ1aWRvIHBvciB0ZXJjZXJvcyAoJnF1b3Q7UmVkaXN0cmlidWlkb3ImcXVvdDspIHkgcHVlZGVuDQotYXBsaWNhcnNlIHTDqXJtaW5vcyB5IGNvbmRpY2lvbmVzIGRpc3RpbnRvcyBhbCB1c28gZGUgY3VhbHF1aWVyIGPDs2RpZ28gZGUgb2JqZXRvDQotZGVsIENvbnRlbmlkby4NCi1Db21wcnVlYmUgbGEgbGljZW5jaWEgZGVsIFJlZGlzdHJpYnVpZG9yIHF1ZSBzZSBwcm9wb3JjaW9uw7MganVudG8gY29uIGVsDQotQ29udGVuaWRvLiAgU2kgbm8gZXhpc3RlIHRhbCBsaWNlbmNpYSwgcMOzbmdhc2UgZW4gY29udGFjdG8gY29uIGVsDQotUmVkaXN0cmlidWlkb3IuICBBIG1lbm9zIHF1ZSBzZSBpbmRpcXVlIGxvIGNvbnRyYXJpbyBtw6FzIGFkZWxhbnRlLCBsb3MgdMOpcm1pbm9zDQoteSBjb25kaWNpb25lcyBkZSBsYSBFUEwgc2Ugc2VndWlyw6FuIGFwbGljYW5kbyBhIGN1YWxxdWllciBjw7NkaWdvIGZ1ZW50ZSBkZWwNCi1Db250ZW5pZG8uPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDZkOTljNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIGFib3V0LnByb3BlcnRpZXMNCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MNCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4NCi0jDQotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQ0KLQ0KLWZlYXR1cmVOYW1lPUVjbGlwc2UgUGxhdGZvcm0gMy4xLjEgY29uIEVNRiB5IEdFRiANCi0NCi1ibHVyYj1FY2xpcHNlIFBsYXRmb3JtXG5cDQotXG5cDQotVmVyc2lcdTAwZjNuOiAzLjEuMVxuXA0KLUlEIGRlIGJ1aWxkOiBNMjAwNTA5MjktMDg0MFxuXA0KLVxuXA0KLShjKSBDb3B5cmlnaHQgQ29sYWJvcmFkb3JlcyBkZSBFY2xpcHNlIHkgb3Ryb3MgMjAwMCwgMjAwNS4gIFJlc2VydmFkb3MgdG9kb3MgbG9zIGRlcmVjaG9zLlxuXA0KLVZpc2l0ZSBsYSBwXHUwMGUxZ2luYSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtXG5cDQotXG5cDQotRXN0ZSBwcm9kdWN0byBpbmNsdXllIHNvZnR3YXJlIGRlc2Fycm9sbGFkbyBwb3IgbGFcblwNCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2ZyLmh0bWwgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfZnIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzg3MzNlOC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfZnIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+DQotPHRpdGxlPkEgcHJvcG9zIGRlPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iRlItRlIiPg0KLTxoMj5BIHByb3BvcyBkZSBjZSBjb250ZW51PC9oMj4NCi0gDQotPHA+MjQgZsOpdnJpZXIgMjAwNTwvcD4JDQotPGgzPkxpY2VuY2U8L2gzPg0KLQ0KLTxwPkxhIEZvbmRhdGlvbiBFY2xpcHNlIGZvdXJuaXQgbCdlbnNlbWJsZSBkdSBjb250ZW51IGZpZ3VyYW50IGRhbnMgY2UgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudSZxdW90OykuICBTYXVmIGluZGljYXRpb24gY29udHJhaXJlIG1lbnRpb25uw6llIGNpLWRlc3NvdXMsIGxlIGNvbnRlbnUgdm91cyBlc3QgZm91cm5pIGNvbmZvcm3DqW1lbnQgYXV4IHRlcm1lcyBldCBjb25kaXRpb25zIGRlDQotbCdFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgVW5lIGNvcGllIGRlIGwnRVBMIGVzdCBkaXNwb25pYmxlIMOgIGwnYWRyZXNzZSBzdWl2YW50ZSA6IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotRGFucyBsZSBjYWRyZSBkZSBsJ0VQTCwgbGUgdGVybWUgJnF1b3Q7UHJvZ3JhbW1lJnF1b3Q7IHNpZ25pZmllICJDb250ZW51Ii48L3A+DQotDQotPHA+U2kgdm91cyBuJ2F2ZXogcGFzIHJlw6d1IGNlIGNvbnRlbnUgZGlyZWN0ZW1lbnQgdmlhIGxhIEZvbmRhdGlvbiBFY2xpcHNlLCB1bmUgYXV0cmUgcGFydGllIGVzdCBlbiB0cmFpbiBkZSBsZSByZWRpc3RyaWJ1ZXIgKCZxdW90O1JlZGlzdHJpYnV0ZXVyJnF1b3Q7KSBldCBkaWZmw6lyZW50cyB0ZXJtZXMgZXQgY29uZGl0aW9ucyBwZXV2ZW50DQotcydhcHBsaXF1ZXIgw6Agdm90cmUgdXRpbGlzYXRpb24gZGUgdG91dCBjb2RlIG9iamV0IGZpZ3VyYW50IGRhbnMgbGUgY29udGVudS4gIFbDqXJpZmlleiBsYSBsaWNlbmNlIGR1IHJlZGlzdHJpYnV0ZXVyIGZvdXJuaWUgYXZlYyBsZSBjb250ZW51LiAgU2kgdW5lIHRlbGxlIGxpY2VuY2UgbidleGlzdGUgcGFzLCBjb250YWN0ZXogbGUgcmVkaXN0cmlidXRldXIuICBTYXVmIGluZGljYXRpb24gY29udHJhaXJlIG1lbnRpb25uw6llIGNpLWRlc3NvdXMsDQotbGVzIHRlcm1lcyBldCBjb25kaXRpb25zIGRlIGwnRVBMIHMnYXBwbGlxdWVudCB0b3Vqb3VycyDDoCBuJ2ltcG9ydGUgcXVlbCBjb2RlIHNvdXJjZSBmaWd1cmFudCBkYW5zIGxlIGNvbnRlbnUuPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGNjN2Q2NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIGFib3V0LnByb3BlcnRpZXMNCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MNCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4NCi0jDQotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQ0KLQ0KLWZlYXR1cmVOYW1lPUVjbGlwc2UgUGxhdGZvcm0gMy4xLjEgYXZlYyBFTUYgZXQgR0VGIA0KLQ0KLWJsdXJiPVBsYXRlZm9ybWUgRWNsaXBzZVxuXA0KLVxuXA0KLVZlcnNpb24gOiAzLjEuMVxuXA0KLUlkZW50aWZpY2F0ZXVyIGRlIGNvbnN0cnVjdGlvbiA6IE0yMDA1MDkyOS0wODQwXG5cDQotXG5cDQotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXA0KLVZpc2l0ZXogbGEgcGFnZSBzdWl2YW50ZSA6IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGxhdGZvcm1cblwNCi1cblwNCi1DZSBwcm9kdWl0IGNvbnRpZW50IGRlcyBsb2dpY2llbHMgZFx1MDBlOXZlbG9wcFx1MDBlOXMgcGFyXG5cDQotQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gaHR0cDovL3d3dy5hcGFjaGUub3JnLw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9hYm91dF9pdC5odG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2l0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2ODY2NGMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2l0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPg0KLTx0aXRsZT5JbmZvcm1hemlvbmkgc3UNCi08L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJFTi1VUyI+DQotPGgyPkluZm9ybWF6aW9uaSBzdSBxdWVzdG8gY29udGVudXRvOg0KLTwvaDI+DQotIA0KLTxwPjI0IEZlYmJyYWlvLCAyMDA1PC9wPgkNCi08aDM+TGljZW56YTwvaDM+DQotDQotPHA+RWNsaXBzZSBGb3VuZGF0aW9uIHJlbmRlIGRpc3BvbmliaWxlIHR1dHRvIGlsIGNvbnRlbnV0byBpbiBxdWVzdG8gcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuIEEgbWVubyBjaGUgbm9uIHNpYSBkaXZlcnNhbWVudGUgaW5kaWNhdG8gZGkgc2VndWl0bywgaWwgQ29udGVudCDDqCBmb3JuaXRvIGluIGJhc2UgYWxsZSBjbGF1c29sZSBlIGNvbmRpemlvbmkgZGkgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uZSAxLjAgKCZxdW90O0VQTCZxdW90OykuIFVuYSBjb3BpYSBkaSBFUEwgw6ggZGlzcG9uaWJpbGUgcHJlc3NvIGlsIHNpdG8gPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi0gICBQZXIgZ2xpIHNjb3BpIGRpIEVQTCwgJnF1b3Q7UHJvZ3JhbW1hJnF1b3Q7IHZvcnLDoCBkaXJlIENvbnRlbnV0by48L3A+DQotDQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5DQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQ0KLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9hYm91dF9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVhZTdlMjYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBhYm91dC5wcm9wZXJ0aWVzDQotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzDQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuDQotIw0KLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30NCi0NCi1mZWF0dXJlTmFtZT1QaWF0dGFmb3JtYSBFY2xpcHNlIDMuMS4xIGNvbiBFTUYgZSBHRUYgDQotDQotYmx1cmI9UGlhdHRhZm9ybWEgRWNsaXBzZVxuXA0KLVxuXA0KLVZlcnNpb25lOiAzLjEuMVxuXA0KLUlEIGJ1aWxkOiBNMjAwNTA5MjktMDg0MFxuXA0KLVxuXA0KLShjKSBDb3B5cmlnaHQgQ29udHJpYnV0b3IgRWNsaXBzZSBlIGFsdHJpIDIwMDAsIDIwMDUuICBUdXR0aSBpIGRpcml0dGkgcmlzZXJ2YXRpLlxuXA0KLVZpc2l0YXJlIGwnaW5kaXJpenpvIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGxhdGZvcm1cblwNCi1cblwNCi1RdWVzdG8gcHJvZG90dG8gaW5jbHVkZSBzb2Z0d2FyZSBzdmlsdXBwYXRvIGRhXG5cDQotQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gaHR0cDovL3d3dy5hcGFjaGUub3JnLw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9hYm91dF9qYS5odG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2phLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiZjZlMzcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2phLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4NCi08dGl0bGU+44OQ44O844K444On44Oz5oOF5aCxDQotPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iSkEtSlAiPg0KLTxoMj7mnKzmm7jjgavjgaTjgYTjgaY8L2gyPg0KLSANCi08cD4yMDA1IOW5tCAyIOaciCAyNCDml6U8L3A+CQ0KLTxoMz7jg6njgqTjgrvjg7Pjgrk8L2gzPg0KLQ0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUNCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4NCi0NCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkNCi1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlDQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjI5NDZjMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIGFib3V0LnByb3BlcnRpZXMNCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MNCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4NCi0jDQotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQ0KLQ0KLWZlYXR1cmVOYW1lPUVjbGlwc2UgXHUzMGQ3XHUzMGU5XHUzMGMzXHUzMGM4XHUzMGQ1XHUzMGE5XHUzMGZjXHUzMGUwIDMuMS4xIChFTUYgXHUzMDRhXHUzMDg4XHUzMDczIEdFRiBcdTRlZDhcdTMwNGQpIA0KLQ0KLWJsdXJiPUVjbGlwc2UgXHUzMGQ3XHUzMGU5XHUzMGMzXHUzMGM4XHUzMGQ1XHUzMGE5XHUzMGZjXHUzMGUwXG5cDQotXG5cDQotXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzOiAzLjEuMVxuXA0KLVx1MzBkM1x1MzBlYlx1MzBjOSBJRDogTTIwMDUwOTI5LTA4NDBcblwNCi1cblwNCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cDQotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybSBcdTMwOTJcdTUzYzJcdTcxNjdcdTMwMDJcblwNCi1cblwNCi1cdTMwNTNcdTMwNmVcdTg4ZmRcdTU0YzFcdTMwNmJcdTMwNmZcdTMwMDFBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLylcblwNCi1cdTMwNmJcdTMwODhcdTMwOGFcdTk1OGJcdTc2N2FcdTMwNTVcdTMwOGNcdTMwNWZcdTMwYmRcdTMwZDVcdTMwYzhcdTMwYTZcdTMwYTdcdTMwYTJcdTMwNGNcdTU0MmJcdTMwN2VcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfa28uaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9hYm91dF9rby5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkN2U5YmZkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9hYm91dF9rby5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQotPHRpdGxlPuygnO2SiCDsoJXrs7Q8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJLTy1LUiI+DQotPGgyPuydtCDsu6jthZDsuKAg7KCV67O0PC9oMj4NCi0gDQotPHA+MjAwNeuFhCAy7JuUIDI07J28PC9wPgkNCi08aDM+65287J207IS87IqkPC9oMz4NCi0NCi08cD5FY2xpcHNlIEZvdW5kYXRpb27snYAg67O4IO2UjOufrOq3uOyduOydmCDrqqjrk6Ag7Luo7YWQ7LigKOydtO2VmCAmcXVvdDvsu6jthZDsuKAmcXVvdDsp66W8IOyCrOyaqe2VoCDsiJgg7J6I64+E66GdIOygnOqzte2VqeuLiOuLpC4g7JWE656Y7JeQ7IScIOuLrOumrCDrqoXsi5ztlZjsp4Ag7JWK7J2AIO2VnCwg67O4IOy7qO2FkOy4oOuKlCBFY2xpcHNlIOqzteyaqSDrnbzsnbTshLzsiqQg67KE7KCEIDEuMCjsnbTtlZggJnF1b3Q7RVBMJnF1b3Q7KeydmCDsobDqsbTsl5Ag7J2Y6rGw7ZWY7JesDQot7KCc6rO165Cp64uI64ukLiBFUEwg7IKs67O47J2AIDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT7sl5DshJwg7ZmV7J247ZWgIOyImCDsnojsirXri4jri6QuDQotRVBM7J2YIOuqqeyggeyDgSwgJnF1b3Q77ZSE66Gc6re4656oJnF1b3Q77J20656AIOy7qO2FkOy4oOulvCDsnZjrr7jtlanri4jri6QuPC9wPg0KLQ0KLTxwPuq3gO2VmOqwgCDrs7gg7Luo7YWQ7Lig66W8IEVjbGlwc2UgRm91bmRhdGlvbuycvOuhnOu2gO2EsCDsp4HsoJEg7KCc6rO167Cb7KeAIOyViuydgCDqsr3smrAsIOuzuCDsu6jthZDsuKDripQg7KCcM+yekCjsnbTtlZggJnF1b3Q77J6s67Cw7Y+s7J6QJnF1b3Q7KeyXkCDsnZjtlbQg7J6s67Cw7Y+s65CY6rOgIOyeiOycvOupsCDqt4DtlZjsnZgg67O4IOy7qO2FkOy4oOydmCDsmKTruIzsoJ3tirgg7L2U65OcIOyCrOyaqeyXkCDrjIDtlZjsl6wg64uk66W4IOyhsOqxtOydtCDsoIHsmqnrkKnri4jri6QuIOuzuCDsu6jthZDsuKDsmYAg7ZWo6ruYIOygnOqzteuQnCDsnqzrsLDtj6zsnpDsnZgg65287J207IS87Iqk66W8IO2ZleyduO2VmOyLreyLnOyYpC4g7J2065+s7ZWcIOudvOydtOyEvOyKpOqwgCDsl4bripQg6rK97JqwLCDsnqzrsLDtj6zsnpDsl5Dqsowg66y47J2Y7ZWY7Iut7Iuc7JikLiDslYTrnpjsl5DshJwg64us66asIOuqheyLnO2VmOyngCDslYrripQg7ZWcLCBFUEzsnZgg7KGw6rG07J20IOuzuCDsu6jthZDsuKDsnZgg66qo65OgIOyGjOyKpCDsvZTrk5zsl5Ag7KCB7Jqp65Cp64uI64ukLjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9hYm91dF9rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhlODUzMjIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBhYm91dC5wcm9wZXJ0aWVzDQotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzDQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuDQotIw0KLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30NCi0NCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFx1ZDUwY1x1YjdhYlx1ZDNmYyAzLjEuMShFTUYgXHViYzBmIEdFRiBcdWQzZWNcdWQ1NjgpIA0KLQ0KLWJsdXJiPUVjbGlwc2UgXHVkNTBjXHViN2FiXHVkM2ZjXG5cDQotXG5cDQotXHViYzg0XHVjODA0OiAzLjEuMVxuXA0KLVx1YmU0Y1x1YjRkYyBJRDogTTIwMDUwOTI5LTA4NDBcblwNCi1cblwNCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwNCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtXHVjNzQ0IFx1YmMyOVx1YmIzOFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC5cblwNCi1cblwNCi1cdWM3NzQgXHVjODFjXHVkNDg4XHVjNWQwXHViMjk0IEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pXHVjNWQwXHVjMTFjIFxuXA0KLVx1YWMxY1x1YmMxY1x1ZDU1YyBcdWMxOGNcdWQ1MDRcdWQyYjhcdWM2ZThcdWM1YjRcdWFjMDAgXHVkM2VjXHVkNTY4XHViNDE4XHVjNWI0IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfcHRfQlIuaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9hYm91dF9wdF9CUi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjQ4NTAzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9hYm91dF9wdF9CUi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4NCi08dGl0bGU+U29icmUgPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iRU4tVVMiPg0KLTxoMj5Tb2JyZSBFc3RlIENvbnRlw7pkbzwvaDI+DQotIA0KLTxwPjI0IGRlIGZldmVyZWlybyBkZSAyMDA1PC9wPgkNCi08aDM+TGljZW7Dp2E8L2gzPg0KLQ0KLTxwPkEgRWNsaXBzZSBGb3VuZGF0aW9uIGRpc3BvbmliaWxpemEgdG9kbyBjb250ZcO6ZG8gbmVzdGUgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICANCi1BIG1lbm9zIHF1ZSBpbmRpY2FkbyBvIGNvbnRyw6FyaW8gYSBzZWd1aXIsIHRvZG8gQ29udGXDumRvIMOpIGZvcm5lY2lkbyBhIHZvY8OqIHNvYiBvcyB0ZXJtb3MNCi1lIGNvbmRpw6fDtWVzIGRvIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc8OjbyAxLjAgKCZxdW90O0VQTCZxdW90OykuICBVbWEgY8OzcGlhIGRvIEVQTA0KLWVzdMOhIGRpc3BvbsOtdmVsIGVtDQotPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi0gICBQYXJhIGZpbnMgZG8gRVBMLCAmcXVvdDtQcm9ncmFtYSZxdW90OyBzaWduaWZpY2Fyw6EgbyBDb250ZcO6ZG8uPC9wPg0KLQ0KLTxwPlNlIHZvY8OqIG7Do28gcmVjZWJldSBlc3RlIENvbnRlw7pkbyBkaXJldGFtZW50ZSBkYSBFY2xpcHNlIEZvdW5kYXRpb24sIG8gQ29udGXDumRvIGVzdMOhDQotc2VuZG8gcmVkaXN0cmlidcOtZG8gcG9yIG91dHJhIHBhcnRlICgmcXVvdDtSZWRpc3RyaWJ1aWRvciZxdW90OykgZSB0ZXJtb3MgZSBjb25kacOnw7Vlcw0KLWRpZmVyZW50ZXMgcG9kZW0gc2UgYXBsaWNhciBhbyB1c28gZGUgcXVhbHF1ZXIgY8OzZGlnbyBkZSBvYmpldG8gbm8gQ29udGXDumRvLiAgVmVyaWZpcXVlIGENCi1saWNlbsOnYSBkbyBSZWRpc3RyaWJ1aWRvciBxdWUgZm9pIGZvcm5lY2lkYSBjb20gbyBDb250ZcO6ZG8uICBTZSBuZW5odW1hIGxpY2Vuw6dhIGV4aXN0aXIsDQotZW50cmUgZW0gY29udGF0byBjb20gbyBSZWRpc3RyaWJ1aWRvci4gIEEgbWVub3MgcXVlIGluZGljYWRvIG8gY29udHLDoXJpbyBhIHNlZ3Vpciwgb3MNCi10ZXJtb3MgZSBjb25kacOnw7VlcyBkbyBFUEwgc2UgYXBsaWNhcsOjbyBhIHF1YWxxdWVyIGPDs2RpZ28tZm9udGUgbm8gQ29udGXDumRvLiAgPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmRiOTM1Yi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIGFib3V0LnByb3BlcnRpZXMNCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MNCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4NCi0jDQotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQ0KLQ0KLWZlYXR1cmVOYW1lPVBsYXRhZm9ybWEgRWNsaXBzZSAzLjEuMSBjb20gRU1GIGUgR0VGIA0KLQ0KLWJsdXJiPVBsYXRhZm9ybWEgRWNsaXBzZVxuXA0KLVxuXA0KLVZlcnNcdTAwZTNvOiAzLjEuMVxuXA0KLUlEIGRvIEJ1aWxkOiBNMjAwNTA5MjktMDg0MFxuXA0KLVxuXA0KLShjKSBDb3B5cmlnaHQgY29udHJpYnVpZG9yZXMgRWNsaXBzZSBlIG91dHJvcyAyMDAwLCAyMDA1LiAgVG9kb3Mgb3MgZGlyZWl0b3MgcmVzZXJ2YWRvcy5cblwNCi1WaXNpdGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXA0KLVxuXA0KLUVzdGUgcHJvZHV0byBpbmNsdWkgc29mdHdhcmUgZGVzZW52b2x2aWRvIHBlbGFcblwNCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X3poX0NOLmh0bWwgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfemhfQ04uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDNkNWU0MS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfemhfQ04uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KLTx0aXRsZT7lhbPkuo48L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJaSC1DSCI+DQotPGgyPuWFs+S6juacrOKAnOWGheWuueKAnTwvaDI+DQotIA0KLTxwPjIwMDUg5bm0IDIg5pyIIDI0IOaXpTwvcD4JDQotPGgzPuiuuOWPr+ivgTwvaDM+DQotDQotPHA+RWNsaXBzZSBGb3VuZGF0aW9uIOaPkOS+m+atpOaPkuS7tu+8iOKAnOWGheWuueKAne+8ieS4reeahOaJgOacieWGheWuueOAgumZpOmdnuS4i+aWh+WPpuacieaMh+aYju+8jOWQpuWImeaCqOWcqOS9v+eUqOWGheWuueaXtuW/hemhu+mBteWuiCBFY2xpcHNlIOWFrOWFseiuuOWPr+ivge+8iEVQTO+8iVYxLjAg5Lit55qE5p2h5qy+5ZKM5p2h5Lu244CC5oKo5Y+v5Lul5Yiw5Lul5LiL572R5Z2A6I635b6XIEVQTO+8mgc8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+44CC5ZyoIEVQTCDnmoTkvb/nlKjkuK3vvIzigJznqIvluo/igJ3ljbPmjIfigJzlhoXlrrnigJ3jgII8L3A+DQotDQotPHA+5aaC5p6c5oKo5LiN5piv55u05o6l5LuOIEVjbGlwc2UgRm91bmRhdGlvbiDmlLbliLDmraTigJzlhoXlrrnigJ3vvIzljbPigJzlhoXlrrnigJ3nlLHnrKzkuInmlrnvvIjigJzova/ku7bplIDllK7llYbigJ3vvInlho3mrKHliIblj5HvvIzpgqPkuYgsIOaCqOS9v+eUqOKAnOWGheWuueKAneS4reeahOaJgOacieWvueixoeS7o+eggeaXtuWPr+iDveW/hemhu+mBteWuiOWFtuS7luadoeasvuWSjOadoeS7tuOAguivt+afpemYheKAnOWGheWuueKAnemaj+mZhOeahOeUsemUgOWUruWVhumigeWPkeeahOiuuOWPr+ivgeOAguWmguaenOatpOexu+iuuOWPr+ivgeS4jeWtmOWcqO+8jOivt+iBlOezu+mUgOWUruWVhuOAgumZpOmdnuS4i+aWh+S4reWPpuacieaMh+aYju+8jOWQpuWImSBFUEwg55qE5p2h5qy+5ZKM5p2h5Lu25LuN6YCC55So5LqO4oCc5YaF5a654oCd5Lit55qE5omA5pyJ5rqQ5Luj56CB44CCPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzZlOGRmMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfemhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIGFib3V0LnByb3BlcnRpZXMNCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MNCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4NCi0jDQotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQ0KLQ0KLWZlYXR1cmVOYW1lPVx1NWUyNlx1NjcwOSBFTUYgXHU1NDhjIEdFRiBcdTc2ODQgRWNsaXBzZSBQbGF0Zm9ybSAzLjEuMQ0KLQ0KLWJsdXJiPUVjbGlwc2UgUGxhdGZvcm1cblwNCi1cblwNCi1cdTcyNDhcdTY3MmNcdWZmMWEzLjEuMVxuXA0KLVx1NWRlNVx1NGY1Y1x1NzI0OFx1NjcyY1x1NjgwN1x1OGJjNlx1ZmYxYU0yMDA1MDkyOS0wODQwXG5cDQotXG5cDQotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXA0KLVx1OGJmN1x1OGJiZlx1OTVlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtXG5cDQotXG5cDQotXHU2NzJjXHU0ZWE3XHU1NGMxXHU1MzA1XHU1NDJiXHU3NTMxIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uXHVmZjA4aHR0cDovL3d3dy5hcGFjaGUub3JnL1x1ZmYwOVx1NWYwMFx1NTNkMVx1NzY4NFx1OGY2Zlx1NGVmNlxuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2Fib3V0X3poX1RXLmh0bWwgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfemhfVFcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDc4NDIyNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfemhfVFcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KLTx0aXRsZT7pl5zmlrw8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJ6aC1UVyI+DQotPGgyPumXnOaWvOacrOWFp+WuuTwvaDI+DQotIA0KLTxwPjIwMDUg5bm0IDIg5pyIIDI0IOaXpTwvcD4JDQotPGgzPuaOiOasijwvaDM+DQotDQotPHA+RWNsaXBzZSBGb3VuZGF0aW9uIOeZvOS9iOacrOWkluaOm+eoi+W8j+S4reeahOaJgOacieWFp+Wuue+8iOOAjOWFp+WuueOAje+8ieOAguS7peS4i+mZpOWPpuacieiou+aYjuiAheWklu+8jOOAjOWFp+WuueOAjeWdh+S+neOAjEVjbGlwc2Ug5YWs5YWx5o6I5qyKIDEuMCDniYjjgI0oJnF1b3Q7RVBMJnF1b3Q7KSDkuYvmop3mrL7ogIzmj5Dkvpvmgqjkvb/nlKjjgIINCi08YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+IOS4iuW3suWFrOS9iOS4gOS7vSBFUEzjgIINCi3lsI0gRVBMIOiAjOiogO+8jOOAjOeoi+W8j+OAjeaEj+aMh+OAjOWFp+WuueOAjeOAgjwvcD4NCi0NCi08cD7oi6XpnZ7nm7TmjqXlvp4gRWNsaXBzZSBGb3VuZGF0aW9uIOaUtuWIsOacrOOAjOWFp+WuueOAje+8jOWJh+OAjOWFp+WuueOAjeeUseesrOS4ieaWue+8iOOAjOWGjeeZvOihjOiAheOAje+8iemHjeaWsOeZvOihjO+8jOOAjOWFp+WuueOAjeS4reS5i+S7u+S9leebrueahOeivOWPr+iDveacieS4jeWQjOeahOS9v+eUqOaineasvuOAgg0KLeiri+WPg+mWseOAjOWFp+WuueOAjemaqOmZhOS5i+OAjOWGjeeZvOihjOiAheOAjeaOiOasiuOAguiLpeacqumZhOS4iuaOiOasiu+8jOiri+iBr+e1oeOAjOWGjeeZvOihjOiAheOAjeOAguS7peS4i+mZpOWPpuacieiou+aYjuiAheWklu+8jEVQTCDmop3mrL7ku43pgannlKjmlrzjgIzlhaflrrnjgI3kuK3kuYvku7vkvZXljp/lp4vnorzjgII8L3A+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYWJvdXRfemhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9hYm91dF96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MDNhNjhlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9hYm91dF96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMgYWJvdXQucHJvcGVydGllcw0KLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQ0KLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykNCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncw0KLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLg0KLSMNCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9DQotDQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbGF0Zm9ybSAzLjEuMVx1ZmYwY1x1NjQyZFx1OTE0ZCBFTUYgXHU4MjA3IEdFRiANCi0NCi1ibHVyYj1FY2xpcHNlIFBsYXRmb3JtXG5cDQotXG5cDQotXHU3MjQ4XHU2NzJjXHVmZjFhMy4xLjFcblwNCi1cdTVlZmFcdTdmNmUgSURcdWZmMWFNMjAwNTA5MjktMDg0MFxuXA0KLVxuXA0KLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwNCi1cdThhY2JcdTkwMjBcdThhMmEgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXA0KLVxuXA0KLVx1NjcyY1x1NzUyMlx1NTRjMVx1NTMwNVx1NTQyYiBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvXG5cDQotXHU2MjQwXHU5NThiXHU3NjdjXHU3Njg0XHU4ZWRmXHU5YWQ0DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTJkNTEzMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgYWJvdXRfZXMucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXRfZnIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXRfamEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXRfa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXRfcHRfQlIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXRfemhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXRfemhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGFib3V0X2l0LnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGFib3V0X2RlLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmIxYmZjZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1mZWF0dXJlUGx1Z2luTmFtZT1FUEYgLSBQbGF0dGZvcm0tRmVhdHVyZQ0KLWZlYXR1cmVQbHVnaW5OYW1lTkw9RVBGIC0gUGxhdHRmb3JtLUZlYXR1cmUgKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMwZGFmZDEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotZmVhdHVyZVBsdWdpbk5hbWU9Q2FyYWN0ZXJcdTAwZWRzdGljYSBkZSBsYSBwbGF0YWZvcm1hIGRlIEVQRg0KLWZlYXR1cmVQbHVnaW5OYW1lTkw9Q2FyYWN0ZXJcdTAwZWRzdGljYSBkZSBsYSBwbGF0YWZvcm1hIGRlIEVQRiAoTkwxKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODcwOGE1Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1mZWF0dXJlUGx1Z2luTmFtZT1Gb25jdGlvbiBwbGF0ZWZvcm1lIEVQRg0KLWZlYXR1cmVQbHVnaW5OYW1lTkw9Rm9uY3Rpb24gcGxhdGVmb3JtZSBFUEYgKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1OTcyNTMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotZmVhdHVyZVBsdWdpbk5hbWU9RnVuemlvbmUgcGlhdHRhZm9ybWEgRVBGDQotZmVhdHVyZVBsdWdpbk5hbWVOTD1GdW56aW9uZSBQaWF0dGFmb3JtYSBFUEYgKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI2YjU0YzcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotZmVhdHVyZVBsdWdpbk5hbWU9RVBGIFBsYXRmb3JtIEZlYXR1cmUNCi1mZWF0dXJlUGx1Z2luTmFtZU5MPUVQRiBcdTMwZDdcdTMwZTlcdTMwYzNcdTMwYzhcdTMwZDVcdTMwYTlcdTMwZmNcdTMwZTBcdTZhNWZcdTgwZmQgKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiNGQyMTYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotZmVhdHVyZVBsdWdpbk5hbWU9RVBGIFx1ZDUwY1x1YjdhYlx1ZDNmYyBcdWFlMzBcdWIyYTUNCi1mZWF0dXJlUGx1Z2luTmFtZU5MPUVQRiBcdWQ1MGNcdWI3YWJcdWQzZmMgXHVhZTMwXHViMmE1KE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM2MDE1ZGEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotZmVhdHVyZVBsdWdpbk5hbWU9UmVjdXJzbyBkYSBQbGF0YWZvcm1hIEVQRg0KLWZlYXR1cmVQbHVnaW5OYW1lTkw9UmVjdXJzbyBkYSBQbGF0YWZvcm1hIEVQRiAoTkwxKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTM0ZGMzNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1mZWF0dXJlUGx1Z2luTmFtZT1FUEYgXHU1ZTczXHU1M2YwXHU1MjlmXHU4MGZkXHU5MGU4XHU0ZWY2DQotZmVhdHVyZVBsdWdpbk5hbWVOTD1FUEYgXHU1ZTczXHU1M2YwXHU1MjlmXHU4MGZkXHU5MGU4XHU0ZWY2XHVmZjA4TkwxXHVmZjA5DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNzRjNTRkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLWZlYXR1cmVQbHVnaW5OYW1lPUVQRiBcdTVlNzNcdTUzZjBcdTcyNzlcdTYwMjcNCi1mZWF0dXJlUGx1Z2luTmFtZU5MPUVQRiBcdTVlNzNcdTUzZjBcdTcyNzlcdTYwMjcgKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NWI4YmQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzA1YTY2My4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBQbGF0Zm9ybSAoTkwyKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDIvYWJvdXRfcnUuaHRtbCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMi9hYm91dF9ydS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ODkyMzMwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMi9hYm91dF9ydS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+DQotDQotPHRpdGxlPtCeINC/0YDQvtC00YPQutGC0LU8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJSVS1SVSI+DQotPGgyPtCe0LEg0Y3RgtC+0Lwg0LzQvtC00YPQu9C1PC9oMj4NCi0gDQotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQ0KLTxoMz7Qm9C40YbQtdC90LfQuNGPPC9oMz4NCi0NCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlDQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+Lg0KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+DQotDQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5DQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQ0KLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMi9hYm91dF9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyL2Fib3V0X3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhZGI2MDIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyL2Fib3V0X3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBhYm91dC5wcm9wZXJ0aWVzDQotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzDQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuDQotIw0KLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30NCi0NCi1mZWF0dXJlTmFtZT1cdTA0MWZcdTA0M2JcdTA0MzBcdTA0NDJcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzAgRWNsaXBzZSAzLjEuMSBcdTA0NDEgRU1GIFx1MDQzOCBHRUYgDQotDQotYmx1cmI9XHUwNDFmXHUwNDNiXHUwNDMwXHUwNDQyXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwIEVjbGlwc2VcblwNCi1cblwNCi1cdTA0MTJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0NGY6IDMuMS4xXG5cDQotXHUwNDE4XHUwNDE0IFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYVx1MDQzODogTTIwMDUwOTI5LTA4NDBcblwNCi1cblwNCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gIFx1MDQxMlx1MDQ0MVx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDQ5XHUwNDM4XHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDRiLlxuXA0KLVx1MDQxZlx1MDQzZVx1MDQ0MVx1MDQzNVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDZcdTA0NDMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXA0KLVxuXA0KLVx1MDQxMiBcdTA0NDFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzIgXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMCBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDIgXHUwNDNhXHUwNDNlXHUwNDM0LCBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzlcblwNCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjk3YTFhNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcnUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXRfcnUuaHRtbCxcDQotICAgICAgICAgICAgICAgYWJvdXRfcnUucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTA4ZWY0MS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1mZWF0dXJlUGx1Z2luTmFtZT1cdTA0MWZcdTA0M2JcdTA0MzBcdTA0NDJcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzAgRVBGDQotZmVhdHVyZVBsdWdpbk5hbWVOTD1cdTA0MWZcdTA0M2JcdTA0MzBcdTA0NDJcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzAgRVBGIChOTDEpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyYS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMmEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMmEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDJhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NmRhYTUzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMmEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDJhPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkNmVkMzguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIFBsYXRmb3JtIChOTDJhKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyYS9hYm91dF9kYS5odG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyYS9hYm91dF9kYS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZGVhMTM4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMmEvYWJvdXRfZGEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KLTx0aXRsZT5PbTwvdGl0bGU+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9IkRBLURLIj4NCi08aDI+T20gZGV0dGUgaW5kaG9sZDwvaDI+DQotIA0KLTxwPjI0LiBmZWJydWFyIDIwMDU8L3A+CQ0KLTxoMz5MaWNlbnNlPC9oMz4NCi0NCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUNCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQ0KLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UNCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDJhL2Fib3V0X2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDJhL2Fib3V0X2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRiODNlNTkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyYS9hYm91dF9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMgYWJvdXQucHJvcGVydGllcw0KLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQ0KLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykNCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncw0KLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLg0KLSMNCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9DQotDQotZmVhdHVyZU5hbWU9RWNsaXBzZS1wbGF0Zm9ybSAzLjEuMSBtZWQgRU1GIG9nIEdFRiANCi0NCi1ibHVyYj1FY2xpcHNlLXBsYXRmb3JtXG5cDQotXG5cDQotVmVyc2lvbjogMy4xLjFcblwNCi1CeWctaWQ6IE0yMDA1MDkyOS0wODQwXG5cDQotXG5cDQotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cDQotQmVzXHUwMGY4ZyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtXG5cDQotXG5cDQotRGV0dGUgcHJvZHVrdCBpbmRlaG9sZGVyIHNvZnR3YXJlLCBkZXIgZXIgdWR2aWtsZXQgYWZcblwNCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyYS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0ubmwyYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDc0OWU0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMmEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXRfZGEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXRfZGEuaHRtbA0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MTExMDVjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1mZWF0dXJlUGx1Z2luTmFtZT1FUEYgLSBwbGF0Zm9ybXNmdW5rdGlvbg0KLWZlYXR1cmVQbHVnaW5OYW1lTkw9RVBGIC0gcGxhdGZvcm1zZnVua3Rpb24gKE5MMSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUzMDZlNGIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzA5MTVkNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgUHVibGlzaGVyIChOTDEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlcjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NjU3NDEzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9rby5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MTM0YTY3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIFB1Ymxpc2hlcg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLXB1Ymxpc2hlckxhYmVsPVZlclx1MDBmNmZmZW50bGljaGVuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkY2FkYzUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9UHVibGljYWRvciBkZSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi1wdWJsaXNoZXJMYWJlbD1QdWJsaWNhcg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YTkzZGMwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPURpZmZ1c2V1ciBkZSBwdWJsaWNhdGlvbnMgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotcHVibGlzaGVyTGFiZWw9UHVibGllcg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMWVkNjU0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBQdWJsaXNoZXINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi1wdWJsaXNoZXJMYWJlbD1QdWJibGljYQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOTU4MzdhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBQdWJsaXNoZXINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi1wdWJsaXNoZXJMYWJlbD1cdTUxNmNcdTk1OGINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjY3MWYzZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHVhY2Y1XHVhYzFjXHVjNzkwDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotcHVibGlzaGVyTGFiZWw9XHVhY2Y1XHVhYzFjDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4YThhZjMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9UHVibGljYWRvciBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi1wdWJsaXNoZXJMYWJlbD1QdWJsaWNhcg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyOWJjZTZjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdTUzZDFcdTVlMDNcdTdhMGJcdTVlOGYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi1wdWJsaXNoZXJMYWJlbD1cdTUzZDFcdTVlMDMNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmIxYzY4NS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgUHVibGlzaGVyDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotcHVibGlzaGVyTGFiZWw9XHU3NjdjXHU0ZjQ4DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMi8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDIvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZDIwMzJkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVkMGFmOGEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIFB1Ymxpc2hlciAoTkwyKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXI7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjU0ZmNhNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX3J1LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDBmOWFhYy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1cdTA0MThcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGMgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotcHVibGlzaGVyTGFiZWw9XHUwNDFlXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMmEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDJhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMmEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDJhLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMmEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjZjIxMzMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMmEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwyYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE2ZWRiN2QuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBQdWJsaXNoZXIgKE5MMmEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLm5sMmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXI7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDJhL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwyYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGU2ODIzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RhLnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MjhjYTA0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgUHVibGlzaGVyDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotcHVibGlzaGVyTGFiZWw9UHVibGljXHUwMGU5cg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTZmZTVlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGQ5ZDNjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZnJhZ21lbnROYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc3BhdGg6IG5sMS5qYXIKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogZnJhZ21lbnQKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDRmNTE1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1zb3VyY2UubmwxLmphciA9IHNyYy8NCi1vdXRwdXQubmwxLmphciA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBubDEuamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZXMucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2ZyLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9qYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9DTi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgZG9jcm9vdC8sXA0KLSAgICAgICAgICAgICAgIHhzbC8sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9hYm91dF9kZS5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X2RlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkN2U1NS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X2RlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi0NCi08aHRtbD4NCi08IS0tIA0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICAgIENvbnRyaWJ1dG9yczoNCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS0tPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiLz4NCi0JPHRpdGxlPkluZm9ybWF0aW9uZW4NCi08L3RpdGxlPg0KLTxzY3JpcHQgc3JjPSJzY3JpcHRzL2NvbW1vbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+DQotCTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQotCQlib2R5IHsNCi0JCQltYXJnaW46IDhweDsNCi0JCX0NCi0JPC9zdHlsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotDQotCTxpbWcgc3JjPSIuL2ltYWdlcy9pY29uX2Fib3V0LmdpZiIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBhbHQ9IlN5bWJvbCBmw7xyIFByb2R1a3RpbmZvcm1hdGlvbmVuIiBib3JkZXI9IjAiLz48YnIgLz48YnIgLz4NCi08c3BhbiBjbGFzcz0icG9wIj5PcGVuVVAvQmFzaWM8YnIgLz4NCi1WZXJzaW9uIDEuMDxiciAvPg0KLTxiciAvPg0KLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiAgPGJyIC8+DQotQWxsZSBSZWNodGUgdm9yYmVoYWx0ZW4uPC9zcGFuPjxiciAvPjxiciAvPg0KLQk8dGFibGUgc3VtbWFyeT0iIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+DQotCSAgPHRyPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iNCIgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjIiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iamF2YXNjcmlwdDpzZWxmLmNsb3NlKCk7Ij48c3BhbiBjbGFzcz0iYnV0dG9udHh0Ij4mbmJzcDtTY2hsaWXDn2VuJm5ic3A7PC9zcGFuPjwvYT48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyIgIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQk8L3RhYmxlPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9hYm91dF9lcy5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X2VzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhjZDlhNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X2VzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi0NCi08aHRtbD4NCi08IS0tIA0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICAgIENvbnRyaWJ1dG9yczoNCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS0tPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiLz4NCi0JPHRpdGxlPkFjZXJjYSBkZTwvdGl0bGU+DQotPHNjcmlwdCBzcmM9InNjcmlwdHMvY29tbW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4NCi0JPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCi0JCWJvZHkgew0KLQkJCW1hcmdpbjogOHB4Ow0KLQkJfQ0KLQk8L3N0eWxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keT4NCi0NCi0JPGltZyBzcmM9Ii4vaW1hZ2VzL2ljb25fYWJvdXQuZ2lmIiB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGFsdD0iaWNvbm8gYWNlcmNhIGRlIiBib3JkZXI9IjAiLz48YnIgLz48YnIgLz4NCi08c3BhbiBjbGFzcz0icG9wIj5PcGVuVVAvQmFzaWM8YnIgLz4NCi1WZXJzacOzbiAxLjA8YnIgLz4NCi08YnIgLz4NCi0oYykgQ29weXJpZ2h0IENvbGFib3JhZG9yZXMgZGUgRWNsaXBzZSB5IG90cm9zIDIwMDQsIDIwMDYuPGJyIC8+DQotUmVzZXJ2YWRvcyB0b2RvcyBsb3MgZGVyZWNob3MuPC9zcGFuPjxiciAvPjxiciAvPg0KLQk8dGFibGUgc3VtbWFyeT0iIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+DQotCSAgPHRyPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iNCIgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjIiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+DQotPGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iamF2YXNjcmlwdDpzZWxmLmNsb3NlKCk7Ij48c3BhbiBjbGFzcz0iYnV0dG9udHh0Ij4mbmJzcDtDZXJyYXImbmJzcDs8L3NwYW4+PC9hPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93IiAgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCTwvdGFibGU+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X2ZyLmh0bSBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvYWJvdXRfZnIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWQ0NjE3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvYWJvdXRfZnIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLQ0KLTxodG1sPg0KLTwhLS0gDQotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gICAgQ29udHJpYnV0b3JzOg0KLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLS0+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIvPg0KLQk8dGl0bGU+QSBwcm9wb3MgZGU8L3RpdGxlPg0KLTxzY3JpcHQgc3JjPSJzY3JpcHRzL2NvbW1vbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+DQotCTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQotCQlib2R5IHsNCi0JCQltYXJnaW46IDhweDsNCi0JCX0NCi0JPC9zdHlsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotDQotCTxpbWcgc3JjPSIuL2ltYWdlcy9pY29uX2Fib3V0LmdpZiIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBhbHQ9Imlj9G5lIEEgcHJvcG9zIGRlIiBib3JkZXI9IjAiLz48YnIgLz48YnIgLz4NCi08c3BhbiBjbGFzcz0icG9wIj5PcGVuVVAvQmFzaWM8YnIgLz4NCi1WZXJzaW9uIDEuMDxiciAvPg0KLTxiciAvPg0KLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LjxiciAvPg0KLUFsbCBSaWdodHMgUmVzZXJ2ZWQuPC9zcGFuPjxiciAvPjxiciAvPg0KLQk8dGFibGUgc3VtbWFyeT0iIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+DQotCSAgPHRyPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iNCIgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjIiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iamF2YXNjcmlwdDpzZWxmLmNsb3NlKCk7Ij48c3BhbiBjbGFzcz0iYnV0dG9udHh0Ij4mbmJzcDtGZXJtZXImbmJzcDs8L3NwYW4+PC9hPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93IiAgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCTwvdGFibGU+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X2l0Lmh0bSBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvYWJvdXRfaXQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmRjZmM5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvYWJvdXRfaXQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLQ0KLTxodG1sPg0KLTwhLS0gDQotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gICAgQ29udHJpYnV0b3JzOg0KLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLS0+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIvPg0KLQk8dGl0bGU+SW5mb3JtYXppb25pIHN1DQotPC90aXRsZT4NCi08c2NyaXB0IHNyYz0ic2NyaXB0cy9jb21tb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0Pg0KLQk8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KLQkJYm9keSB7DQotCQkJbWFyZ2luOiA4cHg7DQotCQl9DQotCTwvc3R5bGU+DQotPC9oZWFkPg0KLQ0KLTxib2R5Pg0KLQ0KLQk8aW1nIHNyYz0iLi9pbWFnZXMvaWNvbl9hYm91dC5naWYiIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgYWx0PSJhYm91dCBpY29uIiBib3JkZXI9IjAiLz48YnIgLz48YnIgLz4NCi08c3BhbiBjbGFzcz0icG9wIj5PcGVuVVAvQmFzaWM8YnIgLz4NCi1WZXJzaW9uZSAxLjA8YnIgLz4NCi08YnIgLz4NCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi48YnIgLz4NCi1UdXR0aSBpIGRpcml0dGkgcmlzZXJ2YXRpLjwvc3Bhbj48YnIgLz48YnIgLz4NCi0JPHRhYmxlIHN1bW1hcnk9IiIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPg0KLQkgIDx0cj4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjQiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiBjb2xzcGFuPSIyIiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxhIGNsYXNzPSJidXR0b24iIGhyZWY9ImphdmFzY3JpcHQ6c2VsZi5jbG9zZSgpOyI+PHNwYW4gY2xhc3M9ImJ1dHRvbnR4dCI+Jm5ic3A7Q2hpdWRpJm5ic3A7PC9zcGFuPjwvYT48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyIgIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQk8L3RhYmxlPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9hYm91dF9qYS5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X2phLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ2N2U1Yi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X2phLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi0NCi08aHRtbD4NCi08IS0tIA0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICAgIENvbnRyaWJ1dG9yczoNCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS0tPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ii8+DQotCTx0aXRsZT7jg5Djg7zjgrjjg6fjg7Pmg4XloLENCi08L3RpdGxlPg0KLTxzY3JpcHQgc3JjPSJzY3JpcHRzL2NvbW1vbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+DQotCTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQotCQlib2R5IHsNCi0JCQltYXJnaW46IDhweDsNCi0JCX0NCi0JPC9zdHlsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotDQotCTxpbWcgc3JjPSIuL2ltYWdlcy9pY29uX2Fib3V0LmdpZiIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBhbHQ9IuODkOODvOOCuOODp+ODs+aDheWgseOCouOCpOOCs+ODsyIgYm9yZGVyPSIwIi8+PGJyIC8+PGJyIC8+DQotPHNwYW4gY2xhc3M9InBvcCI+T3BlblVQL0Jhc2ljPGJyIC8+DQot44OQ44O844K444On44OzIDEuMDxiciAvPg0KLTxiciAvPg0KLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LiAgPGJyIC8+DQotQWxsIFJpZ2h0cyBSZXNlcnZlZC48L3NwYW4+PGJyIC8+PGJyIC8+DQotCTx0YWJsZSBzdW1tYXJ5PSIiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4NCi0JICA8dHI+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiBjb2xzcGFuPSI0IiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25zaGFkb3ciPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iMiIgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48YSBjbGFzcz0iYnV0dG9uIiBocmVmPSJqYXZhc2NyaXB0OnNlbGYuY2xvc2UoKTsiPjxzcGFuIGNsYXNzPSJidXR0b250eHQiPiZuYnNwO+mWieOBmOOCiyZuYnNwOzwvc3Bhbj48L2E+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25zaGFkb3ciICByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25zaGFkb3ciPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25zaGFkb3ciPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JPC90YWJsZT4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvYWJvdXRfa28uaHRtIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9hYm91dF9rby5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiY2E3MjAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9hYm91dF9rby5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLQkiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotDQotPGh0bWw+DQotPCEtLSANCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAgICBDb250cmlidXRvcnM6DQotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0tLT4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIvPg0KLQk8dGl0bGU+7KCc7ZKIIOygleuztDwvdGl0bGU+DQotPHNjcmlwdCBzcmM9InNjcmlwdHMvY29tbW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4NCi0JPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCi0JCWJvZHkgew0KLQkJCW1hcmdpbjogOHB4Ow0KLQkJfQ0KLQk8L3N0eWxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keT4NCi0NCi0JPGltZyBzcmM9Ii4vaW1hZ2VzL2ljb25fYWJvdXQuZ2lmIiB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGFsdD0i7KCc7ZKIIOygleuztCDslYTsnbTsvZgiIGJvcmRlcj0iMCIvPjxiciAvPjxiciAvPg0KLTxzcGFuIGNsYXNzPSJwb3AiPk9wZW5VUC9CYXNpYzxiciAvPg0KLeuyhOyghCAxLjA8YnIgLz4NCi08YnIgLz4NCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi48YnIgLz4NCi1BbGwgUmlnaHRzIFJlc2VydmVkLjwvc3Bhbj48YnIgLz48YnIgLz4NCi0JPHRhYmxlIHN1bW1hcnk9IiIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPg0KLQkgIDx0cj4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjQiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiBjb2xzcGFuPSIyIiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxhIGNsYXNzPSJidXR0b24iIGhyZWY9ImphdmFzY3JpcHQ6c2VsZi5jbG9zZSgpOyI+PHNwYW4gY2xhc3M9ImJ1dHRvbnR4dCI+Jm5ic3A764ur6riwJm5ic3A7PC9zcGFuPjwvYT48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyIgIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQk8L3RhYmxlPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9hYm91dF9wdF9CUi5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X3B0X0JSLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZhZDRhMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X3B0X0JSLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi0NCi08aHRtbD4NCi08IS0tIA0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICAgIENvbnRyaWJ1dG9yczoNCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS0tPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiLz4NCi0JPHRpdGxlPlNvYnJlIDwvdGl0bGU+DQotPHNjcmlwdCBzcmM9InNjcmlwdHMvY29tbW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4NCi0JPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCi0JCWJvZHkgew0KLQkJCW1hcmdpbjogOHB4Ow0KLQkJfQ0KLQk8L3N0eWxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keT4NCi0NCi0JPGltZyBzcmM9Ii4vaW1hZ2VzL2ljb25fYWJvdXQuZ2lmIiB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGFsdD0iw61jb25lIHNvYnJlIiBib3JkZXI9IjAiLz48YnIgLz48YnIgLz4NCi08c3BhbiBjbGFzcz0icG9wIj5PcGVuVVAvQmFzaWM8YnIgLz4NCi1WZXJzw6NvIDEuMDxiciAvPg0KLTxiciAvPg0KLShjKSBDb3B5cmlnaHQgY29udHJpYnVpZG9yZXMgZG8gRWNsaXBzZSBlIHRlcmNlaXJvcyAyMDA0LCAyMDA2LiAgPGJyIC8+DQotVG9kb3Mgb3MgRGlyZWl0b3MgUmVzZXJ2YWRvcy48L3NwYW4+PGJyIC8+PGJyIC8+DQotCTx0YWJsZSBzdW1tYXJ5PSIiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4NCi0JICA8dHI+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiBjb2xzcGFuPSI0IiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25zaGFkb3ciPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iMiIgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48YSBjbGFzcz0iYnV0dG9uIiBocmVmPSJqYXZhc2NyaXB0OnNlbGYuY2xvc2UoKTsiPjxzcGFuIGNsYXNzPSJidXR0b250eHQiPiZuYnNwO0ZlY2hhciZuYnNwOzwvc3Bhbj48L2E+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25zaGFkb3ciICByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25zaGFkb3ciPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25zaGFkb3ciPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JPC90YWJsZT4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvYWJvdXRfemhfQ04uaHRtIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9hYm91dF96aF9DTi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYTA0NTIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9hYm91dF96aF9DTi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLQkiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotDQotPGh0bWw+DQotPCEtLSANCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAgICBDb250cmlidXRvcnM6DQotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0tLT4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIvPg0KLQk8dGl0bGU+5YWz5LqOPC90aXRsZT4NCi08c2NyaXB0IHNyYz0ic2NyaXB0cy9jb21tb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0Pg0KLQk8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KLQkJYm9keSB7DQotCQkJbWFyZ2luOiA4cHg7DQotCQl9DQotCTwvc3R5bGU+DQotPC9oZWFkPg0KLQ0KLTxib2R5Pg0KLQ0KLQk8aW1nIHNyYz0iLi9pbWFnZXMvaWNvbl9hYm91dC5naWYiIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgYWx0PSLlhbPkuo7lm77moIciIGJvcmRlcj0iMCIvPjxiciAvPjxiciAvPg0KLTxzcGFuIGNsYXNzPSJwb3AiPk9wZW5VUC9CYXNpYzxiciAvPg0KLVYxLjA8YnIgLz4NCi08YnIgLz4NCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi48YnIgLz4NCi1BbGwgUmlnaHRzIFJlc2VydmVkLjwvc3Bhbj48YnIgLz48YnIgLz4NCi0JPHRhYmxlIHN1bW1hcnk9IiIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPg0KLQkgIDx0cj4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjQiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiBjb2xzcGFuPSIyIiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxhIGNsYXNzPSJidXR0b24iIGhyZWY9ImphdmFzY3JpcHQ6c2VsZi5jbG9zZSgpOyI+PHNwYW4gY2xhc3M9ImJ1dHRvbnR4dCI+5YWz6ZetPC9zcGFuPjwvYT48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyIgIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQk8L3RhYmxlPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9hYm91dF96aF9UVy5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X3poX1RXLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmNDYzYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L2Fib3V0X3poX1RXLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi0NCi08aHRtbD4NCi08IS0tIA0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICAgIENvbnRyaWJ1dG9yczoNCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS0tPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+DQotCTx0aXRsZT7pl5zmlrw8L3RpdGxlPg0KLTxzY3JpcHQgc3JjPSJzY3JpcHRzL2NvbW1vbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+DQotCTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQotCQlib2R5IHsNCi0JCQltYXJnaW46IDhweDsNCi0JCX0NCi0JPC9zdHlsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotDQotCTxpbWcgc3JjPSIuL2ltYWdlcy9pY29uX2Fib3V0LmdpZiIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBhbHQ9IumXnOaWvOWcluekuiIgYm9yZGVyPSIwIi8+PGJyIC8+PGJyIC8+DQotPHNwYW4gY2xhc3M9InBvcCI+T3BlblVQL0Jhc2ljPGJyIC8+DQotMS4wIOeJiDxiciAvPg0KLTxiciAvPg0KLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA2LjxiciAvPg0KLUFsbCBSaWdodHMgUmVzZXJ2ZWQuPC9zcGFuPjxiciAvPjxiciAvPg0KLQk8dGFibGUgc3VtbWFyeT0iIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+DQotCSAgPHRyPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iNCIgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjIiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iamF2YXNjcmlwdDpzZWxmLmNsb3NlKCk7Ij48c3BhbiBjbGFzcz0iYnV0dG9udHh0Ij4mbmJzcDvpl5zplokmbmJzcDs8L3NwYW4+PC9hPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93IiAgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCTwvdGFibGU+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfZGUuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfZGUuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4OTM1YTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9ub2FwcGxldC9ib29rbWFya3ZpZXdzX2RlLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8vIGphdmFzY3JpcHQgZm9yIHRoZSBib29rbWFya3MgZnJhbWUgKCB0aGUgb3J5X3RvY19mcmFtZSBmcmFtZSkNCi0vLyB0aGlzIGZyYW1lIGNvbnRhaW5zIGEgY2hpbGQgaWZyYW1lIChvcnlfdG9jKQ0KLQ0KLS8vIG1lc3NhZ2VzIHRvIGJlIGV4dGVybml6ZWQNCi0vLyBoZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotdmFyIGJvb2ttYXJrdmlld3NfanNfTUVTU0FHRTEgPSAiRGllc2UgU2VpdGUgd3VyZGUgbmljaHQgaW4gZGVyIE5hdmlnYXRpb25zc3RydWt0dXJzaWNodCBnZWZ1bmRlbi4iOw0KLQ0KLWZ1bmN0aW9uIGRpc3BsYXlUcmVlKHRhYikNCi17DQotCXVybCA9IHRhYi5nZXRBdHRyaWJ1dGUoJ3VybCcpOw0KLQ0KLQlpZiAoIHNlbGVjdGVkVGFiICE9IG51bGwgKQ0KLQl7DQotCQlzZWxlY3RlZFRhYi5jbGFzc05hbWUgPSAidGFiIg0KLQl9DQotCXRhYi5jbGFzc05hbWUgPSAic2VsZWN0ZWRUYWIiDQotCXNlbGVjdGVkVGFiID0gdGFiOw0KLQ0KLQlsb2FkSWZyYW1lKCJvcnlfdG9jIiwgdXJsKTsNCi19DQotDQotZnVuY3Rpb24gbG9hZElmcmFtZShpZnJhbWVOYW1lLCB1cmwpDQotew0KLQlpZiAoIHdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0gKQ0KLQl7DQotCQl3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdLnRvY19sb2FkZWQgPSBmYWxzZTsNCi0JCXdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0ubG9jYXRpb24gPSB1cmw7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQllbHNlIHJldHVybiBmYWxzZTsNCi19DQotDQotZnVuY3Rpb24gc2hvd1BhZ2UoKQ0KLXsNCi0NCi0JcGFyZW50LmZyYW1lc1sib3J5X2RvYyJdLmxvY2F0aW9uLmhyZWYgPSB1bmVzY2FwZSh0b3BpY1RvRGlzcGxheSk7DQotfQ0KLQ0KLQ0KLS8qKg0KLSAqIGZpbmQgYSB0b3BpYyBpbiB0aGUgdHJlZTogdGhlIHRvcGljIGlzIHNldCBpbiB0b3BpY1RvRGlzcGxheQ0KLSAqIHJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzDQotICovDQotZnVuY3Rpb24gZmluZFRvY1RvcGljKCkNCi17DQotCXZhciB0b2Nfd2luZG93ID0gd2luZG93LmZyYW1lc1sib3J5X3RvYyJdOw0KLQ0KLQkvL2FsZXJ0KHRvY193aW5kb3cudG9jX2xvYWRlZCk7DQotCS8vIGNoZWNrIGZvciBmYWxzZSBpcyBub3Qgc2FmZSBzaW5jZSB0aGUgdmFsdWUgbWlnaHQgYmUgdW5kZWZpbmVkIGlmIHRoZSBmcmFtZSBpcyBub3QgbG9hZGVkIHlldA0KLQkvL2lmICh0b2Nfd2luZG93LnRvY19sb2FkZWQgPT0gZmFsc2UgKQ0KLQlpZiAoIHRvY193aW5kb3cudG9jX2xvYWRlZCAhPSB0cnVlICkNCi0Jew0KLQkJLy9pZiAoIHRvY193aW5kb3cudG9jX2xvYWRlZCA9PSB1bmRlZmluZWQgKQ0KLQkJLy97DQotCQkvLwlhbGVydCgiZ290IGl0ISIpOw0KLQkJLy99DQotCQl3aW5kb3cuc2V0VGltZW91dCgiZmluZFRvY1RvcGljKCkiLCAyMDApOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJaWYgKCB0b3BpY1RvRGlzcGxheSA9PSBudWxsICkNCi0JCXsNCi0JCQl0b3BpY1RvRGlzcGxheSA9IHRvY193aW5kb3cuZ2V0Rmlyc3RUb3BpY1VybCgpOw0KLQkJfQ0KLQkNCi0JCXZhciB0b3BpYyA9IHRvcGljVG9EaXNwbGF5Ow0KLQ0KLQkJLy8gZmluZCB0aGUgdG9waWMgaW4gdGhlIGN1cnJlbnQgdmlldywgaWYgbm90LCBsb29rIGZvciB0aGUgbmV4dCB2aWV3DQotCQlpZiAoIHRvY193aW5kb3cuc2VsZWN0VG9waWModG9waWMpID09IGZhbHNlICkNCi0JCXsNCi0JCQlpZiAoIGxvYWRpbmdUYWJJbmRleCA8IHZpZXdUYWJzLmxlbmd0aCAtMSApDQotCQkJew0KLQkJCQlkaXNwbGF5VHJlZSh2aWV3VGFic1tsb2FkaW5nVGFiSW5kZXgrK10pOw0KLQkJCQlmaW5kVG9jVG9waWMoKTsNCi0JCQl9DQotCQkJZWxzZQ0KLQkJCXsNCi0JCQkJLy8gZW5kIGZpbmRpbmcgYW5kIGdvdCBub3RoaW5nDQotCQkJCS8vIGRpc3BsYXkgdGhlIGRlZmF1bHQNCi0JCQkJYWxlcnQoYm9va21hcmt2aWV3c19qc19NRVNTQUdFMSk7DQotCQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCQkJCXNob3dQYWdlKCk7DQotCQkJfQ0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCQkJLy8gZmluZCBzdWNjZXNzZnVsLCBkaXNwbGF5IHRoZSB0b3BpYyBwYWdlDQotCQkJc2hvd1BhZ2UoKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0NCi0NCi0vLyBmaW5kIHRoZSB0b3BpYyBpbiB0aGUgY3VycmVudCB0YWINCi1mdW5jdGlvbiB3aGVyZUFtSSgpDQotew0KLQl2YXIgdXJsID0gcGFyZW50LmZyYW1lc1sib3J5X2RvYyJdLmRvY3VtZW50LlVSTDsNCi0JDQotCWlmICggdXJsICE9IG51bGwgKQ0KLQl7DQotCQl0b3BpY1RvRGlzcGxheSA9IHVybDsNCi0JCWZpbmRUb2NUb3BpYygpOw0KLQl9DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHRvZ1ZpZXdzKCkNCi17DQotCS8vIGlmIGN1cnJlbnRseSB2aXNpYmxlLCBoaWRlIGFsbCBleGNlcHQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZA0KLQlpc1ZpZXdzVmlzaWJsZSA9ICghaXNWaWV3c1Zpc2libGUpOw0KLQkNCi0JZm9yICggdmFyIGkgPSAwOyAgaSA8IHZpZXdUYWJzLmxlbmd0aDsgaSsrKQ0KLQl7DQotCQl2YXIgc2hvdyA9IGlzVmlld3NWaXNpYmxlIHx8ICh2aWV3VGFic1tpXSA9PSBzZWxlY3RlZFRhYik7DQotCQlpZiAoIHNob3cgKQ0KLQkJewkJDQotCQkJLy92aWV3VGFic1tpXS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOw0KLQkJCXZpZXdUYWJzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQkvL3ZpZXdUYWJzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsNCi0JCQl2aWV3VGFic1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJfQ0KLQl9DQotCQkNCi0JCQ0KLQ0KLX0NCi0NCi0NCi0vLyBkaXNwbGF5IHRoZSBkZWZhdWx0IHBhZ2UgYW5kIG5hdmlnYXRlIHRvIHRoZSBub2RlDQotLy8gaWYgbm8gZGVmYXVsdCBwYWdlIGlzIHNldCwgZGlzcGxheSB0aGUgZmlyc3Qgbm9kZSBvZiB0aGUgZmlyc3Qgdmlldw0KLWZ1bmN0aW9uIGluaXQoKQ0KLXsNCi0JbG9hZGluZ1RhYkluZGV4ID0gMDsNCi0JdmFyIHRhYnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3BhbiIpOw0KLQl2YXIgdGFiY291bnQgPSAwOw0KLQlmb3IgKHZhciBpPTA7IGk8dGFicy5sZW5ndGg7IGkrKykNCi0Jew0KLQkJaWYgKCB0YWJzW2ldLmdldEF0dHJpYnV0ZSgndXJsJykgIT0gbnVsbCApDQotCQl7CQkJDQotCQkJdmFyIGlzRGVmYXVsdFZpZXcgPSB0YWJzW2ldLmdldEF0dHJpYnV0ZSgnaXNEZWZhdWx0VmlldycpOw0KLQkJCWlmICggaXNEZWZhdWx0VmlldyA9PSAidHJ1ZSIgKQ0KLQkJCXsNCi0JCQkJbG9hZGluZ1RhYkluZGV4ID0gdGFiY291bnQ7DQotCQkJfQ0KLQkJCQ0KLQkJCXZpZXdUYWJzW3RhYmNvdW50KytdID0gdGFic1tpXTsNCi0JCX0NCi0JfQ0KLQ0KLQl0b3BpY1RvRGlzcGxheSA9IHBhcmVudC5nZXRDb29raWUoInJ1cF9vcnlfZG9jIik7DQotCWRpc3BsYXlUcmVlKHZpZXdUYWJzW2xvYWRpbmdUYWJJbmRleF0pOw0KLQlmaW5kVG9jVG9waWMoKTsNCi19DQotDQotDQotdmFyIHNlbGVjdGVkVGFiID0gbnVsbDsNCi12YXIgdmlld1RhYnMgPSBuZXcgQXJyYXkoKTs7DQotdmFyIGxvYWRpbmdUYWJJbmRleCA9IDA7DQotdmFyIHRvcGljVG9EaXNwbGF5ID0gbnVsbDsNCi12YXIgaXNWaWV3c1Zpc2libGUgPSB0cnVlOw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3c19lcy5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3c19lcy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEzMDhlNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfZXMuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLy8gamF2YXNjcmlwdCBmb3IgdGhlIGJvb2ttYXJrcyBmcmFtZSAoIHRoZSBvcnlfdG9jX2ZyYW1lIGZyYW1lKQ0KLS8vIHRoaXMgZnJhbWUgY29udGFpbnMgYSBjaGlsZCBpZnJhbWUgKG9yeV90b2MpDQotDQotLy8gbWVzc2FnZXMgdG8gYmUgZXh0ZXJuaXplZA0KLS8vIGhlcmUgZGVmaW5lcyBhbGwgdGhlIEkxOE4gc3BlY2lmaWMgbWVzc2FnZXMgdXNlZCBpbiB0aGUgamF2YXNjcmlwdHMNCi12YXIgYm9va21hcmt2aWV3c19qc19NRVNTQUdFMSA9ICJFc3RhIHDDoWdpbmEgbm8gaGEgcG9kaWRvIGVuY29udHJhcnNlIGVuIGxhIHZpc3RhIGRlbCDDoXJib2wgZGUgbmF2ZWdhY2nDs24uIjsNCi0NCi1mdW5jdGlvbiBkaXNwbGF5VHJlZSh0YWIpDQotew0KLQl1cmwgPSB0YWIuZ2V0QXR0cmlidXRlKCd1cmwnKTsNCi0NCi0JaWYgKCBzZWxlY3RlZFRhYiAhPSBudWxsICkNCi0Jew0KLQkJc2VsZWN0ZWRUYWIuY2xhc3NOYW1lID0gInRhYiINCi0JfQ0KLQl0YWIuY2xhc3NOYW1lID0gInNlbGVjdGVkVGFiIg0KLQlzZWxlY3RlZFRhYiA9IHRhYjsNCi0NCi0JbG9hZElmcmFtZSgib3J5X3RvYyIsIHVybCk7DQotfQ0KLQ0KLWZ1bmN0aW9uIGxvYWRJZnJhbWUoaWZyYW1lTmFtZSwgdXJsKQ0KLXsNCi0JaWYgKCB3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdICkNCi0Jew0KLQkJd2luZG93LmZyYW1lc1tpZnJhbWVOYW1lXS50b2NfbG9hZGVkID0gZmFsc2U7DQotCQl3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdLmxvY2F0aW9uID0gdXJsOw0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JZWxzZSByZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLWZ1bmN0aW9uIHNob3dQYWdlKCkNCi17DQotDQotCXBhcmVudC5mcmFtZXNbIm9yeV9kb2MiXS5sb2NhdGlvbi5ocmVmID0gdW5lc2NhcGUodG9waWNUb0Rpc3BsYXkpOw0KLX0NCi0NCi0NCi0vKioNCi0gKiBmaW5kIGEgdG9waWMgaW4gdGhlIHRyZWU6IHRoZSB0b3BpYyBpcyBzZXQgaW4gdG9waWNUb0Rpc3BsYXkNCi0gKiByZXR1cm5zIHRydWUgaWYgc3VjY2Vzcw0KLSAqLw0KLWZ1bmN0aW9uIGZpbmRUb2NUb3BpYygpDQotew0KLQl2YXIgdG9jX3dpbmRvdyA9IHdpbmRvdy5mcmFtZXNbIm9yeV90b2MiXTsNCi0NCi0JLy9hbGVydCh0b2Nfd2luZG93LnRvY19sb2FkZWQpOw0KLQkvLyBjaGVjayBmb3IgZmFsc2UgaXMgbm90IHNhZmUgc2luY2UgdGhlIHZhbHVlIG1pZ2h0IGJlIHVuZGVmaW5lZCBpZiB0aGUgZnJhbWUgaXMgbm90IGxvYWRlZCB5ZXQNCi0JLy9pZiAodG9jX3dpbmRvdy50b2NfbG9hZGVkID09IGZhbHNlICkNCi0JaWYgKCB0b2Nfd2luZG93LnRvY19sb2FkZWQgIT0gdHJ1ZSApDQotCXsNCi0JCS8vaWYgKCB0b2Nfd2luZG93LnRvY19sb2FkZWQgPT0gdW5kZWZpbmVkICkNCi0JCS8vew0KLQkJLy8JYWxlcnQoImdvdCBpdCEiKTsNCi0JCS8vfQ0KLQkJd2luZG93LnNldFRpbWVvdXQoImZpbmRUb2NUb3BpYygpIiwgMjAwKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCWlmICggdG9waWNUb0Rpc3BsYXkgPT0gbnVsbCApDQotCQl7DQotCQkJdG9waWNUb0Rpc3BsYXkgPSB0b2Nfd2luZG93LmdldEZpcnN0VG9waWNVcmwoKTsNCi0JCX0NCi0JDQotCQl2YXIgdG9waWMgPSB0b3BpY1RvRGlzcGxheTsNCi0NCi0JCS8vIGZpbmQgdGhlIHRvcGljIGluIHRoZSBjdXJyZW50IHZpZXcsIGlmIG5vdCwgbG9vayBmb3IgdGhlIG5leHQgdmlldw0KLQkJaWYgKCB0b2Nfd2luZG93LnNlbGVjdFRvcGljKHRvcGljKSA9PSBmYWxzZSApDQotCQl7DQotCQkJaWYgKCBsb2FkaW5nVGFiSW5kZXggPCB2aWV3VGFicy5sZW5ndGggLTEgKQ0KLQkJCXsNCi0JCQkJZGlzcGxheVRyZWUodmlld1RhYnNbbG9hZGluZ1RhYkluZGV4KytdKTsNCi0JCQkJZmluZFRvY1RvcGljKCk7DQotCQkJfQ0KLQkJCWVsc2UNCi0JCQl7DQotCQkJCS8vIGVuZCBmaW5kaW5nIGFuZCBnb3Qgbm90aGluZw0KLQkJCQkvLyBkaXNwbGF5IHRoZSBkZWZhdWx0DQotCQkJCWFsZXJ0KGJvb2ttYXJrdmlld3NfanNfTUVTU0FHRTEpOw0KLQkJCQlsb2FkaW5nVGFiSW5kZXggPSAwOw0KLQkJCQlzaG93UGFnZSgpOw0KLQkJCX0NCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQlsb2FkaW5nVGFiSW5kZXggPSAwOw0KLQkJCS8vIGZpbmQgc3VjY2Vzc2Z1bCwgZGlzcGxheSB0aGUgdG9waWMgcGFnZQ0KLQkJCXNob3dQYWdlKCk7DQotCQl9DQotCX0NCi19DQotDQotDQotDQotLy8gZmluZCB0aGUgdG9waWMgaW4gdGhlIGN1cnJlbnQgdGFiDQotZnVuY3Rpb24gd2hlcmVBbUkoKQ0KLXsNCi0JdmFyIHVybCA9IHBhcmVudC5mcmFtZXNbIm9yeV9kb2MiXS5kb2N1bWVudC5VUkw7DQotCQ0KLQlpZiAoIHVybCAhPSBudWxsICkNCi0Jew0KLQkJdG9waWNUb0Rpc3BsYXkgPSB1cmw7DQotCQlmaW5kVG9jVG9waWMoKTsNCi0JfQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiB0b2dWaWV3cygpDQotew0KLQkvLyBpZiBjdXJyZW50bHkgdmlzaWJsZSwgaGlkZSBhbGwgZXhjZXB0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQNCi0JaXNWaWV3c1Zpc2libGUgPSAoIWlzVmlld3NWaXNpYmxlKTsNCi0JDQotCWZvciAoIHZhciBpID0gMDsgIGkgPCB2aWV3VGFicy5sZW5ndGg7IGkrKykNCi0Jew0KLQkJdmFyIHNob3cgPSBpc1ZpZXdzVmlzaWJsZSB8fCAodmlld1RhYnNbaV0gPT0gc2VsZWN0ZWRUYWIpOw0KLQkJaWYgKCBzaG93ICkNCi0JCXsJCQ0KLQkJCS8vdmlld1RhYnNbaV0uc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsNCi0JCQl2aWV3VGFic1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJLy92aWV3VGFic1tpXS5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7DQotCQkJdmlld1RhYnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCX0NCi0JfQ0KLQkJDQotCQkNCi0NCi19DQotDQotDQotLy8gZGlzcGxheSB0aGUgZGVmYXVsdCBwYWdlIGFuZCBuYXZpZ2F0ZSB0byB0aGUgbm9kZQ0KLS8vIGlmIG5vIGRlZmF1bHQgcGFnZSBpcyBzZXQsIGRpc3BsYXkgdGhlIGZpcnN0IG5vZGUgb2YgdGhlIGZpcnN0IHZpZXcNCi1mdW5jdGlvbiBpbml0KCkNCi17DQotCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCXZhciB0YWJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKTsNCi0JdmFyIHRhYmNvdW50ID0gMDsNCi0JZm9yICh2YXIgaT0wOyBpPHRhYnMubGVuZ3RoOyBpKyspDQotCXsNCi0JCWlmICggdGFic1tpXS5nZXRBdHRyaWJ1dGUoJ3VybCcpICE9IG51bGwgKQ0KLQkJewkJCQ0KLQkJCXZhciBpc0RlZmF1bHRWaWV3ID0gdGFic1tpXS5nZXRBdHRyaWJ1dGUoJ2lzRGVmYXVsdFZpZXcnKTsNCi0JCQlpZiAoIGlzRGVmYXVsdFZpZXcgPT0gInRydWUiICkNCi0JCQl7DQotCQkJCWxvYWRpbmdUYWJJbmRleCA9IHRhYmNvdW50Ow0KLQkJCX0NCi0JCQkNCi0JCQl2aWV3VGFic1t0YWJjb3VudCsrXSA9IHRhYnNbaV07DQotCQl9DQotCX0NCi0NCi0JdG9waWNUb0Rpc3BsYXkgPSBwYXJlbnQuZ2V0Q29va2llKCJydXBfb3J5X2RvYyIpOw0KLQlkaXNwbGF5VHJlZSh2aWV3VGFic1tsb2FkaW5nVGFiSW5kZXhdKTsNCi0JZmluZFRvY1RvcGljKCk7DQotfQ0KLQ0KLQ0KLXZhciBzZWxlY3RlZFRhYiA9IG51bGw7DQotdmFyIHZpZXdUYWJzID0gbmV3IEFycmF5KCk7Ow0KLXZhciBsb2FkaW5nVGFiSW5kZXggPSAwOw0KLXZhciB0b3BpY1RvRGlzcGxheSA9IG51bGw7DQotdmFyIGlzVmlld3NWaXNpYmxlID0gdHJ1ZTsNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfZnIuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfZnIuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNjI2ZWQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9ub2FwcGxldC9ib29rbWFya3ZpZXdzX2ZyLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8vIGphdmFzY3JpcHQgZm9yIHRoZSBib29rbWFya3MgZnJhbWUgKCB0aGUgb3J5X3RvY19mcmFtZSBmcmFtZSkNCi0vLyB0aGlzIGZyYW1lIGNvbnRhaW5zIGEgY2hpbGQgaWZyYW1lIChvcnlfdG9jKQ0KLQ0KLS8vIG1lc3NhZ2VzIHRvIGJlIGV4dGVybml6ZWQNCi0vLyBoZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotdmFyIGJvb2ttYXJrdmlld3NfanNfTUVTU0FHRTEgPSAiSW1wb3NzaWJsZSBkZSB0cm91dmVyIGNldHRlIHBhZ2UgZGFucyBsYSB2dWUgZGUgbCdhcmJyZSBkZSBuYXZpZ2F0aW9uLiI7DQotDQotZnVuY3Rpb24gZGlzcGxheVRyZWUodGFiKQ0KLXsNCi0JdXJsID0gdGFiLmdldEF0dHJpYnV0ZSgndXJsJyk7DQotDQotCWlmICggc2VsZWN0ZWRUYWIgIT0gbnVsbCApDQotCXsNCi0JCXNlbGVjdGVkVGFiLmNsYXNzTmFtZSA9ICJ0YWIiDQotCX0NCi0JdGFiLmNsYXNzTmFtZSA9ICJzZWxlY3RlZFRhYiINCi0Jc2VsZWN0ZWRUYWIgPSB0YWI7DQotDQotCWxvYWRJZnJhbWUoIm9yeV90b2MiLCB1cmwpOw0KLX0NCi0NCi1mdW5jdGlvbiBsb2FkSWZyYW1lKGlmcmFtZU5hbWUsIHVybCkNCi17DQotCWlmICggd2luZG93LmZyYW1lc1tpZnJhbWVOYW1lXSApDQotCXsNCi0JCXdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0udG9jX2xvYWRlZCA9IGZhbHNlOw0KLQkJd2luZG93LmZyYW1lc1tpZnJhbWVOYW1lXS5sb2NhdGlvbiA9IHVybDsNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCWVsc2UgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi1mdW5jdGlvbiBzaG93UGFnZSgpDQotew0KLQ0KLQlwYXJlbnQuZnJhbWVzWyJvcnlfZG9jIl0ubG9jYXRpb24uaHJlZiA9IHVuZXNjYXBlKHRvcGljVG9EaXNwbGF5KTsNCi19DQotDQotDQotLyoqDQotICogZmluZCBhIHRvcGljIGluIHRoZSB0cmVlOiB0aGUgdG9waWMgaXMgc2V0IGluIHRvcGljVG9EaXNwbGF5DQotICogcmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3MNCi0gKi8NCi1mdW5jdGlvbiBmaW5kVG9jVG9waWMoKQ0KLXsNCi0JdmFyIHRvY193aW5kb3cgPSB3aW5kb3cuZnJhbWVzWyJvcnlfdG9jIl07DQotDQotCS8vYWxlcnQodG9jX3dpbmRvdy50b2NfbG9hZGVkKTsNCi0JLy8gY2hlY2sgZm9yIGZhbHNlIGlzIG5vdCBzYWZlIHNpbmNlIHRoZSB2YWx1ZSBtaWdodCBiZSB1bmRlZmluZWQgaWYgdGhlIGZyYW1lIGlzIG5vdCBsb2FkZWQgeWV0DQotCS8vaWYgKHRvY193aW5kb3cudG9jX2xvYWRlZCA9PSBmYWxzZSApDQotCWlmICggdG9jX3dpbmRvdy50b2NfbG9hZGVkICE9IHRydWUgKQ0KLQl7DQotCQkvL2lmICggdG9jX3dpbmRvdy50b2NfbG9hZGVkID09IHVuZGVmaW5lZCApDQotCQkvL3sNCi0JCS8vCWFsZXJ0KCJnb3QgaXQhIik7DQotCQkvL30NCi0JCXdpbmRvdy5zZXRUaW1lb3V0KCJmaW5kVG9jVG9waWMoKSIsIDIwMCk7DQotCX0NCi0JZWxzZQ0KLQl7DQotCQlpZiAoIHRvcGljVG9EaXNwbGF5ID09IG51bGwgKQ0KLQkJew0KLQkJCXRvcGljVG9EaXNwbGF5ID0gdG9jX3dpbmRvdy5nZXRGaXJzdFRvcGljVXJsKCk7DQotCQl9DQotCQ0KLQkJdmFyIHRvcGljID0gdG9waWNUb0Rpc3BsYXk7DQotDQotCQkvLyBmaW5kIHRoZSB0b3BpYyBpbiB0aGUgY3VycmVudCB2aWV3LCBpZiBub3QsIGxvb2sgZm9yIHRoZSBuZXh0IHZpZXcNCi0JCWlmICggdG9jX3dpbmRvdy5zZWxlY3RUb3BpYyh0b3BpYykgPT0gZmFsc2UgKQ0KLQkJew0KLQkJCWlmICggbG9hZGluZ1RhYkluZGV4IDwgdmlld1RhYnMubGVuZ3RoIC0xICkNCi0JCQl7DQotCQkJCWRpc3BsYXlUcmVlKHZpZXdUYWJzW2xvYWRpbmdUYWJJbmRleCsrXSk7DQotCQkJCWZpbmRUb2NUb3BpYygpOw0KLQkJCX0NCi0JCQllbHNlDQotCQkJew0KLQkJCQkvLyBlbmQgZmluZGluZyBhbmQgZ290IG5vdGhpbmcNCi0JCQkJLy8gZGlzcGxheSB0aGUgZGVmYXVsdA0KLQkJCQlhbGVydChib29rbWFya3ZpZXdzX2pzX01FU1NBR0UxKTsNCi0JCQkJbG9hZGluZ1RhYkluZGV4ID0gMDsNCi0JCQkJc2hvd1BhZ2UoKTsNCi0JCQl9DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJbG9hZGluZ1RhYkluZGV4ID0gMDsNCi0JCQkvLyBmaW5kIHN1Y2Nlc3NmdWwsIGRpc3BsYXkgdGhlIHRvcGljIHBhZ2UNCi0JCQlzaG93UGFnZSgpOw0KLQkJfQ0KLQl9DQotfQ0KLQ0KLQ0KLQ0KLS8vIGZpbmQgdGhlIHRvcGljIGluIHRoZSBjdXJyZW50IHRhYg0KLWZ1bmN0aW9uIHdoZXJlQW1JKCkNCi17DQotCXZhciB1cmwgPSBwYXJlbnQuZnJhbWVzWyJvcnlfZG9jIl0uZG9jdW1lbnQuVVJMOw0KLQkNCi0JaWYgKCB1cmwgIT0gbnVsbCApDQotCXsNCi0JCXRvcGljVG9EaXNwbGF5ID0gdXJsOw0KLQkJZmluZFRvY1RvcGljKCk7DQotCX0NCi19DQotDQotDQotZnVuY3Rpb24gdG9nVmlld3MoKQ0KLXsNCi0JLy8gaWYgY3VycmVudGx5IHZpc2libGUsIGhpZGUgYWxsIGV4Y2VwdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkDQotCWlzVmlld3NWaXNpYmxlID0gKCFpc1ZpZXdzVmlzaWJsZSk7DQotCQ0KLQlmb3IgKCB2YXIgaSA9IDA7ICBpIDwgdmlld1RhYnMubGVuZ3RoOyBpKyspDQotCXsNCi0JCXZhciBzaG93ID0gaXNWaWV3c1Zpc2libGUgfHwgKHZpZXdUYWJzW2ldID09IHNlbGVjdGVkVGFiKTsNCi0JCWlmICggc2hvdyApDQotCQl7CQkNCi0JCQkvL3ZpZXdUYWJzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7DQotCQkJdmlld1RhYnNbaV0uc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCS8vdmlld1RhYnNbaV0uc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOw0KLQkJCXZpZXdUYWJzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQl9DQotCX0NCi0JCQ0KLQkJDQotDQotfQ0KLQ0KLQ0KLS8vIGRpc3BsYXkgdGhlIGRlZmF1bHQgcGFnZSBhbmQgbmF2aWdhdGUgdG8gdGhlIG5vZGUNCi0vLyBpZiBubyBkZWZhdWx0IHBhZ2UgaXMgc2V0LCBkaXNwbGF5IHRoZSBmaXJzdCBub2RlIG9mIHRoZSBmaXJzdCB2aWV3DQotZnVuY3Rpb24gaW5pdCgpDQotew0KLQlsb2FkaW5nVGFiSW5kZXggPSAwOw0KLQl2YXIgdGFicyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzcGFuIik7DQotCXZhciB0YWJjb3VudCA9IDA7DQotCWZvciAodmFyIGk9MDsgaTx0YWJzLmxlbmd0aDsgaSsrKQ0KLQl7DQotCQlpZiAoIHRhYnNbaV0uZ2V0QXR0cmlidXRlKCd1cmwnKSAhPSBudWxsICkNCi0JCXsJCQkNCi0JCQl2YXIgaXNEZWZhdWx0VmlldyA9IHRhYnNbaV0uZ2V0QXR0cmlidXRlKCdpc0RlZmF1bHRWaWV3Jyk7DQotCQkJaWYgKCBpc0RlZmF1bHRWaWV3ID09ICJ0cnVlIiApDQotCQkJew0KLQkJCQlsb2FkaW5nVGFiSW5kZXggPSB0YWJjb3VudDsNCi0JCQl9DQotCQkJDQotCQkJdmlld1RhYnNbdGFiY291bnQrK10gPSB0YWJzW2ldOw0KLQkJfQ0KLQl9DQotDQotCXRvcGljVG9EaXNwbGF5ID0gcGFyZW50LmdldENvb2tpZSgicnVwX29yeV9kb2MiKTsNCi0JZGlzcGxheVRyZWUodmlld1RhYnNbbG9hZGluZ1RhYkluZGV4XSk7DQotCWZpbmRUb2NUb3BpYygpOw0KLX0NCi0NCi0NCi12YXIgc2VsZWN0ZWRUYWIgPSBudWxsOw0KLXZhciB2aWV3VGFicyA9IG5ldyBBcnJheSgpOzsNCi12YXIgbG9hZGluZ1RhYkluZGV4ID0gMDsNCi12YXIgdG9waWNUb0Rpc3BsYXkgPSBudWxsOw0KLXZhciBpc1ZpZXdzVmlzaWJsZSA9IHRydWU7DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9ub2FwcGxldC9ib29rbWFya3ZpZXdzX2l0LmpzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9ub2FwcGxldC9ib29rbWFya3ZpZXdzX2l0LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2I5ZTY5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3c19pdC5qcworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBqYXZhc2NyaXB0IGZvciB0aGUgYm9va21hcmtzIGZyYW1lICggdGhlIG9yeV90b2NfZnJhbWUgZnJhbWUpDQotLy8gdGhpcyBmcmFtZSBjb250YWlucyBhIGNoaWxkIGlmcmFtZSAob3J5X3RvYykNCi0NCi0vLyBtZXNzYWdlcyB0byBiZSBleHRlcm5pemVkDQotLy8gaGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLXZhciBib29rbWFya3ZpZXdzX2pzX01FU1NBR0UxID0gIkltcG9zc2liaWxlIHRyb3ZhcmUgcXVlc3RhIHBhZ2luYSBuZWxsYSB2aXN0YSBkZWxsYSBzdHJ1dHR1cmEgZGkgbmF2aWdhemlvbmUuIjsNCi0NCi1mdW5jdGlvbiBkaXNwbGF5VHJlZSh0YWIpDQotew0KLQl1cmwgPSB0YWIuZ2V0QXR0cmlidXRlKCd1cmwnKTsNCi0NCi0JaWYgKCBzZWxlY3RlZFRhYiAhPSBudWxsICkNCi0Jew0KLQkJc2VsZWN0ZWRUYWIuY2xhc3NOYW1lID0gInRhYiINCi0JfQ0KLQl0YWIuY2xhc3NOYW1lID0gInNlbGVjdGVkVGFiIg0KLQlzZWxlY3RlZFRhYiA9IHRhYjsNCi0NCi0JbG9hZElmcmFtZSgib3J5X3RvYyIsIHVybCk7DQotfQ0KLQ0KLWZ1bmN0aW9uIGxvYWRJZnJhbWUoaWZyYW1lTmFtZSwgdXJsKQ0KLXsNCi0JaWYgKCB3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdICkNCi0Jew0KLQkJd2luZG93LmZyYW1lc1tpZnJhbWVOYW1lXS50b2NfbG9hZGVkID0gZmFsc2U7DQotCQl3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdLmxvY2F0aW9uID0gdXJsOw0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JZWxzZSByZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLWZ1bmN0aW9uIHNob3dQYWdlKCkNCi17DQotDQotCXBhcmVudC5mcmFtZXNbIm9yeV9kb2MiXS5sb2NhdGlvbi5ocmVmID0gdW5lc2NhcGUodG9waWNUb0Rpc3BsYXkpOw0KLX0NCi0NCi0NCi0vKioNCi0gKiBmaW5kIGEgdG9waWMgaW4gdGhlIHRyZWU6IHRoZSB0b3BpYyBpcyBzZXQgaW4gdG9waWNUb0Rpc3BsYXkNCi0gKiByZXR1cm5zIHRydWUgaWYgc3VjY2Vzcw0KLSAqLw0KLWZ1bmN0aW9uIGZpbmRUb2NUb3BpYygpDQotew0KLQl2YXIgdG9jX3dpbmRvdyA9IHdpbmRvdy5mcmFtZXNbIm9yeV90b2MiXTsNCi0NCi0JLy9hbGVydCh0b2Nfd2luZG93LnRvY19sb2FkZWQpOw0KLQkvLyBjaGVjayBmb3IgZmFsc2UgaXMgbm90IHNhZmUgc2luY2UgdGhlIHZhbHVlIG1pZ2h0IGJlIHVuZGVmaW5lZCBpZiB0aGUgZnJhbWUgaXMgbm90IGxvYWRlZCB5ZXQNCi0JLy9pZiAodG9jX3dpbmRvdy50b2NfbG9hZGVkID09IGZhbHNlICkNCi0JaWYgKCB0b2Nfd2luZG93LnRvY19sb2FkZWQgIT0gdHJ1ZSApDQotCXsNCi0JCS8vaWYgKCB0b2Nfd2luZG93LnRvY19sb2FkZWQgPT0gdW5kZWZpbmVkICkNCi0JCS8vew0KLQkJLy8JYWxlcnQoImdvdCBpdCEiKTsNCi0JCS8vfQ0KLQkJd2luZG93LnNldFRpbWVvdXQoImZpbmRUb2NUb3BpYygpIiwgMjAwKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCWlmICggdG9waWNUb0Rpc3BsYXkgPT0gbnVsbCApDQotCQl7DQotCQkJdG9waWNUb0Rpc3BsYXkgPSB0b2Nfd2luZG93LmdldEZpcnN0VG9waWNVcmwoKTsNCi0JCX0NCi0JDQotCQl2YXIgdG9waWMgPSB0b3BpY1RvRGlzcGxheTsNCi0NCi0JCS8vIGZpbmQgdGhlIHRvcGljIGluIHRoZSBjdXJyZW50IHZpZXcsIGlmIG5vdCwgbG9vayBmb3IgdGhlIG5leHQgdmlldw0KLQkJaWYgKCB0b2Nfd2luZG93LnNlbGVjdFRvcGljKHRvcGljKSA9PSBmYWxzZSApDQotCQl7DQotCQkJaWYgKCBsb2FkaW5nVGFiSW5kZXggPCB2aWV3VGFicy5sZW5ndGggLTEgKQ0KLQkJCXsNCi0JCQkJZGlzcGxheVRyZWUodmlld1RhYnNbbG9hZGluZ1RhYkluZGV4KytdKTsNCi0JCQkJZmluZFRvY1RvcGljKCk7DQotCQkJfQ0KLQkJCWVsc2UNCi0JCQl7DQotCQkJCS8vIGVuZCBmaW5kaW5nIGFuZCBnb3Qgbm90aGluZw0KLQkJCQkvLyBkaXNwbGF5IHRoZSBkZWZhdWx0DQotCQkJCWFsZXJ0KGJvb2ttYXJrdmlld3NfanNfTUVTU0FHRTEpOw0KLQkJCQlsb2FkaW5nVGFiSW5kZXggPSAwOw0KLQkJCQlzaG93UGFnZSgpOw0KLQkJCX0NCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQlsb2FkaW5nVGFiSW5kZXggPSAwOw0KLQkJCS8vIGZpbmQgc3VjY2Vzc2Z1bCwgZGlzcGxheSB0aGUgdG9waWMgcGFnZQ0KLQkJCXNob3dQYWdlKCk7DQotCQl9DQotCX0NCi19DQotDQotDQotDQotLy8gZmluZCB0aGUgdG9waWMgaW4gdGhlIGN1cnJlbnQgdGFiDQotZnVuY3Rpb24gd2hlcmVBbUkoKQ0KLXsNCi0JdmFyIHVybCA9IHBhcmVudC5mcmFtZXNbIm9yeV9kb2MiXS5kb2N1bWVudC5VUkw7DQotCQ0KLQlpZiAoIHVybCAhPSBudWxsICkNCi0Jew0KLQkJdG9waWNUb0Rpc3BsYXkgPSB1cmw7DQotCQlmaW5kVG9jVG9waWMoKTsNCi0JfQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiB0b2dWaWV3cygpDQotew0KLQkvLyBpZiBjdXJyZW50bHkgdmlzaWJsZSwgaGlkZSBhbGwgZXhjZXB0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQNCi0JaXNWaWV3c1Zpc2libGUgPSAoIWlzVmlld3NWaXNpYmxlKTsNCi0JDQotCWZvciAoIHZhciBpID0gMDsgIGkgPCB2aWV3VGFicy5sZW5ndGg7IGkrKykNCi0Jew0KLQkJdmFyIHNob3cgPSBpc1ZpZXdzVmlzaWJsZSB8fCAodmlld1RhYnNbaV0gPT0gc2VsZWN0ZWRUYWIpOw0KLQkJaWYgKCBzaG93ICkNCi0JCXsJCQ0KLQkJCS8vdmlld1RhYnNbaV0uc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsNCi0JCQl2aWV3VGFic1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJLy92aWV3VGFic1tpXS5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7DQotCQkJdmlld1RhYnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCX0NCi0JfQ0KLQkJDQotCQkNCi0NCi19DQotDQotDQotLy8gZGlzcGxheSB0aGUgZGVmYXVsdCBwYWdlIGFuZCBuYXZpZ2F0ZSB0byB0aGUgbm9kZQ0KLS8vIGlmIG5vIGRlZmF1bHQgcGFnZSBpcyBzZXQsIGRpc3BsYXkgdGhlIGZpcnN0IG5vZGUgb2YgdGhlIGZpcnN0IHZpZXcNCi1mdW5jdGlvbiBpbml0KCkNCi17DQotCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCXZhciB0YWJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKTsNCi0JdmFyIHRhYmNvdW50ID0gMDsNCi0JZm9yICh2YXIgaT0wOyBpPHRhYnMubGVuZ3RoOyBpKyspDQotCXsNCi0JCWlmICggdGFic1tpXS5nZXRBdHRyaWJ1dGUoJ3VybCcpICE9IG51bGwgKQ0KLQkJewkJCQ0KLQkJCXZhciBpc0RlZmF1bHRWaWV3ID0gdGFic1tpXS5nZXRBdHRyaWJ1dGUoJ2lzRGVmYXVsdFZpZXcnKTsNCi0JCQlpZiAoIGlzRGVmYXVsdFZpZXcgPT0gInRydWUiICkNCi0JCQl7DQotCQkJCWxvYWRpbmdUYWJJbmRleCA9IHRhYmNvdW50Ow0KLQkJCX0NCi0JCQkNCi0JCQl2aWV3VGFic1t0YWJjb3VudCsrXSA9IHRhYnNbaV07DQotCQl9DQotCX0NCi0NCi0JdG9waWNUb0Rpc3BsYXkgPSBwYXJlbnQuZ2V0Q29va2llKCJydXBfb3J5X2RvYyIpOw0KLQlkaXNwbGF5VHJlZSh2aWV3VGFic1tsb2FkaW5nVGFiSW5kZXhdKTsNCi0JZmluZFRvY1RvcGljKCk7DQotfQ0KLQ0KLQ0KLXZhciBzZWxlY3RlZFRhYiA9IG51bGw7DQotdmFyIHZpZXdUYWJzID0gbmV3IEFycmF5KCk7Ow0KLXZhciBsb2FkaW5nVGFiSW5kZXggPSAwOw0KLXZhciB0b3BpY1RvRGlzcGxheSA9IG51bGw7DQotdmFyIGlzVmlld3NWaXNpYmxlID0gdHJ1ZTsNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfamEuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfamEuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNDhlOTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9ub2FwcGxldC9ib29rbWFya3ZpZXdzX2phLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8vIGphdmFzY3JpcHQgZm9yIHRoZSBib29rbWFya3MgZnJhbWUgKCB0aGUgb3J5X3RvY19mcmFtZSBmcmFtZSkNCi0vLyB0aGlzIGZyYW1lIGNvbnRhaW5zIGEgY2hpbGQgaWZyYW1lIChvcnlfdG9jKQ0KLQ0KLS8vIG1lc3NhZ2VzIHRvIGJlIGV4dGVybml6ZWQNCi0vLyBoZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotdmFyIGJvb2ttYXJrdmlld3NfanNfTUVTU0FHRTEgPSAi44GT44Gu44Oa44O844K444KS44OK44OT44Ky44O844K344On44Oz44O744OE44Oq44O844O744OT44Ol44O844Gn6KaL44Gk44GR44KL44GT44Go44GM44Gn44GN44G+44Gb44KT44Gn44GX44Gf44CCICI7DQotDQotZnVuY3Rpb24gZGlzcGxheVRyZWUodGFiKQ0KLXsNCi0JdXJsID0gdGFiLmdldEF0dHJpYnV0ZSgndXJsJyk7DQotDQotCWlmICggc2VsZWN0ZWRUYWIgIT0gbnVsbCApDQotCXsNCi0JCXNlbGVjdGVkVGFiLmNsYXNzTmFtZSA9ICJ0YWIiDQotCX0NCi0JdGFiLmNsYXNzTmFtZSA9ICJzZWxlY3RlZFRhYiINCi0Jc2VsZWN0ZWRUYWIgPSB0YWI7DQotDQotCWxvYWRJZnJhbWUoIm9yeV90b2MiLCB1cmwpOw0KLX0NCi0NCi1mdW5jdGlvbiBsb2FkSWZyYW1lKGlmcmFtZU5hbWUsIHVybCkNCi17DQotCWlmICggd2luZG93LmZyYW1lc1tpZnJhbWVOYW1lXSApDQotCXsNCi0JCXdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0udG9jX2xvYWRlZCA9IGZhbHNlOw0KLQkJd2luZG93LmZyYW1lc1tpZnJhbWVOYW1lXS5sb2NhdGlvbiA9IHVybDsNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCWVsc2UgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi1mdW5jdGlvbiBzaG93UGFnZSgpDQotew0KLQ0KLQlwYXJlbnQuZnJhbWVzWyJvcnlfZG9jIl0ubG9jYXRpb24uaHJlZiA9IHVuZXNjYXBlKHRvcGljVG9EaXNwbGF5KTsNCi19DQotDQotDQotLyoqDQotICogZmluZCBhIHRvcGljIGluIHRoZSB0cmVlOiB0aGUgdG9waWMgaXMgc2V0IGluIHRvcGljVG9EaXNwbGF5DQotICogcmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3MNCi0gKi8NCi1mdW5jdGlvbiBmaW5kVG9jVG9waWMoKQ0KLXsNCi0JdmFyIHRvY193aW5kb3cgPSB3aW5kb3cuZnJhbWVzWyJvcnlfdG9jIl07DQotDQotCS8vYWxlcnQodG9jX3dpbmRvdy50b2NfbG9hZGVkKTsNCi0JLy8gY2hlY2sgZm9yIGZhbHNlIGlzIG5vdCBzYWZlIHNpbmNlIHRoZSB2YWx1ZSBtaWdodCBiZSB1bmRlZmluZWQgaWYgdGhlIGZyYW1lIGlzIG5vdCBsb2FkZWQgeWV0DQotCS8vaWYgKHRvY193aW5kb3cudG9jX2xvYWRlZCA9PSBmYWxzZSApDQotCWlmICggdG9jX3dpbmRvdy50b2NfbG9hZGVkICE9IHRydWUgKQ0KLQl7DQotCQkvL2lmICggdG9jX3dpbmRvdy50b2NfbG9hZGVkID09IHVuZGVmaW5lZCApDQotCQkvL3sNCi0JCS8vCWFsZXJ0KCJnb3QgaXQhIik7DQotCQkvL30NCi0JCXdpbmRvdy5zZXRUaW1lb3V0KCJmaW5kVG9jVG9waWMoKSIsIDIwMCk7DQotCX0NCi0JZWxzZQ0KLQl7DQotCQlpZiAoIHRvcGljVG9EaXNwbGF5ID09IG51bGwgKQ0KLQkJew0KLQkJCXRvcGljVG9EaXNwbGF5ID0gdG9jX3dpbmRvdy5nZXRGaXJzdFRvcGljVXJsKCk7DQotCQl9DQotCQ0KLQkJdmFyIHRvcGljID0gdG9waWNUb0Rpc3BsYXk7DQotDQotCQkvLyBmaW5kIHRoZSB0b3BpYyBpbiB0aGUgY3VycmVudCB2aWV3LCBpZiBub3QsIGxvb2sgZm9yIHRoZSBuZXh0IHZpZXcNCi0JCWlmICggdG9jX3dpbmRvdy5zZWxlY3RUb3BpYyh0b3BpYykgPT0gZmFsc2UgKQ0KLQkJew0KLQkJCWlmICggbG9hZGluZ1RhYkluZGV4IDwgdmlld1RhYnMubGVuZ3RoIC0xICkNCi0JCQl7DQotCQkJCWRpc3BsYXlUcmVlKHZpZXdUYWJzW2xvYWRpbmdUYWJJbmRleCsrXSk7DQotCQkJCWZpbmRUb2NUb3BpYygpOw0KLQkJCX0NCi0JCQllbHNlDQotCQkJew0KLQkJCQkvLyBlbmQgZmluZGluZyBhbmQgZ290IG5vdGhpbmcNCi0JCQkJLy8gZGlzcGxheSB0aGUgZGVmYXVsdA0KLQkJCQlhbGVydChib29rbWFya3ZpZXdzX2pzX01FU1NBR0UxKTsNCi0JCQkJbG9hZGluZ1RhYkluZGV4ID0gMDsNCi0JCQkJc2hvd1BhZ2UoKTsNCi0JCQl9DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJbG9hZGluZ1RhYkluZGV4ID0gMDsNCi0JCQkvLyBmaW5kIHN1Y2Nlc3NmdWwsIGRpc3BsYXkgdGhlIHRvcGljIHBhZ2UNCi0JCQlzaG93UGFnZSgpOw0KLQkJfQ0KLQl9DQotfQ0KLQ0KLQ0KLQ0KLS8vIGZpbmQgdGhlIHRvcGljIGluIHRoZSBjdXJyZW50IHRhYg0KLWZ1bmN0aW9uIHdoZXJlQW1JKCkNCi17DQotCXZhciB1cmwgPSBwYXJlbnQuZnJhbWVzWyJvcnlfZG9jIl0uZG9jdW1lbnQuVVJMOw0KLQkNCi0JaWYgKCB1cmwgIT0gbnVsbCApDQotCXsNCi0JCXRvcGljVG9EaXNwbGF5ID0gdXJsOw0KLQkJZmluZFRvY1RvcGljKCk7DQotCX0NCi19DQotDQotDQotZnVuY3Rpb24gdG9nVmlld3MoKQ0KLXsNCi0JLy8gaWYgY3VycmVudGx5IHZpc2libGUsIGhpZGUgYWxsIGV4Y2VwdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkDQotCWlzVmlld3NWaXNpYmxlID0gKCFpc1ZpZXdzVmlzaWJsZSk7DQotCQ0KLQlmb3IgKCB2YXIgaSA9IDA7ICBpIDwgdmlld1RhYnMubGVuZ3RoOyBpKyspDQotCXsNCi0JCXZhciBzaG93ID0gaXNWaWV3c1Zpc2libGUgfHwgKHZpZXdUYWJzW2ldID09IHNlbGVjdGVkVGFiKTsNCi0JCWlmICggc2hvdyApDQotCQl7CQkNCi0JCQkvL3ZpZXdUYWJzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7DQotCQkJdmlld1RhYnNbaV0uc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCS8vdmlld1RhYnNbaV0uc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOw0KLQkJCXZpZXdUYWJzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQl9DQotCX0NCi0JCQ0KLQkJDQotDQotfQ0KLQ0KLQ0KLS8vIGRpc3BsYXkgdGhlIGRlZmF1bHQgcGFnZSBhbmQgbmF2aWdhdGUgdG8gdGhlIG5vZGUNCi0vLyBpZiBubyBkZWZhdWx0IHBhZ2UgaXMgc2V0LCBkaXNwbGF5IHRoZSBmaXJzdCBub2RlIG9mIHRoZSBmaXJzdCB2aWV3DQotZnVuY3Rpb24gaW5pdCgpDQotew0KLQlsb2FkaW5nVGFiSW5kZXggPSAwOw0KLQl2YXIgdGFicyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzcGFuIik7DQotCXZhciB0YWJjb3VudCA9IDA7DQotCWZvciAodmFyIGk9MDsgaTx0YWJzLmxlbmd0aDsgaSsrKQ0KLQl7DQotCQlpZiAoIHRhYnNbaV0uZ2V0QXR0cmlidXRlKCd1cmwnKSAhPSBudWxsICkNCi0JCXsJCQkNCi0JCQl2YXIgaXNEZWZhdWx0VmlldyA9IHRhYnNbaV0uZ2V0QXR0cmlidXRlKCdpc0RlZmF1bHRWaWV3Jyk7DQotCQkJaWYgKCBpc0RlZmF1bHRWaWV3ID09ICJ0cnVlIiApDQotCQkJew0KLQkJCQlsb2FkaW5nVGFiSW5kZXggPSB0YWJjb3VudDsNCi0JCQl9DQotCQkJDQotCQkJdmlld1RhYnNbdGFiY291bnQrK10gPSB0YWJzW2ldOw0KLQkJfQ0KLQl9DQotDQotCXRvcGljVG9EaXNwbGF5ID0gcGFyZW50LmdldENvb2tpZSgicnVwX29yeV9kb2MiKTsNCi0JZGlzcGxheVRyZWUodmlld1RhYnNbbG9hZGluZ1RhYkluZGV4XSk7DQotCWZpbmRUb2NUb3BpYygpOw0KLX0NCi0NCi0NCi12YXIgc2VsZWN0ZWRUYWIgPSBudWxsOw0KLXZhciB2aWV3VGFicyA9IG5ldyBBcnJheSgpOzsNCi12YXIgbG9hZGluZ1RhYkluZGV4ID0gMDsNCi12YXIgdG9waWNUb0Rpc3BsYXkgPSBudWxsOw0KLXZhciBpc1ZpZXdzVmlzaWJsZSA9IHRydWU7DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9ub2FwcGxldC9ib29rbWFya3ZpZXdzX2tvLmpzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9ub2FwcGxldC9ib29rbWFya3ZpZXdzX2tvLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yjg0MzQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3c19rby5qcworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBqYXZhc2NyaXB0IGZvciB0aGUgYm9va21hcmtzIGZyYW1lICggdGhlIG9yeV90b2NfZnJhbWUgZnJhbWUpDQotLy8gdGhpcyBmcmFtZSBjb250YWlucyBhIGNoaWxkIGlmcmFtZSAob3J5X3RvYykNCi0NCi0vLyBtZXNzYWdlcyB0byBiZSBleHRlcm5pemVkDQotLy8gaGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLXZhciBib29rbWFya3ZpZXdzX2pzX01FU1NBR0UxID0gIuydtCDtjpjsnbTsp4DripQg7YOQ7IOJIO2KuOumrCDrs7TquLDsl5DshJwg7LC+7J2EIOyImCDsl4bsirXri4jri6QuIjsNCi0NCi1mdW5jdGlvbiBkaXNwbGF5VHJlZSh0YWIpDQotew0KLQl1cmwgPSB0YWIuZ2V0QXR0cmlidXRlKCd1cmwnKTsNCi0NCi0JaWYgKCBzZWxlY3RlZFRhYiAhPSBudWxsICkNCi0Jew0KLQkJc2VsZWN0ZWRUYWIuY2xhc3NOYW1lID0gInRhYiINCi0JfQ0KLQl0YWIuY2xhc3NOYW1lID0gInNlbGVjdGVkVGFiIg0KLQlzZWxlY3RlZFRhYiA9IHRhYjsNCi0NCi0JbG9hZElmcmFtZSgib3J5X3RvYyIsIHVybCk7DQotfQ0KLQ0KLWZ1bmN0aW9uIGxvYWRJZnJhbWUoaWZyYW1lTmFtZSwgdXJsKQ0KLXsNCi0JaWYgKCB3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdICkNCi0Jew0KLQkJd2luZG93LmZyYW1lc1tpZnJhbWVOYW1lXS50b2NfbG9hZGVkID0gZmFsc2U7DQotCQl3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdLmxvY2F0aW9uID0gdXJsOw0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JZWxzZSByZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLWZ1bmN0aW9uIHNob3dQYWdlKCkNCi17DQotDQotCXBhcmVudC5mcmFtZXNbIm9yeV9kb2MiXS5sb2NhdGlvbi5ocmVmID0gdW5lc2NhcGUodG9waWNUb0Rpc3BsYXkpOw0KLX0NCi0NCi0NCi0vKioNCi0gKiBmaW5kIGEgdG9waWMgaW4gdGhlIHRyZWU6IHRoZSB0b3BpYyBpcyBzZXQgaW4gdG9waWNUb0Rpc3BsYXkNCi0gKiByZXR1cm5zIHRydWUgaWYgc3VjY2Vzcw0KLSAqLw0KLWZ1bmN0aW9uIGZpbmRUb2NUb3BpYygpDQotew0KLQl2YXIgdG9jX3dpbmRvdyA9IHdpbmRvdy5mcmFtZXNbIm9yeV90b2MiXTsNCi0NCi0JLy9hbGVydCh0b2Nfd2luZG93LnRvY19sb2FkZWQpOw0KLQkvLyBjaGVjayBmb3IgZmFsc2UgaXMgbm90IHNhZmUgc2luY2UgdGhlIHZhbHVlIG1pZ2h0IGJlIHVuZGVmaW5lZCBpZiB0aGUgZnJhbWUgaXMgbm90IGxvYWRlZCB5ZXQNCi0JLy9pZiAodG9jX3dpbmRvdy50b2NfbG9hZGVkID09IGZhbHNlICkNCi0JaWYgKCB0b2Nfd2luZG93LnRvY19sb2FkZWQgIT0gdHJ1ZSApDQotCXsNCi0JCS8vaWYgKCB0b2Nfd2luZG93LnRvY19sb2FkZWQgPT0gdW5kZWZpbmVkICkNCi0JCS8vew0KLQkJLy8JYWxlcnQoImdvdCBpdCEiKTsNCi0JCS8vfQ0KLQkJd2luZG93LnNldFRpbWVvdXQoImZpbmRUb2NUb3BpYygpIiwgMjAwKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCWlmICggdG9waWNUb0Rpc3BsYXkgPT0gbnVsbCApDQotCQl7DQotCQkJdG9waWNUb0Rpc3BsYXkgPSB0b2Nfd2luZG93LmdldEZpcnN0VG9waWNVcmwoKTsNCi0JCX0NCi0JDQotCQl2YXIgdG9waWMgPSB0b3BpY1RvRGlzcGxheTsNCi0NCi0JCS8vIGZpbmQgdGhlIHRvcGljIGluIHRoZSBjdXJyZW50IHZpZXcsIGlmIG5vdCwgbG9vayBmb3IgdGhlIG5leHQgdmlldw0KLQkJaWYgKCB0b2Nfd2luZG93LnNlbGVjdFRvcGljKHRvcGljKSA9PSBmYWxzZSApDQotCQl7DQotCQkJaWYgKCBsb2FkaW5nVGFiSW5kZXggPCB2aWV3VGFicy5sZW5ndGggLTEgKQ0KLQkJCXsNCi0JCQkJZGlzcGxheVRyZWUodmlld1RhYnNbbG9hZGluZ1RhYkluZGV4KytdKTsNCi0JCQkJZmluZFRvY1RvcGljKCk7DQotCQkJfQ0KLQkJCWVsc2UNCi0JCQl7DQotCQkJCS8vIGVuZCBmaW5kaW5nIGFuZCBnb3Qgbm90aGluZw0KLQkJCQkvLyBkaXNwbGF5IHRoZSBkZWZhdWx0DQotCQkJCWFsZXJ0KGJvb2ttYXJrdmlld3NfanNfTUVTU0FHRTEpOw0KLQkJCQlsb2FkaW5nVGFiSW5kZXggPSAwOw0KLQkJCQlzaG93UGFnZSgpOw0KLQkJCX0NCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQlsb2FkaW5nVGFiSW5kZXggPSAwOw0KLQkJCS8vIGZpbmQgc3VjY2Vzc2Z1bCwgZGlzcGxheSB0aGUgdG9waWMgcGFnZQ0KLQkJCXNob3dQYWdlKCk7DQotCQl9DQotCX0NCi19DQotDQotDQotDQotLy8gZmluZCB0aGUgdG9waWMgaW4gdGhlIGN1cnJlbnQgdGFiDQotZnVuY3Rpb24gd2hlcmVBbUkoKQ0KLXsNCi0JdmFyIHVybCA9IHBhcmVudC5mcmFtZXNbIm9yeV9kb2MiXS5kb2N1bWVudC5VUkw7DQotCQ0KLQlpZiAoIHVybCAhPSBudWxsICkNCi0Jew0KLQkJdG9waWNUb0Rpc3BsYXkgPSB1cmw7DQotCQlmaW5kVG9jVG9waWMoKTsNCi0JfQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiB0b2dWaWV3cygpDQotew0KLQkvLyBpZiBjdXJyZW50bHkgdmlzaWJsZSwgaGlkZSBhbGwgZXhjZXB0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQNCi0JaXNWaWV3c1Zpc2libGUgPSAoIWlzVmlld3NWaXNpYmxlKTsNCi0JDQotCWZvciAoIHZhciBpID0gMDsgIGkgPCB2aWV3VGFicy5sZW5ndGg7IGkrKykNCi0Jew0KLQkJdmFyIHNob3cgPSBpc1ZpZXdzVmlzaWJsZSB8fCAodmlld1RhYnNbaV0gPT0gc2VsZWN0ZWRUYWIpOw0KLQkJaWYgKCBzaG93ICkNCi0JCXsJCQ0KLQkJCS8vdmlld1RhYnNbaV0uc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsNCi0JCQl2aWV3VGFic1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJLy92aWV3VGFic1tpXS5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7DQotCQkJdmlld1RhYnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCi0JCX0NCi0JfQ0KLQkJDQotCQkNCi0NCi19DQotDQotDQotLy8gZGlzcGxheSB0aGUgZGVmYXVsdCBwYWdlIGFuZCBuYXZpZ2F0ZSB0byB0aGUgbm9kZQ0KLS8vIGlmIG5vIGRlZmF1bHQgcGFnZSBpcyBzZXQsIGRpc3BsYXkgdGhlIGZpcnN0IG5vZGUgb2YgdGhlIGZpcnN0IHZpZXcNCi1mdW5jdGlvbiBpbml0KCkNCi17DQotCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCXZhciB0YWJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKTsNCi0JdmFyIHRhYmNvdW50ID0gMDsNCi0JZm9yICh2YXIgaT0wOyBpPHRhYnMubGVuZ3RoOyBpKyspDQotCXsNCi0JCWlmICggdGFic1tpXS5nZXRBdHRyaWJ1dGUoJ3VybCcpICE9IG51bGwgKQ0KLQkJewkJCQ0KLQkJCXZhciBpc0RlZmF1bHRWaWV3ID0gdGFic1tpXS5nZXRBdHRyaWJ1dGUoJ2lzRGVmYXVsdFZpZXcnKTsNCi0JCQlpZiAoIGlzRGVmYXVsdFZpZXcgPT0gInRydWUiICkNCi0JCQl7DQotCQkJCWxvYWRpbmdUYWJJbmRleCA9IHRhYmNvdW50Ow0KLQkJCX0NCi0JCQkNCi0JCQl2aWV3VGFic1t0YWJjb3VudCsrXSA9IHRhYnNbaV07DQotCQl9DQotCX0NCi0NCi0JdG9waWNUb0Rpc3BsYXkgPSBwYXJlbnQuZ2V0Q29va2llKCJydXBfb3J5X2RvYyIpOw0KLQlkaXNwbGF5VHJlZSh2aWV3VGFic1tsb2FkaW5nVGFiSW5kZXhdKTsNCi0JZmluZFRvY1RvcGljKCk7DQotfQ0KLQ0KLQ0KLXZhciBzZWxlY3RlZFRhYiA9IG51bGw7DQotdmFyIHZpZXdUYWJzID0gbmV3IEFycmF5KCk7Ow0KLXZhciBsb2FkaW5nVGFiSW5kZXggPSAwOw0KLXZhciB0b3BpY1RvRGlzcGxheSA9IG51bGw7DQotdmFyIGlzVmlld3NWaXNpYmxlID0gdHJ1ZTsNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfcHRfQlIuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfcHRfQlIuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NjE3YzMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9ub2FwcGxldC9ib29rbWFya3ZpZXdzX3B0X0JSLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8vIGphdmFzY3JpcHQgZm9yIHRoZSBib29rbWFya3MgZnJhbWUgKCB0aGUgb3J5X3RvY19mcmFtZSBmcmFtZSkNCi0vLyB0aGlzIGZyYW1lIGNvbnRhaW5zIGEgY2hpbGQgaWZyYW1lIChvcnlfdG9jKQ0KLQ0KLS8vIG1lc3NhZ2VzIHRvIGJlIGV4dGVybml6ZWQNCi0vLyBoZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotdmFyIGJvb2ttYXJrdmlld3NfanNfTUVTU0FHRTEgPSAiRXN0YSBww6FnaW5hIG7Do28gcMO0ZGUgc2VyIGVuY29udHJhZGEgbmEgdmlzdWFsaXphw6fDo28gZGEgw6Fydm9yZSBkZSBuYXZlZ2HDp8Ojby4iOw0KLQ0KLWZ1bmN0aW9uIGRpc3BsYXlUcmVlKHRhYikNCi17DQotCXVybCA9IHRhYi5nZXRBdHRyaWJ1dGUoJ3VybCcpOw0KLQ0KLQlpZiAoIHNlbGVjdGVkVGFiICE9IG51bGwgKQ0KLQl7DQotCQlzZWxlY3RlZFRhYi5jbGFzc05hbWUgPSAidGFiIg0KLQl9DQotCXRhYi5jbGFzc05hbWUgPSAic2VsZWN0ZWRUYWIiDQotCXNlbGVjdGVkVGFiID0gdGFiOw0KLQ0KLQlsb2FkSWZyYW1lKCJvcnlfdG9jIiwgdXJsKTsNCi19DQotDQotZnVuY3Rpb24gbG9hZElmcmFtZShpZnJhbWVOYW1lLCB1cmwpDQotew0KLQlpZiAoIHdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0gKQ0KLQl7DQotCQl3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdLnRvY19sb2FkZWQgPSBmYWxzZTsNCi0JCXdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0ubG9jYXRpb24gPSB1cmw7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQllbHNlIHJldHVybiBmYWxzZTsNCi19DQotDQotZnVuY3Rpb24gc2hvd1BhZ2UoKQ0KLXsNCi0NCi0JcGFyZW50LmZyYW1lc1sib3J5X2RvYyJdLmxvY2F0aW9uLmhyZWYgPSB1bmVzY2FwZSh0b3BpY1RvRGlzcGxheSk7DQotfQ0KLQ0KLQ0KLS8qKg0KLSAqIGZpbmQgYSB0b3BpYyBpbiB0aGUgdHJlZTogdGhlIHRvcGljIGlzIHNldCBpbiB0b3BpY1RvRGlzcGxheQ0KLSAqIHJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzDQotICovDQotZnVuY3Rpb24gZmluZFRvY1RvcGljKCkNCi17DQotCXZhciB0b2Nfd2luZG93ID0gd2luZG93LmZyYW1lc1sib3J5X3RvYyJdOw0KLQ0KLQkvL2FsZXJ0KHRvY193aW5kb3cudG9jX2xvYWRlZCk7DQotCS8vIGNoZWNrIGZvciBmYWxzZSBpcyBub3Qgc2FmZSBzaW5jZSB0aGUgdmFsdWUgbWlnaHQgYmUgdW5kZWZpbmVkIGlmIHRoZSBmcmFtZSBpcyBub3QgbG9hZGVkIHlldA0KLQkvL2lmICh0b2Nfd2luZG93LnRvY19sb2FkZWQgPT0gZmFsc2UgKQ0KLQlpZiAoIHRvY193aW5kb3cudG9jX2xvYWRlZCAhPSB0cnVlICkNCi0Jew0KLQkJLy9pZiAoIHRvY193aW5kb3cudG9jX2xvYWRlZCA9PSB1bmRlZmluZWQgKQ0KLQkJLy97DQotCQkvLwlhbGVydCgiZ290IGl0ISIpOw0KLQkJLy99DQotCQl3aW5kb3cuc2V0VGltZW91dCgiZmluZFRvY1RvcGljKCkiLCAyMDApOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJaWYgKCB0b3BpY1RvRGlzcGxheSA9PSBudWxsICkNCi0JCXsNCi0JCQl0b3BpY1RvRGlzcGxheSA9IHRvY193aW5kb3cuZ2V0Rmlyc3RUb3BpY1VybCgpOw0KLQkJfQ0KLQkNCi0JCXZhciB0b3BpYyA9IHRvcGljVG9EaXNwbGF5Ow0KLQ0KLQkJLy8gZmluZCB0aGUgdG9waWMgaW4gdGhlIGN1cnJlbnQgdmlldywgaWYgbm90LCBsb29rIGZvciB0aGUgbmV4dCB2aWV3DQotCQlpZiAoIHRvY193aW5kb3cuc2VsZWN0VG9waWModG9waWMpID09IGZhbHNlICkNCi0JCXsNCi0JCQlpZiAoIGxvYWRpbmdUYWJJbmRleCA8IHZpZXdUYWJzLmxlbmd0aCAtMSApDQotCQkJew0KLQkJCQlkaXNwbGF5VHJlZSh2aWV3VGFic1tsb2FkaW5nVGFiSW5kZXgrK10pOw0KLQkJCQlmaW5kVG9jVG9waWMoKTsNCi0JCQl9DQotCQkJZWxzZQ0KLQkJCXsNCi0JCQkJLy8gZW5kIGZpbmRpbmcgYW5kIGdvdCBub3RoaW5nDQotCQkJCS8vIGRpc3BsYXkgdGhlIGRlZmF1bHQNCi0JCQkJYWxlcnQoYm9va21hcmt2aWV3c19qc19NRVNTQUdFMSk7DQotCQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCQkJCXNob3dQYWdlKCk7DQotCQkJfQ0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCQkJLy8gZmluZCBzdWNjZXNzZnVsLCBkaXNwbGF5IHRoZSB0b3BpYyBwYWdlDQotCQkJc2hvd1BhZ2UoKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0NCi0NCi0vLyBmaW5kIHRoZSB0b3BpYyBpbiB0aGUgY3VycmVudCB0YWINCi1mdW5jdGlvbiB3aGVyZUFtSSgpDQotew0KLQl2YXIgdXJsID0gcGFyZW50LmZyYW1lc1sib3J5X2RvYyJdLmRvY3VtZW50LlVSTDsNCi0JDQotCWlmICggdXJsICE9IG51bGwgKQ0KLQl7DQotCQl0b3BpY1RvRGlzcGxheSA9IHVybDsNCi0JCWZpbmRUb2NUb3BpYygpOw0KLQl9DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHRvZ1ZpZXdzKCkNCi17DQotCS8vIGlmIGN1cnJlbnRseSB2aXNpYmxlLCBoaWRlIGFsbCBleGNlcHQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZA0KLQlpc1ZpZXdzVmlzaWJsZSA9ICghaXNWaWV3c1Zpc2libGUpOw0KLQkNCi0JZm9yICggdmFyIGkgPSAwOyAgaSA8IHZpZXdUYWJzLmxlbmd0aDsgaSsrKQ0KLQl7DQotCQl2YXIgc2hvdyA9IGlzVmlld3NWaXNpYmxlIHx8ICh2aWV3VGFic1tpXSA9PSBzZWxlY3RlZFRhYik7DQotCQlpZiAoIHNob3cgKQ0KLQkJewkJDQotCQkJLy92aWV3VGFic1tpXS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOw0KLQkJCXZpZXdUYWJzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQkvL3ZpZXdUYWJzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsNCi0JCQl2aWV3VGFic1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJfQ0KLQl9DQotCQkNCi0JCQ0KLQ0KLX0NCi0NCi0NCi0vLyBkaXNwbGF5IHRoZSBkZWZhdWx0IHBhZ2UgYW5kIG5hdmlnYXRlIHRvIHRoZSBub2RlDQotLy8gaWYgbm8gZGVmYXVsdCBwYWdlIGlzIHNldCwgZGlzcGxheSB0aGUgZmlyc3Qgbm9kZSBvZiB0aGUgZmlyc3Qgdmlldw0KLWZ1bmN0aW9uIGluaXQoKQ0KLXsNCi0JbG9hZGluZ1RhYkluZGV4ID0gMDsNCi0JdmFyIHRhYnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3BhbiIpOw0KLQl2YXIgdGFiY291bnQgPSAwOw0KLQlmb3IgKHZhciBpPTA7IGk8dGFicy5sZW5ndGg7IGkrKykNCi0Jew0KLQkJaWYgKCB0YWJzW2ldLmdldEF0dHJpYnV0ZSgndXJsJykgIT0gbnVsbCApDQotCQl7CQkJDQotCQkJdmFyIGlzRGVmYXVsdFZpZXcgPSB0YWJzW2ldLmdldEF0dHJpYnV0ZSgnaXNEZWZhdWx0VmlldycpOw0KLQkJCWlmICggaXNEZWZhdWx0VmlldyA9PSAidHJ1ZSIgKQ0KLQkJCXsNCi0JCQkJbG9hZGluZ1RhYkluZGV4ID0gdGFiY291bnQ7DQotCQkJfQ0KLQkJCQ0KLQkJCXZpZXdUYWJzW3RhYmNvdW50KytdID0gdGFic1tpXTsNCi0JCX0NCi0JfQ0KLQ0KLQl0b3BpY1RvRGlzcGxheSA9IHBhcmVudC5nZXRDb29raWUoInJ1cF9vcnlfZG9jIik7DQotCWRpc3BsYXlUcmVlKHZpZXdUYWJzW2xvYWRpbmdUYWJJbmRleF0pOw0KLQlmaW5kVG9jVG9waWMoKTsNCi19DQotDQotDQotdmFyIHNlbGVjdGVkVGFiID0gbnVsbDsNCi12YXIgdmlld1RhYnMgPSBuZXcgQXJyYXkoKTs7DQotdmFyIGxvYWRpbmdUYWJJbmRleCA9IDA7DQotdmFyIHRvcGljVG9EaXNwbGF5ID0gbnVsbDsNCi12YXIgaXNWaWV3c1Zpc2libGUgPSB0cnVlOw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3c196aF9DTi5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3c196aF9DTi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFkYjBlNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfemhfQ04uanMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLy8gamF2YXNjcmlwdCBmb3IgdGhlIGJvb2ttYXJrcyBmcmFtZSAoIHRoZSBvcnlfdG9jX2ZyYW1lIGZyYW1lKQ0KLS8vIHRoaXMgZnJhbWUgY29udGFpbnMgYSBjaGlsZCBpZnJhbWUgKG9yeV90b2MpDQotDQotLy8gbWVzc2FnZXMgdG8gYmUgZXh0ZXJuaXplZA0KLS8vIGhlcmUgZGVmaW5lcyBhbGwgdGhlIEkxOE4gc3BlY2lmaWMgbWVzc2FnZXMgdXNlZCBpbiB0aGUgamF2YXNjcmlwdHMNCi12YXIgYm9va21hcmt2aWV3c19qc19NRVNTQUdFMSA9ICLml6Dms5XlnKjlr7zoiKrmoJHop4blm77kuK3mib7liLDmraTpobXpnaLjgIIiOw0KLQ0KLWZ1bmN0aW9uIGRpc3BsYXlUcmVlKHRhYikNCi17DQotCXVybCA9IHRhYi5nZXRBdHRyaWJ1dGUoJ3VybCcpOw0KLQ0KLQlpZiAoIHNlbGVjdGVkVGFiICE9IG51bGwgKQ0KLQl7DQotCQlzZWxlY3RlZFRhYi5jbGFzc05hbWUgPSAidGFiIg0KLQl9DQotCXRhYi5jbGFzc05hbWUgPSAic2VsZWN0ZWRUYWIiDQotCXNlbGVjdGVkVGFiID0gdGFiOw0KLQ0KLQlsb2FkSWZyYW1lKCJvcnlfdG9jIiwgdXJsKTsNCi19DQotDQotZnVuY3Rpb24gbG9hZElmcmFtZShpZnJhbWVOYW1lLCB1cmwpDQotew0KLQlpZiAoIHdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0gKQ0KLQl7DQotCQl3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdLnRvY19sb2FkZWQgPSBmYWxzZTsNCi0JCXdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0ubG9jYXRpb24gPSB1cmw7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQllbHNlIHJldHVybiBmYWxzZTsNCi19DQotDQotZnVuY3Rpb24gc2hvd1BhZ2UoKQ0KLXsNCi0NCi0JcGFyZW50LmZyYW1lc1sib3J5X2RvYyJdLmxvY2F0aW9uLmhyZWYgPSB1bmVzY2FwZSh0b3BpY1RvRGlzcGxheSk7DQotfQ0KLQ0KLQ0KLS8qKg0KLSAqIGZpbmQgYSB0b3BpYyBpbiB0aGUgdHJlZTogdGhlIHRvcGljIGlzIHNldCBpbiB0b3BpY1RvRGlzcGxheQ0KLSAqIHJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzDQotICovDQotZnVuY3Rpb24gZmluZFRvY1RvcGljKCkNCi17DQotCXZhciB0b2Nfd2luZG93ID0gd2luZG93LmZyYW1lc1sib3J5X3RvYyJdOw0KLQ0KLQkvL2FsZXJ0KHRvY193aW5kb3cudG9jX2xvYWRlZCk7DQotCS8vIGNoZWNrIGZvciBmYWxzZSBpcyBub3Qgc2FmZSBzaW5jZSB0aGUgdmFsdWUgbWlnaHQgYmUgdW5kZWZpbmVkIGlmIHRoZSBmcmFtZSBpcyBub3QgbG9hZGVkIHlldA0KLQkvL2lmICh0b2Nfd2luZG93LnRvY19sb2FkZWQgPT0gZmFsc2UgKQ0KLQlpZiAoIHRvY193aW5kb3cudG9jX2xvYWRlZCAhPSB0cnVlICkNCi0Jew0KLQkJLy9pZiAoIHRvY193aW5kb3cudG9jX2xvYWRlZCA9PSB1bmRlZmluZWQgKQ0KLQkJLy97DQotCQkvLwlhbGVydCgiZ290IGl0ISIpOw0KLQkJLy99DQotCQl3aW5kb3cuc2V0VGltZW91dCgiZmluZFRvY1RvcGljKCkiLCAyMDApOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJaWYgKCB0b3BpY1RvRGlzcGxheSA9PSBudWxsICkNCi0JCXsNCi0JCQl0b3BpY1RvRGlzcGxheSA9IHRvY193aW5kb3cuZ2V0Rmlyc3RUb3BpY1VybCgpOw0KLQkJfQ0KLQkNCi0JCXZhciB0b3BpYyA9IHRvcGljVG9EaXNwbGF5Ow0KLQ0KLQkJLy8gZmluZCB0aGUgdG9waWMgaW4gdGhlIGN1cnJlbnQgdmlldywgaWYgbm90LCBsb29rIGZvciB0aGUgbmV4dCB2aWV3DQotCQlpZiAoIHRvY193aW5kb3cuc2VsZWN0VG9waWModG9waWMpID09IGZhbHNlICkNCi0JCXsNCi0JCQlpZiAoIGxvYWRpbmdUYWJJbmRleCA8IHZpZXdUYWJzLmxlbmd0aCAtMSApDQotCQkJew0KLQkJCQlkaXNwbGF5VHJlZSh2aWV3VGFic1tsb2FkaW5nVGFiSW5kZXgrK10pOw0KLQkJCQlmaW5kVG9jVG9waWMoKTsNCi0JCQl9DQotCQkJZWxzZQ0KLQkJCXsNCi0JCQkJLy8gZW5kIGZpbmRpbmcgYW5kIGdvdCBub3RoaW5nDQotCQkJCS8vIGRpc3BsYXkgdGhlIGRlZmF1bHQNCi0JCQkJYWxlcnQoYm9va21hcmt2aWV3c19qc19NRVNTQUdFMSk7DQotCQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCQkJCXNob3dQYWdlKCk7DQotCQkJfQ0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCQkJLy8gZmluZCBzdWNjZXNzZnVsLCBkaXNwbGF5IHRoZSB0b3BpYyBwYWdlDQotCQkJc2hvd1BhZ2UoKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0NCi0NCi0vLyBmaW5kIHRoZSB0b3BpYyBpbiB0aGUgY3VycmVudCB0YWINCi1mdW5jdGlvbiB3aGVyZUFtSSgpDQotew0KLQl2YXIgdXJsID0gcGFyZW50LmZyYW1lc1sib3J5X2RvYyJdLmRvY3VtZW50LlVSTDsNCi0JDQotCWlmICggdXJsICE9IG51bGwgKQ0KLQl7DQotCQl0b3BpY1RvRGlzcGxheSA9IHVybDsNCi0JCWZpbmRUb2NUb3BpYygpOw0KLQl9DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHRvZ1ZpZXdzKCkNCi17DQotCS8vIGlmIGN1cnJlbnRseSB2aXNpYmxlLCBoaWRlIGFsbCBleGNlcHQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZA0KLQlpc1ZpZXdzVmlzaWJsZSA9ICghaXNWaWV3c1Zpc2libGUpOw0KLQkNCi0JZm9yICggdmFyIGkgPSAwOyAgaSA8IHZpZXdUYWJzLmxlbmd0aDsgaSsrKQ0KLQl7DQotCQl2YXIgc2hvdyA9IGlzVmlld3NWaXNpYmxlIHx8ICh2aWV3VGFic1tpXSA9PSBzZWxlY3RlZFRhYik7DQotCQlpZiAoIHNob3cgKQ0KLQkJewkJDQotCQkJLy92aWV3VGFic1tpXS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOw0KLQkJCXZpZXdUYWJzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQkvL3ZpZXdUYWJzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsNCi0JCQl2aWV3VGFic1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJfQ0KLQl9DQotCQkNCi0JCQ0KLQ0KLX0NCi0NCi0NCi0vLyBkaXNwbGF5IHRoZSBkZWZhdWx0IHBhZ2UgYW5kIG5hdmlnYXRlIHRvIHRoZSBub2RlDQotLy8gaWYgbm8gZGVmYXVsdCBwYWdlIGlzIHNldCwgZGlzcGxheSB0aGUgZmlyc3Qgbm9kZSBvZiB0aGUgZmlyc3Qgdmlldw0KLWZ1bmN0aW9uIGluaXQoKQ0KLXsNCi0JbG9hZGluZ1RhYkluZGV4ID0gMDsNCi0JdmFyIHRhYnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3BhbiIpOw0KLQl2YXIgdGFiY291bnQgPSAwOw0KLQlmb3IgKHZhciBpPTA7IGk8dGFicy5sZW5ndGg7IGkrKykNCi0Jew0KLQkJaWYgKCB0YWJzW2ldLmdldEF0dHJpYnV0ZSgndXJsJykgIT0gbnVsbCApDQotCQl7CQkJDQotCQkJdmFyIGlzRGVmYXVsdFZpZXcgPSB0YWJzW2ldLmdldEF0dHJpYnV0ZSgnaXNEZWZhdWx0VmlldycpOw0KLQkJCWlmICggaXNEZWZhdWx0VmlldyA9PSAidHJ1ZSIgKQ0KLQkJCXsNCi0JCQkJbG9hZGluZ1RhYkluZGV4ID0gdGFiY291bnQ7DQotCQkJfQ0KLQkJCQ0KLQkJCXZpZXdUYWJzW3RhYmNvdW50KytdID0gdGFic1tpXTsNCi0JCX0NCi0JfQ0KLQ0KLQl0b3BpY1RvRGlzcGxheSA9IHBhcmVudC5nZXRDb29raWUoInJ1cF9vcnlfZG9jIik7DQotCWRpc3BsYXlUcmVlKHZpZXdUYWJzW2xvYWRpbmdUYWJJbmRleF0pOw0KLQlmaW5kVG9jVG9waWMoKTsNCi19DQotDQotDQotdmFyIHNlbGVjdGVkVGFiID0gbnVsbDsNCi12YXIgdmlld1RhYnMgPSBuZXcgQXJyYXkoKTs7DQotdmFyIGxvYWRpbmdUYWJJbmRleCA9IDA7DQotdmFyIHRvcGljVG9EaXNwbGF5ID0gbnVsbDsNCi12YXIgaXNWaWV3c1Zpc2libGUgPSB0cnVlOw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3c196aF9UVy5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3c196aF9UVy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JlODk5MS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfemhfVFcuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLy8gamF2YXNjcmlwdCBmb3IgdGhlIGJvb2ttYXJrcyBmcmFtZSAoIHRoZSBvcnlfdG9jX2ZyYW1lIGZyYW1lKQ0KLS8vIHRoaXMgZnJhbWUgY29udGFpbnMgYSBjaGlsZCBpZnJhbWUgKG9yeV90b2MpDQotDQotLy8gbWVzc2FnZXMgdG8gYmUgZXh0ZXJuaXplZA0KLS8vIGhlcmUgZGVmaW5lcyBhbGwgdGhlIEkxOE4gc3BlY2lmaWMgbWVzc2FnZXMgdXNlZCBpbiB0aGUgamF2YXNjcmlwdHMNCi12YXIgYm9va21hcmt2aWV3c19qc19NRVNTQUdFMSA9ICLlnKjlsI7opr3nm67pjITmqLnoppblnJbkuK3mib7kuI3liLDpgJnkuIDpoIHjgIIiOw0KLQ0KLWZ1bmN0aW9uIGRpc3BsYXlUcmVlKHRhYikNCi17DQotCXVybCA9IHRhYi5nZXRBdHRyaWJ1dGUoJ3VybCcpOw0KLQ0KLQlpZiAoIHNlbGVjdGVkVGFiICE9IG51bGwgKQ0KLQl7DQotCQlzZWxlY3RlZFRhYi5jbGFzc05hbWUgPSAidGFiIg0KLQl9DQotCXRhYi5jbGFzc05hbWUgPSAic2VsZWN0ZWRUYWIiDQotCXNlbGVjdGVkVGFiID0gdGFiOw0KLQ0KLQlsb2FkSWZyYW1lKCJvcnlfdG9jIiwgdXJsKTsNCi19DQotDQotZnVuY3Rpb24gbG9hZElmcmFtZShpZnJhbWVOYW1lLCB1cmwpDQotew0KLQlpZiAoIHdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0gKQ0KLQl7DQotCQl3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdLnRvY19sb2FkZWQgPSBmYWxzZTsNCi0JCXdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0ubG9jYXRpb24gPSB1cmw7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQllbHNlIHJldHVybiBmYWxzZTsNCi19DQotDQotZnVuY3Rpb24gc2hvd1BhZ2UoKQ0KLXsNCi0NCi0JcGFyZW50LmZyYW1lc1sib3J5X2RvYyJdLmxvY2F0aW9uLmhyZWYgPSB1bmVzY2FwZSh0b3BpY1RvRGlzcGxheSk7DQotfQ0KLQ0KLQ0KLS8qKg0KLSAqIGZpbmQgYSB0b3BpYyBpbiB0aGUgdHJlZTogdGhlIHRvcGljIGlzIHNldCBpbiB0b3BpY1RvRGlzcGxheQ0KLSAqIHJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzDQotICovDQotZnVuY3Rpb24gZmluZFRvY1RvcGljKCkNCi17DQotCXZhciB0b2Nfd2luZG93ID0gd2luZG93LmZyYW1lc1sib3J5X3RvYyJdOw0KLQ0KLQkvL2FsZXJ0KHRvY193aW5kb3cudG9jX2xvYWRlZCk7DQotCS8vIGNoZWNrIGZvciBmYWxzZSBpcyBub3Qgc2FmZSBzaW5jZSB0aGUgdmFsdWUgbWlnaHQgYmUgdW5kZWZpbmVkIGlmIHRoZSBmcmFtZSBpcyBub3QgbG9hZGVkIHlldA0KLQkvL2lmICh0b2Nfd2luZG93LnRvY19sb2FkZWQgPT0gZmFsc2UgKQ0KLQlpZiAoIHRvY193aW5kb3cudG9jX2xvYWRlZCAhPSB0cnVlICkNCi0Jew0KLQkJLy9pZiAoIHRvY193aW5kb3cudG9jX2xvYWRlZCA9PSB1bmRlZmluZWQgKQ0KLQkJLy97DQotCQkvLwlhbGVydCgiZ290IGl0ISIpOw0KLQkJLy99DQotCQl3aW5kb3cuc2V0VGltZW91dCgiZmluZFRvY1RvcGljKCkiLCAyMDApOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJaWYgKCB0b3BpY1RvRGlzcGxheSA9PSBudWxsICkNCi0JCXsNCi0JCQl0b3BpY1RvRGlzcGxheSA9IHRvY193aW5kb3cuZ2V0Rmlyc3RUb3BpY1VybCgpOw0KLQkJfQ0KLQkNCi0JCXZhciB0b3BpYyA9IHRvcGljVG9EaXNwbGF5Ow0KLQ0KLQkJLy8gZmluZCB0aGUgdG9waWMgaW4gdGhlIGN1cnJlbnQgdmlldywgaWYgbm90LCBsb29rIGZvciB0aGUgbmV4dCB2aWV3DQotCQlpZiAoIHRvY193aW5kb3cuc2VsZWN0VG9waWModG9waWMpID09IGZhbHNlICkNCi0JCXsNCi0JCQlpZiAoIGxvYWRpbmdUYWJJbmRleCA8IHZpZXdUYWJzLmxlbmd0aCAtMSApDQotCQkJew0KLQkJCQlkaXNwbGF5VHJlZSh2aWV3VGFic1tsb2FkaW5nVGFiSW5kZXgrK10pOw0KLQkJCQlmaW5kVG9jVG9waWMoKTsNCi0JCQl9DQotCQkJZWxzZQ0KLQkJCXsNCi0JCQkJLy8gZW5kIGZpbmRpbmcgYW5kIGdvdCBub3RoaW5nDQotCQkJCS8vIGRpc3BsYXkgdGhlIGRlZmF1bHQNCi0JCQkJYWxlcnQoYm9va21hcmt2aWV3c19qc19NRVNTQUdFMSk7DQotCQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCQkJCXNob3dQYWdlKCk7DQotCQkJfQ0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCQkJLy8gZmluZCBzdWNjZXNzZnVsLCBkaXNwbGF5IHRoZSB0b3BpYyBwYWdlDQotCQkJc2hvd1BhZ2UoKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0NCi0NCi0vLyBmaW5kIHRoZSB0b3BpYyBpbiB0aGUgY3VycmVudCB0YWINCi1mdW5jdGlvbiB3aGVyZUFtSSgpDQotew0KLQl2YXIgdXJsID0gcGFyZW50LmZyYW1lc1sib3J5X2RvYyJdLmRvY3VtZW50LlVSTDsNCi0JDQotCWlmICggdXJsICE9IG51bGwgKQ0KLQl7DQotCQl0b3BpY1RvRGlzcGxheSA9IHVybDsNCi0JCWZpbmRUb2NUb3BpYygpOw0KLQl9DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHRvZ1ZpZXdzKCkNCi17DQotCS8vIGlmIGN1cnJlbnRseSB2aXNpYmxlLCBoaWRlIGFsbCBleGNlcHQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZA0KLQlpc1ZpZXdzVmlzaWJsZSA9ICghaXNWaWV3c1Zpc2libGUpOw0KLQkNCi0JZm9yICggdmFyIGkgPSAwOyAgaSA8IHZpZXdUYWJzLmxlbmd0aDsgaSsrKQ0KLQl7DQotCQl2YXIgc2hvdyA9IGlzVmlld3NWaXNpYmxlIHx8ICh2aWV3VGFic1tpXSA9PSBzZWxlY3RlZFRhYik7DQotCQlpZiAoIHNob3cgKQ0KLQkJewkJDQotCQkJLy92aWV3VGFic1tpXS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOw0KLQkJCXZpZXdUYWJzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQkvL3ZpZXdUYWJzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsNCi0JCQl2aWV3VGFic1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJfQ0KLQl9DQotCQkNCi0JCQ0KLQ0KLX0NCi0NCi0NCi0vLyBkaXNwbGF5IHRoZSBkZWZhdWx0IHBhZ2UgYW5kIG5hdmlnYXRlIHRvIHRoZSBub2RlDQotLy8gaWYgbm8gZGVmYXVsdCBwYWdlIGlzIHNldCwgZGlzcGxheSB0aGUgZmlyc3Qgbm9kZSBvZiB0aGUgZmlyc3Qgdmlldw0KLWZ1bmN0aW9uIGluaXQoKQ0KLXsNCi0JbG9hZGluZ1RhYkluZGV4ID0gMDsNCi0JdmFyIHRhYnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3BhbiIpOw0KLQl2YXIgdGFiY291bnQgPSAwOw0KLQlmb3IgKHZhciBpPTA7IGk8dGFicy5sZW5ndGg7IGkrKykNCi0Jew0KLQkJaWYgKCB0YWJzW2ldLmdldEF0dHJpYnV0ZSgndXJsJykgIT0gbnVsbCApDQotCQl7CQkJDQotCQkJdmFyIGlzRGVmYXVsdFZpZXcgPSB0YWJzW2ldLmdldEF0dHJpYnV0ZSgnaXNEZWZhdWx0VmlldycpOw0KLQkJCWlmICggaXNEZWZhdWx0VmlldyA9PSAidHJ1ZSIgKQ0KLQkJCXsNCi0JCQkJbG9hZGluZ1RhYkluZGV4ID0gdGFiY291bnQ7DQotCQkJfQ0KLQkJCQ0KLQkJCXZpZXdUYWJzW3RhYmNvdW50KytdID0gdGFic1tpXTsNCi0JCX0NCi0JfQ0KLQ0KLQl0b3BpY1RvRGlzcGxheSA9IHBhcmVudC5nZXRDb29raWUoInJ1cF9vcnlfZG9jIik7DQotCWRpc3BsYXlUcmVlKHZpZXdUYWJzW2xvYWRpbmdUYWJJbmRleF0pOw0KLQlmaW5kVG9jVG9waWMoKTsNCi19DQotDQotDQotdmFyIHNlbGVjdGVkVGFiID0gbnVsbDsNCi12YXIgdmlld1RhYnMgPSBuZXcgQXJyYXkoKTs7DQotdmFyIGxvYWRpbmdUYWJJbmRleCA9IDA7DQotdmFyIHRvcGljVG9EaXNwbGF5ID0gbnVsbDsNCi12YXIgaXNWaWV3c1Zpc2libGUgPSB0cnVlOw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF9kZS5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXhfZGUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTRjYWI4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF9kZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy9EVEQgSFRNTCA0LjAxLy9FTiINCi0gICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPg0KLTxIVE1MPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPg0KLTxtZXRhIG5hbWU9Im1ldGFfdGFnZ2VkIiBjb250ZW50PSJ0cnVlIj4NCi08dGl0bGU+R2xvc3NhciAtIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms8L3RpdGxlPg0KLTwvaGVhZD4NCi08ZnJhbWVzZXQgcm93cz0iMjUsKiI+DQotPGZyYW1lIG5hbWU9Imdsb3NzYXJ5X25hdiIgc3JjPSJuYXZpZy5odG0iIHNjcm9sbGluZz0ibm8iIG1hcmdpbmhlaWdodD0iMiIgbWFyZ2lud2lkdGg9IjIiIHRpdGxlPSJOYXZpZ2F0aW9uc2JlcmVpY2giPg0KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9kb2MiIHNyYz0iLi4vZ2xvc3NhcnkuaHRtIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIyIiBzY3JvbGxpbmc9ImF1dG8iIHRpdGxlPSJJbmhhbHRzYmVyZWljaCI+DQotPC9mcmFtZXNldD4NCi08L0hUTUw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4X2VzLmh0bSBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF9lcy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MmEyNDIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4X2VzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDL0RURCBIVE1MIDQuMDEvL0VOIg0KLSAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+DQotPEhUTUw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+DQotPG1ldGEgbmFtZT0ibWV0YV90YWdnZWQiIGNvbnRlbnQ9InRydWUiPg0KLTx0aXRsZT5HbG9zYXJpbyAtIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms8L3RpdGxlPg0KLTwvaGVhZD4NCi08ZnJhbWVzZXQgcm93cz0iMjUsKiI+DQotPGZyYW1lIG5hbWU9Imdsb3NzYXJ5X25hdiIgc3JjPSJuYXZpZy5odG0iIHNjcm9sbGluZz0ibm8iIG1hcmdpbmhlaWdodD0iMiIgbWFyZ2lud2lkdGg9IjIiIHRpdGxlPSLBcmVhIGRlIG5hdmVnYWNp824iPg0KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9kb2MiIHNyYz0iLi4vZ2xvc3NhcnkuaHRtIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIyIiBzY3JvbGxpbmc9ImF1dG8iIHRpdGxlPSLBcmVhIGRlIGNvbnRlbmlkbyI+DQotPC9mcmFtZXNldD4NCi08L0hUTUw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4X2ZyLmh0bSBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF9mci5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmN2ViNDMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4X2ZyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDL0RURCBIVE1MIDQuMDEvL0VOIg0KLSAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+DQotPEhUTUw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+DQotPG1ldGEgbmFtZT0ibWV0YV90YWdnZWQiIGNvbnRlbnQ9InRydWUiPg0KLTx0aXRsZT5HbG9zc2FpcmUgLSBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrPC90aXRsZT4NCi08L2hlYWQ+DQotPGZyYW1lc2V0IHJvd3M9IjI1LCoiPg0KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9uYXYiIHNyYz0ibmF2aWcuaHRtIiBzY3JvbGxpbmc9Im5vIiBtYXJnaW5oZWlnaHQ9IjIiIG1hcmdpbndpZHRoPSIyIiB0aXRsZT0iWm9uZSBkZSBuYXZpZ2F0aW9uIj4NCi08ZnJhbWUgbmFtZT0iZ2xvc3NhcnlfZG9jIiBzcmM9Ii4uL2dsb3NzYXJ5Lmh0bSIgbWFyZ2luaGVpZ2h0PSIwIiBtYXJnaW53aWR0aD0iMiIgc2Nyb2xsaW5nPSJhdXRvIiB0aXRsZT0iWm9uZSBkZSBjb250ZW51Ij4NCi08L2ZyYW1lc2V0Pg0KLTwvSFRNTD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXhfaXQuaHRtIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4X2l0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY0ZTMyZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXhfaXQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvRFREIEhUTUwgNC4wMS8vRU4iDQotICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4NCi08SFRNTD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCi08bWV0YSBuYW1lPSJtZXRhX3RhZ2dlZCIgY29udGVudD0idHJ1ZSI+DQotPHRpdGxlPkdsb3NzYXJpbyAtIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms8L3RpdGxlPg0KLTwvaGVhZD4NCi08ZnJhbWVzZXQgcm93cz0iMjUsKiI+DQotPGZyYW1lIG5hbWU9Imdsb3NzYXJ5X25hdiIgc3JjPSJuYXZpZy5odG0iIHNjcm9sbGluZz0ibm8iIG1hcmdpbmhlaWdodD0iMiIgbWFyZ2lud2lkdGg9IjIiIHRpdGxlPSJBcmVhIGRpIG5hdmlnYXppb25lIj4NCi08ZnJhbWUgbmFtZT0iZ2xvc3NhcnlfZG9jIiBzcmM9Ii4uL2dsb3NzYXJ5Lmh0bSIgbWFyZ2luaGVpZ2h0PSIwIiBtYXJnaW53aWR0aD0iMiIgc2Nyb2xsaW5nPSJhdXRvIiB0aXRsZT0iQXJlYSBjb250ZW51dGkiPg0KLTwvZnJhbWVzZXQ+DQotPC9IVE1MPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF9qYS5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXhfamEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjlmYTliLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF9qYS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy9EVEQgSFRNTCA0LjAxLy9FTiINCi0gICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPg0KLTxIVE1MPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4NCi08bWV0YSBuYW1lPSJtZXRhX3RhZ2dlZCIgY29udGVudD0idHJ1ZSI+DQotPHRpdGxlPueUqOiqnumbhiAtIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms8L3RpdGxlPg0KLTwvaGVhZD4NCi08ZnJhbWVzZXQgcm93cz0iMjUsKiI+DQotPGZyYW1lIG5hbWU9Imdsb3NzYXJ5X25hdiIgc3JjPSJuYXZpZy5odG0iIHNjcm9sbGluZz0ibm8iIG1hcmdpbmhlaWdodD0iMiIgbWFyZ2lud2lkdGg9IjIiIHRpdGxlPSLjg4rjg5PjgrLjg7zjgrfjg6fjg7PpoJjln58iPg0KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9kb2MiIHNyYz0iLi4vZ2xvc3NhcnkuaHRtIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIyIiBzY3JvbGxpbmc9ImF1dG8iIHRpdGxlPSLjgrPjg7Pjg4bjg7Pjg4TpoJjln58iPg0KLTwvZnJhbWVzZXQ+DQotPC9IVE1MPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF9rby5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXhfa28uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmM5NDExLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF9rby5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy9EVEQgSFRNTCA0LjAxLy9FTiINCi0gICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPg0KLTxIVE1MPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCi08bWV0YSBuYW1lPSJtZXRhX3RhZ2dlZCIgY29udGVudD0idHJ1ZSI+DQotPHRpdGxlPuyaqeyWtOynkS0gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yazwvdGl0bGU+DQotPC9oZWFkPg0KLTxmcmFtZXNldCByb3dzPSIyNSwqIj4NCi08ZnJhbWUgbmFtZT0iZ2xvc3NhcnlfbmF2IiBzcmM9Im5hdmlnLmh0bSIgc2Nyb2xsaW5nPSJubyIgbWFyZ2luaGVpZ2h0PSIyIiBtYXJnaW53aWR0aD0iMiIgdGl0bGU9Iu2DkOyDiSDsmIHsl60iPg0KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9kb2MiIHNyYz0iLi4vZ2xvc3NhcnkuaHRtIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIyIiBzY3JvbGxpbmc9ImF1dG8iIHRpdGxlPSLsu6jthZDsuKAg7JiB7JetIj4NCi08L2ZyYW1lc2V0Pg0KLTwvSFRNTD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXhfcHRfQlIuaHRtIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4X3B0X0JSLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI1NDhmYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXhfcHRfQlIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvRFREIEhUTUwgNC4wMS8vRU4iDQotICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4NCi08SFRNTD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCi08bWV0YSBuYW1lPSJtZXRhX3RhZ2dlZCIgY29udGVudD0idHJ1ZSI+DQotPHRpdGxlPkdsb3Nzw6FyaW8gLSBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrPC90aXRsZT4NCi08L2hlYWQ+DQotPGZyYW1lc2V0IHJvd3M9IjI1LCoiPg0KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9uYXYiIHNyYz0ibmF2aWcuaHRtIiBzY3JvbGxpbmc9Im5vIiBtYXJnaW5oZWlnaHQ9IjIiIG1hcmdpbndpZHRoPSIyIiB0aXRsZT0iw4FyZWEgZGUgTmF2ZWdhw6fDo28iPg0KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9kb2MiIHNyYz0iLi4vZ2xvc3NhcnkuaHRtIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIyIiBzY3JvbGxpbmc9ImF1dG8iIHRpdGxlPSLDgXJlYSBkZSBDb250ZcO6ZG8iPg0KLTwvZnJhbWVzZXQ+DQotPC9IVE1MPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF96aF9DTi5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXhfemhfQ04uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjA3MWQwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF96aF9DTi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy9EVEQgSFRNTCA0LjAxLy9FTiINCi0gICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPg0KLTxIVE1MPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4NCi08bWV0YSBuYW1lPSJtZXRhX3RhZ2dlZCIgY29udGVudD0idHJ1ZSI+DQotPHRpdGxlPuivjeaxh+ihqCDvvI0gRWNsaXBzZSDmtYHnqIvmoYbmnrY8L3RpdGxlPg0KLTwvaGVhZD4NCi08ZnJhbWVzZXQgcm93cz0iMjUsKiI+DQotPGZyYW1lIG5hbWU9Imdsb3NzYXJ5X25hdiIgc3JjPSJuYXZpZy5odG0iIHNjcm9sbGluZz0ibm8iIG1hcmdpbmhlaWdodD0iMiIgbWFyZ2lud2lkdGg9IjIiIHRpdGxlPSLlr7zoiKrljLrln58iPg0KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9kb2MiIHNyYz0iLi4vZ2xvc3NhcnkuaHRtIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIyIiBzY3JvbGxpbmc9ImF1dG8iIHRpdGxlPSLlhoXlrrnljLrln58iPg0KLTwvZnJhbWVzZXQ+DQotPC9IVE1MPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF96aF9UVy5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXhfemhfVFcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTQyMDUzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF96aF9UVy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy9EVEQgSFRNTCA0LjAxLy9FTiINCi0gICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPg0KLTxIVE1MPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCi08bWV0YSBuYW1lPSJtZXRhX3RhZ2dlZCIgY29udGVudD0idHJ1ZSI+DQotPHRpdGxlPuWQjeipnuino+mHiyAtIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms8L3RpdGxlPg0KLTwvaGVhZD4NCi08ZnJhbWVzZXQgcm93cz0iMjUsKiI+DQotPGZyYW1lIG5hbWU9Imdsb3NzYXJ5X25hdiIgc3JjPSJuYXZpZy5odG0iIHNjcm9sbGluZz0ibm8iIG1hcmdpbmhlaWdodD0iMiIgbWFyZ2lud2lkdGg9IjIiIHRpdGxlPSLlsI7opr3ljYAiPg0KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9kb2MiIHNyYz0iLi4vZ2xvc3NhcnkuaHRtIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIyIiBzY3JvbGxpbmc9ImF1dG8iIHRpdGxlPSLlhaflrrnljYAiPg0KLTwvZnJhbWVzZXQ+DQotPC9IVE1MPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXZfZGUuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3NjcmlwdHMvdG9wbmF2X2RlLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTk5NTE1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXZfZGUuanMKKysrIC9kZXYvbnVsbApAQCAtMSw3ODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLy8gbWVzc2FnZXMgdG8gYmUgZXh0ZXJuaXplZA0KLS8vIGhlcmUgZGVmaW5lcyBhbGwgdGhlIEkxOE4gc3BlY2lmaWMgbWVzc2FnZXMgdXNlZCBpbiB0aGUgamF2YXNjcmlwdHMNCi0NCi12YXIgdG9wbmF2X2pzX01FU1NBR0UxID0gIkRlciBCYXVtc3RydWt0dXJicm93c2VyIGlzdCBub2NoIG5pY2h0IGdlbGFkZW4hXG5CaXR0ZSB3YXJ0ZW4hIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0UyID0gIkVzIGlzdCBrZWluZSBTZWl0ZSAnezB9JyBmw7xyIGRpZXNlIFNlaXRlIHZvcmhhbmRlbi5cblZlcndlbmRlbiBTaWUgZWluZSBkZXIgYW5kZXJlbiBOYXZpZ2F0aW9uc3NjaGFsdGZsw6RjaGVuLiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMyA9ICJFcyBpc3Qga2VpbmUgU2VpdGUgezB9IHZvcmhhbmRlbiEiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV9wcmV2ID0gInp1csO8Y2siOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV9uZXh0ID0gIndlaXRlciI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3VwID0gIm5hY2ggb2JlbiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFNCA9ICJEaWUgYWt0dWVsbGUgRGF0ZWkgaXN0IG5pY2h0IGltIEJhdW1zdHJ1a3R1cmJyb3dzZXIgZW50aGFsdGVuLiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFNSA9ICJEaWUgdmVyw7ZmZmVudGxpY2hlIFNpdGUgd2lyZCBiZXJlaXRzIG1pdCBSYWhtZW4gYW5nZXplaWd0LiI7DQotDQotZnVuY3Rpb24gZm9ybWF0U3RyaW5nKG1lc3NhZ2UsIHJlcGxhY2UwKQ0KLXsNCi0gICAJcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgvXHswXH0vLCByZXBsYWNlMCk7DQotfSANCi0NCi0vLyB0aGlzIHNjcmlwdCBpcyBmb3IgdGhlIHRvcG5hdi5odG1sDQotLy8gdGhpcyBpcyBOT1QgZm9yIGdlbmVyYWwgdXNlDQotTVNGUGhvdmVyID0NCi0oKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTmV0c2NhcGUiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSAzICkpIHx8DQotICAoKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpKTsNCi0NCi0gIGZ1bmN0aW9uIE1TRlBwcmVsb2FkKGltZykNCi0gIHsNCi0gICAgIHZhciBhPW5ldyBJbWFnZSgpOw0KLSAgICAgYS5zcmM9aW1nOw0KLSAgICAgcmV0dXJuIGE7DQotICB9DQotICANCi12YXIgdG91ciA9IDA7DQotDQotZnVuY3Rpb24gb3BlbkZpcnN0VG91ciAoKQ0KLS8vIG9wZW4gdGhlIGd1aWRlZCB0b3VyIC9oYWFrYW4gOTkwMzI0DQotew0KLWlmKCF0b3VyIHx8IHRvdXI9PW51bGwgfHwgdG91ci5jbG9zZWQpDQotICAgIHsNCi0gICAgICB0b3VyID0gb3BlbigiLi90b3VyL3RvdXIuaHRtIiwidG91cl9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM1MCxoZWlnaHQ9NzAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5Ub3VyICgpDQotLy8gb3BlbiB0aGUgZ3VpZGVkIHRvdXIgL2hhYWthbiA5OTAzMjQNCi17DQotaWYoIXRvdXIgfHwgdG91cj09bnVsbCB8fCB0b3VyLmNsb3NlZCkNCi0gICAgew0KLSAgICAgIHRvdXIgPSBvcGVuKCIuL3RvdXIvdG91ci5odG0iLCJ0b3VyX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9MzUwLGhlaWdodD03MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotLy9BZGRpdGlvbiBieSBDaGluaCBWbyAwMy8yOC8wMA0KLSBmdW5jdGlvbiBkaXNwbGF5R2V0dGluZ1N0YXJ0ZWQoKQ0KLSB7DQotIAl2YXIgcGFnZVBhdHRlcm4gPSAvb3Z1X3Byb2MvOw0KLSAJdmFyIG1haW5QYWdlID0gd2luZG93LnBhcmVudC5vcnlfZG9jLmxvY2F0aW9uOw0KLQ0KLSAJaWYgKCBwYWdlUGF0dGVybi50ZXN0KCBtYWluUGFnZSApICkgew0KLSAgICAJaWYgKGdldENvb2tpZSgiUlVQIikgIT0gImNoZWNrZWQiKSB7IG9wZW5GaXJzdFRvdXIoKTsgfQ0KLQl9DQotCWVsc2Ugew0KLQkJc2V0VGltZW91dCggImRpc3BsYXlHZXR0aW5nU3RhcnRlZCgpIiwgMTAwMCApOw0KLQl9DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldENvb2tpZSAobmFtZSkNCi17DQotICB2YXIgZGNvb2tpZSA9IGRvY3VtZW50LmNvb2tpZTsNCi0gIHZhciBjbmFtZSA9IG5hbWUgKyAiPSI7DQotICB2YXIgY2xlbiA9IGRjb29raWUubGVuZ3RoOw0KLSAgdmFyIGNiZWdpbiA9IDA7DQotICB3aGlsZSAoY2JlZ2luIDwgY2xlbikNCi0gIHsNCi0gICAgdmFyIHZiZWdpbiA9IGNiZWdpbiArIGNuYW1lLmxlbmd0aDsNCi0gICAgaWYgKGRjb29raWUuc3Vic3RyaW5nKGNiZWdpbiwgdmJlZ2luKSA9PSBjbmFtZSkNCi0gICAgew0KLSAgICAgIHZhciB2ZW5kID0gZGNvb2tpZS5pbmRleE9mICgiOyIsIHZiZWdpbik7DQotICAgICAgaWYgKHZlbmQgPT0gLTEpDQotICAgICAgew0KLSAgICAgICAgdmVuZCA9IGNsZW47DQotICAgICAgfQ0KLSAgICAgIHJldHVybiB1bmVzY2FwZShkY29va2llLnN1YnN0cmluZyh2YmVnaW4sIHZlbmQpKTsNCi0gICAgfQ0KLSAgICBjYmVnaW4gPSBkY29va2llLmluZGV4T2YoIiAiLCBjYmVnaW4pICsgMTsNCi0gICAgaWYgKGNiZWdpbiA9PSAwKQ0KLSAgICB7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0gIH0NCi0gIHJldHVybiBudWxsOw0KLSB9DQotDQotDQotICB2YXIgaW5kZXg9bnVsbDsNCi0gIHZhciB0b3VyPW51bGw7DQotICB2YXIgc2VhcmNoPW51bGw7DQotICB2YXIgZ2xvc3Nhcnk9bnVsbDsNCi0gIHZhciBmZWVkYmFjaz1udWxsOw0KLSAgdmFyIHRyZWVMb2FkZWQ9ZmFsc2U7DQotICBmdW5jdGlvbiBjaGVja1RyZWVMb2FkZWQoKQ0KLSAgew0KLSAgICBpZih0cmVlTG9hZGVkKQ0KLSAgICB7DQotICAgICAgcmV0dXJuIHRyZWVMb2FkZWQ7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgIGlmKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldCAhPSBudWxsDQotICAgICAgICAmJiBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeSgpKQ0KLSAgICAgew0KLSAgICAgICB0cmVlTG9hZGVkID0gdHJ1ZTsNCi0gICAgIH0NCi0gICAgICovDQotICAgICBpZihwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQgIT0gbnVsbCkNCi0gICAgIHsNCi0gICAgICAJdmFyIG1ldGhvZCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeTsNCi0JIGlmIChtZXRob2QgIT0gInVuZGVmaW5lZCIpIHsNCi0JCWlmIChwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeSgpKQ0KLQkJew0KLSAgICAgICAJCQl0cmVlTG9hZGVkID0gdHJ1ZTsNCi0JCX0NCi0NCi0JICB9DQotDQotICAgICB9DQotDQotICAgICByZXR1cm4gdHJlZUxvYWRlZDsNCi0gICB9DQotDQotDQotICAgIGZ1bmN0aW9uIHNob3dBbGVydE5vdExvYWRlZCgpDQotICAgIHsNCi0gICAgICBhbGVydCh0b3BuYXZfanNfTUVTU0FHRTEpOw0KLSAgICB9DQotDQotZnVuY3Rpb24gc2hvd1N0YXR1c05vdExvYWRlZCgpDQotICB7DQotICAgIC8vcmV0dXJuICJUaGUgVHJlZUJyb3dzZSBpcyBub3QgeWV0IGxvYWRlZCFcblBsZWFzZSB3YWl0ISI7DQotICAgIHJldHVybiB0b3BuYXZfanNfTUVTU0FHRTE7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93QWxlcnROb1BhZ2UodGV4dCkNCi0gIHsNCi0gICAgIHZhciBwYXJlbnRMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYocGFyZW50TGFiZWwhPSIiICYmIHBhcmVudExhYmVsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICAgICAvL2FsZXJ0KCJUaGVyZSBpcyBubyAnIiArIHRleHQgKyAiJyBwYWdlIGZvciB0aGlzIHBhZ2UuXG5Ucnkgb25lIG9mIHRoZSBvdGhlciBuYXZpZ2F0aW9uIGJ1dHRvbnMuIik7DQotICAgICAgICAgIGFsZXJ0KGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTIsIHRleHQpKTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgICAvL2FsZXJ0KCJUaGVyZSBpcyBubyAnIiArIHRleHQgKyAiJyBwYWdlIGZvciB0aGlzIHBhZ2UuXG5Ucnkgb25lIG9mIHRoZSBvdGhlciBuYXZpZ2F0aW9uIGJ1dHRvbnMiKTsNCi0gICAgICAgICBhbGVydChmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UyLCB0ZXh0KSk7DQotICAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93U3RhdHVzTm9QYWdlKHRleHQpDQotICB7DQotDQotICAgICB2YXIgcGFyZW50TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIHZhciBtc2c7DQotICAgICBpZihwYXJlbnRMYWJlbCE9IiIgJiYgcGFyZW50TGFiZWwhPW51bGwpDQotICAgICB7DQotICAgICAgICAvL21zZyA9ICJUaGVyZSBpcyBubyAiICsgdGV4dCArICIgcGFnZSEiOw0KLSAgICAgICAgbXNnID0gZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMywgdGV4dCk7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICAvL21zZyA9ICJUaGVyZSBpcyBubyAiICsgdGV4dCArICIgcGFnZSEiOw0KLSAgICAgICAgbXNnID0gZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMywgdGV4dCk7DQotICAgICB9DQotDQotICAgICByZXR1cm4gbXNnOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1BhcmVudExhYmVsKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgcGFyZW50dXJsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIHBhcmVudHVybCE9IiIgJiYgcGFyZW50dXJsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb1BhZ2UoInVwIik7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd0hvbWVMYWJlbCgpDQotICB7DQotICAgIHNlbGYuc3RhdHVzID0gIkhvbWUiOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1ByZXZpb3VzTGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c0xhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgdmFyIHByZXZ1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKGxhYmVsIT0iIiAmJiBsYWJlbCE9bnVsbCAmJiBwcmV2dXJsIT0iIiAmJiBwcmV2dXJsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm9QYWdlKCJwcmV2aW91cyIpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm90TG9hZGVkKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dOZXh0TGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgbmV4dHVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIG5leHR1cmwhPSIiICYmIG5leHR1cmwhPW51bGwpDQotICAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsNCi0gICAgICB9DQotICAgICAgZWxzZQ0KLSAgICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb1BhZ2UoIm5leHQiKTsNCi0gICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZFByZXZpb3VzKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c0xhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0NCi0JaWYgKChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKT09LTEpICYmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKT09LTEpKQ0KLQl7DQotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpIT0tMSkNCi0Jew0KLQkgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRBcHBsZXRQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCk7DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQ0KLQl7DQotCQluZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRIdHRwUGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwsICJQcmV2aW91cyIpOw0KLQl9DQotCSAgICAgIAlwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV9wcmV2KTsNCi0gICAgIH0NCi0gICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZE5leHQoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0NCi0JaWYgKChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKT09LTEpICYmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKT09LTEpKQ0KLQl7DQotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpIT0tMSkNCi0Jew0KLQkgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRBcHBsZXRQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCk7DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQ0KLQl7DQotCQluZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRIdHRwUGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwsICJOZXh0Iik7DQotCX0NCi0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLQ0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX25leHQpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotDQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkUGFyZW50KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfdXApOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLWZ1bmN0aW9uIHdoZXJlQW1JKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0JdmFyIHN0YXR1cyA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgIAlpZiggc3RhdHVzID09IGZhbHNlICkNCi0Jew0KLQkJYWxlcnQoIHRvcG5hdl9qc19NRVNTQUdFNCApOw0KLQl9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHVwQXJyb3coKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS51cEFycm93KCk7DQotICAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGRvd25BcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmRvd25BcnJvdygpOw0KLSAgICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgICB7DQotICAgICAgIHBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotICAgICAgfQ0KLQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICAgIGZ1bmN0aW9uIGxlZnRBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUubGVmdEFycm93KCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gICAgZnVuY3Rpb24gcmlnaHRBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUucmlnaHRBcnJvdygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotDQotZnVuY3Rpb24gbG9hZFRvcCgpDQotew0KLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIpDQotICB7DQotICAgICBhbGVydCh0b3BuYXZfanNfTUVTU0FHRTUpOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICB2YXIgZXhwaXJlcyA9IG5ldyBEYXRlKCk7DQotICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7DQotICAgIGRvY3VtZW50LmNvb2tpZSA9ICJydXBfb3J5X2RvYz0iICsgZXNjYXBlIChkb2N1bWVudC5VUkwpICsNCi0gICAgIjsgZXhwaXJlcz0iICsgZXhwaXJlcy50b1VUQ1N0cmluZygpICsgICI7IHBhdGg9LyI7DQotDQotICAgIHZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOw0KLQ0KLSAgICBmb3IoaT1kb2N1bWVudC5saW5rcy5sZW5ndGgtMTtpPj0wO2ktLSkNCi0gICAgew0KLSAgICAgICBpZihkb2N1bWVudC5saW5rc1tpXS5ocmVmLmluZGV4T2YoImluZGV4Lmh0bSIpIT0tMSkNCi0gICAgICAgew0KLSAgICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IGRvY3VtZW50LmxpbmtzW2ldLmhyZWY7DQotICAgICAgICAgYnJlYWs7DQotICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpDQotICAgIHsNCi0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQ0KLQl7DQotCQl3aW5kb3cuY2xvc2UoKTsNCi0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JICAgICAgIAl0b3AubG9jYXRpb24gPSBuZXdfb3J5X2RvY19sb2M7DQotCX0NCi0gICAgfQ0KLSAgIH0NCi19DQotDQotDQotZnVuY3Rpb24gb3Blbk9yeSAocGFnZSwgdGFyZ2V0KQ0KLXsNCi0gICAgaWYoIWluZGV4IHx8IGluZGV4LmNsb3NlZCkNCi0gICAgew0KLSAgICAgIGluZGV4ID0gb3BlbihwYWdlLHRhcmdldCwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM5NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBpbmRleC5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5TZWFyY2goKQ0KLXsNCi0gICAgaWYoIXNlYXJjaCB8fCBzZWFyY2guY2xvc2VkKQ0KLSAgICB7DQotICAgICAgc2VhcmNoID0gb3BlbigiLi9hcHBsZXQvc2VhcmNoLmh0bSIsInNlYXJjaF9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9bm8sd2lkdGg9NjMwLGhlaWdodD00NTAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNlYXJjaC5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5JbmRleCgpDQotew0KLSAgIG9wZW5PcnkoIi4vaW5kZXgvaW5kZXguaHRtIiwiaW5kZXhfd2luIik7DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5HbG9zc2FyeSgpDQotew0KLSBpZighZ2xvc3NhcnkgfHwgZ2xvc3NhcnkuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgZ2xvc3NhcnkgPSBvcGVuKCIuL3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXguaHRtIiwiZ2xvc3Nhcnlfd2luIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM4NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBnbG9zc2FyeS5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIHByaW50UGFnZSgpDQotew0KLSBwYXJlbnQub3J5X2RvYy5mb2N1cygpOw0KLSBwYXJlbnQub3J5X2RvYy5wcmludCgpOw0KLX0NCi0NCi0NCi1mdW5jdGlvbiBzZW5kRmVlZGJhY2sodXJsKQ0KLXsNCi0JaWYgKCB1cmwgPT0gbnVsbCB8fCB1cmwgPT0gJycgKQ0KLQl7DQotCQlyZXR1cm47DQotCX0NCi0JDQotCWlmICggdXJsLmluZGV4T2YoIm1haWx0bzoiKSA+PSAwICkNCi0Jew0KLQkJc2VuZG1haWwodXJsKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCQ0KLSAJICAgIGlmKCFmZWVkYmFjayB8fCBmZWVkYmFjay5jbG9zZWQpDQotCSAgICB7DQotCSAgICAgIGZlZWRiYWNrID0gb3Blbih1cmwsImZlZWRiYWNrX3dpbiIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD02MDAsaGVpZ2h0PTUwMCxyZXNpemFibGU9eWVzIik7DQotCSAgICB9DQotCSAgICBlbHNlDQotCSAgICB7DQotCSAgICAgIGZlZWRiYWNrLmZvY3VzKCk7DQotCSAgICB9DQotICAgIAl9DQotICAgIAkNCi19DQotDQotDQotZnVuY3Rpb24gc2VuZG1haWwodXJsKQ0KLXsNCi0JaWYgKCB1cmwuaW5kZXhPZigiP3N1YmplY3QiKSA9PSAtMSApDQotCXsNCi0JCXZhciBsaW5rPXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uOw0KLQkJdXJsID0gdXJsICsgJz9zdWJqZWN0PUZlZWRiYWNrOiAtICcrbGluazsNCi0JfQ0KLQlsb2NhdGlvbi5yZXBsYWNlKHVybCk7DQotfQ0KLQ0KLS8vY2FsY3VsYXRlcyByZWxhdGl2ZSBwYXRoDQotLy9wYXRoIG11c3QgYmUgYWxsIHJlbGF0aXZlIGZyb20gd2Vic2l0ZSBiYXNlIG9yIGNvbnRhaW4gZnVsbCB1cmxzDQotZnVuY3Rpb24gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHNvdXJjZVBhdGgsIHRhcmdldFBhdGgpDQotew0KLQlpZiAodGFyZ2V0UGF0aC5pbmRleE9mKCJodHRwOi8iKSAhPSAtMSkNCi0Jew0KLQkJcmV0dXJuIHRhcmdldFBhdGg7DQotCX0NCi0NCi0JLy9yZXBsYWNlIGFsbCAnXCcgd2l0aCAnLycNCi0Jc291cmNlUGF0aCA9IHNvdXJjZVBhdGgucmVwbGFjZSgvXFwvZywiJDEvJDIiKTsNCi0JdGFyZ2V0UGF0aCA9IHRhcmdldFBhdGgucmVwbGFjZSgvXFwvZywiLyIpOw0KLQ0KLQkvL2FsZXJ0KCJSZXBsYWNlKFNvdXJjZSk9PiIgKyBzb3VyY2VQYXRoKTsNCi0JLy9hbGVydCgiUmVwbGFjZSh0YXJnZXQpPT4iICsgdGFyZ2V0UGF0aCk7DQotDQotDQotCXNvdXJjZUFycmF5ID0gc291cmNlUGF0aC5zcGxpdCgiLyIpOw0KLQl0YXJnZXRBcnJheSA9IHRhcmdldFBhdGguc3BsaXQoIi8iKTsNCi0NCi0JdmFyIHRoZVJlbFBhdGggPSAiIjsNCi0NCi0JLy9sb29wIHVudGlsIHdlIGZpbmQgYSBkaWZmZXJlbmNlDQotCXZhciBpZHggPSAwOw0KLQlmb3IoaWR4ID0gMDsgaWR4IDwgc291cmNlQXJyYXkubGVuZ3RoOyBpZHgrKykNCi0Jew0KLQkJaWYgKGlkeCA+IHRhcmdldFBhdGgubGVuZ3RoKQ0KLQkJew0KLQkJCWJyZWFrOw0KLQkJfQ0KLQ0KLQkJaWYgKHNvdXJjZUFycmF5W2lkeF0gIT0gdGFyZ2V0QXJyYXlbaWR4XSkNCi0JCXsNCi0JCQlicmVhazsNCi0JCX0NCi0JfQ0KLQ0KLQkvL2FwcGVuZCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIC4vDQotCXZhciBtYXhJZHggPSBzb3VyY2VBcnJheS5sZW5ndGggLSAxOw0KLQlmb3IgKHZhciBpID0gaWR4OyBpIDwgbWF4SWR4OyBpKyspDQotCXsNCi0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoICsgIi4vIjsNCi0NCi0JCS8vYWxlcnQoIlJlbFBhdGg9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL2FwcGVuZCBhbnkgcmVtYWluaW5nIHRhcmdldCBwYXRoDQotCXdoaWxlKGlkeCA8IHRhcmdldEFycmF5Lmxlbmd0aCkNCi0Jew0KLQkJdGhlUmVsUGF0aCA9IHRoZVJlbFBhdGggKyB0YXJnZXRBcnJheVtpZHgrK10gKyAiLyI7DQotCQkvL2FsZXJ0KCJSZWxQYXRoKGZpbmFsKT0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vcmVtb3ZlIHRoZSBsYXN0IHBhdGggc2VwYXJhdG9yDQotCWlmICh0aGVSZWxQYXRoLmxlbmd0aCA+IDApDQotCXsNCi0JCS8vYWxlcnQoIlJlbFBhdGgoVHJpbTEpPT4iICsgdGhlUmVsUGF0aCk7DQotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aC5zdWJzdHJpbmcoMCwgKHRoZVJlbFBhdGgubGVuZ3RoIC0gMSkpOw0KLQkJLy9hbGVydCgiUmVsUGF0aChUcmltMSk9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL2FsZXJ0KCJSZXR1cm4gUmVsYXRpdmUgUGF0aCA9PiAiICsgdGhlUmVsUGF0aCk7DQotDQotCXJldHVybiB0aGVSZWxQYXRoOw0KLX0NCi0NCi1mdW5jdGlvbiBnZXRUcmVlUGF0aCgpDQotew0KLQlyZXR1cm4gYnVpbGRUcmVlUGF0aExvY2F0aW9uKCk7DQotfQ0KLQ0KLS8vVGhpcyBtZXRob2Qgd2lsbCByZW1vdmUgdGhlIHdlYnNpdGUgYmFzZSBmcm9tIHRoZSB1cmwNCi1mdW5jdGlvbiBjYWxjdWxhdEN1cnJlbnRQYWdlKGN1cnJVUkwpIHsNCi0NCi0JdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7DQotCS8vcmVwbGFjZSBhbGwgJ1wnIHdpdGggJy8nDQotCXRoZUN1cnJlbnRMb2NhdGlvbiA9IHRoZUN1cnJlbnRMb2NhdGlvbi5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQljdXJyVVJMID0gY3VyclVSTC5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQ0KLQl2YXIgc291cmNlQXJyYXkgPSB0aGVDdXJyZW50TG9jYXRpb24uc3BsaXQoIi8iKTsNCi0JdmFyIGN1cnJBcnJheSA9IGN1cnJVUkwuc3BsaXQoIi8iKTsNCi0NCi0JdmFyIG51bVRvUmVtb3ZlID0gc291cmNlQXJyYXkubGVuZ3RoIC0gMjsNCi0JdmFyIGlkeCA9IDA7DQotCXZhciB0aGVSZXR1cm5QYXRoID0gIiI7DQotCWZvciAoaWR4ID0gbnVtVG9SZW1vdmU7IGlkeCA8IGN1cnJBcnJheS5sZW5ndGg7IGlkeCsrKSB7DQotCQlpZiAodGhlUmV0dXJuUGF0aCAhPSAiIikgew0KLQkJCXRoZVJldHVyblBhdGggPSB0aGVSZXR1cm5QYXRoICsgIi8iOw0KLQkJfQ0KLQkJdGhlUmV0dXJuUGF0aCA9IHRoZVJldHVyblBhdGggKyBjdXJyQXJyYXlbaWR4XTsNCi0JfQ0KLQ0KLQkvL2FsZXJ0KCJBcnJheVRlc3Q9PiIgKyBjdXJyVVJMICsgIiwiICsgdGhlUmV0dXJuUGF0aCk7DQotCXJldHVybiB0aGVSZXR1cm5QYXRoOw0KLX0NCi0NCi0vL2J1aWxkcyB0cmVlIHBhdGgNCi1mdW5jdGlvbiBidWlsZFRyZWVQYXRoTG9jYXRpb24oKQ0KLXsNCi0JdmFyIHRoZURlbGltaXRlciA9ICIjIyoiOw0KLQl2YXIgdGhpc1BhZ2UgPSAiYXBwbGV0L3J1cF90b3BuYXYuaHRtIjsNCi0JdmFyIHRoZUxvYyA9ICIiOw0KLQ0KLQ0KLQ0KLQlpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0Jew0KLQkJdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY7DQotCQl0aGlzUGFnZSA9IGNhbGN1bGF0Q3VycmVudFBhZ2UodGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCS8vYWxlcnQoIlBhdGhOYW1lOiIgKyB0aGlzUGFnZSk7DQotDQotCQkvL2FsZXJ0KCJUcnlpbmcgdG8gZmluZCB0aGUgcGF0aCBmb3IgPT4iICsgdGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCXZhciB0aGVQYXRoID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmdldFRyZWVQYXRoQXJyYXkodGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCS8vYWxlcnQoIlRoZSBUcmVlIFBhdGg6ICIgKyB0aGVQYXRoKTsNCi0NCi0JCXRoZVBhdGhTdHJpbmcgPSB0aGVQYXRoICsgIiI7DQotICAgIAkJYXJyYXlGcm9tU3RyaW5nID0gdGhlUGF0aFN0cmluZy5zcGxpdCh0aGVEZWxpbWl0ZXIpOw0KLQ0KLQkJLy9idWlsZCB0aGUgcGF0aCBmcm9tIHRoZSBhcnJheQ0KLQkJLy9wYXJhbSAxID0gcGF0aCB0byBpY29uLCBwYXJhbSAyIC0gbGFiZWwsIHBhcmFtIDMgLSBwYXRoIHRvIGZpbGUNCi0JCXZhciBjb3VudGVyID0gMDsNCi0JCXZhciB0aGVMYWJlbDsNCi0JCXZhciB0aGVSZWxQYXRoOw0KLQkJaWYgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggPiAyKQ0KLQkJew0KLQkJICAgdGhlTG9jID0gIiI7DQotCQkgICBmb3IodmFyIGkgPSAwOyBpIDwgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggLSAxKSA7IGkrKykNCi0JCSAgIHsNCi0JCQkvL2l0J3MgdGhlIGljb24gcGF0aA0KLQkJCWlmIChjb3VudGVyIDwgMikNCi0JCQl7DQotCQkJCWlmIChjb3VudGVyID4gMCkNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsgIiAmZ3Q7ICI7DQotCQkJCX0NCi0NCi0JCQkJLy9hbGVydCgiQ2FsY3VsYXRpbmcgcGF0aCBmcm9tKDEpICIgKyB0aGlzUGFnZSArICIgPT4gIiArIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotDQotCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiXFwiKSA9PSAtMSAmJiBhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiLyIpID09IC0xKQ0KLQkJCQl7DQotCQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldICE9ICJudWxsIikNCi0JCQkJCXsNCi0JCQkJCQl0aGVSZWxQYXRoID0gImFwcGxldC9pbWFnZXMvIiArIGFycmF5RnJvbVN0cmluZ1tpXTsNCi0JCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCB0aGVSZWxQYXRoKTsNCi0JCQkJCX0NCi0JCQkJCS8vYWxlcnQoIk1vZGlmeWluZyBQYXRoID0+ICIgKyB0aGVSZWxQYXRoKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCX0NCi0NCi0JCQkJaWYgKHRoZVJlbFBhdGggIT0gIm51bGwiKQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJCSAiPGltZyBib3JkZXI9MCBzcmM9XCIiICsNCi0JCQkJCQkgdGhlUmVsUGF0aCAgKw0KLQkJCQkJCSAiXCI+IjsNCi0JCQkJfQ0KLQ0KLQkJCQkvL2FsZXJ0KCJ0aGUgY3VyciBwYXRoPT4iICsgdGhlTG9jKTsNCi0JCQkJY291bnRlciA9IDI7DQotCQkJfQ0KLQkJCS8vIGl0J3MgdGhlIGxhYmVsDQotCQkJZWxzZSBpZiAoY291bnRlciA9PSAyKQ0KLQkJCXsNCi0JCQkJdGhlTGFiZWwgPSBhcnJheUZyb21TdHJpbmdbaV07DQotCQkJCWNvdW50ZXIgPSAzOw0KLQkJCX0NCi0JCQllbHNlIGlmIChjb3VudGVyID09IDMpDQotCQkJew0KLQkJCQkvL2FsZXJ0KCJDYWxjdWxhdGluZyBwYXRoIGZyb20oMykgIiArIHRoaXNQYWdlICsgIiA9PiAiICsgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXSAhPSAibnVsbCIpDQotCQkJCXsNCi0JCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCQlpZiAodGhlUmVsUGF0aCAhPSAiIikgew0KLQkJCQkJCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkgCQkiPGEgY2xhc3M9XCJob3R0ZXh0XCIgdGFyZ2V0PVwib3J5X2RvY1wiIGhyZWY9XCIiICsNCi0JCQkJCQkJIHRoZVJlbFBhdGggKw0KLQkJCQkJIAkJIlwiPiIgKw0KLQkJCQkJIAkJdGhlTGFiZWwgKw0KLQkJCQkJIAkJIjxcL2E+XG4iOw0KLQkJCQkJIH0NCi0JCQkJCSBlbHNlIHsNCi0JCQkJCSAJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJCSI8YSBjbGFzcz1cImhvdHRleHRcIj4iICArDQotCQkJCQkgCQl0aGVMYWJlbCArDQotCQkJCQkgCQkiPFwvYT5cbiI7DQotCQkJCQkgfQ0KLQkJCQl9DQotCQkJCWVsc2UNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJIjxhIGNsYXNzPVwiaG90dGV4dFwiPiIgICsNCi0JCQkJCSAJdGhlTGFiZWwgKw0KLQkJCQkJIAkiPFwvYT5cbiI7DQotCQkJCX0NCi0JCQkJLy9hbGVydCgidGhlIGN1cnIgcGF0aD0+IiArIHRoZUxvYyk7DQotCQkJCWNvdW50ZXIgPSAxOw0KLQkJCQl0aGVSZWxQYXRoID0gIm51bGwiOw0KLQkJCQl0aGVMYWJlbCA9ICJudWxsIjsNCi0JCQl9DQotCQkgICB9DQotDQotCQkvL2FsZXJ0KCJGaW5pc2hlZCBCdWlsZGluZyA9PiAiICsgdGhlTG9jKTsNCi0JCX0NCi0NCi0JfQ0KLQ0KLQkvL3RoZUxvYyA9ICJDdXJyZW50IExvY2F0aW9uJm5ic3A7JiMwNDU7Jm5ic3A7IiArIHRoZUxvYzsNCi0NCi0JLy9hbGVydCgidGhlIEZpbmFsIFN0cmluZz0+IiArIHRoZUxvYyk7DQotDQotCS8vZG9jdW1lbnQud3JpdGUodGhlTG9jKTsNCi0JcmV0dXJuIHRoZUxvYzsNCi0NCi19DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl9lcy5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXZfZXMuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZTdkMGUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl9lcy5qcworKysgL2Rldi9udWxsCkBAIC0xLDc4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBtZXNzYWdlcyB0byBiZSBleHRlcm5pemVkDQotLy8gaGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLQ0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTEgPSAiRWwgw6FyYm9sIGRlIG5hdmVnYWNpw7NuIHRvZGF2w61hIG5vIHNlIGhhIGNhcmdhZG8uXG5Fc3BlcmUuIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0UyID0gIk5vIGhheSBuaW5ndW5hIHDDoWdpbmEgJ3swfScgcGFyYSBlc3RhIHDDoWdpbmEuXG5QcnVlYmUgb3RybyBib3TDs24gZGUgbmF2ZWdhY2nDs24uIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0UzID0gIk5vIGhheSBuaW5ndW5hIHDDoWdpbmEgezB9LiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3ByZXYgPSAiYW50ZXJpb3IiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV9uZXh0ID0gInNpZ3VpZW50ZSI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3VwID0gImFycmliYSI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFNCA9ICJFbCBhcmNoaXZvIGFjdHVhbCBubyBzZSBlbmN1ZW50cmEgZW4gZWwgw6FyYm9sIGRlIG5hdmVnYWNpw7NuLiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFNSA9ICJFbCBzaXRpbyBwdWJsaWNhZG8geWEgc2UgbXVlc3RyYSBjb24gbWFyY29zIjsNCi0NCi1mdW5jdGlvbiBmb3JtYXRTdHJpbmcobWVzc2FnZSwgcmVwbGFjZTApDQotew0KLSAgIAlyZXR1cm4gbWVzc2FnZS5yZXBsYWNlKC9cezBcfS8sIHJlcGxhY2UwKTsNCi19IA0KLQ0KLS8vIHRoaXMgc2NyaXB0IGlzIGZvciB0aGUgdG9wbmF2Lmh0bWwNCi0vLyB0aGlzIGlzIE5PVCBmb3IgZ2VuZXJhbCB1c2UNCi1NU0ZQaG92ZXIgPQ0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwNCi0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOw0KLQ0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQ0KLSAgew0KLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7DQotICAgICBhLnNyYz1pbWc7DQotICAgICByZXR1cm4gYTsNCi0gIH0NCi0gIA0KLXZhciB0b3VyID0gMDsNCi0NCi1mdW5jdGlvbiBvcGVuRmlyc3RUb3VyICgpDQotLy8gb3BlbiB0aGUgZ3VpZGVkIHRvdXIgL2hhYWthbiA5OTAzMjQNCi17DQotaWYoIXRvdXIgfHwgdG91cj09bnVsbCB8fCB0b3VyLmNsb3NlZCkNCi0gICAgew0KLSAgICAgIHRvdXIgPSBvcGVuKCIuL3RvdXIvdG91ci5odG0iLCJ0b3VyX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9MzUwLGhlaWdodD03MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlblRvdXIgKCkNCi0vLyBvcGVuIHRoZSBndWlkZWQgdG91ciAvaGFha2FuIDk5MDMyNA0KLXsNCi1pZighdG91ciB8fCB0b3VyPT1udWxsIHx8IHRvdXIuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgdG91ciA9IG9wZW4oIi4vdG91ci90b3VyLmh0bSIsInRvdXJfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zNTAsaGVpZ2h0PTcwMCxyZXNpemFibGU9eWVzIik7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi0vL0FkZGl0aW9uIGJ5IENoaW5oIFZvIDAzLzI4LzAwDQotIGZ1bmN0aW9uIGRpc3BsYXlHZXR0aW5nU3RhcnRlZCgpDQotIHsNCi0gCXZhciBwYWdlUGF0dGVybiA9IC9vdnVfcHJvYy87DQotIAl2YXIgbWFpblBhZ2UgPSB3aW5kb3cucGFyZW50Lm9yeV9kb2MubG9jYXRpb247DQotDQotIAlpZiAoIHBhZ2VQYXR0ZXJuLnRlc3QoIG1haW5QYWdlICkgKSB7DQotICAgIAlpZiAoZ2V0Q29va2llKCJSVVAiKSAhPSAiY2hlY2tlZCIpIHsgb3BlbkZpcnN0VG91cigpOyB9DQotCX0NCi0JZWxzZSB7DQotCQlzZXRUaW1lb3V0KCAiZGlzcGxheUdldHRpbmdTdGFydGVkKCkiLCAxMDAwICk7DQotCX0NCi19DQotDQotZnVuY3Rpb24gZ2V0Q29va2llIChuYW1lKQ0KLXsNCi0gIHZhciBkY29va2llID0gZG9jdW1lbnQuY29va2llOw0KLSAgdmFyIGNuYW1lID0gbmFtZSArICI9IjsNCi0gIHZhciBjbGVuID0gZGNvb2tpZS5sZW5ndGg7DQotICB2YXIgY2JlZ2luID0gMDsNCi0gIHdoaWxlIChjYmVnaW4gPCBjbGVuKQ0KLSAgew0KLSAgICB2YXIgdmJlZ2luID0gY2JlZ2luICsgY25hbWUubGVuZ3RoOw0KLSAgICBpZiAoZGNvb2tpZS5zdWJzdHJpbmcoY2JlZ2luLCB2YmVnaW4pID09IGNuYW1lKQ0KLSAgICB7DQotICAgICAgdmFyIHZlbmQgPSBkY29va2llLmluZGV4T2YgKCI7IiwgdmJlZ2luKTsNCi0gICAgICBpZiAodmVuZCA9PSAtMSkNCi0gICAgICB7DQotICAgICAgICB2ZW5kID0gY2xlbjsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIHVuZXNjYXBlKGRjb29raWUuc3Vic3RyaW5nKHZiZWdpbiwgdmVuZCkpOw0KLSAgICB9DQotICAgIGNiZWdpbiA9IGRjb29raWUuaW5kZXhPZigiICIsIGNiZWdpbikgKyAxOw0KLSAgICBpZiAoY2JlZ2luID09IDApDQotICAgIHsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgfQ0KLSAgcmV0dXJuIG51bGw7DQotIH0NCi0NCi0NCi0gIHZhciBpbmRleD1udWxsOw0KLSAgdmFyIHRvdXI9bnVsbDsNCi0gIHZhciBzZWFyY2g9bnVsbDsNCi0gIHZhciBnbG9zc2FyeT1udWxsOw0KLSAgdmFyIGZlZWRiYWNrPW51bGw7DQotICB2YXIgdHJlZUxvYWRlZD1mYWxzZTsNCi0gIGZ1bmN0aW9uIGNoZWNrVHJlZUxvYWRlZCgpDQotICB7DQotICAgIGlmKHRyZWVMb2FkZWQpDQotICAgIHsNCi0gICAgICByZXR1cm4gdHJlZUxvYWRlZDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgaWYocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0ICE9IG51bGwNCi0gICAgICAgICYmIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5KCkpDQotICAgICB7DQotICAgICAgIHRyZWVMb2FkZWQgPSB0cnVlOw0KLSAgICAgfQ0KLSAgICAgKi8NCi0gICAgIGlmKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldCAhPSBudWxsKQ0KLSAgICAgew0KLSAgICAgIAl2YXIgbWV0aG9kID0gdHlwZW9mIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5Ow0KLQkgaWYgKG1ldGhvZCAhPSAidW5kZWZpbmVkIikgew0KLQkJaWYgKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5KCkpDQotCQl7DQotICAgICAgIAkJCXRyZWVMb2FkZWQgPSB0cnVlOw0KLQkJfQ0KLQ0KLQkgIH0NCi0NCi0gICAgIH0NCi0NCi0gICAgIHJldHVybiB0cmVlTG9hZGVkOw0KLSAgIH0NCi0NCi0NCi0gICAgZnVuY3Rpb24gc2hvd0FsZXJ0Tm90TG9hZGVkKCkNCi0gICAgew0KLSAgICAgIGFsZXJ0KHRvcG5hdl9qc19NRVNTQUdFMSk7DQotICAgIH0NCi0NCi1mdW5jdGlvbiBzaG93U3RhdHVzTm90TG9hZGVkKCkNCi0gIHsNCi0gICAgLy9yZXR1cm4gIlRoZSBUcmVlQnJvd3NlIGlzIG5vdCB5ZXQgbG9hZGVkIVxuUGxlYXNlIHdhaXQhIjsNCi0gICAgcmV0dXJuIHRvcG5hdl9qc19NRVNTQUdFMTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dBbGVydE5vUGFnZSh0ZXh0KQ0KLSAgew0KLSAgICAgdmFyIHBhcmVudExhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICBpZihwYXJlbnRMYWJlbCE9IiIgJiYgcGFyZW50TGFiZWwhPW51bGwpDQotICAgICB7DQotICAgICAgICAgIC8vYWxlcnQoIlRoZXJlIGlzIG5vICciICsgdGV4dCArICInIHBhZ2UgZm9yIHRoaXMgcGFnZS5cblRyeSBvbmUgb2YgdGhlIG90aGVyIG5hdmlnYXRpb24gYnV0dG9ucy4iKTsNCi0gICAgICAgICAgYWxlcnQoZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMiwgdGV4dCkpOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgIC8vYWxlcnQoIlRoZXJlIGlzIG5vICciICsgdGV4dCArICInIHBhZ2UgZm9yIHRoaXMgcGFnZS5cblRyeSBvbmUgb2YgdGhlIG90aGVyIG5hdmlnYXRpb24gYnV0dG9ucyIpOw0KLSAgICAgICAgIGFsZXJ0KGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTIsIHRleHQpKTsNCi0gICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dTdGF0dXNOb1BhZ2UodGV4dCkNCi0gIHsNCi0NCi0gICAgIHZhciBwYXJlbnRMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgdmFyIG1zZzsNCi0gICAgIGlmKHBhcmVudExhYmVsIT0iIiAmJiBwYXJlbnRMYWJlbCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgIC8vbXNnID0gIlRoZXJlIGlzIG5vICIgKyB0ZXh0ICsgIiBwYWdlISI7DQotICAgICAgICBtc2cgPSBmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UzLCB0ZXh0KTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgIC8vbXNnID0gIlRoZXJlIGlzIG5vICIgKyB0ZXh0ICsgIiBwYWdlISI7DQotICAgICAgICBtc2cgPSBmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UzLCB0ZXh0KTsNCi0gICAgIH0NCi0NCi0gICAgIHJldHVybiBtc2c7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93UGFyZW50TGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIHZhciBwYXJlbnR1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotDQotICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgcGFyZW50dXJsIT0iIiAmJiBwYXJlbnR1cmwhPW51bGwpDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gbGFiZWw7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vUGFnZSgidXAiKTsNCi0gICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vdExvYWRlZCgpOw0KLSAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93SG9tZUxhYmVsKCkNCi0gIHsNCi0gICAgc2VsZi5zdGF0dXMgPSAiSW5pY2lvIjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dQcmV2aW91c0xhYmVsKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIHZhciBwcmV2dXJsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzVXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotDQotICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgcHJldnVybCE9IiIgJiYgcHJldnVybCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vUGFnZSgicHJldmlvdXMiKTsNCi0gICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vdExvYWRlZCgpOw0KLSAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93TmV4dExhYmVsKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgdmFyIG5leHR1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIGlmKGxhYmVsIT0iIiAmJiBsYWJlbCE9bnVsbCAmJiBuZXh0dXJsIT0iIiAmJiBuZXh0dXJsIT1udWxsKQ0KLSAgICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gbGFiZWw7DQotICAgICAgfQ0KLSAgICAgIGVsc2UNCi0gICAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9ICBzaG93U3RhdHVzTm9QYWdlKCJuZXh0Iik7DQotICAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9ICBzaG93U3RhdHVzTm90TG9hZGVkKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGxvYWRQcmV2aW91cygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICB2YXIgbmV3TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzVXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotDQotICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICB7DQotDQotCWlmICgobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0Iik9PS0xKSAmJiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3Iik9PS0xKSkNCi0Jew0KLQkJcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKSE9LTEpDQotCXsNCi0JIAlwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0QXBwbGV0UGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwpOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpIT0tMSkNCi0Jew0KLQkJbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0SHR0cFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsLCAiUHJldmlvdXMiKTsNCi0JfQ0KLQkgICAgICAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfcHJldik7DQotICAgICB9DQotICAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGxvYWROZXh0KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICB7DQotDQotCWlmICgobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0Iik9PS0xKSAmJiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3Iik9PS0xKSkNCi0Jew0KLQkJcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKSE9LTEpDQotCXsNCi0JIAlwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0QXBwbGV0UGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwpOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpIT0tMSkNCi0Jew0KLQkJbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0SHR0cFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsLCAiTmV4dCIpOw0KLQl9DQotICAgICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKG5ld0xvY2F0aW9uKTsNCi0NCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV9uZXh0KTsNCi0gICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZFBhcmVudCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICB7DQotICAgICAgIHBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotICAgICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKG5ld0xvY2F0aW9uKTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX3VwKTsNCi0gICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi1mdW5jdGlvbiB3aGVyZUFtSSgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotCXZhciBzdGF0dXMgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAJaWYoIHN0YXR1cyA9PSBmYWxzZSApDQotCXsNCi0JCWFsZXJ0KCB0b3BuYXZfanNfTUVTU0FHRTQgKTsNCi0JfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiB1cEFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUudXBBcnJvdygpOw0KLSAgICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgICB7DQotICAgICAgIHBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotICAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiBkb3duQXJyb3coKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5kb3duQXJyb3coKTsNCi0gICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICAgew0KLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLSAgICAgIH0NCi0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgICBmdW5jdGlvbiBsZWZ0QXJyb3coKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmxlZnRBcnJvdygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICAgIGZ1bmN0aW9uIHJpZ2h0QXJyb3coKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnJpZ2h0QXJyb3coKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLQ0KLWZ1bmN0aW9uIGxvYWRUb3AoKQ0KLXsNCi0gIGlmKHBhcmVudC5mcmFtZXMubGVuZ3RoIT0wICYmIHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2MiKQ0KLSAgew0KLSAgICAgYWxlcnQodG9wbmF2X2pzX01FU1NBR0U1KTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOw0KLSAgICBleHBpcmVzLnNldFRpbWUgKGV4cGlyZXMuZ2V0VGltZSgpICsgKDEwMDAgKiAyMCkpOw0KLSAgICBkb2N1bWVudC5jb29raWUgPSAicnVwX29yeV9kb2M9IiArIGVzY2FwZSAoZG9jdW1lbnQuVVJMKSArDQotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOw0KLQ0KLSAgICB2YXIgbmV3X29yeV9kb2NfbG9jID0gbnVsbDsNCi0NCi0gICAgZm9yKGk9ZG9jdW1lbnQubGlua3MubGVuZ3RoLTE7aT49MDtpLS0pDQotICAgIHsNCi0gICAgICAgaWYoZG9jdW1lbnQubGlua3NbaV0uaHJlZi5pbmRleE9mKCJpbmRleC5odG0iKSE9LTEpDQotICAgICAgIHsNCi0gICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBkb2N1bWVudC5saW5rc1tpXS5ocmVmOw0KLSAgICAgICAgIGJyZWFrOw0KLSAgICAgICB9DQotICAgIH0NCi0NCi0gICAgaWYobmV3X29yeV9kb2NfbG9jIT1udWxsKQ0KLSAgICB7DQotCWlmKCBzZWxmLm5hbWUgPT0gIm9yeV9kb2MiICkNCi0Jew0KLQkJd2luZG93LmNsb3NlKCk7DQotCQl3aW5kb3cub3BlbiggbmV3X29yeV9kb2NfbG9jICk7DQotCX0NCi0JZWxzZQ0KLQl7DQotCSAgICAgICAJdG9wLmxvY2F0aW9uID0gbmV3X29yeV9kb2NfbG9jOw0KLQl9DQotICAgIH0NCi0gICB9DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIG9wZW5PcnkgKHBhZ2UsIHRhcmdldCkNCi17DQotICAgIGlmKCFpbmRleCB8fCBpbmRleC5jbG9zZWQpDQotICAgIHsNCi0gICAgICBpbmRleCA9IG9wZW4ocGFnZSx0YXJnZXQsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zOTUsaGVpZ2h0PTUwMCxyZXNpemFibGU9eWVzIik7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgaW5kZXguZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBvcGVuU2VhcmNoKCkNCi17DQotICAgIGlmKCFzZWFyY2ggfHwgc2VhcmNoLmNsb3NlZCkNCi0gICAgew0KLSAgICAgIHNlYXJjaCA9IG9wZW4oIi4vYXBwbGV0L3NlYXJjaC5odG0iLCJzZWFyY2hfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPW5vLHdpZHRoPTYzMCxoZWlnaHQ9NDUwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzZWFyY2guZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBvcGVuSW5kZXgoKQ0KLXsNCi0gICBvcGVuT3J5KCIuL2luZGV4L2luZGV4Lmh0bSIsImluZGV4X3dpbiIpOw0KLX0NCi0NCi1mdW5jdGlvbiBvcGVuR2xvc3NhcnkoKQ0KLXsNCi0gaWYoIWdsb3NzYXJ5IHx8IGdsb3NzYXJ5LmNsb3NlZCkNCi0gICAgew0KLSAgICAgIGdsb3NzYXJ5ID0gb3BlbigiLi9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4Lmh0bSIsImdsb3NzYXJ5X3dpbiIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zODUsaGVpZ2h0PTUwMCxyZXNpemFibGU9eWVzIik7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgZ2xvc3NhcnkuZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBwcmludFBhZ2UoKQ0KLXsNCi0gcGFyZW50Lm9yeV9kb2MuZm9jdXMoKTsNCi0gcGFyZW50Lm9yeV9kb2MucHJpbnQoKTsNCi19DQotDQotDQotZnVuY3Rpb24gc2VuZEZlZWRiYWNrKHVybCkNCi17DQotCWlmICggdXJsID09IG51bGwgfHwgdXJsID09ICcnICkNCi0Jew0KLQkJcmV0dXJuOw0KLQl9DQotCQ0KLQlpZiAoIHVybC5pbmRleE9mKCJtYWlsdG86IikgPj0gMCApDQotCXsNCi0JCXNlbmRtYWlsKHVybCk7DQotCX0NCi0JZWxzZQ0KLQl7DQotCQkNCi0gCSAgICBpZighZmVlZGJhY2sgfHwgZmVlZGJhY2suY2xvc2VkKQ0KLQkgICAgew0KLQkgICAgICBmZWVkYmFjayA9IG9wZW4odXJsLCJmZWVkYmFja193aW4iLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9NjAwLGhlaWdodD01MDAscmVzaXphYmxlPXllcyIpOw0KLQkgICAgfQ0KLQkgICAgZWxzZQ0KLQkgICAgew0KLQkgICAgICBmZWVkYmFjay5mb2N1cygpOw0KLQkgICAgfQ0KLSAgICAJfQ0KLSAgICAJDQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHNlbmRtYWlsKHVybCkNCi17DQotCWlmICggdXJsLmluZGV4T2YoIj9zdWJqZWN0IikgPT0gLTEgKQ0KLQl7DQotCQl2YXIgbGluaz1wYXJlbnQub3J5X2RvYy5sb2NhdGlvbjsNCi0JCXVybCA9IHVybCArICc/c3ViamVjdD1GZWVkYmFjazogLSAnK2xpbms7DQotCX0NCi0JbG9jYXRpb24ucmVwbGFjZSh1cmwpOw0KLX0NCi0NCi0vL2NhbGN1bGF0ZXMgcmVsYXRpdmUgcGF0aA0KLS8vcGF0aCBtdXN0IGJlIGFsbCByZWxhdGl2ZSBmcm9tIHdlYnNpdGUgYmFzZSBvciBjb250YWluIGZ1bGwgdXJscw0KLWZ1bmN0aW9uIGNhbGN1bGF0ZVJlbGF0aXZlUGF0aChzb3VyY2VQYXRoLCB0YXJnZXRQYXRoKQ0KLXsNCi0JaWYgKHRhcmdldFBhdGguaW5kZXhPZigiaHR0cDovIikgIT0gLTEpDQotCXsNCi0JCXJldHVybiB0YXJnZXRQYXRoOw0KLQl9DQotDQotCS8vcmVwbGFjZSBhbGwgJ1wnIHdpdGggJy8nDQotCXNvdXJjZVBhdGggPSBzb3VyY2VQYXRoLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7DQotCXRhcmdldFBhdGggPSB0YXJnZXRQYXRoLnJlcGxhY2UoL1xcL2csIi8iKTsNCi0NCi0JLy9hbGVydCgiUmVwbGFjZShTb3VyY2UpPT4iICsgc291cmNlUGF0aCk7DQotCS8vYWxlcnQoIlJlcGxhY2UodGFyZ2V0KT0+IiArIHRhcmdldFBhdGgpOw0KLQ0KLQ0KLQlzb3VyY2VBcnJheSA9IHNvdXJjZVBhdGguc3BsaXQoIi8iKTsNCi0JdGFyZ2V0QXJyYXkgPSB0YXJnZXRQYXRoLnNwbGl0KCIvIik7DQotDQotCXZhciB0aGVSZWxQYXRoID0gIiI7DQotDQotCS8vbG9vcCB1bnRpbCB3ZSBmaW5kIGEgZGlmZmVyZW5jZQ0KLQl2YXIgaWR4ID0gMDsNCi0JZm9yKGlkeCA9IDA7IGlkeCA8IHNvdXJjZUFycmF5Lmxlbmd0aDsgaWR4KyspDQotCXsNCi0JCWlmIChpZHggPiB0YXJnZXRQYXRoLmxlbmd0aCkNCi0JCXsNCi0JCQlicmVhazsNCi0JCX0NCi0NCi0JCWlmIChzb3VyY2VBcnJheVtpZHhdICE9IHRhcmdldEFycmF5W2lkeF0pDQotCQl7DQotCQkJYnJlYWs7DQotCQl9DQotCX0NCi0NCi0JLy9hcHBlbmQgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiAuLw0KLQl2YXIgbWF4SWR4ID0gc291cmNlQXJyYXkubGVuZ3RoIC0gMTsNCi0JZm9yICh2YXIgaSA9IGlkeDsgaSA8IG1heElkeDsgaSsrKQ0KLQl7DQotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aCArICIuLyI7DQotDQotCQkvL2FsZXJ0KCJSZWxQYXRoPT4iICsgdGhlUmVsUGF0aCk7DQotCX0NCi0NCi0JLy9hcHBlbmQgYW55IHJlbWFpbmluZyB0YXJnZXQgcGF0aA0KLQl3aGlsZShpZHggPCB0YXJnZXRBcnJheS5sZW5ndGgpDQotCXsNCi0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoICsgdGFyZ2V0QXJyYXlbaWR4KytdICsgIi8iOw0KLQkJLy9hbGVydCgiUmVsUGF0aChmaW5hbCk9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL3JlbW92ZSB0aGUgbGFzdCBwYXRoIHNlcGFyYXRvcg0KLQlpZiAodGhlUmVsUGF0aC5sZW5ndGggPiAwKQ0KLQl7DQotCQkvL2FsZXJ0KCJSZWxQYXRoKFRyaW0xKT0+IiArIHRoZVJlbFBhdGgpOw0KLQkJdGhlUmVsUGF0aCA9IHRoZVJlbFBhdGguc3Vic3RyaW5nKDAsICh0aGVSZWxQYXRoLmxlbmd0aCAtIDEpKTsNCi0JCS8vYWxlcnQoIlJlbFBhdGgoVHJpbTEpPT4iICsgdGhlUmVsUGF0aCk7DQotCX0NCi0NCi0JLy9hbGVydCgiUmV0dXJuIFJlbGF0aXZlIFBhdGggPT4gIiArIHRoZVJlbFBhdGgpOw0KLQ0KLQlyZXR1cm4gdGhlUmVsUGF0aDsNCi19DQotDQotZnVuY3Rpb24gZ2V0VHJlZVBhdGgoKQ0KLXsNCi0JcmV0dXJuIGJ1aWxkVHJlZVBhdGhMb2NhdGlvbigpOw0KLX0NCi0NCi0vL1RoaXMgbWV0aG9kIHdpbGwgcmVtb3ZlIHRoZSB3ZWJzaXRlIGJhc2UgZnJvbSB0aGUgdXJsDQotZnVuY3Rpb24gY2FsY3VsYXRDdXJyZW50UGFnZShjdXJyVVJMKSB7DQotDQotCXZhciB0aGVDdXJyZW50TG9jYXRpb24gPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmOw0KLQkvL3JlcGxhY2UgYWxsICdcJyB3aXRoICcvJw0KLQl0aGVDdXJyZW50TG9jYXRpb24gPSB0aGVDdXJyZW50TG9jYXRpb24ucmVwbGFjZSgvXFwvZywiJDEvJDIiKTsNCi0JY3VyclVSTCA9IGN1cnJVUkwucmVwbGFjZSgvXFwvZywiJDEvJDIiKTsNCi0NCi0JdmFyIHNvdXJjZUFycmF5ID0gdGhlQ3VycmVudExvY2F0aW9uLnNwbGl0KCIvIik7DQotCXZhciBjdXJyQXJyYXkgPSBjdXJyVVJMLnNwbGl0KCIvIik7DQotDQotCXZhciBudW1Ub1JlbW92ZSA9IHNvdXJjZUFycmF5Lmxlbmd0aCAtIDI7DQotCXZhciBpZHggPSAwOw0KLQl2YXIgdGhlUmV0dXJuUGF0aCA9ICIiOw0KLQlmb3IgKGlkeCA9IG51bVRvUmVtb3ZlOyBpZHggPCBjdXJyQXJyYXkubGVuZ3RoOyBpZHgrKykgew0KLQkJaWYgKHRoZVJldHVyblBhdGggIT0gIiIpIHsNCi0JCQl0aGVSZXR1cm5QYXRoID0gdGhlUmV0dXJuUGF0aCArICIvIjsNCi0JCX0NCi0JCXRoZVJldHVyblBhdGggPSB0aGVSZXR1cm5QYXRoICsgY3VyckFycmF5W2lkeF07DQotCX0NCi0NCi0JLy9hbGVydCgiQXJyYXlUZXN0PT4iICsgY3VyclVSTCArICIsIiArIHRoZVJldHVyblBhdGgpOw0KLQlyZXR1cm4gdGhlUmV0dXJuUGF0aDsNCi19DQotDQotLy9idWlsZHMgdHJlZSBwYXRoDQotZnVuY3Rpb24gYnVpbGRUcmVlUGF0aExvY2F0aW9uKCkNCi17DQotCXZhciB0aGVEZWxpbWl0ZXIgPSAiIyMqIjsNCi0JdmFyIHRoaXNQYWdlID0gImFwcGxldC9ydXBfdG9wbmF2Lmh0bSI7DQotCXZhciB0aGVMb2MgPSAiIjsNCi0NCi0NCi0NCi0JaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotCXsNCi0JCXZhciB0aGVDdXJyZW50TG9jYXRpb24gPSBwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5sb2NhdGlvbi5ocmVmOw0KLQkJdGhpc1BhZ2UgPSBjYWxjdWxhdEN1cnJlbnRQYWdlKHRoZUN1cnJlbnRMb2NhdGlvbik7DQotDQotCQkvL2FsZXJ0KCJQYXRoTmFtZToiICsgdGhpc1BhZ2UpOw0KLQ0KLQkJLy9hbGVydCgiVHJ5aW5nIHRvIGZpbmQgdGhlIHBhdGggZm9yID0+IiArIHRoZUN1cnJlbnRMb2NhdGlvbik7DQotDQotCQl2YXIgdGhlUGF0aCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5nZXRUcmVlUGF0aEFycmF5KHRoZUN1cnJlbnRMb2NhdGlvbik7DQotDQotCQkvL2FsZXJ0KCJUaGUgVHJlZSBQYXRoOiAiICsgdGhlUGF0aCk7DQotDQotCQl0aGVQYXRoU3RyaW5nID0gdGhlUGF0aCArICIiOw0KLSAgICAJCWFycmF5RnJvbVN0cmluZyA9IHRoZVBhdGhTdHJpbmcuc3BsaXQodGhlRGVsaW1pdGVyKTsNCi0NCi0JCS8vYnVpbGQgdGhlIHBhdGggZnJvbSB0aGUgYXJyYXkNCi0JCS8vcGFyYW0gMSA9IHBhdGggdG8gaWNvbiwgcGFyYW0gMiAtIGxhYmVsLCBwYXJhbSAzIC0gcGF0aCB0byBmaWxlDQotCQl2YXIgY291bnRlciA9IDA7DQotCQl2YXIgdGhlTGFiZWw7DQotCQl2YXIgdGhlUmVsUGF0aDsNCi0JCWlmIChhcnJheUZyb21TdHJpbmcubGVuZ3RoID4gMikNCi0JCXsNCi0JCSAgIHRoZUxvYyA9ICIiOw0KLQkJICAgZm9yKHZhciBpID0gMDsgaSA8IChhcnJheUZyb21TdHJpbmcubGVuZ3RoIC0gMSkgOyBpKyspDQotCQkgICB7DQotCQkJLy9pdCdzIHRoZSBpY29uIHBhdGgNCi0JCQlpZiAoY291bnRlciA8IDIpDQotCQkJew0KLQkJCQlpZiAoY291bnRlciA+IDApDQotCQkJCXsNCi0JCQkJCXRoZUxvYyA9IHRoZUxvYyArICIgJmd0OyAiOw0KLQkJCQl9DQotDQotCQkJCS8vYWxlcnQoIkNhbGN1bGF0aW5nIHBhdGggZnJvbSgxKSAiICsgdGhpc1BhZ2UgKyAiID0+ICIgKyBhcnJheUZyb21TdHJpbmdbaV0pOw0KLQ0KLQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldLmluZGV4T2YoIlxcIikgPT0gLTEgJiYgYXJyYXlGcm9tU3RyaW5nW2ldLmluZGV4T2YoIi8iKSA9PSAtMSkNCi0JCQkJew0KLQkJCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXSAhPSAibnVsbCIpDQotCQkJCQl7DQotCQkJCQkJdGhlUmVsUGF0aCA9ICJhcHBsZXQvaW1hZ2VzLyIgKyBhcnJheUZyb21TdHJpbmdbaV07DQotCQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgdGhlUmVsUGF0aCk7DQotCQkJCQl9DQotCQkJCQkvL2FsZXJ0KCJNb2RpZnlpbmcgUGF0aCA9PiAiICsgdGhlUmVsUGF0aCk7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCBhcnJheUZyb21TdHJpbmdbaV0pOw0KLQkJCQl9DQotDQotCQkJCWlmICh0aGVSZWxQYXRoICE9ICJudWxsIikNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCQkgIjxpbWcgYm9yZGVyPTAgc3JjPVwiIiArDQotCQkJCQkJIHRoZVJlbFBhdGggICsNCi0JCQkJCQkgIlwiPiI7DQotCQkJCX0NCi0NCi0JCQkJLy9hbGVydCgidGhlIGN1cnIgcGF0aD0+IiArIHRoZUxvYyk7DQotCQkJCWNvdW50ZXIgPSAyOw0KLQkJCX0NCi0JCQkvLyBpdCdzIHRoZSBsYWJlbA0KLQkJCWVsc2UgaWYgKGNvdW50ZXIgPT0gMikNCi0JCQl7DQotCQkJCXRoZUxhYmVsID0gYXJyYXlGcm9tU3RyaW5nW2ldOw0KLQkJCQljb3VudGVyID0gMzsNCi0JCQl9DQotCQkJZWxzZSBpZiAoY291bnRlciA9PSAzKQ0KLQkJCXsNCi0JCQkJLy9hbGVydCgiQ2FsY3VsYXRpbmcgcGF0aCBmcm9tKDMpICIgKyB0aGlzUGFnZSArICIgPT4gIiArIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0gIT0gIm51bGwiKQ0KLQkJCQl7DQotCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCBhcnJheUZyb21TdHJpbmdbaV0pOw0KLQkJCQkJaWYgKHRoZVJlbFBhdGggIT0gIiIpIHsNCi0JCQkJCQl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJIAkJIjxhIGNsYXNzPVwiaG90dGV4dFwiIHRhcmdldD1cIm9yeV9kb2NcIiBocmVmPVwiIiArDQotCQkJCQkJCSB0aGVSZWxQYXRoICsNCi0JCQkJCSAJCSJcIj4iICsNCi0JCQkJCSAJCXRoZUxhYmVsICsNCi0JCQkJCSAJCSI8XC9hPlxuIjsNCi0JCQkJCSB9DQotCQkJCQkgZWxzZSB7DQotCQkJCQkgCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkgCQkiPGEgY2xhc3M9XCJob3R0ZXh0XCI+IiAgKw0KLQkJCQkJIAkJdGhlTGFiZWwgKw0KLQkJCQkJIAkJIjxcL2E+XG4iOw0KLQkJCQkJIH0NCi0JCQkJfQ0KLQkJCQllbHNlDQotCQkJCXsNCi0JCQkJCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkgCSI8YSBjbGFzcz1cImhvdHRleHRcIj4iICArDQotCQkJCQkgCXRoZUxhYmVsICsNCi0JCQkJCSAJIjxcL2E+XG4iOw0KLQkJCQl9DQotCQkJCS8vYWxlcnQoInRoZSBjdXJyIHBhdGg9PiIgKyB0aGVMb2MpOw0KLQkJCQljb3VudGVyID0gMTsNCi0JCQkJdGhlUmVsUGF0aCA9ICJudWxsIjsNCi0JCQkJdGhlTGFiZWwgPSAibnVsbCI7DQotCQkJfQ0KLQkJICAgfQ0KLQ0KLQkJLy9hbGVydCgiRmluaXNoZWQgQnVpbGRpbmcgPT4gIiArIHRoZUxvYyk7DQotCQl9DQotDQotCX0NCi0NCi0JLy90aGVMb2MgPSAiQ3VycmVudCBMb2NhdGlvbiZuYnNwOyYjMDQ1OyZuYnNwOyIgKyB0aGVMb2M7DQotDQotCS8vYWxlcnQoInRoZSBGaW5hbCBTdHJpbmc9PiIgKyB0aGVMb2MpOw0KLQ0KLQkvL2RvY3VtZW50LndyaXRlKHRoZUxvYyk7DQotCXJldHVybiB0aGVMb2M7DQotDQotfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXZfZnIuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3NjcmlwdHMvdG9wbmF2X2ZyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDVkMDUxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXZfZnIuanMKKysrIC9kZXYvbnVsbApAQCAtMSw3ODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLy8gbWVzc2FnZXMgdG8gYmUgZXh0ZXJuaXplZA0KLS8vIGhlcmUgZGVmaW5lcyBhbGwgdGhlIEkxOE4gc3BlY2lmaWMgbWVzc2FnZXMgdXNlZCBpbiB0aGUgamF2YXNjcmlwdHMNCi0NCi12YXIgdG9wbmF2X2pzX01FU1NBR0UxID0gIkxlIGNoYXJnZW1lbnQgZHUgbmF2aWdhdGV1ciBkJ2FyYnJlIG4nZXN0IHBhcyB0ZXJtaW7DqSAhXG5WZXVpbGxleiBwYXRpZW50ZXIgISI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMiA9ICJJbCBuJ2V4aXN0ZSBhdWN1bmUgcGFnZSAnezB9JyBwb3VyIGNldHRlIHBhZ2UuXG5Fc3NheWV6IGwndW4gZGVzIGF1dHJlcyBib3V0b25zIGRlIG5hdmlnYXRpb24uIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0UzID0gIklsIG4nZXhpc3RlIHBhcyBkZSBwYWdlIHswfS4iOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV9wcmV2ID0gInByw6ljw6lkZW50IjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0VfbmV4dCA9ICJzdWl2YW50IjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0VfdXAgPSAiaGF1dCI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFNCA9ICJMZSBmaWNoaWVyIGVuIGNvdXJzIG5lIHNlIHRyb3V2ZSBwYXMgZGFucyBsZSBuYXZpZ2F0ZXVyIGQnYXJicmUuIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0U1ID0gIkxlIHNpdGUgcHVibGnDqSBlc3QgZMOpasOgIGFmZmljaMOpIGVuIHV0aWxpc2FudCBkZXMgY2FkcmVzIjsNCi0NCi1mdW5jdGlvbiBmb3JtYXRTdHJpbmcobWVzc2FnZSwgcmVwbGFjZTApDQotew0KLSAgIAlyZXR1cm4gbWVzc2FnZS5yZXBsYWNlKC9cezBcfS8sIHJlcGxhY2UwKTsNCi19IA0KLQ0KLS8vIHRoaXMgc2NyaXB0IGlzIGZvciB0aGUgdG9wbmF2Lmh0bWwNCi0vLyB0aGlzIGlzIE5PVCBmb3IgZ2VuZXJhbCB1c2UNCi1NU0ZQaG92ZXIgPQ0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwNCi0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOw0KLQ0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQ0KLSAgew0KLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7DQotICAgICBhLnNyYz1pbWc7DQotICAgICByZXR1cm4gYTsNCi0gIH0NCi0gIA0KLXZhciB0b3VyID0gMDsNCi0NCi1mdW5jdGlvbiBvcGVuRmlyc3RUb3VyICgpDQotLy8gb3BlbiB0aGUgZ3VpZGVkIHRvdXIgL2hhYWthbiA5OTAzMjQNCi17DQotaWYoIXRvdXIgfHwgdG91cj09bnVsbCB8fCB0b3VyLmNsb3NlZCkNCi0gICAgew0KLSAgICAgIHRvdXIgPSBvcGVuKCIuL3RvdXIvdG91ci5odG0iLCJ0b3VyX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9MzUwLGhlaWdodD03MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlblRvdXIgKCkNCi0vLyBvcGVuIHRoZSBndWlkZWQgdG91ciAvaGFha2FuIDk5MDMyNA0KLXsNCi1pZighdG91ciB8fCB0b3VyPT1udWxsIHx8IHRvdXIuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgdG91ciA9IG9wZW4oIi4vdG91ci90b3VyLmh0bSIsInRvdXJfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zNTAsaGVpZ2h0PTcwMCxyZXNpemFibGU9eWVzIik7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi0vL0FkZGl0aW9uIGJ5IENoaW5oIFZvIDAzLzI4LzAwDQotIGZ1bmN0aW9uIGRpc3BsYXlHZXR0aW5nU3RhcnRlZCgpDQotIHsNCi0gCXZhciBwYWdlUGF0dGVybiA9IC9vdnVfcHJvYy87DQotIAl2YXIgbWFpblBhZ2UgPSB3aW5kb3cucGFyZW50Lm9yeV9kb2MubG9jYXRpb247DQotDQotIAlpZiAoIHBhZ2VQYXR0ZXJuLnRlc3QoIG1haW5QYWdlICkgKSB7DQotICAgIAlpZiAoZ2V0Q29va2llKCJSVVAiKSAhPSAiY2hlY2tlZCIpIHsgb3BlbkZpcnN0VG91cigpOyB9DQotCX0NCi0JZWxzZSB7DQotCQlzZXRUaW1lb3V0KCAiZGlzcGxheUdldHRpbmdTdGFydGVkKCkiLCAxMDAwICk7DQotCX0NCi19DQotDQotZnVuY3Rpb24gZ2V0Q29va2llIChuYW1lKQ0KLXsNCi0gIHZhciBkY29va2llID0gZG9jdW1lbnQuY29va2llOw0KLSAgdmFyIGNuYW1lID0gbmFtZSArICI9IjsNCi0gIHZhciBjbGVuID0gZGNvb2tpZS5sZW5ndGg7DQotICB2YXIgY2JlZ2luID0gMDsNCi0gIHdoaWxlIChjYmVnaW4gPCBjbGVuKQ0KLSAgew0KLSAgICB2YXIgdmJlZ2luID0gY2JlZ2luICsgY25hbWUubGVuZ3RoOw0KLSAgICBpZiAoZGNvb2tpZS5zdWJzdHJpbmcoY2JlZ2luLCB2YmVnaW4pID09IGNuYW1lKQ0KLSAgICB7DQotICAgICAgdmFyIHZlbmQgPSBkY29va2llLmluZGV4T2YgKCI7IiwgdmJlZ2luKTsNCi0gICAgICBpZiAodmVuZCA9PSAtMSkNCi0gICAgICB7DQotICAgICAgICB2ZW5kID0gY2xlbjsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIHVuZXNjYXBlKGRjb29raWUuc3Vic3RyaW5nKHZiZWdpbiwgdmVuZCkpOw0KLSAgICB9DQotICAgIGNiZWdpbiA9IGRjb29raWUuaW5kZXhPZigiICIsIGNiZWdpbikgKyAxOw0KLSAgICBpZiAoY2JlZ2luID09IDApDQotICAgIHsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgfQ0KLSAgcmV0dXJuIG51bGw7DQotIH0NCi0NCi0NCi0gIHZhciBpbmRleD1udWxsOw0KLSAgdmFyIHRvdXI9bnVsbDsNCi0gIHZhciBzZWFyY2g9bnVsbDsNCi0gIHZhciBnbG9zc2FyeT1udWxsOw0KLSAgdmFyIGZlZWRiYWNrPW51bGw7DQotICB2YXIgdHJlZUxvYWRlZD1mYWxzZTsNCi0gIGZ1bmN0aW9uIGNoZWNrVHJlZUxvYWRlZCgpDQotICB7DQotICAgIGlmKHRyZWVMb2FkZWQpDQotICAgIHsNCi0gICAgICByZXR1cm4gdHJlZUxvYWRlZDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgaWYocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0ICE9IG51bGwNCi0gICAgICAgICYmIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5KCkpDQotICAgICB7DQotICAgICAgIHRyZWVMb2FkZWQgPSB0cnVlOw0KLSAgICAgfQ0KLSAgICAgKi8NCi0gICAgIGlmKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldCAhPSBudWxsKQ0KLSAgICAgew0KLSAgICAgIAl2YXIgbWV0aG9kID0gdHlwZW9mIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5Ow0KLQkgaWYgKG1ldGhvZCAhPSAidW5kZWZpbmVkIikgew0KLQkJaWYgKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5KCkpDQotCQl7DQotICAgICAgIAkJCXRyZWVMb2FkZWQgPSB0cnVlOw0KLQkJfQ0KLQ0KLQkgIH0NCi0NCi0gICAgIH0NCi0NCi0gICAgIHJldHVybiB0cmVlTG9hZGVkOw0KLSAgIH0NCi0NCi0NCi0gICAgZnVuY3Rpb24gc2hvd0FsZXJ0Tm90TG9hZGVkKCkNCi0gICAgew0KLSAgICAgIGFsZXJ0KHRvcG5hdl9qc19NRVNTQUdFMSk7DQotICAgIH0NCi0NCi1mdW5jdGlvbiBzaG93U3RhdHVzTm90TG9hZGVkKCkNCi0gIHsNCi0gICAgLy9yZXR1cm4gIlRoZSBUcmVlQnJvd3NlIGlzIG5vdCB5ZXQgbG9hZGVkIVxuUGxlYXNlIHdhaXQhIjsNCi0gICAgcmV0dXJuIHRvcG5hdl9qc19NRVNTQUdFMTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dBbGVydE5vUGFnZSh0ZXh0KQ0KLSAgew0KLSAgICAgdmFyIHBhcmVudExhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICBpZihwYXJlbnRMYWJlbCE9IiIgJiYgcGFyZW50TGFiZWwhPW51bGwpDQotICAgICB7DQotICAgICAgICAgIC8vYWxlcnQoIlRoZXJlIGlzIG5vICciICsgdGV4dCArICInIHBhZ2UgZm9yIHRoaXMgcGFnZS5cblRyeSBvbmUgb2YgdGhlIG90aGVyIG5hdmlnYXRpb24gYnV0dG9ucy4iKTsNCi0gICAgICAgICAgYWxlcnQoZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMiwgdGV4dCkpOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgIC8vYWxlcnQoIlRoZXJlIGlzIG5vICciICsgdGV4dCArICInIHBhZ2UgZm9yIHRoaXMgcGFnZS5cblRyeSBvbmUgb2YgdGhlIG90aGVyIG5hdmlnYXRpb24gYnV0dG9ucyIpOw0KLSAgICAgICAgIGFsZXJ0KGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTIsIHRleHQpKTsNCi0gICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dTdGF0dXNOb1BhZ2UodGV4dCkNCi0gIHsNCi0NCi0gICAgIHZhciBwYXJlbnRMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgdmFyIG1zZzsNCi0gICAgIGlmKHBhcmVudExhYmVsIT0iIiAmJiBwYXJlbnRMYWJlbCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgIC8vbXNnID0gIlRoZXJlIGlzIG5vICIgKyB0ZXh0ICsgIiBwYWdlISI7DQotICAgICAgICBtc2cgPSBmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UzLCB0ZXh0KTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgIC8vbXNnID0gIlRoZXJlIGlzIG5vICIgKyB0ZXh0ICsgIiBwYWdlISI7DQotICAgICAgICBtc2cgPSBmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UzLCB0ZXh0KTsNCi0gICAgIH0NCi0NCi0gICAgIHJldHVybiBtc2c7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93UGFyZW50TGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIHZhciBwYXJlbnR1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotDQotICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgcGFyZW50dXJsIT0iIiAmJiBwYXJlbnR1cmwhPW51bGwpDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gbGFiZWw7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vUGFnZSgidXAiKTsNCi0gICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vdExvYWRlZCgpOw0KLSAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93SG9tZUxhYmVsKCkNCi0gIHsNCi0gICAgc2VsZi5zdGF0dXMgPSAiSG9tZSI7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93UHJldmlvdXNMYWJlbCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzTGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgcHJldnVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c1VybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIHByZXZ1cmwhPSIiICYmIHByZXZ1cmwhPW51bGwpDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gbGFiZWw7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb1BhZ2UoInByZXZpb3VzIik7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd05leHRMYWJlbCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIHZhciBuZXh0dXJsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgbmV4dHVybCE9IiIgJiYgbmV4dHVybCE9bnVsbCkNCi0gICAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgIH0NCi0gICAgICBlbHNlDQotICAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSAgc2hvd1N0YXR1c05vUGFnZSgibmV4dCIpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSAgc2hvd1N0YXR1c05vdExvYWRlZCgpOw0KLSAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkUHJldmlvdXMoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzTGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c1VybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLQ0KLQlpZiAoKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpPT0tMSkgJiYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpPT0tMSkpDQotCXsNCi0JCXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0IikhPS0xKQ0KLQl7DQotCSAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEFwcGxldFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsKTsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKSE9LTEpDQotCXsNCi0JCW5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEh0dHBQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCwgIlByZXZpb3VzIik7DQotCX0NCi0JICAgICAgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKG5ld0xvY2F0aW9uKTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX3ByZXYpOw0KLSAgICAgfQ0KLSAgICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkTmV4dCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICB2YXIgbmV3TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLQ0KLQlpZiAoKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpPT0tMSkgJiYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpPT0tMSkpDQotCXsNCi0JCXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0IikhPS0xKQ0KLQl7DQotCSAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEFwcGxldFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsKTsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKSE9LTEpDQotCXsNCi0JCW5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEh0dHBQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCwgIk5leHQiKTsNCi0JfQ0KLSAgICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotDQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfbmV4dCk7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGxvYWRQYXJlbnQoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLSAgICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV91cCk7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotDQotICAgICByZXR1cm47DQotICB9DQotDQotZnVuY3Rpb24gd2hlcmVBbUkoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLQl2YXIgc3RhdHVzID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgCWlmKCBzdGF0dXMgPT0gZmFsc2UgKQ0KLQl7DQotCQlhbGVydCggdG9wbmF2X2pzX01FU1NBR0U0ICk7DQotCX0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gdXBBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnVwQXJyb3coKTsNCi0gICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICAgew0KLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gZG93bkFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZG93bkFycm93KCk7DQotICAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICB9DQotDQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gICAgZnVuY3Rpb24gbGVmdEFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5sZWZ0QXJyb3coKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgICBmdW5jdGlvbiByaWdodEFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5yaWdodEFycm93KCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0NCi1mdW5jdGlvbiBsb2FkVG9wKCkNCi17DQotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiBwYXJlbnQuZnJhbWVzWzFdLm5hbWU9PSJvcnlfdG9jIikNCi0gIHsNCi0gICAgIGFsZXJ0KHRvcG5hdl9qc19NRVNTQUdFNSk7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIHZhciBleHBpcmVzID0gbmV3IERhdGUoKTsNCi0gICAgZXhwaXJlcy5zZXRUaW1lIChleHBpcmVzLmdldFRpbWUoKSArICgxMDAwICogMjApKTsNCi0gICAgZG9jdW1lbnQuY29va2llID0gInJ1cF9vcnlfZG9jPSIgKyBlc2NhcGUgKGRvY3VtZW50LlVSTCkgKw0KLSAgICAiOyBleHBpcmVzPSIgKyBleHBpcmVzLnRvVVRDU3RyaW5nKCkgKyAgIjsgcGF0aD0vIjsNCi0NCi0gICAgdmFyIG5ld19vcnlfZG9jX2xvYyA9IG51bGw7DQotDQotICAgIGZvcihpPWRvY3VtZW50LmxpbmtzLmxlbmd0aC0xO2k+PTA7aS0tKQ0KLSAgICB7DQotICAgICAgIGlmKGRvY3VtZW50LmxpbmtzW2ldLmhyZWYuaW5kZXhPZigiaW5kZXguaHRtIikhPS0xKQ0KLSAgICAgICB7DQotICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gZG9jdW1lbnQubGlua3NbaV0uaHJlZjsNCi0gICAgICAgICBicmVhazsNCi0gICAgICAgfQ0KLSAgICB9DQotDQotICAgIGlmKG5ld19vcnlfZG9jX2xvYyE9bnVsbCkNCi0gICAgew0KLQlpZiggc2VsZi5uYW1lID09ICJvcnlfZG9jIiApDQotCXsNCi0JCXdpbmRvdy5jbG9zZSgpOw0KLQkJd2luZG93Lm9wZW4oIG5ld19vcnlfZG9jX2xvYyApOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsNCi0JfQ0KLSAgICB9DQotICAgfQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiBvcGVuT3J5IChwYWdlLCB0YXJnZXQpDQotew0KLSAgICBpZighaW5kZXggfHwgaW5kZXguY2xvc2VkKQ0KLSAgICB7DQotICAgICAgaW5kZXggPSBvcGVuKHBhZ2UsdGFyZ2V0LCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9Mzk1LGhlaWdodD01MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIGluZGV4LmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlblNlYXJjaCgpDQotew0KLSAgICBpZighc2VhcmNoIHx8IHNlYXJjaC5jbG9zZWQpDQotICAgIHsNCi0gICAgICBzZWFyY2ggPSBvcGVuKCIuL2FwcGxldC9zZWFyY2guaHRtIiwic2VhcmNoX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz1ubyx3aWR0aD02MzAsaGVpZ2h0PTQ1MCxyZXNpemFibGU9eWVzIik7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2VhcmNoLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlbkluZGV4KCkNCi17DQotICAgb3Blbk9yeSgiLi9pbmRleC9pbmRleC5odG0iLCJpbmRleF93aW4iKTsNCi19DQotDQotZnVuY3Rpb24gb3Blbkdsb3NzYXJ5KCkNCi17DQotIGlmKCFnbG9zc2FyeSB8fCBnbG9zc2FyeS5jbG9zZWQpDQotICAgIHsNCi0gICAgICBnbG9zc2FyeSA9IG9wZW4oIi4vcHJvY2Vzcy9nbG9zc2FyeS9pbmRleC5odG0iLCJnbG9zc2FyeV93aW4iLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9Mzg1LGhlaWdodD01MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIGdsb3NzYXJ5LmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gcHJpbnRQYWdlKCkNCi17DQotIHBhcmVudC5vcnlfZG9jLmZvY3VzKCk7DQotIHBhcmVudC5vcnlfZG9jLnByaW50KCk7DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHNlbmRGZWVkYmFjayh1cmwpDQotew0KLQlpZiAoIHVybCA9PSBudWxsIHx8IHVybCA9PSAnJyApDQotCXsNCi0JCXJldHVybjsNCi0JfQ0KLQkNCi0JaWYgKCB1cmwuaW5kZXhPZigibWFpbHRvOiIpID49IDAgKQ0KLQl7DQotCQlzZW5kbWFpbCh1cmwpOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJDQotIAkgICAgaWYoIWZlZWRiYWNrIHx8IGZlZWRiYWNrLmNsb3NlZCkNCi0JICAgIHsNCi0JICAgICAgZmVlZGJhY2sgPSBvcGVuKHVybCwiZmVlZGJhY2tfd2luIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTYwMCxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0JICAgIH0NCi0JICAgIGVsc2UNCi0JICAgIHsNCi0JICAgICAgZmVlZGJhY2suZm9jdXMoKTsNCi0JICAgIH0NCi0gICAgCX0NCi0gICAgCQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiBzZW5kbWFpbCh1cmwpDQotew0KLQlpZiAoIHVybC5pbmRleE9mKCI/c3ViamVjdCIpID09IC0xICkNCi0Jew0KLQkJdmFyIGxpbms9cGFyZW50Lm9yeV9kb2MubG9jYXRpb247DQotCQl1cmwgPSB1cmwgKyAnP3N1YmplY3Q9RmVlZGJhY2s6IC0gJytsaW5rOw0KLQl9DQotCWxvY2F0aW9uLnJlcGxhY2UodXJsKTsNCi19DQotDQotLy9jYWxjdWxhdGVzIHJlbGF0aXZlIHBhdGgNCi0vL3BhdGggbXVzdCBiZSBhbGwgcmVsYXRpdmUgZnJvbSB3ZWJzaXRlIGJhc2Ugb3IgY29udGFpbiBmdWxsIHVybHMNCi1mdW5jdGlvbiBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgoc291cmNlUGF0aCwgdGFyZ2V0UGF0aCkNCi17DQotCWlmICh0YXJnZXRQYXRoLmluZGV4T2YoImh0dHA6LyIpICE9IC0xKQ0KLQl7DQotCQlyZXR1cm4gdGFyZ2V0UGF0aDsNCi0JfQ0KLQ0KLQkvL3JlcGxhY2UgYWxsICdcJyB3aXRoICcvJw0KLQlzb3VyY2VQYXRoID0gc291cmNlUGF0aC5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQl0YXJnZXRQYXRoID0gdGFyZ2V0UGF0aC5yZXBsYWNlKC9cXC9nLCIvIik7DQotDQotCS8vYWxlcnQoIlJlcGxhY2UoU291cmNlKT0+IiArIHNvdXJjZVBhdGgpOw0KLQkvL2FsZXJ0KCJSZXBsYWNlKHRhcmdldCk9PiIgKyB0YXJnZXRQYXRoKTsNCi0NCi0NCi0Jc291cmNlQXJyYXkgPSBzb3VyY2VQYXRoLnNwbGl0KCIvIik7DQotCXRhcmdldEFycmF5ID0gdGFyZ2V0UGF0aC5zcGxpdCgiLyIpOw0KLQ0KLQl2YXIgdGhlUmVsUGF0aCA9ICIiOw0KLQ0KLQkvL2xvb3AgdW50aWwgd2UgZmluZCBhIGRpZmZlcmVuY2UNCi0JdmFyIGlkeCA9IDA7DQotCWZvcihpZHggPSAwOyBpZHggPCBzb3VyY2VBcnJheS5sZW5ndGg7IGlkeCsrKQ0KLQl7DQotCQlpZiAoaWR4ID4gdGFyZ2V0UGF0aC5sZW5ndGgpDQotCQl7DQotCQkJYnJlYWs7DQotCQl9DQotDQotCQlpZiAoc291cmNlQXJyYXlbaWR4XSAhPSB0YXJnZXRBcnJheVtpZHhdKQ0KLQkJew0KLQkJCWJyZWFrOw0KLQkJfQ0KLQl9DQotDQotCS8vYXBwZW5kIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgLi8NCi0JdmFyIG1heElkeCA9IHNvdXJjZUFycmF5Lmxlbmd0aCAtIDE7DQotCWZvciAodmFyIGkgPSBpZHg7IGkgPCBtYXhJZHg7IGkrKykNCi0Jew0KLQkJdGhlUmVsUGF0aCA9IHRoZVJlbFBhdGggKyAiLi8iOw0KLQ0KLQkJLy9hbGVydCgiUmVsUGF0aD0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vYXBwZW5kIGFueSByZW1haW5pbmcgdGFyZ2V0IHBhdGgNCi0Jd2hpbGUoaWR4IDwgdGFyZ2V0QXJyYXkubGVuZ3RoKQ0KLQl7DQotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aCArIHRhcmdldEFycmF5W2lkeCsrXSArICIvIjsNCi0JCS8vYWxlcnQoIlJlbFBhdGgoZmluYWwpPT4iICsgdGhlUmVsUGF0aCk7DQotCX0NCi0NCi0JLy9yZW1vdmUgdGhlIGxhc3QgcGF0aCBzZXBhcmF0b3INCi0JaWYgKHRoZVJlbFBhdGgubGVuZ3RoID4gMCkNCi0Jew0KLQkJLy9hbGVydCgiUmVsUGF0aChUcmltMSk9PiIgKyB0aGVSZWxQYXRoKTsNCi0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoLnN1YnN0cmluZygwLCAodGhlUmVsUGF0aC5sZW5ndGggLSAxKSk7DQotCQkvL2FsZXJ0KCJSZWxQYXRoKFRyaW0xKT0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vYWxlcnQoIlJldHVybiBSZWxhdGl2ZSBQYXRoID0+ICIgKyB0aGVSZWxQYXRoKTsNCi0NCi0JcmV0dXJuIHRoZVJlbFBhdGg7DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldFRyZWVQYXRoKCkNCi17DQotCXJldHVybiBidWlsZFRyZWVQYXRoTG9jYXRpb24oKTsNCi19DQotDQotLy9UaGlzIG1ldGhvZCB3aWxsIHJlbW92ZSB0aGUgd2Vic2l0ZSBiYXNlIGZyb20gdGhlIHVybA0KLWZ1bmN0aW9uIGNhbGN1bGF0Q3VycmVudFBhZ2UoY3VyclVSTCkgew0KLQ0KLQl2YXIgdGhlQ3VycmVudExvY2F0aW9uID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZjsNCi0JLy9yZXBsYWNlIGFsbCAnXCcgd2l0aCAnLycNCi0JdGhlQ3VycmVudExvY2F0aW9uID0gdGhlQ3VycmVudExvY2F0aW9uLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7DQotCWN1cnJVUkwgPSBjdXJyVVJMLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7DQotDQotCXZhciBzb3VyY2VBcnJheSA9IHRoZUN1cnJlbnRMb2NhdGlvbi5zcGxpdCgiLyIpOw0KLQl2YXIgY3VyckFycmF5ID0gY3VyclVSTC5zcGxpdCgiLyIpOw0KLQ0KLQl2YXIgbnVtVG9SZW1vdmUgPSBzb3VyY2VBcnJheS5sZW5ndGggLSAyOw0KLQl2YXIgaWR4ID0gMDsNCi0JdmFyIHRoZVJldHVyblBhdGggPSAiIjsNCi0JZm9yIChpZHggPSBudW1Ub1JlbW92ZTsgaWR4IDwgY3VyckFycmF5Lmxlbmd0aDsgaWR4KyspIHsNCi0JCWlmICh0aGVSZXR1cm5QYXRoICE9ICIiKSB7DQotCQkJdGhlUmV0dXJuUGF0aCA9IHRoZVJldHVyblBhdGggKyAiLyI7DQotCQl9DQotCQl0aGVSZXR1cm5QYXRoID0gdGhlUmV0dXJuUGF0aCArIGN1cnJBcnJheVtpZHhdOw0KLQl9DQotDQotCS8vYWxlcnQoIkFycmF5VGVzdD0+IiArIGN1cnJVUkwgKyAiLCIgKyB0aGVSZXR1cm5QYXRoKTsNCi0JcmV0dXJuIHRoZVJldHVyblBhdGg7DQotfQ0KLQ0KLS8vYnVpbGRzIHRyZWUgcGF0aA0KLWZ1bmN0aW9uIGJ1aWxkVHJlZVBhdGhMb2NhdGlvbigpDQotew0KLQl2YXIgdGhlRGVsaW1pdGVyID0gIiMjKiI7DQotCXZhciB0aGlzUGFnZSA9ICJhcHBsZXQvcnVwX3RvcG5hdi5odG0iOw0KLQl2YXIgdGhlTG9jID0gIiI7DQotDQotDQotDQotCWlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLQl7DQotCQl2YXIgdGhlQ3VycmVudExvY2F0aW9uID0gcGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQubG9jYXRpb24uaHJlZjsNCi0JCXRoaXNQYWdlID0gY2FsY3VsYXRDdXJyZW50UGFnZSh0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJLy9hbGVydCgiUGF0aE5hbWU6IiArIHRoaXNQYWdlKTsNCi0NCi0JCS8vYWxlcnQoIlRyeWluZyB0byBmaW5kIHRoZSBwYXRoIGZvciA9PiIgKyB0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJdmFyIHRoZVBhdGggPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuZ2V0VHJlZVBhdGhBcnJheSh0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJLy9hbGVydCgiVGhlIFRyZWUgUGF0aDogIiArIHRoZVBhdGgpOw0KLQ0KLQkJdGhlUGF0aFN0cmluZyA9IHRoZVBhdGggKyAiIjsNCi0gICAgCQlhcnJheUZyb21TdHJpbmcgPSB0aGVQYXRoU3RyaW5nLnNwbGl0KHRoZURlbGltaXRlcik7DQotDQotCQkvL2J1aWxkIHRoZSBwYXRoIGZyb20gdGhlIGFycmF5DQotCQkvL3BhcmFtIDEgPSBwYXRoIHRvIGljb24sIHBhcmFtIDIgLSBsYWJlbCwgcGFyYW0gMyAtIHBhdGggdG8gZmlsZQ0KLQkJdmFyIGNvdW50ZXIgPSAwOw0KLQkJdmFyIHRoZUxhYmVsOw0KLQkJdmFyIHRoZVJlbFBhdGg7DQotCQlpZiAoYXJyYXlGcm9tU3RyaW5nLmxlbmd0aCA+IDIpDQotCQl7DQotCQkgICB0aGVMb2MgPSAiIjsNCi0JCSAgIGZvcih2YXIgaSA9IDA7IGkgPCAoYXJyYXlGcm9tU3RyaW5nLmxlbmd0aCAtIDEpIDsgaSsrKQ0KLQkJICAgew0KLQkJCS8vaXQncyB0aGUgaWNvbiBwYXRoDQotCQkJaWYgKGNvdW50ZXIgPCAyKQ0KLQkJCXsNCi0JCQkJaWYgKGNvdW50ZXIgPiAwKQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKyAiICZndDsgIjsNCi0JCQkJfQ0KLQ0KLQkJCQkvL2FsZXJ0KCJDYWxjdWxhdGluZyBwYXRoIGZyb20oMSkgIiArIHRoaXNQYWdlICsgIiA9PiAiICsgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0NCi0JCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXS5pbmRleE9mKCJcXCIpID09IC0xICYmIGFycmF5RnJvbVN0cmluZ1tpXS5pbmRleE9mKCIvIikgPT0gLTEpDQotCQkJCXsNCi0JCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0gIT0gIm51bGwiKQ0KLQkJCQkJew0KLQkJCQkJCXRoZVJlbFBhdGggPSAiYXBwbGV0L2ltYWdlcy8iICsgYXJyYXlGcm9tU3RyaW5nW2ldOw0KLQkJCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIHRoZVJlbFBhdGgpOw0KLQkJCQkJfQ0KLQkJCQkJLy9hbGVydCgiTW9kaWZ5aW5nIFBhdGggPT4gIiArIHRoZVJlbFBhdGgpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJfQ0KLQ0KLQkJCQlpZiAodGhlUmVsUGF0aCAhPSAibnVsbCIpDQotCQkJCXsNCi0JCQkJCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkJICI8aW1nIGJvcmRlcj0wIHNyYz1cIiIgKw0KLQkJCQkJCSB0aGVSZWxQYXRoICArDQotCQkJCQkJICJcIj4iOw0KLQkJCQl9DQotDQotCQkJCS8vYWxlcnQoInRoZSBjdXJyIHBhdGg9PiIgKyB0aGVMb2MpOw0KLQkJCQljb3VudGVyID0gMjsNCi0JCQl9DQotCQkJLy8gaXQncyB0aGUgbGFiZWwNCi0JCQllbHNlIGlmIChjb3VudGVyID09IDIpDQotCQkJew0KLQkJCQl0aGVMYWJlbCA9IGFycmF5RnJvbVN0cmluZ1tpXTsNCi0JCQkJY291bnRlciA9IDM7DQotCQkJfQ0KLQkJCWVsc2UgaWYgKGNvdW50ZXIgPT0gMykNCi0JCQl7DQotCQkJCS8vYWxlcnQoIkNhbGN1bGF0aW5nIHBhdGggZnJvbSgzKSAiICsgdGhpc1BhZ2UgKyAiID0+ICIgKyBhcnJheUZyb21TdHJpbmdbaV0pOw0KLQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldICE9ICJudWxsIikNCi0JCQkJew0KLQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJCWlmICh0aGVSZWxQYXRoICE9ICIiKSB7DQotCQkJCQkJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJCSI8YSBjbGFzcz1cImhvdHRleHRcIiB0YXJnZXQ9XCJvcnlfZG9jXCIgaHJlZj1cIiIgKw0KLQkJCQkJCQkgdGhlUmVsUGF0aCArDQotCQkJCQkgCQkiXCI+IiArDQotCQkJCQkgCQl0aGVMYWJlbCArDQotCQkJCQkgCQkiPFwvYT5cbiI7DQotCQkJCQkgfQ0KLQkJCQkJIGVsc2Ugew0KLQkJCQkJIAl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJIAkJIjxhIGNsYXNzPVwiaG90dGV4dFwiPiIgICsNCi0JCQkJCSAJCXRoZUxhYmVsICsNCi0JCQkJCSAJCSI8XC9hPlxuIjsNCi0JCQkJCSB9DQotCQkJCX0NCi0JCQkJZWxzZQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJIAkiPGEgY2xhc3M9XCJob3R0ZXh0XCI+IiAgKw0KLQkJCQkJIAl0aGVMYWJlbCArDQotCQkJCQkgCSI8XC9hPlxuIjsNCi0JCQkJfQ0KLQkJCQkvL2FsZXJ0KCJ0aGUgY3VyciBwYXRoPT4iICsgdGhlTG9jKTsNCi0JCQkJY291bnRlciA9IDE7DQotCQkJCXRoZVJlbFBhdGggPSAibnVsbCI7DQotCQkJCXRoZUxhYmVsID0gIm51bGwiOw0KLQkJCX0NCi0JCSAgIH0NCi0NCi0JCS8vYWxlcnQoIkZpbmlzaGVkIEJ1aWxkaW5nID0+ICIgKyB0aGVMb2MpOw0KLQkJfQ0KLQ0KLQl9DQotDQotCS8vdGhlTG9jID0gIkN1cnJlbnQgTG9jYXRpb24mbmJzcDsmIzA0NTsmbmJzcDsiICsgdGhlTG9jOw0KLQ0KLQkvL2FsZXJ0KCJ0aGUgRmluYWwgU3RyaW5nPT4iICsgdGhlTG9jKTsNCi0NCi0JLy9kb2N1bWVudC53cml0ZSh0aGVMb2MpOw0KLQlyZXR1cm4gdGhlTG9jOw0KLQ0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3NjcmlwdHMvdG9wbmF2X2l0LmpzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl9pdC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg1MThiYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3NjcmlwdHMvdG9wbmF2X2l0LmpzCisrKyAvZGV2L251bGwKQEAgLTEsNzg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8vIG1lc3NhZ2VzIHRvIGJlIGV4dGVybml6ZWQNCi0vLyBoZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotDQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMSA9ICJJbCBicm93c2VyIGRlbGxhIHN0cnV0dHVyYSBub24gw6ggc3RhdG8gYW5jb3JhIGNhcmljYXRvIVxuQXR0ZW5kZXJlISI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMiA9ICJOb24gZXNpc3RlIGFsY3VuYSBwYWdpbmEgJ3swfScgcGVyIHF1ZXN0YSBwYWdpbmEuXG5Qcm92YXJlIHVuIGFsdHJvIHB1bHNhbnRlIGRpIG5hdmlnYXppb25lLiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMyA9ICJOb24gZXNpc3RlIGFsY3VuYSBwYWdpbmEgezB9ISI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3ByZXYgPSAicHJlY2VkZW50ZSI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX25leHQgPSAic3VjY2Vzc2l2byI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3VwID0gInN1IjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0U0ID0gIklsIGZpbGUgY29ycmVudGUgbm9uIHNpIHRyb3ZhIG5lbCBicm93c2VyIGRlbGxhIHN0cnV0dHVyYS4iOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTUgPSAiSWwgc2l0byBwdWJibGljYXRvIHZpZW5lIGdpw6AgdmlzdWFsaXp6YXRvIG1lZGlhbnRlIGkgZnJhbWUiOw0KLQ0KLWZ1bmN0aW9uIGZvcm1hdFN0cmluZyhtZXNzYWdlLCByZXBsYWNlMCkNCi17DQotICAgCXJldHVybiBtZXNzYWdlLnJlcGxhY2UoL1x7MFx9LywgcmVwbGFjZTApOw0KLX0gDQotDQotLy8gdGhpcyBzY3JpcHQgaXMgZm9yIHRoZSB0b3BuYXYuaHRtbA0KLS8vIHRoaXMgaXMgTk9UIGZvciBnZW5lcmFsIHVzZQ0KLU1TRlBob3ZlciA9DQotKCgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk5ldHNjYXBlIikgJiYNCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gMyApKSB8fA0KLSAgKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIikgJiYNCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gNCApKSk7DQotDQotICBmdW5jdGlvbiBNU0ZQcHJlbG9hZChpbWcpDQotICB7DQotICAgICB2YXIgYT1uZXcgSW1hZ2UoKTsNCi0gICAgIGEuc3JjPWltZzsNCi0gICAgIHJldHVybiBhOw0KLSAgfQ0KLSAgDQotdmFyIHRvdXIgPSAwOw0KLQ0KLWZ1bmN0aW9uIG9wZW5GaXJzdFRvdXIgKCkNCi0vLyBvcGVuIHRoZSBndWlkZWQgdG91ciAvaGFha2FuIDk5MDMyNA0KLXsNCi1pZighdG91ciB8fCB0b3VyPT1udWxsIHx8IHRvdXIuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgdG91ciA9IG9wZW4oIi4vdG91ci90b3VyLmh0bSIsInRvdXJfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zNTAsaGVpZ2h0PTcwMCxyZXNpemFibGU9eWVzIik7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBvcGVuVG91ciAoKQ0KLS8vIG9wZW4gdGhlIGd1aWRlZCB0b3VyIC9oYWFrYW4gOTkwMzI0DQotew0KLWlmKCF0b3VyIHx8IHRvdXI9PW51bGwgfHwgdG91ci5jbG9zZWQpDQotICAgIHsNCi0gICAgICB0b3VyID0gb3BlbigiLi90b3VyL3RvdXIuaHRtIiwidG91cl9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM1MCxoZWlnaHQ9NzAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLS8vQWRkaXRpb24gYnkgQ2hpbmggVm8gMDMvMjgvMDANCi0gZnVuY3Rpb24gZGlzcGxheUdldHRpbmdTdGFydGVkKCkNCi0gew0KLSAJdmFyIHBhZ2VQYXR0ZXJuID0gL292dV9wcm9jLzsNCi0gCXZhciBtYWluUGFnZSA9IHdpbmRvdy5wYXJlbnQub3J5X2RvYy5sb2NhdGlvbjsNCi0NCi0gCWlmICggcGFnZVBhdHRlcm4udGVzdCggbWFpblBhZ2UgKSApIHsNCi0gICAgCWlmIChnZXRDb29raWUoIlJVUCIpICE9ICJjaGVja2VkIikgeyBvcGVuRmlyc3RUb3VyKCk7IH0NCi0JfQ0KLQllbHNlIHsNCi0JCXNldFRpbWVvdXQoICJkaXNwbGF5R2V0dGluZ1N0YXJ0ZWQoKSIsIDEwMDAgKTsNCi0JfQ0KLX0NCi0NCi1mdW5jdGlvbiBnZXRDb29raWUgKG5hbWUpDQotew0KLSAgdmFyIGRjb29raWUgPSBkb2N1bWVudC5jb29raWU7DQotICB2YXIgY25hbWUgPSBuYW1lICsgIj0iOw0KLSAgdmFyIGNsZW4gPSBkY29va2llLmxlbmd0aDsNCi0gIHZhciBjYmVnaW4gPSAwOw0KLSAgd2hpbGUgKGNiZWdpbiA8IGNsZW4pDQotICB7DQotICAgIHZhciB2YmVnaW4gPSBjYmVnaW4gKyBjbmFtZS5sZW5ndGg7DQotICAgIGlmIChkY29va2llLnN1YnN0cmluZyhjYmVnaW4sIHZiZWdpbikgPT0gY25hbWUpDQotICAgIHsNCi0gICAgICB2YXIgdmVuZCA9IGRjb29raWUuaW5kZXhPZiAoIjsiLCB2YmVnaW4pOw0KLSAgICAgIGlmICh2ZW5kID09IC0xKQ0KLSAgICAgIHsNCi0gICAgICAgIHZlbmQgPSBjbGVuOw0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gdW5lc2NhcGUoZGNvb2tpZS5zdWJzdHJpbmcodmJlZ2luLCB2ZW5kKSk7DQotICAgIH0NCi0gICAgY2JlZ2luID0gZGNvb2tpZS5pbmRleE9mKCIgIiwgY2JlZ2luKSArIDE7DQotICAgIGlmIChjYmVnaW4gPT0gMCkNCi0gICAgew0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICB9DQotICByZXR1cm4gbnVsbDsNCi0gfQ0KLQ0KLQ0KLSAgdmFyIGluZGV4PW51bGw7DQotICB2YXIgdG91cj1udWxsOw0KLSAgdmFyIHNlYXJjaD1udWxsOw0KLSAgdmFyIGdsb3NzYXJ5PW51bGw7DQotICB2YXIgZmVlZGJhY2s9bnVsbDsNCi0gIHZhciB0cmVlTG9hZGVkPWZhbHNlOw0KLSAgZnVuY3Rpb24gY2hlY2tUcmVlTG9hZGVkKCkNCi0gIHsNCi0gICAgaWYodHJlZUxvYWRlZCkNCi0gICAgew0KLSAgICAgIHJldHVybiB0cmVlTG9hZGVkOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICBpZihwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQgIT0gbnVsbA0KLSAgICAgICAgJiYgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHkoKSkNCi0gICAgIHsNCi0gICAgICAgdHJlZUxvYWRlZCA9IHRydWU7DQotICAgICB9DQotICAgICAqLw0KLSAgICAgaWYocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0ICE9IG51bGwpDQotICAgICB7DQotICAgICAgCXZhciBtZXRob2QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHk7DQotCSBpZiAobWV0aG9kICE9ICJ1bmRlZmluZWQiKSB7DQotCQlpZiAocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHkoKSkNCi0JCXsNCi0gICAgICAgCQkJdHJlZUxvYWRlZCA9IHRydWU7DQotCQl9DQotDQotCSAgfQ0KLQ0KLSAgICAgfQ0KLQ0KLSAgICAgcmV0dXJuIHRyZWVMb2FkZWQ7DQotICAgfQ0KLQ0KLQ0KLSAgICBmdW5jdGlvbiBzaG93QWxlcnROb3RMb2FkZWQoKQ0KLSAgICB7DQotICAgICAgYWxlcnQodG9wbmF2X2pzX01FU1NBR0UxKTsNCi0gICAgfQ0KLQ0KLWZ1bmN0aW9uIHNob3dTdGF0dXNOb3RMb2FkZWQoKQ0KLSAgew0KLSAgICAvL3JldHVybiAiVGhlIFRyZWVCcm93c2UgaXMgbm90IHlldCBsb2FkZWQhXG5QbGVhc2Ugd2FpdCEiOw0KLSAgICByZXR1cm4gdG9wbmF2X2pzX01FU1NBR0UxOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd0FsZXJ0Tm9QYWdlKHRleHQpDQotICB7DQotICAgICB2YXIgcGFyZW50TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKHBhcmVudExhYmVsIT0iIiAmJiBwYXJlbnRMYWJlbCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgICAgLy9hbGVydCgiVGhlcmUgaXMgbm8gJyIgKyB0ZXh0ICsgIicgcGFnZSBmb3IgdGhpcyBwYWdlLlxuVHJ5IG9uZSBvZiB0aGUgb3RoZXIgbmF2aWdhdGlvbiBidXR0b25zLiIpOw0KLSAgICAgICAgICBhbGVydChmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UyLCB0ZXh0KSk7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICAgLy9hbGVydCgiVGhlcmUgaXMgbm8gJyIgKyB0ZXh0ICsgIicgcGFnZSBmb3IgdGhpcyBwYWdlLlxuVHJ5IG9uZSBvZiB0aGUgb3RoZXIgbmF2aWdhdGlvbiBidXR0b25zIik7DQotICAgICAgICAgYWxlcnQoZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMiwgdGV4dCkpOw0KLSAgICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1N0YXR1c05vUGFnZSh0ZXh0KQ0KLSAgew0KLQ0KLSAgICAgdmFyIHBhcmVudExhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbXNnOw0KLSAgICAgaWYocGFyZW50TGFiZWwhPSIiICYmIHBhcmVudExhYmVsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICAgLy9tc2cgPSAiVGhlcmUgaXMgbm8gIiArIHRleHQgKyAiIHBhZ2UhIjsNCi0gICAgICAgIG1zZyA9IGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTMsIHRleHQpOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgLy9tc2cgPSAiVGhlcmUgaXMgbm8gIiArIHRleHQgKyAiIHBhZ2UhIjsNCi0gICAgICAgIG1zZyA9IGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTMsIHRleHQpOw0KLSAgICAgfQ0KLQ0KLSAgICAgcmV0dXJuIG1zZzsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dQYXJlbnRMYWJlbCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgdmFyIHBhcmVudHVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKGxhYmVsIT0iIiAmJiBsYWJlbCE9bnVsbCAmJiBwYXJlbnR1cmwhPSIiICYmIHBhcmVudHVybCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm9QYWdlKCJ1cCIpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm90TG9hZGVkKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dIb21lTGFiZWwoKQ0KLSAgew0KLSAgICBzZWxmLnN0YXR1cyA9ICJIb21lIjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dQcmV2aW91c0xhYmVsKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIHZhciBwcmV2dXJsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzVXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotDQotICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgcHJldnVybCE9IiIgJiYgcHJldnVybCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vUGFnZSgicHJldmlvdXMiKTsNCi0gICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vdExvYWRlZCgpOw0KLSAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93TmV4dExhYmVsKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgdmFyIG5leHR1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIGlmKGxhYmVsIT0iIiAmJiBsYWJlbCE9bnVsbCAmJiBuZXh0dXJsIT0iIiAmJiBuZXh0dXJsIT1udWxsKQ0KLSAgICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gbGFiZWw7DQotICAgICAgfQ0KLSAgICAgIGVsc2UNCi0gICAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9ICBzaG93U3RhdHVzTm9QYWdlKCJuZXh0Iik7DQotICAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9ICBzaG93U3RhdHVzTm90TG9hZGVkKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGxvYWRQcmV2aW91cygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICB2YXIgbmV3TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzVXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotDQotICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICB7DQotDQotCWlmICgobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0Iik9PS0xKSAmJiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3Iik9PS0xKSkNCi0Jew0KLQkJcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKSE9LTEpDQotCXsNCi0JIAlwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0QXBwbGV0UGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwpOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpIT0tMSkNCi0Jew0KLQkJbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0SHR0cFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsLCAiUHJldmlvdXMiKTsNCi0JfQ0KLQkgICAgICAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfcHJldik7DQotICAgICB9DQotICAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGxvYWROZXh0KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICB7DQotDQotCWlmICgobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0Iik9PS0xKSAmJiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3Iik9PS0xKSkNCi0Jew0KLQkJcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKSE9LTEpDQotCXsNCi0JIAlwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0QXBwbGV0UGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwpOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpIT0tMSkNCi0Jew0KLQkJbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0SHR0cFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsLCAiTmV4dCIpOw0KLQl9DQotICAgICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKG5ld0xvY2F0aW9uKTsNCi0NCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV9uZXh0KTsNCi0gICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZFBhcmVudCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICB7DQotICAgICAgIHBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotICAgICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKG5ld0xvY2F0aW9uKTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX3VwKTsNCi0gICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi1mdW5jdGlvbiB3aGVyZUFtSSgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotCXZhciBzdGF0dXMgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAJaWYoIHN0YXR1cyA9PSBmYWxzZSApDQotCXsNCi0JCWFsZXJ0KCB0b3BuYXZfanNfTUVTU0FHRTQgKTsNCi0JfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiB1cEFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUudXBBcnJvdygpOw0KLSAgICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgICB7DQotICAgICAgIHBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotICAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiBkb3duQXJyb3coKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5kb3duQXJyb3coKTsNCi0gICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICAgew0KLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLSAgICAgIH0NCi0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgICBmdW5jdGlvbiBsZWZ0QXJyb3coKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmxlZnRBcnJvdygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICAgIGZ1bmN0aW9uIHJpZ2h0QXJyb3coKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnJpZ2h0QXJyb3coKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLQ0KLWZ1bmN0aW9uIGxvYWRUb3AoKQ0KLXsNCi0gIGlmKHBhcmVudC5mcmFtZXMubGVuZ3RoIT0wICYmIHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2MiKQ0KLSAgew0KLSAgICAgYWxlcnQodG9wbmF2X2pzX01FU1NBR0U1KTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOw0KLSAgICBleHBpcmVzLnNldFRpbWUgKGV4cGlyZXMuZ2V0VGltZSgpICsgKDEwMDAgKiAyMCkpOw0KLSAgICBkb2N1bWVudC5jb29raWUgPSAicnVwX29yeV9kb2M9IiArIGVzY2FwZSAoZG9jdW1lbnQuVVJMKSArDQotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOw0KLQ0KLSAgICB2YXIgbmV3X29yeV9kb2NfbG9jID0gbnVsbDsNCi0NCi0gICAgZm9yKGk9ZG9jdW1lbnQubGlua3MubGVuZ3RoLTE7aT49MDtpLS0pDQotICAgIHsNCi0gICAgICAgaWYoZG9jdW1lbnQubGlua3NbaV0uaHJlZi5pbmRleE9mKCJpbmRleC5odG0iKSE9LTEpDQotICAgICAgIHsNCi0gICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBkb2N1bWVudC5saW5rc1tpXS5ocmVmOw0KLSAgICAgICAgIGJyZWFrOw0KLSAgICAgICB9DQotICAgIH0NCi0NCi0gICAgaWYobmV3X29yeV9kb2NfbG9jIT1udWxsKQ0KLSAgICB7DQotCWlmKCBzZWxmLm5hbWUgPT0gIm9yeV9kb2MiICkNCi0Jew0KLQkJd2luZG93LmNsb3NlKCk7DQotCQl3aW5kb3cub3BlbiggbmV3X29yeV9kb2NfbG9jICk7DQotCX0NCi0JZWxzZQ0KLQl7DQotCSAgICAgICAJdG9wLmxvY2F0aW9uID0gbmV3X29yeV9kb2NfbG9jOw0KLQl9DQotICAgIH0NCi0gICB9DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIG9wZW5PcnkgKHBhZ2UsIHRhcmdldCkNCi17DQotICAgIGlmKCFpbmRleCB8fCBpbmRleC5jbG9zZWQpDQotICAgIHsNCi0gICAgICBpbmRleCA9IG9wZW4ocGFnZSx0YXJnZXQsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zOTUsaGVpZ2h0PTUwMCxyZXNpemFibGU9eWVzIik7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgaW5kZXguZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBvcGVuU2VhcmNoKCkNCi17DQotICAgIGlmKCFzZWFyY2ggfHwgc2VhcmNoLmNsb3NlZCkNCi0gICAgew0KLSAgICAgIHNlYXJjaCA9IG9wZW4oIi4vYXBwbGV0L3NlYXJjaC5odG0iLCJzZWFyY2hfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPW5vLHdpZHRoPTYzMCxoZWlnaHQ9NDUwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzZWFyY2guZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBvcGVuSW5kZXgoKQ0KLXsNCi0gICBvcGVuT3J5KCIuL2luZGV4L2luZGV4Lmh0bSIsImluZGV4X3dpbiIpOw0KLX0NCi0NCi1mdW5jdGlvbiBvcGVuR2xvc3NhcnkoKQ0KLXsNCi0gaWYoIWdsb3NzYXJ5IHx8IGdsb3NzYXJ5LmNsb3NlZCkNCi0gICAgew0KLSAgICAgIGdsb3NzYXJ5ID0gb3BlbigiLi9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4Lmh0bSIsImdsb3NzYXJ5X3dpbiIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zODUsaGVpZ2h0PTUwMCxyZXNpemFibGU9eWVzIik7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgZ2xvc3NhcnkuZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBwcmludFBhZ2UoKQ0KLXsNCi0gcGFyZW50Lm9yeV9kb2MuZm9jdXMoKTsNCi0gcGFyZW50Lm9yeV9kb2MucHJpbnQoKTsNCi19DQotDQotDQotZnVuY3Rpb24gc2VuZEZlZWRiYWNrKHVybCkNCi17DQotCWlmICggdXJsID09IG51bGwgfHwgdXJsID09ICcnICkNCi0Jew0KLQkJcmV0dXJuOw0KLQl9DQotCQ0KLQlpZiAoIHVybC5pbmRleE9mKCJtYWlsdG86IikgPj0gMCApDQotCXsNCi0JCXNlbmRtYWlsKHVybCk7DQotCX0NCi0JZWxzZQ0KLQl7DQotCQkNCi0gCSAgICBpZighZmVlZGJhY2sgfHwgZmVlZGJhY2suY2xvc2VkKQ0KLQkgICAgew0KLQkgICAgICBmZWVkYmFjayA9IG9wZW4odXJsLCJmZWVkYmFja193aW4iLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9NjAwLGhlaWdodD01MDAscmVzaXphYmxlPXllcyIpOw0KLQkgICAgfQ0KLQkgICAgZWxzZQ0KLQkgICAgew0KLQkgICAgICBmZWVkYmFjay5mb2N1cygpOw0KLQkgICAgfQ0KLSAgICAJfQ0KLSAgICAJDQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHNlbmRtYWlsKHVybCkNCi17DQotCWlmICggdXJsLmluZGV4T2YoIj9zdWJqZWN0IikgPT0gLTEgKQ0KLQl7DQotCQl2YXIgbGluaz1wYXJlbnQub3J5X2RvYy5sb2NhdGlvbjsNCi0JCXVybCA9IHVybCArICc/c3ViamVjdD1GZWVkYmFjazogLSAnK2xpbms7DQotCX0NCi0JbG9jYXRpb24ucmVwbGFjZSh1cmwpOw0KLX0NCi0NCi0vL2NhbGN1bGF0ZXMgcmVsYXRpdmUgcGF0aA0KLS8vcGF0aCBtdXN0IGJlIGFsbCByZWxhdGl2ZSBmcm9tIHdlYnNpdGUgYmFzZSBvciBjb250YWluIGZ1bGwgdXJscw0KLWZ1bmN0aW9uIGNhbGN1bGF0ZVJlbGF0aXZlUGF0aChzb3VyY2VQYXRoLCB0YXJnZXRQYXRoKQ0KLXsNCi0JaWYgKHRhcmdldFBhdGguaW5kZXhPZigiaHR0cDovIikgIT0gLTEpDQotCXsNCi0JCXJldHVybiB0YXJnZXRQYXRoOw0KLQl9DQotDQotCS8vcmVwbGFjZSBhbGwgJ1wnIHdpdGggJy8nDQotCXNvdXJjZVBhdGggPSBzb3VyY2VQYXRoLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7DQotCXRhcmdldFBhdGggPSB0YXJnZXRQYXRoLnJlcGxhY2UoL1xcL2csIi8iKTsNCi0NCi0JLy9hbGVydCgiUmVwbGFjZShTb3VyY2UpPT4iICsgc291cmNlUGF0aCk7DQotCS8vYWxlcnQoIlJlcGxhY2UodGFyZ2V0KT0+IiArIHRhcmdldFBhdGgpOw0KLQ0KLQ0KLQlzb3VyY2VBcnJheSA9IHNvdXJjZVBhdGguc3BsaXQoIi8iKTsNCi0JdGFyZ2V0QXJyYXkgPSB0YXJnZXRQYXRoLnNwbGl0KCIvIik7DQotDQotCXZhciB0aGVSZWxQYXRoID0gIiI7DQotDQotCS8vbG9vcCB1bnRpbCB3ZSBmaW5kIGEgZGlmZmVyZW5jZQ0KLQl2YXIgaWR4ID0gMDsNCi0JZm9yKGlkeCA9IDA7IGlkeCA8IHNvdXJjZUFycmF5Lmxlbmd0aDsgaWR4KyspDQotCXsNCi0JCWlmIChpZHggPiB0YXJnZXRQYXRoLmxlbmd0aCkNCi0JCXsNCi0JCQlicmVhazsNCi0JCX0NCi0NCi0JCWlmIChzb3VyY2VBcnJheVtpZHhdICE9IHRhcmdldEFycmF5W2lkeF0pDQotCQl7DQotCQkJYnJlYWs7DQotCQl9DQotCX0NCi0NCi0JLy9hcHBlbmQgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiAuLw0KLQl2YXIgbWF4SWR4ID0gc291cmNlQXJyYXkubGVuZ3RoIC0gMTsNCi0JZm9yICh2YXIgaSA9IGlkeDsgaSA8IG1heElkeDsgaSsrKQ0KLQl7DQotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aCArICIuLyI7DQotDQotCQkvL2FsZXJ0KCJSZWxQYXRoPT4iICsgdGhlUmVsUGF0aCk7DQotCX0NCi0NCi0JLy9hcHBlbmQgYW55IHJlbWFpbmluZyB0YXJnZXQgcGF0aA0KLQl3aGlsZShpZHggPCB0YXJnZXRBcnJheS5sZW5ndGgpDQotCXsNCi0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoICsgdGFyZ2V0QXJyYXlbaWR4KytdICsgIi8iOw0KLQkJLy9hbGVydCgiUmVsUGF0aChmaW5hbCk9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL3JlbW92ZSB0aGUgbGFzdCBwYXRoIHNlcGFyYXRvcg0KLQlpZiAodGhlUmVsUGF0aC5sZW5ndGggPiAwKQ0KLQl7DQotCQkvL2FsZXJ0KCJSZWxQYXRoKFRyaW0xKT0+IiArIHRoZVJlbFBhdGgpOw0KLQkJdGhlUmVsUGF0aCA9IHRoZVJlbFBhdGguc3Vic3RyaW5nKDAsICh0aGVSZWxQYXRoLmxlbmd0aCAtIDEpKTsNCi0JCS8vYWxlcnQoIlJlbFBhdGgoVHJpbTEpPT4iICsgdGhlUmVsUGF0aCk7DQotCX0NCi0NCi0JLy9hbGVydCgiUmV0dXJuIFJlbGF0aXZlIFBhdGggPT4gIiArIHRoZVJlbFBhdGgpOw0KLQ0KLQlyZXR1cm4gdGhlUmVsUGF0aDsNCi19DQotDQotZnVuY3Rpb24gZ2V0VHJlZVBhdGgoKQ0KLXsNCi0JcmV0dXJuIGJ1aWxkVHJlZVBhdGhMb2NhdGlvbigpOw0KLX0NCi0NCi0vL1RoaXMgbWV0aG9kIHdpbGwgcmVtb3ZlIHRoZSB3ZWJzaXRlIGJhc2UgZnJvbSB0aGUgdXJsDQotZnVuY3Rpb24gY2FsY3VsYXRDdXJyZW50UGFnZShjdXJyVVJMKSB7DQotDQotCXZhciB0aGVDdXJyZW50TG9jYXRpb24gPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmOw0KLQkvL3JlcGxhY2UgYWxsICdcJyB3aXRoICcvJw0KLQl0aGVDdXJyZW50TG9jYXRpb24gPSB0aGVDdXJyZW50TG9jYXRpb24ucmVwbGFjZSgvXFwvZywiJDEvJDIiKTsNCi0JY3VyclVSTCA9IGN1cnJVUkwucmVwbGFjZSgvXFwvZywiJDEvJDIiKTsNCi0NCi0JdmFyIHNvdXJjZUFycmF5ID0gdGhlQ3VycmVudExvY2F0aW9uLnNwbGl0KCIvIik7DQotCXZhciBjdXJyQXJyYXkgPSBjdXJyVVJMLnNwbGl0KCIvIik7DQotDQotCXZhciBudW1Ub1JlbW92ZSA9IHNvdXJjZUFycmF5Lmxlbmd0aCAtIDI7DQotCXZhciBpZHggPSAwOw0KLQl2YXIgdGhlUmV0dXJuUGF0aCA9ICIiOw0KLQlmb3IgKGlkeCA9IG51bVRvUmVtb3ZlOyBpZHggPCBjdXJyQXJyYXkubGVuZ3RoOyBpZHgrKykgew0KLQkJaWYgKHRoZVJldHVyblBhdGggIT0gIiIpIHsNCi0JCQl0aGVSZXR1cm5QYXRoID0gdGhlUmV0dXJuUGF0aCArICIvIjsNCi0JCX0NCi0JCXRoZVJldHVyblBhdGggPSB0aGVSZXR1cm5QYXRoICsgY3VyckFycmF5W2lkeF07DQotCX0NCi0NCi0JLy9hbGVydCgiQXJyYXlUZXN0PT4iICsgY3VyclVSTCArICIsIiArIHRoZVJldHVyblBhdGgpOw0KLQlyZXR1cm4gdGhlUmV0dXJuUGF0aDsNCi19DQotDQotLy9idWlsZHMgdHJlZSBwYXRoDQotZnVuY3Rpb24gYnVpbGRUcmVlUGF0aExvY2F0aW9uKCkNCi17DQotCXZhciB0aGVEZWxpbWl0ZXIgPSAiIyMqIjsNCi0JdmFyIHRoaXNQYWdlID0gImFwcGxldC9ydXBfdG9wbmF2Lmh0bSI7DQotCXZhciB0aGVMb2MgPSAiIjsNCi0NCi0NCi0NCi0JaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotCXsNCi0JCXZhciB0aGVDdXJyZW50TG9jYXRpb24gPSBwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5sb2NhdGlvbi5ocmVmOw0KLQkJdGhpc1BhZ2UgPSBjYWxjdWxhdEN1cnJlbnRQYWdlKHRoZUN1cnJlbnRMb2NhdGlvbik7DQotDQotCQkvL2FsZXJ0KCJQYXRoTmFtZToiICsgdGhpc1BhZ2UpOw0KLQ0KLQkJLy9hbGVydCgiVHJ5aW5nIHRvIGZpbmQgdGhlIHBhdGggZm9yID0+IiArIHRoZUN1cnJlbnRMb2NhdGlvbik7DQotDQotCQl2YXIgdGhlUGF0aCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5nZXRUcmVlUGF0aEFycmF5KHRoZUN1cnJlbnRMb2NhdGlvbik7DQotDQotCQkvL2FsZXJ0KCJUaGUgVHJlZSBQYXRoOiAiICsgdGhlUGF0aCk7DQotDQotCQl0aGVQYXRoU3RyaW5nID0gdGhlUGF0aCArICIiOw0KLSAgICAJCWFycmF5RnJvbVN0cmluZyA9IHRoZVBhdGhTdHJpbmcuc3BsaXQodGhlRGVsaW1pdGVyKTsNCi0NCi0JCS8vYnVpbGQgdGhlIHBhdGggZnJvbSB0aGUgYXJyYXkNCi0JCS8vcGFyYW0gMSA9IHBhdGggdG8gaWNvbiwgcGFyYW0gMiAtIGxhYmVsLCBwYXJhbSAzIC0gcGF0aCB0byBmaWxlDQotCQl2YXIgY291bnRlciA9IDA7DQotCQl2YXIgdGhlTGFiZWw7DQotCQl2YXIgdGhlUmVsUGF0aDsNCi0JCWlmIChhcnJheUZyb21TdHJpbmcubGVuZ3RoID4gMikNCi0JCXsNCi0JCSAgIHRoZUxvYyA9ICIiOw0KLQkJICAgZm9yKHZhciBpID0gMDsgaSA8IChhcnJheUZyb21TdHJpbmcubGVuZ3RoIC0gMSkgOyBpKyspDQotCQkgICB7DQotCQkJLy9pdCdzIHRoZSBpY29uIHBhdGgNCi0JCQlpZiAoY291bnRlciA8IDIpDQotCQkJew0KLQkJCQlpZiAoY291bnRlciA+IDApDQotCQkJCXsNCi0JCQkJCXRoZUxvYyA9IHRoZUxvYyArICIgJmd0OyAiOw0KLQkJCQl9DQotDQotCQkJCS8vYWxlcnQoIkNhbGN1bGF0aW5nIHBhdGggZnJvbSgxKSAiICsgdGhpc1BhZ2UgKyAiID0+ICIgKyBhcnJheUZyb21TdHJpbmdbaV0pOw0KLQ0KLQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldLmluZGV4T2YoIlxcIikgPT0gLTEgJiYgYXJyYXlGcm9tU3RyaW5nW2ldLmluZGV4T2YoIi8iKSA9PSAtMSkNCi0JCQkJew0KLQkJCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXSAhPSAibnVsbCIpDQotCQkJCQl7DQotCQkJCQkJdGhlUmVsUGF0aCA9ICJhcHBsZXQvaW1hZ2VzLyIgKyBhcnJheUZyb21TdHJpbmdbaV07DQotCQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgdGhlUmVsUGF0aCk7DQotCQkJCQl9DQotCQkJCQkvL2FsZXJ0KCJNb2RpZnlpbmcgUGF0aCA9PiAiICsgdGhlUmVsUGF0aCk7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCBhcnJheUZyb21TdHJpbmdbaV0pOw0KLQkJCQl9DQotDQotCQkJCWlmICh0aGVSZWxQYXRoICE9ICJudWxsIikNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCQkgIjxpbWcgYm9yZGVyPTAgc3JjPVwiIiArDQotCQkJCQkJIHRoZVJlbFBhdGggICsNCi0JCQkJCQkgIlwiPiI7DQotCQkJCX0NCi0NCi0JCQkJLy9hbGVydCgidGhlIGN1cnIgcGF0aD0+IiArIHRoZUxvYyk7DQotCQkJCWNvdW50ZXIgPSAyOw0KLQkJCX0NCi0JCQkvLyBpdCdzIHRoZSBsYWJlbA0KLQkJCWVsc2UgaWYgKGNvdW50ZXIgPT0gMikNCi0JCQl7DQotCQkJCXRoZUxhYmVsID0gYXJyYXlGcm9tU3RyaW5nW2ldOw0KLQkJCQljb3VudGVyID0gMzsNCi0JCQl9DQotCQkJZWxzZSBpZiAoY291bnRlciA9PSAzKQ0KLQkJCXsNCi0JCQkJLy9hbGVydCgiQ2FsY3VsYXRpbmcgcGF0aCBmcm9tKDMpICIgKyB0aGlzUGFnZSArICIgPT4gIiArIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0gIT0gIm51bGwiKQ0KLQkJCQl7DQotCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCBhcnJheUZyb21TdHJpbmdbaV0pOw0KLQkJCQkJaWYgKHRoZVJlbFBhdGggIT0gIiIpIHsNCi0JCQkJCQl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJIAkJIjxhIGNsYXNzPVwiaG90dGV4dFwiIHRhcmdldD1cIm9yeV9kb2NcIiBocmVmPVwiIiArDQotCQkJCQkJCSB0aGVSZWxQYXRoICsNCi0JCQkJCSAJCSJcIj4iICsNCi0JCQkJCSAJCXRoZUxhYmVsICsNCi0JCQkJCSAJCSI8XC9hPlxuIjsNCi0JCQkJCSB9DQotCQkJCQkgZWxzZSB7DQotCQkJCQkgCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkgCQkiPGEgY2xhc3M9XCJob3R0ZXh0XCI+IiAgKw0KLQkJCQkJIAkJdGhlTGFiZWwgKw0KLQkJCQkJIAkJIjxcL2E+XG4iOw0KLQkJCQkJIH0NCi0JCQkJfQ0KLQkJCQllbHNlDQotCQkJCXsNCi0JCQkJCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkgCSI8YSBjbGFzcz1cImhvdHRleHRcIj4iICArDQotCQkJCQkgCXRoZUxhYmVsICsNCi0JCQkJCSAJIjxcL2E+XG4iOw0KLQkJCQl9DQotCQkJCS8vYWxlcnQoInRoZSBjdXJyIHBhdGg9PiIgKyB0aGVMb2MpOw0KLQkJCQljb3VudGVyID0gMTsNCi0JCQkJdGhlUmVsUGF0aCA9ICJudWxsIjsNCi0JCQkJdGhlTGFiZWwgPSAibnVsbCI7DQotCQkJfQ0KLQkJICAgfQ0KLQ0KLQkJLy9hbGVydCgiRmluaXNoZWQgQnVpbGRpbmcgPT4gIiArIHRoZUxvYyk7DQotCQl9DQotDQotCX0NCi0NCi0JLy90aGVMb2MgPSAiQ3VycmVudCBMb2NhdGlvbiZuYnNwOyYjMDQ1OyZuYnNwOyIgKyB0aGVMb2M7DQotDQotCS8vYWxlcnQoInRoZSBGaW5hbCBTdHJpbmc9PiIgKyB0aGVMb2MpOw0KLQ0KLQkvL2RvY3VtZW50LndyaXRlKHRoZUxvYyk7DQotCXJldHVybiB0aGVMb2M7DQotDQotfQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXZfamEuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3NjcmlwdHMvdG9wbmF2X2phLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmJmZjg3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXZfamEuanMKKysrIC9kZXYvbnVsbApAQCAtMSw3ODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0vLyANCi0vLyBDb250cmlidXRvcnM6DQotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLy8gbWVzc2FnZXMgdG8gYmUgZXh0ZXJuaXplZA0KLS8vIGhlcmUgZGVmaW5lcyBhbGwgdGhlIEkxOE4gc3BlY2lmaWMgbWVzc2FnZXMgdXNlZCBpbiB0aGUgamF2YXNjcmlwdHMNCi0NCi12YXIgdG9wbmF2X2pzX01FU1NBR0UxID0gIlRyZWVCcm93c2Ug44Gu44Ot44O844OJ44Gv5a6M5LqG44GX44Gm44GE44G+44Gb44KT44CCXG7jgYrlvoXjgaHjgY/jgaDjgZXjgYTjgIIiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTIgPSAi44GT44Gu44Oa44O844K444GrICd7MH0nIOODmuODvOOCuOOBr+OBguOCiuOBvuOBm+OCk+OAglxu5Yil44Gu44OK44OT44Ky44O844K344On44Oz44O744Oc44K/44Oz44KS44GK6Kmm44GX44GP44Gg44GV44GE44CCICI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMyA9ICJ7MH0g44Oa44O844K444Gv44GC44KK44G+44Gb44KT44CCIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0VfcHJldiA9ICLliY3jgbgiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV9uZXh0ID0gIuasoeOBuCI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3VwID0gIuS4iuOBuCI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFNCA9ICLjg4Tjg6rjg7zjg7vjg5bjg6njgqbjgrbjg7zjgavnj77ooYzjg5XjgqHjgqTjg6vjgYzjgYLjgorjgb7jgZvjgpPjgIIgIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0U1ID0gIuWFrOmWi+OBleOCjOOBn+OCteOCpOODiOOBr+ODleODrOODvOODoOOCkuS9v+eUqOOBl+OBpuaXouOBq+ihqOekuuOBleOCjOOBpuOBhOOBvuOBmSAiOw0KLQ0KLWZ1bmN0aW9uIGZvcm1hdFN0cmluZyhtZXNzYWdlLCByZXBsYWNlMCkNCi17DQotICAgCXJldHVybiBtZXNzYWdlLnJlcGxhY2UoL1x7MFx9LywgcmVwbGFjZTApOw0KLX0gDQotDQotLy8gdGhpcyBzY3JpcHQgaXMgZm9yIHRoZSB0b3BuYXYuaHRtbA0KLS8vIHRoaXMgaXMgTk9UIGZvciBnZW5lcmFsIHVzZQ0KLU1TRlBob3ZlciA9DQotKCgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk5ldHNjYXBlIikgJiYNCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gMyApKSB8fA0KLSAgKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIikgJiYNCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gNCApKSk7DQotDQotICBmdW5jdGlvbiBNU0ZQcHJlbG9hZChpbWcpDQotICB7DQotICAgICB2YXIgYT1uZXcgSW1hZ2UoKTsNCi0gICAgIGEuc3JjPWltZzsNCi0gICAgIHJldHVybiBhOw0KLSAgfQ0KLSAgDQotdmFyIHRvdXIgPSAwOw0KLQ0KLWZ1bmN0aW9uIG9wZW5GaXJzdFRvdXIgKCkNCi0vLyBvcGVuIHRoZSBndWlkZWQgdG91ciAvaGFha2FuIDk5MDMyNA0KLXsNCi1pZighdG91ciB8fCB0b3VyPT1udWxsIHx8IHRvdXIuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgdG91ciA9IG9wZW4oIi4vdG91ci90b3VyLmh0bSIsInRvdXJfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zNTAsaGVpZ2h0PTcwMCxyZXNpemFibGU9eWVzIik7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBvcGVuVG91ciAoKQ0KLS8vIG9wZW4gdGhlIGd1aWRlZCB0b3VyIC9oYWFrYW4gOTkwMzI0DQotew0KLWlmKCF0b3VyIHx8IHRvdXI9PW51bGwgfHwgdG91ci5jbG9zZWQpDQotICAgIHsNCi0gICAgICB0b3VyID0gb3BlbigiLi90b3VyL3RvdXIuaHRtIiwidG91cl9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM1MCxoZWlnaHQ9NzAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLS8vQWRkaXRpb24gYnkgQ2hpbmggVm8gMDMvMjgvMDANCi0gZnVuY3Rpb24gZGlzcGxheUdldHRpbmdTdGFydGVkKCkNCi0gew0KLSAJdmFyIHBhZ2VQYXR0ZXJuID0gL292dV9wcm9jLzsNCi0gCXZhciBtYWluUGFnZSA9IHdpbmRvdy5wYXJlbnQub3J5X2RvYy5sb2NhdGlvbjsNCi0NCi0gCWlmICggcGFnZVBhdHRlcm4udGVzdCggbWFpblBhZ2UgKSApIHsNCi0gICAgCWlmIChnZXRDb29raWUoIlJVUCIpICE9ICJjaGVja2VkIikgeyBvcGVuRmlyc3RUb3VyKCk7IH0NCi0JfQ0KLQllbHNlIHsNCi0JCXNldFRpbWVvdXQoICJkaXNwbGF5R2V0dGluZ1N0YXJ0ZWQoKSIsIDEwMDAgKTsNCi0JfQ0KLX0NCi0NCi1mdW5jdGlvbiBnZXRDb29raWUgKG5hbWUpDQotew0KLSAgdmFyIGRjb29raWUgPSBkb2N1bWVudC5jb29raWU7DQotICB2YXIgY25hbWUgPSBuYW1lICsgIj0iOw0KLSAgdmFyIGNsZW4gPSBkY29va2llLmxlbmd0aDsNCi0gIHZhciBjYmVnaW4gPSAwOw0KLSAgd2hpbGUgKGNiZWdpbiA8IGNsZW4pDQotICB7DQotICAgIHZhciB2YmVnaW4gPSBjYmVnaW4gKyBjbmFtZS5sZW5ndGg7DQotICAgIGlmIChkY29va2llLnN1YnN0cmluZyhjYmVnaW4sIHZiZWdpbikgPT0gY25hbWUpDQotICAgIHsNCi0gICAgICB2YXIgdmVuZCA9IGRjb29raWUuaW5kZXhPZiAoIjsiLCB2YmVnaW4pOw0KLSAgICAgIGlmICh2ZW5kID09IC0xKQ0KLSAgICAgIHsNCi0gICAgICAgIHZlbmQgPSBjbGVuOw0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gdW5lc2NhcGUoZGNvb2tpZS5zdWJzdHJpbmcodmJlZ2luLCB2ZW5kKSk7DQotICAgIH0NCi0gICAgY2JlZ2luID0gZGNvb2tpZS5pbmRleE9mKCIgIiwgY2JlZ2luKSArIDE7DQotICAgIGlmIChjYmVnaW4gPT0gMCkNCi0gICAgew0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICB9DQotICByZXR1cm4gbnVsbDsNCi0gfQ0KLQ0KLQ0KLSAgdmFyIGluZGV4PW51bGw7DQotICB2YXIgdG91cj1udWxsOw0KLSAgdmFyIHNlYXJjaD1udWxsOw0KLSAgdmFyIGdsb3NzYXJ5PW51bGw7DQotICB2YXIgZmVlZGJhY2s9bnVsbDsNCi0gIHZhciB0cmVlTG9hZGVkPWZhbHNlOw0KLSAgZnVuY3Rpb24gY2hlY2tUcmVlTG9hZGVkKCkNCi0gIHsNCi0gICAgaWYodHJlZUxvYWRlZCkNCi0gICAgew0KLSAgICAgIHJldHVybiB0cmVlTG9hZGVkOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICBpZihwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQgIT0gbnVsbA0KLSAgICAgICAgJiYgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHkoKSkNCi0gICAgIHsNCi0gICAgICAgdHJlZUxvYWRlZCA9IHRydWU7DQotICAgICB9DQotICAgICAqLw0KLSAgICAgaWYocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0ICE9IG51bGwpDQotICAgICB7DQotICAgICAgCXZhciBtZXRob2QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHk7DQotCSBpZiAobWV0aG9kICE9ICJ1bmRlZmluZWQiKSB7DQotCQlpZiAocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHkoKSkNCi0JCXsNCi0gICAgICAgCQkJdHJlZUxvYWRlZCA9IHRydWU7DQotCQl9DQotDQotCSAgfQ0KLQ0KLSAgICAgfQ0KLQ0KLSAgICAgcmV0dXJuIHRyZWVMb2FkZWQ7DQotICAgfQ0KLQ0KLQ0KLSAgICBmdW5jdGlvbiBzaG93QWxlcnROb3RMb2FkZWQoKQ0KLSAgICB7DQotICAgICAgYWxlcnQodG9wbmF2X2pzX01FU1NBR0UxKTsNCi0gICAgfQ0KLQ0KLWZ1bmN0aW9uIHNob3dTdGF0dXNOb3RMb2FkZWQoKQ0KLSAgew0KLSAgICAvL3JldHVybiAiVGhlIFRyZWVCcm93c2UgaXMgbm90IHlldCBsb2FkZWQhXG5QbGVhc2Ugd2FpdCEiOw0KLSAgICByZXR1cm4gdG9wbmF2X2pzX01FU1NBR0UxOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd0FsZXJ0Tm9QYWdlKHRleHQpDQotICB7DQotICAgICB2YXIgcGFyZW50TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKHBhcmVudExhYmVsIT0iIiAmJiBwYXJlbnRMYWJlbCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgICAgLy9hbGVydCgiVGhlcmUgaXMgbm8gJyIgKyB0ZXh0ICsgIicgcGFnZSBmb3IgdGhpcyBwYWdlLlxuVHJ5IG9uZSBvZiB0aGUgb3RoZXIgbmF2aWdhdGlvbiBidXR0b25zLiIpOw0KLSAgICAgICAgICBhbGVydChmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UyLCB0ZXh0KSk7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICAgLy9hbGVydCgiVGhlcmUgaXMgbm8gJyIgKyB0ZXh0ICsgIicgcGFnZSBmb3IgdGhpcyBwYWdlLlxuVHJ5IG9uZSBvZiB0aGUgb3RoZXIgbmF2aWdhdGlvbiBidXR0b25zIik7DQotICAgICAgICAgYWxlcnQoZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMiwgdGV4dCkpOw0KLSAgICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1N0YXR1c05vUGFnZSh0ZXh0KQ0KLSAgew0KLQ0KLSAgICAgdmFyIHBhcmVudExhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbXNnOw0KLSAgICAgaWYocGFyZW50TGFiZWwhPSIiICYmIHBhcmVudExhYmVsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICAgLy9tc2cgPSAiVGhlcmUgaXMgbm8gIiArIHRleHQgKyAiIHBhZ2UhIjsNCi0gICAgICAgIG1zZyA9IGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTMsIHRleHQpOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgLy9tc2cgPSAiVGhlcmUgaXMgbm8gIiArIHRleHQgKyAiIHBhZ2UhIjsNCi0gICAgICAgIG1zZyA9IGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTMsIHRleHQpOw0KLSAgICAgfQ0KLQ0KLSAgICAgcmV0dXJuIG1zZzsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dQYXJlbnRMYWJlbCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgdmFyIHBhcmVudHVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKGxhYmVsIT0iIiAmJiBsYWJlbCE9bnVsbCAmJiBwYXJlbnR1cmwhPSIiICYmIHBhcmVudHVybCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm9QYWdlKCJ1cCIpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm90TG9hZGVkKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dIb21lTGFiZWwoKQ0KLSAgew0KLSAgICBzZWxmLnN0YXR1cyA9ICLjg5vjg7zjg6AiOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1ByZXZpb3VzTGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c0xhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgdmFyIHByZXZ1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKGxhYmVsIT0iIiAmJiBsYWJlbCE9bnVsbCAmJiBwcmV2dXJsIT0iIiAmJiBwcmV2dXJsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm9QYWdlKCJwcmV2aW91cyIpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm90TG9hZGVkKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dOZXh0TGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgbmV4dHVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIG5leHR1cmwhPSIiICYmIG5leHR1cmwhPW51bGwpDQotICAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsNCi0gICAgICB9DQotICAgICAgZWxzZQ0KLSAgICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb1BhZ2UoIm5leHQiKTsNCi0gICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZFByZXZpb3VzKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c0xhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0NCi0JaWYgKChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKT09LTEpICYmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKT09LTEpKQ0KLQl7DQotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpIT0tMSkNCi0Jew0KLQkgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRBcHBsZXRQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCk7DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQ0KLQl7DQotCQluZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRIdHRwUGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwsICJQcmV2aW91cyIpOw0KLQl9DQotCSAgICAgIAlwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV9wcmV2KTsNCi0gICAgIH0NCi0gICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZE5leHQoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0NCi0JaWYgKChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKT09LTEpICYmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKT09LTEpKQ0KLQl7DQotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpIT0tMSkNCi0Jew0KLQkgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRBcHBsZXRQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCk7DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQ0KLQl7DQotCQluZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRIdHRwUGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwsICJOZXh0Iik7DQotCX0NCi0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLQ0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX25leHQpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotDQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkUGFyZW50KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfdXApOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLWZ1bmN0aW9uIHdoZXJlQW1JKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0JdmFyIHN0YXR1cyA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgIAlpZiggc3RhdHVzID09IGZhbHNlICkNCi0Jew0KLQkJYWxlcnQoIHRvcG5hdl9qc19NRVNTQUdFNCApOw0KLQl9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHVwQXJyb3coKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS51cEFycm93KCk7DQotICAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGRvd25BcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmRvd25BcnJvdygpOw0KLSAgICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgICB7DQotICAgICAgIHBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotICAgICAgfQ0KLQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICAgIGZ1bmN0aW9uIGxlZnRBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUubGVmdEFycm93KCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gICAgZnVuY3Rpb24gcmlnaHRBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUucmlnaHRBcnJvdygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotDQotZnVuY3Rpb24gbG9hZFRvcCgpDQotew0KLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIpDQotICB7DQotICAgICBhbGVydCh0b3BuYXZfanNfTUVTU0FHRTUpOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICB2YXIgZXhwaXJlcyA9IG5ldyBEYXRlKCk7DQotICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7DQotICAgIGRvY3VtZW50LmNvb2tpZSA9ICJydXBfb3J5X2RvYz0iICsgZXNjYXBlIChkb2N1bWVudC5VUkwpICsNCi0gICAgIjsgZXhwaXJlcz0iICsgZXhwaXJlcy50b1VUQ1N0cmluZygpICsgICI7IHBhdGg9LyI7DQotDQotICAgIHZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOw0KLQ0KLSAgICBmb3IoaT1kb2N1bWVudC5saW5rcy5sZW5ndGgtMTtpPj0wO2ktLSkNCi0gICAgew0KLSAgICAgICBpZihkb2N1bWVudC5saW5rc1tpXS5ocmVmLmluZGV4T2YoImluZGV4Lmh0bSIpIT0tMSkNCi0gICAgICAgew0KLSAgICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IGRvY3VtZW50LmxpbmtzW2ldLmhyZWY7DQotICAgICAgICAgYnJlYWs7DQotICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpDQotICAgIHsNCi0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQ0KLQl7DQotCQl3aW5kb3cuY2xvc2UoKTsNCi0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JICAgICAgIAl0b3AubG9jYXRpb24gPSBuZXdfb3J5X2RvY19sb2M7DQotCX0NCi0gICAgfQ0KLSAgIH0NCi19DQotDQotDQotZnVuY3Rpb24gb3Blbk9yeSAocGFnZSwgdGFyZ2V0KQ0KLXsNCi0gICAgaWYoIWluZGV4IHx8IGluZGV4LmNsb3NlZCkNCi0gICAgew0KLSAgICAgIGluZGV4ID0gb3BlbihwYWdlLHRhcmdldCwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM5NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBpbmRleC5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5TZWFyY2goKQ0KLXsNCi0gICAgaWYoIXNlYXJjaCB8fCBzZWFyY2guY2xvc2VkKQ0KLSAgICB7DQotICAgICAgc2VhcmNoID0gb3BlbigiLi9hcHBsZXQvc2VhcmNoLmh0bSIsInNlYXJjaF9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9bm8sd2lkdGg9NjMwLGhlaWdodD00NTAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNlYXJjaC5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5JbmRleCgpDQotew0KLSAgIG9wZW5PcnkoIi4vaW5kZXgvaW5kZXguaHRtIiwiaW5kZXhfd2luIik7DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5HbG9zc2FyeSgpDQotew0KLSBpZighZ2xvc3NhcnkgfHwgZ2xvc3NhcnkuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgZ2xvc3NhcnkgPSBvcGVuKCIuL3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXguaHRtIiwiZ2xvc3Nhcnlfd2luIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM4NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBnbG9zc2FyeS5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIHByaW50UGFnZSgpDQotew0KLSBwYXJlbnQub3J5X2RvYy5mb2N1cygpOw0KLSBwYXJlbnQub3J5X2RvYy5wcmludCgpOw0KLX0NCi0NCi0NCi1mdW5jdGlvbiBzZW5kRmVlZGJhY2sodXJsKQ0KLXsNCi0JaWYgKCB1cmwgPT0gbnVsbCB8fCB1cmwgPT0gJycgKQ0KLQl7DQotCQlyZXR1cm47DQotCX0NCi0JDQotCWlmICggdXJsLmluZGV4T2YoIm1haWx0bzoiKSA+PSAwICkNCi0Jew0KLQkJc2VuZG1haWwodXJsKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCQ0KLSAJICAgIGlmKCFmZWVkYmFjayB8fCBmZWVkYmFjay5jbG9zZWQpDQotCSAgICB7DQotCSAgICAgIGZlZWRiYWNrID0gb3Blbih1cmwsImZlZWRiYWNrX3dpbiIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD02MDAsaGVpZ2h0PTUwMCxyZXNpemFibGU9eWVzIik7DQotCSAgICB9DQotCSAgICBlbHNlDQotCSAgICB7DQotCSAgICAgIGZlZWRiYWNrLmZvY3VzKCk7DQotCSAgICB9DQotICAgIAl9DQotICAgIAkNCi19DQotDQotDQotZnVuY3Rpb24gc2VuZG1haWwodXJsKQ0KLXsNCi0JaWYgKCB1cmwuaW5kZXhPZigiP3N1YmplY3QiKSA9PSAtMSApDQotCXsNCi0JCXZhciBsaW5rPXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uOw0KLQkJdXJsID0gdXJsICsgJz9zdWJqZWN0PUZlZWRiYWNrOiAtICcrbGluazsNCi0JfQ0KLQlsb2NhdGlvbi5yZXBsYWNlKHVybCk7DQotfQ0KLQ0KLS8vY2FsY3VsYXRlcyByZWxhdGl2ZSBwYXRoDQotLy9wYXRoIG11c3QgYmUgYWxsIHJlbGF0aXZlIGZyb20gd2Vic2l0ZSBiYXNlIG9yIGNvbnRhaW4gZnVsbCB1cmxzDQotZnVuY3Rpb24gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHNvdXJjZVBhdGgsIHRhcmdldFBhdGgpDQotew0KLQlpZiAodGFyZ2V0UGF0aC5pbmRleE9mKCJodHRwOi8iKSAhPSAtMSkNCi0Jew0KLQkJcmV0dXJuIHRhcmdldFBhdGg7DQotCX0NCi0NCi0JLy9yZXBsYWNlIGFsbCAnXCcgd2l0aCAnLycNCi0Jc291cmNlUGF0aCA9IHNvdXJjZVBhdGgucmVwbGFjZSgvXFwvZywiJDEvJDIiKTsNCi0JdGFyZ2V0UGF0aCA9IHRhcmdldFBhdGgucmVwbGFjZSgvXFwvZywiLyIpOw0KLQ0KLQkvL2FsZXJ0KCJSZXBsYWNlKFNvdXJjZSk9PiIgKyBzb3VyY2VQYXRoKTsNCi0JLy9hbGVydCgiUmVwbGFjZSh0YXJnZXQpPT4iICsgdGFyZ2V0UGF0aCk7DQotDQotDQotCXNvdXJjZUFycmF5ID0gc291cmNlUGF0aC5zcGxpdCgiLyIpOw0KLQl0YXJnZXRBcnJheSA9IHRhcmdldFBhdGguc3BsaXQoIi8iKTsNCi0NCi0JdmFyIHRoZVJlbFBhdGggPSAiIjsNCi0NCi0JLy9sb29wIHVudGlsIHdlIGZpbmQgYSBkaWZmZXJlbmNlDQotCXZhciBpZHggPSAwOw0KLQlmb3IoaWR4ID0gMDsgaWR4IDwgc291cmNlQXJyYXkubGVuZ3RoOyBpZHgrKykNCi0Jew0KLQkJaWYgKGlkeCA+IHRhcmdldFBhdGgubGVuZ3RoKQ0KLQkJew0KLQkJCWJyZWFrOw0KLQkJfQ0KLQ0KLQkJaWYgKHNvdXJjZUFycmF5W2lkeF0gIT0gdGFyZ2V0QXJyYXlbaWR4XSkNCi0JCXsNCi0JCQlicmVhazsNCi0JCX0NCi0JfQ0KLQ0KLQkvL2FwcGVuZCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIC4vDQotCXZhciBtYXhJZHggPSBzb3VyY2VBcnJheS5sZW5ndGggLSAxOw0KLQlmb3IgKHZhciBpID0gaWR4OyBpIDwgbWF4SWR4OyBpKyspDQotCXsNCi0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoICsgIi4vIjsNCi0NCi0JCS8vYWxlcnQoIlJlbFBhdGg9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL2FwcGVuZCBhbnkgcmVtYWluaW5nIHRhcmdldCBwYXRoDQotCXdoaWxlKGlkeCA8IHRhcmdldEFycmF5Lmxlbmd0aCkNCi0Jew0KLQkJdGhlUmVsUGF0aCA9IHRoZVJlbFBhdGggKyB0YXJnZXRBcnJheVtpZHgrK10gKyAiLyI7DQotCQkvL2FsZXJ0KCJSZWxQYXRoKGZpbmFsKT0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vcmVtb3ZlIHRoZSBsYXN0IHBhdGggc2VwYXJhdG9yDQotCWlmICh0aGVSZWxQYXRoLmxlbmd0aCA+IDApDQotCXsNCi0JCS8vYWxlcnQoIlJlbFBhdGgoVHJpbTEpPT4iICsgdGhlUmVsUGF0aCk7DQotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aC5zdWJzdHJpbmcoMCwgKHRoZVJlbFBhdGgubGVuZ3RoIC0gMSkpOw0KLQkJLy9hbGVydCgiUmVsUGF0aChUcmltMSk9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL2FsZXJ0KCJSZXR1cm4gUmVsYXRpdmUgUGF0aCA9PiAiICsgdGhlUmVsUGF0aCk7DQotDQotCXJldHVybiB0aGVSZWxQYXRoOw0KLX0NCi0NCi1mdW5jdGlvbiBnZXRUcmVlUGF0aCgpDQotew0KLQlyZXR1cm4gYnVpbGRUcmVlUGF0aExvY2F0aW9uKCk7DQotfQ0KLQ0KLS8vVGhpcyBtZXRob2Qgd2lsbCByZW1vdmUgdGhlIHdlYnNpdGUgYmFzZSBmcm9tIHRoZSB1cmwNCi1mdW5jdGlvbiBjYWxjdWxhdEN1cnJlbnRQYWdlKGN1cnJVUkwpIHsNCi0NCi0JdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7DQotCS8vcmVwbGFjZSBhbGwgJ1wnIHdpdGggJy8nDQotCXRoZUN1cnJlbnRMb2NhdGlvbiA9IHRoZUN1cnJlbnRMb2NhdGlvbi5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQljdXJyVVJMID0gY3VyclVSTC5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQ0KLQl2YXIgc291cmNlQXJyYXkgPSB0aGVDdXJyZW50TG9jYXRpb24uc3BsaXQoIi8iKTsNCi0JdmFyIGN1cnJBcnJheSA9IGN1cnJVUkwuc3BsaXQoIi8iKTsNCi0NCi0JdmFyIG51bVRvUmVtb3ZlID0gc291cmNlQXJyYXkubGVuZ3RoIC0gMjsNCi0JdmFyIGlkeCA9IDA7DQotCXZhciB0aGVSZXR1cm5QYXRoID0gIiI7DQotCWZvciAoaWR4ID0gbnVtVG9SZW1vdmU7IGlkeCA8IGN1cnJBcnJheS5sZW5ndGg7IGlkeCsrKSB7DQotCQlpZiAodGhlUmV0dXJuUGF0aCAhPSAiIikgew0KLQkJCXRoZVJldHVyblBhdGggPSB0aGVSZXR1cm5QYXRoICsgIi8iOw0KLQkJfQ0KLQkJdGhlUmV0dXJuUGF0aCA9IHRoZVJldHVyblBhdGggKyBjdXJyQXJyYXlbaWR4XTsNCi0JfQ0KLQ0KLQkvL2FsZXJ0KCJBcnJheVRlc3Q9PiIgKyBjdXJyVVJMICsgIiwiICsgdGhlUmV0dXJuUGF0aCk7DQotCXJldHVybiB0aGVSZXR1cm5QYXRoOw0KLX0NCi0NCi0vL2J1aWxkcyB0cmVlIHBhdGgNCi1mdW5jdGlvbiBidWlsZFRyZWVQYXRoTG9jYXRpb24oKQ0KLXsNCi0JdmFyIHRoZURlbGltaXRlciA9ICIjIyoiOw0KLQl2YXIgdGhpc1BhZ2UgPSAiYXBwbGV0L3J1cF90b3BuYXYuaHRtIjsNCi0JdmFyIHRoZUxvYyA9ICIiOw0KLQ0KLQ0KLQ0KLQlpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0Jew0KLQkJdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY7DQotCQl0aGlzUGFnZSA9IGNhbGN1bGF0Q3VycmVudFBhZ2UodGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCS8vYWxlcnQoIlBhdGhOYW1lOiIgKyB0aGlzUGFnZSk7DQotDQotCQkvL2FsZXJ0KCJUcnlpbmcgdG8gZmluZCB0aGUgcGF0aCBmb3IgPT4iICsgdGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCXZhciB0aGVQYXRoID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmdldFRyZWVQYXRoQXJyYXkodGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCS8vYWxlcnQoIlRoZSBUcmVlIFBhdGg6ICIgKyB0aGVQYXRoKTsNCi0NCi0JCXRoZVBhdGhTdHJpbmcgPSB0aGVQYXRoICsgIiI7DQotICAgIAkJYXJyYXlGcm9tU3RyaW5nID0gdGhlUGF0aFN0cmluZy5zcGxpdCh0aGVEZWxpbWl0ZXIpOw0KLQ0KLQkJLy9idWlsZCB0aGUgcGF0aCBmcm9tIHRoZSBhcnJheQ0KLQkJLy9wYXJhbSAxID0gcGF0aCB0byBpY29uLCBwYXJhbSAyIC0gbGFiZWwsIHBhcmFtIDMgLSBwYXRoIHRvIGZpbGUNCi0JCXZhciBjb3VudGVyID0gMDsNCi0JCXZhciB0aGVMYWJlbDsNCi0JCXZhciB0aGVSZWxQYXRoOw0KLQkJaWYgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggPiAyKQ0KLQkJew0KLQkJICAgdGhlTG9jID0gIiI7DQotCQkgICBmb3IodmFyIGkgPSAwOyBpIDwgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggLSAxKSA7IGkrKykNCi0JCSAgIHsNCi0JCQkvL2l0J3MgdGhlIGljb24gcGF0aA0KLQkJCWlmIChjb3VudGVyIDwgMikNCi0JCQl7DQotCQkJCWlmIChjb3VudGVyID4gMCkNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsgIiAmZ3Q7ICI7DQotCQkJCX0NCi0NCi0JCQkJLy9hbGVydCgiQ2FsY3VsYXRpbmcgcGF0aCBmcm9tKDEpICIgKyB0aGlzUGFnZSArICIgPT4gIiArIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotDQotCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiXFwiKSA9PSAtMSAmJiBhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiLyIpID09IC0xKQ0KLQkJCQl7DQotCQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldICE9ICJudWxsIikNCi0JCQkJCXsNCi0JCQkJCQl0aGVSZWxQYXRoID0gImFwcGxldC9pbWFnZXMvIiArIGFycmF5RnJvbVN0cmluZ1tpXTsNCi0JCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCB0aGVSZWxQYXRoKTsNCi0JCQkJCX0NCi0JCQkJCS8vYWxlcnQoIk1vZGlmeWluZyBQYXRoID0+ICIgKyB0aGVSZWxQYXRoKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCX0NCi0NCi0JCQkJaWYgKHRoZVJlbFBhdGggIT0gIm51bGwiKQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJCSAiPGltZyBib3JkZXI9MCBzcmM9XCIiICsNCi0JCQkJCQkgdGhlUmVsUGF0aCAgKw0KLQkJCQkJCSAiXCI+IjsNCi0JCQkJfQ0KLQ0KLQkJCQkvL2FsZXJ0KCJ0aGUgY3VyciBwYXRoPT4iICsgdGhlTG9jKTsNCi0JCQkJY291bnRlciA9IDI7DQotCQkJfQ0KLQkJCS8vIGl0J3MgdGhlIGxhYmVsDQotCQkJZWxzZSBpZiAoY291bnRlciA9PSAyKQ0KLQkJCXsNCi0JCQkJdGhlTGFiZWwgPSBhcnJheUZyb21TdHJpbmdbaV07DQotCQkJCWNvdW50ZXIgPSAzOw0KLQkJCX0NCi0JCQllbHNlIGlmIChjb3VudGVyID09IDMpDQotCQkJew0KLQkJCQkvL2FsZXJ0KCJDYWxjdWxhdGluZyBwYXRoIGZyb20oMykgIiArIHRoaXNQYWdlICsgIiA9PiAiICsgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXSAhPSAibnVsbCIpDQotCQkJCXsNCi0JCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCQlpZiAodGhlUmVsUGF0aCAhPSAiIikgew0KLQkJCQkJCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkgCQkiPGEgY2xhc3M9XCJob3R0ZXh0XCIgdGFyZ2V0PVwib3J5X2RvY1wiIGhyZWY9XCIiICsNCi0JCQkJCQkJIHRoZVJlbFBhdGggKw0KLQkJCQkJIAkJIlwiPiIgKw0KLQkJCQkJIAkJdGhlTGFiZWwgKw0KLQkJCQkJIAkJIjxcL2E+XG4iOw0KLQkJCQkJIH0NCi0JCQkJCSBlbHNlIHsNCi0JCQkJCSAJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJCSI8YSBjbGFzcz1cImhvdHRleHRcIj4iICArDQotCQkJCQkgCQl0aGVMYWJlbCArDQotCQkJCQkgCQkiPFwvYT5cbiI7DQotCQkJCQkgfQ0KLQkJCQl9DQotCQkJCWVsc2UNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJIjxhIGNsYXNzPVwiaG90dGV4dFwiPiIgICsNCi0JCQkJCSAJdGhlTGFiZWwgKw0KLQkJCQkJIAkiPFwvYT5cbiI7DQotCQkJCX0NCi0JCQkJLy9hbGVydCgidGhlIGN1cnIgcGF0aD0+IiArIHRoZUxvYyk7DQotCQkJCWNvdW50ZXIgPSAxOw0KLQkJCQl0aGVSZWxQYXRoID0gIm51bGwiOw0KLQkJCQl0aGVMYWJlbCA9ICJudWxsIjsNCi0JCQl9DQotCQkgICB9DQotDQotCQkvL2FsZXJ0KCJGaW5pc2hlZCBCdWlsZGluZyA9PiAiICsgdGhlTG9jKTsNCi0JCX0NCi0NCi0JfQ0KLQ0KLQkvL3RoZUxvYyA9ICJDdXJyZW50IExvY2F0aW9uJm5ic3A7JiMwNDU7Jm5ic3A7IiArIHRoZUxvYzsNCi0NCi0JLy9hbGVydCgidGhlIEZpbmFsIFN0cmluZz0+IiArIHRoZUxvYyk7DQotDQotCS8vZG9jdW1lbnQud3JpdGUodGhlTG9jKTsNCi0JcmV0dXJuIHRoZUxvYzsNCi0NCi19DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl9rby5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXZfa28uanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYjNmYTAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl9rby5qcworKysgL2Rldi9udWxsCkBAIC0xLDc4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBtZXNzYWdlcyB0byBiZSBleHRlcm5pemVkDQotLy8gaGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLQ0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTEgPSAi7Yq466asIOu4jOudvOyasOyggOqwgCDslYTsp4Eg66Gc65Oc65CY7KeAIOyViuyVmOyKteuLiOuLpCFcbuq4sOuLpOumrOyLreyLnOyYpC4iOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTIgPSAi7J20IO2OmOydtOyngOyXkCAnezB9J+ydtCjqsIApIOyXhuyKteuLiOuLpC5cbuuLpOuluCDtg5Dsg4kg64uo7LaU66W8IOyCrOyaqe2VmOyLreyLnOyYpC4iOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTMgPSAiezB9IO2OmOydtOyngOqwgCDsl4bsirXri4jri6QhIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0VfcHJldiA9ICLsnbTsoIQiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV9uZXh0ID0gIuuLpOydjCI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3VwID0gIuychOuhnCI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFNCA9ICLtmITsnqwg7YyM7J287J20IO2KuOumrCDruIzrnbzsmrDsoIDsl5Ag7JeG7Iq164uI64ukLiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFNSA9ICLqs7XqsJzrkJwg7IKs7J207Yq464qUIO2UhOugiOyehOyXkCDsnbTrr7gg7ZGc7Iuc65CY7JeI7Iq164uI64ukLiI7DQotDQotZnVuY3Rpb24gZm9ybWF0U3RyaW5nKG1lc3NhZ2UsIHJlcGxhY2UwKQ0KLXsNCi0gICAJcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgvXHswXH0vLCByZXBsYWNlMCk7DQotfSANCi0NCi0vLyB0aGlzIHNjcmlwdCBpcyBmb3IgdGhlIHRvcG5hdi5odG1sDQotLy8gdGhpcyBpcyBOT1QgZm9yIGdlbmVyYWwgdXNlDQotTVNGUGhvdmVyID0NCi0oKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTmV0c2NhcGUiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSAzICkpIHx8DQotICAoKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpKTsNCi0NCi0gIGZ1bmN0aW9uIE1TRlBwcmVsb2FkKGltZykNCi0gIHsNCi0gICAgIHZhciBhPW5ldyBJbWFnZSgpOw0KLSAgICAgYS5zcmM9aW1nOw0KLSAgICAgcmV0dXJuIGE7DQotICB9DQotICANCi12YXIgdG91ciA9IDA7DQotDQotZnVuY3Rpb24gb3BlbkZpcnN0VG91ciAoKQ0KLS8vIG9wZW4gdGhlIGd1aWRlZCB0b3VyIC9oYWFrYW4gOTkwMzI0DQotew0KLWlmKCF0b3VyIHx8IHRvdXI9PW51bGwgfHwgdG91ci5jbG9zZWQpDQotICAgIHsNCi0gICAgICB0b3VyID0gb3BlbigiLi90b3VyL3RvdXIuaHRtIiwidG91cl9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM1MCxoZWlnaHQ9NzAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5Ub3VyICgpDQotLy8gb3BlbiB0aGUgZ3VpZGVkIHRvdXIgL2hhYWthbiA5OTAzMjQNCi17DQotaWYoIXRvdXIgfHwgdG91cj09bnVsbCB8fCB0b3VyLmNsb3NlZCkNCi0gICAgew0KLSAgICAgIHRvdXIgPSBvcGVuKCIuL3RvdXIvdG91ci5odG0iLCJ0b3VyX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9MzUwLGhlaWdodD03MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotLy9BZGRpdGlvbiBieSBDaGluaCBWbyAwMy8yOC8wMA0KLSBmdW5jdGlvbiBkaXNwbGF5R2V0dGluZ1N0YXJ0ZWQoKQ0KLSB7DQotIAl2YXIgcGFnZVBhdHRlcm4gPSAvb3Z1X3Byb2MvOw0KLSAJdmFyIG1haW5QYWdlID0gd2luZG93LnBhcmVudC5vcnlfZG9jLmxvY2F0aW9uOw0KLQ0KLSAJaWYgKCBwYWdlUGF0dGVybi50ZXN0KCBtYWluUGFnZSApICkgew0KLSAgICAJaWYgKGdldENvb2tpZSgiUlVQIikgIT0gImNoZWNrZWQiKSB7IG9wZW5GaXJzdFRvdXIoKTsgfQ0KLQl9DQotCWVsc2Ugew0KLQkJc2V0VGltZW91dCggImRpc3BsYXlHZXR0aW5nU3RhcnRlZCgpIiwgMTAwMCApOw0KLQl9DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldENvb2tpZSAobmFtZSkNCi17DQotICB2YXIgZGNvb2tpZSA9IGRvY3VtZW50LmNvb2tpZTsNCi0gIHZhciBjbmFtZSA9IG5hbWUgKyAiPSI7DQotICB2YXIgY2xlbiA9IGRjb29raWUubGVuZ3RoOw0KLSAgdmFyIGNiZWdpbiA9IDA7DQotICB3aGlsZSAoY2JlZ2luIDwgY2xlbikNCi0gIHsNCi0gICAgdmFyIHZiZWdpbiA9IGNiZWdpbiArIGNuYW1lLmxlbmd0aDsNCi0gICAgaWYgKGRjb29raWUuc3Vic3RyaW5nKGNiZWdpbiwgdmJlZ2luKSA9PSBjbmFtZSkNCi0gICAgew0KLSAgICAgIHZhciB2ZW5kID0gZGNvb2tpZS5pbmRleE9mICgiOyIsIHZiZWdpbik7DQotICAgICAgaWYgKHZlbmQgPT0gLTEpDQotICAgICAgew0KLSAgICAgICAgdmVuZCA9IGNsZW47DQotICAgICAgfQ0KLSAgICAgIHJldHVybiB1bmVzY2FwZShkY29va2llLnN1YnN0cmluZyh2YmVnaW4sIHZlbmQpKTsNCi0gICAgfQ0KLSAgICBjYmVnaW4gPSBkY29va2llLmluZGV4T2YoIiAiLCBjYmVnaW4pICsgMTsNCi0gICAgaWYgKGNiZWdpbiA9PSAwKQ0KLSAgICB7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0gIH0NCi0gIHJldHVybiBudWxsOw0KLSB9DQotDQotDQotICB2YXIgaW5kZXg9bnVsbDsNCi0gIHZhciB0b3VyPW51bGw7DQotICB2YXIgc2VhcmNoPW51bGw7DQotICB2YXIgZ2xvc3Nhcnk9bnVsbDsNCi0gIHZhciBmZWVkYmFjaz1udWxsOw0KLSAgdmFyIHRyZWVMb2FkZWQ9ZmFsc2U7DQotICBmdW5jdGlvbiBjaGVja1RyZWVMb2FkZWQoKQ0KLSAgew0KLSAgICBpZih0cmVlTG9hZGVkKQ0KLSAgICB7DQotICAgICAgcmV0dXJuIHRyZWVMb2FkZWQ7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgIGlmKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldCAhPSBudWxsDQotICAgICAgICAmJiBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeSgpKQ0KLSAgICAgew0KLSAgICAgICB0cmVlTG9hZGVkID0gdHJ1ZTsNCi0gICAgIH0NCi0gICAgICovDQotICAgICBpZihwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQgIT0gbnVsbCkNCi0gICAgIHsNCi0gICAgICAJdmFyIG1ldGhvZCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeTsNCi0JIGlmIChtZXRob2QgIT0gInVuZGVmaW5lZCIpIHsNCi0JCWlmIChwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeSgpKQ0KLQkJew0KLSAgICAgICAJCQl0cmVlTG9hZGVkID0gdHJ1ZTsNCi0JCX0NCi0NCi0JICB9DQotDQotICAgICB9DQotDQotICAgICByZXR1cm4gdHJlZUxvYWRlZDsNCi0gICB9DQotDQotDQotICAgIGZ1bmN0aW9uIHNob3dBbGVydE5vdExvYWRlZCgpDQotICAgIHsNCi0gICAgICBhbGVydCh0b3BuYXZfanNfTUVTU0FHRTEpOw0KLSAgICB9DQotDQotZnVuY3Rpb24gc2hvd1N0YXR1c05vdExvYWRlZCgpDQotICB7DQotICAgIC8vcmV0dXJuICJUaGUgVHJlZUJyb3dzZSBpcyBub3QgeWV0IGxvYWRlZCFcblBsZWFzZSB3YWl0ISI7DQotICAgIHJldHVybiB0b3BuYXZfanNfTUVTU0FHRTE7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93QWxlcnROb1BhZ2UodGV4dCkNCi0gIHsNCi0gICAgIHZhciBwYXJlbnRMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYocGFyZW50TGFiZWwhPSIiICYmIHBhcmVudExhYmVsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICAgICAvL2FsZXJ0KCJUaGVyZSBpcyBubyAnIiArIHRleHQgKyAiJyBwYWdlIGZvciB0aGlzIHBhZ2UuXG5Ucnkgb25lIG9mIHRoZSBvdGhlciBuYXZpZ2F0aW9uIGJ1dHRvbnMuIik7DQotICAgICAgICAgIGFsZXJ0KGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTIsIHRleHQpKTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgICAvL2FsZXJ0KCJUaGVyZSBpcyBubyAnIiArIHRleHQgKyAiJyBwYWdlIGZvciB0aGlzIHBhZ2UuXG5Ucnkgb25lIG9mIHRoZSBvdGhlciBuYXZpZ2F0aW9uIGJ1dHRvbnMiKTsNCi0gICAgICAgICBhbGVydChmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UyLCB0ZXh0KSk7DQotICAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93U3RhdHVzTm9QYWdlKHRleHQpDQotICB7DQotDQotICAgICB2YXIgcGFyZW50TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIHZhciBtc2c7DQotICAgICBpZihwYXJlbnRMYWJlbCE9IiIgJiYgcGFyZW50TGFiZWwhPW51bGwpDQotICAgICB7DQotICAgICAgICAvL21zZyA9ICJUaGVyZSBpcyBubyAiICsgdGV4dCArICIgcGFnZSEiOw0KLSAgICAgICAgbXNnID0gZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMywgdGV4dCk7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICAvL21zZyA9ICJUaGVyZSBpcyBubyAiICsgdGV4dCArICIgcGFnZSEiOw0KLSAgICAgICAgbXNnID0gZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMywgdGV4dCk7DQotICAgICB9DQotDQotICAgICByZXR1cm4gbXNnOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1BhcmVudExhYmVsKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgcGFyZW50dXJsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIHBhcmVudHVybCE9IiIgJiYgcGFyZW50dXJsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb1BhZ2UoInVwIik7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd0hvbWVMYWJlbCgpDQotICB7DQotICAgIHNlbGYuc3RhdHVzID0gIu2ZiCI7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93UHJldmlvdXNMYWJlbCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzTGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgcHJldnVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c1VybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIHByZXZ1cmwhPSIiICYmIHByZXZ1cmwhPW51bGwpDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gbGFiZWw7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb1BhZ2UoInByZXZpb3VzIik7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd05leHRMYWJlbCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIHZhciBuZXh0dXJsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgbmV4dHVybCE9IiIgJiYgbmV4dHVybCE9bnVsbCkNCi0gICAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgIH0NCi0gICAgICBlbHNlDQotICAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSAgc2hvd1N0YXR1c05vUGFnZSgibmV4dCIpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSAgc2hvd1N0YXR1c05vdExvYWRlZCgpOw0KLSAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkUHJldmlvdXMoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzTGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c1VybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLQ0KLQlpZiAoKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpPT0tMSkgJiYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpPT0tMSkpDQotCXsNCi0JCXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0IikhPS0xKQ0KLQl7DQotCSAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEFwcGxldFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsKTsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKSE9LTEpDQotCXsNCi0JCW5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEh0dHBQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCwgIlByZXZpb3VzIik7DQotCX0NCi0JICAgICAgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKG5ld0xvY2F0aW9uKTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX3ByZXYpOw0KLSAgICAgfQ0KLSAgICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkTmV4dCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICB2YXIgbmV3TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLQ0KLQlpZiAoKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpPT0tMSkgJiYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpPT0tMSkpDQotCXsNCi0JCXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0IikhPS0xKQ0KLQl7DQotCSAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEFwcGxldFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsKTsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKSE9LTEpDQotCXsNCi0JCW5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEh0dHBQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCwgIk5leHQiKTsNCi0JfQ0KLSAgICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotDQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfbmV4dCk7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGxvYWRQYXJlbnQoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLSAgICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV91cCk7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotDQotICAgICByZXR1cm47DQotICB9DQotDQotZnVuY3Rpb24gd2hlcmVBbUkoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLQl2YXIgc3RhdHVzID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgCWlmKCBzdGF0dXMgPT0gZmFsc2UgKQ0KLQl7DQotCQlhbGVydCggdG9wbmF2X2pzX01FU1NBR0U0ICk7DQotCX0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gdXBBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnVwQXJyb3coKTsNCi0gICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICAgew0KLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gZG93bkFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZG93bkFycm93KCk7DQotICAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICB9DQotDQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gICAgZnVuY3Rpb24gbGVmdEFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5sZWZ0QXJyb3coKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgICBmdW5jdGlvbiByaWdodEFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5yaWdodEFycm93KCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0NCi1mdW5jdGlvbiBsb2FkVG9wKCkNCi17DQotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiBwYXJlbnQuZnJhbWVzWzFdLm5hbWU9PSJvcnlfdG9jIikNCi0gIHsNCi0gICAgIGFsZXJ0KHRvcG5hdl9qc19NRVNTQUdFNSk7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIHZhciBleHBpcmVzID0gbmV3IERhdGUoKTsNCi0gICAgZXhwaXJlcy5zZXRUaW1lIChleHBpcmVzLmdldFRpbWUoKSArICgxMDAwICogMjApKTsNCi0gICAgZG9jdW1lbnQuY29va2llID0gInJ1cF9vcnlfZG9jPSIgKyBlc2NhcGUgKGRvY3VtZW50LlVSTCkgKw0KLSAgICAiOyBleHBpcmVzPSIgKyBleHBpcmVzLnRvVVRDU3RyaW5nKCkgKyAgIjsgcGF0aD0vIjsNCi0NCi0gICAgdmFyIG5ld19vcnlfZG9jX2xvYyA9IG51bGw7DQotDQotICAgIGZvcihpPWRvY3VtZW50LmxpbmtzLmxlbmd0aC0xO2k+PTA7aS0tKQ0KLSAgICB7DQotICAgICAgIGlmKGRvY3VtZW50LmxpbmtzW2ldLmhyZWYuaW5kZXhPZigiaW5kZXguaHRtIikhPS0xKQ0KLSAgICAgICB7DQotICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gZG9jdW1lbnQubGlua3NbaV0uaHJlZjsNCi0gICAgICAgICBicmVhazsNCi0gICAgICAgfQ0KLSAgICB9DQotDQotICAgIGlmKG5ld19vcnlfZG9jX2xvYyE9bnVsbCkNCi0gICAgew0KLQlpZiggc2VsZi5uYW1lID09ICJvcnlfZG9jIiApDQotCXsNCi0JCXdpbmRvdy5jbG9zZSgpOw0KLQkJd2luZG93Lm9wZW4oIG5ld19vcnlfZG9jX2xvYyApOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsNCi0JfQ0KLSAgICB9DQotICAgfQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiBvcGVuT3J5IChwYWdlLCB0YXJnZXQpDQotew0KLSAgICBpZighaW5kZXggfHwgaW5kZXguY2xvc2VkKQ0KLSAgICB7DQotICAgICAgaW5kZXggPSBvcGVuKHBhZ2UsdGFyZ2V0LCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9Mzk1LGhlaWdodD01MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIGluZGV4LmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlblNlYXJjaCgpDQotew0KLSAgICBpZighc2VhcmNoIHx8IHNlYXJjaC5jbG9zZWQpDQotICAgIHsNCi0gICAgICBzZWFyY2ggPSBvcGVuKCIuL2FwcGxldC9zZWFyY2guaHRtIiwic2VhcmNoX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz1ubyx3aWR0aD02MzAsaGVpZ2h0PTQ1MCxyZXNpemFibGU9eWVzIik7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2VhcmNoLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlbkluZGV4KCkNCi17DQotICAgb3Blbk9yeSgiLi9pbmRleC9pbmRleC5odG0iLCJpbmRleF93aW4iKTsNCi19DQotDQotZnVuY3Rpb24gb3Blbkdsb3NzYXJ5KCkNCi17DQotIGlmKCFnbG9zc2FyeSB8fCBnbG9zc2FyeS5jbG9zZWQpDQotICAgIHsNCi0gICAgICBnbG9zc2FyeSA9IG9wZW4oIi4vcHJvY2Vzcy9nbG9zc2FyeS9pbmRleC5odG0iLCJnbG9zc2FyeV93aW4iLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9Mzg1LGhlaWdodD01MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIGdsb3NzYXJ5LmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gcHJpbnRQYWdlKCkNCi17DQotIHBhcmVudC5vcnlfZG9jLmZvY3VzKCk7DQotIHBhcmVudC5vcnlfZG9jLnByaW50KCk7DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHNlbmRGZWVkYmFjayh1cmwpDQotew0KLQlpZiAoIHVybCA9PSBudWxsIHx8IHVybCA9PSAnJyApDQotCXsNCi0JCXJldHVybjsNCi0JfQ0KLQkNCi0JaWYgKCB1cmwuaW5kZXhPZigibWFpbHRvOiIpID49IDAgKQ0KLQl7DQotCQlzZW5kbWFpbCh1cmwpOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJDQotIAkgICAgaWYoIWZlZWRiYWNrIHx8IGZlZWRiYWNrLmNsb3NlZCkNCi0JICAgIHsNCi0JICAgICAgZmVlZGJhY2sgPSBvcGVuKHVybCwiZmVlZGJhY2tfd2luIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTYwMCxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0JICAgIH0NCi0JICAgIGVsc2UNCi0JICAgIHsNCi0JICAgICAgZmVlZGJhY2suZm9jdXMoKTsNCi0JICAgIH0NCi0gICAgCX0NCi0gICAgCQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiBzZW5kbWFpbCh1cmwpDQotew0KLQlpZiAoIHVybC5pbmRleE9mKCI/c3ViamVjdCIpID09IC0xICkNCi0Jew0KLQkJdmFyIGxpbms9cGFyZW50Lm9yeV9kb2MubG9jYXRpb247DQotCQl1cmwgPSB1cmwgKyAnP3N1YmplY3Q9RmVlZGJhY2s6IC0gJytsaW5rOw0KLQl9DQotCWxvY2F0aW9uLnJlcGxhY2UodXJsKTsNCi19DQotDQotLy9jYWxjdWxhdGVzIHJlbGF0aXZlIHBhdGgNCi0vL3BhdGggbXVzdCBiZSBhbGwgcmVsYXRpdmUgZnJvbSB3ZWJzaXRlIGJhc2Ugb3IgY29udGFpbiBmdWxsIHVybHMNCi1mdW5jdGlvbiBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgoc291cmNlUGF0aCwgdGFyZ2V0UGF0aCkNCi17DQotCWlmICh0YXJnZXRQYXRoLmluZGV4T2YoImh0dHA6LyIpICE9IC0xKQ0KLQl7DQotCQlyZXR1cm4gdGFyZ2V0UGF0aDsNCi0JfQ0KLQ0KLQkvL3JlcGxhY2UgYWxsICdcJyB3aXRoICcvJw0KLQlzb3VyY2VQYXRoID0gc291cmNlUGF0aC5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQl0YXJnZXRQYXRoID0gdGFyZ2V0UGF0aC5yZXBsYWNlKC9cXC9nLCIvIik7DQotDQotCS8vYWxlcnQoIlJlcGxhY2UoU291cmNlKT0+IiArIHNvdXJjZVBhdGgpOw0KLQkvL2FsZXJ0KCJSZXBsYWNlKHRhcmdldCk9PiIgKyB0YXJnZXRQYXRoKTsNCi0NCi0NCi0Jc291cmNlQXJyYXkgPSBzb3VyY2VQYXRoLnNwbGl0KCIvIik7DQotCXRhcmdldEFycmF5ID0gdGFyZ2V0UGF0aC5zcGxpdCgiLyIpOw0KLQ0KLQl2YXIgdGhlUmVsUGF0aCA9ICIiOw0KLQ0KLQkvL2xvb3AgdW50aWwgd2UgZmluZCBhIGRpZmZlcmVuY2UNCi0JdmFyIGlkeCA9IDA7DQotCWZvcihpZHggPSAwOyBpZHggPCBzb3VyY2VBcnJheS5sZW5ndGg7IGlkeCsrKQ0KLQl7DQotCQlpZiAoaWR4ID4gdGFyZ2V0UGF0aC5sZW5ndGgpDQotCQl7DQotCQkJYnJlYWs7DQotCQl9DQotDQotCQlpZiAoc291cmNlQXJyYXlbaWR4XSAhPSB0YXJnZXRBcnJheVtpZHhdKQ0KLQkJew0KLQkJCWJyZWFrOw0KLQkJfQ0KLQl9DQotDQotCS8vYXBwZW5kIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgLi8NCi0JdmFyIG1heElkeCA9IHNvdXJjZUFycmF5Lmxlbmd0aCAtIDE7DQotCWZvciAodmFyIGkgPSBpZHg7IGkgPCBtYXhJZHg7IGkrKykNCi0Jew0KLQkJdGhlUmVsUGF0aCA9IHRoZVJlbFBhdGggKyAiLi8iOw0KLQ0KLQkJLy9hbGVydCgiUmVsUGF0aD0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vYXBwZW5kIGFueSByZW1haW5pbmcgdGFyZ2V0IHBhdGgNCi0Jd2hpbGUoaWR4IDwgdGFyZ2V0QXJyYXkubGVuZ3RoKQ0KLQl7DQotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aCArIHRhcmdldEFycmF5W2lkeCsrXSArICIvIjsNCi0JCS8vYWxlcnQoIlJlbFBhdGgoZmluYWwpPT4iICsgdGhlUmVsUGF0aCk7DQotCX0NCi0NCi0JLy9yZW1vdmUgdGhlIGxhc3QgcGF0aCBzZXBhcmF0b3INCi0JaWYgKHRoZVJlbFBhdGgubGVuZ3RoID4gMCkNCi0Jew0KLQkJLy9hbGVydCgiUmVsUGF0aChUcmltMSk9PiIgKyB0aGVSZWxQYXRoKTsNCi0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoLnN1YnN0cmluZygwLCAodGhlUmVsUGF0aC5sZW5ndGggLSAxKSk7DQotCQkvL2FsZXJ0KCJSZWxQYXRoKFRyaW0xKT0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vYWxlcnQoIlJldHVybiBSZWxhdGl2ZSBQYXRoID0+ICIgKyB0aGVSZWxQYXRoKTsNCi0NCi0JcmV0dXJuIHRoZVJlbFBhdGg7DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldFRyZWVQYXRoKCkNCi17DQotCXJldHVybiBidWlsZFRyZWVQYXRoTG9jYXRpb24oKTsNCi19DQotDQotLy9UaGlzIG1ldGhvZCB3aWxsIHJlbW92ZSB0aGUgd2Vic2l0ZSBiYXNlIGZyb20gdGhlIHVybA0KLWZ1bmN0aW9uIGNhbGN1bGF0Q3VycmVudFBhZ2UoY3VyclVSTCkgew0KLQ0KLQl2YXIgdGhlQ3VycmVudExvY2F0aW9uID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZjsNCi0JLy9yZXBsYWNlIGFsbCAnXCcgd2l0aCAnLycNCi0JdGhlQ3VycmVudExvY2F0aW9uID0gdGhlQ3VycmVudExvY2F0aW9uLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7DQotCWN1cnJVUkwgPSBjdXJyVVJMLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7DQotDQotCXZhciBzb3VyY2VBcnJheSA9IHRoZUN1cnJlbnRMb2NhdGlvbi5zcGxpdCgiLyIpOw0KLQl2YXIgY3VyckFycmF5ID0gY3VyclVSTC5zcGxpdCgiLyIpOw0KLQ0KLQl2YXIgbnVtVG9SZW1vdmUgPSBzb3VyY2VBcnJheS5sZW5ndGggLSAyOw0KLQl2YXIgaWR4ID0gMDsNCi0JdmFyIHRoZVJldHVyblBhdGggPSAiIjsNCi0JZm9yIChpZHggPSBudW1Ub1JlbW92ZTsgaWR4IDwgY3VyckFycmF5Lmxlbmd0aDsgaWR4KyspIHsNCi0JCWlmICh0aGVSZXR1cm5QYXRoICE9ICIiKSB7DQotCQkJdGhlUmV0dXJuUGF0aCA9IHRoZVJldHVyblBhdGggKyAiLyI7DQotCQl9DQotCQl0aGVSZXR1cm5QYXRoID0gdGhlUmV0dXJuUGF0aCArIGN1cnJBcnJheVtpZHhdOw0KLQl9DQotDQotCS8vYWxlcnQoIkFycmF5VGVzdD0+IiArIGN1cnJVUkwgKyAiLCIgKyB0aGVSZXR1cm5QYXRoKTsNCi0JcmV0dXJuIHRoZVJldHVyblBhdGg7DQotfQ0KLQ0KLS8vYnVpbGRzIHRyZWUgcGF0aA0KLWZ1bmN0aW9uIGJ1aWxkVHJlZVBhdGhMb2NhdGlvbigpDQotew0KLQl2YXIgdGhlRGVsaW1pdGVyID0gIiMjKiI7DQotCXZhciB0aGlzUGFnZSA9ICJhcHBsZXQvcnVwX3RvcG5hdi5odG0iOw0KLQl2YXIgdGhlTG9jID0gIiI7DQotDQotDQotDQotCWlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLQl7DQotCQl2YXIgdGhlQ3VycmVudExvY2F0aW9uID0gcGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQubG9jYXRpb24uaHJlZjsNCi0JCXRoaXNQYWdlID0gY2FsY3VsYXRDdXJyZW50UGFnZSh0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJLy9hbGVydCgiUGF0aE5hbWU6IiArIHRoaXNQYWdlKTsNCi0NCi0JCS8vYWxlcnQoIlRyeWluZyB0byBmaW5kIHRoZSBwYXRoIGZvciA9PiIgKyB0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJdmFyIHRoZVBhdGggPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuZ2V0VHJlZVBhdGhBcnJheSh0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJLy9hbGVydCgiVGhlIFRyZWUgUGF0aDogIiArIHRoZVBhdGgpOw0KLQ0KLQkJdGhlUGF0aFN0cmluZyA9IHRoZVBhdGggKyAiIjsNCi0gICAgCQlhcnJheUZyb21TdHJpbmcgPSB0aGVQYXRoU3RyaW5nLnNwbGl0KHRoZURlbGltaXRlcik7DQotDQotCQkvL2J1aWxkIHRoZSBwYXRoIGZyb20gdGhlIGFycmF5DQotCQkvL3BhcmFtIDEgPSBwYXRoIHRvIGljb24sIHBhcmFtIDIgLSBsYWJlbCwgcGFyYW0gMyAtIHBhdGggdG8gZmlsZQ0KLQkJdmFyIGNvdW50ZXIgPSAwOw0KLQkJdmFyIHRoZUxhYmVsOw0KLQkJdmFyIHRoZVJlbFBhdGg7DQotCQlpZiAoYXJyYXlGcm9tU3RyaW5nLmxlbmd0aCA+IDIpDQotCQl7DQotCQkgICB0aGVMb2MgPSAiIjsNCi0JCSAgIGZvcih2YXIgaSA9IDA7IGkgPCAoYXJyYXlGcm9tU3RyaW5nLmxlbmd0aCAtIDEpIDsgaSsrKQ0KLQkJICAgew0KLQkJCS8vaXQncyB0aGUgaWNvbiBwYXRoDQotCQkJaWYgKGNvdW50ZXIgPCAyKQ0KLQkJCXsNCi0JCQkJaWYgKGNvdW50ZXIgPiAwKQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKyAiICZndDsgIjsNCi0JCQkJfQ0KLQ0KLQkJCQkvL2FsZXJ0KCJDYWxjdWxhdGluZyBwYXRoIGZyb20oMSkgIiArIHRoaXNQYWdlICsgIiA9PiAiICsgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0NCi0JCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXS5pbmRleE9mKCJcXCIpID09IC0xICYmIGFycmF5RnJvbVN0cmluZ1tpXS5pbmRleE9mKCIvIikgPT0gLTEpDQotCQkJCXsNCi0JCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0gIT0gIm51bGwiKQ0KLQkJCQkJew0KLQkJCQkJCXRoZVJlbFBhdGggPSAiYXBwbGV0L2ltYWdlcy8iICsgYXJyYXlGcm9tU3RyaW5nW2ldOw0KLQkJCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIHRoZVJlbFBhdGgpOw0KLQkJCQkJfQ0KLQkJCQkJLy9hbGVydCgiTW9kaWZ5aW5nIFBhdGggPT4gIiArIHRoZVJlbFBhdGgpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJfQ0KLQ0KLQkJCQlpZiAodGhlUmVsUGF0aCAhPSAibnVsbCIpDQotCQkJCXsNCi0JCQkJCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkJICI8aW1nIGJvcmRlcj0wIHNyYz1cIiIgKw0KLQkJCQkJCSB0aGVSZWxQYXRoICArDQotCQkJCQkJICJcIj4iOw0KLQkJCQl9DQotDQotCQkJCS8vYWxlcnQoInRoZSBjdXJyIHBhdGg9PiIgKyB0aGVMb2MpOw0KLQkJCQljb3VudGVyID0gMjsNCi0JCQl9DQotCQkJLy8gaXQncyB0aGUgbGFiZWwNCi0JCQllbHNlIGlmIChjb3VudGVyID09IDIpDQotCQkJew0KLQkJCQl0aGVMYWJlbCA9IGFycmF5RnJvbVN0cmluZ1tpXTsNCi0JCQkJY291bnRlciA9IDM7DQotCQkJfQ0KLQkJCWVsc2UgaWYgKGNvdW50ZXIgPT0gMykNCi0JCQl7DQotCQkJCS8vYWxlcnQoIkNhbGN1bGF0aW5nIHBhdGggZnJvbSgzKSAiICsgdGhpc1BhZ2UgKyAiID0+ICIgKyBhcnJheUZyb21TdHJpbmdbaV0pOw0KLQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldICE9ICJudWxsIikNCi0JCQkJew0KLQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJCWlmICh0aGVSZWxQYXRoICE9ICIiKSB7DQotCQkJCQkJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJCSI8YSBjbGFzcz1cImhvdHRleHRcIiB0YXJnZXQ9XCJvcnlfZG9jXCIgaHJlZj1cIiIgKw0KLQkJCQkJCQkgdGhlUmVsUGF0aCArDQotCQkJCQkgCQkiXCI+IiArDQotCQkJCQkgCQl0aGVMYWJlbCArDQotCQkJCQkgCQkiPFwvYT5cbiI7DQotCQkJCQkgfQ0KLQkJCQkJIGVsc2Ugew0KLQkJCQkJIAl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJIAkJIjxhIGNsYXNzPVwiaG90dGV4dFwiPiIgICsNCi0JCQkJCSAJCXRoZUxhYmVsICsNCi0JCQkJCSAJCSI8XC9hPlxuIjsNCi0JCQkJCSB9DQotCQkJCX0NCi0JCQkJZWxzZQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJIAkiPGEgY2xhc3M9XCJob3R0ZXh0XCI+IiAgKw0KLQkJCQkJIAl0aGVMYWJlbCArDQotCQkJCQkgCSI8XC9hPlxuIjsNCi0JCQkJfQ0KLQkJCQkvL2FsZXJ0KCJ0aGUgY3VyciBwYXRoPT4iICsgdGhlTG9jKTsNCi0JCQkJY291bnRlciA9IDE7DQotCQkJCXRoZVJlbFBhdGggPSAibnVsbCI7DQotCQkJCXRoZUxhYmVsID0gIm51bGwiOw0KLQkJCX0NCi0JCSAgIH0NCi0NCi0JCS8vYWxlcnQoIkZpbmlzaGVkIEJ1aWxkaW5nID0+ICIgKyB0aGVMb2MpOw0KLQkJfQ0KLQ0KLQl9DQotDQotCS8vdGhlTG9jID0gIkN1cnJlbnQgTG9jYXRpb24mbmJzcDsmIzA0NTsmbmJzcDsiICsgdGhlTG9jOw0KLQ0KLQkvL2FsZXJ0KCJ0aGUgRmluYWwgU3RyaW5nPT4iICsgdGhlTG9jKTsNCi0NCi0JLy9kb2N1bWVudC53cml0ZSh0aGVMb2MpOw0KLQlyZXR1cm4gdGhlTG9jOw0KLQ0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3NjcmlwdHMvdG9wbmF2X3B0X0JSLmpzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl9wdF9CUi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2NGE0OS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3NjcmlwdHMvdG9wbmF2X3B0X0JSLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNzg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8vIG1lc3NhZ2VzIHRvIGJlIGV4dGVybml6ZWQNCi0vLyBoZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotDQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMSA9ICJPIFRyZWVCcm93c2UgbsOjbyBmb2kgY2FycmVnYWRvIGFpbmRhIVxuQWd1YXJkZSEiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTIgPSAiTsOjbyBow6EgcMOhZ2luYSAnezB9JyBwYXJhIGVzdGEgcMOhZ2luYS5cblRlbnRlIHVtIGRvcyBvdXRyb3MgYm90w7VlcyBkZSBuYXZlZ2HDp8Ojby4iOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTMgPSAiTsOjbyBow6EgcMOhZ2luYSB7MH0hIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0VfcHJldiA9ICJhbnRlcmlvciAiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV9uZXh0ID0gInByw7N4aW1vICI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3VwID0gInBhcmEgY2ltYSI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFNCA9ICJPIGFycXVpdm8gYXR1YWwgbsOjbyBlc3TDoSBuYSDDoXJ2b3JlIGRlIG5hdmVnYcOnw6NvLiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFNSA9ICJPIHNpdGUgcHVibGljYWRvIGrDoSDDqSBleGliaWRvIHV0aWxpemFuZG8gcXVhZHJvcyI7DQotDQotZnVuY3Rpb24gZm9ybWF0U3RyaW5nKG1lc3NhZ2UsIHJlcGxhY2UwKQ0KLXsNCi0gICAJcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgvXHswXH0vLCByZXBsYWNlMCk7DQotfSANCi0NCi0vLyB0aGlzIHNjcmlwdCBpcyBmb3IgdGhlIHRvcG5hdi5odG1sDQotLy8gdGhpcyBpcyBOT1QgZm9yIGdlbmVyYWwgdXNlDQotTVNGUGhvdmVyID0NCi0oKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTmV0c2NhcGUiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSAzICkpIHx8DQotICAoKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpKTsNCi0NCi0gIGZ1bmN0aW9uIE1TRlBwcmVsb2FkKGltZykNCi0gIHsNCi0gICAgIHZhciBhPW5ldyBJbWFnZSgpOw0KLSAgICAgYS5zcmM9aW1nOw0KLSAgICAgcmV0dXJuIGE7DQotICB9DQotICANCi12YXIgdG91ciA9IDA7DQotDQotZnVuY3Rpb24gb3BlbkZpcnN0VG91ciAoKQ0KLS8vIG9wZW4gdGhlIGd1aWRlZCB0b3VyIC9oYWFrYW4gOTkwMzI0DQotew0KLWlmKCF0b3VyIHx8IHRvdXI9PW51bGwgfHwgdG91ci5jbG9zZWQpDQotICAgIHsNCi0gICAgICB0b3VyID0gb3BlbigiLi90b3VyL3RvdXIuaHRtIiwidG91cl9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM1MCxoZWlnaHQ9NzAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5Ub3VyICgpDQotLy8gb3BlbiB0aGUgZ3VpZGVkIHRvdXIgL2hhYWthbiA5OTAzMjQNCi17DQotaWYoIXRvdXIgfHwgdG91cj09bnVsbCB8fCB0b3VyLmNsb3NlZCkNCi0gICAgew0KLSAgICAgIHRvdXIgPSBvcGVuKCIuL3RvdXIvdG91ci5odG0iLCJ0b3VyX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9MzUwLGhlaWdodD03MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotLy9BZGRpdGlvbiBieSBDaGluaCBWbyAwMy8yOC8wMA0KLSBmdW5jdGlvbiBkaXNwbGF5R2V0dGluZ1N0YXJ0ZWQoKQ0KLSB7DQotIAl2YXIgcGFnZVBhdHRlcm4gPSAvb3Z1X3Byb2MvOw0KLSAJdmFyIG1haW5QYWdlID0gd2luZG93LnBhcmVudC5vcnlfZG9jLmxvY2F0aW9uOw0KLQ0KLSAJaWYgKCBwYWdlUGF0dGVybi50ZXN0KCBtYWluUGFnZSApICkgew0KLSAgICAJaWYgKGdldENvb2tpZSgiUlVQIikgIT0gImNoZWNrZWQiKSB7IG9wZW5GaXJzdFRvdXIoKTsgfQ0KLQl9DQotCWVsc2Ugew0KLQkJc2V0VGltZW91dCggImRpc3BsYXlHZXR0aW5nU3RhcnRlZCgpIiwgMTAwMCApOw0KLQl9DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldENvb2tpZSAobmFtZSkNCi17DQotICB2YXIgZGNvb2tpZSA9IGRvY3VtZW50LmNvb2tpZTsNCi0gIHZhciBjbmFtZSA9IG5hbWUgKyAiPSI7DQotICB2YXIgY2xlbiA9IGRjb29raWUubGVuZ3RoOw0KLSAgdmFyIGNiZWdpbiA9IDA7DQotICB3aGlsZSAoY2JlZ2luIDwgY2xlbikNCi0gIHsNCi0gICAgdmFyIHZiZWdpbiA9IGNiZWdpbiArIGNuYW1lLmxlbmd0aDsNCi0gICAgaWYgKGRjb29raWUuc3Vic3RyaW5nKGNiZWdpbiwgdmJlZ2luKSA9PSBjbmFtZSkNCi0gICAgew0KLSAgICAgIHZhciB2ZW5kID0gZGNvb2tpZS5pbmRleE9mICgiOyIsIHZiZWdpbik7DQotICAgICAgaWYgKHZlbmQgPT0gLTEpDQotICAgICAgew0KLSAgICAgICAgdmVuZCA9IGNsZW47DQotICAgICAgfQ0KLSAgICAgIHJldHVybiB1bmVzY2FwZShkY29va2llLnN1YnN0cmluZyh2YmVnaW4sIHZlbmQpKTsNCi0gICAgfQ0KLSAgICBjYmVnaW4gPSBkY29va2llLmluZGV4T2YoIiAiLCBjYmVnaW4pICsgMTsNCi0gICAgaWYgKGNiZWdpbiA9PSAwKQ0KLSAgICB7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0gIH0NCi0gIHJldHVybiBudWxsOw0KLSB9DQotDQotDQotICB2YXIgaW5kZXg9bnVsbDsNCi0gIHZhciB0b3VyPW51bGw7DQotICB2YXIgc2VhcmNoPW51bGw7DQotICB2YXIgZ2xvc3Nhcnk9bnVsbDsNCi0gIHZhciBmZWVkYmFjaz1udWxsOw0KLSAgdmFyIHRyZWVMb2FkZWQ9ZmFsc2U7DQotICBmdW5jdGlvbiBjaGVja1RyZWVMb2FkZWQoKQ0KLSAgew0KLSAgICBpZih0cmVlTG9hZGVkKQ0KLSAgICB7DQotICAgICAgcmV0dXJuIHRyZWVMb2FkZWQ7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgIGlmKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldCAhPSBudWxsDQotICAgICAgICAmJiBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeSgpKQ0KLSAgICAgew0KLSAgICAgICB0cmVlTG9hZGVkID0gdHJ1ZTsNCi0gICAgIH0NCi0gICAgICovDQotICAgICBpZihwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQgIT0gbnVsbCkNCi0gICAgIHsNCi0gICAgICAJdmFyIG1ldGhvZCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeTsNCi0JIGlmIChtZXRob2QgIT0gInVuZGVmaW5lZCIpIHsNCi0JCWlmIChwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeSgpKQ0KLQkJew0KLSAgICAgICAJCQl0cmVlTG9hZGVkID0gdHJ1ZTsNCi0JCX0NCi0NCi0JICB9DQotDQotICAgICB9DQotDQotICAgICByZXR1cm4gdHJlZUxvYWRlZDsNCi0gICB9DQotDQotDQotICAgIGZ1bmN0aW9uIHNob3dBbGVydE5vdExvYWRlZCgpDQotICAgIHsNCi0gICAgICBhbGVydCh0b3BuYXZfanNfTUVTU0FHRTEpOw0KLSAgICB9DQotDQotZnVuY3Rpb24gc2hvd1N0YXR1c05vdExvYWRlZCgpDQotICB7DQotICAgIC8vcmV0dXJuICJUaGUgVHJlZUJyb3dzZSBpcyBub3QgeWV0IGxvYWRlZCFcblBsZWFzZSB3YWl0ISI7DQotICAgIHJldHVybiB0b3BuYXZfanNfTUVTU0FHRTE7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93QWxlcnROb1BhZ2UodGV4dCkNCi0gIHsNCi0gICAgIHZhciBwYXJlbnRMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYocGFyZW50TGFiZWwhPSIiICYmIHBhcmVudExhYmVsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICAgICAvL2FsZXJ0KCJUaGVyZSBpcyBubyAnIiArIHRleHQgKyAiJyBwYWdlIGZvciB0aGlzIHBhZ2UuXG5Ucnkgb25lIG9mIHRoZSBvdGhlciBuYXZpZ2F0aW9uIGJ1dHRvbnMuIik7DQotICAgICAgICAgIGFsZXJ0KGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTIsIHRleHQpKTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgICAvL2FsZXJ0KCJUaGVyZSBpcyBubyAnIiArIHRleHQgKyAiJyBwYWdlIGZvciB0aGlzIHBhZ2UuXG5Ucnkgb25lIG9mIHRoZSBvdGhlciBuYXZpZ2F0aW9uIGJ1dHRvbnMiKTsNCi0gICAgICAgICBhbGVydChmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UyLCB0ZXh0KSk7DQotICAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93U3RhdHVzTm9QYWdlKHRleHQpDQotICB7DQotDQotICAgICB2YXIgcGFyZW50TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIHZhciBtc2c7DQotICAgICBpZihwYXJlbnRMYWJlbCE9IiIgJiYgcGFyZW50TGFiZWwhPW51bGwpDQotICAgICB7DQotICAgICAgICAvL21zZyA9ICJUaGVyZSBpcyBubyAiICsgdGV4dCArICIgcGFnZSEiOw0KLSAgICAgICAgbXNnID0gZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMywgdGV4dCk7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICAvL21zZyA9ICJUaGVyZSBpcyBubyAiICsgdGV4dCArICIgcGFnZSEiOw0KLSAgICAgICAgbXNnID0gZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMywgdGV4dCk7DQotICAgICB9DQotDQotICAgICByZXR1cm4gbXNnOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1BhcmVudExhYmVsKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgcGFyZW50dXJsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIHBhcmVudHVybCE9IiIgJiYgcGFyZW50dXJsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb1BhZ2UoInVwIik7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd0hvbWVMYWJlbCgpDQotICB7DQotICAgIHNlbGYuc3RhdHVzID0gIkhvbWUiOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1ByZXZpb3VzTGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c0xhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgdmFyIHByZXZ1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKGxhYmVsIT0iIiAmJiBsYWJlbCE9bnVsbCAmJiBwcmV2dXJsIT0iIiAmJiBwcmV2dXJsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm9QYWdlKCJwcmV2aW91cyIpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm90TG9hZGVkKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dOZXh0TGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgbmV4dHVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIG5leHR1cmwhPSIiICYmIG5leHR1cmwhPW51bGwpDQotICAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsNCi0gICAgICB9DQotICAgICAgZWxzZQ0KLSAgICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb1BhZ2UoIm5leHQiKTsNCi0gICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZFByZXZpb3VzKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c0xhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0NCi0JaWYgKChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKT09LTEpICYmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKT09LTEpKQ0KLQl7DQotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpIT0tMSkNCi0Jew0KLQkgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRBcHBsZXRQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCk7DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQ0KLQl7DQotCQluZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRIdHRwUGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwsICJQcmV2aW91cyIpOw0KLQl9DQotCSAgICAgIAlwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV9wcmV2KTsNCi0gICAgIH0NCi0gICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZE5leHQoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0NCi0JaWYgKChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKT09LTEpICYmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKT09LTEpKQ0KLQl7DQotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpIT0tMSkNCi0Jew0KLQkgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRBcHBsZXRQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCk7DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQ0KLQl7DQotCQluZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRIdHRwUGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwsICJOZXh0Iik7DQotCX0NCi0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLQ0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX25leHQpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotDQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkUGFyZW50KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfdXApOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLWZ1bmN0aW9uIHdoZXJlQW1JKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0JdmFyIHN0YXR1cyA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgIAlpZiggc3RhdHVzID09IGZhbHNlICkNCi0Jew0KLQkJYWxlcnQoIHRvcG5hdl9qc19NRVNTQUdFNCApOw0KLQl9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHVwQXJyb3coKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS51cEFycm93KCk7DQotICAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGRvd25BcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmRvd25BcnJvdygpOw0KLSAgICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgICB7DQotICAgICAgIHBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotICAgICAgfQ0KLQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICAgIGZ1bmN0aW9uIGxlZnRBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUubGVmdEFycm93KCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gICAgZnVuY3Rpb24gcmlnaHRBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUucmlnaHRBcnJvdygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotDQotZnVuY3Rpb24gbG9hZFRvcCgpDQotew0KLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIpDQotICB7DQotICAgICBhbGVydCh0b3BuYXZfanNfTUVTU0FHRTUpOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICB2YXIgZXhwaXJlcyA9IG5ldyBEYXRlKCk7DQotICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7DQotICAgIGRvY3VtZW50LmNvb2tpZSA9ICJydXBfb3J5X2RvYz0iICsgZXNjYXBlIChkb2N1bWVudC5VUkwpICsNCi0gICAgIjsgZXhwaXJlcz0iICsgZXhwaXJlcy50b1VUQ1N0cmluZygpICsgICI7IHBhdGg9LyI7DQotDQotICAgIHZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOw0KLQ0KLSAgICBmb3IoaT1kb2N1bWVudC5saW5rcy5sZW5ndGgtMTtpPj0wO2ktLSkNCi0gICAgew0KLSAgICAgICBpZihkb2N1bWVudC5saW5rc1tpXS5ocmVmLmluZGV4T2YoImluZGV4Lmh0bSIpIT0tMSkNCi0gICAgICAgew0KLSAgICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IGRvY3VtZW50LmxpbmtzW2ldLmhyZWY7DQotICAgICAgICAgYnJlYWs7DQotICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpDQotICAgIHsNCi0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQ0KLQl7DQotCQl3aW5kb3cuY2xvc2UoKTsNCi0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JICAgICAgIAl0b3AubG9jYXRpb24gPSBuZXdfb3J5X2RvY19sb2M7DQotCX0NCi0gICAgfQ0KLSAgIH0NCi19DQotDQotDQotZnVuY3Rpb24gb3Blbk9yeSAocGFnZSwgdGFyZ2V0KQ0KLXsNCi0gICAgaWYoIWluZGV4IHx8IGluZGV4LmNsb3NlZCkNCi0gICAgew0KLSAgICAgIGluZGV4ID0gb3BlbihwYWdlLHRhcmdldCwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM5NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBpbmRleC5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5TZWFyY2goKQ0KLXsNCi0gICAgaWYoIXNlYXJjaCB8fCBzZWFyY2guY2xvc2VkKQ0KLSAgICB7DQotICAgICAgc2VhcmNoID0gb3BlbigiLi9hcHBsZXQvc2VhcmNoLmh0bSIsInNlYXJjaF9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9bm8sd2lkdGg9NjMwLGhlaWdodD00NTAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNlYXJjaC5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5JbmRleCgpDQotew0KLSAgIG9wZW5PcnkoIi4vaW5kZXgvaW5kZXguaHRtIiwiaW5kZXhfd2luIik7DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5HbG9zc2FyeSgpDQotew0KLSBpZighZ2xvc3NhcnkgfHwgZ2xvc3NhcnkuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgZ2xvc3NhcnkgPSBvcGVuKCIuL3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXguaHRtIiwiZ2xvc3Nhcnlfd2luIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM4NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBnbG9zc2FyeS5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIHByaW50UGFnZSgpDQotew0KLSBwYXJlbnQub3J5X2RvYy5mb2N1cygpOw0KLSBwYXJlbnQub3J5X2RvYy5wcmludCgpOw0KLX0NCi0NCi0NCi1mdW5jdGlvbiBzZW5kRmVlZGJhY2sodXJsKQ0KLXsNCi0JaWYgKCB1cmwgPT0gbnVsbCB8fCB1cmwgPT0gJycgKQ0KLQl7DQotCQlyZXR1cm47DQotCX0NCi0JDQotCWlmICggdXJsLmluZGV4T2YoIm1haWx0bzoiKSA+PSAwICkNCi0Jew0KLQkJc2VuZG1haWwodXJsKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCQ0KLSAJICAgIGlmKCFmZWVkYmFjayB8fCBmZWVkYmFjay5jbG9zZWQpDQotCSAgICB7DQotCSAgICAgIGZlZWRiYWNrID0gb3Blbih1cmwsImZlZWRiYWNrX3dpbiIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD02MDAsaGVpZ2h0PTUwMCxyZXNpemFibGU9eWVzIik7DQotCSAgICB9DQotCSAgICBlbHNlDQotCSAgICB7DQotCSAgICAgIGZlZWRiYWNrLmZvY3VzKCk7DQotCSAgICB9DQotICAgIAl9DQotICAgIAkNCi19DQotDQotDQotZnVuY3Rpb24gc2VuZG1haWwodXJsKQ0KLXsNCi0JaWYgKCB1cmwuaW5kZXhPZigiP3N1YmplY3QiKSA9PSAtMSApDQotCXsNCi0JCXZhciBsaW5rPXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uOw0KLQkJdXJsID0gdXJsICsgJz9zdWJqZWN0PUZlZWRiYWNrOiAtICcrbGluazsNCi0JfQ0KLQlsb2NhdGlvbi5yZXBsYWNlKHVybCk7DQotfQ0KLQ0KLS8vY2FsY3VsYXRlcyByZWxhdGl2ZSBwYXRoDQotLy9wYXRoIG11c3QgYmUgYWxsIHJlbGF0aXZlIGZyb20gd2Vic2l0ZSBiYXNlIG9yIGNvbnRhaW4gZnVsbCB1cmxzDQotZnVuY3Rpb24gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHNvdXJjZVBhdGgsIHRhcmdldFBhdGgpDQotew0KLQlpZiAodGFyZ2V0UGF0aC5pbmRleE9mKCJodHRwOi8iKSAhPSAtMSkNCi0Jew0KLQkJcmV0dXJuIHRhcmdldFBhdGg7DQotCX0NCi0NCi0JLy9yZXBsYWNlIGFsbCAnXCcgd2l0aCAnLycNCi0Jc291cmNlUGF0aCA9IHNvdXJjZVBhdGgucmVwbGFjZSgvXFwvZywiJDEvJDIiKTsNCi0JdGFyZ2V0UGF0aCA9IHRhcmdldFBhdGgucmVwbGFjZSgvXFwvZywiLyIpOw0KLQ0KLQkvL2FsZXJ0KCJSZXBsYWNlKFNvdXJjZSk9PiIgKyBzb3VyY2VQYXRoKTsNCi0JLy9hbGVydCgiUmVwbGFjZSh0YXJnZXQpPT4iICsgdGFyZ2V0UGF0aCk7DQotDQotDQotCXNvdXJjZUFycmF5ID0gc291cmNlUGF0aC5zcGxpdCgiLyIpOw0KLQl0YXJnZXRBcnJheSA9IHRhcmdldFBhdGguc3BsaXQoIi8iKTsNCi0NCi0JdmFyIHRoZVJlbFBhdGggPSAiIjsNCi0NCi0JLy9sb29wIHVudGlsIHdlIGZpbmQgYSBkaWZmZXJlbmNlDQotCXZhciBpZHggPSAwOw0KLQlmb3IoaWR4ID0gMDsgaWR4IDwgc291cmNlQXJyYXkubGVuZ3RoOyBpZHgrKykNCi0Jew0KLQkJaWYgKGlkeCA+IHRhcmdldFBhdGgubGVuZ3RoKQ0KLQkJew0KLQkJCWJyZWFrOw0KLQkJfQ0KLQ0KLQkJaWYgKHNvdXJjZUFycmF5W2lkeF0gIT0gdGFyZ2V0QXJyYXlbaWR4XSkNCi0JCXsNCi0JCQlicmVhazsNCi0JCX0NCi0JfQ0KLQ0KLQkvL2FwcGVuZCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIC4vDQotCXZhciBtYXhJZHggPSBzb3VyY2VBcnJheS5sZW5ndGggLSAxOw0KLQlmb3IgKHZhciBpID0gaWR4OyBpIDwgbWF4SWR4OyBpKyspDQotCXsNCi0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoICsgIi4vIjsNCi0NCi0JCS8vYWxlcnQoIlJlbFBhdGg9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL2FwcGVuZCBhbnkgcmVtYWluaW5nIHRhcmdldCBwYXRoDQotCXdoaWxlKGlkeCA8IHRhcmdldEFycmF5Lmxlbmd0aCkNCi0Jew0KLQkJdGhlUmVsUGF0aCA9IHRoZVJlbFBhdGggKyB0YXJnZXRBcnJheVtpZHgrK10gKyAiLyI7DQotCQkvL2FsZXJ0KCJSZWxQYXRoKGZpbmFsKT0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vcmVtb3ZlIHRoZSBsYXN0IHBhdGggc2VwYXJhdG9yDQotCWlmICh0aGVSZWxQYXRoLmxlbmd0aCA+IDApDQotCXsNCi0JCS8vYWxlcnQoIlJlbFBhdGgoVHJpbTEpPT4iICsgdGhlUmVsUGF0aCk7DQotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aC5zdWJzdHJpbmcoMCwgKHRoZVJlbFBhdGgubGVuZ3RoIC0gMSkpOw0KLQkJLy9hbGVydCgiUmVsUGF0aChUcmltMSk9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL2FsZXJ0KCJSZXR1cm4gUmVsYXRpdmUgUGF0aCA9PiAiICsgdGhlUmVsUGF0aCk7DQotDQotCXJldHVybiB0aGVSZWxQYXRoOw0KLX0NCi0NCi1mdW5jdGlvbiBnZXRUcmVlUGF0aCgpDQotew0KLQlyZXR1cm4gYnVpbGRUcmVlUGF0aExvY2F0aW9uKCk7DQotfQ0KLQ0KLS8vVGhpcyBtZXRob2Qgd2lsbCByZW1vdmUgdGhlIHdlYnNpdGUgYmFzZSBmcm9tIHRoZSB1cmwNCi1mdW5jdGlvbiBjYWxjdWxhdEN1cnJlbnRQYWdlKGN1cnJVUkwpIHsNCi0NCi0JdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7DQotCS8vcmVwbGFjZSBhbGwgJ1wnIHdpdGggJy8nDQotCXRoZUN1cnJlbnRMb2NhdGlvbiA9IHRoZUN1cnJlbnRMb2NhdGlvbi5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQljdXJyVVJMID0gY3VyclVSTC5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQ0KLQl2YXIgc291cmNlQXJyYXkgPSB0aGVDdXJyZW50TG9jYXRpb24uc3BsaXQoIi8iKTsNCi0JdmFyIGN1cnJBcnJheSA9IGN1cnJVUkwuc3BsaXQoIi8iKTsNCi0NCi0JdmFyIG51bVRvUmVtb3ZlID0gc291cmNlQXJyYXkubGVuZ3RoIC0gMjsNCi0JdmFyIGlkeCA9IDA7DQotCXZhciB0aGVSZXR1cm5QYXRoID0gIiI7DQotCWZvciAoaWR4ID0gbnVtVG9SZW1vdmU7IGlkeCA8IGN1cnJBcnJheS5sZW5ndGg7IGlkeCsrKSB7DQotCQlpZiAodGhlUmV0dXJuUGF0aCAhPSAiIikgew0KLQkJCXRoZVJldHVyblBhdGggPSB0aGVSZXR1cm5QYXRoICsgIi8iOw0KLQkJfQ0KLQkJdGhlUmV0dXJuUGF0aCA9IHRoZVJldHVyblBhdGggKyBjdXJyQXJyYXlbaWR4XTsNCi0JfQ0KLQ0KLQkvL2FsZXJ0KCJBcnJheVRlc3Q9PiIgKyBjdXJyVVJMICsgIiwiICsgdGhlUmV0dXJuUGF0aCk7DQotCXJldHVybiB0aGVSZXR1cm5QYXRoOw0KLX0NCi0NCi0vL2J1aWxkcyB0cmVlIHBhdGgNCi1mdW5jdGlvbiBidWlsZFRyZWVQYXRoTG9jYXRpb24oKQ0KLXsNCi0JdmFyIHRoZURlbGltaXRlciA9ICIjIyoiOw0KLQl2YXIgdGhpc1BhZ2UgPSAiYXBwbGV0L3J1cF90b3BuYXYuaHRtIjsNCi0JdmFyIHRoZUxvYyA9ICIiOw0KLQ0KLQ0KLQ0KLQlpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0Jew0KLQkJdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY7DQotCQl0aGlzUGFnZSA9IGNhbGN1bGF0Q3VycmVudFBhZ2UodGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCS8vYWxlcnQoIlBhdGhOYW1lOiIgKyB0aGlzUGFnZSk7DQotDQotCQkvL2FsZXJ0KCJUcnlpbmcgdG8gZmluZCB0aGUgcGF0aCBmb3IgPT4iICsgdGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCXZhciB0aGVQYXRoID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmdldFRyZWVQYXRoQXJyYXkodGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCS8vYWxlcnQoIlRoZSBUcmVlIFBhdGg6ICIgKyB0aGVQYXRoKTsNCi0NCi0JCXRoZVBhdGhTdHJpbmcgPSB0aGVQYXRoICsgIiI7DQotICAgIAkJYXJyYXlGcm9tU3RyaW5nID0gdGhlUGF0aFN0cmluZy5zcGxpdCh0aGVEZWxpbWl0ZXIpOw0KLQ0KLQkJLy9idWlsZCB0aGUgcGF0aCBmcm9tIHRoZSBhcnJheQ0KLQkJLy9wYXJhbSAxID0gcGF0aCB0byBpY29uLCBwYXJhbSAyIC0gbGFiZWwsIHBhcmFtIDMgLSBwYXRoIHRvIGZpbGUNCi0JCXZhciBjb3VudGVyID0gMDsNCi0JCXZhciB0aGVMYWJlbDsNCi0JCXZhciB0aGVSZWxQYXRoOw0KLQkJaWYgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggPiAyKQ0KLQkJew0KLQkJICAgdGhlTG9jID0gIiI7DQotCQkgICBmb3IodmFyIGkgPSAwOyBpIDwgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggLSAxKSA7IGkrKykNCi0JCSAgIHsNCi0JCQkvL2l0J3MgdGhlIGljb24gcGF0aA0KLQkJCWlmIChjb3VudGVyIDwgMikNCi0JCQl7DQotCQkJCWlmIChjb3VudGVyID4gMCkNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsgIiAmZ3Q7ICI7DQotCQkJCX0NCi0NCi0JCQkJLy9hbGVydCgiQ2FsY3VsYXRpbmcgcGF0aCBmcm9tKDEpICIgKyB0aGlzUGFnZSArICIgPT4gIiArIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotDQotCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiXFwiKSA9PSAtMSAmJiBhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiLyIpID09IC0xKQ0KLQkJCQl7DQotCQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldICE9ICJudWxsIikNCi0JCQkJCXsNCi0JCQkJCQl0aGVSZWxQYXRoID0gImFwcGxldC9pbWFnZXMvIiArIGFycmF5RnJvbVN0cmluZ1tpXTsNCi0JCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCB0aGVSZWxQYXRoKTsNCi0JCQkJCX0NCi0JCQkJCS8vYWxlcnQoIk1vZGlmeWluZyBQYXRoID0+ICIgKyB0aGVSZWxQYXRoKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCX0NCi0NCi0JCQkJaWYgKHRoZVJlbFBhdGggIT0gIm51bGwiKQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJCSAiPGltZyBib3JkZXI9MCBzcmM9XCIiICsNCi0JCQkJCQkgdGhlUmVsUGF0aCAgKw0KLQkJCQkJCSAiXCI+IjsNCi0JCQkJfQ0KLQ0KLQkJCQkvL2FsZXJ0KCJ0aGUgY3VyciBwYXRoPT4iICsgdGhlTG9jKTsNCi0JCQkJY291bnRlciA9IDI7DQotCQkJfQ0KLQkJCS8vIGl0J3MgdGhlIGxhYmVsDQotCQkJZWxzZSBpZiAoY291bnRlciA9PSAyKQ0KLQkJCXsNCi0JCQkJdGhlTGFiZWwgPSBhcnJheUZyb21TdHJpbmdbaV07DQotCQkJCWNvdW50ZXIgPSAzOw0KLQkJCX0NCi0JCQllbHNlIGlmIChjb3VudGVyID09IDMpDQotCQkJew0KLQkJCQkvL2FsZXJ0KCJDYWxjdWxhdGluZyBwYXRoIGZyb20oMykgIiArIHRoaXNQYWdlICsgIiA9PiAiICsgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXSAhPSAibnVsbCIpDQotCQkJCXsNCi0JCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCQlpZiAodGhlUmVsUGF0aCAhPSAiIikgew0KLQkJCQkJCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkgCQkiPGEgY2xhc3M9XCJob3R0ZXh0XCIgdGFyZ2V0PVwib3J5X2RvY1wiIGhyZWY9XCIiICsNCi0JCQkJCQkJIHRoZVJlbFBhdGggKw0KLQkJCQkJIAkJIlwiPiIgKw0KLQkJCQkJIAkJdGhlTGFiZWwgKw0KLQkJCQkJIAkJIjxcL2E+XG4iOw0KLQkJCQkJIH0NCi0JCQkJCSBlbHNlIHsNCi0JCQkJCSAJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJCSI8YSBjbGFzcz1cImhvdHRleHRcIj4iICArDQotCQkJCQkgCQl0aGVMYWJlbCArDQotCQkJCQkgCQkiPFwvYT5cbiI7DQotCQkJCQkgfQ0KLQkJCQl9DQotCQkJCWVsc2UNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJIjxhIGNsYXNzPVwiaG90dGV4dFwiPiIgICsNCi0JCQkJCSAJdGhlTGFiZWwgKw0KLQkJCQkJIAkiPFwvYT5cbiI7DQotCQkJCX0NCi0JCQkJLy9hbGVydCgidGhlIGN1cnIgcGF0aD0+IiArIHRoZUxvYyk7DQotCQkJCWNvdW50ZXIgPSAxOw0KLQkJCQl0aGVSZWxQYXRoID0gIm51bGwiOw0KLQkJCQl0aGVMYWJlbCA9ICJudWxsIjsNCi0JCQl9DQotCQkgICB9DQotDQotCQkvL2FsZXJ0KCJGaW5pc2hlZCBCdWlsZGluZyA9PiAiICsgdGhlTG9jKTsNCi0JCX0NCi0NCi0JfQ0KLQ0KLQkvL3RoZUxvYyA9ICJDdXJyZW50IExvY2F0aW9uJm5ic3A7JiMwNDU7Jm5ic3A7IiArIHRoZUxvYzsNCi0NCi0JLy9hbGVydCgidGhlIEZpbmFsIFN0cmluZz0+IiArIHRoZUxvYyk7DQotDQotCS8vZG9jdW1lbnQud3JpdGUodGhlTG9jKTsNCi0JcmV0dXJuIHRoZUxvYzsNCi0NCi19DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl96aF9DTi5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXZfemhfQ04uanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZjY5NzcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl96aF9DTi5qcworKysgL2Rldi9udWxsCkBAIC0xLDc4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBtZXNzYWdlcyB0byBiZSBleHRlcm5pemVkDQotLy8gaGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLQ0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTEgPSAi6L+Y5pyq6KOF5YWlIFRyZWVCcm93c2XvvIFcbuivt+etieW+he+8gSI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMiA9ICLmraTpobXpnaLmsqHmnInigJx7MH3igJ3pobXpnaLjgIJcbuivt+WwneivleWPpuS4gOS4quWvvOiIquaMiemSruOAgiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMyA9ICLml6AgezB9IOmhtemdou+8gSI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3ByZXYgPSAi5LiK5LiA5LiqIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0VfbmV4dCA9ICLkuIvkuIDkuKoiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV91cCA9ICLlkJHkuIoiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTQgPSAi5b2T5YmN5paH5Lu25LiN5Zyo5qCR5b2i5rWP6KeI5Zmo5Lit44CCIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0U1ID0gIuWPkeW4g+eahOermeeCueW3suS9v+eUqOahhuaetuadpeaYvuekuiI7DQotDQotZnVuY3Rpb24gZm9ybWF0U3RyaW5nKG1lc3NhZ2UsIHJlcGxhY2UwKQ0KLXsNCi0gICAJcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgvXHswXH0vLCByZXBsYWNlMCk7DQotfSANCi0NCi0vLyB0aGlzIHNjcmlwdCBpcyBmb3IgdGhlIHRvcG5hdi5odG1sDQotLy8gdGhpcyBpcyBOT1QgZm9yIGdlbmVyYWwgdXNlDQotTVNGUGhvdmVyID0NCi0oKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTmV0c2NhcGUiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSAzICkpIHx8DQotICAoKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSAmJg0KLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpKTsNCi0NCi0gIGZ1bmN0aW9uIE1TRlBwcmVsb2FkKGltZykNCi0gIHsNCi0gICAgIHZhciBhPW5ldyBJbWFnZSgpOw0KLSAgICAgYS5zcmM9aW1nOw0KLSAgICAgcmV0dXJuIGE7DQotICB9DQotICANCi12YXIgdG91ciA9IDA7DQotDQotZnVuY3Rpb24gb3BlbkZpcnN0VG91ciAoKQ0KLS8vIG9wZW4gdGhlIGd1aWRlZCB0b3VyIC9oYWFrYW4gOTkwMzI0DQotew0KLWlmKCF0b3VyIHx8IHRvdXI9PW51bGwgfHwgdG91ci5jbG9zZWQpDQotICAgIHsNCi0gICAgICB0b3VyID0gb3BlbigiLi90b3VyL3RvdXIuaHRtIiwidG91cl9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM1MCxoZWlnaHQ9NzAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5Ub3VyICgpDQotLy8gb3BlbiB0aGUgZ3VpZGVkIHRvdXIgL2hhYWthbiA5OTAzMjQNCi17DQotaWYoIXRvdXIgfHwgdG91cj09bnVsbCB8fCB0b3VyLmNsb3NlZCkNCi0gICAgew0KLSAgICAgIHRvdXIgPSBvcGVuKCIuL3RvdXIvdG91ci5odG0iLCJ0b3VyX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9MzUwLGhlaWdodD03MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotLy9BZGRpdGlvbiBieSBDaGluaCBWbyAwMy8yOC8wMA0KLSBmdW5jdGlvbiBkaXNwbGF5R2V0dGluZ1N0YXJ0ZWQoKQ0KLSB7DQotIAl2YXIgcGFnZVBhdHRlcm4gPSAvb3Z1X3Byb2MvOw0KLSAJdmFyIG1haW5QYWdlID0gd2luZG93LnBhcmVudC5vcnlfZG9jLmxvY2F0aW9uOw0KLQ0KLSAJaWYgKCBwYWdlUGF0dGVybi50ZXN0KCBtYWluUGFnZSApICkgew0KLSAgICAJaWYgKGdldENvb2tpZSgiUlVQIikgIT0gImNoZWNrZWQiKSB7IG9wZW5GaXJzdFRvdXIoKTsgfQ0KLQl9DQotCWVsc2Ugew0KLQkJc2V0VGltZW91dCggImRpc3BsYXlHZXR0aW5nU3RhcnRlZCgpIiwgMTAwMCApOw0KLQl9DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldENvb2tpZSAobmFtZSkNCi17DQotICB2YXIgZGNvb2tpZSA9IGRvY3VtZW50LmNvb2tpZTsNCi0gIHZhciBjbmFtZSA9IG5hbWUgKyAiPSI7DQotICB2YXIgY2xlbiA9IGRjb29raWUubGVuZ3RoOw0KLSAgdmFyIGNiZWdpbiA9IDA7DQotICB3aGlsZSAoY2JlZ2luIDwgY2xlbikNCi0gIHsNCi0gICAgdmFyIHZiZWdpbiA9IGNiZWdpbiArIGNuYW1lLmxlbmd0aDsNCi0gICAgaWYgKGRjb29raWUuc3Vic3RyaW5nKGNiZWdpbiwgdmJlZ2luKSA9PSBjbmFtZSkNCi0gICAgew0KLSAgICAgIHZhciB2ZW5kID0gZGNvb2tpZS5pbmRleE9mICgiOyIsIHZiZWdpbik7DQotICAgICAgaWYgKHZlbmQgPT0gLTEpDQotICAgICAgew0KLSAgICAgICAgdmVuZCA9IGNsZW47DQotICAgICAgfQ0KLSAgICAgIHJldHVybiB1bmVzY2FwZShkY29va2llLnN1YnN0cmluZyh2YmVnaW4sIHZlbmQpKTsNCi0gICAgfQ0KLSAgICBjYmVnaW4gPSBkY29va2llLmluZGV4T2YoIiAiLCBjYmVnaW4pICsgMTsNCi0gICAgaWYgKGNiZWdpbiA9PSAwKQ0KLSAgICB7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0gIH0NCi0gIHJldHVybiBudWxsOw0KLSB9DQotDQotDQotICB2YXIgaW5kZXg9bnVsbDsNCi0gIHZhciB0b3VyPW51bGw7DQotICB2YXIgc2VhcmNoPW51bGw7DQotICB2YXIgZ2xvc3Nhcnk9bnVsbDsNCi0gIHZhciBmZWVkYmFjaz1udWxsOw0KLSAgdmFyIHRyZWVMb2FkZWQ9ZmFsc2U7DQotICBmdW5jdGlvbiBjaGVja1RyZWVMb2FkZWQoKQ0KLSAgew0KLSAgICBpZih0cmVlTG9hZGVkKQ0KLSAgICB7DQotICAgICAgcmV0dXJuIHRyZWVMb2FkZWQ7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgIGlmKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldCAhPSBudWxsDQotICAgICAgICAmJiBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeSgpKQ0KLSAgICAgew0KLSAgICAgICB0cmVlTG9hZGVkID0gdHJ1ZTsNCi0gICAgIH0NCi0gICAgICovDQotICAgICBpZihwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQgIT0gbnVsbCkNCi0gICAgIHsNCi0gICAgICAJdmFyIG1ldGhvZCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeTsNCi0JIGlmIChtZXRob2QgIT0gInVuZGVmaW5lZCIpIHsNCi0JCWlmIChwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeSgpKQ0KLQkJew0KLSAgICAgICAJCQl0cmVlTG9hZGVkID0gdHJ1ZTsNCi0JCX0NCi0NCi0JICB9DQotDQotICAgICB9DQotDQotICAgICByZXR1cm4gdHJlZUxvYWRlZDsNCi0gICB9DQotDQotDQotICAgIGZ1bmN0aW9uIHNob3dBbGVydE5vdExvYWRlZCgpDQotICAgIHsNCi0gICAgICBhbGVydCh0b3BuYXZfanNfTUVTU0FHRTEpOw0KLSAgICB9DQotDQotZnVuY3Rpb24gc2hvd1N0YXR1c05vdExvYWRlZCgpDQotICB7DQotICAgIC8vcmV0dXJuICJUaGUgVHJlZUJyb3dzZSBpcyBub3QgeWV0IGxvYWRlZCFcblBsZWFzZSB3YWl0ISI7DQotICAgIHJldHVybiB0b3BuYXZfanNfTUVTU0FHRTE7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93QWxlcnROb1BhZ2UodGV4dCkNCi0gIHsNCi0gICAgIHZhciBwYXJlbnRMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYocGFyZW50TGFiZWwhPSIiICYmIHBhcmVudExhYmVsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICAgICAvL2FsZXJ0KCJUaGVyZSBpcyBubyAnIiArIHRleHQgKyAiJyBwYWdlIGZvciB0aGlzIHBhZ2UuXG5Ucnkgb25lIG9mIHRoZSBvdGhlciBuYXZpZ2F0aW9uIGJ1dHRvbnMuIik7DQotICAgICAgICAgIGFsZXJ0KGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTIsIHRleHQpKTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgICAvL2FsZXJ0KCJUaGVyZSBpcyBubyAnIiArIHRleHQgKyAiJyBwYWdlIGZvciB0aGlzIHBhZ2UuXG5Ucnkgb25lIG9mIHRoZSBvdGhlciBuYXZpZ2F0aW9uIGJ1dHRvbnMiKTsNCi0gICAgICAgICBhbGVydChmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UyLCB0ZXh0KSk7DQotICAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93U3RhdHVzTm9QYWdlKHRleHQpDQotICB7DQotDQotICAgICB2YXIgcGFyZW50TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIHZhciBtc2c7DQotICAgICBpZihwYXJlbnRMYWJlbCE9IiIgJiYgcGFyZW50TGFiZWwhPW51bGwpDQotICAgICB7DQotICAgICAgICAvL21zZyA9ICJUaGVyZSBpcyBubyAiICsgdGV4dCArICIgcGFnZSEiOw0KLSAgICAgICAgbXNnID0gZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMywgdGV4dCk7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICAvL21zZyA9ICJUaGVyZSBpcyBubyAiICsgdGV4dCArICIgcGFnZSEiOw0KLSAgICAgICAgbXNnID0gZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMywgdGV4dCk7DQotICAgICB9DQotDQotICAgICByZXR1cm4gbXNnOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1BhcmVudExhYmVsKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgcGFyZW50dXJsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIHBhcmVudHVybCE9IiIgJiYgcGFyZW50dXJsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb1BhZ2UoInVwIik7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd0hvbWVMYWJlbCgpDQotICB7DQotICAgIHNlbGYuc3RhdHVzID0gIkhvbWUiOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1ByZXZpb3VzTGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c0xhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgdmFyIHByZXZ1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKGxhYmVsIT0iIiAmJiBsYWJlbCE9bnVsbCAmJiBwcmV2dXJsIT0iIiAmJiBwcmV2dXJsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm9QYWdlKCJwcmV2aW91cyIpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm90TG9hZGVkKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dOZXh0TGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgbmV4dHVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIG5leHR1cmwhPSIiICYmIG5leHR1cmwhPW51bGwpDQotICAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsNCi0gICAgICB9DQotICAgICAgZWxzZQ0KLSAgICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb1BhZ2UoIm5leHQiKTsNCi0gICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZFByZXZpb3VzKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c0xhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0NCi0JaWYgKChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKT09LTEpICYmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKT09LTEpKQ0KLQl7DQotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpIT0tMSkNCi0Jew0KLQkgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRBcHBsZXRQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCk7DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQ0KLQl7DQotCQluZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRIdHRwUGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwsICJQcmV2aW91cyIpOw0KLQl9DQotCSAgICAgIAlwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV9wcmV2KTsNCi0gICAgIH0NCi0gICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZE5leHQoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0NCi0JaWYgKChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKT09LTEpICYmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKT09LTEpKQ0KLQl7DQotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpIT0tMSkNCi0Jew0KLQkgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRBcHBsZXRQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCk7DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQ0KLQl7DQotCQluZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRIdHRwUGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwsICJOZXh0Iik7DQotCX0NCi0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLQ0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX25leHQpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotDQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkUGFyZW50KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfdXApOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLWZ1bmN0aW9uIHdoZXJlQW1JKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0JdmFyIHN0YXR1cyA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgIAlpZiggc3RhdHVzID09IGZhbHNlICkNCi0Jew0KLQkJYWxlcnQoIHRvcG5hdl9qc19NRVNTQUdFNCApOw0KLQl9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHVwQXJyb3coKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS51cEFycm93KCk7DQotICAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGRvd25BcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmRvd25BcnJvdygpOw0KLSAgICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgICB7DQotICAgICAgIHBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotICAgICAgfQ0KLQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICAgIGZ1bmN0aW9uIGxlZnRBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUubGVmdEFycm93KCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gICAgZnVuY3Rpb24gcmlnaHRBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUucmlnaHRBcnJvdygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotDQotZnVuY3Rpb24gbG9hZFRvcCgpDQotew0KLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIpDQotICB7DQotICAgICBhbGVydCh0b3BuYXZfanNfTUVTU0FHRTUpOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICB2YXIgZXhwaXJlcyA9IG5ldyBEYXRlKCk7DQotICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7DQotICAgIGRvY3VtZW50LmNvb2tpZSA9ICJydXBfb3J5X2RvYz0iICsgZXNjYXBlIChkb2N1bWVudC5VUkwpICsNCi0gICAgIjsgZXhwaXJlcz0iICsgZXhwaXJlcy50b1VUQ1N0cmluZygpICsgICI7IHBhdGg9LyI7DQotDQotICAgIHZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOw0KLQ0KLSAgICBmb3IoaT1kb2N1bWVudC5saW5rcy5sZW5ndGgtMTtpPj0wO2ktLSkNCi0gICAgew0KLSAgICAgICBpZihkb2N1bWVudC5saW5rc1tpXS5ocmVmLmluZGV4T2YoImluZGV4Lmh0bSIpIT0tMSkNCi0gICAgICAgew0KLSAgICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IGRvY3VtZW50LmxpbmtzW2ldLmhyZWY7DQotICAgICAgICAgYnJlYWs7DQotICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpDQotICAgIHsNCi0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQ0KLQl7DQotCQl3aW5kb3cuY2xvc2UoKTsNCi0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JICAgICAgIAl0b3AubG9jYXRpb24gPSBuZXdfb3J5X2RvY19sb2M7DQotCX0NCi0gICAgfQ0KLSAgIH0NCi19DQotDQotDQotZnVuY3Rpb24gb3Blbk9yeSAocGFnZSwgdGFyZ2V0KQ0KLXsNCi0gICAgaWYoIWluZGV4IHx8IGluZGV4LmNsb3NlZCkNCi0gICAgew0KLSAgICAgIGluZGV4ID0gb3BlbihwYWdlLHRhcmdldCwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM5NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBpbmRleC5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5TZWFyY2goKQ0KLXsNCi0gICAgaWYoIXNlYXJjaCB8fCBzZWFyY2guY2xvc2VkKQ0KLSAgICB7DQotICAgICAgc2VhcmNoID0gb3BlbigiLi9hcHBsZXQvc2VhcmNoLmh0bSIsInNlYXJjaF9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9bm8sd2lkdGg9NjMwLGhlaWdodD00NTAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNlYXJjaC5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5JbmRleCgpDQotew0KLSAgIG9wZW5PcnkoIi4vaW5kZXgvaW5kZXguaHRtIiwiaW5kZXhfd2luIik7DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5HbG9zc2FyeSgpDQotew0KLSBpZighZ2xvc3NhcnkgfHwgZ2xvc3NhcnkuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgZ2xvc3NhcnkgPSBvcGVuKCIuL3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXguaHRtIiwiZ2xvc3Nhcnlfd2luIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM4NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBnbG9zc2FyeS5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIHByaW50UGFnZSgpDQotew0KLSBwYXJlbnQub3J5X2RvYy5mb2N1cygpOw0KLSBwYXJlbnQub3J5X2RvYy5wcmludCgpOw0KLX0NCi0NCi0NCi1mdW5jdGlvbiBzZW5kRmVlZGJhY2sodXJsKQ0KLXsNCi0JaWYgKCB1cmwgPT0gbnVsbCB8fCB1cmwgPT0gJycgKQ0KLQl7DQotCQlyZXR1cm47DQotCX0NCi0JDQotCWlmICggdXJsLmluZGV4T2YoIm1haWx0bzoiKSA+PSAwICkNCi0Jew0KLQkJc2VuZG1haWwodXJsKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCQ0KLSAJICAgIGlmKCFmZWVkYmFjayB8fCBmZWVkYmFjay5jbG9zZWQpDQotCSAgICB7DQotCSAgICAgIGZlZWRiYWNrID0gb3Blbih1cmwsImZlZWRiYWNrX3dpbiIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD02MDAsaGVpZ2h0PTUwMCxyZXNpemFibGU9eWVzIik7DQotCSAgICB9DQotCSAgICBlbHNlDQotCSAgICB7DQotCSAgICAgIGZlZWRiYWNrLmZvY3VzKCk7DQotCSAgICB9DQotICAgIAl9DQotICAgIAkNCi19DQotDQotDQotZnVuY3Rpb24gc2VuZG1haWwodXJsKQ0KLXsNCi0JaWYgKCB1cmwuaW5kZXhPZigiP3N1YmplY3QiKSA9PSAtMSApDQotCXsNCi0JCXZhciBsaW5rPXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uOw0KLQkJdXJsID0gdXJsICsgJz9zdWJqZWN0PUZlZWRiYWNrOiAtICcrbGluazsNCi0JfQ0KLQlsb2NhdGlvbi5yZXBsYWNlKHVybCk7DQotfQ0KLQ0KLS8vY2FsY3VsYXRlcyByZWxhdGl2ZSBwYXRoDQotLy9wYXRoIG11c3QgYmUgYWxsIHJlbGF0aXZlIGZyb20gd2Vic2l0ZSBiYXNlIG9yIGNvbnRhaW4gZnVsbCB1cmxzDQotZnVuY3Rpb24gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHNvdXJjZVBhdGgsIHRhcmdldFBhdGgpDQotew0KLQlpZiAodGFyZ2V0UGF0aC5pbmRleE9mKCJodHRwOi8iKSAhPSAtMSkNCi0Jew0KLQkJcmV0dXJuIHRhcmdldFBhdGg7DQotCX0NCi0NCi0JLy9yZXBsYWNlIGFsbCAnXCcgd2l0aCAnLycNCi0Jc291cmNlUGF0aCA9IHNvdXJjZVBhdGgucmVwbGFjZSgvXFwvZywiJDEvJDIiKTsNCi0JdGFyZ2V0UGF0aCA9IHRhcmdldFBhdGgucmVwbGFjZSgvXFwvZywiLyIpOw0KLQ0KLQkvL2FsZXJ0KCJSZXBsYWNlKFNvdXJjZSk9PiIgKyBzb3VyY2VQYXRoKTsNCi0JLy9hbGVydCgiUmVwbGFjZSh0YXJnZXQpPT4iICsgdGFyZ2V0UGF0aCk7DQotDQotDQotCXNvdXJjZUFycmF5ID0gc291cmNlUGF0aC5zcGxpdCgiLyIpOw0KLQl0YXJnZXRBcnJheSA9IHRhcmdldFBhdGguc3BsaXQoIi8iKTsNCi0NCi0JdmFyIHRoZVJlbFBhdGggPSAiIjsNCi0NCi0JLy9sb29wIHVudGlsIHdlIGZpbmQgYSBkaWZmZXJlbmNlDQotCXZhciBpZHggPSAwOw0KLQlmb3IoaWR4ID0gMDsgaWR4IDwgc291cmNlQXJyYXkubGVuZ3RoOyBpZHgrKykNCi0Jew0KLQkJaWYgKGlkeCA+IHRhcmdldFBhdGgubGVuZ3RoKQ0KLQkJew0KLQkJCWJyZWFrOw0KLQkJfQ0KLQ0KLQkJaWYgKHNvdXJjZUFycmF5W2lkeF0gIT0gdGFyZ2V0QXJyYXlbaWR4XSkNCi0JCXsNCi0JCQlicmVhazsNCi0JCX0NCi0JfQ0KLQ0KLQkvL2FwcGVuZCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIC4vDQotCXZhciBtYXhJZHggPSBzb3VyY2VBcnJheS5sZW5ndGggLSAxOw0KLQlmb3IgKHZhciBpID0gaWR4OyBpIDwgbWF4SWR4OyBpKyspDQotCXsNCi0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoICsgIi4vIjsNCi0NCi0JCS8vYWxlcnQoIlJlbFBhdGg9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL2FwcGVuZCBhbnkgcmVtYWluaW5nIHRhcmdldCBwYXRoDQotCXdoaWxlKGlkeCA8IHRhcmdldEFycmF5Lmxlbmd0aCkNCi0Jew0KLQkJdGhlUmVsUGF0aCA9IHRoZVJlbFBhdGggKyB0YXJnZXRBcnJheVtpZHgrK10gKyAiLyI7DQotCQkvL2FsZXJ0KCJSZWxQYXRoKGZpbmFsKT0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vcmVtb3ZlIHRoZSBsYXN0IHBhdGggc2VwYXJhdG9yDQotCWlmICh0aGVSZWxQYXRoLmxlbmd0aCA+IDApDQotCXsNCi0JCS8vYWxlcnQoIlJlbFBhdGgoVHJpbTEpPT4iICsgdGhlUmVsUGF0aCk7DQotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aC5zdWJzdHJpbmcoMCwgKHRoZVJlbFBhdGgubGVuZ3RoIC0gMSkpOw0KLQkJLy9hbGVydCgiUmVsUGF0aChUcmltMSk9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL2FsZXJ0KCJSZXR1cm4gUmVsYXRpdmUgUGF0aCA9PiAiICsgdGhlUmVsUGF0aCk7DQotDQotCXJldHVybiB0aGVSZWxQYXRoOw0KLX0NCi0NCi1mdW5jdGlvbiBnZXRUcmVlUGF0aCgpDQotew0KLQlyZXR1cm4gYnVpbGRUcmVlUGF0aExvY2F0aW9uKCk7DQotfQ0KLQ0KLS8vVGhpcyBtZXRob2Qgd2lsbCByZW1vdmUgdGhlIHdlYnNpdGUgYmFzZSBmcm9tIHRoZSB1cmwNCi1mdW5jdGlvbiBjYWxjdWxhdEN1cnJlbnRQYWdlKGN1cnJVUkwpIHsNCi0NCi0JdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7DQotCS8vcmVwbGFjZSBhbGwgJ1wnIHdpdGggJy8nDQotCXRoZUN1cnJlbnRMb2NhdGlvbiA9IHRoZUN1cnJlbnRMb2NhdGlvbi5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQljdXJyVVJMID0gY3VyclVSTC5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQ0KLQl2YXIgc291cmNlQXJyYXkgPSB0aGVDdXJyZW50TG9jYXRpb24uc3BsaXQoIi8iKTsNCi0JdmFyIGN1cnJBcnJheSA9IGN1cnJVUkwuc3BsaXQoIi8iKTsNCi0NCi0JdmFyIG51bVRvUmVtb3ZlID0gc291cmNlQXJyYXkubGVuZ3RoIC0gMjsNCi0JdmFyIGlkeCA9IDA7DQotCXZhciB0aGVSZXR1cm5QYXRoID0gIiI7DQotCWZvciAoaWR4ID0gbnVtVG9SZW1vdmU7IGlkeCA8IGN1cnJBcnJheS5sZW5ndGg7IGlkeCsrKSB7DQotCQlpZiAodGhlUmV0dXJuUGF0aCAhPSAiIikgew0KLQkJCXRoZVJldHVyblBhdGggPSB0aGVSZXR1cm5QYXRoICsgIi8iOw0KLQkJfQ0KLQkJdGhlUmV0dXJuUGF0aCA9IHRoZVJldHVyblBhdGggKyBjdXJyQXJyYXlbaWR4XTsNCi0JfQ0KLQ0KLQkvL2FsZXJ0KCJBcnJheVRlc3Q9PiIgKyBjdXJyVVJMICsgIiwiICsgdGhlUmV0dXJuUGF0aCk7DQotCXJldHVybiB0aGVSZXR1cm5QYXRoOw0KLX0NCi0NCi0vL2J1aWxkcyB0cmVlIHBhdGgNCi1mdW5jdGlvbiBidWlsZFRyZWVQYXRoTG9jYXRpb24oKQ0KLXsNCi0JdmFyIHRoZURlbGltaXRlciA9ICIjIyoiOw0KLQl2YXIgdGhpc1BhZ2UgPSAiYXBwbGV0L3J1cF90b3BuYXYuaHRtIjsNCi0JdmFyIHRoZUxvYyA9ICIiOw0KLQ0KLQ0KLQ0KLQlpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0Jew0KLQkJdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY7DQotCQl0aGlzUGFnZSA9IGNhbGN1bGF0Q3VycmVudFBhZ2UodGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCS8vYWxlcnQoIlBhdGhOYW1lOiIgKyB0aGlzUGFnZSk7DQotDQotCQkvL2FsZXJ0KCJUcnlpbmcgdG8gZmluZCB0aGUgcGF0aCBmb3IgPT4iICsgdGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCXZhciB0aGVQYXRoID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmdldFRyZWVQYXRoQXJyYXkodGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCS8vYWxlcnQoIlRoZSBUcmVlIFBhdGg6ICIgKyB0aGVQYXRoKTsNCi0NCi0JCXRoZVBhdGhTdHJpbmcgPSB0aGVQYXRoICsgIiI7DQotICAgIAkJYXJyYXlGcm9tU3RyaW5nID0gdGhlUGF0aFN0cmluZy5zcGxpdCh0aGVEZWxpbWl0ZXIpOw0KLQ0KLQkJLy9idWlsZCB0aGUgcGF0aCBmcm9tIHRoZSBhcnJheQ0KLQkJLy9wYXJhbSAxID0gcGF0aCB0byBpY29uLCBwYXJhbSAyIC0gbGFiZWwsIHBhcmFtIDMgLSBwYXRoIHRvIGZpbGUNCi0JCXZhciBjb3VudGVyID0gMDsNCi0JCXZhciB0aGVMYWJlbDsNCi0JCXZhciB0aGVSZWxQYXRoOw0KLQkJaWYgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggPiAyKQ0KLQkJew0KLQkJICAgdGhlTG9jID0gIiI7DQotCQkgICBmb3IodmFyIGkgPSAwOyBpIDwgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggLSAxKSA7IGkrKykNCi0JCSAgIHsNCi0JCQkvL2l0J3MgdGhlIGljb24gcGF0aA0KLQkJCWlmIChjb3VudGVyIDwgMikNCi0JCQl7DQotCQkJCWlmIChjb3VudGVyID4gMCkNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsgIiAmZ3Q7ICI7DQotCQkJCX0NCi0NCi0JCQkJLy9hbGVydCgiQ2FsY3VsYXRpbmcgcGF0aCBmcm9tKDEpICIgKyB0aGlzUGFnZSArICIgPT4gIiArIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotDQotCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiXFwiKSA9PSAtMSAmJiBhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiLyIpID09IC0xKQ0KLQkJCQl7DQotCQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldICE9ICJudWxsIikNCi0JCQkJCXsNCi0JCQkJCQl0aGVSZWxQYXRoID0gImFwcGxldC9pbWFnZXMvIiArIGFycmF5RnJvbVN0cmluZ1tpXTsNCi0JCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCB0aGVSZWxQYXRoKTsNCi0JCQkJCX0NCi0JCQkJCS8vYWxlcnQoIk1vZGlmeWluZyBQYXRoID0+ICIgKyB0aGVSZWxQYXRoKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCX0NCi0NCi0JCQkJaWYgKHRoZVJlbFBhdGggIT0gIm51bGwiKQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJCSAiPGltZyBib3JkZXI9MCBzcmM9XCIiICsNCi0JCQkJCQkgdGhlUmVsUGF0aCAgKw0KLQkJCQkJCSAiXCI+IjsNCi0JCQkJfQ0KLQ0KLQkJCQkvL2FsZXJ0KCJ0aGUgY3VyciBwYXRoPT4iICsgdGhlTG9jKTsNCi0JCQkJY291bnRlciA9IDI7DQotCQkJfQ0KLQkJCS8vIGl0J3MgdGhlIGxhYmVsDQotCQkJZWxzZSBpZiAoY291bnRlciA9PSAyKQ0KLQkJCXsNCi0JCQkJdGhlTGFiZWwgPSBhcnJheUZyb21TdHJpbmdbaV07DQotCQkJCWNvdW50ZXIgPSAzOw0KLQkJCX0NCi0JCQllbHNlIGlmIChjb3VudGVyID09IDMpDQotCQkJew0KLQkJCQkvL2FsZXJ0KCJDYWxjdWxhdGluZyBwYXRoIGZyb20oMykgIiArIHRoaXNQYWdlICsgIiA9PiAiICsgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXSAhPSAibnVsbCIpDQotCQkJCXsNCi0JCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCQlpZiAodGhlUmVsUGF0aCAhPSAiIikgew0KLQkJCQkJCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkgCQkiPGEgY2xhc3M9XCJob3R0ZXh0XCIgdGFyZ2V0PVwib3J5X2RvY1wiIGhyZWY9XCIiICsNCi0JCQkJCQkJIHRoZVJlbFBhdGggKw0KLQkJCQkJIAkJIlwiPiIgKw0KLQkJCQkJIAkJdGhlTGFiZWwgKw0KLQkJCQkJIAkJIjxcL2E+XG4iOw0KLQkJCQkJIH0NCi0JCQkJCSBlbHNlIHsNCi0JCQkJCSAJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJCSI8YSBjbGFzcz1cImhvdHRleHRcIj4iICArDQotCQkJCQkgCQl0aGVMYWJlbCArDQotCQkJCQkgCQkiPFwvYT5cbiI7DQotCQkJCQkgfQ0KLQkJCQl9DQotCQkJCWVsc2UNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJIjxhIGNsYXNzPVwiaG90dGV4dFwiPiIgICsNCi0JCQkJCSAJdGhlTGFiZWwgKw0KLQkJCQkJIAkiPFwvYT5cbiI7DQotCQkJCX0NCi0JCQkJLy9hbGVydCgidGhlIGN1cnIgcGF0aD0+IiArIHRoZUxvYyk7DQotCQkJCWNvdW50ZXIgPSAxOw0KLQkJCQl0aGVSZWxQYXRoID0gIm51bGwiOw0KLQkJCQl0aGVMYWJlbCA9ICJudWxsIjsNCi0JCQl9DQotCQkgICB9DQotDQotCQkvL2FsZXJ0KCJGaW5pc2hlZCBCdWlsZGluZyA9PiAiICsgdGhlTG9jKTsNCi0JCX0NCi0NCi0JfQ0KLQ0KLQkvL3RoZUxvYyA9ICJDdXJyZW50IExvY2F0aW9uJm5ic3A7JiMwNDU7Jm5ic3A7IiArIHRoZUxvYzsNCi0NCi0JLy9hbGVydCgidGhlIEZpbmFsIFN0cmluZz0+IiArIHRoZUxvYyk7DQotDQotCS8vZG9jdW1lbnQud3JpdGUodGhlTG9jKTsNCi0JcmV0dXJuIHRoZUxvYzsNCi0NCi19DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl96aF9UVy5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXZfemhfVFcuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NjJkOTguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl96aF9UVy5qcworKysgL2Rldi9udWxsCkBAIC0xLDc4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBtZXNzYWdlcyB0byBiZSBleHRlcm5pemVkDQotLy8gaGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLQ0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTEgPSAi5bCa5pyq6LyJ5YWlIFRyZWVCcm93c2XvvIFcbuiri+eojeWAme+8gSI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMiA9ICLmraTpoIHpnaLmspLmnIkgJ3swfScg6aCB44CCXG7oq4vlmJfoqablhbbku5blsI7opr3mjInpiJXjgIIiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTMgPSAi5rKS5pyJezB96aCB6Z2i77yBIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0VfcHJldiA9ICLkuIrkuIDpoIEiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV9uZXh0ID0gIuS4i+S4gOmggSI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3VwID0gIuWQkeS4iiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFNCA9ICLnj77ooYzmqpTmoYjkuI3lnKjmqLnni4DngI/opr3lmajkuK3jgIIiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTUgPSAi5bey5L2/55So6aCB5qGG5L6G6aGv56S655m85L2I55qE56uZ5Y+wIjsNCi0NCi1mdW5jdGlvbiBmb3JtYXRTdHJpbmcobWVzc2FnZSwgcmVwbGFjZTApDQotew0KLSAgIAlyZXR1cm4gbWVzc2FnZS5yZXBsYWNlKC9cezBcfS8sIHJlcGxhY2UwKTsNCi19IA0KLQ0KLS8vIHRoaXMgc2NyaXB0IGlzIGZvciB0aGUgdG9wbmF2Lmh0bWwNCi0vLyB0aGlzIGlzIE5PVCBmb3IgZ2VuZXJhbCB1c2UNCi1NU0ZQaG92ZXIgPQ0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwNCi0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOw0KLQ0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQ0KLSAgew0KLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7DQotICAgICBhLnNyYz1pbWc7DQotICAgICByZXR1cm4gYTsNCi0gIH0NCi0gIA0KLXZhciB0b3VyID0gMDsNCi0NCi1mdW5jdGlvbiBvcGVuRmlyc3RUb3VyICgpDQotLy8gb3BlbiB0aGUgZ3VpZGVkIHRvdXIgL2hhYWthbiA5OTAzMjQNCi17DQotaWYoIXRvdXIgfHwgdG91cj09bnVsbCB8fCB0b3VyLmNsb3NlZCkNCi0gICAgew0KLSAgICAgIHRvdXIgPSBvcGVuKCIuL3RvdXIvdG91ci5odG0iLCJ0b3VyX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9MzUwLGhlaWdodD03MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlblRvdXIgKCkNCi0vLyBvcGVuIHRoZSBndWlkZWQgdG91ciAvaGFha2FuIDk5MDMyNA0KLXsNCi1pZighdG91ciB8fCB0b3VyPT1udWxsIHx8IHRvdXIuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgdG91ciA9IG9wZW4oIi4vdG91ci90b3VyLmh0bSIsInRvdXJfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zNTAsaGVpZ2h0PTcwMCxyZXNpemFibGU9eWVzIik7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi0vL0FkZGl0aW9uIGJ5IENoaW5oIFZvIDAzLzI4LzAwDQotIGZ1bmN0aW9uIGRpc3BsYXlHZXR0aW5nU3RhcnRlZCgpDQotIHsNCi0gCXZhciBwYWdlUGF0dGVybiA9IC9vdnVfcHJvYy87DQotIAl2YXIgbWFpblBhZ2UgPSB3aW5kb3cucGFyZW50Lm9yeV9kb2MubG9jYXRpb247DQotDQotIAlpZiAoIHBhZ2VQYXR0ZXJuLnRlc3QoIG1haW5QYWdlICkgKSB7DQotICAgIAlpZiAoZ2V0Q29va2llKCJSVVAiKSAhPSAiY2hlY2tlZCIpIHsgb3BlbkZpcnN0VG91cigpOyB9DQotCX0NCi0JZWxzZSB7DQotCQlzZXRUaW1lb3V0KCAiZGlzcGxheUdldHRpbmdTdGFydGVkKCkiLCAxMDAwICk7DQotCX0NCi19DQotDQotZnVuY3Rpb24gZ2V0Q29va2llIChuYW1lKQ0KLXsNCi0gIHZhciBkY29va2llID0gZG9jdW1lbnQuY29va2llOw0KLSAgdmFyIGNuYW1lID0gbmFtZSArICI9IjsNCi0gIHZhciBjbGVuID0gZGNvb2tpZS5sZW5ndGg7DQotICB2YXIgY2JlZ2luID0gMDsNCi0gIHdoaWxlIChjYmVnaW4gPCBjbGVuKQ0KLSAgew0KLSAgICB2YXIgdmJlZ2luID0gY2JlZ2luICsgY25hbWUubGVuZ3RoOw0KLSAgICBpZiAoZGNvb2tpZS5zdWJzdHJpbmcoY2JlZ2luLCB2YmVnaW4pID09IGNuYW1lKQ0KLSAgICB7DQotICAgICAgdmFyIHZlbmQgPSBkY29va2llLmluZGV4T2YgKCI7IiwgdmJlZ2luKTsNCi0gICAgICBpZiAodmVuZCA9PSAtMSkNCi0gICAgICB7DQotICAgICAgICB2ZW5kID0gY2xlbjsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIHVuZXNjYXBlKGRjb29raWUuc3Vic3RyaW5nKHZiZWdpbiwgdmVuZCkpOw0KLSAgICB9DQotICAgIGNiZWdpbiA9IGRjb29raWUuaW5kZXhPZigiICIsIGNiZWdpbikgKyAxOw0KLSAgICBpZiAoY2JlZ2luID09IDApDQotICAgIHsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgfQ0KLSAgcmV0dXJuIG51bGw7DQotIH0NCi0NCi0NCi0gIHZhciBpbmRleD1udWxsOw0KLSAgdmFyIHRvdXI9bnVsbDsNCi0gIHZhciBzZWFyY2g9bnVsbDsNCi0gIHZhciBnbG9zc2FyeT1udWxsOw0KLSAgdmFyIGZlZWRiYWNrPW51bGw7DQotICB2YXIgdHJlZUxvYWRlZD1mYWxzZTsNCi0gIGZ1bmN0aW9uIGNoZWNrVHJlZUxvYWRlZCgpDQotICB7DQotICAgIGlmKHRyZWVMb2FkZWQpDQotICAgIHsNCi0gICAgICByZXR1cm4gdHJlZUxvYWRlZDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgaWYocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0ICE9IG51bGwNCi0gICAgICAgICYmIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5KCkpDQotICAgICB7DQotICAgICAgIHRyZWVMb2FkZWQgPSB0cnVlOw0KLSAgICAgfQ0KLSAgICAgKi8NCi0gICAgIGlmKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldCAhPSBudWxsKQ0KLSAgICAgew0KLSAgICAgIAl2YXIgbWV0aG9kID0gdHlwZW9mIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5Ow0KLQkgaWYgKG1ldGhvZCAhPSAidW5kZWZpbmVkIikgew0KLQkJaWYgKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5KCkpDQotCQl7DQotICAgICAgIAkJCXRyZWVMb2FkZWQgPSB0cnVlOw0KLQkJfQ0KLQ0KLQkgIH0NCi0NCi0gICAgIH0NCi0NCi0gICAgIHJldHVybiB0cmVlTG9hZGVkOw0KLSAgIH0NCi0NCi0NCi0gICAgZnVuY3Rpb24gc2hvd0FsZXJ0Tm90TG9hZGVkKCkNCi0gICAgew0KLSAgICAgIGFsZXJ0KHRvcG5hdl9qc19NRVNTQUdFMSk7DQotICAgIH0NCi0NCi1mdW5jdGlvbiBzaG93U3RhdHVzTm90TG9hZGVkKCkNCi0gIHsNCi0gICAgLy9yZXR1cm4gIlRoZSBUcmVlQnJvd3NlIGlzIG5vdCB5ZXQgbG9hZGVkIVxuUGxlYXNlIHdhaXQhIjsNCi0gICAgcmV0dXJuIHRvcG5hdl9qc19NRVNTQUdFMTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dBbGVydE5vUGFnZSh0ZXh0KQ0KLSAgew0KLSAgICAgdmFyIHBhcmVudExhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICBpZihwYXJlbnRMYWJlbCE9IiIgJiYgcGFyZW50TGFiZWwhPW51bGwpDQotICAgICB7DQotICAgICAgICAgIC8vYWxlcnQoIlRoZXJlIGlzIG5vICciICsgdGV4dCArICInIHBhZ2UgZm9yIHRoaXMgcGFnZS5cblRyeSBvbmUgb2YgdGhlIG90aGVyIG5hdmlnYXRpb24gYnV0dG9ucy4iKTsNCi0gICAgICAgICAgYWxlcnQoZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMiwgdGV4dCkpOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgIC8vYWxlcnQoIlRoZXJlIGlzIG5vICciICsgdGV4dCArICInIHBhZ2UgZm9yIHRoaXMgcGFnZS5cblRyeSBvbmUgb2YgdGhlIG90aGVyIG5hdmlnYXRpb24gYnV0dG9ucyIpOw0KLSAgICAgICAgIGFsZXJ0KGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTIsIHRleHQpKTsNCi0gICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dTdGF0dXNOb1BhZ2UodGV4dCkNCi0gIHsNCi0NCi0gICAgIHZhciBwYXJlbnRMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgdmFyIG1zZzsNCi0gICAgIGlmKHBhcmVudExhYmVsIT0iIiAmJiBwYXJlbnRMYWJlbCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgIC8vbXNnID0gIlRoZXJlIGlzIG5vICIgKyB0ZXh0ICsgIiBwYWdlISI7DQotICAgICAgICBtc2cgPSBmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UzLCB0ZXh0KTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgIC8vbXNnID0gIlRoZXJlIGlzIG5vICIgKyB0ZXh0ICsgIiBwYWdlISI7DQotICAgICAgICBtc2cgPSBmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UzLCB0ZXh0KTsNCi0gICAgIH0NCi0NCi0gICAgIHJldHVybiBtc2c7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93UGFyZW50TGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIHZhciBwYXJlbnR1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotDQotICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgcGFyZW50dXJsIT0iIiAmJiBwYXJlbnR1cmwhPW51bGwpDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gbGFiZWw7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vUGFnZSgidXAiKTsNCi0gICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vdExvYWRlZCgpOw0KLSAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93SG9tZUxhYmVsKCkNCi0gIHsNCi0gICAgc2VsZi5zdGF0dXMgPSAiSG9tZSI7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93UHJldmlvdXNMYWJlbCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzTGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgcHJldnVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c1VybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIHByZXZ1cmwhPSIiICYmIHByZXZ1cmwhPW51bGwpDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gbGFiZWw7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb1BhZ2UoInByZXZpb3VzIik7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd05leHRMYWJlbCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIHZhciBuZXh0dXJsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgbmV4dHVybCE9IiIgJiYgbmV4dHVybCE9bnVsbCkNCi0gICAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgIH0NCi0gICAgICBlbHNlDQotICAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSAgc2hvd1N0YXR1c05vUGFnZSgibmV4dCIpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSAgc2hvd1N0YXR1c05vdExvYWRlZCgpOw0KLSAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkUHJldmlvdXMoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzTGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c1VybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLQ0KLQlpZiAoKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpPT0tMSkgJiYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpPT0tMSkpDQotCXsNCi0JCXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0IikhPS0xKQ0KLQl7DQotCSAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEFwcGxldFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsKTsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKSE9LTEpDQotCXsNCi0JCW5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEh0dHBQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCwgIlByZXZpb3VzIik7DQotCX0NCi0JICAgICAgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKG5ld0xvY2F0aW9uKTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX3ByZXYpOw0KLSAgICAgfQ0KLSAgICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkTmV4dCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICB2YXIgbmV3TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLQ0KLQlpZiAoKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpPT0tMSkgJiYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpPT0tMSkpDQotCXsNCi0JCXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0IikhPS0xKQ0KLQl7DQotCSAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEFwcGxldFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsKTsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKSE9LTEpDQotCXsNCi0JCW5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEh0dHBQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCwgIk5leHQiKTsNCi0JfQ0KLSAgICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotDQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfbmV4dCk7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGxvYWRQYXJlbnQoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLSAgICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV91cCk7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotDQotICAgICByZXR1cm47DQotICB9DQotDQotZnVuY3Rpb24gd2hlcmVBbUkoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLQl2YXIgc3RhdHVzID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgCWlmKCBzdGF0dXMgPT0gZmFsc2UgKQ0KLQl7DQotCQlhbGVydCggdG9wbmF2X2pzX01FU1NBR0U0ICk7DQotCX0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gdXBBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnVwQXJyb3coKTsNCi0gICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICAgew0KLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gZG93bkFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZG93bkFycm93KCk7DQotICAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICB9DQotDQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gICAgZnVuY3Rpb24gbGVmdEFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5sZWZ0QXJyb3coKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgICBmdW5jdGlvbiByaWdodEFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5yaWdodEFycm93KCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0NCi1mdW5jdGlvbiBsb2FkVG9wKCkNCi17DQotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiBwYXJlbnQuZnJhbWVzWzFdLm5hbWU9PSJvcnlfdG9jIikNCi0gIHsNCi0gICAgIGFsZXJ0KHRvcG5hdl9qc19NRVNTQUdFNSk7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIHZhciBleHBpcmVzID0gbmV3IERhdGUoKTsNCi0gICAgZXhwaXJlcy5zZXRUaW1lIChleHBpcmVzLmdldFRpbWUoKSArICgxMDAwICogMjApKTsNCi0gICAgZG9jdW1lbnQuY29va2llID0gInJ1cF9vcnlfZG9jPSIgKyBlc2NhcGUgKGRvY3VtZW50LlVSTCkgKw0KLSAgICAiOyBleHBpcmVzPSIgKyBleHBpcmVzLnRvVVRDU3RyaW5nKCkgKyAgIjsgcGF0aD0vIjsNCi0NCi0gICAgdmFyIG5ld19vcnlfZG9jX2xvYyA9IG51bGw7DQotDQotICAgIGZvcihpPWRvY3VtZW50LmxpbmtzLmxlbmd0aC0xO2k+PTA7aS0tKQ0KLSAgICB7DQotICAgICAgIGlmKGRvY3VtZW50LmxpbmtzW2ldLmhyZWYuaW5kZXhPZigiaW5kZXguaHRtIikhPS0xKQ0KLSAgICAgICB7DQotICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gZG9jdW1lbnQubGlua3NbaV0uaHJlZjsNCi0gICAgICAgICBicmVhazsNCi0gICAgICAgfQ0KLSAgICB9DQotDQotICAgIGlmKG5ld19vcnlfZG9jX2xvYyE9bnVsbCkNCi0gICAgew0KLQlpZiggc2VsZi5uYW1lID09ICJvcnlfZG9jIiApDQotCXsNCi0JCXdpbmRvdy5jbG9zZSgpOw0KLQkJd2luZG93Lm9wZW4oIG5ld19vcnlfZG9jX2xvYyApOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsNCi0JfQ0KLSAgICB9DQotICAgfQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiBvcGVuT3J5IChwYWdlLCB0YXJnZXQpDQotew0KLSAgICBpZighaW5kZXggfHwgaW5kZXguY2xvc2VkKQ0KLSAgICB7DQotICAgICAgaW5kZXggPSBvcGVuKHBhZ2UsdGFyZ2V0LCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9Mzk1LGhlaWdodD01MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIGluZGV4LmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlblNlYXJjaCgpDQotew0KLSAgICBpZighc2VhcmNoIHx8IHNlYXJjaC5jbG9zZWQpDQotICAgIHsNCi0gICAgICBzZWFyY2ggPSBvcGVuKCIuL2FwcGxldC9zZWFyY2guaHRtIiwic2VhcmNoX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz1ubyx3aWR0aD02MzAsaGVpZ2h0PTQ1MCxyZXNpemFibGU9eWVzIik7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2VhcmNoLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlbkluZGV4KCkNCi17DQotICAgb3Blbk9yeSgiLi9pbmRleC9pbmRleC5odG0iLCJpbmRleF93aW4iKTsNCi19DQotDQotZnVuY3Rpb24gb3Blbkdsb3NzYXJ5KCkNCi17DQotIGlmKCFnbG9zc2FyeSB8fCBnbG9zc2FyeS5jbG9zZWQpDQotICAgIHsNCi0gICAgICBnbG9zc2FyeSA9IG9wZW4oIi4vcHJvY2Vzcy9nbG9zc2FyeS9pbmRleC5odG0iLCJnbG9zc2FyeV93aW4iLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9Mzg1LGhlaWdodD01MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIGdsb3NzYXJ5LmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gcHJpbnRQYWdlKCkNCi17DQotIHBhcmVudC5vcnlfZG9jLmZvY3VzKCk7DQotIHBhcmVudC5vcnlfZG9jLnByaW50KCk7DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHNlbmRGZWVkYmFjayh1cmwpDQotew0KLQlpZiAoIHVybCA9PSBudWxsIHx8IHVybCA9PSAnJyApDQotCXsNCi0JCXJldHVybjsNCi0JfQ0KLQkNCi0JaWYgKCB1cmwuaW5kZXhPZigibWFpbHRvOiIpID49IDAgKQ0KLQl7DQotCQlzZW5kbWFpbCh1cmwpOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJDQotIAkgICAgaWYoIWZlZWRiYWNrIHx8IGZlZWRiYWNrLmNsb3NlZCkNCi0JICAgIHsNCi0JICAgICAgZmVlZGJhY2sgPSBvcGVuKHVybCwiZmVlZGJhY2tfd2luIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTYwMCxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0JICAgIH0NCi0JICAgIGVsc2UNCi0JICAgIHsNCi0JICAgICAgZmVlZGJhY2suZm9jdXMoKTsNCi0JICAgIH0NCi0gICAgCX0NCi0gICAgCQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiBzZW5kbWFpbCh1cmwpDQotew0KLQlpZiAoIHVybC5pbmRleE9mKCI/c3ViamVjdCIpID09IC0xICkNCi0Jew0KLQkJdmFyIGxpbms9cGFyZW50Lm9yeV9kb2MubG9jYXRpb247DQotCQl1cmwgPSB1cmwgKyAnP3N1YmplY3Q9RmVlZGJhY2s6IC0gJytsaW5rOw0KLQl9DQotCWxvY2F0aW9uLnJlcGxhY2UodXJsKTsNCi19DQotDQotLy9jYWxjdWxhdGVzIHJlbGF0aXZlIHBhdGgNCi0vL3BhdGggbXVzdCBiZSBhbGwgcmVsYXRpdmUgZnJvbSB3ZWJzaXRlIGJhc2Ugb3IgY29udGFpbiBmdWxsIHVybHMNCi1mdW5jdGlvbiBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgoc291cmNlUGF0aCwgdGFyZ2V0UGF0aCkNCi17DQotCWlmICh0YXJnZXRQYXRoLmluZGV4T2YoImh0dHA6LyIpICE9IC0xKQ0KLQl7DQotCQlyZXR1cm4gdGFyZ2V0UGF0aDsNCi0JfQ0KLQ0KLQkvL3JlcGxhY2UgYWxsICdcJyB3aXRoICcvJw0KLQlzb3VyY2VQYXRoID0gc291cmNlUGF0aC5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQl0YXJnZXRQYXRoID0gdGFyZ2V0UGF0aC5yZXBsYWNlKC9cXC9nLCIvIik7DQotDQotCS8vYWxlcnQoIlJlcGxhY2UoU291cmNlKT0+IiArIHNvdXJjZVBhdGgpOw0KLQkvL2FsZXJ0KCJSZXBsYWNlKHRhcmdldCk9PiIgKyB0YXJnZXRQYXRoKTsNCi0NCi0NCi0Jc291cmNlQXJyYXkgPSBzb3VyY2VQYXRoLnNwbGl0KCIvIik7DQotCXRhcmdldEFycmF5ID0gdGFyZ2V0UGF0aC5zcGxpdCgiLyIpOw0KLQ0KLQl2YXIgdGhlUmVsUGF0aCA9ICIiOw0KLQ0KLQkvL2xvb3AgdW50aWwgd2UgZmluZCBhIGRpZmZlcmVuY2UNCi0JdmFyIGlkeCA9IDA7DQotCWZvcihpZHggPSAwOyBpZHggPCBzb3VyY2VBcnJheS5sZW5ndGg7IGlkeCsrKQ0KLQl7DQotCQlpZiAoaWR4ID4gdGFyZ2V0UGF0aC5sZW5ndGgpDQotCQl7DQotCQkJYnJlYWs7DQotCQl9DQotDQotCQlpZiAoc291cmNlQXJyYXlbaWR4XSAhPSB0YXJnZXRBcnJheVtpZHhdKQ0KLQkJew0KLQkJCWJyZWFrOw0KLQkJfQ0KLQl9DQotDQotCS8vYXBwZW5kIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgLi8NCi0JdmFyIG1heElkeCA9IHNvdXJjZUFycmF5Lmxlbmd0aCAtIDE7DQotCWZvciAodmFyIGkgPSBpZHg7IGkgPCBtYXhJZHg7IGkrKykNCi0Jew0KLQkJdGhlUmVsUGF0aCA9IHRoZVJlbFBhdGggKyAiLi8iOw0KLQ0KLQkJLy9hbGVydCgiUmVsUGF0aD0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vYXBwZW5kIGFueSByZW1haW5pbmcgdGFyZ2V0IHBhdGgNCi0Jd2hpbGUoaWR4IDwgdGFyZ2V0QXJyYXkubGVuZ3RoKQ0KLQl7DQotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aCArIHRhcmdldEFycmF5W2lkeCsrXSArICIvIjsNCi0JCS8vYWxlcnQoIlJlbFBhdGgoZmluYWwpPT4iICsgdGhlUmVsUGF0aCk7DQotCX0NCi0NCi0JLy9yZW1vdmUgdGhlIGxhc3QgcGF0aCBzZXBhcmF0b3INCi0JaWYgKHRoZVJlbFBhdGgubGVuZ3RoID4gMCkNCi0Jew0KLQkJLy9hbGVydCgiUmVsUGF0aChUcmltMSk9PiIgKyB0aGVSZWxQYXRoKTsNCi0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoLnN1YnN0cmluZygwLCAodGhlUmVsUGF0aC5sZW5ndGggLSAxKSk7DQotCQkvL2FsZXJ0KCJSZWxQYXRoKFRyaW0xKT0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vYWxlcnQoIlJldHVybiBSZWxhdGl2ZSBQYXRoID0+ICIgKyB0aGVSZWxQYXRoKTsNCi0NCi0JcmV0dXJuIHRoZVJlbFBhdGg7DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldFRyZWVQYXRoKCkNCi17DQotCXJldHVybiBidWlsZFRyZWVQYXRoTG9jYXRpb24oKTsNCi19DQotDQotLy9UaGlzIG1ldGhvZCB3aWxsIHJlbW92ZSB0aGUgd2Vic2l0ZSBiYXNlIGZyb20gdGhlIHVybA0KLWZ1bmN0aW9uIGNhbGN1bGF0Q3VycmVudFBhZ2UoY3VyclVSTCkgew0KLQ0KLQl2YXIgdGhlQ3VycmVudExvY2F0aW9uID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZjsNCi0JLy9yZXBsYWNlIGFsbCAnXCcgd2l0aCAnLycNCi0JdGhlQ3VycmVudExvY2F0aW9uID0gdGhlQ3VycmVudExvY2F0aW9uLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7DQotCWN1cnJVUkwgPSBjdXJyVVJMLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7DQotDQotCXZhciBzb3VyY2VBcnJheSA9IHRoZUN1cnJlbnRMb2NhdGlvbi5zcGxpdCgiLyIpOw0KLQl2YXIgY3VyckFycmF5ID0gY3VyclVSTC5zcGxpdCgiLyIpOw0KLQ0KLQl2YXIgbnVtVG9SZW1vdmUgPSBzb3VyY2VBcnJheS5sZW5ndGggLSAyOw0KLQl2YXIgaWR4ID0gMDsNCi0JdmFyIHRoZVJldHVyblBhdGggPSAiIjsNCi0JZm9yIChpZHggPSBudW1Ub1JlbW92ZTsgaWR4IDwgY3VyckFycmF5Lmxlbmd0aDsgaWR4KyspIHsNCi0JCWlmICh0aGVSZXR1cm5QYXRoICE9ICIiKSB7DQotCQkJdGhlUmV0dXJuUGF0aCA9IHRoZVJldHVyblBhdGggKyAiLyI7DQotCQl9DQotCQl0aGVSZXR1cm5QYXRoID0gdGhlUmV0dXJuUGF0aCArIGN1cnJBcnJheVtpZHhdOw0KLQl9DQotDQotCS8vYWxlcnQoIkFycmF5VGVzdD0+IiArIGN1cnJVUkwgKyAiLCIgKyB0aGVSZXR1cm5QYXRoKTsNCi0JcmV0dXJuIHRoZVJldHVyblBhdGg7DQotfQ0KLQ0KLS8vYnVpbGRzIHRyZWUgcGF0aA0KLWZ1bmN0aW9uIGJ1aWxkVHJlZVBhdGhMb2NhdGlvbigpDQotew0KLQl2YXIgdGhlRGVsaW1pdGVyID0gIiMjKiI7DQotCXZhciB0aGlzUGFnZSA9ICJhcHBsZXQvcnVwX3RvcG5hdi5odG0iOw0KLQl2YXIgdGhlTG9jID0gIiI7DQotDQotDQotDQotCWlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLQl7DQotCQl2YXIgdGhlQ3VycmVudExvY2F0aW9uID0gcGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQubG9jYXRpb24uaHJlZjsNCi0JCXRoaXNQYWdlID0gY2FsY3VsYXRDdXJyZW50UGFnZSh0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJLy9hbGVydCgiUGF0aE5hbWU6IiArIHRoaXNQYWdlKTsNCi0NCi0JCS8vYWxlcnQoIlRyeWluZyB0byBmaW5kIHRoZSBwYXRoIGZvciA9PiIgKyB0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJdmFyIHRoZVBhdGggPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuZ2V0VHJlZVBhdGhBcnJheSh0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJLy9hbGVydCgiVGhlIFRyZWUgUGF0aDogIiArIHRoZVBhdGgpOw0KLQ0KLQkJdGhlUGF0aFN0cmluZyA9IHRoZVBhdGggKyAiIjsNCi0gICAgCQlhcnJheUZyb21TdHJpbmcgPSB0aGVQYXRoU3RyaW5nLnNwbGl0KHRoZURlbGltaXRlcik7DQotDQotCQkvL2J1aWxkIHRoZSBwYXRoIGZyb20gdGhlIGFycmF5DQotCQkvL3BhcmFtIDEgPSBwYXRoIHRvIGljb24sIHBhcmFtIDIgLSBsYWJlbCwgcGFyYW0gMyAtIHBhdGggdG8gZmlsZQ0KLQkJdmFyIGNvdW50ZXIgPSAwOw0KLQkJdmFyIHRoZUxhYmVsOw0KLQkJdmFyIHRoZVJlbFBhdGg7DQotCQlpZiAoYXJyYXlGcm9tU3RyaW5nLmxlbmd0aCA+IDIpDQotCQl7DQotCQkgICB0aGVMb2MgPSAiIjsNCi0JCSAgIGZvcih2YXIgaSA9IDA7IGkgPCAoYXJyYXlGcm9tU3RyaW5nLmxlbmd0aCAtIDEpIDsgaSsrKQ0KLQkJICAgew0KLQkJCS8vaXQncyB0aGUgaWNvbiBwYXRoDQotCQkJaWYgKGNvdW50ZXIgPCAyKQ0KLQkJCXsNCi0JCQkJaWYgKGNvdW50ZXIgPiAwKQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKyAiICZndDsgIjsNCi0JCQkJfQ0KLQ0KLQkJCQkvL2FsZXJ0KCJDYWxjdWxhdGluZyBwYXRoIGZyb20oMSkgIiArIHRoaXNQYWdlICsgIiA9PiAiICsgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0NCi0JCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXS5pbmRleE9mKCJcXCIpID09IC0xICYmIGFycmF5RnJvbVN0cmluZ1tpXS5pbmRleE9mKCIvIikgPT0gLTEpDQotCQkJCXsNCi0JCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0gIT0gIm51bGwiKQ0KLQkJCQkJew0KLQkJCQkJCXRoZVJlbFBhdGggPSAiYXBwbGV0L2ltYWdlcy8iICsgYXJyYXlGcm9tU3RyaW5nW2ldOw0KLQkJCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIHRoZVJlbFBhdGgpOw0KLQkJCQkJfQ0KLQkJCQkJLy9hbGVydCgiTW9kaWZ5aW5nIFBhdGggPT4gIiArIHRoZVJlbFBhdGgpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJfQ0KLQ0KLQkJCQlpZiAodGhlUmVsUGF0aCAhPSAibnVsbCIpDQotCQkJCXsNCi0JCQkJCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkJICI8aW1nIGJvcmRlcj0wIHNyYz1cIiIgKw0KLQkJCQkJCSB0aGVSZWxQYXRoICArDQotCQkJCQkJICJcIj4iOw0KLQkJCQl9DQotDQotCQkJCS8vYWxlcnQoInRoZSBjdXJyIHBhdGg9PiIgKyB0aGVMb2MpOw0KLQkJCQljb3VudGVyID0gMjsNCi0JCQl9DQotCQkJLy8gaXQncyB0aGUgbGFiZWwNCi0JCQllbHNlIGlmIChjb3VudGVyID09IDIpDQotCQkJew0KLQkJCQl0aGVMYWJlbCA9IGFycmF5RnJvbVN0cmluZ1tpXTsNCi0JCQkJY291bnRlciA9IDM7DQotCQkJfQ0KLQkJCWVsc2UgaWYgKGNvdW50ZXIgPT0gMykNCi0JCQl7DQotCQkJCS8vYWxlcnQoIkNhbGN1bGF0aW5nIHBhdGggZnJvbSgzKSAiICsgdGhpc1BhZ2UgKyAiID0+ICIgKyBhcnJheUZyb21TdHJpbmdbaV0pOw0KLQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldICE9ICJudWxsIikNCi0JCQkJew0KLQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJCWlmICh0aGVSZWxQYXRoICE9ICIiKSB7DQotCQkJCQkJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJCSI8YSBjbGFzcz1cImhvdHRleHRcIiB0YXJnZXQ9XCJvcnlfZG9jXCIgaHJlZj1cIiIgKw0KLQkJCQkJCQkgdGhlUmVsUGF0aCArDQotCQkJCQkgCQkiXCI+IiArDQotCQkJCQkgCQl0aGVMYWJlbCArDQotCQkJCQkgCQkiPFwvYT5cbiI7DQotCQkJCQkgfQ0KLQkJCQkJIGVsc2Ugew0KLQkJCQkJIAl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJIAkJIjxhIGNsYXNzPVwiaG90dGV4dFwiPiIgICsNCi0JCQkJCSAJCXRoZUxhYmVsICsNCi0JCQkJCSAJCSI8XC9hPlxuIjsNCi0JCQkJCSB9DQotCQkJCX0NCi0JCQkJZWxzZQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJIAkiPGEgY2xhc3M9XCJob3R0ZXh0XCI+IiAgKw0KLQkJCQkJIAl0aGVMYWJlbCArDQotCQkJCQkgCSI8XC9hPlxuIjsNCi0JCQkJfQ0KLQkJCQkvL2FsZXJ0KCJ0aGUgY3VyciBwYXRoPT4iICsgdGhlTG9jKTsNCi0JCQkJY291bnRlciA9IDE7DQotCQkJCXRoZVJlbFBhdGggPSAibnVsbCI7DQotCQkJCXRoZUxhYmVsID0gIm51bGwiOw0KLQkJCX0NCi0JCSAgIH0NCi0NCi0JCS8vYWxlcnQoIkZpbmlzaGVkIEJ1aWxkaW5nID0+ICIgKyB0aGVMb2MpOw0KLQkJfQ0KLQ0KLQl9DQotDQotCS8vdGhlTG9jID0gIkN1cnJlbnQgTG9jYXRpb24mbmJzcDsmIzA0NTsmbmJzcDsiICsgdGhlTG9jOw0KLQ0KLQkvL2FsZXJ0KCJ0aGUgRmluYWwgU3RyaW5nPT4iICsgdGhlTG9jKTsNCi0NCi0JLy9kb2N1bWVudC53cml0ZSh0aGVMb2MpOw0KLQlyZXR1cm4gdGhlTG9jOw0KLQ0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX2RlLmh0bSBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc3BzY3JlZW5fZGUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Njc0Mzk4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc3BzY3JlZW5fZGUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLQkiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0KLQotPCEtLSBSUFcgTUVUQSBEQVRBIFNUQVJUIC0tCi0gCi0gCi0tLSBSUFcgTUVUQSBEQVRBIEVORCAtLT4KLQotPGh0bWw+Ci0KLTxoZWFkPgotPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJyb3AuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIvPgotPHRpdGxlPkVpbmdhbmdzYW56ZWlnZTwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi0KLQotPHAgYWxpZ249ImNlbnRlciI+Jm5ic3A7PC9wPgotPGgyIGFsaWduPSJjZW50ZXIiPkJpdHRlIHdhcnRlbi4uLkRlciBCYXVtc3RydWt0dXJicm93c2VyIHdpcmQgZ2VsYWRlbi4uLjxici8+PC9oMj4KLTxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KLTwhLS0gCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0iaW1hZ2VzL3NwbGFzaC5naWYiIGFsdD0iV2lsbGtvbW1lbiBiZWltIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiLz48L3A+Ci0tLT4KLTxici8+Ci08YnIvPgotCi0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zcHNjcmVlbl9lcy5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX2VzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwYjkzNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX2VzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi0KLTwhLS0gUlBXIE1FVEEgREFUQSBTVEFSVCAtLQotIAotIAotLS0gUlBXIE1FVEEgREFUQSBFTkQgLS0+Ci0KLTxodG1sPgotCi08aGVhZD4KLTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0icm9wLmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiLz4KLTx0aXRsZT5QYW50YWxsYSBkZSBwcmVzZW50YWNp8248L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotCi0KLTxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KLTxoMiBhbGlnbj0iY2VudGVyIj5Fc3BlcmUgbWllbnRyYXMgc2UgY2FyZ2EgZWwgbmF2ZWdhZG9yIGRlbCDhcmJvbC4uLjxici8+PC9oMj4KLTxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KLTwhLS0gCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0iaW1hZ2VzL3NwbGFzaC5naWYiIGFsdD0iQmllbnZlbmlkbyBhIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiLz48L3A+Ci0tLT4KLTxici8+Ci08YnIvPgotCi0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zcHNjcmVlbl9mci5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX2ZyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg5Zjc0My4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX2ZyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi0KLTwhLS0gUlBXIE1FVEEgREFUQSBTVEFSVCAtLQotIAotIAotLS0gUlBXIE1FVEEgREFUQSBFTkQgLS0+Ci0KLTxodG1sPgotCi08aGVhZD4KLTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0icm9wLmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiLz4KLTx0aXRsZT5FY3JhbiBkJ2FjY3VlaWw8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotCi0KLTxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KLTxoMiBhbGlnbj0iY2VudGVyIj5WZXVpbGxleiBwYXRpZW50ZXIgcGVuZGFudCBsZSBjaGFyZ2VtZW50IGR1IG5hdmlnYXRldXIgZCdhcmJvcmVzY2VuY2UuLi48YnIvPjwvaDI+Ci08cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+Ci08IS0tIAotPHAgYWxpZ249ImNlbnRlciI+PGltZyBzcmM9ImltYWdlcy9zcGxhc2guZ2lmIiBhbHQ9IkJpZW52ZW51ZSBkYW5zIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiLz48L3A+Ci0tLT4KLTxici8+Ci08YnIvPgotCi0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zcHNjcmVlbl9pdC5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX2l0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyZTZjNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX2l0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi0KLTwhLS0gUlBXIE1FVEEgREFUQSBTVEFSVCAtLQotIAotIAotLS0gUlBXIE1FVEEgREFUQSBFTkQgLS0+Ci0KLTxodG1sPgotCi08aGVhZD4KLTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0icm9wLmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiLz4KLTx0aXRsZT5TY2hlcm1hdGEgaW5pemlhbGU8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotCi0KLTxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KLTxoMiBhbGlnbj0iY2VudGVyIj5BdHRlbmRlcmUsIGNhcmljYW1lbnRvIGRlbCBicm93c2VyIGRlbGxhIHN0cnV0dHVyYSBpbiBjb3Jzby4uLjxici8+PC9oMj4KLTxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KLTwhLS0gCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0iaW1hZ2VzL3NwbGFzaC5naWYiIGFsdD0iQmVudmVudXRpIGluIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiLz48L3A+Ci0tLT4KLTxici8+Ci08YnIvPgotCi0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zcHNjcmVlbl9qYS5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX2phLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdmN2VkMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX2phLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi0KLTwhLS0gUlBXIE1FVEEgREFUQSBTVEFSVCAtLQotIAotIAotLS0gUlBXIE1FVEEgREFUQSBFTkQgLS0+Ci0KLTxodG1sPgotCi08aGVhZD4KLTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0icm9wLmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ii8+Ci08dGl0bGU+44K544OX44Op44OD44K344Ol55S76Z2iPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLQotCi08cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+Ci08aDIgYWxpZ249ImNlbnRlciI+44OE44Oq44O844O744OW44Op44Km44K244O844Gu44Ot44O844OJ44GM5a6M5LqG44GZ44KL44G+44Gn44GK5b6F44Gh44GP44Gg44GV44GELi4uPGJyLz48L2gyPgotPHAgYWxpZ249ImNlbnRlciI+Jm5ic3A7PC9wPgotPCEtLSAKLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSJpbWFnZXMvc3BsYXNoLmdpZiIgYWx0PSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIOOBuOOCiOOBhuOBk+OBnSIvPjwvcD4KLS0tPgotPGJyLz4KLTxici8+Ci0KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX2tvLmh0bSBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc3BzY3JlZW5fa28uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2FjY2E5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc3BzY3JlZW5fa28uaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLQkiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0KLQotPCEtLSBSUFcgTUVUQSBEQVRBIFNUQVJUIC0tCi0gCi0gCi0tLSBSUFcgTUVUQSBEQVRBIEVORCAtLT4KLQotPGh0bWw+Ci0KLTxoZWFkPgotPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJyb3AuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLz4KLTx0aXRsZT7si5zsnpEg7ZmU66m0PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLQotCi08cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+Ci08aDIgYWxpZ249ImNlbnRlciI+7Yq466asIOu4jOudvOyasOyggOqwgCDroZzrk5zrkKAg65WM6rmM7KeAIOq4sOuLpOumrOyLreyLnOyYpC4uLjxici8+PC9oMj4KLTxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KLTwhLS0gCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0iaW1hZ2VzL3NwbGFzaC5naWYiIGFsdD0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayDsgqzsmqnsnYQg7ZmY7JiB7ZWp64uI64ukLiIvPjwvcD4KLS0tPgotPGJyLz4KLTxici8+Ci0KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX3B0X0JSLmh0bSBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc3BzY3JlZW5fcHRfQlIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTI5MDYzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc3BzY3JlZW5fcHRfQlIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLQkiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0KLQotPCEtLSBSUFcgTUVUQSBEQVRBIFNUQVJUIC0tCi0gCi0gCi0tLSBSUFcgTUVUQSBEQVRBIEVORCAtLT4KLQotPGh0bWw+Ci0KLTxoZWFkPgotPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJyb3AuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIvPgotPHRpdGxlPlRlbGEgZGUgQWJlcnR1cmEgPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLQotCi08cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+Ci08aDIgYWxpZ249ImNlbnRlciI+QWd1YXJkZSBlbnF1YW50byBvIG5hdmVnYWRvciBlbSDDoXJ2b3JlIGVzdMOhIHNlbmRvIGNhcnJlZ2Fkby4uLjxici8+PC9oMj4KLTxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KLTwhLS0gCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0iaW1hZ2VzL3NwbGFzaC5naWYiIGFsdD0iQmVtLXZpbmRvIGFvIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiLz48L3A+Ci0tLT4KLTxici8+Ci08YnIvPgotCi0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvZG9jcm9vdC9zcHNjcmVlbl96aF9DTi5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX3poX0NOLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBiNDNiNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX3poX0NOLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi0KLTwhLS0gUlBXIE1FVEEgREFUQSBTVEFSVCAtLQotIAotIAotLS0gUlBXIE1FVEEgREFUQSBFTkQgLS0+Ci0KLTxodG1sPgotCi08aGVhZD4KLTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0icm9wLmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ii8+Ci08dGl0bGU+6Zeq5bGPPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLQotCi08cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+Ci08aDIgYWxpZ249ImNlbnRlciI+5q2j5Zyo6KOF5YWl5qCR5b2i5rWP6KeI5Zmo77yM6K+356iN5YCZLi4uPGJyLz48L2gyPgotPHAgYWxpZ249ImNlbnRlciI+Jm5ic3A7PC9wPgotPCEtLSAKLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSJpbWFnZXMvc3BsYXNoLmdpZiIgYWx0PSLmrKLov47kvb/nlKggRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayIvPjwvcD4KLS0tPgotPGJyLz4KLTxici8+Ci0KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9kb2Nyb290L3Nwc2NyZWVuX3poX1RXLmh0bSBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc3BzY3JlZW5femhfVFcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjdmYTc3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2RvY3Jvb3Qvc3BzY3JlZW5femhfVFcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLQkiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0KLQotPCEtLSBSUFcgTUVUQSBEQVRBIFNUQVJUIC0tCi0gCi0gCi0tLSBSUFcgTUVUQSBEQVRBIEVORCAtLT4KLQotPGh0bWw+Ci0KLTxoZWFkPgotPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJyb3AuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLz4KLTx0aXRsZT7pgLLlhaXnlavpnaI8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotCi0KLTxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KLTxoMiBhbGlnbj0iY2VudGVyIj7mraPlnKjovInlhaXmqLnni4DngI/opr3lmajvvIzoq4vnqI3lgJkuLi48YnIvPjwvaDI+Ci08cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+Ci08IS0tIAotPHAgYWxpZ249ImNlbnRlciI+PGltZyBzcmM9ImltYWdlcy9zcGxhc2guZ2lmIiBhbHQ9Iuatoei/juS9v+eUqCBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIi8+PC9wPgotLS0+Ci08YnIvPgotPGJyLz4KLQotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2ZyYWdtZW50LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTEyNTlkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL2ZyYWdtZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZyYWdtZW50TmFtZT1FUEYgQ29tcG9zZXIgUHVibGlzaGluZyAoTkwxKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiM2VjYzAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIFZlclx1MDBmNmZmZW50bGljaHVuZw0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZTMyNmQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVB1YmxpY2FjaVx1MDBmM24gZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg3ODczNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9UHVibGljYXRpb24gRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9wbHVnaW5faXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBkNDllMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9wbHVnaW5faXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9UHViYmxpY2F6aW9uZSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9wbHVnaW5famEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDQwNDEwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgUHVibGlzaGluZw0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOTQ0Y2MuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdWFjZjVcdWFjMWMNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2QzN2EwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1QdWJsaWNhXHUwMGU3XHUwMGUzbyBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzJhMWEyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgXHU1M2QxXHU1ZTAzDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA0MDQxMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFB1Ymxpc2hpbmcNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmODAzNDguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQUDAwMDBFIC0gSVVQUDAwOTlFDQotIw0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1wdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZT1Lb25maWd1cmF0aW9uIHdpcmQgdmVyXHUwMGY2ZmZlbnRsaWNodC4uLg0KLWluaXRpYWxpemluZ0RpclRhc2tfbmFtZT1aaWVsdmVyemVpY2huaXMgd2lyZCBpbml0aWFsaXNpZXJ0Li4uDQotY29weWluZ0ZpbGVzVGFza19uYW1lPURhdGVpZW4gd2VyZGVuIGtvcGllcnQuLi4NCi1nZW5lcmF0aW5nQm9va21hcmtzVGFza19uYW1lPUxlc2V6ZWljaGVuIHdlcmRlbiBnZW5lcmllcnQuLi4NCi1nZW5lcmF0aW5nQm9va21hcmtUYXNrX25hbWU9TGVzZXplaWNoZW4gJyd7MH0nJyB3aXJkIGdlbmVyaWVydC4uLg0KLWdlbmVyYXRpbmdCb29rbWFya0luZGV4VGFza19uYW1lPUxlc2V6ZWljaGVuaW5kZXggd2lyZCBnZW5lcmllcnQuLi4NCi1wdWJsaXNoaW5nTGlua2VkRWxlbWVudFRhc2tfbmFtZT1NZXRob2RlbmVsZW1lbnRlIHdlcmRlbiB2ZXJcdTAwZjZmZmVudGxpY2h0LiBWZXJcdTAwZjZmZmVudGxpY2h0OiB7MH0sIFZlcmJsZWliZW5kOiB7MX0NCi1wdWJsaXNoaW5nRWxlbWVudFRhc2tfbmFtZT1NZXRob2RlbmVsZW1lbnQgd2lyZCB2ZXJcdTAwZjZmZmVudGxpY2h0OiB7MH06ezF9DQotZ2VuZXJhdGluZ0dsb3NzYXJ5VGFza19uYW1lPUdsb3NzYXIgd2lyZCBnZW5lcmllcnQuLi4NCi1nZW5lcmF0aW5nU2VhcmNoSW5kZXhUYXNrX25hbWU9U3VjaGluZGV4IHdpcmQgZ2VuZXJpZXJ0Li4uDQotYnVpbGRpbmdQcm9jZXNzQ2xvc3VyZVRhc2tfbmFtZT1BYmdlc2NobG9zc2VuZXIgUHJvemVzcyB3aXJkIGVyc3RlbGx0Li4uDQotYnVpbGRpbmdFbGVtZW50Q2xvc3VyZVRhc2tfbmFtZT1BYmdlc2NobG9zc2VuZXMgRWxlbWVudCBmXHUwMGZjciAnJ3swfScnIHdpcmQgZXJzdGVsbHQuLi4NCi1sb2FkTGlicmFyeVRhc2tfbmFtZT1CaWJsaW90aGVrc2luaGFsdCB3aXJkIGdlbGFkZW4uLi4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzIGxvZ2dlZCBpbiB0aGUgUHVibGlzaGluZyBSZXBvcnQNCi1wdWJsaXNoRWxlbWVudEVycm9yX21zZz1JVVBQMDAwMEU6IEZlaGxlciBiZWltIFZlclx1MDBmNmZmZW50bGljaGVuIGRlcyBFbGVtZW50cyB7MH0NCi1zZXJ2ZXJFcnJvcl9tc2c9SVVQUDAwMDFFOiBFcyB3dXJkZW4ga2VpbmUgRGF0ZW4gdm9tIFNlcnZlciB6dXJcdTAwZmNja2dlZ2ViZW4uDQotaW52YWxpZEh0dHBSZXNwb25zZUVycm9yX21zZz1JVVBQMDAwMkU6IFVuZ1x1MDBmY2x0aWdlIEFudHdvcnQgdm9uIGh0dHA6Ly97MH06ezF9OnsyfQ0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0DQotaW52YWxpZEVsZW1lbnRXYXJuaW5nX21zZz1JVVBQMDAwM1c6IERhcyBFbGVtZW50IHd1cmRlIG5pY2h0IHZlclx1MDBmNmZmZW50bGljaHQsIHdlaWwgZXMga2VpbiBnXHUwMGZjbHRpZ2VzIEVsZW1lbnQgaW4gZGVyIEtvbmZpZ3VyYXRpb24gaXN0Lg0KLWludmFsaWRNZXRob2RFbGVtZW50V2FybmluZ19tc2c9SVVQUDAwMDRXOiBEYXMgRWxlbWVudCB3dXJkZSBuaWNodCB2ZXJcdTAwZjZmZmVudGxpY2h0LCB3ZWlsIGVzIGtlaW4gTWV0aG9kZW5lbGVtZW50IGlzdDogezB9DQotY29weUZpbGVXYXJuaW5nX21zZz1JVVBQMDAwNVc6IERpZSBEYXRlaSBrYW5uIG5pY2h0IHZvbiAnJ3swfScnIG5hY2ggJyd7MX0nJyBrb3BpZXJ0IHdlcmRlbi4NCi1taXNzaW5nSWNvbkZpbGVXYXJuaW5nX21zZz1JVVBQMDAwNlc6IERpZSBLbm90ZW5zeW1ib2xkYXRlaSAnJ3swfScnIGlzdCBuaWNodCB2b3JoYW5kZW4uDQotbWlzc2luZ0ljb25OYW1lV2FybmluZ19tc2c9SVVQUDAwMDdXOiBEZXIgTmFtZSBkZXMgS25vdGVuc3ltYm9scyBrYW5uIG5pY2h0IGFiZ2VydWZlbiB3ZXJkZW4uDQotZXh0ZXJuYWxVcmxfbXNnPVJlZmVyZW56IGF1ZiBleHRlcm5lbiBVUkw6IHswfQ0KLWRpc2NhcmVkQ2F0ZWdvcnlXYXJuaW5nX21zZz1EYXMgbGVlcmUgSW5oYWx0c2thdGVnb3JpZWVsZW1lbnQgd2lyZCBuaWNodCB2ZXJcdTAwZjZmZmVudGxpY2h0Lg0KLQ0KLSMgRXJyb3IgRGV0YWlscw0KLWNyZWF0ZVNlYXJjaEluZGV4RXJyb3JfbXNnPUlVUFAwMDA4RTogRGllIFN1Y2hpbmRleGRhdGVpIHd1cmRlIG5pY2h0IGVyc3RlbGx0Lg0KLQ0KLSMgUHJvY2VzcyBUcmVlIE5vZGVzDQotcmVmZXJlbmNlV29ya2Zsb3dzTm9kZV90ZXh0PVJlZmVyZW56d29ya2Zsb3dzDQotdGFza05vZGVfdGV4dD1BdWZnYWJlbg0KLXByaW1hcmlseVBlcmZvcm1zTm9kZV90ZXh0PUZcdTAwZmNocnQgKGhhdXB0c1x1MDBlNGNobGljaCkgYXVzOg0KLWFkZGl0aW9uYWxseVBlcmZvcm1zTm9kZV90ZXh0PVp1c1x1MDBlNHR6bGljaGUgQXVmZ2FiZW46DQotcGVyZm9ybWluZ1JvbGVzTm9kZV90ZXh0PUF1c2ZcdTAwZmNocmVuZGUgUm9sbGVuDQotaW5wdXRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9RWluZ2FiZWFyYmVpdHNlcmdlYm5pc3NlDQotb3V0cHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0PUF1c2dhYmVhcmJlaXRzZXJnZWJuaXNzZQ0KLXJlc3BvbnNpYmxlRm9yTm9kZV90ZXh0PVZlcmFudHdvcnRsaWNoIGZcdTAwZmNyDQotbW9kaWZpZXNOb2RlX3RleHQ9XHUwMGM0bmRlcnVuZw0KLXJlc3BvbnNpYmxlUm9sZU5vZGVfdGV4dD1WZXJhbnR3b3J0bGljaGUgUm9sbGUNCi1jb250YWluaW5nV29ya1Byb2R1Y3ROb2RlX3RleHQ9XHUwMGRjYmVyZ2VvcmRuZXRlcyBBcmJlaXRzZXJnZWJuaXMNCi1jb250YWluZWRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9RW50aGFsdGVuZSBBcmJlaXRzZXJnZWJuaXNzZQ0KLWd1aWRhbmNlTm9kZV90ZXh0PUFubGVpdHVuZw0KLWlucHV0VG9Ob2RlX3RleHQ9RWluZ2FiZSBmXHUwMGZjcg0KLW91dHB1dEZyb21Ob2RlX3RleHQ9QXVzZ2FiZSB2b24NCi0NCi0jIEhUTUwgVGl0bGUgZm9yIEluZGV4IFBhZ2UNCi1pbmRleExhYmVsX3RleHQ9SW5kZXgNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MzQwNzcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQUDAwMDBFIC0gSVVQUDAwOTlFDQotIw0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1wdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZT1QdWJsaWNhbmRvIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbi4uLg0KLWluaXRpYWxpemluZ0RpclRhc2tfbmFtZT1JbmljaWFsaXphbmRvIGVsIGRpcmVjdG9yaW8gZGUgZGVzdGluby4uLg0KLWNvcHlpbmdGaWxlc1Rhc2tfbmFtZT1Db3BpYW5kbyBhcmNoaXZvcy4uLg0KLWdlbmVyYXRpbmdCb29rbWFya3NUYXNrX25hbWU9R2VuZXJhbmRvIG1hcmNhZG9yZXMuLi4NCi1nZW5lcmF0aW5nQm9va21hcmtUYXNrX25hbWU9R2VuZXJhbmRvIGVsIG1hcmNhZG9yICcnezB9JycuLi4NCi1nZW5lcmF0aW5nQm9va21hcmtJbmRleFRhc2tfbmFtZT1HZW5lcmFuZG8gZWwgXHUwMGVkbmRpY2UgZGUgbWFyY2Fkb3Jlcy4uLg0KLXB1Ymxpc2hpbmdMaW5rZWRFbGVtZW50VGFza19uYW1lPVB1YmxpY2FuZG8gZWxlbWVudG9zIGRlIG1cdTAwZTl0b2RvOiB7MH0gcHVibGljYWRvcywgezF9IHJlc3RhbnRlcw0KLXB1Ymxpc2hpbmdFbGVtZW50VGFza19uYW1lPVB1YmxpY2FuZG8gZWwgZWxlbWVudG8gZGUgbVx1MDBlOXRvZG86IHswfTp7MX0NCi1nZW5lcmF0aW5nR2xvc3NhcnlUYXNrX25hbWU9R2VuZXJhbmRvIGdsb3NhcmlvLi4uDQotZ2VuZXJhdGluZ1NlYXJjaEluZGV4VGFza19uYW1lPUdlbmVyYW5kbyBcdTAwZWRuZGljZSBkZSBiXHUwMGZhc3F1ZWRhLi4uDQotYnVpbGRpbmdQcm9jZXNzQ2xvc3VyZVRhc2tfbmFtZT1Db25zdHJ1eWVuZG8gY2llcnJlIGRlbCBwcm9jZXNvLi4uDQotYnVpbGRpbmdFbGVtZW50Q2xvc3VyZVRhc2tfbmFtZT1Db25zdHJ1eWVuZG8gZWwgY2llcnJlIGRlIGVsZW1lbnRvIHBhcmEgJyd7MH0nJy4uLg0KLWxvYWRMaWJyYXJ5VGFza19uYW1lPUNhcmdhbmRvIGVsIGNvbnRlbmlkbyBkZSBsYSBiaWJsaW90ZWNhLi4uDQotDQotIyBFcnJvciBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0DQotcHVibGlzaEVsZW1lbnRFcnJvcl9tc2c9SVVQUDAwMDBFOiBTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgcHVibGljYXIgZWwgZWxlbWVudG8gezB9DQotc2VydmVyRXJyb3JfbXNnPUlVUFAwMDAxRTogRWwgc2Vydmlkb3Igbm8gaGEgZGV2dWVsdG8gbmluZ1x1MDBmYW4gZGF0by4NCi1pbnZhbGlkSHR0cFJlc3BvbnNlRXJyb3JfbXNnPUlVUFAwMDAyRTogUmVzcHVlc3RhIG5vIHZcdTAwZTFsaWRhIGRlIGh0dHA6Ly97MH06ezF9OnsyfQ0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0DQotaW52YWxpZEVsZW1lbnRXYXJuaW5nX21zZz1JVVBQMDAwM1c6IEVsIGVsZW1lbnRvIG5vIHNlIGhhIHB1YmxpY2FkbyBwb3JxdWUgbm8gZXMgdW4gZWxlbWVudG8gdlx1MDBlMWxpZG8gZGUgbGEgY29uZmlndXJhY2lcdTAwZjNuLg0KLWludmFsaWRNZXRob2RFbGVtZW50V2FybmluZ19tc2c9SVVQUDAwMDRXOiBFbCBlbGVtZW50byBubyBzZSBoYSBwdWJsaWNhZG8gcG9ycXVlIG5vIGVzIHVuIGVsZW1lbnRvIGRlIG1cdTAwZTl0b2RvOiB7MH0NCi1jb3B5RmlsZVdhcm5pbmdfbXNnPUlVUFAwMDA1VzogTm8gc2UgaGEgcG9kaWRvIGNvcGlhciBlbCBhcmNoaXZvIGRlICcnezB9JycgZW4gJyd7MX0nJy4NCi1taXNzaW5nSWNvbkZpbGVXYXJuaW5nX21zZz1JVVBQMDAwNlc6IEVsIGFyY2hpdm8gZGUgaWNvbm9zIGRlIG5vZG8gJyd7MH0nJyBubyBleGlzdGUuDQotbWlzc2luZ0ljb25OYW1lV2FybmluZ19tc2c9SVVQUDAwMDdXOiBObyBzZSBoYSBwb2RpZG8gcmVjdXBlcmFyIGVsIG5vbWJyZSBkZWwgaWNvbm8gZGUgbm9kby4NCi1leHRlcm5hbFVybF9tc2c9VVJMIGV4dGVybmEgZGUgcmVmZXJlbmNpYTogezB9DQotZGlzY2FyZWRDYXRlZ29yeVdhcm5pbmdfbXNnPUVsZW1lbnRvIGRlIGNhdGVnb3JcdTAwZWRhIGRlIGNvbnRlbmlkbyB2YWNcdTAwZWRvIG5vIHB1YmxpY2Fkby4NCi0NCi0jIEVycm9yIERldGFpbHMNCi1jcmVhdGVTZWFyY2hJbmRleEVycm9yX21zZz1JVVBQMDAwOEU6IE5vIHNlIGhhIGNyZWFkbyBlbCBhcmNoaXZvIGRlIFx1MDBlZG5kaWNlcyBkZSBiXHUwMGZhc3F1ZWRhLg0KLQ0KLSMgUHJvY2VzcyBUcmVlIE5vZGVzDQotcmVmZXJlbmNlV29ya2Zsb3dzTm9kZV90ZXh0PUZsdWpvcyBkZSB0cmFiYWpvIGRlIHJlZmVyZW5jaWENCi10YXNrTm9kZV90ZXh0PVRhcmVhcw0KLXByaW1hcmlseVBlcmZvcm1zTm9kZV90ZXh0PVByaW5jaXBhbG1lbnRlIHJlYWxpemENCi1hZGRpdGlvbmFsbHlQZXJmb3Jtc05vZGVfdGV4dD1BZGljaW9uYWxtZW50ZSByZWFsaXphDQotcGVyZm9ybWluZ1JvbGVzTm9kZV90ZXh0PVJvbGVzIGRlIHJlYWxpemFjaVx1MDBmM24NCi1pbnB1dFdvcmtQcm9kdWN0c05vZGVfdGV4dD1Qcm9kdWN0b3MgZGUgdHJhYmFqbyBkZSBlbnRyYWRhDQotb3V0cHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0PVByb2R1Y3RvcyBkZSB0cmFiYWpvIGRlIHNhbGlkYQ0KLXJlc3BvbnNpYmxlRm9yTm9kZV90ZXh0PVJlc3BvbnNhYmxlIGRlDQotbW9kaWZpZXNOb2RlX3RleHQ9TW9kaWZpY2ENCi1yZXNwb25zaWJsZVJvbGVOb2RlX3RleHQ9Um9sIHJlc3BvbnNhYmxlDQotY29udGFpbmluZ1dvcmtQcm9kdWN0Tm9kZV90ZXh0PVByb2R1Y3RvIGRlIHRyYWJham8gY29udGVuZWRvcg0KLWNvbnRhaW5lZFdvcmtQcm9kdWN0c05vZGVfdGV4dD1Qcm9kdWN0b3MgZGUgdHJhYmFqbyBjb250ZW5pZG9zDQotZ3VpZGFuY2VOb2RlX3RleHQ9R3VcdTAwZWRhDQotaW5wdXRUb05vZGVfdGV4dD1FbnRyYWRhIGENCi1vdXRwdXRGcm9tTm9kZV90ZXh0PVNhbGlkYSBkZQ0KLQ0KLSMgSFRNTCBUaXRsZSBmb3IgSW5kZXggUGFnZQ0KLWluZGV4TGFiZWxfdGV4dD1cdTAwY2RuZGljZQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9SZXNvdXJjZXNfZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9SZXNvdXJjZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxYTBlOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOiBJVVBQMDAwMEUgLSBJVVBQMDA5OUUNCi0jDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLXB1Ymxpc2hpbmdDb25maWd1cmF0aW9uVGFza19uYW1lPVB1YmxpY2F0aW9uIGRlIGxhIGNvbmZpZ3VyYXRpb24uLi4NCi1pbml0aWFsaXppbmdEaXJUYXNrX25hbWU9SW5pdGlhbGlzYXRpb24gZHUgclx1MDBlOXBlcnRvaXJlIGRlIGRlc3RpbmF0aW9uLi4uDQotY29weWluZ0ZpbGVzVGFza19uYW1lPUNvcGllIGRlcyBmaWNoaWVycyBlbiBjb3Vycy4uLg0KLWdlbmVyYXRpbmdCb29rbWFya3NUYXNrX25hbWU9R1x1MDBlOW5cdTAwZTlyYXRpb24gZGVzIHNpZ25ldHMuLi4NCi1nZW5lcmF0aW5nQm9va21hcmtUYXNrX25hbWU9R1x1MDBlOW5cdTAwZTlyYXRpb24gZHUgc2lnbmV0ICcnezB9JycuLi4NCi1nZW5lcmF0aW5nQm9va21hcmtJbmRleFRhc2tfbmFtZT1HXHUwMGU5blx1MDBlOXJhdGlvbiBkZSBsJ2luZGV4IGR1IHNpZ25ldC4uLg0KLXB1Ymxpc2hpbmdMaW5rZWRFbGVtZW50VGFza19uYW1lPVB1YmxpY2F0aW9uIGRlcyBcdTAwZTlsXHUwMGU5bWVudHMgZGUgbVx1MDBlOXRob2RlIDogezB9IHB1YmxpXHUwMGU5KHMpLCB7MX0gcmVzdGFudChzKQ0KLXB1Ymxpc2hpbmdFbGVtZW50VGFza19uYW1lPVB1YmxpY2F0aW9uIGRlIGwnJ1x1MDBlOWxcdTAwZTltZW50IGRlIG1cdTAwZTl0aG9kZSA6IHswfSA6IHsxfQ0KLWdlbmVyYXRpbmdHbG9zc2FyeVRhc2tfbmFtZT1HXHUwMGU5blx1MDBlOXJhdGlvbiBkdSBnbG9zc2FpcmUuLi4NCi1nZW5lcmF0aW5nU2VhcmNoSW5kZXhUYXNrX25hbWU9R1x1MDBlOW5cdTAwZTlyYXRpb24gZGUgbCdpbmRleCBkZSBsJ2FpZGUuLi4NCi1idWlsZGluZ1Byb2Nlc3NDbG9zdXJlVGFza19uYW1lPUdcdTAwZTluXHUwMGU5cmF0aW9uIGRlIGxhIGZlcm1ldHVyZSBkdSBwcm9jZXNzdXMuLi4NCi1idWlsZGluZ0VsZW1lbnRDbG9zdXJlVGFza19uYW1lPUdcdTAwZTluXHUwMGU5cmF0aW9uIGRlIGxhIGZlcm1ldHVyZSBkZSBsJydcdTAwZTlsXHUwMGU5bWVudCBwb3VyICcnezB9JycuLi4NCi1sb2FkTGlicmFyeVRhc2tfbmFtZT1DaGFyZ2VtZW50IGR1IGNvbnRlbnUgZGUgbGEgYmlibGlvdGhcdTAwZThxdWUuLi4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzIGxvZ2dlZCBpbiB0aGUgUHVibGlzaGluZyBSZXBvcnQNCi1wdWJsaXNoRWxlbWVudEVycm9yX21zZz1JVVBQMDAwMEUgOiBFcnJldXIgZGUgcHVibGljYXRpb24gZGUgbCcnXHUwMGU5bFx1MDBlOW1lbnQgOiB7MH0NCi1zZXJ2ZXJFcnJvcl9tc2c9SVVQUDAwMDFFIDogQXVjdW5lIGRvbm5cdTAwZTllIHJlbnZveVx1MDBlOWUgcGFyIGxlIHNlcnZldXIuDQotaW52YWxpZEh0dHBSZXNwb25zZUVycm9yX21zZz1JVVBQMDAwMkUgOiBSXHUwMGU5cG9uc2Ugbm9uIHZhbGlkZSBkZSBodHRwOi8vezB9OnsxfTp7Mn0NCi0NCi0jIFdhcm5pbmcgTWVzc2FnZXMgbG9nZ2VkIGluIHRoZSBQdWJsaXNoaW5nIFJlcG9ydA0KLWludmFsaWRFbGVtZW50V2FybmluZ19tc2c9SVVQUDAwMDNXIDogTCdcdTAwZTlsXHUwMGU5bWVudCBuJ2EgcGFzIFx1MDBlOXRcdTAwZTkgcHVibGlcdTAwZTkgY2FyIGlsIG4nZXN0IHBhcyB1biBcdTAwZTlsXHUwMGU5bWVudCB2YWxpZGUgZGUgbGEgY29uZmlndXJhdGlvbi4NCi1pbnZhbGlkTWV0aG9kRWxlbWVudFdhcm5pbmdfbXNnPUlVUFAwMDA0VyA6IEwnJ1x1MDBlOWxcdTAwZTltZW50IG4nJ2EgcGFzIFx1MDBlOXRcdTAwZTkgcHVibGlcdTAwZTkgY2FyIGlsIG4nJ2VzdCBwYXMgdW4gXHUwMGU5bFx1MDBlOW1lbnQgZGUgbVx1MDBlOXRob2RlIDogezB9DQotY29weUZpbGVXYXJuaW5nX21zZz1JVVBQMDAwNVcgOiBJbXBvc3NpYmxlIGRlIGNvcGllciBsZSBmaWNoaWVyIGRlICcnezB9JycgdmVycyAnJ3sxfScnLg0KLW1pc3NpbmdJY29uRmlsZVdhcm5pbmdfbXNnPUlVUFAwMDA2VyA6IExlIGZpY2hpZXIgZCcnaWNcdTAwZjRuZSBkZSBub2V1ZCAnJ3swfScnIG4nJ2V4aXN0ZSBwYXMuDQotbWlzc2luZ0ljb25OYW1lV2FybmluZ19tc2c9SVVQUDAwMDdXIDogSW1wb3NzaWJsZSBkZSByXHUwMGU5Y3VwXHUwMGU5cmVyIGxlIG5vbSBkZSBsJ2ljXHUwMGY0bmUgZGUgbm9ldWQuDQotZXh0ZXJuYWxVcmxfbXNnPXJcdTAwZTlmXHUwMGU5cmVuY2VtZW50IGRlIGwnJ1VSTCBleHRlcm5lIDogezB9DQotZGlzY2FyZWRDYXRlZ29yeVdhcm5pbmdfbXNnPVZpZGV6IGwnXHUwMGU5bFx1MDBlOW1lbnQgZGUgY2F0XHUwMGU5Z29yaWUgZGUgY29udGVudSBub24gcHVibGlcdTAwZTkuDQotDQotIyBFcnJvciBEZXRhaWxzDQotY3JlYXRlU2VhcmNoSW5kZXhFcnJvcl9tc2c9SVVQUDAwMDhFIDogTCdpbmRleCBkZSBsJ2FpZGUgbidhIHBhcyBcdTAwZTl0XHUwMGU5IGNyXHUwMGU5XHUwMGU5Lg0KLQ0KLSMgUHJvY2VzcyBUcmVlIE5vZGVzDQotcmVmZXJlbmNlV29ya2Zsb3dzTm9kZV90ZXh0PUVuY2hhXHUwMGVlbmVtZW50cyBkJ2FjdGl2aXRcdTAwZTlzIGRlIHJcdTAwZTlmXHUwMGU5cmVuY2UNCi10YXNrTm9kZV90ZXh0PVRcdTAwZTJjaGVzDQotcHJpbWFyaWx5UGVyZm9ybXNOb2RlX3RleHQ9RWZmZWN0dWUgcHJpbmNpcGFsZW1lbnQNCi1hZGRpdGlvbmFsbHlQZXJmb3Jtc05vZGVfdGV4dD1FZmZlY3R1ZSBcdTAwZTlnYWxlbWVudA0KLXBlcmZvcm1pbmdSb2xlc05vZGVfdGV4dD1FeFx1MDBlOWN1dGlvbiBkZXMgclx1MDBmNGxlcw0KLWlucHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0PVByb2R1aXRzIGQnZW50clx1MDBlOWUNCi1vdXRwdXRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9UHJvZHVpdHMgZGUgc29ydGllDQotcmVzcG9uc2libGVGb3JOb2RlX3RleHQ9UmVzcG9uc2FibGUgZGUNCi1tb2RpZmllc05vZGVfdGV4dD1Nb2RpZmllDQotcmVzcG9uc2libGVSb2xlTm9kZV90ZXh0PVJcdTAwZjRsZSByZXNwb25zYWJsZQ0KLWNvbnRhaW5pbmdXb3JrUHJvZHVjdE5vZGVfdGV4dD1Qcm9kdWl0IGNvbnRlbmFudA0KLWNvbnRhaW5lZFdvcmtQcm9kdWN0c05vZGVfdGV4dD1Qcm9kdWl0cyBjb250ZW51cw0KLWd1aWRhbmNlTm9kZV90ZXh0PUNvbnNlaWwNCi1pbnB1dFRvTm9kZV90ZXh0PUVudHJcdTAwZTllIHZlcnMNCi1vdXRwdXRGcm9tTm9kZV90ZXh0PVNvcnRpZSBkZQ0KLQ0KLSMgSFRNTCBUaXRsZSBmb3IgSW5kZXggUGFnZQ0KLWluZGV4TGFiZWxfdGV4dD1JbmRleA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9SZXNvdXJjZXNfaXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9SZXNvdXJjZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY0ZDIxNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOiBJVVBQMDAwMEUgLSBJVVBQMDA5OUUNCi0jDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLXB1Ymxpc2hpbmdDb25maWd1cmF0aW9uVGFza19uYW1lPVB1YmJsaWNhemlvbmUgZGVsbGEgY29uZmlndXJhemlvbmUgaW4gY29yc28uLi4NCi1pbml0aWFsaXppbmdEaXJUYXNrX25hbWU9SW5pemlhbGl6emF6aW9uZSBkZWxsYSBkaXJlY3RvcnkgZGkgZGVzdGluYXppb25lIGluIGNvcnNvLi4uDQotY29weWluZ0ZpbGVzVGFza19uYW1lPUNvcGlhIGRlaSBmaWxlIGluIGNvcnNvLi4uDQotZ2VuZXJhdGluZ0Jvb2ttYXJrc1Rhc2tfbmFtZT1HZW5lcmF6aW9uZSBkZWkgc2VnbmFsaWJyaSBpbiBjb3Jzby4uLg0KLWdlbmVyYXRpbmdCb29rbWFya1Rhc2tfbmFtZT1HZW5lcmF6aW9uZSBkZWwgc2VnbmFsaWJybyAnJ3swfScnIGluIGNvcnNvLi4uDQotZ2VuZXJhdGluZ0Jvb2ttYXJrSW5kZXhUYXNrX25hbWU9R2VuZXJhemlvbmUgZGVsbCdpbmRpY2UgZGVsIHNlZ25hbGlicm8gaW4gY29yc28uLi4NCi1wdWJsaXNoaW5nTGlua2VkRWxlbWVudFRhc2tfbmFtZT1QdWJibGljYXppb25lIGRlZ2xpIGVsZW1lbnRpIGRpIG1ldG9kbzogezB9IHB1YmJsaWNhdGksIHsxfSByZXN0YW50aQ0KLXB1Ymxpc2hpbmdFbGVtZW50VGFza19uYW1lPVB1YmJsaWNhemlvbmUgZGVsbCcnZWxlbWVudG8gZGkgbWV0b2RvOiB7MH06ezF9DQotZ2VuZXJhdGluZ0dsb3NzYXJ5VGFza19uYW1lPUdlbmVyYXppb25lIGRlbCBnbG9zc2FyaW8gaW4gY29yc28uLi4NCi1nZW5lcmF0aW5nU2VhcmNoSW5kZXhUYXNrX25hbWU9R2VuZXJhemlvbmUgZGVsbCdpbmRpY2UgZGkgcmljZXJjYSBpbiBjb3Jzby4uLg0KLWJ1aWxkaW5nUHJvY2Vzc0Nsb3N1cmVUYXNrX25hbWU9Q3JlYXppb25lIGRlbGxhIGNoaXVzdXJhIGRlbCBwcm9jZXNzbyBpbiBjb3Jzby4uLg0KLWJ1aWxkaW5nRWxlbWVudENsb3N1cmVUYXNrX25hbWU9Q3JlYXppb25lIGRlbGwnJ2VsZW1lbnRvIGRpIGNoaXVzdXJhIHBlciAnJ3swfScnIGluIGNvcnNvLi4uDQotbG9hZExpYnJhcnlUYXNrX25hbWU9Q2FyaWNhbWVudG8gZGVsIGNvbnRlbnV0byBkZWxsYSBsaWJyZXJpYSBpbiBjb3Jzby4uLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMgbG9nZ2VkIGluIHRoZSBQdWJsaXNoaW5nIFJlcG9ydA0KLXB1Ymxpc2hFbGVtZW50RXJyb3JfbXNnPUlVUFAwMDAwRTogRXJyb3JlIGR1cmFudGUgbGEgcHViYmxpY2F6aW9uZSBkZWxsJydlbGVtZW50bzogezB9DQotc2VydmVyRXJyb3JfbXNnPUlVUFAwMDAxRTogTmVzc3VuIGRhdG8gcmVzdGl0dWl0byBkYWwgc2VydmVyLg0KLWludmFsaWRIdHRwUmVzcG9uc2VFcnJvcl9tc2c9SVVQUDAwMDJFOiBSaXNwb3N0YSBub24gdmFsaWRhIGRhIGh0dHA6Ly97MH06ezF9OnsyfQ0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0DQotaW52YWxpZEVsZW1lbnRXYXJuaW5nX21zZz1JVVBQMDAwM1c6IEwnZWxlbWVudG8gbm9uIFx1MDBlOCBzdGF0byBwdWJibGljYXRvIGluIHF1YW50byBub24gXHUwMGU4IHVuIGVsZW1lbnRvIHZhbGlkbyBkZWxsYSBjb25maWd1cmF6aW9uZS4NCi1pbnZhbGlkTWV0aG9kRWxlbWVudFdhcm5pbmdfbXNnPUlVUFAwMDA0VzogTCcnZWxlbWVudG8gbm9uIFx1MDBlOCBzdGF0byBwdWJibGljYXRvIGluIHF1YW50byBub24gXHUwMGU4IHVuIGVsZW1lbnRvIGRpIG1ldG9kbzogezB9DQotY29weUZpbGVXYXJuaW5nX21zZz1JVVBQMDAwNVc6IEltcG9zc2liaWxlIGNvcGlhcmUgaWwgZmlsZSBkYSAnJ3swfScnIGluICcnezF9JycuDQotbWlzc2luZ0ljb25GaWxlV2FybmluZ19tc2c9SVVQUDAwMDZXOiBJbCBmaWxlIGljb25hIGRlbCBub2RvICcnezB9Jycgbm9uIGVzaXN0ZS4NCi1taXNzaW5nSWNvbk5hbWVXYXJuaW5nX21zZz1JVVBQMDAwN1c6IEltcG9zc2liaWxlIHJlY3VwZXJhcmUgaWwgbm9tZSBkZWxsJ2ljb25hIGRlbCBub2RvLg0KLWV4dGVybmFsVXJsX21zZz11cmwgZXN0ZXJubyBkaSByaWZlcmltZW50bzogezB9DQotZGlzY2FyZWRDYXRlZ29yeVdhcm5pbmdfbXNnPUVsZW1lbnRvIGNhdGVnb3JpYSBjb250ZW51dG8gdnVvdG8gbm9uIHB1YmJsaWNhdG8uDQotDQotIyBFcnJvciBEZXRhaWxzDQotY3JlYXRlU2VhcmNoSW5kZXhFcnJvcl9tc2c9SVVQUDAwMDhFOiBJbCBmaWxlIGRlbGwnaW5kaWNlIGRpIHJpY2VyY2Egbm9uIFx1MDBlOCBzdGF0byBjcmVhdG8uDQotDQotIyBQcm9jZXNzIFRyZWUgTm9kZXMNCi1yZWZlcmVuY2VXb3JrZmxvd3NOb2RlX3RleHQ9Rmx1c3NpIGRpIGxhdm9ybyBkaSByaWZlcmltZW50bw0KLXRhc2tOb2RlX3RleHQ9T3BlcmF6aW9uaQ0KLXByaW1hcmlseVBlcmZvcm1zTm9kZV90ZXh0PUVzZWd1ZSBwcmluY2lwYWxtZW50ZQ0KLWFkZGl0aW9uYWxseVBlcmZvcm1zTm9kZV90ZXh0PUVzZWd1ZSBhbmNoZQ0KLXBlcmZvcm1pbmdSb2xlc05vZGVfdGV4dD1SdW9saSBlc2VjdXRpdmkNCi1pbnB1dFdvcmtQcm9kdWN0c05vZGVfdGV4dD1Qcm9kb3R0aSBkaSBsYXZvcm8gaW5wdXQNCi1vdXRwdXRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9UHJvZG90dGkgZGkgbGF2b3JvIG91dHB1dA0KLXJlc3BvbnNpYmxlRm9yTm9kZV90ZXh0PVJlc3BvbnNhYmlsZSBkaQ0KLW1vZGlmaWVzTm9kZV90ZXh0PU1vZGlmaWNhDQotcmVzcG9uc2libGVSb2xlTm9kZV90ZXh0PVJ1b2xvIHJlc3BvbnNhYmlsZQ0KLWNvbnRhaW5pbmdXb3JrUHJvZHVjdE5vZGVfdGV4dD1Qcm9kb3R0byBkaSBsYXZvcm8gZGEgaW5jbHVkZXJlDQotY29udGFpbmVkV29ya1Byb2R1Y3RzTm9kZV90ZXh0PVByb2RvdHRpIGRpIGxhdm9ybyBjb250ZW51dGkNCi1ndWlkYW5jZU5vZGVfdGV4dD1HdWlkYQ0KLWlucHV0VG9Ob2RlX3RleHQ9SW5wdXQgaW4NCi1vdXRwdXRGcm9tTm9kZV90ZXh0PU91dHB1dCBkaQ0KLQ0KLSMgSFRNTCBUaXRsZSBmb3IgSW5kZXggUGFnZQ0KLWluZGV4TGFiZWxfdGV4dD1JbmRpY2UNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NDI1ODkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQUDAwMDBFIC0gSVVQUDAwOTlFDQotIw0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1wdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZT1cdTY5Y2JcdTYyMTBcdTMwOTJcdTUxNmNcdTk1OGJcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkuLi4NCi1pbml0aWFsaXppbmdEaXJUYXNrX25hbWU9XHU1YjliXHU1MTQ4XHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHUzMDkyXHU1MjFkXHU2NzFmXHU1MzE2XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotY29weWluZ0ZpbGVzVGFza19uYW1lPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1MzBiM1x1MzBkNFx1MzBmY1x1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLWdlbmVyYXRpbmdCb29rbWFya3NUYXNrX25hbWU9XHUzMGQ2XHUzMGMzXHUzMGFmXHUzMGRlXHUzMGZjXHUzMGFmXHUzMDkyXHU3NTFmXHU2MjEwXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotZ2VuZXJhdGluZ0Jvb2ttYXJrVGFza19uYW1lPVx1MzBkNlx1MzBjM1x1MzBhZlx1MzBkZVx1MzBmY1x1MzBhZiAnJ3swfScnIFx1MzA5Mlx1NzUxZlx1NjIxMFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLWdlbmVyYXRpbmdCb29rbWFya0luZGV4VGFza19uYW1lPVx1MzBkNlx1MzBjM1x1MzBhZlx1MzBkZVx1MzBmY1x1MzBhZlx1N2QyMlx1NWYxNVx1MzA5Mlx1NzUxZlx1NjIxMFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLXB1Ymxpc2hpbmdMaW5rZWRFbGVtZW50VGFza19uYW1lPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMFx1MzA5Mlx1NTE2Y1x1OTU4Ylx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMlx1NTE2Y1x1OTU4Ylx1NmUwOFx1MzA3ZjogezB9XHUzMDAxXHU2YjhiXHUzMDhhOiB7MX0NCi1wdWJsaXNoaW5nRWxlbWVudFRhc2tfbmFtZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTg5ODFcdTdkMjBcdTMwOTJcdTUxNmNcdTk1OGJcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTk6IHswfTp7MX0NCi1nZW5lcmF0aW5nR2xvc3NhcnlUYXNrX25hbWU9XHU3NTI4XHU4YTllXHU5NmM2XHUzMDkyXHU3NTFmXHU2MjEwXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotZ2VuZXJhdGluZ1NlYXJjaEluZGV4VGFza19uYW1lPVx1NjkxY1x1N2QyMlx1N2QyMlx1NWYxNVx1MzA5Mlx1NzUxZlx1NjIxMFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLWJ1aWxkaW5nUHJvY2Vzc0Nsb3N1cmVUYXNrX25hbWU9XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDZlXHU2ODNjXHU3ZDBkXHU2YTVmXHU2OWNiXHUzMDkyXHUzMGQzXHUzMGViXHUzMGM5XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotYnVpbGRpbmdFbGVtZW50Q2xvc3VyZVRhc2tfbmFtZT0nJ3swfScnIFx1MzA2ZVx1ODk4MVx1N2QyMFx1MzA2ZVx1NjgzY1x1N2QwZFx1NmE1Zlx1NjljYlx1MzA5Mlx1MzBkM1x1MzBlYlx1MzBjOVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLWxvYWRMaWJyYXJ5VGFza19uYW1lPVx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMgbG9nZ2VkIGluIHRoZSBQdWJsaXNoaW5nIFJlcG9ydA0KLXB1Ymxpc2hFbGVtZW50RXJyb3JfbXNnPUlVUFAwMDAwRTogXHU4OTgxXHU3ZDIwXHUzMDkyXHU1MTZjXHU5NThiXHU0ZTJkXHUzMDZiXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiB7MH0NCi1zZXJ2ZXJFcnJvcl9tc2c9SVVQUDAwMDFFOiBcdTMwYjVcdTMwZmNcdTMwZDBcdTMwZmNcdTMwNGJcdTMwODlcdTMwYzdcdTMwZmNcdTMwYmZcdTMwNGNcdTYyM2JcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1pbnZhbGlkSHR0cFJlc3BvbnNlRXJyb3JfbXNnPUlVUFAwMDAyRTogaHR0cDovL3swfTp7MX06ezJ9IFx1MzA0Ylx1MzA4OVx1MzA2ZVx1NWZkY1x1N2I1NFx1MzA0Y1x1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OVx1MzAwMg0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0DQotaW52YWxpZEVsZW1lbnRXYXJuaW5nX21zZz1JVVBQMDAwM1c6IFx1ODk4MVx1N2QyMFx1MzA0Y1x1NjljYlx1NjIxMFx1NTE4NVx1MzA2N1x1NjcwOVx1NTJiOVx1MzA2YVx1ODk4MVx1N2QyMFx1MzA2N1x1MzA2Zlx1MzA2YVx1MzA0NFx1MzA1Zlx1MzA4MVx1MzAwMVx1NTE2Y1x1OTU4Ylx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMg0KLWludmFsaWRNZXRob2RFbGVtZW50V2FybmluZ19tc2c9SVVQUDAwMDRXOiBcdTg5ODFcdTdkMjBcdTMwNmZcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTg5ODFcdTdkMjBcdTMwNjdcdTMwNmZcdTMwNmFcdTMwNDRcdTMwNWZcdTMwODFcdTMwMDFcdTUxNmNcdTk1OGJcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWY6IHswfQ0KLWNvcHlGaWxlV2FybmluZ19tc2c9SVVQUDAwMDVXOiBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwOTInJ3swfScnIFx1MzA0Ylx1MzA4OSAnJ3sxfScnIFx1MzA2Ylx1MzBiM1x1MzBkNFx1MzBmY1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLW1pc3NpbmdJY29uRmlsZVdhcm5pbmdfbXNnPUlVUFAwMDA2VzogXHUzMGNlXHUzMGZjXHUzMGM5XHUzMGZiXHUzMGEyXHUzMGE0XHUzMGIzXHUzMGYzXHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViICcnezB9JycgXHUzMDRjXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotbWlzc2luZ0ljb25OYW1lV2FybmluZ19tc2c9SVVQUDAwMDdXOiBcdTMwY2VcdTMwZmNcdTMwYzlcdTMwZmJcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjNcdTMwNmVcdTU0MGRcdTUyNGRcdTMwOTJcdTUzZDZcdTVmOTdcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1leHRlcm5hbFVybF9tc2c9XHU2YjIxXHUzMDZlXHU1OTE2XHU5MGU4IFVSTCBcdTMwOTJcdTUzYzJcdTcxNjdcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTk6IHswfQ0KLWRpc2NhcmVkQ2F0ZWdvcnlXYXJuaW5nX21zZz1cdTdhN2FcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwZmJcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmNcdTg5ODFcdTdkMjBcdTMwNGNcdTUxNmNcdTk1OGJcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDINCi0NCi0jIEVycm9yIERldGFpbHMNCi1jcmVhdGVTZWFyY2hJbmRleEVycm9yX21zZz1JVVBQMDAwOEU6IFx1NjkxY1x1N2QyMlx1N2QyMlx1NWYxNVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1NGY1Y1x1NjIxMFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMg0KLQ0KLSMgUHJvY2VzcyBUcmVlIE5vZGVzDQotcmVmZXJlbmNlV29ya2Zsb3dzTm9kZV90ZXh0PVx1NTNjMlx1NzE2N1x1MzBlZlx1MzBmY1x1MzBhZlx1MzBkNVx1MzBlZFx1MzBmYw0KLXRhc2tOb2RlX3RleHQ9XHUzMGJmXHUzMGI5XHUzMGFmDQotcHJpbWFyaWx5UGVyZm9ybXNOb2RlX3RleHQ9XHU0ZTNiXHUzMDZhXHUzMGJmXHUzMGI5XHUzMGFmDQotYWRkaXRpb25hbGx5UGVyZm9ybXNOb2RlX3RleHQ9XHU4ZmZkXHU1MmEwXHU1YjlmXHU4ODRjDQotcGVyZm9ybWluZ1JvbGVzTm9kZV90ZXh0PVx1NWI5Zlx1ODg0Y1x1MzBlZFx1MzBmY1x1MzBlYg0KLWlucHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0PVx1NTE2NVx1NTI5Ylx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLW91dHB1dFdvcmtQcm9kdWN0c05vZGVfdGV4dD1cdTUxZmFcdTUyOWJcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzgNCi1yZXNwb25zaWJsZUZvck5vZGVfdGV4dD1cdTYyYzVcdTVmNTMNCi1tb2RpZmllc05vZGVfdGV4dD1cdTU5MDlcdTY2ZjQNCi1yZXNwb25zaWJsZVJvbGVOb2RlX3RleHQ9XHU2MmM1XHU1ZjUzXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGViDQotY29udGFpbmluZ1dvcmtQcm9kdWN0Tm9kZV90ZXh0PVx1NTNjZVx1NWJiOVx1NTA3NFx1MzA2ZVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLWNvbnRhaW5lZFdvcmtQcm9kdWN0c05vZGVfdGV4dD1cdTUzY2VcdTViYjlcdTViZmVcdThjNjFcdTMwNmVcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzgNCi1ndWlkYW5jZU5vZGVfdGV4dD1cdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjkNCi1pbnB1dFRvTm9kZV90ZXh0PVx1NTE2NVx1NTI5Ylx1NTE0OA0KLW91dHB1dEZyb21Ob2RlX3RleHQ9XHU1MWZhXHU1MjliXHU1MTQzDQotDQotIyBIVE1MIFRpdGxlIGZvciBJbmRleCBQYWdlDQotaW5kZXhMYWJlbF90ZXh0PVx1N2QyMlx1NWYxNQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9SZXNvdXJjZXNfa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkYjNhMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jDQotIyBNZXNzYWdlIElEIFJhbmdlOiBJVVBQMDAwMEUgLSBJVVBQMDA5OUUNCi0jDQotDQotIyBQcm9ncmVzcyBNZXNzYWdlcw0KLXB1Ymxpc2hpbmdDb25maWd1cmF0aW9uVGFza19uYW1lPVx1YWQ2Y1x1YzEzMVx1Yzc0NCBcdWFjZjVcdWFjMWNcdWQ1NThcdWIyOTQgXHVjOTExLi4uDQotaW5pdGlhbGl6aW5nRGlyVGFza19uYW1lPVx1YjMwMFx1YzBjMSBcdWI1MTRcdWI4MDlcdWQxYTBcdWI5YWNcdWI5N2MgXHVjZDA4XHVhZTMwXHVkNjU0XHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLWNvcHlpbmdGaWxlc1Rhc2tfbmFtZT1cdWQzMGNcdWM3N2NcdWM3NDQgXHViY2Y1XHVjMGFjXHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLWdlbmVyYXRpbmdCb29rbWFya3NUYXNrX25hbWU9XHVjYzQ1XHVhYzA4XHVkNTNjXHViOTdjIFx1YzBkZFx1YzEzMVx1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1nZW5lcmF0aW5nQm9va21hcmtUYXNrX25hbWU9Jyd7MH0nJyBcdWNjNDVcdWFjMDhcdWQ1M2NcdWI5N2MgXHVjMGRkXHVjMTMxXHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLWdlbmVyYXRpbmdCb29rbWFya0luZGV4VGFza19uYW1lPVx1Y2M0NVx1YWMwOFx1ZDUzYyBcdWMwYzlcdWM3NzhcdWM3NDQgXHVjMGRkXHVjMTMxXHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLXB1Ymxpc2hpbmdMaW5rZWRFbGVtZW50VGFza19uYW1lPVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWM2OTRcdWMxOGNcdWI5N2MgXHVhY2Y1XHVhYzFjXHVkNTU4XHViMjk0IFx1YzkxMTogezB9IFx1YWNmNVx1YWMxYyBcdWM2NDRcdWI4Y2MsIHsxfSBcdWIwYThcdWM3NGMNCi1wdWJsaXNoaW5nRWxlbWVudFRhc2tfbmFtZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNjk0XHVjMThjXHViOTdjIFx1YWNmNVx1YWMxY1x1ZDU1OFx1YjI5NCBcdWM5MTE6IHswfTp7MX0NCi1nZW5lcmF0aW5nR2xvc3NhcnlUYXNrX25hbWU9XHVjNmE5XHVjNWI0XHVjOWQxXHVjNzQ0IFx1YzBkZFx1YzEzMVx1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1nZW5lcmF0aW5nU2VhcmNoSW5kZXhUYXNrX25hbWU9XHVhYzgwXHVjMGM5IFx1YzBjOVx1Yzc3OFx1Yzc0NCBcdWMwZGRcdWMxMzFcdWQ1NThcdWIyOTQgXHVjOTExLi4uDQotYnVpbGRpbmdQcm9jZXNzQ2xvc3VyZVRhc2tfbmFtZT1cdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHViMmViXHVhZTMwXHViOTdjIFx1YmU0Y1x1YjRkY1x1ZDU1OFx1YjI5NCBcdWM5MTEuLi4NCi1idWlsZGluZ0VsZW1lbnRDbG9zdXJlVGFza19uYW1lPScnezB9JydcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzY5NFx1YzE4YyBcdWIyZWJcdWFlMzBcdWI5N2MgXHViZTRjXHViNGRjXHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLWxvYWRMaWJyYXJ5VGFza19uYW1lPVx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhYyBcdWNlZThcdWQxNTBcdWNlMjBcdWI5N2MgXHViODVjXHViNGRjXHVkNTU4XHViMjk0IFx1YzkxMS4uLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMgbG9nZ2VkIGluIHRoZSBQdWJsaXNoaW5nIFJlcG9ydA0KLXB1Ymxpc2hFbGVtZW50RXJyb3JfbXNnPUlVUFAwMDAwRTogXHVjNjk0XHVjMThjXHViOTdjIFx1YWNmNVx1YWMxY1x1ZDU1OFx1YjI5NCBcdWM5MTFcdWM1ZDAgXHVjNjI0XHViOTU4IFx1YmMxY1x1YzBkZDogezB9DQotc2VydmVyRXJyb3JfbXNnPUlVUFAwMDAxRTogXHVjMTFjXHViYzg0XHVjNWQwXHVjMTFjIFx1YjlhY1x1ZDEzNFx1YjQxYyBcdWIzNzBcdWM3NzRcdWQxMzBcdWFjMDAgXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWludmFsaWRIdHRwUmVzcG9uc2VFcnJvcl9tc2c9SVVQUDAwMDJFOiBcdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjNzQwIFx1Yzc1MVx1YjJmNShodHRwOi8vezB9OnsxfTp7Mn0pDQotDQotIyBXYXJuaW5nIE1lc3NhZ2VzIGxvZ2dlZCBpbiB0aGUgUHVibGlzaGluZyBSZXBvcnQNCi1pbnZhbGlkRWxlbWVudFdhcm5pbmdfbXNnPUlVUFAwMDAzVzogXHVjNjk0XHVjMThjXHVhYzAwIFx1YWQ2Y1x1YzEzMVx1Yzc1OCBcdWM2MmNcdWJjMTRcdWI5NzggXHVjNjk0XHVjMThjXHVhYzAwIFx1YzU0NFx1YjJjOFx1YWUzMCBcdWI1NGNcdWJiMzhcdWM1ZDAgXHVhY2Y1XHVhYzFjXHViNDE4XHVjOWMwIFx1YzU0YVx1YzU1OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1pbnZhbGlkTWV0aG9kRWxlbWVudFdhcm5pbmdfbXNnPUlVUFAwMDA0VzogXHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4Y1x1YWMwMCBcdWM1NDRcdWIyYzhcdWFlMzAgXHViNTRjXHViYjM4XHVjNWQwIHswfSBcdWM2OTRcdWMxOGNcdWFjMDAgXHVhY2Y1XHVhYzFjXHViNDE4XHVjOWMwIFx1YzU0YVx1YzU1OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1jb3B5RmlsZVdhcm5pbmdfbXNnPUlVUFAwMDA1VzogJyd7MH0nJ1x1YzVkMFx1YzExYyAnJ3sxfScnKFx1YzczYylcdWI4NWMgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YmNmNVx1YzBhY1x1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLW1pc3NpbmdJY29uRmlsZVdhcm5pbmdfbXNnPUlVUFAwMDA2VzogXHViMTc4XHViNGRjIFx1YzU0NFx1Yzc3NFx1Y2Y1OCBcdWQzMGNcdWM3N2MgJyd7MH0nJ1x1Yzc3NChcdWFjMDApIFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1taXNzaW5nSWNvbk5hbWVXYXJuaW5nX21zZz1JVVBQMDAwN1c6IFx1YjE3OFx1YjRkYyBcdWM1NDRcdWM3NzRcdWNmNThcdWM3NTggXHVjNzc0XHViOTg0XHVjNzQ0IFx1YWM4MFx1YzBjOVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWV4dGVybmFsVXJsX21zZz1cdWNjMzhcdWM4NzBcdWQ1NThcdWIyOTQgXHVjNjc4XHViZDgwIFVSTDogezB9DQotZGlzY2FyZWRDYXRlZ29yeVdhcm5pbmdfbXNnPVx1YmU0NFx1YzViNCBcdWM3ODhcdWIyOTQgXHVjZWU4XHVkMTUwXHVjZTIwIFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYyBcdWM2OTRcdWMxOGNcdWIyOTQgXHVhY2Y1XHVhYzFjXHViNDE4XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIEVycm9yIERldGFpbHMNCi1jcmVhdGVTZWFyY2hJbmRleEVycm9yX21zZz1JVVBQMDAwOEU6IFx1YWM4MFx1YzBjOSBcdWMwYzlcdWM3NzggXHVkMzBjXHVjNzdjXHVjNzc0IFx1Yzc5MVx1YzEzMVx1YjQxOFx1YzljMCBcdWM1NGFcdWM1NThcdWMyYjVcdWIyYzhcdWIyZTQuDQotDQotIyBQcm9jZXNzIFRyZWUgTm9kZXMNCi1yZWZlcmVuY2VXb3JrZmxvd3NOb2RlX3RleHQ9XHVjYzM4XHVjODcwIFx1YzZjY1x1ZDA2Y1x1ZDUwY1x1Yjg1Y1x1YzZiMA0KLXRhc2tOb2RlX3RleHQ9XHVkMGMwXHVjMmE0XHVkMDZjDQotcHJpbWFyaWx5UGVyZm9ybXNOb2RlX3RleHQ9XHVhZTMwXHViY2Y4IFx1YzIxOFx1ZDU4OQ0KLWFkZGl0aW9uYWxseVBlcmZvcm1zTm9kZV90ZXh0PVx1Y2Q5NFx1YWMwMCBcdWMyMThcdWQ1ODkNCi1wZXJmb3JtaW5nUm9sZXNOb2RlX3RleHQ9XHVjMjE4XHVkNTg5IFx1YzVlZFx1ZDU2MA0KLWlucHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0PVx1Yzc4NVx1YjgyNSBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjDQotb3V0cHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0PVx1Y2Q5Y1x1YjgyNSBcdWM5MTFcdWFjMDQgXHVjMGIwXHVjZDljXHViYjNjDQotcmVzcG9uc2libGVGb3JOb2RlX3RleHQ9XHVjYzQ1XHVjNzg0IFx1YzBhY1x1ZDU2ZDoNCi1tb2RpZmllc05vZGVfdGV4dD1cdWMyMThcdWM4MTUNCi1yZXNwb25zaWJsZVJvbGVOb2RlX3RleHQ9XHVjYzQ1XHVjNzg0XHVjNzQ0IFx1YjllMVx1Yzc0MCBcdWM1ZWRcdWQ1NjANCi1jb250YWluaW5nV29ya1Byb2R1Y3ROb2RlX3RleHQ9XHVkM2VjXHVkNTY4XHVkNTU4XHViMjk0IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi1jb250YWluZWRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9XHVkM2VjXHVkNTY4XHViNDE4XHViMjk0IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi1ndWlkYW5jZU5vZGVfdGV4dD1cdWM1NDhcdWIwYjQNCi1pbnB1dFRvTm9kZV90ZXh0PVx1Yzc4NVx1YjgyNSBcdWIzMDBcdWMwYzENCi1vdXRwdXRGcm9tTm9kZV90ZXh0PVx1YzBiMFx1Y2Q5YyBcdWM5YzBcdWM4MTANCi0NCi0jIEhUTUwgVGl0bGUgZm9yIEluZGV4IFBhZ2UNCi1pbmRleExhYmVsX3RleHQ9XHVjMGM5XHVjNzc4DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWVmMDYzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUFAwMDAwRSAtIElVUFAwMDk5RQ0KLSMNCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotcHVibGlzaGluZ0NvbmZpZ3VyYXRpb25UYXNrX25hbWU9UHVibGljYW5kbyBhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28uLi4NCi1pbml0aWFsaXppbmdEaXJUYXNrX25hbWU9SW5pY2lhbGl6YW5kbyBvIGRpcmV0XHUwMGYzcmlvIGRlIGRlc3Rpbm8uLi4NCi1jb3B5aW5nRmlsZXNUYXNrX25hbWU9Q29waWFuZG8gYXJxdWl2b3MuLi4NCi1nZW5lcmF0aW5nQm9va21hcmtzVGFza19uYW1lPUdlcmFuZG8gbWFyY2Fkb3Jlcy4uLg0KLWdlbmVyYXRpbmdCb29rbWFya1Rhc2tfbmFtZT1HZXJhbmRvIG8gbWFyY2Fkb3IgJyd7MH0nJy4uLg0KLWdlbmVyYXRpbmdCb29rbWFya0luZGV4VGFza19uYW1lPUdlcmFuZG8gXHUwMGVkbmRpY2UgZGUgbWFyY2Fkb3Jlcy4uLg0KLXB1Ymxpc2hpbmdMaW5rZWRFbGVtZW50VGFza19uYW1lPVB1YmxpY2FuZG8gZWxlbWVudG9zIGRlIG1cdTAwZTl0b2RvOiB7MH0gcHVibGljYWRvcywgezF9IHJlc3RhbnRlcw0KLXB1Ymxpc2hpbmdFbGVtZW50VGFza19uYW1lPVB1YmxpY2FuZG8gbyBlbGVtZW50byBkZSBtXHUwMGU5dG9kbzogezB9OnsxfQ0KLWdlbmVyYXRpbmdHbG9zc2FyeVRhc2tfbmFtZT1HZXJhbmRvIGdsb3NzXHUwMGUxcmlvLi4uDQotZ2VuZXJhdGluZ1NlYXJjaEluZGV4VGFza19uYW1lPUdlcmFuZG8gXHUwMGVkbmRpY2UgZGUgcHJvY3VyYS4uLg0KLWJ1aWxkaW5nUHJvY2Vzc0Nsb3N1cmVUYXNrX25hbWU9Q29uc3RydWluZG8gZmVjaGFtZW50byBkbyBwcm9jZXNzby4uLg0KLWJ1aWxkaW5nRWxlbWVudENsb3N1cmVUYXNrX25hbWU9Q29uc3RydWluZG8gZmVjaGFtZW50byBkZSBlbGVtZW50byBwYXJhICcnezB9JycuLi4NCi1sb2FkTGlicmFyeVRhc2tfbmFtZT1DYXJyZWdhbmRvIGNvbnRlXHUwMGZhZG8gZGEgYmlibGlvdGVjYS4uLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMgbG9nZ2VkIGluIHRoZSBQdWJsaXNoaW5nIFJlcG9ydA0KLXB1Ymxpc2hFbGVtZW50RXJyb3JfbXNnPUlVUFAwMDAwRTogRXJybyBhbyBwdWJsaWNhciBvIGVsZW1lbnRvOiB7MH0NCi1zZXJ2ZXJFcnJvcl9tc2c9SVVQUDAwMDFFOiBOZW5odW0gZGFkbyByZXRvcm5hZG8gZG8gc2Vydmlkb3IuDQotaW52YWxpZEh0dHBSZXNwb25zZUVycm9yX21zZz1JVVBQMDAwMkU6IFJlc3Bvc3RhIGludlx1MDBlMWxpZGEgZGUgaHR0cDovL3swfTp7MX06ezJ9DQotDQotIyBXYXJuaW5nIE1lc3NhZ2VzIGxvZ2dlZCBpbiB0aGUgUHVibGlzaGluZyBSZXBvcnQNCi1pbnZhbGlkRWxlbWVudFdhcm5pbmdfbXNnPUlVUFAwMDAzVzogTyBlbGVtZW50byBuXHUwMGUzbyBmb2kgcHVibGljYWRvIHBvcnF1ZSBuXHUwMGUzbyBcdTAwZTkgdW0gZWxlbWVudG8gdlx1MDBlMWxpZG8gbmEgY29uZmlndXJhXHUwMGU3XHUwMGUzby4NCi1pbnZhbGlkTWV0aG9kRWxlbWVudFdhcm5pbmdfbXNnPUlVUFAwMDA0VzogTyBlbGVtZW50byBuXHUwMGUzbyBmb2kgcHVibGljYWRvIHBvcnF1ZSBuXHUwMGUzbyBcdTAwZTkgdW0gZWxlbWVudG8gZGUgbVx1MDBlOXRvZG86IHswfQ0KLWNvcHlGaWxlV2FybmluZ19tc2c9SVVQUDAwMDVXOiBOXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBjb3BpYXIgbyBhcnF1aXZvIGRlICcnezB9JycgcGFyYSAnJ3sxfScnLg0KLW1pc3NpbmdJY29uRmlsZVdhcm5pbmdfbXNnPUlVUFAwMDA2VzogTyBhcnF1aXZvIGRlIFx1MDBlZGNvbmUgZG8gblx1MDBmMyAnJ3swfScnIG5cdTAwZTNvIGV4aXN0ZS4NCi1taXNzaW5nSWNvbk5hbWVXYXJuaW5nX21zZz1JVVBQMDAwN1c6IE5cdTAwZTNvIGZvaSBwb3NzXHUwMGVkdmVsIHJlY3VwZXJhciBvIG5vbWUgZG8gXHUwMGVkY29uZSBkbyBuXHUwMGYzLg0KLWV4dGVybmFsVXJsX21zZz1yZWZlcmVuY2lhbmRvIFVSTCBleHRlcm5hOiB7MH0NCi1kaXNjYXJlZENhdGVnb3J5V2FybmluZ19tc2c9TyBlbGVtZW50byBkYSBjYXRlZ29yaWEgZGUgY29udGVcdTAwZmFkbyB2YXppbyBuXHUwMGUzbyBmb2kgcHVibGljYWRvLg0KLQ0KLSMgRXJyb3IgRGV0YWlscw0KLWNyZWF0ZVNlYXJjaEluZGV4RXJyb3JfbXNnPUlVUFAwMDA4RTogTyBhcnF1aXZvIGRlIFx1MDBlZG5kaWNlIGRlIHByb2N1cmEgblx1MDBlM28gZm9pIGNyaWFkby4NCi0NCi0jIFByb2Nlc3MgVHJlZSBOb2Rlcw0KLXJlZmVyZW5jZVdvcmtmbG93c05vZGVfdGV4dD1GbHV4b3MgZGUgVHJhYmFsaG8gZGUgUmVmZXJcdTAwZWFuY2lhDQotdGFza05vZGVfdGV4dD1UYXJlZmFzDQotcHJpbWFyaWx5UGVyZm9ybXNOb2RlX3RleHQ9UHJpbWFyaWFtZW50ZSBEZXNlbXBlbmhhDQotYWRkaXRpb25hbGx5UGVyZm9ybXNOb2RlX3RleHQ9QWRpY2lvbmFsbWVudGUgRGVzZW1wZW5oYQ0KLXBlcmZvcm1pbmdSb2xlc05vZGVfdGV4dD1EZXNlbXBlbmhhbmRvIEZ1blx1MDBlN1x1MDBmNWVzDQotaW5wdXRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9UHJvZHV0b3MgZGUgVHJhYmFsaG8gZGUgRW50cmFkYQ0KLW91dHB1dFdvcmtQcm9kdWN0c05vZGVfdGV4dD1Qcm9kdXRvcyBkZSBUcmFiYWxobyBkZSBTYVx1MDBlZGRhDQotcmVzcG9uc2libGVGb3JOb2RlX3RleHQ9UmVzcG9uc1x1MDBlMXZlbCBwb3INCi1tb2RpZmllc05vZGVfdGV4dD1Nb2RpZmljYQ0KLXJlc3BvbnNpYmxlUm9sZU5vZGVfdGV4dD1GdW5cdTAwZTdcdTAwZTNvIFJlc3BvbnNcdTAwZTF2ZWwNCi1jb250YWluaW5nV29ya1Byb2R1Y3ROb2RlX3RleHQ9Q29udGVuZG8gUHJvZHV0byBkZSBUcmFiYWxobw0KLWNvbnRhaW5lZFdvcmtQcm9kdWN0c05vZGVfdGV4dD1Db250aW5oYSBQcm9kdXRvcyBkZSBUcmFiYWxobw0KLWd1aWRhbmNlTm9kZV90ZXh0PU9yaWVudGFcdTAwZTdcdTAwZTNvDQotaW5wdXRUb05vZGVfdGV4dD1FbnRyYWRhIHBhcmENCi1vdXRwdXRGcm9tTm9kZV90ZXh0PVNhXHUwMGVkZGEgZGUNCi0NCi0jIEhUTUwgVGl0bGUgZm9yIEluZGV4IFBhZ2UNCi1pbmRleExhYmVsX3RleHQ9XHUwMGNkbmRpY2UNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MGE4MWIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQUDAwMDBFIC0gSVVQUDAwOTlFDQotIw0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1wdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTUzZDFcdTVlMDNcdTkxNGRcdTdmNmUuLi4NCi1pbml0aWFsaXppbmdEaXJUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU1MjFkXHU1OWNiXHU1MzE2XHU3NmVlXHU2ODA3XHU3NmVlXHU1ZjU1Li4uDQotY29weWluZ0ZpbGVzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NTkwZFx1NTIzNlx1NjU4N1x1NGVmNi4uLg0KLWdlbmVyYXRpbmdCb29rbWFya3NUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU3NTFmXHU2MjEwXHU0ZTY2XHU3YjdlLi4uDQotZ2VuZXJhdGluZ0Jvb2ttYXJrVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NzUxZlx1NjIxMFx1NGU2Nlx1N2I3ZVx1MjAxY3swfVx1MjAxZC4uLg0KLWdlbmVyYXRpbmdCb29rbWFya0luZGV4VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NzUxZlx1NjIxMFx1NGU2Nlx1N2I3ZVx1N2QyMlx1NWYxNS4uLg0KLXB1Ymxpc2hpbmdMaW5rZWRFbGVtZW50VGFza19uYW1lPVx1NTNkMVx1NWUwM1x1NjViOVx1NmNkNVx1NTE0M1x1N2QyMFx1ZmYxYVx1NWRmMlx1NTNkMVx1NWUwMyB7MH0gXHU0ZTJhXHVmZjBjXHU1MjY5XHU0ZjU5IHsxfSBcdTRlMmENCi1wdWJsaXNoaW5nRWxlbWVudFRhc2tfbmFtZT1cdTUzZDFcdTVlMDNcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdWZmMWF7MH1cdWZmMWF7MX0NCi1nZW5lcmF0aW5nR2xvc3NhcnlUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU3NTFmXHU2MjEwXHU4YmNkXHU2YzQ3XHU4ODY4Li4uDQotZ2VuZXJhdGluZ1NlYXJjaEluZGV4VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NzUxZlx1NjIxMFx1NjQxY1x1N2QyMlx1N2QyMlx1NWYxNS4uLg0KLWJ1aWxkaW5nUHJvY2Vzc0Nsb3N1cmVUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU2Nzg0XHU1ZWZhXHU2ZDQxXHU3YTBiXHU5NWVkXHU1NDA4Li4uDQotYnVpbGRpbmdFbGVtZW50Q2xvc3VyZVRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTRlM2FcdTIwMWN7MH1cdTIwMWRcdTY3ODRcdTVlZmFcdTUxNDNcdTdkMjBcdTk1ZWRcdTU0MDguLi4NCi1sb2FkTGlicmFyeVRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTg4YzVcdTUxNjVcdTVlOTNcdTUxODVcdTViYjkuLi4NCi0NCi0jIEVycm9yIE1lc3NhZ2VzIGxvZ2dlZCBpbiB0aGUgUHVibGlzaGluZyBSZXBvcnQNCi1wdWJsaXNoRWxlbWVudEVycm9yX21zZz1JVVBQMDAwMEU6IFx1NTNkMVx1NWUwM1x1NTE0M1x1N2QyMFx1NjVmNlx1NTFmYVx1OTUxOVx1ZmYxYXswfQ0KLXNlcnZlckVycm9yX21zZz1JVVBQMDAwMUU6IFx1NjcwZFx1NTJhMVx1NTY2OFx1NjcyYVx1OGZkNFx1NTZkZVx1NGVmYlx1NGY1NVx1NjU3MFx1NjM2ZVx1MzAwMg0KLWludmFsaWRIdHRwUmVzcG9uc2VFcnJvcl9tc2c9SVVQUDAwMDJFOiBcdTY3NjVcdTgxZWEgaHR0cDovL3swfTp7MX06ezJ9IFx1NzY4NFx1NTRjZFx1NWU5NFx1NjVlMFx1NjU0OA0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0DQotaW52YWxpZEVsZW1lbnRXYXJuaW5nX21zZz1JVVBQMDAwM1c6IFx1NTE0M1x1N2QyMFx1NjcyYVx1NTNkMVx1NWUwM1x1ZmYwY1x1NTZlMFx1NGUzYVx1NWI4M1x1NGUwZFx1NjYyZlx1OTE0ZFx1N2Y2ZVx1NGUyZFx1NzY4NFx1NjcwOVx1NjU0OFx1NTE0M1x1N2QyMFx1MzAwMg0KLWludmFsaWRNZXRob2RFbGVtZW50V2FybmluZ19tc2c9SVVQUDAwMDRXOiBcdTUxNDNcdTdkMjBcdTY3MmFcdTUzZDFcdTVlMDNcdWZmMGNcdTU2ZTBcdTRlM2FcdTViODNcdTRlMGRcdTY2MmZcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdWZmMWF7MH0NCi1jb3B5RmlsZVdhcm5pbmdfbXNnPUlVUFAwMDA1VzogXHU2NWUwXHU2Y2Q1XHU1YzA2XHU2NTg3XHU0ZWY2XHU0ZWNlXHUyMDFjezB9XHUyMDFkXHU1OTBkXHU1MjM2XHU1MjMwXHUyMDFjezF9XHUyMDFkXHUzMDAyDQotbWlzc2luZ0ljb25GaWxlV2FybmluZ19tc2c9SVVQUDAwMDZXOiBcdTgyODJcdTcwYjlcdTU2ZmVcdTY4MDdcdTY1ODdcdTRlZjZcdTIwMWN7MH1cdTIwMWRcdTRlMGRcdTViNThcdTU3MjhcdTMwMDINCi1taXNzaW5nSWNvbk5hbWVXYXJuaW5nX21zZz1JVVBQMDAwN1c6IFx1NjVlMFx1NmNkNVx1NjhjMFx1N2QyMlx1ODI4Mlx1NzBiOVx1NTZmZVx1NjgwN1x1NzY4NFx1NTQwZFx1NzlmMFx1MzAwMg0KLWV4dGVybmFsVXJsX21zZz1cdTZiNjNcdTU3MjhcdTVmMTVcdTc1MjhcdTU5MTZcdTkwZTggdXJsXHVmZjFhezB9DQotZGlzY2FyZWRDYXRlZ29yeVdhcm5pbmdfbXNnPVx1NjcyYVx1NTNkMVx1NWUwM1x1N2E3YVx1NzY4NFx1NTE4NVx1NWJiOVx1N2M3Ylx1NTIyYlx1NTE0M1x1N2QyMFx1MzAwMg0KLQ0KLSMgRXJyb3IgRGV0YWlscw0KLWNyZWF0ZVNlYXJjaEluZGV4RXJyb3JfbXNnPUlVUFAwMDA4RTogXHU2NDFjXHU3ZDIyXHU3ZDIyXHU1ZjE1XHU2NTg3XHU0ZWY2XHU2NzJhXHU1MjFiXHU1ZWZhXHUzMDAyDQotDQotIyBQcm9jZXNzIFRyZWUgTm9kZXMNCi1yZWZlcmVuY2VXb3JrZmxvd3NOb2RlX3RleHQ9XHU1ZjE1XHU3NTI4XHU1ZGU1XHU0ZjVjXHU2ZDQxDQotdGFza05vZGVfdGV4dD1cdTRlZmJcdTUyYTENCi1wcmltYXJpbHlQZXJmb3Jtc05vZGVfdGV4dD1cdTRlM2JcdTg5ODFcdTYyNjdcdTg4NGMNCi1hZGRpdGlvbmFsbHlQZXJmb3Jtc05vZGVfdGV4dD1cdThmZDhcdTYyNjdcdTg4NGMNCi1wZXJmb3JtaW5nUm9sZXNOb2RlX3RleHQ9XHU2MjY3XHU4ODRjXHU4OWQyXHU4MjcyDQotaW5wdXRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9XHU4ZjkzXHU1MTY1XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotb3V0cHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0PVx1OGY5M1x1NTFmYVx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMQ0KLXJlc3BvbnNpYmxlRm9yTm9kZV90ZXh0PVx1OGQxZlx1OGQyMw0KLW1vZGlmaWVzTm9kZV90ZXh0PVx1NGZlZVx1NjUzOQ0KLXJlc3BvbnNpYmxlUm9sZU5vZGVfdGV4dD1cdThkMWZcdThkMjNcdTc2ODRcdTg5ZDJcdTgyNzINCi1jb250YWluaW5nV29ya1Byb2R1Y3ROb2RlX3RleHQ9XHU1MzA1XHU1NDJiXHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotY29udGFpbmVkV29ya1Byb2R1Y3RzTm9kZV90ZXh0PVx1ODhhYlx1NTMwNVx1NTQyYlx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMQ0KLWd1aWRhbmNlTm9kZV90ZXh0PVx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zg0KLWlucHV0VG9Ob2RlX3RleHQ9XHU4ZjkzXHU1MTY1XHU4MWYzDQotb3V0cHV0RnJvbU5vZGVfdGV4dD1cdThmOTNcdTUxZmFcdTgxZWENCi0NCi0jIEhUTUwgVGl0bGUgZm9yIEluZGV4IFBhZ2UNCi1pbmRleExhYmVsX3RleHQ9XHU3ZDIyXHU1ZjE1DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTI1NDNjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMNCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUFAwMDAwRSAtIElVUFAwMDk5RQ0KLSMNCi0NCi0jIFByb2dyZXNzIE1lc3NhZ2VzDQotcHVibGlzaGluZ0NvbmZpZ3VyYXRpb25UYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU3NjdjXHU0ZjQ4XHU5MTRkXHU3ZjZlLi4uDQotaW5pdGlhbGl6aW5nRGlyVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1OGQ3N1x1NTljYlx1OGEyZFx1NWI5YVx1NzZlZVx1NmExOVx1NzZlZVx1OTMwNC4uLg0KLWNvcHlpbmdGaWxlc1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTg5MDdcdTg4ZmRcdTZhOTRcdTY4NDguLi4NCi1nZW5lcmF0aW5nQm9va21hcmtzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NzUyMlx1NzUxZlx1NjZmOFx1N2M2NC4uLg0KLWdlbmVyYXRpbmdCb29rbWFya1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTc1MjJcdTc1MWZcdTY2ZjhcdTdjNjQgJyd7MH0nJy4uLg0KLWdlbmVyYXRpbmdCb29rbWFya0luZGV4VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NzUyMlx1NzUxZlx1NjZmOFx1N2M2NFx1N2QyMlx1NWYxNS4uLg0KLXB1Ymxpc2hpbmdMaW5rZWRFbGVtZW50VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NzY3Y1x1NGY0OFx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMFx1ZmYxYVx1NWRmMlx1NzY3Y1x1NGY0OCB7MH0gXHU1MDBiXHVmZjBjXHU1MjY5XHU5OTE4IHsxfSBcdTUwMGINCi1wdWJsaXNoaW5nRWxlbWVudFRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTc2N2NcdTRmNDhcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdWZmMWF7MH06ezF9DQotZ2VuZXJhdGluZ0dsb3NzYXJ5VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NzUyMlx1NzUxZlx1NTQwZFx1OGE1ZVx1ODllM1x1OTFjYi4uLg0KLWdlbmVyYXRpbmdTZWFyY2hJbmRleFRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTc1MjJcdTc1MWZcdTY0MWNcdTVjMGJcdTdkMjJcdTVmMTUuLi4NCi1idWlsZGluZ1Byb2Nlc3NDbG9zdXJlVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NWVmYVx1N2Y2ZVx1N2EwYlx1NWU4Zlx1OTA4YVx1NzU0Yy4uLg0KLWJ1aWxkaW5nRWxlbWVudENsb3N1cmVUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU1ZWZhXHU3ZjZlICcnezB9JycgXHU3Njg0XHU1MTQzXHU3ZDIwXHU5MDhhXHU3NTRjLi4uDQotbG9hZExpYnJhcnlUYXNrX25hbWU9XHU2YjYzXHU1NzI4XHU4ZjA5XHU1MTY1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU1MTY3XHU1YmI5Li4uDQotDQotIyBFcnJvciBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0DQotcHVibGlzaEVsZW1lbnRFcnJvcl9tc2c9SVVQUDAwMDBFOiBcdTc2N2NcdTRmNDhcdTUxNDNcdTdkMjBcdTY2NDJcdTc2N2NcdTc1MWZcdTkzMmZcdThhYTRcdWZmMWF7MH0NCi1zZXJ2ZXJFcnJvcl9tc2c9SVVQUDAwMDFFOiBcdTRmM2FcdTY3MGRcdTU2NjhcdTY3MmFcdTUwYjNcdTU2ZGVcdThjYzdcdTY1OTlcdTMwMDINCi1pbnZhbGlkSHR0cFJlc3BvbnNlRXJyb3JfbXNnPUlVUFAwMDAyRTogaHR0cDovL3swfTp7MX06ezJ9IFx1NTBiM1x1NTZkZVx1NzEyMVx1NjU0OFx1NTZkZVx1NjFjOQ0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0DQotaW52YWxpZEVsZW1lbnRXYXJuaW5nX21zZz1JVVBQMDAwM1c6IFx1NjcyYVx1NzY3Y1x1NGY0OFx1NTE0M1x1N2QyMFx1ZmYwY1x1NTZlMFx1NzBiYVx1NTcyOFx1OTE0ZFx1N2Y2ZVx1NGUyZFx1NGUwZFx1NjYyZlx1NjcwOVx1NjU0OFx1NTE0M1x1N2QyMFx1MzAwMg0KLWludmFsaWRNZXRob2RFbGVtZW50V2FybmluZ19tc2c9SVVQUDAwMDRXOiBcdTY3MmFcdTc2N2NcdTRmNDhcdTUxNDNcdTdkMjBcdWZmMGNcdTU2ZTBcdTcwYmFcdTRlMGRcdTY2MmZcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdWZmMWF7MH0NCi1jb3B5RmlsZVdhcm5pbmdfbXNnPUlVUFAwMDA1VzogXHU3MTIxXHU2Y2Q1XHU1YzA3XHU2YTk0XHU2ODQ4XHU1ZjllICcnezB9JycgXHU4OTA3XHU4OGZkXHU1MjMwICcnezF9JydcdTMwMDINCi1taXNzaW5nSWNvbkZpbGVXYXJuaW5nX21zZz1JVVBQMDAwNlc6IFx1N2JjMFx1OWVkZVx1NTcxNlx1NzkzYVx1NmE5NCAnJ3swfScnIFx1NGUwZFx1NWI1OFx1NTcyOFx1MzAwMg0KLW1pc3NpbmdJY29uTmFtZVdhcm5pbmdfbXNnPUlVUFAwMDA3VzogXHU3MTIxXHU2Y2Q1XHU2NGY3XHU1M2Q2XHU3YmMwXHU5ZWRlXHU1NzE2XHU3OTNhXHU3Njg0XHU1NDBkXHU3YTMxXHUzMDAyDQotZXh0ZXJuYWxVcmxfbXNnPVx1NTNjM1x1NzE2N1x1NTkxNlx1OTBlOCBVUkxcdWZmMWF7MH0NCi1kaXNjYXJlZENhdGVnb3J5V2FybmluZ19tc2c9XHU2NzJhXHU3NjdjXHU0ZjQ4XHU3YTdhXHU3Njg0XHU1MTY3XHU1YmI5XHU3YTJlXHU5ODVlXHU1MTQzXHU3ZDIwXHUzMDAyDQotDQotIyBFcnJvciBEZXRhaWxzDQotY3JlYXRlU2VhcmNoSW5kZXhFcnJvcl9tc2c9SVVQUDAwMDhFOiBcdTY3MmFcdTVlZmFcdTdhY2JcdTY0MWNcdTVjMGJcdTdkMjJcdTVmMTVcdTZhOTRcdTMwMDINCi0NCi0jIFByb2Nlc3MgVHJlZSBOb2Rlcw0KLXJlZmVyZW5jZVdvcmtmbG93c05vZGVfdGV4dD1cdTUzYzNcdTcxNjdcdTVkZTVcdTRmNWNcdTZkNDFcdTdhMGINCi10YXNrTm9kZV90ZXh0PVx1NGY1Y1x1Njk2ZA0KLXByaW1hcmlseVBlcmZvcm1zTm9kZV90ZXh0PVx1NGUzYlx1ODk4MVx1NTdmN1x1ODg0Yw0KLWFkZGl0aW9uYWxseVBlcmZvcm1zTm9kZV90ZXh0PVx1OTg0ZFx1NTkxNlx1NTdmN1x1ODg0Yw0KLXBlcmZvcm1pbmdSb2xlc05vZGVfdGV4dD1cdTU3ZjdcdTg4NGNcdTg5ZDJcdTgyNzINCi1pbnB1dFdvcmtQcm9kdWN0c05vZGVfdGV4dD1cdThmMzhcdTUxNjVcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWMNCi1vdXRwdXRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9XHU4ZjM4XHU1MWZhXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljDQotcmVzcG9uc2libGVGb3JOb2RlX3RleHQ9XHU4Y2EwXHU4Y2FjDQotbW9kaWZpZXNOb2RlX3RleHQ9XHU0ZmVlXHU2NTM5XHU5ODA1XHU3NmVlDQotcmVzcG9uc2libGVSb2xlTm9kZV90ZXh0PVx1NTNlZlx1NTZkZVx1NjFjOVx1NzY4NFx1ODlkMlx1ODI3Mg0KLWNvbnRhaW5pbmdXb3JrUHJvZHVjdE5vZGVfdGV4dD1cdTUzMDVcdTU0MmJcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWMNCi1jb250YWluZWRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9XHU1MTY3XHU1NDJiXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljDQotZ3VpZGFuY2VOb2RlX3RleHQ9XHU2MzA3XHU1ZjE1DQotaW5wdXRUb05vZGVfdGV4dD1cdThmMzhcdTUxNjVcdTgxZjMNCi1vdXRwdXRGcm9tTm9kZV90ZXh0PVx1OGYzOFx1NTFmYVx1ODFlYQ0KLQ0KLSMgSFRNTCBUaXRsZSBmb3IgSW5kZXggUGFnZQ0KLWluZGV4TGFiZWxfdGV4dD1cdTdkMjJcdTVmMTUNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS94c2wvcmVzb3VyY2VzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS94c2wvcmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOTgwMmYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEveHNsL3Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBUaGUgVUkgdGV4dCBpbiB0aGUgWFNMIHN0eWxlc2hlZXRzLg0KLQ0KLXNlbGVjdGVkQ29uZmlndXJhdGlvblRleHQ9RGllIGF1c2dld1x1MDBlNGhsdGUgS29uZmlndXJhdGlvbiB3aXJkIGFuIGRlciBmb2xnZW5kZW4gUG9zaXRpb24gdmVyXHUwMGY2ZmZlbnRsaWNodC4NCi1kZXRhaWxJbmZvVGV4dD1EZXRhaWxpbmZvcm1hdGlvbmVuIHdlcmRlbiBpbiBkZW4gZm9sZ2VuZGVuIERhdGVpZW4gaW0gT3JkbmVyIGxvZ3MgYXVmZ2V6ZWljaG5ldC4NCi1zaG93RXJyb3JUZXh0PUFsbGUgd1x1MDBlNGhyZW5kIGRlciBWZXJcdTAwZjZmZmVudGxpY2h1bmcgYXVmZ2V0cmV0ZW5lbiBGZWhsZXIgYW56ZWlnZW4NCi1sb2dzV2FybmluZ1RleHQ9RXMgd2VyZGVuIGFsbGUgV2FybnVuZ2VuIHByb3Rva29sbGllcnQsIHouIEIuIFdhcm51bmcgYmV6XHUwMGZjZ2xpY2ggZmVobGVuZGVyIFJlZmVyZW56ZW4sIGRlZmVrdGVyIExpbmtzIHVuZCBuaWNodCB2ZXJcdTAwZjZmZmVudGxpY2h0ZXIgS2F0ZWdvcmllbiBvaG5lIGthdGVnb3Jpc2llcnRlIEVsZW1lbnRlLg0KLXBhZ2VzTm90SW5zdGFsbGVkVGV4dD1JbSBPcmRuZXIgcGFnZXNfbm90X2luc3RhbGxlZCBmaW5kZW4gU2llIGFsbGUgaW4gZGllc2VyIEtvbmZpZ3VyYXRpb24gZmVobGVuZGVuIFJlZmVyZW56ZW4uDQotaW52YWxpZEV4dGVybmFsVGV4dD1FcyB3dXJkZW4gdW5nXHUwMGZjbHRpZ2UgZXh0ZXJuZSBMaW5rcyBpbiBkZXIgS29uZmlndXJhdGlvbiBnZWZ1bmRlbg0KLW93bmVyRWxlbWVudFRleHQ9RWlnbmVyZWxlbWVudA0KLW5vbkV4aXN0aW5nVGV4dD1EYXMgRWlnbmVyZWxlbWVudCB2ZXJ3ZWlzdCBhdWYgbmljaHQgdm9yaGFuZGVuZSBFbGVtZW50ZS4gTVx1MDBmNmdsaWNoZXJ3ZWlzZSB3dXJkZW4gZGllIEVsZW1lbnRlIG5hY2ggZGVtIEVyc3RlbGxlbiBkZXIgRWxlbWVudC1MaW5rcyBhdXMgZGVyIEJpYmxpb3RoZWsgZ2VsXHUwMGY2c2NodC4gU3VjaGVuIFNpZSBkaWUgRWlnbmVyZWxlbWVudGUgdW5kIGtvcnJpZ2llcmVuIFNpZSBkaWUgdW5nXHUwMGZjbHRpZ2VuIFJlZmVyZW56ZW4uDQotbWlzc2luZ1JlZmVyZW5jZXNUaXRsZVRleHQ9RmVobGVuZGUgUmVmZXJlbnplbg0KLW1pc3NpbmdSZWZlcmVuY2VzVGV4dD1EaWUgRWlnbmVyZWxlbWVudGUgdmVyd2Vpc2VuIGF1ZiBmZWhsZW5kZSBFbGVtZW50ZSBpbiBkZXIgYXVzZ2V3XHUwMGU0aGx0ZW4gS29uZmlndXJhdGlvbi4gXHUwMGRjYmVycHJcdTAwZmNmZW4gU2llIGRpZSBhYmdlc2NobG9zc2VuZSBLb25maWd1cmF0aW9uIHVuZCBiZWhlYmVuIFNpZSBkYXMgUHJvYmxlbSBtaXQgZGVuIGZlaGxlbmRlbiBSZWZlcmVuemVuLg0KLQ0KLW1pc3NpbmdSZXNvdXJjZUZpbGVzVGl0bGVUZXh0PUZlaGxlbmRlIFJlc3NvdXJjZW5kYXRlaWVuDQotbWlzc2luZ1Jlc291cmNlRmlsZXNUZXh0PURpZSBFaWduZXJlbGVtZW50ZSB2ZXJ3ZWlzZW4gZmVobGVuZGUgUmVzc291cmNlbmRhdGVpZW4uIERpZXNlIFJlc3NvdXJjZW5kYXRlaWVuIHdlcmRlbiBpbSBJbmhhbHQgZGVyIEVsZW1lbnRlIG9kZXIgaW4gZGVuIHp1Z2VvcmRuZXRlbiBBbmhcdTAwZTRuZ2VuIHJlZmVyZW56aWVydC4NCi1taXNzaW5nUmVzb3VyY2VUZXh0PUZlaGxlbmRlIFJlc3NvdXJjZQ0KLW93bmVyUmVzb3VyY2VUZXh0PUVpZ25lcnJlc3NvdXJjZQ0KLW1pc3NpbmdFbGVtZW50VGV4dD1GZWhsZW5kZXMgRWxlbWVudA0KLWludmFsaWRFbGVtZW50VGV4dD1VbmdcdTAwZmNsdGlnZXMgRWxlbWVudA0KLWludmFsaWRFbGVtZW50TGlua3NUZXh0PVVuZ1x1MDBmY2x0aWdlIEVsZW1lbnQtTGlua3MNCi1wbGVhc2VDaGVja1RleHQ9XHUwMGRjYmVycHJcdTAwZmNmZW4gU2llIGRpZSBhYmdlc2NobG9zc2VuZSBLb25maWd1cmF0aW9uIHVuZCBiZWhlYmVuIFNpZSBkYXMgUHJvYmxlbSBtaXQgZGVuIGZlaGxlbmRlbiBSZWZlcmVuemVuLg0KLXBsZWFzZUZpbmRUZXh0PVN1Y2hlbiBTaWUgZGllIEVpZ25lcmVsZW1lbnRlIHVuZCBrb3JyaWdpZXJlbiBTaWUgZGllIHVuZ1x1MDBmY2x0aWdlbiBSZWZlcmVuemVuLg0KLWdsb3NzYXJ5VGV4dD1HbG9zc2FyDQotaW5kZXhUZXh0PUluZGV4DQotZmVlZGJhY2tUZXh0PUZlZWRiYWNrDQotYWJvdXRUZXh0PUluZm9ybWF0aW9uZW4NCi1zZWFyY2hUZXh0PVN1Y2hlbg0KLXByaW50VGV4dD1EcnVja2VuDQotc3VtbWFyeVRleHQ9WnVzYW1tZW5mYXNzdW5nDQotcHVibGlzaGluZ1JlcG9ydFRleHQ9QmVyaWNodCB6dXIgVmVyXHUwMGY2ZmZlbnRsaWNodW5nOg0KLXdoZXJlQW1JVGV4dD1Ba3R1ZWxsZSBQb3NpdGlvbg0KLXRyZWVTZXRzVGV4dD1CYXVtc3RydWt0dXJncnVwcGVuDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEveHNsL3Jlc291cmNlc19lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEveHNsL3Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzdhYzI2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3hzbC9yZXNvdXJjZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMgVGhlIFVJIHRleHQgaW4gdGhlIFhTTCBzdHlsZXNoZWV0cy4NCi0NCi1zZWxlY3RlZENvbmZpZ3VyYXRpb25UZXh0PUxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBzZWxlY2Npb25hZGEgc2UgcHVibGljYSBlbiBsYSBzaWd1aWVudGUgdWJpY2FjaVx1MDBmM24NCi1kZXRhaWxJbmZvVGV4dD1MYSBpbmZvcm1hY2lcdTAwZjNuIGRldGFsbGFkYSBzZSByZWdpc3RyYSBlbiBsb3Mgc2lndWllbnRlcyBhcmNoaXZvcyBkZSBsYSBjYXJwZXRhIGRlIHJlZ2lzdHJvcw0KLXNob3dFcnJvclRleHQ9bXVlc3RyYSBjdWFscXVpZXIgZXJyb3IgcXVlIHNlIHByb2R1emNhIGR1cmFudGUgbGEgcHVibGljYWNpXHUwMGYzbi4NCi1sb2dzV2FybmluZ1RleHQ9cmVnaXN0cmEgdG9kb3MgbG9zIG1lbnNhamVzIGRlIGF2aXNvIGNvbW8sIHBvciBlamVtcGxvLCByZWZlcmVuY2lhcyBxdWUgZmFsdGFuLCBlbmxhY2VzIHJvdG9zIHkgY2F0ZWdvclx1MDBlZGFzIG5vIHB1YmxpY2FkYXMgc2luIGVsZW1lbnRvcyBjYXRlZ29yaXphZG9zLg0KLXBhZ2VzTm90SW5zdGFsbGVkVGV4dD1FbiBsYSBjYXJwZXRhIHBcdTAwZTFnaW5hc19ub19pbnN0YWxhZGFzLCBlbmNvbnRyYXJcdTAwZTEgdG9kYXMgbGFzIHJlZmVyZW5jaWFzIGF1c2VudGVzIGRlIGVzdGEgY29uZmlndXJhY2lcdTAwZjNuLg0KLWludmFsaWRFeHRlcm5hbFRleHQ9U2UgaGFuIGlkZW50aWZpY2FkbyBlbmxhY2VzIGV4dGVybm9zIG5vIHZcdTAwZTFsaWRvcyBlbiBsYSBjb25maWd1cmFjaVx1MDBmM24NCi1vd25lckVsZW1lbnRUZXh0PUVsZW1lbnRvIGRlIHByb3BpZXRhcmlvDQotbm9uRXhpc3RpbmdUZXh0PUxvcyBlbGVtZW50b3MgZGUgcHJvcGlldGFyaW8gaGFjZW4gcmVmZXJlbmNpYSBhIGVsZW1lbnRvcyBxdWUgbm8gZXhpc3Rlbi4gRXMgcG9zaWJsZSBxdWUgbG9zIGVsZW1lbnRvcyBzZSBoYXlhbiBlbGltaW5hZG8gZGUgbGEgYmlibGlvdGVjYSBkZXNwdVx1MDBlOXMgZGUgY3JlYXIgbG9zIGVubGFjZXMgZGVsIGVsZW1lbnRvLiBCdXNxdWUgb3Ryb3MgZWxlbWVudG9zIGRlIHByb3BpZXRhcmlvIHkgYXJyZWdsZSBlc3RhcyByZWZlcmVuY2lhcyBubyB2XHUwMGUxbGlkYXMuDQotbWlzc2luZ1JlZmVyZW5jZXNUaXRsZVRleHQ9UmVmZXJlbmNpYXMgYXVzZW50ZXMNCi1taXNzaW5nUmVmZXJlbmNlc1RleHQ9TG9zIGVsZW1lbnRvcyBkZSBwcm9waWV0YXJpbyBoYWNlbiByZWZlcmVuY2lhIGEgZWxlbWVudG9zIGF1c2VudGVzIGVuIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBzZWxlY2Npb25hZGEuIENvbXBydWViZSBlbCBjaWVycmUgZGUgbGEgY29uZmlndXJhY2lcdTAwZjNuIHkgYXJyZWdsZSBsYXMgcmVmZXJlbmNpYXMgYXVzZW50ZXMuICAgICAgICAgICAgICAgICAgIA0KLW1pc3NpbmdSZXNvdXJjZUZpbGVzVGl0bGVUZXh0PUFyY2hpdm9zIGRlIHJlY3Vyc29zIGF1c2VudGVzDQotbWlzc2luZ1Jlc291cmNlRmlsZXNUZXh0PUxvcyBlbGVtZW50b3MgZGUgcHJvcGlldGFyaW8gaGFjZW4gcmVmZXJlbmNpYSBhIGFyY2hpdm9zIGRlIHJlY3Vyc29zIGF1c2VudGVzLiBFbCBjb250ZW5pZG8gZGUgbG9zIGVsZW1lbnRvcyBvIGxvcyBhcmNoaXZvcyBkZSBkYXRvcyBhZGp1bnRvcyBhc29jaWFkb3MgaGFjZW4gcmVmZXJlbmNpYSBhIGVzb3MgYXJjaGl2b3MgZGUgcmVjdXJzb3MuDQotbWlzc2luZ1Jlc291cmNlVGV4dD1SZWN1cnNvIGF1c2VudGUNCi1vd25lclJlc291cmNlVGV4dD1SZWN1cnNvIGRlIHByb3BpZXRhcmlvDQotbWlzc2luZ0VsZW1lbnRUZXh0PUVsZW1lbnRvIGF1c2VudGUNCi1pbnZhbGlkRWxlbWVudFRleHQ9RWxlbWVudG8gbm8gdlx1MDBlMWxpZG8NCi1pbnZhbGlkRWxlbWVudExpbmtzVGV4dD1FbmxhY2UgZGVsIGVsZW1lbnRvIG5vIHZcdTAwZTFsaWRvDQotcGxlYXNlQ2hlY2tUZXh0PUNvbXBydWViZSBlbCBjaWVycmUgZGUgbGEgY29uZmlndXJhY2lcdTAwZjNuIHkgYXJyZWdsZSBsYXMgcmVmZXJlbmNpYXMgYXVzZW50ZXMuDQotcGxlYXNlRmluZFRleHQ9QnVzcXVlIG90cm9zIGVsZW1lbnRvcyBkZSBwcm9waWV0YXJpbyB5IGFycmVnbGUgZXN0YXMgcmVmZXJlbmNpYXMgbm8gdlx1MDBlMWxpZGFzLg0KLWdsb3NzYXJ5VGV4dD1HbG9zYXJpbw0KLWluZGV4VGV4dD1cdTAwY2RuZGljZQ0KLWZlZWRiYWNrVGV4dD1JbmZvcm1hY2lcdTAwZjNuIGRlIHJldG9ybm8NCi1hYm91dFRleHQ9QWNlcmNhIGRlDQotc2VhcmNoVGV4dD1CdXNjYXINCi1wcmludFRleHQ9SW1wcmltaXINCi1zdW1tYXJ5VGV4dD1SZXN1bWVuDQotcHVibGlzaGluZ1JlcG9ydFRleHQ9UHVibGljYXIgaW5mb3JtZToNCi13aGVyZUFtSVRleHQ9RFx1MDBmM25kZSBlc3RveQ0KLXRyZWVTZXRzVGV4dD1Db25qdW50b3MgZGUgXHUwMGUxcmJvbGVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEveHNsL3Jlc291cmNlc19mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEveHNsL3Jlc291cmNlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTQyYjVmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3hzbC9yZXNvdXJjZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMgVGhlIFVJIHRleHQgaW4gdGhlIFhTTCBzdHlsZXNoZWV0cy4NCi0NCi1zZWxlY3RlZENvbmZpZ3VyYXRpb25UZXh0PUxhIGNvbmZpZ3VyYXRpb24gc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZSBlc3QgcHVibGlcdTAwZTllIGRhbnMgbCdlbXBsYWNlbWVudCBzdWl2YW50DQotZGV0YWlsSW5mb1RleHQ9TGVzIGluZm9ybWF0aW9ucyBkXHUwMGU5dGFpbGxcdTAwZTllcyBzb250IGNvbnNpZ25cdTAwZTllcyBkYW5zIGxlcyBmaWNoaWVycyBzdWl2YW50cyBkdSBkb3NzaWVyIEpvdXJuYXV4DQotc2hvd0Vycm9yVGV4dD1hZmZpY2hlIHRvdXRlIGVycmV1ciBxdWkgcydlc3QgcHJvZHVpdGUgbG9ycyBkZSBsYSBwdWJsaWNhdGlvbi4NCi1sb2dzV2FybmluZ1RleHQ9ZW5yZWdpc3RyZSB0b3VzIGxlcyBtZXNzYWdlcyBkJ2F2ZXJ0aXNzZW1lbnQgdGVscyBxdWUgbGVzIHJcdTAwZTlmXHUwMGU5cmVuY2VzIG1hbnF1YW50ZXMsIGxlcyBsaWVucyByb21wdXMgZXQgbGVzIGNhdFx1MDBlOWdvcmllcyBub24gcHVibGlcdTAwZTllcyBzYW5zIGF1Y3VuIFx1MDBlOWxcdTAwZTltZW50IGNhdFx1MDBlOWdvcmlzXHUwMGU5Lg0KLXBhZ2VzTm90SW5zdGFsbGVkVGV4dD1EYW5zIGxlIGRvc3NpZXIgcGFnZXNfbm90X2luc3RhbGxlZCwgdm91cyB0cm91dmVyZXogdG91dGVzIGxlcyByXHUwMGU5Zlx1MDBlOXJlbmNlcyBtYW5xdWFudGVzIGRhbnMgY2V0dGUgY29uZmlndXJhdGlvbi4NCi1pbnZhbGlkRXh0ZXJuYWxUZXh0PUxpZW5zIGV4dGVybmVzIG5vbiB2YWxpZGVzIGlkZW50aWZpXHUwMGU5cyBkYW5zIGxhIGNvbmZpZ3VyYXRpb24NCi1vd25lckVsZW1lbnRUZXh0PUVsXHUwMGU5bWVudCBwcm9wcmlcdTAwZTl0YWlyZQ0KLW5vbkV4aXN0aW5nVGV4dD1MZXMgXHUwMGU5bFx1MDBlOW1lbnRzIHByb3ByaVx1MDBlOXRhaXJlcyByZW52b2llbnQgXHUwMGUwIGRlcyBcdTAwZTlsXHUwMGU5bWVudHMgZmljdGlmcy4gQ2VzIFx1MDBlOWxcdTAwZTltZW50cyBvbnQgcHUgXHUwMGVhdHJlIHN1cHByaW1cdTAwZTlzIGRlIGxhIGJpYmxpb3RoXHUwMGU4cXVlIGFwclx1MDBlOHMgbGEgY3JcdTAwZTlhdGlvbiBkZXMgbGllbnMgZCdcdTAwZTlsXHUwMGU5bWVudC4gUmVjaGVyY2hleiBsZXMgXHUwMGU5bFx1MDBlOW1lbnRzIHByb3ByaVx1MDBlOXRhaXJlcyBldCBjb3JyaWdleiBjZXMgclx1MDBlOWZcdTAwZTlyZW5jZXMgbm9uIHZhbGlkZXMuDQotbWlzc2luZ1JlZmVyZW5jZXNUaXRsZVRleHQ9Ulx1MDBlOWZcdTAwZTlyZW5jZXMgbWFucXVhbnRlcw0KLW1pc3NpbmdSZWZlcmVuY2VzVGV4dD1MZXMgXHUwMGU5bFx1MDBlOW1lbnRzIHByb3ByaVx1MDBlOXRhaXJlcyByZW52b2llbnQgXHUwMGUwIGRlcyBcdTAwZTlsXHUwMGU5bWVudHMgbWFucXVhbnRzIGRhbnMgbGEgY29uZmlndXJhdGlvbiBzXHUwMGU5bGVjdGlvbm5cdTAwZTllLiBWXHUwMGU5cmlmaWV6IGxhIGZlcm1ldHVyZSBkZSBsYSBjb25maWd1cmF0aW9uIGV0IGNvcnJpZ2V6IGxlcyByXHUwMGU5Zlx1MDBlOXJlbmNlcyBtYW5xdWFudGVzLiAgICAgICAgICAgICAgICAgICANCi1taXNzaW5nUmVzb3VyY2VGaWxlc1RpdGxlVGV4dD1GaWNoaWVycyBkZSByZXNzb3VyY2VzIG1hbnF1YW50cw0KLW1pc3NpbmdSZXNvdXJjZUZpbGVzVGV4dD1MZXMgXHUwMGU5bFx1MDBlOW1lbnRzIHByb3ByaVx1MDBlOXRhaXJlcyByZW52b2llbnQgXHUwMGUwIGRlcyBmaWNoaWVycyBkZSByZXNzb3VyY2VzIG1hbnF1YW50cy4gQ2VzIGZpY2hpZXJzIGRlIHJlc3NvdXJjZXMgc29udCByXHUwMGU5Zlx1MDBlOXJlbmNcdTAwZTlzIGRhbnMgbGUgY29udGVudSBkZXMgXHUwMGU5bFx1MDBlOW1lbnRzIG91IGRhbnMgbGVzIHBpXHUwMGU4Y2VzIGpvaW50ZXMgYXNzb2NpXHUwMGU5ZXMuDQotbWlzc2luZ1Jlc291cmNlVGV4dD1SZXNzb3VyY2UgbWFucXVhbnRlDQotb3duZXJSZXNvdXJjZVRleHQ9UmVzc291cmNlIHByb3ByaVx1MDBlOXRhaXJlDQotbWlzc2luZ0VsZW1lbnRUZXh0PUVsXHUwMGU5bWVudCBtYW5xdWFudA0KLWludmFsaWRFbGVtZW50VGV4dD1FbFx1MDBlOW1lbnQgbm9uIHZhbGlkZQ0KLWludmFsaWRFbGVtZW50TGlua3NUZXh0PUxpZW5zIGRlcyBcdTAwZTlsXHUwMGU5bWVudHMgbm9uIHZhbGlkZXMNCi1wbGVhc2VDaGVja1RleHQ9Vlx1MDBlOXJpZmlleiBsYSBmZXJtZXR1cmUgZGUgbGEgY29uZmlndXJhdGlvbiBldCBjb3JyaWdleiBsZXMgclx1MDBlOWZcdTAwZTlyZW5jZXMgbWFucXVhbnRlcy4NCi1wbGVhc2VGaW5kVGV4dD1SZWNoZXJjaGV6IGxlcyBcdTAwZTlsXHUwMGU5bWVudHMgcHJvcHJpXHUwMGU5dGFpcmVzIGV0IGNvcnJpZ2V6IGNlcyByXHUwMGU5Zlx1MDBlOXJlbmNlcyBub24gdmFsaWRlcy4NCi1nbG9zc2FyeVRleHQ9R2xvc3NhaXJlDQotaW5kZXhUZXh0PUluZGV4DQotZmVlZGJhY2tUZXh0PVJldG91ciBkJ2luZm9ybWF0aW9ucw0KLWFib3V0VGV4dD1BIHByb3BvcyBkZQ0KLXNlYXJjaFRleHQ9UmVjaGVyY2hlcg0KLXByaW50VGV4dD1JbXByaW1lcg0KLXN1bW1hcnlUZXh0PVJcdTAwZTlzdW1cdTAwZTkNCi1wdWJsaXNoaW5nUmVwb3J0VGV4dD1SYXBwb3J0IGRlIHB1YmxpY2F0aW9uIDoNCi13aGVyZUFtSVRleHQ9SW5mb3JtYXRpb25zIGxpXHUwMGU5ZXMgXHUwMGUwIG1hIHNpdHVhdGlvbg0KLXRyZWVTZXRzVGV4dD1FbnNlbWJsZSBkJ2FyYnJlcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3hzbC9yZXNvdXJjZXNfaXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3hzbC9yZXNvdXJjZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjMDMxOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS94c2wvcmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIFRoZSBVSSB0ZXh0IGluIHRoZSBYU0wgc3R5bGVzaGVldHMuDQotDQotc2VsZWN0ZWRDb25maWd1cmF0aW9uVGV4dD1MYSBjb25maWd1cmF6aW9uZSBzZWxlemlvbmF0YSB2aWVuZSBwdWJibGljYXRhIG5lbGxhIHNlZ3VlbnRlIHViaWNhemlvbmUNCi1kZXRhaWxJbmZvVGV4dD1JbmZvcm1hemlvbmkgZGV0dGFnbGlhdGUgdmVuZ29ubyByZWdpc3RyYXRlIG5laSBzZWd1ZW50aSBmaWxlIG5lbGxhIGNhcnRlbGxhIGRlaSBsb2cNCi1zaG93RXJyb3JUZXh0PU1vc3RyYXJlIHR1dHRpIGdsaSBlcnJvcmkgY2hlIHNpIHNvbm8gdmVyaWZpY2F0aSBkdXJhbnRlIGxhIHB1YmJsaWNhemlvbmUuDQotbG9nc1dhcm5pbmdUZXh0PVJlZ2lzdHJhIHR1dHRpIGkgbWVzc2FnZ2kgZGkgYXZ2aXNvIGNvbWUgcmlmZXJpbWVudGkgbWFuY2FudGksIGNvbGxlZ2FtZW50aSBkYW5uZWdnaWF0aSBlIGNhdGVnb3JpZSBub24gcHViYmxpY2F0ZSBzZW56YSBlbGVtZW50aSBjYXRlZ29yaXp6YXRpLg0KLXBhZ2VzTm90SW5zdGFsbGVkVGV4dD1OZWxsYSBjYXJ0ZWxsYSBwYWdlc19ub3RfaW5zdGFsbGVkLCBzaSB0cm92ZXJhbm5vIHR1dHRpIGkgcmlmZXJpbWVudGkgbWFuY2FudGkgZGkgcXVlc3RhIGNvbmZpZ3VyYXppb25lLg0KLWludmFsaWRFeHRlcm5hbFRleHQ9SWRlbnRpZmljYXRpIGNvbGxlZ2FtZW50aSBlc3Rlcm5pIG5vbiB2YWxpZGkgbmVsbGEgY29uZmlndXJhemlvbmUNCi1vd25lckVsZW1lbnRUZXh0PUVsZW1lbnRvIHByb3ByaWV0YXJpbw0KLW5vbkV4aXN0aW5nVGV4dD1HbGkgZWxlbWVudGkgcHJvcHJpZXRhcmlvIGZhbm5vIHJpZmVyaW1lbnRvIGEgZWxlbWVudGkgbm9uIGVzaXN0ZW50aS4gXHUwMGM4IHBvc3NpYmlsZSBjaGUgZ2xpIGVsZW1lbnRpIHNpYW5vIHN0YXRpIGVsaW1pbmF0aSBkYWxsYSBsaWJyZXJpYSBkb3BvIGxhIGNyZWF6aW9uZSBkZWkgY29sbGVnYW1lbnRpIGRlZ2xpIGVsZW1lbnRpLiBUcm92YXJlIGdsaSBlbGVtZW50aSBwcm9wcmlldGFyaW8gZSBjb3JyZWdnZXJlIHF1ZXN0aSByaWZlcmltZW50aSBub24gdmFsaWRpLg0KLW1pc3NpbmdSZWZlcmVuY2VzVGl0bGVUZXh0PVJpZmVyaW1lbnRpIG1hbmNhbnRpDQotbWlzc2luZ1JlZmVyZW5jZXNUZXh0PUdsaSBlbGVtZW50aSBwcm9wcmlldGFyaW8gZmFubm8gcmlmZXJpbWVudG8gYWQgZWxlbWVudGkgbWFuY2FudGkgbmVsbGEgY29uZmlndXJhemlvbmUgc2VsZXppb25hdGEuIENvbnRyb2xsYXJlIGxhIGNoaXVzdXJhIGRlbGxhIGNvbmZpZ3VyYXppb25lIGUgY29ycmVnZ2VyZSBnbGkgZWxlbWVudGkgbWFuY2FudGkuDQotDQotbWlzc2luZ1Jlc291cmNlRmlsZXNUaXRsZVRleHQ9RmlsZSBkaSByaXNvcnNlIG1hbmNhbnRpDQotbWlzc2luZ1Jlc291cmNlRmlsZXNUZXh0PUdsaSBlbGVtZW50aSBwcm9wcmlldGFyaW8gZmFubm8gcmlmZXJpbWVudG8gYSBmaWxlIGRpIHJpc29yc2UgbWFuY2FudGkuIEEgcXVlc3RpIGZpbGUgZGVsbGUgcmlzb3JzZSBzb25vIGFzc29jaWF0aSByaWZlcmltZW50aSBwcmVzZW50aSBuZWwgY29udGVudXRvIGRlZ2xpIGVsZW1lbnRpIG9wcHVyZSBuZWdsaSBhbGxlZ2F0aSBhc3NvY2lhdGkuDQotbWlzc2luZ1Jlc291cmNlVGV4dD1SaXNvcnNhIG1hbmNhbnRlDQotb3duZXJSZXNvdXJjZVRleHQ9Umlzb3JzYSBwcm9wcmlldGFyaW8NCi1taXNzaW5nRWxlbWVudFRleHQ9RWxlbWVudG8gbWFuY2FudGUNCi1pbnZhbGlkRWxlbWVudFRleHQ9RWxlbWVudG8gbm9uIHZhbGlkbw0KLWludmFsaWRFbGVtZW50TGlua3NUZXh0PUNvbGxlZ2FtZW50aSBlbGVtZW50aSBub24gdmFsaWRpDQotcGxlYXNlQ2hlY2tUZXh0PUNvbnRyb2xsYXJlIGxhIGNoaXVzdXJhIGRlbGxhIGNvbmZpZ3VyYXppb25lIGUgY29ycmVnZ2VyZSBnbGkgZWxlbWVudGkgbWFuY2FudGkuDQotcGxlYXNlRmluZFRleHQ9VHJvdmFyZSBnbGkgZWxlbWVudGkgcHJvcHJpZXRhcmlvIGUgY29ycmVnZ2VyZSBxdWVzdGkgcmlmZXJpbWVudGkgbm9uIHZhbGlkaS4NCi1nbG9zc2FyeVRleHQ9R2xvc3NhcmlvDQotaW5kZXhUZXh0PUluZGljZQ0KLWZlZWRiYWNrVGV4dD1GZWVkYmFjaw0KLWFib3V0VGV4dD1JbmZvcm1hemlvbmkgc3UNCi1zZWFyY2hUZXh0PVJpY2VyY2ENCi1wcmludFRleHQ9U3RhbXBhDQotc3VtbWFyeVRleHQ9UmllcGlsb2dvDQotcHVibGlzaGluZ1JlcG9ydFRleHQ9UmVwb3J0IGRpIHB1YmJsaWNhemlvbmU6DQotd2hlcmVBbUlUZXh0PVBvc2l6aW9uZQ0KLXRyZWVTZXRzVGV4dD1JbnNpZW1lIGRpIHN0cnV0dHVyZQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3hzbC9yZXNvdXJjZXNfamEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3hzbC9yZXNvdXJjZXNfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTViODIxNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS94c2wvcmVzb3VyY2VzX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIFRoZSBVSSB0ZXh0IGluIHRoZSBYU0wgc3R5bGVzaGVldHMuDQotDQotc2VsZWN0ZWRDb25maWd1cmF0aW9uVGV4dD1cdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTY5Y2JcdTYyMTBcdTMwNmZcdTMwMDFcdTZiMjFcdTMwNmVcdTRmNGRcdTdmNmVcdTMwNmJcdTUxNmNcdTk1OGJcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTkNCi1kZXRhaWxJbmZvVGV4dD1cdThhNzNcdTdkMzBcdTYwYzVcdTU4MzFcdTMwNmZcdTMwMDFcdTMwZWRcdTMwYjBcdTMwZmJcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzBcdTMwZmNcdTUxODVcdTMwNmVcdTZiMjFcdTMwNmVcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmJcdThhMThcdTkzMzJcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTkNCi1zaG93RXJyb3JUZXh0PVx1NTE2Y1x1OTU4Ylx1NGUyZFx1MzA2Ylx1NzY3YVx1NzUxZlx1MzA1N1x1MzA1Zlx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA5Mlx1ODg2OFx1NzkzYVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLWxvZ3NXYXJuaW5nVGV4dD1cdTMwNTlcdTMwNzlcdTMwNjZcdTMwNmVcdThiNjZcdTU0NGFcdTMwZTFcdTMwYzNcdTMwYmJcdTMwZmNcdTMwYjggKFx1NmIyMFx1ODQzZFx1MzA1N1x1MzA1Zlx1NTNjMlx1NzE2N1x1MzAwMVx1MzBlYVx1MzBmM1x1MzBhZlx1NTIwN1x1MzA4Y1x1MzAwMVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmY1x1NTMxNlx1MzA1NVx1MzA4Y1x1MzA1Zlx1ODk4MVx1N2QyMFx1MzA0Y1x1MzA2YVx1MzA0NFx1NjcyYVx1NTE2Y1x1OTU4Ylx1MzA2ZVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmY1x1MzA2YVx1MzA2OSkgXHUzMDkyXHUzMDAxXHUzMGVkXHUzMGIwXHUzMDZiXHU4YTE4XHU5MzMyXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotcGFnZXNOb3RJbnN0YWxsZWRUZXh0PXBhZ2VzX25vdF9pbnN0YWxsZWQgXHUzMGQ1XHUzMGE5XHUzMGViXHUzMGMwXHUzMGZjXHUzMDZiXHUzMDAxXHUzMDUzXHUzMDZlXHU2OWNiXHU2MjEwXHUzMDZlXHU2YjIwXHU4NDNkXHUzMDU3XHUzMDVmXHU1M2MyXHU3MTY3XHUzMDRjXHUzMDU5XHUzMDc5XHUzMDY2XHU1MTY1XHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyDQotaW52YWxpZEV4dGVybmFsVGV4dD1cdTY5Y2JcdTYyMTBcdTUxODVcdTMwNjdcdTcxMjFcdTUyYjlcdTMwNmFcdTU5MTZcdTkwZThcdTMwZWFcdTMwZjNcdTMwYWZcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDINCi1vd25lckVsZW1lbnRUZXh0PVx1NjI0MFx1NjcwOVx1ODAwNVx1ODk4MVx1N2QyMA0KLW5vbkV4aXN0aW5nVGV4dD1cdTYyNDBcdTY3MDlcdTgwMDVcdTg5ODFcdTdkMjBcdTMwNGNcdTMwMDFcdTViNThcdTU3MjhcdTMwNTdcdTMwNmFcdTMwNDRcdTg5ODFcdTdkMjBcdTMwOTJcdTUzYzJcdTcxNjdcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDIgXHU4OTgxXHU3ZDIwXHUzMGVhXHUzMGYzXHUzMGFmXHUzMDRjXHU0ZjVjXHU2MjEwXHUzMDU1XHUzMDhjXHUzMDVmXHU1ZjhjXHUzMDY3XHUzMDAxXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDRiXHUzMDg5XHU4OTgxXHU3ZDIwXHUzMDRjXHU1MjRhXHU5NjY0XHUzMDU1XHUzMDhjXHUzMDVmXHU1M2VmXHU4MGZkXHU2MDI3XHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyIFx1NjI0MFx1NjcwOVx1ODAwNVx1ODk4MVx1N2QyMFx1MzA5Mlx1NjkxY1x1N2QyMlx1MzA1N1x1MzA2Nlx1MzA1M1x1MzA4Y1x1MzA4OVx1MzA2ZVx1NzEyMVx1NTJiOVx1MzA2YVx1NTNjMlx1NzE2N1x1MzA5Mlx1NGZlZVx1NmI2M1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLW1pc3NpbmdSZWZlcmVuY2VzVGl0bGVUZXh0PVx1NmIyMFx1ODQzZFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1NTNjMlx1NzE2Nw0KLW1pc3NpbmdSZWZlcmVuY2VzVGV4dD1cdTYyNDBcdTY3MDlcdTgwMDVcdTg5ODFcdTdkMjBcdTMwNGNcdTMwMDFcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTY5Y2JcdTYyMTBcdTMwNmJcdTViNThcdTU3MjhcdTMwNTdcdTMwNmFcdTMwNDRcdTg5ODFcdTdkMjBcdTMwOTJcdTUzYzJcdTcxNjdcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDIgXHU2OWNiXHU2MjEwXHUzMDZlXHU2ODNjXHU3ZDBkXHU2YTVmXHU2OWNiXHUzMDkyXHU4YWJmXHUzMDc5XHUzMDY2XHUzMDAxXHU2YjIwXHU4NDNkXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHU1M2MyXHU3MTY3XHUzMDkyXHU0ZmVlXHU2YjYzXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotDQotbWlzc2luZ1Jlc291cmNlRmlsZXNUaXRsZVRleHQ9XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHU2YjIwXHU4NDNkDQotbWlzc2luZ1Jlc291cmNlRmlsZXNUZXh0PVx1NjI0MFx1NjcwOVx1ODAwNVx1ODk4MVx1N2QyMFx1MzA0Y1x1MzAwMVx1NmIyMFx1ODQzZFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzBmYlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NTNjMlx1NzE2N1x1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwNTNcdTMwOGNcdTMwODlcdTMwNmVcdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwZmJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmZcdTMwMDFcdTg5ODFcdTdkMjBcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwODRcdTk1YTJcdTkwMjNcdTMwNTlcdTMwOGJcdTZkZmJcdTRlZDhcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNjdcdTUzYzJcdTcxNjdcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDINCi1taXNzaW5nUmVzb3VyY2VUZXh0PVx1NmIyMFx1ODQzZFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOQ0KLW93bmVyUmVzb3VyY2VUZXh0PVx1NjI0MFx1NjcwOVx1ODAwNVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOQ0KLW1pc3NpbmdFbGVtZW50VGV4dD1cdTZiMjBcdTg0M2RcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTg5ODFcdTdkMjANCi1pbnZhbGlkRWxlbWVudFRleHQ9XHU3MTIxXHU1MmI5XHUzMDZhXHU4OTgxXHU3ZDIwDQotaW52YWxpZEVsZW1lbnRMaW5rc1RleHQ9XHU3MTIxXHU1MmI5XHUzMDZhXHU4OTgxXHU3ZDIwXHUzMGVhXHUzMGYzXHUzMGFmDQotcGxlYXNlQ2hlY2tUZXh0PVx1NjljYlx1NjIxMFx1MzA2ZVx1NjgzY1x1N2QwZFx1NmE1Zlx1NjljYlx1MzA5Mlx1OGFiZlx1MzA3OVx1MzA2Nlx1MzAwMVx1NmIyMFx1ODQzZFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1NTNjMlx1NzE2N1x1MzA5Mlx1NGZlZVx1NmI2M1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLXBsZWFzZUZpbmRUZXh0PVx1NjI0MFx1NjcwOVx1ODAwNVx1ODk4MVx1N2QyMFx1MzA5Mlx1NjkxY1x1N2QyMlx1MzA1N1x1MzA2Nlx1MzA1M1x1MzA4Y1x1MzA4OVx1MzA2ZVx1NzEyMVx1NTJiOVx1MzA2YVx1NTNjMlx1NzE2N1x1MzA5Mlx1NGZlZVx1NmI2M1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLWdsb3NzYXJ5VGV4dD1cdTc1MjhcdThhOWVcdTk2YzYNCi1pbmRleFRleHQ9XHU3ZDIyXHU1ZjE1DQotZmVlZGJhY2tUZXh0PVx1MzBkNVx1MzBhM1x1MzBmY1x1MzBjOVx1MzBkMFx1MzBjM1x1MzBhZg0KLWFib3V0VGV4dD1cdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjNcdTYwYzVcdTU4MzENCi1zZWFyY2hUZXh0PVx1NjkxY1x1N2QyMg0KLXByaW50VGV4dD1cdTUzNzBcdTUyMzcNCi1zdW1tYXJ5VGV4dD1cdTg5ODFcdTdkMDQNCi1wdWJsaXNoaW5nUmVwb3J0VGV4dD1cdTUxNmNcdTk1OGJcdTMwZWNcdTMwZGRcdTMwZmNcdTMwYzg6DQotd2hlcmVBbUlUZXh0PVx1NzNmZVx1NTcyOFx1NGY0ZFx1N2Y2ZQ0KLXRyZWVTZXRzVGV4dD1cdTMwYzRcdTMwZWFcdTMwZmNcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzgNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS94c2wvcmVzb3VyY2VzX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS94c2wvcmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZWJmMzMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEveHNsL3Jlc291cmNlc19rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBUaGUgVUkgdGV4dCBpbiB0aGUgWFNMIHN0eWxlc2hlZXRzLg0KLQ0KLXNlbGVjdGVkQ29uZmlndXJhdGlvblRleHQ9XHVjMTIwXHVkMGRkXHVkNTVjIFx1YWQ2Y1x1YzEzMVx1Yzc3NCBcdWIyZTRcdWM3NGMgXHVjNzA0XHVjZTU4XHVjNWQwIFx1YWNmNVx1YWMxY1x1YjQyOVx1YjJjOFx1YjJlNC4NCi1kZXRhaWxJbmZvVGV4dD1cdWM3OTBcdWMxMzhcdWQ1NWMgXHVjODE1XHViY2Y0XHVhYzAwIFx1Yjg1Y1x1YWRmOCBcdWQzZjRcdWIzNTRcdWM3NTggXHViMmU0XHVjNzRjIFx1ZDMwY1x1Yzc3Y1x1YzVkMCBcdWI4NWNcdWFlNDVcdWI0MjlcdWIyYzhcdWIyZTQuDQotc2hvd0Vycm9yVGV4dD1cdWFjZjVcdWFjMWMgXHVjOTExXHVjNWQwIFx1YmMxY1x1YzBkZFx1ZDU1YyBcdWJhYThcdWI0ZTAgXHVjNjI0XHViOTU4XHViOTdjIFx1ZDQ1Y1x1YzJkY1x1ZDU2OVx1YjJjOFx1YjJlNC4NCi1sb2dzV2FybmluZ1RleHQ9XHViMjA0XHViNzdkXHViNDFjIFx1Y2MzOFx1Yzg3MCwgXHViMDRhXHVjNWI0XHVjOWM0IFx1YjljMVx1ZDA2YyBcdWJjMGYgXHViZDg0XHViOTU4XHViNDFjIFx1YzY5NFx1YzE4Y1x1YWMwMCBcdWM1YzZcdWIyOTQgXHVhY2Y1XHVhYzFjXHViNDE4XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWNcdWM2NDAgXHVhYzE5XHVjNzQwIFx1YmFhOFx1YjRlMCBcdWFjYmRcdWFjZTAgXHViYTU0XHVjMmRjXHVjOWMwXHViOTdjIFx1Yjg1Y1x1YWU0NVx1ZDU2OVx1YjJjOFx1YjJlNC4NCi1wYWdlc05vdEluc3RhbGxlZFRleHQ9cGFnZXNfbm90X2luc3RhbGxlZCBcdWQzZjRcdWIzNTRcdWM1ZDAgXHVjNzc0IFx1YWQ2Y1x1YzEzMVx1Yzc1OCBcdWIyMDRcdWI3N2RcdWI0MWMgXHViYWE4XHViNGUwIFx1Y2MzOFx1Yzg3MFx1YWMwMCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotaW52YWxpZEV4dGVybmFsVGV4dD1cdWFkNmNcdWMxMzFcdWM1ZDBcdWMxMWMgXHVjMmRkXHViY2M0XHViNDFjIFx1YzYyY1x1YmMxNFx1Yjk3NFx1YzljMCBcdWM1NGFcdWM3NDAgXHVjNjc4XHViZDgwIFx1YjljMVx1ZDA2Yw0KLW93bmVyRWxlbWVudFRleHQ9XHVjMThjXHVjNzIwXHVjNzkwIFx1YzY5NFx1YzE4Yw0KLW5vbkV4aXN0aW5nVGV4dD1cdWMxOGNcdWM3MjBcdWM3OTAgXHVjNjk0XHVjMThjXHVhYzAwIFx1YzVjNlx1YjI5NCBcdWM2OTRcdWMxOGNcdWI5N2MgXHVjYzM4XHVjODcwXHVkNTY5XHViMmM4XHViMmU0LiBcdWM2OTRcdWMxOGMgXHViOWMxXHVkMDZjXHVhYzAwIFx1Yzc5MVx1YzEzMVx1YjQxYyBcdWQ2YzQgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjXHVjNWQwXHVjMTFjIFx1YzY5NFx1YzE4Y1x1YWMwMCBcdWMwYWRcdWM4MWNcdWI0MWMgXHVhYzgzIFx1YWMxOVx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjMThjXHVjNzIwXHVjNzkwIFx1YzY5NFx1YzE4Y1x1Yjk3YyBcdWNjM2VcdWM1NDRcdWMxMWMgXHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWNjMzhcdWM4NzBcdWI5N2MgXHVjMjE4XHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLW1pc3NpbmdSZWZlcmVuY2VzVGl0bGVUZXh0PVx1YjIwNFx1Yjc3ZFx1YjQxYyBcdWNjMzhcdWM4NzANCi1taXNzaW5nUmVmZXJlbmNlc1RleHQ9XHVjMThjXHVjNzIwXHVjNzkwIFx1YzY5NFx1YzE4Y1x1YWMwMCBcdWMxMjBcdWQwZGRcdWI0MWMgXHVhZDZjXHVjMTMxXHVjNzU4IFx1YjIwNFx1Yjc3ZFx1YjQxYyBcdWM2OTRcdWMxOGNcdWI5N2MgXHVjYzM4XHVjODcwXHVkNTY5XHViMmM4XHViMmU0LiBcdWNjMzhcdWM4NzBcdWM4ODVcdWFjYjBcdWM3NDQgXHVkNjU1XHVjNzc4XHVkNTU4XHVhY2UwIFx1YjIwNFx1Yjc3ZFx1YjQxYyBcdWNjMzhcdWM4NzBcdWI5N2MgXHVjMjE4XHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiANCi1taXNzaW5nUmVzb3VyY2VGaWxlc1RpdGxlVGV4dD1cdWIyMDRcdWI3N2RcdWI0MWMgXHVjNzkwXHVjNmQwIFx1ZDMwY1x1Yzc3Yw0KLW1pc3NpbmdSZXNvdXJjZUZpbGVzVGV4dD1cdWMxOGNcdWM3MjBcdWM3OTAgXHVjNjk0XHVjMThjXHVhYzAwIFx1YjIwNFx1Yjc3ZFx1YjQxYyBcdWM3OTBcdWM2ZDAgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1Y2MzOFx1Yzg3MFx1ZDU2OVx1YjJjOFx1YjJlNC4gXHVjNjk0XHVjMThjXHVjNzU4IFx1Y2VlOFx1ZDE1MFx1Y2UyMFx1YjA5OCBcdWM1ZjBcdWFkMDBcdWI0MWMgXHVjY2E4XHViZDgwXHVjNWQwXHVjMTFjIFx1ZDU3NFx1YjJmOSBcdWM3OTBcdWM2ZDAgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1Y2MzOFx1Yzg3MFx1ZDU2OVx1YjJjOFx1YjJlNC4NCi1taXNzaW5nUmVzb3VyY2VUZXh0PVx1YjIwNFx1Yjc3ZFx1YjQxYyBcdWM3OTBcdWM2ZDANCi1vd25lclJlc291cmNlVGV4dD1cdWMxOGNcdWM3MjBcdWM3OTAgXHVjNzkwXHVjNmQwDQotbWlzc2luZ0VsZW1lbnRUZXh0PVx1YjIwNFx1Yjc3ZFx1YjQxYyBcdWM2OTRcdWMxOGMNCi1pbnZhbGlkRWxlbWVudFRleHQ9XHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWM2OTRcdWMxOGMNCi1pbnZhbGlkRWxlbWVudExpbmtzVGV4dD1cdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjNzQwIFx1YzY5NFx1YzE4YyBcdWI5YzFcdWQwNmMNCi1wbGVhc2VDaGVja1RleHQ9XHVjYzM4XHVjODcwXHVjODg1XHVhY2IwXHVjNzQ0IFx1ZDY1NVx1Yzc3OFx1ZDU1OFx1YWNlMCBcdWIyMDRcdWI3N2RcdWI0MWMgXHVjYzM4XHVjODcwXHViOTdjIFx1YzIxOFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1wbGVhc2VGaW5kVGV4dD1cdWMxOGNcdWM3MjBcdWM3OTAgXHVjNjk0XHVjMThjXHViOTdjIFx1Y2MzZVx1YzU0NFx1YzExYyBcdWM2MmNcdWJjMTRcdWI5NzRcdWM5YzAgXHVjNTRhXHVjNzQwIFx1Y2MzOFx1Yzg3MFx1Yjk3YyBcdWMyMThcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZ2xvc3NhcnlUZXh0PVx1YzZhOVx1YzViNFx1YzlkMQ0KLWluZGV4VGV4dD1cdWMwYzlcdWM3NzgNCi1mZWVkYmFja1RleHQ9XHVkNTNjXHViNGRjXHViYzMxDQotYWJvdXRUZXh0PVx1YzgxY1x1ZDQ4OCBcdWM4MTVcdWJjZjQNCi1zZWFyY2hUZXh0PVx1YWM4MFx1YzBjOQ0KLXByaW50VGV4dD1cdWM3NzhcdWMxYzQNCi1zdW1tYXJ5VGV4dD1cdWM2OTRcdWM1N2QNCi1wdWJsaXNoaW5nUmVwb3J0VGV4dD1cdWFjZjVcdWFjMWMgXHViY2Y0XHVhY2UwXHVjMTFjOg0KLXdoZXJlQW1JVGV4dD1cdWM3MDRcdWNlNTgNCi10cmVlU2V0c1RleHQ9XHVkMmI4XHViOWFjIFx1YzEzOFx1ZDJiOA0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3hzbC9yZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3hzbC9yZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3N2M4OC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS94c2wvcmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIFRoZSBVSSB0ZXh0IGluIHRoZSBYU0wgc3R5bGVzaGVldHMuDQotDQotc2VsZWN0ZWRDb25maWd1cmF0aW9uVGV4dD1BIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gc2VsZWNpb25hZGEgZXN0XHUwMGUxIHB1YmxpY2FkYSBubyBzZWd1aW50ZSBsb2NhbA0KLWRldGFpbEluZm9UZXh0PUluZm9ybWFcdTAwZTdcdTAwZjVlcyBkZSBkZXRhbGhlcyBzXHUwMGUzbyByZWdpc3RyYWRhcyBub3Mgc2VndWludGVzIGFycXVpdm9zIG5hIHBhc3RhIGxvZ3MNCi1zaG93RXJyb3JUZXh0PW1vc3RyYXIgcXVhbHF1ZXIgZXJybyBvY29ycmlkbyBkdXJhbnRlIGEgcHVibGljYVx1MDBlN1x1MDBlM28uDQotbG9nc1dhcm5pbmdUZXh0PXJlZ2lzdHJhIHRvZGFzIGFzIG1lbnNhZ2VucyBkZSBhdmlzbyB0YWlzIGNvbW8gcmVmZXJcdTAwZWFuY2lhcyBhdXNlbnRlcywgbGlua3MgaW50ZXJyb21waWRvcyBlIGNhdGVnb3JpYXMgblx1MDBlM28tcHVibGljYWRhcyBzZW0gZWxlbWVudG9zIGNhdGVnb3JpemFkb3MuDQotcGFnZXNOb3RJbnN0YWxsZWRUZXh0PU5hIHBhc3RhIHBhZ2VzX25vdF9pbnN0YWxsZWQsIHZvY1x1MDBlYSBlbmNvbnRyYXJcdTAwZTEgdG9kYXMgYXMgcmVmZXJcdTAwZWFuY2lhcyBhdXNlbnRlcyBuZXN0YSBjb25maWd1cmFcdTAwZTdcdTAwZTNvLg0KLWludmFsaWRFeHRlcm5hbFRleHQ9TGlua3MgZXh0ZXJub3MgaW52XHUwMGUxbGlkb3MgaWRlbnRpZmljYWRvcyBuYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvDQotb3duZXJFbGVtZW50VGV4dD1FbGVtZW50byBkZSBQcm9wcmlldFx1MDBlMXJpbw0KLW5vbkV4aXN0aW5nVGV4dD1PcyBlbGVtZW50b3MgZGUgcHJvcHJpZXRcdTAwZTFyaW8gcmVmZXJlbS1zZSBhIGVsZW1lbnRvcyBuXHUwMGUzbyBleGlzdGVudGVzLiBUYWx2ZXogb3MgZWxlbWVudG9zIHRlbmhhbSBzaWRvIGV4Y2x1XHUwMGVkZG9zIGRhIGJpYmxpb3RlY2EgZGVwb2lzIHF1ZSBvcyBsaW5rcyBkb3MgZWxlbWVudG9zIGZvcmFtIGNyaWFkb3MuIExvY2FsaXplIG9zIGVsZW1lbnRvcyBkZSBwcm9wcmlldFx1MDBlMXJpbyBlIGNvcnJpamEgZXNzYXMgcmVmZXJcdTAwZWFuY2lhcyBpbnZcdTAwZTFsaWRhcy4NCi1taXNzaW5nUmVmZXJlbmNlc1RpdGxlVGV4dD1SZWZlclx1MDBlYW5jaWFzIEF1c2VudGVzDQotbWlzc2luZ1JlZmVyZW5jZXNUZXh0PU9zIGVsZW1lbnRvcyBkZSBwcm9wcmlldFx1MDBlMXJpbyByZWZlcmVtLXNlIGEgZWxlbWVudG9zIGF1c2VudGVzIG5hIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gc2VsZWNpb25hZGEuIFZlcmlmaXF1ZSBvIGZlY2hhbWVudG8gZGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBlIGNvcnJpamEgYXMgcmVmZXJcdTAwZWFuY2lhcyBhdXNlbnRlcy4NCi0NCi1taXNzaW5nUmVzb3VyY2VGaWxlc1RpdGxlVGV4dD1BcnF1aXZvcyBkZSBSZWN1cnNvcyBBdXNlbnRlcw0KLW1pc3NpbmdSZXNvdXJjZUZpbGVzVGV4dD1PcyBlbGVtZW50b3MgZGUgcHJvcHJpZXRcdTAwZTFyaW8gcmVmZXJlbS1zZSBhIGFycXVpdm9zIGRlIHJlY3Vyc29zIGF1c2VudGVzLiBFc3NlcyBhcnF1aXZvcyBkZSByZWN1cnNvcyBzXHUwMGUzbyByZWZlcmVuY2lhZG9zIG5vIGNvbnRlXHUwMGZhZG8gZG9zIGVsZW1lbnRvcyBvdSBub3MgYW5leG9zIGFzc29jaWFkb3MuDQotbWlzc2luZ1Jlc291cmNlVGV4dD1SZWN1cnNvIEF1c2VudGUNCi1vd25lclJlc291cmNlVGV4dD1SZWN1cnNvIGRlIFByb3ByaWV0XHUwMGUxcmlvDQotbWlzc2luZ0VsZW1lbnRUZXh0PUVsZW1lbnRvIEF1c2VudGUNCi1pbnZhbGlkRWxlbWVudFRleHQ9RWxlbWVudG8gSW52XHUwMGUxbGlkbw0KLWludmFsaWRFbGVtZW50TGlua3NUZXh0PUxpbmtzIGRlIEVsZW1lbnRvIEludlx1MDBlMWxpZG9zDQotcGxlYXNlQ2hlY2tUZXh0PVZlcmlmaXF1ZSBvIGZlY2hhbWVudG8gZGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBlIGNvcnJpamEgYXMgcmVmZXJcdTAwZWFuY2lhcyBhdXNlbnRlcy4NCi1wbGVhc2VGaW5kVGV4dD1Mb2NhbGl6ZSBvcyBlbGVtZW50b3MgZGUgcHJvcHJpZXRcdTAwZTFyaW8gZSBjb3JyaWphIGVzc2FzIHJlZmVyXHUwMGVhbmNpYXMgaW52XHUwMGUxbGlkYXMuDQotZ2xvc3NhcnlUZXh0PUdsb3NzXHUwMGUxcmlvDQotaW5kZXhUZXh0PVx1MDBjZG5kaWNlDQotZmVlZGJhY2tUZXh0PUZlZWRiYWNrDQotYWJvdXRUZXh0PVNvYnJlDQotc2VhcmNoVGV4dD1Qcm9jdXJhcg0KLXByaW50VGV4dD1JbXByaW1pcg0KLXN1bW1hcnlUZXh0PVJlc3Vtbw0KLXB1Ymxpc2hpbmdSZXBvcnRUZXh0PVJlbGF0XHUwMGYzcmlvIGRlIFB1YmxpY2FcdTAwZTdcdTAwZTNvOg0KLXdoZXJlQW1JVGV4dD1PbmRlIGV1IGVzdG91DQotdHJlZVNldHNUZXh0PUNvbmp1bnRvcyBkZSBcdTAwYzFydm9yZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS94c2wvcmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS94c2wvcmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYTMyNjkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEveHNsL3Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBUaGUgVUkgdGV4dCBpbiB0aGUgWFNMIHN0eWxlc2hlZXRzLg0KLQ0KLXNlbGVjdGVkQ29uZmlndXJhdGlvblRleHQ9XHU5MDA5XHU1YjlhXHU3Njg0XHU5MTRkXHU3ZjZlXHU1ZGYyXHU1M2QxXHU1ZTAzXHU1MjMwXHU0ZWU1XHU0ZTBiXHU0ZjRkXHU3ZjZlDQotZGV0YWlsSW5mb1RleHQ9XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHU4YmIwXHU1ZjU1XHU1NzI4XHU2NWU1XHU1ZmQ3XHU2NTg3XHU0ZWY2XHU1OTM5XHU1MTg1XHU3Njg0XHU0ZWU1XHU0ZTBiXHU2NTg3XHU0ZWY2XHU0ZTJkDQotc2hvd0Vycm9yVGV4dD1cdTY2M2VcdTc5M2FcdTUzZDFcdTVlMDNcdTY3MWZcdTk1ZjRcdTUzZDFcdTc1MWZcdTc2ODRcdTYyNDBcdTY3MDlcdTk1MTlcdThiZWZcdTMwMDINCi1sb2dzV2FybmluZ1RleHQ9XHU4YmIwXHU1ZjU1XHU2MjQwXHU2NzA5XHU4YjY2XHU1NDRhXHU2ZDg4XHU2MDZmXHVmZjBjXHU0ZjhiXHU1OTgyXHU3ZjNhXHU1YzExXHU1ZjE1XHU3NTI4XHUzMDAxXHU5NGZlXHU2M2E1XHU0ZTJkXHU2NWFkXHU0ZWU1XHU1M2NhXHU0ZTBkXHU1ZTI2XHU1ZGYyXHU1MjA2XHU3YzdiXHU1MTQzXHU3ZDIwXHU3Njg0XHU2NzJhXHU1M2QxXHU1ZTAzXHU3YzdiXHU1MjJiXHUzMDAyDQotcGFnZXNOb3RJbnN0YWxsZWRUZXh0PVx1NTcyOCBwYWdlc19ub3RfaW5zdGFsbGVkIFx1NjU4N1x1NGVmNlx1NTkzOVx1NGUyZFx1ZmYwY1x1NTNlZlx1NjI3ZVx1NTIzMFx1NmI2NFx1OTE0ZFx1N2Y2ZVx1NGUyZFx1NzY4NFx1NjI0MFx1NjcwOVx1N2YzYVx1NWMxMVx1NWYxNVx1NzUyOFx1MzAwMg0KLWludmFsaWRFeHRlcm5hbFRleHQ9XHU5MTRkXHU3ZjZlXHU0ZTJkXHU2MjdlXHU1MWZhXHU3Njg0XHU2NWUwXHU2NTQ4XHU1OTE2XHU5MGU4XHU5NGZlXHU2M2E1DQotb3duZXJFbGVtZW50VGV4dD1cdTYyZTVcdTY3MDlcdTgwMDVcdTUxNDNcdTdkMjANCi1ub25FeGlzdGluZ1RleHQ9XHU2MmU1XHU2NzA5XHU4MDA1XHU1MTQzXHU3ZDIwXHU1ZjE1XHU3NTI4XHU5NzVlXHU3M2IwXHU2NzA5XHU3Njg0XHU1MTQzXHU3ZDIwXHUzMDAyXHU4ZmQ5XHU0ZTliXHU1MTQzXHU3ZDIwXHU1M2VmXHU4MGZkXHU1NzI4XHU1MjFiXHU1ZWZhXHU1MTQzXHU3ZDIwXHU5NGZlXHU2M2E1XHU1NDBlXHU1ZGYyXHU4OGFiXHU0ZWNlXHU1ZTkzXHU0ZTJkXHU1MjIwXHU5NjY0XHUzMDAyXHU4YmY3XHU2MjdlXHU1MjMwXHU2MmU1XHU2NzA5XHU4MDA1XHU1MTQzXHU3ZDIwXHVmZjBjXHU3MTM2XHU1NDBlXHU0ZmVlXHU1OTBkXHU4ZmQ5XHU0ZTliXHU2NWUwXHU2NTQ4XHU1ZjE1XHU3NTI4XHUzMDAyDQotbWlzc2luZ1JlZmVyZW5jZXNUaXRsZVRleHQ9XHU3ZjNhXHU1YzExXHU1ZjE1XHU3NTI4DQotbWlzc2luZ1JlZmVyZW5jZXNUZXh0PVx1NjJlNVx1NjcwOVx1ODAwNVx1NTE0M1x1N2QyMFx1NWYxNVx1NzUyOFx1OTAwOVx1NWI5YVx1OTE0ZFx1N2Y2ZVx1NGUyZFx1NzY4NFx1N2YzYVx1NWMxMVx1NTE0M1x1N2QyMFx1MzAwMlx1OGJmN1x1NjhjMFx1NjdlNVx1OTE0ZFx1N2Y2ZVx1OTVlZFx1NTQwOFx1ZmYwY1x1NGZlZVx1NmI2M1x1N2YzYVx1NWMxMVx1NzY4NFx1NWYxNVx1NzUyOFx1MzAwMg0KLW1pc3NpbmdSZXNvdXJjZUZpbGVzVGl0bGVUZXh0PVx1N2YzYVx1NWMxMVx1OGQ0NFx1NmU5MFx1NjU4N1x1NGVmNg0KLW1pc3NpbmdSZXNvdXJjZUZpbGVzVGV4dD1cdTYyZTVcdTY3MDlcdTgwMDVcdTUxNDNcdTdkMjBcdTVmMTVcdTc1MjhcdTdmM2FcdTVjMTFcdTc2ODRcdThkNDRcdTZlOTBcdTY1ODdcdTRlZjZcdTMwMDJcdTUxNDNcdTdkMjBcdTUxODVcdTViYjlcdTYyMTZcdTUxNzNcdTgwNTRcdTk2NDRcdTRlZjZcdTRlMmRcdTVmMTVcdTc1MjhcdTRlODZcdThmZDlcdTRlOWJcdThkNDRcdTZlOTBcdTY1ODdcdTRlZjZcdTMwMDINCi1taXNzaW5nUmVzb3VyY2VUZXh0PVx1N2YzYVx1NWMxMVx1OGQ0NFx1NmU5MA0KLW93bmVyUmVzb3VyY2VUZXh0PVx1NjJlNVx1NjcwOVx1ODAwNVx1OGQ0NFx1NmU5MA0KLW1pc3NpbmdFbGVtZW50VGV4dD1cdTdmM2FcdTVjMTFcdTUxNDNcdTdkMjANCi1pbnZhbGlkRWxlbWVudFRleHQ9XHU2NWUwXHU2NTQ4XHU1MTQzXHU3ZDIwDQotaW52YWxpZEVsZW1lbnRMaW5rc1RleHQ9XHU2NWUwXHU2NTQ4XHU1MTQzXHU3ZDIwXHU5NGZlXHU2M2E1DQotcGxlYXNlQ2hlY2tUZXh0PVx1OGJmN1x1NjhjMFx1NjdlNVx1OTE0ZFx1N2Y2ZVx1OTVlZFx1NTQwOFx1ZmYwY1x1NGZlZVx1NmI2M1x1N2YzYVx1NWMxMVx1NzY4NFx1NWYxNVx1NzUyOFx1MzAwMg0KLXBsZWFzZUZpbmRUZXh0PVx1OGJmN1x1NjI3ZVx1NTIzMFx1NjJlNVx1NjcwOVx1ODAwNVx1NTE0M1x1N2QyMFx1ZmYwY1x1NzEzNlx1NTQwZVx1NGZlZVx1NTkwZFx1OGZkOVx1NGU5Ylx1NjVlMFx1NjU0OFx1NWYxNVx1NzUyOFx1MzAwMg0KLWdsb3NzYXJ5VGV4dD1cdThiY2RcdTZjNDdcdTg4NjgNCi1pbmRleFRleHQ9XHU3ZDIyXHU1ZjE1DQotZmVlZGJhY2tUZXh0PVx1NTNjZFx1OTk4OA0KLWFib3V0VGV4dD1cdTUxNzNcdTRlOGUNCi1zZWFyY2hUZXh0PVx1NjQxY1x1N2QyMg0KLXByaW50VGV4dD1cdTYyNTNcdTUzNzANCi1zdW1tYXJ5VGV4dD1cdTY0NThcdTg5ODENCi1wdWJsaXNoaW5nUmVwb3J0VGV4dD1cdTUzZDFcdTVlMDNcdTYyYTVcdTU0NGFcdWZmMWENCi13aGVyZUFtSVRleHQ9XHU2MjExXHU3Njg0XHU0ZjRkXHU3ZjZlDQotdHJlZVNldHNUZXh0PVx1NjgxMVx1OTZjNlx1NTQwOA0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3hzbC9yZXNvdXJjZXNfemhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwxL3hzbC9yZXNvdXJjZXNfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYyZjA4MS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMS94c2wvcmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0jIFRoZSBVSSB0ZXh0IGluIHRoZSBYU0wgc3R5bGVzaGVldHMuDQotDQotc2VsZWN0ZWRDb25maWd1cmF0aW9uVGV4dD1cdTkwNzhcdTUzZDZcdTc2ODRcdTkxNGRcdTdmNmVcdTVkZjJcdTc2N2NcdTRmNDhcdTgxZjNcdTRlMGJcdTUyMTdcdTRmNGRcdTdmNmUNCi1kZXRhaWxJbmZvVGV4dD1cdThhNzNcdTdkMzBcdThjYzdcdThhMGFcdTVkZjJcdThhMThcdThmMDlcdTgxZjNcdTY1ZTVcdThhOGNcdThjYzdcdTY1OTlcdTU5M2VcdTc2ODRcdTRlMGJcdTUyMTdcdTZhOTRcdTY4NDhcdTRlMmQNCi1zaG93RXJyb3JUZXh0PVx1OTg2Zlx1NzkzYVx1NzY3Y1x1NGY0OFx1NjcxZlx1OTU5M1x1NzY3Y1x1NzUxZlx1NzY4NFx1NGVmYlx1NGY1NVx1OTMyZlx1OGFhNFx1MzAwMg0KLWxvZ3NXYXJuaW5nVGV4dD1cdThhMThcdThmMDlcdTYyNDBcdTY3MDlcdThiNjZcdTU0NGFcdThhMGFcdTYwNmZcdWZmMGNcdTRmOGJcdTU5ODJcdTkwN2FcdTZmMGZcdTUzYzNcdTcxNjdcdTMwMDFcdTRlMmRcdTY1YjdcdTc2ODRcdTkzYzhcdTdkNTBcdTUzY2FcdTcxMjFcdTUyMDZcdTk4NWVcdTUxNDNcdTdkMjBcdTc2ODRcdTY3MmFcdTc2N2NcdTRmNDhcdTdhMmVcdTk4NWVcdTMwMDINCi1wYWdlc05vdEluc3RhbGxlZFRleHQ9XHU1NzI4IHBhZ2VzX25vdF9pbnN0YWxsZWQgXHU4Y2M3XHU2NTk5XHU1OTNlXHU0ZTJkXHVmZjBjXHU2MGE4XHU1M2VmXHU0ZWU1XHU2MjdlXHU1MjMwXHU2YjY0XHU5MTRkXHU3ZjZlXHU0ZTJkXHU5MDdhXHU2ZjBmXHU3Njg0XHU2MjQwXHU2NzA5XHU1M2MzXHU3MTY3XHUzMDAyDQotaW52YWxpZEV4dGVybmFsVGV4dD1cdTkxNGRcdTdmNmVcdTRlMmRcdThiNThcdTUyMjVcdTcxMjFcdTY1NDhcdTc2ODRcdTU5MTZcdTkwZThcdTkzYzhcdTdkNTANCi1vd25lckVsZW1lbnRUZXh0PVx1NjRjMVx1NjcwOVx1ODAwNVx1NTE0M1x1N2QyMA0KLW5vbkV4aXN0aW5nVGV4dD1cdTY0YzFcdTY3MDlcdTgwMDVcdTUxNDNcdTdkMjBcdTUzYzNcdTcxNjdcdTUyMzBcdTRlMGRcdTViNThcdTU3MjhcdTc2ODRcdTUxNDNcdTdkMjBcdTMwMDJcdTUzZWZcdTgwZmRcdTU3MjhcdTUxNDNcdTdkMjBcdTkzYzhcdTdkNTBcdTVlZmFcdTdhY2JcdTRlNGJcdTVmOGNcdWZmMGNcdTVkZjJcdTVmOWVcdTdhMGJcdTVmMGZcdTVlYWJcdTRlMmRcdTUyMmFcdTk2NjRcdTUxNDNcdTdkMjBcdTMwMDJcdThhY2JcdTVjMGJcdTYyN2VcdTY0YzFcdTY3MDlcdTgwMDVcdTUxNDNcdTdkMjBcdWZmMGNcdTRlMjZcdTRmZWVcdTZiNjNcdTkwMTlcdTRlOWJcdTcxMjFcdTY1NDhcdTc2ODRcdTUzYzNcdTcxNjdcdTMwMDINCi1taXNzaW5nUmVmZXJlbmNlc1RpdGxlVGV4dD1cdTkwN2FcdTZmMGZcdTUzYzNcdTcxNjcNCi1taXNzaW5nUmVmZXJlbmNlc1RleHQ9XHU2NGMxXHU2NzA5XHU4MDA1XHU1MTQzXHU3ZDIwXHU1M2MzXHU3MTY3XHU1MjMwXHU5MDc4XHU1YjlhXHU5MTRkXHU3ZjZlXHU0ZTJkXHU5MDdhXHU2ZjBmXHU3Njg0XHU1MTQzXHU3ZDIwXHUzMDAyXHU4YWNiXHU2YWEyXHU2N2U1XHU5MTRkXHU3ZjZlXHU5MDhhXHU3NTRjXHVmZjBjXHU0ZTI2XHU0ZmVlXHU2YjYzXHU5MDdhXHU2ZjBmXHU1M2MzXHU3MTY3XHUzMDAyDQotbWlzc2luZ1Jlc291cmNlRmlsZXNUaXRsZVRleHQ9XHU5MDdhXHU2ZjBmXHU4Y2M3XHU2ZTkwXHU2YTk0DQotbWlzc2luZ1Jlc291cmNlRmlsZXNUZXh0PVx1NjRjMVx1NjcwOVx1ODAwNVx1NTE0M1x1N2QyMFx1NTNjM1x1NzE2N1x1NTIzMFx1OTA3YVx1NmYwZlx1NzY4NFx1OGNjN1x1NmU5MFx1NmE5NFx1MzAwMlx1NTE0M1x1N2QyMFx1NzY4NFx1NTE2N1x1NWJiOVx1NjIxNlx1NzZmOFx1OTVkY1x1NzY4NFx1OTY0NFx1NGVmNlx1NGUyZFx1NTNjM1x1NzE2N1x1NTIzMFx1OTAxOVx1NGU5Ylx1OGNjN1x1NmU5MFx1NmE5NFx1MzAwMg0KLW1pc3NpbmdSZXNvdXJjZVRleHQ9XHU5MDdhXHU2ZjBmXHU4Y2M3XHU2ZTkwDQotb3duZXJSZXNvdXJjZVRleHQ9XHU2NGMxXHU2NzA5XHU4MDA1XHU4Y2M3XHU2ZTkwDQotbWlzc2luZ0VsZW1lbnRUZXh0PVx1OTA3YVx1NmYwZlx1NTE0M1x1N2QyMA0KLWludmFsaWRFbGVtZW50VGV4dD1cdTcxMjFcdTY1NDhcdTUxNDNcdTdkMjANCi1pbnZhbGlkRWxlbWVudExpbmtzVGV4dD1cdTcxMjFcdTY1NDhcdTUxNDNcdTdkMjBcdTkzYzhcdTdkNTANCi1wbGVhc2VDaGVja1RleHQ9XHU4YWNiXHU2YWEyXHU2N2U1XHU5MTRkXHU3ZjZlXHU5MDhhXHU3NTRjXHVmZjBjXHU0ZTI2XHU0ZmVlXHU2YjYzXHU5MDdhXHU2ZjBmXHU1M2MzXHU3MTY3XHUzMDAyDQotcGxlYXNlRmluZFRleHQ9XHU4YWNiXHU1YzBiXHU2MjdlXHU2NGMxXHU2NzA5XHU4MDA1XHU1MTQzXHU3ZDIwXHVmZjBjXHU0ZTI2XHU0ZmVlXHU2YjYzXHU5MDE5XHU0ZTliXHU3MTIxXHU2NTQ4XHU3Njg0XHU1M2MzXHU3MTY3XHUzMDAyDQotZ2xvc3NhcnlUZXh0PVx1NTQwZFx1OGE1ZVx1ODllM1x1OTFjYg0KLWluZGV4VGV4dD1cdTdkMjJcdTVmMTUNCi1mZWVkYmFja1RleHQ9XHU2MTBmXHU4OThiDQotYWJvdXRUZXh0PVx1OTVkY1x1NjViYw0KLXNlYXJjaFRleHQ9XHU2NDFjXHU1YzBiDQotcHJpbnRUZXh0PVx1NTIxN1x1NTM3MA0KLXN1bW1hcnlUZXh0PVx1NjQ1OFx1ODk4MQ0KLXB1Ymxpc2hpbmdSZXBvcnRUZXh0PVx1NzY3Y1x1NGY0OFx1NTgzMVx1NTQ0YVx1ZmYxYQ0KLXdoZXJlQW1JVGV4dD1cdTYyMTFcdTc2ODRcdTRmNGRcdTdmNmUNCi10cmVlU2V0c1RleHQ9XHU2YTM5XHU3MmMwXHU3ZDUwXHU2OWNiXHU5NmM2DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmOTMyMWUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZGQ4ZDIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwyLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmc7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBmcmFnbWVudAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3Mjc0MGQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotc291cmNlLm5sMi5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMi5qYXIgPSBiaW4vDQotYmluLmluY2x1ZGVzID0gbmwyLmphcixcDQotICAgICAgICAgICAgICAgeHNsLyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3J1LnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGRvY3Jvb3QvLFwNCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIGZyYWdtZW50LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMi9kb2Nyb290L2Fib3V0X3J1Lmh0bSBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyL2RvY3Jvb3QvYWJvdXRfcnUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWZmNWRlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyL2RvY3Jvb3QvYWJvdXRfcnUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLQ0KLTxodG1sPg0KLTwhLS0gDQotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gICAgQ29udHJpYnV0b3JzOg0KLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLS0+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiLz4NCi0JPHRpdGxlPtCeINC/0YDQvtC00YPQutGC0LU8L3RpdGxlPg0KLTxzY3JpcHQgc3JjPSJzY3JpcHRzL2NvbW1vbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+DQotCTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQotCQlib2R5IHsNCi0JCQltYXJnaW46IDhweDsNCi0JCX0NCi0JPC9zdHlsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotDQotCTxpbWcgc3JjPSIuL2ltYWdlcy9pY29uX2Fib3V0LmdpZiIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBhbHQ9ItC+INC/0YDQvtC00YPQutGC0LUiIGJvcmRlcj0iMCIvPjxiciAvPjxiciAvPg0KLTxzcGFuIGNsYXNzPSJwb3AiPk9wZW5VUC9CYXNpYzxiciAvPg0KLdCS0LXRgNGB0LjRjyAxLjA8YnIgLz4NCi08YnIgLz4NCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi48YnIgLz4NCi3QktGB0LUg0L/RgNCw0LLQsCDQt9Cw0YnQuNGJ0LXQvdGLLjwvc3Bhbj48YnIgLz48YnIgLz4NCi0JPHRhYmxlIHN1bW1hcnk9IiIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPg0KLQkgIDx0cj4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjQiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiBjb2xzcGFuPSIyIiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxhIGNsYXNzPSJidXR0b24iIGhyZWY9ImphdmFzY3JpcHQ6c2VsZi5jbG9zZSgpOyI+PHNwYW4gY2xhc3M9ImJ1dHRvbnR4dCI+Jm5ic3A70JfQsNC60YDRi9GC0YwmbmJzcDs8L3NwYW4+PC9hPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93IiAgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCTwvdGFibGU+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMi9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfcnUuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMi9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfcnUuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZGFmZWIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvZG9jcm9vdC9ub2FwcGxldC9ib29rbWFya3ZpZXdzX3J1LmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8vIGphdmFzY3JpcHQgZm9yIHRoZSBib29rbWFya3MgZnJhbWUgKCB0aGUgb3J5X3RvY19mcmFtZSBmcmFtZSkNCi0vLyB0aGlzIGZyYW1lIGNvbnRhaW5zIGEgY2hpbGQgaWZyYW1lIChvcnlfdG9jKQ0KLQ0KLS8vIG1lc3NhZ2VzIHRvIGJlIGV4dGVybml6ZWQNCi0vLyBoZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotdmFyIGJvb2ttYXJrdmlld3NfanNfTUVTU0FHRTEgPSAi0K3RgtCwINGB0YLRgNCw0L3QuNGG0LAg0L3QtSDQvdCw0LnQtNC10L3QsCDQsiDQtNC10YDQtdCy0LUg0L3QsNCy0LjQs9Cw0YbQuNC4LiI7DQotDQotZnVuY3Rpb24gZGlzcGxheVRyZWUodGFiKQ0KLXsNCi0JdXJsID0gdGFiLmdldEF0dHJpYnV0ZSgndXJsJyk7DQotDQotCWlmICggc2VsZWN0ZWRUYWIgIT0gbnVsbCApDQotCXsNCi0JCXNlbGVjdGVkVGFiLmNsYXNzTmFtZSA9ICJ0YWIiDQotCX0NCi0JdGFiLmNsYXNzTmFtZSA9ICJzZWxlY3RlZFRhYiINCi0Jc2VsZWN0ZWRUYWIgPSB0YWI7DQotDQotCWxvYWRJZnJhbWUoIm9yeV90b2MiLCB1cmwpOw0KLX0NCi0NCi1mdW5jdGlvbiBsb2FkSWZyYW1lKGlmcmFtZU5hbWUsIHVybCkNCi17DQotCWlmICggd2luZG93LmZyYW1lc1tpZnJhbWVOYW1lXSApDQotCXsNCi0JCXdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0udG9jX2xvYWRlZCA9IGZhbHNlOw0KLQkJd2luZG93LmZyYW1lc1tpZnJhbWVOYW1lXS5sb2NhdGlvbiA9IHVybDsNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCWVsc2UgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi1mdW5jdGlvbiBzaG93UGFnZSgpDQotew0KLQ0KLQlwYXJlbnQuZnJhbWVzWyJvcnlfZG9jIl0ubG9jYXRpb24uaHJlZiA9IHVuZXNjYXBlKHRvcGljVG9EaXNwbGF5KTsNCi19DQotDQotDQotLyoqDQotICogZmluZCBhIHRvcGljIGluIHRoZSB0cmVlOiB0aGUgdG9waWMgaXMgc2V0IGluIHRvcGljVG9EaXNwbGF5DQotICogcmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3MNCi0gKi8NCi1mdW5jdGlvbiBmaW5kVG9jVG9waWMoKQ0KLXsNCi0JdmFyIHRvY193aW5kb3cgPSB3aW5kb3cuZnJhbWVzWyJvcnlfdG9jIl07DQotDQotCS8vYWxlcnQodG9jX3dpbmRvdy50b2NfbG9hZGVkKTsNCi0JLy8gY2hlY2sgZm9yIGZhbHNlIGlzIG5vdCBzYWZlIHNpbmNlIHRoZSB2YWx1ZSBtaWdodCBiZSB1bmRlZmluZWQgaWYgdGhlIGZyYW1lIGlzIG5vdCBsb2FkZWQgeWV0DQotCS8vaWYgKHRvY193aW5kb3cudG9jX2xvYWRlZCA9PSBmYWxzZSApDQotCWlmICggdG9jX3dpbmRvdy50b2NfbG9hZGVkICE9IHRydWUgKQ0KLQl7DQotCQkvL2lmICggdG9jX3dpbmRvdy50b2NfbG9hZGVkID09IHVuZGVmaW5lZCApDQotCQkvL3sNCi0JCS8vCWFsZXJ0KCJnb3QgaXQhIik7DQotCQkvL30NCi0JCXdpbmRvdy5zZXRUaW1lb3V0KCJmaW5kVG9jVG9waWMoKSIsIDIwMCk7DQotCX0NCi0JZWxzZQ0KLQl7DQotCQlpZiAoIHRvcGljVG9EaXNwbGF5ID09IG51bGwgKQ0KLQkJew0KLQkJCXRvcGljVG9EaXNwbGF5ID0gdG9jX3dpbmRvdy5nZXRGaXJzdFRvcGljVXJsKCk7DQotCQl9DQotCQ0KLQkJdmFyIHRvcGljID0gdG9waWNUb0Rpc3BsYXk7DQotDQotCQkvLyBmaW5kIHRoZSB0b3BpYyBpbiB0aGUgY3VycmVudCB2aWV3LCBpZiBub3QsIGxvb2sgZm9yIHRoZSBuZXh0IHZpZXcNCi0JCWlmICggdG9jX3dpbmRvdy5zZWxlY3RUb3BpYyh0b3BpYykgPT0gZmFsc2UgKQ0KLQkJew0KLQkJCWlmICggbG9hZGluZ1RhYkluZGV4IDwgdmlld1RhYnMubGVuZ3RoIC0xICkNCi0JCQl7DQotCQkJCWRpc3BsYXlUcmVlKHZpZXdUYWJzW2xvYWRpbmdUYWJJbmRleCsrXSk7DQotCQkJCWZpbmRUb2NUb3BpYygpOw0KLQkJCX0NCi0JCQllbHNlDQotCQkJew0KLQkJCQkvLyBlbmQgZmluZGluZyBhbmQgZ290IG5vdGhpbmcNCi0JCQkJLy8gZGlzcGxheSB0aGUgZGVmYXVsdA0KLQkJCQlhbGVydChib29rbWFya3ZpZXdzX2pzX01FU1NBR0UxKTsNCi0JCQkJbG9hZGluZ1RhYkluZGV4ID0gMDsNCi0JCQkJc2hvd1BhZ2UoKTsNCi0JCQl9DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJbG9hZGluZ1RhYkluZGV4ID0gMDsNCi0JCQkvLyBmaW5kIHN1Y2Nlc3NmdWwsIGRpc3BsYXkgdGhlIHRvcGljIHBhZ2UNCi0JCQlzaG93UGFnZSgpOw0KLQkJfQ0KLQl9DQotfQ0KLQ0KLQ0KLQ0KLS8vIGZpbmQgdGhlIHRvcGljIGluIHRoZSBjdXJyZW50IHRhYg0KLWZ1bmN0aW9uIHdoZXJlQW1JKCkNCi17DQotCXZhciB1cmwgPSBwYXJlbnQuZnJhbWVzWyJvcnlfZG9jIl0uZG9jdW1lbnQuVVJMOw0KLQkNCi0JaWYgKCB1cmwgIT0gbnVsbCApDQotCXsNCi0JCXRvcGljVG9EaXNwbGF5ID0gdXJsOw0KLQkJZmluZFRvY1RvcGljKCk7DQotCX0NCi19DQotDQotDQotZnVuY3Rpb24gdG9nVmlld3MoKQ0KLXsNCi0JLy8gaWYgY3VycmVudGx5IHZpc2libGUsIGhpZGUgYWxsIGV4Y2VwdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkDQotCWlzVmlld3NWaXNpYmxlID0gKCFpc1ZpZXdzVmlzaWJsZSk7DQotCQ0KLQlmb3IgKCB2YXIgaSA9IDA7ICBpIDwgdmlld1RhYnMubGVuZ3RoOyBpKyspDQotCXsNCi0JCXZhciBzaG93ID0gaXNWaWV3c1Zpc2libGUgfHwgKHZpZXdUYWJzW2ldID09IHNlbGVjdGVkVGFiKTsNCi0JCWlmICggc2hvdyApDQotCQl7CQkNCi0JCQkvL3ZpZXdUYWJzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7DQotCQkJdmlld1RhYnNbaV0uc3R5bGUuZGlzcGxheSA9ICcnOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCS8vdmlld1RhYnNbaV0uc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOw0KLQkJCXZpZXdUYWJzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQotCQl9DQotCX0NCi0JCQ0KLQkJDQotDQotfQ0KLQ0KLQ0KLS8vIGRpc3BsYXkgdGhlIGRlZmF1bHQgcGFnZSBhbmQgbmF2aWdhdGUgdG8gdGhlIG5vZGUNCi0vLyBpZiBubyBkZWZhdWx0IHBhZ2UgaXMgc2V0LCBkaXNwbGF5IHRoZSBmaXJzdCBub2RlIG9mIHRoZSBmaXJzdCB2aWV3DQotZnVuY3Rpb24gaW5pdCgpDQotew0KLQlsb2FkaW5nVGFiSW5kZXggPSAwOw0KLQl2YXIgdGFicyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzcGFuIik7DQotCXZhciB0YWJjb3VudCA9IDA7DQotCWZvciAodmFyIGk9MDsgaTx0YWJzLmxlbmd0aDsgaSsrKQ0KLQl7DQotCQlpZiAoIHRhYnNbaV0uZ2V0QXR0cmlidXRlKCd1cmwnKSAhPSBudWxsICkNCi0JCXsJCQkNCi0JCQl2YXIgaXNEZWZhdWx0VmlldyA9IHRhYnNbaV0uZ2V0QXR0cmlidXRlKCdpc0RlZmF1bHRWaWV3Jyk7DQotCQkJaWYgKCBpc0RlZmF1bHRWaWV3ID09ICJ0cnVlIiApDQotCQkJew0KLQkJCQlsb2FkaW5nVGFiSW5kZXggPSB0YWJjb3VudDsNCi0JCQl9DQotCQkJDQotCQkJdmlld1RhYnNbdGFiY291bnQrK10gPSB0YWJzW2ldOw0KLQkJfQ0KLQl9DQotDQotCXRvcGljVG9EaXNwbGF5ID0gcGFyZW50LmdldENvb2tpZSgicnVwX29yeV9kb2MiKTsNCi0JZGlzcGxheVRyZWUodmlld1RhYnNbbG9hZGluZ1RhYkluZGV4XSk7DQotCWZpbmRUb2NUb3BpYygpOw0KLX0NCi0NCi0NCi12YXIgc2VsZWN0ZWRUYWIgPSBudWxsOw0KLXZhciB2aWV3VGFicyA9IG5ldyBBcnJheSgpOzsNCi12YXIgbG9hZGluZ1RhYkluZGV4ID0gMDsNCi12YXIgdG9waWNUb0Rpc3BsYXkgPSBudWxsOw0KLXZhciBpc1ZpZXdzVmlzaWJsZSA9IHRydWU7DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4X3J1Lmh0bSBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF9ydS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YzExNTguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4X3J1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDL0RURCBIVE1MIDQuMDEvL0VOIg0KLSAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+DQotPEhUTUw+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KLTxtZXRhIG5hbWU9Im1ldGFfdGFnZ2VkIiBjb250ZW50PSJ0cnVlIj4NCi08dGl0bGU+0JPQu9C+0YHRgdCw0YDQuNC5IC0gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yazwvdGl0bGU+DQotPC9oZWFkPg0KLTxmcmFtZXNldCByb3dzPSIyNSwqIj4NCi08ZnJhbWUgbmFtZT0iZ2xvc3NhcnlfbmF2IiBzcmM9Im5hdmlnLmh0bSIgc2Nyb2xsaW5nPSJubyIgbWFyZ2luaGVpZ2h0PSIyIiBtYXJnaW53aWR0aD0iMiIgdGl0bGU9ItCe0LHQu9Cw0YHRgtGMINC90LDQstC40LPQsNGG0LjQuCI+DQotPGZyYW1lIG5hbWU9Imdsb3NzYXJ5X2RvYyIgc3JjPSIuLi9nbG9zc2FyeS5odG0iIG1hcmdpbmhlaWdodD0iMCIgbWFyZ2lud2lkdGg9IjIiIHNjcm9sbGluZz0iYXV0byIgdGl0bGU9ItCe0LHQu9Cw0YHRgtGMINC80LDRgtC10YDQuNCw0LvQvtCyIj4NCi08L2ZyYW1lc2V0Pg0KLTwvSFRNTD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMi9kb2Nyb290L3NjcmlwdHMvdG9wbmF2X3J1LmpzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl9ydS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY5MWExYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMi9kb2Nyb290L3NjcmlwdHMvdG9wbmF2X3J1LmpzCisrKyAvZGV2L251bGwKQEAgLTEsNzg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotLy8gDQotLy8gQ29udHJpYnV0b3JzOg0KLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8vIG1lc3NhZ2VzIHRvIGJlIGV4dGVybml6ZWQNCi0vLyBoZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzDQotDQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMSA9ICLQlNC10YDQtdCy0L4g0LXRidC1INC90LUg0LfQsNCz0YDRg9C20LXQvdC+Llxu0J/QvtC20LDQu9GD0LnRgdGC0LAsINC/0L7QtNC+0LbQtNC40YLQtS4iOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTIgPSAi0JTQu9GPINC00LDQvdC90L7QuSDRgdGC0YDQsNC90LjRhtGLINC90LXRgiDRgdGC0YDQsNC90LjRhtGLICd7MH0nLlxu0J3QsNC20LzQuNGC0LUg0LTRgNGD0LPRg9GOINC60L3QvtC/0LrRgyDQvdCw0LLQuNCz0LDRhtC40LguICI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMyA9ICLQndC1INC90LDQudC00LXQvdCwINGB0YLRgNCw0L3QuNGG0LAgezB9LiAiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV9wcmV2ID0gItC90LDQt9Cw0LQiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV9uZXh0ID0gItC00LDQu9C10LUiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRV91cCA9ICLQstCy0LXRgNGFIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0U0ID0gItCi0LXQutGD0YnQtdCz0L4g0YTQsNC50LvQsCDQvdC10YIg0LIg0LTQtdGA0LXQstC1LiAiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTUgPSAi0J7Qv9GD0LHQu9C40LrQvtCy0LDQvdC90YvQuSDRgdCw0LnRgiDRg9C20LUg0L/QvtC60LDQt9Cw0L0g0LIg0YTRgNC10LnQvNCw0YUiOw0KLQ0KLWZ1bmN0aW9uIGZvcm1hdFN0cmluZyhtZXNzYWdlLCByZXBsYWNlMCkNCi17DQotICAgCXJldHVybiBtZXNzYWdlLnJlcGxhY2UoL1x7MFx9LywgcmVwbGFjZTApOw0KLX0gDQotDQotLy8gdGhpcyBzY3JpcHQgaXMgZm9yIHRoZSB0b3BuYXYuaHRtbA0KLS8vIHRoaXMgaXMgTk9UIGZvciBnZW5lcmFsIHVzZQ0KLU1TRlBob3ZlciA9DQotKCgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk5ldHNjYXBlIikgJiYNCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gMyApKSB8fA0KLSAgKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIikgJiYNCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gNCApKSk7DQotDQotICBmdW5jdGlvbiBNU0ZQcHJlbG9hZChpbWcpDQotICB7DQotICAgICB2YXIgYT1uZXcgSW1hZ2UoKTsNCi0gICAgIGEuc3JjPWltZzsNCi0gICAgIHJldHVybiBhOw0KLSAgfQ0KLSAgDQotdmFyIHRvdXIgPSAwOw0KLQ0KLWZ1bmN0aW9uIG9wZW5GaXJzdFRvdXIgKCkNCi0vLyBvcGVuIHRoZSBndWlkZWQgdG91ciAvaGFha2FuIDk5MDMyNA0KLXsNCi1pZighdG91ciB8fCB0b3VyPT1udWxsIHx8IHRvdXIuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgdG91ciA9IG9wZW4oIi4vdG91ci90b3VyLmh0bSIsInRvdXJfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zNTAsaGVpZ2h0PTcwMCxyZXNpemFibGU9eWVzIik7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBvcGVuVG91ciAoKQ0KLS8vIG9wZW4gdGhlIGd1aWRlZCB0b3VyIC9oYWFrYW4gOTkwMzI0DQotew0KLWlmKCF0b3VyIHx8IHRvdXI9PW51bGwgfHwgdG91ci5jbG9zZWQpDQotICAgIHsNCi0gICAgICB0b3VyID0gb3BlbigiLi90b3VyL3RvdXIuaHRtIiwidG91cl9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM1MCxoZWlnaHQ9NzAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLS8vQWRkaXRpb24gYnkgQ2hpbmggVm8gMDMvMjgvMDANCi0gZnVuY3Rpb24gZGlzcGxheUdldHRpbmdTdGFydGVkKCkNCi0gew0KLSAJdmFyIHBhZ2VQYXR0ZXJuID0gL292dV9wcm9jLzsNCi0gCXZhciBtYWluUGFnZSA9IHdpbmRvdy5wYXJlbnQub3J5X2RvYy5sb2NhdGlvbjsNCi0NCi0gCWlmICggcGFnZVBhdHRlcm4udGVzdCggbWFpblBhZ2UgKSApIHsNCi0gICAgCWlmIChnZXRDb29raWUoIlJVUCIpICE9ICJjaGVja2VkIikgeyBvcGVuRmlyc3RUb3VyKCk7IH0NCi0JfQ0KLQllbHNlIHsNCi0JCXNldFRpbWVvdXQoICJkaXNwbGF5R2V0dGluZ1N0YXJ0ZWQoKSIsIDEwMDAgKTsNCi0JfQ0KLX0NCi0NCi1mdW5jdGlvbiBnZXRDb29raWUgKG5hbWUpDQotew0KLSAgdmFyIGRjb29raWUgPSBkb2N1bWVudC5jb29raWU7DQotICB2YXIgY25hbWUgPSBuYW1lICsgIj0iOw0KLSAgdmFyIGNsZW4gPSBkY29va2llLmxlbmd0aDsNCi0gIHZhciBjYmVnaW4gPSAwOw0KLSAgd2hpbGUgKGNiZWdpbiA8IGNsZW4pDQotICB7DQotICAgIHZhciB2YmVnaW4gPSBjYmVnaW4gKyBjbmFtZS5sZW5ndGg7DQotICAgIGlmIChkY29va2llLnN1YnN0cmluZyhjYmVnaW4sIHZiZWdpbikgPT0gY25hbWUpDQotICAgIHsNCi0gICAgICB2YXIgdmVuZCA9IGRjb29raWUuaW5kZXhPZiAoIjsiLCB2YmVnaW4pOw0KLSAgICAgIGlmICh2ZW5kID09IC0xKQ0KLSAgICAgIHsNCi0gICAgICAgIHZlbmQgPSBjbGVuOw0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gdW5lc2NhcGUoZGNvb2tpZS5zdWJzdHJpbmcodmJlZ2luLCB2ZW5kKSk7DQotICAgIH0NCi0gICAgY2JlZ2luID0gZGNvb2tpZS5pbmRleE9mKCIgIiwgY2JlZ2luKSArIDE7DQotICAgIGlmIChjYmVnaW4gPT0gMCkNCi0gICAgew0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICB9DQotICByZXR1cm4gbnVsbDsNCi0gfQ0KLQ0KLQ0KLSAgdmFyIGluZGV4PW51bGw7DQotICB2YXIgdG91cj1udWxsOw0KLSAgdmFyIHNlYXJjaD1udWxsOw0KLSAgdmFyIGdsb3NzYXJ5PW51bGw7DQotICB2YXIgZmVlZGJhY2s9bnVsbDsNCi0gIHZhciB0cmVlTG9hZGVkPWZhbHNlOw0KLSAgZnVuY3Rpb24gY2hlY2tUcmVlTG9hZGVkKCkNCi0gIHsNCi0gICAgaWYodHJlZUxvYWRlZCkNCi0gICAgew0KLSAgICAgIHJldHVybiB0cmVlTG9hZGVkOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICBpZihwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQgIT0gbnVsbA0KLSAgICAgICAgJiYgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHkoKSkNCi0gICAgIHsNCi0gICAgICAgdHJlZUxvYWRlZCA9IHRydWU7DQotICAgICB9DQotICAgICAqLw0KLSAgICAgaWYocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0ICE9IG51bGwpDQotICAgICB7DQotICAgICAgCXZhciBtZXRob2QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHk7DQotCSBpZiAobWV0aG9kICE9ICJ1bmRlZmluZWQiKSB7DQotCQlpZiAocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHkoKSkNCi0JCXsNCi0gICAgICAgCQkJdHJlZUxvYWRlZCA9IHRydWU7DQotCQl9DQotDQotCSAgfQ0KLQ0KLSAgICAgfQ0KLQ0KLSAgICAgcmV0dXJuIHRyZWVMb2FkZWQ7DQotICAgfQ0KLQ0KLQ0KLSAgICBmdW5jdGlvbiBzaG93QWxlcnROb3RMb2FkZWQoKQ0KLSAgICB7DQotICAgICAgYWxlcnQodG9wbmF2X2pzX01FU1NBR0UxKTsNCi0gICAgfQ0KLQ0KLWZ1bmN0aW9uIHNob3dTdGF0dXNOb3RMb2FkZWQoKQ0KLSAgew0KLSAgICAvL3JldHVybiAiVGhlIFRyZWVCcm93c2UgaXMgbm90IHlldCBsb2FkZWQhXG5QbGVhc2Ugd2FpdCEiOw0KLSAgICByZXR1cm4gdG9wbmF2X2pzX01FU1NBR0UxOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd0FsZXJ0Tm9QYWdlKHRleHQpDQotICB7DQotICAgICB2YXIgcGFyZW50TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKHBhcmVudExhYmVsIT0iIiAmJiBwYXJlbnRMYWJlbCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgICAgLy9hbGVydCgiVGhlcmUgaXMgbm8gJyIgKyB0ZXh0ICsgIicgcGFnZSBmb3IgdGhpcyBwYWdlLlxuVHJ5IG9uZSBvZiB0aGUgb3RoZXIgbmF2aWdhdGlvbiBidXR0b25zLiIpOw0KLSAgICAgICAgICBhbGVydChmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UyLCB0ZXh0KSk7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICAgLy9hbGVydCgiVGhlcmUgaXMgbm8gJyIgKyB0ZXh0ICsgIicgcGFnZSBmb3IgdGhpcyBwYWdlLlxuVHJ5IG9uZSBvZiB0aGUgb3RoZXIgbmF2aWdhdGlvbiBidXR0b25zIik7DQotICAgICAgICAgYWxlcnQoZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMiwgdGV4dCkpOw0KLSAgICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1N0YXR1c05vUGFnZSh0ZXh0KQ0KLSAgew0KLQ0KLSAgICAgdmFyIHBhcmVudExhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbXNnOw0KLSAgICAgaWYocGFyZW50TGFiZWwhPSIiICYmIHBhcmVudExhYmVsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICAgLy9tc2cgPSAiVGhlcmUgaXMgbm8gIiArIHRleHQgKyAiIHBhZ2UhIjsNCi0gICAgICAgIG1zZyA9IGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTMsIHRleHQpOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgLy9tc2cgPSAiVGhlcmUgaXMgbm8gIiArIHRleHQgKyAiIHBhZ2UhIjsNCi0gICAgICAgIG1zZyA9IGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTMsIHRleHQpOw0KLSAgICAgfQ0KLQ0KLSAgICAgcmV0dXJuIG1zZzsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dQYXJlbnRMYWJlbCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgdmFyIHBhcmVudHVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKGxhYmVsIT0iIiAmJiBsYWJlbCE9bnVsbCAmJiBwYXJlbnR1cmwhPSIiICYmIHBhcmVudHVybCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm9QYWdlKCJ1cCIpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm90TG9hZGVkKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dIb21lTGFiZWwoKQ0KLSAgew0KLSAgICBzZWxmLnN0YXR1cyA9ICLQkiDQvdCw0YfQsNC70L4iOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd1ByZXZpb3VzTGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c0xhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgdmFyIHByZXZ1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKGxhYmVsIT0iIiAmJiBsYWJlbCE9bnVsbCAmJiBwcmV2dXJsIT0iIiAmJiBwcmV2dXJsIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm9QYWdlKCJwcmV2aW91cyIpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm90TG9hZGVkKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dOZXh0TGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgbmV4dHVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIG5leHR1cmwhPSIiICYmIG5leHR1cmwhPW51bGwpDQotICAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsNCi0gICAgICB9DQotICAgICAgZWxzZQ0KLSAgICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb1BhZ2UoIm5leHQiKTsNCi0gICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZFByZXZpb3VzKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c0xhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0NCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0NCi0JaWYgKChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKT09LTEpICYmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKT09LTEpKQ0KLQl7DQotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpIT0tMSkNCi0Jew0KLQkgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRBcHBsZXRQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCk7DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQ0KLQl7DQotCQluZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRIdHRwUGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwsICJQcmV2aW91cyIpOw0KLQl9DQotCSAgICAgIAlwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV9wcmV2KTsNCi0gICAgIH0NCi0gICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbG9hZE5leHQoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0NCi0JaWYgKChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKT09LTEpICYmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKT09LTEpKQ0KLQl7DQotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLQl9DQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpIT0tMSkNCi0Jew0KLQkgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRBcHBsZXRQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCk7DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQ0KLQl7DQotCQluZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRIdHRwUGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwsICJOZXh0Iik7DQotCX0NCi0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLQ0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX25leHQpOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotDQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkUGFyZW50KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfdXApOw0KLSAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLWZ1bmN0aW9uIHdoZXJlQW1JKCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0JdmFyIHN0YXR1cyA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgIAlpZiggc3RhdHVzID09IGZhbHNlICkNCi0Jew0KLQkJYWxlcnQoIHRvcG5hdl9qc19NRVNTQUdFNCApOw0KLQl9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHVwQXJyb3coKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS51cEFycm93KCk7DQotICAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGRvd25BcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmRvd25BcnJvdygpOw0KLSAgICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkNCi0gICAgICB7DQotICAgICAgIHBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotICAgICAgfQ0KLQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICAgIGZ1bmN0aW9uIGxlZnRBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUubGVmdEFycm93KCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gICAgZnVuY3Rpb24gcmlnaHRBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUucmlnaHRBcnJvdygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotDQotZnVuY3Rpb24gbG9hZFRvcCgpDQotew0KLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIpDQotICB7DQotICAgICBhbGVydCh0b3BuYXZfanNfTUVTU0FHRTUpOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICB2YXIgZXhwaXJlcyA9IG5ldyBEYXRlKCk7DQotICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7DQotICAgIGRvY3VtZW50LmNvb2tpZSA9ICJydXBfb3J5X2RvYz0iICsgZXNjYXBlIChkb2N1bWVudC5VUkwpICsNCi0gICAgIjsgZXhwaXJlcz0iICsgZXhwaXJlcy50b1VUQ1N0cmluZygpICsgICI7IHBhdGg9LyI7DQotDQotICAgIHZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOw0KLQ0KLSAgICBmb3IoaT1kb2N1bWVudC5saW5rcy5sZW5ndGgtMTtpPj0wO2ktLSkNCi0gICAgew0KLSAgICAgICBpZihkb2N1bWVudC5saW5rc1tpXS5ocmVmLmluZGV4T2YoImluZGV4Lmh0bSIpIT0tMSkNCi0gICAgICAgew0KLSAgICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IGRvY3VtZW50LmxpbmtzW2ldLmhyZWY7DQotICAgICAgICAgYnJlYWs7DQotICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpDQotICAgIHsNCi0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQ0KLQl7DQotCQl3aW5kb3cuY2xvc2UoKTsNCi0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JICAgICAgIAl0b3AubG9jYXRpb24gPSBuZXdfb3J5X2RvY19sb2M7DQotCX0NCi0gICAgfQ0KLSAgIH0NCi19DQotDQotDQotZnVuY3Rpb24gb3Blbk9yeSAocGFnZSwgdGFyZ2V0KQ0KLXsNCi0gICAgaWYoIWluZGV4IHx8IGluZGV4LmNsb3NlZCkNCi0gICAgew0KLSAgICAgIGluZGV4ID0gb3BlbihwYWdlLHRhcmdldCwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM5NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBpbmRleC5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5TZWFyY2goKQ0KLXsNCi0gICAgaWYoIXNlYXJjaCB8fCBzZWFyY2guY2xvc2VkKQ0KLSAgICB7DQotICAgICAgc2VhcmNoID0gb3BlbigiLi9hcHBsZXQvc2VhcmNoLmh0bSIsInNlYXJjaF9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9bm8sd2lkdGg9NjMwLGhlaWdodD00NTAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHNlYXJjaC5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5JbmRleCgpDQotew0KLSAgIG9wZW5PcnkoIi4vaW5kZXgvaW5kZXguaHRtIiwiaW5kZXhfd2luIik7DQotfQ0KLQ0KLWZ1bmN0aW9uIG9wZW5HbG9zc2FyeSgpDQotew0KLSBpZighZ2xvc3NhcnkgfHwgZ2xvc3NhcnkuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgZ2xvc3NhcnkgPSBvcGVuKCIuL3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXguaHRtIiwiZ2xvc3Nhcnlfd2luIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM4NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBnbG9zc2FyeS5mb2N1cygpOw0KLSAgICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIHByaW50UGFnZSgpDQotew0KLSBwYXJlbnQub3J5X2RvYy5mb2N1cygpOw0KLSBwYXJlbnQub3J5X2RvYy5wcmludCgpOw0KLX0NCi0NCi0NCi1mdW5jdGlvbiBzZW5kRmVlZGJhY2sodXJsKQ0KLXsNCi0JaWYgKCB1cmwgPT0gbnVsbCB8fCB1cmwgPT0gJycgKQ0KLQl7DQotCQlyZXR1cm47DQotCX0NCi0JDQotCWlmICggdXJsLmluZGV4T2YoIm1haWx0bzoiKSA+PSAwICkNCi0Jew0KLQkJc2VuZG1haWwodXJsKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCQ0KLSAJICAgIGlmKCFmZWVkYmFjayB8fCBmZWVkYmFjay5jbG9zZWQpDQotCSAgICB7DQotCSAgICAgIGZlZWRiYWNrID0gb3Blbih1cmwsImZlZWRiYWNrX3dpbiIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD02MDAsaGVpZ2h0PTUwMCxyZXNpemFibGU9eWVzIik7DQotCSAgICB9DQotCSAgICBlbHNlDQotCSAgICB7DQotCSAgICAgIGZlZWRiYWNrLmZvY3VzKCk7DQotCSAgICB9DQotICAgIAl9DQotICAgIAkNCi19DQotDQotDQotZnVuY3Rpb24gc2VuZG1haWwodXJsKQ0KLXsNCi0JaWYgKCB1cmwuaW5kZXhPZigiP3N1YmplY3QiKSA9PSAtMSApDQotCXsNCi0JCXZhciBsaW5rPXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uOw0KLQkJdXJsID0gdXJsICsgJz9zdWJqZWN0PUZlZWRiYWNrOiAtICcrbGluazsNCi0JfQ0KLQlsb2NhdGlvbi5yZXBsYWNlKHVybCk7DQotfQ0KLQ0KLS8vY2FsY3VsYXRlcyByZWxhdGl2ZSBwYXRoDQotLy9wYXRoIG11c3QgYmUgYWxsIHJlbGF0aXZlIGZyb20gd2Vic2l0ZSBiYXNlIG9yIGNvbnRhaW4gZnVsbCB1cmxzDQotZnVuY3Rpb24gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHNvdXJjZVBhdGgsIHRhcmdldFBhdGgpDQotew0KLQlpZiAodGFyZ2V0UGF0aC5pbmRleE9mKCJodHRwOi8iKSAhPSAtMSkNCi0Jew0KLQkJcmV0dXJuIHRhcmdldFBhdGg7DQotCX0NCi0NCi0JLy9yZXBsYWNlIGFsbCAnXCcgd2l0aCAnLycNCi0Jc291cmNlUGF0aCA9IHNvdXJjZVBhdGgucmVwbGFjZSgvXFwvZywiJDEvJDIiKTsNCi0JdGFyZ2V0UGF0aCA9IHRhcmdldFBhdGgucmVwbGFjZSgvXFwvZywiLyIpOw0KLQ0KLQkvL2FsZXJ0KCJSZXBsYWNlKFNvdXJjZSk9PiIgKyBzb3VyY2VQYXRoKTsNCi0JLy9hbGVydCgiUmVwbGFjZSh0YXJnZXQpPT4iICsgdGFyZ2V0UGF0aCk7DQotDQotDQotCXNvdXJjZUFycmF5ID0gc291cmNlUGF0aC5zcGxpdCgiLyIpOw0KLQl0YXJnZXRBcnJheSA9IHRhcmdldFBhdGguc3BsaXQoIi8iKTsNCi0NCi0JdmFyIHRoZVJlbFBhdGggPSAiIjsNCi0NCi0JLy9sb29wIHVudGlsIHdlIGZpbmQgYSBkaWZmZXJlbmNlDQotCXZhciBpZHggPSAwOw0KLQlmb3IoaWR4ID0gMDsgaWR4IDwgc291cmNlQXJyYXkubGVuZ3RoOyBpZHgrKykNCi0Jew0KLQkJaWYgKGlkeCA+IHRhcmdldFBhdGgubGVuZ3RoKQ0KLQkJew0KLQkJCWJyZWFrOw0KLQkJfQ0KLQ0KLQkJaWYgKHNvdXJjZUFycmF5W2lkeF0gIT0gdGFyZ2V0QXJyYXlbaWR4XSkNCi0JCXsNCi0JCQlicmVhazsNCi0JCX0NCi0JfQ0KLQ0KLQkvL2FwcGVuZCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIC4vDQotCXZhciBtYXhJZHggPSBzb3VyY2VBcnJheS5sZW5ndGggLSAxOw0KLQlmb3IgKHZhciBpID0gaWR4OyBpIDwgbWF4SWR4OyBpKyspDQotCXsNCi0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoICsgIi4vIjsNCi0NCi0JCS8vYWxlcnQoIlJlbFBhdGg9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL2FwcGVuZCBhbnkgcmVtYWluaW5nIHRhcmdldCBwYXRoDQotCXdoaWxlKGlkeCA8IHRhcmdldEFycmF5Lmxlbmd0aCkNCi0Jew0KLQkJdGhlUmVsUGF0aCA9IHRoZVJlbFBhdGggKyB0YXJnZXRBcnJheVtpZHgrK10gKyAiLyI7DQotCQkvL2FsZXJ0KCJSZWxQYXRoKGZpbmFsKT0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vcmVtb3ZlIHRoZSBsYXN0IHBhdGggc2VwYXJhdG9yDQotCWlmICh0aGVSZWxQYXRoLmxlbmd0aCA+IDApDQotCXsNCi0JCS8vYWxlcnQoIlJlbFBhdGgoVHJpbTEpPT4iICsgdGhlUmVsUGF0aCk7DQotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aC5zdWJzdHJpbmcoMCwgKHRoZVJlbFBhdGgubGVuZ3RoIC0gMSkpOw0KLQkJLy9hbGVydCgiUmVsUGF0aChUcmltMSk9PiIgKyB0aGVSZWxQYXRoKTsNCi0JfQ0KLQ0KLQkvL2FsZXJ0KCJSZXR1cm4gUmVsYXRpdmUgUGF0aCA9PiAiICsgdGhlUmVsUGF0aCk7DQotDQotCXJldHVybiB0aGVSZWxQYXRoOw0KLX0NCi0NCi1mdW5jdGlvbiBnZXRUcmVlUGF0aCgpDQotew0KLQlyZXR1cm4gYnVpbGRUcmVlUGF0aExvY2F0aW9uKCk7DQotfQ0KLQ0KLS8vVGhpcyBtZXRob2Qgd2lsbCByZW1vdmUgdGhlIHdlYnNpdGUgYmFzZSBmcm9tIHRoZSB1cmwNCi1mdW5jdGlvbiBjYWxjdWxhdEN1cnJlbnRQYWdlKGN1cnJVUkwpIHsNCi0NCi0JdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7DQotCS8vcmVwbGFjZSBhbGwgJ1wnIHdpdGggJy8nDQotCXRoZUN1cnJlbnRMb2NhdGlvbiA9IHRoZUN1cnJlbnRMb2NhdGlvbi5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQljdXJyVVJMID0gY3VyclVSTC5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQ0KLQl2YXIgc291cmNlQXJyYXkgPSB0aGVDdXJyZW50TG9jYXRpb24uc3BsaXQoIi8iKTsNCi0JdmFyIGN1cnJBcnJheSA9IGN1cnJVUkwuc3BsaXQoIi8iKTsNCi0NCi0JdmFyIG51bVRvUmVtb3ZlID0gc291cmNlQXJyYXkubGVuZ3RoIC0gMjsNCi0JdmFyIGlkeCA9IDA7DQotCXZhciB0aGVSZXR1cm5QYXRoID0gIiI7DQotCWZvciAoaWR4ID0gbnVtVG9SZW1vdmU7IGlkeCA8IGN1cnJBcnJheS5sZW5ndGg7IGlkeCsrKSB7DQotCQlpZiAodGhlUmV0dXJuUGF0aCAhPSAiIikgew0KLQkJCXRoZVJldHVyblBhdGggPSB0aGVSZXR1cm5QYXRoICsgIi8iOw0KLQkJfQ0KLQkJdGhlUmV0dXJuUGF0aCA9IHRoZVJldHVyblBhdGggKyBjdXJyQXJyYXlbaWR4XTsNCi0JfQ0KLQ0KLQkvL2FsZXJ0KCJBcnJheVRlc3Q9PiIgKyBjdXJyVVJMICsgIiwiICsgdGhlUmV0dXJuUGF0aCk7DQotCXJldHVybiB0aGVSZXR1cm5QYXRoOw0KLX0NCi0NCi0vL2J1aWxkcyB0cmVlIHBhdGgNCi1mdW5jdGlvbiBidWlsZFRyZWVQYXRoTG9jYXRpb24oKQ0KLXsNCi0JdmFyIHRoZURlbGltaXRlciA9ICIjIyoiOw0KLQl2YXIgdGhpc1BhZ2UgPSAiYXBwbGV0L3J1cF90b3BuYXYuaHRtIjsNCi0JdmFyIHRoZUxvYyA9ICIiOw0KLQ0KLQ0KLQ0KLQlpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0Jew0KLQkJdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY7DQotCQl0aGlzUGFnZSA9IGNhbGN1bGF0Q3VycmVudFBhZ2UodGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCS8vYWxlcnQoIlBhdGhOYW1lOiIgKyB0aGlzUGFnZSk7DQotDQotCQkvL2FsZXJ0KCJUcnlpbmcgdG8gZmluZCB0aGUgcGF0aCBmb3IgPT4iICsgdGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCXZhciB0aGVQYXRoID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmdldFRyZWVQYXRoQXJyYXkodGhlQ3VycmVudExvY2F0aW9uKTsNCi0NCi0JCS8vYWxlcnQoIlRoZSBUcmVlIFBhdGg6ICIgKyB0aGVQYXRoKTsNCi0NCi0JCXRoZVBhdGhTdHJpbmcgPSB0aGVQYXRoICsgIiI7DQotICAgIAkJYXJyYXlGcm9tU3RyaW5nID0gdGhlUGF0aFN0cmluZy5zcGxpdCh0aGVEZWxpbWl0ZXIpOw0KLQ0KLQkJLy9idWlsZCB0aGUgcGF0aCBmcm9tIHRoZSBhcnJheQ0KLQkJLy9wYXJhbSAxID0gcGF0aCB0byBpY29uLCBwYXJhbSAyIC0gbGFiZWwsIHBhcmFtIDMgLSBwYXRoIHRvIGZpbGUNCi0JCXZhciBjb3VudGVyID0gMDsNCi0JCXZhciB0aGVMYWJlbDsNCi0JCXZhciB0aGVSZWxQYXRoOw0KLQkJaWYgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggPiAyKQ0KLQkJew0KLQkJICAgdGhlTG9jID0gIiI7DQotCQkgICBmb3IodmFyIGkgPSAwOyBpIDwgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggLSAxKSA7IGkrKykNCi0JCSAgIHsNCi0JCQkvL2l0J3MgdGhlIGljb24gcGF0aA0KLQkJCWlmIChjb3VudGVyIDwgMikNCi0JCQl7DQotCQkJCWlmIChjb3VudGVyID4gMCkNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsgIiAmZ3Q7ICI7DQotCQkJCX0NCi0NCi0JCQkJLy9hbGVydCgiQ2FsY3VsYXRpbmcgcGF0aCBmcm9tKDEpICIgKyB0aGlzUGFnZSArICIgPT4gIiArIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotDQotCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiXFwiKSA9PSAtMSAmJiBhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiLyIpID09IC0xKQ0KLQkJCQl7DQotCQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldICE9ICJudWxsIikNCi0JCQkJCXsNCi0JCQkJCQl0aGVSZWxQYXRoID0gImFwcGxldC9pbWFnZXMvIiArIGFycmF5RnJvbVN0cmluZ1tpXTsNCi0JCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCB0aGVSZWxQYXRoKTsNCi0JCQkJCX0NCi0JCQkJCS8vYWxlcnQoIk1vZGlmeWluZyBQYXRoID0+ICIgKyB0aGVSZWxQYXRoKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCX0NCi0NCi0JCQkJaWYgKHRoZVJlbFBhdGggIT0gIm51bGwiKQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJCSAiPGltZyBib3JkZXI9MCBzcmM9XCIiICsNCi0JCQkJCQkgdGhlUmVsUGF0aCAgKw0KLQkJCQkJCSAiXCI+IjsNCi0JCQkJfQ0KLQ0KLQkJCQkvL2FsZXJ0KCJ0aGUgY3VyciBwYXRoPT4iICsgdGhlTG9jKTsNCi0JCQkJY291bnRlciA9IDI7DQotCQkJfQ0KLQkJCS8vIGl0J3MgdGhlIGxhYmVsDQotCQkJZWxzZSBpZiAoY291bnRlciA9PSAyKQ0KLQkJCXsNCi0JCQkJdGhlTGFiZWwgPSBhcnJheUZyb21TdHJpbmdbaV07DQotCQkJCWNvdW50ZXIgPSAzOw0KLQkJCX0NCi0JCQllbHNlIGlmIChjb3VudGVyID09IDMpDQotCQkJew0KLQkJCQkvL2FsZXJ0KCJDYWxjdWxhdGluZyBwYXRoIGZyb20oMykgIiArIHRoaXNQYWdlICsgIiA9PiAiICsgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXSAhPSAibnVsbCIpDQotCQkJCXsNCi0JCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIGFycmF5RnJvbVN0cmluZ1tpXSk7DQotCQkJCQlpZiAodGhlUmVsUGF0aCAhPSAiIikgew0KLQkJCQkJCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkgCQkiPGEgY2xhc3M9XCJob3R0ZXh0XCIgdGFyZ2V0PVwib3J5X2RvY1wiIGhyZWY9XCIiICsNCi0JCQkJCQkJIHRoZVJlbFBhdGggKw0KLQkJCQkJIAkJIlwiPiIgKw0KLQkJCQkJIAkJdGhlTGFiZWwgKw0KLQkJCQkJIAkJIjxcL2E+XG4iOw0KLQkJCQkJIH0NCi0JCQkJCSBlbHNlIHsNCi0JCQkJCSAJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJCSI8YSBjbGFzcz1cImhvdHRleHRcIj4iICArDQotCQkJCQkgCQl0aGVMYWJlbCArDQotCQkJCQkgCQkiPFwvYT5cbiI7DQotCQkJCQkgfQ0KLQkJCQl9DQotCQkJCWVsc2UNCi0JCQkJew0KLQkJCQkJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJIjxhIGNsYXNzPVwiaG90dGV4dFwiPiIgICsNCi0JCQkJCSAJdGhlTGFiZWwgKw0KLQkJCQkJIAkiPFwvYT5cbiI7DQotCQkJCX0NCi0JCQkJLy9hbGVydCgidGhlIGN1cnIgcGF0aD0+IiArIHRoZUxvYyk7DQotCQkJCWNvdW50ZXIgPSAxOw0KLQkJCQl0aGVSZWxQYXRoID0gIm51bGwiOw0KLQkJCQl0aGVMYWJlbCA9ICJudWxsIjsNCi0JCQl9DQotCQkgICB9DQotDQotCQkvL2FsZXJ0KCJGaW5pc2hlZCBCdWlsZGluZyA9PiAiICsgdGhlTG9jKTsNCi0JCX0NCi0NCi0JfQ0KLQ0KLQkvL3RoZUxvYyA9ICJDdXJyZW50IExvY2F0aW9uJm5ic3A7JiMwNDU7Jm5ic3A7IiArIHRoZUxvYzsNCi0NCi0JLy9hbGVydCgidGhlIEZpbmFsIFN0cmluZz0+IiArIHRoZUxvYyk7DQotDQotCS8vZG9jdW1lbnQud3JpdGUodGhlTG9jKTsNCi0JcmV0dXJuIHRoZUxvYzsNCi0NCi19DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvZG9jcm9vdC9zcHNjcmVlbl9ydS5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMi9kb2Nyb290L3Nwc2NyZWVuX3J1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhOTFkNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMi9kb2Nyb290L3Nwc2NyZWVuX3J1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi0KLTwhLS0gUlBXIE1FVEEgREFUQSBTVEFSVCAtLQotIAotIAotLS0gUlBXIE1FVEEgREFUQSBFTkQgLS0+Ci0KLTxodG1sPgotCi08aGVhZD4KLTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0icm9wLmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ii8+Ci08dGl0bGU+0JfQsNGB0YLQsNCy0LrQsDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi0KLQotPHAgYWxpZ249ImNlbnRlciI+Jm5ic3A7PC9wPgotPGgyIGFsaWduPSJjZW50ZXIiPtCY0LTQtdGCINC30LDQs9GA0YPQt9C60LAg0LHRgNCw0YPQt9C10YDQsC4uLjxici8+PC9oMj4KLTxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KLTwhLS0gCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0iaW1hZ2VzL3NwbGFzaC5naWYiIGFsdD0i0JLQsNGBINC/0YDQuNCy0LXRgtGB0YLQstGD0LXRgiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIi8+PC9wPgotLS0+Ci08YnIvPgotPGJyLz4KLQotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyL2ZyYWdtZW50LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMi9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTFjNzBlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyL2ZyYWdtZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZyYWdtZW50TmFtZT1FUEYgQ29tcG9zZXIgUHVibGlzaGluZyAoTkwyKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZmVmMjEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVx1MDQxZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyM2NjZWYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQUDAwMDBFIC0gSVVQUDAwOTlFDQotIw0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1wdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZT1cdTA0MWZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Li4uDQotaW5pdGlhbGl6aW5nRGlyVGFza19uYW1lPVx1MDQxOFx1MDQzZFx1MDQzOFx1MDQ0Nlx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQzN1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0NDZcdTA0MzVcdTA0M2JcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzXHUwNDMwLi4uDQotY29weWluZ0ZpbGVzVGFza19uYW1lPVx1MDQxYVx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0M2VcdTA0MzIuLi4NCi1nZW5lcmF0aW5nQm9va21hcmtzVGFza19uYW1lPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzdcdTA0MzBcdTA0M2FcdTA0M2JcdTA0MzBcdTA0MzRcdTA0M2VcdTA0M2EuLi4NCi1nZW5lcmF0aW5nQm9va21hcmtUYXNrX25hbWU9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzN1x1MDQzMFx1MDQzYVx1MDQzYlx1MDQzMFx1MDQzNFx1MDQzYVx1MDQzOCAnJ3swfScnLi4uDQotZ2VuZXJhdGluZ0Jvb2ttYXJrSW5kZXhUYXNrX25hbWU9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQzNFx1MDQzNVx1MDQzYVx1MDQ0MVx1MDQzMCBcdTA0MzdcdTA0MzBcdTA0M2FcdTA0M2JcdTA0MzBcdTA0MzRcdTA0M2VcdTA0M2EuLi4NCi1wdWJsaXNoaW5nTGlua2VkRWxlbWVudFRhc2tfbmFtZT1cdTA0MWZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMjogezB9IFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzZSwgezF9IFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0Yw0KLXB1Ymxpc2hpbmdFbGVtZW50VGFza19uYW1lPVx1MDQxZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwOiB7MH06ezF9DQotZ2VuZXJhdGluZ0dsb3NzYXJ5VGFza19uYW1lPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzNcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NDFcdTA0MzBcdTA0NDBcdTA0MzhcdTA0NGYuLi4NCi1nZW5lcmF0aW5nU2VhcmNoSW5kZXhUYXNrX25hbWU9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzOFx1MDQzZFx1MDQzNFx1MDQzNVx1MDQzYVx1MDQ0MVx1MDQzMCBcdTA0M2ZcdTA0M2VcdTA0MzhcdTA0NDFcdTA0M2FcdTA0MzAuLi4NCi1idWlsZGluZ1Byb2Nlc3NDbG9zdXJlVGFza19uYW1lPVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDJcdTA0MzVcdTA0MzlcdTA0M2RcdTA0MzVcdTA0NDBcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwLi4uDQotYnVpbGRpbmdFbGVtZW50Q2xvc3VyZVRhc2tfbmFtZT1cdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQyXHUwNDM1XHUwNDM5XHUwNDNkXHUwNDM1XHUwNDQwXHUwNDMwIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMCBcdTA0MzRcdTA0M2JcdTA0NGYgJyd7MH0nJy4uLg0KLWxvYWRMaWJyYXJ5VGFza19uYW1lPVx1MDQxN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzYVx1MDQzMCBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4Li4uDQotDQotIyBFcnJvciBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0DQotcHVibGlzaEVsZW1lbnRFcnJvcl9tc2c9SVVQUDAwMDBFOiBcdTA0MWVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M2FcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDM4IFx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzA6IHswfQ0KLXNlcnZlckVycm9yX21zZz1JVVBQMDAwMUU6IFx1MDQyMSBcdTA0NDFcdTA0MzVcdTA0NDBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzAgXHUwNDNkXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0M1x1MDQ0N1x1MDQzNVx1MDQzZFx1MDQ0YiBcdTA0MzRcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUuDQotaW52YWxpZEh0dHBSZXNwb25zZUVycm9yX21zZz1JVVBQMDAwMkU6IFx1MDQxZFx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzY1x1MDQ0Ylx1MDQzOSBcdTA0M2VcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDIgXHUwNDNlXHUwNDQyIGh0dHA6Ly97MH06ezF9OnsyfQ0KLQ0KLSMgV2FybmluZyBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0DQotaW52YWxpZEVsZW1lbnRXYXJuaW5nX21zZz1JVVBQMDAwM1c6IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2RcdTA0MzUgXHUwNDMxXHUwNDRiXHUwNDNiIFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZCwgXHUwNDNmXHUwNDNlXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDQzIFx1MDQzZVx1MDQzZCBcdTA0M2RcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2MgXHUwNDMyIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOC4NCi1pbnZhbGlkTWV0aG9kRWxlbWVudFdhcm5pbmdfbXNnPUlVUFAwMDA0VzogXHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzZFx1MDQzNSBcdTA0MzFcdTA0NGJcdTA0M2IgXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDM1IFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZCwgXHUwNDNmXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDNjXHUwNDQzIFx1MDQ0N1x1MDQ0Mlx1MDQzZSBcdTA0M2VcdTA0M2QgXHUwNDNkXHUwNDM1IFx1MDQ0Zlx1MDQzMlx1MDQzYlx1MDQ0Zlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwOiB7MH0NCi1jb3B5RmlsZVdhcm5pbmdfbXNnPUlVUFAwMDA1VzogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0NDFcdTA0M2FcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiIFx1MDQzOFx1MDQzNyAnJ3swfScnIFx1MDQzMiAnJ3sxfScnLg0KLW1pc3NpbmdJY29uRmlsZVdhcm5pbmdfbXNnPUlVUFAwMDA2VzogXHUwNDI0XHUwNDMwXHUwNDM5XHUwNDNiIFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzYVx1MDQzMCBcdTA0NDNcdTA0MzdcdTA0M2JcdTA0MzAgJyd7MH0nJyBcdTA0M2RcdTA0MzUgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDM1XHUwNDQyLg0KLW1pc3NpbmdJY29uTmFtZVdhcm5pbmdfbXNnPUlVUFAwMDA3VzogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0M2VcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDM4XHUwNDNjXHUwNDRmIFx1MDQzN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzYVx1MDQzMCBcdTA0NDNcdTA0MzdcdTA0M2JcdTA0MzAuDQotZXh0ZXJuYWxVcmxfbXNnPVx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzMCBcdTA0M2RcdTA0MzAgXHUwNDMyXHUwNDNkXHUwNDM1XHUwNDQ4XHUwNDNkXHUwNDM4XHUwNDM5IFVSTDogezB9DQotZGlzY2FyZWRDYXRlZ29yeVdhcm5pbmdfbXNnPVx1MDQxZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQ0ZiBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NGYgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyIFx1MDQzZFx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzAuDQotDQotIyBFcnJvciBEZXRhaWxzDQotY3JlYXRlU2VhcmNoSW5kZXhFcnJvcl9tc2c9SVVQUDAwMDhFOiBcdTA0MjRcdTA0MzBcdTA0MzlcdTA0M2IgXHUwNDQxIFx1MDQzOFx1MDQzZFx1MDQzNFx1MDQzNVx1MDQzYVx1MDQ0MVx1MDQzZVx1MDQzYyBcdTA0M2ZcdTA0M2VcdTA0MzhcdTA0NDFcdTA0M2FcdTA0MzAgXHUwNDNkXHUwNDM1IFx1MDQzMVx1MDQ0Ylx1MDQzYiBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2QuDQotDQotIyBQcm9jZXNzIFRyZWUgTm9kZXMNCi1yZWZlcmVuY2VXb3JrZmxvd3NOb2RlX3RleHQ9XHUwNDIxXHUwNDMyXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQzYVx1MDQzOCBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzkNCi10YXNrTm9kZV90ZXh0PVx1MDQxN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOA0KLXByaW1hcmlseVBlcmZvcm1zTm9kZV90ZXh0PVx1MDQxMiBcdTA0M2VcdTA0NDFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2RcdTA0M2VcdTA0M2MgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDRmXHUwNDM1XHUwNDQyDQotYWRkaXRpb25hbGx5UGVyZm9ybXNOb2RlX3RleHQ9XHUwNDE0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlIFx1MDQzMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQ0Zlx1MDQzNVx1MDQ0Mg0KLXBlcmZvcm1pbmdSb2xlc05vZGVfdGV4dD1cdTA0MjBcdTA0M2VcdTA0M2JcdTA0MzggXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDM1XHUwNDM5DQotaW5wdXRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9XHUwNDEyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGINCi1vdXRwdXRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGINCi1yZXNwb25zaWJsZUZvck5vZGVfdGV4dD1cdTA0MWVcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDM3XHUwNDMwDQotbW9kaWZpZXNOb2RlX3RleHQ9XHUwNDE4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDRmXHUwNDM1XHUwNDQyDQotcmVzcG9uc2libGVSb2xlTm9kZV90ZXh0PVx1MDQxZVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGMNCi1jb250YWluaW5nV29ya1Byb2R1Y3ROb2RlX3RleHQ9XHUwNDIxXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDMwXHUwNDQ5XHUwNDM4XHUwNDM5IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDINCi1jb250YWluZWRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9XHUwNDIxXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDMwXHUwNDQ5XHUwNDM4XHUwNDM1XHUwNDQxXHUwNDRmIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NGINCi1ndWlkYW5jZU5vZGVfdGV4dD1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYNCi1pbnB1dFRvTm9kZV90ZXh0PVx1MDQxMlx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzRcdTA0M2JcdTA0NGYNCi1vdXRwdXRGcm9tTm9kZV90ZXh0PVx1MDQxMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0MzcNCi0NCi0jIEhUTUwgVGl0bGUgZm9yIEluZGV4IFBhZ2UNCi1pbmRleExhYmVsX3RleHQ9XHUwNDE4XHUwNDNkXHUwNDM0XHUwNDM1XHUwNDNhXHUwNDQxDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIveHNsL3Jlc291cmNlc19ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDIveHNsL3Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTc4ODk2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyL3hzbC9yZXNvdXJjZXNfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLSMgVGhlIFVJIHRleHQgaW4gdGhlIFhTTCBzdHlsZXNoZWV0cy4NCi0NCi1zZWxlY3RlZENvbmZpZ3VyYXRpb25UZXh0PVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDNlXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDMwIFx1MDQzMiBcdTA0NDFcdTA0M2JcdTA0MzVcdTA0MzRcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzVcdTA0M2MgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzXHUwNDM1DQotZGV0YWlsSW5mb1RleHQ9XHUwNDFmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDNlXHUwNDMxXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQzYVx1MDQzZVx1MDQzYiBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDNlXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNkIFx1MDQzMiBcdTA0NDFcdTA0M2JcdTA0MzVcdTA0MzRcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0NDUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDMwXHUwNDQ1IFx1MDQzMiBcdTA0M2ZcdTA0MzBcdTA0M2ZcdTA0M2FcdTA0MzUgbG9ncw0KLXNob3dFcnJvclRleHQ9XHUwNDMyXHUwNDQxXHUwNDM1IFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzOCwgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNkXHUwNDM4XHUwNDNhXHUwNDQ4XHUwNDM4XHUwNDM1IFx1MDQzMiBcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzUgXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Lg0KLWxvZ3NXYXJuaW5nVGV4dD1cdTA0NDBcdTA0MzVcdTA0MzNcdTA0MzhcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0NDIgXHUwNDMyXHUwNDQxXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNlx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2VcdTA0MzEgXHUwNDNlXHUwNDQyXHUwNDQxXHUwNDQzXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDQ1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzMFx1MDQ0NSwgXHUwNDNkXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDMwXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDQ1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzMFx1MDQ0NSBcdTA0MzggXHUwNDNkXHUwNDM1XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDQ1IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Zlx1MDQ0NSwgXHUwNDNkXHUwNDM1IFx1MDQ0MVx1MDQzZVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzMFx1MDQ0OVx1MDQzOFx1MDQ0NSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIuDQotcGFnZXNOb3RJbnN0YWxsZWRUZXh0PVx1MDQxMiBcdTA0M2ZcdTA0MzBcdTA0M2ZcdTA0M2FcdTA0MzUgcGFnZXNfbm90X2luc3RhbGxlZCBcdTA0M2RcdTA0MzBcdTA0NDVcdTA0M2VcdTA0MzRcdTA0NGZcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDMyXHUwNDQxXHUwNDM1IFx1MDQzZFx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQzMFx1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzggXHUwNDMyIFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguDQotaW52YWxpZEV4dGVybmFsVGV4dD1cdTA0MTIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQzNlx1MDQzNVx1MDQzZFx1MDQ0YiBcdTA0M2RcdTA0MzVcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0MzBcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDMyXHUwNDNkXHUwNDM1XHUwNDQ4XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOA0KLW93bmVyRWxlbWVudFRleHQ9XHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzMlx1MDQzYlx1MDQzMFx1MDQzNFx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0Nlx1MDQzMA0KLW5vbkV4aXN0aW5nVGV4dD1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDMyXHUwNDNiXHUwNDMwXHUwNDM0XHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQ2XHUwNDM1XHUwNDMyIFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzMFx1MDQ0ZVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2RcdTA0MzAgXHUwNDNkXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0Yi4gXHUwNDEyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlLCBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDMxXHUwNDRiXHUwNDNiXHUwNDM4IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzNVx1MDQzZFx1MDQ0YiBcdTA0MzhcdTA0MzcgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDM4LCBcdTA0M2FcdTA0M2VcdTA0MzNcdTA0MzRcdTA0MzAgXHUwNDQzXHUwNDM2XHUwNDM1IFx1MDQzMVx1MDQ0Ylx1MDQzYlx1MDQzOCBcdTA0NDFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M2RcdTA0NGIgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4IFx1MDQzZFx1MDQzMCBcdTA0M2RcdTA0MzhcdTA0NDUuIFx1MDQxZFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDMyXHUwNDNiXHUwNDMwXHUwNDM0XHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQ2XHUwNDM1XHUwNDMyIFx1MDQzOCBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0NGNcdTA0NDJcdTA0MzUgXHUwNDNkXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDMwXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOC4NCi1taXNzaW5nUmVmZXJlbmNlc1RpdGxlVGV4dD1cdTA0MWRcdTA0MzVcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0MzBcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4DQotbWlzc2luZ1JlZmVyZW5jZXNUZXh0PVx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0MzJcdTA0M2JcdTA0MzBcdTA0MzRcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDZcdTA0MzVcdTA0MzIgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDMwXHUwNDRlXHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzZFx1MDQzMCBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIsIFx1MDQzZVx1MDQ0Mlx1MDQ0MVx1MDQ0M1x1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0MzIgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOC4gXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDRjXHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzZVx1MDQ0Mlx1MDQ0MyBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDM4IFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQ0Y1x1MDQ0Mlx1MDQzNSBcdTA0M2RcdTA0MzVcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0MzBcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4LiANCi1taXNzaW5nUmVzb3VyY2VGaWxlc1RpdGxlVGV4dD1cdTA0MWVcdTA0NDJcdTA0NDFcdTA0NDNcdTA0NDJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNiXHUwNDRiIFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzZVx1MDQzMg0KLW1pc3NpbmdSZXNvdXJjZUZpbGVzVGV4dD1cdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDMyXHUwNDNiXHUwNDMwXHUwNDM0XHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQ2XHUwNDM1XHUwNDMyIFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzMFx1MDQ0ZVx1MDQ0Mlx1MDQ0MVx1MDQ0ZiBcdTA0M2RcdTA0MzAgXHUwNDNlXHUwNDQyXHUwNDQxXHUwNDQzXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQ0YiBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M2VcdTA0MzIuIFx1MDQyZFx1MDQ0Mlx1MDQzOCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIgXHUwNDQwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNlXHUwNDMyIFx1MDQ0M1x1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzZFx1MDQ0YiBcdTA0MzIgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDMwXHUwNDQ1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzZVx1MDQzMiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQzMlx1MDQzYlx1MDQzZVx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQ0NSBcdTA0MzIgXHUwNDNkXHUwNDM4XHUwNDQ1IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQzMFx1MDQ0NS4NCi1taXNzaW5nUmVzb3VyY2VUZXh0PVx1MDQxZVx1MDQ0Mlx1MDQ0MVx1MDQ0M1x1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzOSBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDENCi1vd25lclJlc291cmNlVGV4dD1cdTA0MjBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDEgXHUwNDMyXHUwNDNiXHUwNDMwXHUwNDM0XHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQ2XHUwNDMwDQotbWlzc2luZ0VsZW1lbnRUZXh0PVx1MDQxZVx1MDQ0Mlx1MDQ0MVx1MDQ0M1x1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzOSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDINCi1pbnZhbGlkRWxlbWVudFRleHQ9XHUwNDFkXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDRiXHUwNDM5IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mg0KLWludmFsaWRFbGVtZW50TGlua3NUZXh0PVx1MDQyMVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOCBcdTA0M2RcdTA0MzAgXHUwNDNkXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDRiXHUwNDM1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0Yg0KLXBsZWFzZUNoZWNrVGV4dD1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NGNcdTA0NDJcdTA0MzUgXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDNlXHUwNDQyXHUwNDQzIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0MzggXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDRjXHUwNDQyXHUwNDM1IFx1MDQzZFx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQzMFx1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzguDQotcGxlYXNlRmluZFRleHQ9XHUwNDFkXHUwNDMwXHUwNDM5XHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0MzJcdTA0M2JcdTA0MzBcdTA0MzRcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDZcdTA0MzVcdTA0MzIgXHUwNDM4IFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQ0Y1x1MDQ0Mlx1MDQzNSBcdTA0M2RcdTA0MzVcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0MzBcdTA0NGVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4Lg0KLWdsb3NzYXJ5VGV4dD1cdTA0MTNcdTA0M2JcdTA0M2VcdTA0NDFcdTA0NDFcdTA0MzBcdTA0NDBcdTA0MzhcdTA0MzkNCi1pbmRleFRleHQ9XHUwNDE4XHUwNDNkXHUwNDM0XHUwNDM1XHUwNDNhXHUwNDQxDQotZmVlZGJhY2tUZXh0PVx1MDQxZVx1MDQ0Mlx1MDQzN1x1MDQ0Ylx1MDQzMlx1MDQ0Yg0KLWFib3V0VGV4dD1cdTA0MWUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDM1DQotc2VhcmNoVGV4dD1cdTA0MWZcdTA0M2VcdTA0MzhcdTA0NDFcdTA0M2ENCi1wcmludFRleHQ9XHUwNDFmXHUwNDM1XHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDRjDQotc3VtbWFyeVRleHQ9XHUwNDIxXHUwNDMyXHUwNDNlXHUwNDM0XHUwNDNhXHUwNDMwDQotcHVibGlzaGluZ1JlcG9ydFRleHQ9XHUwNDFlXHUwNDQyXHUwNDQ3XHUwNDM1XHUwNDQyIFx1MDQzZSBcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0Mzg6DQotd2hlcmVBbUlUZXh0PVx1MDQyMlx1MDQzNVx1MDQzYVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQzNSBcdTA0M2NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0M2UNCi10cmVlU2V0c1RleHQ9XHUwNDFkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDRiIFx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzMlx1MDQ0Y1x1MDQzNVx1MDQzMg0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YWVhYWUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDBhMmJhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwyYS5qYXIKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogZnJhZ21lbnQKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Y2VhMzAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXNvdXJjZS5ubDJhLmphciA9IHNyYy8NCi1vdXRwdXQubmwyYS5qYXIgPSBiaW4vDQotYmluLmluY2x1ZGVzID0gbmwyYS5qYXIsXA0KLSAgICAgICAgICAgICAgIHhzbC8sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBkb2Nyb290LyxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL2RvY3Jvb3QvYWJvdXRfZGEuaHRtIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL2RvY3Jvb3QvYWJvdXRfZGEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODAyNGNjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYS9kb2Nyb290L2Fib3V0X2RhLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi0NCi08aHRtbD4NCi08IS0tIA0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICAgIENvbnRyaWJ1dG9yczoNCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLS0tPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ii8+DQotCTx0aXRsZT5PbTwvdGl0bGU+DQotPHNjcmlwdCBzcmM9InNjcmlwdHMvY29tbW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4NCi0JPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCi0JCWJvZHkgew0KLQkJCW1hcmdpbjogOHB4Ow0KLQkJfQ0KLQk8L3N0eWxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keT4NCi0NCi0JPGltZyBzcmM9Ii4vaW1hZ2VzL2ljb25fYWJvdXQuZ2lmIiB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGFsdD0iT20taWtvbiIgYm9yZGVyPSIwIi8+PGJyIC8+PGJyIC8+DQotPHNwYW4gY2xhc3M9InBvcCI+T3BlblVQL0Jhc2ljPGJyIC8+DQotVmVyc2lvbiAxLjA8YnIgLz4NCi08YnIgLz4NCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi48YnIgLz4NCi1BbGwgUmlnaHRzIFJlc2VydmVkLjwvc3Bhbj48YnIgLz48YnIgLz4NCi0JPHRhYmxlIHN1bW1hcnk9IiIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPg0KLQkgIDx0cj4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjQiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgPC90cj4NCi0JICA8dHI+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiBjb2xzcGFuPSIyIiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxhIGNsYXNzPSJidXR0b24iIGhyZWY9ImphdmFzY3JpcHQ6c2VsZi5jbG9zZSgpOyI+PHNwYW4gY2xhc3M9ImJ1dHRvbnR4dCI+Jm5ic3A7THVrJm5ic3A7PC9zcGFuPjwvYT48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyIgIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgIDwvdHI+DQotCSAgPHRyPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQkgIDx0cj4NCi0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+DQotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPg0KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4NCi0JICA8L3RyPg0KLQk8L3RhYmxlPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3c19kYS5qcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYS9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3NfZGEuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NjU2Y2UuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3c19kYS5qcworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBqYXZhc2NyaXB0IGZvciB0aGUgYm9va21hcmtzIGZyYW1lICggdGhlIG9yeV90b2NfZnJhbWUgZnJhbWUpDQotLy8gdGhpcyBmcmFtZSBjb250YWlucyBhIGNoaWxkIGlmcmFtZSAob3J5X3RvYykNCi0NCi0vLyBtZXNzYWdlcyB0byBiZSBleHRlcm5pemVkDQotLy8gaGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLXZhciBib29rbWFya3ZpZXdzX2pzX01FU1NBR0UxID0gIlNpZGVuIGZpbmRlcyBpa2tlIGkgb3ZlcnNpZ3RlbiBtZWQgbmF2aWdhdGlvbnN0csOmc3RydWt0dXJlbi4iOw0KLQ0KLWZ1bmN0aW9uIGRpc3BsYXlUcmVlKHRhYikNCi17DQotCXVybCA9IHRhYi5nZXRBdHRyaWJ1dGUoJ3VybCcpOw0KLQ0KLQlpZiAoIHNlbGVjdGVkVGFiICE9IG51bGwgKQ0KLQl7DQotCQlzZWxlY3RlZFRhYi5jbGFzc05hbWUgPSAidGFiIg0KLQl9DQotCXRhYi5jbGFzc05hbWUgPSAic2VsZWN0ZWRUYWIiDQotCXNlbGVjdGVkVGFiID0gdGFiOw0KLQ0KLQlsb2FkSWZyYW1lKCJvcnlfdG9jIiwgdXJsKTsNCi19DQotDQotZnVuY3Rpb24gbG9hZElmcmFtZShpZnJhbWVOYW1lLCB1cmwpDQotew0KLQlpZiAoIHdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0gKQ0KLQl7DQotCQl3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdLnRvY19sb2FkZWQgPSBmYWxzZTsNCi0JCXdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0ubG9jYXRpb24gPSB1cmw7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQllbHNlIHJldHVybiBmYWxzZTsNCi19DQotDQotZnVuY3Rpb24gc2hvd1BhZ2UoKQ0KLXsNCi0NCi0JcGFyZW50LmZyYW1lc1sib3J5X2RvYyJdLmxvY2F0aW9uLmhyZWYgPSB1bmVzY2FwZSh0b3BpY1RvRGlzcGxheSk7DQotfQ0KLQ0KLQ0KLS8qKg0KLSAqIGZpbmQgYSB0b3BpYyBpbiB0aGUgdHJlZTogdGhlIHRvcGljIGlzIHNldCBpbiB0b3BpY1RvRGlzcGxheQ0KLSAqIHJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzDQotICovDQotZnVuY3Rpb24gZmluZFRvY1RvcGljKCkNCi17DQotCXZhciB0b2Nfd2luZG93ID0gd2luZG93LmZyYW1lc1sib3J5X3RvYyJdOw0KLQ0KLQkvL2FsZXJ0KHRvY193aW5kb3cudG9jX2xvYWRlZCk7DQotCS8vIGNoZWNrIGZvciBmYWxzZSBpcyBub3Qgc2FmZSBzaW5jZSB0aGUgdmFsdWUgbWlnaHQgYmUgdW5kZWZpbmVkIGlmIHRoZSBmcmFtZSBpcyBub3QgbG9hZGVkIHlldA0KLQkvL2lmICh0b2Nfd2luZG93LnRvY19sb2FkZWQgPT0gZmFsc2UgKQ0KLQlpZiAoIHRvY193aW5kb3cudG9jX2xvYWRlZCAhPSB0cnVlICkNCi0Jew0KLQkJLy9pZiAoIHRvY193aW5kb3cudG9jX2xvYWRlZCA9PSB1bmRlZmluZWQgKQ0KLQkJLy97DQotCQkvLwlhbGVydCgiZ290IGl0ISIpOw0KLQkJLy99DQotCQl3aW5kb3cuc2V0VGltZW91dCgiZmluZFRvY1RvcGljKCkiLCAyMDApOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJaWYgKCB0b3BpY1RvRGlzcGxheSA9PSBudWxsICkNCi0JCXsNCi0JCQl0b3BpY1RvRGlzcGxheSA9IHRvY193aW5kb3cuZ2V0Rmlyc3RUb3BpY1VybCgpOw0KLQkJfQ0KLQkNCi0JCXZhciB0b3BpYyA9IHRvcGljVG9EaXNwbGF5Ow0KLQ0KLQkJLy8gZmluZCB0aGUgdG9waWMgaW4gdGhlIGN1cnJlbnQgdmlldywgaWYgbm90LCBsb29rIGZvciB0aGUgbmV4dCB2aWV3DQotCQlpZiAoIHRvY193aW5kb3cuc2VsZWN0VG9waWModG9waWMpID09IGZhbHNlICkNCi0JCXsNCi0JCQlpZiAoIGxvYWRpbmdUYWJJbmRleCA8IHZpZXdUYWJzLmxlbmd0aCAtMSApDQotCQkJew0KLQkJCQlkaXNwbGF5VHJlZSh2aWV3VGFic1tsb2FkaW5nVGFiSW5kZXgrK10pOw0KLQkJCQlmaW5kVG9jVG9waWMoKTsNCi0JCQl9DQotCQkJZWxzZQ0KLQkJCXsNCi0JCQkJLy8gZW5kIGZpbmRpbmcgYW5kIGdvdCBub3RoaW5nDQotCQkJCS8vIGRpc3BsYXkgdGhlIGRlZmF1bHQNCi0JCQkJYWxlcnQoYm9va21hcmt2aWV3c19qc19NRVNTQUdFMSk7DQotCQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCQkJCXNob3dQYWdlKCk7DQotCQkJfQ0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7DQotCQkJLy8gZmluZCBzdWNjZXNzZnVsLCBkaXNwbGF5IHRoZSB0b3BpYyBwYWdlDQotCQkJc2hvd1BhZ2UoKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0NCi0NCi0vLyBmaW5kIHRoZSB0b3BpYyBpbiB0aGUgY3VycmVudCB0YWINCi1mdW5jdGlvbiB3aGVyZUFtSSgpDQotew0KLQl2YXIgdXJsID0gcGFyZW50LmZyYW1lc1sib3J5X2RvYyJdLmRvY3VtZW50LlVSTDsNCi0JDQotCWlmICggdXJsICE9IG51bGwgKQ0KLQl7DQotCQl0b3BpY1RvRGlzcGxheSA9IHVybDsNCi0JCWZpbmRUb2NUb3BpYygpOw0KLQl9DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHRvZ1ZpZXdzKCkNCi17DQotCS8vIGlmIGN1cnJlbnRseSB2aXNpYmxlLCBoaWRlIGFsbCBleGNlcHQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZA0KLQlpc1ZpZXdzVmlzaWJsZSA9ICghaXNWaWV3c1Zpc2libGUpOw0KLQkNCi0JZm9yICggdmFyIGkgPSAwOyAgaSA8IHZpZXdUYWJzLmxlbmd0aDsgaSsrKQ0KLQl7DQotCQl2YXIgc2hvdyA9IGlzVmlld3NWaXNpYmxlIHx8ICh2aWV3VGFic1tpXSA9PSBzZWxlY3RlZFRhYik7DQotCQlpZiAoIHNob3cgKQ0KLQkJewkJDQotCQkJLy92aWV3VGFic1tpXS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOw0KLQkJCXZpZXdUYWJzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQkvL3ZpZXdUYWJzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsNCi0JCQl2aWV3VGFic1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KLQkJfQ0KLQl9DQotCQkNCi0JCQ0KLQ0KLX0NCi0NCi0NCi0vLyBkaXNwbGF5IHRoZSBkZWZhdWx0IHBhZ2UgYW5kIG5hdmlnYXRlIHRvIHRoZSBub2RlDQotLy8gaWYgbm8gZGVmYXVsdCBwYWdlIGlzIHNldCwgZGlzcGxheSB0aGUgZmlyc3Qgbm9kZSBvZiB0aGUgZmlyc3Qgdmlldw0KLWZ1bmN0aW9uIGluaXQoKQ0KLXsNCi0JbG9hZGluZ1RhYkluZGV4ID0gMDsNCi0JdmFyIHRhYnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3BhbiIpOw0KLQl2YXIgdGFiY291bnQgPSAwOw0KLQlmb3IgKHZhciBpPTA7IGk8dGFicy5sZW5ndGg7IGkrKykNCi0Jew0KLQkJaWYgKCB0YWJzW2ldLmdldEF0dHJpYnV0ZSgndXJsJykgIT0gbnVsbCApDQotCQl7CQkJDQotCQkJdmFyIGlzRGVmYXVsdFZpZXcgPSB0YWJzW2ldLmdldEF0dHJpYnV0ZSgnaXNEZWZhdWx0VmlldycpOw0KLQkJCWlmICggaXNEZWZhdWx0VmlldyA9PSAidHJ1ZSIgKQ0KLQkJCXsNCi0JCQkJbG9hZGluZ1RhYkluZGV4ID0gdGFiY291bnQ7DQotCQkJfQ0KLQkJCQ0KLQkJCXZpZXdUYWJzW3RhYmNvdW50KytdID0gdGFic1tpXTsNCi0JCX0NCi0JfQ0KLQ0KLQl0b3BpY1RvRGlzcGxheSA9IHBhcmVudC5nZXRDb29raWUoInJ1cF9vcnlfZG9jIik7DQotCWRpc3BsYXlUcmVlKHZpZXdUYWJzW2xvYWRpbmdUYWJJbmRleF0pOw0KLQlmaW5kVG9jVG9waWMoKTsNCi19DQotDQotDQotdmFyIHNlbGVjdGVkVGFiID0gbnVsbDsNCi12YXIgdmlld1RhYnMgPSBuZXcgQXJyYXkoKTs7DQotdmFyIGxvYWRpbmdUYWJJbmRleCA9IDA7DQotdmFyIHRvcGljVG9EaXNwbGF5ID0gbnVsbDsNCi12YXIgaXNWaWV3c1Zpc2libGUgPSB0cnVlOw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYS9kb2Nyb290L3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXhfZGEuaHRtIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF9kYS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NGUzMzcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleF9kYS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy9EVEQgSFRNTCA0LjAxLy9FTiINCi0gICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPg0KLTxIVE1MPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4NCi08bWV0YSBuYW1lPSJtZXRhX3RhZ2dlZCIgY29udGVudD0idHJ1ZSI+DQotPHRpdGxlPk9yZGxpc3RlIC0gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yazwvdGl0bGU+DQotPC9oZWFkPg0KLTxmcmFtZXNldCByb3dzPSIyNSwqIj4NCi08ZnJhbWUgbmFtZT0iZ2xvc3NhcnlfbmF2IiBzcmM9Im5hdmlnLmh0bSIgc2Nyb2xsaW5nPSJubyIgbWFyZ2luaGVpZ2h0PSIyIiBtYXJnaW53aWR0aD0iMiIgdGl0bGU9Ik5hdmlnYXRpb25zb21yw6VkZSI+DQotPGZyYW1lIG5hbWU9Imdsb3NzYXJ5X2RvYyIgc3JjPSIuLi9nbG9zc2FyeS5odG0iIG1hcmdpbmhlaWdodD0iMCIgbWFyZ2lud2lkdGg9IjIiIHNjcm9sbGluZz0iYXV0byIgdGl0bGU9IkluZGhvbGRzb21yw6VkZSI+DQotPC9mcmFtZXNldD4NCi08L0hUTUw+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXZfZGEuanMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl9kYS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4YTYxMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdl9kYS5qcworKysgL2Rldi9udWxsCkBAIC0xLDc4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLS8vIA0KLS8vIENvbnRyaWJ1dG9yczoNCi0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0vLyBtZXNzYWdlcyB0byBiZSBleHRlcm5pemVkDQotLy8gaGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cw0KLQ0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTEgPSAiRnVua3Rpb25lbiBUcmVlQnJvd3NlIGVyIGlra2UgaW5kbMOmc3QgZW5kbnUuXG5WZW50LiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFMiA9ICJEZXIgZXIgaW5nZW4gJ3swfSctc2lkZSBmb3IgZGVubmUgc2lkZS5cblByw7h2IGVuIGFmIGRlIGFuZHJlIG5hdmlnYXRpb25za25hcHBlci4iOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTMgPSAiRGVyIGVyIGluZ2VuIHswfS1zaWRlLiI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3ByZXYgPSAiZm9ycmlnZSI7DQotdmFyIHRvcG5hdl9qc19NRVNTQUdFX25leHQgPSAibsOmc3RlIjsNCi12YXIgdG9wbmF2X2pzX01FU1NBR0VfdXAgPSAib3AiOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTQgPSAiRGVuIGFrdHVlbGxlIGZpbCBmaW5kZXMgaWtrZSBpIHRyw6ZzdHJ1a3R1cmJyb3dzZXJlbi4iOw0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTUgPSAiRGV0IHB1YmxpY2VyZWRlIHdlYnN0ZWQgZXIgYWxsZXJlZGUgdmlzdCBtZWQgcmFtbWVyIjsNCi0NCi1mdW5jdGlvbiBmb3JtYXRTdHJpbmcobWVzc2FnZSwgcmVwbGFjZTApDQotew0KLSAgIAlyZXR1cm4gbWVzc2FnZS5yZXBsYWNlKC9cezBcfS8sIHJlcGxhY2UwKTsNCi19IA0KLQ0KLS8vIHRoaXMgc2NyaXB0IGlzIGZvciB0aGUgdG9wbmF2Lmh0bWwNCi0vLyB0aGlzIGlzIE5PVCBmb3IgZ2VuZXJhbCB1c2UNCi1NU0ZQaG92ZXIgPQ0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwNCi0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmDQotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOw0KLQ0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQ0KLSAgew0KLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7DQotICAgICBhLnNyYz1pbWc7DQotICAgICByZXR1cm4gYTsNCi0gIH0NCi0gIA0KLXZhciB0b3VyID0gMDsNCi0NCi1mdW5jdGlvbiBvcGVuRmlyc3RUb3VyICgpDQotLy8gb3BlbiB0aGUgZ3VpZGVkIHRvdXIgL2hhYWthbiA5OTAzMjQNCi17DQotaWYoIXRvdXIgfHwgdG91cj09bnVsbCB8fCB0b3VyLmNsb3NlZCkNCi0gICAgew0KLSAgICAgIHRvdXIgPSBvcGVuKCIuL3RvdXIvdG91ci5odG0iLCJ0b3VyX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9MzUwLGhlaWdodD03MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICB0b3VyLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlblRvdXIgKCkNCi0vLyBvcGVuIHRoZSBndWlkZWQgdG91ciAvaGFha2FuIDk5MDMyNA0KLXsNCi1pZighdG91ciB8fCB0b3VyPT1udWxsIHx8IHRvdXIuY2xvc2VkKQ0KLSAgICB7DQotICAgICAgdG91ciA9IG9wZW4oIi4vdG91ci90b3VyLmh0bSIsInRvdXJfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zNTAsaGVpZ2h0PTcwMCxyZXNpemFibGU9eWVzIik7DQotICAgICAgdG91ci5mb2N1cygpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHRvdXIuZm9jdXMoKTsNCi0gICAgfQ0KLX0NCi0NCi0vL0FkZGl0aW9uIGJ5IENoaW5oIFZvIDAzLzI4LzAwDQotIGZ1bmN0aW9uIGRpc3BsYXlHZXR0aW5nU3RhcnRlZCgpDQotIHsNCi0gCXZhciBwYWdlUGF0dGVybiA9IC9vdnVfcHJvYy87DQotIAl2YXIgbWFpblBhZ2UgPSB3aW5kb3cucGFyZW50Lm9yeV9kb2MubG9jYXRpb247DQotDQotIAlpZiAoIHBhZ2VQYXR0ZXJuLnRlc3QoIG1haW5QYWdlICkgKSB7DQotICAgIAlpZiAoZ2V0Q29va2llKCJSVVAiKSAhPSAiY2hlY2tlZCIpIHsgb3BlbkZpcnN0VG91cigpOyB9DQotCX0NCi0JZWxzZSB7DQotCQlzZXRUaW1lb3V0KCAiZGlzcGxheUdldHRpbmdTdGFydGVkKCkiLCAxMDAwICk7DQotCX0NCi19DQotDQotZnVuY3Rpb24gZ2V0Q29va2llIChuYW1lKQ0KLXsNCi0gIHZhciBkY29va2llID0gZG9jdW1lbnQuY29va2llOw0KLSAgdmFyIGNuYW1lID0gbmFtZSArICI9IjsNCi0gIHZhciBjbGVuID0gZGNvb2tpZS5sZW5ndGg7DQotICB2YXIgY2JlZ2luID0gMDsNCi0gIHdoaWxlIChjYmVnaW4gPCBjbGVuKQ0KLSAgew0KLSAgICB2YXIgdmJlZ2luID0gY2JlZ2luICsgY25hbWUubGVuZ3RoOw0KLSAgICBpZiAoZGNvb2tpZS5zdWJzdHJpbmcoY2JlZ2luLCB2YmVnaW4pID09IGNuYW1lKQ0KLSAgICB7DQotICAgICAgdmFyIHZlbmQgPSBkY29va2llLmluZGV4T2YgKCI7IiwgdmJlZ2luKTsNCi0gICAgICBpZiAodmVuZCA9PSAtMSkNCi0gICAgICB7DQotICAgICAgICB2ZW5kID0gY2xlbjsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIHVuZXNjYXBlKGRjb29raWUuc3Vic3RyaW5nKHZiZWdpbiwgdmVuZCkpOw0KLSAgICB9DQotICAgIGNiZWdpbiA9IGRjb29raWUuaW5kZXhPZigiICIsIGNiZWdpbikgKyAxOw0KLSAgICBpZiAoY2JlZ2luID09IDApDQotICAgIHsNCi0gICAgICBicmVhazsNCi0gICAgfQ0KLSAgfQ0KLSAgcmV0dXJuIG51bGw7DQotIH0NCi0NCi0NCi0gIHZhciBpbmRleD1udWxsOw0KLSAgdmFyIHRvdXI9bnVsbDsNCi0gIHZhciBzZWFyY2g9bnVsbDsNCi0gIHZhciBnbG9zc2FyeT1udWxsOw0KLSAgdmFyIGZlZWRiYWNrPW51bGw7DQotICB2YXIgdHJlZUxvYWRlZD1mYWxzZTsNCi0gIGZ1bmN0aW9uIGNoZWNrVHJlZUxvYWRlZCgpDQotICB7DQotICAgIGlmKHRyZWVMb2FkZWQpDQotICAgIHsNCi0gICAgICByZXR1cm4gdHJlZUxvYWRlZDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgaWYocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0ICE9IG51bGwNCi0gICAgICAgICYmIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5KCkpDQotICAgICB7DQotICAgICAgIHRyZWVMb2FkZWQgPSB0cnVlOw0KLSAgICAgfQ0KLSAgICAgKi8NCi0gICAgIGlmKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldCAhPSBudWxsKQ0KLSAgICAgew0KLSAgICAgIAl2YXIgbWV0aG9kID0gdHlwZW9mIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5Ow0KLQkgaWYgKG1ldGhvZCAhPSAidW5kZWZpbmVkIikgew0KLQkJaWYgKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5KCkpDQotCQl7DQotICAgICAgIAkJCXRyZWVMb2FkZWQgPSB0cnVlOw0KLQkJfQ0KLQ0KLQkgIH0NCi0NCi0gICAgIH0NCi0NCi0gICAgIHJldHVybiB0cmVlTG9hZGVkOw0KLSAgIH0NCi0NCi0NCi0gICAgZnVuY3Rpb24gc2hvd0FsZXJ0Tm90TG9hZGVkKCkNCi0gICAgew0KLSAgICAgIGFsZXJ0KHRvcG5hdl9qc19NRVNTQUdFMSk7DQotICAgIH0NCi0NCi1mdW5jdGlvbiBzaG93U3RhdHVzTm90TG9hZGVkKCkNCi0gIHsNCi0gICAgLy9yZXR1cm4gIlRoZSBUcmVlQnJvd3NlIGlzIG5vdCB5ZXQgbG9hZGVkIVxuUGxlYXNlIHdhaXQhIjsNCi0gICAgcmV0dXJuIHRvcG5hdl9qc19NRVNTQUdFMTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dBbGVydE5vUGFnZSh0ZXh0KQ0KLSAgew0KLSAgICAgdmFyIHBhcmVudExhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICBpZihwYXJlbnRMYWJlbCE9IiIgJiYgcGFyZW50TGFiZWwhPW51bGwpDQotICAgICB7DQotICAgICAgICAgIC8vYWxlcnQoIlRoZXJlIGlzIG5vICciICsgdGV4dCArICInIHBhZ2UgZm9yIHRoaXMgcGFnZS5cblRyeSBvbmUgb2YgdGhlIG90aGVyIG5hdmlnYXRpb24gYnV0dG9ucy4iKTsNCi0gICAgICAgICAgYWxlcnQoZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMiwgdGV4dCkpOw0KLSAgICAgfQ0KLSAgICAgZWxzZQ0KLSAgICAgew0KLSAgICAgICAgIC8vYWxlcnQoIlRoZXJlIGlzIG5vICciICsgdGV4dCArICInIHBhZ2UgZm9yIHRoaXMgcGFnZS5cblRyeSBvbmUgb2YgdGhlIG90aGVyIG5hdmlnYXRpb24gYnV0dG9ucyIpOw0KLSAgICAgICAgIGFsZXJ0KGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTIsIHRleHQpKTsNCi0gICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNob3dTdGF0dXNOb1BhZ2UodGV4dCkNCi0gIHsNCi0NCi0gICAgIHZhciBwYXJlbnRMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgdmFyIG1zZzsNCi0gICAgIGlmKHBhcmVudExhYmVsIT0iIiAmJiBwYXJlbnRMYWJlbCE9bnVsbCkNCi0gICAgIHsNCi0gICAgICAgIC8vbXNnID0gIlRoZXJlIGlzIG5vICIgKyB0ZXh0ICsgIiBwYWdlISI7DQotICAgICAgICBtc2cgPSBmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UzLCB0ZXh0KTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgIC8vbXNnID0gIlRoZXJlIGlzIG5vICIgKyB0ZXh0ICsgIiBwYWdlISI7DQotICAgICAgICBtc2cgPSBmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UzLCB0ZXh0KTsNCi0gICAgIH0NCi0NCi0gICAgIHJldHVybiBtc2c7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93UGFyZW50TGFiZWwoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIHZhciBwYXJlbnR1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotDQotICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgcGFyZW50dXJsIT0iIiAmJiBwYXJlbnR1cmwhPW51bGwpDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gbGFiZWw7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vUGFnZSgidXAiKTsNCi0gICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vdExvYWRlZCgpOw0KLSAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93SG9tZUxhYmVsKCkNCi0gIHsNCi0gICAgc2VsZi5zdGF0dXMgPSAiSG9tZSI7DQotICB9DQotDQotICBmdW5jdGlvbiBzaG93UHJldmlvdXNMYWJlbCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzTGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICB2YXIgcHJldnVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c1VybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIHByZXZ1cmwhPSIiICYmIHByZXZ1cmwhPW51bGwpDQotICAgICB7DQotICAgICAgIHNlbGYuc3RhdHVzID0gbGFiZWw7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb1BhZ2UoInByZXZpb3VzIik7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2hvd05leHRMYWJlbCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgIHZhciBuZXh0dXJsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgbmV4dHVybCE9IiIgJiYgbmV4dHVybCE9bnVsbCkNCi0gICAgICB7DQotICAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOw0KLSAgICAgIH0NCi0gICAgICBlbHNlDQotICAgICAgew0KLSAgICAgICAgc2VsZi5zdGF0dXMgPSAgc2hvd1N0YXR1c05vUGFnZSgibmV4dCIpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgc2VsZi5zdGF0dXMgPSAgc2hvd1N0YXR1c05vdExvYWRlZCgpOw0KLSAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkUHJldmlvdXMoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzTGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c1VybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLQ0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLQ0KLQlpZiAoKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpPT0tMSkgJiYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpPT0tMSkpDQotCXsNCi0JCXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0IikhPS0xKQ0KLQl7DQotCSAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEFwcGxldFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsKTsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKSE9LTEpDQotCXsNCi0JCW5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEh0dHBQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCwgIlByZXZpb3VzIik7DQotCX0NCi0JICAgICAgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKG5ld0xvY2F0aW9uKTsNCi0gICAgIH0NCi0gICAgIGVsc2UNCi0gICAgIHsNCi0gICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX3ByZXYpOw0KLSAgICAgfQ0KLSAgICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotICAgICByZXR1cm47DQotICB9DQotDQotICBmdW5jdGlvbiBsb2FkTmV4dCgpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICB2YXIgbmV3TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7DQotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLQ0KLQlpZiAoKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpPT0tMSkgJiYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpPT0tMSkpDQotCXsNCi0JCXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247DQotCX0NCi0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0IikhPS0xKQ0KLQl7DQotCSAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEFwcGxldFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsKTsNCi0JfQ0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKSE9LTEpDQotCXsNCi0JCW5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEh0dHBQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCwgIk5leHQiKTsNCi0JfQ0KLSAgICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotDQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfbmV4dCk7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGxvYWRQYXJlbnQoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOw0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgew0KLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLSAgICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7DQotICAgICB9DQotICAgICBlbHNlDQotICAgICB7DQotICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV91cCk7DQotICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOw0KLSAgICB9DQotDQotICAgICByZXR1cm47DQotICB9DQotDQotZnVuY3Rpb24gd2hlcmVBbUkoKQ0KLSAgew0KLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkNCi0gICAgew0KLQl2YXIgc3RhdHVzID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsNCi0gICAgCWlmKCBzdGF0dXMgPT0gZmFsc2UgKQ0KLQl7DQotCQlhbGVydCggdG9wbmF2X2pzX01FU1NBR0U0ICk7DQotCX0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gdXBBcnJvdygpDQotICB7DQotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLSAgICB7DQotICAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnVwQXJyb3coKTsNCi0gICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpDQotICAgICAgew0KLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gZG93bkFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZG93bkFycm93KCk7DQotICAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQ0KLSAgICAgIHsNCi0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsNCi0gICAgICB9DQotDQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0gICAgZnVuY3Rpb24gbGVmdEFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5sZWZ0QXJyb3coKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsNCi0gICAgfQ0KLSAgICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgICBmdW5jdGlvbiByaWdodEFycm93KCkNCi0gIHsNCi0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpDQotICAgIHsNCi0gICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5yaWdodEFycm93KCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7DQotICAgIH0NCi0gICAgIHJldHVybjsNCi0gIH0NCi0NCi0NCi1mdW5jdGlvbiBsb2FkVG9wKCkNCi17DQotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiBwYXJlbnQuZnJhbWVzWzFdLm5hbWU9PSJvcnlfdG9jIikNCi0gIHsNCi0gICAgIGFsZXJ0KHRvcG5hdl9qc19NRVNTQUdFNSk7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIHZhciBleHBpcmVzID0gbmV3IERhdGUoKTsNCi0gICAgZXhwaXJlcy5zZXRUaW1lIChleHBpcmVzLmdldFRpbWUoKSArICgxMDAwICogMjApKTsNCi0gICAgZG9jdW1lbnQuY29va2llID0gInJ1cF9vcnlfZG9jPSIgKyBlc2NhcGUgKGRvY3VtZW50LlVSTCkgKw0KLSAgICAiOyBleHBpcmVzPSIgKyBleHBpcmVzLnRvVVRDU3RyaW5nKCkgKyAgIjsgcGF0aD0vIjsNCi0NCi0gICAgdmFyIG5ld19vcnlfZG9jX2xvYyA9IG51bGw7DQotDQotICAgIGZvcihpPWRvY3VtZW50LmxpbmtzLmxlbmd0aC0xO2k+PTA7aS0tKQ0KLSAgICB7DQotICAgICAgIGlmKGRvY3VtZW50LmxpbmtzW2ldLmhyZWYuaW5kZXhPZigiaW5kZXguaHRtIikhPS0xKQ0KLSAgICAgICB7DQotICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gZG9jdW1lbnQubGlua3NbaV0uaHJlZjsNCi0gICAgICAgICBicmVhazsNCi0gICAgICAgfQ0KLSAgICB9DQotDQotICAgIGlmKG5ld19vcnlfZG9jX2xvYyE9bnVsbCkNCi0gICAgew0KLQlpZiggc2VsZi5uYW1lID09ICJvcnlfZG9jIiApDQotCXsNCi0JCXdpbmRvdy5jbG9zZSgpOw0KLQkJd2luZG93Lm9wZW4oIG5ld19vcnlfZG9jX2xvYyApOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsNCi0JfQ0KLSAgICB9DQotICAgfQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiBvcGVuT3J5IChwYWdlLCB0YXJnZXQpDQotew0KLSAgICBpZighaW5kZXggfHwgaW5kZXguY2xvc2VkKQ0KLSAgICB7DQotICAgICAgaW5kZXggPSBvcGVuKHBhZ2UsdGFyZ2V0LCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9Mzk1LGhlaWdodD01MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIGluZGV4LmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlblNlYXJjaCgpDQotew0KLSAgICBpZighc2VhcmNoIHx8IHNlYXJjaC5jbG9zZWQpDQotICAgIHsNCi0gICAgICBzZWFyY2ggPSBvcGVuKCIuL2FwcGxldC9zZWFyY2guaHRtIiwic2VhcmNoX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz1ubyx3aWR0aD02MzAsaGVpZ2h0PTQ1MCxyZXNpemFibGU9eWVzIik7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc2VhcmNoLmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gb3BlbkluZGV4KCkNCi17DQotICAgb3Blbk9yeSgiLi9pbmRleC9pbmRleC5odG0iLCJpbmRleF93aW4iKTsNCi19DQotDQotZnVuY3Rpb24gb3Blbkdsb3NzYXJ5KCkNCi17DQotIGlmKCFnbG9zc2FyeSB8fCBnbG9zc2FyeS5jbG9zZWQpDQotICAgIHsNCi0gICAgICBnbG9zc2FyeSA9IG9wZW4oIi4vcHJvY2Vzcy9nbG9zc2FyeS9pbmRleC5odG0iLCJnbG9zc2FyeV93aW4iLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9Mzg1LGhlaWdodD01MDAscmVzaXphYmxlPXllcyIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIGdsb3NzYXJ5LmZvY3VzKCk7DQotICAgIH0NCi19DQotDQotZnVuY3Rpb24gcHJpbnRQYWdlKCkNCi17DQotIHBhcmVudC5vcnlfZG9jLmZvY3VzKCk7DQotIHBhcmVudC5vcnlfZG9jLnByaW50KCk7DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHNlbmRGZWVkYmFjayh1cmwpDQotew0KLQlpZiAoIHVybCA9PSBudWxsIHx8IHVybCA9PSAnJyApDQotCXsNCi0JCXJldHVybjsNCi0JfQ0KLQkNCi0JaWYgKCB1cmwuaW5kZXhPZigibWFpbHRvOiIpID49IDAgKQ0KLQl7DQotCQlzZW5kbWFpbCh1cmwpOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJDQotIAkgICAgaWYoIWZlZWRiYWNrIHx8IGZlZWRiYWNrLmNsb3NlZCkNCi0JICAgIHsNCi0JICAgICAgZmVlZGJhY2sgPSBvcGVuKHVybCwiZmVlZGJhY2tfd2luIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTYwMCxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsNCi0JICAgIH0NCi0JICAgIGVsc2UNCi0JICAgIHsNCi0JICAgICAgZmVlZGJhY2suZm9jdXMoKTsNCi0JICAgIH0NCi0gICAgCX0NCi0gICAgCQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiBzZW5kbWFpbCh1cmwpDQotew0KLQlpZiAoIHVybC5pbmRleE9mKCI/c3ViamVjdCIpID09IC0xICkNCi0Jew0KLQkJdmFyIGxpbms9cGFyZW50Lm9yeV9kb2MubG9jYXRpb247DQotCQl1cmwgPSB1cmwgKyAnP3N1YmplY3Q9RmVlZGJhY2s6IC0gJytsaW5rOw0KLQl9DQotCWxvY2F0aW9uLnJlcGxhY2UodXJsKTsNCi19DQotDQotLy9jYWxjdWxhdGVzIHJlbGF0aXZlIHBhdGgNCi0vL3BhdGggbXVzdCBiZSBhbGwgcmVsYXRpdmUgZnJvbSB3ZWJzaXRlIGJhc2Ugb3IgY29udGFpbiBmdWxsIHVybHMNCi1mdW5jdGlvbiBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgoc291cmNlUGF0aCwgdGFyZ2V0UGF0aCkNCi17DQotCWlmICh0YXJnZXRQYXRoLmluZGV4T2YoImh0dHA6LyIpICE9IC0xKQ0KLQl7DQotCQlyZXR1cm4gdGFyZ2V0UGF0aDsNCi0JfQ0KLQ0KLQkvL3JlcGxhY2UgYWxsICdcJyB3aXRoICcvJw0KLQlzb3VyY2VQYXRoID0gc291cmNlUGF0aC5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOw0KLQl0YXJnZXRQYXRoID0gdGFyZ2V0UGF0aC5yZXBsYWNlKC9cXC9nLCIvIik7DQotDQotCS8vYWxlcnQoIlJlcGxhY2UoU291cmNlKT0+IiArIHNvdXJjZVBhdGgpOw0KLQkvL2FsZXJ0KCJSZXBsYWNlKHRhcmdldCk9PiIgKyB0YXJnZXRQYXRoKTsNCi0NCi0NCi0Jc291cmNlQXJyYXkgPSBzb3VyY2VQYXRoLnNwbGl0KCIvIik7DQotCXRhcmdldEFycmF5ID0gdGFyZ2V0UGF0aC5zcGxpdCgiLyIpOw0KLQ0KLQl2YXIgdGhlUmVsUGF0aCA9ICIiOw0KLQ0KLQkvL2xvb3AgdW50aWwgd2UgZmluZCBhIGRpZmZlcmVuY2UNCi0JdmFyIGlkeCA9IDA7DQotCWZvcihpZHggPSAwOyBpZHggPCBzb3VyY2VBcnJheS5sZW5ndGg7IGlkeCsrKQ0KLQl7DQotCQlpZiAoaWR4ID4gdGFyZ2V0UGF0aC5sZW5ndGgpDQotCQl7DQotCQkJYnJlYWs7DQotCQl9DQotDQotCQlpZiAoc291cmNlQXJyYXlbaWR4XSAhPSB0YXJnZXRBcnJheVtpZHhdKQ0KLQkJew0KLQkJCWJyZWFrOw0KLQkJfQ0KLQl9DQotDQotCS8vYXBwZW5kIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgLi8NCi0JdmFyIG1heElkeCA9IHNvdXJjZUFycmF5Lmxlbmd0aCAtIDE7DQotCWZvciAodmFyIGkgPSBpZHg7IGkgPCBtYXhJZHg7IGkrKykNCi0Jew0KLQkJdGhlUmVsUGF0aCA9IHRoZVJlbFBhdGggKyAiLi8iOw0KLQ0KLQkJLy9hbGVydCgiUmVsUGF0aD0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vYXBwZW5kIGFueSByZW1haW5pbmcgdGFyZ2V0IHBhdGgNCi0Jd2hpbGUoaWR4IDwgdGFyZ2V0QXJyYXkubGVuZ3RoKQ0KLQl7DQotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aCArIHRhcmdldEFycmF5W2lkeCsrXSArICIvIjsNCi0JCS8vYWxlcnQoIlJlbFBhdGgoZmluYWwpPT4iICsgdGhlUmVsUGF0aCk7DQotCX0NCi0NCi0JLy9yZW1vdmUgdGhlIGxhc3QgcGF0aCBzZXBhcmF0b3INCi0JaWYgKHRoZVJlbFBhdGgubGVuZ3RoID4gMCkNCi0Jew0KLQkJLy9hbGVydCgiUmVsUGF0aChUcmltMSk9PiIgKyB0aGVSZWxQYXRoKTsNCi0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoLnN1YnN0cmluZygwLCAodGhlUmVsUGF0aC5sZW5ndGggLSAxKSk7DQotCQkvL2FsZXJ0KCJSZWxQYXRoKFRyaW0xKT0+IiArIHRoZVJlbFBhdGgpOw0KLQl9DQotDQotCS8vYWxlcnQoIlJldHVybiBSZWxhdGl2ZSBQYXRoID0+ICIgKyB0aGVSZWxQYXRoKTsNCi0NCi0JcmV0dXJuIHRoZVJlbFBhdGg7DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldFRyZWVQYXRoKCkNCi17DQotCXJldHVybiBidWlsZFRyZWVQYXRoTG9jYXRpb24oKTsNCi19DQotDQotLy9UaGlzIG1ldGhvZCB3aWxsIHJlbW92ZSB0aGUgd2Vic2l0ZSBiYXNlIGZyb20gdGhlIHVybA0KLWZ1bmN0aW9uIGNhbGN1bGF0Q3VycmVudFBhZ2UoY3VyclVSTCkgew0KLQ0KLQl2YXIgdGhlQ3VycmVudExvY2F0aW9uID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZjsNCi0JLy9yZXBsYWNlIGFsbCAnXCcgd2l0aCAnLycNCi0JdGhlQ3VycmVudExvY2F0aW9uID0gdGhlQ3VycmVudExvY2F0aW9uLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7DQotCWN1cnJVUkwgPSBjdXJyVVJMLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7DQotDQotCXZhciBzb3VyY2VBcnJheSA9IHRoZUN1cnJlbnRMb2NhdGlvbi5zcGxpdCgiLyIpOw0KLQl2YXIgY3VyckFycmF5ID0gY3VyclVSTC5zcGxpdCgiLyIpOw0KLQ0KLQl2YXIgbnVtVG9SZW1vdmUgPSBzb3VyY2VBcnJheS5sZW5ndGggLSAyOw0KLQl2YXIgaWR4ID0gMDsNCi0JdmFyIHRoZVJldHVyblBhdGggPSAiIjsNCi0JZm9yIChpZHggPSBudW1Ub1JlbW92ZTsgaWR4IDwgY3VyckFycmF5Lmxlbmd0aDsgaWR4KyspIHsNCi0JCWlmICh0aGVSZXR1cm5QYXRoICE9ICIiKSB7DQotCQkJdGhlUmV0dXJuUGF0aCA9IHRoZVJldHVyblBhdGggKyAiLyI7DQotCQl9DQotCQl0aGVSZXR1cm5QYXRoID0gdGhlUmV0dXJuUGF0aCArIGN1cnJBcnJheVtpZHhdOw0KLQl9DQotDQotCS8vYWxlcnQoIkFycmF5VGVzdD0+IiArIGN1cnJVUkwgKyAiLCIgKyB0aGVSZXR1cm5QYXRoKTsNCi0JcmV0dXJuIHRoZVJldHVyblBhdGg7DQotfQ0KLQ0KLS8vYnVpbGRzIHRyZWUgcGF0aA0KLWZ1bmN0aW9uIGJ1aWxkVHJlZVBhdGhMb2NhdGlvbigpDQotew0KLQl2YXIgdGhlRGVsaW1pdGVyID0gIiMjKiI7DQotCXZhciB0aGlzUGFnZSA9ICJhcHBsZXQvcnVwX3RvcG5hdi5odG0iOw0KLQl2YXIgdGhlTG9jID0gIiI7DQotDQotDQotDQotCWlmKGNoZWNrVHJlZUxvYWRlZCgpKQ0KLQl7DQotCQl2YXIgdGhlQ3VycmVudExvY2F0aW9uID0gcGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQubG9jYXRpb24uaHJlZjsNCi0JCXRoaXNQYWdlID0gY2FsY3VsYXRDdXJyZW50UGFnZSh0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJLy9hbGVydCgiUGF0aE5hbWU6IiArIHRoaXNQYWdlKTsNCi0NCi0JCS8vYWxlcnQoIlRyeWluZyB0byBmaW5kIHRoZSBwYXRoIGZvciA9PiIgKyB0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJdmFyIHRoZVBhdGggPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuZ2V0VHJlZVBhdGhBcnJheSh0aGVDdXJyZW50TG9jYXRpb24pOw0KLQ0KLQkJLy9hbGVydCgiVGhlIFRyZWUgUGF0aDogIiArIHRoZVBhdGgpOw0KLQ0KLQkJdGhlUGF0aFN0cmluZyA9IHRoZVBhdGggKyAiIjsNCi0gICAgCQlhcnJheUZyb21TdHJpbmcgPSB0aGVQYXRoU3RyaW5nLnNwbGl0KHRoZURlbGltaXRlcik7DQotDQotCQkvL2J1aWxkIHRoZSBwYXRoIGZyb20gdGhlIGFycmF5DQotCQkvL3BhcmFtIDEgPSBwYXRoIHRvIGljb24sIHBhcmFtIDIgLSBsYWJlbCwgcGFyYW0gMyAtIHBhdGggdG8gZmlsZQ0KLQkJdmFyIGNvdW50ZXIgPSAwOw0KLQkJdmFyIHRoZUxhYmVsOw0KLQkJdmFyIHRoZVJlbFBhdGg7DQotCQlpZiAoYXJyYXlGcm9tU3RyaW5nLmxlbmd0aCA+IDIpDQotCQl7DQotCQkgICB0aGVMb2MgPSAiIjsNCi0JCSAgIGZvcih2YXIgaSA9IDA7IGkgPCAoYXJyYXlGcm9tU3RyaW5nLmxlbmd0aCAtIDEpIDsgaSsrKQ0KLQkJICAgew0KLQkJCS8vaXQncyB0aGUgaWNvbiBwYXRoDQotCQkJaWYgKGNvdW50ZXIgPCAyKQ0KLQkJCXsNCi0JCQkJaWYgKGNvdW50ZXIgPiAwKQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKyAiICZndDsgIjsNCi0JCQkJfQ0KLQ0KLQkJCQkvL2FsZXJ0KCJDYWxjdWxhdGluZyBwYXRoIGZyb20oMSkgIiArIHRoaXNQYWdlICsgIiA9PiAiICsgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0NCi0JCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXS5pbmRleE9mKCJcXCIpID09IC0xICYmIGFycmF5RnJvbVN0cmluZ1tpXS5pbmRleE9mKCIvIikgPT0gLTEpDQotCQkJCXsNCi0JCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0gIT0gIm51bGwiKQ0KLQkJCQkJew0KLQkJCQkJCXRoZVJlbFBhdGggPSAiYXBwbGV0L2ltYWdlcy8iICsgYXJyYXlGcm9tU3RyaW5nW2ldOw0KLQkJCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIHRoZVJlbFBhdGgpOw0KLQkJCQkJfQ0KLQkJCQkJLy9hbGVydCgiTW9kaWZ5aW5nIFBhdGggPT4gIiArIHRoZVJlbFBhdGgpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJfQ0KLQ0KLQkJCQlpZiAodGhlUmVsUGF0aCAhPSAibnVsbCIpDQotCQkJCXsNCi0JCQkJCXRoZUxvYyA9IHRoZUxvYyArDQotCQkJCQkJICI8aW1nIGJvcmRlcj0wIHNyYz1cIiIgKw0KLQkJCQkJCSB0aGVSZWxQYXRoICArDQotCQkJCQkJICJcIj4iOw0KLQkJCQl9DQotDQotCQkJCS8vYWxlcnQoInRoZSBjdXJyIHBhdGg9PiIgKyB0aGVMb2MpOw0KLQkJCQljb3VudGVyID0gMjsNCi0JCQl9DQotCQkJLy8gaXQncyB0aGUgbGFiZWwNCi0JCQllbHNlIGlmIChjb3VudGVyID09IDIpDQotCQkJew0KLQkJCQl0aGVMYWJlbCA9IGFycmF5RnJvbVN0cmluZ1tpXTsNCi0JCQkJY291bnRlciA9IDM7DQotCQkJfQ0KLQkJCWVsc2UgaWYgKGNvdW50ZXIgPT0gMykNCi0JCQl7DQotCQkJCS8vYWxlcnQoIkNhbGN1bGF0aW5nIHBhdGggZnJvbSgzKSAiICsgdGhpc1BhZ2UgKyAiID0+ICIgKyBhcnJheUZyb21TdHJpbmdbaV0pOw0KLQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldICE9ICJudWxsIikNCi0JCQkJew0KLQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgYXJyYXlGcm9tU3RyaW5nW2ldKTsNCi0JCQkJCWlmICh0aGVSZWxQYXRoICE9ICIiKSB7DQotCQkJCQkJdGhlTG9jID0gdGhlTG9jICsNCi0JCQkJCSAJCSI8YSBjbGFzcz1cImhvdHRleHRcIiB0YXJnZXQ9XCJvcnlfZG9jXCIgaHJlZj1cIiIgKw0KLQkJCQkJCQkgdGhlUmVsUGF0aCArDQotCQkJCQkgCQkiXCI+IiArDQotCQkJCQkgCQl0aGVMYWJlbCArDQotCQkJCQkgCQkiPFwvYT5cbiI7DQotCQkJCQkgfQ0KLQkJCQkJIGVsc2Ugew0KLQkJCQkJIAl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJIAkJIjxhIGNsYXNzPVwiaG90dGV4dFwiPiIgICsNCi0JCQkJCSAJCXRoZUxhYmVsICsNCi0JCQkJCSAJCSI8XC9hPlxuIjsNCi0JCQkJCSB9DQotCQkJCX0NCi0JCQkJZWxzZQ0KLQkJCQl7DQotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKw0KLQkJCQkJIAkiPGEgY2xhc3M9XCJob3R0ZXh0XCI+IiAgKw0KLQkJCQkJIAl0aGVMYWJlbCArDQotCQkJCQkgCSI8XC9hPlxuIjsNCi0JCQkJfQ0KLQkJCQkvL2FsZXJ0KCJ0aGUgY3VyciBwYXRoPT4iICsgdGhlTG9jKTsNCi0JCQkJY291bnRlciA9IDE7DQotCQkJCXRoZVJlbFBhdGggPSAibnVsbCI7DQotCQkJCXRoZUxhYmVsID0gIm51bGwiOw0KLQkJCX0NCi0JCSAgIH0NCi0NCi0JCS8vYWxlcnQoIkZpbmlzaGVkIEJ1aWxkaW5nID0+ICIgKyB0aGVMb2MpOw0KLQkJfQ0KLQ0KLQl9DQotDQotCS8vdGhlTG9jID0gIkN1cnJlbnQgTG9jYXRpb24mbmJzcDsmIzA0NTsmbmJzcDsiICsgdGhlTG9jOw0KLQ0KLQkvL2FsZXJ0KCJ0aGUgRmluYWwgU3RyaW5nPT4iICsgdGhlTG9jKTsNCi0NCi0JLy9kb2N1bWVudC53cml0ZSh0aGVMb2MpOw0KLQlyZXR1cm4gdGhlTG9jOw0KLQ0KLX0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEvZG9jcm9vdC9zcHNjcmVlbl9kYS5odG0gYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEvZG9jcm9vdC9zcHNjcmVlbl9kYS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhY2I4OTMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL2RvY3Jvb3Qvc3BzY3JlZW5fZGEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLQkiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0KLQotPCEtLSBSUFcgTUVUQSBEQVRBIFNUQVJUIC0tCi0gCi0gCi0tLSBSUFcgTUVUQSBEQVRBIEVORCAtLT4KLQotPGh0bWw+Ci0KLTxoZWFkPgotPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJyb3AuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiLz4KLTx0aXRsZT7DhWJuaW5nc3Nrw6ZybWJpbGxlZGU8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotCi0KLTxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KLTxoMiBhbGlnbj0iY2VudGVyIj5WZW50LCBtZW5zIHRyw6ZzdHJ1a3R1cmJyb3dzZXJlbiBpbmRsw6ZzZXMuLi48YnIvPjwvaDI+Ci08cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+Ci08IS0tIAotPHAgYWxpZ249ImNlbnRlciI+PGltZyBzcmM9ImltYWdlcy9zcGxhc2guZ2lmIiBhbHQ9IlZlbGtvbW1lbiB0aWwgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayIvPjwvcD4KLS0tPgotPGJyLz4KLTxici8+Ci0KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEvZnJhZ21lbnQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYS9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmNiNjRmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYS9mcmFnbWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mcmFnbWVudE5hbWU9RVBGIENvbXBvc2VyIFB1Ymxpc2hpbmcgKE5MMmEpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzNiYWQ0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gcHVibGljZXJpbmcNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0NCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9SZXNvdXJjZXNfZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE4NTRmYy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIw0KLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQUDAwMDBFIC0gSVVQUDAwOTlFDQotIw0KLQ0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMNCi1wdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZT1QdWJsaWNlcmVyIGtvbmZpZ3VyYXRpb25lbi4uLg0KLWluaXRpYWxpemluZ0RpclRhc2tfbmFtZT1Jbml0aWFsaXNlcmVyIGRlc3RpbmF0aW9uc2JpYmxpb3Rlay4uLg0KLWNvcHlpbmdGaWxlc1Rhc2tfbmFtZT1Lb3BpZXJlciBmaWxlci4uLg0KLWdlbmVyYXRpbmdCb29rbWFya3NUYXNrX25hbWU9R2VuZXJlcmVyIGJvZ21cdTAwZTZya2VyLi4uDQotZ2VuZXJhdGluZ0Jvb2ttYXJrVGFza19uYW1lPUdlbmVyZXJlciBib2dtXHUwMGU2cmtldCAnJ3swfScnLi4uDQotZ2VuZXJhdGluZ0Jvb2ttYXJrSW5kZXhUYXNrX25hbWU9R2VuZXJlcmVyIGJvZ21cdTAwZTZya2VpbmRla3MuLi4NCi1wdWJsaXNoaW5nTGlua2VkRWxlbWVudFRhc2tfbmFtZT1QdWJsaWNlcmVyIG1ldG9kZWVsZW1lbnRlcjogezB9IHB1YmxpY2VyZXQsIHsxfSBtYW5nbGVyDQotcHVibGlzaGluZ0VsZW1lbnRUYXNrX25hbWU9UHVibGljZXJlciBtZXRvZGVlbGVtZW50OiB7MH06ezF9DQotZ2VuZXJhdGluZ0dsb3NzYXJ5VGFza19uYW1lPUdlbmVyZXJlciBvcmRsaXN0ZS4uLg0KLWdlbmVyYXRpbmdTZWFyY2hJbmRleFRhc2tfbmFtZT1HZW5lcmVyZXIgc1x1MDBmOGdlaW5kZWtzLi4uDQotYnVpbGRpbmdQcm9jZXNzQ2xvc3VyZVRhc2tfbmFtZT1CeWdnZXIgcHJvY2VzYWZzbHV0bmluZy4uLg0KLWJ1aWxkaW5nRWxlbWVudENsb3N1cmVUYXNrX25hbWU9QnlnZ2VyIGVsZW1lbnRhZnNsdXRuaW5nIGZvciAnJ3swfScnLi4uDQotbG9hZExpYnJhcnlUYXNrX25hbWU9SW5kbFx1MDBlNnNlciBiaWJsaW90ZWtzaW5kaG9sZC4uLg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMgbG9nZ2VkIGluIHRoZSBQdWJsaXNoaW5nIFJlcG9ydA0KLXB1Ymxpc2hFbGVtZW50RXJyb3JfbXNnPUlVUFAwMDAwRTogRmVqbCB1bmRlciBwdWJsaWNlcmluZyBhZiBlbGVtZW50OiB7MH0NCi1zZXJ2ZXJFcnJvcl9tc2c9SVVQUDAwMDFFOiBJbmdlbiBkYXRhIHJldHVybmVyZXQgZnJhIHNlcnZlci4NCi1pbnZhbGlkSHR0cFJlc3BvbnNlRXJyb3JfbXNnPUlVUFAwMDAyRTogVWd5bGRpZ3Qgc3ZhciBmcmEgaHR0cDovL3swfTp7MX06ezJ9DQotDQotIyBXYXJuaW5nIE1lc3NhZ2VzIGxvZ2dlZCBpbiB0aGUgUHVibGlzaGluZyBSZXBvcnQNCi1pbnZhbGlkRWxlbWVudFdhcm5pbmdfbXNnPUlVUFAwMDAzVzogRWxlbWVudCBlciBpa2tlIHB1YmxpY2VyZXQsIGZvcmRpIGRldCBpa2tlIGVyIGV0IGd5bGRpZ3QgZWxlbWVudCBpIGtvbmZpZ3VyYXRpb25lbi4NCi1pbnZhbGlkTWV0aG9kRWxlbWVudFdhcm5pbmdfbXNnPUlVUFAwMDA0VzogRWxlbWVudCBlciBpa2tlIHB1YmxpY2VyZXQsIGZvcmRpIGRldCBpa2tlIGVyIGV0IG1ldG9kZWVsZW1lbnQ6IHswfQ0KLWNvcHlGaWxlV2FybmluZ19tc2c9SVVQUDAwMDVXOiBLYW4gaWtrZSBrb3BpZXJlIGZpbCBmcmEgJyd7MH0nJyB0aWwgJyd7MX0nJy4NCi1taXNzaW5nSWNvbkZpbGVXYXJuaW5nX21zZz1JVVBQMDAwNlc6IE5vZGVpa29uZmlsZW4gJyd7MH0nJyBmaW5kZXMgaWtrZS4NCi1taXNzaW5nSWNvbk5hbWVXYXJuaW5nX21zZz1JVVBQMDAwN1c6IEthbiBpa2tlIGhlbnRlIG5hdm5ldCBwXHUwMGU1IG5vZGVpa29uZW4uDQotZXh0ZXJuYWxVcmxfbXNnPXJlZmVyZXJlciB0aWwgZWtzdGVybiBVUkw6IHswfQ0KLWRpc2NhcmVkQ2F0ZWdvcnlXYXJuaW5nX21zZz1Ub210IGluZGhvbGRza2F0ZWdvcmllbGVtZW50IGVyIGlra2UgcHVibGljZXJldC4NCi0NCi0jIEVycm9yIERldGFpbHMNCi1jcmVhdGVTZWFyY2hJbmRleEVycm9yX21zZz1JVVBQMDAwOEU6IFNcdTAwZjhnZWluZGVrc2ZpbGVuIGVyIGlra2Ugb3ByZXR0ZXQuDQotDQotIyBQcm9jZXNzIFRyZWUgTm9kZXMNCi1yZWZlcmVuY2VXb3JrZmxvd3NOb2RlX3RleHQ9UmVmZXJlbmNlYXJiZWpkc2dhbmdlDQotdGFza05vZGVfdGV4dD1PcGdhdmVyDQotcHJpbWFyaWx5UGVyZm9ybXNOb2RlX3RleHQ9VWRmXHUwMGY4cmVyIHByaW1cdTAwZTZydA0KLWFkZGl0aW9uYWxseVBlcmZvcm1zTm9kZV90ZXh0PVVkZlx1MDBmOHJlciB5ZGVybGlnZXJlDQotcGVyZm9ybWluZ1JvbGVzTm9kZV90ZXh0PVVkZlx1MDBmOHJlbmRlIHJvbGxlcg0KLWlucHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0PUlucHV0YXJiZWpkc3Byb2R1a3Rlcg0KLW91dHB1dFdvcmtQcm9kdWN0c05vZGVfdGV4dD1PdXRwdXRhcmJlamRzcHJvZHVrdGVyDQotcmVzcG9uc2libGVGb3JOb2RlX3RleHQ9QW5zdmFybGlnIGZvcg0KLW1vZGlmaWVzTm9kZV90ZXh0PVx1MDBjNm5kcmVyDQotcmVzcG9uc2libGVSb2xlTm9kZV90ZXh0PUFuc3ZhcmxpZyByb2xsZQ0KLWNvbnRhaW5pbmdXb3JrUHJvZHVjdE5vZGVfdGV4dD1JbmRlaG9sZGVyIGFyYmVqZHNwcm9kdWt0DQotY29udGFpbmVkV29ya1Byb2R1Y3RzTm9kZV90ZXh0PUluZGVob2xkdGUgYXJiZWpkc3Byb2R1a3Rlcg0KLWd1aWRhbmNlTm9kZV90ZXh0PVZlamxlZG5pbmcNCi1pbnB1dFRvTm9kZV90ZXh0PUlucHV0IHRpbA0KLW91dHB1dEZyb21Ob2RlX3RleHQ9T3V0cHV0IGZyYQ0KLQ0KLSMgSFRNTCBUaXRsZSBmb3IgSW5kZXggUGFnZQ0KLWluZGV4TGFiZWxfdGV4dD1JbmRla3MNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEveHNsL3Jlc291cmNlc19kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhL3hzbC9yZXNvdXJjZXNfZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkwZTk0OC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLm5sMmEveHNsL3Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotIyBUaGUgVUkgdGV4dCBpbiB0aGUgWFNMIHN0eWxlc2hlZXRzLg0KLQ0KLXNlbGVjdGVkQ29uZmlndXJhdGlvblRleHQ9RGVuIHZhbGd0ZSBrb25maWd1cmF0aW9uIHB1YmxpY2VyZXMgdGlsIGZcdTAwZjhsZ2VuZGUgcGxhY2VyaW5nDQotZGV0YWlsSW5mb1RleHQ9RGV0YWxqZXJlZGUgb3BseXNuaW5nZXIgcmVnaXN0cmVyZXMgaSBmXHUwMGY4bGdlbmRlIGZpbGVyIGkgZm9sZGVyZW4gbG9ncw0KLXNob3dFcnJvclRleHQ9dmlzIGFsbGUgZmVqbCwgZGVyIGVyIG9wc3RcdTAwZTVldCB1bmRlciBwdWJsaWNlcmluZy4NCi1sb2dzV2FybmluZ1RleHQ9cmVnaXN0cmVyZXIgYWxsZSBhZHZhcnNsZXIsIGYuZWtzLiBtYW5nbGVuZGUgcmVmZXJlbmNlciwgYnJ1ZHRlIGxpbmsgb2cgdXB1YmxpY2VyZWRlIGthdGVnb3JpZXIgdWRlbiBrYXRlZ29yaXNlcmVkZSBlbGVtZW50ZXIuDQotcGFnZXNOb3RJbnN0YWxsZWRUZXh0PUFsbGUgZGUgbWFuZ2xlZGUgcmVmZXJlbmNlciBpIGRlbm5lIGtvbmZpZ3VyYXRpb24gZmluZGVzIGkgZm9sZGVyZW4gcGFnZXNfbm90X2luc3RhbGxlZC4NCi1pbnZhbGlkRXh0ZXJuYWxUZXh0PVVneWxkaWdlIGVrc3Rlcm5lIGxpbmsgaSBrb25maWd1cmF0aW9uZW4NCi1vd25lckVsZW1lbnRUZXh0PUVqZXJlbGVtZW50DQotbm9uRXhpc3RpbmdUZXh0PUVqZXJlbGVtZW50ZXJuZSByZWZlcmVyZXIgdGlsIGlra2UtZWtzaXN0ZXJlbmRlIGVsZW1lbnRlci4gRWxlbWVudGVybmUgZXIgbXVsaWd2aXMgc2xldHRldCBmcmEgYmlibGlvdGVrZXQsIGVmdGVyIGF0IGVsZW1lbnRsaW5rZW5lIGJsZXYgb3ByZXR0ZXQuIEZpbmQgZWplcmVsZW1lbnRlcm5lLCBvZyByZXQgZGUgdWd5bGRpZ2UgcmVmZXJlbmNlci4NCi1taXNzaW5nUmVmZXJlbmNlc1RpdGxlVGV4dD1SZWZlcmVuY2VyIG1hbmdsZXINCi1taXNzaW5nUmVmZXJlbmNlc1RleHQ9RWplcmVsZW1lbnRlcm5lIHJlZmVyZXJlciB0aWwgbWFuZ2xlbmRlIGVsZW1lbnRlciBpIGRlbiB2YWxndGUga29uZmlndXJhdGlvbi4gS29udHJvbGxcdTAwZTlyIGtvbmZpZ3VyYXRpb25zYWZzbHV0bmluZ2VuLCBvZyByZXQgZGUgbWFuZ2xlbmRlIHJlZmVyZW5jZXIuICAgICAgICAgICAgICAgICAgDQotbWlzc2luZ1Jlc291cmNlRmlsZXNUaXRsZVRleHQ9UmVzc291cmNlZmlsZXIgbWFuZ2xlcg0KLW1pc3NpbmdSZXNvdXJjZUZpbGVzVGV4dD1FamVyZWxlbWVudGVybmUgcmVmZXJlcmVyIHRpbCBtYW5nbGVuZGUgcmVzc291cmNlZmlsZXIuIERlciBlciByZWZlcmVyZXQgdGlsIGRpc3NlIHJlc3NvdXJjZWZpbGVyIGkgZWxlbWVudGV0cyBpbmRob2xkIGVsbGVyIGkgZGUgdGlsa255dHRlZGUgdmVkaFx1MDBlNmZ0bmluZ2VyLg0KLW1pc3NpbmdSZXNvdXJjZVRleHQ9UmVzc291cmNlIG1hbmdsZXINCi1vd25lclJlc291cmNlVGV4dD1FamVycmVzc291cmNlDQotbWlzc2luZ0VsZW1lbnRUZXh0PUVsZW1lbnQgbWFuZ2xlcg0KLWludmFsaWRFbGVtZW50VGV4dD1VZ3lsZGlndCBlbGVtZW50DQotaW52YWxpZEVsZW1lbnRMaW5rc1RleHQ9VWd5bGRpZ2UgZWxlbWVudGxpbmsNCi1wbGVhc2VDaGVja1RleHQ9S29udHJvbGxcdTAwZTlyIGtvbmZpZ3VyYXRpb25zYWZzbHV0bmluZ2VuLCBvZyByZXQgZGUgbWFuZ2xlbmRlIHJlZmVyZW5jZXIuDQotcGxlYXNlRmluZFRleHQ9RmluZCBlamVyZWxlbWVudGVybmUsIG9nIHJldCBkZSB1Z3lsZGlnZSByZWZlcmVuY2VyLg0KLWdsb3NzYXJ5VGV4dD1PcmRsaXN0ZQ0KLWluZGV4VGV4dD1JbmRla3MNCi1mZWVkYmFja1RleHQ9VGlsYmFnZW1lbGRpbmcNCi1hYm91dFRleHQ9T20NCi1zZWFyY2hUZXh0PVNcdTAwZjhnDQotcHJpbnRUZXh0PVVkc2tyaXYNCi1zdW1tYXJ5VGV4dD1PdmVyc2lndA0KLXB1Ymxpc2hpbmdSZXBvcnRUZXh0PVB1YmxpY2VyaW5nc3JhcHBvcnQ6DQotd2hlcmVBbUlUZXh0PUh2b3IgZXIgamVnDQotdHJlZVNldHNUZXh0PVRyXHUwMGU2c3RydWt0dXJzXHUwMGU2dA0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDY2MjBkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NTg2NzMyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgUHVibGlzaGluZyBVSSAoTkwxKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlN2IwMTIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2MTFmZDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIEJlbnV0emVyc2Nobml0dHN0ZWxsZSBmXHUwMGZjciBWZXJcdTAwZjZmZmVudGxpY2h1bmcNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIERlZmF1bHQgZmVlZGJhY2sgVVJMDQotZmVlZGJhY2tVUkw9aHR0cDovL3d3dy5wdWJsaXNoZWRfd2Vic2l0ZS5jb20vZmVlZGJhY2sNCi0NCi0jIFB1Ymxpc2ggQ29uZmlndXJhdGlvbiBBY3Rpb24NCi1wdWJsaXNoQ29uZmlnQWN0aW9uPSZWZXJcdTAwZjZmZmVudGxpY2hlbi4uLg0KLXB1Ymxpc2hDb25maWdBY3Rpb25Ub29sdGlwPUVpbmUgV2Vic2l0ZSBmXHUwMGZjciBlaW5lIEtvbmZpZ3VyYXRpb24gdmVyXHUwMGY2ZmZlbnRsaWNoZW4NCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLXB1Ymxpc2hpbmdPcHRpb25zPVZlclx1MDBmNmZmZW50bGljaHVuZ3NvcHRpb25lbg0KLQ0KLSMgUHVibGlzaGluZyBBY3Rpb25zDQotY29uZmlnQWN0aW9uU2V0PUtvbmZpZ3VyYXRpb24NCi1jb25maWdNZW51PSZLb25maWd1cmF0aW9uDQotDQotIyBQcmludCBDb25maWd1cmF0aW9uIEFjdGlvbg0KLXByaW50Q29uZmlnQWN0aW9uPURydWNrZW4NCi0NCi0jIHRoZSB0aXRsZSBmb3IgdGhlIHB1Ymxpc2hlZCBzaXRlDQotI2Rvbid0IGRlZmluZSBoZXJlLCBsZXQgdXNlciBzcGVjaWZ5IGl0Lg0KLSN0aXRsZT1PcGVuVVAvQmFzaWMNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBEZWZhdWx0IFB1Ymxpc2ggUGF0aA0KLXB1Ymxpc2hQYXRoPTx1c2VyLmhvbWU+LzxhcHAubmFtZT4vUHVibGlzaA0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU2NjljNmMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVVJIGRlIHB1YmxpY2FjaVx1MDBmM24gZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBEZWZhdWx0IGZlZWRiYWNrIFVSTA0KLWZlZWRiYWNrVVJMPWh0dHA6Ly93d3cucHVibGlzaGVkX3dlYnNpdGUuY29tL2ZlZWRiYWNrDQotDQotIyBQdWJsaXNoIENvbmZpZ3VyYXRpb24gQWN0aW9uDQotcHVibGlzaENvbmZpZ0FjdGlvbj0mUHVibGljYXIuLi4NCi1wdWJsaXNoQ29uZmlnQWN0aW9uVG9vbHRpcD1QdWJsaWNhciB1biBzaXRpbyB3ZWIgcGFyYSB1bmEgY29uZmlndXJhY2lcdTAwZjNuDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1wdWJsaXNoaW5nT3B0aW9ucz1PcGNpb25lcyBkZSBwdWJsaWNhY2lcdTAwZjNuDQotDQotIyBQdWJsaXNoaW5nIEFjdGlvbnMNCi1jb25maWdBY3Rpb25TZXQ9Q29uZmlndXJhY2lcdTAwZjNuDQotY29uZmlnTWVudT0mQ29uZmlndXJhY2lcdTAwZjNuDQotDQotIyBQcmludCBDb25maWd1cmF0aW9uIEFjdGlvbg0KLXByaW50Q29uZmlnQWN0aW9uPUltcHJpbWlyDQotDQotIyB0aGUgdGl0bGUgZm9yIHRoZSBwdWJsaXNoZWQgc2l0ZQ0KLSNkb24ndCBkZWZpbmUgaGVyZSwgbGV0IHVzZXIgc3BlY2lmeSBpdC4NCi0jdGl0bGU9T3BlblVQL0Jhc2ljDQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgRGVmYXVsdCBQdWJsaXNoIFBhdGgNCi1wdWJsaXNoUGF0aD08dXNlci5ob21lPi88YXBwLm5hbWU+L1B1Ymxpc2gNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMWQ0MGI1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1JbnRlcmZhY2UgdXRpbGlzYXRldXIgZGUgcHVibGljYXRpb24gRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBEZWZhdWx0IGZlZWRiYWNrIFVSTA0KLWZlZWRiYWNrVVJMPWh0dHA6Ly93d3cucHVibGlzaGVkX3dlYnNpdGUuY29tL2ZlZWRiYWNrDQotDQotIyBQdWJsaXNoIENvbmZpZ3VyYXRpb24gQWN0aW9uDQotcHVibGlzaENvbmZpZ0FjdGlvbj0mUHVibGllci4uLg0KLXB1Ymxpc2hDb25maWdBY3Rpb25Ub29sdGlwPVB1YmxpZXIgdW4gc2l0ZSBXZWIgcG91ciB1bmUgY29uZmlndXJhdGlvbg0KLQ0KLSMgUHJlZmVyZW5jZSBQYWdlDQotcHVibGlzaGluZ09wdGlvbnM9T3B0aW9ucyBkZSBwdWJsaWNhdGlvbg0KLQ0KLSMgUHVibGlzaGluZyBBY3Rpb25zDQotY29uZmlnQWN0aW9uU2V0PUNvbmZpZ3VyYXRpb24NCi1jb25maWdNZW51PSZDb25maWd1cmF0aW9uDQotDQotIyBQcmludCBDb25maWd1cmF0aW9uIEFjdGlvbg0KLXByaW50Q29uZmlnQWN0aW9uPUltcHJpbWVyDQotDQotIyB0aGUgdGl0bGUgZm9yIHRoZSBwdWJsaXNoZWQgc2l0ZQ0KLSNkb24ndCBkZWZpbmUgaGVyZSwgbGV0IHVzZXIgc3BlY2lmeSBpdC4NCi0jdGl0bGU9T3BlblVQL0Jhc2ljDQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgRGVmYXVsdCBQdWJsaXNoIFBhdGgNCi1wdWJsaXNoUGF0aD08dXNlci5ob21lPi88YXBwLm5hbWU+L1B1Ymxpc2gNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9wbHVnaW5faXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZjZiMWRlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1VSSBwdWJibGljYXppb25lIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgRGVmYXVsdCBmZWVkYmFjayBVUkwNCi1mZWVkYmFja1VSTD1odHRwOi8vd3d3LnB1Ymxpc2hlZF93ZWJzaXRlLmNvbS9mZWVkYmFjaw0KLQ0KLSMgUHVibGlzaCBDb25maWd1cmF0aW9uIEFjdGlvbg0KLXB1Ymxpc2hDb25maWdBY3Rpb249JlB1YmJsaWNhLi4uDQotcHVibGlzaENvbmZpZ0FjdGlvblRvb2x0aXA9UHViYmxpY2EgdW4gc2l0byBXZWIgcGVyIHVuYSBjb25maWd1cmF6aW9uZQ0KLQ0KLSMgUHJlZmVyZW5jZSBQYWdlDQotcHVibGlzaGluZ09wdGlvbnM9T3B6aW9uaSBkaSBwdWJibGljYXppb25lDQotDQotIyBQdWJsaXNoaW5nIEFjdGlvbnMNCi1jb25maWdBY3Rpb25TZXQ9Q29uZmlndXJhemlvbmUNCi1jb25maWdNZW51PSZDb25maWd1cmF6aW9uZQ0KLQ0KLSMgUHJpbnQgQ29uZmlndXJhdGlvbiBBY3Rpb24NCi1wcmludENvbmZpZ0FjdGlvbj1TdGFtcGENCi0NCi0jIHRoZSB0aXRsZSBmb3IgdGhlIHB1Ymxpc2hlZCBzaXRlDQotI2Rvbid0IGRlZmluZSBoZXJlLCBsZXQgdXNlciBzcGVjaWZ5IGl0Lg0KLSN0aXRsZT1PcGVuVVAvQmFzaWMNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBEZWZhdWx0IFB1Ymxpc2ggUGF0aA0KLXB1Ymxpc2hQYXRoPTx1c2VyLmhvbWU+LzxhcHAubmFtZT4vUHVibGlzaA0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM2NWY2MTIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBQdWJsaXNoaW5nIFVJDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBEZWZhdWx0IGZlZWRiYWNrIFVSTA0KLWZlZWRiYWNrVVJMPWh0dHA6Ly93d3cucHVibGlzaGVkX3dlYnNpdGUuY29tL2ZlZWRiYWNrDQotDQotIyBQdWJsaXNoIENvbmZpZ3VyYXRpb24gQWN0aW9uDQotcHVibGlzaENvbmZpZ0FjdGlvbj1cdTUxNmNcdTk1OGIoJlApLi4uDQotcHVibGlzaENvbmZpZ0FjdGlvblRvb2x0aXA9XHU2OWNiXHU2MjEwXHUzMDU5XHUzMDhiIFdlYiBcdTMwYjVcdTMwYTRcdTMwYzhcdTMwOTJcdTUxNmNcdTk1OGJcdTMwNTdcdTMwN2VcdTMwNTkNCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLXB1Ymxpc2hpbmdPcHRpb25zPVx1NTE2Y1x1OTU4Ylx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmMw0KLQ0KLSMgUHVibGlzaGluZyBBY3Rpb25zDQotY29uZmlnQWN0aW9uU2V0PVx1NjljYlx1NjIxMA0KLWNvbmZpZ01lbnU9XHU2OWNiXHU2MjEwKCZDKQ0KLQ0KLSMgUHJpbnQgQ29uZmlndXJhdGlvbiBBY3Rpb24NCi1wcmludENvbmZpZ0FjdGlvbj1cdTUzNzBcdTUyMzcNCi0NCi0jIHRoZSB0aXRsZSBmb3IgdGhlIHB1Ymxpc2hlZCBzaXRlDQotI2Rvbid0IGRlZmluZSBoZXJlLCBsZXQgdXNlciBzcGVjaWZ5IGl0Lg0KLSN0aXRsZT1PcGVuVVAvQmFzaWMNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBEZWZhdWx0IFB1Ymxpc2ggUGF0aA0KLXB1Ymxpc2hQYXRoPTx1c2VyLmhvbWU+LzxhcHAubmFtZT4vUHVibGlzaA0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU4NTQ0OGUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdWFjZjVcdWFjMWMgVUkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIERlZmF1bHQgZmVlZGJhY2sgVVJMDQotZmVlZGJhY2tVUkw9aHR0cDovL3d3dy5wdWJsaXNoZWRfd2Vic2l0ZS5jb20vZmVlZGJhY2sNCi0NCi0jIFB1Ymxpc2ggQ29uZmlndXJhdGlvbiBBY3Rpb24NCi1wdWJsaXNoQ29uZmlnQWN0aW9uPVx1YWNmNVx1YWMxYygmUCkuLi4NCi1wdWJsaXNoQ29uZmlnQWN0aW9uVG9vbHRpcD1cdWFkNmNcdWMxMzFcdWM1ZDAgXHViMzAwXHVkNTVjIFx1YzZmOSBcdWMwYWNcdWM3NzRcdWQyYjggXHVhY2Y1XHVhYzFjDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1wdWJsaXNoaW5nT3B0aW9ucz1cdWFjZjVcdWFjMWMgXHVjNjM1XHVjMTU4DQotDQotIyBQdWJsaXNoaW5nIEFjdGlvbnMNCi1jb25maWdBY3Rpb25TZXQ9XHVhZDZjXHVjMTMxDQotY29uZmlnTWVudT1cdWFkNmNcdWMxMzEoJkMpDQotDQotIyBQcmludCBDb25maWd1cmF0aW9uIEFjdGlvbg0KLXByaW50Q29uZmlnQWN0aW9uPVx1Yzc3OFx1YzFjNA0KLQ0KLSMgdGhlIHRpdGxlIGZvciB0aGUgcHVibGlzaGVkIHNpdGUNCi0jZG9uJ3QgZGVmaW5lIGhlcmUsIGxldCB1c2VyIHNwZWNpZnkgaXQuDQotI3RpdGxlPU9wZW5VUC9CYXNpYw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIERlZmF1bHQgUHVibGlzaCBQYXRoDQotcHVibGlzaFBhdGg9PHVzZXIuaG9tZT4vPGFwcC5uYW1lPi9QdWJsaXNoDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDBhMzdjNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9VUkgZGUgUHVibGljYVx1MDBlN1x1MDBlM28gRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBEZWZhdWx0IGZlZWRiYWNrIFVSTA0KLWZlZWRiYWNrVVJMPWh0dHA6Ly93d3cucHVibGlzaGVkX3dlYnNpdGUuY29tL2ZlZWRiYWNrDQotDQotIyBQdWJsaXNoIENvbmZpZ3VyYXRpb24gQWN0aW9uDQotcHVibGlzaENvbmZpZ0FjdGlvbj0mUHVibGljYXIuLi4NCi1wdWJsaXNoQ29uZmlnQWN0aW9uVG9vbHRpcD1QdWJsaWNhciB1bSBXZWIgc2l0ZSBwYXJhIHVtYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1wdWJsaXNoaW5nT3B0aW9ucz1PcFx1MDBlN1x1MDBmNWVzIGRlIFB1YmxpY2FcdTAwZTdcdTAwZTNvDQotDQotIyBQdWJsaXNoaW5nIEFjdGlvbnMNCi1jb25maWdBY3Rpb25TZXQ9Q29uZmlndXJhXHUwMGU3XHUwMGUzbw0KLWNvbmZpZ01lbnU9JkNvbmZpZ3VyYVx1MDBlN1x1MDBlM28NCi0NCi0jIFByaW50IENvbmZpZ3VyYXRpb24gQWN0aW9uDQotcHJpbnRDb25maWdBY3Rpb249SW1wcmltaXINCi0NCi0jIHRoZSB0aXRsZSBmb3IgdGhlIHB1Ymxpc2hlZCBzaXRlDQotI2Rvbid0IGRlZmluZSBoZXJlLCBsZXQgdXNlciBzcGVjaWZ5IGl0Lg0KLSN0aXRsZT1PcGVuVVAvQmFzaWMNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBEZWZhdWx0IFB1Ymxpc2ggUGF0aA0KLXB1Ymxpc2hQYXRoPTx1c2VyLmhvbWU+LzxhcHAubmFtZT4vUHVibGlzaA0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmNjlkZWEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdTUzZDFcdTVlMDNcdTc1MjhcdTYyMzdcdTc1NGNcdTk3NjINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIERlZmF1bHQgZmVlZGJhY2sgVVJMDQotZmVlZGJhY2tVUkw9aHR0cDovL3d3dy5wdWJsaXNoZWRfd2Vic2l0ZS5jb20vZmVlZGJhY2sNCi0NCi0jIFB1Ymxpc2ggQ29uZmlndXJhdGlvbiBBY3Rpb24NCi1wdWJsaXNoQ29uZmlnQWN0aW9uPVx1NTNkMVx1NWUwMygmUCkuLi4NCi1wdWJsaXNoQ29uZmlnQWN0aW9uVG9vbHRpcD1cdTUzZDFcdTVlMDNcdTkxNGRcdTdmNmVcdTc2ODQgV2ViIFx1N2FkOVx1NzBiOQ0KLQ0KLSMgUHJlZmVyZW5jZSBQYWdlDQotcHVibGlzaGluZ09wdGlvbnM9XHU1M2QxXHU1ZTAzXHU5MDA5XHU5ODc5DQotDQotIyBQdWJsaXNoaW5nIEFjdGlvbnMNCi1jb25maWdBY3Rpb25TZXQ9XHU5MTRkXHU3ZjZlDQotY29uZmlnTWVudT1cdTkxNGRcdTdmNmUoJkMpDQotDQotIyBQcmludCBDb25maWd1cmF0aW9uIEFjdGlvbg0KLXByaW50Q29uZmlnQWN0aW9uPVx1NjI1M1x1NTM3MA0KLQ0KLSMgdGhlIHRpdGxlIGZvciB0aGUgcHVibGlzaGVkIHNpdGUNCi0jZG9uJ3QgZGVmaW5lIGhlcmUsIGxldCB1c2VyIHNwZWNpZnkgaXQuDQotI3RpdGxlPU9wZW5VUC9CYXNpYw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIERlZmF1bHQgUHVibGlzaCBQYXRoDQotcHVibGlzaFBhdGg9PHVzZXIuaG9tZT4vPGFwcC5uYW1lPi9QdWJsaXNoDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGM2MzU4MS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFB1Ymxpc2hpbmcgVUkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIERlZmF1bHQgZmVlZGJhY2sgVVJMDQotZmVlZGJhY2tVUkw9aHR0cDovL3d3dy5wdWJsaXNoZWRfd2Vic2l0ZS5jb20vZmVlZGJhY2sNCi0NCi0jIFB1Ymxpc2ggQ29uZmlndXJhdGlvbiBBY3Rpb24NCi1wdWJsaXNoQ29uZmlnQWN0aW9uPVx1NzY3Y1x1NGY0OCgmUCkuLi4NCi1wdWJsaXNoQ29uZmlnQWN0aW9uVG9vbHRpcD1cdTc2N2NcdTRmNDhcdTkxNGRcdTdmNmVcdTdkYjJcdTdhZDkNCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLXB1Ymxpc2hpbmdPcHRpb25zPVx1NzY3Y1x1NGY0OFx1OTA3OFx1OTgwNQ0KLQ0KLSMgUHVibGlzaGluZyBBY3Rpb25zDQotY29uZmlnQWN0aW9uU2V0PVx1OTE0ZFx1N2Y2ZQ0KLWNvbmZpZ01lbnU9XHU5MTRkXHU3ZjZlKCZDKQ0KLQ0KLSMgUHJpbnQgQ29uZmlndXJhdGlvbiBBY3Rpb24NCi1wcmludENvbmZpZ0FjdGlvbj1cdTUyMTdcdTUzNzANCi0NCi0jIHRoZSB0aXRsZSBmb3IgdGhlIHB1Ymxpc2hlZCBzaXRlDQotI2Rvbid0IGRlZmluZSBoZXJlLCBsZXQgdXNlciBzcGVjaWZ5IGl0Lg0KLSN0aXRsZT1PcGVuVVAvQmFzaWMNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBEZWZhdWx0IFB1Ymxpc2ggUGF0aA0KLXB1Ymxpc2hQYXRoPTx1c2VyLmhvbWU+LzxhcHAubmFtZT4vUHVibGlzaA0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfZGUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDE4MWJhMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYXRpb24gV2l6YXJkDQotcHVibGlzaENvbmZpZ1dpemFyZF90aXRsZT1NZXRob2RlbmtvbmZpZ3VyYXRpb24gdmVyXHUwMGY2ZmZlbnRsaWNoZW4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9TWV0aG9kZW5rb25maWd1cmF0aW9uIGF1c3dcdTAwZTRobGVuDQotcHVibGlzaENvbmZpZ1dpemFyZF9zZWxlY3RDb25maWdQYWdlX3RleHQ9V1x1MDBlNGhsZW4gU2llIGRpZSB6dSB2ZXJcdTAwZjZmZmVudGxpY2hlbmRlIE1ldGhvZGVua29uZmlndXJhdGlvbiBhdXMuDQotcHVibGlzaENvbmZpZ1dpemFyZF9zZWxlY3RPcHRpb25zUGFnZV90aXRsZT1WZXJcdTAwZjZmZmVudGxpY2h1bmdzb3B0aW9uZW4gYW5nZWJlbg0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0T3B0aW9uc1BhZ2VfdGV4dD1HZWJlbiBTaWUgZGFzIFppZWx2ZXJ6ZWljaG5pcyB1bmQgZGllIFZlclx1MDBmNmZmZW50bGljaHVuZ3NvcHRpb25lbiBhbi4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX21ldGhvZENvbmZpZ190ZXh0PU1ldGhvZGVua29uZmlndXJhdGlvbjoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2Rlc3RpbmF0aW9uR3JvdXBfdGV4dD1aaWVsdmVyemVpY2huaXMNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2RpcmVjdG9yeV90ZXh0PVBmYWQ6DQotcHVibGlzaENvbmZpZ1dpemFyZF91c2VEZWZhdWx0UGF0aF90ZXh0PVN0YW5kYXJkcGZhZCB2ZXJ3ZW5kZW4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3dlYlNpdGVfdGV4dD1WZXJcdTAwZjZmZmVudGxpY2h0ZSBXZWJzaXRlDQotcHVibGlzaENvbmZpZ1dpemFyZF90aXRsZV90ZXh0PVRpdGVsOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfYmFubmVySW1hZ2VfdGV4dD1CYW5uZXItR3JhZmlrOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfYWJvdXRIVE1MX3RleHQ9SW5mb3JtYXRpb25lbiB6dW0gSW5oYWx0Og0KLXB1Ymxpc2hDb25maWdXaXphcmRfZmVlZGJhY2tVUkxfdGV4dD1GZWVkYmFjay1VUkw6DQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlSW5kZXhfdGV4dD1JbmRleHNlaXRlIHZlclx1MDBmNmZmZW50bGljaGVuDQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlR2xvc3NhcnlfdGV4dD1HbG9zc2Fyc2VpdGUgdmVyXHUwMGY2ZmZlbnRsaWNoZW4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVTZWFyY2hfdGV4dD1TdWNoZnVua3Rpb25lbiBlaW5zY2hsaWVcdTAwZGZlbiAoc2V0enQgVW50ZXJzdFx1MDBmY3R6dW5nIGZcdTAwZmNyIEphdmEtQXBwbGV0cyBpbSBCcm93c2VyIHZvcmF1cykNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3VzZUFwcGxldF90ZXh0PUFucGFzc3VuZyB2b24gU2ljaHRlbiB1bnRlcnN0XHUwMGZjdHplbiAoc2V0enQgVW50ZXJzdFx1MDBmY3R6dW5nIGZcdTAwZmNyIEphdmEtQXBwbGV0cyBpbSBCcm93c2VyIHZvcmF1cykNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3ZhbGlkYXRpb25Hcm91cF90ZXh0PVZhbGlkaWVydW5nDQotcHVibGlzaENvbmZpZ1dpemFyZF9jaGVja0h5cGVybGlua3NfdGV4dD1FeHRlcm5lIEh5cGVybGlua3MgcHJcdTAwZmNmZW4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2RpYWdyYW1Hcm91cF90ZXh0PURpYWdyYW1tZQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlfZGRfdGV4dD1Ba3Rpdml0XHUwMGU0dHNkZXRhaWxkaWFncmFtbWUgdmVyXHUwMGY2ZmZlbnRsaWNoZW4sIGRpZSBpbSBQcm96ZXNzZWRpdG9yIG5pY2h0IGVyc3RlbGx0IHd1cmRlbi4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3B1Ymxpc2hfZXh0ZW5kX2FjdGl2aXR5X2RpYWdyYW09QWt0aXZpdFx1MDBlNHRzZGlhZ3JhbW1lIGZcdTAwZmNyIG5pY2h0IGdlXHUwMGU0bmRlcnRlIEFrdGl2aXRcdTAwZTR0c2Vyd2VpdGVydW5nZW4gdmVyXHUwMGY2ZmZlbnRsaWNoZW4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2NvbnZlcnRCcm9rZW5MaW5rc190ZXh0PURlZmVrdGUgTGlua3MgaW4gS2xhcnRleHQga29udmVydGllcmVuDQotcHVibGlzaENvbmZpZ1dpemFyZF9sYXlvdXRfdGV4dD1MYXlvdXQNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2V4dHJhRGVzY3JpcHRvckluZm9fdGV4dD1EZXNrcmlwdG9yZW4gbWl0IGRlbSB2b2xsc3RcdTAwZTRuZGlnZW4gSW5oYWx0IGRlcyB6dWdlaFx1MDBmNnJpZ2VuIE1ldGhvZGVuaW5oYWx0c2VsZW1lbnRzIHZlclx1MDBmNmZmZW50bGljaGVuDQotcHVibGlzaENvbmZpZ1dpemFyZF9saWdodFdlaWdodFRyZWVfdGV4dD1VbnRlcmdlb3JkbmV0ZSBCYXVtc3RydWt0dXIgZlx1MDBmY3IgQXVmZ2FiZW4tLCBSb2xsZW4tLCBBcmJlaXRzZXJnZWJuaXMtIHVuZCBEaXN6aXBsaW5lbGVtZW50ZSBvaG5lIE9yZG5lciBnZW5lcmllcmVuDQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlRW1wdHlDYXRlZ29yaWVzX3RleHQ9S2F0ZWdvcmllbiBvaG5lIGthdGVnb3Jpc2llcnRlIEVsZW1lbnRlIHZlclx1MDBmNmZmZW50bGljaGVuDQotDQotIyBwdWJsaXNoIHByb2Nlc3Mgd2l6YXJkIHBhZ2UNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfdGl0bGU9VmVyXHUwMGY2ZmZlbnRsaWNodW5nc3R5cCBhdXN3XHUwMGU0aGxlbg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV90ZXh0PVNpZSBrXHUwMGY2bm5lbiBkaWUgYXVzZ2V3XHUwMGU0aGx0ZSBLb25maWd1cmF0aW9uIG9kZXIgZGllIGFuZ2VnZWJlbmVuIFByb3plc3NlIGluIGRlciBLb25maWd1cmF0aW9uIHZlclx1MDBmNmZmZW50bGljaGVuLg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9jYXBhYmlsaXR5X3BhdHRlcm49UHJvemVzc211c3Rlcg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9kZWxpdmVyeV9wcm9jZXNzPUJlcmVpdHN0ZWxsdW5nc3Byb3plc3NlDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3NlbGVjdFR5cGU9VmVyXHUwMGY2ZmZlbnRsaWNodW5nc3R5cCBhdXN3XHUwMGU0aGxlbg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF90eXBlX3Byb2Nlc3Nlcz1Gb2xnZW5kZSBhdXNnZXdcdTAwZTRobHRlIFByb3plc3NlIHZlclx1MDBmNmZmZW50bGljaGVuOg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF90eXBlX2NvbmZpZz1BdXNnZXdcdTAwZTRobHRlIEtvbmZpZ3VyYXRpb24gdmVyXHUwMGY2ZmZlbnRsaWNoZW4NCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfcHVibGlzaF9iYXNlX3Byb2Nlc3Nlcz1SZWZlcmVuemllcnRlIEJhc2lzcHJvemVzc2UgdmVyXHUwMGY2ZmZlbnRsaWNoZW4NCi0NCi0jIFB1Ymxpc2hpbmcgUHJlZmVyZW5jZSBQYWdlDQotcHJlZmVyZW5jZVBhZ2VfZGVmYXVsdFBhdGhfdGV4dD1TdGFuZGFyZHBmYWQ6DQotDQotIyBDb25maXJtYXRpb24gRGlhbG9ncw0KLXB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU9TWV0aG9kZW5rb25maWd1cmF0aW9uIHZlclx1MDBmNmZmZW50bGljaGVuDQotY29uZmlybVBhdGhEaWFsb2dfdGV4dD1EZXIgWmllbHBmYWQgd3VyZGUgaW4gJyd7MH0nJyBhdWZnZWxcdTAwZjZzdC4gRm9ydGZhaHJlbj8NCi1vdmVyd3JpdGVEaWFsb2dfdGV4dD1EZXIgWmllbHBmYWQgJyd7MH0nJyBpc3QgYmVyZWl0cyB2b3JoYW5kZW4uIEVzIHdlcmRlbiBhbGxlIERhdGVpZW4gaW0gT3JkbmVyIGdlbFx1MDBmNnNjaHQuIEZvcnRmYWhyZW4/DQotY2FuY2VsUHVibGlzaENvbmZpZ19tc2c9RGllIFZlclx1MDBmNmZmZW50bGljaHVuZ3NvcGVyYXRpb24gd3VyZGUgYWJnZWJyb2NoZW4uDQotDQotIyBFcnJvciBEaWFsb2dzDQotcHJldmlld0NvbmZpZ0Vycm9yX3RpdGxlPVZlclx1MDBmNmZmZW50bGljaHRlIE1ldGhvZGVua29uZmlndXJhdGlvbiB2b3JhbnplaWdlbg0KLXZpZXdSZXBvcnRFcnJvcl90aXRsZT1WZXJcdTAwZjZmZmVudGxpY2h1bmdzYmVyaWNodCBhbnplaWdlbg0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1taXNzaW5nVmlld0Vycm9yX21zZz1JVVBQMDEwMFc6IERpZSBhdXNnZXdcdTAwZTRobHRlIEtvbmZpZ3VyYXRpb24gZW50aFx1MDBlNGx0IGtlaW5lIGdcdTAwZmNsdGlnZSBTaWNodC4gQmVhcmJlaXRlbiBTaWUgZGllIEtvbmZpZ3VyYXRpb24gdW5kIGZcdTAwZmNnZW4gU2llIGVpbmUgU2ljaHQgaGluenUgb2RlciB3XHUwMGU0aGxlbiBTaWUgZWluZSBhbmRlcmUgS29uZmlndXJhdGlvbiBhdXMuDQotY2Fubm90UHVibGlzaEVycm9yX21zZz1JVVBQMDEwMUU6IERpZSBhdXNnZXdcdTAwZTRobHRlIEtvbmZpZ3VyYXRpb24ga2FubiBuaWNodCB2ZXJcdTAwZjZmZmVudGxpY2h0IHdlcmRlbi4NCi1pbnZhbGlkUGF0aEVycm9yX21zZz1JVVBQMDEwMkU6IERlciBaaWVscGZhZCBpc3QgbGVlciBvZGVyIHVuZ1x1MDBmY2x0aWcuDQotaW52YWxpZFBhdGhDaGFyc0Vycm9yX21zZz1JVVBQMDEwM0U6IERlciBaaWVscGZhZCBkYXJmIGRpZSBmb2xnZW5kZW4gWmVpY2hlbiBuaWNodCBlbnRoYWx0ZW46IFxcICMgKiA/ICIgPCA+IHwgISAlIC8NCi1wdWJsaXNoQ29uZmlnRXJyb3JfbXNnPUlVUFAwMTA0RTogRGllIGF1c2dld1x1MDBlNGhsdGUgS29uZmlndXJhdGlvbiB3dXJkZSBuaWNodCBvcmRudW5nc2dlbVx1MDBlNFx1MDBkZiB2ZXJcdTAwZjZmZmVudGxpY2h0Lg0KLXByZXZpZXdDb25maWdFcnJvcl9tc2c9SVVQUDAxMDVFOiBFcyBrYW5uIGtlaW4gSFRNTC1Ccm93c2VyIGZcdTAwZmNyIGRpZSBWb3JhbnplaWdlIGRlciB2ZXJcdTAwZjZmZmVudGxpY2h0ZW4gS29uZmlndXJhdGlvbiBnZVx1MDBmNmZmbmV0IHdlcmRlbi4NCi12aWV3UmVwb3J0RXJyb3JfbXNnPUlVUFAwMTA2RTogRXMga2FubiBrZWluIEhUTUwtQnJvd3NlciB6dW0gQW56ZWlnZW4gZGVzIFZlclx1MDBmNmZmZW50bGljaHVuZ3NiZXJpY2h0cyBnZVx1MDBmNmZmbmV0IHdlcmRlbi4NCi0NCi0jIEVycm9yIFJlYXNvbnMgJiBSZWNvbW1lbmRlZCBBY3Rpb25zDQotcHVibGlzaENvbmZpZ0Vycm9yX3JlYXNvbj1JVVBQMDEwN0U6IEVzIGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLiBLbGlja2VuIFNpZSBhdWYgZGllIFNjaGFsdGZsXHUwMGU0Y2hlIERldGFpbHMsIHVtIHdlaXRlcmUgSW5mb3JtYXRpb25lbiB6dSBlcmhhbHRlbi4NCi1kZWxldGVGaWxlc0Vycm9yX3JlYXNvbj1EZXIgWmllbHBmYWQgJyd7MH0nJyBlbnRoXHUwMGU0bHQgRGF0ZWllbiwgZGllIG5pY2h0IGdlbFx1MDBmNnNjaHQgd2VyZGVuIGtcdTAwZjZubmVuLlxuXG5TY2hsaWVcdTAwZGZlbiBTaWUgZGVuIERpYWxvZyB1bmQgZ2ViZW4gU2llIGVpbmVuIGFuZGVyZW4gUGZhZCBhbi4NCi1jcmVhdGVEaXJFcnJvcl9yZWFzb249RGVyIFppZWxwZmFkICcnezB9Jycga2FubiBuaWNodCBlcnN0ZWxsdCB3ZXJkZW4uXG5cblNjaGxpZVx1MDBkZmVuIFNpZSBkZW4gRGlhbG9nIHVuZCBnZWJlbiBTaWUgZWluZW4gYW5kZXJlbiBQZmFkIGFuLg0KLW9wZW5Ccm93c2VyRXJyb3JfcmVhc29uPURlciBIVE1MLVN0YW5kYXJkLUJyb3dzZXIgYXVmIGRpZXNlbSBTeXN0ZW0gd3VyZGUgbmljaHQgZ2VmdW5kZW4uXG5cblNjaGxpZVx1MDBkZmVuIFNpZSBkZW4gRGlhbG9nIHVuZCBcdTAwZjZmZm5lbiBTaWUgZGllIERhdGVpICcnezB9JycgbWFudWVsbCBpbiBlaW5lbSBIVE1MLUJyb3dzZXIuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOGFhODU1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlPVB1YmxpY2FyIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kbw0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1TZWxlY2Npb25hciBjb25maWd1cmFjaVx1MDBmM24gZGUgbVx1MDBlOXRvZG8NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGV4dD1TZWxlY2Npb25lIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kbyBxdWUgZGVzZWEgcHVibGljYXIuDQotcHVibGlzaENvbmZpZ1dpemFyZF9zZWxlY3RPcHRpb25zUGFnZV90aXRsZT1Fc3BlY2lmaWNhciBvcGNpb25lcyBkZSBwdWJsaWNhY2lcdTAwZjNuDQotcHVibGlzaENvbmZpZ1dpemFyZF9zZWxlY3RPcHRpb25zUGFnZV90ZXh0PUVzcGVjaWZpcXVlIGVsIGRpcmVjdG9yaW8gZGUgZGVzdGlubyB5IGxhcyBvcGNpb25lcyBkZSBwdWJsaWNhY2lcdTAwZjNuLg0KLXB1Ymxpc2hDb25maWdXaXphcmRfbWV0aG9kQ29uZmlnX3RleHQ9Q29uZmlndXJhY2lcdTAwZjNuIGRlIG1cdTAwZTl0b2RvOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGVzdGluYXRpb25Hcm91cF90ZXh0PURpcmVjdG9yaW8gZGUgZGVzdGlubw0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlyZWN0b3J5X3RleHQ9Vlx1MDBlZGEgZGUgYWNjZXNvOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfdXNlRGVmYXVsdFBhdGhfdGV4dD1Vc2FyIGxhIHByZWRldGVybWluYWRhDQotcHVibGlzaENvbmZpZ1dpemFyZF93ZWJTaXRlX3RleHQ9U2l0aW8gd2ViIHB1YmxpY2Fkbw0KLXB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGVfdGV4dD1UXHUwMGVkdHVsbzoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2Jhbm5lckltYWdlX3RleHQ9SW1hZ2VuIGRlbCBtZW5zYWplIGRlIGNhYmVjZXJhOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfYWJvdXRIVE1MX3RleHQ9QWNlcmNhIGRlbCBjb250ZW5pZG86DQotcHVibGlzaENvbmZpZ1dpemFyZF9mZWVkYmFja1VSTF90ZXh0PVVSTCBkZSBpbmZvcm1hY2lcdTAwZjNuIGRlIHJldG9ybm86DQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlSW5kZXhfdGV4dD1QdWJsaWNhciBwXHUwMGUxZ2luYSBkZWwgXHUwMGVkbmRpY2UNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVHbG9zc2FyeV90ZXh0PVB1YmxpY2FyIHBcdTAwZTFnaW5hIGRlIGdsb3NhcmlvDQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlU2VhcmNoX3RleHQ9SW5jbHVpciBjYXBhY2lkYWQgZGUgYlx1MDBmYXNxdWVkYSAocmVxdWllcmUgcXVlIGVsIG5hdmVnYWRvciBzb3BvcnRlIGVsIGFwcGxldCBKYXZhKQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfdXNlQXBwbGV0X3RleHQ9U29wb3J0YXIgcGVyc29uYWxpemFjaVx1MDBmM24gZGUgbGEgdmlzdGEgKHJlcXVpZXJlIHF1ZSBlbCBuYXZlZ2Fkb3Igc29wb3J0ZSBlbCBhcHBsZXQgSmF2YSkNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3ZhbGlkYXRpb25Hcm91cF90ZXh0PVZhbGlkYWNpXHUwMGYzbg0KLXB1Ymxpc2hDb25maWdXaXphcmRfY2hlY2tIeXBlcmxpbmtzX3RleHQ9Q29tcHJvYmFyIGhpcGVyZW5sYWNlcyBleHRlcm5vcw0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlhZ3JhbUdyb3VwX3RleHQ9RGlhZ3JhbWFzDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eV9kZF90ZXh0PVB1YmxpY2FyIGRpYWdyYW1hcyBkZSBkZXRhbGxlcyBkZSBsYSBhY3RpdmlkYWQgcXVlIG5vIHNlIGhheWFuIGNyZWFkbyBlbiBlbCBlZGl0b3IgZGUgcHJvY2Vzb3MNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3B1Ymxpc2hfZXh0ZW5kX2FjdGl2aXR5X2RpYWdyYW09UHVibGljYXIgZGlhZ3JhbWFzIGRlIGFjdGl2aWRhZCBwYXJhIGV4dGVuc2lvbmVzIGRlIGFjdGl2aWRhZCBxdWUgbm8gc2UgaGFuIG1vZGlmaWNhZG8NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2NvbnZlcnRCcm9rZW5MaW5rc190ZXh0PUNvbnZlcnRpciBlbmxhY2VzIHJvdG9zIGEgdGV4dG8gc2luIGZvcm1hdG8NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2xheW91dF90ZXh0PURpc2VcdTAwZjFvDQotcHVibGlzaENvbmZpZ1dpemFyZF9leHRyYURlc2NyaXB0b3JJbmZvX3RleHQ9UHVibGljYXIgZGVzY3JpcHRvcmVzIGNvbiBlbCBjb250ZW5pZG8gY29tcGxldG8gZGVsIGVsZW1lbnRvIGRlIGNvbnRlbmlkbyBkZSBtXHUwMGU5dG9kbyByZWxhY2lvbmFkbw0KLXB1Ymxpc2hDb25maWdXaXphcmRfbGlnaHRXZWlnaHRUcmVlX3RleHQ9R2VuZXJhciBlc3RydWN0dXJhIGRlIHN1Ylx1MDBlMXJib2wgcGFyYSBlbGVtZW50b3MgZGUgdGFyZWEsIHJvbCwgcHJvZHVjdG8gZGUgdHJhYmFqbyB5IGRpc2NpcGxpbmEgc2luIHV0aWxpemFyIGNhcnBldGFzLg0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZUVtcHR5Q2F0ZWdvcmllc190ZXh0PVB1YmxpY2FyIGNhdGVnb3JcdTAwZWRhcyBzaW4gZWxlbWVudG9zIGNhdGVnb3JpemFkb3MNCi0NCi0jIHB1Ymxpc2ggcHJvY2VzcyB3aXphcmQgcGFnZQ0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV90aXRsZT1TZWxlY2Npb25hciB0aXBvIGRlIHB1YmxpY2FjaVx1MDBmM24NCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfdGV4dD1QdWVkZSBwdWJsaWNhciBsYSBjb25maWd1cmFjaVx1MDBmM24gc2VsZWNjaW9uYWRhIG8gbG9zIHByb2Nlc29zIGVzcGVjaWZpY2Fkb3MgZW4gbGEgY29uZmlndXJhY2lcdTAwZjNuDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX2NhcGFiaWxpdHlfcGF0dGVybj1QYXRyb25lcyBkZSBwb3NpYmlsaWRhZA0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9kZWxpdmVyeV9wcm9jZXNzPVByb2Nlc29zIGRlIGVudHJlZ2ENCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfc2VsZWN0VHlwZT1TZWxlY2Npb25hciB0aXBvIGRlIHB1YmxpY2FjaVx1MDBmM24NCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfdHlwZV9wcm9jZXNzZXM9UHVibGljYXIgbG9zIHByb2Nlc29zIHNlbGVjY2lvbmFkb3MgbVx1MDBlMXMgYWJham86DQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3R5cGVfY29uZmlnPVB1YmxpY2FyIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBzZWxlY2Npb25hZGENCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfcHVibGlzaF9iYXNlX3Byb2Nlc3Nlcz1QdWJsaWNhciBwcm9jZXNvcyBkZSBiYXNlIHJlZmVyZW5jaWFkYQ0KLQ0KLSMgUHVibGlzaGluZyBQcmVmZXJlbmNlIFBhZ2UNCi1wcmVmZXJlbmNlUGFnZV9kZWZhdWx0UGF0aF90ZXh0PVZcdTAwZWRhIGRlIGFjY2VzbyBwb3Igb21pc2lcdTAwZjNuOg0KLQ0KLSMgQ29uZmlybWF0aW9uIERpYWxvZ3MNCi1wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlPVB1YmxpY2FyIGNvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kbw0KLWNvbmZpcm1QYXRoRGlhbG9nX3RleHQ9TGEgdlx1MDBlZGEgZGUgYWNjZXNvIGRlIGRlc3Rpbm8gc2UgcmVzdWVsdG8gZW4gJyd7MH0nJy4gXHUwMGJmRGVzZWEgY29udGludWFyPw0KLW92ZXJ3cml0ZURpYWxvZ190ZXh0PUxhIGRlIGFjY2VzbyBkZSBkZXN0aW5vICcnezB9JycgeWEgZXhpc3RlLiBTZSBzdXByaW1pclx1MDBlMW4gdG9kb3MgbG9zIGFyY2hpdm9zIGRlIGxhIGNhcnBldGEuIFx1MDBiZkRlc2VhIGNvbnRpbnVhcj8NCi1jYW5jZWxQdWJsaXNoQ29uZmlnX21zZz1MYSBvcGVyYWNpXHUwMGYzbiBkZSBwdWJsaWNhY2lcdTAwZjNuIHNlIGhhIGNhbmNlbGFkby4NCi0NCi0jIEVycm9yIERpYWxvZ3MNCi1wcmV2aWV3Q29uZmlnRXJyb3JfdGl0bGU9UHJldmlzdWFsaXphciBsYSBjb25maWd1cmFjaVx1MDBmM24gZGUgbVx1MDBlOXRvZG8gcHVibGljYWRhDQotdmlld1JlcG9ydEVycm9yX3RpdGxlPVZlciBlbCBpbmZvcm1lIGRlIHB1YmxpY2FjaVx1MDBmM24NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbWlzc2luZ1ZpZXdFcnJvcl9tc2c9SVVQUDAxMDBXOiBMYSBjb25maWd1cmFjaVx1MDBmM24gc2VsZWNjaW9uYWRhIG5vIGNvbnRpZW5lIHVuYSB2aXN0YSB2XHUwMGUxbGlkYS4gRWRpdGUgbGEgY29uZmlndXJhY2lcdTAwZjNuIHkgYVx1MDBmMWFkYSB1bmEgdmlzdGEgbyBzZWxlY2Npb25lIG90cmEgY29uZmlndXJhY2lcdTAwZjNuLg0KLWNhbm5vdFB1Ymxpc2hFcnJvcl9tc2c9SVVQUDAxMDFFOiBMYSBjb25maWd1cmFjaVx1MDBmM24gc2VsZWNjaW9uYWRhIG5vIHNlIHB1ZWRlIHB1YmxpY2FyLg0KLWludmFsaWRQYXRoRXJyb3JfbXNnPUlVUFAwMTAyRTogTGEgdlx1MDBlZGEgZGUgYWNjZXNvIGRlIGRlc3Rpbm8gZXN0XHUwMGUxIGVuIGJsYW5jbyBvIG5vIGVzIHZcdTAwZTFsaWRhLg0KLWludmFsaWRQYXRoQ2hhcnNFcnJvcl9tc2c9SVVQUDAxMDNFOiBMYSB2XHUwMGVkYSBkZSBhY2Nlc28gZGUgZGVzdGlubyBubyBwdWVkZSBjb250ZW5lciBlc3RvcyBjYXJhY3RlcmVzOiAjICogPyAiIDwgPiB8ICEgJSAvDQotcHVibGlzaENvbmZpZ0Vycm9yX21zZz1JVVBQMDEwNEU6IExhIGNvbmZpZ3VyYWNpXHUwMGYzbiBzZWxlY2Npb25hZGEgbm8gc2UgaGEgcHVibGljYWRvIHNhdGlzZmFjdG9yaWFtZW50ZS4NCi1wcmV2aWV3Q29uZmlnRXJyb3JfbXNnPUlVUFAwMTA1RTogTm8gc2UgaGEgcG9kaWRvIGFicmlyIHVuIG5hdmVnYWRvciBIVE1MIHBhcmEgdmlzdWFsaXphciBsYSB2aXN0YSBwcmVsaW1pbmFyIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbiBwdWJsaWNhZGEuDQotdmlld1JlcG9ydEVycm9yX21zZz1JVVBQMDEwNkU6IE5vIHNlIGhhIHBvZGlkbyBhYnJpciB1biBuYXZlZ2Fkb3IgSFRNTCBwYXJhIHZlciBlbCBpbmZvcm1lIGRlIHB1YmxpY2FjaVx1MDBmM24uDQotDQotIyBFcnJvciBSZWFzb25zICYgUmVjb21tZW5kZWQgQWN0aW9ucw0KLXB1Ymxpc2hDb25maWdFcnJvcl9yZWFzb249SVVQUDAxMDdFOiBTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IuIFB1bHNlIGVsIGJvdFx1MDBmM24gRGV0YWxsZXMgcGFyYSBvYnRlbmVyIG1cdTAwZTFzIGluZm9ybWFjaVx1MDBmM24uDQotZGVsZXRlRmlsZXNFcnJvcl9yZWFzb249TGEgdlx1MDBlZGEgZGUgYWNjZXNvIGRlIGRlc3Rpbm8gJyd7MH0nJyBjb250aWVuZSBhcmNoaXZvcyBxdWUgbm8gc2UgcHVlZGVuIHN1cHJpbWlyLlxuXG5DaWVycmUgZXN0ZSBkaVx1MDBlMWxvZ28geSBlc3BlY2lmaXF1ZSBvdHJhIHZcdTAwZWRhIGRlIGFjY2Vzby4NCi1jcmVhdGVEaXJFcnJvcl9yZWFzb249Tm8gc2UgcHVlZGUgY3JlYXIgbGEgdlx1MDBlZGEgZGUgYWNjZXNvIGRlIGRlc3Rpbm8gJyd7MH0nJy5cblxuQ2llcnJlIGVzdGUgZGlcdTAwZTFsb2dvIHkgZXNwZWNpZmlxdWUgb3RyYSB2XHUwMGVkYSBkZSBhY2Nlc28uDQotb3BlbkJyb3dzZXJFcnJvcl9yZWFzb249Tm8gc2UgcHVlZGUgZGV0ZWN0YXIgbyBsb2NhbGl6YXIgZWwgbmF2ZWdhZG9yIEhUTUwgcG9yIG9taXNpXHUwMGYzbiBkZSBlc3RlIHNpc3RlbWEuXG5cbkNpZXJyZSBlc3RlIGRpXHUwMGUxbG9nbyB5IGFicmEgZWwgYXJjaGl2byAnJ3swfScnIG1hbnVhbG1lbnRlIGNvbiB1biBuYXZlZ2Fkb3IgSFRNTC4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhlMjNiNzAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQdWJsaXNoIE1ldGhvZCBDb25maWd1cmF0aW9uIFdpemFyZA0KLXB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGU9UHVibGllciBsYSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1TXHUwMGU5bGVjdGlvbm5lciBsYSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0PVNcdTAwZTlsZWN0aW9ubmV6IGxhIGNvbmZpZ3VyYXRpb24gZGUgbVx1MDBlOXRob2RlIHF1ZSB2b3VzIHNvdWhhaXRleiBwdWJsaWVyLg0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0T3B0aW9uc1BhZ2VfdGl0bGU9U3BcdTAwZTljaWZpZXIgbGVzIG9wdGlvbnMgZGUgcHVibGljYXRpb24NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdE9wdGlvbnNQYWdlX3RleHQ9U3BcdTAwZTljaWZpZXogbGUgclx1MDBlOXBlcnRvaXJlIGRlIGRlc3RpbmF0aW9uIGV0IGxlcyBvcHRpb25zIGRlIHB1YmxpY2F0aW9uLg0KLXB1Ymxpc2hDb25maWdXaXphcmRfbWV0aG9kQ29uZmlnX3RleHQ9Q29uZmlndXJhdGlvbiBkZSBtXHUwMGU5dGhvZGUgOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGVzdGluYXRpb25Hcm91cF90ZXh0PVJcdTAwZTlwZXJ0b2lyZSBkZSBkZXN0aW5hdGlvbg0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlyZWN0b3J5X3RleHQ9Q2hlbWluIDoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3VzZURlZmF1bHRQYXRoX3RleHQ9VXRpbGlzZXogbGUgY2hlbWluIHBhciBkXHUwMGU5ZmF1dA0KLXB1Ymxpc2hDb25maWdXaXphcmRfd2ViU2l0ZV90ZXh0PVNpdGUgV2ViIHB1YmxpXHUwMGU5DQotcHVibGlzaENvbmZpZ1dpemFyZF90aXRsZV90ZXh0PVRpdHJlIDoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2Jhbm5lckltYWdlX3RleHQ9SW1hZ2UgZGUgbGEgYmFubmlcdTAwZThyZSA6DQotcHVibGlzaENvbmZpZ1dpemFyZF9hYm91dEhUTUxfdGV4dD1Db250ZW51IGRlIGxhIHJ1YnJpcXVlIEEgcHJvcG9zIGRlIDoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2ZlZWRiYWNrVVJMX3RleHQ9VVJMIGRlc3Rpblx1MDBlOWUgYXV4IHJldG91cnMgZCdpbmZvcm1hdGlvbnMgOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZUluZGV4X3RleHQ9UHVibGlleiBsYSBwYWdlIGQnaW5kZXgNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVHbG9zc2FyeV90ZXh0PVB1YmxpZXogbGEgcGFnZSBkZSBnbG9zc2FpcmUNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVTZWFyY2hfdGV4dD1JbmNsdWV6IGxhIGZvbmN0aW9uIGRlIHJlY2hlcmNoZSAoblx1MDBlOWNlc3NpdGUgbGEgcHJpc2UgZW4gY2hhcmdlIGRlIGwnYXBwbGV0IEphdmEgZGFucyBsZSBuYXZpZ2F0ZXVyKQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfdXNlQXBwbGV0X3RleHQ9UHJpc2UgZW4gY2hhcmdlIGRlIGxhIHBlcnNvbm5hbGlzYXRpb24gZGVzIHZ1ZXMgKG5cdTAwZTljZXNzaXRlIGxhIHByaXNlIGVuIGNoYXJnZSBkZSBsJ2FwcGxldCBKYXZhIGRhbnMgbGUgbmF2aWdhdGV1cikNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3ZhbGlkYXRpb25Hcm91cF90ZXh0PVZhbGlkYXRpb24NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2NoZWNrSHlwZXJsaW5rc190ZXh0PVZcdTAwZTlyaWZpZXogbGVzIGxpZW5zIGh5cGVydGV4dGVzIGV4dGVybmVzDQotcHVibGlzaENvbmZpZ1dpemFyZF9kaWFncmFtR3JvdXBfdGV4dD1EaWFncmFtbWVzDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eV9kZF90ZXh0PVB1YmxpZXogbGVzIGRpYWdyYW1tZXMgZFx1MDBlOXRhaWxsXHUwMGU5cyBkJ2FjdGl2aXRcdTAwZTkgcXVpIG4nb250IHBhcyBcdTAwZTl0XHUwMGU5IGNyXHUwMGU5XHUwMGU5cyBkYW5zIGwnXHUwMGU5ZGl0ZXVyIGRlIHByb2Nlc3N1cw0KLXB1Ymxpc2hDb25maWdXaXphcmRfcHVibGlzaF9leHRlbmRfYWN0aXZpdHlfZGlhZ3JhbT1QdWJsaWV6IGxlcyBkaWFncmFtbWVzIGQnYWN0aXZpdFx1MDBlOSBwb3VyIGRlcyBleHRlbnNpb25zIGQnYWN0aXZpdFx1MDBlOXMgbm9uIG1vZGlmaVx1MDBlOWVzDQotcHVibGlzaENvbmZpZ1dpemFyZF9jb252ZXJ0QnJva2VuTGlua3NfdGV4dD1Db252ZXJ0aXIgbGVzIGxpZW5zIHJvbXB1cyBlbiB0ZXh0ZSBjbGFpcg0KLXB1Ymxpc2hDb25maWdXaXphcmRfbGF5b3V0X3RleHQ9RGlzcG9zaXRpb24NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2V4dHJhRGVzY3JpcHRvckluZm9fdGV4dD1QdWJsaWV6IGxlcyBkZXNjcmlwdGV1cnMgYXZlYyBsZSBjb250ZW51IGVudGllciBkZSBsJ1x1MDBlOWxcdTAwZTltZW50IGR1IGNvbnRlbnUgZGUgbVx1MDBlOXRob2RlIGFzc29jaVx1MDBlOQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfbGlnaHRXZWlnaHRUcmVlX3RleHQ9R1x1MDBlOW5cdTAwZTlyZXogdW5lIHN0cnVjdHVyZSBkZSBzb3VzLWFyYnJlcyBwb3VyIGxhIHRcdTAwZTJjaGUsIGxlIHJcdTAwZjRsZSwgbGUgcHJvZHVpdCBldCBsZXMgXHUwMGU5bFx1MDBlOW1lbnRzIGRlIGRpc2NpcGxpbmUgc2FucyB1dGlsaXNlciBkZSBkb3NzaWVycw0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZUVtcHR5Q2F0ZWdvcmllc190ZXh0PVB1YmxpZXogZGVzIGNhdFx1MDBlOWdvcmllcyBzYW5zIGF1Y3VuIFx1MDBlOWxcdTAwZTltZW50IGNhdFx1MDBlOWdvcmlzXHUwMGU5DQotDQotIyBwdWJsaXNoIHByb2Nlc3Mgd2l6YXJkIHBhZ2UNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfdGl0bGU9U1x1MDBlOWxlY3Rpb25uZXIgbGUgdHlwZSBkZSBwdWJsaWNhdGlvbg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV90ZXh0PVZvdXMgcG91dmV6IHB1YmxpZXIgbGEgY29uZmlndXJhdGlvbiBzXHUwMGU5bGVjdGlvbm5cdTAwZTllIG91IGxlcyBwcm9jZXNzdXMgc3BcdTAwZTljaWZpXHUwMGU5cyBkYW5zIGxhIGNvbmZpZ3VyYXRpb24NCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfY2FwYWJpbGl0eV9wYXR0ZXJuPVBhdHRlcm5zIGRlIGNhcGFjaXRcdTAwZTkNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfZGVsaXZlcnlfcHJvY2Vzcz1Qcm9jZXNzdXMgZGUgbGl2cmFpc29uDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3NlbGVjdFR5cGU9U1x1MDBlOWxlY3Rpb25uZXIgbGUgdHlwZSBkZSBwdWJsaWNhdGlvbg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF90eXBlX3Byb2Nlc3Nlcz1QdWJsaWVyIGxlcyBwcm9jZXNzdXMgc1x1MDBlOWxlY3Rpb25uXHUwMGU5cyBjaS1kZXNzb3VzIDoNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfdHlwZV9jb25maWc9UHVibGllciBsYSBjb25maWd1cmF0aW9uIHNcdTAwZTlsZWN0aW9ublx1MDBlOWUNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfcHVibGlzaF9iYXNlX3Byb2Nlc3Nlcz1QdWJsaWVyIGxlcyBwcm9jZXNzdXMgZGUgYmFzZSByXHUwMGU5Zlx1MDBlOXJlbmNcdTAwZTlzDQotDQotIyBQdWJsaXNoaW5nIFByZWZlcmVuY2UgUGFnZQ0KLXByZWZlcmVuY2VQYWdlX2RlZmF1bHRQYXRoX3RleHQ9Q2hlbWluIHBhciBkXHUwMGU5ZmF1dCA6DQotDQotIyBDb25maXJtYXRpb24gRGlhbG9ncw0KLXB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU9UHVibGllciBsYSBjb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLWNvbmZpcm1QYXRoRGlhbG9nX3RleHQ9TGUgY2hlbWluIGRlIGRlc3RpbmF0aW9uIGEgXHUwMGU5dFx1MDBlOSByXHUwMGU5c29sdSBlbiAnJ3swfScnLiBWb3VsZXotdm91cyBjb250aW51ZXIgPw0KLW92ZXJ3cml0ZURpYWxvZ190ZXh0PUxlIGNoZW1pbiBkZSBkZXN0aW5hdGlvbiAnJ3swfScnIGV4aXN0ZSBkXHUwMGU5alx1MDBlMC4gVG91cyBsZXMgZmljaGllcnMgZHUgZG9zc2llciBzZXJvbnQgc3VwcHJpbVx1MDBlOXMuIFZvdWxlei12b3VzIGNvbnRpbnVlciA/DQotY2FuY2VsUHVibGlzaENvbmZpZ19tc2c9TCdvcFx1MDBlOXJhdGlvbiBkZSBwdWJsaWNhdGlvbiBhIFx1MDBlOXRcdTAwZTkgYW5udWxcdTAwZTllLg0KLQ0KLSMgRXJyb3IgRGlhbG9ncw0KLXByZXZpZXdDb25maWdFcnJvcl90aXRsZT1Qclx1MDBlOXZpc3VhbGlzZXIgbGEgY29uZmlndXJhdGlvbiBkZSBtXHUwMGU5dGhvZGUgcHVibGlcdTAwZTllDQotdmlld1JlcG9ydEVycm9yX3RpdGxlPUFmZmljaGVyIGxlIHJhcHBvcnQgZGUgcHVibGljYXRpb24NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbWlzc2luZ1ZpZXdFcnJvcl9tc2c9SVVQUDAxMDBXIDogTGEgY29uZmlndXJhdGlvbiBzXHUwMGU5bGVjdGlvbm5cdTAwZTllIG5lIGNvbnRpZW50IHBhcyBkZSB2dWUgdmFsaWRlLiBNb2RpZmlleiBjZXR0ZSBjb25maWd1cmF0aW9uIGV0IGFqb3V0ZXogdW5lIHZ1ZSBvdSBzXHUwMGU5bGVjdGlvbm5leiB1bmUgYXV0cmUgY29uZmlndXJhdGlvbi4NCi1jYW5ub3RQdWJsaXNoRXJyb3JfbXNnPUlVUFAwMTAxRSA6IEltcG9zc2libGUgZGUgcHVibGllciBsYSBjb25maWd1cmF0aW9uIHNcdTAwZTlsZWN0aW9ublx1MDBlOWUuDQotaW52YWxpZFBhdGhFcnJvcl9tc2c9SVVQUDAxMDJFIDogTGUgY2hlbWluIGRlIGRlc3RpbmF0aW9uIGVzdCB2aWVyZ2Ugb3Ugbm9uIHZhbGlkZS4NCi1pbnZhbGlkUGF0aENoYXJzRXJyb3JfbXNnPUlVUFAwMTAzRSA6IExlIGNoZW1pbiBkZSBkZXN0aW5hdGlvbiBuZSBwZXV0IHBhcyBjb250ZW5pciBsZXMgY2FyYWN0XHUwMGU4cmVzIHN1aXZhbnRzIDogXFwgIyAqID8gIiA8ID4gfCAhICUgLw0KLXB1Ymxpc2hDb25maWdFcnJvcl9tc2c9SVVQUDAxMDRFIDogRWNoZWMgZGUgcHVibGljYXRpb24gZGUgbGEgY29uZmlndXJhdGlvbiBzXHUwMGU5bGVjdGlvbm5cdTAwZTllLg0KLXByZXZpZXdDb25maWdFcnJvcl9tc2c9SVVQUDAxMDVFIDogSW1wb3NzaWJsZSBkJ291dnJpciB1biBuYXZpZ2F0ZXVyIEhUTUwgcG91ciBwclx1MDBlOXZpc3VhbGlzZXIgbGEgY29uZmlndXJhdGlvbiBwdWJsaVx1MDBlOWUuDQotdmlld1JlcG9ydEVycm9yX21zZz1JVVBQMDEwNkUgOiBJbXBvc3NpYmxlIGQnb3V2cmlyIHVuIG5hdmlnYXRldXIgSFRNTCBwb3VyIGFmZmljaGVyIGxlIHJhcHBvcnQgZGUgcHVibGljYXRpb24uDQotDQotIyBFcnJvciBSZWFzb25zICYgUmVjb21tZW5kZWQgQWN0aW9ucw0KLXB1Ymxpc2hDb25maWdFcnJvcl9yZWFzb249SVVQUDAxMDdFIDogVW5lIGVycmV1ciBzJ2VzdCBwcm9kdWl0ZS4gU1x1MDBlOWxlY3Rpb25uZXogbGUgYm91dG9uIERcdTAwZTl0YWlscyBwb3VyIHBsdXMgZCdpbmZvcm1hdGlvbnMuDQotZGVsZXRlRmlsZXNFcnJvcl9yZWFzb249TGUgY2hlbWluIGRlIGRlc3RpbmF0aW9uICcnezB9JycgY29udGllbnQgZGVzIGZpY2hpZXJzIHF1aSBuZSBwZXV2ZW50IHBhcyBcdTAwZWF0cmUgc3VwcHJpbVx1MDBlOXMuXG5cbkZlcm1leiBjZXR0ZSBib1x1MDBlZXRlIGRlIGRpYWxvZ3VlIGV0IHNwXHUwMGU5Y2lmaWV6IHVuIGF1dHJlIGNoZW1pbi4NCi1jcmVhdGVEaXJFcnJvcl9yZWFzb249SW1wb3NzaWJsZSBkZSBjclx1MDBlOWVyIGxlIGNoZW1pbiBkZSBkZXN0aW5hdGlvbiAnJ3swfScnLlxuXG5GZXJtZXogY2V0dGUgYm9cdTAwZWV0ZSBkZSBkaWFsb2d1ZSBldCBzcFx1MDBlOWNpZmlleiB1biBhdXRyZSBjaGVtaW4uDQotb3BlbkJyb3dzZXJFcnJvcl9yZWFzb249SW1wb3NzaWJsZSBkZSBkXHUwMGU5dGVjdGVyIG91IGRlIGxvY2FsaXNlciBsZSBuYXZpZ2F0ZXVyIEhUTUwgcGFyIGRcdTAwZTlmYXV0IHBvdXIgY2Ugc3lzdFx1MDBlOG1lLlxuXG5GZXJtZXogY2V0dGUgYm9cdTAwZWV0ZSBkZSBkaWFsb2d1ZSBldCBvdXZyZXogbGUgZmljaGllciAnJ3swfScnIG1hbnVlbGxlbWVudCBcdTAwZTAgbCcnYWlkZSBkJyd1biBuYXZpZ2F0ZXVyIEhUTUwuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNmJiZWE3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlPVB1YmJsaWNhIGNvbmZpZ3VyYXppb25lIG1ldG9kbw0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1TZWxlemlvbmEgY29uZmlndXJhemlvbmUgbWV0b2RvDQotcHVibGlzaENvbmZpZ1dpemFyZF9zZWxlY3RDb25maWdQYWdlX3RleHQ9U2VsZXppb25hcmUgbGEgY29uZmlndXJhemlvbmUgZGkgbWV0b2RvIGNoZSBzaSBkZXNpZGVyYSBwdWJibGljYXJlLg0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0T3B0aW9uc1BhZ2VfdGl0bGU9U3BlY2lmaWNhIG9wemlvbmkgZGkgcHViYmxpY2F6aW9uZQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0T3B0aW9uc1BhZ2VfdGV4dD1TcGVjaWZpY2FyZSBsYSBkaXJlY3RvcnkgZGkgZGVzdGluYXppb25lIGUgbGUgb3B6aW9uaSBkaSBwdWJibGljYXppb25lLg0KLXB1Ymxpc2hDb25maWdXaXphcmRfbWV0aG9kQ29uZmlnX3RleHQ9Q29uZmlndXJhemlvbmUgbWV0b2RvOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGVzdGluYXRpb25Hcm91cF90ZXh0PURpcmVjdG9yeSBkaSBkZXN0aW5hemlvbmUNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2RpcmVjdG9yeV90ZXh0PVBlcmNvcnNvOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfdXNlRGVmYXVsdFBhdGhfdGV4dD1VdGlsaXp6YSBwZXJjb3JzbyBwcmVkZWZpbml0bw0KLXB1Ymxpc2hDb25maWdXaXphcmRfd2ViU2l0ZV90ZXh0PVNpdG8gV2ViIHB1YmJsaWNhdG8NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlX3RleHQ9VGl0b2xvOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfYmFubmVySW1hZ2VfdGV4dD1JbW1hZ2luZSBiYW5uZXI6DQotcHVibGlzaENvbmZpZ1dpemFyZF9hYm91dEhUTUxfdGV4dD1JbmZvcm1hemlvbmkgc3VsIGNvbnRlbnV0bzoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2ZlZWRiYWNrVVJMX3RleHQ9VVJMIGZlZWRiYWNrOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZUluZGV4X3RleHQ9UHViYmxpY2EgcGFnaW5hIGluZGljZQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZUdsb3NzYXJ5X3RleHQ9UHViYmxpY2EgcGFnaW5hIGdsb3NzYXJpbw0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZVNlYXJjaF90ZXh0PUluY2x1ZGkgZnVuemlvbmFsaXRcdTAwZTAgZGkgcmljZXJjYSAobmVjZXNzYXJpbyBzdXBwb3J0byBhcHBsZXQgSmF2YSBuZWwgYnJvd3NlcikNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3VzZUFwcGxldF90ZXh0PVN1cHBvcnRhIHBlcnNvbmFsaXp6YXppb25lIHZpc3RlIGZ1bnppb25hbGl0XHUwMGUwIGRpIHJpY2VyY2EgKG5lY2Vzc2FyaW8gc3VwcG9ydG8gYXBwbGV0IEphdmEgbmVsIGJyb3dzZXIpDQotcHVibGlzaENvbmZpZ1dpemFyZF92YWxpZGF0aW9uR3JvdXBfdGV4dD1Db252YWxpZGENCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2NoZWNrSHlwZXJsaW5rc190ZXh0PUNvbnRyb2xsYSBjb2xsZWdhbWVudGkgaXBlcnRlc3R1YWxpIGVzdGVybmkNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2RpYWdyYW1Hcm91cF90ZXh0PURpYWdyYW1taQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlfZGRfdGV4dD1QdWJibGljYSBkaWFncmFtbWkgZGV0dGFnbGkgYXR0aXZpdFx1MDBlMCBjaGUgbm9uIHNvbm8gc3RhdGkgY3JlYXRpIG5lbGwnZWRpdG9yIGRpIHByb2Nlc3NpDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtPVB1YmJsaWNhcmUgaSBkaWFncmFtbWkgZGkgYXR0aXZpdFx1MDBlMCBwZXIgbGUgZXN0ZW5zaW9uaSBhdHRpdml0XHUwMGUwIG5vbiBtb2RpZmljYXRlDQotcHVibGlzaENvbmZpZ1dpemFyZF9jb252ZXJ0QnJva2VuTGlua3NfdGV4dD1Db252ZXJ0aXJlIGkgY29sbGVnYW1lbnRpIGRhbm5lZ2dpYXRpIGluIHRlc3RvIG5vbiBjb2RpZmljYXRvDQotcHVibGlzaENvbmZpZ1dpemFyZF9sYXlvdXRfdGV4dD1MYXlvdXQNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2V4dHJhRGVzY3JpcHRvckluZm9fdGV4dD1QdWJibGljYXJlIGkgZGVzY3JpdHRvcmkgY29uIGlsIGNvbnRlbnV0byBjb21wbGV0byBkZWxsJ2VsZW1lbnRvIGNvbnRlbnV0byBkZWwgbWV0b2RvIGNvcnJlbGF0bw0KLXB1Ymxpc2hDb25maWdXaXphcmRfbGlnaHRXZWlnaHRUcmVlX3RleHQ9R2VuZXJhcmUgdW5hIHN0cnV0dHVyYSBhZCBhbGJlcm8gc2Vjb25kYXJpYSBwZXIgZ2xpIGVsZW1lbnRpIGF0dGl2aXRcdTAwZTAsIHJ1b2xvLCBwcm9kb3R0aSBkaSBsYXZvcm8gZSBkaXNjaXBsaW5hIHNlbnphIHV0aWxpenphcmUgY2FydGVsbGUNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVFbXB0eUNhdGVnb3JpZXNfdGV4dD1QdWJibGljYXJlIGxlIGNhdGVnb3JpZSBzZW56YSBlbGVtZW50aSBjYXRlZ29yaXp6YXRpDQotDQotIyBwdWJsaXNoIHByb2Nlc3Mgd2l6YXJkIHBhZ2UNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfdGl0bGU9U2VsZXppb25hIHRpcG8gZGkgcHViYmxpY2F6aW9uZQ0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV90ZXh0PVx1MDBjOCBwb3NzaWJpbGUgcHViYmxpY2FyZSBsYSBjb25maWd1cmF6aW9uZSBzZWxlemlvbmF0YSBvIGkgcHJvY2Vzc2kgc3BlY2lmaWNhdGkgbmVsbGEgY29uZmlndXJhemlvbmUNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfY2FwYWJpbGl0eV9wYXR0ZXJuPU1vZGVsbGkgZGkgY2FwYWNpdFx1MDBlMA0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9kZWxpdmVyeV9wcm9jZXNzPVByb2Nlc3NpIGRpIHByb2R1emlvbmUNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfc2VsZWN0VHlwZT1TZWxlemlvbmEgdGlwbyBkaSBwdWJibGljYXppb25lDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3R5cGVfcHJvY2Vzc2VzPVB1YmJsaWNhIGkgcHJvY2Vzc2kgc2VsZXppb25hdGkgZGkgc2VndWl0bzoNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfdHlwZV9jb25maWc9UHViYmxpY2EgbGEgY29uZmlndXJhemlvbmUgc2VsZXppb25hdGENCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfcHVibGlzaF9iYXNlX3Byb2Nlc3Nlcz1QdWJibGljYSBpIHByb2Nlc3NpIGRpIGJhc2UgYSBjdWkgc2kgZmEgcmlmZXJpbWVudG8NCi0NCi0jIFB1Ymxpc2hpbmcgUHJlZmVyZW5jZSBQYWdlDQotcHJlZmVyZW5jZVBhZ2VfZGVmYXVsdFBhdGhfdGV4dD1QZXJjb3JzbyBwcmVkZWZpbml0bzoNCi0NCi0jIENvbmZpcm1hdGlvbiBEaWFsb2dzDQotcHVibGlzaENvbmZpZ0RpYWxvZ190aXRsZT1QdWJibGljYSBjb25maWd1cmF6aW9uZSBtZXRvZG8NCi1jb25maXJtUGF0aERpYWxvZ190ZXh0PUlsIHBlcmNvcnNvIGRpIGRlc3RpbmF6aW9uZSBcdTAwZTggc3RhdG8gcmlzb2x0byBpbiAnJ3swfScnLiBQcm9jZWRlcmU/DQotb3ZlcndyaXRlRGlhbG9nX3RleHQ9SWwgcGVyY29yc28gZGkgZGVzdGluYXppb25lICcnezB9JycgZXNpc3RlIGdpXHUwMGUwLiBUdXR0aSBpIGZpbGUgbmVsbGEgY2FydGVsbGEgdmVycmFubm8gZWxpbWluYXRpLiBQcm9jZWRlcmU/DQotY2FuY2VsUHVibGlzaENvbmZpZ19tc2c9TCdvcGVyYXppb25lIGRpIHB1YmJsaWNhemlvbmUgXHUwMGU4IHN0YXRhIGFubnVsbGF0YS4NCi0NCi0jIEVycm9yIERpYWxvZ3MNCi1wcmV2aWV3Q29uZmlnRXJyb3JfdGl0bGU9QW50ZXByaW1hIGNvbmZpZ3VyYXppb25lIG1ldG9kbyBwdWJibGljYXRhDQotdmlld1JlcG9ydEVycm9yX3RpdGxlPVZpc3VhbGl6emEgcmVwb3J0IGRpIHB1YmJsaWNhemlvbmUNCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbWlzc2luZ1ZpZXdFcnJvcl9tc2c9SVVQUDAxMDBXOiBMYSBjb25maWd1cmF6aW9uZSBzZWxlemlvbmF0YSBub24gY29udGllbmUgdW4gdmlzdGEgdmFsaWRhLiBNb2RpZmljYXJlIGxhIGNvbmZpZ3VyYXppb25lIGUgYWdnaXVuZ2VyZSB1bmEgdmlzdGEgb3BwdXJlIHNlbGV6aW9uYXJlIHVuJ2FsdHJhIGNvbmZpZ3VyYXppb25lLg0KLWNhbm5vdFB1Ymxpc2hFcnJvcl9tc2c9SVVQUDAxMDFFOiBJbXBvc3NpYmlsZSBwdWJibGljYXJlIGxhIGNvbmZpZ3VyYXppb25lIHNlbGV6aW9uYXRhLg0KLWludmFsaWRQYXRoRXJyb3JfbXNnPUlVUFAwMTAyRTogSWwgcGVyY29yc28gZGkgZGVzdGluYXppb25lIFx1MDBlOCB2dW90byBvcHB1cmUgbm9uIFx1MDBlOCB2YWxpZG8uDQotaW52YWxpZFBhdGhDaGFyc0Vycm9yX21zZz1JVVBQMDEwM0U6IElsIHBlcmNvcnNvIGRpIGRlc3RpbmF6aW9uZSBub24gcHVcdTAwZjIgY29udGVuZXJlIGkgc2VndWVudGkgY2FyYXR0ZXJpOiBcXCAjICogPyAiIDwgPiB8ICEgJSAvDQotcHVibGlzaENvbmZpZ0Vycm9yX21zZz1JVVBQMDEwNEU6IExhIGNvbmZpZ3VyYXppb25lIHNlbGV6aW9uYXRhIG5vbiBcdTAwZTggc3RhdGEgcHViYmxpY2F0YSBjb3JyZXR0YW1lbnRlLg0KLXByZXZpZXdDb25maWdFcnJvcl9tc2c9SVVQUDAxMDVFOiBJbXBvc3NpYmlsZSBhcHJpcmUgdW4gYnJvd3NlciBIVE1MIHBlciB2aXN1YWxpenphcmUgbCdhbnRlcHJpbWEgZGVsbGEgY29uZmlndXJhemlvbmUgcHViYmxpY2F0YS4NCi12aWV3UmVwb3J0RXJyb3JfbXNnPUlVUFAwMTA2RTogSW1wb3NzaWJpbGUgYXByaXJlIHVuIGJyb3dzZXIgSFRNTCBwZXIgdmlzdWFsaXp6YXJlIGlsIHJlcG9ydCBkaSBwdWJibGljYXppb25lLg0KLQ0KLSMgRXJyb3IgUmVhc29ucyAmIFJlY29tbWVuZGVkIEFjdGlvbnMNCi1wdWJsaXNoQ29uZmlnRXJyb3JfcmVhc29uPUlVUFAwMTA3RTogU2kgXHUwMGU4IHZlcmlmaWNhdG8gdW4gZXJyb3JlLiBTZWxlemlvbmFyZSBpbCBwdWxzYW50ZSBEZXR0YWdsaSBwZXIgdWx0ZXJpb3JpIGluZm9ybWF6aW9uaS4NCi1kZWxldGVGaWxlc0Vycm9yX3JlYXNvbj1JbCBwZXJjb3JzbyBkaSBkZXN0aW5hemlvbmUgJyd7MH0nJyBjb250aWVuZSBmaWxlIGNoZSBub24gcG9zc29ubyBlc3NlcmUgZWxpbWluYXRpLlxuXG5DaGl1ZGVyZSBxdWVzdGEgZmluZXN0cmEgZGkgZGlhbG9nbyBlIHNwZWNpZmljYXJlIHVuIGFsdHJvIHBlcmNvcnNvLg0KLWNyZWF0ZURpckVycm9yX3JlYXNvbj1JbXBvc3NpYmlsZSBjcmVhcmUgaWwgcGVyY29yc28gZGkgZGVzdGluYXppb25lICcnezB9JycuXG5cbkNoaXVkZXJlIHF1ZXN0YSBmaW5lc3RyYSBkaSBkaWFsb2dvIGUgc3BlY2lmaWNhcmUgdW4gYWx0cm8gcGVyY29yc28uDQotb3BlbkJyb3dzZXJFcnJvcl9yZWFzb249SW1wb3NzaWJpbGUgaW5kaXZpZHVhcmUgbyB0cm92YXJlIGlsIGJyb3dzZXIgSFRNTCBwcmVkZWZpbml0byBzdSBxdWVzdG8gc2lzdGVtYS5cblxuQ2hpdWRlcmUgcXVlc3RhIGZpbmVzdHJhIGRpIGRpYWxvZ28gZSBhcHJpcmUgaWwgZmlsZSAnJ3swfScnIG1hbnVhbG1lbnRlIGNvbiB1biBicm93c2VyIEhUTUwuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NTExYmMwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA2ZVx1NTE2Y1x1OTU4Yg0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5Y2JcdTYyMTBcdTMwNmVcdTkwNzhcdTYyOWUNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGV4dD1cdTUxNmNcdTk1OGJcdTMwNTlcdTMwOGJcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5Y2JcdTYyMTBcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdE9wdGlvbnNQYWdlX3RpdGxlPVx1NTE2Y1x1OTU4Ylx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2ZVx1NjMwN1x1NWI5YQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0T3B0aW9uc1BhZ2VfdGV4dD1cdTViOWJcdTUxNDhcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNjhcdTUxNmNcdTk1OGJcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1wdWJsaXNoQ29uZmlnV2l6YXJkX21ldGhvZENvbmZpZ190ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMDoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2Rlc3RpbmF0aW9uR3JvdXBfdGV4dD1cdTViOWJcdTUxNDhcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwZmMNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2RpcmVjdG9yeV90ZXh0PVx1MzBkMVx1MzBiOToNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3VzZURlZmF1bHRQYXRoX3RleHQ9XHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMGZiXHUzMGQxXHUzMGI5XHUzMDkyXHU0ZjdmXHU3NTI4DQotcHVibGlzaENvbmZpZ1dpemFyZF93ZWJTaXRlX3RleHQ9XHU1MTZjXHU5NThiXHUzMDU5XHUzMDhiIFdlYiBcdTMwYjVcdTMwYTRcdTMwYzgNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlX3RleHQ9XHU4ODY4XHU5ODRjOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfYmFubmVySW1hZ2VfdGV4dD1cdTMwZDBcdTMwY2FcdTMwZmNcdTMwZmJcdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjg6DQotcHVibGlzaENvbmZpZ1dpemFyZF9hYm91dEhUTUxfdGV4dD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwNmJcdTMwNjRcdTMwNDRcdTMwNjY6DQotcHVibGlzaENvbmZpZ1dpemFyZF9mZWVkYmFja1VSTF90ZXh0PVx1MzBkNVx1MzBhM1x1MzBmY1x1MzBjOVx1MzBkMFx1MzBjM1x1MzBhZiBVUkw6DQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlSW5kZXhfdGV4dD1cdTdkMjJcdTVmMTVcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmVcdTUxNmNcdTk1OGINCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVHbG9zc2FyeV90ZXh0PVx1NzUyOFx1OGE5ZVx1OTZjNlx1MzBkYVx1MzBmY1x1MzBiOFx1MzA2ZVx1NTE2Y1x1OTU4Yg0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZVNlYXJjaF90ZXh0PVx1NjkxY1x1N2QyMlx1NmE1Zlx1ODBmZFx1MzA5Mlx1N2Q0NFx1MzA3Zlx1OGZiY1x1MzA4MCAoXHUzMGQ2XHUzMGU5XHUzMGE2XHUzMGI2XHUzMGZjXHUzMDRjIEphdmEgXHUzMGEyXHUzMGQ3XHUzMGVjXHUzMGMzXHUzMGM4XHUzMDZiXHU1YmZlXHU1ZmRjXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5KQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfdXNlQXBwbGV0X3RleHQ9XHUzMGQzXHUzMGU1XHUzMGZjXHUzMDZlXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGRlXHUzMGE0XHUzMGJhXHUzMDkyXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4IChcdTMwZDZcdTMwZTlcdTMwYTZcdTMwYjZcdTMwZmNcdTMwNGMgSmF2YSBcdTMwYTJcdTMwZDdcdTMwZWNcdTMwYzNcdTMwYzhcdTMwNmJcdTViZmVcdTVmZGNcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOGJcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTkpDQotcHVibGlzaENvbmZpZ1dpemFyZF92YWxpZGF0aW9uR3JvdXBfdGV4dD1cdTY5MWNcdThhM2MNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2NoZWNrSHlwZXJsaW5rc190ZXh0PVx1NTkxNlx1OTBlOFx1MzBjZlx1MzBhNFx1MzBkMVx1MzBmY1x1MzBlYVx1MzBmM1x1MzBhZlx1MzA2ZVx1NjkxY1x1NjdmYg0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlhZ3JhbUdyb3VwX3RleHQ9XHUzMGMwXHUzMGE0XHUzMGEyXHUzMGIwXHUzMGU5XHUzMGUwDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eV9kZF90ZXh0PVx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzBmYlx1MzBhOFx1MzBjN1x1MzBhM1x1MzBiZlx1MzBmY1x1MzA2N1x1NGY1Y1x1NjIxMFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA2YVx1MzA0NFx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1OGE3M1x1N2QzMFx1NTZmM1x1MzA2ZVx1NTE2Y1x1OTU4Yg0KLXB1Ymxpc2hDb25maWdXaXphcmRfcHVibGlzaF9leHRlbmRfYWN0aXZpdHlfZGlhZ3JhbT1cdTU5MDlcdTY2ZjRcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwNmFcdTMwNDRcdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTYyZTFcdTVmMzVcdTMwNmVcdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmNcdTU2ZjNcdTMwNmVcdTUxNmNcdTk1OGINCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2NvbnZlcnRCcm9rZW5MaW5rc190ZXh0PVx1MzBlYVx1MzBmM1x1MzBhZlx1NTIwN1x1MzA4Y1x1MzA5Mlx1MzBkN1x1MzBlY1x1MzBmY1x1MzBmM1x1MzBmYlx1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2Ylx1NTkwOVx1NjNkYg0KLXB1Ymxpc2hDb25maWdXaXphcmRfbGF5b3V0X3RleHQ9XHUzMGVjXHUzMGE0XHUzMGEyXHUzMGE2XHUzMGM4DQotcHVibGlzaENvbmZpZ1dpemFyZF9leHRyYURlc2NyaXB0b3JJbmZvX3RleHQ9XHU5NWEyXHU5MDIzXHUzMDU5XHUzMDhiXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHU4OTgxXHU3ZDIwXHUzMDZlXHU1YjhjXHU1MTY4XHUzMDZhXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMDkyXHU1NDJiXHUzMDgwXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDZlXHU1MTZjXHU5NThiDQotcHVibGlzaENvbmZpZ1dpemFyZF9saWdodFdlaWdodFRyZWVfdGV4dD1cdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzBcdTMwZmNcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNWJcdTMwNWFcdTMwNmJcdTMwYmZcdTMwYjlcdTMwYWZcdTMwMDFcdTMwZWRcdTMwZmNcdTMwZWJcdTMwMDFcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzhcdTMwMDFcdTMwNGFcdTMwODhcdTMwNzNcdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2VcdTg5ODFcdTdkMjBcdTMwNmVcdTMwYjVcdTMwZDZcdTMwYzRcdTMwZWFcdTMwZmNcdTY5Y2JcdTkwMjBcdTMwOTJcdTc1MWZcdTYyMTANCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVFbXB0eUNhdGVnb3JpZXNfdGV4dD1cdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmNcdTUzMTZcdTMwNTVcdTMwOGNcdTMwNWZcdTg5ODFcdTdkMjBcdTMwNGNcdTMwNmFcdTMwNDRcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmNcdTMwNmVcdTUxNmNcdTk1OGINCi0NCi0jIHB1Ymxpc2ggcHJvY2VzcyB3aXphcmQgcGFnZQ0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV90aXRsZT1cdTUxNmNcdTk1OGJcdTMwYmZcdTMwYTRcdTMwZDdcdTMwNmVcdTkwNzhcdTYyOWUNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfdGV4dD1cdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTY5Y2JcdTYyMTBcdTMwN2VcdTMwNWZcdTMwNmZcdTY5Y2JcdTYyMTBcdTMwNjdcdTYzMDdcdTViOWFcdTMwNTdcdTMwNWZcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNmVcdTMwNDRcdTMwNWFcdTMwOGNcdTMwNGJcdTMwOTJcdTUxNmNcdTk1OGJcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNGNcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNTkNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfY2FwYWJpbGl0eV9wYXR0ZXJuPVx1MzBiMVx1MzBmY1x1MzBkMVx1MzBkM1x1MzBlYVx1MzBjNlx1MzBhM1x1MzBmY1x1MzBmYlx1MzBkMVx1MzBiZlx1MzBmY1x1MzBmMw0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9kZWxpdmVyeV9wcm9jZXNzPVx1MzBjN1x1MzBlYVx1MzBkMFx1MzBlYVx1MzBmY1x1MzBmYlx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOQ0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9zZWxlY3RUeXBlPVx1NTE2Y1x1OTU4Ylx1MzBiZlx1MzBhNFx1MzBkN1x1MzA2ZVx1OTA3OFx1NjI5ZQ0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF90eXBlX3Byb2Nlc3Nlcz1cdTRlZTVcdTRlMGJcdTMwNjdcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNmVcdTUxNmNcdTk1OGI6DQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3R5cGVfY29uZmlnPVx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA1Zlx1NjljYlx1NjIxMFx1MzA2ZVx1NTE2Y1x1OTU4Yg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9wdWJsaXNoX2Jhc2VfcHJvY2Vzc2VzPVx1NTNjMlx1NzE2N1x1MzA1NVx1MzA4Y1x1MzA4Ylx1NTdmYVx1NjcyY1x1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzA2ZVx1NTE2Y1x1OTU4Yg0KLQ0KLSMgUHVibGlzaGluZyBQcmVmZXJlbmNlIFBhZ2UNCi1wcmVmZXJlbmNlUGFnZV9kZWZhdWx0UGF0aF90ZXh0PVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzBmYlx1MzBkMVx1MzBiOToNCi0NCi0jIENvbmZpcm1hdGlvbiBEaWFsb2dzDQotcHVibGlzaENvbmZpZ0RpYWxvZ190aXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5Y2JcdTYyMTBcdTMwNmVcdTUxNmNcdTk1OGINCi1jb25maXJtUGF0aERpYWxvZ190ZXh0PVx1NWI5Ylx1NTE0OFx1MzBkMVx1MzBiOVx1MzA2ZiAnJ3swfScnIFx1MzA2Ylx1ODllM1x1NmM3YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMiBcdTdkOWFcdTg4NGNcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQotb3ZlcndyaXRlRGlhbG9nX3RleHQ9XHU1YjliXHU1MTQ4XHUzMGQxXHUzMGI5ICcnezB9JycgXHUzMDZmXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyIFx1MzA1M1x1MzA2ZVx1MzBkNVx1MzBhOVx1MzBlYlx1MzBjMFx1MzBmY1x1NTE4NVx1MzA2ZVx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2ZVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1NTI0YVx1OTY2NFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTdkOWFcdTg4NGNcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQotY2FuY2VsUHVibGlzaENvbmZpZ19tc2c9XHU1MTZjXHU5NThiXHU2NGNkXHU0ZjVjXHUzMDZmXHU1M2Q2XHUzMDhhXHU2ZDg4XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyDQotDQotIyBFcnJvciBEaWFsb2dzDQotcHJldmlld0NvbmZpZ0Vycm9yX3RpdGxlPVx1NTE2Y1x1OTU4Ylx1NmUwOFx1MzA3Zlx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NjljYlx1NjIxMFx1MzA2ZVx1MzBkN1x1MzBlY1x1MzBkM1x1MzBlNVx1MzBmYw0KLXZpZXdSZXBvcnRFcnJvcl90aXRsZT1cdTUxNmNcdTk1OGJcdTMwZWNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNmVcdTg4NjhcdTc5M2ENCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbWlzc2luZ1ZpZXdFcnJvcl9tc2c9SVVQUDAxMDBXOiBcdTY3MDlcdTUyYjlcdTMwNmFcdTMwZDNcdTMwZTVcdTMwZmNcdTMwOTJcdTU0MmJcdTMwN2VcdTMwNmFcdTMwNDRcdTY5Y2JcdTYyMTBcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIgXHU2OWNiXHU2MjEwXHUzMDkyXHU3ZGU4XHU5NmM2XHUzMDU3XHUzMDY2XHUzMGQzXHUzMGU1XHUzMGZjXHUzMDkyXHU4ZmZkXHU1MmEwXHUzMDU5XHUzMDhiXHUzMDRiXHUzMDAxXHU1MjI1XHUzMDZlXHU2OWNiXHU2MjEwXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyDQotY2Fubm90UHVibGlzaEVycm9yX21zZz1JVVBQMDEwMUU6IFx1NTE2Y1x1OTU4Ylx1MzA2N1x1MzA0ZFx1MzA2YVx1MzA0NFx1NjljYlx1NjIxMFx1MzA0Y1x1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMg0KLWludmFsaWRQYXRoRXJyb3JfbXNnPUlVUFAwMTAyRTogXHU1YjliXHU1MTQ4XHUzMGQxXHUzMGI5XHUzMDRjXHU3YTdhXHUzMDdlXHUzMDVmXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyDQotaW52YWxpZFBhdGhDaGFyc0Vycm9yX21zZz1JVVBQMDEwM0U6IFx1NmIyMVx1MzA2ZVx1NjU4N1x1NWI1N1x1MzA2Zlx1NWI5Ylx1NTE0OFx1MzBkMVx1MzBiOVx1MzA2Ylx1NGY3Zlx1NzUyOFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MzogXFwgIyAqID8gIiA8ID4gfCAhICUgLw0KLXB1Ymxpc2hDb25maWdFcnJvcl9tc2c9SVVQUDAxMDRFOiBcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWZcdTY5Y2JcdTYyMTBcdTMwNGNcdTZiNjNcdTVlMzhcdTMwNmJcdTUxNmNcdTk1OGJcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDINCi1wcmV2aWV3Q29uZmlnRXJyb3JfbXNnPUlVUFAwMTA1RTogXHU1MTZjXHU5NThiXHUzMDU3XHUzMDVmXHU2OWNiXHU2MjEwXHUzMDkyXHUzMGQ3XHUzMGVjXHUzMGQzXHUzMGU1XHUzMGZjXHUzMDU5XHUzMDhiIEhUTUwgXHUzMGQ2XHUzMGU5XHUzMGE2XHUzMGI2XHUzMGZjXHUzMDkyXHU5NThiXHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyDQotdmlld1JlcG9ydEVycm9yX21zZz1JVVBQMDEwNkU6IFx1NTE2Y1x1OTU4Ylx1MzBlY1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA5Mlx1ODg2OFx1NzkzYVx1MzA1OVx1MzA4YiBIVE1MIFx1MzBkNlx1MzBlOVx1MzBhNlx1MzBiNlx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMg0KLQ0KLSMgRXJyb3IgUmVhc29ucyAmIFJlY29tbWVuZGVkIEFjdGlvbnMNCi1wdWJsaXNoQ29uZmlnRXJyb3JfcmVhc29uPUlVUFAwMTA3RTogXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyIFx1OGE3M1x1MzA1N1x1MzA0Zlx1MzA2Zlx1MzAwMVx1MzAwY1x1OGE3M1x1N2QzMFx1MzAwZFx1MzBkY1x1MzBiZlx1MzBmM1x1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPVx1NWI5Ylx1NTE0OFx1MzBkMVx1MzBiOSAnJ3swfScnIFx1MzA2Ylx1MzAwMVx1NTI0YVx1OTY2NFx1MzA2N1x1MzA0ZFx1MzA2YVx1MzA0NFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1NTQyYlx1MzA3ZVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMlxuXG5cdTMwNTNcdTMwNmVcdTMwYzBcdTMwYTRcdTMwYTJcdTMwZWRcdTMwYjBcdTMwOTJcdTk1ODlcdTMwNThcdTMwNjZcdTMwMDFcdTUyMjVcdTMwNmVcdTMwZDFcdTMwYjlcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDINCi1jcmVhdGVEaXJFcnJvcl9yZWFzb249XHU1YjliXHU1MTQ4XHUzMGQxXHUzMGI5ICcnezB9JycgXHUzMDkyXHU0ZjVjXHU2MjEwXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXG5cblx1MzA1M1x1MzA2ZVx1MzBjMFx1MzBhNFx1MzBhMlx1MzBlZFx1MzBiMFx1MzA5Mlx1OTU4OVx1MzA1OFx1MzA2Nlx1MzAwMVx1NTIyNVx1MzA2ZVx1MzBkMVx1MzBiOVx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLW9wZW5Ccm93c2VyRXJyb3JfcmVhc29uPVx1MzA1M1x1MzA2ZVx1MzBiN1x1MzBiOVx1MzBjNlx1MzBlMFx1MzA2ZVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOCBIVE1MIFx1MzBkNlx1MzBlOVx1MzBhNlx1MzBiNlx1MzBmY1x1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlxuXG5cdTMwNTNcdTMwNmVcdTMwYzBcdTMwYTRcdTMwYTJcdTMwZWRcdTMwYjBcdTMwOTJcdTk1ODlcdTMwNThcdTMwNjZcdTMwMDFIVE1MIFx1MzBkNlx1MzBlOVx1MzBhNlx1MzBiNlx1MzBmY1x1MzA2N1x1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiAnJ3swfScnIFx1MzA5Mlx1NjI0Ylx1NTJkNVx1MzA2N1x1OTU4Ylx1MzA0NFx1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTg0M2VjMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYXRpb24gV2l6YXJkDQotcHVibGlzaENvbmZpZ1dpemFyZF90aXRsZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxIFx1YWNmNVx1YWMxYw0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxIFx1YzEyMFx1ZDBkZA0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0PVx1YWNmNVx1YWMxY1x1ZDU2MCBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdE9wdGlvbnNQYWdlX3RpdGxlPVx1YWNmNVx1YWMxYyBcdWM2MzVcdWMxNTggXHVjOWMwXHVjODE1DQotcHVibGlzaENvbmZpZ1dpemFyZF9zZWxlY3RPcHRpb25zUGFnZV90ZXh0PVx1YjMwMFx1YzBjMSBcdWI1MTRcdWI4MDlcdWQxYTBcdWI5YWNcdWM2NDAgXHVhY2Y1XHVhYzFjIFx1YzYzNVx1YzE1OFx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotcHVibGlzaENvbmZpZ1dpemFyZF9tZXRob2RDb25maWdfdGV4dD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVhZDZjXHVjMTMxOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGVzdGluYXRpb25Hcm91cF90ZXh0PVx1YjMwMFx1YzBjMSBcdWI1MTRcdWI4MDlcdWQxYTBcdWI5YWMNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2RpcmVjdG9yeV90ZXh0PVx1YWNiZFx1Yjg1YzoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3VzZURlZmF1bHRQYXRoX3RleHQ9XHVhZTMwXHViY2Y4IFx1YWNiZFx1Yjg1YyBcdWMwYWNcdWM2YTkNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3dlYlNpdGVfdGV4dD1cdWFjZjVcdWFjMWNcdWI0MWMgXHVjNmY5IFx1YzBhY1x1Yzc3NFx1ZDJiOA0KLXB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGVfdGV4dD1cdWM4MWNcdWJhYTk6DQotcHVibGlzaENvbmZpZ1dpemFyZF9iYW5uZXJJbWFnZV90ZXh0PVx1YmMzMFx1YjEwOCBcdWM3NzRcdWJiZjhcdWM5YzA6DQotcHVibGlzaENvbmZpZ1dpemFyZF9hYm91dEhUTUxfdGV4dD1cdWNlZThcdWQxNTBcdWNlMjAgXHVjODE1XHViY2Y0Og0KLXB1Ymxpc2hDb25maWdXaXphcmRfZmVlZGJhY2tVUkxfdGV4dD1cdWQ1M2NcdWI0ZGNcdWJjMzEgVVJMOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZUluZGV4X3RleHQ9XHVjMGM5XHVjNzc4IFx1ZDM5OFx1Yzc3NFx1YzljMCBcdWFjZjVcdWFjMWMNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVHbG9zc2FyeV90ZXh0PVx1YzZhOVx1YzViNFx1YzlkMSBcdWQzOThcdWM3NzRcdWM5YzAgXHVhY2Y1XHVhYzFjDQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlU2VhcmNoX3RleHQ9XHVhYzgwXHVjMGM5IFx1YWUzMFx1YjJhNSBcdWQzZWNcdWQ1NjgoXHViZTBjXHViNzdjXHVjNmIwXHVjODAwXHVjNzU4IEphdmEgXHVjNTYwXHVkNTBjXHViOWJmIFx1YzljMFx1YzZkMFx1Yzc3NCBcdWQ1NDRcdWM2OTRcdWQ1NjgpDQotcHVibGlzaENvbmZpZ1dpemFyZF91c2VBcHBsZXRfdGV4dD1cdWJjZjRcdWFlMzAgXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OCBcdWM5YzBcdWM2ZDAoXHViZTBjXHViNzdjXHVjNmIwXHVjODAwXHVjNzU4IEphdmEgXHVjNTYwXHVkNTBjXHViOWJmIFx1YzljMFx1YzZkMFx1Yzc3NCBcdWQ1NDRcdWM2OTRcdWQ1NjgpDQotcHVibGlzaENvbmZpZ1dpemFyZF92YWxpZGF0aW9uR3JvdXBfdGV4dD1cdWM3MjBcdWQ2YThcdWMxMzEgXHVhYzgwXHVjOTlkDQotcHVibGlzaENvbmZpZ1dpemFyZF9jaGVja0h5cGVybGlua3NfdGV4dD1cdWM2NzhcdWJkODAgXHVkNTU4XHVjNzc0XHVkMzdjXHViOWMxXHVkMDZjIFx1YWM4MFx1YzBhYw0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlhZ3JhbUdyb3VwX3RleHQ9XHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4DQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eV9kZF90ZXh0PVx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWQzYjhcdWM5ZDFcdWFlMzBcdWM1ZDBcdWMxMWMgXHVjNzkxXHVjMTMxXHViNDE4XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWQ2NWNcdWIzZDkgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOCBcdWFjZjVcdWFjMWMNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3B1Ymxpc2hfZXh0ZW5kX2FjdGl2aXR5X2RpYWdyYW09XHVjMjE4XHVjODE1XHViNDE4XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWQ2NWNcdWIzZDkgXHVkNjU1XHVjN2E1XHVjNzkwXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWQ2NWNcdWIzZDkgXHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4IFx1YWNmNVx1YWMxYw0KLXB1Ymxpc2hDb25maWdXaXphcmRfY29udmVydEJyb2tlbkxpbmtzX3RleHQ9XHViMDRhXHVjNWI0XHVjOWM0IFx1YjljMVx1ZDA2Y1x1Yjk3YyBcdWM3N2NcdWJjMTggXHVkMTRkXHVjMmE0XHVkMmI4XHViODVjIFx1YmNjMFx1ZDY1OA0KLXB1Ymxpc2hDb25maWdXaXphcmRfbGF5b3V0X3RleHQ9XHViODA4XHVjNzc0XHVjNTQ0XHVjNmMzDQotcHVibGlzaENvbmZpZ1dpemFyZF9leHRyYURlc2NyaXB0b3JJbmZvX3RleHQ9XHVhZDAwXHViODI4XHViNDFjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWNlZThcdWQxNTBcdWNlMjAgXHVjNjk0XHVjMThjXHVjNzU4IFx1YzgwNFx1Y2NiNCBcdWNlZThcdWQxNTBcdWNlMjBcdWI5N2MgXHVhYzE2XHVhY2UwIFx1Yzc4OFx1YjI5NCBcdWMxMjRcdWJhODVcdWM3OTAgXHVhY2Y1XHVhYzFjDQotcHVibGlzaENvbmZpZ1dpemFyZF9saWdodFdlaWdodFRyZWVfdGV4dD1cdWQzZjRcdWIzNTRcdWI5N2MgXHVjMGFjXHVjNmE5XHVkNTU4XHVjOWMwIFx1YzU0YVx1YWNlMCBcdWQwYzBcdWMyYTRcdWQwNmMsIFx1YzVlZFx1ZDU2MCwgXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWJjMGYgXHVjNmQwXHVjZTU5IFx1YzY5NFx1YzE4Y1x1YzVkMCBcdWIzMDBcdWQ1NWMgXHVkNTU4XHVjNzA0IFx1ZDJiOFx1YjlhYyBcdWFkNmNcdWM4NzAgXHVjMGRkXHVjMTMxDQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlRW1wdHlDYXRlZ29yaWVzX3RleHQ9XHViZDg0XHViOTU4XHViNDFjIFx1YzY5NFx1YzE4Y1x1YWMwMCBcdWM1YzZcdWIyOTQgXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjIFx1YWNmNVx1YWMxYw0KLQ0KLSMgcHVibGlzaCBwcm9jZXNzIHdpemFyZCBwYWdlDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX3RpdGxlPVx1YWNmNVx1YWMxYyBcdWM3MjBcdWQ2MTUgXHVjMTIwXHVkMGRkDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX3RleHQ9XHVjMTIwXHVkMGRkXHVkNTVjIFx1YWQ2Y1x1YzEzMVx1Yzc3NFx1YjA5OCBcdWFkNmNcdWMxMzFcdWM1ZDBcdWMxMWMgXHVjOWMwXHVjODE1XHVkNTVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNFx1Yjk3YyBcdWFjZjVcdWFjMWNcdWQ1NjAgXHVjMjE4IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4NCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfY2FwYWJpbGl0eV9wYXR0ZXJuPVx1YWUzMFx1YjJhNSBcdWQzMjhcdWQxMzQNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfZGVsaXZlcnlfcHJvY2Vzcz1cdWM4MDRcdWIyZWMgXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0DQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3NlbGVjdFR5cGU9XHVhY2Y1XHVhYzFjIFx1YzcyMFx1ZDYxNSBcdWMxMjBcdWQwZGQNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfdHlwZV9wcm9jZXNzZXM9XHVjNTQ0XHViNzk4IFx1YzEyMFx1ZDBkZFx1YjQxYyBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVhY2Y1XHVhYzFjOg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF90eXBlX2NvbmZpZz1cdWMxMjBcdWQwZGRcdWQ1NWMgXHVhZDZjXHVjMTMxIFx1YWNmNVx1YWMxYw0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9wdWJsaXNoX2Jhc2VfcHJvY2Vzc2VzPVx1Y2MzOFx1Yzg3MFx1YjQxYyBcdWFlMzBcdWJjZjggXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1YWNmNVx1YWMxYw0KLQ0KLSMgUHVibGlzaGluZyBQcmVmZXJlbmNlIFBhZ2UNCi1wcmVmZXJlbmNlUGFnZV9kZWZhdWx0UGF0aF90ZXh0PVx1YWUzMFx1YmNmOCBcdWFjYmRcdWI4NWM6DQotDQotIyBDb25maXJtYXRpb24gRGlhbG9ncw0KLXB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU9XHViYTU0XHVjMThjXHViNGRjIFx1YWQ2Y1x1YzEzMSBcdWFjZjVcdWFjMWMNCi1jb25maXJtUGF0aERpYWxvZ190ZXh0PVx1YjMwMFx1YzBjMSBcdWFjYmRcdWI4NWNcdWFjMDAgJyd7MH0nJyhcdWM3M2MpXHViODVjIFx1ZDU3NFx1YzExZFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVhY2M0XHVjMThkXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLW92ZXJ3cml0ZURpYWxvZ190ZXh0PScnezB9JycgXHViMzAwXHVjMGMxIFx1YWNiZFx1Yjg1Y1x1YWMwMCBcdWM3NzRcdWJiZjggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LiBcdWQzZjRcdWIzNTRcdWM3NTggXHViYWE4XHViNGUwIFx1ZDMwY1x1Yzc3Y1x1Yzc3NCBcdWMwYWRcdWM4MWNcdWI0MjlcdWIyYzhcdWIyZTQuIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8NCi1jYW5jZWxQdWJsaXNoQ29uZmlnX21zZz1cdWFjZjVcdWFjMWMgXHVjODcwXHVjNzkxXHVjNzc0IFx1Y2RlOFx1YzE4Y1x1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4NCi0NCi0jIEVycm9yIERpYWxvZ3MNCi1wcmV2aWV3Q29uZmlnRXJyb3JfdGl0bGU9XHVhY2Y1XHVhYzFjXHViNDFjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzEgXHViYmY4XHViOWFjXHViY2Y0XHVhZTMwDQotdmlld1JlcG9ydEVycm9yX3RpdGxlPVx1YWNmNVx1YWMxYyBcdWJjZjRcdWFjZTBcdWMxMWMgXHViY2Y0XHVhZTMwDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLW1pc3NpbmdWaWV3RXJyb3JfbXNnPUlVUFAwMTAwVzogXHVjMTIwXHVkMGRkXHVkNTVjIFx1YWQ2Y1x1YzEzMVx1YzVkMCBcdWM2MmNcdWJjMTRcdWI5NzggXHViY2Y0XHVhZTMwXHVhYzAwIFx1ZDNlY1x1ZDU2OFx1YjQxOFx1YzViNCBcdWM3ODhcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0LiBcdWFkNmNcdWMxMzFcdWM3NDQgXHVkM2I4XHVjOWQxXHVkNTU4XHVhY2UwIFx1YmNmNFx1YWUzMFx1Yjk3YyBcdWNkOTRcdWFjMDBcdWQ1NThcdWFjNzBcdWIwOTgsIFx1YjJlNFx1Yjk3OCBcdWFkNmNcdWMxMzFcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWNhbm5vdFB1Ymxpc2hFcnJvcl9tc2c9SVVQUDAxMDFFOiBcdWMxMjBcdWQwZGRcdWQ1NWMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YWNmNVx1YWMxY1x1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLWludmFsaWRQYXRoRXJyb3JfbXNnPUlVUFAwMTAyRTogXHViMzAwXHVjMGMxIFx1YWNiZFx1Yjg1Y1x1YWMwMCBcdWFjZjVcdWJjMzFcdWM3NzRcdWFjNzBcdWIwOTggXHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4NCi1pbnZhbGlkUGF0aENoYXJzRXJyb3JfbXNnPUlVUFAwMTAzRTogXHViMzAwXHVjMGMxIFx1YWNiZFx1Yjg1Y1x1YzVkMCBcXCAjICogPyAiIDwgPiB8ICUgLw0KLXB1Ymxpc2hDb25maWdFcnJvcl9tc2c9SVVQUDAxMDRFOiBcdWMxMjBcdWQwZGRcdWQ1NWMgXHVhZDZjXHVjMTMxXHVjNzQ0IFx1YWNmNVx1YWMxY1x1ZDU1OFx1YzljMCBcdWJhYmJcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuDQotcHJldmlld0NvbmZpZ0Vycm9yX21zZz1JVVBQMDEwNUU6IFx1YWNmNVx1YWMxY1x1YjQxYyBcdWFkNmNcdWMxMzFcdWM3NDQgXHViYmY4XHViOWFjXHViY2Y0XHVhZTMwIFx1YzcwNFx1ZDU3NCBIVE1MIFx1YmUwY1x1Yjc3Y1x1YzZiMFx1YzgwMFx1Yjk3YyBcdWM1ZjQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi12aWV3UmVwb3J0RXJyb3JfbXNnPUlVUFAwMTA2RTogXHVhY2Y1XHVhYzFjIFx1YmNmNFx1YWNlMFx1YzExY1x1Yjk3YyBcdWJjZjRcdWFlMzAgXHVjNzA0XHVkNTc0IEhUTUwgXHViZTBjXHViNzdjXHVjNmIwXHVjODAwXHViOTdjIFx1YzVmNCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0Lg0KLQ0KLSMgRXJyb3IgUmVhc29ucyAmIFJlY29tbWVuZGVkIEFjdGlvbnMNCi1wdWJsaXNoQ29uZmlnRXJyb3JfcmVhc29uPUlVUFAwMTA3RTogXHVjNjI0XHViOTU4XHVhYzAwIFx1YmMxY1x1YzBkZFx1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzkwXHVjMTM4XHVkNTVjIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWJjZjRcdWI4MjRcdWJhNzQgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1YjJlOFx1Y2Q5NFx1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotZGVsZXRlRmlsZXNFcnJvcl9yZWFzb249Jyd7MH0nJyBcdWIzMDBcdWMwYzEgXHVhY2JkXHViODVjXHVjNWQwIFx1YzBhZFx1YzgxY1x1ZDU2MCBcdWMyMTggXHVjNWM2XHViMjk0IFx1ZDMwY1x1Yzc3Y1x1Yzc3NCBcdWQzZWNcdWQ1NjhcdWI0MThcdWM1YjQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LiBcblxuXHVjNzc0IFx1YjMwMFx1ZDY1NCBcdWMwYzFcdWM3OTBcdWI5N2MgXHViMmViXHVhY2UwIFx1YjJlNFx1Yjk3OCBcdWFjYmRcdWI4NWNcdWI5N2MgXHVjOWMwXHVjODE1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLWNyZWF0ZURpckVycm9yX3JlYXNvbj0nJ3swfScnIFx1YjMwMFx1YzBjMSBcdWFjYmRcdWI4NWNcdWI5N2MgXHVjNzkxXHVjMTMxXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuXG5cblx1Yzc3NCBcdWIzMDBcdWQ2NTQgXHVjMGMxXHVjNzkwXHViOTdjIFx1YjJlYlx1YWNlMCBcdWIyZTRcdWI5NzggXHVhY2JkXHViODVjXHViOTdjIFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4NCi1vcGVuQnJvd3NlckVycm9yX3JlYXNvbj1cdWM3NzQgXHVjMmRjXHVjMmE0XHVkMTVjXHVjNzU4IFx1YWUzMFx1YmNmOCBIVE1MIFx1YmUwY1x1Yjc3Y1x1YzZiMFx1YzgwMFx1Yjk3YyBcdWNjM2VcdWM3NDQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC5cblxuXHVjNzc0IFx1YjMwMFx1ZDY1NCBcdWMwYzFcdWM3OTBcdWI5N2MgXHViMmViXHVhY2UwIEhUTUwgXHViZTBjXHViNzdjXHVjNmIwXHVjODAwXHViOTdjIFx1YzBhY1x1YzZhOVx1ZDU1OFx1YzVlYyAnJ3swfScnIFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWMyMThcdWIzZDlcdWM3M2NcdWI4NWMgXHVjNWVjXHVjMmVkXHVjMmRjXHVjNjI0Lg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjdhODhmMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYXRpb24gV2l6YXJkDQotcHVibGlzaENvbmZpZ1dpemFyZF90aXRsZT1Db25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIE1cdTAwZTl0b2RvIGRlIFB1YmxpY2FcdTAwZTdcdTAwZTNvDQotcHVibGlzaENvbmZpZ1dpemFyZF9zZWxlY3RDb25maWdQYWdlX3RpdGxlPVNlbGVjaW9uYXIgQ29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBNXHUwMGU5dG9kbw0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0PVNlbGVjaW9uZSBhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGUgbVx1MDBlOXRvZG8gcXVlIGRlc2VqYSBwdWJsaWNhci4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdE9wdGlvbnNQYWdlX3RpdGxlPUVzcGVjaWZpY2FyIE9wXHUwMGU3XHUwMGY1ZXMgZGUgUHVibGljYVx1MDBlN1x1MDBlM28NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdE9wdGlvbnNQYWdlX3RleHQ9RXNwZWNpZmlxdWUgbyBkaXJldFx1MDBmM3JpbyBkZSBkZXN0aW5vIGUgYXMgb3BcdTAwZTdcdTAwZjVlcyBkZSBwdWJsaWNhXHUwMGU3XHUwMGUzby4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX21ldGhvZENvbmZpZ190ZXh0PUNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZG8gbVx1MDBlOXRvZG86DQotcHVibGlzaENvbmZpZ1dpemFyZF9kZXN0aW5hdGlvbkdyb3VwX3RleHQ9RGlyZXRcdTAwZjNyaW8gZGUgZGVzdGlubw0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlyZWN0b3J5X3RleHQ9Q2FtaW5obzoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3VzZURlZmF1bHRQYXRoX3RleHQ9VXRpbGl6YXIgY2FtaW5obyBwYWRyXHUwMGUzbw0KLXB1Ymxpc2hDb25maWdXaXphcmRfd2ViU2l0ZV90ZXh0PVdlYiBzaXRlIHB1YmxpY2Fkbw0KLXB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGVfdGV4dD1DYXJnbzoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2Jhbm5lckltYWdlX3RleHQ9SW1hZ2VtIGRlIGJhbm5lcjoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2Fib3V0SFRNTF90ZXh0PVNvYnJlIG8gY29udGVcdTAwZmFkbzoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2ZlZWRiYWNrVVJMX3RleHQ9VVJMIGRlIGZlZWRiYWNrOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZUluZGV4X3RleHQ9UHVibGljYXIgcFx1MDBlMWdpbmEgZGUgXHUwMGVkbmRpY2UNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVHbG9zc2FyeV90ZXh0PVB1YmxpY2FyIHBcdTAwZTFnaW5hIGRlIGdsb3NzXHUwMGUxcmlvDQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlU2VhcmNoX3RleHQ9SW5jbHVpciByZWN1cnNvIGRlIHByb2N1cmEgKGV4aWdlIHN1cG9ydGUgYSBhcHBsZXQgSmF2YSBubyBuYXZlZ2Fkb3IpDQotcHVibGlzaENvbmZpZ1dpemFyZF91c2VBcHBsZXRfdGV4dD1TdXBvcnRhciBjdXN0b21pemFcdTAwZTdcdTAwZTNvIGRlIHZpc3VhbGl6YVx1MDBlN1x1MDBlM28gKGV4aWdlIHN1cG9ydGUgYSBhcHBsZXQgSmF2YSBubyBuYXZlZ2Fkb3IpDQotcHVibGlzaENvbmZpZ1dpemFyZF92YWxpZGF0aW9uR3JvdXBfdGV4dD1WYWxpZGFcdTAwZTdcdTAwZTNvDQotcHVibGlzaENvbmZpZ1dpemFyZF9jaGVja0h5cGVybGlua3NfdGV4dD1WZXJpZmljYXIgaHlwZXJsaW5rcyBleHRlcm5vcw0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlhZ3JhbUdyb3VwX3RleHQ9RGlhZ3JhbWFzDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eV9kZF90ZXh0PVB1YmxpY2FyIGRpYWdyYW1hcyBkZSBkZXRhbGhlcyBkZSBhdGl2aWRhZGUgcXVlIG5cdTAwZTNvIHRlbmhhbSBzaWRvIGNyaWFkb3Mgbm8gZWRpdG9yIGRlIHByb2Nlc3NvDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtPVB1YmxpY2FyIGRpYWdyYW1hcyBkZSBhdGl2aWRhZGVzIHBhcmEgZXh0ZW5zXHUwMGY1ZXMgZGUgYXRpdmlkYWRlIG5cdTAwZTNvIG1vZGlmaWNhZGFzDQotcHVibGlzaENvbmZpZ1dpemFyZF9jb252ZXJ0QnJva2VuTGlua3NfdGV4dD1Db252ZXJ0ZXIgbGlua3MgZGVzZmVpdG9zIGVtIHRleHRvIHNpbXBsZXMNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2xheW91dF90ZXh0PUxheW91dA0KLXB1Ymxpc2hDb25maWdXaXphcmRfZXh0cmFEZXNjcmlwdG9ySW5mb190ZXh0PVB1YmxpY2FyIGRlc2NyaXRvcmVzIGNvbSBvIGNvbnRlXHUwMGZhZG8gY29tcGxldG8gZG8gZWxlbWVudG8gZGUgY29udGVcdTAwZmFkbyBkbyBtXHUwMGU5dG9kbyByZWxhY2lvbmFkbw0KLXB1Ymxpc2hDb25maWdXaXphcmRfbGlnaHRXZWlnaHRUcmVlX3RleHQ9R2VyYXIgZXN0cnV0dXJhIGRlIHN1Ylx1MDBlMXJ2b3JlIHBhcmEgdGFyZWZhLCBmdW5cdTAwZTdcdTAwZTNvLCBwcm9kdXRvIGRlIHRyYWJhbGhvIGUgZGlzY2lwbGluYXIgZWxlbWVudG9zIHNlbSB1dGlsaXphciBwYXN0YXMNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVFbXB0eUNhdGVnb3JpZXNfdGV4dD1QdWJsaWNhciBjYXRlZ29yaWFzIHNlbSBlbGVtZW50b3MgY2F0ZWdvcml6YWRvcw0KLQ0KLSMgcHVibGlzaCBwcm9jZXNzIHdpemFyZCBwYWdlDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX3RpdGxlPVNlbGVjaW9uYXIgdGlwbyBkZSBwdWJsaWNhXHUwMGU3XHUwMGUzbw0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV90ZXh0PVZvY1x1MDBlYSBwb2RlIHB1YmxpY2FyIGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBzZWxlY2lvbmFkYSBvdSBvcyBwcm9jZXNzb3MgZXNwZWNpZmljYWRvcyBuYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX2NhcGFiaWxpdHlfcGF0dGVybj1QYWRyXHUwMGY1ZXMgZGUgUmVjdXJzbw0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9kZWxpdmVyeV9wcm9jZXNzPVByb2Nlc3NvcyBkZSBFbnRyZWdhDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3NlbGVjdFR5cGU9U2VsZWNpb25hciB0aXBvIGRlIHB1YmxpY2FcdTAwZTdcdTAwZTNvDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3R5cGVfcHJvY2Vzc2VzPVB1YmxpY2FyIG9zIHByb2Nlc3NvcyBzZWxlY2lvbmFkb3MgYSBzZWd1aXI6DQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3R5cGVfY29uZmlnPVB1YmxpY2FyIGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBzZWxlY2lvbmFkYQ0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9wdWJsaXNoX2Jhc2VfcHJvY2Vzc2VzPVB1YmxpY2FyIFByb2Nlc3NvcyBkZSBCYXNlIFJlZmVyaWRvcw0KLQ0KLSMgUHVibGlzaGluZyBQcmVmZXJlbmNlIFBhZ2UNCi1wcmVmZXJlbmNlUGFnZV9kZWZhdWx0UGF0aF90ZXh0PUNhbWluaG8gcGFkclx1MDBlM286DQotDQotIyBDb25maXJtYXRpb24gRGlhbG9ncw0KLXB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU9Q29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBNXHUwMGU5dG9kbyBkZSBQdWJsaWNhXHUwMGU3XHUwMGUzbw0KLWNvbmZpcm1QYXRoRGlhbG9nX3RleHQ9TyBjYW1pbmhvIGRlIGRlc3Rpbm8gZm9pIHJlc29sdmlkbyBwYXJhICcnezB9JycuIERlc2VqYSBjb250aW51YXI/DQotb3ZlcndyaXRlRGlhbG9nX3RleHQ9TyBjYW1pbmhvIGRlIGRlc3Rpbm8gJyd7MH0nJyBqXHUwMGUxIGV4aXN0ZS4gVG9kb3Mgb3MgYXJxdWl2b3MgbmEgcGFzdGEgc2VyXHUwMGUzbyBleGNsdVx1MDBlZGRvcy4gRGVzZWphIGNvbnRpbnVhcj8NCi1jYW5jZWxQdWJsaXNoQ29uZmlnX21zZz1BIG9wZXJhXHUwMGU3XHUwMGUzbyBkZSBwdWJsaWNhXHUwMGU3XHUwMGUzbyBmb2kgY2FuY2VsYWRhLg0KLSMgRXJyb3IgRGlhbG9ncw0KLXByZXZpZXdDb25maWdFcnJvcl90aXRsZT1WaXN1YWxpemFcdTAwZTdcdTAwZTNvIGRlIENvbmZpZ3VyYVx1MDBlN1x1MDBlM28gZGUgTVx1MDBlOXRvZG8gUHVibGljYWRvDQotdmlld1JlcG9ydEVycm9yX3RpdGxlPVZpc3VhbGl6YXIgUmVsYXRcdTAwZjNyaW8gZGUgUHVibGljYVx1MDBlN1x1MDBlM28NCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbWlzc2luZ1ZpZXdFcnJvcl9tc2c9SVVQUDAxMDBXOiBBIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28gc2VsZWNpb25hZGEgblx1MDBlM28gY29udFx1MDBlOW0gdW1hIHZpc3VhbGl6YVx1MDBlN1x1MDBlM28gdlx1MDBlMWxpZGEuIEVkaXRlIGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBlIGluY2x1YSB1bWEgdmlzdWFsaXphXHUwMGU3XHUwMGUzbywgb3Ugc2VsZWNpb25lIG91dHJhIGNvbmZpZ3VyYVx1MDBlN1x1MDBlM28uDQotY2Fubm90UHVibGlzaEVycm9yX21zZz1JVVBQMDEwMUU6IE5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIHB1YmxpY2FyIGEgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBzZWxlY2lvbmFkYS4NCi1pbnZhbGlkUGF0aEVycm9yX21zZz1JVVBQMDEwMkU6IE8gY2FtaW5obyBkZSBkZXN0aW5vIGVzdFx1MDBlMSBlbSBicmFuY28gb3UgXHUwMGU5IGludlx1MDBlMWxpZG8uDQotaW52YWxpZFBhdGhDaGFyc0Vycm9yX21zZz1JVVBQMDEwM0U6IE8gY2FtaW5obyBkZSBkZXN0aW5vIG5cdTAwZTNvIHBvZGUgY29udGVyIGVzdGVzIGNhcmFjdGVyZXM6IFxcICMgKiA/ICIgPCA+IHwgISAlIC8NCi1wdWJsaXNoQ29uZmlnRXJyb3JfbXNnPUlVUFAwMTA0RTogQSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHNlbGVjaW9uYWRhIG5cdTAwZTNvIGZvaSBwdWJsaWNhZGEgY29tIFx1MDBlYXhpdG8uDQotcHJldmlld0NvbmZpZ0Vycm9yX21zZz1JVVBQMDEwNUU6IEltcG9zc1x1MDBlZHZlbCBhYnJpciB1bSBuYXZlZ2Fkb3IgZGUgSFRNTCBwYXJhIHZpc3VhbGl6YXIgYSBjb25maWd1cmFcdTAwZTdcdTAwZTNvIHB1YmxpY2FkYS4NCi12aWV3UmVwb3J0RXJyb3JfbXNnPUlVUFAwMTA2RTogSW1wb3NzXHUwMGVkdmVsIGFicmlyIHVtIG5hdmVnYWRvciBkZSBIVE1MIHBhcmEgdmlzdWFsaXphciBvIHJlbGF0XHUwMGYzcmlvIGRlIHB1YmxpY2FcdTAwZTdcdTAwZTNvLg0KLQ0KLSMgRXJyb3IgUmVhc29ucyAmIFJlY29tbWVuZGVkIEFjdGlvbnMNCi1wdWJsaXNoQ29uZmlnRXJyb3JfcmVhc29uPUlVUFAwMTA3RTogT2NvcnJldSB1bSBlcnJvLiBTZWxlY2lvbmUgbyBib3RcdTAwZTNvIERldGFsaGVzIHBhcmEgb2J0ZXIgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGFkaWNpb25haXMuDQotZGVsZXRlRmlsZXNFcnJvcl9yZWFzb249TyBjYW1pbmhvIGRlIGRlc3Rpbm8gJyd7MH0nJyBjb250XHUwMGU5bSBhcnF1aXZvcyBxdWUgblx1MDBlM28gcG9kZW0gc2VyIGV4Y2x1XHUwMGVkZG9zLlxuXG5GZWNoZSBlc3RlIGRpXHUwMGUxbG9nbyBlIGVzcGVjaWZpcXVlIG91dHJvIGNhbWluaG8uDQotY3JlYXRlRGlyRXJyb3JfcmVhc29uPU5cdTAwZTNvIFx1MDBlOSBwb3NzXHUwMGVkdmVsIGNyaWFyIG8gY2FtaW5obyBkZSBkZXN0aW5vICcnezB9JycuXG5cbkZlY2hlIGVzdGUgZGlcdTAwZTFsb2dvIGUgZXNwZWNpZmlxdWUgb3V0cm8gY2FtaW5oby4NCi1vcGVuQnJvd3NlckVycm9yX3JlYXNvbj1OXHUwMGUzbyBmb2kgcG9zc1x1MDBlZHZlbCBkZXRlY3RhciBvdSBsb2NhbGl6YXIgbyBuYXZlZ2Fkb3IgZGUgSFRNTCBwYWRyXHUwMGUzbyBuZXN0ZSBzaXN0ZW1hLlxuXG5GZWNoZSBlc3RlIGRpXHUwMGUxbG9nbyBlIGFicmEgbyBhcnF1aXZvICcnezB9JycgbWFudWFsbWVudGUgY29tIHVtIG5hdmVnYWRvciBkZSBIVE1MLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTI2YjYzYi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYXRpb24gV2l6YXJkDQotcHVibGlzaENvbmZpZ1dpemFyZF90aXRsZT1cdTUzZDFcdTVlMDNcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmUNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9XHU5MDA5XHU2MmU5XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotcHVibGlzaENvbmZpZ1dpemFyZF9zZWxlY3RDb25maWdQYWdlX3RleHQ9XHU5MDA5XHU2MmU5XHU1ZTBjXHU2NzFiXHU1M2QxXHU1ZTAzXHU3Njg0XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlXHUzMDAyDQotcHVibGlzaENvbmZpZ1dpemFyZF9zZWxlY3RPcHRpb25zUGFnZV90aXRsZT1cdTYzMDdcdTViOWFcdTUzZDFcdTVlMDNcdTkwMDlcdTk4NzkNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdE9wdGlvbnNQYWdlX3RleHQ9XHU2MzA3XHU1YjlhXHU3NmVlXHU2ODA3XHU3NmVlXHU1ZjU1XHU1NDhjXHU1M2QxXHU1ZTAzXHU5MDA5XHU5ODc5XHUzMDAyDQotcHVibGlzaENvbmZpZ1dpemFyZF9tZXRob2RDb25maWdfdGV4dD1cdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdWZmMWENCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2Rlc3RpbmF0aW9uR3JvdXBfdGV4dD1cdTc2ZWVcdTY4MDdcdTc2ZWVcdTVmNTUNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2RpcmVjdG9yeV90ZXh0PVx1OGRlZlx1NWY4NFx1ZmYxYQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfdXNlRGVmYXVsdFBhdGhfdGV4dD1cdTRmN2ZcdTc1MjhcdTdmM2FcdTc3MDFcdThkZWZcdTVmODQNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3dlYlNpdGVfdGV4dD1cdTVkZjJcdTUzZDFcdTVlMDNcdTc2ODQgV2ViIFx1N2FkOVx1NzBiOQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGVfdGV4dD1cdTY4MDdcdTk4OThcdWZmMWENCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2Jhbm5lckltYWdlX3RleHQ9XHU2NzYxXHU1ZTQ1XHU1NmZlXHU1MGNmXHVmZjFhDQotcHVibGlzaENvbmZpZ1dpemFyZF9hYm91dEhUTUxfdGV4dD1cdTUxNzNcdTRlOGVcdTUxODVcdTViYjlcdWZmMWENCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2ZlZWRiYWNrVVJMX3RleHQ9XHU1M2NkXHU5OTg4IFVSTFx1ZmYxYQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZUluZGV4X3RleHQ9XHU1M2QxXHU1ZTAzXHU3ZDIyXHU1ZjE1XHU5ODc1XHU5NzYyDQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlR2xvc3NhcnlfdGV4dD1cdTUzZDFcdTVlMDNcdThiY2RcdTZjNDdcdTg4NjhcdTk4NzVcdTk3NjINCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVTZWFyY2hfdGV4dD1cdTUzMDVcdTU0MmJcdTY0MWNcdTdkMjJcdTUyOWZcdTgwZmRcdWZmMDhcdTZkNGZcdTg5YzhcdTU2NjhcdTRlMmRcdTk3MDBcdTg5ODFcdTY3MDkgSmF2YSBhcHBsZXQgXHU2NTJmXHU2MzAxXHVmZjA5DQotcHVibGlzaENvbmZpZ1dpemFyZF91c2VBcHBsZXRfdGV4dD1cdTY1MmZcdTYzMDFcdTg5YzZcdTU2ZmVcdTViOWFcdTUyMzZcdWZmMDhcdTZkNGZcdTg5YzhcdTU2NjhcdTRlMmRcdTk3MDBcdTg5ODFcdTY3MDkgSmF2YSBhcHBsZXQgXHU2NTJmXHU2MzAxXHVmZjA5DQotcHVibGlzaENvbmZpZ1dpemFyZF92YWxpZGF0aW9uR3JvdXBfdGV4dD1cdTlhOGNcdThiYzENCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2NoZWNrSHlwZXJsaW5rc190ZXh0PVx1NjhjMFx1NjdlNVx1NTkxNlx1OTBlOFx1OGQ4NVx1OTRmZVx1NjNhNQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlhZ3JhbUdyb3VwX3RleHQ9XHU1NmZlDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eV9kZF90ZXh0PVx1NTNkMVx1NWUwM1x1NWMxYVx1NjcyYVx1NTcyOFx1NmQ0MVx1N2EwYlx1N2YxNlx1OGY5MVx1NTY2OFx1NGUyZFx1NTIxYlx1NWVmYVx1NzY4NFx1NmQzYlx1NTJhOFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1NTZmZQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfcHVibGlzaF9leHRlbmRfYWN0aXZpdHlfZGlhZ3JhbT1cdTUzZDFcdTVlMDNcdTY3MmFcdTRmZWVcdTY1MzlcdTc2ODRcdTZkM2JcdTUyYThcdTYyNjlcdTVjNTVcdTc2ODRcdTZkM2JcdTUyYThcdTU2ZmVcdTMwMDINCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2NvbnZlcnRCcm9rZW5MaW5rc190ZXh0PVx1NWMwNlx1NjVhZFx1NWYwMFx1NzY4NFx1OTRmZVx1NjNhNVx1OGY2Y1x1NjM2Mlx1NGUzYVx1N2VhZlx1NjU4N1x1NjcyYw0KLXB1Ymxpc2hDb25maWdXaXphcmRfbGF5b3V0X3RleHQ9XHU1ZTAzXHU1YzQwDQotcHVibGlzaENvbmZpZ1dpemFyZF9leHRyYURlc2NyaXB0b3JJbmZvX3RleHQ9XHU1M2QxXHU1ZTAzXHU1ZTI2XHU3NmY4XHU1MTczXHU2NWI5XHU2Y2Q1XHU1MTg1XHU1YmI5XHU1MTQzXHU3ZDIwXHU3Njg0XHU1YjhjXHU2NTc0XHU1MTg1XHU1YmI5XHU3Njg0XHU2M2NmXHU4ZmYwXHU3YjI2DQotcHVibGlzaENvbmZpZ1dpemFyZF9saWdodFdlaWdodFRyZWVfdGV4dD1cdTc1MWZcdTYyMTBcdTRlZmJcdTUyYTFcdTMwMDFcdTg5ZDJcdTgyNzJcdTMwMDFcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTU0OGNcdTg5YzRcdTdhMGJcdTUxNDNcdTdkMjBcdTc2ODRcdTViNTBcdTY4MTFcdTdlZDNcdTY3ODRcdWZmMGNcdTRlMGRcdTRmN2ZcdTc1MjhcdTY1ODdcdTRlZjZcdTU5MzkNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVFbXB0eUNhdGVnb3JpZXNfdGV4dD1cdTUzZDFcdTVlMDNcdTZjYTFcdTY3MDlcdTVkZjJcdTUyMDZcdTdjN2JcdTUxNDNcdTdkMjBcdTc2ODRcdTdjN2JcdTUyMmINCi0NCi0jIHB1Ymxpc2ggcHJvY2VzcyB3aXphcmQgcGFnZQ0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV90aXRsZT1cdTkwMDlcdTYyZTlcdTUzZDFcdTVlMDNcdTdjN2JcdTU3OGINCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfdGV4dD1cdTYwYThcdTUzZWZcdTRlZTVcdTUzZDFcdTVlMDNcdTkwMDlcdTViOWFcdTc2ODRcdTkxNGRcdTdmNmVcdWZmMGNcdTRlNWZcdTUzZWZcdTRlZTVcdTUzZDFcdTVlMDNcdTkxNGRcdTdmNmVcdTRlMmRcdTYzMDdcdTViOWFcdTc2ODRcdTZkNDFcdTdhMGINCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfY2FwYWJpbGl0eV9wYXR0ZXJuPVx1ODBmZFx1NTI5Ylx1NmEyMVx1NWYwZg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9kZWxpdmVyeV9wcm9jZXNzPVx1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9zZWxlY3RUeXBlPVx1OTAwOVx1NjJlOVx1NTNkMVx1NWUwM1x1N2M3Ylx1NTc4Yg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF90eXBlX3Byb2Nlc3Nlcz1cdTUzZDFcdTVlMDNcdTRlZTVcdTRlMGJcdTc2ODRcdTkwMDlcdTViOWFcdTZkNDFcdTdhMGJcdWZmMWENCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfdHlwZV9jb25maWc9XHU1M2QxXHU1ZTAzXHU5MDA5XHU1YjlhXHU3Njg0XHU5MTRkXHU3ZjZlDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3B1Ymxpc2hfYmFzZV9wcm9jZXNzZXM9XHU1M2QxXHU1ZTAzXHU1ZjE1XHU3NTI4XHU3Njg0XHU1N2ZhXHU2NzJjXHU2ZDQxXHU3YTBiDQotDQotIyBQdWJsaXNoaW5nIFByZWZlcmVuY2UgUGFnZQ0KLXByZWZlcmVuY2VQYWdlX2RlZmF1bHRQYXRoX3RleHQ9XHU3ZjNhXHU3NzAxXHU4ZGVmXHU1Zjg0XHVmZjFhDQotDQotIyBDb25maXJtYXRpb24gRGlhbG9ncw0KLXB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU9XHU1M2QxXHU1ZTAzXHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotY29uZmlybVBhdGhEaWFsb2dfdGV4dD1cdTc2ZWVcdTY4MDdcdThkZWZcdTVmODRcdTVkZjJcdTg5ZTNcdTY3OTBcdTRlM2FcdTIwMWN7MH1cdTIwMWRcdTMwMDJcdTY2MmZcdTU0MjZcdTg5ODFcdTdlZTdcdTdlZWRcdWZmMWYNCi1vdmVyd3JpdGVEaWFsb2dfdGV4dD1cdTc2ZWVcdTY4MDdcdThkZWZcdTVmODRcdTIwMWN7MH1cdTIwMWRcdTVkZjJcdTViNThcdTU3MjhcdTMwMDJcdTVjMDZcdTUyMjBcdTk2NjRcdThiZTVcdTY1ODdcdTRlZjZcdTU5MzlcdTRlMmRcdTc2ODRcdTYyNDBcdTY3MDlcdTY1ODdcdTRlZjZcdTMwMDJcdTY2MmZcdTU0MjZcdTg5ODFcdTdlZTdcdTdlZWRcdWZmMWYNCi1jYW5jZWxQdWJsaXNoQ29uZmlnX21zZz1cdTUzZDFcdTVlMDNcdTY0Y2RcdTRmNWNcdTVkZjJcdTUzZDZcdTZkODhcdTMwMDINCi0NCi0jIEVycm9yIERpYWxvZ3MNCi1wcmV2aWV3Q29uZmlnRXJyb3JfdGl0bGU9XHU5ODg0XHU4OWM4XHU1M2QxXHU1ZTAzXHU3Njg0XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotdmlld1JlcG9ydEVycm9yX3RpdGxlPVx1NjdlNVx1NzcwYlx1NTNkMVx1NWUwM1x1NjJhNVx1NTQ0YQ0KLQ0KLSMgRXJyb3IgTWVzc2FnZXMNCi1taXNzaW5nVmlld0Vycm9yX21zZz1JVVBQMDEwMFc6IFx1OTAwOVx1NWI5YVx1NzY4NFx1OTE0ZFx1N2Y2ZVx1NGUwZFx1NTMwNVx1NTQyYlx1NjcwOVx1NjU0OFx1ODljNlx1NTZmZVx1MzAwMlx1OGJmN1x1N2YxNlx1OGY5MVx1OTE0ZFx1N2Y2ZVx1ZmYwY1x1NmRmYlx1NTJhMFx1ODljNlx1NTZmZVx1ZmYwY1x1NjIxNlx1OTAwOVx1NjJlOVx1NTNlNlx1NGUwMFx1NGUyYVx1OTE0ZFx1N2Y2ZVx1MzAwMg0KLWNhbm5vdFB1Ymxpc2hFcnJvcl9tc2c9SVVQUDAxMDFFOiBcdTY1ZTBcdTZjZDVcdTUzZDFcdTVlMDNcdTkwMDlcdTViOWFcdTc2ODRcdTkxNGRcdTdmNmVcdTMwMDINCi1pbnZhbGlkUGF0aEVycm9yX21zZz1JVVBQMDEwMkU6IFx1NzZlZVx1NjgwN1x1OGRlZlx1NWY4NFx1NGUzYVx1N2E3YVx1NjIxNlx1NjVlMFx1NjU0OFx1MzAwMg0KLWludmFsaWRQYXRoQ2hhcnNFcnJvcl9tc2c9SVVQUDAxMDNFOiBcdTc2ZWVcdTY4MDdcdThkZWZcdTVmODRcdTRlMGRcdTgwZmRcdTUzMDVcdTU0MmJcdTRlZTVcdTRlMGJcdTViNTdcdTdiMjZcdWZmMWFcXCAjICogPyAiIDwgPiB8ICEgJSAvDQotcHVibGlzaENvbmZpZ0Vycm9yX21zZz1JVVBQMDEwNEU6IFx1OTAwOVx1NWI5YVx1NzY4NFx1OTE0ZFx1N2Y2ZVx1NjcyYVx1NjIxMFx1NTI5Zlx1NTNkMVx1NWUwM1x1MzAwMg0KLXByZXZpZXdDb25maWdFcnJvcl9tc2c9SVVQUDAxMDVFOiBcdTY1ZTBcdTZjZDVcdTYyNTNcdTVmMDAgSFRNTCBcdTZkNGZcdTg5YzhcdTU2NjhcdTk4ODRcdTg5YzhcdTUzZDFcdTVlMDNcdTc2ODRcdTkxNGRcdTdmNmVcdTMwMDINCi12aWV3UmVwb3J0RXJyb3JfbXNnPUlVUFAwMTA2RTogXHU2NWUwXHU2Y2Q1XHU2MjUzXHU1ZjAwIEhUTUwgXHU2ZDRmXHU4OWM4XHU1NjY4XHU2N2U1XHU3NzBiXHU1M2QxXHU1ZTAzXHU2MmE1XHU1NDRhXHUzMDAyDQotDQotIyBFcnJvciBSZWFzb25zICYgUmVjb21tZW5kZWQgQWN0aW9ucw0KLXB1Ymxpc2hDb25maWdFcnJvcl9yZWFzb249SVVQUDAxMDdFOiBcdTUzZDFcdTc1MWZcdTk1MTlcdThiZWZcdTMwMDJcdThiZjdcdTkwMDlcdTYyZTlcdTIwMWNcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTIwMWRcdTYzMDlcdTk0YWVcdWZmMGNcdTgzYjdcdTUzZDZcdTY2ZjRcdTU5MWFcdTRmZTFcdTYwNmZcdTMwMDINCi1kZWxldGVGaWxlc0Vycm9yX3JlYXNvbj1cdTc2ZWVcdTY4MDdcdThkZWZcdTVmODRcdTIwMWN7MH1cdTIwMWRcdTUzMDVcdTU0MmJcdTY1ZTBcdTZjZDVcdTUyMjBcdTk2NjRcdTc2ODRcdTY1ODdcdTRlZjZcdTMwMDJcblxuXHU4YmY3XHU1MTczXHU5NWVkXHU2YjY0XHU1YmY5XHU4YmRkXHU2ODQ2XHVmZjBjXHU3MTM2XHU1NDBlXHU2MzA3XHU1YjlhXHU1M2U2XHU0ZTAwXHU0ZTJhXHU4ZGVmXHU1Zjg0XHUzMDAyDQotY3JlYXRlRGlyRXJyb3JfcmVhc29uPVx1NjVlMFx1NmNkNVx1NTIxYlx1NWVmYVx1NzZlZVx1NjgwN1x1OGRlZlx1NWY4NFx1MjAxY3swfVx1MjAxZFx1MzAwMlxuXG5cdThiZjdcdTUxNzNcdTk1ZWRcdTZiNjRcdTViZjlcdThiZGRcdTY4NDZcdWZmMGNcdTcxMzZcdTU0MGVcdTYzMDdcdTViOWFcdTUzZTZcdTRlMDBcdTRlMmFcdThkZWZcdTVmODRcdTMwMDINCi1vcGVuQnJvd3NlckVycm9yX3JlYXNvbj1cdTY1ZTBcdTZjZDVcdTY4YzBcdTZkNGJcdTYyMTZcdTY3ZTVcdTYyN2VcdTZiNjRcdTdjZmJcdTdlZGZcdTRlMGFcdTc2ODRcdTdmM2FcdTc3MDEgSFRNTCBcdTZkNGZcdTg5YzhcdTU2NjhcdTMwMDJcblxuXHU4YmY3XHU1MTczXHU5NWVkXHU2YjY0XHU1YmY5XHU4YmRkXHU2ODQ2XHVmZjBjXHU3MTM2XHU1NDBlXHU0ZjdmXHU3NTI4IEhUTUwgXHU2ZDRmXHU4OWM4XHU1NjY4XHU2MjRiXHU1ZGU1XHU2MjUzXHU1ZjAwXHU2NTg3XHU0ZWY2XHUyMDFjezB9XHUyMDFkXHUzMDAyDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ODNhZjA4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlPVx1NzY3Y1x1NGY0OFx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1cdTkwNzhcdTUzZDZcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmUNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGV4dD1cdTkwNzhcdTUzZDZcdTYwYThcdTg5ODFcdTc2N2NcdTRmNDhcdTc2ODRcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmVcdTMwMDINCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdE9wdGlvbnNQYWdlX3RpdGxlPVx1NjMwN1x1NWI5YVx1NzY3Y1x1NGY0OFx1OTA3OFx1OTgwNQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0T3B0aW9uc1BhZ2VfdGV4dD1cdTYzMDdcdTViOWFcdTc2ZWVcdTZhMTlcdTc2ZWVcdTkzMDRcdTU0OGNcdTc2N2NcdTRmNDhcdTkwNzhcdTk4MDVcdTMwMDINCi1wdWJsaXNoQ29uZmlnV2l6YXJkX21ldGhvZENvbmZpZ190ZXh0PVx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZVx1ZmYxYQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGVzdGluYXRpb25Hcm91cF90ZXh0PVx1NzZlZVx1NmExOVx1NzZlZVx1OTMwNA0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlyZWN0b3J5X3RleHQ9XHU4ZGVmXHU1ZjkxXHVmZjFhDQotcHVibGlzaENvbmZpZ1dpemFyZF91c2VEZWZhdWx0UGF0aF90ZXh0PVx1NGY3Zlx1NzUyOFx1OTgxMFx1OGEyZFx1OGRlZlx1NWY5MQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfd2ViU2l0ZV90ZXh0PVx1NWRmMlx1NzY3Y1x1NGY0OFx1NzY4NFx1N2RiMlx1N2FkOQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGVfdGV4dD1cdTZhMTlcdTk4NGNcdWZmMWENCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2Jhbm5lckltYWdlX3RleHQ9XHU2YTE5XHU5ODRjXHU1ZjcxXHU1MGNmXHVmZjFhDQotcHVibGlzaENvbmZpZ1dpemFyZF9hYm91dEhUTUxfdGV4dD1cdTk1ZGNcdTY1YmNcdTUxNjdcdTViYjlcdWZmMWENCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2ZlZWRiYWNrVVJMX3RleHQ9XHU2MTBmXHU4OThiIFVSTFx1ZmYxYQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZUluZGV4X3RleHQ9XHU3NjdjXHU0ZjQ4XHU3ZDIyXHU1ZjE1XHU5ODAxDQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlR2xvc3NhcnlfdGV4dD1cdTc2N2NcdTRmNDhcdTU0MGRcdThhNWVcdTg5ZTNcdTkxY2JcdTk4MDENCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVTZWFyY2hfdGV4dD1cdTUzMDVcdTYyZWNcdTY0MWNcdTVjMGJcdTUyOWZcdTgwZmRcdWZmMDhcdTcwMGZcdTg5YmRcdTU2NjhcdTk3MDBcdTg5ODEgSmF2YSBBcHBsZXQgXHU2NTJmXHU2M2Y0XHVmZjA5DQotcHVibGlzaENvbmZpZ1dpemFyZF91c2VBcHBsZXRfdGV4dD1cdTY1MmZcdTYzZjRcdTgxZWFcdThhMDJcdTZhYTJcdTg5OTZcdTc1NmJcdTk3NjJcdWZmMDhcdTcwMGZcdTg5YmRcdTU2NjhcdTk3MDBcdTg5ODEgSmF2YSBBcHBsZXQgXHU2NTJmXHU2M2Y0XHVmZjA5DQotcHVibGlzaENvbmZpZ1dpemFyZF92YWxpZGF0aW9uR3JvdXBfdGV4dD1cdTlhNTdcdThiNDkNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2NoZWNrSHlwZXJsaW5rc190ZXh0PVx1NmFhMlx1NjdlNVx1NTkxNlx1OTBlOFx1OGQ4NVx1OTNjOFx1N2Q1MA0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlhZ3JhbUdyb3VwX3RleHQ9XHU1NzE2XHU4OWUzDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eV9kZF90ZXh0PVx1NzY3Y1x1NGY0OFx1NWMxYVx1NjcyYVx1NjViY1x1N2EwYlx1NWU4Zlx1N2RlOFx1OGYyZlx1NTY2OFx1NGUyZFx1NWVmYVx1N2FjYlx1NzY4NFx1NmQzYlx1NTJkNVx1NjYwZVx1N2QzMFx1NTcxNg0KLXB1Ymxpc2hDb25maWdXaXphcmRfcHVibGlzaF9leHRlbmRfYWN0aXZpdHlfZGlhZ3JhbT1cdTc2N2NcdTRmNDhcdTU0MmJcdTY3MDlcdTY3MmFcdTRmZWVcdTY1MzlcdTc2ODRcdTZkM2JcdTUyZDVcdTVlZjZcdTRmMzhcdTc2ODRcdTZkM2JcdTUyZDVcdTU3MTYNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2NvbnZlcnRCcm9rZW5MaW5rc190ZXh0PVx1NWMwN1x1NGUyZFx1NjViN1x1NzY4NFx1OTNjOFx1N2Q1MFx1OGY0OVx1NjNkYlx1NjIxMFx1N2QxNFx1NjU4N1x1NWI1Nw0KLXB1Ymxpc2hDb25maWdXaXphcmRfbGF5b3V0X3RleHQ9XHU3MjQ4XHU5NzYyXHU5MTRkXHU3ZjZlDQotcHVibGlzaENvbmZpZ1dpemFyZF9leHRyYURlc2NyaXB0b3JJbmZvX3RleHQ9XHU3NjdjXHU0ZjQ4XHU2M2NmXHU4ZmYwXHU1YjUwXHU1M2NhXHU3NmY4XHU5NWRjXHU2NWI5XHU2Y2Q1XHU1MTY3XHU1YmI5XHU1MTQzXHU3ZDIwXHU3Njg0XHU1YjhjXHU2NTc0XHU1MTY3XHU1YmI5DQotcHVibGlzaENvbmZpZ1dpemFyZF9saWdodFdlaWdodFRyZWVfdGV4dD1cdTc1MjJcdTc1MWZcdTRmNWNcdTY5NmRcdTMwMDFcdTg5ZDJcdTgyNzJcdTMwMDFcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWNcdTUzY2FcdTdkMDBcdTVmOGJcdTUxNDNcdTdkMjBcdTc2ODRcdTViNTBcdTZhMzlcdTcyYzBcdTdkNTBcdTY5Y2JcdWZmMGNcdTRlMGRcdTRmN2ZcdTc1MjhcdThjYzdcdTY1OTlcdTU5M2UNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVFbXB0eUNhdGVnb3JpZXNfdGV4dD1cdTc2N2NcdTRmNDhcdTcxMjFcdTUyMDZcdTk4NWVcdTUxNDNcdTdkMjBcdTc2ODRcdTdhMmVcdTk4NWUNCi0NCi0jIHB1Ymxpc2ggcHJvY2VzcyB3aXphcmQgcGFnZQ0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV90aXRsZT1cdTkwNzhcdTUzZDZcdTc2N2NcdTRmNDhcdTk4NWVcdTU3OGINCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfdGV4dD1cdTYwYThcdTUzZWZcdTRlZTVcdTc2N2NcdTRmNDhcdTkwNzhcdTUzZDZcdTc2ODRcdTkxNGRcdTdmNmVcdTYyMTZcdTkxNGRcdTdmNmVcdTRlMmRcdTYzMDdcdTViOWFcdTc2ODRcdTZkNDFcdTdhMGINCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfY2FwYWJpbGl0eV9wYXR0ZXJuPVx1NTI5Zlx1ODBmZFx1NTc4Ylx1NmEyMw0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9kZWxpdmVyeV9wcm9jZXNzPVx1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9zZWxlY3RUeXBlPVx1OTA3OFx1NTNkNlx1NzY3Y1x1NGY0OFx1OTg1ZVx1NTc4Yg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF90eXBlX3Byb2Nlc3Nlcz1cdTc2N2NcdTRmNDhcdTRlMGJcdTUyMTdcdTkwNzhcdTUzZDZcdTc2ODRcdTZkNDFcdTdhMGJcdWZmMWENCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfdHlwZV9jb25maWc9XHU3NjdjXHU0ZjQ4XHU5MDc4XHU1M2Q2XHU3Njg0XHU5MTRkXHU3ZjZlDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3B1Ymxpc2hfYmFzZV9wcm9jZXNzZXM9XHU3NjdjXHU0ZjQ4XHU1M2MzXHU3MTY3XHU3Njg0XHU1N2ZhXHU2NzJjXHU2ZDQxXHU3YTBiDQotDQotIyBQdWJsaXNoaW5nIFByZWZlcmVuY2UgUGFnZQ0KLXByZWZlcmVuY2VQYWdlX2RlZmF1bHRQYXRoX3RleHQ9XHU5ODEwXHU4YTJkXHU4ZGVmXHU1ZjkxXHVmZjFhDQotDQotIyBDb25maXJtYXRpb24gRGlhbG9ncw0KLXB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU9XHU3NjdjXHU0ZjQ4XHU2NWI5XHU2Y2Q1XHU5MTRkXHU3ZjZlDQotY29uZmlybVBhdGhEaWFsb2dfdGV4dD1cdTc2ZWVcdTZhMTlcdThkZWZcdTVmOTFcdTVkZjJcdTg5ZTNcdTY3OTBcdTcwYmEgJyd7MH0nJ1x1MzAwMlx1ODk4MVx1N2U3Y1x1N2U4Y1x1NTVjZVx1ZmYxZg0KLW92ZXJ3cml0ZURpYWxvZ190ZXh0PVx1NzZlZVx1NmExOVx1OGRlZlx1NWY5MSAnJ3swfScnIFx1NWRmMlx1NWI1OFx1NTcyOFx1MzAwMlx1NWMwN1x1NTIyYVx1OTY2NFx1OGNjN1x1NjU5OVx1NTkzZVx1NGUyZFx1NzY4NFx1NjI0MFx1NjcwOVx1NmE5NFx1Njg0OFx1MzAwMlx1ODk4MVx1N2U3Y1x1N2U4Y1x1NTVjZVx1ZmYxZg0KLWNhbmNlbFB1Ymxpc2hDb25maWdfbXNnPVx1NWRmMlx1NTNkNlx1NmQ4OFx1NzY3Y1x1NGY0OFx1NGY1Y1x1Njk2ZFx1MzAwMg0KLQ0KLSMgRXJyb3IgRGlhbG9ncw0KLXByZXZpZXdDb25maWdFcnJvcl90aXRsZT1cdTk4MTBcdTg5YmRcdTg5ODFcdTc2N2NcdTRmNDhcdTc2ODRcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmUNCi12aWV3UmVwb3J0RXJyb3JfdGl0bGU9XHU2YWEyXHU4OTk2XHU3NjdjXHU0ZjQ4XHU1ODMxXHU1NDRhDQotDQotIyBFcnJvciBNZXNzYWdlcw0KLW1pc3NpbmdWaWV3RXJyb3JfbXNnPUlVUFAwMTAwVzogXHU5MDc4XHU1M2Q2XHU3Njg0XHU5MTRkXHU3ZjZlXHU0ZTBkXHU1NDJiXHU2NzA5XHU2NTQ4XHU3Njg0XHU4OTk2XHU1NzE2XHUzMDAyXHU3ZGU4XHU4ZjJmXHU5MTRkXHU3ZjZlXHU0ZTI2XHU2NWIwXHU1ODllXHU4OTk2XHU1NzE2XHVmZjBjXHU2MjE2XHU5MDc4XHU1M2Q2XHU1M2U2XHU0ZTAwXHU1MDBiXHU5MTRkXHU3ZjZlXHUzMDAyDQotY2Fubm90UHVibGlzaEVycm9yX21zZz1JVVBQMDEwMUU6IFx1NzEyMVx1NmNkNVx1NzY3Y1x1NGY0OFx1NWRmMlx1OTA3OFx1NTNkNlx1NzY4NFx1OTE0ZFx1N2Y2ZVx1MzAwMg0KLWludmFsaWRQYXRoRXJyb3JfbXNnPUlVUFAwMTAyRTogXHU3NmVlXHU2YTE5XHU4ZGVmXHU1ZjkxXHU3YTdhXHU3NjdkXHU2MjE2XHU3MTIxXHU2NTQ4XHUzMDAyDQotaW52YWxpZFBhdGhDaGFyc0Vycm9yX21zZz1JVVBQMDEwM0U6IFx1NzZlZVx1NmExOVx1OGRlZlx1NWY5MVx1NGUwZFx1ODBmZFx1NTMwNVx1NTQyYlx1OTAxOVx1NGU5Ylx1NWI1N1x1NTE0M1x1ZmYxYVxcICMgKiA/ICIgPCA+IHwgISAlIC8NCi1wdWJsaXNoQ29uZmlnRXJyb3JfbXNnPUlVUFAwMTA0RTogXHU2NzJhXHU5ODA2XHU1MjI5XHU3NjdjXHU0ZjQ4XHU5MDc4XHU1M2Q2XHU3Njg0XHU5MTRkXHU3ZjZlXHUzMDAyDQotcHJldmlld0NvbmZpZ0Vycm9yX21zZz1JVVBQMDEwNUU6IFx1NzEyMVx1NmNkNVx1OTU4Ylx1NTU1ZiBIVE1MIFx1NzAwZlx1ODliZFx1NTY2OFx1NGY4Nlx1OTgxMFx1ODliZFx1ODk4MVx1NzY3Y1x1NGY0OFx1NzY4NFx1OTE0ZFx1N2Y2ZVx1MzAwMg0KLXZpZXdSZXBvcnRFcnJvcl9tc2c9SVVQUDAxMDZFOiBcdTcxMjFcdTZjZDVcdTk1OGJcdTU1NWYgSFRNTCBcdTcwMGZcdTg5YmRcdTU2NjhcdTRmODZcdTZhYTJcdTg5OTZcdTc2N2NcdTRmNDhcdTU4MzFcdTU0NGFcdTMwMDINCi0NCi0jIEVycm9yIFJlYXNvbnMgJiBSZWNvbW1lbmRlZCBBY3Rpb25zDQotcHVibGlzaENvbmZpZ0Vycm9yX3JlYXNvbj1JVVBQMDEwN0U6IFx1NzY3Y1x1NzUxZlx1OTMyZlx1OGFhNFx1MzAwMlx1NTk4Mlx1OTcwMFx1NzZmOFx1OTVkY1x1OGNjN1x1OGEwYVx1ZmYwY1x1OGFjYlx1OTA3OFx1NTNkNlx1MzAwY1x1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1MzAwZFx1NjMwOVx1OTIxNVx1MzAwMg0KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPVx1NzZlZVx1NmExOVx1OGRlZlx1NWY5MSAnJ3swfScnIFx1NTMwNVx1NTQyYlx1NzEyMVx1NmNkNVx1NTIyYVx1OTY2NFx1NzY4NFx1NmE5NFx1Njg0OFx1MzAwMlxuXG5cdThhY2JcdTk1ZGNcdTk1ODlcdTZiNjRcdTVjMGRcdThhNzFcdTY4NDZcdWZmMGNcdTRlMjZcdTYzMDdcdTViOWFcdTUzZTZcdTRlMDBcdTUwMGJcdThkZWZcdTVmOTFcdTMwMDINCi1jcmVhdGVEaXJFcnJvcl9yZWFzb249XHU3MTIxXHU2Y2Q1XHU1ZWZhXHU3YWNiXHU3NmVlXHU2YTE5XHU4ZGVmXHU1ZjkxICcnezB9JydcdTMwMDJcblxuXHU4YWNiXHU5NWRjXHU5NTg5XHU2YjY0XHU1YzBkXHU4YTcxXHU2ODQ2XHVmZjBjXHU0ZTI2XHU2MzA3XHU1YjlhXHU1M2U2XHU0ZTAwXHU1MDBiXHU4ZGVmXHU1ZjkxXHUzMDAyDQotb3BlbkJyb3dzZXJFcnJvcl9yZWFzb249XHU1MDc1XHU2ZTJjXHU0ZTBkXHU1MjMwXHU2MjE2XHU2MjdlXHU0ZTBkXHU1MjMwXHU2YjY0XHU3Y2ZiXHU3ZDcxXHU5ODEwXHU4YTJkXHU3Njg0IEhUTUwgXHU3MDBmXHU4OWJkXHU1NjY4XHUzMDAyXG5cblx1OGFjYlx1OTVkY1x1OTU4OVx1NmI2NFx1NWMwZFx1OGE3MVx1Njg0Nlx1ZmYwY1x1NGUyNlx1NjI0Ylx1NTJkNVx1NGVlNSBIVE1MIFx1NzAwZlx1ODliZFx1NTY2OFx1NGY4Nlx1OTU4Ylx1NTU1Zlx1NmE5NFx1Njg0OCAnJ3swfScnXHUzMDAyDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlMGE4Y2MuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiMzc3NTQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBQdWJsaXNoaW5nIFVJIChOTDIpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMi9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjU0ZmNhNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGFiNTEyMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9XHUwNDFmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIEVQRiAtIFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0NDJcdTA0MzVcdTA0NDBcdTA0NDRcdTA0MzVcdTA0MzlcdTA0NDENCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIERlZmF1bHQgZmVlZGJhY2sgVVJMDQotZmVlZGJhY2tVUkw9aHR0cDovL3d3dy5wdWJsaXNoZWRfd2Vic2l0ZS5jb20vZmVlZGJhY2sNCi0NCi0jIFB1Ymxpc2ggQ29uZmlndXJhdGlvbiBBY3Rpb24NCi1wdWJsaXNoQ29uZmlnQWN0aW9uPSZcdTA0MWVcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMuLi4NCi1wdWJsaXNoQ29uZmlnQWN0aW9uVG9vbHRpcD1cdTA0MWVcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDMwXHUwNDM5XHUwNDQyIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLXB1Ymxpc2hpbmdPcHRpb25zPVx1MDQxZVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi0NCi0jIFB1Ymxpc2hpbmcgQWN0aW9ucw0KLWNvbmZpZ0FjdGlvblNldD1cdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYNCi1jb25maWdNZW51PSZcdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYNCi0NCi0jIFByaW50IENvbmZpZ3VyYXRpb24gQWN0aW9uDQotcHJpbnRDb25maWdBY3Rpb249XHUwNDFmXHUwNDM1XHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDRjDQotDQotIyB0aGUgdGl0bGUgZm9yIHRoZSBwdWJsaXNoZWQgc2l0ZQ0KLSNkb24ndCBkZWZpbmUgaGVyZSwgbGV0IHVzZXIgc3BlY2lmeSBpdC4NCi0jdGl0bGU9T3BlblVQL0Jhc2ljDQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgRGVmYXVsdCBQdWJsaXNoIFBhdGgNCi1wdWJsaXNoUGF0aD08dXNlci5ob21lPi88YXBwLm5hbWU+L1B1Ymxpc2gNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4NjYwYjEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQdWJsaXNoIE1ldGhvZCBDb25maWd1cmF0aW9uIFdpemFyZA0KLXB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGU9XHUwNDFlXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGV4dD1cdTA0MTJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMCwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDQzXHUwNDRlIFx1MDQzZFx1MDQ0M1x1MDQzNlx1MDQzZFx1MDQzZSBcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMuDQotcHVibGlzaENvbmZpZ1dpemFyZF9zZWxlY3RPcHRpb25zUGFnZV90aXRsZT1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0T3B0aW9uc1BhZ2VfdGV4dD1cdTA0MjNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQ2XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMyBcdTA0MzggXHUwNDNmXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDQwXHUwNDRiIFx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOC4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX21ldGhvZENvbmZpZ190ZXh0PVx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzA6DQotcHVibGlzaENvbmZpZ1dpemFyZF9kZXN0aW5hdGlvbkdyb3VwX3RleHQ9XHUwNDI2XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMw0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlyZWN0b3J5X3RleHQ9XHUwNDFmXHUwNDQzXHUwNDQyXHUwNDRjOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfdXNlRGVmYXVsdFBhdGhfdGV4dD1cdTA0MThcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzIFx1MDQzZlx1MDQzZSBcdTA0NDNcdTA0M2NcdTA0M2VcdTA0M2JcdTA0NDdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGUNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3dlYlNpdGVfdGV4dD1cdTA0MjFcdTA0MzBcdTA0MzlcdTA0NDIgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLXB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGVfdGV4dD1cdTA0MTdcdTA0MzBcdTA0MzNcdTA0M2VcdTA0M2JcdTA0M2VcdTA0MzJcdTA0M2VcdTA0M2E6DQotcHVibGlzaENvbmZpZ1dpemFyZF9iYW5uZXJJbWFnZV90ZXh0PVx1MDQxOFx1MDQzN1x1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzFcdTA0MzBcdTA0M2RcdTA0M2RcdTA0MzVcdTA0NDBcdTA0MzA6DQotcHVibGlzaENvbmZpZ1dpemFyZF9hYm91dEhUTUxfdGV4dD1cdTA0MWUgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDMwXHUwNDQ1Og0KLXB1Ymxpc2hDb25maWdXaXphcmRfZmVlZGJhY2tVUkxfdGV4dD1VUkwgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZVx1MDQ0Mlx1MDQzN1x1MDQ0Ylx1MDQzMlx1MDQzZVx1MDQzMjoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVJbmRleF90ZXh0PVx1MDQxZVx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDZcdTA0NDMgXHUwNDM4XHUwNDNkXHUwNDM0XHUwNDM1XHUwNDNhXHUwNDQxXHUwNDMwDQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlR2xvc3NhcnlfdGV4dD1cdTA0MWVcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQ2XHUwNDQzIFx1MDQzM1x1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0MVx1MDQzMFx1MDQ0MFx1MDQzOFx1MDQ0Zg0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZVNlYXJjaF90ZXh0PVx1MDQxMlx1MDQzYVx1MDQzYlx1MDQ0ZVx1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDRcdTA0NDNcdTA0M2RcdTA0M2FcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNmXHUwNDNlXHUwNDM4XHUwNDQxXHUwNDNhXHUwNDMwIChcdTA0NDJcdTA0NDBcdTA0MzVcdTA0MzFcdTA0NDNcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDNhXHUwNDMwIFx1MDQzMFx1MDQzZlx1MDQzYlx1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzMiBKYXZhIFx1MDQzMiBcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0NDBcdTA0MzUpDQotcHVibGlzaENvbmZpZ1dpemFyZF91c2VBcHBsZXRfdGV4dD1cdTA0MTJcdTA0M2FcdTA0M2JcdTA0NGVcdTA0NDdcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQ0XHUwNDQzXHUwNDNkXHUwNDNhXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzOVx1MDQzYVx1MDQzOCAoXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDMxXHUwNDQzXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzYVx1MDQzMCBcdTA0MzBcdTA0M2ZcdTA0M2JcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzIgSmF2YSBcdTA0MzIgXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDQwXHUwNDM1KQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfdmFsaWRhdGlvbkdyb3VwX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNhXHUwNDMwDQotcHVibGlzaENvbmZpZ1dpemFyZF9jaGVja0h5cGVybGlua3NfdGV4dD1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDNkXHUwNDM1XHUwNDQ4XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOA0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlhZ3JhbUdyb3VwX3RleHQ9XHUwNDE0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDRiDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eV9kZF90ZXh0PVx1MDQxZVx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDRiIFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOSwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzZFx1MDQzNSBcdTA0MzFcdTA0NGJcdTA0M2JcdTA0MzggXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDRiIFx1MDQzMiBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDNlXHUwNDMyDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtPVx1MDQxZVx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0NGIgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2RcdTA0MzVcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM5IFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLXB1Ymxpc2hDb25maWdXaXphcmRfY29udmVydEJyb2tlbkxpbmtzX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZFx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQzMFx1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzggXHUwNDMyIFx1MDQzZVx1MDQzMVx1MDQ0Ylx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDFcdTA0NDINCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2xheW91dF90ZXh0PVx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0Mg0KLXB1Ymxpc2hDb25maWdXaXphcmRfZXh0cmFEZXNjcmlwdG9ySW5mb190ZXh0PVx1MDQxZVx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGIgXHUwNDQxIFx1MDQzN1x1MDQzMFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzYyBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2xpZ2h0V2VpZ2h0VHJlZV90ZXh0PVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzJcdTA0M2UgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOCwgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDM4LCBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwIFx1MDQzOCBcdTA0MzRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2RcdTA0NGIgXHUwNDMxXHUwNDM1XHUwNDM3IFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2ZcdTA0MzBcdTA0M2ZcdTA0M2VcdTA0M2ENCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVFbXB0eUNhdGVnb3JpZXNfdGV4dD1cdTA0MWZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDRiXHUwNDM1IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQzOA0KLQ0KLSMgcHVibGlzaCBwcm9jZXNzIHdpemFyZCBwYWdlDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX3RpdGxlPVx1MDQxMlx1MDQ0Ylx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDJcdTA0MzhcdTA0M2YgXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX3RleHQ9XHUwNDFjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDRiIFx1MDQzMiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfY2FwYWJpbGl0eV9wYXR0ZXJuPVx1MDQyOFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZFx1MDQ0YiBcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfZGVsaXZlcnlfcHJvY2Vzcz1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0NGIgXHUwNDM0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNhXHUwNDM4DQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3NlbGVjdFR5cGU9XHUwNDEyXHUwNDRiXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0Mlx1MDQzOFx1MDQzZiBcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfdHlwZV9wcm9jZXNzZXM9XHUwNDFlXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0NGI6DQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3R5cGVfY29uZmlnPVx1MDQxZVx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3B1Ymxpc2hfYmFzZV9wcm9jZXNzZXM9XHUwNDFlXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0MzFcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0NGJcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDRiDQotDQotIyBQdWJsaXNoaW5nIFByZWZlcmVuY2UgUGFnZQ0KLXByZWZlcmVuY2VQYWdlX2RlZmF1bHRQYXRoX3RleHQ9XHUwNDFmXHUwNDQzXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzZSBcdTA0NDNcdTA0M2NcdTA0M2VcdTA0M2JcdTA0NDdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGU6DQotDQotIyBDb25maXJtYXRpb24gRGlhbG9ncw0KLXB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU9XHUwNDFlXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1jb25maXJtUGF0aERpYWxvZ190ZXh0PVx1MDQyNlx1MDQzNVx1MDQzYlx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzOSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzMgLSAnJ3swfScnLiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NGM/DQotb3ZlcndyaXRlRGlhbG9nX3RleHQ9XHUwNDI2XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMyAnJ3swfScnIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIuIFx1MDQxMlx1MDQ0MVx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0NGIgXHUwNDMyIFx1MDQzZlx1MDQzMFx1MDQzZlx1MDQzYVx1MDQzNSBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDRiLiBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NGM/DQotY2FuY2VsUHVibGlzaENvbmZpZ19tc2c9XHUwNDFlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIFx1MDQzZlx1MDQ0M1x1MDQzMVx1MDQzYlx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2VcdTA0NDJcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzAuDQotDQotIyBFcnJvciBEaWFsb2dzDQotcHJldmlld0NvbmZpZ0Vycm9yX3RpdGxlPVx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MCBcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLXZpZXdSZXBvcnRFcnJvcl90aXRsZT1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0M2NcdTA0M2VcdTA0NDJcdTA0NDBcdTA0MzVcdTA0NDJcdTA0NGMgXHUwNDNlXHUwNDQyXHUwNDQ3XHUwNDM1XHUwNDQyIFx1MDQzZSBcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi0NCi0jIEVycm9yIE1lc3NhZ2VzDQotbWlzc2luZ1ZpZXdFcnJvcl9tc2c9SVVQUDAxMDBXOiBcdTA0MTIgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2RcdTA0MzVcdTA0NDIgXHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zi4gXHUwNDE0XHUwNDNlXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDRjXHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRlIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDQzXHUwNDRlIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZS4NCi1jYW5ub3RQdWJsaXNoRXJyb3JfbXNnPUlVUFAwMTAxRTogXHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZSBcdTA0M2RcdTA0MzVcdTA0M2JcdTA0NGNcdTA0MzdcdTA0NGYgXHUwNDNlXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjLg0KLWludmFsaWRQYXRoRXJyb3JfbXNnPUlVUFAwMTAyRTogXHUwNDI2XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMyBcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDIgXHUwNDM4XHUwNDNiXHUwNDM4IFx1MDQzZFx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzYy4NCi1pbnZhbGlkUGF0aENoYXJzRXJyb3JfbXNnPUlVUFAwMTAzRTogXHUwNDEyIFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOCBcdTA0NDZcdTA0MzVcdTA0M2JcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzXHUwNDMwIFx1MDQzZFx1MDQzNSBcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0M2RcdTA0M2UgXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQzYlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQ0NSBcdTA0NDFcdTA0MzhcdTA0M2NcdTA0MzJcdTA0M2VcdTA0M2JcdTA0M2VcdTA0MzI6IFxcICMgKiA/ICIgPCA+IHwgISAlIC8NCi1wdWJsaXNoQ29uZmlnRXJyb3JfbXNnPUlVUFAwMTA0RTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDMyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZS4NCi1wcmV2aWV3Q29uZmlnRXJyb3JfbXNnPUlVUFAwMTA1RTogXHUwNDFkXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQ0MVx1MDQ0YyBcdTA0M2VcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0NGMgXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDQwIEhUTUwgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzMCBcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Lg0KLXZpZXdSZXBvcnRFcnJvcl9tc2c9SVVQUDAxMDZFOiBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDQxXHUwNDRjIFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0NDAgSFRNTCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwXHUwNDMwIFx1MDQzZVx1MDQ0Mlx1MDQ0N1x1MDQzNVx1MDQ0Mlx1MDQzMCBcdTA0M2UgXHUwNDNmXHUwNDQzXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNhXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Lg0KLQ0KLSMgRXJyb3IgUmVhc29ucyAmIFJlY29tbWVuZGVkIEFjdGlvbnMNCi1wdWJsaXNoQ29uZmlnRXJyb3JfcmVhc29uPUlVUFAwMTA3RTogXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDM4XHUwNDM3XHUwNDNlXHUwNDQ4XHUwNDNiXHUwNDMwIFx1MDQzZVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzYVx1MDQzMC4gXHUwNDE0XHUwNDNiXHUwNDRmIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDM4XHUwNDNkXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZFx1MDQzMFx1MDQzNlx1MDQzY1x1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2FcdTA0M2RcdTA0M2VcdTA0M2ZcdTA0M2FcdTA0NDMgXHUwNDIxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmLg0KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPVx1MDQxMiBcdTA0NDZcdTA0MzVcdTA0M2JcdTA0MzVcdTA0MzJcdTA0M2VcdTA0M2MgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzXHUwNDM1ICcnezB9JycgXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDRjIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYlx1MDQ0YiwgXHUwNDNhXHUwNDNlXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDRiXHUwNDM1IFx1MDQzZFx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M2JcdTA0MzhcdTA0NDJcdTA0NGMuXG5cblx1MDQxN1x1MDQzMFx1MDQzYVx1MDQ0MFx1MDQzZVx1MDQzOVx1MDQ0Mlx1MDQzNSBcdTA0NGRcdTA0NDJcdTA0M2UgXHUwNDNlXHUwNDNhXHUwNDNkXHUwNDNlIFx1MDQzOCBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMy4NCi1jcmVhdGVEaXJFcnJvcl9yZWFzb249XHUwNDFkXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlIFx1MDQ0MVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDZcdTA0MzVcdTA0M2JcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzkgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzICcnezB9JycuXG5cblx1MDQxN1x1MDQzMFx1MDQzYVx1MDQ0MFx1MDQzZVx1MDQzOVx1MDQ0Mlx1MDQzNSBcdTA0NGRcdTA0NDJcdTA0M2UgXHUwNDNlXHUwNDNhXHUwNDNkXHUwNDNlIFx1MDQzOCBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDNlXHUwNDM5IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMy4NCi1vcGVuQnJvd3NlckVycm9yX3JlYXNvbj1cdTA0MWRcdTA0MzUgXHUwNDNkXHUwNDMwXHUwNDM5XHUwNDM0XHUwNDM1XHUwNDNkIFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzY1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0NDAgSFRNTCBcdTA0M2ZcdTA0M2UgXHUwNDQzXHUwNDNjXHUwNDNlXHUwNDNiXHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlLlxuXG5cdTA0MTdcdTA0MzBcdTA0M2FcdTA0NDBcdTA0M2VcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDRkXHUwNDQyXHUwNDNlIFx1MDQzZVx1MDQzYVx1MDQzZFx1MDQzZSBcdTA0MzggXHUwNDMyXHUwNDQwXHUwNDQzXHUwNDQ3XHUwNDNkXHUwNDQzXHUwNDRlIFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQzZVx1MDQzOVx1MDQ0Mlx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2IgJyd7MH0nJyBcdTA0MzIgXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDQwXHUwNDM1IEhUTUwuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMmEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMmEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjVmZWQ4My4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMmEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzY2I0MWIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgUHVibGlzaGluZyBVSSAoTkwyYSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMmEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMmEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGU2ODIzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kYS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNmIwNzAyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gYnJ1Z2VyZ3JcdTAwZTZuc2VmbGFkZSB0aWwgcHVibGljZXJpbmcNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIERlZmF1bHQgZmVlZGJhY2sgVVJMDQotZmVlZGJhY2tVUkw9aHR0cDovL3d3dy5wdWJsaXNoZWRfd2Vic2l0ZS5jb20vZmVlZGJhY2sNCi0NCi0jIFB1Ymxpc2ggQ29uZmlndXJhdGlvbiBBY3Rpb24NCi1wdWJsaXNoQ29uZmlnQWN0aW9uPSZQdWJsaWNcdTAwZTlyLi4uDQotcHVibGlzaENvbmZpZ0FjdGlvblRvb2x0aXA9UHVibGljXHUwMGU5ciBldCB3ZWJzdGVkIGZvciBlbiBrb25maWd1cmF0aW9uDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1wdWJsaXNoaW5nT3B0aW9ucz1QdWJsaWNlcmluZ3NpbmRzdGlsbGluZ2VyDQotDQotIyBQdWJsaXNoaW5nIEFjdGlvbnMNCi1jb25maWdBY3Rpb25TZXQ9S29uZmlndXJhdGlvbg0KLWNvbmZpZ01lbnU9JktvbmZpZ3VyYXRpb24NCi0NCi0jIFByaW50IENvbmZpZ3VyYXRpb24gQWN0aW9uDQotcHJpbnRDb25maWdBY3Rpb249VWRza3Jpdg0KLQ0KLSMgdGhlIHRpdGxlIGZvciB0aGUgcHVibGlzaGVkIHNpdGUNCi0jZG9uJ3QgZGVmaW5lIGhlcmUsIGxldCB1c2VyIHNwZWNpZnkgaXQuDQotI3RpdGxlPU9wZW5VUC9CYXNpYw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIERlZmF1bHQgUHVibGlzaCBQYXRoDQotcHVibGlzaFBhdGg9PHVzZXIuaG9tZT4vPGFwcC5uYW1lPi9QdWJsaXNoDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfZGEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlMTlkOGMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXNfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiBXaXphcmQNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlPVB1YmxpY1x1MDBlOXIgbWV0b2Rla29uZmlndXJhdGlvbg0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1WXHUwMGU2bGcgbWV0b2Rla29uZmlndXJhdGlvbg0KLXB1Ymxpc2hDb25maWdXaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0PVZcdTAwZTZsZyBkZW4gbWV0b2Rla29uZmlndXJhdGlvbiwgZHUgdmlsIHB1YmxpY2VyZS4NCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdE9wdGlvbnNQYWdlX3RpdGxlPUFuZ2l2IHB1YmxpY2VyaW5nc2luZHN0aWxsaW5nZXINCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3NlbGVjdE9wdGlvbnNQYWdlX3RleHQ9QW5naXYgZGVzdGluYXRpb25zYmlibGlvdGVrIG9nIHB1YmxpY2VyaW5nc2luZHN0aWxsaW5nZXIuDQotcHVibGlzaENvbmZpZ1dpemFyZF9tZXRob2RDb25maWdfdGV4dD1NZXRvZGVrb25maWd1cmF0aW9uOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGVzdGluYXRpb25Hcm91cF90ZXh0PURlc3RpbmF0aW9uc2JpYmxpb3Rlaw0KLXB1Ymxpc2hDb25maWdXaXphcmRfZGlyZWN0b3J5X3RleHQ9U3RpOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfdXNlRGVmYXVsdFBhdGhfdGV4dD1CcnVnIHN0YW5kYXJkc3RpDQotcHVibGlzaENvbmZpZ1dpemFyZF93ZWJTaXRlX3RleHQ9UHVibGljZXJldCB3ZWJzdGVkDQotcHVibGlzaENvbmZpZ1dpemFyZF90aXRsZV90ZXh0PVRpdGVsOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfYmFubmVySW1hZ2VfdGV4dD1CYW5uZXJiaWxsZWRlOg0KLXB1Ymxpc2hDb25maWdXaXphcmRfYWJvdXRIVE1MX3RleHQ9T20gaW5kaG9sZDoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2ZlZWRiYWNrVVJMX3RleHQ9VGlsYmFnZW1lbGRpbmdzLVVSTDoNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVJbmRleF90ZXh0PVB1YmxpY1x1MDBlOXIgaW5kZWtzc2lkZQ0KLXB1Ymxpc2hDb25maWdXaXphcmRfaW5jbHVkZUdsb3NzYXJ5X3RleHQ9UHVibGljXHUwMGU5ciBvcmRsaXN0ZXNpZGUNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2luY2x1ZGVTZWFyY2hfdGV4dD1JbmtsdWRcdTAwZTlyIHNcdTAwZjhnZWZ1bmt0aW9uIChrclx1MDBlNnZlciBzdFx1MDBmOHR0ZSB0aWwgSmF2YS1taW5pcHJvZ3JhbSBpIGJyb3dzZXIpDQotcHVibGlzaENvbmZpZ1dpemFyZF91c2VBcHBsZXRfdGV4dD1VbmRlcnN0XHUwMGY4dCBvdmVyc2lndHN0aWxwYXNuaW5nIChrclx1MDBlNnZlciBzdFx1MDBmOHR0ZSB0aWwgSmF2YS1taW5pcHJvZ3JhbSBpIGJyb3dzZXIpDQotcHVibGlzaENvbmZpZ1dpemFyZF92YWxpZGF0aW9uR3JvdXBfdGV4dD1WYWxpZGVyaW5nDQotcHVibGlzaENvbmZpZ1dpemFyZF9jaGVja0h5cGVybGlua3NfdGV4dD1Lb250cm9sbFx1MDBlOXIgZWtzdGVybmUgaHlwZXJsaW5rDQotcHVibGlzaENvbmZpZ1dpemFyZF9kaWFncmFtR3JvdXBfdGV4dD1EaWFncmFtbWVyDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eV9kZF90ZXh0PVB1YmxpY1x1MDBlOXIgYWt0aXZpdGV0c29wbHlzbmluZ3NkaWFncmFtbWVyLCBzb20gaWtrZSBlciBvcHJldHRldCBpIHByb2Nlc2VkaXRvcmVuDQotcHVibGlzaENvbmZpZ1dpemFyZF9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtPVB1YmxpY1x1MDBlOXIgYWt0aXZpdGV0c2RpYWdyYW1tZXIgZm9yIHVcdTAwZTZuZHJlZGUgYWt0aXZpdGV0c3VkdmlkZWxzZXINCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2NvbnZlcnRCcm9rZW5MaW5rc190ZXh0PUtvbnZlcnRcdTAwZTlyIGJydWR0ZSBsaW5rIHRpbCBhbG1pbmRlbGlnIHRla3N0DQotcHVibGlzaENvbmZpZ1dpemFyZF9sYXlvdXRfdGV4dD1MYXlvdXQNCi1wdWJsaXNoQ29uZmlnV2l6YXJkX2V4dHJhRGVzY3JpcHRvckluZm9fdGV4dD1QdWJsaWNcdTAwZTlyIGRlc2tyaXB0b3JlciBtZWQgaGVsZSBpbmRob2xkZXQgYWYgZGV0IHJlbGF0ZXJlZGUgbWV0b2RlaW5kaG9sZHNlbGVtZW50DQotcHVibGlzaENvbmZpZ1dpemFyZF9saWdodFdlaWdodFRyZWVfdGV4dD1HZW5lclx1MDBlOXIgdW5kZXJ0clx1MDBlNnN0cnVrdHVyIGZvciBvcGdhdmUtLCByb2xsZS0sIGFyYmVqZHNwcm9kdWt0LSBvZyBkaXNjaXBsaW5lbGVtZW50ZXIgdWRlbiBmb2xkZXJlDQotcHVibGlzaENvbmZpZ1dpemFyZF9pbmNsdWRlRW1wdHlDYXRlZ29yaWVzX3RleHQ9UHVibGljXHUwMGU5ciBrYXRlZ29yaWVyIHVkZW4ga2F0ZWdvcmlzZXJlZGUgZWxlbWVudGVyDQotDQotIyBwdWJsaXNoIHByb2Nlc3Mgd2l6YXJkIHBhZ2UNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfdGl0bGU9Vlx1MDBlNmxnIHB1YmxpY2VyaW5nc3R5cGUNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfdGV4dD1EdSBrYW4gZW50ZW4gcHVibGljZXJlIGRlbiB2YWxndGUga29uZmlndXJhdGlvbiBlbGxlciBkZSBhbmdpdm5lIHByb2Nlc3NlciBpIGtvbmZpZ3VyYXRpb25lbg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9jYXBhYmlsaXR5X3BhdHRlcm49RnVua3Rpb25zbVx1MDBmOG5zdHJlDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX2RlbGl2ZXJ5X3Byb2Nlc3M9TGV2ZXJpbmdzcHJvY2Vzc2VyDQotUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlX2xhYmVsX3NlbGVjdFR5cGU9Vlx1MDBlNmxnIHB1YmxpY2VyaW5nc3R5cGUNCi1QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2VfbGFiZWxfdHlwZV9wcm9jZXNzZXM9UHVibGljXHUwMGU5ciBkZSBuZWRlbmZvciB2YWxndGUgcHJvY2Vzc2VyOg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF90eXBlX2NvbmZpZz1QdWJsaWNcdTAwZTlyIGRlbiB2YWxndGUga29uZmlndXJhdGlvbg0KLVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZV9sYWJlbF9wdWJsaXNoX2Jhc2VfcHJvY2Vzc2VzPVB1YmxpY1x1MDBlOXIgcmVmZXJlcmVkZSBiYXNpc3Byb2Nlc3Nlcg0KLQ0KLSMgUHVibGlzaGluZyBQcmVmZXJlbmNlIFBhZ2UNCi1wcmVmZXJlbmNlUGFnZV9kZWZhdWx0UGF0aF90ZXh0PVN0YW5kYXJkc3RpOg0KLQ0KLSMgQ29uZmlybWF0aW9uIERpYWxvZ3MNCi1wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlPVB1YmxpY1x1MDBlOXIgbWV0b2Rla29uZmlndXJhdGlvbg0KLWNvbmZpcm1QYXRoRGlhbG9nX3RleHQ9RGVzdGluYXRpb25zc3RpZW4gZXIgb3BsXHUwMGY4c3QgdGlsICcnezB9JycuIFZpbCBkdSBmb3J0c1x1MDBlNnR0ZT8NCi1vdmVyd3JpdGVEaWFsb2dfdGV4dD1EZXN0aW5hdGlvbnNzdGllbiAnJ3swfScnIGZpbmRlcyBhbGxlcmVkZS4gQWxsZSBmaWxlciBpIGZvbGRlcmVuIGJsaXZlciBzbGV0dGV0LiBWaWwgZHUgZm9ydHNcdTAwZTZ0dGU/DQotY2FuY2VsUHVibGlzaENvbmZpZ19tc2c9UHVibGljZXJpbmdlbiBlciBhbm51bGxlcmV0Lg0KLQ0KLSMgRXJyb3IgRGlhbG9ncw0KLXByZXZpZXdDb25maWdFcnJvcl90aXRsZT1WaXMgcmVzdWx0YXQgYWYgcHVibGljZXJldCBtZXRvZGVrb25maWd1cmF0aW9uDQotdmlld1JlcG9ydEVycm9yX3RpdGxlPVZpcyBwdWJsaWNlcmluZ3NyYXBwb3J0DQotDQotIyBFcnJvciBNZXNzYWdlcw0KLW1pc3NpbmdWaWV3RXJyb3JfbXNnPUlVUFAwMTAwVzogRGVuIHZhbGd0ZSBrb25maWd1cmF0aW9uIGluZGVob2xkZXIgaWtrZSBlbiBneWxkaWcgb3ZlcnNpZ3QuIFJlZGlnXHUwMGU5ciBrb25maWd1cmF0aW9uZW4sIG9nIHRpbGZcdTAwZjhqIGVuIG92ZXJzaWd0LCBlbGxlciB2XHUwMGU2bGcgZW4gYW5kZW4ga29uZmlndXJhdGlvbi4NCi1jYW5ub3RQdWJsaXNoRXJyb3JfbXNnPUlVUFAwMTAxRTogRGVuIHZhbGd0ZSBrb25maWd1cmF0aW9uIGthbiBpa2tlIHB1YmxpY2VyZXMuDQotaW52YWxpZFBhdGhFcnJvcl9tc2c9SVVQUDAxMDJFOiBEZXN0aW5hdGlvbnNzdGllbiBlciB0b20gZWxsZXIgdWd5bGRpZy4NCi1pbnZhbGlkUGF0aENoYXJzRXJyb3JfbXNnPUlVUFAwMTAzRTogRGVzdGluYXRpb25zc3RpZW4gbVx1MDBlNSBpa2tlIGluZGVob2xkZSBmXHUwMGY4bGdlbmRlIHRlZ246IFxcICMgKiA/ICIgPCA+IHwgISAlIC8NCi1wdWJsaXNoQ29uZmlnRXJyb3JfbXNnPUlVUFAwMTA0RTogRGVuIHZhbGd0ZSBrb25maWd1cmF0aW9uIGVyIGlra2UgcHVibGljZXJldC4NCi1wcmV2aWV3Q29uZmlnRXJyb3JfbXNnPUlVUFAwMTA1RTogS2FuIGlra2UgXHUwMGU1Ym5lIGVuIEhUTUwtYnJvd3NlciBmb3IgYXQgdmlzZSByZXN1bHRhdGV0IGFmIGRlbiBwdWJsaWNlcmVkZSBrb25maWd1cmF0aW9uLg0KLXZpZXdSZXBvcnRFcnJvcl9tc2c9SVVQUDAxMDZFOiBLYW4gaWtrZSBcdTAwZTVibmUgZW4gSFRNTC1icm93c2VyIGZvciBhdCB2aXNlIHB1YmxpY2VyaW5nc3JhcHBvcnRlbi4NCi0NCi0jIEVycm9yIFJlYXNvbnMgJiBSZWNvbW1lbmRlZCBBY3Rpb25zDQotcHVibGlzaENvbmZpZ0Vycm9yX3JlYXNvbj1JVVBQMDEwN0U6IERlciBlciBvcHN0XHUwMGU1ZXQgZW4gZmVqbC4gS2xpayBwXHUwMGU1IE9wbHlzbmluZ2VyIGZvciBhdCBmXHUwMGU1IGZsZXJlIG9wbHlzbmluZ2VyLg0KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPURlc3RpbmF0aW9uc3N0aWVuICcnezB9JycgaW5kZWhvbGRlciBmaWxlciwgc29tIGlra2Uga2FuIHNsZXR0ZXMuXG5cbkx1ayBkZW5uZSBkaWFsb2csIG9nIGFuZ2l2IGVuIGFuZGVuIHN0aS4NCi1jcmVhdGVEaXJFcnJvcl9yZWFzb249RGVzdGluYXRpb25zc3RpZW4gJyd7MH0nJyBrYW4gaWtrZSBvcHJldHRlcy5cblxuTHVrIGRlbm5lIGRpYWxvZywgb2cgYW5naXYgZW4gYW5kZW4gc3RpLg0KLW9wZW5Ccm93c2VyRXJyb3JfcmVhc29uPUthbiBpa2tlIGZpbmRlIHN0YW5kYXJkLUhUTUwtYnJvd3NlcmVuIHBcdTAwZTUgZGV0dGUgc3lzdGVtLlxuXG5MdWsgZGVubmUgZGlhbG9nLCBvZyBcdTAwZTVibiBmaWxlbiAnJ3swfScnIG1hbnVlbHQgbWVkIGVuIEhUTUwtYnJvd3Nlci4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4ZjFlYTUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnJjcC5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNlNTMxNjkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotc291cmNlLm5sMS5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMS5qYXIgPSBiaW4vDQotYmluLmluY2x1ZGVzID0gZnJhZ21lbnQueG1sLFwNCi0gICAgICAgICAgICAgICBubDEuamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZXMucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2ZyLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9qYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9DTi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RlLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9pdC5wcm9wZXJ0aWVzDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9mcmFnbWVudC54bWwgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL2ZyYWdtZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTUxMGJjNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL2ZyYWdtZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08ZnJhZ21lbnQKLSAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmNwLm5sMSIKLSAgIG5hbWU9IkVQRiBDb21wb3NlciBXb3JrYmVuY2ggKE5MMSkiCi0gICB2ZXJzaW9uPSIxLjIuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IklCTSIKLSAgIHBsdWdpbi1pZD0ib3JnLmVjbGlwc2UuZXBmLnJjcCIKLSAgIHBsdWdpbi12ZXJzaW9uPSIxLjIuMCI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0ibmwxLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotPC9mcmFnbWVudD4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZjNiYTY3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBDb21wb3NlciBSQ1ANCi1wcm9kdWN0TmFtZT1FUEYgQ29tcG9zZXINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIENhdGVnb3J5DQotbWV0aG9kQ2F0ZWdvcnlOYW1lPU1ldGhvZGUNCi0NCi0jIFZpZXdzDQotd2VsY29tZVZpZXdOYW1lPVdpbGxrb21tZW4NCi0NCi0jIEFjdGlvbnMNCi1nbG9iYWxBY3Rpb25TZXQ9R2xvYmFsZSBBa3Rpb25zZ3J1cHBlDQotbmV3QWN0aW9uPSZOZXUNCi1uZXdBY3Rpb25Ub29sdGlwPU5ldQ0KLW9wZW5BY3Rpb249XHUwMGQ2JmZmbmVuLi4uDQotb3BlbkFjdGlvblRvb2x0aXA9XHUwMGQ2ZmZuZW4NCi1zZWFyY2hBY3Rpb249JlN1Y2hlbi4uLg0KLXNlYXJjaEFjdGlvblRvb2x0aXA9U3VjaGVuDQotd2VsY29tZUFjdGlvbj0mV2lsbGtvbW1lbg0KLXdlbGNvbWVBY3Rpb25Ub29sVGlwPVdpbGxrb21tZW4NCi0NCi0jIFRvb2x0aXBzDQotc2hvcnRjdXQub3ZlcnZpZXcudG9vbHRpcD1adXIgU2VpdGUgIlx1MDBkY2JlcnNpY2h0IiB6dXJcdTAwZmNja2tlaHJlbg0KLXNob3J0Y3V0LnR1dG9yaWFscy50b29sdGlwPVp1ciBTZWl0ZSAiTGVybnByb2dyYW1tIiB6dXJcdTAwZmNja2tlaHJlbg0KLXNob3J0Y3V0LmZpcnN0c3RlcHMudG9vbHRpcD1adXIgU2VpdGUgIkVyc3RlIFNjaHJpdHRlIiB6dXJcdTAwZmNja2tlaHJlbg0KLXNob3J0Y3V0LndlYnJlc291cmNlcy50b29sdGlwPVp1ciBTZWl0ZSAiV2VicmVzc291cmNlbiIgenVyXHUwMGZjY2trZWhyZW4NCi0NCi0jQWN0aW9uIFNldA0KLWFjdGlvblNldC5kZXNjcmlwdGlvbiA9IEFrdGlvbmVuIGluIGRlciBGdW5rdGlvbnNsZWlzdGUgZGVzIEhpbGZlc3lzdGVtcw0KLWFjdGlvblNldC5sYWJlbCA9IEhpbGZlc3lzdGVtDQotc2VhcmNoQWN0aW9uLmxhYmVsID0gSGlsZmUgZHVyY2hzdWNoZW4NCi1zZWFyY2hBY3Rpb24udG9vbHRpcCA9IEhpbGZlIGR1cmNoc3VjaGVuDQotZHluYW1pY0hlbHBBY3Rpb24ubGFiZWwgPSBEeW5hbWlzY2hlIEhpbGZlDQotZHluYW1pY0hlbHBBY3Rpb24udG9vbHRpcCA9IER5bmFtaXNjaGUgSGlsZmUNCi0jQWN0aXZpdGllcy9DYXBhYmlsaXRpZXMNCi1hY3Rpdml0eS5nZW5lcmFsPVByb2pla3RlIHVuZCBSZXNzb3VyY2VuIGltcG9ydGllcmVuIHVuZCBleHBvcnRpZXJlbg0KLWFjdGl2aXR5LmdlbmVyYWwuZGVzYz1TdGFuZGFyZC1FY2xpcHNlLUZ1bmt0aW9uZW4gZlx1MDBmY3IgZGVuIEltcG9ydCB1bmQgRXhwb3J0IHZvbiBQcm9qZWt0ZW4gdW5kIFJlc3NvdXJjZW4gdmVyd2VuZGVuLg0KLWFjdGl2aXR5LnRlYW0uY3ZzPUNWUy1VbnRlcnN0XHUwMGZjdHp1bmcNCi1hY3Rpdml0eS50ZWFtLmN2cy5kZXNjPUNvbmN1cnJlbnQgVmVyc2lvbnMgU3lzdGVtIChDVlMpIGZcdTAwZmNyIGRpZSBWZXJ3YWx0dW5nIHZvbiBSZXNzb3VyY2VuIHZlcndlbmRlbi4NCi1hY3Rpdml0eS50ZWFtPUJhc2lzdGVhbXVudGVyc3RcdTAwZmN0enVuZw0KLWFjdGl2aXR5LnRlYW0uZGVzYz1Qcm9qZWt0ZSB1bnRlciBWZXJ3ZW5kdW5nIHZvbiBLb25maWd1cmF0aW9uc21hbmFnZW1lbnRzeXN0ZW1lbiBnZW1laW5zYW0gbnV0emVuLg0KLQ0KLWFjdGl2aXR5LmNhdC5nZW5lcmFsPUFsbGdlbWVpbg0KLWFjdGl2aXR5LmNhdC5nZW5lcmFsLmRlc2M9U3RhbmRhcmQtRWNsaXBzZS1GdW5rdGlvbmVuIHZlcndlbmRlbi4NCi1hY3Rpdml0eS5jYXQudGVhbT1UZWFtDQotYWN0aXZpdHkuY2F0LnRlYW0uZGVzYz1Lb25maWd1cmF0aW9uc21hbmFnZW1lbnRzeXN0ZW1lIGZcdTAwZmNyIGRpZSBWZXJ3YWx0dW5nIHZvbiBSZXNzb3VyY2VuIHZlcndlbmRlbi4NCi0NCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzID0gRnVua3Rpb25lbg0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlOYW1lID0gJkZ1bmt0aW9uZW4NCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmNhdGVnb3J5TmFtZSA9ICZGdW5rdGlvbmVuDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eVByb21wdEJ1dHRvbiA9ICZTeXN0ZW1hbmZyYWdlIGJlaW0gQWt0aXZpZXJlbiB2b24gRnVua3Rpb25lbg0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlQcm9tcHRCdXR0b25Ub29sdGlwID0gRXMgZXJzY2hlaW50IGVpbmUgU3lzdGVtYW5mcmFnZSwgd2VubiBlaW4gRmVhdHVyZSwgZGFzIGRpZSBBa3RpdmllcnVuZyB2b24gRnVua3Rpb24gdm9yYXVzc2V0enQsIHp1bSBlcnN0ZW4gTWFsIHZlcndlbmRldCB3aXJkLg0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuY2FwdGlvbk1lc3NhZ2UgPSBNaXQgRnVua3Rpb25lbiBrXHUwMGY2bm5lbiBTaWUgdmVyc2NoaWVkZW5lIFByb2R1a3Rrb21wb25lbnRlbiBha3RpdmllcmVuIHVuZCBpbmFrdGl2aWVyZW4uIERpZXNlIEZ1bmt0aW9uZW4gc2luZCBuYWNoIGVpbmVyIEdydXBwZSB2b3JkZWZpbmllcnRlciBLYXRlZ29yaWVuIGdydXBwaWVydC4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTAzNDVmOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1SQ1AgZGUgY29tcG9zaXRvciBkZSBFUEYNCi1wcm9kdWN0TmFtZT1Db21wb3NpdG9yIGRlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgQ2F0ZWdvcnkNCi1tZXRob2RDYXRlZ29yeU5hbWU9TVx1MDBlOXRvZG8NCi0NCi0jIFZpZXdzDQotd2VsY29tZVZpZXdOYW1lPUJpZW52ZW5pZGENCi0NCi0jIEFjdGlvbnMNCi1nbG9iYWxBY3Rpb25TZXQ9Q29uanVudG8gZGUgYWNjaW9uZXMgZ2xvYmFsZXMNCi1uZXdBY3Rpb249Jk51ZXZvDQotbmV3QWN0aW9uVG9vbHRpcD1OdWV2bw0KLW9wZW5BY3Rpb249JkFicmlyLi4uDQotb3BlbkFjdGlvblRvb2x0aXA9QWJyaXINCi1zZWFyY2hBY3Rpb249JkJ1c2Nhci4uLg0KLXNlYXJjaEFjdGlvblRvb2x0aXA9QnVzY2FyDQotd2VsY29tZUFjdGlvbj0mQmllbnZlbmlkYQ0KLXdlbGNvbWVBY3Rpb25Ub29sVGlwPUJpZW52ZW5pZGENCi0NCi0jIFRvb2x0aXBzDQotc2hvcnRjdXQub3ZlcnZpZXcudG9vbHRpcD1Wb2x2ZXIgYSBsYSBwXHUwMGUxZ2luYSBWaXNpXHUwMGYzbiBnZW5lcmFsDQotc2hvcnRjdXQudHV0b3JpYWxzLnRvb2x0aXA9Vm9sdmVyIGEgbGEgcFx1MDBlMWdpbmEgR3VcdTAwZWRhIGRlIGFwcmVuZGl6YWplDQotc2hvcnRjdXQuZmlyc3RzdGVwcy50b29sdGlwPVZvbHZlciBhIGxhIHBcdTAwZTFnaW5hIFByaW1lcm9zIHBhc29zDQotc2hvcnRjdXQud2VicmVzb3VyY2VzLnRvb2x0aXA9Vm9sdmVyIGEgbGEgcFx1MDBlMWdpbmEgUmVjdXJzb3Mgd2ViICAgICAgIA0KLQ0KLSNBY3Rpb24gU2V0DQotYWN0aW9uU2V0LmRlc2NyaXB0aW9uID0gQWNjaW9uZXMgZGUgbGEgYmFycmEgZGUgaGVycmFtaWVudGFzIGRlbCBzaXN0ZW1hIGRlIGF5dWRhDQotYWN0aW9uU2V0LmxhYmVsID0gU2lzdGVtYSBkZSBheXVkYQ0KLXNlYXJjaEFjdGlvbi5sYWJlbCA9IEJ1c2NhciBlbiBsYSBheXVkYQ0KLXNlYXJjaEFjdGlvbi50b29sdGlwID0gQnVzY2FyIGVuIGxhIGF5dWRhDQotZHluYW1pY0hlbHBBY3Rpb24ubGFiZWwgPSBBeXVkYSBkaW5cdTAwZTFtaWNhIA0KLWR5bmFtaWNIZWxwQWN0aW9uLnRvb2x0aXAgPSBBeXVkYSBkaW5cdTAwZTFtaWNhDQotDQotI0FjdGl2aXRpZXMvQ2FwYWJpbGl0aWVzDQotYWN0aXZpdHkuZ2VuZXJhbD1JbXBvcnRhciB5IGV4cG9ydGFyIHByb3llY3RvcyB5IHJlY3Vyc29zDQotYWN0aXZpdHkuZ2VuZXJhbC5kZXNjPVV0aWxpemFyIGxhcyBmdW5jaW9uZXMgZXN0XHUwMGUxbmRhciBkZSBJbXBvcnRhci9FeHBvcnRhciBwcm95ZWN0b3MvcmVjdXJzb3MgZGUgRWNsaXBzZS4NCi1hY3Rpdml0eS50ZWFtLmN2cz1Tb3BvcnRlIGRlIENWUw0KLWFjdGl2aXR5LnRlYW0uY3ZzLmRlc2M9VXRpbGl6YXIgZWwgU2lzdGVtYSBkZSB2ZXJzaW9uZXMgY29uY3VycmVudGVzIChDVlMpIHBhcmEgZ2VzdGlvbmFyIHJlY3Vyc29zLg0KLWFjdGl2aXR5LnRlYW09U29wb3J0ZSBkZWwgZXF1aXBvIGJcdTAwZTFzaWNvDQotYWN0aXZpdHkudGVhbS5kZXNjPUNvbXBhcnRpciBwcm95ZWN0b3MgbWVkaWFudGUgc2lzdGVtYXMgZGUgZ2VzdGlcdTAwZjNuIGRlIGxhIGNvbmZpZ3VyYWNpXHUwMGYzbi4NCi0NCi1hY3Rpdml0eS5jYXQuZ2VuZXJhbD1HZW5lcmFsDQotYWN0aXZpdHkuY2F0LmdlbmVyYWwuZGVzYz1VdGlsaXphciBsYXMgZnVuY2lvbmVzIGVzdFx1MDBlMW5kYXIgZGUgRWNsaXBzZS4NCi1hY3Rpdml0eS5jYXQudGVhbT1FcXVpcG8NCi1hY3Rpdml0eS5jYXQudGVhbS5kZXNjPVV0aWxpemFyIHNpc3RlbWFzIGRlIGdlc3RpXHUwMGYzbiBkZSBsYSBjb25maWd1cmFjaVx1MDBmM24gcGFyYSBnZXN0aW9uYXIgcmVjdXJzb3MuDQotDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcyA9IEZ1bmNpb25lcw0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlOYW1lID0gJkZ1bmNpb25lcw0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuY2F0ZWdvcnlOYW1lID0gJkZ1bmNpb25lcw0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlQcm9tcHRCdXR0b24gPSBNb3N0cmFyICZzb2xpY2l0dWQgYWwgaGFiaWxpdGFyIGZ1bmNpb25lcw0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlQcm9tcHRCdXR0b25Ub29sdGlwID0gTW9zdHJhciBzb2xpY2l0dWQgY3VhbmRvIHVuYSBjYXJhY3Rlclx1MDBlZHN0aWNhIHF1ZSBuZWNlc2l0ZSBsYSBoYWJpbGl0YWNpXHUwMGYzbiBkZSBmdW5jaW9uZXMgc2UgdXRpbGljZSBwb3IgcHJpbWVyYSB2ZXoNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmNhcHRpb25NZXNzYWdlID0gTGFzIGZ1bmNpb25lcyBsZSBwZXJtaXRlbiBoYWJpbGl0YXIgbyBpbmhhYmlsaXRhciBkaXZlcnNvcyBjb21wb25lbnRlcyBkZWwgcHJvZHVjdG8uICBFc3RhcyBmdW5jaW9uZXMgc2UgYWdydXBhbiBkZSBhY3VlcmRvIGEgdW4gY29uanVudG8gZGUgY2F0ZWdvclx1MDBlZGFzIHByZWRlZmluaWRhcy4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjhiNWZjOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1QbGF0ZWZvcm1lIGNsaWVudCBlbnJpY2hpIGR1IGNvbXBvc2V1ciBFUEYNCi1wcm9kdWN0TmFtZT1Db21wb3NldXIgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBDYXRlZ29yeQ0KLW1ldGhvZENhdGVnb3J5TmFtZT1NXHUwMGU5dGhvZGUNCi0NCi0jIFZpZXdzDQotd2VsY29tZVZpZXdOYW1lPUJpZW52ZW51ZQ0KLQ0KLSMgQWN0aW9ucw0KLWdsb2JhbEFjdGlvblNldD1KZXUgZCdhY3Rpb25zIGdsb2JhbA0KLW5ld0FjdGlvbj0mTm91dmVhdQ0KLW5ld0FjdGlvblRvb2x0aXA9Tm91dmVhdQ0KLW9wZW5BY3Rpb249Jk91dnJpci4uLg0KLW9wZW5BY3Rpb25Ub29sdGlwPU91dnJpcg0KLXNlYXJjaEFjdGlvbj0mUmVjaGVyY2hlci4uLg0KLXNlYXJjaEFjdGlvblRvb2x0aXA9UmVjaGVyY2hlcg0KLXdlbGNvbWVBY3Rpb249JkJpZW52ZW51ZQ0KLXdlbGNvbWVBY3Rpb25Ub29sVGlwPUJpZW52ZW51ZQ0KLQ0KLSMgVG9vbHRpcHMNCi1zaG9ydGN1dC5vdmVydmlldy50b29sdGlwPVJldG91cm5lciBcdTAwZTAgbGEgcGFnZSBHXHUwMGU5blx1MDBlOXJhbGl0XHUwMGU5cw0KLXNob3J0Y3V0LnR1dG9yaWFscy50b29sdGlwPVJldG91cm5lciBcdTAwZTAgbGEgcGFnZSBUdXRvcmllbA0KLXNob3J0Y3V0LmZpcnN0c3RlcHMudG9vbHRpcD1SZXRvdXJuZXIgXHUwMGUwIGxhIHBhZ2UgUHJlbWllcnMgcGFzDQotc2hvcnRjdXQud2VicmVzb3VyY2VzLnRvb2x0aXA9UmV0b3VybmVyIFx1MDBlMCBsYSBwYWdlIFJlc3NvdXJjZXMgV2ViICAgICAgIA0KLQ0KLSNBY3Rpb24gU2V0DQotYWN0aW9uU2V0LmRlc2NyaXB0aW9uID0gQWN0aW9ucyBkZSBsYSBiYXJyZSBkJ291dGlscyBzeXN0XHUwMGU4bWUgZGUgbCdhaWRlDQotYWN0aW9uU2V0LmxhYmVsID0gU3lzdFx1MDBlOG1lIGQnYWlkZQ0KLXNlYXJjaEFjdGlvbi5sYWJlbCA9IEFpZGUgZGUgbGEgcmVjaGVyY2hlDQotc2VhcmNoQWN0aW9uLnRvb2x0aXAgPSBBaWRlIGRlIGxhIHJlY2hlcmNoZQ0KLWR5bmFtaWNIZWxwQWN0aW9uLmxhYmVsID0gQWlkZSBkeW5hbWlxdWUgDQotZHluYW1pY0hlbHBBY3Rpb24udG9vbHRpcCA9IEFpZGUgZHluYW1pcXVlDQotDQotI0FjdGl2aXRpZXMvQ2FwYWJpbGl0aWVzDQotYWN0aXZpdHkuZ2VuZXJhbD1JbXBvcnRlciBldCBleHBvcnRlciBkZXMgcHJvamV0cyBldCBkZXMgcmVzc291cmNlcw0KLWFjdGl2aXR5LmdlbmVyYWwuZGVzYz1VdGlsaXNleiBsZXMgZm9uY3Rpb25zIHN0YW5kYXJkIEltcG9ydGVyL0V4cG9ydGVyIGxlIHByb2pldC9sZXMgcmVzc291cmNlcyBkJ0VjbGlwc2UuDQotYWN0aXZpdHkudGVhbS5jdnM9UHJpc2UgZW4gY2hhcmdlIENWUw0KLWFjdGl2aXR5LnRlYW0uY3ZzLmRlc2M9VXRpbGlzZXogbGUgc3lzdFx1MDBlOG1lIENWUyAoQ29uY3VycmVudCBWZXJzaW9ucyBTeXN0ZW0pIHBvdXIgZ1x1MDBlOXJlciBsZXMgcmVzc291cmNlcy4NCi1hY3Rpdml0eS50ZWFtPVByaXNlIGVuIGNoYXJnZSBkZSBsJ1x1MDBlOXF1aXBlIHByaW5jaXBhbGUNCi1hY3Rpdml0eS50ZWFtLmRlc2M9UGFydGFnZXogZGVzIHByb2pldHMgXHUwMGUwIGwnYWlkZSBkZXMgc3lzdFx1MDBlOG1lcyBkZSBnZXN0aW9uIGRlIGNvbmZpZ3VyYXRpb24uDQotDQotYWN0aXZpdHkuY2F0LmdlbmVyYWw9RGlzcG9zaXRpb25zIGdcdTAwZTluXHUwMGU5cmFsZXMNCi1hY3Rpdml0eS5jYXQuZ2VuZXJhbC5kZXNjPVV0aWxpc2V6IGxlcyBmb25jdGlvbnMgc3RhbmRhcmQgZCdFY2xpcHNlLg0KLWFjdGl2aXR5LmNhdC50ZWFtPUVxdWlwZQ0KLWFjdGl2aXR5LmNhdC50ZWFtLmRlc2M9VXRpbGlzZXogbGVzIHN5c3RcdTAwZThtZXMgZGUgZ2VzdGlvbiBkZSBjb25maWd1cmF0aW9uIHBvdXIgZ1x1MDBlOXJlciBsZXMgcmVzc291cmNlcy4NCi0NCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzID0gRm9uY3Rpb25zDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eU5hbWUgPSAmRm9uY3Rpb25zDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5jYXRlZ29yeU5hbWUgPSAmRm9uY3Rpb25zDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eVByb21wdEJ1dHRvbiA9ICZJbnZpdGUgbG9ycyBkZSBsJ2FjdGl2YXRpb24gZGVzIGZvbmN0aW9ucw0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlQcm9tcHRCdXR0b25Ub29sdGlwID0gTG9yc3F1J3VuZSBmb25jdGlvbiBlc3QgdXRpbGlzXHUwMGU5ZSBwb3VyIGxhIHByZW1pXHUwMGU4cmUgZm9pcywgdW5lIGludml0ZSBzJ2FmZmljaGUgZXQgZXhpZ2UgbCdhY3RpdmF0aW9uIGRlcyBmb25jdGlvbnMNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmNhcHRpb25NZXNzYWdlID0gTGVzIGZvbmN0aW9ucyB2b3VzIHBlcm1ldHRlbnQgZCdhY3RpdmVyIG91IGRlIGRcdTAwZTlzYWN0aXZlciBwbHVzaWV1cnMgY29tcG9zYW50cyBkZSBwcm9kdWl0LiAgQ2VzIGZvbmN0aW9ucyBzb250IHJlZ3JvdXBcdTAwZTllcyBzZWxvbiB1biBlbnNlbWJsZSBkZSBjYXRcdTAwZTlnb3JpZXMgcHJcdTAwZTlkXHUwMGU5ZmluaWVzLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ODE2YzJiLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBDb21wb3NlciBSQ1ANCi1wcm9kdWN0TmFtZT1FUEYgQ29tcG9zZXINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIENhdGVnb3J5DQotbWV0aG9kQ2F0ZWdvcnlOYW1lPU1ldG9kbw0KLQ0KLSMgVmlld3MNCi13ZWxjb21lVmlld05hbWU9QmVudmVudXRpDQotDQotIyBBY3Rpb25zDQotZ2xvYmFsQWN0aW9uU2V0PUluc2llbWUgZGkgYXppb25pIGdsb2JhbGUNCi1uZXdBY3Rpb249Jk51b3ZvDQotbmV3QWN0aW9uVG9vbHRpcD1OdW92bw0KLW9wZW5BY3Rpb249JkFwcmkuLi4NCi1vcGVuQWN0aW9uVG9vbHRpcD1BcHJpDQotc2VhcmNoQWN0aW9uPSZSaWNlcmNhLi4uDQotc2VhcmNoQWN0aW9uVG9vbHRpcD1SaWNlcmNhDQotd2VsY29tZUFjdGlvbj0mQmVudmVudXRpDQotd2VsY29tZUFjdGlvblRvb2xUaXA9QmVudmVudXRpDQotDQotIyBUb29sdGlwcw0KLXNob3J0Y3V0Lm92ZXJ2aWV3LnRvb2x0aXA9Uml0b3JuYSBhbGxhIHBhZ2luYSBQYW5vcmFtaWNhDQotc2hvcnRjdXQudHV0b3JpYWxzLnRvb2x0aXA9Uml0b3JuYSBhbGxhIHBhZ2luYSBFc2VyY2l0YXppb25lDQotc2hvcnRjdXQuZmlyc3RzdGVwcy50b29sdGlwPVJpdG9ybmEgYWxsYSBwYWdpbmEgUHJpbWkgcGFzc2kNCi1zaG9ydGN1dC53ZWJyZXNvdXJjZXMudG9vbHRpcD1SaXRvcm5hIGFsbGEgcGFnaW5hIFJpc29yc2UgV2ViICAgICAgIA0KLQ0KLSNBY3Rpb24gU2V0DQotYWN0aW9uU2V0LmRlc2NyaXB0aW9uID0gQXppb25pIGJhcnJhIGRlZ2xpIHN0cnVtZW50aSBzaXN0ZW1hIGRlbGxhIGd1aWRhDQotYWN0aW9uU2V0LmxhYmVsID0gU2lzdGVtYSBkZWxsYSBndWlkYQ0KLXNlYXJjaEFjdGlvbi5sYWJlbCA9IEd1aWRhIGRpIHJpY2VyY2ENCi1zZWFyY2hBY3Rpb24udG9vbHRpcCA9IEd1aWRhIGRpIHJpY2VyY2ENCi1keW5hbWljSGVscEFjdGlvbi5sYWJlbCA9IEd1aWRhIGRpbmFtaWNhIA0KLWR5bmFtaWNIZWxwQWN0aW9uLnRvb2x0aXAgPSBHdWlkYSBkaW5hbWljYSANCi0jQWN0aXZpdGllcy9DYXBhYmlsaXRpZXMNCi1hY3Rpdml0eS5nZW5lcmFsPUltcG9ydGF6aW9uZS9lc3BvcnRhemlvbmUgZGkgcmlzb3JzZSBlIHByb2dldHRpDQotYWN0aXZpdHkuZ2VuZXJhbC5kZXNjPVV0aWxpenphcmUgbGUgY2FwYWNpdFx1MDBlMCBzdGFuZGFyZCBkaSBpbXBvcnRhemlvbmUvZXNwb3J0YXppb25lIHJpc29yc2UvcHJvZ2V0dGkgZGkgRWNsaXBzZS4NCi1hY3Rpdml0eS50ZWFtLmN2cz1TdXBwb3J0byBDVlMNCi1hY3Rpdml0eS50ZWFtLmN2cy5kZXNjPVV0aWxpenphcmUgQ1ZTIChDb25jdXJyZW50IFZlcnNpb25zIFN5c3RlbSkgcGVyIGdlc3RpcmUgbGUgcmlzb3JzZS4NCi1hY3Rpdml0eS50ZWFtPVN1cHBvcnRvIHRlYW0gcHJpbmNpcGFsZQ0KLWFjdGl2aXR5LnRlYW0uZGVzYz1Db25kaXZpZGVyZSBpIHByb2dldHRpIG1lZGlhbnRlIGkgc2lzdGVtaSBkaSBnZXN0aW9uZSBkZWxsYSBjb25maWd1cmF6aW9uZS4NCi0NCi1hY3Rpdml0eS5jYXQuZ2VuZXJhbD1HZW5lcmFsZQ0KLWFjdGl2aXR5LmNhdC5nZW5lcmFsLmRlc2M9VXRpbGl6emFyZSBsZSBjYXBhY2l0XHUwMGUwIHN0YW5kYXJkIGRpIEVjbGlwc2UuDQotYWN0aXZpdHkuY2F0LnRlYW09VGVhbQ0KLWFjdGl2aXR5LmNhdC50ZWFtLmRlc2M9VXRpbGl6emFyZSBpIHNpc3RlbWkgZGkgZ2VzdGlvbmUgZGVsbGEgY29uZmlndXJhemlvbmUgcGVyIGdlc3RpcmUgbGUgcmlzb3JzZS4NCi0NCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzID0gQ2FwYWNpdFx1MDBlMA0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlOYW1lID0gJkNhcGFjaXRcdTAwZTANCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmNhdGVnb3J5TmFtZSA9ICZDYXBhY2l0XHUwMGUwDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eVByb21wdEJ1dHRvbiA9ICZSaWNoaWVkaSBhbGwnYWJpbGl0YXppb25lIGRlbGxlIGNhcGFjaXRcdTAwZTANCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5UHJvbXB0QnV0dG9uVG9vbHRpcCA9IFJpY2hpZWRpIHF1YW5kbyB1bmEgZnVuemlvbmUsIHV0aWxpenphdGEgcGVyIGxhIHByaW1hIHZvbHRhLCByaWNoaWVkZSBsJ2FiaWxpdGF6aW9uZSBkZWxsZSBjYXBhY2l0XHUwMGUwDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5jYXB0aW9uTWVzc2FnZSA9IExlIGNhcGFjaXRcdTAwZTAgcGVybWV0dG9ubyBkaSBhYmlsaXRhcmUgbyBkaXNhYmlsaXRhcmUgaSB2YXJpIGNvbXBvbmVudGkgZGVsIHByb2RvdHRvLiBRdWVzdGUgY2FwYWNpdFx1MDBlMCB2ZW5nb25vIHJhZ2dydXBwYXRlIGluIGJhc2UgYSB1bmEgc2VyaWUgZGkgY2F0ZWdvcmllIHByZWRlZmluaXRlLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NjNjYjNkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBDb21wb3NlciBSQ1ANCi1wcm9kdWN0TmFtZT1FUEYgQ29tcG9zZXINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIENhdGVnb3J5DQotbWV0aG9kQ2F0ZWdvcnlOYW1lPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOQ0KLQ0KLSMgVmlld3MNCi13ZWxjb21lVmlld05hbWU9XHUzMDg4XHUzMDQ2XHUzMDUzXHUzMDVkDQotDQotIyBBY3Rpb25zDQotZ2xvYmFsQWN0aW9uU2V0PVx1MzBiMFx1MzBlZFx1MzBmY1x1MzBkMFx1MzBlYlx1MzBmYlx1MzBhMlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmM1x1MzBmYlx1MzBiYlx1MzBjM1x1MzBjOA0KLW5ld0FjdGlvbj1cdTY1YjBcdTg5OGYoJk4pDQotbmV3QWN0aW9uVG9vbHRpcD1cdTY1YjBcdTg5OGYNCi1vcGVuQWN0aW9uPVx1OTU4Ylx1MzA0ZigmTykuLi4NCi1vcGVuQWN0aW9uVG9vbHRpcD1cdTk1OGJcdTMwNGYNCi1zZWFyY2hBY3Rpb249XHU2OTFjXHU3ZDIyKCZTKS4uLg0KLXNlYXJjaEFjdGlvblRvb2x0aXA9XHU2OTFjXHU3ZDIyDQotd2VsY29tZUFjdGlvbj1cdTMwODhcdTMwNDZcdTMwNTNcdTMwNWQoJlcpDQotd2VsY29tZUFjdGlvblRvb2xUaXA9XHUzMDg4XHUzMDQ2XHUzMDUzXHUzMDVkDQotDQotIyBUb29sdGlwcw0KLXNob3J0Y3V0Lm92ZXJ2aWV3LnRvb2x0aXA9XHUzMDBjXHU2OTgyXHU4YWFjXHUzMDBkXHUzMGRhXHUzMGZjXHUzMGI4XHUzMDZiXHU2MjNiXHUzMDhiDQotc2hvcnRjdXQudHV0b3JpYWxzLnRvb2x0aXA9XHUzMDBjXHUzMGMxXHUzMGU1XHUzMGZjXHUzMGM4XHUzMGVhXHUzMGEyXHUzMGViXHUzMDBkXHUzMGRhXHUzMGZjXHUzMGI4XHUzMDZiXHU2MjNiXHUzMDhiDQotc2hvcnRjdXQuZmlyc3RzdGVwcy50b29sdGlwPVx1MzAwY1x1NjcwMFx1NTIxZFx1MzA2ZVx1MzBiOVx1MzBjNlx1MzBjM1x1MzBkN1x1MzAwZFx1MzBkYVx1MzBmY1x1MzBiOFx1MzA2Ylx1NjIzYlx1MzA4Yg0KLXNob3J0Y3V0LndlYnJlc291cmNlcy50b29sdGlwPVx1MzAwY1dlYiBcdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwMGRcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmJcdTYyM2JcdTMwOGIgICAgICAgDQotDQotI0FjdGlvbiBTZXQNCi1hY3Rpb25TZXQuZGVzY3JpcHRpb24gPSBcdTMwZDhcdTMwZWJcdTMwZDdcdTMwZmJcdTMwYjdcdTMwYjlcdTMwYzZcdTMwZTBcdTMwNmVcdTMwYzRcdTMwZmNcdTMwZWJcdTMwZDBcdTMwZmNcdTMwZmJcdTMwYTJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjMNCi1hY3Rpb25TZXQubGFiZWwgPSBcdTMwZDhcdTMwZWJcdTMwZDdcdTMwZmJcdTMwYjdcdTMwYjlcdTMwYzZcdTMwZTANCi1zZWFyY2hBY3Rpb24ubGFiZWwgPSBcdTY5MWNcdTdkMjJcdTMwNmVcdTMwZDhcdTMwZWJcdTMwZDcNCi1zZWFyY2hBY3Rpb24udG9vbHRpcCA9IFx1NjkxY1x1N2QyMlx1MzA2ZVx1MzBkOFx1MzBlYlx1MzBkNw0KLWR5bmFtaWNIZWxwQWN0aW9uLmxhYmVsID0gXHU1MmQ1XHU3Njg0XHUzMGQ4XHUzMGViXHUzMGQ3DQotZHluYW1pY0hlbHBBY3Rpb24udG9vbHRpcCA9IFx1NTJkNVx1NzY4NFx1MzBkOFx1MzBlYlx1MzBkNw0KLQ0KLSNBY3Rpdml0aWVzL0NhcGFiaWxpdGllcw0KLWFjdGl2aXR5LmdlbmVyYWw9XHUzMGQ3XHUzMGVkXHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4XHUzMDY4XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDZlXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDRhXHUzMDg4XHUzMDczXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4DQotYWN0aXZpdHkuZ2VuZXJhbC5kZXNjPVx1NmExOVx1NmU5Nlx1MzA2ZSBFY2xpcHNlIFx1MzBkN1x1MzBlZFx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjOC9cdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwNmVcdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzgvXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGRkXHUzMGZjXHUzMGM4XHU2YTVmXHU4MGZkXHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotYWN0aXZpdHkudGVhbS5jdnM9Q1ZTIFx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOA0KLWFjdGl2aXR5LnRlYW0uY3ZzLmRlc2M9Q29uY3VycmVudCBWZXJzaW9ucyBTeXN0ZW0gKENWUykgXHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDU3XHUzMDY2XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDkyXHU3YmExXHU3NDA2XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotYWN0aXZpdHkudGVhbT1cdTMwYjNcdTMwYTJcdTMwZmJcdTMwYzFcdTMwZmNcdTMwZTBcdTMwZmJcdTMwYjVcdTMwZGRcdTMwZmNcdTMwYzgNCi1hY3Rpdml0eS50ZWFtLmRlc2M9XHU2OWNiXHU2MjEwXHU3YmExXHU3NDA2XHUzMGI3XHUzMGI5XHUzMGM2XHUzMGUwXHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDU3XHUzMDY2XHUzMGQ3XHUzMGVkXHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4XHUzMDkyXHU1MTcxXHU3NTI4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotDQotYWN0aXZpdHkuY2F0LmdlbmVyYWw9XHU0ZTAwXHU4MjJjDQotYWN0aXZpdHkuY2F0LmdlbmVyYWwuZGVzYz1cdTZhMTlcdTZlOTZcdTMwNmUgRWNsaXBzZSBcdTZhNWZcdTgwZmRcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi1hY3Rpdml0eS5jYXQudGVhbT1cdTMwYzFcdTMwZmNcdTMwZTANCi1hY3Rpdml0eS5jYXQudGVhbS5kZXNjPVx1NjljYlx1NjIxMFx1N2JhMVx1NzQwNlx1MzBiN1x1MzBiOVx1MzBjNlx1MzBlMFx1MzA5Mlx1NGY3Zlx1NzUyOFx1MzA1N1x1MzA2Nlx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzA5Mlx1N2JhMVx1NzQwNlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMg0KLQ0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMgPSBcdTZhNWZcdTgwZmQNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5TmFtZSA9IFx1NmE1Zlx1ODBmZCgmQykNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmNhdGVnb3J5TmFtZSA9IFx1NmE1Zlx1ODBmZCgmQykNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5UHJvbXB0QnV0dG9uID0gXHU2YTVmXHU4MGZkXHUzMDkyXHU0ZjdmXHU3NTI4XHU1M2VmXHU4MGZkXHUzMDZiXHUzMDU5XHUzMDhiXHU5NjliXHUzMDZiXHUzMGQ3XHUzMGVkXHUzMGYzXHUzMGQ3XHUzMGM4XHUzMDkyXHU1MWZhXHUzMDU5KCZQKQ0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlQcm9tcHRCdXR0b25Ub29sdGlwID0gXHU2YTVmXHU4MGZkXHUzMDkyXHU0ZjdmXHU3NTI4XHU1M2VmXHU4MGZkXHUzMDZiXHUzMDU5XHUzMDhiXHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhiXHUzMGQ1XHUzMGEzXHUzMGZjXHUzMGMxXHUzMGUzXHUzMGZjXHUzMDRjXHU2NzAwXHU1MjFkXHUzMDZiXHU0ZjdmXHU3NTI4XHUzMDU1XHUzMDhjXHUzMDhiXHUzMDY4XHUzMDRkXHUzMDZiXHUzMGQ3XHUzMGVkXHUzMGYzXHUzMGQ3XHUzMGM4XHUzMDkyXHU1MWZhXHUzMDU5DQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5jYXB0aW9uTWVzc2FnZSA9IFx1NmE1Zlx1ODBmZFx1MzA5Mlx1NGY3Zlx1NzUyOFx1MzA1OVx1MzA4Ylx1MzA2OFx1MzAwMVx1MzA1NVx1MzA3ZVx1MzA1Nlx1MzA3ZVx1MzA2YVx1ODhmZFx1NTRjMVx1MzBiM1x1MzBmM1x1MzBkZFx1MzBmY1x1MzBjZFx1MzBmM1x1MzBjOFx1MzA5Mlx1NGY3Zlx1NzUyOFx1NTNlZlx1ODBmZFx1MzA3ZVx1MzA1Zlx1MzA2Zlx1NGY3Zlx1NzUyOFx1NGUwZFx1NTNlZlx1MzA2Ylx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA0Y1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1OVx1MzAwMiAgXHUzMDUzXHUzMDhjXHUzMDg5XHUzMDZlXHU2YTVmXHU4MGZkXHUzMDZmXHUzMDAxXHU0ZThiXHU1MjRkXHU1YjlhXHU3ZmE5XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGJiXHUzMGMzXHUzMGM4XHUzMDZiXHU1ZmRjXHUzMDU4XHUzMDY2XHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHU1MzE2XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU5XHUzMDAyDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxOWVlNjcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIENvbXBvc2VyIFJDUA0KLXByb2R1Y3ROYW1lPUVQRiBDb21wb3Nlcg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgQ2F0ZWdvcnkNCi1tZXRob2RDYXRlZ29yeU5hbWU9XHViYTU0XHVjMThjXHViNGRjDQotDQotIyBWaWV3cw0KLXdlbGNvbWVWaWV3TmFtZT1cdWQ2NThcdWM2MDENCi0NCi0jIEFjdGlvbnMNCi1nbG9iYWxBY3Rpb25TZXQ9XHVhZTAwXHViODVjXHViYzhjIFx1Yzg3MFx1Y2U1OCBcdWMxMzhcdWQyYjgNCi1uZXdBY3Rpb249XHVjMGM4XHViODVjIFx1Yzc5MVx1YzEzMSgmTikNCi1uZXdBY3Rpb25Ub29sdGlwPVx1YzBjOFx1Yjg1YyBcdWM3OTFcdWMxMzENCi1vcGVuQWN0aW9uPVx1YzVmNFx1YWUzMCgmTykuLi4NCi1vcGVuQWN0aW9uVG9vbHRpcD1cdWM1ZjRcdWFlMzANCi1zZWFyY2hBY3Rpb249XHVhYzgwXHVjMGM5KCZTKS4uLg0KLXNlYXJjaEFjdGlvblRvb2x0aXA9XHVhYzgwXHVjMGM5DQotd2VsY29tZUFjdGlvbj1cdWQ2NThcdWM2MDEoJlcpDQotd2VsY29tZUFjdGlvblRvb2xUaXA9XHVkNjU4XHVjNjAxDQotDQotIyBUb29sdGlwcw0KLXNob3J0Y3V0Lm92ZXJ2aWV3LnRvb2x0aXA9XHVhYzFjXHVjNjk0IFx1ZDM5OFx1Yzc3NFx1YzljMFx1Yjg1YyBcdWIzY2NcdWM1NDRcdWFjMDBcdWFlMzANCi1zaG9ydGN1dC50dXRvcmlhbHMudG9vbHRpcD1cdWQ1NTlcdWMyYjVcdWMxMWMgXHVkMzk4XHVjNzc0XHVjOWMwXHViODVjIFx1YjNjY1x1YzU0NFx1YWMwMFx1YWUzMA0KLXNob3J0Y3V0LmZpcnN0c3RlcHMudG9vbHRpcD1cdWNjYWIgXHViYzg4XHVjOWY4IFx1YjJlOFx1YWNjNCBcdWQzOThcdWM3NzRcdWM5YzBcdWI4NWMgXHViM2NjXHVjNTQ0XHVhYzAwXHVhZTMwDQotc2hvcnRjdXQud2VicmVzb3VyY2VzLnRvb2x0aXA9XHVjNmY5IFx1Yzc5MFx1YzZkMCBcdWQzOThcdWM3NzRcdWM5YzBcdWI4NWMgXHViM2NjXHVjNTQ0XHVhYzAwXHVhZTMwICAgICAgIA0KLQ0KLSNBY3Rpb24gU2V0DQotYWN0aW9uU2V0LmRlc2NyaXB0aW9uID0gXHViM2M0XHVjNmMwXHViOWQwIFx1YzJkY1x1YzJhNFx1ZDE1YyBcdWIzYzRcdWFkNmMgXHViYWE4XHVjNzRjIFx1Yzg3MFx1Y2U1OA0KLWFjdGlvblNldC5sYWJlbCA9IFx1YjNjNFx1YzZjMFx1YjlkMCBcdWMyZGNcdWMyYTRcdWQxNWMNCi1zZWFyY2hBY3Rpb24ubGFiZWwgPSBcdWIzYzRcdWM2YzBcdWI5ZDAgXHVhYzgwXHVjMGM5DQotc2VhcmNoQWN0aW9uLnRvb2x0aXAgPSBcdWIzYzRcdWM2YzBcdWI5ZDAgXHVhYzgwXHVjMGM5DQotZHluYW1pY0hlbHBBY3Rpb24ubGFiZWwgPSBcdWIzZDlcdWM4MDEgXHViM2M0XHVjNmMwXHViOWQwIA0KLWR5bmFtaWNIZWxwQWN0aW9uLnRvb2x0aXAgPSBcdWIzZDlcdWM4MDEgXHViM2M0XHVjNmMwXHViOWQwDQotDQotI0FjdGl2aXRpZXMvQ2FwYWJpbGl0aWVzDQotYWN0aXZpdHkuZ2VuZXJhbD1cdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjhcdWM2NDAgXHVjNzkwXHVjNmQwIFx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMCBcdWJjMGYgXHViMGI0XHViY2Y0XHViMGI0XHVhZTMwDQotYWN0aXZpdHkuZ2VuZXJhbC5kZXNjPVx1ZDQ1Y1x1YzkwMCBFY2xpcHNlIFx1ZDUwNFx1Yjg1Y1x1YzgxZFx1ZDJiOC9cdWM3OTBcdWM2ZDAgXHVhYzAwXHVjODM4XHVjNjI0XHVhZTMwL1x1YjBiNFx1YmNmNFx1YjBiNFx1YWUzMCBcdWFlMzBcdWIyYTVcdWM3NDQgXHVjMGFjXHVjNmE5XHVkNTY5XHViMmM4XHViMmU0Lg0KLWFjdGl2aXR5LnRlYW0uY3ZzPUNWUyBcdWM5YzBcdWM2ZDANCi1hY3Rpdml0eS50ZWFtLmN2cy5kZXNjPVx1Yzc5MFx1YzZkMFx1Yzc0NCBcdWFkMDBcdWI5YWNcdWQ1NThcdWFlMzAgXHVjNzA0XHVkNTc0IFx1YjNkOVx1YzJkYyBcdWJjODRcdWM4MDQgXHVjMmRjXHVjMmE0XHVkMTVjKENWUylcdWM3NDQgXHVjMGFjXHVjNmE5XHVkNTY5XHViMmM4XHViMmU0Lg0KLWFjdGl2aXR5LnRlYW09XHVjZjU0XHVjNWI0IFx1ZDMwMCBcdWM5YzBcdWM2ZDANCi1hY3Rpdml0eS50ZWFtLmRlc2M9XHVhZDZjXHVjMTMxIFx1YWQwMFx1YjlhYyBcdWMyZGNcdWMyYTRcdWQxNWNcdWM3NDQgXHVjMGFjXHVjNmE5XHVkNTU4XHVjNWVjIFx1ZDUwNFx1Yjg1Y1x1YzgxZFx1ZDJiOFx1Yjk3YyBcdWFjZjVcdWM3MjBcdWQ1NjlcdWIyYzhcdWIyZTQuDQotDQotYWN0aXZpdHkuY2F0LmdlbmVyYWw9XHVjNzdjXHViYzE4DQotYWN0aXZpdHkuY2F0LmdlbmVyYWwuZGVzYz1cdWQ0NWNcdWM5MDAgRWNsaXBzZSBcdWFlMzBcdWIyYTVcdWM3NDQgXHVjMGFjXHVjNmE5XHVkNTY5XHViMmM4XHViMmU0Lg0KLWFjdGl2aXR5LmNhdC50ZWFtPVx1ZDMwMA0KLWFjdGl2aXR5LmNhdC50ZWFtLmRlc2M9XHVjNzkwXHVjNmQwXHVjNzQ0IFx1YWQwMFx1YjlhY1x1ZDU1OFx1YWUzMCBcdWM3MDRcdWQ1NzQgXHVhZDZjXHVjMTMxIFx1YWQwMFx1YjlhYyBcdWMyZGNcdWMyYTRcdWQxNWNcdWM3NDQgXHVjMGFjXHVjNmE5XHVkNTY5XHViMmM4XHViMmU0Lg0KLQ0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMgPSBcdWFlMzBcdWIyYTUNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5TmFtZSA9IFx1YWUzMFx1YjJhNSgmQykNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmNhdGVnb3J5TmFtZSA9IFx1YWUzMFx1YjJhNSgmQykNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5UHJvbXB0QnV0dG9uID0gXHVhZTMwXHViMmE1XHVjNzc0IFx1YzBhY1x1YzZhOSBcdWFjMDBcdWIyYTVcdWQ1NjAgXHViNTRjIFx1ZDUwNFx1Yjg2Y1x1ZDUwNFx1ZDJiOCgmUCkNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5UHJvbXB0QnV0dG9uVG9vbHRpcCA9IFx1YWUzMFx1YjJhNVx1Yzc1OCBcdWMwYWNcdWM2YTkgXHVhYzAwXHViMmE1XHVkNjU0XHVhYzAwIFx1ZDU0NFx1YzY5NFx1ZDU1YyBcdWNkNWNcdWNkMDggXHVjMGFjXHVjNmE5IFx1YzJkYyBcdWQ1MDRcdWI4NmNcdWQ1MDRcdWQyYjgNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmNhcHRpb25NZXNzYWdlID0gXHVhZTMwXHViMmE1XHVjNzQ0IFx1YzBhY1x1YzZhOVx1ZDU1OFx1YzVlYyBcdWM1ZWNcdWI3ZWMgXHVjODFjXHVkNDg4IFx1Y2VmNFx1ZDNlY1x1YjEwY1x1ZDJiOFx1Yjk3YyBcdWMwYWNcdWM2YTkgXHVhYzAwXHViMmE1XHVkNTU4XHVhYzhjIFx1ZDU1OFx1YWM3MFx1YjA5OCBcdWMwYWNcdWM2YTkgXHViZDg4XHVhYzAwXHViMmE1XHVkNTU4XHVhYzhjIFx1ZDU2MCBcdWMyMTggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LiBcdWM3NzRcdWI3ZWNcdWQ1NWMgXHVhZTMwXHViMmE1XHVjNzQwIFx1YzBhY1x1YzgwNCBcdWM4MTVcdWM3NThcdWI0MWMgXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjIFx1YzEzOFx1ZDJiOFx1YzVkMCBcdWI1MzBcdWI3N2MgXHVhZGY4XHViOGY5XHVkNjU0XHViNDI5XHViMmM4XHViMmU0Lg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNWMzNzAzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVJDUCBkbyBFUEYgQ29tcG9zZXINCi1wcm9kdWN0TmFtZT1FUEYgQ29tcG9zZXINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIENhdGVnb3J5DQotbWV0aG9kQ2F0ZWdvcnlOYW1lPU1cdTAwZTl0b2RvDQotDQotIyBWaWV3cw0KLXdlbGNvbWVWaWV3TmFtZT1CZW0tdmluZG8NCi0NCi0jIEFjdGlvbnMNCi1nbG9iYWxBY3Rpb25TZXQ9Q29uanVudG8gZGUgQVx1MDBlN1x1MDBmNWVzIEdsb2JhaXMNCi1uZXdBY3Rpb249Jk5vdm8NCi1uZXdBY3Rpb25Ub29sdGlwPU5vdm8NCi1vcGVuQWN0aW9uPUEmYnJpci4uLg0KLW9wZW5BY3Rpb25Ub29sdGlwPUFicmlyDQotc2VhcmNoQWN0aW9uPSZQcm9jdXJhci4uLg0KLXNlYXJjaEFjdGlvblRvb2x0aXA9UHJvY3VyYXINCi13ZWxjb21lQWN0aW9uPSZCZW0tdmluZG8NCi13ZWxjb21lQWN0aW9uVG9vbFRpcD1CZW0tdmluZG8NCi0NCi0jIFRvb2x0aXBzDQotc2hvcnRjdXQub3ZlcnZpZXcudG9vbHRpcD1SZXRvcm5hciBwYXJhIGEgcFx1MDBlMWdpbmEgZGUgVmlzXHUwMGUzbyBHZXJhbA0KLXNob3J0Y3V0LnR1dG9yaWFscy50b29sdGlwPVJldG9ybmFyIHBhcmEgYSBwXHUwMGUxZ2luYSBkbyBUdXRvcmlhbA0KLXNob3J0Y3V0LmZpcnN0c3RlcHMudG9vbHRpcD1SZXRvcm5hciBwYXJhIGEgcFx1MDBlMWdpbmEgZGUgUHJpbWVpcmFzIEV0YXBhcw0KLXNob3J0Y3V0LndlYnJlc291cmNlcy50b29sdGlwPVJldG9ybmFyIHBhcmEgYSBwXHUwMGUxZ2luYSBkZSBSZWN1cnNvcyBkYSBXZWIgDQotDQotI0FjdGlvbiBTZXQNCi1hY3Rpb25TZXQuZGVzY3JpcHRpb24gPSBBXHUwMGU3XHUwMGY1ZXMgZGEgQmFycmEgZGUgRmVycmFtZW50YXMgZG8gU2lzdGVtYSBkZSBBanVkYQ0KLWFjdGlvblNldC5sYWJlbCA9IFNpc3RlbWEgZGUgQWp1ZGENCi1zZWFyY2hBY3Rpb24ubGFiZWwgPSBBanVkYSBkYSBQcm9jdXJhDQotc2VhcmNoQWN0aW9uLnRvb2x0aXAgPSBBanVkYSBkYSBQcm9jdXJhDQotZHluYW1pY0hlbHBBY3Rpb24ubGFiZWwgPSBBanVkYSBEaW5cdTAwZTJtaWNhDQotZHluYW1pY0hlbHBBY3Rpb24udG9vbHRpcCA9IEFqdWRhIERpblx1MDBlMm1pY2ENCi0jQWN0aXZpdGllcy9DYXBhYmlsaXRpZXMNCi1hY3Rpdml0eS5nZW5lcmFsPUltcG9ydGFyIGUgRXhwb3J0YXIgUHJvamV0b3MgZSBSZWN1cnNvcw0KLWFjdGl2aXR5LmdlbmVyYWwuZGVzYz1VdGlsaXplIG9zIHJlY3Vyc29zIHBhZHJcdTAwZTNvIGRlIEltcG9ydGFcdTAwZTdcdTAwZTNvL0V4cG9ydGFcdTAwZTdcdTAwZTNvIGRlIFByb2pldG9zL1JlY3Vyc29zIGRvIEVjbGlwc2UuDQotYWN0aXZpdHkudGVhbS5jdnM9U3Vwb3J0ZSBDVlMNCi1hY3Rpdml0eS50ZWFtLmN2cy5kZXNjPVV0aWxpemUgbyBDVlMgKENvbmN1cnJlbnQgVmVyc2lvbnMgU3lzdGVtKSBwYXJhIGdlcmFyIHJlY3Vyc29zLg0KLWFjdGl2aXR5LnRlYW09RXF1aXBlIGRlIFN1cG9ydGUgUHJpbmNpcGFsDQotYWN0aXZpdHkudGVhbS5kZXNjPUNvbXBhcnRpbGhlIHByb2pldG9zIHV0aWxpemFuZG8gc2lzdGVtYXMgZGUgZ2VyZW5jaWFtZW50byBkZSBjb25maWd1cmFcdTAwZTdcdTAwZTNvLg0KLQ0KLWFjdGl2aXR5LmNhdC5nZW5lcmFsPUdlcmFsDQotYWN0aXZpdHkuY2F0LmdlbmVyYWwuZGVzYz1VdGlsaXplIG9zIHJlY3Vyc29zIHBhZHJcdTAwZTNvIGRvIEVjbGlwc2UuDQotYWN0aXZpdHkuY2F0LnRlYW09RXF1aXBlDQotYWN0aXZpdHkuY2F0LnRlYW0uZGVzYz1VdGlsaXplIHNpc3RlbWFzIGRlIGdlcmVuY2lhbWVudG8gZGUgY29uZmlndXJhXHUwMGU3XHUwMGUzbyBwYXJhIGdlcmVuY2lhciByZWN1cnNvcy4NCi0NCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzID0gUmVjdXJzb3MNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5TmFtZSA9ICZSZWN1cnNvcw0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuY2F0ZWdvcnlOYW1lID0gJlJlY3Vyc29zDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eVByb21wdEJ1dHRvbiA9ICZBdmlzYXIgYW8gYXRpdmFyIHJlY3Vyc29zDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eVByb21wdEJ1dHRvblRvb2x0aXAgPSBBdmlzYXIgcXVhbmRvIHVtIHJlY3Vyc28gdXRpbGl6YWRvIHBlbGEgcHJpbWVpcmEgdmV6IGV4aWdpciBhdGl2YVx1MDBlN1x1MDBlM28gZGUgcmVjdXJzb3MNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmNhcHRpb25NZXNzYWdlID0gUmVjdXJzb3MgcGVybWl0ZW0gYXRpdmFyIG91IGRlc2F0aXZhciB2XHUwMGUxcmlvcyBjb21wb25lbnRlcyBkZSBwcm9kdXRvLiAgRXNzZXMgcmVjdXJzb3Mgc1x1MDBlM28gYWdydXBhZG9zIGRlIGFjb3JkbyBjb20gdW0gY29uanVudG8gZGUgY2F0ZWdvcmlhcyBwcmVkZWZpbmlkYXMuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFkMWU3OWQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIENvbXBvc2VyIFJDUA0KLXByb2R1Y3ROYW1lPUVQRiBDb21wb3Nlcg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgQ2F0ZWdvcnkNCi1tZXRob2RDYXRlZ29yeU5hbWU9XHU2NWI5XHU2Y2Q1DQotDQotIyBWaWV3cw0KLXdlbGNvbWVWaWV3TmFtZT1cdTZiMjJcdThmY2UNCi0NCi0jIEFjdGlvbnMNCi1nbG9iYWxBY3Rpb25TZXQ9XHU1MTY4XHU1YzQwXHU2NGNkXHU0ZjVjXHU5NmM2DQotbmV3QWN0aW9uPVx1NjViMFx1NWVmYSgmTikNCi1uZXdBY3Rpb25Ub29sdGlwPVx1NjViMFx1NWVmYQ0KLW9wZW5BY3Rpb249XHU2MjUzXHU1ZjAwKCZPKS4uLg0KLW9wZW5BY3Rpb25Ub29sdGlwPVx1NjI1M1x1NWYwMA0KLXNlYXJjaEFjdGlvbj1cdTY0MWNcdTdkMjIoJlMpLi4uDQotc2VhcmNoQWN0aW9uVG9vbHRpcD1cdTY0MWNcdTdkMjINCi13ZWxjb21lQWN0aW9uPVx1NmIyMlx1OGZjZSgmVykNCi13ZWxjb21lQWN0aW9uVG9vbFRpcD1cdTZiMjJcdThmY2UNCi0NCi0jIFRvb2x0aXBzDQotc2hvcnRjdXQub3ZlcnZpZXcudG9vbHRpcD1cdThmZDRcdTU2ZGVcdTIwMWNcdTY5ODJcdThmZjBcdTIwMWRcdTk4NzVcdTk3NjINCi1zaG9ydGN1dC50dXRvcmlhbHMudG9vbHRpcD1cdThmZDRcdTU2ZGVcdTIwMWNcdTY1NTlcdTdhMGJcdTIwMWRcdTk4NzVcdTk3NjINCi1zaG9ydGN1dC5maXJzdHN0ZXBzLnRvb2x0aXA9XHU4ZmQ0XHU1NmRlXHUyMDFjXHU3YjJjXHU0ZTAwXHU2YjY1XHUyMDFkXHU5ODc1XHU5NzYyDQotc2hvcnRjdXQud2VicmVzb3VyY2VzLnRvb2x0aXA9XHU4ZmQ0XHU1NmRlXHUyMDFjV2ViIFx1OGQ0NFx1NmU5MFx1MjAxZFx1OTg3NVx1OTc2Mg0KLQ0KLSNBY3Rpb24gU2V0DQotYWN0aW9uU2V0LmRlc2NyaXB0aW9uID0gXHU1ZTJlXHU1MmE5XHU3Y2ZiXHU3ZWRmXHU1ZGU1XHU1MTc3XHU2ODBmXHU2NGNkXHU0ZjVjDQotYWN0aW9uU2V0LmxhYmVsID0gXHU1ZTJlXHU1MmE5XHU3Y2ZiXHU3ZWRmDQotc2VhcmNoQWN0aW9uLmxhYmVsID0gXHU2NDFjXHU3ZDIyXHU1ZTJlXHU1MmE5DQotc2VhcmNoQWN0aW9uLnRvb2x0aXAgPSBcdTY0MWNcdTdkMjJcdTVlMmVcdTUyYTkNCi1keW5hbWljSGVscEFjdGlvbi5sYWJlbCA9IFx1NTJhOFx1NjAwMVx1NWUyZVx1NTJhOQ0KLWR5bmFtaWNIZWxwQWN0aW9uLnRvb2x0aXAgPSBcdTUyYThcdTYwMDFcdTVlMmVcdTUyYTkNCi0jQWN0aXZpdGllcy9DYXBhYmlsaXRpZXMNCi1hY3Rpdml0eS5nZW5lcmFsPVx1NWJmY1x1NTE2NVx1NTQ4Y1x1NWJmY1x1NTFmYVx1OTg3OVx1NzZlZVx1NTQ4Y1x1OGQ0NFx1NmU5MA0KLWFjdGl2aXR5LmdlbmVyYWwuZGVzYz1cdTRmN2ZcdTc1MjhcdTY4MDdcdTUxYzZcdTc2ODQgRWNsaXBzZSBcdTViZmNcdTUxNjVcdWZmMGZcdTViZmNcdTUxZmFcdTk4NzlcdTc2ZWVcdWZmMGZcdThkNDRcdTZlOTBcdTc2ODRcdTUyOWZcdTgwZmRcdTMwMDINCi1hY3Rpdml0eS50ZWFtLmN2cz1DVlMgXHU2NTJmXHU2MzAxDQotYWN0aXZpdHkudGVhbS5jdnMuZGVzYz1cdTRmN2ZcdTc1MjhcdTVlNzZcdTUzZDFcdTcyNDhcdTY3MmNcdTYzYTdcdTUyMzZcdTdjZmJcdTdlZGZcdWZmMDhDVlNcdWZmMDlcdTY3NjVcdTdiYTFcdTc0MDZcdThkNDRcdTZlOTBcdTMwMDINCi1hY3Rpdml0eS50ZWFtPVx1NjgzOFx1NWZjM1x1NTZlMlx1OTYxZlx1NjUyZlx1NjMwMQ0KLWFjdGl2aXR5LnRlYW0uZGVzYz1cdTRmN2ZcdTc1MjhcdTkxNGRcdTdmNmVcdTdiYTFcdTc0MDZcdTdjZmJcdTdlZGZcdTY3NjVcdTUxNzFcdTRlYWJcdTk4NzlcdTc2ZWVcdTMwMDINCi0NCi1hY3Rpdml0eS5jYXQuZ2VuZXJhbD1cdTVlMzhcdTg5YzQNCi1hY3Rpdml0eS5jYXQuZ2VuZXJhbC5kZXNjPVx1NGY3Zlx1NzUyOFx1NjgwN1x1NTFjNlx1NzY4NCBFY2xpcHNlIFx1NTI5Zlx1ODBmZFx1MzAwMg0KLWFjdGl2aXR5LmNhdC50ZWFtPVx1NTZlMlx1OTYxZg0KLWFjdGl2aXR5LmNhdC50ZWFtLmRlc2M9XHU0ZjdmXHU3NTI4XHU5MTRkXHU3ZjZlXHU3YmExXHU3NDA2XHU3Y2ZiXHU3ZWRmXHU2NzY1XHU3YmExXHU3NDA2XHU4ZDQ0XHU2ZTkwXHUzMDAyDQotDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcyA9IFx1NTI5Zlx1ODBmZA0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlOYW1lID0gXHU1MjlmXHU4MGZkKCZDKQ0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuY2F0ZWdvcnlOYW1lID0gXHU1MjlmXHU4MGZkKCZDKQ0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlQcm9tcHRCdXR0b24gPSBcdTU0MmZcdTc1MjhcdTUyOWZcdTgwZmRcdTY1ZjZcdTUzZDFcdTUxZmFcdTYzZDBcdTc5M2EoJlApDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eVByb21wdEJ1dHRvblRvb2x0aXAgPSBcdTk5OTZcdTZiMjFcdTRmN2ZcdTc1MjhcdTg5ODFcdTZjNDJcdTU0MmZcdTc1MjhcdTUyOWZcdTgwZmRcdTc2ODRcdTUyOWZcdTgwZmRcdTkwZThcdTRlZjZcdTY1ZjZcdTUzZDFcdTUxZmFcdTYzZDBcdTc5M2ENCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmNhcHRpb25NZXNzYWdlID0gXHU1M2VmXHU3NTI4XHU0ZThlXHU1NDJmXHU3NTI4XHU2MjE2XHU3OTgxXHU3NTI4XHU1NDA0XHU3OWNkXHU0ZWE3XHU1NGMxXHU3ZWM0XHU0ZWY2XHU3Njg0XHU1MjlmXHU4MGZkXHUzMDAyXHU4ZmQ5XHU0ZTliXHU1MjlmXHU4MGZkXHU2MzA5XHU3MTY3XHU0ZTAwXHU3ZWM0XHU5ODg0XHU1MTQ4XHU1YjlhXHU0ZTQ5XHU3Njg0XHU3YzdiXHU1MjJiXHU2NzY1XHU4ZmRiXHU4ODRjXHU1MjA2XHU3ZWM0XHUzMDAyDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiOWJiYTAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIENvbXBvc2VyIFJDUA0KLXByb2R1Y3ROYW1lPUVQRiBDb21wb3Nlcg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgQ2F0ZWdvcnkNCi1tZXRob2RDYXRlZ29yeU5hbWU9XHU2NWI5XHU2Y2Q1DQotDQotIyBWaWV3cw0KLXdlbGNvbWVWaWV3TmFtZT1cdTZiNjFcdThmY2VcdTRmN2ZcdTc1MjgNCi0NCi0jIEFjdGlvbnMNCi1nbG9iYWxBY3Rpb25TZXQ9XHU2NTc0XHU5YWQ0XHU1MmQ1XHU0ZjVjXHU5NmM2DQotbmV3QWN0aW9uPVx1NjViMFx1NWVmYSgmTikNCi1uZXdBY3Rpb25Ub29sdGlwPVx1NjViMFx1NWVmYQ0KLW9wZW5BY3Rpb249XHU5NThiXHU1NTVmKCZPKS4uLg0KLW9wZW5BY3Rpb25Ub29sdGlwPVx1OTU4Ylx1NTU1Zg0KLXNlYXJjaEFjdGlvbj1cdTY0MWNcdTVjMGIoJlMpLi4uDQotc2VhcmNoQWN0aW9uVG9vbHRpcD1cdTY0MWNcdTVjMGINCi13ZWxjb21lQWN0aW9uPVx1NmI2MVx1OGZjZVx1NGY3Zlx1NzUyOCgmVykNCi13ZWxjb21lQWN0aW9uVG9vbFRpcD1cdTZiNjFcdThmY2VcdTRmN2ZcdTc1MjgNCi0NCi0jIFRvb2x0aXBzDQotc2hvcnRjdXQub3ZlcnZpZXcudG9vbHRpcD1cdTU2ZGVcdTUyMzBcdTMwMGNcdTY5ODJcdTg5YzBcdTMwMGRcdTk4MDFcdTk3NjINCi1zaG9ydGN1dC50dXRvcmlhbHMudG9vbHRpcD1cdTU2ZGVcdTUyMzBcdTMwMGNcdTYzMDdcdTVjMGVcdTY1NTlcdTViNzhcdTMwMGRcdTk4MDFcdTk3NjINCi1zaG9ydGN1dC5maXJzdHN0ZXBzLnRvb2x0aXA9XHU1NmRlXHU1MjMwXHUzMDBjXHU3YjJjXHU0ZTAwXHU2YjY1XHU5YTVmXHUzMDBkXHU5ODAxXHU5NzYyDQotc2hvcnRjdXQud2VicmVzb3VyY2VzLnRvb2x0aXA9XHU1NmRlXHU1MjMwXHUzMDBjV2ViIFx1OGNjN1x1NmU5MFx1MzAwZFx1OTgwMVx1OTc2Mg0KLQ0KLSNBY3Rpb24gU2V0DQotYWN0aW9uU2V0LmRlc2NyaXB0aW9uID0gXHU4YWFhXHU2NjBlXHU3Y2ZiXHU3ZDcxXHU1ZGU1XHU1MTc3XHU1MjE3XHU1MmQ1XHU0ZjVjDQotYWN0aW9uU2V0LmxhYmVsID0gXHU4YWFhXHU2NjBlXHU3Y2ZiXHU3ZDcxDQotc2VhcmNoQWN0aW9uLmxhYmVsID0gXHU2NDFjXHU1YzBiXHU4YWFhXHU2NjBlDQotc2VhcmNoQWN0aW9uLnRvb2x0aXAgPSBcdTY0MWNcdTVjMGJcdThhYWFcdTY2MGUNCi1keW5hbWljSGVscEFjdGlvbi5sYWJlbCA9IFx1NTJkNVx1NjE0Ylx1OGFhYVx1NjYwZQ0KLWR5bmFtaWNIZWxwQWN0aW9uLnRvb2x0aXAgPSBcdTUyZDVcdTYxNGJcdThhYWFcdTY2MGUNCi0NCi0jQWN0aXZpdGllcy9DYXBhYmlsaXRpZXMNCi1hY3Rpdml0eS5nZW5lcmFsPVx1NTMyZlx1NTE2NVx1NTQ4Y1x1NTMyZlx1NTFmYVx1NWMwOFx1Njg0OFx1NTNjYVx1OGNjN1x1NmU5MA0KLWFjdGl2aXR5LmdlbmVyYWwuZGVzYz1cdTRmN2ZcdTc1MjhcdTZhMTlcdTZlOTZcdTc2ODQgRWNsaXBzZSBcdTUzMmZcdTUxNjUvXHU1MzJmXHU1MWZhXHU1YzA4XHU2ODQ4L1x1OGNjN1x1NmU5MFx1NTI5Zlx1ODBmZFx1MzAwMg0KLWFjdGl2aXR5LnRlYW0uY3ZzPUNWUyBcdTY1MmZcdTYzZjQNCi1hY3Rpdml0eS50ZWFtLmN2cy5kZXNjPVx1NGY3Zlx1NzUyOFx1MzAwY1x1NGUyNlx1ODg0Y1x1NzI0OFx1NjcyY1x1N2NmYlx1N2Q3MSAoQ1ZTKVx1MzAwZFx1NGY4Nlx1N2JhMVx1NzQwNlx1OGNjN1x1NmU5MFx1MzAwMg0KLWFjdGl2aXR5LnRlYW09XHU2ODM4XHU1ZmMzXHU1NzE4XHU5NjhhXHU2NTJmXHU2M2Y0DQotYWN0aXZpdHkudGVhbS5kZXNjPVx1NGY3Zlx1NzUyOFx1OTE0ZFx1N2Y2ZVx1N2JhMVx1NzQwNlx1N2NmYlx1N2Q3MVx1NGY4Nlx1NTE3MVx1NzUyOFx1NWMwOFx1Njg0OFx1MzAwMg0KLQ0KLWFjdGl2aXR5LmNhdC5nZW5lcmFsPVx1NGUwMFx1ODIyYw0KLWFjdGl2aXR5LmNhdC5nZW5lcmFsLmRlc2M9XHU0ZjdmXHU3NTI4XHU2YTE5XHU2ZTk2XHU3Njg0IEVjbGlwc2UgXHU1MjlmXHU4MGZkXHUzMDAyDQotYWN0aXZpdHkuY2F0LnRlYW09XHU1NzE4XHU5NjhhDQotYWN0aXZpdHkuY2F0LnRlYW0uZGVzYz1cdTRmN2ZcdTc1MjhcdTkxNGRcdTdmNmVcdTdiYTFcdTc0MDZcdTdjZmJcdTdkNzFcdTRmODZcdTdiYTFcdTc0MDZcdThjYzdcdTZlOTBcdTMwMDINCi0NCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzID0gXHU1MjlmXHU4MGZkDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eU5hbWUgPSBcdTUyOWZcdTgwZmQoJkMpDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5jYXRlZ29yeU5hbWUgPSBcdTUyOWZcdTgwZmQoJkMpDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eVByb21wdEJ1dHRvbiA9IFx1NTU1Zlx1NzUyOFx1NTI5Zlx1ODBmZFx1NjY0Mlx1NjNkMFx1NzkzYSgmUCkNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5UHJvbXB0QnV0dG9uVG9vbHRpcCA9IFx1N2IyY1x1NGUwMFx1NmIyMVx1NGY3Zlx1NzUyOFx1OTcwMFx1ODk4MVx1NTU1Zlx1NzUyOFx1OTAxOVx1NGU5Ylx1NTI5Zlx1ODBmZFx1NzY4NFx1NzI3OVx1NjAyN1x1NjY0Mlx1NjNkMFx1NzkzYQ0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuY2FwdGlvbk1lc3NhZ2UgPSBcdTkwMTlcdTRlOWJcdTUyOWZcdTgwZmRcdTUzZWZcdThiOTNcdTYwYThcdTU1NWZcdTc1MjhcdTYyMTZcdTUwNWNcdTc1MjhcdTU0MDRcdTdhMmVcdTc1MjJcdTU0YzFcdTUxNDNcdTRlZjZcdTMwMDJcdTkwMTlcdTRlOWJcdTUyOWZcdTgwZmRcdTRlZTVcdTRlMDBcdTdkNDRcdTk4MTBcdTUxNDhcdTViOWFcdTdmYTlcdTc2ODRcdTdhMmVcdTk4NWVcdTRmODZcdTUyMDZcdTdkNDRcdTMwMDINCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC9SZXNvdXJjZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2NmNDRhNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGaWxlIE1lbnUNCi1maWxlTWVudUl0ZW1fdGV4dD0mRGF0ZWkNCi1maWxlTmV3TWVudUl0ZW1fdGV4dD0mTmV1DQotZmlsZU9wZW5NZW51SXRlbV90ZXh0PVx1MDBkNiZmZm5lbg0KLQ0KLSMgRWRpdCBNZW51DQotZWRpdE1lbnVJdGVtX3RleHQ9JkJlYXJiZWl0ZW4NCi0NCi0jIE5hdmlnYXRlIE1lbnUNCi1uYXZpZ2F0ZU1lbnVJdGVtX3RleHQ9Jk5hdmlnaWVyZW4NCi0NCi0jIFNlYXJjaCBNZW51DQotc2VhcmNoTWVudUl0ZW1fdGV4dD0mU3VjaGVuDQotDQotIyBDb25maWd1cmF0aW9uIE1lbnUNCi1jb25maWd1cmF0aW9uTWVudUl0ZW1fdGV4dD0mS29uZmlndXJhdGlvbg0KLQ0KLSMgV2luZG93IE1lbnUNCi13aW5kb3dNZW51SXRlbV90ZXh0PSZGZW5zdGVyDQotd2luZG93T3BlblBlcnNwZWN0aXZlTWVudUl0ZW1fdGV4dD1QZXJzcGVrdGl2ZSBcdTAwZjYmZmZuZW4NCi13aW5kb3dTaG93Vmlld01lbnVJdGVtX3RleHQ9U2ljaHQgZWluYmxlbmRlbg0KLQ0KLSMgSGVscCBNZW51DQotaGVscE1lbnVJdGVtX3RleHQ9JkhpbGZlDQotDQotIyBOZXcgRHJvcCBEb3duIE1lbnUNCi1uZXdEcm9wRG93bl90b29sdGlwX3RleHQ9TmV1DQotb3RoZXJNZW51SXRlbV90ZXh0PUFuZGVyZS4uLg0KLQ0KLSMgT3BlbiBQZXJzcGVjdGl2ZSBBY3Rpb25zDQotb3BlbkF1dGhvcmluZ1BlcnNwZWN0aXZlQWN0aW9uX3RleHQ9QXV0aG9yaW5nDQotb3BlbkJyb3dzaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dD1Ccm93c2luZw0KLQ0KLSMgTWlzYyBBY3Rpb25zDQotZWRpdEFjdGlvbl90ZXh0PUJlYXJiZWl0ZW4NCi11cGdyYWRlTGlicmFyeUFjdGlvbl90ZXh0PU1ldGhvZGVuYmlibGlvdGhlayB2b24gSTEgYXVmIEkyIGFrdHVhbGlzaWVyZW4uLi4NCi0NCi1zdGFydHVwX2Rpcl9sb2dfaW5mb190ZXh0PUlORk86IEF1c2dhbmdzdmVyemVpY2huaXMgZGVyIEFud2VuZHVuZyA9DQotbWVudV9oZWxwX3NvZnR3YXJlX3VwZGF0ZXNfbWFuYWdlX3NvZnR3YXJlX2NvbmZpZ190ZXh0PVNvZnR3YXJla29uZmlndXJhdGlvbiAmdmVyd2FsdGVuLi4uDQotDQotd29ya3NwYWNlQ2Fubm90TG9ja1RpdGxlPXswfSBrYW5uIG5pY2h0IGdlc3RhcnRldCB3ZXJkZW4uDQotd29ya3NwYWNlQ2Fubm90TG9ja01lc3NhZ2U9ezB9IGthbm4gbmljaHQgZ2VzdGFydGV0IHdlcmRlbiwgd2VubiBlaW5lIGFuZGVyZSBJbnN0YW56IGFrdGl2IGlzdC4gV2VjaHNlbG4gU2llIGluIGRpZSBha3RpdmUgSW5zdGFueiBvZGVyIHNjaGxpZVx1MDBkZmVuIFNpZSBkaWUgYWt0aXZlIEluc3RhbnogdW5kIHN0YXJ0ZW4gU2llIGRpZSBBbndlbmR1bmcgZXJuZXV0Lg0KLW1haW5BY3Rpb25CYXJBZHZpc29yX0RpYWdub3Npcz1EaWFnbm9zZS0gdW5kIFJlcGFyYXR1cnRvb2xzDQotbWFpbkFjdGlvbkJhckFkdmlzb3JfSGVhbHRoQ2hlY2s9U3RhdHVzcHJcdTAwZmNmdW5nIGZcdTAwZmNyIEJpYmxpb3RoZWsgZHVyY2hmXHUwMGZjaHJlbi4uLg0KLW1haW5BY3Rpb25CYXJBZHZpc29yX1JlbW92ZVJlZmVyZW5jZT1SZWZlcmVuemVuIGF1ZiB1bmdcdTAwZmNsdGlnZSBPYmpla3RlIGVudGZlcm5lbi4uLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNWE0ZGU5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEZpbGUgTWVudQ0KLWZpbGVNZW51SXRlbV90ZXh0PSZBcmNoaXZvDQotZmlsZU5ld01lbnVJdGVtX3RleHQ9Jk51ZXZvDQotZmlsZU9wZW5NZW51SXRlbV90ZXh0PUFiJnJpcg0KLQ0KLSMgRWRpdCBNZW51DQotZWRpdE1lbnVJdGVtX3RleHQ9JkVkaXRhcg0KLQ0KLSMgTmF2aWdhdGUgTWVudQ0KLW5hdmlnYXRlTWVudUl0ZW1fdGV4dD0mTmF2ZWdhcg0KLQ0KLSMgU2VhcmNoIE1lbnUNCi1zZWFyY2hNZW51SXRlbV90ZXh0PSZCdXNjYXINCi0NCi0jIENvbmZpZ3VyYXRpb24gTWVudQ0KLWNvbmZpZ3VyYXRpb25NZW51SXRlbV90ZXh0PSZDb25maWd1cmFjaVx1MDBmM24NCi0NCi0jIFdpbmRvdyBNZW51DQotd2luZG93TWVudUl0ZW1fdGV4dD0mVmVudGFuYQ0KLXdpbmRvd09wZW5QZXJzcGVjdGl2ZU1lbnVJdGVtX3RleHQ9JkFicmlyIHBlcnNwZWN0aXZhDQotd2luZG93U2hvd1ZpZXdNZW51SXRlbV90ZXh0PU1vc3RyYXIgdmlzdGENCi0NCi0jIEhlbHAgTWVudQ0KLWhlbHBNZW51SXRlbV90ZXh0PSZBeXVkYQ0KLQ0KLSMgTmV3IERyb3AgRG93biBNZW51DQotbmV3RHJvcERvd25fdG9vbHRpcF90ZXh0PU51ZXZvDQotb3RoZXJNZW51SXRlbV90ZXh0PU90cm8uLi4NCi0NCi0jIE9wZW4gUGVyc3BlY3RpdmUgQWN0aW9ucw0KLW9wZW5BdXRob3JpbmdQZXJzcGVjdGl2ZUFjdGlvbl90ZXh0PUF1dG9yXHUwMGVkYQ0KLW9wZW5Ccm93c2luZ1BlcnNwZWN0aXZlQWN0aW9uX3RleHQ9RXhhbWVuDQotDQotIyBNaXNjIEFjdGlvbnMNCi1lZGl0QWN0aW9uX3RleHQ9RWRpdGFyDQotdXBncmFkZUxpYnJhcnlBY3Rpb25fdGV4dD1BY3R1YWxpemFyIGxhIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGRlIEkxIGEgSTIuLi4NCi0NCi1zdGFydHVwX2Rpcl9sb2dfaW5mb190ZXh0PUlORk9STUFDSVx1MDBkM046IERpcmVjdG9yaW8gZGUgaW5pY2lvIGRlIGFwbGljYWNpXHUwMGYzbiA9DQotbWVudV9oZWxwX3NvZnR3YXJlX3VwZGF0ZXNfbWFuYWdlX3NvZnR3YXJlX2NvbmZpZ190ZXh0PSZHZXN0aW9uYXIgY29uZmlndXJhY2lcdTAwZjNuIGRlIHNvZnR3YXJlLi4uDQotDQotd29ya3NwYWNlQ2Fubm90TG9ja1RpdGxlPU5vIHNlIHB1ZWRlIGluaWNpYXIgezB9DQotd29ya3NwYWNlQ2Fubm90TG9ja01lc3NhZ2U9ezB9IG5vIHNlIHB1ZWRlIGluaWNpYXIgbWllbnRyYXMgc2UgZWplY3V0YSBvdHJhIGluc3RhbmNpYS4gIFZheWEgYSBsYSBpbnN0YW5jaWEgZW4gZWplY3VjaVx1MDBmM24gbyBjaVx1MDBlOXJyZWxhIHkgcmVpbmljaWUgbGEgYXBsaWNhY2lcdTAwZjNuLg0KLW1haW5BY3Rpb25CYXJBZHZpc29yX0RpYWdub3Npcz1IZXJyYW1pZW50YXMgZGUgcmVwYXJhY2lcdTAwZjNuIHkgZGlhZ25cdTAwZjNzdGljbw0KLW1haW5BY3Rpb25CYXJBZHZpc29yX0hlYWx0aENoZWNrPVJlYWxpemFyIGNvbXByb2JhY2lcdTAwZjNuIGRlIGVzdGFkbyBkZSBsYSBiaWJsaW90ZWNhLi4uDQotbWFpbkFjdGlvbkJhckFkdmlzb3JfUmVtb3ZlUmVmZXJlbmNlPUVsaW1pbmFyIHJlZmVyZW5jaWFzIGEgb2JqZXRvcyBubyB2XHUwMGUxbGlkb3MuLi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC9SZXNvdXJjZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2UyYWRlNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGaWxlIE1lbnUNCi1maWxlTWVudUl0ZW1fdGV4dD0mRmljaGllcg0KLWZpbGVOZXdNZW51SXRlbV90ZXh0PSZOb3V2ZWF1DQotZmlsZU9wZW5NZW51SXRlbV90ZXh0PU8mdXZyaXINCi0NCi0jIEVkaXQgTWVudQ0KLWVkaXRNZW51SXRlbV90ZXh0PSZNb2RpZmllcg0KLQ0KLSMgTmF2aWdhdGUgTWVudQ0KLW5hdmlnYXRlTWVudUl0ZW1fdGV4dD0mTmF2aWd1ZXINCi0NCi0jIFNlYXJjaCBNZW51DQotc2VhcmNoTWVudUl0ZW1fdGV4dD0mUmVjaGVyY2hlDQotDQotIyBDb25maWd1cmF0aW9uIE1lbnUNCi1jb25maWd1cmF0aW9uTWVudUl0ZW1fdGV4dD0mQ29uZmlndXJhdGlvbg0KLQ0KLSMgV2luZG93IE1lbnUNCi13aW5kb3dNZW51SXRlbV90ZXh0PSZGZW5cdTAwZWF0cmUNCi13aW5kb3dPcGVuUGVyc3BlY3RpdmVNZW51SXRlbV90ZXh0PSZPdXZyaXIgbGEgcGVyc3BlY3RpdmUNCi13aW5kb3dTaG93Vmlld01lbnVJdGVtX3RleHQ9QWZmaWNoZXIgbGEgdnVlDQotDQotIyBIZWxwIE1lbnUNCi1oZWxwTWVudUl0ZW1fdGV4dD0mQWlkZQ0KLQ0KLSMgTmV3IERyb3AgRG93biBNZW51DQotbmV3RHJvcERvd25fdG9vbHRpcF90ZXh0PU5vdXZlYXUNCi1vdGhlck1lbnVJdGVtX3RleHQ9QXV0cmUuLi4NCi0NCi0jIE9wZW4gUGVyc3BlY3RpdmUgQWN0aW9ucw0KLW9wZW5BdXRob3JpbmdQZXJzcGVjdGl2ZUFjdGlvbl90ZXh0PUNyXHUwMGU5YXRpb24NCi1vcGVuQnJvd3NpbmdQZXJzcGVjdGl2ZUFjdGlvbl90ZXh0PUV4cGxvcmF0aW9uDQotDQotIyBNaXNjIEFjdGlvbnMNCi1lZGl0QWN0aW9uX3RleHQ9TW9kaWZpZXINCi11cGdyYWRlTGlicmFyeUFjdGlvbl90ZXh0PU1ldHRyZSBcdTAwZTAgbml2ZWF1IGxhIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZGUgSTEgdmVycyBJMi4uLg0KLQ0KLXN0YXJ0dXBfZGlyX2xvZ19pbmZvX3RleHQ9SU5GTyA6IHJcdTAwZTlwZXJ0b2lyZSBEXHUwMGU5bWFycmFnZSBkZSBsJ2FwcGxpY2F0aW9uID0NCi1tZW51X2hlbHBfc29mdHdhcmVfdXBkYXRlc19tYW5hZ2Vfc29mdHdhcmVfY29uZmlnX3RleHQ9JkdcdTAwZTlyZXIgbGEgY29uZmlndXJhdGlvbiBsb2dpY2llbGxlLi4uDQotDQotd29ya3NwYWNlQ2Fubm90TG9ja1RpdGxlPUltcG9zc2libGUgZGUgZFx1MDBlOW1hcnJlciB7MH0NCi13b3Jrc3BhY2VDYW5ub3RMb2NrTWVzc2FnZT17MH0gbmUgcGV1dCBwYXMgXHUwMGVhdHJlIGRcdTAwZTltYXJyXHUwMGU5IHNpIHVuZSBhdXRyZSBpbnN0YW5jZSBlc3QgZW4gY291cnMgZCcnZXhcdTAwZTljdXRpb24uICBCYXNjdWxleiB2ZXJzIGwnJ2luc3RhbmNlIGVuIGNvdXJzIGQnJ2V4XHUwMGU5Y3V0aW9uIG91IGZlcm1lei1sYSBldCByZWxhbmNleiBsJydhcHBsaWNhdGlvbi4NCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9EaWFnbm9zaXM9T3V0aWxzIGRlIGRpYWdub3N0aWMgZXQgZGUgclx1MDBlOXBhcmF0aW9uDQotbWFpbkFjdGlvbkJhckFkdmlzb3JfSGVhbHRoQ2hlY2s9RWZmZWN0dWVyIHVuIGNvbnRyXHUwMGY0bGUgZGUgc2FudFx1MDBlOSBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZS4uLg0KLW1haW5BY3Rpb25CYXJBZHZpc29yX1JlbW92ZVJlZmVyZW5jZT1TdXBwcmltZXIgbGVzIHJcdTAwZTlmXHUwMGU5cmVuY2VzIGF1eCBvYmpldHMgbm9uIHZhbGlkZXMuLi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC9SZXNvdXJjZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWE3OTJhYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGaWxlIE1lbnUNCi1maWxlTWVudUl0ZW1fdGV4dD0mRmlsZQ0KLWZpbGVOZXdNZW51SXRlbV90ZXh0PSZOdW92bw0KLWZpbGVPcGVuTWVudUl0ZW1fdGV4dD1BJnByaQ0KLQ0KLSMgRWRpdCBNZW51DQotZWRpdE1lbnVJdGVtX3RleHQ9Jk1vZGlmaWNhDQotDQotIyBOYXZpZ2F0ZSBNZW51DQotbmF2aWdhdGVNZW51SXRlbV90ZXh0PSZFc3Bsb3JhDQotDQotIyBTZWFyY2ggTWVudQ0KLXNlYXJjaE1lbnVJdGVtX3RleHQ9JlJpY2VyY2ENCi0NCi0jIENvbmZpZ3VyYXRpb24gTWVudQ0KLWNvbmZpZ3VyYXRpb25NZW51SXRlbV90ZXh0PSZDb25maWd1cmF6aW9uZQ0KLQ0KLSMgV2luZG93IE1lbnUNCi13aW5kb3dNZW51SXRlbV90ZXh0PSZGaW5lc3RyYQ0KLXdpbmRvd09wZW5QZXJzcGVjdGl2ZU1lbnVJdGVtX3RleHQ9JkFwcmkgcHJvc3BldHRpdmENCi13aW5kb3dTaG93Vmlld01lbnVJdGVtX3RleHQ9TW9zdHJhIHZpc3RhDQotDQotIyBIZWxwIE1lbnUNCi1oZWxwTWVudUl0ZW1fdGV4dD0mR3VpZGENCi0NCi0jIE5ldyBEcm9wIERvd24gTWVudQ0KLW5ld0Ryb3BEb3duX3Rvb2x0aXBfdGV4dD1OdW92bw0KLW90aGVyTWVudUl0ZW1fdGV4dD1BbHRyby4uLg0KLQ0KLSMgT3BlbiBQZXJzcGVjdGl2ZSBBY3Rpb25zDQotb3BlbkF1dGhvcmluZ1BlcnNwZWN0aXZlQWN0aW9uX3RleHQ9QXV0aG9yaW5nDQotb3BlbkJyb3dzaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dD1Fc3Bsb3JhemlvbmUNCi0NCi0jIE1pc2MgQWN0aW9ucw0KLWVkaXRBY3Rpb25fdGV4dD1Nb2RpZmljYQ0KLXVwZ3JhZGVMaWJyYXJ5QWN0aW9uX3RleHQ9QWdnaW9ybmEgbGlicmVyaWEgZGVpIG1ldG9kaSBkYSBJMSBhIEkyLi4uDQotDQotc3RhcnR1cF9kaXJfbG9nX2luZm9fdGV4dD1JTkZPOiBEaXJlY3RvcnkgZGkgYXZ2aW8gYXBwbGljYXppb25lID0NCi1tZW51X2hlbHBfc29mdHdhcmVfdXBkYXRlc19tYW5hZ2Vfc29mdHdhcmVfY29uZmlnX3RleHQ9Jkdlc3Rpc2NpIGNvbmZpZ3VyYXppb25lIHNvZnR3YXJlLi4uDQotDQotd29ya3NwYWNlQ2Fubm90TG9ja1RpdGxlPUltcG9zc2liaWxlIGF2dmlhcmUgezB9DQotd29ya3NwYWNlQ2Fubm90TG9ja01lc3NhZ2U9SW1wb3NzaWJpbGUgYXZ2aWFyZSB7MH0gbWVudHJlIHVuJydhbHRyYSBpc3RhbnphIFx1MDBlOCBpbiBlc2VjdXppb25lLiBQYXNzYXJlIGFsbCcnaXN0YW56YSBpbiBlc2VjdXppb25lIG9wcHVyZSBjaGl1ZGVybGEgZSBhdnZpYXJlIGRpIG51b3ZvIGwnJ2FwcGxpY2F6aW9uZS4NCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9EaWFnbm9zaXM9VG9vbCBkaSBkaWFnbm9zdGljYSBlIGRpIHJpcHJpc3Rpbm8NCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9IZWFsdGhDaGVjaz1Fc2VndWkgY29udHJvbGxvIGludGVncml0XHUwMGUwIHN1IGxpYnJlcmlhLi4uDQotbWFpbkFjdGlvbkJhckFkdmlzb3JfUmVtb3ZlUmVmZXJlbmNlPVJpbXVvdmkgcmlmZXJpbWVudGkgYSBvZ2dldHRpIG5vbiB2YWxpZGkuLi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC9SZXNvdXJjZXNfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGE2ZDg5Zi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGaWxlIE1lbnUNCi1maWxlTWVudUl0ZW1fdGV4dD1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIoJkYpDQotZmlsZU5ld01lbnVJdGVtX3RleHQ9XHU2NWIwXHU4OThmKCZOKQ0KLWZpbGVPcGVuTWVudUl0ZW1fdGV4dD1cdTk1OGJcdTMwNGYoJlApDQotDQotIyBFZGl0IE1lbnUNCi1lZGl0TWVudUl0ZW1fdGV4dD1cdTdkZThcdTk2YzYoJkUpDQotDQotIyBOYXZpZ2F0ZSBNZW51DQotbmF2aWdhdGVNZW51SXRlbV90ZXh0PVx1MzBjYVx1MzBkM1x1MzBiMlx1MzBmY1x1MzBjOCgmTikNCi0NCi0jIFNlYXJjaCBNZW51DQotc2VhcmNoTWVudUl0ZW1fdGV4dD1cdTY5MWNcdTdkMjIoJlMpDQotDQotIyBDb25maWd1cmF0aW9uIE1lbnUNCi1jb25maWd1cmF0aW9uTWVudUl0ZW1fdGV4dD1cdTY5Y2JcdTYyMTAoJkMpDQotDQotIyBXaW5kb3cgTWVudQ0KLXdpbmRvd01lbnVJdGVtX3RleHQ9XHUzMGE2XHUzMGEzXHUzMGYzXHUzMGM5XHUzMGE2KCZXKQ0KLXdpbmRvd09wZW5QZXJzcGVjdGl2ZU1lbnVJdGVtX3RleHQ9XHUzMGQxXHUzMGZjXHUzMGI5XHUzMGRhXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQ2XHUzMDkyXHU5NThiXHUzMDRmKCZPKQ0KLXdpbmRvd1Nob3dWaWV3TWVudUl0ZW1fdGV4dD1cdTMwZDNcdTMwZTVcdTMwZmNcdTMwOTJcdTg4NjhcdTc5M2ENCi0NCi0jIEhlbHAgTWVudQ0KLWhlbHBNZW51SXRlbV90ZXh0PVx1MzBkOFx1MzBlYlx1MzBkNygmSCkNCi0NCi0jIE5ldyBEcm9wIERvd24gTWVudQ0KLW5ld0Ryb3BEb3duX3Rvb2x0aXBfdGV4dD1cdTY1YjBcdTg5OGYNCi1vdGhlck1lbnVJdGVtX3RleHQ9XHUzMDVkXHUzMDZlXHU0ZWQ2Li4uDQotDQotIyBPcGVuIFBlcnNwZWN0aXZlIEFjdGlvbnMNCi1vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dD1cdTMwYWFcdTMwZmNcdTMwYjVcdTMwZWFcdTMwZjNcdTMwYjANCi1vcGVuQnJvd3NpbmdQZXJzcGVjdGl2ZUFjdGlvbl90ZXh0PVx1MzBkNlx1MzBlOVx1MzBhNlx1MzBiYQ0KLQ0KLSMgTWlzYyBBY3Rpb25zDQotZWRpdEFjdGlvbl90ZXh0PVx1N2RlOFx1OTZjNg0KLXVwZ3JhZGVMaWJyYXJ5QWN0aW9uX3RleHQ9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDkyIEkxIFx1MzA0Ylx1MzA4OSBJMiBcdTMwNmJcdTMwYTJcdTMwYzNcdTMwZDdcdTMwYjBcdTMwZWNcdTMwZmNcdTMwYzkuLi4NCi0NCi1zdGFydHVwX2Rpcl9sb2dfaW5mb190ZXh0PUlORk86IFx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1OTU4Ylx1NTljYlx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzBmYyA9DQotbWVudV9oZWxwX3NvZnR3YXJlX3VwZGF0ZXNfbWFuYWdlX3NvZnR3YXJlX2NvbmZpZ190ZXh0PVx1MzBiZFx1MzBkNVx1MzBjOFx1MzBhNlx1MzBhN1x1MzBhMlx1NjljYlx1NjIxMFx1MzA2ZVx1N2JhMVx1NzQwNigmTSkuLi4NCi0NCi13b3Jrc3BhY2VDYW5ub3RMb2NrVGl0bGU9ezB9IFx1MzA5Mlx1OTU4Ylx1NTljYlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mw0KLXdvcmtzcGFjZUNhbm5vdExvY2tNZXNzYWdlPXswfSBcdTMwNmZcdTMwMDFcdTUyMjVcdTMwNmVcdTMwYTRcdTMwZjNcdTMwYjlcdTMwYmZcdTMwZjNcdTMwYjlcdTMwNmVcdTViOWZcdTg4NGNcdTRlMmRcdTMwNmJcdTMwNmZcdTk1OGJcdTU5Y2JcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIgIFx1NWI5Zlx1ODg0Y1x1NGUyZFx1MzA2ZVx1MzBhNFx1MzBmM1x1MzBiOVx1MzBiZlx1MzBmM1x1MzBiOVx1MzA2Ylx1NTIwN1x1MzA4YVx1NjZmZlx1MzA0OFx1MzA4Ylx1MzA0Ylx1MzAwMVx1MzA1M1x1MzA2ZVx1MzBhNFx1MzBmM1x1MzBiOVx1MzBiZlx1MzBmM1x1MzBiOVx1MzA5Mlx1OTU4OVx1MzA1OFx1MzA2Nlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1NTE4ZFx1NTljYlx1NTJkNVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLW1haW5BY3Rpb25CYXJBZHZpc29yX0RpYWdub3Npcz1cdThhM2FcdTY1YWRcdTMwNGFcdTMwODhcdTMwNzNcdTRmZWVcdTVmYTlcdTMwYzRcdTMwZmNcdTMwZWINCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9IZWFsdGhDaGVjaz1cdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwZmNcdTMwNmVcdTMwZDhcdTMwZWJcdTMwYjlcdTMwZmJcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTMwOTJcdTViOWZcdTg4NGNcdTMwNTlcdTMwOGIuLi4NCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9SZW1vdmVSZWZlcmVuY2U9XHU3MTIxXHU1MmI5XHUzMDZhXHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4XHUzMDc4XHUzMDZlXHU1M2MyXHU3MTY3XHUzMDkyXHU5NjY0XHU1M2JiXHUzMDU5XHUzMDhiLi4uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwZjFhMDkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC9SZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRmlsZSBNZW51DQotZmlsZU1lbnVJdGVtX3RleHQ9XHVkMzBjXHVjNzdjKCZGKQ0KLWZpbGVOZXdNZW51SXRlbV90ZXh0PVx1YzBjOFx1Yjg1YyBcdWM3OTFcdWMxMzEoJk4pDQotZmlsZU9wZW5NZW51SXRlbV90ZXh0PVx1YzVmNFx1YWUzMCgmUCkNCi0NCi0jIEVkaXQgTWVudQ0KLWVkaXRNZW51SXRlbV90ZXh0PVx1ZDNiOFx1YzlkMSgmRSkNCi0NCi0jIE5hdmlnYXRlIE1lbnUNCi1uYXZpZ2F0ZU1lbnVJdGVtX3RleHQ9XHVkMGQwXHVjMGM5KCZOKQ0KLQ0KLSMgU2VhcmNoIE1lbnUNCi1zZWFyY2hNZW51SXRlbV90ZXh0PVx1YWM4MFx1YzBjOSgmUykNCi0NCi0jIENvbmZpZ3VyYXRpb24gTWVudQ0KLWNvbmZpZ3VyYXRpb25NZW51SXRlbV90ZXh0PVx1YWQ2Y1x1YzEzMSgmQykNCi0NCi0jIFdpbmRvdyBNZW51DQotd2luZG93TWVudUl0ZW1fdGV4dD1cdWNjM2QoJlcpDQotd2luZG93T3BlblBlcnNwZWN0aXZlTWVudUl0ZW1fdGV4dD1QZXJzcGVjdGl2ZSBcdWM1ZjRcdWFlMzAoJk8pDQotd2luZG93U2hvd1ZpZXdNZW51SXRlbV90ZXh0PVx1YmNmNFx1YWUzMCBcdWQ0NWNcdWMyZGMNCi0NCi0jIEhlbHAgTWVudQ0KLWhlbHBNZW51SXRlbV90ZXh0PVx1YjNjNFx1YzZjMFx1YjlkMCgmSCkNCi0NCi0jIE5ldyBEcm9wIERvd24gTWVudQ0KLW5ld0Ryb3BEb3duX3Rvb2x0aXBfdGV4dD1cdWMwYzhcdWI4NWMgXHVjNzkxXHVjMTMxDQotb3RoZXJNZW51SXRlbV90ZXh0PVx1YWUzMFx1ZDBjMC4uLg0KLQ0KLSMgT3BlbiBQZXJzcGVjdGl2ZSBBY3Rpb25zDQotb3BlbkF1dGhvcmluZ1BlcnNwZWN0aXZlQWN0aW9uX3RleHQ9XHVjNzkxXHVjMTMxDQotb3BlbkJyb3dzaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dD1cdWNjM2VcdWM1NDRcdWJjZjRcdWFlMzANCi0NCi0jIE1pc2MgQWN0aW9ucw0KLWVkaXRBY3Rpb25fdGV4dD1cdWQzYjhcdWM5ZDENCi11cGdyYWRlTGlicmFyeUFjdGlvbl90ZXh0PUkxXHVjNWQwXHVjMTFjIEkyXHViODVjIFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWMgXHVjNWM1XHVhZGY4XHViODA4XHVjNzc0XHViNGRjLi4uDQotDQotc3RhcnR1cF9kaXJfbG9nX2luZm9fdGV4dD1cdWM4MTVcdWJjZjQ6IFx1Yzc1MVx1YzZhOVx1ZDUwNFx1Yjg1Y1x1YWRmOFx1YjdhOCBcdWMyZGNcdWM3OTEgXHViNTE0XHViODA5XHVkMWEwXHViOWFjID0NCi1tZW51X2hlbHBfc29mdHdhcmVfdXBkYXRlc19tYW5hZ2Vfc29mdHdhcmVfY29uZmlnX3RleHQ9XHVjMThjXHVkNTA0XHVkMmI4XHVjNmU4XHVjNWI0IFx1YWQ2Y1x1YzEzMSBcdWFkMDBcdWI5YWMoJk0pLi4uDQotDQotd29ya3NwYWNlQ2Fubm90TG9ja1RpdGxlPXswfVx1Yzc0NChcdWI5N2MpIFx1YzJkY1x1Yzc5MVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjNzRjDQotd29ya3NwYWNlQ2Fubm90TG9ja01lc3NhZ2U9XHViMmU0XHViOTc4IFx1Yzc3OFx1YzJhNFx1ZDEzNFx1YzJhNFx1YWMwMCBcdWMyZTRcdWQ1ODkgXHVjOTExXHVjNzc0XHViYTc0IHswfVx1Yzc0MChcdWIyOTQpIFx1YzJkY1x1Yzc5MVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcdWMyZTRcdWQ1ODkgXHVjNzc4XHVjMmE0XHVkMTM0XHVjMmE0XHViODVjIFx1YzgwNFx1ZDY1OFx1ZDU1OFx1YWM3MFx1YjA5OCBcdWM3NzhcdWMyYTRcdWQxMzRcdWMyYTRcdWI5N2MgXHViMmViXHVhY2UwIFx1Yzc1MVx1YzZhOVx1ZDUwNFx1Yjg1Y1x1YWRmOFx1YjdhOFx1Yzc0NCBcdWIyZTRcdWMyZGMgXHVjMmRjXHVjNzkxXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0Lg0KLW1haW5BY3Rpb25CYXJBZHZpc29yX0RpYWdub3Npcz1cdWM5YzRcdWIyZTggXHViYzBmIFx1YmNmNVx1YWQ2YyBcdWIzYzRcdWFkNmMNCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9IZWFsdGhDaGVjaz1cdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWM3NTggXHVjMGMxXHVkMGRjIFx1YWM4MFx1YzBhYyBcdWMyMThcdWQ1ODkuLi4NCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9SZW1vdmVSZWZlcmVuY2U9XHVjNjJjXHViYzE0XHViOTc0XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWM2MjRcdWJlMGNcdWM4MWRcdWQyYjhcdWM1ZDAgXHViMzAwXHVkNTVjIFx1Y2MzOFx1Yzg3MCBcdWM4MWNcdWFjNzAuLi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTI1NjEwZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGaWxlIE1lbnUNCi1maWxlTWVudUl0ZW1fdGV4dD0mQXJxdWl2bw0KLWZpbGVOZXdNZW51SXRlbV90ZXh0PSZOb3ZvDQotZmlsZU9wZW5NZW51SXRlbV90ZXh0PUEmYnJpcg0KLQ0KLSMgRWRpdCBNZW51DQotZWRpdE1lbnVJdGVtX3RleHQ9JkVkaXRhcg0KLQ0KLSMgTmF2aWdhdGUgTWVudQ0KLW5hdmlnYXRlTWVudUl0ZW1fdGV4dD0mTmF2ZWdhcg0KLQ0KLSMgU2VhcmNoIE1lbnUNCi1zZWFyY2hNZW51SXRlbV90ZXh0PSZQcm9jdXJhcg0KLQ0KLSMgQ29uZmlndXJhdGlvbiBNZW51DQotY29uZmlndXJhdGlvbk1lbnVJdGVtX3RleHQ9JkNvbmZpZ3VyYVx1MDBlN1x1MDBlM28NCi0NCi0jIFdpbmRvdyBNZW51DQotd2luZG93TWVudUl0ZW1fdGV4dD0mSmFuZWxhDQotd2luZG93T3BlblBlcnNwZWN0aXZlTWVudUl0ZW1fdGV4dD0mQWJyaXIgUGVyc3BlY3RpdmENCi13aW5kb3dTaG93Vmlld01lbnVJdGVtX3RleHQ9TW9zdHJhciBWaXN1YWxpemFcdTAwZTdcdTAwZTNvDQotDQotIyBIZWxwIE1lbnUNCi1oZWxwTWVudUl0ZW1fdGV4dD0mQWp1ZGENCi0NCi0jIE5ldyBEcm9wIERvd24gTWVudQ0KLW5ld0Ryb3BEb3duX3Rvb2x0aXBfdGV4dD1Ob3ZvDQotb3RoZXJNZW51SXRlbV90ZXh0PU91dHJvLi4uDQotDQotIyBPcGVuIFBlcnNwZWN0aXZlIEFjdGlvbnMNCi1vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dD1BdXRvcmlhDQotb3BlbkJyb3dzaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dD1OYXZlZ2FcdTAwZTdcdTAwZTNvDQotDQotIyBNaXNjIEFjdGlvbnMNCi1lZGl0QWN0aW9uX3RleHQ9RWRpdGFyDQotdXBncmFkZUxpYnJhcnlBY3Rpb25fdGV4dD1GYXplciBVcGdyYWRlIGRlIEJpYmxpb3RlY2EgZGUgTVx1MDBlOXRvZG9zIGRlIEkxIHBhcmEgSTIuLi4NCi0NCi1zdGFydHVwX2Rpcl9sb2dfaW5mb190ZXh0PUlORk86IERpcmV0XHUwMGYzcmlvIGluaWNpYWwgZG8gYXBsaWNhdGl2byA9DQotbWVudV9oZWxwX3NvZnR3YXJlX3VwZGF0ZXNfbWFuYWdlX3NvZnR3YXJlX2NvbmZpZ190ZXh0PSZHZXJlbmNpYXIgQ29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBTb2Z0d2FyZS4uLg0KLQ0KLXdvcmtzcGFjZUNhbm5vdExvY2tUaXRsZT1OXHUwMGUzbyBcdTAwZTkgcG9zc1x1MDBlZHZlbCBpbmljaWFyIHswfQ0KLXdvcmtzcGFjZUNhbm5vdExvY2tNZXNzYWdlPXswfSBuXHUwMGUzbyBwb2Rlclx1MDBlMSBzZXIgaW5pY2lhZG8gZW5xdWFudG8gb3V0cmEgaW5zdFx1MDBlMm5jaWEgZXN0aXZlciBlbSBleGVjdVx1MDBlN1x1MDBlM28uICBNdWRlIHBhcmEgYSBpbnN0XHUwMGUybmNpYSBlbSBleGVjdVx1MDBlN1x1MDBlM28gb3UgZmVjaGUtYSBlIHJlaW5pY2llIG8gYXBsaWNhdGl2by4NCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9EaWFnbm9zaXM9RmVycmFtZW50YXMgZGUgRGlhZ25cdTAwZjNzdGljbyBlIFJlcGFybw0KLW1haW5BY3Rpb25CYXJBZHZpc29yX0hlYWx0aENoZWNrPUV4ZWN1dGFyIFZlcmlmaWNhXHUwMGU3XHUwMGUzbyBkZSBGdW5jaW9uYW1lbnRvIG5hIEJpYmxpb3RlY2EuLi4NCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9SZW1vdmVSZWZlcmVuY2U9UmVtb3ZlciBSZWZlclx1MDBlYW5jaWFzIGEgT2JqZXRvcyBJbnZcdTAwZTFsaWRvcy4uLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOWYzZDc0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEZpbGUgTWVudQ0KLWZpbGVNZW51SXRlbV90ZXh0PVx1NjU4N1x1NGVmNigmRikNCi1maWxlTmV3TWVudUl0ZW1fdGV4dD1cdTY1YjBcdTVlZmEoJk4pDQotZmlsZU9wZW5NZW51SXRlbV90ZXh0PVx1NjI1M1x1NWYwMCgmUCkNCi0NCi0jIEVkaXQgTWVudQ0KLWVkaXRNZW51SXRlbV90ZXh0PVx1N2YxNlx1OGY5MSgmRSkNCi0NCi0jIE5hdmlnYXRlIE1lbnUNCi1uYXZpZ2F0ZU1lbnVJdGVtX3RleHQ9XHU2ZDRmXHU4OWM4KCZOKQ0KLQ0KLSMgU2VhcmNoIE1lbnUNCi1zZWFyY2hNZW51SXRlbV90ZXh0PVx1NjQxY1x1N2QyMigmUykNCi0NCi0jIENvbmZpZ3VyYXRpb24gTWVudQ0KLWNvbmZpZ3VyYXRpb25NZW51SXRlbV90ZXh0PVx1OTE0ZFx1N2Y2ZSgmQykNCi0NCi0jIFdpbmRvdyBNZW51DQotd2luZG93TWVudUl0ZW1fdGV4dD1cdTdhOTdcdTUzZTMoJlcpDQotd2luZG93T3BlblBlcnNwZWN0aXZlTWVudUl0ZW1fdGV4dD1cdTYyNTNcdTVmMDBcdTkwMGZcdTg5YzZcdTU2ZmUoJk8pDQotd2luZG93U2hvd1ZpZXdNZW51SXRlbV90ZXh0PVx1NjYzZVx1NzkzYVx1ODljNlx1NTZmZQ0KLQ0KLSMgSGVscCBNZW51DQotaGVscE1lbnVJdGVtX3RleHQ9XHU1ZTJlXHU1MmE5KCZIKQ0KLQ0KLSMgTmV3IERyb3AgRG93biBNZW51DQotbmV3RHJvcERvd25fdG9vbHRpcF90ZXh0PVx1NjViMFx1NWVmYQ0KLW90aGVyTWVudUl0ZW1fdGV4dD1cdTUxNzZcdTRlZDYuLi4NCi0NCi0jIE9wZW4gUGVyc3BlY3RpdmUgQWN0aW9ucw0KLW9wZW5BdXRob3JpbmdQZXJzcGVjdGl2ZUFjdGlvbl90ZXh0PVx1N2YxNlx1NTE5OQ0KLW9wZW5Ccm93c2luZ1BlcnNwZWN0aXZlQWN0aW9uX3RleHQ9XHU2ZDRmXHU4OWM4DQotDQotIyBNaXNjIEFjdGlvbnMNCi1lZGl0QWN0aW9uX3RleHQ9XHU3ZjE2XHU4ZjkxDQotdXBncmFkZUxpYnJhcnlBY3Rpb25fdGV4dD1cdTVjMDZcdTY1YjlcdTZjZDVcdTVlOTNcdTRlY2UgSTEgXHU1MzQ3XHU3ZWE3XHU1MjMwIEkyLi4uDQotDQotc3RhcnR1cF9kaXJfbG9nX2luZm9fdGV4dD1cdTRmZTFcdTYwNmZcdWZmMWFcdTVlOTRcdTc1MjhcdTdhMGJcdTVlOGZcdTU0MmZcdTUyYThcdTc2ZWVcdTVmNTUgPQ0KLW1lbnVfaGVscF9zb2Z0d2FyZV91cGRhdGVzX21hbmFnZV9zb2Z0d2FyZV9jb25maWdfdGV4dD1cdTdiYTFcdTc0MDZcdThmNmZcdTRlZjZcdTkxNGRcdTdmNmUoJk0pLi4uDQotDQotd29ya3NwYWNlQ2Fubm90TG9ja1RpdGxlPVx1NjVlMFx1NmNkNVx1NTQyZlx1NTJhOCB7MH0NCi13b3Jrc3BhY2VDYW5ub3RMb2NrTWVzc2FnZT1cdTY3MDlcdTUzZTZcdTRlMDBcdTViOWVcdTRmOGJcdTU3MjhcdThmZDBcdTg4NGNcdTY1ZjZcdTY1ZTBcdTZjZDVcdTU0MmZcdTUyYTggezB9XHUzMDAyXHU4YmY3XHU1MjA3XHU2MzYyXHU1MjMwXHU2YjYzXHU4ZmQwXHU4ODRjXHU3Njg0XHU1YjllXHU0ZjhiXHVmZjBjXHU2MjE2XHU1YzA2XHU1YjgzXHU1MTczXHU5NWVkXHU3MTM2XHU1NDBlXHU5MWNkXHU2NWIwXHU1NDJmXHU1MmE4XHU4YmU1XHU1ZTk0XHU3NTI4XHU3YTBiXHU1ZThmXHUzMDAyDQotbWFpbkFjdGlvbkJhckFkdmlzb3JfRGlhZ25vc2lzPVx1OGJjYVx1NjVhZFx1NTQ4Y1x1NGZlZVx1NTkwZFx1NWRlNVx1NTE3Nw0KLW1haW5BY3Rpb25CYXJBZHZpc29yX0hlYWx0aENoZWNrPVx1NWJmOVx1NWU5M1x1NjI2N1x1ODg0Y1x1NTA2NVx1NTE2OFx1NjhjMFx1NjdlNS4uLg0KLW1haW5BY3Rpb25CYXJBZHZpc29yX1JlbW92ZVJlZmVyZW5jZT1cdTk2NjRcdTUzYmJcdTViZjlcdTY1ZTBcdTY1NDhcdTViZjlcdThjNjFcdTc2ODRcdTVmMTVcdTc1MjguLi4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWZlMmJmOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGaWxlIE1lbnUNCi1maWxlTWVudUl0ZW1fdGV4dD1cdTZhOTRcdTY4NDgoJkYpDQotZmlsZU5ld01lbnVJdGVtX3RleHQ9XHU2NWIwXHU1ZWZhKCZOKQ0KLWZpbGVPcGVuTWVudUl0ZW1fdGV4dD1cdTk1OGJcdTU1NWYoJlApDQotDQotIyBFZGl0IE1lbnUNCi1lZGl0TWVudUl0ZW1fdGV4dD1cdTdkZThcdThmMmYoJkUpDQotDQotIyBOYXZpZ2F0ZSBNZW51DQotbmF2aWdhdGVNZW51SXRlbV90ZXh0PVx1NWMwZVx1ODliZCgmTikNCi0NCi0jIFNlYXJjaCBNZW51DQotc2VhcmNoTWVudUl0ZW1fdGV4dD1cdTY0MWNcdTVjMGIoJlMpDQotDQotIyBDb25maWd1cmF0aW9uIE1lbnUNCi1jb25maWd1cmF0aW9uTWVudUl0ZW1fdGV4dD1cdTkxNGRcdTdmNmUoJkMpDQotDQotIyBXaW5kb3cgTWVudQ0KLXdpbmRvd01lbnVJdGVtX3RleHQ9XHU4OTk2XHU3YTk3KCZXKQ0KLXdpbmRvd09wZW5QZXJzcGVjdGl2ZU1lbnVJdGVtX3RleHQ9XHU5NThiXHU1NTVmXHU4OTk2XHU2NjZmKCZPKQ0KLXdpbmRvd1Nob3dWaWV3TWVudUl0ZW1fdGV4dD1cdTk4NmZcdTc5M2FcdTg5OTZcdTU3MTYNCi0NCi0jIEhlbHAgTWVudQ0KLWhlbHBNZW51SXRlbV90ZXh0PVx1OGFhYVx1NjYwZSgmSCkNCi0NCi0jIE5ldyBEcm9wIERvd24gTWVudQ0KLW5ld0Ryb3BEb3duX3Rvb2x0aXBfdGV4dD1cdTY1YjBcdTVlZmENCi1vdGhlck1lbnVJdGVtX3RleHQ9XHU1MTc2XHU0ZWQ2Li4uDQotDQotIyBPcGVuIFBlcnNwZWN0aXZlIEFjdGlvbnMNCi1vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dD1cdTdkZThcdTViZWINCi1vcGVuQnJvd3NpbmdQZXJzcGVjdGl2ZUFjdGlvbl90ZXh0PVx1NzAwZlx1ODliZA0KLQ0KLSMgTWlzYyBBY3Rpb25zDQotZWRpdEFjdGlvbl90ZXh0PVx1N2RlOFx1OGYyZg0KLXVwZ3JhZGVMaWJyYXJ5QWN0aW9uX3RleHQ9XHU1YzA3XHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHU1ZjllIEkxIFx1NTM0N1x1N2QxYVx1ODFmMyBJMi4uLg0KLQ0KLXN0YXJ0dXBfZGlyX2xvZ19pbmZvX3RleHQ9XHU4Y2M3XHU4YTBhXHVmZjFhXHU2MWM5XHU3NTI4XHU3YTBiXHU1ZjBmXHU4ZDc3XHU1OWNiXHU3NmVlXHU5MzA0ID0NCi1tZW51X2hlbHBfc29mdHdhcmVfdXBkYXRlc19tYW5hZ2Vfc29mdHdhcmVfY29uZmlnX3RleHQ9XHU3YmExXHU3NDA2XHU4ZWRmXHU5YWQ0XHU5MTRkXHU3ZjZlKCZNKS4uLg0KLQ0KLXdvcmtzcGFjZUNhbm5vdExvY2tUaXRsZT1cdTcxMjFcdTZjZDVcdTU1NWZcdTUyZDUgezB9DQotd29ya3NwYWNlQ2Fubm90TG9ja01lc3NhZ2U9XHU1M2U2XHU0ZTAwXHU1MDBiXHU1YmU2XHU0ZjhiXHU1N2Y3XHU4ODRjXHU2NjQyXHVmZjBjXHU3MTIxXHU2Y2Q1XHU1NTVmXHU1MmQ1IHswfVx1MzAwMlx1OGFjYlx1NTIwN1x1NjNkYlx1ODFmM1x1NTdmN1x1ODg0Y1x1NGUyZFx1NzY4NFx1NWJlNlx1NGY4Ylx1ZmYwY1x1NjIxNlx1OTVkY1x1OTU4OVx1NWJlNlx1NGY4Ylx1ZmYwY1x1NzEzNlx1NWY4Y1x1NTE4ZFx1NmIyMVx1OTFjZFx1NjViMFx1NTU1Zlx1NTJkNVx1NjFjOVx1NzUyOFx1N2EwYlx1NWYwZlx1MzAwMg0KLW1haW5BY3Rpb25CYXJBZHZpc29yX0RpYWdub3Npcz1cdThhM2FcdTY1YjdcdTU0OGNcdTRmZWVcdTVmYTlcdTVkZTVcdTUxNzcNCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9IZWFsdGhDaGVjaz1cdTZiNjNcdTU3MjhcdTZhYTJcdTY3ZTVcdTdhMGJcdTVmMGZcdTVlYWJcdTc2ODRcdTUwNjVcdTUxNjhcdTcyYzBcdTYxNGIuLi4NCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9SZW1vdmVSZWZlcmVuY2U9XHU3OWZiXHU5NjY0XHU3MTIxXHU2NTQ4XHU3MjY5XHU0ZWY2XHU3Njg0XHU1M2MzXHU3MTY3Li4uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMi8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDIvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMjBjNjdlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5yY3AubmwyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMi9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2Yjk3M2YxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotc291cmNlLm5sMi5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMi5qYXIgPSBiaW4vDQotYmluLmluY2x1ZGVzID0gZnJhZ21lbnQueG1sLFwNCi0gICAgICAgICAgICAgICBubDIuamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcnUucHJvcGVydGllcw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDIvZnJhZ21lbnQueG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMi9mcmFnbWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3NTFkNmQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMi9mcmFnbWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPGZyYWdtZW50Ci0gICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJjcC5ubDIiCi0gICBuYW1lPSJFUEYgQ29tcG9zZXIgV29ya2JlbmNoIChOTDIpIgotICAgdmVyc2lvbj0iMS4yLjAiCi0gICBwcm92aWRlci1uYW1lPSJJQk0iCi0gICBwbHVnaW4taWQ9Im9yZy5lY2xpcHNlLmVwZi5yY3AiCi0gICBwbHVnaW4tdmVyc2lvbj0iMS4yLjAiPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9Im5sMi5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0KLTwvZnJhZ21lbnQ+CmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjBmYjM5MS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1cdTA0MjFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGMgRVBGIC0gUkNQDQotcHJvZHVjdE5hbWU9XHUwNDIxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgQ2F0ZWdvcnkNCi1tZXRob2RDYXRlZ29yeU5hbWU9XHUwNDFjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0DQotDQotIyBWaWV3cw0KLXdlbGNvbWVWaWV3TmFtZT1cdTA0MWZcdTA0NDBcdTA0MzhcdTA0MzJcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzhcdTA0MzUNCi0NCi0jIEFjdGlvbnMNCi1nbG9iYWxBY3Rpb25TZXQ9XHUwNDEzXHUwNDNiXHUwNDNlXHUwNDMxXHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MCBcdTA0MzRcdTA0MzVcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzhcdTA0MzkNCi1uZXdBY3Rpb249Jlx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0Yw0KLW5ld0FjdGlvblRvb2x0aXA9XHUwNDIxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRjDQotb3BlbkFjdGlvbj0mXHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjLi4uDQotb3BlbkFjdGlvblRvb2x0aXA9XHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjDQotc2VhcmNoQWN0aW9uPSZcdTA0MWRcdTA0MzBcdTA0MzlcdTA0NDJcdTA0MzguLi4NCi1zZWFyY2hBY3Rpb25Ub29sdGlwPVx1MDQxZlx1MDQzZVx1MDQzOFx1MDQ0MVx1MDQzYQ0KLXdlbGNvbWVBY3Rpb249Jlx1MDQxZlx1MDQ0MFx1MDQzOFx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzOFx1MDQzNQ0KLXdlbGNvbWVBY3Rpb25Ub29sVGlwPVx1MDQxZlx1MDQ0MFx1MDQzOFx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzOFx1MDQzNQ0KLQ0KLSMgVG9vbHRpcHMNCi1zaG9ydGN1dC5vdmVydmlldy50b29sdGlwPVx1MDQxMlx1MDQzNVx1MDQ0MFx1MDQzZFx1MDQ0M1x1MDQ0Mlx1MDQ0Y1x1MDQ0MVx1MDQ0ZiBcdTA0M2RcdTA0MzAgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQ2XHUwNDQzIFx1MDQxZVx1MDQzMVx1MDQzN1x1MDQzZVx1MDQ0MA0KLXNob3J0Y3V0LnR1dG9yaWFscy50b29sdGlwPVx1MDQxMlx1MDQzNVx1MDQ0MFx1MDQzZFx1MDQ0M1x1MDQ0Mlx1MDQ0Y1x1MDQ0MVx1MDQ0ZiBcdTA0M2RcdTA0MzAgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDQ2XHUwNDQzIFx1MDQyM1x1MDQ0N1x1MDQzNVx1MDQzMVx1MDQzZFx1MDQzOFx1MDQzYQ0KLXNob3J0Y3V0LmZpcnN0c3RlcHMudG9vbHRpcD1cdTA0MTJcdTA0MzVcdTA0NDBcdTA0M2RcdTA0NDNcdTA0NDJcdTA0NGNcdTA0NDFcdTA0NGYgXHUwNDNkXHUwNDMwIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Nlx1MDQ0MyBcdTA0MWRcdTA0MzBcdTA0NDdcdTA0MzBcdTA0M2JcdTA0M2UgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDRiDQotc2hvcnRjdXQud2VicmVzb3VyY2VzLnRvb2x0aXA9XHUwNDEyXHUwNDM1XHUwNDQwXHUwNDNkXHUwNDQzXHUwNDQyXHUwNDRjXHUwNDQxXHUwNDRmIFx1MDQzZFx1MDQzMCBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDZcdTA0NDMgXHUwNDIwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDRiIFdlYg0KLQ0KLSNBY3Rpb24gU2V0DQotYWN0aW9uU2V0LmRlc2NyaXB0aW9uID0gXHUwNDE0XHUwNDM1XHUwNDM5XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM4XHUwNDRmIFx1MDQzZlx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzYlx1MDQzOCBcdTA0MzhcdTA0M2RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0M2VcdTA0MzIgXHUwNDQxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDNlXHUwNDM5IFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzY1x1MDQ0Yg0KLWFjdGlvblNldC5sYWJlbCA9IFx1MDQyMVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0NDFcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzVcdTA0M2NcdTA0MzANCi1zZWFyY2hBY3Rpb24ubGFiZWwgPSBcdTA0MWZcdTA0M2VcdTA0MzhcdTA0NDFcdTA0M2EgXHUwNDNmXHUwNDNlIFx1MDQ0MVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzYVx1MDQzNQ0KLXNlYXJjaEFjdGlvbi50b29sdGlwID0gXHUwNDFmXHUwNDNlXHUwNDM4XHUwNDQxXHUwNDNhIFx1MDQzZlx1MDQzZSBcdTA0NDFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2FcdTA0MzUNCi1keW5hbWljSGVscEFjdGlvbi5sYWJlbCA9IFx1MDQxNFx1MDQzOFx1MDQzZFx1MDQzMFx1MDQzY1x1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiBcdTA0NDFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2FcdTA0MzAgDQotZHluYW1pY0hlbHBBY3Rpb24udG9vbHRpcCA9IFx1MDQxNFx1MDQzOFx1MDQzZFx1MDQzMFx1MDQzY1x1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiBcdTA0NDFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2FcdTA0MzANCi0NCi0jQWN0aXZpdGllcy9DYXBhYmlsaXRpZXMNCi1hY3Rpdml0eS5nZW5lcmFsPVx1MDQxOFx1MDQzY1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0MiBcdTA0MzggXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQzMiBcdTA0MzggXHUwNDQwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNlXHUwNDMyDQotYWN0aXZpdHkuZ2VuZXJhbC5kZXNjPVx1MDQxOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDRcdTA0NDNcdTA0M2RcdTA0M2FcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDRkXHUwNDNhXHUwNDQxXHUwNDNmXHUwNDNlXHUwNDQwXHUwNDQyXHUwNDMwIFx1MDQzOCBcdTA0MzhcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NDJcdTA0MzAgXHUwNDM4XHUwNDM3IEVjbGlwc2UNCi1hY3Rpdml0eS50ZWFtLmN2cz1cdTA0MWZcdTA0M2VcdTA0MzRcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0M2FcdTA0MzAgQ1ZTDQotYWN0aXZpdHkudGVhbS5jdnMuZGVzYz1cdTA0MThcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgQ1ZTIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0NDNcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDQwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDMwXHUwNDNjXHUwNDM4Lg0KLWFjdGl2aXR5LnRlYW09XHUwNDExXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDRmIFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzYVx1MDQzMCBcdTA0NDFcdTA0M2VcdTA0MzJcdTA0M2NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0M2RcdTA0M2VcdTA0MzkgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDRiDQotYWN0aXZpdHkudGVhbS5kZXNjPVx1MDQyMFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQzMCBcdTA0M2RcdTA0MzBcdTA0MzQgXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDNjXHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzMFx1MDQzY1x1MDQzOCBcdTA0NDEgXHUwNDNmXHUwNDNlXHUwNDNjXHUwNDNlXHUwNDQ5XHUwNDRjXHUwNDRlIFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzYyBcdTA0NDNcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmXHUwNDNjXHUwNDM4Lg0KLQ0KLWFjdGl2aXR5LmNhdC5nZW5lcmFsPVx1MDQxZVx1MDQzMVx1MDQ0OVx1MDQzOFx1MDQzNQ0KLWFjdGl2aXR5LmNhdC5nZW5lcmFsLmRlc2M9XHUwNDE4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDRcdTA0NDNcdTA0M2RcdTA0M2FcdTA0NDZcdTA0MzhcdTA0MzggRWNsaXBzZQ0KLWFjdGl2aXR5LmNhdC50ZWFtPVx1MDQxM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQzMA0KLWFjdGl2aXR5LmNhdC50ZWFtLmRlc2M9XHUwNDIzXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzMFx1MDQzY1x1MDQzOCBcdTA0NDEgXHUwNDNmXHUwNDNlXHUwNDNjXHUwNDNlXHUwNDQ5XHUwNDRjXHUwNDRlIFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzYyBcdTA0NDNcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmXHUwNDNjXHUwNDM4Lg0KLQ0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMgPSBcdTA0MTNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NGIgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5DQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eU5hbWUgPSAmXHUwNDEzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDRiIFx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzOQ0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuY2F0ZWdvcnlOYW1lID0gJlx1MDQxM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0YiBcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkNCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5UHJvbXB0QnV0dG9uID0gXHUwNDE3XHUwNDMwXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDM4XHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzZSZcdTA0MzRcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM0IFx1MDQzMlx1MDQzYVx1MDQzYlx1MDQ0ZVx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNVx1MDQzYyBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2YgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5DQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eVByb21wdEJ1dHRvblRvb2x0aXAgPSBcdTA0MTdcdTA0MzBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0NDhcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzOCBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzJcdTA0M2VcdTA0M2MgXHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM4IFx1MDQzYSBcdTA0M2FcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NDMsIFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2FcdTA0M2VcdTA0NDJcdTA0M2VcdTA0NDBcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDMxXHUwNDQzXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzMlx1MDQzYVx1MDQzYlx1MDQ0ZVx1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NGIgXHUwNDMyXHUwNDNlXHUwNDM3XHUwNDNjXHUwNDNlXHUwNDM2XHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5DQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5jYXB0aW9uTWVzc2FnZSA9IFx1MDQxM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0YiBcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkgXHUwNDMyXHUwNDNhXHUwNDNiXHUwNDRlXHUwNDQ3XHUwNDMwXHUwNDRlXHUwNDQyIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0M2FcdTA0M2JcdTA0NGVcdTA0NDdcdTA0MzBcdTA0NGVcdTA0NDIgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNiXHUwNDM4XHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzAuIFx1MDQxM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQ0YiBcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDNkXHUwNDRiIFx1MDQzZFx1MDQzMCBcdTA0MzdcdTA0MzBcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzVcdTA0MzUgXHUwNDQxXHUwNDNlXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzOFx1MDQzOC4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC9SZXNvdXJjZXNfcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWNlMWQzMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGaWxlIE1lbnUNCi1maWxlTWVudUl0ZW1fdGV4dD0mXHUwNDI0XHUwNDMwXHUwNDM5XHUwNDNiDQotZmlsZU5ld01lbnVJdGVtX3RleHQ9Jlx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0Yw0KLWZpbGVPcGVuTWVudUl0ZW1fdGV4dD0mXHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDRiXHUwNDQyXHUwNDRjDQotDQotIyBFZGl0IE1lbnUNCi1lZGl0TWVudUl0ZW1fdGV4dD0mXHUwNDFmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNhXHUwNDMwDQotDQotIyBOYXZpZ2F0ZSBNZW51DQotbmF2aWdhdGVNZW51SXRlbV90ZXh0PSZcdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzlcdTA0NDJcdTA0MzgNCi0NCi0jIFNlYXJjaCBNZW51DQotc2VhcmNoTWVudUl0ZW1fdGV4dD1cdTA0MWZcdTA0M2UmXHUwNDM4XHUwNDQxXHUwNDNhDQotDQotIyBDb25maWd1cmF0aW9uIE1lbnUNCi1jb25maWd1cmF0aW9uTWVudUl0ZW1fdGV4dD0mXHUwNDFhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmDQotDQotIyBXaW5kb3cgTWVudQ0KLXdpbmRvd01lbnVJdGVtX3RleHQ9Jlx1MDQxZVx1MDQzYVx1MDQzZFx1MDQzZQ0KLXdpbmRvd09wZW5QZXJzcGVjdGl2ZU1lbnVJdGVtX3RleHQ9Jlx1MDQxZVx1MDQ0Mlx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0YyBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzVcdTA0M2FcdTA0NDZcdTA0MzhcdTA0NGUNCi13aW5kb3dTaG93Vmlld01lbnVJdGVtX3RleHQ9XHUwNDFmXHUwNDNlXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQzMFx1MDQzZFx1MDQzNVx1MDQzYlx1MDQ0Yw0KLQ0KLSMgSGVscCBNZW51DQotaGVscE1lbnVJdGVtX3RleHQ9Jlx1MDQyMVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzYVx1MDQzMA0KLQ0KLSMgTmV3IERyb3AgRG93biBNZW51DQotbmV3RHJvcERvd25fdG9vbHRpcF90ZXh0PVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0Yw0KLW90aGVyTWVudUl0ZW1fdGV4dD1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDdcdTA0MzVcdTA0MzUuLi4NCi0NCi0jIE9wZW4gUGVyc3BlY3RpdmUgQWN0aW9ucw0KLW9wZW5BdXRob3JpbmdQZXJzcGVjdGl2ZUFjdGlvbl90ZXh0PVx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNQ0KLW9wZW5Ccm93c2luZ1BlcnNwZWN0aXZlQWN0aW9uX3RleHQ9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDNjXHUwNDNlXHUwNDQyXHUwNDQwDQotDQotIyBNaXNjIEFjdGlvbnMNCi1lZGl0QWN0aW9uX3RleHQ9XHUwNDE4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjDQotdXBncmFkZUxpYnJhcnlBY3Rpb25fdGV4dD1cdTA0MWVcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQzIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMiBcdTA0NDEgSTEgXHUwNDM0XHUwNDNlIEkyLi4uDQotDQotc3RhcnR1cF9kaXJfbG9nX2luZm9fdGV4dD1JTkZPOiBcdTA0MWRcdTA0MzBcdTA0NDdcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMzIFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQzYlx1MDQzZVx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiA9DQotbWVudV9oZWxwX3NvZnR3YXJlX3VwZGF0ZXNfbWFuYWdlX3NvZnR3YXJlX2NvbmZpZ190ZXh0PSZcdTA0MjNcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM1XHUwNDM5IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQ0Yi4uLg0KLQ0KLXdvcmtzcGFjZUNhbm5vdExvY2tUaXRsZT1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzN1x1MDQzMFx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQ0YyB7MH0NCi13b3Jrc3BhY2VDYW5ub3RMb2NrTWVzc2FnZT1cdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzN1x1MDQzMFx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQ0YyB7MH0sIFx1MDQzZlx1MDQzZVx1MDQzYVx1MDQzMCBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDNlXHUwNDM5IFx1MDQ0ZFx1MDQzYVx1MDQzN1x1MDQzNVx1MDQzY1x1MDQzZlx1MDQzYlx1MDQ0Zlx1MDQ0MC4gIFx1MDQxZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzYVx1MDQzYlx1MDQ0ZVx1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQ0MVx1MDQ0YyBcdTA0M2RcdTA0MzAgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDMwXHUwNDRlXHUwNDQ5XHUwNDM4XHUwNDM5IFx1MDQ0ZFx1MDQzYVx1MDQzN1x1MDQzNVx1MDQzY1x1MDQzZlx1MDQzYlx1MDQ0Zlx1MDQ0MCBcdTA0MzhcdTA0M2JcdTA0MzggXHUwNDM3XHUwNDMwXHUwNDNhXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzNVx1MDQzM1x1MDQzZSBcdTA0MzggXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM3XHUwNDMwXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzOFx1MDQzYlx1MDQzZVx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNS4NCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9EaWFnbm9zaXM9XHUwNDIxXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzYVx1MDQzOCBcdTA0MzggXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotbWFpbkFjdGlvbkJhckFkdmlzb3JfSGVhbHRoQ2hlY2s9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQzZVx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQ0MVx1MDQzZVx1MDQzMVx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQ0YyBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzguLi4NCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9SZW1vdmVSZWZlcmVuY2U9XHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNiXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOCBcdTA0M2RcdTA0MzAgXHUwNDNkXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNjXHUwNDRiXHUwNDM1IFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQ0Yi4uLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwyYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDJhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNWViMDM4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucmNwLm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwyYS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGYxMTljOC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1zb3VyY2UubmwyYS5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMmEuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IGZyYWdtZW50LnhtbCxcDQotICAgICAgICAgICAgICAgbmwyYS5qYXIsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kYS5wcm9wZXJ0aWVzDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMmEvZnJhZ21lbnQueG1sIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMmEvZnJhZ21lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhM2E4MzQ5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDJhL2ZyYWdtZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08ZnJhZ21lbnQKLSAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmNwLm5sMmEiCi0gICBuYW1lPSJFUEYgQ29tcG9zZXIgV29ya2JlbmNoIChOTDJhKSIKLSAgIHZlcnNpb249IjEuMi4wIgotICAgcHJvdmlkZXItbmFtZT0iSUJNIgotICAgcGx1Z2luLWlkPSJvcmcuZWNsaXBzZS5lcGYucmNwIgotICAgcGx1Z2luLXZlcnNpb249IjEuMi4wIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJubDJhLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotPC9mcmFnbWVudD4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4NzhiZmQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBDb21wb3NlciBSQ1ANCi1wcm9kdWN0TmFtZT1FUEYgQ29tcG9zZXINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIENhdGVnb3J5DQotbWV0aG9kQ2F0ZWdvcnlOYW1lPU1ldG9kZQ0KLQ0KLSMgVmlld3MNCi13ZWxjb21lVmlld05hbWU9VmVsa29tbWVuDQotDQotIyBBY3Rpb25zDQotZ2xvYmFsQWN0aW9uU2V0PUdsb2JhbHQgZnVua3Rpb25zc1x1MDBlNnQNCi1uZXdBY3Rpb249Jk55DQotbmV3QWN0aW9uVG9vbHRpcD1OeQ0KLW9wZW5BY3Rpb249Jlx1MDBjNWJuLi4uDQotb3BlbkFjdGlvblRvb2x0aXA9XHUwMGM1Ym4NCi1zZWFyY2hBY3Rpb249JlNcdTAwZjhnLi4uDQotc2VhcmNoQWN0aW9uVG9vbHRpcD1TXHUwMGY4Zw0KLXdlbGNvbWVBY3Rpb249JlZlbGtvbW1lbg0KLXdlbGNvbWVBY3Rpb25Ub29sVGlwPVZlbGtvbW1lbg0KLQ0KLSMgVG9vbHRpcHMNCi1zaG9ydGN1dC5vdmVydmlldy50b29sdGlwPVZlbmQgdGlsYmFnZSB0aWwgc2lkZW4gT3ZlcnNpZ3QNCi1zaG9ydGN1dC50dXRvcmlhbHMudG9vbHRpcD1WZW5kIHRpbGJhZ2UgdGlsIHNpZGVuIFx1MDBkOHZlcHJvZ3JhbQ0KLXNob3J0Y3V0LmZpcnN0c3RlcHMudG9vbHRpcD1WZW5kIHRpbGJhZ2UgdGlsIHNpZGVuIERlIGZcdTAwZjhyc3RlIHRyaW4NCi1zaG9ydGN1dC53ZWJyZXNvdXJjZXMudG9vbHRpcD1WZW5kIHRpbGJhZ2UgdGlsIHNpZGVuIFdlYnJlc3NvdXJjZXIgICAgICAgDQotDQotI0FjdGlvbiBTZXQNCi1hY3Rpb25TZXQuZGVzY3JpcHRpb24gPSBIalx1MDBlNmxwIC0gdlx1MDBlNnJrdFx1MDBmOGpzbGluamVmdW5rdGlvbmVyDQotYWN0aW9uU2V0LmxhYmVsID0gSGpcdTAwZTZscA0KLXNlYXJjaEFjdGlvbi5sYWJlbCA9IFNcdTAwZjhnbmluZyAtIGhqXHUwMGU2bHANCi1zZWFyY2hBY3Rpb24udG9vbHRpcCA9IFNcdTAwZjhnbmluZyAtIGhqXHUwMGU2bHANCi1keW5hbWljSGVscEFjdGlvbi5sYWJlbCA9IER5bmFtaXNrIGhqXHUwMGU2bHAgDQotZHluYW1pY0hlbHBBY3Rpb24udG9vbHRpcCA9IER5bmFtaXNrIGhqXHUwMGU2bHANCi0NCi0jQWN0aXZpdGllcy9DYXBhYmlsaXRpZXMNCi1hY3Rpdml0eS5nZW5lcmFsPUltcG9ydFx1MDBlOXIgb2cgZWtzcG9ydFx1MDBlOXIgcHJvamVrdGVyIG9nIHJlc3NvdXJjZXINCi1hY3Rpdml0eS5nZW5lcmFsLmRlc2M9QnJ1ZyBzdGFuZGFyZGZ1bmt0aW9uZXJuZSBpIEVjbGlwc2UgdGlsIGltcG9ydFx1MDBlOXIvZWtzcG9ydFx1MDBlOXIgcHJvamVrdC9yZXNzb3VyY2VyLg0KLWFjdGl2aXR5LnRlYW0uY3ZzPUNWUy11bmRlcnN0XHUwMGY4dHRlbHNlDQotYWN0aXZpdHkudGVhbS5jdnMuZGVzYz1CcnVnIENWUyAoQ29uY3VycmVudCBWZXJzaW9ucyBTeXN0ZW0pIHRpbCBhdCBhZG1pbmlzdHJlcmUgcmVzc291cmNlci4NCi1hY3Rpdml0eS50ZWFtPVVuZGVyc3RcdTAwZjh0dGVsc2UgYWYga2VybmV0ZWFtDQotYWN0aXZpdHkudGVhbS5kZXNjPURlbCBwcm9qZWt0ZXIgdmhhLiBrb25maWd1cmF0aW9uc3N0eXJpbmdzc3lzdGVtZXINCi0NCi1hY3Rpdml0eS5jYXQuZ2VuZXJhbD1HZW5lcmVsdA0KLWFjdGl2aXR5LmNhdC5nZW5lcmFsLmRlc2M9QnJ1ZyBzdGFuZGFyZGZ1bmt0aW9uZXJuZSBpIEVjbGlwc2UuDQotYWN0aXZpdHkuY2F0LnRlYW09VGVhbQ0KLWFjdGl2aXR5LmNhdC50ZWFtLmRlc2M9QnJ1ZyBrb25maWd1cmF0aW9uc3N0eXJpbmdzc3lzdGVtZXIgdGlsIGF0IGFkbWluaXN0cmVyZSByZXNzb3VyY2VyLg0KLQ0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMgPSBNdWxpZ2hlZGVyDQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eU5hbWUgPSAmTXVsaWdoZWRlcg0KLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuY2F0ZWdvcnlOYW1lID0gJk11bGlnaGVkZXINCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5UHJvbXB0QnV0dG9uID0gViZpcyBtZWRkZWxlbHNlIHZlZCBha3RpdmVyaW5nIGFmIG11bGlnaGVkZXINCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5UHJvbXB0QnV0dG9uVG9vbHRpcCA9IFZpcyBtZWRkZWxlbHNlLCBuXHUwMGU1ciBlbiBmdW5rdGlvbiwgZGVyIGtyXHUwMGU2dmVyIGFrdGl2ZXJpbmcgYWYgbXVsaWdoZWRlciwgYW52ZW5kZXMgZlx1MDBmOHJzdGUgZ2FuZy4NCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmNhcHRpb25NZXNzYWdlID0gTWVkIE11bGlnaGVkZXIga2FuIGR1IGFrdGl2ZXJlIGVsbGVyIGRlYWt0aXZlcmUgZm9yc2tlbGxpZ2UgcHJvZHVrdGtvbXBvbmVudGVyLiBEaXNzZSBtdWxpZ2hlZGVyIGVyIGdydXBwZXJldCBpIGhlbmhvbGQgdGlsIGV0IHNcdTAwZTZ0IGZvcnVkZGVmaW5lcmVkZSBrYXRlZ29yaWVyLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1M2Q3MGQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEZpbGUgTWVudQ0KLWZpbGVNZW51SXRlbV90ZXh0PSZGaWwNCi1maWxlTmV3TWVudUl0ZW1fdGV4dD0mTnkNCi1maWxlT3Blbk1lbnVJdGVtX3RleHQ9Jlx1MDBjNWJuDQotDQotIyBFZGl0IE1lbnUNCi1lZGl0TWVudUl0ZW1fdGV4dD0mUmVkaWdcdTAwZTlyDQotDQotIyBOYXZpZ2F0ZSBNZW51DQotbmF2aWdhdGVNZW51SXRlbV90ZXh0PSZOYXZpZ1x1MDBlOXINCi0NCi0jIFNlYXJjaCBNZW51DQotc2VhcmNoTWVudUl0ZW1fdGV4dD0mU1x1MDBmOGcNCi0NCi0jIENvbmZpZ3VyYXRpb24gTWVudQ0KLWNvbmZpZ3VyYXRpb25NZW51SXRlbV90ZXh0PSZLb25maWd1cmF0aW9uDQotDQotIyBXaW5kb3cgTWVudQ0KLXdpbmRvd01lbnVJdGVtX3RleHQ9VmluZCZ1ZQ0KLXdpbmRvd09wZW5QZXJzcGVjdGl2ZU1lbnVJdGVtX3RleHQ9Jlx1MDBjNWJuIHBlcnNwZWt0aXYNCi13aW5kb3dTaG93Vmlld01lbnVJdGVtX3RleHQ9VmlzIG92ZXJzaWd0DQotDQotIyBIZWxwIE1lbnUNCi1oZWxwTWVudUl0ZW1fdGV4dD0mSGpcdTAwZTZscA0KLQ0KLSMgTmV3IERyb3AgRG93biBNZW51DQotbmV3RHJvcERvd25fdG9vbHRpcF90ZXh0PU55DQotb3RoZXJNZW51SXRlbV90ZXh0PUFuZGV0Li4uDQotDQotIyBPcGVuIFBlcnNwZWN0aXZlIEFjdGlvbnMNCi1vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dD1SZWRpZ2VyaW5nDQotb3BlbkJyb3dzaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dD1HZW5uZW1zZQ0KLQ0KLSMgTWlzYyBBY3Rpb25zDQotZWRpdEFjdGlvbl90ZXh0PVJlZGlnXHUwMGU5cg0KLXVwZ3JhZGVMaWJyYXJ5QWN0aW9uX3RleHQ9T3BncmFkXHUwMGU5ciBtZXRvZGViaWJsaW90ZWsgZnJhIEkxIHRpbCBJMi4uLg0KLQ0KLXN0YXJ0dXBfZGlyX2xvZ19pbmZvX3RleHQ9SU5GTzogUHJvZ3JhbXN0YXJ0YmlibGlvdGVrID0NCi1tZW51X2hlbHBfc29mdHdhcmVfdXBkYXRlc19tYW5hZ2Vfc29mdHdhcmVfY29uZmlnX3RleHQ9JkFkbWluaXN0clx1MDBlOXIgc29mdHdhcmVrb25maWd1cmF0aW9uLi4uDQotDQotd29ya3NwYWNlQ2Fubm90TG9ja1RpdGxlPUthbiBpa2tlIHN0YXJ0ZSB7MH0NCi13b3Jrc3BhY2VDYW5ub3RMb2NrTWVzc2FnZT17MH0ga2FuIGlra2Ugc3RhcnRlLCBodmlzIGVuIGFuZGVuIGZvcmVrb21zdCBlciBpIGdhbmcuIFNraWZ0IHRpbCBkZW4gaWdhbmd2XHUwMGU2cmVuZGUgZm9yZWtvbXN0LCBlbGxlciBsdWsgZGVuLCBvZyBnZW5zdGFydCBwcm9ncmFtbWV0Lg0KLW1haW5BY3Rpb25CYXJBZHZpc29yX0RpYWdub3Npcz1EaWFnbm9zZS0gb2cgcmVwYXJhdGlvbnN2XHUwMGU2cmt0XHUwMGY4amVyDQotbWFpbkFjdGlvbkJhckFkdmlzb3JfSGVhbHRoQ2hlY2s9VWRmXHUwMGY4ciBoZWxicmVkc3VuZGVyc1x1MDBmOGdlbHNlIGFmIGJpYmxpb3Rlay4uLg0KLW1haW5BY3Rpb25CYXJBZHZpc29yX1JlbW92ZVJlZmVyZW5jZT1GamVybiByZWZlcmVuY2VyIHRpbCB1Z3lsZGlnZSBvYmpla3Rlci4uLg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU4MTFkOTYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiODBhYjgwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwxLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogZnJhZ21lbnQKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkYTJjOTEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1zb3VyY2UubmwxLmphciA9IHNyYy8NCi1vdXRwdXQubmwxLmphciA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBubDEuamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZXMucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2ZyLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9qYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9DTi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RlLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9pdC5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIGZyYWdtZW50LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvZnJhZ21lbnQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZTJkNmE2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9mcmFnbWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mcmFnbWVudE5hbWU9RVBGIFJpY2ggVGV4dCAoTkxTKQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5fZGUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5fZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTAwOGRkYi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIFJpY2ggVGV4dA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIFRoZSBIVE1MIGZpbGUgdXNlZCB0byByZW5kZXIgdGhlIFJpY2ggVGV4dCBFZGl0b3IuDQotUmljaFRleHQuZWRpdG9ySFRNTD1ydGUuaHRtDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYzU3ODcyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9VGV4dG8gZW5yaXF1ZWNpZG8gZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgVGhlIEhUTUwgZmlsZSB1c2VkIHRvIHJlbmRlciB0aGUgUmljaCBUZXh0IEVkaXRvci4NCi1SaWNoVGV4dC5lZGl0b3JIVE1MPXJ0ZS5odG0NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE5MDBlNGIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1UZXh0ZSBlbnJpY2hpIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIFRoZSBIVE1MIGZpbGUgdXNlZCB0byByZW5kZXIgdGhlIFJpY2ggVGV4dCBFZGl0b3IuDQotUmljaFRleHQuZWRpdG9ySFRNTD1ydGUuaHRtDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1M2QwMGQ2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5faXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9UmljaCBUZXh0IEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIFRoZSBIVE1MIGZpbGUgdXNlZCB0byByZW5kZXIgdGhlIFJpY2ggVGV4dCBFZGl0b3IuDQotUmljaFRleHQuZWRpdG9ySFRNTD1ydGUuaHRtDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTM4MTU0Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5famEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFJpY2ggVGV4dA0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIFRoZSBIVE1MIGZpbGUgdXNlZCB0byByZW5kZXIgdGhlIFJpY2ggVGV4dCBFZGl0b3IuDQotUmljaFRleHQuZWRpdG9ySFRNTD1ydGUuaHRtDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZjEzZjBmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFx1YzExY1x1YzJkZFx1Yzc4OFx1YjI5NCBcdWQxNGRcdWMyYTRcdWQyYjgNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBUaGUgSFRNTCBmaWxlIHVzZWQgdG8gcmVuZGVyIHRoZSBSaWNoIFRleHQgRWRpdG9yLg0KLVJpY2hUZXh0LmVkaXRvckhUTUw9cnRlLmh0bQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzA4ODJlMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVJpY2ggVGV4dCBkbyBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBUaGUgSFRNTCBmaWxlIHVzZWQgdG8gcmVuZGVyIHRoZSBSaWNoIFRleHQgRWRpdG9yLg0KLVJpY2hUZXh0LmVkaXRvckhUTUw9cnRlLmh0bQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWFhODc4YS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdTViY2NcdTY1ODdcdTY3MmNcdTY4M2NcdTVmMGYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBUaGUgSFRNTCBmaWxlIHVzZWQgdG8gcmVuZGVyIHRoZSBSaWNoIFRleHQgRWRpdG9yLg0KLVJpY2hUZXh0LmVkaXRvckhUTUw9cnRlLmh0bQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGEzODE1NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBSaWNoIFRleHQNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBUaGUgSFRNTCBmaWxlIHVzZWQgdG8gcmVuZGVyIHRoZSBSaWNoIFRleHQgRWRpdG9yLg0KLVJpY2hUZXh0LmVkaXRvckhUTUw9cnRlLmh0bQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1ZjVhZmUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGb250IFN0eWxlIE5hbWVzDQotZm9udFN0eWxlX25vcm1hbD1Ob3JtYWwNCi1mb250U3R5bGVfc2VjdGlvbkhlYWRpbmc9QWJzY2huaXR0c1x1MDBmY2JlcnNjaHJpZnQgZGVyIEViZW5lIDENCi1mb250U3R5bGVfc3Vic2VjdGlvbkhlYWRpbmc9QWJzY2huaXR0c1x1MDBmY2JlcnNjaHJpZnQgZGVyIEViZW5lIDINCi1mb250U3R5bGVfc3ViU3Vic2VjdGlvbkhlYWRpbmc9QWJzY2huaXR0c1x1MDBmY2JlcnNjaHJpZnQgZGVyIEViZW5lIDMNCi1mb250U3R5bGVfcXVvdGU9Wml0YXQNCi1mb250U3R5bGVfY29kZVNhbXBsZT1Db2RlYmVpc3BpZWwNCi0NCi0jIEhUTUwgQmxvY2sgVGFncw0KLWJsb2NrVGFnX3BhcmFncmFwaD1BYnNhdHoNCi1ibG9ja1RhZ19oZWFkaW5nMT1cdTAwZGNiZXJzY2hyaWZ0IDENCi1ibG9ja1RhZ19oZWFkaW5nMj1cdTAwZGNiZXJzY2hyaWZ0IDINCi1ibG9ja1RhZ19oZWFkaW5nMz1cdTAwZGNiZXJzY2hyaWZ0IDMNCi1ibG9ja1RhZ19oZWFkaW5nND1cdTAwZGNiZXJzY2hyaWZ0IDQNCi1ibG9ja1RhZ19oZWFkaW5nNT1cdTAwZGNiZXJzY2hyaWZ0IDUNCi1ibG9ja1RhZ19oZWFkaW5nNj1cdTAwZGNiZXJzY2hyaWZ0IDYNCi1ibG9ja1RhZ19hZGRyZXNzPUFkcmVzc2UNCi1ibG9ja1RhZ19wcmVmb3JtYXR0ZWRUZXh0PVZvcmZvcm1hdGllcnRlciBUZXh0DQotDQotIyBIVE1MIEZvbnQgTmFtZXMNCi1mb250TmFtZV9kZWZhdWx0PVN0YW5kYXJkDQotZm9udE5hbWVfYXJpYWw9QXJpYWwNCi1mb250TmFtZV9jb3VyaWVyTmV3PUNvdXJpZXIgTmV3DQotZm9udE5hbWVfdGltZXNOZXdSb21hbj1UaW1lcyBOZXcgUm9tYW4NCi1mb250TmFtZV92ZXJkYW5hPVZlcmRhbmENCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgVG9vbCBCdXR0b25zDQotYWRkSG9yaXpvbnRhbEJhckFjdGlvbl90b29sVGlwVGV4dD1Ib3Jpem9udGFsZW4gQmFsa2VuIGhpbnp1Zlx1MDBmY2dlbg0KLWFkZEltYWdlQWN0aW9uX3Rvb2xUaXBUZXh0PUdyYWZpayBoaW56dWZcdTAwZmNnZW4NCi1hZGRMaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PVplaWxlIGhpbnp1Zlx1MDBmY2dlbg0KLWFkZExpbmtBY3Rpb25fdG9vbFRpcFRleHQ9TGluayBoaW56dWZcdTAwZmNnZW4NCi1hZGRPcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dD1HZW9yZG5ldGUgTGlzdGUgaGluenVmXHUwMGZjZ2VuDQotYWRkVGFibGVBY3Rpb25fdG9vbFRpcFRleHQ9VGFiZWxsZSBoaW56dWZcdTAwZmNnZW4NCi1hZGRVbm9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PVVuZ2VvcmRuZXRlIExpc3RlIGhpbnp1Zlx1MDBmY2dlbg0KLWJvbGRBY3Rpb25fdG9vbFRpcFRleHQ9RmV0dA0KLWNsZWFyQ29udGVudEFjdGlvbl90b29sVGlwVGV4dD1JbmhhbHQgbFx1MDBmNnNjaGVuDQotY29weUFjdGlvbl90b29sVGlwVGV4dD1Lb3BpZXJlbg0KLWN1dEFjdGlvbl90b29sVGlwVGV4dD1BdXNzY2huZWlkZW4NCi1maW5kUmVwbGFjZUFjdGlvbl90b29sVGlwVGV4dD1TdWNoZW4vRXJzZXR6ZW4NCi1pbmRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9RWluclx1MDBmY2NrZW4NCi1pdGFsaWNBY3Rpb25fdG9vbFRpcFRleHQ9S3Vyc2l2DQotanVzdGlmeUNlbnRlckFjdGlvbl90b29sVGlwVGV4dD1aZW50cmllcnQNCi1qdXN0aWZ5RnVsbEFjdGlvbl90b29sVGlwVGV4dD1CbG9jaw0KLWp1c3RpZnlMZWZ0QWN0aW9uX3Rvb2xUaXBUZXh0PUxpbmtzYlx1MDBmY25kaWcNCi1qdXN0aWZ5UmlnaHRBY3Rpb25fdG9vbFRpcFRleHQ9UmVjaHRzYlx1MDBmY25kaWcNCi1vdXRkZW50QWN0aW9uX3Rvb2xUaXBUZXh0PUF1c3JcdTAwZmNja2VuDQotcGFzdGVBY3Rpb25fdG9vbFRpcFRleHQ9RWluZlx1MDBmY2dlbg0KLXN1YnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dD1UaWVmc3RlbGxlbg0KLXN1cGVyc2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0PUhvY2hzdGVsbGVuDQotdW5kZXJsaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PVVudGVyc3RyZWljaGVuDQotDQotIyBSaWNoIFRleHQgRWRpdG9yIENvbWJvYm94ZXMNCi1mb250U3R5bGVBY3Rpb25fdG9vbFRpcFRleHQ9U2NocmlmdHN0aWwgZmVzdGxlZ2VuDQotYmxvY2tUYWdBY3Rpb25fdG9vbFRpcFRleHQ9QWxzIEJsb2NrIG1hcmtpZXJlbg0KLWZvbnROYW1lQWN0aW9uX3Rvb2xUaXBUZXh0PVNjaHJpZnRuYW1lbiBmZXN0bGVnZW4NCi1mb250U2l6ZUFjdGlvbl90b29sVGlwVGV4dD1TY2hyaWZ0Z3JcdTAwZjZcdTAwZGZlIGZlc3RsZWdlbg0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBDb250ZXh0IE1lbnUgSXRlbXMNCi1jdXRBY3Rpb25fdGV4dD1BdXNzY2huZWlkZW4NCi1jb3B5QWN0aW9uX3RleHQ9S29waWVyZW4NCi1wYXN0ZUFjdGlvbl90ZXh0PUVpbmZcdTAwZmNnZW4NCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgVGFicw0KLXJpY2hUZXh0VGFiX3RleHQ9UmljaCBUZXh0DQotcmljaFRleHRUYWJfdG9vbFRpcFRleHQ9SW5oYWx0IGluIFJpY2ggVGV4dCBiZWFyYmVpdGVuDQotaHRtbFRhYl90ZXh0PUhUTUwNCi1odG1sVGFiX3Rvb2xUaXBUZXh0PUluaGFsdCBpbiBIVE1MIGJlYXJiZWl0ZW4NCi0NCi0jIEFkZCBEaWFsb2dzDQotYWRkSW1hZ2VEaWFsb2dfdGl0bGU9R3JhZmlrIGhpbnp1Zlx1MDBmY2dlbg0KLWFkZExpbmtEaWFsb2dfdGl0bGU9TGluayBoaW56dWZcdTAwZmNnZW4NCi1hZGRUYWJsZURpYWxvZ190aXRsZT1UYWJlbGxlIGhpbnp1Zlx1MDBmY2dlbg0KLWZpbmRSZXBsYWNlRGlhbG9nX3RpdGxlPVN1Y2hlbi9FcnNldHplbg0KLXVybExhYmVsX3RleHQ9VVJMOg0KLXN1bW1hcnlMYWJlbF90ZXh0PVp1c2FtbWVuZmFzc3VuZzoNCi1jYXB0aW9uTGFiZWxfdGV4dD1UaXRlbDoNCi1yb3dzTGFiZWxfdGV4dD1aZWlsZW46DQotY29sdW1uc0xhYmVsX3RleHQ9U3BhbHRlbjoNCi13aWR0aExhYmVsX3RleHQ9QnJlaXRlOg0KLXRhYmxlU3R5bGVMYWJlbF90ZXh0PVN0aWw6DQotdGFibGVIZWFkZXJOb25lX3RleHQ9VGFiZWxsZSBvaG5lIFx1MDBkY2JlcnNjaHJpZnRlbg0KLXRhYmxlSGVhZGVyQ29sc190ZXh0PVRhYmVsbGUgbWl0IFNwYWx0ZW5cdTAwZmNiZXJzY2hyaWZ0ZW4NCi10YWJsZUhlYWRlclJvd3NfdGV4dD1UYWJlbGxlIG1pdCBaZWlsZW5cdTAwZmNiZXJzY2hyaWZ0ZW4NCi10YWJsZUhlYWRlckJvdGhfdGV4dD1UYWJlbGxlIG1pdCBTcGFsdGVuLSB1bmQgWmVpbGVuXHUwMGZjYmVyc2NocmlmdGVuDQotYnJvd3NlQnV0dG9uX3RleHQ9RHVyY2hzdWNoZW4uLi4NCi0NCi0jIENsZWFyIEVkaXRvciBDb250ZW50IERpYWxvZw0KLWNsZWFyQ29udGVudERpYWxvZ190aXRsZT1MXHUwMGY2c2NoZW4gZGVzIEluaGFsdHMgaW0gRWRpdG9yIGJlc3RcdTAwZTR0aWdlbg0KLWNsZWFyQ29udGVudERpYWxvZ190ZXh0PU1cdTAwZjZjaHRlbiBTaWUgZGVuIEluaGFsdCBpbiBkaWVzZW0gUmljaCBUZXh0IEVkaXRvciB3aXJrbGljaCBsXHUwMGY2c2NoZW4/DQotDQotIyBGaW5kL1JlcGxhY2UgRGlhbG9nDQotZmluZExhYmVsX3RleHQ9U3VjaGVuOg0KLXJlcGxhY2VMYWJlbF90ZXh0PUVyc2V0emVuIGR1cmNoOg0KLW9wdGlvbnNHcm91cF90ZXh0PU9wdGlvbmVuDQotY2FzZVNlbnNpdGl2ZUNoZWNrYm94X3RleHQ9R3JvXHUwMGRmLS9LbGVpbnNjaHJlaWJ1bmcgYmVhY2h0ZW4NCi13aG9sZVdvcmRDaGVja2JveF90ZXh0PUdhbnplcyBXb3J0DQotZGlyZWN0aW9uR3JvdXBfdGV4dD1SaWNodHVuZw0KLWZvcndhcmRSYWRpb0J1dHRvbl90ZXh0PVZvcg0KLWJhY2t3YXJkUmFkaW9CdXR0b25fdGV4dD1adXJcdTAwZmNjaw0KLWZpbmRCdXR0b25fdGV4dD1TdWNoZW4NCi1yZXBsYWNlQnV0dG9uX3RleHQ9RXJzZXR6ZW4NCi1yZXBsYWNlRmluZEJ1dHRvbl90ZXh0PUVyc2V0emVuL1N1Y2hlbg0KLXJlcGxhY2VhbGxCdXR0b25fdGV4dD1BbGxlIGVyc2V0emVuDQotIyB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yDQotRmluZFJlcGxhY2VfU3RhdHVzX25vTWF0Y2hfbGFiZWw9WmVpY2hlbmZvbGdlIG5pY2h0IGdlZnVuZGVuDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1tYXhDaGFyc1BlckxpbmVMYWJlbF90ZXh0PU1heGltYWxlIEFuemFobCBaZWljaGVuIHBybyBaZWlsZToNCi1pbmRlbnRIVE1MQ2hlY2tib3hfdGV4dD1IVE1MLVRhZ3MgZWluclx1MDBmY2NrZW4NCi1pbmRlbnRTaXplTGFiZWxfdGV4dD1FaW5yXHUwMGZjY2t1bmdzZ3JcdTAwZjZcdTAwZGZlOg0KLXVybERpc3BsYXlOYW1lTGFiZWxfdGV4dD1VUkwtQW56ZWlnZW5hbWU6DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWRiYjc3MC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEZvbnQgU3R5bGUgTmFtZXMNCi1mb250U3R5bGVfbm9ybWFsPU5vcm1hbA0KLWZvbnRTdHlsZV9zZWN0aW9uSGVhZGluZz1DYWJlY2VyYSBkZSBsYSBzZWNjaVx1MDBmM24NCi1mb250U3R5bGVfc3Vic2VjdGlvbkhlYWRpbmc9Q2FiZWNlcmEgZGUgbGEgc3Vic2VjY2lcdTAwZjNuDQotZm9udFN0eWxlX3N1YlN1YnNlY3Rpb25IZWFkaW5nPUNhYmVjZXJhIGRlIGxhIHN1Yi1zdWJzZWNjaVx1MDBmM24NCi1mb250U3R5bGVfcXVvdGU9Q29taWxsYQ0KLWZvbnRTdHlsZV9jb2RlU2FtcGxlPUVqZW1wbG8gZGUgY1x1MDBmM2RpZ28NCi0NCi0jIEhUTUwgQmxvY2sgVGFncw0KLWJsb2NrVGFnX3BhcmFncmFwaD1QXHUwMGUxcnJhZm8NCi1ibG9ja1RhZ19oZWFkaW5nMT1DYWJlY2VyYSAxDQotYmxvY2tUYWdfaGVhZGluZzI9Q2FiZWNlcmEgMg0KLWJsb2NrVGFnX2hlYWRpbmczPUNhYmVjZXJhIDMNCi1ibG9ja1RhZ19oZWFkaW5nND1DYWJlY2VyYSA0DQotYmxvY2tUYWdfaGVhZGluZzU9Q2FiZWNlcmEgNQ0KLWJsb2NrVGFnX2hlYWRpbmc2PUNhYmVjZXJhIDYNCi1ibG9ja1RhZ19hZGRyZXNzPURpcmVjY2lcdTAwZjNuDQotYmxvY2tUYWdfcHJlZm9ybWF0dGVkVGV4dD1UZXh0byBwcmVmb3JtYXRlYWRvDQotDQotIyBIVE1MIEZvbnQgTmFtZXMNCi1mb250TmFtZV9kZWZhdWx0PVBvciBvbWlzaVx1MDBmM24NCi1mb250TmFtZV9hcmlhbD1BcmlhbA0KLWZvbnROYW1lX2NvdXJpZXJOZXc9Q291cmllciBOZXcNCi1mb250TmFtZV90aW1lc05ld1JvbWFuPVRpbWVzIE5ldyBSb21hbg0KLWZvbnROYW1lX3ZlcmRhbmE9VmVyZGFuYQ0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBUb29sIEJ1dHRvbnMNCi1hZGRIb3Jpem9udGFsQmFyQWN0aW9uX3Rvb2xUaXBUZXh0PUFcdTAwZjFhZGlyIGJhcnJhIGhvcml6b250YWwNCi1hZGRJbWFnZUFjdGlvbl90b29sVGlwVGV4dD1BXHUwMGYxYWRpciBpbWFnZW4NCi1hZGRMaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PUFcdTAwZjFhZGlyIGxcdTAwZWRuZWENCi1hZGRMaW5rQWN0aW9uX3Rvb2xUaXBUZXh0PUFcdTAwZjFhZGlyIGVubGFjZQ0KLWFkZE9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PUFcdTAwZjFhZGlyIGxpc3RhIG9yZGVuYWRhDQotYWRkVGFibGVBY3Rpb25fdG9vbFRpcFRleHQ9QVx1MDBmMWFkaXIgdGFibGENCi1hZGRVbm9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PUFcdTAwZjFhZGlyIGxpc3RhIGRlc29yZGVuYWRhDQotYm9sZEFjdGlvbl90b29sVGlwVGV4dD1OZWdyaXRhDQotY2xlYXJDb250ZW50QWN0aW9uX3Rvb2xUaXBUZXh0PUJvcnJhciBjb250ZW5pZG8NCi1jb3B5QWN0aW9uX3Rvb2xUaXBUZXh0PUNvcGlhcg0KLWN1dEFjdGlvbl90b29sVGlwVGV4dD1Db3J0YXINCi1maW5kUmVwbGFjZUFjdGlvbl90b29sVGlwVGV4dD1CdXNjYXIvUmVlbXBsYXphcg0KLWluZGVudEFjdGlvbl90b29sVGlwVGV4dD1TYW5ncmFyDQotaXRhbGljQWN0aW9uX3Rvb2xUaXBUZXh0PUN1cnNpdmENCi1qdXN0aWZ5Q2VudGVyQWN0aW9uX3Rvb2xUaXBUZXh0PUNlbnRyYXINCi1qdXN0aWZ5RnVsbEFjdGlvbl90b29sVGlwVGV4dD1KdXN0aWZpY2FyDQotanVzdGlmeUxlZnRBY3Rpb25fdG9vbFRpcFRleHQ9QWxpbmVhciBhIGxhIGl6cXVpZXJkYQ0KLWp1c3RpZnlSaWdodEFjdGlvbl90b29sVGlwVGV4dD1BbGluZWFyIGEgbGEgZGVyZWNoYQ0KLW91dGRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9RWxpbWluYXIgc2FuZ3JcdTAwZWRhDQotcGFzdGVBY3Rpb25fdG9vbFRpcFRleHQ9UGVnYXINCi1zdWJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQ9U3ViXHUwMGVkbmRpY2UNCi1zdXBlcnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dD1TdXBlclx1MDBlZG5kaWNlDQotdW5kZXJsaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PVN1YnJheWFkbw0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBDb21ib2JveGVzDQotZm9udFN0eWxlQWN0aW9uX3Rvb2xUaXBUZXh0PUVzdGFibGVjZXIgZXN0aWxvIGRlIGZvbnQNCi1ibG9ja1RhZ0FjdGlvbl90b29sVGlwVGV4dD1Fc3RhYmxlY2VyIGV0aXF1ZXRhIGRlIGJsb3F1ZQ0KLWZvbnROYW1lQWN0aW9uX3Rvb2xUaXBUZXh0PUVzdGFibGVjZXIgbm9tYnJlIGRlIGZvbnQNCi1mb250U2l6ZUFjdGlvbl90b29sVGlwVGV4dD1Fc3RhYmxlY2VyIHRhbWFcdTAwZjFvIGRlIGZvbnQNCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgQ29udGV4dCBNZW51IEl0ZW1zDQotY3V0QWN0aW9uX3RleHQ9Q29ydGFyDQotY29weUFjdGlvbl90ZXh0PUNvcGlhcg0KLXBhc3RlQWN0aW9uX3RleHQ9UGVnYXINCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgVGFicw0KLXJpY2hUZXh0VGFiX3RleHQ9VGV4dG8gZW5yaXF1ZWNpZG8NCi1yaWNoVGV4dFRhYl90b29sVGlwVGV4dD1FZGl0YXIgZWwgY29udGVuaWRvIGVuIHRleHRvIGVucmlxdWVjaWRvDQotaHRtbFRhYl90ZXh0PUhUTUwNCi1odG1sVGFiX3Rvb2xUaXBUZXh0PUVkaXRhciBlbCBjb250ZW5pZG8gZW4gSFRNTA0KLQ0KLSMgQWRkIERpYWxvZ3MNCi1hZGRJbWFnZURpYWxvZ190aXRsZT1BXHUwMGYxYWRpciBpbWFnZW4NCi1hZGRMaW5rRGlhbG9nX3RpdGxlPUFcdTAwZjFhZGlyIGVubGFjZQ0KLWFkZFRhYmxlRGlhbG9nX3RpdGxlPUFcdTAwZjFhZGlyIHRhYmxhDQotZmluZFJlcGxhY2VEaWFsb2dfdGl0bGU9QnVzY2FyL1JlZW1wbGF6YXINCi11cmxMYWJlbF90ZXh0PVVSTDoNCi1zdW1tYXJ5TGFiZWxfdGV4dD1SZXN1bWVuOg0KLWNhcHRpb25MYWJlbF90ZXh0PVRcdTAwZWR0dWxvOg0KLXJvd3NMYWJlbF90ZXh0PUZpbGFzOg0KLWNvbHVtbnNMYWJlbF90ZXh0PUNvbHVtbmFzOg0KLXdpZHRoTGFiZWxfdGV4dD1BbmNobzoNCi10YWJsZVN0eWxlTGFiZWxfdGV4dD1Fc3RpbG86DQotdGFibGVIZWFkZXJOb25lX3RleHQ9VGFibGEgc2luIGNhYmVjZXJhcw0KLXRhYmxlSGVhZGVyQ29sc190ZXh0PVRhYmxhIGNvbiBjYWJlY2VyYXMgZGUgY29sdW1uYQ0KLXRhYmxlSGVhZGVyUm93c190ZXh0PVRhYmxhIGNvbiBjYWJlY2VyYSBkZSBmaWxhDQotdGFibGVIZWFkZXJCb3RoX3RleHQ9VGFibGEgY29uIGNhYmVjZXJhcyBkZSBjb2x1bW5hIHkgZGUgZmlsYQ0KLWJyb3dzZUJ1dHRvbl90ZXh0PUV4YW1pbmFyLi4uDQotDQotIyBDbGVhciBFZGl0b3IgQ29udGVudCBEaWFsb2cNCi1jbGVhckNvbnRlbnREaWFsb2dfdGl0bGU9Q29uZmlybWFjaVx1MDBmM24gZGUgQm9ycmFyIGNvbnRlbmlkbyBkZWwgZWRpdG9yDQotY2xlYXJDb250ZW50RGlhbG9nX3RleHQ9XHUwMGJmRXN0XHUwMGUxIHNlZ3VybyBkZSBxdWUgZGVzZWEgYm9ycmFyIGVsIGNvbnRlbmlkbyBkZSBlc3RlIGVkaXRvciBkZSB0ZXh0byBlbnJpcXVlY2lkbz8NCi0NCi0jIEZpbmQvUmVwbGFjZSBEaWFsb2cNCi1maW5kTGFiZWxfdGV4dD1CdXNjYXI6DQotcmVwbGFjZUxhYmVsX3RleHQ9UmVlbXBsYXphciBjb246DQotb3B0aW9uc0dyb3VwX3RleHQ9T3BjaW9uZXMNCi1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1TZW5zaWJsZSBhIG1heVx1MDBmYXNjdWxhcyB5IG1pblx1MDBmYXNjdWxhcw0KLXdob2xlV29yZENoZWNrYm94X3RleHQ9UGFsYWJyYSBjb21wbGV0YQ0KLWRpcmVjdGlvbkdyb3VwX3RleHQ9RGlyZWNjaVx1MDBmM24NCi1mb3J3YXJkUmFkaW9CdXR0b25fdGV4dD1IYWNpYSBkZWxhbnRlDQotYmFja3dhcmRSYWRpb0J1dHRvbl90ZXh0PUhhY2lhIGF0clx1MDBlMXMNCi1maW5kQnV0dG9uX3RleHQ9QnVzY2FyDQotcmVwbGFjZUJ1dHRvbl90ZXh0PVJlZW1wbGF6YXINCi1yZXBsYWNlRmluZEJ1dHRvbl90ZXh0PVJlZW1wbGF6YXIvQnVzY2FyDQotcmVwbGFjZWFsbEJ1dHRvbl90ZXh0PVJlZW1wbGF6YXIgdG9kb3MNCi0jIHRha2VuIGZyb20gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3INCi1GaW5kUmVwbGFjZV9TdGF0dXNfbm9NYXRjaF9sYWJlbD1TZXJpZSBubyBlbmNvbnRyYWRhDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1tYXhDaGFyc1BlckxpbmVMYWJlbF90ZXh0PU1cdTAwZTF4aW1vIGRlIGNhcmFjdGVyZXMgcG9yIGxcdTAwZWRuZWE6DQotaW5kZW50SFRNTENoZWNrYm94X3RleHQ9U2FuZ3JhciBldGlxdWV0YXMgSFRNTA0KLWluZGVudFNpemVMYWJlbF90ZXh0PVRhbWFcdTAwZjFvIGRlIHNhbmdyXHUwMGVkYToNCi11cmxEaXNwbGF5TmFtZUxhYmVsX3RleHQ9Tm9tYnJlIGRlIHZpc3VhbGl6YWNpXHUwMGYzbiBkZSBVUkw6DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWZiOTY1MS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEZvbnQgU3R5bGUgTmFtZXMNCi1mb250U3R5bGVfbm9ybWFsPU5vcm1hbA0KLWZvbnRTdHlsZV9zZWN0aW9uSGVhZGluZz1Fbi10XHUwMGVhdGUgZGUgc2VjdGlvbg0KLWZvbnRTdHlsZV9zdWJzZWN0aW9uSGVhZGluZz1Fbi10XHUwMGVhdGUgZGUgc291cy1zZWN0aW9uDQotZm9udFN0eWxlX3N1YlN1YnNlY3Rpb25IZWFkaW5nPUVuLXRcdTAwZWF0ZSBkZSBzb3VzLXNvdXMtc2VjdGlvbg0KLWZvbnRTdHlsZV9xdW90ZT1EXHUwMGU5Y2xhcmF0aW9uDQotZm9udFN0eWxlX2NvZGVTYW1wbGU9RWNoYW50aWxsb24gZGUgY29kZQ0KLQ0KLSMgSFRNTCBCbG9jayBUYWdzDQotYmxvY2tUYWdfcGFyYWdyYXBoPVBhcmFncmFwaGUNCi1ibG9ja1RhZ19oZWFkaW5nMT1Fbi10XHUwMGVhdGUgMQ0KLWJsb2NrVGFnX2hlYWRpbmcyPUVuLXRcdTAwZWF0ZSAyDQotYmxvY2tUYWdfaGVhZGluZzM9RW4tdFx1MDBlYXRlIDMNCi1ibG9ja1RhZ19oZWFkaW5nND1Fbi10XHUwMGVhdGUgNA0KLWJsb2NrVGFnX2hlYWRpbmc1PUVuLXRcdTAwZWF0ZSA1DQotYmxvY2tUYWdfaGVhZGluZzY9RW4tdFx1MDBlYXRlIDYNCi1ibG9ja1RhZ19hZGRyZXNzPUFkcmVzc2UNCi1ibG9ja1RhZ19wcmVmb3JtYXR0ZWRUZXh0PVRleHRlIHByXHUwMGU5Zm9ybWF0XHUwMGU5DQotDQotIyBIVE1MIEZvbnQgTmFtZXMNCi1mb250TmFtZV9kZWZhdWx0PVBhciBkXHUwMGU5ZmF1dA0KLWZvbnROYW1lX2FyaWFsPUFyaWFsDQotZm9udE5hbWVfY291cmllck5ldz1Db3VyaWVyIE5ldw0KLWZvbnROYW1lX3RpbWVzTmV3Um9tYW49VGltZXMgTmV3IFJvbWFuDQotZm9udE5hbWVfdmVyZGFuYT1WZXJkYW5hDQotDQotIyBSaWNoIFRleHQgRWRpdG9yIFRvb2wgQnV0dG9ucw0KLWFkZEhvcml6b250YWxCYXJBY3Rpb25fdG9vbFRpcFRleHQ9QWpvdXRlciB1bmUgYmFycmUgaG9yaXpvbnRhbGUNCi1hZGRJbWFnZUFjdGlvbl90b29sVGlwVGV4dD1Bam91dGVyIHVuZSBpbWFnZQ0KLWFkZExpbmVBY3Rpb25fdG9vbFRpcFRleHQ9QWpvdXRlciB1bmUgbGlnbmUNCi1hZGRMaW5rQWN0aW9uX3Rvb2xUaXBUZXh0PUFqb3V0ZXIgdW4gbGllbg0KLWFkZE9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PUFqb3V0ZXIgdW5lIGxpc3RlIG51bVx1MDBlOXJvdFx1MDBlOWUNCi1hZGRUYWJsZUFjdGlvbl90b29sVGlwVGV4dD1Bam91dGVyIHVuZSB0YWJsZQ0KLWFkZFVub3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQ9QWpvdXRlciB1bmUgbGlzdGUgbm9uIG51bVx1MDBlOXJvdFx1MDBlOWUNCi1ib2xkQWN0aW9uX3Rvb2xUaXBUZXh0PUdyYXMNCi1jbGVhckNvbnRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9RWZmYWNlciBsZSBjb250ZW51DQotY29weUFjdGlvbl90b29sVGlwVGV4dD1Db3BpZXINCi1jdXRBY3Rpb25fdG9vbFRpcFRleHQ9Q291cGVyDQotZmluZFJlcGxhY2VBY3Rpb25fdG9vbFRpcFRleHQ9UmVjaGVyY2hlci9SZW1wbGFjZXINCi1pbmRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9UmV0cmFpdCBkZSBsaWduZQ0KLWl0YWxpY0FjdGlvbl90b29sVGlwVGV4dD1JdGFsaXF1ZQ0KLWp1c3RpZnlDZW50ZXJBY3Rpb25fdG9vbFRpcFRleHQ9Q2VudHJlcg0KLWp1c3RpZnlGdWxsQWN0aW9uX3Rvb2xUaXBUZXh0PUp1c3RpZmllcg0KLWp1c3RpZnlMZWZ0QWN0aW9uX3Rvb2xUaXBUZXh0PUFsaWduZXIgXHUwMGUwIGdhdWNoZQ0KLWp1c3RpZnlSaWdodEFjdGlvbl90b29sVGlwVGV4dD1BbGlnbmVyIFx1MDBlMCBkcm9pdGUNCi1vdXRkZW50QWN0aW9uX3Rvb2xUaXBUZXh0PUluc1x1MDBlOXJlciB1biByZXRyYWl0DQotcGFzdGVBY3Rpb25fdG9vbFRpcFRleHQ9Q29sbGVyDQotc3Vic2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0PUluZGljZQ0KLXN1cGVyc2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0PUV4cG9zYW50DQotdW5kZXJsaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PVNvdWxpZ25lbWVudA0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBDb21ib2JveGVzDQotZm9udFN0eWxlQWN0aW9uX3Rvb2xUaXBUZXh0PURcdTAwZTlmaW5pciBsZSBzdHlsZSBkZSBwb2xpY2UNCi1ibG9ja1RhZ0FjdGlvbl90b29sVGlwVGV4dD1EXHUwMGU5ZmluaXIgbGEgYmFsaXNlIGRlIGJsb2MNCi1mb250TmFtZUFjdGlvbl90b29sVGlwVGV4dD1EXHUwMGU5ZmluaXIgbGUgbm9tIGRlIGxhIHBvbGljZQ0KLWZvbnRTaXplQWN0aW9uX3Rvb2xUaXBUZXh0PURcdTAwZTlmaW5pciBsYSB0YWlsbGUgZGUgbGEgcG9saWNlDQotDQotIyBSaWNoIFRleHQgRWRpdG9yIENvbnRleHQgTWVudSBJdGVtcw0KLWN1dEFjdGlvbl90ZXh0PUNvdXBlcg0KLWNvcHlBY3Rpb25fdGV4dD1Db3BpZXINCi1wYXN0ZUFjdGlvbl90ZXh0PUNvbGxlcg0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBUYWJzDQotcmljaFRleHRUYWJfdGV4dD1UZXh0ZSBlbnJpY2hpDQotcmljaFRleHRUYWJfdG9vbFRpcFRleHQ9TW9kaWZpZXIgbGUgY29udGVudSBlbiB0ZXh0ZSBlbnJpY2hpDQotaHRtbFRhYl90ZXh0PUhUTUwNCi1odG1sVGFiX3Rvb2xUaXBUZXh0PU1vZGlmaWVyIGxlIGNvbnRlbnUgZW4gSFRNTA0KLQ0KLSMgQWRkIERpYWxvZ3MNCi1hZGRJbWFnZURpYWxvZ190aXRsZT1Bam91dGVyIHVuZSBpbWFnZQ0KLWFkZExpbmtEaWFsb2dfdGl0bGU9QWpvdXRlciB1biBsaWVuDQotYWRkVGFibGVEaWFsb2dfdGl0bGU9QWpvdXRlciB1bmUgdGFibGUNCi1maW5kUmVwbGFjZURpYWxvZ190aXRsZT1SZWNoZXJjaGVyL1JlbXBsYWNlcg0KLXVybExhYmVsX3RleHQ9VVJMIDoNCi1zdW1tYXJ5TGFiZWxfdGV4dD1SXHUwMGU5Y2FwaXR1bGF0aWYgOg0KLWNhcHRpb25MYWJlbF90ZXh0PUxcdTAwZTlnZW5kZSA6DQotcm93c0xhYmVsX3RleHQ9TGlnbmVzIDoNCi1jb2x1bW5zTGFiZWxfdGV4dD1Db2xvbm5lcyA6DQotd2lkdGhMYWJlbF90ZXh0PUxhcmdldXIgOg0KLXRhYmxlU3R5bGVMYWJlbF90ZXh0PVN0eWxlIDoNCi10YWJsZUhlYWRlck5vbmVfdGV4dD1UYWJsZSBkXHUwMGU5cG91cnZ1ZSBkJ2VuLXRcdTAwZWF0ZQ0KLXRhYmxlSGVhZGVyQ29sc190ZXh0PVRhYmxlIGRvdFx1MDBlOWUgZCdlbi10XHUwMGVhdGVzIGRlIGNvbG9ubmUNCi10YWJsZUhlYWRlclJvd3NfdGV4dD1UYWJsZSBkb3RcdTAwZTllIGQnZW4tdFx1MDBlYXRlcyBkZSBsaWduZQ0KLXRhYmxlSGVhZGVyQm90aF90ZXh0PVRhYmxlIGRvdFx1MDBlOWUgZCdlbi10XHUwMGVhdGVzIGRlIGNvbG9ubmUgZXQgZGUgbGlnbmUNCi1icm93c2VCdXR0b25fdGV4dD1QYXJjb3VyaXIuLi4NCi0NCi0jIENsZWFyIEVkaXRvciBDb250ZW50IERpYWxvZw0KLWNsZWFyQ29udGVudERpYWxvZ190aXRsZT1Db25maXJtYXRpb24gZGUgbCdlZmZhY2VtZW50IGR1IGNvbnRlbnUgZGUgbCdcdTAwZTlkaXRldXINCi1jbGVhckNvbnRlbnREaWFsb2dfdGV4dD1Wb3VsZXotdm91cyB2cmFpbWVudCBlZmZhY2VyIGxlIGNvbnRlbnUgZGUgY2V0IFx1MDBlOWRpdGV1ciBkZSB0ZXh0ZSBlbnJpY2hpID8NCi0NCi0jIEZpbmQvUmVwbGFjZSBEaWFsb2cNCi1maW5kTGFiZWxfdGV4dD1SZWNoZXJjaGVyIDoNCi1yZXBsYWNlTGFiZWxfdGV4dD1SZW1wbGFjZXIgcGFyIDoNCi1vcHRpb25zR3JvdXBfdGV4dD1PcHRpb25zDQotY2FzZVNlbnNpdGl2ZUNoZWNrYm94X3RleHQ9UmVzcGVjdGVyIGxhIGNhc3NlDQotd2hvbGVXb3JkQ2hlY2tib3hfdGV4dD1Nb3QgZW50aWVyDQotZGlyZWN0aW9uR3JvdXBfdGV4dD1TZW5zDQotZm9yd2FyZFJhZGlvQnV0dG9uX3RleHQ9U3VpdmFudA0KLWJhY2t3YXJkUmFkaW9CdXR0b25fdGV4dD1Qclx1MDBlOWNcdTAwZTlkZW50DQotZmluZEJ1dHRvbl90ZXh0PVJlY2hlcmNoZXINCi1yZXBsYWNlQnV0dG9uX3RleHQ9UmVtcGxhY2VyDQotcmVwbGFjZUZpbmRCdXR0b25fdGV4dD1SZW1wbGFjZXIvUmVjaGVyY2hlcg0KLXJlcGxhY2VhbGxCdXR0b25fdGV4dD1SZW1wbGFjZXIgdG91dA0KLSMgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcg0KLUZpbmRSZXBsYWNlX1N0YXR1c19ub01hdGNoX2xhYmVsPUNoYVx1MDBlZW5lIGludHJvdXZhYmxlDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1tYXhDaGFyc1BlckxpbmVMYWJlbF90ZXh0PU5vbWJyZSBtYXhpbWFsIGRlIGNhcmFjdFx1MDBlOHJlcyBwYXIgbGlnbmUgOg0KLWluZGVudEhUTUxDaGVja2JveF90ZXh0PU1ldHRyZSBsZXMgYmFsaXNlcyBIVE1MIGVuIHJldHJhaXQNCi1pbmRlbnRTaXplTGFiZWxfdGV4dD1UYWlsbGUgZHUgcmV0cmFpdCA6DQotdXJsRGlzcGxheU5hbWVMYWJlbF90ZXh0PU5vbSBhZmZpY2hcdTAwZTkgZGUgbCdVUkwgOg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc2ZTUxMTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGb250IFN0eWxlIE5hbWVzDQotZm9udFN0eWxlX25vcm1hbD1Ob3JtYWxlDQotZm9udFN0eWxlX3NlY3Rpb25IZWFkaW5nPUludGVzdGF6aW9uZSBkaSBzZXppb25lDQotZm9udFN0eWxlX3N1YnNlY3Rpb25IZWFkaW5nPUludGVzdGF6aW9uZSBkaSBzb3R0b3NlemlvbmUNCi1mb250U3R5bGVfc3ViU3Vic2VjdGlvbkhlYWRpbmc9SW50ZXN0YXppb25lIGRpIHNvdHRvc2V6aW9uZSBzZWNvbmRhcmlhDQotZm9udFN0eWxlX3F1b3RlPUNpdGF6aW9uZQ0KLWZvbnRTdHlsZV9jb2RlU2FtcGxlPUVzZW1waW8gZGkgY29kaWNlDQotDQotIyBIVE1MIEJsb2NrIFRhZ3MNCi1ibG9ja1RhZ19wYXJhZ3JhcGg9UGFyYWdyYWZvDQotYmxvY2tUYWdfaGVhZGluZzE9SW50ZXN0YXppb25lIDENCi1ibG9ja1RhZ19oZWFkaW5nMj1JbnRlc3RhemlvbmUgMg0KLWJsb2NrVGFnX2hlYWRpbmczPUludGVzdGF6aW9uZSAzDQotYmxvY2tUYWdfaGVhZGluZzQ9SW50ZXN0YXppb25lIDQNCi1ibG9ja1RhZ19oZWFkaW5nNT1JbnRlc3RhemlvbmUgNQ0KLWJsb2NrVGFnX2hlYWRpbmc2PUludGVzdGF6aW9uZSA2DQotYmxvY2tUYWdfYWRkcmVzcz1JbmRpcml6em8NCi1ibG9ja1RhZ19wcmVmb3JtYXR0ZWRUZXh0PVRlc3RvIHByZWZvcm1hdHRhdG8NCi0NCi0jIEhUTUwgRm9udCBOYW1lcw0KLWZvbnROYW1lX2RlZmF1bHQ9UHJlZGVmaW5pdG8NCi1mb250TmFtZV9hcmlhbD1BcmlhbA0KLWZvbnROYW1lX2NvdXJpZXJOZXc9Q291cmllciBOZXcNCi1mb250TmFtZV90aW1lc05ld1JvbWFuPVRpbWVzIE5ldyBSb21hbg0KLWZvbnROYW1lX3ZlcmRhbmE9VmVyZGFuYQ0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBUb29sIEJ1dHRvbnMNCi1hZGRIb3Jpem9udGFsQmFyQWN0aW9uX3Rvb2xUaXBUZXh0PUFnZ2l1bmdpIGJhcnJhIG9yaXp6b250YWxlDQotYWRkSW1hZ2VBY3Rpb25fdG9vbFRpcFRleHQ9QWdnaXVuZ2kgaW1tYWdpbmUNCi1hZGRMaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PUFnZ2l1bmdpIHJpZ2ENCi1hZGRMaW5rQWN0aW9uX3Rvb2xUaXBUZXh0PUFnZ2l1bmdpIGNvbGxlZ2FtZW50bw0KLWFkZE9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PUFnZ2l1bmdpIGVsZW5jbyBvcmRpbmF0bw0KLWFkZFRhYmxlQWN0aW9uX3Rvb2xUaXBUZXh0PUFnZ2l1bmdpIHRhYmVsbGENCi1hZGRVbm9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PUFnZ2l1bmdpIGVsZW5jbyBub24gb3JkaW5hdG8NCi1ib2xkQWN0aW9uX3Rvb2xUaXBUZXh0PUdyYXNzZXR0bw0KLWNsZWFyQ29udGVudEFjdGlvbl90b29sVGlwVGV4dD1DYW5jZWxsYSBpbCBjb250ZW51dG8NCi1jb3B5QWN0aW9uX3Rvb2xUaXBUZXh0PUNvcGlhDQotY3V0QWN0aW9uX3Rvb2xUaXBUZXh0PVRhZ2xpYQ0KLWZpbmRSZXBsYWNlQWN0aW9uX3Rvb2xUaXBUZXh0PVRyb3ZhL1Nvc3RpdHVpc2NpDQotaW5kZW50QWN0aW9uX3Rvb2xUaXBUZXh0PUltcG9zdGEgcmllbnRybw0KLWl0YWxpY0FjdGlvbl90b29sVGlwVGV4dD1Db3JzaXZvDQotanVzdGlmeUNlbnRlckFjdGlvbl90b29sVGlwVGV4dD1DZW50cmENCi1qdXN0aWZ5RnVsbEFjdGlvbl90b29sVGlwVGV4dD1HaXVzdGlmaWNhdG8NCi1qdXN0aWZ5TGVmdEFjdGlvbl90b29sVGlwVGV4dD1BbGxpbmVhIGEgc2luaXN0cmENCi1qdXN0aWZ5UmlnaHRBY3Rpb25fdG9vbFRpcFRleHQ9QWxsaW5lYSBhIGRlc3RyYQ0KLW91dGRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9QW5udWxsYSByaWVudHJvDQotcGFzdGVBY3Rpb25fdG9vbFRpcFRleHQ9SW5jb2xsYQ0KLXN1YnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dD1QZWRpY2UNCi1zdXBlcnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dD1BcGljZQ0KLXVuZGVybGluZUFjdGlvbl90b29sVGlwVGV4dD1Tb3R0b2xpbmVhdG8NCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgQ29tYm9ib3hlcw0KLWZvbnRTdHlsZUFjdGlvbl90b29sVGlwVGV4dD1JbXBvc3RhIHN0aWxlIGNhcmF0dGVyZQ0KLWJsb2NrVGFnQWN0aW9uX3Rvb2xUaXBUZXh0PUltcG9zdGEgdGFnIGRpIGJsb2Njbw0KLWZvbnROYW1lQWN0aW9uX3Rvb2xUaXBUZXh0PUltcG9zdGEgdGlwbyBjYXJhdHRlcmUNCi1mb250U2l6ZUFjdGlvbl90b29sVGlwVGV4dD1JbXBvc3RhemlvbmkgZGltZW5zaW9uaSBjYXJhdHRlcmUNCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgQ29udGV4dCBNZW51IEl0ZW1zDQotY3V0QWN0aW9uX3RleHQ9VGFnbGlhDQotY29weUFjdGlvbl90ZXh0PUNvcGlhDQotcGFzdGVBY3Rpb25fdGV4dD1JbmNvbGxhDQotDQotIyBSaWNoIFRleHQgRWRpdG9yIFRhYnMNCi1yaWNoVGV4dFRhYl90ZXh0PVJpY2ggVGV4dA0KLXJpY2hUZXh0VGFiX3Rvb2xUaXBUZXh0PU1vZGlmaWNhIGNvbnRlbnV0byBpbiByaWNoIHRleHQNCi1odG1sVGFiX3RleHQ9SFRNTA0KLWh0bWxUYWJfdG9vbFRpcFRleHQ9TW9kaWZpY2EgY29udGVudXRvIGluIEhUTUwNCi0NCi0jIEFkZCBEaWFsb2dzDQotYWRkSW1hZ2VEaWFsb2dfdGl0bGU9QWdnaXVuZ2kgaW1tYWdpbmUNCi1hZGRMaW5rRGlhbG9nX3RpdGxlPUFnZ2l1bmdpIGNvbGxlZ2FtZW50bw0KLWFkZFRhYmxlRGlhbG9nX3RpdGxlPUFnZ2l1bmdpIHRhYmVsbGENCi1maW5kUmVwbGFjZURpYWxvZ190aXRsZT1Ucm92YS9Tb3N0aXR1aXNjaQ0KLXVybExhYmVsX3RleHQ9VVJMOg0KLXN1bW1hcnlMYWJlbF90ZXh0PVJpZXBpbG9nbzoNCi1jYXB0aW9uTGFiZWxfdGV4dD1EaWRhc2NhbGlhOg0KLXJvd3NMYWJlbF90ZXh0PVJpZ2hlOg0KLWNvbHVtbnNMYWJlbF90ZXh0PUNvbG9ubmU6DQotd2lkdGhMYWJlbF90ZXh0PUxhcmdoZXp6YToNCi10YWJsZVN0eWxlTGFiZWxfdGV4dD1TdGlsZToNCi10YWJsZUhlYWRlck5vbmVfdGV4dD1UYWJlbGxhIHNlbnphIGludGVzdGF6aW9uaQ0KLXRhYmxlSGVhZGVyQ29sc190ZXh0PVRhYmVsbGEgY29uIGludGVzdGF6aW9uaSBkaSBjb2xvbm5hDQotdGFibGVIZWFkZXJSb3dzX3RleHQ9VGFiZWxsYSBjb24gaW50ZXN0YXppb25pIGRpIHJpZ2ENCi10YWJsZUhlYWRlckJvdGhfdGV4dD1UYWJlbGxhIGNvbiBpbnRlc3RhemlvbmkgZGkgY29sb25uYSBlIGRpIHJpZ2ENCi1icm93c2VCdXR0b25fdGV4dD1TZm9nbGlhLi4uDQotDQotIyBDbGVhciBFZGl0b3IgQ29udGVudCBEaWFsb2cNCi1jbGVhckNvbnRlbnREaWFsb2dfdGl0bGU9Q29uZmVybWEgY2FuY2VsbGF6aW9uZSBjb250ZW51dG8gZWRpdG9yDQotY2xlYXJDb250ZW50RGlhbG9nX3RleHQ9Q2FuY2VsbGFyZSBpbCBjb250ZW51dG8gZGkgcXVlc3RvIGVkaXRvciByaWNoIHRleHQ/DQotDQotIyBGaW5kL1JlcGxhY2UgRGlhbG9nDQotZmluZExhYmVsX3RleHQ9VHJvdmE6DQotcmVwbGFjZUxhYmVsX3RleHQ9U29zdGl0dWlzY2kgY29uOg0KLW9wdGlvbnNHcm91cF90ZXh0PU9wemlvbmkNCi1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1NYWl1c2NvbGUvTWludXNjb2xlDQotd2hvbGVXb3JkQ2hlY2tib3hfdGV4dD1QYXJvbGEgaW50ZXJhDQotZGlyZWN0aW9uR3JvdXBfdGV4dD1EaXJlemlvbmUNCi1mb3J3YXJkUmFkaW9CdXR0b25fdGV4dD1JbiBhdmFudGkNCi1iYWNrd2FyZFJhZGlvQnV0dG9uX3RleHQ9SW5kaWV0cm8NCi1maW5kQnV0dG9uX3RleHQ9VHJvdmENCi1yZXBsYWNlQnV0dG9uX3RleHQ9U29zdGl0dWlzY2kNCi1yZXBsYWNlRmluZEJ1dHRvbl90ZXh0PVNvc3RpdHVpc2NpL1Ryb3ZhDQotcmVwbGFjZWFsbEJ1dHRvbl90ZXh0PVNvc3RpdHVpc2NpIHR1dHRvDQotIyB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yDQotRmluZFJlcGxhY2VfU3RhdHVzX25vTWF0Y2hfbGFiZWw9U3RyaW5nYSBub24gdHJvdmF0YQ0KLQ0KLSMgUHJlZmVyZW5jZSBQYWdlDQotbWF4Q2hhcnNQZXJMaW5lTGFiZWxfdGV4dD1OdW1lcm8gbWFzc2ltbyBkaSBjYXJhdHRlcmkgcGVyIHJpZ2E6DQotaW5kZW50SFRNTENoZWNrYm94X3RleHQ9VGFnIEhUTUwgaW5kZW50DQotaW5kZW50U2l6ZUxhYmVsX3RleHQ9RGltZW5zaW9uaSByaWVudHJvOg0KLXVybERpc3BsYXlOYW1lTGFiZWxfdGV4dD1Ob21lIHZpc3VhbGl6emF6aW9uZSBVUkw6DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXNfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTAwNDI5OS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXNfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEZvbnQgU3R5bGUgTmFtZXMNCi1mb250U3R5bGVfbm9ybWFsPVx1OTAxYVx1NWUzOA0KLWZvbnRTdHlsZV9zZWN0aW9uSGVhZGluZz1cdTMwYmJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjNcdTg5OGJcdTUxZmFcdTMwNTcNCi1mb250U3R5bGVfc3Vic2VjdGlvbkhlYWRpbmc9XHUzMGI1XHUzMGQ2XHUzMGJiXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHU4OThiXHU1MWZhXHUzMDU3DQotZm9udFN0eWxlX3N1YlN1YnNlY3Rpb25IZWFkaW5nPVx1MzBiNVx1MzBkNlx1MzBmYlx1MzBiNVx1MzBkNlx1MzBiYlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmM1x1ODk4Ylx1NTFmYVx1MzA1Nw0KLWZvbnRTdHlsZV9xdW90ZT1cdTVmMTVcdTc1MjgNCi1mb250U3R5bGVfY29kZVNhbXBsZT1cdTMwYjNcdTMwZmNcdTMwYzlcdTMwZmJcdTMwYjVcdTMwZjNcdTMwZDdcdTMwZWINCi0NCi0jIEhUTUwgQmxvY2sgVGFncw0KLWJsb2NrVGFnX3BhcmFncmFwaD1cdTZiYjVcdTg0M2QNCi1ibG9ja1RhZ19oZWFkaW5nMT1cdTg5OGJcdTUxZmFcdTMwNTcgMQ0KLWJsb2NrVGFnX2hlYWRpbmcyPVx1ODk4Ylx1NTFmYVx1MzA1NyAyDQotYmxvY2tUYWdfaGVhZGluZzM9XHU4OThiXHU1MWZhXHUzMDU3IDMNCi1ibG9ja1RhZ19oZWFkaW5nND1cdTg5OGJcdTUxZmFcdTMwNTcgNA0KLWJsb2NrVGFnX2hlYWRpbmc1PVx1ODk4Ylx1NTFmYVx1MzA1NyA1DQotYmxvY2tUYWdfaGVhZGluZzY9XHU4OThiXHU1MWZhXHUzMDU3IDYNCi1ibG9ja1RhZ19hZGRyZXNzPVx1MzBhMlx1MzBjOVx1MzBlY1x1MzBiOQ0KLWJsb2NrVGFnX3ByZWZvcm1hdHRlZFRleHQ9XHU0ZThiXHU1MjRkXHU2NmY4XHU1ZjBmXHU4YTJkXHU1YjlhXHU2ZTA4XHUzMDdmXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4DQotDQotIyBIVE1MIEZvbnQgTmFtZXMNCi1mb250TmFtZV9kZWZhdWx0PVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOA0KLWZvbnROYW1lX2FyaWFsPUFyaWFsDQotZm9udE5hbWVfY291cmllck5ldz1Db3VyaWVyIE5ldw0KLWZvbnROYW1lX3RpbWVzTmV3Um9tYW49VGltZXMgTmV3IFJvbWFuDQotZm9udE5hbWVfdmVyZGFuYT1WZXJkYW5hDQotDQotIyBSaWNoIFRleHQgRWRpdG9yIFRvb2wgQnV0dG9ucw0KLWFkZEhvcml6b250YWxCYXJBY3Rpb25fdG9vbFRpcFRleHQ9XHU2YzM0XHU1ZTczXHUzMGQwXHUzMGZjXHUzMDZlXHU4ZmZkXHU1MmEwDQotYWRkSW1hZ2VBY3Rpb25fdG9vbFRpcFRleHQ9XHU3NTNiXHU1MGNmXHUzMDZlXHU4ZmZkXHU1MmEwDQotYWRkTGluZUFjdGlvbl90b29sVGlwVGV4dD1cdTg4NGNcdTMwNmVcdThmZmRcdTUyYTANCi1hZGRMaW5rQWN0aW9uX3Rvb2xUaXBUZXh0PVx1MzBlYVx1MzBmM1x1MzBhZlx1MzA2ZVx1OGZmZFx1NTJhMA0KLWFkZE9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1NzU2YVx1NTNmN1x1NGVkOFx1MzA0ZFx1MzBlYVx1MzBiOVx1MzBjOFx1MzA2ZVx1OGZmZFx1NTJhMA0KLWFkZFRhYmxlQWN0aW9uX3Rvb2xUaXBUZXh0PVx1ODg2OFx1MzA2ZVx1OGZmZFx1NTJhMA0KLWFkZFVub3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQ9XHU3NTZhXHU1M2Y3XHUzMDZhXHUzMDU3XHUzMGVhXHUzMGI5XHUzMGM4XHUzMDZlXHU4ZmZkXHU1MmEwDQotYm9sZEFjdGlvbl90b29sVGlwVGV4dD1cdTU5MmFcdTViNTcNCi1jbGVhckNvbnRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMDZlXHUzMGFmXHUzMGVhXHUzMGEyDQotY29weUFjdGlvbl90b29sVGlwVGV4dD1cdTMwYjNcdTMwZDRcdTMwZmMNCi1jdXRBY3Rpb25fdG9vbFRpcFRleHQ9XHU1MjA3XHUzMDhhXHU1M2Q2XHUzMDhhDQotZmluZFJlcGxhY2VBY3Rpb25fdG9vbFRpcFRleHQ9XHU2OTFjXHU3ZDIyL1x1N2Y2ZVx1NjNkYg0KLWluZGVudEFjdGlvbl90b29sVGlwVGV4dD1cdTMwYTRcdTMwZjNcdTMwYzdcdTMwZjNcdTMwYzgNCi1pdGFsaWNBY3Rpb25fdG9vbFRpcFRleHQ9XHUzMGE0XHUzMGJmXHUzMGVhXHUzMGMzXHUzMGFmDQotanVzdGlmeUNlbnRlckFjdGlvbl90b29sVGlwVGV4dD1cdTRlMmRcdTU5MmVcdTYzYzNcdTMwNDgNCi1qdXN0aWZ5RnVsbEFjdGlvbl90b29sVGlwVGV4dD1cdTRlMjFcdTdhZWZcdTYzYzNcdTMwNDgNCi1qdXN0aWZ5TGVmdEFjdGlvbl90b29sVGlwVGV4dD1cdTVkZTZcdTYzYzNcdTMwNDgNCi1qdXN0aWZ5UmlnaHRBY3Rpb25fdG9vbFRpcFRleHQ9XHU1M2YzXHU2M2MzXHUzMDQ4DQotb3V0ZGVudEFjdGlvbl90b29sVGlwVGV4dD1cdTMwYTJcdTMwYTZcdTMwYzhcdTMwYzdcdTMwZjNcdTMwYzgNCi1wYXN0ZUFjdGlvbl90b29sVGlwVGV4dD1cdThjYmNcdTMwOGFcdTRlZDhcdTMwNTENCi1zdWJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQ9XHU0ZTBiXHU0ZWQ4XHUzMDRkXHU2NTg3XHU1YjU3DQotc3VwZXJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQ9XHU0ZTBhXHU0ZWQ4XHUzMDRkXHU2NTg3XHU1YjU3DQotdW5kZXJsaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PVx1NGUwYlx1N2RkYQ0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBDb21ib2JveGVzDQotZm9udFN0eWxlQWN0aW9uX3Rvb2xUaXBUZXh0PVx1MzBkNVx1MzBhOVx1MzBmM1x1MzBjOFx1MzBmYlx1MzBiOVx1MzBiZlx1MzBhNFx1MzBlYlx1MzA2ZVx1OGEyZFx1NWI5YQ0KLWJsb2NrVGFnQWN0aW9uX3Rvb2xUaXBUZXh0PVx1MzBkNlx1MzBlZFx1MzBjM1x1MzBhZlx1MzBmYlx1MzBiZlx1MzBiMFx1MzA2ZVx1OGEyZFx1NWI5YQ0KLWZvbnROYW1lQWN0aW9uX3Rvb2xUaXBUZXh0PVx1MzBkNVx1MzBhOVx1MzBmM1x1MzBjOFx1NTQwZFx1MzA2ZVx1OGEyZFx1NWI5YQ0KLWZvbnRTaXplQWN0aW9uX3Rvb2xUaXBUZXh0PVx1MzBkNVx1MzBhOVx1MzBmM1x1MzBjOFx1MzBmYlx1MzBiNVx1MzBhNFx1MzBiYVx1MzA2ZVx1OGEyZFx1NWI5YQ0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBDb250ZXh0IE1lbnUgSXRlbXMNCi1jdXRBY3Rpb25fdGV4dD1cdTUyMDdcdTMwOGFcdTUzZDZcdTMwOGENCi1jb3B5QWN0aW9uX3RleHQ9XHUzMGIzXHUzMGQ0XHUzMGZjDQotcGFzdGVBY3Rpb25fdGV4dD1cdThjYmNcdTMwOGFcdTRlZDhcdTMwNTENCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgVGFicw0KLXJpY2hUZXh0VGFiX3RleHQ9XHUzMGVhXHUzMGMzXHUzMGMxXHUzMGZiXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4DQotcmljaFRleHRUYWJfdG9vbFRpcFRleHQ9XHUzMGVhXHUzMGMzXHUzMGMxXHUzMGZiXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMDZlXHU3ZGU4XHU5NmM2DQotaHRtbFRhYl90ZXh0PUhUTUwNCi1odG1sVGFiX3Rvb2xUaXBUZXh0PUhUTUwgXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMDZlXHU3ZGU4XHU5NmM2DQotDQotIyBBZGQgRGlhbG9ncw0KLWFkZEltYWdlRGlhbG9nX3RpdGxlPVx1NzUzYlx1NTBjZlx1MzA2ZVx1OGZmZFx1NTJhMA0KLWFkZExpbmtEaWFsb2dfdGl0bGU9XHUzMGVhXHUzMGYzXHUzMGFmXHUzMDZlXHU4ZmZkXHU1MmEwDQotYWRkVGFibGVEaWFsb2dfdGl0bGU9XHU4ODY4XHUzMDZlXHU4ZmZkXHU1MmEwDQotZmluZFJlcGxhY2VEaWFsb2dfdGl0bGU9XHU2OTFjXHU3ZDIyL1x1N2Y2ZVx1NjNkYg0KLXVybExhYmVsX3RleHQ9VVJMOg0KLXN1bW1hcnlMYWJlbF90ZXh0PVx1ODk4MVx1N2QwNDoNCi1jYXB0aW9uTGFiZWxfdGV4dD1cdTg4NjhcdTk4NGM6DQotcm93c0xhYmVsX3RleHQ9XHU4ODRjOg0KLWNvbHVtbnNMYWJlbF90ZXh0PVx1NTIxNzoNCi13aWR0aExhYmVsX3RleHQ9XHU1ZTQ1Og0KLXRhYmxlU3R5bGVMYWJlbF90ZXh0PVx1MzBiOVx1MzBiZlx1MzBhNFx1MzBlYjoNCi10YWJsZUhlYWRlck5vbmVfdGV4dD1cdTg5OGJcdTUxZmFcdTMwNTdcdTMwNmVcdTMwNmFcdTMwNDRcdTg4NjgNCi10YWJsZUhlYWRlckNvbHNfdGV4dD1cdTUyMTdcdTg5OGJcdTUxZmFcdTMwNTdcdTMwNmVcdTMwNDJcdTMwOGJcdTg4NjgNCi10YWJsZUhlYWRlclJvd3NfdGV4dD1cdTg4NGNcdTg5OGJcdTUxZmFcdTMwNTdcdTMwNmVcdTMwNDJcdTMwOGJcdTg4NjgNCi10YWJsZUhlYWRlckJvdGhfdGV4dD1cdTUyMTdcdTg5OGJcdTUxZmFcdTMwNTdcdTMwNjhcdTg4NGNcdTg5OGJcdTUxZmFcdTMwNTdcdTMwNmVcdTMwNDJcdTMwOGJcdTg4NjgNCi1icm93c2VCdXR0b25fdGV4dD1cdTUzYzJcdTcxNjcuLi4NCi0NCi0jIENsZWFyIEVkaXRvciBDb250ZW50IERpYWxvZw0KLWNsZWFyQ29udGVudERpYWxvZ190aXRsZT1cdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwNmVcdTMwYWZcdTMwZWFcdTMwYTJcdTMwNmVcdTc4YmFcdThhOGQNCi1jbGVhckNvbnRlbnREaWFsb2dfdGV4dD1cdTMwNTNcdTMwNmVcdTMwZWFcdTMwYzNcdTMwYzFcdTMwZmJcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZmJcdTMwYThcdTMwYzdcdTMwYTNcdTMwYmZcdTMwZmNcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYTJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/DQotDQotIyBGaW5kL1JlcGxhY2UgRGlhbG9nDQotZmluZExhYmVsX3RleHQ9XHU2OTFjXHU3ZDIyOg0KLXJlcGxhY2VMYWJlbF90ZXh0PVx1N2Y2ZVx1NjNkYjoNCi1vcHRpb25zR3JvdXBfdGV4dD1cdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjMNCi1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1cdTU5MjcvXHU1YzBmXHU2NTg3XHU1YjU3XHUzMDkyXHU1MzNhXHU1MjI1XHUzMDU5XHUzMDhiDQotd2hvbGVXb3JkQ2hlY2tib3hfdGV4dD1cdTUzNThcdThhOWVcdTUzNThcdTRmNGQNCi1kaXJlY3Rpb25Hcm91cF90ZXh0PVx1NTQxMVx1MzA0ZA0KLWZvcndhcmRSYWRpb0J1dHRvbl90ZXh0PVx1NTI0ZFx1NjViOQ0KLWJhY2t3YXJkUmFkaW9CdXR0b25fdGV4dD1cdTVmOGNcdTY1YjkNCi1maW5kQnV0dG9uX3RleHQ9XHU2OTFjXHU3ZDIyDQotcmVwbGFjZUJ1dHRvbl90ZXh0PVx1N2Y2ZVx1NjNkYg0KLXJlcGxhY2VGaW5kQnV0dG9uX3RleHQ9XHU3ZjZlXHU2M2RiL1x1NjkxY1x1N2QyMg0KLXJlcGxhY2VhbGxCdXR0b25fdGV4dD1cdTMwNTlcdTMwNzlcdTMwNjZcdTMwOTJcdTdmNmVcdTYzZGINCi0jIHRha2VuIGZyb20gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3INCi1GaW5kUmVwbGFjZV9TdGF0dXNfbm9NYXRjaF9sYWJlbD1cdTY1ODdcdTViNTdcdTUyMTdcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMNCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLW1heENoYXJzUGVyTGluZUxhYmVsX3RleHQ9MSBcdTg4NGNcdTMwNmVcdTY3MDBcdTU5MjdcdTY1ODdcdTViNTdcdTY1NzA6DQotaW5kZW50SFRNTENoZWNrYm94X3RleHQ9XHUzMGE0XHUzMGYzXHUzMGM3XHUzMGYzXHUzMGM4IEhUTUwgXHUzMGJmXHUzMGIwDQotaW5kZW50U2l6ZUxhYmVsX3RleHQ9XHUzMGE0XHUzMGYzXHUzMGM3XHUzMGYzXHUzMGM4XHUzMGZiXHUzMGI1XHUzMGE0XHUzMGJhOg0KLXVybERpc3BsYXlOYW1lTGFiZWxfdGV4dD1VUkwgXHU4ODY4XHU3OTNhXHU1NDBkOg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1Jlc291cmNlc19rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0YmFlOGEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGb250IFN0eWxlIE5hbWVzDQotZm9udFN0eWxlX25vcm1hbD1cdWJjZjRcdWQxYjUNCi1mb250U3R5bGVfc2VjdGlvbkhlYWRpbmc9XHVjMTM5XHVjMTU4IFx1ZDQ1Y1x1YzgxYw0KLWZvbnRTdHlsZV9zdWJzZWN0aW9uSGVhZGluZz1cdWMxMWNcdWJlMGNcdWMxMzlcdWMxNTggXHVkNDVjXHVjODFjDQotZm9udFN0eWxlX3N1YlN1YnNlY3Rpb25IZWFkaW5nPVx1YzExY1x1YmUwY1x1YzEzOVx1YzE1OFx1Yzc1OCBcdWQ1NThcdWM3MDQgXHVkNDVjXHVjODFjDQotZm9udFN0eWxlX3F1b3RlPVx1YjUzMFx1YzYzNFx1ZDQ1Yw0KLWZvbnRTdHlsZV9jb2RlU2FtcGxlPVx1Y2Y1NFx1YjRkYyBcdWMwZDhcdWQ1MGMNCi0NCi0jIEhUTUwgQmxvY2sgVGFncw0KLWJsb2NrVGFnX3BhcmFncmFwaD1cdWIyZThcdWI3N2QNCi1ibG9ja1RhZ19oZWFkaW5nMT1cdWQ0NWNcdWM4MWMgMQ0KLWJsb2NrVGFnX2hlYWRpbmcyPVx1ZDQ1Y1x1YzgxYyAyDQotYmxvY2tUYWdfaGVhZGluZzM9XHVkNDVjXHVjODFjIDMNCi1ibG9ja1RhZ19oZWFkaW5nND1cdWQ0NWNcdWM4MWMgNA0KLWJsb2NrVGFnX2hlYWRpbmc1PVx1ZDQ1Y1x1YzgxYyA1DQotYmxvY2tUYWdfaGVhZGluZzY9XHVkNDVjXHVjODFjIDYNCi1ibG9ja1RhZ19hZGRyZXNzPVx1YzhmY1x1YzE4Yw0KLWJsb2NrVGFnX3ByZWZvcm1hdHRlZFRleHQ9XHVjMGFjXHVjODA0IFx1ZDYxNVx1YzJkZFx1ZDY1NFx1YjQxYyBcdWQxNGRcdWMyYTRcdWQyYjgNCi0NCi0jIEhUTUwgRm9udCBOYW1lcw0KLWZvbnROYW1lX2RlZmF1bHQ9XHVhZTMwXHViY2Y4XHVhYzEyDQotZm9udE5hbWVfYXJpYWw9QXJpYWwNCi1mb250TmFtZV9jb3VyaWVyTmV3PUNvdXJpZXIgTmV3DQotZm9udE5hbWVfdGltZXNOZXdSb21hbj1UaW1lcyBOZXcgUm9tYW4NCi1mb250TmFtZV92ZXJkYW5hPVZlcmRhbmENCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgVG9vbCBCdXR0b25zDQotYWRkSG9yaXpvbnRhbEJhckFjdGlvbl90b29sVGlwVGV4dD1cdWFjMDBcdWI4NWMgXHVjMmE0XHVkMDZjXHViODY0IFx1YjljOVx1YjMwMCBcdWNkOTRcdWFjMDANCi1hZGRJbWFnZUFjdGlvbl90b29sVGlwVGV4dD1cdWM3NzRcdWJiZjhcdWM5YzAgXHVjZDk0XHVhYzAwDQotYWRkTGluZUFjdGlvbl90b29sVGlwVGV4dD1cdWQ1ODkgXHVjZDk0XHVhYzAwDQotYWRkTGlua0FjdGlvbl90b29sVGlwVGV4dD1cdWI5YzFcdWQwNmMgXHVjZDk0XHVhYzAwDQotYWRkT3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQ9XHVjODE1XHViODJjXHViNDFjIFx1YmFhOVx1Yjg1ZCBcdWNkOTRcdWFjMDANCi1hZGRUYWJsZUFjdGlvbl90b29sVGlwVGV4dD1cdWQ0NWMgXHVjZDk0XHVhYzAwDQotYWRkVW5vcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dD1cdWM4MTVcdWI4MmNcdWI0MThcdWM5YzAgXHVjNTRhXHVjNzQwIFx1YmFhOVx1Yjg1ZCBcdWNkOTRcdWFjMDANCi1ib2xkQWN0aW9uX3Rvb2xUaXBUZXh0PVx1YWQ3NVx1YWM4Yw0KLWNsZWFyQ29udGVudEFjdGlvbl90b29sVGlwVGV4dD1cdWNlZThcdWQxNTBcdWNlMjAgXHVjOWMwXHVjNmIwXHVhZTMwDQotY29weUFjdGlvbl90b29sVGlwVGV4dD1cdWJjZjVcdWMwYWMNCi1jdXRBY3Rpb25fdG9vbFRpcFRleHQ9XHVjNzk4XHViNzdjXHViMGI0XHVhZTMwDQotZmluZFJlcGxhY2VBY3Rpb25fdG9vbFRpcFRleHQ9XHVjYzNlXHVhZTMwL1x1YmMxNFx1YWZiOFx1YWUzMA0KLWluZGVudEFjdGlvbl90b29sVGlwVGV4dD1cdWI0ZTRcdWM1ZWNcdWM0ZjBcdWFlMzANCi1pdGFsaWNBY3Rpb25fdG9vbFRpcFRleHQ9XHVhZTMwXHVjNmI4XHVjNzg0XHVjY2I0DQotanVzdGlmeUNlbnRlckFjdGlvbl90b29sVGlwVGV4dD1cdWFjMDBcdWM2YjRcdWIzNzAgXHViOWRlXHVjZDk0XHVhZTMwDQotanVzdGlmeUZ1bGxBY3Rpb25fdG9vbFRpcFRleHQ9XHVjNTkxXHVjYWJkIFx1YjlkZVx1Y2Q5NFx1YWUzMA0KLWp1c3RpZnlMZWZ0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1YzY3Y1x1Y2FiZCBcdWI5ZGVcdWNkOTRcdWFlMzANCi1qdXN0aWZ5UmlnaHRBY3Rpb25fdG9vbFRpcFRleHQ9XHVjNjI0XHViOTc4XHVjYWJkIFx1YjlkZVx1Y2Q5NFx1YWUzMA0KLW91dGRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9XHViMGI0XHVjNWI0XHVjNGYwXHVhZTMwDQotcGFzdGVBY3Rpb25fdG9vbFRpcFRleHQ9XHViZDk5XHVjNWVjXHViMTIzXHVhZTMwDQotc3Vic2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1YzU0NFx1Yjc5OCBcdWNjYThcdWM3OTANCi1zdXBlcnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dD1cdWM3MTcgXHVjY2E4XHVjNzkwDQotdW5kZXJsaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PVx1YmMxMVx1YzkwNA0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBDb21ib2JveGVzDQotZm9udFN0eWxlQWN0aW9uX3Rvb2xUaXBUZXh0PVx1YWUwMFx1YWYzNCBcdWMyYTRcdWQwYzBcdWM3N2MgXHVjMTI0XHVjODE1DQotYmxvY2tUYWdBY3Rpb25fdG9vbFRpcFRleHQ9XHViZTE0XHViODVkIFx1ZDBkY1x1YWRmOCBcdWMxMjRcdWM4MTUNCi1mb250TmFtZUFjdGlvbl90b29sVGlwVGV4dD1cdWFlMDBcdWFmMzQgXHVjNzc0XHViOTg0IFx1YzEyNFx1YzgxNQ0KLWZvbnRTaXplQWN0aW9uX3Rvb2xUaXBUZXh0PVx1YWUwMFx1YWYzNCBcdWQwNmNcdWFlMzAgXHVjMTI0XHVjODE1DQotDQotIyBSaWNoIFRleHQgRWRpdG9yIENvbnRleHQgTWVudSBJdGVtcw0KLWN1dEFjdGlvbl90ZXh0PVx1Yzc5OFx1Yjc3Y1x1YjBiNFx1YWUzMA0KLWNvcHlBY3Rpb25fdGV4dD1cdWJjZjVcdWMwYWMNCi1wYXN0ZUFjdGlvbl90ZXh0PVx1YmQ5OVx1YzVlY1x1YjEyM1x1YWUzMA0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBUYWJzDQotcmljaFRleHRUYWJfdGV4dD1cdWMxMWNcdWMyZGRcdWM3ODhcdWIyOTQgXHVkMTRkXHVjMmE0XHVkMmI4DQotcmljaFRleHRUYWJfdG9vbFRpcFRleHQ9XHVjMTFjXHVjMmRkXHVjNzg4XHViMjk0IFx1ZDE0ZFx1YzJhNFx1ZDJiOFx1Yjg1YyBcdWNlZThcdWQxNTBcdWNlMjAgXHVkM2I4XHVjOWQxDQotaHRtbFRhYl90ZXh0PUhUTUwNCi1odG1sVGFiX3Rvb2xUaXBUZXh0PUhUTUxcdWI4NWMgXHVjZWU4XHVkMTUwXHVjZTIwIFx1ZDNiOFx1YzlkMQ0KLQ0KLSMgQWRkIERpYWxvZ3MNCi1hZGRJbWFnZURpYWxvZ190aXRsZT1cdWM3NzRcdWJiZjhcdWM5YzAgXHVjZDk0XHVhYzAwDQotYWRkTGlua0RpYWxvZ190aXRsZT1cdWI5YzFcdWQwNmMgXHVjZDk0XHVhYzAwDQotYWRkVGFibGVEaWFsb2dfdGl0bGU9XHVkNDVjIFx1Y2Q5NFx1YWMwMA0KLWZpbmRSZXBsYWNlRGlhbG9nX3RpdGxlPVx1Y2MzZVx1YWUzMC9cdWJjMTRcdWFmYjhcdWFlMzANCi11cmxMYWJlbF90ZXh0PVVSTDoNCi1zdW1tYXJ5TGFiZWxfdGV4dD1cdWM2OTRcdWM1N2Q6DQotY2FwdGlvbkxhYmVsX3RleHQ9XHVjZWExXHVjMTU4Og0KLXJvd3NMYWJlbF90ZXh0PVx1ZDU4OToNCi1jb2x1bW5zTGFiZWxfdGV4dD1cdWM1ZjQ6DQotd2lkdGhMYWJlbF90ZXh0PVx1YjEwOFx1YmU0NDoNCi10YWJsZVN0eWxlTGFiZWxfdGV4dD1cdWMyYTRcdWQwYzBcdWM3N2M6DQotdGFibGVIZWFkZXJOb25lX3RleHQ9XHVkNWU0XHViMzU0XHVhYzAwIFx1YzVjNlx1YjI5NCBcdWQ0NWMNCi10YWJsZUhlYWRlckNvbHNfdGV4dD1cdWM1ZjQgXHVkNWU0XHViMzU0XHVhYzAwIFx1Yzc4OFx1YjI5NCBcdWQ0NWMNCi10YWJsZUhlYWRlclJvd3NfdGV4dD1cdWQ1ODkgXHVkNWU0XHViMzU0XHVhYzAwIFx1Yzc4OFx1YjI5NCBcdWQ0NWMNCi10YWJsZUhlYWRlckJvdGhfdGV4dD1cdWM1ZjQgXHViYzBmIFx1ZDU4OSBcdWQ1ZTRcdWIzNTRcdWFjMDAgXHVjNzg4XHViMjk0IFx1ZDQ1Yw0KLWJyb3dzZUJ1dHRvbl90ZXh0PVx1Y2MzZVx1YzU0NFx1YmNmNFx1YWUzMC4uLg0KLQ0KLSMgQ2xlYXIgRWRpdG9yIENvbnRlbnQgRGlhbG9nDQotY2xlYXJDb250ZW50RGlhbG9nX3RpdGxlPVx1ZDNiOFx1YzlkMVx1YWUzMCBcdWNlZThcdWQxNTBcdWNlMjAgXHVjOWMwXHVjNmIwXHVhZTMwIFx1ZDY1NVx1Yzc3OA0KLWNsZWFyQ29udGVudERpYWxvZ190ZXh0PVx1Yzc3NCBcdWMxMWNcdWMyZGRcdWM3ODhcdWIyOTQgXHViYjM4XHVjMTFjIFx1ZDNiOFx1YzlkMVx1YWUzMFx1Yzc1OCBcdWNlZThcdWQxNTBcdWNlMjBcdWI5N2MgXHVjOWMwXHVjNmIwXHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPw0KLQ0KLSMgRmluZC9SZXBsYWNlIERpYWxvZw0KLWZpbmRMYWJlbF90ZXh0PVx1Y2MzZVx1YWUzMDoNCi1yZXBsYWNlTGFiZWxfdGV4dD1cdWJjMTRcdWFmYzAgXHViMzAwXHVjMGMxOg0KLW9wdGlvbnNHcm91cF90ZXh0PVx1YzYzNVx1YzE1OA0KLWNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0PVx1YjMwMFx1YzE4Y1x1YmIzOFx1Yzc5MCBcdWFkNmNcdWJkODQNCi13aG9sZVdvcmRDaGVja2JveF90ZXh0PVx1YzgwNFx1Y2NiNCBcdWIyZThcdWM1YjQNCi1kaXJlY3Rpb25Hcm91cF90ZXh0PVx1YmMyOVx1ZDVhNQ0KLWZvcndhcmRSYWRpb0J1dHRvbl90ZXh0PVx1YjJlNFx1Yzc0Yw0KLWJhY2t3YXJkUmFkaW9CdXR0b25fdGV4dD1cdWM3NzRcdWM4MDQNCi1maW5kQnV0dG9uX3RleHQ9XHVjYzNlXHVhZTMwDQotcmVwbGFjZUJ1dHRvbl90ZXh0PVx1YmMxNFx1YWZiOFx1YWUzMA0KLXJlcGxhY2VGaW5kQnV0dG9uX3RleHQ9XHViYzE0XHVhZmI4XHVhZTMwL1x1Y2MzZVx1YWUzMA0KLXJlcGxhY2VhbGxCdXR0b25fdGV4dD1cdWJhYThcdWI0NTAgXHViYzE0XHVhZmI4XHVhZTMwDQotIyB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yDQotRmluZFJlcGxhY2VfU3RhdHVzX25vTWF0Y2hfbGFiZWw9XHViYjM4XHVjNzkwXHVjNWY0XHVjNzQ0IFx1Y2MzZVx1Yzc0NCBcdWMyMTggXHVjNWM2XHVjNzRjDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1tYXhDaGFyc1BlckxpbmVMYWJlbF90ZXh0PVx1ZDU4OVx1YjJmOSBcdWNkNWNcdWIzMDAgXHViYjM4XHVjNzkwOg0KLWluZGVudEhUTUxDaGVja2JveF90ZXh0PVx1YjRlNFx1YzVlY1x1YzRmMFx1YWUzMCBIVE1MIFx1ZDBkY1x1YWRmOA0KLWluZGVudFNpemVMYWJlbF90ZXh0PVx1YjRlNFx1YzVlY1x1YzRmMFx1YWUzMCBcdWQwNmNcdWFlMzA6DQotdXJsRGlzcGxheU5hbWVMYWJlbF90ZXh0PVVSTCBcdWQ0NWNcdWMyZGMgXHVjNzc0XHViOTg0Og0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1MDI2MDguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGb250IFN0eWxlIE5hbWVzDQotZm9udFN0eWxlX25vcm1hbD1Ob3JtYWwgDQotZm9udFN0eWxlX3NlY3Rpb25IZWFkaW5nPVRcdTAwZWR0dWxvIGRhIFNlXHUwMGU3XHUwMGUzbw0KLWZvbnRTdHlsZV9zdWJzZWN0aW9uSGVhZGluZz1UXHUwMGVkdHVsbyBkYSBTdWJzZVx1MDBlN1x1MDBlM28NCi1mb250U3R5bGVfc3ViU3Vic2VjdGlvbkhlYWRpbmc9VFx1MDBlZHR1bG8gZGEgU3ViLXN1YnNlXHUwMGU3XHUwMGUzbw0KLWZvbnRTdHlsZV9xdW90ZT1RdW90ZQ0KLWZvbnRTdHlsZV9jb2RlU2FtcGxlPUFtb3N0cmEgZG8gQ1x1MDBmM2RpZ28NCi0NCi0jIEhUTUwgQmxvY2sgVGFncw0KLWJsb2NrVGFnX3BhcmFncmFwaD1QYXJcdTAwZTFncmFmbw0KLWJsb2NrVGFnX2hlYWRpbmcxPVRcdTAwZWR0dWxvIDENCi1ibG9ja1RhZ19oZWFkaW5nMj1UXHUwMGVkdHVsbyAyDQotYmxvY2tUYWdfaGVhZGluZzM9VFx1MDBlZHR1bG8gMw0KLWJsb2NrVGFnX2hlYWRpbmc0PVRcdTAwZWR0dWxvIDQNCi1ibG9ja1RhZ19oZWFkaW5nNT1UXHUwMGVkdHVsbyA1DQotYmxvY2tUYWdfaGVhZGluZzY9VFx1MDBlZHR1bG8gNg0KLWJsb2NrVGFnX2FkZHJlc3M9RW5kZXJlXHUwMGU3bw0KLWJsb2NrVGFnX3ByZWZvcm1hdHRlZFRleHQ9VGV4dG8gUHJcdTAwZTktZm9ybWF0YWRvDQotDQotIyBIVE1MIEZvbnQgTmFtZXMNCi1mb250TmFtZV9kZWZhdWx0PURlZmF1bHQNCi1mb250TmFtZV9hcmlhbD1BcmlhbA0KLWZvbnROYW1lX2NvdXJpZXJOZXc9Q291cmllciBOZXcNCi1mb250TmFtZV90aW1lc05ld1JvbWFuPVRpbWVzIE5ldyBSb21hbg0KLWZvbnROYW1lX3ZlcmRhbmE9VmVyZGFuYQ0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBUb29sIEJ1dHRvbnMNCi1hZGRIb3Jpem9udGFsQmFyQWN0aW9uX3Rvb2xUaXBUZXh0PUluY2x1aXIgQmFycmEgSG9yaXpvbnRhbA0KLWFkZEltYWdlQWN0aW9uX3Rvb2xUaXBUZXh0PUluY2x1aXIgSW1hZ2VtDQotYWRkTGluZUFjdGlvbl90b29sVGlwVGV4dD1JbmNsdWlyIExpbmhhDQotYWRkTGlua0FjdGlvbl90b29sVGlwVGV4dD1JbmNsdWlyIExpbmsNCi1hZGRPcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dD1JbmNsdWlyIExpc3RhIFNvbGljaXRhZGENCi1hZGRUYWJsZUFjdGlvbl90b29sVGlwVGV4dD1JbmNsdWlyIFRhYmVsYQ0KLWFkZFVub3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQ9SW5jbHVpciBMaXN0YSBOXHUwMGUzbyBTb2xpY2l0YWRhDQotYm9sZEFjdGlvbl90b29sVGlwVGV4dD1OZWdyaXRvDQotY2xlYXJDb250ZW50QWN0aW9uX3Rvb2xUaXBUZXh0PUxpbXBhciBDb250ZVx1MDBmYWRvDQotY29weUFjdGlvbl90b29sVGlwVGV4dD1Db3BpYXINCi1jdXRBY3Rpb25fdG9vbFRpcFRleHQ9UmVjb3J0YXINCi1maW5kUmVwbGFjZUFjdGlvbl90b29sVGlwVGV4dD1Mb2NhbGl6YXIvU3Vic3RpdHVpcg0KLWluZGVudEFjdGlvbl90b29sVGlwVGV4dD1SZWN1YXINCi1pdGFsaWNBY3Rpb25fdG9vbFRpcFRleHQ9SXRcdTAwZTFsaWNvDQotanVzdGlmeUNlbnRlckFjdGlvbl90b29sVGlwVGV4dD1KdXN0aWZpY2FyIGFvIENlbnRybw0KLWp1c3RpZnlGdWxsQWN0aW9uX3Rvb2xUaXBUZXh0PUp1c3RpZmljYXIgVHVkbw0KLWp1c3RpZnlMZWZ0QWN0aW9uX3Rvb2xUaXBUZXh0PUp1c3RpZmljYXIgXHUwMGUwIEVzcXVlcmRhDQotanVzdGlmeVJpZ2h0QWN0aW9uX3Rvb2xUaXBUZXh0PUp1c3RpZmljYXIgXHUwMGUwIERpcmVpdGENCi1vdXRkZW50QWN0aW9uX3Rvb2xUaXBUZXh0PUF2YW5cdTAwZTdvDQotcGFzdGVBY3Rpb25fdG9vbFRpcFRleHQ9Q29sYXINCi1zdWJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQ9U3Vic2NyaXRvDQotc3VwZXJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQ9U29icmVzY3JpdG8NCi11bmRlcmxpbmVBY3Rpb25fdG9vbFRpcFRleHQ9U3VibGluaGFyDQotDQotIyBSaWNoIFRleHQgRWRpdG9yIENvbWJvYm94ZXMNCi1mb250U3R5bGVBY3Rpb25fdG9vbFRpcFRleHQ9Q29uZmlndXJhciBFc3RpbG8gZGUgRm9udGUNCi1ibG9ja1RhZ0FjdGlvbl90b29sVGlwVGV4dD1Db25maWd1cmFyIFRhZyBkZSBCbG9jbw0KLWZvbnROYW1lQWN0aW9uX3Rvb2xUaXBUZXh0PUNvbmZpZ3VyYXIgTm9tZSBkYSBGb250ZQ0KLWZvbnRTaXplQWN0aW9uX3Rvb2xUaXBUZXh0PUNvbmZpZ3VyYXIgVGFtYW5obyBkYSBGb250ZQ0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBDb250ZXh0IE1lbnUgSXRlbXMNCi1jdXRBY3Rpb25fdGV4dD1SZWNvcnRhcg0KLWNvcHlBY3Rpb25fdGV4dD1Db3BpYXINCi1wYXN0ZUFjdGlvbl90ZXh0PUNvbGFyDQotDQotIyBSaWNoIFRleHQgRWRpdG9yIFRhYnMNCi1yaWNoVGV4dFRhYl90ZXh0PVJpY2ggVGV4dA0KLXJpY2hUZXh0VGFiX3Rvb2xUaXBUZXh0PUVkaXRhciBjb250ZVx1MDBmYWRvIGVtIHJpY2ggdGV4dA0KLWh0bWxUYWJfdGV4dD1IVE1MDQotaHRtbFRhYl90b29sVGlwVGV4dD1FZGl0YXIgY29udGVcdTAwZmFkbyBlbSBIVE1MDQotDQotIyBBZGQgRGlhbG9ncw0KLWFkZEltYWdlRGlhbG9nX3RpdGxlPUluY2x1aXIgSW1hZ2VtDQotYWRkTGlua0RpYWxvZ190aXRsZT1JbmNsdWlyIExpbmsNCi1hZGRUYWJsZURpYWxvZ190aXRsZT1JbmNsdWlyIFRhYmVsYQ0KLWZpbmRSZXBsYWNlRGlhbG9nX3RpdGxlPUxvY2FsaXphci9TdWJzdGl0dWlyDQotdXJsTGFiZWxfdGV4dD1VUkw6DQotc3VtbWFyeUxhYmVsX3RleHQ9UmVzdW1vOg0KLWNhcHRpb25MYWJlbF90ZXh0PUxlZ2VuZGE6DQotcm93c0xhYmVsX3RleHQ9TGluaGFzOg0KLWNvbHVtbnNMYWJlbF90ZXh0PUNvbHVuYXM6DQotd2lkdGhMYWJlbF90ZXh0PUxhcmd1cmE6DQotdGFibGVTdHlsZUxhYmVsX3RleHQ9RXN0aWxvOg0KLXRhYmxlSGVhZGVyTm9uZV90ZXh0PVRhYmVsYSBzZW0gY2FiZVx1MDBlN2FsaG8NCi10YWJsZUhlYWRlckNvbHNfdGV4dD1UYWJlbGEgY29tIGNhYmVcdTAwZTdhbGhvcyBkZSBjb2x1bmENCi10YWJsZUhlYWRlclJvd3NfdGV4dD1UYWJlbGEgY29tIGNhYmVcdTAwZTdhbGhvcyBkZSBsaW5oYQ0KLXRhYmxlSGVhZGVyQm90aF90ZXh0PVRhYmVsYSBjb20gY2FiZVx1MDBlN2FsaG9zIGRlIGNvbHVuYSBlIGxpbmhhDQotYnJvd3NlQnV0dG9uX3RleHQ9UHJvY3VyYXIuLi4NCi0NCi0jIENsZWFyIEVkaXRvciBDb250ZW50IERpYWxvZw0KLWNsZWFyQ29udGVudERpYWxvZ190aXRsZT1Db25maXJtYVx1MDBlN1x1MDBlM28gZGUgTGltcGFyIENvbnRlXHUwMGZhZG8gZG8gRWRpdG9yDQotY2xlYXJDb250ZW50RGlhbG9nX3RleHQ9RGVzZWphIHJlYWxtZW50ZSBsaW1wYXIgbyBjb250ZVx1MDBmYWRvIGRlc3RlIGVkaXRvciBkZSByaWNoIHRleHQ/DQotDQotIyBGaW5kL1JlcGxhY2UgRGlhbG9nDQotZmluZExhYmVsX3RleHQ9TG9jYWxpemFyOg0KLXJlcGxhY2VMYWJlbF90ZXh0PVN1YnN0aXR1aXIgcG9yOg0KLW9wdGlvbnNHcm91cF90ZXh0PU9wY2lvbmFpcw0KLWNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0PVNlbnNcdTAwZWR2ZWwgYSBtYWlcdTAwZmFzY3VsYXMgZSBtaW5cdTAwZmFzY3VsYXMNCi13aG9sZVdvcmRDaGVja2JveF90ZXh0PVBhbGF2cmEgaW50ZWlyYQ0KLWRpcmVjdGlvbkdyb3VwX3RleHQ9RGlyZVx1MDBlN1x1MDBlM28NCi1mb3J3YXJkUmFkaW9CdXR0b25fdGV4dD1SZWRpcmVjaW9uYXINCi1iYWNrd2FyZFJhZGlvQnV0dG9uX3RleHQ9UmV0cm9jZWRlcg0KLWZpbmRCdXR0b25fdGV4dD1Mb2NhbGl6YXINCi1yZXBsYWNlQnV0dG9uX3RleHQ9U3Vic3RpdHVpcg0KLXJlcGxhY2VGaW5kQnV0dG9uX3RleHQ9U3Vic3RpdHVpci9Mb2NhbGl6YXINCi1yZXBsYWNlYWxsQnV0dG9uX3RleHQ9U3Vic3RpdHVpciBUdWRvDQotIyB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yDQotRmluZFJlcGxhY2VfU3RhdHVzX25vTWF0Y2hfbGFiZWw9Q2FkZWlhIE5cdTAwZTNvIExvY2FsaXphZGENCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLW1heENoYXJzUGVyTGluZUxhYmVsX3RleHQ9TVx1MDBlMXhpbW8gZGUgY2FyYWN0ZXJlcyBwb3IgbGluaGE6DQotaW5kZW50SFRNTENoZWNrYm94X3RleHQ9VGFncyBkZSBSZWN1byBIVE1MDQotaW5kZW50U2l6ZUxhYmVsX3RleHQ9VGFtYW5obyBkbyBSZWN1bzoNCi11cmxEaXNwbGF5TmFtZUxhYmVsX3RleHQ9Tm9tZSBkZSBFeGliaVx1MDBlN1x1MDBlM28gZGEgVVJMOg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkMjY0NzguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGb250IFN0eWxlIE5hbWVzDQotZm9udFN0eWxlX25vcm1hbD1cdTVlMzhcdTg5YzQNCi1mb250U3R5bGVfc2VjdGlvbkhlYWRpbmc9XHU4MjgyXHU2ODA3XHU5ODk4DQotZm9udFN0eWxlX3N1YnNlY3Rpb25IZWFkaW5nPVx1NWI1MFx1ODI4Mlx1NjgwN1x1OTg5OA0KLWZvbnRTdHlsZV9zdWJTdWJzZWN0aW9uSGVhZGluZz1cdTViNTBcdTgyODJcdTc2ODRcdTViNTBcdTY4MDdcdTk4OTgNCi1mb250U3R5bGVfcXVvdGU9XHU1ZjE1XHU3NTI4DQotZm9udFN0eWxlX2NvZGVTYW1wbGU9XHU0ZWUzXHU3ODAxXHU2ODM3XHU2NzJjDQotDQotIyBIVE1MIEJsb2NrIFRhZ3MNCi1ibG9ja1RhZ19wYXJhZ3JhcGg9XHU2YmI1DQotYmxvY2tUYWdfaGVhZGluZzE9XHU2ODA3XHU5ODk4IDENCi1ibG9ja1RhZ19oZWFkaW5nMj1cdTY4MDdcdTk4OTggMg0KLWJsb2NrVGFnX2hlYWRpbmczPVx1NjgwN1x1OTg5OCAzDQotYmxvY2tUYWdfaGVhZGluZzQ9XHU2ODA3XHU5ODk4IDQNCi1ibG9ja1RhZ19oZWFkaW5nNT1cdTY4MDdcdTk4OTggNQ0KLWJsb2NrVGFnX2hlYWRpbmc2PVx1NjgwN1x1OTg5OCA2DQotYmxvY2tUYWdfYWRkcmVzcz1cdTU3MzBcdTU3NDANCi1ibG9ja1RhZ19wcmVmb3JtYXR0ZWRUZXh0PVx1OTg4NFx1NTE0OFx1N2YxNlx1NjM5Mlx1NGU4Nlx1NjgzY1x1NWYwZlx1NzY4NFx1NjU4N1x1NjcyYw0KLQ0KLSMgSFRNTCBGb250IE5hbWVzDQotZm9udE5hbWVfZGVmYXVsdD1cdTdmM2FcdTc3MDFcdTUwM2MNCi1mb250TmFtZV9hcmlhbD1BcmlhbA0KLWZvbnROYW1lX2NvdXJpZXJOZXc9Q291cmllciBOZXcNCi1mb250TmFtZV90aW1lc05ld1JvbWFuPVRpbWVzIE5ldyBSb21hbg0KLWZvbnROYW1lX3ZlcmRhbmE9VmVyZGFuYQ0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBUb29sIEJ1dHRvbnMNCi1hZGRIb3Jpem9udGFsQmFyQWN0aW9uX3Rvb2xUaXBUZXh0PVx1NmRmYlx1NTJhMFx1NmMzNFx1NWU3M1x1Njc2MQ0KLWFkZEltYWdlQWN0aW9uX3Rvb2xUaXBUZXh0PVx1NmRmYlx1NTJhMFx1NTZmZVx1NTBjZg0KLWFkZExpbmVBY3Rpb25fdG9vbFRpcFRleHQ9XHU2ZGZiXHU1MmEwXHU4ODRjDQotYWRkTGlua0FjdGlvbl90b29sVGlwVGV4dD1cdTZkZmJcdTUyYTBcdTk0ZmVcdTYzYTUNCi1hZGRPcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dD1cdTZkZmJcdTUyYTBcdTY3MDlcdTVlOGZcdTUyMTdcdTg4NjgNCi1hZGRUYWJsZUFjdGlvbl90b29sVGlwVGV4dD1cdTZkZmJcdTUyYTBcdTg4NjgNCi1hZGRVbm9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1NmRmYlx1NTJhMFx1NjVlMFx1NWU4Zlx1NTIxN1x1ODg2OA0KLWJvbGRBY3Rpb25fdG9vbFRpcFRleHQ9XHU3Yzk3XHU0ZjUzDQotY2xlYXJDb250ZW50QWN0aW9uX3Rvb2xUaXBUZXh0PVx1NmUwNVx1OTY2NFx1NTE4NVx1NWJiOQ0KLWNvcHlBY3Rpb25fdG9vbFRpcFRleHQ9XHU1OTBkXHU1MjM2DQotY3V0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1NTI2YVx1NTIwNw0KLWZpbmRSZXBsYWNlQWN0aW9uX3Rvb2xUaXBUZXh0PVx1NjdlNVx1NjI3ZVx1ZmYwZlx1NjZmZlx1NjM2Mg0KLWluZGVudEFjdGlvbl90b29sVGlwVGV4dD1cdTdmMjlcdThmZGINCi1pdGFsaWNBY3Rpb25fdG9vbFRpcFRleHQ9XHU2NTljXHU0ZjUzDQotanVzdGlmeUNlbnRlckFjdGlvbl90b29sVGlwVGV4dD1cdTVjNDVcdTRlMmQNCi1qdXN0aWZ5RnVsbEFjdGlvbl90b29sVGlwVGV4dD1cdTVkZTZcdTUzZjNcdTViZjlcdTlmNTANCi1qdXN0aWZ5TGVmdEFjdGlvbl90b29sVGlwVGV4dD1cdTVkZTZcdTViZjlcdTlmNTANCi1qdXN0aWZ5UmlnaHRBY3Rpb25fdG9vbFRpcFRleHQ9XHU1M2YzXHU1YmY5XHU5ZjUwDQotb3V0ZGVudEFjdGlvbl90b29sVGlwVGV4dD1cdTdhODFcdTUxZmENCi1wYXN0ZUFjdGlvbl90b29sVGlwVGV4dD1cdTdjOThcdThkMzQNCi1zdWJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQ9XHU0ZTBiXHU2ODA3DQotc3VwZXJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQ9XHU0ZTBhXHU2ODA3DQotdW5kZXJsaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PVx1NGUwYlx1NTIxMlx1N2ViZg0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBDb21ib2JveGVzDQotZm9udFN0eWxlQWN0aW9uX3Rvb2xUaXBUZXh0PVx1OGJiZVx1N2Y2ZVx1NWI1N1x1NGY1M1x1NjgzN1x1NWYwZg0KLWJsb2NrVGFnQWN0aW9uX3Rvb2xUaXBUZXh0PVx1OGJiZVx1N2Y2ZVx1NTc1N1x1NjgwN1x1OGJiMA0KLWZvbnROYW1lQWN0aW9uX3Rvb2xUaXBUZXh0PVx1OGJiZVx1N2Y2ZVx1NWI1N1x1NGY1M1x1NTQwZFx1NzlmMA0KLWZvbnRTaXplQWN0aW9uX3Rvb2xUaXBUZXh0PVx1OGJiZVx1N2Y2ZVx1NWI1N1x1NGY1M1x1NTkyN1x1NWMwZg0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBDb250ZXh0IE1lbnUgSXRlbXMNCi1jdXRBY3Rpb25fdGV4dD1cdTUyNmFcdTUyMDcNCi1jb3B5QWN0aW9uX3RleHQ9XHU1OTBkXHU1MjM2DQotcGFzdGVBY3Rpb25fdGV4dD1cdTdjOThcdThkMzQNCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgVGFicw0KLXJpY2hUZXh0VGFiX3RleHQ9XHU1YmNjXHU2NTg3XHU2NzJjXHU2ODNjXHU1ZjBmDQotcmljaFRleHRUYWJfdG9vbFRpcFRleHQ9XHU0ZWU1XHU1YmNjXHU2NTg3XHU2NzJjXHU2ODNjXHU1ZjBmXHU3ZjE2XHU4ZjkxXHU1MTg1XHU1YmI5DQotaHRtbFRhYl90ZXh0PUhUTUwNCi1odG1sVGFiX3Rvb2xUaXBUZXh0PVx1NGVlNSBIVE1MIFx1NjgzY1x1NWYwZlx1N2YxNlx1OGY5MVx1NTE4NVx1NWJiOQ0KLQ0KLSMgQWRkIERpYWxvZ3MNCi1hZGRJbWFnZURpYWxvZ190aXRsZT1cdTZkZmJcdTUyYTBcdTU2ZmVcdTUwY2YNCi1hZGRMaW5rRGlhbG9nX3RpdGxlPVx1NmRmYlx1NTJhMFx1OTRmZVx1NjNhNQ0KLWFkZFRhYmxlRGlhbG9nX3RpdGxlPVx1NmRmYlx1NTJhMFx1ODg2OA0KLWZpbmRSZXBsYWNlRGlhbG9nX3RpdGxlPVx1NjdlNVx1NjI3ZVx1ZmYwZlx1NjZmZlx1NjM2Mg0KLXVybExhYmVsX3RleHQ9VVJMXHVmZjFhDQotc3VtbWFyeUxhYmVsX3RleHQ9XHU2NDU4XHU4OTgxXHVmZjFhDQotY2FwdGlvbkxhYmVsX3RleHQ9XHU2NTg3XHU1YjU3XHU4YmY0XHU2NjBlXHVmZjFhDQotcm93c0xhYmVsX3RleHQ9XHU4ODRjXHVmZjFhDQotY29sdW1uc0xhYmVsX3RleHQ9XHU1MjE3XHVmZjFhDQotd2lkdGhMYWJlbF90ZXh0PVx1NWJiZFx1NWVhNlx1ZmYxYQ0KLXRhYmxlU3R5bGVMYWJlbF90ZXh0PVx1NjgzN1x1NWYwZlx1ZmYxYQ0KLXRhYmxlSGVhZGVyTm9uZV90ZXh0PVx1NmNhMVx1NjcwOVx1NjgwN1x1OTg5OFx1NzY4NFx1ODg2OA0KLXRhYmxlSGVhZGVyQ29sc190ZXh0PVx1NWUyNlx1NjcwOVx1NTIxN1x1NjgwN1x1OTg5OFx1NzY4NFx1ODg2OA0KLXRhYmxlSGVhZGVyUm93c190ZXh0PVx1NWUyNlx1NjcwOVx1ODg0Y1x1NjgwN1x1OTg5OFx1NzY4NFx1ODg2OA0KLXRhYmxlSGVhZGVyQm90aF90ZXh0PVx1NWUyNlx1NjcwOVx1NTIxN1x1NjgwN1x1OTg5OFx1NTQ4Y1x1ODg0Y1x1NjgwN1x1OTg5OFx1NzY4NFx1ODg2OA0KLWJyb3dzZUJ1dHRvbl90ZXh0PVx1NmQ0Zlx1ODljOC4uLg0KLQ0KLSMgQ2xlYXIgRWRpdG9yIENvbnRlbnQgRGlhbG9nDQotY2xlYXJDb250ZW50RGlhbG9nX3RpdGxlPVx1NmUwNVx1OTY2NFx1N2YxNlx1OGY5MVx1NTY2OFx1NTE4NVx1NWJiOVx1Nzg2ZVx1OGJhNA0KLWNsZWFyQ29udGVudERpYWxvZ190ZXh0PVx1Nzg2ZVx1NWI5ZVx1ODk4MVx1NmUwNVx1OTY2NFx1NmI2NFx1NWJjY1x1NjU4N1x1NjcyY1x1NjgzY1x1NWYwZlx1N2YxNlx1OGY5MVx1NTY2OFx1NzY4NFx1NTE4NVx1NWJiOVx1NTQxN1x1ZmYxZg0KLQ0KLSMgRmluZC9SZXBsYWNlIERpYWxvZw0KLWZpbmRMYWJlbF90ZXh0PVx1NjdlNVx1NjI3ZVx1ZmYxYQ0KLXJlcGxhY2VMYWJlbF90ZXh0PVx1NjZmZlx1NjM2Mlx1NGUzYVx1ZmYxYQ0KLW9wdGlvbnNHcm91cF90ZXh0PVx1OTAwOVx1OTg3OQ0KLWNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0PVx1NTMzYVx1NTIwNlx1NTkyN1x1NWMwZlx1NTE5OQ0KLXdob2xlV29yZENoZWNrYm94X3RleHQ9XHU2NTc0XHU4YmNkDQotZGlyZWN0aW9uR3JvdXBfdGV4dD1cdTY1YjlcdTU0MTENCi1mb3J3YXJkUmFkaW9CdXR0b25fdGV4dD1cdTUyNGRcdThmZGINCi1iYWNrd2FyZFJhZGlvQnV0dG9uX3RleHQ9XHU1NDBlXHU5MDAwDQotZmluZEJ1dHRvbl90ZXh0PVx1NjdlNVx1NjI3ZQ0KLXJlcGxhY2VCdXR0b25fdGV4dD1cdTY2ZmZcdTYzNjINCi1yZXBsYWNlRmluZEJ1dHRvbl90ZXh0PVx1NjZmZlx1NjM2Mlx1ZmYwZlx1NjdlNVx1NjI3ZQ0KLXJlcGxhY2VhbGxCdXR0b25fdGV4dD1cdTUxNjhcdTkwZThcdTY2ZmZcdTYzNjINCi0jIHRha2VuIGZyb20gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3INCi1GaW5kUmVwbGFjZV9TdGF0dXNfbm9NYXRjaF9sYWJlbD1cdTYyN2VcdTRlMGRcdTUyMzBcdTViNTdcdTdiMjZcdTRlMzINCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLW1heENoYXJzUGVyTGluZUxhYmVsX3RleHQ9XHU2YmNmXHU4ODRjXHU3Njg0XHU2NzAwXHU1OTI3XHU1YjU3XHU3YjI2XHU2NTcwXHVmZjFhDQotaW5kZW50SFRNTENoZWNrYm94X3RleHQ9SFRNTCBcdTdmMjlcdThmZGJcdTY4MDdcdThiYjANCi1pbmRlbnRTaXplTGFiZWxfdGV4dD1cdTdmMjlcdThmZGJcdTU5MjdcdTVjMGZcdWZmMWENCi11cmxEaXNwbGF5TmFtZUxhYmVsX3RleHQ9VVJMIFx1NjYzZVx1NzkzYVx1NTQwZFx1NzlmMFx1ZmYxYQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ3OGIwMDIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBGb250IFN0eWxlIE5hbWVzDQotZm9udFN0eWxlX25vcm1hbD1cdTZiNjNcdTVlMzgNCi1mb250U3R5bGVfc2VjdGlvbkhlYWRpbmc9XHU1MzQwXHU2YmI1XHU2YTE5XHU5ODRjDQotZm9udFN0eWxlX3N1YnNlY3Rpb25IZWFkaW5nPVx1NWI1MFx1NTM0MFx1NmJiNVx1NmExOVx1OTg0Yw0KLWZvbnRTdHlsZV9zdWJTdWJzZWN0aW9uSGVhZGluZz1cdTZiMjFcdTViNTBcdTUzNDBcdTZiYjVcdTZhMTlcdTk4NGMNCi1mb250U3R5bGVfcXVvdGU9XHU1ZjE1XHU4NjVmDQotZm9udFN0eWxlX2NvZGVTYW1wbGU9XHU3YTBiXHU1ZjBmXHU3OGJjXHU3YmM0XHU0ZjhiDQotDQotIyBIVE1MIEJsb2NrIFRhZ3MNCi1ibG9ja1RhZ19wYXJhZ3JhcGg9XHU2YmI1XHU4NDNkDQotYmxvY2tUYWdfaGVhZGluZzE9XHU2YTE5XHU5ODRjIDENCi1ibG9ja1RhZ19oZWFkaW5nMj1cdTZhMTlcdTk4NGMgMg0KLWJsb2NrVGFnX2hlYWRpbmczPVx1NmExOVx1OTg0YyAzDQotYmxvY2tUYWdfaGVhZGluZzQ9XHU2YTE5XHU5ODRjIDQNCi1ibG9ja1RhZ19oZWFkaW5nNT1cdTZhMTlcdTk4NGMgNQ0KLWJsb2NrVGFnX2hlYWRpbmc2PVx1NmExOVx1OTg0YyA2DQotYmxvY2tUYWdfYWRkcmVzcz1cdTRmNGRcdTU3NDANCi1ibG9ja1RhZ19wcmVmb3JtYXR0ZWRUZXh0PVx1OTgxMFx1NTE0OFx1NjgzY1x1NWYwZlx1NTMxNlx1NzY4NFx1NjU4N1x1NWI1Nw0KLQ0KLSMgSFRNTCBGb250IE5hbWVzDQotZm9udE5hbWVfZGVmYXVsdD1cdTk4MTBcdThhMmRcdTUwM2MNCi1mb250TmFtZV9hcmlhbD1BcmlhbA0KLWZvbnROYW1lX2NvdXJpZXJOZXc9Q291cmllciBOZXcNCi1mb250TmFtZV90aW1lc05ld1JvbWFuPVRpbWVzIE5ldyBSb21hbg0KLWZvbnROYW1lX3ZlcmRhbmE9VmVyZGFuYQ0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBUb29sIEJ1dHRvbnMNCi1hZGRIb3Jpem9udGFsQmFyQWN0aW9uX3Rvb2xUaXBUZXh0PVx1NjViMFx1NTg5ZVx1NmMzNFx1NWU3M1x1OGVmOA0KLWFkZEltYWdlQWN0aW9uX3Rvb2xUaXBUZXh0PVx1NjViMFx1NTg5ZVx1NWY3MVx1NTBjZg0KLWFkZExpbmVBY3Rpb25fdG9vbFRpcFRleHQ9XHU2NWIwXHU1ODllXHU2MzA3XHU0ZWU0XHU4ODRjDQotYWRkTGlua0FjdGlvbl90b29sVGlwVGV4dD1cdTY1YjBcdTU4OWVcdTkzYzhcdTdkNTANCi1hZGRPcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dD1cdTY1YjBcdTU4OWVcdTY3MDlcdTVlOGZcdTZlMDVcdTU1YWUNCi1hZGRUYWJsZUFjdGlvbl90b29sVGlwVGV4dD1cdTY1YjBcdTU4OWVcdTg4NjhcdTY4M2MNCi1hZGRVbm9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1NjViMFx1NTg5ZVx1NzEyMVx1NWU4Zlx1NmUwNVx1NTVhZQ0KLWJvbGRBY3Rpb25fdG9vbFRpcFRleHQ9XHU3Yzk3XHU5YWQ0XHU1YjU3DQotY2xlYXJDb250ZW50QWN0aW9uX3Rvb2xUaXBUZXh0PVx1NmUwNVx1OTY2NFx1NTE2N1x1NWJiOQ0KLWNvcHlBY3Rpb25fdG9vbFRpcFRleHQ9XHU4OTA3XHU4OGZkDQotY3V0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1NTI2YVx1NGUwYg0KLWZpbmRSZXBsYWNlQWN0aW9uX3Rvb2xUaXBUZXh0PVx1NWMwYlx1NjI3ZS9cdTUzZDZcdTRlZTMNCi1pbmRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9XHU3ZTJlXHU2MzkyDQotaXRhbGljQWN0aW9uX3Rvb2xUaXBUZXh0PVx1NjU5Y1x1OWFkNFx1NWI1Nw0KLWp1c3RpZnlDZW50ZXJBY3Rpb25fdG9vbFRpcFRleHQ9XHU5NzYwXHU0ZTJkXHU1YzBkXHU5ZjRhDQotanVzdGlmeUZ1bGxBY3Rpb25fdG9vbFRpcFRleHQ9XHU1ZGU2XHU1M2YzXHU1YzBkXHU5ZjRhDQotanVzdGlmeUxlZnRBY3Rpb25fdG9vbFRpcFRleHQ9XHU5NzYwXHU1ZGU2XHU1YzBkXHU5ZjRhDQotanVzdGlmeVJpZ2h0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1OTc2MFx1NTNmM1x1NWMwZFx1OWY0YQ0KLW91dGRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9XHU1MWY4XHU2MzkyDQotcGFzdGVBY3Rpb25fdG9vbFRpcFRleHQ9XHU4Y2JjXHU0ZTBhDQotc3Vic2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1NGUwYlx1NmExOQ0KLXN1cGVyc2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1NGUwYVx1NmExOQ0KLXVuZGVybGluZUFjdGlvbl90b29sVGlwVGV4dD1cdTVlOTVcdTdkZGENCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgQ29tYm9ib3hlcw0KLWZvbnRTdHlsZUFjdGlvbl90b29sVGlwVGV4dD1cdThhMmRcdTViOWFcdTViNTdcdTU3OGJcdTZhMjNcdTVmMGYNCi1ibG9ja1RhZ0FjdGlvbl90b29sVGlwVGV4dD1cdThhMmRcdTViOWFcdTUzNDBcdTU4NGFcdTZhMTlcdTc5M2ENCi1mb250TmFtZUFjdGlvbl90b29sVGlwVGV4dD1cdThhMmRcdTViOWFcdTViNTdcdTU3OGJcdTU0MGRcdTdhMzENCi1mb250U2l6ZUFjdGlvbl90b29sVGlwVGV4dD1cdThhMmRcdTViOWFcdTViNTdcdTU3OGJcdTU5MjdcdTVjMGYNCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgQ29udGV4dCBNZW51IEl0ZW1zDQotY3V0QWN0aW9uX3RleHQ9XHU1MjZhXHU0ZTBiDQotY29weUFjdGlvbl90ZXh0PVx1ODkwN1x1ODhmZA0KLXBhc3RlQWN0aW9uX3RleHQ9XHU4Y2JjXHU0ZTBhDQotDQotIyBSaWNoIFRleHQgRWRpdG9yIFRhYnMNCi1yaWNoVGV4dFRhYl90ZXh0PVJpY2ggXHU2NTg3XHU1YjU3DQotcmljaFRleHRUYWJfdG9vbFRpcFRleHQ9XHU3ZGU4XHU4ZjJmXHU0ZjdmXHU3NTI4IFJpY2ggXHU2NTg3XHU1YjU3XHU3Njg0XHU1MTY3XHU1YmI5DQotaHRtbFRhYl90ZXh0PUhUTUwNCi1odG1sVGFiX3Rvb2xUaXBUZXh0PVx1N2RlOFx1OGYyZiBIVE1MIFx1NGUyZFx1NzY4NFx1NTE2N1x1NWJiOQ0KLQ0KLSMgQWRkIERpYWxvZ3MNCi1hZGRJbWFnZURpYWxvZ190aXRsZT1cdTY1YjBcdTU4OWVcdTVmNzFcdTUwY2YNCi1hZGRMaW5rRGlhbG9nX3RpdGxlPVx1NjViMFx1NTg5ZVx1OTNjOFx1N2Q1MA0KLWFkZFRhYmxlRGlhbG9nX3RpdGxlPVx1NjViMFx1NTg5ZVx1ODg2OFx1NjgzYw0KLWZpbmRSZXBsYWNlRGlhbG9nX3RpdGxlPVx1NWMwYlx1NjI3ZS9cdTUzZDZcdTRlZTMNCi11cmxMYWJlbF90ZXh0PVVSTFx1ZmYxYQ0KLXN1bW1hcnlMYWJlbF90ZXh0PVx1NjQ1OFx1ODk4MVx1ZmYxYQ0KLWNhcHRpb25MYWJlbF90ZXh0PVx1NmExOVx1OTg0Y1x1ZmYxYQ0KLXJvd3NMYWJlbF90ZXh0PVx1NTIxN1x1ZmYxYQ0KLWNvbHVtbnNMYWJlbF90ZXh0PVx1NmIwNFx1ZmYxYQ0KLXdpZHRoTGFiZWxfdGV4dD1cdTViZWNcdTVlYTZcdWZmMWENCi10YWJsZVN0eWxlTGFiZWxfdGV4dD1cdTZhMjNcdTVmMGZcdWZmMWENCi10YWJsZUhlYWRlck5vbmVfdGV4dD1cdTRlMGRcdTU0MmJcdTZhMTlcdTk4MmRcdTc2ODRcdTg4NjhcdTY4M2MNCi10YWJsZUhlYWRlckNvbHNfdGV4dD1cdTUzMDVcdTU0MmJcdTZhMTlcdTk4MmRcdTc2ODRcdTg4NjhcdTY4M2MNCi10YWJsZUhlYWRlclJvd3NfdGV4dD1cdTRlMGRcdTU0MmJcdTUyMTdcdTZhMTlcdTk4MmRcdTc2ODRcdTg4NjhcdTY4M2MNCi10YWJsZUhlYWRlckJvdGhfdGV4dD1cdTUzMDVcdTU0MmJcdTZiMDRcdTU0OGNcdTUyMTdcdTZhMTlcdTk4MmRcdTc2ODRcdTg4NjhcdTY4M2MNCi1icm93c2VCdXR0b25fdGV4dD1cdTcwMGZcdTg5YmQuLi4NCi0NCi0jIENsZWFyIEVkaXRvciBDb250ZW50IERpYWxvZw0KLWNsZWFyQ29udGVudERpYWxvZ190aXRsZT1cdTc4YmFcdThhOGRcdTZlMDVcdTk2NjRcdTdkZThcdThmMmZcdTU2NjhcdTUxNjdcdTViYjkNCi1jbGVhckNvbnRlbnREaWFsb2dfdGV4dD1cdTYwYThcdTc3MWZcdTc2ODRcdTg5ODFcdTZlMDVcdTk2NjRcdTZiNjQgUmljaCBUZXh0IFx1N2RlOFx1OGYyZlx1NTY2OFx1NzY4NFx1NTE2N1x1NWJiOVx1NTVjZVx1ZmYxZg0KLQ0KLSMgRmluZC9SZXBsYWNlIERpYWxvZw0KLWZpbmRMYWJlbF90ZXh0PVx1NWMwYlx1NjI3ZVx1ZmYxYQ0KLXJlcGxhY2VMYWJlbF90ZXh0PVx1NTNkNlx1NGVlM1x1NzBiYVx1ZmYxYQ0KLW9wdGlvbnNHcm91cF90ZXh0PVx1OTA3OFx1OTgwNQ0KLWNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0PVx1NTM0MFx1NTIwNlx1NTkyN1x1NWMwZlx1NWJlYg0KLXdob2xlV29yZENoZWNrYm94X3RleHQ9XHU1YjhjXHU2NTc0XHU1NWFlXHU1YjU3DQotZGlyZWN0aW9uR3JvdXBfdGV4dD1cdTY1YjlcdTU0MTENCi1mb3J3YXJkUmFkaW9CdXR0b25fdGV4dD1cdTRlMGJcdTRlMDBcdTZiNjUNCi1iYWNrd2FyZFJhZGlvQnV0dG9uX3RleHQ9XHU1ZjgwXHU1NmRlDQotZmluZEJ1dHRvbl90ZXh0PVx1NWMwYlx1NjI3ZQ0KLXJlcGxhY2VCdXR0b25fdGV4dD1cdTUzZDZcdTRlZTMNCi1yZXBsYWNlRmluZEJ1dHRvbl90ZXh0PVx1NTNkNlx1NGVlMy9cdTVjMGJcdTYyN2UNCi1yZXBsYWNlYWxsQnV0dG9uX3RleHQ9XHU1MTY4XHU5MGU4XHU1M2Q2XHU0ZWUzDQotIyB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yDQotRmluZFJlcGxhY2VfU3RhdHVzX25vTWF0Y2hfbGFiZWw9XHU2MjdlXHU0ZTBkXHU1MjMwXHU1YjU3XHU0ZTMyDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1tYXhDaGFyc1BlckxpbmVMYWJlbF90ZXh0PVx1NmJjZlx1ODg0Y1x1NWI1N1x1NTE0M1x1NjU3OFx1NzZlZVx1NGUwYVx1OTY1MFx1ZmYxYQ0KLWluZGVudEhUTUxDaGVja2JveF90ZXh0PVx1N2UyZVx1NjM5MiBIVE1MIFx1NmExOVx1NzkzYQ0KLWluZGVudFNpemVMYWJlbF90ZXh0PVx1N2UyZVx1NjM5Mlx1NTkyN1x1NWMwZlx1ZmYxYQ0KLXVybERpc3BsYXlOYW1lTGFiZWxfdGV4dD1VUkwgXHU5ODZmXHU3OTNhXHU1NDBkXHU3YTMxXHVmZjFhDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMi8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjljMDVmMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDI8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJlNDNjMjUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZnJhZ21lbnROYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NwYXRoOiBubDIuamFyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBmcmFnbWVudAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTAzNjlhMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLm5sMi5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMi5qYXIgPSBiaW4vDQotYmluLmluY2x1ZGVzID0gbmwyLmphcixcDQotICAgICAgICAgICAgICAgcGx1Z2luX3J1LnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgZnJhZ21lbnQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMi9mcmFnbWVudC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyL2ZyYWdtZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJlMmQ2YTYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyL2ZyYWdtZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZyYWdtZW50TmFtZT1FUEYgUmljaCBUZXh0IChOTFMpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYzQ0YjZmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMi9wbHVnaW5fcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gXHUwNDNlXHUwNDQyXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MVx1MDQ0Mg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIFRoZSBIVE1MIGZpbGUgdXNlZCB0byByZW5kZXIgdGhlIFJpY2ggVGV4dCBFZGl0b3IuDQotUmljaFRleHQuZWRpdG9ySFRNTD1ydGUuaHRtDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXNfcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjM5YTM0Ni4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXNfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEZvbnQgU3R5bGUgTmFtZXMNCi1mb250U3R5bGVfbm9ybWFsPVx1MDQxZVx1MDQzMVx1MDQ0Ylx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzOQ0KLWZvbnRTdHlsZV9zZWN0aW9uSGVhZGluZz1cdTA0MTdcdTA0MzBcdTA0MzNcdTA0M2VcdTA0M2JcdTA0M2VcdTA0MzJcdTA0M2VcdTA0M2EgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDMwDQotZm9udFN0eWxlX3N1YnNlY3Rpb25IZWFkaW5nPVx1MDQxN1x1MDQzMFx1MDQzM1x1MDQzZVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzYSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzANCi1mb250U3R5bGVfc3ViU3Vic2VjdGlvbkhlYWRpbmc9XHUwNDE3XHUwNDMwXHUwNDMzXHUwNDNlXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDNhIFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzNFx1MDQzNVx1MDQzYlx1MDQzMCBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzANCi1mb250U3R5bGVfcXVvdGU9XHUwNDI2XHUwNDM4XHUwNDQyXHUwNDMwXHUwNDQyXHUwNDMwDQotZm9udFN0eWxlX2NvZGVTYW1wbGU9XHUwNDFmXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDQwIFx1MDQzYVx1MDQzZVx1MDQzNFx1MDQzMA0KLQ0KLSMgSFRNTCBCbG9jayBUYWdzDQotYmxvY2tUYWdfcGFyYWdyYXBoPVx1MDQxMFx1MDQzMVx1MDQzN1x1MDQzMFx1MDQ0Ng0KLWJsb2NrVGFnX2hlYWRpbmcxPVx1MDQxN1x1MDQzMFx1MDQzM1x1MDQzZVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzYSAxDQotYmxvY2tUYWdfaGVhZGluZzI9XHUwNDE3XHUwNDMwXHUwNDMzXHUwNDNlXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDNhIDINCi1ibG9ja1RhZ19oZWFkaW5nMz1cdTA0MTdcdTA0MzBcdTA0MzNcdTA0M2VcdTA0M2JcdTA0M2VcdTA0MzJcdTA0M2VcdTA0M2EgMw0KLWJsb2NrVGFnX2hlYWRpbmc0PVx1MDQxN1x1MDQzMFx1MDQzM1x1MDQzZVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzYSA0DQotYmxvY2tUYWdfaGVhZGluZzU9XHUwNDE3XHUwNDMwXHUwNDMzXHUwNDNlXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDNhIDUNCi1ibG9ja1RhZ19oZWFkaW5nNj1cdTA0MTdcdTA0MzBcdTA0MzNcdTA0M2VcdTA0M2JcdTA0M2VcdTA0MzJcdTA0M2VcdTA0M2EgNg0KLWJsb2NrVGFnX2FkZHJlc3M9XHUwNDEwXHUwNDM0XHUwNDQwXHUwNDM1XHUwNDQxDQotYmxvY2tUYWdfcHJlZm9ybWF0dGVkVGV4dD1cdTA0MjRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQxXHUwNDQyDQotDQotIyBIVE1MIEZvbnQgTmFtZXMNCi1mb250TmFtZV9kZWZhdWx0PVx1MDQxZlx1MDQzZSBcdTA0NDNcdTA0M2NcdTA0M2VcdTA0M2JcdTA0NDdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGUNCi1mb250TmFtZV9hcmlhbD1BcmlhbA0KLWZvbnROYW1lX2NvdXJpZXJOZXc9Q291cmllciBOZXcNCi1mb250TmFtZV90aW1lc05ld1JvbWFuPVRpbWVzIE5ldyBSb21hbg0KLWZvbnROYW1lX3ZlcmRhbmE9VmVyZGFuYQ0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBUb29sIEJ1dHRvbnMNCi1hZGRIb3Jpem9udGFsQmFyQWN0aW9uX3Rvb2xUaXBUZXh0PVx1MDQxNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzdcdTA0M2VcdTA0M2RcdTA0NDJcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NDNcdTA0NGUgXHUwNDNiXHUwNDM4XHUwNDNkXHUwNDM4XHUwNDRlDQotYWRkSW1hZ2VBY3Rpb25fdG9vbFRpcFRleHQ9XHUwNDEyXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzOFx1MDQzN1x1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLWFkZExpbmVBY3Rpb25fdG9vbFRpcFRleHQ9XHUwNDE0XHUwNDNlXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzYlx1MDQzOFx1MDQzZFx1MDQzOFx1MDQ0ZQ0KLWFkZExpbmtBY3Rpb25fdG9vbFRpcFRleHQ9XHUwNDE0XHUwNDNlXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0MVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQ0Mw0KLWFkZE9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1MDQxNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDNcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NGZcdTA0MzRcdTA0M2VcdTA0NDdcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDQxXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDNlXHUwNDNhDQotYWRkVGFibGVBY3Rpb25fdG9vbFRpcFRleHQ9XHUwNDE0XHUwNDNlXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQ0Mw0KLWFkZFVub3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQ9XHUwNDE0XHUwNDNlXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzZFx1MDQzNVx1MDQ0M1x1MDQzZlx1MDQzZVx1MDQ0MFx1MDQ0Zlx1MDQzNFx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDFcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0M2VcdTA0M2ENCi1ib2xkQWN0aW9uX3Rvb2xUaXBUZXh0PVx1MDQxZlx1MDQzZVx1MDQzYlx1MDQ0M1x1MDQzNlx1MDQzOFx1MDQ0MFx1MDQzZFx1MDQ0Ylx1MDQzOQ0KLWNsZWFyQ29udGVudEFjdGlvbl90b29sVGlwVGV4dD1cdTA0MWVcdTA0NDdcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiDQotY29weUFjdGlvbl90b29sVGlwVGV4dD1cdTA0MjFcdTA0M2FcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMNCi1jdXRBY3Rpb25fdG9vbFRpcFRleHQ9XHUwNDEyXHUwNDRiXHUwNDQwXHUwNDM1XHUwNDM3XHUwNDMwXHUwNDQyXHUwNDRjDQotZmluZFJlcGxhY2VBY3Rpb25fdG9vbFRpcFRleHQ9XHUwNDFkXHUwNDMwXHUwNDM5XHUwNDQyXHUwNDM4L1x1MDQxN1x1MDQzMFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0Yw0KLWluZGVudEFjdGlvbl90b29sVGlwVGV4dD1cdTA0MWVcdTA0NDJcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2YNCi1pdGFsaWNBY3Rpb25fdG9vbFRpcFRleHQ9XHUwNDFhXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDM4XHUwNDMyDQotanVzdGlmeUNlbnRlckFjdGlvbl90b29sVGlwVGV4dD1cdTA0MWZcdTA0M2UgXHUwNDQ2XHUwNDM1XHUwNDNkXHUwNDQyXHUwNDQwXHUwNDQzDQotanVzdGlmeUZ1bGxBY3Rpb25fdG9vbFRpcFRleHQ9XHUwNDFmXHUwNDNlIFx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzOFx1MDQzZFx1MDQzNQ0KLWp1c3RpZnlMZWZ0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1MDQxZlx1MDQzZSBcdTA0M2JcdTA0MzVcdTA0MzJcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDRlDQotanVzdGlmeVJpZ2h0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1MDQxZlx1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2VcdTA0M2NcdTA0NDMgXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDRlDQotb3V0ZGVudEFjdGlvbl90b29sVGlwVGV4dD1cdTA0MjNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGNcdTA0NDhcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNlXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmDQotcGFzdGVBY3Rpb25fdG9vbFRpcFRleHQ9XHUwNDEyXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjDQotc3Vic2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0PVx1MDQxZFx1MDQzOFx1MDQzNlx1MDQzZFx1MDQzOFx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0MzRcdTA0MzVcdTA0M2FcdTA0NDENCi1zdXBlcnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dD1cdTA0MTJcdTA0MzVcdTA0NDBcdTA0NDVcdTA0M2RcdTA0MzhcdTA0MzkgXHUwNDM4XHUwNDNkXHUwNDM0XHUwNDM1XHUwNDNhXHUwNDQxDQotdW5kZXJsaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PVx1MDQxZlx1MDQzZVx1MDQzNFx1MDQ0N1x1MDQzNVx1MDQ0MFx1MDQzYVx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNQ0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBDb21ib2JveGVzDQotZm9udFN0eWxlQWN0aW9uX3Rvb2xUaXBUZXh0PVx1MDQyMVx1MDQ0Mlx1MDQzOFx1MDQzYlx1MDQ0YyBcdTA0NDhcdTA0NDBcdTA0MzhcdTA0NDRcdTA0NDJcdTA0MzANCi1ibG9ja1RhZ0FjdGlvbl90b29sVGlwVGV4dD1cdTA0MjJcdTA0MzVcdTA0MzMgXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNhXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDNhXHUwNDM4DQotZm9udE5hbWVBY3Rpb25fdG9vbFRpcFRleHQ9XHUwNDE4XHUwNDNjXHUwNDRmIFx1MDQ0OFx1MDQ0MFx1MDQzOFx1MDQ0NFx1MDQ0Mlx1MDQzMA0KLWZvbnRTaXplQWN0aW9uX3Rvb2xUaXBUZXh0PVx1MDQyMFx1MDQzMFx1MDQzN1x1MDQzY1x1MDQzNVx1MDQ0MCBcdTA0NDhcdTA0NDBcdTA0MzhcdTA0NDRcdTA0NDJcdTA0MzANCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgQ29udGV4dCBNZW51IEl0ZW1zDQotY3V0QWN0aW9uX3RleHQ9XHUwNDEyXHUwNDRiXHUwNDQwXHUwNDM1XHUwNDM3XHUwNDMwXHUwNDQyXHUwNDRjDQotY29weUFjdGlvbl90ZXh0PVx1MDQyMVx1MDQzYVx1MDQzZVx1MDQzZlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0Yw0KLXBhc3RlQWN0aW9uX3RleHQ9XHUwNDEyXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjDQotDQotIyBSaWNoIFRleHQgRWRpdG9yIFRhYnMNCi1yaWNoVGV4dFRhYl90ZXh0PVx1MDQyNFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDFcdTA0NDINCi1yaWNoVGV4dFRhYl90b29sVGlwVGV4dD1cdTA0MjBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiIFx1MDQzMiBcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzUgUlRGDQotaHRtbFRhYl90ZXh0PUhUTUwNCi1odG1sVGFiX3Rvb2xUaXBUZXh0PVx1MDQyMFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0NGIgXHUwNDMyIFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNSBIVE1MDQotDQotIyBBZGQgRGlhbG9ncw0KLWFkZEltYWdlRGlhbG9nX3RpdGxlPVx1MDQxMlx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzhcdTA0MzdcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1hZGRMaW5rRGlhbG9nX3RpdGxlPVx1MDQxNFx1MDQzZVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0NDMNCi1hZGRUYWJsZURpYWxvZ190aXRsZT1cdTA0MTRcdTA0M2VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDQyXHUwNDMwXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDQ2XHUwNDQzDQotZmluZFJlcGxhY2VEaWFsb2dfdGl0bGU9XHUwNDFkXHUwNDMwXHUwNDM5XHUwNDQyXHUwNDM4L1x1MDQxN1x1MDQzMFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0Yw0KLXVybExhYmVsX3RleHQ9VVJMOg0KLXN1bW1hcnlMYWJlbF90ZXh0PVx1MDQxZVx1MDQzMVx1MDQzN1x1MDQzZVx1MDQ0MDoNCi1jYXB0aW9uTGFiZWxfdGV4dD1cdTA0MWRcdTA0MzBcdTA0MzdcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzU6DQotcm93c0xhYmVsX3RleHQ9XHUwNDIxXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDNhXHUwNDM4Og0KLWNvbHVtbnNMYWJlbF90ZXh0PVx1MDQyMVx1MDQ0Mlx1MDQzZVx1MDQzYlx1MDQzMVx1MDQ0Nlx1MDQ0YjoNCi13aWR0aExhYmVsX3RleHQ9XHUwNDI4XHUwNDM4XHUwNDQwXHUwNDM4XHUwNDNkXHUwNDMwOg0KLXRhYmxlU3R5bGVMYWJlbF90ZXh0PVx1MDQyMVx1MDQ0Mlx1MDQzOFx1MDQzYlx1MDQ0YzoNCi10YWJsZUhlYWRlck5vbmVfdGV4dD1cdTA0MjJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0MzAgXHUwNDMxXHUwNDM1XHUwNDM3IFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQzZVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQzYVx1MDQzZVx1MDQzMg0KLXRhYmxlSGVhZGVyQ29sc190ZXh0PVx1MDQyMlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQzMCBcdTA0NDEgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDNlXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDNhXHUwNDMwXHUwNDNjXHUwNDM4IFx1MDQ0MVx1MDQ0Mlx1MDQzZVx1MDQzYlx1MDQzMVx1MDQ0Nlx1MDQzZVx1MDQzMg0KLXRhYmxlSGVhZGVyUm93c190ZXh0PVx1MDQyMlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQzMCBcdTA0NDEgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDNlXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDNhXHUwNDMwXHUwNDNjXHUwNDM4IFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzYQ0KLXRhYmxlSGVhZGVyQm90aF90ZXh0PVx1MDQyMlx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQzMCBcdTA0NDEgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDNlXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDNhXHUwNDMwXHUwNDNjXHUwNDM4IFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzYSBcdTA0MzggXHUwNDQxXHUwNDQyXHUwNDNlXHUwNDNiXHUwNDMxXHUwNDQ2XHUwNDNlXHUwNDMyDQotYnJvd3NlQnV0dG9uX3RleHQ9XHUwNDFlXHUwNDMxXHUwNDM3XHUwNDNlXHUwNDQwLi4uDQotDQotIyBDbGVhciBFZGl0b3IgQ29udGVudCBEaWFsb2cNCi1jbGVhckNvbnRlbnREaWFsb2dfdGl0bGU9XHUwNDFmXHUwNDNlXHUwNDM0XHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0NDJcdTA0MzVcdTA0M2FcdTA0NDFcdTA0NDJcdTA0MzAgXHUwNDMyIFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzNQ0KLWNsZWFyQ29udGVudERpYWxvZ190ZXh0PVx1MDQxMlx1MDQ0YiBcdTA0MzRcdTA0MzVcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0M2UgXHUwNDQ1XHUwNDNlXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0MzVcdTA0NDFcdTA0NGMgXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQxXHUwNDQyIFx1MDQzOFx1MDQzNyBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M2FcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzA/DQotDQotIyBGaW5kL1JlcGxhY2UgRGlhbG9nDQotZmluZExhYmVsX3RleHQ9XHUwNDFkXHUwNDMwXHUwNDM5XHUwNDQyXHUwNDM4Og0KLXJlcGxhY2VMYWJlbF90ZXh0PVx1MDQxN1x1MDQzMFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0YyBcdTA0M2RcdTA0MzA6DQotb3B0aW9uc0dyb3VwX3RleHQ9XHUwNDFmXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDQwXHUwNDRiDQotY2FzZVNlbnNpdGl2ZUNoZWNrYm94X3RleHQ9XHUwNDIxIFx1MDQ0M1x1MDQ0N1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzYyBcdTA0NDBcdTA0MzVcdTA0MzNcdTA0MzhcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzANCi13aG9sZVdvcmRDaGVja2JveF90ZXh0PVx1MDQyNlx1MDQzNVx1MDQzYlx1MDQzZVx1MDQzNSBcdTA0NDFcdTA0M2JcdTA0M2VcdTA0MzJcdTA0M2UNCi1kaXJlY3Rpb25Hcm91cF90ZXh0PVx1MDQxZFx1MDQzMFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLWZvcndhcmRSYWRpb0J1dHRvbl90ZXh0PVx1MDQxMlx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNA0KLWJhY2t3YXJkUmFkaW9CdXR0b25fdGV4dD1cdTA0MWRcdTA0MzBcdTA0MzdcdTA0MzBcdTA0MzQNCi1maW5kQnV0dG9uX3RleHQ9XHUwNDFkXHUwNDMwXHUwNDM5XHUwNDQyXHUwNDM4DQotcmVwbGFjZUJ1dHRvbl90ZXh0PVx1MDQxN1x1MDQzMFx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQ0Yw0KLXJlcGxhY2VGaW5kQnV0dG9uX3RleHQ9XHUwNDFmXHUwNDNlXHUwNDM4XHUwNDQxXHUwNDNhIFx1MDQzOCBcdTA0MzdcdTA0MzBcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzANCi1yZXBsYWNlYWxsQnV0dG9uX3RleHQ9XHUwNDE3XHUwNDMwXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDQyXHUwNDRjIFx1MDQzMlx1MDQ0MVx1MDQzNQ0KLSMgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcg0KLUZpbmRSZXBsYWNlX1N0YXR1c19ub01hdGNoX2xhYmVsPVx1MDQyMVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzYVx1MDQzMCBcdTA0M2RcdTA0MzUgXHUwNDNkXHUwNDMwXHUwNDM5XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDMwDQotDQotIyBQcmVmZXJlbmNlIFBhZ2UNCi1tYXhDaGFyc1BlckxpbmVMYWJlbF90ZXh0PVx1MDQyN1x1MDQzOFx1MDQ0MVx1MDQzYlx1MDQzZSBcdTA0NDFcdTA0MzhcdTA0M2NcdTA0MzJcdTA0M2VcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDMyIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzYVx1MDQzNToNCi1pbmRlbnRIVE1MQ2hlY2tib3hfdGV4dD1cdTA0MWVcdTA0NDJcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M2YgXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDMyIEhUTUwNCi1pbmRlbnRTaXplTGFiZWxfdGV4dD1cdTA0MjBcdTA0MzBcdTA0MzdcdTA0M2NcdTA0MzVcdTA0NDAgXHUwNDNlXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNmXHUwNDMwOg0KLXVybERpc3BsYXlOYW1lTGFiZWxfdGV4dD1cdTA0MWVcdTA0NDJcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzBcdTA0MzVcdTA0M2NcdTA0M2VcdTA0MzUgXHUwNDM4XHUwNDNjXHUwNDRmIFVSTDoNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDJhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMmEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1OTEyMzAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzUzOGI2Mi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZnJhZ21lbnROYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwyYS5qYXIKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGZyYWdtZW50Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDJhL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDJhL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY3ZTU0YzEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UubmwyYS5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMmEuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IG5sMmEuamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYS9mcmFnbWVudC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYS9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZTJkNmE2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMmEvZnJhZ21lbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZnJhZ21lbnROYW1lPUVQRiBSaWNoIFRleHQgKE5MUykNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGEzODE1NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgUmljaCBUZXh0DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISENCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgVGhlIEhUTUwgZmlsZSB1c2VkIHRvIHJlbmRlciB0aGUgUmljaCBUZXh0IEVkaXRvci4NCi1SaWNoVGV4dC5lZGl0b3JIVE1MPXJ0ZS5odG0NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwZTg1MDIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgRm9udCBTdHlsZSBOYW1lcw0KLWZvbnRTdHlsZV9ub3JtYWw9Tm9ybWFsDQotZm9udFN0eWxlX3NlY3Rpb25IZWFkaW5nPUFmc25pdHNvdmVyc2tyaWZ0DQotZm9udFN0eWxlX3N1YnNlY3Rpb25IZWFkaW5nPVVuZGVyYWZzbml0c292ZXJza3JpZnQNCi1mb250U3R5bGVfc3ViU3Vic2VjdGlvbkhlYWRpbmc9VW5kZXJ1bmRlcmFmc25pdHNvdmVyc2tyaWZ0DQotZm9udFN0eWxlX3F1b3RlPUFuZlx1MDBmOHJzZWxzdGVnbg0KLWZvbnRTdHlsZV9jb2RlU2FtcGxlPUtvZGVla3NlbXBlbA0KLQ0KLSMgSFRNTCBCbG9jayBUYWdzDQotYmxvY2tUYWdfcGFyYWdyYXBoPUFmc25pdA0KLWJsb2NrVGFnX2hlYWRpbmcxPU92ZXJza3JpZnQgMQ0KLWJsb2NrVGFnX2hlYWRpbmcyPU92ZXJza3JpZnQgMg0KLWJsb2NrVGFnX2hlYWRpbmczPU92ZXJza3JpZnQgMw0KLWJsb2NrVGFnX2hlYWRpbmc0PU92ZXJza3JpZnQgNA0KLWJsb2NrVGFnX2hlYWRpbmc1PU92ZXJza3JpZnQgNQ0KLWJsb2NrVGFnX2hlYWRpbmc2PU92ZXJza3JpZnQgNg0KLWJsb2NrVGFnX2FkZHJlc3M9QWRyZXNzZQ0KLWJsb2NrVGFnX3ByZWZvcm1hdHRlZFRleHQ9UHJcdTAwZTZmb3JtYXRlcmV0IHRla3N0DQotDQotIyBIVE1MIEZvbnQgTmFtZXMNCi1mb250TmFtZV9kZWZhdWx0PVN0YW5kYXJkDQotZm9udE5hbWVfYXJpYWw9QXJpYWwNCi1mb250TmFtZV9jb3VyaWVyTmV3PUNvdXJpZXIgTmV3DQotZm9udE5hbWVfdGltZXNOZXdSb21hbj1UaW1lcyBOZXcgUm9tYW4NCi1mb250TmFtZV92ZXJkYW5hPVZlcmRhbmENCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgVG9vbCBCdXR0b25zDQotYWRkSG9yaXpvbnRhbEJhckFjdGlvbl90b29sVGlwVGV4dD1UaWxmXHUwMGY4aiB2YW5kcmV0IGxpbmplDQotYWRkSW1hZ2VBY3Rpb25fdG9vbFRpcFRleHQ9VGlsZlx1MDBmOGogYmlsbGVkZQ0KLWFkZExpbmVBY3Rpb25fdG9vbFRpcFRleHQ9VGlsZlx1MDBmOGogbGluamUNCi1hZGRMaW5rQWN0aW9uX3Rvb2xUaXBUZXh0PVRpbGZcdTAwZjhqIGxpbmsNCi1hZGRPcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dD1UaWxmXHUwMGY4aiBzb3J0ZXJldCBsaXN0ZQ0KLWFkZFRhYmxlQWN0aW9uX3Rvb2xUaXBUZXh0PVRpbGZcdTAwZjhqIHRhYmVsDQotYWRkVW5vcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dD1UaWxmXHUwMGY4aiBpa2tlLXNvcnRlcmV0IGxpc3RlDQotYm9sZEFjdGlvbl90b29sVGlwVGV4dD1GZWQNCi1jbGVhckNvbnRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9UnlkIGluZGhvbGQNCi1jb3B5QWN0aW9uX3Rvb2xUaXBUZXh0PUtvcGlcdTAwZTlyDQotY3V0QWN0aW9uX3Rvb2xUaXBUZXh0PUtsaXANCi1maW5kUmVwbGFjZUFjdGlvbl90b29sVGlwVGV4dD1TXHUwMGY4Zy9lcnN0YXQNCi1pbmRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9SW5kcnlrDQotaXRhbGljQWN0aW9uX3Rvb2xUaXBUZXh0PUt1cnNpdg0KLWp1c3RpZnlDZW50ZXJBY3Rpb25fdG9vbFRpcFRleHQ9Q2VudHJlcmV0DQotanVzdGlmeUZ1bGxBY3Rpb25fdG9vbFRpcFRleHQ9RnVsZHQganVzdGVyZXQNCi1qdXN0aWZ5TGVmdEFjdGlvbl90b29sVGlwVGV4dD1WZW5zdHJlanVzdGVyZXQNCi1qdXN0aWZ5UmlnaHRBY3Rpb25fdG9vbFRpcFRleHQ9SFx1MDBmOGpyZWp1c3RlcmV0DQotb3V0ZGVudEFjdGlvbl90b29sVGlwVGV4dD1SeWsgdWQNCi1wYXN0ZUFjdGlvbl90b29sVGlwVGV4dD1LbGlzdHJlDQotc3Vic2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0PVNcdTAwZTZua2V0DQotc3VwZXJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQ9SFx1MDBlNnZldA0KLXVuZGVybGluZUFjdGlvbl90b29sVGlwVGV4dD1VbmRlcnN0cmVnZXQNCi0NCi0jIFJpY2ggVGV4dCBFZGl0b3IgQ29tYm9ib3hlcw0KLWZvbnRTdHlsZUFjdGlvbl90b29sVGlwVGV4dD1BbmdpdiBmb250dHlwb2dyYWZpDQotYmxvY2tUYWdBY3Rpb25fdG9vbFRpcFRleHQ9QW5naXYgYmxva2tvZGUNCi1mb250TmFtZUFjdGlvbl90b29sVGlwVGV4dD1BbmdpdiBmb250bmF2bg0KLWZvbnRTaXplQWN0aW9uX3Rvb2xUaXBUZXh0PUFuZ2l2IGZvbnRzdFx1MDBmOHJyZWxzZQ0KLQ0KLSMgUmljaCBUZXh0IEVkaXRvciBDb250ZXh0IE1lbnUgSXRlbXMNCi1jdXRBY3Rpb25fdGV4dD1LbGlwDQotY29weUFjdGlvbl90ZXh0PUtvcGlcdTAwZTlyDQotcGFzdGVBY3Rpb25fdGV4dD1LbGlzdHJlDQotDQotIyBSaWNoIFRleHQgRWRpdG9yIFRhYnMNCi1yaWNoVGV4dFRhYl90ZXh0PVJpY2ggVGV4dA0KLXJpY2hUZXh0VGFiX3Rvb2xUaXBUZXh0PVJlZGlnXHUwMGU5ciBpbmRob2xkIGkgUmljaCBUZXh0DQotaHRtbFRhYl90ZXh0PUhUTUwNCi1odG1sVGFiX3Rvb2xUaXBUZXh0PVJlZGlnXHUwMGU5ciBpbmRob2xkIGkgSFRNTA0KLQ0KLSMgQWRkIERpYWxvZ3MNCi1hZGRJbWFnZURpYWxvZ190aXRsZT1UaWxmXHUwMGY4aiBiaWxsZWRlDQotYWRkTGlua0RpYWxvZ190aXRsZT1UaWxmXHUwMGY4aiBsaW5rDQotYWRkVGFibGVEaWFsb2dfdGl0bGU9VGlsZlx1MDBmOGogdGFiZWwNCi1maW5kUmVwbGFjZURpYWxvZ190aXRsZT1TXHUwMGY4Zy9lcnN0YXQNCi11cmxMYWJlbF90ZXh0PVVSTDoNCi1zdW1tYXJ5TGFiZWxfdGV4dD1PdmVyc2lndDoNCi1jYXB0aW9uTGFiZWxfdGV4dD1PdmVyc2tyaWZ0Og0KLXJvd3NMYWJlbF90ZXh0PVJcdTAwZTZra2VyOg0KLWNvbHVtbnNMYWJlbF90ZXh0PUtvbG9ubmVyOg0KLXdpZHRoTGFiZWxfdGV4dD1CcmVkZGU6DQotdGFibGVTdHlsZUxhYmVsX3RleHQ9VHlwZToNCi10YWJsZUhlYWRlck5vbmVfdGV4dD1UYWJlbCB1ZGVuIHRvcHRla3N0ZXINCi10YWJsZUhlYWRlckNvbHNfdGV4dD1UYWJlbCBtZWQgdG9wdGVrc3Rlcg0KLXRhYmxlSGVhZGVyUm93c190ZXh0PVRhYmVsIG1lZCByXHUwMGU2a2tldG9wdGVrc3Rlcg0KLXRhYmxlSGVhZGVyQm90aF90ZXh0PVRhYmVsIG1lZCBrb2xvbm5lLSBvZyByXHUwMGU2a2tldG9wdGVrc3Rlcg0KLWJyb3dzZUJ1dHRvbl90ZXh0PUdlbm5lbXNlLi4uDQotDQotIyBDbGVhciBFZGl0b3IgQ29udGVudCBEaWFsb2cNCi1jbGVhckNvbnRlbnREaWFsb2dfdGl0bGU9QmVrclx1MDBlNmZ0IHJ5ZG5pbmcgYWYgZWRpdG9yaW5kaG9sZA0KLWNsZWFyQ29udGVudERpYWxvZ190ZXh0PVZpbCBkdSByeWRkZSBpbmRob2xkZXQgYWYgZGVubmUgUmljaCBUZXh0LWVkaXRvcj8NCi0NCi0jIEZpbmQvUmVwbGFjZSBEaWFsb2cNCi1maW5kTGFiZWxfdGV4dD1GaW5kOg0KLXJlcGxhY2VMYWJlbF90ZXh0PUVyc3RhdCBtZWQ6DQotb3B0aW9uc0dyb3VwX3RleHQ9SW5kc3RpbGxpbmdlcg0KLWNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0PUZvcnNrZWwgcFx1MDBlNSBzdG9yZS9zbVx1MDBlNSBib2dzdGF2ZXINCi13aG9sZVdvcmRDaGVja2JveF90ZXh0PUhlbGUgb3JkDQotZGlyZWN0aW9uR3JvdXBfdGV4dD1SZXRuaW5nDQotZm9yd2FyZFJhZGlvQnV0dG9uX3RleHQ9RnJlbQ0KLWJhY2t3YXJkUmFkaW9CdXR0b25fdGV4dD1UaWxiYWdlDQotZmluZEJ1dHRvbl90ZXh0PVNcdTAwZjhnDQotcmVwbGFjZUJ1dHRvbl90ZXh0PUVyc3RhdA0KLXJlcGxhY2VGaW5kQnV0dG9uX3RleHQ9U1x1MDBmOGcvZXJzdGF0DQotcmVwbGFjZWFsbEJ1dHRvbl90ZXh0PUVyc3RhdCBhbGxlDQotIyB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yDQotRmluZFJlcGxhY2VfU3RhdHVzX25vTWF0Y2hfbGFiZWw9U3RyZW5nZW4gZmluZGVzIGlra2UNCi0NCi0jIFByZWZlcmVuY2UgUGFnZQ0KLW1heENoYXJzUGVyTGluZUxhYmVsX3RleHQ9TWFrcy4gYW50YWwgdGVnbiBwci4gbGluamU6DQotaW5kZW50SFRNTENoZWNrYm94X3RleHQ9SW5kcnlrIEhUTUwta29kZXINCi1pbmRlbnRTaXplTGFiZWxfdGV4dD1JbmRyeWtuaW5nc3N0XHUwMGY4cnJlbHNlOg0KLXVybERpc3BsYXlOYW1lTGFiZWxfdGV4dD1VUkwtZnJlbXZpc25pbmdzbmF2bjoNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDViOTdjZDQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2UyMjlkOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgU2VhcmNoIChOTDEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZTdiMDEyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MGRlMzlhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIFN1Y2hlDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1NzcwMjcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9Qlx1MDBmYXNxdWVkYSBkZSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9wbHVnaW5fZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTFmMDJkMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1SZWNoZXJjaGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9wbHVnaW5faXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhjMGFkMjguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9wbHVnaW5faXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9UmljZXJjYSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9wbHVnaW5famEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmExODA5MC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgU2VhcmNoDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY5MDI0YmIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFx1YWM4MFx1YzBjOQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNjk1YzIxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVByb2N1cmEgZG8gRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiMWY4OTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFx1NjQxY1x1N2QyMg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYTE4MDkwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBTZWFyY2gNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGFhNThiNS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEluZGV4aW5nIHByb2dyZXNzIG1vbml0b3INCi1pbmRleENvbmZpZ0ZpbGVzVGFza19uYW1lPUtvbmZpZ3VyYXRpb25zZGF0ZWllbiB3ZXJkZW4gaW5kZXhpZXJ0Li4uDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRiMmQ0NjcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBJbmRleGluZyBwcm9ncmVzcyBtb25pdG9yDQotaW5kZXhDb25maWdGaWxlc1Rhc2tfbmFtZT1JbmRleGFuZG8gYXJjaGl2b3MgZGUgY29uZmlndXJhY2lcdTAwZjNuLi4uDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUzNGY1MWUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBJbmRleGluZyBwcm9ncmVzcyBtb25pdG9yDQotaW5kZXhDb25maWdGaWxlc1Rhc2tfbmFtZT1JbmRleGF0aW9uIGRlcyBmaWNoaWVycyBkZSBjb25maWd1cmF0aW9uLi4uDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfaXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlkYTlhNTYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBJbmRleGluZyBwcm9ncmVzcyBtb25pdG9yDQotaW5kZXhDb25maWdGaWxlc1Rhc2tfbmFtZT1JbmRpY2l6emF6aW9uZSBkZWkgZmlsZSBkaSBjb25maWd1cmF6aW9uZSBpbiBjb3Jzby4uLg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NmZjZGJkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgSW5kZXhpbmcgcHJvZ3Jlc3MgbW9uaXRvcg0KLWluZGV4Q29uZmlnRmlsZXNUYXNrX25hbWU9XHU2OWNiXHU2MjEwXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHU3ZDIyXHU1ZjE1XHUzMDkyXHU0ZjVjXHU2MjEwXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Li4uDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRhZjc3YzAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBJbmRleGluZyBwcm9ncmVzcyBtb25pdG9yDQotaW5kZXhDb25maWdGaWxlc1Rhc2tfbmFtZT1cdWFkNmNcdWMxMzEgXHVkMzBjXHVjNzdjIFx1YzBjOVx1Yzc3OFx1ZDY1NCBcdWM5MTEuLi4NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWY4YjRjMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEluZGV4aW5nIHByb2dyZXNzIG1vbml0b3INCi1pbmRleENvbmZpZ0ZpbGVzVGFza19uYW1lPUluZGV4YW5kbyBhcnF1aXZvcyBkZSBjb25maWd1cmFcdTAwZTdcdTAwZTNvLi4uDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRhZTAzMTguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBJbmRleGluZyBwcm9ncmVzcyBtb25pdG9yDQotaW5kZXhDb25maWdGaWxlc1Rhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTViZjlcdTkxNGRcdTdmNmVcdTY1ODdcdTRlZjZcdTVlZmFcdTdhY2JcdTdkMjJcdTVmMTUuLi4NCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmNkNjBiYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEluZGV4aW5nIHByb2dyZXNzIG1vbml0b3INCi1pbmRleENvbmZpZ0ZpbGVzVGFza19uYW1lPVx1NmI2M1x1NTcyOFx1ODhmZFx1NGY1Y1x1OTE0ZFx1N2Y2ZVx1NmE5NFx1NzY4NFx1N2QyMlx1NWYxNS4uLg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1N0b3BXb3Jkc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiM2EwZjc3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgU2VhcmNoIFN0b3AgV29yZHMNCi1TZWFyY2guc3RvcFdvcmRzPWFiZXIsIGFscywgYXVmLCBiZWksIGRhbm4sIGRhcywgZGVyLCBkaWUsIGRpZXNlLCBkaWVzZXIsIGRpZXNlcywgZG9ydCwgZWluLCBlaW5lLCBlaW5lciwgZWluZXMsIGVyLCBlcywgZmFsbHMsIGZcdTAwZmNyLCBpLCBpaHJlLCBpc3QsIGluLCBrZWluLCBtaXQsIG5hY2gsIG5pY2h0LCBvZGVyLCBzaWUsIHNpbmQsIHQsIFx1MDBmY2Jlciwgdm9uLCB2b20sIHdhciwgd2FyZW4sIHdhcywgd2Vubiwgd2VyZGVuLCB3aWUsIHdpcmQsIHdvLCB6dQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX2VzLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1N0b3BXb3Jkc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMDU2MTJlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgU2VhcmNoIFN0b3AgV29yZHMNCi1TZWFyY2guc3RvcFdvcmRzPWEsIGFib3V0LCBhbiwgYW5kLCBhcmUsIGFzLCBhdCwgYmUsIGJ1dCwgYnksIGZvciwgZnJvbSwgaG93LCBpLCBpZiwgaW4sIGludG8sIGlzLCBpdCwgbm8sIG5vdCwgb2YsIG9uLCBvciwgcywgc3VjaCwgdCwgdGhhdCwgdGhlLCB0aGVpciwgdGhlbiwgdGhlcmUsIHRoZXNlLCB0aGV5LCB0aGlzLCB0bywgd2FzLCB3aGF0LCB3aGVuLCB3aGVyZSwgd2hvLCB3aWxsLCB3aXRoDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3NDM3MGMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBTZWFyY2ggU3RvcCBXb3Jkcw0KLVNlYXJjaC5zdG9wV29yZHM9dW4sIHVuZSwgXHUwMGUwIHByb3BvcyBkZSwgZXQsIHNvbnQsIGNvbW1lLCBlbiB0YW50IHF1ZSwgXHUwMGVhdHJlLCBtYWlzLCBwYXIsIHBvdXIsIGRlLCBkZXB1aXMsIGNvbW1lbnQsIGplLCBzaSwgZGFucywgXHUwMGUwIGwnaW50XHUwMGU5cmlldXIgZGUsIGVzdCwgXHUwMGU3YSwgY2UsIGMnLCBsJywgbm9uLCBwYXMsIGRlLCBzdXIsIG91LCB0ZWwsIHRlbCBxdWUsIGNlbGEsIGxlLCBsZXVyLCBsZXVycywgcHVpcywgZW5zdWl0ZSwgbFx1MDBlMCwgY2VzLCBpbHMsIGNlY2ksIHZlcnMsIGVuIGRpcmVjdGlvbiBkZSwgXHUwMGU5dGFpdCwgcXVlbCwgcXVlbGxlLCBxdW9pLCBxdWFuZCwgb1x1MDBmOSwgcXVpLCBzZXJhLCBhdmVjDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfaXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiYTY3OGYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBTZWFyY2ggU3RvcCBXb3Jkcw0KLVNlYXJjaC5zdG9wV29yZHM9dW4sIHVubywgdW5hLCBhIHByb3Bvc2l0byBkaSwgdW4sIHVubywgdW5hLCBlLCBzb25vLCBjb21lLCBpbiwgZXNzZXJlLCBtYSwgcGVyLCBkYSwgcGVyLCBkYSwgY29tZSwgaW8sIHNlLCBpbiwgaW4sIFx1MDBlOCwgZXNzbywgbm8sIG5vbiwgZGksIHN1LCBvcHB1cmUsIHMsIGNvbWUsIHRhbGUsIHRhbGksIHF1YWxpLCBxdWFsZSwgdCwgY2hlLCBxdWVsbG8sIHF1ZWxsYSwgaWwgcXVhbGUsIGxhIHF1YWxlLCBsZSBxdWFsaSwgaSBxdWFsaSwgaWwsIGxvLCBsYSwgaSwgZ2xpLCBsZSwgbG9ybywgcXVpbmRpLCBsXHUwMGVjLCBxdWVzdGUsIHF1ZXN0aSwgZXNzaSwgZXNzZSwgcXVlc3RvLCBxdWVzdGEsIGEsIHBlciwgZXJhLCBjb3NhLCBxdWFsZSwgcXVhbGksIHF1YW5kbywgZG92ZSwgY2hpLCBzYXJcdTAwZTAsIGNvbg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1N0b3BXb3Jkc19qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMDU2MTJlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgU2VhcmNoIFN0b3AgV29yZHMNCi1TZWFyY2guc3RvcFdvcmRzPWEsIGFib3V0LCBhbiwgYW5kLCBhcmUsIGFzLCBhdCwgYmUsIGJ1dCwgYnksIGZvciwgZnJvbSwgaG93LCBpLCBpZiwgaW4sIGludG8sIGlzLCBpdCwgbm8sIG5vdCwgb2YsIG9uLCBvciwgcywgc3VjaCwgdCwgdGhhdCwgdGhlLCB0aGVpciwgdGhlbiwgdGhlcmUsIHRoZXNlLCB0aGV5LCB0aGlzLCB0bywgd2FzLCB3aGF0LCB3aGVuLCB3aGVyZSwgd2hvLCB3aWxsLCB3aXRoDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIwNTYxMmUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBTZWFyY2ggU3RvcCBXb3Jkcw0KLVNlYXJjaC5zdG9wV29yZHM9YSwgYWJvdXQsIGFuLCBhbmQsIGFyZSwgYXMsIGF0LCBiZSwgYnV0LCBieSwgZm9yLCBmcm9tLCBob3csIGksIGlmLCBpbiwgaW50bywgaXMsIGl0LCBubywgbm90LCBvZiwgb24sIG9yLCBzLCBzdWNoLCB0LCB0aGF0LCB0aGUsIHRoZWlyLCB0aGVuLCB0aGVyZSwgdGhlc2UsIHRoZXksIHRoaXMsIHRvLCB3YXMsIHdoYXQsIHdoZW4sIHdoZXJlLCB3aG8sIHdpbGwsIHdpdGgNCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1N0b3BXb3Jkc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2U4YWQyNy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1N0b3BXb3Jkc19wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFNlYXJjaCBTdG9wIFdvcmRzDQotU2VhcmNoLnN0b3BXb3Jkcz11bSwgc29icmUsIHVtLCBlLCBzXHUwMGUzbywgY29tbywgZW0sIHNlciwgbWFzLCBwb3IsIHBhcmEsIGRlLCBjb21vLCBldSwgc2UsIGVtLCBwYXJhLCBcdTAwZTksIGVsZSwgblx1MDBlM28sIG5cdTAwZTNvLCBkZSwgZW0sIG91LCBzLCB0YWwsIHQsIGVzc2UsIG8sIHNldXMsIGVudFx1MDBlM28sIGxcdTAwZTEsIGVzdGVzLCBlbGVzLCBlc3RlLCBwYXJhLCBlcmEsIG8gcXVlLCBxdWFuZG8sb25kZSwgcXVlbSwgaXJcdTAwZTEsIGNvbQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1N0b3BXb3Jkc196aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMDU2MTJlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgU2VhcmNoIFN0b3AgV29yZHMNCi1TZWFyY2guc3RvcFdvcmRzPWEsIGFib3V0LCBhbiwgYW5kLCBhcmUsIGFzLCBhdCwgYmUsIGJ1dCwgYnksIGZvciwgZnJvbSwgaG93LCBpLCBpZiwgaW4sIGludG8sIGlzLCBpdCwgbm8sIG5vdCwgb2YsIG9uLCBvciwgcywgc3VjaCwgdCwgdGhhdCwgdGhlLCB0aGVpciwgdGhlbiwgdGhlcmUsIHRoZXNlLCB0aGV5LCB0aGlzLCB0bywgd2FzLCB3aGF0LCB3aGVuLCB3aGVyZSwgd2hvLCB3aWxsLCB3aXRoDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfemhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIwNTYxMmUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfemhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBTZWFyY2ggU3RvcCBXb3Jkcw0KLVNlYXJjaC5zdG9wV29yZHM9YSwgYWJvdXQsIGFuLCBhbmQsIGFyZSwgYXMsIGF0LCBiZSwgYnV0LCBieSwgZm9yLCBmcm9tLCBob3csIGksIGlmLCBpbiwgaW50bywgaXMsIGl0LCBubywgbm90LCBvZiwgb24sIG9yLCBzLCBzdWNoLCB0LCB0aGF0LCB0aGUsIHRoZWlyLCB0aGVuLCB0aGVyZSwgdGhlc2UsIHRoZXksIHRoaXMsIHRvLCB3YXMsIHdoYXQsIHdoZW4sIHdoZXJlLCB3aG8sIHdpbGwsIHdpdGgNCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMi8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU3MWMzNjguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDI8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTE2NjkyMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgU2VhcmNoIChOTDIpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMi9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNTRmY2E3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcnUucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MmYwZjkwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVx1MDQxZlx1MDQzZVx1MDQzOFx1MDQ0MVx1MDQzYSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXNfcnUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDNiOTE0Yy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIEluZGV4aW5nIHByb2dyZXNzIG1vbml0b3INCi1pbmRleENvbmZpZ0ZpbGVzVGFza19uYW1lPVx1MDQxOFx1MDQzZFx1MDQzNFx1MDQzNVx1MDQzYVx1MDQ0MVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4Li4uDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMxYzMzMGEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBTZWFyY2ggU3RvcCBXb3Jkcw0KLVNlYXJjaC5zdG9wV29yZHM9YSwgYWJvdXQsIGFuLCBhbmQsIGFyZSwgYXMsIGF0LCBiZSwgYnV0LCBieSwgZm9yLCBmcm9tLCBob3csIGksIGlmLCBpbiwgaW50bywgaXMsIGl0LCBubywgbm90LCBvZiwgb24sIG9yLCBzLCBzdWNoLCB0LCB0aGF0LCB0aGUsIHRoZWlyLCB0aGVuLCB0aGVyZSwgdGhlc2UsIHRoZXksIHRoaXMsIHRvLCB3YXMsIHdoYXQsIHdoZW4sIHdoZXJlLCB3aG8sIHdpbGwsIHdpdGgsIFx1MDQzMCwgXHUwNDMxXHUwNDM1XHUwNDM3LCBcdTA0MzFcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzUsIFx1MDQzMVx1MDQ0YiwgXHUwNDMxXHUwNDRiXHUwNDNiLCBcdTA0MzFcdTA0NGJcdTA0M2JcdTA0MzAsIFx1MDQzMVx1MDQ0Ylx1MDQzYlx1MDQzOCwgXHUwNDMxXHUwNDRiXHUwNDNiXHUwNDNlLCBcdTA0MzFcdTA0NGJcdTA0NDJcdTA0NGMsIFx1MDQzMiwgXHUwNDMyXHUwNDMwXHUwNDNjLCBcdTA0MzJcdTA0MzBcdTA0NDEsIFx1MDQzMlx1MDQzNVx1MDQ0MVx1MDQ0YywgXHUwNDMyXHUwNDNlLCBcdTA0MzJcdTA0M2VcdTA0NDIsIFx1MDQzMlx1MDQ0MVx1MDQzNSwgXHUwNDMyXHUwNDQxXHUwNDM1XHUwNDMzXHUwNDNlLCBcdTA0MzJcdTA0NDFcdTA0MzVcdTA0NDUsIFx1MDQzMlx1MDQ0YiwgXHUwNDMzXHUwNDM0XHUwNDM1LCBcdTA0MzRcdTA0MzAsIFx1MDQzNFx1MDQzMFx1MDQzNlx1MDQzNSwgXHUwNDM0XHUwNDNiXHUwNDRmLCBcdTA0MzRcdTA0M2UsIFx1MDQzNVx1MDQzM1x1MDQzZSwgXHUwNDM1XHUwNDM1LCBcdTA0MzVcdTA0NDFcdTA0M2JcdTA0MzgsIFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQ0YywgXHUwNDM1XHUwNDQ5XHUwNDM1LCBcdTA0MzZcdTA0MzUsIFx1MDQzN1x1MDQzMCwgXHUwNDM3XHUwNDM0XHUwNDM1XHUwNDQxXHUwNDRjLCBcdTA0MzgsIFx1MDQzOFx1MDQzNywgXHUwNDM4XHUwNDNiXHUwNDM4LCBcdTA0MzhcdTA0M2MsIFx1MDQzOFx1MDQ0NSwgXHUwNDNhLCBcdTA0M2FcdTA0MzBcdTA0M2EsIFx1MDQzYVx1MDQzZSwgXHUwNDNhXHUwNDNlXHUwNDMzXHUwNDM0XHUwNDMwLCBcdTA0M2FcdTA0NDJcdTA0M2UsIFx1MDQzYlx1MDQzOCwgXHUwNDNiXHUwNDM4XHUwNDMxXHUwNDNlLCBcdTA0M2NcdTA0M2RcdTA0MzUsIFx1MDQzY1x1MDQzZVx1MDQzNlx1MDQzNVx1MDQ0MiwgXHUwNDNjXHUwNDRiLCBcdTA0M2RcdTA0MzAsIFx1MDQzZFx1MDQzMFx1MDQzNFx1MDQzZSwgXHUwNDNkXHUwNDMwXHUwNDQ4LCBcdTA0M2RcdTA0MzUsIFx1MDQzZFx1MDQzNVx1MDQzM1x1MDQzZSwgXHUwNDNkXHUwNDM1XHUwNDM1LCBcdTA0M2RcdTA0MzVcdTA0NDIsIFx1MDQzZFx1MDQzOCwgXHUwNDNkXHUwNDM4XHUwNDQ1LCBcdTA0M2RcdTA0M2UsIFx1MDQzZFx1MDQ0MywgXHUwNDNlLCBcdTA0M2VcdTA0MzEsIFx1MDQzZVx1MDQzNFx1MDQzZFx1MDQzMFx1MDQzYVx1MDQzZSwgXHUwNDNlXHUwNDNkLCBcdTA0M2VcdTA0M2RcdTA0MzAsIFx1MDQzZVx1MDQzZFx1MDQzOCwgXHUwNDNlXHUwNDNkXHUwNDNlLCBcdTA0M2VcdTA0NDIsIFx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQ0YywgXHUwNDNmXHUwNDNlLCBcdTA0M2ZcdTA0M2VcdTA0MzQsIFx1MDQzZlx1MDQ0MFx1MDQzOCwgXHUwNDQxLCBcdTA0NDFcdTA0M2UsIFx1MDQ0Mlx1MDQzMFx1MDQzYSwgXHUwNDQyXHUwNDMwXHUwNDNhXHUwNDM2XHUwNDM1LCBcdTA0NDJcdTA0MzBcdTA0M2FcdTA0M2VcdTA0MzksIFx1MDQ0Mlx1MDQzMFx1MDQzYywgXHUwNDQyXHUwNDM1LCBcdTA0NDJcdTA0MzVcdTA0M2MsIFx1MDQ0Mlx1MDQzZSwgXHUwNDQyXHUwNDNlXHUwNDMzXHUwNDNlLCBcdTA0NDJcdTA0M2VcdTA0MzZcdTA0MzUsIFx1MDQ0Mlx1MDQzZVx1MDQzOSwgXHUwNDQyXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDNhXHUwNDNlLCBcdTA0NDJcdTA0M2VcdTA0M2MsIFx1MDQ0Mlx1MDQ0YiwgXHUwNDQzLCBcdTA0NDNcdTA0MzZcdTA0MzUsIFx1MDQ0NVx1MDQzZVx1MDQ0Mlx1MDQ0ZiwgXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlLCBcdTA0NDdcdTA0MzVcdTA0MzksIFx1MDQ0N1x1MDQzNVx1MDQzYywgXHUwNDQ3XHUwNDQyXHUwNDNlLCBcdTA0NDdcdTA0NDJcdTA0M2VcdTA0MzFcdTA0NGIsIFx1MDQ0N1x1MDQ0Y1x1MDQzNSwgXHUwNDQ3XHUwNDRjXHUwNDRmLCBcdTA0NGRcdTA0NDJcdTA0MzAsIFx1MDQ0ZFx1MDQ0Mlx1MDQzOCwgXHUwNDRkXHUwNDQyXHUwNDNlLCBcdTA0NGYNCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyYS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMmEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyYS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMmEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDI5NDg3Yy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDJhPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzU2MWI5OC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIFNlYXJjaCAoTkwyYSkKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyYQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMmEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDJhL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0ZTY4MjMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMmEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGEucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1ZDdiZWQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIHNcdTAwZjhnbmluZw0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkZWZhYjQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgSW5kZXhpbmcgcHJvZ3Jlc3MgbW9uaXRvcg0KLWluZGV4Q29uZmlnRmlsZXNUYXNrX25hbWU9SW5kZWtzZXJlciBrb25maWd1cmF0aW9uc2ZpbGVyLi4uDQotDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODI1ZTFhMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHNfZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBTZWFyY2ggU3RvcCBXb3Jkcw0KLVNlYXJjaC5zdG9wV29yZHM9ZW4sIG9tLCBldCwgb2csIGVyLCBzb20sIHZlZCwgdlx1MDBlNnJlLCBtZW4sIGFmLCBmb3IsIGZyYSwgaHZvcmRhbiwgamVnLCBodmlzLCBpLCBpbmQsIGRlbiwgZGV0LCBpbmdlbiwgaWtrZSwgYWYsIHBcdTAwZTUsIGVsbGVyLCBzLCBzXHUwMGU1ZGFuLCB0LCBkZXQsIGRlbm5lLCBkZXJlcywgZGVyZWZ0ZXIsIGRlciwgZGlzc2UsIGRlLCBkZXR0ZSwgdGlsLCB2YXIsIGh2YWQsIGh2b3JuXHUwMGU1ciwgaHZvciwgaHZlbSwgdmlsLCBtZWQNCi0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFmZjA1NWMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzkyYzk2Mi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgU2VhcmNoIFVJIChOTDEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjk0OGM5Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9DTi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOGJhZWI4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIEJlbnV0emVyc2Nobml0dHN0ZWxsZSBmXHUwMGZjciBTdWNoZQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBEaWFsb2cNCi1tZXRob2RTZWFyY2hEaWFsb2dMYWJlbD1NZXRob2RlbnN1Y2hlDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiN2Q1ZjEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9VUkgZGUgYlx1MDBmYXNxdWVkYSBkZSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIE1ldGhvZCBTZWFyY2ggRGlhbG9nDQotbWV0aG9kU2VhcmNoRGlhbG9nTGFiZWw9Qlx1MDBmYXNxdWVkYSBkZSBtXHUwMGU5dG9kbw0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZjNlZGFhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUludGVyZmFjZSB1dGlsaXNhdGV1ciBkZSByZWNoZXJjaGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBNZXRob2QgU2VhcmNoIERpYWxvZw0KLW1ldGhvZFNlYXJjaERpYWxvZ0xhYmVsPVJlY2hlcmNoZSBkZSBtXHUwMGU5dGhvZGUNCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9wbHVnaW5faXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmUyZGUwMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1VSSBkaSByaWNlcmNhIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBEaWFsb2cNCi1tZXRob2RTZWFyY2hEaWFsb2dMYWJlbD1SaWNlcmNhIG1ldG9kbw0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OGQ4ZWE2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBTZWFyY2ggVUkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIE1ldGhvZCBTZWFyY2ggRGlhbG9nDQotbWV0aG9kU2VhcmNoRGlhbG9nTGFiZWw9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OTFjXHU3ZDIyDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAzZGNiMzQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFx1YWM4MFx1YzBjOSBVSQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBEaWFsb2cNCi1tZXRob2RTZWFyY2hEaWFsb2dMYWJlbD1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVhYzgwXHVjMGM5DQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ5YTJkMzIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9VUkgZGUgUHJvY3VyYSBkbyBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIE1ldGhvZCBTZWFyY2ggRGlhbG9nDQotbWV0aG9kU2VhcmNoRGlhbG9nTGFiZWw9UHJvY3VyYSBkZSBNXHUwMGU5dG9kbw0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNmRhNGMzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBcdTY0MWNcdTdkMjJcdTc1MjhcdTYyMzdcdTc1NGNcdTk3NjINCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIE1ldGhvZCBTZWFyY2ggRGlhbG9nDQotbWV0aG9kU2VhcmNoRGlhbG9nTGFiZWw9XHU2NWI5XHU2Y2Q1XHU2NDFjXHU3ZDIyDQotDQotICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI3MDEzZTUuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFNlYXJjaCBVSQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBEaWFsb2cNCi1tZXRob2RTZWFyY2hEaWFsb2dMYWJlbD1cdTY1YjlcdTZjZDVcdTY0MWNcdTVjMGINCi0NCi0gICAgICAgICAgICAgICANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWM4MmMwNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBNZXRob2QgU2VhcmNoIFBhZ2UNCi1zZWFyY2hTdHJpbmdMYWJlbF90ZXh0PVRleHQgKCogPSBiZWxpZWJpZ2UgWmVpY2hlbmZvbGdlLCA/ID0gYmVsaWViaWdlcyBaZWljaGVuKToNCi1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1Hcm9cdTAwZGYtL0tsZWluc2NocmVpYnVuZyBiZWFjaHRlbg0KLWVsZW1lbnROYW1lTGFiZWxfdGV4dD1OYW1lIGRlcyBNZXRob2RlbmVsZW1lbnRzIG9kZXIgTXVzdGVyIGZcdTAwZmNyIFByXHUwMGU0c2VudGF0aW9uc25hbWVuOg0KLXNjb3BlR3JvdXBfdGV4dD1TY29wZQ0KLXJvbGVDaGVja2JveF90ZXh0PVJvbGxlDQotdGFza0NoZWNrYm94X3RleHQ9QXVmZ2FiZQ0KLXdvcmtQcm9kdWN0Q2hlY2tib3hfdGV4dD1BcmJlaXRzZXJnZWJuaXMNCi0NCi0jIE1ldGhvZCBTZWFyY2ggUXVlcnkNCi1zZWFyY2hRdWVyeV90ZXh0PU1ldGhvZGVuc3VjaGUNCi0NCi0jIE1ldGhvZCBTZWFyY2ggUHJvZ3Jlc3MgRGlhbG9nDQotc2NhbkxpYnJhcnlUYXNrX25hbWU9TWV0aG9kZW5iaWJsaW90aGVrIHdpcmQgZHVyY2hzdWNodC4uLg0KLXNjYW5FbGVtZW50VGFza19uYW1lPU1ldGhvZGVuZWxlbWVudCAnJ3swfScnIHdpcmQgZ2VzdWNodC4uLg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBFcnJvciBEaWFsb2cNCi1zZWFyY2hFcnJvcl90aXRsZT1NZXRob2RlbnN1Y2hlDQotc2VhcmNoRXJyb3JfbXNnPUlVUFMwMTAwRTogRGllIFN1Y2hvcGVyYXRpb24ga2FubiBuaWNodCBmb3J0Z2VzZXR6dCB3ZXJkZW4uDQotc2VhcmNoRXJyb3JfcmVhc29uPUVzIGlzdCBkZXJ6ZWl0IGtlaW5lIE1ldGhvZGVuYmlibGlvdGhlayBnZVx1MDBmNmZmbmV0LlxuXG5cdTAwZDZmZm5lbiBTaWUgZWluZSBNZXRob2RlbmJpYmxpb3RoZWsgdW5kIHdpZWRlcmhvbGVuIFNpZSBkZW4gVm9yZ2FuZy4NCi0NCi0jIE1ldGhvZCBTZWFyY2ggUmVzdWx0DQotc2VhcmNoUmVzdWx0X21ldGhvZENvbnRlbnQ9TWV0aG9kZW5pbmhhbHQNCi1zZWFyY2hSZXN1bHRfY29udGVudFBhY2thZ2VzPUluaGFsdHNwYWtldGUNCi1zZWFyY2hSZXN1bHRfc3RhbmRhcmRDYXRlZ29yaWVzPVN0YW5kYXJka2F0ZWdvcmllbg0KLXNlYXJjaFJlc3VsdF9kaXNjaXBsaW5lcz1EaXN6aXBsaW5lbg0KLXNlYXJjaFJlc3VsdF9kb21haW5zPURvbVx1MDBlNG5lbg0KLXNlYXJjaFJlc3VsdF93b3JrUHJvZHVjdFR5cGVzPUFyYmVpdHNlcmdlYm5pc3R5cGVuDQotc2VhcmNoUmVzdWx0X3JvbGVTZXRzPVJvbGxlbmdydXBwZW4NCi1zZWFyY2hSZXN1bHRfdG9vbHM9VG9vbHMNCi1zZWFyY2hSZXN1bHRfY3VzdG9tQ2F0ZWdvcmllcz1BbmdlcGFzc3RlIEthdGVnb3JpZW4NCi1zZWFyY2hSZXN1bHRfcHJvY2Vzc2VzPVByb3plc3NlDQotc2VhcmNoUmVzdWx0X2NhcGFiaWxpdHlQYXR0ZXJucz1Qcm96ZXNzbXVzdGVyDQotc2VhcmNoUmVzdWx0X2RlbGl2ZXJ5UHJvY2Vzc2VzPUJlcmVpdHN0ZWxsdW5nc3Byb3plc3NlDQotc2VhcmNoUmVzdWx0X21hdGNoPScnezB9JycgLSAxIFx1MDBkY2JlcmVpbnN0aW1tdW5nDQotc2VhcmNoUmVzdWx0X21hdGNoZXM9Jyd7MH0nJyAtIHsxfSBcdTAwZGNiZXJlaW5zdGltbXVuZ2VuDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXNfZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmYTg4NmYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBQYWdlDQotc2VhcmNoU3RyaW5nTGFiZWxfdGV4dD1UZXh0byAoKiA9IGN1YWxxdWllciBjYWRlbmEgZGUgY2FyYWN0ZXJlcywgPyA9IGN1YWxxdWllciBjYXJcdTAwZTFjdGVyKToNCi1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1TZW5zaWJsZSBhIG1heVx1MDBmYXNjdWxhcyB5IG1pblx1MDBmYXNjdWxhcw0KLWVsZW1lbnROYW1lTGFiZWxfdGV4dD1Ob21icmUgZGVsIGVsZW1lbnRvIGRlIG1cdTAwZTl0b2RvIG8gcGF0clx1MDBmM24gZGVsIG5vbWJyZSBkZSBwcmVzZW50YWNpXHUwMGYzbjoNCi1zY29wZUdyb3VwX3RleHQ9XHUwMGMxbWJpdG8NCi1yb2xlQ2hlY2tib3hfdGV4dD1Sb2wNCi10YXNrQ2hlY2tib3hfdGV4dD1UYXJlYQ0KLXdvcmtQcm9kdWN0Q2hlY2tib3hfdGV4dD1Qcm9kdWN0byBkZSB0cmFiYWpvDQotDQotIyBNZXRob2QgU2VhcmNoIFF1ZXJ5DQotc2VhcmNoUXVlcnlfdGV4dD1CXHUwMGZhc3F1ZWRhIGRlIG1cdTAwZTl0b2RvDQotDQotIyBNZXRob2QgU2VhcmNoIFByb2dyZXNzIERpYWxvZw0KLXNjYW5MaWJyYXJ5VGFza19uYW1lPUV4cGxvcmFuZG8gbGEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuLi4NCi1zY2FuRWxlbWVudFRhc2tfbmFtZT1FeHBsb3JhbmRvIGVsIGVsZW1lbnRvIGRlIG1cdTAwZTl0b2RvICcnezB9JycuLi4NCi0NCi0jIE1ldGhvZCBTZWFyY2ggRXJyb3IgRGlhbG9nDQotc2VhcmNoRXJyb3JfdGl0bGU9Qlx1MDBmYXNxdWVkYSBkZSBtXHUwMGU5dG9kbw0KLXNlYXJjaEVycm9yX21zZz1JVVBTMDEwMEU6IExhIG9wZXJhY2lcdTAwZjNuIGRlIGJcdTAwZmFzcXVlZGEgbm8gcHVlZGUgY29udGludWFyLg0KLXNlYXJjaEVycm9yX3JlYXNvbj1BY3R1YWxtZW50ZSBubyBoYXkgbmluZ3VuYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyBhYmllcnRhLlxuXG5BYnJhIHVuYSBiaWJsaW90ZWNhIGRlIG1cdTAwZTl0b2RvcyB5IHZ1ZWx2YSBhIGludGVudGFybG8uDQotDQotIyBNZXRob2QgU2VhcmNoIFJlc3VsdA0KLXNlYXJjaFJlc3VsdF9tZXRob2RDb250ZW50PUNvbnRlbmlkbyBkZWwgbVx1MDBlOXRvZG8NCi1zZWFyY2hSZXN1bHRfY29udGVudFBhY2thZ2VzPVBhcXVldGVzIGRlIGNvbnRlbmlkbw0KLXNlYXJjaFJlc3VsdF9zdGFuZGFyZENhdGVnb3JpZXM9Q2F0ZWdvclx1MDBlZGFzIGVzdFx1MDBlMW5kYXINCi1zZWFyY2hSZXN1bHRfZGlzY2lwbGluZXM9RGlzY2lwbGluYXMNCi1zZWFyY2hSZXN1bHRfZG9tYWlucz1Eb21pbmlvcw0KLXNlYXJjaFJlc3VsdF93b3JrUHJvZHVjdFR5cGVzPVRpcG9zIGRlIHByb2R1Y3RvIGRlIHRyYWJham8NCi1zZWFyY2hSZXN1bHRfcm9sZVNldHM9Q29uanVudG9zIGRlIHJvbGVzDQotc2VhcmNoUmVzdWx0X3Rvb2xzPUhlcnJhbWllbnRhcw0KLXNlYXJjaFJlc3VsdF9jdXN0b21DYXRlZ29yaWVzPUNhdGVnb3JcdTAwZWRhcyBwZXJzb25hbGl6YWRhcw0KLXNlYXJjaFJlc3VsdF9wcm9jZXNzZXM9UHJvY2Vzb3MNCi1zZWFyY2hSZXN1bHRfY2FwYWJpbGl0eVBhdHRlcm5zPVBhdHJvbmVzIGRlIHBvc2liaWxpZGFkDQotc2VhcmNoUmVzdWx0X2RlbGl2ZXJ5UHJvY2Vzc2VzPVByb2Nlc29zIGRlIGVudHJlZ2ENCi1zZWFyY2hSZXN1bHRfbWF0Y2g9Jyd7MH0nJyAtIDEgY29pbmNpZGVuY2lhDQotc2VhcmNoUmVzdWx0X21hdGNoZXM9Jyd7MH0nJyAtIHsxfSBjb2luY2lkZW5jaWFzDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXNfZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2Y2UwOTkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBQYWdlDQotc2VhcmNoU3RyaW5nTGFiZWxfdGV4dD1UZXh0ZSAoKiA9IG4naW1wb3J0ZSBxdWVsbGUgY2hhXHUwMGVlbmUsID8gPSBuJ2ltcG9ydGUgcXVlbCBjYXJhY3RcdTAwZThyZSkgOg0KLWNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0PVJlc3BlY3RlciBsYSBjYXNzZQ0KLWVsZW1lbnROYW1lTGFiZWxfdGV4dD1Ob20gZCdcdTAwZTlsXHUwMGU5bWVudCBkZSBtXHUwMGU5dGhvZGUgb3UgcGF0dGVybiBkZSBub20gZGUgcHJcdTAwZTlzZW50YXRpb24gOg0KLXNjb3BlR3JvdXBfdGV4dD1Qb3J0XHUwMGU5ZQ0KLXJvbGVDaGVja2JveF90ZXh0PVJcdTAwZjRsZQ0KLXRhc2tDaGVja2JveF90ZXh0PVRcdTAwZTJjaGUNCi13b3JrUHJvZHVjdENoZWNrYm94X3RleHQ9UHJvZHVpdA0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBRdWVyeQ0KLXNlYXJjaFF1ZXJ5X3RleHQ9UmVjaGVyY2hlIGRlIG1cdTAwZTl0aG9kZQ0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBQcm9ncmVzcyBEaWFsb2cNCi1zY2FuTGlicmFyeVRhc2tfbmFtZT1TY2FubmFnZSBkZSBsYSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzLi4uDQotc2NhbkVsZW1lbnRUYXNrX25hbWU9U2Nhbm5hZ2UgZGUgbCcnXHUwMGU5bFx1MDBlOW1lbnQgZGUgbVx1MDBlOXRob2RlICcnezB9JycuLi4NCi0NCi0jIE1ldGhvZCBTZWFyY2ggRXJyb3IgRGlhbG9nDQotc2VhcmNoRXJyb3JfdGl0bGU9UmVjaGVyY2hlIGRlIG1cdTAwZTl0aG9kZQ0KLXNlYXJjaEVycm9yX21zZz1JVVBTMDEwMEUgOiBMJ29wXHUwMGU5cmF0aW9uIGRlIHJlY2hlcmNoZSBuZSBwZXV0IHBhcyBjb250aW51ZXIuDQotc2VhcmNoRXJyb3JfcmVhc29uPUF1Y3VuZSBiaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzIG4nZXN0IGFjdHVlbGxlbWVudCBvdXZlcnRlLlxuXG5PdXZyZXogdW5lIGJpYmxpb3RoXHUwMGU4cXVlIGRlIG1cdTAwZTl0aG9kZXMgZXQgclx1MDBlOS1lc3NheWV6Lg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBSZXN1bHQNCi1zZWFyY2hSZXN1bHRfbWV0aG9kQ29udGVudD1Db250ZW51IGRlIGxhIG1cdTAwZTl0aG9kZQ0KLXNlYXJjaFJlc3VsdF9jb250ZW50UGFja2FnZXM9UGFja2FnZXMgZGUgY29udGVudQ0KLXNlYXJjaFJlc3VsdF9zdGFuZGFyZENhdGVnb3JpZXM9Q2F0XHUwMGU5Z29yaWVzIHN0YW5kYXJkDQotc2VhcmNoUmVzdWx0X2Rpc2NpcGxpbmVzPURpc2NpcGxpbmVzDQotc2VhcmNoUmVzdWx0X2RvbWFpbnM9RG9tYWluZXMNCi1zZWFyY2hSZXN1bHRfd29ya1Byb2R1Y3RUeXBlcz1UeXBlcyBkZSBwcm9kdWl0cw0KLXNlYXJjaFJlc3VsdF9yb2xlU2V0cz1FbnNlbWJsZXMgZGUgclx1MDBmNGxlcw0KLXNlYXJjaFJlc3VsdF90b29scz1PdXRpbHMNCi1zZWFyY2hSZXN1bHRfY3VzdG9tQ2F0ZWdvcmllcz1DYXRcdTAwZTlnb3JpZXMgcGVyc29ubmFsaXNcdTAwZTllcw0KLXNlYXJjaFJlc3VsdF9wcm9jZXNzZXM9UHJvY2Vzc3VzDQotc2VhcmNoUmVzdWx0X2NhcGFiaWxpdHlQYXR0ZXJucz1QYXR0ZXJucyBkZSBjYXBhY2l0XHUwMGU5DQotc2VhcmNoUmVzdWx0X2RlbGl2ZXJ5UHJvY2Vzc2VzPVByb2Nlc3N1cyBkZSBsaXZyYWlzb24NCi1zZWFyY2hSZXN1bHRfbWF0Y2g9Jyd7MH0nJyAtIDEgY29ycmVzcG9uZGFuY2UNCi1zZWFyY2hSZXN1bHRfbWF0Y2hlcz0nJ3swfScnIC0gezF9IGNvcnJlc3BvbmRhbmNlcw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMDA5ODI2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIE1ldGhvZCBTZWFyY2ggUGFnZQ0KLXNlYXJjaFN0cmluZ0xhYmVsX3RleHQ9VGVzdG8gKCogPSB0dXR0ZSBsZSBzdHJpbmdoZSwgPyA9IHR1dHRpIGkgY2FyYXR0ZXJpKToNCi1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1NYWl1c2NvbGUvTWludXNjb2xlDQotZWxlbWVudE5hbWVMYWJlbF90ZXh0PU5vbWUgZGVsbCdlbGVtZW50byBkZWwgbWV0b2RvIG9wcHVyZSBtb2RlbGxvIGRlbCBub21lIGRpIHByZXNlbnRhemlvbmUNCi1zY29wZUdyb3VwX3RleHQ9QW1iaXRvDQotcm9sZUNoZWNrYm94X3RleHQ9UnVvbG8NCi10YXNrQ2hlY2tib3hfdGV4dD1PcGVyYXppb25lDQotd29ya1Byb2R1Y3RDaGVja2JveF90ZXh0PVByb2RvdHRvIGRpIGxhdm9ybw0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBRdWVyeQ0KLXNlYXJjaFF1ZXJ5X3RleHQ9UmljZXJjYSBtZXRvZG8NCi0NCi0jIE1ldGhvZCBTZWFyY2ggUHJvZ3Jlc3MgRGlhbG9nDQotc2NhbkxpYnJhcnlUYXNrX25hbWU9U2NhbnNpb25lIGRlbGxhIGxpYnJlcmlhIGRlaSBtZXRvZGkgaW4gY29yc28uLi4NCi1zY2FuRWxlbWVudFRhc2tfbmFtZT1TY2Fuc2lvbmUgZGVsbCcnZWxlbWVudG8gZGVsIG1ldG9kbyAnJ3swfScnIGluIGNvcnNvLi4uDQotDQotIyBNZXRob2QgU2VhcmNoIEVycm9yIERpYWxvZw0KLXNlYXJjaEVycm9yX3RpdGxlPVJpY2VyY2EgbWV0b2RvDQotc2VhcmNoRXJyb3JfbXNnPUlVUFMwMTAwRTogSW1wb3NzaWJpbGUgY29udGludWFyZSBsJ29wZXJhemlvbmUgZGkgcmljZXJjYS4NCi1zZWFyY2hFcnJvcl9yZWFzb249TmVzc3VuYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGF0dHVhbG1lbnRlIGFwZXJ0YS5cblxuQXByaXJlIHVuYSBsaWJyZXJpYSBkZWkgbWV0b2RpIGUgcHJvdmFyZSBkaSBudW92by4NCi0NCi0jIE1ldGhvZCBTZWFyY2ggUmVzdWx0DQotc2VhcmNoUmVzdWx0X21ldGhvZENvbnRlbnQ9Q29udGVudXRvIGRpIG1ldG9kbw0KLXNlYXJjaFJlc3VsdF9jb250ZW50UGFja2FnZXM9UGFjY2hldHRpIGRlbCBjb250ZW51dG8NCi1zZWFyY2hSZXN1bHRfc3RhbmRhcmRDYXRlZ29yaWVzPUNhdGVnb3JpZSBzdGFuZGFyZA0KLXNlYXJjaFJlc3VsdF9kaXNjaXBsaW5lcz1EaXNjaXBsaW5lDQotc2VhcmNoUmVzdWx0X2RvbWFpbnM9RG9taW5pDQotc2VhcmNoUmVzdWx0X3dvcmtQcm9kdWN0VHlwZXM9VGlwaSBkaSBwcm9kb3R0byBkaSBsYXZvcm8NCi1zZWFyY2hSZXN1bHRfcm9sZVNldHM9SW5zaWVtaSBkaSBydW9saQ0KLXNlYXJjaFJlc3VsdF90b29scz1Ub29sDQotc2VhcmNoUmVzdWx0X2N1c3RvbUNhdGVnb3JpZXM9Q2F0ZWdvcmllIHBlcnNvbmFsaXp6YXRlDQotc2VhcmNoUmVzdWx0X3Byb2Nlc3Nlcz1Qcm9jZXNzaQ0KLXNlYXJjaFJlc3VsdF9jYXBhYmlsaXR5UGF0dGVybnM9TW9kZWxsaSBkaSBjYXBhY2l0XHUwMGUwDQotc2VhcmNoUmVzdWx0X2RlbGl2ZXJ5UHJvY2Vzc2VzPVByb2Nlc3NpIGRpIHByb2R1emlvbmUNCi1zZWFyY2hSZXN1bHRfbWF0Y2g9Jyd7MH0nJyAtIDEgY29ycmlzcG9uZGVuemENCi1zZWFyY2hSZXN1bHRfbWF0Y2hlcz0nJ3swfScnIC0gezF9IGNvcnJpc3BvbmRlbnplDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXNfamEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc2NTgxMmYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXNfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBQYWdlDQotc2VhcmNoU3RyaW5nTGFiZWxfdGV4dD1cdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzggKCogPSBcdTRlZmJcdTYxMGZcdTMwNmVcdTMwYjlcdTMwYzhcdTMwZWFcdTMwZjNcdTMwYjBcdTMwMDE/ID0gXHU0ZWZiXHU2MTBmXHUzMDZlXHU2NTg3XHU1YjU3KToNCi1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1cdTU5MjcvXHU1YzBmXHU2NTg3XHU1YjU3XHUzMDkyXHU1MzNhXHU1MjI1XHUzMDU5XHUzMDhiDQotZWxlbWVudE5hbWVMYWJlbF90ZXh0PVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMFx1NTQwZFx1MzA3ZVx1MzA1Zlx1MzA2Zlx1ODg2OFx1NzkzYVx1NTQwZFx1MzBkMVx1MzBiZlx1MzBmY1x1MzBmMzoNCi1zY29wZUdyb3VwX3RleHQ9XHU3YmM0XHU1NmYyDQotcm9sZUNoZWNrYm94X3RleHQ9XHUzMGVkXHUzMGZjXHUzMGViDQotdGFza0NoZWNrYm94X3RleHQ9XHUzMGJmXHUzMGI5XHUzMGFmDQotd29ya1Byb2R1Y3RDaGVja2JveF90ZXh0PVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBRdWVyeQ0KLXNlYXJjaFF1ZXJ5X3RleHQ9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHU2OTFjXHU3ZDIyDQotDQotIyBNZXRob2QgU2VhcmNoIFByb2dyZXNzIERpYWxvZw0KLXNjYW5MaWJyYXJ5VGFza19uYW1lPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1MzBiOVx1MzBhZFx1MzBlM1x1MzBmM1x1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLXNjYW5FbGVtZW50VGFza19uYW1lPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMCAnJ3swfScnIFx1MzA5Mlx1MzBiOVx1MzBhZFx1MzBlM1x1MzBmM1x1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4uLg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBFcnJvciBEaWFsb2cNCi1zZWFyY2hFcnJvcl90aXRsZT1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5MWNcdTdkMjINCi1zZWFyY2hFcnJvcl9tc2c9SVVQUzAxMDBFOiBcdTY5MWNcdTdkMjJcdTY0Y2RcdTRmNWNcdTMwOTJcdTdkOWFcdTg4NGNcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDINCi1zZWFyY2hFcnJvcl9yZWFzb249XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMGZjXHUzMDRjXHU3M2ZlXHU1NzI4XHU5NThiXHUzMDRiXHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXG5cblx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0ZFx1MzAwMVx1NTE4ZFx1OGE2Nlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBSZXN1bHQNCi1zZWFyY2hSZXN1bHRfbWV0aG9kQ29udGVudD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQNCi1zZWFyY2hSZXN1bHRfY29udGVudFBhY2thZ2VzPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzBmYlx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOA0KLXNlYXJjaFJlc3VsdF9zdGFuZGFyZENhdGVnb3JpZXM9XHU2YTE5XHU2ZTk2XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjDQotc2VhcmNoUmVzdWx0X2Rpc2NpcGxpbmVzPVx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZQ0KLXNlYXJjaFJlc3VsdF9kb21haW5zPVx1MzBjOVx1MzBlMVx1MzBhNFx1MzBmMw0KLXNlYXJjaFJlc3VsdF93b3JrUHJvZHVjdFR5cGVzPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOFx1MzBmYlx1MzBiZlx1MzBhNFx1MzBkNw0KLXNlYXJjaFJlc3VsdF9yb2xlU2V0cz1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzgNCi1zZWFyY2hSZXN1bHRfdG9vbHM9XHUzMGM0XHUzMGZjXHUzMGViDQotc2VhcmNoUmVzdWx0X2N1c3RvbUNhdGVnb3JpZXM9XHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjDQotc2VhcmNoUmVzdWx0X3Byb2Nlc3Nlcz1cdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi1zZWFyY2hSZXN1bHRfY2FwYWJpbGl0eVBhdHRlcm5zPVx1MzBiMVx1MzBmY1x1MzBkMVx1MzBkM1x1MzBlYVx1MzBjNlx1MzBhM1x1MzBmY1x1MzBmYlx1MzBkMVx1MzBiZlx1MzBmY1x1MzBmMw0KLXNlYXJjaFJlc3VsdF9kZWxpdmVyeVByb2Nlc3Nlcz1cdTMwYzdcdTMwZWFcdTMwZDBcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjkNCi1zZWFyY2hSZXN1bHRfbWF0Y2g9Jyd7MH0nJyAtIDEgXHU1MDBiXHUzMDZlXHU0ZTAwXHU4MWY0DQotc2VhcmNoUmVzdWx0X21hdGNoZXM9Jyd7MH0nJyAtIHsxfSBcdTUwMGJcdTMwNmVcdTRlMDBcdTgxZjQNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXNfa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmYzNTMwOS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBNZXRob2QgU2VhcmNoIFBhZ2UNCi1zZWFyY2hTdHJpbmdMYWJlbF90ZXh0PVx1ZDE0ZFx1YzJhNFx1ZDJiOCgqID0gXHVjNzg0XHVjNzU4XHVjNzU4IFx1YmIzOFx1Yzc5MFx1YzVmNCwgPyA9IFx1Yzc4NFx1Yzc1OFx1Yzc1OCBcdWJiMzhcdWM3OTApOiA9IFx1Yzc4NFx1Yzc1OFx1Yzc1OCBcdWJiMzhcdWM3OTApOg0KLWNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0PVx1YjMwMFx1YzE4Y1x1YmIzOFx1Yzc5MCBcdWFkNmNcdWJkODQNCi1lbGVtZW50TmFtZUxhYmVsX3RleHQ9XHViYTU0XHVjMThjXHViNGRjIFx1YzY5NFx1YzE4YyBcdWM3NzRcdWI5ODQgXHViNjEwXHViMjk0IFx1ZDQ1Y1x1YzJkYyBcdWM3NzRcdWI5ODQgXHVkMzI4XHVkMTM0Og0KLXNjb3BlR3JvdXBfdGV4dD1cdWJjOTRcdWM3MDQNCi1yb2xlQ2hlY2tib3hfdGV4dD1cdWM1ZWRcdWQ1NjANCi10YXNrQ2hlY2tib3hfdGV4dD1cdWQwYzBcdWMyYTRcdWQwNmMNCi13b3JrUHJvZHVjdENoZWNrYm94X3RleHQ9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYw0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBRdWVyeQ0KLXNlYXJjaFF1ZXJ5X3RleHQ9XHViYTU0XHVjMThjXHViNGRjIFx1YWM4MFx1YzBjOQ0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBQcm9ncmVzcyBEaWFsb2cNCi1zY2FuTGlicmFyeVRhc2tfbmFtZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjIFx1YzJhNFx1Y2U5NCBcdWM5MTEuLi4NCi1zY2FuRWxlbWVudFRhc2tfbmFtZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVjNjk0XHVjMThjICcnezB9JycgXHVjMmE0XHVjZTk0IFx1YzkxMS4uLg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBFcnJvciBEaWFsb2cNCi1zZWFyY2hFcnJvcl90aXRsZT1cdWJhNTRcdWMxOGNcdWI0ZGMgXHVhYzgwXHVjMGM5DQotc2VhcmNoRXJyb3JfbXNnPUlVUFMwMTAwRTogXHVhYzgwXHVjMGM5IFx1Yzg3MFx1Yzc5MVx1Yzc0NCBcdWM5YzRcdWQ1ODlcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4NCi1zZWFyY2hFcnJvcl9yZWFzb249XHVkNjA0XHVjN2FjIFx1YzVmNFx1YjgyNCBcdWM3ODhcdWIyOTQgXHViYTU0XHVjMThjXHViNGRjIFx1Yjc3Y1x1Yzc3NFx1YmUwY1x1YjdlY1x1YjlhY1x1YWMwMCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuXG5cblx1YmE1NFx1YzE4Y1x1YjRkYyBcdWI3N2NcdWM3NzRcdWJlMGNcdWI3ZWNcdWI5YWNcdWI5N2MgXHVjNWY0XHVhY2UwIFx1YjJlNFx1YzJkYyBcdWMyZGNcdWIzYzRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuDQotDQotIyBNZXRob2QgU2VhcmNoIFJlc3VsdA0KLXNlYXJjaFJlc3VsdF9tZXRob2RDb250ZW50PVx1YmE1NFx1YzE4Y1x1YjRkYyBcdWNlZThcdWQxNTBcdWNlMjANCi1zZWFyY2hSZXN1bHRfY29udGVudFBhY2thZ2VzPVx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWQzMjhcdWQwYTRcdWM5YzANCi1zZWFyY2hSZXN1bHRfc3RhbmRhcmRDYXRlZ29yaWVzPVx1ZDQ1Y1x1YzkwMCBcdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMNCi1zZWFyY2hSZXN1bHRfZGlzY2lwbGluZXM9XHVjNmQwXHVjZTU5DQotc2VhcmNoUmVzdWx0X2RvbWFpbnM9XHViM2M0XHViYTU0XHVjNzc4DQotc2VhcmNoUmVzdWx0X3dvcmtQcm9kdWN0VHlwZXM9XHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWM3MjBcdWQ2MTUNCi1zZWFyY2hSZXN1bHRfcm9sZVNldHM9XHVjNWVkXHVkNTYwIFx1YzEzOFx1ZDJiOA0KLXNlYXJjaFJlc3VsdF90b29scz1cdWIzYzRcdWFkNmMNCi1zZWFyY2hSZXN1bHRfY3VzdG9tQ2F0ZWdvcmllcz1cdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4IFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYw0KLXNlYXJjaFJlc3VsdF9wcm9jZXNzZXM9XHVkNTA0XHViODVjXHVjMTM4XHVjMmE0DQotc2VhcmNoUmVzdWx0X2NhcGFiaWxpdHlQYXR0ZXJucz1cdWFlMzBcdWIyYTUgXHVkMzI4XHVkMTM0DQotc2VhcmNoUmVzdWx0X2RlbGl2ZXJ5UHJvY2Vzc2VzPVx1YzgwNFx1YjJlYyBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQNCi1zZWFyY2hSZXN1bHRfbWF0Y2g9Jyd7MH0nJyAtIDEgXHVjNzdjXHVjZTU4DQotc2VhcmNoUmVzdWx0X21hdGNoZXM9Jyd7MH0nJyAtIHsxfSBcdWM3N2NcdWNlNTgNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXNfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGFjY2FhMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBNZXRob2QgU2VhcmNoIFBhZ2UNCi1zZWFyY2hTdHJpbmdMYWJlbF90ZXh0PVRleHRvICgqID0gcXVhbHF1ZXIgY2FkZWlhLCA/ID0gcXVhbHF1ZXIgY2FyYWN0ZXJlKToNCi1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1TZW5zXHUwMGVkdmVsIGEgbWFpXHUwMGZhc2N1bGFzIGUgbWluXHUwMGZhc2N1bGFzDQotZWxlbWVudE5hbWVMYWJlbF90ZXh0PU5vbWUgZG8gZWxlbWVudG8gZGUgbVx1MDBlOXRvZG8gb3UgcGFkclx1MDBlM28gZG8gbm9tZSBkZSBhcHJlc2VudGFcdTAwZTdcdTAwZTNvOg0KLXNjb3BlR3JvdXBfdGV4dD1Fc2NvcG8NCi1yb2xlQ2hlY2tib3hfdGV4dD1GdW5cdTAwZTdcdTAwZTNvDQotdGFza0NoZWNrYm94X3RleHQ9VGFyZWZhDQotd29ya1Byb2R1Y3RDaGVja2JveF90ZXh0PVByb2R1dG8gZGUgVHJhYmFsaG8NCi0jIE1ldGhvZCBTZWFyY2ggUXVlcnkNCi1zZWFyY2hRdWVyeV90ZXh0PVByb2N1cmEgZGUgTVx1MDBlOXRvZG8NCi0NCi0jIE1ldGhvZCBTZWFyY2ggUHJvZ3Jlc3MgRGlhbG9nDQotc2NhbkxpYnJhcnlUYXNrX25hbWU9VmFycmVuZG8gYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MuLi4NCi1zY2FuRWxlbWVudFRhc2tfbmFtZT1WYXJyZW5kbyBlbGVtZW50byBkZSBtXHUwMGU5dG9kbyAnJ3swfScnLi4uDQotDQotIyBNZXRob2QgU2VhcmNoIEVycm9yIERpYWxvZw0KLXNlYXJjaEVycm9yX3RpdGxlPVByb2N1cmEgZGUgTVx1MDBlOXRvZG8NCi1zZWFyY2hFcnJvcl9tc2c9SVVQUzAxMDBFOiBBIG9wZXJhXHUwMGU3XHUwMGUzbyBkZSBwcm9jdXJhIG5cdTAwZTNvIHBvZGUgY29udGludWFyLg0KLXNlYXJjaEVycm9yX3JlYXNvbj1OZW5odW1hIGJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zIGVzdFx1MDBlMSBhYmVydGEgbm8gbW9tZW50by5cblxuQWJyYSB1bWEgYmlibGlvdGVjYSBkZSBtXHUwMGU5dG9kb3MgZSB0ZW50ZSBub3ZhbWVudGUuDQotDQotIyBNZXRob2QgU2VhcmNoIFJlc3VsdA0KLXNlYXJjaFJlc3VsdF9tZXRob2RDb250ZW50PUNvbnRlXHUwMGZhZG8gZG8gTVx1MDBlOXRvZG8NCi1zZWFyY2hSZXN1bHRfY29udGVudFBhY2thZ2VzPVBhY290ZXMgZGUgQ29udGVcdTAwZmFkbw0KLXNlYXJjaFJlc3VsdF9zdGFuZGFyZENhdGVnb3JpZXM9Q2F0ZWdvcmlhcyBQYWRyXHUwMGUzbw0KLXNlYXJjaFJlc3VsdF9kaXNjaXBsaW5lcz1EaXNjaXBsaW5hcw0KLXNlYXJjaFJlc3VsdF9kb21haW5zPURvbVx1MDBlZG5pb3MNCi1zZWFyY2hSZXN1bHRfd29ya1Byb2R1Y3RUeXBlcz1UaXBvcyBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotc2VhcmNoUmVzdWx0X3JvbGVTZXRzPUNvbmp1bnRvcyBkZSBGdW5cdTAwZTdcdTAwZjVlcw0KLXNlYXJjaFJlc3VsdF90b29scz1GZXJyYW1lbnRhcw0KLXNlYXJjaFJlc3VsdF9jdXN0b21DYXRlZ29yaWVzPUNhdGVnb3JpYXMgUGVyc29uYWxpemFkYXMNCi1zZWFyY2hSZXN1bHRfcHJvY2Vzc2VzPVByb2Nlc3Nvcw0KLXNlYXJjaFJlc3VsdF9jYXBhYmlsaXR5UGF0dGVybnM9UGFkclx1MDBmNWVzIGRlIFJlY3Vyc28NCi1zZWFyY2hSZXN1bHRfZGVsaXZlcnlQcm9jZXNzZXM9UHJvY2Vzc29zIGRlIEVudHJlZ2ENCi1zZWFyY2hSZXN1bHRfbWF0Y2g9Jyd7MH0nJyAtIDEgY29ycmVzcG9uZFx1MDBlYW5jaWENCi1zZWFyY2hSZXN1bHRfbWF0Y2hlcz0nJ3swfScnIC0gezF9IGNvcnJlc3BvbmRcdTAwZWFuY2lhcw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlc196aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzM1ZTA4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIE1ldGhvZCBTZWFyY2ggUGFnZQ0KLXNlYXJjaFN0cmluZ0xhYmVsX3RleHQ9XHU2NTg3XHU2NzJjXHVmZjA4KiA9IFx1NGVmYlx1NjEwZlx1NWI1N1x1N2IyNlx1NGUzMlx1ZmYwYz8gPSBcdTRlZmJcdTYxMGZcdTViNTdcdTdiMjZcdWZmMDlcdWZmMWENCi1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1cdTUzM2FcdTUyMDZcdTU5MjdcdTVjMGZcdTUxOTkNCi1lbGVtZW50TmFtZUxhYmVsX3RleHQ9XHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwXHU1NDBkXHU3OWYwXHU2MjE2XHU2NjNlXHU3OTNhXHU1NDBkXHU3OWYwXHU2YTIxXHU1ZjBmXHVmZjFhDQotc2NvcGVHcm91cF90ZXh0PVx1ODMwM1x1NTZmNA0KLXJvbGVDaGVja2JveF90ZXh0PVx1ODlkMlx1ODI3Mg0KLXRhc2tDaGVja2JveF90ZXh0PVx1NGVmYlx1NTJhMQ0KLXdvcmtQcm9kdWN0Q2hlY2tib3hfdGV4dD1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzENCi0NCi0jIE1ldGhvZCBTZWFyY2ggUXVlcnkNCi1zZWFyY2hRdWVyeV90ZXh0PVx1NjViOVx1NmNkNVx1NjQxY1x1N2QyMg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBQcm9ncmVzcyBEaWFsb2cNCi1zY2FuTGlicmFyeVRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTYyNmJcdTYzY2ZcdTY1YjlcdTZjZDVcdTVlOTMuLi4NCi1zY2FuRWxlbWVudFRhc2tfbmFtZT1cdTZiNjNcdTU3MjhcdTYyNmJcdTYzY2ZcdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTIwMWN7MH1cdTIwMWQuLi4NCi0NCi0jIE1ldGhvZCBTZWFyY2ggRXJyb3IgRGlhbG9nDQotc2VhcmNoRXJyb3JfdGl0bGU9XHU2NWI5XHU2Y2Q1XHU2NDFjXHU3ZDIyDQotc2VhcmNoRXJyb3JfbXNnPUlVUFMwMTAwRTogXHU2NDFjXHU3ZDIyXHU2NGNkXHU0ZjVjXHU2NWUwXHU2Y2Q1XHU3ZWU3XHU3ZWVkXHUzMDAyDQotc2VhcmNoRXJyb3JfcmVhc29uPVx1NWY1M1x1NTI0ZFx1NmNhMVx1NjcwOVx1NjI1M1x1NWYwMFx1NGVmYlx1NGY1NVx1NjViOVx1NmNkNVx1NWU5M1x1MzAwMlxuXG5cdTYyNTNcdTVmMDBcdTY3ZDBcdTRlMmFcdTY1YjlcdTZjZDVcdTVlOTNcdTVlNzZcdTkxY2RcdThiZDVcdTMwMDINCi0NCi0jIE1ldGhvZCBTZWFyY2ggUmVzdWx0DQotc2VhcmNoUmVzdWx0X21ldGhvZENvbnRlbnQ9XHU2NWI5XHU2Y2Q1XHU1MTg1XHU1YmI5DQotc2VhcmNoUmVzdWx0X2NvbnRlbnRQYWNrYWdlcz1cdTUxODVcdTViYjlcdTUzMDUNCi1zZWFyY2hSZXN1bHRfc3RhbmRhcmRDYXRlZ29yaWVzPVx1NjgwN1x1NTFjNlx1N2M3Ylx1NTIyYg0KLXNlYXJjaFJlc3VsdF9kaXNjaXBsaW5lcz1cdTg5YzRcdTdhMGINCi1zZWFyY2hSZXN1bHRfZG9tYWlucz1cdTU3ZGYNCi1zZWFyY2hSZXN1bHRfd29ya1Byb2R1Y3RUeXBlcz1cdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTdjN2JcdTU3OGINCi1zZWFyY2hSZXN1bHRfcm9sZVNldHM9XHU4OWQyXHU4MjcyXHU5NmM2DQotc2VhcmNoUmVzdWx0X3Rvb2xzPVx1NWRlNVx1NTE3Nw0KLXNlYXJjaFJlc3VsdF9jdXN0b21DYXRlZ29yaWVzPVx1NWI5YVx1NTIzNlx1N2M3Ylx1NTIyYg0KLXNlYXJjaFJlc3VsdF9wcm9jZXNzZXM9XHU2ZDQxXHU3YTBiDQotc2VhcmNoUmVzdWx0X2NhcGFiaWxpdHlQYXR0ZXJucz1cdTgwZmRcdTUyOWJcdTZhMjFcdTVmMGYNCi1zZWFyY2hSZXN1bHRfZGVsaXZlcnlQcm9jZXNzZXM9XHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiDQotc2VhcmNoUmVzdWx0X21hdGNoPVx1MjAxY3swfVx1MjAxZFx1ZmYwZCAxIFx1NGUyYVx1NTMzOVx1OTE0ZA0KLXNlYXJjaFJlc3VsdF9tYXRjaGVzPVx1MjAxY3swfVx1MjAxZFx1ZmYwZCB7MX0gXHU0ZTJhXHU1MzM5XHU5MTRkDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhN2U1N2YuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBQYWdlDQotc2VhcmNoU3RyaW5nTGFiZWxfdGV4dD1cdTY1ODdcdTViNTdcdWZmMDgqID0gXHU0ZWZiXHU0ZjU1XHU1YjU3XHU0ZTMyXHVmZjBjPyA9IFx1NGVmYlx1NGY1NVx1NWI1N1x1NTE0M1x1ZmYwOVx1ZmYxYQ0KLWNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0PVx1NTM0MFx1NTIwNlx1NTkyN1x1NWMwZlx1NWJlYg0KLWVsZW1lbnROYW1lTGFiZWxfdGV4dD1cdTY1YjlcdTZjZDVcdTUxNDNcdTdkMjBcdTU0MGRcdTdhMzFcdTYyMTZcdTU0NDhcdTczZmVcdTU0MGRcdTdhMzFcdTU3OGJcdTZhMjNcdWZmMWENCi1zY29wZUdyb3VwX3RleHQ9XHU3YmM0XHU1NzBkDQotcm9sZUNoZWNrYm94X3RleHQ9XHU4OWQyXHU4MjcyDQotdGFza0NoZWNrYm94X3RleHQ9XHU0ZjVjXHU2OTZkDQotd29ya1Byb2R1Y3RDaGVja2JveF90ZXh0PVx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBRdWVyeQ0KLXNlYXJjaFF1ZXJ5X3RleHQ9XHU2NWI5XHU2Y2Q1XHU2NDFjXHU1YzBiDQotDQotIyBNZXRob2QgU2VhcmNoIFByb2dyZXNzIERpYWxvZw0KLXNjYW5MaWJyYXJ5VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NjM4M1x1NjNjZlx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYi4uLg0KLXNjYW5FbGVtZW50VGFza19uYW1lPVx1NmI2M1x1NTcyOFx1NjM4M1x1NjNjZlx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMCAnJ3swfScnLi4uDQotDQotIyBNZXRob2QgU2VhcmNoIEVycm9yIERpYWxvZw0KLXNlYXJjaEVycm9yX3RpdGxlPVx1NjViOVx1NmNkNVx1NjQxY1x1NWMwYg0KLXNlYXJjaEVycm9yX21zZz1JVVBTMDEwMEU6IFx1NzEyMVx1NmNkNVx1N2U3Y1x1N2U4Y1x1NjQxY1x1NWMwYlx1NGY1Y1x1Njk2ZFx1MzAwMg0KLXNlYXJjaEVycm9yX3JlYXNvbj1cdTc2ZWVcdTUyNGRcdTY3MmFcdTk1OGJcdTU1NWZcdTRlZmJcdTRmNTVcdTY1YjlcdTZjZDVcdTdhMGJcdTVmMGZcdTVlYWJcdTMwMDJcblxuXHU4YWNiXHU5NThiXHU1NTVmXHU0ZTAwXHU1MDBiXHU2NWI5XHU2Y2Q1XHU3YTBiXHU1ZjBmXHU1ZWFiXHVmZjBjXHU3MTM2XHU1ZjhjXHU1MThkXHU4YTY2XHU0ZTAwXHU2YjIxXHUzMDAyDQotDQotIyBNZXRob2QgU2VhcmNoIFJlc3VsdA0KLXNlYXJjaFJlc3VsdF9tZXRob2RDb250ZW50PVx1NjViOVx1NmNkNVx1NTE2N1x1NWJiOQ0KLXNlYXJjaFJlc3VsdF9jb250ZW50UGFja2FnZXM9XHU1MTY3XHU1YmI5XHU1OTU3XHU0ZWY2DQotc2VhcmNoUmVzdWx0X3N0YW5kYXJkQ2F0ZWdvcmllcz1cdTZhMTlcdTZlOTZcdTdhMmVcdTk4NWUNCi1zZWFyY2hSZXN1bHRfZGlzY2lwbGluZXM9XHU4OThmXHU3YmM0DQotc2VhcmNoUmVzdWx0X2RvbWFpbnM9XHU5ODE4XHU1N2RmDQotc2VhcmNoUmVzdWx0X3dvcmtQcm9kdWN0VHlwZXM9XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU5ODVlXHU1NzhiDQotc2VhcmNoUmVzdWx0X3JvbGVTZXRzPVx1ODlkMlx1ODI3Mlx1OTZjNg0KLXNlYXJjaFJlc3VsdF90b29scz1cdTVkZTVcdTUxNzcNCi1zZWFyY2hSZXN1bHRfY3VzdG9tQ2F0ZWdvcmllcz1cdTgxZWFcdThhMDJcdTdhMmVcdTk4NWUNCi1zZWFyY2hSZXN1bHRfcHJvY2Vzc2VzPVx1N2EwYlx1NWU4Zg0KLXNlYXJjaFJlc3VsdF9jYXBhYmlsaXR5UGF0dGVybnM9XHU1MjlmXHU4MGZkXHU1NzhiXHU2YTIzDQotc2VhcmNoUmVzdWx0X2RlbGl2ZXJ5UHJvY2Vzc2VzPVx1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYg0KLXNlYXJjaFJlc3VsdF9tYXRjaD0nJ3swfScnIC0gMSBcdTUwMGJcdTc2ZjhcdTdiMjYNCi1zZWFyY2hSZXN1bHRfbWF0Y2hlcz0nJ3swfScnIC0gezF9IFx1NTAwYlx1NzZmOFx1N2IyNg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGI0ZTNjZi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNTcyOGJhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBTZWFyY2ggVUkgKE5MMikKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1NGZjYTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFhY2UyMDkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9XHUwNDFmXHUwNDNlXHUwNDM4XHUwNDQxXHUwNDNhIEVQRiAtIFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSBcdTA0MzhcdTA0M2RcdTA0NDJcdTA0MzVcdTA0NDBcdTA0NDRcdTA0MzVcdTA0MzlcdTA0NDENCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jIE1ldGhvZCBTZWFyY2ggRGlhbG9nDQotbWV0aG9kU2VhcmNoRGlhbG9nTGFiZWw9XHUwNDFmXHUwNDNlXHUwNDM4XHUwNDQxXHUwNDNhIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNDlkODc2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDIvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIE1ldGhvZCBTZWFyY2ggUGFnZQ0KLXNlYXJjaFN0cmluZ0xhYmVsX3RleHQ9XHUwNDIyXHUwNDM1XHUwNDNhXHUwNDQxXHUwNDQyICgqID0gXHUwNDNiXHUwNDRlXHUwNDMxXHUwNDMwXHUwNDRmIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzYVx1MDQzMCwgPyA9IFx1MDQzYlx1MDQ0ZVx1MDQzMVx1MDQzZVx1MDQzOSBcdTA0NDFcdTA0MzhcdTA0M2NcdTA0MzJcdTA0M2VcdTA0M2IpOg0KLWNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0PVx1MDQyMSBcdTA0NDNcdTA0NDdcdTA0MzVcdTA0NDJcdTA0M2VcdTA0M2MgXHUwNDQwXHUwNDM1XHUwNDMzXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwDQotZWxlbWVudE5hbWVMYWJlbF90ZXh0PVx1MDQyOFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZCBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2QgXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzOFx1MDQzYlx1MDQzOCBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0M2QgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDNlXHUwNDMyIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMDoNCi1zY29wZUdyb3VwX3RleHQ9XHUwNDFlXHUwNDMxXHUwNDNiXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDRjDQotcm9sZUNoZWNrYm94X3RleHQ9XHUwNDIwXHUwNDNlXHUwNDNiXHUwNDRjDQotdGFza0NoZWNrYm94X3RleHQ9XHUwNDE3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDMwDQotd29ya1Byb2R1Y3RDaGVja2JveF90ZXh0PVx1MDQyMFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDINCi0NCi0jIE1ldGhvZCBTZWFyY2ggUXVlcnkNCi1zZWFyY2hRdWVyeV90ZXh0PVx1MDQxZlx1MDQzZVx1MDQzOFx1MDQ0MVx1MDQzYSBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi0NCi0jIE1ldGhvZCBTZWFyY2ggUHJvZ3Jlc3MgRGlhbG9nDQotc2NhbkxpYnJhcnlUYXNrX25hbWU9XHUwNDFmXHUwNDNlXHUwNDM4XHUwNDQxXHUwNDNhIFx1MDQzMiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M2JcdTA0MzhcdTA0M2VcdTA0NDJcdTA0MzVcdTA0M2FcdTA0MzUgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyLi4uDQotc2NhbkVsZW1lbnRUYXNrX25hbWU9XHUwNDFmXHUwNDNlXHUwNDM4XHUwNDQxXHUwNDNhIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMCBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzAgJyd7MH0nJy4uLg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBFcnJvciBEaWFsb2cNCi1zZWFyY2hFcnJvcl90aXRsZT1cdTA0MWZcdTA0M2VcdTA0MzhcdTA0NDFcdTA0M2EgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDMyDQotc2VhcmNoRXJyb3JfbXNnPUlVUFMwMTAwRTogXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDNlXHUwNDNiXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzOFx1MDQ0MVx1MDQzYVx1MDQzMCBcdTA0M2RcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2UuDQotc2VhcmNoRXJyb3JfcmVhc29uPVx1MDQxZFx1MDQzNSBcdTA0M2VcdTA0NDJcdTA0M2FcdTA0NDBcdTA0NGJcdTA0NDJcdTA0MzAgXHUwNDMxXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDMwIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMi5cblxuXHUwNDFlXHUwNDQyXHUwNDNhXHUwNDQwXHUwNDNlXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzYlx1MDQzOFx1MDQzZVx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MyBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzIgXHUwNDM4IFx1MDQzZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGUuDQotDQotIyBNZXRob2QgU2VhcmNoIFJlc3VsdA0KLXNlYXJjaFJlc3VsdF9tZXRob2RDb250ZW50PVx1MDQxY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0YiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1zZWFyY2hSZXN1bHRfY29udGVudFBhY2thZ2VzPVx1MDQxZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0Mlx1MDQ0YiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzINCi1zZWFyY2hSZXN1bHRfc3RhbmRhcmRDYXRlZ29yaWVzPVx1MDQyMVx1MDQ0Mlx1MDQzMFx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzgNCi1zZWFyY2hSZXN1bHRfZGlzY2lwbGluZXM9XHUwNDE0XHUwNDM4XHUwNDQxXHUwNDQ2XHUwNDM4XHUwNDNmXHUwNDNiXHUwNDM4XHUwNDNkXHUwNDRiDQotc2VhcmNoUmVzdWx0X2RvbWFpbnM9XHUwNDE0XHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDRiDQotc2VhcmNoUmVzdWx0X3dvcmtQcm9kdWN0VHlwZXM9XHUwNDIyXHUwNDM4XHUwNDNmXHUwNDRiIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzNVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzANCi1zZWFyY2hSZXN1bHRfcm9sZVNldHM9XHUwNDFkXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQwXHUwNDRiIFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzNVx1MDQzOQ0KLXNlYXJjaFJlc3VsdF90b29scz1cdTA0MThcdTA0M2RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGINCi1zZWFyY2hSZXN1bHRfY3VzdG9tQ2F0ZWdvcmllcz1cdTA0MWZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzUgXHUwNDNhXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDM4DQotc2VhcmNoUmVzdWx0X3Byb2Nlc3Nlcz1cdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0NGINCi1zZWFyY2hSZXN1bHRfY2FwYWJpbGl0eVBhdHRlcm5zPVx1MDQyOFx1MDQzMFx1MDQzMVx1MDQzYlx1MDQzZVx1MDQzZFx1MDQ0YiBcdTA0MzJcdTA0M2VcdTA0MzdcdTA0M2NcdTA0M2VcdTA0MzZcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkNCi1zZWFyY2hSZXN1bHRfZGVsaXZlcnlQcm9jZXNzZXM9XHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDRiIFx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYVx1MDQzOA0KLXNlYXJjaFJlc3VsdF9tYXRjaD0nJ3swfScnIC0gMSBcdTA0NDFcdTA0M2VcdTA0MzJcdTA0M2ZcdTA0MzBcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1zZWFyY2hSZXN1bHRfbWF0Y2hlcz0nJ3swfScnIC0gezF9IFx1MDQ0MVx1MDQzZVx1MDQzMlx1MDQzZlx1MDQzMFx1MDQzNFx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzOQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDJhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OGQzNWQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Y2Y2YWYxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgU2VhcmNoIFVJIChOTDJhKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyYS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDRlNjgyMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kYS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjRiODg5OC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gYnJ1Z2VyZ3JcdTAwZTZuc2VmbGFkZSB0aWwgc1x1MDBmOGduaW5nDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyBNZXRob2QgU2VhcmNoIERpYWxvZw0KLW1ldGhvZFNlYXJjaERpYWxvZ0xhYmVsPU1ldG9kZXNcdTAwZjhnbmluZw0KLQ0KLSAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDJhL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ3MTY3MmEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzX2RhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIE1ldGhvZCBTZWFyY2ggUGFnZQ0KLXNlYXJjaFN0cmluZ0xhYmVsX3RleHQ9VGVrc3QgKCogPSB2aWxrXHUwMGU1cmxpZyBzdHJlbmcgPyA9IHZpbGtcdTAwZTVybGlndCB0ZWduKToNCi1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1Gb3Jza2VsIHBcdTAwZTUgc3RvcmUvc21cdTAwZTUgYm9nc3RhdmVyDQotZWxlbWVudE5hbWVMYWJlbF90ZXh0PU1cdTAwZjhuc3RlciBmb3IgbWV0b2RlZWxlbWVudG5hdm4gZWxsZXIgcHJcdTAwZTZzZW50YXRpb25zbmF2bjoNCi1zY29wZUdyb3VwX3RleHQ9T21mYW5nDQotcm9sZUNoZWNrYm94X3RleHQ9Um9sbGUNCi10YXNrQ2hlY2tib3hfdGV4dD1PcGdhdmUNCi13b3JrUHJvZHVjdENoZWNrYm94X3RleHQ9QXJiZWpkc3Byb2R1a3QNCi0NCi0jIE1ldGhvZCBTZWFyY2ggUXVlcnkNCi1zZWFyY2hRdWVyeV90ZXh0PU1ldG9kZXNcdTAwZjhnbmluZw0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBQcm9ncmVzcyBEaWFsb2cNCi1zY2FuTGlicmFyeVRhc2tfbmFtZT1TY2FubmVyIG1ldG9kZWJpYmxpb3Rlay4uLg0KLXNjYW5FbGVtZW50VGFza19uYW1lPVNjYW5uZXIgbWV0b2RlZWxlbWVudGV0ICcnezB9JycuLi4NCi0NCi0jIE1ldGhvZCBTZWFyY2ggRXJyb3IgRGlhbG9nDQotc2VhcmNoRXJyb3JfdGl0bGU9TWV0b2Rlc1x1MDBmOGduaW5nDQotc2VhcmNoRXJyb3JfbXNnPUlVUFMwMTAwRTogU1x1MDBmOGdlZnVua3Rpb24ga2FuIGlra2UgZm9ydHNcdTAwZTZ0dGUuDQotc2VhcmNoRXJyb3JfcmVhc29uPURlciBlciBpa2tlIG5vZ2V0IFx1MDBlNWJlbnQgbWV0b2RlYmlibGlvdGVrIGkgXHUwMGY4amVibGlra2V0LlxuXG5cdTAwYzVibiBldCBtZXRvZGViaWJsaW90ZWssIG9nIHByXHUwMGY4diBpZ2VuLg0KLQ0KLSMgTWV0aG9kIFNlYXJjaCBSZXN1bHQNCi1zZWFyY2hSZXN1bHRfbWV0aG9kQ29udGVudD1NZXRvZGVpbmRob2xkDQotc2VhcmNoUmVzdWx0X2NvbnRlbnRQYWNrYWdlcz1JbmRob2xkc3Bha2tlcg0KLXNlYXJjaFJlc3VsdF9zdGFuZGFyZENhdGVnb3JpZXM9U3RhbmRhcmRrYXRlZ29yaWVyDQotc2VhcmNoUmVzdWx0X2Rpc2NpcGxpbmVzPURpc2NpcGxpbmVyDQotc2VhcmNoUmVzdWx0X2RvbWFpbnM9RG9tXHUwMGU2bmVyDQotc2VhcmNoUmVzdWx0X3dvcmtQcm9kdWN0VHlwZXM9QXJiZWpkc3Byb2R1a3R0eXBlcg0KLXNlYXJjaFJlc3VsdF9yb2xlU2V0cz1Sb2xsZXNcdTAwZTZ0DQotc2VhcmNoUmVzdWx0X3Rvb2xzPVZcdTAwZTZya3RcdTAwZjhqZXINCi1zZWFyY2hSZXN1bHRfY3VzdG9tQ2F0ZWdvcmllcz1UaWxwYXNzZWRlIGthdGVnb3JpZXINCi1zZWFyY2hSZXN1bHRfcHJvY2Vzc2VzPVByb2Nlc3Nlcg0KLXNlYXJjaFJlc3VsdF9jYXBhYmlsaXR5UGF0dGVybnM9RnVua3Rpb25zbVx1MDBmOG5zdHJlDQotc2VhcmNoUmVzdWx0X2RlbGl2ZXJ5UHJvY2Vzc2VzPUxldmVyaW5nc3Byb2Nlc3Nlcg0KLXNlYXJjaFJlc3VsdF9tYXRjaD0nJ3swfScnIC0gMSBmb3Jla29tc3QNCi1zZWFyY2hSZXN1bHRfbWF0Y2hlcz0nJ3swfScnIC0gezF9IGZvcmVrb21zdGVyDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MGVjMDliLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJjMDNlNmYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIENvbXBvc2VyIFVNQSBFY29yZSAoTkwxKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmU3YjAxMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9lcy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZnIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2phLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9rby5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcHRfQlIucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX0NOLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9UVy5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2l0LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9wbHVnaW5fZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDBiZDVjOC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgLSBVTUEtRWNvcmUtRXJ3ZWl0ZXJ1bmcNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjA4ZmViZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1BbXBsaWFjaVx1MDBmM24gRWNvcmUgZGUgVU1BIGRlIEVQRg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNzQ2MTViLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUV4dGVuc2lvbiBFY29yZSBVTUEgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9wbHVnaW5faXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmODNmYTAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9wbHVnaW5faXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFVNQSBFY29yZSBFeHRlbnNpb24NCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9wbHVnaW5famEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmY4M2ZhMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgVU1BIEVjb3JlIEV4dGVuc2lvbg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NWUwZTVjLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBVTUEgRWNvcmUgXHVkNjU1XHVjN2E1DQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlNTI3OTMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RXh0ZW5zXHUwMGUzbyBVTUEgRWNvcmUgZG8gRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIxYWY1ZWYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFVNQSBFY29yZSBcdTYyNjlcdTVjNTUNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmY4M2ZhMC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgVU1BIEVjb3JlIEV4dGVuc2lvbg0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjAxM2UxZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZGU4YjE4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBVTUEgRWNvcmUgKE5MMikKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1NGZjYTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1YzVmZTQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIC0gXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IEVjb3JlIFVNQQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDJhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNWY1MGExLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNmRmYzcxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgVU1BIEVjb3JlIChOTDJhKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyYS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDRlNjgyMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kYS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTI2ZDQ3NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFVNQSBFY29yZSAtIHVkdmlkZWxzZQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDEvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1ZjVmN2MuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMjNmMWYxLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwxLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogZnJhZ21lbnQKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkYTJjOTEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1zb3VyY2UubmwxLmphciA9IHNyYy8NCi1vdXRwdXQubmwxLmphciA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBubDEuamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZXMucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2ZyLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9qYS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fa28ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl96aF9DTi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfVFcucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RlLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9pdC5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIGZyYWdtZW50LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDEvZnJhZ21lbnQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NzQ5MThlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9mcmFnbWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mcmFnbWVudE5hbWU9RVBGIENvbXBvc2VyIFVNQSBFZGl0IChOTDEpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZWJmZDU4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5fZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLXBsdWdpbk5hbWUgPSBFTUYgLSBVbnRlcnN0XHUwMGZjdHp1bmcgZlx1MDBmY3IgVU1BLUJlYXJiZWl0dW5nDQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dCA9IHswfQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MiA9IHsxfSB7MH0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDMgPSB7MX0NCi1fVUlfQ3JlYXRlQ2hpbGRfdG9vbHRpcCA9IENyZWF0ZSBOZXcgezB9IFVuZGVyIHsxfSBGZWF0dXJlDQotX1VJX0NyZWF0ZUNoaWxkX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IGNoaWxkIG9mIHR5cGUgezB9IGZvciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlIHNlbGVjdGVkIHsyfS4NCi1fVUlfQ3JlYXRlU2libGluZ19kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBzaWJsaW5nIG9mIHR5cGUgezB9IGZvciB0aGUgc2VsZWN0ZWQgezJ9LCB1bmRlciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlaXIgcGFyZW50Lg0KLQ0KLV9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24gPSB7MH0gdm9uIHsxfQ0KLQ0KLV9VSV9DbGFzc2lmaWVyX3R5cGUgPSBLbGFzc2lmaWthdGlvbnNtZXJrbWFsDQotX1VJX1R5cGVfdHlwZSA9IFR5cA0KLV9VSV9FbGVtZW50X3R5cGUgPSBFbGVtZW50DQotX1VJX05hbWVkRWxlbWVudF90eXBlID0gQmVuYW5udGVzIEVsZW1lbnQNCi1fVUlfUGFja2FnZWFibGVFbGVtZW50X3R5cGUgPSBQYWtldGZcdTAwZTRoaWdlcyBFbGVtZW50DQotX1VJX1BhY2thZ2VfdHlwZSA9IFBha2V0DQotX1VJX05hbWVzcGFjZV90eXBlID0gTmFtZXNwYWNlDQotX1VJX01ldGhvZEVsZW1lbnRfdHlwZSA9IE1ldGhvZGVuZWxlbWVudA0KLV9VSV9Db25zdHJhaW50X3R5cGUgPSBWb3JnYWJlDQotX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUgPSBJbmhhbHRzZWxlbWVudA0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSA9IEJlc2NocmVpYmJhcmVzIEVsZW1lbnQNCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUgPSBJbmhhbHRzYmVzY2hyZWlidW5nDQotX1VJX1NlY3Rpb25fdHlwZSA9IEFic2Nobml0dA0KLV9VSV9Sb2xlX3R5cGUgPSBSb2xsZQ0KLV9VSV9Xb3JrUHJvZHVjdF90eXBlID0gQXJiZWl0c2VyZ2VibmlzDQotX1VJX1Rhc2tfdHlwZSA9IEF1ZmdhYmUNCi1fVUlfV29ya0RlZmluaXRpb25fdHlwZSA9IEFyYmVpdHNkZWZpbml0aW9uDQotX1VJX1N0ZXBfdHlwZSA9IFNjaHJpdHQNCi1fVUlfR3VpZGFuY2VfdHlwZSA9IEFubGVpdHVuZw0KLV9VSV9BcnRpZmFjdF90eXBlID0gQXJ0ZWZha3QNCi1fVUlfRGVsaXZlcmFibGVfdHlwZSA9IExpZWZlcmdlZ2Vuc3RhbmQNCi1fVUlfT3V0Y29tZV90eXBlID0gUmVzdWx0YXQNCi1fVUlfTWV0aG9kUGFja2FnZV90eXBlID0gTWV0aG9kZW5wYWtldA0KLV9VSV9Db250ZW50UGFja2FnZV90eXBlID0gSW5oYWx0c3Bha2V0DQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSA9IEFydGVmYWt0YmVzY2hyZWlidW5nDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fdHlwZSA9IEFyYmVpdHNlcmdlYm5pc2Jlc2NocmVpYnVuZw0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3R5cGUgPSBCZXNjaHJlaWJ1bmcgZGVzIExpZWZlcmdlZ2Vuc3RhbmRzDQotX1VJX1JvbGVEZXNjcmlwdGlvbl90eXBlID0gUm9sbGVuYmVzY2hyZWlidW5nDQotX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlID0gQXVmZ2FiZW5iZXNjaHJlaWJ1bmcNCi1fVUlfR3VpZGFuY2VEZXNjcmlwdGlvbl90eXBlID0gQW5sZWl0dW5nc2Jlc2NocmVpYnVuZw0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUgPSBWZXJmYWhyZW5zYmVzY2hyZWlidW5nDQotX1VJX1BvaW50X3R5cGUgPSBQdW5rdA0KLV9VSV9HcmFwaEVsZW1lbnRfdHlwZSA9IEdyYXBoZWxlbWVudA0KLV9VSV9EaWFncmFtRWxlbWVudF90eXBlID0gRGlhZ3JhbW1lbGVtZW50DQotX1VJX0RpYWdyYW1MaW5rX3R5cGUgPSBEaWFncmFtbXZlcmtuXHUwMGZjcGZ1bmcNCi1fVUlfR3JhcGhDb25uZWN0b3JfdHlwZSA9IEdyYXBodmVyYmluZHVuZw0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2UNCi1fVUlfRGltZW5zaW9uX3R5cGUgPSBEaW1lbnNpb24NCi1fVUlfUmVmZXJlbmNlX3R5cGUgPSBSZWZlcmVueg0KLV9VSV9Qcm9wZXJ0eV90eXBlID0gRWlnZW5zY2hhZnQNCi1fVUlfR3JhcGhFZGdlX3R5cGUgPSBHcmFwaGthbnRlDQotX1VJX0RpYWdyYW1fdHlwZSA9IERpYWdyYW1tDQotX1VJX0dyYXBoTm9kZV90eXBlID0gR3JhcGhrbm90ZW4NCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZSA9IEVpbmZhY2hlcyBTZW1hbnRpa21vZGVsbGVsZW1lbnQNCi1fVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gU2VtYW50aWMgTW9kZWwgQnJpZGdlIC0gVU1BDQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2UgLSBCYXNpcw0KLV9VSV9MZWFmRWxlbWVudF90eXBlID0gQmxhdHRlbGVtZW50DQotX1VJX1RleHRFbGVtZW50X3R5cGUgPSBUZXh0ZWxlbWVudA0KLV9VSV9JbWFnZV90eXBlID0gQmlsZA0KLV9VSV9HcmFwaGljUHJpbWl0aXZlX3R5cGUgPSBHcmFmaWtiYXNpc2VsZW1lbnQNCi1fVUlfUG9seWxpbmVfdHlwZSA9IE1laHJmYWNobGluaWUNCi1fVUlfRWxsaXBzZV90eXBlID0gRWxsaXBzZQ0KLV9VSV9BY3Rpdml0eV90eXBlID0gQWt0aXZpdFx1MDBlNHQNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IFByb2pla3RzdHJ1a3R1cmVsZW1lbnQNCi1fVUlfQnJlYWtkb3duRWxlbWVudF90eXBlID0gU3RydWt0dXJlbGVtZW50DQotX1VJX01pbGVzdG9uZV90eXBlID0gTWVpbGVuc3RlaW4NCi1fVUlfSXRlcmF0aW9uX3R5cGUgPSBJdGVyYXRpb24NCi1fVUlfUGhhc2VfdHlwZSA9IFBoYXNlDQotX1VJX1RlYW1Qcm9maWxlX3R5cGUgPSBUZWFtcHJvZmlsDQotX1VJX1JvbGVEZXNjcmlwdG9yX3R5cGUgPSBSb2xsZW5kZXNrcmlwdG9yDQotX1VJX1dvcmtPcmRlcl90eXBlID0gQXJiZWl0c2ZvbGdlDQotX1VJX1Byb2Nlc3NFbGVtZW50X3R5cGUgPSBQcm96ZXNzZWxlbWVudA0KLV9VSV9QbGFubmluZ0RhdGFfdHlwZSA9IFBsYW51bmdzZGF0ZW4NCi1fVUlfRGVzY3JpcHRvcl90eXBlID0gRGVza3JpcHRvcg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSA9IEFyYmVpdHNlcmdlYm5pc2Rlc2tyaXB0b3INCi1fVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSA9IEF1ZmdhYmVuZGVza3JpcHRvcg0KLV9VSV9Db21wb3NpdGVSb2xlX3R5cGUgPSBLb21iaW5pZXJ0ZSBSb2xsZQ0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdHlwZSA9IEJlc2NocmVpYnVuZyBkZXMgU3RydWt0dXJlbGVtZW50cw0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3R5cGUgPSBBa3Rpdml0XHUwMGU0dHNiZXNjaHJlaWJ1bmcNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSA9IEJlc2NocmVpYnVuZyBkZXMgQmVyZWl0c3RlbGx1bmdzcHJvemVzc2VzDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gUHJvemVzc2Jlc2NocmVpYnVuZw0KLV9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fdHlwZSA9IERlc2tyaXB0b3JiZXNjaHJlaWJ1bmcNCi1fVUlfQ29uY2VwdF90eXBlID0gS29uemVwdA0KLV9VSV9DaGVja2xpc3RfdHlwZSA9IFByXHUwMGZjZmxpc3RlDQotX1VJX0V4YW1wbGVfdHlwZSA9IEJlaXNwaWVsDQotX1VJX0d1aWRlbGluZV90eXBlID0gUmljaHRsaW5pZQ0KLV9VSV9SZXBvcnRfdHlwZSA9IEJlcmljaHQNCi1fVUlfVGVtcGxhdGVfdHlwZSA9IFZvcmxhZ2UNCi1fVUlfU3VwcG9ydGluZ01hdGVyaWFsX3R5cGUgPSBVbnRlcnN0XHUwMGZjdHplbmRlcyBNYXRlcmlhbA0KLV9VSV9Ub29sTWVudG9yX3R5cGUgPSBUb29sbWVudG9yDQotX1VJX1doaXRlcGFwZXJfdHlwZSA9IFdoaXRlIFBhcGVyDQotX1VJX1Rlcm1EZWZpbml0aW9uX3R5cGUgPSBCZWdyaWZmc2RlZmluaXRpb24NCi1fVUlfUHJhY3RpY2VfdHlwZSA9IFZlcmZhaHJlbg0KLV9VSV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdHlwZSA9IEhpbndlaXNlIHp1bSBTY2hcdTAwZTR0emVuDQotX1VJX1JldXNhYmxlQXNzZXRfdHlwZSA9IFdpZWRlcnZlcndlbmRiYXJlcyBBc3NldA0KLV9VSV9TdGF0ZV90eXBlID0gWnVzdGFuZA0KLV9VSV9WZXJ0ZXhfdHlwZSA9IFZlcnRleA0KLV9VSV9SZWdpb25fdHlwZSA9IFJlZ2lvbg0KLV9VSV9TdGF0ZU1hY2hpbmVfdHlwZSA9IFp1c3RhbmRzbWFzY2hpbmUNCi1fVUlfVHJhbnNpdGlvbl90eXBlID0gXHUwMGRjYmVyZ2FuZw0KLV9VSV9Qc2V1ZG9TdGF0ZV90eXBlID0gUHNldWRvenVzdGFuZA0KLV9VSV9EaXNjaXBsaW5lX3R5cGUgPSBEaXN6aXBsaW4NCi1fVUlfQ29udGVudENhdGVnb3J5X3R5cGUgPSBJbmhhbHRza2F0ZWdvcmllDQotX1VJX1JvbGVTZXRfdHlwZSA9IFJvbGxlbmdydXBwZQ0KLV9VSV9Eb21haW5fdHlwZSA9IERvbVx1MDBlNG5lDQotX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlID0gQXJ0IGRlcyBBcmJlaXRzZXJnZWJuaXNzZXMNCi1fVUlfRGlzY2lwbGluZUdyb3VwaW5nX3R5cGUgPSBadXNhbW1lbmZhc3N1bmcgdm9uIERpc3ppcGxpbmVuDQotX1VJX1Rvb2xfdHlwZSA9IFRvb2wNCi1fVUlfUm9sZVNldEdyb3VwaW5nX3R5cGUgPSBadXNhbW1lbmZhc3N1bmcgdm9uIFJvbGxlbmdydXBwZW4NCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfdHlwZSA9IEFuZ2VwYXNzdGUgS2F0ZWdvcmllDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc190eXBlID0gQmVyZWl0c3RlbGx1bmdzcHJvemVzcw0KLV9VSV9Qcm9jZXNzX3R5cGUgPSBQcm96ZXNzDQotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuX3R5cGUgPSBQcm96ZXNzbXVzdGVyDQotX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX3R5cGUgPSBWb3JsYWdlIGZcdTAwZmNyIFByb3plc3NwbGFudW5nDQotX1VJX1JvYWRtYXBfdHlwZSA9IFJvYWRtYXANCi1fVUlfUHJvY2Vzc0NvbXBvbmVudF90eXBlID0gUHJvemVzc2tvbXBvbmVudGUNCi1fVUlfUHJvY2Vzc1BhY2thZ2VfdHlwZSA9IFByb3plc3NwYWtldA0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX3R5cGUgPSBQcm96ZXNza29tcG9uZW50ZW5zY2huaXR0c3RlbGxlDQotX1VJX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX3R5cGUgPSBQcm96ZXNza29tcG9uZW50ZW5kZXNrcmlwdG9yDQotX1VJX01ldGhvZFBsdWdpbl90eXBlID0gTWV0aG9kZW4tUGx1Zy1pbg0KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSA9IFZhcmlhYmlsaXRcdTAwZTR0c2VsZW1lbnQNCi1fVUlfTWV0aG9kVW5pdF90eXBlID0gTWV0aG9kZW5laW5oZWl0DQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSA9IE1ldGhvZGVua29uZmlndXJhdGlvbg0KLV9VSV9Qcm9jZXNzRmFtaWx5X3R5cGUgPSBQcm96ZXNzZmFtaWxpZQ0KLV9VSV9NZXRob2RMaWJyYXJ5X3R5cGUgPSBNZXRob2RlbmJpYmxpb3RoZWsNCi1fVUlfVW5rbm93bl90eXBlID0gT2JqZWt0DQotDQotX1VJX1Vua25vd25fZGF0YXR5cGU9IFdlcnQNCi0NCi1fVUlfTmFtZWRFbGVtZW50X25hbWVfZmVhdHVyZSA9IE5hbWUNCi1fVUlfTWV0aG9kRWxlbWVudF9ndWlkX2ZlYXR1cmUgPSBBbmxlaXR1bmcNCi1fVUlfTWV0aG9kRWxlbWVudF9icmllZkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBLdXJ6YmVzY2hyZWlidW5nDQotX1VJX01ldGhvZEVsZW1lbnRfb3duZWRSdWxlc19mZWF0dXJlID0gRWlnZW5lIFJlZ2Vsbg0KLV9VSV9NZXRob2RFbGVtZW50X3N1cHByZXNzZWRfZmVhdHVyZSA9IFVudGVyZHJcdTAwZmNja3QNCi1fVUlfTWV0aG9kRWxlbWVudF9vcmRlcmluZ0d1aWRlX2ZlYXR1cmUgPSBBbmxlaXR1bmcgZlx1MDBmY3IgRmVzdGxlZ3VuZyBkZXIgUmVpaGVuZm9sZ2UNCi1fVUlfQ29uc3RyYWludF9ib2R5X2ZlYXR1cmUgPSBIYXVwdHRlaWwNCi1fVUlfQ29udGVudEVsZW1lbnRfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gVW50ZXJzdFx1MDBmY3R6ZW5kZXMgTWF0ZXJpYWwNCi1fVUlfQ29udGVudEVsZW1lbnRfY29uY2VwdHNBbmRQYXBlcnNfZmVhdHVyZSA9IEtvbnplcHRlIHVuZCBXaGl0ZSBQYXBlcg0KLV9VSV9Db250ZW50RWxlbWVudF9jaGVja2xpc3RzX2ZlYXR1cmUgPSBQclx1MDBmY2ZsaXN0ZW4NCi1fVUlfQ29udGVudEVsZW1lbnRfZ3VpZGVsaW5lc19mZWF0dXJlID0gUmljaHRsaW5pZW4NCi1fVUlfQ29udGVudEVsZW1lbnRfZXhhbXBsZXNfZmVhdHVyZSA9IEJlaXNwaWVsZQ0KLV9VSV9Db250ZW50RWxlbWVudF9hc3NldHNfZmVhdHVyZSA9IEFzc2V0cw0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uTmFtZV9mZWF0dXJlID0gUHJcdTAwZTRzZW50YXRpb25zbmFtZQ0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBQclx1MDBlNHNlbnRhdGlvbg0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfc2hhcGVpY29uX2ZlYXR1cmUgPSBTaGFwZWljb24NCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X25vZGVpY29uX2ZlYXR1cmUgPSBOb2RlaWNvbg0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fbWFpbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBIYXVwdGJlc2NocmVpYnVuZw0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fc2VjdGlvbnNfZmVhdHVyZSA9IEFic2Nobml0dGUNCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX2tleUNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBXaWNodGlnZSBIaW53ZWlzZQ0KLV9VSV9TZWN0aW9uX3NlY3Rpb25OYW1lX2ZlYXR1cmUgPSBBYnNjaG5pdHRuYW1lDQotX1VJX1NlY3Rpb25fc2VjdGlvbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBBYnNjaG5pdHRiZXNjaHJlaWJ1bmcNCi1fVUlfU2VjdGlvbl9zdWJTZWN0aW9uc19mZWF0dXJlID0gVW50ZXJhYnNjaG5pdHRlDQotX1VJX1NlY3Rpb25fcHJlZGVjZXNzb3JfZmVhdHVyZSA9IFZvcmdcdTAwZTRuZ2VyDQotX1VJX1JvbGVfbW9kaWZpZXNfZmVhdHVyZSA9IFx1MDBjNG5kZXJ1bmcNCi1fVUlfUm9sZV9yZXNwb25zaWJsZUZvcl9mZWF0dXJlID0gVmVyYW50d29ydGxpY2ggZlx1MDBmY3INCi1fVUlfV29ya1Byb2R1Y3RfcmVwb3J0c19mZWF0dXJlID0gQmVyaWNodGUNCi1fVUlfV29ya1Byb2R1Y3RfdGVtcGxhdGVzX2ZlYXR1cmUgPSBWb3JsYWdlbg0KLV9VSV9Xb3JrUHJvZHVjdF90b29sTWVudG9yc19mZWF0dXJlID0gVG9vbG1lbnRvcmVuDQotX1VJX1dvcmtQcm9kdWN0X2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gSGlud2Vpc2UgenVtIFNjaFx1MDBlNHR6ZW4NCi1fVUlfVGFza19wZXJmb3JtZWRCeV9mZWF0dXJlID0gQXVzZ2VmXHUwMGZjaHJ0IHZvbg0KLV9VSV9UYXNrX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUgPSBWZXJiaW5kbGljaGUgRWluZ2FiZQ0KLV9VSV9UYXNrX291dHB1dF9mZWF0dXJlID0gQXVzZ2FiZQ0KLV9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBadXNcdTAwZTR0emxpY2ggYXVzZ2VmXHUwMGZjaHJ0IHZvbg0KLV9VSV9UYXNrX29wdGlvbmFsSW5wdXRfZmVhdHVyZSA9IE9wdGlvbmFsZSBFaW5nYWJlDQotX1VJX1Rhc2tfc3RlcHNfZmVhdHVyZSA9IFNjaHJpdHRlDQotX1VJX1Rhc2tfdG9vbE1lbnRvcnNfZmVhdHVyZSA9IFRvb2xtZW50b3Jlbg0KLV9VSV9UYXNrX2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gSGlud2Vpc2UgenVtIFNjaFx1MDBlNHR6ZW4NCi1fVUlfV29ya0RlZmluaXRpb25fcHJlY29uZGl0aW9uX2ZlYXR1cmUgPSBWb3JiZWRpbmd1bmcNCi1fVUlfV29ya0RlZmluaXRpb25fcG9zdGNvbmRpdGlvbl9mZWF0dXJlID0gTmFjaGJlZGluZ3VuZw0KLV9VSV9BcnRpZmFjdF9jb250YWluZXJBcnRpZmFjdF9mZWF0dXJlID0gQ29udGFpbmVyYXJ0ZWZha3QNCi1fVUlfQXJ0aWZhY3RfY29udGFpbmVkQXJ0aWZhY3RzX2ZlYXR1cmUgPSBFbnRoYWx0ZW5lIEFydGVmYWt0ZQ0KLV9VSV9EZWxpdmVyYWJsZV9kZWxpdmVyZWRXb3JrUHJvZHVjdHNfZmVhdHVyZSA9IEdlbGllZmVydGUgQXJiZWl0c2VyZ2Vibmlzc2UNCi1fVUlfTWV0aG9kUGFja2FnZV9nbG9iYWxfZmVhdHVyZSA9IEdsb2JhbA0KLV9VSV9NZXRob2RQYWNrYWdlX3JldXNlZFBhY2thZ2VzX2ZlYXR1cmUgPSBXaWVkZXJ2ZXJ3ZW5kZXRlIFBha2V0ZQ0KLV9VSV9NZXRob2RQYWNrYWdlX3BhcmVudFBhY2thZ2VfZmVhdHVyZSA9IFx1MDBkY2Jlcmdlb3JkbmV0ZSBQYWtldGUNCi1fVUlfTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX2ZlYXR1cmUgPSBVbnRlcmdlb3JkbmV0ZSBQYWtldGUNCi1fVUlfQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX2ZlYXR1cmUgPSBJbmhhbHRzZWxlbWVudGUNCi1fVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9icmllZk91dGxpbmVfZmVhdHVyZSA9IEt1cnplIEdsaWVkZXJ1bmcNCi1fVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9yZXByZXNlbnRhdGlvbk9wdGlvbnNfZmVhdHVyZSA9IERhcnN0ZWxsdW5nc29wdGlvbmVuDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlID0gRXh0ZXJuZSBJRA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IFp3ZWNrDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25faW1wYWN0T2ZOb3RIYXZpbmdfZmVhdHVyZSA9IEF1c3dpcmt1bmdlbiBiZWkgTmljaHR2ZXJ3ZW5kdW5nDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcmVhc29uc0Zvck5vdE5lZWRpbmdfZmVhdHVyZSA9IEdyXHUwMGZjbmRlIGZcdTAwZmNyIE5pY2h0dmVyd2VuZHVuZw0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX2V4dGVybmFsRGVzY3JpcHRpb25fZmVhdHVyZSA9IEV4dGVybmUgQmVzY2hyZWlidW5nDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fcGFja2FnaW5nR3VpZGFuY2VfZmVhdHVyZSA9IEFubGVpdHVuZyB6dW0gUGFja2VuDQotX1VJX1JvbGVEZXNjcmlwdGlvbl9za2lsbHNfZmVhdHVyZSA9IEtub3ctaG93DQotX1VJX1JvbGVEZXNjcmlwdGlvbl9hc3NpZ25tZW50QXBwcm9hY2hlc19mZWF0dXJlID0gWnVvcmRudW5nc3N0cmF0ZWdpZW4NCi1fVUlfUm9sZURlc2NyaXB0aW9uX3N5bm9ueW1zX2ZlYXR1cmUgPSBTeW5vbnltZQ0KLV9VSV9UYXNrRGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gWndlY2sNCi1fVUlfVGFza0Rlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlID0gQWx0ZXJuYXRpdmVuDQotX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fYXR0YWNobWVudHNfZmVhdHVyZSA9IEFubGFnZW4NCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hZGRpdGlvbmFsSW5mb19mZWF0dXJlID0gWnVzXHUwMGU0dHpsaWNoZSBJbmZvcm1hdGlvbmVuDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fcHJvYmxlbV9mZWF0dXJlID0gUHJvYmxlbQ0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2JhY2tncm91bmRfZmVhdHVyZSA9IEhpbnRlcmdydW5kDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fZ29hbHNfZmVhdHVyZSA9IFppZWxlDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYXBwbGljYXRpb25fZmVhdHVyZSA9IEFud2VuZHVuZw0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2xldmVsc09mQWRvcHRpb25fZmVhdHVyZSA9IEVpbmZcdTAwZmNocnVuZ3NzdHVmZW4NCi1fVUlfUG9pbnRfeF9mZWF0dXJlID0gWA0KLV9VSV9Qb2ludF95X2ZlYXR1cmUgPSBZDQotX1VJX0dyYXBoRWxlbWVudF9wb3NpdGlvbl9mZWF0dXJlID0gUG9zaXRpb24NCi1fVUlfR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9mZWF0dXJlID0gRW50aGFsdGVuDQotX1VJX0dyYXBoRWxlbWVudF9saW5rX2ZlYXR1cmUgPSBMaW5rDQotX1VJX0dyYXBoRWxlbWVudF9hbmNob3JhZ2VfZmVhdHVyZSA9IFZlcmFua2VydW5nDQotX1VJX0dyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX2ZlYXR1cmUgPSBTZW1hbnRpa21vZGVsbA0KLV9VSV9EaWFncmFtRWxlbWVudF9pc1Zpc2libGVfZmVhdHVyZSA9IFNpY2h0YmFyDQotX1VJX0RpYWdyYW1FbGVtZW50X2NvbnRhaW5lcl9mZWF0dXJlID0gQ29udGFpbmVyDQotX1VJX0RpYWdyYW1FbGVtZW50X3JlZmVyZW5jZV9mZWF0dXJlID0gUmVmZXJlbnoNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcHJvcGVydHlfZmVhdHVyZSA9IEVpZ2Vuc2NoYWZ0DQotX1VJX0RpYWdyYW1MaW5rX3pvb21fZmVhdHVyZSA9IFpvb20NCi1fVUlfRGlhZ3JhbUxpbmtfdmlld3BvcnRfZmVhdHVyZSA9IERhcnN0ZWxsdW5nc2ZlbGQNCi1fVUlfRGlhZ3JhbUxpbmtfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBHcmFwaGVsZW1lbnQNCi1fVUlfRGlhZ3JhbUxpbmtfZGlhZ3JhbV9mZWF0dXJlID0gRGlhZ3JhbW0NCi1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBHcmFwaGVsZW1lbnQNCi1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFZGdlX2ZlYXR1cmUgPSBHcmFwaGthbnRlDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBQclx1MDBlNHNlbnRhdGlvbg0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gR3JhcGhlbGVtZW50DQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZGlhZ3JhbV9mZWF0dXJlID0gRGlhZ3JhbW0NCi1fVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUgPSBCcmVpdGUNCi1fVUlfRGltZW5zaW9uX2hlaWdodF9mZWF0dXJlID0gSFx1MDBmNmhlDQotX1VJX1JlZmVyZW5jZV9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbl9mZWF0dXJlID0gRWluemVsZGFyc3RlbGx1bmcNCi1fVUlfUmVmZXJlbmNlX3JlZmVyZW5jZWRfZmVhdHVyZSA9IFJlZmVyZW56aWVydA0KLV9VSV9Qcm9wZXJ0eV9rZXlfZmVhdHVyZSA9IFNjaGxcdTAwZmNzc2VsDQotX1VJX1Byb3BlcnR5X3ZhbHVlX2ZlYXR1cmUgPSBXZXJ0DQotX1VJX0dyYXBoRWRnZV9hbmNob3JfZmVhdHVyZSA9IEFua2VyDQotX1VJX0dyYXBoRWRnZV93YXlwb2ludHNfZmVhdHVyZSA9IFdlZ3B1bmt0ZQ0KLV9VSV9EaWFncmFtX3pvb21fZmVhdHVyZSA9IFpvb20NCi1fVUlfRGlhZ3JhbV92aWV3cG9pbnRfZmVhdHVyZSA9IFN0YW5kcHVua3QNCi1fVUlfRGlhZ3JhbV9kaWFncmFtTGlua19mZWF0dXJlID0gRGlhZ3JhbW12ZXJrblx1MDBmY3BmdW5nDQotX1VJX0RpYWdyYW1fbmFtZXNwYWNlX2ZlYXR1cmUgPSBOYW1lc3BhY2UNCi1fVUlfR3JhcGhOb2RlX3NpemVfZmVhdHVyZSA9IEdyXHUwMGY2XHUwMGRmZQ0KLV9VSV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF90eXBlSW5mb19mZWF0dXJlID0gVHlwaW5mb3JtYXRpb24NCi1fVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUgPSBFbGVtZW50DQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IEVsZW1lbnQNCi1fVUlfVGV4dEVsZW1lbnRfdGV4dF9mZWF0dXJlID0gVGV4dA0KLV9VSV9JbWFnZV91cmlfZmVhdHVyZSA9IFVSSQ0KLV9VSV9JbWFnZV9taW1lVHlwZV9mZWF0dXJlID0gTUlNRS1UeXANCi1fVUlfUG9seWxpbmVfY2xvc2VkX2ZlYXR1cmUgPSBHZXNjaGxvc3Nlbg0KLV9VSV9Qb2x5bGluZV93YXlwb2ludHNfZmVhdHVyZSA9IFdlZ3B1bmt0ZQ0KLV9VSV9FbGxpcHNlX3JhZGl1c1hfZmVhdHVyZSA9IFJhZGl1cyBYDQotX1VJX0VsbGlwc2VfcmFkaXVzWV9mZWF0dXJlID0gUmFkaXVzIFkNCi1fVUlfRWxsaXBzZV9yb3RhdGlvbl9mZWF0dXJlID0gRHJlaHVuZw0KLV9VSV9FbGxpcHNlX3N0YXJ0QW5nbGVfZmVhdHVyZSA9IEFuZmFuZ3N3aW5rZWwNCi1fVUlfRWxsaXBzZV9lbmRBbmdsZV9mZWF0dXJlID0gRW5kd2lua2VsDQotX1VJX0VsbGlwc2VfY2VudGVyX2ZlYXR1cmUgPSBNaXR0ZWxwdW5rdA0KLV9VSV9BY3Rpdml0eV9icmVha2Rvd25FbGVtZW50c19mZWF0dXJlID0gU3RydWt0dXJlbGVtZW50ZQ0KLV9VSV9BY3Rpdml0eV9yb2FkbWFwc19mZWF0dXJlID0gUm9hZG1hcHMNCi1fVUlfQWN0aXZpdHlfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gVW50ZXJzdFx1MDBmY3R6ZW5kZXMgTWF0ZXJpYWwNCi1fVUlfQWN0aXZpdHlfY2hlY2tsaXN0c19mZWF0dXJlID0gUHJcdTAwZmNmbGlzdGVuDQotX1VJX0FjdGl2aXR5X2NvbmNlcHRzX2ZlYXR1cmUgPSBLb256ZXB0ZQ0KLV9VSV9BY3Rpdml0eV9leGFtcGxlc19mZWF0dXJlID0gQmVpc3BpZWxlDQotX1VJX0FjdGl2aXR5X2d1aWRlbGluZXNfZmVhdHVyZSA9IFJpY2h0bGluaWVuDQotX1VJX0FjdGl2aXR5X3JldXNhYmxlQXNzZXRzX2ZlYXR1cmUgPSBXaWVkZXJ2ZXJ3ZW5kYmFyZSBBc3NldHMNCi1fVUlfQWN0aXZpdHlfaXNFbmFjdGFibGVfZmVhdHVyZSA9IElzdCB1bXNldHpiYXINCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNSZXBlYXRhYmxlX2ZlYXR1cmUgPSBXaWVkZXJob2x0IGFud2VuZGJhcg0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc09uZ29pbmdfZmVhdHVyZSA9IEZvcnRsYXVmZW5kDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzRXZlbnREcml2ZW5fZmVhdHVyZSA9IEVyZWlnbmlzZ2VzdGV1ZXJ0DQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2xpbmtUb1ByZWRlY2Vzc29yX2ZlYXR1cmUgPSBMaW5rIHp1bSBWb3JnXHUwMGU0bmdlcg0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZWZpeF9mZWF0dXJlID0gUHJcdTAwZTRmaXgNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9pc1BsYW5uZWRfZmVhdHVyZSA9IEdlcGxhbnQNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9oYXNNdWx0aXBsZU9jY3VycmVuY2VzX2ZlYXR1cmUgPSBNZWhyZXJlIFZvcmtvbW1lbg0KLV9VSV9CcmVha2Rvd25FbGVtZW50X2lzT3B0aW9uYWxfZmVhdHVyZSA9IE9wdGlvbmFsDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQWZ0ZXJfZmVhdHVyZSA9IERhcmdlc3RlbGx0IG5hY2gNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRCZWZvcmVfZmVhdHVyZSA9IERhcmdlc3RlbGx0IHZvcg0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3BsYW5uaW5nRGF0YV9mZWF0dXJlID0gUGxhbnVuZ3NkYXRlbg0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3N1cGVyQWN0aXZpdGllc19mZWF0dXJlID0gXHUwMGRjYmVyZ2VvcmRuZXRlIEFrdGl2aXRcdTAwZTR0ZW4NCi1fVUlfVGVhbVByb2ZpbGVfdGVhbVJvbGVzX2ZlYXR1cmUgPSBUZWFtcm9sbGVuDQotX1VJX1RlYW1Qcm9maWxlX3N1cGVyVGVhbV9mZWF0dXJlID0gU3VwZXJ0ZWFtDQotX1VJX1RlYW1Qcm9maWxlX3N1YlRlYW1fZmVhdHVyZSA9IFVuZ2VvcmRuZXRlcyBUZWFtDQotX1VJX1JvbGVEZXNjcmlwdG9yX1JvbGVfZmVhdHVyZSA9IFJvbGxlDQotX1VJX1JvbGVEZXNjcmlwdG9yX21vZGlmaWVzX2ZlYXR1cmUgPSBcdTAwYzRuZGVydW5nDQotX1VJX1JvbGVEZXNjcmlwdG9yX3Jlc3BvbnNpYmxlRm9yX2ZlYXR1cmUgPSBWZXJhbnR3b3J0bGljaCBmXHUwMGZjcg0KLV9VSV9Xb3JrT3JkZXJfbGlua1R5cGVfZmVhdHVyZSA9IExpbmstVHlwDQotX1VJX1dvcmtPcmRlcl9wcmVkX2ZlYXR1cmUgPSBWb3JnXHUwMGU0bmdlcg0KLV9VSV9QbGFubmluZ0RhdGFfc3RhcnREYXRlX2ZlYXR1cmUgPSBTdGFydGRhdHVtDQotX1VJX1BsYW5uaW5nRGF0YV9maW5pc2hEYXRlX2ZlYXR1cmUgPSBFbmRkYXR1bQ0KLV9VSV9QbGFubmluZ0RhdGFfcmFua19mZWF0dXJlID0gRWluc3R1ZnVuZw0KLV9VSV9EZXNjcmlwdG9yX2lzU3luY2hyb25pemVkV2l0aFNvdXJjZV9mZWF0dXJlID0gU3luY2hyb25pc2llcnQgbWl0IFF1ZWxsZQ0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFbnRyeVN0YXRlX2ZlYXR1cmUgPSBBbmZhbmdzenVzdGFuZCBkZXIgQWt0aXZpdFx1MDBlNHQNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RXhpdFN0YXRlX2ZlYXR1cmUgPSBFbmR6dXN0YW5kIGRlciBBa3Rpdml0XHUwMGU0dA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3RfZmVhdHVyZSA9IEFyYmVpdHNlcmdlYm5pcw0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0ZWRCeV9mZWF0dXJlID0gQmVlaW5mbHVzc3Qgdm9uDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RzX2ZlYXR1cmUgPSBBdXN3aXJrdW5nZW4NCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2RlbGl2ZXJhYmxlUGFydHNfZmVhdHVyZSA9IFRlaWxlIGRlcyBMaWVmZXJnZWdlbnN0YW5kcw0KLV9VSV9UYXNrRGVzY3JpcHRvcl9UYXNrX2ZlYXR1cmUgPSBBdWZnYWJlDQotX1VJX1Rhc2tEZXNjcmlwdG9yX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBTZWt1bmRcdTAwZTRyZXIgQXVzZlx1MDBmY2hyZW5kZXINCi1fVUlfVGFza0Rlc2NyaXB0b3JfYXNzaXN0ZWRCeV9mZWF0dXJlID0gVW50ZXJzdFx1MDBmY3R6dCB2b24NCi1fVUlfVGFza0Rlc2NyaXB0b3JfZXh0ZXJuYWxJbnB1dF9mZWF0dXJlID0gRXh0ZXJuZSBFaW5nYWJlDQotX1VJX1Rhc2tEZXNjcmlwdG9yX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUgPSBWZXJiaW5kbGljaGUgRWluZ2FiZQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBPcHRpb25hbGUgRWluZ2FiZQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9vdXRwdXRfZmVhdHVyZSA9IEF1c2dhYmUNCi1fVUlfVGFza0Rlc2NyaXB0b3JfcGVyZm9ybWVkUHJpbWFyaWx5QnlfZmVhdHVyZSA9IFByaW1cdTAwZTRyZXIgQXVzZlx1MDBmY2hyZW5kZXINCi1fVUlfVGFza0Rlc2NyaXB0b3Jfc2VsZWN0ZWRTdGVwc19mZWF0dXJlID0gQXVzZ2V3XHUwMGU0aGx0ZSBTY2hyaXR0ZQ0KLV9VSV9Db21wb3NpdGVSb2xlX2FnZ3JlZ2F0ZWRSb2xlc19mZWF0dXJlID0gRWluemVscm9sbGVuDQotX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl91c2FnZUd1aWRhbmNlX2ZlYXR1cmUgPSBBbmxlaXR1bmcgenVyIFZlcndlbmR1bmcNCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBad2Vjaw0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlID0gQWx0ZXJuYXRpdmVuDQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25faG93dG9TdGFmZl9mZWF0dXJlID0gTWl0YXJiZWl0ZXIgZlx1MDBmY3IgVm9yZ2VoZW5zd2Vpc2UNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fc2NhbGVfZmVhdHVyZSA9IFNrYWxpZXJ1bmcNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdENoYXJhY3RlcmlzdGljc19mZWF0dXJlID0gUHJvamVrdG1lcmttYWxlDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Jpc2tMZXZlbF9mZWF0dXJlID0gUmlzaWtvc3R1ZmUNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fZXN0aW1hdGluZ1RlY2huaXF1ZV9mZWF0dXJlID0gU2NoXHUwMGU0dHp2ZXJmYWhyZW4NCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdE1lbWJlckV4cGVydGlzZV9mZWF0dXJlID0gS25vdy1ob3cgZGVyIFByb2pla3RtaXRhcmJlaXRlcg0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlT2ZDb250cmFjdF9mZWF0dXJlID0gVHlwIGRlcyBWZXJ0cmFncw0KLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlID0gRXh0ZXJuZSBJRA0KLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fc2NvcGVfZmVhdHVyZSA9IFNjb3BlDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl91c2FnZU5vdGVzX2ZlYXR1cmUgPSBWZXJ3ZW5kdW5nc2hpbndlaXNlDQotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl9yZWZpbmVkRGVzY3JpcHRpb25fZmVhdHVyZSA9IFx1MDBkY2JlcmFyYmVpdGV0ZSBCZXNjaHJlaWJ1bmcNCi1fVUlfUHJhY3RpY2Vfc3ViUHJhY3RpY2VzX2ZlYXR1cmUgPSBUZWlsdmVyZmFocmVuDQotX1VJX1ByYWN0aWNlX2NvbnRlbnRSZWZlcmVuY2VzX2ZlYXR1cmUgPSBJbmhhbHRzcmVmZXJlbnplbg0KLV9VSV9QcmFjdGljZV9hY3Rpdml0eVJlZmVyZW5jZXNfZmVhdHVyZSA9IEFrdGl2aXRcdTAwZTR0c3JlZmVyZW56ZW4NCi1fVUlfU3RhdGVfV29ya1Byb2R1Y3RfZmVhdHVyZSA9IEFyYmVpdHNlcmdlYm5pcw0KLV9VSV9TdGF0ZV9SZWdpb25fZmVhdHVyZSA9IFJlZ2lvbg0KLV9VSV9TdGF0ZV9zdWJtYWNoaW5lX2ZlYXR1cmUgPSBVbnRlcm1hc2NoaW5lDQotX1VJX1ZlcnRleF9jb250YWluZXJfZmVhdHVyZSA9IENvbnRhaW5lcg0KLV9VSV9WZXJ0ZXhfb3V0Z29pbmdfZmVhdHVyZSA9IEFiZ2VoZW5kDQotX1VJX1ZlcnRleF9pbmNvbWluZ19mZWF0dXJlID0gRWluZ2VoZW5kDQotX1VJX1JlZ2lvbl9WZXJ0ZXhfZmVhdHVyZSA9IFZlcnRleA0KLV9VSV9SZWdpb25fVHJhbnNpdGlvbl9mZWF0dXJlID0gXHUwMGRjYmVyZ2FuZw0KLV9VSV9SZWdpb25fU3RhdGVfZmVhdHVyZSA9IFp1c3RhbmQNCi1fVUlfUmVnaW9uX1N0YXRlTWFjaGluZV9mZWF0dXJlID0gWnVzdGFuZHNtYXNjaGluZQ0KLV9VSV9TdGF0ZU1hY2hpbmVfUmVnaW9uX2ZlYXR1cmUgPSBSZWdpb24NCi1fVUlfVHJhbnNpdGlvbl9Xb3JrRGVmaW5pdGlvbl9mZWF0dXJlID0gQXJiZWl0c2RlZmluaXRpb24NCi1fVUlfVHJhbnNpdGlvbl9jb250YWluZXJfZmVhdHVyZSA9IENvbnRhaW5lcg0KLV9VSV9UcmFuc2l0aW9uX3NvdXJjZV9mZWF0dXJlID0gUXVlbGxlDQotX1VJX1RyYW5zaXRpb25fdGFyZ2V0X2ZlYXR1cmUgPSBaaWVsDQotX1VJX0Rpc2NpcGxpbmVfdGFza3NfZmVhdHVyZSA9IEF1ZmdhYmVuDQotX1VJX0Rpc2NpcGxpbmVfc3ViZGlzY2lwbGluZV9mZWF0dXJlID0gVW50ZXJkaXN6aXBsaW4NCi1fVUlfRGlzY2lwbGluZV9yZWZlcmVuY2VXb3JrZmxvd3NfZmVhdHVyZSA9IFJlZmVyZW56d29ya2Zsb3dzDQotX1VJX1JvbGVTZXRfcm9sZXNfZmVhdHVyZSA9IFJvbGxlbg0KLV9VSV9Eb21haW5fd29ya1Byb2R1Y3RzX2ZlYXR1cmUgPSBBcmJlaXRzZXJnZWJuaXNzZQ0KLV9VSV9Eb21haW5fc3ViZG9tYWluc19mZWF0dXJlID0gVW50ZXJkb21cdTAwZTRuZW4NCi1fVUlfV29ya1Byb2R1Y3RUeXBlX3dvcmtQcm9kdWN0c19mZWF0dXJlID0gQXJiZWl0c2VyZ2Vibmlzc2UNCi1fVUlfRGlzY2lwbGluZUdyb3VwaW5nX2Rpc2NpcGxpbmVzX2ZlYXR1cmUgPSBEaXN6aXBsaW5lbg0KLV9VSV9Ub29sX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBUb29sbWVudG9yZW4NCi1fVUlfUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX2ZlYXR1cmUgPSBSb2xsZW5ncnVwcGVuDQotX1VJX0N1c3RvbUNhdGVnb3J5X2NhdGVnb3JpemVkRWxlbWVudHNfZmVhdHVyZSA9IEthdGVnb3Jpc2llcnRlIEVsZW1lbnRlDQotX1VJX0N1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfZmVhdHVyZSA9IFVudGVya2F0ZWdvcmllbg0KLV9VSV9EZWxpdmVyeVByb2Nlc3NfZWR1Y2F0aW9uTWF0ZXJpYWxzX2ZlYXR1cmUgPSBMZXJubWF0ZXJpYWwNCi1fVUlfRGVsaXZlcnlQcm9jZXNzX2NvbW11bmljYXRpb25zTWF0ZXJpYWxzX2ZlYXR1cmUgPSBLb21tdW5pa2F0aW9uc21hdGVyaWFsDQotX1VJX1Byb2Nlc3NfaW5jbHVkZXNQYXR0ZXJuc19mZWF0dXJlID0gRW50aFx1MDBlNGx0IE11c3Rlcg0KLV9VSV9Qcm9jZXNzX2RlZmF1bHRDb250ZXh0X2ZlYXR1cmUgPSBTdGFuZGFyZGtvbnRleHQNCi1fVUlfUHJvY2Vzc192YWxpZENvbnRleHRfZmVhdHVyZSA9IEdcdTAwZmNsdGlnZXIgS29udGV4dA0KLV9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9iYXNlZE9uUHJvY2Vzc2VzX2ZlYXR1cmUgPSBBdWYgQmFzaXMgdm9uIFByb3plc3Nlbg0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50X2ludGVyZmFjZXNfZmVhdHVyZSA9IFNjaG5pdHRzdGVsbGVuDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19mZWF0dXJlID0gUHJvemVzcw0KLV9VSV9Qcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfZmVhdHVyZSA9IFByb3plc3NlbGVtZW50ZQ0KLV9VSV9Qcm9jZXNzUGFja2FnZV9kaWFncmFtc19mZWF0dXJlID0gRGlhZ3JhbW1lDQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnNfZmVhdHVyZSA9IFNjaG5pdHRzdGVsbGVuc3BlemlmaWthdGlvbmVuDQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlSU9fZmVhdHVyZSA9IFNjaG5pdHRzdGVsbGVuLUUvQQ0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9Qcm9jZXNzQ29tcG9uZW50X2ZlYXR1cmUgPSBQcm96ZXNza29tcG9uZW50ZQ0KLV9VSV9NZXRob2RQbHVnaW5fdXNlckNoYW5nZWFibGVfZmVhdHVyZSA9IFZvbSBCZW51dHplciBcdTAwZTRuZGVyYmFyDQotX1VJX01ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19mZWF0dXJlID0gTWV0aG9kZW5wYWtldGUNCi1fVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUgPSBCYXNpcw0KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUgPSBWYXJpYWJpbGl0XHUwMGU0dHN0eXANCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRfZmVhdHVyZSA9IFZhcmlhYmlsaXRcdTAwZTR0IGF1ZiBFbGVtZW50YmFzaXMNCi1fVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUgPSBBdXRvcmVuDQotX1VJX01ldGhvZFVuaXRfY2hhbmdlRGF0ZV9mZWF0dXJlID0gXHUwMGM0bmRlcnVuZ3NkYXR1bQ0KLV9VSV9NZXRob2RVbml0X2NoYW5nZURlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdTAwYzRuZGVydW5nc2Jlc2NocmVpYnVuZw0KLV9VSV9NZXRob2RVbml0X3ZlcnNpb25fZmVhdHVyZSA9IFZlcnNpb24NCi1fVUlfTWV0aG9kVW5pdF9jb3B5cmlnaHRTdGF0ZW1lbnRfZmVhdHVyZSA9IENvcHlyaWdodHZlcm1lcmsNCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQbHVnaW5TZWxlY3Rpb25fZmVhdHVyZSA9IEF1c3dhaGwgZGVzIE1ldGhvZGVuLVBsdWctaW4NCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQYWNrYWdlU2VsZWN0aW9uX2ZlYXR1cmUgPSBBdXN3YWhsIGRlciBNZXRob2RlbnBha2V0ZQ0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3Byb2Nlc3NWaWV3c19mZWF0dXJlID0gUHJvemVzc3NpY2h0ZW4NCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9kZWZhdWx0Vmlld19mZWF0dXJlID0gU3RhbmRhcmRzaWNodA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2Jhc2VDb25maWd1cmF0aW9uc19mZWF0dXJlID0gQmFzaXNrb25maWd1cmF0aW9uZW4NCi1fVUlfUHJvY2Vzc0ZhbWlseV9kZWxpdmVyeVByb2Nlc3Nlc19mZWF0dXJlID0gQmVyZWl0c3RlbGx1bmdzcHJvemVzc2UNCi1fVUlfTWV0aG9kTGlicmFyeV9tZXRob2RQbHVnaW5zX2ZlYXR1cmUgPSBNZXRob2Rlbi1QbHVnLWlucw0KLV9VSV9NZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19mZWF0dXJlID0gVm9yZGVmaW5pZXJ0ZSBLb25maWd1cmF0aW9uZW4NCi1fVUlfVW5rbm93bl9mZWF0dXJlID0gTmljaHQgYW5nZWdlYmVuDQotDQotX1VJX1dvcmtPcmRlclR5cGVfZmluaXNoVG9TdGFydF9saXRlcmFsID0gZmluaXNoVG9TdGFydA0KLV9VSV9Xb3JrT3JkZXJUeXBlX2ZpbmlzaFRvRmluaXNoX2xpdGVyYWwgPSBmaW5pc2hUb0ZpbmlzaA0KLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9TdGFydF9saXRlcmFsID0gc3RhcnRUb1N0YXJ0DQotX1VJX1dvcmtPcmRlclR5cGVfc3RhcnRUb0ZpbmlzaF9saXRlcmFsID0gc3RhcnRUb0ZpbmlzaA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfaW5pdGlhbF9saXRlcmFsID0gSW5pdGlhbA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfam9pbl9saXRlcmFsID0gVmVya25cdTAwZmNwZnVuZw0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZm9ya19saXRlcmFsID0gVmVyendlaWd1bmcNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2p1bmN0aW9uX2xpdGVyYWwgPSBadXNhbW1lbmZcdTAwZmNocnVuZw0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfY2hvaWNlX2xpdGVyYWwgPSBBdXN3YWhsDQotX1VJX1BzZXVkb1N0YXRlS2luZF9lbnRyeVBvaW50X2xpdGVyYWwgPSBFaW5zdGllZ3NwdW5rdA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZXhpdFBvaW50X2xpdGVyYWwgPSBBdXNzdGllZ3NwdW5rdA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfdGVybWluYXRlX2xpdGVyYWwgPSBCZWVuZGVuDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9uYV9saXRlcmFsID0gTi9BDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9jb250cmlidXRlc19saXRlcmFsID0gQmVpdHJhZw0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfZXh0ZW5kc19saXRlcmFsID0gRXJ3ZWl0ZXJ1bmcNCi1fVUlfVmFyaWFiaWxpdHlUeXBlX3JlcGxhY2VzX2xpdGVyYWwgPSBFcnNldHp1bmcNCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsQ29udHJpYnV0aW9uX2xpdGVyYWwgPSBMb2thbGVyIEJlaXRyYWcNCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsUmVwbGFjZW1lbnRfbGl0ZXJhbCA9IExva2FsZSBFcnNldHp1bmcNCi1fVUlfQXJ0aWZhY3REZXNjcmlwdG9yX3R5cGUgPSBBcnRlZmFrdGRlc2tyaXB0b3INCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdG9yX3R5cGUgPSBMaWVmZXJnZWdlbnN0YW5kc2Rlc2tyaXB0b3INCi1fVUlfT3V0Y29tZURlc2NyaXB0b3JfdHlwZSA9IFJlc3VsdGF0ZGVza3JpcHRvcg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5fZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5fZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGNmOWVmNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1wbHVnaW5OYW1lID0gU29wb3J0ZSBkZSBlZGljaVx1MDBmM24gZGUgVU1BIGRlIEVNRg0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQotX1VJX0NyZWF0ZUNoaWxkX3RleHQgPSB7MH0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDIgPSB7MX0gezB9DQotX1VJX0NyZWF0ZUNoaWxkX3RleHQzID0gezF9DQotX1VJX0NyZWF0ZUNoaWxkX3Rvb2x0aXAgPSBDcmVhciB7MH0gbnVldm8gZW4gbGEgY2FyYWN0ZXJcdTAwZWRzdGljYSB7MX0NCi1fVUlfQ3JlYXRlQ2hpbGRfZGVzY3JpcHRpb24gPSBDcmVhciB1biBoaWpvIG51ZXZvIGRlIHRpcG8gezB9IHBhcmEgbGEgY2FyYWN0ZXJcdTAwZWRzdGljYSB7MX0gZGVsIHsyfSBzZWxlY2Npb25hZG8uDQotX1VJX0NyZWF0ZVNpYmxpbmdfZGVzY3JpcHRpb24gPSBDcmVhciB1biBpZ3VhbCBudWV2byBkZSB0aXBvIHswfSBwYXJhIGVsIHsyfSBzZWxlY2Npb25hZG8sIGVuIGxhIGNhcmFjdGVyXHUwMGVkc3RpY2EgezF9IGRlbCBwYWRyZS4NCi0NCi1fVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uID0gRWwgezB9IGRlbCB7MX0NCi0NCi1fVUlfQ2xhc3NpZmllcl90eXBlID0gQ2xhc2lmaWNhZG9yDQotX1VJX1R5cGVfdHlwZSA9IFRpcG8NCi1fVUlfRWxlbWVudF90eXBlID0gRWxlbWVudG8NCi1fVUlfTmFtZWRFbGVtZW50X3R5cGUgPSBFbGVtZW50byBjb24gbm9tYnJlDQotX1VJX1BhY2thZ2VhYmxlRWxlbWVudF90eXBlID0gRWxlbWVudG8gZW1wYXF1ZXRhYmxlDQotX1VJX1BhY2thZ2VfdHlwZSA9IFBhcXVldGUNCi1fVUlfTmFtZXNwYWNlX3R5cGUgPSBFc3BhY2lvIGRlIG5vbWJyZXMNCi1fVUlfTWV0aG9kRWxlbWVudF90eXBlID0gRWxlbWVudG8gZGUgbVx1MDBlOXRvZG8NCi1fVUlfQ29uc3RyYWludF90eXBlID0gUmVzdHJpY2NpXHUwMGYzbg0KLV9VSV9Db250ZW50RWxlbWVudF90eXBlID0gRWxlbWVudG8gZGUgY29udGVuaWRvDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF90eXBlID0gRWxlbWVudG8gZGVzY3JpcHRpYmxlDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpcGNpXHUwMGYzbiBkZWwgY29udGVuaWRvDQotX1VJX1NlY3Rpb25fdHlwZSA9IFNlY2NpXHUwMGYzbg0KLV9VSV9Sb2xlX3R5cGUgPSBSb2wNCi1fVUlfV29ya1Byb2R1Y3RfdHlwZSA9IFByb2R1Y3RvIGRlIHRyYWJham8NCi1fVUlfVGFza190eXBlID0gVGFyZWENCi1fVUlfV29ya0RlZmluaXRpb25fdHlwZSA9IERlZmluaWNpXHUwMGYzbiBkZSB0cmFiYWpvDQotX1VJX1N0ZXBfdHlwZSA9IFBhc28NCi1fVUlfR3VpZGFuY2VfdHlwZSA9IEd1XHUwMGVkYQ0KLV9VSV9BcnRpZmFjdF90eXBlID0gQXJ0ZWZhY3RvDQotX1VJX0RlbGl2ZXJhYmxlX3R5cGUgPSBQcm9kdWN0byBmaW5hbA0KLV9VSV9PdXRjb21lX3R5cGUgPSBSZXN1bHRhZG8NCi1fVUlfTWV0aG9kUGFja2FnZV90eXBlID0gUGFxdWV0ZSBkZWwgbVx1MDBlOXRvZG8NCi1fVUlfQ29udGVudFBhY2thZ2VfdHlwZSA9IFBhcXVldGUgZGUgY29udGVuaWRvDQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXBjaVx1MDBmM24gZGVsIGFydGVmYWN0bw0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwY2lcdTAwZjNuIGRlbCBwcm9kdWN0byBkZSB0cmFiYWpvDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXBjaVx1MDBmM24gZGVsIHByb2R1Y3RvIGZpbmFsDQotX1VJX1JvbGVEZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpcGNpXHUwMGYzbiBkZWwgcm9sDQotX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpcGNpXHUwMGYzbiBkZSBsYSB0YXJlYQ0KLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwY2lcdTAwZjNuIGRlIGxhIGd1XHUwMGVkYQ0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwY2lcdTAwZjNuIGRlIGxhIHByXHUwMGUxY3RpY2ENCi1fVUlfUG9pbnRfdHlwZSA9IFB1bnRvDQotX1VJX0dyYXBoRWxlbWVudF90eXBlID0gRWxlbWVudG8gZ3JcdTAwZTFmaWNvDQotX1VJX0RpYWdyYW1FbGVtZW50X3R5cGUgPSBFbGVtZW50byBkZSBkaWFncmFtYQ0KLV9VSV9EaWFncmFtTGlua190eXBlID0gRW5sYWNlIGRlIGRpYWdyYW1hDQotX1VJX0dyYXBoQ29ubmVjdG9yX3R5cGUgPSBDb25lY3RvciBnclx1MDBlMWZpY28NCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gUHVlbnRlIGRlIG1vZGVsbyBzZW1cdTAwZTFudGljbw0KLV9VSV9EaW1lbnNpb25fdHlwZSA9IERpbWVuc2lcdTAwZjNuDQotX1VJX1JlZmVyZW5jZV90eXBlID0gUmVmZXJlbmNpYQ0KLV9VSV9Qcm9wZXJ0eV90eXBlID0gUHJvcGllZGFkDQotX1VJX0dyYXBoRWRnZV90eXBlID0gQm9yZGUgZ3JcdTAwZTFmaWNvDQotX1VJX0RpYWdyYW1fdHlwZSA9IERpYWdyYW1hDQotX1VJX0dyYXBoTm9kZV90eXBlID0gTm9kbyBnclx1MDBlMWZpY28NCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIGRlIG1vZGVsbyBzZW1cdTAwZTFudGljbyBzaW1wbGUNCi1fVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gUHVlbnRlIGRlIG1vZGVsbyBzZW1cdTAwZTFudGljbyBkZSBVTUENCi1fVUlfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSA9IFB1ZW50ZSBkZSBtb2RlbG8gc2VtXHUwMGUxbnRpY28gY2VudHJhbA0KLV9VSV9MZWFmRWxlbWVudF90eXBlID0gRWxlbWVudG8gc2luIHNlY3VuZGFyaW9zDQotX1VJX1RleHRFbGVtZW50X3R5cGUgPSBFbGVtZW50byBkZSB0ZXh0bw0KLV9VSV9JbWFnZV90eXBlID0gSW1hZ2VuDQotX1VJX0dyYXBoaWNQcmltaXRpdmVfdHlwZSA9IFByaW1pdGl2byBnclx1MDBlMWZpY28NCi1fVUlfUG9seWxpbmVfdHlwZSA9IFBvbGlsXHUwMGVkbmVhDQotX1VJX0VsbGlwc2VfdHlwZSA9IEVsaXBzZQ0KLV9VSV9BY3Rpdml0eV90eXBlID0gQWN0aXZpZGFkDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X3R5cGUgPSBFbGVtZW50byBkZSBkZXNnbG9zZSBkZSB0cmFiYWpvDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIGRlIGRlc2dsb3NlDQotX1VJX01pbGVzdG9uZV90eXBlID0gT2JqZXRpdm8NCi1fVUlfSXRlcmF0aW9uX3R5cGUgPSBJdGVyYWNpXHUwMGYzbg0KLV9VSV9QaGFzZV90eXBlID0gRmFzZQ0KLV9VSV9UZWFtUHJvZmlsZV90eXBlID0gUGVyZmlsIGRlbCBlcXVpcG8NCi1fVUlfUm9sZURlc2NyaXB0b3JfdHlwZSA9IERlc2NyaXB0b3IgZGUgcm9sZXMNCi1fVUlfV29ya09yZGVyX3R5cGUgPSBQZWRpZG8gZGUgdHJhYmFqbw0KLV9VSV9Qcm9jZXNzRWxlbWVudF90eXBlID0gRWxlbWVudG8gZGUgcHJvY2Vzbw0KLV9VSV9QbGFubmluZ0RhdGFfdHlwZSA9IERhdG9zIGRlIGxhIHBsYW5pZmljYWNpXHUwMGYzbg0KLV9VSV9EZXNjcmlwdG9yX3R5cGUgPSBEZXNjcmlwdG9yDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlID0gRGVzY3JpcHRvciBkZSBwcm9kdWN0b3MgZGUgdHJhYmFqbw0KLV9VSV9UYXNrRGVzY3JpcHRvcl90eXBlID0gRGVzY3JpcHRvciBkZSB0YXJlYXMNCi1fVUlfQ29tcG9zaXRlUm9sZV90eXBlID0gUm9sIGNvbXB1ZXN0bw0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXBjaVx1MDBmM24gZGVsIGVsZW1lbnRvIGRlIGRlc2dsb3NlDQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXBjaVx1MDBmM24gZGUgbGEgYWN0aXZpZGFkDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwY2lcdTAwZjNuIGRlbCBwcm9jZXNvIGRlIGVudHJlZ2ENCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwY2lcdTAwZjNuIGRlbCBwcm9jZXNvDQotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpcGNpXHUwMGYzbiBkZWwgZGVzY3JpcHRvcg0KLV9VSV9Db25jZXB0X3R5cGUgPSBDb25jZXB0bw0KLV9VSV9DaGVja2xpc3RfdHlwZSA9IExpc3RhIGRlIGNvbXByb2JhY2lcdTAwZjNuDQotX1VJX0V4YW1wbGVfdHlwZSA9IEVqZW1wbG8NCi1fVUlfR3VpZGVsaW5lX3R5cGUgPSBEaXJlY3RyaXoNCi1fVUlfUmVwb3J0X3R5cGUgPSBJbmZvcm1lDQotX1VJX1RlbXBsYXRlX3R5cGUgPSBQbGFudGlsbGENCi1fVUlfU3VwcG9ydGluZ01hdGVyaWFsX3R5cGUgPSBNYXRlcmlhbCBkZSBzb3BvcnRlDQotX1VJX1Rvb2xNZW50b3JfdHlwZSA9IEd1XHUwMGVkYSBkZSBsYSBoZXJyYW1pZW50YQ0KLV9VSV9XaGl0ZXBhcGVyX3R5cGUgPSBEb2N1bWVudGFjaVx1MDBmM24NCi1fVUlfVGVybURlZmluaXRpb25fdHlwZSA9IERlZmluaWNpXHUwMGYzbiBkZSB0XHUwMGU5cm1pbm9zDQotX1VJX1ByYWN0aWNlX3R5cGUgPSBQclx1MDBlMWN0aWNhDQotX1VJX0VzdGltYXRpb25Db25zaWRlcmF0aW9uc190eXBlID0gQ29uc2lkZXJhY2lvbmVzIHNvYnJlIGVsIGNcdTAwZTFsY3Vsbw0KLV9VSV9SZXVzYWJsZUFzc2V0X3R5cGUgPSBBY3Rpdm8gcmV1dGlsaXphYmxlDQotX1VJX1N0YXRlX3R5cGUgPSBFc3RhZG8NCi1fVUlfVmVydGV4X3R5cGUgPSBWXHUwMGU5cnRpY2UNCi1fVUlfUmVnaW9uX3R5cGUgPSBSZWdpXHUwMGYzbg0KLV9VSV9TdGF0ZU1hY2hpbmVfdHlwZSA9IE1cdTAwZTFxdWluYSBkZSBlc3RhZG8NCi1fVUlfVHJhbnNpdGlvbl90eXBlID0gVHJhbnNpY2lcdTAwZjNuDQotX1VJX1BzZXVkb1N0YXRlX3R5cGUgPSBQc2V1ZG9lc3RhZG8NCi1fVUlfRGlzY2lwbGluZV90eXBlID0gRGlzY2lwbGluYQ0KLV9VSV9Db250ZW50Q2F0ZWdvcnlfdHlwZSA9IENhdGVnb3JcdTAwZWRhIGRlbCBjb250ZW5pZG8NCi1fVUlfUm9sZVNldF90eXBlID0gQ29uanVudG8gZGUgcm9sZXMNCi1fVUlfRG9tYWluX3R5cGUgPSBEb21pbmlvDQotX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlID0gQ2xhc2UgZGUgcHJvZHVjdG8gZGUgdHJhYmFqbw0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfdHlwZSA9IEFncnVwYWNpXHUwMGYzbiBkZSBkaXNjaXBsaW5hcw0KLV9VSV9Ub29sX3R5cGUgPSBIZXJyYW1pZW50YQ0KLV9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSA9IEFncnVwYWNpXHUwMGYzbiBkZSBjb25qdW50b3MgZGUgcm9sZXMNCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfdHlwZSA9IENhdGVnb3JcdTAwZWRhIHBlcnNvbmFsaXphZGENCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUgPSBQcm9jZXNvIGRlIGVudHJlZ2ENCi1fVUlfUHJvY2Vzc190eXBlID0gUHJvY2Vzbw0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybl90eXBlID0gUGF0clx1MDBmM24gZGUgcG9zaWJpbGlkYWQNCi1fVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfdHlwZSA9IFBsYW50aWxsYSBkZSBwbGFuaWZpY2FjaVx1MDBmM24gZGUgcHJvY2Vzb3MNCi1fVUlfUm9hZG1hcF90eXBlID0gTWFwYQ0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50X3R5cGUgPSBDb21wb25lbnRlIGRlbCBwcm9jZXNvDQotX1VJX1Byb2Nlc3NQYWNrYWdlX3R5cGUgPSBQYXF1ZXRlIGRlIHByb2Nlc28NCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV90eXBlID0gSW50ZXJmYXogZGVsIGNvbXBvbmVudGUgZGUgcHJvY2Vzbw0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl90eXBlID0gRGVzY3JpcHRvciBkZWwgY29tcG9uZW50ZSBkZSBwcm9jZXNvDQotX1VJX01ldGhvZFBsdWdpbl90eXBlID0gUGx1Zy1pbiBkZSBtXHUwMGU5dG9kbw0KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIGRlIHZhcmlhYmlsaWRhZA0KLV9VSV9NZXRob2RVbml0X3R5cGUgPSBVbmlkYWQgZGVsIG1cdTAwZTl0b2RvDQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSA9IENvbmZpZ3VyYWNpXHUwMGYzbiBkZSBtXHUwMGU5dG9kbw0KLV9VSV9Qcm9jZXNzRmFtaWx5X3R5cGUgPSBGYW1pbGlhIGRlbCBwcm9jZXNvDQotX1VJX01ldGhvZExpYnJhcnlfdHlwZSA9IEJpYmxpb3RlY2EgZGUgbVx1MDBlOXRvZG9zDQotX1VJX1Vua25vd25fdHlwZSA9IE9iamV0bw0KLQ0KLV9VSV9Vbmtub3duX2RhdGF0eXBlPSBWYWxvcg0KLQ0KLV9VSV9OYW1lZEVsZW1lbnRfbmFtZV9mZWF0dXJlID0gTm9tYnJlDQotX1VJX01ldGhvZEVsZW1lbnRfZ3VpZF9mZWF0dXJlID0gR1VJRA0KLV9VSV9NZXRob2RFbGVtZW50X2JyaWVmRGVzY3JpcHRpb25fZmVhdHVyZSA9IERlc2NyaXBjaVx1MDBmM24gYnJldmUNCi1fVUlfTWV0aG9kRWxlbWVudF9vd25lZFJ1bGVzX2ZlYXR1cmUgPSBSZWdsYXMgY29uIHByb3BpZXRhcmlvDQotX1VJX01ldGhvZEVsZW1lbnRfc3VwcHJlc3NlZF9mZWF0dXJlID0gU3VwcmltaWRvDQotX1VJX01ldGhvZEVsZW1lbnRfb3JkZXJpbmdHdWlkZV9mZWF0dXJlID0gR3VcdTAwZWRhIGRlIHBlZGlkbw0KLV9VSV9Db25zdHJhaW50X2JvZHlfZmVhdHVyZSA9IEN1ZXJwbw0KLV9VSV9Db250ZW50RWxlbWVudF9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUgPSBNYXRlcmlhbGVzIGRlIHNvcG9ydGUNCi1fVUlfQ29udGVudEVsZW1lbnRfY29uY2VwdHNBbmRQYXBlcnNfZmVhdHVyZSA9IENvbmNlcHRvcyB5IGRvY3VtZW50YWNpXHUwMGYzbg0KLV9VSV9Db250ZW50RWxlbWVudF9jaGVja2xpc3RzX2ZlYXR1cmUgPSBMaXN0YXMgZGUgY29tcHJvYmFjaVx1MDBmM24NCi1fVUlfQ29udGVudEVsZW1lbnRfZ3VpZGVsaW5lc19mZWF0dXJlID0gRGlyZWN0cmljZXMNCi1fVUlfQ29udGVudEVsZW1lbnRfZXhhbXBsZXNfZmVhdHVyZSA9IEVqZW1wbG9zDQotX1VJX0NvbnRlbnRFbGVtZW50X2Fzc2V0c19mZWF0dXJlID0gQWN0aXZvcw0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uTmFtZV9mZWF0dXJlID0gTm9tYnJlIGRlIHByZXNlbnRhY2lcdTAwZjNuDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fZmVhdHVyZSA9IFByZXNlbnRhY2lcdTAwZjNuDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9zaGFwZWljb25fZmVhdHVyZSA9IFNoYXBlaWNvbg0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfbm9kZWljb25fZmVhdHVyZSA9IE5vZGVpY29uDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9tYWluRGVzY3JpcHRpb25fZmVhdHVyZSA9IERlc2NyaXBjaVx1MDBmM24gcHJpbmNpcGFsDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19mZWF0dXJlID0gU2VjY2lvbmVzDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9rZXlDb25zaWRlcmF0aW9uc19mZWF0dXJlID0gRmFjdG9yZXMgY2xhdmUNCi1fVUlfU2VjdGlvbl9zZWN0aW9uTmFtZV9mZWF0dXJlID0gTm9tYnJlIGRlIHNlY2NpXHUwMGYzbg0KLV9VSV9TZWN0aW9uX3NlY3Rpb25EZXNjcmlwdGlvbl9mZWF0dXJlID0gRGVzY3JpcGNpXHUwMGYzbiBkZSBsYSBzZWNjaVx1MDBmM24NCi1fVUlfU2VjdGlvbl9zdWJTZWN0aW9uc19mZWF0dXJlID0gU3Vic2VjY2lvbmVzDQotX1VJX1NlY3Rpb25fcHJlZGVjZXNzb3JfZmVhdHVyZSA9IFByZWRlY2Vzb3INCi1fVUlfUm9sZV9tb2RpZmllc19mZWF0dXJlID0gTW9kaWZpY2ENCi1fVUlfUm9sZV9yZXNwb25zaWJsZUZvcl9mZWF0dXJlID0gUmVzcG9uc2FibGUgZGUNCi1fVUlfV29ya1Byb2R1Y3RfcmVwb3J0c19mZWF0dXJlID0gSW5mb3JtZXMNCi1fVUlfV29ya1Byb2R1Y3RfdGVtcGxhdGVzX2ZlYXR1cmUgPSBQbGFudGlsbGFzDQotX1VJX1dvcmtQcm9kdWN0X3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBHdVx1MDBlZGFzIGRlIGxhIGhlcnJhbWllbnRhDQotX1VJX1dvcmtQcm9kdWN0X2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gQ29uc2lkZXJhY2lvbmVzIHNvYnJlIGVsIGNcdTAwZTFsY3Vsbw0KLV9VSV9UYXNrX3BlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBSZWFsaXphZG8gcG9yDQotX1VJX1Rhc2tfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSA9IEVudHJhZGEgb2JsaWdhdG9yaWENCi1fVUlfVGFza19vdXRwdXRfZmVhdHVyZSA9IFNhbGlkYQ0KLV9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBSZWFsaXphZG8gYWRpY2lvbmFsbWVudGUgcG9yDQotX1VJX1Rhc2tfb3B0aW9uYWxJbnB1dF9mZWF0dXJlID0gRW50cmFkYSBvcGNpb25hbA0KLV9VSV9UYXNrX3N0ZXBzX2ZlYXR1cmUgPSBQYXNvcw0KLV9VSV9UYXNrX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBHdVx1MDBlZGFzIGRlIGxhIGhlcnJhbWllbnRhDQotX1VJX1Rhc2tfZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBDb25zaWRlcmFjaW9uZXMgc29icmUgZWwgY1x1MDBlMWxjdWxvDQotX1VJX1dvcmtEZWZpbml0aW9uX3ByZWNvbmRpdGlvbl9mZWF0dXJlID0gQ29uZGljaVx1MDBmM24gcHJldmlhDQotX1VJX1dvcmtEZWZpbml0aW9uX3Bvc3Rjb25kaXRpb25fZmVhdHVyZSA9IENvbmRpY2lcdTAwZjNuIHBvc3Rlcmlvcg0KLV9VSV9BcnRpZmFjdF9jb250YWluZXJBcnRpZmFjdF9mZWF0dXJlID0gQXJ0ZWZhY3RvIGRlbCBjb250ZW5lZG9yDQotX1VJX0FydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0c19mZWF0dXJlID0gQXJ0ZWZhY3RvcyBjb250ZW5pZG9zDQotX1VJX0RlbGl2ZXJhYmxlX2RlbGl2ZXJlZFdvcmtQcm9kdWN0c19mZWF0dXJlID0gUHJvZHVjdG9zIGRlIHRyYWJham8gZW50cmVnYWRvcw0KLV9VSV9NZXRob2RQYWNrYWdlX2dsb2JhbF9mZWF0dXJlID0gR2xvYmFsDQotX1VJX01ldGhvZFBhY2thZ2VfcmV1c2VkUGFja2FnZXNfZmVhdHVyZSA9IFBhcXVldGVzIHJldXRpbGl6YWRvcw0KLV9VSV9NZXRob2RQYWNrYWdlX3BhcmVudFBhY2thZ2VfZmVhdHVyZSA9IFBhcXVldGUgcGFkcmUNCi1fVUlfTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX2ZlYXR1cmUgPSBQYXF1ZXRlcyBoaWpvDQotX1VJX0NvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19mZWF0dXJlID0gRWxlbWVudG9zIGRlIGNvbnRlbmlkbw0KLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX2JyaWVmT3V0bGluZV9mZWF0dXJlID0gRXNxdWVtYXRpemFjaVx1MDBmM24gYnJldmUNCi1fVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9yZXByZXNlbnRhdGlvbk9wdGlvbnNfZmVhdHVyZSA9IE9wY2lvbmVzIGRlIHJlcHJlc2VudGFjaVx1MDBmM24NCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBJRCBleHRlcm5vDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gT2JqZXRpdm8NCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9pbXBhY3RPZk5vdEhhdmluZ19mZWF0dXJlID0gSW1wYWN0byBkZSBubyB0ZW5lcg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3JlYXNvbnNGb3JOb3ROZWVkaW5nX2ZlYXR1cmUgPSBNb3Rpdm9zIHBhcmEgbm8gbmVjZXNpdGFyDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fZXh0ZXJuYWxEZXNjcmlwdGlvbl9mZWF0dXJlID0gRGVzY3JpcGNpXHUwMGYzbiBleHRlcm5hDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fcGFja2FnaW5nR3VpZGFuY2VfZmVhdHVyZSA9IEd1XHUwMGVkYSBkZSBlbXBhcXVldGFkbw0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fc2tpbGxzX2ZlYXR1cmUgPSBIYWJpbGlkYWRlcw0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fYXNzaWdubWVudEFwcHJvYWNoZXNfZmVhdHVyZSA9IFByb3B1ZXN0YXMgZGUgYXNpZ25hY2lcdTAwZjNuDQotX1VJX1JvbGVEZXNjcmlwdGlvbl9zeW5vbnltc19mZWF0dXJlID0gU2luXHUwMGYzbmltb3MNCi1fVUlfVGFza0Rlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IE9iamV0aXZvDQotX1VJX1Rhc2tEZXNjcmlwdGlvbl9hbHRlcm5hdGl2ZXNfZmVhdHVyZSA9IEFsdGVybmF0aXZhcw0KLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX2F0dGFjaG1lbnRzX2ZlYXR1cmUgPSBBcmNoaXZvcyBkZSBkYXRvcyBhZGp1bnRvcw0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FkZGl0aW9uYWxJbmZvX2ZlYXR1cmUgPSBJbmZvcm1hY2lcdTAwZjNuIGFkaWNpb25hbA0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3Byb2JsZW1fZmVhdHVyZSA9IFByb2JsZW1hDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYmFja2dyb3VuZF9mZWF0dXJlID0gRm9uZG8NCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9nb2Fsc19mZWF0dXJlID0gT2JqZXRpdm9zDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYXBwbGljYXRpb25fZmVhdHVyZSA9IEFwbGljYWNpXHUwMGYzbg0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2xldmVsc09mQWRvcHRpb25fZmVhdHVyZSA9IE5pdmVsZXMgZGUgYWRvcGNpXHUwMGYzbg0KLV9VSV9Qb2ludF94X2ZlYXR1cmUgPSBYDQotX1VJX1BvaW50X3lfZmVhdHVyZSA9IFkNCi1fVUlfR3JhcGhFbGVtZW50X3Bvc2l0aW9uX2ZlYXR1cmUgPSBQb3NpY2lcdTAwZjNuDQotX1VJX0dyYXBoRWxlbWVudF9jb250YWluZWRfZmVhdHVyZSA9IENvbnRlbmlkbw0KLV9VSV9HcmFwaEVsZW1lbnRfbGlua19mZWF0dXJlID0gRW5sYWNlDQotX1VJX0dyYXBoRWxlbWVudF9hbmNob3JhZ2VfZmVhdHVyZSA9IEFuY2xhamUNCi1fVUlfR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfZmVhdHVyZSA9IE1vZGVsbyBzZW1cdTAwZTFudGljbw0KLV9VSV9EaWFncmFtRWxlbWVudF9pc1Zpc2libGVfZmVhdHVyZSA9IEVzIHZpc2libGUNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfY29udGFpbmVyX2ZlYXR1cmUgPSBDb250ZW5lZG9yDQotX1VJX0RpYWdyYW1FbGVtZW50X3JlZmVyZW5jZV9mZWF0dXJlID0gUmVmZXJlbmNpYQ0KLV9VSV9EaWFncmFtRWxlbWVudF9wcm9wZXJ0eV9mZWF0dXJlID0gUHJvcGllZGFkDQotX1VJX0RpYWdyYW1MaW5rX3pvb21fZmVhdHVyZSA9IFpvb20NCi1fVUlfRGlhZ3JhbUxpbmtfdmlld3BvcnRfZmVhdHVyZSA9IFZpc29yDQotX1VJX0RpYWdyYW1MaW5rX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gRWxlbWVudG8gZ3JcdTAwZTFmaWNvDQotX1VJX0RpYWdyYW1MaW5rX2RpYWdyYW1fZmVhdHVyZSA9IERpYWdyYW1hDQotX1VJX0dyYXBoQ29ubmVjdG9yX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gRWxlbWVudG8gZ3JcdTAwZTFmaWNvDQotX1VJX0dyYXBoQ29ubmVjdG9yX2dyYXBoRWRnZV9mZWF0dXJlID0gQm9yZGUgZ3JcdTAwZTFmaWNvDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBQcmVzZW50YWNpXHUwMGYzbg0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gRWxlbWVudG8gZ3JcdTAwZTFmaWNvDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZGlhZ3JhbV9mZWF0dXJlID0gRGlhZ3JhbWENCi1fVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUgPSBBbmNobw0KLV9VSV9EaW1lbnNpb25faGVpZ2h0X2ZlYXR1cmUgPSBBbHR1cmENCi1fVUlfUmVmZXJlbmNlX2lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBFcyB1bmEgcmVwcmVzZW50YWNpXHUwMGYzbiBpbmRpdmlkdWFsDQotX1VJX1JlZmVyZW5jZV9yZWZlcmVuY2VkX2ZlYXR1cmUgPSBDb24gcmVmZXJlbmNpYXMNCi1fVUlfUHJvcGVydHlfa2V5X2ZlYXR1cmUgPSBDbGF2ZQ0KLV9VSV9Qcm9wZXJ0eV92YWx1ZV9mZWF0dXJlID0gVmFsb3INCi1fVUlfR3JhcGhFZGdlX2FuY2hvcl9mZWF0dXJlID0gQW5jbGENCi1fVUlfR3JhcGhFZGdlX3dheXBvaW50c19mZWF0dXJlID0gUHVudG9zIGRlIHJlZmVyZW5jaWENCi1fVUlfRGlhZ3JhbV96b29tX2ZlYXR1cmUgPSBab29tDQotX1VJX0RpYWdyYW1fdmlld3BvaW50X2ZlYXR1cmUgPSBQdW50byBkZSB2aXN0YQ0KLV9VSV9EaWFncmFtX2RpYWdyYW1MaW5rX2ZlYXR1cmUgPSBFbmxhY2UgZGUgZGlhZ3JhbWENCi1fVUlfRGlhZ3JhbV9uYW1lc3BhY2VfZmVhdHVyZSA9IEVzcGFjaW8gZGUgbm9tYnJlcw0KLV9VSV9HcmFwaE5vZGVfc2l6ZV9mZWF0dXJlID0gVGFtYVx1MDBmMW8NCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZUluZm9fZmVhdHVyZSA9IEluZm9ybWFjaVx1MDBmM24gZGUgdGlwbw0KLV9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IEVsZW1lbnRvDQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IEVsZW1lbnRvDQotX1VJX1RleHRFbGVtZW50X3RleHRfZmVhdHVyZSA9IFRleHRvDQotX1VJX0ltYWdlX3VyaV9mZWF0dXJlID0gVVJJDQotX1VJX0ltYWdlX21pbWVUeXBlX2ZlYXR1cmUgPSBUaXBvIE1pbWUNCi1fVUlfUG9seWxpbmVfY2xvc2VkX2ZlYXR1cmUgPSBDZXJyYWRvDQotX1VJX1BvbHlsaW5lX3dheXBvaW50c19mZWF0dXJlID0gUHVudG9zIGRlIHJlZmVyZW5jaWENCi1fVUlfRWxsaXBzZV9yYWRpdXNYX2ZlYXR1cmUgPSBSYWRpbyBYDQotX1VJX0VsbGlwc2VfcmFkaXVzWV9mZWF0dXJlID0gUmFkaW8gWQ0KLV9VSV9FbGxpcHNlX3JvdGF0aW9uX2ZlYXR1cmUgPSBSb3RhY2lcdTAwZjNuDQotX1VJX0VsbGlwc2Vfc3RhcnRBbmdsZV9mZWF0dXJlID0gXHUwMGMxbmd1bG8gZGUgaW5pY2lvDQotX1VJX0VsbGlwc2VfZW5kQW5nbGVfZmVhdHVyZSA9IFx1MDBjMW5ndWxvIGRlIGZpbmFsaXphY2lcdTAwZjNuDQotX1VJX0VsbGlwc2VfY2VudGVyX2ZlYXR1cmUgPSBDZW50cm8NCi1fVUlfQWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfZmVhdHVyZSA9IEVsZW1lbnRvcyBkZSBkZXNnbG9zZQ0KLV9VSV9BY3Rpdml0eV9yb2FkbWFwc19mZWF0dXJlID0gTWFwYXMNCi1fVUlfQWN0aXZpdHlfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gTWF0ZXJpYWxlcyBkZSBzb3BvcnRlDQotX1VJX0FjdGl2aXR5X2NoZWNrbGlzdHNfZmVhdHVyZSA9IExpc3RhcyBkZSBjb21wcm9iYWNpXHUwMGYzbg0KLV9VSV9BY3Rpdml0eV9jb25jZXB0c19mZWF0dXJlID0gQ29uY2VwdG9zDQotX1VJX0FjdGl2aXR5X2V4YW1wbGVzX2ZlYXR1cmUgPSBFamVtcGxvcw0KLV9VSV9BY3Rpdml0eV9ndWlkZWxpbmVzX2ZlYXR1cmUgPSBEaXJlY3RyaWNlcw0KLV9VSV9BY3Rpdml0eV9yZXVzYWJsZUFzc2V0c19mZWF0dXJlID0gQWN0aXZvcyByZXV0aWxpemFibGVzDQotX1VJX0FjdGl2aXR5X2lzRW5hY3RhYmxlX2ZlYXR1cmUgPSBFcyByZWFsaXphYmxlDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzUmVwZWF0YWJsZV9mZWF0dXJlID0gU2UgcHVlZGUgcmVwZXRpcg0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc09uZ29pbmdfZmVhdHVyZSA9IEVzIGNvbnRpbnVvDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzRXZlbnREcml2ZW5fZmVhdHVyZSA9IEVzdFx1MDBlMSBjb25kaWNpb25hZG8gcG9yIHN1Y2Vzb3MNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfbGlua1RvUHJlZGVjZXNzb3JfZmVhdHVyZSA9IEVubGF6YXIgYSB1biBwcmVkZWNlc29yDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlZml4X2ZlYXR1cmUgPSBQcmVmaWpvDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNQbGFubmVkX2ZlYXR1cmUgPSBFc3RcdTAwZTEgcGxhbmVhZG8NCi1fVUlfQnJlYWtkb3duRWxlbWVudF9oYXNNdWx0aXBsZU9jY3VycmVuY2VzX2ZlYXR1cmUgPSBUaWVuZSB2YXJpYXMgYXBhcmljaW9uZXMNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9pc09wdGlvbmFsX2ZlYXR1cmUgPSBFcyBvcGNpb25hbA0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEFmdGVyX2ZlYXR1cmUgPSBQcmVzZW50YWRvIGRlc3B1XHUwMGU5cw0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEJlZm9yZV9mZWF0dXJlID0gUHJlc2VudGFkbyBhbnRlcw0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3BsYW5uaW5nRGF0YV9mZWF0dXJlID0gRGF0b3MgZGUgbGEgcGxhbmlmaWNhY2lcdTAwZjNuDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfc3VwZXJBY3Rpdml0aWVzX2ZlYXR1cmUgPSBTdXBlcmFjdGl2aWRhZGVzDQotX1VJX1RlYW1Qcm9maWxlX3RlYW1Sb2xlc19mZWF0dXJlID0gUm9sZXMgZGUgZXF1aXBvDQotX1VJX1RlYW1Qcm9maWxlX3N1cGVyVGVhbV9mZWF0dXJlID0gU3VwZXJlcXVpcG8NCi1fVUlfVGVhbVByb2ZpbGVfc3ViVGVhbV9mZWF0dXJlID0gU3ViZXF1aXBvDQotX1VJX1JvbGVEZXNjcmlwdG9yX1JvbGVfZmVhdHVyZSA9IFJvbA0KLV9VSV9Sb2xlRGVzY3JpcHRvcl9tb2RpZmllc19mZWF0dXJlID0gTW9kaWZpY2ENCi1fVUlfUm9sZURlc2NyaXB0b3JfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFJlc3BvbnNhYmxlIGRlDQotX1VJX1dvcmtPcmRlcl9saW5rVHlwZV9mZWF0dXJlID0gVGlwbyBkZSBlbmxhY2UNCi1fVUlfV29ya09yZGVyX3ByZWRfZmVhdHVyZSA9IFByZWRlY2Vzb3INCi1fVUlfUGxhbm5pbmdEYXRhX3N0YXJ0RGF0ZV9mZWF0dXJlID0gRmVjaGEgZGUgaW5pY2lvDQotX1VJX1BsYW5uaW5nRGF0YV9maW5pc2hEYXRlX2ZlYXR1cmUgPSBGZWNoYSBkZSBmaW5hbGl6YWNpXHUwMGYzbg0KLV9VSV9QbGFubmluZ0RhdGFfcmFua19mZWF0dXJlID0gUmFuZ28NCi1fVUlfRGVzY3JpcHRvcl9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2VfZmVhdHVyZSA9IEVzdFx1MDBlMSBzaW5jcm9uaXphZG8gY29uIGVsIG9yaWdlbg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFbnRyeVN0YXRlX2ZlYXR1cmUgPSBFc3RhZG8gZGUgZW50cmFkYSBkZSBhY3RpdmlkYWQNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RXhpdFN0YXRlX2ZlYXR1cmUgPSBFc3RhZG8gZGUgc2FsaWRhIGRlIGFjdGl2aWRhZA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3RfZmVhdHVyZSA9IFByb2R1Y3RvIGRlIHRyYWJham8NCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdGVkQnlfZmVhdHVyZSA9IEFmZWN0YWRvIHBvcg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0c19mZWF0dXJlID0gSW1wYWN0b3MNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2RlbGl2ZXJhYmxlUGFydHNfZmVhdHVyZSA9IENvbXBvbmVudGVzIGRlIHByb2R1Y3RvIGZpbmFsDQotX1VJX1Rhc2tEZXNjcmlwdG9yX1Rhc2tfZmVhdHVyZSA9IFRhcmVhDQotX1VJX1Rhc2tEZXNjcmlwdG9yX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBSZWFsaXphZG9yIHNlY3VuZGFyaW8NCi1fVUlfVGFza0Rlc2NyaXB0b3JfYXNzaXN0ZWRCeV9mZWF0dXJlID0gQXNpc3RpZG8gcG9yDQotX1VJX1Rhc2tEZXNjcmlwdG9yX2V4dGVybmFsSW5wdXRfZmVhdHVyZSA9IEVudHJhZGEgZXh0ZXJuYQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9tYW5kYXRvcnlJbnB1dF9mZWF0dXJlID0gRW50cmFkYSBvYmxpZ2F0b3JpYQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBFbnRyYWRhIG9wY2lvbmFsDQotX1VJX1Rhc2tEZXNjcmlwdG9yX291dHB1dF9mZWF0dXJlID0gU2FsaWRhDQotX1VJX1Rhc2tEZXNjcmlwdG9yX3BlcmZvcm1lZFByaW1hcmlseUJ5X2ZlYXR1cmUgPSBSZWFsaXphZG9yIHByaW5jaXBhbA0KLV9VSV9UYXNrRGVzY3JpcHRvcl9zZWxlY3RlZFN0ZXBzX2ZlYXR1cmUgPSBQYXNvcyBzZWxlY2Npb25hZG9zDQotX1VJX0NvbXBvc2l0ZVJvbGVfYWdncmVnYXRlZFJvbGVzX2ZlYXR1cmUgPSBSb2xlcyBhZ3JlZ2Fkb3MNCi1fVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3VzYWdlR3VpZGFuY2VfZmVhdHVyZSA9IEd1XHUwMGVkYSBkZSB1dGlsaXphY2lcdTAwZjNuDQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gT2JqZXRpdm8NCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9hbHRlcm5hdGl2ZXNfZmVhdHVyZSA9IEFsdGVybmF0aXZhcw0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2hvd3RvU3RhZmZfZmVhdHVyZSA9IFBlcnNvbmFsIHRcdTAwZTljbmljbw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9zY2FsZV9mZWF0dXJlID0gRXNjYWxhDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RDaGFyYWN0ZXJpc3RpY3NfZmVhdHVyZSA9IENhcmFjdGVyXHUwMGVkc3RpY2FzIGRlbCBwcm95ZWN0bw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9yaXNrTGV2ZWxfZmVhdHVyZSA9IE5pdmVsIGRlIHJpZXNnbw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9lc3RpbWF0aW5nVGVjaG5pcXVlX2ZlYXR1cmUgPSBUXHUwMGU5Y25pY2EgZGUgY1x1MDBlMWxjdWxvDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RNZW1iZXJFeHBlcnRpc2VfZmVhdHVyZSA9IEVzcGVjaWFsaWRhZCBkZSBtaWVtYnJvIGRlbCBwcm95ZWN0bw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlT2ZDb250cmFjdF9mZWF0dXJlID0gVGlwbyBkZSBjb250cmF0bw0KLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlID0gSUQgZXh0ZXJubw0KLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fc2NvcGVfZmVhdHVyZSA9IFx1MDBjMW1iaXRvDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl91c2FnZU5vdGVzX2ZlYXR1cmUgPSBOb3RhcyBkZSB1dGlsaXphY2lcdTAwZjNuDQotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl9yZWZpbmVkRGVzY3JpcHRpb25fZmVhdHVyZSA9IERlc2NyaXBjaVx1MDBmM24gcmVmaW5hZGENCi1fVUlfUHJhY3RpY2Vfc3ViUHJhY3RpY2VzX2ZlYXR1cmUgPSBTdWJwclx1MDBlMWN0aWNhcw0KLV9VSV9QcmFjdGljZV9jb250ZW50UmVmZXJlbmNlc19mZWF0dXJlID0gUmVmZXJlbmNpYXMgZGUgY29udGVuaWRvDQotX1VJX1ByYWN0aWNlX2FjdGl2aXR5UmVmZXJlbmNlc19mZWF0dXJlID0gUmVmZXJlbmNpYXMgZGUgYWN0aXZpZGFkDQotX1VJX1N0YXRlX1dvcmtQcm9kdWN0X2ZlYXR1cmUgPSBQcm9kdWN0byBkZSB0cmFiYWpvDQotX1VJX1N0YXRlX1JlZ2lvbl9mZWF0dXJlID0gUmVnaVx1MDBmM24NCi1fVUlfU3RhdGVfc3VibWFjaGluZV9mZWF0dXJlID0gU3VibVx1MDBlMXF1aW5hDQotX1VJX1ZlcnRleF9jb250YWluZXJfZmVhdHVyZSA9IENvbnRlbmVkb3INCi1fVUlfVmVydGV4X291dGdvaW5nX2ZlYXR1cmUgPSBTYWxpZW50ZQ0KLV9VSV9WZXJ0ZXhfaW5jb21pbmdfZmVhdHVyZSA9IEVudHJhbnRlDQotX1VJX1JlZ2lvbl9WZXJ0ZXhfZmVhdHVyZSA9IFZcdTAwZTlydGljZQ0KLV9VSV9SZWdpb25fVHJhbnNpdGlvbl9mZWF0dXJlID0gVHJhbnNpY2lcdTAwZjNuDQotX1VJX1JlZ2lvbl9TdGF0ZV9mZWF0dXJlID0gRXN0YWRvDQotX1VJX1JlZ2lvbl9TdGF0ZU1hY2hpbmVfZmVhdHVyZSA9IE1cdTAwZTFxdWluYSBkZSBlc3RhZG8NCi1fVUlfU3RhdGVNYWNoaW5lX1JlZ2lvbl9mZWF0dXJlID0gUmVnaVx1MDBmM24NCi1fVUlfVHJhbnNpdGlvbl9Xb3JrRGVmaW5pdGlvbl9mZWF0dXJlID0gRGVmaW5pY2lcdTAwZjNuIGRlIHRyYWJham8NCi1fVUlfVHJhbnNpdGlvbl9jb250YWluZXJfZmVhdHVyZSA9IENvbnRlbmVkb3INCi1fVUlfVHJhbnNpdGlvbl9zb3VyY2VfZmVhdHVyZSA9IE9yaWdlbg0KLV9VSV9UcmFuc2l0aW9uX3RhcmdldF9mZWF0dXJlID0gRGVzdGlubw0KLV9VSV9EaXNjaXBsaW5lX3Rhc2tzX2ZlYXR1cmUgPSBUYXJlYXMNCi1fVUlfRGlzY2lwbGluZV9zdWJkaXNjaXBsaW5lX2ZlYXR1cmUgPSBTdWJkaXNjaXBsaW5hDQotX1VJX0Rpc2NpcGxpbmVfcmVmZXJlbmNlV29ya2Zsb3dzX2ZlYXR1cmUgPSBGbHVqb3MgZGUgdHJhYmFqbyBkZSByZWZlcmVuY2lhDQotX1VJX1JvbGVTZXRfcm9sZXNfZmVhdHVyZSA9IFJvbGVzDQotX1VJX0RvbWFpbl93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFByb2R1Y3RvcyBkZSB0cmFiYWpvDQotX1VJX0RvbWFpbl9zdWJkb21haW5zX2ZlYXR1cmUgPSBTdWJkb21pbmlvcw0KLV9VSV9Xb3JrUHJvZHVjdFR5cGVfd29ya1Byb2R1Y3RzX2ZlYXR1cmUgPSBQcm9kdWN0b3MgZGUgdHJhYmFqbw0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSA9IERpc2NpcGxpbmFzDQotX1VJX1Rvb2xfdG9vbE1lbnRvcnNfZmVhdHVyZSA9IEd1XHUwMGVkYXMgZGUgbGEgaGVycmFtaWVudGENCi1fVUlfUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX2ZlYXR1cmUgPSBDb25qdW50b3MgZGUgcm9sZXMNCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfY2F0ZWdvcml6ZWRFbGVtZW50c19mZWF0dXJlID0gRWxlbWVudG9zIGNhdGVnb3JpemFkb3MNCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19mZWF0dXJlID0gU3ViY2F0ZWdvclx1MDBlZGFzDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc19lZHVjYXRpb25NYXRlcmlhbHNfZmVhdHVyZSA9IE1hdGVyaWFsZXMgZGUgZm9ybWFjaVx1MDBmM24NCi1fVUlfRGVsaXZlcnlQcm9jZXNzX2NvbW11bmljYXRpb25zTWF0ZXJpYWxzX2ZlYXR1cmUgPSBNYXRlcmlhbGVzIGRlIGNvbXVuaWNhY2lcdTAwZjNuDQotX1VJX1Byb2Nlc3NfaW5jbHVkZXNQYXR0ZXJuc19mZWF0dXJlID0gSW5jbHV5ZSBwYXRyb25lcw0KLV9VSV9Qcm9jZXNzX2RlZmF1bHRDb250ZXh0X2ZlYXR1cmUgPSBDb250ZXh0byBwb3Igb21pc2lcdTAwZjNuDQotX1VJX1Byb2Nlc3NfdmFsaWRDb250ZXh0X2ZlYXR1cmUgPSBDb250ZXh0byB2XHUwMGUxbGlkbw0KLV9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9iYXNlZE9uUHJvY2Vzc2VzX2ZlYXR1cmUgPSBCYXNhZG8gZW4gcHJvY2Vzb3MNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudF9pbnRlcmZhY2VzX2ZlYXR1cmUgPSBJbnRlcmZhY2VzDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19mZWF0dXJlID0gUHJvY2Vzbw0KLV9VSV9Qcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfZmVhdHVyZSA9IEVsZW1lbnRvcyBkZSBwcm9jZXNvDQotX1VJX1Byb2Nlc3NQYWNrYWdlX2RpYWdyYW1zX2ZlYXR1cmUgPSBEaWFncmFtYXMNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uc19mZWF0dXJlID0gRXNwZWNpZmljYWNpb25lcyBkZSBsYSBpbnRlcmZheg0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZUlPX2ZlYXR1cmUgPSBJbnRlcmZheiBkZSBFL1MNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfUHJvY2Vzc0NvbXBvbmVudF9mZWF0dXJlID0gQ29tcG9uZW50ZSBkZWwgcHJvY2Vzbw0KLV9VSV9NZXRob2RQbHVnaW5fdXNlckNoYW5nZWFibGVfZmVhdHVyZSA9IFVzdWFyaW8gdmFyaWFibGUNCi1fVUlfTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX2ZlYXR1cmUgPSBQYXF1ZXRlcyBkZWwgbVx1MDBlOXRvZG8NCi1fVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUgPSBCYXNlcw0KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUgPSBUaXBvIGRlIHZhcmlhYmlsaWRhZA0KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudF9mZWF0dXJlID0gVmFyaWFiaWxpZGFkIGJhc2FkYSBlbiBlbGVtZW50b3MNCi1fVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUgPSBBdXRvcmVzDQotX1VJX01ldGhvZFVuaXRfY2hhbmdlRGF0ZV9mZWF0dXJlID0gRmVjaGEgZGUgY2FtYmlvDQotX1VJX01ldGhvZFVuaXRfY2hhbmdlRGVzY3JpcHRpb25fZmVhdHVyZSA9IERlc2NyaXBjaVx1MDBmM24gZGUgY2FtYmlvDQotX1VJX01ldGhvZFVuaXRfdmVyc2lvbl9mZWF0dXJlID0gVmVyc2lcdTAwZjNuDQotX1VJX01ldGhvZFVuaXRfY29weXJpZ2h0U3RhdGVtZW50X2ZlYXR1cmUgPSBEZWNsYXJhY2lcdTAwZjNuIGRlIENvcHlyaWdodA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBsdWdpblNlbGVjdGlvbl9mZWF0dXJlID0gU2VsZWNjaVx1MDBmM24gZGVsIHBsdWctaW4gZGUgbVx1MDBlOXRvZG8NCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQYWNrYWdlU2VsZWN0aW9uX2ZlYXR1cmUgPSBTZWxlY2NpXHUwMGYzbiBkZWwgcGFxdWV0ZSBkZWwgbVx1MDBlOXRvZG8NCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9wcm9jZXNzVmlld3NfZmVhdHVyZSA9IFZpc3RhcyBkZSBwcm9jZXNvDQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fZGVmYXVsdFZpZXdfZmVhdHVyZSA9IFZpc3RhIHBvciBvbWlzaVx1MDBmM24NCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9iYXNlQ29uZmlndXJhdGlvbnNfZmVhdHVyZSA9IENvbmZpZ3VyYWNpb25lcyBiXHUwMGUxc2ljYXMNCi1fVUlfUHJvY2Vzc0ZhbWlseV9kZWxpdmVyeVByb2Nlc3Nlc19mZWF0dXJlID0gUHJvY2Vzb3MgZGUgZW50cmVnYQ0KLV9VSV9NZXRob2RMaWJyYXJ5X21ldGhvZFBsdWdpbnNfZmVhdHVyZSA9IFBsdWctaW5zIGRlIG1cdTAwZTl0b2RvDQotX1VJX01ldGhvZExpYnJhcnlfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zX2ZlYXR1cmUgPSBDb25maWd1cmFjaW9uZXMgcHJlZGVmaW5pZGFzDQotX1VJX1Vua25vd25fZmVhdHVyZSA9IFNpbiBlc3BlY2lmaWNhcg0KLQ0KLV9VSV9Xb3JrT3JkZXJUeXBlX2ZpbmlzaFRvU3RhcnRfbGl0ZXJhbCA9IEZpbmFsIGEgaW5pY2lvDQotX1VJX1dvcmtPcmRlclR5cGVfZmluaXNoVG9GaW5pc2hfbGl0ZXJhbCA9IEZpbmFsIGEgZmluYWwNCi1fVUlfV29ya09yZGVyVHlwZV9zdGFydFRvU3RhcnRfbGl0ZXJhbCA9IEluaWNpbyBhIGluaWNpbw0KLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9GaW5pc2hfbGl0ZXJhbCA9IGluaWNpbyBhIGZpbmFsDQotX1VJX1BzZXVkb1N0YXRlS2luZF9pbml0aWFsX2xpdGVyYWwgPSBpbmljaWFsDQotX1VJX1BzZXVkb1N0YXRlS2luZF9qb2luX2xpdGVyYWwgPSB1bmlcdTAwZjNuDQotX1VJX1BzZXVkb1N0YXRlS2luZF9mb3JrX2xpdGVyYWwgPSBiaWZ1cmNhY2lcdTAwZjNuDQotX1VJX1BzZXVkb1N0YXRlS2luZF9qdW5jdGlvbl9saXRlcmFsID0gY3J1Y2UNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2Nob2ljZV9saXRlcmFsID0gb3BjaVx1MDBmM24NCi1fVUlfUHNldWRvU3RhdGVLaW5kX2VudHJ5UG9pbnRfbGl0ZXJhbCA9IGVudHJ5UG9pbnQNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2V4aXRQb2ludF9saXRlcmFsID0gZXhpdFBvaW50DQotX1VJX1BzZXVkb1N0YXRlS2luZF90ZXJtaW5hdGVfbGl0ZXJhbCA9IHRlcm1pbmFyDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9uYV9saXRlcmFsID0gbmENCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2NvbnRyaWJ1dGVzX2xpdGVyYWwgPSBjb250cmlidXllDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9leHRlbmRzX2xpdGVyYWwgPSBhbXBsXHUwMGVkYQ0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfcmVwbGFjZXNfbGl0ZXJhbCA9IHJlZW1wbGF6YQ0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfbG9jYWxDb250cmlidXRpb25fbGl0ZXJhbCA9IGxvY2FsQ29udHJpYnV0aW9uDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9sb2NhbFJlcGxhY2VtZW50X2xpdGVyYWwgPSBsb2NhbFJlcGxhY2VtZW50DQotX1VJX0FydGlmYWN0RGVzY3JpcHRvcl90eXBlID0gRGVzY3JpcHRvciBkZSBhcnRlZmFjdG8NCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdG9yX3R5cGUgPSBEZXNjcmlwdG9yIGRlIHByb2R1Y3RvIGZpbmFsDQotX1VJX091dGNvbWVEZXNjcmlwdG9yX3R5cGUgPSBEZXNjcmlwdG9yIGRlIHJlc3VsdGFkbw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5fZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5fZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQ1ZjBhMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1wbHVnaW5OYW1lID0gUHJpc2UgZW4gY2hhcmdlIGRlIGxhIG1vZGlmaWNhdGlvbiBFTUYgVU1BDQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dCA9IHswfQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MiA9IHsxfSB7MH0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDMgPSB7MX0NCi1fVUlfQ3JlYXRlQ2hpbGRfdG9vbHRpcCA9IENyXHUwMGU5ZXIgdW4gbm91dmVhdSB7MH0gZGFucyBsYSBmb25jdGlvbiB7MX0NCi1fVUlfQ3JlYXRlQ2hpbGRfZGVzY3JpcHRpb24gPSBDclx1MDBlOWVyIHVuIG5vdXZlbCBlbmZhbnQgZHUgdHlwZSB7MH0gcG91ciBsYSBmb25jdGlvbiB7MX0gZHUgezJ9IHNcdTAwZTlsZWN0aW9ublx1MDBlOS4NCi1fVUlfQ3JlYXRlU2libGluZ19kZXNjcmlwdGlvbiA9IENyXHUwMGU5ZXIgdW4gbm91dmVhdSBmclx1MDBlOHJlL3NvZXVyIGR1IHR5cGUgezB9IHBvdXIgbGUgezJ9IHNcdTAwZTlsZWN0aW9ublx1MDBlOSwgZGFucyBsYSBmb25jdGlvbiB7MX0gZGUgc29uIHBhcmVudC4NCi0NCi1fVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uID0gTGUgezB9IGRlIGxhIHsxfQ0KLQ0KLV9VSV9DbGFzc2lmaWVyX3R5cGUgPSBEaXNjcmltaW5hbnQNCi1fVUlfVHlwZV90eXBlID0gVHlwZQ0KLV9VSV9FbGVtZW50X3R5cGUgPSBFbFx1MDBlOW1lbnQNCi1fVUlfTmFtZWRFbGVtZW50X3R5cGUgPSBFbFx1MDBlOW1lbnQgbm9tbVx1MDBlOQ0KLV9VSV9QYWNrYWdlYWJsZUVsZW1lbnRfdHlwZSA9IEVsXHUwMGU5bWVudCBlbXBhcXVldGFibGUNCi1fVUlfUGFja2FnZV90eXBlID0gUGFja2FnZQ0KLV9VSV9OYW1lc3BhY2VfdHlwZSA9IEVzcGFjZSBkZSBub20NCi1fVUlfTWV0aG9kRWxlbWVudF90eXBlID0gRWxcdTAwZTltZW50IGRlIG1cdTAwZTl0aG9kZQ0KLV9VSV9Db25zdHJhaW50X3R5cGUgPSBDb250cmFpbnRlDQotX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUgPSBFbFx1MDBlOW1lbnQgZGUgY29udGVudQ0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSA9IEVsXHUwMGU5bWVudCBkZXNjcmlwdGlibGUNCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwdGlvbiBkZSBjb250ZW51DQotX1VJX1NlY3Rpb25fdHlwZSA9IFNlY3Rpb24NCi1fVUlfUm9sZV90eXBlID0gUlx1MDBmNGxlDQotX1VJX1dvcmtQcm9kdWN0X3R5cGUgPSBQcm9kdWl0DQotX1VJX1Rhc2tfdHlwZSA9IFRcdTAwZTJjaGUNCi1fVUlfV29ya0RlZmluaXRpb25fdHlwZSA9IERcdTAwZTlmaW5pdGlvbiBkZSB0cmF2YWlsDQotX1VJX1N0ZXBfdHlwZSA9IEV0YXBlDQotX1VJX0d1aWRhbmNlX3R5cGUgPSBDb25zZWlsDQotX1VJX0FydGlmYWN0X3R5cGUgPSBBcnRlZmFjdA0KLV9VSV9EZWxpdmVyYWJsZV90eXBlID0gTGl2cmFibGUNCi1fVUlfT3V0Y29tZV90eXBlID0gU29ydGllDQotX1VJX01ldGhvZFBhY2thZ2VfdHlwZSA9IFBhY2thZ2UgZGUgbVx1MDBlOXRob2RlDQotX1VJX0NvbnRlbnRQYWNrYWdlX3R5cGUgPSBQYWNrYWdlIGRlIGNvbnRlbnUNCi1fVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpcHRpb24gZCdhcnRlZmFjdA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwdGlvbiBkZSBwcm9kdWl0DQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXB0aW9uIGRlIGxpdnJhYmxlDQotX1VJX1JvbGVEZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpcHRpb24gZGUgclx1MDBmNGxlDQotX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpcHRpb24gZGUgdFx1MDBlMmNoZQ0KLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwdGlvbiBkZSBjb25zZWlsDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXB0aW9uIGRlIHByYXRpcXVlDQotX1VJX1BvaW50X3R5cGUgPSBQb2ludA0KLV9VSV9HcmFwaEVsZW1lbnRfdHlwZSA9IEVsXHUwMGU5bWVudCBncmFwaGlxdWUNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfdHlwZSA9IEVsXHUwMGU5bWVudCBkZSBkaWFncmFtbWUNCi1fVUlfRGlhZ3JhbUxpbmtfdHlwZSA9IExpZW4gZGUgZGlhZ3JhbW1lDQotX1VJX0dyYXBoQ29ubmVjdG9yX3R5cGUgPSBDb25uZWN0ZXVyIGdyYXBoaXF1ZQ0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBQb250IGRlIG1vZFx1MDBlOGxlIHNcdTAwZTltYW50aXF1ZQ0KLV9VSV9EaW1lbnNpb25fdHlwZSA9IERpbWVuc2lvbg0KLV9VSV9SZWZlcmVuY2VfdHlwZSA9IFJcdTAwZTlmXHUwMGU5cmVuY2UNCi1fVUlfUHJvcGVydHlfdHlwZSA9IFByb3ByaVx1MDBlOXRcdTAwZTkNCi1fVUlfR3JhcGhFZGdlX3R5cGUgPSBCb3JkIGdyYXBoaXF1ZQ0KLV9VSV9EaWFncmFtX3R5cGUgPSBEaWFncmFtbWUNCi1fVUlfR3JhcGhOb2RlX3R5cGUgPSBOb2V1ZCBncmFwaGlxdWUNCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZSA9IEVsXHUwMGU5bWVudCBkZSBtb2RcdTAwZThsZSBzXHUwMGU5bWFudGlxdWUgc2ltcGxlDQotX1VJX1VNQVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSA9IFBvbnQgZGUgbW9kXHUwMGU4bGUgc1x1MDBlOW1hbnRpcXVlIFVNQQ0KLV9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gUG9udCBkZSBtb2RcdTAwZThsZSBzXHUwMGU5bWFudGlxdWUgcHJpbmNpcGFsDQotX1VJX0xlYWZFbGVtZW50X3R5cGUgPSBFbFx1MDBlOW1lbnQgZmV1aWxsZQ0KLV9VSV9UZXh0RWxlbWVudF90eXBlID0gRWxcdTAwZTltZW50IHRleHRlDQotX1VJX0ltYWdlX3R5cGUgPSBJbWFnZQ0KLV9VSV9HcmFwaGljUHJpbWl0aXZlX3R5cGUgPSBQcmltaXRpdmUgZ3JhcGhpcXVlDQotX1VJX1BvbHlsaW5lX3R5cGUgPSBMaWduZSBwb2x5Z29uYWxlDQotX1VJX0VsbGlwc2VfdHlwZSA9IEVsbGlwc2UNCi1fVUlfQWN0aXZpdHlfdHlwZSA9IEFjdGl2aXRcdTAwZTkNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IEVsXHUwMGU5bWVudCBkZSByXHUwMGU5cGFydGl0aW9uIGR1IHRyYXZhaWwNCi1fVUlfQnJlYWtkb3duRWxlbWVudF90eXBlID0gRWxcdTAwZTltZW50IGRlIHJcdTAwZTlwYXJ0aXRpb24NCi1fVUlfTWlsZXN0b25lX3R5cGUgPSBKYWxvbg0KLV9VSV9JdGVyYXRpb25fdHlwZSA9IEl0XHUwMGU5cmF0aW9uDQotX1VJX1BoYXNlX3R5cGUgPSBQaGFzZQ0KLV9VSV9UZWFtUHJvZmlsZV90eXBlID0gUHJvZmlsIGRlIGwnXHUwMGU5cXVpcGUNCi1fVUlfUm9sZURlc2NyaXB0b3JfdHlwZSA9IERlc2NyaXB0ZXVyIGRlIHJcdTAwZjRsZQ0KLV9VSV9Xb3JrT3JkZXJfdHlwZSA9IE9yZHJlIGRlIHRyYXZhaWwNCi1fVUlfUHJvY2Vzc0VsZW1lbnRfdHlwZSA9IEVsXHUwMGU5bWVudCBkZSBwcm9jZXNzdXMNCi1fVUlfUGxhbm5pbmdEYXRhX3R5cGUgPSBEb25uXHUwMGU5ZXMgZGUgcGxhbmlmaWNhdGlvbg0KLV9VSV9EZXNjcmlwdG9yX3R5cGUgPSBEZXNjcmlwdGV1cg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSA9IERlc2NyaXB0ZXVyIGRlIHByb2R1aXQNCi1fVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSA9IERlc2NyaXB0ZXVyIGRlIHRcdTAwZTJjaGUNCi1fVUlfQ29tcG9zaXRlUm9sZV90eXBlID0gUlx1MDBmNGxlIGNvbXBvc2l0ZQ0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXB0aW9uIGQnXHUwMGU5bFx1MDBlOW1lbnQgZGUgclx1MDBlOXBhcnRpdGlvbg0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwdGlvbiBkJ2FjdGl2aXRcdTAwZTkNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXB0aW9uIGRlIHByb2Nlc3N1cyBkZSBsaXZyYWlzb24NCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwdGlvbiBkZSBwcm9jZXNzdXMNCi1fVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwdGlvbiBkZSBkZXNjcmlwdGV1cg0KLV9VSV9Db25jZXB0X3R5cGUgPSBDb25jZXB0DQotX1VJX0NoZWNrbGlzdF90eXBlID0gTGlzdGUgZGUgY29udHJcdTAwZjRsZQ0KLV9VSV9FeGFtcGxlX3R5cGUgPSBFeGVtcGxlDQotX1VJX0d1aWRlbGluZV90eXBlID0gSW5zdHJ1Y3Rpb25zDQotX1VJX1JlcG9ydF90eXBlID0gUmFwcG9ydA0KLV9VSV9UZW1wbGF0ZV90eXBlID0gQ2FuZXZhcw0KLV9VSV9TdXBwb3J0aW5nTWF0ZXJpYWxfdHlwZSA9IERvY3VtZW50IGQnYWNjb21wYWduZW1lbnQNCi1fVUlfVG9vbE1lbnRvcl90eXBlID0gR3VpZGUgZCd1dGlsaXNhdGlvbiBkZSBsJ291dGlsDQotX1VJX1doaXRlcGFwZXJfdHlwZSA9IExpdnJlIGJsYW5jDQotX1VJX1Rlcm1EZWZpbml0aW9uX3R5cGUgPSBEXHUwMGU5ZmluaXRpb24gZGUgdGVybWUNCi1fVUlfUHJhY3RpY2VfdHlwZSA9IFByYXRpcXVlDQotX1VJX0VzdGltYXRpb25Db25zaWRlcmF0aW9uc190eXBlID0gQ29uc2lkXHUwMGU5cmF0aW9ucyByZWxhdGl2ZXMgXHUwMGUwIGwnZXN0aW1hdGlvbg0KLV9VSV9SZXVzYWJsZUFzc2V0X3R5cGUgPSBSZXNzb3VyY2Ugclx1MDBlOXV0aWxpc2FibGUNCi1fVUlfU3RhdGVfdHlwZSA9IEV0YXQNCi1fVUlfVmVydGV4X3R5cGUgPSBWZXJ0ZXgNCi1fVUlfUmVnaW9uX3R5cGUgPSBSXHUwMGU5Z2lvbg0KLV9VSV9TdGF0ZU1hY2hpbmVfdHlwZSA9IE1hY2hpbmUgZCdcdTAwZTl0YXQNCi1fVUlfVHJhbnNpdGlvbl90eXBlID0gVHJhbnNpdGlvbg0KLV9VSV9Qc2V1ZG9TdGF0ZV90eXBlID0gRXRhdCBkdSBwc2V1ZG9ueW1lDQotX1VJX0Rpc2NpcGxpbmVfdHlwZSA9IERpc2NpcGxpbmUNCi1fVUlfQ29udGVudENhdGVnb3J5X3R5cGUgPSBDYXRcdTAwZTlnb3JpZSBkZSBjb250ZW51DQotX1VJX1JvbGVTZXRfdHlwZSA9IEVuc2VtYmxlIGRlIHJcdTAwZjRsZXMNCi1fVUlfRG9tYWluX3R5cGUgPSBEb21haW5lDQotX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlID0gVHlwZSBkZSBwcm9kdWl0DQotX1VJX0Rpc2NpcGxpbmVHcm91cGluZ190eXBlID0gUmVncm91cGVtZW50IGRlIGRpc2NpcGxpbmUNCi1fVUlfVG9vbF90eXBlID0gT3V0aWwNCi1fVUlfUm9sZVNldEdyb3VwaW5nX3R5cGUgPSBSZWdyb3VwZW1lbnQgZCdlbnNlbWJsZXMgZGUgclx1MDBmNGxlcw0KLV9VSV9DdXN0b21DYXRlZ29yeV90eXBlID0gQ2F0XHUwMGU5Z29yaWUgcGVyc29ubmFsaXNcdTAwZTllDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc190eXBlID0gUHJvY2Vzc3VzIGRlIGxpdnJhaXNvbg0KLV9VSV9Qcm9jZXNzX3R5cGUgPSBQcm9jZXNzdXMNCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdHlwZSA9IFBhdHRlcm4gZGUgY2FwYWNpdFx1MDBlOQ0KLV9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV90eXBlID0gQ2FuZXZhcyBkZSBwbGFuaWZpY2F0aW9uIGRlIHByb2Nlc3N1cw0KLV9VSV9Sb2FkbWFwX3R5cGUgPSBGZXVpbGxlIGRlIHJvdXRlDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSA9IENvbXBvc2FudCBkZSBwcm9jZXNzdXMNCi1fVUlfUHJvY2Vzc1BhY2thZ2VfdHlwZSA9IFBhY2thZ2UgZGUgcHJvY2Vzc3VzDQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfdHlwZSA9IEludGVyZmFjZSBkZSBjb21wb3NhbnQgZGUgcHJvY2Vzc3VzDQotX1VJX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX3R5cGUgPSBEZXNjcmlwdGV1ciBkZSBjb21wb3NhbnQgZGUgcHJvY2Vzc3VzDQotX1VJX01ldGhvZFBsdWdpbl90eXBlID0gUGx1Zy1pbiBkZSBtXHUwMGU5dGhvZGUNCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3R5cGUgPSBFbFx1MDBlOW1lbnQgZGUgdmFyaWFiaWxpdFx1MDBlOQ0KLV9VSV9NZXRob2RVbml0X3R5cGUgPSBVbml0XHUwMGU5IGRlIG1cdTAwZTl0aG9kZQ0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUgPSBDb25maWd1cmF0aW9uIGRlIG1cdTAwZTl0aG9kZQ0KLV9VSV9Qcm9jZXNzRmFtaWx5X3R5cGUgPSBGYW1pbGxlIGRlIHByb2Nlc3N1cw0KLV9VSV9NZXRob2RMaWJyYXJ5X3R5cGUgPSBCaWJsaW90aFx1MDBlOHF1ZSBkZSBtXHUwMGU5dGhvZGVzDQotX1VJX1Vua25vd25fdHlwZSA9IE9iamV0DQotDQotX1VJX1Vua25vd25fZGF0YXR5cGU9IFZhbGV1cg0KLQ0KLV9VSV9OYW1lZEVsZW1lbnRfbmFtZV9mZWF0dXJlID0gTm9tDQotX1VJX01ldGhvZEVsZW1lbnRfZ3VpZF9mZWF0dXJlID0gSWRlbnRpZmljYXRldXIgZ2xvYmFsIHVuaXF1ZQ0KLV9VSV9NZXRob2RFbGVtZW50X2JyaWVmRGVzY3JpcHRpb25fZmVhdHVyZSA9IERlc2NyaXB0aWYgY291cnQNCi1fVUlfTWV0aG9kRWxlbWVudF9vd25lZFJ1bGVzX2ZlYXR1cmUgPSBSXHUwMGU4Z2xlcyBkXHUwMGU5dGVudWVzDQotX1VJX01ldGhvZEVsZW1lbnRfc3VwcHJlc3NlZF9mZWF0dXJlID0gU3VwcHJpbVx1MDBlOQ0KLV9VSV9NZXRob2RFbGVtZW50X29yZGVyaW5nR3VpZGVfZmVhdHVyZSA9IEd1aWRlIGRlIHBhc3NhdGlvbiBkZSBsYSBjb21tYW5kZQ0KLV9VSV9Db25zdHJhaW50X2JvZHlfZmVhdHVyZSA9IENvcnBzDQotX1VJX0NvbnRlbnRFbGVtZW50X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSA9IERvY3VtZW50cyBkJ2FjY29tcGFnbmVtZW50DQotX1VJX0NvbnRlbnRFbGVtZW50X2NvbmNlcHRzQW5kUGFwZXJzX2ZlYXR1cmUgPSBDb25jZXB0cyBldCBsaXZyZXMgYmxhbmNzDQotX1VJX0NvbnRlbnRFbGVtZW50X2NoZWNrbGlzdHNfZmVhdHVyZSA9IExpc3RlcyBkZSBjb250clx1MDBmNGxlDQotX1VJX0NvbnRlbnRFbGVtZW50X2d1aWRlbGluZXNfZmVhdHVyZSA9IEluc3RydWN0aW9ucw0KLV9VSV9Db250ZW50RWxlbWVudF9leGFtcGxlc19mZWF0dXJlID0gRXhlbXBsZXMNCi1fVUlfQ29udGVudEVsZW1lbnRfYXNzZXRzX2ZlYXR1cmUgPSBSZXNzb3VyY2VzDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25OYW1lX2ZlYXR1cmUgPSBOb20gZGUgcHJcdTAwZTlzZW50YXRpb24NCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9mZWF0dXJlID0gUHJcdTAwZTlzZW50YXRpb24NCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3NoYXBlaWNvbl9mZWF0dXJlID0gSWNcdTAwZjRuZSBGb3JtZQ0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfbm9kZWljb25fZmVhdHVyZSA9IEljXHUwMGY0bmUgZGUgbm9ldWQNCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX21haW5EZXNjcmlwdGlvbl9mZWF0dXJlID0gRGVzY3JpcHRpb24gcHJpbmNpcGFsZQ0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fc2VjdGlvbnNfZmVhdHVyZSA9IFNlY3Rpb25zDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9rZXlDb25zaWRlcmF0aW9uc19mZWF0dXJlID0gQ29uc2lkXHUwMGU5cmF0aW9ucyBjbFx1MDBlOXMNCi1fVUlfU2VjdGlvbl9zZWN0aW9uTmFtZV9mZWF0dXJlID0gTm9tIGRlIHNlY3Rpb24NCi1fVUlfU2VjdGlvbl9zZWN0aW9uRGVzY3JpcHRpb25fZmVhdHVyZSA9IERlc2NyaXB0aW9uIGRlIHNlY3Rpb24NCi1fVUlfU2VjdGlvbl9zdWJTZWN0aW9uc19mZWF0dXJlID0gU291cy1zZWN0aW9ucw0KLV9VSV9TZWN0aW9uX3ByZWRlY2Vzc29yX2ZlYXR1cmUgPSBQclx1MDBlOWRcdTAwZTljZXNzZXVyDQotX1VJX1JvbGVfbW9kaWZpZXNfZmVhdHVyZSA9IE1vZGlmaWUNCi1fVUlfUm9sZV9yZXNwb25zaWJsZUZvcl9mZWF0dXJlID0gUmVzcG9uc2FibGUgZGUNCi1fVUlfV29ya1Byb2R1Y3RfcmVwb3J0c19mZWF0dXJlID0gUmFwcG9ydHMNCi1fVUlfV29ya1Byb2R1Y3RfdGVtcGxhdGVzX2ZlYXR1cmUgPSBDYW5ldmFzDQotX1VJX1dvcmtQcm9kdWN0X3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBHdWlkZXMgZCd1dGlsaXNhdGlvbiBkZSBsJ291dGlsDQotX1VJX1dvcmtQcm9kdWN0X2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gQ29uc2lkXHUwMGU5cmF0aW9ucyByZWxhdGl2ZXMgXHUwMGUwIGwnZXN0aW1hdGlvbg0KLV9VSV9UYXNrX3BlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBSXHUwMGU5YWxpc1x1MDBlOSBwYXINCi1fVUlfVGFza19tYW5kYXRvcnlJbnB1dF9mZWF0dXJlID0gRW50clx1MDBlOWUgb2JsaWdhdG9pcmUNCi1fVUlfVGFza19vdXRwdXRfZmVhdHVyZSA9IFNvcnRpZQ0KLV9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBSXHUwMGU5YWxpc1x1MDBlOSBcdTAwZTlnYWxlbWVudCBwYXINCi1fVUlfVGFza19vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBFbnRyXHUwMGU5ZSBmYWN1bHRhdGl2ZQ0KLV9VSV9UYXNrX3N0ZXBzX2ZlYXR1cmUgPSBFdGFwZXMNCi1fVUlfVGFza190b29sTWVudG9yc19mZWF0dXJlID0gR3VpZGVzIGQndXRpbGlzYXRpb24gZGUgbCdvdXRpbA0KLV9VSV9UYXNrX2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gQ29uc2lkXHUwMGU5cmF0aW9ucyByZWxhdGl2ZXMgXHUwMGUwIGwnZXN0aW1hdGlvbg0KLV9VSV9Xb3JrRGVmaW5pdGlvbl9wcmVjb25kaXRpb25fZmVhdHVyZSA9IENvbmRpdGlvbiBwclx1MDBlOWFsYWJsZQ0KLV9VSV9Xb3JrRGVmaW5pdGlvbl9wb3N0Y29uZGl0aW9uX2ZlYXR1cmUgPSBQb3N0LWNvbmRpdGlvbg0KLV9VSV9BcnRpZmFjdF9jb250YWluZXJBcnRpZmFjdF9mZWF0dXJlID0gQXJ0ZWZhY3QgZGUgY29udGVuZXVyDQotX1VJX0FydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0c19mZWF0dXJlID0gQXJ0ZWZhY3RzIGNvbnRlbnVzDQotX1VJX0RlbGl2ZXJhYmxlX2RlbGl2ZXJlZFdvcmtQcm9kdWN0c19mZWF0dXJlID0gUHJvZHVpdHMgbGl2clx1MDBlOXMNCi1fVUlfTWV0aG9kUGFja2FnZV9nbG9iYWxfZmVhdHVyZSA9IEdsb2JhbA0KLV9VSV9NZXRob2RQYWNrYWdlX3JldXNlZFBhY2thZ2VzX2ZlYXR1cmUgPSBQYWNrYWdlcyByXHUwMGU5dXRpbGlzXHUwMGU5cw0KLV9VSV9NZXRob2RQYWNrYWdlX3BhcmVudFBhY2thZ2VfZmVhdHVyZSA9IFBhY2thZ2UgcGFyZW50DQotX1VJX01ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19mZWF0dXJlID0gUGFja2FnZXMgZW5mYW50DQotX1VJX0NvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19mZWF0dXJlID0gRWxcdTAwZTltZW50cyBkZSBjb250ZW51DQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fYnJpZWZPdXRsaW5lX2ZlYXR1cmUgPSBCcmVmIGFwZXJcdTAwZTd1DQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25PcHRpb25zX2ZlYXR1cmUgPSBPcHRpb25zIGRlIHJlcHJcdTAwZTlzZW50YXRpb24NCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBJZGVudGlmaWNhdGV1ciBleHRlcm5lDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gT2JqZXQNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9pbXBhY3RPZk5vdEhhdmluZ19mZWF0dXJlID0gSW5jaWRlbmNlIGR1IG1hbnF1ZQ0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3JlYXNvbnNGb3JOb3ROZWVkaW5nX2ZlYXR1cmUgPSBDYXVzZXMganVzdGlmaWFudCBsZSBtYW5xdWUgZGUgblx1MDBlOWNlc3NpdFx1MDBlOQ0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX2V4dGVybmFsRGVzY3JpcHRpb25fZmVhdHVyZSA9IERlc2NyaXB0aW9uIGV4dGVybmUNCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9wYWNrYWdpbmdHdWlkYW5jZV9mZWF0dXJlID0gQ29uc2VpbCBkZSBtaXNlIGVuIGZvcm1lDQotX1VJX1JvbGVEZXNjcmlwdGlvbl9za2lsbHNfZmVhdHVyZSA9IENvbXBcdTAwZTl0ZW5jZXMNCi1fVUlfUm9sZURlc2NyaXB0aW9uX2Fzc2lnbm1lbnRBcHByb2FjaGVzX2ZlYXR1cmUgPSBBcHByb2NoZXMgZCdhZmZlY3RhdGlvbg0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fc3lub255bXNfZmVhdHVyZSA9IFN5bm9ueW1lcw0KLV9VSV9UYXNrRGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gT2JqZXQNCi1fVUlfVGFza0Rlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlID0gQWx0ZXJuYXRpdmVzDQotX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fYXR0YWNobWVudHNfZmVhdHVyZSA9IFBpXHUwMGU4Y2VzIGpvaW50ZXMNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hZGRpdGlvbmFsSW5mb19mZWF0dXJlID0gSW5mb3JtYXRpb25zIGNvbXBsXHUwMGU5bWVudGFpcmVzDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fcHJvYmxlbV9mZWF0dXJlID0gUHJvYmxcdTAwZThtZQ0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2JhY2tncm91bmRfZmVhdHVyZSA9IEFycmlcdTAwZThyZS1wbGFuDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fZ29hbHNfZmVhdHVyZSA9IE9iamVjdGlmcw0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FwcGxpY2F0aW9uX2ZlYXR1cmUgPSBBcHBsaWNhdGlvbg0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2xldmVsc09mQWRvcHRpb25fZmVhdHVyZSA9IE5pdmVhdXggZCdhZG9wdGlvbg0KLV9VSV9Qb2ludF94X2ZlYXR1cmUgPSBYDQotX1VJX1BvaW50X3lfZmVhdHVyZSA9IFkNCi1fVUlfR3JhcGhFbGVtZW50X3Bvc2l0aW9uX2ZlYXR1cmUgPSBQb3NpdGlvbg0KLV9VSV9HcmFwaEVsZW1lbnRfY29udGFpbmVkX2ZlYXR1cmUgPSBDb250ZW51DQotX1VJX0dyYXBoRWxlbWVudF9saW5rX2ZlYXR1cmUgPSBMaWVuDQotX1VJX0dyYXBoRWxlbWVudF9hbmNob3JhZ2VfZmVhdHVyZSA9IEFuY3JhZ2UNCi1fVUlfR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfZmVhdHVyZSA9IE1vZFx1MDBlOGxlIHNcdTAwZTltYW50aXF1ZQ0KLV9VSV9EaWFncmFtRWxlbWVudF9pc1Zpc2libGVfZmVhdHVyZSA9IEVzdCB2aXNpYmxlDQotX1VJX0RpYWdyYW1FbGVtZW50X2NvbnRhaW5lcl9mZWF0dXJlID0gQ29udGVuZXVyDQotX1VJX0RpYWdyYW1FbGVtZW50X3JlZmVyZW5jZV9mZWF0dXJlID0gUlx1MDBlOWZcdTAwZTlyZW5jZQ0KLV9VSV9EaWFncmFtRWxlbWVudF9wcm9wZXJ0eV9mZWF0dXJlID0gUHJvcHJpXHUwMGU5dFx1MDBlOQ0KLV9VSV9EaWFncmFtTGlua196b29tX2ZlYXR1cmUgPSBab29tDQotX1VJX0RpYWdyYW1MaW5rX3ZpZXdwb3J0X2ZlYXR1cmUgPSBMdWNhcm5lDQotX1VJX0RpYWdyYW1MaW5rX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gRWxcdTAwZTltZW50IGdyYXBoaXF1ZQ0KLV9VSV9EaWFncmFtTGlua19kaWFncmFtX2ZlYXR1cmUgPSBEaWFncmFtbWUNCi1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBFbFx1MDBlOW1lbnQgZ3JhcGhpcXVlDQotX1VJX0dyYXBoQ29ubmVjdG9yX2dyYXBoRWRnZV9mZWF0dXJlID0gQm9yZCBncmFwaGlxdWUNCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9wcmVzZW50YXRpb25fZmVhdHVyZSA9IFByXHUwMGU5c2VudGF0aW9uDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBFbFx1MDBlOW1lbnQgZ3JhcGhpcXVlDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZGlhZ3JhbV9mZWF0dXJlID0gRGlhZ3JhbW1lDQotX1VJX0RpbWVuc2lvbl93aWR0aF9mZWF0dXJlID0gTGFyZ2V1cg0KLV9VSV9EaW1lbnNpb25faGVpZ2h0X2ZlYXR1cmUgPSBIYXV0ZXVyDQotX1VJX1JlZmVyZW5jZV9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbl9mZWF0dXJlID0gRXN0IHVuZSByZXByXHUwMGU5c2VudGF0aW9uIGluZGl2aWR1ZWxsZQ0KLV9VSV9SZWZlcmVuY2VfcmVmZXJlbmNlZF9mZWF0dXJlID0gVXRpbGlzXHUwMGU5DQotX1VJX1Byb3BlcnR5X2tleV9mZWF0dXJlID0gQ2xcdTAwZTkNCi1fVUlfUHJvcGVydHlfdmFsdWVfZmVhdHVyZSA9IFZhbGV1cg0KLV9VSV9HcmFwaEVkZ2VfYW5jaG9yX2ZlYXR1cmUgPSBBbmNyYWdlDQotX1VJX0dyYXBoRWRnZV93YXlwb2ludHNfZmVhdHVyZSA9IFBvaW50cyBkZSBwYXNzYWdlDQotX1VJX0RpYWdyYW1fem9vbV9mZWF0dXJlID0gWm9vbQ0KLV9VSV9EaWFncmFtX3ZpZXdwb2ludF9mZWF0dXJlID0gVmlld3BvaW50DQotX1VJX0RpYWdyYW1fZGlhZ3JhbUxpbmtfZmVhdHVyZSA9IExpZW4gZGUgZGlhZ3JhbW1lDQotX1VJX0RpYWdyYW1fbmFtZXNwYWNlX2ZlYXR1cmUgPSBFc3BhY2UgZGUgbm9tDQotX1VJX0dyYXBoTm9kZV9zaXplX2ZlYXR1cmUgPSBUYWlsbGUNCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZUluZm9fZmVhdHVyZSA9IEluZm9ybWF0aW9ucyBzdXIgbGUgdHlwZQ0KLV9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IEVsXHUwMGU5bWVudA0KLV9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUgPSBFbFx1MDBlOW1lbnQNCi1fVUlfVGV4dEVsZW1lbnRfdGV4dF9mZWF0dXJlID0gVGV4dGUNCi1fVUlfSW1hZ2VfdXJpX2ZlYXR1cmUgPSBVUkkNCi1fVUlfSW1hZ2VfbWltZVR5cGVfZmVhdHVyZSA9IEZvcm1hdCBNSU1FDQotX1VJX1BvbHlsaW5lX2Nsb3NlZF9mZWF0dXJlID0gRmVybVx1MDBlOQ0KLV9VSV9Qb2x5bGluZV93YXlwb2ludHNfZmVhdHVyZSA9IFBvaW50cyBkZSBwYXNzYWdlDQotX1VJX0VsbGlwc2VfcmFkaXVzWF9mZWF0dXJlID0gUmF5b24gWA0KLV9VSV9FbGxpcHNlX3JhZGl1c1lfZmVhdHVyZSA9IFJheW9uIFkNCi1fVUlfRWxsaXBzZV9yb3RhdGlvbl9mZWF0dXJlID0gUm90YXRpb24NCi1fVUlfRWxsaXBzZV9zdGFydEFuZ2xlX2ZlYXR1cmUgPSBBbmdsZSBkZSBkXHUwMGU5YnV0DQotX1VJX0VsbGlwc2VfZW5kQW5nbGVfZmVhdHVyZSA9IEFuZ2xlIGRlIGZpbg0KLV9VSV9FbGxpcHNlX2NlbnRlcl9mZWF0dXJlID0gQ2VudHJlDQotX1VJX0FjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX2ZlYXR1cmUgPSBFbFx1MDBlOW1lbnRzIGRlIHJcdTAwZTlwYXJ0aXRpb24NCi1fVUlfQWN0aXZpdHlfcm9hZG1hcHNfZmVhdHVyZSA9IENhbGVuZHJpZXJzDQotX1VJX0FjdGl2aXR5X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSA9IERvY3VtZW50cyBkJ2FjY29tcGFnbmVtZW50DQotX1VJX0FjdGl2aXR5X2NoZWNrbGlzdHNfZmVhdHVyZSA9IExpc3RlcyBkZSBjb250clx1MDBmNGxlDQotX1VJX0FjdGl2aXR5X2NvbmNlcHRzX2ZlYXR1cmUgPSBDb25jZXB0cw0KLV9VSV9BY3Rpdml0eV9leGFtcGxlc19mZWF0dXJlID0gRXhlbXBsZXMNCi1fVUlfQWN0aXZpdHlfZ3VpZGVsaW5lc19mZWF0dXJlID0gSW5zdHJ1Y3Rpb25zDQotX1VJX0FjdGl2aXR5X3JldXNhYmxlQXNzZXRzX2ZlYXR1cmUgPSBSZXNzb3VyY2VzIHJcdTAwZTl1dGlsaXNhYmxlcw0KLV9VSV9BY3Rpdml0eV9pc0VuYWN0YWJsZV9mZWF0dXJlID0gRXN0IGFjdGl2YWJsZQ0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc1JlcGVhdGFibGVfZmVhdHVyZSA9IEVzdCByXHUwMGU5aXRcdTAwZTlyYWJsZQ0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc09uZ29pbmdfZmVhdHVyZSA9IEVzdCBlbiBjb3Vycw0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc0V2ZW50RHJpdmVuX2ZlYXR1cmUgPSBFc3QgY29tbWFuZFx1MDBlOSBwYXIgbGVzIFx1MDBlOXZcdTAwZTluZW1lbnRzDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2xpbmtUb1ByZWRlY2Vzc29yX2ZlYXR1cmUgPSBMaWVyIGF1IHByXHUwMGU5ZFx1MDBlOWNlc3NldXINCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVmaXhfZmVhdHVyZSA9IFByXHUwMGU5Zml4ZQ0KLV9VSV9CcmVha2Rvd25FbGVtZW50X2lzUGxhbm5lZF9mZWF0dXJlID0gRXN0IHBsYW5pZmlcdTAwZTkNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9oYXNNdWx0aXBsZU9jY3VycmVuY2VzX2ZlYXR1cmUgPSBDb21wdGUgcGx1c2lldXJzIG9jY3VycmVuY2VzDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNPcHRpb25hbF9mZWF0dXJlID0gRXN0IGZhY3VsdGF0aWYNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRBZnRlcl9mZWF0dXJlID0gUHJcdTAwZTlzZW50XHUwMGU5IGFwclx1MDBlOHMNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRCZWZvcmVfZmVhdHVyZSA9IFByXHUwMGU5c2VudFx1MDBlOSBhdmFudA0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3BsYW5uaW5nRGF0YV9mZWF0dXJlID0gRG9ublx1MDBlOWVzIGRlIHBsYW5pZmljYXRpb24NCi1fVUlfQnJlYWtkb3duRWxlbWVudF9zdXBlckFjdGl2aXRpZXNfZmVhdHVyZSA9IFN1cGVyYWN0aXZpdFx1MDBlOXMNCi1fVUlfVGVhbVByb2ZpbGVfdGVhbVJvbGVzX2ZlYXR1cmUgPSBSXHUwMGY0bGVzIGRlcyBcdTAwZTlxdWlwZXMNCi1fVUlfVGVhbVByb2ZpbGVfc3VwZXJUZWFtX2ZlYXR1cmUgPSBTdXBlcmdyb3VwZQ0KLV9VSV9UZWFtUHJvZmlsZV9zdWJUZWFtX2ZlYXR1cmUgPSBTb3VzLWdyb3VwZQ0KLV9VSV9Sb2xlRGVzY3JpcHRvcl9Sb2xlX2ZlYXR1cmUgPSBSXHUwMGY0bGUNCi1fVUlfUm9sZURlc2NyaXB0b3JfbW9kaWZpZXNfZmVhdHVyZSA9IE1vZGlmaWUNCi1fVUlfUm9sZURlc2NyaXB0b3JfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFJlc3BvbnNhYmxlIGRlDQotX1VJX1dvcmtPcmRlcl9saW5rVHlwZV9mZWF0dXJlID0gVHlwZSBkZSBsaWVuDQotX1VJX1dvcmtPcmRlcl9wcmVkX2ZlYXR1cmUgPSBQclx1MDBlOWQuDQotX1VJX1BsYW5uaW5nRGF0YV9zdGFydERhdGVfZmVhdHVyZSA9IERhdGUgZGUgZFx1MDBlOWJ1dA0KLV9VSV9QbGFubmluZ0RhdGFfZmluaXNoRGF0ZV9mZWF0dXJlID0gRGF0ZSBkZSBmaW4NCi1fVUlfUGxhbm5pbmdEYXRhX3JhbmtfZmVhdHVyZSA9IENsYXNzZW1lbnQNCi1fVUlfRGVzY3JpcHRvcl9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2VfZmVhdHVyZSA9IEVzdCBzeW5jaHJvbmlzXHUwMGU5IGF2ZWMgbGEgc291cmNlDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUVudHJ5U3RhdGVfZmVhdHVyZSA9IEV0YXQgZCdlbnRyXHUwMGU5ZSBkJ2FjdGl2aXRcdTAwZTkNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RXhpdFN0YXRlX2ZlYXR1cmUgPSBFdGF0IGRlIHNvcnRpZSBkJ2FjdGl2aXRcdTAwZTkNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0X2ZlYXR1cmUgPSBQcm9kdWl0DQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RlZEJ5X2ZlYXR1cmUgPSBBZmZlY3RcdTAwZTkgcGFyDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RzX2ZlYXR1cmUgPSBBZmZlY3RlDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9kZWxpdmVyYWJsZVBhcnRzX2ZlYXR1cmUgPSBDb21wb3NhbnRzIGxpdnJhYmxlcw0KLV9VSV9UYXNrRGVzY3JpcHRvcl9UYXNrX2ZlYXR1cmUgPSBUXHUwMGUyY2hlDQotX1VJX1Rhc2tEZXNjcmlwdG9yX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBFeFx1MDBlOWN1dGFudCBzZWNvbmRhaXJlDQotX1VJX1Rhc2tEZXNjcmlwdG9yX2Fzc2lzdGVkQnlfZmVhdHVyZSA9IEFpZFx1MDBlOSBkZQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9leHRlcm5hbElucHV0X2ZlYXR1cmUgPSBFbnRyXHUwMGU5ZSBleHRlcm5lDQotX1VJX1Rhc2tEZXNjcmlwdG9yX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUgPSBFbnRyXHUwMGU5ZSBvYmxpZ2F0b2lyZQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBFbnRyXHUwMGU5ZSBmYWN1bHRhdGl2ZQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9vdXRwdXRfZmVhdHVyZSA9IFNvcnRpZQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9wZXJmb3JtZWRQcmltYXJpbHlCeV9mZWF0dXJlID0gRXhcdTAwZTljdXRhbnQgcHJpbmNpcGFsDQotX1VJX1Rhc2tEZXNjcmlwdG9yX3NlbGVjdGVkU3RlcHNfZmVhdHVyZSA9IEV0YXBlcyBzXHUwMGU5bGVjdGlvbm5cdTAwZTllcw0KLV9VSV9Db21wb3NpdGVSb2xlX2FnZ3JlZ2F0ZWRSb2xlc19mZWF0dXJlID0gUlx1MDBmNGxlcyBhZ3JcdTAwZTlnXHUwMGU5cw0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdXNhZ2VHdWlkYW5jZV9mZWF0dXJlID0gQ29uc2VpbHMgZCd1dGlsaXNhdGlvbg0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IE9iamV0DQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBBbHRlcm5hdGl2ZXMNCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9ob3d0b1N0YWZmX2ZlYXR1cmUgPSBEb3RhdGlvbiBlbiBwZXJzb25uZWwNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fc2NhbGVfZmVhdHVyZSA9IEVjaGVsbGUNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdENoYXJhY3RlcmlzdGljc19mZWF0dXJlID0gQ2FyYWN0XHUwMGU5cmlzdGlxdWVzIGRlIHByb2pldA0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9yaXNrTGV2ZWxfZmVhdHVyZSA9IE5pdmVhdSBkZSByaXNxdWUNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fZXN0aW1hdGluZ1RlY2huaXF1ZV9mZWF0dXJlID0gVGVjaG5pcXVlIGQnZXN0aW1hdGlvbg0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlX2ZlYXR1cmUgPSBFeHBlcnRpc2UgZHUgbWVtYnJlIGRlIHByb2pldA0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlT2ZDb250cmFjdF9mZWF0dXJlID0gVHlwZSBkZSBjb250cmF0DQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBJZGVudGlmaWNhdGV1ciBleHRlcm5lDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9zY29wZV9mZWF0dXJlID0gUG9ydFx1MDBlOWUNCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3VzYWdlTm90ZXNfZmVhdHVyZSA9IE5vdGVzIGQndXRpbGlzYXRpb24NCi1fVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3JlZmluZWREZXNjcmlwdGlvbl9mZWF0dXJlID0gRGVzY3JpcHRpb24gZFx1MDBlOXRhaWxsXHUwMGU5ZQ0KLV9VSV9QcmFjdGljZV9zdWJQcmFjdGljZXNfZmVhdHVyZSA9IFNvdXMtcHJhdGlxdWVzDQotX1VJX1ByYWN0aWNlX2NvbnRlbnRSZWZlcmVuY2VzX2ZlYXR1cmUgPSBSXHUwMGU5Zlx1MDBlOXJlbmNlcyBkZSBjb250ZW51DQotX1VJX1ByYWN0aWNlX2FjdGl2aXR5UmVmZXJlbmNlc19mZWF0dXJlID0gUlx1MDBlOWZcdTAwZTlyZW5jZXMgZCdhY3Rpdml0XHUwMGU5DQotX1VJX1N0YXRlX1dvcmtQcm9kdWN0X2ZlYXR1cmUgPSBQcm9kdWl0DQotX1VJX1N0YXRlX1JlZ2lvbl9mZWF0dXJlID0gUlx1MDBlOWdpb24NCi1fVUlfU3RhdGVfc3VibWFjaGluZV9mZWF0dXJlID0gU291cy1tYWNoaW5lDQotX1VJX1ZlcnRleF9jb250YWluZXJfZmVhdHVyZSA9IENvbnRlbmV1cg0KLV9VSV9WZXJ0ZXhfb3V0Z29pbmdfZmVhdHVyZSA9IEVtaXNzaW9uDQotX1VJX1ZlcnRleF9pbmNvbWluZ19mZWF0dXJlID0gUlx1MDBlOWNlcHRpb24NCi1fVUlfUmVnaW9uX1ZlcnRleF9mZWF0dXJlID0gVmVydGV4DQotX1VJX1JlZ2lvbl9UcmFuc2l0aW9uX2ZlYXR1cmUgPSBUcmFuc2l0aW9uDQotX1VJX1JlZ2lvbl9TdGF0ZV9mZWF0dXJlID0gRXRhdA0KLV9VSV9SZWdpb25fU3RhdGVNYWNoaW5lX2ZlYXR1cmUgPSBNYWNoaW5lIGQnXHUwMGU5dGF0DQotX1VJX1N0YXRlTWFjaGluZV9SZWdpb25fZmVhdHVyZSA9IFJcdTAwZTlnaW9uDQotX1VJX1RyYW5zaXRpb25fV29ya0RlZmluaXRpb25fZmVhdHVyZSA9IERcdTAwZTlmaW5pdGlvbiBkZSB0cmF2YWlsDQotX1VJX1RyYW5zaXRpb25fY29udGFpbmVyX2ZlYXR1cmUgPSBDb250ZW5ldXINCi1fVUlfVHJhbnNpdGlvbl9zb3VyY2VfZmVhdHVyZSA9IFNvdXJjZQ0KLV9VSV9UcmFuc2l0aW9uX3RhcmdldF9mZWF0dXJlID0gQ2libGUNCi1fVUlfRGlzY2lwbGluZV90YXNrc19mZWF0dXJlID0gVFx1MDBlMmNoZXMNCi1fVUlfRGlzY2lwbGluZV9zdWJkaXNjaXBsaW5lX2ZlYXR1cmUgPSBTb3VzLWRpc2NpcGxpbmUNCi1fVUlfRGlzY2lwbGluZV9yZWZlcmVuY2VXb3JrZmxvd3NfZmVhdHVyZSA9IEVuY2hhXHUwMGVlbmVtZW50cyBkJ2FjdGl2aXRcdTAwZTlzIGRlIHJcdTAwZTlmXHUwMGU5cmVuY2UNCi1fVUlfUm9sZVNldF9yb2xlc19mZWF0dXJlID0gUlx1MDBmNGxlcw0KLV9VSV9Eb21haW5fd29ya1Byb2R1Y3RzX2ZlYXR1cmUgPSBQcm9kdWl0cw0KLV9VSV9Eb21haW5fc3ViZG9tYWluc19mZWF0dXJlID0gU291cy1kb21haW5lcw0KLV9VSV9Xb3JrUHJvZHVjdFR5cGVfd29ya1Byb2R1Y3RzX2ZlYXR1cmUgPSBQcm9kdWl0cw0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSA9IERpc2NpcGxpbmVzDQotX1VJX1Rvb2xfdG9vbE1lbnRvcnNfZmVhdHVyZSA9IEd1aWRlcyBkJ3V0aWxpc2F0aW9uIGRlIGwnb3V0aWwNCi1fVUlfUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX2ZlYXR1cmUgPSBFbnNlbWJsZXMgZGUgclx1MDBmNGxlcw0KLV9VSV9DdXN0b21DYXRlZ29yeV9jYXRlZ29yaXplZEVsZW1lbnRzX2ZlYXR1cmUgPSBFbFx1MDBlOW1lbnRzIGNhdFx1MDBlOWdvcmlzXHUwMGU5cw0KLV9VSV9DdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX2ZlYXR1cmUgPSBTb3VzLWNhdFx1MDBlOWdvcmllcw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NfZWR1Y2F0aW9uTWF0ZXJpYWxzX2ZlYXR1cmUgPSBEb2N1bWVudHMgZGUgZm9ybWF0aW9uDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc19jb21tdW5pY2F0aW9uc01hdGVyaWFsc19mZWF0dXJlID0gU3VwcG9ydHMgZGUgY29tbXVuaWNhdGlvbg0KLV9VSV9Qcm9jZXNzX2luY2x1ZGVzUGF0dGVybnNfZmVhdHVyZSA9IENvbXByZW5kIGxlcyBwYXR0ZXJucw0KLV9VSV9Qcm9jZXNzX2RlZmF1bHRDb250ZXh0X2ZlYXR1cmUgPSBDb250ZXh0ZSBwYXIgZFx1MDBlOWZhdXQNCi1fVUlfUHJvY2Vzc192YWxpZENvbnRleHRfZmVhdHVyZSA9IENvbnRleHRlIHZhbGlkZQ0KLV9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9iYXNlZE9uUHJvY2Vzc2VzX2ZlYXR1cmUgPSBCYXNcdTAwZTkgc3VyIGxlcyBwcm9jZXNzdXMNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudF9pbnRlcmZhY2VzX2ZlYXR1cmUgPSBJbnRlcmZhY2VzDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19mZWF0dXJlID0gUHJvY2Vzc3VzDQotX1VJX1Byb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19mZWF0dXJlID0gRWxcdTAwZTltZW50cyBkZSBwcm9jZXNzdXMNCi1fVUlfUHJvY2Vzc1BhY2thZ2VfZGlhZ3JhbXNfZmVhdHVyZSA9IERpYWdyYW1tZXMNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uc19mZWF0dXJlID0gU3BcdTAwZTljaWZpY2F0aW9ucyBkJ2ludGVyZmFjZQ0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZUlPX2ZlYXR1cmUgPSBFbnRyXHUwMGU5ZS1zb3J0aWUgZCdpbnRlcmZhY2UNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfUHJvY2Vzc0NvbXBvbmVudF9mZWF0dXJlID0gQ29tcG9zYW50IGRlIHByb2Nlc3N1cw0KLV9VSV9NZXRob2RQbHVnaW5fdXNlckNoYW5nZWFibGVfZmVhdHVyZSA9IE1vZGlmaWFibGUgcGFyIGwndXRpbGlzYXRldXINCi1fVUlfTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX2ZlYXR1cmUgPSBQYWNrYWdlcyBkZSBtXHUwMGU5dGhvZGUNCi1fVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUgPSBCYXNlcw0KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUgPSBUeXBlIGRlIHZhcmlhYmlsaXRcdTAwZTkNCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRfZmVhdHVyZSA9IFZhcmlhYmlsaXRcdTAwZTkgYmFzXHUwMGU5ZSBzdXIgbCdcdTAwZTlsXHUwMGU5bWVudA0KLV9VSV9NZXRob2RVbml0X2F1dGhvcnNfZmVhdHVyZSA9IEF1dGV1cnMNCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUgPSBEYXRlIGRlIG1vZGlmaWNhdGlvbg0KLV9VSV9NZXRob2RVbml0X2NoYW5nZURlc2NyaXB0aW9uX2ZlYXR1cmUgPSBEZXNjcmlwdGlvbiBkZSBsYSBtb2RpZmljYXRpb24NCi1fVUlfTWV0aG9kVW5pdF92ZXJzaW9uX2ZlYXR1cmUgPSBWZXJzaW9uDQotX1VJX01ldGhvZFVuaXRfY29weXJpZ2h0U3RhdGVtZW50X2ZlYXR1cmUgPSBEXHUwMGU5Y2xhcmF0aW9uIGRlIGRyb2l0cyBkJ2F1dGV1cg0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBsdWdpblNlbGVjdGlvbl9mZWF0dXJlID0gU1x1MDBlOWxlY3Rpb24gZHUgcGx1Zy1pbiBkZSBtXHUwMGU5dGhvZGUNCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQYWNrYWdlU2VsZWN0aW9uX2ZlYXR1cmUgPSBTXHUwMGU5bGVjdGlvbiBkdSBwYWNrYWdlIGRlIG1cdTAwZTl0aG9kZQ0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3Byb2Nlc3NWaWV3c19mZWF0dXJlID0gVnVlcyBkZSBwcm9jZXNzdXMNCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9kZWZhdWx0Vmlld19mZWF0dXJlID0gVnVlIHBhciBkXHUwMGU5ZmF1dA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2Jhc2VDb25maWd1cmF0aW9uc19mZWF0dXJlID0gQ29uZmlndXJhdGlvbnMgZGUgYmFzZQ0KLV9VSV9Qcm9jZXNzRmFtaWx5X2RlbGl2ZXJ5UHJvY2Vzc2VzX2ZlYXR1cmUgPSBQcm9jZXNzdXMgZGUgbGl2cmFpc29uDQotX1VJX01ldGhvZExpYnJhcnlfbWV0aG9kUGx1Z2luc19mZWF0dXJlID0gUGx1Zy1pbnMgZGUgbVx1MDBlOXRob2RlDQotX1VJX01ldGhvZExpYnJhcnlfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zX2ZlYXR1cmUgPSBDb25maWd1cmF0aW9ucyBwclx1MDBlOWRcdTAwZTl2ZWxvcHBcdTAwZTllcw0KLV9VSV9Vbmtub3duX2ZlYXR1cmUgPSBOb24gc3BcdTAwZTljaWZpXHUwMGU5DQotDQotX1VJX1dvcmtPcmRlclR5cGVfZmluaXNoVG9TdGFydF9saXRlcmFsID0gRmluIGF1IGRcdTAwZTlidXQNCi1fVUlfV29ya09yZGVyVHlwZV9maW5pc2hUb0ZpbmlzaF9saXRlcmFsID0gRmluIFx1MDBlMCBmaW4NCi1fVUlfV29ya09yZGVyVHlwZV9zdGFydFRvU3RhcnRfbGl0ZXJhbCA9IERcdTAwZTlidXQgYXUgZFx1MDBlOWJ1dA0KLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9GaW5pc2hfbGl0ZXJhbCA9IERcdTAwZTlidXQgXHUwMGUwIGZpbg0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfaW5pdGlhbF9saXRlcmFsID0gaW5pdGlhbA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfam9pbl9saXRlcmFsID0gam9pbnR1cmUNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2ZvcmtfbGl0ZXJhbCA9IGZvdXJjaGUNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2p1bmN0aW9uX2xpdGVyYWwgPSBqb25jdGlvbg0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfY2hvaWNlX2xpdGVyYWwgPSBvcHRpb24NCi1fVUlfUHNldWRvU3RhdGVLaW5kX2VudHJ5UG9pbnRfbGl0ZXJhbCA9IFBvaW50IGQnZW50clx1MDBlOWUNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2V4aXRQb2ludF9saXRlcmFsID0gUG9pbnQgZGUgc29ydGllDQotX1VJX1BzZXVkb1N0YXRlS2luZF90ZXJtaW5hdGVfbGl0ZXJhbCA9IFRlcm1pbmVyDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9uYV9saXRlcmFsID0gbm9uIGRpc3BvbmlibGUNCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2NvbnRyaWJ1dGVzX2xpdGVyYWwgPSBjb250cmlidWUNCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2V4dGVuZHNfbGl0ZXJhbCA9IFx1MDBlOXRlbmQNCi1fVUlfVmFyaWFiaWxpdHlUeXBlX3JlcGxhY2VzX2xpdGVyYWwgPSByZW1wbGFjZQ0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfbG9jYWxDb250cmlidXRpb25fbGl0ZXJhbCA9IENvbnRyaWJ1dGlvbiBsb2NhbGUNCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsUmVwbGFjZW1lbnRfbGl0ZXJhbCA9IFJlbXBsYWNlbWVudCBsb2NhbA0KLV9VSV9BcnRpZmFjdERlc2NyaXB0b3JfdHlwZSA9IERlc2NyaXB0ZXVyIGQnYXJ0ZWZhY3QNCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdG9yX3R5cGUgPSBEZXNjcmlwdGV1ciBkZSBsaXZyYWJsZQ0KLV9VSV9PdXRjb21lRGVzY3JpcHRvcl90eXBlID0gRGVzY3JpcHRldXIgZGUgc29ydGllDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OWRiY2U4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5faXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLXBsdWdpbk5hbWUgPSBTdXBwb3J0byBtb2RpZmljYSBFTUYgVU1BDQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dCA9IHswfQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MiA9IHsxfSB7MH0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDMgPSB7MX0NCi1fVUlfQ3JlYXRlQ2hpbGRfdG9vbHRpcCA9IENyZWF0ZSBOZXcgezB9IFVuZGVyIHsxfSBGZWF0dXJlDQotX1VJX0NyZWF0ZUNoaWxkX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IGNoaWxkIG9mIHR5cGUgezB9IGZvciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlIHNlbGVjdGVkIHsyfS4NCi1fVUlfQ3JlYXRlU2libGluZ19kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBzaWJsaW5nIG9mIHR5cGUgezB9IGZvciB0aGUgc2VsZWN0ZWQgezJ9LCB1bmRlciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlaXIgcGFyZW50Lg0KLQ0KLV9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24gPSBMYSB7MH0gZGkgezF9DQotDQotX1VJX0NsYXNzaWZpZXJfdHlwZSA9IENsYXNzaWZpY2F0b3JlDQotX1VJX1R5cGVfdHlwZSA9IFRpcG8NCi1fVUlfRWxlbWVudF90eXBlID0gRWxlbWVudG8NCi1fVUlfTmFtZWRFbGVtZW50X3R5cGUgPSBFbGVtZW50byBkZW5vbWluYXRvDQotX1VJX1BhY2thZ2VhYmxlRWxlbWVudF90eXBlID0gRWxlbWVudG8gY2hlIHB1XHUwMGYyIGVzc2VyZSBpbnNlcml0byBuZWwgcGFjY2hldHRvDQotX1VJX1BhY2thZ2VfdHlwZSA9IFBhY2NoZXR0bw0KLV9VSV9OYW1lc3BhY2VfdHlwZSA9IFNwYXppbyBkZWkgbm9taQ0KLV9VSV9NZXRob2RFbGVtZW50X3R5cGUgPSBFbGVtZW50byBkZWwgbWV0b2RvDQotX1VJX0NvbnN0cmFpbnRfdHlwZSA9IFZpbmNvbG8NCi1fVUlfQ29udGVudEVsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIGRlbCBjb250ZW51dG8NCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3R5cGUgPSBFbGVtZW50byBkZXNjcml2aWJpbGUNCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcml6aW9uZSBjb250ZW51dG8NCi1fVUlfU2VjdGlvbl90eXBlID0gU2V6aW9uZQ0KLV9VSV9Sb2xlX3R5cGUgPSBSdW9sbw0KLV9VSV9Xb3JrUHJvZHVjdF90eXBlID0gUHJvZG90dG8gZGkgbGF2b3JvDQotX1VJX1Rhc2tfdHlwZSA9IE9wZXJhemlvbmUNCi1fVUlfV29ya0RlZmluaXRpb25fdHlwZSA9IERlZmluaXppb25lIGxhdm9ybw0KLV9VSV9TdGVwX3R5cGUgPSBQYXNzbw0KLV9VSV9HdWlkYW5jZV90eXBlID0gR3VpZGENCi1fVUlfQXJ0aWZhY3RfdHlwZSA9IEFydGVmYXR0bw0KLV9VSV9EZWxpdmVyYWJsZV90eXBlID0gQ29tcG9uZW50ZSBkaXN0cmlidWliaWxlDQotX1VJX091dGNvbWVfdHlwZSA9IFJpc3VsdGF0bw0KLV9VSV9NZXRob2RQYWNrYWdlX3R5cGUgPSBQYWNjaGV0dG8gZGkgbWV0b2RvDQotX1VJX0NvbnRlbnRQYWNrYWdlX3R5cGUgPSBQYWNjaGV0dG8gZGVsIGNvbnRlbnV0bw0KLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcml6aW9uZSBhcnRlZmF0dG8NCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpemlvbmUgcHJvZG90dG8gZGkgbGF2b3JvDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXppb25lIGNvbXBvbmVudGUgZGlzdHJpYnVpYmlsZQ0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXppb25lIHJ1b2xvDQotX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpemlvbmUgYXR0aXZpdFx1MDBlMA0KLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcml6aW9uZSBndWlkYQ0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcml6aW9uZSBwcm9jZWR1cmENCi1fVUlfUG9pbnRfdHlwZSA9IFB1bnRvDQotX1VJX0dyYXBoRWxlbWVudF90eXBlID0gRWxlbWVudG8gZ3JhZmljbw0KLV9VSV9EaWFncmFtRWxlbWVudF90eXBlID0gRWxlbWVudG8gZGlhZ3JhbW1hDQotX1VJX0RpYWdyYW1MaW5rX3R5cGUgPSBDb2xsZWdhbWVudG8gZGlhZ3JhbW1hDQotX1VJX0dyYXBoQ29ubmVjdG9yX3R5cGUgPSBDb25uZXR0b3JlIGdyYWZpY28NCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gQnJpZGdlIG1vZGVsbG8gc2VtYW50aWNvDQotX1VJX0RpbWVuc2lvbl90eXBlID0gRGltZW5zaW9uZQ0KLV9VSV9SZWZlcmVuY2VfdHlwZSA9IFJpZmVyaW1lbnRvDQotX1VJX1Byb3BlcnR5X3R5cGUgPSBQcm9wcmlldFx1MDBlMA0KLV9VSV9HcmFwaEVkZ2VfdHlwZSA9IE1hcmdpbmUgZ3JhZmljbw0KLV9VSV9EaWFncmFtX3R5cGUgPSBEaWFncmFtbWENCi1fVUlfR3JhcGhOb2RlX3R5cGUgPSBOb2RvIGdyYWZpY28NCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIG1vZGVsbG8gc2VtYW50aWNhIHNlbXBsaWNlDQotX1VJX1VNQVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSA9IEJyaWRnZSBtb2RlbGxvIHNlbWFudGljbyBVTUENCi1fVUlfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSA9IEJyaWRnZSBtb2RlbGxvIHNlbWFudGljbyBkaSBiYXNlDQotX1VJX0xlYWZFbGVtZW50X3R5cGUgPSBFbGVtZW50byBmb2dsaWENCi1fVUlfVGV4dEVsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIHRlc3RvDQotX1VJX0ltYWdlX3R5cGUgPSBJbW1hZ2luZQ0KLV9VSV9HcmFwaGljUHJpbWl0aXZlX3R5cGUgPSBQcmltaXRpdmEgZ3JhZmljYQ0KLV9VSV9Qb2x5bGluZV90eXBlID0gUG9saWxpbmVhDQotX1VJX0VsbGlwc2VfdHlwZSA9IEVsbGlzc2UNCi1fVUlfQWN0aXZpdHlfdHlwZSA9IEF0dGl2aXRcdTAwZTANCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIGRlbGxhIHN1ZGRpdmlzaW9uZSBkZWwgbGF2b3JvDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIGRlbGxhIHN1ZGRpdmlzaW9uZQ0KLV9VSV9NaWxlc3RvbmVfdHlwZSA9IE1pbGVzdG9uZQ0KLV9VSV9JdGVyYXRpb25fdHlwZSA9IEl0ZXJhemlvbmUNCi1fVUlfUGhhc2VfdHlwZSA9IEZhc2UNCi1fVUlfVGVhbVByb2ZpbGVfdHlwZSA9IFByb2ZpbG8gdGVhbQ0KLV9VSV9Sb2xlRGVzY3JpcHRvcl90eXBlID0gRGVzY3JpdHRvcmUgZGkgcnVvbGkNCi1fVUlfV29ya09yZGVyX3R5cGUgPSBPcmRpbmUgbGF2b3JvDQotX1VJX1Byb2Nlc3NFbGVtZW50X3R5cGUgPSBFbGVtZW50byBkZWwgcHJvY2Vzc28NCi1fVUlfUGxhbm5pbmdEYXRhX3R5cGUgPSBQaWFuaWZpY2F6aW9uZSBkYXRpDQotX1VJX0Rlc2NyaXB0b3JfdHlwZSA9IERlc2NyaXR0b3JlDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlID0gRGVzY3JpdHRvcmUgZGkgcHJvZG90dGkgZGkgbGF2b3JvDQotX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUgPSBEZXNjcml0dG9yZSBkaSBvcGVyYXppb25pDQotX1VJX0NvbXBvc2l0ZVJvbGVfdHlwZSA9IFJ1b2xvIGNvbXBvc2l0bw0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaXppb25lIGVsZW1lbnRvIGRlbGxhIHN1ZGRpdmlzaW9uZQ0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcml6aW9uZSBhdHRpdml0XHUwMGUwDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcml6aW9uZSBwcm9jZXNzbyBkaSBwcm9kdXppb25lDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpemlvbmUgcHJvY2Vzc28NCi1fVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcml6aW9uZSBkZXNjcml0dG9yZQ0KLV9VSV9Db25jZXB0X3R5cGUgPSBDb25jZXR0bw0KLV9VSV9DaGVja2xpc3RfdHlwZSA9IEVsZW5jbyBkaSBjb250cm9sbG8NCi1fVUlfRXhhbXBsZV90eXBlID0gRXNlbXBpbw0KLV9VSV9HdWlkZWxpbmVfdHlwZSA9IExpbmVhIGd1aWRhDQotX1VJX1JlcG9ydF90eXBlID0gUmVwb3J0DQotX1VJX1RlbXBsYXRlX3R5cGUgPSBNb2RlbGxvDQotX1VJX1N1cHBvcnRpbmdNYXRlcmlhbF90eXBlID0gTWF0ZXJpYWxlIGRpIHN1cHBvcnRvDQotX1VJX1Rvb2xNZW50b3JfdHlwZSA9IEd1aWRhIGFsIHRvb2wNCi1fVUlfV2hpdGVwYXBlcl90eXBlID0gV2hpdGVwYXBlcg0KLV9VSV9UZXJtRGVmaW5pdGlvbl90eXBlID0gRGVmaW5pemlvbmUgdGVybWluZQ0KLV9VSV9QcmFjdGljZV90eXBlID0gUHJvY2VkdXJhDQotX1VJX0VzdGltYXRpb25Db25zaWRlcmF0aW9uc190eXBlID0gQ29uc2lkZXJhemlvbmkgc3VsbGEgdmFsdXRhemlvbmUNCi1fVUlfUmV1c2FibGVBc3NldF90eXBlID0gUmlzb3JzYSByaXV0aWxpenphYmlsZQ0KLV9VSV9TdGF0ZV90eXBlID0gU3RhdG8NCi1fVUlfVmVydGV4X3R5cGUgPSBWZXJ0aWNlDQotX1VJX1JlZ2lvbl90eXBlID0gUmVnaW9uZQ0KLV9VSV9TdGF0ZU1hY2hpbmVfdHlwZSA9IENvbXB1dGVyIGRpIHN0YXRvDQotX1VJX1RyYW5zaXRpb25fdHlwZSA9IFRyYW5zaXppb25lDQotX1VJX1BzZXVkb1N0YXRlX3R5cGUgPSBQc2V1ZG8gU3RhdG8NCi1fVUlfRGlzY2lwbGluZV90eXBlID0gRGlzY2lwbGluYQ0KLV9VSV9Db250ZW50Q2F0ZWdvcnlfdHlwZSA9IENhdGVnb3JpYSBjb250ZW51dG8NCi1fVUlfUm9sZVNldF90eXBlID0gSW5zaWVtZSBkaSBydW9saQ0KLV9VSV9Eb21haW5fdHlwZSA9IERvbWluaW8NCi1fVUlfV29ya1Byb2R1Y3RUeXBlX3R5cGUgPSBUaXBvIGRpIHByb2RvdHRvIGRpIGxhdm9ybw0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfdHlwZSA9IFJhZ2dydXBwYW1lbnRvIGRpc2NpcGxpbmUNCi1fVUlfVG9vbF90eXBlID0gVG9vbA0KLV9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSA9IFJhZ2dydXBwYW1lbnRvIGluc2llbWkgZGkgcnVvbGkNCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfdHlwZSA9IENhdGVnb3JpYSBwZXJzb25hbGl6emF0YQ0KLV9VSV9EZWxpdmVyeVByb2Nlc3NfdHlwZSA9IFByb2Nlc3NvIGRpIHByb2R1emlvbmUNCi1fVUlfUHJvY2Vzc190eXBlID0gUHJvY2Vzc28NCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdHlwZSA9IE1vZGVsbG8gZGkgY2FwYWNpdFx1MDBlMA0KLV9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV90eXBlID0gTW9kZWxsbyBwaWFuaWZpY2F6aW9uZSBwcm9jZXNzaQ0KLV9VSV9Sb2FkbWFwX3R5cGUgPSBSb2FkbWFwDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSA9IENvbXBvbmVudGUgcHJvY2Vzc28NCi1fVUlfUHJvY2Vzc1BhY2thZ2VfdHlwZSA9IFBhY2NoZXR0byBwcm9jZXNzbw0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX3R5cGUgPSBJbnRlcmZhY2NpYSBjb21wb25lbnRlIHByb2Nlc3NvDQotX1VJX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX3R5cGUgPSBEZXNjcml0dG9yZSBkaSBjb21wb25lbnRpIGRlbCBwcm9jZXNzbw0KLV9VSV9NZXRob2RQbHVnaW5fdHlwZSA9IFBsdWctaW4gZGkgbWV0b2RvDQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlID0gRWxlbWVudG8gdmFyaWFiaWxpdFx1MDBlMA0KLV9VSV9NZXRob2RVbml0X3R5cGUgPSBVbml0XHUwMGUwIG1ldG9kbw0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUgPSBDb25maWd1cmF6aW9uZSBkaSBtZXRvZG8NCi1fVUlfUHJvY2Vzc0ZhbWlseV90eXBlID0gRmFtaWdsaWEgcHJvY2Vzc28NCi1fVUlfTWV0aG9kTGlicmFyeV90eXBlID0gTGlicmVyaWEgZGVpIG1ldG9kaQ0KLV9VSV9Vbmtub3duX3R5cGUgPSBPZ2dldHRvDQotDQotX1VJX1Vua25vd25fZGF0YXR5cGU9IFZhbG9yZQ0KLQ0KLV9VSV9OYW1lZEVsZW1lbnRfbmFtZV9mZWF0dXJlID0gTm9tZQ0KLV9VSV9NZXRob2RFbGVtZW50X2d1aWRfZmVhdHVyZSA9IEd1aWQNCi1fVUlfTWV0aG9kRWxlbWVudF9icmllZkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBCcmV2ZSBkZXNjcml6aW9uZQ0KLV9VSV9NZXRob2RFbGVtZW50X293bmVkUnVsZXNfZmVhdHVyZSA9IFJlZ29sZSBkaSBwcm9wcmlldFx1MDBlMA0KLV9VSV9NZXRob2RFbGVtZW50X3N1cHByZXNzZWRfZmVhdHVyZSA9IEVsaW1pbmF0bw0KLV9VSV9NZXRob2RFbGVtZW50X29yZGVyaW5nR3VpZGVfZmVhdHVyZSA9IEd1aWRhIGFsbCdvcmRpbmF6aW9uZQ0KLV9VSV9Db25zdHJhaW50X2JvZHlfZmVhdHVyZSA9IENvcnBvDQotX1VJX0NvbnRlbnRFbGVtZW50X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSA9IE1hdGVyaWFsZSBkaSBzdXBwb3J0bw0KLV9VSV9Db250ZW50RWxlbWVudF9jb25jZXB0c0FuZFBhcGVyc19mZWF0dXJlID0gQ29uY2V0dGkgZSB3aGl0ZXBhcGVyDQotX1VJX0NvbnRlbnRFbGVtZW50X2NoZWNrbGlzdHNfZmVhdHVyZSA9IEVsZW5jaGkgZGkgY29udHJvbGxvDQotX1VJX0NvbnRlbnRFbGVtZW50X2d1aWRlbGluZXNfZmVhdHVyZSA9IExpbmVlIGd1aWRhDQotX1VJX0NvbnRlbnRFbGVtZW50X2V4YW1wbGVzX2ZlYXR1cmUgPSBFc2VtcGkNCi1fVUlfQ29udGVudEVsZW1lbnRfYXNzZXRzX2ZlYXR1cmUgPSBSaXNvcnNlDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25OYW1lX2ZlYXR1cmUgPSBOb21lIHByZXNlbnRhemlvbmUNCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9mZWF0dXJlID0gUHJlc2VudGF6aW9uZQ0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfc2hhcGVpY29uX2ZlYXR1cmUgPSBTaGFwZWljb24NCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X25vZGVpY29uX2ZlYXR1cmUgPSBOb2RlaWNvbg0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fbWFpbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBEZXNjcml6aW9uZSBwcmluY2lwYWxlDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19mZWF0dXJlID0gU2V6aW9uaQ0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fa2V5Q29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IENvbnNpZGVyYXppb25pIGNoaWF2ZQ0KLV9VSV9TZWN0aW9uX3NlY3Rpb25OYW1lX2ZlYXR1cmUgPSBOb21lIHNlemlvbmUNCi1fVUlfU2VjdGlvbl9zZWN0aW9uRGVzY3JpcHRpb25fZmVhdHVyZSA9IERlc2NyaXppb25lIHNlemlvbmUNCi1fVUlfU2VjdGlvbl9zdWJTZWN0aW9uc19mZWF0dXJlID0gU290dG9zZXppb25lDQotX1VJX1NlY3Rpb25fcHJlZGVjZXNzb3JfZmVhdHVyZSA9IFByZWRlY2Vzc29yZQ0KLV9VSV9Sb2xlX21vZGlmaWVzX2ZlYXR1cmUgPSBNb2RpZmljYQ0KLV9VSV9Sb2xlX3Jlc3BvbnNpYmxlRm9yX2ZlYXR1cmUgPSBSZXNwb25zYWJpbGUgZGkNCi1fVUlfV29ya1Byb2R1Y3RfcmVwb3J0c19mZWF0dXJlID0gUmVwb3J0DQotX1VJX1dvcmtQcm9kdWN0X3RlbXBsYXRlc19mZWF0dXJlID0gTW9kZWxsaQ0KLV9VSV9Xb3JrUHJvZHVjdF90b29sTWVudG9yc19mZWF0dXJlID0gR3VpZGEgYWwgdG9vbA0KLV9VSV9Xb3JrUHJvZHVjdF9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IENvbnNpZGVyYXppb25pIHN1bGxhIHZhbHV0YXppb25lDQotX1VJX1Rhc2tfcGVyZm9ybWVkQnlfZmVhdHVyZSA9IEVzZWd1aXRhIGRhDQotX1VJX1Rhc2tfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSA9IElucHV0IG9iYmxpZ2F0b3Jpbw0KLV9VSV9UYXNrX291dHB1dF9mZWF0dXJlID0gT3V0cHV0DQotX1VJX1Rhc2tfYWRkaXRpb25hbGx5UGVyZm9ybWVkQnlfZmVhdHVyZSA9IEVzZWd1aXRhIGFuY2hlIGRhDQotX1VJX1Rhc2tfb3B0aW9uYWxJbnB1dF9mZWF0dXJlID0gSW5wdXQgZmFjb2x0YXRpdm8NCi1fVUlfVGFza19zdGVwc19mZWF0dXJlID0gUGFzc2kNCi1fVUlfVGFza190b29sTWVudG9yc19mZWF0dXJlID0gR3VpZGEgYWwgdG9vbA0KLV9VSV9UYXNrX2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gQ29uc2lkZXJhemlvbmkgc3VsbGEgdmFsdXRhemlvbmUNCi1fVUlfV29ya0RlZmluaXRpb25fcHJlY29uZGl0aW9uX2ZlYXR1cmUgPSBQcmUtY29uZGl6aW9uZQ0KLV9VSV9Xb3JrRGVmaW5pdGlvbl9wb3N0Y29uZGl0aW9uX2ZlYXR1cmUgPSBQb3N0LWNvbmRpemlvbmUNCi1fVUlfQXJ0aWZhY3RfY29udGFpbmVyQXJ0aWZhY3RfZmVhdHVyZSA9IENvbnRlbml0b3JlIEFydGVmYXR0bw0KLV9VSV9BcnRpZmFjdF9jb250YWluZWRBcnRpZmFjdHNfZmVhdHVyZSA9IEFydGVmYXR0aSBjb250ZW51dGkNCi1fVUlfRGVsaXZlcmFibGVfZGVsaXZlcmVkV29ya1Byb2R1Y3RzX2ZlYXR1cmUgPSBQcm9kb3R0aSBkaSBsYXZvcm8gZGlzdHJpYnVpdGkNCi1fVUlfTWV0aG9kUGFja2FnZV9nbG9iYWxfZmVhdHVyZSA9IEdsb2JhbGUNCi1fVUlfTWV0aG9kUGFja2FnZV9yZXVzZWRQYWNrYWdlc19mZWF0dXJlID0gUGFjY2hldHRpIHJpdXRpbGl6emF0aQ0KLV9VSV9NZXRob2RQYWNrYWdlX3BhcmVudFBhY2thZ2VfZmVhdHVyZSA9IFBhY2NoZXR0byBwYXJlbnQNCi1fVUlfTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX2ZlYXR1cmUgPSBQYWNjaGV0dGkgY2hpbGQNCi1fVUlfQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX2ZlYXR1cmUgPSBFbGVtZW50aSBkZWwgY29udGVudXRvDQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fYnJpZWZPdXRsaW5lX2ZlYXR1cmUgPSBCcmV2ZSBwcm9maWxvDQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25PcHRpb25zX2ZlYXR1cmUgPSBPcHppb25pIGRpIHJhcHByZXNlbnRhemlvbmUNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBJRCBlc3Rlcm5vDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gU2NvcG8NCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9pbXBhY3RPZk5vdEhhdmluZ19mZWF0dXJlID0gSW1wYXR0byBkZWxsYSBub24gZGlzcG9uaWJpbGl0XHUwMGUwDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcmVhc29uc0Zvck5vdE5lZWRpbmdfZmVhdHVyZSA9IE1vdGl2byBkZWxsYSBub24gbmVjZXNzaXRcdTAwZTANCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9leHRlcm5hbERlc2NyaXB0aW9uX2ZlYXR1cmUgPSBEZXNjcml6aW9uZSBlc3Rlcm5hDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fcGFja2FnaW5nR3VpZGFuY2VfZmVhdHVyZSA9IEd1aWRhIGFsbGEgY3JlYXppb25lIHBhY2NoZXR0aQ0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fc2tpbGxzX2ZlYXR1cmUgPSBTa2lsbA0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fYXNzaWdubWVudEFwcHJvYWNoZXNfZmVhdHVyZSA9IEFwcHJvY2NpIGFzc2VnbmF6aW9uZQ0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fc3lub255bXNfZmVhdHVyZSA9IFNpbm9uaW1pDQotX1VJX1Rhc2tEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBTY29wbw0KLV9VSV9UYXNrRGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBBbHRlcm5hdGl2bw0KLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX2F0dGFjaG1lbnRzX2ZlYXR1cmUgPSBBbGxlZ2F0aQ0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FkZGl0aW9uYWxJbmZvX2ZlYXR1cmUgPSBVbHRlcmlvcmkgaW5mb3JtYXppb25pDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fcHJvYmxlbV9mZWF0dXJlID0gUHJvYmxlbWENCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9iYWNrZ3JvdW5kX2ZlYXR1cmUgPSBCYWNrZ3JvdW5kDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fZ29hbHNfZmVhdHVyZSA9IE9iaWV0dGl2aQ0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FwcGxpY2F0aW9uX2ZlYXR1cmUgPSBBcHBsaWNhemlvbmUNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9sZXZlbHNPZkFkb3B0aW9uX2ZlYXR1cmUgPSBMaXZlbGxpIGRpIGFkb3ppb25lDQotX1VJX1BvaW50X3hfZmVhdHVyZSA9IFgNCi1fVUlfUG9pbnRfeV9mZWF0dXJlID0gWQ0KLV9VSV9HcmFwaEVsZW1lbnRfcG9zaXRpb25fZmVhdHVyZSA9IFBvc2l6aW9uZQ0KLV9VSV9HcmFwaEVsZW1lbnRfY29udGFpbmVkX2ZlYXR1cmUgPSBDb250ZW51dG8NCi1fVUlfR3JhcGhFbGVtZW50X2xpbmtfZmVhdHVyZSA9IENvbGxlZ2FtZW50bw0KLV9VSV9HcmFwaEVsZW1lbnRfYW5jaG9yYWdlX2ZlYXR1cmUgPSBBbmNob3JhZ2UNCi1fVUlfR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfZmVhdHVyZSA9IE1vZGVsbG8gc2VtYW50aWNhDQotX1VJX0RpYWdyYW1FbGVtZW50X2lzVmlzaWJsZV9mZWF0dXJlID0gXHUwMGM4IHZpc2liaWxlDQotX1VJX0RpYWdyYW1FbGVtZW50X2NvbnRhaW5lcl9mZWF0dXJlID0gQ29udGVuaXRvcmUNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcmVmZXJlbmNlX2ZlYXR1cmUgPSBSaWZlcmltZW50bw0KLV9VSV9EaWFncmFtRWxlbWVudF9wcm9wZXJ0eV9mZWF0dXJlID0gUHJvcHJpZXRcdTAwZTANCi1fVUlfRGlhZ3JhbUxpbmtfem9vbV9mZWF0dXJlID0gWm9vbQ0KLV9VSV9EaWFncmFtTGlua192aWV3cG9ydF9mZWF0dXJlID0gUmlxdWFkcm8gZGkgdmlzdWFsaXp6YXppb25lDQotX1VJX0RpYWdyYW1MaW5rX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gRWxlbWVudG8gZ3JhZmljbw0KLV9VSV9EaWFncmFtTGlua19kaWFncmFtX2ZlYXR1cmUgPSBEaWFncmFtbWENCi1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBFbGVtZW50byBncmFmaWNvDQotX1VJX0dyYXBoQ29ubmVjdG9yX2dyYXBoRWRnZV9mZWF0dXJlID0gTWFyZ2luZSBncmFmaWNvDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBQcmVzZW50YXppb25lDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBFbGVtZW50byBncmFmaWNvDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZGlhZ3JhbV9mZWF0dXJlID0gRGlhZ3JhbW1hDQotX1VJX0RpbWVuc2lvbl93aWR0aF9mZWF0dXJlID0gTGFyZ2hlenphDQotX1VJX0RpbWVuc2lvbl9oZWlnaHRfZmVhdHVyZSA9IEFsdGV6emENCi1fVUlfUmVmZXJlbmNlX2lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBcdTAwYzggdW5hIHNpbmdvbGEgcmFwcHJlc2VudGF6aW9uZQ0KLV9VSV9SZWZlcmVuY2VfcmVmZXJlbmNlZF9mZWF0dXJlID0gQ29uIHJpZmVyaW1lbnRvDQotX1VJX1Byb3BlcnR5X2tleV9mZWF0dXJlID0gQ2hpYXZlDQotX1VJX1Byb3BlcnR5X3ZhbHVlX2ZlYXR1cmUgPSBWYWxvcmUNCi1fVUlfR3JhcGhFZGdlX2FuY2hvcl9mZWF0dXJlID0gQW5jb3JhDQotX1VJX0dyYXBoRWRnZV93YXlwb2ludHNfZmVhdHVyZSA9IFdheXBvaW50cw0KLV9VSV9EaWFncmFtX3pvb21fZmVhdHVyZSA9IFpvb20NCi1fVUlfRGlhZ3JhbV92aWV3cG9pbnRfZmVhdHVyZSA9IFJpcXVhZHJvIGRpIHZpc3VhbGl6emF6aW9uZQ0KLV9VSV9EaWFncmFtX2RpYWdyYW1MaW5rX2ZlYXR1cmUgPSBDb2xsZWdhbWVudG8gZGlhZ3JhbW1hDQotX1VJX0RpYWdyYW1fbmFtZXNwYWNlX2ZlYXR1cmUgPSBTcGF6aW8gZGVpIG5vbWkNCi1fVUlfR3JhcGhOb2RlX3NpemVfZmVhdHVyZSA9IERpbWVuc2lvbmkNCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZUluZm9fZmVhdHVyZSA9IEluZm8gdGlwbw0KLV9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IEVsZW1lbnRvDQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IEVsZW1lbnRvDQotX1VJX1RleHRFbGVtZW50X3RleHRfZmVhdHVyZSA9IFRlc3RvDQotX1VJX0ltYWdlX3VyaV9mZWF0dXJlID0gVXJpDQotX1VJX0ltYWdlX21pbWVUeXBlX2ZlYXR1cmUgPSBUaXBvIE1pbWUNCi1fVUlfUG9seWxpbmVfY2xvc2VkX2ZlYXR1cmUgPSBDaGl1c28NCi1fVUlfUG9seWxpbmVfd2F5cG9pbnRzX2ZlYXR1cmUgPSBXYXlwb2ludHMNCi1fVUlfRWxsaXBzZV9yYWRpdXNYX2ZlYXR1cmUgPSBSYWdnaW8gWA0KLV9VSV9FbGxpcHNlX3JhZGl1c1lfZmVhdHVyZSA9IFJhZ2dpbyBZDQotX1VJX0VsbGlwc2Vfcm90YXRpb25fZmVhdHVyZSA9IFJvdGF6aW9uZQ0KLV9VSV9FbGxpcHNlX3N0YXJ0QW5nbGVfZmVhdHVyZSA9IEFuZ29sbyBkaSBwYXJ0ZW56YQ0KLV9VSV9FbGxpcHNlX2VuZEFuZ2xlX2ZlYXR1cmUgPSBBbmdvbG8gZGkgYXJyaXZvDQotX1VJX0VsbGlwc2VfY2VudGVyX2ZlYXR1cmUgPSBDZW50cm8NCi1fVUlfQWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfZmVhdHVyZSA9IEVsZW1lbnRpIGRlbGxhIHN1ZGRpdmlzaW9uZQ0KLV9VSV9BY3Rpdml0eV9yb2FkbWFwc19mZWF0dXJlID0gUm9hZG1hcA0KLV9VSV9BY3Rpdml0eV9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUgPSBNYXRlcmlhbGUgZGkgc3VwcG9ydG8NCi1fVUlfQWN0aXZpdHlfY2hlY2tsaXN0c19mZWF0dXJlID0gRWxlbmNoaSBkaSBjb250cm9sbG8NCi1fVUlfQWN0aXZpdHlfY29uY2VwdHNfZmVhdHVyZSA9IENvbmNldHRpDQotX1VJX0FjdGl2aXR5X2V4YW1wbGVzX2ZlYXR1cmUgPSBFc2VtcGkNCi1fVUlfQWN0aXZpdHlfZ3VpZGVsaW5lc19mZWF0dXJlID0gTGluZWUgZ3VpZGENCi1fVUlfQWN0aXZpdHlfcmV1c2FibGVBc3NldHNfZmVhdHVyZSA9IFJpc29yc2Ugcml1dGlsaXp6YWJpbGkNCi1fVUlfQWN0aXZpdHlfaXNFbmFjdGFibGVfZmVhdHVyZSA9IFx1MDBjOCBhdHR1YWJpbGUNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNSZXBlYXRhYmxlX2ZlYXR1cmUgPSBcdTAwYzggcmlwZXRpYmlsZQ0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc09uZ29pbmdfZmVhdHVyZSA9IFx1MDBjOCBpbiBjb3Jzbw0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc0V2ZW50RHJpdmVuX2ZlYXR1cmUgPSBTaSBiYXNhIHN1Z2xpIGV2ZW50aQ0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9saW5rVG9QcmVkZWNlc3Nvcl9mZWF0dXJlID0gQ29sbGVnYW1lbnRvIGFsIHByZWRlY2Vzc29yZQ0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZWZpeF9mZWF0dXJlID0gUHJlZmlzc28NCi1fVUlfQnJlYWtkb3duRWxlbWVudF9pc1BsYW5uZWRfZmVhdHVyZSA9IFx1MDBjOCBwaWFuaWZpY2F0bw0KLV9VSV9CcmVha2Rvd25FbGVtZW50X2hhc011bHRpcGxlT2NjdXJyZW5jZXNfZmVhdHVyZSA9IFByZXNlbnRhIHBpXHUwMGY5IHJpY29ycmVuemUNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9pc09wdGlvbmFsX2ZlYXR1cmUgPSBcdTAwYzggZmFjb2x0YXRpdm8NCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRBZnRlcl9mZWF0dXJlID0gUHJlc2VudGF0byBkb3BvDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQmVmb3JlX2ZlYXR1cmUgPSBQcmVzZW50YXRvIHByaW1hDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcGxhbm5pbmdEYXRhX2ZlYXR1cmUgPSBQaWFuaWZpY2F6aW9uZSBkYXRpDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfc3VwZXJBY3Rpdml0aWVzX2ZlYXR1cmUgPSBBdHRpdml0XHUwMGUwIHByaW5jaXBhbGkNCi1fVUlfVGVhbVByb2ZpbGVfdGVhbVJvbGVzX2ZlYXR1cmUgPSBSdW9saSB0ZWFtDQotX1VJX1RlYW1Qcm9maWxlX3N1cGVyVGVhbV9mZWF0dXJlID0gVGVhbSBwcmluY2lwYWxlDQotX1VJX1RlYW1Qcm9maWxlX3N1YlRlYW1fZmVhdHVyZSA9IFRlYW0gc2Vjb25kYXJpbw0KLV9VSV9Sb2xlRGVzY3JpcHRvcl9Sb2xlX2ZlYXR1cmUgPSBSdW9sbw0KLV9VSV9Sb2xlRGVzY3JpcHRvcl9tb2RpZmllc19mZWF0dXJlID0gTW9kaWZpY2ENCi1fVUlfUm9sZURlc2NyaXB0b3JfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFJlc3BvbnNhYmlsZSBkaQ0KLV9VSV9Xb3JrT3JkZXJfbGlua1R5cGVfZmVhdHVyZSA9IFRpcG8gZGkgY29sbGVnYW1lbnRvDQotX1VJX1dvcmtPcmRlcl9wcmVkX2ZlYXR1cmUgPSBQcmVkDQotX1VJX1BsYW5uaW5nRGF0YV9zdGFydERhdGVfZmVhdHVyZSA9IERhdGEgZGkgaW5pemlvDQotX1VJX1BsYW5uaW5nRGF0YV9maW5pc2hEYXRlX2ZlYXR1cmUgPSBEYXRhIGRpIGZpbmUNCi1fVUlfUGxhbm5pbmdEYXRhX3JhbmtfZmVhdHVyZSA9IENsYXNzaWZpY2F6aW9uZQ0KLV9VSV9EZXNjcmlwdG9yX2lzU3luY2hyb25pemVkV2l0aFNvdXJjZV9mZWF0dXJlID0gXHUwMGM4IHNpbmNyb25penphdG8gY29uIGwnb3JpZ2luZQ0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFbnRyeVN0YXRlX2ZlYXR1cmUgPSBTdGF0byBpbmdyZXNzbyBhdHRpdml0XHUwMGUwDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUV4aXRTdGF0ZV9mZWF0dXJlID0gU3RhdG8gdXNjaXRhIGF0dGl2aXRcdTAwZTANCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0X2ZlYXR1cmUgPSBQcm9kb3R0byBkaSBsYXZvcm8NCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdGVkQnlfZmVhdHVyZSA9IEluZmx1ZW56YXRvIGRhDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RzX2ZlYXR1cmUgPSBJbmZsdWlzY2Ugc3UNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2RlbGl2ZXJhYmxlUGFydHNfZmVhdHVyZSA9IFBhcnRpIGRpc3RyaWJ1aWJpbGkNCi1fVUlfVGFza0Rlc2NyaXB0b3JfVGFza19mZWF0dXJlID0gT3BlcmF6aW9uZQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeV9mZWF0dXJlID0gRXNlY3V0b3JlIHNlY29uZGFyaW8NCi1fVUlfVGFza0Rlc2NyaXB0b3JfYXNzaXN0ZWRCeV9mZWF0dXJlID0gQXNzaXN0aXRvIGRhDQotX1VJX1Rhc2tEZXNjcmlwdG9yX2V4dGVybmFsSW5wdXRfZmVhdHVyZSA9IElucHV0IGVzdGVybm8NCi1fVUlfVGFza0Rlc2NyaXB0b3JfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSA9IElucHV0IG9iYmxpZ2F0b3Jpbw0KLV9VSV9UYXNrRGVzY3JpcHRvcl9vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBJbnB1dCBmYWNvbHRhdGl2bw0KLV9VSV9UYXNrRGVzY3JpcHRvcl9vdXRwdXRfZmVhdHVyZSA9IE91dHB1dA0KLV9VSV9UYXNrRGVzY3JpcHRvcl9wZXJmb3JtZWRQcmltYXJpbHlCeV9mZWF0dXJlID0gRXNlY3V0b3JlIHByaW1hcmlvDQotX1VJX1Rhc2tEZXNjcmlwdG9yX3NlbGVjdGVkU3RlcHNfZmVhdHVyZSA9IFBhc3NpIHNlbGV6aW9uYXRpDQotX1VJX0NvbXBvc2l0ZVJvbGVfYWdncmVnYXRlZFJvbGVzX2ZlYXR1cmUgPSBSdW9saSBhZ2dyZWdhdGkNCi1fVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3VzYWdlR3VpZGFuY2VfZmVhdHVyZSA9IEd1aWRhIGFsbCd1c28NCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBTY29wbw0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlID0gQWx0ZXJuYXRpdm8NCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9ob3d0b1N0YWZmX2ZlYXR1cmUgPSBIb3d0byBTdGFmZg0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9zY2FsZV9mZWF0dXJlID0gU2NhbGENCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdENoYXJhY3RlcmlzdGljc19mZWF0dXJlID0gQ2FyYXR0ZXJpc3RpY2hlIGRlbCBwcm9nZXR0bw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9yaXNrTGV2ZWxfZmVhdHVyZSA9IExpdmVsbG8gZGkgcmlzY2hpbw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9lc3RpbWF0aW5nVGVjaG5pcXVlX2ZlYXR1cmUgPSBWYWx1dGF6aW9uZSBkZWxsYSB0ZWNuaWNhDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RNZW1iZXJFeHBlcnRpc2VfZmVhdHVyZSA9IEVzcGVyaWVuemEgbWVtYnJvIGRlbCBwcm9nZXR0bw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlT2ZDb250cmFjdF9mZWF0dXJlID0gVGlwbyBkaSBjb250cmF0dG8NCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX2V4dGVybmFsSWRfZmVhdHVyZSA9IElEIGVzdGVybm8NCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3Njb3BlX2ZlYXR1cmUgPSBBbWJpdG8NCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3VzYWdlTm90ZXNfZmVhdHVyZSA9IE5vdGUgc3VsbCd1dGlsaXp6bw0KLV9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fcmVmaW5lZERlc2NyaXB0aW9uX2ZlYXR1cmUgPSBEZXNjcml6aW9uZSBwZXJmZXppb25hdGENCi1fVUlfUHJhY3RpY2Vfc3ViUHJhY3RpY2VzX2ZlYXR1cmUgPSBQcmF0aWNoZSBzZWNvbmRhcmllDQotX1VJX1ByYWN0aWNlX2NvbnRlbnRSZWZlcmVuY2VzX2ZlYXR1cmUgPSBSaWZlcmltZW50aSBjb250ZW51dG8NCi1fVUlfUHJhY3RpY2VfYWN0aXZpdHlSZWZlcmVuY2VzX2ZlYXR1cmUgPSBSaWZlcmltZW50aSBhdHRpdml0XHUwMGUwDQotX1VJX1N0YXRlX1dvcmtQcm9kdWN0X2ZlYXR1cmUgPSBQcm9kb3R0byBkaSBsYXZvcm8NCi1fVUlfU3RhdGVfUmVnaW9uX2ZlYXR1cmUgPSBSZWdpb25lDQotX1VJX1N0YXRlX3N1Ym1hY2hpbmVfZmVhdHVyZSA9IENvbXB1dGVyIHNlY29uZGFyaW8NCi1fVUlfVmVydGV4X2NvbnRhaW5lcl9mZWF0dXJlID0gQ29udGVuaXRvcmUNCi1fVUlfVmVydGV4X291dGdvaW5nX2ZlYXR1cmUgPSBJbiB1c2NpdGENCi1fVUlfVmVydGV4X2luY29taW5nX2ZlYXR1cmUgPSBJbiBlbnRyYXRhDQotX1VJX1JlZ2lvbl9WZXJ0ZXhfZmVhdHVyZSA9IFZlcnRpY2UNCi1fVUlfUmVnaW9uX1RyYW5zaXRpb25fZmVhdHVyZSA9IFRyYW5zaXppb25lDQotX1VJX1JlZ2lvbl9TdGF0ZV9mZWF0dXJlID0gU3RhdG8NCi1fVUlfUmVnaW9uX1N0YXRlTWFjaGluZV9mZWF0dXJlID0gQ29tcHV0ZXIgZGkgc3RhdG8NCi1fVUlfU3RhdGVNYWNoaW5lX1JlZ2lvbl9mZWF0dXJlID0gUmVnaW9uZQ0KLV9VSV9UcmFuc2l0aW9uX1dvcmtEZWZpbml0aW9uX2ZlYXR1cmUgPSBEZWZpbml6aW9uZSBsYXZvcm8NCi1fVUlfVHJhbnNpdGlvbl9jb250YWluZXJfZmVhdHVyZSA9IENvbnRlbml0b3JlDQotX1VJX1RyYW5zaXRpb25fc291cmNlX2ZlYXR1cmUgPSBPcmlnaW5lDQotX1VJX1RyYW5zaXRpb25fdGFyZ2V0X2ZlYXR1cmUgPSBEZXN0aW5hemlvbmUNCi1fVUlfRGlzY2lwbGluZV90YXNrc19mZWF0dXJlID0gT3BlcmF6aW9uaQ0KLV9VSV9EaXNjaXBsaW5lX3N1YmRpc2NpcGxpbmVfZmVhdHVyZSA9IERpc2NpcGxpbmEgc2Vjb25kYXJpYQ0KLV9VSV9EaXNjaXBsaW5lX3JlZmVyZW5jZVdvcmtmbG93c19mZWF0dXJlID0gRmx1c3NpIGRpIGxhdm9ybyBkaSByaWZlcmltZW50bw0KLV9VSV9Sb2xlU2V0X3JvbGVzX2ZlYXR1cmUgPSBSdW9saQ0KLV9VSV9Eb21haW5fd29ya1Byb2R1Y3RzX2ZlYXR1cmUgPSBQcm9kb3R0aSBkaSBsYXZvcm8NCi1fVUlfRG9tYWluX3N1YmRvbWFpbnNfZmVhdHVyZSA9IFNvdHRvZG9taW5pDQotX1VJX1dvcmtQcm9kdWN0VHlwZV93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFByb2RvdHRpIGRpIGxhdm9ybw0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSA9IERpc2NpcGxpbmUNCi1fVUlfVG9vbF90b29sTWVudG9yc19mZWF0dXJlID0gR3VpZGEgYWwgdG9vbA0KLV9VSV9Sb2xlU2V0R3JvdXBpbmdfcm9sZVNldHNfZmVhdHVyZSA9IEluc2llbWkgZGkgcnVvbGkNCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfY2F0ZWdvcml6ZWRFbGVtZW50c19mZWF0dXJlID0gRWxlbWVudGkgY2F0ZWdvcml6emF0aQ0KLV9VSV9DdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX2ZlYXR1cmUgPSBTb3R0b2NhdGVnb3JpZQ0KLV9VSV9EZWxpdmVyeVByb2Nlc3NfZWR1Y2F0aW9uTWF0ZXJpYWxzX2ZlYXR1cmUgPSBNYXRlcmlhbGUgZGlkYXR0aWNvDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc19jb21tdW5pY2F0aW9uc01hdGVyaWFsc19mZWF0dXJlID0gTWF0ZXJpYWxpIHBlciBsYSBjb211bmljYXppb25lDQotX1VJX1Byb2Nlc3NfaW5jbHVkZXNQYXR0ZXJuc19mZWF0dXJlID0gSW5jbHVkZSBtb2RlbGxpDQotX1VJX1Byb2Nlc3NfZGVmYXVsdENvbnRleHRfZmVhdHVyZSA9IENvbnRlc3RvIHByZWRlZmluaXRvDQotX1VJX1Byb2Nlc3NfdmFsaWRDb250ZXh0X2ZlYXR1cmUgPSBDb250ZXN0byB2YWxpZG8NCi1fVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfYmFzZWRPblByb2Nlc3Nlc19mZWF0dXJlID0gQmFzYXRvIHN1IHByb2Nlc3NpDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfaW50ZXJmYWNlc19mZWF0dXJlID0gSW50ZXJmYWNjZQ0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfZmVhdHVyZSA9IFByb2Nlc3NvDQotX1VJX1Byb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19mZWF0dXJlID0gRWxlbWVudGkgZGVsIHByb2Nlc3NvDQotX1VJX1Byb2Nlc3NQYWNrYWdlX2RpYWdyYW1zX2ZlYXR1cmUgPSBEaWFncmFtbWkNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uc19mZWF0dXJlID0gU3BlY2lmaWNoZSBpbnRlcmZhY2NpYQ0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZUlPX2ZlYXR1cmUgPSBJTyBpbnRlcmZhY2NpYQ0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9Qcm9jZXNzQ29tcG9uZW50X2ZlYXR1cmUgPSBDb21wb25lbnRlIHByb2Nlc3NvDQotX1VJX01ldGhvZFBsdWdpbl91c2VyQ2hhbmdlYWJsZV9mZWF0dXJlID0gTW9kaWZpY2FiaWxlIGRhbGwndXRlbnRlDQotX1VJX01ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19mZWF0dXJlID0gUGFjY2hldHRpIG1ldG9kbw0KLV9VSV9NZXRob2RQbHVnaW5fYmFzZXNfZmVhdHVyZSA9IEJhc2kNCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5VHlwZV9mZWF0dXJlID0gVGlwbyBkaSB2YXJpYWJpbGl0XHUwMGUwDQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUgPSBWYXJpYWJpbGl0XHUwMGUwIGJhc2F0YSBzdSBlbGVtZW50bw0KLV9VSV9NZXRob2RVbml0X2F1dGhvcnNfZmVhdHVyZSA9IEF1dG9yaQ0KLV9VSV9NZXRob2RVbml0X2NoYW5nZURhdGVfZmVhdHVyZSA9IERhdGEgbW9kaWZpY2ENCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEZXNjcmlwdGlvbl9mZWF0dXJlID0gRGVzY3JpemlvbmUgbW9kaWZpY2ENCi1fVUlfTWV0aG9kVW5pdF92ZXJzaW9uX2ZlYXR1cmUgPSBWZXJzaW9uZQ0KLV9VSV9NZXRob2RVbml0X2NvcHlyaWdodFN0YXRlbWVudF9mZWF0dXJlID0gSW5mb3JtYXRpdmEgc3VsIGNvcHlyaWdodA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBsdWdpblNlbGVjdGlvbl9mZWF0dXJlID0gU2VsZXppb25lIHBsdWctaW4gbWV0b2RvDQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fbWV0aG9kUGFja2FnZVNlbGVjdGlvbl9mZWF0dXJlID0gU2VsZXppb25lIHBhY2NoZXR0byBtZXRvZG8NCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9wcm9jZXNzVmlld3NfZmVhdHVyZSA9IFZpc3VhbGl6emF6aW9uaSBwcm9jZXNzbw0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2RlZmF1bHRWaWV3X2ZlYXR1cmUgPSBWaXN1YWxpenphemlvbmUgcHJlZGVmaW5pdGENCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9iYXNlQ29uZmlndXJhdGlvbnNfZmVhdHVyZSA9IENvbmZpZ3VyYXppb25pDQotX1VJX1Byb2Nlc3NGYW1pbHlfZGVsaXZlcnlQcm9jZXNzZXNfZmVhdHVyZSA9IFByb2Nlc3NpIGRpIHByb2R1emlvbmUNCi1fVUlfTWV0aG9kTGlicmFyeV9tZXRob2RQbHVnaW5zX2ZlYXR1cmUgPSBQbHVnLWluIGRlbCBtZXRvZG8NCi1fVUlfTWV0aG9kTGlicmFyeV9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnNfZmVhdHVyZSA9IENvbmZpZ3VyYXppb25pIHByZWRlZmluaXRlDQotX1VJX1Vua25vd25fZmVhdHVyZSA9IE5vbiBzcGVjaWZpY2F0bw0KLQ0KLV9VSV9Xb3JrT3JkZXJUeXBlX2ZpbmlzaFRvU3RhcnRfbGl0ZXJhbCA9IGZpbmlzaFRvU3RhcnQNCi1fVUlfV29ya09yZGVyVHlwZV9maW5pc2hUb0ZpbmlzaF9saXRlcmFsID0gZmluaXNoVG9GaW5pc2gNCi1fVUlfV29ya09yZGVyVHlwZV9zdGFydFRvU3RhcnRfbGl0ZXJhbCA9IHN0YXJ0VG9TdGFydA0KLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9GaW5pc2hfbGl0ZXJhbCA9IHN0YXJ0VG9GaW5pc2gNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2luaXRpYWxfbGl0ZXJhbCA9IGluaXppYWxlDQotX1VJX1BzZXVkb1N0YXRlS2luZF9qb2luX2xpdGVyYWwgPSB1bmlvbmUNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2ZvcmtfbGl0ZXJhbCA9IGZvcmsNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2p1bmN0aW9uX2xpdGVyYWwgPSBzb21tYQ0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfY2hvaWNlX2xpdGVyYWwgPSBzY2VsdGENCi1fVUlfUHNldWRvU3RhdGVLaW5kX2VudHJ5UG9pbnRfbGl0ZXJhbCA9IGVudHJ5UG9pbnQNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2V4aXRQb2ludF9saXRlcmFsID0gZXhpdFBvaW50DQotX1VJX1BzZXVkb1N0YXRlS2luZF90ZXJtaW5hdGVfbGl0ZXJhbCA9IHRlcm1pbmENCi1fVUlfVmFyaWFiaWxpdHlUeXBlX25hX2xpdGVyYWwgPSBuYQ0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfY29udHJpYnV0ZXNfbGl0ZXJhbCA9IGNvbnRyaWJ1aXNjZQ0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfZXh0ZW5kc19saXRlcmFsID0gZXN0ZW5kZQ0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfcmVwbGFjZXNfbGl0ZXJhbCA9IHNvc3RpdHVpc2NlDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9sb2NhbENvbnRyaWJ1dGlvbl9saXRlcmFsID0gbG9jYWxDb250cmlidXRpb24NCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsUmVwbGFjZW1lbnRfbGl0ZXJhbCA9IGxvY2FsUmVwbGFjZW1lbnQNCi1fVUlfQXJ0aWZhY3REZXNjcmlwdG9yX3R5cGUgPSBEZXNjcml0dG9yZSBhcnRlZmF0dG8NCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdG9yX3R5cGUgPSBEZXNjcml0dG9yZSBjb21wb25lbnRlIGRpc3RyaWJ1aWJpbGUNCi1fVUlfT3V0Y29tZURlc2NyaXB0b3JfdHlwZSA9IERlc2NyaXR0b3JlIHJpc3VsdGF0bw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5famEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5famEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2I3ZjFhYy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDEvcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1wbHVnaW5OYW1lID0gRU1GIFVNQSBFZGl0IFN1cHBvcnQNCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KLQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0ID0gezB9DQotX1VJX0NyZWF0ZUNoaWxkX3RleHQyID0gezF9IHswfQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MyA9IHsxfQ0KLV9VSV9DcmVhdGVDaGlsZF90b29sdGlwID0gezF9IFx1NmE1Zlx1ODBmZFx1MzA2ZVx1NGUwYlx1MzA2Ylx1NjViMFx1MzA1N1x1MzA0NCB7MH0gXHUzMDkyXHU3NTFmXHU2MjEwXHUzMDU5XHUzMDhiDQotX1VJX0NyZWF0ZUNoaWxkX2Rlc2NyaXB0aW9uID0gXHU5MDc4XHU2MjllXHUzMDU3XHUzMDVmIHsyfSBcdTMwNmUgezF9IFx1NmE1Zlx1ODBmZFx1MzA2Ylx1NWJmZVx1MzA1N1x1MzA2Nlx1MzBiZlx1MzBhNFx1MzBkN1x1MzA0YyB7MH0gXHUzMDZlXHU2NWIwXHUzMDU3XHUzMDQ0XHU1YjUwXHUzMDkyXHU3NTFmXHU2MjEwXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyDQotX1VJX0NyZWF0ZVNpYmxpbmdfZGVzY3JpcHRpb24gPSBcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNWYgezJ9IFx1MzA2Ylx1NWJmZVx1MzA1N1x1MzAwMVx1ODlhYVx1MzA2ZSB7MX0gXHU2YTVmXHU4MGZkXHUzMDZlXHU0ZTBiXHUzMDZiXHUzMDAxXHUzMGJmXHUzMGE0XHUzMGQ3XHUzMDRjIHswfSBcdTMwNmVcdTY1YjBcdTMwNTdcdTMwNDRcdTUxNDRcdTVmMWZcdTMwOTJcdTc1MWZcdTYyMTBcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDINCi0NCi1fVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uID0gezF9IFx1MzA2ZSB7MH0NCi0NCi1fVUlfQ2xhc3NpZmllcl90eXBlID0gXHU1MjA2XHU5ODVlXHU1YjUwDQotX1VJX1R5cGVfdHlwZSA9IFx1MzBiZlx1MzBhNFx1MzBkNw0KLV9VSV9FbGVtZW50X3R5cGUgPSBcdTg5ODFcdTdkMjANCi1fVUlfTmFtZWRFbGVtZW50X3R5cGUgPSBcdTU0MGRcdTUyNGRcdTRlZDhcdTMwNGRcdTg5ODFcdTdkMjANCi1fVUlfUGFja2FnZWFibGVFbGVtZW50X3R5cGUgPSBcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjhcdTUzZWZcdTgwZmRcdTg5ODFcdTdkMjANCi1fVUlfUGFja2FnZV90eXBlID0gXHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4DQotX1VJX05hbWVzcGFjZV90eXBlID0gXHU1NDBkXHU1MjRkXHU3YTdhXHU5NTkzDQotX1VJX01ldGhvZEVsZW1lbnRfdHlwZSA9IFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1ODk4MVx1N2QyMA0KLV9VSV9Db25zdHJhaW50X3R5cGUgPSBcdTUyMzZcdTdkMDQNCi1fVUlfQ29udGVudEVsZW1lbnRfdHlwZSA9IFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1ODk4MVx1N2QyMA0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSA9IFx1OGExOFx1OGZmMFx1NTNlZlx1ODBmZFx1MzA2YVx1ODk4MVx1N2QyMA0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fdHlwZSA9IFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzA2ZVx1OGFhY1x1NjYwZQ0KLV9VSV9TZWN0aW9uX3R5cGUgPSBcdTMwYmJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjMNCi1fVUlfUm9sZV90eXBlID0gXHUzMGVkXHUzMGZjXHUzMGViDQotX1VJX1dvcmtQcm9kdWN0X3R5cGUgPSBcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYzBcdTMwYWZcdTMwYzgNCi1fVUlfVGFza190eXBlID0gXHUzMGJmXHUzMGI5XHUzMGFmDQotX1VJX1dvcmtEZWZpbml0aW9uX3R5cGUgPSBcdTRmNWNcdTY5NmRcdTViOWFcdTdmYTkNCi1fVUlfU3RlcF90eXBlID0gXHUzMGI5XHUzMGM2XHUzMGMzXHUzMGQ3DQotX1VJX0d1aWRhbmNlX3R5cGUgPSBcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjkNCi1fVUlfQXJ0aWZhY3RfdHlwZSA9IFx1NjIxMFx1Njc5Y1x1NzI2OQ0KLV9VSV9EZWxpdmVyYWJsZV90eXBlID0gXHU3ZDBkXHU1MTY1XHU3MjY5DQotX1VJX091dGNvbWVfdHlwZSA9IFx1N2Q1MFx1Njc5Yw0KLV9VSV9NZXRob2RQYWNrYWdlX3R5cGUgPSBcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjgNCi1fVUlfQ29udGVudFBhY2thZ2VfdHlwZSA9IFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzBmYlx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOA0KLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3R5cGUgPSBcdTYyMTBcdTY3OWNcdTcyNjlcdTMwNmVcdThhYWNcdTY2MGUNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl90eXBlID0gXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHUzMDZlXHU4YWFjXHU2NjBlDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fdHlwZSA9IFx1N2QwZFx1NTE2NVx1NzI2OVx1MzA2ZVx1OGFhY1x1NjYwZQ0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fdHlwZSA9IFx1MzBlZFx1MzBmY1x1MzBlYlx1MzA2ZVx1OGFhY1x1NjYwZQ0KLV9VSV9UYXNrRGVzY3JpcHRpb25fdHlwZSA9IFx1MzBiZlx1MzBiOVx1MzBhZlx1MzA2ZVx1OGFhY1x1NjYwZQ0KLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX3R5cGUgPSBcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjlcdTMwNmVcdThhYWNcdTY2MGUNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl90eXBlID0gXHUzMGQ3XHUzMGU5XHUzMGFmXHUzMGM2XHUzMGEzXHUzMGI5XHUzMDZlXHU4YWFjXHU2NjBlDQotX1VJX1BvaW50X3R5cGUgPSBcdTMwZGRcdTMwYTRcdTMwZjNcdTMwYzgNCi1fVUlfR3JhcGhFbGVtZW50X3R5cGUgPSBcdTMwYjBcdTMwZTlcdTMwZDVcdTg5ODFcdTdkMjANCi1fVUlfRGlhZ3JhbUVsZW1lbnRfdHlwZSA9IFx1MzBjMFx1MzBhNFx1MzBhMlx1MzBiMFx1MzBlOVx1MzBlMFx1ODk4MVx1N2QyMA0KLV9VSV9EaWFncmFtTGlua190eXBlID0gXHUzMGMwXHUzMGE0XHUzMGEyXHUzMGIwXHUzMGU5XHUzMGUwXHUzMGZiXHUzMGVhXHUzMGYzXHUzMGFmDQotX1VJX0dyYXBoQ29ubmVjdG9yX3R5cGUgPSBcdTMwYjBcdTMwZTlcdTMwZDVcdTMwZmJcdTMwYjNcdTMwY2RcdTMwYWZcdTMwYmZcdTMwZmMNCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gXHUzMGJiXHUzMGRlXHUzMGYzXHUzMGM2XHUzMGEzXHUzMGMzXHUzMGFmXHUzMGZiXHUzMGUyXHUzMGM3XHUzMGViXHUzMGZiXHUzMGQ2XHUzMGVhXHUzMGMzXHUzMGI4DQotX1VJX0RpbWVuc2lvbl90eXBlID0gXHUzMGM3XHUzMGEzXHUzMGUxXHUzMGYzXHUzMGI3XHUzMGU3XHUzMGYzDQotX1VJX1JlZmVyZW5jZV90eXBlID0gXHU1M2MyXHU3MTY3DQotX1VJX1Byb3BlcnR5X3R5cGUgPSBcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwZmMNCi1fVUlfR3JhcGhFZGdlX3R5cGUgPSBcdTMwYjBcdTMwZTlcdTMwZDVcdTMwZmJcdTMwYThcdTMwYzNcdTMwYjgNCi1fVUlfRGlhZ3JhbV90eXBlID0gXHUzMGMwXHUzMGE0XHUzMGEyXHUzMGIwXHUzMGU5XHUzMGUwDQotX1VJX0dyYXBoTm9kZV90eXBlID0gXHUzMGIwXHUzMGU5XHUzMGQ1XHUzMGZiXHUzMGNlXHUzMGZjXHUzMGM5DQotX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGUgPSBcdTUzNThcdTdkMTRcdTMwYmJcdTMwZGVcdTMwZjNcdTMwYzZcdTMwYTNcdTMwYzNcdTMwYWZcdTMwZmJcdTMwZTJcdTMwYzdcdTMwZWJcdTg5ODFcdTdkMjANCi1fVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gVU1BIFx1MzBiYlx1MzBkZVx1MzBmM1x1MzBjNlx1MzBhM1x1MzBjM1x1MzBhZlx1MzBmYlx1MzBlMlx1MzBjN1x1MzBlYlx1MzBmYlx1MzBkNlx1MzBlYVx1MzBjM1x1MzBiOA0KLV9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gXHUzMGIzXHUzMGEyXHUzMGZiXHUzMGJiXHUzMGRlXHUzMGYzXHUzMGM2XHUzMGEzXHUzMGMzXHUzMGFmXHUzMGZiXHUzMGUyXHUzMGM3XHUzMGViXHUzMGZiXHUzMGQ2XHUzMGVhXHUzMGMzXHUzMGI4DQotX1VJX0xlYWZFbGVtZW50X3R5cGUgPSBcdTMwZWFcdTMwZmNcdTMwZDVcdTg5ODFcdTdkMjANCi1fVUlfVGV4dEVsZW1lbnRfdHlwZSA9IFx1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1ODk4MVx1N2QyMA0KLV9VSV9JbWFnZV90eXBlID0gXHU3NTNiXHU1MGNmDQotX1VJX0dyYXBoaWNQcmltaXRpdmVfdHlwZSA9IFx1MzBiMFx1MzBlOVx1MzBkNVx1MzBhM1x1MzBjM1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlYVx1MzBkZlx1MzBjNlx1MzBhM1x1MzBkNg0KLV9VSV9Qb2x5bGluZV90eXBlID0gXHU2Mjk4XHUzMDhjXHU3ZGRhDQotX1VJX0VsbGlwc2VfdHlwZSA9IFx1Njk1NVx1NTE4Ng0KLV9VSV9BY3Rpdml0eV90eXBlID0gXHUzMGEyXHUzMGFmXHUzMGM2XHUzMGEzXHUzMGQzXHUzMGM2XHUzMGEzXHUzMGZjDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X3R5cGUgPSBcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZmJcdTMwZDZcdTMwZWNcdTMwZmNcdTMwYWZcdTMwYzBcdTMwYTZcdTMwZjNcdTMwZmJcdTMwYThcdTMwZWNcdTMwZTFcdTMwZjNcdTMwYzgNCi1fVUlfQnJlYWtkb3duRWxlbWVudF90eXBlID0gXHUzMGQ2XHUzMGVjXHUzMGZjXHUzMGFmXHUzMGMwXHUzMGE2XHUzMGYzXHUzMGZiXHUzMGE4XHUzMGVjXHUzMGUxXHUzMGYzXHUzMGM4DQotX1VJX01pbGVzdG9uZV90eXBlID0gXHUzMGRlXHUzMGE0XHUzMGViXHUzMGI5XHUzMGM4XHUzMGZjXHUzMGYzDQotX1VJX0l0ZXJhdGlvbl90eXBlID0gXHU1M2NkXHU1ZmE5DQotX1VJX1BoYXNlX3R5cGUgPSBcdTMwZDVcdTMwYTdcdTMwZmNcdTMwYmENCi1fVUlfVGVhbVByb2ZpbGVfdHlwZSA9IFx1MzBjMVx1MzBmY1x1MzBlMFx1MzBmYlx1MzBkN1x1MzBlZFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYg0KLV9VSV9Sb2xlRGVzY3JpcHRvcl90eXBlID0gXHUzMGVkXHUzMGZjXHUzMGViXHU4YTE4XHU4ZmYwXHU1YjUwDQotX1VJX1dvcmtPcmRlcl90eXBlID0gXHU0ZjVjXHU2OTZkXHU2MzA3XHU3OTNhXHU2NmY4DQotX1VJX1Byb2Nlc3NFbGVtZW50X3R5cGUgPSBcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTg5ODFcdTdkMjANCi1fVUlfUGxhbm5pbmdEYXRhX3R5cGUgPSBcdThhMDhcdTc1M2JcdTMwYzdcdTMwZmNcdTMwYmYNCi1fVUlfRGVzY3JpcHRvcl90eXBlID0gXHU4YTE4XHU4ZmYwXHU1YjUwDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlID0gXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU4YTE4XHU4ZmYwXHU1YjUwDQotX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUgPSBcdTMwYmZcdTMwYjlcdTMwYWZcdThhMThcdThmZjBcdTViNTANCi1fVUlfQ29tcG9zaXRlUm9sZV90eXBlID0gXHUzMGIzXHUzMGYzXHUzMGRkXHUzMGI4XHUzMGMzXHUzMGM4XHUzMGZiXHUzMGVkXHUzMGZjXHUzMGViDQotX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl90eXBlID0gXHUzMGQ2XHUzMGVjXHUzMGZjXHUzMGFmXHUzMGMwXHUzMGE2XHUzMGYzXHUzMGZiXHUzMGE4XHUzMGVjXHUzMGUxXHUzMGYzXHUzMGM4XHUzMDZlXHU4YWFjXHU2NjBlDQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fdHlwZSA9IFx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1MzA2ZVx1OGFhY1x1NjYwZQ0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gXHUzMGM3XHUzMGVhXHUzMGQwXHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDZlXHU4YWFjXHU2NjBlDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMDZlXHU4YWFjXHU2NjBlDQotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlID0gXHU4YTE4XHU4ZmYwXHU1YjUwXHUzMDZlXHU4YWFjXHU2NjBlDQotX1VJX0NvbmNlcHRfdHlwZSA9IFx1Njk4Mlx1NWZmNQ0KLV9VSV9DaGVja2xpc3RfdHlwZSA9IFx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1MzBlYVx1MzBiOVx1MzBjOA0KLV9VSV9FeGFtcGxlX3R5cGUgPSBcdTRmOGINCi1fVUlfR3VpZGVsaW5lX3R5cGUgPSBcdTMwYWNcdTMwYTRcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZjMNCi1fVUlfUmVwb3J0X3R5cGUgPSBcdTMwZWNcdTMwZGRcdTMwZmNcdTMwYzgNCi1fVUlfVGVtcGxhdGVfdHlwZSA9IFx1MzBjNlx1MzBmM1x1MzBkN1x1MzBlY1x1MzBmY1x1MzBjOA0KLV9VSV9TdXBwb3J0aW5nTWF0ZXJpYWxfdHlwZSA9IFx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1OGNjN1x1NjU5OQ0KLV9VSV9Ub29sTWVudG9yX3R5cGUgPSBcdTMwYzRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwZTFcdTMwZjNcdTMwYmZcdTMwZmMNCi1fVUlfV2hpdGVwYXBlcl90eXBlID0gXHUzMGRiXHUzMGVmXHUzMGE0XHUzMGM4XHUzMGZiXHUzMGRhXHUzMGZjXHUzMGQxXHUzMGZjDQotX1VJX1Rlcm1EZWZpbml0aW9uX3R5cGUgPSBcdTc1MjhcdThhOWVcdTViOWFcdTdmYTkNCi1fVUlfUHJhY3RpY2VfdHlwZSA9IFx1MzBkN1x1MzBlOVx1MzBhZlx1MzBjNlx1MzBhM1x1MzBiOQ0KLV9VSV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdHlwZSA9IFx1ODk4Ylx1N2E0ZFx1MzA4Mlx1MzA4YVx1ODAwM1x1NjE2ZVx1NGU4Ylx1OTgwNQ0KLV9VSV9SZXVzYWJsZUFzc2V0X3R5cGUgPSBcdTUxOGRcdTUyMjlcdTc1MjhcdTUzZWZcdTgwZmRcdTMwNmFcdTMwYTJcdTMwYmJcdTMwYzNcdTMwYzgNCi1fVUlfU3RhdGVfdHlwZSA9IFx1NzJiNlx1NjE0Yg0KLV9VSV9WZXJ0ZXhfdHlwZSA9IFx1OTgwMlx1NzBiOQ0KLV9VSV9SZWdpb25fdHlwZSA9IFx1OTgxOFx1NTdkZg0KLV9VSV9TdGF0ZU1hY2hpbmVfdHlwZSA9IFx1NzJiNlx1NjE0Ylx1MzBkZVx1MzBiN1x1MzBmMw0KLV9VSV9UcmFuc2l0aW9uX3R5cGUgPSBcdTkwNzdcdTc5ZmINCi1fVUlfUHNldWRvU3RhdGVfdHlwZSA9IFx1NzU5MVx1NGYzY1x1NzJiNlx1NjE0Yg0KLV9VSV9EaXNjaXBsaW5lX3R5cGUgPSBcdTRmNWNcdTY5NmRcdTUyMDZcdTkxY2UNCi1fVUlfQ29udGVudENhdGVnb3J5X3R5cGUgPSBcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwZmJcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmMNCi1fVUlfUm9sZVNldF90eXBlID0gXHUzMGVkXHUzMGZjXHUzMGViXHUzMGZiXHUzMGJiXHUzMGMzXHUzMGM4DQotX1VJX0RvbWFpbl90eXBlID0gXHUzMGM5XHUzMGUxXHUzMGE0XHUzMGYzDQotX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlID0gXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4XHU5ODVlDQotX1VJX0Rpc2NpcGxpbmVHcm91cGluZ190eXBlID0gXHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3DQotX1VJX1Rvb2xfdHlwZSA9IFx1MzBjNFx1MzBmY1x1MzBlYg0KLV9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSA9IFx1MzBlZFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBiYlx1MzBjM1x1MzBjOFx1MzBmYlx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkNw0KLV9VSV9DdXN0b21DYXRlZ29yeV90eXBlID0gXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGZiXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc190eXBlID0gXHUzMGM3XHUzMGVhXHUzMGQwXHUzMGVhXHUzMGZjXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5DQotX1VJX1Byb2Nlc3NfdHlwZSA9IFx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOQ0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybl90eXBlID0gXHUzMGIxXHUzMGZjXHUzMGQxXHUzMGQzXHUzMGVhXHUzMGM2XHUzMGEzXHUzMGZjXHUzMGZiXHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzDQotX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX3R5cGUgPSBcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdThhMDhcdTc1M2JcdTMwYzZcdTMwZjNcdTMwZDdcdTMwZWNcdTMwZmNcdTMwYzgNCi1fVUlfUm9hZG1hcF90eXBlID0gXHUzMGVkXHUzMGZjXHUzMGM5XHUzMGRlXHUzMGMzXHUzMGQ3DQotX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSA9IFx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzBmYlx1MzBiM1x1MzBmM1x1MzBkZFx1MzBmY1x1MzBjZFx1MzBmM1x1MzBjOA0KLV9VSV9Qcm9jZXNzUGFja2FnZV90eXBlID0gXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMGZiXHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4DQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfdHlwZSA9IFx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1MzBmYlx1MzBiM1x1MzBmM1x1MzBkZFx1MzBmY1x1MzBjZFx1MzBmM1x1MzBjOFx1MzBmYlx1MzBhNFx1MzBmM1x1MzBiZlx1MzBmY1x1MzBkNVx1MzBhN1x1MzBmY1x1MzBiOQ0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl90eXBlID0gXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMGZiXHUzMGIzXHUzMGYzXHUzMGRkXHUzMGZjXHUzMGNkXHUzMGYzXHUzMGM4XHU4YTE4XHU4ZmYwXHU1YjUwDQotX1VJX01ldGhvZFBsdWdpbl90eXBlID0gXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMGZiXHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzDQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlID0gXHU1OTFhXHU2OWQ4XHU2MDI3XHU4OTgxXHU3ZDIwDQotX1VJX01ldGhvZFVuaXRfdHlwZSA9IFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1NTM1OFx1NGY0ZA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUgPSBcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTY5Y2JcdTYyMTANCi1fVUlfUHJvY2Vzc0ZhbWlseV90eXBlID0gXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMGZiXHUzMGQ1XHUzMGExXHUzMGRmXHUzMGVhXHUzMGZjDQotX1VJX01ldGhvZExpYnJhcnlfdHlwZSA9IFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzBmYw0KLV9VSV9Vbmtub3duX3R5cGUgPSBcdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzgNCi0NCi1fVUlfVW5rbm93bl9kYXRhdHlwZT0gXHU1MDI0DQotDQotX1VJX05hbWVkRWxlbWVudF9uYW1lX2ZlYXR1cmUgPSBcdTU0MGRcdTUyNGQNCi1fVUlfTWV0aG9kRWxlbWVudF9ndWlkX2ZlYXR1cmUgPSBHdWlkDQotX1VJX01ldGhvZEVsZW1lbnRfYnJpZWZEZXNjcmlwdGlvbl9mZWF0dXJlID0gXHU4OTgxXHU2NWU4DQotX1VJX01ldGhvZEVsZW1lbnRfb3duZWRSdWxlc19mZWF0dXJlID0gXHU2MjQwXHU2NzA5XHUzMDU1XHUzMDhjXHUzMDVmXHUzMGViXHUzMGZjXHUzMGViDQotX1VJX01ldGhvZEVsZW1lbnRfc3VwcHJlc3NlZF9mZWF0dXJlID0gXHU2MjkxXHU1MjM2DQotX1VJX01ldGhvZEVsZW1lbnRfb3JkZXJpbmdHdWlkZV9mZWF0dXJlID0gXHU2MzA3XHU3OTNhXHU2NmY4XHUzMGFjXHUzMGE0XHUzMGM5DQotX1VJX0NvbnN0cmFpbnRfYm9keV9mZWF0dXJlID0gXHU2NzJjXHU0ZjUzDQotX1VJX0NvbnRlbnRFbGVtZW50X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSA9IFx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1OGNjN1x1NjU5OQ0KLV9VSV9Db250ZW50RWxlbWVudF9jb25jZXB0c0FuZFBhcGVyc19mZWF0dXJlID0gXHU2OTgyXHU1ZmY1XHUzMDY4XHU2NTg3XHU2NmY4DQotX1VJX0NvbnRlbnRFbGVtZW50X2NoZWNrbGlzdHNfZmVhdHVyZSA9IFx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1MzBlYVx1MzBiOVx1MzBjOA0KLV9VSV9Db250ZW50RWxlbWVudF9ndWlkZWxpbmVzX2ZlYXR1cmUgPSBcdTMwYWNcdTMwYTRcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZjMNCi1fVUlfQ29udGVudEVsZW1lbnRfZXhhbXBsZXNfZmVhdHVyZSA9IFx1NGY4Yg0KLV9VSV9Db250ZW50RWxlbWVudF9hc3NldHNfZmVhdHVyZSA9IFx1MzBhMlx1MzBiYlx1MzBjM1x1MzBjOA0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uTmFtZV9mZWF0dXJlID0gXHU4ODY4XHU3OTNhXHU1NDBkDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fZmVhdHVyZSA9IFx1ODg2OFx1NzkzYQ0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfc2hhcGVpY29uX2ZlYXR1cmUgPSBcdTVmNjJcdTcyYjZcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjMNCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X25vZGVpY29uX2ZlYXR1cmUgPSBcdTMwY2VcdTMwZmNcdTMwYzlcdTMwZmJcdTMwYTJcdTMwYTRcdTMwYjNcdTMwZjMNCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX21haW5EZXNjcmlwdGlvbl9mZWF0dXJlID0gXHU4YWFjXHU2NjBlDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19mZWF0dXJlID0gXHUzMGJiXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9rZXlDb25zaWRlcmF0aW9uc19mZWF0dXJlID0gXHU0ZTNiXHUzMDZhXHU4MDAzXHU2MTZlXHU0ZThiXHU5ODA1DQotX1VJX1NlY3Rpb25fc2VjdGlvbk5hbWVfZmVhdHVyZSA9IFx1MzBiYlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmM1x1NTQwZA0KLV9VSV9TZWN0aW9uX3NlY3Rpb25EZXNjcmlwdGlvbl9mZWF0dXJlID0gXHUzMGJiXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHU4YWFjXHU2NjBlDQotX1VJX1NlY3Rpb25fc3ViU2VjdGlvbnNfZmVhdHVyZSA9IFx1MzBiNVx1MzBkNlx1MzBiYlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmMw0KLV9VSV9TZWN0aW9uX3ByZWRlY2Vzc29yX2ZlYXR1cmUgPSBcdTUxNDhcdTg4NGNcdTMwYmZcdTMwYjlcdTMwYWYNCi1fVUlfUm9sZV9tb2RpZmllc19mZWF0dXJlID0gXHU1OTA5XHU2NmY0DQotX1VJX1JvbGVfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFx1NjJjNVx1NWY1Mw0KLV9VSV9Xb3JrUHJvZHVjdF9yZXBvcnRzX2ZlYXR1cmUgPSBcdTMwZWNcdTMwZGRcdTMwZmNcdTMwYzgNCi1fVUlfV29ya1Byb2R1Y3RfdGVtcGxhdGVzX2ZlYXR1cmUgPSBcdTMwYzZcdTMwZjNcdTMwZDdcdTMwZWNcdTMwZmNcdTMwYzgNCi1fVUlfV29ya1Byb2R1Y3RfdG9vbE1lbnRvcnNfZmVhdHVyZSA9IFx1MzBjNFx1MzBmY1x1MzBlYlx1MzBmYlx1MzBlMVx1MzBmM1x1MzBiZlx1MzBmYw0KLV9VSV9Xb3JrUHJvZHVjdF9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IFx1ODk4Ylx1N2E0ZFx1MzA4Mlx1MzA4YVx1ODAwM1x1NjE2ZVx1NGU4Ylx1OTgwNQ0KLV9VSV9UYXNrX3BlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBcdTViOWZcdTg4NGNcdTgwMDUNCi1fVUlfVGFza19tYW5kYXRvcnlJbnB1dF9mZWF0dXJlID0gXHU1ZmM1XHU5ODA4XHU1MTY1XHU1MjliDQotX1VJX1Rhc2tfb3V0cHV0X2ZlYXR1cmUgPSBcdTUxZmFcdTUyOWINCi1fVUlfVGFza19hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeV9mZWF0dXJlID0gXHU4ZmZkXHU1MmEwXHU1YjlmXHU4ODRjXHU4MDA1DQotX1VJX1Rhc2tfb3B0aW9uYWxJbnB1dF9mZWF0dXJlID0gXHUzMGFhXHUzMGQ3XHUzMGI3XHUzMGU3XHUzMGYzXHU1MTY1XHU1MjliDQotX1VJX1Rhc2tfc3RlcHNfZmVhdHVyZSA9IFx1MzBiOVx1MzBjNlx1MzBjM1x1MzBkNw0KLV9VSV9UYXNrX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBcdTMwYzRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwZTFcdTMwZjNcdTMwYmZcdTMwZmMNCi1fVUlfVGFza19lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IFx1ODk4Ylx1N2E0ZFx1MzA4Mlx1MzA4YVx1ODAwM1x1NjE2ZVx1NGU4Ylx1OTgwNQ0KLV9VSV9Xb3JrRGVmaW5pdGlvbl9wcmVjb25kaXRpb25fZmVhdHVyZSA9IFx1NGU4Ylx1NTI0ZFx1Njc2MVx1NGVmNg0KLV9VSV9Xb3JrRGVmaW5pdGlvbl9wb3N0Y29uZGl0aW9uX2ZlYXR1cmUgPSBcdTRlOGJcdTVmOGNcdTY3NjFcdTRlZjYNCi1fVUlfQXJ0aWZhY3RfY29udGFpbmVyQXJ0aWZhY3RfZmVhdHVyZSA9IFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzBmY1x1NjIxMFx1Njc5Y1x1NzI2OQ0KLV9VSV9BcnRpZmFjdF9jb250YWluZWRBcnRpZmFjdHNfZmVhdHVyZSA9IFx1NTQyYlx1MzA3ZVx1MzA4Y1x1MzA4Ylx1NjIxMFx1Njc5Y1x1NzI2OQ0KLV9VSV9EZWxpdmVyYWJsZV9kZWxpdmVyZWRXb3JrUHJvZHVjdHNfZmVhdHVyZSA9IFx1N2QwZFx1NTE2NVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLV9VSV9NZXRob2RQYWNrYWdlX2dsb2JhbF9mZWF0dXJlID0gXHUzMGIwXHUzMGVkXHUzMGZjXHUzMGQwXHUzMGViDQotX1VJX01ldGhvZFBhY2thZ2VfcmV1c2VkUGFja2FnZXNfZmVhdHVyZSA9IFx1NTE4ZFx1NTIyOVx1NzUyOFx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOA0KLV9VSV9NZXRob2RQYWNrYWdlX3BhcmVudFBhY2thZ2VfZmVhdHVyZSA9IFx1ODlhYVx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOA0KLV9VSV9NZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfZmVhdHVyZSA9IFx1NWI1MFx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOA0KLV9VSV9Db250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfZmVhdHVyZSA9IFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1ODk4MVx1N2QyMA0KLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX2JyaWVmT3V0bGluZV9mZWF0dXJlID0gXHU2OTgyXHU4OTgxDQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25PcHRpb25zX2ZlYXR1cmUgPSBcdTg4NjhcdTc5M2FcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjMNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBcdTU5MTZcdTkwZTggSUQNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBcdTc2ZWVcdTc2ODQNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9pbXBhY3RPZk5vdEhhdmluZ19mZWF0dXJlID0gXHUzMDZhXHUzMDQ0XHU1ODM0XHU1NDA4XHUzMDZlXHU1ZjcxXHU5N2ZmDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcmVhc29uc0Zvck5vdE5lZWRpbmdfZmVhdHVyZSA9IFx1NWZjNVx1ODk4MVx1MzA2ZVx1MzA2YVx1MzA0NFx1NzQwNlx1NzUzMQ0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX2V4dGVybmFsRGVzY3JpcHRpb25fZmVhdHVyZSA9IFx1NTkxNlx1OTBlOFx1OGExOFx1OGZmMA0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3BhY2thZ2luZ0d1aWRhbmNlX2ZlYXR1cmUgPSBcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjhcdTUzMTZcdTMwNmVcdTMwYWNcdTMwYTRcdTMwYzBcdTMwZjNcdTMwYjkNCi1fVUlfUm9sZURlc2NyaXB0aW9uX3NraWxsc19mZWF0dXJlID0gXHUzMGI5XHUzMGFkXHUzMGViDQotX1VJX1JvbGVEZXNjcmlwdGlvbl9hc3NpZ25tZW50QXBwcm9hY2hlc19mZWF0dXJlID0gXHU1MjcyXHUzMDhhXHU1ZjUzXHUzMDY2XHU2NWI5XHU2Y2Q1DQotX1VJX1JvbGVEZXNjcmlwdGlvbl9zeW5vbnltc19mZWF0dXJlID0gXHU1NDBjXHU3ZmE5XHU4YTllDQotX1VJX1Rhc2tEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBcdTc2ZWVcdTc2ODQNCi1fVUlfVGFza0Rlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlID0gXHU0ZWUzXHU2ODQ4DQotX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fYXR0YWNobWVudHNfZmVhdHVyZSA9IFx1NmRmYlx1NGVkOA0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FkZGl0aW9uYWxJbmZvX2ZlYXR1cmUgPSBcdThmZmRcdTUyYTBcdTYwYzVcdTU4MzENCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9wcm9ibGVtX2ZlYXR1cmUgPSBcdTU1NGZcdTk4NGMNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9iYWNrZ3JvdW5kX2ZlYXR1cmUgPSBcdTgwY2NcdTY2NmYNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9nb2Fsc19mZWF0dXJlID0gXHU3NmVlXHU2YTE5DQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYXBwbGljYXRpb25fZmVhdHVyZSA9IFx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmMw0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2xldmVsc09mQWRvcHRpb25fZmVhdHVyZSA9IFx1NjNhMVx1NzUyOFx1MzA2ZVx1MzBlY1x1MzBkOVx1MzBlYg0KLV9VSV9Qb2ludF94X2ZlYXR1cmUgPSBYDQotX1VJX1BvaW50X3lfZmVhdHVyZSA9IFkNCi1fVUlfR3JhcGhFbGVtZW50X3Bvc2l0aW9uX2ZlYXR1cmUgPSBcdTRmNGRcdTdmNmUNCi1fVUlfR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9mZWF0dXJlID0gXHU1NDJiXHUzMDdlXHUzMDhjXHUzMDhiDQotX1VJX0dyYXBoRWxlbWVudF9saW5rX2ZlYXR1cmUgPSBcdTMwZWFcdTMwZjNcdTMwYWYNCi1fVUlfR3JhcGhFbGVtZW50X2FuY2hvcmFnZV9mZWF0dXJlID0gQW5jaG9yYWdlDQotX1VJX0dyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX2ZlYXR1cmUgPSBcdTMwYmJcdTMwZGVcdTMwZjNcdTMwYzZcdTMwYTNcdTMwYzNcdTMwYWZcdTMwZmJcdTMwZTJcdTMwYzdcdTMwZWINCi1fVUlfRGlhZ3JhbUVsZW1lbnRfaXNWaXNpYmxlX2ZlYXR1cmUgPSBcdTUzZWZcdTg5OTYNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfY29udGFpbmVyX2ZlYXR1cmUgPSBcdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2FcdTMwZmMNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcmVmZXJlbmNlX2ZlYXR1cmUgPSBcdTUzYzJcdTcxNjcNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcHJvcGVydHlfZmVhdHVyZSA9IFx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzBmYw0KLV9VSV9EaWFncmFtTGlua196b29tX2ZlYXR1cmUgPSBcdTMwYmFcdTMwZmNcdTMwZTANCi1fVUlfRGlhZ3JhbUxpbmtfdmlld3BvcnRfZmVhdHVyZSA9IFx1ODg2OFx1NzkzYVx1N2E5Mw0KLV9VSV9EaWFncmFtTGlua19ncmFwaEVsZW1lbnRfZmVhdHVyZSA9IFx1MzBiMFx1MzBlOVx1MzBkNVx1ODk4MVx1N2QyMA0KLV9VSV9EaWFncmFtTGlua19kaWFncmFtX2ZlYXR1cmUgPSBcdTMwYzBcdTMwYTRcdTMwYTJcdTMwYjBcdTMwZTlcdTMwZTANCi1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBcdTMwYjBcdTMwZTlcdTMwZDVcdTg5ODFcdTdkMjANCi1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFZGdlX2ZlYXR1cmUgPSBcdTMwYjBcdTMwZTlcdTMwZDVcdTMwZmJcdTMwYThcdTMwYzNcdTMwYjgNCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9wcmVzZW50YXRpb25fZmVhdHVyZSA9IFx1ODg2OFx1NzkzYQ0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gXHUzMGIwXHUzMGU5XHUzMGQ1XHU4OTgxXHU3ZDIwDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZGlhZ3JhbV9mZWF0dXJlID0gXHUzMGMwXHUzMGE0XHUzMGEyXHUzMGIwXHUzMGU5XHUzMGUwDQotX1VJX0RpbWVuc2lvbl93aWR0aF9mZWF0dXJlID0gXHU1ZTQ1DQotX1VJX0RpbWVuc2lvbl9oZWlnaHRfZmVhdHVyZSA9IFx1OWFkOFx1MzA1NQ0KLV9VSV9SZWZlcmVuY2VfaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb25fZmVhdHVyZSA9IFx1NTAwYlx1MzAwNVx1MzA2ZVx1ODg2OFx1NzkzYQ0KLV9VSV9SZWZlcmVuY2VfcmVmZXJlbmNlZF9mZWF0dXJlID0gXHU1M2MyXHU3MTY3DQotX1VJX1Byb3BlcnR5X2tleV9mZWF0dXJlID0gXHUzMGFkXHUzMGZjDQotX1VJX1Byb3BlcnR5X3ZhbHVlX2ZlYXR1cmUgPSBcdTUwMjQNCi1fVUlfR3JhcGhFZGdlX2FuY2hvcl9mZWF0dXJlID0gXHUzMGEyXHUzMGYzXHUzMGFiXHUzMGZjDQotX1VJX0dyYXBoRWRnZV93YXlwb2ludHNfZmVhdHVyZSA9IFx1NGUyZFx1OTU5M1x1NzBiOQ0KLV9VSV9EaWFncmFtX3pvb21fZmVhdHVyZSA9IFx1MzBiYVx1MzBmY1x1MzBlMA0KLV9VSV9EaWFncmFtX3ZpZXdwb2ludF9mZWF0dXJlID0gXHU4OTk2XHU3MGI5DQotX1VJX0RpYWdyYW1fZGlhZ3JhbUxpbmtfZmVhdHVyZSA9IFx1MzBjMFx1MzBhNFx1MzBhMlx1MzBiMFx1MzBlOVx1MzBlMFx1MzBmYlx1MzBlYVx1MzBmM1x1MzBhZg0KLV9VSV9EaWFncmFtX25hbWVzcGFjZV9mZWF0dXJlID0gXHU1NDBkXHU1MjRkXHU3YTdhXHU5NTkzDQotX1VJX0dyYXBoTm9kZV9zaXplX2ZlYXR1cmUgPSBcdTMwYjVcdTMwYTRcdTMwYmENCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZUluZm9fZmVhdHVyZSA9IFx1MzBiZlx1MzBhNFx1MzBkN1x1NjBjNVx1NTgzMQ0KLV9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IFx1ODk4MVx1N2QyMA0KLV9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUgPSBcdTg5ODFcdTdkMjANCi1fVUlfVGV4dEVsZW1lbnRfdGV4dF9mZWF0dXJlID0gXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4DQotX1VJX0ltYWdlX3VyaV9mZWF0dXJlID0gVVJJDQotX1VJX0ltYWdlX21pbWVUeXBlX2ZlYXR1cmUgPSBNSU1FIFx1MzBiZlx1MzBhNFx1MzBkNw0KLV9VSV9Qb2x5bGluZV9jbG9zZWRfZmVhdHVyZSA9IFx1MzBhZlx1MzBlZFx1MzBmY1x1MzBiYQ0KLV9VSV9Qb2x5bGluZV93YXlwb2ludHNfZmVhdHVyZSA9IFx1NGUyZFx1OTU5M1x1NzBiOQ0KLV9VSV9FbGxpcHNlX3JhZGl1c1hfZmVhdHVyZSA9IFx1NTM0YVx1NWY4NCBYDQotX1VJX0VsbGlwc2VfcmFkaXVzWV9mZWF0dXJlID0gXHU1MzRhXHU1Zjg0IFkNCi1fVUlfRWxsaXBzZV9yb3RhdGlvbl9mZWF0dXJlID0gXHU1NmRlXHU4ZWUyDQotX1VJX0VsbGlwc2Vfc3RhcnRBbmdsZV9mZWF0dXJlID0gXHU5NThiXHU1OWNiXHU4OWQyXHU1ZWE2DQotX1VJX0VsbGlwc2VfZW5kQW5nbGVfZmVhdHVyZSA9IFx1N2Q0Mlx1NGU4Nlx1ODlkMlx1NWVhNg0KLV9VSV9FbGxpcHNlX2NlbnRlcl9mZWF0dXJlID0gXHU0ZTJkXHU1ZmMzDQotX1VJX0FjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX2ZlYXR1cmUgPSBcdTMwZDZcdTMwZWNcdTMwZmNcdTMwYWZcdTMwYzBcdTMwYTZcdTMwZjNcdTMwZmJcdTMwYThcdTMwZWNcdTMwZTFcdTMwZjNcdTMwYzgNCi1fVUlfQWN0aXZpdHlfcm9hZG1hcHNfZmVhdHVyZSA9IFx1MzBlZFx1MzBmY1x1MzBjOVx1MzBkZVx1MzBjM1x1MzBkNw0KLV9VSV9BY3Rpdml0eV9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUgPSBcdTMwYjVcdTMwZGRcdTMwZmNcdTMwYzhcdThjYzdcdTY1OTkNCi1fVUlfQWN0aXZpdHlfY2hlY2tsaXN0c19mZWF0dXJlID0gXHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHUzMGVhXHUzMGI5XHUzMGM4DQotX1VJX0FjdGl2aXR5X2NvbmNlcHRzX2ZlYXR1cmUgPSBcdTY5ODJcdTVmZjUNCi1fVUlfQWN0aXZpdHlfZXhhbXBsZXNfZmVhdHVyZSA9IFx1NGY4Yg0KLV9VSV9BY3Rpdml0eV9ndWlkZWxpbmVzX2ZlYXR1cmUgPSBcdTMwYWNcdTMwYTRcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZjMNCi1fVUlfQWN0aXZpdHlfcmV1c2FibGVBc3NldHNfZmVhdHVyZSA9IFx1NTE4ZFx1NTIyOVx1NzUyOFx1NTNlZlx1ODBmZFx1MzA2YVx1MzBhMlx1MzBiYlx1MzBjM1x1MzBjOA0KLV9VSV9BY3Rpdml0eV9pc0VuYWN0YWJsZV9mZWF0dXJlID0gXHU1YjlmXHU4ODRjXHU1M2VmXHU4MGZkDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzUmVwZWF0YWJsZV9mZWF0dXJlID0gXHU1M2NkXHU1ZmE5XHU1M2VmXHU4MGZkDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzT25nb2luZ19mZWF0dXJlID0gXHU5MDMyXHU4ODRjXHU0ZTJkDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzRXZlbnREcml2ZW5fZmVhdHVyZSA9IFx1MzBhNFx1MzBkOVx1MzBmM1x1MzBjOFx1OTljNlx1NTJkNQ0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9saW5rVG9QcmVkZWNlc3Nvcl9mZWF0dXJlID0gXHU1MTQ4XHU4ODRjXHUzMGJmXHUzMGI5XHUzMGFmXHUzMDc4XHUzMDZlXHUzMGVhXHUzMGYzXHUzMGFmDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlZml4X2ZlYXR1cmUgPSBcdTMwZDdcdTMwZWNcdTMwZDVcdTMwYTNcdTMwYzNcdTMwYWZcdTMwYjkNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9pc1BsYW5uZWRfZmVhdHVyZSA9IFx1OGEwOFx1NzUzYlx1NmUwOFx1MzA3Zg0KLV9VSV9CcmVha2Rvd25FbGVtZW50X2hhc011bHRpcGxlT2NjdXJyZW5jZXNfZmVhdHVyZSA9IFx1ODkwN1x1NjU3MFx1MzA2ZVx1NTFmYVx1NzNmZQ0KLV9VSV9CcmVha2Rvd25FbGVtZW50X2lzT3B0aW9uYWxfZmVhdHVyZSA9IFx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmMw0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEFmdGVyX2ZlYXR1cmUgPSBcdTUyNGRcdTMwNmJcdTg4NjhcdTc5M2ENCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRCZWZvcmVfZmVhdHVyZSA9IFx1NWY4Y1x1MzA2Ylx1ODg2OFx1NzkzYQ0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3BsYW5uaW5nRGF0YV9mZWF0dXJlID0gXHU4YTA4XHU3NTNiXHUzMGM3XHUzMGZjXHUzMGJmDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfc3VwZXJBY3Rpdml0aWVzX2ZlYXR1cmUgPSBcdTMwYjlcdTMwZmNcdTMwZDFcdTMwZmNcdTMwZmJcdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDNcdTMwYzZcdTMwYTNcdTMwZmMNCi1fVUlfVGVhbVByb2ZpbGVfdGVhbVJvbGVzX2ZlYXR1cmUgPSBcdTMwYzFcdTMwZmNcdTMwZTBcdTMwZmJcdTMwZWRcdTMwZmNcdTMwZWINCi1fVUlfVGVhbVByb2ZpbGVfc3VwZXJUZWFtX2ZlYXR1cmUgPSBcdTMwYjlcdTMwZmNcdTMwZDFcdTMwZmNcdTMwZmJcdTMwYzFcdTMwZmNcdTMwZTANCi1fVUlfVGVhbVByb2ZpbGVfc3ViVGVhbV9mZWF0dXJlID0gXHUzMGI1XHUzMGQ2XHUzMGMxXHUzMGZjXHUzMGUwDQotX1VJX1JvbGVEZXNjcmlwdG9yX1JvbGVfZmVhdHVyZSA9IFx1MzBlZFx1MzBmY1x1MzBlYg0KLV9VSV9Sb2xlRGVzY3JpcHRvcl9tb2RpZmllc19mZWF0dXJlID0gXHU1OTA5XHU2NmY0DQotX1VJX1JvbGVEZXNjcmlwdG9yX3Jlc3BvbnNpYmxlRm9yX2ZlYXR1cmUgPSBcdTYyYzVcdTVmNTMNCi1fVUlfV29ya09yZGVyX2xpbmtUeXBlX2ZlYXR1cmUgPSBcdTMwZWFcdTMwZjNcdTMwYWZcdTMwZmJcdTMwYmZcdTMwYTRcdTMwZDcNCi1fVUlfV29ya09yZGVyX3ByZWRfZmVhdHVyZSA9IFByZWQNCi1fVUlfUGxhbm5pbmdEYXRhX3N0YXJ0RGF0ZV9mZWF0dXJlID0gXHU5NThiXHU1OWNiXHU2NWU1DQotX1VJX1BsYW5uaW5nRGF0YV9maW5pc2hEYXRlX2ZlYXR1cmUgPSBcdTdkNDJcdTRlODZcdTY1ZTUNCi1fVUlfUGxhbm5pbmdEYXRhX3JhbmtfZmVhdHVyZSA9IFx1MzBlOVx1MzBmM1x1MzBhZg0KLV9VSV9EZXNjcmlwdG9yX2lzU3luY2hyb25pemVkV2l0aFNvdXJjZV9mZWF0dXJlID0gXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDY4XHU1NDBjXHU2NzFmDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUVudHJ5U3RhdGVfZmVhdHVyZSA9IFx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1OTU4Ylx1NTljYlx1NzJiNlx1NjE0Yg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFeGl0U3RhdGVfZmVhdHVyZSA9IFx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1N2Q0Mlx1NGU4Nlx1NzJiNlx1NjE0Yg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3RfZmVhdHVyZSA9IFx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0ZWRCeV9mZWF0dXJlID0gXHU1ZjcxXHU5N2ZmXHU1MTQzDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RzX2ZlYXR1cmUgPSBcdTVmNzFcdTk3ZmZcdTUxNDgNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2RlbGl2ZXJhYmxlUGFydHNfZmVhdHVyZSA9IFx1N2QwZFx1NTE2NVx1NzI2OQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9UYXNrX2ZlYXR1cmUgPSBcdTMwYmZcdTMwYjlcdTMwYWYNCi1fVUlfVGFza0Rlc2NyaXB0b3JfYWRkaXRpb25hbGx5UGVyZm9ybWVkQnlfZmVhdHVyZSA9IDIgXHU2YjIxXHU1YjlmXHU4ODRjXHU4MDA1DQotX1VJX1Rhc2tEZXNjcmlwdG9yX2Fzc2lzdGVkQnlfZmVhdHVyZSA9IFx1NjUyZlx1NjNmNFx1ODAwNQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9leHRlcm5hbElucHV0X2ZlYXR1cmUgPSBcdTU5MTZcdTkwZThcdTUxNjVcdTUyOWINCi1fVUlfVGFza0Rlc2NyaXB0b3JfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSA9IFx1NWZjNVx1OTgwOFx1NTE2NVx1NTI5Yg0KLV9VSV9UYXNrRGVzY3JpcHRvcl9vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjNcdTUxNjVcdTUyOWINCi1fVUlfVGFza0Rlc2NyaXB0b3Jfb3V0cHV0X2ZlYXR1cmUgPSBcdTUxZmFcdTUyOWINCi1fVUlfVGFza0Rlc2NyaXB0b3JfcGVyZm9ybWVkUHJpbWFyaWx5QnlfZmVhdHVyZSA9IFx1NTdmYVx1NjcyY1x1NWI5Zlx1ODg0Y1x1ODAwNQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9zZWxlY3RlZFN0ZXBzX2ZlYXR1cmUgPSBcdTkwNzhcdTYyOWVcdTZlMDhcdTMwN2ZcdTMwYjlcdTMwYzZcdTMwYzNcdTMwZDcNCi1fVUlfQ29tcG9zaXRlUm9sZV9hZ2dyZWdhdGVkUm9sZXNfZmVhdHVyZSA9IFx1OTZjNlx1N2QwNFx1MzBlZFx1MzBmY1x1MzBlYg0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdXNhZ2VHdWlkYW5jZV9mZWF0dXJlID0gXHU0ZjdmXHU3NTI4XHUzMGFjXHUzMGE0XHUzMGMwXHUzMGYzXHUzMGI5DQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gXHU3NmVlXHU3Njg0DQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBcdTRlZTNcdTY4NDgNCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9ob3d0b1N0YWZmX2ZlYXR1cmUgPSBcdTMwY2ZcdTMwYTZcdTMwYzRcdTMwZmNcdTMwZmJcdTMwYjlcdTMwYmZcdTMwYzNcdTMwZDUNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fc2NhbGVfZmVhdHVyZSA9IFx1MzBiOVx1MzBiMVx1MzBmY1x1MzBlYg0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzX2ZlYXR1cmUgPSBcdTMwZDdcdTMwZWRcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzhcdTMwNmVcdTcyNzlcdTYwMjcNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcmlza0xldmVsX2ZlYXR1cmUgPSBcdTMwZWFcdTMwYjlcdTMwYWZcdTMwZmJcdTMwZWNcdTMwZDlcdTMwZWINCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fZXN0aW1hdGluZ1RlY2huaXF1ZV9mZWF0dXJlID0gXHU4OThiXHU3YTRkXHUzMDgyXHUzMDhhXHU2MjRiXHU2Y2Q1DQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RNZW1iZXJFeHBlcnRpc2VfZmVhdHVyZSA9IFx1MzBkN1x1MzBlZFx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjOFx1MzBmYlx1MzBlMVx1MzBmM1x1MzBkMFx1MzBmY1x1MzA2ZVx1NWMwMlx1OTU4MFx1NzdlNVx1OGI1OA0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlT2ZDb250cmFjdF9mZWF0dXJlID0gXHU1OTUxXHU3ZDA0XHUzMDZlXHUzMGJmXHUzMGE0XHUzMGQ3DQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBcdTU5MTZcdTkwZTggSUQNCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3Njb3BlX2ZlYXR1cmUgPSBcdTMwYjlcdTMwYjNcdTMwZmNcdTMwZDcNCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3VzYWdlTm90ZXNfZmVhdHVyZSA9IFx1NGY3Zlx1NzUyOFx1NGUwYVx1MzA2ZVx1NmNlOFx1NjEwZg0KLV9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fcmVmaW5lZERlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdThhNzNcdTdkMzBcdThhYWNcdTY2MGUNCi1fVUlfUHJhY3RpY2Vfc3ViUHJhY3RpY2VzX2ZlYXR1cmUgPSBcdTMwYjVcdTMwZDZcdTMwZDdcdTMwZTlcdTMwYWZcdTMwYzZcdTMwYTNcdTMwYjkNCi1fVUlfUHJhY3RpY2VfY29udGVudFJlZmVyZW5jZXNfZmVhdHVyZSA9IFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1NTNjMlx1NzE2Nw0KLV9VSV9QcmFjdGljZV9hY3Rpdml0eVJlZmVyZW5jZXNfZmVhdHVyZSA9IFx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkM1x1MzBjNlx1MzBhM1x1MzBmY1x1NTNjMlx1NzE2Nw0KLV9VSV9TdGF0ZV9Xb3JrUHJvZHVjdF9mZWF0dXJlID0gXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGMwXHUzMGFmXHUzMGM4DQotX1VJX1N0YXRlX1JlZ2lvbl9mZWF0dXJlID0gXHU5ODE4XHU1N2RmDQotX1VJX1N0YXRlX3N1Ym1hY2hpbmVfZmVhdHVyZSA9IFx1MzBiNVx1MzBkNlx1MzBkZVx1MzBiN1x1MzBmMw0KLV9VSV9WZXJ0ZXhfY29udGFpbmVyX2ZlYXR1cmUgPSBcdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2FcdTMwZmMNCi1fVUlfVmVydGV4X291dGdvaW5nX2ZlYXR1cmUgPSBcdTc2N2FcdTRmZTENCi1fVUlfVmVydGV4X2luY29taW5nX2ZlYXR1cmUgPSBcdTc3NDBcdTRmZTENCi1fVUlfUmVnaW9uX1ZlcnRleF9mZWF0dXJlID0gXHU5ODAyXHU3MGI5DQotX1VJX1JlZ2lvbl9UcmFuc2l0aW9uX2ZlYXR1cmUgPSBcdTkwNzdcdTc5ZmINCi1fVUlfUmVnaW9uX1N0YXRlX2ZlYXR1cmUgPSBcdTcyYjZcdTYxNGINCi1fVUlfUmVnaW9uX1N0YXRlTWFjaGluZV9mZWF0dXJlID0gXHU3MmI2XHU2MTRiXHUzMGRlXHUzMGI3XHUzMGYzDQotX1VJX1N0YXRlTWFjaGluZV9SZWdpb25fZmVhdHVyZSA9IFx1OTgxOFx1NTdkZg0KLV9VSV9UcmFuc2l0aW9uX1dvcmtEZWZpbml0aW9uX2ZlYXR1cmUgPSBcdTRmNWNcdTY5NmRcdTViOWFcdTdmYTkNCi1fVUlfVHJhbnNpdGlvbl9jb250YWluZXJfZmVhdHVyZSA9IFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzBmYw0KLV9VSV9UcmFuc2l0aW9uX3NvdXJjZV9mZWF0dXJlID0gXHUzMGJkXHUzMGZjXHUzMGI5DQotX1VJX1RyYW5zaXRpb25fdGFyZ2V0X2ZlYXR1cmUgPSBcdTMwYmZcdTMwZmNcdTMwYjJcdTMwYzNcdTMwYzgNCi1fVUlfRGlzY2lwbGluZV90YXNrc19mZWF0dXJlID0gXHUzMGJmXHUzMGI5XHUzMGFmDQotX1VJX0Rpc2NpcGxpbmVfc3ViZGlzY2lwbGluZV9mZWF0dXJlID0gXHU0ZjVjXHU2OTZkXHU1MjA2XHU5MWNlXHUzMDZlXHU0ZTBiXHU0ZjRkXHU1MzNhXHU1MjA2DQotX1VJX0Rpc2NpcGxpbmVfcmVmZXJlbmNlV29ya2Zsb3dzX2ZlYXR1cmUgPSBcdTUzYzJcdTcxNjdcdTMwZWZcdTMwZmNcdTMwYWZcdTMwZDVcdTMwZWRcdTMwZmMNCi1fVUlfUm9sZVNldF9yb2xlc19mZWF0dXJlID0gXHUzMGVkXHUzMGZjXHUzMGViDQotX1VJX0RvbWFpbl93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLV9VSV9Eb21haW5fc3ViZG9tYWluc19mZWF0dXJlID0gXHUzMGI1XHUzMGQ2XHUzMGM5XHUzMGUxXHUzMGE0XHUzMGYzDQotX1VJX1dvcmtQcm9kdWN0VHlwZV93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFx1MzBlZlx1MzBmY1x1MzBhZlx1MzBmYlx1MzBkN1x1MzBlZFx1MzBjMFx1MzBhZlx1MzBjOA0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSA9IFx1NGY1Y1x1Njk2ZFx1NTIwNlx1OTFjZQ0KLV9VSV9Ub29sX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBcdTMwYzRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwZTFcdTMwZjNcdTMwYmZcdTMwZmMNCi1fVUlfUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX2ZlYXR1cmUgPSBcdTMwZWRcdTMwZmNcdTMwZWJcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzgNCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfY2F0ZWdvcml6ZWRFbGVtZW50c19mZWF0dXJlID0gXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHU1MzE2XHU4OTgxXHU3ZDIwDQotX1VJX0N1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfZmVhdHVyZSA9IFx1MzBiNVx1MzBkNlx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmYw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NfZWR1Y2F0aW9uTWF0ZXJpYWxzX2ZlYXR1cmUgPSBcdTY1NTlcdTgwYjJcdThjYzdcdTY1OTkNCi1fVUlfRGVsaXZlcnlQcm9jZXNzX2NvbW11bmljYXRpb25zTWF0ZXJpYWxzX2ZlYXR1cmUgPSBcdTMwYjNcdTMwZGZcdTMwZTVcdTMwY2JcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdThjYzdcdTY1OTkNCi1fVUlfUHJvY2Vzc19pbmNsdWRlc1BhdHRlcm5zX2ZlYXR1cmUgPSBcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjNcdTMwOTJcdTU0MmJcdTMwODANCi1fVUlfUHJvY2Vzc19kZWZhdWx0Q29udGV4dF9mZWF0dXJlID0gXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMGZiXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4DQotX1VJX1Byb2Nlc3NfdmFsaWRDb250ZXh0X2ZlYXR1cmUgPSBcdTY3MDlcdTUyYjlcdTMwNmFcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzgNCi1fVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfYmFzZWRPblByb2Nlc3Nlc19mZWF0dXJlID0gXHU1N2ZhXHU2NzJjXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5DQotX1VJX1Byb2Nlc3NDb21wb25lbnRfaW50ZXJmYWNlc19mZWF0dXJlID0gXHUzMGE0XHUzMGYzXHUzMGJmXHUzMGZjXHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGI5DQotX1VJX1Byb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19mZWF0dXJlID0gXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5DQotX1VJX1Byb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19mZWF0dXJlID0gXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHU4OTgxXHU3ZDIwDQotX1VJX1Byb2Nlc3NQYWNrYWdlX2RpYWdyYW1zX2ZlYXR1cmUgPSBcdTMwYzBcdTMwYTRcdTMwYTJcdTMwYjBcdTMwZTlcdTMwZTANCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uc19mZWF0dXJlID0gXHUzMGE0XHUzMGYzXHUzMGJmXHUzMGZjXHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGI5XHU0ZWQ1XHU2OWQ4DQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlSU9fZmVhdHVyZSA9IFx1MzBhNFx1MzBmM1x1MzBiZlx1MzBmY1x1MzBkNVx1MzBhN1x1MzBmY1x1MzBiOSBJTw0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9Qcm9jZXNzQ29tcG9uZW50X2ZlYXR1cmUgPSBcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwZmJcdTMwYjNcdTMwZjNcdTMwZGRcdTMwZmNcdTMwY2RcdTMwZjNcdTMwYzgNCi1fVUlfTWV0aG9kUGx1Z2luX3VzZXJDaGFuZ2VhYmxlX2ZlYXR1cmUgPSBcdTMwZTZcdTMwZmNcdTMwYjZcdTMwZmNcdTU5MDlcdTY2ZjRcdTUzZWZcdTgwZmQNCi1fVUlfTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX2ZlYXR1cmUgPSBcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwZmJcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjgNCi1fVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUgPSBcdTMwZDlcdTMwZmNcdTMwYjkNCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5VHlwZV9mZWF0dXJlID0gXHU1M2VmXHU1OTA5XHU2MDI3XHUzMDZlXHUzMGJmXHUzMGE0XHUzMGQ3DQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUgPSBcdTg5ODFcdTdkMjBcdTMwNmJcdTU3ZmFcdTMwNjVcdTMwNGZcdTU5MWFcdTY5ZDhcdTYwMjcNCi1fVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUgPSBcdTRmNWNcdTYyMTBcdTgwMDUNCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUgPSBcdTU5MDlcdTY2ZjRcdTY1ZTUNCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEZXNjcmlwdGlvbl9mZWF0dXJlID0gXHU1OTA5XHU2NmY0XHUzMDZlXHU4YWFjXHU2NjBlDQotX1VJX01ldGhvZFVuaXRfdmVyc2lvbl9mZWF0dXJlID0gXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzDQotX1VJX01ldGhvZFVuaXRfY29weXJpZ2h0U3RhdGVtZW50X2ZlYXR1cmUgPSBcdTg0NTdcdTRmNWNcdTZhMjlcdTY1ODcNCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQbHVnaW5TZWxlY3Rpb25fZmVhdHVyZSA9IFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1OTA3OFx1NjI5ZQ0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBhY2thZ2VTZWxlY3Rpb25fZmVhdHVyZSA9IFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkMVx1MzBjM1x1MzBiMVx1MzBmY1x1MzBiOFx1OTA3OFx1NjI5ZQ0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3Byb2Nlc3NWaWV3c19mZWF0dXJlID0gXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHUzMGZiXHUzMGQzXHUzMGU1XHUzMGZjDQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fZGVmYXVsdFZpZXdfZmVhdHVyZSA9IFx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzBmYlx1MzBkM1x1MzBlNVx1MzBmYw0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2Jhc2VDb25maWd1cmF0aW9uc19mZWF0dXJlID0gXHU1N2ZhXHU2NzJjXHU2OWNiXHU2MjEwDQotX1VJX1Byb2Nlc3NGYW1pbHlfZGVsaXZlcnlQcm9jZXNzZXNfZmVhdHVyZSA9IFx1MzBjN1x1MzBlYVx1MzBkMFx1MzBlYVx1MzBmY1x1MzBmYlx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOQ0KLV9VSV9NZXRob2RMaWJyYXJ5X21ldGhvZFBsdWdpbnNfZmVhdHVyZSA9IFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBmYlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmMw0KLV9VSV9NZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19mZWF0dXJlID0gXHU0ZThiXHU1MjRkXHU1YjlhXHU3ZmE5XHU2OWNiXHU2MjEwDQotX1VJX1Vua25vd25fZmVhdHVyZSA9IFx1NjcyYVx1NjMwN1x1NWI5YQ0KLQ0KLV9VSV9Xb3JrT3JkZXJUeXBlX2ZpbmlzaFRvU3RhcnRfbGl0ZXJhbCA9IGZpbmlzaFRvU3RhcnQNCi1fVUlfV29ya09yZGVyVHlwZV9maW5pc2hUb0ZpbmlzaF9saXRlcmFsID0gZmluaXNoVG9GaW5pc2gNCi1fVUlfV29ya09yZGVyVHlwZV9zdGFydFRvU3RhcnRfbGl0ZXJhbCA9IHN0YXJ0VG9TdGFydA0KLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9GaW5pc2hfbGl0ZXJhbCA9IHN0YXJ0VG9GaW5pc2gNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2luaXRpYWxfbGl0ZXJhbCA9IFx1OTU4Ylx1NTljYlx1NzJiNlx1NjE0Yg0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfam9pbl9saXRlcmFsID0gXHU3ZDUwXHU1NDA4DQotX1VJX1BzZXVkb1N0YXRlS2luZF9mb3JrX2xpdGVyYWwgPSBcdTMwZDVcdTMwYTlcdTMwZmNcdTMwYWYNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2p1bmN0aW9uX2xpdGVyYWwgPSBcdTYzYTVcdTU0MDgNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2Nob2ljZV9saXRlcmFsID0gXHU5MDc4XHU2MjllDQotX1VJX1BzZXVkb1N0YXRlS2luZF9lbnRyeVBvaW50X2xpdGVyYWwgPSBcdTUxNjVcdTMwOGFcdTUzZTNcdTcwYjkNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2V4aXRQb2ludF9saXRlcmFsID0gXHU1MWZhXHU1M2UzXHU3MGI5DQotX1VJX1BzZXVkb1N0YXRlS2luZF90ZXJtaW5hdGVfbGl0ZXJhbCA9IFx1NTA1Y1x1NmI2Mg0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfbmFfbGl0ZXJhbCA9IG5hDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9jb250cmlidXRlc19saXRlcmFsID0gXHU1YmM0XHU0ZTBlXHUzMDU5XHUzMDhiDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9leHRlbmRzX2xpdGVyYWwgPSBcdTYyZTFcdTVmMzVcdTMwNTlcdTMwOGINCi1fVUlfVmFyaWFiaWxpdHlUeXBlX3JlcGxhY2VzX2xpdGVyYWwgPSBcdTdmNmVcdTYzZGJcdTMwNTlcdTMwOGINCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsQ29udHJpYnV0aW9uX2xpdGVyYWwgPSBcdTMwZWRcdTMwZmNcdTMwYWJcdTMwZWJcdTViYzRcdTRlMGUNCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsUmVwbGFjZW1lbnRfbGl0ZXJhbCA9IFx1MzBlZFx1MzBmY1x1MzBhYlx1MzBlYlx1N2Y2ZVx1NjNkYg0KLV9VSV9BcnRpZmFjdERlc2NyaXB0b3JfdHlwZSA9IFx1NjIxMFx1Njc5Y1x1NzI2OVx1MzA2ZVx1OGExOFx1OGZmMFx1NWI1MA0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0b3JfdHlwZSA9IFx1N2QwZFx1NTE2NVx1NzI2OVx1MzA2ZVx1OGExOFx1OGZmMFx1NWI1MA0KLV9VSV9PdXRjb21lRGVzY3JpcHRvcl90eXBlID0gXHU3ZDUwXHU2NzljXHUzMDZlXHU4YTE4XHU4ZmYwXHU1YjUwDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZDIwMDBmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLXBsdWdpbk5hbWUgPSBFTUYgVU1BIFx1ZDNiOFx1YzlkMSBcdWM5YzBcdWM2ZDANCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KLQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0ID0gezB9DQotX1VJX0NyZWF0ZUNoaWxkX3RleHQyID0gezF9IHswfQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MyA9IHsxfQ0KLV9VSV9DcmVhdGVDaGlsZF90b29sdGlwID0gXHVjMGM4IHswfVx1Yzc0NChcdWI5N2MpIHsxfSBcdWFlMzBcdWIyYTUgXHVjNTQ0XHViNzk4XHVjNWQwIFx1Yzc5MVx1YzEzMQ0KLV9VSV9DcmVhdGVDaGlsZF9kZXNjcmlwdGlvbiA9IFx1YzEyMFx1ZDBkZFx1YjQxYyB7Mn1cdWM3NTggezF9IFx1YWUzMFx1YjJhNVx1YzVkMCBcdWIzMDBcdWQ1NWMgezB9IFx1YzcyMFx1ZDYxNVx1Yzc1OCBcdWMwYzggXHVkNTU4XHVjNzA0XHViOTdjIFx1Yzc5MVx1YzEzMVx1ZDU2OVx1YjJjOFx1YjJlNC4NCi1fVUlfQ3JlYXRlU2libGluZ19kZXNjcmlwdGlvbiA9IFx1YzEyMFx1ZDBkZFx1YjQxYyB7Mn1cdWM1ZDAgXHViMzAwXHVkNTVjIHswfSBcdWM3MjBcdWQ2MTVcdWM3NTggXHVjMGM4IFx1YjNkOVx1YzcwNFx1Yjk3YyBcdWMwYzFcdWM3MDRcdWM3NTggezF9IFx1YWUzMFx1YjJhNSBcdWM1NDRcdWI3OThcdWM1ZDAgXHVjNzkxXHVjMTMxXHVkNTY5XHViMmM4XHViMmU0Lg0KLQ0KLV9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24gPSB7MX1cdWM3NTggezB9DQotDQotX1VJX0NsYXNzaWZpZXJfdHlwZSA9IFx1ZDA3NFx1Yjc5OFx1YzJhNFx1Yjk1OA0KLV9VSV9UeXBlX3R5cGUgPSBcdWM3MjBcdWQ2MTUNCi1fVUlfRWxlbWVudF90eXBlID0gXHVjNjk0XHVjMThjDQotX1VJX05hbWVkRWxlbWVudF90eXBlID0gXHVjNzc0XHViOTg0IFx1YzljMFx1YzgxNVx1YjQxYyBcdWM2OTRcdWMxOGMNCi1fVUlfUGFja2FnZWFibGVFbGVtZW50X3R5cGUgPSBcdWQzMjhcdWQwYTRcdWM5YzAgXHVhYzAwXHViMmE1XHVkNTVjIFx1YzY5NFx1YzE4Yw0KLV9VSV9QYWNrYWdlX3R5cGUgPSBcdWQzMjhcdWQwYTRcdWM5YzANCi1fVUlfTmFtZXNwYWNlX3R5cGUgPSBcdWM3NzRcdWI5ODQgXHVhY2Y1XHVhYzA0DQotX1VJX01ldGhvZEVsZW1lbnRfdHlwZSA9IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWM2OTRcdWMxOGMNCi1fVUlfQ29uc3RyYWludF90eXBlID0gXHVjODFjXHVkNTVjXHVjODcwXHVhYzc0DQotX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUgPSBcdWNlZThcdWQxNTBcdWNlMjAgXHVjNjk0XHVjMThjDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF90eXBlID0gXHVjMTI0XHViYTg1IFx1YzY5NFx1YzE4Yw0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fdHlwZSA9IFx1Y2VlOFx1ZDE1MFx1Y2UyMCBcdWMxMjRcdWJhODUNCi1fVUlfU2VjdGlvbl90eXBlID0gXHVjMTM5XHVjMTU4DQotX1VJX1JvbGVfdHlwZSA9IFx1YzVlZFx1ZDU2MA0KLV9VSV9Xb3JrUHJvZHVjdF90eXBlID0gXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYw0KLV9VSV9UYXNrX3R5cGUgPSBcdWQwYzBcdWMyYTRcdWQwNmMNCi1fVUlfV29ya0RlZmluaXRpb25fdHlwZSA9IFx1Yzc5MVx1YzVjNSBcdWM4MTVcdWM3NTgNCi1fVUlfU3RlcF90eXBlID0gXHViMmU4XHVhY2M0DQotX1VJX0d1aWRhbmNlX3R5cGUgPSBcdWM1NDhcdWIwYjQNCi1fVUlfQXJ0aWZhY3RfdHlwZSA9IFx1YzU0NFx1ZDJmMFx1ZDMyOVx1ZDJiOA0KLV9VSV9EZWxpdmVyYWJsZV90eXBlID0gXHVjNzc4XHViM2M0XHViYjNjDQotX1VJX091dGNvbWVfdHlwZSA9IFx1YWNiMFx1YWNmY1x1YmIzYw0KLV9VSV9NZXRob2RQYWNrYWdlX3R5cGUgPSBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkMzI4XHVkMGE0XHVjOWMwDQotX1VJX0NvbnRlbnRQYWNrYWdlX3R5cGUgPSBcdWNlZThcdWQxNTBcdWNlMjAgXHVkMzI4XHVkMGE0XHVjOWMwDQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSA9IFx1YzU0NFx1ZDJmMFx1ZDMyOVx1ZDJiOCBcdWMxMjRcdWJhODUNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl90eXBlID0gXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWMxMjRcdWJhODUNCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl90eXBlID0gXHVjNzc4XHViM2M0XHViYjNjIFx1YzEyNFx1YmE4NQ0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fdHlwZSA9IFx1YzVlZFx1ZDU2MCBcdWMxMjRcdWJhODUNCi1fVUlfVGFza0Rlc2NyaXB0aW9uX3R5cGUgPSBcdWQwYzBcdWMyYTRcdWQwNmMgXHVjMTI0XHViYTg1DQotX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fdHlwZSA9IFx1YzU0OFx1YjBiNCBcdWMxMjRcdWJhODUNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl90eXBlID0gXHVjMGFjXHViODQwIFx1YzEyNFx1YmE4NQ0KLV9VSV9Qb2ludF90eXBlID0gXHVjOWMwXHVjODEwDQotX1VJX0dyYXBoRWxlbWVudF90eXBlID0gXHVhZGY4XHViNzk4XHVkNTA0IFx1YzY5NFx1YzE4Yw0KLV9VSV9EaWFncmFtRWxlbWVudF90eXBlID0gXHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4IFx1YzY5NFx1YzE4Yw0KLV9VSV9EaWFncmFtTGlua190eXBlID0gXHViMmU0XHVjNzc0XHVjNWI0XHVhZGY4XHViN2E4IFx1YjljMVx1ZDA2Yw0KLV9VSV9HcmFwaENvbm5lY3Rvcl90eXBlID0gXHVhZGY4XHViNzk4XHVkNTA0IFx1Y2VlNFx1YjEyNVx1ZDEzMA0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBcdWMyZGNcdWI5ZThcdWQyZjEgXHViYWE4XHViMzc4IFx1YmUwY1x1YjliZlx1YzljMA0KLV9VSV9EaW1lbnNpb25fdHlwZSA9IFx1Y2MyOFx1YzZkMA0KLV9VSV9SZWZlcmVuY2VfdHlwZSA9IFx1Y2MzOFx1Yzg3MA0KLV9VSV9Qcm9wZXJ0eV90eXBlID0gXHVkMmI5XHVjMTMxDQotX1VJX0dyYXBoRWRnZV90eXBlID0gXHVhZGY4XHViNzk4XHVkNTA0IFx1YzVkMFx1YzljMA0KLV9VSV9EaWFncmFtX3R5cGUgPSBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTgNCi1fVUlfR3JhcGhOb2RlX3R5cGUgPSBcdWFkZjhcdWI3OThcdWQ1MDQgXHViMTc4XHViNGRjDQotX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGUgPSBcdWIyZThcdWMyMWMgXHVjMmRjXHViOWU4XHVkMmYxIFx1YmFhOFx1YjM3OCBcdWM2OTRcdWMxOGMNCi1fVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gVU1BIFx1YzJkY1x1YjllOFx1ZDJmMSBcdWJhYThcdWIzNzggXHViZTBjXHViOWJmXHVjOWMwDQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBcdWNmNTRcdWM1YjQgXHVjMmRjXHViOWU4XHVkMmYxIFx1YmFhOFx1YjM3OCBcdWJlMGNcdWI5YmZcdWM5YzANCi1fVUlfTGVhZkVsZW1lbnRfdHlwZSA9IFx1YjlhY1x1ZDUwNCBcdWM2OTRcdWMxOGMNCi1fVUlfVGV4dEVsZW1lbnRfdHlwZSA9IFx1ZDE0ZFx1YzJhNFx1ZDJiOCBcdWM2OTRcdWMxOGMNCi1fVUlfSW1hZ2VfdHlwZSA9IFx1Yzc3NFx1YmJmOFx1YzljMA0KLV9VSV9HcmFwaGljUHJpbWl0aXZlX3R5cGUgPSBcdWFkZjhcdWI3OThcdWQ1M2QgXHVhZTMwXHViY2Y4XHVjNjk0XHVjMThjDQotX1VJX1BvbHlsaW5lX3R5cGUgPSBcdWQzZjRcdWI5YWNcdWI3N2NcdWM3NzgNCi1fVUlfRWxsaXBzZV90eXBlID0gXHVkMGMwXHVjNmQwDQotX1VJX0FjdGl2aXR5X3R5cGUgPSBcdWQ2NWNcdWIzZDkNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IFx1Yzc5MVx1YzVjNVx1YmQ4NFx1Yjk1OCBcdWM2OTRcdWMxOGMoV29yayBCcmVha2Rvd24gRWxlbWVudCkNCi1fVUlfQnJlYWtkb3duRWxlbWVudF90eXBlID0gXHVjNzkxXHVjNWM1XHViZDg0XHViOTU4IFx1YzY5NFx1YzE4YyhCcmVha2Rvd24gRWxlbWVudCkNCi1fVUlfTWlsZXN0b25lX3R5cGUgPSBcdWM3NzRcdWM4MTVcdWQ0NWMNCi1fVUlfSXRlcmF0aW9uX3R5cGUgPSBcdWJjMThcdWJjZjUNCi1fVUlfUGhhc2VfdHlwZSA9IFx1YjJlOFx1YWNjNA0KLV9VSV9UZWFtUHJvZmlsZV90eXBlID0gXHVkMzAwIFx1ZDUwNFx1Yjg1Y1x1ZDMwY1x1Yzc3Yw0KLV9VSV9Sb2xlRGVzY3JpcHRvcl90eXBlID0gXHVjNWVkXHVkNTYwIFx1YzEyNFx1YmE4NVx1Yzc5MA0KLV9VSV9Xb3JrT3JkZXJfdHlwZSA9IFx1Yzc5MVx1YzVjNSBcdWM5YzBcdWMyZGMNCi1fVUlfUHJvY2Vzc0VsZW1lbnRfdHlwZSA9IFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWM2OTRcdWMxOGMNCi1fVUlfUGxhbm5pbmdEYXRhX3R5cGUgPSBcdWFjYzRcdWQ2OGQgXHViMzcwXHVjNzc0XHVkMTMwDQotX1VJX0Rlc2NyaXB0b3JfdHlwZSA9IFx1YzEyNFx1YmE4NVx1Yzc5MA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSA9IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MgXHVjMTI0XHViYTg1XHVjNzkwDQotX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUgPSBcdWQwYzBcdWMyYTRcdWQwNmMgXHVjMTI0XHViYTg1XHVjNzkwDQotX1VJX0NvbXBvc2l0ZVJvbGVfdHlwZSA9IFx1Y2VmNFx1ZDNlY1x1YzljMFx1ZDJiOCBcdWM1ZWRcdWQ1NjANCi1fVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3R5cGUgPSBcdWM3OTFcdWM1YzVcdWJkODRcdWI5NTggXHVjNjk0XHVjMThjIFx1YzEyNFx1YmE4NShCcmVha2Rvd24gRWxlbWVudCkNCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl90eXBlID0gXHVkNjVjXHViM2Q5IFx1YzEyNFx1YmE4NQ0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gXHVjODA0XHViMmVjIFx1ZDUwNFx1Yjg1Y1x1YzEzOFx1YzJhNCBcdWMxMjRcdWJhODUNCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUgPSBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVjMTI0XHViYTg1DQotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlID0gXHVjMTI0XHViYTg1XHVjNzkwIFx1YzEyNFx1YmE4NQ0KLV9VSV9Db25jZXB0X3R5cGUgPSBcdWFjMWNcdWIxNTANCi1fVUlfQ2hlY2tsaXN0X3R5cGUgPSBcdWNjYjRcdWQwNmNcdWI5YWNcdWMyYTRcdWQyYjgNCi1fVUlfRXhhbXBsZV90eXBlID0gXHVjNjA4XHVjODFjDQotX1VJX0d1aWRlbGluZV90eXBlID0gXHVhYzAwXHVjNzc0XHViNGRjXHViNzdjXHVjNzc4DQotX1VJX1JlcG9ydF90eXBlID0gXHViY2Y0XHVhY2UwXHVjMTFjDQotX1VJX1RlbXBsYXRlX3R5cGUgPSBcdWQxNWNcdWQ1MGNcdWI5YWNcdWQyYjgNCi1fVUlfU3VwcG9ydGluZ01hdGVyaWFsX3R5cGUgPSBcdWM5YzBcdWM2ZDAgXHVjNzkwXHViOGNjDQotX1VJX1Rvb2xNZW50b3JfdHlwZSA9IFx1YjNjNFx1YWQ2YyBcdWMwYWNcdWM2YTkgXHViM2M0XHVjNmMwXHViOWQwDQotX1VJX1doaXRlcGFwZXJfdHlwZSA9IFx1YmMzMVx1YzExYw0KLV9VSV9UZXJtRGVmaW5pdGlvbl90eXBlID0gXHVjNmE5XHVjNWI0IFx1YzgxNVx1Yzc1OA0KLV9VSV9QcmFjdGljZV90eXBlID0gXHVjMGFjXHViODQwDQotX1VJX0VzdGltYXRpb25Db25zaWRlcmF0aW9uc190eXBlID0gXHVjNjA4XHVjMGMxIFx1YWNlMFx1YjgyNFx1YzBhY1x1ZDU2ZA0KLV9VSV9SZXVzYWJsZUFzc2V0X3R5cGUgPSBcdWM3YWNcdWMwYWNcdWM2YTlcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjNzkwXHVjMGIwDQotX1VJX1N0YXRlX3R5cGUgPSBcdWMwYzFcdWQwZGMNCi1fVUlfVmVydGV4X3R5cGUgPSBcdWM4MTVcdWM4MTANCi1fVUlfUmVnaW9uX3R5cGUgPSBcdWM2MDFcdWM1ZWQNCi1fVUlfU3RhdGVNYWNoaW5lX3R5cGUgPSBcdWMwYzFcdWQwZGMgXHViYTM4XHVjMmUwDQotX1VJX1RyYW5zaXRpb25fdHlwZSA9IFx1YzBjMVx1ZDBkYyBcdWM4MDRcdWM3NzQNCi1fVUlfUHNldWRvU3RhdGVfdHlwZSA9IFx1Yzc1OFx1YzBhYyBcdWMwYzFcdWQwZGMNCi1fVUlfRGlzY2lwbGluZV90eXBlID0gXHVjNmQwXHVjZTU5DQotX1VJX0NvbnRlbnRDYXRlZ29yeV90eXBlID0gXHVjZWU4XHVkMTUwXHVjZTIwIFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYw0KLV9VSV9Sb2xlU2V0X3R5cGUgPSBcdWM1ZWRcdWQ1NjAgXHVjMTM4XHVkMmI4DQotX1VJX0RvbWFpbl90eXBlID0gXHViM2M0XHViYTU0XHVjNzc4DQotX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlID0gXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYyBcdWM3MjBcdWQ2MTUNCi1fVUlfRGlzY2lwbGluZUdyb3VwaW5nX3R5cGUgPSBcdWM2ZDBcdWNlNTkgXHVhZGY4XHViOGY5XHVkNjU0DQotX1VJX1Rvb2xfdHlwZSA9IFx1YjNjNFx1YWQ2Yw0KLV9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSA9IFx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjggXHVhZGY4XHViOGY5XHVkNjU0DQotX1VJX0N1c3RvbUNhdGVnb3J5X3R5cGUgPSBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4IFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NfdHlwZSA9IFx1YzgwNFx1YjJlYyBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQNCi1fVUlfUHJvY2Vzc190eXBlID0gXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0DQotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuX3R5cGUgPSBcdWFlMzBcdWIyYTUgXHVkMzI4XHVkMTM0DQotX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX3R5cGUgPSBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVhY2M0XHVkNjhkIFx1ZDE1Y1x1ZDUwY1x1YjlhY1x1ZDJiOA0KLV9VSV9Sb2FkbWFwX3R5cGUgPSBcdWI4NWNcdWI0ZGNcdWI5ZjUNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudF90eXBlID0gXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1Y2VmNFx1ZDNlY1x1YjEwY1x1ZDJiOA0KLV9VSV9Qcm9jZXNzUGFja2FnZV90eXBlID0gXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1ZDMyOFx1ZDBhNFx1YzljMA0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX3R5cGUgPSBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVjZWY0XHVkM2VjXHViMTBjXHVkMmI4IFx1Yzc3OFx1ZDEzMFx1ZDM5OFx1Yzc3NFx1YzJhNA0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl90eXBlID0gXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1Y2VmNFx1ZDNlY1x1YjEwY1x1ZDJiOCBcdWMxMjRcdWJhODVcdWM3OTANCi1fVUlfTWV0aG9kUGx1Z2luX3R5cGUgPSBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4DQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlID0gXHViY2MwXHViM2Q5IFx1YzY5NFx1YzE4Yw0KLV9VSV9NZXRob2RVbml0X3R5cGUgPSBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViMmU4XHVjNzA0DQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSA9IFx1YmE1NFx1YzE4Y1x1YjRkYyBcdWFkNmNcdWMxMzENCi1fVUlfUHJvY2Vzc0ZhbWlseV90eXBlID0gXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1YWNjNFx1YzVmNA0KLV9VSV9NZXRob2RMaWJyYXJ5X3R5cGUgPSBcdWJhNTRcdWMxOGNcdWI0ZGMgXHViNzdjXHVjNzc0XHViZTBjXHViN2VjXHViOWFjDQotX1VJX1Vua25vd25fdHlwZSA9IFx1YzYyNFx1YmUwY1x1YzgxZFx1ZDJiOA0KLQ0KLV9VSV9Vbmtub3duX2RhdGF0eXBlPSBcdWFjMTINCi0NCi1fVUlfTmFtZWRFbGVtZW50X25hbWVfZmVhdHVyZSA9IFx1Yzc3NFx1Yjk4NA0KLV9VSV9NZXRob2RFbGVtZW50X2d1aWRfZmVhdHVyZSA9IEd1aWQNCi1fVUlfTWV0aG9kRWxlbWVudF9icmllZkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdWFjMDRcdWI3YjVcdWQ1NWMgXHVjMTI0XHViYTg1DQotX1VJX01ldGhvZEVsZW1lbnRfb3duZWRSdWxlc19mZWF0dXJlID0gXHVjMThjXHVjNzIwIFx1YWRkY1x1Y2U1OQ0KLV9VSV9NZXRob2RFbGVtZW50X3N1cHByZXNzZWRfZmVhdHVyZSA9IFx1YzViNVx1YzgxY1x1YjQyOA0KLV9VSV9NZXRob2RFbGVtZW50X29yZGVyaW5nR3VpZGVfZmVhdHVyZSA9IFx1YzhmY1x1YmIzOCBcdWM1NDhcdWIwYjRcdWMxMWMNCi1fVUlfQ29uc3RyYWludF9ib2R5X2ZlYXR1cmUgPSBcdWJjZjhcdWJiMzgNCi1fVUlfQ29udGVudEVsZW1lbnRfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gXHVjOWMwXHVjNmQwIFx1Yzc5MFx1YjhjYw0KLV9VSV9Db250ZW50RWxlbWVudF9jb25jZXB0c0FuZFBhcGVyc19mZWF0dXJlID0gXHVhYzFjXHViMTUwIFx1YmMwZiBcdWJjMzFcdWMxMWMNCi1fVUlfQ29udGVudEVsZW1lbnRfY2hlY2tsaXN0c19mZWF0dXJlID0gXHVjY2I0XHVkMDZjXHViOWFjXHVjMmE0XHVkMmI4DQotX1VJX0NvbnRlbnRFbGVtZW50X2d1aWRlbGluZXNfZmVhdHVyZSA9IFx1YWMwMFx1Yzc3NFx1YjRkY1x1Yjc3Y1x1Yzc3OA0KLV9VSV9Db250ZW50RWxlbWVudF9leGFtcGxlc19mZWF0dXJlID0gXHVjNjA4XHVjODFjDQotX1VJX0NvbnRlbnRFbGVtZW50X2Fzc2V0c19mZWF0dXJlID0gXHVjNzkwXHVjMGIwDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25OYW1lX2ZlYXR1cmUgPSBcdWQ0NWNcdWMyZGMgXHVjNzc0XHViOTg0DQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fZmVhdHVyZSA9IFx1ZDQ1Y1x1YzJkYw0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfc2hhcGVpY29uX2ZlYXR1cmUgPSBTaGFwZWljb24NCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X25vZGVpY29uX2ZlYXR1cmUgPSBOb2RlaWNvbg0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fbWFpbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdWFlMzBcdWJjZjggXHVjMTI0XHViYTg1DQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19mZWF0dXJlID0gXHVjMTM5XHVjMTU4DQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9rZXlDb25zaWRlcmF0aW9uc19mZWF0dXJlID0gXHVkNTc1XHVjMmVjIFx1YWNlMFx1YjgyNFx1YzBhY1x1ZDU2ZA0KLV9VSV9TZWN0aW9uX3NlY3Rpb25OYW1lX2ZlYXR1cmUgPSBcdWMxMzlcdWMxNTggXHVjNzc0XHViOTg0DQotX1VJX1NlY3Rpb25fc2VjdGlvbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdWMxMzlcdWMxNTggXHVjMTI0XHViYTg1DQotX1VJX1NlY3Rpb25fc3ViU2VjdGlvbnNfZmVhdHVyZSA9IFx1YzExY1x1YmUwY1x1YzEzOVx1YzE1OA0KLV9VSV9TZWN0aW9uX3ByZWRlY2Vzc29yX2ZlYXR1cmUgPSBcdWMxMjBcdWQ1ODkNCi1fVUlfUm9sZV9tb2RpZmllc19mZWF0dXJlID0gXHVjMjE4XHVjODE1DQotX1VJX1JvbGVfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFx1Y2M0NVx1Yzc4NCBcdWMwYWNcdWQ1NmQNCi1fVUlfV29ya1Byb2R1Y3RfcmVwb3J0c19mZWF0dXJlID0gXHViY2Y0XHVhY2UwXHVjMTFjDQotX1VJX1dvcmtQcm9kdWN0X3RlbXBsYXRlc19mZWF0dXJlID0gXHVkMTVjXHVkNTBjXHViOWFjXHVkMmI4DQotX1VJX1dvcmtQcm9kdWN0X3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBcdWIzYzRcdWFkNmMgXHVjMGFjXHVjNmE5IFx1YjNjNFx1YzZjMFx1YjlkMA0KLV9VSV9Xb3JrUHJvZHVjdF9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IFx1YzYwOFx1YzBjMSBcdWFjZTBcdWI4MjRcdWMwYWNcdWQ1NmQNCi1fVUlfVGFza19wZXJmb3JtZWRCeV9mZWF0dXJlID0gXHVjMjE4XHVkNTg5XHVjNzkwDQotX1VJX1Rhc2tfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSA9IFx1ZDU0NFx1YzIxOCBcdWM3ODVcdWI4MjUNCi1fVUlfVGFza19vdXRwdXRfZmVhdHVyZSA9IFx1Y2Q5Y1x1YjgyNQ0KLV9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBcdWNkOTRcdWFjMDAgXHVjMjE4XHVkNTg5XHVjNzkwDQotX1VJX1Rhc2tfb3B0aW9uYWxJbnB1dF9mZWF0dXJlID0gXHVjMTIwXHVkMGRkXHVjODAxIFx1Yzc4NVx1YjgyNQ0KLV9VSV9UYXNrX3N0ZXBzX2ZlYXR1cmUgPSBcdWIyZThcdWFjYzQNCi1fVUlfVGFza190b29sTWVudG9yc19mZWF0dXJlID0gXHViM2M0XHVhZDZjIFx1YzBhY1x1YzZhOSBcdWIzYzRcdWM2YzBcdWI5ZDANCi1fVUlfVGFza19lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IFx1YzYwOFx1YzBjMSBcdWFjZTBcdWI4MjRcdWMwYWNcdWQ1NmQNCi1fVUlfV29ya0RlZmluaXRpb25fcHJlY29uZGl0aW9uX2ZlYXR1cmUgPSBcdWM4MDRcdWM4MWMgXHVjODcwXHVhYzc0DQotX1VJX1dvcmtEZWZpbml0aW9uX3Bvc3Rjb25kaXRpb25fZmVhdHVyZSA9IFx1YzBhY1x1ZDZjNCBcdWM4NzBcdWFjNzQNCi1fVUlfQXJ0aWZhY3RfY29udGFpbmVyQXJ0aWZhY3RfZmVhdHVyZSA9IFx1Y2VlOFx1ZDE0Y1x1Yzc3NFx1YjEwOCBcdWM1NDRcdWQyZjBcdWQzMjlcdWQyYjgNCi1fVUlfQXJ0aWZhY3RfY29udGFpbmVkQXJ0aWZhY3RzX2ZlYXR1cmUgPSBcdWQzZWNcdWQ1NjhcdWI0MWMgXHVjNTQ0XHVkMmYwXHVkMzI5XHVkMmI4DQotX1VJX0RlbGl2ZXJhYmxlX2RlbGl2ZXJlZFdvcmtQcm9kdWN0c19mZWF0dXJlID0gXHVjNzc4XHViM2M0XHViNDFjIFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi1fVUlfTWV0aG9kUGFja2FnZV9nbG9iYWxfZmVhdHVyZSA9IFx1YWUwMFx1Yjg1Y1x1YmM4Yw0KLV9VSV9NZXRob2RQYWNrYWdlX3JldXNlZFBhY2thZ2VzX2ZlYXR1cmUgPSBcdWM3YWNcdWMwYWNcdWM2YTlcdWI0MWMgXHVkMzI4XHVkMGE0XHVjOWMwDQotX1VJX01ldGhvZFBhY2thZ2VfcGFyZW50UGFja2FnZV9mZWF0dXJlID0gXHVjMGMxXHVjNzA0IFx1ZDMyOFx1ZDBhNFx1YzljMA0KLV9VSV9NZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfZmVhdHVyZSA9IFx1ZDU1OFx1YzcwNCBcdWQzMjhcdWQwYTRcdWM5YzANCi1fVUlfQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX2ZlYXR1cmUgPSBcdWNlZThcdWQxNTBcdWNlMjAgXHVjNjk0XHVjMThjDQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fYnJpZWZPdXRsaW5lX2ZlYXR1cmUgPSBcdWFjMDRcdWI3YjVcdWQ1NWMgXHVjNTQ0XHVjNmMzXHViNzdjXHVjNzc4DQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25PcHRpb25zX2ZlYXR1cmUgPSBcdWQ0NWNcdWMyZGMgXHVjNjM1XHVjMTU4DQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlID0gXHVjNjc4XHViZDgwIElEDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gXHViYWE5XHVjODAxDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25faW1wYWN0T2ZOb3RIYXZpbmdfZmVhdHVyZSA9IFx1YmQ4MFx1YzdhY1x1YzVkMCBcdWI1MzBcdWI5NzggXHVjNjAxXHVkNWE1DQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcmVhc29uc0Zvck5vdE5lZWRpbmdfZmVhdHVyZSA9IFx1ZDU0NFx1YzY5NCBcdWM1YzZcdWIyOTQgXHVjNzc0XHVjNzIwDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fZXh0ZXJuYWxEZXNjcmlwdGlvbl9mZWF0dXJlID0gXHVjNjc4XHViZDgwIFx1YzEyNFx1YmE4NQ0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3BhY2thZ2luZ0d1aWRhbmNlX2ZlYXR1cmUgPSBcdWQzMjhcdWQwYTRcdWM5ZDUgXHVjNTQ4XHViMGI0DQotX1VJX1JvbGVEZXNjcmlwdGlvbl9za2lsbHNfZmVhdHVyZSA9IFx1YzJhNFx1ZDBhYw0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fYXNzaWdubWVudEFwcHJvYWNoZXNfZmVhdHVyZSA9IFx1YzljMFx1YzgxNSBcdWM4MTFcdWFkZmMgXHViYzI5XHVjMmRkDQotX1VJX1JvbGVEZXNjcmlwdGlvbl9zeW5vbnltc19mZWF0dXJlID0gXHViM2Q5XHVjNzU4XHVjNWI0DQotX1VJX1Rhc2tEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBcdWJhYTlcdWM4MDENCi1fVUlfVGFza0Rlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlID0gXHViMzAwXHVjY2I0DQotX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fYXR0YWNobWVudHNfZmVhdHVyZSA9IFx1Y2NhOFx1YmQ4MA0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FkZGl0aW9uYWxJbmZvX2ZlYXR1cmUgPSBcdWNkOTRcdWFjMDAgXHVjODE1XHViY2Y0DQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fcHJvYmxlbV9mZWF0dXJlID0gXHViYjM4XHVjODFjXHVjODEwDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYmFja2dyb3VuZF9mZWF0dXJlID0gXHViYzMwXHVhY2JkDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fZ29hbHNfZmVhdHVyZSA9IFx1YmFhOVx1YzgwMQ0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FwcGxpY2F0aW9uX2ZlYXR1cmUgPSBcdWM3NTFcdWM2YTlcdWQ1MDRcdWI4NWNcdWFkZjhcdWI3YTgNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9sZXZlbHNPZkFkb3B0aW9uX2ZlYXR1cmUgPSBcdWNjNDRcdWQwZGQgXHViODA4XHViY2E4DQotX1VJX1BvaW50X3hfZmVhdHVyZSA9IFgNCi1fVUlfUG9pbnRfeV9mZWF0dXJlID0gWQ0KLV9VSV9HcmFwaEVsZW1lbnRfcG9zaXRpb25fZmVhdHVyZSA9IFx1YzcwNFx1Y2U1OA0KLV9VSV9HcmFwaEVsZW1lbnRfY29udGFpbmVkX2ZlYXR1cmUgPSBcdWQzZWNcdWQ1NjhcdWI0MjgNCi1fVUlfR3JhcGhFbGVtZW50X2xpbmtfZmVhdHVyZSA9IFx1YjljMVx1ZDA2Yw0KLV9VSV9HcmFwaEVsZW1lbnRfYW5jaG9yYWdlX2ZlYXR1cmUgPSBcdWM1NzVcdWNlZTRcdWI5YWNcdWM5YzANCi1fVUlfR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfZmVhdHVyZSA9IFx1YzJkY1x1YjllOFx1ZDJmMSBcdWJhYThcdWIzNzgNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfaXNWaXNpYmxlX2ZlYXR1cmUgPSBcdWFjMDBcdWMyZGNcdWM4MDFcdWM3ODQNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfY29udGFpbmVyX2ZlYXR1cmUgPSBcdWNlZThcdWQxNGNcdWM3NzRcdWIxMDgNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcmVmZXJlbmNlX2ZlYXR1cmUgPSBcdWNjMzhcdWM4NzANCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcHJvcGVydHlfZmVhdHVyZSA9IFx1ZDJiOVx1YzEzMQ0KLV9VSV9EaWFncmFtTGlua196b29tX2ZlYXR1cmUgPSBcdWQ2NTVcdWIzMDAvXHVjZDk1XHVjMThjDQotX1VJX0RpYWdyYW1MaW5rX3ZpZXdwb3J0X2ZlYXR1cmUgPSBcdWJkZjBcdWQzZWNcdWQyYjgNCi1fVUlfRGlhZ3JhbUxpbmtfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBcdWFkZjhcdWI3OThcdWQ1MDQgXHVjNjk0XHVjMThjDQotX1VJX0RpYWdyYW1MaW5rX2RpYWdyYW1fZmVhdHVyZSA9IFx1YjJlNFx1Yzc3NFx1YzViNFx1YWRmOFx1YjdhOA0KLV9VSV9HcmFwaENvbm5lY3Rvcl9ncmFwaEVsZW1lbnRfZmVhdHVyZSA9IFx1YWRmOFx1Yjc5OFx1ZDUwNCBcdWM2OTRcdWMxOGMNCi1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFZGdlX2ZlYXR1cmUgPSBcdWFkZjhcdWI3OThcdWQ1MDQgXHVjNWQwXHVjOWMwDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBcdWQ0NWNcdWMyZGMNCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9ncmFwaEVsZW1lbnRfZmVhdHVyZSA9IFx1YWRmOFx1Yjc5OFx1ZDUwNCBcdWM2OTRcdWMxOGMNCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9kaWFncmFtX2ZlYXR1cmUgPSBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTgNCi1fVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUgPSBcdWIxMDhcdWJlNDQNCi1fVUlfRGltZW5zaW9uX2hlaWdodF9mZWF0dXJlID0gXHViMTkyXHVjNzc0DQotX1VJX1JlZmVyZW5jZV9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbl9mZWF0dXJlID0gXHVhYzFjXHViY2M0IFx1ZDQ1Y1x1YzJkY1x1Yzc4NA0KLV9VSV9SZWZlcmVuY2VfcmVmZXJlbmNlZF9mZWF0dXJlID0gXHVjYzM4XHVjODcwXHViNDI4DQotX1VJX1Byb3BlcnR5X2tleV9mZWF0dXJlID0gXHVkMGE0DQotX1VJX1Byb3BlcnR5X3ZhbHVlX2ZlYXR1cmUgPSBcdWFjMTINCi1fVUlfR3JhcGhFZGdlX2FuY2hvcl9mZWF0dXJlID0gXHVjNTc1XHVjZWU0DQotX1VJX0dyYXBoRWRnZV93YXlwb2ludHNfZmVhdHVyZSA9IFx1YzljMFx1YzgxMA0KLV9VSV9EaWFncmFtX3pvb21fZmVhdHVyZSA9IFx1ZDY1NVx1YjMwMC9cdWNkOTVcdWMxOGMNCi1fVUlfRGlhZ3JhbV92aWV3cG9pbnRfZmVhdHVyZSA9IFx1YzJkY1x1YzgxMA0KLV9VSV9EaWFncmFtX2RpYWdyYW1MaW5rX2ZlYXR1cmUgPSBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTggXHViOWMxXHVkMDZjDQotX1VJX0RpYWdyYW1fbmFtZXNwYWNlX2ZlYXR1cmUgPSBcdWM3NzRcdWI5ODQgXHVhY2Y1XHVhYzA0DQotX1VJX0dyYXBoTm9kZV9zaXplX2ZlYXR1cmUgPSBcdWQwNmNcdWFlMzANCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZUluZm9fZmVhdHVyZSA9IFx1YzcyMFx1ZDYxNSBcdWM4MTVcdWJjZjQNCi1fVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUgPSBcdWM2OTRcdWMxOGMNCi1fVUlfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VfZWxlbWVudF9mZWF0dXJlID0gXHVjNjk0XHVjMThjDQotX1VJX1RleHRFbGVtZW50X3RleHRfZmVhdHVyZSA9IFx1ZDE0ZFx1YzJhNFx1ZDJiOA0KLV9VSV9JbWFnZV91cmlfZmVhdHVyZSA9IFVSSQ0KLV9VSV9JbWFnZV9taW1lVHlwZV9mZWF0dXJlID0gTWltZSBcdWM3MjBcdWQ2MTUNCi1fVUlfUG9seWxpbmVfY2xvc2VkX2ZlYXR1cmUgPSBcdWIyZWJcdWQ3OTgNCi1fVUlfUG9seWxpbmVfd2F5cG9pbnRzX2ZlYXR1cmUgPSBcdWM5YzBcdWM4MTANCi1fVUlfRWxsaXBzZV9yYWRpdXNYX2ZlYXR1cmUgPSBcdWJjMThcdWFjYmQgWA0KLV9VSV9FbGxpcHNlX3JhZGl1c1lfZmVhdHVyZSA9IFx1YmMxOFx1YWNiZCBZDQotX1VJX0VsbGlwc2Vfcm90YXRpb25fZmVhdHVyZSA9IFx1ZDY4Y1x1YzgwNA0KLV9VSV9FbGxpcHNlX3N0YXJ0QW5nbGVfZmVhdHVyZSA9IFx1YzJkY1x1Yzc5MSBcdWFjMDFcdWIzYzQNCi1fVUlfRWxsaXBzZV9lbmRBbmdsZV9mZWF0dXJlID0gXHViMDVkIFx1YWMwMVx1YjNjNA0KLV9VSV9FbGxpcHNlX2NlbnRlcl9mZWF0dXJlID0gXHVhYzAwXHVjNmI0XHViMzcwDQotX1VJX0FjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX2ZlYXR1cmUgPSBcdWM3OTFcdWM1YzVcdWJkODRcdWI5NTggXHVjNjk0XHVjMThjDQotX1VJX0FjdGl2aXR5X3JvYWRtYXBzX2ZlYXR1cmUgPSBcdWI4NWNcdWI0ZGNcdWI5ZjUNCi1fVUlfQWN0aXZpdHlfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gXHVjOWMwXHVjNmQwIFx1Yzc5MFx1YjhjYw0KLV9VSV9BY3Rpdml0eV9jaGVja2xpc3RzX2ZlYXR1cmUgPSBcdWNjYjRcdWQwNmNcdWI5YWNcdWMyYTRcdWQyYjgNCi1fVUlfQWN0aXZpdHlfY29uY2VwdHNfZmVhdHVyZSA9IFx1YWMxY1x1YjE1MA0KLV9VSV9BY3Rpdml0eV9leGFtcGxlc19mZWF0dXJlID0gXHVjNjA4XHVjODFjDQotX1VJX0FjdGl2aXR5X2d1aWRlbGluZXNfZmVhdHVyZSA9IFx1YWMwMFx1Yzc3NFx1YjRkY1x1Yjc3Y1x1Yzc3OA0KLV9VSV9BY3Rpdml0eV9yZXVzYWJsZUFzc2V0c19mZWF0dXJlID0gXHVjN2FjXHVjMGFjXHVjNmE5XHVhYzAwXHViMmE1XHVkNTVjIFx1Yzc5MFx1YzBiMA0KLV9VSV9BY3Rpdml0eV9pc0VuYWN0YWJsZV9mZWF0dXJlID0gXHViYzFjXHVjMGRkIFx1YWMwMFx1YjJhNVx1ZDU2OA0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc1JlcGVhdGFibGVfZmVhdHVyZSA9IFx1YmMxOFx1YmNmNSBcdWFjMDBcdWIyYTVcdWQ1NjgNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNPbmdvaW5nX2ZlYXR1cmUgPSBcdWM5YzRcdWQ1ODkgXHVjOTExXHVjNzg0DQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzRXZlbnREcml2ZW5fZmVhdHVyZSA9IFx1Yzc3NFx1YmNhNFx1ZDJiOFx1Yjg1YyBcdWFkNmNcdWIzZDlcdWI0MjgNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfbGlua1RvUHJlZGVjZXNzb3JfZmVhdHVyZSA9IFx1YzEyMFx1ZDU4OVx1YzVkMCBcdWI5YzFcdWQwNmMNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVmaXhfZmVhdHVyZSA9IFx1YzgxMVx1YjQ1MFx1YmQ4MA0KLV9VSV9CcmVha2Rvd25FbGVtZW50X2lzUGxhbm5lZF9mZWF0dXJlID0gXHVhY2M0XHVkNjhkXHViNDI4DQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaGFzTXVsdGlwbGVPY2N1cnJlbmNlc19mZWF0dXJlID0gXHViY2Y1XHVjMjE4IFx1YmMxY1x1YzBkZFx1Yzc3NCBcdWM3ODhcdWM3NGMNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9pc09wdGlvbmFsX2ZlYXR1cmUgPSBcdWMxMjBcdWQwZGRcdWM4MDFcdWM3ODQNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRBZnRlcl9mZWF0dXJlID0gXHVjMGFjXHVkNmM0XHVjNWQwIFx1ZDQ1Y1x1YzJkY1x1YjQyOA0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEJlZm9yZV9mZWF0dXJlID0gXHVjMGFjXHVjODA0XHVjNWQwIFx1ZDQ1Y1x1YzJkY1x1YjQyOA0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3BsYW5uaW5nRGF0YV9mZWF0dXJlID0gXHVhY2M0XHVkNjhkIFx1YjM3MFx1Yzc3NFx1ZDEzMA0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3N1cGVyQWN0aXZpdGllc19mZWF0dXJlID0gXHVjMjE4XHVkMzdjIFx1ZDY1Y1x1YjNkOQ0KLV9VSV9UZWFtUHJvZmlsZV90ZWFtUm9sZXNfZmVhdHVyZSA9IFx1ZDMwMCBcdWM1ZWRcdWQ1NjANCi1fVUlfVGVhbVByb2ZpbGVfc3VwZXJUZWFtX2ZlYXR1cmUgPSBcdWMwYzFcdWM3MDQgXHVkMzAwDQotX1VJX1RlYW1Qcm9maWxlX3N1YlRlYW1fZmVhdHVyZSA9IFx1ZDU1OFx1YzcwNCBcdWQzMDANCi1fVUlfUm9sZURlc2NyaXB0b3JfUm9sZV9mZWF0dXJlID0gXHVjNWVkXHVkNTYwDQotX1VJX1JvbGVEZXNjcmlwdG9yX21vZGlmaWVzX2ZlYXR1cmUgPSBcdWMyMThcdWM4MTUNCi1fVUlfUm9sZURlc2NyaXB0b3JfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFx1Y2M0NVx1Yzc4NCBcdWMwYWNcdWQ1NmQNCi1fVUlfV29ya09yZGVyX2xpbmtUeXBlX2ZlYXR1cmUgPSBcdWI5YzFcdWQwNmMgXHVjNzIwXHVkNjE1DQotX1VJX1dvcmtPcmRlcl9wcmVkX2ZlYXR1cmUgPSBQcmVkDQotX1VJX1BsYW5uaW5nRGF0YV9zdGFydERhdGVfZmVhdHVyZSA9IFx1YzJkY1x1Yzc5MSBcdWIwYTBcdWM5ZGMNCi1fVUlfUGxhbm5pbmdEYXRhX2ZpbmlzaERhdGVfZmVhdHVyZSA9IFx1YzY0NFx1YjhjYyBcdWIwYTBcdWM5ZGMNCi1fVUlfUGxhbm5pbmdEYXRhX3JhbmtfZmVhdHVyZSA9IFx1YjRmMVx1YWUwOQ0KLV9VSV9EZXNjcmlwdG9yX2lzU3luY2hyb25pemVkV2l0aFNvdXJjZV9mZWF0dXJlID0gXHVjMThjXHVjMmE0XHVjNjQwIFx1YjNkOVx1YWUzMFx1ZDY1NFx1YjQyOA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFbnRyeVN0YXRlX2ZlYXR1cmUgPSBcdWQ2NWNcdWIzZDkgXHVjMmRjXHVjNzkxIFx1YzBjMVx1ZDBkYw0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFeGl0U3RhdGVfZmVhdHVyZSA9IFx1ZDY1Y1x1YjNkOSBcdWM4ODVcdWI4Y2MgXHVjMGMxXHVkMGRjDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdF9mZWF0dXJlID0gXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYw0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0ZWRCeV9mZWF0dXJlID0gXHVjNjAxXHVkNWE1XHVjNzQ0IFx1YzkwMCBcdWIzMDBcdWMwYzENCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdHNfZmVhdHVyZSA9IFx1YzYwMVx1ZDVhNQ0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfZGVsaXZlcmFibGVQYXJ0c19mZWF0dXJlID0gXHVjNzc4XHViM2M0XHViYjNjIFx1ZDMwY1x1ZDJiOA0KLV9VSV9UYXNrRGVzY3JpcHRvcl9UYXNrX2ZlYXR1cmUgPSBcdWQwYzBcdWMyYTRcdWQwNmMNCi1fVUlfVGFza0Rlc2NyaXB0b3JfYWRkaXRpb25hbGx5UGVyZm9ybWVkQnlfZmVhdHVyZSA9IDJcdWNjMjggXHVjMjE4XHVkNTg5XHVjNzkwDQotX1VJX1Rhc2tEZXNjcmlwdG9yX2Fzc2lzdGVkQnlfZmVhdHVyZSA9IFx1YzljMFx1YzZkMFx1Yzc5MA0KLV9VSV9UYXNrRGVzY3JpcHRvcl9leHRlcm5hbElucHV0X2ZlYXR1cmUgPSBcdWM2NzhcdWJkODAgXHVjNzg1XHViODI1DQotX1VJX1Rhc2tEZXNjcmlwdG9yX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUgPSBcdWQ1NDRcdWMyMTggXHVjNzg1XHViODI1DQotX1VJX1Rhc2tEZXNjcmlwdG9yX29wdGlvbmFsSW5wdXRfZmVhdHVyZSA9IFx1YzEyMFx1ZDBkZFx1YzgwMSBcdWM3ODVcdWI4MjUNCi1fVUlfVGFza0Rlc2NyaXB0b3Jfb3V0cHV0X2ZlYXR1cmUgPSBcdWNkOWNcdWI4MjUNCi1fVUlfVGFza0Rlc2NyaXB0b3JfcGVyZm9ybWVkUHJpbWFyaWx5QnlfZmVhdHVyZSA9IFx1YWUzMFx1YmNmOCBcdWMyMThcdWQ1ODlcdWM3OTANCi1fVUlfVGFza0Rlc2NyaXB0b3Jfc2VsZWN0ZWRTdGVwc19mZWF0dXJlID0gXHVjMTIwXHVkMGRkXHViNDFjIFx1YjJlOFx1YWNjNA0KLV9VSV9Db21wb3NpdGVSb2xlX2FnZ3JlZ2F0ZWRSb2xlc19mZWF0dXJlID0gXHVjOWQxXHVhY2M0XHViNDFjIFx1YzVlZFx1ZDU2MA0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdXNhZ2VHdWlkYW5jZV9mZWF0dXJlID0gXHVjMGFjXHVjNmE5XHViYzk1IFx1YzU0OFx1YjBiNA0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IFx1YmFhOVx1YzgwMQ0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlID0gXHViMzAwXHVjY2I0DQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25faG93dG9TdGFmZl9mZWF0dXJlID0gXHVjNzc4XHViODI1IFx1YWQ2Y1x1YzEzMSBcdWJjMjlcdWJjOTUNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fc2NhbGVfZmVhdHVyZSA9IFx1YzJhNFx1Y2YwMFx1Yzc3Yw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzX2ZlYXR1cmUgPSBcdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjggXHVkMmI5XHVjMTMxDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Jpc2tMZXZlbF9mZWF0dXJlID0gXHVjNzA0XHVkNWQ4XHVjMTMxIFx1YjgwOFx1YmNhOA0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9lc3RpbWF0aW5nVGVjaG5pcXVlX2ZlYXR1cmUgPSBcdWM2MDhcdWMwYzEgXHVhZTMwXHViYzk1DQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RNZW1iZXJFeHBlcnRpc2VfZmVhdHVyZSA9IFx1ZDUwNFx1Yjg1Y1x1YzgxZFx1ZDJiOCBcdWFkNmNcdWMxMzFcdWM2ZDAgXHVjODA0XHViYjM4IFx1YzljMFx1YzJkZA0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlT2ZDb250cmFjdF9mZWF0dXJlID0gXHVhY2M0XHVjNTdkIFx1YzcyMFx1ZDYxNQ0KLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlID0gXHVjNjc4XHViZDgwIElEDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9zY29wZV9mZWF0dXJlID0gXHViYzk0XHVjNzA0DQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl91c2FnZU5vdGVzX2ZlYXR1cmUgPSBcdWMwYWNcdWM2YTlcdWJjOTUgXHViMTc4XHVkMmI4DQotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl9yZWZpbmVkRGVzY3JpcHRpb25fZmVhdHVyZSA9IFx1YzEzOFx1YmQ4MCBcdWMxMjRcdWJhODUNCi1fVUlfUHJhY3RpY2Vfc3ViUHJhY3RpY2VzX2ZlYXR1cmUgPSBcdWQ1NThcdWM3MDQgXHVjMGFjXHViODQwDQotX1VJX1ByYWN0aWNlX2NvbnRlbnRSZWZlcmVuY2VzX2ZlYXR1cmUgPSBcdWNlZThcdWQxNTBcdWNlMjAgXHVjYzM4XHVjODcwDQotX1VJX1ByYWN0aWNlX2FjdGl2aXR5UmVmZXJlbmNlc19mZWF0dXJlID0gXHVkNjVjXHViM2Q5IFx1Y2MzOFx1Yzg3MA0KLV9VSV9TdGF0ZV9Xb3JrUHJvZHVjdF9mZWF0dXJlID0gXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYw0KLV9VSV9TdGF0ZV9SZWdpb25fZmVhdHVyZSA9IFx1YzYwMVx1YzVlZA0KLV9VSV9TdGF0ZV9zdWJtYWNoaW5lX2ZlYXR1cmUgPSBcdWMxMWNcdWJlMGNcdWJhMzhcdWMyZTANCi1fVUlfVmVydGV4X2NvbnRhaW5lcl9mZWF0dXJlID0gXHVjZWU4XHVkMTRjXHVjNzc0XHViMTA4DQotX1VJX1ZlcnRleF9vdXRnb2luZ19mZWF0dXJlID0gXHVjZDljXHViODI1DQotX1VJX1ZlcnRleF9pbmNvbWluZ19mZWF0dXJlID0gXHVjNzg1XHViODI1DQotX1VJX1JlZ2lvbl9WZXJ0ZXhfZmVhdHVyZSA9IFx1YzgxNVx1YzgxMA0KLV9VSV9SZWdpb25fVHJhbnNpdGlvbl9mZWF0dXJlID0gXHVjMGMxXHVkMGRjIFx1YzgwNFx1Yzc3NA0KLV9VSV9SZWdpb25fU3RhdGVfZmVhdHVyZSA9IFx1YzBjMVx1ZDBkYw0KLV9VSV9SZWdpb25fU3RhdGVNYWNoaW5lX2ZlYXR1cmUgPSBcdWMwYzFcdWQwZGMgXHViYTM4XHVjMmUwDQotX1VJX1N0YXRlTWFjaGluZV9SZWdpb25fZmVhdHVyZSA9IFx1YzYwMVx1YzVlZA0KLV9VSV9UcmFuc2l0aW9uX1dvcmtEZWZpbml0aW9uX2ZlYXR1cmUgPSBcdWM3OTFcdWM1YzUgXHVjODE1XHVjNzU4DQotX1VJX1RyYW5zaXRpb25fY29udGFpbmVyX2ZlYXR1cmUgPSBcdWNlZThcdWQxNGNcdWM3NzRcdWIxMDgNCi1fVUlfVHJhbnNpdGlvbl9zb3VyY2VfZmVhdHVyZSA9IFx1YzE4Y1x1YzJhNA0KLV9VSV9UcmFuc2l0aW9uX3RhcmdldF9mZWF0dXJlID0gXHViMzAwXHVjMGMxDQotX1VJX0Rpc2NpcGxpbmVfdGFza3NfZmVhdHVyZSA9IFx1ZDBjMFx1YzJhNFx1ZDA2Yw0KLV9VSV9EaXNjaXBsaW5lX3N1YmRpc2NpcGxpbmVfZmVhdHVyZSA9IFx1ZDU1OFx1YzcwNCBcdWM2ZDBcdWNlNTkNCi1fVUlfRGlzY2lwbGluZV9yZWZlcmVuY2VXb3JrZmxvd3NfZmVhdHVyZSA9IFx1Y2MzOFx1Yzg3MCBcdWM2Y2NcdWQwNmNcdWQ1MGNcdWI4NWNcdWM2YjANCi1fVUlfUm9sZVNldF9yb2xlc19mZWF0dXJlID0gXHVjNWVkXHVkNTYwDQotX1VJX0RvbWFpbl93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFx1YzkxMVx1YWMwNCBcdWMwYjBcdWNkOWNcdWJiM2MNCi1fVUlfRG9tYWluX3N1YmRvbWFpbnNfZmVhdHVyZSA9IFx1YzExY1x1YmUwYyBcdWIzYzRcdWJhNTRcdWM3NzgNCi1fVUlfV29ya1Byb2R1Y3RUeXBlX3dvcmtQcm9kdWN0c19mZWF0dXJlID0gXHVjOTExXHVhYzA0IFx1YzBiMFx1Y2Q5Y1x1YmIzYw0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSA9IFx1YzZkMFx1Y2U1OQ0KLV9VSV9Ub29sX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBcdWIzYzRcdWFkNmMgXHVjMGFjXHVjNmE5IFx1YjNjNFx1YzZjMFx1YjlkMA0KLV9VSV9Sb2xlU2V0R3JvdXBpbmdfcm9sZVNldHNfZmVhdHVyZSA9IFx1YzVlZFx1ZDU2MCBcdWMxMzhcdWQyYjgNCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfY2F0ZWdvcml6ZWRFbGVtZW50c19mZWF0dXJlID0gXHViZDg0XHViOTU4XHViNDFjIFx1YzY5NFx1YzE4Yw0KLV9VSV9DdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX2ZlYXR1cmUgPSBcdWMxMWNcdWJlMGMgXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc19lZHVjYXRpb25NYXRlcmlhbHNfZmVhdHVyZSA9IFx1YWQ1MFx1YzcyMSBcdWM3OTBcdWI4Y2MNCi1fVUlfRGVsaXZlcnlQcm9jZXNzX2NvbW11bmljYXRpb25zTWF0ZXJpYWxzX2ZlYXR1cmUgPSBcdWNlZTRcdWJiYTRcdWIyYzhcdWNmMDBcdWM3NzRcdWMxNTggXHVjNzkwXHViOGNjDQotX1VJX1Byb2Nlc3NfaW5jbHVkZXNQYXR0ZXJuc19mZWF0dXJlID0gXHVkM2VjXHVkNTY4IFx1ZDMyOFx1ZDEzNA0KLV9VSV9Qcm9jZXNzX2RlZmF1bHRDb250ZXh0X2ZlYXR1cmUgPSBcdWFlMzBcdWJjZjggXHVjZWU4XHVkMTRkXHVjMmE0XHVkMmI4DQotX1VJX1Byb2Nlc3NfdmFsaWRDb250ZXh0X2ZlYXR1cmUgPSBcdWM2MmNcdWJjMTRcdWI5NzggXHVjZWU4XHVkMTRkXHVjMmE0XHVkMmI4DQotX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX2Jhc2VkT25Qcm9jZXNzZXNfZmVhdHVyZSA9IFx1YWUzMFx1YmNmOCBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudF9pbnRlcmZhY2VzX2ZlYXR1cmUgPSBcdWM3NzhcdWQxMzBcdWQzOThcdWM3NzRcdWMyYTQNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX2ZlYXR1cmUgPSBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQNCi1fVUlfUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX2ZlYXR1cmUgPSBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQgXHVjNjk0XHVjMThjDQotX1VJX1Byb2Nlc3NQYWNrYWdlX2RpYWdyYW1zX2ZlYXR1cmUgPSBcdWIyZTRcdWM3NzRcdWM1YjRcdWFkZjhcdWI3YTgNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uc19mZWF0dXJlID0gXHVjNzc4XHVkMTMwXHVkMzk4XHVjNzc0XHVjMmE0IFx1YzJhNFx1ZDM5OQ0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZUlPX2ZlYXR1cmUgPSBcdWM3NzhcdWQxMzBcdWQzOThcdWM3NzRcdWMyYTQgSU8NCi1fVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfUHJvY2Vzc0NvbXBvbmVudF9mZWF0dXJlID0gXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1Y2VmNFx1ZDNlY1x1YjEwY1x1ZDJiOA0KLV9VSV9NZXRob2RQbHVnaW5fdXNlckNoYW5nZWFibGVfZmVhdHVyZSA9IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWJjYzBcdWFjYmQgXHVhYzAwXHViMmE1DQotX1VJX01ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19mZWF0dXJlID0gXHViYTU0XHVjMThjXHViNGRjIFx1ZDMyOFx1ZDBhNFx1YzljMA0KLV9VSV9NZXRob2RQbHVnaW5fYmFzZXNfZmVhdHVyZSA9IFx1YWUzMFx1YmNmOA0KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUgPSBcdWJjYzBcdWIzZDkgXHVjNzIwXHVkNjE1DQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUgPSBcdWJjYzBcdWIzZDkgXHVhZTMwXHViY2Y4IFx1YzY5NFx1YzE4Yw0KLV9VSV9NZXRob2RVbml0X2F1dGhvcnNfZmVhdHVyZSA9IFx1Yzc5MVx1YzEzMVx1Yzc5MA0KLV9VSV9NZXRob2RVbml0X2NoYW5nZURhdGVfZmVhdHVyZSA9IFx1YjBhMFx1YzlkYyBcdWJjYzBcdWFjYmQNCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEZXNjcmlwdGlvbl9mZWF0dXJlID0gXHVjMTI0XHViYTg1IFx1YmNjMFx1YWNiZA0KLV9VSV9NZXRob2RVbml0X3ZlcnNpb25fZmVhdHVyZSA9IFx1YmM4NFx1YzgwNA0KLV9VSV9NZXRob2RVbml0X2NvcHlyaWdodFN0YXRlbWVudF9mZWF0dXJlID0gXHVjODAwXHVjNzkxXHVhZDhjIFx1YWQ2Y1x1YmIzOA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBsdWdpblNlbGVjdGlvbl9mZWF0dXJlID0gXHViYTU0XHVjMThjXHViNGRjIFx1ZDUwY1x1YjdlY1x1YWRmOFx1Yzc3OCBcdWMxMjBcdWQwZGQNCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQYWNrYWdlU2VsZWN0aW9uX2ZlYXR1cmUgPSBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkMzI4XHVkMGE0XHVjOWMwIFx1YzEyMFx1ZDBkZA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3Byb2Nlc3NWaWV3c19mZWF0dXJlID0gXHVkNTA0XHViODVjXHVjMTM4XHVjMmE0IFx1YmNmNFx1YWUzMA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2RlZmF1bHRWaWV3X2ZlYXR1cmUgPSBcdWFlMzBcdWJjZjggXHViY2Y0XHVhZTMwDQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fYmFzZUNvbmZpZ3VyYXRpb25zX2ZlYXR1cmUgPSBcdWFlMzBcdWJjZjggXHVhZDZjXHVjMTMxDQotX1VJX1Byb2Nlc3NGYW1pbHlfZGVsaXZlcnlQcm9jZXNzZXNfZmVhdHVyZSA9IFx1YzgwNFx1YjJlYyBcdWQ1MDRcdWI4NWNcdWMxMzhcdWMyYTQNCi1fVUlfTWV0aG9kTGlicmFyeV9tZXRob2RQbHVnaW5zX2ZlYXR1cmUgPSBcdWJhNTRcdWMxOGNcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4DQotX1VJX01ldGhvZExpYnJhcnlfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zX2ZlYXR1cmUgPSBcdWMwYWNcdWM4MDQgXHVjODE1XHVjNzU4XHViNDFjIFx1YWQ2Y1x1YzEzMQ0KLV9VSV9Vbmtub3duX2ZlYXR1cmUgPSBcdWM5YzBcdWM4MTVcdWI0MThcdWM5YzAgXHVjNTRhXHVjNzRjDQotDQotX1VJX1dvcmtPcmRlclR5cGVfZmluaXNoVG9TdGFydF9saXRlcmFsID0gZmluaXNoVG9TdGFydA0KLV9VSV9Xb3JrT3JkZXJUeXBlX2ZpbmlzaFRvRmluaXNoX2xpdGVyYWwgPSBmaW5pc2hUb0ZpbmlzaA0KLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9TdGFydF9saXRlcmFsID0gc3RhcnRUb1N0YXJ0DQotX1VJX1dvcmtPcmRlclR5cGVfc3RhcnRUb0ZpbmlzaF9saXRlcmFsID0gc3RhcnRUb0ZpbmlzaA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfaW5pdGlhbF9saXRlcmFsID0gXHVjZDA4XHVhZTMwDQotX1VJX1BzZXVkb1N0YXRlS2luZF9qb2luX2xpdGVyYWwgPSBcdWFjYjBcdWQ1NjkNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2ZvcmtfbGl0ZXJhbCA9IFx1YmQ4NFx1YWUzMA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfanVuY3Rpb25fbGl0ZXJhbCA9IFx1YzVmMFx1YWNiMA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfY2hvaWNlX2xpdGVyYWwgPSBcdWMxMjBcdWQwZGRcdWMwYWNcdWQ1NmQNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2VudHJ5UG9pbnRfbGl0ZXJhbCA9IFx1YzJkY1x1Yzc5MVx1YzgxMA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZXhpdFBvaW50X2xpdGVyYWwgPSBcdWM4ODVcdWI4Y2NcdWM4MTANCi1fVUlfUHNldWRvU3RhdGVLaW5kX3Rlcm1pbmF0ZV9saXRlcmFsID0gXHVjODg1XHViOGNjDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9uYV9saXRlcmFsID0gXHVjODAxXHVjNmE5IFx1YzU0OFx1YjQyOA0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfY29udHJpYnV0ZXNfbGl0ZXJhbCA9IFx1Y2VlOFx1ZDJiOFx1YjlhY1x1YmRmMFx1YzE1OA0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfZXh0ZW5kc19saXRlcmFsID0gXHVkNjU1XHVjN2E1DQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9yZXBsYWNlc19saXRlcmFsID0gXHViYzE0XHVhZmI4XHVhZTMwDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9sb2NhbENvbnRyaWJ1dGlvbl9saXRlcmFsID0gXHViODVjXHVjZWVjIFx1YmQ4NFx1YmMzMA0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfbG9jYWxSZXBsYWNlbWVudF9saXRlcmFsID0gXHViODVjXHVjZWVjIFx1YmMxNFx1YWZiOFx1YWUzMA0KLV9VSV9BcnRpZmFjdERlc2NyaXB0b3JfdHlwZSA9IFx1YzU0NFx1ZDJmMFx1ZDMyOVx1ZDJiOCBcdWMxMjRcdWJhODVcdWM3OTANCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdG9yX3R5cGUgPSBcdWM4MDRcdWIyZWNcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjMTI0XHViYTg1XHVjNzkwDQotX1VJX091dGNvbWVEZXNjcmlwdG9yX3R5cGUgPSBcdWFjYjBcdWFjZmMgXHVjMTI0XHViYTg1XHVjNzkwDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMzE0YjVmLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLXBsdWdpbk5hbWUgPSBTdXBvcnRlIGRlIEVkaVx1MDBlN1x1MDBlM28gRU1GIFVNQQ0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQotX1VJX0NyZWF0ZUNoaWxkX3RleHQgPSB7MH0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDIgPSB7MX0gezB9DQotX1VJX0NyZWF0ZUNoaWxkX3RleHQzID0gezF9DQotX1VJX0NyZWF0ZUNoaWxkX3Rvb2x0aXAgPSBDcmlhciBOb3ZvIHswfSBTb2IgbyBSZWN1cnNvIHsxfQ0KLV9VSV9DcmVhdGVDaGlsZF9kZXNjcmlwdGlvbiA9IENyaWFyIHVtIG5vdm8gZmlsaG8gZGUgdGlwbyB7MH0gcGFyYSBvIHJlY3Vyc28gezF9IGRvIHsyfSBzZWxlY2lvbmFkby4NCi1fVUlfQ3JlYXRlU2libGluZ19kZXNjcmlwdGlvbiA9IENyaWFyIHVtIG5vdm8gaXJtXHUwMGUzbyBkbyB0aXBvIHswfSBwYXJhIG8gezJ9IHNlbGVjaW9uYWRvLCBubyByZWN1cnNvIHsxfSBkZSBzZXUgcGFpLg0KLQ0KLV9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24gPSB7MH0gZGUgezF9DQotDQotX1VJX0NsYXNzaWZpZXJfdHlwZSA9IENsYXNzaWZpY2Fkb3INCi1fVUlfVHlwZV90eXBlID0gVGlwbw0KLV9VSV9FbGVtZW50X3R5cGUgPSBFbGVtZW50bw0KLV9VSV9OYW1lZEVsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIE5vbWVhZG8NCi1fVUlfUGFja2FnZWFibGVFbGVtZW50X3R5cGUgPSBFbGVtZW50byBlbSBQYWNvdGUNCi1fVUlfUGFja2FnZV90eXBlID0gUGFjb3RlDQotX1VJX05hbWVzcGFjZV90eXBlID0gRXNwYVx1MDBlN28gZGUgTm9tZXMNCi1fVUlfTWV0aG9kRWxlbWVudF90eXBlID0gRWxlbWVudG8gZGUgTVx1MDBlOXRvZG8NCi1fVUlfQ29uc3RyYWludF90eXBlID0gUmVzdHJpXHUwMGU3XHUwMGUzbw0KLV9VSV9Db250ZW50RWxlbWVudF90eXBlID0gRWxlbWVudG8gZG8gQ29udGVcdTAwZmFkbw0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIERlc2NyaXRcdTAwZWR2ZWwNCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlcdTAwZTdcdTAwZTNvIGRlIENvbnRlXHUwMGZhZG8NCi1fVUlfU2VjdGlvbl90eXBlID0gU2VcdTAwZTdcdTAwZTNvDQotX1VJX1JvbGVfdHlwZSA9IEZ1blx1MDBlN1x1MDBlM28NCi1fVUlfV29ya1Byb2R1Y3RfdHlwZSA9IFByb2R1dG8gZGUgVHJhYmFsaG8NCi1fVUlfVGFza190eXBlID0gVGFyZWZhDQotX1VJX1dvcmtEZWZpbml0aW9uX3R5cGUgPSBEZWZpbmlcdTAwZTdcdTAwZTNvIGRlIFRyYWJhbGhvDQotX1VJX1N0ZXBfdHlwZSA9IEV0YXBhDQotX1VJX0d1aWRhbmNlX3R5cGUgPSBPcmllbnRhXHUwMGU3XHUwMGUzbw0KLV9VSV9BcnRpZmFjdF90eXBlID0gQXJ0ZWZhdG8NCi1fVUlfRGVsaXZlcmFibGVfdHlwZSA9IERpc3RyaWJ1XHUwMGVkdmVsDQotX1VJX091dGNvbWVfdHlwZSA9IFJlc3VsdGFkbw0KLV9VSV9NZXRob2RQYWNrYWdlX3R5cGUgPSBQYWNvdGUgZGUgTVx1MDBlOXRvZG8NCi1fVUlfQ29udGVudFBhY2thZ2VfdHlwZSA9IFBhY290ZSBkZSBDb250ZVx1MDBmYWRvDQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaVx1MDBlN1x1MDBlM28gZGUgQXJ0ZWZhdG8NCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpXHUwMGU3XHUwMGUzbyBkbyBwcm9kdXRvIGRvIHRyYWJhbGhvDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaVx1MDBlN1x1MDBlM28gZGUgZGVsaXZlcmFibGUNCi1fVUlfUm9sZURlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlcdTAwZTdcdTAwZTNvIGRlIEZ1blx1MDBlN1x1MDBlM28NCi1fVUlfVGFza0Rlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlcdTAwZTdcdTAwZTNvIGRhIHRhcmVmYQ0KLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlcdTAwZTdcdTAwZTNvIGRlIE9yaWVudGFcdTAwZTdcdTAwZTNvDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaVx1MDBlN1x1MDBlM28gZGUgUHJcdTAwZTF0aWNhDQotX1VJX1BvaW50X3R5cGUgPSBQb250bw0KLV9VSV9HcmFwaEVsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIEdyXHUwMGUxZmljbw0KLV9VSV9EaWFncmFtRWxlbWVudF90eXBlID0gRWxlbWVudG8gZG8gRGlhZ3JhbWENCi1fVUlfRGlhZ3JhbUxpbmtfdHlwZSA9IExpbmsgZG8gRGlhZ3JhbWENCi1fVUlfR3JhcGhDb25uZWN0b3JfdHlwZSA9IENvbmVjdG9yIEdyXHUwMGUxZmljbw0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBQb250ZSBkZSBNb2RlbG8gU2VtXHUwMGUybnRpY28NCi1fVUlfRGltZW5zaW9uX3R5cGUgPSBEaW1lbnNcdTAwZTNvDQotX1VJX1JlZmVyZW5jZV90eXBlID0gUmVmZXJcdTAwZWFuY2lhDQotX1VJX1Byb3BlcnR5X3R5cGUgPSBQcm9wcmllZGFkZQ0KLV9VSV9HcmFwaEVkZ2VfdHlwZSA9IExpbmhhIGRvIEdyXHUwMGUxZmljbw0KLV9VSV9EaWFncmFtX3R5cGUgPSBEaWFncmFtYQ0KLV9VSV9HcmFwaE5vZGVfdHlwZSA9IE5cdTAwZjMgZG8gR3JcdTAwZTFmaWNvDQotX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGUgPSBFbGVtZW50byBkZSBNb2RlbG8gU2VtXHUwMGUybnRpY28gU2ltcGxlcw0KLV9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBQb250ZSBkZSBNb2RlbG8gU2VtXHUwMGUybnRpY28gZGUgVU1BDQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBQb250ZSBkZSBNb2RlbG8gU2VtXHUwMGUybnRpY28gUHJpbmNpcGFsDQotX1VJX0xlYWZFbGVtZW50X3R5cGUgPSBFbGVtZW50byBGb2xoYQ0KLV9VSV9UZXh0RWxlbWVudF90eXBlID0gRWxlbWVudG8gVGV4dG8NCi1fVUlfSW1hZ2VfdHlwZSA9IEltYWdlbQ0KLV9VSV9HcmFwaGljUHJpbWl0aXZlX3R5cGUgPSBHclx1MDBlMWZpY28gU2ltcGxlcw0KLV9VSV9Qb2x5bGluZV90eXBlID0gUG9saWxpbmhhDQotX1VJX0VsbGlwc2VfdHlwZSA9IEVsaXBzZQ0KLV9VSV9BY3Rpdml0eV90eXBlID0gQXRpdmlkYWRlDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X3R5cGUgPSBFbGVtZW50byBkZSBEaXZpc1x1MDBlM28gZGUgVHJhYmFsaG8NCi1fVUlfQnJlYWtkb3duRWxlbWVudF90eXBlID0gRWxlbWVudG8gZGUgRGl2aXNcdTAwZTNvDQotX1VJX01pbGVzdG9uZV90eXBlID0gTWFyY28NCi1fVUlfSXRlcmF0aW9uX3R5cGUgPSBJdGVyYVx1MDBlN1x1MDBlM28NCi1fVUlfUGhhc2VfdHlwZSA9IEZhc2UNCi1fVUlfVGVhbVByb2ZpbGVfdHlwZSA9IFBlcmZpbCBkYSBFcXVpcGUNCi1fVUlfUm9sZURlc2NyaXB0b3JfdHlwZSA9IERlc2NyaXRvciBkYSBGdW5cdTAwZTdcdTAwZTNvDQotX1VJX1dvcmtPcmRlcl90eXBlID0gT3JkZW0gZGUgVHJhYmFsaG8NCi1fVUlfUHJvY2Vzc0VsZW1lbnRfdHlwZSA9IEVsZW1lbnRvIGRvIFByb2Nlc3NvDQotX1VJX1BsYW5uaW5nRGF0YV90eXBlID0gUGxhbmVqYW5kbyBEYWRvcw0KLV9VSV9EZXNjcmlwdG9yX3R5cGUgPSBEZXNjcml0b3INCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX3R5cGUgPSBEZXNjcml0b3IgZG8gUHJvZHV0byBkZSBUcmFiYWxobw0KLV9VSV9UYXNrRGVzY3JpcHRvcl90eXBlID0gRGVzY3JpdG9yIGRlIFRhcmVmYXMNCi1fVUlfQ29tcG9zaXRlUm9sZV90eXBlID0gRnVuXHUwMGU3XHUwMGUzbyBkZSBDb21wb3NpXHUwMGU3XHUwMGUzbw0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaVx1MDBlN1x1MDBlM28gZG8gRWxlbWVudG8gZGUgRGl2aXNcdTAwZTNvDQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fdHlwZSA9IERlc2NyaVx1MDBlN1x1MDBlM28gZGUgQXRpdmlkYWRlDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlcdTAwZTdcdTAwZTNvIGRvIFByb2Nlc3NvIGRlIEVudHJlZ2ENCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlcdTAwZTdcdTAwZTNvIGRvIFByb2Nlc3NvDQotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpXHUwMGU3XHUwMGUzbyBkbyBEZXNjcml0b3INCi1fVUlfQ29uY2VwdF90eXBlID0gQ29uY2VpdG8NCi1fVUlfQ2hlY2tsaXN0X3R5cGUgPSBMaXN0YSBkZSBWZXJpZmljYVx1MDBlN1x1MDBlM28NCi1fVUlfRXhhbXBsZV90eXBlID0gRXhlbXBsbw0KLV9VSV9HdWlkZWxpbmVfdHlwZSA9IERpcmV0cml6DQotX1VJX1JlcG9ydF90eXBlID0gUmVsYXRcdTAwZjNyaW8NCi1fVUlfVGVtcGxhdGVfdHlwZSA9IFRlbXBsYXRlDQotX1VJX1N1cHBvcnRpbmdNYXRlcmlhbF90eXBlID0gTWF0ZXJpYWwgU3Vwb3J0YWRvDQotX1VJX1Rvb2xNZW50b3JfdHlwZSA9IE1lbnRvciBkZSBGZXJyYW1lbnRhcw0KLV9VSV9XaGl0ZXBhcGVyX3R5cGUgPSBXaGl0ZXBhcGVyDQotX1VJX1Rlcm1EZWZpbml0aW9uX3R5cGUgPSBEZWZpbmlcdTAwZTdcdTAwZTNvIGRlIFRlcm1vDQotX1VJX1ByYWN0aWNlX3R5cGUgPSBQclx1MDBlMXRpY2ENCi1fVUlfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3R5cGUgPSBDb25zaWRlcmFcdTAwZTdcdTAwZjVlcyBFc3RpbWF0aXZhcw0KLV9VSV9SZXVzYWJsZUFzc2V0X3R5cGUgPSBSZWN1cnNvIFJldXRpbGl6XHUwMGUxdmVsDQotX1VJX1N0YXRlX3R5cGUgPSBFc3RhZG8NCi1fVUlfVmVydGV4X3R5cGUgPSBWXHUwMGU5cnRpY2UNCi1fVUlfUmVnaW9uX3R5cGUgPSBSZWdpXHUwMGUzbw0KLV9VSV9TdGF0ZU1hY2hpbmVfdHlwZSA9IE1cdTAwZTFxdWluYSBkZSBFc3RhZG8NCi1fVUlfVHJhbnNpdGlvbl90eXBlID0gVHJhbnNpXHUwMGU3XHUwMGUzbw0KLV9VSV9Qc2V1ZG9TdGF0ZV90eXBlID0gUHNldWRvIEVzdGFkbw0KLV9VSV9EaXNjaXBsaW5lX3R5cGUgPSBEaXNjaXBsaW5hDQotX1VJX0NvbnRlbnRDYXRlZ29yeV90eXBlID0gQ2F0ZWdvcmlhIGRlIENvbnRlXHUwMGZhZG8NCi1fVUlfUm9sZVNldF90eXBlID0gRGVmaW5pXHUwMGU3XHUwMGUzbyBkZSBGdW5cdTAwZTdcdTAwZTNvDQotX1VJX0RvbWFpbl90eXBlID0gRG9tXHUwMGVkbmlvDQotX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlID0gVGlwbyBkZSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotX1VJX0Rpc2NpcGxpbmVHcm91cGluZ190eXBlID0gQWdydXBhbWVudG8gZGUgRGlzY2lwbGluYQ0KLV9VSV9Ub29sX3R5cGUgPSBGZXJyYW1lbnRhDQotX1VJX1JvbGVTZXRHcm91cGluZ190eXBlID0gQWdydXBhbWVudG8gZGUgQ29uZmlndXJhXHUwMGU3XHUwMGUzbyBkZSBGdW5cdTAwZTdcdTAwZjVlcw0KLV9VSV9DdXN0b21DYXRlZ29yeV90eXBlID0gQ2F0ZWdvcmlhIFBlcnNvbmFsaXphZGENCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUgPSBQcm9jZXNzbyBkZSBFbnRyZWdhDQotX1VJX1Byb2Nlc3NfdHlwZSA9IFByb2Nlc3NvDQotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuX3R5cGUgPSBQYWRyXHUwMGUzbyBkZSBSZWN1cnNvDQotX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX3R5cGUgPSBHYWJhcml0byBkZSBQbGFuZWphbWVudG8gZGUgUHJvY2Vzc28NCi1fVUlfUm9hZG1hcF90eXBlID0gUm90ZWlybw0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50X3R5cGUgPSBQcm9jZXNzYXIgQ29tcG9uZW50ZQ0KLV9VSV9Qcm9jZXNzUGFja2FnZV90eXBlID0gUGFjb3RlIGRlIFByb2Nlc3NvDQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfdHlwZSA9IEludGVyZmFjZSBkbyBDb21wb25lbnRlIGRlIFByb2Nlc3NvDQotX1VJX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX3R5cGUgPSBEZXNjcml0b3IgZG8gQ29tcG9uZW50ZSBkZSBQcm9jZXNzbw0KLV9VSV9NZXRob2RQbHVnaW5fdHlwZSA9IFBsdWctaW4gZGUgTVx1MDBlOXRvZG8NCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3R5cGUgPSBFbGVtZW50byBkZSBWYXJpYVx1MDBlN1x1MDBlM28NCi1fVUlfTWV0aG9kVW5pdF90eXBlID0gVW5pZGFkZSBkZSBNXHUwMGU5dG9kbw0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUgPSBDb25maWd1cmFcdTAwZTdcdTAwZTNvIGRlIE1cdTAwZTl0b2RvDQotX1VJX1Byb2Nlc3NGYW1pbHlfdHlwZSA9IEZhbVx1MDBlZGxpYSBkZSBQcm9jZXNzbw0KLV9VSV9NZXRob2RMaWJyYXJ5X3R5cGUgPSBCaWJsaW90ZWNhIGRlIE1cdTAwZTl0b2Rvcw0KLV9VSV9Vbmtub3duX3R5cGUgPSBPYmpldG8NCi0NCi1fVUlfVW5rbm93bl9kYXRhdHlwZT0gVmFsb3INCi0NCi1fVUlfTmFtZWRFbGVtZW50X25hbWVfZmVhdHVyZSA9IE5vbWUNCi1fVUlfTWV0aG9kRWxlbWVudF9ndWlkX2ZlYXR1cmUgPSBHdWlkDQotX1VJX01ldGhvZEVsZW1lbnRfYnJpZWZEZXNjcmlwdGlvbl9mZWF0dXJlID0gQnJldmUgRGVzY3JpXHUwMGU3XHUwMGUzbw0KLV9VSV9NZXRob2RFbGVtZW50X293bmVkUnVsZXNfZmVhdHVyZSA9IFJlZ3JhcyBPYnRpZGFzDQotX1VJX01ldGhvZEVsZW1lbnRfc3VwcHJlc3NlZF9mZWF0dXJlID0gU3VwcmltaWRvDQotX1VJX01ldGhvZEVsZW1lbnRfb3JkZXJpbmdHdWlkZV9mZWF0dXJlID0gR3VpYSBkZSBQZWRpZG8NCi1fVUlfQ29uc3RyYWludF9ib2R5X2ZlYXR1cmUgPSBDb3Jwbw0KLV9VSV9Db250ZW50RWxlbWVudF9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUgPSBNYXRlcmlhaXMgZGUgU3Vwb3J0ZQ0KLV9VSV9Db250ZW50RWxlbWVudF9jb25jZXB0c0FuZFBhcGVyc19mZWF0dXJlID0gQ29uY2VpdG9zIGUgRG9jdW1lbnRvcw0KLV9VSV9Db250ZW50RWxlbWVudF9jaGVja2xpc3RzX2ZlYXR1cmUgPSBMaXN0YXMgZGUgVmVyaWZpY2FcdTAwZTdcdTAwZTNvDQotX1VJX0NvbnRlbnRFbGVtZW50X2d1aWRlbGluZXNfZmVhdHVyZSA9IERpcmV0cml6ZXMNCi1fVUlfQ29udGVudEVsZW1lbnRfZXhhbXBsZXNfZmVhdHVyZSA9IEV4ZW1wbG9zDQotX1VJX0NvbnRlbnRFbGVtZW50X2Fzc2V0c19mZWF0dXJlID0gQXRpdm9zDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25OYW1lX2ZlYXR1cmUgPSBOb21lIGRlIEFwcmVzZW50YVx1MDBlN1x1MDBlM28NCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9mZWF0dXJlID0gQXByZXNlbnRhXHUwMGU3XHUwMGUzbw0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfc2hhcGVpY29uX2ZlYXR1cmUgPSBTaGFwZWljb24NCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X25vZGVpY29uX2ZlYXR1cmUgPSBOb2RlaWNvbg0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fbWFpbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBEZXNjcmlcdTAwZTdcdTAwZTNvIFByaW5jaXBhbA0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fc2VjdGlvbnNfZmVhdHVyZSA9IFNlXHUwMGU3XHUwMGY1ZXMNCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX2tleUNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBDb25zaWRlcmFcdTAwZTdcdTAwZjVlcyBkZSBUZWNsYXMNCi1fVUlfU2VjdGlvbl9zZWN0aW9uTmFtZV9mZWF0dXJlID0gTm9tZSBkYSBTZVx1MDBlN1x1MDBlM28NCi1fVUlfU2VjdGlvbl9zZWN0aW9uRGVzY3JpcHRpb25fZmVhdHVyZSA9IERlc2NyaVx1MDBlN1x1MDBlM28gZGEgU2VcdTAwZTdcdTAwZTNvDQotX1VJX1NlY3Rpb25fc3ViU2VjdGlvbnNfZmVhdHVyZSA9IFN1Yi1zZVx1MDBlN1x1MDBmNWVzDQotX1VJX1NlY3Rpb25fcHJlZGVjZXNzb3JfZmVhdHVyZSA9IFByZWRlY2Vzc29yDQotX1VJX1JvbGVfbW9kaWZpZXNfZmVhdHVyZSA9IE1vZGlmaWNhDQotX1VJX1JvbGVfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFJlc3BvbnNcdTAwZTF2ZWwgcG9yDQotX1VJX1dvcmtQcm9kdWN0X3JlcG9ydHNfZmVhdHVyZSA9IFJlbGF0XHUwMGYzcmlvcw0KLV9VSV9Xb3JrUHJvZHVjdF90ZW1wbGF0ZXNfZmVhdHVyZSA9IEdhYmFyaXRvcw0KLV9VSV9Xb3JrUHJvZHVjdF90b29sTWVudG9yc19mZWF0dXJlID0gTWVudG9yZXMgZGUgRmVycmFtZW50YXMNCi1fVUlfV29ya1Byb2R1Y3RfZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBDb25zaWRlcmFcdTAwZTdcdTAwZjVlcyBFc3RpbWF0aXZhcw0KLV9VSV9UYXNrX3BlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBSZWFsaXphZG8gcG9yDQotX1VJX1Rhc2tfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSA9IEVudHJhZGEgT2JyaWdhdFx1MDBmM3JpYQ0KLV9VSV9UYXNrX291dHB1dF9mZWF0dXJlID0gU2FcdTAwZWRkYQ0KLV9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBEZXNlbXBlbmhhZG8gQWRpY2lvbmFsbWVudGUgcG9yDQotX1VJX1Rhc2tfb3B0aW9uYWxJbnB1dF9mZWF0dXJlID0gRW50cmFkYSBPcGNpb25hbA0KLV9VSV9UYXNrX3N0ZXBzX2ZlYXR1cmUgPSBFdGFwYXMNCi1fVUlfVGFza190b29sTWVudG9yc19mZWF0dXJlID0gTWVudG9yZXMgZGUgRmVycmFtZW50YXMNCi1fVUlfVGFza19lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IENvbnNpZGVyYVx1MDBlN1x1MDBmNWVzIEVzdGltYXRpdmFzDQotX1VJX1dvcmtEZWZpbml0aW9uX3ByZWNvbmRpdGlvbl9mZWF0dXJlID0gUHJcdTAwZTktY29uZGlcdTAwZTdcdTAwZTNvDQotX1VJX1dvcmtEZWZpbml0aW9uX3Bvc3Rjb25kaXRpb25fZmVhdHVyZSA9IFBcdTAwZjNzLWNvbmRpXHUwMGU3XHUwMGUzbw0KLV9VSV9BcnRpZmFjdF9jb250YWluZXJBcnRpZmFjdF9mZWF0dXJlID0gQXJ0ZWZhdG8gZG8gQ29udFx1MDBlYWluZXINCi1fVUlfQXJ0aWZhY3RfY29udGFpbmVkQXJ0aWZhY3RzX2ZlYXR1cmUgPSBBcnRlZmF0byBDb250aWRvDQotX1VJX0RlbGl2ZXJhYmxlX2RlbGl2ZXJlZFdvcmtQcm9kdWN0c19mZWF0dXJlID0gUHJvZHV0b3MgZGUgVHJhYmFsaG8gRW50cmVndWVzDQotX1VJX01ldGhvZFBhY2thZ2VfZ2xvYmFsX2ZlYXR1cmUgPSBHbG9iYWwNCi1fVUlfTWV0aG9kUGFja2FnZV9yZXVzZWRQYWNrYWdlc19mZWF0dXJlID0gUGFjb3RlcyBSZXV0aWxpemFkb3MNCi1fVUlfTWV0aG9kUGFja2FnZV9wYXJlbnRQYWNrYWdlX2ZlYXR1cmUgPSBQYWNvdGUgUGFpDQotX1VJX01ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19mZWF0dXJlID0gUGFjb3RlcyBGaWxob3MNCi1fVUlfQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX2ZlYXR1cmUgPSBFbGVtZW50b3MgZGUgQ29udGVcdTAwZmFkbw0KLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX2JyaWVmT3V0bGluZV9mZWF0dXJlID0gQnJldmUgUmVzdW1vDQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25PcHRpb25zX2ZlYXR1cmUgPSBPcFx1MDBlN1x1MDBmNWVzIGRlIFJlcHJlc2VudGFcdTAwZTdcdTAwZTNvDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlID0gSUQgZXh0ZXJubw0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IE9iamV0aXZvDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25faW1wYWN0T2ZOb3RIYXZpbmdfZmVhdHVyZSA9IEltcGFjdG8gQ2F1c2FkbyBwZWxhIE5cdTAwZTNvIE9idGVuXHUwMGU3XHUwMGUzbw0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3JlYXNvbnNGb3JOb3ROZWVkaW5nX2ZlYXR1cmUgPSBNb3Rpdm9zIGRhIE5cdTAwZTNvIE9icmlnYXRvcmllZGFkZQ0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX2V4dGVybmFsRGVzY3JpcHRpb25fZmVhdHVyZSA9IERlc2NyaVx1MDBlN1x1MDBlM28gRXh0ZXJuYQ0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3BhY2thZ2luZ0d1aWRhbmNlX2ZlYXR1cmUgPSBPcmllbnRhXHUwMGU3XHUwMGUzbyBkZSBQYWNvdGUNCi1fVUlfUm9sZURlc2NyaXB0aW9uX3NraWxsc19mZWF0dXJlID0gSGFiaWxpZGFkZXMNCi1fVUlfUm9sZURlc2NyaXB0aW9uX2Fzc2lnbm1lbnRBcHByb2FjaGVzX2ZlYXR1cmUgPSBBYm9yZGFnZW5zIGRhIERlc2lnbmFcdTAwZTdcdTAwZTNvDQotX1VJX1JvbGVEZXNjcmlwdGlvbl9zeW5vbnltc19mZWF0dXJlID0gU2luXHUwMGY0bmltb3MNCi1fVUlfVGFza0Rlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IE9iamV0aXZvDQotX1VJX1Rhc2tEZXNjcmlwdGlvbl9hbHRlcm5hdGl2ZXNfZmVhdHVyZSA9IEFsdGVybmF0aXZhcw0KLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX2F0dGFjaG1lbnRzX2ZlYXR1cmUgPSBBbmV4b3MNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hZGRpdGlvbmFsSW5mb19mZWF0dXJlID0gSW5mb3JtYVx1MDBlN1x1MDBmNWVzIEFkaWNpb25haXMNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9wcm9ibGVtX2ZlYXR1cmUgPSBQcm9ibGVtYQ0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2JhY2tncm91bmRfZmVhdHVyZSA9IEluZm9ybWFcdTAwZTdcdTAwZjVlcyBEZXRhbGhhZGFzDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fZ29hbHNfZmVhdHVyZSA9IE1ldGFzDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYXBwbGljYXRpb25fZmVhdHVyZSA9IEFwbGljYXRpdm8NCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9sZXZlbHNPZkFkb3B0aW9uX2ZlYXR1cmUgPSBOXHUwMGVkdmVpcyBkZSBBZG9cdTAwZTdcdTAwZTNvDQotX1VJX1BvaW50X3hfZmVhdHVyZSA9IFgNCi1fVUlfUG9pbnRfeV9mZWF0dXJlID0gWQ0KLV9VSV9HcmFwaEVsZW1lbnRfcG9zaXRpb25fZmVhdHVyZSA9IFBvc2lcdTAwZTdcdTAwZTNvDQotX1VJX0dyYXBoRWxlbWVudF9jb250YWluZWRfZmVhdHVyZSA9IENvbnRpZG8NCi1fVUlfR3JhcGhFbGVtZW50X2xpbmtfZmVhdHVyZSA9IExpbmsNCi1fVUlfR3JhcGhFbGVtZW50X2FuY2hvcmFnZV9mZWF0dXJlID0gQW5jb3JhZ2VtDQotX1VJX0dyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX2ZlYXR1cmUgPSBNb2RlbG8gU2VtXHUwMGUybnRpY28NCi1fVUlfRGlhZ3JhbUVsZW1lbnRfaXNWaXNpYmxlX2ZlYXR1cmUgPSBcdTAwYzkgVmlzXHUwMGVkdmVsDQotX1VJX0RpYWdyYW1FbGVtZW50X2NvbnRhaW5lcl9mZWF0dXJlID0gQ29udGFpbmVyDQotX1VJX0RpYWdyYW1FbGVtZW50X3JlZmVyZW5jZV9mZWF0dXJlID0gUmVmZXJcdTAwZWFuY2lhDQotX1VJX0RpYWdyYW1FbGVtZW50X3Byb3BlcnR5X2ZlYXR1cmUgPSBQcm9wcmllZGFkZQ0KLV9VSV9EaWFncmFtTGlua196b29tX2ZlYXR1cmUgPSBab29tDQotX1VJX0RpYWdyYW1MaW5rX3ZpZXdwb3J0X2ZlYXR1cmUgPSBQb3J0YSBkZSBWaXN1YWxpemFcdTAwZTdcdTAwZTNvDQotX1VJX0RpYWdyYW1MaW5rX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gRWxlbWVudG8gR3JcdTAwZTFmaWNvDQotX1VJX0RpYWdyYW1MaW5rX2RpYWdyYW1fZmVhdHVyZSA9IERpYWdyYW1hDQotX1VJX0dyYXBoQ29ubmVjdG9yX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gRWxlbWVudG8gR3JcdTAwZTFmaWNvDQotX1VJX0dyYXBoQ29ubmVjdG9yX2dyYXBoRWRnZV9mZWF0dXJlID0gTGluaGEgZG8gR3JcdTAwZTFmaWNvDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBBcHJlc2VudGFcdTAwZTdcdTAwZTNvDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBFbGVtZW50byBHclx1MDBlMWZpY28NCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9kaWFncmFtX2ZlYXR1cmUgPSBEaWFncmFtYQ0KLV9VSV9EaW1lbnNpb25fd2lkdGhfZmVhdHVyZSA9IExhcmd1cmENCi1fVUlfRGltZW5zaW9uX2hlaWdodF9mZWF0dXJlID0gQWx0dXJhDQotX1VJX1JlZmVyZW5jZV9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbl9mZWF0dXJlID0gXHUwMGM5IFJlcHJlc2VudGFcdTAwZTdcdTAwZTNvIEluZGl2aWR1YWwNCi1fVUlfUmVmZXJlbmNlX3JlZmVyZW5jZWRfZmVhdHVyZSA9IFJlZmVyXHUwMGVhbmNpYQ0KLV9VSV9Qcm9wZXJ0eV9rZXlfZmVhdHVyZSA9IENoYXZlDQotX1VJX1Byb3BlcnR5X3ZhbHVlX2ZlYXR1cmUgPSBWYWxvcg0KLV9VSV9HcmFwaEVkZ2VfYW5jaG9yX2ZlYXR1cmUgPSBcdTAwYzJuY29yYQ0KLV9VSV9HcmFwaEVkZ2Vfd2F5cG9pbnRzX2ZlYXR1cmUgPSBQb250b3MgZGUgVmVyaWZpY2FcdTAwZTdcdTAwZTNvDQotX1VJX0RpYWdyYW1fem9vbV9mZWF0dXJlID0gWm9vbQ0KLV9VSV9EaWFncmFtX3ZpZXdwb2ludF9mZWF0dXJlID0gUG9udG8gZGUgRXhpYmlcdTAwZTdcdTAwZTNvDQotX1VJX0RpYWdyYW1fZGlhZ3JhbUxpbmtfZmVhdHVyZSA9IExpbmsgZG8gRGlhZ3JhbWENCi1fVUlfRGlhZ3JhbV9uYW1lc3BhY2VfZmVhdHVyZSA9IEVzcGFcdTAwZTdvIGRlIE5vbWVzDQotX1VJX0dyYXBoTm9kZV9zaXplX2ZlYXR1cmUgPSBUYW1hbmhvDQotX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGVJbmZvX2ZlYXR1cmUgPSBJbmZvcm1hXHUwMGU3XHUwMGUzbyBkZSBUaXBvDQotX1VJX1VNQVNlbWFudGljTW9kZWxCcmlkZ2VfZWxlbWVudF9mZWF0dXJlID0gRWxlbWVudG8NCi1fVUlfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VfZWxlbWVudF9mZWF0dXJlID0gRWxlbWVudG8NCi1fVUlfVGV4dEVsZW1lbnRfdGV4dF9mZWF0dXJlID0gVGV4dG8NCi1fVUlfSW1hZ2VfdXJpX2ZlYXR1cmUgPSBVcmkNCi1fVUlfSW1hZ2VfbWltZVR5cGVfZmVhdHVyZSA9IFRpcG8gZGUgTWltZQ0KLV9VSV9Qb2x5bGluZV9jbG9zZWRfZmVhdHVyZSA9IEZlY2hhcg0KLV9VSV9Qb2x5bGluZV93YXlwb2ludHNfZmVhdHVyZSA9IFBvbnRvcyBkZSBWZXJpZmljYVx1MDBlN1x1MDBlM28NCi1fVUlfRWxsaXBzZV9yYWRpdXNYX2ZlYXR1cmUgPSBSYWlvIFgNCi1fVUlfRWxsaXBzZV9yYWRpdXNZX2ZlYXR1cmUgPSBSYWlvIFkNCi1fVUlfRWxsaXBzZV9yb3RhdGlvbl9mZWF0dXJlID0gUm90YVx1MDBlN1x1MDBlM28NCi1fVUlfRWxsaXBzZV9zdGFydEFuZ2xlX2ZlYXR1cmUgPSBcdTAwYzJuZ3VsbyBJbmljaWFsDQotX1VJX0VsbGlwc2VfZW5kQW5nbGVfZmVhdHVyZSA9IFx1MDBjMm5ndWxvIEZpbmFsDQotX1VJX0VsbGlwc2VfY2VudGVyX2ZlYXR1cmUgPSBDZW50cm8NCi1fVUlfQWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfZmVhdHVyZSA9IEVsZW1lbnRvcyBkZSBEaXZpc1x1MDBlM28NCi1fVUlfQWN0aXZpdHlfcm9hZG1hcHNfZmVhdHVyZSA9IE1hcGFzIGRlIFJvdGFzDQotX1VJX0FjdGl2aXR5X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSA9IE1hdGVyaWFpcyBkZSBTdXBvcnRlDQotX1VJX0FjdGl2aXR5X2NoZWNrbGlzdHNfZmVhdHVyZSA9IExpc3RhcyBkZSBWZXJpZmljYVx1MDBlN1x1MDBlM28NCi1fVUlfQWN0aXZpdHlfY29uY2VwdHNfZmVhdHVyZSA9IENvbmNlaXRvcw0KLV9VSV9BY3Rpdml0eV9leGFtcGxlc19mZWF0dXJlID0gRXhlbXBsb3MNCi1fVUlfQWN0aXZpdHlfZ3VpZGVsaW5lc19mZWF0dXJlID0gRGlyZXRyaXplcw0KLV9VSV9BY3Rpdml0eV9yZXVzYWJsZUFzc2V0c19mZWF0dXJlID0gUmVjdXJzb3MgUmV1dGlsaXpcdTAwZTF2ZWlzDQotX1VJX0FjdGl2aXR5X2lzRW5hY3RhYmxlX2ZlYXR1cmUgPSBcdTAwYzkgT3JkZW5cdTAwZTF2ZWwNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNSZXBlYXRhYmxlX2ZlYXR1cmUgPSBcdTAwYzkgUG9zc1x1MDBlZHZlbCBSZXBldGlyDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzT25nb2luZ19mZWF0dXJlID0gXHUwMGM5IENvbnRcdTAwZWRudW8NCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNFdmVudERyaXZlbl9mZWF0dXJlID0gXHUwMGM5IEV2ZW50byBPcmllbnRhZG8NCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfbGlua1RvUHJlZGVjZXNzb3JfZmVhdHVyZSA9IExpbmsgcGFyYSBQcmVkZWNlc3Nvcg0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZWZpeF9mZWF0dXJlID0gUHJlZml4bw0KLV9VSV9CcmVha2Rvd25FbGVtZW50X2lzUGxhbm5lZF9mZWF0dXJlID0gXHUwMGM5IFBsYW5lamFkbw0KLV9VSV9CcmVha2Rvd25FbGVtZW50X2hhc011bHRpcGxlT2NjdXJyZW5jZXNfZmVhdHVyZSA9IEV4aXN0ZSBWXHUwMGUxcmlhcyBPY29yclx1MDBlYW5jaWFzDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNPcHRpb25hbF9mZWF0dXJlID0gXHUwMGM5IE9wY2lvbmFsDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQWZ0ZXJfZmVhdHVyZSA9IFBvc3Rlcmlvcm1lbnRlIEFwcmVzZW50YWRvDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQmVmb3JlX2ZlYXR1cmUgPSBBbnRlcmlvcm1lbnRlIEFwcmVzZW50YWRvDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcGxhbm5pbmdEYXRhX2ZlYXR1cmUgPSBQbGFuZWphbmRvIERhZG9zDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfc3VwZXJBY3Rpdml0aWVzX2ZlYXR1cmUgPSBTdXBlcmF0aXZpZGFkZXMNCi1fVUlfVGVhbVByb2ZpbGVfdGVhbVJvbGVzX2ZlYXR1cmUgPSBGdW5cdTAwZTdcdTAwZjVlcyBkYSBFcXVpcGUNCi1fVUlfVGVhbVByb2ZpbGVfc3VwZXJUZWFtX2ZlYXR1cmUgPSBTdXBlcmVxdWlwZQ0KLV9VSV9UZWFtUHJvZmlsZV9zdWJUZWFtX2ZlYXR1cmUgPSBTdWJlcXVpcGUNCi1fVUlfUm9sZURlc2NyaXB0b3JfUm9sZV9mZWF0dXJlID0gRnVuXHUwMGU3XHUwMGUzbw0KLV9VSV9Sb2xlRGVzY3JpcHRvcl9tb2RpZmllc19mZWF0dXJlID0gTW9kaWZpY2ENCi1fVUlfUm9sZURlc2NyaXB0b3JfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFJlc3BvbnNcdTAwZTF2ZWwgcG9yDQotX1VJX1dvcmtPcmRlcl9saW5rVHlwZV9mZWF0dXJlID0gVGlwbyBkZSBMaW5rDQotX1VJX1dvcmtPcmRlcl9wcmVkX2ZlYXR1cmUgPSBQcmVkDQotX1VJX1BsYW5uaW5nRGF0YV9zdGFydERhdGVfZmVhdHVyZSA9IERhdGEgZGUgSW5cdTAwZWRjaW8NCi1fVUlfUGxhbm5pbmdEYXRhX2ZpbmlzaERhdGVfZmVhdHVyZSA9IERhdGEgZGUgQ29uY2x1c1x1MDBlM28NCi1fVUlfUGxhbm5pbmdEYXRhX3JhbmtfZmVhdHVyZSA9IFBvc2lcdTAwZTdcdTAwZTNvDQotX1VJX0Rlc2NyaXB0b3JfaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlX2ZlYXR1cmUgPSBcdTAwYzkgU2luY3Jvbml6YWRvIGNvbSBhIE9yaWdlbQ0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFbnRyeVN0YXRlX2ZlYXR1cmUgPSBFc3RhZG8gZGUgRW50cmFkYSBkYSBBdGl2aWRhZGUNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RXhpdFN0YXRlX2ZlYXR1cmUgPSBFc3RhZG8gZGUgU2FcdTAwZWRkYSBkYSBBdGl2aWRhZGUNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0X2ZlYXR1cmUgPSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RlZEJ5X2ZlYXR1cmUgPSBJbXBhY3RhZG8gUG9yDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RzX2ZlYXR1cmUgPSBJbXBhY3Rvcw0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfZGVsaXZlcmFibGVQYXJ0c19mZWF0dXJlID0gUGFydGVzIERpc3RyaWJ1XHUwMGVkdmVpcw0KLV9VSV9UYXNrRGVzY3JpcHRvcl9UYXNrX2ZlYXR1cmUgPSBUYXJlZmENCi1fVUlfVGFza0Rlc2NyaXB0b3JfYWRkaXRpb25hbGx5UGVyZm9ybWVkQnlfZmVhdHVyZSA9IEV4ZWN1dG9yIFNlY3VuZFx1MDBlMXJpbw0KLV9VSV9UYXNrRGVzY3JpcHRvcl9hc3Npc3RlZEJ5X2ZlYXR1cmUgPSBBc3Npc3RcdTAwZWFuY2lhIGRlDQotX1VJX1Rhc2tEZXNjcmlwdG9yX2V4dGVybmFsSW5wdXRfZmVhdHVyZSA9IEVudHJhZGEgRXh0ZXJuYQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9tYW5kYXRvcnlJbnB1dF9mZWF0dXJlID0gRW50cmFkYSBPYnJpZ2F0XHUwMGYzcmlhDQotX1VJX1Rhc2tEZXNjcmlwdG9yX29wdGlvbmFsSW5wdXRfZmVhdHVyZSA9IEVudHJhZGEgT3BjaW9uYWwNCi1fVUlfVGFza0Rlc2NyaXB0b3Jfb3V0cHV0X2ZlYXR1cmUgPSBTYVx1MDBlZGRhDQotX1VJX1Rhc2tEZXNjcmlwdG9yX3BlcmZvcm1lZFByaW1hcmlseUJ5X2ZlYXR1cmUgPSBFeGVjdXRvciBQcmltXHUwMGUxcmlvDQotX1VJX1Rhc2tEZXNjcmlwdG9yX3NlbGVjdGVkU3RlcHNfZmVhdHVyZSA9IEV0YXBhcyBTZWxlY2lvbmFkYXMNCi1fVUlfQ29tcG9zaXRlUm9sZV9hZ2dyZWdhdGVkUm9sZXNfZmVhdHVyZSA9IEZ1blx1MDBlN1x1MDBmNWVzIEFncmVnYWRhcw0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdXNhZ2VHdWlkYW5jZV9mZWF0dXJlID0gT3JpZW50YVx1MDBlN1x1MDBlM28gZGUgVXNvDQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gT2JqZXRpdm8NCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9hbHRlcm5hdGl2ZXNfZmVhdHVyZSA9IEFsdGVybmF0aXZhcw0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2hvd3RvU3RhZmZfZmVhdHVyZSA9IEVxdWlwZSBkZSBUYXJlZmFzDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3NjYWxlX2ZlYXR1cmUgPSBFc2NhbGENCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdENoYXJhY3RlcmlzdGljc19mZWF0dXJlID0gQ2FyYWN0ZXJcdTAwZWRzdGljYXMgZG8gUHJvamV0bw0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9yaXNrTGV2ZWxfZmVhdHVyZSA9IE5cdTAwZWR2ZWwgZGUgUmlzY28NCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fZXN0aW1hdGluZ1RlY2huaXF1ZV9mZWF0dXJlID0gVFx1MDBlOWNuaWNhIGRlIEVzdGltYXRpdmENCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdE1lbWJlckV4cGVydGlzZV9mZWF0dXJlID0gQ29uaGVjaW1lbnRvIGRvIE1lbWJybyBkbyBQcm9qZXRvDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGVPZkNvbnRyYWN0X2ZlYXR1cmUgPSBUaXBvIGRlIENvbnRyYXRvDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBJRCBleHRlcm5vDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9zY29wZV9mZWF0dXJlID0gRXNjb3BvDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl91c2FnZU5vdGVzX2ZlYXR1cmUgPSBOb3RhcyBkZSBVc28NCi1fVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3JlZmluZWREZXNjcmlwdGlvbl9mZWF0dXJlID0gRGVzY3JpXHUwMGU3XHUwMGUzbyBSZWZpbmFkYQ0KLV9VSV9QcmFjdGljZV9zdWJQcmFjdGljZXNfZmVhdHVyZSA9IFN1YnByXHUwMGUxdGljYXMNCi1fVUlfUHJhY3RpY2VfY29udGVudFJlZmVyZW5jZXNfZmVhdHVyZSA9IFJlZmVyXHUwMGVhbmNpYXMgZGUgQ29udGVcdTAwZmFkbw0KLV9VSV9QcmFjdGljZV9hY3Rpdml0eVJlZmVyZW5jZXNfZmVhdHVyZSA9IFJlZmVyXHUwMGVhbmNpYXMgZGUgQXRpdmlkYWRlDQotX1VJX1N0YXRlX1dvcmtQcm9kdWN0X2ZlYXR1cmUgPSBQcm9kdXRvIGRlIFRyYWJhbGhvDQotX1VJX1N0YXRlX1JlZ2lvbl9mZWF0dXJlID0gUmVnaVx1MDBlM28NCi1fVUlfU3RhdGVfc3VibWFjaGluZV9mZWF0dXJlID0gU3VibVx1MDBlMXF1aW5hDQotX1VJX1ZlcnRleF9jb250YWluZXJfZmVhdHVyZSA9IENvbnRhaW5lcg0KLV9VSV9WZXJ0ZXhfb3V0Z29pbmdfZmVhdHVyZSA9IFNhXHUwMGVkZGENCi1fVUlfVmVydGV4X2luY29taW5nX2ZlYXR1cmUgPSBFbnRyYWRhDQotX1VJX1JlZ2lvbl9WZXJ0ZXhfZmVhdHVyZSA9IFZcdTAwZTlydGljZQ0KLV9VSV9SZWdpb25fVHJhbnNpdGlvbl9mZWF0dXJlID0gVHJhbnNpXHUwMGU3XHUwMGUzbw0KLV9VSV9SZWdpb25fU3RhdGVfZmVhdHVyZSA9IEVzdGFkbw0KLV9VSV9SZWdpb25fU3RhdGVNYWNoaW5lX2ZlYXR1cmUgPSBNXHUwMGUxcXVpbmEgZGUgRXN0YWRvDQotX1VJX1N0YXRlTWFjaGluZV9SZWdpb25fZmVhdHVyZSA9IFJlZ2lcdTAwZTNvDQotX1VJX1RyYW5zaXRpb25fV29ya0RlZmluaXRpb25fZmVhdHVyZSA9IERlZmluaVx1MDBlN1x1MDBlM28gZGUgVHJhYmFsaG8NCi1fVUlfVHJhbnNpdGlvbl9jb250YWluZXJfZmVhdHVyZSA9IENvbnRhaW5lcg0KLV9VSV9UcmFuc2l0aW9uX3NvdXJjZV9mZWF0dXJlID0gT3JpZ2VtDQotX1VJX1RyYW5zaXRpb25fdGFyZ2V0X2ZlYXR1cmUgPSBEZXN0aW5vDQotX1VJX0Rpc2NpcGxpbmVfdGFza3NfZmVhdHVyZSA9IFRhcmVmYXMNCi1fVUlfRGlzY2lwbGluZV9zdWJkaXNjaXBsaW5lX2ZlYXR1cmUgPSBTdWJkaXNjaXBsaW5hDQotX1VJX0Rpc2NpcGxpbmVfcmVmZXJlbmNlV29ya2Zsb3dzX2ZlYXR1cmUgPSBGbHV4b3MgZGUgVHJhYmFsaG8gZGUgUmVmZXJcdTAwZWFuY2lhDQotX1VJX1JvbGVTZXRfcm9sZXNfZmVhdHVyZSA9IEZ1blx1MDBlN1x1MDBmNWVzDQotX1VJX0RvbWFpbl93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFByb2R1dG9zICAgICAgICAgICBkZSBUcmFiYWxobw0KLV9VSV9Eb21haW5fc3ViZG9tYWluc19mZWF0dXJlID0gU3ViZG9tXHUwMGVkbmlvcw0KLV9VSV9Xb3JrUHJvZHVjdFR5cGVfd29ya1Byb2R1Y3RzX2ZlYXR1cmUgPSBQcm9kdXRvcyAgICAgICAgICAgZGUgVHJhYmFsaG8NCi1fVUlfRGlzY2lwbGluZUdyb3VwaW5nX2Rpc2NpcGxpbmVzX2ZlYXR1cmUgPSBEaXNjaXBsaW5hcw0KLV9VSV9Ub29sX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBNZW50b3JlcyBkZSBGZXJyYW1lbnRhcw0KLV9VSV9Sb2xlU2V0R3JvdXBpbmdfcm9sZVNldHNfZmVhdHVyZSA9IENvbmp1bnRvcyBkZSBGdW5cdTAwZTdcdTAwZjVlcw0KLV9VSV9DdXN0b21DYXRlZ29yeV9jYXRlZ29yaXplZEVsZW1lbnRzX2ZlYXR1cmUgPSBFbGVtZW50b3MgQ2F0ZWdvcml6YWRvcw0KLV9VSV9DdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX2ZlYXR1cmUgPSBTdWJjYXRlZ29yaWFzDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc19lZHVjYXRpb25NYXRlcmlhbHNfZmVhdHVyZSA9IE1hdGVyaWFpcyBkZSBFZHVjYVx1MDBlN1x1MDBlM28NCi1fVUlfRGVsaXZlcnlQcm9jZXNzX2NvbW11bmljYXRpb25zTWF0ZXJpYWxzX2ZlYXR1cmUgPSBNYXRlcmlhaXMgZGUgQ29tdW5pY2FcdTAwZTdcdTAwZjVlcw0KLV9VSV9Qcm9jZXNzX2luY2x1ZGVzUGF0dGVybnNfZmVhdHVyZSA9IFBhZHJcdTAwZjVlcyBJbmNsdVx1MDBlZGRvcw0KLV9VSV9Qcm9jZXNzX2RlZmF1bHRDb250ZXh0X2ZlYXR1cmUgPSBDb250ZXh0byBQYWRyXHUwMGUzbw0KLV9VSV9Qcm9jZXNzX3ZhbGlkQ29udGV4dF9mZWF0dXJlID0gQ29udGV4dG8gVlx1MDBlMWxpZG8NCi1fVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfYmFzZWRPblByb2Nlc3Nlc19mZWF0dXJlID0gQmFzZWFkbyBlbSBQcm9jZXNzb3MNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudF9pbnRlcmZhY2VzX2ZlYXR1cmUgPSBJbnRlcmZhY2VzDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19mZWF0dXJlID0gUHJvY2Vzc28NCi1fVUlfUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX2ZlYXR1cmUgPSBFbGVtZW50b3MgZGUgUHJvY2Vzc28NCi1fVUlfUHJvY2Vzc1BhY2thZ2VfZGlhZ3JhbXNfZmVhdHVyZSA9IERpYWdyYW1hcw0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZVNwZWNpZmljYXRpb25zX2ZlYXR1cmUgPSBFc3BlY2lmaWNhXHUwMGU3XHUwMGY1ZXMgZGUgSW50ZXJmYWNlDQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlSU9fZmVhdHVyZSA9IEUvUyBkYSBJbnRlcmZhY2UNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfUHJvY2Vzc0NvbXBvbmVudF9mZWF0dXJlID0gUHJvY2Vzc2FyIENvbXBvbmVudGUNCi1fVUlfTWV0aG9kUGx1Z2luX3VzZXJDaGFuZ2VhYmxlX2ZlYXR1cmUgPSBVc3VcdTAwZTFyaW8gTW9kaWZpY1x1MDBlMXZlbA0KLV9VSV9NZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfZmVhdHVyZSA9IFBhY290ZXMgZGUgTVx1MDBlOXRvZG8NCi1fVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUgPSBCYXNlcw0KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUgPSBUaXBvIFZhcmlcdTAwZTF2ZWwNCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRfZmVhdHVyZSA9IFZhcmlhXHUwMGU3XHUwMGUzbyBCYXNlYWRhIGVtIEVsZW1lbnRvDQotX1VJX01ldGhvZFVuaXRfYXV0aG9yc19mZWF0dXJlID0gQXV0b3Jlcw0KLV9VSV9NZXRob2RVbml0X2NoYW5nZURhdGVfZmVhdHVyZSA9IEFsdGVyYXIgRGF0YQ0KLV9VSV9NZXRob2RVbml0X2NoYW5nZURlc2NyaXB0aW9uX2ZlYXR1cmUgPSBBbHRlcmFyIERlc2NyaVx1MDBlN1x1MDBlM28NCi1fVUlfTWV0aG9kVW5pdF92ZXJzaW9uX2ZlYXR1cmUgPSBWZXJzXHUwMGUzbw0KLV9VSV9NZXRob2RVbml0X2NvcHlyaWdodFN0YXRlbWVudF9mZWF0dXJlID0gRGVjbGFyYVx1MDBlN1x1MDBlM28gZGUgRGlyZWl0b3MgQXV0b3JhaXMNCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQbHVnaW5TZWxlY3Rpb25fZmVhdHVyZSA9IFNlbGVcdTAwZTdcdTAwZTNvIGRlIFBsdWctaW4gZG8gTVx1MDBlOXRvZG8NCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQYWNrYWdlU2VsZWN0aW9uX2ZlYXR1cmUgPSBTZWxlXHUwMGU3XHUwMGUzbyBkZSBQYWNvdGUgZG8gTVx1MDBlOXRvZG8NCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9wcm9jZXNzVmlld3NfZmVhdHVyZSA9IFZpc3VhbGl6YVx1MDBlN1x1MDBlM28gZG8gUHJvY2Vzc28NCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9kZWZhdWx0Vmlld19mZWF0dXJlID0gVmlzdWFsaXphXHUwMGU3XHUwMGUzbyBQYWRyXHUwMGUzbw0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2Jhc2VDb25maWd1cmF0aW9uc19mZWF0dXJlID0gQ29uZmlndXJhXHUwMGU3XHUwMGY1ZXMgQmFzZQ0KLV9VSV9Qcm9jZXNzRmFtaWx5X2RlbGl2ZXJ5UHJvY2Vzc2VzX2ZlYXR1cmUgPSBQcm9jZXNzb3MgZGUgRW50cmVnYQ0KLV9VSV9NZXRob2RMaWJyYXJ5X21ldGhvZFBsdWdpbnNfZmVhdHVyZSA9IFBsdWctaW5zIGRlIE1cdTAwZTl0b2RvDQotX1VJX01ldGhvZExpYnJhcnlfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zX2ZlYXR1cmUgPSBDb25maWd1cmFcdTAwZTdcdTAwZjVlcyBQclx1MDBlOS1kZWZpbmlkYXMNCi1fVUlfVW5rbm93bl9mZWF0dXJlID0gTlx1MDBlM28gRXNwZWNpZmljYWRvDQotDQotX1VJX1dvcmtPcmRlclR5cGVfZmluaXNoVG9TdGFydF9saXRlcmFsID0gRmltLWFvLUluXHUwMGVkY2lvDQotX1VJX1dvcmtPcmRlclR5cGVfZmluaXNoVG9GaW5pc2hfbGl0ZXJhbCA9IEZpbS1hLUZpbQ0KLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9TdGFydF9saXRlcmFsID0gSW5cdTAwZWRjaW8tYS1Jblx1MDBlZGNpbw0KLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9GaW5pc2hfbGl0ZXJhbCA9IEluXHUwMGVkY2lvLWFvLUZpbQ0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfaW5pdGlhbF9saXRlcmFsID0gaW5pY2lhbA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfam9pbl9saXRlcmFsID0gdW5pcg0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZm9ya19saXRlcmFsID0gYmlmdXJjYXINCi1fVUlfUHNldWRvU3RhdGVLaW5kX2p1bmN0aW9uX2xpdGVyYWwgPSBqdW5cdTAwZTdcdTAwZTNvDQotX1VJX1BzZXVkb1N0YXRlS2luZF9jaG9pY2VfbGl0ZXJhbCA9IG9wXHUwMGU3XHUwMGUzbw0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZW50cnlQb2ludF9saXRlcmFsID0gZW50cnlQb2ludA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZXhpdFBvaW50X2xpdGVyYWwgPSBleGl0UG9pbnQNCi1fVUlfUHNldWRvU3RhdGVLaW5kX3Rlcm1pbmF0ZV9saXRlcmFsID0gdGVybWluYXINCi1fVUlfVmFyaWFiaWxpdHlUeXBlX25hX2xpdGVyYWwgPSBuL2QNCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2NvbnRyaWJ1dGVzX2xpdGVyYWwgPSBjb250cmlidWlyDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9leHRlbmRzX2xpdGVyYWwgPSBleHRlbmRlcg0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfcmVwbGFjZXNfbGl0ZXJhbCA9IHN1YnN0aXR1aXINCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsQ29udHJpYnV0aW9uX2xpdGVyYWwgPSBsb2NhbENvbnRyaWJ1dGlvbg0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfbG9jYWxSZXBsYWNlbWVudF9saXRlcmFsID0gbG9jYWxSZXBsYWNlbWVudA0KLV9VSV9BcnRpZmFjdERlc2NyaXB0b3JfdHlwZSA9IERlc2NyaXRvciBkZSBBcnRlZmF0bw0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0b3JfdHlwZSA9IERlc2NyaXRvciBEaXN0cmlidVx1MDBlZHZlbA0KLV9VSV9PdXRjb21lRGVzY3JpcHRvcl90eXBlID0gRGVzY3JpdG9yIGRlIFJlc3VsdGFkbw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzE3NTQ2YS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1wbHVnaW5OYW1lID0gRU1GIFVNQSBcdTdmMTZcdThmOTFcdTY1MmZcdTYzMDENCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KLQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0ID0gezB9DQotX1VJX0NyZWF0ZUNoaWxkX3RleHQyID0gezF9IHswfQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MyA9IHsxfQ0KLV9VSV9DcmVhdGVDaGlsZF90b29sdGlwID0gXHU1NzI4IHsxfSBcdTUyOWZcdTgwZmRcdTkwZThcdTRlZjZcdTRlMGJcdTUyMWJcdTVlZmFcdTY1YjBcdTc2ODQgezB9DQotX1VJX0NyZWF0ZUNoaWxkX2Rlc2NyaXB0aW9uID0gXHU0ZTNhXHU5MDA5XHU2MmU5XHU3Njg0IHsyfSBcdTc2ODQgezF9IFx1NTI5Zlx1ODBmZFx1OTBlOFx1NGVmNlx1NTIxYlx1NWVmYSB7MH0gXHU3YzdiXHU1NzhiXHU3Njg0XHU2NWIwXHU1YjUwXHU0ZWUzXHUzMDAyDQotX1VJX0NyZWF0ZVNpYmxpbmdfZGVzY3JpcHRpb24gPSBcdTU3MjhcdTkwMDlcdTViOWFcdTc2ODQgezJ9IFx1NzIzNlx1NGVlM1x1NzY4NCB7MX0gXHU1MjlmXHU4MGZkXHU5MGU4XHU0ZWY2XHU0ZTBiXHVmZjBjXHU0ZTNhIHsyfSBcdTUyMWJcdTVlZmEgezB9IFx1N2M3Ylx1NTc4Ylx1NzY4NFx1NjViMFx1NTQwY1x1NGVlM1x1MzAwMg0KLQ0KLV9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24gPSB7MX0gXHU3Njg0IHswfQ0KLQ0KLV9VSV9DbGFzc2lmaWVyX3R5cGUgPSBcdTUyMDZcdTdjN2JcdTU2NjgNCi1fVUlfVHlwZV90eXBlID0gXHU3YzdiXHU1NzhiDQotX1VJX0VsZW1lbnRfdHlwZSA9IFx1NTE0M1x1N2QyMA0KLV9VSV9OYW1lZEVsZW1lbnRfdHlwZSA9IFx1NWRmMlx1NTQ3ZFx1NTQwZFx1NzY4NFx1NTE0M1x1N2QyMA0KLV9VSV9QYWNrYWdlYWJsZUVsZW1lbnRfdHlwZSA9IFx1NTNlZlx1NjI1M1x1NTMwNVx1NTE0M1x1N2QyMA0KLV9VSV9QYWNrYWdlX3R5cGUgPSBcdTUzMDUNCi1fVUlfTmFtZXNwYWNlX3R5cGUgPSBcdTU0MGRcdTc5ZjBcdTdhN2FcdTk1ZjQNCi1fVUlfTWV0aG9kRWxlbWVudF90eXBlID0gXHU2NWI5XHU2Y2Q1XHU1MTQzXHU3ZDIwDQotX1VJX0NvbnN0cmFpbnRfdHlwZSA9IFx1N2VhNlx1Njc1Zg0KLV9VSV9Db250ZW50RWxlbWVudF90eXBlID0gXHU1MTg1XHU1YmI5XHU1MTQzXHU3ZDIwDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF90eXBlID0gXHU1M2VmXHU2M2NmXHU4ZmYwXHU3Njg0XHU1MTQzXHU3ZDIwDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl90eXBlID0gXHU1MTg1XHU1YmI5XHU2M2NmXHU4ZmYwDQotX1VJX1NlY3Rpb25fdHlwZSA9IFx1ODI4Mg0KLV9VSV9Sb2xlX3R5cGUgPSBcdTg5ZDJcdTgyNzINCi1fVUlfV29ya1Byb2R1Y3RfdHlwZSA9IFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMQ0KLV9VSV9UYXNrX3R5cGUgPSBcdTRlZmJcdTUyYTENCi1fVUlfV29ya0RlZmluaXRpb25fdHlwZSA9IFx1NWRlNVx1NGY1Y1x1NWI5YVx1NGU0OQ0KLV9VSV9TdGVwX3R5cGUgPSBcdTZiNjVcdTlhYTQNCi1fVUlfR3VpZGFuY2VfdHlwZSA9IFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zg0KLV9VSV9BcnRpZmFjdF90eXBlID0gXHU1ZGU1XHU0ZWY2DQotX1VJX0RlbGl2ZXJhYmxlX3R5cGUgPSBcdTUzZWZcdTRlYTRcdTRlZDhcdTRlZjYNCi1fVUlfT3V0Y29tZV90eXBlID0gXHU3ZWQzXHU2NzljDQotX1VJX01ldGhvZFBhY2thZ2VfdHlwZSA9IFx1NjViOVx1NmNkNVx1NTMwNQ0KLV9VSV9Db250ZW50UGFja2FnZV90eXBlID0gXHU1MTg1XHU1YmI5XHU1MzA1DQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSA9IFx1NWRlNVx1NGVmNlx1NjNjZlx1OGZmMA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3R5cGUgPSBcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTYzY2ZcdThmZjANCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl90eXBlID0gXHU1M2VmXHU0ZWE0XHU0ZWQ4XHU0ZWY2XHU3Njg0XHU2M2NmXHU4ZmYwDQotX1VJX1JvbGVEZXNjcmlwdGlvbl90eXBlID0gXHU4OWQyXHU4MjcyXHU2M2NmXHU4ZmYwDQotX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlID0gXHU0ZWZiXHU1MmExXHU2M2NmXHU4ZmYwDQotX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fdHlwZSA9IFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zlx1NjNjZlx1OGZmMA0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUgPSBcdTViOWVcdThkZjVcdTYzY2ZcdThmZjANCi1fVUlfUG9pbnRfdHlwZSA9IFx1NzBiOQ0KLV9VSV9HcmFwaEVsZW1lbnRfdHlwZSA9IFx1NTZmZVx1NWY2Mlx1NTE0M1x1N2QyMA0KLV9VSV9EaWFncmFtRWxlbWVudF90eXBlID0gXHU1NmZlXHU1MTQzXHU3ZDIwDQotX1VJX0RpYWdyYW1MaW5rX3R5cGUgPSBcdTU2ZmVcdTk0ZmVcdTYzYTUNCi1fVUlfR3JhcGhDb25uZWN0b3JfdHlwZSA9IFx1NTZmZVx1NWY2Mlx1OGZkZVx1NjNhNVx1NTY2OA0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBcdThiZWRcdTRlNDlcdTZhMjFcdTU3OGJcdTY4NjUNCi1fVUlfRGltZW5zaW9uX3R5cGUgPSBcdTVjM2FcdTViZjgNCi1fVUlfUmVmZXJlbmNlX3R5cGUgPSBcdTVmMTVcdTc1MjgNCi1fVUlfUHJvcGVydHlfdHlwZSA9IFx1NWM1ZVx1NjAyNw0KLV9VSV9HcmFwaEVkZ2VfdHlwZSA9IFx1NTZmZVx1NWY2Mlx1OGZiOVx1N2YxOA0KLV9VSV9EaWFncmFtX3R5cGUgPSBcdTU2ZmUNCi1fVUlfR3JhcGhOb2RlX3R5cGUgPSBcdTU2ZmVcdTVmNjJcdTgyODJcdTcwYjkNCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZSA9IFx1N2I4MFx1NTM1NVx1OGJlZFx1NGU0OVx1NmEyMVx1NTc4Ylx1NTE0M1x1N2QyMA0KLV9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBVTUEgXHU4YmVkXHU0ZTQ5XHU2YTIxXHU1NzhiXHU2ODY1DQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBcdTY4MzhcdTVmYzNcdThiZWRcdTRlNDlcdTZhMjFcdTU3OGJcdTY4NjUNCi1fVUlfTGVhZkVsZW1lbnRfdHlwZSA9IFx1NTNmNlx1NTE0M1x1N2QyMA0KLV9VSV9UZXh0RWxlbWVudF90eXBlID0gXHU2NTg3XHU2NzJjXHU1MTQzXHU3ZDIwDQotX1VJX0ltYWdlX3R5cGUgPSBcdTU2ZmVcdTUwY2YNCi1fVUlfR3JhcGhpY1ByaW1pdGl2ZV90eXBlID0gXHU1NmZlXHU1MTQzDQotX1VJX1BvbHlsaW5lX3R5cGUgPSBcdTYyOThcdTdlYmYNCi1fVUlfRWxsaXBzZV90eXBlID0gXHU2OTJkXHU1NzA2DQotX1VJX0FjdGl2aXR5X3R5cGUgPSBcdTZkM2JcdTUyYTgNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IFx1NWRlNVx1NGY1Y1x1NTIwNlx1ODllM1x1NTE0M1x1N2QyMA0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUgPSBcdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjANCi1fVUlfTWlsZXN0b25lX3R5cGUgPSBcdTkxY2NcdTdhMGJcdTc4OTENCi1fVUlfSXRlcmF0aW9uX3R5cGUgPSBcdThmZWRcdTRlZTMNCi1fVUlfUGhhc2VfdHlwZSA9IFx1OTYzNlx1NmJiNQ0KLV9VSV9UZWFtUHJvZmlsZV90eXBlID0gXHU1NmUyXHU5NjFmXHU2OTgyXHU4OTgxXHU2NTg3XHU0ZWY2DQotX1VJX1JvbGVEZXNjcmlwdG9yX3R5cGUgPSBcdTg5ZDJcdTgyNzJcdTYzY2ZcdThmZjBcdTdiMjYNCi1fVUlfV29ya09yZGVyX3R5cGUgPSBcdTVkZTVcdTRmNWNcdTUzNTUNCi1fVUlfUHJvY2Vzc0VsZW1lbnRfdHlwZSA9IFx1NmQ0MVx1N2EwYlx1NTE0M1x1N2QyMA0KLV9VSV9QbGFubmluZ0RhdGFfdHlwZSA9IFx1ODljNFx1NTIxMlx1NjU3MFx1NjM2ZQ0KLV9VSV9EZXNjcmlwdG9yX3R5cGUgPSBcdTYzY2ZcdThmZjBcdTdiMjYNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX3R5cGUgPSBcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTYzY2ZcdThmZjBcdTdiMjYNCi1fVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSA9IFx1NGVmYlx1NTJhMVx1NjNjZlx1OGZmMFx1N2IyNg0KLV9VSV9Db21wb3NpdGVSb2xlX3R5cGUgPSBcdTdlYzRcdTU0MDhcdTg5ZDJcdTgyNzINCi1fVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3R5cGUgPSBcdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjBcdTYzY2ZcdThmZjANCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl90eXBlID0gXHU2ZDNiXHU1MmE4XHU2M2NmXHU4ZmYwDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUgPSBcdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGJcdTYzY2ZcdThmZjANCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUgPSBcdTZkNDFcdTdhMGJcdTYzY2ZcdThmZjANCi1fVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3R5cGUgPSBcdTYzY2ZcdThmZjBcdTdiMjZcdTYzY2ZcdThmZjANCi1fVUlfQ29uY2VwdF90eXBlID0gXHU2OTgyXHU1ZmY1DQotX1VJX0NoZWNrbGlzdF90eXBlID0gXHU2ODM4XHU1YmY5XHU4ODY4DQotX1VJX0V4YW1wbGVfdHlwZSA9IFx1NzkzYVx1NGY4Yg0KLV9VSV9HdWlkZWxpbmVfdHlwZSA9IFx1NjMwN1x1NTM1Nw0KLV9VSV9SZXBvcnRfdHlwZSA9IFx1NjJhNVx1NTQ0YQ0KLV9VSV9UZW1wbGF0ZV90eXBlID0gXHU2YTIxXHU2NzdmDQotX1VJX1N1cHBvcnRpbmdNYXRlcmlhbF90eXBlID0gXHU2NTJmXHU2MzAxXHU2NzUwXHU2NTk5DQotX1VJX1Rvb2xNZW50b3JfdHlwZSA9IFx1NWRlNVx1NTE3N1x1NTQxMVx1NWJmYw0KLV9VSV9XaGl0ZXBhcGVyX3R5cGUgPSBcdTc2N2RcdTc2YWVcdTRlNjYNCi1fVUlfVGVybURlZmluaXRpb25fdHlwZSA9IFx1NjcyZlx1OGJlZFx1NWI5YVx1NGU0OQ0KLV9VSV9QcmFjdGljZV90eXBlID0gXHU1YjllXHU4ZGY1DQotX1VJX0VzdGltYXRpb25Db25zaWRlcmF0aW9uc190eXBlID0gXHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5DQotX1VJX1JldXNhYmxlQXNzZXRfdHlwZSA9IFx1NTNlZlx1OTFjZFx1NzUyOFx1OGQ0NFx1NGVhNw0KLV9VSV9TdGF0ZV90eXBlID0gXHU3MmI2XHU2MDAxDQotX1VJX1ZlcnRleF90eXBlID0gXHU5ODc2XHU3MGI5DQotX1VJX1JlZ2lvbl90eXBlID0gXHU1MzNhXHU1N2RmDQotX1VJX1N0YXRlTWFjaGluZV90eXBlID0gXHU3MmI2XHU2MDAxXHU2NzNhDQotX1VJX1RyYW5zaXRpb25fdHlwZSA9IFx1NzlmYlx1NGVhNA0KLV9VSV9Qc2V1ZG9TdGF0ZV90eXBlID0gXHU0ZjJhXHU3MmI2XHU2MDAxDQotX1VJX0Rpc2NpcGxpbmVfdHlwZSA9IFx1ODljNFx1N2EwYg0KLV9VSV9Db250ZW50Q2F0ZWdvcnlfdHlwZSA9IFx1NTE4NVx1NWJiOVx1N2M3Ylx1NTIyYg0KLV9VSV9Sb2xlU2V0X3R5cGUgPSBcdTg5ZDJcdTgyNzJcdTk2YzYNCi1fVUlfRG9tYWluX3R5cGUgPSBcdTU3ZGYNCi1fVUlfV29ya1Byb2R1Y3RUeXBlX3R5cGUgPSBcdTVkZTVcdTRmNWNcdTRlYTdcdTU0YzFcdTdjN2JcdTU3OGINCi1fVUlfRGlzY2lwbGluZUdyb3VwaW5nX3R5cGUgPSBcdTg5YzRcdTdhMGJcdTUyMDZcdTdlYzQNCi1fVUlfVG9vbF90eXBlID0gXHU1ZGU1XHU1MTc3DQotX1VJX1JvbGVTZXRHcm91cGluZ190eXBlID0gXHU4OWQyXHU4MjcyXHU5NmM2XHU1MjA2XHU3ZWM0DQotX1VJX0N1c3RvbUNhdGVnb3J5X3R5cGUgPSBcdTViOWFcdTUyMzZcdTdjN2JcdTUyMmINCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUgPSBcdTRlYTRcdTRlZDhcdTZkNDFcdTdhMGINCi1fVUlfUHJvY2Vzc190eXBlID0gXHU2ZDQxXHU3YTBiDQotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuX3R5cGUgPSBcdTgwZmRcdTUyOWJcdTZhMjFcdTVmMGYNCi1fVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfdHlwZSA9IFx1NmQ0MVx1N2EwYlx1ODljNFx1NTIxMlx1NmEyMVx1Njc3Zg0KLV9VSV9Sb2FkbWFwX3R5cGUgPSBcdThkZWZcdTdlYmZcdTU2ZmUNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudF90eXBlID0gXHU2ZDQxXHU3YTBiXHU3ZWM0XHU0ZWY2DQotX1VJX1Byb2Nlc3NQYWNrYWdlX3R5cGUgPSBcdTZkNDFcdTdhMGJcdTUzMDUNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV90eXBlID0gXHU2ZDQxXHU3YTBiXHU3ZWM0XHU0ZWY2XHU2M2E1XHU1M2UzDQotX1VJX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX3R5cGUgPSBcdTZkNDFcdTdhMGJcdTdlYzRcdTRlZjZcdTYzY2ZcdThmZjBcdTdiMjYNCi1fVUlfTWV0aG9kUGx1Z2luX3R5cGUgPSBcdTY1YjlcdTZjZDVcdTYzZDJcdTRlZjYNCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3R5cGUgPSBcdTUzZWZcdTUzZDhcdTYwMjdcdTUxNDNcdTdkMjANCi1fVUlfTWV0aG9kVW5pdF90eXBlID0gXHU2NWI5XHU2Y2Q1XHU1MzU1XHU1MTQzDQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSA9IFx1NjViOVx1NmNkNVx1OTE0ZFx1N2Y2ZQ0KLV9VSV9Qcm9jZXNzRmFtaWx5X3R5cGUgPSBcdTZkNDFcdTdhMGJcdTdjZmJcdTUyMTcNCi1fVUlfTWV0aG9kTGlicmFyeV90eXBlID0gXHU2NWI5XHU2Y2Q1XHU1ZTkzDQotX1VJX1Vua25vd25fdHlwZSA9IFx1NWJmOVx1OGM2MQ0KLQ0KLV9VSV9Vbmtub3duX2RhdGF0eXBlPSBcdTUwM2MNCi0NCi1fVUlfTmFtZWRFbGVtZW50X25hbWVfZmVhdHVyZSA9IFx1NTQwZFx1NzlmMA0KLV9VSV9NZXRob2RFbGVtZW50X2d1aWRfZmVhdHVyZSA9IEd1aWQNCi1fVUlfTWV0aG9kRWxlbWVudF9icmllZkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdTdiODBcdTg5ODFcdTYzY2ZcdThmZjANCi1fVUlfTWV0aG9kRWxlbWVudF9vd25lZFJ1bGVzX2ZlYXR1cmUgPSBcdTYyZTVcdTY3MDlcdTc2ODRcdTg5YzRcdTUyMTkNCi1fVUlfTWV0aG9kRWxlbWVudF9zdXBwcmVzc2VkX2ZlYXR1cmUgPSBcdTVkZjJcdTYyOTFcdTUyMzYNCi1fVUlfTWV0aG9kRWxlbWVudF9vcmRlcmluZ0d1aWRlX2ZlYXR1cmUgPSBcdThiYTJcdThkMmRcdTYzMDdcdTUzNTcNCi1fVUlfQ29uc3RyYWludF9ib2R5X2ZlYXR1cmUgPSBcdTRlM2JcdTRmNTMNCi1fVUlfQ29udGVudEVsZW1lbnRfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gXHU2NTJmXHU2MzAxXHU2NzUwXHU2NTk5DQotX1VJX0NvbnRlbnRFbGVtZW50X2NvbmNlcHRzQW5kUGFwZXJzX2ZlYXR1cmUgPSBcdTY5ODJcdTVmZjVcdTU0OGNcdThkNDRcdTY1OTkNCi1fVUlfQ29udGVudEVsZW1lbnRfY2hlY2tsaXN0c19mZWF0dXJlID0gXHU2ODM4XHU1YmY5XHU4ODY4DQotX1VJX0NvbnRlbnRFbGVtZW50X2d1aWRlbGluZXNfZmVhdHVyZSA9IFx1NjMwN1x1NTM1Nw0KLV9VSV9Db250ZW50RWxlbWVudF9leGFtcGxlc19mZWF0dXJlID0gXHU3OTNhXHU0ZjhiDQotX1VJX0NvbnRlbnRFbGVtZW50X2Fzc2V0c19mZWF0dXJlID0gXHU4ZDQ0XHU0ZWE3DQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25OYW1lX2ZlYXR1cmUgPSBcdTY2M2VcdTc5M2FcdTU0MGRcdTc5ZjANCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9mZWF0dXJlID0gXHU2NjNlXHU3OTNhDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9zaGFwZWljb25fZmVhdHVyZSA9IFx1NWY2Mlx1NzJiNlx1NTZmZVx1NjgwNw0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfbm9kZWljb25fZmVhdHVyZSA9IFx1ODI4Mlx1NzBiOVx1NTZmZVx1NjgwNw0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fbWFpbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdTRlM2JcdTg5ODFcdTYzY2ZcdThmZjANCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX3NlY3Rpb25zX2ZlYXR1cmUgPSBcdTgyODINCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX2tleUNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBcdTUxNzNcdTk1MmVcdTZjZThcdTYxMGZcdTRlOGJcdTk4NzkNCi1fVUlfU2VjdGlvbl9zZWN0aW9uTmFtZV9mZWF0dXJlID0gXHU4MjgyXHU3Njg0XHU1NDBkXHU3OWYwDQotX1VJX1NlY3Rpb25fc2VjdGlvbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdTgyODJcdTc2ODRcdTYzY2ZcdThmZjANCi1fVUlfU2VjdGlvbl9zdWJTZWN0aW9uc19mZWF0dXJlID0gXHU1YjUwXHU4MjgyDQotX1VJX1NlY3Rpb25fcHJlZGVjZXNzb3JfZmVhdHVyZSA9IFx1NTE0OFx1ODg0Y1x1NGY1Y1x1NGUxYQ0KLV9VSV9Sb2xlX21vZGlmaWVzX2ZlYXR1cmUgPSBcdTRmZWVcdTY1MzkNCi1fVUlfUm9sZV9yZXNwb25zaWJsZUZvcl9mZWF0dXJlID0gXHU4ZDFmXHU4ZDIzDQotX1VJX1dvcmtQcm9kdWN0X3JlcG9ydHNfZmVhdHVyZSA9IFx1NjJhNVx1NTQ0YQ0KLV9VSV9Xb3JrUHJvZHVjdF90ZW1wbGF0ZXNfZmVhdHVyZSA9IFx1NmEyMVx1Njc3Zg0KLV9VSV9Xb3JrUHJvZHVjdF90b29sTWVudG9yc19mZWF0dXJlID0gXHU1ZGU1XHU1MTc3XHU1NDExXHU1YmZjDQotX1VJX1dvcmtQcm9kdWN0X2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gXHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5DQotX1VJX1Rhc2tfcGVyZm9ybWVkQnlfZmVhdHVyZSA9IFx1NjI2N1x1ODg0Y1x1ODAwNQ0KLV9VSV9UYXNrX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUgPSBcdTVmYzVcdTk3MDBcdThmOTNcdTUxNjUNCi1fVUlfVGFza19vdXRwdXRfZmVhdHVyZSA9IFx1OGY5M1x1NTFmYQ0KLV9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBcdTUxNzZcdTRlZDZcdTYyNjdcdTg4NGNcdTgwMDUNCi1fVUlfVGFza19vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBcdTUzZWZcdTkwMDlcdThmOTNcdTUxNjUNCi1fVUlfVGFza19zdGVwc19mZWF0dXJlID0gXHU2YjY1XHU5YWE0DQotX1VJX1Rhc2tfdG9vbE1lbnRvcnNfZmVhdHVyZSA9IFx1NWRlNVx1NTE3N1x1NTQxMVx1NWJmYw0KLV9VSV9UYXNrX2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gXHU0ZjMwXHU3Yjk3XHU2Y2U4XHU2MTBmXHU0ZThiXHU5ODc5DQotX1VJX1dvcmtEZWZpbml0aW9uX3ByZWNvbmRpdGlvbl9mZWF0dXJlID0gXHU1MjRkXHU3ZjZlXHU2NzYxXHU0ZWY2DQotX1VJX1dvcmtEZWZpbml0aW9uX3Bvc3Rjb25kaXRpb25fZmVhdHVyZSA9IFx1NTQwZVx1N2Y2ZVx1Njc2MVx1NGVmNg0KLV9VSV9BcnRpZmFjdF9jb250YWluZXJBcnRpZmFjdF9mZWF0dXJlID0gXHU1YmI5XHU1NjY4XHU1ZGU1XHU0ZWY2DQotX1VJX0FydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0c19mZWF0dXJlID0gXHU1MzA1XHU1NDJiXHU3Njg0XHU1ZGU1XHU0ZWY2DQotX1VJX0RlbGl2ZXJhYmxlX2RlbGl2ZXJlZFdvcmtQcm9kdWN0c19mZWF0dXJlID0gXHU0ZWE0XHU0ZWQ4XHU3Njg0XHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotX1VJX01ldGhvZFBhY2thZ2VfZ2xvYmFsX2ZlYXR1cmUgPSBcdTUxNjhcdTVjNDANCi1fVUlfTWV0aG9kUGFja2FnZV9yZXVzZWRQYWNrYWdlc19mZWF0dXJlID0gXHU1OTBkXHU3NTI4XHU3Njg0XHU1MzA1DQotX1VJX01ldGhvZFBhY2thZ2VfcGFyZW50UGFja2FnZV9mZWF0dXJlID0gXHU3MjM2XHU0ZWUzXHU1MzA1DQotX1VJX01ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19mZWF0dXJlID0gXHU1YjUwXHU0ZWUzXHU1MzA1DQotX1VJX0NvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19mZWF0dXJlID0gXHU1MTg1XHU1YmI5XHU1MTQzXHU3ZDIwDQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fYnJpZWZPdXRsaW5lX2ZlYXR1cmUgPSBcdTdiODBcdThmZjANCi1fVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9yZXByZXNlbnRhdGlvbk9wdGlvbnNfZmVhdHVyZSA9IFx1OGJmNFx1NjYwZVx1OTAwOVx1OTg3OQ0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX2V4dGVybmFsSWRfZmVhdHVyZSA9IFx1NTkxNlx1OTBlOFx1NjgwN1x1OGJjNg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IFx1NzUyOFx1OTAxNA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX2ltcGFjdE9mTm90SGF2aW5nX2ZlYXR1cmUgPSBcdTRlMGRcdTUxNzdcdTY3MDlcdTc2ODRcdTVmNzFcdTU0Y2QNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9yZWFzb25zRm9yTm90TmVlZGluZ19mZWF0dXJlID0gXHU0ZTBkXHU5NzAwXHU4OTgxXHU3Njg0XHU1MzlmXHU1NmUwDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fZXh0ZXJuYWxEZXNjcmlwdGlvbl9mZWF0dXJlID0gXHU1OTE2XHU5MGU4XHU2M2NmXHU4ZmYwDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fcGFja2FnaW5nR3VpZGFuY2VfZmVhdHVyZSA9IFx1NjI1M1x1NTMwNVx1NzY4NFx1NjMwN1x1NWJmY1x1NGZlMVx1NjA2Zg0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fc2tpbGxzX2ZlYXR1cmUgPSBcdTYyODBcdTgwZmQNCi1fVUlfUm9sZURlc2NyaXB0aW9uX2Fzc2lnbm1lbnRBcHByb2FjaGVzX2ZlYXR1cmUgPSBcdTUyMDZcdTkxNGRcdTY1YjlcdTZjZDUNCi1fVUlfUm9sZURlc2NyaXB0aW9uX3N5bm9ueW1zX2ZlYXR1cmUgPSBcdTU0MGNcdTRlNDlcdThiY2QNCi1fVUlfVGFza0Rlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IFx1NzUyOFx1OTAxNA0KLV9VSV9UYXNrRGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBcdTY2ZmZcdTRlZTNcdTY1YjlcdTY4NDgNCi1fVUlfR3VpZGFuY2VEZXNjcmlwdGlvbl9hdHRhY2htZW50c19mZWF0dXJlID0gXHU5NjQ0XHU0ZWY2DQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYWRkaXRpb25hbEluZm9fZmVhdHVyZSA9IFx1NTE3Nlx1NGVkNlx1NGZlMVx1NjA2Zg0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3Byb2JsZW1fZmVhdHVyZSA9IFx1OTVlZVx1OTg5OA0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2JhY2tncm91bmRfZmVhdHVyZSA9IFx1ODBjY1x1NjY2Zg0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2dvYWxzX2ZlYXR1cmUgPSBcdTc2ZWVcdTY4MDcNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hcHBsaWNhdGlvbl9mZWF0dXJlID0gXHU1ZTk0XHU3NTI4XHU3YTBiXHU1ZThmDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fbGV2ZWxzT2ZBZG9wdGlvbl9mZWF0dXJlID0gXHU5MWM3XHU3NTI4XHU3Njg0XHU3ZWE3XHU1MjJiDQotX1VJX1BvaW50X3hfZmVhdHVyZSA9IFgNCi1fVUlfUG9pbnRfeV9mZWF0dXJlID0gWQ0KLV9VSV9HcmFwaEVsZW1lbnRfcG9zaXRpb25fZmVhdHVyZSA9IFx1NGY0ZFx1N2Y2ZQ0KLV9VSV9HcmFwaEVsZW1lbnRfY29udGFpbmVkX2ZlYXR1cmUgPSBcdTVkZjJcdTUzMDVcdTU0MmINCi1fVUlfR3JhcGhFbGVtZW50X2xpbmtfZmVhdHVyZSA9IFx1OTRmZVx1NjNhNQ0KLV9VSV9HcmFwaEVsZW1lbnRfYW5jaG9yYWdlX2ZlYXR1cmUgPSBcdTViOWFcdTRmNGQNCi1fVUlfR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfZmVhdHVyZSA9IFx1OGJlZFx1NGU0OVx1NmEyMVx1NTc4Yg0KLV9VSV9EaWFncmFtRWxlbWVudF9pc1Zpc2libGVfZmVhdHVyZSA9IFx1NjYyZlx1NTQyNlx1NTNlZlx1ODljMQ0KLV9VSV9EaWFncmFtRWxlbWVudF9jb250YWluZXJfZmVhdHVyZSA9IFx1NWJiOVx1NTY2OA0KLV9VSV9EaWFncmFtRWxlbWVudF9yZWZlcmVuY2VfZmVhdHVyZSA9IFx1NWYxNVx1NzUyOA0KLV9VSV9EaWFncmFtRWxlbWVudF9wcm9wZXJ0eV9mZWF0dXJlID0gXHU1YzVlXHU2MDI3DQotX1VJX0RpYWdyYW1MaW5rX3pvb21fZmVhdHVyZSA9IFx1N2YyOVx1NjUzZQ0KLV9VSV9EaWFncmFtTGlua192aWV3cG9ydF9mZWF0dXJlID0gXHU4OWM2XHU1MzNhDQotX1VJX0RpYWdyYW1MaW5rX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gXHU1NmZlXHU1ZjYyXHU1MTQzXHU3ZDIwDQotX1VJX0RpYWdyYW1MaW5rX2RpYWdyYW1fZmVhdHVyZSA9IFx1NTZmZQ0KLV9VSV9HcmFwaENvbm5lY3Rvcl9ncmFwaEVsZW1lbnRfZmVhdHVyZSA9IFx1NTZmZVx1NWY2Mlx1NTE0M1x1N2QyMA0KLV9VSV9HcmFwaENvbm5lY3Rvcl9ncmFwaEVkZ2VfZmVhdHVyZSA9IFx1NTZmZVx1NWY2Mlx1OGZiOVx1N2YxOA0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3ByZXNlbnRhdGlvbl9mZWF0dXJlID0gXHU2NjNlXHU3OTNhDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBcdTU2ZmVcdTVmNjJcdTUxNDNcdTdkMjANCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9kaWFncmFtX2ZlYXR1cmUgPSBcdTU2ZmUNCi1fVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUgPSBcdTViYmRcdTVlYTYNCi1fVUlfRGltZW5zaW9uX2hlaWdodF9mZWF0dXJlID0gXHU5YWQ4XHU1ZWE2DQotX1VJX1JlZmVyZW5jZV9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbl9mZWF0dXJlID0gXHU2NjJmXHU1MzU1XHU3MmVjXHU3Njg0XHU4YmY0XHU2NjBlDQotX1VJX1JlZmVyZW5jZV9yZWZlcmVuY2VkX2ZlYXR1cmUgPSBcdTVmMTVcdTc1MjhcdTc2ODQNCi1fVUlfUHJvcGVydHlfa2V5X2ZlYXR1cmUgPSBcdTUxNzNcdTk1MmUNCi1fVUlfUHJvcGVydHlfdmFsdWVfZmVhdHVyZSA9IFx1NTAzYw0KLV9VSV9HcmFwaEVkZ2VfYW5jaG9yX2ZlYXR1cmUgPSBcdTk1MWFcdTcwYjkNCi1fVUlfR3JhcGhFZGdlX3dheXBvaW50c19mZWF0dXJlID0gXHU4ZGVmXHU3MGI5DQotX1VJX0RpYWdyYW1fem9vbV9mZWF0dXJlID0gXHU3ZjI5XHU2NTNlDQotX1VJX0RpYWdyYW1fdmlld3BvaW50X2ZlYXR1cmUgPSBcdTg5YzZcdTcwYjkNCi1fVUlfRGlhZ3JhbV9kaWFncmFtTGlua19mZWF0dXJlID0gXHU1NmZlXHU5NGZlXHU2M2E1DQotX1VJX0RpYWdyYW1fbmFtZXNwYWNlX2ZlYXR1cmUgPSBcdTU0MGRcdTc5ZjBcdTdhN2FcdTk1ZjQNCi1fVUlfR3JhcGhOb2RlX3NpemVfZmVhdHVyZSA9IFx1NTkyN1x1NWMwZg0KLV9VSV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF90eXBlSW5mb19mZWF0dXJlID0gXHU3YzdiXHU1NzhiXHU0ZmUxXHU2MDZmDQotX1VJX1VNQVNlbWFudGljTW9kZWxCcmlkZ2VfZWxlbWVudF9mZWF0dXJlID0gXHU1MTQzXHU3ZDIwDQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IFx1NTE0M1x1N2QyMA0KLV9VSV9UZXh0RWxlbWVudF90ZXh0X2ZlYXR1cmUgPSBcdTY1ODdcdTY3MmMNCi1fVUlfSW1hZ2VfdXJpX2ZlYXR1cmUgPSBVcmkNCi1fVUlfSW1hZ2VfbWltZVR5cGVfZmVhdHVyZSA9IE1pbWUgXHU3YzdiXHU1NzhiDQotX1VJX1BvbHlsaW5lX2Nsb3NlZF9mZWF0dXJlID0gXHU1ZGYyXHU1MTczXHU5NWVkDQotX1VJX1BvbHlsaW5lX3dheXBvaW50c19mZWF0dXJlID0gXHU4ZGVmXHU3MGI5DQotX1VJX0VsbGlwc2VfcmFkaXVzWF9mZWF0dXJlID0gXHU1MzRhXHU1Zjg0IFgNCi1fVUlfRWxsaXBzZV9yYWRpdXNZX2ZlYXR1cmUgPSBcdTUzNGFcdTVmODQgWQ0KLV9VSV9FbGxpcHNlX3JvdGF0aW9uX2ZlYXR1cmUgPSBcdTY1Y2JcdThmNmMNCi1fVUlfRWxsaXBzZV9zdGFydEFuZ2xlX2ZlYXR1cmUgPSBcdThkNzdcdTU5Y2JcdTg5ZDJcdTVlYTYNCi1fVUlfRWxsaXBzZV9lbmRBbmdsZV9mZWF0dXJlID0gXHU3ZWM4XHU2YjYyXHU4OWQyXHU1ZWE2DQotX1VJX0VsbGlwc2VfY2VudGVyX2ZlYXR1cmUgPSBcdTRlMmRcdTVmYzMNCi1fVUlfQWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfZmVhdHVyZSA9IFx1NTIwNlx1ODllM1x1NTE0M1x1N2QyMA0KLV9VSV9BY3Rpdml0eV9yb2FkbWFwc19mZWF0dXJlID0gXHU4ZGVmXHU3ZWJmXHU1NmZlDQotX1VJX0FjdGl2aXR5X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSA9IFx1NjUyZlx1NjMwMVx1Njc1MFx1NjU5OQ0KLV9VSV9BY3Rpdml0eV9jaGVja2xpc3RzX2ZlYXR1cmUgPSBcdTY4MzhcdTViZjlcdTg4NjgNCi1fVUlfQWN0aXZpdHlfY29uY2VwdHNfZmVhdHVyZSA9IFx1Njk4Mlx1NWZmNQ0KLV9VSV9BY3Rpdml0eV9leGFtcGxlc19mZWF0dXJlID0gXHU3OTNhXHU0ZjhiDQotX1VJX0FjdGl2aXR5X2d1aWRlbGluZXNfZmVhdHVyZSA9IFx1NjMwN1x1NTM1Nw0KLV9VSV9BY3Rpdml0eV9yZXVzYWJsZUFzc2V0c19mZWF0dXJlID0gXHU1M2VmXHU5MWNkXHU3NTI4XHU4ZDQ0XHU0ZWE3DQotX1VJX0FjdGl2aXR5X2lzRW5hY3RhYmxlX2ZlYXR1cmUgPSBcdTUzZWZcdTg5YzRcdTViOWENCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNSZXBlYXRhYmxlX2ZlYXR1cmUgPSBcdTY2MmZcdTUzZWZcdTRlZTVcdTkxY2RcdTU5MGRcdTc2ODQNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNPbmdvaW5nX2ZlYXR1cmUgPSBcdTZiNjNcdTU3MjhcdThmZGJcdTg4NGMNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNFdmVudERyaXZlbl9mZWF0dXJlID0gXHU2NjJmXHU0ZThiXHU0ZWY2XHU5YTcxXHU1MmE4XHU3Njg0DQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2xpbmtUb1ByZWRlY2Vzc29yX2ZlYXR1cmUgPSBcdTk0ZmVcdTYzYTVcdTUyMzBcdTUxNDhcdTg4NGNcdTRmNWNcdTRlMWENCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVmaXhfZmVhdHVyZSA9IFx1NTI0ZFx1N2YwMA0KLV9VSV9CcmVha2Rvd25FbGVtZW50X2lzUGxhbm5lZF9mZWF0dXJlID0gXHU2NjJmXHU1ZGYyXHU4OWM0XHU1MjEyXHU3Njg0DQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaGFzTXVsdGlwbGVPY2N1cnJlbmNlc19mZWF0dXJlID0gXHU1ZGYyXHU1MWZhXHU3M2IwXHU1OTFhXHU2YjIxDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNPcHRpb25hbF9mZWF0dXJlID0gXHU2NjJmXHU1M2VmXHU5MDA5XHU3Njg0DQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQWZ0ZXJfZmVhdHVyZSA9IFx1NTcyOFx1NmI2NFx1NGU0Ylx1NTQwZVx1NjYzZVx1NzkzYQ0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEJlZm9yZV9mZWF0dXJlID0gXHU1NzI4XHU2YjY0XHU0ZTRiXHU1MjRkXHU2NjNlXHU3OTNhDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcGxhbm5pbmdEYXRhX2ZlYXR1cmUgPSBcdTg5YzRcdTUyMTJcdTY1NzBcdTYzNmUNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9zdXBlckFjdGl2aXRpZXNfZmVhdHVyZSA9IFx1NGUwYVx1N2VhN1x1NmQzYlx1NTJhOA0KLV9VSV9UZWFtUHJvZmlsZV90ZWFtUm9sZXNfZmVhdHVyZSA9IFx1NTZlMlx1OTYxZlx1ODlkMlx1ODI3Mg0KLV9VSV9UZWFtUHJvZmlsZV9zdXBlclRlYW1fZmVhdHVyZSA9IFx1NGUwYVx1N2VhN1x1NTZlMlx1OTYxZg0KLV9VSV9UZWFtUHJvZmlsZV9zdWJUZWFtX2ZlYXR1cmUgPSBcdTRlMGJcdTdlYTdcdTU2ZTJcdTk2MWYNCi1fVUlfUm9sZURlc2NyaXB0b3JfUm9sZV9mZWF0dXJlID0gXHU4OWQyXHU4MjcyDQotX1VJX1JvbGVEZXNjcmlwdG9yX21vZGlmaWVzX2ZlYXR1cmUgPSBcdTRmZWVcdTY1MzkNCi1fVUlfUm9sZURlc2NyaXB0b3JfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFx1OGQxZlx1OGQyMw0KLV9VSV9Xb3JrT3JkZXJfbGlua1R5cGVfZmVhdHVyZSA9IFx1OTRmZVx1NjNhNVx1N2M3Ylx1NTc4Yg0KLV9VSV9Xb3JrT3JkZXJfcHJlZF9mZWF0dXJlID0gUHJlZA0KLV9VSV9QbGFubmluZ0RhdGFfc3RhcnREYXRlX2ZlYXR1cmUgPSBcdTVmMDBcdTU5Y2JcdTY1ZTVcdTY3MWYNCi1fVUlfUGxhbm5pbmdEYXRhX2ZpbmlzaERhdGVfZmVhdHVyZSA9IFx1N2VkM1x1Njc1Zlx1NjVlNVx1NjcxZg0KLV9VSV9QbGFubmluZ0RhdGFfcmFua19mZWF0dXJlID0gXHU3YjQ5XHU3ZWE3DQotX1VJX0Rlc2NyaXB0b3JfaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlX2ZlYXR1cmUgPSBcdTY2MmZcdTRlMGVcdThkNDRcdTZlOTBcdTU0MGNcdTZiNjVcdTc2ODQNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RW50cnlTdGF0ZV9mZWF0dXJlID0gXHU2ZDNiXHU1MmE4XHU4ZmRiXHU1MTY1XHU3MmI2XHU2MDAxDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUV4aXRTdGF0ZV9mZWF0dXJlID0gXHU2ZDNiXHU1MmE4XHU5MDAwXHU1MWZhXHU3MmI2XHU2MDAxDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdF9mZWF0dXJlID0gXHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RlZEJ5X2ZlYXR1cmUgPSBcdTVmNzFcdTU0Y2RcdTgwMDUNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdHNfZmVhdHVyZSA9IFx1NWY3MVx1NTRjZA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfZGVsaXZlcmFibGVQYXJ0c19mZWF0dXJlID0gXHU1M2VmXHU0ZWE0XHU0ZWQ4XHU5MGU4XHU0ZWY2DQotX1VJX1Rhc2tEZXNjcmlwdG9yX1Rhc2tfZmVhdHVyZSA9IFx1NGVmYlx1NTJhMQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeV9mZWF0dXJlID0gXHU4Zjg1XHU1MmE5XHU2MjY3XHU4ODRjXHU4MDA1DQotX1VJX1Rhc2tEZXNjcmlwdG9yX2Fzc2lzdGVkQnlfZmVhdHVyZSA9IFx1NTM0Zlx1NTJhOVx1ODAwNQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9leHRlcm5hbElucHV0X2ZlYXR1cmUgPSBcdTU5MTZcdTkwZThcdThmOTNcdTUxNjUNCi1fVUlfVGFza0Rlc2NyaXB0b3JfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSA9IFx1NWZjNVx1OTcwMFx1OGY5M1x1NTE2NQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBcdTUzZWZcdTkwMDlcdThmOTNcdTUxNjUNCi1fVUlfVGFza0Rlc2NyaXB0b3Jfb3V0cHV0X2ZlYXR1cmUgPSBcdThmOTNcdTUxZmENCi1fVUlfVGFza0Rlc2NyaXB0b3JfcGVyZm9ybWVkUHJpbWFyaWx5QnlfZmVhdHVyZSA9IFx1NGUzYlx1NjI2N1x1ODg0Y1x1ODAwNQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9zZWxlY3RlZFN0ZXBzX2ZlYXR1cmUgPSBcdTkwMDlcdTViOWFcdTc2ODRcdTZiNjVcdTlhYTQNCi1fVUlfQ29tcG9zaXRlUm9sZV9hZ2dyZWdhdGVkUm9sZXNfZmVhdHVyZSA9IFx1ODA1YVx1OTZjNlx1NzY4NFx1ODlkMlx1ODI3Mg0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdXNhZ2VHdWlkYW5jZV9mZWF0dXJlID0gXHU0ZjdmXHU3NTI4XHU2MzA3XHU1YmZjXHU0ZmUxXHU2MDZmDQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gXHU3NTI4XHU5MDE0DQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBcdTY2ZmZcdTRlZTNcdTY1YjlcdTY4NDgNCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9ob3d0b1N0YWZmX2ZlYXR1cmUgPSBcdTU5ODJcdTRmNTVcdThmZGJcdTg4NGNcdTRlYmFcdTU0NThcdTkxNGRcdTU5MDcNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fc2NhbGVfZmVhdHVyZSA9IFx1N2YyOVx1NjUzZVx1NmJkNFx1NGY4Yg0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzX2ZlYXR1cmUgPSBcdTk4NzlcdTc2ZWVcdTcyNzlcdTVmODENCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcmlza0xldmVsX2ZlYXR1cmUgPSBcdTk4Y2VcdTk2NjlcdTdlYTdcdTUyMmINCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fZXN0aW1hdGluZ1RlY2huaXF1ZV9mZWF0dXJlID0gXHU0ZjMwXHU3Yjk3XHU2MjgwXHU2NzJmDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RNZW1iZXJFeHBlcnRpc2VfZmVhdHVyZSA9IFx1OTg3OVx1NzZlZVx1NjIxMFx1NTQ1OFx1NGUxM1x1OTU3Zg0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlT2ZDb250cmFjdF9mZWF0dXJlID0gXHU1NDA4XHU1NDBjXHU3Njg0XHU3YzdiXHU1NzhiDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBcdTU5MTZcdTkwZThcdTY4MDdcdThiYzYNCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3Njb3BlX2ZlYXR1cmUgPSBcdTgzMDNcdTU2ZjQNCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3VzYWdlTm90ZXNfZmVhdHVyZSA9IFx1NGY3Zlx1NzUyOFx1OGJmNFx1NjYwZQ0KLV9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fcmVmaW5lZERlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdTRmMThcdTUzMTZcdTc2ODRcdTYzY2ZcdThmZjANCi1fVUlfUHJhY3RpY2Vfc3ViUHJhY3RpY2VzX2ZlYXR1cmUgPSBcdTRlMGJcdTdlYTdcdTViOWVcdThkZjUNCi1fVUlfUHJhY3RpY2VfY29udGVudFJlZmVyZW5jZXNfZmVhdHVyZSA9IFx1NTE4NVx1NWJiOVx1NWYxNVx1NzUyOA0KLV9VSV9QcmFjdGljZV9hY3Rpdml0eVJlZmVyZW5jZXNfZmVhdHVyZSA9IFx1NmQzYlx1NTJhOFx1NWYxNVx1NzUyOA0KLV9VSV9TdGF0ZV9Xb3JrUHJvZHVjdF9mZWF0dXJlID0gXHU1ZGU1XHU0ZjVjXHU0ZWE3XHU1NGMxDQotX1VJX1N0YXRlX1JlZ2lvbl9mZWF0dXJlID0gXHU1MzNhXHU1N2RmDQotX1VJX1N0YXRlX3N1Ym1hY2hpbmVfZmVhdHVyZSA9IFx1NWI1MFx1NjczYQ0KLV9VSV9WZXJ0ZXhfY29udGFpbmVyX2ZlYXR1cmUgPSBcdTViYjlcdTU2NjgNCi1fVUlfVmVydGV4X291dGdvaW5nX2ZlYXR1cmUgPSBcdTUxZmFcdTdhZDkNCi1fVUlfVmVydGV4X2luY29taW5nX2ZlYXR1cmUgPSBcdTUxNjVcdTdhZDkNCi1fVUlfUmVnaW9uX1ZlcnRleF9mZWF0dXJlID0gXHU5ODc2XHU3MGI5DQotX1VJX1JlZ2lvbl9UcmFuc2l0aW9uX2ZlYXR1cmUgPSBcdTc5ZmJcdTRlYTQNCi1fVUlfUmVnaW9uX1N0YXRlX2ZlYXR1cmUgPSBcdTcyYjZcdTYwMDENCi1fVUlfUmVnaW9uX1N0YXRlTWFjaGluZV9mZWF0dXJlID0gXHU3MmI2XHU2MDAxXHU2NzNhDQotX1VJX1N0YXRlTWFjaGluZV9SZWdpb25fZmVhdHVyZSA9IFx1NTMzYVx1NTdkZg0KLV9VSV9UcmFuc2l0aW9uX1dvcmtEZWZpbml0aW9uX2ZlYXR1cmUgPSBcdTVkZTVcdTRmNWNcdTViOWFcdTRlNDkNCi1fVUlfVHJhbnNpdGlvbl9jb250YWluZXJfZmVhdHVyZSA9IFx1NWJiOVx1NTY2OA0KLV9VSV9UcmFuc2l0aW9uX3NvdXJjZV9mZWF0dXJlID0gXHU2ZTkwDQotX1VJX1RyYW5zaXRpb25fdGFyZ2V0X2ZlYXR1cmUgPSBcdTc2ZWVcdTY4MDcNCi1fVUlfRGlzY2lwbGluZV90YXNrc19mZWF0dXJlID0gXHU0ZWZiXHU1MmExDQotX1VJX0Rpc2NpcGxpbmVfc3ViZGlzY2lwbGluZV9mZWF0dXJlID0gXHU1YjUwXHU4OWM0XHU3YTBiDQotX1VJX0Rpc2NpcGxpbmVfcmVmZXJlbmNlV29ya2Zsb3dzX2ZlYXR1cmUgPSBcdTVmMTVcdTc1MjhcdTVkZTVcdTRmNWNcdTZkNDENCi1fVUlfUm9sZVNldF9yb2xlc19mZWF0dXJlID0gXHU4OWQyXHU4MjcyDQotX1VJX0RvbWFpbl93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMQ0KLV9VSV9Eb21haW5fc3ViZG9tYWluc19mZWF0dXJlID0gXHU1YjUwXHU1N2RmDQotX1VJX1dvcmtQcm9kdWN0VHlwZV93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFx1NWRlNVx1NGY1Y1x1NGVhN1x1NTRjMQ0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSA9IFx1ODljNFx1N2EwYg0KLV9VSV9Ub29sX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBcdTVkZTVcdTUxNzdcdTU0MTFcdTViZmMNCi1fVUlfUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX2ZlYXR1cmUgPSBcdTg5ZDJcdTgyNzJcdTk2YzYNCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfY2F0ZWdvcml6ZWRFbGVtZW50c19mZWF0dXJlID0gXHU1MjA2XHU3YzdiXHU1MTQzXHU3ZDIwDQotX1VJX0N1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfZmVhdHVyZSA9IFx1NWI1MFx1N2M3Yg0KLV9VSV9EZWxpdmVyeVByb2Nlc3NfZWR1Y2F0aW9uTWF0ZXJpYWxzX2ZlYXR1cmUgPSBcdTY1NTlcdTViNjZcdTY3NTBcdTY1OTkNCi1fVUlfRGVsaXZlcnlQcm9jZXNzX2NvbW11bmljYXRpb25zTWF0ZXJpYWxzX2ZlYXR1cmUgPSBcdTkwMWFcdTRmZTFcdTY3NTBcdTY1OTkNCi1fVUlfUHJvY2Vzc19pbmNsdWRlc1BhdHRlcm5zX2ZlYXR1cmUgPSBcdTUzMDVcdTU0MmJcdTZhMjFcdTVmMGYNCi1fVUlfUHJvY2Vzc19kZWZhdWx0Q29udGV4dF9mZWF0dXJlID0gXHU3ZjNhXHU3NzAxXHU3M2FmXHU1ODgzDQotX1VJX1Byb2Nlc3NfdmFsaWRDb250ZXh0X2ZlYXR1cmUgPSBcdTY3MDlcdTY1NDhcdTczYWZcdTU4ODMNCi1fVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfYmFzZWRPblByb2Nlc3Nlc19mZWF0dXJlID0gXHU1N2ZhXHU0ZThlXHU2ZDQxXHU3YTBiDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfaW50ZXJmYWNlc19mZWF0dXJlID0gXHU2M2E1XHU1M2UzDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19mZWF0dXJlID0gXHU2ZDQxXHU3YTBiDQotX1VJX1Byb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19mZWF0dXJlID0gXHU2ZDQxXHU3YTBiXHU1MTQzXHU3ZDIwDQotX1VJX1Byb2Nlc3NQYWNrYWdlX2RpYWdyYW1zX2ZlYXR1cmUgPSBcdTU2ZmUNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uc19mZWF0dXJlID0gXHU2M2E1XHU1M2UzXHU4OWM0XHU4MzAzDQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlSU9fZmVhdHVyZSA9IFx1NjNhNVx1NTNlMyBJTw0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9Qcm9jZXNzQ29tcG9uZW50X2ZlYXR1cmUgPSBcdTZkNDFcdTdhMGJcdTdlYzRcdTRlZjYNCi1fVUlfTWV0aG9kUGx1Z2luX3VzZXJDaGFuZ2VhYmxlX2ZlYXR1cmUgPSBcdTUzZWZcdTY2ZjRcdTY1MzlcdTc2ODRcdTc1MjhcdTYyMzcNCi1fVUlfTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX2ZlYXR1cmUgPSBcdTY1YjlcdTZjZDVcdTUzMDUNCi1fVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUgPSBcdTU3ZmFcdTY3MmNcdTc1MjhcdTRmOGINCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5VHlwZV9mZWF0dXJlID0gXHU1M2VmXHU1M2Q4XHU2MDI3XHU3YzdiXHU1NzhiDQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUgPSBcdTU3ZmFcdTRlOGVcdTUxNDNcdTdkMjBcdTc2ODRcdTUzZWZcdTUzZDhcdTYwMjcNCi1fVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUgPSBcdTRmNWNcdTgwMDUNCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUgPSBcdTY2ZjRcdTY1MzlcdTY1ZTVcdTY3MWYNCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEZXNjcmlwdGlvbl9mZWF0dXJlID0gXHU2NmY0XHU2NTM5XHU2M2NmXHU4ZmYwDQotX1VJX01ldGhvZFVuaXRfdmVyc2lvbl9mZWF0dXJlID0gXHU3MjQ4XHU2NzJjDQotX1VJX01ldGhvZFVuaXRfY29weXJpZ2h0U3RhdGVtZW50X2ZlYXR1cmUgPSBcdTcyNDhcdTY3NDNcdTU4ZjBcdTY2MGUNCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQbHVnaW5TZWxlY3Rpb25fZmVhdHVyZSA9IFx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNlx1OTAwOVx1NjJlOQ0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBhY2thZ2VTZWxlY3Rpb25fZmVhdHVyZSA9IFx1NjViOVx1NmNkNVx1NTMwNVx1OTAwOVx1NjJlOQ0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3Byb2Nlc3NWaWV3c19mZWF0dXJlID0gXHU2ZDQxXHU3YTBiXHU4OWM2XHU1NmZlDQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fZGVmYXVsdFZpZXdfZmVhdHVyZSA9IFx1N2YzYVx1NzcwMVx1ODljNlx1NTZmZQ0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2Jhc2VDb25maWd1cmF0aW9uc19mZWF0dXJlID0gXHU1N2ZhXHU2NzJjXHU5MTRkXHU3ZjZlDQotX1VJX1Byb2Nlc3NGYW1pbHlfZGVsaXZlcnlQcm9jZXNzZXNfZmVhdHVyZSA9IFx1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYg0KLV9VSV9NZXRob2RMaWJyYXJ5X21ldGhvZFBsdWdpbnNfZmVhdHVyZSA9IFx1NjViOVx1NmNkNVx1NjNkMlx1NGVmNg0KLV9VSV9NZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19mZWF0dXJlID0gXHU5ODg0XHU1YjlhXHU0ZTQ5XHU5MTRkXHU3ZjZlDQotX1VJX1Vua25vd25fZmVhdHVyZSA9IFx1NjcyYVx1NjMwN1x1NWI5YQ0KLQ0KLV9VSV9Xb3JrT3JkZXJUeXBlX2ZpbmlzaFRvU3RhcnRfbGl0ZXJhbCA9IGZpbmlzaFRvU3RhcnQNCi1fVUlfV29ya09yZGVyVHlwZV9maW5pc2hUb0ZpbmlzaF9saXRlcmFsID0gZmluaXNoVG9GaW5pc2gNCi1fVUlfV29ya09yZGVyVHlwZV9zdGFydFRvU3RhcnRfbGl0ZXJhbCA9IHN0YXJ0VG9TdGFydA0KLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9GaW5pc2hfbGl0ZXJhbCA9IHN0YXJ0VG9GaW5pc2gNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2luaXRpYWxfbGl0ZXJhbCA9IFx1NTIxZFx1NTljYg0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfam9pbl9saXRlcmFsID0gXHU4ZmRlXHU2M2E1DQotX1VJX1BzZXVkb1N0YXRlS2luZF9mb3JrX2xpdGVyYWwgPSBcdTUyMDZcdTUzYzkNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2p1bmN0aW9uX2xpdGVyYWwgPSBcdTdlZDNcdTcwYjkNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2Nob2ljZV9saXRlcmFsID0gXHU5MDA5XHU5ODc5DQotX1VJX1BzZXVkb1N0YXRlS2luZF9lbnRyeVBvaW50X2xpdGVyYWwgPSBcdTUxNjVcdTUzZTNcdTcwYjkNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2V4aXRQb2ludF9saXRlcmFsID0gXHU1MWZhXHU1M2UzXHU3MGI5DQotX1VJX1BzZXVkb1N0YXRlS2luZF90ZXJtaW5hdGVfbGl0ZXJhbCA9IFx1N2VjOFx1NmI2Mg0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfbmFfbGl0ZXJhbCA9IFx1NGUwZFx1OTAwMlx1NzUyOA0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfY29udHJpYnV0ZXNfbGl0ZXJhbCA9IFx1NjNkMFx1NGY5Yg0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfZXh0ZW5kc19saXRlcmFsID0gXHU2MjY5XHU1YzU1DQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9yZXBsYWNlc19saXRlcmFsID0gXHU2NmZmXHU2MzYyDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9sb2NhbENvbnRyaWJ1dGlvbl9saXRlcmFsID0gXHU2NzJjXHU1NzMwXHU2M2QwXHU0ZjliDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9sb2NhbFJlcGxhY2VtZW50X2xpdGVyYWwgPSBcdTY3MmNcdTU3MzBcdTY2ZmZcdTYzNjINCi1fVUlfQXJ0aWZhY3REZXNjcmlwdG9yX3R5cGUgPSBcdTVkZTVcdTRlZjZcdTYzY2ZcdThmZjBcdTdiMjYNCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdG9yX3R5cGUgPSBcdTUzZWZcdTRlYTRcdTRlZDhcdTRlZjZcdTYzY2ZcdThmZjBcdTdiMjYNCi1fVUlfT3V0Y29tZURlc2NyaXB0b3JfdHlwZSA9IFx1N2VkM1x1Njc5Y1x1NjNjZlx1OGZmMFx1N2IyNg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWJmNThjMS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1wbHVnaW5OYW1lID0gRU1GIFVNQSBFZGl0IFN1cHBvcnQNCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KLQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0ID0gezB9DQotX1VJX0NyZWF0ZUNoaWxkX3RleHQyID0gezF9IHswfQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MyA9IHsxfQ0KLV9VSV9DcmVhdGVDaGlsZF90b29sdGlwID0gXHU1NzI4IHsxfSBcdTcyNzlcdTYwMjdcdTRlMGJcdTVlZmFcdTdhY2JcdTY1YjBcdTc2ODQgezB9DQotX1VJX0NyZWF0ZUNoaWxkX2Rlc2NyaXB0aW9uID0gXHU3MGJhXHU2MjQwXHU5MDc4IHsyfSBcdTc2ODQgezF9IFx1NzI3OVx1NjAyN1x1NWVmYVx1N2FjYiB7MH0gXHU5ODVlXHU1NzhiXHU3Njg0XHU1YjUwXHU5ODA1XHUzMDAyDQotX1VJX0NyZWF0ZVNpYmxpbmdfZGVzY3JpcHRpb24gPSBcdTU3MjhcdTUxNzZcdTZiY2RcdTk4MDVcdTc2ODQgezF9IFx1NzI3OVx1NjAyN1x1NGUwYlx1ZmYwY1x1NzBiYVx1NjI0MFx1OTA3OFx1NzY4NCB7Mn0gXHU1ZWZhXHU3YWNiIHswfSBcdTk4NWVcdTU3OGJcdTc2ODRcdTY1YjBcdTU0MGNcdTVjNjRcdTdkMWFcdTk4MDVcdTMwMDINCi0NCi1fVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uID0gezF9IFx1NzY4NCB7MH0NCi0NCi1fVUlfQ2xhc3NpZmllcl90eXBlID0gXHU1MjA2XHU5ODVlXHU1NjY4DQotX1VJX1R5cGVfdHlwZSA9IFx1OTg1ZVx1NTc4Yg0KLV9VSV9FbGVtZW50X3R5cGUgPSBcdTUxNDNcdTdkMjANCi1fVUlfTmFtZWRFbGVtZW50X3R5cGUgPSBcdTUxNzdcdTU0MGRcdTUxNDNcdTdkMjANCi1fVUlfUGFja2FnZWFibGVFbGVtZW50X3R5cGUgPSBcdTUzZWZcdTUzMDVcdTg4ZGRcdTc2ODRcdTUxNDNcdTdkMjANCi1fVUlfUGFja2FnZV90eXBlID0gXHU1OTU3XHU0ZWY2DQotX1VJX05hbWVzcGFjZV90eXBlID0gXHU1NDBkXHU3YTMxXHU3YTdhXHU5NTkzDQotX1VJX01ldGhvZEVsZW1lbnRfdHlwZSA9IFx1NjViOVx1NmNkNVx1NTE0M1x1N2QyMA0KLV9VSV9Db25zdHJhaW50X3R5cGUgPSBcdTk2NTBcdTUyMzZcdTk4MDUNCi1fVUlfQ29udGVudEVsZW1lbnRfdHlwZSA9IFx1NTE2N1x1NWJiOVx1NTE0M1x1N2QyMA0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSA9IFx1NTNlZlx1OGFhYVx1NjYwZVx1NzY4NFx1NTE0M1x1N2QyMA0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fdHlwZSA9IFx1NTE2N1x1NWJiOVx1OGFhYVx1NjYwZQ0KLV9VSV9TZWN0aW9uX3R5cGUgPSBcdTdiYzANCi1fVUlfUm9sZV90eXBlID0gXHU4OWQyXHU4MjcyDQotX1VJX1dvcmtQcm9kdWN0X3R5cGUgPSBcdTVkZTVcdTRmNWNcdTYyMTBcdTY3OWMNCi1fVUlfVGFza190eXBlID0gXHU0ZjVjXHU2OTZkDQotX1VJX1dvcmtEZWZpbml0aW9uX3R5cGUgPSBcdTVkZTVcdTRmNWNcdTViOWFcdTdmYTkNCi1fVUlfU3RlcF90eXBlID0gXHU2YjY1XHU5YTVmDQotX1VJX0d1aWRhbmNlX3R5cGUgPSBcdTYzMDdcdTVmMTUNCi1fVUlfQXJ0aWZhY3RfdHlwZSA9IFx1NjljYlx1NGVmNg0KLV9VSV9EZWxpdmVyYWJsZV90eXBlID0gXHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlDQotX1VJX091dGNvbWVfdHlwZSA9IFx1OGYzOFx1NTFmYVx1N2Q1MFx1Njc5Yw0KLV9VSV9NZXRob2RQYWNrYWdlX3R5cGUgPSBcdTY1YjlcdTZjZDVcdTU5NTdcdTRlZjYNCi1fVUlfQ29udGVudFBhY2thZ2VfdHlwZSA9IFx1NTE2N1x1NWJiOVx1NTk1N1x1NGVmNg0KLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3R5cGUgPSBcdTY5Y2JcdTRlZjZcdThhYWFcdTY2MGUNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl90eXBlID0gXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU4YWFhXHU2NjBlDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fdHlwZSA9IFx1NGVhNFx1NGVkOFx1OTgwNVx1NzZlZVx1OGFhYVx1NjYwZQ0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fdHlwZSA9IFx1ODlkMlx1ODI3Mlx1OGFhYVx1NjYwZQ0KLV9VSV9UYXNrRGVzY3JpcHRpb25fdHlwZSA9IFx1NGY1Y1x1Njk2ZFx1OGFhYVx1NjYwZQ0KLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX3R5cGUgPSBcdTYzMDdcdTVmMTVcdThhYWFcdTY2MGUNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl90eXBlID0gXHU3ZGY0XHU3ZmQyXHU4YWFhXHU2NjBlDQotX1VJX1BvaW50X3R5cGUgPSBcdTllZGUNCi1fVUlfR3JhcGhFbGVtZW50X3R5cGUgPSBcdTU3MTZcdTVmNjJcdTUxNDNcdTdkMjANCi1fVUlfRGlhZ3JhbUVsZW1lbnRfdHlwZSA9IFx1NTcxNlx1ODllM1x1NTE0M1x1N2QyMA0KLV9VSV9EaWFncmFtTGlua190eXBlID0gXHU1NzE2XHU4OWUzXHU5M2M4XHU3ZDUwDQotX1VJX0dyYXBoQ29ubmVjdG9yX3R5cGUgPSBcdTU3MTZcdTVmNjJcdTkwMjNcdTYzYTVcdTU2NjgNCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gXHU4YTllXHU2MTBmXHU2YTIxXHU1NzhiXHU2YTRiXHU2M2E1XHU1NjY4DQotX1VJX0RpbWVuc2lvbl90eXBlID0gXHU3ZGFkXHU1ZWE2DQotX1VJX1JlZmVyZW5jZV90eXBlID0gXHU1M2MzXHU3MTY3DQotX1VJX1Byb3BlcnR5X3R5cGUgPSBcdTUxNjdcdTViYjkNCi1fVUlfR3JhcGhFZGdlX3R5cGUgPSBcdTU3MTZcdTVmNjJcdTkwOGFcdTdkZTMNCi1fVUlfRGlhZ3JhbV90eXBlID0gXHU1NzE2XHU4OWUzDQotX1VJX0dyYXBoTm9kZV90eXBlID0gXHU1NzE2XHU1ZjYyXHU3YmMwXHU5ZWRlDQotX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGUgPSBcdTdjMjFcdTVmMGZcdThhOWVcdTYxMGZcdTZhMjFcdTU3OGJcdTUxNDNcdTdkMjANCi1fVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gVU1BIFx1OGE5ZVx1NjEwZlx1NmEyMVx1NTc4Ylx1NmE0Ylx1NjNhNVx1NTY2OA0KLV9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gXHU2ODM4XHU1ZmMzXHU4YTllXHU2MTBmXHU2YTIxXHU1NzhiXHU2YTRiXHU2M2E1XHU1NjY4DQotX1VJX0xlYWZFbGVtZW50X3R5cGUgPSBcdTg0NDlcdTdiYzBcdTllZGVcdTUxNDNcdTdkMjANCi1fVUlfVGV4dEVsZW1lbnRfdHlwZSA9IFx1NjU4N1x1NWI1N1x1NTE0M1x1N2QyMA0KLV9VSV9JbWFnZV90eXBlID0gXHU1ZjcxXHU1MGNmDQotX1VJX0dyYXBoaWNQcmltaXRpdmVfdHlwZSA9IFx1NTcxNlx1NWY2Mlx1NTE0M1x1N2QyMA0KLV9VSV9Qb2x5bGluZV90eXBlID0gXHU2Mjk4XHU3ZGRhDQotX1VJX0VsbGlwc2VfdHlwZSA9IFx1NmE2Mlx1NTcxMw0KLV9VSV9BY3Rpdml0eV90eXBlID0gXHU2ZDNiXHU1MmQ1DQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X3R5cGUgPSBcdTVkZTVcdTRmNWNcdTUyMDZcdTg5ZTNcdTUxNDNcdTdkMjANCi1fVUlfQnJlYWtkb3duRWxlbWVudF90eXBlID0gXHU1MjA2XHU4OWUzXHU1MTQzXHU3ZDIwDQotX1VJX01pbGVzdG9uZV90eXBlID0gXHU3YmExXHU1MjM2XHU5ZWRlDQotX1VJX0l0ZXJhdGlvbl90eXBlID0gXHU1M2NkXHU4OTg2DQotX1VJX1BoYXNlX3R5cGUgPSBcdTk2OGVcdTZiYjUNCi1fVUlfVGVhbVByb2ZpbGVfdHlwZSA9IFx1NTcxOFx1OTY4YVx1OGEyZFx1NWI5YVx1NmE5NA0KLV9VSV9Sb2xlRGVzY3JpcHRvcl90eXBlID0gXHU4OWQyXHU4MjcyXHU2M2NmXHU4ZmYwXHU1YjUwDQotX1VJX1dvcmtPcmRlcl90eXBlID0gXHU1ZGU1XHU0ZjVjXHU2YjIxXHU1ZThmDQotX1VJX1Byb2Nlc3NFbGVtZW50X3R5cGUgPSBcdTdhMGJcdTVlOGZcdTUxNDNcdTdkMjANCi1fVUlfUGxhbm5pbmdEYXRhX3R5cGUgPSBcdTg5OGZcdTUyODNcdThjYzdcdTY1OTkNCi1fVUlfRGVzY3JpcHRvcl90eXBlID0gXHU2M2NmXHU4ZmYwXHU1YjUwDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlID0gXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU2M2NmXHU4ZmYwXHU1YjUwDQotX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUgPSBcdTRmNWNcdTY5NmRcdTYzY2ZcdThmZjBcdTViNTANCi1fVUlfQ29tcG9zaXRlUm9sZV90eXBlID0gXHU4OTA3XHU1NDA4XHU4OWQyXHU4MjcyDQotX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl90eXBlID0gXHU1MjA2XHU4OWUzXHU1MTQzXHU3ZDIwXHU4YWFhXHU2NjBlDQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fdHlwZSA9IFx1NmQzYlx1NTJkNVx1OGFhYVx1NjYwZQ0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gXHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiXHU4YWFhXHU2NjBlDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gXHU3YTBiXHU1ZThmXHU4YWFhXHU2NjBlDQotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlID0gXHU2M2NmXHU4ZmYwXHU1YjUwXHU4YWFhXHU2NjBlDQotX1VJX0NvbmNlcHRfdHlwZSA9IFx1Njk4Mlx1NWZmNQ0KLV9VSV9DaGVja2xpc3RfdHlwZSA9IFx1NjgzOFx1NWMwZFx1NmUwNVx1NTVhZQ0KLV9VSV9FeGFtcGxlX3R5cGUgPSBcdTdiYzRcdTRmOGINCi1fVUlfR3VpZGVsaW5lX3R5cGUgPSBcdTZlOTZcdTUyNDcNCi1fVUlfUmVwb3J0X3R5cGUgPSBcdTU4MzFcdTU0NGENCi1fVUlfVGVtcGxhdGVfdHlwZSA9IFx1N2JjNFx1NjcyYw0KLV9VSV9TdXBwb3J0aW5nTWF0ZXJpYWxfdHlwZSA9IFx1NjUyZlx1NjNmNFx1OGNjN1x1NjU5OQ0KLV9VSV9Ub29sTWVudG9yX3R5cGUgPSBcdTVkZTVcdTUxNzdcdThmMTRcdTUyYTkNCi1fVUlfV2hpdGVwYXBlcl90eXBlID0gXHU3NjdkXHU3NmFlXHU2NmY4DQotX1VJX1Rlcm1EZWZpbml0aW9uX3R5cGUgPSBcdThhNWVcdTVmNTlcdTViOWFcdTdmYTkNCi1fVUlfUHJhY3RpY2VfdHlwZSA9IFx1N2RmNFx1N2ZkMg0KLV9VSV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdHlwZSA9IFx1OTgxMFx1NGYzMFx1ODAwM1x1OTFjZg0KLV9VSV9SZXVzYWJsZUFzc2V0X3R5cGUgPSBcdTUzZWZcdTkxY2RcdTg5MDdcdTRmN2ZcdTc1MjhcdTc2ODRcdThjYzdcdTc1MjINCi1fVUlfU3RhdGVfdHlwZSA9IFx1NzJjMFx1NjE0Yg0KLV9VSV9WZXJ0ZXhfdHlwZSA9IFx1OTgwMlx1OWVkZQ0KLV9VSV9SZWdpb25fdHlwZSA9IFx1NTM0MFx1NTdkZg0KLV9VSV9TdGF0ZU1hY2hpbmVfdHlwZSA9IFx1NzJjMFx1NjE0Ylx1NmE1Zg0KLV9VSV9UcmFuc2l0aW9uX3R5cGUgPSBcdThmNDlcdTYzZGINCi1fVUlfUHNldWRvU3RhdGVfdHlwZSA9IFx1NTA0N1x1NzJjMFx1NjE0Yg0KLV9VSV9EaXNjaXBsaW5lX3R5cGUgPSBcdTg5OGZcdTdiYzQNCi1fVUlfQ29udGVudENhdGVnb3J5X3R5cGUgPSBcdTUxNjdcdTViYjlcdTdhMmVcdTk4NWUNCi1fVUlfUm9sZVNldF90eXBlID0gXHU4OWQyXHU4MjcyXHU5NmM2DQotX1VJX0RvbWFpbl90eXBlID0gXHU5ODE4XHU1N2RmDQotX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlID0gXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljXHU5ODVlXHU1NzhiDQotX1VJX0Rpc2NpcGxpbmVHcm91cGluZ190eXBlID0gXHU4OThmXHU3YmM0XHU1MjA2XHU3ZDQ0DQotX1VJX1Rvb2xfdHlwZSA9IFx1NWRlNVx1NTE3Nw0KLV9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSA9IFx1ODlkMlx1ODI3Mlx1OTZjNlx1NTIwNlx1N2Q0NA0KLV9VSV9DdXN0b21DYXRlZ29yeV90eXBlID0gXHU4MWVhXHU4YTAyXHU3YTJlXHU5ODVlDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc190eXBlID0gXHU0ZWE0XHU0ZWQ4XHU2ZDQxXHU3YTBiDQotX1VJX1Byb2Nlc3NfdHlwZSA9IFx1N2EwYlx1NWU4Zg0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybl90eXBlID0gXHU1MjlmXHU4MGZkXHU1NzhiXHU2YTIzDQotX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX3R5cGUgPSBcdTdhMGJcdTVlOGZcdTg5OGZcdTUyODNcdTdiYzRcdTY3MmMNCi1fVUlfUm9hZG1hcF90eXBlID0gXHU1YzBlXHU4OWJkXHU1NzE2DQotX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSA9IFx1N2EwYlx1NWU4Zlx1NTE0M1x1NGVmNg0KLV9VSV9Qcm9jZXNzUGFja2FnZV90eXBlID0gXHU3YTBiXHU1ZThmXHU1OTU3XHU0ZWY2DQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfdHlwZSA9IFx1N2EwYlx1NWU4Zlx1NTE0M1x1NGVmNlx1NGVjYlx1OTc2Mg0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl90eXBlID0gXHU3YTBiXHU1ZThmXHU1MTQzXHU0ZWY2XHU2M2NmXHU4ZmYwXHU1YjUwDQotX1VJX01ldGhvZFBsdWdpbl90eXBlID0gXHU2NWI5XHU2Y2Q1XHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmDQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlID0gXHU4YjhhXHU1MzE2XHU2MDI3XHU1MTQzXHU3ZDIwDQotX1VJX01ldGhvZFVuaXRfdHlwZSA9IFx1NjViOVx1NmNkNVx1NTVhZVx1NGY0ZA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUgPSBcdTY1YjlcdTZjZDVcdTkxNGRcdTdmNmUNCi1fVUlfUHJvY2Vzc0ZhbWlseV90eXBlID0gXHU3YTBiXHU1ZThmXHU3Y2ZiXHU1MjE3DQotX1VJX01ldGhvZExpYnJhcnlfdHlwZSA9IFx1NjViOVx1NmNkNVx1N2EwYlx1NWYwZlx1NWVhYg0KLV9VSV9Vbmtub3duX3R5cGUgPSBcdTcyNjlcdTRlZjYNCi0NCi1fVUlfVW5rbm93bl9kYXRhdHlwZT0gXHU1MDNjDQotDQotX1VJX05hbWVkRWxlbWVudF9uYW1lX2ZlYXR1cmUgPSBcdTU0MGRcdTdhMzENCi1fVUlfTWV0aG9kRWxlbWVudF9ndWlkX2ZlYXR1cmUgPSBHdWlkDQotX1VJX01ldGhvZEVsZW1lbnRfYnJpZWZEZXNjcmlwdGlvbl9mZWF0dXJlID0gXHU3YzIxXHU4OTgxXHU4YWFhXHU2NjBlDQotX1VJX01ldGhvZEVsZW1lbnRfb3duZWRSdWxlc19mZWF0dXJlID0gXHU4OThmXHU1MjQ3XHU2NGMxXHU2NzA5XHU4MDA1DQotX1VJX01ldGhvZEVsZW1lbnRfc3VwcHJlc3NlZF9mZWF0dXJlID0gXHU1M2Q3XHU2MjkxXHU1MjM2DQotX1VJX01ldGhvZEVsZW1lbnRfb3JkZXJpbmdHdWlkZV9mZWF0dXJlID0gXHU2MzkyXHU1ZThmXHU2MzA3XHU1ZjE1DQotX1VJX0NvbnN0cmFpbnRfYm9keV9mZWF0dXJlID0gXHU0ZTNiXHU5YWQ0DQotX1VJX0NvbnRlbnRFbGVtZW50X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSA9IFx1NjUyZlx1NjNmNFx1OGNjN1x1NjU5OQ0KLV9VSV9Db250ZW50RWxlbWVudF9jb25jZXB0c0FuZFBhcGVyc19mZWF0dXJlID0gXHU2OTgyXHU1ZmY1XHU1NDhjXHU3NjdkXHU3NmFlXHU2NmY4DQotX1VJX0NvbnRlbnRFbGVtZW50X2NoZWNrbGlzdHNfZmVhdHVyZSA9IFx1NjgzOFx1NWMwZFx1NmUwNVx1NTVhZQ0KLV9VSV9Db250ZW50RWxlbWVudF9ndWlkZWxpbmVzX2ZlYXR1cmUgPSBcdTZlOTZcdTUyNDcNCi1fVUlfQ29udGVudEVsZW1lbnRfZXhhbXBsZXNfZmVhdHVyZSA9IFx1N2JjNFx1NGY4Yg0KLV9VSV9Db250ZW50RWxlbWVudF9hc3NldHNfZmVhdHVyZSA9IFx1OGNjN1x1NzUyMg0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uTmFtZV9mZWF0dXJlID0gXHU1NDQ4XHU3M2ZlXHU1NDBkXHU3YTMxDQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fZmVhdHVyZSA9IFx1NTQ0OFx1NzNmZVx1NjViOVx1NWYwZg0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfc2hhcGVpY29uX2ZlYXR1cmUgPSBTaGFwZWljb24NCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X25vZGVpY29uX2ZlYXR1cmUgPSBOb2RlaWNvbg0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fbWFpbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdTRlM2JcdTg5ODFcdThhYWFcdTY2MGUNCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX3NlY3Rpb25zX2ZlYXR1cmUgPSBcdTdiYzANCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX2tleUNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBcdTRlM2JcdTg5ODFcdTgwMDNcdTkxY2YNCi1fVUlfU2VjdGlvbl9zZWN0aW9uTmFtZV9mZWF0dXJlID0gXHU1MzQwXHU2YmI1XHU1NDBkXHU3YTMxDQotX1VJX1NlY3Rpb25fc2VjdGlvbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdTUzNDBcdTZiYjVcdThhYWFcdTY2MGUNCi1fVUlfU2VjdGlvbl9zdWJTZWN0aW9uc19mZWF0dXJlID0gXHU1YjUwXHU1MzQwXHU2YmI1DQotX1VJX1NlY3Rpb25fcHJlZGVjZXNzb3JfZmVhdHVyZSA9IFx1NTI0ZFx1NGUwMFx1NzI0OA0KLV9VSV9Sb2xlX21vZGlmaWVzX2ZlYXR1cmUgPSBcdTRmZWVcdTY1MzlcdTk4MDVcdTc2ZWUNCi1fVUlfUm9sZV9yZXNwb25zaWJsZUZvcl9mZWF0dXJlID0gXHU4Y2EwXHU4Y2FjDQotX1VJX1dvcmtQcm9kdWN0X3JlcG9ydHNfZmVhdHVyZSA9IFx1NTgzMVx1NTQ0YQ0KLV9VSV9Xb3JrUHJvZHVjdF90ZW1wbGF0ZXNfZmVhdHVyZSA9IFx1N2JjNFx1NjcyYw0KLV9VSV9Xb3JrUHJvZHVjdF90b29sTWVudG9yc19mZWF0dXJlID0gXHU1ZGU1XHU1MTc3XHU4ZjE0XHU1MmE5DQotX1VJX1dvcmtQcm9kdWN0X2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gXHU5ODEwXHU0ZjMwXHU4MDAzXHU5MWNmDQotX1VJX1Rhc2tfcGVyZm9ybWVkQnlfZmVhdHVyZSA9IFx1NTdmN1x1ODg0Y1x1ODAwNQ0KLV9VSV9UYXNrX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUgPSBcdTVmMzdcdTUyMzZcdThmMzhcdTUxNjUNCi1fVUlfVGFza19vdXRwdXRfZmVhdHVyZSA9IFx1OGYzOFx1NTFmYQ0KLV9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBcdTUxNzZcdTRlZDZcdTU3ZjdcdTg4NGNcdTgwMDUNCi1fVUlfVGFza19vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBcdTkwNzhcdTc1MjhcdThmMzhcdTUxNjUNCi1fVUlfVGFza19zdGVwc19mZWF0dXJlID0gXHU2YjY1XHU5YTVmDQotX1VJX1Rhc2tfdG9vbE1lbnRvcnNfZmVhdHVyZSA9IFx1NWRlNVx1NTE3N1x1OGYxNFx1NTJhOQ0KLV9VSV9UYXNrX2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gXHU5ODEwXHU0ZjMwXHU4MDAzXHU5MWNmDQotX1VJX1dvcmtEZWZpbml0aW9uX3ByZWNvbmRpdGlvbl9mZWF0dXJlID0gXHU1MjRkXHU3ZjZlXHU2ODlkXHU0ZWY2DQotX1VJX1dvcmtEZWZpbml0aW9uX3Bvc3Rjb25kaXRpb25fZmVhdHVyZSA9IFx1NWY4Y1x1N2Y2ZVx1Njg5ZFx1NGVmNg0KLV9VSV9BcnRpZmFjdF9jb250YWluZXJBcnRpZmFjdF9mZWF0dXJlID0gXHU1MTMyXHU1YjU4XHU1NjY4XHU2OWNiXHU0ZWY2DQotX1VJX0FydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0c19mZWF0dXJlID0gXHU1MTY3XHU1NDJiXHU3Njg0XHU2OWNiXHU0ZWY2DQotX1VJX0RlbGl2ZXJhYmxlX2RlbGl2ZXJlZFdvcmtQcm9kdWN0c19mZWF0dXJlID0gXHU5MDVlXHU5MDAxXHU3Njg0XHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljDQotX1VJX01ldGhvZFBhY2thZ2VfZ2xvYmFsX2ZlYXR1cmUgPSBcdTVlZTNcdTU3ZGYNCi1fVUlfTWV0aG9kUGFja2FnZV9yZXVzZWRQYWNrYWdlc19mZWF0dXJlID0gXHU5MWNkXHU4OTA3XHU0ZjdmXHU3NTI4XHU3Njg0XHU1OTU3XHU0ZWY2DQotX1VJX01ldGhvZFBhY2thZ2VfcGFyZW50UGFja2FnZV9mZWF0dXJlID0gXHU2YmNkXHU5ODA1XHU1OTU3XHU0ZWY2DQotX1VJX01ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19mZWF0dXJlID0gXHU1YjUwXHU5ODA1XHU1OTU3XHU0ZWY2DQotX1VJX0NvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19mZWF0dXJlID0gXHU1MTY3XHU1YmI5XHU1MTQzXHU3ZDIwDQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fYnJpZWZPdXRsaW5lX2ZlYXR1cmUgPSBcdTY5ODJcdTc1NjVcdThmMmFcdTVlZDMNCi1fVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9yZXByZXNlbnRhdGlvbk9wdGlvbnNfZmVhdHVyZSA9IFx1ODg2OFx1NzkzYVx1NmNkNVx1OTA3OFx1OTgwNQ0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX2V4dGVybmFsSWRfZmVhdHVyZSA9IFx1NTkxNlx1OTBlOCBJRA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IFx1NzZlZVx1NzY4NA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX2ltcGFjdE9mTm90SGF2aW5nX2ZlYXR1cmUgPSBcdTdmM2FcdTRlNGZcdTY2NDJcdTc2ODRcdTVmNzFcdTk3ZmYNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9yZWFzb25zRm9yTm90TmVlZGluZ19mZWF0dXJlID0gXHU0ZTBkXHU5NzAwXHU4OTgxXHU3Njg0XHU3NDA2XHU3NTMxDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fZXh0ZXJuYWxEZXNjcmlwdGlvbl9mZWF0dXJlID0gXHU1OTE2XHU5MGU4XHU4YWFhXHU2NjBlDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fcGFja2FnaW5nR3VpZGFuY2VfZmVhdHVyZSA9IFx1NTMwNVx1ODhkZFx1NjMwN1x1NWYxNQ0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fc2tpbGxzX2ZlYXR1cmUgPSBcdTYyODBcdTVkZTcNCi1fVUlfUm9sZURlc2NyaXB0aW9uX2Fzc2lnbm1lbnRBcHByb2FjaGVzX2ZlYXR1cmUgPSBcdTYzMDdcdTZkM2VcdTY1YjlcdTZjZDUNCi1fVUlfUm9sZURlc2NyaXB0aW9uX3N5bm9ueW1zX2ZlYXR1cmUgPSBcdTU0MGNcdTdmYTlcdTViNTcNCi1fVUlfVGFza0Rlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IFx1NzZlZVx1NzY4NA0KLV9VSV9UYXNrRGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBcdTY2ZmZcdTRlZTNcdTY1YjlcdTY4NDgNCi1fVUlfR3VpZGFuY2VEZXNjcmlwdGlvbl9hdHRhY2htZW50c19mZWF0dXJlID0gXHU5NjQ0XHU0ZWY2DQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYWRkaXRpb25hbEluZm9fZmVhdHVyZSA9IFx1NTE3Nlx1NGVkNlx1OGNjN1x1OGEwYQ0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3Byb2JsZW1fZmVhdHVyZSA9IFx1NTU0Zlx1OTg0Yw0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2JhY2tncm91bmRfZmVhdHVyZSA9IFx1ODBjY1x1NjY2Zg0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2dvYWxzX2ZlYXR1cmUgPSBcdTc2ZWVcdTZhMTkNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hcHBsaWNhdGlvbl9mZWF0dXJlID0gXHU2MWM5XHU3NTI4XHU3YTBiXHU1ZjBmDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fbGV2ZWxzT2ZBZG9wdGlvbl9mZWF0dXJlID0gXHU2M2ExXHU3NTI4XHU1YzY0XHU2YjIxDQotX1VJX1BvaW50X3hfZmVhdHVyZSA9IFgNCi1fVUlfUG9pbnRfeV9mZWF0dXJlID0gWQ0KLV9VSV9HcmFwaEVsZW1lbnRfcG9zaXRpb25fZmVhdHVyZSA9IFx1NGY0ZFx1N2Y2ZQ0KLV9VSV9HcmFwaEVsZW1lbnRfY29udGFpbmVkX2ZlYXR1cmUgPSBcdTVkZjJcdTUxNjdcdTU0MmINCi1fVUlfR3JhcGhFbGVtZW50X2xpbmtfZmVhdHVyZSA9IFx1OTNjOFx1N2Q1MA0KLV9VSV9HcmFwaEVsZW1lbnRfYW5jaG9yYWdlX2ZlYXR1cmUgPSBBbmNob3JhZ2UNCi1fVUlfR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfZmVhdHVyZSA9IFx1OGE5ZVx1NjEwZlx1NmEyMVx1NTc4Yg0KLV9VSV9EaWFncmFtRWxlbWVudF9pc1Zpc2libGVfZmVhdHVyZSA9IFx1NTNlZlx1ODk4Ylx1NzY4NA0KLV9VSV9EaWFncmFtRWxlbWVudF9jb250YWluZXJfZmVhdHVyZSA9IFx1NTEzMlx1NWI1OFx1NTY2OA0KLV9VSV9EaWFncmFtRWxlbWVudF9yZWZlcmVuY2VfZmVhdHVyZSA9IFx1NTNjM1x1NzE2Nw0KLV9VSV9EaWFncmFtRWxlbWVudF9wcm9wZXJ0eV9mZWF0dXJlID0gXHU1MTY3XHU1YmI5DQotX1VJX0RpYWdyYW1MaW5rX3pvb21fZmVhdHVyZSA9IFx1N2UyZVx1NjUzZQ0KLV9VSV9EaWFncmFtTGlua192aWV3cG9ydF9mZWF0dXJlID0gXHU2YWEyXHU4OTk2XHU1N2UwDQotX1VJX0RpYWdyYW1MaW5rX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gXHU1NzE2XHU1ZjYyXHU1MTQzXHU3ZDIwDQotX1VJX0RpYWdyYW1MaW5rX2RpYWdyYW1fZmVhdHVyZSA9IFx1NTcxNlx1ODllMw0KLV9VSV9HcmFwaENvbm5lY3Rvcl9ncmFwaEVsZW1lbnRfZmVhdHVyZSA9IFx1NTcxNlx1NWY2Mlx1NTE0M1x1N2QyMA0KLV9VSV9HcmFwaENvbm5lY3Rvcl9ncmFwaEVkZ2VfZmVhdHVyZSA9IFx1NTcxNlx1NWY2Mlx1OTA4YVx1N2RlMw0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3ByZXNlbnRhdGlvbl9mZWF0dXJlID0gXHU1NDQ4XHU3M2ZlXHU2NWI5XHU1ZjBmDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBcdTU3MTZcdTVmNjJcdTUxNDNcdTdkMjANCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9kaWFncmFtX2ZlYXR1cmUgPSBcdTU3MTZcdTg5ZTMNCi1fVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUgPSBcdTViZWNcdTVlYTYNCi1fVUlfRGltZW5zaW9uX2hlaWdodF9mZWF0dXJlID0gXHU5YWQ4XHU1ZWE2DQotX1VJX1JlZmVyZW5jZV9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbl9mZWF0dXJlID0gXHU2NjJmXHU1MDBiXHU1MjI1XHU3Njg0XHU4ODY4XHU3OTNhXHU2Y2Q1DQotX1VJX1JlZmVyZW5jZV9yZWZlcmVuY2VkX2ZlYXR1cmUgPSBcdTVkZjJcdTUzYzNcdTcxNjcNCi1fVUlfUHJvcGVydHlfa2V5X2ZlYXR1cmUgPSBcdTdkMjJcdTVmMTVcdTkzNzUNCi1fVUlfUHJvcGVydHlfdmFsdWVfZmVhdHVyZSA9IFx1NTAzYw0KLV9VSV9HcmFwaEVkZ2VfYW5jaG9yX2ZlYXR1cmUgPSBcdTkzMjhcdTllZGUNCi1fVUlfR3JhcGhFZGdlX3dheXBvaW50c19mZWF0dXJlID0gXHU4ZGVmXHU1ZjkxXHU5ZWRlDQotX1VJX0RpYWdyYW1fem9vbV9mZWF0dXJlID0gXHU3ZTJlXHU2NTNlDQotX1VJX0RpYWdyYW1fdmlld3BvaW50X2ZlYXR1cmUgPSBcdTg5YzBcdTllZGUNCi1fVUlfRGlhZ3JhbV9kaWFncmFtTGlua19mZWF0dXJlID0gXHU1NzE2XHU4OWUzXHU5M2M4XHU3ZDUwDQotX1VJX0RpYWdyYW1fbmFtZXNwYWNlX2ZlYXR1cmUgPSBcdTU0MGRcdTdhMzFcdTdhN2FcdTk1OTMNCi1fVUlfR3JhcGhOb2RlX3NpemVfZmVhdHVyZSA9IFx1NTkyN1x1NWMwZg0KLV9VSV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF90eXBlSW5mb19mZWF0dXJlID0gXHU5ODVlXHU1NzhiXHU4Y2M3XHU4YTBhDQotX1VJX1VNQVNlbWFudGljTW9kZWxCcmlkZ2VfZWxlbWVudF9mZWF0dXJlID0gXHU1MTQzXHU3ZDIwDQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IFx1NTE0M1x1N2QyMA0KLV9VSV9UZXh0RWxlbWVudF90ZXh0X2ZlYXR1cmUgPSBcdTY1ODdcdTViNTcNCi1fVUlfSW1hZ2VfdXJpX2ZlYXR1cmUgPSBVUkkNCi1fVUlfSW1hZ2VfbWltZVR5cGVfZmVhdHVyZSA9IE1JTUUgXHU5ODVlXHU1NzhiDQotX1VJX1BvbHlsaW5lX2Nsb3NlZF9mZWF0dXJlID0gXHU5NWRjXHU5NTg5DQotX1VJX1BvbHlsaW5lX3dheXBvaW50c19mZWF0dXJlID0gXHU4ZGVmXHU1ZjkxXHU5ZWRlDQotX1VJX0VsbGlwc2VfcmFkaXVzWF9mZWF0dXJlID0gXHU1MzRhXHU1ZjkxIFgNCi1fVUlfRWxsaXBzZV9yYWRpdXNZX2ZlYXR1cmUgPSBcdTUzNGFcdTVmOTEgWQ0KLV9VSV9FbGxpcHNlX3JvdGF0aW9uX2ZlYXR1cmUgPSBcdTY1Y2JcdThmNDkNCi1fVUlfRWxsaXBzZV9zdGFydEFuZ2xlX2ZlYXR1cmUgPSBcdThkNzdcdTU5Y2JcdTg5ZDJcdTVlYTYNCi1fVUlfRWxsaXBzZV9lbmRBbmdsZV9mZWF0dXJlID0gXHU3ZDUwXHU2NzVmXHU4OWQyXHU1ZWE2DQotX1VJX0VsbGlwc2VfY2VudGVyX2ZlYXR1cmUgPSBcdTRlMmRcdTU5MmUNCi1fVUlfQWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfZmVhdHVyZSA9IFx1NTIwNlx1ODllM1x1NTE0M1x1N2QyMA0KLV9VSV9BY3Rpdml0eV9yb2FkbWFwc19mZWF0dXJlID0gXHU1YzBlXHU4OWJkXHU1NzE2DQotX1VJX0FjdGl2aXR5X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSA9IFx1NjUyZlx1NjNmNFx1OGNjN1x1NjU5OQ0KLV9VSV9BY3Rpdml0eV9jaGVja2xpc3RzX2ZlYXR1cmUgPSBcdTY4MzhcdTVjMGRcdTZlMDVcdTU1YWUNCi1fVUlfQWN0aXZpdHlfY29uY2VwdHNfZmVhdHVyZSA9IFx1Njk4Mlx1NWZmNQ0KLV9VSV9BY3Rpdml0eV9leGFtcGxlc19mZWF0dXJlID0gXHU3YmM0XHU0ZjhiDQotX1VJX0FjdGl2aXR5X2d1aWRlbGluZXNfZmVhdHVyZSA9IFx1NmU5Nlx1NTI0Nw0KLV9VSV9BY3Rpdml0eV9yZXVzYWJsZUFzc2V0c19mZWF0dXJlID0gXHU1M2VmXHU5MWNkXHU4OTA3XHU0ZjdmXHU3NTI4XHU3Njg0XHU4Y2M3XHU3NTIyDQotX1VJX0FjdGl2aXR5X2lzRW5hY3RhYmxlX2ZlYXR1cmUgPSBcdTUzZWZcdTU1NWZcdTc1MjgNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNSZXBlYXRhYmxlX2ZlYXR1cmUgPSBcdTY2MmZcdTUzZWZcdTkxY2RcdTg5MDdcdTc2ODQNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNPbmdvaW5nX2ZlYXR1cmUgPSBcdTY2MmZcdTYzMDFcdTdlOGNcdTkwMzJcdTg4NGNcdTRlMmQNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNFdmVudERyaXZlbl9mZWF0dXJlID0gXHU2NjJmXHU0ZThiXHU0ZWY2XHU1YzBlXHU1NDExXHU3Njg0DQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2xpbmtUb1ByZWRlY2Vzc29yX2ZlYXR1cmUgPSBcdTkzYzhcdTdkNTBcdTgxZjNcdTUyNGRcdTRlMDBcdTcyNDgNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVmaXhfZmVhdHVyZSA9IFx1NWI1N1x1OTk5Ng0KLV9VSV9CcmVha2Rvd25FbGVtZW50X2lzUGxhbm5lZF9mZWF0dXJlID0gXHU1ZGYyXHU4OThmXHU1MjgzDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaGFzTXVsdGlwbGVPY2N1cnJlbmNlc19mZWF0dXJlID0gXHU1MTc3XHU1MDk5XHU1OTFhXHU2YjIxXHU1MWZhXHU3M2ZlXHU3Njg0XHU5ODA1XHU3NmVlDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNPcHRpb25hbF9mZWF0dXJlID0gXHU2NjJmXHU5MDc4XHU3NTI4XHU3Njg0DQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQWZ0ZXJfZmVhdHVyZSA9IFx1NTcyOFx1NGU0Ylx1NWY4Y1x1NTQ0OFx1NzNmZQ0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEJlZm9yZV9mZWF0dXJlID0gXHU1NzI4XHU0ZTRiXHU1MjRkXHU1NDQ4XHU3M2ZlDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcGxhbm5pbmdEYXRhX2ZlYXR1cmUgPSBcdTg5OGZcdTUyODNcdThjYzdcdTY1OTkNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9zdXBlckFjdGl2aXRpZXNfZmVhdHVyZSA9IFx1OGQ4NVx1NmQzYlx1NTJkNQ0KLV9VSV9UZWFtUHJvZmlsZV90ZWFtUm9sZXNfZmVhdHVyZSA9IFx1NTcxOFx1OTY4YVx1ODlkMlx1ODI3Mg0KLV9VSV9UZWFtUHJvZmlsZV9zdXBlclRlYW1fZmVhdHVyZSA9IFx1OGQ4NVx1NTcxOFx1OTY4YQ0KLV9VSV9UZWFtUHJvZmlsZV9zdWJUZWFtX2ZlYXR1cmUgPSBcdTViNTBcdTU3MThcdTk2OGENCi1fVUlfUm9sZURlc2NyaXB0b3JfUm9sZV9mZWF0dXJlID0gXHU4OWQyXHU4MjcyDQotX1VJX1JvbGVEZXNjcmlwdG9yX21vZGlmaWVzX2ZlYXR1cmUgPSBcdTRmZWVcdTY1MzlcdTk4MDVcdTc2ZWUNCi1fVUlfUm9sZURlc2NyaXB0b3JfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFx1OGNhMFx1OGNhYw0KLV9VSV9Xb3JrT3JkZXJfbGlua1R5cGVfZmVhdHVyZSA9IFx1OTNjOFx1N2Q1MFx1OTg1ZVx1NTc4Yg0KLV9VSV9Xb3JrT3JkZXJfcHJlZF9mZWF0dXJlID0gUHJlZA0KLV9VSV9QbGFubmluZ0RhdGFfc3RhcnREYXRlX2ZlYXR1cmUgPSBcdTk1OGJcdTU5Y2JcdTY1ZTVcdTY3MWYNCi1fVUlfUGxhbm5pbmdEYXRhX2ZpbmlzaERhdGVfZmVhdHVyZSA9IFx1NWI4Y1x1NjIxMFx1NjVlNVx1NjcxZg0KLV9VSV9QbGFubmluZ0RhdGFfcmFua19mZWF0dXJlID0gXHU3YjQ5XHU3ZDFhDQotX1VJX0Rlc2NyaXB0b3JfaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlX2ZlYXR1cmUgPSBcdTgyMDdcdTRmODZcdTZlOTBcdTU0MGNcdTZiNjUNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RW50cnlTdGF0ZV9mZWF0dXJlID0gXHU2ZDNiXHU1MmQ1XHU5MDMyXHU1MTY1XHU3MmMwXHU2MTRiDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUV4aXRTdGF0ZV9mZWF0dXJlID0gXHU2ZDNiXHU1MmQ1XHU3ZDUwXHU2NzVmXHU3MmMwXHU2MTRiDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdF9mZWF0dXJlID0gXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RlZEJ5X2ZlYXR1cmUgPSBcdTVmNzFcdTk3ZmZcdTgwMDUNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdHNfZmVhdHVyZSA9IFx1NWY3MVx1OTdmZg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfZGVsaXZlcmFibGVQYXJ0c19mZWF0dXJlID0gXHU0ZWE0XHU0ZWQ4XHU5ODA1XHU3NmVlXHU3ZDQ0XHU0ZWY2DQotX1VJX1Rhc2tEZXNjcmlwdG9yX1Rhc2tfZmVhdHVyZSA9IFx1NGY1Y1x1Njk2ZA0KLV9VSV9UYXNrRGVzY3JpcHRvcl9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeV9mZWF0dXJlID0gXHU2YjIxXHU4OTgxXHU1N2Y3XHU4ODRjXHU4MDA1DQotX1VJX1Rhc2tEZXNjcmlwdG9yX2Fzc2lzdGVkQnlfZmVhdHVyZSA9IFx1OGYxNFx1NTJhOVx1ODAwNQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9leHRlcm5hbElucHV0X2ZlYXR1cmUgPSBcdTU5MTZcdTkwZThcdThmMzhcdTUxNjUNCi1fVUlfVGFza0Rlc2NyaXB0b3JfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSA9IFx1NWYzN1x1NTIzNlx1OGYzOFx1NTE2NQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBcdTkwNzhcdTc1MjhcdThmMzhcdTUxNjUNCi1fVUlfVGFza0Rlc2NyaXB0b3Jfb3V0cHV0X2ZlYXR1cmUgPSBcdThmMzhcdTUxZmENCi1fVUlfVGFza0Rlc2NyaXB0b3JfcGVyZm9ybWVkUHJpbWFyaWx5QnlfZmVhdHVyZSA9IFx1NGUzYlx1ODk4MVx1NTdmN1x1ODg0Y1x1ODAwNQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9zZWxlY3RlZFN0ZXBzX2ZlYXR1cmUgPSBcdTVkZjJcdTkwNzhcdTUzZDZcdTc2ODRcdTZiNjVcdTlhNWYNCi1fVUlfQ29tcG9zaXRlUm9sZV9hZ2dyZWdhdGVkUm9sZXNfZmVhdHVyZSA9IFx1ODA1YVx1OTZjNlx1NzY4NFx1ODlkMlx1ODI3Mg0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdXNhZ2VHdWlkYW5jZV9mZWF0dXJlID0gXHU3NTI4XHU2Y2Q1XHU2MzA3XHU1ZjE1DQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gXHU3NmVlXHU3Njg0DQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBcdTY2ZmZcdTRlZTNcdTY1YjlcdTY4NDgNCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9ob3d0b1N0YWZmX2ZlYXR1cmUgPSBcdTY3MGRcdTUyZDlcdTRlYmFcdTU0ZTENCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fc2NhbGVfZmVhdHVyZSA9IFx1OGFiZlx1NjU3NFx1NmJkNFx1NGY4Yg0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzX2ZlYXR1cmUgPSBcdTVjMDhcdTY4NDhcdTYwMjdcdThjZWENCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcmlza0xldmVsX2ZlYXR1cmUgPSBcdTk4YThcdTk2YWFcdTVjNjRcdTZiMjENCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fZXN0aW1hdGluZ1RlY2huaXF1ZV9mZWF0dXJlID0gXHU5ODEwXHU0ZjMwXHU2MjgwXHU4ODUzDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RNZW1iZXJFeHBlcnRpc2VfZmVhdHVyZSA9IFx1NWMwOFx1Njg0OFx1NjIxMFx1NTRlMVx1NWMwOFx1Njk2ZFx1NzdlNVx1OGI1OA0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlT2ZDb250cmFjdF9mZWF0dXJlID0gXHU1NDA4XHU3ZDA0XHU5ODVlXHU1NzhiDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBcdTU5MTZcdTkwZTggSUQNCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3Njb3BlX2ZlYXR1cmUgPSBcdTdiYzRcdTU3MGQNCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3VzYWdlTm90ZXNfZmVhdHVyZSA9IFx1NGY3Zlx1NzUyOFx1NmNlOFx1NjEwZlx1NGU4Ylx1OTgwNQ0KLV9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fcmVmaW5lZERlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdTVkZjJcdTRmZWVcdTZiNjNcdTc2ODRcdThhYWFcdTY2MGUNCi1fVUlfUHJhY3RpY2Vfc3ViUHJhY3RpY2VzX2ZlYXR1cmUgPSBcdTViNTBcdTdkZjRcdTdmZDINCi1fVUlfUHJhY3RpY2VfY29udGVudFJlZmVyZW5jZXNfZmVhdHVyZSA9IFx1NTE2N1x1NWJiOVx1NTNjM1x1NzE2Nw0KLV9VSV9QcmFjdGljZV9hY3Rpdml0eVJlZmVyZW5jZXNfZmVhdHVyZSA9IFx1NmQzYlx1NTJkNVx1NTNjM1x1NzE2Nw0KLV9VSV9TdGF0ZV9Xb3JrUHJvZHVjdF9mZWF0dXJlID0gXHU1ZGU1XHU0ZjVjXHU2MjEwXHU2NzljDQotX1VJX1N0YXRlX1JlZ2lvbl9mZWF0dXJlID0gXHU1MzQwXHU1N2RmDQotX1VJX1N0YXRlX3N1Ym1hY2hpbmVfZmVhdHVyZSA9IFx1NWI1MFx1NmE1Zg0KLV9VSV9WZXJ0ZXhfY29udGFpbmVyX2ZlYXR1cmUgPSBcdTUxMzJcdTViNThcdTU2NjgNCi1fVUlfVmVydGV4X291dGdvaW5nX2ZlYXR1cmUgPSBcdTkwMjNcdTUxZmENCi1fVUlfVmVydGV4X2luY29taW5nX2ZlYXR1cmUgPSBcdTkwMjNcdTUxNjUNCi1fVUlfUmVnaW9uX1ZlcnRleF9mZWF0dXJlID0gXHU5ODAyXHU5ZWRlDQotX1VJX1JlZ2lvbl9UcmFuc2l0aW9uX2ZlYXR1cmUgPSBcdThmNDlcdTYzZGINCi1fVUlfUmVnaW9uX1N0YXRlX2ZlYXR1cmUgPSBcdTcyYzBcdTYxNGINCi1fVUlfUmVnaW9uX1N0YXRlTWFjaGluZV9mZWF0dXJlID0gXHU3MmMwXHU2MTRiXHU2YTVmDQotX1VJX1N0YXRlTWFjaGluZV9SZWdpb25fZmVhdHVyZSA9IFx1NTM0MFx1NTdkZg0KLV9VSV9UcmFuc2l0aW9uX1dvcmtEZWZpbml0aW9uX2ZlYXR1cmUgPSBcdTVkZTVcdTRmNWNcdTViOWFcdTdmYTkNCi1fVUlfVHJhbnNpdGlvbl9jb250YWluZXJfZmVhdHVyZSA9IFx1NTEzMlx1NWI1OFx1NTY2OA0KLV9VSV9UcmFuc2l0aW9uX3NvdXJjZV9mZWF0dXJlID0gXHU0Zjg2XHU2ZTkwDQotX1VJX1RyYW5zaXRpb25fdGFyZ2V0X2ZlYXR1cmUgPSBcdTc2ZWVcdTZhMTkNCi1fVUlfRGlzY2lwbGluZV90YXNrc19mZWF0dXJlID0gXHU0ZjVjXHU2OTZkDQotX1VJX0Rpc2NpcGxpbmVfc3ViZGlzY2lwbGluZV9mZWF0dXJlID0gXHU1YjUwXHU4OThmXHU3YmM0DQotX1VJX0Rpc2NpcGxpbmVfcmVmZXJlbmNlV29ya2Zsb3dzX2ZlYXR1cmUgPSBcdTUzYzNcdTcxNjdcdTVkZTVcdTRmNWNcdTZkNDFcdTdhMGINCi1fVUlfUm9sZVNldF9yb2xlc19mZWF0dXJlID0gXHU4OWQyXHU4MjcyDQotX1VJX0RvbWFpbl93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLV9VSV9Eb21haW5fc3ViZG9tYWluc19mZWF0dXJlID0gXHU1YjUwXHU5ODE4XHU1N2RmDQotX1VJX1dvcmtQcm9kdWN0VHlwZV93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFx1NWRlNVx1NGY1Y1x1NjIxMFx1Njc5Yw0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSA9IFx1ODk4Zlx1N2JjNA0KLV9VSV9Ub29sX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBcdTVkZTVcdTUxNzdcdThmMTRcdTUyYTkNCi1fVUlfUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX2ZlYXR1cmUgPSBcdTg5ZDJcdTgyNzJcdTk2YzYNCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfY2F0ZWdvcml6ZWRFbGVtZW50c19mZWF0dXJlID0gXHU1ZGYyXHU1MjA2XHU5ODVlXHU3Njg0XHU1MTQzXHU3ZDIwDQotX1VJX0N1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfZmVhdHVyZSA9IFx1NWI1MFx1N2EyZVx1OTg1ZQ0KLV9VSV9EZWxpdmVyeVByb2Nlc3NfZWR1Y2F0aW9uTWF0ZXJpYWxzX2ZlYXR1cmUgPSBcdTY1NTlcdTgwYjJcdThjYzdcdTY1OTkNCi1fVUlfRGVsaXZlcnlQcm9jZXNzX2NvbW11bmljYXRpb25zTWF0ZXJpYWxzX2ZlYXR1cmUgPSBcdTZlOWRcdTkwMWFcdThjYzdcdTY1OTkNCi1fVUlfUHJvY2Vzc19pbmNsdWRlc1BhdHRlcm5zX2ZlYXR1cmUgPSBcdTUzMDVcdTU0MmJcdTU3OGJcdTZhMjMNCi1fVUlfUHJvY2Vzc19kZWZhdWx0Q29udGV4dF9mZWF0dXJlID0gXHU5ODEwXHU4YTJkXHU3NGIwXHU1ODgzXHU1YjlhXHU3ZmE5DQotX1VJX1Byb2Nlc3NfdmFsaWRDb250ZXh0X2ZlYXR1cmUgPSBcdTY3MDlcdTY1NDhcdTc2ODRcdTc0YjBcdTU4ODNcdTViOWFcdTdmYTkNCi1fVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfYmFzZWRPblByb2Nlc3Nlc19mZWF0dXJlID0gXHU1N2ZhXHU2NWJjXHU3YTBiXHU1ZThmDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfaW50ZXJmYWNlc19mZWF0dXJlID0gXHU0ZWNiXHU5NzYyDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19mZWF0dXJlID0gXHU3YTBiXHU1ZThmDQotX1VJX1Byb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19mZWF0dXJlID0gXHU3YTBiXHU1ZThmXHU1MTQzXHU3ZDIwDQotX1VJX1Byb2Nlc3NQYWNrYWdlX2RpYWdyYW1zX2ZlYXR1cmUgPSBcdTU3MTZcdTg5ZTMNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uc19mZWF0dXJlID0gXHU0ZWNiXHU5NzYyXHU4OThmXHU2ODNjDQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlSU9fZmVhdHVyZSA9IFx1NGVjYlx1OTc2MiBJTw0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9Qcm9jZXNzQ29tcG9uZW50X2ZlYXR1cmUgPSBcdTdhMGJcdTVlOGZcdTUxNDNcdTRlZjYNCi1fVUlfTWV0aG9kUGx1Z2luX3VzZXJDaGFuZ2VhYmxlX2ZlYXR1cmUgPSBcdTRmN2ZcdTc1MjhcdTgwMDVcdTUzZWZcdTRlZTVcdThiOGFcdTY2ZjQNCi1fVUlfTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX2ZlYXR1cmUgPSBcdTY1YjlcdTZjZDVcdTU5NTdcdTRlZjYNCi1fVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUgPSBcdTU3ZmFcdTc5MGUNCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5VHlwZV9mZWF0dXJlID0gXHU4YjhhXHU1MzE2XHU2MDI3XHU5ODVlXHU1NzhiDQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUgPSBcdTU3ZmFcdTY1YmNcdTUxNDNcdTdkMjBcdTc2ODRcdThiOGFcdTUzMTZcdTYwMjcNCi1fVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUgPSBcdTRmNWNcdTgwMDUNCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUgPSBcdThiOGFcdTY2ZjRcdTY1ZTVcdTY3MWYNCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEZXNjcmlwdGlvbl9mZWF0dXJlID0gXHU4YjhhXHU2NmY0XHU4YWFhXHU2NjBlDQotX1VJX01ldGhvZFVuaXRfdmVyc2lvbl9mZWF0dXJlID0gXHU3MjQ4XHU2NzJjDQotX1VJX01ldGhvZFVuaXRfY29weXJpZ2h0U3RhdGVtZW50X2ZlYXR1cmUgPSBcdTcyNDhcdTZiMGFcdTgwNzJcdTY2MGUNCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQbHVnaW5TZWxlY3Rpb25fZmVhdHVyZSA9IFx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZlx1OTA3OFx1NjRjNw0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBhY2thZ2VTZWxlY3Rpb25fZmVhdHVyZSA9IFx1NjViOVx1NmNkNVx1NTk1N1x1NGVmNlx1OTA3OFx1OTgwNQ0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3Byb2Nlc3NWaWV3c19mZWF0dXJlID0gXHU3YTBiXHU1ZThmXHU4OTk2XHU1NzE2DQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fZGVmYXVsdFZpZXdfZmVhdHVyZSA9IFx1OTgxMFx1OGEyZFx1ODk5Nlx1NTcxNg0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2Jhc2VDb25maWd1cmF0aW9uc19mZWF0dXJlID0gXHU1N2ZhXHU3OTBlXHU5MTRkXHU3ZjZlDQotX1VJX1Byb2Nlc3NGYW1pbHlfZGVsaXZlcnlQcm9jZXNzZXNfZmVhdHVyZSA9IFx1NGVhNFx1NGVkOFx1NmQ0MVx1N2EwYg0KLV9VSV9NZXRob2RMaWJyYXJ5X21ldGhvZFBsdWdpbnNfZmVhdHVyZSA9IFx1NjViOVx1NmNkNVx1NTkxNlx1NjM5Ylx1N2EwYlx1NWYwZg0KLV9VSV9NZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19mZWF0dXJlID0gXHU5ODEwXHU1MTQ4XHU1YjlhXHU3ZmE5XHU3Njg0XHU5MTRkXHU3ZjZlDQotX1VJX1Vua25vd25fZmVhdHVyZSA9IFx1NjcyYVx1NjMwN1x1NWI5YQ0KLQ0KLV9VSV9Xb3JrT3JkZXJUeXBlX2ZpbmlzaFRvU3RhcnRfbGl0ZXJhbCA9IGZpbmlzaFRvU3RhcnQNCi1fVUlfV29ya09yZGVyVHlwZV9maW5pc2hUb0ZpbmlzaF9saXRlcmFsID0gZmluaXNoVG9GaW5pc2gNCi1fVUlfV29ya09yZGVyVHlwZV9zdGFydFRvU3RhcnRfbGl0ZXJhbCA9IHN0YXJ0VG9TdGFydA0KLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9GaW5pc2hfbGl0ZXJhbCA9IHN0YXJ0VG9GaW5pc2gNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2luaXRpYWxfbGl0ZXJhbCA9IFx1OGQ3N1x1NTljYg0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfam9pbl9saXRlcmFsID0gXHU3ZDUwXHU1NDA4DQotX1VJX1BzZXVkb1N0YXRlS2luZF9mb3JrX2xpdGVyYWwgPSBcdTUyMDZcdTUxZmENCi1fVUlfUHNldWRvU3RhdGVLaW5kX2p1bmN0aW9uX2xpdGVyYWwgPSBcdTkwMjNcdTdkNTANCi1fVUlfUHNldWRvU3RhdGVLaW5kX2Nob2ljZV9saXRlcmFsID0gXHU5MDc4XHU2NGM3DQotX1VJX1BzZXVkb1N0YXRlS2luZF9lbnRyeVBvaW50X2xpdGVyYWwgPSBcdTkwMzJcdTUxNjVcdTllZGUNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2V4aXRQb2ludF9saXRlcmFsID0gXHU4ZGYzXHU1MWZhXHU5ZWRlDQotX1VJX1BzZXVkb1N0YXRlS2luZF90ZXJtaW5hdGVfbGl0ZXJhbCA9IFx1N2Q0Mlx1NmI2Mg0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfbmFfbGl0ZXJhbCA9IFx1NzEyMQ0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfY29udHJpYnV0ZXNfbGl0ZXJhbCA9IFx1NjNkMFx1NTFmYQ0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfZXh0ZW5kc19saXRlcmFsID0gXHU1ZWY2XHU0ZjM4DQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9yZXBsYWNlc19saXRlcmFsID0gXHU1M2Q2XHU0ZWUzDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9sb2NhbENvbnRyaWJ1dGlvbl9saXRlcmFsID0gbG9jYWxDb250cmlidXRpb24NCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsUmVwbGFjZW1lbnRfbGl0ZXJhbCA9IGxvY2FsUmVwbGFjZW1lbnQNCi1fVUlfQXJ0aWZhY3REZXNjcmlwdG9yX3R5cGUgPSBcdTY5Y2JcdTRlZjZcdTYzY2ZcdThmZjBcdTViNTANCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdG9yX3R5cGUgPSBcdTRlYTRcdTRlZDhcdTk4MDVcdTc2ZWVcdTYzY2ZcdThmZjBcdTViNTANCi1fVUlfT3V0Y29tZURlc2NyaXB0b3JfdHlwZSA9IFx1OGYzOFx1NTFmYVx1N2Q1MFx1Njc5Y1x1NjNjZlx1OGZmMFx1NWI1MA0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMi8uY2xhc3NwYXRoIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDIvLnByb2plY3QgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRiNTk0ZDguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNGJiMzMyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwyLmphcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogZnJhZ21lbnQKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMi9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwMzY5YTAuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS5ubDIuamFyID0gc3JjLw0KLW91dHB1dC5ubDIuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IG5sMi5qYXIsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIGZyYWdtZW50LnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDIvZnJhZ21lbnQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMi9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MGQ0ZTRhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMi9mcmFnbWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mcmFnbWVudE5hbWU9RVBGIENvbXBvc2VyIFVNQSBFZGl0IChOTDIpDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZDdmNmJhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMi9wbHVnaW5fcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLXBsdWdpbk5hbWUgPSBFTUYgVU1BIC0gXHUwNDIwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IC0gXHUwNDFmXHUwNDNlXHUwNDM0XHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDNhXHUwNDMwDQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dCA9IHswfQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MiA9IHsxfSB7MH0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDMgPSB7MX0NCi1fVUlfQ3JlYXRlQ2hpbGRfdG9vbHRpcCA9IFx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyB7MH0gXHUwNDMyIFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzYlx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzNSB7MX0NCi1fVUlfQ3JlYXRlQ2hpbGRfZGVzY3JpcHRpb24gPSBcdTA0MjFcdTA0M2VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NDJcdTA0NGMgXHUwNDM0XHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDQwXHUwNDNkXHUwNDM4XHUwNDM5IFx1MDQzZVx1MDQzMVx1MDQ0YVx1MDQzNVx1MDQzYVx1MDQ0MiBcdTA0NDJcdTA0MzhcdTA0M2ZcdTA0MzAgezB9IFx1MDQzNFx1MDQzYlx1MDQ0ZiBcdTA0M2FcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzAgezF9IFx1MDQzMiBcdTA0MzJcdTA0NGJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M2RcdTA0M2RcdTA0M2VcdTA0M2MgXHUwNDNlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDM1IHsyfS4NCi1fVUlfQ3JlYXRlU2libGluZ19kZXNjcmlwdGlvbiA9IFx1MDQyMVx1MDQzZVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0YyBcdTA0NDFcdTA0MzVcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzhcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzkgXHUwNDRkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQ0Mlx1MDQzOFx1MDQzZlx1MDQzMCB7MH0gXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzMlx1MDQ0Ylx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSB7Mn0gXHUwNDMyIFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzYlx1MDQzNVx1MDQzYVx1MDQ0Mlx1MDQzNSB7MX0gXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMC4NCi0NCi1fVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uID0gXHUwNDFlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDNhXHUwNDQyIHswfSBcdTA0M2VcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDJcdTA0MzAgezF9DQotDQotX1VJX0NsYXNzaWZpZXJfdHlwZSA9IFx1MDQxYVx1MDQzYlx1MDQzMFx1MDQ0MVx1MDQ0MVx1MDQzOFx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Mlx1MDQzZVx1MDQ0MA0KLV9VSV9UeXBlX3R5cGUgPSBcdTA0MjJcdTA0MzhcdTA0M2YNCi1fVUlfRWxlbWVudF90eXBlID0gXHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyDQotX1VJX05hbWVkRWxlbWVudF90eXBlID0gXHUwNDE4XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mg0KLV9VSV9QYWNrYWdlYWJsZUVsZW1lbnRfdHlwZSA9IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2ZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDJcdTA0MzANCi1fVUlfUGFja2FnZV90eXBlID0gXHUwNDFmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyDQotX1VJX05hbWVzcGFjZV90eXBlID0gXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDNlIFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZA0KLV9VSV9NZXRob2RFbGVtZW50X3R5cGUgPSBcdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotX1VJX0NvbnN0cmFpbnRfdHlwZSA9IFx1MDQxZVx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLV9VSV9Db250ZW50RWxlbWVudF90eXBlID0gXHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMg0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSA9IFx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQ0Ylx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzY1x1MDQ0Ylx1MDQzOSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDINCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUgPSBcdTA0MWVcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyDQotX1VJX1NlY3Rpb25fdHlwZSA9IFx1MDQyMFx1MDQzMFx1MDQzN1x1MDQzNFx1MDQzNVx1MDQzYg0KLV9VSV9Sb2xlX3R5cGUgPSBcdTA0MjBcdTA0M2VcdTA0M2JcdTA0NGMNCi1fVUlfV29ya1Byb2R1Y3RfdHlwZSA9IFx1MDQyMFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDINCi1fVUlfVGFza190eXBlID0gXHUwNDE3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDMwDQotX1VJX1dvcmtEZWZpbml0aW9uX3R5cGUgPSBcdTA0MWVcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDRiDQotX1VJX1N0ZXBfdHlwZSA9IFx1MDQyOFx1MDQzMFx1MDQzMw0KLV9VSV9HdWlkYW5jZV90eXBlID0gXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmDQotX1VJX0FydGlmYWN0X3R5cGUgPSBcdTA0MTBcdTA0NDBcdTA0NDJcdTA0MzVcdTA0NDRcdTA0MzBcdTA0M2FcdTA0NDINCi1fVUlfRGVsaXZlcmFibGVfdHlwZSA9IFx1MDQxYVx1MDQzZVx1MDQzZFx1MDQzNVx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDINCi1fVUlfT3V0Y29tZV90eXBlID0gXHUwNDE4XHUwNDQxXHUwNDQ1XHUwNDNlXHUwNDM0DQotX1VJX01ldGhvZFBhY2thZ2VfdHlwZSA9IFx1MDQxZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0MiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0M2VcdTA0MzINCi1fVUlfQ29udGVudFBhY2thZ2VfdHlwZSA9IFx1MDQxZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0MiBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0M2VcdTA0MzINCi1fVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl90eXBlID0gXHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzNVx1MDQ0NFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzMA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3R5cGUgPSBcdTA0MWVcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMA0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3R5cGUgPSBcdTA0MWVcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMA0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fdHlwZSA9IFx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzgNCi1fVUlfVGFza0Rlc2NyaXB0aW9uX3R5cGUgPSBcdTA0MWVcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQ3XHUwNDM4DQotX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fdHlwZSA9IFx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDNcdTA0M2FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl90eXBlID0gXHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzOFx1MDQzYVx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1fVUlfUG9pbnRfdHlwZSA9IFx1MDQyMlx1MDQzZVx1MDQ0N1x1MDQzYVx1MDQzMA0KLV9VSV9HcmFwaEVsZW1lbnRfdHlwZSA9IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzhcdTA0M2FcdTA0MzANCi1fVUlfRGlhZ3JhbUVsZW1lbnRfdHlwZSA9IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0NGINCi1fVUlfRGlhZ3JhbUxpbmtfdHlwZSA9IFx1MDQyMVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzMCBcdTA0M2RcdTA0MzAgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDQzDQotX1VJX0dyYXBoQ29ubmVjdG9yX3R5cGUgPSBcdTA0MjFcdTA0M2VcdTA0MzVcdTA0MzRcdTA0MzhcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDNiXHUwNDM4XHUwNDNkXHUwNDM4XHUwNDRmDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSA9IFx1MDQxY1x1MDQzZVx1MDQ0MVx1MDQ0MiBcdTA0NDFcdTA0MzVcdTA0M2NcdTA0MzBcdTA0M2RcdTA0NDJcdTA0MzhcdTA0NDdcdTA0MzVcdTA0NDFcdTA0M2FcdTA0M2VcdTA0MzkgXHUwNDNjXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDNiXHUwNDM4DQotX1VJX0RpbWVuc2lvbl90eXBlID0gXHUwNDIwXHUwNDMwXHUwNDM3XHUwNDNjXHUwNDM1XHUwNDQwXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDRjDQotX1VJX1JlZmVyZW5jZV90eXBlID0gXHUwNDIxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDMwDQotX1VJX1Byb3BlcnR5X3R5cGUgPSBcdTA0MjFcdTA0MzJcdTA0M2VcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0M2UNCi1fVUlfR3JhcGhFZGdlX3R5cGUgPSBcdTA0MWFcdTA0NDBcdTA0MzBcdTA0MzkgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDM4XHUwNDNhXHUwNDMwDQotX1VJX0RpYWdyYW1fdHlwZSA9IFx1MDQxNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQzMA0KLV9VSV9HcmFwaE5vZGVfdHlwZSA9IFx1MDQyM1x1MDQzN1x1MDQzNVx1MDQzYiBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzhcdTA0M2FcdTA0MzANCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZSA9IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0NDJcdTA0M2VcdTA0MzkgXHUwNDQxXHUwNDM1XHUwNDNjXHUwNDMwXHUwNDNkXHUwNDQyXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDNlXHUwNDM5IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzOA0KLV9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBcdTA0MWNcdTA0M2VcdTA0NDFcdTA0NDIgXHUwNDQxXHUwNDM1XHUwNDNjXHUwNDMwXHUwNDNkXHUwNDQyXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDNlXHUwNDM5IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzOCBVTUENCi1fVUlfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSA9IFx1MDQxY1x1MDQzZVx1MDQ0MVx1MDQ0MiBcdTA0MzFcdTA0MzBcdTA0MzdcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzkgXHUwNDQxXHUwNDM1XHUwNDNjXHUwNDMwXHUwNDNkXHUwNDQyXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDNlXHUwNDM5IFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQzOA0KLV9VSV9MZWFmRWxlbWVudF90eXBlID0gXHUwNDFhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mg0KLV9VSV9UZXh0RWxlbWVudF90eXBlID0gXHUwNDIyXHUwNDM1XHUwNDNhXHUwNDQxXHUwNDQyXHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM5IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mg0KLV9VSV9JbWFnZV90eXBlID0gXHUwNDE4XHUwNDM3XHUwNDNlXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1DQotX1VJX0dyYXBoaWNQcmltaXRpdmVfdHlwZSA9IFx1MDQxM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0M2NcdTA0MzhcdTA0NDJcdTA0MzhcdTA0MzINCi1fVUlfUG9seWxpbmVfdHlwZSA9IFx1MDQxYlx1MDQzZVx1MDQzY1x1MDQzMFx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0M2JcdTA0MzhcdTA0M2RcdTA0MzhcdTA0NGYNCi1fVUlfRWxsaXBzZV90eXBlID0gXHUwNDJkXHUwNDNiXHUwNDNiXHUwNDM4XHUwNDNmXHUwNDQxDQotX1VJX0FjdGl2aXR5X3R5cGUgPSBcdTA0MWVcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NDNcdTA0NDBcdTA0NGIgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDRiDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NDNcdTA0NDBcdTA0NGINCi1fVUlfTWlsZXN0b25lX3R5cGUgPSBcdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDJcdTA0NDBcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDQyXHUwNDNlXHUwNDQ3XHUwNDNhXHUwNDMwDQotX1VJX0l0ZXJhdGlvbl90eXBlID0gXHUwNDE4XHUwNDQyXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmDQotX1VJX1BoYXNlX3R5cGUgPSBcdTA0MmRcdTA0NDJcdTA0MzBcdTA0M2YNCi1fVUlfVGVhbVByb2ZpbGVfdHlwZSA9IFx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzYiBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0M2ZcdTA0M2ZcdTA0NGINCi1fVUlfUm9sZURlc2NyaXB0b3JfdHlwZSA9IFx1MDQxNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzgNCi1fVUlfV29ya09yZGVyX3R5cGUgPSBcdTA0MWZcdTA0M2VcdTA0NDBcdTA0NGZcdTA0MzRcdTA0M2VcdTA0M2EgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotX1VJX1Byb2Nlc3NFbGVtZW50X3R5cGUgPSBcdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwDQotX1VJX1BsYW5uaW5nRGF0YV90eXBlID0gXHUwNDE0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQzYlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Zg0KLV9VSV9EZXNjcmlwdG9yX3R5cGUgPSBcdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDANCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX3R5cGUgPSBcdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMA0KLV9VSV9UYXNrRGVzY3JpcHRvcl90eXBlID0gXHUwNDE0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzOA0KLV9VSV9Db21wb3NpdGVSb2xlX3R5cGUgPSBcdTA0MjFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDQwXHUwNDNlXHUwNDNiXHUwNDRjDQotX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl90eXBlID0gXHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMCBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2FcdTA0NDJcdTA0NDNcdTA0NDBcdTA0NGINCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl90eXBlID0gXHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZVx1MDQzZlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gXHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMCBcdTA0MzRcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2FcdTA0MzgNCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUgPSBcdTA0MWVcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwDQotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlID0gXHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzMA0KLV9VSV9Db25jZXB0X3R5cGUgPSBcdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDZcdTA0MzVcdTA0M2ZcdTA0NDZcdTA0MzhcdTA0NGYNCi1fVUlfQ2hlY2tsaXN0X3R5cGUgPSBcdTA0MjFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDQyXHUwNDMwXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDQ2XHUwNDMwDQotX1VJX0V4YW1wbGVfdHlwZSA9IFx1MDQxZlx1MDQ0MFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQ0MA0KLV9VSV9HdWlkZWxpbmVfdHlwZSA9IFx1MDQyMFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0Zg0KLV9VSV9SZXBvcnRfdHlwZSA9IFx1MDQxZVx1MDQ0Mlx1MDQ0N1x1MDQzNVx1MDQ0Mg0KLV9VSV9UZW1wbGF0ZV90eXBlID0gXHUwNDI4XHUwNDMwXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNkDQotX1VJX1N1cHBvcnRpbmdNYXRlcmlhbF90eXBlID0gXHUwNDIxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0Yg0KLV9VSV9Ub29sTWVudG9yX3R5cGUgPSBcdTA0MjBcdTA0NDNcdTA0M2FcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzJcdTA0M2UgXHUwNDNmXHUwNDNlIFx1MDQzOFx1MDQzZFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0Mw0KLV9VSV9XaGl0ZXBhcGVyX3R5cGUgPSBcdTA0MThcdTA0M2RcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0M2VcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDMxXHUwNDRlXHUwNDNiXHUwNDNiXHUwNDM1XHUwNDQyXHUwNDM1XHUwNDNkXHUwNDRjDQotX1VJX1Rlcm1EZWZpbml0aW9uX3R5cGUgPSBcdTA0MWVcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDNjXHUwNDM4XHUwNDNkXHUwNDMwDQotX1VJX1ByYWN0aWNlX3R5cGUgPSBcdTA0MWZcdTA0NDBcdTA0MzBcdTA0M2FcdTA0NDJcdTA0MzhcdTA0M2FcdTA0MzAgXHUwNDMyXHUwNDRiXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotX1VJX0VzdGltYXRpb25Db25zaWRlcmF0aW9uc190eXBlID0gXHUwNDIwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQzZSBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0M2RcdTA0M2FcdTA0MzUNCi1fVUlfUmV1c2FibGVBc3NldF90eXBlID0gXHUwNDFjXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM5IFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MQ0KLV9VSV9TdGF0ZV90eXBlID0gXHUwNDIxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDNlXHUwNDRmXHUwNDNkXHUwNDM4XHUwNDM1DQotX1VJX1ZlcnRleF90eXBlID0gXHUwNDEyXHUwNDM1XHUwNDQwXHUwNDQ4XHUwNDM4XHUwNDNkXHUwNDMwDQotX1VJX1JlZ2lvbl90eXBlID0gXHUwNDFlXHUwNDMxXHUwNDNiXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDRjDQotX1VJX1N0YXRlTWFjaGluZV90eXBlID0gXHUwNDFhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQzY1x1MDQzMFx1MDQ0Mg0KLV9VSV9UcmFuc2l0aW9uX3R5cGUgPSBcdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0NDVcdTA0M2VcdTA0MzQNCi1fVUlfUHNldWRvU3RhdGVfdHlwZSA9IFx1MDQxZlx1MDQ0MVx1MDQzNVx1MDQzMlx1MDQzNFx1MDQzZVx1MDQ0MVx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzZVx1MDQ0Zlx1MDQzZFx1MDQzOFx1MDQzNQ0KLV9VSV9EaXNjaXBsaW5lX3R5cGUgPSBcdTA0MTRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2RcdTA0MzANCi1fVUlfQ29udGVudENhdGVnb3J5X3R5cGUgPSBcdTA0MWFcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NGYgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDNlXHUwNDMyDQotX1VJX1JvbGVTZXRfdHlwZSA9IFx1MDQxZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MCBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkNCi1fVUlfRG9tYWluX3R5cGUgPSBcdTA0MTRcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2QNCi1fVUlfV29ya1Byb2R1Y3RUeXBlX3R5cGUgPSBcdTA0MjJcdTA0MzhcdTA0M2YgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM1XHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMA0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfdHlwZSA9IFx1MDQxM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQzMCBcdTA0MzRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2QNCi1fVUlfVG9vbF90eXBlID0gXHUwNDE4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyDQotX1VJX1JvbGVTZXRHcm91cGluZ190eXBlID0gXHUwNDEzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDRiIFx1MDQzZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQzMiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkNCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfdHlwZSA9IFx1MDQxZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiBcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NGYNCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUgPSBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDEgXHUwNDM0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNhXHUwNDM4DQotX1VJX1Byb2Nlc3NfdHlwZSA9IFx1MDQxZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MQ0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybl90eXBlID0gXHUwNDI4XHUwNDMwXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNkIFx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzOQ0KLV9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV90eXBlID0gXHUwNDI4XHUwNDMwXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNkIFx1MDQzZlx1MDQzYlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0MFx1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzANCi1fVUlfUm9hZG1hcF90eXBlID0gXHUwNDFmXHUwNDQzXHUwNDQyXHUwNDM1XHUwNDMyXHUwNDNlXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSA9IFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzANCi1fVUlfUHJvY2Vzc1BhY2thZ2VfdHlwZSA9IFx1MDQxZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0MiBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0M2VcdTA0MzINCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV90eXBlID0gXHUwNDE4XHUwNDNkXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDQ0XHUwNDM1XHUwNDM5XHUwNDQxIFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMCBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0MzANCi1fVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfdHlwZSA9IFx1MDQxNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0M2FcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0M2RcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzAgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDMwDQotX1VJX01ldGhvZFBsdWdpbl90eXBlID0gXHUwNDFjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDRjIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSA9IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0MzJcdTA0MzBcdTA0NDBcdTA0MzhcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzgNCi1fVUlfTWV0aG9kVW5pdF90eXBlID0gXHUwNDExXHUwNDNiXHUwNDNlXHUwNDNhIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzMA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUgPSBcdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgXHUwNDNjXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDM0XHUwNDMwDQotX1VJX1Byb2Nlc3NGYW1pbHlfdHlwZSA9IFx1MDQyMVx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0M2VcdTA0MzINCi1fVUlfTWV0aG9kTGlicmFyeV90eXBlID0gXHUwNDExXHUwNDM4XHUwNDMxXHUwNDNiXHUwNDM4XHUwNDNlXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDMwIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLV9VSV9Vbmtub3duX3R5cGUgPSBcdTA0MWVcdTA0MzFcdTA0NGFcdTA0MzVcdTA0M2FcdTA0NDINCi0NCi1fVUlfVW5rbm93bl9kYXRhdHlwZT0gXHUwNDE3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1DQotDQotX1VJX05hbWVkRWxlbWVudF9uYW1lX2ZlYXR1cmUgPSBcdTA0MThcdTA0M2NcdTA0NGYNCi1fVUlfTWV0aG9kRWxlbWVudF9ndWlkX2ZlYXR1cmUgPSBHVUlEDQotX1VJX01ldGhvZEVsZW1lbnRfYnJpZWZEZXNjcmlwdGlvbl9mZWF0dXJlID0gXHUwNDFlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1DQotX1VJX01ldGhvZEVsZW1lbnRfb3duZWRSdWxlc19mZWF0dXJlID0gXHUwNDIxXHUwNDNlXHUwNDMxXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzOFx1MDQzYlx1MDQzMA0KLV9VSV9NZXRob2RFbGVtZW50X3N1cHByZXNzZWRfZmVhdHVyZSA9IFx1MDQyMVx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mlx1MDQ0Ylx1MDQzOQ0KLV9VSV9NZXRob2RFbGVtZW50X29yZGVyaW5nR3VpZGVfZmVhdHVyZSA9IFx1MDQxZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzOFx1MDQzYlx1MDQzMCBcdTA0NDNcdTA0M2ZcdTA0M2VcdTA0NDBcdTA0NGZcdTA0MzRcdTA0M2VcdTA0NDdcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1fVUlfQ29uc3RyYWludF9ib2R5X2ZlYXR1cmUgPSBcdTA0MjJcdTA0MzVcdTA0M2FcdTA0NDFcdTA0NDIgXHUwNDQxXHUwNDNlXHUwNDNlXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotX1VJX0NvbnRlbnRFbGVtZW50X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSA9IFx1MDQyMVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0NGINCi1fVUlfQ29udGVudEVsZW1lbnRfY29uY2VwdHNBbmRQYXBlcnNfZmVhdHVyZSA9IFx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0Nlx1MDQzNVx1MDQzZlx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0MzggXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiDQotX1VJX0NvbnRlbnRFbGVtZW50X2NoZWNrbGlzdHNfZmVhdHVyZSA9IFx1MDQyMVx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzZVx1MDQ0N1x1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDJcdTA0MzBcdTA0MzFcdTA0M2JcdTA0MzhcdTA0NDZcdTA0NGINCi1fVUlfQ29udGVudEVsZW1lbnRfZ3VpZGVsaW5lc19mZWF0dXJlID0gXHUwNDIwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotX1VJX0NvbnRlbnRFbGVtZW50X2V4YW1wbGVzX2ZlYXR1cmUgPSBcdTA0MWZcdTA0NDBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0NDBcdTA0NGINCi1fVUlfQ29udGVudEVsZW1lbnRfYXNzZXRzX2ZlYXR1cmUgPSBcdTA0MjBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDFcdTA0NGINCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbk5hbWVfZmVhdHVyZSA9IFx1MDQxOFx1MDQzY1x1MDQ0ZiBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9mZWF0dXJlID0gXHUwNDFmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1DQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9zaGFwZWljb25fZmVhdHVyZSA9IFx1MDQxN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzZVx1MDQzYSBcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0NGINCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X25vZGVpY29uX2ZlYXR1cmUgPSBcdTA0MTdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0M2VcdTA0M2EgXHUwNDQzXHUwNDM3XHUwNDNiXHUwNDMwDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9tYWluRGVzY3JpcHRpb25fZmVhdHVyZSA9IFx1MDQxZVx1MDQ0MVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzZFx1MDQzZVx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUNCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX3NlY3Rpb25zX2ZlYXR1cmUgPSBcdTA0MjBcdTA0MzBcdTA0MzdcdTA0MzRcdTA0MzVcdTA0M2JcdTA0NGINCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX2tleUNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBcdTA0MWFcdTA0M2JcdTA0NGVcdTA0NDdcdTA0MzVcdTA0MzJcdTA0NGJcdTA0MzUgXHUwNDQzXHUwNDQxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDRmDQotX1VJX1NlY3Rpb25fc2VjdGlvbk5hbWVfZmVhdHVyZSA9IFx1MDQxOFx1MDQzY1x1MDQ0ZiBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzANCi1fVUlfU2VjdGlvbl9zZWN0aW9uRGVzY3JpcHRpb25fZmVhdHVyZSA9IFx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzRcdTA0MzVcdTA0M2JcdTA0MzANCi1fVUlfU2VjdGlvbl9zdWJTZWN0aW9uc19mZWF0dXJlID0gXHUwNDFmXHUwNDNlXHUwNDM0XHUwNDQwXHUwNDMwXHUwNDM3XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDRiDQotX1VJX1NlY3Rpb25fcHJlZGVjZXNzb3JfZmVhdHVyZSA9IFx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0OFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzOFx1MDQzYQ0KLV9VSV9Sb2xlX21vZGlmaWVzX2ZlYXR1cmUgPSBcdTA0MThcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGZcdTA0MzVcdTA0NDINCi1fVUlfUm9sZV9yZXNwb25zaWJsZUZvcl9mZWF0dXJlID0gXHUwNDFlXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzN1x1MDQzMA0KLV9VSV9Xb3JrUHJvZHVjdF9yZXBvcnRzX2ZlYXR1cmUgPSBcdTA0MWVcdTA0NDJcdTA0NDdcdTA0MzVcdTA0NDJcdTA0NGINCi1fVUlfV29ya1Byb2R1Y3RfdGVtcGxhdGVzX2ZlYXR1cmUgPSBcdTA0MjhcdTA0MzBcdTA0MzFcdTA0M2JcdTA0M2VcdTA0M2RcdTA0NGINCi1fVUlfV29ya1Byb2R1Y3RfdG9vbE1lbnRvcnNfZmVhdHVyZSA9IFx1MDQyMFx1MDQ0M1x1MDQzYVx1MDQzZVx1MDQzMlx1MDQzZVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzMCBcdTA0M2ZcdTA0M2UgXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwXHUwNDNjDQotX1VJX1dvcmtQcm9kdWN0X2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gXHUwNDIwXHUwNDM1XHUwNDNhXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQzZSBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0M2RcdTA0M2FcdTA0MzUNCi1fVUlfVGFza19wZXJmb3JtZWRCeV9mZWF0dXJlID0gXHUwNDE4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjDQotX1VJX1Rhc2tfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSA9IFx1MDQxZVx1MDQzMVx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzQNCi1fVUlfVGFza19vdXRwdXRfZmVhdHVyZSA9IFx1MDQxMlx1MDQ0Ylx1MDQ0NVx1MDQzZVx1MDQzNA0KLV9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBcdTA0MTRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDM4XHUwNDQxXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjDQotX1VJX1Rhc2tfb3B0aW9uYWxJbnB1dF9mZWF0dXJlID0gXHUwNDFkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzMlx1MDQ0NVx1MDQzZVx1MDQzNA0KLV9VSV9UYXNrX3N0ZXBzX2ZlYXR1cmUgPSBcdTA0MjhcdTA0MzBcdTA0MzNcdTA0MzgNCi1fVUlfVGFza190b29sTWVudG9yc19mZWF0dXJlID0gXHUwNDIwXHUwNDQzXHUwNDNhXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzZlx1MDQzZSBcdTA0MzhcdTA0M2RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzBcdTA0M2MNCi1fVUlfVGFza19lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IFx1MDQyMFx1MDQzNVx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0M2UgXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDNkXHUwNDNhXHUwNDM1DQotX1VJX1dvcmtEZWZpbml0aW9uX3ByZWNvbmRpdGlvbl9mZWF0dXJlID0gXHUwNDEyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDNkXHUwNDNlXHUwNDM1IFx1MDQ0M1x1MDQ0MVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQzOFx1MDQzNQ0KLV9VSV9Xb3JrRGVmaW5pdGlvbl9wb3N0Y29uZGl0aW9uX2ZlYXR1cmUgPSBcdTA0MTJcdTA0NGJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDQzXHUwNDQxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDM4XHUwNDM1DQotX1VJX0FydGlmYWN0X2NvbnRhaW5lckFydGlmYWN0X2ZlYXR1cmUgPSBcdTA0MTBcdTA0NDBcdTA0NDJcdTA0MzVcdTA0NDRcdTA0MzBcdTA0M2FcdTA0NDItXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQyXHUwNDM1XHUwNDM5XHUwNDNkXHUwNDM1XHUwNDQwDQotX1VJX0FydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0c19mZWF0dXJlID0gXHUwNDIxXHUwNDNlXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDMwXHUwNDQ5XHUwNDM4XHUwNDM1XHUwNDQxXHUwNDRmIFx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzNVx1MDQ0NFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLV9VSV9EZWxpdmVyYWJsZV9kZWxpdmVyZWRXb3JrUHJvZHVjdHNfZmVhdHVyZSA9IFx1MDQxNFx1MDQzZVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiDQotX1VJX01ldGhvZFBhY2thZ2VfZ2xvYmFsX2ZlYXR1cmUgPSBcdTA0MTNcdTA0M2JcdTA0M2VcdTA0MzFcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzkNCi1fVUlfTWV0aG9kUGFja2FnZV9yZXVzZWRQYWNrYWdlc19mZWF0dXJlID0gXHUwNDFjXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQzMFx1MDQzYVx1MDQzNVx1MDQ0Mlx1MDQ0Yg0KLV9VSV9NZXRob2RQYWNrYWdlX3BhcmVudFBhY2thZ2VfZmVhdHVyZSA9IFx1MDQyMFx1MDQzZVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSBcdTA0M2ZcdTA0MzBcdTA0M2FcdTA0MzVcdTA0NDINCi1fVUlfTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX2ZlYXR1cmUgPSBcdTA0MTRcdTA0M2VcdTA0NDdcdTA0MzVcdTA0NDBcdTA0M2RcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyXHUwNDRiDQotX1VJX0NvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19mZWF0dXJlID0gXHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQzZVx1MDQzMg0KLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX2JyaWVmT3V0bGluZV9mZWF0dXJlID0gXHUwNDFhXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDNhXHUwNDMwXHUwNDRmIFx1MDQ0MVx1MDQ0NVx1MDQzNVx1MDQzY1x1MDQzMA0KLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3JlcHJlc2VudGF0aW9uT3B0aW9uc19mZWF0dXJlID0gXHUwNDFlXHUwNDNmXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX2V4dGVybmFsSWRfZmVhdHVyZSA9IFx1MDQxMlx1MDQzZFx1MDQzNVx1MDQ0OFx1MDQzZFx1MDQzOFx1MDQzOSBcdTA0MThcdTA0MTQNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBcdTA0MWRcdTA0MzBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9pbXBhY3RPZk5vdEhhdmluZ19mZWF0dXJlID0gXHUwNDFmXHUwNDNlXHUwNDQxXHUwNDNiXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM4XHUwNDRmIFx1MDQzZVx1MDQ0Mlx1MDQ0MVx1MDQ0M1x1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzOFx1MDQ0Zg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3JlYXNvbnNGb3JOb3ROZWVkaW5nX2ZlYXR1cmUgPSBcdTA0MWZcdTA0NDBcdTA0MzhcdTA0NDdcdTA0MzhcdTA0M2RcdTA0NGIgXHUwNDM0XHUwNDNiXHUwNDRmIFx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQzMFx1MDQzN1x1MDQzMA0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX2V4dGVybmFsRGVzY3JpcHRpb25fZmVhdHVyZSA9IFx1MDQxMlx1MDQzZFx1MDQzNVx1MDQ0OFx1MDQzZFx1MDQzNVx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUNCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9wYWNrYWdpbmdHdWlkYW5jZV9mZWF0dXJlID0gXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZlx1MDQzZSBcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGUgXHUwNDNmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyXHUwNDNlXHUwNDMyDQotX1VJX1JvbGVEZXNjcmlwdGlvbl9za2lsbHNfZmVhdHVyZSA9IFx1MDQxYVx1MDQzMlx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0Zg0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fYXNzaWdubWVudEFwcHJvYWNoZXNfZmVhdHVyZSA9IFx1MDQxZlx1MDQzZVx1MDQzNFx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQ0YiBcdTA0M2EgXHUwNDNkXHUwNDMwXHUwNDM3XHUwNDNkXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRlDQotX1VJX1JvbGVEZXNjcmlwdGlvbl9zeW5vbnltc19mZWF0dXJlID0gXHUwNDIxXHUwNDM4XHUwNDNkXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDNjXHUwNDRiDQotX1VJX1Rhc2tEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBcdTA0MWRcdTA0MzBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1fVUlfVGFza0Rlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlID0gXHUwNDEwXHUwNDNiXHUwNDRjXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDNkXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDMyXHUwNDRiDQotX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fYXR0YWNobWVudHNfZmVhdHVyZSA9IFx1MDQxMlx1MDQzYlx1MDQzZVx1MDQzNlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQ0Zg0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FkZGl0aW9uYWxJbmZvX2ZlYXR1cmUgPSBcdTA0MTRcdTA0M2VcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fcHJvYmxlbV9mZWF0dXJlID0gXHUwNDFkXHUwNDM1XHUwNDNmXHUwNDNlXHUwNDNiXHUwNDMwXHUwNDM0XHUwNDNhXHUwNDMwDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYmFja2dyb3VuZF9mZWF0dXJlID0gXHUwNDFmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDRiXHUwNDQxXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDRmDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fZ29hbHNfZmVhdHVyZSA9IFx1MDQyNlx1MDQzNVx1MDQzYlx1MDQzOA0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FwcGxpY2F0aW9uX2ZlYXR1cmUgPSBcdTA0MWZcdTA0NDBcdTA0MzhcdTA0M2JcdTA0M2VcdTA0MzZcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9sZXZlbHNPZkFkb3B0aW9uX2ZlYXR1cmUgPSBcdTA0MjNcdTA0NDBcdTA0M2VcdTA0MzJcdTA0M2RcdTA0MzggXHUwNDMyXHUwNDNkXHUwNDM1XHUwNDM0XHUwNDQwXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotX1VJX1BvaW50X3hfZmVhdHVyZSA9IFgNCi1fVUlfUG9pbnRfeV9mZWF0dXJlID0gWQ0KLV9VSV9HcmFwaEVsZW1lbnRfcG9zaXRpb25fZmVhdHVyZSA9IFx1MDQxZlx1MDQzZVx1MDQzN1x1MDQzOFx1MDQ0Nlx1MDQzOFx1MDQ0Zg0KLV9VSV9HcmFwaEVsZW1lbnRfY29udGFpbmVkX2ZlYXR1cmUgPSBcdTA0MjFcdTA0M2VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0NDJcdTA0NDFcdTA0NGYNCi1fVUlfR3JhcGhFbGVtZW50X2xpbmtfZmVhdHVyZSA9IFx1MDQyMVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQ0Yw0KLV9VSV9HcmFwaEVsZW1lbnRfYW5jaG9yYWdlX2ZlYXR1cmUgPSBcdTA0MWZcdTA0NDBcdTA0MzhcdTA0M2FcdTA0NDBcdTA0MzVcdTA0M2ZcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1fVUlfR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfZmVhdHVyZSA9IFx1MDQyMVx1MDQzNVx1MDQzY1x1MDQzMFx1MDQzZFx1MDQ0Mlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiBcdTA0M2NcdTA0M2VcdTA0MzRcdTA0MzVcdTA0M2JcdTA0NGMNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfaXNWaXNpYmxlX2ZlYXR1cmUgPSBcdTA0MWVcdTA0NDJcdTA0M2VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzBcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NGYNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfY29udGFpbmVyX2ZlYXR1cmUgPSBcdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDJcdTA0MzVcdTA0MzlcdTA0M2RcdTA0MzVcdTA0NDANCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcmVmZXJlbmNlX2ZlYXR1cmUgPSBcdTA0MjFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzANCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcHJvcGVydHlfZmVhdHVyZSA9IFx1MDQyMVx1MDQzMlx1MDQzZVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzZQ0KLV9VSV9EaWFncmFtTGlua196b29tX2ZlYXR1cmUgPSBcdTA0MWNcdTA0MzBcdTA0NDFcdTA0NDhcdTA0NDJcdTA0MzBcdTA0MzENCi1fVUlfRGlhZ3JhbUxpbmtfdmlld3BvcnRfZmVhdHVyZSA9IFx1MDQxZVx1MDQzMVx1MDQzYlx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0YyBcdTA0MzJcdTA0NGJcdTA0MzJcdTA0M2VcdTA0MzRcdTA0MzANCi1fVUlfRGlhZ3JhbUxpbmtfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBcdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDIgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDM4XHUwNDNhXHUwNDMwDQotX1VJX0RpYWdyYW1MaW5rX2RpYWdyYW1fZmVhdHVyZSA9IFx1MDQxNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQzMA0KLV9VSV9HcmFwaENvbm5lY3Rvcl9ncmFwaEVsZW1lbnRfZmVhdHVyZSA9IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzhcdTA0M2FcdTA0MzANCi1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFZGdlX2ZlYXR1cmUgPSBcdTA0MWFcdTA0NDBcdTA0MzBcdTA0MzkgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDM4XHUwNDNhXHUwNDMwDQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBcdTA0MWZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9ncmFwaEVsZW1lbnRfZmVhdHVyZSA9IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0MiBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzhcdTA0M2FcdTA0MzANCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9kaWFncmFtX2ZlYXR1cmUgPSBcdTA0MTRcdTA0MzhcdTA0MzBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M2NcdTA0M2NcdTA0MzANCi1fVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUgPSBcdTA0MjhcdTA0MzhcdTA0NDBcdTA0MzhcdTA0M2RcdTA0MzANCi1fVUlfRGltZW5zaW9uX2hlaWdodF9mZWF0dXJlID0gXHUwNDEyXHUwNDRiXHUwNDQxXHUwNDNlXHUwNDQyXHUwNDMwDQotX1VJX1JlZmVyZW5jZV9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbl9mZWF0dXJlID0gXHUwNDE4XHUwNDNkXHUwNDM0XHUwNDM4XHUwNDMyXHUwNDM4XHUwNDM0XHUwNDQzXHUwNDMwXHUwNDNiXHUwNDRjXHUwNDNkXHUwNDNlXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLV9VSV9SZWZlcmVuY2VfcmVmZXJlbmNlZF9mZWF0dXJlID0gXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkIFx1MDQzMiBcdTA0NDFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzBcdTA0NDUNCi1fVUlfUHJvcGVydHlfa2V5X2ZlYXR1cmUgPSBcdTA0MWFcdTA0M2JcdTA0NGVcdTA0NDcNCi1fVUlfUHJvcGVydHlfdmFsdWVfZmVhdHVyZSA9IFx1MDQxN1x1MDQzZFx1MDQzMFx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzOFx1MDQzNQ0KLV9VSV9HcmFwaEVkZ2VfYW5jaG9yX2ZlYXR1cmUgPSBcdTA0MWZcdTA0NDBcdTA0MzhcdTA0MzJcdTA0NGZcdTA0MzdcdTA0M2FcdTA0MzANCi1fVUlfR3JhcGhFZGdlX3dheXBvaW50c19mZWF0dXJlID0gXHUwNDIyXHUwNDNlXHUwNDQ3XHUwNDNhXHUwNDM4IFx1MDQzZlx1MDQ0M1x1MDQ0Mlx1MDQzOA0KLV9VSV9EaWFncmFtX3pvb21fZmVhdHVyZSA9IFx1MDQxY1x1MDQzMFx1MDQ0MVx1MDQ0OFx1MDQ0Mlx1MDQzMFx1MDQzMQ0KLV9VSV9EaWFncmFtX3ZpZXdwb2ludF9mZWF0dXJlID0gXHUwNDIyXHUwNDNlXHUwNDQ3XHUwNDNhXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0MVx1MDQzY1x1MDQzZVx1MDQ0Mlx1MDQ0MFx1MDQzMA0KLV9VSV9EaWFncmFtX2RpYWdyYW1MaW5rX2ZlYXR1cmUgPSBcdTA0MjFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzAgXHUwNDNkXHUwNDMwIFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzY1x1MDQ0Mw0KLV9VSV9EaWFncmFtX25hbWVzcGFjZV9mZWF0dXJlID0gXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDNlIFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQzZA0KLV9VSV9HcmFwaE5vZGVfc2l6ZV9mZWF0dXJlID0gXHUwNDIwXHUwNDMwXHUwNDM3XHUwNDNjXHUwNDM1XHUwNDQwDQotX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGVJbmZvX2ZlYXR1cmUgPSBcdTA0MjFcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNlIFx1MDQ0Mlx1MDQzOFx1MDQzZlx1MDQzNQ0KLV9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IFx1MDQyZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mg0KLV9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUgPSBcdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDINCi1fVUlfVGV4dEVsZW1lbnRfdGV4dF9mZWF0dXJlID0gXHUwNDIyXHUwNDM1XHUwNDNhXHUwNDQxXHUwNDQyDQotX1VJX0ltYWdlX3VyaV9mZWF0dXJlID0gVVJJDQotX1VJX0ltYWdlX21pbWVUeXBlX2ZlYXR1cmUgPSBcdTA0MjJcdTA0MzhcdTA0M2YgTUlNRQ0KLV9VSV9Qb2x5bGluZV9jbG9zZWRfZmVhdHVyZSA9IFx1MDQxN1x1MDQzMFx1MDQzYVx1MDQ0MFx1MDQ0Ylx1MDQ0Mg0KLV9VSV9Qb2x5bGluZV93YXlwb2ludHNfZmVhdHVyZSA9IFx1MDQyMlx1MDQzZVx1MDQ0N1x1MDQzYVx1MDQzOCBcdTA0M2ZcdTA0NDNcdTA0NDJcdTA0MzgNCi1fVUlfRWxsaXBzZV9yYWRpdXNYX2ZlYXR1cmUgPSBcdTA0MjBcdTA0MzBcdTA0MzRcdTA0MzhcdTA0NDNcdTA0NDEgWA0KLV9VSV9FbGxpcHNlX3JhZGl1c1lfZmVhdHVyZSA9IFx1MDQyMFx1MDQzMFx1MDQzNFx1MDQzOFx1MDQ0M1x1MDQ0MSBZDQotX1VJX0VsbGlwc2Vfcm90YXRpb25fZmVhdHVyZSA9IFx1MDQxZlx1MDQzZVx1MDQzMlx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQ0Mg0KLV9VSV9FbGxpcHNlX3N0YXJ0QW5nbGVfZmVhdHVyZSA9IFx1MDQxZFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0NDNcdTA0MzNcdTA0M2VcdTA0M2INCi1fVUlfRWxsaXBzZV9lbmRBbmdsZV9mZWF0dXJlID0gXHUwNDFhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQ0M1x1MDQzM1x1MDQzZVx1MDQzYg0KLV9VSV9FbGxpcHNlX2NlbnRlcl9mZWF0dXJlID0gXHUwNDI2XHUwNDM1XHUwNDNkXHUwNDQyXHUwNDQwDQotX1VJX0FjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX2ZlYXR1cmUgPSBcdTA0MmRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0NGIgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNhXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDRiDQotX1VJX0FjdGl2aXR5X3JvYWRtYXBzX2ZlYXR1cmUgPSBcdTA0MWZcdTA0NDNcdTA0NDJcdTA0MzVcdTA0MzJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0MzgNCi1fVUlfQWN0aXZpdHlfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gXHUwNDIxXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNlXHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzY1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzYlx1MDQ0Yg0KLV9VSV9BY3Rpdml0eV9jaGVja2xpc3RzX2ZlYXR1cmUgPSBcdTA0MjFcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0NGJcdTA0MzUgXHUwNDQyXHUwNDMwXHUwNDMxXHUwNDNiXHUwNDM4XHUwNDQ2XHUwNDRiDQotX1VJX0FjdGl2aXR5X2NvbmNlcHRzX2ZlYXR1cmUgPSBcdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDZcdTA0MzVcdTA0M2ZcdTA0NDZcdTA0MzhcdTA0MzgNCi1fVUlfQWN0aXZpdHlfZXhhbXBsZXNfZmVhdHVyZSA9IFx1MDQxZlx1MDQ0MFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQ0MFx1MDQ0Yg0KLV9VSV9BY3Rpdml0eV9ndWlkZWxpbmVzX2ZlYXR1cmUgPSBcdTA0MjBcdTA0MzVcdTA0M2FcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzRcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1fVUlfQWN0aXZpdHlfcmV1c2FibGVBc3NldHNfZmVhdHVyZSA9IFx1MDQxY1x1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQ0Ylx1MDQzNSBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDFcdTA0NGINCi1fVUlfQWN0aXZpdHlfaXNFbmFjdGFibGVfZmVhdHVyZSA9IFx1MDQxMlx1MDQzYVx1MDQzYlx1MDQ0ZVx1MDQ0N1x1MDQzMFx1MDQzNVx1MDQzY1x1MDQ0Ylx1MDQzOQ0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc1JlcGVhdGFibGVfZmVhdHVyZSA9IFx1MDQxZlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQ0Zlx1MDQzNVx1MDQzY1x1MDQ0Ylx1MDQzOQ0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc09uZ29pbmdfZmVhdHVyZSA9IFx1MDQxMlx1MDQ0Ylx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQ0Zlx1MDQ0ZVx1MDQ0OVx1MDQzOFx1MDQzOVx1MDQ0MVx1MDQ0Zg0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc0V2ZW50RHJpdmVuX2ZlYXR1cmUgPSBcdTA0MjNcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0NGZcdTA0MzVcdTA0M2NcdTA0NGJcdTA0MzkgXHUwNDQxXHUwNDNlXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDM4XHUwNDRmXHUwNDNjXHUwNDM4DQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2xpbmtUb1ByZWRlY2Vzc29yX2ZlYXR1cmUgPSBcdTA0MjFcdTA0NDFcdTA0NGJcdTA0M2JcdTA0M2FcdTA0MzAgXHUwNDNkXHUwNDMwIFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0OFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQzOFx1MDQzYVx1MDQzMA0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZWZpeF9mZWF0dXJlID0gXHUwNDFmXHUwNDQwXHUwNDM1XHUwNDQ0XHUwNDM4XHUwNDNhXHUwNDQxDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNQbGFubmVkX2ZlYXR1cmUgPSBcdTA0MTdcdTA0MzBcdTA0M2ZcdTA0M2JcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9oYXNNdWx0aXBsZU9jY3VycmVuY2VzX2ZlYXR1cmUgPSBcdTA0MWRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0M2VcdTA0M2JcdTA0NGNcdTA0M2FcdTA0M2UgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM2XHUwNDM0XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM5DQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNPcHRpb25hbF9mZWF0dXJlID0gXHUwNDFkXHUwNDM1XHUwNDNlXHUwNDMxXHUwNDRmXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM5DQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQWZ0ZXJfZmVhdHVyZSA9IFx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0M2ZcdTA0M2VcdTA0NDFcdTA0M2JcdTA0MzUNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRCZWZvcmVfZmVhdHVyZSA9IFx1MDQxZlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzYlx1MDQzNVx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0MzRcdTA0M2UNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wbGFubmluZ0RhdGFfZmVhdHVyZSA9IFx1MDQxNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2ZcdTA0M2JcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDBcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9zdXBlckFjdGl2aXRpZXNfZmVhdHVyZSA9IFx1MDQxMVx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQ0Ylx1MDQzNSBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1fVUlfVGVhbVByb2ZpbGVfdGVhbVJvbGVzX2ZlYXR1cmUgPSBcdTA0MjBcdTA0M2VcdTA0M2JcdTA0MzggXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmDQotX1VJX1RlYW1Qcm9maWxlX3N1cGVyVGVhbV9mZWF0dXJlID0gXHUwNDEzXHUwNDNiXHUwNDMwXHUwNDMyXHUwNDNkXHUwNDMwXHUwNDRmIFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzZlx1MDQzZlx1MDQzMA0KLV9VSV9UZWFtUHJvZmlsZV9zdWJUZWFtX2ZlYXR1cmUgPSBcdTA0MWZcdTA0M2VcdTA0MzRcdTA0NDdcdTA0MzhcdTA0M2RcdTA0MzVcdTA0M2RcdTA0M2RcdTA0MzBcdTA0NGYgXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDNmXHUwNDNmXHUwNDMwDQotX1VJX1JvbGVEZXNjcmlwdG9yX1JvbGVfZmVhdHVyZSA9IFx1MDQyMFx1MDQzZVx1MDQzYlx1MDQ0Yw0KLV9VSV9Sb2xlRGVzY3JpcHRvcl9tb2RpZmllc19mZWF0dXJlID0gXHUwNDE4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDRmXHUwNDM1XHUwNDQyDQotX1VJX1JvbGVEZXNjcmlwdG9yX3Jlc3BvbnNpYmxlRm9yX2ZlYXR1cmUgPSBcdTA0MWVcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzVcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDM3XHUwNDMwDQotX1VJX1dvcmtPcmRlcl9saW5rVHlwZV9mZWF0dXJlID0gXHUwNDIyXHUwNDM4XHUwNDNmIFx1MDQ0MVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzOA0KLV9VSV9Xb3JrT3JkZXJfcHJlZF9mZWF0dXJlID0gXHUwNDFmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQ4XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDM4XHUwNDNhDQotX1VJX1BsYW5uaW5nRGF0YV9zdGFydERhdGVfZmVhdHVyZSA9IFx1MDQxZFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0MzRcdTA0MzBcdTA0NDJcdTA0MzANCi1fVUlfUGxhbm5pbmdEYXRhX2ZpbmlzaERhdGVfZmVhdHVyZSA9IFx1MDQxYVx1MDQzZVx1MDQzZFx1MDQzNVx1MDQ0N1x1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0MzRcdTA0MzBcdTA0NDJcdTA0MzANCi1fVUlfUGxhbm5pbmdEYXRhX3JhbmtfZmVhdHVyZSA9IFx1MDQyMFx1MDQzMFx1MDQzZFx1MDQzMw0KLV9VSV9EZXNjcmlwdG9yX2lzU3luY2hyb25pemVkV2l0aFNvdXJjZV9mZWF0dXJlID0gXHUwNDIxXHUwNDM4XHUwNDNkXHUwNDQ1XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDM4XHUwNDM3XHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkIFx1MDQ0MSBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0MzhcdTA0M2FcdTA0M2VcdTA0M2MNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RW50cnlTdGF0ZV9mZWF0dXJlID0gXHUwNDIxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDNlXHUwNDRmXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZFx1MDQzMCBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUV4aXRTdGF0ZV9mZWF0dXJlID0gXHUwNDIxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDNlXHUwNDRmXHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQzZFx1MDQzMCBcdTA0MzJcdTA0NGJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4DQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdF9mZWF0dXJlID0gXHUwNDIwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM5IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0ZWRCeV9mZWF0dXJlID0gXHUwNDFkXHUwNDMwXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDQxXHUwNDRmIFx1MDQzZlx1MDQzZVx1MDQzNCBcdTA0MzJcdTA0M2JcdTA0MzhcdTA0NGZcdTA0M2RcdTA0MzhcdTA0MzVcdTA0M2MNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdHNfZmVhdHVyZSA9IFx1MDQxMlx1MDQzYlx1MDQzOFx1MDQ0Zlx1MDQzNVx1MDQ0MiBcdTA0M2RcdTA0MzANCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2RlbGl2ZXJhYmxlUGFydHNfZmVhdHVyZSA9IFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0YiBcdTA0M2FcdTA0M2VcdTA0M2RcdTA0MzVcdTA0NDdcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2UgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDMwDQotX1VJX1Rhc2tEZXNjcmlwdG9yX1Rhc2tfZmVhdHVyZSA9IFx1MDQxN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzMA0KLV9VSV9UYXNrRGVzY3JpcHRvcl9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeV9mZWF0dXJlID0gXHUwNDE0XHUwNDNlXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDNkXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQzZFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Yw0KLV9VSV9UYXNrRGVzY3JpcHRvcl9hc3Npc3RlZEJ5X2ZlYXR1cmUgPSBcdTA0MWZcdTA0M2VcdTA0M2JcdTA0NDNcdTA0NDdcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDNmXHUwNDNlXHUwNDNjXHUwNDNlXHUwNDQ5XHUwNDRjIFx1MDQzZVx1MDQ0Mg0KLV9VSV9UYXNrRGVzY3JpcHRvcl9leHRlcm5hbElucHV0X2ZlYXR1cmUgPSBcdTA0MTJcdTA0M2RcdTA0MzVcdTA0NDhcdTA0M2RcdTA0MzhcdTA0MzkgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0DQotX1VJX1Rhc2tEZXNjcmlwdG9yX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUgPSBcdTA0MWVcdTA0MzFcdTA0NGZcdTA0MzdcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0MzkgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0DQotX1VJX1Rhc2tEZXNjcmlwdG9yX29wdGlvbmFsSW5wdXRfZmVhdHVyZSA9IFx1MDQxZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQzZFx1MDQ0Ylx1MDQzOSBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzQNCi1fVUlfVGFza0Rlc2NyaXB0b3Jfb3V0cHV0X2ZlYXR1cmUgPSBcdTA0MTJcdTA0NGJcdTA0NDVcdTA0M2VcdTA0MzQNCi1fVUlfVGFza0Rlc2NyaXB0b3JfcGVyZm9ybWVkUHJpbWFyaWx5QnlfZmVhdHVyZSA9IFx1MDQxZVx1MDQ0MVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzZFx1MDQzZVx1MDQzOSBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGMNCi1fVUlfVGFza0Rlc2NyaXB0b3Jfc2VsZWN0ZWRTdGVwc19mZWF0dXJlID0gXHUwNDEyXHUwNDRiXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0OFx1MDQzMFx1MDQzM1x1MDQzOA0KLV9VSV9Db21wb3NpdGVSb2xlX2FnZ3JlZ2F0ZWRSb2xlc19mZWF0dXJlID0gXHUwNDFlXHUwNDMxXHUwNDRhXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0MFx1MDQzZVx1MDQzYlx1MDQzOA0KLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdXNhZ2VHdWlkYW5jZV9mZWF0dXJlID0gXHUwNDIzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmIFx1MDQzZlx1MDQzZSBcdTA0MzhcdTA0NDFcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGUNCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBcdTA0MWRcdTA0MzBcdTA0MzdcdTA0M2RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M2RcdTA0MzhcdTA0MzUNCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9hbHRlcm5hdGl2ZXNfZmVhdHVyZSA9IFx1MDQxMFx1MDQzYlx1MDQ0Y1x1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzZFx1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQzMlx1MDQ0Yg0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2hvd3RvU3RhZmZfZmVhdHVyZSA9IFx1MDQxZlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzZVx1MDQzZFx1MDQzMFx1MDQzYiBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0M2FcdTA0MzgNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fc2NhbGVfZmVhdHVyZSA9IFx1MDQxY1x1MDQzMFx1MDQ0MVx1MDQ0OFx1MDQ0Mlx1MDQzMFx1MDQzMQ0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzX2ZlYXR1cmUgPSBcdTA0MjVcdTA0MzBcdTA0NDBcdTA0MzBcdTA0M2FcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2FcdTA0MzggXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDMwDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Jpc2tMZXZlbF9mZWF0dXJlID0gXHUwNDIxXHUwNDQyXHUwNDM1XHUwNDNmXHUwNDM1XHUwNDNkXHUwNDRjIFx1MDQ0MFx1MDQzOFx1MDQ0MVx1MDQzYVx1MDQzMA0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9lc3RpbWF0aW5nVGVjaG5pcXVlX2ZlYXR1cmUgPSBcdTA0MWNcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzhcdTA0M2FcdTA0MzAgXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDNkXHUwNDNhXHUwNDM4DQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RNZW1iZXJFeHBlcnRpc2VfZmVhdHVyZSA9IFx1MDQxYVx1MDQzMlx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0NDNcdTA0NDdcdTA0MzBcdTA0NDFcdTA0NDJcdTA0M2RcdTA0MzhcdTA0M2FcdTA0M2VcdTA0MzIgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM1XHUwNDNhXHUwNDQyXHUwNDMwDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGVPZkNvbnRyYWN0X2ZlYXR1cmUgPSBcdTA0MjJcdTA0MzhcdTA0M2YgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDNhXHUwNDQyXHUwNDMwDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBcdTA0MTJcdTA0M2RcdTA0MzVcdTA0NDhcdTA0M2RcdTA0MzhcdTA0MzkgXHUwNDE4XHUwNDE0DQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9zY29wZV9mZWF0dXJlID0gXHUwNDFlXHUwNDMxXHUwNDNiXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDRjDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl91c2FnZU5vdGVzX2ZlYXR1cmUgPSBcdTA0MWZcdTA0NDBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0NDdcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYgXHUwNDNmXHUwNDNlIFx1MDQzOFx1MDQ0MVx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQzN1x1MDQzZVx1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZQ0KLV9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fcmVmaW5lZERlc2NyaXB0aW9uX2ZlYXR1cmUgPSBcdTA0MjNcdTA0NDJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0MzVcdTA0M2RcdTA0M2RcdTA0M2VcdTA0MzUgXHUwNDNlXHUwNDNmXHUwNDM4XHUwNDQxXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1DQotX1VJX1ByYWN0aWNlX3N1YlByYWN0aWNlc19mZWF0dXJlID0gXHUwNDEyXHUwNDNiXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzYVx1MDQ0Mlx1MDQzOFx1MDQzYVx1MDQzOCBcdTA0MzJcdTA0NGJcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1fVUlfUHJhY3RpY2VfY29udGVudFJlZmVyZW5jZXNfZmVhdHVyZSA9IFx1MDQyMVx1MDQ0MVx1MDQ0Ylx1MDQzYlx1MDQzYVx1MDQzOCBcdTA0M2RcdTA0MzAgXHUwNDNjXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMwXHUwNDNiXHUwNDRiDQotX1VJX1ByYWN0aWNlX2FjdGl2aXR5UmVmZXJlbmNlc19mZWF0dXJlID0gXHUwNDIxXHUwNDQxXHUwNDRiXHUwNDNiXHUwNDNhXHUwNDM4IFx1MDQzZFx1MDQzMCBcdTA0M2VcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzgNCi1fVUlfU3RhdGVfV29ya1Byb2R1Y3RfZmVhdHVyZSA9IFx1MDQyMFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0N1x1MDQzOFx1MDQzOSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDINCi1fVUlfU3RhdGVfUmVnaW9uX2ZlYXR1cmUgPSBcdTA0MWVcdTA0MzFcdTA0M2JcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NGMNCi1fVUlfU3RhdGVfc3VibWFjaGluZV9mZWF0dXJlID0gXHUwNDEyXHUwNDNiXHUwNDNlXHUwNDM2XHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQzY1x1MDQzMFx1MDQ0Mg0KLV9VSV9WZXJ0ZXhfY29udGFpbmVyX2ZlYXR1cmUgPSBcdTA0MWFcdTA0M2VcdTA0M2RcdTA0NDJcdTA0MzVcdTA0MzlcdTA0M2RcdTA0MzVcdTA0NDANCi1fVUlfVmVydGV4X291dGdvaW5nX2ZlYXR1cmUgPSBcdTA0MThcdTA0NDFcdTA0NDVcdTA0M2VcdTA0MzRcdTA0NGZcdTA0NDlcdTA0MzhcdTA0MzkNCi1fVUlfVmVydGV4X2luY29taW5nX2ZlYXR1cmUgPSBcdTA0MTJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0NGZcdTA0NDlcdTA0MzhcdTA0MzkNCi1fVUlfUmVnaW9uX1ZlcnRleF9mZWF0dXJlID0gXHUwNDEyXHUwNDM1XHUwNDQwXHUwNDQ4XHUwNDM4XHUwNDNkXHUwNDMwDQotX1VJX1JlZ2lvbl9UcmFuc2l0aW9uX2ZlYXR1cmUgPSBcdTA0MWZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0NDVcdTA0M2VcdTA0MzQNCi1fVUlfUmVnaW9uX1N0YXRlX2ZlYXR1cmUgPSBcdTA0MjFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NGZcdTA0M2RcdTA0MzhcdTA0MzUNCi1fVUlfUmVnaW9uX1N0YXRlTWFjaGluZV9mZWF0dXJlID0gXHUwNDFhXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDQ3XHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQzY1x1MDQzMFx1MDQ0Mg0KLV9VSV9TdGF0ZU1hY2hpbmVfUmVnaW9uX2ZlYXR1cmUgPSBcdTA0MWVcdTA0MzFcdTA0M2JcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NGMNCi1fVUlfVHJhbnNpdGlvbl9Xb3JrRGVmaW5pdGlvbl9mZWF0dXJlID0gXHUwNDFlXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQ0Yg0KLV9VSV9UcmFuc2l0aW9uX2NvbnRhaW5lcl9mZWF0dXJlID0gXHUwNDFhXHUwNDNlXHUwNDNkXHUwNDQyXHUwNDM1XHUwNDM5XHUwNDNkXHUwNDM1XHUwNDQwDQotX1VJX1RyYW5zaXRpb25fc291cmNlX2ZlYXR1cmUgPSBcdTA0MThcdTA0NDFcdTA0NDJcdTA0M2VcdTA0NDdcdTA0M2RcdTA0MzhcdTA0M2ENCi1fVUlfVHJhbnNpdGlvbl90YXJnZXRfZmVhdHVyZSA9IFx1MDQyNlx1MDQzNVx1MDQzYlx1MDQ0Yw0KLV9VSV9EaXNjaXBsaW5lX3Rhc2tzX2ZlYXR1cmUgPSBcdTA0MTdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzgNCi1fVUlfRGlzY2lwbGluZV9zdWJkaXNjaXBsaW5lX2ZlYXR1cmUgPSBcdTA0MWZcdTA0M2VcdTA0MzRcdTA0MzRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2RcdTA0MzANCi1fVUlfRGlzY2lwbGluZV9yZWZlcmVuY2VXb3JrZmxvd3NfZmVhdHVyZSA9IFx1MDQyMVx1MDQzMlx1MDQ0Zlx1MDQzN1x1MDQzMFx1MDQzZFx1MDQzZFx1MDQ0Ylx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0NDJcdTA0M2VcdTA0M2FcdTA0MzggXHUwNDNlXHUwNDNmXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM5DQotX1VJX1JvbGVTZXRfcm9sZXNfZmVhdHVyZSA9IFx1MDQyMFx1MDQzZVx1MDQzYlx1MDQzOA0KLV9VSV9Eb21haW5fd29ya1Byb2R1Y3RzX2ZlYXR1cmUgPSBcdTA0MjBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDdcdTA0MzhcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNhXHUwNDQyXHUwNDRiDQotX1VJX0RvbWFpbl9zdWJkb21haW5zX2ZlYXR1cmUgPSBcdTA0MWZcdTA0M2VcdTA0MzRcdTA0MzRcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGINCi1fVUlfV29ya1Byb2R1Y3RUeXBlX3dvcmtQcm9kdWN0c19mZWF0dXJlID0gXHUwNDIwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQ3XHUwNDM4XHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQ0Yg0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSA9IFx1MDQxNFx1MDQzOFx1MDQ0MVx1MDQ0Nlx1MDQzOFx1MDQzZlx1MDQzYlx1MDQzOFx1MDQzZFx1MDQ0Yg0KLV9VSV9Ub29sX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBcdTA0MjBcdTA0NDNcdTA0M2FcdTA0M2VcdTA0MzJcdTA0M2VcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzAgXHUwNDNmXHUwNDNlIFx1MDQzOFx1MDQzZFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQzYw0KLV9VSV9Sb2xlU2V0R3JvdXBpbmdfcm9sZVNldHNfZmVhdHVyZSA9IFx1MDQxZFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0MFx1MDQ0YiBcdTA0NDBcdTA0M2VcdTA0M2JcdTA0MzVcdTA0MzkNCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfY2F0ZWdvcml6ZWRFbGVtZW50c19mZWF0dXJlID0gXHUwNDFhXHUwNDNiXHUwNDMwXHUwNDQxXHUwNDQxXHUwNDM4XHUwNDQ0XHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDQwXHUwNDNlXHUwNDMyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQ0ZFx1MDQzYlx1MDQzNVx1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0Yg0KLV9VSV9DdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX2ZlYXR1cmUgPSBcdTA0MWZcdTA0M2VcdTA0MzRcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0MzgNCi1fVUlfRGVsaXZlcnlQcm9jZXNzX2VkdWNhdGlvbk1hdGVyaWFsc19mZWF0dXJlID0gXHUwNDIzXHUwNDQ3XHUwNDM1XHUwNDMxXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQ0MVx1MDQzZVx1MDQzMVx1MDQzOFx1MDQ0Zg0KLV9VSV9EZWxpdmVyeVByb2Nlc3NfY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNfZmVhdHVyZSA9IFx1MDQxMFx1MDQzZFx1MDQzMFx1MDQzYlx1MDQzOFx1MDQ0Mlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzNSBcdTA0M2NcdTA0MzBcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M2JcdTA0NGINCi1fVUlfUHJvY2Vzc19pbmNsdWRlc1BhdHRlcm5zX2ZlYXR1cmUgPSBcdTA0MTJcdTA0M2FcdTA0M2JcdTA0NGVcdTA0NDdcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQ4XHUwNDMwXHUwNDMxXHUwNDNiXHUwNDNlXHUwNDNkXHUwNDRiDQotX1VJX1Byb2Nlc3NfZGVmYXVsdENvbnRleHRfZmVhdHVyZSA9IFx1MDQxYVx1MDQzZVx1MDQzZFx1MDQ0Mlx1MDQzNVx1MDQzYVx1MDQ0MVx1MDQ0MiBcdTA0M2ZcdTA0M2UgXHUwNDQzXHUwNDNjXHUwNDNlXHUwNDNiXHUwNDQ3XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRlDQotX1VJX1Byb2Nlc3NfdmFsaWRDb250ZXh0X2ZlYXR1cmUgPSBcdTA0MTRcdTA0M2VcdTA0M2ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M2NcdTA0NGJcdTA0MzkgXHUwNDNhXHUwNDNlXHUwNDNkXHUwNDQyXHUwNDM1XHUwNDNhXHUwNDQxXHUwNDQyDQotX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX2Jhc2VkT25Qcm9jZXNzZXNfZmVhdHVyZSA9IFx1MDQxZFx1MDQzMCBcdTA0M2VcdTA0NDFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDNlXHUwNDMyDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfaW50ZXJmYWNlc19mZWF0dXJlID0gXHUwNDE4XHUwNDNkXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDQ0XHUwNDM1XHUwNDM5XHUwNDQxXHUwNDRiDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19mZWF0dXJlID0gXHUwNDFmXHUwNDQwXHUwNDNlXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxDQotX1VJX1Byb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19mZWF0dXJlID0gXHUwNDJkXHUwNDNiXHUwNDM1XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRiIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMA0KLV9VSV9Qcm9jZXNzUGFja2FnZV9kaWFncmFtc19mZWF0dXJlID0gXHUwNDE0XHUwNDM4XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNjXHUwNDNjXHUwNDRiDQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnNfZmVhdHVyZSA9IFx1MDQyMVx1MDQzZlx1MDQzNVx1MDQ0Nlx1MDQzOFx1MDQ0NFx1MDQzOFx1MDQzYVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0MzhcdTA0M2RcdTA0NDJcdTA0MzVcdTA0NDBcdTA0NDRcdTA0MzVcdTA0MzlcdTA0NDFcdTA0MzANCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VJT19mZWF0dXJlID0gXHUwNDE4XHUwNDNkXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDQ0XHUwNDM1XHUwNDM5XHUwNDQxXHUwNDNkXHUwNDRiXHUwNDM5IFx1MDQzMlx1MDQzMlx1MDQzZVx1MDQzNC1cdTA0MzJcdTA0NGJcdTA0MzJcdTA0M2VcdTA0MzQNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfUHJvY2Vzc0NvbXBvbmVudF9mZWF0dXJlID0gXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDNmXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDNkXHUwNDQyIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMA0KLV9VSV9NZXRob2RQbHVnaW5fdXNlckNoYW5nZWFibGVfZmVhdHVyZSA9IFx1MDQxY1x1MDQzZVx1MDQzNlx1MDQzNVx1MDQ0MiBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NGZcdTA0NDJcdTA0NGNcdTA0NDFcdTA0NGYgXHUwNDNmXHUwNDNlXHUwNDNiXHUwNDRjXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNiXHUwNDM1XHUwNDNjDQotX1VJX01ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19mZWF0dXJlID0gXHUwNDFmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyXHUwNDRiIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLV9VSV9NZXRob2RQbHVnaW5fYmFzZXNfZmVhdHVyZSA9IFx1MDQxMVx1MDQzMFx1MDQzN1x1MDQ0Yg0KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUgPSBcdTA0MjJcdTA0MzhcdTA0M2YgXHUwNDMyXHUwNDMwXHUwNDQwXHUwNDM4XHUwNDMwXHUwNDQyXHUwNDM4XHUwNDMyXHUwNDNkXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDM4DQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUgPSBcdTA0MTJcdTA0MzBcdTA0NDBcdTA0MzhcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0M2RcdTA0M2VcdTA0NDFcdTA0NDJcdTA0NGMgXHUwNDNkXHUwNDMwIFx1MDQzZVx1MDQ0MVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzNSBcdTA0NGRcdTA0M2JcdTA0MzVcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzANCi1fVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUgPSBcdTA0MTBcdTA0MzJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0NGINCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUgPSBcdTA0MTRcdTA0MzBcdTA0NDJcdTA0MzAgXHUwNDM4XHUwNDM3XHUwNDNjXHUwNDM1XHUwNDNkXHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmDQotX1VJX01ldGhvZFVuaXRfY2hhbmdlRGVzY3JpcHRpb25fZmVhdHVyZSA9IFx1MDQxZVx1MDQzZlx1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NGYNCi1fVUlfTWV0aG9kVW5pdF92ZXJzaW9uX2ZlYXR1cmUgPSBcdTA0MTJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0NGYNCi1fVUlfTWV0aG9kVW5pdF9jb3B5cmlnaHRTdGF0ZW1lbnRfZmVhdHVyZSA9IFx1MDQxOFx1MDQzZFx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBcdTA0M2VcdTA0MzEgXHUwNDMwXHUwNDMyXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDQ1IFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzMFx1MDQ0NQ0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBsdWdpblNlbGVjdGlvbl9mZWF0dXJlID0gXHUwNDEyXHUwNDRiXHUwNDMxXHUwNDNlXHUwNDQwIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYlx1MDQ0ZiBcdTA0M2NcdTA0MzVcdTA0NDJcdTA0M2VcdTA0MzRcdTA0MzANCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQYWNrYWdlU2VsZWN0aW9uX2ZlYXR1cmUgPSBcdTA0MTJcdTA0NGJcdTA0MzFcdTA0M2VcdTA0NDAgXHUwNDNmXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDQyXHUwNDMwIFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3Byb2Nlc3NWaWV3c19mZWF0dXJlID0gXHUwNDFmXHUwNDMwXHUwNDNkXHUwNDM1XHUwNDNiXHUwNDM4IFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzMA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2RlZmF1bHRWaWV3X2ZlYXR1cmUgPSBcdTA0MWZcdTA0MzBcdTA0M2RcdTA0MzVcdTA0M2JcdTA0NGMgXHUwNDNmXHUwNDNlIFx1MDQ0M1x1MDQzY1x1MDQzZVx1MDQzYlx1MDQ0N1x1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0ZQ0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2Jhc2VDb25maWd1cmF0aW9uc19mZWF0dXJlID0gXHUwNDExXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLV9VSV9Qcm9jZXNzRmFtaWx5X2RlbGl2ZXJ5UHJvY2Vzc2VzX2ZlYXR1cmUgPSBcdTA0MWZcdTA0NDBcdTA0M2VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0NGIgXHUwNDM0XHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNhXHUwNDM4DQotX1VJX01ldGhvZExpYnJhcnlfbWV0aG9kUGx1Z2luc19mZWF0dXJlID0gXHUwNDFjXHUwNDNlXHUwNDM0XHUwNDQzXHUwNDNiXHUwNDM4IFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQzZVx1MDQzNFx1MDQzZVx1MDQzMg0KLV9VSV9NZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19mZWF0dXJlID0gXHUwNDFmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNmXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDM1XHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM1IFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOA0KLV9VSV9Vbmtub3duX2ZlYXR1cmUgPSBcdTA0MWRcdTA0MzUgXHUwNDQzXHUwNDNhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNkXHUwNDNlDQotDQotX1VJX1dvcmtPcmRlclR5cGVfZmluaXNoVG9TdGFydF9saXRlcmFsID0gZmluaXNoVG9TdGFydA0KLV9VSV9Xb3JrT3JkZXJUeXBlX2ZpbmlzaFRvRmluaXNoX2xpdGVyYWwgPSBmaW5pc2hUb0ZpbmlzaA0KLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9TdGFydF9saXRlcmFsID0gc3RhcnRUb1N0YXJ0DQotX1VJX1dvcmtPcmRlclR5cGVfc3RhcnRUb0ZpbmlzaF9saXRlcmFsID0gc3RhcnRUb0ZpbmlzaA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfaW5pdGlhbF9saXRlcmFsID0gaW5pdGlhbA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfam9pbl9saXRlcmFsID0gam9pbg0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZm9ya19saXRlcmFsID0gZm9yaw0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfanVuY3Rpb25fbGl0ZXJhbCA9IGp1bmN0aW9uDQotX1VJX1BzZXVkb1N0YXRlS2luZF9jaG9pY2VfbGl0ZXJhbCA9IGNob2ljZQ0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZW50cnlQb2ludF9saXRlcmFsID0gZW50cnlQb2ludA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZXhpdFBvaW50X2xpdGVyYWwgPSBleGl0UG9pbnQNCi1fVUlfUHNldWRvU3RhdGVLaW5kX3Rlcm1pbmF0ZV9saXRlcmFsID0gdGVybWluYXRlDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9uYV9saXRlcmFsID0gbmENCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2NvbnRyaWJ1dGVzX2xpdGVyYWwgPSBjb250cmlidXRlcw0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfZXh0ZW5kc19saXRlcmFsID0gZXh0ZW5kcw0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfcmVwbGFjZXNfbGl0ZXJhbCA9IHJlcGxhY2VzDQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9sb2NhbENvbnRyaWJ1dGlvbl9saXRlcmFsID0gbG9jYWxDb250cmlidXRpb24NCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsUmVwbGFjZW1lbnRfbGl0ZXJhbCA9IGxvY2FsUmVwbGFjZW1lbnQNCi1fVUlfQXJ0aWZhY3REZXNjcmlwdG9yX3R5cGUgPSBcdTA0MTRcdTA0MzVcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzhcdTA0M2ZcdTA0NDJcdTA0M2VcdTA0NDAgXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDM1XHUwNDQ0XHUwNDMwXHUwNDNhXHUwNDQyXHUwNDMwDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRvcl90eXBlID0gXHUwNDE0XHUwNDM1XHUwNDQxXHUwNDNhXHUwNDQwXHUwNDM4XHUwNDNmXHUwNDQyXHUwNDNlXHUwNDQwIFx1MDQzYVx1MDQzZVx1MDQzZFx1MDQzNVx1MDQ0N1x1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzANCi1fVUlfT3V0Y29tZURlc2NyaXB0b3JfdHlwZSA9IFx1MDQxNFx1MDQzNVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzOFx1MDQzZlx1MDQ0Mlx1MDQzZVx1MDQ0MCBcdTA0MzhcdTA0NDFcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzANCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDJhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyYS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMmEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkN2NmOWQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWFmNTgyNi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZnJhZ21lbnROYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyYQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzcGF0aDogbmwyYS5qYXIKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IGZyYWdtZW50Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDJhL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDJhL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY3ZTU0YzEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UubmwyYS5qYXIgPSBzcmMvDQotb3V0cHV0Lm5sMmEuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IG5sMmEuamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fZGEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyYS9mcmFnbWVudC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyYS9mcmFnbWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMzk1Njg2Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMmEvZnJhZ21lbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZnJhZ21lbnROYW1lPUVQRiBDb21wb3NlciBVTUEgRWRpdCAoTkwyYSkNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTIzNTU2Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIFRvIGNvZGUgZGV2ZWxvcGVyOg0KLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUNCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4NCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlDQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5Lg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotcGx1Z2luTmFtZSA9IEVNRiBVTUEgLSByZWRpZ2VyaW5nc3N0XHUwMGY4dHRlDQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dCA9IHswfQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MiA9IHsxfSB7MH0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDMgPSB7MX0NCi1fVUlfQ3JlYXRlQ2hpbGRfdG9vbHRpcCA9IE9wcmV0IG55IHswfSB1bmRlciBmdW5rdGlvbmVuIHsxfQ0KLV9VSV9DcmVhdGVDaGlsZF9kZXNjcmlwdGlvbiA9IE9wcmV0IGVuIG55IHVuZGVyb3JkbmV0IHR5cGUgezB9IGZvciBmdW5rdGlvbmVuIHsxfSBmb3IgZGVuIHZhbGd0ZSB7Mn0uDQotX1VJX0NyZWF0ZVNpYmxpbmdfZGVzY3JpcHRpb24gPSBPcHJldCBlbiBueSBzaWRlb3JkbmV0IGFmIHR5cGVuIHswfSBmb3IgZGVuIHZhbGd0ZSB7Mn0sIHVuZGVyIGZ1bmt0aW9uZW4gezF9IGZvciBkZXJlcyBvdmVyb3JkbmVkZS4NCi0NCi1fVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uID0gezB9IGFmIHsxfQ0KLQ0KLV9VSV9DbGFzc2lmaWVyX3R5cGUgPSBLbGFzc2lmaWthdGlvbg0KLV9VSV9UeXBlX3R5cGUgPSBUeXBlDQotX1VJX0VsZW1lbnRfdHlwZSA9IEVsZW1lbnQNCi1fVUlfTmFtZWRFbGVtZW50X3R5cGUgPSBOYXZuZ2l2ZXQgZWxlbWVudA0KLV9VSV9QYWNrYWdlYWJsZUVsZW1lbnRfdHlwZSA9IEVsZW1lbnQsIGRlciBrYW4gcGFra2VzDQotX1VJX1BhY2thZ2VfdHlwZSA9IFBha2tlDQotX1VJX05hbWVzcGFjZV90eXBlID0gTmF2bmVvbXJcdTAwZTVkZQ0KLV9VSV9NZXRob2RFbGVtZW50X3R5cGUgPSBNZXRvZGVlbGVtZW50DQotX1VJX0NvbnN0cmFpbnRfdHlwZSA9IEJldGluZ2Vsc2UNCi1fVUlfQ29udGVudEVsZW1lbnRfdHlwZSA9IEluZGhvbGRzZWxlbWVudA0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSA9IEVsZW1lbnQsIGRlciBrYW4gYmVza3JpdmVzDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl90eXBlID0gSW5kaG9sZHNiZXNrcml2ZWxzZQ0KLV9VSV9TZWN0aW9uX3R5cGUgPSBBZnNuaXQNCi1fVUlfUm9sZV90eXBlID0gUm9sbGUNCi1fVUlfV29ya1Byb2R1Y3RfdHlwZSA9IEFyYmVqZHNwcm9kdWt0DQotX1VJX1Rhc2tfdHlwZSA9IE9wZ2F2ZQ0KLV9VSV9Xb3JrRGVmaW5pdGlvbl90eXBlID0gQXJiZWpkc2RlZmluaXRpb24NCi1fVUlfU3RlcF90eXBlID0gVHJpbg0KLV9VSV9HdWlkYW5jZV90eXBlID0gVmVqbGVkbmluZw0KLV9VSV9BcnRpZmFjdF90eXBlID0gQXJ0ZWZha3QNCi1fVUlfRGVsaXZlcmFibGVfdHlwZSA9IExldmVyYW5jZQ0KLV9VSV9PdXRjb21lX3R5cGUgPSBSZXN1bHRhdA0KLV9VSV9NZXRob2RQYWNrYWdlX3R5cGUgPSBNZXRvZGVwYWtrZQ0KLV9VSV9Db250ZW50UGFja2FnZV90eXBlID0gSW5kaG9sZHNwYWtrZQ0KLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3R5cGUgPSBCZXNrcml2ZWxzZSBhZiBhcnRlZmFrdA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3R5cGUgPSBCZXNrcml2ZWxzZSBhZiBhcmJlamRzcHJvZHVrdA0KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3R5cGUgPSBCZXNrcml2ZWxzZSBhZiBsZXZlcmFuY2UNCi1fVUlfUm9sZURlc2NyaXB0aW9uX3R5cGUgPSBCZXNrcml2ZWxzZSBhZiByb2xsZQ0KLV9VSV9UYXNrRGVzY3JpcHRpb25fdHlwZSA9IEJlc2tyaXZlbHNlIGFmIG9wZ2F2ZQ0KLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX3R5cGUgPSBCZXNrcml2ZWxzZSBhZiB2ZWpsZWRuaW5nDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fdHlwZSA9IEJlc2tyaXZlbHNlIGFmIFx1MDBmOHZlbHNlDQotX1VJX1BvaW50X3R5cGUgPSBQdW5rdA0KLV9VSV9HcmFwaEVsZW1lbnRfdHlwZSA9IEdyYWZlbGVtZW50DQotX1VJX0RpYWdyYW1FbGVtZW50X3R5cGUgPSBEaWFncmFtZWxlbWVudA0KLV9VSV9EaWFncmFtTGlua190eXBlID0gRGlhZ3JhbWxpbmsNCi1fVUlfR3JhcGhDb25uZWN0b3JfdHlwZSA9IEdyYWZmb3JiaW5kZWxzZQ0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2UNCi1fVUlfRGltZW5zaW9uX3R5cGUgPSBEaW1lbnNpb24NCi1fVUlfUmVmZXJlbmNlX3R5cGUgPSBSZWZlcmVuY2UNCi1fVUlfUHJvcGVydHlfdHlwZSA9IEVnZW5za2FiDQotX1VJX0dyYXBoRWRnZV90eXBlID0gR3JhZmthbnQNCi1fVUlfRGlhZ3JhbV90eXBlID0gRGlhZ3JhbQ0KLV9VSV9HcmFwaE5vZGVfdHlwZSA9IEdyYWZub2RlDQotX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGUgPSBTaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudA0KLV9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBVTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlDQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBDb3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZQ0KLV9VSV9MZWFmRWxlbWVudF90eXBlID0gQmxhZGVsZW1lbnQNCi1fVUlfVGV4dEVsZW1lbnRfdHlwZSA9IFRla3N0ZWxlbWVudA0KLV9VSV9JbWFnZV90eXBlID0gQmlsbGVkZQ0KLV9VSV9HcmFwaGljUHJpbWl0aXZlX3R5cGUgPSBQcmltaXRpdiBncmFmaWsNCi1fVUlfUG9seWxpbmVfdHlwZSA9IFBvbHlsaW5qZQ0KLV9VSV9FbGxpcHNlX3R5cGUgPSBFbGxpcHNlDQotX1VJX0FjdGl2aXR5X3R5cGUgPSBBa3Rpdml0ZXQNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IEFyYmVqZHNuZWRicnlkbmluZ3NlbGVtZW50DQotX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IE5lZGJyeWRuaW5nc2VsZW1lbnQNCi1fVUlfTWlsZXN0b25lX3R5cGUgPSBNaWxlcFx1MDBlNmwNCi1fVUlfSXRlcmF0aW9uX3R5cGUgPSBHZW50YWdlbHNlDQotX1VJX1BoYXNlX3R5cGUgPSBGYXNlDQotX1VJX1RlYW1Qcm9maWxlX3R5cGUgPSBUZWFtcHJvZmlsDQotX1VJX1JvbGVEZXNjcmlwdG9yX3R5cGUgPSBSb2xsZWRlc2tyaXB0b3INCi1fVUlfV29ya09yZGVyX3R5cGUgPSBBcmJlamRzclx1MDBlNmtrZWZcdTAwZjhsZ2UNCi1fVUlfUHJvY2Vzc0VsZW1lbnRfdHlwZSA9IFByb2Nlc2VsZW1lbnQNCi1fVUlfUGxhbm5pbmdEYXRhX3R5cGUgPSBQbGFubFx1MDBlNmduaW5nc2RhdGENCi1fVUlfRGVzY3JpcHRvcl90eXBlID0gRGVza3JpcHRvcg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSA9IEFyYmVqZHNwcm9kdWt0ZGVza3JpcHRvcg0KLV9VSV9UYXNrRGVzY3JpcHRvcl90eXBlID0gT3BnYXZlZGVza3JpcHRvcg0KLV9VSV9Db21wb3NpdGVSb2xlX3R5cGUgPSBTYW1tZW5zYXQgcm9sbGUNCi1fVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3R5cGUgPSBCZXNrcml2ZWxzZSBhZiBuZWRicnlkbmluZ3NlbGVtZW50DQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fdHlwZSA9IEJlc2tyaXZlbHNlIGFmIGFrdGl2aXRldA0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gQmVza3JpdmVsc2UgYWYgbGV2ZXJpbmdzcHJvY2VzDQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gQmVza3JpdmVsc2UgYWYgcHJvY2VzDQotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlID0gQmVza3JpdmVsc2UgYWYgZGVza3JpcHRvcg0KLV9VSV9Db25jZXB0X3R5cGUgPSBCZWdyZWINCi1fVUlfQ2hlY2tsaXN0X3R5cGUgPSBUamVrbGlzdGUNCi1fVUlfRXhhbXBsZV90eXBlID0gRWtzZW1wZWwNCi1fVUlfR3VpZGVsaW5lX3R5cGUgPSBSZXRuaW5nc2xpbmplDQotX1VJX1JlcG9ydF90eXBlID0gUmFwcG9ydA0KLV9VSV9UZW1wbGF0ZV90eXBlID0gU2thYmVsb24NCi1fVUlfU3VwcG9ydGluZ01hdGVyaWFsX3R5cGUgPSBTdFx1MDBmOHR0ZW1hdGVyaWFsZQ0KLV9VSV9Ub29sTWVudG9yX3R5cGUgPSBWXHUwMGU2cmt0XHUwMGY4anNtZW50b3INCi1fVUlfV2hpdGVwYXBlcl90eXBlID0gSHZpZGJvZw0KLV9VSV9UZXJtRGVmaW5pdGlvbl90eXBlID0gVGVybWRlZmluaXRpb24NCi1fVUlfUHJhY3RpY2VfdHlwZSA9IFx1MDBkOHZlbHNlDQotX1VJX0VzdGltYXRpb25Db25zaWRlcmF0aW9uc190eXBlID0gRXN0aW1lcmluZ3NvdmVydmVqZWxzZXINCi1fVUlfUmV1c2FibGVBc3NldF90eXBlID0gR2VuYW52ZW5kZWxpZ3QgYWt0aXYNCi1fVUlfU3RhdGVfdHlwZSA9IFN0YXQNCi1fVUlfVmVydGV4X3R5cGUgPSBWZXJ0ZXgNCi1fVUlfUmVnaW9uX3R5cGUgPSBSZWdpb24NCi1fVUlfU3RhdGVNYWNoaW5lX3R5cGUgPSBUaWxzdGFuZHNtYXNraW5lDQotX1VJX1RyYW5zaXRpb25fdHlwZSA9IFRyYW5zaXRpb24NCi1fVUlfUHNldWRvU3RhdGVfdHlwZSA9IFBzZXVkb3RpbHN0YW5kDQotX1VJX0Rpc2NpcGxpbmVfdHlwZSA9IERpc2NpcGxpbg0KLV9VSV9Db250ZW50Q2F0ZWdvcnlfdHlwZSA9IEluZGhvbGRza2F0ZWdvcmkNCi1fVUlfUm9sZVNldF90eXBlID0gUm9sbGVzXHUwMGU2dA0KLV9VSV9Eb21haW5fdHlwZSA9IERvbVx1MDBlNm5lDQotX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlID0gQXJiZWpkc3Byb2R1a3R0eXBlDQotX1VJX0Rpc2NpcGxpbmVHcm91cGluZ190eXBlID0gRGlzY2lwbGluZ3J1cHBlcmluZw0KLV9VSV9Ub29sX3R5cGUgPSBWXHUwMGU2cmt0XHUwMGY4ag0KLV9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSA9IFJvbGxlc1x1MDBlNnRzZ3J1cHBlcmluZw0KLV9VSV9DdXN0b21DYXRlZ29yeV90eXBlID0gVGlscGFzc2V0IGthdGVnb3JpDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc190eXBlID0gTGV2ZXJpbmdzcHJvY2VzDQotX1VJX1Byb2Nlc3NfdHlwZSA9IFByb2Nlcw0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybl90eXBlID0gRnVua3Rpb25zbVx1MDBmOG5zdGVyDQotX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX3R5cGUgPSBQcm9jZXNwbGFubFx1MDBlNmduaW5nc3NrYWJlbG9uDQotX1VJX1JvYWRtYXBfdHlwZSA9IFZlanZpc2VyDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSA9IFByb2Nlc2tvbXBvbmVudA0KLV9VSV9Qcm9jZXNzUGFja2FnZV90eXBlID0gUHJvY2VzcGFra2UNCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV90eXBlID0gUHJvY2Vza29tcG9uZW50Z3JcdTAwZTZuc2VmbGFkZQ0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl90eXBlID0gUHJvY2Vza29tcG9uZW50ZGVza3JpcHRvcg0KLV9VSV9NZXRob2RQbHVnaW5fdHlwZSA9IE1ldG9kZS1wbHVnaW4NCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3R5cGUgPSBWYXJpYWJpbGl0ZXRzZWxlbWVudA0KLV9VSV9NZXRob2RVbml0X3R5cGUgPSBNZXRvZGVlbmhlZA0KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUgPSBNZXRvZGVrb25maWd1cmF0aW9uDQotX1VJX1Byb2Nlc3NGYW1pbHlfdHlwZSA9IFByb2Nlc2ZhbWlsaWUNCi1fVUlfTWV0aG9kTGlicmFyeV90eXBlID0gTWV0b2RlYmlibGlvdGVrDQotX1VJX1Vua25vd25fdHlwZSA9IE9iamVrdA0KLQ0KLV9VSV9Vbmtub3duX2RhdGF0eXBlPSBWXHUwMGU2cmRpDQotDQotX1VJX05hbWVkRWxlbWVudF9uYW1lX2ZlYXR1cmUgPSBOYXZuDQotX1VJX01ldGhvZEVsZW1lbnRfZ3VpZF9mZWF0dXJlID0gR1VJRA0KLV9VSV9NZXRob2RFbGVtZW50X2JyaWVmRGVzY3JpcHRpb25fZmVhdHVyZSA9IEtvcnQgYmVza3JpdmVsc2UNCi1fVUlfTWV0aG9kRWxlbWVudF9vd25lZFJ1bGVzX2ZlYXR1cmUgPSBFamVkZSByZWdsZXINCi1fVUlfTWV0aG9kRWxlbWVudF9zdXBwcmVzc2VkX2ZlYXR1cmUgPSBVbmRlcnRyeWt0DQotX1VJX01ldGhvZEVsZW1lbnRfb3JkZXJpbmdHdWlkZV9mZWF0dXJlID0gUlx1MDBlNmtrZWZcdTAwZjhsZ2VndWlkZQ0KLV9VSV9Db25zdHJhaW50X2JvZHlfZmVhdHVyZSA9IEluZGhvbGQNCi1fVUlfQ29udGVudEVsZW1lbnRfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gU3RcdTAwZjh0dGVtYXRlcmlhbGUNCi1fVUlfQ29udGVudEVsZW1lbnRfY29uY2VwdHNBbmRQYXBlcnNfZmVhdHVyZSA9IEJlZ3JlYmVyIG9nIHBhcGlyZXINCi1fVUlfQ29udGVudEVsZW1lbnRfY2hlY2tsaXN0c19mZWF0dXJlID0gVGpla2xpc3Rlcg0KLV9VSV9Db250ZW50RWxlbWVudF9ndWlkZWxpbmVzX2ZlYXR1cmUgPSBSZXRuaW5nc2xpbmplcg0KLV9VSV9Db250ZW50RWxlbWVudF9leGFtcGxlc19mZWF0dXJlID0gRWtzZW1wbGVyDQotX1VJX0NvbnRlbnRFbGVtZW50X2Fzc2V0c19mZWF0dXJlID0gQWt0aXZlcg0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uTmFtZV9mZWF0dXJlID0gUHJcdTAwZTZzZW50YXRpb25zbmF2bg0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBQclx1MDBlNnNlbnRhdGlvbg0KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfc2hhcGVpY29uX2ZlYXR1cmUgPSBTaGFwZWljb24NCi1fVUlfRGVzY3JpYmFibGVFbGVtZW50X25vZGVpY29uX2ZlYXR1cmUgPSBOb2RlaWNvbg0KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fbWFpbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBPdmVyb3JkbmV0IGJlc2tyaXZlbHNlDQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19mZWF0dXJlID0gQWZzbml0DQotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9rZXlDb25zaWRlcmF0aW9uc19mZWF0dXJlID0gTlx1MDBmOGdsZW92ZXJ2ZWplbHNlcg0KLV9VSV9TZWN0aW9uX3NlY3Rpb25OYW1lX2ZlYXR1cmUgPSBBZnNuaXRzbmF2bg0KLV9VSV9TZWN0aW9uX3NlY3Rpb25EZXNjcmlwdGlvbl9mZWF0dXJlID0gQWZzbml0c2Jlc2tyaXZlbHNlDQotX1VJX1NlY3Rpb25fc3ViU2VjdGlvbnNfZmVhdHVyZSA9IFVuZGVyYWZzbml0DQotX1VJX1NlY3Rpb25fcHJlZGVjZXNzb3JfZmVhdHVyZSA9IEZvcmdcdTAwZTZuZ2VyDQotX1VJX1JvbGVfbW9kaWZpZXNfZmVhdHVyZSA9IFx1MDBjNm5kcmVyDQotX1VJX1JvbGVfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IEFuc3ZhcmxpZyBmb3INCi1fVUlfV29ya1Byb2R1Y3RfcmVwb3J0c19mZWF0dXJlID0gUmFwcG9ydGVyDQotX1VJX1dvcmtQcm9kdWN0X3RlbXBsYXRlc19mZWF0dXJlID0gU2thYmVsb25lcg0KLV9VSV9Xb3JrUHJvZHVjdF90b29sTWVudG9yc19mZWF0dXJlID0gVlx1MDBlNnJrdFx1MDBmOGpzbWVudG9yZXINCi1fVUlfV29ya1Byb2R1Y3RfZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBFc3RpbWVyaW5nc292ZXJ2ZWplbHNlcg0KLV9VSV9UYXNrX3BlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBVZGZcdTAwZjhydCBhZg0KLV9VSV9UYXNrX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUgPSBQXHUwMGU1a3JcdTAwZTZ2ZXQgaW5wdXQNCi1fVUlfVGFza19vdXRwdXRfZmVhdHVyZSA9IE91dHB1dA0KLV9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBZZGVybGlnZXJlIHVkZlx1MDBmOHJ0IGFmDQotX1VJX1Rhc2tfb3B0aW9uYWxJbnB1dF9mZWF0dXJlID0gVmFsZ2ZyaXQgaW5wdXQNCi1fVUlfVGFza19zdGVwc19mZWF0dXJlID0gVHJpbg0KLV9VSV9UYXNrX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBWXHUwMGU2cmt0XHUwMGY4anNtZW50b3Jlcg0KLV9VSV9UYXNrX2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gRXN0aW1lcmluZ3NvdmVydmVqZWxzZXINCi1fVUlfV29ya0RlZmluaXRpb25fcHJlY29uZGl0aW9uX2ZlYXR1cmUgPSBGb3JoXHUwMGU1bmRzYmV0aW5nZWxzZQ0KLV9VSV9Xb3JrRGVmaW5pdGlvbl9wb3N0Y29uZGl0aW9uX2ZlYXR1cmUgPSBFZnRlcmZcdTAwZjhsZ2VuZGUgYmV0aW5nZWxzZQ0KLV9VSV9BcnRpZmFjdF9jb250YWluZXJBcnRpZmFjdF9mZWF0dXJlID0gT3BiZXZhcmluZ3NzdGVkc2FydGVmYWt0DQotX1VJX0FydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0c19mZWF0dXJlID0gSW5kZWhvbGR0ZSBhcnRlZmFrdGVyDQotX1VJX0RlbGl2ZXJhYmxlX2RlbGl2ZXJlZFdvcmtQcm9kdWN0c19mZWF0dXJlID0gTGV2ZXJlZGUgYXJiZWpkc3Byb2R1a3Rlcg0KLV9VSV9NZXRob2RQYWNrYWdlX2dsb2JhbF9mZWF0dXJlID0gR2xvYmFsDQotX1VJX01ldGhvZFBhY2thZ2VfcmV1c2VkUGFja2FnZXNfZmVhdHVyZSA9IEdlbmJydWd0ZSBwYWtrZXINCi1fVUlfTWV0aG9kUGFja2FnZV9wYXJlbnRQYWNrYWdlX2ZlYXR1cmUgPSBPdmVyb3JkbmV0IHBha2tlDQotX1VJX01ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19mZWF0dXJlID0gVW5kZXJvcmRuZWRlIHBha2tlcg0KLV9VSV9Db250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfZmVhdHVyZSA9IEluZGhvbGRzZWxlbWVudGVyDQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fYnJpZWZPdXRsaW5lX2ZlYXR1cmUgPSBLb3J0IG92ZXJzaWd0DQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25PcHRpb25zX2ZlYXR1cmUgPSBJbmRzdGlsbGluZ2VyIGZvciByZXByXHUwMGU2c2VudGF0aW9uDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlID0gRWtzdGVybiBpZA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IEZvcm1cdTAwZTVsDQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25faW1wYWN0T2ZOb3RIYXZpbmdfZmVhdHVyZSA9IFZpcmtuaW5nIGFmIGlra2UgYXQgaGF2ZQ0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3JlYXNvbnNGb3JOb3ROZWVkaW5nX2ZlYXR1cmUgPSBcdTAwYzVyc2FnZXIgdGlsIGlra2UgYXQgYmVoXHUwMGY4dmUNCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9leHRlcm5hbERlc2NyaXB0aW9uX2ZlYXR1cmUgPSBFa3N0ZXJuIGJlc2tyaXZlbHNlDQotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fcGFja2FnaW5nR3VpZGFuY2VfZmVhdHVyZSA9IFBha2tldmVqbGVkbmluZw0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fc2tpbGxzX2ZlYXR1cmUgPSBLb21wZXRlbmNlcg0KLV9VSV9Sb2xlRGVzY3JpcHRpb25fYXNzaWdubWVudEFwcHJvYWNoZXNfZmVhdHVyZSA9IFRpbGRlbGluZ3NtXHUwMGU1ZGVyDQotX1VJX1JvbGVEZXNjcmlwdGlvbl9zeW5vbnltc19mZWF0dXJlID0gU3lub255bWVyDQotX1VJX1Rhc2tEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBGb3JtXHUwMGU1bA0KLV9VSV9UYXNrRGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBBbHRlcm5hdGl2ZXINCi1fVUlfR3VpZGFuY2VEZXNjcmlwdGlvbl9hdHRhY2htZW50c19mZWF0dXJlID0gVmVkaFx1MDBlNmZ0bmluZ2VyDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYWRkaXRpb25hbEluZm9fZmVhdHVyZSA9IFlkZXJsaWdlcmUgb3BseXNuaW5nZXINCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9wcm9ibGVtX2ZlYXR1cmUgPSBQcm9ibGVtDQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYmFja2dyb3VuZF9mZWF0dXJlID0gQmFnZ3J1bmQNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9nb2Fsc19mZWF0dXJlID0gTVx1MDBlNWwNCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hcHBsaWNhdGlvbl9mZWF0dXJlID0gUHJvZ3JhbQ0KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2xldmVsc09mQWRvcHRpb25fZmVhdHVyZSA9IEFkb3B0aW9uc25pdmVhdWVyDQotX1VJX1BvaW50X3hfZmVhdHVyZSA9IFgNCi1fVUlfUG9pbnRfeV9mZWF0dXJlID0gWQ0KLV9VSV9HcmFwaEVsZW1lbnRfcG9zaXRpb25fZmVhdHVyZSA9IFBvc2l0aW9uDQotX1VJX0dyYXBoRWxlbWVudF9jb250YWluZWRfZmVhdHVyZSA9IEluZGVob2xkdA0KLV9VSV9HcmFwaEVsZW1lbnRfbGlua19mZWF0dXJlID0gTGluaw0KLV9VSV9HcmFwaEVsZW1lbnRfYW5jaG9yYWdlX2ZlYXR1cmUgPSBGb3JhbmtyaW5nDQotX1VJX0dyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX2ZlYXR1cmUgPSBTZW1hbnRpc2sgbW9kZWwNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfaXNWaXNpYmxlX2ZlYXR1cmUgPSBFciBzeW5saWcNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfY29udGFpbmVyX2ZlYXR1cmUgPSBPcGJldmFyaW5nc3N0ZWQNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcmVmZXJlbmNlX2ZlYXR1cmUgPSBSZWZlcmVuY2UNCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcHJvcGVydHlfZmVhdHVyZSA9IEVnZW5za2FiDQotX1VJX0RpYWdyYW1MaW5rX3pvb21fZmVhdHVyZSA9IFpvb20NCi1fVUlfRGlhZ3JhbUxpbmtfdmlld3BvcnRfZmVhdHVyZSA9IFZpc25pbmdzcG9ydA0KLV9VSV9EaWFncmFtTGlua19ncmFwaEVsZW1lbnRfZmVhdHVyZSA9IEdyYWZlbGVtZW50DQotX1VJX0RpYWdyYW1MaW5rX2RpYWdyYW1fZmVhdHVyZSA9IERpYWdyYW0NCi1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBHcmFmZWxlbWVudA0KLV9VSV9HcmFwaENvbm5lY3Rvcl9ncmFwaEVkZ2VfZmVhdHVyZSA9IEdyYWZrYW50DQotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBQclx1MDBlNnNlbnRhdGlvbg0KLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gR3JhZmVsZW1lbnQNCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9kaWFncmFtX2ZlYXR1cmUgPSBEaWFncmFtDQotX1VJX0RpbWVuc2lvbl93aWR0aF9mZWF0dXJlID0gQnJlZGRlDQotX1VJX0RpbWVuc2lvbl9oZWlnaHRfZmVhdHVyZSA9IEhcdTAwZjhqZGUNCi1fVUlfUmVmZXJlbmNlX2lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBFciBpbmRpdmlkdWVsIHJlcHJcdTAwZTZzZW50YXRpb24NCi1fVUlfUmVmZXJlbmNlX3JlZmVyZW5jZWRfZmVhdHVyZSA9IFJlZmVyZXJldA0KLV9VSV9Qcm9wZXJ0eV9rZXlfZmVhdHVyZSA9IE5cdTAwZjhnbGUNCi1fVUlfUHJvcGVydHlfdmFsdWVfZmVhdHVyZSA9IFZcdTAwZTZyZGkNCi1fVUlfR3JhcGhFZGdlX2FuY2hvcl9mZWF0dXJlID0gQW5rZXINCi1fVUlfR3JhcGhFZGdlX3dheXBvaW50c19mZWF0dXJlID0gVmVqcHVua3Rlcg0KLV9VSV9EaWFncmFtX3pvb21fZmVhdHVyZSA9IFpvb20NCi1fVUlfRGlhZ3JhbV92aWV3cG9pbnRfZmVhdHVyZSA9IFN5bnN2aW5rZWwNCi1fVUlfRGlhZ3JhbV9kaWFncmFtTGlua19mZWF0dXJlID0gRGlhZ3JhbWxpbmsNCi1fVUlfRGlhZ3JhbV9uYW1lc3BhY2VfZmVhdHVyZSA9IE5hdm5lb21yXHUwMGU1ZGUNCi1fVUlfR3JhcGhOb2RlX3NpemVfZmVhdHVyZSA9IFN0XHUwMGY4cnJlbHNlDQotX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGVJbmZvX2ZlYXR1cmUgPSBUeXBlb3BseXNuaW5nZXINCi1fVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUgPSBFbGVtZW50DQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IEVsZW1lbnQNCi1fVUlfVGV4dEVsZW1lbnRfdGV4dF9mZWF0dXJlID0gVGVrc3QNCi1fVUlfSW1hZ2VfdXJpX2ZlYXR1cmUgPSBVcmkNCi1fVUlfSW1hZ2VfbWltZVR5cGVfZmVhdHVyZSA9IE1JTUUtdHlwZQ0KLV9VSV9Qb2x5bGluZV9jbG9zZWRfZmVhdHVyZSA9IEx1a2tldA0KLV9VSV9Qb2x5bGluZV93YXlwb2ludHNfZmVhdHVyZSA9IFZlanB1bmt0ZXINCi1fVUlfRWxsaXBzZV9yYWRpdXNYX2ZlYXR1cmUgPSBSYWRpdXMgWA0KLV9VSV9FbGxpcHNlX3JhZGl1c1lfZmVhdHVyZSA9IFJhZGl1cyBZDQotX1VJX0VsbGlwc2Vfcm90YXRpb25fZmVhdHVyZSA9IFJvdGF0aW9uDQotX1VJX0VsbGlwc2Vfc3RhcnRBbmdsZV9mZWF0dXJlID0gU3RhcnR2aW5rZWwNCi1fVUlfRWxsaXBzZV9lbmRBbmdsZV9mZWF0dXJlID0gU2x1dHZpbmtlbA0KLV9VSV9FbGxpcHNlX2NlbnRlcl9mZWF0dXJlID0gQ2VudHJlcmV0DQotX1VJX0FjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX2ZlYXR1cmUgPSBOZWRicnlkbmluZ3NlbGVtZW50ZXINCi1fVUlfQWN0aXZpdHlfcm9hZG1hcHNfZmVhdHVyZSA9IFZlanZpc2VyZQ0KLV9VSV9BY3Rpdml0eV9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUgPSBTdFx1MDBmOHR0ZW1hdGVyaWFsZQ0KLV9VSV9BY3Rpdml0eV9jaGVja2xpc3RzX2ZlYXR1cmUgPSBUamVrbGlzdGVyDQotX1VJX0FjdGl2aXR5X2NvbmNlcHRzX2ZlYXR1cmUgPSBCZWdyZWJlcg0KLV9VSV9BY3Rpdml0eV9leGFtcGxlc19mZWF0dXJlID0gRWtzZW1wbGVyDQotX1VJX0FjdGl2aXR5X2d1aWRlbGluZXNfZmVhdHVyZSA9IFJldG5pbmdzbGluamVyDQotX1VJX0FjdGl2aXR5X3JldXNhYmxlQXNzZXRzX2ZlYXR1cmUgPSBHZW5hbnZlbmRlbGlnZSBha3RpdmVyDQotX1VJX0FjdGl2aXR5X2lzRW5hY3RhYmxlX2ZlYXR1cmUgPSBLYW4gcmVhZ2VyZXMgcFx1MDBlNQ0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc1JlcGVhdGFibGVfZmVhdHVyZSA9IEthbiBnZW50YWdlcw0KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc09uZ29pbmdfZmVhdHVyZSA9IEVyIGlnYW5ndlx1MDBlNnJlbmRlDQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzRXZlbnREcml2ZW5fZmVhdHVyZSA9IEVyIGFrdGl2aXRldHNzdHlyZXQNCi1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfbGlua1RvUHJlZGVjZXNzb3JfZmVhdHVyZSA9IExpbmsgdGlsIGZvcmdcdTAwZTZuZ2VyDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlZml4X2ZlYXR1cmUgPSBQclx1MDBlNmZpa3MNCi1fVUlfQnJlYWtkb3duRWxlbWVudF9pc1BsYW5uZWRfZmVhdHVyZSA9IEVyIHBsYW5sYWd0DQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaGFzTXVsdGlwbGVPY2N1cnJlbmNlc19mZWF0dXJlID0gSGFyIGZsZXJlIGZvcmVrb21zdGVyDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNPcHRpb25hbF9mZWF0dXJlID0gRXIgdmFsZ2ZyaQ0KLV9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEFmdGVyX2ZlYXR1cmUgPSBWaXN0IGVmdGVyDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQmVmb3JlX2ZlYXR1cmUgPSBWaXN0IGZcdTAwZjhyDQotX1VJX0JyZWFrZG93bkVsZW1lbnRfcGxhbm5pbmdEYXRhX2ZlYXR1cmUgPSBQbGFubFx1MDBlNmduaW5nc2RhdGENCi1fVUlfQnJlYWtkb3duRWxlbWVudF9zdXBlckFjdGl2aXRpZXNfZmVhdHVyZSA9IFN1cGVyYWt0aXZpdGV0ZXINCi1fVUlfVGVhbVByb2ZpbGVfdGVhbVJvbGVzX2ZlYXR1cmUgPSBUZWFtcm9sbGVyDQotX1VJX1RlYW1Qcm9maWxlX3N1cGVyVGVhbV9mZWF0dXJlID0gU3VwZXJ0ZWFtDQotX1VJX1RlYW1Qcm9maWxlX3N1YlRlYW1fZmVhdHVyZSA9IFVuZGVydGVhbQ0KLV9VSV9Sb2xlRGVzY3JpcHRvcl9Sb2xlX2ZlYXR1cmUgPSBSb2xsZQ0KLV9VSV9Sb2xlRGVzY3JpcHRvcl9tb2RpZmllc19mZWF0dXJlID0gXHUwMGM2bmRyZXINCi1fVUlfUm9sZURlc2NyaXB0b3JfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IEFuc3ZhcmxpZyBmb3INCi1fVUlfV29ya09yZGVyX2xpbmtUeXBlX2ZlYXR1cmUgPSBMaW5rdHlwZQ0KLV9VSV9Xb3JrT3JkZXJfcHJlZF9mZWF0dXJlID0gRm9yZw0KLV9VSV9QbGFubmluZ0RhdGFfc3RhcnREYXRlX2ZlYXR1cmUgPSBTdGFydGRhdG8NCi1fVUlfUGxhbm5pbmdEYXRhX2ZpbmlzaERhdGVfZmVhdHVyZSA9IFNsdXRkYXRvDQotX1VJX1BsYW5uaW5nRGF0YV9yYW5rX2ZlYXR1cmUgPSBSYW5nDQotX1VJX0Rlc2NyaXB0b3JfaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlX2ZlYXR1cmUgPSBFciBzeW5rcm9uaXNlcmV0IG1lZCBraWxkZQ0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFbnRyeVN0YXRlX2ZlYXR1cmUgPSBBa3Rpdml0ZXRzaW5kZ2FuZ3N0aWxzdGFuZA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFeGl0U3RhdGVfZmVhdHVyZSA9IEFrdGl2aXRldHN1ZGdhbmdzdGlsc3RhbmQNCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0X2ZlYXR1cmUgPSBBcmJlamRzcHJvZHVrdA0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0ZWRCeV9mZWF0dXJlID0gUFx1MDBlNXZpcmtldCBhZg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0c19mZWF0dXJlID0gUFx1MDBlNXZpcmtlcg0KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfZGVsaXZlcmFibGVQYXJ0c19mZWF0dXJlID0gTGV2ZXJhbmNlZGVsZQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9UYXNrX2ZlYXR1cmUgPSBPcGdhdmUNCi1fVUlfVGFza0Rlc2NyaXB0b3JfYWRkaXRpb25hbGx5UGVyZm9ybWVkQnlfZmVhdHVyZSA9IFNla3VuZFx1MDBlNnIgdWRmXHUwMGY4cmVuZGUNCi1fVUlfVGFza0Rlc2NyaXB0b3JfYXNzaXN0ZWRCeV9mZWF0dXJlID0gQXNzaXN0ZXJldCBhZg0KLV9VSV9UYXNrRGVzY3JpcHRvcl9leHRlcm5hbElucHV0X2ZlYXR1cmUgPSBFa3N0ZXJudCBpbnB1dA0KLV9VSV9UYXNrRGVzY3JpcHRvcl9tYW5kYXRvcnlJbnB1dF9mZWF0dXJlID0gUFx1MDBlNWtyXHUwMGU2dmV0IGlucHV0DQotX1VJX1Rhc2tEZXNjcmlwdG9yX29wdGlvbmFsSW5wdXRfZmVhdHVyZSA9IFZhbGdmcml0IGlucHV0DQotX1VJX1Rhc2tEZXNjcmlwdG9yX291dHB1dF9mZWF0dXJlID0gT3V0cHV0DQotX1VJX1Rhc2tEZXNjcmlwdG9yX3BlcmZvcm1lZFByaW1hcmlseUJ5X2ZlYXR1cmUgPSBQcmltXHUwMGU2ciB1ZGZcdTAwZjhyZW5kZQ0KLV9VSV9UYXNrRGVzY3JpcHRvcl9zZWxlY3RlZFN0ZXBzX2ZlYXR1cmUgPSBWYWxndGUgdHJpbg0KLV9VSV9Db21wb3NpdGVSb2xlX2FnZ3JlZ2F0ZWRSb2xlc19mZWF0dXJlID0gU2FtbGVkZSByb2xsZXINCi1fVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3VzYWdlR3VpZGFuY2VfZmVhdHVyZSA9IEJydWdzdmVqbGVkbmluZw0KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IEZvcm1cdTAwZTVsDQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBBbHRlcm5hdGl2ZXINCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9ob3d0b1N0YWZmX2ZlYXR1cmUgPSBIb3d0byBTdGFmZg0KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9zY2FsZV9mZWF0dXJlID0gU2thbGENCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdENoYXJhY3RlcmlzdGljc19mZWF0dXJlID0gUHJvamVrdGthcmFrdGVyaXN0aWthDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Jpc2tMZXZlbF9mZWF0dXJlID0gUmlzaWtvbml2ZWF1DQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX2VzdGltYXRpbmdUZWNobmlxdWVfZmVhdHVyZSA9IEVzdGltZXJpbmdzdGVrbmlrDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RNZW1iZXJFeHBlcnRpc2VfZmVhdHVyZSA9IFByb2pla3RkZWx0YWdlcmtvbXBldGVuY2UNCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZU9mQ29udHJhY3RfZmVhdHVyZSA9IEtvbnRyYWt0dHlwZQ0KLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlID0gRWtzdGVybiBpZA0KLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fc2NvcGVfZmVhdHVyZSA9IE9tZmFuZw0KLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fdXNhZ2VOb3Rlc19mZWF0dXJlID0gQnJ1Z3NiZW1cdTAwZTZya25pbmdlcg0KLV9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fcmVmaW5lZERlc2NyaXB0aW9uX2ZlYXR1cmUgPSBEZXRhbGplcmV0IGJlc2tyaXZlbHNlDQotX1VJX1ByYWN0aWNlX3N1YlByYWN0aWNlc19mZWF0dXJlID0gVW5kZXJcdTAwZjh2ZWxzZXINCi1fVUlfUHJhY3RpY2VfY29udGVudFJlZmVyZW5jZXNfZmVhdHVyZSA9IEluZGhvbGRzcmVmZXJlbmNlcg0KLV9VSV9QcmFjdGljZV9hY3Rpdml0eVJlZmVyZW5jZXNfZmVhdHVyZSA9IEFrdGl2aXRldHNyZWZlcmVuY2VyDQotX1VJX1N0YXRlX1dvcmtQcm9kdWN0X2ZlYXR1cmUgPSBBcmJlamRzcHJvZHVrdA0KLV9VSV9TdGF0ZV9SZWdpb25fZmVhdHVyZSA9IFJlZ2lvbg0KLV9VSV9TdGF0ZV9zdWJtYWNoaW5lX2ZlYXR1cmUgPSBTdWJtYXNraW5lDQotX1VJX1ZlcnRleF9jb250YWluZXJfZmVhdHVyZSA9IE9wYmV2YXJpbmdzc3RlZA0KLV9VSV9WZXJ0ZXhfb3V0Z29pbmdfZmVhdHVyZSA9IFVkZ1x1MDBlNWVuZGUNCi1fVUlfVmVydGV4X2luY29taW5nX2ZlYXR1cmUgPSBJbmRnXHUwMGU1ZW5kZQ0KLV9VSV9SZWdpb25fVmVydGV4X2ZlYXR1cmUgPSBWZXJ0ZXgNCi1fVUlfUmVnaW9uX1RyYW5zaXRpb25fZmVhdHVyZSA9IFRyYW5zaXRpb24NCi1fVUlfUmVnaW9uX1N0YXRlX2ZlYXR1cmUgPSBTdGF0DQotX1VJX1JlZ2lvbl9TdGF0ZU1hY2hpbmVfZmVhdHVyZSA9IFRpbHN0YW5kc21hc2tpbmUNCi1fVUlfU3RhdGVNYWNoaW5lX1JlZ2lvbl9mZWF0dXJlID0gUmVnaW9uDQotX1VJX1RyYW5zaXRpb25fV29ya0RlZmluaXRpb25fZmVhdHVyZSA9IEFyYmVqZHNkZWZpbml0aW9uDQotX1VJX1RyYW5zaXRpb25fY29udGFpbmVyX2ZlYXR1cmUgPSBPcGJldmFyaW5nc3N0ZWQNCi1fVUlfVHJhbnNpdGlvbl9zb3VyY2VfZmVhdHVyZSA9IEtpbGRlDQotX1VJX1RyYW5zaXRpb25fdGFyZ2V0X2ZlYXR1cmUgPSBNXHUwMGU1bA0KLV9VSV9EaXNjaXBsaW5lX3Rhc2tzX2ZlYXR1cmUgPSBPcGdhdmVyDQotX1VJX0Rpc2NpcGxpbmVfc3ViZGlzY2lwbGluZV9mZWF0dXJlID0gVW5kZXJkaXNjaXBsaW4NCi1fVUlfRGlzY2lwbGluZV9yZWZlcmVuY2VXb3JrZmxvd3NfZmVhdHVyZSA9IFJlZmVyZW5jZWFyYmVqZHNnYW5nZQ0KLV9VSV9Sb2xlU2V0X3JvbGVzX2ZlYXR1cmUgPSBSb2xsZXINCi1fVUlfRG9tYWluX3dvcmtQcm9kdWN0c19mZWF0dXJlID0gQXJiZWpkc3Byb2R1a3Rlcg0KLV9VSV9Eb21haW5fc3ViZG9tYWluc19mZWF0dXJlID0gVW5kZXJkb21cdTAwZTZuZXINCi1fVUlfV29ya1Byb2R1Y3RUeXBlX3dvcmtQcm9kdWN0c19mZWF0dXJlID0gQXJiZWpkc3Byb2R1a3Rlcg0KLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSA9IERpc2NpcGxpbmVyDQotX1VJX1Rvb2xfdG9vbE1lbnRvcnNfZmVhdHVyZSA9IFZcdTAwZTZya3RcdTAwZjhqc21lbnRvcmVyDQotX1VJX1JvbGVTZXRHcm91cGluZ19yb2xlU2V0c19mZWF0dXJlID0gUm9sbGVzXHUwMGU2dA0KLV9VSV9DdXN0b21DYXRlZ29yeV9jYXRlZ29yaXplZEVsZW1lbnRzX2ZlYXR1cmUgPSBLYXRlZ29yaXNlcmVkZSBlbGVtZW50ZXINCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19mZWF0dXJlID0gVW5kZXJrYXRlZ29yaWVyDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc19lZHVjYXRpb25NYXRlcmlhbHNfZmVhdHVyZSA9IFVkZGFubmVsc2VzbWF0ZXJpYWxlDQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc19jb21tdW5pY2F0aW9uc01hdGVyaWFsc19mZWF0dXJlID0gS29tbXVuaWthdGlvbnNtYXRlcmlhbGUNCi1fVUlfUHJvY2Vzc19pbmNsdWRlc1BhdHRlcm5zX2ZlYXR1cmUgPSBJbmtsdWRlcmVyIG1cdTAwZjhuc3RyZQ0KLV9VSV9Qcm9jZXNzX2RlZmF1bHRDb250ZXh0X2ZlYXR1cmUgPSBTdGFuZGFyZGtvbnRla3N0DQotX1VJX1Byb2Nlc3NfdmFsaWRDb250ZXh0X2ZlYXR1cmUgPSBHeWxkaWcga29udGVrc3QNCi1fVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfYmFzZWRPblByb2Nlc3Nlc19mZWF0dXJlID0gQmFzZXJldCBwXHUwMGU1IHByb2Nlc3Nlcg0KLV9VSV9Qcm9jZXNzQ29tcG9uZW50X2ludGVyZmFjZXNfZmVhdHVyZSA9IEdyXHUwMGU2bnNlZmxhZGVyDQotX1VJX1Byb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19mZWF0dXJlID0gUHJvY2VzDQotX1VJX1Byb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19mZWF0dXJlID0gUHJvY2VzZWxlbWVudGVyDQotX1VJX1Byb2Nlc3NQYWNrYWdlX2RpYWdyYW1zX2ZlYXR1cmUgPSBEaWFncmFtbWVyDQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnNfZmVhdHVyZSA9IEdyXHUwMGU2bnNlZmxhZGVzcGVjaWZpa2F0aW9uZXINCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VJT19mZWF0dXJlID0gR3JcdTAwZTZuc2VmbGFkZS1JL08NCi1fVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfUHJvY2Vzc0NvbXBvbmVudF9mZWF0dXJlID0gUHJvY2Vza29tcG9uZW50DQotX1VJX01ldGhvZFBsdWdpbl91c2VyQ2hhbmdlYWJsZV9mZWF0dXJlID0gS2FuIFx1MDBlNm5kcmVzIGFmIGJydWdlcg0KLV9VSV9NZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfZmVhdHVyZSA9IE1ldG9kZXBha2tlcg0KLV9VSV9NZXRob2RQbHVnaW5fYmFzZXNfZmVhdHVyZSA9IEJhc2lzDQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eVR5cGVfZmVhdHVyZSA9IFZhcmlhYmlsaXRldHN0eXBlDQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUgPSBWYXJpYWJpbGl0ZXQgYmFzZXJldCBwXHUwMGU1IGVsZW1lbnQNCi1fVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUgPSBGb3JmYXR0ZXJlDQotX1VJX01ldGhvZFVuaXRfY2hhbmdlRGF0ZV9mZWF0dXJlID0gXHUwMGM2bmRyaW5nc2RhdG8NCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEZXNjcmlwdGlvbl9mZWF0dXJlID0gXHUwMGM2bmRyaW5nc2Jlc2tyaXZlbHNlDQotX1VJX01ldGhvZFVuaXRfdmVyc2lvbl9mZWF0dXJlID0gVmVyc2lvbg0KLV9VSV9NZXRob2RVbml0X2NvcHlyaWdodFN0YXRlbWVudF9mZWF0dXJlID0gQ29weXJpZ2h0LWVya2xcdTAwZTZyaW5nDQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fbWV0aG9kUGx1Z2luU2VsZWN0aW9uX2ZlYXR1cmUgPSBWYWxnIGFmIG1ldG9kZS1wbHVnaW4NCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQYWNrYWdlU2VsZWN0aW9uX2ZlYXR1cmUgPSBWYWxnIGFmIG1ldG9kZXBha2tlDQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fcHJvY2Vzc1ZpZXdzX2ZlYXR1cmUgPSBQcm9jZXNvdmVyc2lndGVyDQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fZGVmYXVsdFZpZXdfZmVhdHVyZSA9IFN0YW5kYXJkb3ZlcnNpZ3QNCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9iYXNlQ29uZmlndXJhdGlvbnNfZmVhdHVyZSA9IEJhc2lza29uZmlndXJhdGlvbmVyDQotX1VJX1Byb2Nlc3NGYW1pbHlfZGVsaXZlcnlQcm9jZXNzZXNfZmVhdHVyZSA9IExldmVyaW5nc3Byb2Nlc3Nlcg0KLV9VSV9NZXRob2RMaWJyYXJ5X21ldGhvZFBsdWdpbnNfZmVhdHVyZSA9IE1ldG9kZS1wbHVnaW5zDQotX1VJX01ldGhvZExpYnJhcnlfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zX2ZlYXR1cmUgPSBGb3J1ZGRlZmluZXJlZGUga29uZmlndXJhdGlvbmVyDQotX1VJX1Vua25vd25fZmVhdHVyZSA9IFVzcGVjaWZpY2VyZXQNCi0NCi1fVUlfV29ya09yZGVyVHlwZV9maW5pc2hUb1N0YXJ0X2xpdGVyYWwgPSBmaW5pc2hUb1N0YXJ0DQotX1VJX1dvcmtPcmRlclR5cGVfZmluaXNoVG9GaW5pc2hfbGl0ZXJhbCA9IGZpbmlzaFRvRmluaXNoDQotX1VJX1dvcmtPcmRlclR5cGVfc3RhcnRUb1N0YXJ0X2xpdGVyYWwgPSBzdGFydFRvU3RhcnQNCi1fVUlfV29ya09yZGVyVHlwZV9zdGFydFRvRmluaXNoX2xpdGVyYWwgPSBzdGFydFRvRmluaXNoDQotX1VJX1BzZXVkb1N0YXRlS2luZF9pbml0aWFsX2xpdGVyYWwgPSBzdGFydA0KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfam9pbl9saXRlcmFsID0gc2FtbWVua1x1MDBlNmRuaW5nDQotX1VJX1BzZXVkb1N0YXRlS2luZF9mb3JrX2xpdGVyYWwgPSBmb3JncmVuaW5nDQotX1VJX1BzZXVkb1N0YXRlS2luZF9qdW5jdGlvbl9saXRlcmFsID0gc2FtbWVuZlx1MDBmOGpuaW5nDQotX1VJX1BzZXVkb1N0YXRlS2luZF9jaG9pY2VfbGl0ZXJhbCA9IHZhbGcNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2VudHJ5UG9pbnRfbGl0ZXJhbCA9IGluZGdhbmdzcHVua3QNCi1fVUlfUHNldWRvU3RhdGVLaW5kX2V4aXRQb2ludF9saXRlcmFsID0gc2x1dHB1bmt0DQotX1VJX1BzZXVkb1N0YXRlS2luZF90ZXJtaW5hdGVfbGl0ZXJhbCA9IGFmYnJ5ZA0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfbmFfbGl0ZXJhbCA9IGlra2UgcmVsZXZhbnQNCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2NvbnRyaWJ1dGVzX2xpdGVyYWwgPSBiaWRyYWdlcg0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfZXh0ZW5kc19saXRlcmFsID0gdWR2aWRlcg0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfcmVwbGFjZXNfbGl0ZXJhbCA9IGVyc3RhdHRlcg0KLV9VSV9WYXJpYWJpbGl0eVR5cGVfbG9jYWxDb250cmlidXRpb25fbGl0ZXJhbCA9IGxva2FsdCBiaWRyYWcNCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsUmVwbGFjZW1lbnRfbGl0ZXJhbCA9IGxva2FsIGVyc3RhdG5pbmcNCi1fVUlfQXJ0aWZhY3REZXNjcmlwdG9yX3R5cGUgPSBBcnRlZmFrdGRlc2tyaXB0b3INCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdG9yX3R5cGUgPSBMZXZlcmFuY2VkZXNrcmlwdG9yDQotX1VJX091dGNvbWVEZXNjcmlwdG9yX3R5cGUgPSBSZXN1bHRhdGRlc2tyaXB0b3INCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzQ1NDcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc5MmRkYzQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnVtYS5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL01FVEEtSU5GL01BTklGRVNULk1GIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWZiZjNmMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgVU1BIChOTDEpCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYudW1hLm5sMQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnVtYTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZTdiMDEyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YWZiNTFlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiAtIFVNQQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWEzNDc1MC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1VTUEgZGUgRVBGDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MjRhMWI3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPVVNQSBFUEYNCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9wbHVnaW5faXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvcGx1Z2luX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyNTM4MzIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9wbHVnaW5faXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFVNQQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9wbHVnaW5famEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI1MzgzMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgVU1BDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3BsdWdpbl9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjUzODMyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBVTUENCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvcGx1Z2luX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyNTM4MzIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFVNQQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9wbHVnaW5femhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI1MzgzMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotIyBQbHVnLWluDQotcGx1Z2luTmFtZT1FUEYgVU1BDQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3BsdWdpbl96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjUzODMyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi0jIFBsdWctaW4NCi1wbHVnaW5OYW1lPUVQRiBVTUENCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcNCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYmZmOWQ1Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWNvcHlyaWdodD1JQk0gQ29ycG9yYXRpb24NCi1lcnJfY2Fubm90TW9kaWZ5MD0nJ3swfScnIGthbm4gbmljaHQgZ2VcdTAwZTRuZGVydCB3ZXJkZW4uDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYzY0OTczLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWNvcHlyaWdodD1JQk0gQ29ycG9yYXRpb24NCi1lcnJfY2Fubm90TW9kaWZ5MD1ObyBzZSBwdWVkZSBtb2RpZmljYXIgJyd7MH0nJw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXNfZnIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmY1OGRiYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvUmVzb3VyY2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1jb3B5cmlnaHQ9SUJNIENvcnBvcmF0aW9uDQotZXJyX2Nhbm5vdE1vZGlmeTA9SW1wb3NzaWJsZSBkZSBtb2RpZmllciAnJ3swfScnDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYjAzM2JlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWNvcHlyaWdodD1JQk0gQ29ycG9yYXRpb24NCi1lcnJfY2Fubm90TW9kaWZ5MD1JbXBvc3NpYmlsZSBtb2RpZmljYXJlICcnezB9JycNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlMzRhYTYuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotY29weXJpZ2h0PUlCTSBDb3Jwb3JhdGlvbg0KLWVycl9jYW5ub3RNb2RpZnkwPScnezB9JycgXHUzMDZmXHU1OTA5XHU2NmY0XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZTY0Y2Y4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXNfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWNvcHlyaWdodD1JQk0gQ29ycG9yYXRpb24NCi1lcnJfY2Fubm90TW9kaWZ5MD0nJ3swfScnXHVjNzQ0KFx1Yjk3YykgXHVjMjE4XHVjODE1XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWM3NGMNCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvUmVzb3VyY2VzX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmZjI2OGEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotY29weXJpZ2h0PUlCTSBDb3Jwb3JhdGlvbg0KLWVycl9jYW5ub3RNb2RpZnkwPUltcG9zc1x1MDBlZHZlbCBtb2RpZmljYXIgJyd7MH0nJw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXNfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTlhYTkzYS4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvUmVzb3VyY2VzX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLg0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1jb3B5cmlnaHQ9SUJNIENvcnBvcmF0aW9uDQotZXJyX2Nhbm5vdE1vZGlmeTA9XHU2NWUwXHU2Y2Q1XHU0ZmVlXHU2NTM5XHUyMDFjezB9XHUyMDFkDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc196aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNjJiODkwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXNfemhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLWNvcHlyaWdodD1JQk0gQ29ycG9yYXRpb24NCi1lcnJfY2Fubm90TW9kaWZ5MD1cdTcxMjFcdTZjZDVcdTRmZWVcdTY1MzkgJyd7MH0nJw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDIvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y3NDU0Ny4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTIzMDljNC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudW1hLm5sMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NTI4OTgyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBVTUEgKE5MMikKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi51bWEubmwyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYudW1hO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyL2J1aWxkLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1NGZjYTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9ydS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyNTM4MzIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMi9wbHVnaW5fcnUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFVNQQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvUmVzb3VyY2VzX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhMjZhNzguLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMi9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19ydS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotY29weXJpZ2h0PUlCTSBDb3Jwb3JhdGlvbg0KLWVycl9jYW5ub3RNb2RpZnkwPVx1MDQxZFx1MDQzNVx1MDQzMlx1MDQzZVx1MDQzN1x1MDQzY1x1MDQzZVx1MDQzNlx1MDQzZFx1MDQzZSBcdTA0MzhcdTA0MzdcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDJcdTA0NGMgJyd7MH0nJw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDJhLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDJhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyYS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDJhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYzQ1NTE4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDJhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudW1hLm5sMmE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YjFlYmYyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDJhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgVU1BIChOTDJhKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDJhCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYudW1hO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyYS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDRlNjgyMy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kYS5wcm9wZXJ0aWVzDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI1MzgzMi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyYS9wbHVnaW5fZGEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uDQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLSMgUGx1Zy1pbg0KLXBsdWdpbk5hbWU9RVBGIFVNQQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMmEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXNfZGEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTM1MTg5NC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlc19kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4NCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotY29weXJpZ2h0PUlCTSBDb3Jwb3JhdGlvbg0KLWVycl9jYW5ub3RNb2RpZnkwPUthbiBpa2tlIFx1MDBlNm5kcmUgJyd7MH0nJw0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMS8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYzlkZjk4Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDE8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMTU0ZGU3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgWE1MIFVNQSAoTkwxKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDEvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlN2IwMTIuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2VzLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9mci5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX2tvLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5femhfQ04ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbl9kZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5faXQucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL3BsdWdpbl9kZS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiY2QxNGMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDEvcGx1Z2luX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIDxjb3B5cmlnaHQ+DQotIyA8L2NvcHlyaWdodD4NCi0jDQotIyAkSWQ6IHBsdWdpbl9kZS5wcm9wZXJ0aWVzLHYgMS4xIDIwMDYvMTEvMDIgMDA6NTA6NDcganRoYW0gRXhwICQNCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotcGx1Z2luTmFtZSA9IEVQRiAtIFhNTCBVTUEgTW9kZWxsDQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMS9wbHVnaW5fZXMucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OTcwMmIyLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyA8Y29weXJpZ2h0Pg0KLSMgPC9jb3B5cmlnaHQ+DQotIw0KLSMgJElkOiBwbHVnaW5fZXMucHJvcGVydGllcyx2IDEuMSAyMDA2LzExLzAyIDAwOjUwOjQ3IGp0aGFtIEV4cCAkDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXBsdWdpbk5hbWUgPSBNb2RlbG8gZGUgVU1BIGRlIFhNTCBkZSBFUEYNCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL3BsdWdpbl9mci5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiNjlkMWQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDEvcGx1Z2luX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIDxjb3B5cmlnaHQ+DQotIyA8L2NvcHlyaWdodD4NCi0jDQotIyAkSWQ6IHBsdWdpbl9mci5wcm9wZXJ0aWVzLHYgMS4xIDIwMDYvMTEvMDIgMDA6NTA6NDcganRoYW0gRXhwICQNCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotcGx1Z2luTmFtZSA9IE1vZFx1MDBlOGxlIEVQRiBYTUwgVU1BDQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMS9wbHVnaW5faXQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZWE1NTUzLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL3BsdWdpbl9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyA8Y29weXJpZ2h0Pg0KLSMgPC9jb3B5cmlnaHQ+DQotIw0KLSMgJElkOiBwbHVnaW5faXQucHJvcGVydGllcyx2IDEuMSAyMDA2LzExLzAyIDAwOjUwOjQ3IGp0aGFtIEV4cCAkDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXBsdWdpbk5hbWUgPSBNb2RlbGxvIFVNQSBYTUwgRVBGDQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMS9wbHVnaW5famEucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNTFkYTJhLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyA8Y29weXJpZ2h0Pg0KLSMgPC9jb3B5cmlnaHQ+DQotIw0KLSMgJElkOiBwbHVnaW5famEucHJvcGVydGllcyx2IDEuMSAyMDA2LzExLzAyIDAwOjUwOjQ3IGp0aGFtIEV4cCAkDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXBsdWdpbk5hbWUgPSBFUEYgWE1MIFVNQSBNb2RlbA0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDEvcGx1Z2luX2tvLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjMzOGRhYy4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMS9wbHVnaW5fa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgPGNvcHlyaWdodD4NCi0jIDwvY29weXJpZ2h0Pg0KLSMNCi0jICRJZDogcGx1Z2luX2tvLnByb3BlcnRpZXMsdiAxLjEgMjAwNi8xMS8wMiAwMDo1MDo0NyBqdGhhbSBFeHAgJA0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIFRvIGNvZGUgZGV2ZWxvcGVyOg0KLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUNCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4NCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlDQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5Lg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1wbHVnaW5OYW1lID0gRVBGIFhNTCBVTUEgXHViYWE4XHViMzc4DQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMS9wbHVnaW5fcHRfQlIucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1Zjg4YzYwLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL3BsdWdpbl9wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyA8Y29weXJpZ2h0Pg0KLSMgPC9jb3B5cmlnaHQ+DQotIw0KLSMgJElkOiBwbHVnaW5fcHRfQlIucHJvcGVydGllcyx2IDEuMSAyMDA2LzExLzAyIDAwOjUwOjQ3IGp0aGFtIEV4cCAkDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXBsdWdpbk5hbWUgPSBNb2RlbG8gWE1MIFVNQSBkbyBFUEYNCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwxL3BsdWdpbl96aF9DTi5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyZDU2YjkuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDEvcGx1Z2luX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIDxjb3B5cmlnaHQ+DQotIyA8L2NvcHlyaWdodD4NCi0jDQotIyAkSWQ6IHBsdWdpbl96aF9DTi5wcm9wZXJ0aWVzLHYgMS4xIDIwMDYvMTEvMDIgMDA6NTA6NDcganRoYW0gRXhwICQNCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotcGx1Z2luTmFtZSA9IEVQRiBYTUwgVU1BIFx1NmEyMVx1NTc4Yg0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDEvcGx1Z2luX3poX1RXLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2VlZWQ1Yi4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMS9wbHVnaW5femhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgPGNvcHlyaWdodD4NCi0jIDwvY29weXJpZ2h0Pg0KLSMNCi0jICRJZDogcGx1Z2luX3poX1RXLnByb3BlcnRpZXMsdiAxLjEgMjAwNi8xMS8wMiAwMDo1MDo0NyBqdGhhbSBFeHAgJA0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIFRvIGNvZGUgZGV2ZWxvcGVyOg0KLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUNCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4NCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlDQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5Lg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVINCi0NCi1wbHVnaW5OYW1lID0gRVBGIFhNTCBVTUEgTW9kZWwNCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyLy5jbGFzc3BhdGggYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMi8ucHJvamVjdCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNzA2NGJlLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDI8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZmJlM2I3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgQ29tcG9zZXIgWE1MIFVNQSAoTkwyKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDIvYnVpbGQucHJvcGVydGllcyBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1NGZjYTcuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW5fcnUucHJvcGVydGllcw0KLQ0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyL3BsdWdpbl9ydS5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdlNTM0OWQuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDIvcGx1Z2luX3J1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIDxjb3B5cmlnaHQ+DQotIyA8L2NvcHlyaWdodD4NCi0jDQotIyAkSWQ6IHBsdWdpbl9ydS5wcm9wZXJ0aWVzLHYgMS4xIDIwMDYvMTEvMDIgMDA6NTA6NDcganRoYW0gRXhwICQNCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyBUbyBjb2RlIGRldmVsb3BlcjoNCi0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlDQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuDQotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQ0KLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSDQotDQotcGx1Z2luTmFtZSA9IEVQRiAtIFx1MDQzY1x1MDQzZVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQ0YyBVTUEgWE1MDQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMmEvLmNsYXNzcGF0aCBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjc0NTQ3Li4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyYS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDJhLy5wcm9qZWN0IGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDJhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNDA3YTRkLi4wMDAwMDAwCi0tLSBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjhmYTk4ZC4uMDAwMDAwMAotLS0gYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21wb3NlciBYTUwgVU1BIChOTDJhKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyYQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL25sX3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEubmwyYS9idWlsZC5wcm9wZXJ0aWVzIGIvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDJhL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0ZTY4MjMuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDJhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luX2RhLnByb3BlcnRpZXMNCi0NCmRpZmYgLS1naXQgYS9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMgYi9ubF9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLm5sMmEvcGx1Z2luX2RhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlZTZjMzEuLjAwMDAwMDAKLS0tIGEvbmxfcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5ubDJhL3BsdWdpbl9kYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyA8Y29weXJpZ2h0Pg0KLSMgPC9jb3B5cmlnaHQ+DQotIw0KLSMgJElkOiBwbHVnaW5fZGEucHJvcGVydGllcyx2IDEuMSAyMDA2LzExLzAyIDAwOjUwOjQyIGp0aGFtIEV4cCAkDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUg0KLQ0KLXBsdWdpbk5hbWUgPSBFUEYgWE1MIFVNQS1tb2RlbA0KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODQyMDViMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4Y2x1ZGluZz0iY29tL2libS91bWEvYXV0aG9yaW5nL3ZpZXdzL0JTRWRpdG9yVmlldy5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9Db250ZW50UGFja2FnZVRhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9HdWlkYW5jZVRhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9Qcm9kdWN0RWRpdG9yVmlldy5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9Qcm9kdWN0Vmlld2VyLmphdmF8Y29tL2libS91bWEvYXV0aG9yaW5nL3ZpZXdzL1JvbGVEb2N1bWVudGF0aW9uVGFiLmphdmF8Y29tL2libS91bWEvYXV0aG9yaW5nL3ZpZXdzL1JvbGVUYXNrc1RhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9Sb2xlV29ya1Byb2R1Y3RzVGFiLmphdmF8Y29tL2libS91bWEvYXV0aG9yaW5nL3ZpZXdzL1Rhc2tEaXNjaXBsaW5lVGFiLmphdmF8Y29tL2libS91bWEvYXV0aG9yaW5nL3ZpZXdzL1Rhc2tEb2N1bWVudGF0aW9uVGFiLmphdmF8Y29tL2libS91bWEvYXV0aG9yaW5nL3ZpZXdzL1Rhc2tHdWlkYW5jZXNUYWIuamF2YXxjb20vaWJtL3VtYS9hdXRob3Jpbmcvdmlld3MvVGFza1N0ZXBUYWIuamF2YXxjb20vaWJtL3VtYS9hdXRob3Jpbmcvdmlld3MvV29ya1Byb2R1Y3REb2N1bWVudGF0aW9uVGFiLmphdmF8Y29tL2libS91bWEvYXV0aG9yaW5nL3ZpZXdzL1dvcmtQcm9kdWN0R3VpZGFuY2VzVGFiLmphdmF8Y29tL2libS91bWEvYXV0aG9yaW5nL3ZpZXdzL1dvcmtQcm9kdWN0VGFza3NUYWIuamF2YSIga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OTliMzI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgQXV0aG9yaW5nIFVJIHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MjMzNTJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODZiYjJhYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1dlZCBOb3YgMjkgMTg6MDk6NDkgUFNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MjA5ZjAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmRyYXcyZCwKLSBvcmcuZWNsaXBzZS5nZWYsCi0gb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMsCi0gb3JnLmVjbGlwc2UudWkuZm9ybXMsCi0gb3JnLmVjbGlwc2UudWkuaW50cm8sCi0gb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IsCi0gb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24sCi0gb3JnLmVjbGlwc2UudGVhbS5jdnMudWksCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLAotIG9yZy5lY2xpcHNlLnNlYXJjaCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkucmVuZGVyLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5yZW5kZXIuYXd0Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llcywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWksCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2VsbGVkaXRvcnMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jaGVhdHNoZWV0cy5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRuZCwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dCwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2ZmU3OGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaGVscC8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2hlbHAvYm9vay54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaGVscC9ib29rLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODdiMDgxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaGVscC9ib29rLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPHRvYyBsYWJlbD0iRVBGIENvbXBvc2VyIE1ldGhvZCBBdXRocm9pbmcgSGVscCBQYWdlIiAgdG9waWM9Imh0bWwvYm9vay5odG1sIj4KLQk8dG9waWMgbGFiZWw9Ik10aG9kIEF1dGhvcmluZyBPdmVydmlldyIgaHJlZj0iaHRtbC9vdmVydmlldy5odG1sIi8+Ci0JPHRvcGljIGxhYmVsPSJBdXRob3JpbmcgVHV0b3JpYWwiIGhyZWY9Imh0bWwvdHV0b3JpYWwuaHRtbCIvPgotPC90b2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL0l0ZXJhdGlvbjE2LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9JdGVyYXRpb24xNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQzMTFlNDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL0l0ZXJhdGlvbjE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9QaGFzZTE2LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9QaGFzZTE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWQ2MGJkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvUGhhc2UxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvUm9sZURlc2NyaXB0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1JvbGVEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzY4YzdiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvUm9sZURlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1N5bmNoQmFyMTYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1N5bmNoQmFyMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYzk5NDRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9TeW5jaEJhcjE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9TeW5jaEJhcjI0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9TeW5jaEJhcjI0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmM5OTQ0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvU3luY2hCYXIyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvVGFza0Rlc2NyaXB0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1Rhc2tEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTU0ZTI2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvVGFza0Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1RlbXBsYXRlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9UZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3NjMyNTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9UZW1wbGF0ZURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9UZW1wbGF0ZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzc2MzI1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvVGVtcGxhdGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzczOTNlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FjdGl2aXR5MTYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FjdGl2aXR5MTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hY3Rpdml0eTE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hY3Rpdml0eTI0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hY3Rpdml0eTI0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWRkQWxsRGVwZW5kZW50RWxlbS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWRkQWxsRGVwZW5kZW50RWxlbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljYWNiOTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FkZEFsbERlcGVuZGVudEVsZW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FkZHJlZl9jby5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWRkcmVmX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjg0MGNkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWRkcmVmX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jaGVja2VkLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jaGVja2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDYzNDRkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY2hlY2tlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY2xvc3VyZV9jby5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY2xvc3VyZV9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhiNTU0MWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nsb3N1cmVfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NvbGxhcHNlYWxsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb2xsYXBzZWFsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEyZDgwYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NvbGxhcHNlYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb2xsYXBzZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NvbGxhcHNlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVmNGM4YmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NvbGxhcHNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29ubmVjdGlvbjE2LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb25uZWN0aW9uMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxODZhMTI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb25uZWN0aW9uMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nvbm5lY3Rpb24yNC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29ubmVjdGlvbjI0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjZhNWZlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29ubmVjdGlvbjI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb253YXJuX2NvLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb253YXJuX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWI1MGMwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29ud2Fybl9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZGVjbm9kZV9wYWwxNi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZGVjbm9kZV9wYWwxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcxNWE1YjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2RlY25vZGVfcGFsMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2RlY25vZGVfcGFsMjQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2RlY25vZGVfcGFsMjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNDZlYWExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9kZWNub2RlX3BhbDI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9lbmRub2RlX3BhbDE2LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9lbmRub2RlX3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDA2NTA2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZW5kbm9kZV9wYWwxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZW5kbm9kZV9wYWwyNC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZW5kbm9kZV9wYWwyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiMTc3ZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2VuZG5vZGVfcGFsMjQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Vycm9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9lcnJvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1ZTdhOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Vycm9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9leHBhbmRhbGwuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2V4cGFuZGFsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAyMDViMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2V4cGFuZGFsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZXhwYW5kZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2V4cGFuZGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmY0ZDljNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZXhwYW5kZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2ZyZWV0ZXh0X3BhbDE2LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mcmVldGV4dF9wYWwxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkYjgxM2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2ZyZWV0ZXh0X3BhbDE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mcmVldGV4dF9wYWwyNC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnJlZXRleHRfcGFsMjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OGI0ZTA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mcmVldGV4dF9wYWwyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1ByZXNfbmFtZV90b2dnbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9QcmVzX25hbWVfdG9nZ2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTcwYWZhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1ByZXNfbmFtZV90b2dnbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9QcmludC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1ByaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDQ1ZGU3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1ByaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvUmVmcmVzaC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1JlZnJlc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzY2EwNGQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvUmVmcmVzaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1N0b3AuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9TdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTIwODIzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1N0b3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9mbGF0TGF5b3V0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvZmxhdExheW91dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFlZjc0Y2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9mbGF0TGF5b3V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjM0NDg2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfZG93bi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfZG93bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFkNDNlMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX2Rvd24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX2Rvd25fZGlzYWJsZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX2Rvd25fZGlzYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMGRjZjUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvbW92ZV9kb3duX2Rpc2FibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvbW92ZV91cC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfdXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZDc0NzA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvbW92ZV91cC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfdXBfZGlzYWJsZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX3VwX2Rpc2FibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjYyZGYxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfdXBfZGlzYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zaG93X2xpbmtlZF9lbGVtZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvc2hvd19saW5rZWRfZWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ2ODRmN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zaG93X2xpbmtlZF9lbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvc2hvd19saW5rZWRfZWxlbWVudF9kaXNhYmxlZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3Nob3dfbGlua2VkX2VsZW1lbnRfZGlzYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYTdmOGZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvc2hvd19saW5rZWRfZWxlbWVudF9kaXNhYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3N5bmNlZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3N5bmNlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgxYTc2MDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zeW5jZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0NoZWNrLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0NoZWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTI4OTcyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9DaGVjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9Db2xsYXBzZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQ29sbGFwc2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGIzM2MzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9Db2xsYXBzZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvRGlzYWJsZUNoZWNrLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0Rpc2FibGVDaGVjay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzNjczNzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvRGlzYWJsZUNoZWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0Rpc2FibGVVbmNoZWNrLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0Rpc2FibGVVbmNoZWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWUyYTc4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9EaXNhYmxlVW5jaGVjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9FeHBhbmRlZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9FeHBhbmRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzNTc0NTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvRXhwYW5kZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU4OTYwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZEVsZW1lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM0ZmIzMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGx1Z2luLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJiODJjMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGx1Z2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9VbmNoZWNrLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1VuY2hlY2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNGZhOTYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1VuY2hlY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyMTgyMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL292cjE2L2Vycm9yX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMTEyNDE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL292cjE2L2Vycm9yX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvQXV0aG9yaW5nUGVyc3BlY3RpdmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0F1dGhvcmluZ1BlcnNwZWN0aXZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDBhMzExZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvQXV0aG9yaW5nUGVyc3BlY3RpdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0Jyb3dzaW5nUGVyc3BlY3RpdmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0Jyb3dzaW5nUGVyc3BlY3RpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZTg5NjAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Ccm93c2luZ1BlcnNwZWN0aXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Db25maWd1cmF0aW9uRXJyb3JMb2dWaWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Db25maWd1cmF0aW9uRXJyb3JMb2dWaWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTFiNjM3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvQ29uZmlndXJhdGlvbkVycm9yTG9nVmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvQ29uZmlndXJhdGlvblZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0NvbmZpZ3VyYXRpb25WaWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU4OTYwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvQ29uZmlndXJhdGlvblZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0NvbnRlbnRWaWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Db250ZW50Vmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0NvbnRlbnRWaWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9MaWJyYXJ5Vmlldy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvTGlicmFyeVZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9MaWJyYXJ5Vmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvTWV0aG9kUGx1Z2luLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9NZXRob2RQbHVnaW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYjgyYzM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9NZXRob2RQbHVnaW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL05ldy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC93aXpiYW4vTmV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI0OTgzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC93aXpiYW4vTmV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3dpemJhbi9zeW5jaHJvbml6YXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3N5bmNocm9uaXphdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIyNGIzNjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3N5bmNocm9uaXphdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvaGlkZVVuY2hlY2tlZEVsZW0uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2hpZGVVbmNoZWNrZWRFbGVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODcwOTM0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvaGlkZVVuY2hlY2tlZEVsZW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2xpbmtfcGFsMTYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2xpbmtfcGFsMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOGY0MDhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9saW5rX3BhbDE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9saW5rX3BhbDI0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9saW5rX3BhbDI0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTQxMzdlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbGlua19wYWwyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbWFycV9wYWwxNi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbWFycV9wYWwxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ3Zjg3NWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21hcnFfcGFsMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21hcnFfcGFsMjQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21hcnFfcGFsMjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NTdkNzg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tYXJxX3BhbDI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tb3ZlX2Rvd24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21vdmVfZG93bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAzMjgzNTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21vdmVfZG93bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbW92ZV91cC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbW92ZV91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgzMGMyYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21vdmVfdXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NlbGVjdF9wYWwxNi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2VsZWN0X3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQ1Y2FmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2VsZWN0X3BhbDE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zZWxlY3RfcGFsMjQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NlbGVjdF9wYWwyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViMGZjZmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NlbGVjdF9wYWwyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvYWN0aXZpdHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzczOTNlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvYWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2FydGlmYWN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9hcnRpZmFjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2FydGlmYWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jYXBhYmlsaXR5cGF0dGVybi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY2FwYWJpbGl0eXBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkODBiMWFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jYXBhYmlsaXR5cGF0dGVybi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY2hlY2tsaXN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jaGVja2xpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzNhYTNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jaGVja2xpc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2NvbmNlcHQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2NvbmNlcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMGU5NWNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jb25jZXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jb250ZW50cGFja2FnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY29udGVudHBhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlM2FkOTZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jb250ZW50cGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY3VzdG9tY2F0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jdXN0b21jYXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YmIyZDhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jdXN0b21jYXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RlbGl2ZXJhYmxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kZWxpdmVyYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhMTA1NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RlbGl2ZXJhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kZWxpdmVyeXByb2Nlc3MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RlbGl2ZXJ5cHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyYmE3ODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RlbGl2ZXJ5cHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGlzY2lwbGluZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGlzY2lwbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc3MTVhOWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2Rpc2NpcGxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2Rpc2NpcGxpbmVncm91cC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGlzY2lwbGluZWdyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2I0MzA2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGlzY2lwbGluZWdyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kb21haW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RvbWFpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQwZTI1N2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RvbWFpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZ3VpZGVsaW5lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9ndWlkZWxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTkxZTViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9ndWlkZWxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2l0ZXJhdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvaXRlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjVjOGExNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvaXRlcmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9tZXRob2RsaWJyYXJ5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9tZXRob2RsaWJyYXJ5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGI0Zjk3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvbWV0aG9kbGlicmFyeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvbWV0aG9kcGx1Z2luLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9tZXRob2RwbHVnaW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OTFhMjNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9tZXRob2RwbHVnaW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL21pbGVzdG9uZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvbWlsZXN0b25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTc2ZmY5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvbWlsZXN0b25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9vdXRjb21lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9vdXRjb21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTcwMzUxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvb3V0Y29tZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcGhhc2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3BoYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTVjYjNjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcGhhc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZjlhMDg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzY29tcG9uZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzY29tcG9uZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGY5YTA4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc2NvbXBvbmVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc2NvbnRyaWJ1dGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc2NvbnRyaWJ1dGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI5NjZiNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3Njb250cmlidXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3NwYWNrYWdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzcGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3NTdmYzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3NwYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzcGxhbm5pbmd0ZW1wbGF0ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc3BsYW5uaW5ndGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZDA2ODA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzcGxhbm5pbmd0ZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY5ZWJkZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3JvbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3JvbGVkZXNfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlZGVzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1NTI0YWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3JvbGVkZXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlZGVzY3JpcHRvci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZWRlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNWEyMmIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlZGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZXNldC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZXNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmYjY3YzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3JvbGVzZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2suZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NjMzZDU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90YXNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90YXNrZGVzX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNDllZmUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90YXNrZGVzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc2NyaXB0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2tkZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzQ1ZDY1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2tkZXNjcmlwdG9yMS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc2NyaXB0b3IxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzQ1ZDY1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc2NyaXB0b3IxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90ZWNobmlxdWUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3RlY2huaXF1ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAxNTEzNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3RlY2huaXF1ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGVtcGxhdGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTU3YTdlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rvb2wuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rvb2wuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YzU1YTJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90b29sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90b29sbWVudG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90b29sbWVudG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGM1NWEyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdG9vbG1lbnRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvd2hpdGVwYXBlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvd2hpdGVwYXBlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyZTQ4ZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3doaXRlcGFwZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3dvcmtkZXNfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3JrZGVzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlZWE4Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3dvcmtkZXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3Jrb3JkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3dvcmtvcmRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwNWViYzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3dvcmtvcmRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvd29ya3Byb2R1Y3RkZXNjcmlwdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3JrcHJvZHVjdGRlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MjE4MjI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3JrcHJvZHVjdGRlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3dwZ3VpZGVsaW5lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93cGd1aWRlbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllOTFlNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3dwZ3VpZGVsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaG93Q29uZmlnRXJyb3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3Nob3dDb25maWdFcnJvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxYjYzN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3Nob3dDb25maWdFcnJvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3Rub2RlX3BhbDE2LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zdG5vZGVfcGFsMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMjIyZjRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zdG5vZGVfcGFsMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3N0bm9kZV9wYWwyNC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3Rub2RlX3BhbDI0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTU2YjFmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3Rub2RlX3BhbDI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zeW5jYmFyX3BhbDE2LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zeW5jYmFyX3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQ5ZDBmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3luY2Jhcl9wYWwxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3luY2Jhcl9wYWwyNC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3luY2Jhcl9wYWwyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQwN2QwN2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3N5bmNiYXJfcGFsMjQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3dhcm5pbmcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3dhcm5pbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZWUyMGFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy93YXJuaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy93Zl9lZGl0b3JfaWNvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2ZfZWRpdG9yX2ljb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZGRjMWNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy93Zl9lZGl0b3JfaWNvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2l6YmFuL3N5bmNocm9uaXphdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2l6YmFuL3N5bmNocm9uaXphdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIyNGIzNjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3dpemJhbi9zeW5jaHJvbml6YXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkODRlYzUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIEF1dGhvcmluZyBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgQ2F0ZWdvcnkKLW1ldGhvZENhdGVnb3J5TmFtZT1NZXRob2QKLQotIyBQZXJzcGVjdGl2ZQotYXV0aG9yaW5nUGVyc3BlY3RpdmVOYW1lPUF1dGhvcmluZwotYnJvd3NpbmdQZXJzcGVjdGl2ZU5hbWU9QnJvd3NpbmcKLQotIyBWaWV3cwotbGlicmFyeVZpZXdOYW1lPUxpYnJhcnkKLWNvbmZpZ3VyYXRpb25WaWV3TmFtZT1Db25maWd1cmF0aW9uCi1jb250ZW50Vmlld05hbWU9Q29udGVudAotY29uZmlndXJhdGlvbkVycm9yTG9nVmlld05hbWU9Q29uZmlndXJhdGlvbiBFcnJvciBMb2cKLQotIyBFZGl0b3JzCi1tZXRob2RFbGVtZW50RWRpdG9yTmFtZT1NZXRob2QgRWxlbWVudCBFZGl0b3IKLWNvbmZpZ3VyYXRpb25FZGl0b3JOYW1lPUNvbmZpZ3VyYXRpb24gRWRpdG9yCi1wcm9jZXNzRWRpdG9yTmFtZT1Qcm9jZXNzIEVkaXRvcgotYWN0aXZpdHlEaWFncmFtRWRpdG9yTmFtZT1BY3Rpdml0eSBEaWFncmFtIEVkaXRvcgotYWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yTmFtZT1BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBFZGl0b3IKLXdvcmtQcm9kdWN0RGVwZWRlbmN5RGlhZ3JhbUVkaXRvck5hbWU9V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbSBFZGl0b3IKLQotIyBXaXphcmRzCi1uZXdNZXRob2RMaWJyYXJ5V2l6YXJkTmFtZT1NZXRob2QgTGlicmFyeQotbmV3TWV0aG9kTGlicmFyeVdpemFyZERlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBtZXRob2QgbGlicmFyeS4KLW5ld01ldGhvZFBsdWdpbldpemFyZE5hbWU9TWV0aG9kIFBsdWctaW4KLW5ld01ldGhvZFBsdWdpbldpemFyZERlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBtZXRob2QgcGx1Zy1pbi4KLW5ld0NvbmZpZ3VyYXRpb25XaXphcmROYW1lPU1ldGhvZCBDb25maWd1cmF0aW9uCi1uZXdDb25maWd1cmF0aW9uV2l6YXJkRGVzY3JpcHRpb249Q3JlYXRlIGEgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCi0jIENoZWF0IFNoZWV0cwotbWV0aG9kQXV0aG9yaW5nQ2hlYXRTaGVldHNOYW1lPU1ldGhvZCBBdXRob3JpbmcgQ2hlYXQgU2hlZXRzCi1DaGVhdHNoZWV0R2V0c3RhcnRlZENhdGVnb3J5VGV4dD1HZXR0aW5nIFN0YXJ0ZWQKLUNoZWF0c2hlZXRSZXVzYWJsZUNvbnRlbnRDYXRlZ29yeVRleHQ9Q3JlYXRlIFJldXNhYmxlIE1ldGhvZCBDb250ZW50Ci1DaGVhdHNoZWV0V3JpdGVDb250ZW50Q2F0ZWdvcnlUZXh0PVdyaXRlIE1ldGhvZCBDb250ZW50Ci1DaGVhdHNoZWV0UHJvY2Vzc2VzQ2F0ZWdvcnlUZXh0PVdvcmsgd2l0aCBQcm9jZXNzZXMKLUNoZWF0c2hlZXROYXZpZ2F0ZU1ldGhvZENvbnRlbnQ9TmF2aWdhdGUgTWV0aG9kIENvbnRlbnQKLUNoZWF0c2hlZXRDcmVhdGVNZXRob2RDb25maWd1cmF0aW9uPUNyZWF0ZSB5b3VyIG93biBNZXRob2QgQ29uZmlndXJhdGlvbgotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZFBsdWdpbj1DcmVhdGUgeW91ciBvd24gTWV0aG9kIFBsdWctaW4KLUNoZWF0c2hlZXRBZGRNZXRob2RDb250ZW50PUFkZCBuZXcgTWV0aG9kIENvbnRlbnQgc3VjaCBhcyBSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMsIG9yIEd1aWRhbmNlCi1DaGVhdHNoZWV0VGFpbG9yTWV0aG9kRWxlbWVudHM9VGFpbG9yIGV4aXN0aW5nIE1ldGhvZCBFbGVtZW50cyAoUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzIG9yIEd1aWRhbmNlKSBVc2luZyBDb250cmlidXRpb24KLUNoZWF0c2hlZXRSZXBsYWNlTWVodG9kRWxlbWVudHM9UmVwbGFjZSBleGlzdGluZyBNZXRob2QgRWxlbWVudHMgKFJvbGVzLCBUYXNrcywgV29yayBQcm9kdWN0cyBvciBHdWlkYW5jZSkKLUNoZWF0c2hlZXRBZGRNZXRob2RSZWZPckh5cGVybGluaz1BZGQgYSBNZXRob2QgUmVmZXJlbmNlIG9yIEh5cGVybGluayAoVVJMKQotQ2hlYXRzaGVldEFwcGx5Q2FwYWJpbGl0eVBhdHRlcm49QXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm4KLUNoZWF0c2hlZXRDcmVhdGVQcm9jZXNzPUNyZWF0ZSBhIFByb2Nlc3MgKENhcGFiaWxpdHkgUGF0dGVybiBvciBEZWxpdmVyeSBQcm9jZXNzKQotCi0jIEFjdGlvbiBTZXQKLWF1dGhvcmluZ0FjdGlvblNldD1BdXRob3JpbmcKLWNoZWF0U2hlZXRzQWN0aW9uU2V0PUNoZWF0IFNoZWV0cwotCi0jIEdsb2JhbCBBY3Rpb25zCi1uZXdMaWJyYXJ5QWN0aW9uPU1ldGhvZCAmTGlicmFyeQotbmV3TGlicmFyeUFjdGlvblRvb2x0aXA9Q3JlYXRlIGEgbmV3IE1ldGhvZCBMaWJyYXJ5Ci1uZXdQbHVnaW5BY3Rpb249TWV0aG9kICZQbHVnLWluCi1uZXdQbHVnaW5BY3Rpb25Ub29sdGlwPUNyZWF0ZSBhIG5ldyBNZXRob2QgUGx1Zy1pbgotbmV3Q29uZmlnQWN0aW9uPU1ldGhvZCAmQ29uZmlndXJhdGlvbgotbmV3Q29uZmlnQWN0aW9uVG9vbHRpcD1DcmVhdGUgYSBuZXcgTWV0aG9kIENvbmZpZ3VyYXRpb24KLW9wZW5MaWJyYXJ5QWN0aW9uPU1ldGhvZCAmTGlicmFyeQotb3BlbkxpYnJhcnlBY3Rpb25Ub29sdGlwPU9wZW4gYW4gZXhpc3RpbmcgTWV0aG9kIExpYnJhcnkKLW9wZW5Db25maWdBY3Rpb249TWV0aG9kICZDb25maWd1cmF0aW9uCi1vcGVuQ29uZmlnQWN0aW9uVG9vbHRpcD1PcGVuIGFuIGV4aXN0aW5nIE1ldGhvZCBDb25maWd1cmF0aW9uCi1vcGVuQ2hlYXRTaGVldHM9JkNoZWF0IFNoZWV0cy4uLgotCi0jIExpYnJhcnkgVmlldyBBY3Rpb25zCi1saW5rV2l0aEVkaXRvcj1MaW5rIHdpdGggRWRpdG9yCi1saW5rV2l0aEVkaXRvclRvb2x0aXA9TGluayB3aXRoIEVkaXRvcgotc2hvd1ByZXNlbnRhdGlvbk5hbWVzPVNob3cgUHJlc2VudGF0aW9uIE5hbWVzCi1zaG93UHJlc2VudGF0aW9uTmFtZXNUb29sdGlwPVNob3cgUHJlc2VudGF0aW9uIE5hbWVzCi0KLSMgQ29uZmlndXJhdGlvbiBWaWV3IEFjdGlvbnMKLXJlZnJlc2hDb25maWc9UmVmcmVzaAotcmVmcmVzaENvbmZpZ1Rvb2x0aXA9UmVmcmVzaCBDb25maWd1cmF0aW9uCi0KLSMgUHJlZmVyZW5jZSBQYWdlCi1tZXRob2RBdXRob3JpbmdQYWdlPU1ldGhvZCBBdXRob3JpbmcKLXByb2Nlc3NFZGl0b3I9UHJvY2VzcyBFZGl0b3IKLWxpYnJhcnlPcHRpb25zPUxpYnJhcnkgT3B0aW9ucwotZGlhZ3JhbT1EaWFncmFtCi1zdGFydHVwQW5kU2h1dGRvd249U3RhcnR1cCBhbmQgU2h1dGRvd24KLWRlYnVnPURlYnVnCi1tb2RlbGluZ09wdGlvbnM9TW9kZWxpbmcgT3B0aW9ucwotCi0jIENvbW1hbmQgSGFuZGxlcgotc2VsZWN0QWxsPVNlbGVjdCBBbGwKLQotIyBQcm9wZXJ0aWVzIFZpZXcKLV9VSV9Qcm9jZXNzRWRpdG9yX21lbnU9UHJvY2VzcwotX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbT0mTmV3IENoaWxkCi1fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW09TiZldyBTaWJsaW5nCi1fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbT1TaG93IFByb3BlcnRpZXMgJlZpZXcKLV9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbT1SZSZmcmVzaAotX1VJX1Byb3BlcnRpZXNfR2VuZXJhbD1HZW5lcmFsCi1fVUlfUHJvcGVydGllc19Eb2N1bWVudGF0aW9uPURvY3VtZW50YXRpb24KLV9VSV9Qcm9wZXJ0aWVzX0d1aWRhbmNlPUd1aWRhbmNlCi1fVUlfUHJvcGVydGllc19Xb3JrX1JvbGx1cD1Xb3JrIFJvbGx1cAotX1VJX1Byb3BlcnRpZXNfVGVhbV9Sb2xsdXA9VGVhbSBSb2xsdXAKLSMjIFRoZSBmb2xsb3dpbmcgdmFsdWUgb2Ygc3RyaW5nIHNob3VsZCBiZSAiV29yayBQcm9kdWN0IFJvbGx1cCIuIEJ1dAotIyMgZHVlIHRvIGxpbWl0YXRpb24vYnVnIGluIEVjbGlwc2UgV1RQLCBpdCdzIGJlZW4gdHJ1bmNhdGVkIHRvIAotIyMgIldvcmsgUHJvZCBSb2xsdXAiLiBTbyBkdXJpbmcgdHJhbnNsYXRpb24sIHBsZWFzZSB0YWtlIHRoaXMgaW50byBjb25zaWRlcmF0aW9uLgotX1VJX1Byb3BlcnRpZXNfV1BfUm9sbHVwPVdvcmsgUHJvZCBSb2xsdXAKLV9VSV9Qcm9wZXJ0aWVzX1JvbGVzPVJvbGVzCi1fVUlfUHJvcGVydGllc19Xb3JrUHJvZHVjdHM9V29yayBQcm9kdWN0cwotX1VJX1Byb3BlcnRpZXNfU3RlcHM9U3RlcHMKLV9VSV9Qcm9wZXJ0aWVzX1RlYW1zPVRlYW1zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMDE5ZjYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iVGFza0VkaXRvclBhZ2VQcm92aWRlciIgbmFtZT0iVGFzayBFZGl0b3IgUGFnZSBQcm92aWRlciIgc2NoZW1hPSJzY2hlbWEvVGFza0VkaXRvclBhZ2VQcm92aWRlci5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJQcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyIiBuYW1lPSJQcm9jZXNzIEVkaXRvciBQYWdlIFByb3ZpZGVyIiBzY2hlbWE9InNjaGVtYS9Qcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyLmV4c2QiLz4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzIj4KLSAgICAgIDxwZXJzcGVjdGl2ZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nUGVyc3BlY3RpdmUiCi0gICAgICAgICAgICBmaXhlZD0iZmFsc2UiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL3ZpZXcxNi9BdXRob3JpbmdQZXJzcGVjdGl2ZS5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIG5hbWU9IiVhdXRob3JpbmdQZXJzcGVjdGl2ZU5hbWUiLz4KLSAgICAgIDxwZXJzcGVjdGl2ZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQnJvd3NpbmdQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIGZpeGVkPSJmYWxzZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvdmlldzE2L0Jyb3dzaW5nUGVyc3BlY3RpdmUuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQnJvd3NpbmdQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIG5hbWU9IiVicm93c2luZ1BlcnNwZWN0aXZlTmFtZSIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLnZpZXdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXciCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL3ZpZXcxNi9MaWJyYXJ5Vmlldy5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldyIKLSAgICAgICAgICAgIG5hbWU9IiVsaWJyYXJ5Vmlld05hbWUiLz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLnZpZXdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXciCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL3ZpZXcxNi9Db25maWd1cmF0aW9uVmlldy5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db25maWd1cmF0aW9uVmlldyIKLSAgICAgICAgICAgIG5hbWU9IiVjb25maWd1cmF0aW9uVmlld05hbWUiLz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLnZpZXdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29udGVudFZpZXciCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL3ZpZXcxNi9Db250ZW50Vmlldy5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db250ZW50VmlldyIKLSAgICAgICAgICAgIG5hbWU9IiVjb250ZW50Vmlld05hbWUiLz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLnZpZXdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTWVzc2FnZVZpZXciCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL3ZpZXcxNi9Db25maWd1cmF0aW9uRXJyb3JMb2dWaWV3LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLk1lc3NhZ2VWaWV3IgotICAgICAgICAgICAgbmFtZT0iJWNvbmZpZ3VyYXRpb25FcnJvckxvZ1ZpZXdOYW1lIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KLSAgICAgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nUGVyc3BlY3RpdmUiPgotICAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgIGNsb3NlYWJsZT0iZmFsc2UiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db25maWd1cmF0aW9uVmlldyIKLSAgICAgICAgICAgICAgIG1vdmVhYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgcmF0aW89IjAuNWYiCi0gICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9ImJvdHRvbSIKLSAgICAgICAgICAgICAgIHJlbGF0aXZlPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3Ii8+Ci0gICAgICAgICA8dmlld1Nob3J0Y3V0Ci0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldyIvPgotICAgICAgICAgPHZpZXdTaG9ydGN1dAotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXciLz4KLSAgICAgICAgIDxzaG93SW5QYXJ0IGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3Ii8+Ci0gICAgICA8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgotICAgICAgCi0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkJyb3dzaW5nUGVyc3BlY3RpdmUiPgotICAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgIGNsb3NlYWJsZT0iZmFsc2UiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db250ZW50VmlldyIKLSAgICAgICAgICAgICAgIG1vdmVhYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgcmF0aW89IjAuNzBmIgotICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPSJyaWdodCIKLSAgICAgICAgICAgICAgIHJlbGF0aXZlPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzcyIvPgotICAgICAgPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IiCi0gICAgICAgICAgICBuYW1lPSIlbWV0aG9kRWxlbWVudEVkaXRvck5hbWUiLz4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29uZmlndXJhdGlvbkVkaXRvciIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbi5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3IiCi0gICAgICAgICAgICBuYW1lPSIlY29uZmlndXJhdGlvbkVkaXRvck5hbWUiLz4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvciIKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yJEJTQWN0aW9uQmFyQ29udHJpYnV0b3IiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L1Byb2Nlc3MuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yIgotICAgICAgICAgICAgbmFtZT0iJXByb2Nlc3NFZGl0b3JOYW1lIi8+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkdyYXBoaWNhbFdvcmtmbG93RWRpdG9yIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkdyYXBoaWNhbFdvcmtmbG93RWRpdG9yIgotICAgICAgICAgICAgbmFtZT0iJWFjdGl2aXR5RGlhZ3JhbUVkaXRvck5hbWUiLz4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvciIKLSAgICAgICAgICAgIG5hbWU9IiVhY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JOYW1lIi8+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkdyYXBoaWNhbFdQRGVwZW5kZW5jeUVkaXRvciIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuR3JhcGhpY2FsV1BEZXBlbmRlbmN5RWRpdG9yIgotICAgICAgICAgICAgbmFtZT0iJXdvcmtQcm9kdWN0RGVwZWRlbmN5RGlhZ3JhbUVkaXRvck5hbWUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLm5ld1dpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld0xpYnJhcnlXaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdMaWJyYXJ5V2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJW5ld01ldGhvZExpYnJhcnlXaXphcmROYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVuZXdNZXRob2RMaWJyYXJ5V2l6YXJkRGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4gICAgICAgCi0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLm5ld1dpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld01ldGhvZFBsdWdpbldpemFyZCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGx1Z2luLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3TWV0aG9kUGx1Z2luV2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJW5ld01ldGhvZFBsdWdpbldpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJW5ld01ldGhvZFBsdWdpbldpemFyZERlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLm5ld1dpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld0NvbmZpZ3VyYXRpb25XaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24uZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdDb25maWd1cmF0aW9uV2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJW5ld0NvbmZpZ3VyYXRpb25XaXphcmROYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVuZXdDb25maWd1cmF0aW9uV2l6YXJkRGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPiAgICAgCi0KLTwhLS0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmdBY3Rpb25TZXQiCi0gICAgICAgICAgICBsYWJlbD0iJWF1dGhvcmluZ0FjdGlvblNldCIKLSAgICAgICAgICAgIHZpc2libGU9InRydWUiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5OZXdDb25maWd1cmF0aW9uQWN0aW9uIgotICAgICAgICAgICAgICAgaGVscENvbnRleHRJZD0iZmlsZV9uZXdfY29uZmlndXJhdGlvbl9jb250ZXh0IgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTmV3Q29uZmlndXJhdGlvbkFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlbmV3Q29uZmlnQWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImZpbGUvbmV3LmV4dC9ncm91cG0yIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJW5ld0NvbmZpZ0FjdGlvblRvb2x0aXAiLz4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTmV3UGx1Z2luQWN0aW9uIgotICAgICAgICAgICAgICAgaGVscENvbnRleHRJZD0iZmlsZV9uZXdfcGx1Z2luX2NvbnRleHQiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbi5naWYiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk5ld1BsdWdpbkFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlbmV3UGx1Z2luQWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImZpbGUvbmV3LmV4dC9ncm91cG0yIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJW5ld0xQbHVnaW5BY3Rpb25Ub29sdGlwIi8+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk5ld0xpYnJhcnlBY3Rpb24iCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJmaWxlX25ld19saWJyYXJ5X2NvbnRleHQiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5OZXdMaWJyYXJ5QWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVuZXdMaWJyYXJ5QWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImZpbGUvbmV3LmV4dC9ncm91cG0xIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJW5ld0xpYnJhcnlBY3Rpb25Ub29sdGlwIi8+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk9wZW5Db25maWd1cmF0aW9uQWN0aW9uIgotICAgICAgICAgICAgICAgaGVscENvbnRleHRJZD0iZmlsZV9vcGVuX2NvbmZpZ3VyYXRpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbi5naWYiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk9wZW5Db25maWd1cmF0aW9uQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVvcGVuQ29uZmlnQWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImZpbGUvb3Blbi5leHQvZ3JvdXBtMiIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVvcGVuQ29uZmlnQWN0aW9uVG9vbHRpcCIvPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5PcGVuTGlicmFyeUFjdGlvbiIKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9ImZpbGVfb3Blbl9saWJyYXJ5X2NvbnRleHQiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5PcGVuTGlicmFyeUFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlb3BlbkxpYnJhcnlBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iZmlsZS9vcGVuLmV4dC9ncm91cG0xIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJW9wZW5MaWJyYXJ5QWN0aW9uVG9vbHRpcCIvPgotICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbGVOZXdFeHRSTUMiCi0gICAgICAgICAgICAgICBsYWJlbD0iRmlsZU5ld0V4dFJNQyIKLSAgICAgICAgICAgICAgIHBhdGg9ImZpbGUvbmV3LmV4dCI+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yIG5hbWU9Imdyb3VwbTEiLz4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IgbmFtZT0iZ3JvdXBtMiIvPgotICAgICAgICAgPC9tZW51PgotICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbGVPcGVuRXh0Uk1DIgotICAgICAgICAgICAgICAgbGFiZWw9IkZpbGVPcGVuRXh0Uk1DIgotICAgICAgICAgICAgICAgcGF0aD0iZmlsZS9vcGVuLmV4dCI+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yIG5hbWU9Imdyb3VwbTEiLz4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IgbmFtZT0iZ3JvdXBtMiIvPgotICAgICAgICAgPC9tZW51PgotICAgICAgPC9hY3Rpb25TZXQ+Ci0gICA8L2V4dGVuc2lvbj4KLS0tPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5wcm9wZXJ0eUNvbnRyaWJ1dG9yIj4KLSAgICAgIDxwcm9wZXJ0eUNvbnRyaWJ1dG9yCi0gICAgICAgICAgICB0eXBlTWFwcGVyPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRWxlbWVudFR5cGVNYXBwZXIiCi0gICAgICAgICAgICBjb250cmlidXRvcklkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvciIKLSAgICAgICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5FbGVtZW50TGFiZWxQcm92aWRlciI+Ci0gICAgICAgICA8cHJvcGVydHlDYXRlZ29yeSBjYXRlZ29yeT0iZWxlbWVudCIvPgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkgY2F0ZWdvcnk9Im90aGVyIi8+Ci0gICAgICA8L3Byb3BlcnR5Q29udHJpYnV0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQucHJvcGVydHlUYWJzIj4KLSAgICAgIDxwcm9wZXJ0eVRhYnMKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9ySWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yIj4KLSAgICAgICAgIDwhLS0gU1RBUlQgR0VORVJBTCAtLT4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19HZW5lcmFsIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuQnJlYWtkb3duRWxlbWVudC5HZW5lcmFsIi8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfR2VuZXJhbCIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLldvcmtCcmVha2Rvd25FbGVtZW50LkdlbmVyYWwiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19HZW5lcmFsIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuR2VuZXJhbCIvPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX0dlbmVyYWwiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5UYXNrRGVzY3JpcHRvci5HZW5lcmFsIi8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfR2VuZXJhbCIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLlJvbGVEZXNjcmlwdG9yLkdlbmVyYWwiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19HZW5lcmFsIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuV29ya1Byb2R1Y3REZXNjcmlwdG9yLkdlbmVyYWwiLz4KLQkJIDwhLS0gRU5EIEdFTkVSQUwtLT4KLSAgICAgICAgIAotICAgICAgICAgPCEtLSBTVEFSVCBET0NVTUVOVEFUSU9OIC0tPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX0RvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5CcmVha2Rvd25FbGVtZW50LkRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBhZnRlclRhYj0icHJvcGVydGllcy50YWIuQnJlYWtkb3duRWxlbWVudC5HZW5lcmFsIi8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfRG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5LkRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBhZnRlclRhYj0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuR2VuZXJhbCIvPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX0RvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5EZXNjcmlwdG9yLkRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBhZnRlclRhYj0icHJvcGVydGllcy50YWIuVGFza0Rlc2NyaXB0b3IuR2VuZXJhbCIvPgotCQkgPCEtLSBFTkQgRE9DVU1FTlRBVElPTiAtLT4KLQkJCi0JCSA8IS0tIEFDVElWSVRZIC0tPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX0d1aWRhbmNlIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBhZnRlclRhYj0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuRG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5HdWlkYW5jZSIvPiAgCi0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfV29ya19Sb2xsdXAiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5HdWlkYW5jZSIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5Xb3JrUm9sbHVwIi8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfVGVhbV9Sb2xsdXAiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5Xb3JrUm9sbHVwIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5LlRlYW1Sb2xsdXAiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19XUF9Sb2xsdXAiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5UZWFtUm9sbHVwIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5LldvcmtQcm9kdWN0c1JvbGx1cCIvPgotICAgICAgICAKLSAgICAgICAgIDwhLS0gVEFTSyBERVNDUklQVE9SIC0tPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX1JvbGVzIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBhZnRlclRhYj0icHJvcGVydGllcy50YWIuRGVzY3JpcHRvci5Eb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yLlJvbGUiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19Xb3JrUHJvZHVjdHMiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5UYXNrRGVzY3JpcHRvci5Sb2xlIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yLldvcmtQcm9kdWN0Ii8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfU3RlcHMiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5UYXNrRGVzY3JpcHRvciBSZWxhdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5UYXNrRGVzY3JpcHRvci5TdGVwIi8+Ci0gICAgICAgICAKLSAgICAgICAgIDwhLS0gUk9MRSBERVNDUklQVE9SIC0tPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX1dvcmtQcm9kdWN0cyIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLlJvbGVEZXNjcmlwdG9yLlRhc2siCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuUm9sZURlc2NyaXB0b3IuV29ya1Byb2R1Y3QiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19UZWFtcyIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLlJvbGVEZXNjcmlwdG9yLldvcmtQcm9kdWN0IgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLlJvbGVEZXNjcmlwdG9yLlRlYW0iLz4KLSAgICAgICAgIAotICAgICAgICAgPCEtLSBURUFNIFBST0ZJTEUgLS0+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfUm9sZXMiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5UZWFtUHJvZmlsZS5Eb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLlRlYW1Qcm9maWxlLlJvbGUiLz4KLSAgICAgICAgIAotICAgICAgICAgPCEtLSBDT01QT1NJVEUgUk9MRSAtLT4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19Sb2xlcyIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLlJvbGVEZXNjcmlwdG9yLlRlYW0iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuQ29tcG9zaXRlUm9sZS5Sb2xlIi8+Ci0gICAgICA8L3Byb3BlcnR5VGFicz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5wcm9wZXJ0eVNlY3Rpb25zIj4KLSAgICAgIDxwcm9wZXJ0eVNlY3Rpb25zCi0gICAgICAgICAgICBjb250cmlidXRvcklkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvciI+Ci0gICAgICAgICA8IS0tIFNUQVJUIEdFTkVSQUwgU0VDVElPTiAtLT4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuR2VuZXJhbCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlHZW5lcmFsU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uQWN0aXZpdHkuR2VuZXJhbCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5UYXNrRGVzY3JpcHRvci5HZW5lcmFsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5UYXNrRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5UYXNrRGVzY3JpcHRvci5HZW5lcmFsIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+IAotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Sb2xlRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5Sb2xlRGVzY3JpcHRvci5HZW5lcmFsIgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5Sb2xlRGVzY3JpcHRvci5HZW5lcmFsIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtQcm9kdWN0RGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5Xb3JrUHJvZHVjdERlc2NyaXB0b3IuR2VuZXJhbCIKLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuV29ya1Byb2R1Y3REZXNjcmlwdG9yLkdlbmVyYWwiPiAgICAgIAotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPiAgICAgICAKLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuV29ya0JyZWFrZG93bkVsZW1lbnQuR2VuZXJhbCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uV29ya0JyZWFrZG93bkVsZW1lbnQuR2VuZXJhbCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmUiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuTWlsZXN0b25lV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLkJyZWFrZG93bkVsZW1lbnQuR2VuZXJhbCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5CcmVha2Rvd25FbGVtZW50LkdlbmVyYWwiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgICAgICAgIDwhLS0gRU5EIEdFTkVSQUwgU0VDVElPTiAtLT4KLSAgICAgICAgCi0gICAgICAgICA8IS0tIFNUQVJUIERPQ1VNRU5UQVRJT04gU0VDVElPTiAtLT4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuRG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlEb2N1bWVudFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLkFjdGl2aXR5LkRvY3VtZW50YXRpb24iPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuRGVzY3JpcHRvci5Eb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yRG9jdW1lbnRTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5EZXNjcmlwdG9yLkRvY3VtZW50YXRpb24iPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvciIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPiAKLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuQnJlYWtkb3duRWxlbWVudC5Eb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5NaWxlc3RvbmVEb2N1bWVudFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLkJyZWFrZG93bkVsZW1lbnQuRG9jdW1lbnQiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5NaWxlc3RvbmVXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+ICAgICAgIAotICAgICAgICAgPCEtLSBFTkQgRE9DVU1FTlRBVElPTiBTRUNUSU9OIC0tPgotICAgICAgCi0gICAgICAgICA8IS0tIEFDVElWSVRZIC0tPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5HdWlkYW5jZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlHdWlkYW5jZVNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLkFjdGl2aXR5Lkd1aWRhbmNlIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5LldvcmtSb2xsdXAiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFjdGl2aXR5V29ya1JvbGx1cFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLkFjdGl2aXR5LldvcmtSb2xsdXAiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuVGVhbVJvbGx1cCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlUZWFtUm9sbHVwU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uQWN0aXZpdHkuVGVhbVJvbGx1cCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5Xb3JrUHJvZHVjdHNSb2xsdXAiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFjdGl2aXR5V29ya1Byb2R1Y3RzUm9sbHVwU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uQWN0aXZpdHkuV29ya1Byb2R1Y3RzUm9sbHVwIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gICAgICAgICA8IS0tIEVORCBBQ1RJVklUWSAtLT4KLSAgICAgICAgIAotICAgICAgICAgPCEtLSBTZWN0aW9ucyBmb3IgVGFza0Rlc2NyaXB0b3IgLS0+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yLlJvbGUiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlRhc2tEZXNjcmlwdG9yUm9sZVNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLlRhc2tEZXNjcmlwdG9yLlJvbGUiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4gIAotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5UYXNrRGVzY3JpcHRvci5Xb3JrUHJvZHVjdCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuVGFza0Rlc2NyaXB0b3JXb3JrUHJvZHVjdFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLlRhc2tEZXNjcmlwdG9yLldvcmtQcm9kdWN0Ij4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+IAotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5UYXNrRGVzY3JpcHRvci5TdGVwIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5UYXNrRGVzY3JpcHRvclN0ZXBTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5UYXNrRGVzY3JpcHRvci5TdGVwIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+IAotICAgICAgICAgCi0gICAgICAgICA8IS0tIFNlY3Rpb25zIGZvciBSb2xlRGVzY3JpcHRvciAtLT4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuUm9sZURlc2NyaXB0b3IuV29ya1Byb2R1Y3QiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJvbGVEZXNjcmlwdG9yV29ya1Byb2R1Y3RTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5Sb2xlRGVzY3JpcHRvci5Xb3JrUHJvZHVjdCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPiAgCi0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLlJvbGVEZXNjcmlwdG9yLlRlYW0iCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJvbGVEZXNjcmlwdG9yVGVhbVNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLlJvbGVEZXNjcmlwdG9yLlRlYW0iPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4gCi0gICAgICAKLQotICAgICAgICAgPCEtLSBTZWN0aW9uIGZvciBUZWFtUHJvZmlsZSAtLT4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuVGVhbVByb2ZpbGUuUm9sZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuVGVhbVByb2ZpbGVSb2xlU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uVGVhbVByb2ZpbGUuUm9sZSI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UZWFtUHJvZmlsZVdyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPiAKLSAgICAgICAgIAotICAgICAgICAgPCEtLSBTZWN0aW9uIGZvciBDb21wb3NpdGVSb2xlIC0tPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5Db21wb3NpdGVSb2xlLlJvbGUiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkNvbXBvc2l0ZVJvbGVSb2xlU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uQ29tcG9zaXRlUm9sZS5Sb2xlIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGUiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQ29tcG9zaXRlUm9sZVdyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPgotICAgICAgPC9wcm9wZXJ0eVNlY3Rpb25zPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuUm9vdFByZWZQYWdlIgotICAgICAgICAgICAgbmFtZT0iJW1ldGhvZEF1dGhvcmluZ1BhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5yb290cHJlZnBhZ2UiLz4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5yb290cHJlZnBhZ2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBuYW1lPSIlcHJvY2Vzc0VkaXRvciIvPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLnJvb3RwcmVmcGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkxpYnJhcnlQcmVmUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLmxpYnJhcnlwcmVmcGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVsaWJyYXJ5T3B0aW9ucyIvPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLnJvb3RwcmVmcGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkRpYWdyYW1QcmVmUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkRpYWdyYW1QcmVmUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVkaWFncmFtIi8+Ci0gICAgIDxwYWdlCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5yb290cHJlZnBhZ2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5EaWFncmFtUHJlZlBhZ2UxIgotICAgICAgICAgICAgbmFtZT0iTmV3IERpYWdyYW0iLz4gICAgICAgCi0gICAgICA8cGFnZSAKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLnJvb3RwcmVmcGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLlN0YXJ0dXBQcmVmUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLnN0YXJ0dXBQcmVmUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVzdGFydHVwQW5kU2h1dGRvd24iLz4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5yb290cHJlZnBhZ2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5EZWJ1Z1ByZWZQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuRGVidWdQcmVmUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVkZWJ1ZyIvPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLnJvb3RwcmVmcGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLk1vZGVsaW5nT3B0aW9uc1ByZWZQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuTW9kZWxpbmdPcHRpb25zUHJlZlBhZ2UiCi0gICAgICAgICAgICBuYW1lPSIlbW9kZWxpbmdPcHRpb25zIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLSAgICAgIDxpbml0aWFsaXplcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuTGlicmFyeVByZWZlcmVuY2VJbml0aWFsaXplciIvPgotICAgICAgPGluaXRpYWxpemVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BdXRob3JpbmdQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3QWN0aW9ucyI+Ci0gICAgICA8dmlld0NvbnRyaWJ1dGlvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld0NvbnRyaWJ1dGlvbi5yZWZyZXNoQ29uZmlndXJhdGlvbiIKLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuUmVmcmVzaENvbmZpZ3VyYXRpb24iCi0gICAgICAgICAgICAgICBkaXNhYmxlZEljb249Imljb25zL2Z1bGwvZXRvb2wxNi9SZWZyZXNoLmdpZiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IisiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvUmVmcmVzaC5naWYiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLnJlZnJlc2giCi0gICAgICAgICAgICAgICBsYWJlbD0iJXJlZnJlc2hDb25maWciCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sYmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJXJlZnJlc2hDb25maWdUb29sdGlwIi8+Ci0gICAgICA8L3ZpZXdDb250cmlidXRpb24+Ci0gICAgICA8dmlld0NvbnRyaWJ1dGlvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld0NvbnRyaWJ1dGlvbi5saW5rV2l0aEVkaXRvciIKLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlua1dpdGhFZGl0b3IiCi0gICAgICAgICAgICAgICBkaXNhYmxlZEljb249Imljb25zL2Z1bGwvZXRvb2wxNi9zeW5jZWQuZ2lmIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L3N5bmNlZC5naWYiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLmxpbmtXaXRoRWRpdG9yIgotICAgICAgICAgICAgICAgbGFiZWw9IiVsaW5rV2l0aEVkaXRvciIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdHlsZT0idG9nZ2xlIgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVsaW5rV2l0aEVkaXRvclRvb2x0aXAiLz4KLSAgICAgIDwvdmlld0NvbnRyaWJ1dGlvbj4KLSAgICAgIDx2aWV3Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3Q29udHJpYnV0aW9uLnNob3dQcmVzTmFtZXMiCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLlNob3dQcmVzZW50YXRpb25OYW1lcyIKLSAgICAgICAgICAgICAgIGRpc2FibGVkSWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L1ByZXNfbmFtZV90b2dnbGUuZ2lmIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L1ByZXNfbmFtZV90b2dnbGUuZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5zaG93UHJlc05hbWVzIgotICAgICAgICAgICAgICAgbGFiZWw9IiVzaG93UHJlc2VudGF0aW9uTmFtZXMiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3R5bGU9InRvZ2dsZSIKLSAgICAgICAgICAgICAgIHRvb2xiYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlc2hvd1ByZXNlbnRhdGlvbk5hbWVzVG9vbHRpcCIvPgotICAgICAgPC92aWV3Q29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmJpbmRpbmdzIj4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZWRpdC5zZWxlY3RBbGwiCi0gICAgICAgICAgICBjb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLndpaW5kb3ciCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJDdHJsK0EiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLSAgICAgICAgICAgIGRlZmF1bHRIYW5kbGVyPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5oYW5kbGVycy5TZWxlY3RBbGxIYW5kbGVyIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVzZWxlY3RBbGwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZWRpdC5zZWxlY3RBbGwiCi0gICAgICAgICAgICBuYW1lPSJzZWxlY3RBbGwiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRzIj4KLSAgICAgIDxhY3Rpb25TZXQKLSAgICAgICAgICAgIGxhYmVsPSIlY2hlYXRTaGVldHNBY3Rpb25TZXQiCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLmFjdGlvblNldCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICBsYWJlbD0iJW9wZW5DaGVhdFNoZWV0cyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jaGVhdHNoZWV0cy5hY3Rpb25zLkNoZWF0U2hlZXRIZWxwTWVudUFjdGlvbiIKLSAgICAgICAgICAgIG1lbnViYXJQYXRoPSJoZWxwL2dyb3VwLmFzc2lzdCIgaWQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLmFjdGlvbnMuQ2hlYXRTaGVldEhlbHBNZW51QWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9hY3Rpb25TZXQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pZGUubWFya2VyUmVzb2x1dGlvbiI+Ci0gICAgICA8bWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmRlY29yYXRvcnMiPgotICAgICAgPGRlY29yYXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLk1ldGhvZEVsZW1lbnRMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLk1ldGhvZEVsZW1lbnRMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yIgotICAgICAgICAgICAgbGFiZWw9Ik1ldGhvZCBFbGVtZW50IExpZ2h0d2VpZ2h0IExhYmVsIERlY29yYXRvciIKLSAgICAgICAgICAgIGxpZ2h0d2VpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgbG9jYXRpb249IlRPUF9MRUZUIgotICAgICAgICAgICAgc3RhdGU9InRydWUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbiBpZD0ibWV0aG9kUmljaFRleHQiIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIiBuYW1lPSIlUmljaFRleHRNYXJrZXJUeXBlTmFtZSI+IAotICAgICAgPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4gCi0gICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvYmxlbW1hcmtlciIvPiAKLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3duZXIiLz4gCi0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9Qcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL1Byb2Nlc3NFZGl0b3JQYWdlUHJvdmlkZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODJlNjE2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL1Byb2Nlc3NFZGl0b3JQYWdlUHJvdmlkZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIiBpZD0iUHJvY2Vzc0VkaXRvclBhZ2VQcm92aWRlciIgbmFtZT0iUHJvY2VzcyBFZGl0b3IgUGFnZSBQcm92aWRlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZWRpdG9yUGFnZSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJlZGl0b3JQYWdlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuSUV4dGVuc2lvbkZvcm1QYWdlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3ByZSZndDsKLSAmbHQ7ZXh0ZW5zaW9uCi0gIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuUHJvY2Vzc0VkaXRvclBhZ2VQcm92aWRlciZxdW90OyZndDsKLSAgJmx0O2VkaXRvclBhZ2UKLSAgIGlkPSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuUHJvY2Vzc0VzdGltYXRpb25QYWdlJnF1b3Q7Ci0gICBuYW1lPSZxdW90O0VzdGltYXRpb24mcXVvdDsKLSAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0VzdGltYXRpb25QYWdlJnF1b3Q7Jmd0OwotICAmbHQ7L2VkaXRvclBhZ2UmZ3Q7Ci0gJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9UYXNrRWRpdG9yUGFnZVByb3ZpZGVyLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL1Rhc2tFZGl0b3JQYWdlUHJvdmlkZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTk5NGE0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL1Rhc2tFZGl0b3JQYWdlUHJvdmlkZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIiBpZD0iRWRpdG9yUGFnZVByb3ZpZGVyIiBuYW1lPSJFZGl0b3IgUGFnZSBQcm92aWRlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBlbmFibGVzIGEgcGx1Zy1pbiB0byByZWdpc3RlciBvbmUgb3IgbW9yZSBwYWdlcyBpbiBhdXRob3JpbmcgZWRpdG9yLiBUaG91Z2ggdGhpcyBwYWdlIHdpbGwgb25seSBiZSBhZGRlZCBmb3IgbWV0aG9kIGVsZW1lbnQgdHlwZSAmcXVvdDt0YXNrJnF1b3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlZGl0b3JQYWdlIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImVkaXRvclBhZ2UiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5JRXh0ZW5zaW9uRm9ybVBhZ2UiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwcmUmZ3Q7Ci0gJmx0O2V4dGVuc2lvbgotICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlRhc2tFZGl0b3JQYWdlUHJvdmlkZXImcXVvdDsmZ3Q7Ci0gICZsdDtlZGl0b3JQYWdlCi0gICBpZD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlRhc2tFc3RpbWF0aW9uUGFnZSZxdW90OwotICAgbmFtZT0mcXVvdDtFc3RpbWF0aW9uJnF1b3Q7Ci0gICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlRhc2tFc3RpbWF0aW9uUGFnZSZxdW90OyZndDsKLSAgJmx0Oy9lZGl0b3JQYWdlJmd0OwotICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlQm91bmRzQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VCb3VuZHNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0ZDA4ZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VCb3VuZHNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENoYW5nZUJvdW5kc0NvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTm9kZSBub2RlOwotCi0JcHJpdmF0ZSBQb2ludCBuZXdMb2NhdGlvbiwgb2xkTG9jYXRpb247Ci0KLQlwcml2YXRlIGludCBuZXdXaWR0aCwgb2xkV2lkdGg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfY2hhbmdlQm91bmRzQ29tbWFuZF9sYWJlbDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIENoYW5nZUJvdW5kc0NvbW1hbmQoTm9kZSBub2RlLCBQb2ludCBuZXdMb2NhdGlvbiwgaW50IG5ld1dpZHRoKSB7Ci0JCXN1cGVyKENoYW5nZUJvdW5kc0NvbW1hbmQuTEFCRUwpOwotCQlzZXROb2RlKG5vZGUpOwotCQlzZXROZXdMb2NhdGlvbihuZXdMb2NhdGlvbi5nZXRDb3B5KCkpOwotCQl0aGlzLm5ld1dpZHRoID0gbmV3V2lkdGg7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIG5vZGUgIT0gbnVsbAotCQkJCSYmIG5ld0xvY2F0aW9uICE9IG51bGwKLQkJCQkmJiAobmV3V2lkdGggIT0gb2xkV2lkdGggfHwgIShub2RlLmdldExvY2F0aW9uKCkKLQkJCQkJCS5lcXVhbHMobmV3TG9jYXRpb24pKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkTG9jYXRpb24gPSBub2RlLmdldExvY2F0aW9uKCk7Ci0JCW9sZFdpZHRoID0gbm9kZS5nZXRXaWR0aCgpOwotCQlyZWRvKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJbm9kZS5zZXRMb2NhdGlvbihuZXdMb2NhdGlvbik7Ci0JCW5vZGUuc2V0V2lkdGgobmV3V2lkdGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vZGUoTm9kZSBub2RlKSB7Ci0JCXRoaXMubm9kZSA9IG5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmV3TG9jYXRpb24oUG9pbnQgbG9jKSB7Ci0JCW5ld0xvY2F0aW9uID0gbG9jOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCW5vZGUuc2V0V2lkdGgob2xkV2lkdGgpOwotCQlub2RlLnNldExvY2F0aW9uKG9sZExvY2F0aW9uKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NoYW5nZUhlaWdodENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlSGVpZ2h0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOGQ0OTU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlSGVpZ2h0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQ29tbWFuZCB0byBoYW5kbGUgTm9kZSdzIGhlaWdodCBjaGFuZ2VzLgotICogQ2hhbmdlQm91bmRzQ29tbWFuZCBoYW5kbGVzIE5vZGUncyB3aWR0aCBjaGFuZ2VzLiAKLSAqLwotcHVibGljIGNsYXNzIENoYW5nZUhlaWdodENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTm9kZSBub2RlOwotCi0JcHJpdmF0ZSBQb2ludCBuZXdMb2NhdGlvbiwgb2xkTG9jYXRpb247Ci0KLQlwcml2YXRlIGludCBuZXdIZWlnaHQsIG9sZEhlaWdodDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJDaGFuZ2UgSGVpZ2h0IENvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgQ2hhbmdlSGVpZ2h0Q29tbWFuZChOb2RlIG5vZGUsIFBvaW50IG5ld0xvY2F0aW9uLCBpbnQgbmV3SGVpZ2h0KSB7Ci0JCXN1cGVyKENoYW5nZUhlaWdodENvbW1hbmQuTEFCRUwpOwotCQlzZXROb2RlKG5vZGUpOwotCQlzZXROZXdMb2NhdGlvbihuZXdMb2NhdGlvbi5nZXRDb3B5KCkpOwotCQl0aGlzLm5ld0hlaWdodCA9IG5ld0hlaWdodDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gbm9kZSAhPSBudWxsCi0JCQkJJiYgbmV3TG9jYXRpb24gIT0gbnVsbAotCQkJCSYmIChuZXdIZWlnaHQgIT0gb2xkSGVpZ2h0IHx8ICEobm9kZS5nZXRMb2NhdGlvbigpCi0JCQkJCQkuZXF1YWxzKG5ld0xvY2F0aW9uKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZExvY2F0aW9uID0gbm9kZS5nZXRMb2NhdGlvbigpOwotCQlvbGRIZWlnaHQgPSBub2RlLmdldEhlaWdodCgpOwotCQlyZWRvKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJbm9kZS5zZXRMb2NhdGlvbihuZXdMb2NhdGlvbik7Ci0JCW5vZGUuc2V0SGVpZ2h0KG5ld0hlaWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm9kZShOb2RlIG5vZGUpIHsKLQkJdGhpcy5ub2RlID0gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXdMb2NhdGlvbihQb2ludCBsb2MpIHsKLQkJbmV3TG9jYXRpb24gPSBsb2M7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJbm9kZS5zZXRIZWlnaHQob2xkSGVpZ2h0KTsKLQkJbm9kZS5zZXRMb2NhdGlvbihvbGRMb2NhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VOYW1lQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VOYW1lQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZDVlNzY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlTmFtZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5OYW1lZE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VOYW1lQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBOYW1lZE5vZGUgZWxlbWVudDsKLQotCXByaXZhdGUgU3RyaW5nIG5ld05hbWUsIG9sZE5hbWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfY2hhbmdlTmFtZUNvbW1hbmRfbGFiZWw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVORE9fTUVTU0FHRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl9jaGFuZ2VOYW1lQ29tbWFuZF91bmRvTWVzc2FnZTsKLQotCXB1YmxpYyBDaGFuZ2VOYW1lQ29tbWFuZChOYW1lZE5vZGUgZWxlbSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQllbGVtZW50ID0gZWxlbTsKLQkJb2xkTmFtZSA9IGVsZW0uZ2V0TmFtZSgpOwotCQl0aGlzLm5ld05hbWUgPSBuZXdOYW1lLnRyaW0oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWVsZW1lbnQuc2V0TmFtZShuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoIVN0clV0aWwuaXNCbGFuayhvbGROYW1lKSkgewotCQkJZWxlbWVudC5zZXROYW1lKG9sZE5hbWUpOwotCQl9IGVsc2UgewotCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBQcm9tcHRFZGl0KG51bGwsIFVORE9fTUVTU0FHRSkpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFByb21wdEVkaXQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCQotCQlwcml2YXRlIFN0cmluZyBtc2c7Ci0KLQkJUHJvbXB0RWRpdChOYW1lZE5vZGVFZGl0UGFydCBwYXJ0LCBTdHJpbmcgbXNnKSB7Ci0JCQl0aGlzLm1zZyA9IG1zZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMud2FybmluZ0RpYWxvZ190aXRsZTsKLQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csICIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg3ZWRlNzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIE5vZGUgZWxlbWVudDsKLQotCXByaXZhdGUgTm9kZUVkaXRQYXJ0IHBhcnQ7Ci0KLQlwcml2YXRlIFN0cmluZyBuZXdOYW1lLCBvbGROYW1lOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX2NoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kX2xhYmVsOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQoTm9kZUVkaXRQYXJ0IGVsZW0sIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJcGFydCA9IGVsZW07Ci0JCWVsZW1lbnQgPSAoTm9kZSkgZWxlbS5nZXRNb2RlbCgpOwotCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gZWxlbWVudC5nZXRHcmFwaE5vZGUoKTsKLQkJTGlzdCBsaXN0ID0gZ3JhcGhOb2RlLmdldFByb3BlcnR5KCk7Ci0JCW9sZE5hbWUgPSAoKFByb3BlcnR5KSBsaXN0LmdldCgwKSkuZ2V0VmFsdWUoKTsKLQkJdGhpcy5uZXdOYW1lID0gbmV3TmFtZS50cmltKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkoKFByb3BlcnR5KSBlbGVtZW50LmdldEdyYXBoTm9kZSgpLmdldFByb3BlcnR5KCkuZ2V0KDApKQotCQkJCS5zZXRWYWx1ZShuZXdOYW1lKTsKLQkJcGFydC5yZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJKChQcm9wZXJ0eSkgZWxlbWVudC5nZXRHcmFwaE5vZGUoKS5nZXRQcm9wZXJ0eSgpLmdldCgwKSkKLQkJCQkuc2V0VmFsdWUob2xkTmFtZSk7Ci0JCXBhcnQucmVmcmVzaCgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ3JlYXRlQmVuZHBvaW50Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DcmVhdGVCZW5kcG9pbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNkZDA4M2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DcmVhdGVCZW5kcG9pbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQmVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZUJlbmRwb2ludENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTGluayBsaW5rOwotCi0JcHJpdmF0ZSBCZW5kcG9pbnQgcG9pbnQ7Ci0KLQlwcml2YXRlIGludCBpbmRleCA9IC0xOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX2NyZWF0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBDcmVhdGVCZW5kcG9pbnRDb21tYW5kKExpbmsgbGluaywgUG9pbnQgbG9jYXRpb24sIGludCBpbmRleCkgewotCQlzdXBlcihMQUJFTCk7Ci0JCXRoaXMubGluayA9IGxpbms7Ci0JCXBvaW50ID0gbmV3IEFic29sdXRlQmVuZHBvaW50KGxvY2F0aW9uKTsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBsaW5rICE9IG51bGwgJiYgcG9pbnQgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlsaW5rLmdldEJlbmRwb2ludHMoKS5hZGQoaW5kZXgsIHBvaW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlsaW5rLmdldEJlbmRwb2ludHMoKS5yZW1vdmUoaW5kZXgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ3JlYXRlTGlua0NvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ3JlYXRlTGlua0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTdjNzgyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NyZWF0ZUxpbmtDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTGlua0NvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTGluayBsaW5rOwotCi0JcHJpdmF0ZSBOb2RlIHNvdXJjZSwgdGFyZ2V0OwotCi0JcHJpdmF0ZSBQb2ludCB0YXJnZXRFbmRQb2ludDsKLQotCXByaXZhdGUgUG9pbnQgc291cmNlRW5kUG9pbnQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfY3JlYXRlTGlua0NvbW1hbmRfbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBDcmVhdGVMaW5rQ29tbWFuZChMaW5rIG5ld09iaiwgTm9kZSBzcmMpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQlsaW5rID0gbmV3T2JqOwotCQlzb3VyY2UgPSBzcmM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzb3VyY2UgIT0gbnVsbCAmJiB0YXJnZXQgIT0gbnVsbCAmJiBsaW5rICE9IG51bGw7Ci0JCWlmICghcmVzdWx0KQotCQkJcmV0dXJuIHJlc3VsdDsKLQotCQlTdHJpbmcgbXNnID0gVmFsaWRhdGlvbi5jaGVja0Nvbm5lY3Qoc291cmNlLCB0YXJnZXQsIGxpbmspOwotCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlpZiAoc291cmNlID09IHRhcmdldCkgewotCQkJbGluay5nZXRCZW5kcG9pbnRzKCkuYWRkKAotCQkJCQluZXcgQWJzb2x1dGVCZW5kcG9pbnQoc291cmNlLmdldExvY2F0aW9uKCkuZ2V0VHJhbnNsYXRlZCgKLQkJCQkJCQktMTAsIDEwKSkpOwotCQkJbGluay5nZXRCZW5kcG9pbnRzKCkuYWRkKAotCQkJCQluZXcgQWJzb2x1dGVCZW5kcG9pbnQoc291cmNlLmdldExvY2F0aW9uKCkuZ2V0VHJhbnNsYXRlZCgKLQkJCQkJCQktMTAsIC0xMCkpKTsKLQkJCWxpbmsuZ2V0QmVuZHBvaW50cygpLmFkZCgKLQkJCQkJbmV3IEFic29sdXRlQmVuZHBvaW50KHNvdXJjZS5nZXRMb2NhdGlvbigpLmdldFRyYW5zbGF0ZWQoCi0JCQkJCQkJMTAsIC0xMCkpKTsKLQkJfQotCi0JCWxpbmsuc2V0VGFyZ2V0RW5kUG9pbnQodGFyZ2V0RW5kUG9pbnQpOwotCQlsaW5rLnNldFNvdXJjZUVuZFBvaW50KHNvdXJjZUVuZFBvaW50KTsKLQkJbGluay5zZXRTb3VyY2Uoc291cmNlKTsKLQkJbGluay5zZXRUYXJnZXQodGFyZ2V0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm9kZSB0YXJnZXQpIHsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RW5kUG9pbnQoUG9pbnQgcCkgewotCQl0YXJnZXRFbmRQb2ludCA9IHA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U291cmNlRW5kUG9pbnQoUG9pbnQgcCkgewotCQlzb3VyY2VFbmRQb2ludCA9IHA7Ci0JfQotCi0JcHVibGljIFBvaW50IGdldFRhcmdldEVuZFBvaW50KCkgewotCQlyZXR1cm4gdGFyZ2V0RW5kUG9pbnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBzb3VyY2VFbmRQb2ludC4KLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0U291cmNlRW5kUG9pbnQoKSB7Ci0JCXJldHVybiBzb3VyY2VFbmRQb2ludDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlsaW5rLnNldFNvdXJjZUVuZFBvaW50KG51bGwpOwotCQlsaW5rLnNldFRhcmdldEVuZFBvaW50KG51bGwpOwotCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCWlmIChzb3VyY2UgPT0gdGFyZ2V0KSB7Ci0JCQlsaW5rLmdldEJlbmRwb2ludHMoKS5jbGVhcigpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DcmVhdGVOb2RlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DcmVhdGVOb2RlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZjViNDQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ3JlYXRlTm9kZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTm9kZUNvbW1hbmQgZXh0ZW5kcyBEaWFncmFtTW9kaWZ5Q29tbWFuZCB7Ci0KLQlwcml2YXRlIFBvaW50IGxvYzsKLQotCXByaXZhdGUgTm9kZSBub2RlOwotCi0JcHJpdmF0ZSBEaWFncmFtIGRpYWdyYW07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfY3JlYXRlTm9kZUNvbW1hbmRfbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBDcmVhdGVOb2RlQ29tbWFuZChOb2RlIG5ld09iamVjdCwgRGlhZ3JhbSBwYXJlbnQsIFBvaW50IGxvY2F0aW9uKSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJbm9kZSA9IG5ld09iamVjdDsKLQkJZGlhZ3JhbSA9IHBhcmVudDsKLQkJbG9jID0gbG9jYXRpb24uZ2V0Q29weSgpOwotCQlzZXREaWFncmFtKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJbm9kZS5zZXRMb2NhdGlvbihudWxsKTsKLQkJbm9kZS5zZXREaWFncmFtKG51bGwpOwotCQlkaWFncmFtLmdldE5vZGVzKCkucmVtb3ZlKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuRGlhZ3JhbU1vZGlmeUNvbW1hbmQjZG9FeGVjdXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCW5vZGUuc2V0TG9jYXRpb24obG9jKTsKLQkJbm9kZS5zZXREaWFncmFtKGRpYWdyYW0pOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJZGlhZ3JhbS5zZXREZWZhdWx0TmFtZSgoTmFtZWROb2RlKSBub2RlKTsKLQkJfQotCQlkaWFncmFtLmdldE5vZGVzKCkuYWRkKG5vZGUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCWlmIChkaWFncmFtIGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJaWYgKGRpYWdyYW0uaXNSZWFkT25seSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5jYW5FeGVjdXRlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EZWxldGVCZW5kcG9pbnRDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0RlbGV0ZUJlbmRwb2ludENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDFmMTAyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0RlbGV0ZUJlbmRwb2ludENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZUJlbmRwb2ludENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTGluayBsaW5rOwotCi0JcHJpdmF0ZSBCZW5kcG9pbnQgYmVuZHBvaW50OwotCi0JcHJpdmF0ZSBpbnQgaW5kZXg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfZGVsZXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIERlbGV0ZUJlbmRwb2ludENvbW1hbmQoTGluayBsaW5rLCBpbnQgaW5kZXgpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQl0aGlzLmxpbmsgPSBsaW5rOwotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCWJlbmRwb2ludCA9IChCZW5kcG9pbnQpIGxpbmsuZ2V0QmVuZHBvaW50cygpLmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIGluZGV4ID49IDAgJiYgYmVuZHBvaW50ICE9IG51bGwgJiYgbGluayAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWxpbmsuZ2V0QmVuZHBvaW50cygpLnJlbW92ZShpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJbGluay5nZXRCZW5kcG9pbnRzKCkuYWRkKGluZGV4LCBiZW5kcG9pbnQpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvRGVsZXRlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EZWxldGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcxN2FjZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EZWxldGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIENvbW1hbmQgZGVsZWdhdGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfZGVsZXRlQ29tbWFuZF9sYWJlbDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BFUk1fREVMRVRFID0gImdlZi5lZGlhZ3JhbS4kcGVybSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBEZWxldGVDb21tYW5kKGJvb2xlYW4gaGFyZERlbGV0ZSkgewotCQlzdXBlcihMQUJFTCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIGRlbGVnYXRlICE9IG51bGwgJiYgZGVsZWdhdGUuY2FuRXhlY3V0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWRlbGVnYXRlLmV4ZWN1dGUoKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZCBzZXRQYXJ0VG9CZURlbGV0ZWQoT2JqZWN0IG1vZGVsKSB7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIE5vZGUpCi0JCQlkZWxlZ2F0ZSA9IG5ldyBEZWxldGVOb2RlQ29tbWFuZChtb2RlbCk7Ci0JCWVsc2UKLQkJCWRlbGVnYXRlID0gbnVsbDsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJZGVsZWdhdGUudW5kbygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIERlbGV0ZU5vZGVDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0JCXByb3RlY3RlZCBNYXAgaW5jb21pbmdDb25uZWN0aW9uc1RvU291cmNlOwotCi0JCXByb3RlY3RlZCBNYXAgb3V0Z29pbmdDb25uZWN0aW9uc1RvVGFyZ2V0OwotCi0JCXByb3RlY3RlZCBOb2RlQ29udGFpbmVyIGNvbnRhaW5lcjsKLQotCQlwcm90ZWN0ZWQgTm9kZSBub2RlOwotCi0JCXByb3RlY3RlZCBpbnQgaW5kZXg7Ci0KLQkJcHVibGljIERlbGV0ZU5vZGVDb21tYW5kKE9iamVjdCBub2RlKSB7Ci0JCQl0aGlzLm5vZGUgPSAoTm9kZSkgbm9kZTsKLQkJCWNvbnRhaW5lciA9IChOb2RlQ29udGFpbmVyKSB0aGlzLm5vZGUuZUNvbnRhaW5lcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCWluZGV4ID0gY29udGFpbmVyLmdldE5vZGVzKCkuaW5kZXhPZihub2RlKTsKLQkJCS8vIFRoZXJlJ3MgYWx3YXlzIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoaXMgbm9kZSBoYXMgYWxyZWFkeSBiZWVuCi0JCQkvLyBkZWxldGVkIGJ5IHRoZSB0aW1lIHRoaXMgY29tbWFuZCBpcyBleGVjdXRlZCAoZWcuLCB3aGVuIHRoZQotCQkJLy8gcGFja2FnZSBjb250YWluaW5nIHRoaXMgY2xhc3MgaXMgYWxzbyBzZWxlY3RlZCkuIEhlbmNlLCB3ZSBjaGVjawotCQkJLy8gdG8gc2VlIGlmIHRoZSBub2RlIGV4aXN0cyBpbiB0aGUgZGlhZ3JhbS4gSWYgbm90LCBkbyBub3RoaW5nLgotCQkJaWYgKGluZGV4ID09IC0xKQotCQkJCXJldHVybjsKLQkJCWluY29taW5nQ29ubmVjdGlvbnNUb1NvdXJjZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlvdXRnb2luZ0Nvbm5lY3Rpb25zVG9UYXJnZXQgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQlvdXRnb2luZ0Nvbm5lY3Rpb25zVG9UYXJnZXQucHV0KGxpbmssIGxpbmsuZ2V0VGFyZ2V0KCkpOwotCQkJCWxpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQlpbmNvbWluZ0Nvbm5lY3Rpb25zVG9Tb3VyY2UucHV0KGxpbmssIGxpbmsuZ2V0U291cmNlKCkpOwotCQkJCWxpbmsuc2V0U291cmNlKG51bGwpOwotCQkJfQotCQkJLy8gQ29tbWVudGluZyBiZWxvdyB0d28gbGluZXMsIExpbmtzIGdldCByZW1vdmVkIGZyb20gdGhlIG1vZGVsCi0JCQkvLyB3aGVuIGxpbmsuc2V0VGFyZ2V0KG51bGwpIG9yIGxpbmsuc2V0U291cmNlKG51bGwpIGlzIGRvbmUuICBGb3IgCi0JCQkvLyBOb2RlIGlmIHdlIGNsZWFyIGluY29taW5nL291dGdvaW5nIGNvbm5lY3Rpb25zLCBVbmRvIGNvbW1hbmQgd2lsbCBub3Qgd29yay4KLQkJCQotCQkJLy9ub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQkJLy9ub2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQkJY29udGFpbmVyLmdldE5vZGVzKCkucmVtb3ZlKGluZGV4KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCQlpZiAoaW5kZXggPT0gLTEpCi0JCQkJcmV0dXJuOwotCQkJY29udGFpbmVyLmdldE5vZGVzKCkuYWRkKGluZGV4LCBub2RlKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG91dGdvaW5nQ29ubmVjdGlvbnNUb1RhcmdldC5rZXlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCWxpbmsuc2V0VGFyZ2V0KChOb2RlKSBvdXRnb2luZ0Nvbm5lY3Rpb25zVG9UYXJnZXQuZ2V0KGxpbmspKTsKLQkJCQlsaW5rLnNldFNvdXJjZShub2RlKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGluY29taW5nQ29ubmVjdGlvbnNUb1NvdXJjZS5rZXlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCWxpbmsuc2V0VGFyZ2V0KG5vZGUpOwotCQkJCWxpbmsuc2V0U291cmNlKChOb2RlKSBpbmNvbWluZ0Nvbm5lY3Rpb25zVG9Tb3VyY2UuZ2V0KGxpbmspKTsKLQkJCX0KLQkJCW91dGdvaW5nQ29ubmVjdGlvbnNUb1RhcmdldCA9IG51bGw7Ci0JCQlpbmNvbWluZ0Nvbm5lY3Rpb25zVG9Tb3VyY2UgPSBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQjY2FuRXhlY3V0ZSgpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQkJaWYgKFZhbGlkYXRpb24uY2hlY2tEZWxldGUobm9kZSkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCQl9Ci0JfQotCS8qCi0JICogTm90IGluIHVzZS4gTmVlZCBtb2RpZmljYXRpb24gZm9yIGZ1dHVyZSBmZWF0dXJlIGltcGxlbWVudGF0aW9ucy4gCi0JICogQ29tcG91bmQgQ29tbWFuZCBkZWxldGlvbiBkbyB0aGUgcmVjdXJzaXZlIGRlbGV0aW9uIGFuZCB1bmRvLiAKLQkgKi8KLS8vCXByaXZhdGUgc3RhdGljIGNsYXNzIERlbGV0ZU5vZGVDb21wb3VuZENvbW1hbmQgZXh0ZW5kcyBDb21wb3VuZENvbW1hbmQgewotLy8JCXByb3RlY3RlZCBNYXAgaW5jb21pbmdDb25uZWN0aW9uc1RvU291cmNlOwotLy8KLS8vCQlwcm90ZWN0ZWQgTWFwIG91dGdvaW5nQ29ubmVjdGlvbnNUb1RhcmdldDsKLS8vCi0vLwkJcHJvdGVjdGVkIE5vZGVDb250YWluZXIgY29udGFpbmVyOwotLy8KLS8vCQlwcm90ZWN0ZWQgTm9kZSBub2RlOwotLy8KLS8vCQlwcm90ZWN0ZWQgaW50IGluZGV4OwotLy8KLS8vCQlwdWJsaWMgRGVsZXRlTm9kZUNvbXBvdW5kQ29tbWFuZChPYmplY3Qgbm9kZSkgewotLy8JCQl0aGlzLm5vZGUgPSAoTm9kZSkgbm9kZTsKLS8vCQkJY29udGFpbmVyID0gKE5vZGVDb250YWluZXIpIHRoaXMubm9kZS5lQ29udGFpbmVyKCk7Ci0vLwkJCWluY29taW5nQ29ubmVjdGlvbnNUb1NvdXJjZSA9IG5ldyBIYXNoTWFwKCk7Ci0vLwkJCW91dGdvaW5nQ29ubmVjdGlvbnNUb1RhcmdldCA9IG5ldyBIYXNoTWFwKCk7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMubm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotLy8JCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0vLwkJCQlvdXRnb2luZ0Nvbm5lY3Rpb25zVG9UYXJnZXQucHV0KGxpbmssIGxpbmsuZ2V0VGFyZ2V0KCkpOwotLy8JCQkJYWRkKG5ldyBEZWxldGVMaW5rQ29tbWFuZCggbGluaywgZmFsc2UpKTsKLS8vCQkJfQotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLm5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotLy8JCQkJaW5jb21pbmdDb25uZWN0aW9uc1RvU291cmNlLnB1dChsaW5rLCBsaW5rLmdldFNvdXJjZSgpKTsKLS8vCQkJCWFkZChuZXcgRGVsZXRlTGlua0NvbW1hbmQoIGxpbmssIGZhbHNlKSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0vLwkJCWluZGV4ID0gY29udGFpbmVyLmdldE5vZGVzKCkuaW5kZXhPZihub2RlKTsKLS8vCQkJLy8gVGhlcmUncyBhbHdheXMgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhpcyBub2RlIGhhcyBhbHJlYWR5IGJlZW4KLS8vCQkJLy8gZGVsZXRlZCBieSB0aGUgdGltZSB0aGlzIGNvbW1hbmQgaXMgZXhlY3V0ZWQgKGVnLiwgd2hlbiB0aGUKLS8vCQkJLy8gcGFja2FnZSBjb250YWluaW5nIHRoaXMgY2xhc3MgaXMgYWxzbyBzZWxlY3RlZCkuIEhlbmNlLCB3ZSBjaGVjawotLy8JCQkvLyB0byBzZWUgaWYgdGhlIG5vZGUgZXhpc3RzIGluIHRoZSBkaWFncmFtLiBJZiBub3QsIGRvIG5vdGhpbmcuCi0vLwkJCWlmIChpbmRleCA9PSAtMSkKLS8vCQkJCXJldHVybjsKLS8vCi0vLwkJCXN1cGVyLmV4ZWN1dGUoKTsKLS8vCQkJY29udGFpbmVyLmdldE5vZGVzKCkucmVtb3ZlKGluZGV4KTsKLS8vCQkJCi0vLwkJfQotLy8KLS8vCQlwdWJsaWMgdm9pZCB1bmRvKCkgewotLy8JCQlpZiAoaW5kZXggPT0gLTEpCi0vLwkJCQlyZXR1cm47Ci0vLwkJCWNvbnRhaW5lci5nZXROb2RlcygpLmFkZChpbmRleCwgbm9kZSk7Ci0vLwkJCXN1cGVyLnVuZG8oKTsKLS8vCQl9Ci0vLwotLy8JCS8qKgotLy8JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQjY2FuRXhlY3V0ZSgpCi0vLwkJICovCi0vLwkJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLS8vCQkJaWYgKFZhbGlkYXRpb24uY2hlY2tEZWxldGUobm9kZSkgIT0gbnVsbCkKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLS8vCQl9Ci0vLwl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0RlbGV0ZUxpbmtDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0RlbGV0ZUxpbmtDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMwZTVmMWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EZWxldGVMaW5rQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZUxpbmtDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIExpbmsgbGluazsKLQotCXByaXZhdGUgTm9kZSBzcmMsIHRhcmdldDsKLQotCXByaXZhdGUgaW50IHNyY0luZGV4LCB0YXJnZXRJbmRleDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl9kZWxldGVMaW5rQ29tbWFuZF9sYWJlbDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIERlbGV0ZUxpbmtDb21tYW5kKExpbmsgbGluaywgYm9vbGVhbiBpc0hhcmREZWxldGUpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQl0aGlzLmxpbmsgPSBsaW5rOwotCQlzcmMgPSBsaW5rLmdldFNvdXJjZSgpOwotCQl0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCWlmIChWYWxpZGF0aW9uLmNoZWNrRGVsZXRlKGxpbmspICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBsaW5rICE9IG51bGwgJiYgc3JjICE9IG51bGwgJiYgdGFyZ2V0ICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIHNob3VsZCB3b3JrIGV2ZW4gaWYgdGhlIGxpbmsgKHZpZXcpIHdhcyBkZWxldGVkLiBFZy4sIHVzZXIgc2VsZWN0cyBhCi0JICogY2xhc3MgYW5kIG9uZSBvZiBpdHMgcmVmZXJlbmNlcywgYW5kIGhpdHMgQ3RybCtEZWwuIFRoZSBjbGFzcyB3aWxsIGJlCi0JICogZGVsZXRlZCBmaXJzdCBhbmQgaXQgd2lsbCBkZWxldGUgYWxsIGl0cyByZWZlcmVuY2VzLiBXaGVuIHRoaXMgY29tbWFuZCBpcwotCSAqIGV4ZWN1dGVkLCBpdCBzaG91bGQgZG8gdGhlIGhhcmQtZGVsZXRlIHBhcnQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJc3JjSW5kZXggPSBzcmMuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLmluZGV4T2YobGluayk7Ci0JCXRhcmdldEluZGV4ID0gdGFyZ2V0LmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pbmRleE9mKGxpbmspOwotCQlpZiAoc3JjSW5kZXggIT0gLTEgJiYgdGFyZ2V0SW5kZXggIT0gLTEpIHsKLQkJCXNyYy5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkucmVtb3ZlKHNyY0luZGV4KTsKLQkJCXRhcmdldC5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkucmVtb3ZlKHRhcmdldEluZGV4KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChzcmNJbmRleCAhPSAtMSAmJiB0YXJnZXRJbmRleCAhPSAtMSkgewotCQkJc3JjLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5hZGQoc3JjSW5kZXgsIGxpbmspOwotCQkJdGFyZ2V0LmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5hZGQodGFyZ2V0SW5kZXgsIGxpbmspOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EaWFncmFtTW9kaWZ5Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EaWFncmFtTW9kaWZ5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2Yzc5NTM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvRGlhZ3JhbU1vZGlmeUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEaWFncmFtTW9kaWZ5Q29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBFT2JqZWN0IG9iamVjdDsKLQotCXByaXZhdGUgYm9vbGVhbiBjYW5VbmRvID0gdHJ1ZTsKLQotCXB1YmxpYyBEaWFncmFtTW9kaWZ5Q29tbWFuZChTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobGFiZWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERpYWdyYW0oRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCU9iamVjdCBvYmogPSBkaWFncmFtLmdldE9iamVjdCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJb2JqZWN0ID0gKEVPYmplY3QpIG9iajsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmVFeGVjdXRlKCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShvYmplY3QsIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSk7Ci0JCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLmNvbW1hbmRfY2Fubm90RWRpdCwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXN0YXR1cyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmIChwcmVwYXJlRXhlY3V0ZSgpKSB7Ci0JCQlkb0V4ZWN1dGUoKTsKLQkJCWNhblVuZG8gPSB0cnVlOwotCQl9IGVsc2UgewotCQkJY2FuVW5kbyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCNjYW5VbmRvKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gY2FuVW5kbzsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb0V4ZWN1dGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9Nb3ZlQmVuZHBvaW50Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9Nb3ZlQmVuZHBvaW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMzI4YjVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvTW92ZUJlbmRwb2ludENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5CZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBCZW5kcG9pbnQgbWFuaXB1bGF0aW9uIGNvbW1hbmRzIGNhbm5vdCBiZSBjaGFpbmVkIG9yIGNvbXBvdW5kZWQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNb3ZlQmVuZHBvaW50Q29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBMaW5rIGxpbms7Ci0KLQlwcml2YXRlIGludCBpbmRleDsKLQotCXByaXZhdGUgQmVuZHBvaW50IG9sZEJlbmRwb2ludCwgbmV3QmVuZHBvaW50OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX21vdmVCZW5kcG9pbnRDb21tYW5kX2xhYmVsOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgTW92ZUJlbmRwb2ludENvbW1hbmQoTGluayBsaW5rLCBQb2ludCBsb2NhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJdGhpcy5saW5rID0gbGluazsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQluZXdCZW5kcG9pbnQgPSBuZXcgQWJzb2x1dGVCZW5kcG9pbnQobG9jYXRpb24pOwotCQlvbGRCZW5kcG9pbnQgPSAoQmVuZHBvaW50KSBsaW5rLmdldEJlbmRwb2ludHMoKS5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBsaW5rICE9IG51bGwgJiYgaW5kZXggPj0gMCAmJiBuZXdCZW5kcG9pbnQgIT0gbnVsbAotCQkJCSYmIG9sZEJlbmRwb2ludCAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWxpbmsuZ2V0QmVuZHBvaW50cygpLnNldChpbmRleCwgbmV3QmVuZHBvaW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlsaW5rLmdldEJlbmRwb2ludHMoKS5zZXQoaW5kZXgsIG9sZEJlbmRwb2ludCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9SZWNvbm5lY3RMaW5rQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9SZWNvbm5lY3RMaW5rQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDJkZTViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvUmVjb25uZWN0TGlua0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgUmVjb25uZWN0TGlua0NvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1NvdXJjZTsKLQotCXByaXZhdGUgTGluayBsaW5rOwotCi0JcHJpdmF0ZSBOb2RlIG5ld05vZGUsIG9sZE5vZGU7Ci0KLQlwcml2YXRlIGludCB2aWV3SW5kZXg7Ci0KLQlwcml2YXRlIFBvaW50IGVuZFBvaW50OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX3JlY29ubmVjdExpbmtDb21tYW5kX2xhYmVsOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgUmVjb25uZWN0TGlua0NvbW1hbmQoTGluayBsaW5rLCBOb2RlIG5ld05vZGUsIGJvb2xlYW4gaXNTb3VyY2UpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQl0aGlzLmxpbmsgPSBsaW5rOwotCQl0aGlzLm5ld05vZGUgPSBuZXdOb2RlOwotCQl0aGlzLmlzU291cmNlID0gaXNTb3VyY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5kUG9pbnQoUG9pbnQgcCkgewotCQllbmRQb2ludCA9IHAuZ2V0Q29weSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gbGluayAhPSBudWxsICYmIG5ld05vZGUgIT0gbnVsbDsKLQkJaWYgKCFyZXN1bHQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoaXNTb3VyY2UpIHsKLQkJCXJldHVybiBWYWxpZGF0aW9uLmNoZWNrUmVjb25uZWN0KG5ld05vZGUsIGxpbmsuZ2V0VGFyZ2V0KCksIGxpbmspID09IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gVmFsaWRhdGlvbi5jaGVja1JlY29ubmVjdChsaW5rLmdldFNvdXJjZSgpLCBuZXdOb2RlLCBsaW5rKSA9PSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQotCQkvLyBMaW5rCi0JCWlmIChpc1NvdXJjZSkgewotCQkJb2xkTm9kZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCQlpZiAob2xkTm9kZSAhPSBudWxsKSB7IC8vIHNhZmV0eSBjaGVjayB0byBoYW5kbGUgZGFuZ2xpbmcgbGluawotCQkJCXZpZXdJbmRleCA9IG9sZE5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLmluZGV4T2YobGluayk7Ci0JCQl9Ci0JCQlsaW5rLnNldFNvdXJjZShuZXdOb2RlKTsKLQkJCWxpbmsuc2V0U291cmNlRW5kUG9pbnQoZW5kUG9pbnQpOwotCQl9IGVsc2UgewotCQkJb2xkTm9kZSA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCQlpZiAob2xkTm9kZSAhPSBudWxsKSB7IC8vIHNhZmV0eSBjaGVjayB0byBoYW5kbGUgZGFuZ2xpbmcgbGluawotCQkJCXZpZXdJbmRleCA9IG9sZE5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLmluZGV4T2YobGluayk7Ci0JCQl9Ci0JCQlsaW5rLnNldFRhcmdldChuZXdOb2RlKTsKLQkJCWxpbmsuc2V0VGFyZ2V0RW5kUG9pbnQoZW5kUG9pbnQpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoaXNTb3VyY2UpIHsKLQkJCW5ld05vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLnJlbW92ZShsaW5rKTsKLQkJCW9sZE5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLmFkZCh2aWV3SW5kZXgsIGxpbmspOwotCQl9IGVsc2UgewotCQkJbmV3Tm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkucmVtb3ZlKGxpbmspOwotCQkJb2xkTm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuYWRkKHZpZXdJbmRleCwgbGluayk7Ci0JCX0KLQkJb2xkTm9kZSA9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL1JlZnJlc2hEaWFncmFtRnJvbUJhc2VBY3Rpdml0eUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvUmVmcmVzaERpYWdyYW1Gcm9tQmFzZUFjdGl2aXR5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyM2Y4NzA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvUmVmcmVzaERpYWdyYW1Gcm9tQmFzZUFjdGl2aXR5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVmcmVzaERpYWdyYW1Gcm9tQmFzZUFjdGl2aXR5Q29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gRGlhZ3JhbVVJUmVzb3VyY2VzLnJlZnJlc2hGcm9tQmFzZUNtZF9sYWJlbDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFJlZnJlc2hEaWFncmFtRnJvbUJhc2VBY3Rpdml0eUNvbW1hbmQoKSB7Ci0JCXN1cGVyKExBQkVMKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRjZTJkN2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBjb21tYW5kcyBmb3IgZWRpdGluZyB0aGUgYWN0aXZpdHkgZGlhZ3JhbXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzA1MDQzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgZXh0ZW5kcyBEaWFncmFtRWRpdFBhcnQgewotCi0JaW50IHkgPSA2MDsKLQotCWJvb2xlYW4geGF4aXNiZWdpbiA9IGZhbHNlOwotCi0JYm9vbGVhbiBsb2FkaW5nID0gdHJ1ZTsKLQotCWZpbmFsIHN0YXRpYyBpbnQgc3BhY2luZyA9IDQwOwotCi0JZmluYWwgc3RhdGljIGludCB5c3BhY2luZyA9IDIwOwotCi0JYm9vbGVhbiBtaXNjZWxsYW5lb3VzID0gZmFsc2U7Ci0KLQlpbnQgeCA9IDEwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUUyA9ICJvdXRwdXRzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRTID0gImlucHV0cyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTGlzdCByZWNlbnRseUFkZGVkUGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKiogCi0JICogRWRpdFBhcnQgZm9yIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbS4KLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQoQWN0aXZpdHlEZXRhaWxEaWFncmFtIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSBtZXRob2Qgc3VwZXIucmVzZXRDaGlsZHJlbkxvY2F0aW9ucy4gSW4gdGhpcywgQWxsIHRoZSBUYXNrJ3MKLQkgKiBNYW5kYXRvcnlJbnB1dCB3b3JrcHJvZHVjdHMgcGxhY2VkIG9uIHRvcC4gYW5kIFJvbGVUYXNrIGNvbXBvc2l0ZSBpbiB0aGUKLQkgKiBtaWRkbGUuIGFuZCBUYXNrJ3Mgb3V0cHV0IHdvcmtwcm9kdWN0cyBzb3V0aC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXNldENoaWxkcmVuTG9jYXRpb25zKCkgewotCQlmaW5hbCBpbnQgeXNwYWNpbmcgPSA0MDsKLQkJTGlzdCByb2xlY29tcG9zaXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBpbnB1dHdvcmtwcm9kdWN0Q29tcG9zaXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBvdXRwdXRXb3JrUHJvZHVjdENvbXBvc2l0ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbWlzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgdGFza0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRoaXMucmVjZW50bHlBZGRlZFBhcnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlOb2RlIG4gPSAoTm9kZSkgKChFZGl0UGFydCkgY2hpbGQpLmdldE1vZGVsKCk7Ci0JCQlpZiAobi5nZXRMb2NhdGlvbigpID09IG51bGwgfHwgbi5nZXRMb2NhdGlvbigpLnggPT0gLTEpIHsKLQkJCQl0aGlzLnJlY2VudGx5QWRkZWRQYXJ0cy5hZGQoY2hpbGQpOwotCQkJfQotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgewotCQkJCXJvbGVjb21wb3NpdGVMaXN0LmFkZChjaGlsZCk7Ci0JCQkJTGlzdCBsaXN0ID0gKChSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSBjaGlsZCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJCU5vZGUgb2JqTm9kZSA9IChOb2RlKSAoKE5vZGVFZGl0UGFydCkgb2JqKS5nZXRNb2RlbCgpOwotCQkJCQlpZiAob2JqTm9kZSBpbnN0YW5jZW9mIFRhc2tOb2RlKSB7Ci0JCQkJCQl0YXNrTGlzdC5hZGQob2JqTm9kZSk7Ci0JCQkJCQlIYXNoTWFwIHRhc2tNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQkJTGlzdCBpbnB1dExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlMaXN0IG91dHB1dExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQl0YXNrTWFwLnB1dCgiaW5wdXRzIiwgaW5wdXRMaXN0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdGFza01hcC5wdXQoIm91dHB1dHMiLCBvdXRwdXRMaXN0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJbWFwLnB1dChvYmpOb2RlLCB0YXNrTWFwKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQkJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQ7Ci0JCQkJaWYgKHBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlKSB7Ci0JCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIG5vZGUgPSAoV29ya1Byb2R1Y3RDb21wb3NpdGUpIHBhcnQKLQkJCQkJCQkuZ2V0TW9kZWwoKTsKLQkJCQkJaWYgKG5vZGUuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLklOUFVUUykgewotCQkJCQkJaW5wdXR3b3JrcHJvZHVjdENvbXBvc2l0ZUxpc3QuYWRkKGNoaWxkKTsKLQkJCQkJfSBlbHNlIGlmIChub2RlLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKSB7Ci0JCQkJCQlvdXRwdXRXb3JrUHJvZHVjdENvbXBvc2l0ZUxpc3QuYWRkKGNoaWxkKTsKLQkJCQkJfQotCQkJCQljYWxjU2l6ZShjaGlsZCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQltaXNjTGlzdC5hZGQoY2hpbGQpOwotCQkJfQotCQl9Ci0KLQkJLy8gU2V0IHNpemUgZm9yIHRoZSByb2xlY29tcG9zaXRlLgotCQlpZiAoIXJvbGVjb21wb3NpdGVMaXN0LmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gcm9sZWNvbXBvc2l0ZUxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0b3IubmV4dCgpOwotCQkJCUxpc3QgbGlzdCA9ICgoUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgb2JqZWN0KS5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRvcjEgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IxLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0b3IxLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCWlmICgoKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIG9iaikuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFRhc2tOb2RlKSB7Ci0JCQkJCQkJVGFza05vZGUgdGFza05vZGUgPSAoVGFza05vZGUpICgoRGVzY3JpcHRvck5vZGVFZGl0UGFydCkgb2JqKQotCQkJCQkJCQkJLmdldE1vZGVsKCk7Ci0JCQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFzayA9IChUYXNrRGVzY3JpcHRvcikgdGFza05vZGUKLQkJCQkJCQkJCS5nZXRPYmplY3QoKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIHdwaXRvciA9IGlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkuaXRlcmF0b3IoKTsgd3BpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCB3cEVkaXRQYXJ0ID0gKFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIHdwaXRvcgotCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdwQ29tcG9zaXRlTm9kZSA9IChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgd3BFZGl0UGFydAotCQkJCQkJCQkJCS5nZXRNb2RlbCgpOwotCQkJCQkJCQlPYmplY3Qgd3BPYmplY3QgPSB3cENvbXBvc2l0ZU5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCQkJCWlmICh3cE9iamVjdC5lcXVhbHModGFzaykpIHsKLQkJCQkJCQkJCWludCB3aWR0aCA9IHdwRWRpdFBhcnQuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkJLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJCQkJCWludCBoZWlnaHQgPSAoKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIG9iaikKLQkJCQkJCQkJCQkJLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQkJCQkJCQkoKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIG9iaikKLQkJCQkJCQkJCQkJLmdldEZpZ3VyZSgpCi0JCQkJCQkJCQkJCS5zZXRQcmVmZXJyZWRTaXplKAotCQkJCQkJCQkJCQkJCW5ldyBEaW1lbnNpb24od2lkdGgsIGhlaWdodCkpOwotCQkJCQkJCQkJaWYgKCgoV29ya1Byb2R1Y3RDb21wb3NpdGUpIHdwRWRpdFBhcnQKLQkJCQkJCQkJCQkJLmdldE1vZGVsKCkpLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCQkJCQkJCQlMaXN0IGlucHV0TGlzdCA9IChMaXN0KSAoKEhhc2hNYXApIG1hcAotCQkJCQkJCQkJCQkJLmdldCh0YXNrTm9kZSkpLmdldChJTlBVVFMpOwotCQkJCQkJCQkJCWlucHV0TGlzdC5hZGQod3BFZGl0UGFydCk7Ci0JCQkJCQkJCQl9IGVsc2UgaWYgKCgoV29ya1Byb2R1Y3RDb21wb3NpdGUpIHdwRWRpdFBhcnQKLQkJCQkJCQkJCQkJLmdldE1vZGVsKCkpLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKSB7Ci0JCQkJCQkJCQkJTGlzdCBvdXRwdXRMaXN0ID0gKExpc3QpICgoSGFzaE1hcCkgbWFwCi0JCQkJCQkJCQkJCQkuZ2V0KHRhc2tOb2RlKSkuZ2V0KE9VVFBVVFMpOwotCQkJCQkJCQkJCW91dHB1dExpc3QuYWRkKHdwRWRpdFBhcnQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFyb2xlY29tcG9zaXRlTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcm9sZWNvbXBvc2l0ZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlMaXN0IGNvbmZpcm1lZFNlcUlucHV0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlMaXN0IGNvbmZpcm1lZFNlcU91dHB1dExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJTGlzdCBsaXN0ID0gKChSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSByb2xlY29tcG9zaXRlTGlzdAotCQkJCQkJLmdldChpKSkuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJRGVzY3JpcHRvck5vZGVFZGl0UGFydCB0YXNrID0gKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIGxpc3QKLQkJCQkJCQkuZ2V0KGopOwotCQkJCQlpZiAodGFzay5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVGFza05vZGUpIHsKLQkJCQkJCVRhc2tOb2RlIHRhc2tub2RlID0gKFRhc2tOb2RlKSB0YXNrLmdldE1vZGVsKCk7Ci0JCQkJCQlmb3IgKGludCBrID0gMDsgayA8IGlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCS5zaXplKCk7IGsrKykgewotCQkJCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdwY29tcCA9ICgoV29ya1Byb2R1Y3RDb21wb3NpdGUpICgoV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgaW5wdXR3b3JrcHJvZHVjdENvbXBvc2l0ZUxpc3QKLQkJCQkJCQkJCS5nZXQoaykpLmdldE1vZGVsKCkpOwotCQkJCQkJCWlmICh3cGNvbXAuZ2V0T2JqZWN0KCkuZXF1YWxzKHRhc2tub2RlLmdldE9iamVjdCgpKSkgewotCQkJCQkJCQlpZiAod3Bjb21wLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCQkJCQkJCWNvbmZpcm1lZFNlcUlucHV0TGlzdAotCQkJCQkJCQkJCQkuYWRkKGlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkJCQkJLmdldChrKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlmb3IgKGludCBrID0gMDsgayA8IG91dHB1dFdvcmtQcm9kdWN0Q29tcG9zaXRlTGlzdAotCQkJCQkJCQkuc2l6ZSgpOyBrKyspIHsKLQkJCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSB3cGNvbXAgPSAoKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSAoKFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIG91dHB1dFdvcmtQcm9kdWN0Q29tcG9zaXRlTGlzdAotCQkJCQkJCQkJLmdldChrKSkuZ2V0TW9kZWwoKSk7Ci0JCQkJCQkJaWYgKHdwY29tcC5nZXRPYmplY3QoKS5lcXVhbHModGFza25vZGUuZ2V0T2JqZWN0KCkpKSB7Ci0JCQkJCQkJCWlmICh3cGNvbXAuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLk9VVFBVVFMpIHsKLQkJCQkJCQkJCWNvbmZpcm1lZFNlcU91dHB1dExpc3QKLQkJCQkJCQkJCQkJLmFkZChvdXRwdXRXb3JrUHJvZHVjdENvbXBvc2l0ZUxpc3QKLQkJCQkJCQkJCQkJCQkuZ2V0KGspKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWNvbmZpcm1lZFNlcUlucHV0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJc2V0T2JqZWN0c0xvY2F0aW9ucyhjb25maXJtZWRTZXFJbnB1dExpc3QpOwotCQkJCQl5ID0gY2FjaGVkUG9pbnQueSArIGNhY2hlZEhlaWdodCArIHlzcGFjaW5nOwotCQkJCX0KLQkJCQlMaXN0IHJvbGVDID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXJvbGVDLmFkZChyb2xlY29tcG9zaXRlTGlzdC5nZXQoaSkpOwotCQkJCXNldE9iamVjdHNMb2NhdGlvbnMocm9sZUMpOwotCi0JCQkJeSA9IGNhY2hlZFBvaW50LnkgKyBjYWNoZWRIZWlnaHQgKyB5c3BhY2luZzsKLQkJCQlpZiAoIWNvbmZpcm1lZFNlcU91dHB1dExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCXNldE9iamVjdHNMb2NhdGlvbnMoY29uZmlybWVkU2VxT3V0cHV0TGlzdCk7Ci0JCQkJCXkgPSBjYWNoZWRQb2ludC55ICsgY2FjaGVkSGVpZ2h0ICsgeXNwYWNpbmc7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQotCQlpZiAoIW1pc2NMaXN0LmlzRW1wdHkoKSkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcmludCBTaXplIG9mIG1pc2M6ICIgKyBtaXNjTGlzdC5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoIWxvYWRpbmcpIHsKLQkJCQltaXNjZWxsYW5lb3VzID0gdHJ1ZTsKLQkJCX0KLQkJCXNldE9iamVjdHNMb2NhdGlvbnMobWlzY0xpc3QpOwotCQkJbWlzY2VsbGFuZW91cyA9IGZhbHNlOwotCQl9Ci0KLQkJbG9hZGluZyA9IGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWxjU2l6ZShPYmplY3QgY2hpbGQpIHsKLQkJTGlzdCBsaXN0ID0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQpLmdldENoaWxkcmVuKCk7Ci0JCWludCBsYXJnZXN0V2lkdGggPSAwOwotCQlpbnQgbGFyZ2VzdEhlaWdodCA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlOb2RlIG9iak5vZGUgPSAoTm9kZSkgKChOb2RlRWRpdFBhcnQpIG9iaikuZ2V0TW9kZWwoKTsKLQkJCWlmIChvYmpOb2RlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSkgewotCQkJCWludCBub2RlV2lkdGggPSAoKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIG9iaikuZ2V0RmlndXJlKCkKLQkJCQkJCS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQkJaW50IG5vZGVIZWlnaHQgPSAoKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIG9iaikuZ2V0RmlndXJlKCkKLQkJCQkJCS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCWlmIChub2RlV2lkdGggPiBsYXJnZXN0V2lkdGgpCi0JCQkJCWxhcmdlc3RXaWR0aCA9IG5vZGVXaWR0aDsKLQkJCQlpZiAobm9kZUhlaWdodCA+IGxhcmdlc3RIZWlnaHQpCi0JCQkJCWxhcmdlc3RIZWlnaHQgPSBub2RlSGVpZ2h0OwotCQkJfQotCQl9Ci0JCSgoV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgY2hpbGQpLmdldEZpZ3VyZSgpLnNldFByZWZlcnJlZFNpemUoCi0JCQkJbmV3IERpbWVuc2lvbihsYXJnZXN0V2lkdGggKiAyICsgMTAsIDIwICsgbGFyZ2VzdEhlaWdodAotCQkJCQkJKiAobGlzdC5zaXplKCkgLyAyICsgMSkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0T2JqZWN0c0xvY2F0aW9ucyhMaXN0IGxpc3QpIHsKLQotCQl4YXhpc2JlZ2luID0gdHJ1ZTsKLQkJeCA9IDEwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkOwotCQkJCWlmIChwYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCVBvaW50IHAgPSBub2RlLmdldExvY2F0aW9uKCk7Ci0JCQkJCWlmIChwID09IG51bGwgfHwgcC54ID09IC0xKSB7Ci0JCQkJCQlpbnQgdmlld2VyV2lkdGggPSBwYXJ0LmdldFJvb3QoKS5nZXRWaWV3ZXIoKQotCQkJCQkJCQkuZ2V0Q29udHJvbCgpLmdldEJvdW5kcygpLndpZHRoOwotCQkJCQkJaWYgKCF4YXhpc2JlZ2luKSB7Ci0JCQkJCQkJeCA9IGNhY2hlZFBvaW50LnggKyBjYWNoZWRXaWR0aCArIHNwYWNpbmc7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBjaGVjayBpZiBwIGlzIG51bGwsIGNyZWF0ZSBQb2ludC4KLQkJCQkJCWlmIChwID09IG51bGwpCi0JCQkJCQkJcCA9IG5ldyBQb2ludCgpOwotCi0JCQkJCQlpZiAoIWxvYWRpbmcgJiYgbWlzY2VsbGFuZW91cykgewotCQkJCQkJCXAueCA9IHg7Ci0JCQkJCQkJcC55ID0gMTA7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXAueCA9IHg7Ci0JCQkJCQkJcC55ID0geTsKLQkJCQkJCX0KLQkJCQkJCW5vZGUuc2V0TG9jYXRpb24ocCk7Ci0JCQkJCQlpZiAoIW1pc2NlbGxhbmVvdXMpCi0JCQkJCQkJY2FjaGVkUG9pbnQgPSBwOwotCQkJCQkJY2FjaGVkV2lkdGggPSBwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJCWlmIChwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQgPiBjYWNoZWRIZWlnaHQpCi0JCQkJCQkJY2FjaGVkSGVpZ2h0ID0gcGFydC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQkJeGF4aXNiZWdpbiA9IGZhbHNlOwotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIlBvaW50IDogIiArIG5ldyBQb2ludCh4LCB5KS50b1N0cmluZygpICsgIkFuZCB3aWR0aD0iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkrIGNhY2hlZFdpZHRoCi0JCQkJCQkJCQkJCSsgIiwgSGVpZ2h0PSIgKyBjYWNoZWRIZWlnaHQgKyAiLCBXaWR0aCBvZiBWaWV3ZXI6ICIgKyB2aWV3ZXJXaWR0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyByZWNlbnRseSBhZGRkZWQgZWRpdHBhcnRzLiBVc3VhbGx5IGNhbGxlZCAKLQkgKiBieSBkaWFncmFtIHNlcnZpY2VzIHRvIGRvIGF1dG9sYXlvdXQgYWRqdXN0bWVudC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWNlbnRseUFkZGVkUGFydHMoKSB7Ci0JCXJldHVybiByZWNlbnRseUFkZGVkUGFydHM7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIHJlY2VudGx5IGFkZGVkIGVkaXRwYXJ0cyBmcm9tIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyUmVjZW50bHlBZGRlZFBhcnRzKCkgewotCQlyZWNlbnRseUFkZGVkUGFydHMuY2xlYXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWY0NmY1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSdzIEVkaXRQYXJ0LiBDcmVhdGVzIGFuIEVkaXRQYXJ0IGZvcgotICogQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0ncyBjaGlsZHJlbi4gIAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydEZhY3RvcnkgaW1wbGVtZW50cyBFZGl0UGFydEZhY3RvcnkgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBFZGl0UGFydCBmb3IgYSBjaGlsZCB3aXRoIGluIHRoZSBjb250ZXh0LgotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpIHsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7Ci0JCQlyZXR1cm4gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KAotCQkJCQkoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZSkgewotCQkJcmV0dXJuIG5ldyBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KChSb2xlVGFza0NvbXBvc2l0ZSkgbW9kZWwpOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUpIHsKLQkJCXJldHVybiBuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCgKLQkJCQkJKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBSb2xlTm9kZSB8fCBtb2RlbCBpbnN0YW5jZW9mIFRhc2tOb2RlCi0JCQkJfHwgbW9kZWwgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKSB7Ci0JCQlyZXR1cm4gbmV3IERlc2NyaXB0b3JOb2RlRWRpdFBhcnQoKE5hbWVkTm9kZSkgbW9kZWwpOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgTGluaykgewotCQkJcmV0dXJuIG5ldyBMaW5rRWRpdFBhcnQoKExpbmspIG1vZGVsKTsKLQkJfQotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCVR5cGVkTm9kZSBub2RlID0gKFR5cGVkTm9kZSkgbW9kZWw7Ci0JCQlzd2l0Y2ggKG5vZGUuZ2V0VHlwZSgpKSB7Ci0JCQljYXNlIFR5cGVkTm9kZS5TVEFSVDoKLQkJCQlyZXR1cm4gbmV3IFN0YXJ0Tm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuRU5EOgotCQkJCXJldHVybiBuZXcgRW5kTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuREVDSVNJT046Ci0JCQkJcmV0dXJuIG5ldyBEZWNpc2lvbk5vZGVFZGl0UGFydChub2RlKTsKLQkJCWNhc2UgVHlwZWROb2RlLlNZTkNIX0JBUjoKLQkJCQlyZXR1cm4gbmV3IFN5bmNoQmFyTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuRlJFRV9URVhUOgotCQkJCXJldHVybiBuZXcgRnJlZVRleHROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEaWFncmFtRWRpdFBhcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURpYWdyYW1FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MDc5ZjkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURpYWdyYW1FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbTsKLQotLyoqCi0gKiBFZGl0UGFydCBmb3IgQWN0aXZpdHlEaWFncmFtLgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0IGV4dGVuZHMgRGlhZ3JhbUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBlZGl0cGFydCBmb3IgQWN0aXZpdHkgRGlhZ3JhbS4gCi0JICogCi0JICogQHBhcmFtIG1vZGVsIHtAbGluayBBY3Rpdml0eURpYWdyYW19Ci0JICovCi0JcHVibGljIEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0KEFjdGl2aXR5RGlhZ3JhbSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0FjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0FjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZWM5NzZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEaWFncmFtRWRpdFBhcnRGYWN0b3J5IGltcGxlbWVudHMgRWRpdFBhcnRGYWN0b3J5IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgZWRpdHBhcnQgZm9yIEFjdGl2aXR5RGlhZ3JhbSdzIGNoaWxkcmVuLiAKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3RvcnkjY3JlYXRlRWRpdFBhcnQob3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoRWRpdFBhcnQgY29udGV4dCwgT2JqZWN0IG1vZGVsKSB7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIEFjdGl2aXR5RGlhZ3JhbSkgewotCQkJcmV0dXJuIG5ldyBBY3Rpdml0eURpYWdyYW1FZGl0UGFydCgoQWN0aXZpdHlEaWFncmFtKSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCXJldHVybiBuZXcgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlRWRpdFBhcnQoKE5hbWVkTm9kZSkgbW9kZWwpOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgTGluaykgewotCQkJcmV0dXJuIG5ldyBMaW5rRWRpdFBhcnQoKExpbmspIG1vZGVsKTsKLQkJfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJVHlwZWROb2RlIG5vZGUgPSAoVHlwZWROb2RlKSBtb2RlbDsKLQkJCXN3aXRjaCAobm9kZS5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgVHlwZWROb2RlLlNUQVJUOgotCQkJCXJldHVybiBuZXcgU3RhcnROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5FTkQ6Ci0JCQkJcmV0dXJuIG5ldyBFbmROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5ERUNJU0lPTjoKLQkJCQlyZXR1cm4gbmV3IERlY2lzaW9uTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuU1lOQ0hfQkFSOgotCQkJCXJldHVybiBuZXcgU3luY2hCYXJOb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5GUkVFX1RFWFQ6Ci0JCQkJcmV0dXJuIG5ldyBGcmVlVGV4dE5vZGVFZGl0UGFydChub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9CYXNlRWRpdFBhcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9CYXNlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzIxOTdkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQmFzZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQudGV4dC5UZXh0RmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXMuTGFiZWxTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuU2VsZWN0YWJsZUxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci0KLS8qKgotICogUHJvdmlkZXMgaW5mcmFzdHJ1Y3R1cmUgZm9yIGRlbGV0aW9uLCBkaXJlY3QtZWRpdGluZywgcHJvcGVydHkgc291cmNlIGFuZAotICogbW9kZWwtbGlzdGVuaW5nLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCB7Ci0KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCXByb3RlY3RlZCBBZGFwdGVyIG1vZGVsTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaGFuZGxlUHJvcGVydHlDaGFuZ2VkKG1zZyk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgCi0JICogQHBhcmFtIG9iaiB7QGxpbmsgRU9iamVjdH0KLQkgKi8KLQlwdWJsaWMgQmFzZUVkaXRQYXJ0KEVPYmplY3Qgb2JqKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldE1vZGVsKG9iaik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCSgoRU9iamVjdCkgZ2V0TW9kZWwoKSkuZUFkYXB0ZXJzKCkuYWRkKG1vZGVsTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBEaXJlY3RFZGl0UG9saWN5IGNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKTsKLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwKLQkJCQluZXcgTGFiZWxTZWxlY3Rpb25FZGl0UG9saWN5KCkpOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3RhYmxlTGFiZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQjZGVhY3RpdmF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJKChFT2JqZWN0KSBnZXRNb2RlbCgpKS5lQWRhcHRlcnMoKS5yZW1vdmUobW9kZWxMaXN0ZW5lcik7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQl9Ci0KLQlJRmlndXJlIGdldERpcmVjdEVkaXRGaWd1cmUoKSB7Ci0JCXJldHVybiBnZXRGaWd1cmUoKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0RGlyZWN0RWRpdFRleHQoKSB7Ci0JCUlGaWd1cmUgZmlnID0gZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpOwotCQlpZiAoZmlnIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWcpLmdldFRleHQoKTsKLQkJfSBlbHNlIGlmIChmaWcgaW5zdGFuY2VvZiBUZXh0RmxvdykgewotCQkJcmV0dXJuICgoVGV4dEZsb3cpIGZpZykuZ2V0VGV4dCgpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKTsKLQotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXREaXJlY3RFZGl0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJbWFuYWdlciA9IGNyZWF0ZURpcmVjdEVkaXRNYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldERpcmVjdEVkaXRNYW5hZ2VyKCk7Ci0KLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5zaG93KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgY3JlYXRlRGlyZWN0RWRpdE1hbmFnZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxEaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0Q2VsbEVkaXRvci5jbGFzcywKLQkJCQluZXcgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcihnZXREaXJlY3RFZGl0RmlndXJlKCkpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQm90dG9tQW5jaG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQm90dG9tQW5jaG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDliN2Y1NmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0JvdHRvbUFuY2hvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdENvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgYm90dG9tIGFuY2hvciBmb3IgYSBmaWd1cmUncyBib3R0b20gbG9jYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLWNsYXNzIEJvdHRvbUFuY2hvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbkFuY2hvciB7Ci0KLQlwcml2YXRlIGludCBvZmZzZXQ7Ci0KLQlCb3R0b21BbmNob3IoSUZpZ3VyZSBzb3VyY2UsIGludCBvZmZzZXQpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSkgewotCQlSZWN0YW5nbGUgciA9IGdldE93bmVyKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQlnZXRPd25lcigpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocik7Ci0JCWludCBvZmYgPSBvZmZzZXQ7Ci0JCWlmIChvZmYgPT0gLTEpCi0JCQlvZmYgPSByLndpZHRoIC8gMjsKLQkJaWYgKHIuY29udGFpbnMocmVmZXJlbmNlKSB8fCByLmJvdHRvbSgpID4gcmVmZXJlbmNlLnkpCi0JCQlyZXR1cm4gci5nZXRUb3BMZWZ0KCkudHJhbnNsYXRlKG9mZiwgMCk7Ci0JCWVsc2UKLQkJCXJldHVybiByLmdldEJvdHRvbUxlZnQoKS50cmFuc2xhdGUob2ZmLCAtMSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0Nsb3Nlc3RBbmNob3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9DbG9zZXN0QW5jaG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM2MDRhNWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0Nsb3Nlc3RBbmNob3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0Q29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5BbmNob3JVdGlsOwotCi0vKioKLSAqIFByb3ZpZGVzIHN1cHBvcnQgdG8gZmluZCB0aGUgY2xvc2VzdCBsb2NhdGlvbiBpbiBmaWd1cmUKLSAqIGZvciBhbmNob3IuIAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2xvc2VzdEFuY2hvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbkFuY2hvciB7Ci0KLQlwdWJsaWMgQ2xvc2VzdEFuY2hvcihJRmlndXJlIGZpZ3VyZSkgewotCQlzdXBlcihmaWd1cmUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25BbmNob3IjZ2V0TG9jYXRpb24oUG9pbnQpCi0JICovCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSkgewotCQlyZXR1cm4gZ2V0TG9jYXRpb24oZ2V0T3duZXIoKSwgcmVmZXJlbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgbG9jYXRpb24gaW4gdGhlIGNsb3Nlc3QgbG9jYXRpb24gaW4gZmlndXJlLCBiYXNlZCBvbiAKLQkgKiBmaWd1cmUgYm91bmRzIGFuZCB0aGUgcmVmZXJlbmNlIHBvaW50LiAgIAotCSAqIAotCSAqIEBwYXJhbSBmaWd1cmUge0BsaW5rIElGaWd1cmV9ICBGaWd1cmUgdG8gd2hpY2ggY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hpbmcuCi0JICogQHBhcmFtIHJlZmVyZW5jZSB7QGxpbmsgUG9pbnR9Ci0JICovCi0JcHVibGljIHN0YXRpYyBQb2ludCBnZXRMb2NhdGlvbihJRmlndXJlIGZpZ3VyZSwgUG9pbnQgcmVmZXJlbmNlKSB7Ci0JCVJlY3RhbmdsZSByID0gZmlndXJlLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJZmlndXJlLnRyYW5zbGF0ZVRvQWJzb2x1dGUocik7Ci0JCVJlY3RhbmdsZSBhYnNvbHV0ZUJvdW5kcyA9IHIuZ2V0Q29weSgpOwotCQlQb2ludCBwID0gbnVsbDsKLQkJc3dpdGNoIChyLmdldFBvc2l0aW9uKHJlZmVyZW5jZSkpIHsKLQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSDoKLQkJCXAgPSByLmdldFRvcExlZnQoKS50cmFuc2xhdGUocmVmZXJlbmNlLnggLSByLngsIDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgUG9zaXRpb25Db25zdGFudHMuTk9SVEhfRUFTVDoKLQkJCXAgPSByLmdldFRvcFJpZ2h0KCk7Ci0JCQlicmVhazsKLQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5FQVNUOgotCQkJcCA9IHIuZ2V0VG9wUmlnaHQoKS50cmFuc2xhdGUoMCwgcmVmZXJlbmNlLnkgLSByLnkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUG9zaXRpb25Db25zdGFudHMuU09VVEhfRUFTVDoKLQkJCXAgPSByLmdldEJvdHRvbVJpZ2h0KCk7Ci0JCQlicmVhazsKLQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSDoKLQkJCXAgPSByLmdldEJvdHRvbUxlZnQoKS50cmFuc2xhdGUocmVmZXJlbmNlLnggLSByLngsIDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgUG9zaXRpb25Db25zdGFudHMuU09VVEhfV0VTVDoKLQkJCXAgPSByLmdldEJvdHRvbUxlZnQoKTsKLQkJCWJyZWFrOwotCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLldFU1Q6Ci0JCQlwID0gci5nZXRUb3BMZWZ0KCkudHJhbnNsYXRlKDAsIHJlZmVyZW5jZS55IC0gci55KTsKLQkJCWJyZWFrOwotCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIX1dFU1Q6Ci0JCQlwID0gci5nZXRUb3BMZWZ0KCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWludCB0b3BEaXN0YW5jZSA9IHJlZmVyZW5jZS55IC0gci55OwotCQkJaW50IHJpZ2h0RGlzdGFuY2UgPSByLnJpZ2h0KCkgLSByZWZlcmVuY2UueDsKLQkJCWludCBib3R0b21EaXN0YW5jZSA9IHIuYm90dG9tKCkgLSByZWZlcmVuY2UueTsKLQkJCWludCBsZWZ0RGlzdGFuY2UgPSByZWZlcmVuY2UueCAtIHIueDsKLQkJCWludFtdIGRpc3RhbmNlcyA9IHsgdG9wRGlzdGFuY2UsIHJpZ2h0RGlzdGFuY2UsIGJvdHRvbURpc3RhbmNlLAotCQkJCQlsZWZ0RGlzdGFuY2UgfTsKLQkJCWludCBpZCA9IEFuY2hvclV0aWwubWluKGRpc3RhbmNlcyk7Ci0JCQlzd2l0Y2ggKGlkKSB7Ci0JCQljYXNlIDA6Ci0JCQkJcCA9IHIuZ2V0VG9wTGVmdCgpLnRyYW5zbGF0ZShsZWZ0RGlzdGFuY2UsIDApOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCXAgPSByLmdldFRvcFJpZ2h0KCkudHJhbnNsYXRlKDAsIHRvcERpc3RhbmNlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQlwID0gci5nZXRCb3R0b21MZWZ0KCkudHJhbnNsYXRlKGxlZnREaXN0YW5jZSwgMCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDQ6Ci0JCQkJcCA9IHIuZ2V0VG9wTGVmdCgpLnRyYW5zbGF0ZSh0b3BEaXN0YW5jZSwgMCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJcC5wZXJmb3JtVHJhbnNsYXRlKC1hYnNvbHV0ZUJvdW5kcy54LCAtYWJzb2x1dGVCb3VuZHMueSk7Ci0JCX0KLQkJcmV0dXJuIHA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGVjaXNpb25Ob2RlRWRpdFBhcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EZWNpc2lvbk5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OWUyYWJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EZWNpc2lvbk5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkRpYW1vbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5BbmNob3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuQ29ubmVjdGlvbkFuY2hvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkNvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Mb2NhdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEVkaXRQYXJ0IGZvciAgRGVjaXNpb25Ob2RlLCB1c2VkIGluIGFjdGl2aXR5IGRpYWdyYW0uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVFZGl0UGFydCBleHRlbmRzIE5vZGVFZGl0UGFydCBpbXBsZW1lbnRzCi0JCUNvbm5lY3Rpb25BbmNob3JMb2NhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yIEJHX0NPTE9SID0gbmV3IENvbG9yKG51bGwsIDI1NCwgMjA0LCAxNTMpOwotCi0JcHJpdmF0ZSBQb2ludCByZWNlbnRTb3VyY2VFbmRQb2ludDsKLQotCXByaXZhdGUgUG9pbnQgcmVjZW50VGFyZ2V0RW5kUG9pbnQ7Ci0KLQlwdWJsaWMgRGVjaXNpb25Ob2RlRWRpdFBhcnQoVHlwZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZURpcmVjdEVkaXRQb2xpY3koKQotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0UG9saWN5IGNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjY3JlYXRlRmlndXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCURpYW1vbmQgZmlndXJlID0gbmV3IERpYW1vbmQoKTsKLQkJZmlndXJlLnNldEJhY2tncm91bmRDb2xvcihCR19DT0xPUik7Ci0JCWZpZ3VyZS5zZXRTaXplKDQ4LCAyNCk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlRWRpdFBhcnQjZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihvcmcuZWNsaXBzZS5nZWYuQ29ubmVjdGlvbkVkaXRQYXJ0KQotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoCi0JCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbikgewotCQlib29sZWFuIGlzUmVsYXRpdmUgPSBmYWxzZTsKLQkJUG9pbnQgc291cmNlRW5kUG9pbnQ7Ci0JCWlmIChyZWNlbnRTb3VyY2VFbmRQb2ludCA9PSBudWxsKSB7Ci0JCQkvLyBnZXQgc291cmNlIGVuZCBwb2ludCBmcm9tIHRoZSBtb2RlbAotCQkJTGluayBsaW5rID0gKExpbmspIGNvbm5lY3Rpb24uZ2V0TW9kZWwoKTsKLQkJCXNvdXJjZUVuZFBvaW50ID0gbGluay5nZXRTb3VyY2VFbmRQb2ludCgpOwotCQkJaXNSZWxhdGl2ZSA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlzb3VyY2VFbmRQb2ludCA9IHJlY2VudFNvdXJjZUVuZFBvaW50OwotCQl9Ci0JCWlmIChzb3VyY2VFbmRQb2ludCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHNvdXJjZUVuZFBvaW50LCBpc1JlbGF0aXZlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihjb25uZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUVkaXRQYXJ0I2dldFNvdXJjZUNvbm5lY3Rpb25BbmNob3Iob3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3QpCi0JICovCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJUG9pbnQgcCA9IG51bGw7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHsKLQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcSA9IChDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCkgcmVxdWVzdDsKLQkJCXAgPSByZXEuZ2V0TG9jYXRpb24oKTsKLQkJfSBlbHNlIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgTG9jYXRpb25SZXF1ZXN0KSB7Ci0JCQlwID0gKChMb2NhdGlvblJlcXVlc3QpIHJlcXVlc3QpLmdldExvY2F0aW9uKCk7Ci0JCX0KLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJcmVjZW50U291cmNlRW5kUG9pbnQgPSBnZXRMb2NhdGlvbihwKTsKLQkJCXJldHVybiBuZXcgUmVsYXRpdmVYWUFuY2hvcihnZXRGaWd1cmUoKSwgcmVjZW50U291cmNlRW5kUG9pbnQsIHRydWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKHJlcXVlc3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlRWRpdFBhcnQjZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcihvcmcuZWNsaXBzZS5nZWYuQ29ubmVjdGlvbkVkaXRQYXJ0KQotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoCi0JCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbikgewotCQlib29sZWFuIGlzUmVsYXRpdmUgPSBmYWxzZTsKLQkJUG9pbnQgdGFyZ2V0RW5kUG9pbnQ7Ci0JCWlmIChyZWNlbnRUYXJnZXRFbmRQb2ludCA9PSBudWxsKSB7Ci0JCQkvLyBnZXQgdGFyZ2V0IGVuZCBwb2ludCBmcm9tIG1vZGVsCi0JCQlMaW5rIGxpbmsgPSAoTGluaykgY29ubmVjdGlvbi5nZXRNb2RlbCgpOwotCQkJdGFyZ2V0RW5kUG9pbnQgPSBsaW5rLmdldFRhcmdldEVuZFBvaW50KCk7Ci0JCQlpc1JlbGF0aXZlID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXRhcmdldEVuZFBvaW50ID0gcmVjZW50VGFyZ2V0RW5kUG9pbnQ7Ci0JCX0KLQkJaWYgKHRhcmdldEVuZFBvaW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgUmVsYXRpdmVYWUFuY2hvcihnZXRGaWd1cmUoKSwgdGFyZ2V0RW5kUG9pbnQsIGlzUmVsYXRpdmUpOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoY29ubmVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVFZGl0UGFydCNnZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0KQotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCVBvaW50IHAgPSBudWxsOwotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0KSB7Ci0JCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXEgPSAoQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHJlcXVlc3Q7Ci0JCQlwID0gcmVxLmdldExvY2F0aW9uKCk7Ci0JCX0gZWxzZSBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkgewotCQkJcCA9ICgoTG9jYXRpb25SZXF1ZXN0KSByZXF1ZXN0KS5nZXRMb2NhdGlvbigpOwotCQl9Ci0JCWlmIChwICE9IG51bGwpIHsKLQkJCXJlY2VudFRhcmdldEVuZFBvaW50ID0gZ2V0TG9jYXRpb24ocCk7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHJlY2VudFRhcmdldEVuZFBvaW50LCB0cnVlKTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKHJlcXVlc3QpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5Db25uZWN0aW9uQW5jaG9yTG9jYXRvciNnZXRMb2NhdGlvbihQb2ludCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oUG9pbnQgcmVmZXJlbmNlKSB7Ci0JCURpYW1vbmQgZiA9ICgoRGlhbW9uZCkgZ2V0RmlndXJlKCkpOwotCi0JCS8vIHRyYW5zbGF0ZSBwb2ludHMgdG8gYWJzb2x1dGUKLQkJUG9pbnRbXSBwb2ludHMgPSBuZXcgUG9pbnRbZi5nZXRQb2ludHMoKS5zaXplKCldOwotCQlmb3IgKGludCBpID0gZi5nZXRQb2ludHMoKS5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJUG9pbnQgcCA9IGYuZ2V0UG9pbnRzKCkuZ2V0UG9pbnQoaSk7Ci0JCQlmLnRyYW5zbGF0ZVRvQWJzb2x1dGUocCk7Ci0JCQlwb2ludHNbaV0gPSBwOwotCQl9Ci0KLQkJUG9pbnQgcCA9IEFuY2hvclV0aWwuZ2V0Q2xvc2VzdFBvaW50KHBvaW50cywgcmVmZXJlbmNlKTsKLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJUmVjdGFuZ2xlIHIgPSBmLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJCWYudHJhbnNsYXRlVG9BYnNvbHV0ZShyKTsKLQkJCXAucGVyZm9ybVRyYW5zbGF0ZSgtci54LCAtci55KTsKLQkJfQotCQlyZXR1cm4gcDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGVzY3JpcHRvck5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYTdhNjRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0vKioKLSAqIEVkaXRQYXJ0IGZvciBXb3JrQnJlYWtkb3duIEVsZW1lbnRzIGluIGFuIEFjdGl2aXR5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvck5vZGVFZGl0UGFydCBleHRlbmRzIE5hbWVkTm9kZUVkaXRQYXJ0IHsKLQotCXB1YmxpYyBEZXNjcmlwdG9yTm9kZUVkaXRQYXJ0KE5hbWVkTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5hbWVkTm9kZUVkaXRQYXJ0I2dldEltYWdlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFJvbGVOb2RlKSB7Ci0JCQlpZigoKE5vZGUpbW9kZWwpLmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkKLQkJCQlyZXR1cm4gSW1hZ2VzLlJPTEVfREVTQ1JJUFRPUl8xNjsKLQkJCXJldHVybiBJbWFnZXMuUk9MRTsKLQkJfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFRhc2tOb2RlKSB7Ci0JCQlpZigoKE5vZGUpbW9kZWwpLmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkKLQkJCQlyZXR1cm4gSW1hZ2VzLlRBU0tfREVTQ1JJUFRPUl8xNjsKLQkJCXJldHVybiBJbWFnZXMuVEFTS19ERVNDUklQVE9SOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSkgewotCQkJaWYoKChOb2RlKW1vZGVsKS5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pCi0JCQkJcmV0dXJuIEltYWdlcy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl8xNjsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSAoKExpbmtlZE9iamVjdCkgbW9kZWwpCi0JCQkJCS5nZXRPYmplY3QoKTsKLQkJCVdvcmtQcm9kdWN0IHdwID0gd3BkLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQlpZiAod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCXJldHVybiBJbWFnZXMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfMTY7Ci0JCQl9IGVsc2UgaWYgKHdwIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQlyZXR1cm4gSW1hZ2VzLkRFTElWRVJBQkxFOwotCQkJfSBlbHNlIGlmICh3cCBpbnN0YW5jZW9mIE91dGNvbWUpIHsKLQkJCQlyZXR1cm4gSW1hZ2VzLk9VVENPTUU7Ci0JCQl9Ci0JCQlyZXR1cm4gSW1hZ2VzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SXzE2OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5OYW1lZE5vZGVFZGl0UGFydCNjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkgKgotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBjcmVhdGVEaXJlY3RFZGl0TWFuYWdlcigpIHsKLQkJTGFiZWwgbCA9IChMYWJlbCkgZ2V0RmlndXJlKCk7Ci0JCXJldHVybiBuZXcgVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHRDZWxsRWRpdG9yLmNsYXNzLAotCQkJCW5ldyBMYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvcihsKSwgbCkgewotCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQlPYmplY3Qgb2JqID0gZ2V0RWRpdFBhcnQoKS5nZXRNb2RlbCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmo7Ci0JCQkJCU9iamVjdCBlID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tXb3JrUHJvZHVjdERlc2NyaXB0b3JQcmVzZW50YXRpb25OYW1lKAotCQkJCQkJCWUsIHR4dCwgbm9kZS5nZXREaWFncmFtKCkuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrTm9kZSkgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqOwotCQkJCQlPYmplY3QgZSA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCXJldHVybiBUbmdVdGlsLmNoZWNrV29ya0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKGUsCi0JCQkJCQkJdHh0LCBub2RlLmdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVOb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmo7Ci0JCQkJCU9iamVjdCBlID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tSb2xlRGVzY3JpcHRvclByZXNlbnRhdGlvbk5hbWUoZSwgdHh0LCBub2RlLmdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUodHh0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU291cmNlQ29ubmVjdGlvbnMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hTb3VyY2VDb25uZWN0aW9ucygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09NUE9ORU5UX1JPTEUsIG51bGwpOwotCX0KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0RGlyZWN0RWRpdE1hbmFnZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EaWFncmFtQWN0aW9uU2VydmljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RpYWdyYW1BY3Rpb25TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3YzI5YzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RpYWdyYW1BY3Rpb25TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNoYW5nZUJvdW5kc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuUmVjb25uZWN0TGlua0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogU2VydmljZSBjbGFzcyB0byBhbGxvdyBjcmVhdGUgYW5kIHJlZ2lzdGVyIGNvbW1vbiBhY3Rpb24gdG8gdGhlIGFjdGlvbgotICogcmVnaXN0ZXIuIE1vc3Qgb2YgdGhlIGNvZGUgYXJlIG1vdmVkIGZyb20gdGhlIEVkaXRvciBjbGFzcy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1BY3Rpb25TZXJ2aWNlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX0hPUlpfQVZFUkFHRSA9ICJhbGlnbl9ob3Jpem9udGFsX3RvX2F2ZXJhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEID0gImFsaWduX2hvcml6b250YWxfdG9fZmlyc3Rfc2VsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fVkVSVF9BVkVSQUdFID0gImFsaWduX3ZlcnRpY2FsX3RvX2F2ZXJhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEID0gImFsaWduX3ZlcnRpY2FsX3RvX2ZpcnN0X3NlbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGVmYXVsdEVkaXREb21haW4gZWRpdERvbWFpbjsKLQotCXByaXZhdGUgR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlcjsKLQotCXByaXZhdGUgQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAKLQkgKiBAcGFyYW0gZ3JhcGhpY2FsVmlld2VyIHtAbGluayBHcmFwaGljYWxWaWV3ZXJ9Ci0JICogQHBhcmFtIGVkaXREb21haW4gCXtAbGluayBEZWZhdWx0RWRpdERvbWFpbn0KLQkgKiBAcGFyYW0gYWN0aW9uUmVnaXN0cnkgCXtAbGluayBBY3Rpb25SZWdpc3RyeX0KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUFjdGlvblNlcnZpY2UoR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlciwKLQkJCURlZmF1bHRFZGl0RG9tYWluIGVkaXREb21haW4sIEFjdGlvblJlZ2lzdHJ5IGFjdGlvblJlZ2lzdHJ5KSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gZ3JhcGhpY2FsVmlld2VyOwotCQl0aGlzLmVkaXREb21haW4gPSBlZGl0RG9tYWluOwotCQl0aGlzLmFjdGlvblJlZ2lzdHJ5ID0gYWN0aW9uUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgR3JhcGhpY2FsVmlld2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyYXBoaWNhbFZpZXdlcihHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyKSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gZ3JhcGhpY2FsVmlld2VyOwotCX0KLQotCS8qKgotCSAqIHJldHVybnMgR3JhcGhpY2FsVmlld2VyCi0JICovCi0JcHJpdmF0ZSBHcmFwaGljYWxWaWV3ZXIgZ2V0R3JhcGhpY2FsVmlld2VyKCkgewotCQlyZXR1cm4gZ3JhcGhpY2FsVmlld2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbW1hbmQgc3RhY2suCi0JICogCi0JICogQHJldHVybiB0aGUgY29tbWFuZCBzdGFjawotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlyZXR1cm4gZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVkaXQgZG9tYWluLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVkaXQgZG9tYWluCi0JICovCi0JcHJvdGVjdGVkIERlZmF1bHRFZGl0RG9tYWluIGdldEVkaXREb21haW4oKSB7Ci0JCXJldHVybiBlZGl0RG9tYWluOwotCX0KLQotCXByb3RlY3RlZCBBY3Rpb25SZWdpc3RyeSBnZXRBY3Rpb25SZWdpc3RyeSgpIHsKLQkJcmV0dXJuIGFjdGlvblJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIEhvcml6b250YWxBbGlnbkF2ZXJhZ2VBY3Rpb24gYWN0aW9uLiAKLQkgKiBIb3Jpem9udGFsQWlnbkF2ZXJhZ2UgQWN0aW9uIGFsaWducyBzZWxlY3RlZCBlZGl0cGFydHMgdG8gaG9yaXpvbnRhbCBhdmVyYWdlLiAgCi0JICovCi0JcHVibGljIElBY3Rpb24gcmVnaXN0ZXJIb3Jpem9udGFsQWxpZ25BdmVyYWdlQWN0aW9uKCkgewotCQkvLyBhbGlnbiBob3Jpem9udGFsbHkgdG8gYXZlcmFnZSB5LXZhbHVlIG9mIGFsbCBub2RlcwotCQlJQWN0aW9uIGhBbGlnbkF2ZXJhZ2VBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlob3JpekFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fSE9SWl9BVkVSQUdFOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGhBbGlnbkF2ZXJhZ2VBY3Rpb24pOwotCi0JCXJldHVybiBoQWxpZ25BdmVyYWdlQWN0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZWdpc3RlciBIb3Jpem9udGFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uIGFjdGlvbi4gCi0JICogSG9yaXpvbnRhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbiBhbGlnbnMgc2VsZWN0ZWQgZWRpdHBhcnRzIHdpdGggCi0JICogcmVzcGVjdCB0byBmaXJzdCBzZWxlY3RlZCBlZGl0cGFydC4gCi0JICovCi0KLQlwdWJsaWMgSUFjdGlvbiByZWdpc3Rlckhvcml6b250YWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKSB7Ci0JCS8vIGFsaWduIGhvcml6b250YWxseSB0byB5LXZhbHVlIG9mIGZpcnN0IHNlbGVjdGVkIG5vZGUKLQkJSUFjdGlvbiBoQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaG9yekFsaWduVG9GaXJzdFNlbGVjdGVkKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIEFMSUdOX0hPUlpfRklSU1RfU0VMRUNURUQ7Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbik7Ci0KLQkJcmV0dXJuIGhBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb247Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVyIHZlcnRpYWxBbGlnbkF2ZXJhZ2VBY3Rpb24gYWN0aW9uLiAKLQkgKiB2ZXJ0aWFsQWxpZ25BdmVyYWdlQWN0aW9uIGFsaWducyBzZWxlY3RlZCBlZGl0cGFydHMgdmVydGljYWxseSB3LnIudCBhdmVyYWdlLgotCSAqIAotCSAqLwotCQotCXB1YmxpYyBJQWN0aW9uIHJlZ2lzdGVyVmVydGljYWxBbGlnbkF2ZXJhZ2VBY3Rpb24oKSB7Ci0JCS8vIGFsaWduIHZlcnRpY2FsbHkgdG8gYXZlcmFnZSB4LXZhbHVlIG9mIGFsbCBzZWxlY3RlZCBub2RlcwotCQlJQWN0aW9uIHZBbGlnbkF2ZXJhZ2VBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl2ZXJ0aWNhbEFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fVkVSVF9BVkVSQUdFOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHZBbGlnbkF2ZXJhZ2VBY3Rpb24pOwotCi0JCXJldHVybiB2QWxpZ25BdmVyYWdlQWN0aW9uOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIHZlcnRpYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gYWN0aW9uLiAKLQkgKiB2ZXJ0aWFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uIGFsaWducyBzZWxlY3RlZCBlZGl0cGFydHMgdmVydGljYWxseSB3LnIudCBmaXJzdCBzZWxlY3RlZC4KLQkgKiAKLQkgKi8KLQotCXB1YmxpYyBJQWN0aW9uIHJlZ2lzdGVyVmVydGljYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKSB7Ci0JCS8vIGFsaWduIHZlcnRpY2FsbHkgdG8geC12YWx1ZSBvZiBmaXJzdCBzZWxlY3RlZCBub2RlCi0JCUlBY3Rpb24gdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXZlcnRpY2FsQWxpZ25Ub0ZpcnN0U2VsZWN0ZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fVkVSVF9GSVJTVF9TRUxFQ1RFRDsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbih2QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKTsKLQotCQlyZXR1cm4gdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbjsKLQl9Ci0KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8gYWN0aW9uIG1ldGhvZHMKLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCi0JLyoqIAotCSAqIEFjdGlvbiBpbXBsZW1lbnRhdGlvbiBtZXRob2QgZm9yIGhvcml6b250YWxBbGlnbkZpcnN0ZVNFbGVjdGVkQWN0aW9uLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGhvcnpBbGlnblRvRmlyc3RTZWxlY3RlZCgpIHsKLQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGZpcnN0UGFydCA9IG51bGw7Ci0JCS8vIGxvb3AgdGhyb3VnaCBhbGwgc2VsZWN0ZWQgaXRlbXMsIHJlbWVtYmVyIHRoZSB5LXZhbHVlIG9mIHRoZQotCQkvLyBmaXJzdCBub2RlLAotCQkvLyBzZXQgdGhlIGZvbGxvd2luZyBub2RlcyB0byB0aGUgc2FtZSB5LXZhbHVlCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVFZGl0UGFydAotCQkJCQl8fCBlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJLy8gcmVtZW1iZXIgdGhlIGZpcnN0IHBhcnQgd2UgbW92ZQotCQkJCWlmIChmaXJzdFBhcnQgPT0gbnVsbCkgewotCQkJCQlmaXJzdFBhcnQgPSBlcDsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBjYWxjdWxhdGUgdGhlIG9mZnNldCBmb3IgY2VudGVybGluZSBhbGlnbm1lbnQKLQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQlpbnQgb2Zmc2V0ID0gKGludCkgKChkb3VibGUpIChib3VuZHMuaGVpZ2h0IC0gZmlyc3RQYXJ0Ci0JCQkJCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmhlaWdodCkgLyAyLjApOwotCQkJCQkvLyBpcyB0aGlzIG5vZGUgaW4gYSBjb250YWluZXI/Ci0JCQkJCWlmICghKGVwLmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSkgewotCQkJCQkJLy8gbmVlZCB0byBtb3ZlIHRoZSBjb250YWluZXIsIGFkanVzdCB0aGUgb2Zmc2V0Ci0JCQkJCQllcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlcC5nZXRQYXJlbnQoKTsKLQkJCQkJCVJlY3RhbmdsZSBwYXJlbnRCb3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJCW9mZnNldCArPSBib3VuZHMueSAtIHBhcmVudEJvdW5kcy55OwotCQkJCQkJYm91bmRzID0gcGFyZW50Qm91bmRzOwotCQkJCQl9Ci0JCQkJCS8vIHNlbmQgdGhlIGNvbW1hbmQgdG8gbW92ZSB0aGUgbm9kZQotCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoCi0JCQkJCQkJKE5vZGUpIGVwLmdldE1vZGVsKCksIG5ldyBQb2ludChib3VuZHMueCwgZmlyc3RQYXJ0Ci0JCQkJCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueQotCQkJCQkJCQkJLSBvZmZzZXQpLCBib3VuZHMud2lkdGgpOwotCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKiogCi0JICogQWN0aW9uIGltcGxlbWVudGF0aW9uIG1ldGhvZCBmb3IgaG9yaXpvbnRhbEFsaWduQXZlcmFnZUFjdGlvbi4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBob3JpekFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKSB7Ci0JCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBmaXJzdFBhcnQgPSBudWxsOwotCQlpbnQgdG90YWwgPSAwOwotCQlpbnQgeXN1bSA9IDA7Ci0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVFZGl0UGFydAotCQkJCQl8fCBlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJLy8gcmVtZW1iZXIgdGhlIGZpcnN0IHBhcnQgd2UgbW92ZQotCQkJCWlmIChmaXJzdFBhcnQgPT0gbnVsbCkgewotCQkJCQlmaXJzdFBhcnQgPSBlcDsKLQkJCQl9Ci0JCQkJeXN1bSArPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55OwotCQkJCXRvdGFsKys7Ci0JCQl9Ci0JCX0KLQkJLy8gY2FsY3VsYXRlIHRoZSBhdmVyYWdlIHktdmFsdWUgZm9yIGFsbCBub2RlcwotCQlpbnQgeWF2ZSA9IChpbnQpICgoZG91YmxlKSB5c3VtIC8gKGRvdWJsZSkgdG90YWwpOwotCQkvLyBsb29wIHRocm91Z2ggYWxsIHRoZSBub2RlcyBhZ2FpbiBhbmQgc2V0IHRoZW0KLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0Ci0JCQkJCXx8IGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQkvLyBjYWxjdWxhdGUgdGhlIGhlaWdodCBkaWZmZXJlbmNlLCBzbyB0aGF0IGVsZW1lbnRzIGFyZSBhbGlnbmVkCi0JCQkJLy8gdGhyb3VnaCB0aGUgY2VudGVybGluZQotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgb2Zmc2V0ID0gKGludCkgKChkb3VibGUpIChib3VuZHMuaGVpZ2h0IC0gZmlyc3RQYXJ0Ci0JCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuaGVpZ2h0KSAvIDIuMCk7Ci0JCQkJLy8gaXMgdGhpcyBub2RlIGluc2lkZSBhIGNvbnRhaW5lcj8KLQkJCQlpZiAoIShlcC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpIHsKLQkJCQkJLy8gd2UgbmVlZCB0byBtb3ZlIHRoZSBjb250YWluZXIsIGFkanVzdCB0aGUgb2Zmc2V0Ci0JCQkJCWVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVwLmdldFBhcmVudCgpOwotCQkJCQlSZWN0YW5nbGUgcGFyZW50Qm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCW9mZnNldCArPSBib3VuZHMueSAtIHBhcmVudEJvdW5kcy55OwotCQkJCQlib3VuZHMgPSBwYXJlbnRCb3VuZHM7Ci0JCQkJfQotCQkJCS8vIHNlbmQgdGhlIGNvbW1hbmQgdG8gbW92ZSB0aGUgbm9kZQotCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgKLQkJCQkJCShOb2RlKSBlcC5nZXRNb2RlbCgpLAotCQkJCQkJbmV3IFBvaW50KGJvdW5kcy54LCB5YXZlIC0gb2Zmc2V0KSwgYm91bmRzLndpZHRoKTsKLQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJfQotCQl9Ci0KLQl9Ci0JLyoqIAotCSAqIEFjdGlvbiBpbXBsZW1lbnRhdGlvbiBtZXRob2QgZm9yIHZlcnRpY2FsQWxpZ25Ub0F2ZXJhZ2VBY3Rpb24uCi0JICogCi0JICovCi0KLQlwdWJsaWMgdm9pZCB2ZXJ0aWNhbEFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKSB7Ci0JCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBmaXJzdFBhcnQgPSBudWxsOwotCQlpbnQgdG90YWwgPSAwOwotCQlpbnQgeHN1bSA9IDA7Ci0JCS8vIGxvb3AgdGhyb3VnaCB0aGUgc2VsZWN0ZWQgcGFydHMKLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCS8vIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gbm9kZXMgYW5kIGNvbnRhaW5lcnMKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0Ci0JCQkJCXx8IGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQlpZiAoZmlyc3RQYXJ0ID09IG51bGwpIHsKLQkJCQkJZmlyc3RQYXJ0ID0gZXA7Ci0JCQkJfQotCQkJCS8vIHN1bSB0aGUgeCBjb29yZGluYXRlcyBvZiBlYWNoIGVsZW1lbnQKLQkJCQl4c3VtICs9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLng7Ci0JCQkJLy8gcmVtZW1iZXIgaG93IG1hbnkgc2VsZWN0ZWQgZWxlbWVudHMgYXBwbGllZCB0byB0aGlzIG9wZXJhdGlvbgotCQkJCXRvdGFsKys7Ci0JCQl9Ci0JCX0KLQkJLy8gY2FsY3VsYXRlIHRoZSBhdmVyYWdlIHgtdmFsdWUgZm9yIGFsbCBub2RlcwotCQlpbnQgeGF2ZSA9IChpbnQpICgoZG91YmxlKSB4c3VtIC8gKGRvdWJsZSkgdG90YWwpOwotCQkvLyBsb29wIHRocm91Z2ggYWxsIHRoZSBub2RlcyBhZ2FpbiBhbmQgc2V0IHRoZW0KLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0Ci0JCQkJCXx8IGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQkvLyBjYWxjdWxhdGUgdGhlIG9mZnNldCBmb3IgY2VudGVybGluZSBhbGlnbm1lbnQKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJaW50IG9mZnNldCA9IChpbnQpICgoZG91YmxlKSAoYm91bmRzLndpZHRoIC0gZmlyc3RQYXJ0Ci0JCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGgpIC8gMi4wKTsKLQkJCQkvLyBhcmUgd2UgaW5zaWRlIGEgY29udGFpbmVyPwotCQkJCWlmICghKGVwLmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSkgewotCQkJCQkvLyBhZGp1c3QgdGhlIG9mZnNldCBzaW5jZSB3ZSBoYXZlIHRvIG1vdmUgdGhlIGNvbnRhaW5lcgotCQkJCQllcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlcC5nZXRQYXJlbnQoKTsKLQkJCQkJUmVjdGFuZ2xlIHBhcmVudEJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQlvZmZzZXQgKz0gYm91bmRzLnggLSBwYXJlbnRCb3VuZHMueDsKLQkJCQkJYm91bmRzID0gcGFyZW50Qm91bmRzOwotCQkJCX0KLQkJCQkvLyBzZW5kIHRoZSBjb21tYW5kIHRvIG1vdmUgdGhlIGVsZW1lbnQKLQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoCi0JCQkJCQkoTm9kZSkgZXAuZ2V0TW9kZWwoKSwKLQkJCQkJCW5ldyBQb2ludCh4YXZlIC0gb2Zmc2V0LCBib3VuZHMueSksIGJvdW5kcy53aWR0aCk7Ci0JCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCX0KLQkJfQotCi0JfQotCS8qKiAKLQkgKiBBY3Rpb24gaW1wbGVtZW50YXRpb24gbWV0aG9kIGZvciB2ZXJ0aWNhbEFsaWduVG9GaXJzdFNlbGVjdGVkQWN0aW9uLgotCSAqIAotCSAqLwotCi0JcHVibGljIHZvaWQgdmVydGljYWxBbGlnblRvRmlyc3RTZWxlY3RlZCgpIHsKLQkJLy8gZ2V0IHRoZSBzZWxlY3RlZCBpdGVtcwotCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgYWxpZ25Ub1BhcnQgPSBudWxsOwotCQkvLyBmaW5kIHRoZSBmaXJzdCBkaWFncmFtIHBhcnQgd2UgY2FuIGFsaWduIHRvCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVFZGl0UGFydAotCQkJCQl8fCBlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJaWYgKGFsaWduVG9QYXJ0ID09IG51bGwpIHsKLQkJCQkJLy8gcmVtZW1iZXIgaXQgYW5kIHN0b3AKLQkJCQkJYWxpZ25Ub1BhcnQgPSBlcDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGxvb3AgdGhyb3VnaCB0aGUgZWxlbWVudHMgYW5kIHNldCB0aGVpciBuZXcgcG9zaXRpb24KLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0Ci0JCQkJCXx8IGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQkvLyB3ZSBjYW4gc2tpcCB0aGUgZmlyc3Qgb25lIHNpbmNlIHRoaXMgaXMgYW4gYWxpZ24tdG8KLQkJCQlpZiAoZXAgIT0gYWxpZ25Ub1BhcnQKLQkJCQkJCSYmICEoYWxpZ25Ub1BhcnQgaW5zdGFuY2VvZiBTeW5jaEJhck5vZGVFZGl0UGFydCkpIHsKLQkJCQkJLy8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgZm9yIGNlbnRlcmxpbmUgYWxpZ25tZW50Ci0JCQkJCWlmICghKGVwIGluc3RhbmNlb2YgU3luY2hCYXJOb2RlRWRpdFBhcnQpKSB7Ci0JCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCQlpbnQgb2Zmc2V0ID0gKGludCkgKChkb3VibGUpIChib3VuZHMud2lkdGggLSBhbGlnblRvUGFydAotCQkJCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGgpIC8gMi4wKTsKLQkJCQkJCS8vIGlzIHRoaXMgaW5zaWRlIGEgY29udGFpbmVyPwotCQkJCQkJaWYgKCEoZXAuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpKSB7Ci0JCQkJCQkJLy8gYWRqdXN0IHRoZSBvZmZzZXQgc2luY2Ugd2UgYXJlIG1vdmluZyB0aGUKLQkJCQkJCQkvLyBjb250YWluZXIKLQkJCQkJCQllcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlcC5nZXRQYXJlbnQoKTsKLQkJCQkJCQlSZWN0YW5nbGUgcGFyZW50Qm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCQkJb2Zmc2V0ICs9IGJvdW5kcy54IC0gcGFyZW50Qm91bmRzLng7Ci0JCQkJCQkJYm91bmRzID0gcGFyZW50Qm91bmRzOwotCQkJCQkJfQotCQkJCQkJLy8gc2VuZCB0aGUgY29tbWFuZCB0byBtb3ZlIHRoZSBlbGVtZW50Ci0JCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoCi0JCQkJCQkJCShOb2RlKSBlcC5nZXRNb2RlbCgpLCBuZXcgUG9pbnQoYWxpZ25Ub1BhcnQKLQkJCQkJCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueAotCQkJCQkJCQkJCS0gb2Zmc2V0LCBib3VuZHMueSksIGJvdW5kcy53aWR0aCk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJZXAuZ2V0RmlndXJlKCkuc2V0TG9jYXRpb24oCi0JCQkJCQkJCW5ldyBQb2ludChhbGlnblRvUGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54Ci0JCQkJCQkJCQkJLSBvZmZzZXQsIGJvdW5kcy55KSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlQb2ludCB0cCA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldExvY2F0aW9uKCk7Ci0JCQkJCQlib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOwotCQkJCQkJYm9vbGVhbiBzb3VyY2UgPSBmYWxzZTsKLQkJCQkJCVBvaW50IGVuZFBvaW50ID0gbnVsbDsKLQkJCQkJCUxpbmtFZGl0UGFydCBscCA9IG51bGw7Ci0JCQkJCQkvLyBjaGVjayB0YXJnZXQgY29ubmVjdGlvbnMKLQkJCQkJCUxpc3QgbGlzdCA9ICgoTm9kZUVkaXRQYXJ0KSBlcCkuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJbHAgPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQlpZiAobHAuZ2V0U291cmNlKCkuZXF1YWxzKGFsaWduVG9QYXJ0KSkgewotCQkJCQkJCQllbmRQb2ludCA9ICgoTGluaykgbHAuZ2V0TW9kZWwoKSkKLQkJCQkJCQkJCQkuZ2V0VGFyZ2V0RW5kUG9pbnQoKTsKLQkJCQkJCQkJdHAgPSB0cC5nZXRUcmFuc2xhdGVkKGVuZFBvaW50KTsKLQkJCQkJCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLy8gY2hlY2sgc291cmNlIGNvbm5lY3Rpb25zIGlmIG5vdCBmb3VuZCBpbiB0YXJnZXQgY29ubmVjdGlvbnMKLQkJCQkJCWlmICghY29ubmVjdGVkKSB7Ci0JCQkJCQkJbGlzdCA9ICgoTm9kZUVkaXRQYXJ0KSBlcCkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCWxwID0gKExpbmtFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmIChscC5nZXRUYXJnZXQoKS5lcXVhbHMoYWxpZ25Ub1BhcnQpKSB7Ci0JCQkJCQkJCQllbmRQb2ludCA9ICgoTGluaykgbHAuZ2V0TW9kZWwoKSkKLQkJCQkJCQkJCQkJLmdldFNvdXJjZUVuZFBvaW50KCk7Ci0JCQkJCQkJCQl0cCA9IHRwLmdldFRyYW5zbGF0ZWQoZW5kUG9pbnQpOwotCQkJCQkJCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQkJCQkJCQkJCXNvdXJjZSA9IHRydWU7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChjb25uZWN0ZWQgJiYgKGFsaWduVG9QYXJ0IGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0KSkgewotCQkJCQkJCQkJUG9pbnQgY2VudGVyUG9pbnQgPSBhbGlnblRvUGFydC5nZXRGaWd1cmUoKQotCQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQkJCQlpbnQgZGVsdGEgPSBjZW50ZXJQb2ludC54IC0gdHAueDsKLQkJCQkJCQllbmRQb2ludC54ICs9IGRlbHRhOwotCQkJCQkJCQkJUmVjb25uZWN0TGlua0NvbW1hbmQgYyA9IG5ldyBSZWNvbm5lY3RMaW5rQ29tbWFuZCgKLQkJCQkJCQkJCShMaW5rKSBscC5nZXRNb2RlbCgpLCAoTm9kZSkgZXAuZ2V0TW9kZWwoKSwKLQkJCQkJCQkJCXNvdXJjZSk7Ci0JCQkJCQkJYy5zZXRFbmRQb2ludChlbmRQb2ludCk7Ci0JCQkJCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gSWYgZmlyc3Qgc2VsZWN0ZWQgZWRpdCBwYXJ0IGlzIHN5bmNiYXJub2RlZWRpdHBhcnQsIG5lZWQgdG8KLQkJCQkvLyBoYW5kbGUgZGlmZmVyZW50bHkKLQkJCQlpZiAoZXAgIT0gYWxpZ25Ub1BhcnQKLQkJCQkJCSYmIChhbGlnblRvUGFydCBpbnN0YW5jZW9mIFN5bmNoQmFyTm9kZUVkaXRQYXJ0KSkgewotCi0JCQkJCVBvaW50IHNwID0gYWxpZ25Ub1BhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJCQkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKLQkJCQkJLy8gY2hlY2sgaWYgdGhlIHBhcnQgaXMgY29ubmVjdGVkIHZpYSBzb3VyY2UgY29ubmVjdGlvbnMKLQkJCQkJTGlzdCBsaXN0ID0gKChOb2RlRWRpdFBhcnQpIGFsaWduVG9QYXJ0KQotCQkJCQkJCS5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJTGlua0VkaXRQYXJ0IGxwID0gKExpbmtFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAobHAuZ2V0VGFyZ2V0KCkuZXF1YWxzKGVwKSkgewotCQkJCQkJCVBvaW50IHNvdXJjZUVuZFBvaW50ID0gKChMaW5rKSBscC5nZXRNb2RlbCgpKQotCQkJCQkJCQkJLmdldFNvdXJjZUVuZFBvaW50KCk7Ci0JCQkJCQkJc3AgPSBzcC5nZXRUcmFuc2xhdGVkKHNvdXJjZUVuZFBvaW50KTsKLQkJCQkJCQljb25uZWN0ZWQgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIGlmIG5vdCBmb3VuZCBhYm92ZSwgY2hlY2sgaWYgaXQgaXMgY29ubmVjdGVkIHZpYSB0YXJnZXQgY29ubmVjdGlvbnMKLQkJCQkJaWYgKCFjb25uZWN0ZWQpIHsKLQkJCQkJCWxpc3QgPSAoKE5vZGVFZGl0UGFydCkgYWxpZ25Ub1BhcnQpCi0JCQkJCQkJCS5nZXRUYXJnZXRDb25uZWN0aW9ucygpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQlMaW5rRWRpdFBhcnQgbHAgPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQlpZiAobHAuZ2V0U291cmNlKCkuZXF1YWxzKGVwKSkgewotCQkJCQkJCQlQb2ludCB0YXJnZXRFbmRQb2ludCA9ICgoTGluaykgbHAuZ2V0TW9kZWwoKSkKLQkJCQkJCQkJCQkuZ2V0VGFyZ2V0RW5kUG9pbnQoKTsKLQkJCQkJCQkJc3AgPSBzcC5nZXRUcmFuc2xhdGVkKHRhcmdldEVuZFBvaW50KTsKLQkJCQkJCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChlcCBpbnN0YW5jZW9mIFN5bmNoQmFyTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQlQb2ludCB0cCA9ICgoTm9kZSkgZXAuZ2V0TW9kZWwoKSkuZ2V0TG9jYXRpb24oKQotCQkJCQkJCQkuZ2V0Q29weSgpOwotCQkJCQkJUG9pbnQgYWxpZ25Ub0NlbnRlciA9IGFsaWduVG9QYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotCQkJCQkJUG9pbnQgY2VudGVyUG9pbnQgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTsKLQkJCQkJCWludCBkZWx0YSA9IGFsaWduVG9DZW50ZXIueCAtIGNlbnRlclBvaW50Lng7Ci0JCQkJCQl0cC54ID0gdHAueCArIGRlbHRhOwotCQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKAotCQkJCQkJCQkoTm9kZSkgZXAuZ2V0TW9kZWwoKSwgdHAsIGVwLmdldEZpZ3VyZSgpCi0JCQkJCQkJCQkJLmdldEJvdW5kcygpLndpZHRoKTsKLQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQllcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbihuZXcgUG9pbnQodHAueCwgdHAueSkpOwotCQkJCQl9IGVsc2UgaWYgKGVwIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQlQb2ludCB0cCA9ICgoTm9kZSkgZXAuZ2V0TW9kZWwoKSkuZ2V0TG9jYXRpb24oKQotCQkJCQkJCQkuZ2V0Q29weSgpOwotCQkJCQkJUG9pbnQgY2VudGVyUG9pbnQgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCQkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQlpbnQgZGVsdGEgPSBzcC54IC0gY2VudGVyUG9pbnQueDsKLQkJCQkJCXRwLnggPSB0cC54ICsgZGVsdGE7Ci0JCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoCi0JCQkJCQkJCShOb2RlKSBlcC5nZXRNb2RlbCgpLCB0cCwgZXAuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkud2lkdGgpOwotCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCWVwLmdldEZpZ3VyZSgpLnNldExvY2F0aW9uKG5ldyBQb2ludCh0cC54LCB0cC55KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EaWFncmFtRWRpdFBhcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EaWFncmFtRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDRlNzQxYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGlhZ3JhbUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ2hhbmdlQm91bmRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzLkRpYWdyYW1MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuUm9vdENvbXBvbmVudEVkaXRQb2xpY3k7Ci0KLS8qKgotICogUHJvdmlkZXMgRWRpdFBhcnQgZm9yIERpYWdyYW0uIEhhbmRsZXMgdGhlIGJhc2ljIGxheW91dCBtZWNoYW5pc20KLSAqIGlmIHRoZSBjaGlsZHJlbiBsb2NhdGlvbiBpcyBub3Qgc2V0IGluIHRoZSBkaWFncmFtLiAgCi0gKiAgIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3Igc2thbm5vb3IKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FZGl0UGFydCBleHRlbmRzIE5vZGVDb250YWluZXJFZGl0UGFydCB7Ci0KLQlQb2ludCBjYWNoZWRQb2ludCA9IG5ldyBQb2ludCgtMSwgLTEpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVidWc7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbWFya0RpcnR5ID0gZmFsc2U7Ci0KLQlzdGF0aWMgaW50IGNhY2hlZFdpZHRoID0gMTA7Ci0KLQlzdGF0aWMgaW50IGNhY2hlZEhlaWdodCA9IDEwOwotCi0JcHVibGljIERpYWdyYW1FZGl0UGFydChEaWFncmFtIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQkJZGVidWcgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUZpZ3VyZSBmID0gbmV3IEZyZWVmb3JtTGF5ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoKSB7Ci0JCQkJaWYgKGhhc01pc3BsYWNlZENoaWxkcmVuKCkpIHsKLQkJCQkJcmVzZXRDaGlsZHJlbkxvY2F0aW9ucygpOwotCQkJCX0KLQkJCQlzdXBlci5sYXlvdXQoKTsKLQkJCX0KLQotCQl9OwotCi0JCWYuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMjApKTsKLQkJZi5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBGcmVlZm9ybUxheW91dCgpKTsKLQkJcmV0dXJuIGY7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRDaGlsZHJlbkxvY2F0aW9ucygpIHsKLQkJaW50IHkgPSAxMDsKLQkJZmluYWwgaW50IHNwYWNpbmcgPSA0MDsKLQkJaW50IG9jY3VwaWVkID0gMDsKLQkJaW50IHhlbGVtZW50cyA9IDA7Ci0JCWludCB4ID0gMTA7Ci0JCWJvb2xlYW4gbG9ja2VkID0gVG5nVXRpbC5pc0xvY2tlZCgoRU9iamVjdCkoKERpYWdyYW0pZ2V0TW9kZWwoKSkuZ2V0T2JqZWN0KCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkOwotCQkJCWludCB3aWR0aCA9IHBhcnQuZ2V0Um9vdCgpLmdldFZpZXdlcigpLmdldENvbnRyb2woKS5nZXRCb3VuZHMoKS53aWR0aDsKLQkJCQlpZiAocGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgcGFydC5nZXRNb2RlbCgpOwotCQkJCQlQb2ludCBwID0gbm9kZS5nZXRMb2NhdGlvbigpLmdldENvcHkoKTsKLQkJCQkJaWYgKHAgPT0gbnVsbCB8fCBwLnggPT0gLTEpIHsKLQkJCQkJCWlmICh4ICsgcGFydC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGggPiB3aWR0aCkgewotCQkJCQkJCXkgPSBjYWNoZWRQb2ludC55ICsgY2FjaGVkSGVpZ2h0ICsgc3BhY2luZzsKLQkJCQkJCQl4ZWxlbWVudHMgPSAwOwotCQkJCQkJCXggPSAxMDsKLQkJCQkJCQljYWNoZWRQb2ludC54ID0gLTE7Ci0JCQkJCQkJb2NjdXBpZWQgPSAwOwotCQkJCQkJfQotCQkJCQkJaWYgKGNhY2hlZFBvaW50LnggIT0gLTEpIHsKLQkJCQkJCQl4ID0gY2FjaGVkUG9pbnQueCArIGNhY2hlZFdpZHRoICsgc3BhY2luZzsKLQkJCQkJCX0KLQkJCQkJCSsreGVsZW1lbnRzOwotCQkJCQkJaWYgKHAgPT0gbnVsbCkgewotCQkJCQkJCXAgPSBuZXcgUG9pbnQoLTEsIC0xKTsKLQkJCQkJCX0KLQkJCQkJCXAueCA9IHg7Ci0JCQkJCQlwLnkgPSB5OwotCQkJCQkJLy9ub2RlLnNldExvY2F0aW9uKHApOwotCQkJCQkJLy9PbiBvcGVuaW5nIGEgQUQgZGlhZ3JhbSwgZWRpdG9yIHNob3VsZCBiZSBtYXJrZWQgZGlydHkuCi0JCQkJCQkvL0lmIGRpYWdyYW0gaXMgbm90IHNhdmVkLCBjYW5ub3QgYmUgYnJvd3NlZC4gRm9yY2luZyB0byBzYXZlIHRoZSBkaWFncmFtIG9uY2UuCi0JCQkJCQlpZiAoIWxvY2tlZCAmJiAoKERpYWdyYW0pIGdldE1vZGVsKCkpLmlzTmV3KCkKLQkJCQkJCQkJJiYgISgoRGlhZ3JhbSkgZ2V0TW9kZWwoKSkuaXNSZWFkT25seSgpCi0JCQkJCQkJCSYmIG1hcmtEaXJ0eSkgewotCQkJCQkJCUNoYW5nZUJvdW5kc0NvbW1hbmQgY2JjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQobm9kZSwgcCwgcGFydC5nZXRGaWd1cmUoKQotCQkJCQkJCQkJCQkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoKTsKLQkJCQkJCQlnZXRWaWV3ZXIoKS5nZXRFZGl0RG9tYWluKCkuZ2V0Q29tbWFuZFN0YWNrKCkKLQkJCQkJCQkJCS5leGVjdXRlKGNiYyk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIElmIFBsdWdpbiBpcyBMb2NrZWQ6IERvIGF1dG8tbGF5b3V0IGFuZCBkb25vdAotCQkJCQkJCS8vIHNhdmUgdG8gbW9kZWwuCi0JCQkJCQkJbm9kZS5zZXRMb2NhdGlvbihwKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJY2FjaGVkUG9pbnQgPSBwOwotCQkJCQkJY2FjaGVkV2lkdGggPSBwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJCWNhY2hlZEhlaWdodCA9IHBhcnQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJQb2ludCA6ICIgKyBuZXcgUG9pbnQoeCwgeSkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiQ2FjaGVkIDogd2lkdGg6ICIgKyBjYWNoZWRXaWR0aCArICIgSGVpZ2h0IDogIiArIGNhY2hlZEhlaWdodCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQkJb2NjdXBpZWQgKz0geDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGhhc01pc3BsYWNlZENoaWxkcmVuKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBFZGl0UGFydCkgewotCQkJCU9iamVjdCBtb2RlbCA9ICgoRWRpdFBhcnQpIGNoaWxkKS5nZXRNb2RlbCgpOwotCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIG1vZGVsOwotCQkJCQlQb2ludCBwID0gbm9kZS5nZXRMb2NhdGlvbigpOwotCQkJCQlpZiAocCA9PSBudWxsIHx8IHAueCA9PSAtMSl7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgewotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkNPTVBPTkVOVF9ST0xFLAotCQkJCW5ldyBSb290Q29tcG9uZW50RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT05UQUlORVJfUk9MRSwKLQkJCQluZXcgRGlhZ3JhbUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVDb250YWluZXJFZGl0UGFydCNhZGRQYXJ0VG9FZGl0KENvbGxlY3Rpb24sCi0JICogICAgICBPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFydFRvRWRpdChDb2xsZWN0aW9uIHBhcnRzVG9FZGl0LCBPYmplY3Qgbm9kZSkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIpIHsKLQkJCU5vZGVDb250YWluZXJFZGl0UGFydCBlZGl0UGFydCA9IChOb2RlQ29udGFpbmVyRWRpdFBhcnQpIGZpbmRDaGlsZEJ5TW9kZWwobm9kZSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKE5vZGVDb250YWluZXIpIG5vZGUpLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCWVkaXRQYXJ0LmFkZFBhcnRUb0VkaXQocGFydHNUb0VkaXQsIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFBhcnRUb0VkaXQocGFydHNUb0VkaXQsIG5vZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTW92ZXMgY29tcGxldGUgZGlhZ3JhbSBjaGlsZHJlbiB0byBnaXZlbiBkZWx0YS4gCi0JICogQHBhcmFtIGludCAgKFgtYXhpcyBkZWx0YSkKLQkgKiBAcGFyYW0gaW50ICAoWS1heGlzIGRlbHRhKQotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIG1vdmVGaWd1cmUoaW50IG1vdmVYLCBpbnQgbW92ZVkpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkOwotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBwYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZShuZXcgUG9pbnQoYm91bmRzLnggKyBtb3ZlWCwKLQkJCQkJCWJvdW5kcy55ICsgbW92ZVkpLCBib3VuZHMuZ2V0U2l6ZSgpKTsKLQotCQkJCS8vIGFsc28gbmVlZCB0byBtb3ZlIHRoZSBiZW5kIHBvaW50cwotCQkJCUxpc3QgbGlzdCA9IHBhcnQuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQlMaW5rRWRpdFBhcnQgbGlua3BhcnQgPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJTGluayBsaW5rID0gKExpbmspIGxpbmtwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCWlmIChsaW5rLmdldEJlbmRwb2ludHMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJCQlQb2ludExpc3QgcGxpc3QgPSAoKFBvbHlsaW5lQ29ubmVjdGlvbikgbGlua3BhcnQKLQkJCQkJCQkJLmdldEZpZ3VyZSgpKS5nZXRQb2ludHMoKTsKLQkJCQkJCUxpc3QgcG9pbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBwbGlzdC5zaXplKCkgLSAxOyBpKyspIHsKLQkJCQkJCQlQb2ludCBwID0gcGxpc3QuZ2V0UG9pbnQoaSk7Ci0JCQkJCQkJcCA9IHAudHJhbnNsYXRlKG5ldyBQb2ludChtb3ZlWCwgbW92ZVkpKTsKLQotCQkJCQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludCBicCA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQoCi0JCQkJCQkJCQlwKTsKLQkJCQkJCQlwb2ludHMuYWRkKGJwKTsKLQkJCQkJCX0KLQotCQkJCQkJbGlua3BhcnQuZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpLnNldFJvdXRpbmdDb25zdHJhaW50KAotCQkJCQkJCQlwb2ludHMpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJdGhpcy5zZXRMYXlvdXRDb25zdHJhaW50KHBhcnQsIHBhcnQuZ2V0RmlndXJlKCksIHIpOwotCi0JCQl9IGVsc2UgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUGFydCBub3QgbW92ZWQ6ICIgKyBjaGlsZCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JfQotCS8qKgotCSAqIE9uIG9wZW5pbmcgYSBkaWFncmFtLCBlZGl0b3Igc2hvdWxkIGJlIG1hcmtlZCBkaXJ0eS4KLQkgKiBJbnZva2VyIG9mIERpYWdyYW1FZGl0UGFydCBzaG91bGQgZXhwbGljaXRseSBzZXQgdGhlIGZsYWcgdG8gbWFyayBlZGl0b3IgZGlydHkKLQkgKiBvciBub3QuIFdpdGhvdSBoYW5kbGluZyB0aGlzIHdpbGwgY2F1c2UgYnJvd3NpbmcgcGVyc3BlY3RpdmUgaW4gY29uc2lzdGVudC4gICAgCi0JICogRm9yIGRlZmVjdDogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjAyOQotCSAqLwotCXB1YmxpYyB2b2lkIG1hcmtEaXJ0eShib29sZWFuIG1hcmtEaXJ0eSl7Ci0JCXRoaXMubWFya0RpcnR5ICA9IG1hcmtEaXJ0eTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RpYWdyYW1VcGRhdGVTZXJ2aWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGlhZ3JhbVVwZGF0ZVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTA3OGE0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGlhZ3JhbVVwZGF0ZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ2hhbmdlQm91bmRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLS8qKgotICogU2VydmljZSBjbGFzcyB0byBhbGxvdyB1cGRhdGluZyBkaWFncmFtIHRvIGEgZGVmYXVsdCBsYXlvdXQuIE1vc3Qgb2YgdGhlIGNvZGUKLSAqIGFyZSBtb3ZlZCBmcm9tIHRoZSBFZGl0b3IgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtVXBkYXRlU2VydmljZSB7Ci0KLQlwcml2YXRlIERlZmF1bHRFZGl0RG9tYWluIGVkaXREb21haW47Ci0KLQlwcml2YXRlIEdyYXBoaWNhbFZpZXdlciBncmFwaGljYWxWaWV3ZXI7Ci0KLQlwcml2YXRlIEFjdGlvblJlZ2lzdHJ5IGFjdGlvblJlZ2lzdHJ5OwotCi0JcHVibGljIERpYWdyYW1VcGRhdGVTZXJ2aWNlKAotCQkJR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlciwgRGVmYXVsdEVkaXREb21haW4gZWRpdERvbWFpbiwKLQkJCUFjdGlvblJlZ2lzdHJ5IGFjdGlvblJlZ2lzdHJ5KSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gZ3JhcGhpY2FsVmlld2VyOwotCQl0aGlzLmVkaXREb21haW4gPSBlZGl0RG9tYWluOwotCQl0aGlzLmFjdGlvblJlZ2lzdHJ5ID0gYWN0aW9uUmVnaXN0cnk7Ci0JfQotCi0JcHJpdmF0ZSBHcmFwaGljYWxWaWV3ZXIgZ2V0R3JhcGhpY2FsVmlld2VyKCkgewotCQlyZXR1cm4gZ3JhcGhpY2FsVmlld2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbW1hbmQgc3RhY2suCi0JICogCi0JICogQHJldHVybiB0aGUgY29tbWFuZCBzdGFjawotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlyZXR1cm4gZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVkaXQgZG9tYWluLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVkaXQgZG9tYWluCi0JICovCi0JcHJvdGVjdGVkIERlZmF1bHRFZGl0RG9tYWluIGdldEVkaXREb21haW4oKSB7Ci0JCXJldHVybiBlZGl0RG9tYWluOwotCX0KLQotCS8qKgotCSAqIExhemlseSBjcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBhY3Rpb24gcmVnaXN0cnkuCi0JICogCi0JICogQHJldHVybiB0aGUgYWN0aW9uIHJlZ2lzdHJ5Ci0JICovCi0JcHJvdGVjdGVkIEFjdGlvblJlZ2lzdHJ5IGdldEFjdGlvblJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gYWN0aW9uUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHVzZWQgb25seSBpbiBBY3Rpdml0eURldGFpbERpYWdyYW0gb3IgYW55IGRpYWdyYW0gbmVlZCBhdXRvLWxheW91dC4KLQkgKiBNZXRob2Qgd2lsbCB2ZXJpZnkgcmVjZW50bHkgYWRkZWQgZWRpdHBhcnRzIGluIHRoZSBBY3Rpdml0eWRldGFpbGRpYWdyYW0gZWRpdHBhcnQKLQkgKiBpbmRpcmVjdGx5IGZyb20gV29ya0JyZWFrZG93blN0cnVjdHVyZSAobWVhbnMgYW55IGRlc2NyaXB0b3JzIGNyZWF0ZWQgaW4gd2JzLCBjb3JyZXNwb25kaW5nCi0JICogRWRpdFBhcnQgd2lsbCBnZXQgY3JlYXRlZCBpbiBBY3Rpdml0eURldGFpbERpYWdyYW0gVmlld2VyKSBhbmQgZG9lcyBhdXRvLWxheW91dAotCSAqIGFsbCB0aGUgbmV3IGFkZGVkIGVkaXRwYXJ0cyBhbmQgZXhpc3Rpbmcgb25lcy4gCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW5VcERpYWdyYW0oKSB7Ci0JCWlmIChnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRDb250ZW50cygpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIHsKLQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGRlcCA9IChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkJLmdldENvbnRlbnRzKCk7Ci0JCQlMaXN0IGNoaWxkcmVuID0gZGVwLmdldFJlY2VudGx5QWRkZWRQYXJ0cygpOwotCQkJaWYgKCFjaGlsZHJlbi5pc0VtcHR5KCkpIHsKLQkJCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQotCQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7Ci0JCQkJCQlpbnQgcmMgPSAwOwotCQkJCQkJaWYgKGFyZzAgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQkJCQkJaWYgKCEoYXJnMSBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpKQotCQkJCQkJCQlyYyA9IC0xOwotCQkJCQkJfSBlbHNlIGlmIChhcmcxIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkKLQkJCQkJCQlyYyA9IDE7Ci0JCQkJCQlyZXR1cm4gcmM7Ci0JCQkJCX0KLQotCQkJCX07Ci0KLQkJCQlPYmplY3RbXSBhcnJheSA9IGNoaWxkcmVuLnRvQXJyYXkoKTsKLQkJCQlBcnJheXMuc29ydChhcnJheSwgY29tcGFyYXRvcik7Ci0JCQkJZm9yIChpbnQgYSA9IDA7IGEgPCBhcnJheS5sZW5ndGg7IGErKykgewotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGFycmF5W2FdOwotCQkJCQlhZGp1c3RTaXplKGVwKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgYiA9IDA7IGIgPCBhcnJheS5sZW5ndGg7IGIrKykgewotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGFycmF5W2JdOwotCQkJCQljbGVhblVwKGVwKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgYyA9IDA7IGMgPCBhcnJheS5sZW5ndGg7IGMrKykgewotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGFycmF5W2NdOwotCQkJCQlyZWR1Y2VMaW5rTGVuZ3RoKGVwKTsKLQkJCQl9Ci0vLwkJCQlmb3IgKGludCBjID0gMDsgYyA8IGFycmF5Lmxlbmd0aDsgYysrKSB7Ci0vLwkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBhcnJheVtjXTsKLS8vCQkJCQlpZihlcCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpewotLy8JCQkJCQlyZXNldFNpemVzKGVwLCBlcCk7Ci0vLwkJCQkJfQotLy8JCQkJfQotCQkJCXBhY2tEaWFncmFtKCk7Ci0JCQkJZGVwLmNsZWFyUmVjZW50bHlBZGRlZFBhcnRzKCk7Ci0JCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQlwcml2YXRlIHZvaWQgcmVzZXRTaXplcyhBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwLCBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHBhcmVudCkgewotCQlpZiAoIShlcCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpKSB7Ci0JCQlMaXN0IHNvdXJjZUxpbmtzID0gZXAuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCWlmIChzb3VyY2VMaW5rcy5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChpbnQgYiA9IDA7IGIgPCBzb3VyY2VMaW5rcy5zaXplKCk7IGIrKykgewotCQkJCQlMaW5rRWRpdFBhcnQgbGluayA9IChMaW5rRWRpdFBhcnQpIHNvdXJjZUxpbmtzLmdldChiKTsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCB0YXJnZXQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgbGluawotCQkJCQkJCS5nZXRUYXJnZXQoKTsKLQkJCQkJaW50IHcgPSB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCQkJCWludCBldyA9IGVwLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJaWYgKHcgPiBldykgewotCQkJCQkJUG9pbnQgbG9jYXRpb24gPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJLmdldExvY2F0aW9uKCk7Ci0JCQkJCQlsb2NhdGlvbi54Kz0ody1ldykvMjsKLQkJCQkJCUNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKCgoTm9kZSkgZXAKLQkJCQkJCQkJLmdldE1vZGVsKCkpLCBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSwgdyk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJaW50IGggPSBlcC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQkJZXAuZ2V0RmlndXJlKCkKLQkJCQkJCQkJLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbih3LCBoKSk7Ci0JCQkJCQllcC5nZXRGaWd1cmUoKS5zZXRTaXplKG5ldyBEaW1lbnNpb24odywgaCkpOwotCQkJCQl9Ci0JCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJLnNldFNlbGVjdGlvbigKLQkJCQkJCQkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7IGVwLAotCQkJCQkJCQkJCQl0YXJnZXQgfSkpOwotCQkJCQlJQWN0aW9uIHZhbGlnbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX1ZFUlRfRklSU1RfU0VMRUNURUQpOwotCQkJCQl2YWxpZ24ucnVuKCk7Ci0JCQkJfQotCQkJfQotCQkJTGlzdCB0YXJnZXRMaW5rcyA9IGVwLmdldFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQlpZiAodGFyZ2V0TGlua3Muc2l6ZSgpID4gMCkgewotCQkJCWZvciAoaW50IGIgPSAwOyBiIDwgdGFyZ2V0TGlua3Muc2l6ZSgpOyBiKyspIHsKLQkJCQkJTGlua0VkaXRQYXJ0IGxpbmsgPSAoTGlua0VkaXRQYXJ0KSB0YXJnZXRMaW5rcy5nZXQoYik7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgc291cmNlID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGxpbmsKLQkJCQkJCQkuZ2V0U291cmNlKCk7Ci0JCQkJCWludCB3ID0gc291cmNlLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoOwotCQkJCQlpbnQgZXcgPSBlcC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQkJCWlmICh3ID4gZXcpIHsKLQkJCQkJCUNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKCgoTm9kZSkgZXAKLQkJCQkJCQkJLmdldE1vZGVsKCkpLCBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSwgdyk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJaW50IGggPSBlcC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQkJZXAuZ2V0RmlndXJlKCkKLQkJCQkJCQkJLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbih3LCBoKSk7Ci0JCQkJCQllcC5nZXRGaWd1cmUoKS5zZXRTaXplKG5ldyBEaW1lbnNpb24odywgaCkpOwotCQkJCQl9Ci0JCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJLnNldFNlbGVjdGlvbigKLQkJCQkJCQkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7IGVwLAotCQkJCQkJCQkJCQlzb3VyY2UgfSkpOwotCQkJCQlJQWN0aW9uIHZhbGlnbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX1ZFUlRfRklSU1RfU0VMRUNURUQpOwotCQkJCQl2YWxpZ24ucnVuKCk7Ci0JCQkJfQotCQkJfQotCQkJcGFyZW50LmdldEZpZ3VyZSgpLmdldExheW91dE1hbmFnZXIoKS5sYXlvdXQocGFyZW50LmdldEZpZ3VyZSgpKTsKLQkJCWlmIChlcCBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJCUxpc3QgY2hpbGRyZW4gPSBlcC5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoaW50IGQgPSAwOyBkIDwgY2hpbGRyZW4uc2l6ZSgpOyBkKyspIHsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuCi0JCQkJCQkJLmdldChkKTsKLQkJCQkJcmVzZXRTaXplcyhwLCBlcCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCSovCi0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBkb2VzIGEgdmVydGljYWwgYWxpZ25tZW50IG9mIGFsbCBub2RlcyB3aXRoIGxpbmtzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFuVXAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCkgewotCQlpZiAoIShlcCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpKSB7Ci0JCQlMaXN0IHNvdXJjZUxpbmtzID0gZXAuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCWlmIChzb3VyY2VMaW5rcy5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChpbnQgYiA9IDA7IGIgPCBzb3VyY2VMaW5rcy5zaXplKCk7IGIrKykgewotCQkJCQlMaW5rRWRpdFBhcnQgbGluayA9IChMaW5rRWRpdFBhcnQpIHNvdXJjZUxpbmtzLmdldChiKTsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCB0YXJnZXQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgbGluawotCQkJCQkJCS5nZXRUYXJnZXQoKTsKLQkJCQkJaW50IHcgPSB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCQkJCWludCBldyA9IGVwLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJaWYgKHcgPCBldykgewotCQkJCQkJQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoKChOb2RlKSBlcAotCQkJCQkJCQkuZ2V0TW9kZWwoKSksIHRhcmdldC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSwgdyk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJaW50IGggPSB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCQkJCXRhcmdldC5nZXRGaWd1cmUoKQotCQkJCQkJCQkuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKHcsIGgpKTsKLQkJCQkJCXRhcmdldC5nZXRGaWd1cmUoKS5zZXRTaXplKG5ldyBEaW1lbnNpb24odywgaCkpOwotCQkJCQl9Ci0JCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJLnNldFNlbGVjdGlvbigKLQkJCQkJCQkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7IGVwLAotCQkJCQkJCQkJCQl0YXJnZXQgfSkpOwotCQkJCQlJQWN0aW9uIHZhbGlnbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX1ZFUlRfRklSU1RfU0VMRUNURUQpOwotCQkJCQl2YWxpZ24ucnVuKCk7Ci0JCQkJfQotCQkJfQotCQkJTGlzdCB0YXJnZXRMaW5rcyA9IGVwLmdldFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQlpZiAodGFyZ2V0TGlua3Muc2l6ZSgpID4gMCkgewotCQkJCWZvciAoaW50IGIgPSAwOyBiIDwgdGFyZ2V0TGlua3Muc2l6ZSgpOyBiKyspIHsKLQkJCQkJTGlua0VkaXRQYXJ0IGxpbmsgPSAoTGlua0VkaXRQYXJ0KSB0YXJnZXRMaW5rcy5nZXQoYik7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgc291cmNlID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGxpbmsKLQkJCQkJCQkuZ2V0U291cmNlKCk7Ci0JCQkJCWludCB3ID0gc291cmNlLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoOwotCQkJCQlpbnQgZXcgPSBlcC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQkJCWlmICh3IDwgZXcpIHsKLQkJCQkJCUNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKCgoTm9kZSkgZXAKLQkJCQkJCQkJLmdldE1vZGVsKCkpLCBzb3VyY2UuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJCQkJLmdldExvY2F0aW9uKCksIHcpOwotCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCWludCBoID0gc291cmNlLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQkJCQlzb3VyY2UuZ2V0RmlndXJlKCkKLQkJCQkJCQkJLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbih3LCBoKSk7Ci0JCQkJCQlzb3VyY2UuZ2V0RmlndXJlKCkuc2V0U2l6ZShuZXcgRGltZW5zaW9uKHcsIGgpKTsKLQkJCQkJfQotCQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkJCS5zZXRTZWxlY3Rpb24oCi0JCQkJCQkJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10geyBlcCwKLQkJCQkJCQkJCQkJc291cmNlIH0pKTsKLQkJCQkJSUFjdGlvbiB2YWxpZ24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQkJCQlEaWFncmFtQWN0aW9uU2VydmljZS5BTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEKTsKLQkJCQkJdmFsaWduLnJ1bigpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChlcCBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJCUxpc3QgY2hpbGRyZW4gPSBlcC5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoaW50IGQgPSAwOyBkIDwgY2hpbGRyZW4uc2l6ZSgpOyBkKyspIHsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuCi0JCQkJCQkJLmdldChkKTsKLQkJCQkJY2xlYW5VcChwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgRm9yIGF1dG8tbGF5b3V0LCBuZWVkIHRvIGFkanVzdCBjb25uZWN0aW9uKG9yIGxpbmspIGxlbmd0aCwgYmFzZWQgb24KLQkgKiAgY29ubmVjdGluZyBlZGl0cGFydHMoZmlndXJlcykuCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHJlZHVjZUxpbmtMZW5ndGgoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwYXJ0KSB7Ci0JCWJvb2xlYW4gbW92ZWQgPSBmYWxzZTsKLQkJLy8gb25seSBtb3ZlIG5ldyBXb3JrUHJvZHVjdENvbXBvc2l0ZSBlbGVtZW50cwotCQlpZiAocGFydCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgbGlua2VkUGFydCA9IG51bGw7Ci0JCQlpbnQgcG9zaXRpb24gPSBQb3NpdGlvbkNvbnN0YW50cy5DRU5URVI7Ci0JCQkvLyBpcyB0aGlzIGVsZW1lbnQgbGlua2VkIHRvIGFub3RoZXIgaXRlbT8KLQkJCWlmIChwYXJ0LmdldFRhcmdldENvbm5lY3Rpb25zKCkuc2l6ZSgpID4gMCkgewotCQkJCWxpbmtlZFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgKChMaW5rRWRpdFBhcnQpIHBhcnQKLQkJCQkJCS5nZXRUYXJnZXRDb25uZWN0aW9ucygpLmdldCgwKSkuZ2V0U291cmNlKCk7Ci0JCQkJcG9zaXRpb24gPSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSDsKLQkJCX0gZWxzZSBpZiAocGFydC5nZXRTb3VyY2VDb25uZWN0aW9ucygpLnNpemUoKSA+IDApIHsKLQkJCQlsaW5rZWRQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpICgoTGlua0VkaXRQYXJ0KSBwYXJ0Ci0JCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKS5nZXQoMCkpLmdldFRhcmdldCgpOwotCQkJCXBvc2l0aW9uID0gUG9zaXRpb25Db25zdGFudHMuU09VVEg7Ci0JCQl9Ci0JCQlpZiAobGlua2VkUGFydCAhPSBudWxsKSB7Ci0JCQkJaWYgKCEobGlua2VkUGFydC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpIHsKLQkJCQkJbGlua2VkUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rZWRQYXJ0Ci0JCQkJCQkJLmdldFBhcmVudCgpOwotCQkJCX0KLQkJCQkvLyBnZXQgdGhlIHBhcnQncyBwb3NpdGlvbgotCQkJCVJlY3RhbmdsZSBwYXJ0Qm91bmRzID0gcGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkvLyBnZXQgdGhlIGxpbmtlZCBwYXJ0J3MgcG9zaXRpb24KLQkJCQlSZWN0YW5nbGUgbGlua2VkUGFydEJvdW5kcyA9IGxpbmtlZFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJLy8gZGV0ZXJtaW5lIGluIHdoaWNoIGRpcmVjdGlvbiBpcyB0aGUgbGlua2VkIHBhcnQKLQkJCQkvLyBpbnQgcG9zaXRpb24gPSBwYXJ0Qm91bmRzLmdldFBvc2l0aW9uKGxpbmtlZFBhcnRCb3VuZHMKLQkJCQkvLyAuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJLy8gYXNzdW1lIGl0IGlzIGJlbG93IHVzLCBzbyB0aGlzIHBhcnQgbW92ZXMgdXAKLQkJCQlpbnQgZGlyZWN0aW9uID0gLTE7Ci0JCQkJaWYgKChwb3NpdGlvbiAmIFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKSA9PSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSAotCQkJCQkJfHwgKHBvc2l0aW9uICYgUG9zaXRpb25Db25zdGFudHMuQ0VOVEVSKSA9PSBQb3NpdGlvbkNvbnN0YW50cy5DRU5URVIpIHsKLQkJCQkJLy8gYWJvdmUgdXMsIG1vdmUgZG93bgotCQkJCQlkaXJlY3Rpb24gPSAxOwotCQkJCX0KLQkJCQkvLyBzZXQgbmV3IGJvdW5kcyBmb3IgdGhlIHBhcnQgc28gdGhhdCBpdCBzaXRlcyBqdXN0IG91dHNpZGUgb2YKLQkJCQkvLyB0aGUgbGlua2VkIHBhcnQKLQkJCQlSZWN0YW5nbGUgdGVzdEJvdW5kcyA9IHBhcnRCb3VuZHMuZ2V0Q29weSgpOwotCQkJCWlmIChkaXJlY3Rpb24gPT0gMSkgewotCQkJCQl0ZXN0Qm91bmRzLnkgPSBsaW5rZWRQYXJ0Qm91bmRzLnkgKyBsaW5rZWRQYXJ0Qm91bmRzLmhlaWdodAotCQkJCQkJCSsgVkVSVF9QSVhfUEFERElORzsKLQkJCQl9IGVsc2UgewotCQkJCQl0ZXN0Qm91bmRzLnkgPSBsaW5rZWRQYXJ0Qm91bmRzLnkgLSBWRVJUX1BJWF9QQURESU5HCi0JCQkJCQkJLSBwYXJ0Qm91bmRzLmhlaWdodDsKLQkJCQl9Ci0JCQkJLy8gc2V0IHRoZSBuZXcgbG9jYXRpb24gZm9yIHRoZSBwYXJ0IGluIHRoZSBtb2RlbAotCQkJCVBvaW50IG5wID0gbmV3IFBvaW50KHRlc3RCb3VuZHMueCwgdGVzdEJvdW5kcy55KTsKLQkJCQlwYXJ0LmdldEZpZ3VyZSgpLnNldExvY2F0aW9uKG5wKTsKLQkJCQlDb21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgoTm9kZSkgcGFydC5nZXRNb2RlbCgpLCBucCwKLQkJCQkJCXBhcnRCb3VuZHMud2lkdGgpOwotCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vdmVkOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0byBhZGp1c3QgdGhlIHNpemUgb2YgZWRpdHBhcnQuICAKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRqdXN0U2l6ZShBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwKSB7Ci0JCWlmIChlcCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCWFkanVzdFNpemUoKE5vZGVDb250YWluZXJFZGl0UGFydCkgZXAsIDEpOwotCQl9Ci0JCS8vIEJlbG93IENvZGUgZ2VuZXJpYyBOb2RlQ29udGFpbmVyRWRpdFBhcnQgbW9kaWZpY2F0aW9uLgotCQllbHNlIGlmIChlcCBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJLy8gVGhpcyBpcyB0byBhbGxvdyB1c2VyIGN1c3RvbWl6YWJsZSAKLS8vCQkJU3RyaW5nIGNvdW50ID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0vLwkJCQkJCQkuZ2V0U3RyaW5nKFRlbXBsYXRlQ29uc3RhbnRzLkFERF9ST0xFX1RBU0tTX0NPVU5UKTsKLS8vCQkJaWYoY291bnQgIT0gbnVsbCB8fCBjb3VudCAhPSAiIil7Ci0vLwkJCQlpbnQgaSA9IEludGVnZXIucGFyc2VJbnQoY291bnQpOwotLy8JCQkJaWYoaSA+IDApewotLy8JCQkJCWFkanVzdFNpemUoKE5vZGVDb250YWluZXJFZGl0UGFydCkgZXAsIGkpOwotLy8JCQkJfQotLy8JCQl9ZWxzZXsKLS8vCQkJCWFkanVzdFNpemUoKE5vZGVDb250YWluZXJFZGl0UGFydCkgZXAsIDUwKTsKLS8vCQkJfQotCQkJYWRqdXN0U2l6ZSgoTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSBlcCwgNTApOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgSE9SSVpfUElYX1BBRERJTkcgPSAzMDsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IFZFUlRfUElYX1BBRERJTkcgPSAyMDsKLQotCS8qKgotCSAqIEFkanVzdHMgdGhlIHNpemUgb2YgQ29udGFpbmVyRWRpdFBhcnQgdG8gYWNjb21vZGF0ZSBudW1iZXIgb2YgZWRpdHBhcnRzIGluIGEgcm93LAotCSAqIHB1c2ggdGhlIHJlbWFpbmluZyB0aGUgZWRpdHBhcnRzIGluIHR3byBzZWNvbmQgcm93LiAKLQkgKiBUaGlzIGlzIHVzZWZ1bCBmb3Ige0BsaW5rIFRvb2xiYXJMYXlvdXR9Ci0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkanVzdFNpemUoTm9kZUNvbnRhaW5lckVkaXRQYXJ0IGVwLCBpbnQgaG9yaXpDb3VudCkgewotCQlpbnQgcmVxdWlyZWRXaWR0aCA9IDA7Ci0JCWludCByb3dNYXhIZWlnaHQgPSAwOwotCQlpbnQgcm93cyA9IDA7Ci0JCWludCB3aWR0aFN1bSA9IDA7Ci0JCWludCBoZWlnaHRTdW0gPSAwOwotCQlpbnQgY29sdW1uID0gMDsKLQkJLy9pbnQgb3JpZ2luYWxXaWR0aCA9IGVwLmdldEZpZ3VyZSgpLmdldFNpemUoKS53aWR0aDsKLQkJTGlzdCBjaGlsZHJlbiA9IGVwLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IHAgPSAwOyBwIDwgY2hpbGRyZW4uc2l6ZSgpOykgewotCQkJaWYgKGNvbHVtbiA9PSAwKSB7Ci0JCQkJcm93cysrOwotCQkJfQotCQkJaWYgKGNvbHVtbiA8IGhvcml6Q291bnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGNoaWxkID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuCi0JCQkJCQkuZ2V0KHApOwotCQkJCURpbWVuc2lvbiBkID0gY2hpbGQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpOwotCQkJCXdpZHRoU3VtICs9IGQud2lkdGg7Ci0JCQkJaWYgKGQuaGVpZ2h0ID4gcm93TWF4SGVpZ2h0KSB7Ci0JCQkJCXJvd01heEhlaWdodCA9IGQuaGVpZ2h0OwotCQkJCX0KLQkJCQlwKys7Ci0JCQkJY29sdW1uKys7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh3aWR0aFN1bSA+IHJlcXVpcmVkV2lkdGgpIHsKLQkJCQkJcmVxdWlyZWRXaWR0aCA9IHdpZHRoU3VtOwotCQkJCX0KLQkJCQloZWlnaHRTdW0gKz0gcm93TWF4SGVpZ2h0OwotCQkJCXJvd01heEhlaWdodCA9IDA7Ci0JCQkJd2lkdGhTdW0gPSAwOwotCQkJCWNvbHVtbiA9IDA7Ci0JCQl9Ci0JCX0KLQkJaWYgKHdpZHRoU3VtID4gcmVxdWlyZWRXaWR0aCkgewotCQkJcmVxdWlyZWRXaWR0aCA9IHdpZHRoU3VtOwotCQl9Ci0JCWhlaWdodFN1bSArPSByb3dNYXhIZWlnaHQ7Ci0JCXJlcXVpcmVkV2lkdGggKz0gSE9SSVpfUElYX1BBRERJTkcKLQkJCQkqIE1hdGgubWluKGhvcml6Q291bnQsIGNoaWxkcmVuLnNpemUoKSk7Ci0JCWludCByZXF1aXJlZEhlaWdodCA9IGhlaWdodFN1bSArIChWRVJUX1BJWF9QQURESU5HICogcm93cyk7Ci0JCUNvbW1hbmQgY21kID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoKChOb2RlKSBlcC5nZXRNb2RlbCgpKSwgZXAKLQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0TG9jYXRpb24oKSwgcmVxdWlyZWRXaWR0aCk7Ci0JCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY21kKTsKLQkJZXAuZ2V0RmlndXJlKCkuc2V0UHJlZmVycmVkU2l6ZSgKLQkJCQluZXcgRGltZW5zaW9uKHJlcXVpcmVkV2lkdGgsIHJlcXVpcmVkSGVpZ2h0KSk7Ci0JCSgoTm9kZSkgZXAuZ2V0TW9kZWwoKSkuc2V0SGVpZ2h0KHJlcXVpcmVkSGVpZ2h0KTsKLQkJZXAuZ2V0RmlndXJlKCkuc2V0U2l6ZShuZXcgRGltZW5zaW9uKHJlcXVpcmVkV2lkdGgsIHJlcXVpcmVkSGVpZ2h0KSk7Ci0JCQllcC5nZXRGaWd1cmUoKS5nZXRMYXlvdXRNYW5hZ2VyKCkubGF5b3V0KGVwLmdldEZpZ3VyZSgpKTsKLQkJLy8gYWZ0ZXIgbGF5b3V0LCBjaGVjayB0aGUgYm90dG9tLW1vc3QgY2hpbGQgZmlndXJlIGFnYWluc3QgdGhlIGJvdHRvbQotCQkvLyBvZiB0aGUgY29udGFpbmVyLCBhZGp1c3QgdGhlIGJvdHRvbSBvZiB0aGUgY29udGFpbmVyIGlzIG5lY2Vzc2FyeQotCQlpZiAoZXAgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0ICYmIGNoaWxkcmVuLnNpemUoKSA+IDApIHsKLQkJCUdyYXBoaWNhbEVkaXRQYXJ0IGxhc3QgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuLmdldChjaGlsZHJlbgotCQkJCQkuc2l6ZSgpIC0gMSk7Ci0JCQlQb2ludCBjaGlsZEJvdHRvbSA9IGxhc3QuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Qm90dG9tKCk7Ci0JCQlQb2ludCBwYXJlbnRCb3R0b20gPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRCb3R0b20oKTsKLQkJCWludCBkZWx0YSA9IHBhcmVudEJvdHRvbS55IC0gY2hpbGRCb3R0b20ueSAtIChWRVJUX1BJWF9QQURESU5HIC8gMik7Ci0JCQllcC5nZXRGaWd1cmUoKS5zZXRQcmVmZXJyZWRTaXplKAotCQkJCQluZXcgRGltZW5zaW9uKHJlcXVpcmVkV2lkdGgsIHJlcXVpcmVkSGVpZ2h0IC0gZGVsdGEpKTsKLQkJCSgoTm9kZSkgZXAuZ2V0TW9kZWwoKSkuc2V0SGVpZ2h0KHJlcXVpcmVkSGVpZ2h0IC0gZGVsdGEpOwotCQkJZXAuZ2V0RmlndXJlKCkuc2V0U2l6ZSgKLQkJCQkJbmV3IERpbWVuc2lvbihyZXF1aXJlZFdpZHRoLCByZXF1aXJlZEhlaWdodCAtIGRlbHRhKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbnVtZXJhdGVDb25uZWN0ZWRQYXJ0cyhBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQsCi0JCQlMaXN0IGNvbm5lY3RlZCkgewotCQkvLyBvbmx5IGFkZCBwYXJ0cyBkaXJlY3RseSBvbiB0aGUgZGlhZ3JhbSBzdXJmYWNlCi0JCWlmICghY29ubmVjdGVkLmNvbnRhaW5zKHBhcnQpKSB7Ci0JCQlpZiAoIShwYXJ0LmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSkgewotCQkJCWlmICghY29ubmVjdGVkLmNvbnRhaW5zKHBhcnQuZ2V0UGFyZW50KCkpKSB7Ci0JCQkJCWNvbm5lY3RlZC5hZGQocGFydC5nZXRQYXJlbnQoKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQljb25uZWN0ZWQuYWRkKHBhcnQpOwotCQkJfQotCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBsaW5rZWRQYXJ0ID0gbnVsbDsKLQkJCUxpc3QgY2hpbGRyZW4gPSBwYXJ0LmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IGNoaWxkcmVuLnNpemUoKTsgeCsrKSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuCi0JCQkJCQkuZ2V0KHgpOwotCQkJCWVudW1lcmF0ZUNvbm5lY3RlZFBhcnRzKHAsIGNvbm5lY3RlZCk7Ci0JCQl9Ci0JCQkvLyBpcyB0aGlzIGVsZW1lbnQgbGlua2VkIHRvIGFub3RoZXIgaXRlbT8KLQkJCWZvciAoaW50IHggPSAwOyB4IDwgcGFydC5nZXRUYXJnZXRDb25uZWN0aW9ucygpLnNpemUoKTsgeCsrKSB7Ci0JCQkJbGlua2VkUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSAoKExpbmtFZGl0UGFydCkgcGFydAotCQkJCQkJLmdldFRhcmdldENvbm5lY3Rpb25zKCkuZ2V0KHgpKS5nZXRTb3VyY2UoKTsKLQkJCQllbnVtZXJhdGVDb25uZWN0ZWRQYXJ0cyhsaW5rZWRQYXJ0LCBjb25uZWN0ZWQpOwotCQkJfQotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBwYXJ0LmdldFNvdXJjZUNvbm5lY3Rpb25zKCkuc2l6ZSgpOyB4KyspIHsKLQkJCQlsaW5rZWRQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpICgoTGlua0VkaXRQYXJ0KSBwYXJ0Ci0JCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKS5nZXQoeCkpLmdldFRhcmdldCgpOwotCQkJCWVudW1lcmF0ZUNvbm5lY3RlZFBhcnRzKGxpbmtlZFBhcnQsIGNvbm5lY3RlZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBmaW5kcyBzaW5nbGUgZWxlbWVudHMgYW5kIGdyb3VwcyBvZiBlbGVtZW50cywgYW5kIHBvc2l0aW9ucwotCSAqIHRoZW0gc3RhcnRpbmcgZnJvbSB0aGUgdG9wIG9mIHRoZSBkaWFncmFtIGFuZCBjb250aW51b3VzbHkgZG93biB0aGUgcGFnZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFja0RpYWdyYW0oKSB7Ci0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW0gPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJLmdldENvbnRlbnRzKCk7Ci0JCS8vIHN0YXJ0IGF0IHRoZSB0b3Agb2YgdGhlIGRpYWdyYW0KLQkJLy8gRGltZW5zaW9uIGRpYWdyYW1TaXplID0gZGlhZ3JhbS5nZXRGaWd1cmUoKS5nZXRTaXplKCk7Ci0JCS8vIG5vIG5ldyBzaGFwZXMgY2FuIGJlIG1vdmVkIGFib3ZlIHRoaXMgeS1heGlzIHZhbHVlCi0JCWludCByZXNlcnZlZCA9IDA7Ci0JCS8vIHRoZXNlIGFyZSBlbGVtZW50cyB3aXRob3V0IGNvbm5lY3Rpb25zCi0JCUxpc3Qgc3RyYWdnbGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gdGhlc2UgYXJlIGdyb3VwcyBvZiBlbGVtZW50cyBjb25uZWN0ZWQgd2l0aCBsaW5rcwotCQlMaXN0IGdyb3VwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gdGhlc2UgYXJlIHRvcCBsZXZlbCBwYXJ0cyBvbiB0aGUgZGlhZ3JhbSB0aGF0IGhhdmUgYmVlbiBhZGRlZAotCQlMaXN0IGRpYWdyYW1QYXJ0cyA9IGRpYWdyYW0uZ2V0UmVjZW50bHlBZGRlZFBhcnRzKCk7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgZGlhZ3JhbVBhcnRzLnNpemUoKTsgeCsrKSB7Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZGlhZ3JhbVBhcnRzCi0JCQkJCS5nZXQoeCk7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBnID0gMDsgZyA8IGdyb3Vwcy5zaXplKCkgJiYgZm91bmQgPT0gZmFsc2U7IGcrKykgewotCQkJCUxpc3QgZ3JvdXAgPSAoTGlzdCkgZ3JvdXBzLmdldChnKTsKLQkJCQlpZiAoZ3JvdXAuY29udGFpbnMocCkpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKSB7Ci0JCQkJTGlzdCBjb25uZWN0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZW51bWVyYXRlQ29ubmVjdGVkUGFydHMocCwgY29ubmVjdGVkKTsKLQkJCQlpZiAoY29ubmVjdGVkLnNpemUoKSA9PSAxKSB7Ci0JCQkJCXN0cmFnZ2xlcnMuYWRkKHApOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWdyb3Vwcy5hZGQoY29ubmVjdGVkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gcHJvY2VzcyBlYWNoIGdyb3VwIGNsb3Nlc3QgdG8gdGhlIHRvcCAobWluIHkgdmFsdWUpCi0JCXdoaWxlIChncm91cHMuc2l6ZSgpID4gMCkgewotCQkJTGlzdCB0b3AgPSAoTGlzdCkgZ3JvdXBzLmdldCgwKTsKLQkJCWludCB0b3BZID0gZ2V0VmVydGljYWxNaW5QYXJ0KHRvcCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueTsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgZ3JvdXBzLnNpemUoKTsgeCsrKSB7Ci0JCQkJTGlzdCBnID0gKExpc3QpIGdyb3Vwcy5nZXQoeCk7Ci0JCQkJaW50IHkgPSBnZXRWZXJ0aWNhbE1pblBhcnQoZykuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueTsKLQkJCQlpZiAoeSA8IHRvcFkpIHsKLQkJCQkJdG9wID0gZzsKLQkJCQkJdG9wWSA9IHk7Ci0JCQkJfQotCQkJfQotCQkJaW50IGxpbWl0ID0gcmVzZXJ2ZWQgKyAxOwotCQkJaW50IHZlcnRpY2FsRGVsdGEgPSBsaW1pdCAtIHRvcFk7Ci0JCQlpbnQgbGVmdFggPSBnZXRIb3Jpem9udGFsTWluUGFydCh0b3ApLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLng7Ci0JCQlpbnQgaG9yaXpvbnRhbERlbHRhID0gSE9SSVpfUElYX1BBRERJTkcgLSBsZWZ0WDsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgdG9wLnNpemUoKTsgeCsrKSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHRvcAotCQkJCQkJLmdldCh4KTsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQlDaGFuZ2VCb3VuZHNDb21tYW5kIGNiYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKChOb2RlKSBwCi0JCQkJCQkuZ2V0TW9kZWwoKSwgbmV3IFBvaW50KGJvdW5kcy54ICsgaG9yaXpvbnRhbERlbHRhLAotCQkJCQkJYm91bmRzLnkgKyB2ZXJ0aWNhbERlbHRhKSwgYm91bmRzLndpZHRoKTsKLQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNiYyk7Ci0JCQkJcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbigKLQkJCQkJCW5ldyBQb2ludChib3VuZHMueCArIGhvcml6b250YWxEZWx0YSwgYm91bmRzLnkKLQkJCQkJCQkJKyB2ZXJ0aWNhbERlbHRhKSk7Ci0JCQl9Ci0JCQlpbnQgYm90dG9tWSA9IGdldFZlcnRpY2FsTWF4UGFydCh0b3ApLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCS5ib3R0b20oKTsKLQkJCXJlc2VydmVkID0gYm90dG9tWSArIChWRVJUX1BJWF9QQURESU5HICogMik7Ci0JCQlncm91cHMucmVtb3ZlKHRvcCk7Ci0JCX0KLQkJaW50IG5leHQgPSBIT1JJWl9QSVhfUEFERElORzsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBzdHJhZ2dsZXJzLnNpemUoKTsgeCsrKSB7Ci0JCQlpbnQgbGltaXQgPSByZXNlcnZlZCArIDE7Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgc3RyYWdnbGVycwotCQkJCQkuZ2V0KHgpOwotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQlDaGFuZ2VCb3VuZHNDb21tYW5kIGNiYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKChOb2RlKSBwCi0JCQkJCS5nZXRNb2RlbCgpLCBuZXcgUG9pbnQobmV4dCwgbGltaXQpLCBib3VuZHMud2lkdGgpOwotCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjYmMpOwotCQkJcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbihuZXcgUG9pbnQobmV4dCwgbGltaXQpKTsKLQkJCW5leHQgKz0gYm91bmRzLndpZHRoICsgSE9SSVpfUElYX1BBRERJTkc7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZ2V0VmVydGljYWxNaW5QYXJ0KExpc3QgcGFydHMpIHsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCByYyA9IHBhcnRzLnNpemUoKSA+IDAgPyAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgcGFydHMKLQkJCQkuZ2V0KDApCi0JCQkJOiBudWxsOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IHBhcnRzLnNpemUoKTsgeCsrKSB7Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgcGFydHMKLQkJCQkJLmdldCh4KTsKLQkJCWlmIChwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnkgPCByYy5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55KSB7Ci0JCQkJcmMgPSBwOwotCQkJfQotCQl9Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlwcml2YXRlIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZ2V0SG9yaXpvbnRhbE1pblBhcnQoTGlzdCBwYXJ0cykgewotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHJjID0gcGFydHMuc2l6ZSgpID4gMCA/IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCS5nZXQoMCkKLQkJCQk6IG51bGw7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgcGFydHMuc2l6ZSgpOyB4KyspIHsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCQkuZ2V0KHgpOwotCQkJaWYgKHAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueCA8IHJjLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLngpIHsKLQkJCQlyYyA9IHA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJjOwotCX0KLQotCXByaXZhdGUgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBnZXRWZXJ0aWNhbE1heFBhcnQoTGlzdCBwYXJ0cykgewotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHJjID0gcGFydHMuc2l6ZSgpID4gMCA/IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCS5nZXQoMCkKLQkJCQk6IG51bGw7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgcGFydHMuc2l6ZSgpOyB4KyspIHsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCQkuZ2V0KHgpOwotCQkJaWYgKHAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuYm90dG9tKCkgPiByYy5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkuYm90dG9tKCkpIHsKLQkJCQlyYyA9IHA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0VuZE5vZGVFZGl0UGFydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0VuZE5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDRiZDk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9FbmROb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5FbmROb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci0KLS8qKgotICogRWRpdFBhcnQgZm9yIEZpbmFsKG9yIEVuZCkgbm9kZSAKLSAqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRW5kTm9kZUVkaXRQYXJ0IGV4dGVuZHMgTm9kZUVkaXRQYXJ0IHsKLQotCXB1YmxpYyBFbmROb2RlRWRpdFBhcnQoVHlwZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZURpcmVjdEVkaXRQb2xpY3koKQotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0UG9saWN5IGNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjY3JlYXRlRmlndXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUVuZE5vZGVGaWd1cmUgZiA9IG5ldyBFbmROb2RlRmlndXJlKCk7Ci0JCWYuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLQkJZi5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMucmVkKTsKLQkJZi5zZXRTaXplKDI0LCAyNCk7Ci0JCXJldHVybiBmOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0Q2VsbEVkaXRvckxvY2F0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9GcmVlVGV4dENlbGxFZGl0b3JMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIwYTkyZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0Q2VsbEVkaXRvckxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuRnJlZVRleHRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiAKLSAqIENvbnN0cmFpbnQgZm9yIHBsYWNpbmcgRnJlZVRleHQgQ2VsbCBFZGl0b3IuCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGcmVlVGV4dENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IgewotCi0JSUZpZ3VyZSBmaWd1cmU7Ci0JLyoKLQkgKiBDcmVhdGVzIGEgbmV3IEZyZWVUZXh0Q2VsbEVkaXRvckxvY2F0b3IgCi0JICogCi0JICogQHBhcmFtIGxhYmVsIHRoZSBMYWJlbAotCSAqLwotCXB1YmxpYyBGcmVlVGV4dENlbGxFZGl0b3JMb2NhdG9yKElGaWd1cmUgZmlndXJlKSB7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3IjcmVsb2NhdGUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2UpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlGcmVlVGV4dEZpZ3VyZSBmaWcgPSAoRnJlZVRleHRGaWd1cmUpZmlndXJlOwotCQlUZXh0IHRleHQgPSAoVGV4dCkgY2UuZ2V0Q29udHJvbCgpOwotCQlTdHJpbmcgbiA9IChTdHJpbmcpIGNlLmdldFZhbHVlKCk7Ci0JCUdDIGdjID0gbmV3IEdDKHRleHQpOwotCQlQb2ludCBzaXplID0gZ2MudGV4dEV4dGVudChuKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQlpZiAoc2l6ZS54ICE9IDApCi0JCQlzaXplID0gdGV4dC5jb21wdXRlU2l6ZShzaXplLngsIFNXVC5ERUZBVUxUKTsKLQkJdGV4dC5zZXRTaXplKHNpemUueCwgc2l6ZS55KTsKLQkJUmVjdGFuZ2xlIHRleHRCb3VuZHMgPSBuZXcgUmVjdGFuZ2xlKHRleHQuZ2V0Q2xpZW50QXJlYSgpLngsIHRleHQKLQkJCQkuZ2V0Q2xpZW50QXJlYSgpLnksIHRleHQuZ2V0Q2xpZW50QXJlYSgpLndpZHRoLCB0ZXh0Ci0JCQkJLmdldENsaWVudEFyZWEoKS5oZWlnaHQpOwotCQlSZWN0YW5nbGUgZmlnQm91bmRzID0gZmlnLmdldENsaWVudEFyZWEoKTsKLQkJZmlnLnRyYW5zbGF0ZVRvQWJzb2x1dGUoZmlnQm91bmRzKTsKLQkJaW50IGRlbHRhID0gKGZpZ0JvdW5kcy53aWR0aCAtIHRleHRCb3VuZHMud2lkdGgpIC8gMjsKLQkJaW50IHkgPSBmaWcuZ2V0VGV4dEZsb3dQYWdlKCkuZ2V0TG9jYXRpb24oKS55OwotCQl0ZXh0LnNldExvY2F0aW9uKGZpZ0JvdW5kcy54ICsgZGVsdGEsIHkpOwotCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZpZ3VyZShJRmlndXJlIGZpZ3VyZSkgewotCQl0aGlzLmZpZ3VyZSA9IGZpZ3VyZTsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmaWd1cmUuCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0RmlndXJlKCkgewotCQlyZXR1cm4gZmlndXJlOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0RGlyZWN0RWRpdE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9GcmVlVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlYjVkZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0RGlyZWN0RWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGRpcmVjdCBlZGl0IG9wZXJhdGlvbiBieSBjcmVhdGluZyBhbmQgbWFpbnRhaW5pbmcgdGhlIAotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcn0gYW5kIGV4ZWN1dGluZyB0aGUgcmVzdWx0aW5nIGNvbW1hbmQgaWYgCi0gKiB0aGUgY2VsbCBlZGl0b3IgdmFsdWUgaGFzIGNoYW5nZWQuIFNwZWNpZmljYWxseSBmb3IgRnJlZVRleHQuCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZyZWVUZXh0RGlyZWN0RWRpdE1hbmFnZXIgZXh0ZW5kcyBEaXJlY3RFZGl0TWFuYWdlciB7Ci0JCi0JLyoKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgVmVyaWZ5TGlzdGVuZXIgdmVyaWZ5TGlzdGVuZXI7Ci0JcHJpdmF0ZSBGb250IHNjYWxlZEZvbnQ7Ci0JcHJvdGVjdGVkIElGaWd1cmUgZmlndXJlOwotCQotCXB1YmxpYyBGcmVlVGV4dERpcmVjdEVkaXRNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwgQ2xhc3MgZWRpdG9yVHlwZSwgQ2VsbEVkaXRvckxvY2F0b3IgbG9jYXRvciwgSUZpZ3VyZSBmaWd1cmUpIHsKLQkJc3VwZXIoc291cmNlLCBlZGl0b3JUeXBlLCBsb2NhdG9yKTsKLQkJdGhpcy5maWd1cmUgPSBmaWd1cmU7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKCkgewotCQlicmluZ0Rvd24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjYnJpbmdEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicmluZ0Rvd24oYm9vbGVhbiBjaGVjaykgewotCQkvLyBUaGlzIG1ldGhvZCBtaWdodCBiZSByZS1lbnRlcmVkIHdoZW4gc3VwZXIuYnJpbmdEb3duKCkgaXMgY2FsbGVkLgotCQlGb250IGRpc3Bvc2VGb250ID0gc2NhbGVkRm9udDsKLQkJc2NhbGVkRm9udCA9IG51bGw7Ci0JCXN1cGVyLmJyaW5nRG93bigpOwotCQlpZiAoZGlzcG9zZUZvbnQgIT0gbnVsbCkKLQkJCWRpc3Bvc2VGb250LmRpc3Bvc2UoKTsKLQkJaWYgKGNoZWNrKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgZ2V0RWRpdFBhcnQoKS5nZXRNb2RlbCgpOwotCQkJU3RyaW5nIG5hbWUgPSAiIjsKLQkJCS8vIFRPRE86IFJlbW92ZSB0aGlzIGNoZWNrIAotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQlPYmplY3Qgd2JlbGVtZW50ID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQlpZiAod2JlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCSYmIFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZygoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KSkgewotCQkJCQluYW1lID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KTsKLQkJCQl9Ci0KLQkJCX0KLQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBUeXBlZE5vZGUgJiYgKChUeXBlZE5vZGUpbm9kZSkuZ2V0VHlwZSgpPT1UeXBlZE5vZGUuRlJFRV9URVhUKXsKLQkJCQlHcmFwaE5vZGUgZ25vZGUgPSAoKE5vZGUpIGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKSkuZ2V0R3JhcGhOb2RlKCk7Ci0JCQkJbmFtZSA9ICgoUHJvcGVydHkpIGdub2RlLmdldFByb3BlcnR5KCkuZ2V0KDApKS5nZXRWYWx1ZSgpOwotCQkJfQotCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJRGlzcGxheQotCQkJCQkJLmdldEN1cnJlbnQoKQotCQkJCQkJLmFzeW5jRXhlYygKLQkJCQkJCQkJbmV3IFByb21wdEVkaXQoCi0JCQkJCQkJCQkJKE5vZGVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSwKLQkJCQkJCQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuZXJyX25hbWVfZW1wdHkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjaW5pdENlbGxFZGl0b3IoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDZWxsRWRpdG9yKCkgewotCQlUZXh0Q2VsbEVkaXRvciBlZGl0b3IgPSAoVGV4dENlbGxFZGl0b3IpIGdldENlbGxFZGl0b3IoKTsKLQkJZWRpdG9yLnNldFN0eWxlKFNXVC5NVUxUSSk7Ci0JCVRleHQgdCA9IChUZXh0KSBlZGl0b3IuZ2V0Q29udHJvbCgpOwotCQl2ZXJpZnlMaXN0ZW5lciA9IG5ldyBWZXJpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLQkJCQlTdHJpbmcgb2xkVGV4dCA9IHRleHQuZ2V0VGV4dCgpOwotCQkJCVN0cmluZyBsZWZ0VGV4dCA9IG9sZFRleHQuc3Vic3RyaW5nKDAsIGV2ZW50LnN0YXJ0KTsKLQkJCQlTdHJpbmcgcmlnaHRUZXh0ID0gb2xkVGV4dC5zdWJzdHJpbmcoZXZlbnQuZW5kLCBvbGRUZXh0Ci0JCQkJCQkubGVuZ3RoKCkpOwotCQkJCUdDIGdjID0gbmV3IEdDKHRleHQpOwotCQkJCVBvaW50IHNpemUgPSBnYy50ZXh0RXh0ZW50KGxlZnRUZXh0ICsgZXZlbnQudGV4dCArIHJpZ2h0VGV4dCk7Ci0JCQkJZ2MuZGlzcG9zZSgpOwotCQkJCWlmIChzaXplLnggIT0gMCkKLQkJCQkJc2l6ZSA9IHRleHQuY29tcHV0ZVNpemUoc2l6ZS54LCBTV1QuREVGQVVMVCk7Ci0JCQkJZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKS5zZXRTaXplKHNpemUueCwgc2l6ZS55KTsKLQkJCX0KLQkJfTsKLQkJdC5hZGRWZXJpZnlMaXN0ZW5lcih2ZXJpZnlMaXN0ZW5lcik7Ci0JCVN0cmluZyBpbml0aWFsTGFiZWxUZXh0ID0gKChOb2RlRWRpdFBhcnQpIHRoaXMuZ2V0RWRpdFBhcnQoKSkKLQkJCQkuZ2V0RGlyZWN0RWRpdFRleHQoKTsKLQkJZWRpdG9yLnNldFZhbHVlKGluaXRpYWxMYWJlbFRleHQpOwotCQlGb250IGYgPSBmaWd1cmUuZ2V0Rm9udCgpOwotCQlGb250TWV0cmljcyBmbSA9IEZpZ3VyZVV0aWxpdGllcy5nZXRGb250TWV0cmljcyhmKTsKLQkJaW50IGggPSBmbS5nZXRIZWlnaHQoKTsKLQkJaW50IHcgPSBmbS5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci0JCXQuc2V0U2l6ZShpbml0aWFsTGFiZWxUZXh0Lmxlbmd0aCgpKncrMTAwLCBoKzUwKTsKLQkKLQkJaWYoZiAhPSBudWxsKQotCQkJdC5zZXRGb250KGYpOwotCQllbHNlCi0JCQl0LnNldEZvbnQoVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UKTsKLQkJdC5zZWxlY3RBbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciN1bmhvb2tMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVuaG9va0xpc3RlbmVycygpIHsKLQkJc3VwZXIudW5ob29rTGlzdGVuZXJzKCk7Ci0JCWlmIChnZXRDZWxsRWRpdG9yKCkgIT0gbnVsbCkgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCQlpZiAodmVyaWZ5TGlzdGVuZXIgIT0gbnVsbCkKLQkJCQl0ZXh0LnJlbW92ZVZlcmlmeUxpc3RlbmVyKHZlcmlmeUxpc3RlbmVyKTsKLQkJCXZlcmlmeUxpc3RlbmVyID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gdGV4dCBpcyB2YWxpZC4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIHR4dAotCSAqIEByZXR1cm4gbnVsbCBpZiB0aGUgZ2l2ZW4gdGV4dCBpcyB2YWxpZCwgYW4gZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjY29tbWl0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21taXQoKSB7Ci0JCVN0cmluZyBtc2cgPSB2YWxpZGF0ZSgoU3RyaW5nKSBnZXRDZWxsRWRpdG9yKCkuZ2V0VmFsdWUoKSk7Ci0JCWlmIChtc2cgIT0gbnVsbCkgewotCQkJYnJpbmdEb3duKGZhbHNlKTsKLQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYygKLQkJCQkJbmV3IFByb21wdEVkaXQoKE5vZGVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSwgbXNnKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuY29tbWl0KCk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFByb21wdEVkaXQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLQkJcHJpdmF0ZSBOb2RlRWRpdFBhcnQgcGFydDsKLQotCQlwcml2YXRlIFN0cmluZyBtc2c7Ci0KLQkJUHJvbXB0RWRpdChOb2RlRWRpdFBhcnQgcGFydCwgU3RyaW5nIG1zZykgewotCQkJdGhpcy5wYXJ0ID0gcGFydDsKLQkJCXRoaXMubXNnID0gbXNnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBEaWFncmFtVUlSZXNvdXJjZXMuZGlhZ3JhbV9lcnJvckRpYWxvZ190aXRsZV90ZXh0MDsgLy8kTk9OLU5MUy0xJAotCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZyk7IC8vJE5PTi1OTFMtMSQKLQkJCXBhcnQucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0RWRpdFBhcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9GcmVlVGV4dEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyMWMwNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5TZWxlY3RhYmxlTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgZGlyZWN0IGVkaXRpbmcsIGZyZWUgdGV4dCBwcm9wZXJ0aWVzIGNoYW5nZXMgbGlrZSBmb250LCBjb2xvciBhbmQgdGV4dC4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGcmVlVGV4dEVkaXRQYXJ0IGV4dGVuZHMgTm9kZUVkaXRQYXJ0IHsKLQotCXByaXZhdGUgRm9udCBmb250OwotCi0JcHJpdmF0ZSBDb2xvciBjb2xvcjsKLQotCXByaXZhdGUgRm9udERhdGEgZkRhdGE7Ci0KLQlwcml2YXRlIE5vZGVFZGl0UGFydCBwYXJ0OwotCi0JcHVibGljIEZyZWVUZXh0RWRpdFBhcnQoTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JCXBhcnQgPSB0aGlzOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJTGFiZWwgbCA9IG5ldyBTZWxlY3RhYmxlTGFiZWwoKTsKLQkJbC5zZXRMYWJlbEFsaWdubWVudChQb3NpdGlvbkNvbnN0YW50cy5MRUZUKTsKLQkJbC5zZXRUZXh0UGxhY2VtZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsKLQkJcmV0dXJuIGw7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotCQlpZiAoISgoTm9kZSkgZ2V0TW9kZWwoKSkuaXNSZWFkT25seSgpKSB7Ci0JCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJCWNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdFBvbGljeSBjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkgewotCQlyZXR1cm4gbmV3IERpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREaXJlY3RFZGl0Q29tbWFuZChEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG5ldyBDaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZChwYXJ0LCAoU3RyaW5nKSByZXF1ZXN0Ci0JCQkJCQkuZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCkpOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgdm9pZCBzaG93Q3VycmVudEVkaXRWYWx1ZShEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJSUZpZ3VyZSBmaWcgPSBnZXREaXJlY3RFZGl0RmlndXJlKCk7Ci0JCQkJaWYgKGZpZyBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQkJCSgoTGFiZWwpIGZpZykuc2V0VGV4dCgoU3RyaW5nKSByZXF1ZXN0LmdldENlbGxFZGl0b3IoKQotCQkJCQkJCS5nZXRWYWx1ZSgpKTsKLQkJCQkJZmlnLmdldFVwZGF0ZU1hbmFnZXIoKS5wZXJmb3JtVXBkYXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChOb2RlLmNsYXNzKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19UWVBFOgotCQkJcmVmcmVzaFZpc3VhbHMoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZWQobXNnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVF9FRElUCi0JCQkJJiYgISgoTm9kZSkgZ2V0TW9kZWwoKSkuaXNSZWFkT25seSgpKSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9IGVsc2UgewotCQkJc3VwZXIucGVyZm9ybVJlcXVlc3QocmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJSUZpZ3VyZSBmaWcgPSBnZXREaXJlY3RFZGl0RmlndXJlKCk7Ci0JCWlmIChmaWcgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJTGFiZWwgbCA9IChMYWJlbCkgZmlnOwotCQkJTGlzdCBhbGlzdCA9ICgoTm9kZSkgZ2V0TW9kZWwoKSkuZ2V0R3JhcGhOb2RlKCkuZ2V0UHJvcGVydHkoKTsKLQkJCVN0cmluZyBmb250TmFtZSA9IFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVF9OQU1FOwotCQkJaW50IGZvbnRTdHlsZSA9IFNXVC5OT1JNQUw7Ci0JCQlpbnQgZm9udEhlaWdodCA9IFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVF9TSVpFOwotCQkJaW50IGZvbnRSZWQgPSBTV1QuQ09MT1JfUkVEOwotCQkJaW50IGZvbnRCbHVlID0gU1dULkNPTE9SX0JMVUU7Ci0JCQlpbnQgZm9udEdyZWVuID0gU1dULkNPTE9SX0dSRUVOOwotCi0JCQlpZiAoYWxpc3Quc2l6ZSgpID4gMCkgewotCQkJCWZvciAoSXRlcmF0b3IgaW9yID0gYWxpc3QuaXRlcmF0b3IoKTsgaW9yLmhhc05leHQoKTspIHsKLQkJCQkJUHJvcGVydHkgcHJvcCA9IChQcm9wZXJ0eSkgaW9yLm5leHQoKTsKLQkJCQkJaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuR1JBUEhfTk9ERV9GUkVFX1RFWFQpKSB7Ci0JCQkJCQlsLnNldFRleHQocHJvcC5nZXRWYWx1ZSgpKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX05BTUUpKSB7Ci0JCQkJCQlmb250TmFtZSA9IHByb3AuZ2V0VmFsdWUoKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX1NUWUxFKSkgewotCQkJCQkJZm9udFN0eWxlID0gbmV3IEludGVnZXIocHJvcC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfSEVJR0hUKSkgewotCQkJCQkJZm9udEhlaWdodCA9IG5ldyBJbnRlZ2VyKHByb3AuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX1JFRCkpIHsKLQkJCQkJCWZvbnRSZWQgPSBuZXcgSW50ZWdlcihwcm9wLmdldFZhbHVlKCkpLmludFZhbHVlKCk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9CTFVFKSkgewotCQkJCQkJZm9udEJsdWUgPSBuZXcgSW50ZWdlcihwcm9wLmdldFZhbHVlKCkpLmludFZhbHVlKCk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9HUkVFTikpIHsKLQkJCQkJCWZvbnRHcmVlbiA9IG5ldyBJbnRlZ2VyKHByb3AuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbC5zZXRUZXh0KCgoTm9kZSkgZ2V0TW9kZWwoKSkuZ2V0R3JhcGhOb2RlKCkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCWlmIChmb250ICE9IG51bGwgJiYgIWZvbnQuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJZm9udC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlpZiAoY29sb3IgIT0gbnVsbCAmJiAhY29sb3IuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJY29sb3IuZGlzcG9zZSgpOwotCQkJfQotCQkJZkRhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIGZvbnRIZWlnaHQsIGZvbnRTdHlsZSk7Ci0JCQlmb250ID0gbmV3IEZvbnQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCksIGZEYXRhKTsKLQkJCWNvbG9yID0gbmV3IENvbG9yKG51bGwsIGZvbnRSZWQsIGZvbnRHcmVlbiwgZm9udEJsdWUpOwotCQkJbC5zZXRGb250KGZvbnQpOwotCi0JCQlsLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgY3JlYXRlRGlyZWN0RWRpdE1hbmFnZXIoKSB7Ci0JCUxhYmVsIGwgPSAoTGFiZWwpIGdldEZpZ3VyZSgpOwotCQlyZXR1cm4gbmV3IFZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyKHRoaXMsIFRleHRDZWxsRWRpdG9yLmNsYXNzLAotCQkJCW5ldyBMYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvcihsKSwgbCkgewotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHR4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JSUZpZ3VyZSBnZXREaXJlY3RFZGl0RmlndXJlKCkgewotCQlyZXR1cm4gZ2V0RmlndXJlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJaWYgKGZvbnQgIT0gbnVsbCAmJiAhZm9udC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWZvbnQuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChjb2xvciAhPSBudWxsICYmICFjb2xvci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWNvbG9yLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRnJlZVRleHROb2RlRWRpdFBhcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9GcmVlVGV4dE5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOTI1N2QxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9GcmVlVGV4dE5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5GcmVlVGV4dEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgZGlyZWN0IGVkaXRpbmcsIHRleHQgZm9udCwgY29sb3IgYW5kIHNpemUgY2hhbmdlcy4gCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkuCi0gKi8KLQotcHVibGljIGNsYXNzIEZyZWVUZXh0Tm9kZUVkaXRQYXJ0IGV4dGVuZHMgTm9kZUVkaXRQYXJ0IHsKLQlwcml2YXRlIEZvbnQgZm9udDsKLQotCXByaXZhdGUgQ29sb3IgY29sb3I7Ci0KLQlwcml2YXRlIEZvbnREYXRhIGZEYXRhOwotCi0JcHJpdmF0ZSBOb2RlRWRpdFBhcnQgcGFydDsKLQotCXB1YmxpYyBGcmVlVGV4dE5vZGVFZGl0UGFydChOb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQkJcGFydCA9IHRoaXM7IAotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlGcmVlVGV4dEZpZ3VyZSBsID0gbmV3IEZyZWVUZXh0RmlndXJlKCk7Ci0JCXJldHVybiBsOwotCi0JfQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0JCWlmICghKChOb2RlKSBnZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkpIHsKLQkJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQkJY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZURpcmVjdEVkaXRQb2xpY3koKQotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0UG9saWN5IGNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG5ldyBEaXJlY3RFZGl0UG9saWN5KCkgewotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGlyZWN0RWRpdENvbW1hbmQoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBuZXcgQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQocGFydCwgKFN0cmluZykgcmVxdWVzdAotCQkJCQkJLmdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIHZvaWQgc2hvd0N1cnJlbnRFZGl0VmFsdWUoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCUlGaWd1cmUgZmlnID0gZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpOwotCQkJCWlmIChmaWcgaW5zdGFuY2VvZiBGcmVlVGV4dEZpZ3VyZSkgewotCQkJCQkoKEZyZWVUZXh0RmlndXJlKSBmaWcpLnNldFRleHQoKFN0cmluZykgcmVxdWVzdC5nZXRDZWxsRWRpdG9yKCkKLQkJCQkJCQkuZ2V0VmFsdWUoKSk7Ci0JCQkJCWZpZy5nZXRVcGRhdGVNYW5hZ2VyKCkucGVyZm9ybVVwZGF0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE5vZGUuY2xhc3MpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX1RZUEU6Ci0JCQlyZWZyZXNoVmlzdWFscygpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlZChtc2cpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVQKLQkJCQkmJiAhKChOb2RlKSBnZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkpIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5wZXJmb3JtUmVxdWVzdChyZXF1ZXN0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlJRmlndXJlIGZpZyA9IGdldERpcmVjdEVkaXRGaWd1cmUoKTsKLQkJaWYgKGZpZyBpbnN0YW5jZW9mIEZyZWVUZXh0RmlndXJlKSB7Ci0JCQlGcmVlVGV4dEZpZ3VyZSBsID0gKEZyZWVUZXh0RmlndXJlKSBmaWc7Ci0JCQlMaXN0IGFsaXN0ID0gKChOb2RlKSBnZXRNb2RlbCgpKS5nZXRHcmFwaE5vZGUoKS5nZXRQcm9wZXJ0eSgpOwotCQkJU3RyaW5nIGZvbnROYW1lID0gVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UX05BTUU7Ci0JCQlpbnQgZm9udFN0eWxlID0gU1dULk5PUk1BTDsKLQkJCWludCBmb250SGVpZ2h0ID0gVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UX1NJWkU7Ci0JCQlpbnQgZm9udFJlZCA9IFNXVC5DT0xPUl9SRUQ7Ci0JCQlpbnQgZm9udEJsdWUgPSBTV1QuQ09MT1JfQkxVRTsKLQkJCWludCBmb250R3JlZW4gPSBTV1QuQ09MT1JfR1JFRU47Ci0KLQkJCWlmIChhbGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpb3IgPSBhbGlzdC5pdGVyYXRvcigpOyBpb3IuaGFzTmV4dCgpOykgewotCQkJCQlQcm9wZXJ0eSBwcm9wID0gKFByb3BlcnR5KSBpb3IubmV4dCgpOwotCQkJCQlpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0ZSRUVfVEVYVCkpIHsKLQkJCQkJCWwuc2V0VGV4dChwcm9wLmdldFZhbHVlKCkpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfTkFNRSkpIHsKLQkJCQkJCWZvbnROYW1lID0gcHJvcC5nZXRWYWx1ZSgpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfU1RZTEUpKSB7Ci0JCQkJCQlmb250U3R5bGUgPSBuZXcgSW50ZWdlcihwcm9wLmdldFZhbHVlKCkpLmludFZhbHVlKCk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9IRUlHSFQpKSB7Ci0JCQkJCQlmb250SGVpZ2h0ID0gbmV3IEludGVnZXIocHJvcC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfUkVEKSkgewotCQkJCQkJZm9udFJlZCA9IG5ldyBJbnRlZ2VyKHByb3AuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0JMVUUpKSB7Ci0JCQkJCQlmb250Qmx1ZSA9IG5ldyBJbnRlZ2VyKHByb3AuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0dSRUVOKSkgewotCQkJCQkJZm9udEdyZWVuID0gbmV3IEludGVnZXIocHJvcC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlsLnNldFRleHQoKChOb2RlKSBnZXRNb2RlbCgpKS5nZXRHcmFwaE5vZGUoKS5nZXROYW1lKCkpOwotCQkJfQotCQkJaWYgKGZvbnQgIT0gbnVsbCAmJiAhZm9udC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlmb250LmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWlmIChjb2xvciAhPSBudWxsICYmICFjb2xvci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQljb2xvci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlmRGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgZm9udEhlaWdodCwgZm9udFN0eWxlKTsKLQkJCWZvbnQgPSBuZXcgRm9udChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKSwgZkRhdGEpOwotCQkJY29sb3IgPSBuZXcgQ29sb3IobnVsbCwgZm9udFJlZCwgZm9udEdyZWVuLCBmb250Qmx1ZSk7Ci0JCQlsLnNldEZvbnQoZm9udCk7Ci0KLQkJCWwuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBjcmVhdGVEaXJlY3RFZGl0TWFuYWdlcigpIHsKLQkJRnJlZVRleHRGaWd1cmUgbCA9IChGcmVlVGV4dEZpZ3VyZSkgZ2V0RmlndXJlKCk7Ci0JCXJldHVybiBuZXcgRnJlZVRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0Q2VsbEVkaXRvci5jbGFzcywKLQkJCQluZXcgRnJlZVRleHRDZWxsRWRpdG9yTG9jYXRvcihsKSwgbCkgewotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHR4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JSUZpZ3VyZSBnZXREaXJlY3RFZGl0RmlndXJlKCkgewotCQlyZXR1cm4gZ2V0RmlndXJlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVFZGl0UGFydCNkZWFjdGl2YXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlpZiAoZm9udCAhPSBudWxsICYmICFmb250LmlzRGlzcG9zZWQoKSkgewotCQkJZm9udC5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGNvbG9yICE9IG51bGwgJiYgIWNvbG9yLmlzRGlzcG9zZWQoKSkgewotCQkJY29sb3IuZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQl9Ci0JU3RyaW5nIGdldERpcmVjdEVkaXRUZXh0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCS8vcmV0dXJuIHN1cGVyLmdldERpcmVjdEVkaXRUZXh0KCk7Ci0JCUlGaWd1cmUgZmlnID0gZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpOwotCQlpZiAoZmlnIGluc3RhbmNlb2YgRnJlZVRleHRGaWd1cmUpIHsKLQkJCXJldHVybiAoKEZyZWVUZXh0RmlndXJlKSBmaWcpLmdldFRleHQoKTsKLQkJfSAKLQkJcmV0dXJuICIiOyAKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9MYWJlbENlbGxFZGl0b3JMb2NhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxDZWxsRWRpdG9yTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YTk4NDE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9MYWJlbENlbGxFZGl0b3JMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQ29uc3RyYWludCBmb3IgTGFiZWwgcGxhY2luZy4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLWZpbmFsIHB1YmxpYyBjbGFzcyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IgewotCi0JcHJpdmF0ZSBJRmlndXJlIGZpZzsKLQotCXByaXZhdGUgc3RhdGljIGludCBXSU5fWF9PRkZTRVQgPSAtNDsKLQotCXByaXZhdGUgc3RhdGljIGludCBXSU5fV19PRkZTRVQgPSA1OwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IEdUS19YX09GRlNFVCA9IDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgR1RLX1dfT0ZGU0VUID0gMDsKLQotCXByaXZhdGUgc3RhdGljIGludCBNQUNfWF9PRkZTRVQgPSAtMzsKLQotCXByaXZhdGUgc3RhdGljIGludCBNQUNfV19PRkZTRVQgPSA5OwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BQ19ZX09GRlNFVCA9IC0zOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BQ19IX09GRlNFVCA9IDY7Ci0KLQlwdWJsaWMgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcihJRmlndXJlIGZpZ3VyZSkgewotCQlmaWcgPSBmaWd1cmU7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yI3JlbG9jYXRlKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcikKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikgewotCQlUZXh0IHRleHQgPSAoVGV4dCkgY2VsbGVkaXRvci5nZXRDb250cm9sKCk7Ci0KLQkJUmVjdGFuZ2xlIHJlY3QgPSBudWxsOwotCQlpZiAoZmlnIGluc3RhbmNlb2YgTGFiZWwpCi0JCQlyZWN0ID0gKChMYWJlbCkgZmlnKS5nZXRUZXh0Qm91bmRzKCkuaW50ZXJzZWN0KGZpZy5nZXRDbGllbnRBcmVhKCkpOwotCQllbHNlCi0JCQlyZWN0ID0gZmlnLmdldENsaWVudEFyZWEoUmVjdGFuZ2xlLlNJTkdMRVRPTik7Ci0JCWZpZy50cmFuc2xhdGVUb0Fic29sdXRlKHJlY3QpOwotCi0JCWludCB4T2Zmc2V0ID0gMDsKLQkJaW50IHdPZmZzZXQgPSAwOwotCQlpbnQgeU9mZnNldCA9IDA7Ci0JCWludCBoT2Zmc2V0ID0gMDsKLQotCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzSWdub3JlQ2FzZSgiZ3RrIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJeE9mZnNldCA9IEdUS19YX09GRlNFVDsKLQkJCXdPZmZzZXQgPSBHVEtfV19PRkZTRVQ7Ci0JCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzSWdub3JlQ2FzZSgiY2FyYm9uIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJeE9mZnNldCA9IE1BQ19YX09GRlNFVDsKLQkJCXdPZmZzZXQgPSBNQUNfV19PRkZTRVQ7Ci0JCQl5T2Zmc2V0ID0gTUFDX1lfT0ZGU0VUOwotCQkJaE9mZnNldCA9IE1BQ19IX09GRlNFVDsKLQkJfSBlbHNlIHsKLQkJCXhPZmZzZXQgPSBXSU5fWF9PRkZTRVQ7Ci0JCQl3T2Zmc2V0ID0gV0lOX1dfT0ZGU0VUOwotCQl9Ci0KLQkJdGV4dC5zZXRCb3VuZHMocmVjdC54ICsgeE9mZnNldCwgcmVjdC55ICsgeU9mZnNldCwKLQkJCQlyZWN0LndpZHRoICsgd09mZnNldCwgcmVjdC5oZWlnaHQgKyBoT2Zmc2V0KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxEaXJlY3RFZGl0TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xhYmVsRGlyZWN0RWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWIwZjkyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBkaXJlY3QgZWRpdCBvcGVyYXRpb24gYnkgY3JlYXRpbmcgYW5kIG1haW50YWluaW5nIHRoZSAKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3J9IGFuZCBleGVjdXRpbmcgdGhlIHJlc3VsdGluZyBjb21tYW5kIGlmIAotICogdGhlIGNlbGwgZWRpdG9yIHZhbHVlIGhhcyBjaGFuZ2VkLiBGb3Ige0BsaW5rIExhYmVsfS4KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMYWJlbERpcmVjdEVkaXRNYW5hZ2VyIGV4dGVuZHMgRGlyZWN0RWRpdE1hbmFnZXIgewotCi0JRm9udCBzY2FsZWRGb250OwotCi0JcHVibGljIExhYmVsRGlyZWN0RWRpdE1hbmFnZXIoR3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLCBDbGFzcyBlZGl0b3JUeXBlLAotCQkJQ2VsbEVkaXRvckxvY2F0b3IgbG9jYXRvcikgewotCQlzdXBlcihzb3VyY2UsIGVkaXRvclR5cGUsIGxvY2F0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKCkgewotCQkvLyBUaGlzIG1ldGhvZCBtaWdodCBiZSByZS1lbnRlcmVkIHdoZW4gc3VwZXIuYnJpbmdEb3duKCkgaXMgY2FsbGVkLgotCQlGb250IGRpc3Bvc2VGb250ID0gc2NhbGVkRm9udDsKLQkJc2NhbGVkRm9udCA9IG51bGw7Ci0JCXN1cGVyLmJyaW5nRG93bigpOwotCQlpZiAoZGlzcG9zZUZvbnQgIT0gbnVsbCkKLQkJCWRpc3Bvc2VGb250LmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q2VsbEVkaXRvcigpIHsKLQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0KLQkJZ2V0Q2VsbEVkaXRvcigpLnNldFZhbHVlKGdldEluaXRpYWxUZXh0KCkpOwotCQlJRmlndXJlIGZpZ3VyZSA9IGdldEVkaXRQYXJ0KCkuZ2V0RmlndXJlKCk7Ci0JCXNjYWxlZEZvbnQgPSBmaWd1cmUuZ2V0Rm9udCgpOwotCQlGb250RGF0YSBkYXRhID0gc2NhbGVkRm9udC5nZXRGb250RGF0YSgpWzBdOwotCQlEaW1lbnNpb24gZm9udFNpemUgPSBuZXcgRGltZW5zaW9uKDAsIGRhdGEuZ2V0SGVpZ2h0KCkpOwotCQlnZXREaXJlY3RFZGl0RmlndXJlKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShmb250U2l6ZSk7Ci0JCWRhdGEuc2V0SGVpZ2h0KGZvbnRTaXplLmhlaWdodCk7Ci0JCXNjYWxlZEZvbnQgPSBuZXcgRm9udChudWxsLCBkYXRhKTsKLQotCQl0ZXh0LnNldEZvbnQoc2NhbGVkRm9udCk7Ci0JCXRleHQuc2VsZWN0QWxsKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY2VsbCBlZGl0b3Igb24gdGhlIGdpdmVuIGNvbXBvc2l0ZS4gVGhlIGNlbGwgZWRpdG9yIGlzCi0JICogY3JlYXRlZCBieSBpbnN0YW50aWF0aW5nIHRoZSBjZWxsIGVkaXRvciB0eXBlIHBhc3NlZCBpbnRvIHRoaXMKLQkgKiBEaXJlY3RFZGl0TWFuYWdlcidzIGNvbnN0dWN0b3IuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIGNvbXBvc2l0ZSB0byBjcmVhdGUgdGhlIGNlbGwgZWRpdG9yIG9uCi0JICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBjZWxsIGVkaXRvcgotCSAqLwotCXByb3RlY3RlZCBDZWxsRWRpdG9yIGNyZWF0ZUNlbGxFZGl0b3JPbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXJldHVybiBuZXcgVGV4dENlbGxFZGl0b3IoY29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgdGV4dCBzaG93biBpbiB0aGUgY2VsbCBlZGl0b3IgZm9yCi0JICogICAgICAgICBkaXJlY3QtZWRpdGluZzsgY2Fubm90IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5pdGlhbFRleHQoKSB7Ci0JCXJldHVybiAoKEJhc2VFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkuZ2V0RGlyZWN0RWRpdFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGRldGVybWluZSB0aGUgaW5pdGlhbCB0ZXh0IG9mIHRoZSBjZWxsIGVkaXRvciBhbmQgdG8gZGV0ZXJtaW5lCi0JICogdGhlIGZvbnQgc2l6ZSBvZiB0aGUgdGV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmaWd1cmUgYmVpbmcgZWRpdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpIHsKLQkJcmV0dXJuICgoQmFzZUVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpKS5nZXREaXJlY3RFZGl0RmlndXJlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xhYmVsVGV4dENlbGxFZGl0b3JMb2NhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2YxZWQ0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIENvbnN0cmFpbnQgZm9yIFRleHQgcGxhY2luZy4gCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvciB7Ci0KLQlwcml2YXRlIExhYmVsIGxhYmVsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBMYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvciBmb3IgdGhlIGdpdmVuIExhYmVsCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICB0aGUgTGFiZWwKLQkgKi8KLQlwdWJsaWMgTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IoTGFiZWwgbGFiZWwpIHsKLQkJc2V0TGFiZWwobGFiZWwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2VsbEVkaXRvckxvY2F0b3IjcmVsb2NhdGUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikgewotCQlUZXh0IHRleHQgPSAoVGV4dCkgY2VsbGVkaXRvci5nZXRDb250cm9sKCk7Ci0JCVBvaW50IHByZWYgPSB0ZXh0LmNvbXB1dGVTaXplKC0xLCAtMSk7Ci0JCVJlY3RhbmdsZSByZWN0ID0gbGFiZWwuZ2V0VGV4dEJvdW5kcygpLmdldENvcHkoKTsKLQkJbGFiZWwudHJhbnNsYXRlVG9BYnNvbHV0ZShyZWN0KTsKLQkJdGV4dC5zZXRCb3VuZHMocmVjdC54IC0gMSwgcmVjdC55IC0gMSwgcHJlZi54ICsgMSwgcHJlZi55ICsgMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgTGFiZWwgZmlndXJlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIExhYmVsCi0JICovCi0JcHJvdGVjdGVkIExhYmVsIGdldExhYmVsKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBUaGUgbGFiZWwgdG8gc2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWwoTGFiZWwgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xpbmtFZGl0UGFydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xpbmtFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNmJjYmRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9MaW5rRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5Z29uRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5EZWxldGVMaW5rQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzLkxpbmtCZW5kcG9pbnRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXMuTGlua0VuZHBvaW50RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbm5lY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Hcm91cFJlcXVlc3Q7Ci0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCB0byB1cGRhdGUgdGhlIGFwcGVhcmFuY2UsIGFuZCBpbnN0YWxscyB0aGUgZWRpdHBvbGljaWVzCi0gKiBzcGVjaWZpYyB0aGUge0BsaW5rIExpbmt9IGFuZCBsaXN0ZW5zIHRvIGNoYW5nZXMgaW4gdGhlIGRpYWdyYW0gbW9kZWwuCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlua0VkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0aW9uRWRpdFBhcnQgewotCi0JcHJvdGVjdGVkIEFkYXB0ZXIgbW9kZWxMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQloYW5kbGVQcm9wZXJ0eUNoYW5nZWQobXNnKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgTGlua0VkaXRQYXJ0KExpbmsgY29ubikgewotCQlzdXBlcigpOwotCQlzZXRNb2RlbChjb25uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQkJZ2V0TGluaygpLmVBZGFwdGVycygpLmFkZChtb2RlbExpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09OTkVDVElPTl9FTkRQT0lOVFNfUk9MRSwKLQkJCQluZXcgTGlua0VuZHBvaW50RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT05ORUNUSU9OX1JPTEUsCi0JCQkJbmV3IENvbm5lY3Rpb25FZGl0UG9saWN5KCkgewotCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKEdyb3VwUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlCb29sZWFuIGJvb2wgPSAoQm9vbGVhbikgcmVxdWVzdC5nZXRFeHRlbmRlZERhdGEoKS5nZXQoCi0JCQkJCQkJCURlbGV0ZUNvbW1hbmQuS0VZX1BFUk1fREVMRVRFKTsKLQkJCQkJCWJvb2xlYW4gcGVybURlbGV0ZSA9IGJvb2wgPT0gbnVsbCA/IGZhbHNlIDogYm9vbAotCQkJCQkJCQkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCQlyZXR1cm4gbmV3IERlbGV0ZUxpbmtDb21tYW5kKChMaW5rKSBnZXRIb3N0KCkKLQkJCQkJCQkJLmdldE1vZGVsKCksIHBlcm1EZWxldGUpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09OTkVDVElPTl9CRU5EUE9JTlRTX1JPTEUsCi0JCQkJbmV3IExpbmtCZW5kcG9pbnRFZGl0UG9saWN5KCkpOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJUG9seWxpbmVDb25uZWN0aW9uIGNvbm4gPSBuZXcgUG9seWxpbmVDb25uZWN0aW9uKCk7Ci0JCWNvbm4uc2V0VGFyZ2V0RGVjb3JhdGlvbihuZXcgUG9seWdvbkRlY29yYXRpb24oKSk7Ci0JCXVwZGF0ZUFwcGVhcmFuY2UoKTsKLQkJcmV0dXJuIGNvbm47Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUFwcGVhcmFuY2UoKSB7Ci0JCWlmIChmaWd1cmUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTGluayBsaW5rID0gKExpbmspIGdldE1vZGVsKCk7Ci0JCWlmIChWYWxpZGF0aW9uLmlzUmVhZE9ubHkobGluaykpIHsKLQkJCWZpZ3VyZS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JzLklOSEVSSVRFRF9FTEVNRU5UX0xBQkVMKTsKLQkJfSBlbHNlIHsKLQkJCWZpZ3VyZS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJZ2V0TGluaygpLmVBZGFwdGVycygpLnJlbW92ZShtb2RlbExpc3RlbmVyKTsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBMaW5rIGdldExpbmsoKSB7Ci0JCXJldHVybiAoTGluaykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTGluay5jbGFzcykpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fQkVORFBPSU5UUzoKLQkJCXJlZnJlc2hWaXN1YWxzKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUX0VORF9QT0lOVDoKLQkJCXJlZnJlc2hUYXJnZXRBbmNob3IoKTsKLQkJCWJyZWFrOwotCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0VfRU5EX1BPSU5UOgotCQkJcmVmcmVzaFNvdXJjZUFuY2hvcigpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJdXBkYXRlQXBwZWFyYW5jZSgpOwotCQlnZXRDb25uZWN0aW9uRmlndXJlKCkuc2V0Um91dGluZ0NvbnN0cmFpbnQoZ2V0TGluaygpLmdldEJlbmRwb2ludHMoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05hbWVkTm9kZUVkaXRQYXJ0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTmFtZWROb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjRkMjFjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTmFtZWROb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNoYW5nZU5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuU2VsZWN0YWJsZUxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuVGV4dEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQnJlYWtJdGVyYXRvcjsKLQotLyoqCi0gKiBEaWFncmFtIGNoaWxkcmVuIHNob3VsZCBleHRlbmQgdGhpcyBOYW1lZE5vZGVFZGl0UGFydCBpbiBvcmRlciB0byBzdXBwb3J0IG5hbWUgZm9yIGZpZ3VyZS4KLSAqIE5hbWVkTm9kZUVkaXRQYXJ0IHByb3ZpZGVzIGluc3RydWN0dXJlIHRvIGhhbmRsZSB0aGUgbmFtZSB3cmFwcGluZyBhbmQgY29sb3IuIFN1cHBvcnQgZGlyZWN0IAotICogZWRpdGluZyBmZWVkYmFjay4gICAKLSAqICAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOYW1lZE5vZGVFZGl0UGFydCBleHRlbmRzIE5vZGVFZGl0UGFydCB7Ci0KLQlwdWJsaWMgTmFtZWROb2RlRWRpdFBhcnQoTmFtZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUxhYmVsIGwgPSBuZXcgU2VsZWN0YWJsZUxhYmVsKCk7Ci0JCWwuc2V0TGFiZWxBbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuTEVGVCk7Ci0JCWlmIChnZXRJbWFnZSgpICE9IG51bGwpIHsKLQkJCWwuc2V0SWNvbihnZXRJbWFnZSgpKTsKLQkJfQotCQlsLnNldFRleHRQbGFjZW1lbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOwotCQlsLnNldEZvbnQoVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UKTsKLQkJc2V0TGFiZWxGb3JlZ3JvdW5kQ29sb3IobCk7Ci0JCXJldHVybiBsOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRMYWJlbEZvcmVncm91bmRDb2xvcihMYWJlbCBsKSB7Ci0JCU5hbWVkTm9kZSBub2RlID0gKE5hbWVkTm9kZSkgZ2V0TW9kZWwoKTsKLQkJLy8gT2JqZWN0IGUgPSBub2RlLmdldE9iamVjdCgpOwotCQkvLyBib29sZWFuIHN1cHByZXNzZWQgPSBpc1N1cHByZXNzZWQoZSk7Ci0JCWJvb2xlYW4gc3VwcHJlc3NlZCA9IG5vZGUuaXNTdXBwcmVzc2VkKCk7Ci0JCWlmIChub2RlLmlzUmVhZE9ubHkoKSkgewotCQkJaWYgKCFzdXBwcmVzc2VkKSB7Ci0JCQkJbC5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JzLklOSEVSSVRFRF9FTEVNRU5UX0xBQkVMKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICghc3VwcHJlc3NlZCkgewotCQkJCWwuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLQkJCX0KLQkJfQotCQlpZiAoc3VwcHJlc3NlZCkgewotCQkJbC5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JzLlNVUFJFU1NFRF9FTEVNRU5UX0xBQkVMKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLQkJaWYgKCEoKE5vZGUpIGdldE1vZGVsKCkpLmlzUmVhZE9ubHkoKSkgewotCQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCQljcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRQb2xpY3kgY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpIHsKLQkJcmV0dXJuIG5ldyBEaXJlY3RFZGl0UG9saWN5KCkgewotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGlyZWN0RWRpdENvbW1hbmQoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBuZXcgQ2hhbmdlTmFtZUNvbW1hbmQoKE5hbWVkTm9kZSkgZ2V0TW9kZWwoKSwKLQkJCQkJCShTdHJpbmcpIHJlcXVlc3QuZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCkpOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgdm9pZCBzaG93Q3VycmVudEVkaXRWYWx1ZShEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJSUZpZ3VyZSBmaWcgPSBnZXREaXJlY3RFZGl0RmlndXJlKCk7Ci0JCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSByZXF1ZXN0LmdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpOwotCQkJCWlmIChmaWcgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJCQkoKExhYmVsKSBmaWcpLnNldFRleHQocyk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGZpZyBpbnN0YW5jZW9mIFRleHRGaWd1cmUpIHsKLQkJCQkJKChUZXh0RmlndXJlKSBmaWcpLnNldFRleHQocyk7Ci0JCQkJfQotCQkJCWZpZy5nZXRVcGRhdGVNYW5hZ2VyKCkucGVyZm9ybVVwZGF0ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChOYW1lZE5vZGUuY2xhc3MpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX05BTUU6Ci0JCQlyZWZyZXNoVmlzdWFscygpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlZChtc2cpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVQKLQkJCQkmJiAhKChOb2RlKSBnZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkpIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5wZXJmb3JtUmVxdWVzdChyZXF1ZXN0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFdSQVBfV0lEVEggPSAxMjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFdPUktfUFJPRFVDVF9XUkFQX1dJRFRIID0gMzsKLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlJRmlndXJlIGZpZyA9IGdldERpcmVjdEVkaXRGaWd1cmUoKTsKLQkJaWYgKGZpZyBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlMYWJlbCBsID0gKExhYmVsKSBmaWc7Ci0JCQlzZXRMYWJlbEZvcmVncm91bmRDb2xvcihsKTsKLQkJCVN0cmluZyB0ZXh0OwotCQkJLy8gQmVsb3cgY2hlY2sgaXMgcmVxdWlyZWQgZm9yIEV4dGVuZGVkIEFjdGl2aXR5IHByZXNlbnRhdGlvbiBuYW1lCi0JCQkvLyBzaG91bGQgYmUgdXNlZCBmcm9tIGJhc2UuCi0JCQlpZiAoZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBub2RlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgZ2V0TW9kZWwoKTsKLQkJCQlPYmplY3Qgd2JlbGVtZW50ID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQlpZiAod2JlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCSYmIFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZygoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KSkgewotCQkJCQl0ZXh0ID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KTsKLQkJCQl9IGVsc2UgewotCQkJCQl0ZXh0ID0gKChOYW1lZE5vZGUpIGdldE1vZGVsKCkpLmdldE5hbWUoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXRleHQgPSAoKE5hbWVkTm9kZSkgZ2V0TW9kZWwoKSkuZ2V0TmFtZSgpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlpZiAoZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydAotCQkJCQkJfHwgZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgewotCQkJCQlpbnQgdyA9IFdSQVBfV0lEVEg7Ci0JCQkJCWlmICh0aGlzLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKQotCQkJCQkJdyA9IFdPUktfUFJPRFVDVF9XUkFQX1dJRFRIOwotCQkJCQkKLQkJCQkJaWYodGhpcy5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVGFza05vZGUgJiYgCi0JCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5pc0F1dG9MYXlvdXQoCi0JCQkJCQkJKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSlnZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRNb2RlbCgpKSl7Ci0JCQkJCQkvLyBVc2VkIDE2IGFzIG1pbiBsZW5ndGggZm9yIHRhc2tuYW1lLCBlbHNlIGFkZCBzcGFjZXMgdG8gaXQuCi0JCQkJCQkvLyBUT0RPOiBmaW5kIGJldHRlciBzb2x1dGlvbiBmb3IgdGhpcy4KLQkJCQkJCWlmKHRleHQubGVuZ3RoKCkgPCAxNil7Ci0JCQkJCQkJaW50IGdhcCA9IDE2IC0gdGV4dC5sZW5ndGgoKTsKLQkJCQkJCQlmb3IoaW50IGk9MDsgaTxnYXAvMjsgaSsrKXsKLQkJCQkJCQkJdGV4dCs9IiAiOwotCQkJCQkJCX0KLQkJCQkJCQlmb3IoaW50IGk9MDsgaTxnYXAvMjsgaSsrKXsKLQkJCQkJCQkJdGV4dCA9ICIgIit0ZXh0OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl0ZXh0ID0gd3JhcCh0ZXh0LCB3KTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKLQkJCX0KLQkJCWwuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgd3JhcChTdHJpbmcgcywgaW50IHdyYXBXaWR0aCkgewotCQlTdHJpbmcgd3JhcHBlZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUJyZWFrSXRlcmF0b3IgYmkgPSBCcmVha0l0ZXJhdG9yLmdldExpbmVJbnN0YW5jZSgpOwotCQlTdHJpbmcgcmVtYWluaW5nID0gczsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChyZW1haW5pbmcubGVuZ3RoKCkgPD0gd3JhcFdpZHRoKSB7Ci0JCQkJd3JhcHBlZCArPSByZW1haW5pbmc7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCWJpLnNldFRleHQocmVtYWluaW5nKTsKLQkJCQlpbnQgcG9zID0gYmkuZm9sbG93aW5nKHdyYXBXaWR0aCk7Ci0JCQkJaWYgKHBvcyA9PSBCcmVha0l0ZXJhdG9yLkRPTkUpIHsKLQkJCQkJd3JhcHBlZCArPSByZW1haW5pbmc7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChwb3MgPj0gcmVtYWluaW5nLmxlbmd0aCgpKSB7Ci0JCQkJCQl3cmFwcGVkICs9IHJlbWFpbmluZzsKLQkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJd3JhcHBlZCArPSByZW1haW5pbmcuc3Vic3RyaW5nKDAsIHBvcykgKyAiXG4iOyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZW1haW5pbmcgPSByZW1haW5pbmcuc3Vic3RyaW5nKHBvcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdyYXBwZWQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05vZGVDb250YWluZXJFZGl0UGFydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05vZGVDb250YWluZXJFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDIxODUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Ob2RlQ29udGFpbmVyRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQmVuZHBvaW50Q29ubmVjdGlvblJvdXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GYW5Sb3V0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llcy5Ob2RlQ29udGFpbmVyRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzLk5vZGVDb250YWluZXJGbG93TGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbXBvbmVudEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkdyb3VwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci0KLS8qKgotICogTm9kZUNvbnRhaW5lckVkaXRQYXJ0IG1hbmFnZXMgdGhlIGNoaWxkIGVkaXRwYXJ0cyBpbiBhIHtAbGluayBHcmFwaGljYWxWaWV3ZXJ9LgotICogUHJvdmlkZXMgaW5zdHJ1Y3R1cmUgdG8gaGFuZGxlIHRoZSBub3RpZmljYXRpb25zIGZyb20gbW9kZWwuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb2RlQ29udGFpbmVyRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0Ci0JCWltcGxlbWVudHMgTGF5ZXJDb25zdGFudHMgewotCi0JcHJpdmF0ZSBCZW5kcG9pbnRDb25uZWN0aW9uUm91dGVyIGNSb3V0ZXI7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlciBtb2RlbExpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWhhbmRsZVByb3BlcnR5Q2hhbmdlZChtc2cpOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBOb2RlQ29udGFpbmVyRWRpdFBhcnQoTm9kZUNvbnRhaW5lciBtb2RlbCkgewotCQlzdXBlcigpOwotCQlzZXRNb2RlbChtb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCU5vZGVDb250YWluZXIgbW9kZWwgPSAoTm9kZUNvbnRhaW5lcikgKChFT2JqZWN0KSBnZXRNb2RlbCgpKTsKLQkJbW9kZWwuZUFkYXB0ZXJzKCkuYWRkKG1vZGVsTGlzdGVuZXIpOwotCQltb2RlbC5hZGRDb25zdW1lcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09NUE9ORU5UX1JPTEUsIG5ldyBDb21wb25lbnRFZGl0UG9saWN5KCkgewotCQkJcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRGVsZXRlQ29tbWFuZChHcm91cFJlcXVlc3QgZGVsZXRlUmVxdWVzdCkgewotCQkJCUJvb2xlYW4gYm9vbCA9IChCb29sZWFuKSBkZWxldGVSZXF1ZXN0LmdldEV4dGVuZGVkRGF0YSgpLmdldCgKLQkJCQkJCURlbGV0ZUNvbW1hbmQuS0VZX1BFUk1fREVMRVRFKTsKLQkJCQlib29sZWFuIHBlcm1EZWxldGUgPSBib29sID09IG51bGwgPyBmYWxzZSA6IGJvb2wuYm9vbGVhblZhbHVlKCk7Ci0JCQkJRGVsZXRlQ29tbWFuZCBjbWQgPSBuZXcgRGVsZXRlQ29tbWFuZChwZXJtRGVsZXRlKTsKLQkJCQljbWQuc2V0UGFydFRvQmVEZWxldGVkKGdldEhvc3QoKS5nZXRNb2RlbCgpKTsKLQkJCQlyZXR1cm4gY21kOwotCQkJfQotCQl9KTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgbnVsbCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09OVEFJTkVSX1JPTEUsCi0JCQkJbmV3IE5vZGVDb250YWluZXJFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Lk5PREVfUk9MRSwgbnVsbCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsCi0JCQkJbmV3IE5vZGVDb250YWluZXJGbG93TGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlOb2RlQ29udGFpbmVyIG1vZGVsID0gKE5vZGVDb250YWluZXIpICgoRU9iamVjdCkgZ2V0TW9kZWwoKSk7Ci0JCW1vZGVsLmVBZGFwdGVycygpLnJlbW92ZShtb2RlbExpc3RlbmVyKTsKLQkJbW9kZWwucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0KLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBFZGl0UGFydCBmaW5kQ2hpbGRCeU1vZGVsKE9iamVjdCBtb2RlbCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRWRpdFBhcnQgY2hpbGQgPSAoRWRpdFBhcnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkLmdldE1vZGVsKCkgPT0gbW9kZWwpIHsKLQkJCQlyZXR1cm4gY2hpbGQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFydFRvRWRpdChDb2xsZWN0aW9uIHBhcnRzVG9FZGl0LCBPYmplY3Qgbm9kZSkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSBmaW5kQ2hpbGRCeU1vZGVsKG5vZGUpOwotCQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQmFzZUVkaXRQYXJ0KSB7Ci0JCQkJRGlyZWN0RWRpdE1hbmFnZXIgZWRpdE1hbmFnZXIgPSAoKEJhc2VFZGl0UGFydCkgZWRpdFBhcnQpCi0JCQkJCQkuZ2V0RGlyZWN0RWRpdE1hbmFnZXIoKTsKLQkJCQlpZiAoZWRpdE1hbmFnZXIgaW5zdGFuY2VvZiBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJCSYmICgoVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyKSBlZGl0TWFuYWdlcikKLQkJCQkJCQkJLnZhbGlkYXRlKCgoTmFtZWROb2RlKSBub2RlKS5nZXROYW1lKCkpICE9IG51bGwpIHsKLQkJCQkJcGFydHNUb0VkaXQuYWRkKGVkaXRQYXJ0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTm9kZUNvbnRhaW5lci5jbGFzcykpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fTE9DQVRJT046Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1dJRFRIOgotCQkJcmVmcmVzaFZpc3VhbHMoKTsKLQkJCWJyZWFrOwotCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJCXJlZnJlc2hTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOgotCQkJcmVmcmVzaFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX05PREVTOgotCQkJcmVmcmVzaENoaWxkcmVuKCk7Ci0KLQkJCUxpc3QgcGFydHNUb0VkaXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWFkZFBhcnRUb0VkaXQocGFydHNUb0VkaXQsIG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCWFkZFBhcnRUb0VkaXQocGFydHNUb0VkaXQsIGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChnZXRWaWV3ZXIoKS5nZXRDb250cm9sKCkuaXNGb2N1c0NvbnRyb2woKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHBhcnRzVG9FZGl0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlCYXNlRWRpdFBhcnQgZWRpdFBhcnQgPSAoQmFzZUVkaXRQYXJ0KSBpdGVyLm5leHQoKTsKLQkJCQkJZWRpdFBhcnQucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSBnZXRNb2RlbCgpOwotCQlEaW1lbnNpb24gc2l6ZSA9IG5ldyBEaW1lbnNpb24obm9kZS5nZXRXaWR0aCgpLCBub2RlLmdldEhlaWdodCgpKTsKLQkJaWYgKHNpemUgPT0gbnVsbCkgewotCQkJc2l6ZSA9IG5ldyBEaW1lbnNpb24oNjAsIDEwMCk7Ci0JCX0KLQkJUG9pbnQgbG9jID0gbm9kZS5nZXRMb2NhdGlvbigpOwotCQlpZiAobG9jID09IG51bGwpIHsKLQkJCWxvYyA9IG5ldyBQb2ludCgxMCwgMTApOwotCQl9Ci0JCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZShsb2MsIHNpemUpOwotCi0JCSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5zZXRMYXlvdXRDb25zdHJhaW50KHRoaXMsCi0JCQkJZ2V0RmlndXJlKCksIHIpOwotCi0JCWlmIChjUm91dGVyID09IG51bGwpIHsKLQkJCUNvbm5lY3Rpb25MYXllciBjTGF5ZXIgPSAoQ29ubmVjdGlvbkxheWVyKSBnZXRMYXllcihDT05ORUNUSU9OX0xBWUVSKTsKLQkJCUZhblJvdXRlciByb3V0ZXIgPSBuZXcgRmFuUm91dGVyKCk7Ci0JCQlyb3V0ZXIuc2V0U2VwYXJhdGlvbigzMCk7Ci0JCQljUm91dGVyID0gbmV3IEJlbmRwb2ludENvbm5lY3Rpb25Sb3V0ZXIoKTsKLQkJCXJvdXRlci5zZXROZXh0Um91dGVyKGNSb3V0ZXIpOwotCQkJY0xheWVyLnNldENvbm5lY3Rpb25Sb3V0ZXIocm91dGVyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiAoKE5vZGVDb250YWluZXIpIGdldE1vZGVsKCkpLmdldE5vZGVzKCk7Ci0JfQotCQotCS8qKgotCSAqIE9ubHkgdXNlZnVsIGluIGNhc2Ugb2YgQURELiBQbGFjZWQgaGVyZSBpbiBvcmRlciB0byBpbnZva2UgaW4gc3ViIGNsYXNzZXMuCi0JICogVE9ETzogIE1vdmUgdGhpcyBtZXRob2QgdG8gdXRpbGl0eSBjbGFzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhblVwRGlhZ3JhbShFZGl0UGFydCBwYXJ0KSB7Ci0JCUVkaXRQYXJ0IGRlcCA9IChFZGl0UGFydCkgcGFydC5nZXRQYXJlbnQoKTsKLQkJaWYoZGVwIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgKXsKLQkJCQotCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgYWRkID0gKChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydClkZXApOwotCQkJaWYoISgoRGlhZ3JhbSlhZGQuZ2V0TW9kZWwoKSkuaXNSZWFkT25seSgpKXsKLQkJCQlhZGQuZ2V0UmVjZW50bHlBZGRlZFBhcnRzKCkuYWRkQWxsKGRlcC5nZXRDaGlsZHJlbigpKTsKLQkJCi0JCQkJLy8gY2xlYW4gdXAgdGhlIGRpYWdyYW0KLQkJCQlEZWZhdWx0RWRpdERvbWFpbiBlZGl0aW5nRG9tYWluID0gbmV3IERlZmF1bHRFZGl0RG9tYWluKG51bGwpOwotCQkJCUFjdGlvblJlZ2lzdHJ5IGFjdGlvblJlZ2lzdHJ5ID0gbmV3IEFjdGlvblJlZ2lzdHJ5KCk7Ci0JCQotCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlIGFjdGlvblNlcnZpY2UgPSBuZXcgRGlhZ3JhbUFjdGlvblNlcnZpY2UoCi0JCQkJCQkoR3JhcGhpY2FsVmlld2VyKWdldFBhcmVudCgpLmdldFZpZXdlcigpLCBlZGl0aW5nRG9tYWluLCBhY3Rpb25SZWdpc3RyeSk7Ci0JCQkJYWN0aW9uU2VydmljZS5yZWdpc3RlclZlcnRpY2FsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKCk7Ci0JCQotCQkJCURpYWdyYW1VcGRhdGVTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgRGlhZ3JhbVVwZGF0ZVNlcnZpY2UoCi0JCQkJCQkoR3JhcGhpY2FsVmlld2VyKWdldFBhcmVudCgpLmdldFZpZXdlcigpLCBlZGl0aW5nRG9tYWluLCBhY3Rpb25SZWdpc3RyeSk7Ci0JCQkJc2VydmljZS5jbGVhblVwRGlhZ3JhbSgpOwotCQkJfQotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05vZGVFZGl0UGFydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NTk4N2Y1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Ob2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNob3Bib3hBbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ3JlYXRlTGlua0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5SZWNvbm5lY3RMaW5rQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkNvbm5lY3Rpb25BbmNob3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db25uZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbXBvbmVudEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5HcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Hcm91cFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLlJlY29ubmVjdFJlcXVlc3Q7Ci0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgY29ubmVjdGlvbnMsIGFuZCBpbnN0YWxscyBFZGl0UG9saWN5IGZvciAoCi0gKiB7QGxpbmsgRWRpdFBvbGljeS5DT01QT05FTlRfUk9MRX0sIHtAbGluayBFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEV9LAotICoge0BsaW5rRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRX0pCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb2RlRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQgaW1wbGVtZW50cwotCQlvcmcuZWNsaXBzZS5nZWYuTm9kZUVkaXRQYXJ0IHsKLQotCXB1YmxpYyBOb2RlRWRpdFBhcnQoTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT01QT05FTlRfUk9MRSwgbmV3IENvbXBvbmVudEVkaXRQb2xpY3koKSB7Ci0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEZWxldGVDb21tYW5kKEdyb3VwUmVxdWVzdCBkZWxldGVSZXF1ZXN0KSB7Ci0JCQkJQm9vbGVhbiBib29sID0gKEJvb2xlYW4pIGRlbGV0ZVJlcXVlc3QuZ2V0RXh0ZW5kZWREYXRhKCkuZ2V0KAotCQkJCQkJRGVsZXRlQ29tbWFuZC5LRVlfUEVSTV9ERUxFVEUpOwotCQkJCWJvb2xlYW4gcGVybURlbGV0ZSA9IGJvb2wgPT0gbnVsbCA/IGZhbHNlIDogYm9vbC5ib29sZWFuVmFsdWUoKTsKLQkJCQlEZWxldGVDb21tYW5kIGNtZCA9IG5ldyBEZWxldGVDb21tYW5kKHBlcm1EZWxldGUpOwotCQkJCWNtZC5zZXRQYXJ0VG9CZURlbGV0ZWQoZ2V0SG9zdCgpLmdldE1vZGVsKCkpOwotCQkJCXJldHVybiBjbWQ7Ci0JCQl9Ci0JCX0pOwotCi0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJCQluZXcgR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSB7Ci0JCQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENvbm5lY3Rpb25Db21wbGV0ZUNvbW1hbmQoCi0JCQkJCQkJQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJQ3JlYXRlTGlua0NvbW1hbmQgY21kID0gKENyZWF0ZUxpbmtDb21tYW5kKSByZXF1ZXN0Ci0JCQkJCQkJCS5nZXRTdGFydENvbW1hbmQoKTsKLQkJCQkJCWNtZC5zZXRUYXJnZXQoKE5vZGUpIGdldEhvc3QoKS5nZXRNb2RlbCgpKTsKLQotCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0RWRpdFBhcnQoKSBpbnN0YW5jZW9mIENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSB7Ci0JCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0RWRpdFBhcnQoKS5lcXVhbHMoCi0JCQkJCQkJCQlyZXF1ZXN0LmdldFNvdXJjZUVkaXRQYXJ0KCkpKSB7Ci0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQljbWQKLQkJCQkJCQkJCQkuc2V0VGFyZ2V0RW5kUG9pbnQoKChDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgcmVxdWVzdAotCQkJCQkJCQkJCQkJLmdldFRhcmdldEVkaXRQYXJ0KCkpCi0JCQkJCQkJCQkJCQkuZ2V0TG9jYXRpb24ocmVxdWVzdAotCQkJCQkJCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJcmV0dXJuIGNtZDsKLQkJCQkJfQotCi0JCQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENvbm5lY3Rpb25DcmVhdGVDb21tYW5kKAotCQkJCQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCUNyZWF0ZUxpbmtDb21tYW5kIGNtZCA9IG5ldyBDcmVhdGVMaW5rQ29tbWFuZCgKLQkJCQkJCQkJTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5rKCksCi0JCQkJCQkJCShOb2RlKSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSk7Ci0JCQkJCQlpZiAocmVxdWVzdC5nZXRUYXJnZXRFZGl0UGFydCgpIGluc3RhbmNlb2YgQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHsKLQkJCQkJCQljbWQKLQkJCQkJCQkJCS5zZXRTb3VyY2VFbmRQb2ludCgoKENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSByZXF1ZXN0Ci0JCQkJCQkJCQkJCS5nZXRUYXJnZXRFZGl0UGFydCgpKQotCQkJCQkJCQkJCQkuZ2V0TG9jYXRpb24ocmVxdWVzdC5nZXRMb2NhdGlvbigpKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWNtZC5zZXRTb3VyY2VFbmRQb2ludChyZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfQotCQkJCQkJcmVxdWVzdC5zZXRTdGFydENvbW1hbmQoY21kKTsKLQotCQkJCQkJcmV0dXJuIGNtZDsKLQotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVjb25uZWN0U291cmNlQ29tbWFuZCgKLQkJCQkJCQlSZWNvbm5lY3RSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCUxpbmsgbGluayA9IChMaW5rKSByZXF1ZXN0LmdldENvbm5lY3Rpb25FZGl0UGFydCgpCi0JCQkJCQkJCS5nZXRNb2RlbCgpOwotCQkJCQkJUmVjb25uZWN0TGlua0NvbW1hbmQgY21kID0gbmV3IFJlY29ubmVjdExpbmtDb21tYW5kKAotCQkJCQkJCQlsaW5rLCAoTm9kZSkgZ2V0SG9zdCgpLmdldE1vZGVsKCksIHRydWUpOwotCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgewotCQkJCQkJCWNtZC5zZXRFbmRQb2ludCgoKENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSByZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0VGFyZ2V0KCkpLmdldExvY2F0aW9uKHJlcXVlc3QKLQkJCQkJCQkJCS5nZXRMb2NhdGlvbigpKSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXJldHVybiBjbWQ7Ci0JCQkJCX0KLQotCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZWNvbm5lY3RUYXJnZXRDb21tYW5kKAotCQkJCQkJCVJlY29ubmVjdFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJTGluayBsaW5rID0gKExpbmspIHJlcXVlc3QuZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KCkKLQkJCQkJCQkJLmdldE1vZGVsKCk7Ci0JCQkJCQlSZWNvbm5lY3RMaW5rQ29tbWFuZCBjbWQgPSBuZXcgUmVjb25uZWN0TGlua0NvbW1hbmQoCi0JCQkJCQkJCWxpbmssIChOb2RlKSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSwgZmFsc2UpOwotCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgewotCQkJCQkJCWNtZC5zZXRFbmRQb2ludCgoKENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSByZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0VGFyZ2V0KCkpLmdldExvY2F0aW9uKHJlcXVlc3QKLQkJCQkJCQkJCS5nZXRMb2NhdGlvbigpKSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gY21kOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgbnVsbCk7Ci0JCS8vIEJ5IGRlZmF1bHQsIGNhbid0IGFkZCBhbnl0aGluZyB0byBhIG5vZGUKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVsZXRlRGVwZW5kYW50Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIChOb2RlKSBnZXRNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsU291cmNlQ29ubmVjdGlvbnMoKSB7Ci0JCXJldHVybiBnZXROb2RlKCkuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsVGFyZ2V0Q29ubmVjdGlvbnMoKSB7Ci0JCXJldHVybiBnZXROb2RlKCkuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoCi0JCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbikgewotCQlyZXR1cm4gbmV3IENob3Bib3hBbmNob3IoZ2V0RmlndXJlKCkpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXJldHVybiBuZXcgQ2hvcGJveEFuY2hvcihnZXRGaWd1cmUoKSk7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcigKLQkJCUNvbm5lY3Rpb25FZGl0UGFydCBjb25uZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgQ2hvcGJveEFuY2hvcihnZXRGaWd1cmUoKSk7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcihSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJcmV0dXJuIG5ldyBDaG9wYm94QW5jaG9yKGdldEZpZ3VyZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTm9kZS5jbGFzcykpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fTE9DQVRJT046Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1dJRFRIOgotCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19IRUlHSFQ6CQkJCi0JCQlyZWZyZXNoVmlzdWFscygpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1JFQURfT05MWToKLQkJCXJlZnJlc2hWaXN1YWxzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRUYXJnZXRDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubiA9IChDb25uZWN0aW9uRWRpdFBhcnQpIGl0ZXIubmV4dCgpOwotCQkJCWNvbm4ucmVmcmVzaCgpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlM6Ci0JCQlyZWZyZXNoU291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOgotCQkJcmVmcmVzaFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlSZWN0YW5nbGUgY29uc3RyYWludCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgLTEsIC0xKTsKLQkJaWYgKGdldE5vZGUoKS5nZXRMb2NhdGlvbigpICE9IG51bGwpCi0JCQljb25zdHJhaW50LnNldExvY2F0aW9uKGdldE5vZGUoKS5nZXRMb2NhdGlvbigpKTsKLQkJY29uc3RyYWludC53aWR0aCA9IGdldE5vZGUoKS5nZXRXaWR0aCgpOwotCQkoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuc2V0TGF5b3V0Q29uc3RyYWludCh0aGlzLAotCQkJCWdldEZpZ3VyZSgpLCBjb25zdHJhaW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2FjdGl2YXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQkJKChOb2RlKSBnZXRNb2RlbCgpKS5hZGRDb25zdW1lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2RlYWN0aXZhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCSgoTm9kZSkgZ2V0TW9kZWwoKSkucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvUmFpc2VkTWFyZ2luQm9yZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvUmFpc2VkTWFyZ2luQm9yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0MmQwYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1JhaXNlZE1hcmdpbkJvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2UgIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5Lkluc2V0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqICBBIGJvcmRlciB3aXRoIGEgcmFpc2VkIG1hcmdpbi4KLSAqICAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmFpc2VkTWFyZ2luQm9yZGVyIGV4dGVuZHMgTWFyZ2luQm9yZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEluc2V0cyBERUZBVUxUX0lOU0VUUyA9IG5ldyBJbnNldHMoMTAsIDEwLCAxMCwgMTApOwotCi0JcHVibGljIFJhaXNlZE1hcmdpbkJvcmRlcigpIHsKLQkJdGhpcyhERUZBVUxUX0lOU0VUUyk7Ci0JfQotCi0JcHVibGljIFJhaXNlZE1hcmdpbkJvcmRlcihJbnNldHMgaW5zZXRzKSB7Ci0JCXN1cGVyKGluc2V0cyk7Ci0JfQotCi0JcHVibGljIFJhaXNlZE1hcmdpbkJvcmRlcihpbnQgdCwgaW50IGwsIGludCBiLCBpbnQgcikgewotCQlzdXBlcih0LCBsLCBiLCByKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5Cb3JkZXIjZ2V0SW5zZXRzKElGaWd1cmUpCi0JICovCi0JcHVibGljIEluc2V0cyBnZXRJbnNldHMoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJcmV0dXJuIGluc2V0czsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQm9yZGVyI2lzT3BhcXVlKCkKLQkgKi8JCi0JcHVibGljIGJvb2xlYW4gaXNPcGFxdWUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkJvcmRlciNwYWludChJRmlndXJlLCBHcmFwaGljcywgSW5zZXRzKQotCSAqLwotCXB1YmxpYyB2b2lkIHBhaW50KElGaWd1cmUgZmlndXJlLCBHcmFwaGljcyBnLCBJbnNldHMgaW5zZXRzKSB7Ci0JCWcuc2V0TGluZVN0eWxlKEdyYXBoaWNzLkxJTkVfU09MSUQpOwotCQlnLnNldExpbmVXaWR0aCgxKTsKLQkJZy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYnV0dG9uTGlnaHRlc3QpOwotCQlSZWN0YW5nbGUgciA9IGdldFBhaW50UmVjdGFuZ2xlKGZpZ3VyZSwgaW5zZXRzKTsKLQkJci5yZXNpemUoLTEsIC0xKTsKLQkJZy5kcmF3TGluZShyLngsIHIueSwgci5yaWdodCgpLCByLnkpOwotCQlnLmRyYXdMaW5lKHIueCwgci55LCByLngsIHIuYm90dG9tKCkpOwotCQlnLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5idXR0b25EYXJrZXIpOwotCQlnLmRyYXdMaW5lKHIueCwgci5ib3R0b20oKSwgci5yaWdodCgpLCByLmJvdHRvbSgpKTsKLQkJZy5kcmF3TGluZShyLnJpZ2h0KCksIHIueSwgci5yaWdodCgpLCByLmJvdHRvbSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9SZWxhdGl2ZVhZQW5jaG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvUmVsYXRpdmVYWUFuY2hvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZGNiNzVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9SZWxhdGl2ZVhZQW5jaG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0Q29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLyoqCi0gKiBQcm92aWRlcyByZWxhdGl2ZSBhbmNob3IgZm9yIGEgZmlndXJlJ3MgbG9jYXRpb24uIAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVsYXRpdmVYWUFuY2hvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbkFuY2hvciB7Ci0KLQlwcml2YXRlIFBvaW50IHJlbGF0aXZlTG9jYXRpb247Ci0KLQlwdWJsaWMgUmVsYXRpdmVYWUFuY2hvcihJRmlndXJlIGZpZ3VyZSwgUG9pbnQgbG9jYXRpb24sIGJvb2xlYW4gaXNSZWxhdGl2ZSkgewotCQlzdXBlcihmaWd1cmUpOwotCQlyZWxhdGl2ZUxvY2F0aW9uID0gbG9jYXRpb24uZ2V0Q29weSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25BbmNob3IjZ2V0TG9jYXRpb24oUG9pbnQpCi0JICovCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSkgewotCQlQb2ludCBwID0gcmVsYXRpdmVMb2NhdGlvbi5nZXRDb3B5KCk7Ci0JCVJlY3RhbmdsZSByID0gZ2V0T3duZXIoKS5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCXAucGVyZm9ybVRyYW5zbGF0ZShyLngsIHIueSk7Ci0JCWdldE93bmVyKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShwKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yI2dldFJlZmVyZW5jZVBvaW50KCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0UmVmZXJlbmNlUG9pbnQoKSB7Ci0JCXJldHVybiBnZXRMb2NhdGlvbihudWxsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0N2I5MWQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZsb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXMuUm9sZVRhc2tGbG93TGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCBpcyBjb250YWluZXIgd2l0aCB7QGxpbmsgRmxvd0xheW91dH0sIGFuZCBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZy9yZW1vdmluZyBjaGlsZCBlZGl0cGFydC4gCi0gKiAgCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCBleHRlbmRzIE5vZGVDb250YWluZXJFZGl0UGFydCB7Ci0KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yIEJHX0NPTE9SID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCAyNTUsCi0vLwkJCTI1NSwgMTU2KTsKLQkKLQlwcml2YXRlIHN0YXRpYyAgQ29sb3IgQkdfQ09MT1I7Ci0JcHVibGljIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQoUm9sZVRhc2tDb21wb3NpdGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJRmlndXJlIGZpZ3VyZSA9IG5ldyBGaWd1cmUoKTsKLQkJRmxvd0xheW91dCBsYXlvdXQgPSBuZXcgRmxvd0xheW91dCgpOwotCQlsYXlvdXQuc2V0TWlub3JTcGFjaW5nKDIwKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJZmlndXJlLnNldEJvcmRlcihuZXcgUmFpc2VkTWFyZ2luQm9yZGVyKCkpOwotCQlmaWd1cmUuc2V0QmFja2dyb3VuZENvbG9yKGdldEJhY2tncm91bmRDb2xvcigpKTsKLQkJZmlndXJlLnNldE9wYXF1ZSh0cnVlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUNvbnRhaW5lckVkaXRQYXJ0I2hhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE5vZGVDb250YWluZXIuY2xhc3MpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19OT0RFUzoKLQkJCXJlZnJlc2hDaGlsZHJlbigpOwotCi0JCQkvLyByZWZyZXNoIGRpYWdyYW0ncyBjaGlsZHJlbgotCQkJRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0ID0gZ2V0UGFyZW50KCk7Ci0vLwkJCWlmIChkaWFncmFtRWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgewotLy8JCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtIGRpYWdyYW0gPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBkaWFncmFtRWRpdFBhcnQKLS8vCQkJCQkJLmdldE1vZGVsKCk7Ci0vLwotLy8JCQkJaWYgKCFHcmFwaGljYWxEYXRhSGVscGVyLmlzQXV0b0xheW91dChkaWFncmFtKSkgewotLy8JCQkJCSgoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIGRpYWdyYW1FZGl0UGFydCkKLS8vCQkJCQkJCS5nZXRSZWNlbnRseUFkZGVkUGFydHMoKS5hZGRBbGwoCi0vLwkJCQkJCQkJCWRpYWdyYW1FZGl0UGFydC5nZXRDaGlsZHJlbigpKTsKLS8vCQkJCQlEZWZhdWx0RWRpdERvbWFpbiBlZCA9IChEZWZhdWx0RWRpdERvbWFpbikgZGlhZ3JhbUVkaXRQYXJ0Ci0vLwkJCQkJCQkuZ2V0Vmlld2VyKCkuZ2V0RWRpdERvbWFpbigpOwotLy8JCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IGVkLmdldEVkaXRvclBhcnQoKTsKLS8vCQkJCQlpZiAoZWRpdG9yICE9IG51bGwgJiYgZWRpdG9yIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yKSB7Ci0vLwkJCQkJCSgoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yKSBlZGl0b3IpLmNsZWFuVXBEaWFncmFtKCk7Ci0vLwkJCQkJfQotLy8JCQkJfSBlbHNlIHsKLS8vCQkJCQlkaWFncmFtRWRpdFBhcnQucmVmcmVzaCgpOwotLy8JCQkJfQotLy8JCQl9Ci0JCQlkaWFncmFtRWRpdFBhcnQucmVmcmVzaCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlZChtc2cpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlQ29udGFpbmVyRWRpdFBhcnQjY3JlYXRlRWRpdFBvbGljaWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBuZXcgUm9sZVRhc2tGbG93TGF5b3V0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT01QT05FTlRfUk9MRSwgbnVsbCk7Ci0JfQotCXByb3RlY3RlZCBDb2xvciBnZXRCYWNrZ3JvdW5kQ29sb3IoKXsKLQkJaWYoQkdfQ09MT1IgIT0gbnVsbCkgcmV0dXJuIEJHX0NPTE9SOwotCQkKLQkJaWYoQkdfQ09MT1IgPT0gbnVsbCl7Ci0JCQlTdHJpbmcgY29sb3JTdHJpbmcgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5BRERfUk9MRV9UQVNLU19CT1hfQkdfQ09MT1JfUkdCKTsKLQkJCWlmKGNvbG9yU3RyaW5nICE9IG51bGwgJiYgY29sb3JTdHJpbmcubGVuZ3RoKCkgPiAwKXsKLQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihjb2xvclN0cmluZywgIiwiKTsKLQkJCQlpbnQgciA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlpbnQgZyA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlpbnQgYiA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlCR19DT0xPUiA9IG5ldyBDb2xvcihudWxsLCByLGcsYik7Ci0JCQkJcmV0dXJuIEJHX0NPTE9SOwotCQkJfQotCQl9Ci0JCWlmKEJHX0NPTE9SID09IG51bGwpewotCQkJQkdfQ09MT1IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIDI1NSwKLQkJCQkJCQkyNTUsIDE1Nik7Ci0JCX0KLQkJcmV0dXJuIEJHX0NPTE9SOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9TdGFydE5vZGVFZGl0UGFydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1N0YXJ0Tm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFhYWJjYjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1N0YXJ0Tm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5FbGxpcHNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgY3JlYXRpbmcgZmlndXJlIGZvciB7QGxpbmsgVHlwZWROb2RlLlNUQVJUfQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RhcnROb2RlRWRpdFBhcnQgZXh0ZW5kcyBOb2RlRWRpdFBhcnQgewotCi0JcHVibGljIFN0YXJ0Tm9kZUVkaXRQYXJ0KFR5cGVkTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkJhc2VFZGl0UGFydCNjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdFBvbGljeSBjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZUZpZ3VyZSgpCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlFbGxpcHNlIGYgPSBuZXcgRWxsaXBzZSgpOwotCQlmLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0JCWYuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLnJlZCk7Ci0JCWYuc2V0U2l6ZSgyMCwgMjApOwotCQlyZXR1cm4gZjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9TeW5jaEJhck5vZGVFZGl0UGFydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1N5bmNoQmFyTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyZmMwMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1N5bmNoQmFyTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuQ29ubmVjdGlvbkFuY2hvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkNvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Mb2NhdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIGNyZWF0aW5nIGZpZ3VyZSBhbmQgY3JlYXRpbmcgcmVsYXRpdmUgYW5jaG9ycwotICogZm9yIHtAbGluayBUeXBlZE5vZGUuU1lOQ19CQVJ9Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3luY2hCYXJOb2RlRWRpdFBhcnQgZXh0ZW5kcyBOb2RlRWRpdFBhcnQgaW1wbGVtZW50cwotCQlDb25uZWN0aW9uQW5jaG9yTG9jYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xvciBCR19DT0xPUiA9IG5ldyBDb2xvcihudWxsLCA1MSwgMTAyLCAxMDIpOwotCi0JcHJpdmF0ZSBQb2ludCByZWNlbnRUYXJnZXRFbmRQb2ludDsKLQotCXByaXZhdGUgUG9pbnQgcmVjZW50U291cmNlRW5kUG9pbnQ7Ci0KLQlwdWJsaWMgU3luY2hCYXJOb2RlRWRpdFBhcnQoVHlwZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZURpcmVjdEVkaXRQb2xpY3koKQotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0UG9saWN5IGNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJUmVjdGFuZ2xlRmlndXJlIGYgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7Ci0JCWYuc2V0QmFja2dyb3VuZENvbG9yKEJHX0NPTE9SKTsKLQkJZi5zZXRTaXplKDEwMCwgNSk7Ci0JCXJldHVybiBmOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoCi0JCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbikgewotCQlib29sZWFuIGlzUmVsYXRpdmUgPSBmYWxzZTsKLQkJUG9pbnQgc291cmNlRW5kUG9pbnQgPSBudWxsOwotCQlpZiAocmVjZW50U291cmNlRW5kUG9pbnQgPT0gbnVsbCkgewotCQkJLy8gZ2V0IHNvdXJjZSBlbmQgcG9pbnQgZnJvbSB0aGUgbW9kZWwKLQkJCUxpbmsgbGluayA9IChMaW5rKSBjb25uZWN0aW9uLmdldE1vZGVsKCk7Ci0JCQlzb3VyY2VFbmRQb2ludCA9IGxpbmsuZ2V0U291cmNlRW5kUG9pbnQoKTsKLQkJCWlzUmVsYXRpdmUgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJc291cmNlRW5kUG9pbnQgPSByZWNlbnRTb3VyY2VFbmRQb2ludDsKLQkJfQotCQlpZiAoc291cmNlRW5kUG9pbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBSZWxhdGl2ZVhZQW5jaG9yKGdldEZpZ3VyZSgpLCBzb3VyY2VFbmRQb2ludCwgaXNSZWxhdGl2ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoY29ubmVjdGlvbik7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJUG9pbnQgcCA9IG51bGw7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHsKLQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcSA9IChDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCkgcmVxdWVzdDsKLQkJCXAgPSByZXEuZ2V0TG9jYXRpb24oKTsKLQkJfSBlbHNlIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgTG9jYXRpb25SZXF1ZXN0KSB7Ci0JCQlwID0gKChMb2NhdGlvblJlcXVlc3QpIHJlcXVlc3QpLmdldExvY2F0aW9uKCk7Ci0JCX0KLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJcmVjZW50U291cmNlRW5kUG9pbnQgPSBnZXRMb2NhdGlvbihwKTsKLQkJCXJldHVybiBuZXcgUmVsYXRpdmVYWUFuY2hvcihnZXRGaWd1cmUoKSwgcmVjZW50U291cmNlRW5kUG9pbnQsIHRydWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKHJlcXVlc3QpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoCi0JCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbikgewotCQlib29sZWFuIGlzUmVsYXRpdmUgPSBmYWxzZTsKLQkJUG9pbnQgdGFyZ2V0RW5kUG9pbnQgPSBudWxsOwotCQlpZiAocmVjZW50VGFyZ2V0RW5kUG9pbnQgPT0gbnVsbCkgewotCQkJTGluayBsaW5rID0gKExpbmspIGNvbm5lY3Rpb24uZ2V0TW9kZWwoKTsKLQkJCXRhcmdldEVuZFBvaW50ID0gbGluay5nZXRUYXJnZXRFbmRQb2ludCgpOwotCQkJaXNSZWxhdGl2ZSA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQl0YXJnZXRFbmRQb2ludCA9IHJlY2VudFRhcmdldEVuZFBvaW50OwotCQl9Ci0JCWlmICh0YXJnZXRFbmRQb2ludCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHRhcmdldEVuZFBvaW50LCBpc1JlbGF0aXZlKTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKGNvbm5lY3Rpb24pOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCVBvaW50IHAgPSBudWxsOwotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0KSB7Ci0JCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXEgPSAoQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHJlcXVlc3Q7Ci0JCQlwID0gcmVxLmdldExvY2F0aW9uKCk7Ci0JCX0gZWxzZSBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkgewotCQkJcCA9ICgoTG9jYXRpb25SZXF1ZXN0KSByZXF1ZXN0KS5nZXRMb2NhdGlvbigpOwotCQl9Ci0JCWlmIChwICE9IG51bGwpIHsKLQkJCXJlY2VudFRhcmdldEVuZFBvaW50ID0gZ2V0TG9jYXRpb24ocCk7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHJlY2VudFRhcmdldEVuZFBvaW50LCB0cnVlKTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKHJlcXVlc3QpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5Db25uZWN0aW9uQW5jaG9yTG9jYXRvciNnZXRMb2NhdGlvbihQb2ludCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oUG9pbnQgcmVmZXJlbmNlKSB7Ci0JCXJldHVybiBDbG9zZXN0QW5jaG9yLmdldExvY2F0aW9uKGdldEZpZ3VyZSgpLCByZWZlcmVuY2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1RleHRGaWd1cmVDZWxsRWRpdG9yTG9jYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1RleHRGaWd1cmVDZWxsRWRpdG9yTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NjVlN2RiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9UZXh0RmlndXJlQ2VsbEVkaXRvckxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuVGV4dEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIENvbnN0cmFpbnQgZm9yIFRleHRGbG93IHBsYWNpbmcuCi0gKiBAYXV0aG9yIEphbWVzIFRoYXJpbwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGV4dEZpZ3VyZUNlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IgewotCi0JcHJpdmF0ZSBUZXh0RmlndXJlIGZpZ3VyZTsKLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBMYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvciBmb3IgdGhlIGdpdmVuIHRleHQgZmlndXJlCi0JICogQHBhcmFtIHRmCi0JICovCi0JcHVibGljIFRleHRGaWd1cmVDZWxsRWRpdG9yTG9jYXRvcihUZXh0RmlndXJlIHRmKSB7Ci0JCXNldEZpZ3VyZSh0Zik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDZWxsRWRpdG9yTG9jYXRvciNyZWxvY2F0ZShvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKSB7Ci0JCVRleHRGaWd1cmVDZWxsRWRpdG9yTG9jYXRvci5kb0xvY2F0ZShjZWxsZWRpdG9yLCBmaWd1cmUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkb0xvY2F0ZShDZWxsRWRpdG9yIGNlLCBUZXh0RmlndXJlIGZpZykgewotCQlUZXh0IHRleHQgPSAoVGV4dCkgY2UuZ2V0Q29udHJvbCgpOwotCQlTdHJpbmcgbiA9IChTdHJpbmcpIGNlLmdldFZhbHVlKCk7Ci0JCUdDIGdjID0gbmV3IEdDKHRleHQpOwotCQlQb2ludCBzaXplID0gZ2MudGV4dEV4dGVudChuKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQlpZiAoc2l6ZS54ICE9IDApCi0JCQlzaXplID0gdGV4dC5jb21wdXRlU2l6ZShzaXplLngsIFNXVC5ERUZBVUxUKTsKLQkJdGV4dC5zZXRTaXplKHNpemUueCwgc2l6ZS55KTsKLQkJUmVjdGFuZ2xlIHRleHRCb3VuZHMgPSBuZXcgUmVjdGFuZ2xlKHRleHQuZ2V0Q2xpZW50QXJlYSgpLngsIHRleHQKLQkJCQkuZ2V0Q2xpZW50QXJlYSgpLnksIHRleHQuZ2V0Q2xpZW50QXJlYSgpLndpZHRoLCB0ZXh0Ci0JCQkJLmdldENsaWVudEFyZWEoKS5oZWlnaHQpOwotCQlSZWN0YW5nbGUgZmlnQm91bmRzID0gZmlnLmdldENsaWVudEFyZWEoKTsKLQkJZmlnLnRyYW5zbGF0ZVRvQWJzb2x1dGUoZmlnQm91bmRzKTsKLQkJaW50IGRlbHRhID0gKGZpZ0JvdW5kcy53aWR0aCAtIHRleHRCb3VuZHMud2lkdGgpIC8gMjsKLQkJaW50IHkgPSBmaWcuZ2V0VGV4dEZsb3dQYWdlKCkuZ2V0TG9jYXRpb24oKS55OwotCQl0ZXh0LnNldExvY2F0aW9uKGZpZ0JvdW5kcy54ICsgZGVsdGEsIHkpOwotCX0KLQotCXB1YmxpYyBUZXh0RmlndXJlIGdldEZpZ3VyZSgpIHsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWd1cmUoVGV4dEZpZ3VyZSBmaWd1cmUpIHsKLQkJdGhpcy5maWd1cmUgPSBmaWd1cmU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVGV4dEZpZ3VyZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVGV4dEZpZ3VyZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ5Mzk2ODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1RleHRGaWd1cmVEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuVGV4dEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBNYW5hZ2VzIGRpcmVjdCBlZGl0aW5nIGFuZCBjcmVhdGluZyBjZWxsZWRpdG9yIGZvciB7QGxpbmsgVGV4dEZpZ3VyZX0KLSAqIAotICogQGF1dGhvciBKYW1lcyBUaGFyaW8KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRleHRGaWd1cmVEaXJlY3RFZGl0TWFuYWdlciBleHRlbmRzIERpcmVjdEVkaXRNYW5hZ2VyIHsKLQotCUZvbnQgc2NhbGVkRm9udDsKLQotCXByb3RlY3RlZCBWZXJpZnlMaXN0ZW5lciB2ZXJpZnlMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBUZXh0RmlndXJlIGZpZ3VyZSA9IG51bGw7Ci0KLQlwdWJsaWMgVGV4dEZpZ3VyZURpcmVjdEVkaXRNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwKLQkJCUNsYXNzIGVkaXRvclR5cGUsIENlbGxFZGl0b3JMb2NhdG9yIGxvY2F0b3IsIFRleHRGaWd1cmUgZmlndXJlKSB7Ci0JCXN1cGVyKHNvdXJjZSwgZWRpdG9yVHlwZSwgbG9jYXRvcik7Ci0JCXRoaXMuZmlndXJlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKCkgewotCQlicmluZ0Rvd24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjYnJpbmdEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicmluZ0Rvd24oYm9vbGVhbiBjaGVjaykgewotCQkvLyBUaGlzIG1ldGhvZCBtaWdodCBiZSByZS1lbnRlcmVkIHdoZW4gc3VwZXIuYnJpbmdEb3duKCkgaXMgY2FsbGVkLgotCQlGb250IGRpc3Bvc2VGb250ID0gc2NhbGVkRm9udDsKLQkJc2NhbGVkRm9udCA9IG51bGw7Ci0JCXN1cGVyLmJyaW5nRG93bigpOwotCQlpZiAoZGlzcG9zZUZvbnQgIT0gbnVsbCkKLQkJCWRpc3Bvc2VGb250LmRpc3Bvc2UoKTsKLQkJaWYgKGNoZWNrKSB7Ci0JCQlOYW1lZE5vZGUgbm9kZSA9IChOYW1lZE5vZGUpIGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKTsKLQkJCVN0cmluZyBuYW1lID0gbm9kZS5nZXROYW1lKCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJCU9iamVjdCB3YmVsZW1lbnQgPSBub2RlLmdldE9iamVjdCgpOwotCQkJCWlmICh3YmVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpKSB7Ci0JCQkJCW5hbWUgPSBQcm9jZXNzVXRpbAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpOwotCQkJCX0KLQotCQkJfQotCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJRGlzcGxheQotCQkJCQkJLmdldEN1cnJlbnQoKQotCQkJCQkJLmFzeW5jRXhlYygKLQkJCQkJCQkJbmV3IFByb21wdEVkaXQoCi0JCQkJCQkJCQkJKE5hbWVkTm9kZUVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpLAotCQkJCQkJCQkJCURpYWdyYW1VSVJlc291cmNlcy5lcnJfbmFtZV9lbXB0eSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNpbml0Q2VsbEVkaXRvcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENlbGxFZGl0b3IoKSB7Ci0JCVRleHRDZWxsRWRpdG9yIGVkaXRvciA9IChUZXh0Q2VsbEVkaXRvcikgZ2V0Q2VsbEVkaXRvcigpOwotCQllZGl0b3Iuc2V0U3R5bGUoU1dULk1VTFRJKTsKLQkJVGV4dCB0ID0gKFRleHQpIGVkaXRvci5nZXRDb250cm9sKCk7Ci0JCXZlcmlmeUxpc3RlbmVyID0gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBldmVudCkgewotCQkJCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCQkJCVN0cmluZyBvbGRUZXh0ID0gdGV4dC5nZXRUZXh0KCk7Ci0JCQkJU3RyaW5nIGxlZnRUZXh0ID0gb2xkVGV4dC5zdWJzdHJpbmcoMCwgZXZlbnQuc3RhcnQpOwotCQkJCVN0cmluZyByaWdodFRleHQgPSBvbGRUZXh0LnN1YnN0cmluZyhldmVudC5lbmQsIG9sZFRleHQKLQkJCQkJCS5sZW5ndGgoKSk7Ci0JCQkJR0MgZ2MgPSBuZXcgR0ModGV4dCk7Ci0JCQkJUG9pbnQgc2l6ZSA9IGdjLnRleHRFeHRlbnQobGVmdFRleHQgKyBldmVudC50ZXh0ICsgcmlnaHRUZXh0KTsKLQkJCQlnYy5kaXNwb3NlKCk7Ci0JCQkJaWYgKHNpemUueCAhPSAwKQotCQkJCQlzaXplID0gdGV4dC5jb21wdXRlU2l6ZShzaXplLngsIFNXVC5ERUZBVUxUKTsKLQkJCQlnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpLnNldFNpemUoc2l6ZS54LCBzaXplLnkpOwotCQkJfQotCQl9OwotCQl0LmFkZFZlcmlmeUxpc3RlbmVyKHZlcmlmeUxpc3RlbmVyKTsKLQkJU3RyaW5nIGluaXRpYWxMYWJlbFRleHQgPSAoKE5hbWVkTm9kZUVkaXRQYXJ0KSB0aGlzLmdldEVkaXRQYXJ0KCkpCi0JCQkJLmdldERpcmVjdEVkaXRUZXh0KCk7Ci0JCWVkaXRvci5zZXRWYWx1ZShpbml0aWFsTGFiZWxUZXh0KTsKLQkJdC5zZXRGb250KFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVCk7Ci0JCXQuc2VsZWN0QWxsKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjdW5ob29rTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1bmhvb2tMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnVuaG9va0xpc3RlbmVycygpOwotCQlpZiAoZ2V0Q2VsbEVkaXRvcigpICE9IG51bGwpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCQkJaWYgKHZlcmlmeUxpc3RlbmVyICE9IG51bGwpCi0JCQkJdGV4dC5yZW1vdmVWZXJpZnlMaXN0ZW5lcih2ZXJpZnlMaXN0ZW5lcik7Ci0JCQl2ZXJpZnlMaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSB0eHQKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQsIGFuIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2NvbW1pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tbWl0KCkgewotCQlTdHJpbmcgbXNnID0gdmFsaWRhdGUoKFN0cmluZykgZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCkpOwotCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCWJyaW5nRG93bihmYWxzZSk7Ci0JCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoCi0JCQkJCW5ldyBQcm9tcHRFZGl0KChOYW1lZE5vZGVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSwgbXNnKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuY29tbWl0KCk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFByb21wdEVkaXQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLQkJcHJpdmF0ZSBOYW1lZE5vZGVFZGl0UGFydCBwYXJ0OwotCi0JCXByaXZhdGUgU3RyaW5nIG1zZzsKLQotCQlQcm9tcHRFZGl0KE5hbWVkTm9kZUVkaXRQYXJ0IHBhcnQsIFN0cmluZyBtc2cpIHsKLQkJCXRoaXMucGFydCA9IHBhcnQ7Ci0JCQl0aGlzLm1zZyA9IG1zZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU3RyaW5nIHRpdGxlID0gRGlhZ3JhbVVJUmVzb3VyY2VzLmRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA7IC8vJE5PTi1OTFMtMSQKLQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBtc2cpOyAvLyROT04tTkxTLTEkCi0JCQlwYXJ0LnBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1RvcEFuY2hvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1RvcEFuY2hvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZjgyODJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Ub3BBbmNob3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIENvbm5lY3Rpb24gYW5jaG9yIGZvciB0b3Agb2YgdGhlIGZpZ3VyZS4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLWNsYXNzIFRvcEFuY2hvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbkFuY2hvciB7Ci0KLQlwcml2YXRlIGludCBvZmZzZXQ7Ci0KLQlUb3BBbmNob3IoSUZpZ3VyZSBzb3VyY2UsIGludCBvZmZzZXQpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSkgewotCQlSZWN0YW5nbGUgciA9IGdldE93bmVyKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQlnZXRPd25lcigpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocik7Ci0JCWludCBvZmYgPSBvZmZzZXQ7Ci0JCWlmIChvZmYgPT0gLTEpCi0JCQlvZmYgPSByLndpZHRoIC8gMjsKLQkJaWYgKHIuY29udGFpbnMocmVmZXJlbmNlKSB8fCByLnkgPCByZWZlcmVuY2UueSkKLQkJCXJldHVybiByLmdldEJvdHRvbUxlZnQoKS50cmFuc2xhdGUob2ZmLCAtMSk7Ci0JCWVsc2UKLQkJCXJldHVybiByLmdldFRvcExlZnQoKS50cmFuc2xhdGUob2ZmLCAwKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2NWEzNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1ZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotCi0vKioKLSAqIE1hbmFnZXMgZGlyZWN0IGVkaXRpbmcgYW5kIGNyZWF0aW5nIGNlbGwgZWRpdG9yIGZvciB0aGUge0BsaW5rIExhYmVsfQotICogYW5kIHZhbGlkYXRlcyB0aGUgaW5wdXQuIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlciBleHRlbmRzIERpcmVjdEVkaXRNYW5hZ2VyIHsKLQotCUZvbnQgc2NhbGVkRm9udDsKLQotCXByb3RlY3RlZCBWZXJpZnlMaXN0ZW5lciB2ZXJpZnlMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBMYWJlbCBhY3Rpdml0eUxhYmVsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBBY3Rpdml0eURpcmVjdEVkaXRNYW5hZ2VyIHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSBFZGl0UGFydAotCSAqIEBwYXJhbSBlZGl0b3JUeXBlCi0JICogICAgICAgICAgICB0eXBlIG9mIGVkaXRvcgotCSAqIEBwYXJhbSBsb2NhdG9yCi0JICogICAgICAgICAgICB0aGUgQ2VsbEVkaXRvckxvY2F0b3IKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwKLQkJCUNsYXNzIGVkaXRvclR5cGUsIENlbGxFZGl0b3JMb2NhdG9yIGxvY2F0b3IsIExhYmVsIGxhYmVsKSB7Ci0JCXN1cGVyKHNvdXJjZSwgZWRpdG9yVHlwZSwgbG9jYXRvcik7Ci0JCWFjdGl2aXR5TGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNicmluZ0Rvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJyaW5nRG93bigpIHsKLQkJYnJpbmdEb3duKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKGJvb2xlYW4gY2hlY2spIHsKLQkJLy8gVGhpcyBtZXRob2QgbWlnaHQgYmUgcmUtZW50ZXJlZCB3aGVuIHN1cGVyLmJyaW5nRG93bigpIGlzIGNhbGxlZC4KLQkJRm9udCBkaXNwb3NlRm9udCA9IHNjYWxlZEZvbnQ7Ci0JCXNjYWxlZEZvbnQgPSBudWxsOwotCQlzdXBlci5icmluZ0Rvd24oKTsKLQkJaWYgKGRpc3Bvc2VGb250ICE9IG51bGwpCi0JCQlkaXNwb3NlRm9udC5kaXNwb3NlKCk7Ci0JCWlmIChjaGVjaykgewotCQkJTmFtZWROb2RlIG5vZGUgPSAoTmFtZWROb2RlKSBnZXRFZGl0UGFydCgpLmdldE1vZGVsKCk7Ci0JCQlTdHJpbmcgbmFtZSA9IG5vZGUuZ2V0TmFtZSgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQlPYmplY3Qgd2JlbGVtZW50ID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQlpZiAod2JlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCSYmIFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZygoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KSkgewotCQkJCQluYW1lID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KTsKLQkJCQl9Ci0KLQkJCX0KLQkJCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCURpc3BsYXkKLQkJCQkJCS5nZXRDdXJyZW50KCkKLQkJCQkJCS5hc3luY0V4ZWMoCi0JCQkJCQkJCW5ldyBQcm9tcHRFZGl0KAotCQkJCQkJCQkJCShOYW1lZE5vZGVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSwKLQkJCQkJCQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuZXJyX25hbWVfZW1wdHkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjaW5pdENlbGxFZGl0b3IoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDZWxsRWRpdG9yKCkgewotCQlUZXh0IHRleHQgPSAoVGV4dCkgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLQkJdmVyaWZ5TGlzdGVuZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCQkJU3RyaW5nIG9sZFRleHQgPSB0ZXh0LmdldFRleHQoKTsKLQkJCQlTdHJpbmcgbGVmdFRleHQgPSBvbGRUZXh0LnN1YnN0cmluZygwLCBldmVudC5zdGFydCk7Ci0JCQkJU3RyaW5nIHJpZ2h0VGV4dCA9IG9sZFRleHQuc3Vic3RyaW5nKGV2ZW50LmVuZCwgb2xkVGV4dAotCQkJCQkJLmxlbmd0aCgpKTsKLQkJCQlHQyBnYyA9IG5ldyBHQyh0ZXh0KTsKLQkJCQlQb2ludCBzaXplID0gZ2MudGV4dEV4dGVudChsZWZ0VGV4dCArIGV2ZW50LnRleHQgKyByaWdodFRleHQpOwotCQkJCWdjLmRpc3Bvc2UoKTsKLQkJCQlpZiAoc2l6ZS54ICE9IDApCi0JCQkJCXNpemUgPSB0ZXh0LmNvbXB1dGVTaXplKHNpemUueCwgU1dULkRFRkFVTFQpOwotCQkJCWdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCkuc2V0U2l6ZShzaXplLngsIHNpemUueSk7Ci0JCQl9Ci0JCX07Ci0JCXRleHQuYWRkVmVyaWZ5TGlzdGVuZXIodmVyaWZ5TGlzdGVuZXIpOwotCi0JCVN0cmluZyBpbml0aWFsTGFiZWxUZXh0ID0gYWN0aXZpdHlMYWJlbC5nZXRUZXh0KCk7Ci0JCWdldENlbGxFZGl0b3IoKS5zZXRWYWx1ZShpbml0aWFsTGFiZWxUZXh0KTsKLQkJSUZpZ3VyZSBmaWd1cmUgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpKS5nZXRGaWd1cmUoKTsKLQkJc2NhbGVkRm9udCA9IGZpZ3VyZS5nZXRGb250KCk7Ci0JCUZvbnREYXRhIGRhdGEgPSBzY2FsZWRGb250LmdldEZvbnREYXRhKClbMF07Ci0JCURpbWVuc2lvbiBmb250U2l6ZSA9IG5ldyBEaW1lbnNpb24oMCwgZGF0YS5nZXRIZWlnaHQoKSk7Ci0JCWFjdGl2aXR5TGFiZWwudHJhbnNsYXRlVG9BYnNvbHV0ZShmb250U2l6ZSk7Ci0JCWRhdGEuc2V0SGVpZ2h0KGZvbnRTaXplLmhlaWdodCk7Ci0JCXNjYWxlZEZvbnQgPSBuZXcgRm9udChudWxsLCBkYXRhKTsKLQotCQl0ZXh0LnNldEZvbnQoc2NhbGVkRm9udCk7Ci0JCXRleHQuc2VsZWN0QWxsKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjdW5ob29rTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1bmhvb2tMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnVuaG9va0xpc3RlbmVycygpOwotCQlpZiAoZ2V0Q2VsbEVkaXRvcigpICE9IG51bGwpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCQkJdGV4dC5yZW1vdmVWZXJpZnlMaXN0ZW5lcih2ZXJpZnlMaXN0ZW5lcik7Ci0JCQl2ZXJpZnlMaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSB0eHQKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQsIGFuIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2NvbW1pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tbWl0KCkgewotCQlTdHJpbmcgbXNnID0gdmFsaWRhdGUoKFN0cmluZykgZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCkpOwotCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCWJyaW5nRG93bihmYWxzZSk7Ci0JCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoCi0JCQkJCW5ldyBQcm9tcHRFZGl0KChOYW1lZE5vZGVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSwgbXNnKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuY29tbWl0KCk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFByb21wdEVkaXQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLQkJcHJpdmF0ZSBOYW1lZE5vZGVFZGl0UGFydCBwYXJ0OwotCi0JCXByaXZhdGUgU3RyaW5nIG1zZzsKLQotCQlQcm9tcHRFZGl0KE5hbWVkTm9kZUVkaXRQYXJ0IHBhcnQsIFN0cmluZyBtc2cpIHsKLQkJCXRoaXMucGFydCA9IHBhcnQ7Ci0JCQl0aGlzLm1zZyA9IG1zZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU3RyaW5nIHRpdGxlID0gRGlhZ3JhbVVJUmVzb3VyY2VzLmRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA7IC8vJE5PTi1OTFMtMSQKLQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBtc2cpOyAvLyROT04tTkxTLTEkCi0JCQlwYXJ0LnBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1ZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTA4NjBjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLQotLyoqCi0gKiBNYW5hZ2VzIGRpcmVjdCBlZGl0aW5nIGFuZCBjcmVhdGluZyBjZWxsIGVkaXRvciBmb3IgdGhlIHtAbGluayBMYWJlbH0KLSAqIGFuZCB2YWxpZGF0ZXMgdGhlIGlucHV0LiAKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXIgZXh0ZW5kcyBEaXJlY3RFZGl0TWFuYWdlciB7Ci0KLQlGb250IHNjYWxlZEZvbnQ7Ci0KLQlwcm90ZWN0ZWQgVmVyaWZ5TGlzdGVuZXIgdmVyaWZ5TGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgYWN0aXZpdHlMYWJlbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgQWN0aXZpdHlEaXJlY3RFZGl0TWFuYWdlciB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgRWRpdFBhcnQKLQkgKiBAcGFyYW0gZWRpdG9yVHlwZQotCSAqICAgICAgICAgICAgdHlwZSBvZiBlZGl0b3IKLQkgKiBAcGFyYW0gbG9jYXRvcgotCSAqICAgICAgICAgICAgdGhlIENlbGxFZGl0b3JMb2NhdG9yCi0JICovCi0JcHVibGljIFZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwKLQkJCUNsYXNzIGVkaXRvclR5cGUsIENlbGxFZGl0b3JMb2NhdG9yIGxvY2F0b3IsIExhYmVsIGxhYmVsKSB7Ci0JCXN1cGVyKHNvdXJjZSwgZWRpdG9yVHlwZSwgbG9jYXRvcik7Ci0JCWFjdGl2aXR5TGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNicmluZ0Rvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJyaW5nRG93bigpIHsKLQkJYnJpbmdEb3duKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKGJvb2xlYW4gY2hlY2spIHsKLQkJLy8gVGhpcyBtZXRob2QgbWlnaHQgYmUgcmUtZW50ZXJlZCB3aGVuIHN1cGVyLmJyaW5nRG93bigpIGlzIGNhbGxlZC4KLQkJRm9udCBkaXNwb3NlRm9udCA9IHNjYWxlZEZvbnQ7Ci0JCXNjYWxlZEZvbnQgPSBudWxsOwotCQlzdXBlci5icmluZ0Rvd24oKTsKLQkJaWYgKGRpc3Bvc2VGb250ICE9IG51bGwpCi0JCQlkaXNwb3NlRm9udC5kaXNwb3NlKCk7Ci0JCWlmIChjaGVjaykgewotCQkJR3JhcGhOb2RlIG5vZGUgPSAoKE5vZGUpIGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKSkuZ2V0R3JhcGhOb2RlKCk7Ci0JCQlTdHJpbmcgbmFtZSA9ICgoUHJvcGVydHkpIG5vZGUuZ2V0UHJvcGVydHkoKS5nZXQoMCkpLmdldFZhbHVlKCk7Ci0JCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlEaXNwbGF5Ci0JCQkJCQkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuYXN5bmNFeGVjKAotCQkJCQkJCQluZXcgUHJvbXB0RWRpdCgKLQkJCQkJCQkJCQkoTm9kZUVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpLAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl92YWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2luaXRDZWxsRWRpdG9yKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q2VsbEVkaXRvcigpIHsKLQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCXZlcmlmeUxpc3RlbmVyID0gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBldmVudCkgewotCQkJCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCQkJCVN0cmluZyBvbGRUZXh0ID0gdGV4dC5nZXRUZXh0KCk7Ci0JCQkJU3RyaW5nIGxlZnRUZXh0ID0gb2xkVGV4dC5zdWJzdHJpbmcoMCwgZXZlbnQuc3RhcnQpOwotCQkJCVN0cmluZyByaWdodFRleHQgPSBvbGRUZXh0LnN1YnN0cmluZyhldmVudC5lbmQsIG9sZFRleHQKLQkJCQkJCS5sZW5ndGgoKSk7Ci0JCQkJR0MgZ2MgPSBuZXcgR0ModGV4dCk7Ci0JCQkJUG9pbnQgc2l6ZSA9IGdjLnRleHRFeHRlbnQobGVmdFRleHQgKyBldmVudC50ZXh0ICsgcmlnaHRUZXh0KTsKLQkJCQlnYy5kaXNwb3NlKCk7Ci0JCQkJaWYgKHNpemUueCAhPSAwKQotCQkJCQlzaXplID0gdGV4dC5jb21wdXRlU2l6ZShzaXplLngsIFNXVC5ERUZBVUxUKTsKLQkJCQlnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpLnNldFNpemUoc2l6ZS54LCBzaXplLnkpOwotCQkJfQotCQl9OwotCQl0ZXh0LmFkZFZlcmlmeUxpc3RlbmVyKHZlcmlmeUxpc3RlbmVyKTsKLQotCQlTdHJpbmcgaW5pdGlhbExhYmVsVGV4dCA9IGFjdGl2aXR5TGFiZWwuZ2V0VGV4dCgpOwotCQlnZXRDZWxsRWRpdG9yKCkuc2V0VmFsdWUoaW5pdGlhbExhYmVsVGV4dCk7Ci0JCXRleHQuc2VsZWN0QWxsKCk7Ci0JCUlGaWd1cmUgZmlndXJlID0gKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkuZ2V0RmlndXJlKCk7Ci0JCXNjYWxlZEZvbnQgPSBmaWd1cmUuZ2V0Rm9udCgpOwotCQlGb250RGF0YSBkYXRhID0gc2NhbGVkRm9udC5nZXRGb250RGF0YSgpWzBdOwotCQlEaW1lbnNpb24gZm9udFNpemUgPSBuZXcgRGltZW5zaW9uKDAsIGRhdGEuZ2V0SGVpZ2h0KCkpOwotCQlhY3Rpdml0eUxhYmVsLnRyYW5zbGF0ZVRvQWJzb2x1dGUoZm9udFNpemUpOwotCQlkYXRhLnNldEhlaWdodChmb250U2l6ZS5oZWlnaHQpOwotCQlzY2FsZWRGb250ID0gbmV3IEZvbnQobnVsbCwgZGF0YSk7Ci0KLQkJdGV4dC5zZXRGb250KHNjYWxlZEZvbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI3VuaG9va0xpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdW5ob29rTGlzdGVuZXJzKCkgewotCQlzdXBlci51bmhvb2tMaXN0ZW5lcnMoKTsKLQkJaWYgKGdldENlbGxFZGl0b3IoKSAhPSBudWxsKSB7Ci0JCQlUZXh0IHRleHQgPSAoVGV4dCkgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLQkJCXRleHQucmVtb3ZlVmVyaWZ5TGlzdGVuZXIodmVyaWZ5TGlzdGVuZXIpOwotCQkJdmVyaWZ5TGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB0ZXh0IGlzIHZhbGlkLiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gdHh0Ci0JICogQHJldHVybiBudWxsIGlmIHRoZSBnaXZlbiB0ZXh0IGlzIHZhbGlkLCBhbiBlcnJvciBtZXNzYWdlIG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHR4dCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNjb21taXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbW1pdCgpIHsKLQkJU3RyaW5nIG1zZyA9IHZhbGlkYXRlKChTdHJpbmcpIGdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpKTsKLQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQlicmluZ0Rvd24oZmFsc2UpOwotCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKAotCQkJCQluZXcgUHJvbXB0RWRpdCgoTmFtZWROb2RlRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCksIG1zZykpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmNvbW1pdCgpOwotCX0KLQotCXN0YXRpYyBjbGFzcyBQcm9tcHRFZGl0IGltcGxlbWVudHMgUnVubmFibGUgewotCi0JCXByaXZhdGUgTm9kZUVkaXRQYXJ0IHBhcnQ7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgbXNnOwotCi0JCVByb21wdEVkaXQoTm9kZUVkaXRQYXJ0IHBhcnQsIFN0cmluZyBtc2cpIHsKLQkJCXRoaXMucGFydCA9IHBhcnQ7Ci0JCQl0aGlzLm1zZyA9IG1zZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU3RyaW5nIHRpdGxlID0gRGlhZ3JhbVVJUmVzb3VyY2VzLmRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBwcm9ibGVtID0gRGlhZ3JhbVVJUmVzb3VyY2VzLmRpYWdyYW1fbm9kZV9wcm9wZXJ0eV92YWx1ZV9wcm9ibGVtX21zZzsgLy8kTk9OLU5MUy0xJAotCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIHByb2JsZW0sIG1zZyk7IC8vJE5PTi1OTFMtMSQKLQkJCXBhcnQucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV1BEaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV1BEaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBjNDc3ZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dQRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtLiBTdXBwb3J0IGNyZWF0aW9uIAotICogb2YgY2hpbGQgZWRpdHBhcnQgaW4gV29ya1BSb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtLiAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXUERpYWdyYW1FZGl0UGFydEZhY3RvcnkgaW1wbGVtZW50cyBFZGl0UGFydEZhY3RvcnkgewotCi0JcHVibGljIFdQRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3RvcnkjY3JlYXRlRWRpdFBhcnQoRWRpdFBhcnQsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoRWRpdFBhcnQgY29udGV4dCwgT2JqZWN0IG1vZGVsKSB7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCXJldHVybiBuZXcgRGlhZ3JhbUVkaXRQYXJ0KChEaWFncmFtKSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdE5vZGUpIHsKLQkJCXJldHVybiBuZXcgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQoKE5hbWVkTm9kZSkgbW9kZWwpOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgTGluaykgewotCQkJcmV0dXJuIG5ldyBMaW5rRWRpdFBhcnQoKExpbmspIG1vZGVsKTsKLQkJfQotCQkvLyB0eXBlZCBub2RlIGNyZWF0aW9uCi0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJVHlwZWROb2RlIG5vZGUgPSAoVHlwZWROb2RlKSBtb2RlbDsKLQkJCXN3aXRjaCAobm9kZS5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgVHlwZWROb2RlLlNUQVJUOgotCQkJCXJldHVybiBuZXcgU3RhcnROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5FTkQ6Ci0JCQkJcmV0dXJuIG5ldyBFbmROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5ERUNJU0lPTjoKLQkJCQlyZXR1cm4gbmV3IERlY2lzaW9uTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuU1lOQ0hfQkFSOgotCQkJCXJldHVybiBuZXcgU3luY2hCYXJOb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5GUkVFX1RFWFQ6Ci0JCQkJcmV0dXJuIG5ldyBGcmVlVGV4dE5vZGVFZGl0UGFydChub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9XUE5vZGVFZGl0UGFydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dQTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk3OTFlYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dQTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5TZWxlY3RhYmxlTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5XUENvbXBhcnRtZW50RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBkZXByZWNhdGVkIAotICogQHNlZSBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydAotICovCi1wdWJsaWMgY2xhc3MgV1BOb2RlRWRpdFBhcnQgZXh0ZW5kcyBOYW1lZE5vZGVFZGl0UGFydCB7Ci0KLQlpbnQgdHlwZSA9IDE7Ci0KLQlwdWJsaWMgV1BOb2RlRWRpdFBhcnQoTmFtZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCWlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3ROb2RlKSB7Ci0JCQl0eXBlID0gKChXb3JrUHJvZHVjdE5vZGUpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJfQotCQlMYWJlbCBsID0gbmV3IFNlbGVjdGFibGVMYWJlbCgpOwotCQlsLnNldExhYmVsQWxpZ25tZW50KFBvc2l0aW9uQ29uc3RhbnRzLkxFRlQpOwotCQlsLnNldFRleHRQbGFjZW1lbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOwotCQlsLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250KG51bGwsICJBcmlhbCIsIDksIFNXVC5OT1JNQUwpOyAvLyROT04tTkxTLTEkCi0JCWwuc2V0Rm9udChmb250KTsKLQkJaWYgKHR5cGUgPT0gMSkKLQkJCWwuc2V0SWNvbihJbWFnZXMuQVJUSUZBQ1QpOwotCQllbHNlIGlmICh0eXBlID09IDIpCi0JCQlsLnNldEljb24oSW1hZ2VzLkRFTElWRVJBQkxFKTsKLQkJZWxzZSBpZiAodHlwZSA9PSAzKQotCQkJbC5zZXRJY29uKEltYWdlcy5PVVRDT01FKTsKLQkJZWxzZQotCQkJbC5zZXRJY29uKEltYWdlcy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUik7Ci0JCWwuc2V0SWNvblRleHRHYXAoNSk7Ci0KLQkJV1BDb21wYXJ0bWVudEZpZ3VyZSB3cGZpZ3VyZSA9IG5ldyBXUENvbXBhcnRtZW50RmlndXJlKGwsIHR5cGUpOwotCQlyZXR1cm4gd3BmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkJhc2VFZGl0UGFydCNjcmVhdGVEaXJlY3RFZGl0TWFuYWdlcigpCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGNyZWF0ZURpcmVjdEVkaXRNYW5hZ2VyKCkgewotCQlMYWJlbCBsID0gKExhYmVsKSAoKChXUENvbXBhcnRtZW50RmlndXJlKSBnZXRGaWd1cmUoKSkuZ2V0TGFiZWwoKSk7Ci0JCXJldHVybiBuZXcgVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHRDZWxsRWRpdG9yLmNsYXNzLAotCQkJCW5ldyBMYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvcihsKSwgbCkgewotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3ROb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmo7Ci0JCQkJCU9iamVjdCBlID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBub2RlLmdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpOwotCQkJCQlyZXR1cm4gVG5nVXRpbC5jaGVja1dvcmtQcm9kdWN0RGVzY3JpcHRvclByZXNlbnRhdGlvbk5hbWUoCi0JCQkJCQkJZSwgdHh0LCBzdXBwcmVzc2lvbik7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHR4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JSUZpZ3VyZSBnZXREaXJlY3RFZGl0RmlndXJlKCkgewotCQlyZXR1cm4gKCgoV1BDb21wYXJ0bWVudEZpZ3VyZSkgZ2V0RmlndXJlKCkpLmdldExhYmVsKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUVkaXRQYXJ0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjE5YmU3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuQWN0aXZpdHlGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5Db2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5UZXh0RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIENvbW1vbiBlZGl0cGFydCBmb3IgZGlmZmVyZW50IHtAbGluayBEZXNjcmlwdG9yfQotICogUHJvdmlkZXMgc3VwcG9ydCBmb3Igd29yZC13cmFwIG9mIGVkaXRwYXJ0J3Mgb2JqZWN0IG5hbWUuIAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlRWRpdFBhcnQgZXh0ZW5kcyBOYW1lZE5vZGVFZGl0UGFydCB7Ci0KLQlwdWJsaWMgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlRWRpdFBhcnQoTmFtZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTmFtZWROb2RlRWRpdFBhcnQjZ2V0SW1hZ2UoKQotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJSW1hZ2UgaW1nID0gbnVsbDsKLQkJTm9kZSBub2RlID0gKE5vZGUpIGdldE1vZGVsKCk7Ci0JCU9iamVjdCBvYmogPSBub2RlLmdldE9iamVjdCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUGhhc2UpIHsKLQkJCWltZyA9IEltYWdlcy5QSEFTRTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJdGVyYXRpb24pIHsKLQkJCWltZyA9IEltYWdlcy5JVEVSQVRJT047Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCWltZyA9IEltYWdlcy5BQ1RJVklUWTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJaW1nID0gSW1hZ2VzLlRBU0tfREVTQ1JJUFRPUjsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCWltZyA9IEltYWdlcy5NSUxFU1RPTkU7Ci0JCX0KLQkJcmV0dXJuIGltZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUFjdGl2aXR5RmlndXJlIGZpZ3VyZSA9IG5ldyBBY3Rpdml0eUZpZ3VyZSgpOwotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlKCk7Ci0JCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQlmaWd1cmUuYWRkKGltYWdlKTsKLQkJfQotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCVN0cmluZyBnZXREaXJlY3RFZGl0VGV4dCgpIHsKLQkJVGV4dEZpZ3VyZSBub3RlID0gKFRleHRGaWd1cmUpIGdldEZpZ3VyZSgpOwotCQlyZXR1cm4gbm90ZS5nZXRUZXh0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCUlGaWd1cmUgZmlnID0gZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpOwotCQlpZiAoZmlnIGluc3RhbmNlb2YgQWN0aXZpdHlGaWd1cmUpIHsKLQkJCUFjdGl2aXR5RmlndXJlIGwgPSAoQWN0aXZpdHlGaWd1cmUpIGZpZzsKLQkJCWZpZy5zZXRGb3JlZ3JvdW5kQ29sb3IoZ2V0Rm9yZWdyb3VuZENvbG9yKCkpOwotCQkJU3RyaW5nIHRleHQ7Ci0JCQkvLyBCZWxvdyBjaGVjayBpcyByZXF1aXJlZCBmb3IgRXh0ZW5kZWQgQWN0aXZpdHkgcHJlc2VudGF0aW9uIG5hbWUKLQkJCS8vIHNob3VsZCBiZSB1c2VkIGZyb20gYmFzZS4KLQkJCWlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIG5vZGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSBnZXRNb2RlbCgpOwotCQkJCU9iamVjdCB3YmVsZW1lbnQgPSBub2RlLmdldE9iamVjdCgpOwotCQkJCWlmICh3YmVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpKSB7Ci0JCQkJCXRleHQgPSBQcm9jZXNzVXRpbAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGV4dCA9ICgoTmFtZWROb2RlKSBnZXRNb2RlbCgpKS5nZXROYW1lKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGV4dCA9ICgoTmFtZWROb2RlKSBnZXRNb2RlbCgpKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCWlmIChnZXRQYXJlbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Ci0JCQkJCQl8fCBnZXRQYXJlbnQoKS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSB7Ci0JCQkJCWludCB3ID0gV1JBUF9XSURUSDsKLQkJCQkJaWYgKHRoaXMuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpCi0JCQkJCQl3ID0gV09SS19QUk9EVUNUX1dSQVBfV0lEVEg7Ci0JCQkJCXRleHQgPSB3cmFwKHRleHQsIHcpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKLQkJCX0KLQkJCWwuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ29sb3IgZ2V0Rm9yZWdyb3VuZENvbG9yKCkgewotCQlOYW1lZE5vZGUgbm9kZSA9IChOYW1lZE5vZGUpIGdldE1vZGVsKCk7Ci0JCWlmIChub2RlLmlzU3VwcHJlc3NlZCgpKSB7Ci0JCQlyZXR1cm4gQ29sb3JzLlNVUFJFU1NFRF9FTEVNRU5UX0xBQkVMOwotCQl9Ci0JCWlmIChub2RlLmlzUmVhZE9ubHkoKSkgewotCQkJcmV0dXJuIENvbG9ycy5JTkhFUklURURfRUxFTUVOVF9MQUJFTDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBDb2xvckNvbnN0YW50cy5ibGFjazsKLQkJfQotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZURpcmVjdEVkaXRNYW5hZ2VyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgY3JlYXRlRGlyZWN0RWRpdE1hbmFnZXIoKSB7Ci0JCXJldHVybiBuZXcgVGV4dEZpZ3VyZURpcmVjdEVkaXRNYW5hZ2VyKChHcmFwaGljYWxFZGl0UGFydCkgdGhpcywKLQkJCQlUZXh0Q2VsbEVkaXRvci5jbGFzcywgbmV3IFRleHRGaWd1cmVDZWxsRWRpdG9yTG9jYXRvcigKLQkJCQkJCShUZXh0RmlndXJlKSBnZXRGaWd1cmUoKSksIChUZXh0RmlndXJlKSBnZXRGaWd1cmUoKSkgewotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBub2RlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgb2JqOwotCQkJCQlPYmplY3QgZSA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCXJldHVybiBUbmdVdGlsLmNoZWNrV0JTQWN0aXZpdHlQcmVzZW50YXRpb25OYW1lKGUsIHR4dCwgbm9kZS5nZXREaWFncmFtKCkuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXR1cm4gVG5nVXRpbAotCQkJCQkJCQkuY2hlY2tXb3JrQnJlYWtkb3duRWxlbWVudFByZXNlbnRhdGlvbk5hbWUoZSwKLQkJCQkJCQkJCQl0eHQsIG5vZGUuZ2V0RGlhZ3JhbSgpLmdldFN1cHByZXNzaW9uKCkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHR4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOThhYzY5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ2hvcGJveEFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GbG93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DcmVhdGVMaW5rQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5SZWNvbm5lY3RMaW5rQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkNvbm5lY3Rpb25BbmNob3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVGVtcGxhdGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db25uZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5SZWNvbm5lY3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCBpcyBjb250YWluZXIgd2l0aCB7QGxpbmsgRmxvd0xheW91dH0sIGFuZCBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZy9yZW1vdmluZyBjaGlsZCBlZGl0cGFydC4KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQgZXh0ZW5kcyBOb2RlQ29udGFpbmVyRWRpdFBhcnQKLQkJaW1wbGVtZW50cyBOb2RlRWRpdFBhcnQgewotCi0JLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xvciBCR19DT0xPUiA9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgMjU1LAotCS8vCQkyNTUsIDIwNSk7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29sb3IgQkdfQ09MT1I7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydChXb3JrUHJvZHVjdENvbXBvc2l0ZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlGaWd1cmUgZmlndXJlID0gbmV3IEZpZ3VyZSgpOwotCQlGbG93TGF5b3V0IGxheW91dCA9IG5ldyBGbG93TGF5b3V0KCk7Ci0JCWxheW91dC5zZXRNaW5vclNwYWNpbmcoMjApOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQlmaWd1cmUuc2V0Qm9yZGVyKG5ldyBSYWlzZWRNYXJnaW5Cb3JkZXIoKSk7Ci0JCWZpZ3VyZS5zZXRCYWNrZ3JvdW5kQ29sb3IoZ2V0QmFja2dyb3VuZENvbG9yKCkpOwotCQlmaWd1cmUuc2V0T3BhcXVlKHRydWUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlQ29udGFpbmVyRWRpdFBhcnQjaGFuZGxlUHJvcGVydHlDaGFuZ2VkKE5vdGlmaWNhdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTm9kZUNvbnRhaW5lci5jbGFzcykpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX05PREVTOgotCQkJcmVmcmVzaENoaWxkcmVuKCk7Ci0JCQkKLQkJCWFkanVzdFNpemUoKTsKLQkJCQotCQkJLy8gcmVmcmVzaCBkaWFncmFtJ3MgY2hpbGRyZW4KLQkJCUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCA9IGdldFBhcmVudCgpOwotCQkJZGlhZ3JhbUVkaXRQYXJ0LnJlZnJlc2goKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlZChtc2cpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGp1c3RTaXplKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCUxpc3QgbGlzdCA9IGdldENoaWxkcmVuKCk7Ci0JCWludCB0SGVpZ2h0ID0gMjA7Ci0JCWludCB0V2lkdGggPSAyMDsKLQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KWl0ZXJhdG9yLm5leHQoKTsKLQkJCXRIZWlnaHQrPWVkaXRwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQlpZih0V2lkdGggPCBlZGl0cGFydC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGgpewotCQkJCXRXaWR0aCA9IGVkaXRwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCX0KLQkJfQotCQkoKE5vZGUpIHRoaXMuZ2V0TW9kZWwoKSkuc2V0SGVpZ2h0KHRIZWlnaHQpOwotCQkoKE5vZGUpIHRoaXMuZ2V0TW9kZWwoKSkuc2V0V2lkdGgodFdpZHRoKzIwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5KCkgewotCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb25uZWN0aW9uQ29tcGxldGVDb21tYW5kKAotCQkJCQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCUNyZWF0ZUxpbmtDb21tYW5kIGNtZCA9IChDcmVhdGVMaW5rQ29tbWFuZCkgcmVxdWVzdAotCQkJCQkJCQkuZ2V0U3RhcnRDb21tYW5kKCk7Ci0JCQkJCQljbWQuc2V0VGFyZ2V0KChOb2RlKSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSk7Ci0KLQkJCQkJCWlmIChyZXF1ZXN0LmdldFRhcmdldEVkaXRQYXJ0KCkgaW5zdGFuY2VvZiBDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgewotCQkJCQkJCWlmIChyZXF1ZXN0LmdldFRhcmdldEVkaXRQYXJ0KCkuZXF1YWxzKAotCQkJCQkJCQkJcmVxdWVzdC5nZXRTb3VyY2VFZGl0UGFydCgpKSkgewotCi0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJY21kCi0JCQkJCQkJCQkJLnNldFRhcmdldEVuZFBvaW50KCgoQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHJlcXVlc3QKLQkJCQkJCQkJCQkJCS5nZXRUYXJnZXRFZGl0UGFydCgpKQotCQkJCQkJCQkJCQkJLmdldExvY2F0aW9uKHJlcXVlc3QKLQkJCQkJCQkJCQkJCQkJLmdldExvY2F0aW9uKCkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCXJldHVybiBjbWQ7Ci0JCQkJCX0KLQotCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb25uZWN0aW9uQ3JlYXRlQ29tbWFuZCgKLQkJCQkJCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlDcmVhdGVMaW5rQ29tbWFuZCBjbWQgPSBuZXcgQ3JlYXRlTGlua0NvbW1hbmQoCi0JCQkJCQkJCU1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluaygpLAotCQkJCQkJCQkoTm9kZSkgZ2V0SG9zdCgpLmdldE1vZGVsKCkpOwotCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0RWRpdFBhcnQoKSBpbnN0YW5jZW9mIENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSB7Ci0JCQkJCQkJY21kCi0JCQkJCQkJCQkuc2V0U291cmNlRW5kUG9pbnQoKChDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgcmVxdWVzdAotCQkJCQkJCQkJCQkuZ2V0VGFyZ2V0RWRpdFBhcnQoKSkKLQkJCQkJCQkJCQkJLmdldExvY2F0aW9uKHJlcXVlc3QuZ2V0TG9jYXRpb24oKSkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljbWQuc2V0U291cmNlRW5kUG9pbnQocmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0KLQkJCQkJCXJlcXVlc3Quc2V0U3RhcnRDb21tYW5kKGNtZCk7Ci0KLQkJCQkJCXJldHVybiBjbWQ7Ci0KLQkJCQkJfQotCi0JCQkJCXByb3RlY3RlZCBDb21tYW5kIGdldFJlY29ubmVjdFNvdXJjZUNvbW1hbmQoCi0JCQkJCQkJUmVjb25uZWN0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgcmVxdWVzdC5nZXRDb25uZWN0aW9uRWRpdFBhcnQoKQotCQkJCQkJCQkuZ2V0TW9kZWwoKTsKLQkJCQkJCVJlY29ubmVjdExpbmtDb21tYW5kIGNtZCA9IG5ldyBSZWNvbm5lY3RMaW5rQ29tbWFuZCgKLQkJCQkJCQkJbGluaywgKE5vZGUpIGdldEhvc3QoKS5nZXRNb2RlbCgpLCB0cnVlKTsKLQkJCQkJCWlmIChyZXF1ZXN0LmdldFRhcmdldCgpIGluc3RhbmNlb2YgQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHsKLQkJCQkJCQljbWQuc2V0RW5kUG9pbnQoKChDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgcmVxdWVzdAotCQkJCQkJCQkJLmdldFRhcmdldCgpKS5nZXRMb2NhdGlvbihyZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSkpOwotCQkJCQkJfQotCi0JCQkJCQlyZXR1cm4gY21kOwotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVjb25uZWN0VGFyZ2V0Q29tbWFuZCgKLQkJCQkJCQlSZWNvbm5lY3RSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCUxpbmsgbGluayA9IChMaW5rKSByZXF1ZXN0LmdldENvbm5lY3Rpb25FZGl0UGFydCgpCi0JCQkJCQkJCS5nZXRNb2RlbCgpOwotCQkJCQkJUmVjb25uZWN0TGlua0NvbW1hbmQgY21kID0gbmV3IFJlY29ubmVjdExpbmtDb21tYW5kKAotCQkJCQkJCQlsaW5rLCAoTm9kZSkgZ2V0SG9zdCgpLmdldE1vZGVsKCksIGZhbHNlKTsKLQkJCQkJCWlmIChyZXF1ZXN0LmdldFRhcmdldCgpIGluc3RhbmNlb2YgQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHsKLQkJCQkJCQljbWQuc2V0RW5kUG9pbnQoKChDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgcmVxdWVzdAotCQkJCQkJCQkJLmdldFRhcmdldCgpKS5nZXRMb2NhdGlvbihyZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSkpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIGNtZDsKLQkJCQkJfQotCQkJCX0pOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBudWxsKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT01QT05FTlRfUk9MRSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcigKLQkJCUNvbm5lY3Rpb25FZGl0UGFydCBjb25uZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgQ2hvcGJveEFuY2hvcihnZXRGaWd1cmUoKSk7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJcmV0dXJuIG5ldyBDaG9wYm94QW5jaG9yKGdldEZpZ3VyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKAotCQkJQ29ubmVjdGlvbkVkaXRQYXJ0IGNvbm5lY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBDaG9wYm94QW5jaG9yKGdldEZpZ3VyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKFJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gbmV3IENob3Bib3hBbmNob3IoZ2V0RmlndXJlKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsU291cmNlQ29ubmVjdGlvbnMoKSB7Ci0JCXJldHVybiBnZXROb2RlKCkuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsVGFyZ2V0Q29ubmVjdGlvbnMoKSB7Ci0JCXJldHVybiBnZXROb2RlKCkuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpOwotCX0KLQotCXByb3RlY3RlZCBOb2RlIGdldE5vZGUoKSB7Ci0JCXJldHVybiAoTm9kZSkgZ2V0TW9kZWwoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbG9yIGdldEJhY2tncm91bmRDb2xvcigpewotCQlpZihCR19DT0xPUiAhPSBudWxsKSByZXR1cm4gQkdfQ09MT1I7Ci0JCQotCQlpZihCR19DT0xPUiA9PSBudWxsKXsKLQkJCVN0cmluZyBjb2xvclN0cmluZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJCVRlbXBsYXRlQ29uc3RhbnRzLkFERF9XUF9CT1hfQkdfQ09MT1JfUkdCKTsKLQkJCWlmKGNvbG9yU3RyaW5nICE9IG51bGwgJiYgY29sb3JTdHJpbmcubGVuZ3RoKCkgPiAwKXsKLQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihjb2xvclN0cmluZywgIiwiKTsKLQkJCQlpbnQgciA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlpbnQgZyA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlpbnQgYiA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlCR19DT0xPUiA9IG5ldyBDb2xvcihudWxsLCByLGcsYik7Ci0JCQkJcmV0dXJuIEJHX0NPTE9SOwotCQkJfQotCQl9Ci0JCWlmKEJHX0NPTE9SID09IG51bGwpewotCQkJQkdfQ09MT1IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIDI1NSwKLQkJCQkJCQkyNTUsIDIwNSk7Ci0JCX0KLQkJcmV0dXJuIEJHX0NPTE9SOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Xb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRlNzgxNTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIHtAbGluayBXb3JrUHJvZHVjdERlc2NyaXB0b3J9LgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydCBleHRlbmRzIE5hbWVkTm9kZUVkaXRQYXJ0IHsKLQotCXB1YmxpYyBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydChOYW1lZE5vZGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5OYW1lZE5vZGVFZGl0UGFydCNnZXRJbWFnZSgpCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkgewotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdE5vZGUpIHsKLQkJCVdvcmtQcm9kdWN0Tm9kZSBub2RlID0gKFdvcmtQcm9kdWN0Tm9kZSkgbW9kZWw7Ci0JCQlzd2l0Y2ggKG5vZGUuZ2V0VHlwZSgpKSB7Ci0JCQljYXNlIFdvcmtQcm9kdWN0Tm9kZS5BUlRJRkFDVDoKLQkJCQlyZXR1cm4gSW1hZ2VzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SXzE2OwotCQkJY2FzZSBXb3JrUHJvZHVjdE5vZGUuREVMSVZFUkFCTEU6Ci0JCQkJcmV0dXJuIEltYWdlcy5ERUxJVkVSQUJMRTsKLQkJCWNhc2UgV29ya1Byb2R1Y3ROb2RlLk9VVENPTUU6Ci0JCQkJcmV0dXJuIEltYWdlcy5PVVRDT01FOwotCQkJfQotCQkJcmV0dXJuIEltYWdlcy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl8xNjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTmFtZWROb2RlRWRpdFBhcnQjY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGNyZWF0ZURpcmVjdEVkaXRNYW5hZ2VyKCkgewotCQlMYWJlbCBsID0gKExhYmVsKSBnZXRGaWd1cmUoKTsKLQkJcmV0dXJuIG5ldyBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dENlbGxFZGl0b3IuY2xhc3MsCi0JCQkJbmV3IExhYmVsVGV4dENlbGxFZGl0b3JMb2NhdG9yKGwpLCBsKSB7Ci0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQlPYmplY3Qgb2JqID0gZ2V0RWRpdFBhcnQoKS5nZXRNb2RlbCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdE5vZGUpIHsKLQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iajsKLQkJCQkJT2JqZWN0IGUgPSBub2RlLmdldE9iamVjdCgpOwotCQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IG5vZGUuZ2V0RGlhZ3JhbSgpLmdldFN1cHByZXNzaW9uKCk7Ci0JCQkJCXJldHVybiBUbmdVdGlsLmNoZWNrV29ya1Byb2R1Y3REZXNjcmlwdG9yUHJlc2VudGF0aW9uTmFtZSgKLQkJCQkJCQllLCB0eHQsIHN1cHByZXNzaW9uKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHR4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzExZmYzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZGlzcGxheSBhbmQgZWRpdGluZyBzdXBwb3J0IGZvciB0aGUgYWN0aXZpdHkgZGlhZ3JhbXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0RpYWdyYW1MYXlvdXRFZGl0UG9saWN5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUxheW91dEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzM0OWRjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUxheW91dEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ2hhbmdlQm91bmRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DaGFuZ2VIZWlnaHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNyZWF0ZU5vZGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLk1vdmVCZW5kcG9pbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbnN0cmFpbmVkTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5YWUxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci0KLS8qKgotICogQW4gRWRpdFBvbGljeSBmb3IgdXNlIHdpdGggPGNvZGU+RmlndXJlczwvY29kZT4gaW4ge0BsaW5rIFhZTGF5b3V0fSBvZiBkaWFncmFtLiBUaGUgY29uc3RyYWludCBmb3IKLSAqIFhZTGF5b3V0IGlzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGV9LiBJbXBsZW1lbnRzIHRoZSBjaGFuZ2Vjb25zdHJhaW50LCBkZWxldGUsCi0gKiByZXNpemUgY29tbWFuZHMgb2Yge0BsaW5rIENvbnN0cmFpbmVkTGF5b3V0RWRpdFBvbGljeX0KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1MYXlvdXRFZGl0UG9saWN5IGV4dGVuZHMgWFlMYXlvdXRFZGl0UG9saWN5IHsKLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdFBhcnQgY2hpbGQsIE9iamVjdCBjb25zdHJhaW50KSB7Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNoYW5nZUNvbnN0cmFpbnRDb21tYW5kKEVkaXRQYXJ0IGNoaWxkLAotCQkJT2JqZWN0IGNvbnN0cmFpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ2hhbmdlQ29uc3RyYWludENvbW1hbmQoCi0JCQlDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QsIEVkaXRQYXJ0IGNoaWxkLCBPYmplY3QgY29uc3RyYWludCkgewotCQkKLQkJLy8gc3BlY2lhbCBmb3IgQURECi0JCUVkaXRQYXJ0IHBhcmVudCA9IGNoaWxkLmdldFBhcmVudCgpOwotCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCl7Ci0JCQlTdHJpbmcgYXV0b2xheW91dCA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0QXV0b0xheW91dEZsYWcoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkoTm9kZSlwYXJlbnQuZ2V0TW9kZWwoKSk7Ci0JCQlpZihhdXRvbGF5b3V0ICE9IG51bGwpewotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuY3JlYXRlUHJvcGVydHkoKChOb2RlKXBhcmVudC5nZXRNb2RlbCgpKS5nZXRHcmFwaE5vZGUoKSwKLQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0FVVE9fTEFZT1VULCAKLQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0FVVE9fTEFZT1VUX1ZBTFVFX0ZBTFNFKTsKLQkJCX0KLQkJfQotCQkKLQkJTm9kZSBub2RlID0gKE5vZGUpIGNoaWxkLmdldE1vZGVsKCk7Ci0JCWludCBkaXJlY3Rpb25zID0gcmVxdWVzdC5nZXRSZXNpemVEaXJlY3Rpb24oKTsKLQkJCi0JCWlmICgoZGlyZWN0aW9ucyAmIFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIX1NPVVRIKSAKLQkJCQk9PSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCl7Ci0JCQlQb2ludCBuZXdMb2NhdGlvbiA9IG5vZGUuZ2V0TG9jYXRpb24oKS5nZXRUcmFuc2xhdGVkKAotCQkJCQlyZXF1ZXN0LmdldE1vdmVEZWx0YSgpKTsKLQkJCWludCBuZXdIZWlnaHQgPSByZXF1ZXN0LmdldFNpemVEZWx0YSgpLmhlaWdodDsKLQkJCWlmIChuZXdIZWlnaHQgIT0gMCkgewotCQkJCW5ld0hlaWdodCArPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuaGVpZ2h0OwotCQkJCWlmIChuZXdIZWlnaHQgPCAxMCkKLQkJCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQl9IGVsc2UKLQkJCQluZXdIZWlnaHQgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuaGVpZ2h0OwotCQkJcmV0dXJuIG5ldyBDaGFuZ2VIZWlnaHRDb21tYW5kKG5vZGUsIG5ld0xvY2F0aW9uLCBuZXdIZWlnaHQpOwotCQl9Ci0JCWVsc2V7Ci0JCQkvLyBPdGhlciBkaXJlY3Rpb25zIGFyZSBFQVNUIFdFU1QuIAotCQkJUG9pbnQgbmV3TG9jYXRpb24gPSBub2RlLmdldExvY2F0aW9uKCkuZ2V0VHJhbnNsYXRlZCgKLQkJCQkJcmVxdWVzdC5nZXRNb3ZlRGVsdGEoKSk7Ci0JCQlpbnQgbmV3V2lkdGggPSByZXF1ZXN0LmdldFNpemVEZWx0YSgpLndpZHRoOwotCQkJaWYgKG5ld1dpZHRoICE9IDApIHsKLQkJCQluZXdXaWR0aCArPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCQkJaWYgKG5ld1dpZHRoIDwgMTApCi0JCQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQkJfSBlbHNlCi0JCQkJbmV3V2lkdGggPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCQlyZXR1cm4gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQobm9kZSwgbmV3TG9jYXRpb24sIG5ld1dpZHRoKTsKLQkJfSAKLQl9Ci0KLQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJUmVzaXphYmxlRWRpdFBvbGljeSBjaGlsZFBvbGljeSA9IG5ldyBSZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCWlmKGNoaWxkIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCB8fAotCQkJCWNoaWxkIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCl7Ci0JCQljaGlsZFBvbGljeS5zZXRSZXNpemVEaXJlY3Rpb25zKFBvc2l0aW9uQ29uc3RhbnRzLk5TRVcpOwotCQl9ZWxzZXsKLQkJCWNoaWxkUG9saWN5LnNldFJlc2l6ZURpcmVjdGlvbnMoUG9zaXRpb25Db25zdGFudHMuRUFTVF9XRVNUKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRQb2xpY3k7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlQb2ludCBsb2MgPSByZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0JCQlnZXRIb3N0RmlndXJlKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShsb2MpOwotCQkJcmV0dXJuIG5ldyBDcmVhdGVOb2RlQ29tbWFuZCgoTm9kZSkgcmVxdWVzdC5nZXROZXdPYmplY3QoKSwKLQkJCQkJKERpYWdyYW0pIGdldEhvc3QoKS5nZXRNb2RlbCgpLCBsb2MpOwotCQl9Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGdldERlbGV0ZURlcGVuZGFudENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlc2l6ZUNoaWxkcmVuQ29tbWFuZChDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJQ29tcG91bmRDb21tYW5kIHJlc2l6ZSA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkJQ29tbWFuZCBjOwotCQlHcmFwaGljYWxFZGl0UGFydCBjaGlsZDsKLQkJTGlzdCBjaGlsZHJlbiA9IHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJY2hpbGQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuLmdldChpKTsKLQkJCWMgPSBjcmVhdGVDaGFuZ2VDb25zdHJhaW50Q29tbWFuZCgKLQkJCQkJcmVxdWVzdCwKLQkJCQkJY2hpbGQsCi0JCQkJCXRyYW5zbGF0ZVRvTW9kZWxDb25zdHJhaW50KGdldENvbnN0cmFpbnRGb3IocmVxdWVzdCwgY2hpbGQpKSk7Ci0JCQlyZXNpemUuYWRkKGMpOwotCQkJaWYgKCFjaGlsZC5nZXRTb3VyY2VDb25uZWN0aW9ucygpLmlzRW1wdHkoKSkgewotCQkJCUxpc3QgbGlzdCA9IGNoaWxkLmdldFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTGlua0VkaXRQYXJ0KSB7Ci0JCQkJCQlFZGl0UGFydCByb290ZWRpdCA9IGNoaWxkLmdldFBhcmVudCgpOwotCQkJCQkJTGlzdCBzZWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlpZiAocm9vdGVkaXQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpIHsKLQkJCQkJCQlzZWwgPSAoKERpYWdyYW1FZGl0UGFydCkgcm9vdGVkaXQpLmdldFZpZXdlcigpCi0JCQkJCQkJCQkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJCQkJCX0KLQkJCQkJCUVkaXRQYXJ0IHBhcnQgPSAoKExpbmtFZGl0UGFydCkgb2JqKS5nZXRUYXJnZXQoKTsKLQkJCQkJCWlmIChzZWwuY29udGFpbnMocGFydCkpIHsKLQkJCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgKChMaW5rRWRpdFBhcnQpIG9iaikuZ2V0TW9kZWwoKTsKLQkJCQkJCQkoKERpYWdyYW1FZGl0UGFydCkgcm9vdGVkaXQpLmdldFZpZXdlcigpCi0JCQkJCQkJCQkuYXBwZW5kU2VsZWN0aW9uKChMaW5rRWRpdFBhcnQpIG9iaik7Ci0JCQkJCQkJTGlzdCBibGlzdCA9IGxpbmsuZ2V0QmVuZHBvaW50cygpOwotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYmxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJCQkJQWJzb2x1dGVCZW5kcG9pbnQgYWJwb2ludCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgYmxpc3QKLQkJCQkJCQkJCQkuZ2V0KGopOwotCQkJCQkJCQlQb2ludCBkZWx0YVBvaW50ID0gcmVxdWVzdC5nZXRNb3ZlRGVsdGEoKTsKLQkJCQkJCQkJKChMaW5rRWRpdFBhcnQpIG9iaikuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkudHJhbnNsYXRlVG9BYnNvbHV0ZShkZWx0YVBvaW50KTsKLQkJCQkJCQkJUG9pbnQgcCA9IGFicG9pbnQuZ2V0VHJhbnNsYXRlZChyZXF1ZXN0Ci0JCQkJCQkJCQkJLmdldE1vdmVEZWx0YSgpKTsKLQkJCQkJCQkJQ29tbWFuZCBiZW5kY29tbWFuZCA9IG5ldyBNb3ZlQmVuZHBvaW50Q29tbWFuZCgKLQkJCQkJCQkJCQlsaW5rLCBwLCBqKTsKLQkJCQkJCQkJcmVzaXplLmFkZChiZW5kY29tbWFuZCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXNpemU7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0xhYmVsU2VsZWN0aW9uRWRpdFBvbGljeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0xhYmVsU2VsZWN0aW9uRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjY5M2M1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9MYWJlbFNlbGVjdGlvbkVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLlNlbGVjdGFibGVMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotCi0vKioKLSAqIEhhbmRsZXMgc2VsZWN0aW9uIG9mIGFjdGl2aXRlcy4gUHJpbWFyeSBzZWxlY3Rpb24gaXMgZGVub3RlZCBieSBoaWdobGlnaHQgYW5kCi0gKiBhIGZvY3VzIHJlY3RhbmdsZS4gTm9ybWFsIHNlbGVjdGlvbiBpcyBkZW5vdGVkIGJ5IGhpZ2hsaWdodCBvbmx5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGFiZWxTZWxlY3Rpb25FZGl0UG9saWN5IGV4dGVuZHMgTm9uUmVzaXphYmxlRWRpdFBvbGljeSB7Ci0KLQlwcml2YXRlIFNlbGVjdGFibGVMYWJlbCBnZXRMYWJlbCgpIHsKLQkJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpOwotCQlyZXR1cm4gKChTZWxlY3RhYmxlTGFiZWwpIHBhcnQuZ2V0RmlndXJlKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5I2hpZGVGb2N1cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZUZvY3VzKCkgewotCQlnZXRMYWJlbCgpLnNldEZvY3VzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kjaGlkZVNlbGVjdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZVNlbGVjdGlvbigpIHsKLQkJZ2V0TGFiZWwoKS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0JCWdldExhYmVsKCkuc2V0Rm9jdXMoZmFsc2UpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3kjc2hvd0ZvY3VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93Rm9jdXMoKSB7Ci0JCWdldExhYmVsKCkuc2V0Rm9jdXModHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5I3Nob3dTZWxlY3Rpb24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dQcmltYXJ5U2VsZWN0aW9uKCkgewotCQlnZXRMYWJlbCgpLnNldFNlbGVjdGVkKHRydWUpOwotCQlnZXRMYWJlbCgpLnNldEZvY3VzKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSNzaG93U2VsZWN0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93U2VsZWN0aW9uKCkgewotCQlnZXRMYWJlbCgpLnNldFNlbGVjdGVkKHRydWUpOwotCQlnZXRMYWJlbCgpLnNldEZvY3VzKGZhbHNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9MaW5rQmVuZHBvaW50RWRpdFBvbGljeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0xpbmtCZW5kcG9pbnRFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViZGJmODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0xpbmtCZW5kcG9pbnRFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNyZWF0ZUJlbmRwb2ludENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuRGVsZXRlQmVuZHBvaW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5Nb3ZlQmVuZHBvaW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQmVuZHBvaW50RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQmVuZHBvaW50UmVxdWVzdDsKLQotLyoqCi0gKiBBIEVkaXRQb2xpY3kgdG8gaGFuZGxlIHRoZSBjcmVhdGUsIG1vdmUgYW5kIGRlbGV0ZSBiZW5kcG9pbnRzIGFjdGl2aXRpZXMgb2YgTGluay4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpbmtCZW5kcG9pbnRFZGl0UG9saWN5IGV4dGVuZHMgQmVuZHBvaW50RWRpdFBvbGljeSB7Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVCZW5kcG9pbnRDb21tYW5kKEJlbmRwb2ludFJlcXVlc3QgcmVxdWVzdCkgewotCQlQb2ludCBsb2MgPSByZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0JCWdldENvbm5lY3Rpb24oKS50cmFuc2xhdGVUb1JlbGF0aXZlKGxvYyk7Ci0JCXJldHVybiBuZXcgQ3JlYXRlQmVuZHBvaW50Q29tbWFuZCgKLQkJCQkoTGluaykgcmVxdWVzdC5nZXRTb3VyY2UoKS5nZXRNb2RlbCgpLCBsb2MsIHJlcXVlc3QuZ2V0SW5kZXgoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVsZXRlQmVuZHBvaW50Q29tbWFuZChCZW5kcG9pbnRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJcmV0dXJuIG5ldyBEZWxldGVCZW5kcG9pbnRDb21tYW5kKChMaW5rKSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSwgcmVxdWVzdAotCQkJCS5nZXRJbmRleCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQmVuZHBvaW50Q29tbWFuZChCZW5kcG9pbnRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJUG9pbnQgbG9jID0gcmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCQlnZXRDb25uZWN0aW9uKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShsb2MpOwotCQlyZXR1cm4gbmV3IE1vdmVCZW5kcG9pbnRDb21tYW5kKChMaW5rKSByZXF1ZXN0LmdldFNvdXJjZSgpLmdldE1vZGVsKCksCi0JCQkJbG9jLCByZXF1ZXN0LmdldEluZGV4KCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9MaW5rRW5kcG9pbnRFZGl0UG9saWN5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTGlua0VuZHBvaW50RWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOTA1YWQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9MaW5rRW5kcG9pbnRFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbm5lY3Rpb25FbmRwb2ludEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci0KLS8qKgotICogQSBFZGl0UG9saWN5IHRvIGhhbmRsZSB0aGUgc2VsZWN0aW9uIGhhbmRsZXMgZm9yIGNvbm5lY3Rpb24uIAotICogIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpbmtFbmRwb2ludEVkaXRQb2xpY3kgZXh0ZW5kcyBDb25uZWN0aW9uRW5kcG9pbnRFZGl0UG9saWN5IHsKLQotCXByaXZhdGUgc3RhdGljIEZvbnQgQk9MRF9GT05UOwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJc3VwZXIuYWRkU2VsZWN0aW9uSGFuZGxlcygpOwotCQlnZXRDb25uZWN0aW9uRmlndXJlKCkuc2V0TGluZVdpZHRoKDIpOwotCX0KLQotCXByb3RlY3RlZCBQb2x5bGluZUNvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpIHsKLQkJcmV0dXJuIChQb2x5bGluZUNvbm5lY3Rpb24pIGdldEhvc3RGaWd1cmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlU2VsZWN0aW9uKCkgewotCQlzdXBlci5oaWRlU2VsZWN0aW9uKCk7Ci0JCWdldEhvc3RGaWd1cmUoKS5zZXRGb250KG51bGwpOwotCQlnZXRIb3N0RmlndXJlKCkuaW52YWxpZGF0ZVRyZWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQlzdXBlci5yZW1vdmVTZWxlY3Rpb25IYW5kbGVzKCk7Ci0JCWdldENvbm5lY3Rpb25GaWd1cmUoKS5zZXRMaW5lV2lkdGgoMCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpIHsKLQkJc3VwZXIuc2hvd1NlbGVjdGlvbigpOwotCQlpZiAoQk9MRF9GT05UID09IG51bGwpIHsKLQkJCUZvbnREYXRhW10gZGF0YSA9IGdldENvbm5lY3Rpb25GaWd1cmUoKS5nZXRGb250KCkuZ2V0Rm9udERhdGEoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykKLQkJCQlpZiAoKGRhdGFbaV0uZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSA9PSAwKQotCQkJCQlkYXRhW2ldLnNldFN0eWxlKGRhdGFbaV0uZ2V0U3R5bGUoKSB8IFNXVC5CT0xEKTsKLQkJCUJPTERfRk9OVCA9IG5ldyBGb250KG51bGwsIGRhdGEpOwotCQl9Ci0JCWdldEhvc3RGaWd1cmUoKS5zZXRGb250KEJPTERfRk9OVCk7Ci0JCWdldEhvc3RGaWd1cmUoKS5pbnZhbGlkYXRlVHJlZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9Ob2RlQ29udGFpbmVyRWRpdFBvbGljeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL05vZGVDb250YWluZXJFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlZjA1ZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL05vZGVDb250YWluZXJFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlQ29udGFpbmVyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Db250YWluZXJFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotCi0vKioKLSAqIEEgRWRpdFBvbGljeSBmb3Ige0BsaW5rIE5vZGVDb250YWluZXJFZGl0UGFydH0gZm9yIGRpc2FibGluZyBkaXJlY3QgY2hpbGQgY3JlYXRpb24uCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTm9kZUNvbnRhaW5lckVkaXRQb2xpY3kgZXh0ZW5kcyBDb250YWluZXJFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Db250YWluZXJFZGl0UG9saWN5I2dldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9Ob2RlQ29udGFpbmVyRmxvd0xheW91dEVkaXRQb2xpY3kuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9Ob2RlQ29udGFpbmVyRmxvd0xheW91dEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmRmNDgxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTm9kZUNvbnRhaW5lckZsb3dMYXlvdXRFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlQ29udGFpbmVyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuRmxvd0xheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci0KLS8qKgotICogQSBFZGl0UG9saWN5IGZvciB7QGxpbmsgTm9kZUNvbnRhaW5lckVkaXRQYXJ0fSB0byBkaXNhYmxlIHRoZSBhbGwgZWRpdGluZyBmZWF0dXJlcy4KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlQ29udGFpbmVyRmxvd0xheW91dEVkaXRQb2xpY3kgZXh0ZW5kcyBGbG93TGF5b3V0RWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuT3JkZXJlZExheW91dEVkaXRQb2xpY3kjY3JlYXRlQWRkQ29tbWFuZChFZGl0UGFydCwKLQkgKiAgICAgIEVkaXRQYXJ0KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdFBhcnQgY2hpbGQsIEVkaXRQYXJ0IGFmdGVyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5PcmRlcmVkTGF5b3V0RWRpdFBvbGljeSNjcmVhdGVNb3ZlQ2hpbGRDb21tYW5kKEVkaXRQYXJ0LAotCSAqICAgICAgRWRpdFBhcnQpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlTW92ZUNoaWxkQ29tbWFuZChFZGl0UGFydCBjaGlsZCwgRWRpdFBhcnQgYWZ0ZXIpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kjZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5I2dldERlbGV0ZURlcGVuZGFudENvbW1hbmQoUmVxdWVzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZWxldGVEZXBlbmRhbnRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0Zsb3dMYXlvdXRFZGl0UG9saWN5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tGbG93TGF5b3V0RWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZGZlODdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0Zsb3dMYXlvdXRFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmxvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5GbG93TGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLQotLyoqCi0gKiBFZGl0UG9saWN5IHRvIGRpc2FibGUgdGhlIGVkaXRpbmcgZmVhdHVyZSBpbiBhIHtAbGluayBGbG93TGF5b3V0fQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tGbG93TGF5b3V0RWRpdFBvbGljeSBleHRlbmRzIEZsb3dMYXlvdXRFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBSb2xlVGFza0Zsb3dMYXlvdXRFZGl0UG9saWN5KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk9yZGVyZWRMYXlvdXRFZGl0UG9saWN5I2NyZWF0ZUFkZENvbW1hbmQob3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0LCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0UGFydCBjaGlsZCwgRWRpdFBhcnQgYWZ0ZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk9yZGVyZWRMYXlvdXRFZGl0UG9saWN5I2NyZWF0ZU1vdmVDaGlsZENvbW1hbmQob3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0LCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlTW92ZUNoaWxkQ29tbWFuZChFZGl0UGFydCBjaGlsZCwgRWRpdFBhcnQgYWZ0ZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kjZ2V0Q3JlYXRlQ29tbWFuZChvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzZDg1NDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGdyYXBoaWNhbCBlZGl0IHBvbGljaWVzIGZvciB0aGUgYWN0aXZpdHkgZGlhZ3JhbXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0FjdGl2aXR5RmlndXJlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQWN0aXZpdHlGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTJhNGY3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQWN0aXZpdHlGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLS8qKgotICogQGF1dGhvciBKYW1lcyBUaGFyaW8KLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpZ3VyZSBleHRlbmRzIFRleHRGaWd1cmUgewotCi0JcHVibGljIEFjdGl2aXR5RmlndXJlKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9DZW50cmVkTGFiZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9DZW50cmVkTGFiZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTcwOWY4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQ2VudHJlZExhYmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2VudHJlZExhYmVsIGV4dGVuZHMgTGFiZWwgewotCi0JcHVibGljIENlbnRyZWRMYWJlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ2VudHJlZExhYmVsKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCXB1YmxpYyBDZW50cmVkTGFiZWwoSW1hZ2UgaSkgewotCQlzdXBlcihpKTsKLQl9Ci0KLQlwdWJsaWMgQ2VudHJlZExhYmVsKFN0cmluZyBzLCBJbWFnZSBpKSB7Ci0JCXN1cGVyKHMsIGkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZSNwYWludEZpZ3VyZShHcmFwaGljcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQlpZiAoaXNPcGFxdWUoKSkKLQkJCXN1cGVyLnBhaW50RmlndXJlKGdyYXBoaWNzKTsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGdldEJvdW5kcygpOwotCQlncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMueWVsbG93KTsKLQkJZ3JhcGhpY3MudHJhbnNsYXRlKGJvdW5kcy54LCBib3VuZHMueSk7Ci0JCWlmICghaXNFbmFibGVkKCkpIHsKLQkJCWdyYXBoaWNzLnRyYW5zbGF0ZSgxLCAxKTsKLQkJCWdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy55ZWxsb3cpOwotCQkJZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJ1dHRvbkxpZ2h0ZXN0KTsKLQkJCWdyYXBoaWNzLmRyYXdUZXh0KGdldFN1YlN0cmluZ1RleHQoKSwgZ2V0VGV4dExvY2F0aW9uKCkpOwotCQkJZ3JhcGhpY3MudHJhbnNsYXRlKC0xLCAtMSk7Ci0JCQlncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYnV0dG9uRGFya2VyKTsKLQkJfQotCQlncmFwaGljcy5kcmF3VGV4dChnZXRTdWJTdHJpbmdUZXh0KCksIGdldFRleHRMb2NhdGlvbigpKTsKLQkJZ3JhcGhpY3Muc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLnllbGxvdyk7Ci0JCWdyYXBoaWNzLnRyYW5zbGF0ZSgtYm91bmRzLngsIC1ib3VuZHMueSk7Ci0JCWdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Db2xvcnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Db2xvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzM3ZTAyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQ29sb3JzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBUaGUgY29sb3IgY29uc3RhbnRzIHJlZmVyZW5jZWQgYnkgdGhlIGRpYWdyYW0gZWRpdG9ycy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbG9ycyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIElOSEVSSVRFRF9FTEVNRU5UX0xBQkVMID0gQ29sb3JDb25zdGFudHMuZGFya0dyZWVuOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBTVVBSRVNTRURfRUxFTUVOVF9MQUJFTCA9IENvbG9yQ29uc3RhbnRzLmdyYXk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Db21wb3NpdGVGaWd1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Db21wb3NpdGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODEyZmNjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQ29tcG9zaXRlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmxvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuUmFpc2VkTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlRmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yIEJHX0NPTE9SID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCAyNTUsCi0JCQkyNTUsIDIwNSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfV0lEVEggPSA1MDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTUEFDSU5HID0gMTA7Ci0KLQlwcml2YXRlIGludCBtYXhXaWR0aCA9IERFRkFVTFRfTUFYX1dJRFRIOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUZpZ3VyZSgpIHsKLQkJVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dCgpOwotCQlsYXlvdXQuc2V0TWlub3JBbGlnbm1lbnQoRmxvd0xheW91dC5BTElHTl9DRU5URVIpOwotCQlsYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7Ci0JCWxheW91dC5zZXRTcGFjaW5nKFNQQUNJTkcpOwotCQlsYXlvdXQuc2V0T2JzZXJ2ZVZpc2liaWxpdHkodHJ1ZSk7Ci0JCXNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJc2V0Qm9yZGVyKG5ldyBSYWlzZWRNYXJnaW5Cb3JkZXIoKSk7Ci0JCXNldEJhY2tncm91bmRDb2xvcihCR19DT0xPUik7Ci0JCXNldE9wYXF1ZSh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXhXaWR0aChpbnQgdykgewotCQltYXhXaWR0aCA9IHc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlI2dldFByZWZlcnJlZFNpemUoaW50LCBpbnQpCi0JICovCi0JcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKGludCB3SGludCwgaW50IGhIaW50KSB7Ci0JCWlmICh3SGludCA+IG1heFdpZHRoKSB7Ci0JCQl3SGludCA9IG1heFdpZHRoOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQcmVmZXJyZWRTaXplKHdIaW50LCBoSGludCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvRGlhbW9uZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0RpYW1vbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDZmZTRmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvRGlhbW9uZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIEEgZmlndXJlIGZvciBkaWFtb25kIHNoYXBlLiAgCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlhbW9uZCBleHRlbmRzIFNoYXBlIHsKLQotCXByaXZhdGUgUG9pbnRMaXN0IGRpYW1vbmQgPSBuZXcgUG9pbnRMaXN0KDQpOwotCi0JLyoqCi0JICogQHNlZSBTaGFwZSNmaWxsU2hhcGUoR3JhcGhpY3MpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbFNoYXBlKEdyYXBoaWNzIGcpIHsKLQkJZy5maWxsUG9seWdvbihkaWFtb25kKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFNoYXBlI291dGxpbmVTaGFwZShHcmFwaGljcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvdXRsaW5lU2hhcGUoR3JhcGhpY3MgZykgewotCQlnLmRyYXdQb2x5Z29uKGRpYW1vbmQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZSN2YWxpZGF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCVJlY3RhbmdsZSByID0gZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQlyLmNyb3AoZ2V0SW5zZXRzKCkpOwotCQlyLnJlc2l6ZSgtMSwgLTEpOwotCQlkaWFtb25kLnJlbW92ZUFsbFBvaW50cygpOwotCQlkaWFtb25kLmFkZFBvaW50KHIuZ2V0VG9wKCkpOwotCQlkaWFtb25kLmFkZFBvaW50KHIuZ2V0UmlnaHQoKSk7Ci0JCWRpYW1vbmQuYWRkUG9pbnQoci5nZXRCb3R0b20oKSk7Ci0JCWRpYW1vbmQuYWRkUG9pbnQoci5nZXRMZWZ0KCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lI3ByaW1UcmFuc2xhdGUoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHJpbVRyYW5zbGF0ZShpbnQgeCwgaW50IHkpIHsKLQkJc3VwZXIucHJpbVRyYW5zbGF0ZSh4LCB5KTsKLQkJZGlhbW9uZC50cmFuc2xhdGUoeCwgeSk7Ci0JfQotCi0JcHVibGljIFBvaW50TGlzdCBnZXRQb2ludHMoKSB7Ci0JCXJldHVybiBkaWFtb25kOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0VuZE5vZGVGaWd1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9FbmROb2RlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFjMDFhMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0VuZE5vZGVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci0KLS8qKgotICogRmlndXJlIGZvciB7QGxpbmsgVHlwZWROb2RlfSBlbmQuCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRW5kTm9kZUZpZ3VyZSBleHRlbmRzIEVsbGlwc2UgewotCi0JLyoqCi0JICogRmlsbHMgdGhlIGVsbGlwc2UuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGUjZmlsbFNoYXBlKG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsU2hhcGUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJUmVjdGFuZ2xlIHIgPSBnZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCXIuc2hyaW5rKHIud2lkdGggLyA4LCByLmhlaWdodCAvIDgpOwotCQlncmFwaGljcy5maWxsT3ZhbChyKTsKLQl9Ci0KLQkvKioKLQkgKiBPdXRsaW5lcyB0aGUgZWxsaXBzZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZSNvdXRsaW5lU2hhcGUob3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG91dGxpbmVTaGFwZShHcmFwaGljcyBncmFwaGljcykgewotCQlzdXBlci5vdXRsaW5lU2hhcGUoZ3JhcGhpY3MpOwotCi0JCVJlY3RhbmdsZSByID0gUmVjdGFuZ2xlLlNJTkdMRVRPTjsKLQkJci5zZXRCb3VuZHMoZ2V0Qm91bmRzKCkpOwotCQlyLnNocmluayhnZXRCb3VuZHMoKS53aWR0aCAvIDgsIGdldEJvdW5kcygpLmhlaWdodCAvIDgpOwotCQlyLndpZHRoLS07Ci0JCXIuaGVpZ2h0LS07Ci0JCXIuc2hyaW5rKChsaW5lV2lkdGggLSAxKSAvIDIsIChsaW5lV2lkdGggLSAxKSAvIDIpOwotCQlncmFwaGljcy5kcmF3T3ZhbChyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9GcmVlVGV4dEZpZ3VyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0ZyZWVUZXh0RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2ZDhlNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0ZyZWVUZXh0RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlbGF0aXZlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuRmxvd1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuUGFyYWdyYXBoVGV4dExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQudGV4dC5UZXh0RmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLS8qKgotICogRmlndXJlIHRvIHN1cHBvcnQgZnJlZSB0ZXh0IGluIHRoZSBkaWFncmFtLCB3aXRob3V0IGFuIGltYWdlIGF0dGFjaGVkIHRvIGl0LgotICogRnJlZVRleHRGaWd1cmUgd3JhcHBlciBvdmVyIHtAbGluayBGbG93UGFnZX0gYW5kIHtAbGluayBUZXh0Rmxvd30uIAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIga2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGcmVlVGV4dEZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0KLQlwcml2YXRlIEZsb3dQYWdlIHRleHRGbG93UGFnZTsKLQotCXByaXZhdGUgVGV4dEZsb3cgdGV4dEZsb3c7Ci0KLQlwdWJsaWMgRnJlZVRleHRGaWd1cmUoKSB7Ci0JCXRleHRGbG93UGFnZSA9IG5ldyBGbG93UGFnZSgpOwotCQl0ZXh0Rmxvd1BhZ2Uuc2V0SG9yaXpvbnRhbEFsaWdtZW50KFBvc2l0aW9uQ29uc3RhbnRzLkNFTlRFUik7Ci0JCXNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlhZGQodGV4dEZsb3dQYWdlLCBuZXcgUmVsYXRpdmVMb2NhdG9yKHRleHRGbG93UGFnZSwKLQkJCQlQb3NpdGlvbkNvbnN0YW50cy5BTFdBWVNfTEVGVCkpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0Rmxvdy5nZXRUZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgbmV3VGV4dCkgewotCQl0ZXh0Rmxvd1BhZ2UucmVtb3ZlQWxsKCk7Ci0JCXRleHRGbG93ID0gbmV3IFRleHRGbG93KCk7Ci0JCXRleHRGbG93LnNldEZvbnQoVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UKTsKLQkJdGV4dEZsb3cuc2V0TGF5b3V0TWFuYWdlcihuZXcgUGFyYWdyYXBoVGV4dExheW91dCh0ZXh0RmxvdywKLQkJCQlQYXJhZ3JhcGhUZXh0TGF5b3V0LldPUkRfV1JBUF9UUlVOQ0FURSkpOwotCQl0ZXh0Rmxvdy5zZXRUZXh0KG5ld1RleHQpOwotCQl0ZXh0Rmxvd1BhZ2UuYWRkKHRleHRGbG93KTsKLQl9Ci0KLQlwdWJsaWMgRmxvd1BhZ2UgZ2V0VGV4dEZsb3dQYWdlKCkgewotCQlyZXR1cm4gdGV4dEZsb3dQYWdlOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRGb250KEZvbnQgZikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLnNldEZvbnQoZik7Ci0JCXRleHRGbG93LnNldEZvbnQoZik7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBmZykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLnNldEZvcmVncm91bmRDb2xvcihmZyk7Ci0JCXRleHRGbG93LnNldEZvcmVncm91bmRDb2xvcihmZyk7Ci0JfQotCi0JcHVibGljIFRleHRGbG93IGdldFRleHRGbG93KCkgewotCQlyZXR1cm4gdGV4dEZsb3c7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0ltYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0ltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YjRlMDFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9JbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBJbWFnZSBsb2NhdGlvbiBjb25zdGFudHMgcmVmZXJlbmNlZCBpbiBkaWFncmFtLgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEltYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIEFDVElWSVRZID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0SW1hZ2UoInNoYXBlL2FjdGl2aXR5LmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElURVJBVElPTiA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldEltYWdlKCJzaGFwZS9pdGVyYXRpb24uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgUEhBU0UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoCi0JCQkic2hhcGUvcGhhc2UuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgTUlMRVNUT05FID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0SW1hZ2UoInNoYXBlL21pbGVzdG9uZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBST0xFID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKAotCQkJInNoYXBlL3JvbGUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgVEFTSyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgKLQkJCSJzaGFwZS90YXNrLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIFRBU0tfREVTQ1JJUFRPUiA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldEltYWdlKCJzaGFwZS90YXNrZGVzY3JpcHRvci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUiA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJzaGFwZS93b3JrcHJvZHVjdGRlc2NyaXB0b3IuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgQVJUSUZBQ1QgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRJbWFnZSgic2hhcGUvYXJ0aWZhY3QuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgREVMSVZFUkFCTEUgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRJbWFnZSgic2hhcGUvZGVsaXZlcmFibGUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgT1VUQ09NRSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldEltYWdlKCJzaGFwZS9vdXRjb21lLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIFdPUktfUFJPRFVDVCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldEltYWdlKCJXb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgVEFTS19ERVNDUklQVE9SXzE2ID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoInNoYXBlL3Rhc2tkZXNfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIFJPTEVfREVTQ1JJUFRPUl8xNiA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJzaGFwZS9yb2xlZGVzX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl8xNiA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJzaGFwZS93b3JrZGVzX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvTm90ZUZpZ3VyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL05vdGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTdhYjFlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvTm90ZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIEphbWVzIFRoYXJpbwotICogQHNpbmNlICAxLjAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3RlRmlndXJlCi0gICAgICAgIGV4dGVuZHMgVGV4dEZpZ3VyZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPUk5FUl9TSVpFID0gNDsKLQotICAgIHB1YmxpYyBOb3RlRmlndXJlKCkgewotICAgICAgICBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMudG9vbHRpcEJhY2tncm91bmQpOwotICAgICAgICBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotCi0gICAgICAgIHNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKENPUk5FUl9TSVpFKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLSAgICAgICAgUmVjdGFuZ2xlIHJlY3QgPSBnZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0KLSAgICAgICAgZ3JhcGhpY3MudHJhbnNsYXRlKGdldExvY2F0aW9uKCkpOwotCi0gICAgICAgIC8vIGZpbGwgdGhlIG5vdGUKLSAgICAgICAgUG9pbnRMaXN0IG91dGxpbmUgPSBuZXcgUG9pbnRMaXN0KCk7Ci0KLSAgICAgICAgb3V0bGluZS5hZGRQb2ludCgwLCAwKTsKLSAgICAgICAgb3V0bGluZS5hZGRQb2ludChyZWN0LndpZHRoIC0gQ09STkVSX1NJWkUsIDApOwotICAgICAgICBvdXRsaW5lLmFkZFBvaW50KHJlY3Qud2lkdGggLSAxLCBDT1JORVJfU0laRSk7Ci0gICAgICAgIG91dGxpbmUuYWRkUG9pbnQocmVjdC53aWR0aCAtIDEsIHJlY3QuaGVpZ2h0IC0gMSk7Ci0gICAgICAgIG91dGxpbmUuYWRkUG9pbnQoMCwgcmVjdC5oZWlnaHQgLSAxKTsKLQotICAgICAgICBncmFwaGljcy5maWxsUG9seWdvbihvdXRsaW5lKTsKLQotICAgICAgICAvLyBkcmF3IHRoZSBpbm5lciBvdXRsaW5lCi0gICAgICAgIFBvaW50TGlzdCBpbm5lckxpbmUgPSBuZXcgUG9pbnRMaXN0KCk7Ci0KLSAgICAgICAgaW5uZXJMaW5lLmFkZFBvaW50KHJlY3Qud2lkdGggLSBDT1JORVJfU0laRSAtIDEsIDApOwotICAgICAgICBpbm5lckxpbmUuYWRkUG9pbnQocmVjdC53aWR0aCAtIENPUk5FUl9TSVpFIC0gMSwgQ09STkVSX1NJWkUpOwotICAgICAgICBpbm5lckxpbmUuYWRkUG9pbnQocmVjdC53aWR0aCAtIDEsIENPUk5FUl9TSVpFKTsKLSAgICAgICAgaW5uZXJMaW5lLmFkZFBvaW50KHJlY3Qud2lkdGggLSBDT1JORVJfU0laRSAtIDEsIDApOwotICAgICAgICBpbm5lckxpbmUuYWRkUG9pbnQoMCwgMCk7Ci0gICAgICAgIGlubmVyTGluZS5hZGRQb2ludCgwLCByZWN0LmhlaWdodCAtIDEpOwotICAgICAgICBpbm5lckxpbmUuYWRkUG9pbnQocmVjdC53aWR0aCAtIDEsIHJlY3QuaGVpZ2h0IC0gMSk7Ci0gICAgICAgIGlubmVyTGluZS5hZGRQb2ludChyZWN0LndpZHRoIC0gMSwgQ09STkVSX1NJWkUpOwotCi0gICAgICAgIGdyYXBoaWNzLmRyYXdQb2x5Z29uKGlubmVyTGluZSk7Ci0KLSAgICAgICAgZ3JhcGhpY3MudHJhbnNsYXRlKGdldExvY2F0aW9uKCkuZ2V0TmVnYXRlZCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Sb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiOWM4YTVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Sb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZsb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LlJhaXNlZE1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBGaWd1cmUgZm9yIHtAbGluayBSb2xlVGFza0NvbXBvc2l0ZX0uCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sb3IgQkdfQ09MT1IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIDI1NSwKLQkJCTI1NSwgMTU2KTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfV0lEVEggPSA1MDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOT1JfU1BBQ0lORyA9IDIwOwotCi0JcHJpdmF0ZSBGaWd1cmUgdGFza3NGaWd1cmU7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUoKSB7Ci0JCUZsb3dMYXlvdXQgbGF5b3V0ID0gbmV3IEZsb3dMYXlvdXQodHJ1ZSk7Ci0JCWxheW91dC5zZXRNaW5vckFsaWdubWVudChGbG93TGF5b3V0LkFMSUdOX0NFTlRFUik7Ci0JCWxheW91dC5zZXRNYWpvckFsaWdubWVudChGbG93TGF5b3V0LkFMSUdOX0xFRlRUT1ApOwotCQlsYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7Ci0JCWxheW91dC5zZXRNaW5vclNwYWNpbmcoTUlOT1JfU1BBQ0lORyk7Ci0JCWxheW91dC5zZXRPYnNlcnZlVmlzaWJpbGl0eSh0cnVlKTsKLQotCQlzZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCXNldEJvcmRlcihuZXcgUmFpc2VkTWFyZ2luQm9yZGVyKCkpOwotCQlzZXRCYWNrZ3JvdW5kQ29sb3IoQkdfQ09MT1IpOwotCQlzZXRPcGFxdWUodHJ1ZSk7Ci0KLQkJdGFza3NGaWd1cmUgPSBuZXcgRmlndXJlKCkgewotCQkJLyoqCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmUjZ2V0UHJlZmVycmVkU2l6ZShpbnQsIGludCkKLQkJCSAqLwotCQkJcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKGludCB3SGludCwgaW50IGhIaW50KSB7Ci0JCQkJSUZpZ3VyZSBmaXJzdENoaWxkID0gKElGaWd1cmUpIGdldENoaWxkcmVuKCkuZ2V0KDApOwotCQkJCWlmIChmaXJzdENoaWxkICE9IHRoaXMpIHsKLQkJCQkJaW50IG9mZnNldCA9IGZpcnN0Q2hpbGQuZ2V0U2l6ZSgpLndpZHRoOyAvLyBmaXJzdENoaWxkLmdldFNpemUoKS53aWR0aAotCQkJCQkvLyArCi0JCQkJCS8vIFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlLnRoaXMuZ2V0SW5zZXRzKCkuZ2V0V2lkdGgoKQotCQkJCQkvLyArCi0JCQkJCS8vIE1JTk9SX1NQQUNJTkc7Ci0JCQkJCWlmICh3SGludCA8IG9mZnNldCkgewotCi0JCQkJCX0KLQkJCQkJd0hpbnQgPSB3SGludCAtIG9mZnNldDsKLQkJCQkJaWYgKHdIaW50ID4gTUFYX1dJRFRIKSB7Ci0JCQkJCQl3SGludCA9IE1BWF9XSURUSDsKLQkJCQkJfQotCQkJCX0KLQkJCQlEaW1lbnNpb24gZGltID0gc3VwZXIuZ2V0UHJlZmVycmVkU2l6ZSh3SGludCwgaEhpbnQpOwotCQkJCXJldHVybiBkaW07Ci0JCQl9Ci0JCX07Ci0JCUZsb3dMYXlvdXQgZmxvd0xheW91dCA9IG5ldyBGbG93TGF5b3V0KCk7Ci0JCWZsb3dMYXlvdXQuc2V0TWlub3JTcGFjaW5nKDEwKTsKLQkJZmxvd0xheW91dC5zZXRNaW5vckFsaWdubWVudChGbG93TGF5b3V0LkFMSUdOX0NFTlRFUik7Ci0JCXRhc2tzRmlndXJlLnNldExheW91dE1hbmFnZXIoZmxvd0xheW91dCk7Ci0JCXRhc2tzRmlndXJlLnNldE9wYXF1ZSh0cnVlKTsKLQkJc3VwZXIuYWRkKHRhc2tzRmlndXJlLCBudWxsLCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlI2FkZChJRmlndXJlLCBPYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoSUZpZ3VyZSBmaWd1cmUsIE9iamVjdCBjb25zdHJhaW50LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGdldENoaWxkcmVuKCkuc2l6ZSgpID09IDEpIHsKLQkJCXN1cGVyLmFkZChmaWd1cmUsIGNvbnN0cmFpbnQsIDApOwotCQl9IGVsc2UgewotCQkJdGFza3NGaWd1cmUuYWRkKGZpZ3VyZSwgY29uc3RyYWludCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Sb2xlVGFza0Zsb3dMYXlvdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Sb2xlVGFza0Zsb3dMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmJkNzg2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvUm9sZVRhc2tGbG93TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZsb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIEBhdXRob3Igc2thbm5vb3IKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0Zsb3dMYXlvdXQgZXh0ZW5kcyBGbG93TGF5b3V0IHsKLQotCWJvb2xlYW4gYWRqdXN0ID0gZmFsc2U7Ci0JV29ya2luZ0RhdGEgZGF0YTsKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUm9sZVRhc2tGbG93TGF5b3V0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXNIb3Jpem9udGFsCi0JICovCi0JcHVibGljIFJvbGVUYXNrRmxvd0xheW91dChib29sZWFuIGlzSG9yaXpvbnRhbCkgewotCQlzdXBlcihpc0hvcml6b250YWwpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JCi0JcHVibGljIHZvaWQgbGF5b3V0KElGaWd1cmUgcGFyZW50KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJaWYoYWRqdXN0KXsKLQkJCWFkanVzdExheW91dChwYXJlbnQpOwotCQl9ZWxzZQotCQkJc3VwZXIubGF5b3V0KHBhcmVudCk7Ci0JfQotCWNsYXNzIFdvcmtpbmdEYXRhIHsKLQkJaW50IHJvd0hlaWdodCwgcm93V2lkdGgsIHJvd0NvdW50LCByb3dYLCByb3dZLCBtYXhXaWR0aDsKLQkJUmVjdGFuZ2xlIGJvdW5kc1tdLCBhcmVhOwotCQlJRmlndXJlIHJvd1tdOwotCX0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgc3RhdGUgb2Ygcm93IGRhdGEsIHdoaWNoIGlzIGludGVybmFsIHRvIHRoZSBsYXlvdXQgcHJvY2Vzcy4gCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRSb3coKSB7Ci0JCWRhdGEucm93WCA9IDA7Ci0JCWRhdGEucm93SGVpZ2h0ID0gMDsKLQkJZGF0YS5yb3dXaWR0aCA9IDA7Ci0JCWRhdGEucm93Q291bnQgPSAwOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlIGRhdGEgZm9yIGxheWluZyBvdXQgY2hpbGRyZW4sIGJhc2VkIG9uIHRoZSBGaWd1cmUgZ2l2ZW4gYXMgaW5wdXQuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgZmlndXJlCi0JICogQHNpbmNlIDIuMCAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdFZhcmlhYmxlcyhJRmlndXJlIHBhcmVudCkgewotCQlkYXRhLnJvdyA9IG5ldyBJRmlndXJlW3BhcmVudC5nZXRDaGlsZHJlbigpLnNpemUoKV07Ci0JCWRhdGEuYm91bmRzID0gbmV3IFJlY3RhbmdsZVtkYXRhLnJvdy5sZW5ndGhdOwotCQlkYXRhLm1heFdpZHRoID0gZGF0YS5hcmVhLndpZHRoOwotCX0KLQlwcml2YXRlIHZvaWQgYWRqdXN0TGF5b3V0KElGaWd1cmUgcGFyZW50KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJZGF0YSA9IG5ldyBXb3JraW5nRGF0YSgpOwotCQlSZWN0YW5nbGUgcmVsYXRpdmVBcmVhID0gcGFyZW50LmdldENsaWVudEFyZWEoKTsKLQkJZGF0YS5hcmVhID0gdHJhbnNwb3Nlci50KHJlbGF0aXZlQXJlYSk7Ci0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOwotCQlpbnQgZHg7Ci0KLQkJLy9DYWxjdWxhdGUgdGhlIGhpbnRzIHRvIGJlIHBhc3NlZCB0byBjaGlsZHJlbgotCQlpbnQgd0hpbnQgPSAtMTsKLQkJaW50IGhIaW50ID0gLTE7Ci0JCWlmIChpc0hvcml6b250YWwoKSkKLQkJCXdIaW50ID0gcGFyZW50LmdldENsaWVudEFyZWEoKS53aWR0aDsKLQkJZWxzZQotCQkJaEhpbnQgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpLmhlaWdodDsKLQotCQlpbml0VmFyaWFibGVzKHBhcmVudCk7Ci0JCWluaXRSb3coKTsKLQkJaW50IGkgPSAwOyAKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSUZpZ3VyZSBmID0gKElGaWd1cmUpaXRlcmF0b3IubmV4dCgpOwotCQkJRGltZW5zaW9uIHByZWYgPSB0cmFuc3Bvc2VyLnQoZ2V0Q2hpbGRTaXplKGYsIHdIaW50LCBoSGludCkpOwotCQkJUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIHByZWYud2lkdGgsIHByZWYuaGVpZ2h0KTsKLQotCQkJaWYgKGRhdGEucm93Q291bnQgPiAwKSB7Ci0JCQkJaWYgKGRhdGEucm93V2lkdGggKyBwcmVmLndpZHRoID4gZGF0YS5tYXhXaWR0aCkKLQkJCQkJbGF5b3V0Um93KHBhcmVudCk7Ci0JCQl9Ci0JCQlyLnggPSBkYXRhLnJvd1g7Ci0JCQlyLnkgPSBkYXRhLnJvd1k7Ci0JCQlkeCA9IHIud2lkdGggKyBnZXRNaW5vclNwYWNpbmcoKTsKLQkJCWRhdGEucm93WCArPSBkeDsKLQkJCWRhdGEucm93V2lkdGggKz0gZHg7Ci0JCQlkYXRhLnJvd0hlaWdodCA9IE1hdGgubWF4KGRhdGEucm93SGVpZ2h0LCByLmhlaWdodCk7Ci0JCQlkYXRhLnJvdyBbZGF0YS5yb3dDb3VudF0gPSBmOwotCQkJZGF0YS5ib3VuZHNbZGF0YS5yb3dDb3VudF0gPSByOwotCQkJZGF0YS5yb3dDb3VudCsrOwotCQkJaSsrOwotCQl9Ci0JCWlmIChkYXRhLnJvd0NvdW50ICE9IDApCi0JCQlsYXlvdXRSb3cocGFyZW50KTsKLQkJZGF0YSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWRqdXN0KGJvb2xlYW4gYWRqdXN0KSB7Ci0JCXRoaXMuYWRqdXN0ID0gYWRqdXN0OwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9TZWxlY3RhYmxlTGFiZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9TZWxlY3RhYmxlTGFiZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTk5MjViOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvU2VsZWN0YWJsZUxhYmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5Lkluc2V0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIEEgY3VzdG9taXplZCBMYWJlbCBmb3Igc2VsZWN0aW9uLiBQcmltYXJ5IHNlbGVjdGlvbiBpcyBkZW5vdGVkIGJ5IGhpZ2hsaWdodAotICogYW5kIGZvY3VzIHJlY3RhbmdsZS4gTm9ybWFsIHNlbGVjdGlvbiBpcyBkZW5vdGVkIGJ5IGhpZ2hsaWdodCBvbmx5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0YWJsZUxhYmVsIGV4dGVuZHMgTGFiZWwgewotCi0JcHJpdmF0ZSBib29sZWFuIHNlbGVjdGVkOwotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0ZvY3VzOwotCi0JcHJpdmF0ZSBSZWN0YW5nbGUgZ2V0U2VsZWN0aW9uUmVjdGFuZ2xlKCkgewotCQlSZWN0YW5nbGUgYm91bmRzID0gZ2V0VGV4dEJvdW5kcygpOwotCQlib3VuZHMuZXhwYW5kKG5ldyBJbnNldHMoMiwgMiwgMCwgMCkpOwotCQl0cmFuc2xhdGVUb1BhcmVudChib3VuZHMpOwotCQlib3VuZHMuaW50ZXJzZWN0KGdldEJvdW5kcygpKTsKLQkJcmV0dXJuIGJvdW5kczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbCNwYWludEZpZ3VyZShHcmFwaGljcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCWdyYXBoaWNzLnB1c2hTdGF0ZSgpOwotCQkJZ3JhcGhpY3Muc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVCYWNrZ3JvdW5kU2VsZWN0ZWQpOwotCQkJZ3JhcGhpY3MuZmlsbFJlY3RhbmdsZShnZXRTZWxlY3Rpb25SZWN0YW5nbGUoKSk7Ci0JCQlncmFwaGljcy5wb3BTdGF0ZSgpOwotCQkJZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLQkJfQotCQlpZiAoaGFzRm9jdXMpIHsKLQkJCWdyYXBoaWNzLnB1c2hTdGF0ZSgpOwotCQkJZ3JhcGhpY3Muc2V0WE9STW9kZSh0cnVlKTsKLQkJCWdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0JCQlncmFwaGljcy5kcmF3Rm9jdXMoZ2V0U2VsZWN0aW9uUmVjdGFuZ2xlKCkucmVzaXplKC0xLCAtMSkpOwotCQkJZ3JhcGhpY3MucG9wU3RhdGUoKTsKLQkJfQotCQlzdXBlci5wYWludEZpZ3VyZShncmFwaGljcyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2VsZWN0aW9uIHN0YXRlIG9mIHRoaXMgU2ltcGxlQWN0aXZpdHlMYWJlbAotCSAqIAotCSAqIEBwYXJhbSBiCi0JICogICAgICAgICAgICB0cnVlIHdpbGwgY2F1c2UgdGhlIGxhYmVsIHRvIGFwcGVhciBzZWxlY3RlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKGJvb2xlYW4gYikgewotCQlzZWxlY3RlZCA9IGI7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmb2N1cyBzdGF0ZSBvZiB0aGlzIFNpbXBsZUFjdGl2aXR5TGFiZWwKLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqICAgICAgICAgICAgdHJ1ZSB3aWxsIGNhdXNlIGEgZm9jdXMgcmVjdGFuZ2xlIHRvIGJlIGRyYXduIGFyb3VuZCB0aGUgdGV4dAotCSAqICAgICAgICAgICAgb2YgdGhlIExhYmVsCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoYm9vbGVhbiBiKSB7Ci0JCWhhc0ZvY3VzID0gYjsKLQkJcmVwYWludCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1RleHRGaWd1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9UZXh0RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5ZTFhOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1RleHRGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JbWFnZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWxhdGl2ZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuRmxvd1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuUGFyYWdyYXBoVGV4dExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQudGV4dC5UZXh0RmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBUZXh0RmlndXJlIGlzIGN1c3RvbWl6YWJsZSBmaWd1cmUgdG8gYWxsb3cgd29yZC13cmFwaW5nIGFuZCB3aXRoIGltYWdlLiAKLSAqIHtAbGluayBMYWJlbH0gZG8gbm90IHN1cHBvcnQgd29yZC13cmFwLiAgVGV4dEZpZ3VyZSBpcyB3cmFwcGVyIG92ZXIge0BsaW5rIFRleHRGbG93fQotICogYW5kIHtAbGluayBGbG93UGFnZX0gdG8gc3VwcG9ydCB3b3JkLXdyYXAgYW5kIGltYWdlLiAKLSAqIEBhdXRob3IgSmFtZXMgVGhhcmlvCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGV4dEZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0KLQlwcml2YXRlIEZsb3dQYWdlIHRleHRGbG93UGFnZTsKLQotCXByaXZhdGUgVGV4dEZsb3cgdGV4dEZsb3c7Ci0KLQlwcml2YXRlIEltYWdlRmlndXJlIGltYWdlRmlndXJlOwotCi0JcHVibGljIFRleHRGaWd1cmUoKSB7Ci0JCXRleHRGbG93UGFnZSA9IG5ldyBGbG93UGFnZSgpOwotCQl0ZXh0Rmxvd1BhZ2Uuc2V0SG9yaXpvbnRhbEFsaWdtZW50KFBvc2l0aW9uQ29uc3RhbnRzLkNFTlRFUik7Ci0JCXNldExheW91dE1hbmFnZXIobmV3IFRvb2xiYXJMYXlvdXQoKSk7Ci0JCWltYWdlRmlndXJlID0gbmV3IEltYWdlRmlndXJlKCk7Ci0JCWFkZChpbWFnZUZpZ3VyZSwgbmV3IFJlbGF0aXZlTG9jYXRvcihpbWFnZUZpZ3VyZSwKLQkJCQlQb3NpdGlvbkNvbnN0YW50cy5DRU5URVIpKTsKLQkJYWRkKHRleHRGbG93UGFnZSwgbmV3IFJlbGF0aXZlTG9jYXRvcih0ZXh0Rmxvd1BhZ2UsCi0JCQkJUG9zaXRpb25Db25zdGFudHMuQUxXQVlTX0xFRlQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoSW1hZ2UgaW1hZ2UpIHsKLQkJaW1hZ2VGaWd1cmUuc2V0SW1hZ2UoaW1hZ2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHRGbG93LmdldFRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBuZXdUZXh0KSB7Ci0JCXRleHRGbG93UGFnZS5yZW1vdmVBbGwoKTsKLQkJdGV4dEZsb3cgPSBuZXcgVGV4dEZsb3coKTsKLQkJdGV4dEZsb3cuc2V0Rm9udChUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlQpOwotCQl0ZXh0Rmxvdy5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBQYXJhZ3JhcGhUZXh0TGF5b3V0KHRleHRGbG93LAotCQkJCVBhcmFncmFwaFRleHRMYXlvdXQuV09SRF9XUkFQX0hBUkQpKTsKLQkJdGV4dEZsb3cuc2V0VGV4dChuZXdUZXh0KTsKLQkJdGV4dEZsb3dQYWdlLmFkZCh0ZXh0Rmxvdyk7Ci0JfQotCi0JcHVibGljIEZsb3dQYWdlIGdldFRleHRGbG93UGFnZSgpIHsKLQkJcmV0dXJuIHRleHRGbG93UGFnZTsKLQl9Ci0KLQlwdWJsaWMgVGV4dEZsb3cgZ2V0VGV4dEZsb3coKSB7Ci0JCXJldHVybiB0ZXh0RmxvdzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV1BDb21wYXJ0bWVudEZpZ3VyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dQQ29tcGFydG1lbnRGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTdiMzkxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV1BDb21wYXJ0bWVudEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuUmFpc2VkTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1BDb21wYXJ0bWVudEZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIENvbG9yIHdwQ29sb3IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIDI1NSwKLQkJCTI1NSwgMTU2KTsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgYXJ0aWZhY3RDb2xvciA9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwKLQkJCTI1NSwgMjU1LCAxNTYpOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciBkZWxpdmVyYWJsZUNvbG9yID0gbmV3IENvbG9yKAotCQkJRGlzcGxheS5nZXRDdXJyZW50KCksIDIwNiwgMjU1LCAyMTYpOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciBvdXRjb21lQ29sb3IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksCi0JCQkyMDYsIDI1NSwgMTAwKTsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIG5ld1dQTmFtZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLldQQ29tcGFydG1lbnRGaWd1cmVfMDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIExhYmVsIGxhYmVsOwotCi0JV1BGaWd1cmUgZmlndXJlID0gbnVsbDsKLQotCS8qKgotCSAqIFdvcmtQcm9kdWN0IENvbXBhcnRtZW50IC0gV2l0aCBiYWNrZ3JvdW5kIGZpbGxlZCBkZXBlbmRpbmcgb24gVHlwZSBvZiB0aGUKLQkgKiBXb3JrUHJvZHVjdC4KLQkgKi8KLQlwdWJsaWMgV1BDb21wYXJ0bWVudEZpZ3VyZShMYWJlbCBuYW1lLCBpbnQgdHlwZSkgewotCQlsYWJlbCA9IG5hbWU7Ci0JCVRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoKTsKLQkJc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQlzZXRPcGFxdWUodHJ1ZSk7Ci0JCXNldEJvcmRlcihuZXcgUmFpc2VkTWFyZ2luQm9yZGVyKCkpOwotCQlpZiAodHlwZSA9PSAxKQotCQkJc2V0QmFja2dyb3VuZENvbG9yKGFydGlmYWN0Q29sb3IpOwotCQllbHNlIGlmICh0eXBlID09IDIpCi0JCQlzZXRCYWNrZ3JvdW5kQ29sb3IoZGVsaXZlcmFibGVDb2xvcik7Ci0JCWVsc2UgaWYgKHR5cGUgPT0gMykKLQkJCXNldEJhY2tncm91bmRDb2xvcihvdXRjb21lQ29sb3IpOwotCQllbHNlCi0JCQlzZXRCYWNrZ3JvdW5kQ29sb3Iod3BDb2xvcik7Ci0JCWxhYmVsLnNldFRleHQobmV3V1BOYW1lKTsKLQkJYWRkKGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgTGFiZWwgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJbGFiZWwuc2V0VGV4dChuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChMYWJlbCBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV1BGaWd1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XUEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MmExMGMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XUEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdEJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5JbnNldHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXUEZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0KLQlwdWJsaWMgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoKTsKLQotCXB1YmxpYyBXUEZpZ3VyZShMYWJlbCBsKSB7Ci0JCXN1cGVyKCk7Ci0JCWFkZChsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBnKSB7Ci0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gZ2V0Q2xpZW50QXJlYSgpOwotCQlSZWN0YW5nbGUgYmFyID0gY2xpZW50QXJlYS5nZXRDb3B5KCk7Ci0JCWJhci5jcm9wKG5ldyBJbnNldHMoMCwgNSwgNSwgNSkpOwotCQlnLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ncmF5KTsKLQkJZy5maWxsUmVjdGFuZ2xlKGJhci5nZXRUcmFuc2xhdGVkKDYsIDYpKTsKLQkJZy5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMueWVsbG93KTsKLQkJZy5maWxsUmVjdGFuZ2xlKGJhcik7Ci0JCWcuc2V0TGluZVN0eWxlKDIpOwotCQlnLnNldExpbmVXaWR0aCgxKTsKLQkJc3VwZXIucGFpbnRGaWd1cmUoZyk7Ci0JfQotCi0JcHVibGljIExhYmVsIGdldEZpZ3VyZSgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsTmFtZShTdHJpbmcgbmFtZSkgewotCQlsYWJlbC5zZXRUZXh0KG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKExhYmVsIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQljbGFzcyBCb3ggZXh0ZW5kcyBGaWd1cmUgewotCQlwdWJsaWMgQm94KEluc2V0cyBpbnNldHMpIHsKLQkJCXNldEJvcmRlcihuZXcgQm94Qm9yZGVyKGluc2V0cykpOwotCQkJVG9vbGJhckxheW91dCB0b29sYmFyTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoKTsKLQkJCXRvb2xiYXJMYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7Ci0JCQlzZXRMYXlvdXRNYW5hZ2VyKHRvb2xiYXJMYXlvdXQpOwotCQkJc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLnJlZCk7Ci0KLQkJfQotCi0JCXByaXZhdGUgY2xhc3MgQm94Qm9yZGVyIGV4dGVuZHMgQWJzdHJhY3RCb3JkZXIgewotCi0JCQlwdWJsaWMgSW5zZXRzIGluc2V0cyA9IG5ldyBJbnNldHMoMSwgMCwgMCwgMCk7Ci0KLQkJCXB1YmxpYyBCb3hCb3JkZXIoSW5zZXRzIGluc2V0cykgewotCQkJCXRoaXMuaW5zZXRzID0gaW5zZXRzOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkJvcmRlciNnZXRJbnNldHMoSUZpZ3VyZSkKLQkJCSAqLwotCQkJcHVibGljIEluc2V0cyBnZXRJbnNldHMoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJCQlyZXR1cm4gaW5zZXRzOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkJvcmRlciNwYWludChJRmlndXJlLCBHcmFwaGljcywgSW5zZXRzKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwYWludChJRmlndXJlIGZpZ3VyZSwgR3JhcGhpY3MgZ3JhcGhpY3MsIEluc2V0cyBpbnNldHMpIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IGdldFBhaW50UmVjdGFuZ2xlKGZpZ3VyZSwgaW5zZXRzKTsKLQkJCQlncmFwaGljcy5kcmF3TGluZShyZWN0LmdldFRvcExlZnQoKSwgcmVjdC5nZXRUb3BSaWdodCgpKTsKLQkJCX0KLQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV3JhcExhYmVsbkltYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV3JhcExhYmVsbkltYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmODBkZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dyYXBMYWJlbG5JbWFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkltYWdlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuRmxvd1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuUGFyYWdyYXBoVGV4dExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQudGV4dC5UZXh0RmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV3JhcExhYmVsbkltYWdlIGV4dGVuZHMgRmlndXJlIHsKLQotCS8vIFRoZSBpbm5lciBUZXh0RmxvdwotCXByaXZhdGUgVGV4dEZsb3cgdGV4dEZsb3c7Ci0KLQlwcml2YXRlIEltYWdlIGltYWdlOwotCi0JcHVibGljIFdyYXBMYWJlbG5JbWFnZShJbWFnZSBpbWFnZSkgewotCQlzZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigzKSk7Ci0JCUltYWdlRmlndXJlIGZpZyA9IG5ldyBJbWFnZUZpZ3VyZSgpOwotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JCWZpZy5zZXRJbWFnZShpbWFnZSk7Ci0JCWFkZChmaWcpOwotCQlGbG93UGFnZSBmbG93UGFnZSA9IG5ldyBGbG93UGFnZSgpOwotCi0JCXRleHRGbG93ID0gbmV3IFRleHRGbG93KCk7Ci0KLQkJdGV4dEZsb3cuc2V0TGF5b3V0TWFuYWdlcihuZXcgUGFyYWdyYXBoVGV4dExheW91dCh0ZXh0RmxvdywKLQkJCQlQYXJhZ3JhcGhUZXh0TGF5b3V0LldPUkRfV1JBUF9TT0ZUKSk7Ci0JCQotCQlmbG93UGFnZS5hZGQodGV4dEZsb3cpOwotCQlmbG93UGFnZS5zZXRTaXplKDQwLDQwKTsKLQotCQlzZXRMYXlvdXRNYW5hZ2VyKG5ldyBUb29sYmFyTGF5b3V0KCkpOwotCQlhZGQoZmxvd1BhZ2UpOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBpbnNpZGUgdGhlIFRleHRGbG93LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgZmxvdyBpbnNpZGUgdGhlIHRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dEZsb3cuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRleHQgb2YgdGhlIFRleHRGbG93IHRvIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqICAgICAgICAgICAgdGhlIG5ldyB0ZXh0IHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIG5ld1RleHQpIHsKLQkJdGV4dEZsb3cuc2V0VGV4dChuZXdUZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGltYWdlLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgVGhlIGltYWdlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSkgewotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JfQotCXB1YmxpYyBUZXh0RmxvdyBnZXRUZXh0RmxvdygpewotCQlyZXR1cm4gdGV4dEZsb3c7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV3JhcHBhYmxlTGFiZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XcmFwcGFibGVMYWJlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNTg3M2M4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XcmFwcGFibGVMYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5Lkluc2V0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5CcmVha0l0ZXJhdG9yOwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIHRleHQgd3JhcCBpbiBhIGxhYmVsLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgV3JhcHBhYmxlTGFiZWwgZXh0ZW5kcyBGaWd1cmUgaW1wbGVtZW50cyBQb3NpdGlvbkNvbnN0YW50cyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRUxMSVBTSVMgPSAiLi4uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbWFnZSBpY29uOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBzdWJTdHJpbmdUZXh0OwotCi0JcHJpdmF0ZSBEaW1lbnNpb24gdGV4dFNpemU7Ci0KLQlwcml2YXRlIERpbWVuc2lvbiBzdWJTdHJpbmdUZXh0U2l6ZTsKLQotCXByaXZhdGUgRGltZW5zaW9uIGljb25TaXplID0gbmV3IERpbWVuc2lvbigwLCAwKTsKLQotCXByaXZhdGUgUG9pbnQgaWNvbkxvY2F0aW9uOwotCi0JcHJpdmF0ZSBQb2ludCB0ZXh0TG9jYXRpb247Ci0KLQlwcml2YXRlIGludCB0ZXh0QWxpZ25tZW50ID0gQ0VOVEVSOwotCi0JcHJpdmF0ZSBpbnQgaWNvbkFsaWdubWVudCA9IENFTlRFUjsKLQotCXByaXZhdGUgaW50IGxhYmVsQWxpZ25tZW50ID0gQ0VOVEVSOwotCi0JcHJpdmF0ZSBpbnQgdGV4dFBsYWNlbWVudCA9IFNPVVRIOwotCi0JcHJpdmF0ZSBpbnQgaWNvblRleHRHYXAgPSAzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfU0VMRUNURUQgPSBNQVhfRkxBRyA8PCAxLAotCQkJRkxBR19IQVNGT0NVUyA9IE1BWF9GTEFHIDw8IDIsIEZMQUdfV1JBUCA9IE1BWF9GTEFHIDw8IDUsCi0JCQlGTEFHX1dSQVBfQUxJR04gPSBNQVhfRkxBRyA8PCA2OwotCi0JLy8gVGhlIHByaW1hcnkgZGltZW5zaW9ucyB1c2VkIHRvIGNhbGN1bGF0ZSB0ZXh0IHNpemUuCi0JcHJpdmF0ZSBEaW1lbnNpb24gdGV4dERpbWVuc2lvbiA9IG5ldyBEaW1lbnNpb24oLTEsIC0xKTsKLQotCXByaXZhdGUgRGltZW5zaW9uIHByZWZTaXplRGltZW5zaW9uID0gbmV3IERpbWVuc2lvbigtMSwgLTEpOwotCi0JcHJpdmF0ZSBpbnQgd3JhcFdpZHRoOwotCi0JcHVibGljIFdyYXBwYWJsZUxhYmVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIExhYmVsIHdpdGggcGFzc2VkIFN0cmluZyBhcyBpdHMgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgdGhlIGxhYmVsIHRleHQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFdyYXBwYWJsZUxhYmVsKFN0cmluZyBzKSB7Ci0JCXNldFRleHQocyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgV3JhcHBlZExhYmVsIHdpdGggcGFzc2VkIEltYWdlIGFzIGl0cyBpY29uLgotCSAqIAotCSAqIEBwYXJhbSBpCi0JICogICAgICAgICAgICB0aGUgV3JhcHBlZExhYmVsIGltYWdlCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBXcmFwcGFibGVMYWJlbChJbWFnZSBpKSB7Ci0JCXNldEljb24oaSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgV3JhcHBlZExhYmVsIHdpdGggcGFzc2VkIFN0cmluZyBhcyB0ZXh0IGFuZCBwYXNzZWQgSW1hZ2UgYXMKLQkgKiBpdHMgaWNvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgdGhlIFdyYXBwZWRMYWJlbCB0ZXh0Ci0JICogQHBhcmFtIGkKLQkgKiAgICAgICAgICAgIHRoZSBXcmFwcGVkTGFiZWwgaW1hZ2UKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFdyYXBwYWJsZUxhYmVsKFN0cmluZyBzLCBJbWFnZSBpKSB7Ci0JCXNldFRleHQocyk7Ci0JCXNldEljb24oaSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFsaWduT25IZWlnaHQoUG9pbnQgbG9jLCBEaW1lbnNpb24gc2l6ZSwgaW50IGFsaWdubWVudCkgewotCQlJbnNldHMgaW5zZXRzID0gZ2V0SW5zZXRzKCk7Ci0JCXN3aXRjaCAoYWxpZ25tZW50KSB7Ci0JCWNhc2UgVE9QOgotCQkJbG9jLnkgPSBpbnNldHMudG9wOwotCQkJYnJlYWs7Ci0JCWNhc2UgQk9UVE9NOgotCQkJbG9jLnkgPSBib3VuZHMuaGVpZ2h0IC0gc2l6ZS5oZWlnaHQgLSBpbnNldHMuYm90dG9tOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlsb2MueSA9IChib3VuZHMuaGVpZ2h0IC0gc2l6ZS5oZWlnaHQpIC8gMjsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhbGlnbk9uV2lkdGgoUG9pbnQgbG9jLCBEaW1lbnNpb24gc2l6ZSwgaW50IGFsaWdubWVudCkgewotCQlJbnNldHMgaW5zZXRzID0gZ2V0SW5zZXRzKCk7Ci0JCXN3aXRjaCAoYWxpZ25tZW50KSB7Ci0JCWNhc2UgTEVGVDoKLQkJCWxvYy54ID0gaW5zZXRzLmxlZnQ7Ci0JCQlicmVhazsKLQkJY2FzZSBSSUdIVDoKLQkJCWxvYy54ID0gYm91bmRzLndpZHRoIC0gc2l6ZS53aWR0aCAtIGluc2V0cy5yaWdodDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJbG9jLnggPSAoYm91bmRzLndpZHRoIC0gc2l6ZS53aWR0aCkgLyAyOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZUFsaWdubWVudCgpIHsKLQkJc3dpdGNoICh0ZXh0UGxhY2VtZW50KSB7Ci0JCWNhc2UgRUFTVDoKLQkJY2FzZSBXRVNUOgotCQkJYWxpZ25PbkhlaWdodCh0ZXh0TG9jYXRpb24sIGdldFRleHRTaXplKCksIHRleHRBbGlnbm1lbnQpOwotCQkJYWxpZ25PbkhlaWdodChpY29uTG9jYXRpb24sIGljb25TaXplLCBpY29uQWxpZ25tZW50KTsKLQkJCWJyZWFrOwotCQljYXNlIE5PUlRIOgotCQljYXNlIFNPVVRIOgotCQkJYWxpZ25PbldpZHRoKHRleHRMb2NhdGlvbiwgZ2V0U3ViU3RyaW5nVGV4dFNpemUoKSwgdGV4dEFsaWdubWVudCk7Ci0JCQlhbGlnbk9uV2lkdGgoaWNvbkxvY2F0aW9uLCBpY29uU2l6ZSwgaWNvbkFsaWdubWVudCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZXMgdGhlIHNpemUgb2YgdGhlIFdyYXBwZWRMYWJlbCB1c2luZyB0aGUgcGFzc2VkIERpbWVuc2lvbiBhcyB0aGUKLQkgKiBzaXplIG9mIHRoZSBXcmFwcGVkTGFiZWwncyB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSB0eHRTaXplCi0JICogICAgICAgICAgICB0aGUgcHJlY2FsY3VsYXRlZCBzaXplIG9mIHRoZSBXcmFwcGVkTGFiZWwncyB0ZXh0Ci0JICogQHJldHVybiB0aGUgV3JhcHBlZExhYmVsJ3Mgc2l6ZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZUxhYmVsU2l6ZShEaW1lbnNpb24gdHh0U2l6ZSkgewotCQlpbnQgZ2FwID0gaWNvblRleHRHYXA7Ci0JCWlmIChnZXRJY29uKCkgPT0gbnVsbCB8fCBnZXRUZXh0KCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJZ2FwID0gMDsKLQkJRGltZW5zaW9uIGQgPSBuZXcgRGltZW5zaW9uKDAsIDApOwotCQlpZiAodGV4dFBsYWNlbWVudCA9PSBXRVNUIHx8IHRleHRQbGFjZW1lbnQgPT0gRUFTVCkgewotCQkJZC53aWR0aCA9IGljb25TaXplLndpZHRoICsgZ2FwICsgdHh0U2l6ZS53aWR0aDsKLQkJCWQuaGVpZ2h0ID0gTWF0aC5tYXgoaWNvblNpemUuaGVpZ2h0LCB0eHRTaXplLmhlaWdodCk7Ci0JCX0gZWxzZSB7Ci0JCQlkLndpZHRoID0gTWF0aC5tYXgoaWNvblNpemUud2lkdGgsIHR4dFNpemUud2lkdGgpOwotCQkJZC5oZWlnaHQgPSBpY29uU2l6ZS5oZWlnaHQgKyBnYXAgKyB0eHRTaXplLmhlaWdodDsKLQkJfQotCQlyZXR1cm4gZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlTG9jYXRpb25zKCkgewotCQl0ZXh0TG9jYXRpb24gPSBuZXcgUG9pbnQoKTsKLQkJaWNvbkxvY2F0aW9uID0gbmV3IFBvaW50KCk7Ci0KLQkJY2FsY3VsYXRlUGxhY2VtZW50KCk7Ci0JCWNhbGN1bGF0ZUFsaWdubWVudCgpOwotCQlEaW1lbnNpb24gb2Zmc2V0ID0gZ2V0U2l6ZSgpLmdldERpZmZlcmVuY2UoZ2V0UHJlZmVycmVkU2l6ZSgpKTsKLQkJb2Zmc2V0LndpZHRoICs9IGdldFRleHRTaXplKCkud2lkdGggLSBnZXRTdWJTdHJpbmdUZXh0U2l6ZSgpLndpZHRoOwotCQlzd2l0Y2ggKGxhYmVsQWxpZ25tZW50KSB7Ci0JCWNhc2UgQ0VOVEVSOgotCQkJb2Zmc2V0LnNjYWxlKDAuNWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTEVGVDoKLQkJCW9mZnNldC5zY2FsZSgwLjBmKTsKLQkJCWJyZWFrOwotCQljYXNlIFJJR0hUOgotCQkJb2Zmc2V0LnNjYWxlKDEuMGYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVE9QOgotCQkJb2Zmc2V0LmhlaWdodCA9IDA7Ci0JCQlvZmZzZXQuc2NhbGUoMC41Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBCT1RUT006Ci0JCQlvZmZzZXQuaGVpZ2h0ID0gb2Zmc2V0LmhlaWdodCAqIDI7Ci0JCQlvZmZzZXQuc2NhbGUoMC41Zik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCW9mZnNldC5zY2FsZSgwLjVmKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3dpdGNoICh0ZXh0UGxhY2VtZW50KSB7Ci0JCWNhc2UgRUFTVDoKLQkJY2FzZSBXRVNUOgotCQkJb2Zmc2V0LmhlaWdodCA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBOT1JUSDoKLQkJY2FzZSBTT1VUSDoKLQkJCW9mZnNldC53aWR0aCA9IDA7Ci0JCQlicmVhazsKLQkJfQotCi0JCXRleHRMb2NhdGlvbi50cmFuc2xhdGUob2Zmc2V0KTsKLQkJaWNvbkxvY2F0aW9uLnRyYW5zbGF0ZShvZmZzZXQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVQbGFjZW1lbnQoKSB7Ci0JCWludCBnYXAgPSBpY29uVGV4dEdhcDsKLQkJaWYgKGljb24gPT0gbnVsbCB8fCB0ZXh0LmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCWdhcCA9IDA7Ci0JCUluc2V0cyBpbnNldHMgPSBnZXRJbnNldHMoKTsKLQotCQlzd2l0Y2ggKHRleHRQbGFjZW1lbnQpIHsKLQkJY2FzZSBFQVNUOgotCQkJaWNvbkxvY2F0aW9uLnggPSBpbnNldHMubGVmdDsKLQkJCXRleHRMb2NhdGlvbi54ID0gaWNvblNpemUud2lkdGggKyBnYXAgKyBpbnNldHMubGVmdDsKLQkJCWJyZWFrOwotCQljYXNlIFdFU1Q6Ci0JCQl0ZXh0TG9jYXRpb24ueCA9IGluc2V0cy5sZWZ0OwotCQkJaWNvbkxvY2F0aW9uLnggPSBnZXRTdWJTdHJpbmdUZXh0U2l6ZSgpLndpZHRoICsgZ2FwICsgaW5zZXRzLmxlZnQ7Ci0JCQlicmVhazsKLQkJY2FzZSBOT1JUSDoKLQkJCXRleHRMb2NhdGlvbi55ID0gaW5zZXRzLnRvcDsKLQkJCWljb25Mb2NhdGlvbi55ID0gZ2V0VGV4dFNpemUoKS5oZWlnaHQgKyBnYXAgKyBpbnNldHMudG9wOwotCQkJYnJlYWs7Ci0JCWNhc2UgU09VVEg6Ci0JCQl0ZXh0TG9jYXRpb24ueSA9IGljb25TaXplLmhlaWdodCArIGdhcCArIGluc2V0cy50b3A7Ci0JCQlpY29uTG9jYXRpb24ueSA9IGluc2V0cy50b3A7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIHRoZSBzaXplIG9mIHRoZSBMYWJlbCdzIHRleHQgc2l6ZS4gVGhlIHRleHQgc2l6ZSBjYWxjdWxhdGVkCi0JICogdGFrZXMgaW50byBjb25zaWRlcmF0aW9uIGlmIHRoZSBMYWJlbCdzIHRleHQgaXMgY3VycmVudGx5IHRydW5jYXRlZC4gSWYKLQkgKiB0ZXh0IHNpemUgd2l0aG91dCBjb25zaWRlcmluZyBjdXJyZW50IHRydW5jYXRpb24gaXMgZGVzaXJlZCwgdXNlCi0JICoge0BsaW5rICNjYWxjdWxhdGVUZXh0U2l6ZSgpfS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBsYWJlbCdzIHRleHQsIHRha2luZyBpbnRvIGFjY291bnQgdHJ1bmNhdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVN1YlN0cmluZ1RleHRTaXplKCkgewotCQlyZXR1cm4gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKGdldFN1YlN0cmluZ1RleHQoKSwgZ2V0Rm9udCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBMYWJlbCdzIHRleHQuIE5vdGUgdGhhdCB0aGlzCi0JICogRGltZW5zaW9uIGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIExhYmVsJ3MgZnVsbCB0ZXh0LCByZWdhcmRsZXNzIG9mCi0JICogd2hldGhlciBvciBub3QgaXRzIHRleHQgaXMgY3VycmVudGx5IHRydW5jYXRlZC4gSWYgdGV4dCBzaXplIGNvbnNpZGVyaW5nCi0JICogY3VycmVudCB0cnVuY2F0aW9uIGlzIGRlc2lyZWQsIHVzZSB7QGxpbmsgI2NhbGN1bGF0ZVN1YlN0cmluZ1RleHRTaXplKCl9LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxhYmVsJ3MgdGV4dCwgaWdub3JpbmcgdHJ1bmNhdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVRleHRTaXplKCkgewotCQkvLyByZXR1cm4gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKGdldFRleHQoKSwgZ2V0Rm9udCgpKTsKLQkJcmV0dXJuIEZpZ3VyZVV0aWxpdGllcy5nZXRUZXh0RXh0ZW50cyhnZXRXcmFwcGVkVGV4dChnZXRTaXplKCkud2lkdGgsCi0JCQkJZ2V0U2l6ZSgpLmhlaWdodCksIGdldEZvbnQoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJMb2NhdGlvbnMoKSB7Ci0JCWljb25Mb2NhdGlvbiA9IHRleHRMb2NhdGlvbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgTGFiZWwncyBpY29uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxhYmVsIGljb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIEltYWdlIGdldEljb24oKSB7Ci0JCXJldHVybiBpY29uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgYWxpZ25tZW50IG9mIHRoZSBMYWJlbCdzIGljb24uIFRoZSBkZWZhdWx0IGlzCi0JICoge0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0NFTlRFUn0uCi0JICogCi0JICogQHJldHVybiB0aGUgaWNvbiBhbGlnbm1lbnQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIGludCBnZXRJY29uQWxpZ25tZW50KCkgewotCQlyZXR1cm4gaWNvbkFsaWdubWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBib3VuZHMgb2YgdGhlIExhYmVsJ3MgaWNvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpY29uJ3MgYm91bmRzCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBSZWN0YW5nbGUgZ2V0SWNvbkJvdW5kcygpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGdldEJvdW5kcygpOwotCQlyZXR1cm4gbmV3IFJlY3RhbmdsZShib3VuZHMuZ2V0TG9jYXRpb24oKS50cmFuc2xhdGUoZ2V0SWNvbkxvY2F0aW9uKCkpLAotCQkJCWljb25TaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgTGFiZWwncyBpY29uIHJlbGF0aXZlIHRvIHRoZSBMYWJlbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpY29uJ3MgbG9jYXRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGdldEljb25Mb2NhdGlvbigpIHsKLQkJaWYgKGljb25Mb2NhdGlvbiA9PSBudWxsKQotCQkJY2FsY3VsYXRlTG9jYXRpb25zKCk7Ci0JCXJldHVybiBpY29uTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ2FwIGluIHBpeGVscyBiZXR3ZWVuIHRoZSBMYWJlbCdzIGljb24gYW5kIGl0cyB0ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGdhcAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEljb25UZXh0R2FwKCkgewotCQlyZXR1cm4gaWNvblRleHRHYXA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRmlndXJlI2dldE1pbmltdW1TaXplKGludCwgaW50KQotCSAqLwotCXB1YmxpYyBEaW1lbnNpb24gZ2V0TWluaW11bVNpemUoaW50IHcsIGludCBoKSB7Ci0JCWlmIChtaW5TaXplICE9IG51bGwpCi0JCQlyZXR1cm4gbWluU2l6ZTsKLQkJbWluU2l6ZSA9IG5ldyBEaW1lbnNpb24oKTsKLQkJaWYgKGdldExheW91dE1hbmFnZXIoKSAhPSBudWxsKQotCQkJbWluU2l6ZS5zZXRTaXplKGdldExheW91dE1hbmFnZXIoKS5nZXRNaW5pbXVtU2l6ZSh0aGlzLCB3LCBoKSk7Ci0KLQkJRGltZW5zaW9uIGxhYmVsU2l6ZSA9IGNhbGN1bGF0ZUxhYmVsU2l6ZShGaWd1cmVVdGlsaXRpZXMKLQkJCQkuZ2V0VGV4dEV4dGVudHMoRUxMSVBTSVMsIGdldEZvbnQoKSkuaW50ZXJzZWN0KAotCQkJCQkJRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKGdldFRleHQoKSwgZ2V0Rm9udCgpKSkpOwotCQlJbnNldHMgaW5zZXRzID0gZ2V0SW5zZXRzKCk7Ci0JCWxhYmVsU2l6ZS5leHBhbmQoaW5zZXRzLmdldFdpZHRoKCksIGluc2V0cy5nZXRIZWlnaHQoKSk7Ci0JCW1pblNpemUudW5pb24obGFiZWxTaXplKTsKLQkJcmV0dXJuIG1pblNpemU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRmlndXJlI2dldFByZWZlcnJlZFNpemUoaW50LCBpbnQpCi0JICovCi0JcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKGludCB3SGludCwgaW50IGhIaW50KSB7Ci0JCWlmIChwcmVmU2l6ZSA9PSBudWxsIHx8IHdIaW50ICE9IHByZWZTaXplRGltZW5zaW9uLndpZHRoCi0JCQkJfHwgaEhpbnQgIT0gcHJlZlNpemVEaW1lbnNpb24uaGVpZ2h0KSB7Ci0JCQlwcmVmU2l6ZSA9IGNhbGN1bGF0ZUxhYmVsU2l6ZShnZXRUZXh0U2l6ZSh3SGludCwgaEhpbnQpKTsKLQkJCUluc2V0cyBpbnNldHMgPSBnZXRJbnNldHMoKTsKLQkJCXByZWZTaXplLmV4cGFuZChpbnNldHMuZ2V0V2lkdGgoKSwgaW5zZXRzLmdldEhlaWdodCgpKTsKLQkJCWlmIChnZXRMYXlvdXRNYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCQlwcmVmU2l6ZS51bmlvbihnZXRMYXlvdXRNYW5hZ2VyKCkuZ2V0UHJlZmVycmVkU2l6ZSh0aGlzLCB3SGludCwKLQkJCQkJCWhIaW50KSk7Ci0JCX0KLQkJaWYgKHdIaW50ID49IDAgJiYgd0hpbnQgPCBwcmVmU2l6ZS53aWR0aCkgewotCQkJRGltZW5zaW9uIG1pblNpemUgPSBnZXRNaW5pbXVtU2l6ZSh3SGludCwgaEhpbnQpOwotCQkJRGltZW5zaW9uIHJlc3VsdCA9IHByZWZTaXplLmdldENvcHkoKTsKLQkJCXJlc3VsdC53aWR0aCA9IE1hdGgubWluKHJlc3VsdC53aWR0aCwgd0hpbnQpOwotCQkJcmVzdWx0LndpZHRoID0gTWF0aC5tYXgobWluU2l6ZS53aWR0aCwgcmVzdWx0LndpZHRoKTsKLQkJCXByZWZTaXplRGltZW5zaW9uLndpZHRoID0gcmVzdWx0LndpZHRoOwotCQkJcHJlZlNpemVEaW1lbnNpb24uaGVpZ2h0ID0gcmVzdWx0LndpZHRoOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gcHJlZlNpemU7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlcyB0aGUgYW1vdW50IG9mIHRoZSBMYWJlbCdzIGN1cnJlbnQgdGV4dCB3aWxsIGZpdCBpbiB0aGUgTGFiZWwsCi0JICogaW5jbHVkaW5nIGFuIGVsaXBzaXMgIi4uLiIgaWYgdHJ1bmNhdGlvbiBpcyByZXF1aXJlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdWJzdHJpbmcKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdWJTdHJpbmdUZXh0KCkgewotCQlpZiAoc3ViU3RyaW5nVGV4dCAhPSBudWxsKQotCQkJcmV0dXJuIHN1YlN0cmluZ1RleHQ7Ci0KLQkJc3ViU3RyaW5nVGV4dCA9IHRleHQ7Ci0JCURpbWVuc2lvbiBzaHJpbmsgPSBnZXRQcmVmZXJyZWRTaXplKGdldFNpemUoKS53aWR0aCwgZ2V0U2l6ZSgpLmhlaWdodCkKLQkJCQkuZ2V0RGlmZmVyZW5jZShnZXRTaXplKCkpOwotCQlEaW1lbnNpb24gZWZmZWN0aXZlU2l6ZSA9IGdldFRleHRTaXplKCkuZ2V0RXhwYW5kZWQoLXNocmluay53aWR0aCwKLQkJCQktc2hyaW5rLmhlaWdodCk7Ci0JCUZvbnQgY3VycmVudEZvbnQgPSBnZXRGb250KCk7Ci0JCWludCBmb250SGVpZ2h0ID0gRmlndXJlVXRpbGl0aWVzLmdldEZvbnRNZXRyaWNzKGN1cnJlbnRGb250KQotCQkJCS5nZXRIZWlnaHQoKTsKLQkJaW50IG1heExpbmVzID0gKGludCkgKGVmZmVjdGl2ZVNpemUuaGVpZ2h0IC8gKGRvdWJsZSkgZm9udEhlaWdodCk7Ci0KLQkJU3RyaW5nQnVmZmVyIGFjY3VtbGF0ZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdCdWZmZXIgcmVtYWluaW5nVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0VGV4dCgpKTsKLQkJaW50IGkgPSAwLCBqID0gMDsKLQotCQl3aGlsZSAocmVtYWluaW5nVGV4dC5sZW5ndGgoKSA+IDAgJiYgaisrIDwgbWF4TGluZXMpIHsKLQkJCWkgPSBnZXRMaW5lV3JhcFBvc2l0aW9uKHJlbWFpbmluZ1RleHQudG9TdHJpbmcoKSwgY3VycmVudEZvbnQsCi0JCQkJCWVmZmVjdGl2ZVNpemUud2lkdGgpOwotCi0JCQlpZiAoYWNjdW1sYXRlZFRleHQubGVuZ3RoKCkgPiAwKQotCQkJCWFjY3VtbGF0ZWRUZXh0LmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoaSA9PSAwIHx8IChyZW1haW5pbmdUZXh0Lmxlbmd0aCgpID4gaSAmJiBqID09IG1heExpbmVzKSkgewotCQkJCWludCBkb3RzV2lkdGggPSBGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dEV4dGVudHMoRUxMSVBTSVMsCi0JCQkJCQljdXJyZW50Rm9udCkud2lkdGg7Ci0JCQkJaSA9IGdldExhcmdlc3RTdWJzdHJpbmdDb25maW5lZFRvKHJlbWFpbmluZ1RleHQudG9TdHJpbmcoKSwKLQkJCQkJCWN1cnJlbnRGb250LCBNYXRoLm1heChlZmZlY3RpdmVTaXplLndpZHRoIC0gZG90c1dpZHRoLAotCQkJCQkJCQkwKSk7Ci0JCQkJYWNjdW1sYXRlZFRleHQuYXBwZW5kKHJlbWFpbmluZ1RleHQuc3Vic3RyaW5nKDAsIGkpKTsKLQkJCQlhY2N1bWxhdGVkVGV4dC5hcHBlbmQoRUxMSVBTSVMpOwotCQkJfSBlbHNlCi0JCQkJYWNjdW1sYXRlZFRleHQuYXBwZW5kKHJlbWFpbmluZ1RleHQuc3Vic3RyaW5nKDAsIGkpKTsKLQkJCXJlbWFpbmluZ1RleHQuZGVsZXRlKDAsIGkpOwotCQl9Ci0JCXJldHVybiBzdWJTdHJpbmdUZXh0ID0gYWNjdW1sYXRlZFRleHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBMYWJlbCdzIGN1cnJlbnQgdGV4dC4gSWYgdGhlIHRleHQgaXMgY3VycmVudGx5Ci0JICogdHJ1bmNhdGVkLCB0aGUgdHJ1bmNhdGVkIHRleHQgd2l0aCBpdHMgZWxsaXBzaXMgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlCi0JICogc2l6ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoaXMgbGFiZWwncyB0ZXh0LCB0YWtpbmcgaW50byBhY2NvdW50IHRydW5jYXRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIERpbWVuc2lvbiBnZXRTdWJTdHJpbmdUZXh0U2l6ZSgpIHsKLQkJaWYgKHN1YlN0cmluZ1RleHRTaXplID09IG51bGwpCi0JCQlzdWJTdHJpbmdUZXh0U2l6ZSA9IGNhbGN1bGF0ZVN1YlN0cmluZ1RleHRTaXplKCk7Ci0JCXJldHVybiBzdWJTdHJpbmdUZXh0U2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IG9mIHRoZSBsYWJlbC4gTm90ZSB0aGF0IHRoaXMgaXMgdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhlCi0JICogbGFiZWwsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBjdXJyZW50bHkgYmVpbmcgdHJ1bmNhdGVkLiBDYWxsCi0JICoge0BsaW5rICNnZXRTdWJTdHJpbmdUZXh0KCl9IHRvIHJldHVybiB0aGUgbGFiZWwncyBjdXJyZW50IHRleHQgY29udGVudHMKLQkgKiB3aXRoIHRydW5jYXRpb24gY29uc2lkZXJlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgbGFiZWwKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFsaWdubWVudCBvZiB0aGUgTGFiZWwncyB0ZXh0LiBUaGUgZGVmYXVsdCB0ZXh0Ci0JICogYWxpZ25tZW50IGlzIHtAbGluayBQb3NpdGlvbkNvbnN0YW50cyNDRU5URVJ9LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgYWxpZ25tZW50Ci0JICovCi0JcHVibGljIGludCBnZXRUZXh0QWxpZ25tZW50KCkgewotCQlyZXR1cm4gdGV4dEFsaWdubWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBib3VuZHMgb2YgdGhlIGxhYmVsJ3MgdGV4dC4gTm90ZSB0aGF0IHRoZSBib3VuZHMgYXJlCi0JICogY2FsY3VsYXRlZCB1c2luZyB0aGUgbGFiZWwncyBjb21wbGV0ZSB0ZXh0IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUKLQkgKiBsYWJlbCdzIHRleHQgaXMgY3VycmVudGx5IHRydW5jYXRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBib3VuZHMgb2YgdGhpcyBsYWJlbCdzIGNvbXBsZXRlIHRleHQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFJlY3RhbmdsZSBnZXRUZXh0Qm91bmRzKCkgewotCQlSZWN0YW5nbGUgYm91bmRzID0gZ2V0Qm91bmRzKCk7Ci0JCXJldHVybiBuZXcgUmVjdGFuZ2xlKGJvdW5kcy5nZXRMb2NhdGlvbigpLnRyYW5zbGF0ZShnZXRUZXh0TG9jYXRpb24oKSksCi0JCQkJdGV4dFNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBsYWJlbCdzIHRleHQgcmVsYXRpdmUgdG8gdGhlIGxhYmVsLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgbG9jYXRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGdldFRleHRMb2NhdGlvbigpIHsKLQkJaWYgKHRleHRMb2NhdGlvbiAhPSBudWxsKQotCQkJcmV0dXJuIHRleHRMb2NhdGlvbjsKLQkJY2FsY3VsYXRlTG9jYXRpb25zKCk7Ci0JCXJldHVybiB0ZXh0TG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBwbGFjZW1lbnQgb2YgdGhlIGxhYmVsJ3MgdGV4dCByZWxhdGl2ZSB0byBpdHMgaWNvbi4KLQkgKiBUaGUgZGVmYXVsdCB0ZXh0IHBsYWNlbWVudCBpcyB7QGxpbmsgUG9zaXRpb25Db25zdGFudHMjRUFTVH0uCi0JICogCi0JICogQHJldHVybiB0aGUgdGV4dCBwbGFjZW1lbnQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0UGxhY2VtZW50KCkgewotCQlyZXR1cm4gdGV4dFBsYWNlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBsYWJlbCdzIGNvbXBsZXRlIHRleHQuIE5vdGUgdGhhdCB0aGUgdGV4dCB1c2VkIHRvCi0JICogbWFrZSB0aGlzIGNhbGN1bGF0aW9uIGlzIHRoZSBsYWJlbCdzIGZ1bGwgdGV4dCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZQotCSAqIGxhYmVsJ3MgdGV4dCBpcyBjdXJyZW50bHkgYmVpbmcgdHJ1bmNhdGVkIGFuZCBpcyBkaXNwbGF5aW5nIGFuIGVsbGlwc2lzLgotCSAqIElmIHRoZSBzaXplIGNvbnNpZGVyaW5nIGN1cnJlbnQgdHJ1bmNhdGlvbiBpcyBkZXNpcmVkLCBjYWxsCi0JICoge0BsaW5rICNnZXRTdWJTdHJpbmdUZXh0U2l6ZSgpfS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoaXMgbGFiZWwncyBjb21wbGV0ZSB0ZXh0Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCBEaW1lbnNpb24gZ2V0VGV4dFNpemUoKSB7Ci0JCWlmICh0ZXh0U2l6ZSA9PSBudWxsKQotCQkJdGV4dFNpemUgPSBjYWxjdWxhdGVUZXh0U2l6ZSgpOwotCQlyZXR1cm4gdGV4dFNpemU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgbGFiZWwncyBjb21wbGV0ZSB0ZXh0LiBOb3RlIHRoYXQgdGhlIHRleHQgdXNlZCB0bwotCSAqIG1ha2UgdGhpcyBjYWxjdWxhdGlvbiBpcyB0aGUgbGFiZWwncyBmdWxsIHRleHQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUKLQkgKiBsYWJlbCdzIHRleHQgaXMgY3VycmVudGx5IGJlaW5nIHRydW5jYXRlZCBhbmQgaXMgZGlzcGxheWluZyBhbiBlbGxpcHNpcy4KLQkgKiBJZiB0aGUgc2l6ZSBjb25zaWRlcmluZyBjdXJyZW50IHRydW5jYXRpb24gaXMgZGVzaXJlZCwgY2FsbAotCSAqIHtAbGluayAjZ2V0U3ViU3RyaW5nVGV4dFNpemUoKX0uCi0JICogCi0JICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGlzIGxhYmVsJ3MgY29tcGxldGUgdGV4dAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIGdldFRleHRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlpZiAodGV4dFNpemUgPT0gbnVsbCkgewotCQkJdGV4dFNpemUgPSBjYWxjdWxhdGVUZXh0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKLQkJCXRleHREaW1lbnNpb24ud2lkdGggPSB3aWR0aDsKLQkJCXRleHREaW1lbnNpb24uaGVpZ2h0ID0gaGVpZ2h0OwotCQl9Ci0JCXJldHVybiB0ZXh0U2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElGaWd1cmUjaW52YWxpZGF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgaW52YWxpZGF0ZSgpIHsKLQkJcHJlZlNpemUgPSBudWxsOwotCQltaW5TaXplID0gbnVsbDsKLQkJY2xlYXJMb2NhdGlvbnMoKTsKLQkJdGV4dFNpemUgPSBudWxsOwotCQlzdWJTdHJpbmdUZXh0U2l6ZSA9IG51bGw7Ci0JCXN1YlN0cmluZ1RleHQgPSBudWxsOwotCQlzdXBlci5pbnZhbGlkYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGFiZWwncyB0ZXh0IGlzIGN1cnJlbnRseSB0cnVuY2F0ZWQKLQkgKiBhbmQgaXMgZGlzcGxheWluZyBhbiBlbGxpcHNpcywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsYWJlbCdzIHRleHQgaXMgdHJ1bmNhdGVkCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVGV4dFRydW5jYXRlZCgpIHsKLQkJcmV0dXJuICFnZXRTdWJTdHJpbmdUZXh0U2l6ZSgpLmVxdWFscyhnZXRUZXh0U2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEZpZ3VyZSNwYWludEZpZ3VyZShHcmFwaGljcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQlpZiAoaXNTZWxlY3RlZCgpKSB7Ci0JCQlncmFwaGljcy5wdXNoU3RhdGUoKTsKLQkJCWdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWdyYXBoaWNzLmZpbGxSZWN0YW5nbGUoZ2V0U2VsZWN0aW9uUmVjdGFuZ2xlKCkpOwotCQkJZ3JhcGhpY3MucG9wU3RhdGUoKTsKLQkJCWdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0JCX0KLQkJaWYgKGhhc0ZvY3VzKCkpIHsKLQkJCWdyYXBoaWNzLnB1c2hTdGF0ZSgpOwotCQkJZ3JhcGhpY3Muc2V0WE9STW9kZSh0cnVlKTsKLQkJCWdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0JCQlncmFwaGljcy5kcmF3Rm9jdXMoZ2V0U2VsZWN0aW9uUmVjdGFuZ2xlKCkucmVzaXplKC0xLCAtMSkpOwotCQkJZ3JhcGhpY3MucG9wU3RhdGUoKTsKLQkJfQotCQlpZiAoaXNPcGFxdWUoKSkKLQkJCXN1cGVyLnBhaW50RmlndXJlKGdyYXBoaWNzKTsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGdldEJvdW5kcygpOwotCQlncmFwaGljcy50cmFuc2xhdGUoYm91bmRzLngsIGJvdW5kcy55KTsKLQkJaWYgKGljb24gIT0gbnVsbCkKLQkJCWdyYXBoaWNzLmRyYXdJbWFnZShpY29uLCBnZXRJY29uTG9jYXRpb24oKSk7Ci0KLQkJaWYgKCFpc0VuYWJsZWQoKSkgewotCQkJZ3JhcGhpY3MudHJhbnNsYXRlKDEsIDEpOwotCQkJZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJ1dHRvbkxpZ2h0ZXN0KTsKLQkJCWdyYXBoaWNzZHJhd1RleHQoZ3JhcGhpY3MpOwotCQkJZ3JhcGhpY3MuZHJhd1RleHQoZ2V0U3ViU3RyaW5nVGV4dCgpLCBnZXRUZXh0TG9jYXRpb24oKSk7Ci0JCQlncmFwaGljcy50cmFuc2xhdGUoLTEsIC0xKTsKLQkJCWdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5idXR0b25EYXJrZXIpOwotCQl9Ci0JCWdyYXBoaWNzZHJhd1RleHQoZ3JhcGhpY3MpOwotCQlncmFwaGljcy50cmFuc2xhdGUoLWJvdW5kcy54LCAtYm91bmRzLnkpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhYmVsJ3MgaWNvbiB0byB0aGUgcGFzc2VkIGltYWdlLgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgdGhlIG5ldyBsYWJlbCBpbWFnZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJY29uKEltYWdlIGltYWdlKSB7Ci0JCWlmIChpY29uID09IGltYWdlKQotCQkJcmV0dXJuOwotCQlpY29uID0gaW1hZ2U7Ci0JCS8vIENhbGwgcmVwYWludCwgaW4gY2FzZSB0aGUgaW1hZ2UgZGltZW5zaW9ucyBhcmUgdGhlIHNhbWUuCi0JCXJlcGFpbnQoKTsKLQkJaWYgKGljb24gPT0gbnVsbCkKLQkJCXNldEljb25EaW1lbnNpb24obmV3IERpbWVuc2lvbigpKTsKLQkJZWxzZQotCQkJc2V0SWNvbkRpbWVuc2lvbihuZXcgRGltZW5zaW9uKGltYWdlKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgYWxpZ25tZW50IG9mIHRoZSBpY29uIHdpdGhpbiB0aGUgaWNvbiBkaW1lbnNpb24uIFRoZQotCSAqIGRpbWVuc2lvbiBzaG91bGQgYmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgSW1hZ2UgaXRzZWxmLCBzbyBjYWxsaW5nIHRoaXMKLQkgKiBtZXRob2Qgc2hvdWxkIGhhdmUgbm8gYWZmZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhbGlnbgotCSAqICAgICAgICAgICAgdGhlIGljb24gYWxpZ25tZW50Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEljb25BbGlnbm1lbnQoaW50IGFsaWduKSB7Ci0JCWlmIChpY29uQWxpZ25tZW50ID09IGFsaWduKQotCQkJcmV0dXJuOwotCQlpY29uQWxpZ25tZW50ID0gYWxpZ247Ci0JCWNsZWFyTG9jYXRpb25zKCk7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYWJlbCdzIGljb24gc2l6ZSB0byB0aGUgcGFzc2VkIERpbWVuc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZAotCSAqICAgICAgICAgICAgdGhlIG5ldyBpY29uIHNpemUKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWNvbkRpbWVuc2lvbihEaW1lbnNpb24gZCkgewotCQlpZiAoZC5lcXVhbHMoaWNvblNpemUpKQotCQkJcmV0dXJuOwotCQlpY29uU2l6ZSA9IGQ7Ci0JCXJldmFsaWRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBnYXAgaW4gcGl4ZWxzIGJldHdlZW4gdGhlIGxhYmVsJ3MgaWNvbiBhbmQgdGV4dCB0byB0aGUgcGFzc2VkCi0JICogdmFsdWUuIFRoZSBkZWZhdWx0IGlzIDQuCi0JICogCi0JICogQHBhcmFtIGdhcAotCSAqICAgICAgICAgICAgdGhlIGdhcAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJY29uVGV4dEdhcChpbnQgZ2FwKSB7Ci0JCWlmIChpY29uVGV4dEdhcCA9PSBnYXApCi0JCQlyZXR1cm47Ci0JCWljb25UZXh0R2FwID0gZ2FwOwotCQlyZXBhaW50KCk7Ci0JCXJldmFsaWRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhbGlnbm1lbnQgb2YgdGhlIGVudGlyZSBsYWJlbCAoaWNvbiBhbmQgdGV4dCkuIElmIHRoaXMgZmlndXJlJ3MKLQkgKiBib3VuZHMgYXJlIGxhcmdlciB0aGFuIHRoZSBzaXplIG5lZWRlZCB0byBkaXNwbGF5IHRoZSBsYWJlbCwgdGhlIGxhYmVsCi0JICogd2lsbCBiZSBhbGlnbmVkIGFjY29yZGluZ2x5LiBWYWxpZCB2YWx1ZXMgYXJlOgotCSAqIDxVTD4KLQkgKiA8TEk+PEVNPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNDRU5URVJ9PC9FTT4KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI1RPUH0KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0JPVFRPTX0KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0xFRlR9Ci0JICogPExJPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNSSUdIVH0KLQkgKiA8L1VMPgotCSAqIAotCSAqIEBwYXJhbSBhbGlnbgotCSAqICAgICAgICAgICAgbGFiZWwgYWxpZ25tZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxBbGlnbm1lbnQoaW50IGFsaWduKSB7Ci0JCWlmIChsYWJlbEFsaWdubWVudCA9PSBhbGlnbikKLQkJCXJldHVybjsKLQkJbGFiZWxBbGlnbm1lbnQgPSBhbGlnbjsKLQkJY2xlYXJMb2NhdGlvbnMoKTsKLQkJcmVwYWludCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhYmVsJ3MgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgdGhlIG5ldyBsYWJlbCB0ZXh0Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHMpIHsKLQkJLy8gInRleHQiIHdpbGwgbmV2ZXIgYmUgbnVsbC4KLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGV4dC5lcXVhbHMocykpCi0JCQlyZXR1cm47Ci0JCXRleHQgPSBzOwotCQlyZXZhbGlkYXRlKCk7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhbGlnbm1lbnQgb2YgdGhlIFRleHQgcmVsYXRpdmUgdG8gdGhlIGljb24uIFRoZSB0ZXh0IGFsaWdubWVudAotCSAqIG11c3QgYmUgb3J0aG9nb25hbCB0byB0aGUgdGV4dCBwbGFjZW1lbnQuIEZvciBleGFtcGxlLCBpZiB0aGUgcGxhY2VtZW50Ci0JICogaXMgRUFTVCwgdGhlbiB0aGUgdGV4dCBjYW4gYmUgYWxpZ25lZCB1c2luZyBUT1AsIENFTlRFUiwgb3IgQk9UVE9NLiBWYWxpZAotCSAqIHZhbHVlcyBhcmU6Ci0JICogPFVMPgotCSAqIDxMST48RU0+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0NFTlRFUn08L0VNPgotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjVE9QfQotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjQk9UVE9NfQotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjTEVGVH0KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI1JJR0hUfQotCSAqIDwvVUw+Ci0JICogCi0JICogQHNlZSAjc2V0TGFiZWxBbGlnbm1lbnQoaW50KQotCSAqIEBwYXJhbSBhbGlnbgotCSAqICAgICAgICAgICAgdGhlIHRleHQgYWxpZ25tZW50Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRBbGlnbm1lbnQoaW50IGFsaWduKSB7Ci0JCWlmICh0ZXh0QWxpZ25tZW50ID09IGFsaWduKQotCQkJcmV0dXJuOwotCQl0ZXh0QWxpZ25tZW50ID0gYWxpZ247Ci0JCWNsZWFyTG9jYXRpb25zKCk7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwbGFjZW1lbnQgb2YgdGV4dCByZWxhdGl2ZSB0byB0aGUgbGFiZWwncyBpY29uLiBWYWxpZCB2YWx1ZXMKLQkgKiBhcmU6Ci0JICogPFVMPgotCSAqIDxMST48RU0+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0VBU1R9PC9FTT4KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI05PUlRIfQotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjU09VVEh9Ci0JICogPExJPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNXRVNUfQotCSAqIDwvVUw+Ci0JICogCi0JICogQHBhcmFtIHdoZXJlCi0JICogICAgICAgICAgICB0aGUgdGV4dCBwbGFjZW1lbnQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFBsYWNlbWVudChpbnQgd2hlcmUpIHsKLQkJaWYgKHRleHRQbGFjZW1lbnQgPT0gd2hlcmUpCi0JCQlyZXR1cm47Ci0JCXRleHRQbGFjZW1lbnQgPSB3aGVyZTsKLQkJcmV2YWxpZGF0ZSgpOwotCQlyZXBhaW50KCk7Ci0JfQotCi0JcHJpdmF0ZSBSZWN0YW5nbGUgZ2V0U2VsZWN0aW9uUmVjdGFuZ2xlKCkgewotCQlSZWN0YW5nbGUgYm91bmRzID0gZ2V0VGV4dEJvdW5kcygpOwotCQlib3VuZHMuZXhwYW5kKG5ldyBJbnNldHMoMiwgMiwgMCwgMCkpOwotCQl0cmFuc2xhdGVUb1BhcmVudChib3VuZHMpOwotCQlib3VuZHMuaW50ZXJzZWN0KGdldEJvdW5kcygpKTsKLQkJcmV0dXJuIGJvdW5kczsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBMYWJlbCdzIHRleHQuIE5vdGUgdGhhdCB0aGlzCi0JICogRGltZW5zaW9uIGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIExhYmVsJ3MgZnVsbCB0ZXh0LCByZWdhcmRsZXNzIG9mCi0JICogd2hldGhlciBvciBub3QgaXRzIHRleHQgaXMgY3VycmVudGx5IHRydW5jYXRlZC4gSWYgdGV4dCBzaXplIGNvbnNpZGVyaW5nCi0JICogY3VycmVudCB0cnVuY2F0aW9uIGlzIGRlc2lyZWQsIHVzZSB7QGxpbmsgI2NhbGN1bGF0ZVN1YlN0cmluZ1RleHRTaXplKCl9LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxhYmVsJ3MgdGV4dCwgaWdub3JpbmcgdHJ1bmNhdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVRleHRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlyZXR1cm4gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKGdldFdyYXBwZWRUZXh0KHdpZHRoLCBoZWlnaHQpLAotCQkJCWdldEZvbnQoKSk7Ci0JfQotCi0JLy8gQ29kZSBmb3IgdGhlIFRleHQgV3JhcC4KLQkvLyBTdGFydHMgaGVyZS4KLQotCXByaXZhdGUgU3RyaW5nIGdldFdyYXBwZWRUZXh0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlpZiAoIWlzVGV4dFdyYXBwZWQoKSB8fCB3aWR0aCA9PSAtMSkKLQkJCXJldHVybiBnZXRUZXh0KCk7Ci0KLQkJaWYgKGlzSWNvbkV4aXN0KCkpIHsKLQkJCXN3aXRjaCAodGV4dFBsYWNlbWVudCkgewotCQkJY2FzZSBFQVNUOgotCQkJY2FzZSBXRVNUOgotCQkJCXdpZHRoIC09IGljb25TaXplLndpZHRoICsgZ2V0SWNvblRleHRHYXAoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTk9SVEg6Ci0JCQljYXNlIFNPVVRIOgotCQkJCWlmIChoZWlnaHQgIT0gLTEpCi0JCQkJCWhlaWdodCAtPSBpY29uU2l6ZS5oZWlnaHQgKyBnZXRJY29uVGV4dEdhcCgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJRm9udCBmID0gZ2V0Rm9udCgpOwotCQlpbnQgbWF4TGluZXMgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJaWYgKGhlaWdodCAhPSAtMSkgewotCQkJaW50IGZvbnRIZWlnaHQgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3MoZikuZ2V0SGVpZ2h0KCk7Ci0JCQltYXhMaW5lcyA9IChpbnQpIChoZWlnaHQgLyAoZG91YmxlKSBmb250SGVpZ2h0KTsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBhY2N1bWxhdGVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nQnVmZmVyIHJlbWFpbmluZ1RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKGdldFRleHQoKSk7Ci0JCWludCBpID0gMCwgaiA9IDA7Ci0KLQkJd2hpbGUgKHJlbWFpbmluZ1RleHQubGVuZ3RoKCkgPiAwICYmIGorKyA8IG1heExpbmVzKSB7Ci0JCQlpZiAoKGkgPSBnZXRMaW5lV3JhcFBvc2l0aW9uKHJlbWFpbmluZ1RleHQudG9TdHJpbmcoKSwgZiwgaGVpZ2h0KSkgPT0gMCkKLQkJCQlicmVhazsKLQotCQkJaWYgKGFjY3VtbGF0ZWRUZXh0Lmxlbmd0aCgpID4gMCkKLQkJCQlhY2N1bWxhdGVkVGV4dC5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFjY3VtbGF0ZWRUZXh0LmFwcGVuZChyZW1haW5pbmdUZXh0LnN1YnN0cmluZygwLCBpKSk7Ci0JCQlyZW1haW5pbmdUZXh0LmRlbGV0ZSgwLCBpKTsKLQkJfQotCQlyZXR1cm4gYWNjdW1sYXRlZFRleHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNJY29uRXhpc3QoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgaW50IGdldExpbmVXcmFwUG9zaXRpb24oU3RyaW5nIHN0cmluZywgRm9udCBmLCBpbnQgd2lkdGgpIHsKLQkJQnJlYWtJdGVyYXRvciBpdGVyID0gQnJlYWtJdGVyYXRvci5nZXRMaW5lSW5zdGFuY2UoKTsKLQkJaXRlci5zZXRUZXh0KHN0cmluZyk7Ci0JCWludCBzdGFydCA9IGl0ZXIuZmlyc3QoKTsKLQkJaW50IGVuZCA9IGl0ZXIubmV4dCgpOwotCi0JCS8vIGlmIHRoZSBmaXJzdCBsaW5lIHNlZ21lbnQgZG9lcyBub3QgZml0IGluIHRoZSB3aWR0aCwKLQkJLy8gZGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiB3aXRoaW4gaXQgd2hlcmUgd2UgbmVlZCB0byBjdXQKLQkJaWYgKEZpZ3VyZVV0aWxpdGllcy5nZXRUZXh0RXh0ZW50cyhzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpLCBmKS53aWR0aCA+IHdpZHRoKSB7Ci0JCQlpdGVyID0gQnJlYWtJdGVyYXRvci5nZXRDaGFyYWN0ZXJJbnN0YW5jZSgpOwotCQkJaXRlci5zZXRUZXh0KHN0cmluZyk7Ci0JCQlzdGFydCA9IGl0ZXIuZmlyc3QoKTsKLQkJfQotCi0JCS8vIGtlZXAgaXRlcmF0aW5nIGFzIGxvbmcgYXMgd2lkdGggcGVybWl0cwotCQlkbwotCQkJZW5kID0gaXRlci5uZXh0KCk7Ci0JCXdoaWxlIChlbmQgIT0gQnJlYWtJdGVyYXRvci5ET05FCi0JCQkJJiYgRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKHN0cmluZy5zdWJzdHJpbmcoc3RhcnQsIGVuZCksCi0JCQkJCQlmKS53aWR0aCA8PSB3aWR0aCk7Ci0JCXJldHVybiAoZW5kID09IEJyZWFrSXRlcmF0b3IuRE9ORSkgPyBpdGVyLmxhc3QoKSA6IGl0ZXIucHJldmlvdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXJnZXN0IHN1YnN0cmluZyBvZiA8aT5zPC9pPiBpbiBGb250IDxpPmY8L2k+IHRoYXQgY2FuIGJlCi0JICogY29uZmluZWQgdG8gdGhlIG51bWJlciBvZiBwaXhlbHMgaW4gPGk+YXZhaWxhYmxlV2lkdGg8aT4uCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBzdHJpbmcKLQkgKiBAcGFyYW0gZgotCSAqICAgICAgICAgICAgdGhlIGZvbnQKLQkgKiBAcGFyYW0gYXZhaWxhYmxlV2lkdGgKLQkgKiAgICAgICAgICAgIHRoZSBhdmFpbGFibGUgd2lkdGgKLQkgKiBAcmV0dXJuIHRoZSBsYXJnZXN0IHN1YnN0cmluZyB0aGF0IGZpdHMgaW4gdGhlIGdpdmVuIHdpZHRoCi0JICogQHNpbmNlIDIuMCBDb3BpZWQgZnJvbSA8Y2xhc3M+RmlndXJlVXRpbGl0aWVzPGNsYXNzPiBDbGFzcywgdG8gYXZvaWQKLQkgKiAgICAgICAgY2FsbCBvZiBzdGF0aWMuCi0JICovCi0Jc3RhdGljIGludCBnZXRMYXJnZXN0U3Vic3RyaW5nQ29uZmluZWRUbyhTdHJpbmcgcywgRm9udCBmLAotCQkJaW50IGF2YWlsYWJsZVdpZHRoKSB7Ci0JCUZvbnRNZXRyaWNzIG1ldHJpY3MgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3MoZik7Ci0JCWludCBtaW4sIG1heDsKLQkJZmxvYXQgYXZnID0gbWV0cmljcy5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci0JCW1pbiA9IDA7Ci0JCW1heCA9IHMubGVuZ3RoKCkgKyAxOwotCi0JCS8vIFRoZSBzaXplIG9mIHRoZSBjdXJyZW50IGd1ZXNzCi0JCWludCBndWVzcyA9IDAsIGd1ZXNzU2l6ZSA9IDA7Ci0JCXdoaWxlICgobWF4IC0gbWluKSA+IDEpIHsKLQkJCS8vIFBpY2sgYSBuZXcgZ3Vlc3Mgc2l6ZQotCQkJLy8gTmV3IGd1ZXNzIGlzIHRoZSBsYXN0IGd1ZXNzIHBsdXMgdGhlIG1pc3Npbmcgd2lkdGggaW4gcGl4ZWxzCi0JCQkvLyBkaXZpZGVkIGJ5IHRoZSBhdmVyYWdlIGNoYXJhY3RlciBzaXplIGluIHBpeGVscwotCQkJZ3Vlc3MgPSBndWVzcyArIChpbnQpICgoYXZhaWxhYmxlV2lkdGggLSBndWVzc1NpemUpIC8gYXZnKTsKLQotCQkJaWYgKGd1ZXNzID49IG1heCkKLQkJCQlndWVzcyA9IG1heCAtIDE7Ci0JCQlpZiAoZ3Vlc3MgPD0gbWluKQotCQkJCWd1ZXNzID0gbWluICsgMTsKLQotCQkJLy8gTWVhc3VyZSB0aGUgY3VycmVudCBndWVzcwotCQkJZ3Vlc3NTaXplID0gRmlndXJlVXRpbGl0aWVzCi0JCQkJCS5nZXRUZXh0RXh0ZW50cyhzLnN1YnN0cmluZygwLCBndWVzcyksIGYpLndpZHRoOwotCi0JCQlpZiAoZ3Vlc3NTaXplIDwgYXZhaWxhYmxlV2lkdGgpCi0JCQkJLy8gV2UgZGlkIG5vdCB1c2UgdGhlIGF2YWlsYWJsZSB3aWR0aAotCQkJCW1pbiA9IGd1ZXNzOwotCQkJZWxzZQotCQkJCS8vIFdlIGV4Y2VlZGVkIHRoZSBhdmFpbGFibGUgd2lkdGgKLQkJCQltYXggPSBndWVzczsKLQkJfQotCQlyZXR1cm4gbWluOwotCX0KLQotCS8qKgotCSAqIFNldHMgdG8gd3JhcCB0ZXh0IGluIExhYmVsLgotCSAqIAotCSAqIEBwYXJhbSBiCi0JICogICAgICAgICAgICB0cnVlL2ZhbHNlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFdyYXAoYm9vbGVhbiBiKSB7Ci0JCWlmIChpc1RleHRXcmFwcGVkKCkgPT0gYikKLQkJCXJldHVybjsKLQkJc2V0RmxhZyhGTEFHX1dSQVAsIGIpOwotCQlyZXZhbGlkYXRlKCk7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRleHQgd3JhcC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1RleHRXcmFwcGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGV4dCB3cmFwIHdpZHRoLgotCSAqIAotCSAqIEBwYXJhbSBpCi0JICogICAgICAgICAgICBUaGUgbGFiZWwgdGV4dCB3cmFwIHdpZHRoCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFdyYXBXaWR0aChpbnQgaSkgewotCQlpZiAodGhpcy53cmFwV2lkdGggPT0gaSkKLQkJCXJldHVybjsKLQkJdGhpcy53cmFwV2lkdGggPSBpOwotCQlyZXZhbGlkYXRlKCk7Ci0JCXJlcGFpbnQoKTsKLQotCX0KLQotCS8qKgotCSAqIFRleHQgV3JhcCBBbGlnbm1lbnQsIHVzZSBvbmx5IGFmdGVyIHVzaW5nIDxtZXRob2Q+c2V0VGV4dFdyYXAoYm9vbGVhbik8L21ldGhvZD4KLQkgKiAKLQkgKiBAcGFyYW0gaQotCSAqICAgICAgICAgICAgVGhlIGxhYmVsIHRleHQgd3JhcHBpbmcgd2lkdGgKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0V3JhcEFsaWdubWVudChpbnQgaSkgewotCQlpZiAoZ2V0VGV4dFdyYXBBbGlnbm1lbnQoKSA9PSBpKQotCQkJcmV0dXJuOwotCi0JCXNldEFsaWdubWVudEZsYWdzKGksIEZMQUdfV1JBUF9BTElHTik7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRBbGlnbm1lbnRGbGFncwotCSAqIAotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIGFsaWduCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgZmxhZ09mZnNldAotCSAqIAotCSAqIC0tLSBUT0RPIC0gY29waWVkIG5lZWRzIHRvIG1vZGlmeQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRBbGlnbm1lbnRGbGFncyhpbnQgYWxpZ24sIGludCBmbGFnT2Zmc2V0KSB7Ci0JCWZsYWdzICY9IH4oMHg3ICogZmxhZ09mZnNldCk7Ci0JCXN3aXRjaCAoYWxpZ24pIHsKLQkJY2FzZSBDRU5URVI6Ci0JCQlmbGFncyB8PSAweDEgKiBmbGFnT2Zmc2V0OwotCQkJYnJlYWs7Ci0JCWNhc2UgVE9QOgotCQkJZmxhZ3MgfD0gMHgyICogZmxhZ09mZnNldDsKLQkJCWJyZWFrOwotCQljYXNlIExFRlQ6Ci0JCQlmbGFncyB8PSAweDMgKiBmbGFnT2Zmc2V0OwotCQkJYnJlYWs7Ci0JCWNhc2UgUklHSFQ6Ci0JCQlmbGFncyB8PSAweDQgKiBmbGFnT2Zmc2V0OwotCQkJYnJlYWs7Ci0JCWNhc2UgQk9UVE9NOgotCQkJZmxhZ3MgfD0gMHg1ICogZmxhZ09mZnNldDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHdyYXBWYWx1ZQotCSAqIEByZXR1cm4gUG9zaXRpb25Db25zdGFudCByZXByZXNlbnRpbmcgdGhlIGFsaWdubWVudAotCSAqLwotCXByaXZhdGUgaW50IGdldEFsaWdubWVudChpbnQgZmxhZ09mZnNldCkgewotCQlpbnQgd3JhcFZhbHVlID0gZmxhZ3MgJiAoMHg3ICogZmxhZ09mZnNldCk7Ci0JCWlmICh3cmFwVmFsdWUgPT0gMHgxICogZmxhZ09mZnNldCkKLQkJCXJldHVybiBDRU5URVI7Ci0JCWVsc2UgaWYgKHdyYXBWYWx1ZSA9PSAweDIgKiBmbGFnT2Zmc2V0KQotCQkJcmV0dXJuIFRPUDsKLQkJZWxzZSBpZiAod3JhcFZhbHVlID09IDB4MyAqIGZsYWdPZmZzZXQpCi0JCQlyZXR1cm4gTEVGVDsKLQkJZWxzZSBpZiAod3JhcFZhbHVlID09IDB4NCAqIGZsYWdPZmZzZXQpCi0JCQlyZXR1cm4gUklHSFQ7Ci0JCWVsc2UgaWYgKHdyYXBWYWx1ZSA9PSAweDUgKiBmbGFnT2Zmc2V0KQotCQkJcmV0dXJuIEJPVFRPTTsKLQotCQlyZXR1cm4gQ0VOVEVSOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGxhYmVsIHRleHQgd3JhcHBpbmcgd2lkdGgKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRXcmFwQWxpZ25tZW50KCkgewotCQlyZXR1cm4gZ2V0QWxpZ25tZW50KEZMQUdfV1JBUF9BTElHTik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgZm9jdXMgc3RhdGUgb2YgdGhpcyBsYWJlbAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgewotCQlyZXR1cm4gKGZsYWdzICYgRkxBR19IQVNGT0NVUykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgdGhpcyBsYWJlbAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBGTEFHX1NFTEVDVEVEKSAhPSAwOwotCX0KLQotCXByaXZhdGUgdm9pZCBncmFwaGljc2RyYXdUZXh0KEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCVN0cmluZyBzdWJTdHJpbmcgPSBnZXRTdWJTdHJpbmdUZXh0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN1YlN0cmluZywgIlxuIik7IC8vJE5PTi1OTFMtMSQKLQotCQlGb250IGYgPSBnZXRGb250KCk7Ci0JCWludCBmb250SGVpZ2h0ID0gRmlndXJlVXRpbGl0aWVzLmdldEZvbnRNZXRyaWNzKGYpLmdldEhlaWdodCgpOwotCQlpbnQgdGV4dFdpZHRoID0gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKHN1YlN0cmluZywgZikud2lkdGg7Ci0JCWludCB5ID0gZ2V0VGV4dExvY2F0aW9uKCkueTsKLQotCQkvLyBJZiB0aGUgZm9udCdzIGxlYWRpbmcgYXJlYSBpcyAwIHRoZW4gd2UgbmVlZCB0byBhZGQgYW4gb2Zmc2V0IHRvCi0JCS8vIGF2b2lkIHRydW5jYXRpbmcgYXQgdGhlIHRvcCAoZS5nLiBLb3JlYW4gZm9udHMpCi0JCWlmICgwID09IEZpZ3VyZVV0aWxpdGllcy5nZXRGb250TWV0cmljcyhmKS5nZXRMZWFkaW5nKCkpIHsKLQkJCWludCBvZmZzZXQgPSAyOyAvLyAyIGlzIHRoZSBsZWFkaW5nIGFyZWEgZm9yIGRlZmF1bHQgRW5nbGlzaAotCQkJeSArPSBvZmZzZXQ7Ci0JCX0KLQotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJUZXh0IGFkZGVkIHRvIGRyYXciICsgdG9rZW4pOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgdG9rZW5XaWR0aCA9IEZpZ3VyZVV0aWxpdGllcy5nZXRUZXh0RXh0ZW50cyh0b2tlbiwgZikud2lkdGg7Ci0JCQlpbnQgeCA9IGdldFRleHRMb2NhdGlvbigpLng7Ci0JCQlzd2l0Y2ggKGdldFRleHRXcmFwQWxpZ25tZW50KCkpIHsKLQkJCWNhc2UgQ0VOVEVSOgotCQkJCXggKz0gKHRleHRXaWR0aCAtIHRva2VuV2lkdGgpIC8gMjsKLQkJCQlicmVhazsKLQkJCWNhc2UgUklHSFQ6Ci0JCQkJeCArPSB0ZXh0V2lkdGggLSB0b2tlbldpZHRoOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZ3JhcGhpY3MuZHJhd1RleHQodG9rZW4sIHgsIHkpOwotCQkJeSArPSBmb250SGVpZ2h0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9jdXMgc3RhdGUgb2YgdGhpcyBsYWJlbAotCSAqIAotCSAqIEBwYXJhbSBiCi0JICogICAgICAgICAgICB0cnVlIHdpbGwgY2F1c2UgYSBmb2N1cyByZWN0YW5nbGUgdG8gYmUgZHJhd24gYXJvdW5kIHRoZSB0ZXh0Ci0JICogICAgICAgICAgICBvZiB0aGUgTGFiZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cyhib29sZWFuIGIpIHsKLQkJaWYgKGhhc0ZvY3VzKCkgPT0gYikKLQkJCXJldHVybjsKLQkJc2V0RmxhZyhGTEFHX0hBU0ZPQ1VTLCBiKTsKLQkJcmVwYWludCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNlbGVjdGlvbiBzdGF0ZSBvZiB0aGlzIGxhYmVsCi0JICogCi0JICogQHBhcmFtIGIKLQkgKiAgICAgICAgICAgIHRydWUgd2lsbCBjYXVzZSB0aGUgbGFiZWwgdG8gYXBwZWFyIHNlbGVjdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQoYm9vbGVhbiBiKSB7Ci0JCWlmIChpc1NlbGVjdGVkKCkgPT0gYikKLQkJCXJldHVybjsKLQkJc2V0RmxhZyhGTEFHX1NFTEVDVEVELCBiKTsKLQkJcmVwYWludCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM5MDhkZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGdyYXBoaWNhbCBmaWd1cmVzIGZvciB0aGUgYWN0aXZpdHkgZGlhZ3JhbXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0FuY2hvclV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9BbmNob3JVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiMTFkYmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0FuY2hvclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgYW5jaG9ycy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFuY2hvclV0aWwgewotCi0JcHVibGljIHN0YXRpYyBQb2ludCBnZXRDbG9zZXN0UG9pbnQoUG9pbnRbXSBwb2ludHMsIFBvaW50IHBvaW50KSB7Ci0JCWludCBzaXplID0gcG9pbnRzLmxlbmd0aDsKLQkJZG91YmxlW10gZGlzdGFuY2VzID0gbmV3IGRvdWJsZVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWRpc3RhbmNlc1tpXSA9IHBvaW50c1tpXS5nZXREaXN0YW5jZShwb2ludCk7Ci0JCX0KLQkJcmV0dXJuIHBvaW50c1ttaW4oZGlzdGFuY2VzKV07Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgbWluKGRvdWJsZVtdIG51bWJlcnMpIHsKLQkJaWYgKG51bWJlcnMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gLTE7Ci0JCWRvdWJsZSBtaW4gPSBudW1iZXJzWzBdOwotCQlpbnQgaWQgPSAwOwotCQlmb3IgKGludCBpID0gMTsgaSA8IG51bWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWRvdWJsZSBuID0gbnVtYmVyc1tpXTsKLQkJCWlmIChuIDwgbWluKSB7Ci0JCQkJbWluID0gbjsKLQkJCQlpZCA9IGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBudW1iZXJzCi0JICogQHJldHVybgotCSAqIAkJaW5kZXggb2YgdGhlIHNtYWxsZXN0IG51bWJlciBpbiB0aGUgZ2l2ZW4gYXJyYXkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBtaW4oaW50W10gbnVtYmVycykgewotCQlpZiAobnVtYmVycy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiAtMTsKLQkJaW50IG1pbiA9IG51bWJlcnNbMF07Ci0JCWludCBpZCA9IDA7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgbnVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJaW50IG4gPSBudW1iZXJzW2ldOwotCQkJaWYgKG4gPCBtaW4pIHsKLQkJCQltaW4gPSBuOwotCQkJCWlkID0gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaWQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9Db25uZWN0aW9uQW5jaG9yTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNjM0ZmY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9Db25uZWN0aW9uQW5jaG9yTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLQotLyoqCi0gKiBDb25zdHJhaW50IGZvciBwbGFjaW5nIGFuY2hvciBsb2NhdGlvbi4KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IgewotCi0JLyoqCi0JICogR2V0cyByZWxhdGl2ZSBsb2NhdGlvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gcmVmZXJlbmNlIHBvaW50Ci0JICogCi0JICogQHBhcmFtIHJlZmVyZW5jZQotCSAqIEByZXR1cm4gYWJzb2x1dGUgbG9jYXRpb24KLQkgKi8KLQlQb2ludCBnZXRMb2NhdGlvbihQb2ludCByZWZlcmVuY2UpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvRGlhZ3JhbUVkaXRvclV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9EaWFncmFtRWRpdG9yVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNGUyNTgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9EaWFncmFtRWRpdG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbW1hbmRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5WYXJ5QWN0aXZpdHlDb21tYW5kOwotCi0vKioKLSAqIFByb3ZpZGVzIGluc3RydWN0dXJlIHRvIGxpc3RlbnMgdG8gYWN0aW9ucyBsaWtlIExvY2FsQ29udHJpYnV0aW9uLCBMb2NhbCBSZXBsYWNlIAotICogaW4gV29ya0JyZWFrZG93biBTdHJ1Y3R1cmUuIExvYWRzIGF0IHRpbWUgb2YgcGx1Z2luIGxvYWQuICAKLSAqIEBzZWUgVmFyeUFjdGl2aXR5Q29tbWFuZAotICogIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERpYWdyYW1FZGl0b3JVdGlsIHsKLQotCQotCXByaXZhdGUgc3RhdGljIERpYWdyYW1FZGl0b3JVdGlsIGluc3RhbmNlID0gbnVsbDsKLQotCXByaXZhdGUgTGlzdCBjb21tYW5kTGlzdGVuZXJzOwotCi0JcHJpdmF0ZSBEaWFncmFtRWRpdG9yVXRpbCgpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERpYWdyYW1FZGl0b3JVdGlsIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChEaWFncmFtRWRpdG9yVXRpbC5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IERpYWdyYW1FZGl0b3JVdGlsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0JcHVibGljIExpc3QgZ2V0VmFyeUNvbW1hbmRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChjb21tYW5kTGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWNvbW1hbmRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQotCQljb21tYW5kTGlzdGVuZXJzLmFkZChuZXcgSUNvbW1hbmRMaXN0ZW5lcigpIHsKLQkJCQotCQkJcHVibGljIHZvaWQgbm90aWZ5RXhlY3V0ZWQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQkJLy8gZ2V0IGNvbnRyaWJ1dG9yL3JlcGxhY2VyIG9mIHRoZSBhY3Rpdml0eQotCQkJCS8vCi0JCQkJT2JqZWN0IHdyYXBwZXIgPSAoKFZhcnlBY3Rpdml0eUNvbW1hbmQpY29tbWFuZCkuZ2V0V3JhcHBlcigpOwotCQkJCVVJSGVscGVyLmNsb3NlRGlhZ3JhbUVkaXRvcnMod3JhcHBlciwgbmV3IEFycmF5TGlzdCgpKTsKLQkJCQlVSUhlbHBlci5yZWZyZXNoT3BlbkRpYWdyYW1FZGl0b3JzT2ZQYXJlbnQod3JhcHBlciwgbmV3IEFycmF5TGlzdCgpKTsKLQkJCX0KLQotCQkJcHVibGljIENsYXNzIGdldENvbW1hbmRUeXBlKCkgewotCQkJCXJldHVybiBWYXJ5QWN0aXZpdHlDb21tYW5kLmNsYXNzOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwcmVVbmRvKENvbW1hbmQgY29tbWFuZCkgewotCQkJCS8vIGdldCBvbGQgY29udHJpYnV0b3IvcmVwbGFjZXIgb2YgdGhlIGFjdGl2aXR5Ci0JCQkJLy8KLQkJCQlDb2xsZWN0aW9uIGxpc3QgPSAoKFZhcnlBY3Rpdml0eUNvbW1hbmQpY29tbWFuZCkuZ2V0UmVzdWx0KCk7Ci0JCQkJCi0JCQkJTGlzdCBsaXN0eCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkJCQlPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlVSUhlbHBlci5jbG9zZURpYWdyYW1FZGl0b3JzKG9iamVjdCwgbGlzdHgpOwotCQkJCQlVSUhlbHBlci5yZWZyZXNoT3BlbkRpYWdyYW1FZGl0b3JzT2ZQYXJlbnQob2JqZWN0LCBsaXN0eCk7Ci0JCQkJCWxpc3R4LmNsZWFyKCk7Ci0JCQl9Ci0JCQkJCi0JCX0KLQotCQkJcHVibGljIHZvaWQgcHJlRXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGNvbW1hbmRMaXN0ZW5lcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9EaWFncmFtVUlSZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9EaWFncmFtVUlSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjNkZjkzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvRGlhZ3JhbVVJUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFJlc291cmNlIENsYXNzIGZvciB0aGUgQXV0aG9yaW5nIERpYWdyYW0gKEdFRikgcGFja2FnZXMuCi0gKiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERpYWdyYW1VSVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGlhZ3JhbVVJUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmV2aW91c19uYW1lX251bGwxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycl9uYW1lX2VtcHR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmVBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1NlbGVjdF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fQWRkTm9kZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fQWRkTm9kZV9lcnJfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9MaW5rX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0xpbmtfc2VsZWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9MaW5rX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9wcmVmaXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdHZpdGl2aXR5RGlhZ3JhbV9EZWxpdmVyeVByb2Nlc3NfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3R2aXRpdml0eURpYWdyYW1fQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3R2aXRpdml0eURpYWdyYW1fUGhhc2VfdGV4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3R2aXRpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcnJlZnJlc2hmcm9tYmFzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fQmVuZFBvaW50X2NyZWF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZnJlc2hBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmcmVzaEZyb21CYXNlQ21kX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWdyYW1fc2F2ZUVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZURpYWdyYW1fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVEaWFncmFtX3Byb21wdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhbGlnbl9iZW5kX3BvaW50X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkVkaXRvcklucHV0X2NvbmZpZ2VkaXRvcjA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhZ3JhbV9ub2RlX3Byb3BlcnR5X3ZhbHVlX3Byb2JsZW1fbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbW1hbmRfY2Fubm90RWRpdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RleHQ7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBEaWFncmFtVUlSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGtleSBhbmQgZm9ybWF0dGVkCi0JICogd2l0aCBhIGdpdmVuIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgQW4gb2JqZWN0LgotCSAqIEByZXR1cm4gQSBmb3JtYXR0ZWQgbG9jYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBrZXksIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiBOTFMuYmluZChrZXksIG5ldyBPYmplY3RbXSB7IGRhdGEgfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWNhY2YxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1wcmV2aW91c19uYW1lX251bGwxPVVuZG8gbmFtZSBjaGFuZ2UgaXMgbm90IGFsbG93ZWQgaWYgcHJldmlvdXMgbmFtZSBpcyBudWxsLgotZXJyX25hbWVfZW1wdHk9VGhlIG5hbWUgY2Fubm90IGJlIGVtcHR5LiBQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIG5hbWUuCi1tb3ZlQWN0aW9uX2xhYmVsPU1vdmUKLQotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90ZXh0PVNlbGVjdAotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90b29sdGlwPVNlbGVjdCBub2RlIG9yIGxpbmsKLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX3RpdGxlPUFkZCBOb2RlCi1BYnN0cmFjdERpYWdyYW1fQWRkTm9kZV9lcnJfbXNnPUlYUkQwMDAyVzogQWRkaW5nIGEgbm9kZSB0byBkaWFncmFtIGZhaWxlZAotQWJzdHJhY3REaWFncmFtX0xpbmtfdGV4dD1MaW5rCi1BYnN0cmFjdERpYWdyYW1fTGlua19zZWxlY3Q9U2VsZWN0IExpbmsKLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3Rvb2x0aXA9Q3JlYXRlIG5ldyBsaW5rCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3RleHQ9U3RhcnQgTm9kZQotQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90b29sdGlwPUNyZWF0ZSBuZXcgc3RhcnQgbm9kZQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQ9RnJlZSBUZXh0Ci1BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcD1DcmVhdGUgbmV3IGZyZWUgdGV4dAotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdGV4dD1TeW5jaHJvbml6YXRpb24gQmFyCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90b29sdGlwPUNyZWF0ZSBuZXcgc3luY2hyb25pemF0aW9uIGJhcgotQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0PURlY2lzaW9uIE5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdG9vbHRpcD1DcmVhdGUgbmV3IGRlY2lzaW9uIG5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3RleHQ9RW5kIE5vZGUKLUFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9wcmVmaXg9QWN0aXZpdHkgRGV0YWlsOgotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcD1DcmVhdGUgbmV3IGVuZCBub2RlCi1BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1BY3Rpdml0eQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXA9Q3JlYXRlIG5ldyBhY3Rpdml0eQotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0PUl0ZXJhdGlvbgotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90b29sdGlwPUNyZWF0ZSBuZXcgaXRlcmF0aW9uCi1BY3Rpdml0eURpYWdyYW1fUGhhc2VfdGV4dD1QaGFzZQotQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXA9Q3JlYXRlIG5ldyBwaGFzZQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQ9VGFzayBEZXNjcmlwdG9yCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdGV4dD1Sb2xlIERlc2NyaXB0b3IKLVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4PVdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW06Ci1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdG9vbHRpcD1DcmVhdGUgbmV3IHJvbGUgZGVzY3JpcHRvcgotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3Rvb2x0aXA9Q3JlYXRlIG5ldyB0YXNrIGRlc2NyaXB0b3IKLUFjdHZpdGl2aXR5RGlhZ3JhbV9EZWxpdmVyeVByb2Nlc3NfdGV4dD1EZWxpdmVyeSBQcm9jZXNzCi1BY3R2aXRpdml0eURpYWdyYW1fQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1DYXBhYmlsaXR5IFBhdHRlcm4KLUFjdHZpdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXg9UGhhc2UKLUFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1JdGVyYXRpb24KLUFjdHZpdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0PUFjdGl2aXR5Ci1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9V29yayBQcm9kdWN0IERlc2NyaXB0b3IKLUFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcD1DcmVhdGUgbmV3IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yCi0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1BbGlnbgotQWJzdHJhY3REaWFncmFtRWRpdG9yX3JlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQ9UmVmcmVzaCBmcm9tIEJhc2UgQWN0aXZpdHkKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dD1Gb3JtYXQgVGV4dCBCb3guLi4KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9SG9yaXpvbnRhbGx5IHRvIEF2ZXJhZ2UKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9SG9yaXpvbnRhbGx5IHRvIEZpcnN0IFNlbGVjdGVkCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVZlcnRpY2FsbHkgdG8gQXZlcmFnZQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1WZXJ0aWNhbGx5IHRvIEZpcnN0IFNlbGVjdGVkCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PVNhdmUKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9U2F2aW5nIHswfQotQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsPU1vdmUgTm9kZQotQWJzdHJhY3REaWFncmFtRWRpdG9ycmVmcmVzaGZyb21iYXNlPVJlZnJlc2ggRnJvbSBCYXNlCi1BYnN0cmFjdERpYWdyYW1fQmVuZFBvaW50X2NyZWF0ZT1DcmVhdGUgQmVuZHBvaW50Ci0KLUFjdGl2aXR5RGlhZ3JhbV9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9T3BlbiBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbQotcmVmcmVzaEFjdGlvbl9sYWJlbD1SZWZyZXNoCi1yZWZyZXNoRnJvbUJhc2VDbWRfbGFiZWw9UmVmcmVzaCBGcm9tIEJhc2UKLWRpYWdyYW1fc2F2ZUVycm9yPUlVUEQwMDAxVzogU2F2aW5nIGRpYWdyYW0gZmFpbGVkCi0KLURlbGV0ZURpYWdyYW1fdGV4dD1EZWxldGUgRGlhZ3JhbQotRGVsZXRlRGlhZ3JhbV9wcm9tcHQ9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNsb3NlIGFuZCBkZWxldGUgdGhpcyBkaWFncmFtP1xuVGhpcyBjaGFuZ2UgaXMgcGVybWFuZW50IGFuZCBjYW5ub3QgYmUgdW5kb25lLgotYWxpZ25fYmVuZF9wb2ludF90ZXh0PUFsaWduIEJlbmQgUG9pbnQKLUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dF9jb25maWdlZGl0b3IwPUNvbmZpZ3VyYXRpb24gRWRpdG9yCi1kaWFncmFtX25vZGVfcHJvcGVydHlfdmFsdWVfcHJvYmxlbV9tc2c9RXJyb3IgaW4gdGhlIG5vZGUncyBwcm9wZXJ0eSB2YWx1ZS4KLWRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA9RXJyb3IKLQotQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0PVJlc2V0IERpYWdyYW0gTGF5b3V0Ci1lcnJvckRpYWxvZ190aXRsZT1FcnJvcgotY29tbWFuZF9jYW5ub3RFZGl0PUlVUEQwMDAzRTogQ2Fubm90IGVkaXQgZGlhZ3JhbQotCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGl0bGU9UGFyZW50IEVkaXRvciBDbG9zZWQKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90ZXh0PXswfSBoYXMgY2xvc2VkLiBXb3VsZCB5b3UgYWxzbyBsaWtlIHRvIGNsb3NlIHsxfT8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9UZW1wbGF0ZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1RlbXBsYXRlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5NmRiOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1RlbXBsYXRlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotCi0vKioKLSAqIENvbnN0YW50cyB1c2VkIGluIGF1dGhvcmluZyBkaWFncmFtCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGVtcGxhdGVDb25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZJVFkgPSAiYWN0aXZpdHkgdGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVEVSQVRJT04gPSAiaXRlcmF0aW9uIHRlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhBU0UgPSAicGhhc2UgdGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DSF9CQVIgPSAic3luY2hvbml6YXRpb24gYmFyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDSVNJT05fTk9ERSA9ICJkZWNpc2lvbiBub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfTk9ERSA9ICJzdGFydCBub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX05PREUgPSAiZW5kIG5vZGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX1BST0RVQ1QgPSAid29yayBwcm9kdWN0IHRlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9ERVNDUklQVE9SID0gInJvbGUgZGVzY3JpcHRvciB0ZW1wbGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfREVTQ1JJUFRPUiA9ICJ0YXNrIGRlc2NyaXB0b3IgdGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUiA9ICJ3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0ZW1wbGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSRUVfVEVYVCA9ICJmcmVlIHRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUT0RPOiBtb3ZlIHRoZXNlIGNvbnN0YW50cyB0byBvdGhlciBmaWxlLiBUaGlzIGNsYXNzIGRlZmluZSBvbmx5IHRlbXBsYXRlCi0JLy8gY29uc3RhbnRzCi0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9GT05UX05BTUUgPSAicHJvcGVydHlfZm9udF9uYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRk9OVF9TVFlMRSA9ICJwcm9wZXJ0eV9mb250X3N0eWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRk9OVF9IRUlHSFQgPSAicHJvcGVydHlfZm9udF9oZWlnaHQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9GT05UX1JFRCA9ICJwcm9wZXJ0eV9mb250X3JlZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0ZPTlRfQkxVRSA9ICJwcm9wZXJ0eV9mb250X2JsdWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9GT05UX0dSRUVOID0gInByb3BlcnR5X2ZvbnRfZ3JlZW4iOyAvLyROT04tTkxTLTEkCi0KLQkvLyBGb3IgZGVmYXVsdCBmb250cy4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ZPTlRfTkFNRSA9IGdldEZvbnROYW1lKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0ZPTlRfU0laRSA9IDg7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvbnQgREVGQVVMVF9GT05UID0gbmV3IEZvbnQobnVsbCwgREVGQVVMVF9GT05UX05BTUUsCi0JCQlERUZBVUxUX0ZPTlRfU0laRSwgamF2YS5hd3QuRm9udC5QTEFJTik7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvbnQgREVGQVVMVF9GT05UX0lUQUxJQyA9IG5ldyBGb250KG51bGwsCi0JCQlERUZBVUxUX0ZPTlRfTkFNRSwgREVGQVVMVF9GT05UX1NJWkUsIGphdmEuYXd0LkZvbnQuSVRBTElDKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTl8ySyA9ICJXaW5kb3dzIDIwMDAiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRGb250TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSAiQXJpYWwiOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ29ycnVwdGVkIEphcGFuZXNlIGNoYXJhY3RlcnMgaW4gQWN0aXZpdHkgRGlhZ3JhbXMKLQkJU3RyaW5nIGN1cnJlbnRMb2NhbGUgPSBQbGF0Zm9ybS5nZXROTCgpOwotCQlpZiAoY3VycmVudExvY2FsZSAhPSBudWxsCi0JCQkJJiYgY3VycmVudExvY2FsZS5zdGFydHNXaXRoKExvY2FsZS5KQVBBTkVTRS5nZXRMYW5ndWFnZSgpKSkgewotCQkJaWYgKFdJTl8ySy5lcXVhbHNJZ25vcmVDYXNlKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJbmFtZSA9IExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1Gb250X25hbWVfd2luMzI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9ST0xFX1RBU0tTX0JPWF9CR19DT0xPUl9SR0IgPSAiQUREX1JPTEVfVEFTS1NfQk9YX0JHX0NPTE9SX1JHQiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX1dQX0JPWF9CR19DT0xPUl9SR0IgPSAiQUREX1dQX0JPWF9CR19DT0xPUl9SR0IiOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1ZhbGlkYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9WYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmMjk4ZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1ZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogVmFsaWRhdGluZyByb3V0aW5lcyBmb3IgZGlhZ3JhbSBlZGl0aW5nCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGVyck1zZ19DYW5Ob3RDb25uZWN0ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9jb25uZWN0X3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBlcnJNc2dfU2FtZVByZWRBbmRTdWNjID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGlhZ3JhbVZhbGlkYXRpb25fZXJyX3NhbWVwcmVkYW5kc3VjX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBlcnJNc2dfQ2FuTm90RGVsZXRlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9kZWxldGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHVzZXIgY2FuIGNvbm5lY3QgdGhlIGdpdmVuIG5vZGVzLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHJldHVybiBudWxsIGlmIGNvbm5lY3Rpb24gaXMgYWxsb3dlZCwgZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tDb25uZWN0KE5vZGUgc291cmNlLCBOb2RlIHRhcmdldCkgewotCQlpZiAoc291cmNlLmdldERpYWdyYW0oKSAhPSB0YXJnZXQuZ2V0RGlhZ3JhbSgpKQotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0OwotCi0JCWlmIChzb3VyY2UuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgQWN0aXZpdHlEaWFncmFtKSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChzb3VyY2UuZ2V0RGlhZ3JhbSgpCi0JCQkJCS5nZXRPYmplY3QoKSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCU9iamVjdCBwcm9jID0gbnVsbDsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcHJvYyA9ICgoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5nZXRUb3BJdGVtKCk7Ci0JCQl9Ci0JCQkvLyBnZXQgYWxsIGJyZWFrZG93biBlbGVtZW50cyBpbiB0aGlzIHByb2Nlc3MKLQkJCS8vCi0JCQlMaXN0IGFsbEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQlwcm9jKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCWFsbEVsZW1lbnRzLmFkZChUbmdVdGlsLnVud3JhcChvYmopKTsKLQkJCX0KLQkJCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCQkvLyBJZiB0YXJnZXQgaXMgUmVhZE9ubHkgKG1lYW5zIGV4dGVuZHMpIGFuZCBhbGxvdyB0aGUgbGluayBpZgotCQkJCS8vIGl0cyBwYXJlbnQgYWN0aXZpdHkgaXMgYSBDb250cmlidXRvcgotCQkJCQotCQkJCWlmICh0YXJnZXQuZ2V0RGlhZ3JhbSgpLmlzUmVhZE9ubHkoKSkKLQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCWlmIChzb3VyY2UuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQlpZiAodGFyZ2V0LmdldE9iamVjdCgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCWlmIChQcm9jZXNzVXRpbC5jaGVja0NpcmN1bGFyKAotCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHRhcmdldC5nZXRPYmplY3QoKSwKLQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBzb3VyY2UuZ2V0T2JqZWN0KCksCi0JCQkJCQkJCWFsbEVsZW1lbnRzKSkgewotCQkJCQkJCXJldHVybiBlcnJNc2dfU2FtZVByZWRBbmRTdWNjOwotCQkJCQkJfQotCQkJCQkJaWYodGFyZ2V0LmlzUmVhZE9ubHkoKSkKLQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJCQkvLyBzaG91bGQgbm90IGFsbG93IGluY29taW5nIGNvbm5lY3Rpb24gdG8gc3RhcnQgbm9kZQotCQkJCQkJLy8gYW5kIEZyZWVUZXh0LgotCQkJCQkJaWYgKCgoVHlwZWROb2RlKSB0YXJnZXQpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1RBUlQKLQkJCQkJCQkJfHwgKChUeXBlZE5vZGUpIHRhcmdldCkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5GUkVFX1RFWFQpIHsKLQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCQl9Ci0KLQkJCQkJCUNvbGxlY3Rpb24gdGFyZ2V0Tm9kZXMgPSBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJCS5nZXRUYXJnZXROb2RlcygoVHlwZWROb2RlKSB0YXJnZXQsCi0JCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHNvdXJjZQotCQkJCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXROb2Rlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJTm9kZSBub2RlID0gKChOb2RlKSBpdGVyLm5leHQoKSk7Ci0JCQkJCQkJaWYgKG5vZGUuaXNSZWFkT25seSgpKQotCQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQ2lyY3VsYXIoCi0JCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUuZ2V0T2JqZWN0KCksCi0JCQkJCQkJCQlwcmVkLCBhbGxFbGVtZW50cykpIHsKLQkJCQkJCQkJcmV0dXJuIGVyck1zZ19TYW1lUHJlZEFuZFN1Y2M7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQkJaWYgKHRhcmdldCA9PSBzb3VyY2UpIHsKLQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJfQotCQkJCQkvLyBzaG91bGQgbm90IGFsbG93IG91dGdvaW5nIGNvbm5lY3Rpb24gZnJvbSBFbmQgTm9kZSBhbmQKLQkJCQkJLy8gRnJlZSBUZXh0Ci0JCQkJCWlmICgoKFR5cGVkTm9kZSkgc291cmNlKS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkVORAotCQkJCQkJCXx8ICgoVHlwZWROb2RlKSBzb3VyY2UpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKSB7Ci0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCX0KLQotCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0KLQkJCQkJCS8qCi0JCQkJCQkgKiBJZiBzb3VyY2UgYW5kIHRhcmdldCBhcmUgVHlwZWROb2RlcywgYXZvaWQgY2lyY3VsYXIKLQkJCQkJCSAqIGxvb3AgY29ubmVjdGlvbi4KLQkJCQkJCSAqLwotCQkJCQkJaWYgKGNoZWNrU3luY0JhckNpcmN1bGFyTG9vb3AoKFR5cGVkTm9kZSkgc291cmNlLAotCQkJCQkJCQkoVHlwZWROb2RlKSB0YXJnZXQpICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIHNob3VsZCBub3QgYWxsb3cgaW5jb21pbmcgY29ubmVjdGlvbiB0byBzdGFydCBub2RlCi0JCQkJCQkvLyBhbmQgRnJlZVRleHQuCi0JCQkJCQlpZiAoKChUeXBlZE5vZGUpIHRhcmdldCkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TVEFSVAotCQkJCQkJCQl8fCAoKFR5cGVkTm9kZSkgdGFyZ2V0KS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkZSRUVfVEVYVCkgewotCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJCX0KLQotCQkJCQkJQ29sbGVjdGlvbiBzcmNOb2RlcyA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkJLmdldFNvdXJjZU5vZGVzKChUeXBlZE5vZGUpIHNvdXJjZSwKLQkJCQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCQkJCQkJaWYgKCFzcmNOb2Rlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlDb2xsZWN0aW9uIHRhcmdldE5vZGVzID0gR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCQkJLmdldFRhcmdldE5vZGVzKChUeXBlZE5vZGUpIHRhcmdldCwKLQkJCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXROb2Rlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlOb2RlIG5vZGUgPSAoKE5vZGUpIGl0ZXIubmV4dCgpKTsKLQkJCQkJCQkJaWYgKG5vZGUuaXNSZWFkT25seSgpKQotCQkJCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlCi0JCQkJCQkJCQkJLmdldE9iamVjdCgpOwotCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3JjTm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgKChOb2RlKSBpdGVyYXRvcgotCQkJCQkJCQkJCQkubmV4dCgpKS5nZXRPYmplY3QoKTsKLQkJCQkJCQkJCWlmIChQcm9jZXNzVXRpbC5jaGVja0NpcmN1bGFyKHN1Y2MsIHByZWQsCi0JCQkJCQkJCQkJCWFsbEVsZW1lbnRzKSkgewotCQkJCQkJCQkJCXJldHVybiBlcnJNc2dfU2FtZVByZWRBbmRTdWNjOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJCQkJCi0JCQkJCQlpZih0YXJnZXQuaXNSZWFkT25seSgpKSByZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCQkKLQkJCQkJCUNvbGxlY3Rpb24gc3JjTm9kZXMgPSBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJCS5nZXRTb3VyY2VOb2RlcygoVHlwZWROb2RlKSBzb3VyY2UsCi0JCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHN1Y2MgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpICgoTm9kZSkgdGFyZ2V0KQotCQkJCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3JjTm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSAoKE5vZGUpIGl0ZXJhdG9yCi0JCQkJCQkJCQkubmV4dCgpKS5nZXRPYmplY3QoKTsKLQkJCQkJCQlpZiAoUHJvY2Vzc1V0aWwuY2hlY2tDaXJjdWxhcihzdWNjLCBwcmVkLAotCQkJCQkJCQkJYWxsRWxlbWVudHMpKSB7Ci0JCQkJCQkJCXJldHVybiBlcnJNc2dfU2FtZVByZWRBbmRTdWNjOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKHNvdXJjZS5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJCWlmIChzb3VyY2UuaXNSZWFkT25seSgpIHx8IHRhcmdldC5pc1JlYWRPbmx5KCkpIHsKLQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQl9Ci0KLQkJCWlmICgoc291cmNlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IgfHwgdGFyZ2V0Ci0JCQkJCS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKQotCQkJCQl8fCAoc291cmNlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IgJiYgdGFyZ2V0Ci0JCQkJCQkJLmdldE9iamVjdCgpIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpCi0JCQkJCXx8IChzb3VyY2UuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IgJiYgdGFyZ2V0Ci0JCQkJCQkJLmdldE9iamVjdCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSkgewotCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gY2hlY2sgZm9yIGR1cGxpY2F0ZSBjb25uZWN0aW9uCi0JCQkJLy8KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2UuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgPT0gdGFyZ2V0KSB7Ci0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfSBlbHNlIGlmIChzb3VyY2UuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSkgewotCQkJaWYgKHNvdXJjZS5pc1JlYWRPbmx5KCkgfHwgdGFyZ2V0LmlzUmVhZE9ubHkoKSkgewotCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrRGVsZXRlKExpbmsgbGluaykgewotCQkKLS8vCQlpZiAobGluay5nZXRUYXJnZXQoKSAhPSBudWxsCi0vLwkJCQkmJiBsaW5rLmdldFRhcmdldCgpLmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGlhZ3JhbSkgewotLy8JCQlpZiAobGluay5nZXRUYXJnZXQoKS5pc1JlYWRPbmx5KCkpewotLy8JCQkJaWYobGluay5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSl7Ci0vLwkJCQkJaWYoKChUeXBlZE5vZGUpbGluay5nZXRTb3VyY2UoKSkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5ERUNJU0lPTil7Ci0vLwkJCQkJCXJldHVybiBudWxsOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotLy8JCQl9Ci0vLwkJCWlmIChsaW5rLmdldFRhcmdldCgpIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0vLwkJCQkKLS8vCQkJCVR5cGVkTm9kZSB0eXBlZG5vZGUgPSAoVHlwZWROb2RlKWxpbmsuZ2V0VGFyZ2V0KCk7Ci0vLwkJCQlpZih0eXBlZG5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5ERUNJU0lPTil7Ci0vLwkJCQkJcmV0dXJuIG51bGw7Ci0vLwkJCQl9Ci0vLwkJCQlpZihsaW5rLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgVHlwZWROb2RlKXsKLS8vCQkJCQl0eXBlZG5vZGUgPSAoVHlwZWROb2RlKWxpbmsuZ2V0U291cmNlKCk7Ci0vLwkJCQkJaWYodHlwZWRub2RlLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuREVDSVNJT04pewotLy8JCQkJCQlyZXR1cm4gbnVsbDsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCQkKLS8vCQkJCWlmIChsaW5rLmdldFNvdXJjZSgpLmlzUmVhZE9ubHkoKSkKLS8vCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLS8vCQkJCQotLy8JCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudAotLy8JCQkJCQl8fCAobGluay5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSAmJiAhR3JhcGhpY2FsRGF0YUhlbHBlcgotLy8JCQkJCQkJCS5nZXRTb3VyY2VOb2RlcygoVHlwZWROb2RlKSBsaW5rLmdldFNvdXJjZSgpLAotLy8JCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKQotLy8JCQkJCQkJCS5pc0VtcHR5KCkpKSB7Ci0vLwkJCQkJCi0vLwkJCQkJQ29sbGVjdGlvbiB0YXJnZXROb2RlcyA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0VGFyZ2V0Tm9kZXMoKFR5cGVkTm9kZSkgbGluay5nZXRUYXJnZXQoKSwKLS8vCQkJCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotLy8JCQkJCQlpZiAobm9kZS5pc1JlYWRPbmx5KCkpIHsKLS8vCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8KLS8vCQkJfQotLy8JCQlpZiAobGluay5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotLy8JCQkJVHlwZWROb2RlIHR5cGVkbm9kZSA9IChUeXBlZE5vZGUpbGluay5nZXRTb3VyY2UoKTsKLS8vCQkJCWlmKHR5cGVkbm9kZS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkRFQ0lTSU9OKXsKLS8vCQkJCQlyZXR1cm4gbnVsbDsKLS8vCQkJCX0KLS8vCQkJCWlmIChsaW5rLmdldFRhcmdldCgpLmlzUmVhZE9ubHkoKSkKLS8vCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLS8vCQkJfQotLy8JCX0gZWxzZSBpZiAoKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCAmJiBsaW5rLmdldFRhcmdldCgpLmlzUmVhZE9ubHkoKSkKLS8vCQkJCXx8IChsaW5rLmdldFNvdXJjZSgpICE9IG51bGwgJiYgbGluay5nZXRTb3VyY2UoKS5pc1JlYWRPbmx5KCkpKSB7Ci0vLwkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotLy8JCX0KLQkJLy9yZXR1cm4gbnVsbDsKLQkJCi0JCQotCQlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCU5vZGUgdGFyZ2V0ID0gbGluay5nZXRUYXJnZXQoKTsKLQkJCi0JCS8vIFNwZWNpYWwgaGFuZGxlIGZvciBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBsaW5rcyBjYW5ub3QgYmUgZGVsZXRlZC4KLQkJaWYgKHRhcmdldCAhPSBudWxsCi0JCQkJJiYgdGFyZ2V0LmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCX0KLQkJCi0JCQotCQlpZiAodGFyZ2V0ICE9IG51bGwKLQkJCQkmJiB0YXJnZXQuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgQWN0aXZpdHlEaWFncmFtKSB7Ci0JCQkKLQkJCS8vIFRhcmdldCA9IGJyZWFrZG93bmVsZW1lbnQKLQkJCWlmKHRhcmdldCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSl7Ci0JCQkJLy8gU291cmNlID0gQnJlYWtkb3duIGVsZW1lbnQKLQkJCQlpZihzb3VyY2UgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpewotCQkJCQlpZihsaW5rLmdldFRhcmdldCgpLmlzUmVhZE9ubHkoKSkKLQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJLy8gU291cmNlID0gVHlwZWROb2RlCi0JCQkJaWYoc291cmNlIGluc3RhbmNlb2YgVHlwZWROb2RlKXsKLQkJCQkJLy8gU291cmNlID0gRGVjaXNpb24gTm9kZQotCQkJCQlUeXBlZE5vZGUgc291cmNlTm9kZSA9IChUeXBlZE5vZGUpc291cmNlOwotCQkJCQlpZighdGFyZ2V0LmlzUmVhZE9ubHkoKSl7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCQllbHNlIGlmKHNvdXJjZU5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5ERUNJU0lPTil7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCQllbHNlIGlmKHNvdXJjZU5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TWU5DSF9CQVIpewotCQkJCQkJcmV0dXJuIGNoZWNrU3luY0JhckluY29taW5nTGlua3Moc291cmNlTm9kZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihzb3VyY2VOb2RlLmlzUmVhZE9ubHkoKSl7Ci0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0vLyBUYXJnZXQgaXMgVHlwZWROb2RlCi0JCQllbHNlIGlmKHRhcmdldCBpbnN0YW5jZW9mIFR5cGVkTm9kZSl7Ci0JCQkJCi0JCQkJVHlwZWROb2RlIHR5cGVkTm9kZSA9IChUeXBlZE5vZGUpdGFyZ2V0OwotCQkJCS8vIGlmIFRhcmdldCBpcyBUeXBlZE5vZGUgYW5kIGl0cyBhIERlY2lzaW9uUG9pbnQgLSBzaG91bGQgYmUgYmxhY2suCi0JCQkJaWYodHlwZWROb2RlLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuREVDSVNJT04pewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJLy8gSWYgVGFyZ2V0IGlzIFR5cGVkTm9kZSBhbmQgYW5kIFNvdXJjZSBpcyBXb3JrQnJlYWtkb3duRWxlbWVudCBhbmQgcmVhZG9ubHkKLQkJCQkvLyBMaW5rIHNob3VsZCBiZSBncmVlbi4gCi0JCQkJaWYoc291cmNlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKXsKLQkJCQkJLy8gQ2hlY2sgVGFyZ2V0IC0gaXMgaGF2aW5nIGFueSBpbmRpcmVjdChvdXRnb2luZyBjb25ubmVjdGlvbikgY29udGFpbnMgZGVjaXNpb24gcG9pbnRzLgotCQkJCQlpZihjaGVja1N5bmNCYXJPdXRnb2luZ0xpbmtzKChUeXBlZE5vZGUpdGFyZ2V0KSA9PSBudWxsKQotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCWlmKHNvdXJjZS5pc1JlYWRPbmx5KCkpCi0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCQl9Ci0JCQkJaWYoc291cmNlIGluc3RhbmNlb2YgVHlwZWROb2RlKXsKLQkJCQkJVHlwZWROb2RlIHNvdXJjZVR5cGVkTm9kZSA9IChUeXBlZE5vZGUpc291cmNlOwotCQkJCQkvLyBTb3VyY2UgaXMgVHlwZWQgTm9kZSBhbmQgaXRzIGEgZGVjaXNpb24gcG9pbnQgcmV0dXJuIG51bGwuIAotCQkJCQlpZihzb3VyY2VUeXBlZE5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5ERUNJU0lPTil7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCQkvLyBpZiBzb3VyY2UgaXMgU3luY0JhciBhbmQgY2hlY2sgYWxsIGl0cyBpbmNvbWluZyBjb25uZWN0aW9ucy4gCi0JCQkJCWlmKHNvdXJjZVR5cGVkTm9kZS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNZTkNIX0JBUil7Ci0JCQkJCQlyZXR1cm4gY2hlY2tTeW5jQmFySW5jb21pbmdMaW5rcyhzb3VyY2VUeXBlZE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrRGVsZXRlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZS5pc1JlYWRPbmx5KCkpCi0JCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJRGlhZ3JhbSBkaWFncmFtID0gbm9kZS5nZXREaWFncmFtKCk7Ci0JCWlmIChkaWFncmFtIGluc3RhbmNlb2YgQWN0aXZpdHlEaWFncmFtKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCUNvbGxlY3Rpb24gdGFyZ2V0Tm9kZXMgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFRhcmdldE5vZGVzKAotCQkJCQkJKFR5cGVkTm9kZSkgbm9kZSwgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTm9kZSB0YXJnZXQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmICh0YXJnZXQuaXNSZWFkT25seSgpKSB7Ci0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChkaWFncmFtIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFJvbGVOb2RlKSB7Ci0JCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tSZWNvbm5lY3QoTm9kZSBzb3VyY2UsIE5vZGUgdGFyZ2V0LCBMaW5rIGxpbmspIHsKLQkJaWYgKHNvdXJjZS5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURpYWdyYW0pIHsKLQkJCWlmIChsaW5rLmdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJCQlpZiAobGluay5nZXRUYXJnZXQoKS5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChsaW5rLmdldFRhcmdldCgpIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJCQlDb2xsZWN0aW9uIHRhcmdldE5vZGVzID0gR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCQkuZ2V0VGFyZ2V0Tm9kZXMoKFR5cGVkTm9kZSkgbGluay5nZXRUYXJnZXQoKSwKLQkJCQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFyZ2V0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZiAobm9kZS5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGVja0Nvbm5lY3Qoc291cmNlLCB0YXJnZXQsIGxpbmspOwotCX0KLQotCS8qCi0JICogTWV0aG9kIHdpbGwgbm90IGFsbG93IG11bHRpcGxlIGxpbmsgYmV0d2VlbiB0d28gbm9kZXMuIE5lZWRzIHRvIGNhbGwKLQkgKiBDcmVha0xpbmtDb21tYW5kIGFuZCBSZWNvbm5lY3RMaW5rQ29tbWFuZC4gQW55IGFjdGlvbiBvbiBhIExpbmsgc2hvdWxkCi0JICogY2FsbCB0aGlzIGNoZWNrQ29ubmVjdChOb2RlIHNvdXJjZSwgTm9kZSB0YXJnZXQsIExpbmsgbGluaykgYmVmb3JlIGFsbG93Ci0JICogdG8gY29ubmVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0Nvbm5lY3QoTm9kZSBzb3VyY2UsIE5vZGUgdGFyZ2V0LCBMaW5rIGxpbmspIHsKLQotCQlpZiAoc291cmNlID09IHRhcmdldCAmJiAhKHNvdXJjZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQl9Ci0KLQkJTGlzdCBsaW5rcyA9IHNvdXJjZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCk7Ci0JCWlmIChsaW5rcyAhPSBudWxsKSB7Ci0JCQkvLyBUaGlzIGlzIG5lZWQgZm9yIHJlY29ubmVjdCB0byBzYW1lIHRhcmdldCBub2RlLgotCQkJaWYgKGxpbmtzLmNvbnRhaW5zKGxpbmspKSB7Ci0JCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkuZXF1YWxzKHRhcmdldCkpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkvLyBUaGlzIGlzIG5lZWQgZm9yIG5ldyBjb25uZWN0IGFuZCByZWNvbm5lY3QgdG8gZGlmZmVyZW50IHRhcmdldCBub2RlLgotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaW5rcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGlua3ggPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgbGlua3h0YXJnZXQgPSBsaW5reC5nZXRUYXJnZXQoKTsKLQkJCWlmIChsaW5reHRhcmdldCAhPSBudWxsICYmIGxpbmt4dGFyZ2V0LmVxdWFscyh0YXJnZXQpKSB7Ci0JCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hlY2tDb25uZWN0KHNvdXJjZSwgdGFyZ2V0KTsKLQl9Ci0KLQkvKgotCSAqIFRvIGF2b2lkIGNpcmN1bGFyIGxvb3BpbmcgYmV0d2VlbiBzeW5jaHJvbml6YXRpb24gYmFycy4gSWYgU3ljbkJhcjEgLT4KLQkgKiBTeW5jQmFyMiAoY29ubmVjdGVkKSB0aGVuIFN5bmNCYXIyIC0+IFN5bmNCYXIxIGNhbm5vdCBjb25uZWN0LiBpZgotCSAqIHN5bmNiYXIxIC0+IHN5bmNiYXIyLT5zeW5jYmFyMyB0aGVuIHN5bmNiYXIzIC0+IHN5bmNiYXIxIGRpc2FsbG93ZWQuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tTeW5jQmFyQ2lyY3VsYXJMb29vcChUeXBlZE5vZGUgc05vZGUsCi0JCQlUeXBlZE5vZGUgdE5vZGUpIHsKLQkJTGlzdCBsaXN0ID0gdE5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpOwotCQlpZiAoIWxpc3QuaXNFbXB0eSgpICYmIGxpc3Quc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJTm9kZSB0eXBlZG5vZGUgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJCWlmIChzTm9kZS5lcXVhbHModHlwZWRub2RlKSkKLQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCWlmICh0eXBlZG5vZGUgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQkJcmV0dXJuIGNoZWNrU3luY0JhckNpcmN1bGFyTG9vb3Aoc05vZGUsCi0JCQkJCQkJKFR5cGVkTm9kZSkgdHlwZWRub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogTWV0aG9kIHRvIENoZWNrIGlmIFN5bmNCYXIgaW5Db21taW5nIGNvbm5lY3Rpb25zIGhhdmUgCi0JICogYW55IHNvdXJjZSBpcyBhIHJlYWRvbmx5LiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tTeW5jQmFySW5jb21pbmdMaW5rcyhUeXBlZE5vZGUgdHlwZWROb2RlKXsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJTm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCQkJCWlmKHNvdXJjZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSl7Ci0JCQkJCWlmKHNvdXJjZS5pc1JlYWRPbmx5KCkpCi0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCQl9ZWxzZSBpZihzb3VyY2UgaW5zdGFuY2VvZiBUeXBlZE5vZGUpewotCQkJCQlpZigoKFR5cGVkTm9kZSlzb3VyY2UpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1lOQ0hfQkFSKQotCQkJCQkJaWYoY2hlY2tTeW5jQmFySW5jb21pbmdMaW5rcygoVHlwZWROb2RlKXNvdXJjZSkhPSBudWxsKQotCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoKLQkgKk1ldGhvZCB0byBjaGVjayBpZiBzeW5jaHJvbml6YXRpb24gYmFyIG91dGdvaW5nIGNvbm5lY3Rpb24KLQkgKmhhcyBhbnkgdGFyZ2V0IGlzIHJlYWRvbmx5LiAgCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tTeW5jQmFyT3V0Z29pbmdMaW5rcyhUeXBlZE5vZGUgdHlwZWROb2RlKXsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJTm9kZSB0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJCWlmKHRhcmdldCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSl7Ci0JCQkJCWlmKHRhcmdldC5pc1JlYWRPbmx5KCkpCi0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCQl9ZWxzZSBpZih0YXJnZXQgaW5zdGFuY2VvZiBUeXBlZE5vZGUpewotCQkJCQlpZigoKFR5cGVkTm9kZSl0YXJnZXQpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1lOQ0hfQkFSKQotCQkJCQkJaWYoY2hlY2tTeW5jQmFyT3V0Z29pbmdMaW5rcygoVHlwZWROb2RlKXRhcmdldCkhPSBudWxsKQotCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIGxpbmsgaXMgcmVhZG9ubHkuIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRPbmx5KExpbmsgbGluaykgewotCQlOb2RlIHRhcmdldCA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCU5vZGUgc291cmNlID0gbGluay5nZXRTb3VyY2UoKTsKLQkJaWYgKHRhcmdldCAhPSBudWxsICYmIHRhcmdldC5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURpYWdyYW0pIHsKLQkJCXJldHVybiBjaGVja0RlbGV0ZShsaW5rKSAhPSBudWxsOwotCQl9IGVsc2UgaWYgKHRhcmdldCAhPSBudWxsCi0JCQkJJiYgdGFyZ2V0LmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQkJaWYgKChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UgaW5zdGFuY2VvZiBUYXNrTm9kZSAmJiBzb3VyY2UKLQkJCQkJLmlzUmVhZE9ubHkoKSkKLQkJCQkJfHwgKHRhcmdldCBpbnN0YW5jZW9mIFRhc2tOb2RlICYmIHRhcmdldC5pc1JlYWRPbmx5KCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmE5OGE2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgdGhlIGFjdGl2aXR5IGRpYWdyYW1zLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0Fic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0YjAzZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TV1RHcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUNvbnRhaW5lckVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuU2VsZWN0YWJsZUxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5EaWFncmFtSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5MYXllck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5TY2FsYWJsZUZyZWVmb3JtUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5TY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYSBncmFwaGljYWwgdmlld2VyIG9mIHRoZSBlbGVtZW50IGRpYWdyYW0uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgewotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlwcm90ZWN0ZWQgR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlcjsKLQotCXByb3RlY3RlZCBPYmplY3Qgd3JhcHBlcjsKLQotCXB1YmxpYyBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJY3JlYXRlR3JhcGhpY2FsVmlld2VyKCk7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBPYmplY3Qgd3JhcHBlcikgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKLQkJY3JlYXRlR3JhcGhpY2FsVmlld2VyKCk7Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIEdyYXBoaWNhbFZpZXdlciBvbiB0aGUgc3BlY2lmaWVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gbmV3IFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcigpOwotCQl0aGlzLmdyYXBoaWNhbFZpZXdlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCWNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdyYXBoaWNhbCB2aWV3ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgZ3JhcGhpY2FsIHZpZXdlcgotCSAqLwotCXByb3RlY3RlZCBHcmFwaGljYWxWaWV3ZXIgZ2V0R3JhcGhpY2FsVmlld2VyKCkgewotCQlyZXR1cm4gZ3JhcGhpY2FsVmlld2VyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0Q29udHJvbCgpLnNldEJhY2tncm91bmQoCi0JCQkJQ29sb3JDb25zdGFudHMubGlzdEJhY2tncm91bmQpOwotCQlTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcikgZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0KLQkJU2NhbGFibGVGcmVlZm9ybVJvb3RFZGl0UGFydCByb290ID0gbmV3IFNjYWxhYmxlRnJlZWZvcm1Sb290RWRpdFBhcnQoKTsKLQkJdmlld2VyLnNldFJvb3RFZGl0UGFydChyb290KTsKLQkJdmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0RmlndXJlKCkgewotCQlHcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0KLQkJLy8gZmluZCB0aGUgZmlndXJlIHRvIGJlIHNhdmVkCi0JCUxheWVyTWFuYWdlciBsbSA9IChMYXllck1hbmFnZXIpIHZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KAotCQkJCUxheWVyTWFuYWdlci5JRCk7Ci0JCUlGaWd1cmUgZmlndXJlID0gbG0uZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuUFJJTlRBQkxFX0xBWUVSUyk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3VwcHJlc3Npb25Ub0RpYWdyYW0oRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCU9iamVjdCBlID0gZGlhZ3JhbS5nZXRPYmplY3QoKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIGUpOwotCQkJaWYgKHByb2MgIT0gbnVsbCkgewotCQkJCWRpYWdyYW0uc2V0U3VwcHJlc3Npb24oU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24ocHJvYykpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBkaWFncmFtIGZvciBnaXZlbiBvYmplY3QgKG9ubHkgZm9yIHtAbGluayBBY3Rpdml0eX0gYW5kIHBhY2tzIHRoZSBib3VuZHMuCi0JICogCi0JICogQHBhcmFtIHdyYXBwZXIgCXtAbGluayBPYmplY3R9IAkKLQkgKiBAcGFyYW0gbmVlZFJlc2V0IGJvb2xlYW4KLQkgKiBAcGFyYW0gZmlsdGVyIAl7QGxpbmsgSUZpbHRlcn0KLQkgKiBAcGFyYW0gc3VwCQl7QGxpbmsgU3VwcHJlc3Npb259Ci0JICovCi0JcHVibGljIEVkaXRQYXJ0IGxvYWREaWFncmFtKE9iamVjdCB3cmFwcGVyLCBib29sZWFuIG5lZWRSZXNldCwKLQkJCUlGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJLy8gaW5pdGlhbGl6ZSB0aGUgdmlld2VyIHdpdGggdGhlIGVkaXQgcGFydAotCQlFZGl0UGFydCBlZGl0UGFydCA9IGNyZWF0ZUVkaXRQYXJ0KHdyYXBwZXIsIGZpbHRlciwgc3VwKTsKLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIuc2V0Q29udGVudHMoZWRpdFBhcnQpOwotCi0JCS8vIGFzayBmb3IgaW1tZWRpYXRlIHVwZGF0ZSBvZiB0aGUgY29udHJvbCBzbyB0aGF0IHRoZSBkaWFncmFtIGZpZ3VyZQotCQkvLyB3aWxsIGJlIGNvbXB1dGVkCi0JCXBhcmVudC5wYWNrKHRydWUpOwotCi0JCS8vIFRoaXMgY2hlY2sgaXMgbmVlZGVkIGZvciBicm93c2luZywgaW4gb3JkZXIgdG8gcmVuZGVyIGFjdGl2aXR5IGNvbnRyaWJ1dGluZydzCi0JCS8vIGNoaWxkcmVuLiAgSW4gcHJvY2Vzc0F1dGhvcmluZyB3ZSBkb24ndCBkbyByZWFsaXphdGlvbiwgaW4gb3JkZXIgdG8gZGlzcGxheWVkIAotCQkvLyByZWFsaXplZCBlbGVtZW50cywgd2UgaGF2ZSB0byBjbGVhbnVwIEFERCBkaWFncmFtIGFuZCByZWNyZWF0ZS4gbmVlZHRvUmVzZXQgb3IgY2xlYW51cGRpYWdyYW0uCi0JCS8vIE9ubHkgZm9yIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtLgotCQlPYmplY3QgbyA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZihvIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50ICYmIGdldERpYWdyYW1UeXBlKCkgIT0gbnVsbCAmJiAKLQkJCQlnZXREaWFncmFtVHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTCkpewotCQkJaWYoVG5nVXRpbC5oYXNDb250cmlidXRvcigoVmFyaWFiaWxpdHlFbGVtZW50KW8pKXsKLQkJCQluZWVkUmVzZXQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlpZiAobmVlZFJlc2V0KSB7Ci0JCQljbGVhblVwRGlhZ3JhbSgpOwotCQl9Ci0KLQkJSUZpZ3VyZSBmaWd1cmUgPSBnZXRGaWd1cmUoKTsKLQkJaWYgKGZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gZmlndXJlLmdldEJvdW5kcygpOwotCi0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiQmVmb3JlIHVwZGF0ZTogRGlhZ3JhbSBCb3VuZHMgPSAiICsgYm91bmRzKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGJvdW5kcy54IDwgMCB8fCBib3VuZHMueSA8IDApIHsKLQkJCQkoKERpYWdyYW1FZGl0UGFydCkgZWRpdFBhcnQpLm1vdmVGaWd1cmUoLWJvdW5kcy54LCAtYm91bmRzLnkpOwotCi0JCQkJcGFyZW50LnBhY2sodHJ1ZSk7Ci0KLQkJCQlib3VuZHMgPSBmaWd1cmUuZ2V0Qm91bmRzKCk7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkFmdGVyIHVwZGF0ZTogRGlhZ3JhbSBCb3VuZHMgPSAiICsgYm91bmRzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBlZGl0UGFydDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGlhZ3JhbUluZm8oR3JhcGhpY2FsRWRpdFBhcnQgcGFydCwgRGlhZ3JhbUluZm8gZGlhZ3JhbUluZm8pIHsKLQkJTGlzdCBjaGlsZHJlbiA9IHBhcnQuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlsb2FkRGlhZ3JhbUluZm8oKEdyYXBoaWNhbEVkaXRQYXJ0KSBvLCBkaWFncmFtSW5mbyk7Ci0JCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCXBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIG87Ci0JCQkJT2JqZWN0IG1vZGVsID0gcGFydC5nZXRNb2RlbCgpOwotCQkJCU9iamVjdCBlID0gbW9kZWw7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBMaW5rZWRPYmplY3QpIHsKLQkJCQkJZSA9ICgoTGlua2VkT2JqZWN0KSBlKS5nZXRPYmplY3QoKTsKLQkJCQl9Ci0KLQkJCQlpZiAoZSBpbnN0YW5jZW9mIERpYWdyYW1FbGVtZW50KSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlib29sZWFuIHN1cHByZXNzZWQ7Ci0JCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJCQkJc3VwcHJlc3NlZCA9ICgoTmFtZWROb2RlKSBtb2RlbCkuaXNTdXBwcmVzc2VkKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzdXBwcmVzc2VkID0gKChNZXRob2RFbGVtZW50KSBlKS5nZXRTdXBwcmVzc2VkKCkKLQkJCQkJCQkJLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQl9Ci0KLQkJCQkJCUlGaWd1cmUgZiA9IHBhcnQuZ2V0RmlndXJlKCk7Ci0JCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gZi5nZXRCb3VuZHMoKTsKLQotCQkJCQkJU3RyaW5nIGFsdFRhZyA9IG51bGw7Ci0JCQkJCQlpZiAoZiBpbnN0YW5jZW9mIFNlbGVjdGFibGVMYWJlbCkgewotCQkJCQkJCWFsdFRhZyA9ICgoU2VsZWN0YWJsZUxhYmVsKSBmKS5nZXRUZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCQlkaWFncmFtSW5mby5hZGRBcmVhKChNZXRob2RFbGVtZW50KSBlLCBib3VuZHMueCwKLQkJCQkJCQlib3VuZHMueSwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0LCBhbHRUYWcsIHN1cHByZXNzZWQpOwotCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVkaXRQYXJ0IG5vdCBoYW5kbGVkOiAiICsgbyk7Ci0JCQkJLy8gLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyB7QGxpbmsgRGlhZ3JhbUluZm99Ci0JICogCi0JICovCi0JcHVibGljIERpYWdyYW1JbmZvIGdldERpYWdyYW1JbmZvKCkgewotCQlEaWFncmFtSW5mbyBkaWFncmFtSW5mbyA9IG51bGw7Ci0KLQkJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgdGhpcy5ncmFwaGljYWxWaWV3ZXIKLQkJCQkuZ2V0Q29udGVudHMoKTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBwYXJ0LmdldE1vZGVsKCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTGlua2VkT2JqZWN0KSB7Ci0JCQllbGVtZW50ID0gKChMaW5rZWRPYmplY3QpIGVsZW1lbnQpLmdldE9iamVjdCgpOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJZGlhZ3JhbUluZm8gPSBuZXcgRGlhZ3JhbUluZm8oZ2V0RGlhZ3JhbVR5cGUoKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQkJbG9hZERpYWdyYW1JbmZvKHBhcnQsIGRpYWdyYW1JbmZvKTsKLQkJfQotCi0JCXJldHVybiBkaWFncmFtSW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGRpYWdyYW0gaW1hZ2UgZnJvbSBmaWd1cmUgY3JlYXRlZCBpbiBsb2FkRGlhZ3JhbSBtZXRob2QuCi0JICogCi0JICovCi0JcHVibGljIEltYWdlIGNyZWF0ZURpYWdyYW1JbWFnZSgpIHsKLQkJSUZpZ3VyZSBmaWd1cmUgPSBnZXRGaWd1cmUoKTsKLQotCQlTV1RHcmFwaGljcyBncmFwaGljcyA9IG51bGw7Ci0JCUdDIGdjID0gbnVsbDsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gZmlndXJlLmdldEJvdW5kcygpOwotCQkJaW50IGhlaWdodCA9IGJvdW5kcy5oZWlnaHQ7Ci0JCQlpbnQgd2lkdGggPSBib3VuZHMud2lkdGg7Ci0KLQkJCS8vIGNyZWF0ZSBhIG5ldyBpbWFnZSBhbmQgcmVwYWludCB0aGUgZ3JhcGgKLQkJCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgd2lkdGgsIGhlaWdodCk7Ci0JCQlnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JCQlncmFwaGljcyA9IG5ldyBTV1RHcmFwaGljcyhnYyk7Ci0JCQlmaWd1cmUucGFpbnQoZ3JhcGhpY3MpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyByZWxlYXNlIHJlc291cmNlcwotCQkJaWYgKGdyYXBoaWNzICE9IG51bGwpCi0JCQkJZ3JhcGhpY3MuZGlzcG9zZSgpOwotCQkJaWYgKGdjICE9IG51bGwpCi0JCQkJZ2MuZGlzcG9zZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ3JhcGhpY2FsVmlld2VyICE9IG51bGwpIHsKLQkJCQlDb250cm9sIGN0cmwgPSBncmFwaGljYWxWaWV3ZXIuZ2V0Q29udHJvbCgpOwotCQkJCWlmIChjdHJsICE9IG51bGwpIHsKLQkJCQkJY3RybC5kaXNwb3NlKCk7Ci0JCQkJfQotCi0JCQkJZ3JhcGhpY2FsVmlld2VyID0gbnVsbDsKLQkJCX0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRWRpdFBhcnRGYWN0b3J5IGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KE9iamVjdCBlLCBJRmlsdGVyIGZpbHRlciwKLQkJCVN1cHByZXNzaW9uIHN1cCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERpYWdyYW1UeXBlKCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhblVwRGlhZ3JhbSgpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3MDgxNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGlhZ3JhbUFjdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5EaWFncmFtVXBkYXRlU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRGVmYXVsdEVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBncmFwaGljYWwgdmlld2VyIGZvciB0aGUgQWN0aXZpdHlEZXRhaWwgZGlhZ3JhbS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlciBleHRlbmRzIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB7Ci0KLQlwdWJsaWMgQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWRpdFBhcnRGYWN0b3J5IGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydEZhY3RvcnkoKTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyI2NyZWF0ZUVkaXRQYXJ0KGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlciwgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uKQotCSAqLwotCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KE9iamVjdCBlLCBJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBkaWFncmFtID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVBY3Rpdml0eURldGFpbERpYWdyYW0oKTsvLwotCQlkaWFncmFtLnNldEZpbHRlcihmaWx0ZXIpOwotCQlpZiAoc3VwICE9IG51bGwpIHsKLQkJCWRpYWdyYW0uc2V0U3VwcHJlc3Npb24oc3VwKTsKLQkJfQotCi0JCWRpYWdyYW0uc2V0T2JqZWN0KGUpOwotCQlFZGl0UGFydCBwYXJ0ID0gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KAotCQkJCShBY3Rpdml0eURldGFpbERpYWdyYW0pIGRpYWdyYW0pOwotCQlwYXJ0LnNldE1vZGVsKGRpYWdyYW0pOwotCQlyZXR1cm4gcGFydDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWdyYW1UeXBlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIjY2xlYW5VcERpYWdyYW0oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFuVXBEaWFncmFtKCkgewotCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCBkZXAgPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJLmdldENvbnRlbnRzKCk7Ci0JCWRlcC5nZXRSZWNlbnRseUFkZGVkUGFydHMoKS5hZGRBbGwoZGVwLmdldENoaWxkcmVuKCkpOwotCi0JCS8vIGNsZWFuIHVwIHRoZSBkaWFncmFtCi0JCURlZmF1bHRFZGl0RG9tYWluIGVkaXRpbmdEb21haW4gPSBuZXcgRGVmYXVsdEVkaXREb21haW4obnVsbCk7Ci0JCUFjdGlvblJlZ2lzdHJ5IGFjdGlvblJlZ2lzdHJ5ID0gbmV3IEFjdGlvblJlZ2lzdHJ5KCk7Ci0KLQkJRGlhZ3JhbUFjdGlvblNlcnZpY2UgYWN0aW9uU2VydmljZSA9IG5ldyBEaWFncmFtQWN0aW9uU2VydmljZSgKLQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKSwgZWRpdGluZ0RvbWFpbiwgYWN0aW9uUmVnaXN0cnkpOwotCQlhY3Rpb25TZXJ2aWNlLnJlZ2lzdGVyVmVydGljYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKTsKLQotCQlEaWFncmFtVXBkYXRlU2VydmljZSBzZXJ2aWNlID0gbmV3IERpYWdyYW1VcGRhdGVTZXJ2aWNlKAotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLCBlZGl0aW5nRG9tYWluLCBhY3Rpb25SZWdpc3RyeSk7Ci0JCXNlcnZpY2UuY2xlYW5VcERpYWdyYW0oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGlhZ3JhbVNlcnZpY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGlhZ3JhbVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDQyZGU4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9BY3Rpdml0eURpYWdyYW1TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcuYmFzZS5wZXJzaXN0ZW5jZS5JRGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlZhcmlhYmlsaXR5SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLkRpYWdyYW1JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLklBY3Rpdml0eURpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBQcm92aWRlcyBzZXJ2aWNlIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGRpYWdyYW0gaW1hZ2VzIGZvciBhY3Rpdml0eSBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEaWFncmFtU2VydmljZSBpbXBsZW1lbnRzIElBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudCA9IG51bGw7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBob2xkZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBGaWxlIHB1YkRpcjsKLQotCXByaXZhdGUgc3RhdGljIE1hcCB0eXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgRGlhZ3JhbUluZm8gZGlhZ3JhbUluZm8gPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hVbmNyZWF0ZWRBREQgPSB0cnVlOwotCQotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbiA9IHRydWU7Ci0KLQlzdGF0aWMgewotCQl0eXBlTWFwLnB1dChSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1csIG5ldyBJbnRlZ2VyKAotCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKSk7Ci0JCXR5cGVNYXAucHV0KFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUwsIG5ldyBJbnRlZ2VyKAotCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSkpOwotCQl0eXBlTWFwLnB1dChSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWSwgbmV3IEludGVnZXIoCi0JCQkJSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0pKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRJbnRUeXBlKFN0cmluZyBkaWFncmFtVHlwZSkgewotCQlJbnRlZ2VyIHR5cGUgPSAoSW50ZWdlcikgdHlwZU1hcC5nZXQoZGlhZ3JhbVR5cGUpOwotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdHlwZS5pbnRWYWx1ZSgpOwotCQl9Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCVNoZWxsIHNoZWxsID0gbnVsbDsKLQotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKCkgewotCQl0aGlzKG51bGwsIG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkpKTsKLQl9Ci0KLQlwdWJsaWMgQWN0aXZpdHlEaWFncmFtU2VydmljZShGaWxlIHB1YkRpcikgewotCQl0aGlzKG51bGwsIHB1YkRpcik7Ci0JfQotCi0JcHVibGljIEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoQ29tcG9zaXRlIHBhcmVudCwgRmlsZSBwdWJEaXIpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMucHViRGlyID0gcHViRGlyOwotCX0KLQotCXByaXZhdGUgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIGdldERpYWdyYW1WaWV3ZXIoaW50IGRpYWdyYW1UeXBlKSB7Ci0JCS8vIGlmIHRoZSBzaGVsbCB3aW5kb3cgaXMgZGlzdHJveWVkLCByZWNyZWF0ZSBpdAotCQlpZiAoKHRoaXMuc2hlbGwgIT0gbnVsbCkgJiYgdGhpcy5zaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMucGFyZW50ID0gbnVsbDsKLQkJCXRoaXMuc2hlbGwgPSBudWxsOwotCQl9Ci0KLQkJZ2V0Vmlld2VySG9sZGVyKHBhcmVudCk7Ci0KLQkJc3dpdGNoIChkaWFncmFtVHlwZSkgewotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJcmV0dXJuIG5ldyBBY3Rpdml0eURpYWdyYW1WaWV3ZXIoaG9sZGVyKTsKLQotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCXJldHVybiBuZXcgQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyKGhvbGRlcik7Ci0KLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCXJldHVybiBuZXcgV1BEZXBlbmRlbmN5RGlhZ3JhbVZpZXdlcihob2xkZXIpOwotCQkJCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRWaWV3ZXJIb2xkZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCWlmIChzaGVsbCA9PSBudWxsIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJCXNoZWxsID0gY3JlYXRlU2hlbGwoKTsKLQkJCX0KLQkJCXNoZWxsLm9wZW4oKTsKLQkJCXBhcmVudCA9IHNoZWxsOwotCQl9Ci0KLQkJaWYgKGhvbGRlciAhPSBudWxsKSB7Ci0JCQlob2xkZXIuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaG9sZGVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJaG9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKDEsIDEpKTsgLy8gc2l6ZSBjYW4ndCBiZSAwLDAKLQkJLy8gb3RoZXJ3aXNlIHRoZSBkaWFncmFtCi0JCS8vIHdpbGwgbm90IGJlIHBhaW50ZWQKLQkJaG9sZGVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJaG9sZGVyLnNldFZpc2libGUoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgU2hlbGwgY3JlYXRlU2hlbGwoKSB7Ci0JCVNoZWxsIHNoZWxsID0gbnVsbDsKLQkJRGlzcGxheSBkID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCXNoZWxsID0gbmV3IFNoZWxsKGQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc2hlbGwuc2V0Qm91bmRzKDAsIDAsIDAsIDApOwotCQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJcmV0dXJuIHNoZWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICgoc2hlbGwgIT0gbnVsbCkgJiYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQlzaGVsbC5jbG9zZSgpOwotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogc2F2ZSB0aGUgZWxlbWVudCBkaWFncmFtIGltYWdlIGFuZCByZXR1cm5zIHRoZSBpbWFnZSBmaWxlIHVybC4KLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEBwYXJhbSBpbWdQYXRoCi0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogQHBhcmFtIGZpbHRlcgotCSAqICAgICAgICAgICAgSUZpbHRlcgotCSAqIEBwYXJhbSBzdXAKLQkgKiAgICAgICAgICAgIFN1cHByZXNzaW9uCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGltYWdlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHB1Ymxpc2hpbmcgZGlyCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5JQWN0aXZpdHlEaWFncmFtU2VydmljZSNzYXZlRGlhZ3JhbShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXIsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUluZm8gc2F2ZURpYWdyYW0oZmluYWwgT2JqZWN0IHdyYXBwZXIsIGZpbmFsIFN0cmluZyBpbWdQYXRoLCAKLQkJCWZpbmFsIFN0cmluZyBkaWFncmFtVHlwZSwgZmluYWwgSUZpbHRlciBmaWx0ZXIsCi0JCQlmaW5hbCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJLy8gaW5pdGlhbGl6ZSB0aGUgZGlhZ3JhbUluZm8KLQkJZGlhZ3JhbUluZm8gPSBudWxsOwotCi0JCS8vIGdyYWIgdGhlIFVJIHRocmVhZCB0byBhdm9pZCB0aHJlYWQgYWNjZXNzIGVycm9yCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlfX2ludGVybmFsX3NhdmVEaWFncmFtKHdyYXBwZXIsIGltZ1BhdGgsIGRpYWdyYW1UeXBlLCBmaWx0ZXIsIHN1cCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBkaWFncmFtSW5mbzsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzVXNlckRlZmluZWREaWFncmFtKEFjdGl2aXR5IGUsIFN0cmluZyBpbWdQYXRoLCBTdHJpbmcgZGlhZ3JhbVR5cGUpIHRocm93cyBFeGNlcHRpb24KLQl7CQkKLQkJLy8gaWYgdGhlcmUgaXMgYSB1c2VyIGRlZmluZWQgZGlhZ3JhbSwgdXNlIGl0Ci0JCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8gaW5mbyA9IG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvKChBY3Rpdml0eSllKTsKLQkJc3dpdGNoIChnZXRJbnRUeXBlKGRpYWdyYW1UeXBlKSkKLQkJewotCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCQlpZiAoIGluZm8uY2FuUHVibGlzaEFESW1hZ2UoKSApCi0JCQkJewotCQkJCQlyZXR1cm4gKGluZm8uZ2V0QWN0aXZpdHlEaWFncmFtKCkgIT0gbnVsbCkgJiYgaW5mby5jYW5QdWJsaXNoQURJbWFnZSgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJCWlmICggaW5mby5jYW5QdWJsaXNoQURESW1hZ2UoKSApCi0JCQkJewotCQkJCQlyZXR1cm4gKGluZm8uZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkgIT0gbnVsbCkgJiYgaW5mby5jYW5QdWJsaXNoQURESW1hZ2UoKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkJCQkJCi0JCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJCWlmICggaW5mby5jYW5QdWJsaXNoV1BESW1hZ2UoKSApCi0JCQkJewotCQkJCQlyZXR1cm4gKGluZm8uZ2V0V1BERGlhZ3JhbSgpICE9IG51bGwgKSAmJiBpbmZvLmNhblB1Ymxpc2hXUERJbWFnZSgpOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgX19pbnRlcm5hbF9zYXZlRGlhZ3JhbShPYmplY3Qgd3JhcHBlciwgZmluYWwgU3RyaW5nIGltZ1BhdGgsIFN0cmluZyBkaWFncmFtVHlwZSwKLQkJCUlGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJCi0JCWlmICggc3VwLmlzU3VwcHJlc3NlZCh3cmFwcGVyKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJT2JqZWN0IG8gPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJaWYgKCEobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy9NZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClvOwotCQlBY3Rpdml0eSBlID0gKEFjdGl2aXR5KW87Ci0JCS8vIERpYWdyYW1JbmZvIGRpYWdyYW1JbmZvID0gbnVsbDsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlpbnQgdHlwZSA9IGdldEludFR5cGUoZGlhZ3JhbVR5cGUpOwotCQlpZiAodHlwZSA8IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSBudWxsOwotCi0JCS8vIGtlZXAgdGhlIGRpcnR5IGZsYWcgYW5kIHJlc2V0IGJhY2sgdG8gYXZvaWQgbWFrZSB0aGUgbGlicmFyeSBkaXJ0eQotCQlib29sZWFuIGRpcnR5RmxhZyA9IGUuZVJlc291cmNlKCkuaXNNb2RpZmllZCgpOwotCi0JCXRyeSB7Ci0JCQlpZiAoIGhhc1VzZXJEZWZpbmVkRGlhZ3JhbSgoQWN0aXZpdHkpZSwgaW1nUGF0aCwgZGlhZ3JhbVR5cGUpICkKLQkJCXsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQotCQkJLy8gZmlyc3QgY2hlY2sgaWYgd2UgbmVlZCB0byBnZW5lcmF0ZSB0aGUgZGlhZ3JhbSBvciBub3QKLQkJCS8vIGlmIHRoZSBkaWFncmFtIGlzIHN1cHJlc3NlZCwgZG9uJ3QgZ2VuZXJhdGUgZGlhZ3JhbQotCQkJLy8gZG9uJ3QgY3JlYXRlIHRoZSBkaWFncmFtIGlmIGl0J3Mgbm90IHRoZXJlLAotCQkJLy8gaWQgdGhlIGRpYWdyYW0gZG9lcyBub3QgZXhpc3QsIGl0J3Mgc3VwcmVzc2VkCi0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gZCA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldFVNQURpYWdyYW0oKEFjdGl2aXR5KSBlLCB0eXBlLCBmYWxzZSk7Ci0KLQkJCS8vIEFsbG93IHRoZSBvcHRpb24gdG8gcHVibGlzaCAndW5jcmVhdGVkJyBkaWFncmFtcwotCQkJLy8gYnkgZGVmYXVsdCwgdW5jcmVhdGVkIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyB3aWxsIGJlIHB1Ymxpc2hlZCwKLQkJCS8vIHVuY3JlYXRlZCBkaWFncmFtcyBvZiBvdGhlciB0eXBlcyB3aWxsIG5vdCBiZSBwdWJsaXNoZWQKLQkJCWJvb2xlYW4gZXhpc3QgPSAoZCAhPSBudWxsKTsKLQkJCWlmIChleGlzdCkgewotCQkJCWlmIChkLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKQotCQkJCQlyZXR1cm47Ci0JCQkJCi0JCQkJLy8gSWYgYW4gZXh0ZW5zaW9uIGhhcyBpdHMgb3duIGRpYWdyYW0uIEJhc2UgaXMgcmVwbGFjZWQgb3IgY29udHJpYnV0ZWQuIAotCQkJCS8vIGV4dGVuc2lvbiBkaWFncmFtIHNob3dzIHJlYWxpemVkIGVsZW1lbnQgaW4gdW5kZWZpbmVkIGxvY2F0aW9uLiAKLQkJCQkvLyBJbiBwdWJsaXNoaW5nIGRvbid0IGRpc3BsYXkgZXh0ZW5zaW9uIGRpYWdyYW0gZXZlbiBpZiBpdCBoYXMgaXRzIG93bgotCQkJCS8vIGRpYWdyYW0gaWYgcmVhbGl6ZWQgZWxlbWVudHMgYXJlIGNvbWluZyBpbiB0aHJvdWdoIHZhcmlhYmlsaXR5LgotCQkJCWlmKHR5cGUgPT0gR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ESUFHUkFNICYmCi0JCQkJCQljaGVja1ZhcmlhYmlsaXR5KGUsIGZpbHRlcix0eXBlKSAhPSBudWxsKXsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkJCi0JCQl9ZWxzZXsKLQkJCQkKLQkJCQlpZigodHlwZSA9PSBHcmFwaGljYWxEYXRhSGVscGVyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0pKQotCQkJCQlyZXR1cm47Ci0KLQkJCQkvLyBGb3IgQWN0aXZpdHkgRGlhZ3JhbSB1biBvcGVuZWQgZXh0ZW5zaW9uIHB1Ymxpc2guCi0JCQkJaWYodHlwZSA9PSBHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RJQUdSQU0pewotCQkJCQkvLyBJZiBvcHRpb24gaXMgbm90IGNoZWNrZWQsIGRvbid0IGdlbmVyYXRlIGEgZGlhZ3JhbQotCQkJCQlpZighcHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24pIHJldHVybjsKLQkJCQkJCi0JCQkJCS8vSWYgZXh0ZW5zaW9uIGlzIG1vZGlmaWVkIGRvbid0IGdlbmVyYXRlIGl0LgotCQkJCQlpZighZS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmlzRW1wdHkoKSkKLQkJCQkJCXJldHVybjsKLQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGNhbGN1bGF0ZWRCYXNlID0gY2hlY2tWYXJpYWJpbGl0eShlLCBmaWx0ZXIsIHR5cGUpOwotCQkJCQlpZihjYWxjdWxhdGVkQmFzZSA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0JCi0JCQkJCQotCQkJCQl3cmFwcGVyID0gY2FsY3VsYXRlZEJhc2U7Ci0JCQkJCWUgPSAoQWN0aXZpdHkpY2FsY3VsYXRlZEJhc2U7Ci0JCQkJCWV4aXN0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKHB1Ymxpc2hVbmNyZWF0ZWRBREQgPT0gZmFsc2UgJiYgdHlwZSA9PSBHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNKXsKLQkJCQkJYm9vbGVhbiBjb250cmlidXRvcmV4aXN0ID0gZmFsc2U7Ci0JCQkJCS8vIFRoaXMgaXMgbmVlZCwgaWYgY29udHJpYnV0b3IgaGFzIGEgQUREIGRpYWdyYSwgYmFzZSBkb24ndCAKLQkJCQkJLy8gYmFzZSBzaG91bGQgZ2VuZXJhdGUgQUREIGluIGJyb3dzaW5nLgotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCQkJCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIHsKLQkJCQkJCWNvbmZpZyA9ICgoUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGNvbmZpZyA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCi0JCQkJCS8vIEdldCBpbW1lZGlhdGUgY29udHJpYnV0b3JzIGZpcnN0LCBhbmQgY2hlY2sgaW1tZWRpYXRlIGNvbnRyaWJ1dG9ycwotCQkJCQkvLyBoYXZlIGFueXRoaW5nIGV4dHJhIGJyZWFrZG93biBlbGVtZW50cy4KLQkJCQkJTGlzdCBsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb250cmlidXRvcnMoZSwgY29uZmlnKTsKLQkJCQkJaWYoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQkJCQkJaWYoaXRlcmF0b3IgIT0gbnVsbCl7Ci0JCQkJCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKXsKLQkJCQkJCQkJT2JqZWN0IGFjdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYoYWN0ICE9IG51bGwpewotCQkJCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIGR4ID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJLmdldFVNQURpYWdyYW0oKEFjdGl2aXR5KSBhY3QsIHR5cGUsIGZhbHNlKTsKLQkJCQkJCQkJCWlmKGR4ICE9IG51bGwpeyAgIAotCQkJCQkJCQkJCWNvbnRyaWJ1dG9yZXhpc3QgPSB0cnVlOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmKCFjb250cmlidXRvcmV4aXN0KQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJCi0JCQl0cnkgewotCQkJCXZpZXdlciA9IGdldERpYWdyYW1WaWV3ZXIodHlwZSk7Ci0JCQkJdmlld2VyLmxvYWREaWFncmFtKHdyYXBwZXIsICFleGlzdCwgZmlsdGVyLCBzdXApOwotCQkJCWRpYWdyYW1JbmZvID0gdmlld2VyLmdldERpYWdyYW1JbmZvKCk7Ci0JCQkJaWYgKGRpYWdyYW1JbmZvICE9IG51bGwgJiYgIWRpYWdyYW1JbmZvLmlzRW1wdHkoKSkgewotCQkJCQlpbWFnZSA9IHZpZXdlci5jcmVhdGVEaWFncmFtSW1hZ2UoKTsKLQkJCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJCS8vIHNhdmUgdGhlIGltYWdlCi0JCQkJCQlGaWxlIGYgPSBuZXcgRmlsZShwdWJEaXIsIGltZ1BhdGgpOwotCi0JCQkJCQkvLyBtYWtlIHN1cmUgdGhlIGZpbGUgaXMgY3JlYXRlZCBvdGhlcndpc2UgZXhjZXB0aW9uCi0JCQkJCQlGaWxlIHBhcmVudCA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQkJCQkJaWYgKCFwYXJlbnQuZXhpc3RzKCkpIHsKLQkJCQkJCQlwYXJlbnQubWtkaXJzKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmICghZi5leGlzdHMoKSkgewotCQkJCQkJCWYuY3JlYXRlTmV3RmlsZSgpOwotCQkJCQkJfQotCQkJCQkJT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7Ci0JCQkJCQlJbWFnZUxvYWRlciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQkJCQkJCWxvYWRlci5kYXRhID0gbmV3IEltYWdlRGF0YVtdIHsgaW1hZ2UuZ2V0SW1hZ2VEYXRhKCkgfTsKLQkJCQkJCWxvYWRlci5zYXZlKG9zLCBTV1QuSU1BR0VfSlBFRyk7Ci0KLQkJCQkJCWRpYWdyYW1JbmZvLnNldEltYWdlRmlsZVBhdGgoaW1nUGF0aCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBjcmVhdGUgZGlhZ3JhbSBpbWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUxKSB7Ci0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0KLQkJCS8vIGRlbGV0ZSB0aGUgbmV3bHkgY3JlYXRlZCBkaWFncmFtIGZyb20gdGhlIGxpYnJhcnkKLQkJCWlmICghZXhpc3QpIHsKLQkJCQlkID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKAotCQkJCQkJKEFjdGl2aXR5KSBlLCB0eXBlLCBmYWxzZSk7Ci0JCQkJaWYgKGQgIT0gbnVsbCkgewotCQkJCQlFY29yZVV0aWwucmVtb3ZlKGQpOwotCQkJCX0KLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQotCQkJCS8vIHJlc3RvcmUgdGhlIGRpcnR5IGZsYWcKLQkJCQllLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKGRpcnR5RmxhZyk7Ci0KLQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQkJdmlld2VyLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZTEpIHsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JfQotCi0KLQlwcml2YXRlIFZhcmlhYmlsaXR5RWxlbWVudCBjaGVja1ZhcmlhYmlsaXR5KFZhcmlhYmlsaXR5RWxlbWVudCBlLCBJRmlsdGVyIGZpbHRlciwKLQkJCWludCB0eXBlKSB7Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSB7Ci0JCQljb25maWcgPSAoKFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyKQotCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQl9Ci0JCWlmIChjb25maWcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIEdldCBpbW1lZGlhdGUgY29udHJpYnV0b3JzIGZpcnN0LCBhbmQgY2hlY2sgaW1tZWRpYXRlIGNvbnRyaWJ1dG9ycwotCQkvLyBoYXZlIGFueXRoaW5nIGV4dHJhIGJyZWFrZG93biBlbGVtZW50cy4KLQkJTGlzdCBsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb250cmlidXRvcnMoZSwgY29uZmlnKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJaWYgKCEoKEFjdGl2aXR5KSBuZXh0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQkvLyBHZXQgYWxsIENvbnRyaWJ1dG9ycyBmcm9tIHBhcmVudCBjaGFpbiBhbmQgY29udHJpYnV0b3IgY2hhaW4gZm9yIHRoZQotCQkvLyBlbGVtZW50IGUuCi0JCVZhcmlhYmlsaXR5SW5mbyBlSW5mbyA9ICgoUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLmdldFZhcmlhYmlsaXR5SW5mbygoVmFyaWFiaWxpdHlFbGVtZW50KSBlKTsKLQkJTGlzdCBjb250cmlidXRvcnMgPSBlSW5mby5nZXRDb250cmlidXRvcnMoKTsKLQotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKHZlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlBY3Rpdml0eSByZXBsYWNlciA9IChBY3Rpdml0eSkgQ29uZmlndXJhdGlvbkhlbHBlci5nZXRSZXBsYWNlcih2ZSwKLQkJCQljb25maWcpOwotCQlpZiAocmVwbGFjZXIgIT0gbnVsbCkgewotCQkJdmUgPSByZXBsYWNlcjsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSByZXBsYWNlckRpYWdyYW0gPSBHcmFwaGljYWxEYXRhTWFuYWdlcgotCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKHJlcGxhY2VyLCB0eXBlLCBmYWxzZSk7Ci0JCQlpZiAocmVwbGFjZXJEaWFncmFtICE9IG51bGwpIHsKLQkJCQkvL2FueVJlcGxhY2VyLmFkZChyZXBsYWNlcik7Ci0JCQkJcmV0dXJuIHJlcGxhY2VyOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSBiYXNlRGlhZ3JhbSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyCi0JCQkJCS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRVTUFEaWFncmFtKChBY3Rpdml0eSkgdmUsIHR5cGUsIGZhbHNlKTsKLQkJCWlmIChiYXNlRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCi0JCQkJLy8gQ2hlY2sgZmlyc3QgaWYgYmFzZURpYWdyYW0gaXMgc3VwcHJlc3NlZC4KLQkJCQlpZiAoYmFzZURpYWdyYW0uZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpID09IHRydWUpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCQotCQkJCS8vIEZpbmQgdGhlIGNvbnRyaWJ1dG9ycyBvZiBCYXNlCi0JCQkJVmFyaWFiaWxpdHlJbmZvIHZlSW5mbyA9ICgoUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlJbmZvKChWYXJpYWJpbGl0eUVsZW1lbnQpIHZlKTsKLQkJCQlMaXN0IHZlQ29udHJpYnV0b3JzID0gdmVJbmZvLmdldENvbnRyaWJ1dG9ycygpOwotCQkJCWlmIChjb250cmlidXRvcnMuc2l6ZSgpICE9IHZlQ29udHJpYnV0b3JzLnNpemUoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29udHJpYnV0b3JzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKCF2ZUNvbnRyaWJ1dG9ycy5jb250YWlucyhuZXh0KSkgewotCQkJCQkJCWlmICghKChBY3Rpdml0eSkgbmV4dCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCQkJCQkJCQkJLmlzRW1wdHkoKSkgewotCQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIHZlOwotCQkJCQotCQkJfWVsc2V7Ci0JCQkJLy8gSWYgbm8gYmFzZSBkaWFncmFtLCBjaGVjayBiYXNlIG9mIGJhc2UgaGFkIGFueSBkaWFncmFtLgotCQkJCXJldHVybiBjaGVja1ZhcmlhYmlsaXR5KHZlLCBmaWx0ZXIsIHR5cGUpOwotCQkJfQotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgd2luZG93J3MgcHJlZmVyZW5jZSBhdHRyaWJ1dGUgZm9yIEFjdGl2aXR5IERldGFpbCBEaWFncmFtLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hlZFVuQ3JlYXRlZEFERChib29sZWFuIGZsYWcpIHsKLQkJdGhpcy5wdWJsaXNoVW5jcmVhdGVkQUREID0gZmxhZzsKLQl9Ci0JLyoqCi0JICogU2V0IHRoZSB3aW5kb3cncyBwcmVmZXJlbmNlIGF0dHJpYnV0ZSBmb3IgQWNpdGl2eXQgRGlhZ3JhbQotCSAqIAotCSAqLwotCQotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKGJvb2xlYW4gZmxhZyl7Ci0JCXRoaXMucHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24gPSBmbGFnOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9BY3Rpdml0eURpYWdyYW1WaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGlhZ3JhbVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZmExNWU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGlhZ3JhbVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5BY3Rpdml0eURpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGdyYXBoaWNhbCB2aWV3ZXIgZm9yIHRoZSBBY3Rpdml0eSBkaWFncmFtLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEaWFncmFtVmlld2VyIGV4dGVuZHMgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIHsKLQotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW1WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChPYmplY3QgZSwgSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQlBY3Rpdml0eURpYWdyYW0gZGlhZ3JhbSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQWN0aXZpdHlEaWFncmFtKCk7Ci0JCWRpYWdyYW0uc2V0RmlsdGVyKGZpbHRlcik7Ci0JCWlmIChzdXAgIT0gbnVsbCkgewotCQkJZGlhZ3JhbS5zZXRTdXBwcmVzc2lvbihzdXApOwotCQl9Ci0KLQkJZGlhZ3JhbS5zZXRPYmplY3QoZSk7Ci0JCUVkaXRQYXJ0IHBhcnQgPSBuZXcgQWN0aXZpdHlEaWFncmFtRWRpdFBhcnQoZGlhZ3JhbSk7Ci0JCXBhcnQuc2V0TW9kZWwoZGlhZ3JhbSk7Ci0JCXJldHVybiBwYXJ0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1c7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9OZXdBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL05ld0Fic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjN2MzNDNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL05ld0Fic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5EZWxlZ2F0aW5nTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYXllcmVkUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuU2VsZWN0YWJsZUxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlVNTEVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLkRpYWdyYW1JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1Sb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5pbWFnZS5JbWFnZUZpbGVGb3JtYXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVuZGVyLnV0aWwuQ29weVRvSW1hZ2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuRWRpdFBhcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOZXdBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgZXh0ZW5kcwotCQlBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgewotCi0JcHJvdGVjdGVkIEdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSBudWxsOwotCXByb3RlY3RlZCBEaWFncmFtIGRpYWdyYW07Ci0KLQlwdWJsaWMgTmV3QWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIE9iamVjdCB3cmFwcGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgd3JhcHBlcik7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZGlhZ3JhbSBmb3IgZ2l2ZW4gb2JqZWN0IChvbmx5IGZvciB7QGxpbmsgQWN0aXZpdHl9IGFuZCBwYWNrcyB0aGUgYm91bmRzLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyIAl7QGxpbmsgT2JqZWN0fSAJCi0JICogQHBhcmFtIG5lZWRSZXNldCBib29sZWFuCi0JICogQHBhcmFtIGZpbHRlciAJe0BsaW5rIElGaWx0ZXJ9Ci0JICogQHBhcmFtIHN1cAkJe0BsaW5rIFN1cHByZXNzaW9ufQotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBsb2FkRGlhZ3JhbShPYmplY3Qgd3JhcHBlciwgYm9vbGVhbiBuZWVkUmVzZXQsCi0JCQlJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCS8vIGluaXRpYWxpemUgdGhlIHZpZXdlciB3aXRoIHRoZSBlZGl0IHBhcnQKLQkJRWRpdFBhcnQgZWRpdFBhcnQgPSBjcmVhdGVFZGl0UGFydCh3cmFwcGVyLCBmaWx0ZXIsIHN1cCk7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyLnNldENvbnRlbnRzKGVkaXRQYXJ0KTsKLQotCQkvLyBhc2sgZm9yIGltbWVkaWF0ZSB1cGRhdGUgb2YgdGhlIGNvbnRyb2wgc28gdGhhdCB0aGUgZGlhZ3JhbSBmaWd1cmUKLQkJLy8gd2lsbCBiZSBjb21wdXRlZAotCQlwYXJlbnQucGFjayh0cnVlKTsKLQotCQkvLyBUaGlzIGNoZWNrIGlzIG5lZWRlZCBmb3IgYnJvd3NpbmcsIGluIG9yZGVyIHRvIHJlbmRlciBhY3Rpdml0eSBjb250cmlidXRpbmcncwotCQkvLyBjaGlsZHJlbi4gIEluIHByb2Nlc3NBdXRob3Jpbmcgd2UgZG9uJ3QgZG8gcmVhbGl6YXRpb24sIGluIG9yZGVyIHRvIGRpc3BsYXllZCAKLQkJLy8gcmVhbGl6ZWQgZWxlbWVudHMsIHdlIGhhdmUgdG8gY2xlYW51cCBBREQgZGlhZ3JhbSBhbmQgcmVjcmVhdGUuIG5lZWR0b1Jlc2V0IG9yIGNsZWFudXBkaWFncmFtLgotCQkvLyBPbmx5IGZvciBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbS4KLQkJT2JqZWN0IG8gPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJaWYobyBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCAmJiBnZXREaWFncmFtVHlwZSgpICE9IG51bGwgJiYgCi0JCQkJZ2V0RGlhZ3JhbVR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUwpKXsKLQkJCWlmKFRuZ1V0aWwuaGFzQ29udHJpYnV0b3IoKFZhcmlhYmlsaXR5RWxlbWVudClvKSl7Ci0JCQkJbmVlZFJlc2V0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKG5lZWRSZXNldCkgewotCQkJY2xlYW5VcERpYWdyYW0oKTsKLQkJfQotCi0JCXJldHVybiBlZGl0UGFydDsKLQl9Ci0KLQkKLQkvKioKLQkgKiByZXR1cm5zIHtAbGluayBEaWFncmFtSW5mb30KLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUluZm8gZ2V0RGlhZ3JhbUluZm8oKSB7Ci0JCURpYWdyYW1JbmZvIGRpYWdyYW1JbmZvID0gbnVsbDsKLQotCQlPYmplY3QgZWxlbWVudCA9IHBhcnQuZ2V0TW9kZWwoKTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBMaW5rZWRPYmplY3QpIHsKLQkJCWVsZW1lbnQgPSAoKExpbmtlZE9iamVjdCkgZWxlbWVudCkuZ2V0T2JqZWN0KCk7Ci0JCX0KLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFZpZXcpewotCQkJIGVsZW1lbnQgPSAoKFZpZXcpZWxlbWVudCkuZ2V0RWxlbWVudCgpOwotCQkJaWYoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBFTW9kZWxFbGVtZW50KXsKLQkJCQllbGVtZW50ID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpZWxlbWVudCk7Ci0JCQl9Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTm9kZSl7Ci0JCQkJZWxlbWVudCA9ICgoTm9kZSllbGVtZW50KS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCWRpYWdyYW1JbmZvID0gbmV3IERpYWdyYW1JbmZvKGdldERpYWdyYW1UeXBlKCksCi0JCQkJCShNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJCWxvYWREaWFncmFtSW5mbyhwYXJ0LCBkaWFncmFtSW5mbyk7Ci0JCX0KLQotCQlyZXR1cm4gZGlhZ3JhbUluZm87Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZURpYWdyYW1JbWFnZShJbWFnZUZpbGVGb3JtYXQgaW1hZ2VGaWxlRm9ybWF0KXsKLQkJQ29weVRvSW1hZ2VVdGlsIGltID0gbmV3IENvcHlUb0ltYWdlVXRpbCgpOwotCQkvL2ltLmNvcHlUb0ltYWdlKHBhcnQsIGRlc3RpbmF0aW9uLCBmb3JtYXQsIG1vbml0b3IpCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIjY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWRpdFBhcnRGYWN0b3J5IGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIEVkaXRQYXJ0U2VydmljZS5nZXRJbnN0YW5jZSgpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCWdldEdyYXBoaWNhbFZpZXdlcigpLmdldENvbnRyb2woKS5zZXRCYWNrZ3JvdW5kKAotCQkJCUNvbG9yQ29uc3RhbnRzLmxpc3RCYWNrZ3JvdW5kKTsKLQkJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcikgZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0KLQkJRGlhZ3JhbVJvb3RFZGl0UGFydCByb290ID0gKERpYWdyYW1Sb290RWRpdFBhcnQpIEVkaXRQYXJ0U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVJvb3RFZGl0UGFydChnZXREaWFncmFtKCkpOwotCQlMYXllcmVkUGFuZSBwcmludGFibGVMYXllcnMgPSAoTGF5ZXJlZFBhbmUpIHJvb3QKLQkJCQkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuUFJJTlRBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgZXh0TGFiZWxzTGF5ZXIgPSBuZXcgRnJlZWZvcm1MYXllcigpOwotCQlleHRMYWJlbHNMYXllci5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBEZWxlZ2F0aW5nTGF5b3V0KCkpOwotCQlwcmludGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihleHRMYWJlbHNMYXllciwKLQkJCQlVTUxFZGl0UGFydEZhY3RvcnkuRVhURVJOQUxfTk9ERV9MQUJFTFNfTEFZRVIsCi0JCQkJTGF5ZXJDb25zdGFudHMuUFJJTUFSWV9MQVlFUik7Ci0JCUxheWVyZWRQYW5lIHNjYWxhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlNDQUxBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgc2NhbGVkRmVlZGJhY2tMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCXNjYWxlZEZlZWRiYWNrTGF5ZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNjYWxhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoc2NhbGVkRmVlZGJhY2tMYXllciwKLQkJCQlMYXllckNvbnN0YW50cy5TQ0FMRURfRkVFREJBQ0tfTEFZRVIsCi0JCQkJRGlhZ3JhbVJvb3RFZGl0UGFydC5ERUNPUkFUSU9OX1VOUFJJTlRBQkxFX0xBWUVSKTsKLQkJdmlld2VyLnNldFJvb3RFZGl0UGFydChyb290KTsKLQkJdmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSk7Ci0JfQotCQotCS8qCi0JICogCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW0gZ2V0RGlhZ3JhbSgpewotCQl0cnl7Ci0JCQlpZihkaWFncmFtID09IG51bGwpewotCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSl3cmFwcGVyOwotCQkJCURpYWdyYW1NYW5hZ2VyIGRtZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KSk7CQotCQkJCUxpc3QgbGlzdCA9IGRtZ3IuZ2V0RGlhZ3JhbXMoYWN0LCBBY3Rpdml0eURpYWdyYW1TZXJ2aWNlLmdldEludFR5cGUoZ2V0RGlhZ3JhbVR5cGUoKSkpOwotCQkJCWlmKCFsaXN0LmlzRW1wdHkoKSl7Ci0JCQkJCWRpYWdyYW0gPSAoRGlhZ3JhbSlsaXN0LmdldCgwKTsKLQkJCQl9ZWxzZXsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJEaWFncmFtIGlzIGVtcHR5IGZvciAiICsgYWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZGlhZ3JhbTsKLQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gbmV3IERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKTsKLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQljb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERpYWdyYW1JbmZvKEdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQsIERpYWdyYW1JbmZvIGRpYWdyYW1JbmZvKSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSBwYXJ0LmdldENoaWxkcmVuKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCQotCQkJaWYgKG8gaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCXBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIG87Ci0JCQkJT2JqZWN0IG1vZGVsID0gcGFydC5nZXRNb2RlbCgpOwotCQkJCU9iamVjdCBlID0gbW9kZWw7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBMaW5rZWRPYmplY3QpIHsKLQkJCQkJZSA9ICgoTGlua2VkT2JqZWN0KSBlKS5nZXRPYmplY3QoKTsKLQkJCQl9Ci0JCQkJaWYoZSBpbnN0YW5jZW9mIFZpZXcpewotCQkJCQllID0gKChWaWV3KWUpLmdldEVsZW1lbnQoKTsKLQkJCQkJaWYoZSBpbnN0YW5jZW9mIE5vZGUpewotCQkJCQkJaWYoZSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIpewotCQkJCQkJCWxvYWREaWFncmFtSW5mbygoR3JhcGhpY2FsRWRpdFBhcnQpbywgZGlhZ3JhbUluZm8pOwotCQkJCQkJfQotCQkJCQkJZSA9ICgoTm9kZSllKS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQkJaWYoZSAhPSBudWxsICYmIGUgaW5zdGFuY2VvZiBFTW9kZWxFbGVtZW50KXsKLQkJCQkJCWUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCgoRU1vZGVsRWxlbWVudCllKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChlIGluc3RhbmNlb2YgRGlhZ3JhbUVsZW1lbnQpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWJvb2xlYW4gc3VwcHJlc3NlZDsKLQkJCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgTmFtZWROb2RlKSB7Ci0JCQkJCQlzdXBwcmVzc2VkID0gKChOYW1lZE5vZGUpIG1vZGVsKS5pc1N1cHByZXNzZWQoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN1cHByZXNzZWQgPSAoKE1ldGhvZEVsZW1lbnQpIGUpLmdldFN1cHByZXNzZWQoKQotCQkJCQkJCQkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCX0KLQotCQkJCQkJSUZpZ3VyZSBmID0gcGFydC5nZXRGaWd1cmUoKTsKLQkJCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBmLmdldEJvdW5kcygpOwotCi0JCQkJCQlTdHJpbmcgYWx0VGFnID0gbnVsbDsKLQkJCQkJCWlmIChmIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkJCQkJYWx0VGFnID0gKChXcmFwTGFiZWwpIGYpLmdldFRleHQoKTsKLQkJCQkJCX0KLQkJCQkJCWRpYWdyYW1JbmZvLmFkZEFyZWEoKE1ldGhvZEVsZW1lbnQpIGUsIGJvdW5kcy54LAotCQkJCQkJCWJvdW5kcy55LCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQsIGFsdFRhZywgc3VwcHJlc3NlZCk7Ci0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvTmV3QWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9OZXdBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjljMzg0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9OZXdBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtRWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuRWRpdFBhcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICovCi1wdWJsaWMgY2xhc3MgTmV3QWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyIGV4dGVuZHMKLQkJTmV3QWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqLwotCXB1YmxpYyBOZXdBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgT2JqZWN0IHdyYXBwZXIpIHsKLQkJc3VwZXIocGFyZW50LCB3cmFwcGVyKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLkFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciNjcmVhdGVFZGl0UGFydChqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXIsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IGUsIElGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJaWYoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCURpYWdyYW0gbW9kZWwgPShEaWFncmFtKWRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQkJbW9kZWwuc2V0U3VwcHJlc3Npb24oc3VwKTsKLQkJCURpYWdyYW1FZGl0RG9tYWluIGRvbWFpbiA9IG5ldyBEaWFncmFtRWRpdERvbWFpbihudWxsKTsKLQkJCSgoSURpYWdyYW1HcmFwaGljYWxWaWV3ZXIpZ3JhcGhpY2FsVmlld2VyKS5zZXRFZGl0RG9tYWluKGRvbWFpbik7Ci0JCQlwYXJ0ID0gRWRpdFBhcnRTZXJ2aWNlLmdldEluc3RhbmNlKCkuY3JlYXRlR3JhcGhpY0VkaXRQYXJ0KGRpYWdyYW0pOwotCQkJcmV0dXJuIHBhcnQ7Ci0JCX0KLQkJaWYocGFydCA9PSBudWxsKXsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiRWRpdHBhcnQgZm9yICIrIGUgKyIgaXMgbm90IGNyZWF0ZWQiKTsKLQkJfQotCQlyZXR1cm4gcGFydDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyI2dldERpYWdyYW1UeXBlKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWdyYW1UeXBlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL05ld0FjdGl2aXR5RGlhZ3JhbVNlcnZpY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL05ld0FjdGl2aXR5RGlhZ3JhbVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2MyOTYyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9OZXdBY3Rpdml0eURpYWdyYW1TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLmJhc2UucGVyc2lzdGVuY2UuSURpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5WYXJpYWJpbGl0eUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LlByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5EaWFncmFtSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5JQWN0aXZpdHlEaWFncmFtU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmltYWdlLkltYWdlRmlsZUZvcm1hdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlbmRlci5jbGlwYm9hcmQuRGlhZ3JhbUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlbmRlci51dGlsLkNvcHlUb0ltYWdlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogUHJvdmlkZXMgc2VydmljZSBtZXRob2RzIGZvciBjcmVhdGluZyBkaWFncmFtIGltYWdlcyBmb3IgYWN0aXZpdHkgZWxlbWVudHMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTmV3QWN0aXZpdHlEaWFncmFtU2VydmljZSBpbXBsZW1lbnRzIElBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudCA9IG51bGw7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBob2xkZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBGaWxlIHB1YkRpcjsKLQotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEludGVnZXI+IHR5cGVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0KLQlwcml2YXRlIERpYWdyYW1JbmZvIGRpYWdyYW1JbmZvID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoVW5jcmVhdGVkQUREID0gdHJ1ZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gcHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24gPSB0cnVlOwotCi0Jc3RhdGljIHsKLQkJdHlwZU1hcC5wdXQoUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XLCBuZXcgSW50ZWdlcigKLQkJCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSkpOwotCQl0eXBlTWFwLnB1dChSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMLCBuZXcgSW50ZWdlcigKLQkJCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pKTsKLQkJdHlwZU1hcC5wdXQoUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1ksIG5ldyBJbnRlZ2VyKAotCQkJCUlEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50VHlwZShTdHJpbmcgZGlhZ3JhbVR5cGUpIHsKLQkJSW50ZWdlciB0eXBlID0gKEludGVnZXIpIHR5cGVNYXAuZ2V0KGRpYWdyYW1UeXBlKTsKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIHR5cGUuaW50VmFsdWUoKTsKLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQlTaGVsbCBzaGVsbCA9IG51bGw7Ci0KLQlwdWJsaWMgTmV3QWN0aXZpdHlEaWFncmFtU2VydmljZSgpIHsKLQkJdGhpcyhudWxsLCBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpKSk7Ci0JfQotCi0JcHVibGljIE5ld0FjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoRmlsZSBwdWJEaXIpIHsKLQkJdGhpcyhudWxsLCBwdWJEaXIpOwotCX0KLQotCXB1YmxpYyBOZXdBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKENvbXBvc2l0ZSBwYXJlbnQsIEZpbGUgcHViRGlyKSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLnB1YkRpciA9IHB1YkRpcjsKLQl9Ci0KLQlwcml2YXRlIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciBnZXREaWFncmFtVmlld2VyKGludCBkaWFncmFtVHlwZSwgT2JqZWN0IHdyYXBwZXIpIHsKLQkJLy8gaWYgdGhlIHNoZWxsIHdpbmRvdyBpcyBkaXN0cm95ZWQsIHJlY3JlYXRlIGl0Ci0JCWlmICgodGhpcy5zaGVsbCAhPSBudWxsKSAmJiB0aGlzLnNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5wYXJlbnQgPSBudWxsOwotCQkJdGhpcy5zaGVsbCA9IG51bGw7Ci0JCX0KLQotCQlnZXRWaWV3ZXJIb2xkZXIocGFyZW50KTsKLQotCQlzd2l0Y2ggKGRpYWdyYW1UeXBlKSB7Ci0JCWNhc2UgSURpYWdyYW1TZXJ2aWNlLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlyZXR1cm4gbmV3IE5ld0FjdGl2aXR5RGlhZ3JhbVZpZXdlcihob2xkZXIsIHdyYXBwZXIpOwotCi0JCWNhc2UgSURpYWdyYW1TZXJ2aWNlLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJcmV0dXJuIG5ldyBOZXdBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIoaG9sZGVyLHdyYXBwZXIpOwotCi0JCWNhc2UgSURpYWdyYW1TZXJ2aWNlLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQlyZXR1cm4gbmV3IE5ld1dQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIoaG9sZGVyLHdyYXBwZXIpOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRWaWV3ZXJIb2xkZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCWlmIChzaGVsbCA9PSBudWxsIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJCXNoZWxsID0gY3JlYXRlU2hlbGwoKTsKLQkJCX0KLQkJCXNoZWxsLm9wZW4oKTsKLQkJCXBhcmVudCA9IHNoZWxsOwotCQl9Ci0KLQkJaWYgKGhvbGRlciAhPSBudWxsKSB7Ci0JCQlob2xkZXIuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaG9sZGVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJaG9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKDEsIDEpKTsgLy8gc2l6ZSBjYW4ndCBiZSAwLDAKLQkJLy8gb3RoZXJ3aXNlIHRoZSBkaWFncmFtCi0JCS8vIHdpbGwgbm90IGJlIHBhaW50ZWQKLQkJaG9sZGVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJaG9sZGVyLnNldFZpc2libGUoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgU2hlbGwgY3JlYXRlU2hlbGwoKSB7Ci0JCVNoZWxsIHNoZWxsID0gbnVsbDsKLQkJRGlzcGxheSBkID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCXNoZWxsID0gbmV3IFNoZWxsKGQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc2hlbGwuc2V0Qm91bmRzKDAsIDAsIDAsIDApOwotCQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJcmV0dXJuIHNoZWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICgoc2hlbGwgIT0gbnVsbCkgJiYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQlzaGVsbC5jbG9zZSgpOwotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogc2F2ZSB0aGUgZWxlbWVudCBkaWFncmFtIGltYWdlIGFuZCByZXR1cm5zIHRoZSBpbWFnZSBmaWxlIHVybC4KLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEBwYXJhbSBpbWdQYXRoCi0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogQHBhcmFtIGZpbHRlcgotCSAqICAgICAgICAgICAgSUZpbHRlcgotCSAqIEBwYXJhbSBzdXAKLQkgKiAgICAgICAgICAgIFN1cHByZXNzaW9uCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGltYWdlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHB1Ymxpc2hpbmcgZGlyCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5JQWN0aXZpdHlEaWFncmFtU2VydmljZSNzYXZlRGlhZ3JhbShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXIsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUluZm8gc2F2ZURpYWdyYW0oZmluYWwgT2JqZWN0IHdyYXBwZXIsIGZpbmFsIFN0cmluZyBpbWdQYXRoLCAKLQkJCWZpbmFsIFN0cmluZyBkaWFncmFtVHlwZSwgZmluYWwgSUZpbHRlciBmaWx0ZXIsCi0JCQlmaW5hbCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJLy8gaW5pdGlhbGl6ZSB0aGUgZGlhZ3JhbUluZm8KLQkJZGlhZ3JhbUluZm8gPSBudWxsOwotCi0JCS8vIGdyYWIgdGhlIFVJIHRocmVhZCB0byBhdm9pZCB0aHJlYWQgYWNjZXNzIGVycm9yCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlfX2ludGVybmFsX3NhdmVEaWFncmFtKHdyYXBwZXIsIGltZ1BhdGgsIGRpYWdyYW1UeXBlLCBmaWx0ZXIsIHN1cCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBkaWFncmFtSW5mbzsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzVXNlckRlZmluZWREaWFncmFtKEFjdGl2aXR5IGUsIFN0cmluZyBpbWdQYXRoLCBTdHJpbmcgZGlhZ3JhbVR5cGUpIHRocm93cyBFeGNlcHRpb24KLQl7CQkKLQkJLy8gaWYgdGhlcmUgaXMgYSB1c2VyIGRlZmluZWQgZGlhZ3JhbSwgdXNlIGl0Ci0JCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8gaW5mbyA9IG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvKChBY3Rpdml0eSllKTsKLQkJc3dpdGNoIChnZXRJbnRUeXBlKGRpYWdyYW1UeXBlKSkKLQkJewotCQkJY2FzZSBJRGlhZ3JhbVNlcnZpY2UuQUNUSVZJVFlfRElBR1JBTToKLQkJCQlpZiAoIGluZm8uY2FuUHVibGlzaEFESW1hZ2UoKSApCi0JCQkJewotCQkJCQlyZXR1cm4gKGluZm8uZ2V0QWN0aXZpdHlEaWFncmFtKCkgIT0gbnVsbCkgJiYgaW5mby5jYW5QdWJsaXNoQURJbWFnZSgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkKLQkJCWNhc2UgSURpYWdyYW1TZXJ2aWNlLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJCWlmICggaW5mby5jYW5QdWJsaXNoQURESW1hZ2UoKSApCi0JCQkJewotCQkJCQlyZXR1cm4gKGluZm8uZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkgIT0gbnVsbCkgJiYgaW5mby5jYW5QdWJsaXNoQURESW1hZ2UoKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkJCQkJCi0JCQljYXNlIElEaWFncmFtU2VydmljZS5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJCWlmICggaW5mby5jYW5QdWJsaXNoV1BESW1hZ2UoKSApCi0JCQkJewotCQkJCQlyZXR1cm4gKGluZm8uZ2V0V1BERGlhZ3JhbSgpICE9IG51bGwgKSAmJiBpbmZvLmNhblB1Ymxpc2hXUERJbWFnZSgpOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgX19pbnRlcm5hbF9zYXZlRGlhZ3JhbShPYmplY3Qgd3JhcHBlciwgZmluYWwgU3RyaW5nIGltZ1BhdGgsIFN0cmluZyBkaWFncmFtVHlwZSwKLQkJCUlGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJCi0JCWlmICggc3VwLmlzU3VwcHJlc3NlZCh3cmFwcGVyKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJT2JqZWN0IG8gPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJaWYgKCEobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy9NZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClvOwotCQlBY3Rpdml0eSBlID0gKEFjdGl2aXR5KW87Ci0JCS8vIERpYWdyYW1JbmZvIGRpYWdyYW1JbmZvID0gbnVsbDsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlpbnQgdHlwZSA9IGdldEludFR5cGUoZGlhZ3JhbVR5cGUpOwotCQlpZiAodHlwZSA8IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSBudWxsOwotCi0JCS8vIGtlZXAgdGhlIGRpcnR5IGZsYWcgYW5kIHJlc2V0IGJhY2sgdG8gYXZvaWQgbWFrZSB0aGUgbGlicmFyeSBkaXJ0eQotCQlib29sZWFuIGRpcnR5RmxhZyA9IGUuZVJlc291cmNlKCkuaXNNb2RpZmllZCgpOwotCQkKLQkJdHJ5IHsKLQkJCWlmICggaGFzVXNlckRlZmluZWREaWFncmFtKChBY3Rpdml0eSllLCBpbWdQYXRoLCBkaWFncmFtVHlwZSkgKQotCQkJewotCQkJCXJldHVybjsKLQkJCX0KLQotCi0JCQkvLyBDaGVjayBkaWFncmFtIGV4aXN0cywgZG9uJ3QgZ2VuZXJhdGUgZm9yIHN1cHByZXNzZWQuCi0JCQlEaWFncmFtIGQgPSBnZXREaWFncmFtKGUsIHR5cGUpOwotCQkJCi0JCQkvL0NoZWNrIHB1Ymxpc2hpbmcgb3B0aW9ucy4KLQkJCWJvb2xlYW4gZXhpc3QgPSAoZCAhPSBudWxsKTsKLQkJCWlmIChleGlzdCkgewotCQkJCS8vVE9ETzogQ2hlY2sgZm9yIHN1cHByZXNzaW9uLgotLy8JCQkJaWYgKGQuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpID09IHRydWUpCi0vLwkJCQkJcmV0dXJuOwotCQkJCQotCQkJCS8vIElmIGFuIGV4dGVuc2lvbiBoYXMgaXRzIG93biBkaWFncmFtLiBCYXNlIGlzIHJlcGxhY2VkIG9yIGNvbnRyaWJ1dGVkLiAKLQkJCQkvLyBleHRlbnNpb24gZGlhZ3JhbSBzaG93cyByZWFsaXplZCBlbGVtZW50IGluIHVuZGVmaW5lZCBsb2NhdGlvbi4gCi0JCQkJLy8gSW4gcHVibGlzaGluZyBkb24ndCBkaXNwbGF5IGV4dGVuc2lvbiBkaWFncmFtIGV2ZW4gaWYgaXQgaGFzIGl0cyBvd24KLQkJCQkvLyBkaWFncmFtIGlmIHJlYWxpemVkIGVsZW1lbnRzIGFyZSBjb21pbmcgaW4gdGhyb3VnaCB2YXJpYWJpbGl0eS4KLQkJCQlpZih0eXBlID09IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNICYmCi0JCQkJCQljaGVja1ZhcmlhYmlsaXR5KGUsIGZpbHRlcix0eXBlKSAhPSBudWxsKXsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkJCi0JCQl9ZWxzZXsKLQkJCQkKLQkJCQlpZigodHlwZSA9PSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSkpCi0JCQkJCXJldHVybjsKLQotCQkJCS8vIEZvciBBY3Rpdml0eSBEaWFncmFtIHVuIG9wZW5lZCBleHRlbnNpb24gcHVibGlzaC4KLQkJCQlpZih0eXBlID09IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKXsKLQkJCQkJLy8gSWYgb3B0aW9uIGlzIG5vdCBjaGVja2VkLCBkb24ndCBnZW5lcmF0ZSBhIGRpYWdyYW0KLQkJCQkJaWYoIXB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKSByZXR1cm47Ci0JCQkJCQotCQkJCQkvL0lmIGV4dGVuc2lvbiBpcyBtb2RpZmllZCBkb24ndCBnZW5lcmF0ZSBpdC4KLQkJCQkJaWYoIWUuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pc0VtcHR5KCkpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBjYWxjdWxhdGVkQmFzZSA9IGNoZWNrVmFyaWFiaWxpdHkoZSwgZmlsdGVyLCB0eXBlKTsKLQkJCQkJaWYoY2FsY3VsYXRlZEJhc2UgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9CQotCQkJCQkKLQkJCQkJd3JhcHBlciA9IGNhbGN1bGF0ZWRCYXNlOwotCQkJCQllID0gKEFjdGl2aXR5KWNhbGN1bGF0ZWRCYXNlOwotCQkJCQlleGlzdCA9IHRydWU7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChwdWJsaXNoVW5jcmVhdGVkQUREID09IGZhbHNlICYmIHR5cGUgPT0gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNKXsKLQkJCQkJYm9vbGVhbiBjb250cmlidXRvcmV4aXN0ID0gZmFsc2U7Ci0JCQkJCS8vIFRoaXMgaXMgbmVlZCwgaWYgY29udHJpYnV0b3IgaGFzIGEgQUREIGRpYWdyYSwgYmFzZSBkb24ndCAKLQkJCQkJLy8gYmFzZSBzaG91bGQgZ2VuZXJhdGUgQUREIGluIGJyb3dzaW5nLgotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCQkJCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIHsKLQkJCQkJCWNvbmZpZyA9ICgoUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGNvbmZpZyA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCi0JCQkJCS8vIEdldCBpbW1lZGlhdGUgY29udHJpYnV0b3JzIGZpcnN0LCBhbmQgY2hlY2sgaW1tZWRpYXRlIGNvbnRyaWJ1dG9ycwotCQkJCQkvLyBoYXZlIGFueXRoaW5nIGV4dHJhIGJyZWFrZG93biBlbGVtZW50cy4KLQkJCQkJTGlzdCBsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb250cmlidXRvcnMoZSwgY29uZmlnKTsKLQkJCQkJaWYoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQkJCQkJaWYoaXRlcmF0b3IgIT0gbnVsbCl7Ci0JCQkJCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKXsKLQkJCQkJCQkJT2JqZWN0IGFjdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYoYWN0ICE9IG51bGwpewotCQkJCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIGR4ID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJLmdldFVNQURpYWdyYW0oKEFjdGl2aXR5KSBhY3QsIHR5cGUsIGZhbHNlKTsKLQkJCQkJCQkJCWlmKGR4ICE9IG51bGwpeyAgIAotCQkJCQkJCQkJCWNvbnRyaWJ1dG9yZXhpc3QgPSB0cnVlOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmKCFjb250cmlidXRvcmV4aXN0KQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJCi0JCQl0cnkgewotCQkJCXZpZXdlciA9IGdldERpYWdyYW1WaWV3ZXIodHlwZSwgd3JhcHBlcik7Ci0JCQkJdmlld2VyLmxvYWREaWFncmFtKHdyYXBwZXIsICFleGlzdCwgZmlsdGVyLCBzdXApOwotCQkJCWRpYWdyYW1JbmZvID0gdmlld2VyLmdldERpYWdyYW1JbmZvKCk7Ci0JCQkJaWYgKGRpYWdyYW1JbmZvICE9IG51bGwgJiYgIWRpYWdyYW1JbmZvLmlzRW1wdHkoKSkgewotCQkJCQlpbWFnZSA9IHZpZXdlci5jcmVhdGVEaWFncmFtSW1hZ2UoKTsKLQkJCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJCS8vIHNhdmUgdGhlIGltYWdlCi0JCQkJCQlGaWxlIGYgPSBuZXcgRmlsZShwdWJEaXIsIGltZ1BhdGgpOwotCi0JCQkJCQkvLyBtYWtlIHN1cmUgdGhlIGZpbGUgaXMgY3JlYXRlZCBvdGhlcndpc2UgZXhjZXB0aW9uCi0JCQkJCQlGaWxlIHBhcmVudCA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQkJCQkJaWYgKCFwYXJlbnQuZXhpc3RzKCkpIHsKLQkJCQkJCQlwYXJlbnQubWtkaXJzKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmICghZi5leGlzdHMoKSkgewotCQkJCQkJCWYuY3JlYXRlTmV3RmlsZSgpOwotCQkJCQkJfQotCQkJCQkJT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7Ci0JCQkJCQlJbWFnZUxvYWRlciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQkJCQkJCWxvYWRlci5kYXRhID0gbmV3IEltYWdlRGF0YVtdIHsgaW1hZ2UuZ2V0SW1hZ2VEYXRhKCkgfTsKLQkJCQkJCWxvYWRlci5zYXZlKG9zLCBTV1QuSU1BR0VfSlBFRyk7Ci0KLQkJCQkJCWRpYWdyYW1JbmZvLnNldEltYWdlRmlsZVBhdGgoaW1nUGF0aCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBjcmVhdGUgZGlhZ3JhbSBpbWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUxKSB7Ci0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0KLQkJCS8vIGRlbGV0ZSB0aGUgbmV3bHkgY3JlYXRlZCBkaWFncmFtIGZyb20gdGhlIGxpYnJhcnkKLQkJCWlmICghZXhpc3QpIHsKLQkJCQlkID0gZ2V0RGlhZ3JhbShlLCB0eXBlKTsKLQkJCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUoZCk7Ci0JCQkJfQotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCi0JCQkJLy8gcmVzdG9yZSB0aGUgZGlydHkgZmxhZwotCQkJCWUuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQoZGlydHlGbGFnKTsKLQotCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCQl2aWV3ZXIuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlMSkgewotCQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQotCXByaXZhdGUgVmFyaWFiaWxpdHlFbGVtZW50IGNoZWNrVmFyaWFiaWxpdHkoVmFyaWFiaWxpdHlFbGVtZW50IGUsIElGaWx0ZXIgZmlsdGVyLAotCQkJaW50IHR5cGUpIHsKLQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIHsKLQkJCWNvbmZpZyA9ICgoUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCX0KLQkJaWYgKGNvbmZpZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gR2V0IGltbWVkaWF0ZSBjb250cmlidXRvcnMgZmlyc3QsIGFuZCBjaGVjayBpbW1lZGlhdGUgY29udHJpYnV0b3JzCi0JCS8vIGhhdmUgYW55dGhpbmcgZXh0cmEgYnJlYWtkb3duIGVsZW1lbnRzLgotCQlMaXN0IGxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvbnRyaWJ1dG9ycyhlLCBjb25maWcpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlpZiAoISgoQWN0aXZpdHkpIG5leHQpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8vIEdldCBhbGwgQ29udHJpYnV0b3JzIGZyb20gcGFyZW50IGNoYWluIGFuZCBjb250cmlidXRvciBjaGFpbiBmb3IgdGhlCi0JCS8vIGVsZW1lbnQgZS4KLQkJVmFyaWFiaWxpdHlJbmZvIGVJbmZvID0gKChQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkuZ2V0VmFyaWFiaWxpdHlJbmZvKChWYXJpYWJpbGl0eUVsZW1lbnQpIGUpOwotCQlMaXN0IGNvbnRyaWJ1dG9ycyA9IGVJbmZvLmdldENvbnRyaWJ1dG9ycygpOwotCi0JCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlpZiAodmUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUFjdGl2aXR5IHJlcGxhY2VyID0gKEFjdGl2aXR5KSBDb25maWd1cmF0aW9uSGVscGVyLmdldFJlcGxhY2VyKHZlLAotCQkJCWNvbmZpZyk7Ci0JCWlmIChyZXBsYWNlciAhPSBudWxsKSB7Ci0JCQl2ZSA9IHJlcGxhY2VyOwotCQkJRGlhZ3JhbSByZXBsYWNlckRpYWdyYW0gPSBnZXREaWFncmFtKHJlcGxhY2VyLCB0eXBlKTsKLQkJCWlmIChyZXBsYWNlckRpYWdyYW0gIT0gbnVsbCkgewotCQkJCXJldHVybiByZXBsYWNlcjsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlEaWFncmFtIGJhc2VEaWFncmFtID0gZ2V0RGlhZ3JhbSgoQWN0aXZpdHkpIHZlLCB0eXBlKTsKLQkJCWlmIChiYXNlRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCi0JCQkJLy8gQ2hlY2sgZmlyc3QgaWYgYmFzZURpYWdyYW0gaXMgc3VwcHJlc3NlZC4KLQkJCQkvL1RPRE86IFN1cHByZXNzaW9uIHdvcmsuCi0vLwkJCQlpZiAoYmFzZURpYWdyYW0uZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpID09IHRydWUpCi0vLwkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCi0JCQkJLy8gRmluZCB0aGUgY29udHJpYnV0b3JzIG9mIEJhc2UKLQkJCQlWYXJpYWJpbGl0eUluZm8gdmVJbmZvID0gKChQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUluZm8oKFZhcmlhYmlsaXR5RWxlbWVudCkgdmUpOwotCQkJCUxpc3QgdmVDb250cmlidXRvcnMgPSB2ZUluZm8uZ2V0Q29udHJpYnV0b3JzKCk7Ci0JCQkJaWYgKGNvbnRyaWJ1dG9ycy5zaXplKCkgIT0gdmVDb250cmlidXRvcnMuc2l6ZSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb250cmlidXRvcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAoIXZlQ29udHJpYnV0b3JzLmNvbnRhaW5zKG5leHQpKSB7Ci0JCQkJCQkJaWYgKCEoKEFjdGl2aXR5KSBuZXh0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCQkJCQkuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gdmU7Ci0JCQkJCi0JCQl9ZWxzZXsKLQkJCQkvLyBJZiBubyBiYXNlIGRpYWdyYW0sIGNoZWNrIGJhc2Ugb2YgYmFzZSBoYWQgYW55IGRpYWdyYW0uCi0JCQkJcmV0dXJuIGNoZWNrVmFyaWFiaWxpdHkodmUsIGZpbHRlciwgdHlwZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB3aW5kb3cncyBwcmVmZXJlbmNlIGF0dHJpYnV0ZSBmb3IgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0uCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaGVkVW5DcmVhdGVkQUREKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLnB1Ymxpc2hVbmNyZWF0ZWRBREQgPSBmbGFnOwotCX0KLQkvKioKLQkgKiBTZXQgdGhlIHdpbmRvdydzIHByZWZlcmVuY2UgYXR0cmlidXRlIGZvciBBY2l0aXZ5dCBEaWFncmFtCi0JICogCi0JICovCi0JCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oYm9vbGVhbiBmbGFnKXsKLQkJdGhpcy5wdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbiA9IGZsYWc7Ci0JfQotCi0JcHVibGljIERpYWdyYW1HZW5lcmF0b3IgY3JlYXRlRGlhZ3JhbUltYWdlKERpYWdyYW1FZGl0UGFydCBkaWFncmFtRVAsIEltYWdlRmlsZUZvcm1hdCBmaWxlRm9ybWF0KQotCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQ29weVRvSW1hZ2VVdGlsIHV0aWwgPSBuZXcgQ29weVRvSW1hZ2VVdGlsKCk7Ci0JCURpYWdyYW1HZW5lcmF0b3IgZEdlbiA9IHV0aWwuY29weVRvSW1hZ2UoZGlhZ3JhbUVQLCBuZXcgUGF0aChwdWJEaXIuZ2V0UGF0aCgpKSwgZmlsZUZvcm1hdCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCWRHZW4uY3JlYXRlQVdUSW1hZ2VGb3JEaWFncmFtKCk7Ci0JCXJldHVybiBkR2VuOwotCX0KLQkKLQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKEFjdGl2aXR5IGUsIGludCB0eXBlKXsKLQkJRGlhZ3JhbU1hbmFnZXIgZE1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlKSk7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IG51bGw7Ci0JCXRyeXsKLQkJCUxpc3QgbGlzdCA9IGRNZ3IuZ2V0RGlhZ3JhbXMoZSwgdHlwZSk7Ci0JCQlpZighbGlzdC5pc0VtcHR5KCkpewotCQkJCWRpYWdyYW0gPSAoRGlhZ3JhbSlsaXN0LmdldCgwKTsKLQkJCX0KLQkJfWNhdGNoKEV4Y2VwdGlvbiBleCl7Ci0JCQkvL1RPRE8gOiBMb2dnZXIuCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIGluIGdldERpYWdyYW0oKSIgKyBleC5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWZpbmFsbHl7Ci0JCQlpZihkTWdyICE9IG51bGwpewotCQkJCWRNZ3IucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9OZXdBY3Rpdml0eURpYWdyYW1WaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL05ld0FjdGl2aXR5RGlhZ3JhbVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYzEyYTkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL05ld0FjdGl2aXR5RGlhZ3JhbVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5EZWxlZ2F0aW5nTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYXllcmVkUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLkludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy5lZGl0LnBhcnRzLlVNTEVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLkRpYWdyYW1JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1FZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuRWRpdFBhcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIE5ld0FjdGl2aXR5RGlhZ3JhbVZpZXdlciBleHRlbmRzIE5ld0Fic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB7Ci0KLQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXB1YmxpYyBOZXdBY3Rpdml0eURpYWdyYW1WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgT2JqZWN0IGFjdCkgewotCQlzdXBlcihwYXJlbnQsYWN0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyI2NyZWF0ZUVkaXRQYXJ0KGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlciwgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChPYmplY3QgZSwgSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQlpZihlIGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJdHJ5ewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KWU7Ci0JCQlBY3Rpdml0eURpYWdyYW1BZGFwdGVyIGFkYXB0ZXIgPSBuZXcgQWN0aXZpdHlEaWFncmFtQWRhcHRlcihhY3QpOwotCQkJYWRhcHRlci5zZXRWaWV3KGRpYWdyYW0pOwotCQkJYWRhcHRlci5zZXRTdXBwcmVzc2lvbihzdXApOwotCQkJYWRhcHRlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCWFkYXB0ZXIuc2V0VGFyZ2V0KGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCWFkYXB0ZXIuc2V0RWRpdGluZ0RvbWFpbigoSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbilUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihkaWFncmFtLmdldEVsZW1lbnQoKSkpOwotCQkJYWRhcHRlci5wb3B1bGF0ZURpYWdyYW0oKTsKLQkJCURpYWdyYW1FZGl0RG9tYWluIGRvbWFpbiA9IG5ldyBEaWFncmFtRWRpdERvbWFpbihudWxsKTsKLQkJCSgoSURpYWdyYW1HcmFwaGljYWxWaWV3ZXIpZ3JhcGhpY2FsVmlld2VyKS5zZXRFZGl0RG9tYWluKGRvbWFpbik7Ci0JCQlwYXJ0ID0gRWRpdFBhcnRTZXJ2aWNlLmdldEluc3RhbmNlKCkuY3JlYXRlR3JhcGhpY0VkaXRQYXJ0KGRpYWdyYW0pOwotCQkJZGlhZ3JhbS5nZXRFbGVtZW50KCkuZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOwotCQkJcmV0dXJuIHBhcnQ7Ci0JCQkKLQkJCX1jYXRjaChFeGNlcHRpb24gZXgpewotCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIjZ2V0RGlhZ3JhbVR5cGUoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1c7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERpYWdyYW1JbmZvKEdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQsIERpYWdyYW1JbmZvIGRpYWdyYW1JbmZvKSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSBwYXJ0LmdldENoaWxkcmVuKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCQlwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBvOwotCQkJCU9iamVjdCBtb2RlbCA9IHBhcnQuZ2V0TW9kZWwoKTsKLQkJCQlPYmplY3QgZSA9IG1vZGVsOwotCQkJCQotCQkJCWlmKGUgaW5zdGFuY2VvZiBWaWV3KXsKLQkJCQkJRU1vZGVsRWxlbWVudCBleCA9IChFTW9kZWxFbGVtZW50KSgoVmlldyllKS5nZXRFbGVtZW50KCk7Ci0JCQkJCWlmKGV4ICE9IG51bGwpewotCQkJCQkJZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGV4KTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJYm9vbGVhbiBzdXBwcmVzc2VkOwotCQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQlzdXBwcmVzc2VkID0gKChNZXRob2RFbGVtZW50KUJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KChFTW9kZWxFbGVtZW50KSgoTm9kZSltb2RlbCkuZ2V0RWxlbWVudCgpKSkuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3VwcHJlc3NlZCA9ICgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0U3VwcHJlc3NlZCgpCi0JCQkJCQkJCS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJfQotCi0JCQkJCQlJRmlndXJlIGYgPSBwYXJ0LmdldEZpZ3VyZSgpOwotCQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGYuZ2V0Qm91bmRzKCk7Ci0KLQkJCQkJCVN0cmluZyBhbHRUYWcgPSBudWxsOwotCQkJCQkJaWYgKGYgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCQkJCQlhbHRUYWcgPSAoKFdyYXBMYWJlbCkgZikuZ2V0VGV4dCgpOwotCQkJCQkJfQotCQkJCQkJZGlhZ3JhbUluZm8uYWRkQXJlYSgoTWV0aG9kRWxlbWVudCkgZSwgYm91bmRzLngsCi0JCQkJCQkJYm91bmRzLnksIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCwgYWx0VGFnLCBzdXBwcmVzc2VkKTsKLQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJFZGl0UGFydCBub3QgaGFuZGxlZDogIiArIG8pOwotCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gbmV3IERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKTsKLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQljb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCkgewotCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRDb250cm9sKCkuc2V0QmFja2dyb3VuZCgKLQkJCQlDb2xvckNvbnN0YW50cy5saXN0QmFja2dyb3VuZCk7Ci0JCURpYWdyYW1HcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKERpYWdyYW1HcmFwaGljYWxWaWV3ZXIpIGdldEdyYXBoaWNhbFZpZXdlcigpOwotCi0JCURpYWdyYW1Sb290RWRpdFBhcnQgcm9vdCA9IChEaWFncmFtUm9vdEVkaXRQYXJ0KSBFZGl0UGFydFNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVSb290RWRpdFBhcnQoZ2V0RGlhZ3JhbSgpKTsKLQkJTGF5ZXJlZFBhbmUgcHJpbnRhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlBSSU5UQUJMRV9MQVlFUlMpOwotCQlGcmVlZm9ybUxheWVyIGV4dExhYmVsc0xheWVyID0gbmV3IEZyZWVmb3JtTGF5ZXIoKTsKLQkJZXh0TGFiZWxzTGF5ZXIuc2V0TGF5b3V0TWFuYWdlcihuZXcgRGVsZWdhdGluZ0xheW91dCgpKTsKLQkJcHJpbnRhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoZXh0TGFiZWxzTGF5ZXIsCi0JCQkJVU1MRWRpdFBhcnRGYWN0b3J5LkVYVEVSTkFMX05PREVfTEFCRUxTX0xBWUVSLAotCQkJCUxheWVyQ29uc3RhbnRzLlBSSU1BUllfTEFZRVIpOwotCQlMYXllcmVkUGFuZSBzY2FsYWJsZUxheWVycyA9IChMYXllcmVkUGFuZSkgcm9vdAotCQkJCS5nZXRMYXllcihMYXllckNvbnN0YW50cy5TQ0FMQUJMRV9MQVlFUlMpOwotCQlGcmVlZm9ybUxheWVyIHNjYWxlZEZlZWRiYWNrTGF5ZXIgPSBuZXcgRnJlZWZvcm1MYXllcigpOwotCQlzY2FsZWRGZWVkYmFja0xheWVyLnNldEVuYWJsZWQoZmFsc2UpOwotCQlzY2FsYWJsZUxheWVycy5hZGRMYXllckFmdGVyKHNjYWxlZEZlZWRiYWNrTGF5ZXIsCi0JCQkJTGF5ZXJDb25zdGFudHMuU0NBTEVEX0ZFRURCQUNLX0xBWUVSLAotCQkJCURpYWdyYW1Sb290RWRpdFBhcnQuREVDT1JBVElPTl9VTlBSSU5UQUJMRV9MQVlFUik7Ci0JCXZpZXdlci5zZXRSb290RWRpdFBhcnQocm9vdCk7Ci0JCXZpZXdlci5zZXRFZGl0UGFydEZhY3RvcnkoY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvTmV3V1BEZXBlbmRlbmN5RGlhZ3JhbVZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvTmV3V1BEZXBlbmRlbmN5RGlhZ3JhbVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYzJjN2E3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL05ld1dQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkRlbGVnYXRpbmdMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxheWVyZWRQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkRpYWdyYW1FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuSURpYWdyYW1HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5lZGl0cGFydC5FZGl0UGFydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdXUERlcGVuZGVuY3lEaWFncmFtVmlld2VyIGV4dGVuZHMKLQkJTmV3QWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqLwotCXB1YmxpYyBOZXdXUERlcGVuZGVuY3lEaWFncmFtVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIE9iamVjdCB3cmFwcGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgd3JhcHBlcik7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIjY3JlYXRlRWRpdFBhcnQoamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyLCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb24pCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KE9iamVjdCBlLCBJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQlEaWFncmFtIG1vZGVsID0oRGlhZ3JhbSlkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJCW1vZGVsLnNldFN1cHByZXNzaW9uKHN1cCk7Ci0vLwkJCW1vZGVsLnNldE9iamVjdChlKTsKLQkJCURpYWdyYW1FZGl0RG9tYWluIGRvbWFpbiA9IG5ldyBEaWFncmFtRWRpdERvbWFpbihudWxsKTsKLQkJCSgoSURpYWdyYW1HcmFwaGljYWxWaWV3ZXIpZ3JhcGhpY2FsVmlld2VyKS5zZXRFZGl0RG9tYWluKGRvbWFpbik7Ci0JCQlwYXJ0ID0gRWRpdFBhcnRTZXJ2aWNlLmdldEluc3RhbmNlKCkuY3JlYXRlR3JhcGhpY0VkaXRQYXJ0KGRpYWdyYW0pOwotCQkJcmV0dXJuIHBhcnQ7Ci0JCX0KLQkJaWYocGFydCA9PSBudWxsKXsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiRWRpdHBhcnQgZm9yICIrIGUgKyIgaXMgbm90IGNyZWF0ZWQiKTsKLQkJfQotCQlyZXR1cm4gcGFydDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyI2dldERpYWdyYW1UeXBlKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWdyYW1UeXBlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1k7Ci0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcikgZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0JCURpYWdyYW1Sb290RWRpdFBhcnQgcm9vdCA9IChEaWFncmFtUm9vdEVkaXRQYXJ0KSBFZGl0UGFydFNlcnZpY2UKLQkJLmdldEluc3RhbmNlKCkuY3JlYXRlUm9vdEVkaXRQYXJ0KGdldERpYWdyYW0oKSk7Ci0JCUxheWVyZWRQYW5lIHByaW50YWJsZUxheWVycyA9IChMYXllcmVkUGFuZSkgcm9vdAotCQkJCS5nZXRMYXllcihMYXllckNvbnN0YW50cy5QUklOVEFCTEVfTEFZRVJTKTsKLQkJRnJlZWZvcm1MYXllciBleHRMYWJlbHNMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCWV4dExhYmVsc0xheWVyLnNldExheW91dE1hbmFnZXIobmV3IERlbGVnYXRpbmdMYXlvdXQoKSk7Ci0JCXByaW50YWJsZUxheWVycy5hZGRMYXllckFmdGVyKGV4dExhYmVsc0xheWVyLAotCQkJCURpYWdyYW1FZGl0UGFydEZhY3RvcnkuRVhURVJOQUxfTk9ERV9MQUJFTFNfTEFZRVIsCi0JCQkJTGF5ZXJDb25zdGFudHMuUFJJTUFSWV9MQVlFUik7Ci0JCUxheWVyZWRQYW5lIHNjYWxhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlNDQUxBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgc2NhbGVkRmVlZGJhY2tMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCXNjYWxlZEZlZWRiYWNrTGF5ZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNjYWxhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoc2NhbGVkRmVlZGJhY2tMYXllciwKLQkJCQlMYXllckNvbnN0YW50cy5TQ0FMRURfRkVFREJBQ0tfTEFZRVIsCi0JCQkJRGlhZ3JhbVJvb3RFZGl0UGFydC5ERUNPUkFUSU9OX1VOUFJJTlRBQkxFX0xBWUVSKTsKLQkJdmlld2VyLnNldFJvb3RFZGl0UGFydChyb290KTsKLQkJdmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvV1BEZXBlbmRlbmN5RGlhZ3JhbVZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvV1BEZXBlbmRlbmN5RGlhZ3JhbVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZDdhOThhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL1dQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuV1BEaWFncmFtRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGdyYXBoaWNhbCB2aWV3ZXIgZm9yIHRoZSBXUCBEZXBlbmRlbmN5IGRpYWdyYW0uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXUERlcGVuZGVuY3lEaWFncmFtVmlld2VyIGV4dGVuZHMgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIHsKLQotCXB1YmxpYyBXUERlcGVuZGVuY3lEaWFncmFtVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQotCX0KLQotCXByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IFdQRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChPYmplY3QgZSwgSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIGRpYWdyYW0gPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKTsKLQkJZGlhZ3JhbS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJaWYgKHN1cCAhPSBudWxsKSB7Ci0JCQlkaWFncmFtLnNldFN1cHByZXNzaW9uKHN1cCk7Ci0JCX0KLQotCQlkaWFncmFtLnNldE9iamVjdChlKTsKLQkJRWRpdFBhcnQgcGFydCA9IG5ldyBEaWFncmFtRWRpdFBhcnQoZGlhZ3JhbSk7Ci0JCXBhcnQuc2V0TW9kZWwoZGlhZ3JhbSk7Ci0JCXJldHVybiBwYXJ0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGEyZTMyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBncmFwaGljYWwgdmlld2VycyBmb3IgdGhlIGFjdGl2aXR5IGRpYWdyYW1zLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdQZXJzcGVjdGl2ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1BlcnNwZWN0aXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNzNiMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1BlcnNwZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3Q29uZmlndXJhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3TGlicmFyeVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3TWV0aG9kUGx1Z2luV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFRoZSBNZXRob2QgQXV0aG9yaW5nIHBlcnNwZWN0aXZlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ1BlcnNwZWN0aXZlIGltcGxlbWVudHMgSVBlcnNwZWN0aXZlRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgQXV0aG9yaW5nIHBlcnNwZWN0aXZlIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNQRUNUSVZFX0lEID0gQXV0aG9yaW5nUGVyc3BlY3RpdmUuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3RvcnkjY3JlYXRlSW5pdGlhbExheW91dChJUGFnZUxheW91dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0IGxheW91dCkgewotCQlsYXlvdXQuc2V0RWRpdG9yQXJlYVZpc2libGUodHJ1ZSk7Ci0JCVN0cmluZyBlZGl0b3JBcmVhID0gbGF5b3V0LmdldEVkaXRvckFyZWEoKTsKLQkJbGF5b3V0Ci0JCQkJLmFkZFZpZXcoTGlicmFyeVZpZXcuVklFV19JRCwgSVBhZ2VMYXlvdXQuTEVGVCwgMC4zMGYsCi0JCQkJCQllZGl0b3JBcmVhKTsKLQkJbGF5b3V0LmFkZFBsYWNlaG9sZGVyKElQYWdlTGF5b3V0LklEX1BST1BfU0hFRVQsIElQYWdlTGF5b3V0LkJPVFRPTSwKLQkJCQkwLjY1ZiwgZWRpdG9yQXJlYSk7Ci0JCWxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dChOZXdMaWJyYXJ5V2l6YXJkLldJWkFSRF9JRCk7Ci0JCWxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dChOZXdNZXRob2RQbHVnaW5XaXphcmQuV0laQVJEX0lEKTsKLQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KE5ld0NvbmZpZ3VyYXRpb25XaXphcmQuV0laQVJEX0lEKTsKLQkJUGVyc3BlY3RpdmVMaXN0VXRpbC5hZGRQZXJzcGVjdGl2ZVNob3J0TGlzdChsYXlvdXQpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoZSBBdXRob3JpbmcgcGVyc3BlY3RpdmUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJldmlvdXNseSBhY3RpdmUgcGVyc3BlY3RpdmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQZXJzcGVjdGl2ZURlc2NyaXB0b3Igb3BlbigpIHsKLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQlJUGVyc3BlY3RpdmVSZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKTsKLQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3Igb2xkUGVyc3BlY3RpdmUgPSBhY3RpdmVQYWdlLmdldFBlcnNwZWN0aXZlKCk7Ci0JCQlpZiAoIW9sZFBlcnNwZWN0aXZlLmdldElkKCkuZXF1YWxzKFBFUlNQRUNUSVZFX0lEKSkgewotCQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgcGVyc3BlY3RpdmUgPSByZWdpc3RyeQotCQkJCQkJLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZChQRVJTUEVDVElWRV9JRCk7Ci0JCQkJYWN0aXZlUGFnZS5zZXRQZXJzcGVjdGl2ZShwZXJzcGVjdGl2ZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gb2xkUGVyc3BlY3RpdmU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSUhlbHBDb250ZXh0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZjQzZDRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSUhlbHBDb250ZXh0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7Ci0KLS8qKgotICogQXV0aG9yaW5nIFVJIGhlbHAgY29udGV4dHMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRob3JpbmdVSUhlbHBDb250ZXh0cyB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUk9PVF9DT05URVhUID0gQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArICIuIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRklMRV9ORVdfTElCUkFSWV9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmaWxlX25ld19saWJyYXJ5X2NvbnRleHQiOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nCUZJTEVfTkVXX1BMVUdJTl9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmaWxlX25ld19wbHVnaW5fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZwlGSUxFX05FV19DT05GSUdVUkFUSU9OX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZpbGVfbmV3X2NvbmZpZ3VyYXRpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGSUxFX09QRU5fTElCUkFSWV9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmaWxlX29wZW5fbGlicmFyeV9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGSUxFX09QRU5fQ09ORklHVVJBVElPTl9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmaWxlX29wZW5fY29uZmlndXJhdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGSUxFX0lNUE9SVF9DT05URVhUID0gUk9PVF9DT05URVhUICsgImZpbGVfaW1wb3J0X2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZJTEVfRVhQT1JUX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAiZmlsZV9leHBvcnRfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgTElCUkFSWV9OQVZJR0FUT1JfVklFV19DT05URVhUID0gUk9PVF9DT05URVhUICsgICJsaWJyYXJ5X25hdmlnYXRvcl92aWV3X2NvbnRleHQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgQ09ORklHVVJBVElPTl9WSUVXX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImNvbmZpZ3VyYXRpb25fdmlld19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIFBMVUdJTl9FRElUT1JfREVTQ1JJUFRJT05fQUxMX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgInBsdWdpbl9lZGl0b3JfZGVzY3JpcHRpb25fYWxsX2NvbnRleHQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgQ09ORklHVVJBVElPTl9FRElUT1JfQUxMX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImNvbmZpZ3VyYXRpb25fZWRpdG9yX2FsbF9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIENPTlRFTlRfUEFDS0FHRV9FRElUT1JfQUxMX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImNvbnRlbnRfcGFja2FnZV9lZGl0b3JfYWxsX2NvbnRleHQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX1JPTEVfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3Jfcm9sZV9jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX1RBU0tfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3JfdGFza19jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX1dPUktfUFJPRFVDVF9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl93b3JrX3Byb2R1Y3RfY29udGV4dF9oZWxwX0lEIjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEVESVRPUl9HVUlEQU5DRV9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl9ndWlkYW5jZV9jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX0RJU0NJUExJTkVfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3JfZGlzY2lwbGluZV9jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX0RJU0NJUExJTkVfR1JPVVBJTkdfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3JfZGlzY2lwbGluZV9ncm91cGluZ19jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX0RPTUFJTl9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl9kb21haW5fY29udGV4dF9oZWxwX0lEIjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEVESVRPUl9XT1JLX1BST0RVQ1RfVFlQRV9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl93b3JrX3Byb2R1Y3RfdHlwZV9jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX1JPTEVfU0VUX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX3JvbGVfc2V0X2NvbnRleHRfaGVscF9JRCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfUk9MU0VfU0VUX0dST1VQSU5HX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX3JvbHNlX3NldF9ncm91cGluZ19jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX1RPT0xfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3JfdG9vbF9jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfQ1VTVE9NX0NBVEVHT1JZX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX2N1c3RvbV9jYXRlZ29yeV9jb250ZXh0X2hlbHBfSUQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfREVTQ1JJUFRJT05fR0VORVJBTF9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9nZW5lcmFsX2NvbnRleHQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfREVTQ1JJUFRJT05fREVUQUlMX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2RldGFpbF9jb250ZXh0IiAgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX0RFU0NSSVBUSU9OX05PVEFUSU9OX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX25vdGF0aW9uX2NvbnRleHQiICA7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfREVTQ1JJUFRJT05fVEFJTE9SSU5HX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX3RhaWxvcmluZ19jb250ZXh0IiA7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX0RFU0NSSVBUSU9OX1ZFUlNJT05fQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fdmVyc2lvbl9jb250ZXh0IiA7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX0RFU0NSSVBUSU9OX0VMRU1FTlRfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fZWxlbWVudF9jb250ZXh0IiA7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX0RFU0NSSVBUSU9OX0lDT05fQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25faWNvbl9jb250ZXh0IiA7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEVESVRPUl9DUF9ERVNDUklQVElPTl9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl9jcF9kZXNjcmlwdGlvbl9jb250ZXh0X2hlbHBfSUQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX0RQX0RFU0NSSVBUSU9OX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX2RwX2Rlc2NyaXB0aW9uX2NvbnRleHRfaGVscF9JRCIgOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGT1JNX0VESVRPUl9QUk9DRVNTX1dCU19DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmb3JtX2VkaXRvcl9wcm9jZXNzX3dic19jb250ZXh0IiAgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX1BST0NFU1NfT0JTX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZvcm1fZWRpdG9yX3Byb2Nlc3Nfb2JzX2NvbnRleHQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfUFJPQ0VTU19QQlNfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZm9ybV9lZGl0b3JfcHJvY2Vzc19wYnNfY29udGV4dCIgIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGT1JNX0VESVRPUl9QUk9DRVNTX0FMTEJTX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAiZm9ybV9lZGl0b3JfcHJvY2Vzc19hbGxic19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBDT05GSUdVUkFUSU9OX1BVQkxJU0hfV0laQVJEX0FMTF9QQUdFU19DT05URVhUID0gUk9PVF9DT05URVhUICsgICJjb25maWd1cmF0aW9uX3B1Ymxpc2hfd2l6YXJkX2FsbF9wYWdlc19jb250ZXh0IiA7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIFJJQ0hfVEVYVF9FRElUT1JfQ09OVEVYVF9JRCA9IFJPT1RfQ09OVEVYVCArICAicmljaF90ZXh0X2VkaXRvcl9jb250ZXh0X0lEIiAgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX0FDVElWSVRZX0RJQUdSQU1fQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICJmb3JtX2VkaXRvcl9hY3Rpdml0eV9kaWFncmFtX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX0FDVElWSVRZX0RFVEFJTF9ESUFHUkFNX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyJmb3JtX2VkaXRvcl9hY3Rpdml0eV9kZXRhaWxfZGlhZ3JhbV9jb250ZXh0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX1dQX0RFUEVOREVOQ1lfRElBR1JBTV9DT05URVhUID0gUk9PVF9DT05URVhUICsgImZvcm1fZWRpdG9yX3dwX2RlcGVuZGVuY3lfZGlhZ3JhbV9jb250ZXh0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIExJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEID0gUk9PVF9DT05URVhUICsgImxpYnJhcnlfdmlld19ub2RlX2NvbnRleHRfbm90X2ltcGxlbWVudGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nICBMQVlPVVRfRkxBVF9BQ1RJT04gPSBST09UX0NPTlRFWFQgKyAibGF5b3V0X2ZsYXRfYWN0aW9uIjsgCSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgIExBWU9VVF9ISUVSQVJDSElDQUxfQUNUSU9OID0gUk9PVF9DT05URVhUICsgImxheW91dF9oaWVyYXJjaGljYWxfYWN0aW9uIjsgCSAvLyROT04tTkxTLTEkCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlJbWFnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSUltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZGJiYjlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSUltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFNoYXJlZCBpbWFnZXMgdXNlZCBpbiB0aGUgQXV0aG9yaW5nIFVJLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ1VJSW1hZ2VzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OQU1FX0NPTExBUFNFRCA9ICJmdWxsL29iajE2L0NvbGxhcHNlZC5naWYiOyAvLyROT04tTkxTLTEkIAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OQU1FX0VYUEFOREVEID0gImZ1bGwvb2JqMTYvRXhwYW5kZWQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX05BTUVfUkVGUkVTSCA9ICJmdWxsL2V0b29sMTYvUmVmcmVzaC5naWYiOyAvLyROT04tTkxTLTEkIAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OQU1FX1NUT1AgPSAiZnVsbC9ldG9vbDE2L1N0b3AuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX05BTUVfUFJJTlQgPSAiZnVsbC9ldG9vbDE2L1ByaW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTkFNRV9PVlJfRVJST1IgPSAiZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OQU1FX0xBWU9VVF9GTEFUID0gImZ1bGwvZXRvb2wxNi9mbGF0TGF5b3V0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OQU1FX0xBWU9VVF9ISUVSQVJDSElDQUwgPSAiZnVsbC9ldG9vbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19DT0xMQVBTRUQgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX05BTUVfQ09MTEFQU0VEKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0VYUEFOREVEID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19OQU1FX0VYUEFOREVEKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX1JFRlJFU0ggPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX05BTUVfUkVGUkVTSCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19TVE9QID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19OQU1FX1NUT1ApOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfUFJJTlQgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX05BTUVfUFJJTlQpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX09WUl9FUlJPUiA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJTUdfTkFNRV9PVlJfRVJST1IpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfTEFZT1VUX0ZMQVQgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX05BTUVfTEFZT1VUX0ZMQVQpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0xBWU9VVF9ISUVSQVJDSElDQUwgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX05BTUVfTEFZT1VUX0hJRVJBUkNISUNBTCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19CQUNLID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQkFDSyk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19DT0xMQVBTRUQgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfTkFNRV9DT0xMQVBTRUQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfRVhQQU5ERUQgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfTkFNRV9FWFBBTkRFRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19GT1JXQVJEID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfRk9SV0FSRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19SRUZSRVNIID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX05BTUVfUkVGUkVTSCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19TVE9QID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX05BTUVfU1RPUCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QUklOVCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldFNoYXJlZEltYWdlKElNR19OQU1FX1BSSU5UKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19PVlJfRVJST1IgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfTkFNRV9PVlJfRVJST1IpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfTEFZT1VUX0ZMQVQgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfTkFNRV9MQVlPVVRfRkxBVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19MQVlPVVRfSElFUkFSQ0hJQ0FMID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX05BTUVfTEFZT1VUX0hJRVJBUkNISUNBTCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgzYzlmZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbC5JbWFnZURlc2NyaXB0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsLlByb2JsZW1NYXJrZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBBdXRob3JpbmcgVUkgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXV0aG9yaW5nVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgQXV0aG9yaW5nVUlQbHVnaW4gcGx1Z2luOwotCi0JcHJpdmF0ZSBQcm9ibGVtTWFya2VyTWFuYWdlciBmUHJvYmxlbU1hcmtlck1hbmFnZXI7Ci0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSBmSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBdXRob3JpbmdVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQkKLQkJLy8gSW5pdGlhbGl6ZSB0aGUgQXV0aG9yaW5nIFVJIHNlcnZpY2UuCi0JCUF1dGhvcmluZ1VJU2VydmljZS5nZXRJbnN0YW5jZSgpLnN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEF1dGhvcmluZ1VJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgUHJvYmxlbU1hcmtlck1hbmFnZXIgZ2V0UHJvYmxlbU1hcmtlck1hbmFnZXIoKSB7Ci0JCWlmIChmUHJvYmxlbU1hcmtlck1hbmFnZXIgPT0gbnVsbCkKLQkJCWZQcm9ibGVtTWFya2VyTWFuYWdlcj0gbmV3IFByb2JsZW1NYXJrZXJNYW5hZ2VyKCk7Ci0JCXJldHVybiBmUHJvYmxlbU1hcmtlck1hbmFnZXI7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkgZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuaW50ZXJuYWxHZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5IGludGVybmFsR2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKSB7Ci0JCWlmIChmSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkgPT0gbnVsbCkKLQkJCWZJbWFnZURlc2NyaXB0b3JSZWdpc3RyeT0gbmV3IEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCk7Ci0JCXJldHVybiBmSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHQpIHsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKHQpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSVJlc291cmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY4OWE2NGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTExICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEF1dGhvaW5nIFVJIHJlc291cmNlcwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBdXRob3JpbmdVSVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEF1dGhvcmluZ1VJUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUuCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbk9yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbk9yZGVyRGlhbG9nX05hdmlnYXRpb25WaWV3czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFzc2lnblBhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXRlZ29yaWVzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlUGFydHNQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRpb25QYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZXNQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2FyZHVucmVzb2x2ZWRyZWY7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkYW5jZVBhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmV2aWV3UGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb21wdERlbGV0ZUN1c3RvbUNhdGVnb3J5QmVmb3JlUmVtb3ZlTGFzdFJlZlRvSXQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZlcmVuY2VzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZmVyZW5jZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmZXJlbmNlV29ya2Zsb3dQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZXNQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldHNQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RlcHNQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza3NQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbE1lbnRvcnNQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrSXRlbXNTZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0l0ZW1zU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVwZW5kZW5jaWVzU2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVwZW5kZW5jaWVzU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGV0YWlsU2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VuZXJhbEluZm9TZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGljb25TZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm90YXRpb25TZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub3RhdGlvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGFmZmluZ1NlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YWZmaW5nU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RlcHNTZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGVwc1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhaWxvcmluZ1NlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhaWxvcmluZ1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhcmlhYmlsaXR5U2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uSW5mb1NlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkaXRpb25hbEluZm9fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGxpY2F0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25MYWJlbF9lZGl0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFsdGVybmF0aXZlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXNzaWdubWVudEFwcHJvYWNoZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF1dGhvcnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhY2tncm91bmRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VFbGVtZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYXNlR3VpZGFuY2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyaWVmRGVzY3JpcHRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2NyaXB0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYWNrdXBiZWZvcmVzYXZlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBicmllZk91dGxpbmVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoYW5nZURhdGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoYW5nZURlc2NyaXB0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0l0ZW1zX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250cmlidXRlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYWxDb250cmlidXRlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udHJpYnV0ZXNfdG9fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlbmRzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlbmRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVybmFsRGVzY3JpcHRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVybmFsSWRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdvYWxzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBhY3RPZk5vdEhhdmluZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcga2V5Q29uc2lkZXJhdGlvbnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxldmVsc09mQWRvcHRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1haW5EZXNjcmlwdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3RWxlbWVudF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm90QXBwbGljYWJsZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFja2FnaW5nR3VpZGFuY2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXNlbnRhdGlvbk5hbWVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb21wdGZvcmxpYmFyeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5hYmxlSGVhbHRoQ2hlY2tfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2JsZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1cnBvc2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYXNvbkZvck5vdE5lZWRpbmdfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhbFJlcGxhY2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlbmRzUmVwbGFjZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcHJlc2VudGF0aW9uT3B0aW9uc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXR0YWNoZWRGaWxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBza2lsbHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0ZXBzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGVwc19uYW1lX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdG9wX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmludF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3lub255bXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHR5cGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZXBDb3B5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYWNrX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdfcGx1Z2luOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW92ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuaXF1ZUlkX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YXJpYWJpbGl0eVR5cGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXR0YWNoQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2VCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoYW5nZVR5cGVCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsZWFyQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRldGFjaEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhZ3JhbV9zYXZlRXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb3duQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXJlY3RvcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9yZGVyQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0QnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbmFtZUFjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW5hbWVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVBc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0QnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXNlbGVjdEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VEZWZhdWx0QnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3SGlzdG9yeUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVRhc2tzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVRhc2tzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlR3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1JvbGVzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1JvbGVzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrUm9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrUm9sZXNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbW9kaWZ5X21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrUm9sZXNQYWdlX2NvbmZpcm1fdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0d1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3JlbW92ZVVucmVzb2x2ZWRSZWZlcmVuY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3Nob3dPd25lckluTGlicmFyeVZpZXc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0X1Rhc2tzX0F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdF9UYXNrc19NdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZVJlZmVyZW5jZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXRlZ29yeUd1aWRhbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Vc2VEZWZhdWx0RGlyZWN0b3J5QnV0dG9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5Xb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbFRvb2xNZW50b3JzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xUb29sTWVudG9yc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xUb29sTWVudG9yc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3UGx1Z2luV2l6YXJkX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3UGx1Z2luV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld1BsdWdpbldpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld1BsdWdpbkVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld1BsdWdpbkVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXREaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW5hbWVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3YXJuaW5nRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkQ29uZmlnRXJyb3JEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXREZWZhdWx0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0UHJvY2Vzc0VsZW1lbnRFcnJvckRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUxpYnJhcnlEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlQXNzb2NpYXRpb25EaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vT3BlbkxpYnJhcnlFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVDb25maWdFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVDb25maWdFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnRlcm5hbEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRQcmVzZW50YXRpb25OYW1lRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZENvbmZpZ0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNldERlZmF1bHRDb25maWdFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuTGlicmFyeUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVMaWJyYXJ5RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUxpYnJhcnlUb0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRBbHJlYWR5RGVsZXRlZEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW50ZXJuYWxFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cGdyYWRlTGlicmFyeUVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVVcGdyYWRlZExpYnJhcnlFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuaW5nTGlicmFyeVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmluZ0xpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZGluZ0xpYnJhcnlFbGVtZW50c1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmluZ1VwZ3JhZGVkRWxlbWVudHNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZpbmdUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZpbmdGaWxlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpeGluZ0NvbnRlbnREZXNjcmlwdGlvbkdVSURzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRpbmdJbnZhbGlkUmVmZXJlbmNlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENoYW5nZUhpc3RvcnlEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDaGFuZ2VIaXN0b3J5RGlhbG9nX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlybURlbGV0ZURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpcm1EZWxldGVEaWFsb2dfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlybURlbGV0ZURpYWxvZ19tc2dXaXRoUmVmZXJlbmNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEaWFsb2dfbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX2Vycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyX25vb3BlbmxpYnJhcnk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJfbG9hZGluZ2xpYnJhcnk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtc2dfcmVsb2FkTGlicmFyeTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbG9hZERpYWxvZ19tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVsb2FkRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dzX01vdmVEaWFsb2dfZXJyb3JNZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UxOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdWaWV3UGFnZVZpZXdFeGlzdHNEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnVmlld1BhZ2Vfdmlld3M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2x1bW5zZWxlY3Rpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlX2FkZFZpZXdCdXR0b25UZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnVmlld1BhZ2VfcmVtb3ZlVmlld0J1dHRvblRleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdWaWV3UGFnZV9tYWtlRGVmYXVsdEJ1dHRvblRleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdWaWV3UGFnZVZpZXdFeGlzdHNEaWFsb2dfbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvblRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdTZWN0aW9uTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoYW5nZUFjdGl2aXR5VHlwZVdhcm5pbmdEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBc3NvY2lhdGlvbkZvcm1QYWdlX0JyaWVmRGVzY3JpcHRpb25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZEVsZW1lbnREZXNjcmlwdGlvbkVtcHR5TmFtZURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZEVsZW1lbnREZXNjcmlwdGlvbkVtcHR5TmFtZURpYWxvZ19tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25SZW1vdmVSZWZDb25maXJtX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jb25maXJtUmVuYW1lX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2Nhbm5vdFJlbmFtZVBsdWdpbkZvbGRlcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbl9tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV9tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uU2VjdGlvblRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NEZXNjcmlwdGlvbl9kZWZhdWx0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0Rlc2NyaXB0aW9uX3NlbGVjdENvbmZpZ3VyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRGVsZXRlQWN0aW9uX2RlbGV0ZWNvZmlybV90ZXh0MDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NEZWxldGVBY3Rpb25fc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdIZWxwZXJIZWFsdGhDaGVja0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdIZWxwZXJfcGVyZm9ybUhlYWx0aENoZWNrOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdHRhY2hHdWlkYW5jZUZpbGVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVFbGVtZW50RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlTmV3RWxlbWVudEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRsZ1RpdGxlX3JlbG9hZExpYnJhcnk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVFbGVtZW50RXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlQ29uZmlnRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX2NoYW5nZUJvdW5kc0NvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfY2hhbmdlTmFtZUNvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfY2hhbmdlTmFtZUNvbW1hbmRfdW5kb01lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfY2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfY3JlYXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9jcmVhdGVMaW5rQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9jcmVhdGVOb2RlQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9kZWxldGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX2RlbGV0ZUNvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfZGVsZXRlTGlua0NvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfbW92ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfcmVjb25uZWN0TGlua0NvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfdmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl92YWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfd29ya1Byb2R1Y3ROb2RlRWRpdFBhcnRfdmFsaWRhdGVNZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uc19FbGVtZW50c1ZpZXdEZWxldGVBY3Rpb25fbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvck1lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclJlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24xOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9pbnZhbGlkRWRpdG9yTXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvck1lc3NhZ2UxOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVuYW1lRXJyb3JfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW5hbWVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RFbGVtZW50RGlhbG9nX3NlbGVjdGVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVzY3JpcHRpb25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9TZWxlY3RBbGxCdXR0b25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5FbGVtZW50V29ya2JlbmNoQWN0aW9uRGVsZWdhdGVfZWRpdF90ZXh0MDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ19tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9JY29uRmlsZUNob29zZXJEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5TmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZXNjcmlwdGlvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfRGVzZWxlY3RBbGxCdXR0b25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld19taWdyYXRpb25fZGlyX2RsZ19kZXNjcmlwdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RlbXBsYXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RlbXBsYXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeURlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX0RlZmF1bHRCcmllZkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VEZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1zX0d1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlX2FscmVhZHlBdHRhY2hlZF9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdMaWJyYXJ5RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TGlicmFyeUludGVybmxFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdMaWJyYXJ5RXJyb3JfcmVhc29uMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0xpYnJhcnlFcnJvcl9yZWFzb24yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TGlicmFyeUVycm9yX3JlYXNvbjM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdMaWJyYXJ5RXJyb3JfYWR2aWNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19FeHRlcm5hbElEOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19QdXJwb3NlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19TY29wZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfVXNhZ2VOb3RlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfQWx0ZXJuYXRpdmVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Ib3dUb1N0YWZmOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19LZXlDb25zaWRlcmF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19TY2FsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfUmlza0xldmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Fc3RpbWF0aW5nVGVjaG5pcXVlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19UeXBlT2ZDb250cmFjdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhY2tCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcndhcmRCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcndhcmRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0b3BCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZnJlc2hCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZnJlc2hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld25hbWVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByaW50QnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NZXRob2RFZGl0b3JfbWVudTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QYXJlbnRQYWdlX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xpc3RQYWdlX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RyZWVQYWdlX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RhYmxlUGFnZV9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9UYWJsZVRyZWVQYWdlX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX09iamVjdENvbHVtbl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TZWxmQ29sdW1uX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX05vT2JqZWN0U2VsZWN0ZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU2luZ2xlT2JqZWN0U2VsZWN0ZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTXVsdGlPYmplY3RTZWxlY3RlZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9PcGVuRWRpdG9yRXJyb3JfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV2l6YXJkX2NhdGVnb3J5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01ldGhvZE1vZGVsV2l6YXJkX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01ldGhvZE1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01ldGhvZEVkaXRvcl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NZXRob2RFZGl0b3JGaWxlbmFtZURlZmF1bHRCYXNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRXh0ZW5zaW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dpemFyZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01vZGVsT2JqZWN0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hNTEVuY29kaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hNTEVuY29kaW5nQ2hvaWNlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRmlsZUNvbmZsaWN0X2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1dBUk5fRmlsZUNvbmZsaWN0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkTGlua0RpYWxvZ19saW5rVHlwZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaW5rQ2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGhlaWdodExhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aWR0aExhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfMjA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfMjE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfMjI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfMzU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfMzY7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhbHRUYWdMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1hZ2VTaXplTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX05hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1ByZXNlbnRhdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0luZGV4OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9QcmVkZWNlc3NvcnM7Ci0KLQkvLyBwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9TZWxlY3RlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDaGVja2xpc3RPcmRlcl9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld19yZW5hbWluZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9Nb2RlbEluZm87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1ByZWZpeDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVEaWFsb2dfbW92ZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2hlY2tsaXN0T3JkZXJfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1JlcGV0YWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfT25nb2luZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1N5bmNocm9uaXphdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfRXZlbnREcml2ZW47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0RlbGl2ZXJhYmxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9PcHRpb25hbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckRpYWxvZ19UeXBlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJEaWFsb2dfRXhwYW5kQWxsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW92ZURpYWxvZ19tb3ZpbmdfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbldhcm5pbmc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWRTaGFwZUljb25FcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfTmFtZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9OYW1lTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9uZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TGlicmFyeVdpemFyZF90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV9kZXNjcmlwdGlvbl8yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeVBhdGhMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeVR5cGVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uV2l6YXJkX3dpbmRvd1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudHNWaWV3X3JlcGxhY2Vpbmd3aXRoZm9ybWF0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbldhcm5pbmc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXNzYWdlTGFiZWxQcm92aWRlcl91bnNlbGVjdGVkcGFja2FnZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbkVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RlcHNPcmRlckRpYWxvZ19zdGVwczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0ZXBzT3JkZXJEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1BsYW5uZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzcGVjaWZ5ZGlyZWN0b3J5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX011bHRpcGxlT2NjdXJyZW5jZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0VudHJ5U3RhdGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0V4aXRTdGF0ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbHVtbnN0b0FkZF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9UeXBlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9UZWFtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkNoZWF0c2hlZXRWaWV3X3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbFVwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbERvd247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlRG93bjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvcHk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJEaWFsb2dfUGF0dGVybl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeUVkaXRvcl90aXRsZTsKLQotCS8vIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VWaWV3X3NlbGVjdGVkX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWVzc2FnZVZpZXdfZXJybXNnX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfZXJyX3NhdmluZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycl9jb3B5aW5nX2ZpbGVfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJfY29weWluZ19maWxlX2Vycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyX2NvcHlpbmdfZmlsZV9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJfcHJvY2Vzc2luZ19maWxlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdENvbmZpZ3VyYXRpb25fdG9vbHRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXREaWFsb2dfbXNnQ2Fubm90RWRpdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVUaGlzQWN0aW9uX3NhdmVvYmplY3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfcmVwbGFjZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRXh0ZW5kOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW92ZURpYWxvZ19kZXN0aW5hdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hvb3NlRGVmYXVsdERpcmVjdG9yeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzczI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZEltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkZEltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3dwZEltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX25vdGFGaWxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2Fzc2lnbkJ1dHRvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19lbnRlcmVkSW1hZ2VOb3RGb3VuZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19zZWxlY3RlZEltYWdlTm90Rm91bmQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURJbWFnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBRERJbWFnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VXUERJbWFnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvbnRyaWJ1dGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXBsYWNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRGlhZ3JhbXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX2FjdGlvbl9kZWVwQ29weTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfaGlkZVRvb2xUaXA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzQWxsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyRGlhbG9nX1BhdHRlcm5fZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9UcmVlVGl0bGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0xvYWRpbmdNZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW92ZURpYWxvZ192YWxpZGRlc3RpbmF0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX2Nhbm5vdE1vZGlmeURlc3RpbmF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsQWxsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkJhc2VBY3Rpdml0eTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NGb3JtRWRpdG9yX2V4cGFuQWxsQWN0aW9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRm9ybUVkaXRvcl9jb2xsYXBzZUFsbEFjdGlvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGlhZ3JhbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfcHJvbXB0VG9EZWxldGVCZWZvcmVSZXZlYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfU2VsZWN0Q29sdW1uczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURldGFpbERpYWdyYW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfQ29sdW1uU2VsZWN0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N3aXRjaENvbmZpZ3VyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3VwcHJlc3Npb25Hcm91cFRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX2luaGVyaXRTdXBwcmVzc2lvblN0YXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fSW5zZXJ0TmV3UGhhc2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWaWV3SGVscGVyX3JlbG9hZExpYk9uUm9sbGJhY2tFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRjb25maXJtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9BZGRNaXNzaW5nVG9vbFRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uR2VuZXJhbEluZm87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9BcHBseVBhdHRlcm47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX3NlbGVjdGRlc3RpbmF0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX25vbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZExpYnJhcnlFZGl0b3JfdHJvdWJsZW9iamVjdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VMYWJlbFByb3ZpZGVyX2VycmNoaWxkcGtnczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX01lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUFzd2l0aGRvdHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfV29ya0JyZWFrZG93blN0cnVjdHVyZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfVGVhbUFsbG9jYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1dvcmtQcm9kdWN0VXNhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0NvbnNvbGlkYXRlZFZpZXc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX2NvbmZpcm1BdXRvU3luY2g7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX2RlZmF1bHRTeW5jaHJvbml6YXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdMaWJyYXJ5RGlhbG9nX25ld2xpYnJhcnlfYXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdQbHVnaW5EaWFsb2dfbmV3cGx1Z2luX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RFbGVtZW50RGlhbG9nX3RpdGxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuQ29uZmlnRGlhbG9nbmV3Y29uZmlnX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2VfQlNFZGl0b3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX2ludmFsaWRfbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZW1vZGVsbGlicmFyeTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZExpYnJhcnlFZGl0b3JfZXJyb3JfZGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX0NvbnRlbnRFbGVtZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0Jyb3dzZUJ1dHRvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dGFjaG1lbnREaWFsb2dhdHRhY2hGaWxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkNvbmZpZ0RpYWxvZ29wZW5jb25maWdfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld19yZXBsYWNlQWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfU2hvd0Vycm9yVG9vbFRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkZvcm1QcmVmaXg7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDaGVja2xpc3RPcmRlcl9jaGVja2xpc3RpdGVtc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfTWFrZUNsb3N1cmVUb29sVGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3UGx1Z2luRGlhbG9nX3JlZmVyZW5jZXBsdWdpbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX2NyZWF0ZUZyZWVUZXh0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbVZhbGlkYXRpb25fZXJyX3NhbWVwcmVkYW5kc3VjX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JDaG9vc2VyX2xvYWRkRXJyb3JEbGdUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvckNob29zZXJfUmVzb3VyY2VzRXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9Gb3JtUHJlZml4OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dGFjaG1lbnREaWFsb2dGaWxlVVJMX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGVwc09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJfc2F2ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VWaWV3X2VycmVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VWaWV3X3JlZmVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9jcmVhdGVTdGFydE5vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnREZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RpcmVjdG9yeUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9vdFByZWZQYWdlX2VuYWJsZXByb2Nlc3Njb250cmlidXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udHJpYnV0aW9uU2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld19vcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ192aWV3ZXJMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfZGVsZXRlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1FZGl0b3Jfb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXUENvbXBhcnRtZW50RmlndXJlXzA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9tcHRmb3JfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfTmFtZVBhdHRlcm47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1BhdHRlcm47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJfcHJvY2Vzc2luZ19maWxlX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQ2F0ZWdvcnlUeXBlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1NlbGVjdENhdGVnb3JpZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVhdHNoZWV0X2xvYWRfZmFpbHVyZV9sb2dfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3Q29uZmlndXJhdGlvbldpcmF6ZF9jcmVhdGVFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld1BsdWdpbldpemFyZF9jcmVhdGVFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX21vdmVFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbmFtZURpYWxvZ19yZW5hbWVFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX2NyZWF0ZUVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHVwbGljYXRlUGx1Z2luTmFtZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFESW1hZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JNc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRBRERJbWFnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZFdQREltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURJbWFnZUluUHVibGlzaGluZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfcHJvbXB0VG9EZWxldGVCZWZvcmVTdXBwcmVzczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFEREltYWdlSW5QdWJsaXNoaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlV1BESW1hZ2VJblB1Ymxpc2hpbmc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0RpYWdyYW1JbWFnZV9JbnB1dERpYWxvZ19pbml0aWFsVmFsdWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9TaG93TGlua2VkRWxlbWVudGluTGlicmFyeVZpZXc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX3VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb25fbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0NvbnRleHRNZW51X0RpYWdyYW1JbWFnZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfY29uZmlnTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJvcGVydGllc19sYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9uYW1lX2xhYmxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByZXNlbnRhdGlvbk5hbWVfbGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYnJpZWZEZXNjX2xhYmxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX29wdGlvbmFsSW5vdXRzX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX21hbmRhdG9yeUlucHV0c19sYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9vdXRwdXRzX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYWRkblBlcmZvcm1lcnNfbGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcmVzcG9uc2libGVSb2xlc19sYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9jb250bkFydGlmYWN0c19sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9kaWx2ZWRQYXJ0c19sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9zZWxTdGVwc19sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RFZGl0b3JzVG9EaXNjYXJkQ29uZmxpY3RDaGFuZ2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3RpdGxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX2V4cGxhaW5UZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlblJURTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsb3NlUlRFOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2hhbmdlSGlzdG9yeURpYWxvZ19kZWxpbWl0ZXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlc2V0c19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtwcm9kdWN0dHlwZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbnNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21jYXRlZ29yeV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uY2VwdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tsaXN0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGFtcGxlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkZWxpbmVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvYWRtYXBfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldXNhYmxlYXNzZXRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1cHBvcnRpbmdtYXRlcmlhbF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb3J0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVtcGxhdGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlcm1kZWZpbml0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sbWVudG9yX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aGl0ZXBhcGVyX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JLy8gTmV3IFN0cmluZyBTZWN0aW9uIERlc2NyaXB0aW9uCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X25vdGF0aW9uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RfdGFpbG9yaW5nU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dGNvbWVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0Y29tZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dGNvbWVfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dGNvbWVfbm90YXRpb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRjb21lX3RhaWxvcmluZ1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dGNvbWVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRjb21lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyYWJsZV9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVfbm90YXRpb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyYWJsZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyYWJsZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5fZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG9tYWluX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG9tYWluX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG9tYWluX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya3Byb2R1Y3R0eXBlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtwcm9kdWN0dHlwZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtwcm9kdWN0dHlwZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVzZXRfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZXNldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVzZXRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jZXB0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNlcHRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jZXB0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uY2VwdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrbGlzdF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja2xpc3RfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja2xpc3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja2xpc3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGFtcGxlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4YW1wbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGFtcGxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhhbXBsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRlbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkZWxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkZWxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkZWxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRpb25jb25zaWRlcmF0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBvcnRfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb3J0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb3J0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb3J0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzdWFibGVhc3NldF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXN1YWJsZWFzc2V0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzdWFibGVhc3NldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc3VhYmxlYXNzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2FkbWFwX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvYWRtYXBfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2FkbWFwX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9hZG1hcF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1cHBvcnRpbmdtYXRlcmlhbF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdXBwb3J0aW5nbWF0ZXJpYWxfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdXBwb3J0aW5nbWF0ZXJpYWxfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdXBwb3J0aW5nbWF0ZXJpYWxfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wbGF0ZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlbXBsYXRlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVtcGxhdGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZXJtZGVmaW5pdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZXJtZGVmaW5pdGlvbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlcm1kZWZpbml0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVybWRlZmluaXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sbWVudG9yX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xtZW50b3JfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sbWVudG9yX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbG1lbnRvcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdoaXRlcGFwZXJfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2hpdGVwYXBlcl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdoaXRlcGFwZXJfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aGl0ZXBhcGVyX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZWdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVzZXRncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlc2V0Z3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlc2V0Z3JvdXBpbmdfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlc2V0Z3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21jYXRlZ29yeV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbWNhdGVnb3J5X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tY2F0ZWdvcnlfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21jYXRlZ29yeV9JY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uY2VwdF9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tsaXN0X2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sbWVudG9yX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aGl0ZXBhcGVyX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVybWRlZmluaXRpb25faWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlbXBsYXRlX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXVzYWJsZWFzc2V0X2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBvcnRfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGFtcGxlX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkZWxpbmVfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvYWRtYXBfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1cHBvcnRpbmdtYXRlcmlhbF9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNpcmN1bGFyX2RlcGVuZGVuY3lfZXJyb3JfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBseV9wYXR0ZXJuX2Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGx5X3BhdHRlcm5fZXJyb3JfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JfdGl0bGVfY29sb25fd2l0aF9zcGFjZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoX2NhdGVnb3JpZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRfbGlzdF9sZW5ndGhfbGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZW5kX3NlbWFudGljc19idXR0b25fdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlbmRfc2VtYW50aWNzX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9pY29uU2VjdGlvbl9maWxlTmFtZUNvbmZsaWN0X3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfaWNvblNlY3Rpb25fZmlsZU5hbWVDb25mbGljdF9tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9pY29uU2VjdGlvbl9maWxlTmFtZV9zZWxlY3RBY3Rpb25fbGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9pY29uU2VjdGlvbl9maWxlTmFtZV9kZXN0aW5hdGlvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX2ljb25TZWN0aW9uX2ZpbGVOYW1lQ29uZmxpY3Rfbm90ZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX2ljb25TZWN0aW9uX2ZpbGVOYW1lX3JlcGxhY2VfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfaWNvblNlY3Rpb25fZmlsZU5hbWVfdW5pcXVlX21zZzsgCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9QcmVmZXJlbmNlczsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc19UYXNrOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbF9UYXNrOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExheW91dEFjdGlvbkdyb3VwX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGF5b3V0QWN0aW9uR3JvdXBfZmxhdExheW91dEFjdGlvbl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExheW91dEFjdGlvbkdyb3VwX2hpZXJhcmNoaWNhbExheW91dEFjdGlvbl9sYWJlbDsKLQkKLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBBdXRob3JpbmdVSVJlc291cmNlcy5jbGFzcyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJU2VydmljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYjE3MWIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5NZXRob2RFZGl0b3JQYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuUHJvY2Vzc0VkaXRvclBhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uQXBwbGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5EZWZhdWx0RWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIFRoZSBBdXRob3JpbmcgVUkgc2VydmljZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRob3JpbmdVSVNlcnZpY2UgewotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBBdXRob3JpbmdVSVNlcnZpY2UgaW5zdGFuY2UgPSBuZXcgQXV0aG9yaW5nVUlTZXJ2aWNlKCk7Ci0KLQkvLyBUaGUgc3RhdHVzIGZsYWcuCi0JcHJpdmF0ZSBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBBdXRob3JpbmdVSVNlcnZpY2UoKSB7Ci0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobmV3IElMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbGlicmFyeUNyZWF0ZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCX0JCQkKLQotCQkJcHVibGljIHZvaWQgbGlicmFyeVNldChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQkJCXN0YXJ0KCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCQl9CQkJCi0JCX0pOwkJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXV0aG9yaW5nVUlTZXJ2aWNlIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogU3RhcnRzIHRoZSBBdXRob3JpbmcgVUkgc2VydmljZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoKSB7Ci0JCWlmICghc3RhcnRlZCkgewotCQkJLy8gSW5pdGlhbGl6ZSBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yCi0JCQlQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFLmdldENsYXNzKCk7Ci0KLQkJCS8vIEluaXRpYWxpemUgdGhlIG1vdmUvcGFzdGUgY29tbWFuZC4KLQkJCU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kCi0JCQkJCS5zZXRSZXNvdXJjZU1hbmFnZXIobmV3IENvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24oKSk7Ci0KLQkJCS8vIEluaXRpYWxpemUgdGhlIEVkaXRvckNob29zZXIuCi0JCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCk7Ci0KLQkJCS8vIExvYWQgRWRpdG9yUGFnZSBQcm92aWRlcnMKLQkJCU1ldGhvZEVkaXRvclBhZ2VQcm92aWRlci5nZXRJbnN0YW5jZSgpLmxvYWRQcm92aWRlcnMoKTsKLQkJCVByb2Nlc3NFZGl0b3JQYWdlUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUHJvdmlkZXJzKCk7Ci0KLQkJCS8vIFNldCBwcm92aWRlcnMgZm9yIGxpYnJhcnkgZWRpdC4KLQkJCVByb3ZpZGVycy5zZXRDb25maWd1cmF0b3JGYWN0b3J5KG5ldyBJQ29uZmlndXJhdG9yRmFjdG9yeSgpIHsKLQkJCQlwdWJsaWMgSUNvbmZpZ3VyYXRvciBjcmVhdGVDb25maWd1cmF0b3IoCi0JCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkJCQlyZXR1cm4gbmV3IFByb2Nlc3NDb25maWd1cmF0b3IoY29uZmlnLCBudWxsLCB0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJUHJvdmlkZXJzCi0JCQkJCS5zZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcihuZXcgQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKSk7Ci0KLQkJCVByb3ZpZGVycy5zZXRQcmVmZXJlbmNlU3RvcmUoTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQotCQkJUHJvdmlkZXJzLnNldEF1dGhvcmluZ1BsdWdpbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkpOwotCi0JCQlMaXN0IGNtZExpc3RlbmVycyA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldENvbW1hbmRMaXN0ZW5lcnMoKTsKLQkJCWNtZExpc3RlbmVycy5hZGRBbGwoRGlhZ3JhbUVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0VmFyeUNvbW1hbmRMaXN0ZW5lcnMoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjbWRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUNvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lciA9IChJQ29tbWFuZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCQlQcm92aWRlcnMucmVnaXN0ZXJDb21tYW5kTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJfQotCi0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc3RhcnQoKTsKLQkJCQotCQkJc3RhcnRlZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wcyB0aGUgQXV0aG9yaW5nIFVJIHNlcnZpY2UuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB7Ci0JCWlmIChzdGFydGVkKSB7Ci0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc3RvcCgpOwkJCQotCQkJc3RhcnRlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlUZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZmMTc3YjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotCi0vKioKLSAqIERlZmluZXMgYW5kIGNhY2hlcyB0aGUgY29tbW9ubHkgcmVmZXJlbmNlZCB0ZXh0IGluIHRoZSBBdXRob3JpbmcgVUkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXV0aG9yaW5nVUlUZXh0IHsKLQotCS8qKgotCSAqIEVkaXRvciBmb3JtIHBhZ2UgdGl0bGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU0lHTl9QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXNzaWduUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SSUVTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jYXRlZ29yaWVzUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJVkVSQUJMRV9QQVJUU19QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsaXZlcmFibGVQYXJ0c1BhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2NyaXB0aW9uUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDSVBMSU5FU19QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZXNQYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURBTkNFX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5ndWlkYW5jZVBhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFVklFV19QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJldmlld1BhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFTkNFU19QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVmZXJlbmNlc1BhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFTkNFX1dPUktGTE9XX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZWZlcmVuY2VXb3JrZmxvd1BhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRVNfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVzUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX1NFVFNfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRzUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEVQU19QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RlcHNQYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrc1BhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTF9NRU5UT1JTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy50b29sTWVudG9yc1BhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19QUk9EVUNUU19QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RzUGFnZV90aXRsZTsgCi0KLQkvKioKLQkgKiBFZGl0b3Igc2VjdGlvbiBuYW1lcyBhbmQgZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tfSVRFTVNfU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hlY2tJdGVtc1NlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19JVEVNU19TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGVja0l0ZW1zU2VjdGlvbl9kZXNjOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUEVOREVOQ0lFU19TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXBlbmRlbmNpZXNTZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQRU5ERU5DSUVTX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlcGVuZGVuY2llc1NlY3Rpb25fZGVzYzsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVRBSUxfU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGV0YWlsU2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFJTF9TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXRhaWxTZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9JTkZPX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlbmVyYWxJbmZvU2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfSU5GT19TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmljb25TZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy5pY29uU2VjdGlvbl9kZXNjOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5vdGF0aW9uU2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5vdGF0aW9uU2VjdGlvbl9kZXNjOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfUExVR0lOU19TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VEX1BMVUdJTlNfU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBRkZJTkdfU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RhZmZpbmdTZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBRkZJTkdfU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RhZmZpbmdTZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RFUFNfU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RlcHNTZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RFUFNfU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RlcHNTZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFJTE9SSU5HX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhaWxvcmluZ1NlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUlMT1JJTkdfU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFpbG9yaW5nU2VjdGlvbl9kZXNjOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUklBQklMSVRZX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnZhcmlhYmlsaXR5U2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUklBQklMSVRZX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fSU5GT19TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy52ZXJzaW9uSW5mb1NlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0lORk9fU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7IAotCi0JLyoqCi0JICogVUkgYW5kIGVsZW1lbnQgYXR0cmlidXRlIGxhYmVscy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERJVElPTkFMX0lORk9fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFkZGl0aW9uYWxJbmZvX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFwcGxpY2F0aW9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxURVJOQVRJVkVTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hbHRlcm5hdGl2ZXNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NJR05NRU5UX0FQUFJPQUNIRVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFzc2lnbm1lbnRBcHByb2FjaGVzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXV0aG9yc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tHUk9VTkRfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJhY2tncm91bmRfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX0VMRU1FTlRfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJhc2VFbGVtZW50X3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9HVUlEQU5DRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmFzZUd1aWRhbmNlX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJRUZfREVTQ1JJUFRJT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJyaWVmRGVzY3JpcHRpb25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUklFRl9PVVRMSU5FX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5icmllZk91dGxpbmVfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0VfREFURV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hhbmdlRGF0ZV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRV9ERVNDUklQVElPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hhbmdlRGVzY3JpcHRpb25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19JVEVNU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hlY2tJdGVtc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRSSUJVVEVTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb250cmlidXRlc190ZXh0OyAKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9DT05UUklCVVRFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubG9jYWxDb250cmlidXRlc190ZXh0OyAgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1BZUklHSFRfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvcHlyaWdodF90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5EU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXh0ZW5kc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0RFU0NSSVBUSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5leHRlcm5hbERlc2NyaXB0aW9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfSURfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4dGVybmFsSWRfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHT0FMU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ29hbHNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBBQ1RfT0ZfTk9UX0hBVklOR19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuaW1wYWN0T2ZOb3RIYXZpbmdfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OU0lERVJBVElPTlNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmtleUNvbnNpZGVyYXRpb25zX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVWRUxfT0ZfQURPUFRJT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmxldmVsc09mQWRvcHRpb25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQUlOX0RFU0NSSVBUSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5tYWluRGVzY3JpcHRpb25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5uYW1lX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0VMRU1FTlRfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0VsZW1lbnRfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfQVBQTElDQUJMRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubm90QXBwbGljYWJsZV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0lOR19HVUlEQU5DRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucGFja2FnaW5nR3VpZGFuY2VfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRU5UQVRJT05fTkFNRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJlc2VudGF0aW9uTmFtZV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0JMRU1fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2JsZW1fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVVJQT1NFX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wdXJwb3NlX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBU09OX0ZPUl9OT1RfTkVFRElOR19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVhc29uRm9yTm90TmVlZGluZ190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0VTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXBsYWNlc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUFJFU0VOVEFUSU9OX09QVElPTlNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlcHJlc2VudGF0aW9uT3B0aW9uc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSUxMU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2tpbGxzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RFUFNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN0ZXBzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RFUF9OQU1FX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdGVwc19uYW1lX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOT05ZTVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bm9ueW1zX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUQUNIRURfRklMRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXR0YWNoZWRGaWxlX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudHlwZV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOSVFVRV9JRF9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudW5pcXVlSWRfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJJQUJJTElUWV9UWVBFX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy52YXJpYWJpbGl0eVR5cGVfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy52ZXJzaW9uX3RleHQ7IAotCi0JLyoqCi0JICogQnV0dG9uIGxhYmVscy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hZGRCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRBQ0hfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hdHRhY2hCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUk9XU0VfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5icm93c2VCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0VfVFlQRV9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNoYW5nZVR5cGVCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBUl9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNsZWFyQnV0dG9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsZXRlQnV0dG9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTRUxFQ1RfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNlbGVjdEJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFDSF9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRldGFjaEJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPV05fQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kb3duQnV0dG9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JERVJfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5vcmRlckJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0QnV0dG9uX3RleHQ7IAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbW92ZUJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNlbGVjdEJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVQX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudXBCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX0hJU1RPUllfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy52aWV3SGlzdG9yeUJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMV0FZU19CVVRUT05fVEVYVCA9IE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLkFMV0FZUzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVkVSX0JVVFRPTl9URVhUID0gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuTkVWRVI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9NUFRfQlVUVE9OX1RFWFQgPSBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5QUk9NUFQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NBVEVHT1JJRVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hfY2F0ZWdvcmllc190ZXh0OwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0Jyb3dzaW5nUGVyc3BlY3RpdmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9Ccm93c2luZ1BlcnNwZWN0aXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBkNzM5NjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0Jyb3dzaW5nUGVyc3BlY3RpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFRoZSBNZXRob2QgQnJvd3NpbmcgcGVyc3BlY3RpdmUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQnJvd3NpbmdQZXJzcGVjdGl2ZSBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIHBlcnNwZWN0aXZlIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNQRUNUSVZFX0lEID0gQnJvd3NpbmdQZXJzcGVjdGl2ZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeSNjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0JCWxheW91dC5zZXRFZGl0b3JBcmVhVmlzaWJsZShmYWxzZSk7Ci0JCVN0cmluZyBlZGl0b3JBcmVhID0gbGF5b3V0LmdldEVkaXRvckFyZWEoKTsKLQkJbGF5b3V0LmFkZFZpZXcoQ29uZmlndXJhdGlvblZpZXcuVklFV19JRCwgSVBhZ2VMYXlvdXQuTEVGVCwgMC4zMGYsCi0JCQkJZWRpdG9yQXJlYSk7Ci0JCVBlcnNwZWN0aXZlTGlzdFV0aWwuYWRkUGVyc3BlY3RpdmVTaG9ydExpc3QobGF5b3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGlzIHBlcnNwZWN0aXZlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuKCkgewotCQl0cnkgewotCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCWlmICh3aW5kb3cgPT0gbnVsbCkgewotCQkJCUlXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLQkJCQlpZiAod2luZG93cyAhPSBudWxsICYmIHdpbmRvd3MubGVuZ3RoID4gMCkgewotCQkJCQl3aW5kb3cgPSB3aW5kb3dzWzBdOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5zaG93UGVyc3BlY3RpdmUoUEVSU1BFQ1RJVkVfSUQsCi0JCQkJCQl3aW5kb3cpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkiRmFpbGVkIHRvIG9wZW4gYnJvd3NpbmcgcGVyc3BlY3RpdmUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUGVyc3BlY3RpdmVMaXN0VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1BlcnNwZWN0aXZlTGlzdFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGFjY2Q4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUGVyc3BlY3RpdmVMaXN0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuUGVyc3BlY3RpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgdGhlIEF1dGhvcmluZyBhbmQgQnJvd3NpbmcgcGVyc3BlY3RpdmVzLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlTGlzdFV0aWwgewotCi0JLyoqCi0JICogQWRkIHRoZSBCcm93c2luZyBhbmQgQXV0aG9yaW5nIHBlcnNwZWN0aXZlIHNob3J0Y3V0cyB0byB0aGUgZ2l2ZW4gcGFnZQotCSAqIGxheW91dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkUGVyc3BlY3RpdmVTaG9ydExpc3QoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0JCWxheW91dC5hZGRQZXJzcGVjdGl2ZVNob3J0Y3V0KEJyb3dzaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpOwotCQlsYXlvdXQuYWRkUGVyc3BlY3RpdmVTaG9ydGN1dChBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY3VycmVudCBwZXJzcGVjdGl2ZSBpcyB0aGUgQXV0aG9yaW5nCi0JICogcGVyc3BlY3RpdmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXV0aG9yaW5nUGVyc3BlY3RpdmUoKSB7Ci0JCVN0cmluZyBhY3RpdmVQZXJzcGVjdGl2ZUlkID0gUGVyc3BlY3RpdmVVdGlsLmdldEFjdGl2ZVBlcnNwZWN0aXZlSWQoKTsKLQkJaWYgKGFjdGl2ZVBlcnNwZWN0aXZlSWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGFjdGl2ZVBlcnNwZWN0aXZlSWQKLQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoQXV0aG9yaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY3VycmVudCBwZXJzcGVjdGl2ZSBpcyB0aGUgQnJvd3NpbmcKLQkgKiBwZXJzcGVjdGl2ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCcm93c2luZ1BlcnNwZWN0aXZlKCkgewotCQlTdHJpbmcgYWN0aXZlUGVyc3BlY3RpdmVJZCA9IFBlcnNwZWN0aXZlVXRpbC5nZXRBY3RpdmVQZXJzcGVjdGl2ZUlkKCk7Ci0JCWlmIChhY3RpdmVQZXJzcGVjdGl2ZUlkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBhY3RpdmVQZXJzcGVjdGl2ZUlkCi0JCQkJCS5lcXVhbHNJZ25vcmVDYXNlKEJyb3dzaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkNmIxODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIwNCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgRm9ybSBQYWdlIFRpdGxlcwotYXNzaWduUGFnZV90aXRsZT1Bc3NpZ24KLWNhdGVnb3JpZXNQYWdlX3RpdGxlPUNhdGVnb3JpZXMKLWRlbGl2ZXJhYmxlUGFydHNQYWdlX3RpdGxlPURlbGl2ZXJhYmxlIFBhcnRzCi1kZXNjcmlwdGlvblBhZ2VfdGl0bGU9RGVzY3JpcHRpb24KLWRpc2NpcGxpbmVzUGFnZV90aXRsZT1EaXNjaXBsaW5lcwotZGlzY2FyZHVucmVzb2x2ZWRyZWY9RGlzY2FyZCB1bnJlc29sdmVkIHJlZmVyZW5jZXMKLWd1aWRhbmNlUGFnZV90aXRsZT1HdWlkYW5jZQotcHJldmlld1BhZ2VfdGl0bGU9UHJldmlldwotcmVmZXJlbmNlc1BhZ2VfdGl0bGU9UmVmZXJlbmNlcwotcmVmZXJlbmNlX3RleHQ9UmVmZXJlbmNlczoKLXJlZmVyZW5jZVdvcmtmbG93UGFnZV90aXRsZT1SZWZlcmVuY2UgV29ya2Zsb3cKLXJvbGVzUGFnZV90aXRsZT1Sb2xlcwotcm9sZVNldHNQYWdlX3RpdGxlPVJvbGUgU2V0cwotc3RlcHNQYWdlX3RpdGxlPVN0ZXBzCi10YXNrc1BhZ2VfdGl0bGU9VGFza3MKLXRvb2xNZW50b3JzUGFnZV90aXRsZT1Ub29sIE1lbnRvcnMKLXdvcmtQcm9kdWN0c1BhZ2VfdGl0bGU9V29yayBQcm9kdWN0cwotCi0jIFNlY3Rpb24gTmFtZXMgJiBEZXNjcmlwdGlvbgotY2hlY2tJdGVtc1NlY3Rpb25fbmFtZT1DaGVjayBJdGVtcwotY2hlY2tJdGVtc1NlY3Rpb25fZGVzYz1TcGVjaWZ5IHRoZSBjaGVjayBpdGVtcyB0aGF0IGNvbnN0aXR1dGUgdGhpcyBjaGVja2xpc3QuCi1kZXBlbmRlbmNpZXNTZWN0aW9uX25hbWU9RGVwZW5kZW5jaWVzCi1kZXBlbmRlbmNpZXNTZWN0aW9uX2Rlc2M9VGhpcyBzZWN0aW9uIGRpc3BsYXlzIGRlcGVuZGVuY2llcyBvZiB0aGlzIGNvbnRlbnQgcGFja2FnZSB0byBvdGhlciBjb250ZW50IHBhY2thZ2VzLgotZGV0YWlsU2VjdGlvbl9uYW1lPURldGFpbCBJbmZvcm1hdGlvbgotZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB7MH0uCi1nZW5lcmFsSW5mb1NlY3Rpb25fbmFtZT1HZW5lcmFsIEluZm9ybWF0aW9uCi1nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB7MH0uCi1pY29uU2VjdGlvbl9uYW1lPUljb24KLWljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIHRoZSBpY29ucyBmb3IgdGhpcyB7MH0uCi1ub3RhdGlvblNlY3Rpb25fbmFtZT1EZWxpdmVyeSBJbmZvcm1hdGlvbgotbm90YXRpb25TZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZWxpdmVyeSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHswfS4KLXJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9uYW1lPVJlZmVyZW5jZWQgUGx1Zy1pbnM6Ci1yZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fZGVzYz1UaGlzIHNlY3Rpb24gZGlzcGxheXMgcGx1Zy1pbnMgcmVmZXJlbmNlZCBieSB0aGlzIG1ldGhvZCBwbHVnLWluLgotc3RhZmZpbmdTZWN0aW9uX25hbWU9U3RhZmZpbmcgSW5mb3JtYXRpb24KLXN0YWZmaW5nU2VjdGlvbl9kZXNjPVByb3ZpZGUgc3RhZmZpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2xlLgotc3RlcHNTZWN0aW9uX25hbWU9U3RlcHMKLXN0ZXBzU2VjdGlvbl9kZXNjPVNwZWNpZnkgdGhlIHN0ZXBzIHRvIHBlcmZvcm0gdGhpcyB0YXNrLgotdGFpbG9yaW5nU2VjdGlvbl9uYW1lPVRhaWxvcmluZwotdGFpbG9yaW5nU2VjdGlvbl9kZXNjPVByb3ZpZGUgdGFpbG9yaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgezB9LgotdmFyaWFiaWxpdHlTZWN0aW9uX25hbWU9Q29udGVudCBWYXJpYWJpbGl0eQotdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyB7MH0gcmVsYXRlcyB0byBhbm90aGVyIHswfS4KLXZlcnNpb25JbmZvU2VjdGlvbl9uYW1lPVZlcnNpb24gSW5mb3JtYXRpb24KLXZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHswfS4KLQotIyBVSSAmIEVsZW1lbnQgQXR0cmlidXRlIExhYmVscwotYWRkaXRpb25hbEluZm9fdGV4dD1BZGRpdGlvbmFsIGluZm9ybWF0aW9uOgotYXBwbGljYXRpb25fdGV4dD1BcHBsaWNhdGlvbjoKLWFjdGlvbkxhYmVsX2VkaXQ9JkVkaXQKLWFjdGlvbkxhYmVsX2ZpbmRFbGVtZW50SW5MaWJOYXY9JlNob3cgaW4gTGlicmFyeSBWaWV3Ci1hbHRlcm5hdGl2ZXNfdGV4dD1BbHRlcm5hdGl2ZXM6Ci1hc3NpZ25tZW50QXBwcm9hY2hlc190ZXh0PUFzc2lnbm1lbnQgYXBwcm9hY2hlczoKLWF1dGhvcnNfdGV4dD1BdXRob3JzOgotYmFja2dyb3VuZF90ZXh0PUJhY2tncm91bmQ6Ci1iYXNlRWxlbWVudF90ZXh0PUJhc2U6Ci1iYXNlR3VpZGFuY2VfdGV4dD1CYXNlIGd1aWRhbmNlOgotYnJpZWZEZXNjcmlwdGlvbl90ZXh0PUJyaWVmIGRlc2NyaXB0aW9uOgotZGVzY3JpcHRpb25fdGV4dD1EZXNjcmlwdGlvbjoKLWJhY2t1cGJlZm9yZXNhdmVfdGV4dD1CYWNrIHVwIGJlZm9yZSBzYXZlCi1icmllZk91dGxpbmVfdGV4dD1CcmllZiBvdXRsaW5lOgotY2hhbmdlRGF0ZV90ZXh0PUNoYW5nZSBkYXRlOgotY2hhbmdlRGVzY3JpcHRpb25fdGV4dD1DaGFuZ2UgZGVzY3JpcHRpb246Ci1jaGVja0l0ZW1zX3RleHQ9Q2hlY2sgSXRlbXMKLWNvbnRyaWJ1dGVzX3RleHQ9Q29udHJpYnV0ZXMKLWxvY2FsQ29udHJpYnV0ZXNfdGV4dD1Mb2NhbENvbnRyaWJ1dGVzCi1jb250cmlidXRlc190b190ZXh0PUNvbnRyaWJ1dGVzIHRvCi1jb3B5cmlnaHRfdGV4dD1Db3B5cmlnaHQ6Ci1lZGl0b3JfdGV4dD1FZGl0b3IKLWV4dGVuZHNfdGV4dD1FeHRlbmRzCi1leHRlbmRfdGV4dD1FeHRlbmQKLWV4dGVybmFsRGVzY3JpcHRpb25fdGV4dD1FeHRlcm5hbCBkZXNjcmlwdGlvbjoKLWV4dGVybmFsSWRfdGV4dD1FeHRlcm5hbCBJRDoKLWdvYWxzX3RleHQ9R29hbHM6Ci1pbXBhY3RPZk5vdEhhdmluZ190ZXh0PUltcGFjdCBvZiBub3QgaGF2aW5nOgota2V5Q29uc2lkZXJhdGlvbnNfdGV4dD1LZXkgY29uc2lkZXJhdGlvbnM6Ci1sZXZlbHNPZkFkb3B0aW9uX3RleHQ9TGV2ZWwgb2YgYWRvcHRpb246Ci1tYWluRGVzY3JpcHRpb25fdGV4dD1NYWluIGRlc2NyaXB0aW9uOgotbmV3RWxlbWVudF90ZXh0PU5ldyB7MH0KLW5hbWVfdGV4dD1OYW1lOgotbm90QXBwbGljYWJsZV90ZXh0PU5vdCBhcHBsaWNhYmxlCi1wYWNrYWdpbmdHdWlkYW5jZV90ZXh0PVBhY2thZ2luZyBndWlkYW5jZToKLXByZXNlbnRhdGlvbk5hbWVfdGV4dD1QcmVzZW50YXRpb24gbmFtZToKLXByb21wdGZvcmxpYmFyeV90ZXh0PVByb21wdCBmb3IgbWV0aG9kIGxpYnJhcnkgb24gc3RhcnR1cAotZW5hYmxlSGVhbHRoQ2hlY2tfdGV4dD1FbmFibGUgaW50ZXJuYWwgZGVidWcgdG9vbHMKLXByb2JsZW1fdGV4dD1Qcm9ibGVtOgotcHVycG9zZV90ZXh0PVB1cnBvc2U6Ci1yZWFzb25Gb3JOb3ROZWVkaW5nX3RleHQ9UmVhc29uIGZvciBub3QgbmVlZGluZzoKLXJlcGxhY2VzX3RleHQ9UmVwbGFjZXMKLWxvY2FsUmVwbGFjZXNfdGV4dD1Mb2NhbFJlcGxhY2VzCi1leHRlbmRzUmVwbGFjZXNfdGV4dD1FeHRlbmRzUmVwbGFjZXMKLXJlcHJlc2VudGF0aW9uT3B0aW9uc190ZXh0PVJlcHJlc2VudGF0aW9uIG9wdGlvbnM6Ci1hdHRhY2hlZEZpbGVfdGV4dD1BdHRhY2hlZCBmaWxlKHMpOgotc2tpbGxzX3RleHQ9U2tpbGxzOgotc3RlcHNfdGV4dD1TdGVwczoKLXN0ZXBzX25hbWVfdGV4dD1OYW1lOgotc3RvcF90ZXh0PVN0b3AKLXByaW50X3RleHQ9UHJpbnQKLXN5bm9ueW1zX3RleHQ9U3lub255bXM6Ci10eXBlX3RleHQ9VHlwZToKLWNvcHlfdGV4dD1Db3B5Ci1kZWVwQ29weV90ZXh0PURlZXAgQ29weQotYmFja190ZXh0PUJhY2sKLW5ld19wbHVnaW49TmUmdyBNZXRob2QgUGx1Zy1pbgotbW92ZT0mTW92ZS4uLgotdW5pcXVlSWRfdGV4dD1VbmlxdWUgSUQ6Ci12YXJpYWJpbGl0eVR5cGVfdGV4dD1WYXJpYWJpbGl0eSB0eXBlOgotdmVyc2lvbl90ZXh0PVZlcnNpb246Ci0KLSMgQnV0dG9uIExhYmVscwotYWRkQnV0dG9uX3RleHQ9QWRkLi4uCi1hdHRhY2hCdXR0b25fdGV4dD1BdHRhY2guLi4KLWJyb3dzZUJ1dHRvbl90ZXh0PUJyb3dzZS4uLgotY2hhbmdlVHlwZUJ1dHRvbl90ZXh0PUNoYW5nZSBUeXBlLi4uCi1jbGVhckJ1dHRvbl90ZXh0PUNsZWFyCi1kZWxldGVCdXR0b25fdGV4dD1EZWxldGUKLWRldGFjaEJ1dHRvbl90ZXh0PURldGFjaAotZGlhZ3JhbV9zYXZlRXJyb3I9RXJyb3Igc2F2aW5nIGRpYWdyYW0KLWRvd25CdXR0b25fdGV4dD1Eb3duCi1kaXJlY3RvcnlfdGV4dD1EaXJlY3Rvcnk6Ci1vcmRlckJ1dHRvbl90ZXh0PU9yZGVyCi1lZGl0QnV0dG9uX3RleHQ9RWRpdC4uLgotcmVtb3ZlQnV0dG9uX3RleHQ9UmVtb3ZlCi1yZW5hbWVBY3Rpb25fdGV4dD1SZW4mYW1lLi4uCi1yZW1vdmVfdGV4dD1SZW1vdmUKLXJlbmFtZV90ZXh0PVJlbmFtZQotU2F2ZUFzX3RleHQ9U2F2ZSBBcwotc2VsZWN0QnV0dG9uX3RleHQ9U2VsZWN0Li4uCi1kZXNlbGVjdEJ1dHRvbl90ZXh0PURlc2VsZWN0Ci11cEJ1dHRvbl90ZXh0PVVwCi1tYWtlRGVmYXVsdEJ1dHRvbl90ZXh0PU1ha2UgRGVmYXVsdAotdmlld0hpc3RvcnlCdXR0b25fdGV4dD1WaWV3IEhpc3RvcnkuLi4KLQotIyBSb2xlIEVkaXRvciBUYXNrcyBQYWdlCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25OYW1lPVRhc2tzCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1UaGlzIHJvbGUgaXMgdGhlIHBlcmZvcm1lciBvZiB0aGUgZm9sbG93aW5nIHRhc2tzLgotcm9sZVRhc2tzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgdGFza3MKLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1QcmltYXJ5IHBlcmZvcm1lcjoKLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9QWRkaXRpb25hbCBwZXJmb3JtZXI6Ci1yb2xlVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHRhc2tzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBSb2xlIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UKLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVdvcmsgUHJvZHVjdHM6Ci1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249U3BlY2lmeSB3b3JrIHByb2R1Y3RzIHRoYXQgdGhpcyByb2xlIGlzIHJlc3BvbnNpYmxlIGZvci4KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSB3b3JrIHByb2R1Y3RzOgotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1SZXNwb25zaWJsZSBmb3I6Ci1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMj1Xb3JrIHByb2R1Y3RzIHRoYXQgYXJlIG91dHB1dCBvZiB0YXNrcyB0aGF0IHRoaXMgcm9sZSBwZXJmb3JtczoKLXJvbGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHdvcmsgcHJvZHVjdHMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFJvbGUgRWRpdG9yIEd1aWRhbmNlIFBhZ2UKLXJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU9R3VpZGFuY2UKLXJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgbGlua3MgdG8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybSBvZiBndWlkYW5jZS4KLXJvbGVHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIEd1aWRhbmNlOgotcm9sZUd1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsPUd1aWRhbmNlOgotcm9sZUd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBndWlkYW5jZSBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgUm9sZSBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9Q2F0ZWdvcmllczoKLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgcm9sZSBiZWxvbmdzLgotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVJvbGUgU2V0czoKLXJvbGVDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9Q3VzdG9tIENhdGVnb3JpZXM6Ci1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Sb2xlIHNldHM6Ci1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9Q3VzdG9tIGNhdGVnb3JpZXM6Ci0KLSMgVGFzayBFZGl0b3IgUm9sZXMgUGFnZQotdGFza1JvbGVzUGFnZV9zZWN0aW9uTmFtZT1Sb2xlcwotdGFza1JvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QXNzaWduIHRoZSByb2xlcyB0byBwZXJmb3JtIHRoaXMgdGFzay4KLXRhc2tSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIHJvbGVzOgotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVByaW1hcnkgcGVyZm9ybWVyOgotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsMj1BZGRpdGlvbmFsIHBlcmZvcm1lcnM6Ci10YXNrUm9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHJvbGVzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLXRhc2tSb2xlc1BhZ2VfcHJpbWFyeVBlcmZvcm1lcl9tb2RpZnlfbWVzc2FnZT1JVVBBMDAwNDVXOiBEbyB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIHByaW1hcnkgcGVyZm9ybWVyIHRvICcnezB9Jyc/Ci10YXNrUm9sZXNQYWdlX2NvbmZpcm1fdGl0bGU9Q29uZmlybSBwcmltYXJ5IHJvbGUgY2hhbmdlCi0KLSMgVGFzayBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Xb3JrIFByb2R1Y3RzCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249U3BlY2lmeSB0aGUgaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzIGZvciB0aGlzIHRhc2suCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgV29yayBQcm9kdWN0cwotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1NYW5kYXRvcnkgaW5wdXRzOgotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9T3B0aW9uYWwgaW5wdXRzOgotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDM9T3V0cHV0czoKLXRhc2tXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHdvcmsgcHJvZHVjdHMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFRhc2sgRWRpdG9yIEd1aWRhbmNlIFBhZ2UKLXRhc2tHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU9R3VpZGFuY2UKLXRhc2tHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgbGlua3MgdG8gYWRkdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZSBmb3JtIG9mIGd1aWRhbmNlLgotdGFza0d1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgR3VpZGFuY2U6Ci10YXNrR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9R3VpZGFuY2U6Ci10YXNrR3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGd1aWRhbmNlcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgVGFzayBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9Q2F0ZWdvcmllcwotdGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0YXNrIGJlbG9uZ3MuCi10YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9RGlzY2lwbGluZXMKLXRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9Q3VzdG9tIENhdGVnb3JpZXMKLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPURpc2NpcGxpbmVzOgotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPUN1c3RvbSBjYXRlZ29yaWVzOgotCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgVGFza3MgUGFnZQotV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbk5hbWU9VGFza3MKLVdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25EZXNjcmlwdGlvbj1UaGlzIHdvcmsgcHJvZHVjdCBpcyBhbiBpbnB1dCBvciBvdXRwdXQgZm9yIHRoZSBmb2xsb3dpbmcgdGFza3MuCi1Xb3JrUHJvZHVjdF9UYXNrc19BdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgdGFza3MKLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWw9TWFuZGF0b3J5IGlucHV0OgotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDI9T3B0aW9uYWwgaW5wdXQ6Ci1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMz1PdXRwdXQ6Ci1Xb3JrUHJvZHVjdF9UYXNrc19NdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSB0YXNrcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBSb2xlcyBQYWdlCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uTmFtZT1Sb2xlcwotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVRoZSBmb2xsb3dpbmcgcm9sZXMgYXJlIHJlc3BvbnNpYmxlIGZvciBvciBtb2RpZnkgdGhpcyB3b3JrIHByb2R1Y3QuCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgcm9sZXMKLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9UmVzcG9uc2libGUgcm9sZToKLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPU1vZGlmeWluZyByb2xlczoKLXdvcmtQcm9kdWN0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHJvbGVzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyMgV29yayBQcm9kdWN0IEVkaXRvciBEZWxpdmVyYWJsZSBQYXJ0cyBQYWdlCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25OYW1lPURlbGl2ZXJhYmxlIFBhcnRzCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSB3b3JrIHByb2R1Y3RzIHRoYXQgY29uc3RpdHV0ZSB0aGlzIGRlbGl2ZXJhYmxlLgotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgd29yayBwcm9kdWN0cyBhcyBkZWxpdmVyYWJsZSBwYXJ0czoKLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Xb3JrIHByb2R1Y3RzIGFzIGRlbGl2ZXJhYmxlIHBhcnRzOgotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSB3b3JrIHByb2R1Y3RzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIEd1aWRhbmNlIFBhZ2UKLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPUd1aWRhbmNlCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBsaW5rcyB0byBhZGR0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm0gb2YgZ3VpZGFuY2UuCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgR3VpZGFuY2U6Ci13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsPUd1aWRhbmNlOgotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gZ3VpZGFuY2VzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1DYXRlZ29yaWVzCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB3b3JrIHByb2R1Y3QgYmVsb25ncy4KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9RG9tYWlucwotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9V29yayBQcm9kdWN0IEtpbmRzOgotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDM9Q3VzdG9tIENhdGVnb3JpZXM6Ci13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw9RG9tYWluOgotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1Xb3JrIHByb2R1Y3Qga2luZHM6Ci13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwzPUN1c3RvbSBjYXRlZ29yaWVzOgotCi0jIFByYWN0aWNlIEVkaXRvciBSZWZlcmVuY2VzIFBhZ2UKLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VjdGlvbk5hbWU9Q29udGVudCBFbGVtZW50cwotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249U3BlY2lmeSB0aGUgY29udGVudCBlbGVtZW50cyByZWZlcmVuY2VkIGJ5IHRoaXMgcHJhY3RpY2UuCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSBjb250ZW50IGVsZW1lbnRzOgotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWxlY3RlZExhYmVsPUNvbnRlbnQgZWxlbWVudHM6Ci1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IENvbnRlbnQgZWxlbWVudHMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIENhdGVnb3J5IEVkaXRvciBHdWlkYW5jZSBQYWdlCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbk5hbWU9R3VpZGFuY2UKLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZSB0aGF0IGJlbG9uZyB0byB0aGlzIHswfS4KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgZ3VpZGFuY2U6Ci1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1HdWlkYW5jZToKLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBndWlkYW5jZXMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIERpc2NpcGxpbmUgR3JvdXBpbmcgRWRpdG9yIERpc2NpcGxpbmVzIFBhZ2UKLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uTmFtZT1EaXNjaXBsaW5lcwotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGRpc2NpcGxpbmVzIHRoYXQgYmVsb25nIHRvIHRoaXMgZGlzY2lwbGluZSBncm91cGluZy4KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgRGlzY2lwbGluZXM6Ci1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1EaXNjaXBsaW5lczoKLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBEaXNjaXBsaW5lcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX1VzZURlZmF1bHREaXJlY3RvcnlCdXR0b25MYWJlbD1Vc2UgZGVmYXVsdCBkaXJlY3RvcnkKLQotIyBEaXNjaXBsaW5lIEVkaXRvciBUYXNrcyBQYWdlCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25OYW1lPVRhc2tzCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIHRhc2tzIHRoYXQgYmVsb25nIHRvIHRoaXMgZGlzY2lwbGluZS4KLWRpc2NpcGxpbmVUYXNrc1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIHRhc2tzOgotZGlzY2lwbGluZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsPVRhc2tzOgotZGlzY2lwbGluZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSB0YXNrcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgRGlzY2lwbGluZSBFZGl0b3IgUmVmZXJlbmNlIFdvcmtmbG93IFBhZ2UKLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbk5hbWU9UmVmZXJlbmNlIFdvcmtmbG93cwotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSByZWZlcmVuY2Ugd29ya2Zsb3dzIHRoYXQgYmVsb25nIHRvIHRoaXMgZGlzY2lwbGluZS4KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIFJlZmVyZW5jZSBXb3JrZmxvd3M6Ci1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlbGVjdGVkTGFiZWw9UmVmZXJlbmNlIHdvcmtmbG93czoKLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gUmVmZXJlbmNlIHdvcmtmbG93cyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgRG9tYWluIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UKLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9V29yayBQcm9kdWN0cwotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSB3b3JrIHByb2R1Y3RzIHRoYXQgYmVsb25nIHRvIHRoaXMgZG9tYWluLgotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgd29yayBwcm9kdWN0czoKLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Xb3JrIHByb2R1Y3RzOgotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSB3b3JrIHByb2R1Y3RzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBXb3JrIFByb2R1Y3QgS2luZCBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVdvcmsgUHJvZHVjdHMKLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgd29yayBwcm9kdWN0cyB0aGF0IGJlbG9uZyB0byB0aGlzIHdvcmsgcHJvZHVjdCBraW5kLgotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgd29yayBwcm9kdWN0czoKLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Xb3JrIHByb2R1Y3RzOgotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSB3b3JrIHByb2R1Y3RzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBSb2xlIFNldCBHcm91cGluZyBFZGl0b3IgUm9sZSBTZXRzIFBhZ2UKLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWN0aW9uTmFtZT1Sb2xlIFNldHMKLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSByb2xlIHNldHMgdGhhdCBiZWxvbmcgdG8gdGhpcyByb2xlIHNldCBncm91cGluZy4KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgUm9sZSBTZXRzOgotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw9Um9sZSBzZXRzOgotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IFJvbGUgU2V0cyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgUm9sZSBTZXQgRWRpdG9yIFJvbGVzIFBhZ2UKLXJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU9Um9sZXMKLXJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgcm9sZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyByb2xlIHNldC4KLXJvbGVTZXRSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIHJvbGVzOgotcm9sZVNldFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVJvbGVzOgotcm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSByb2xlcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgVG9vbCBFZGl0b3IgVG9vbCBNZW50b3JzIFBhZ2UKLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbk5hbWU9VG9vbCBNZW50b3JzCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIHRvb2wgbWVudG9ycyB0aGF0IGJlbG9uZyB0byB0aGlzIHRvb2wuCi10b29sVG9vbE1lbnRvcnNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSB0b29sIG1lbnRvcnM6Ci10b29sVG9vbE1lbnRvcnNQYWdlX3NlbGVjdGVkTGFiZWw9VG9vbCBtZW50b3JzOgotdG9vbFRvb2xNZW50b3JzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBUb29sIE1lbnRvcnMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIEN1c3RvbSBDYXRlZ29yeSBFZGl0b3IgQXNzaWduIFBhZ2UKLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uTmFtZT1Db250ZW50IEVsZW1lbnRzCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgY29udGVudCBlbGVtZW50cyB0aGF0IGNvbnN0aXR1dGUgdGhpcyBjdXN0b20gY2F0ZWdvcnkuCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIENvbnRlbnQgRWxlbWVudHM6Ci1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VsZWN0ZWRMYWJlbD1Db250ZW50IGVsZW1lbnRzOgotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IENvbnRlbnQgRWxlbWVudHMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIE5ldyBNZXRob2QgUGx1Zy1pbiBXaXphcmQKLW5ld1BsdWdpbldpemFyZF90aXRsZT1OZXcgTWV0aG9kIFBsdWctaW4KLW5ld1BsdWdpbldpemFyZFBhZ2VfdGl0bGU9Q3JlYXRlIGEgbmV3IG1ldGhvZCBwbHVnLWluCi1uZXdQbHVnaW5XaXphcmRQYWdlX3RleHQ9U3BlY2lmeSBhIG5hbWUgYW5kIHByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbmV3IG1ldGhvZCBwbHVnLWluLgotbmV3UGx1Z2luRXJyb3JfbXNnPUlVUEEwMDIxRTogRmFpbGVkIHRvIGNyZWF0ZSB0aGUgbWV0aG9kIHBsdWctaW4uCi1uZXdQbHVnaW5FcnJvcl9yZWFzb249SW50ZXJuYWwgZXJyb3IuXG5cbkNsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLSMgR2VuZXJpYyBkaWFsb2cgdGl0bGVzCi1jcmVhdGVEaWFsb2dfdGl0bGU9Q3JlYXRlIEVsZW1lbnQKLWRlbGV0ZURpYWxvZ190aXRsZT1EZWxldGUgRWxlbWVudAotZWRpdERpYWxvZ190aXRsZT1FZGl0IEVsZW1lbnQKLWVycm9yRGlhbG9nX3RpdGxlPUVycm9yCi1tb3ZlRGlhbG9nX3RpdGxlPU1vdmUgRWxlbWVudAotcmVuYW1lRGlhbG9nX3RpdGxlPVJlbmFtZSBFbGVtZW50Ci13YXJuaW5nRGlhbG9nX3RpdGxlPVdhcm5pbmcKLQotIyBBZGQgQ29uZmlndXJhdGlvbiB0byBQcm9jZXNzIEVycm9yIERpYWxvZwotYWRkQ29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9QWRkIENvbmZpZ3VyYXRpb24gdG8gUHJvY2VzcwotCi0jIFNldCBEZWZhdWx0IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nCi1zZXREZWZhdWx0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9U2V0IERlZmF1bHQgQ29uZmlndXJhdGlvbiBmb3IgUHJvY2VzcwotCi0jIEVkaXQgUHJvY2VzcyBFcnJvciBEaWFsb2cKLWVkaXRQcm9jZXNzRWxlbWVudEVycm9yRGlhbG9nX3RpdGxlPUVkaXQgUHJvY2VzcyBFbGVtZW50Ci0KLSMgT3BlbiBMaWJyYXJ5IERpYWxvZwotb3BlbkxpYnJhcnlEaWFsb2dfdGl0bGU9T3BlbiBNZXRob2QgTGlicmFyeQotb3BlbkxpYnJhcnlEaWFsb2dfdGV4dD1UaGUgY3VycmVudCBtZXRob2QgbGlicmFyeSB3YXMgbm90IHNhdmVkIHByb3Blcmx5LiBEbyB5b3Ugd2FudCB0byBpZ25vcmUgdGhlIGVycm9yIGFuZCBwcm9jZWVkIHRvIG9wZW4gYW5vdGhlciBsaWJyYXJ5PwotCi0jIFNhdmUgTGlicmFyeSBEaWFsb2cKLXNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlPVNhdmUgTWV0aG9kIExpYnJhcnkKLXNhdmVMaWJyYXJ5RGlhbG9nX3RleHQ9VGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgaGFzIGJlZW4gbW9kaWZpZWQuIERvIHlvdSB3YW50IHRvIHNhdmUgdGhlIGNoYW5nZXM/Ci0KLSMgVXBncmFkZSBMaWJyYXJ5IERpYWxvZwotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGl0bGU9VXBncmFkZSBNZXRob2QgTGlicmFyeQotCi0jIERlbGV0ZSBFbGVtZW50IFJlZmVyZW5jZSBEaWFsb2cKLWRlbGV0ZUFzc29jaWF0aW9uRGlhbG9nX3RleHQ9VGhlIGVsZW1lbnQgJyd7MH0nJyBoYXMgYWxyZWFkeSBiZWVuIGRlbGV0ZWQuIERvIHlvdSB3YW50IHRvIHJlbW92ZSBpdCBmcm9tICcnezF9Jyc/Ci0KLSMgRXJyb3IgTWVzc2FnZXMKLW5vT3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDBFOiBObyBvcGVuIG1ldGhvZCBsaWJyYXJ5LlxuXG5BIG1ldGhvZCBsaWJyYXJ5IG11c3QgYmUgb3BlbmVkIGJlZm9yZSBhIG5ldyBtZXRob2QgZWxlbWVudCBjYW4gYmUgYWRkZWQuXG5cbkNyZWF0ZSBhIG5ldyBtZXRob2QgbGlicmFyeSBvciBvcGVuIGFuIGV4aXN0aW5nIG9uZSBhbmQgdHJ5IGFnYWluLgotZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZz1JVVBBMDAwMUU6IFRoZSB7MH0gbmFtZSBpcyBtaXNzaW5nLlxuXG5BbGwgbWV0aG9kIGFuZCBwcm9jZXNzIGVsZW1lbnRzIG11c3QgaGF2ZSBhIG5hbWUuXG5cbkNsaWNrIE9LIGFuZCBlbnRlciBhIHZhbGlkIG5hbWUgZm9yIHRoZSBlbGVtZW50LgotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDJFOiBUaGUgbmFtZSAnJ3swfScnIGFscmVhZHkgZXhpc3RzLlxuXG5BIG1ldGhvZCBlbGVtZW50IG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lLlxuXG5DbGljayBPSyBhbmQgZW50ZXIgYSBkaWZmZXJlbnQgbmFtZSBmb3IgdGhlIGVsZW1lbnQuCi1jcmVhdGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDNFOiBUaGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIGNyZWF0ZWQuCi1kZWxldGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDRXOiBUaGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIGRlbGV0ZWQuCi1pbnRlcm5hbEVycm9yX21zZz1JVVBBMDAwNUU6IEFuIGludGVybmFsIGVycm9yIGhhcyBvY2N1cnJlZC5cblxuQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLWludmFsaWRQcmVzZW50YXRpb25OYW1lRXJyb3JfbXNnPUlVUEEwMDA2RTogVGhlIHNwZWNpZmllZCBwcmVzZW50YXRpb24gbmFtZSBpcyBpbnZhbGlkLlxuXG5DbGljayBPSyBhbmQgZW50ZXIgYSBkaWZmZXJlbnQgbmFtZS4KLWludmFsaWRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDdFOiBUaGUgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gJyd7MH0nJyBpcyBub3QgYSBzdWJzZXQgb2YgdGhlIHByb2Nlc3MnJ3MgZGVmYXVsdCBjb25maWd1cmF0aW9uLlxuXG5JbiBvcmRlciB0byBtYWludGFpbiB0aGUgaW50ZWdyaXR5IG9mIGEgcHJvY2VzcywgaXRzIGRlZmF1bHQgY29uZmlndXJhdGlvbiBtdXN0IGJlIGEgc3VwZXJzZXQgb2YgYWxsIG90aGVyIGNvbmZpZ3VyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvY2Vzcy5cblxuU2VsZWN0IGFub3RoZXIgY29uZmlndXJhdGlvbiBvciBtb2RpZnkgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiB0byBpbmNsdWRlIHRoZSBjb250ZW50IG9mIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGFuZCB0cnkgYWdhaW4uCi1zZXREZWZhdWx0Q29uZmlnRXJyb3JfbXNnPUlVUEEwMDA4RTogVGhlIHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uICcnezB9JycgaXMgbm90IGEgc3VwZXJzZXQgb2YgdGhlIG90aGVyIGNvbmZpZ3VyYXRpb25zIHJlZmVyZW5jZWQgYnkgdGhlIHByb2Nlc3MuXG5cbkluIG9yZGVyIHRvIG1haW50YWluIHRoZSBpbnRlZ3JpdHkgb2YgYSBwcm9jZXNzLCBpdHMgZGVmYXVsdCBjb25maWd1cmF0aW9uIG11c3QgYmUgYSBzdXBlcnNldCBvZiBhbGwgb3RoZXIgY29uZmlndXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzLlxuXG5TZWxlY3QgYW5vdGhlciBjb25maWd1cmF0aW9uIG9yIG1vZGlmeSB0aGUgY29udGVudCBvZiB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBhbmQgdHJ5IGFnYWluLgotb3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDlFOiBUaGUgbWV0aG9kIGxpYnJhcnkgY2Fubm90IGJlIGxvYWRlZC5cblxuQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLXNhdmVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEwRTogVGhlIG1ldGhvZCBsaWJyYXJ5IGNhbm5vdCBiZSBzYXZlZC4KLXNhdmVMaWJyYXJ5VG9FcnJvcl9tc2c9SVVQQTAwMTBFOiBUaGUgbWV0aG9kIGxpYnJhcnkgY2Fubm90IGJlIHNhdmVkIHRvICcnezB9JycuCi1lbGVtZW50QWxyZWFkeURlbGV0ZWRFcnJvcl9tc2c9SVVQQTAwMTFFOiBUaGUgZWxlbWVudCAnJ3swfScnIGhhcyBhbHJlYWR5IGJlZW4gZGVsZXRlZC4KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEyRTogVGhlIG1ldGhvZCBsaWJyYXJ5IGNhbm5vdCBiZSB1cGdyYWRlZC4KLQotIyBFcnJvciBSZWFzb25zCi1lcnJvcl9yZWFzb249SVVQQTAwMTZFOiBBbiBlcnJvciBoYXMgb2NjdXJyZWQuXG5cbkNsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1pbnRlcm5hbEVycm9yX3JlYXNvbj1JVVBBMDAxN0U6IEFuIGludGVybmFsIGVycm9yIGhhcyBvY2N1cnJlZC5cblxuQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfcmVhc29uPUlVUEEwMDE4RTogQW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgdGhlIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzLlxuXG5DbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotc2F2ZVVwZ3JhZGVkTGlicmFyeUVycm9yX3JlYXNvbj1JVVBBMDAxOUU6IEFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSBzYXZpbmcgdGhlIHVwZ3JhZGVkIG1ldGhvZCBsaWJyYXJ5LlxuXG5DbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0jIFByb2dyZXNzIE1lc3NhZ2VzCi1vcGVuaW5nTGlicmFyeVRhc2tfbmFtZT1PcGVuaW5nIG1ldGhvZCBsaWJyYXJ5Li4uCi1zYXZpbmdMaWJyYXJ5VGFza19uYW1lPVNhdmluZyBtZXRob2QgbGlicmFyeSAuLi4KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9VXBncmFkaW5nIG1ldGhvZCBsaWJyYXJ5Li4uCi1sb2FkaW5nTGlicmFyeUVsZW1lbnRzVGFza19uYW1lPUxvYWRpbmcgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuLi4KLXNhdmluZ1VwZ3JhZGVkRWxlbWVudHNUYXNrX25hbWU9U2F2aW5nIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzIGluIG5ldyBmaWxlIGZvcm1hdC4uLgotc2F2aW5nVGFza19uYW1lPVNhdmluZyAnJ3swfScnLi4uCi1zYXZpbmdGaWxlc1Rhc2tfbmFtZT1TYXZpbmcgZmlsZXMuLi4KLWZpeGluZ0NvbnRlbnREZXNjcmlwdGlvbkdVSURzVGFza19uYW1lPUZpeGluZyBjb250ZW50IGRlc2NyaXB0aW9uIEdVSURzLi4uCi1kZWxldGluZ0ludmFsaWRSZWZlcmVuY2VzVGFza19uYW1lPURlbGV0aW5nIGludmFsaWQgcmVmZXJlbmNlcy4uLgotCi0KLSMgQWRkIEVkaXRvciBUbyBCcm93c2luZyBQZXJzcGVjdGl2ZSBXYXJuaW5nIERpYWxvZwotYWRkRWRpdG9yVG9QZXJzcGVjdGl2ZVdhcm5pbmdfbXNnPUlVUEEwMDQ2VzogVGhpcyBwZXJzcGVjdGl2ZSBoYXMgYmVlbiBzcGVjaWFsbHkgZGVzaWduZWQgdG8gbWF4aW1pemUgeW91ciB1c2VyIGV4cGVyaWVuY2Ugb2YgYnJvd3NpbmcgdGhlIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzLiBObyBlZGl0b3IgY2FuIGJlIGFkZGVkIG9yIGRpc3BsYXllZCBoZXJlLgotCi0jIENoYW5nZSBIaXN0b3J5IERpYWxvZwotQ2hhbmdlSGlzdG9yeURpYWxvZ190aXRsZT1DaGFuZ2UgRGVzY3JpcHRpb24gSGlzdG9yeQotQ2hhbmdlSGlzdG9yeURpYWxvZ19sYWJlbD1DaGFuZ2UgaGlzdG9yeToKLQotIyBNZXRob2QgRWxlbWVudCBEZWxldGUgQWN0aW9uCi1jb25maXJtRGVsZXRlRGlhbG9nX3RpdGxlPUNvbmZpcm0gRGVsZXRpb24KLWNvbmZpcm1EZWxldGVEaWFsb2dfbXNnPUFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgJyd7MH0nJz8KLWNvbmZpcm1EZWxldGVEaWFsb2dfbXNnV2l0aFJlZmVyZW5jZT1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICcnezB9Jyc/XG5cblRoZSBmb2xsb3dpbmcgZWxlbWVudChzKSBjb250YWluIHJlZmVyZW5jZXMgdG8gdGhlIGl0ZW0ocykgdG8gYmUgZGVsZXRlZDogezF9Ci0KLSMgTmV3IExpYnJhcnkgRGlhbG9nCi1lcnJvckRpYWxvZ19tZXNzYWdlPUlVUEEwMDIyRTogVGhlICBtZXRob2QgbGlicmFyeSAnJ3swfScnIGNhbm5vdCBiZSBjcmVhdGVkLgotZXJyb3JEaWFsb2dfZXJyb3I9Q2Fubm90IGNyZWF0ZSBhIG1ldGhvZCBsaWJyYXJ5IHdpdGhpbiBhbm90aGVyIG1ldGhvZCBsaWJyYXJ5LgotZXJyX25vb3BlbmxpYnJhcnk9SVVQQTAwNDBFOiBObyBvcGVuIG1ldGhvZCBsaWJyYXJ5LlxuXG5BIG1ldGhvZCBsaWJyYXJ5IG11c3QgYmUgb3BlbmVkIGJlZm9yZSBhIG5ldyBtZXRob2QgcGx1Zy1pbiBjYW4gYmUgYWRkZWQuXG5cbkNyZWF0ZSBhIG5ldyBtZXRob2QgbGlicmFyeSBvciBvcGVuIGFuIGV4aXN0aW5nIG9uZSBhbmQgdHJ5IGFnYWluLgotZXJyX2xvYWRpbmdsaWJyYXJ5PUVycm9yIGxvYWRpbmcgbGlicmFyeQotbXNnX3JlbG9hZExpYnJhcnk9RXJyb3IgdW5kb2luZyB0aGUgZmFpbGVkIGRlbGV0aW9uLiBUaGUgY3VycmVudCBtZXRob2QgbGlicmFyeSBuZWVkcyB0byBiZSByZWxvYWRlZC4KLQotIyBSZWxvYWQgTGlicmFyeSBEaWFsb2cKLXJlbG9hZERpYWxvZ19tZXNzYWdlPVRoZSBsaWJyYXJ5IG5lZWRzIHRvIGJlIHJlbG9hZGVkIHRvIHJlc3RvcmUgaXRzIG9yaWdpbmFsIHN0YXRlLgotcmVsb2FkRGlhbG9nX3RpdGxlPVJlbG9hZCBMaWJyYXJ5Ci1kaWFsb2dzX01vdmVEaWFsb2dfZXJyb3JUaXRsZT1Nb3ZlIEVycm9yCi1kaWFsb2dzX01vdmVEaWFsb2dfZXJyb3JNZXNzYWdlPUVycm9yIGR1cmluZyBtb3ZlCi0KLSMgUHJvY2VzcyBGb3JtIEVkaXRvcgotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX3RpdGxlPVNhdmUKLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMT1UaGlzIGNoYW5nZSB3aWxsIGFmZmVjdCBhbGwgZGlhZ3JhbXMgaW4geW91ciBwcm9jZXNzLiBUaGUgZWRpdG9yIHdpbGwgYmUgc2F2ZWQgYWZ0ZXIgeW91ciBjaGFuZ2UuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UyPVRoZSBlZGl0b3Igd2lsbCBiZSBzYXZlZCBhZnRlciB5b3VyIGNoYW5nZS4gRG8geW91IHdhbnQgdG8gY29udGludWU/Ci0KLSMgQ29uZmlndXJhdGlvbiBWaWV3IFBhZ2UKLWNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ190aXRsZT1Db25maXJtIFJlbW92aW5nCi1jb25maWdWaWV3UGFnZVJlbW92ZVZpZXdEaWFsb2dfbWVzc2FnZT1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIHZpZXcgJyd7MH0nJz8KLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ190aXRsZT1XYXJuaW5nCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uPUNvbmZpZ3VyYXRpb246Ci1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld3M9Q29uZmlndXJhdGlvbiBWaWV3cwotY29uZmlnVmlld1BhZ2Vfdmlld3M9Vmlld3MKLWNvbHVtbnNlbGVjdGlvbl90ZXh0PUNvbHVtbiBzZWxlY3Rpb246Ci1jb25maWdWaWV3UGFnZV9hZGRWaWV3QnV0dG9uVGV4dD1BZGQgVmlldy4uLgotY29uZmlnVmlld1BhZ2VfcmVtb3ZlVmlld0J1dHRvblRleHQ9UmVtb3ZlIFZpZXcKLWNvbmZpZ1ZpZXdQYWdlX21ha2VEZWZhdWx0QnV0dG9uVGV4dD1NYWtlIERlZmF1bHQKLWNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ19tZXNzYWdlPUlVUEEwMDIzVzogVmlldyB3aXRoIG5hbWUgJyd7MH0nJyBhbHJlYWR5IGV4aXN0cy4KLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvblRpdGxlPVB1Ymxpc2hlZCBOYXZpZ2F0aW9uIFZpZXdzCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25NZXNzYWdlPVNwZWNpZnkgdGhlIHZpZXdzIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCB3aGVuIHRoaXMgY29uZmlndXJhdGlvbiBpcyBwdWJsaXNoZWQuIFRvIGNyZWF0ZSBhIHZpZXcsIGNsaWNrIEFkZCBWaWV3IHRvIHNlbGVjdCBhbnkgc3RhbmRhcmQgb3IgY3VzdG9tIGNhdGVnb3J5IHdpdGhpbiB0aGUgY29uZmlndXJhdGlvbi4gIFRoZSBzZWxlY3RlZCBjYXRlZ29yeSB3aWxsIHJlcHJlc2VudCB0aGUgdmlldyBhbmQgdGhlIGNhdGVnb3J5J3Mgc3ViLWNhdGVnb3JpZXMgYW5kIGNvbnRlbnQgZWxlbWVudHMgd2lsbCByZXByZXNlbnQgdGhlIHZpZXcncyB0cmVlIGVsZW1lbnRzLgotCi0jIERlc2NyaXB0aW9uIFRhYgotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfdGl0bGU9Q29udmVydCBHdWlkYW5jZQotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTE9SVVQQTAwNDBXOiAgUGxlYXNlIHNhdmUgdGhlIGVkaXRvciBmaXJzdC4KLWRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UyPVRoZXJlIGFyZSBubyBjb21wYXRpYmxlIGd1aWRhbmNlIGZvciB0aGlzIHR5cGUuCi0KLWNoYW5nZUFjdGl2aXR5VHlwZVdhcm5pbmdEaWFsb2dfdGl0bGU9Q29udmVydCBBY3Rpdml0eQotIyBBc3NvY2lhdGlvbiBGb3JtIFBhZ2UKLUFzc29jaWF0aW9uRm9ybVBhZ2VfQnJpZWZEZXNjcmlwdGlvbkxhYmVsPUJyaWVmIGRlc2NyaXB0aW9uIG9mIHNlbGVjdGVkIGVsZW1lbnQ6Ci0KLSMgTWV0aG9kIEVsZW1lbnQgRGVzY3JpcHRpb24KLW1ldGhvZEVsZW1lbnREZXNjcmlwdGlvbkVtcHR5TmFtZURpYWxvZ190aXRsZT1FbnRlciBFbGVtZW50IE5hbWUKLW1ldGhvZEVsZW1lbnREZXNjcmlwdGlvbkVtcHR5TmFtZURpYWxvZ19tZXNzYWdlPVRoZSBuYW1lIGZpZWxkIGNhbm5vdCBiZSBlbXB0eS4KLQotIyBNZXRob2QgUGx1Zy1pbiBEZXNjcmlwdGlvbgotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25SZW1vdmVSZWZDb25maXJtX21lc3NhZ2U9RGVzZWxlY3RpbmcgdGhlIHJlZmVyZW5jZWQgcGx1Zy1pbihzKSBhc3NvY2lhdGVkIHdpdGggcGx1Zy1pbiAnJ3swfScnIHdpbGwgcHJvZHVjZSBpbnZhbGlkIHJlbGF0aW9uc2hpcHMgdGhhdCB3aWxsIGJlIGRlbGV0ZWQuXG5cblRoaXMgYWN0aW9uIGNhbm5vdCBiZSB1bmRvbmUuIERvIHlvdSB3YW50IHRvIHByb2NlZWQgd2l0aCB0aGlzIGNoYW5nZT8KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jb25maXJtUmVuYW1lPVlvdSBhcmUgYWJvdXQgdG8gY2hhbmdlIHRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kIHBsdWctaW4gZnJvbSAnJ3swfScnIHRvIG5ldyBuYW1lICcnezF9JycuIFRoaXMgYWN0aW9uIHdpbGwgc2F2ZSB0aGlzIGVkaXRvciBhbmQgcmVuYW1lcyB0aGUgcGx1Zy1pbiBmb2xkZXIgdG8gdGhlIG5ldyBuYW1lLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jb25maXJtUmVuYW1lX3RpdGxlPVJlbmFtZSBNZXRob2QgUGx1Zy1pbgotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2Nhbm5vdFJlbmFtZVBsdWdpbkZvbGRlcj1Db3VsZCBub3QgcmVuYW1lIHBsdWdpbiBmb2xkZXIgdG8gbmV3IG5hbWUKLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luTGFiZWw9TG9jayBwbHVnLWluCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbl9tZXNzYWdlPUxvY2sgcGx1Zy1pbiBjaGFuZ2Ugd2lsbCBzYXZlIGFuZCBjbG9zZSBvcGVuIGVkaXRvcnMgb2YgZWxlbWVudHMgYmVsb25nIHRvIHBsdWctaW4gJyd7MH0nJy4gRG8geW91IHdhbnQgcHJvY2VlZCB3aXRoIHRoaXMgY2hhbmdlPwotCi0jIFByb2Nlc3MgRGVzY3JpcHRpb24KLXByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX3RpdGxlPVJlbmFtZQotcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fbWVzc2FnZT1Zb3UgYXJlIGFib3V0IHRvIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGlzIHByb2Nlc3MuIFRoaXMgd2lsbCBzYXZlIHRoaXMgZWRpdG9yIGFuZCByZW5hbWUgdGhlIHByb2Nlc3MgZm9sZGVyIHRvIHRoZSBuZXcgbmFtZS4gRG8geW91IHdhbnQgdG8gY29udGludWU/Ci1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbkRlc2NyaXB0aW9uPURlc2NyaXB0aW9uOgotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uVGl0bGU9Q29uZmlndXJhdGlvbgotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uTWVzc2FnZT1TcGVjaWZ5IGFsbCB0aGUgY29uZmlndXJhdGlvbnMgdmFsaWQgZm9yIHRoaXMgcHJvY2Vzcy4gU2VsZWN0IG9uZSBjb25maWd1cmF0aW9uIGFzIHRoZSBkZWZhdWx0IGFuZCBpdCBuZWVkcyB0byBiZSBhIHN1cGVyLXNldCBvZiBhbGwgdGhlIG90aGVyIGNvbmZpZ3VyYXRpb25zLgotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25zPUNvbmZpZ3VyYXRpb25zOgotcHJvY2Vzc0Rlc2NyaXB0aW9uX2RlZmF1bHQ9KGRlZmF1bHQpCi1Qcm9jZXNzRGVzY3JpcHRpb25fc2VsZWN0Q29uZmlndXJhdGlvbj1TZWxlY3QgdGhlIGNvbmZpZ3VyYXRpb25zIHRvIGFkZAotUHJvY2Vzc0RlbGV0ZUFjdGlvbl9kZWxldGVjb2Zpcm1fdGV4dDA9VGhpcyB3aWxsIHNhdmUgdGhlIGN1cnJlbnQgZWRpdG9yIGFuZCB0aGUgY2hhbmdlIHdpbGwgYmUgcGVybWFuZW50LiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICcnezB9Jyc/Ci1Qcm9jZXNzRGVsZXRlQWN0aW9uX3NlbGVjdERlc2NyaXB0b3JzVG9EZWxldGU9VGhlIGZvbGxvd2luZyBkZXNjcmlwdG9ycyBhcmUgbm90IHVzZWQgYW55d2hlcmUgYWZ0ZXIgZGVsZXRpb24gb2YgdGhlIHNlbGVjdGVkIGVsZW1lbnRzLlxuU2VsZWN0IGRlc2NyaXB0b3JzIHlvdSB3YW50IHRvIGRlbGV0ZS4KLQotIyBWaWV3IEhlbHBlcgotdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX3RpdGxlPUxpYnJhcnkgSGVhbHRoIENoZWNrCi12aWV3SGVscGVyX3BlcmZvcm1IZWFsdGhDaGVjaz1QZXJmb3JtaW5nIGhlYWx0aCBjaGVjayBvbiBsaWJyYXJ5Li4uCi12aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfbWVzc2FnZT1UaGUgaGVhbHRoIGNoZWNrIG9uIG9wZW4gbGlicmFyeSBpcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkLiBTZWUgdGhlIHJlcG9ydCBpbiB0aGUgbG9nIGZpbGUuCi0KLSMgQXR0YWNoIEd1aWRhbmNlIEZpbGUgRGlhbG9nCi1hdHRhY2hHdWlkYW5jZUZpbGVEaWFsb2dfdGl0bGU9QXR0YWNoIEZpbGUKLQotIyBDcmVhdGUgRWxlbWVudCBFcnJvciBEaWFsb2cKLWNyZWF0ZUVsZW1lbnREaWFsb2dfdGl0bGU9Q3JlYXRlIE5ldyB7MH0KLWNyZWF0ZU5ld0VsZW1lbnRFcnJvcl9tc2c9RXJyb3IgY3JlYXRpbmcgbmV3IHswfS4KLQotZGxnVGl0bGVfcmVsb2FkTGlicmFyeT1SZWxvYWQgTGlicmFyeQotY3JlYXRlRWxlbWVudEVycm9yX3JlYXNvbj1UaGUgezB9IG5hbWUgY2Fubm90IGJlIGVtcHR5LlxuXG5TcGVjaWZ5IGEgdmFsaWQgbmFtZSBhbmQgdHJ5IGFnYWluLgotZGVsZXRlQ29uZmlnRXJyb3JfcmVhc29uPVRoZSBjb25maWd1cmF0aW9uIGlzIHJlZmVyZW5jZWQgYnkgcHJvY2VzcyAnJ3swfScnCi0KLSMgQ2hhbmdlQm91bmRzQ29tbWFuZAotZ2VmX2NoYW5nZUJvdW5kc0NvbW1hbmRfbGFiZWw9Q2hhbmdlIEJvdW5kcwotIyBDaGFuZ2VOYW1lQ29tbWFuZAotZ2VmX2NoYW5nZU5hbWVDb21tYW5kX2xhYmVsPUNoYW5nZSBOYW1lCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfdW5kb01lc3NhZ2U9Q2Fubm90IHVuZG8gdGhlIG5hbWUgY2hhbmdlLlxuXG5VbmRvIG5hbWUgY2hhbmdlIGlzIG5vdCBhbGxvd2VkIGlmIHByZXZpb3VzIG5hbWUgaXMgbnVsbC4KLSMgQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQKLWdlZl9jaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZF9sYWJlbD1DaGFuZ2UgUHJvcGVydHkgVmFsdWUKLSMgQ3JlYXRlQmVuZHBvaW50Q29tbWFuZAotZ2VmX2NyZWF0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9Q3JlYXRlIEJlbmRwb2ludAotIyBDcmVhdGVMaW5rQ29tbWFuZAotZ2VmX2NyZWF0ZUxpbmtDb21tYW5kX2xhYmVsPUxpbmsgQ3JlYXRpb24KLSMgQ3JlYXRlTm9kZUNvbW1hbmQKLWdlZl9jcmVhdGVOb2RlQ29tbWFuZF9sYWJlbD1DcmVhdGUgTmV3IE5vZGUKLSMgRGVsZXRlQmVuZHBvaW50Q29tbWFuZAotZ2VmX2RlbGV0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9RGVsZXRlIEJlbmRwb2ludAotIyBEZWxldGVDb21tYW5kCi1nZWZfZGVsZXRlQ29tbWFuZF9sYWJlbD1EZWxldGUKLSMgRGVsZXRlTGlua0NvbW1hbmQKLWdlZl9kZWxldGVMaW5rQ29tbWFuZF9sYWJlbD1EZWxldGUgQ29ubmVjdGlvbgotIyBNb3ZlQmVuZHBvaW50Q29tbWFuZAotZ2VmX21vdmVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPU1vdmUgQmVuZHBvaW50Ci0jIFJlY29ubmVjdExpbmtDb21tYW5kCi1nZWZfcmVjb25uZWN0TGlua0NvbW1hbmRfbGFiZWw9UmVjb25uZWN0IExpbmsKLQotIyBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXIKLWdlZl92YWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXJfYnJpbmdEb3duUHJvbXB0PVRoZSBuYW1lIGNhbm5vdCBiZSBlbXB0eS4gUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBuYW1lLgotIyBWYWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcgotZ2VmX3ZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdD1UaGUgbmFtZSBjYW5ub3QgYmUgZW1wdHkuIFBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgbmFtZS4KLSMgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQKLWdlZl93b3JrUHJvZHVjdE5vZGVFZGl0UGFydF92YWxpZGF0ZU1lc3NhZ2U9VGhlIG5hbWUgY2Fubm90IGJlIGVtcHR5LiBQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIG5hbWUuCi0KLSMgRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uCi1hY3Rpb25zX0VsZW1lbnRzVmlld0RlbGV0ZUFjdGlvbl9tZXNzYWdlPVRoZSBjb25maWd1cmF0aW9uICcnezB9JycgY2Fubm90IGJlIGRlbGV0ZWQgc2luY2UgaXQgaXMgc3RpbGwgaW4gdXNlIGJ5IHByb2Nlc3MgJyd7MX0nJy4KLQotIyBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IKLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yVGl0bGU9RGVsZXRlIEVycm9yCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvck1lc3NhZ2U9VW5oYW5kbGVkIGV4Y2VwdGlvbgotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JSZWFzb249U2VlIGRldGFpbHMKLQotIyBNZXRob2RFbGVtZW50RWRpdG9yCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yVGl0bGU9U2F2ZSBFcnJvcgotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UxPUlVUEEwMDIwRTogRXJyb3Igc2F2aW5nIGZpbGUKLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMj1Db21taXQgRXJyb3IKLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24xPVNlZSBsb2cgZmlsZSBmb3IgbW9yZSBkZXRhaWxzCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMj1TZWUgZGV0YWlscwotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yVGl0bGU9UmVuYW1lIEVycm9yCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvck1zZz1PbmUgb3IgbWFueSBmaWxlcyBvZiB0aGlzIGVkaXRvciBoYXZlIGJlZW4gcmVtb3ZlZC4gVGhlIGVkaXRvciBpcyBubyBsb25nZXIgdmFsaWQgYW5kIGhhcyB0byBjbG9zZS4KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9pbnZhbGlkRWRpdG9yVGl0bGU9SW52YWxpZCBFZGl0b3IKLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvck1lc3NhZ2UxPUVycm9yIHJlbmFtaW5nIGZpbGUocykgJyd7MH0nJwotCi0jIERlc2NyaXB0aW9uRm9ybVBhZ2UKLXJlbmFtZUVycm9yX3RpdGxlPVJlbmFtZSBFbGVtZW50Ci1yZW5hbWVFcnJvcl9tc2c9SVVQQTAwMTNFOiBUaGUgcmVuYW1lIG9wZXJhdGlvbiBjYW5ub3QgYmUgY29tcGxldGVkLgotU2VsZWN0RWxlbWVudERpYWxvZ19zZWxlY3RlbGVtZW50X3RleHQ9U2VsZWN0IEVsZW1lbnQKLQotIyBFZGl0b3JDaG9vc2VyCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfdGl0bGU9T3BlbiBNZXRob2QgRWRpdG9yCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0Rlc2NyaXB0aW9uTGFiZWw9RGVzY3JpcHRpb246Ci1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfU2VsZWN0QWxsQnV0dG9uTGFiZWw9U2VsZWN0IEFsbAotT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZV9lZGl0X3RleHQwPUVkaXQgRWxlbWVudAotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNFOiBDYW5ub3Qgb3BlbiB0aGUgZWRpdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VsZWN0ZWQgTWV0aG9kIGVsZW1lbnQuCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZT1TZWxlY3QgSW1hZ2UgRmlsZQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeU5hbWU9TmV3IExpYnJhcnkKLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZXNjcmlwdGlvbkxhYmVsPURlc2NyaXB0aW9uOgotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb249U2VsZWN0IG9uZSBvciBtb3JlIG1ldGhvZCBjb25maWd1cmF0aW9ucyBhbmQgY2xpY2sgRmluaXNoIHRvIG9wZW4gdGhlbS4KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9EZXNlbGVjdEFsbEJ1dHRvbkxhYmVsPURlc2VsZWN0IEFsbAotRWxlbWVudHNWaWV3X21pZ3JhdGlvbl9kaXJfZGxnX2Rlc2NyaXB0aW9uX3RleHQ9U3BlY2lmeSB0aGUgZGlyZWN0b3J5IG9mIG5ld2x5IG1pZ3JhdGVkIHswfSB0byByZXBsYWNlIHRoZSBzZWxlY3RlZCB7MH0KLWVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ19yZWFzb249QSBzeXN0ZW0gZXJyb3IgaGFzIG9jY3VycmVkLiBDbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXG5DbG9zZSBzb21lIG9mIHRoZSBvcGVuZWQgZWRpdG9ycyBhbmQgdHJ5IGFnYWluLgotCi0jIERlc2NyaXB0aW9uRm9ybVBhZ2UKLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGl0bGU9SW1hZ2UgaXMgaW52YWxpZAotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZVRvb0JpZ0RpYWxvZ190ZW1wbGF0ZT1JVVBBMDAzMUU6IFRoZSBzZWxlY3RlZCBpbWFnZSAnJ3swfScnIGlzIGxhcmdlciB0aGFuIHRoZSBhbGxvd2VkIHNpemUgKHsxfSBieSB7Mn0pLiBQbGVhc2Ugc2VsZWN0IGFub3RoZXIgaW1hZ2UuCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGl0bGU9SW1hZ2UgaXMgaW52YWxpZAotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RlbXBsYXRlPUlVUEEwMDMyRTogVGhlIHNlbGVjdGVkIGZpbGUgJyd7MH0nJyBkb2VzIG5vdCBleGlzdC4gUGxlYXNlIHNlbGVjdCBhbm90aGVyIGltYWdlLgotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsPVNlbGVjdC4uLgotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeURlc2NyaXB0aW9uPU1ldGhvZCBsaWJyYXJ5IGRlc2NyaXB0aW9uCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfRGVmYXVsdEJyaWVmRGVzY3JpcHRpb249TWV0aG9kIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb24KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlRGVzY3JpcHRpb249QWxsIGVkaXRvcnMgbXVzdCBiZSBjbG9zZWQuIFNlbGVjdCB0aGUgb25lcyB0aGF0IG5lZWQgdG8gYmUgc2F2ZWQgZmlyc3QsIGlmIGFwcGxpY2FibGUuCi0KLSMgVGVtcGxhdGVEZXNjcmlwdGlvblBhZ2UKLWZvcm1zX0d1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlX2FscmVhZHlBdHRhY2hlZF9tc2c9VGhlIHNlbGVjdGVkIGZpbGUgaXMgYWxyZWFkeSBhbiBhdHRhY2htZW50IHRvIHRoaXMgR3VpZGFuY2UuCi0KLSMgTmV3IExpYnJhcnkgRXJyb3IgRGlhbG9nCi1uZXdMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDE0RTogVW5hYmxlIHRvIGNyZWF0ZSB0aGUgbWV0aG9kIGxpYnJhcnkuCi1uZXdMaWJyYXJ5SW50ZXJubEVycm9yX3JlYXNvbj1BbiBpbnRlcm5hbCBlcnJvciBoYXMgb2NjdXJyZWQuCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMT1UaGUgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5IHBhdGggJyd7MH0nJyBpcyBpbnZhbGlkLgotbmV3TGlicmFyeUVycm9yX3JlYXNvbjI9QSBtZXRob2QgbGlicmFyeSBhbHJlYWR5IGV4aXN0cyBpbiAnJ3swfScnLgotbmV3TGlicmFyeUVycm9yX3JlYXNvbjM9VGhlIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeSBmb2xkZXIgJyd7MH0nJyBjYW5ub3QgYmUgY3JlYXRlZC4KLW5ld0xpYnJhcnlFcnJvcl9hZHZpY2U9U2VsZWN0IE9LIHRvIHNwZWNpZnkgYW5vdGhlciBtZXRob2QgbGlicmFyeSBuYW1lIG9yIGxvY2F0aW9uLgotCi0jUHJvY2VzcyBsaXRlcmFscwotUHJvY2Vzc19FeHRlcm5hbElEPUV4dGVybmFsIElEOgotUHJvY2Vzc19QdXJwb3NlPVB1cnBvc2U6Ci1Qcm9jZXNzX1Njb3BlPVNjb3BlOgotUHJvY2Vzc19Vc2FnZU5vdGVzPVVzYWdlIE5vdGVzOgotUHJvY2Vzc19BbHRlcm5hdGl2ZXM9QWx0ZXJuYXRpdmVzOgotUHJvY2Vzc19Ib3dUb1N0YWZmPUhvdyB0byBTdGFmZjoKLVByb2Nlc3NfS2V5Q29uc2lkZXJhdGlvbj1LZXkgQ29uc2lkZXJhdGlvbnM6Ci1Qcm9jZXNzX1NjYWxlPVNjYWxlOgotUHJvY2Vzc19Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzPVByb2plY3QgQ2hhcmFjdGVyaXN0aWNzOgotUHJvY2Vzc19SaXNrTGV2ZWw9UmlzayBMZXZlbDoKLVByb2Nlc3NfRXN0aW1hdGluZ1RlY2huaXF1ZT1Fc3RpbWF0aW5nIFRlY2huaXF1ZXM6Ci1Qcm9jZXNzX1Byb2plY3RNZW1iZXJFeHBlcnRpc2U9UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlOgotUHJvY2Vzc19UeXBlT2ZDb250cmFjdD1UeXBlIE9mIENvbnRyYWN0OgotCi0jIEVkaXRvciBQcmV2aWV3IE5hdmlnYXRpb24gQnV0dG9ucwotYmFja0J1dHRvbl90ZXh0PUJhY2sKLWZvcndhcmRCdXR0b25fdGV4dD1Gb3J3YXJkCi1mb3J3YXJkX3RleHQ9Rm9yd2FyZAotc3RvcEJ1dHRvbl90ZXh0PVN0b3AKLXJlZnJlc2hCdXR0b25fdGV4dD1SZWZyZXNoCi1yZWZyZXNoX3RleHQ9UmVmcmVzaAotbmV3bmFtZV90ZXh0PU5ldyBuYW1lOgotcHJpbnRCdXR0b25fdGV4dD1QcmludAotCi0jIENvbnRleHQgbWVudXMKLV9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbT0mUmVmcmVzaAotX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW09JlNob3cgUHJvcGVydGllcwotCi1fVUlfTWV0aG9kRWRpdG9yX21lbnU9Jk1ldGhvZCBFZGl0b3IKLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09Jk5ldwotX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtPU4mZXcgU2libGluZwotCi1fVUlfU2VsZWN0aW9uUGFnZV9sYWJlbD1TZWxlY3Rpb24KLV9VSV9QYXJlbnRQYWdlX2xhYmVsPVBhcmVudAotX1VJX0xpc3RQYWdlX2xhYmVsPUxpc3QKLV9VSV9UcmVlUGFnZV9sYWJlbD1UcmVlCi1fVUlfVGFibGVQYWdlX2xhYmVsPVRhYmxlCi1fVUlfVGFibGVUcmVlUGFnZV9sYWJlbD1UYWJsZVRyZWUKLV9VSV9PYmplY3RDb2x1bW5fbGFiZWw9T2JqZWN0Ci1fVUlfU2VsZkNvbHVtbl9sYWJlbD1TZWxmCi0KLV9VSV9Ob09iamVjdFNlbGVjdGVkPVNlbGVjdGVkIE5vdGhpbmcKLV9VSV9TaW5nbGVPYmplY3RTZWxlY3RlZD1TZWxlY3RlZCBPYmplY3Q6IHswfQotX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQ9U2VsZWN0ZWQgezB9IE9iamVjdHMKLQotX1VJX09wZW5FZGl0b3JFcnJvcl9sYWJlbD1PcGVuIEVkaXRvcgotCi1fVUlfV2l6YXJkX2NhdGVnb3J5PUV4YW1wbGUgRU1GIE1vZGVsIENyZWF0aW9uIFdpemFyZHMKLQotX1VJX01ldGhvZE1vZGVsV2l6YXJkX2xhYmVsPU1ldGhvZCBNb2RlbAotX1VJX01ldGhvZE1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBNZXRob2QgbW9kZWwKLQotX1VJX01ldGhvZEVkaXRvcl9sYWJlbD1NZXRob2QgTW9kZWwgRWRpdG9yCi0KLV9VSV9NZXRob2RFZGl0b3JGaWxlbmFtZURlZmF1bHRCYXNlPU15Ci1fVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVFeHRlbnNpb249bWV0aG9kCi0KLV9VSV9XaXphcmRfbGFiZWw9TmV3Ci0KLV9XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9uPVRoZSBmaWxlbmFtZSBtdXN0IGVuZCBpbiAnJy57MH0nJwotCi1fVUlfTW9kZWxPYmplY3Q9TW9kZWwgT2JqZWN0Ci1fVUlfWE1MRW5jb2Rpbmc9WE1MIEVuY29kaW5nCi1fVUlfWE1MRW5jb2RpbmdDaG9pY2VzPVVURi04IEFTQ0lJIFVURi0xNiBVVEYtMTZCRSBVVEYtMTZMRSBJU08tODg1OS0xCi1fVUlfV2l6YXJkX2luaXRpYWxfb2JqZWN0X2Rlc2NyaXB0aW9uPVNlbGVjdCBhIG1vZGVsIG9iamVjdCB0byBjcmVhdGUKLQotX1VJX0ZpbGVDb25mbGljdF9sYWJlbD1GaWxlIENvbmZsaWN0Ci1fV0FSTl9GaWxlQ29uZmxpY3Q9VGhlcmUgYXJlIHVuc2F2ZWQgY2hhbmdlcyB0aGF0IGNvbmZsaWN0IHdpdGggY2hhbmdlcyBtYWRlIG91dHNpZGUgdGhlIGVkaXRvci4gRG8geW91IHdpc2ggdG8gZGlzY2FyZCB0aGlzIGVkaXRvcidzIGNoYW5nZXM/Ci0KLSMgQWRkIExpbmsgRGlhbG9nCi1hZGRMaW5rRGlhbG9nX2xpbmtUeXBlPVR5cGU6Ci1vcGVuTGlua0NoZWNrYm94X3RleHQ9T3BlbiBsaW5rIGluIGEgc2VwYXJhdGUgYnJvd3NlciB3aW5kb3cKLQotIyBBZGQgSW1hZ2UgRGlhbG9nCi1oZWlnaHRMYWJlbF90ZXh0PUhlaWdodDoKLXdpZHRoTGFiZWxfdGV4dD1XaWR0aDoKLUVsZW1lbnRzVmlld18yMD1jYXBhYmlsaXR5IHBhdHRlcm4KLUVsZW1lbnRzVmlld18yMT1kZWxpdmVyeSBwcm9jZXNzCi1FbGVtZW50c1ZpZXdfMjI9cHJvY2VzcwotRWxlbWVudHNWaWV3XzM1PXswfSBpcyByZWFkLW9ubHkuIE1ha2UgaXQgd3JpdGFibGUgYmVmb3JlIGNvbnRpbnVpbmcuCi1FbGVtZW50c1ZpZXdfMzY9RXJyb3IgbG9hZGluZyBsaWJyYXJ5Ci1hbHRUYWdMYWJlbF90ZXh0PUFMVCB0YWc6Ci1pbWFnZVNpemVMYWJlbF90ZXh0PUhlaWdodCBhbmQgd2lkdGggb2YgaW1hZ2UgbXVzdCBiZSBhdCBsZWFzdCAxMCBhbmQgbm8gbW9yZSB0aGFuIDYwMC4gSW52YWxpZCBoZWlnaHQgYW5kIHdpZHRoIHdpbGwgYmUgY29udmVydGVkIHRvIGEgc3VpdGFibGUgc2l6ZS4KLQotIyBQcm9jZXNzIEVkaXRvcgotUHJvY2Vzc0VkaXRvcj1Qcm9jZXNzRWRpdG9yCi1Qcm9jZXNzRWRpdG9yX05hbWU9TmFtZQotUHJvY2Vzc0VkaXRvcl9QcmVzZW50YXRpb25OYW1lPVByZXNlbnRhdGlvbiBOYW1lCi1Qcm9jZXNzRWRpdG9yX0luZGV4PUluZGV4Ci1Qcm9jZXNzRWRpdG9yX1ByZWRlY2Vzc29ycz1QcmVkZWNlc3NvcnMKLSNDb25maWd1cmF0aW9uUGFnZV9TZWxlY3RlZD1TZWxlY3RlZDogCi1DaGVja2xpc3RPcmRlcl9kZXNjcmlwdGlvbj1TZWxlY3QgYSBjaGVjayBpdGVtIGFuZCBjbGljayBVcCBvciBEb3duIHRvIGNoYW5nZSBpdHMgb3JkZXIuCi1FbGVtZW50c1ZpZXdfcmVuYW1pbmdfdGV4dD1SZW5hbWluZy4uLgotUHJvY2Vzc0VkaXRvcl9Nb2RlbEluZm89TW9kZWwgSW5mbwotUHJvY2Vzc0VkaXRvcl9QcmVmaXg9UHJlZml4Ci1Nb3ZlRGlhbG9nX21vdmVfdGV4dD1Nb3ZlCi1DaGVja2xpc3RPcmRlcl90aXRsZT1PcmRlciBDaGVjayBJdGVtcwotUHJvY2Vzc0VkaXRvcl9SZXBldGFibGU9UmVwZWF0YWJsZQotUHJvY2Vzc0VkaXRvcl9PbmdvaW5nPU9uZ29pbmcKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N5bmNocm9uaXphdGlvbj1TeW5jaHJvbml6ZS4uLgotUHJvY2Vzc0VkaXRvcl9FdmVudERyaXZlbj1FdmVudC1Ecml2ZW4KLVByb2Nlc3NFZGl0b3JfRGVsaXZlcmFibGU9RGVsaXZlcmFibGUKLVByb2Nlc3NFZGl0b3JfT3B0aW9uYWw9T3B0aW9uYWwKLUZpbHRlckRpYWxvZ19UeXBlX3RleHQ9TWV0aG9kIEVsZW1lbnQgVHlwZToKLUZpbHRlckRpYWxvZ19FeHBhbmRBbGw9RXhwYW5kIEFsbAotTW92ZURpYWxvZ19tb3ZpbmdfdGV4dD1Nb3ZpbmcuLi4KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbldhcm5pbmc9SVVQQTAwMjVXOiBTaGFwZSBpY29uIGZvciB7MH0gaXMgbm90IGZvdW5kIGluIHBhdGg6IHsxfQotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkU2hhcGVJY29uRXJyb3I9SVVQQTAwMjVFOiBFcnJvcjogU2hhcGUgaWNvbiBzZWN0aW9uOiB7MH0KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfTmFtZUxhYmVsPU5hbWU6Ci1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZVRpdGxlPUNyZWF0ZSBhIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbgotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX05hbWVMYWJlbD1OYW1lOgotQXV0aG9yaW5nVUlQbHVnaW5fbmV3Q29uZmlndXJhdGlvbldpemFyZF90aXRsZT1OZXcgTWV0aG9kIENvbmZpZ3VyYXRpb24KLQotIyBOZXcgTWV0aG9kIExpYnJhcnkgV2l6YXJkCi1uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlPU5ldyBNZXRob2QgTGlicmFyeQotbmV3TGlicmFyeVdpemFyZE1haW5QYWdlX3RpdGxlPUNyZWF0ZSBhIG5ldyBtZXRob2QgbGlicmFyeS4KLW5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV9kZXNjcmlwdGlvbj1TcGVjaWZ5IGEgcGF0aCBhbmQgZGVzY3JpcHRpb24gZm9yIHRoZSBuZXcgbWV0aG9kIGxpYnJhcnkuCi1uZXdMaWJyYXJ5V2l6YXJkTWFpblBhZ2VfZGVzY3JpcHRpb25fMT1TcGVjaWZ5IGEgbmFtZSwgZGVzY3JpcHRpb24gYW5kIHN0b3JhZ2UgdHlwZSBmb3IgdGhlIG5ldyBtZXRob2QgbGlicmFyeS4KLWxpYnJhcnlQYXRoTGFiZWxfdGV4dD1QYXRoOgotbGlicmFyeVR5cGVMYWJlbF90ZXh0PVR5cGU6Ci0KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlVGl0bGU9U2F2ZSBjaGFuZ2VzCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZURlc2NyaXB0aW9uPU9uZSBvciBtb3JlIG1ldGhvZCBlbGVtZW50cyBoYXZlIGJlZW4gbW9kaWZpZWQuIFNlbGVjdCB0aGUgb25lcyB0aGF0IG5lZWQgdG8gYmUgc2F2ZWQuCi1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1PcGVuIE1ldGhvZCBDb25maWd1cmF0aW9ucwotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25XaXphcmRfd2luZG93VGl0bGU9T3BlbiBNZXRob2QgQ29uZmlndXJhdGlvbnMKLUVsZW1lbnRzVmlld19yZXBsYWNlaW5nd2l0aGZvcm1hdF90ZXh0PVJlcGxhY2luZyB7MH0uLi4KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uV2FybmluZz1JVVBBMDAyNlc6IE5vZGUgaWNvbiBmb3IgezB9IGlzIG5vdCBmb3VuZCBpbiBwYXRoOiB7MX0KLU1lc3NhZ2VMYWJlbFByb3ZpZGVyX3Vuc2VsZWN0ZWRwYWNrYWdlcz0nJ3swfScnIGNvbnRhaW5zIGVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlIGVsZW1lbnRzIGluIHVuc2VsZWN0ZWQgcGFja2FnZXMKLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uRXJyb3I9SVVQQTAwMjZFOiBFcnJvcjogTm9kZSBpY29uIHNlY3Rpb246IHswfQotU3RlcHNPcmRlckRpYWxvZ19zdGVwcz1TdGVwczogCi1TdGVwc09yZGVyRGlhbG9nX3RpdGxlPU9yZGVyIFRhc2sgU3RlcHMKLVByb2Nlc3NFZGl0b3JfUGxhbm5lZD1QbGFubmVkCi1zcGVjaWZ5ZGlyZWN0b3J5X3RleHQ9UGxlYXNlIHNwZWNpZnkgYSBkaXJlY3RvcnkgdG8gc2F2ZSB0aGUgbWV0aG9kIGxpYnJhcnkgdG8KLVByb2Nlc3NFZGl0b3JfTXVsdGlwbGVPY2N1cnJlbmNlcz1NdWx0aXBsZSBPY2N1cnJlbmNlcwotUHJvY2Vzc0VkaXRvcl9FbnRyeVN0YXRlPUVudHJ5IFN0YXRlCi1Qcm9jZXNzRWRpdG9yX0V4aXRTdGF0ZT1FeGl0IFN0YXRlCi1zZWxlY3RDb2x1bW5zdG9BZGRfdGV4dD1TZWxlY3QgdGhlIGNvbHVtbnMgdG8gYWRkCi1Qcm9jZXNzRWRpdG9yX1R5cGU9VHlwZQotUHJvY2Vzc0VkaXRvcl9UZWFtPVRlYW0KLUZpbHRlckRpYWxvZ190aXRsZT1TZWxlY3QgRGlhbG9nOiAKLQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkPUFkZCBmcm9tICZNZXRob2QgQ29udGVudC4uLgotRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsPUNvbGxhcHNlIEFsbAotT3BlbkNoZWF0c2hlZXRWaWV3X3RpdGxlPU9wZW4gQ2hlYXRTaGVldCBWaWV3Ci1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Sb2xsVXA9Um9sbCAmVXAKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxEb3duPVJvbGwgRG93Jm4KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX01vdmVVcD1NJm92ZSBVcAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZURvd249TW92ZSBEbyZ3bgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsPVJldmUmYWwKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvcHk9JkNvcHkuLi4KLUZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQ9TmFtZSBwYXR0ZXJucyAobWF0Y2hpbmcgbmFtZXMgd2lsbCBiZSBzaG93bik6IAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUHJlZmVyZW5jZXM9UHJlZmVyZW5jZXMuLi4KLU1ldGhvZExpYnJhcnlFZGl0b3JfdGl0bGU9TWV0aG9kIExpYnJhcnk6IAotI01lc3NhZ2VWaWV3X3NlbGVjdGVkX3RleHQ9U2VsZWN0ZWQ6IAotTWVzc2FnZVZpZXdfZXJybXNnX3RleHQ9RGVzY3JpcHRpb24KLUVsZW1lbnRzVmlld19lcnJfc2F2aW5nPUlVUEEwMDI3RTogRXJyb3Igc2F2aW5nICcnezB9Jyd7MX0KLQotZXJyX2NvcHlpbmdfZmlsZV90aXRsZT1FcnJvciBjb3B5aW5nIGZpbGUKLWVycl9jb3B5aW5nX2ZpbGVfZXJyb3I9SVVQQTAwMjhFOiBUaGUgaWNvbiBjb3VsZCBub3QgYmUgYXNzaWduZWQuIAotZXJyX2NvcHlpbmdfZmlsZV9yZWFzb249QW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgY29weWluZyB0aGUgc2VsZWN0ZWQgZmlsZS4gQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLWVycl9wcm9jZXNzaW5nX2ZpbGVfdGl0bGU9RXJyb3IgcHJvY2Vzc2luZyBmaWxlCi1lZGl0Q29uZmlndXJhdGlvbl90b29sdGlwPUVkaXQgY29uZmlndXJhdGlvbgotZWRpdERpYWxvZ19tc2dDYW5ub3RFZGl0PUlVUEEwMDE1RTogQ2Fubm90IGVkaXQgZWxlbWVudAotU2F2ZVRoaXNBY3Rpb25fc2F2ZW9iamVjdD1TYXZlIFRoaXMgT2JqZWN0Li4uCi1FbGVtZW50c1ZpZXdfcmVwbGFjZV90ZXh0PVJlcGxhY2UKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0V4dGVuZD0mRXh0ZW5kLi4uCi1Nb3ZlRGlhbG9nX2Rlc3RpbmF0aW9uX3RleHQ9Q2hvb3NlIGRlc3RpbmF0aW9uIGZvciBzZWxlY3RlZCBlbGVtZW50KHMpOgotY2hvb3NlRGVmYXVsdERpcmVjdG9yeV90ZXh0PUNob29zZSBhIGRlZmF1bHQgZGlyZWN0b3J5IGZvciBsaWJyYXJpZXM6Ci1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzcz0mU3VwcHJlc3MKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzMj0mUHVibGlzaGluZyBPcHRpb25zLi4uCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbT0mVXNlciBEZWZpbmVkIERpYWdyYW1zLi4uCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdGl0bGU9QXNzaWduIHVzZXIgZGVmaW5lZCBkaWFncmFtcwotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkSW1hZ2U9QWN0aXZpdHkgRGlhZ3JhbToKLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZGRJbWFnZT1BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbToKLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ193cGRJbWFnZT1Xb3JrIFByb2R1Y3QgRGVwZW5lZGVuY3kgRGlhZ3JhbToKLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19ub3RhRmlsZT1JVVBBMDAwNEU6IFRoZSBzcGVjaWZpZWQgcGF0aCBpcyBub3QgYSBmaWxlLgotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2Fzc2lnbkJ1dHRvbj1TZWxlY3QuLi4KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19lbnRlcmVkSW1hZ2VOb3RGb3VuZD1JVVBBMDAyNEU6IFRoZSBzcGVjaWZpZWQgaW1hZ2UgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGxpYnJhcnkuIE1ha2Ugc3VyZSB5b3UgZW50ZXIgdGhlIHBhdGggcmVsYXRpdmUgdG8gdGhlIGxpYnJhcnkncyByb290IGRpcmVjdG9yeS4KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19zZWxlY3RlZEltYWdlTm90Rm91bmQ9SVVQQTAwMzBFOiBUaGUgaW1hZ2UgeW91IHNlbGVjdGVkIGlzIG5vdCBpbiB0aGUgbGlicmFyeS4KLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBREltYWdlPVVzZSBBY3Rpdml0eSBkaWFncmFtIGltYWdlIGZvciBicm93c2luZyBhbmQgcHVibGlzaGluZwotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZUFEREltYWdlPVVzZSBBY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbSBpbWFnZSBmb3IgYnJvd3NpbmcgYW5kIHB1Ymxpc2hpbmcKLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VXUERJbWFnZT1Vc2UgV29yayBwcm9kdWN0IGRlcGVuZGVuY3kgZGlhZ3JhbSBpbWFnZSBmb3IgYnJvd3NpbmcgYW5kIHB1Ymxpc2hpbmcKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvbnRyaWJ1dGU9TG9jYWwgQ29udHImaWJ1dGlvbgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmVwbGFjZT1Mb2NhbCBSZXBsJmFjZW1lbnQKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0RpYWdyYW1zPURpYSZncmFtcwotUHJvY2Vzc0VkaXRvcl9hY3Rpb25fZGVlcENvcHk9JkRlZXAgQ29weS4uLgotRmlsdGVyRGlhbG9nX0JyaWVmRGVzY3JpcHRpb249QnJpZWYgRGVzY3JpcHRpb246Ci1Db25maWd1cmF0aW9uUGFnZV9oaWRlVG9vbFRpcD1TaG93L0hpZGUgVW5jaGVja2VkIEVsZW1lbnRzCi1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbj1EZXNjcmlwdGlvbjoKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzQWxsPVB1Ymxpc2ggJk5vbmUKLUZpbHRlckRpYWxvZ19QYXR0ZXJuX2Rlc2NyaXB0aW9uPVBhdHRlcm5zIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWEsIHdoZXJlICo9YW55IHN0cmluZywgPz1hbnkgY2hhcmFjdGVyCi1Db25maWd1cmF0aW9uUGFnZV9UcmVlVGl0bGVMYWJlbD1Db250ZW50OgotQ29uZmlndXJhdGlvblBhZ2VfTG9hZGluZ01lc3NhZ2U9TG9hZGluZyBjb25maWd1cmF0aW9uLCBwbGVhc2Ugd2FpdCAuLi4KLU1vdmVEaWFsb2dfdmFsaWRkZXN0aW5hdGlvbl90ZXh0PVRoZSBzcGVjaWZpZWQgbW92ZSBkZXN0aW5hdGlvbiBpcyBpbnZhbGlkLgotTW92ZURpYWxvZ19jYW5ub3RNb2RpZnlEZXN0aW5hdGlvbj1JVVBBMDAzNEU6IFRoZSBzZWxlY3RlZCBkZXN0aW5hdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQuCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGw9UHVibGlzaCAmQWxsCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQmFzZUFjdGl2aXR5PU9wZW4gJkJhc2UgQWN0aXZpdHkKLVByb2Nlc3NGb3JtRWRpdG9yX2V4cGFuQWxsQWN0aW9uTGFiZWw9RSZ4cGFuZCBBbGwKLVByb2Nlc3NGb3JtRWRpdG9yX2NvbGxhcHNlQWxsQWN0aW9uTGFiZWw9Q28mbGxhcHNlIEFsbAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGlhZ3JhbT1PcGVuICZBY3Rpdml0eSBEaWFncmFtCi1Qcm9jZXNzRWRpdG9yX3Byb21wdFRvRGVsZXRlQmVmb3JlUmV2ZWFsPVRoZSB1bnN1cHByZXNzZWQgZGVzY3JpcHRvcnMgbGlzdGVkIGluIERldGFpbHMgbXVzdCBiZSBkZWxldGVkIHRvIGF2b2lkIGR1cGxpY2F0aW9uIGFmdGVyIHJldmVhbGluZyB0aGUgc2VsZWN0ZWQgZWxlbWVudHMuIENsaWNrIE9LIGlmIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGVtIGFuZCBjb250aW51ZS4KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9TZWxlY3RDb2x1bW5zPVNlbGVjdCB0aGUgY29sdW1ucyB0byBhZGQKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURldGFpbERpYWdyYW09T3BlbiBBY3Rpdml0eSAmRGV0YWlsIERpYWdyYW0KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9Db2x1bW5TZWxlY3Rpb249Q29sdW1uIHNlbGVjdGlvbjoKLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zd2l0Y2hDb25maWd1cmF0aW9uPVN3aXRjaCB0byB0aGUgUHJvY2VzcycgZGVmYXVsdCBjb25maWd1cmF0aW9uIHdoZW4gYWN0aXZhdGluZyBhIFByb2Nlc3MgZWRpdG9yCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3VwcHJlc3Npb25Hcm91cFRpdGxlPVN1cHByZXNzaW9uCi1Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfaW5oZXJpdFN1cHByZXNzaW9uU3RhdGU9SW5oZXJpdCBzdXBwcmVzc2lvbiBzdGF0ZXMKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtPU9wZW4gJldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19DbGVhckJ1dHRvbkxhYmVsPUNsZWFyCi1EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19TZWxlY3RCdXR0b25MYWJlbD1TZWxlY3QuLi4KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0luc2VydE5ld1BoYXNlPUluc2VydCBOZXcgUGhhc2UKLVZpZXdIZWxwZXJfcmVsb2FkTGliT25Sb2xsYmFja0Vycm9yPUNvdWxkIG5vdCByZWNvdmVyIGZyb20gYSBwZXJzaXN0ZW5jZSBlcnJvci4gVGhlIGxpYnJhcnkgbmVlZHMgdG8gYmUgcmVsb2FkZWQgdG8gcmVzdG9yZSBpdHMgb3JpZ2luYWwgc3RhdGUuCi1WaWV3SGVscGVyX2FscmVhZHlkZWxldGVkX3RleHQ9VGhlIGVsZW1lbnQgJyd7MH0nJyBpcyBhbHJlYWR5IGRlbGV0ZWQuCi1WaWV3SGVscGVyX2FscmVhZHlkZWxldGVkY29uZmlybV90ZXh0PVRoZSBlbGVtZW50ICcnezB9JycgaXMgYWxyZWFkeSBkZWxldGVkLiBEbyB5b3Ugd2FudCB0byByZW1vdmUgaXQgZnJvbSAnJ3sxfScnPwotQ29uZmlndXJhdGlvblBhZ2VfQWRkTWlzc2luZ1Rvb2xUaXA9QWRkIE1pc3NpbmcgUmVmZXJlbmNlcwotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb249RGVzY3JpcHRpb24KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkdlbmVyYWxJbmZvPUdlbmVyYWwgSW5mb3JtYXRpb24gCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BcHBseVBhdHRlcm49QXBwbHkgUGEmdHRlcm4KLU1vdmVEaWFsb2dfc2VsZWN0ZGVzdGluYXRpb25fdGV4dD1QbGVhc2Ugc2VsZWN0IGEgZGVzdGluYXRpb24uCi1Nb3ZlRGlhbG9nX25vbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZz1ObyBtb3ZlIGRlc3RpbmF0aW9uIHNwZWNpZmllZC4KLU1ldGhvZExpYnJhcnlFZGl0b3JfdHJvdWJsZW9iamVjdD0uIFRyb3VibGUgb2JqZWN0OiAKLU1lc3NhZ2VMYWJlbFByb3ZpZGVyX2VycmNoaWxkcGtncz1BIGNoaWxkIGNvbnRlbnQgcGFja2FnZSBvciBwcm9jZXNzIGNvbnRhaW5zIGVsZW1lbnRzIHdpdGggbWlzc2luZyByZWZlcmVuY2VzCi1Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX1RpdGxlPURpYWdyYW0gUHVibGlzaGluZyBPcHRpb25zCi1Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX01lc3NhZ2U9UGxlYXNlIHNlbGVjdCB0aGUgZGlhZ3JhbShzKSB0byBwdWJsaXNoIG9yIGRlc2VsZWN0IHRvIG5vdCBwdWJsaXNoCi1Qcm9jZXNzRWRpdG9yX1RpdGxlPVByb2Nlc3MgRWRpdG9yOiAKLVNhdmVBc3dpdGhkb3RzX3RleHQ9U2F2ZSBBcy4uLgotUHJvY2Vzc0VkaXRvcl9Xb3JrQnJlYWtkb3duU3RydWN0dXJlPVdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZQotUHJvY2Vzc0VkaXRvcl9UZWFtQWxsb2NhdGlvbj1UZWFtIEFsbG9jYXRpb24KLVByb2Nlc3NFZGl0b3JfV29ya1Byb2R1Y3RVc2FnZT1Xb3JrIFByb2R1Y3QgVXNhZ2UKLVByb2Nlc3NFZGl0b3JfQ29uc29saWRhdGVkVmlldz1Db25zb2xpZGF0ZWQgVmlldwotUHJvY2Vzc0VkaXRvcl9jb25maXJtQXV0b1N5bmNoPVRoaXMgb3BlcmF0aW9uIHJlZnJlc2hlcyB0aGUgc2VsZWN0ZWQgZGVzY3JpcHRvcnMgb3IgYWxsIGRlc2NyaXB0b3JzIGJlbG93IHRoZSBzZWxlY3RlZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIG1hcmtlZCBhcyAiU3luY2hyb25pemVkIHdpdGggc291cmNlIiBpbiB0aGUgR2VuZXJhbCB0YWIgb2YgdGhlaXIgUHJvcGVydGllcyB2aWV3LiAgSXQgcmVmcmVzaGVzIHRoZXNlIGRlc2NyaXB0b3JzIHdpdGggdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgb2YgdGhlIGxpbmtlZCBtZXRob2QgY29udGVudCBlbGVtZW50cyB1bmRlciB0aGUgcHJvY2VzcycgZGVmYXVsdCBjb25maWd1cmF0aW9uLiAgTm90ZSB0aGF0IGl0IHdpbGwgbm90IHVwZGF0ZSBhbnkgZHluYW1pY2FsbHkgbGlua2VkIChncmVlbiBpdGFsaWMpIGRlc2NyaXB0b3JzLiAgRG8geW91IHdhbnQgdG8gcHJvY2VlZD8KLVByb2Nlc3NFZGl0b3JfZGVmYXVsdFN5bmNocm9uaXphdGlvbj1EZWZhdWx0IFN5bmNocm9uaXphdGlvbiBmcm9tIG1ldGhvZCBjb250ZW50Ci1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjE9Q29uZmlndXJhdGlvbgotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24yPVBsdWctaW4gYW5kIFBhY2thZ2UgU2VsZWN0aW9uCi1OZXdMaWJyYXJ5RGlhbG9nX25ld2xpYnJhcnlfYXM9Q3JlYXRlIE5ldyBMaWJyYXJ5IEFzCi1OZXdQbHVnaW5EaWFsb2dfbmV3cGx1Z2luX3RleHQ9TmV3IE1ldGhvZCBQbHVnLWluCi1TZWxlY3RFbGVtZW50RGlhbG9nX3RpdGxlX3RleHQ9U2VsZWN0IHRoZSBlbGVtZW50IG9yIG9uZSBvZiBpdHMgY29udHJpYnV0b3JzOgotT3BlbkNvbmZpZ0RpYWxvZ25ld2NvbmZpZ190ZXh0PU5ldyBDb25maWd1cmF0aW9uOgotcHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlX0JTRWRpdG9yPVByb2Nlc3MgRWRpdG9yCi0KLSMgQWJzdHJhY3REaWFncmFtRWRpdG9yCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9QWxpZ24KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0PVJlZnJlc2ggZnJvbSBCYXNlIEFjdGl2aXR5Ci1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9Rm9ybWF0IFRleHQgQm94Li4uCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PUhvcml6b250YWxseSB0byBBdmVyYWdlCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PUhvcml6b250YWxseSB0byBGaXJzdCBTZWxlY3RlZAotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1WZXJ0aWNhbGx5IHRvIEF2ZXJhZ2UKLU1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fdGl0bGU9R2VuZXJhbCBJbmZvcm1hdGlvbgotTW92ZURpYWxvZ19pbnZhbGlkX21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9SVVQQTAwNDFFOiBUaGUgc2VsZWN0ZWQgZWxlbWVudChzKSBjYW5ub3QgYmUgbW92ZWQgdG8gdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbi4KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZW1vZGVsbGlicmFyeT1TYXZpbmcgbW9kZWwgbGlicmFyeSAuLi4KLU1ldGhvZExpYnJhcnlFZGl0b3JfZXJyb3JfZGlhbG9nX3RpdGxlPUVycm9yCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3NhdmVfbGlicmFyeV9wcm9ibGVtX21zZz1JVVBBMDAzM0U6IFByb2JsZW0gZW5jb3VudGVyZWQgaW4gc2F2aW5nIGxpYnJhcnkuCi1NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dD1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICcnezB9Jyc/Ci1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19Db250ZW50RWxlbWVudF90ZXh0PUNvbnRlbnQgRWxlbWVudHM6IAotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Ccm93c2VCdXR0b25MYWJlbD1Ccm93c2UuLi4KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb249U3BlY2lmeSBhIG5hbWUgYW5kIGRlc2NyaXB0aW9uIGZvciB0aGUgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uLgotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VUaXRsZT1TYXZlIGNoYW5nZXMgYW5kIGNsb3NlIGFsbCBlZGl0b3JzCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PVZlcnRpY2FsbHkgdG8gRmlyc3QgU2VsZWN0ZWQKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQ9U2F2ZQotQXR0YWNobWVudERpYWxvZ2F0dGFjaEZpbGVfdGV4dD1BdHRhY2ggRmlsZQotQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudD1Db25maWd1cmF0aW9uIENvbnRlbnQKLU9wZW5Db25maWdEaWFsb2dvcGVuY29uZmlnX3RleHQ9T3BlbiBDb25maWd1cmF0aW9uCi1FbGVtZW50c1ZpZXdfcmVwbGFjZUFjdGlvbl90ZXh0PVJlcGxhY2UuLi4KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9U2F2aW5nIHswfQotQ29uZmlndXJhdGlvblBhZ2VfU2hvd0Vycm9yVG9vbFRpcD1TaG93IGNvbmZpZ3VyYXRpb24gd2FybmluZyBsb2cgdmlld2VyCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25Gb3JtUHJlZml4PUNvbmZpZ3VyYXRpb246IAotQ2hlY2tsaXN0T3JkZXJfY2hlY2tsaXN0aXRlbXNfdGV4dD1DaGVjayBJdGVtczogCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw9TW92ZSBOb2RlCi1Db25maWd1cmF0aW9uUGFnZV9NYWtlQ2xvc3VyZVRvb2xUaXA9TWFrZSBDbG9zdXJlIGJ5IGZpeGluZyBlcnJvcnMKLUNvbmZpZ3VyYXRpb25PcmRlckRpYWxvZ19kZXNjcmlwdGlvbj1PcmRlciBOYXZpZ2F0aW9uIFZpZXdzCi1OZXdQbHVnaW5EaWFsb2dfcmVmZXJlbmNlcGx1Z2luX3RleHQ9UmVmZXJlbmNlIFBsdWctaW5zOgotQWJzdHJhY3REaWFncmFtRWRpdG9yX2NyZWF0ZUZyZWVUZXh0X3RleHQ9Q3JlYXRlIGEgRnJlZSBUZXh0Ci1EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19MYWJlbD1Ob2RlIEljb24gUHJldmlldzoKLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0PUlVUEEwMDMyVzogQ2Fubm90IGNvbm5lY3QKLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9zYW1lcHJlZGFuZHN1Y190ZXh0PUlVUEEwMDMzVzogQ2Fubm90IGhhdmUgdGhlIHNhbWUgYnJlYWtkb3duIGVsZW1lbnQgYXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvcgotCi0jIEVkaXRvckNob29zZXIKLUVkaXRvckNob29zZXJfbG9hZGRFcnJvckRsZ1RpdGxlPU9wZW4gRWRpdG9yCi1FZGl0b3JDaG9vc2VyX1Jlc291cmNlc0Vycm9yPVRoaXMgZWxlbWVudCBoYXMgZXJyb3JzLiBJdCBpcyByZWNvbW1lbmRlZCB0byBmaXggdGhlc2UgZXJyb3JzIGJlZm9yZSBjb250aW51aW5nIChzZWUgZGV0YWlscykuXG5cbkNsaWNrIE9LIHRvIGNvbnRpbnVlIHdpdGhvdXQgb3BlbmluZyB0aGUgZWRpdG9yLiBDbG9zZSB0aGlzIGRpYWxvZyB0byBvcGVuIHRoZSBlZGl0b3IuCi1Db25maWd1cmF0aW9uUGFnZV9Gb3JtUHJlZml4PUNvbmZpZ3VyYXRpb246IAotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uTmFtZT1OYW1lOgotQXR0YWNobWVudERpYWxvZ0ZpbGVVUkxfdGV4dD1GaWxlIFVSTDoKLVN0ZXBzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb249U2VsZWN0IGEgc3RlcCBhbmQgY2xpY2sgVXAgb3IgRG93biB0byBjaGFuZ2UgaXRzIG9yZGVyLgotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJfc2F2ZT1FcnJvciBkdXJpbmcgc2F2aW5nCi1NZXNzYWdlVmlld19lcnJlbGVtZW50X3RleHQ9UmVmZXJlbmNpbmcgRWxlbWVudAotTWVzc2FnZVZpZXdfcmVmZWxlbWVudF90ZXh0PVJlZmVyZW5jZWQgRWxlbWVudAotCi0jQWN0aXZpdHkgRGlhZ3JhbQotQWN0aXZpdHlEaWFncmFtRWRpdG9yX2NyZWF0ZVN0YXJ0Tm9kZV90ZXh0PUNyZWF0ZSBhIFN0YXJ0IE5vZGUKLUNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnREZXNjcmlwdGlvbj1TZWxlY3QgdGhlIG1ldGhvZCBwbHVnLWlucywgY29udGVudCBwYWNrYWdlcyBhbmQgcHJvY2Vzc2VzIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24uCi1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbl90ZXh0PUN1c3RvbSBDYXRlZ29yeSdzIGNvbnRlbnQgZWxlbWVudHMgb3JkZXIgZGlhbG9nCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RpcmVjdG9yeUxhYmVsPURpcmVjdG9yeToKLVJvb3RQcmVmUGFnZV9lbmFibGVwcm9jZXNzY29udHJpYnV0aW9uX3RleHQ9RW5hYmxlIFByb2Nlc3MgQ29udHJpYnV0aW9uCi1Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbl90ZXh0PVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG1ldGhvZCBjb25maWd1cmF0aW9uLgotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25MYWJlbD1EZXNjcmlwdGlvbjoKLUNvbmZpZ3VyYXRpb25PcmRlckRpYWxvZ19OYXZpZ2F0aW9uVmlld3M9TmF2aWdhdGlvbiBWaWV3czogCi1Db250cmlidXRpb25TZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3RpdGxlPUNob29zaW5nIENvbnRyaWJ1dG9ycyBmb3IgJyd7MH0nJwotRWxlbWVudHNWaWV3X29wZW5WYXJpYWJpbGl0eURpYWxvZ0FjdGlvbl90ZXh0PSZPcGVuIHZpYSB2YXJpYWJpbGl0eSBlbGVtZW50cwotVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3RpdGxlPWNob29zaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIGZvciAnJ3swfScnCi1WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdmlld2VyTGFiZWw9VmFyaWFiaWxpdHkgZWxlbWVudHMgZm9yICcnezB9JycKLURlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19MYWJlbD1TaGFwZSBJY29uIFByZXZpZXc6Ci1EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2RlbGV0ZV90ZXh0PUNhbm5vdCBkZWxldGUKLUFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9T3BlbiBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSAKLU1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fZGVzY3JpcHRpb249UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbWV0aG9kIGxpYnJhcnkuCi1EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19DbGVhckJ1dHRvbkxhYmVsPUNsZWFyCi1XUENvbXBhcnRtZW50RmlndXJlXzA9TmV3IFdvcmtQcm9kdWN0IERlc2NyaXB0b3IKLXByb21wdGZvcl9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkX3RleHQ9UHVibGlzaCBvciBicm93c2UgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIHRoYXQgaGF2ZSBub3QgYmVlbiBjcmVhdGVkIGluIHByb2Nlc3MgZWRpdG9yCi1wcm9tcHRfZm9yX3B1Ymxpc2hfZXh0ZW5kX2FjdGl2aXR5X2RpYWdyYW09UHVibGlzaCBvciBicm93c2UgYWN0aXZpdHkgZGlhZ3JhbXMgZm9yIHVubW9kaWZpZWQgYWN0aXZpdHkgZXh0ZW5zaW9ucwotCi0jQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2cKLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX05hbWVQYXR0ZXJuPU5hbWUgcGF0dGVybnMgKG1hdGNoaW5nIG5hbWVzIHdpbGwgYmUgc2hvd24pOgotc2hvd0luUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb25fbGFiZWw9JlNob3cgaW4gUmVzb3VyY2UgTmF2aWdhdG9yCi1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19QYXR0ZXJuPVBhdHRlcm5zIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWEsIHdoZXJlICo9YW55IHN0cmluZywgPz1hbnkgY2hhcmFjdGVyCi1lcnJfcHJvY2Vzc2luZ19maWxlX2Rlc2NyaXB0aW9uPUlVUEEwMDI5RTogQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgc2VsZWN0ZWQgZmlsZS4gQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX0NhdGVnb3J5VHlwZT1DYXRlZ29yeSBUeXBlIDoKLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX0JyaWVmRGVzY3JpcHRpb249QnJpZWYgRGVzY3JpcHRpb246Ci1Db25maWdQcm9jZXNzVmlld0RpYWxvZ19TZWxlY3RDYXRlZ29yaWVzPVNlbGVjdCBDYXRlZ29yaWVzCi0KLSNsb2cgbWVzc2FnZXMKLWNoZWF0c2hlZXRfbG9hZF9mYWlsdXJlX2xvZ19tc2c9RmFpbGVkIHRvIG9wZW4gdGhlIHJlcXVlc3RlZCBjaGVhdHNoZWV0OiAKLQotbmV3Q29uZmlndXJhdGlvbldpcmF6ZF9jcmVhdGVFcnJvcj1JVVBBMDAzNUU6IFRoZSBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseQotbmV3UGx1Z2luV2l6YXJkX2NyZWF0ZUVycm9yPUlVUEEwMDM2RTogVGhlIHBsdWctaW4gY2Fubm90IGJlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Ci1lcnJvckRpYWxvZ19tb3ZlRXJyb3I9SVVQQTAwMzdFOiBUaGUgZWxlbWVudCBjYW5ub3QgYmUgbW92ZWQgc3VjY2Vzc2Z1bGx5Ci1yZW5hbWVEaWFsb2dfcmVuYW1lRXJyb3I9SVVQQTAwMzhFOiBUaGUgZWxlbWVudCBjYW5ub3QgYmUgcmVuYW1lZCBzdWNjZXNzZnVsbHkKLWVycm9yRGlhbG9nX2NyZWF0ZUVycm9yPUlVUEEwMDM5RTogVGhlIGVsZW1lbnQgY2Fubm90IGJlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Ci1kdXBsaWNhdGVQbHVnaW5OYW1lRXJyb3JfbXNnPUlVUEEwMTAxRTogVGhlIG5hbWUgJyd7MH0nJyBhbHJlYWR5IGV4aXN0cy4gRW50ZXIgYSBkaWZmZXJlbnQgbmFtZSBhbmQgdHJ5IGFnYWluLgotCi0jTmV3IFN0cmluZ3MgZm9yIFByb2Nlc3NFZGl0b3IgQ29udGV4dCBtZW51IGRpYWdyYW0gaW1hZ2VzCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRBREltYWdlPUFzc2lnbiBBRCBJbWFnZS4uLgotUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JUaXRsZT1SZWZyZXNoIEVycm9yCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvck1zZz1FcnJvciByZWZyZXNoaW5nIGVkaXRvcgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkQURESW1hZ2U9QXNzaWduIEFERCBJbWFnZS4uLgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkV1BESW1hZ2U9QXNzaWduIFdQRCBJbWFnZS4uLgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURJbWFnZUluUHVibGlzaGluZz1Vc2UgQUQgSW1hZ2UgaW4gUHVibGlzaGluZwotUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVN1cHByZXNzPVRoZSBzdXBwcmVzc2VkIGRlc2NyaXB0b3JzIGxpc3RlZCBpbiBEZXRhaWxzIG11c3QgYmUgZGVsZXRlZCB0byBhdm9pZCBkdXBsaWNhdGlvbiBhZnRlciBzdXBwcmVzc2luZyB0aGUgc2VsZWN0ZWQgZWxlbWVudHMuIENsaWNrIE9LIGlmIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGVtIGFuZCBjb250aW51ZS4KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFEREltYWdlSW5QdWJsaXNoaW5nPVVzZSBBREQgSW1hZ2UgaW4gUHVibGlzaGluZwotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlV1BESW1hZ2VJblB1Ymxpc2hpbmc9VXNlIFdQRCBJbWFnZSBpbiBQdWJsaXNoaW5nCi1Qcm9jZXNzRWRpdG9yX0RpYWdyYW1JbWFnZV9JbnB1dERpYWxvZ19pbml0aWFsVmFsdWU9SW1hZ2UgUGF0aAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU2hvd0xpbmtlZEVsZW1lbnRpbkxpYnJhcnlWaWV3PVMmaG93IExpbmtlZCBFbGVtZW50IGluIExpYnJhcnkgVmlldwotUHJvY2Vzc0VkaXRvcl91cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uX2xhYmVsPVVwZGF0ZSBTdXBwcmVzc2lvbiBmcm9tICZCYXNlCi1Qcm9jZXNzRWRpdG9yX0NvbnRleHRNZW51X0RpYWdyYW1JbWFnZXM9RGlhZ3JhbSBJbWFnZXMKLQotI1N0cmluZ3MgZm9yIHN5bmNocm9uaXphdGlvbiB3aXphcmQgb24gcHJvY2VzcyBlZGl0b3IncyBCUwotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90aXRsZT1TeW5jaHJvbml6YXRpb24gRGVzY3JpcHRpb24KLXN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfdGV4dD1SZWFkIHRoZSBpbmZvcm1hdGlvbiBiZWxvdyBcCi10aGF0IGV4cGxhaW5zIHdoYXQgY3VzdG9tIHN5bmNocm9uaXphdGlvbiB3aWxsIGFjY29tcGxpc2guCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1TZWxlY3QgQ29uZmlndXJhdGlvbgotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGV4dD1TZWxlY3QgdGhlIGNvbmZpZ3VyYXRpb24gXAotdGhhdCB5b3Ugd2FudCB0byB1c2UgZm9yIHRoZSBzeW5jaHJvbml6YXRpb24uICBZb3VyIHNlbGVjdGlvbiBkZXRlcm1pbmVzIHdoaWNoIGNvbnRyaWJ1dGlvbnMgYW5kIHJlcGxhY2VtZW50cyB3aWxsIGJlIHVzZWQgZm9yIHRoZSBzeW5jaHJvbml6YXRpb24uCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV9jb25maWdMYWJlbD1Db25maWd1cmF0aW9uOgotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RpdGxlPVNlbGVjdCBQcm9wZXJ0aWVzIHRvIFN5bmNocm9uaXplCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJvcGVydGllc19sYWJsZT1Qcm9wZXJ0aWVzCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbmFtZV9sYWJsZT1OYW1lCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJlc2VudGF0aW9uTmFtZV9sYWJsZT1QcmVzZW50YXRpb24gTmFtZQotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2JyaWVmRGVzY19sYWJsZT1CcmllZiBEZXNjcmlwdGlvbgotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX29wdGlvbmFsSW5vdXRzX2xhYmVsPU9wdGlvbmFsIElucHV0cwotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX21hbmRhdG9yeUlucHV0c19sYWJsZT1NYW5kYXRvcnkgSW5wdXRzCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3V0cHV0c19sYWJlbD1PdXRwdXRzCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJpbWFyeVBlcmZvcm1lcl9sYWJlbD1QcmltYXJ5IFBlcmZvcm1lcgotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2FkZG5QZXJmb3JtZXJzX2xhYmxlPUFkZGl0aW9uYWwgUGVyZm9ybWVycwotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Jlc3BvbnNpYmxlUm9sZXNfbGFibGU9UmVzcG9uc2libGUgUm9sZXMKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9jb250bkFydGlmYWN0c19sYWJlbD1Db250YWluZWQgQXJ0aWZhY3RzCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfZGlsdmVkUGFydHNfbGFiZWw9RGVsaXZlcmFibGUgUGFydHMKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9zZWxTdGVwc19sYWJlbD1TdGVwcyBTZWxlY3Rpb24KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90ZXh0PUNob29zZSB0aGUgcHJvcGVydGllcyBvZiBcCi10aGUgbWV0aG9kIGNvbnRlbnQgdGhhdCB5b3Ugd2FudCB0byBiZSBjb25zaWRlcmVkIGZvciBzeW5jaHJvbml6YXRpb24uCi1zeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGl0bGU9U3luY2hyb25pemF0aW9uIFByZXZpZXcKLXN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90ZXh0PVJldmlldyB0aGUgcHJvcG9zZWQgc3luY2hyb25pemF0aW9uIGRldGFpbHMgYmVsb3cuCi1zZWxlY3RFZGl0b3JzVG9EaXNjYXJkQ29uZmxpY3RDaGFuZ2VzPVRoZXJlIGFyZSB1bnNhdmVkIGNoYW5nZXMgdGhhdCBjb25mbGljdCB3aXRoIGNoYW5nZXMgbWFkZSBvdXRzaWRlIHRoZSBlZGl0b3JzLlxuU2VsZWN0IHRoZSBlZGl0b3JzIHlvdSB3aXNoIHRvIGRpc2NhcmQgdGhlaXIgY2hhbmdlcy4KLXN5bmNocm9uaXphdGlvbldpemFyZF90aXRsZV90ZXh0PVN5bmNocm9uaXphdGlvbiBXaXphcmQKLXN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfZXhwbGFpblRleHQ9VGhpcyB3aXphcmQgc3VwcG9ydHMgeW91IGluIHJlZnJlc2hpbmcgXAotdGhlIHNlbGVjdGVkIGRlc2NyaXB0b3JzIG9yIGFsbCBkZXNjcmlwdG9ycyBiZWxvdyB0aGUgc2VsZWN0ZWQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBtYXJrZWQgYXMgXAotIlN5bmNocm9uaXplIHdpdGggU291cmNlIiBpbiB0aGUgR2VuZXJhbCB0YWIgb2YgdGhlaXIgUHJvcGVydGllcyB2aWV3LiAgT25seSB0aGUgcHJvcGVydGllcyB0aGF0IHlvdSBcCi1zZWxlY3QgaW4gdGhpcyB3aXphcmQgYXJlIHJlZnJlc2hlZCBpbiB0aGUgZGVzY3JpcHRvcnMuICBZb3UgY2FuIGFsc28gc2VsZWN0IGFueSB2YWxpZCBjb25maWd1cmF0aW9uIFwKLWZvciB5b3VyIHByb2Nlc3MgdG8gYmUgdXNlZCB3aGVuIGNvbXB1dGluZyB0aGUgcmVmcmVzaC4gIE5vdGUgdGhhdCB0aGUgd2l6YXJkIHdpbGwgbm90IHVwZGF0ZSBhbnkgXAotZHluYW1pY2FsbHkgbGlua2VkIChncmVlbiBpdGFsaWMpIGRlc2NyaXB0b3JzLgotCi1vcGVuUlRFPU9wZW4gcmljaCB0ZXh0IGVkaXRvcgotY2xvc2VSVEU9Q2xvc2UgcmljaCB0ZXh0IGVkaXRvcgotCi0jTmV3IFN0cmluZ3MKLXJvbGVzZXRzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZSB0aGF0IGJlbG9uZyB0byB0aGlzIHJvbGUgc2V0LgotZGlzY2lwbGluZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlIHRoYXQgYmVsb25nIHRvIHRoaXMgZGlzY2lwbGluZS4KLXdvcmtwcm9kdWN0dHlwZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlIHRoYXQgYmVsb25nIHRvIHRoaXMgd29yayBwcm9kdWN0IGtpbmQuCi1kb21haW5zX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZSB0aGF0IGJlbG9uZyB0byB0aGlzIGRvbWFpbi4KLXRvb2xzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZSB0aGF0IGJlbG9uZyB0byB0aGlzIHRvb2wuCi1jdXN0b21jYXRlZ29yeV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2UgdGhhdCBiZWxvbmcgdG8gdGhpcyBjdXN0b20gY2F0ZWdvcnkuCi0KLWNvbmNlcHRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlIHRoYXQgYmVsb25nIHRvIHRoaXMgY29uY2VwdC4KLWNoZWNrbGlzdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2UgdGhhdCBiZWxvbmcgdG8gdGhpcyBjaGVja2xpc3QuCi1leGFtcGxlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZSB0aGF0IGJlbG9uZyB0byB0aGlzIGV4YW1wbGUuCi1ndWlkZWxpbmVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlIHRoYXQgYmVsb25nIHRvIHRoaXMgZ3VpZGVsaW5lLgotcm9hZG1hcF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2UgdGhhdCBiZWxvbmcgdG8gdGhpcyByb2FkbWFwLgotcmV1c2FibGVhc3NldF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2UgdGhhdCBiZWxvbmcgdG8gdGhpcyByZXVzYWJsZSBhc3NldC4KLXN1cHBvcnRpbmdtYXRlcmlhbF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2UgdGhhdCBiZWxvbmcgdG8gdGhpcyBzdXBwb3J0aW5nIG1hdGVyaWFsLgotcmVwb3J0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZSB0aGF0IGJlbG9uZyB0byB0aGlzIHJlcG9ydC4KLXByYWN0aWNlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZSB0aGF0IGJlbG9uZyB0byB0aGlzIHByYWN0aWNlLgotdGVtcGxhdGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlIHRoYXQgYmVsb25nIHRvIHRoaXMgdGVtcGxhdGUuCi10ZXJtZGVmaW5pdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2UgdGhhdCBiZWxvbmcgdG8gdGhpcyB0ZXJtIGRlZmluaXRpb24uCi10b29sbWVudG9yX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZSB0aGF0IGJlbG9uZyB0byB0aGlzIHRvb2wgbWVudG9yLgotd2hpdGVwYXBlcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2UgdGhhdCBiZWxvbmcgdG8gdGhpcyB3aGl0ZXBhcGVyLgotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlIHRoYXQgYmVsb25nIHRvIHRoaXMgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9uLgotCi0KLSNOZXcgU3RyaW5nIFNlY3Rpb24gRGVzY3JpcHRpb24KLXJvbGVfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2xlLgotcm9sZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2xlLgotcm9sZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHJvbGUgcmVsYXRlcyB0byBhbm90aGVyIHJvbGUuCi1yb2xlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvbGUuCi0KLXRhc2tfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0YXNrLgotdGFza19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0YXNrLgotdGFza192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHRhc2sgcmVsYXRlcyB0byBhbm90aGVyIHRhc2suCi10YXNrX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhc2suCi0KLWFydGlmYWN0X2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYXJ0aWZhY3QuCi1hcnRpZmFjdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhcnRpZmFjdC4KLWFydGlmYWN0X2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIHRoZSBpY29ucyBmb3IgdGhpcyBhcnRpZmFjdC4KLWFydGlmYWN0X25vdGF0aW9uU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGVsaXZlcnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhcnRpZmFjdC4KLWFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1Qcm92aWRlIHRhaWxvcmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFydGlmYWN0LgotYXJ0aWZhY3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyBhcnRpZmFjdCByZWxhdGVzIHRvIGFub3RoZXIgYXJ0aWZhY3QuCi1hcnRpZmFjdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhcnRpZmFjdC4KLQotb3V0Y29tZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG91dGNvbWUuCi1vdXRjb21lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG91dGNvbWUuCi1vdXRjb21lX2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIHRoZSBpY29ucyBmb3IgdGhpcyBvdXRjb21lLgotb3V0Y29tZV9ub3RhdGlvblNlY3Rpb25fZGVzYz1Qcm92aWRlIGRlbGl2ZXJ5IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgb3V0Y29tZS4KLW91dGNvbWVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPVByb3ZpZGUgdGFpbG9yaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgb3V0Y29tZS4KLW91dGNvbWVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyBvdXRjb21lIHJlbGF0ZXMgdG8gYW5vdGhlciBvdXRjb21lLgotb3V0Y29tZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBvdXRjb21lLgotCi1kZWxpdmVyYWJsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRlbGl2ZXJhYmxlLgotZGVsaXZlcmFibGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGVsaXZlcmFibGUuCi1kZWxpdmVyYWJsZV9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgZGVsaXZlcmFibGUuCi1kZWxpdmVyYWJsZV9ub3RhdGlvblNlY3Rpb25fZGVzYz1Qcm92aWRlIGRlbGl2ZXJ5IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGVsaXZlcmFibGUuCi1kZWxpdmVyYWJsZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9UHJvdmlkZSB0YWlsb3JpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZWxpdmVyYWJsZS4KLWRlbGl2ZXJhYmxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgZGVsaXZlcmFibGUgcmVsYXRlcyB0byBhbm90aGVyIGRlbGl2ZXJhYmxlLgotZGVsaXZlcmFibGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGVsaXZlcmFibGUuCi0KLWRpc2NpcGxpbmVfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkaXNjaXBsaW5lLgotZGlzY2lwbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkaXNjaXBsaW5lLgotZGlzY2lwbGluZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGRpc2NpcGxpbmUgcmVsYXRlcyB0byBhbm90aGVyIGRpc2NpcGxpbmUuCi1kaXNjaXBsaW5lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRpc2NpcGxpbmUuCi0KLWRvbWFpbl9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRvbWFpbi4KLWRvbWFpbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkb21haW4uCi1kb21haW5fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyBkb21haW4gcmVsYXRlcyB0byBhbm90aGVyIGRvbWFpbi4KLWRvbWFpbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkb21haW4uCi0KLXdvcmtwcm9kdWN0dHlwZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHdvcmsgcHJvZHVjdCBraW5kLgotd29ya3Byb2R1Y3R0eXBlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHdvcmsgcHJvZHVjdCBraW5kLgotd29ya3Byb2R1Y3R0eXBlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgd29yayBwcm9kdWN0IGtpbmQgcmVsYXRlcyB0byBhbm90aGVyIHdvcmsgcHJvZHVjdCBraW5kLgotd29ya3Byb2R1Y3R0eXBlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHdvcmsgcHJvZHVjdCBraW5kLgotCi1yb2xlc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcm9sZSBzZXQuCi1yb2xlc2V0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvbGUgc2V0Lgotcm9sZXNldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHJvbGUgc2V0IHJlbGF0ZXMgdG8gYW5vdGhlciByb2xlIHNldC4KLXJvbGVzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcm9sZSBzZXQuCi0KLXRvb2xfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0b29sLgotdG9vbF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0b29sLgotdG9vbF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHRvb2wgcmVsYXRlcyB0byBhbm90aGVyIHRvb2wuCi10b29sX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRvb2wuCi0KLWNvbmNlcHRfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb25jZXB0LgotY29uY2VwdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb25jZXB0LgotY29uY2VwdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGNvbmNlcHQgcmVsYXRlcyB0byBhbm90aGVyIGNvbmNlcHQuCi1jb25jZXB0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbmNlcHQuCi0KLWNoZWNrbGlzdF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNoZWNrbGlzdC4KLWNoZWNrbGlzdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjaGVja2xpc3QuCi1jaGVja2xpc3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyBjaGVja2xpc3QgcmVsYXRlcyB0byBhbm90aGVyIGNoZWNrbGlzdC4KLWNoZWNrbGlzdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjaGVja2xpc3QuCi0KLWV4YW1wbGVfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBleGFtcGxlLgotZXhhbXBsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBleGFtcGxlLgotZXhhbXBsZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGV4YW1wbGUgcmVsYXRlcyB0byBhbm90aGVyIGV4YW1wbGUuCi1leGFtcGxlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGV4YW1wbGUuCi0KLWd1aWRlbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGd1aWRlbGluZS4KLWd1aWRlbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBndWlkZWxpbmUuCi1ndWlkZWxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyBndWlkZWxpbmUgcmVsYXRlcyB0byBhbm90aGVyIGd1aWRlbGluZS4KLWd1aWRlbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBndWlkZWxpbmUuCi0KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9uLgotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9uLgotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb24gcmVsYXRlcyB0byBhbm90aGVyIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbi4KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbi4KLQotcHJhY3RpY2VfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBwcmFjdGljZS4KLXByYWN0aWNlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHByYWN0aWNlLgotcHJhY3RpY2VfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyBwcmFjdGljZSByZWxhdGVzIHRvIGFub3RoZXIgcHJhY3RpY2UuCi1wcmFjdGljZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBwcmFjdGljZS4KLQotcmVwb3J0X2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcmVwb3J0LgotcmVwb3J0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJlcG9ydC4KLXJlcG9ydF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHJlcG9ydCByZWxhdGVzIHRvIGFub3RoZXIgcmVwb3J0LgotcmVwb3J0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJlcG9ydC4KLQotcmVzdWFibGVhc3NldF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJlc3VhYmxlIGFzc2V0LgotcmVzdWFibGVhc3NldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByZXN1YWJsZSBhc3NldC4KLXJlc3VhYmxlYXNzZXRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyByZXN1YWJsZSBhc3NldCByZWxhdGVzIHRvIGFub3RoZXIgcmVzdWFibGUgYXNzZXQuCi1yZXN1YWJsZWFzc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJlc3VhYmxlIGFzc2V0LgotCi1yb2FkbWFwX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcm9hZG1hcC4KLXJvYWRtYXBfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcm9hZG1hcC4KLXJvYWRtYXBfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyByb2FkbWFwIHJlbGF0ZXMgdG8gYW5vdGhlciByb2FkbWFwLgotcm9hZG1hcF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2FkbWFwLgotCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzdXBwb3J0aW5nIG1hdGVyaWFsLgotc3VwcG9ydGluZ21hdGVyaWFsX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHN1cHBvcnRpbmcgbWF0ZXJpYWwuCi1zdXBwb3J0aW5nbWF0ZXJpYWxfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyBzdXBwb3J0aW5nIG1hdGVyaWFsIHJlbGF0ZXMgdG8gYW5vdGhlciBzdXBwb3J0aW5nIG1hdGVyaWFsLgotc3VwcG9ydGluZ21hdGVyaWFsX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHN1cHBvcnRpbmcgbWF0ZXJpYWwuCi0KLXRlbXBsYXRlX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGVtcGxhdGUuCi10ZW1wbGF0ZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0ZW1wbGF0ZS4KLXRlbXBsYXRlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgdGVtcGxhdGUgcmVsYXRlcyB0byBhbm90aGVyIHRlbXBsYXRlLgotdGVtcGxhdGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGVtcGxhdGUuCi0KLXRlcm1kZWZpbml0aW9uX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGVybSBkZWZpbml0aW9uLgotdGVybWRlZmluaXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGVybSBkZWZpbml0aW9uLgotdGVybWRlZmluaXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyB0ZXJtIGRlZmluaXRpb24gcmVsYXRlcyB0byBhbm90aGVyIHRlcm0gZGVmaW5pdGlvbi4KLXRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRlcm0gZGVmaW5pdGlvbi4KLQotdG9vbG1lbnRvcl9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRvb2wgbWVudG9yLgotdG9vbG1lbnRvcl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0b29sIG1lbnRvci4KLXRvb2xtZW50b3JfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyB0b29sIG1lbnRvciByZWxhdGVzIHRvIGFub3RoZXIgdG9vbCBtZW50b3IuCi10b29sbWVudG9yX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRvb2wgbWVudG9yLgotCi13aGl0ZXBhcGVyX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgd2hpdGVwYXBlci4KLXdoaXRlcGFwZXJfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgd2hpdGVwYXBlci4KLXdoaXRlcGFwZXJfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyB3aGl0ZXBhcGVyIHJlbGF0ZXMgdG8gYW5vdGhlciB3aGl0ZXBhcGVyLgotd2hpdGVwYXBlcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB3aGl0ZXBhcGVyLgotCi1kaXNjaXBsaW5lZ3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkaXNjaXBsaW5lIGdyb3VwaW5nLgotZGlzY2lwbGluZWdyb3VwaW5nX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRpc2NpcGxpbmUgZ3JvdXBpbmcuCi1kaXNjaXBsaW5lZ3JvdXBpbmdfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyBkaXNjaXBsaW5lIGdyb3VwaW5nIHJlbGF0ZXMgdG8gYW5vdGhlciBkaXNjaXBsaW5lIGdyb3VwaW5nLgotZGlzY2lwbGluZWdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRpc2NpcGxpbmUgZ3JvdXBpbmcuCi0KLXJvbGVzZXRncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvbGVzZXQgZ3JvdXBpbmcuCi1yb2xlc2V0Z3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcm9sZXNldCBncm91cGluZy4KLXJvbGVzZXRncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHJvbGVzZXQgZ3JvdXBpbmcgcmVsYXRlcyB0byBhbm90aGVyIHJvbGVzZXQgZ3JvdXBpbmcuCi1yb2xlc2V0Z3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcm9sZXNldCBncm91cGluZy4KLQotY3VzdG9tY2F0ZWdvcnlfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjdXN0b20gY2F0ZWdvcnkuCi1jdXN0b21jYXRlZ29yeV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjdXN0b20gY2F0ZWdvcnkuCi1jdXN0b21jYXRlZ29yeV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGN1c3RvbSBjYXRlZ29yeSByZWxhdGVzIHRvIGFub3RoZXIgY3VzdG9tIGNhdGVnb3J5LgotY3VzdG9tY2F0ZWdvcnlfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY3VzdG9tIGNhdGVnb3J5LgotY3VzdG9tY2F0ZWdvcnlfSWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGN1c3RvbSBjYXRlZ29yeS4KLQotY29uY2VwdF9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgY29uY2VwdC4KLWNoZWNrbGlzdF9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgY2hlY2tsaXN0LgotdG9vbG1lbnRvcl9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgdG9vbCBtZW50b3IuCi13aGl0ZXBhcGVyX2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIHRoZSBpY29ucyBmb3IgdGhpcyB3aGl0ZXBhcGVyLgotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25faWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbi4KLXRlcm1kZWZpbml0aW9uX2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIHRoZSBpY29ucyBmb3IgdGhpcyB0ZXJtIGRlZmluaXRpb24uCi10ZW1wbGF0ZV9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgdGVtcGxhdGUuCi1yZXVzYWJsZWFzc2V0X2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIHRoZSBpY29ucyBmb3IgdGhpcyByZXVzYWJsZSBhc3NldC4KLXJlcG9ydF9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgcmVwb3J0LgotcHJhY3RpY2VfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHByYWN0aWNlLgotZXhhbXBsZV9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgZXhhbXBsZS4KLWd1aWRlbGluZV9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgZ3VpZGVsaW5lLgotcm9hZG1hcF9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgcm9hZG1hcC4KLXN1cHBvcnRpbmdtYXRlcmlhbF9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgc3VwcG9ydGluZyBtYXRlcmlhbC4KLQotcHVibGlzaF9jYXRlZ29yaWVzX3RleHQ9UHVibGlzaCB0aGlzIGNhdGVnb3J5IHdpdGggdGhlIGNhdGVnb3JpemVkIG1ldGhvZCBlbGVtZW50cy4KLWVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX3RpdGxlPUZpbGUgQ2hhbmdlZAotZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfbWVzc2FnZT1UaGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIG9uIHRoZSBmaWxlIHN5c3RlbS4gRG8geW91IHdhbnQgdG8gbG9hZCB0aGUgY2hhbmdlcz8KLQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU9QWN0aXZpdHkgVmFyaWFiaWxpdHkKLQotdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU9VmFyaWFiaWxpdHkKLQotY2lyY3VsYXJfZGVwZW5kZW5jeV9lcnJvcl90aXRsZT1DaXJjdWxhciBkZXBlbmRlbmN5Ci0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfdGl0bGU9QXBwbHkgUGF0dGVybgotYXBwbHlfcGF0dGVybl9lcnJvcl9tc2c9QWN0aXZpdHkgJyd7MH0nJyBjYW5ub3QgYXBwbHkgcGF0dGVybiB3aXRoICcnezF9Jycgc2luY2UgaXQgd2lsbCByZXN1bHQgaW4gY2lyY3VsYXIgZGVwZW5kZW5jeS4KLQotI3NldCBkZWZhdWx0IGhpc3Rvcnkgc2l6ZQotZGVmYXVsdF9saXN0X2xlbmd0aF9sYWJlbD1EZWZhdWx0IEhpc3Rvcnkgc2l6ZToKLQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3NfVGFzaz1TdXBwcmVzcyBUYXNrcwotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsX1Rhc2s9UmV2ZWFsIFRhc2tzCi0KLSNFeHRlbmQgU2VtYW50aWNzIHByZWZlcmVuY2UgY2hlY2sKLWV4dGVuZF9zZW1hbnRpY3NfYnV0dG9uX3RleHQ9VXNlIG5ldyAmRXh0ZW5kcyBzZW1hbnRpY3MKLWV4dGVuZF9zZW1hbnRpY3NfdGV4dD1FeHRlbmRpbmcgZWxlbWVudHMgb3ZlcnJpZGUgdG8tbWFueSByZWxhdGlvbnNoaXBzIGluc3RlYWQgb2YgYWRkaW5nIHRvIHRoZSBpbmhlcml0ZWQgZWxlbWVudHMuCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBFUEYgMS4yIG5sIHN0cmluZ3MuCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotRGVzY3JpcHRpb25Gb3JtUGFnZV9pY29uU2VjdGlvbl9maWxlTmFtZUNvbmZsaWN0X3RpdGxlPUZpbGUgTmFtZSBDb25mbGljdAotRGVzY3JpcHRpb25Gb3JtUGFnZV9pY29uU2VjdGlvbl9maWxlTmFtZUNvbmZsaWN0X21zZz1JVVBBMDA0N1c6IFRoZSBpbWFnZSBmaWxlICcnezB9JycgYWxyZWFkeSBleGlzdHMgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5IHJlc291cmNlIGZvbGRlciAnJ3sxfScnLgotRGVzY3JpcHRpb25Gb3JtUGFnZV9pY29uU2VjdGlvbl9maWxlTmFtZUNvbmZsaWN0X25vdGU9Tm90ZTogQW5vdGhlciBtZXRob2QgZWxlbWVudCBtaWdodCByZWZlcmVuY2UgdGhpcyBlbGVtZW50LgotRGVzY3JpcHRpb25Gb3JtUGFnZV9pY29uU2VjdGlvbl9maWxlTmFtZV9yZXBsYWNlX21zZz0gUmVwbGFjZSBleGlzdGluZyBpbWFnZSB3aXRoIG5ldyBpbWFnZQotRGVzY3JpcHRpb25Gb3JtUGFnZV9pY29uU2VjdGlvbl9maWxlTmFtZV91bmlxdWVfbXNnPSBTcGVjaWZ5IHVuaXF1ZSBuYW1lIGZvciB0aGlzIGltYWdlCi1EZXNjcmlwdGlvbkZvcm1QYWdlX2ljb25TZWN0aW9uX2ZpbGVOYW1lX3NlbGVjdEFjdGlvbl9sYWJlbD1TZWxlY3QgYWN0aW9uOgotCi0jTGF5b3V0IEFjdGlvbiBncm91cAotTGF5b3V0QWN0aW9uR3JvdXBfbGFiZWw9ICZQbHVnaW4gUHJlc2VudGF0aW9uCi1MYXlvdXRBY3Rpb25Hcm91cF9mbGF0TGF5b3V0QWN0aW9uX2xhYmVsPSAmRmxhdAotTGF5b3V0QWN0aW9uR3JvdXBfaGllcmFyY2hpY2FsTGF5b3V0QWN0aW9uX2xhYmVsPSAmSGllcmFyY2hpY2FsCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISEKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUNoYW5nZUhpc3RvcnlEaWFsb2dfZGVsaW1pdGVyPXwKLU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3Jfc2hvd093bmVySW5MaWJyYXJ5Vmlldz1TaG93IG93bmVyIG9mIHRoaXMgdW5yZXNvbHZlZCByZWZlcmVuY2UgaW4gTGlicmFyeSB2aWV3Ci1NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3JlbW92ZVVucmVzb2x2ZWRSZWZlcmVuY2U9UmVtb3ZlIHRoaXMgdW5yZXNvbHZlZCByZWZlcmVuY2UKLXByb21wdERlbGV0ZUN1c3RvbUNhdGVnb3J5QmVmb3JlUmVtb3ZlTGFzdFJlZlRvSXQ9WW91IGFyZSBhYm91dCB0byByZW1vdmUgdGhlIGxhc3QgcmVmZXJlbmNlIHRvIHswfSBpbiB0aGUgcGx1Zy1pbi4gVGhlIGVsZW1lbnQocykgd2lsbCBiZSBkZWxldGVkLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI0JlbG93IHByb3BlcnR5ICJlZGl0b3JfdGl0bGVfY29sb25fd2l0aF9zcGFjZXMiIHNob3VsZCBub3QgYmUgdHJhbnNsYXRlZAotI0Rvbid0IGRlbGV0ZSBhIHNwYWNlIGFmdGVyICI6ICIKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1lZGl0b3JfdGl0bGVfY29sb25fd2l0aF9zcGFjZXM9OiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvVUlBY3Rpb25EaXNwYXRjaGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvVUlBY3Rpb25EaXNwYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhNTgzODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1VJQWN0aW9uRGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkNvbnRyaWJ1dGlvblNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5QZXJzcGVjdGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogSGFuZGxlcyBVSSBhY3Rpb25zIGluIHRoZSB3b3JrYmVuY2guCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVSUFjdGlvbkRpc3BhdGNoZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgVUlBY3Rpb25EaXNwYXRjaGVyIGluc3RhbmNlID0gbnVsbDsKLQotCXByb3RlY3RlZCBMaXN0IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBkb3VibGVDbGlja0xpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgQ3VycmVudFNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uID0gbmV3IEN1cnJlbnRTZWxlY3Rpb24oKTsKLQotCXByaXZhdGUgSURvdWJsZUNsaWNrTGlzdGVuZXIgZG91YmxlQ2xpY2tMaXN0ZW5lciA9IG51bGw7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBVSUFjdGlvbkRpc3BhdGNoZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKFVJQWN0aW9uRGlzcGF0Y2hlci5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IFVJQWN0aW9uRGlzcGF0Y2hlcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogUHJpdmF0ZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgVUlBY3Rpb25EaXNwYXRjaGVyKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBhbiBhY3Rpb24gZGlzcGF0Y2hlciBvZiBteSBvd24KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKi8KLQlwdWJsaWMgVUlBY3Rpb25EaXNwYXRjaGVyKE9iamVjdCBvd25lcikgewotCQkvLyBDcmVhdGUgdGhlIGRvdWJsZSBjbGljayBsaXN0ZW5lciB1c2VkIGZvciBsYXVuY2hpbmcgdGhlIE1ldGhvZAotCQkvLyBlZGl0b3JzLgotCQlkb3VibGVDbGlja0xpc3RlbmVyID0gbmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBlKSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBlLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJCUlXb3JrYmVuY2hQYXJ0U2l0ZSBzaXRlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKQotCQkJCQkJCS5nZXRBY3RpdmVQYXJ0KCkuZ2V0U2l0ZSgpOwotCi0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCQlPYmplY3RbXSBzZWxPYmpzID0gc2VsLnRvQXJyYXkoKTsKLQkJCQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gbnVsbDsKLQotCQkJCQlpZiAoKHNlbE9ianMgIT0gbnVsbCkgJiYgKHNlbE9ianMubGVuZ3RoID4gMCkpIHsKLQkJCQkJCS8vIE9wZW4gdGhlIEF1dGhvcmluZyBwZXJzZXBlY3RpdmUuCi0JCQkJCQlVSUFjdGlvbkRpc3BhdGNoZXIub3BlbkF1dGhvcmluZ1BlcnNwZWN0aXZlKCk7Ci0KLQkJCQkJCS8vIExvY2F0ZSB0aGUgc2VsZWN0ZWQgTWV0aG9kIGVsZW1lbnQuCi0JCQkJCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoc2VsT2Jqc1swXSk7Ci0KLQkJCQkJCWlmIChzaXRlLmVxdWFscyhDb25maWd1cmF0aW9uVmlldy5nZXRWaWV3KCkuZ2V0U2l0ZSgpKSkgewotCQkJCQkJCS8vIERvdWJsZS1jbGljayBvcmdpbmF0ZWQgZnJvbSB0aGUgQ29uZmlndXJhdGlvbgotCQkJCQkJCS8vIHZpZXcuCi0JCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iajsKLQkJCQkJCQkJQ29udHJpYnV0aW9uU2VsZWN0aW9uIGNvbnRyaWJTZWxlY3Rpb24gPSBuZXcgQ29udHJpYnV0aW9uU2VsZWN0aW9uKCk7Ci0JCQkJCQkJCXNlbGVjdGVkT2JqZWN0ID0gY29udHJpYlNlbGVjdGlvbgotCQkJCQkJCQkJCS5nZXRTZWxlY3RlZENvbnRyaWJ1dG9yKGVsZW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJc2VsZWN0ZWRPYmplY3QgPSBvYmo7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChzZWxlY3RlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQkJCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLm9wZW5FZGl0b3IoCi0JCQkJCQkJCQlzZWxlY3RlZE9iamVjdCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gQWRkIGEgcGVyc3BlY3RpdmUgbGlzdGVuZXIgdG8gZW5hYmxlL2Rpc2FibGUgZG91YmxlLWNsaWNrIGxpc3RlbmluZy4KLQkJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXb3JrYmVuY2hXaW5kb3cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmIChhY3RpdmVXb3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkgewotCQkJYWN0aXZlV29ya2JlbmNoV2luZG93Ci0JCQkJCS5hZGRQZXJzcGVjdGl2ZUxpc3RlbmVyKG5ldyBJUGVyc3BlY3RpdmVMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHBlcnNwZWN0aXZlQWN0aXZhdGVkKElXb3JrYmVuY2hQYWdlIHBhZ2UsCi0JCQkJCQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZGVzYykgewotCQkJCQkJCWlmIChkZXNjLmdldElkKCkuZXF1YWxzKAotCQkJCQkJCQkJQXV0aG9yaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpKSB7Ci0JCQkJCQkJCWFkZERvdWJsZUNsaWNrTGlzdGVuZXIoZG91YmxlQ2xpY2tMaXN0ZW5lcik7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihkb3VibGVDbGlja0xpc3RlbmVyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHBlcnNwZWN0aXZlQ2hhbmdlZChJV29ya2JlbmNoUGFnZSBwYWdlLAotCQkJCQkJCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGRlc2MsIFN0cmluZyBpZCkgewotCQkJCQkJfQotCQkJCQl9KTsKLQkJfQotCi0JCWlmIChQZXJzcGVjdGl2ZVV0aWwKLQkJCQkuaXNBY3RpdmVQZXJzcGVjdGl2ZShBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCkpIHsKLQkJCWFkZERvdWJsZUNsaWNrTGlzdGVuZXIoZG91YmxlQ2xpY2tMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZWRpdENvbmZpZ3VyYXRpb24oU3RyaW5nIGNvbmZpZ05hbWUpIHsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGxpYnJhcnkgcGVyc3BlY3RpdmUKLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuTGlicmFyeVBlcnNwZWN0aXZlKCkgewotCQlQZXJzcGVjdGl2ZVV0aWwub3BlblBlcnNwZWN0aXZlKEJyb3dzaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpOwotCQlJV29ya2JlbmNoUGFnZSB3a2JQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlWaWV3UGFydCB2aWV3UGFydCA9IHdrYlBhZ2UuZmluZFZpZXcoTGlicmFyeVZpZXcuVklFV19JRCk7Ci0JCWlmICh2aWV3UGFydCAhPSBudWxsKQotCQkJd2tiUGFnZS5oaWRlVmlldyh2aWV3UGFydCk7Ci0JCXZpZXdQYXJ0ID0gd2tiUGFnZS5maW5kVmlldyhDb25maWd1cmF0aW9uVmlldy5WSUVXX0lEKTsKLQkJd2tiUGFnZS5hY3RpdmF0ZSh2aWV3UGFydCk7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhdXRob3JpbmcgcGVyc3BlY3RpdmUKLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmUoKSB7Ci0JCVBlcnNwZWN0aXZlVXRpbC5vcGVuUGVyc3BlY3RpdmUoQXV0aG9yaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpOwotCQlJV29ya2JlbmNoUGFnZSB3a2JQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlWaWV3UGFydCB2aWV3UGFydCA9IHdrYlBhZ2UuZmluZFZpZXcoTGlicmFyeVZpZXcuVklFV19JRCk7Ci0JCXdrYlBhZ2UuYWN0aXZhdGUodmlld1BhcnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoIXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI3JlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGN1cnJlbnQgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudFNlbGVjdGlvbi5zZWxlY3Rpb247Ci0JfQotCi0JcHVibGljIElTZWxlY3Rpb25Qcm92aWRlciBnZXRTZWxlY3Rpb25Tb3VyY2UoKSB7Ci0JCXJldHVybiBjdXJyZW50U2VsZWN0aW9uLnNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGN1cnJlbnQgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldFNlbGVjdGlvbih0aGlzLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNldHMgY3VycmVudCBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvblByb3ZpZGVyIHNvdXJjZSwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQljdXJyZW50U2VsZWN0aW9uLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJCWN1cnJlbnRTZWxlY3Rpb24uc291cmNlID0gc291cmNlOwotCi0JCQlTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHNvdXJjZSwKLQkJCQkJc2VsZWN0aW9uKTsKLQotCQkJLy8gQXZvaWQgY29uY3VycmVudCBlcnJvci4KLQkJCUxpc3QgcHJvY2Vzc2VkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl3aGlsZSAoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5zaXplKCkgPiAwKSB7Ci0JCQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzCi0JCQkJCQkucmVtb3ZlKDApOwotCQkJCWlmIChsaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCQlwcm9jZXNzZWRJdGVtcy5hZGQobGlzdGVuZXIpOwotCQkJCX0KLQkJCX0KLQotCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGRBbGwocHJvY2Vzc2VkSXRlbXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIGRvdWJsZSBjbGljayBsaXN0ZW5lcgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERvdWJsZUNsaWNrTGlzdGVuZXIoSURvdWJsZUNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKCFkb3VibGVDbGlja0xpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCWRvdWJsZUNsaWNrTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZG91YmxlIGNsaWNrIGxpc3RlbmVyCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihJRG91YmxlQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlkb3VibGVDbGlja0xpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBkb3VibGUgY2xpY2sgZXZlbnQKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVEb3VibGVDbGlja0V2ZW50KERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkvLyBBdm9pZCBjb25jdXJyZW50IGVycm9yLgotCQkJTGlzdCBwcm9jZXNzZWRJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXdoaWxlIChkb3VibGVDbGlja0xpc3RlbmVycy5zaXplKCkgPiAwKSB7Ci0JCQkJSURvdWJsZUNsaWNrTGlzdGVuZXIgbGlzdGVuZXIgPSAoSURvdWJsZUNsaWNrTGlzdGVuZXIpIGRvdWJsZUNsaWNrTGlzdGVuZXJzCi0JCQkJCQkucmVtb3ZlKDApOwotCQkJCXRyeSB7Ci0JCQkJCWxpc3RlbmVyLmRvdWJsZUNsaWNrKGV2ZW50KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJCXByb2Nlc3NlZEl0ZW1zLmFkZChsaXN0ZW5lcik7Ci0JCQl9Ci0JCQlkb3VibGVDbGlja0xpc3RlbmVycy5hZGRBbGwocHJvY2Vzc2VkSXRlbXMpOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIEN1cnJlbnRTZWxlY3Rpb24gewotCi0JCXB1YmxpYyBJU2VsZWN0aW9uUHJvdmlkZXIgc291cmNlID0gbnVsbDsKLQotCQlwdWJsaWMgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQWN0aXZpdHlEZXRhaWxEaWFncmFtSW5mb0FjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQWN0aXZpdHlEZXRhaWxEaWFncmFtSW5mb0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMmMzMTA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUluZm9BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQURESW5mb0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkRlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBBY3Rpb24gdG8gc2hvdyB0aGUgQURESW5mb0RpYWxvZywgdG8gc2hvdyB0aGUgQWN0aXZpdHlEZXRhaWxEaWFncmFtcwotICogaW4gdGhlIHByb2Nlc3MuIE5vdCBpbiB1c2UuCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUluZm9BY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JcHJvdGVjdGVkIE9iamVjdCBzZWxlY3RlZDsKLQkKLQlwdWJsaWMgQWN0aXZpdHlEZXRhaWxEaWFncmFtSW5mb0FjdGlvbigpIHsKLQkJc3VwZXIoIkFjdGl2aXR5IERldGFpbCBEaWFncmFtIEluZm8iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQkKLQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgQURERmlsdGVyKG51bGwsIG51bGwsIG51bGwpOwotCQkKLQkJQURESW5mb0RpYWxvZyBmZCA9IG5ldyBBRERJbmZvRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBnZXRPYmplY3QoKSwgIkFjdGl2aXR5IiwKLQkJCQludWxsKTsKLQotCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZmQuc2V0VGl0bGUoIkFjdGl2aXR5Iik7Ci0JCWZkLm9wZW4oKTsKLQkJTGlzdCBsaXN0ID0gZmQuZ2V0U2VsZWN0ZWRJdGVtcygpOwotCQkKLQkJdHJ5IHsKLQkJCUlFZGl0b3JQYXJ0IHBhcmVudCA9IGdldFBhZ2V4KCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLkVkaXRvcklucHV0KAotCQkJCQlsaXN0LmdldCgwKSwgU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24oKFByb2Nlc3MpZ2V0T2JqZWN0KCkpKTsKLQkJCUlFZGl0b3JQYXJ0IHBhcnQgPSBnZXRQYWdleCgpLm9wZW5FZGl0b3IoaW5wdXQsCi0JCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5jbGFzcwotCQkJCQkuZ2V0TmFtZSgpKTsKLQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKSB7Ci0JCQkJQWJzdHJhY3REaWFncmFtRWRpdG9yIGVkaXRvciA9IChBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHBhcnQ7Ci0JCQkJZWRpdG9yLnNldFBhcmVudEVkaXRvcihwYXJlbnQpOwotCQkJfQotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJZXhjZXB0aW9uKTsKLQkJfQotCQkvLyBvcGVuIGVkaXRvcgotCi0JCXN1cGVyLnJ1bigpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpewotCQlyZXR1cm4gc2VsZWN0ZWQ7Ci0JfQotCQotCXB1YmxpYyBJV29ya2JlbmNoUGFnZSBnZXRQYWdleCgpewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gc3VwZXIuaXNFbmFibGVkKCk7Ci0JfQotCXB1YmxpYyBjbGFzcyBBRERGaWx0ZXIgZXh0ZW5kcyBEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlciB7Ci0JCXB1YmxpYyBBRERGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIFZpZXdlciB2aWV3ZXIsIFN0cmluZyBmaWx0ZXJTdHIpIHsKLQkJCXN1cGVyKG1ldGhvZENvbmZpZywgdmlld2VyLCBmaWx0ZXJTdHIpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSByZXR1cm4gdHJ1ZTsKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gZCA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0VU1BRGlhZ3JhbSgoQWN0aXZpdHkpIG9iaiwgR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSwgZmFsc2UpOwotCQkJCWlmKGQgIT0gbnVsbCApIHJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQ29uZmlndXJhdGlvblZpZXdFZGl0QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9Db25maWd1cmF0aW9uVmlld0VkaXRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQ3MGVhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9Db25maWd1cmF0aW9uVmlld0VkaXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuUGVyc3BlY3RpdmVMaXN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlVJQWN0aW9uRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQ29udHJpYnV0aW9uU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5CYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb247Ci0KLQotLyoqCi0gKiBFZGl0cyBhbiBlbGVtZW50IGluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uVmlld0VkaXRBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24gewotCi0JLyoqCi0JICogVGhlIElEIGZvciB0aGlzIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fSUQgPSBDb25maWd1cmF0aW9uVmlld0VkaXRBY3Rpb24uY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkOwotCi0JcHJpdmF0ZSBDb250cmlidXRpb25TZWxlY3Rpb24gY29udHJpYnV0b3JTZWxlY3RvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25WaWV3RWRpdEFjdGlvbihTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQkJY29udHJpYnV0b3JTZWxlY3RvciA9IG5ldyBDb250cmlidXRpb25TZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gc2VsZWN0ZWQuaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKG9iamVjdHMubmV4dCgpKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGNvbnRyaWJ1dG9yU2VsZWN0b3IKLQkJCQkJCS5nZXRTZWxlY3RlZENvbnRyaWJ1dG9yKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQpOwotCQkJCWlmIChvYmogIT0gbnVsbCkKLQkJCQkJZWxlbWVudExpc3QuYWRkKG9iaik7Ci0JCQl9IGVsc2UgewotCQkJCWVsZW1lbnRMaXN0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCWlmIChlbGVtZW50TGlzdC5zaXplKCkgPCAxKQotCQkJcmV0dXJuOwotCi0JCWlmIChQZXJzcGVjdGl2ZUxpc3RVdGlsLmlzQnJvd3NpbmdQZXJzcGVjdGl2ZSgpKSB7Ci0JCQlVSUFjdGlvbkRpc3BhdGNoZXIub3BlbkF1dGhvcmluZ1BlcnNwZWN0aXZlKCk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSBlbGVtZW50TGlzdC5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gb2JqZWN0cy5uZXh0KCk7Ci0JCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkub3BlbkVkaXRvcihlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhpcyBhY3Rpb24gaW4gcmVzcG9uc2UgdG8gdGhlIGdpdmVuIHNlbGVjdGlvbiBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2VsZWN0ZWQgPSBzZWxlY3Rpb247Ci0KLQkJYm9vbGVhbiBlbmFibGVUaGVNZW51ID0gdHJ1ZTsKLQotCQlmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IG9iamVjdHMubmV4dCgpOwotCQkJT2JqZWN0IHJlYWxPYmogPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCWlmICghKHJlYWxPYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSkgewotCQkJCWVuYWJsZVRoZU1lbnUgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAoKHJlYWxPYmogaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpCi0JCQkJCXx8IChyZWFsT2JqIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKChyZWFsT2JqIGluc3RhbmNlb2YgUGhhc2UpCi0JCQkJCXx8IChyZWFsT2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpCi0JCQkJCXx8IChyZWFsT2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpKSB7Ci0JCQkJZW5hYmxlVGhlTWVudSA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVuYWJsZVRoZU1lbnU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9DcmVhdGVNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQ3JlYXRlTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODA2ZDgzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9DcmVhdGVNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLklFZGl0b3JLZWVwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5WaWV3SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Db21tYW5kU3RhdHVzQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLS8qKgotICogQ3JlYXRlcyBhIG5ldyBNZXRob2QgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTWV0aG9kRWxlbWVudENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kV3JhcHBlciBpbXBsZW1lbnRzCi0JCUNvbW1hbmRBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDcmVhdGVNZXRob2RFbGVtZW50Q29tbWFuZChDb21tYW5kIGNvbW1hbmQpIHsKLQkJc3VwZXIoY29tbWFuZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXIjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJQ29tbWFuZCBjbWQgPSBUbmdVdGlsLnVud3JhcCh0aGlzKTsKLQotCQlzdXBlci5leGVjdXRlKCk7Ci0KLQkJaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBDcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZCkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSAoKENyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kKSBjb21tYW5kKQotCQkJCQkuZ2V0U3RhdHVzKCk7Ci0JCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlpZiAoQ29tbWFuZFN0YXR1c0NoZWNrZXIuaGFzUm9sbGJhY2tFcnJvcihzdGF0dXMpKSB7Ci0JCQkJCVZpZXdIZWxwZXIucmVsb2FkQ3VycmVudExpYmFyeU9uUm9sbGJhY2tFcnJvcihudWxsKTsKLQkJCQl9IGVsc2UgaWYgKCFDb21tYW5kU3RhdHVzQ2hlY2tlci5oYXNTYXZlRXJyb3Ioc3RhdHVzKSkgewotCQkJCQlkaXNwbGF5RXJyb3Ioc3RhdHVzKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGVsc2UgewotCQkJY21kID0gdGhpczsKLQotCQkJd2hpbGUgKGNtZCBpbnN0YW5jZW9mIENvbW1hbmRXcmFwcGVyCi0JCQkJCSYmICEoY21kIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQpKSB7Ci0JCQkJY21kID0gKChDb21tYW5kV3JhcHBlcikgY21kKS5nZXRDb21tYW5kKCk7Ci0JCQl9Ci0KLQkJCWlmIChjbWQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCkgewotCQkJCU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kIGFkZENtZCA9ICgoTWV0aG9kRWxlbWVudEFkZENvbW1hbmQpIGNtZCk7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBhZGRDbWQuZ2V0U3RhdHVzKCk7Ci0JCQkJaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCWlmIChDb21tYW5kU3RhdHVzQ2hlY2tlci5oYXNSb2xsYmFja0Vycm9yKHN0YXR1cykpIHsKLQkJCQkJCVZpZXdIZWxwZXIucmVsb2FkQ3VycmVudExpYmFyeU9uUm9sbGJhY2tFcnJvcihudWxsKTsKLQkJCQkJfSBlbHNlIGlmICghQ29tbWFuZFN0YXR1c0NoZWNrZXIuaGFzU2F2ZUVycm9yKHN0YXR1cykpIHsKLQkJCQkJCWRpc3BsYXlFcnJvcihzdGF0dXMpOwotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IGdldENvbW1hbmQoKS5nZXRSZXN1bHQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzdWx0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0ICYmICgoRU9iamVjdCkgb2JqKS5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJCS8vIE9wZW4gdGhlIGVkaXRvciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgZWxlbWVudC4KLQkJCQlJRWRpdG9yS2VlcGVyLlJFRkVSRU5DRS5nZXRFZGl0b3JLZWVwZXIoKS5vcGVuRWRpdG9yKG9iaik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlciNjYW5VbmRvKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRBY3Rpb25EZWxlZ2F0ZSNnZXRJbWFnZSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZSgpIHsKLQkJQ29tbWFuZEFjdGlvbkRlbGVnYXRlIGNtZCA9IChDb21tYW5kQWN0aW9uRGVsZWdhdGUpIGdldENvbW1hbmQoKTsKLQkJcmV0dXJuIGNtZC5nZXRJbWFnZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kQWN0aW9uRGVsZWdhdGUjZ2V0VGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlDb21tYW5kQWN0aW9uRGVsZWdhdGUgY21kID0gKENvbW1hbmRBY3Rpb25EZWxlZ2F0ZSkgZ2V0Q29tbWFuZCgpOwotCQlyZXR1cm4gY21kLmdldFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZEFjdGlvbkRlbGVnYXRlI2dldFRvb2xUaXBUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlDb21tYW5kQWN0aW9uRGVsZWdhdGUgY21kID0gKENvbW1hbmRBY3Rpb25EZWxlZ2F0ZSkgZ2V0Q29tbWFuZCgpOwotCQlyZXR1cm4gY21kLmdldFRvb2xUaXBUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheSBhbiBlcnJvciBkaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcGxheUVycm9yKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWludCBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOwotCQlpZiAoc2V2ZXJpdHkgPT0gSVN0YXR1cy5FUlJPUiB8fCBzZXZlcml0eSA9PSBJU3RhdHVzLldBUk5JTkcpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5KAotCQkJCQlnZXRMYWJlbCgpLAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ19jcmVhdGVFcnJvcgotCQkJCQksIHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0RpYWdyYW1QcmludEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvRGlhZ3JhbVByaW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg2NDhkNGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvRGlhZ3JhbVByaW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wcmludC5QcmludEdyYXBoaWNhbFZpZXdlck9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5QcmludEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy5QcmludERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuUHJpbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuUHJpbnRlckRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogCi0gKiBQcmludCBkaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1QcmludEFjdGlvbiBleHRlbmRzIFByaW50QWN0aW9uIHsKLQotCUdyYXBoaWNhbFZpZXdlciB2aWV3ZXI7Ci0JLyoqCi0JICogQHBhcmFtIHBhcnQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbVByaW50QWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQsIEdyYXBoaWNhbFZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIocGFydCk7Ci0JCXRoaXMudmlld2VyID0gdmlld2VyOwotCX0KLQkKLQkvKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLlByaW50QWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQkvL0dyYXBoaWNhbFZpZXdlciB2aWV3ZXI7Ci0JCVByaW50RGlhbG9nIGRpYWxvZyA9IG5ldyBQcmludERpYWxvZyh2aWV3ZXIuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIFNXVC5OVUxMKTsKLQkJUHJpbnRlckRhdGEgZGF0YSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQotCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQlQcmludEdyYXBoaWNhbFZpZXdlck9wZXJhdGlvbiBvcCA9IAotCQkJCQkJbmV3IFByaW50R3JhcGhpY2FsVmlld2VyT3BlcmF0aW9uKG5ldyBQcmludGVyKGRhdGEpLCB2aWV3ZXIpOwotCQkJb3AucnVuKGdldFdvcmtiZW5jaFBhcnQoKS5nZXRUaXRsZSgpKTsKLQkJfQotCQlzdXBlci5ydW4oKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IGdyYXBoaWNhbCB2aWV3ZXIKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyKEdyYXBoaWNhbFZpZXdlciB2aWV3ZXIpIHsKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBncmFwaGljYWwgdmlld2VyCi0JICogQHJldHVybiB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgR3JhcGhpY2FsVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDhkYTU0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9JTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JUGFnZTsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgTGlicmFyeSB2aWV3IGFjdGlvbiBiYXIgY29udHJpYnV0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzCi0JCUlFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciB7Ci0KLQlwdWJsaWMgSVZpZXdQYXJ0IGdldEFjdGl2ZVZpZXcoKTsKLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVZpZXcoSVZpZXdQYXJ0IHBhcnQpOwotCi0JcHVibGljIHZvaWQgc2hhcmVHbG9iYWxBY3Rpb25zKElQYWdlIHBhZ2UsIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpOwotCi0JcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcik7Ci0KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCk7Ci0KLQlwdWJsaWMgdm9pZCBkaXNhYmxlR2xvYmFsRWRpdE1lbnUoKTsKLQotCXB1YmxpYyB2b2lkIGVuYWJsZUdsb2JhbEVkaXRNZW51KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lXb3JrYmVuY2hQYXJ0QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9JV29ya2JlbmNoUGFydEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMWNiMDJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lXb3JrYmVuY2hQYXJ0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIHdvcmtiZW5jaCBwYXJ0Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIAotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJV29ya2JlbmNoUGFydEFjdGlvbiB7Ci0Jdm9pZCBzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaFBhcnQpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGF5b3V0QWN0aW9uR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xheW91dEFjdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwNmYxZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGF5b3V0QWN0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUGx1Z2luVUlQYWNrYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIAotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wYWNrYWdldmlldy5MYXlvdXRBY3Rpb25Hcm91cAotICoKLSAqLwotcHVibGljIGNsYXNzIExheW91dEFjdGlvbkdyb3VwIGV4dGVuZHMgTXVsdGlBY3Rpb25Hcm91cCB7Ci0KLQlwdWJsaWMgTGF5b3V0QWN0aW9uR3JvdXAoTGlicmFyeVZpZXcgbGliVmlldykgewotCQlzdXBlcihjcmVhdGVBY3Rpb25zKGxpYlZpZXcpLCBnZXRTZWxlY3RlZFN0YXRlKGxpYlZpZXcpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBBY3Rpb25Hcm91cCNmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycykKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCXN1cGVyLmZpbGxBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOwotCQljb250cmlidXRlVG9WaWV3TWVudShhY3Rpb25CYXJzLmdldE1lbnVNYW5hZ2VyKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29udHJpYnV0ZVRvVmlld01lbnUoSU1lbnVNYW5hZ2VyIHZpZXdNZW51KSB7Ci0JCXZpZXdNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0JCS8vIENyZWF0ZSBsYXlvdXQgc3ViIG1lbnUKLQkJCi0JCUlNZW51TWFuYWdlciBsYXlvdXRTdWJNZW51PSBuZXcgTWVudU1hbmFnZXIoQXV0aG9yaW5nVUlSZXNvdXJjZXMuTGF5b3V0QWN0aW9uR3JvdXBfbGFiZWwpOyAKLQkJZmluYWwgU3RyaW5nIGxheW91dEdyb3VwTmFtZT0gImxheW91dCI7IC8vJE5PTi1OTFMtMSQKLQkJU2VwYXJhdG9yIG1hcmtlcj0gbmV3IFNlcGFyYXRvcihsYXlvdXRHcm91cE5hbWUpOwotCi0JCXZpZXdNZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCXZpZXdNZW51LmFkZChtYXJrZXIpOwotCQl2aWV3TWVudS5hcHBlbmRUb0dyb3VwKGxheW91dEdyb3VwTmFtZSwgbGF5b3V0U3ViTWVudSk7Ci0JCXZpZXdNZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKyItZW5kIikpOy8vJE5PTi1OTFMtMSQJCQotCQlhZGRBY3Rpb25zKGxheW91dFN1Yk1lbnUpOwotCX0KLQotCXN0YXRpYyBpbnQgZ2V0U2VsZWN0ZWRTdGF0ZShMaWJyYXJ5VmlldyBsaWJWaWV3KSB7Ci0JCWlmIChQbHVnaW5VSVBhY2thZ2VDb250ZXh0LklOU1RBTkNFLmlzRmxhdExheW91dCgpKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UKLQkJCXJldHVybiAxOwotCX0KLQkKLQlzdGF0aWMgSUFjdGlvbltdIGNyZWF0ZUFjdGlvbnMoTGlicmFyeVZpZXcgbGliVmlldykgewotCQlJQWN0aW9uIGZsYXRMYXlvdXRBY3Rpb249IG5ldyBMYXlvdXRBY3Rpb24obGliVmlldywgdHJ1ZSk7Ci0JCWZsYXRMYXlvdXRBY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5MYXlvdXRBY3Rpb25Hcm91cF9mbGF0TGF5b3V0QWN0aW9uX2xhYmVsKTsgCi0JCWZsYXRMYXlvdXRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19ERVNDX0xBWU9VVF9GTEFUKTsKLQkJSUFjdGlvbiBoaWVyYXJjaGljYWxMYXlvdXQ9IG5ldyBMYXlvdXRBY3Rpb24obGliVmlldywgZmFsc2UpOwotCQloaWVyYXJjaGljYWxMYXlvdXQuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5MYXlvdXRBY3Rpb25Hcm91cF9oaWVyYXJjaGljYWxMYXlvdXRBY3Rpb25fbGFiZWwpOwotCQloaWVyYXJjaGljYWxMYXlvdXQuc2V0SW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19ERVNDX0xBWU9VVF9ISUVSQVJDSElDQUwpOwotCQkKLQkJcmV0dXJuIG5ldyBJQWN0aW9uW117ZmxhdExheW91dEFjdGlvbiwgaGllcmFyY2hpY2FsTGF5b3V0fTsKLQl9Ci19Ci0KLWNsYXNzIExheW91dEFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb24gewotCi0JcHJpdmF0ZSBib29sZWFuIGZJc0ZsYXRMYXlvdXQ7Ci0JcHJpdmF0ZSBMaWJyYXJ5VmlldyBmbGliVmlldzsKLQotCXB1YmxpYyBMYXlvdXRBY3Rpb24oTGlicmFyeVZpZXcgbGliVmlldywgYm9vbGVhbiBmbGF0KSB7Ci0JCXN1cGVyKCIiLCBBU19SQURJT19CVVRUT04pOyAvLyROT04tTkxTLTEkCi0KLQkJZklzRmxhdExheW91dD0gZmxhdDsKLQkJZmxpYlZpZXc9IGxpYlZpZXc7Ci0JCWlmIChmSXNGbGF0TGF5b3V0KQotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLCBBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MQVlPVVRfRkxBVF9BQ1RJT04pOwotCQllbHNlCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsIEF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxBWU9VVF9ISUVSQVJDSElDQUxfQUNUSU9OKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChQbHVnaW5VSVBhY2thZ2VDb250ZXh0LklOU1RBTkNFLmlzRmxhdExheW91dCgpICE9IGZJc0ZsYXRMYXlvdXQpCi0JCQlQbHVnaW5VSVBhY2thZ2VDb250ZXh0LklOU1RBTkNFLnRvZ2dsZUxheW91dCgpOwotCQlmbGliVmlldy5nZXRWaWV3ZXIoKS5nZXRDb250cm9sKCkuc2V0UmVkcmF3KGZhbHNlKTsKLQkJZmxpYlZpZXcuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCQlmbGliVmlldy5nZXRWaWV3ZXIoKS5nZXRDb250cm9sKCkuc2V0UmVkcmF3KHRydWUpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGQ0M2Y4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uUGFzdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlJlZG9BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlVuZG9BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLkxpYnJhcnlFVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlN1YkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLQotLyoqCi0gKiBUaGUgTGlicmFyeSB2aWV3IGFjdGlvbiBiYXIgY29udHJpYnV0b3IuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcwotCQlFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IgaW1wbGVtZW50cwotCQlJTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yLCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQotCS8vIEtlZXAgdHJhY2sgb2YgdGhlIGFjdGl2ZSBlZGl0b3IuCi0JcHJvdGVjdGVkIElWaWV3UGFydCBhY3RpdmVWaWV3UGFydDsKLQotCS8vIEtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHByb3ZpZGVyLgotCXByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbkJhcnMgdmlld0FjdGlvbkJhcnM7Ci0KLQkvLyBMaWJyYXJ5IHZpZXcgZWRpdCBhY3Rpb24KLQlwcm90ZWN0ZWQgTGlicmFyeVZpZXdFZGl0QWN0aW9uIGxpYnJhcnlWaWV3RWRpdEFjdGlvbjsKLQotCS8vIENvbmZpZ3VyYXRpb24gdmlldyBlZGl0IGFjdGlvbgotCXByb3RlY3RlZCBDb25maWd1cmF0aW9uVmlld0VkaXRBY3Rpb24gY29uZmlnVmlld0VkaXRBY3Rpb247Ci0KLQlwcml2YXRlIEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKLQkKLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgUHJvcGVydGllcyB2aWV3LgotCSAqLwotCXByb3RlY3RlZCBJQWN0aW9uIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbSkgeyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZ2V0UGFnZSgpLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhlIHZpZXdlciBvZiB0aGUgY3VycmVudCBlZGl0b3IgaWYgdGhlIGVkaXRvciBpbXBsZW1lbnRzCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcn0uCi0JICovCi0JcHJvdGVjdGVkIElBY3Rpb24gcmVmcmVzaFZpZXdlckFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW0pIHsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQlyZXR1cm4gYWN0aXZlVmlld1BhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAoYWN0aXZlVmlld1BhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsKLQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpIGFjdGl2ZVZpZXdQYXJ0KS5nZXRWaWV3ZXIoKTsKLQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQkJcmVmcmVzaFZpZXdlcih2aWV3ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvCi0JICogZWFjaCBkZXNjcmlwdG9yIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGNyZWF0ZUNoaWxkQWN0aW9uczsKLQotCS8qKgotCSAqIFRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yCi0JICogQ3JlYXRlQ2hpbGQgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXI7Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGNvcnJlc3BvbmRpbmcKLQkgKiB0byBlYWNoIGRlc2NyaXB0b3IgZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0KLQkgKiBwcm92aWRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjcmVhdGVTaWJsaW5nQWN0aW9uczsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZQotCSAqIGFkZGVkIGZvciBDcmVhdGVTaWJsaW5nIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IoRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluKSB7Ci0JCXRoaXMuZWRpdGluZ0RvbWFpbiA9IGVkaXRpbmdEb21haW47Ci0JCQotCQl2YWxpZGF0ZUFjdGlvbiA9IG5ldyBMaWJyYXJ5VmFsaWRhdGVBY3Rpb24oKTsKLQkJKChMaWJyYXJ5VmFsaWRhdGVBY3Rpb24pdmFsaWRhdGVBY3Rpb24pLnB1dENvbnRleHREYXRhKExpYnJhcnlFVmFsaWRhdG9yLkNUWF9BREFQVEVSX0ZBQ1RPUllfUFJPVklERVIsCi0JCQkJUHJvY2Vzc0VkaXRvci5hZGFwdGVyRmFjdG9yeVByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpZXdlcihWaWV3ZXIgdmlld2VyKSB7Ci0JCXZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBTZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zIHRvIHRoZSB0b29sIGJhci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigibWV0aG9kLXNldHRpbmdzIikpOyAvLyROT04tTkxTLTEkCi0JCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJtZXRob2QtYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQWRkcyB0byB0aGUgbWVudSBiYXIgYSBtZW51IGFuZCBzb21lIHNlcGFyYXRvcnMgZm9yIGVkaXRvcgotCSAqIGFkZGl0aW9ucywgYXMgd2VsbCBhcyB0aGUgc3ViLW1lbnVzIGZvciBvYmplY3QgY3JlYXRpb24gaXRlbXMuCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51TWFuYWdlcik7Ci0KLQkJSU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9NZXRob2RFZGl0b3JfbWVudSwgImNvbS5pYm0ubWV0aG9kTWVudUlEIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucyIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigic2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFjdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zLWVuZCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFByZXBhcmUgZm9yIENyZWF0ZUNoaWxkIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4KLQkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtKTsgLy8kTk9OLU5MUy0xJAotCQlzdWJtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlU2libGluZyBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuCi0JCWNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0pOyAvLyROT04tTkxTLTEkCi0JCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEZvcmNlIGFuIHVwZGF0ZSBiZWNhdXNlIEVjbGlwc2UgaGlkZXMgZW1wdHkgbWVudXMgbm93LgotCQlzdWJtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCQkJbWVudU1hbmFnZXIudXBkYXRlQWxsKHRydWUpOwotCQkJfQotCQl9KTsKLQotCQlhZGRHbG9iYWxBY3Rpb25zKHN1Ym1lbnVNYW5hZ2VyKTsKLQl9Ci0KLQlwdWJsaWMgSVZpZXdQYXJ0IGdldEFjdGl2ZVZpZXcoKSB7Ci0JCXJldHVybiBhY3RpdmVWaWV3UGFydDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVWaWV3KElWaWV3UGFydCBwYXJ0KSB7Ci0JCS8vIFRPRE8gLSBtYXkgbmVlZCB0byBjaGVjayBvdGhlciBtZXRob2QKLQkJaWYgKHBhcnQgIT0gbnVsbCkKLQkJCXN1cGVyLnNldEFjdGl2ZVZpZXcocGFydCk7Ci0JCWlmIChwYXJ0ID09IGFjdGl2ZVZpZXdQYXJ0KQotCQkJcmV0dXJuOwotCQlpZiAoYWN0aXZlVmlld1BhcnQgIT0gbnVsbCkgewotCQkJZGVhY3RpdmF0ZSgpOwotCQl9Ci0JCWlmIChwYXJ0ID09IG51bGwpIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyID0gbnVsbDsKLQkJfQotCQlpZiAoIShwYXJ0IGluc3RhbmNlb2YgSUVkaXRpbmdEb21haW5Qcm92aWRlcikpCi0JCQlyZXR1cm47Ci0JCWFjdGl2ZVZpZXdQYXJ0ID0gcGFydDsKLQkJZWRpdGluZ0RvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgcGFydCkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCi0JCS8vIFN3aXRjaCB0byB0aGUgbmV3IHNlbGVjdGlvbiBwcm92aWRlci4KLQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJfSBlbHNlIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyID0gcGFydC5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCQkJLy8gRmFrZSBhIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50IHRvIHVwZGF0ZSB0aGUgbWVudXMuCi0JCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCkgewotCQkJCXNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChzZWxlY3Rpb25Qcm92aWRlciwKLQkJCQkJCXNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKSk7Ci0JCQl9Ci0JCX0KLQotCQlhY3RpdmF0ZSgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJYWN0aXZlVmlld1BhcnQucmVtb3ZlUHJvcGVydHlMaXN0ZW5lcih0aGlzKTsKLQotCQlkZWxldGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJY3V0QWN0aW9uLnNldEVkaXRpbmdEb21haW4obnVsbCk7Ci0JCWNvcHlBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJcGFzdGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJdW5kb0FjdGlvbi5zZXRFZGl0aW5nRG9tYWluKG51bGwpOwotCQlyZWRvQWN0aW9uLnNldEVkaXRpbmdEb21haW4obnVsbCk7Ci0KLQkJaWYgKGxvYWRSZXNvdXJjZUFjdGlvbiAhPSBudWxsKSB7Ci0JCQlsb2FkUmVzb3VyY2VBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJfQotCi0JCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZVZpZXdQYXJ0IGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlVmlld1BhcnQKLQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZGVsZXRlQWN0aW9uKTsKLQkJc2VsZWN0aW9uUHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpYnJhcnlWaWV3RWRpdEFjdGlvbik7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihjdXRBY3Rpb24pOwotCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoY29weUFjdGlvbik7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihwYXN0ZUFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzYWJsZUdsb2JhbEVkaXRNZW51KCkgewotCQlkZWxldGVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWlmIChsaWJyYXJ5Vmlld0VkaXRBY3Rpb24gIT0gbnVsbCkKLQkJCWxpYnJhcnlWaWV3RWRpdEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJaWYgKGNvbmZpZ1ZpZXdFZGl0QWN0aW9uICE9IG51bGwpCi0JCQljb25maWdWaWV3RWRpdEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3V0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQljb3B5QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlwYXN0ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJdW5kb0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVkb0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmFibGVHbG9iYWxFZGl0TWVudSgpIHsKLQkJZGVsZXRlQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWlmIChsaWJyYXJ5Vmlld0VkaXRBY3Rpb24gIT0gbnVsbCkKLQkJCWxpYnJhcnlWaWV3RWRpdEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlpZiAoY29uZmlnVmlld0VkaXRBY3Rpb24gIT0gbnVsbCkKLQkJCWNvbmZpZ1ZpZXdFZGl0QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWN1dEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQljb3B5QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXBhc3RlQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXVuZG9BY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmVkb0FjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciNhY3RpdmF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCWFjdGl2ZVZpZXdQYXJ0LmFkZFByb3BlcnR5TGlzdGVuZXIodGhpcyk7Ci0JCQotCQlkZWxldGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJY3V0QWN0aW9uLnNldEVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0JCWNvcHlBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJcGFzdGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJdW5kb0FjdGlvbi5zZXRFZGl0aW5nRG9tYWluKGVkaXRpbmdEb21haW4pOwotCQlyZWRvQWN0aW9uLnNldEVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0KLQkJaWYgKGxvYWRSZXNvdXJjZUFjdGlvbiAhPSBudWxsKSB7Ci0JCQlsb2FkUmVzb3VyY2VBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJfQotCi0JCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZVZpZXdQYXJ0IGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlVmlld1BhcnQKLQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZGVsZXRlQWN0aW9uKTsKLQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpYnJhcnlWaWV3RWRpdEFjdGlvbik7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihjdXRBY3Rpb24pOwotCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoY29weUFjdGlvbik7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihwYXN0ZUFjdGlvbik7Ci0JCWlmICh2YWxpZGF0ZUFjdGlvbiAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodmFsaWRhdGVBY3Rpb24pOwotCQl9Ci0KLQkJaWYgKGNvbnRyb2xBY3Rpb24gIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGNvbnRyb2xBY3Rpb24pOwotCQl9ICAgICAgCQkKLQotCQl1cGRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IjdXBkYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCWlmIChhY3RpdmVWaWV3UGFydCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZVZpZXdQYXJ0IGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlVmlld1BhcnQKLQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gPyAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbgotCQkJCTogU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQotCQlkZWxldGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQlsaWJyYXJ5Vmlld0VkaXRBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQljdXRBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQljb3B5QWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJcGFzdGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQl1bmRvQWN0aW9uLnVwZGF0ZSgpOwotCQlyZWRvQWN0aW9uLnVwZGF0ZSgpOwotCi0JCWlmIChsb2FkUmVzb3VyY2VBY3Rpb24gIT0gbnVsbCkgewotCQkJbG9hZFJlc291cmNlQWN0aW9uLnVwZGF0ZSgpOwotCQl9Ci0KLQkJaWYgKHZhbGlkYXRlQWN0aW9uICE9IG51bGwpIHsKLQkJCXZhbGlkYXRlQWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9LCBoYW5kbGluZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudH0gYnkgcXVlcnlpbmcgZm9yCi0JICogdGhlIGNoaWxkcmVuIGFuZCBzaWJsaW5ncyB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VsZWN0ZWQgb2JqZWN0IGFuZAotCSAqIHVwZGF0aW5nIHRoZSBtZW51cyBhY2NvcmRpbmdseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkvLyBSZW1vdmUgYW55IG1lbnUgaXRlbXMgZm9yIG9sZCBzZWxlY3Rpb24uCi0JCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucyk7Ci0JCX0KLQkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zKTsKLQkJfQotCi0JCS8vIFF1ZXJ5IHRoZSBuZXcgc2VsZWN0aW9uIGZvciBhcHByb3ByaWF0ZSBuZXcgY2hpbGQvc2libGluZyBkZXNjcmlwdG9ycwotCQlDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMgPSBudWxsOwotCi0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbgotCQkJCSYmICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdCBvYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQkJRWRpdGluZ0RvbWFpbiBkb21haW4gPSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIGFjdGl2ZVZpZXdQYXJ0KQotCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCi0JCQluZXdDaGlsZERlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMob2JqZWN0LCBudWxsKTsKLQkJfQotCi0JCS8vIEdlbmVyYXRlIGFjdGlvbnMgZm9yIHNlbGVjdGlvbjsgcG9wdWxhdGUgYW5kIHJlZHJhdyB0aGUgbWVudXMuCi0JCWNyZWF0ZUNoaWxkQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQkJc2VsZWN0aW9uKTsKLQotCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKLQkJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufQotCSAqIGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sIGFuZCByZXR1cm5zIHRoZQotCSAqIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQ29sbGVjdGlvbiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJYWN0aW9ucy5hZGQobmV3IE1ldGhvZENyZWF0ZUNoaWxkQWN0aW9uKGVkaXRpbmdEb21haW4sCi0JCQkJCQlzZWxlY3Rpb24sIGkubmV4dCgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZW5lcmF0ZXMgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gZm9yIGVhY2gKLQkgKiBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LCBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZgotCSAqIHRoZXNlIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQ29sbGVjdGlvbiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJYWN0aW9ucy5hZGQobmV3IE1ldGhvZENyZWF0ZVNpYmxpbmdBY3Rpb24oYWN0aXZlVmlld1BhcnQsCi0JCQkJCQlzZWxlY3Rpb24sIGkubmV4dCgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBwb3B1bGF0ZXMgdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMgYmFzZWQgb24gdGhlCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZQotCSAqIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24sIGJ5IGluc2VydGluZyB0aGVtIGJlZm9yZSB0aGUgc3BlY2lmaWVkCi0JICogY29udHJpYnV0aW9uIGl0ZW0gPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+LiBJZiA8Y29kZT5JRDwvY29kZT4gaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiwgdGhleSBhcmUgc2ltcGx5IGFkZGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLAotCQkJQ29sbGVjdGlvbiBhY3Rpb25zLCBTdHJpbmcgY29udHJpYnV0aW9uSUQpIHsKLQkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gYWN0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlJQWN0aW9uIGFjdGlvbiA9IChJQWN0aW9uKSBpLm5leHQoKTsKLQkJCQlpZiAoY29udHJpYnV0aW9uSUQgIT0gbnVsbCkgewotCQkJCQltYW5hZ2VyLmluc2VydEJlZm9yZShjb250cmlidXRpb25JRCwgYWN0aW9uKTsKLQkJCQl9IGVsc2UgewotCQkJCQltYW5hZ2VyLmFkZChhY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgcmVtb3ZlcyBmcm9tIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMgYmFzZWQgb24gdGhlCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZQotCSAqIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwKLQkJCUNvbGxlY3Rpb24gYWN0aW9ucykgewotCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7Ci0JCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWFuYWdlci5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCS8vIExvb2sgaW50byBTdWJDb250cmlidXRpb25JdGVtcwotCQkJCUlDb250cmlidXRpb25JdGVtIGNvbnRyaWJ1dGlvbkl0ZW0gPSBpdGVtc1tpXTsKLQkJCQl3aGlsZSAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIFN1YkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLQkJCQkJY29udHJpYnV0aW9uSXRlbSA9ICgoU3ViQ29udHJpYnV0aW9uSXRlbSkgY29udHJpYnV0aW9uSXRlbSkKLQkJCQkJCQkuZ2V0SW5uZXJJdGVtKCk7Ci0JCQkJfQotCi0JCQkJLy8gRGVsZXRlIHRoZSBBY3Rpb25Db250cmlidXRpb25JdGVtcyB3aXRoIG1hdGNoaW5nIGFjdGlvbi4KLQkJCQlpZiAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLQkJCQkJSUFjdGlvbiBhY3Rpb24gPSAoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIGNvbnRyaWJ1dGlvbkl0ZW0pCi0JCQkJCQkJLmdldEFjdGlvbigpOwotCQkJCQlpZiAoYWN0aW9ucy5jb250YWlucyhhY3Rpb24pKSB7Ci0JCQkJCQltYW5hZ2VyLnJlbW92ZShjb250cmlidXRpb25JdGVtKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBwb3AtdXAgbWVudSBiZWZvcmUgaXQgYXBwZWFycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCXN1cGVyLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7Ci0JCU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbnVsbDsKLQotCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtKTsgLy8kTk9OLU5MUy0xJAotCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7Ci0JCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogSW5zZXJ0cyBnbG9iYWwgYWN0aW9ucyBiZWZvcmUgdGhlICJhZGRpdGlvbnMtZW5kIiBzZXBhcmF0b3IuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkR2xvYmFsQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucy1lbmQiLCBuZXcgU2VwYXJhdG9yKCJ1aS1hY3Rpb25zIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlyZWZyZXNoVmlld2VyQWN0aW9uLnNldEVuYWJsZWQocmVmcmVzaFZpZXdlckFjdGlvbi5pc0VuYWJsZWQoKSk7Ci0JCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgcmVmcmVzaFZpZXdlckFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQotCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucy1lbmQiLCBuZXcgU2VwYXJhdG9yKCkpOyAvLyROT04tTkxTLTEkCi0JCQotCSAgICBTdHJpbmcga2V5ID0gKHN0eWxlICYgQURESVRJT05TX0xBU1RfU1RZTEUpID09IDAgPyAiYWRkaXRpb25zLWVuZCIgOiAiYWRkaXRpb25zIjsKLQkgICAgaWYgKHZhbGlkYXRlQWN0aW9uICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoa2V5LCBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSh2YWxpZGF0ZUFjdGlvbikpOwotCSAgICB9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjaW5pdChJQWN0aW9uQmFycywKLQkgKiAgICAgIElXb3JrYmVuY2hQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycywgSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQlzdXBlci5pbml0KGFjdGlvbkJhcnMsIHBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNpbml0KElBY3Rpb25CYXJzKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQl2aWV3QWN0aW9uQmFycyA9IGFjdGlvbkJhcnM7Ci0KLQkJSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldFNoYXJlZEltYWdlcygpOwotCi0JCWxpYnJhcnlWaWV3RWRpdEFjdGlvbiA9IG5ldyBMaWJyYXJ5Vmlld0VkaXRBY3Rpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uTGFiZWxfZWRpdCk7IC8vJE5PTi1OTFMtMSQKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKExpYnJhcnlWaWV3RWRpdEFjdGlvbi5BQ1RJT05fSUQsCi0JCQkJbGlicmFyeVZpZXdFZGl0QWN0aW9uKTsKLQotCQljdXRBY3Rpb24gPSBjcmVhdGVDdXRBY3Rpb24oKTsKLQkJY3V0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQ1VUKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpLCBjdXRBY3Rpb24pOwotCi0JCWNvcHlBY3Rpb24gPSBjcmVhdGVDb3B5QWN0aW9uKCk7Ci0JCWNvcHlBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9DT1BZKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwKLQkJCQljb3B5QWN0aW9uKTsKLQotCQlwYXN0ZUFjdGlvbiA9IGNyZWF0ZVBhc3RlQWN0aW9uKCk7Ci0JCXBhc3RlQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfUEFTVEUpKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSwKLQkJCQlwYXN0ZUFjdGlvbik7Ci0KLQkJZGVsZXRlQWN0aW9uID0gY3JlYXRlRGVsZXRlQWN0aW9uKCk7Ci0JCWRlbGV0ZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0RFTEVURSkpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSwKLQkJCQlkZWxldGVBY3Rpb24pOwotCQkKLQkJdW5kb0FjdGlvbiA9IG5ldyBVbmRvQWN0aW9uKCk7Ci0JCXVuZG9BY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9VTkRPKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlVORE8uZ2V0SWQoKSwKLQkJCQl1bmRvQWN0aW9uKTsKLQotCQlyZWRvQWN0aW9uID0gbmV3IFJlZG9BY3Rpb24oKTsKLQkJcmVkb0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1JFRE8pKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUkVETy5nZXRJZCgpLAotCQkJCXJlZG9BY3Rpb24pOwotCi0JCWxpYnJhcnlWaWV3RWRpdEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGN1dCBhY3Rpb24KLQkgKiBAcmV0dXJuIGFjdGlvbgotCSAqLwotCXByb3RlY3RlZCBDdXRBY3Rpb24gY3JlYXRlQ3V0QWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IEN1dEFjdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHBhc3RlIGFjdGlvbgotCSAqIEByZXR1cm4gYWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIFBhc3RlQWN0aW9uIGNyZWF0ZVBhc3RlQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBhc3RlQWN0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgY29weSBhY3Rpb24KLQkgKiBAcmV0dXJuIGFjdGlvbgotCSAqLwotCXByb3RlY3RlZCBDb3B5QWN0aW9uIGNyZWF0ZUNvcHlBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgQ29weUFjdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGRlbGV0ZSBhY3Rpb24KLQkgKiBAcmV0dXJuIGFjdGlvbgotCSAqLwotCXByb3RlY3RlZCBEZWxldGVBY3Rpb24gY3JlYXRlRGVsZXRlQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IERlbGV0ZUFjdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjZ2V0QWN0aW9uQmFycygpCi0JICovCi0JcHVibGljIElBY3Rpb25CYXJzIGdldEFjdGlvbkJhcnMoKSB7Ci0JCXJldHVybiB2aWV3QWN0aW9uQmFyczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZhbGlkYXRlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5VmFsaWRhdGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmQ3M2U2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5VmFsaWRhdGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRGlhZ25vc3RpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpY0NoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRGlhZ25vc3RpY2lhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLkVNRkVkaXRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVmFsaWRhdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkxpYnJhcnlWYWxpZGF0aW9uTWFya2VySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lWYWxpZGF0aW9uTWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uTGlicmFyeUVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uY29uc3RyYWludHMuTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLkxpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5MaWJyYXJ5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZhbGlkYXRlQWN0aW9uIGV4dGVuZHMgVmFsaWRhdGVBY3Rpb24gewotCXByaXZhdGUgSGFzaFNldCByZXNvdXJjZXM7Ci0JcHJpdmF0ZSBib29sZWFuIHN1Y2Nlc3M7Ci0JcHJpdmF0ZSBib29sZWFuIHNob3dTdWNjZXNzID0gdHJ1ZTsKLQlwcml2YXRlIE1hcCBjb250ZXh0RGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgTGlicmFyeVZhbGlkYXRlQWN0aW9uKCkgewotCQlzdXBlcigpOwotCQllY2xpcHNlUmVzb3VyY2VzVXRpbCA9IG5ldyBMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlcigpOwotCX0KLQkKLQlwdWJsaWMgTGlicmFyeVZhbGlkYXRlQWN0aW9uKGJvb2xlYW4gc2hvd1N1Y2Nlc3MpIHsKLQkJdGhpcygpOwotCQl0aGlzLnNob3dTdWNjZXNzICA9IHNob3dTdWNjZXNzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwdXRDb250ZXh0RGF0YShPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJY29udGV4dERhdGEucHV0KGtleSwgdmFsdWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbiN2YWxpZGF0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ25vc3RpYyB2YWxpZGF0ZShmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCSAgICBpZihyZXNvdXJjZXMgPT0gbnVsbCkgewotCSAgICAJcmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkgICAgCXJlc291cmNlcy5jbGVhcigpOwotCSAgICB9Ci0JICAgIGJvb2xlYW4gZGVwZW5kZW5jeUluZm9NZ3JTZXQgPSBmYWxzZTsKLQkJQ29sbGVjdGlvbiBlT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0ZWRPYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCWVPYmplY3RzLmFkZChlbGVtZW50KTsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9ICgoRU9iamVjdCllbGVtZW50KS5lUmVzb3VyY2UoKTsKLQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCX0KLQkJCQlpZiAoISBkZXBlbmRlbmN5SW5mb01nclNldCAmJiBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlNZXRob2RMaWJyYXJ5IGxpYiA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeSgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7CQotCQkJCQlwdXRDb250ZXh0RGF0YShMaWJyYXJ5RVZhbGlkYXRvci5DVFhfREVQRU5ERU5DWV9WQUxJREFUSU9OX01HUiwgbmV3IERlcGVuZGVuY3lWYWxpZGF0aW9uTWdyKGxpYikpOwotCQkJCQlkZXBlbmRlbmN5SW5mb01nclNldCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCSAgICBpbnQgY291bnQgPSBlT2JqZWN0cy5zaXplKCk7Ci0JICAgIGVPYmplY3RzID0gTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5Lm1ha2VUYXJnZXRzRGlzam9pbnQoZU9iamVjdHMpOwotCQlMaWJyYXJ5SXRlcmF0b3IgbGliSXRlciA9IG5ldyBMaWJyYXJ5SXRlcmF0b3IoZU9iamVjdHMsIHRydWUsIExpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5ERUVQLCB0cnVlKTsKLQkJd2hpbGUobGliSXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvID0gbGliSXRlci5uZXh0KCk7Ci0JCQljb3VudCsrOwotCQkJaWYobyBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9ICgoRU9iamVjdClvKS5lUmVzb3VyY2UoKTsKLQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCX0KLQkJCQkKLQkJCQlpZihvIGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7Ci0JCQkJCU5hbWVkRWxlbWVudCBlID0gKE5hbWVkRWxlbWVudCkgbzsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKFRuZ1V0aWwuZ2V0VHlwZVRleHQoZSkgKyAiOiAnIiArIGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JICAgIHByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soIiIsIGNvdW50KTsKLQotLy8JICAgIGZpbmFsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gCi0vLwkgICAgICBkb21haW4gaW5zdGFuY2VvZiBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gPyAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkgOiBudWxsOwotCi0JICAgIERpYWdub3N0aWNpYW4gZGlhZ25vc3RpY2lhbiA9IAotCSAgICAgIG5ldyBEaWFnbm9zdGljaWFuKCkKLQkgICAgICB7Ci0JICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE9iamVjdExhYmVsKEVPYmplY3QgZU9iamVjdCkKLQkgICAgICAgIHsKLS8vCSAgICAgICAgICBpZiAoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCAmJiAhZU9iamVjdC5lSXNQcm94eSgpKQotLy8JICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgIElJdGVtTGFiZWxQcm92aWRlciBpdGVtTGFiZWxQcm92aWRlciA9IChJSXRlbUxhYmVsUHJvdmlkZXIpYWRhcHRlckZhY3RvcnkuYWRhcHQoZU9iamVjdCwgSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLS8vCSAgICAgICAgICAgIGlmIChpdGVtTGFiZWxQcm92aWRlciAhPSBudWxsKQotLy8JICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICByZXR1cm4gaXRlbUxhYmVsUHJvdmlkZXIuZ2V0VGV4dChlT2JqZWN0KTsKLS8vCSAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICB9Ci0vLwkgIAotLy8JICAgICAgICAgIHJldHVybiBzdXBlci5nZXRPYmplY3RMYWJlbChlT2JqZWN0KTsKLQkgICAgICAgIAkKLQkgICAgICAgIAlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVPYmplY3QpOwotCSAgICAgICAgfQotCi0JICAgICAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShFQ2xhc3MgZUNsYXNzLCBFT2JqZWN0IGVPYmplY3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpCi0JICAgICAgICB7Ci0JICAgICAgICAgIHByb2dyZXNzTW9uaXRvci53b3JrZWQoMSk7Ci0JICAgICAgICAgIGlmKGNvbnRleHQgPT0gbnVsbCkgewotCSAgICAgICAgCSAgY29udGV4dCA9IGNvbnRleHREYXRhOwkgICAgICAgIAkgIAotCSAgICAgICAgICB9Ci0JICAgICAgICAgIGVsc2UgewotCSAgICAgICAgCSAgY29udGV4dC5wdXRBbGwoY29udGV4dERhdGEpOwotCSAgICAgICAgICB9Ci0JICAgICAgICAgIHJldHVybiBzdXBlci52YWxpZGF0ZShlQ2xhc3MsIGVPYmplY3QsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkgICAgICAgIH0JICAgICAgICAKLQkgICAgICAgIAotCSAgICAgIH07Ci0JICAgICAgCi0JICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChlT2JqZWN0cyk7Ci0JICAgICAgaW50IG1heCA9IGxpc3Quc2l6ZSgpIC0gMTsKLQkgICAgICBTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkgICAgCSAgT2JqZWN0IGUgPSBsaXN0LmdldChpKTsKLQkgICAgCSAgaWYoZSBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotCSAgICAJCSAgc3RyQnVmLmFwcGVuZCgoKE5hbWVkRWxlbWVudCllKS5nZXROYW1lKCkpLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCSAgICAJICB9Ci0JICAgICAgfQotCSAgICAgIE9iamVjdCBlID0gbWF4IDwgMCA/IG51bGwgOiBsaXN0LmdldChtYXgpOwotCSAgICAgIGlmKGUgaW5zdGFuY2VvZiBOYW1lZEVsZW1lbnQpIHsKLSAgICAJCSAgc3RyQnVmLmFwcGVuZCgoKE5hbWVkRWxlbWVudCllKS5nZXROYW1lKCkpOwotICAgIAkgIH0KLQkgICAgICBCYXNpY0RpYWdub3N0aWMgZGlhZ25vc3RpY3MgPSAKLQkgICAgICAgICAgbmV3IEJhc2ljRGlhZ25vc3RpYwotCSAgICAgICAgICAgIChFT2JqZWN0VmFsaWRhdG9yLkRJQUdOT1NUSUNfU09VUkNFLAotCSAgICAgICAgICAgICAwLAotCSAgICAgICAgICAgICBFY29yZVBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcKLQkgICAgICAgICAgICAgICAoIl9VSV9EaWFnbm9zdGljUm9vdF9kaWFnbm9zdGljIiwgLy8kTk9OLU5MUy0xJCAKLQkgICAgICAgICAgICAgICAgbmV3IE9iamVjdCBbXSB7IHN0ckJ1Zi50b1N0cmluZygpIH0pLCAvLyROT04tTkxTLTEkCi0JICAgICAgICAgICAgIGxpc3QudG9BcnJheSgpKTsKLQkgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlT2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkgICAgCSAgRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCSAgICAJICBwcm9ncmVzc01vbml0b3Iuc2V0VGFza05hbWUKLQkgICAgCSAgKEVNRkVkaXRVSVBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9WYWxpZGF0aW5nX21lc3NhZ2UiLCBuZXcgT2JqZWN0IFtdIHtkaWFnbm9zdGljaWFuLmdldE9iamVjdExhYmVsKGVPYmplY3QpfSkpOwotCSAgICAJICBkaWFnbm9zdGljaWFuLnZhbGlkYXRlKGVPYmplY3QsIGRpYWdub3N0aWNzKTsKLQkgICAgICB9Ci0JICAgICAgc3VjY2VzcyA9IGRpYWdub3N0aWNzLmdldFNldmVyaXR5KCkgPT0gRGlhZ25vc3RpYy5PSzsKLQkgICAgICByZXR1cm4gZGlhZ25vc3RpY3M7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbiNoYW5kbGVEaWFnbm9zdGljKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURpYWdub3N0aWMoRGlhZ25vc3RpYyBkaWFnbm9zdGljKSB7Ci0JCWlmKGRpYWdub3N0aWMgIT0gbnVsbCkgewotCQkJaWYoc2hvd1N1Y2Nlc3MgfHwgIWlzU3VjY2Vzc2Z1bCgpKSB7Ci0JCQkJLy8gc2F2ZSB0aGUgcmVmZXJlbmNlIHRvIEVjbGlwc2VSZXNvdXJjZXNVdGlsIGFuZCBzZXQgZWNsaXBzZVJlc291cmNlc1V0aWwgdG8gbnVsbAotCQkJCS8vIHNvIHN1cGVyIG1ldGhvZCB3aWxsIG5vdCB0cnkgdG8gZGVhbCB3aXRoIHRoZSBtYXJrZXJzCi0JCQkJLy8KLQkJCQlFY2xpcHNlUmVzb3VyY2VzVXRpbCBzYXZlZFJlZiA9IGVjbGlwc2VSZXNvdXJjZXNVdGlsOwotCQkJCWVjbGlwc2VSZXNvdXJjZXNVdGlsID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlzdXBlci5oYW5kbGVEaWFnbm9zdGljKGRpYWdub3N0aWMpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJZWNsaXBzZVJlc291cmNlc1V0aWwgPSBzYXZlZFJlZjsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGRlYWxpbmcgd2l0aCBtYXJrZXJzCi0JCQkvLwotCQkJaWYgKGVjbGlwc2VSZXNvdXJjZXNVdGlsICE9IG51bGwpCQkJCQotCQkJewotCQkJCS8vIGRlbGV0ZSBvbGQgbWFya2VycwotCQkJCS8vCQkJCQkKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCWVjbGlwc2VSZXNvdXJjZXNVdGlsLmRlbGV0ZU1hcmtlcnMoKFJlc291cmNlKSBpdGVyLm5leHQoKSk7Ci0JCQkJfQotCQkJCQotCQkJCVZpZXdlciB2aWV3ZXIgPSBudWxsOwotCQkJCWlmICghZGlhZ25vc3RpYy5nZXRDaGlsZHJlbigpLmlzRW1wdHkoKSkKLQkJCQl7Ci0JCQkJCU1hcCBkaWFnbm9zdGljVG9SZXNvdXJjZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaSA9IGRpYWdub3N0aWMuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCQkJCQl7Ci0JCQkJCQlEaWFnbm9zdGljIGNoaWxkRGlhZ25vc3RpYyA9IChEaWFnbm9zdGljKWkubmV4dCgpOwotCQkJCQkJTGlzdCBkYXRhID0gY2hpbGREaWFnbm9zdGljLmdldERhdGEoKTsKLQkJCQkJCWlmICghZGF0YS5pc0VtcHR5KCkpIHsKLQkJCQkJCQlPYmplY3QgbyA9IGRhdGEuZ2V0KDApOwotCQkJCQkJCWlmKG8gaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKChFT2JqZWN0KW8pLmVSZXNvdXJjZSgpOwotCQkJCQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlkaWFnbm9zdGljVG9SZXNvdXJjZU1hcC5wdXQoY2hpbGREaWFnbm9zdGljLCByZXNvdXJjZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCQkJCQkKLQkJCQkJLy8gY3JlYXRlIG1hcmtlcnMKLQkJCQkJLy8KLQkJCQkJZm9yIChJdGVyYXRvciBpID0gZGlhZ25vc3RpY1RvUmVzb3VyY2VNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCQkJCQl7Ci0JCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGkubmV4dCgpOwotCQkJCQkJRGlhZ25vc3RpYyBjaGlsZERpYWdub3N0aWMgPSAoRGlhZ25vc3RpYyllbnRyeS5nZXRLZXkoKTsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQkJZWNsaXBzZVJlc291cmNlc1V0aWwuY3JlYXRlTWFya2VycyhyZXNvdXJjZSwgY2hpbGREaWFnbm9zdGljKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gc2VsZWN0IHRoZSBmaXJzdCBvYmplY3Qgd2l0aCBwcm9ibGVtIGluIHRoZSB2aWV3ZXIgaWYgcG9zc2libGUKLQkJCQkJLy8KLQkJCQkJTGlzdCBkYXRhID0gKChEaWFnbm9zdGljKWRpYWdub3N0aWMuZ2V0Q2hpbGRyZW4oKS5nZXQoMCkpLmdldERhdGEoKTsKLQkJCQkJaWYgKCFkYXRhLmlzRW1wdHkoKSkKLQkJCQkJewotCQkJCQkJT2JqZWN0IHBhcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7CQkJCQkJCi0JCQkJCQlPYmplY3QgZSA9IGRhdGEuZ2V0KDApOwotCQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJU2V0U2VsZWN0aW9uVGFyZ2V0KQotCQkJCQkJewotCQkJCQkJCSgoSVNldFNlbGVjdGlvblRhcmdldClwYXJ0KS5zZWxlY3RSZXZlYWwobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZSkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAocGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikKLQkJCQkJCXsKLQkJCQkJCQl2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcilwYXJ0KS5nZXRWaWV3ZXIoKTsKLQkJCQkJCQlpZiAodmlld2VyICE9IG51bGwpCi0JCQkJCQkJewotCQkJCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGRhdGEuZ2V0KDApKSwgdHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9CQkJCQkKLQkJCQl9Ci0JCQkJaWYodmlld2VyID09IG51bGwpIHsKLQkJCQkJT2JqZWN0IHBhcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKQotCQkJCQl7Ci0JCQkJCQl2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcilwYXJ0KS5nZXRWaWV3ZXIoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZih2aWV3ZXIgIT0gbnVsbCkgewotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCQkKLQkJCQl0cnkgewotCQkJCQlyZWZyZXNoVmlld3MoKTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaWV3cygpIHsKLQkJQ29uZmlndXJhdGlvblZpZXcuZ2V0VmlldygpLmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3NmdWwoKSB7Ci0JCXJldHVybiBzdWNjZXNzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3Q29weUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdDb3B5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE1YjIxYjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdDb3B5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db3B5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuZG9tYWluLlRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi0KLS8qKgotICogQ29waWVzIGFuIGVsZW1lbnQgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlWaWV3Q29weUFjdGlvbiBleHRlbmRzIENvcHlBY3Rpb24gewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChjb21tYW5kID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVsc2UgewotCQkJaWYgKGRvbWFpbiBpbnN0YW5jZW9mIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJCSgoVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBkb21haW4pLnJlc2V0Q29weU1hcHMoKTsKLQkJCX0KLQkJCXN1cGVyLnJ1bigpOwotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqZWN0cy5uZXh0KCkpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikKLQkJCQkJJiYgIVRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBlbGVtZW50KSkgewotCQkJCWNvbGxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJfQotCi0JCX0KLQotCQljb21tYW5kID0gY3JlYXRlQ29tbWFuZChjb2xsZWN0aW9uKTsKLQotCQlyZXR1cm4gY29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0N1dEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdDdXRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzJjY2RlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0N1dEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkN1dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi0vKioKLSAqIEN1dHMgYW4gZWxlbWVudCBpbiB0aGUgTGlicmFyeSB2aWV3IHRvIHRoZSBjbGlwYm9hcmQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5Vmlld0N1dEFjdGlvbiBleHRlbmRzIEN1dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZQotCQkJc3VwZXIucnVuKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdEZWxldGVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3RGVsZXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNlOWM0YTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdEZWxldGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuSUVkaXRvcktlZXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLk1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLQotLyoqCi0gKiBEZWxldGVzIGFuIGVsZW1lbnQgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZpZXdEZWxldGVBY3Rpb24gZXh0ZW5kcyBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uIHsKLQkKLQkvKiogCi0JICogRGVsZXRzIGFuIGVsZW1lbnQgaW4gbGlicmFyeSB2aWV3Ci0JICogCi0JICovCi0JcHVibGljIExpYnJhcnlWaWV3RGVsZXRlQWN0aW9uKCkgewotCQl0aGlzKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBEZWxldGVzIGFuIGVsZW1lbnQgaW4gbGlicmFyeSB2aWV3IGFmdGVyIGNvbmZpcm1pbmcgd2l0aCB1c2VyCi0JICogQHBhcmFtIGNvbmZpcm0KLQkgKi8KLQlwdWJsaWMgTGlicmFyeVZpZXdEZWxldGVBY3Rpb24oYm9vbGVhbiBjb25maXJtKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29uZmlybSA9IGNvbmZpcm07IAotCX0KLQotCS8qKgotCSAqIEBzZWUgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbiNkaWREZWxldGUoQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaWREZWxldGUoQ29sbGVjdGlvbiBkZWxldGVkRWxlbWVudHMpIHsKLQkJLy8gQ2xvc2UgYWxsIG9wZW4gZWRpdG9ycyBhc3NvY2lhdGVkIHdpdGggdGhlIGRlbGV0ZWQgZWxlbWVudHMuCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlbGV0ZWRFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmICgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQlJRWRpdG9yS2VlcGVyLlJFRkVSRU5DRS5nZXRFZGl0b3JLZWVwZXIoKQotCQkJCQkJLmNsb3NlRWRpdG9yc09uRGVsZXRpb24oKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEN1c3RvbUNhdGVnb3J5IGdldFJvb3RDdXN0b21DYXRlZ29yeShPYmplY3Qgb2JqZWN0KSB7Ci0JCWZvcig7IG9iamVjdCBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyOyBvYmplY3QgPSAoKElXcmFwcGVySXRlbVByb3ZpZGVyKW9iamVjdCkuZ2V0T3duZXIoKSk7Ci0JCW9iamVjdCA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCXJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSAmJiBUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgb2JqZWN0KSA/Ci0JCQkoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdCA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlBcnJheUxpc3QgZmlsdGVyZWRTZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCWZpbHRlcmVkU2VsZWN0aW9uLmFkZChlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIKLQkJCQkJfHwgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIFRuZ1V0aWwKLQkJCQkJCQkuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBlbGVtZW50KSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlDdXN0b21DYXRlZ29yeSByb290Q3VzdG9tQ2F0ZWdvcnkgPSBnZXRSb290Q3VzdG9tQ2F0ZWdvcnkoZSk7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY2MgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGVsZW1lbnQ7Ci0JCQkJaWYgKHJvb3RDdXN0b21DYXRlZ29yeSAhPSBudWxsICYmIAotCQkJCQkJVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ocm9vdEN1c3RvbUNhdGVnb3J5KSA9PSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjYykpIHsKLQkJCQkJLy8gc2VsZWN0ZWQgY3VzdG9tZSBjYXRlZ29yeSBpcyBpbiB0aGUgY3VycmVudCBwbHVnaW4uCi0JCQkJCS8vIGFkZCB0aGUgZWxlbWVudCB0byB0aGUgc2VsZWN0aW9uIGluc3RlYWQgb2YgaXRzCi0JCQkJCS8vIHdyYXBwZXIgc28gdGhlIGVsZW1lbnQKLQkJCQkJLy8gd2lsbCBiZSBkZWxldGVkIHBlcm1hbmVudGx5IGZyb20gdGhlIGxpYnJhcnkKLQkJCQkJLy8KLQkJCQkJZmlsdGVyZWRTZWxlY3Rpb24uYWRkKGVsZW1lbnQpOwkJCQkJCi0JCQkJfQotCQkJfSBlbHNlIHsJCQkJCi0JCQkJaWYoZSBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCUlXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIGU7Ci0vLwkJCQkJaWYod3JhcHBlci5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgSVdyYXBwZXJJdGVtUHJvdmlkZXIgJiYKLS8vCQkJCQkJCSEoVG5nVXRpbC51bndyYXAod3JhcHBlci5nZXRPd25lcigpKSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSkgewotLy8JCQkJCQkvLyBkaXNhbGxvdyBkZWxldGluZyBlbGVtZW50IHdoZW4gaXRzIHJlZmVyZW5jZSBpbgotLy8JCQkJCQkvLyBDdXN0b21DYXRlZ29yeSB0cmVlCi0vLwkJCQkJCS8vIHRoYXQgaXMgbm90IGRpcmVjdGx5IHVuZGVyIGEgQ3VzdG9tQ2F0ZWdvcnkgaXMKLS8vCQkJCQkJLy8gc2VsZWN0ZWQKLS8vCQkJCQkJLy8KLS8vCQkJCQkJY29udGludWU7Ci0vLwkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKFRuZ1V0aWwuaXNVbmRlckN1c3RvbUNhdGVnb3J5VHJlZSh3cmFwcGVyKSkgewotCQkJCQkJLy8gZGlzYWxsb3cgZGVsZXRpbmcgZWxlbWVudCB1bmRlciBhIGN1c3RvbSBjYXRlZ29yeSB0aGF0IGlzIG5vdCBhIGN1c3RvbSBjYXRlZ29yeQotCQkJCQkJLy8KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHdyYXBwZXIuZ2V0RmVhdHVyZSgpID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMgCi0JCQkJCQkJfHwgd3JhcHBlci5nZXRGZWF0dXJlKCkgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTKSAKLQkJCQkJewotCQkJCQkJT2JqZWN0IG93bmVyID0gd3JhcHBlci5nZXRPd25lcigpOwotCQkJCQkJaWYob3duZXIgaW5zdGFuY2VvZiBFT2JqZWN0ICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0ICYmIAotCQkJCQkJCQlVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgb3duZXIpID09IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBlbGVtZW50KSkgewotCQkJCQkJCS8vIGNhdGVnb3J5IGdyb3VwaW5nIGFuZCBjYXRlZ29yeSBhcmUgaW4gdGhlIHNhbWUgcGx1Z2luCi0JCQkJCQkJLy8gYWRkIHRoZSBlbGVtZW50IHRvIHRoZSBzZWxlY3Rpb24gaW5zdGVhZCBvZiBpdHMgd3JhcHBlciBzbyB0aGUgZWxlbWVudCAKLQkJCQkJCQkvLyB3aWxsIGJlIGRlbGV0ZWQgcGVybWFuZW50bHkgZnJvbSB0aGUgbGlicmFyeQotCQkJCQkJCS8vCi0JCQkJCQkJZmlsdGVyZWRTZWxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbHRlcmVkU2VsZWN0aW9uLmFkZChlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChmaWx0ZXJlZFNlbGVjdGlvbi5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIHN1cGVyCi0JCQkJLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaWx0ZXJlZFNlbGVjdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uI3BlcmZvcm1EZWxldGUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWxldGUoKSB7Ci0JCUhhc2hTZXQgY29uZmlnc1RvRGVsZXRlID0gbmV3IEhhc2hTZXQoKTsKLQkJSGFzaFNldCBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUlMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCk7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQkJY29uZmlnc1RvRGVsZXRlLmFkZChvYmplY3QpOwotCQkJCX0KLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCAmJiAhcGVyc2lzdGVyLmhhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKG9iamVjdCkpIHsKLQkJCQkJRU9iamVjdCBjb250YWluZXIgPSAoKEVPYmplY3QpIG9iamVjdCkuZUNvbnRhaW5lcigpOwotCQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwgJiYgY29udGFpbmVyLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChjb250YWluZXIuZVJlc291cmNlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gQXZvaWQgZGVsZXRpbmcgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiBhIHByb2Nlc3MuCi0JCWlmICghY29uZmlnc1RvRGVsZXRlLmlzRW1wdHkoKSkgewotCQkJSGFzaFNldCBjb25maWdHVUlEc1RvRGVsZXRlID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbmZpZ3NUb0RlbGV0ZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdGVyLm5leHQoKTsKLQkJCQljb25maWdHVUlEc1RvRGVsZXRlLmFkZChjb25maWcuZ2V0R3VpZCgpKTsKLQkJCX0KLQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoSUxpYnJhcnlSZXNvdXJjZVNldCkgTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKS5lUmVzb3VyY2UoKQotCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCXJlc291cmNlU2V0Ci0JCQkJCS5sb2FkT3Bwb3NpdGVGZWF0dXJlcygKLQkJCQkJCQlDb2xsZWN0aW9ucwotCQkJCQkJCQkJLnNpbmdsZXRvbkxpc3QoQXNzb2NpYXRpb25IZWxwZXIuTWV0aG9kQ29uZmlndXJhdGlvbl9EZXBlbmRlbnRQcm9jZXNzZXMpLAotCQkJCQkJCWNvbmZpZ0dVSURzVG9EZWxldGUpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb25maWdzVG9EZWxldGUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRlci5uZXh0KCk7Ci0KLQkJCQlMaXN0IHJlZmVyZW5jZXMgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJLmdldERlcGVuZGVudFByb2Nlc3Nlcyhjb25maWcpOwotCQkJCWlmIChyZWZlcmVuY2VzICE9IG51bGwgJiYgcmVmZXJlbmNlcy5zaXplKCkgPiAwKSB7Ci0JCQkJCVN0cmluZyBwcm9jZXNzTmFtZSA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSByZWZlcmVuY2VzCi0JCQkJCQkJLmdldCgwKSkuZ2V0TmFtZSgpOwotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZWxldGVEaWFsb2dfdGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGV0ZUNvbmZpZ0Vycm9yX21zZywgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsZXRlQ29uZmlnRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJCQkJCXByb2Nlc3NOYW1lKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJfQotCi0JCX0KLQotCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShtb2RpZmllZFJlc291cmNlcywKLQkJCQlNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5KAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZWxldGVEaWFsb2dfdGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJc3RhdHVzKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChjb25maXJtRGVsZXRlKCkpIHsKLQkJCS8vIENvbGxlY3QgdGhlIGluZm9ybWF0aW9uIG9mIFJlZnJlc2hhYmxlIE9iamVjdHMKLQkJCS8vICggUmVmZXJlbmNlIE9iamVjdHMgc2hvdWxkIGJlIHJlZnJlc2hlZCBpbiBuYXZpZ2F0aW9uIHRyZWUpIC0KLQkJCUFycmF5TGlzdCByZWZyZXNoTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZGVsZXRpbmdPYmplY3QgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJaWYgKGRlbGV0aW5nT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkvLyBjaGVjayBmb3IgdmFyaWFiaWxpdHkKLQkJCQkJaWYgKGRlbGV0aW5nT2JqZWN0IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gVG5nVXRpbAotCQkJCQkJCQkuZ2V0R2VuZXJhbGl6ZXJzKChWYXJpYWJpbGl0eUVsZW1lbnQpIGRlbGV0aW5nT2JqZWN0KTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgYVJlZmVyZW5jZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlyZWZyZXNoTGlzdC5hZGQoYVJlZmVyZW5jZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGV4ZWN1dGUgYWN0dWFsIGRlbGV0ZSBjb21tYW5kLgotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0KLQkJCS8vIFJlZnJlc2ggdGhlIHJlZnJlc2hsaXN0IG9iamVjdHMgaW4gbmF2aWdhdGlvbiB0cmVlLgotCQkJaWYgKHJlZnJlc2hMaXN0LnNpemUoKSA+IDApIHsKLQkJCQlUcmVlVmlld2VyIHZpZXdlciA9ICgoVHJlZVZpZXdlcikgKExpYnJhcnlWaWV3LmdldFZpZXcoKQotCQkJCQkJLmdldFZpZXdlcigpKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmcmVzaExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgcHJvcGVyeSBjaGFuZ2Ugd2l0aCBvbGQgYW5kIG5ldyB2YWx1ZQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAJCQlwcm9wZXJ0eSBuYW1lIGZvciB3aGljaCB2YWx1ZSBpcyBnb2luZyB0byBjaGFuZ2UKLQkgKiBAcGFyYW0gb2xkVmFsdWUKLQkgKiAJCQlPbGQgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogCQkJTmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeVByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwKLQkJCU9iamVjdCBuZXdWYWx1ZSkgewotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSB0aGUgc3BlY2lhbCBjYXNlIG9mIGN1c3RvbWNhdGVnb3J5IENvcHkvRGVsZXRlIGFjdGlvbiBJZiBwYXJlbnQgb2YKLQkgKiBjdXN0b21jYXRlZ29yeSBzZWxlY3RlZCwgaWdub3JlIHRoZSBjdXN0b21jYXRlZ29yeSwgb3RoZXJ3aXNlIGNvbXBvdW5kCi0JICogY29tbWFuZCBjcmVhdGVzIGEgY29tbWFuZCBmb3IgcGFyZW50IGFuZCBhIGNvbW1hbmQgZm9yIGNoaWxkLAotCSAqIENvbXBvdW5kQ29tbWFuZCB3aWxsIGV4ZWN1dGUgYm90aCBjb21tYW5kcywgY29tbWFuZCBmb3IgcGFyZW50IHdpbGwKLQkgKiByZW1vdmUgcGFyZW50IGl0c2VsZiBhbmQgcmVtb3ZlcyBjaGlsZCB0b28sIG5leHQgaXQgdHJ5IHRvIGV4ZWN1dGUKLQkgKiBjb21tYW5kIGZvciBjaGlsZCwgY29tbWFuZCB3aWxsIGZhaWwgYmVjYXVzZSBjaGlsZCBnb3QgcmVtb3ZlIGluIGNvbW1hbmQKLQkgKiBmb3IgcGFyZW50LiAKLQkgKiBUT0RPOiBoYW5kbGUgcHJvcGVybHkgaW4gUmVtb3ZlQ29tbWFuZCBmb3IgdGhpcyBjYXNlIGluc3RlYWQgaGVyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWx0ZXJDdXN0b21DYXRlZ29yeVNlbGVjdGlvbihPYmplY3QgZSwgTGlzdCBmaWx0ZXJlZFNlbGVjdGlvbikgewotCQlpZiAoZSBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCWZpbHRlcmVkU2VsZWN0aW9uLmFkZChlKTsKLQkJfSBlbHNlIHsKLQkJCU9iamVjdCBvd25lciA9ICgoRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIpIGUpLmdldE93bmVyKCk7Ci0JCQl3aGlsZSAob3duZXIgaW5zdGFuY2VvZiBEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCWlmIChvd25lciBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJaWYgKCFmaWx0ZXJlZFNlbGVjdGlvbi5jb250YWlucyhvd25lcikpIHsKLQkJCQkJCWZpbHRlcmVkU2VsZWN0aW9uLmFkZChlKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoZmlsdGVyZWRTZWxlY3Rpb24uY29udGFpbnMob3duZXIpKQotCQkJCQkJYnJlYWs7Ci0JCQkJCW93bmVyID0gKChEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcikgb3duZXIpLmdldE93bmVyKCk7Ci0JCQkJCWlmICghKG93bmVyIGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikpIHsKLQkJCQkJCWlmICghZmlsdGVyZWRTZWxlY3Rpb24uY29udGFpbnMob3duZXIpKSB7Ci0JCQkJCQkJZmlsdGVyZWRTZWxlY3Rpb24uYWRkKGUpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdFZGl0QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0VkaXRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmI2MGRkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0VkaXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOwotCi0KLS8qKgotICogRWRpdHMgYW4gZWxlbWVudCBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZpZXdFZGl0QWN0aW9uIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uIHsKLQotCS8qKgotCSAqIFRoZSBJRCBmb3IgdGhpcyBhY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0lEID0gTGlicmFyeVZpZXdFZGl0QWN0aW9uLmNsYXNzLmdldE5hbWUoKTsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb24gc2VsZWN0ZWQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5Vmlld0VkaXRBY3Rpb24oU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSBzZWxlY3RlZC5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gb2JqZWN0cy5uZXh0KCk7Ci0JCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkub3BlbkVkaXRvcihlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhpcyBhY3Rpb24gaW4gcmVzcG9uc2UgdG8gdGhlIGdpdmVuIHNlbGVjdGlvbiBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXNlbGVjdGVkID0gbmV3IEhhc2hTZXQoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IG9iamVjdHMubmV4dCgpOwotCQkJT2JqZWN0IHJlYWxPYmogPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCWlmIChyZWFsT2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkmJiAhVG5nVXRpbC5pc1ByZWRlZmluZWQoKE1ldGhvZEVsZW1lbnQpIHJlYWxPYmopCi0JCQkJCSYmICEocmVhbE9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlICYmICEocmVhbE9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpKSkgewotCQkJCXNlbGVjdGVkLmFkZChyZWFsT2JqKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAhc2VsZWN0ZWQuaXNFbXB0eSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OGNhOWE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5CYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb247Ci0KLS8qKgotICogCi0gKiBGaW5kcyBhbiBlbGVtZW50IGluIGxpYnJhcnkgdmlldwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24gewotCi0JLyoqCi0JICogVGhlIElEIGZvciB0aGlzIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fSUQgPSBMaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCQotCXByaXZhdGUgTGlicmFyeVZpZXcgdGFyZ2V0VmlldzsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkOwotCi0JCi0JcHVibGljIExpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24oU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAodGFyZ2V0VmlldyA9PSBudWxsKQotCQkJdGFyZ2V0VmlldyA9IExpYnJhcnlWaWV3LmdldFZpZXcoKTsKLQkJLy8gc2VsZWN0IGN1cnJlbnRTZWxlY3Rpb24gaW4gTGliIFZpZXcKLQkJaWYgKHRhcmdldFZpZXcgIT0gbnVsbCAmJiBzZWxlY3RlZCAhPSBudWxsICYmICFzZWxlY3RlZC5pc0VtcHR5KCkpIHsKLQkJCXRhcmdldFZpZXcuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoc2VsZWN0ZWQuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiN1cGRhdGVTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNlbGVjdGVkID0gc2VsZWN0aW9uOwotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJT2JqZWN0IHJlYWxPYmogPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCWlmIChyZWFsT2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld1Bhc3RlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld1Bhc3RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0NDg3YTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdQYXN0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uUGFzdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLklMaWJyYXJ5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi0KLS8qKgotICogUGFzdGVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgY2xpcGJvYXJkIHRvIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5Vmlld1Bhc3RlQWN0aW9uIGV4dGVuZHMgUGFzdGVBY3Rpb24gaW1wbGVtZW50cwotCQlJTGlicmFyeUFjdGlvbiB7Ci0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQlydW5uZXIuc2V0UHJvZ3Jlc3NNb25pdG9yKGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJcnVubmVyLnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCXBlcmZvcm1QYXN0ZSgpOwotCQkJfQotCQkJCi0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBQZXJmb3JtIHBhc3RlIG9wZXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1QYXN0ZSgpIHsKLQkJaWYoY29tbWFuZCBpbnN0YW5jZW9mIFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQpIHsKLQkJCVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQgY21kID0gKChQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKWNvbW1hbmQpOwotCQkJT2JqZWN0IG93bmVyID0gY21kLmdldE93bmVyKCk7Ci0JCQlpZihvd25lciBpbnN0YW5jZW9mIEFkYXB0ZXIpIHsKLQkJCQlvd25lciA9ICgoQWRhcHRlcilvd25lcikuZ2V0VGFyZ2V0KCk7Ci0JCQl9Ci0JCQkKLQkJCS8vIGNoZWNrIHRhcmdldCBmb3IgbW9kaWZpYWJsZQotCQkJLy8KLQkJCWlmKG93bmVyIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KChFT2JqZWN0KSBvd25lciwgTXNnQm94LmdldERlZmF1bHRTaGVsbCgpKTsKLQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlnZXRUZXh0KCksIG51bGwsIHN0YXR1cyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQkJCi0JCWlmIChjb21tYW5kID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVsc2UKLQkJCXN1cGVyLnJ1bigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3VwZGF0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPCAxKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbHNlIHsKLQkJCU9iamVjdFtdIG9ianMgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG9ianNbaV0gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogTm90aWZ5IHByb3BlcnkgY2hhbmdlIHdpdGggb2xkIGFuZCBuZXcgdmFsdWUKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogCQkJcHJvcGVydHkgbmFtZSBmb3Igd2hpY2ggdmFsdWUgaXMgZ29pbmcgdG8gY2hhbmdlCi0JICogQHBhcmFtIG9sZFZhbHVlCi0JICogCQkJT2xkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqIAkJCU5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsCi0JCQlPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuSUxpYnJhcnlBY3Rpb24jc2V0UHJvZ3Jlc3NNb25pdG9yKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcHJvZ3Jlc3NNb25pdG9yID0gbW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcmV0dXJuIHRoZSBwcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCWlmKHByb2dyZXNzTW9uaXRvciA9PSBudWxsKSB7Ci0JCQlwcm9ncmVzc01vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCXJldHVybiBwcm9ncmVzc01vbml0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlua1dpdGhFZGl0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpbmtXaXRoRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzYjljMDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlua1dpdGhFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogTGlua3MgZWRpdG9yIHdpdGggYW4gZWxlbWVudCBpbiBsaWJyYXJ5IHZpZXcKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIExpbmtXaXRoRWRpdG9yIGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcml2YXRlIExpYnJhcnlWaWV3IHRhcmdldFZpZXc7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVuYWJsZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgSVBhcnRMaXN0ZW5lciBlZGl0b3JQYXJ0TGlzdGVuZXIgPSBuZXcgSVBhcnRMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlpZiAocGFydCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0JCQkJLy8gU2VsZWN0IHRoZSBtZXRob2QgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnRseQotCQkJCS8vIHNlbGVjdGVkIGVkaXRvci4KLQkJCQlPYmplY3RbXSBvYmplY3RzID0gbmV3IE9iamVjdFsxXTsKLQkJCQlvYmplY3RzWzBdID0gRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0U2VsZWN0ZWRFZGl0b3JJbnB1dCgpOwotCQkJCWlmIChvYmplY3RzWzBdICE9IG51bGwpIHsKLQkJCQkJLy8gZGlzYWJsZSB0aGUgc2VsZWN0aW9uQ2hhbmdlZCBtZXRob2QgZnJvbSBmaXJpbmcgZnJvbSB0aGlzIHNlbGVjdGlvbiBjaGFuZ2UKLQkJCQkJZW5hYmxlZCA9IGZhbHNlOwotCQkJCQl0YXJnZXRWaWV3LnNldFNlbGVjdGlvblRvVmlld2VyKG9iamVjdHNbMF0pOwotCQkJCQllbmFibGVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQl0YXJnZXRWaWV3ID0gKExpYnJhcnlWaWV3KSB2aWV3OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGVuYWJsZWQpIHsKLQkJCS8vIHJlbW92ZSBsaXN0ZW5lcnMgZnJvbSBlZGl0b3JwYXJ0Ci0JCQl0YXJnZXRWaWV3LmdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlUGFydExpc3RlbmVyKAotCQkJCQllZGl0b3JQYXJ0TGlzdGVuZXIpOwotCi0JCQllbmFibGVkID0gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBzZWxlY3QgZWxlbWVudCBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgZWRpdG9yCi0JCQlPYmplY3RbXSBvYmplY3RzID0gbmV3IE9iamVjdFsxXTsKLQkJCW9iamVjdHNbMF0gPSBFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuZ2V0U2VsZWN0ZWRFZGl0b3JJbnB1dCgpOwotCQkJaWYgKG9iamVjdHNbMF0gIT0gbnVsbCkgewotCQkJCXRhcmdldFZpZXcuc2V0U2VsZWN0aW9uVG9WaWV3ZXIob2JqZWN0c1swXSk7Ci0JCQl9Ci0KLQkJCS8vIGFkZCBsaXN0ZW5lcnMgdG8gZWRpdG9ycGFydAotCQkJdGFyZ2V0Vmlldy5nZXRTaXRlKCkuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcihlZGl0b3JQYXJ0TGlzdGVuZXIpOwotCi0JCQllbmFibGVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkxpbmtXaXRoRWRpdG9yIHNlbGVjdGlvbiBpcyAiICsgc2VsZWN0aW9uKTsKLQkJaWYgKGVuYWJsZWQpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLnNlbGVjdEVkaXRvcihzZWwuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kQWRkSW1hZ2VBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZEFkZEltYWdlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY1Y2Q4ZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kQWRkSW1hZ2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5NZXRob2RBZGRJbWFnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5SaWNoVGV4dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgQWRkIEltYWdlIGRpYWxvZy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEFkZEltYWdlQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQWRkSW1hZ2VBY3Rpb24oKSB7Ci0JCXNldEltYWdlKFJpY2hUZXh0SW1hZ2VzLklNR19BRERfSU1BR0UpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5hZGRJbWFnZUFjdGlvbl90b29sVGlwVGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgQSBSaWNoIFRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCAmJiByaWNoVGV4dCBpbnN0YW5jZW9mIElNZXRob2RSaWNoVGV4dCkgewotCQkJTWV0aG9kQWRkSW1hZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1ldGhvZEFkZEltYWdlRGlhbG9nKERpc3BsYXkKLQkJCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkoKElNZXRob2RSaWNoVGV4dCkgcmljaFRleHQpLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJU3RyaW5nIGltYWdlTGluayA9IGRpYWxvZy5nZXRVcmwoKTsKLQkJCQlpZiAoaW1hZ2VMaW5rLmxlbmd0aCgpID4gMCkgewotCQkJCQlpZiAoZGlhbG9nLmdldEZpbGVUb0NvcHkoKSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBDb3B5IHRoZSBpbWFnZSB0byB0aGUgcmVzb3VyY2UgZm9sZGVyIGlmIG5lY2Vzc2FyeS4KLQkJCQkJCXRyeSB7Ci0JCQkJCQkJUmVzb3VyY2VIZWxwZXIuZ2V0VVJMRm9yQXR0YWNobWVudChkaWFsb2cKLQkJCQkJCQkJCS5nZXRGaWxlVG9Db3B5KCksCi0JCQkJCQkJCQkoKElNZXRob2RSaWNoVGV4dCkgcmljaFRleHQpCi0JCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KCksIHRydWUpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0RWRpdG9yKSB7Ci0JCQkJCQkoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkuYWRkSW1hZ2UoaW1hZ2VMaW5rLCAiIiArIGRpYWxvZy5nZXRIZWlnaHQoKSwgIiIgKyBkaWFsb2cuZ2V0V2lkdGgoKSwgZGlhbG9nLmdldEFsdFRhZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyaWNoVGV4dAotCQkJCQkJLmV4ZWN1dGVDb21tYW5kKAotCQkJCQkJCQlSaWNoVGV4dENvbW1hbmQuQUREX0lNQUdFLAotCQkJCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJCQkJCWltYWdlTGluaywKLQkJCQkJCQkJCQkiIiArIGRpYWxvZy5nZXRIZWlnaHQoKSwgIiIgKyBkaWFsb2cuZ2V0V2lkdGgoKSwgZGlhbG9nLmdldEFsdFRhZygpIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZEFkZExpbmtBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZEFkZExpbmtBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODRkNGVkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RBZGRMaW5rQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLk1ldGhvZEFkZExpbmtEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkFkZExpbmtBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEFkZHMgYSBsaW5rIHRvIGEgUmljaCBUZXh0IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEFkZExpbmtBY3Rpb24gZXh0ZW5kcyBBZGRMaW5rQWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZEFkZExpbmtBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIEEgUmljaCBUZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIElNZXRob2RSaWNoVGV4dCkgewotCQkJCU1ldGhvZEFkZExpbmtEaWFsb2cgZGlhbG9nID0gbmV3IE1ldGhvZEFkZExpbmtEaWFsb2coRGlzcGxheQotCQkJCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJKElNZXRob2RSaWNoVGV4dCkgcmljaFRleHQpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJCVN0cmluZyBsaW5rVVJMID0gZGlhbG9nLmdldExpbmsoKS5nZXRVUkwoKTsKLQkJCQkJaWYgKGxpbmtVUkwubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBSaWNoVGV4dEVkaXRvcikgewotCQkJCQkJCSgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KS5hZGRIVE1MKGxpbmtVUkwpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX0hUTUwsCi0JCQkJCQkJCQlsaW5rVVJMKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChkaWFsb2cuZ2V0RmlsZVRvQ29weSgpICE9IG51bGwpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlSZXNvdXJjZUhlbHBlci5nZXRVUkxGb3JBdHRhY2htZW50KGRpYWxvZwotCQkJCQkJCQkJCS5nZXRGaWxlVG9Db3B5KCksCi0JCQkJCQkJCQkJKChJTWV0aG9kUmljaFRleHQpIHJpY2hUZXh0KQotCQkJCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoKSwgdHJ1ZSk7Ci0JCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLy8gVE9ETzogVGhpcyB3aWxsIHJlc2V0IHRoZSBSVEUncyBtb2RpZmllZCBmbGFnIHRvCi0JCQkJCQkvLyBmYWxzZSBhbmQKLQkJCQkJCS8vIHdpbGwgcHJldmVudCB0aGUgbmV3bHkgYWRkZWQgbGlua3MgZnJvbSBiZWluZyBzYXZlZC4KLQkJCQkJCS8vIHJpY2hUZXh0LnNldFRleHQocmljaFRleHQuZ2V0VGV4dCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc3VwZXIuZXhlY3V0ZShyaWNoVGV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZENyZWF0ZUNoaWxkQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RDcmVhdGVDaGlsZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZTk1MTYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZENyZWF0ZUNoaWxkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uU3RhdGljU2VsZWN0aW9uQ29tbWFuZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5DcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLkxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLQotCi0vKioKLSAqIE1ldGhvZCBDcmVhdGUgQ2hpbGQgYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWV0aG9kQ3JlYXRlQ2hpbGRBY3Rpb24gZXh0ZW5kcyBTdGF0aWNTZWxlY3Rpb25Db21tYW5kQWN0aW9uIHsKLQkvKioKLQkgKiBUaGlzIGRlc2NyaWJlcyB0aGUgY2hpbGQgdG8gYmUgY3JlYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRlc2NyaXB0b3I7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgYW4gYWN0aW9uIHRoYXQgY3JlYXRlcyBhIGNoaWxkIHNwZWNpZmllZAotCSAqIGJ5IDxjb2RlPmRlc2NyaXB0b3I8L2NvZGU+IGZvciB0aGUgc2luZ2xlIG9iamVjdCBpbiB0aGUKLQkgKiA8Y29kZT5zZWxlY3Rpb248L2NvZGU+LgotCSAqLwotCXB1YmxpYyBNZXRob2RDcmVhdGVDaGlsZEFjdGlvbihFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sCi0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiwgT2JqZWN0IGRlc2NyaXB0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lZGl0aW5nRG9tYWluID0gZWRpdGluZ0RvbWFpbjsKLQkJdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLQkJY29uZmlndXJlQWN0aW9uKHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIHRoZSBjb21tYW5kIGZvciB7QGxpbmsKLQkgKiBTdGF0aWNTZWxlY3Rpb25Db21tYW5kQWN0aW9uI2NyZWF0ZUFjdGlvbkNvbW1hbmR9LgotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFjdGlvbkNvbW1hbmQoRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWlmIChjb2xsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQlPYmplY3Qgb3duZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJQ29tbWFuZCBjbWQgPSBudWxsOwotCi0JCQlpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIENvbW1hbmRQYXJhbWV0ZXIKLQkJCQkJJiYgKChDb21tYW5kUGFyYW1ldGVyKSBkZXNjcmlwdG9yKS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCUNvbW1hbmRQYXJhbWV0ZXIgbmV3Q2hpbGRQYXJhbWV0ZXIgPSAoQ29tbWFuZFBhcmFtZXRlcikgZGVzY3JpcHRvcjsKLQkJCQlDcmVhdGVDaGlsZENvbW1hbmQuSGVscGVyIGhlbHBlciA9IChIZWxwZXIpICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKWVkaXRpbmdEb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQob3duZXIsIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLS8vCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoRU9iamVjdCkgb3duZXIpLmVBZGFwdGVycygpLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotLy8JCQkJCWlmIChvIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIpIHsKLS8vCQkJCQkJaGVscGVyID0gKFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKSBvOwotLy8JCQkJCQlicmVhazsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0JCQkJY21kID0gbmV3IENyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kKGVkaXRpbmdEb21haW4sCi0JCQkJCQkoRU9iamVjdCkgb3duZXIsIG5ld0NoaWxkUGFyYW1ldGVyCi0JCQkJCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKSwgbmV3Q2hpbGRQYXJhbWV0ZXIKLQkJCQkJCQkJLmdldFZhbHVlKCksIG5ld0NoaWxkUGFyYW1ldGVyLmdldEluZGV4KCksCi0JCQkJCQljb2xsZWN0aW9uLCBoZWxwZXIpIHsKLQkJCQl9OwotCQkJfSBlbHNlIHsKLQkJCQljbWQgPSBDcmVhdGVDaGlsZENvbW1hbmQuY3JlYXRlKGVkaXRpbmdEb21haW4sIG93bmVyLAotCQkJCQkJZGVzY3JpcHRvciwgY29sbGVjdGlvbik7Ci0JCQl9Ci0KLQkJCXJldHVybiBuZXcgQ3JlYXRlTWV0aG9kRWxlbWVudENvbW1hbmQoY21kKTsKLQkJfQotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN1cGVyUnVuKCkgewotCQlzdXBlci5ydW4oKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uU3RhdGljU2VsZWN0aW9uQ29tbWFuZEFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlzdXBlclJ1bigpOwotCQkJfQotCQkJCi0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZENyZWF0ZVNpYmxpbmdBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZENyZWF0ZVNpYmxpbmdBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGFmNGYyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RDcmVhdGVTaWJsaW5nQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5TdGF0aWNTZWxlY3Rpb25Db21tYW5kQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci0KLS8qKgotICogTWV0aG9kIENyZWF0ZSBTaWJpbGluZyBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZXRob2RDcmVhdGVTaWJsaW5nQWN0aW9uIGV4dGVuZHMKLQkJU3RhdGljU2VsZWN0aW9uQ29tbWFuZEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBUaGlzIGRlc2NyaWJlcyB0aGUgc2libGluZyB0byBiZSBjcmVhdGVkLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZGVzY3JpcHRvcjsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiBhbiBhY3Rpb24gdGhhdCBjcmVhdGVzIGEgc2libGluZyBzcGVjaWZpZWQKLQkgKiBieSA8Y29kZT5kZXNjcmlwdG9yPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ3JlYXRlU2libGluZ0FjdGlvbihJVmlld1BhcnQgdmlld1BhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uLAotCQkJT2JqZWN0IGRlc2NyaXB0b3IpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHZpZXdQYXJ0IGluc3RhbmNlb2YgSUVkaXRpbmdEb21haW5Qcm92aWRlcikgewotCQkJZWRpdGluZ0RvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgdmlld1BhcnQpCi0JCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCX0KLQkJdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLQkJY29uZmlndXJlQWN0aW9uKHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIHRoZSBjb21tYW5kIGZvciB7QGxpbmsKLQkgKiBTdGF0aWNTZWxlY3Rpb25Db21tYW5kQWN0aW9uI2NyZWF0ZUFjdGlvbkNvbW1hbmR9LgotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFjdGlvbkNvbW1hbmQoRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWlmIChjb2xsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQlDb21tYW5kIGNtZCA9IENyZWF0ZUNoaWxkQ29tbWFuZC5jcmVhdGUoZWRpdGluZ0RvbWFpbiwgbnVsbCwKLQkJCQkJZGVzY3JpcHRvciwgY29sbGVjdGlvbik7Ci0JCQlyZXR1cm4gbmV3IENyZWF0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKGNtZCk7Ci0JCX0KLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzN2ExYjllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db3B5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uTG9hZFJlc291cmNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5QYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uUmVkb0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVW5kb0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlN1YkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogVGhlIGNvbnRyaWJ1dG9yIGZvciBhIE1ldGhvZCBlZGl0b3IuCi0gKiAgCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMKLQkJRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0JCi0JLy8gS2VlcCB0cmFjayBvZiB0aGUgYWN0aXZlIGVkaXRvci4KLQlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yUGFydDsKLQotCS8vIEtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHByb3ZpZGVyLgotCXByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7Ci0KLQkvLyBIYW5kbGUgdGhlIFNob3cgUHJvcGVydGllcyB2aWV3IGFjdGlvbi4KLQlwcm90ZWN0ZWQgSUFjdGlvbiBzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJZ2V0U3RyaW5nKCJfVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQlnZXRQYWdlKCkuc2hvd1ZpZXcoIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4Y2VwdGlvbik7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogVGhpcyBhY3Rpb24gcmVmcmVzaGVzIHRoZSB2aWV3ZXIgb2YgdGhlIGN1cnJlbnQgZWRpdG9yIGlmIHRoZSBlZGl0b3IKLQkgKiBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXJ9LgotCSAqLwotCXByb3RlY3RlZCBJQWN0aW9uIHJlZnJlc2hWaWV3ZXJBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJZ2V0U3RyaW5nKCJfVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCXJldHVybiBhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJZG9SZWZyZXNoKCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogVGhpcyB3aWxsIGNvbnRhaW4gb25lCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0gY29ycmVzcG9uZGluZyB0bwotCSAqIGVhY2ggZGVzY3JpcHRvciBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbSBwcm92aWRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjcmVhdGVDaGlsZEFjdGlvbnM7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUKLQkgKiBhZGRlZCBmb3IgQ3JlYXRlQ2hpbGQgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXI7Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGNvcnJlc3BvbmRpbmcKLQkgKiB0byBlYWNoIGRlc2NyaXB0b3IgZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0KLQkgKiBwcm92aWRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjcmVhdGVTaWJsaW5nQWN0aW9uczsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZQotCSAqIGFkZGVkIGZvciBDcmVhdGVTaWJsaW5nIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZWQ7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNvbnRyaWJ1dG9yLgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IoU3RyaW5nIG5hbWUpIHsKLQkJbG9hZFJlc291cmNlQWN0aW9uID0gbmV3IExvYWRSZXNvdXJjZUFjdGlvbigpOwotCQl2YWxpZGF0ZUFjdGlvbiA9IG5ldyBMaWJyYXJ5VmFsaWRhdGVBY3Rpb24oKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGRlbGV0ZSBhY3Rpb24KLQkgKiBAcmV0dXJuIEFjdGlvbgotCSAqLwotCXByb3RlY3RlZCBEZWxldGVBY3Rpb24gY3JlYXRlRGVsZXRlQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IERlbGV0ZUFjdGlvbigpOwotCX0KLQotCSAvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IjaW5pdChvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFycykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldFNoYXJlZEltYWdlcygpOwotCi0JCWRlbGV0ZUFjdGlvbiA9IGNyZWF0ZURlbGV0ZUFjdGlvbigpOwotCQlkZWxldGVBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ERUxFVEUpKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksCi0JCQkJZGVsZXRlQWN0aW9uKTsKLQotCQljdXRBY3Rpb24gPSBjcmVhdGVDdXRBY3Rpb24oKTsKLQkJY3V0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQ1VUKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpLCBjdXRBY3Rpb24pOwotCi0JCWNvcHlBY3Rpb24gPSBjcmVhdGVDb3B5QWN0aW9uKCk7Ci0JCWNvcHlBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9DT1BZKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwKLQkJCQljb3B5QWN0aW9uKTsKLQotCQlwYXN0ZUFjdGlvbiA9IGNyZWF0ZVBhc3RlQWN0aW9uKCk7Ci0JCXBhc3RlQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfUEFTVEUpKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSwKLQkJCQlwYXN0ZUFjdGlvbik7Ci0KLQkJdW5kb0FjdGlvbiA9IG5ldyBVbmRvQWN0aW9uKCk7Ci0JCXVuZG9BY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9VTkRPKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlVORE8uZ2V0SWQoKSwKLQkJCQl1bmRvQWN0aW9uKTsKLQotCQlyZWRvQWN0aW9uID0gbmV3IFJlZG9BY3Rpb24oKTsKLQkJcmVkb0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1JFRE8pKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUkVETy5nZXRJZCgpLAotCQkJCXJlZG9BY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29weSBhY3Rpb24KLQkgKiBAcmV0dXJuIEFjdGlvbgotCSAqLwotCXByb3RlY3RlZCBDb3B5QWN0aW9uIGNyZWF0ZUNvcHlBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgQ29weUFjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgcGFzdGUgYWN0aW9uCi0JICogQHJldHVybiBBY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgUGFzdGVBY3Rpb24gY3JlYXRlUGFzdGVBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUGFzdGVBY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGN1dCBhY3Rpb24KLQkgKiBAcmV0dXJuIEFjdGlvbgotCSAqLwotCXByb3RlY3RlZCBDdXRBY3Rpb24gY3JlYXRlQ3V0QWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IEN1dEFjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBTZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zIHRvIHRoZSB0b29sIGJhci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihuYW1lICsgIi1zZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAotCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihuYW1lICsgIi1hZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGVuYWJsZWQgZmxhZwotCSAqIEBwYXJhbSBlbmFibGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIG1lbnUgYmFyIGEgbWVudSBhbmQgc29tZSBzZXBhcmF0b3JzIGZvciBlZGl0b3IKLQkgKiBhZGRpdGlvbnMsIGFzIHdlbGwgYXMgdGhlIHN1Yi1tZW51cyBmb3Igb2JqZWN0IGNyZWF0aW9uIGl0ZW1zLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb01lbnUobWVudU1hbmFnZXIpOwotCQlJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJZ2V0U3RyaW5nKCJfVUlfIiArIG5hbWUgKyAiX21lbnUiKSwgIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuIiArIG5hbWUgKyAiTWVudUlEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucyIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigic2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFjdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zLWVuZCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFByZXBhcmUgZm9yIENyZWF0ZUNoaWxkIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4KLQkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFByZXBhcmUgZm9yIENyZWF0ZVNpYmxpbmcgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgotCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gRm9yY2UgYW4gdXBkYXRlIGJlY2F1c2UgRWNsaXBzZSBoaWRlcyBlbXB0eSBtZW51cyBub3cuCi0JCXN1Ym1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJCQltZW51TWFuYWdlci51cGRhdGVBbGwodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWFkZEdsb2JhbEFjdGlvbnMoc3VibWVudU1hbmFnZXIpOwotCX0KLQotCS8qKgotCSAqIFdoZW4gdGhlIGFjdGl2ZSBlZGl0b3IgY2hhbmdlcywgdGhpcyByZW1lbWJlcnMgdGhlIGNoYW5nZSBhbmQgcmVnaXN0ZXJzCi0JICogd2l0aCBpdCBhcyBhIHNlbGVjdGlvbiBwcm92aWRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgcGFydCkgewotCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IocGFydCk7Ci0JCWFjdGl2ZUVkaXRvclBhcnQgPSBwYXJ0OwotCi0JCS8vIFN3aXRjaCB0byB0aGUgbmV3IHNlbGVjdGlvbiBwcm92aWRlci4KLQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlpZiAocGFydCA9PSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlciA9IHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLQkJCS8vIEZha2UgYSBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCB0byB1cGRhdGUgdGhlIG1lbnVzLgotCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpICE9IG51bGwpIHsKLQkJCQlzZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsCi0JCQkJCQlzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn0sIGhhbmRsaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50fSBieSBxdWVyeWluZyBmb3IKLQkgKiB0aGUgY2hpbGRyZW4gYW5kIHNpYmxpbmdzIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZWxlY3RlZCBvYmplY3QgYW5kCi0JICogdXBkYXRpbmcgdGhlIG1lbnVzIGFjY29yZGluZ2x5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIFJlbW92ZSBhbnkgbWVudSBpdGVtcyBmb3Igb2xkIHNlbGVjdGlvbi4KLQkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zKTsKLQkJfQotCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMpOwotCQl9Ci0KLQkJLy8gUXVlcnkgdGhlIG5ldyBzZWxlY3Rpb24gZm9yIGFwcHJvcHJpYXRlIG5ldyBjaGlsZC9zaWJsaW5nCi0JCS8vIGRlc2NyaXB0b3JzLgotCQlDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMgPSBudWxsOwotCQlDb2xsZWN0aW9uIG5ld1NpYmxpbmdEZXNjcmlwdG9ycyA9IG51bGw7Ci0KLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uCi0JCQkJJiYgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5zaXplKCkgPT0gMSkgewotCQkJT2JqZWN0IG9iamVjdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKLQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCi0JCQlFZGl0aW5nRG9tYWluIGRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgYWN0aXZlRWRpdG9yUGFydCkKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQotCQkJbmV3Q2hpbGREZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG9iamVjdCwgbnVsbCk7Ci0JCQluZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhudWxsLCBvYmplY3QpOwotCQl9Ci0KLQkJLy8gR2VuZXJhdGUgYWN0aW9ucyBmb3Igc2VsZWN0aW9uOyBwb3B1bGF0ZSBhbmQgcmVkcmF3IHRoZSBtZW51cy4KLQkJY3JlYXRlQ2hpbGRBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMobmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCQlzZWxlY3Rpb24pOwotCQljcmVhdGVTaWJsaW5nQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMoCi0JCQkJbmV3U2libGluZ0Rlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOwotCi0JCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOwotCQkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7Ci0JCX0KLQkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywKLQkJCQkJbnVsbCk7Ci0JCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufQotCSAqIGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sIGFuZCByZXR1cm5zIHRoZQotCSAqIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQ29sbGVjdGlvbiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZUNoaWxkQWN0aW9uKGFjdGl2ZUVkaXRvclBhcnQsIHNlbGVjdGlvbiwKLQkJCQkJCWkubmV4dCgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZW5lcmF0ZXMgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gZm9yIGVhY2gKLQkgKiBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LCBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZgotCSAqIHRoZXNlIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQ29sbGVjdGlvbiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZVNpYmxpbmdBY3Rpb24oYWN0aXZlRWRpdG9yUGFydCwKLQkJCQkJCXNlbGVjdGlvbiwgaS5uZXh0KCkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHBvcHVsYXRlcyB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cyBiYXNlZCBvbiB0aGUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlCi0JICogPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbiwgYnkgaW5zZXJ0aW5nIHRoZW0gYmVmb3JlIHRoZSBzcGVjaWZpZWQKLQkgKiBjb250cmlidXRpb24gaXRlbSA8Y29kZT5jb250cmlidXRpb25JRDwvY29kZT4uIElmIDxjb2RlPklEPC9jb2RlPiBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LCB0aGV5IGFyZSBzaW1wbHkgYWRkZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsCi0JCQlDb2xsZWN0aW9uIGFjdGlvbnMsIFN0cmluZyBjb250cmlidXRpb25JRCkgewotCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBhY3Rpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCUlBY3Rpb24gYWN0aW9uID0gKElBY3Rpb24pIGkubmV4dCgpOwotCQkJCWlmIChjb250cmlidXRpb25JRCAhPSBudWxsKSB7Ci0JCQkJCW1hbmFnZXIuaW5zZXJ0QmVmb3JlKGNvbnRyaWJ1dGlvbklELCBhY3Rpb24pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1hbmFnZXIuYWRkKGFjdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZW1vdmVzIGZyb20gdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cyBiYXNlZCBvbiB0aGUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlCi0JICogPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZXBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLAotCQkJQ29sbGVjdGlvbiBhY3Rpb25zKSB7Ci0JCWlmIChhY3Rpb25zICE9IG51bGwpIHsKLQkJCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBtYW5hZ2VyLmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gTG9vayBpbnRvIFN1YkNvbnRyaWJ1dGlvbkl0ZW1zCi0JCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYnV0aW9uSXRlbSA9IGl0ZW1zW2ldOwotCQkJCXdoaWxlIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgU3ViQ29udHJpYnV0aW9uSXRlbSkgewotCQkJCQljb250cmlidXRpb25JdGVtID0gKChTdWJDb250cmlidXRpb25JdGVtKSBjb250cmlidXRpb25JdGVtKQotCQkJCQkJCS5nZXRJbm5lckl0ZW0oKTsKLQkJCQl9Ci0KLQkJCQkvLyBEZWxldGUgdGhlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW1zIHdpdGggbWF0Y2hpbmcgYWN0aW9uLgotCQkJCWlmIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgewotCQkJCQlJQWN0aW9uIGFjdGlvbiA9ICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgY29udHJpYnV0aW9uSXRlbSkKLQkJCQkJCQkuZ2V0QWN0aW9uKCk7Ci0JCQkJCWlmIChhY3Rpb25zLmNvbnRhaW5zKGFjdGlvbikpIHsKLQkJCQkJCW1hbmFnZXIucmVtb3ZlKGNvbnRyaWJ1dGlvbkl0ZW0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBwb3B1bGF0ZXMgdGhlIHBvcC11cCBtZW51IGJlZm9yZSBpdCBhcHBlYXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJLy8gQWRkIG91ciBzdGFuZGFyZCBtYXJrZXIuCi0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImVkaXQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBBZGQgdGhlIGVkaXQgbWVudSBhY3Rpb25zLgotCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0odW5kb0FjdGlvbikpOwotCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0ocmVkb0FjdGlvbikpOwotCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJLy8gbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGN1dEFjdGlvbikpOwotCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oY29weUFjdGlvbikpOwotCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0ocGFzdGVBY3Rpb24pKTsKLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShkZWxldGVBY3Rpb24pKTsKLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLQkJLy8gQWRkIG91ciBvdGhlciBzdGFuZGFyZCBtYXJrZXIuCi0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCi0KLQkJYWRkR2xvYmFsQWN0aW9ucyhtZW51TWFuYWdlcik7Ci0KLQkJaWYgKGVuYWJsZWQpIHsKLQkJCU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbnVsbDsKLQkJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCQlnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCi0KLQkJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCQlnZXRTdHJpbmcoIl9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywgbnVsbCk7Ci0JCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbnNlcnRzIGdsb2JhbCBhY3Rpb25zIGJlZm9yZSB0aGUgImFkZGl0aW9ucy1lbmQiIHNlcGFyYXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRHbG9iYWxBY3Rpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zLWVuZCIsIG5ldyBTZXBhcmF0b3IoInVpLWFjdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZWZyZXNoVmlld2VyQWN0aW9uLnNldEVuYWJsZWQocmVmcmVzaFZpZXdlckFjdGlvbi5pc0VuYWJsZWQoKSk7Ci0JCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgcmVmcmVzaFZpZXdlckFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JICAgIFN0cmluZyBrZXkgPSAoc3R5bGUgJiBBRERJVElPTlNfTEFTVF9TVFlMRSkgPT0gMCA/ICJhZGRpdGlvbnMtZW5kIiA6ICJhZGRpdGlvbnMiOwotCSAgICBpZiAodmFsaWRhdGVBY3Rpb24gIT0gbnVsbCkKLQkgICAgewotCSAgICAgIG1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZShrZXksIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKHZhbGlkYXRlQWN0aW9uKSk7Ci0JICAgIH0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaCB0aGUgdmlld2VyCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1JlZnJlc2goKSB7Ci0JCWlmIChhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKSB7Ci0JCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpIGFjdGl2ZUVkaXRvclBhcnQpLmdldFZpZXdlcigpOwotCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTXVsdGlBY3Rpb25Hcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTXVsdGlBY3Rpb25Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ODBkYWRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL011bHRpQWN0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uR3JvdXA7Ci0KLS8qKgotICogQSBNdWx0aUFjdGlvbkdyb3VwIHdpbGwgZGlzcGxheSBhIGxpc3Qgb2YgSUFjdGlvbnMgaW4gYSBtZW51IGJ5IHRyYW5zZm9ybWluZyB0aGVtCi0gKiBpbnRvIE1lbnVJdGVtcy4gVGhlIGxpc3Qgb2YgbGFiZWxzIGdpdmVuIHdpbGwgYmUgd2hhdCBpcyBkaXNwbGF5ZWQgaW4gdGhlIFZpZXdNZW51IGZvciAKLSAqIHRoZSBjb3JyZXNwb25kaW5nIGFjdGlvbiAodGhlIGFjdGlvbiBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpbiB0aGUgYWN0aW9uIGFycmF5KS4KLSAqIFRoZSBhY3Rpb25zIGFyZSBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYXMgc3RhdGUgYmFzZWQKLSAqIHNvIHRoYXQgYWZ0ZXIgYW4gYWN0aW9uIGlzIGV4ZWN1dGVkIHRoZSBsYWJlbCB3aWxsIGhhdmUgYSBzZWxlY3Rpb24gY2hlY2suCi0gKiAKLSAqIENvZGUgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuYWN0aW9ucy5NdWx0aUFjdGlvbkdyb3VwLmNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUFjdGlvbkdyb3VwIGV4dGVuZHMgQWN0aW9uR3JvdXAgewotCQotCXB1YmxpYyBJQWN0aW9uW10gTk9fQUNUSU9OUyA9IG5ldyBJQWN0aW9uWzBdOwotCQotCXByaXZhdGUgSUFjdGlvbltdIGZBY3Rpb25zOyAKLQkKLQlwcml2YXRlIGludCBmQ3VycmVudFNlbGVjdGlvbjsKLQlwcml2YXRlIE1lbnVJdGVtW10gZkl0ZW1zOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhY3Rpb24gZ3JvdXAgd2l0aCBhIGdpdmVuIHNldCBvZiBhY3Rpb25zLgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25zCQkJdGhlIGFjdGlvbnMgZm9yIHRoaXMgbXVsdGkgZ3JvdXAKLQkgKiBAcGFyYW0gY3VycmVudFNlbGVjdGlvbglkZWNpZGVzIHdoaWNoIGFjdGlvbiBpcyBzZWxlY3RlZCBpbiB0aGUgbWVudSBvbiBzdGFydCB1cC4KLQkgKiAJCQkJCQkJRGVub3RlcyB0aGUgbG9jYXRpb24gaW4gdGhlIGFjdGlvbnMgYXJyYXkgb2YgdGhlIGN1cnJlbnQKLQkgKiAJCQkJCQkJc2VsZWN0ZWQgc3RhdGUuIEl0IGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBNdWx0aUFjdGlvbkdyb3VwKElBY3Rpb25bXSBhY3Rpb25zLCBpbnQgY3VycmVudFNlbGVjdGlvbikgewotCQlzdXBlcigpOwotCQlzZXRBY3Rpb25zKGFjdGlvbnMsIGN1cnJlbnRTZWxlY3Rpb24pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbiBncm91cC4gQ2xpZW50cyB1c2luZyB0aGlzIGNvbnN0cnVjdG9yIG11c3Qgc2V0IHRoZSBhY3Rpb25zCi0JICogaW1tZWRpYXRlbHkgYWZ0ZXIgY3JlYXRpbmcgdGhlIG11bHRpIGFjdGlvbiBncm91cCBieSBjYWxsaW5nIHtAbGluayAjc2V0QWN0aW9ucyhJQWN0aW9uW10sIGludCl9LgotCSAqLwotCXByb3RlY3RlZCBNdWx0aUFjdGlvbkdyb3VwKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBnaXZlbiBhY3Rpb25zLgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25zCQkJdGhlIGFjdGlvbnMgZm9yIHRoaXMgbXVsdGkgZ3JvdXAsIGF0IGxlYXN0IG9uZQotCSAqIEBwYXJhbSBjdXJyZW50U2VsZWN0aW9uCWRlY2lkZXMgd2hpY2ggYWN0aW9uIGlzIHNlbGVjdGVkIGluIHRoZSBtZW51IG9uIHN0YXJ0IHVwLgotCSAqIAkJCQkJCQlEZW5vdGVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgYWN0aW9ucyBhcnJheSBvZiB0aGUgY3VycmVudAotCSAqIAkJCQkJCQlzZWxlY3RlZCBzdGF0ZS4gSXQgY2Fubm90IGJlIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0QWN0aW9ucyhJQWN0aW9uW10gYWN0aW9ucywgaW50IGN1cnJlbnRTZWxlY3Rpb24pIHsKLQkJZkN1cnJlbnRTZWxlY3Rpb249IGN1cnJlbnRTZWxlY3Rpb247Ci0JCWZBY3Rpb25zID0gYWN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBhY3Rpb25zIHRvIHRoZSBnaXZlbiBtZW51IG1hbmFnZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWN0aW9ucyhJTWVudU1hbmFnZXIgdmlld01lbnUpIHsKLQotCQl2aWV3TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZkl0ZW1zPSBuZXcgTWVudUl0ZW1bZkFjdGlvbnMubGVuZ3RoXTsKLQotCQlmb3IgKGludCBpPSAwOyBpIDwgZkFjdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIGludCBqPSBpOwotCi0JCQl2aWV3TWVudS5hZGQobmV3IENvbnRyaWJ1dGlvbkl0ZW0oKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBmaWxsKE1lbnUgbWVudSwgaW50IGluZGV4KSB7Ci0JCQkJCQotCQkJCQlpbnQgc3R5bGU9IFNXVC5DSEVDSzsKLQkJCQkJaWYgKChmQWN0aW9uc1tqXS5nZXRTdHlsZSgpICYgSUFjdGlvbi5BU19SQURJT19CVVRUT04pICE9IDApCi0JCQkJCQlzdHlsZT0gU1dULlJBRElPOwotCQkJCQkKLQkJCQkJTWVudUl0ZW0gbWk9IG5ldyBNZW51SXRlbShtZW51LCBzdHlsZSwgaW5kZXgpOwotCQkJCQlJbWFnZURlc2NyaXB0b3IgZD0gZkFjdGlvbnNbal0uZ2V0SW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQkJCW1pLnNldEltYWdlKEF1dGhvcmluZ1VJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkuZ2V0KGQpKTsKLQkJCQkJZkl0ZW1zW2pdPSBtaTsKLQkJCQkJbWkuc2V0VGV4dChmQWN0aW9uc1tqXS5nZXRUZXh0KCkpOwotCQkJCQltaS5zZXRTZWxlY3Rpb24oZkN1cnJlbnRTZWxlY3Rpb24gPT0gaik7Ci0JCQkJCW1pLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQkJaWYgKGZDdXJyZW50U2VsZWN0aW9uID09IGopIHsKLQkJCQkJCQkJZkl0ZW1zW2ZDdXJyZW50U2VsZWN0aW9uXS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQkJZkFjdGlvbnNbal0ucnVuKCk7Ci0KLQkJCQkJCQkvLyBVcGRhdGUgY2hlY2tlZCBzdGF0ZQotCQkJCQkJCWZJdGVtc1tmQ3VycmVudFNlbGVjdGlvbl0uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQkJCQlmQ3VycmVudFNlbGVjdGlvbj0gajsKLQkJCQkJCQlmSXRlbXNbZkN1cnJlbnRTZWxlY3Rpb25dLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQkJCX0KLQotCQkJCQl9KTsKLQkJCQl9Ci0JCQkJcHVibGljIGJvb2xlYW4gaXNEeW5hbWljKCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9OZXdQbHVnaW5BY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL05ld1BsdWdpbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOTI2MDBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL05ld1BsdWdpbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlBlcnNwZWN0aXZlTGlzdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld01ldGhvZFBsdWdpbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlBlcnNwZWN0aXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLkxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIERpc3BsYXlzIHRoZSBOZXcgTWV0aG9kIFBsdWctaW4gd2l6YXJkIGFuZCBjcmVhdGVzIGEgbmV3IHBsdWctaW4gd2hlbiB0aGUKLSAqIHVzZXIgc2VsZWN0cyB0aGUgRmluaXNoIGJ1dHRvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTmV3UGx1Z2luQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQotCS8vIFRoZSBjYWNoZWQgd2luZG93IG9iamVjdC4KLQlwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3UGx1Z2luQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld1BsdWdpbkFjdGlvbihTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KElXb3JrYmVuY2hXaW5kb3cpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl0aGlzLndpbmRvdyA9IHdpbmRvdzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4oSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJcnVuKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlNZXRob2RMaWJyYXJ5IHRhcmdldExpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKHRhcmdldExpYiA9PSBudWxsKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdQbHVnaW5XaXphcmRfdGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubm9PcGVuTGlicmFyeUVycm9yX21zZyk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkodGFyZ2V0TGliLCBzaGVsbCk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXkoCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3UGx1Z2luV2l6YXJkX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3UGx1Z2luV2l6YXJkX2NyZWF0ZUVycm9yLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJc3RhdHVzKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZpbmFsIElXb3JrYmVuY2ggd29ya2JlbmNoID0gd2luZG93ICE9IG51bGwgPyAKLQkJCQkod2luZG93LmdldFdvcmtiZW5jaCgpID09IG51bGwgPyAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSA6IHdpbmRvdy5nZXRXb3JrYmVuY2goKSkKLQkJCQk6IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7IAotCQlMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJcnVubmVyLnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCWV4ZWN1dGUod29ya2JlbmNoLCBudWxsKTsJCQotCQkJfQotCQkJCi0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24sIElTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHdvcmtiZW5jaAotCSAqICAgICAgICAgICAgVGhlIGFjdGl2ZSB3b3JrYmVuY2guCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqICAgICAgICAgICAgVGhlIGFjdGl2ZSBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGV4ZWN1dGUoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU5ld01ldGhvZFBsdWdpbldpemFyZCB3aXphcmQgPSBuZXcgTmV3TWV0aG9kUGx1Z2luV2l6YXJkKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiB8fCBzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJd2l6YXJkLmluaXQod29ya2JlbmNoLCAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCX0KLQotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0KLQkJaWYgKCFQZXJzcGVjdGl2ZUxpc3RVdGlsLmlzQXV0aG9yaW5nUGVyc3BlY3RpdmUoKSkgewotCQkJUGVyc3BlY3RpdmVVdGlsCi0JCQkJCS5vcGVuUGVyc3BlY3RpdmUoQXV0aG9yaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3BlbkNoZWF0c2hlZXRWaWV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PcGVuQ2hlYXRzaGVldFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGIzMTgxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PcGVuQ2hlYXRzaGVldFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNoZWF0c2hlZXRzLnZpZXdzLkNoZWF0U2hlZXRWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludHJvLklJbnRyb1NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50cm8uY29uZmlnLklJbnRyb0FjdGlvbjsKLQotLyoqCi0gKiBPcGVuIGNoZWF0IHNoZWV0IHZpZXcKLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5DaGVhdHNoZWV0VmlldyBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElJbnRyb0FjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBPcGVuQ2hlYXRzaGVldFZpZXcoKSB7Ci0JCXN1cGVyKEF1dGhvcmluZ1VJUmVzb3VyY2VzLk9wZW5DaGVhdHNoZWV0Vmlld190aXRsZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludHJvLmNvbmZpZy5JSW50cm9BY3Rpb24jcnVuKG9yZy5lY2xpcHNlLnVpLmludHJvLklJbnRyb1NpdGUsIGphdmEudXRpbC5Qcm9wZXJ0aWVzKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJSW50cm9TaXRlIHNpdGUsIFByb3BlcnRpZXMgcGFyYW1zKSB7Ci0JCVN0cmluZyBjaGVhdHNoZWV0X2lkID0gcGFyYW1zLmdldFByb3BlcnR5KCJpbnB1dCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0b2dnbGVfc3RyID0gcGFyYW1zLmdldFByb3BlcnR5KCJ0b2dnbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBJTkZPOiBjaGVhdHNoZWV0IGlkID0gIiArIGNoZWF0c2hlZXRfaWQpOwotCi0JCUlXb3JrYmVuY2hXaW5kb3cgYWN0aXZlV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQotCQkvLyBkZS1tYXhpbWFpemUgdGhlIHdlbGNvbWUsIGkuZS4gdGhlIGludHJvIHZpZXcgd2luZG93Ci0JCWlmICh0b2dnbGVfc3RyICE9IG51bGwgJiYgdG9nZ2xlX3N0ci5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdG9nZ2xlQWN0aXZlVmlldygpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCS8vIENoZWF0U2hlZXRWaWV3IG9iaiA9IG5ldyBDaGVhdFNoZWV0VmlldygpOwotCQkJYWN0aXZlV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5zaG93VmlldygKLQkJCQkJIm9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLnZpZXdzLkNoZWF0U2hlZXRWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQkJCUNoZWF0U2hlZXRWaWV3IGNzVmlldyA9IChDaGVhdFNoZWV0VmlldykgYWN0aXZlV2luZG93Ci0JCQkJCS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlUGFydCgpOwotCQkJY3NWaWV3LnNldElucHV0KGNoZWF0c2hlZXRfaWQpOwotCi0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4cCkgewotCQkJLy8gJCQkIGVycm9yIGhhbmRsaW5nIGhlcmUuCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRvZ2dsZSBhY3RpdmUgdmlldwotCSAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRvZ2dsZUFjdGl2ZVZpZXcoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgYWN0aXZlV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQotCQkvLyBkZS1tYXhpbWFpemUgdGhlIHdlbGNvbWUsIGkuZS4gdGhlIGludHJvIHZpZXcgd2luZG93IG9yIGFueSBhY3RpdmUKLQkJLy8gdmlldwotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gYWN0aXZlV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBXb3JrYmVuY2hQYWdlKSB7Ci0JCQkJLy9Xb3JrYmVuY2hQYWdlIHJlYWxQYWdlID0gKFdvcmtiZW5jaFBhZ2UpIHBhZ2U7Ci0KLQkJCQlJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmID0gcGFnZS5nZXRBY3RpdmVQYXJ0UmVmZXJlbmNlKCk7Ci0KLQkJCQlpZiAocGFydFJlZiAhPSBudWxsKSB7Ci0JCQkJCSgoV29ya2JlbmNoUGFnZSkgcGFnZSkudG9nZ2xlWm9vbShwYXJ0UmVmKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5Db25maWd1cmF0aW9uQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PcGVuQ29uZmlndXJhdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYjc0ZmQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5Db25maWd1cmF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuUGVyc3BlY3RpdmVMaXN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlVJQWN0aW9uRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuT3BlbkNvbmZpZ3VyYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogT3BlbnMgQ29uZmlndXJhdGlvbiBlZGl0b3IKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkNvbmZpZ3VyYXRpb25BY3Rpb24gaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCS8vIHByaXZhdGUgc3RhdGljIFN0cmluZyBERUZBVUxUX1BFUlNQRUNUSVZFX0lEID0gbnVsbDsKLQotCS8vIHByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCXByaXZhdGUgTGlzdCBjb25maWdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJLy8gdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWNvbmZpZ0xpc3QuY2xlYXIoKTsKLQkJCQlkb1dvcmsoKTsKLQkJCQlpZiAoY29uZmlnTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJCWlmICghUGVyc3BlY3RpdmVMaXN0VXRpbC5pc0F1dGhvcmluZ1BlcnNwZWN0aXZlKCkpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIiQkJERFQlVHOiBOZWVkIHRvIHN3aXRjaCB0byBhdXRob3JpbmcgcGVyc3BlY3RpdmUhIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmUoKTsKLQkJCQkJfQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ0xpc3QKLQkJCQkJCQkJLmdldChpKTsKLQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkREVCVUc6IGNvbmZpZyBuYW1lID0gIiArCi0JCQkJCQkvLyBjb25maWcuZ2V0TmFtZSgpKTsKLQkJCQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRWRpdG9yKGNvbmZpZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvV29yaygpIHsKLQkJdHJ5IHsKLQkJCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0KLQkJCQlPcGVuQ29uZmlndXJhdGlvbldpemFyZCB3aXphcmQgPSBuZXcgT3BlbkNvbmZpZ3VyYXRpb25XaXphcmQoCi0JCQkJCQljb25maWdMaXN0KTsKLQkJCQl3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBzZWxlY3Rpb24pOyAvLyBwcm9iYWJseQotCQkJCS8vIG5vIG5lZWQgZm9yIHRoaXMgbGluZQotCQkJCS8vIEluc3RhbnRpYXRlcyB0aGUgd2l6YXJkIGNvbnRhaW5lciB3aXRoIHRoZSB3aXphcmQgYW5kIG9wZW5zCi0JCQkJLy8gaXQKLQkJCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJLmdldEFjdGl2ZVNoZWxsKCksIHdpemFyZCk7Ci0JCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0KLQkJCQkvLyBmb3IgKGludCBpPTA7IGk8Y29uZmlnTGlzdC5zaXplKCk7IGkrKykgewotCQkJCS8vIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0KLQkJCQkvLyAoTWV0aG9kQ29uZmlndXJhdGlvbiljb25maWdMaXN0LmdldChpKTsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oY29uZmlnLmdldE5hbWUoKSk7Ci0JCQkJLy8gfQotCi0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5FbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5FbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTYyYjRlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PcGVuRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlBlcnNwZWN0aXZlTGlzdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5VSUFjdGlvbkRpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkNvbnRyaWJ1dGlvblNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLQotLyoqCi0gKiBPcGVuIGEgbWV0aG9kIGVsZW1lbnQgZWRpdG9yIGRlbGVnYXRpb24gYWN0aW9uCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkVsZW1lbnRBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQ7Ci0KLQlwcml2YXRlIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0JcHJpdmF0ZSBDb250cmlidXRpb25TZWxlY3Rpb24gY29udHJpYnV0b3JTZWxlY3RvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBPcGVuRWxlbWVudEFjdGlvbkRlbGVnYXRlKCkgewotCQlzdXBlcigpOwotCQljb250cmlidXRvclNlbGVjdG9yID0gbmV3IENvbnRyaWJ1dGlvblNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlI3NldEFjdGl2ZVBhcnQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJdGhpcy50YXJnZXRQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBPcGVuIGVsZW1lbnQgYWN0aW9uISIpOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIDU6ICIgKyBzZWxlY3Rpb24pOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCi0JCUFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCB0YXJnZXRQYXJ0ID0gIiArIHRhcmdldFBhcnQpOyAvLyROT04tTkxTLTEkCi0JCWlmICh0YXJnZXRQYXJ0IGluc3RhbmNlb2YgQ29uZmlndXJhdGlvblZpZXcpIHsKLQkJCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGVkLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqZWN0cy5uZXh0KCkpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBjb250cmlidXRvclNlbGVjdG9yCi0JCQkJCQkJLmdldFNlbGVjdGVkQ29udHJpYnV0b3IoKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudCk7Ci0JCQkJCWlmIChvYmogIT0gbnVsbCkKLQkJCQkJCWVsZW1lbnRMaXN0LmFkZChvYmopOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVsZW1lbnRMaXN0LmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSBzZWxlY3RlZC5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKG9iamVjdHMubmV4dCgpKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJZWxlbWVudExpc3QuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChlbGVtZW50TGlzdC5zaXplKCkgPCAxKQotCQkJcmV0dXJuOwotCi0JCWlmIChQZXJzcGVjdGl2ZUxpc3RVdGlsLmlzQnJvd3NpbmdQZXJzcGVjdGl2ZSgpKSB7Ci0JCQlVSUFjdGlvbkRpc3BhdGNoZXIub3BlbkF1dGhvcmluZ1BlcnNwZWN0aXZlKCk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSBlbGVtZW50TGlzdC5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gb2JqZWN0cy5uZXh0KCk7Ci0JCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkub3BlbkVkaXRvcihlbGVtZW50KTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogRGlzcG9zZSAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkM2ZkOGQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5FbGVtZW50V29ya2JlbmNoQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuUGVyc3BlY3RpdmVMaXN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlVJQWN0aW9uRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5CYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb247Ci0KLQotLyoqCi0gKiBPcGVuIG1ldGhvZCBlbGVtZW50IGVkaXRvciBkZWxlZ2F0aW9uIGFjdGlvbiAKLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlIGV4dGVuZHMKLQkJQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQotCS8vIHByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0KLQlwcml2YXRlIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqCi0JICovCi0JcHVibGljIE9wZW5FbGVtZW50V29ya2JlbmNoQWN0aW9uRGVsZWdhdGUoKSB7Ci0JCXRoaXMoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZV9lZGl0X3RleHQwKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBPcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkvLyB0aGlzLndpbmRvdyA9IHdpbmRvdzsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgT3BlbiBlbGVtZW50IGFjdGlvbiEiKTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCA1OiAiICsgc2VsZWN0aW9uKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ZWQgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQotCQlpZiAoUGVyc3BlY3RpdmVMaXN0VXRpbC5pc0Jyb3dzaW5nUGVyc3BlY3RpdmUoKSkgewotCQkJVUlBY3Rpb25EaXNwYXRjaGVyLm9wZW5BdXRob3JpbmdQZXJzcGVjdGl2ZSgpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gc2VsZWN0ZWQuaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKG9iamVjdHMubmV4dCgpKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIDY6ICIgKyBlbGVtZW50KTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRWRpdG9yKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0KLQkJLy8gaWYgKCFQZXJzcGVjdGl2ZUxpc3RVaXRsLmlzQXV0aG9yaW5nUGVyc3BlY3RpdmUoKSB8fAotCQkvLyBzZWxlY3RlZC5pc0VtcHR5KCkpIHsKLQkJaWYgKHNlbGVjdGVkLmlzRW1wdHkoKSkgewotCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYm9vbGVhbiBlbmFibGVNZW51ID0gdHJ1ZTsKLQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gc2VsZWN0ZWQuaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKG9iamVjdHMubmV4dCgpKTsKLQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSkgewotCQkJCWVuYWJsZU1lbnUgPSBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCWFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZU1lbnUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3BlbkxpYnJhcnlBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5MaWJyYXJ5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwNTA3ZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3BlbkxpYnJhcnlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuVmlld0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIHRoZSBPcGVuIExpYnJhcnkgYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5MaWJyYXJ5QWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQotCS8qKgotCSAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjcnVuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCQotCQlpbnQgZGlydHlDb3VudCA9IDA7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBsaXN0ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChsaXN0W2ldLmlzRGlydHkoKSkgewotCQkJCWRpcnR5Q291bnQrKzsKLQkJCX0KLQkJfQotCQotCQlpZiAoZGlydHlDb3VudCA9PSAxKSB7Ci0JCQlib29sZWFuIHJjID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCS5nZXRBY3RpdmVQYWdlKCkuY2xvc2VBbGxFZGl0b3JzKHRydWUpOwotCQkJaWYgKCFyYykgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfSBlbHNlIGlmIChkaXJ0eUNvdW50ID4gMSl7Ci0JCQlzd2l0Y2goVmlld0hlbHBlci5wcm9tcHRTYXZlSW50KCkpIHsKLQkJCWNhc2UgU1dULllFUzoKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJLmdldEFjdGl2ZVBhZ2UoKS5jbG9zZUFsbEVkaXRvcnModHJ1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNXVC5OTzoKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJLmdldEFjdGl2ZVBhZ2UoKS5jbG9zZUFsbEVkaXRvcnMoZmFsc2UpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1QuQ0FOQ0VMOgotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQl9Ci0JCQotCQlMaWJyYXJ5VUlNYW5hZ2VyLmdldEluc3RhbmNlKCkub3BlbkxpYnJhcnkoKTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2Rpc3Bvc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5OZXdNZXRob2RQbHVnaW5XaXphcmRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5OZXdNZXRob2RQbHVnaW5XaXphcmRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTk2MmZkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PcGVuTmV3TWV0aG9kUGx1Z2luV2l6YXJkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuUGVyc3BlY3RpdmVMaXN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlVJQWN0aW9uRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3TWV0aG9kUGx1Z2luV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50cm8uSUludHJvU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRyby5jb25maWcuSUludHJvQWN0aW9uOwotCi0vKioKLSAqIE5ldyBNZXRob2QgcGx1Z2luIFVJIHdpemFyZAotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgT3Blbk5ld01ldGhvZFBsdWdpbldpemFyZEFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzCi0JCUlJbnRyb0FjdGlvbiB7Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludHJvLmNvbmZpZy5JSW50cm9BY3Rpb24jcnVuKG9yZy5lY2xpcHNlLnVpLmludHJvLklJbnRyb1NpdGUsIGphdmEudXRpbC5Qcm9wZXJ0aWVzKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJSW50cm9TaXRlIHNpdGUsIFByb3BlcnRpZXMgcGFyYW1zKSB7Ci0KLQkJU3RyaW5nIHRvZ2dsZV9zdHIgPSBwYXJhbXMuZ2V0UHJvcGVydHkoInRvZ2dsZSIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGRlLW1heGltYWl6ZSB0aGUgd2VsY29tZSwgaS5lLiB0aGUgaW50cm8gdmlldyB3aW5kb3cKLQkJaWYgKHRvZ2dsZV9zdHIgIT0gbnVsbCAmJiB0b2dnbGVfc3RyLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0b2dnbGVBY3RpdmVWaWV3KCk7Ci0JCX0KLQotCQlpZiAoIVBlcnNwZWN0aXZlTGlzdFV0aWwuaXNBdXRob3JpbmdQZXJzcGVjdGl2ZSgpKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk5lZWQgdG8gc3dpdGNoIHRvIGF1dGhvcmluZyBwZXJzcGVjdGl2ZSEiKTsKLQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmUoKTsKLQkJfQotCi0JCU5ld01ldGhvZFBsdWdpbldpemFyZCB3aXphcmQgPSBuZXcgTmV3TWV0aG9kUGx1Z2luV2l6YXJkKCk7Ci0JCXdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCksIChJU3RydWN0dXJlZFNlbGVjdGlvbikgbnVsbCk7Ci0KLQkJLy8gSW5zdGFudGlhdGVzIHRoZSB3aXphcmQgY29udGFpbmVyIHdpdGggdGhlIHdpemFyZCBhbmQgb3BlbnMgaXQKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cub3BlbigpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHRvZ2dsZUFjdGl2ZVZpZXcoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgYWN0aXZlV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQotCQkvLyBkZS1tYXhpbWFpemUgdGhlIHdlbGNvbWUsIGkuZS4gdGhlIGludHJvIHZpZXcgd2luZG93IG9yIGFueSBhY3RpdmUKLQkJLy8gdmlldwotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gYWN0aXZlV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBXb3JrYmVuY2hQYWdlKSB7Ci0JCQkJLy8gV29ya2JlbmNoUGFnZSByZWFsUGFnZSA9IChXb3JrYmVuY2hQYWdlKSBwYWdlOwotCi0JCQkJSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZiA9IHBhZ2UuZ2V0QWN0aXZlUGFydFJlZmVyZW5jZSgpOwotCi0JCQkJaWYgKHBhcnRSZWYgIT0gbnVsbCkgewotCQkJCQkoKFdvcmtiZW5jaFBhZ2UpIHBhZ2UpLnRvZ2dsZVpvb20ocGFydFJlZik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMjRkYTljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1Byb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuU3luY2hyb25pemVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLlByb2Nlc3NEZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLQotLyoqCi0gKiBEZWZhdWx0IFN5bmNocm9uaXplIGFjdGlvbiBmb3IgcHJvY2VzcyBlbGVtZW50cy4KLSAqIFN5bmNocm9uaXphdGlvbiB0YWtlcyBwbGFjZSBmcm9tIG1ldGhvZCB0byBwcm9jZXNzIGVsZW1lbnRzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbiBleHRlbmRzIENvbW1hbmRBY3Rpb25IYW5kbGVyIAotaW1wbGVtZW50cyBJV29ya2JlbmNoUGFydEFjdGlvbgotewotCXByb3RlY3RlZCBJV29ya2JlbmNoUGFydCBhY3RpdmVXb3JrYmVuY2hQYXJ0OwotCXByb3RlY3RlZCBib29sZWFuIGNhblJ1bjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbigpIHsKLQkJc3VwZXIobnVsbCwgTGlicmFyeUVkaXRSZXNvdXJjZXMuQXV0b1N5bmNocm9uaXplQ29tbWFuZF9sYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIHdpdGggbGFiZWwgdGV4dAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uKFN0cmluZyBsYWJlbFRleHQpIHsKLQkJc3VwZXIobnVsbCwgbGFiZWxUZXh0KTsgCi0JfQotCQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLklXb3JrYmVuY2hQYXJ0QWN0aW9uI3NldEFjdGl2ZVdvcmtiZW5jaFBhcnQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlV29ya2JlbmNoUGFydChJV29ya2JlbmNoUGFydCB3b3JrYmVuY2hQYXJ0KSB7Ci0JCWFjdGl2ZVdvcmtiZW5jaFBhcnQgPSB3b3JrYmVuY2hQYXJ0OwotCQlpZiAod29ya2JlbmNoUGFydCBpbnN0YW5jZW9mIElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIHsKLQkJCWRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgd29ya2JlbmNoUGFydCkKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IFN5bmNocm9uaXplQ29tbWFuZChnZXRUZXh0KCksIHNlbGVjdGlvbikgewotCQkJLyoKLQkJCSAqIAotCQkJICogCi0JCQkgKiBAc2VlIEF1dG9TeW5jaHJvbml6ZUNvbW1hbmQjZGVsZXRlKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCQkJICovCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBkZWxldGUoTGlzdCBlbGVtZW50cykgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBQcm9jZXNzRGVsZXRlQWN0aW9uLmRlbGV0ZShlbGVtZW50cyk7Ci0JCQkJfQotCQkJCWNhdGNoKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJYWJvcnRlZCA9IHRydWU7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9jZXNzIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlpZihhY3RpdmVXb3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9ICgoSUVkaXRvclBhcnQpYWN0aXZlV29ya2JlbmNoUGFydCkuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpaW5wdXQpLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQlpZihlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlyZXR1cm4gKChQcm9jZXNzQ29tcG9uZW50KWUpLmdldFByb2Nlc3MoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3VwZGF0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQXJyYXlMaXN0IHNlbGVjdGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIAotCQkJCQkmJiAhKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudCkuaXNSZWFkT25seSgpKSB7Ci0JCQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJfQotCQkJCi0JCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCQlEZXNjcmlwdG9yIGRlc2MgPSAoRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQkJCi0JCQkJCS8vIGRlc2NyaXB0b3IgbXVzdCBiZSBsaW5rZWQgYW5kIGlzIG5vdCBzdXBwcmVzc2VkCi0JCQkJCS8vCi0JCQkJCXZhbGlkID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoZGVzYykgIT0gbnVsbCAmJiAhZGVzYy5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCk7CQkJCQkKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGV4Y2x1ZGUgYnJlYWtkb3duIGVsZW1lbnQgd2l0aG91dCBhIHN1cGVyIGFjdGl2aXR5IGxpa2UgVGVhbVByb2ZpbGUncyBvd24gUm9sZURlc2NyaXB0b3IKLQkJCQkJLy8KLQkJCQkJaWYgKCgoQnJlYWtkb3duRWxlbWVudCllbGVtZW50KS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSAKLQkJCQkJewotCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MgJiYgKChQcm9jZXNzKWVsZW1lbnQpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCQl2YWxpZCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl2YWxpZCA9IGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBlbGVtZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZih2YWxpZCkgewotCQkJCXNlbGVjdGVkLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0ZWQuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3RlZCkpOwotCX0KLQotCi0gICAvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzcyNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJY2FuUnVuID0gKChTeW5jaHJvbml6ZUNvbW1hbmQpIGNvbW1hbmQpLmluaXRpbGl6ZSgpOwotCQkJfQotCQl9OwotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uX3ByZXBhcmUpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGNhblJ1bikgewotCQkJc3VwZXIucnVuKCk7Ci0JCQkvLyBpZigoKEF1dG9TeW5jaHJvbml6ZUNvbW1hbmQpY29tbWFuZCkuaXNTdWNlc3NmdWwoKSkgewotCQkJLy8gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlJbmZvKGdldFRleHQoKSwKLQkJCS8vICJTeW5jaHJvbml6YXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4iKTsKLQkJCS8vCQkJCQotCQkJLy8gfQotCQl9IGVsc2UgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlJbmZvKAotCQkJCQkJCWdldFRleHQoKSwKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uX25vRGVzY3JpcHRvclRvU3luY2gpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1JlZnJlc2hDb25maWd1cmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9SZWZyZXNoQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMmFlZjFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1JlZnJlc2hDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLQotLyoqCi0gKiBSZWZyZXNoIENvbmZpZ3VyYXRpb24gYWN0aW9uCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUmVmcmVzaENvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvblZpZXcgdGFyZ2V0VmlldzsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0JCXRhcmdldFZpZXcgPSAoQ29uZmlndXJhdGlvblZpZXcpIHZpZXc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQl0YXJnZXRWaWV3LmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TYXZlVGhpc0FjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvU2F2ZVRoaXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmRjZmI5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TYXZlVGhpc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotCi0vKioKLSAqIEFjdGlvbiBmb3Igc2F2aW5nIHJlc291cmNlcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2F2ZVRoaXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JcHJpdmF0ZSBBcnJheUxpc3Qgc2VsZWN0ZWRPYmplY3RzOwotCi0JcHVibGljIFNhdmVUaGlzQWN0aW9uKCkgewotCQlzdXBlcihBdXRob3JpbmdVSVJlc291cmNlcy5TYXZlVGhpc0FjdGlvbl9zYXZlb2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogCQkJU2VsZWN0aW9uCi0JICogQHJldHVybiAKLQkgKiAJCQlib29sZWFuIHZhbHVlIHRvIGluZGljYXRlIHdoZXRoZXIgdXBkYXRlIHdhcyBkb25lCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZWxlY3RlZE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspIHsKLQkJCXNlbGVjdGVkT2JqZWN0cy5hZGQoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluLnVud3JhcChvYmplY3RzCi0JCQkJCS5uZXh0KCkpKTsKLQkJfQotCi0JCXJldHVybiBzZWxlY3RlZE9iamVjdHMuc2l6ZSgpID09IDEKLQkJCQkmJiBzZWxlY3RlZE9iamVjdHMuZ2V0KDApIGluc3RhbmNlb2YgRU9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoc2VsZWN0ZWRPYmplY3RzID09IG51bGwgfHwgc2VsZWN0ZWRPYmplY3RzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJRmlsZURpYWxvZyBmZCA9IG5ldyBGaWxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJU1dULlNBVkUpOwotCQlTdHJpbmcgcGF0aCA9IGZkLm9wZW4oKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVVJJIGZpbGVVUkkgPSBVUkkuY3JlYXRlRmlsZVVSSShwYXRoKTsKLQkJLy8gQ3JlYXRlIHRoZSByZXNvdXJjZSB0byBwZXJzaXN0IHRoZSBtb2RlbC4KLQkJUmVzb3VyY2UgcmVzID0gbmV3IFhNSVJlc291cmNlRmFjdG9yeUltcGwoKS5jcmVhdGVSZXNvdXJjZShmaWxlVVJJKTsKLQkJT2JqZWN0IG9iaiA9IHNlbGVjdGVkT2JqZWN0cy5nZXQoMCk7Ci0JCXJlcy5nZXRDb250ZW50cygpLmFkZChvYmopOwotCQl0cnkgewotCQkJcmVzLnNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvU2hvd1ByZXNlbnRhdGlvbk5hbWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TaG93UHJlc2VudGF0aW9uTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWRjZjUxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TaG93UHJlc2VudGF0aW9uTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLQotLyoqCi0gKiBTaG93IFByZXNlbnRhdGlvbiBuYW1lcyBpbiBsaWJyYXJ5IHZpZXcKLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU2hvd1ByZXNlbnRhdGlvbk5hbWVzIGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcml2YXRlIExpYnJhcnlWaWV3IHRhcmdldFZpZXc7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQl0YXJnZXRWaWV3ID0gKExpYnJhcnlWaWV3KSB2aWV3OwotCi0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCVByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0Uuc2V0U2hvd1ByZXNlbnRhdGlvbk5hbWVzKCFQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmlzU2hvd1ByZXNlbnRhdGlvbk5hbWVzKCkpOwotCQl0YXJnZXRWaWV3LmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1N5bmNocm9uaXphdGlvbkFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvU3luY2hyb25pemF0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3Mzk1MGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvU3luY2hyb25pemF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TeW5jaHJvbml6YXRpb25DaG9pY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TeW5jaHJvbml6YXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5TeW5jaHJvbml6ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIFN5bmNocm9uaXphaXRvbiBhY3Rpb24gZm9yIHByb2Nlc3MgZWxlbWVudHMuIFN5bmNocm9uaXphdGlvbiB0YWtlcyBwbGFjZSBmcm9tIG1ldGhvZAotICogZWxlbWVudCB0byBwcm9jZXNzIGVsZW1lbnRzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTGUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6YXRpb25BY3Rpb24gZXh0ZW5kcyBQcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uIAotaW1wbGVtZW50cyBJV29ya2JlbmNoUGFydEFjdGlvbgotewotCi0JcHJpdmF0ZSBQcm9jZXNzIHNlbGVjdGVkUHJvY2VzczsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICoKLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemF0aW9uQWN0aW9uKCkgewotCQlzdXBlcihMaWJyYXJ5RWRpdFJlc291cmNlcy5NYW51YWxTeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWwpOyAKLQl9Ci0JCi0JLyoKLQkgKiBTZXQgUHJvY2VzcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2Nlc3MoUHJvY2VzcyBhUHJvY2VzcykgewotCQl0aGlzLnNlbGVjdGVkUHJvY2VzcyA9IGFQcm9jZXNzOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3VwZXJSdW4oKSB7Ci0JCXN1cGVyLnJ1bigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6YXRpb25DaG9pY2VzIGNob2ljZXMgPSBuZXcgU3luY2hyb25pemF0aW9uQ2hvaWNlcygpOwotCQkJCWNob2ljZXMuc2V0U2VsZWN0ZWRQcm9jZXNzKHNlbGVjdGVkUHJvY2Vzcyk7Ci0JCQkJCi0JCQkJLy8gSW5zdGFudGlhdGUgYW5kIGluaXRpYWxpemUgdGhlIHdpemFyZC4KLQkJCQlTeW5jaHJvbml6YXRpb25XaXphcmQgd2l6YXJkID0gbmV3IFN5bmNocm9uaXphdGlvbldpemFyZChjaG9pY2VzKTsKLQotCQkJCS8vIEluc3RhbnRpYXRlIHRoZSB3aXphcmQgY29udGFpbmVyIHdpdGggdGhlIHdpemFyZCBhbmQgb3BlbiBpdC4KLQkJCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCAKLQkJCQkJCQkJCQkJd2l6YXJkKTsKLQkJCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQkJZGlhbG9nLm9wZW4oKTsJCi0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBERUJVRzogIiArIGNob2ljZXMpOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCQkJaWYgKCFjaG9pY2VzLmlzRmluaXNoUHJlc3NlZCgpKQotCQkJCQlyZXR1cm47Ci0JCQkJCi0JCQkJLy8gU2V0IHN5bmNoRmVhdHVyZXMgJ3N5bmNGZWF0dXJlU2V0JwotCQkJCUhhc2hTZXQgc3luY0ZlYXR1cmVTZXQgPSBuZXcgSGFzaFNldCgpOwotCQkJCWFkZENob2ljZXNUb1NldChzeW5jRmVhdHVyZVNldCwgY2hvaWNlcyk7Ci0JCQkJLy8gTWV0aG9kIGNvbmZpZyBjYW4gYmUgb2J0YWluZWQgYnkgJ2Nob2ljZXMuZ2V0U2VsZWN0ZWRDb25maWcoKScKLQkJCQkKLQkJCQlTeW5jaHJvbml6ZUNvbW1hbmQgY21kID0gKFN5bmNocm9uaXplQ29tbWFuZCljb21tYW5kOwotCQkJCWNtZC5zZXRNZXRob2RDb25maWd1cmF0aW9uKGNob2ljZXMuZ2V0U2VsZWN0ZWRDb25maWcoKSk7Ci0JCQkJY21kLnNldFN5bmNocm9uaXphdGlvbkZlYXR1cmVzKHN5bmNGZWF0dXJlU2V0KTsKLQkJCQkKLQkJCQlzdXBlclJ1bigpOwotCQkJfQotCQl9KTsKLQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENob2ljZXNUb1NldChIYXNoU2V0IHN5bmNTZXQsIFN5bmNocm9uaXphdGlvbkNob2ljZXMgY2hvaWNlcykgewotCQlpZiAoY2hvaWNlcy5nZXRTeW5jTmFtZSgpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY1ByZXNOYW1lKCkgPT0gU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCl7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jQnJpZWZEZXNjKCkgPT0gU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCl7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY09wdElucHV0KCkgPT0gU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCl7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY01hbklucHV0KCkgPT0gU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCl7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCkpOwotCQl9Ci0JCWlmIChjaG9pY2VzLmdldFN5bmNPdXRwdXQoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCkpOwotCQl9Ci0JCWlmIChjaG9pY2VzLmdldFN5bmNQcmltUGVyZm9ybWVyKCkgPT0gU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCl7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCkpOwotCQl9Ci0JCWlmIChjaG9pY2VzLmdldFN5bmNBZGRuUGVyZm9ybWVyKCkgPT0gU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCl7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpOwotCQl9Ci0JCWlmIChjaG9pY2VzLmdldFN5bmNSZXNwUm9sZSgpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jQ29udEFydGlmYWN0KCkgPT0gU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCl7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY0RlbGl2UGFydCgpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCkpOwotCQl9Ci0JCWlmIChjaG9pY2VzLmdldFN5bmNTZWxTdGVwKCkgPT0gU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCl7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1N0ZXBzKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyM2YzYzFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogVXBkYXRlIHN1cHByZXNzaW9uIGluZm9ybWF0aW9uIGZyb20gYmFzZSBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24gZXh0ZW5kcwotCQlDb21tYW5kQWN0aW9uSGFuZGxlciBpbXBsZW1lbnRzIElXb3JrYmVuY2hQYXJ0QWN0aW9uIHsKLQotCXByaXZhdGUgUHJvY2Vzc0VkaXRvciBlZGl0b3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbihTdHJpbmcgdGV4dCkgewotCQlzdXBlcihudWxsLCB0ZXh0KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqCi0JICovCi0JcHVibGljIFVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24oKSB7Ci0JCXRoaXMoQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl91cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uX2xhYmVsKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciN1cGRhdGVTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYoU3VwcHJlc3Npb24uaXNWYWxpZChlbGVtZW50KSkgewotCQkJCWxpc3QuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWlmKGxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihsaXN0KSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IFVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VDb21tYW5kKGdldFRleHQoKSwgc2VsZWN0aW9uLCBlZGl0b3IuZ2V0QWRhcHRlckZhY3RvcnkoKSwgZWRpdG9yLmdldFN1cHByZXNzaW9uKCkpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUNvbW1hbmQjZXhlY3V0ZSgpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQkJc3VwZXIuZXhlY3V0ZSgpOwotCQkJCQotCQkJCWlmKCFnZXRBZmZlY3RlZE9iamVjdHMoKS5pc0VtcHR5KCkpIHsKLQkJCQkJZWRpdG9yLnJlZnJlc2hBbGxQcm9jZXNzRWRpdG9ycygpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5VcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQ29tbWFuZCN1bmRvKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgdW5kbygpIHsKLQkJCQlzdXBlci51bmRvKCk7Ci0JCQkJCi0JCQkJaWYoIWdldEFmZmVjdGVkT2JqZWN0cygpLmlzRW1wdHkoKSkgewotCQkJCQllZGl0b3IucmVmcmVzaEFsbFByb2Nlc3NFZGl0b3JzKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLklXb3JrYmVuY2hQYXJ0QWN0aW9uI3NldEFjdGl2ZVdvcmtiZW5jaFBhcnQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlV29ya2JlbmNoUGFydChJV29ya2JlbmNoUGFydCB3b3JrYmVuY2hQYXJ0KSB7Ci0JCWlmKHdvcmtiZW5jaFBhcnQgaW5zdGFuY2VvZiBJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSB7Ci0JCQlkb21haW4gPSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpd29ya2JlbmNoUGFydCkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQl9Ci0JCWlmKHdvcmtiZW5jaFBhcnQgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9yKSB7Ci0JCQllZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgd29ya2JlbmNoUGFydDsKLQkJfQkJCi0JCWVsc2UgaWYod29ya2JlbmNoUGFydCA9PSBudWxsKSB7Ci0JCQllZGl0b3IgPSBudWxsOwotCQl9Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgc3VwZXJSdW4oKSB7Ci0JCXN1cGVyLnJ1bigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZWRpdG9yLmdldEVkaXRvclNpdGUoKQotCQkJCS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXN1cGVyUnVuKCk7Ci0JCQkJCX0KLQkJCQotCQl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0MTdkZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZWRpdGluZyBhY3Rpb25zIGZvciB0aGUgQXV0aG9yaW5nIFVJLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jZWxsZWRpdG9ycy9BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NlbGxlZGl0b3JzL0Fic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1N2JiMjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NlbGxlZGl0b3JzL0Fic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVHJlZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBjbGFzcyBmb3IgY2hlY2sgYm94IGNlbGwgZWRpdG9yCi0gKiBAYXV0aG9yIEFuIE1pbmcKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciB7Ci0KLQkvLyB0aGUgY2VsbCBtb2RpZmllcgotCXByaXZhdGUgSUNlbGxNb2RpZmllciBtb2RpZmllciA9IG51bGw7Ci0KLQkvLyB0cmVlIGVkaXRvcgotCXByaXZhdGUgVHJlZUVkaXRvciB0cmVlRWRpdG9yID0gbnVsbDsKLQotCS8vIHRoZSB0cmVlCi0JcHJpdmF0ZSBUcmVlIHRyZWUgPSBudWxsOwotCi0JLy8gdGhlIGNvbnRyb2wgZWRpdG9yCi0JcHJpdmF0ZSBDb250cm9sIGNvbnRyb2wgPSBudWxsOwotCi0JLy8gdGhlIGNvbHVtbiBpbmRleAotCXByaXZhdGUgaW50IGNvbHVtbkluZGV4OwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGluc3RhbmNlCi0JICogQHBhcmFtIHRyZWUKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3IoQ29tcG9zaXRlIHRyZWUpIHsKLQkJdGhpcy50cmVlID0gKFRyZWUpIHRyZWU7Ci0JCXRoaXMudHJlZUVkaXRvciA9IG5ldyBUcmVlRWRpdG9yKHRoaXMudHJlZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBTZXQgY2VsbCBtb2RpZmllcgotCSAqIEBwYXJhbSBtb2RpZmllcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENlbGxNb2RpZmllcihJQ2VsbE1vZGlmaWVyIG1vZGlmaWVyKSB7Ci0JCXRoaXMubW9kaWZpZXIgPSBtb2RpZmllcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNlbGwgbW9kaWZpZXIKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQlDZWxsTW9kaWZpZXIKLQkgKi8KLQlwcm90ZWN0ZWQgSUNlbGxNb2RpZmllciBnZXRDZWxsTW9kaWZpZXIoKSB7Ci0JCXJldHVybiB0aGlzLm1vZGlmaWVyOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBJbWFnZSBnZXRJbWFnZShUcmVlSXRlbSBpdGVtLCBTdHJpbmcgY29sdW1ucHJvcGVydHkpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgbW9kaWZ5KFRyZWVJdGVtIGl0ZW0sIFN0cmluZyBjb2x1bW5wcm9wZXJ0eSk7Ci0KLQkvKgotCSAqID09PT09PT1pbiBmYWN0IGJlbG93IGNvZGVzIGFyZSBmb3IgdGhlIGR5bmFtaWMgY2VsbCBlZGl0b3IgKHJlYWwgY29udHJvbAotCSAqICJidXR0b24iKT09PT09Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdG9yVG8oVHJlZUl0ZW0gaXRlbSwgU3RyaW5nIGNvbHVtbnByb3BlcnR5KSB7Ci0JCWlmICh0cmVlRWRpdG9yLmdldEl0ZW0oKSAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoY29udHJvbCA9PSBudWxsKQotCQkJY29udHJvbCA9IGNyZWF0ZUNvbnRyb2wodHJlZSk7Ci0JCWhvb2tDb250cm9sKGNvbnRyb2wsIGl0ZW0sIGNvbHVtbnByb3BlcnR5KTsKLQotCQl0cmVlRWRpdG9yLm1pbmltdW1XaWR0aCA9IGNvbnRyb2wuZ2V0U2l6ZSgpLng7Ci0JCXRyZWVFZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5DRU5URVI7Ci0JCXRyZWVFZGl0b3Iuc2V0RWRpdG9yKGNvbnRyb2wsIGl0ZW0sIGNvbHVtbkluZGV4KTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZUVkaXRvckZyb20oVHJlZUl0ZW0gaXRlbSwgU3RyaW5nIGNvbHVtbnByb3BlcnR5KSB7Ci0JCWNvbnRyb2wuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCXRyZWVFZGl0b3Iuc2V0RWRpdG9yKG51bGwsIG51bGwsIGNvbHVtbkluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29udHJvbCBjcmVhdGVDb250cm9sKFRyZWUgcGFyZW50KTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGhvb2tDb250cm9sKENvbnRyb2wgY29udHJvbCwgVHJlZUl0ZW0gaXRlbSwKLQkJCVN0cmluZyBjb2x1bW5wcm9wZXJ0eSk7Ci0KLQkvKioKLQkgKiBHZXQgY29sdW1uIGluZGV4Ci0JICogQHJldHVybgotCSAqIAkJaW5kZXgKLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbHVtbkluZGV4KCkgewotCQlyZXR1cm4gY29sdW1uSW5kZXg7Ci0JfQotCi0JLyoqCi0JICogU2V0IGluZGV4IGZvciBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uSW5kZXgKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW5JbmRleChpbnQgY29sdW1uSW5kZXgpIHsKLQkJdGhpcy5jb2x1bW5JbmRleCA9IGNvbHVtbkluZGV4OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jZWxsZWRpdG9ycy9Qcm9jZXNzQ2hlY2tCb3hDZWxsRWRpdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2VsbGVkaXRvcnMvUHJvY2Vzc0NoZWNrQm94Q2VsbEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZDU5MzZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jZWxsZWRpdG9ycy9Qcm9jZXNzQ2hlY2tCb3hDZWxsRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci0KLS8qKgotICogQ2hlY2sgQm94IGNlbGwgZWRpdG9yIGZvciBwcm9jZXNzIGZvcm0gcGFnZSwgV0JTLCBUQSwgV1BVCi0gKiAKLSAqIEBhdXRob3IgQW4gTWluZwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDaGVja0JveENlbGxFZGl0b3IgZXh0ZW5kcyBBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciB7Ci0JCi0JLy8gY2hlY2tib3ggaW1hZ2VzCi0JcHJpdmF0ZSBmaW5hbCBJbWFnZSBjaGVja0ltYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJImZ1bGwvb2JqMTYvQ2hlY2suZ2lmIik7Ci0KLQlwcml2YXRlIGZpbmFsIEltYWdlIHVuY2hlY2tJbWFnZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCSJmdWxsL29iajE2L1VuY2hlY2suZ2lmIik7Ci0KLQlwcml2YXRlIGZpbmFsIEltYWdlIGRpc2FibGVDaGVja0ltYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkiZnVsbC9vYmoxNi9EaXNhYmxlQ2hlY2suZ2lmIik7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBJbWFnZSBkaXNhYmxlVW5jaGVja0ltYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkiZnVsbC9vYmoxNi9EaXNhYmxlVW5DaGVjay5naWYiKTsKLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSB0cmVlCi0JICovCi0JcHVibGljIFByb2Nlc3NDaGVja0JveENlbGxFZGl0b3IoQ29tcG9zaXRlIHRyZWUpIHsKLQkJc3VwZXIodHJlZSk7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNlbGxlZGl0b3JzLkFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yI2dldEltYWdlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShUcmVlSXRlbSBpdGVtLCBTdHJpbmcgY29sdW1ucHJvcGVydHkpIHsKLQkJZmluYWwgSUNlbGxNb2RpZmllciBtb2RpZmllciA9IGdldENlbGxNb2RpZmllcigpOwotCQlPYmplY3QgZWxlbWVudCA9IGl0ZW0uZ2V0RGF0YSgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0vLwkJaWYgKGNvbHVtbnByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORwotLy8JCQkJfHwgY29sdW1ucHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFCi0vLwkJCQl8fCBjb2x1bW5wcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTikgewotLy8JCQlpZiAoIShUbmdVdGlsLnVud3JhcChlbGVtZW50KSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSkgewotLy8JCQkJcmV0dXJuIG51bGw7Ci0vLwkJCX0KLS8vCQl9Ci0JCU9iamVjdCB2YWx1ZSA9IG1vZGlmaWVyLmdldFZhbHVlKGVsZW1lbnQsIGNvbHVtbnByb3BlcnR5KTsKLQkJaWYgKHZhbHVlID09IG51bGwgfHwgISh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pKQotCQkJcmV0dXJuIG51bGw7Ci0JCWJvb2xlYW4gY2FuTW9kaWZ5ID0gbW9kaWZpZXIuY2FuTW9kaWZ5KGVsZW1lbnQsIGNvbHVtbnByb3BlcnR5KTsKLQotCQlpZiAoKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCXJldHVybiBjYW5Nb2RpZnkgPyBjaGVja0ltYWdlIDogZGlzYWJsZUNoZWNrSW1hZ2U7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gY2FuTW9kaWZ5ID8gdW5jaGVja0ltYWdlIDogZGlzYWJsZVVuY2hlY2tJbWFnZTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2VsbGVkaXRvcnMuQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3IjbW9kaWZ5KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeShUcmVlSXRlbSBpdGVtLCBTdHJpbmcgY29sdW1ucHJvcGVydHkpIHsKLQkJZmluYWwgSUNlbGxNb2RpZmllciBtb2RpZmllciA9IGdldENlbGxNb2RpZmllcigpOwotCQlpZiAoIW1vZGlmaWVyLmNhbk1vZGlmeShpdGVtLmdldERhdGEoKSwgY29sdW1ucHJvcGVydHkpKQotCQkJcmV0dXJuOwotCQltb2RpZmllci5tb2RpZnkoaXRlbSwgY29sdW1ucHJvcGVydHksIG5ldyBCb29sZWFuKCEoKEJvb2xlYW4pIG1vZGlmaWVyCi0JCQkJLmdldFZhbHVlKGl0ZW0uZ2V0RGF0YSgpLCBjb2x1bW5wcm9wZXJ0eSkpLmJvb2xlYW5WYWx1ZSgpKSk7Ci0JfQotCi0JLyoKLQkgKiA9PT09PT09aW4gZmFjdCBiZWxvdyBjb2RlcyBhcmUgZm9yIHRoZSBkeW5hbWljIGNlbGwgZWRpdG9yIChyZWFsIGNvbnRyb2wKLQkgKiAiYnV0dG9uIik9PT09PQotCSAqLwotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2VsbGVkaXRvcnMuQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3IjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRyb2woVHJlZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlidXR0b24ucGFjaygpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2VsbGVkaXRvcnMuQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3IjaG9va0NvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCwgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW0sIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaG9va0NvbnRyb2woQ29udHJvbCBjb250cm9sLCBUcmVlSXRlbSBpdGVtLAotCQkJZmluYWwgU3RyaW5nIGNvbHVtbnByb3BlcnR5KSB7Ci0JCWZpbmFsIElDZWxsTW9kaWZpZXIgbW9kaWZpZXIgPSBnZXRDZWxsTW9kaWZpZXIoKTsKLQkJZmluYWwgT2JqZWN0IGVsZW1lbnQgPSBpdGVtOwotCQlmaW5hbCBCdXR0b24gY2hlY2tib3ggPSAoQnV0dG9uKSBjb250cm9sOwotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCWNoZWNrYm94LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQltb2RpZmllci5tb2RpZnkoZWxlbWVudCwgY29sdW1ucHJvcGVydHksIG5ldyBCb29sZWFuKGNoZWNrYm94Ci0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpKTsKLQkJCX0KLQkJfTsKLQkJY2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jaGVhdHNoZWV0cy9hY3Rpb25zL0NoZWF0c2hlZXRTd2l0Y2hKb2IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jaGVhdHNoZWV0cy9hY3Rpb25zL0NoZWF0c2hlZXRTd2l0Y2hKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODYxOThmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9DaGVhdHNoZWV0U3dpdGNoSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNoZWF0c2hlZXRzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLk9wZW5DaGVhdFNoZWV0QWN0aW9uOwotCi0vKioKLSAqIFN3aXRjaHMgY2hlYXQgc2hlZXQgYW5kIG9wZW5zIGl0LgotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGVhdHNoZWV0U3dpdGNoSm9iIGV4dGVuZHMgSm9iIHsKLQlwcml2YXRlIFN0cmluZyBjaGVhdHNoZWV0SWQ7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugd2l0aCBjaGVhdCBzaGVldCBuYW1lIGFuZCBJZAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIGNoZWF0c2hlZXRJZAotCSAqLwotCXB1YmxpYyBDaGVhdHNoZWV0U3dpdGNoSm9iKFN0cmluZyBuYW1lLCBTdHJpbmcgY2hlYXRzaGVldElkKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQl0aGlzLmNoZWF0c2hlZXRJZCA9IGNoZWF0c2hlZXRJZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCW5ldyBPcGVuQ2hlYXRTaGVldEFjdGlvbihjaGVhdHNoZWV0SWQpLnJ1bigpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvQ3JlYXRlUGx1Z2luQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9DcmVhdGVQbHVnaW5BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzY3ODc4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9DcmVhdGVQbHVnaW5BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2hlYXRzaGVldHMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5OZXdQbHVnaW5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLklDaGVhdFNoZWV0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLklDaGVhdFNoZWV0TWFuYWdlcjsKLQotLyoqCi0gKiBDcmVhdGUgTWV0aG9kIFBsdWctaW4gY2hlYXQgc2hlZXQgYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZVBsdWdpbkFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElDaGVhdFNoZWV0QWN0aW9uIHsKLQotCS8qKgotCSAqIEBzZWUgSUNoZWF0U2hlZXRBY3Rpb24jcnVuKFN0cmluZ1tdLCBJQ2hlYXRTaGVldE1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKFN0cmluZ1tdIHBhcmFtcywgSUNoZWF0U2hlZXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJTmV3UGx1Z2luQWN0aW9uLmV4ZWN1dGUoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgbnVsbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9Td2l0Y2hDaGVhdHNoZWV0VG8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jaGVhdHNoZWV0cy9hY3Rpb25zL1N3aXRjaENoZWF0c2hlZXRUby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNDEzNWViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jaGVhdHNoZWV0cy9hY3Rpb25zL1N3aXRjaENoZWF0c2hlZXRUby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jaGVhdHNoZWV0cy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5JQ2hlYXRTaGVldEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5JQ2hlYXRTaGVldE1hbmFnZXI7Ci0KLS8qKgotICogQ3JlYXRlIHN3aXRjaCBjaGVhdCBzaGVldCBhY3Rpb24KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3dpdGNoQ2hlYXRzaGVldFRvIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSUNoZWF0U2hlZXRBY3Rpb24gewotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5JQ2hlYXRTaGVldEFjdGlvbiNydW4oamF2YS5sYW5nLlN0cmluZ1tdLCBvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5JQ2hlYXRTaGVldE1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKFN0cmluZ1tdIHBhcmFtcywgSUNoZWF0U2hlZXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQotCQlpZiAocGFyYW1zLmxlbmd0aCA8PSAwKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBjc19pZCA9IHBhcmFtc1swXTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBERUJVRzogaW4gU3dpdGNoQ2hlYXRzaGVldFRvLnJ1biguLi4pIGNzX0lEID0KLQkJLy8gIiArIGNzX2lkKTsgLy8kTk9OLU5MUy0xJAotCi0JCUNoZWF0c2hlZXRTd2l0Y2hKb2Igc3dpdGNoSm9iID0gbmV3IENoZWF0c2hlZXRTd2l0Y2hKb2IoCi0JCQkJIlN3aXRjaCBDaGVhdHNoZWV0IiwgY3NfaWQpOyAvLyROT04tTkxTLTEkCi0JCXN3aXRjaEpvYi5zY2hlZHVsZSg1MCk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcyZTlhZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgYWN0aW9ucyBmb3IgdGhlIEF1dGhvcmluZyBjaGVhdHNoZWV0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9BRERJbmZvRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9BRERJbmZvRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0NDA4YzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQURESW5mb0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRXhQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5BdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JUHJvY2Vzc0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKiBGaWx0ZXIgRGlhbG9nIC0gYWxsb3cgdGhlIHVzZXIgdG8gZmlsdGVyIHRoZSBjb250ZW50IGVsZW1lbnQsIGNvbnRlbnQKLSAqIGNhdGVnb3JpZXMsIGN1c3RvbSBjYXRlZ29yaWVzLCBBbGwgdHlwZXMgb2YgY29udGVudGVsZW1lbnRzIGJhc2VkIG9uIGxvY2F0aW9uIG9mIHRoZSB1c2Ugb2YgdGhlIGZpbHRlcgotICogZGlhbG9nLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIEFEREluZm9EaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cwotCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLCBJRG91YmxlQ2xpY2tMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uLCBjYW5jZWxCdXR0b247Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjdHJsX2JyaWVmX2Rlc2M7Ci0KLQkvL3ByaXZhdGUgU3RyaW5nIHBhdHRlcm4sIGZpbHRlclR5cGVTdHI7Ci0KLQkvL3Byb3RlY3RlZCBDb21ibyBmaWx0ZXJUeXBlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZGlhbG9nVGl0bGUsIHRhYlN0cjsKLQotCXByaXZhdGUgT2JqZWN0IGNvbnRlbnRFbGVtZW50OwotCi0JcHJpdmF0ZSBBcnJheUxpc3Qgc2VsZWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIHZpZXdlclNlbGVjdGlvblNpbmdsZSA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIHZpZXdlckxhYmVsID0gbnVsbDsKLQkKLQkvKgotCSAqIFRyZWV2aWV3ZXIgZm9yIENvbnRlbnRFbGVtZW50cyB0byBkaXNwbGF5LgotCSAqLwotCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkJLy8gcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbCgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QsICIiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0JcHJpdmF0ZSBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci0KLQkvKgotCSAqIERpYWxvZyBBdHRyaWJ1dGVzCi0JICovCi0JLy8gcHJpdmF0ZSBib29sZWFuIGFueUNoaWxkcyA9IHRydWU7Ci0JcHJpdmF0ZSBMaXN0IGFscmVhZHlTZWxlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JUGF0dGVybiByZWdleFBhdHRlcm47Ci0KLQkvLyBwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQlwcm90ZWN0ZWQgRmlsdGVySGVscGVyIGhlbHBlcjsKLQotCXByaXZhdGUgQnV0dG9uIGV4cGFuZEJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGNvbGxhcHNlQnV0dG9uOwotCi0JcHJpdmF0ZSBPYmplY3QgaW5wdXQ7Ci0KLQkvL3ByaXZhdGUgU3RyaW5nW10gdHlwZXM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbHRlckRpYWxvZy4gVGhpcyBjb25zdHJ1Y3RvciB3aWxsIHVzZSBmaWx0ZXIgYmFzZWQgb24KLQkgKiB0YWJTdHIsIGZpbHRlcnMgb3V0IHRoZSBsaXN0IG9mIGVsZW1lbnRzIGJhc2VkIG9uIGFscmVhZHkgZXhpc3RpbmcKLQkgKiBzZWxlY3RlZCBlbGVtZW50IGluIHRoZSBzZWxlY3RlZCB0YWJsZS4gSW5pdGlhbGl6ZXMgdGhlIENvbnRlbnRQcm92aWRlcgotCSAqIGZvciB0aGUgdHJlZXZpZXdlci4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgQURESW5mb0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgT2JqZWN0IGNvbnRlbnRFbGVtZW50LAotCQkJU3RyaW5nIHRhYlN0ciwgTGlzdCBhbHJlYWR5RXhpc3RzKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCQl0aGlzLnRhYlN0ciA9IHRhYlN0cjsKLQkJdGhpcy5maWx0ZXIgPSBudWxsOwotCQl0aGlzLmFscmVhZHlTZWxlY3RlZExpc3QgPSBhbHJlYWR5RXhpc3RzOwotCQloZWxwZXIgPSBuZXcgRmlsdGVySGVscGVyKGNvbnRlbnRFbGVtZW50LCB0YWJTdHIsIG51bGwsIG51bGwsCi0JCQkJdGhpcy5hbHJlYWR5U2VsZWN0ZWRMaXN0KTsKLQkJaW5pdFByb3ZpZGVyRm9yVGFicygpOwotCX0KLQotCXB1YmxpYyBBRERJbmZvRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJRmlsdGVyIGZpbHRlciwgU3RyaW5nIHRhYlN0ciwKLQkJCUxpc3QgYWxyZWFkeUV4aXN0cywgT2JqZWN0IGlucHV0KSB7Ci0JCXRoaXMocGFyZW50U2hlbGwsIGZpbHRlciwgbnVsbCwgdGFiU3RyLCBhbHJlYWR5RXhpc3RzKTsKLQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRmlsdGVyRGlhbG9nLiBUaGlzIGNvbnN0cnVjdG9yIHdpbGwgdXNlIHBhc3NlZCBmaWx0ZXIuCi0JICogdGFiU3RyIGlzIHVzZWQgZm9yIHRoZSBzZWFyY2h0eXBlIG9ubHkuIEluaXRpYWxpemVzIHRoZSBDb250ZW50UHJvdmlkZXIKLQkgKiBmb3IgdGhlIHRyZWV2aWV3ZXIuCi0JICogCi0JICovCi0JcHVibGljIEFEREluZm9EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElGaWx0ZXIgZmlsdGVyLAotCQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50LCBTdHJpbmcgdGFiU3RyKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCXRoaXMudGFiU3RyID0gdGFiU3RyOwotCi0JCWhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIoY29udGVudEVsZW1lbnQsIHRhYlN0ciwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JCWluaXRQcm92aWRlckZvclRhYnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbHRlckRpYWxvZy4gVGhpcyBjb25zdHJ1Y3RvciB3aWxsIHVzZSBwYXNzZWQgZmlsdGVyLgotCSAqIHRhYlN0ciBpcyB1c2VkIGZvciB0aGUgc2VhcmNodHlwZSBvbmx5LiBJbml0aWFsaXplcyB0aGUgQ29udGVudFByb3ZpZGVyCi0JICogZm9yIHRoZSB0cmVldmlld2VyLgotCSAqIAotCSAqLwotCXB1YmxpYyBBRERJbmZvRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJRmlsdGVyIGZpbHRlciwKLQkJCU9iamVjdCBjb250ZW50RWxlbWVudCwgU3RyaW5nIHRhYlN0ciwgTGlzdCBhbHJlYWR5RXhpc3RzKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCXRoaXMudGFiU3RyID0gdGFiU3RyOwotCQl0aGlzLmFscmVhZHlTZWxlY3RlZExpc3QgPSBhbHJlYWR5RXhpc3RzOwotCQloZWxwZXIgPSBuZXcgRmlsdGVySGVscGVyKGNvbnRlbnRFbGVtZW50LCB0YWJTdHIsIG51bGwsIG51bGwsCi0JCQkJYWxyZWFkeUV4aXN0cyk7Ci0JCXRoaXMuY29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQkJaW5pdFByb3ZpZGVyRm9yVGFicygpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRmlsdGVyRGlhbG9nLiBPbmx5IGZvciBtZXRob2Rjb25maWd1cmF0aW9uLiBUaGlzCi0JICogY29uc3RydWN0b3Igd2lsbCB1c2UgcGFzc2VkIGZpbHRlci4gSW5pdGlhbGl6ZXMgdGhlIENvbnRlbnRQcm92aWRlciBmb3IKLQkgKiB0aGUgdHJlZXZpZXdlci4KLQkgKiAKLQkgKi8KLQkvLyBwdWJsaWMgSXRlbXNGaWx0ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIE9iamVjdCBjb250ZW50RWxlbWVudCwKLQkvLyBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZ3VyYXRpb24sIFN0cmluZyB0YWJTdHIpIHsKLQkvLyBzdXBlcihwYXJlbnRTaGVsbCk7Ci0JLy8gdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCS8vIHRoaXMudGFiU3RyID0gdGFiU3RyOwotCS8vIHRoaXMuZmlsdGVyID0gbnVsbDsKLQkvLyB0aGlzLm1ldGhvZENvbmZpZ3VyYXRpb24gPSBtZXRob2RDb25maWd1cmF0aW9uOwotCS8vIGhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIoY29udGVudEVsZW1lbnQsIHRhYlN0ciwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JLy8gaW5pdFByb3ZpZGVyRm9yVGFicygpOwotCS8vIH0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHZlcnkgZ2VuZXJpYywgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSBmaWx0ZXIsIGlucHV0Ci0JICogYW5kIGNvbnRlbnRwcm92aWRlciBzaG91bGQgYmUgaGFuZGxlZCBleHBsaWNpdGx5IGJ5IGNhbGxpbmcgYmVsb3cgbWV0aG9kLgotCSAqIHNldEZpbHRlcihJRmlsdGVyKSBzZXRJbnB1dChPYmplY3QpCi0JICogc2V0Q29udGVudFByb3ZpZGVyKElTdHJ1Y3R1cmVkUHJvdmlkZXIpCi0JICogCi0JICovCi0JcHVibGljIEFEREluZm9EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQloZWxwZXIgPSBuZXcgRmlsdGVySGVscGVyKG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpZiBhIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKQotCQkJc2F2ZVZhbHVlcygpOwotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQkJaWYoY29tcG9zZWRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKXsKLQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0JCWNsb3NlKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlVmFsdWVzKCl7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdHJlZVZpZXdlcgotCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJT2JqZWN0W10gb2JqZWN0QXJyID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0QXJyLmxlbmd0aDsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChvYmplY3RBcnJbaV0pOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlzZWxlY3RlZExpc3QuYWRkKG9iaik7Ci0JCQkJfSAKLQkJCX0KLQkJfQotCX0KLQkJCi0JLyoqCi0JICogTm90aWZpZXMgdGhhdCB0aGUgY2FuY2VsIGJ1dHRvbiBvZiB0aGlzIGRpYWxvZyBoYXMgYmVlbiBwcmVzc2VkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQoKSB7Ci0JCWlmKGNvbXBvc2VkQWRhcHRlckZhY3RvcnkgIT0gbnVsbCl7Ci0JCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5jYW5jZWxQcmVzc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRpdGxlIGZvciBkaWFsb2cgYm94IGVnOiBTZWxlY3QgRGlhbG9nIEZvciBSb2xlLCBkaWFsb2dUaXRsZSBuZWVkcyB0bwotCSAqICJSb2xlIgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpdGxlKFN0cmluZyBkaWFsb2dUaXRsZSkgewotCQl0aGlzLmRpYWxvZ1RpdGxlID0gZGlhbG9nVGl0bGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJaWYgKGRpYWxvZ1RpdGxlID09IG51bGwpCi0JCQlkaWFsb2dUaXRsZSA9IHRhYlN0cjsKLQkJc2hlbGwuc2V0VGV4dCgiQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gSW5mbzogIiArIGRpYWxvZ1RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIChub24tSmF2YWRvYykgQWRkcyBidXR0b25zIHRvIHRoaXMgZGlhbG9nJ3MgYnV0dG9uIGJhci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgYnV0dG9uIGJhciBjb21wb3NpdGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBkaWFsb2cgYXJlYSBhbmQgY29udHJvbHMgYW5kIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdGhlCi0JICogICAgICAgICAgICBwYXJlbnQgY29tcG9zaXRlIHRvIGNvbnRhaW4gdGhlIGRpYWxvZyBhcmVhCi0JICogQHJldHVybiB0aGUgZGlhbG9nIGFyZWEgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLQkJLy9HcmlkRGF0YSBnRCA9IChHcmlkRGF0YSkgY29tcG9zaXRlLmdldExheW91dERhdGEoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCi0JCUxhYmVsIHR5cGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJewotCQkJdHlwZUxhYmVsLnNldFRleHQoIlNlbGVjdCB0aGUgYWN0aXZpdHkgdG8gbW9kaWZ5IEFERCIpOyAvLyROT04tTkxTLTEkCi0JCQlHcmlkRGF0YSBnRDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCXR5cGVMYWJlbC5zZXRMYXlvdXREYXRhKGdEMSk7Ci0KLQkJfQotLy8JCWZpbHRlclR5cGUgPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0vLwkJewotLy8JCQlHcmlkRGF0YSBnRDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLS8vCQkJZ0QxLmhvcml6b250YWxTcGFuID0gMjsKLS8vCQkJZ0QxLndpZHRoSGludCA9IDM5MDsKLS8vCQkJZmlsdGVyVHlwZS5zZXRMYXlvdXREYXRhKGdEMSk7Ci0vLwkJfQotLy8KLS8vCQlpZiAodHlwZXMgPT0gbnVsbCkgewotLy8JCQlmaWxsRmlsdGVyVHlwZUNvbWJvKCk7Ci0vLwkJfSBlbHNlIHsKLS8vCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyh0eXBlcyk7Ci0vLwkJCWlmIChoZWxwZXIgIT0gbnVsbCkgewotLy8JCQkJZmlsdGVyVHlwZVN0ciA9IGZpbHRlclR5cGUuZ2V0SXRlbSgwKTsKLS8vCQkJCWhlbHBlci5zZXRGaWx0ZXJUeXBlU3RyKGZpbHRlclR5cGUuZ2V0SXRlbSgwKSk7Ci0vLwkJCQlpZiAodGFiU3RyID09IG51bGwpIHsKLS8vCQkJCQl0YWJTdHIgPSBmaWx0ZXJUeXBlU3RyOwotLy8JCQkJCWhlbHBlci5zZXRUYWJTdHIodGFiU3RyKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCQlmaWx0ZXJUeXBlLnNlbGVjdCgwKTsKLQotLy8JCUxhYmVsIGN0cmxfcGF0dGVybkxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotLy8JCXsKLS8vCQkJY3RybF9wYXR0ZXJuTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfUGF0dGVybl90ZXh0KTsgLy8kTk9OLU5MUy0xJAotLy8JCQlnRC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0vLwkJCWN0cmxfcGF0dGVybkxhYmVsLnNldExheW91dERhdGEoZ0QpOwotLy8JCX0KLQotLy8JCWN0cmxfcGF0dGVybiA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0vLwkJewotLy8JCQlHcmlkRGF0YSBnRDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLS8vCQkJZ0QxLmhvcml6b250YWxTcGFuID0gMzsKLS8vCQkJY3RybF9wYXR0ZXJuLnNldExheW91dERhdGEoZ0QxKTsKLS8vCQkJY3RybF9wYXR0ZXJuLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIoCi0vLwkJCQkJbmV3IEF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcigKLS8vCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQgKyAgCi0vLwkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfUGF0dGVybl9kZXNjcmlwdGlvbikpOwotLy8JCX0KLS8vCQlMYWJlbCBjdHJsX3BhdHRlcm5MYWJlbDEgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0vLwkJewotLy8JCQljdHJsX3BhdHRlcm5MYWJlbDEuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfUGF0dGVybl9kZXNjcmlwdGlvbik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJY3RybF9wYXR0ZXJuTGFiZWwxLnNldExheW91dERhdGEoZ0QpOwotLy8JCX0KLQkJCi0JCUNvbXBvc2l0ZSBidXR0b25zQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsJCQotCQkKLQkJR3JpZERhdGEgZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWdkMi5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWJ1dHRvbnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZDIpOwotCQlHcmlkTGF5b3V0IGJ1dHRvbnNMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlidXR0b25zTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlidXR0b25zTGF5b3V0Lm1hcmdpblJpZ2h0ID0gMDsKLQkJYnV0dG9uc0NvbXBvc2l0ZS5zZXRMYXlvdXQoYnV0dG9uc0xheW91dCk7Ci0JCQotCQlleHBhbmRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNDb21wb3NpdGUsIFNXVC5CVVRUT04xKTsKLQotCQlleHBhbmRCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJleHBhbmRhbGwuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWV4cGFuZEJ1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfRXhwYW5kQWxsKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJZXhwYW5kQnV0dG9uLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcigKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19FeHBhbmRBbGwpKTsJCQotCi0JCWdkMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORwotCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQotCQlleHBhbmRCdXR0b24uc2V0TGF5b3V0RGF0YShnZDIpOwotCi0JCWNvbGxhcHNlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWNvbGxhcHNlQnV0dG9uLnNldEltYWdlKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkiY29sbGFwc2VhbGwuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0KLQkJY29sbGFwc2VCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsKTsgLy8kTk9OLU5MUy0xJAotCQljb2xsYXBzZUJ1dHRvbi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsKSk7Ci0JCQotCQlnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCi0JCWNvbGxhcHNlQnV0dG9uLnNldExheW91dERhdGEoZ2QyKTsKLQkJCi0JCWNyZWF0ZUxpbmUoY29tcG9zaXRlLCAzKTsKLQkJY3JlYXRlVmlld2VyTGFiZWwoY29tcG9zaXRlKTsKLQkJLy8gY3JlYXRlIGEgdHJlZXZpZXdlciBhcmVhLgotCQljcmVhdGVWaWV3ZXIoY29tcG9zaXRlKTsKLQotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2JyaWVmX2Rlc2MgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULlJFQURfT05MWSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQlnZC5oZWlnaHRIaW50ID0gNjA7Ci0JCQljdHJsX2JyaWVmX2Rlc2Muc2V0TGF5b3V0RGF0YShnZCk7Ci0JCX0KLQkJLy8gUmVzdG9yZSB0aGUgbGFzdCBzdGF0ZQotCQljcmVhdGVMaW5lKGNvbXBvc2l0ZSwgMyk7Ci0KLQkJLy8gUmV0dXJuIHJlc3VsdHMuCi0JCWFkZExpc3RlbmVyKCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGNyZWF0ZURpYWxvZ0FyZWEuZmlsdGVyVHlwZVN0ciA9ICIgKwotCQkvLyBmaWx0ZXJUeXBlU3RyKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgdmlld2VyIGluIHRoZSBwYXJlbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAodmlld2VyU2VsZWN0aW9uU2luZ2xlKSB7Ci0JCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMCi0JCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCX0gZWxzZSB7Ci0JCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwKLQkJCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJfQotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJdHJlZVZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBQaG9uZzogdGhpcyBpcyB0b28gbWVzc3kuIElmIHlvdSByZWxpZXMgb24gdGhlIGNvbnRlbnRFbGVtZW50IHRvCi0JCQkvLyBkZXRlcm1pbmUgdGhlIGlucHV0IGZvciB0aGUgdmlld2VyCi0JCQkvLyB0aGVuIHlvdSBzaG91bGQgZGVjbGFyZSBhIGlucHV0IGZpZWxkIGluc3RlYWQgYW5kIG1vdmUgdGhpcyBjb2RlCi0JCQkvLyB0byBjb25zdHJ1Y3RvcgotCQkJLy8KLQkJCS8vIHNvcnRlciBuZWVkcyBvciBub3QuIFRPRE8KLQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCQkJaWYgKCgoUHJvY2VzcykgY29udGVudEVsZW1lbnQpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCQlpZiAodGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0UpCi0JCQkJCQkJCQl8fCB0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ST0FETUFQKSAKLQkJCQkJCQkJCXx8IHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTKSkgewotCQkJCQkJCQl0cmVlVmlld2VyCi0JCQkJCQkJCQkJLnNldElucHV0KFVtYVV0aWwKLQkJCQkJCQkJCQkJCS5nZXRNZXRob2RMaWJyYXJ5KChFT2JqZWN0KSBjb250ZW50RWxlbWVudCkpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXRyZWVWaWV3ZXIuc2V0SW5wdXQoKChQcm9jZXNzKSBjb250ZW50RWxlbWVudCkKLQkJCQkJCQkJCQkuZUNvbnRhaW5lcigpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UKLQkJCQkJCQl0cmVlVmlld2VyLnNldElucHV0KGNvbnRlbnRFbGVtZW50KTsKLQkJCQkJfSBlbHNlCi0JCQkJCQl0cmVlVmlld2VyLnNldElucHV0KFVtYVV0aWwKLQkJCQkJCQkJLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGNvbnRlbnRFbGVtZW50KSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdHJlZVZpZXdlci5zZXRJbnB1dChVbWFVdGlsCi0JCQkJCQkJLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGNvbnRlbnRFbGVtZW50KSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0cmVlVmlld2VyCi0JCQkJCQkuc2V0SW5wdXQoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJCX0KLQkJfQotCi0JCXRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQl0cmVlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIodGhpcyk7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLQkJaWYgKHRhYlN0ci5lcXVhbHNJZ25vcmVDYXNlKEZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFMpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRyZWVWaWV3ZXIuc2V0U29ydGVyKG5ldyBGaWx0ZXJTb3J0ZXJGb3JBbGwoKSk7Ci0JCX0gZWxzZSB7Ci0JCQl0cmVlVmlld2VyLnNldFNvcnRlcihuZXcgRmlsdGVyU29ydGVyKCkpOwotCQl9Ci0KLQkJLy8gdHJlZVZpZXdlci5leHBhbmRUb0xldmVsKDMpOwotCQkvLyB0cmVlVmlld2VyLmV4cGFuZEFsbCgpOwotCi0JCUdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJewotCQkJc3BlYy53aWR0aEhpbnQgPSAzMDA7Ci0JCQlzcGVjLmhlaWdodEhpbnQgPSAzMDA7Ci0JCQlzcGVjLmhvcml6b250YWxTcGFuID0gMzsKLQkJCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoc3BlYyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTGluZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbmNvbCkgewotCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMCi0JCQkJfCBTV1QuQk9MRCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbmNvbDsKLQkJbGluZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVmlld2VyTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgCQlpZiAodmlld2VyTGFiZWwgIT0gbnVsbCkgewotICAgCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KHZpZXdlckxhYmVsKTsKLSAgIAkJfQotICAgCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUoYm9vbGVhbiBzaW5nbGUpIHsKLQkJdmlld2VyU2VsZWN0aW9uU2luZ2xlID0gc2luZ2xlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lciNkb3VibGVDbGljayhvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBzLmdldEZpcnN0RWxlbWVudCgpOwotCQllbGVtZW50ID0gTGlicmFyeVV0aWwudW53cmFwKGVsZW1lbnQpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQlzZWxlY3RlZExpc3QuYWRkKGVsZW1lbnQpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlzZWxlY3RlZExpc3QuYWRkKGVsZW1lbnQpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkvLyBpZighKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpCi0JCQlzZWxlY3RlZExpc3QuYWRkKGVsZW1lbnQpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJLy8gaWYoIShlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKQotCQkJc2VsZWN0ZWRMaXN0LmFkZChlbGVtZW50KTsKLQkJfQotCQljbG9zZSgpOwotCQlpZihjb21wb3NlZEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpewotCQkJY29tcG9zZWRBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0cmF2ZXJzZVRyZWUoVHJlZUl0ZW1bXSBpdGVtcywgTGlzdCBsaXN0KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVRyZWVJdGVtW10gaXRlbXN4ID0gaXRlbXNbaV0uZ2V0SXRlbXMoKTsKLQkJCWlmIChpdGVtc3gubGVuZ3RoID4gMSkgewotCQkJCWxpc3QuYWRkKGl0ZW1zW2ldLmdldERhdGEoKSk7Ci0JCQkJdHJhdmVyc2VUcmVlKGl0ZW1zeCwgbGlzdCk7Ci0JCQl9IGVsc2UgewotCQkJCWxpc3QuYWRkKGl0ZW1zW2ldLmdldERhdGEoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkKLQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhhdCB0aGUgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgZXZlbnQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGNoYW5nZQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCXVwZGF0ZVNlbGVjdGlvbihldmVudCk7Ci0JCXVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIGJ1dHRvbiBlbmFibGVtZW50IHN0YXRlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJ1dHRvbnMoKSB7Ci0JCS8vIG9rQnV0dG9uLnNldEVuYWJsZWQoZ2V0U2VsZWN0aW9uKCkubGVuZ3RoID4gMCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnRPYmplY3QoT2JqZWN0IGNvbnRlbnRFbGVtZW50KSB7Ci0JCXJldHVybiBNZXRob2RFbGVtZW50VXRpbC5nZXRNZXRob2RNb2RlbChjb250ZW50RWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBzZWxlY3Rpb24gb2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNlbGVjdGlvbihTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJLy8gQXJyYXlMaXN0IGRlc2NzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQlPYmplY3Qgc2VsZWN0ZWQgPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHx8Ci0JCQkJc2VsZWN0ZWQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyKXsKLQkJCU9iamVjdCB1bndyYXAgPSAgVG5nVXRpbC51bndyYXAoc2VsZWN0ZWQpOwotCQkJc2V0QnJpZWZEZXNjcmlwdGlvbih1bndyYXApOwotCQl9ZWxzZSB7Ci0JCQlzZXRCcmllZkRlc2NyaXB0aW9uKHNlbGVjdGVkKTsKLQkJfQotCX0KLQkvKioKLQkgKiBTZXQgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIHRvIGNvbnRyb2wKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0QnJpZWZEZXNjcmlwdGlvbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCVN0cmluZyBkZXNjID0gKChNZXRob2RFbGVtZW50KSBlbGVtZW50KS5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoZGVzYyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkKLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKCkgewotCi0JCWV4cGFuZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0cmVlVmlld2VyLmV4cGFuZEFsbCgpOwotCi0JCQl9Ci0JCX0pOwotCQljb2xsYXBzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0cmVlVmlld2VyLmNvbGxhcHNlQWxsKCk7Ci0KLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQlwdWJsaWMgQXJyYXlMaXN0IGdldFNlbGVjdGVkSXRlbXMoKSB7Ci0JCXJldHVybiBzZWxlY3RlZExpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRQcm92aWRlckZvclRhYnMoKSB7Ci0KLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQlpZiAoZmlsdGVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JRmlsdGVyKSB7Ci0JCQkJaWYoZmlsdGVyIGluc3RhbmNlb2YgSUNhdGVnb3J5RmlsdGVyKXsKLQkJCQkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IgY29udGVudGNhdGVnb3J5LgotCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3NDUyCi0JCQkJCWhlbHBlci5zZXRDb250ZW50Q2F0ZWdvcnlUYWJTdHIodGFiU3RyKTsKLQkJCQl9Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklGaWx0ZXIpIGZpbHRlcikKLQkJCQkJCS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX0gZWxzZSBpZiAoZmlsdGVyIGluc3RhbmNlb2YgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIpIHsKLQkJCQkoKERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyKSBmaWx0ZXIpLnNldEhlbHBlcihoZWxwZXIpOwotCQkJfWVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIEV4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcikgewotCQkJCSgoRXhQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yKSBmaWx0ZXIpLnNldEhlbHBlcihoZWxwZXIpOwotCQkJfQotCQl9Ci0JCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJUHJvY2Vzc0ZpbHRlcikgewotCQkJaWYgKHRhYlN0cgotCQkJCQkuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JTKSkgewotCQkJCWFkYXB0ZXJGYWN0b3J5ID1UbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKTsKLQkJCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJY29tcG9zZWRBZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQl9IGVsc2UgaWYgKHRhYlN0cgotCQkJCQkuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuUk9MRV9ERVNDUklQVE9SUykpIHsKLQkJCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpOyAKLQkJCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpOwotCQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcik7IAotCQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRJdGVtc0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeGlzdGluZ0VsZW1lbnRzKExpc3QgbGlzdCkgewotCQl0aGlzLmFscmVhZHlTZWxlY3RlZExpc3QgPSBsaXN0OwotCQlpZiAoaGVscGVyICE9IG51bGwpIHsKLQkJCWhlbHBlci5zZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KGxpc3QpOwotCQl9Ci0JfQotCi0JcHVibGljIEZpbHRlckhlbHBlciBnZXRIZWxwZXIoKSB7Ci0JCXJldHVybiB0aGlzLmhlbHBlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RmlsdGVyVHlwZUFycmF5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIHNldHMgdGhlIENvbnRlbnRQcm92aWRlciB1c2VkIGJ5IFRyZWVWaWV3ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudFByb3ZpZGVyKElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciwKLQkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgY29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQl0aGlzLmNvbnRlbnRQcm92aWRlciA9IGNvbnRlbnRQcm92aWRlcjsKLQkJdGhpcy5jb21wb3NlZEFkYXB0ZXJGYWN0b3J5ID0gY29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKgotCSAqIHNldCB0aGUgRmlsdGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5maWx0ZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklGaWx0ZXIpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUZpbHRlcikgdGhpcy5maWx0ZXIpCi0JCQkJCQkuc2V0SGVscGVyKGhlbHBlcik7Ci0JCQl9IGVsc2UgaWYgKHRoaXMuZmlsdGVyIGluc3RhbmNlb2YgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIpIHsKLQkJCQkoKERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyKSB0aGlzLmZpbHRlcikuc2V0SGVscGVyKGhlbHBlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpIHsKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCXRoaXMuaW5wdXQgPSBpbnB1dDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpZXdlckxhYmVsKFN0cmluZyB2aWV3ZXJMYWJlbCkgewotCQl0aGlzLnZpZXdlckxhYmVsID0gdmlld2VyTGFiZWw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0F0dGFjaG1lbnREaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0F0dGFjaG1lbnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDQ0ZGYyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9BdHRhY2htZW50RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBPcGVucyBkaWFsb2cgdG8gYXR0YWNoIGF0dGFjaG1lbnRzCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXR0YWNobWVudERpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQkvKioKLQkgKiBUaGUgT0sgYnV0dG9uLgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0KLQkvKioKLQkgKiBUaGUgQ2FuY2VsIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGNhbmNlbEJ1dHRvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQotCXByaXZhdGUgVGV4dCBhdHRhY2htZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgQXR0YWNobWVudERpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIERpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIGRpYWxvZ0FyZWEuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSAoR3JpZERhdGEpIGRpYWxvZ0FyZWEuZ2V0TGF5b3V0RGF0YSgpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IDEwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0KLQkJTGFiZWwgdXJsTGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQl1cmxMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkF0dGFjaG1lbnREaWFsb2dGaWxlVVJMX3RleHQpOyAvLyROT04tTkxTLTEkCi0JCWF0dGFjaG1lbnQgPSBuZXcgVGV4dChkaWFsb2dBcmVhLCBTV1QuQk9SREVSKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQlhdHRhY2htZW50LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlhdHRhY2htZW50LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChva0J1dHRvbiAhPSBudWxsKSB7Ci0JCQkJCW9rQnV0dG9uCi0JCQkJCQkJLnNldEVuYWJsZWQoYXR0YWNobWVudC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlCdXR0b24gYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5CUk9XU0VfQlVUVE9OX1RFWFQpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk9QRU4pOwotCQkJCVN0cmluZyBpbWFnZUZpbGUgPSBkaWFsb2cub3BlbigpOwotCQkJCWlmIChpbWFnZUZpbGUgIT0gbnVsbCAmJiBpbWFnZUZpbGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGltYWdlRmlsZSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgdXJsID0gZmlsZS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQkJCQlhdHRhY2htZW50LnNldFRleHQodXJsKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJc3VwZXIKLQkJCQkuZ2V0U2hlbGwoKQotCQkJCS5zZXRUZXh0KAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXR0YWNobWVudERpYWxvZ2F0dGFjaEZpbGVfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRpYWxvZyBidXR0b25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIE9LIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLQkJCQl0cnVlKTsKLQotCQkvLyBDcmVhdGUgdGhlIENhbmNlbCBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0KLQkJLy8gU2V0IGhlbHAgY29udGV4dCBmb3IgdGhlIE9LIGJ1dHRvbi4KLQkJb2tCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0KLQkJLy8gU2V0IGhlbHAgY29udGV4dCBmb3IgdGhlIENhbmNlbCBidXR0b24uCi0JCWNhbmNlbEJ1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCk7Ci0KLQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCS8vIFN0cmluZyB1cmwgPSBhdHRhY2htZW50LmdldFRleHQoKTsKLQkJLy8gaWYgKHVybCAhPSBudWxsICYmIHVybC5sZW5ndGgoKSA+IDApIHsKLQkJLy8JCQkKLQkJLy8gfQotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBGaWxlIE5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dGFjaG1lbnRQYXRoKCkgewotCQlyZXR1cm4gYXR0YWNobWVudC5nZXRUZXh0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ2hhbmdlSGlzdG9yeURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ2hhbmdlSGlzdG9yeURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NmY5NThiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NoYW5nZUhpc3RvcnlEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLQotLyoqCi0gKiBEaWFsb2cgdG8gc2hvdyBjaGFuZ2UgaGlzdG9yeSBvZiBhbiBlbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VIaXN0b3J5RGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCS8qKgotCSAqIFRoZSBPSyBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLQotCS8qKgotCSAqIFRoZSBDYW5jZWwgYnV0dG9uLgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gY2FuY2VsQnV0dG9uOwotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0KLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBDaGFuZ2VIaXN0b3J5RGlhbG9nKFNoZWxsIHBhcmVudCwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0KLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIERpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIGRpYWxvZ0FyZWEuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJR3JpZERhdGEgZ2QgPSAoR3JpZERhdGEpIGRpYWxvZ0FyZWEuZ2V0TGF5b3V0RGF0YSgpOwotCQlnZC52ZXJ0aWNhbEluZGVudCA9IDEwOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5DaGFuZ2VIaXN0b3J5RGlhbG9nX2xhYmVsKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRhYmxlID0gbmV3IFRhYmxlKGRpYWxvZ0FyZWEsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNDAwOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDMwMDsKLQkJCXRhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0JCX0KLQotCQlpbml0Q2hhbmdlSGlzdG9yeVRhYmxlKCk7Ci0JCXN1cGVyLmdldFNoZWxsKCkuc2V0VGV4dCgKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5DaGFuZ2VIaXN0b3J5RGlhbG9nX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBkaWFsb2dBcmVhOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRDaGFuZ2VIaXN0b3J5VGFibGUoKSB7Ci0JCVN0cmluZyBjaGFuZ2VEZXNjID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9ICgoQ29udGVudEVsZW1lbnQpIGVsZW1lbnQpCi0JCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCWNoYW5nZURlc2MgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJY2hhbmdlRGVzYyA9ICgoTWV0aG9kUGx1Z2luKSBlbGVtZW50KS5nZXRDaGFuZ2VEZXNjcmlwdGlvbigpOwotCQl9Ci0KLQkJaWYgKGNoYW5nZURlc2MgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoCi0JCQkJCWNoYW5nZURlc2MsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNoYW5nZUhpc3RvcnlEaWFsb2dfZGVsaW1pdGVyKTsgLy8kTk9OLU5MUy0xJAotCQkJTGlzdCBzdHJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQl3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCXN0ckxpc3QuYWRkKHRvay5uZXh0VG9rZW4oKSk7Ci0JCQl9Ci0KLQkJCWZvciAoaW50IGkgPSBzdHJMaXN0LnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJaXRlbS5zZXRUZXh0KChTdHJpbmcpIHN0ckxpc3QuZ2V0KGkpKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGlhbG9nIGJ1dHRvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgT0sgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCi0JCS8vIFNldCBoZWxwIGNvbnRleHQgZm9yIHRoZSBPSyBidXR0b24uCi0JCW9rQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCi0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Db25maWd1cmF0aW9uQWRkVmlld3NEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGUyOTRiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Db25maWd1cmF0aW9uQWRkVmlld3NEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogT3BlbiBhbiBkaWFsb2cgdG8gYWRkIHZpZXdzIGludG8gY29uZmlndXJhdGlvbgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25BZGRWaWV3c0RpYWxvZyBleHRlbmRzIEl0ZW1zRmlsdGVyRGlhbG9nIHsKLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uQWRkVmlld3NEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkJCVN0cmluZyBwcmVzZW50YXRpb25OYW1lID0gbnVsbDsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJCXByZXNlbnRhdGlvbk5hbWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KQotCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJfQotCQkJCWlmIChwcmVzZW50YXRpb25OYW1lID09IG51bGwgfHwgIiIuZXF1YWxzKHByZXNlbnRhdGlvbk5hbWUpKSB7Ci0JCQkJCXByZXNlbnRhdGlvbk5hbWUgPSBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JCQkJfQotCQkJCXJldHVybiBwcmVzZW50YXRpb25OYW1lOwotCQkJfQotCQl9OwotCQloZWxwZXIuc2V0U2hvd1ByZXNlbnRhdGlvbk5hbWUodHJ1ZSk7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29uZmlndXJhdGlvbk9yZGVyRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Db25maWd1cmF0aW9uT3JkZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTA4MTlmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Db25maWd1cmF0aW9uT3JkZXJEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLlZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci0KLS8qKgotICogT3BlbiBhIGRpYWxvZyB0byBvcmRlciBjb25maWd1cmF0aW9uIHZpZXdzCi0gKiBAYXV0aG9yIFhpYW5nIERvbmcgSHUKLSAqIEBzaW5jZSAxLjIKLSAqICBmaXggZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzM4MjcKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25PcmRlckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBiYXNlQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF91cCwgY3RybF9kb3duOwotCi0JcHJpdmF0ZSBUYWJsZSBjdHJsX3ZpZXdzOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciB2aWV3c1RhYmxlVmlld2VyOwotCi0vLwlwcml2YXRlIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGFsbFN0ZXBzOwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB2aWV3c1ZpZXdlckNvbnRlbnRQcm92aWRlcjsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgdmlld3NWaWV3ZXJMYWJlbFByb3ZpZGVyOwotCQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1hbmFnZXI7Ci0JCi0JcHJpdmF0ZSBBcnJheUxpc3QgY29tbWFuZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHVibGljIENvbmZpZ3VyYXRpb25PcmRlckRpYWxvZyhTaGVsbCBwYXJlbnQsIAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1hbmFnZXIpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCXRoaXMuYWN0aW9uTWFuYWdlciA9IGFjdGlvbk1hbmFnZXI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJYmFzZUNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJZmluYWwgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gNDsKLQkJYmFzZUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCWJhc2VDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0KLQkJLy8gRW1wdHkgbGluZQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDQpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMYWJlbCgKLQkJCQliYXNlQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25PcmRlckRpYWxvZ19OYXZpZ2F0aW9uVmlld3MsIDMpOwotCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF92aWV3cyA9IG5ldyBUYWJsZShiYXNlQ29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDA7Ci0JCQljdHJsX3ZpZXdzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJaW5pdFByb3ZpZGVycygpOwotCi0JCXZpZXdzVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF92aWV3cyk7Ci0JCXZpZXdzVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHZpZXdzVmlld2VyQ29udGVudFByb3ZpZGVyKTsKLQkJdmlld3NUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHZpZXdzVmlld2VyTGFiZWxQcm92aWRlcik7Ci0KLQkJQ29tcG9zaXRlIG9yZGVyQnV0dG9uUGFuZSA9IG5ldyBDb21wb3NpdGUoYmFzZUNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlvcmRlckJ1dHRvblBhbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlvcmRlckJ1dHRvblBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl9Ci0KLQkJY3RybF91cCA9IGNyZWF0ZUJ1dHRvbihvcmRlckJ1dHRvblBhbmUsIEF1dGhvcmluZ1VJVGV4dC5VUF9CVVRUT05fVEVYVCk7Ci0JCWN0cmxfdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3RybF9kb3duID0gY3JlYXRlQnV0dG9uKG9yZGVyQnV0dG9uUGFuZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuRE9XTl9CVVRUT05fVEVYVCk7Ci0JCWN0cmxfZG93bi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCS8vIEVtcHR5IGxpbmUKLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCA0KTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxpbmUoYmFzZUNvbXBvc2l0ZSwgNCk7Ci0KLQkJc3VwZXIKLQkJCQkuZ2V0U2hlbGwoKQotCQkJCS5zZXRUZXh0KAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvbk9yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQkJbG9hZERhdGEoKTsKLQotCQlyZXR1cm4gYmFzZUNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUxpbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG5jb2wpIHsKLQkJTGFiZWwgbGluZSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTAotCQkJCXwgU1dULkJPTEQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IG5jb2w7Ci0JCWxpbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCQotCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBuQ29sKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBuQ29sOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdFByb3ZpZGVycygpIHsKLQkJdmlld3NWaWV3ZXJDb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQl2aWV3c1ZpZXdlckxhYmVsUHJvdmlkZXIgPSBuZXcgVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gIWNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKS5jb250YWlucyhlbGVtZW50KTsKLQkJCX0KLQotCQl9OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXZpZXdzVGFibGVWaWV3ZXIKLQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJaWYgKHZpZXdzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMAotCQkJCQkJCSYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9IGVsc2UKLQkJCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJCQkJaWYgKHZpZXdzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgdmlld3NUYWJsZVZpZXdlcgotCQkJCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkJCSYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0gZWxzZQotCQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQotCQl9KTsKLQkJCi0JCWN0cmxfdXAuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3c1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCQlBcnJheUxpc3QgbW92ZVVwSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbW92ZVVwSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXdzKCk7Ci0JCQkJTW92ZUluQ29uZmlndXJhdGlvbkNvbW1hbmQgY21kID0gbmV3IE1vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kKAotCQkJCQkJY29uZmlnLCBtb3ZlVXBJdGVtcywgZmVhdHVyZSwxKTsKLQkJCQlhY3Rpb25NYW5hZ2VyLmV4ZWN1dGUoY21kKTsKLQkJCQljb21tYW5kcy5hZGQoY21kKTsKLQotCQkJCXZpZXdzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKHZpZXdzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMCkgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJaWYgKHZpZXdzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgdmlld3NUYWJsZVZpZXdlcgotCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxKSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJY3RybF9kb3duLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld3NUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCUFycmF5TGlzdCBtb3ZlRG93bkl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vdmVEb3duSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXdzKCk7Ci0JCQkJTW92ZUluQ29uZmlndXJhdGlvbkNvbW1hbmQgY21kID0gbmV3IE1vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kKAotCQkJCQkJY29uZmlnLCBtb3ZlRG93bkl0ZW1zLCBmZWF0dXJlLDApOwotCQkJCWFjdGlvbk1hbmFnZXIuZXhlY3V0ZShjbWQpOwotCQkJCWNvbW1hbmRzLmFkZChjbWQpOwotCi0JCQkJdmlld3NUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAodmlld3NUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwKSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlpZiAodmlld3NUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCB2aWV3c1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEpIHsKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIExvYWQgaW5pdGlhbCBkYXRhIGZyb20gbW9kZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERhdGEoKSB7Ci0JCXZpZXdzVGFibGVWaWV3ZXIuc2V0SW5wdXQoY29uZmlnKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0vLwkJYWxsU3RlcHMuYXBwbHkoKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2FuY2VsUHJlc3NlZCgpIHsKLQkJaWYgKCFjb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSBjb21tYW5kcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCU9iamVjdCBjbWQgPSBjb21tYW5kcy5nZXQoaSk7Ci0JCQkJaWYgKGNtZCBpbnN0YW5jZW9mIE1vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kKSB7Ci0JCQkJCSgoTW92ZUluQ29uZmlndXJhdGlvbkNvbW1hbmQpIGNtZCkudW5kbygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5jYW5jZWxQcmVzc2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGNlOGI0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLlZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTW92ZUluQ2F0ZWdvcnlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5DYXRlZ29yeVNvcnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbnRlbnRFbGVtZW50T3JkZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci0KLS8qKgotICogT3BlbiBhbiBkaWFsb2cgdG8gb3JkZXIgY29udGVudCBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RWxlbWVudHNPcmRlckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBiYXNlQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF91cCwgY3RybF9kb3duOwotCi0JcHJpdmF0ZSBUYWJsZSBjdHJsX3N0ZXBzOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBzdGVwc1RhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhbGxTdGVwczsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgc3RlcHNWaWV3ZXJDb250ZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIHN0ZXBzVmlld2VyTGFiZWxQcm92aWRlcjsKLQotCS8vIHByaXZhdGUgVGFzayBjb250ZW50RWxlbWVudDsKLQlwcml2YXRlIENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50OwotCi0JLy8gdGhlIEVsZW1lbnQgdG8gdXNlIGZvciBzb3J0aW5nCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IHNvcnRFbGVtZW50OwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgY29tbWFuZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHJvdGVjdGVkIENvbWJvVmlld2VyIHZpZXdlcl9zb3J0OwotCQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXJTb3J0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCUxpc3Q8U3RyaW5nPiBzb3J0VHlwZXNMaXN0ID0gQ2F0ZWdvcnlTb3J0SGVscGVyLmdldENhdGVnb3J5U29ydFR5cGVzKCk7Ci0JCQlyZXR1cm4gc29ydFR5cGVzTGlzdC50b0FycmF5KCk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXJTb3J0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCVN0cmluZyBzdHIgPSAoKFN0cmluZylvYmplY3QpOwotCQkJCXJldHVybiBDYXRlZ29yeVNvcnRIZWxwZXIuZ2V0U29ydFR5cGVEaXNwbGF5TmFtZShzdHIpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9OwotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgPGNvZGU+QWR2YW5jZWRTZWFyY2hEaWFsb2c8L2NvZGU+IGdpdmViIHRoZSBwYXJlbnQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRyb2wuCi0JICovCi0JcHVibGljIENvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nKFNoZWxsIHBhcmVudCwKLQkJCUNvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50LCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQkJaWYgKFRuZ1V0aWwuaXNDb250cmlidXRvcihjb250ZW50RWxlbWVudCkpIHsKLQkJCXRoaXMuc29ydEVsZW1lbnQgPSBjb250ZW50RWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnNvcnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCX0KLQkJdGhpcy5hY3Rpb25NYW5hZ2VyID0gYWN0aW9uTWFuYWdlcjsKLQkJYWxsU3RlcHMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJYmFzZUNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJZmluYWwgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gNDsKLQkJYmFzZUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCWJhc2VDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0KLQkJLy8gRW1wdHkgbGluZQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDQpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMYWJlbCgKLQkJCQliYXNlQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX0NvbnRlbnRFbGVtZW50X3RleHQsIDMpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3N0ZXBzID0gbmV3IFRhYmxlKGJhc2VDb21wb3NpdGUsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDQwMDsKLQkJCWN0cmxfc3RlcHMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlpbml0UHJvdmlkZXJzKCk7Ci0KLQkJc3RlcHNUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3N0ZXBzKTsKLQkJc3RlcHNUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoc3RlcHNWaWV3ZXJDb250ZW50UHJvdmlkZXIpOwotCQlzdGVwc1RhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIoc3RlcHNWaWV3ZXJMYWJlbFByb3ZpZGVyKTsKLQotCQlDb21wb3NpdGUgb3JkZXJCdXR0b25QYW5lID0gbmV3IENvbXBvc2l0ZShiYXNlQ29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCW9yZGVyQnV0dG9uUGFuZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCW9yZGVyQnV0dG9uUGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCX0KLQotCQljdHJsX3VwID0gY3JlYXRlQnV0dG9uKG9yZGVyQnV0dG9uUGFuZSwgQXV0aG9yaW5nVUlUZXh0LlVQX0JVVFRPTl9URVhUKTsKLQkJY3RybF91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQljdHJsX2Rvd24gPSBjcmVhdGVCdXR0b24ob3JkZXJCdXR0b25QYW5lLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ET1dOX0JVVFRPTl9URVhUKTsKLQkJY3RybF9kb3duLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQljcmVhdGVMYWJlbChvcmRlckJ1dHRvblBhbmUsIExpYnJhcnlFZGl0UmVzb3VyY2VzLlNvcnRUeXBlX0xhYmVsLCAxKTsKLQkJQ29tYm8gY3RybF9zb3J0ID0gbmV3IENvbWJvKG9yZGVyQnV0dG9uUGFuZSwgU1dULlNJTkdMRSB8IFNXVC5GTEFUIHwgU1dULlJFQURfT05MWSk7Ci0JCXZpZXdlcl9zb3J0ID0gbmV3IENvbWJvVmlld2VyKGN0cmxfc29ydCk7Ci0JCXZpZXdlcl9zb3J0LnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTb3J0KTsKLQkJdmlld2VyX3NvcnQuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyU29ydCk7Ci0JCXZpZXdlcl9zb3J0LnNldElucHV0KGNvbnRlbnRFbGVtZW50KTsKLQkJLy8gc2V0IGluaXRpYWwgc2VsZWN0aW9uCi0JCVN0cmluZyBzb3J0VHlwZSA9IENhdGVnb3J5U29ydEhlbHBlci5nZXRDYXRlZ29yeVNvcnRWYWx1ZShzb3J0RWxlbWVudCk7Ci0JCXZpZXdlcl9zb3J0LnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzb3J0VHlwZSksIHRydWUpOwotCi0JCS8vIEVtcHR5IGxpbmUKLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCA0KTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxpbmUoYmFzZUNvbXBvc2l0ZSwgNCk7Ci0KLQkJc3VwZXIKLQkJCQkuZ2V0U2hlbGwoKQotCQkJCS5zZXRUZXh0KAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb25fdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQkJbG9hZERhdGEoKTsKLQotCQkvLyBjb250cmlidXRvcnMgY2Fubm90IGNoYW5nZSB0aGUgc29ydCB0eXBlIC0gdGhlIGJhc2UgZWxlbWVudCdzIHNvcnQgaXMgdXNlZAotCQlpZiAoVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKGNvbnRlbnRFbGVtZW50KSkgewotCQkJdmlld2VyX3NvcnQuZ2V0Q29tYm8oKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gYmFzZUNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTGluZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbmNvbCkgewotCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMCi0JCQkJfCBTV1QuQk9MRCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbmNvbDsKLQkJbGluZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgbkNvbCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbkNvbDsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkaWFsb2cgYnV0dG9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBPSyBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0JCQkJdHJ1ZSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBDYW5jZWwgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UHJvdmlkZXJzKCkgewotCQlzdGVwc1ZpZXdlckNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCWlmIChhbGxTdGVwcyA9PSBudWxsKSB7Ci0JCQkJCWFsbFN0ZXBzID0gbmV3IENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCUNvbnRlbnRFbGVtZW50T3JkZXJMaXN0LkNPTlRFTlRfRUxFTUVOVFNfX0ZPUl9FTEVNRU5UX0FORF9QQVJFTlRTKTsKLQkJCQl9Ci0JCQkJTGlzdCByZXR1cm5MaXN0ID0gQ2F0ZWdvcnlTb3J0SGVscGVyLnNvcnRDYXRlZ29yeUVsZW1lbnRzKHNvcnRFbGVtZW50LCBhbGxTdGVwcy50b0FycmF5KCkpOwotCQkJCXJldHVybiByZXR1cm5MaXN0LnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQlzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXIgPSBuZXcgVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gISgoQ3VzdG9tQ2F0ZWdvcnkpIGNvbnRlbnRFbGVtZW50KQotCQkJCQkJLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5jb250YWlucyhlbGVtZW50KTsKLQkJCX0KLQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVycygpIHsKLQotCQlzdGVwc1RhYmxlVmlld2VyCi0JCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkKLQkJCQkJCQkJCSYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSAmJgotCQkJCQkJCQkJQ2F0ZWdvcnlTb3J0SGVscGVyLmlzTWFudWFsQ2F0ZWdvcnlTb3J0KHNvcnRFbGVtZW50KSkgewotCQkJCQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJfSBlbHNlCi0JCQkJCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJCQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KQotCQkJCQkJCQkJJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxICYmCi0JCQkJCQkJCQlDYXRlZ29yeVNvcnRIZWxwZXIuaXNNYW51YWxDYXRlZ29yeVNvcnQoc29ydEVsZW1lbnQpKSB7Ci0JCQkJCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCX0gZWxzZQotCQkJCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX0pOwotCi0JCWN0cmxfdXAuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCQlBcnJheUxpc3QgbW92ZVVwSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbW92ZVVwSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKTsKLQkJCQlNb3ZlSW5DYXRlZ29yeUNvbW1hbmQgY21kID0gbmV3IE1vdmVJbkNhdGVnb3J5Q29tbWFuZCgKLQkJCQkJCShDdXN0b21DYXRlZ29yeSkgY29udGVudEVsZW1lbnQsIG1vdmVVcEl0ZW1zLCBhbGxTdGVwcywKLQkJCQkJCWZlYXR1cmUsIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoLCAxKTsKLQkJCQlhY3Rpb25NYW5hZ2VyLmV4ZWN1dGUoY21kKTsKLQkJCQljb21tYW5kcy5hZGQoY21kKTsKLQotCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0KLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkgJiYKLQkJCQkJCUNhdGVnb3J5U29ydEhlbHBlci5pc01hbnVhbENhdGVnb3J5U29ydChzb3J0RWxlbWVudCkpIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWlmIChzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpICYmCi0JCQkJCQlDYXRlZ29yeVNvcnRIZWxwZXIuaXNNYW51YWxDYXRlZ29yeVNvcnQoc29ydEVsZW1lbnQpKSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZG93bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlBcnJheUxpc3QgbW92ZURvd25JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlRG93bkl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0JCQkJTW92ZUluQ2F0ZWdvcnlDb21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5DYXRlZ29yeUNvbW1hbmQoCi0JCQkJCQkoQ3VzdG9tQ2F0ZWdvcnkpIGNvbnRlbnRFbGVtZW50LCBtb3ZlRG93bkl0ZW1zLCBhbGxTdGVwcywKLQkJCQkJCWZlYXR1cmUsIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoLAkwKTsKLQkJCQlhY3Rpb25NYW5hZ2VyLmV4ZWN1dGUoY21kKTsKLQkJCQljb21tYW5kcy5hZGQoY21kKTsKLQotCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0KLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkgJiYKLQkJCQkJCUNhdGVnb3J5U29ydEhlbHBlci5pc01hbnVhbENhdGVnb3J5U29ydChzb3J0RWxlbWVudCkpIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWlmIChzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpICYmCi0JCQkJCQlDYXRlZ29yeVNvcnRIZWxwZXIuaXNNYW51YWxDYXRlZ29yeVNvcnQoc29ydEVsZW1lbnQpKSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdmlld2VyX3NvcnQuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zb3J0Ci0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJU3RyaW5nIHNvcnRUeXBlID0gKFN0cmluZylzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBDYXRlZ29yeVNvcnRIZWxwZXIuZ2V0Q2F0ZWdvcnlTb3J0UHJvcGVydHkoY29udGVudEVsZW1lbnQpOwotCQkJCQotCQkJCWlmIChwcm9wID09IG51bGwpIHsKLQkJCQkJcHJvcCA9IENhdGVnb3J5U29ydEhlbHBlci5jcmVhdGVOZXdTb3J0UHJvcGVydHkoc29ydFR5cGUpOwotCQkJCQlhY3Rpb25NYW5hZ2VyCi0JCQkJCS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLAotCQkJCQkJCXByb3AsIC0xKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWFjdGlvbk1hbmFnZXIuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJcHJvcCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKSwKLQkJCQkJCQkJc29ydFR5cGUsIC0xKTsKLQkJCQl9Ci0JCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJCX0KLQkJfSk7Ci0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hWaWV3ZXJzKCkgewotCQlzdGVwc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIGluaXRpYWwgZGF0YSBmcm9tIG1vZGVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotCQlzdGVwc1RhYmxlVmlld2VyLnNldElucHV0KGNvbnRlbnRFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJYWxsU3RlcHMuYXBwbHkoKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2FuY2VsUHJlc3NlZCgpIHsKLQkJaWYgKCFjb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSBjb21tYW5kcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCU9iamVjdCBjbWQgPSBjb21tYW5kcy5nZXQoaSk7Ci0JCQkJaWYgKGNtZCBpbnN0YW5jZW9mIE1vdmVJbkNhdGVnb3J5Q29tbWFuZCkgewotCQkJCQkoKE1vdmVJbkNhdGVnb3J5Q29tbWFuZCkgY21kKS51bmRvKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Db250cmlidXRpb25TZWxlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NvbnRyaWJ1dGlvblNlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZTJkZTM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NvbnRyaWJ1dGlvblNlbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkNhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBUaGUgZGlhbG9nIGZvciBzZWxlY3RpbmcgZWxlbWVudCB0byBkZXRldG1pbmUgd2hpY2ggZWxlbWVudCBlZGl0b3IgdG8gb3BlbiBpbgotICogY2FzZSBvZiB2YXJpYWJpbGl0eSByZWxhdGlvbnNoaXAuIFRoaXMgd2lsbCBvbmx5IHRha2UgZWZmZWN0IGlmIHVzZXIKLSAqIGRvdWJsZS1jbGlja3MgZnJvbSBjb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cmlidXRpb25TZWxlY3Rpb24gewotCi0JcHJpdmF0ZSBIYXNoU2V0IGZpbHRlckVsZW1lbnRMaXN0ID0gbmV3IEhhc2hTZXQoKTsKLQotCXByaXZhdGUgY2xhc3MgQ29udHJpYnV0aW9uRmlsdGVyIGV4dGVuZHMgQWxsRmlsdGVyIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCU9iamVjdCBjb250ZW50RWxlbWVudCA9IGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpOwotCQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAob2JqLmVxdWFscyhoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkgIT0gbnVsbCkgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKAotCQkJCQkJCSgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqKS5nZXRQcm9jZXNzKCkpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKG9iaikpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlpZiAoVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaikpIHsKLQkJCQkJaWYgKCgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaikuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJCQkJLmlzRW1wdHkoKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKSByZXR1cm4gZmFsc2U7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoTWV0aG9kRWxlbWVudFV0aWwuZ2V0QWxsTW9kZWxzKGNvbnRlbnRFbGVtZW50KQotCQkJCQkJCQkuY29udGFpbnMob2JqKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGlvciA9IGxpc3QuaXRlcmF0b3IoKTsgaW9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IGlvci5uZXh0KCk7Ci0JCQkJCWlmICgoKENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmplY3QpCi0JCQkJCQkJLmdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpKQotCQkJCQkJaW9yLnJlbW92ZSgpOwotCQkJCX0KLQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlpZiAoY2hpbGRBY2NlcHQob2JqKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCXJldHVybiBhbnlDYXRlZ29yaXplZEVsZW1lbnRBY2NlcHRlZCgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaiwKLQkJCQkJCWZpbHRlckVsZW1lbnRMaXN0KTsKLQkJCX0KLQkJCWlmICgob2JqIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpCi0JCQkJCSYmIGZpbHRlckVsZW1lbnRMaXN0LmNvbnRhaW5zKG9iaikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpeyAKLQkJCQlpZihmaWx0ZXJFbGVtZW50TGlzdC5jb250YWlucyhvYmopKXsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlyZXR1cm4gY2hlY2tQcm9jZXNzUGtnKG9iaik7Ci0JCQl9Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJcmV0dXJuIGNoZWNrUHJvY2Vzc0VsZW1lbnRzKG9iaik7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9OwotCQotCXB1YmxpYyBib29sZWFuIGNoZWNrUHJvY2Vzc1BrZyhPYmplY3Qgb2JqKXsKLQkJCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpewotCQkJaWYoZmlsdGVyRWxlbWVudExpc3QuY29udGFpbnMob2JqKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpewotCQkJCWlmKGZpbHRlckVsZW1lbnRMaXN0LmNvbnRhaW5zKCgoUHJvY2Vzc0NvbXBvbmVudClvYmopLmdldFByb2Nlc3MoKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWxpc3QgPSAoKFByb2Nlc3NDb21wb25lbnQpb2JqKS5nZXRQcm9jZXNzKCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCX1lbHNlewotCQkJCWxpc3QgPSAoKFByb2Nlc3NQYWNrYWdlKW9iaikuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQkJfQotCQkJCi0JCX0KLQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotCQl7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihjaGlsZCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpewotCQkJCWlmKGNoZWNrUHJvY2Vzc1BrZyhjaGlsZCkpIHJldHVybiB0cnVlOwotCQkJfQotCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KXsKLQkJCQlpZihmaWx0ZXJFbGVtZW50TGlzdC5jb250YWlucyhjaGlsZCkpIHJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgYW55IHByb2Nlc3MgZWxlbWVudHMKLQkgKiBAcGFyYW0gb2JqCi0JICogQHJldHVybgotCSAqIAkJCUJvb2xlYW4gdmFsdWUgCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2hlY2tQcm9jZXNzRWxlbWVudHMoT2JqZWN0IG9iail7Ci0JCUxpc3QgbGlzdCA9ICgoUHJvY2VzcylvYmopLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLQkJewotCQkJT2JqZWN0IGNoaWxkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KXsKLQkJCQlpZihmaWx0ZXJFbGVtZW50TGlzdC5jb250YWlucygoKEJyZWFrZG93bkVsZW1lbnQpY2hpbGQpKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhbnkgY2F0ZWdvcml6ZWQgZWxlbWVudHMgdG8gYmUgYWNjZXB0ZWQuCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBsaXN0Ci0JICogQHJldHVybgotCSAqIAkJQm9vbGVhbiB2YWx1ZSB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBhbnkgY2F0ZWdvcmllemVkIGVsZW1lbnRzIHRvIGJlIGFjY2VwdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gYW55Q2F0ZWdvcml6ZWRFbGVtZW50QWNjZXB0ZWQoQ3VzdG9tQ2F0ZWdvcnkgb2JqLAotCQkJSGFzaFNldCBsaXN0KSB7Ci0JCWlmIChsaXN0LmNvbnRhaW5zKG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJTGlzdCBlbGVtZW50cyA9IG9iai5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJaWYgKGxpc3QuY29udGFpbnMob2JqZWN0KSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJYW55Q2F0ZWdvcml6ZWRFbGVtZW50QWNjZXB0ZWQoKEN1c3RvbUNhdGVnb3J5KSBvYmplY3QsIGxpc3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8qKgotCSAqIERpc3BsYXkgY29udHJpYnV0aW9uIHNlbGVjdGlvbiBkaWFsb2cgd2hpY2ggbGlzdHMgZWxlbWVudHMgYW5kIGl0J3MKLQkgKiBjb250cmlidXRvcnMuCi0JICovCi0JcHVibGljIENvbnRyaWJ1dGlvblNlbGVjdGlvbigpIHsKLQl9Ci0KLQkvKioKLQkgKiBJdCBzaG93cyBkaWFsb2cgYm94IGZvciBhbGwgdGhlIGNvbnRyaWJ1dG9ycy4gVXNlciBpcyBleHBlY3RlZCB0byBzZWxlY3QKLQkgKiBvbmUuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAJCQlFbGVtZW50IGZvciB3aGljaCBjb250cmlidXRvciBhcmUgc2hvd24KLQkgKiBAcmV0dXJuCi0JICogCQkJU2VsZWN0ZWQgY29udHJpYnV0b3IKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkQ29udHJpYnV0b3IoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQpIHsKLQkJZmlsdGVyRWxlbWVudExpc3QgPSBuZXcgSGFzaFNldCgpOwotCQkvLyBHZXQgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkJLy8gZ2V0IGxpc3Qgb2YgY29udHJpYnV0b3JzCi0JCUxpc3QgY29udHJpYnV0b3JzID0gQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCS5nZXRDb250cmlidXRvcnMoZWxlbWVudCwgY29uZmlnKTsKLQkJaWYgKChjb250cmlidXRvcnMgIT0gbnVsbCkgJiYgKCFjb250cmlidXRvcnMuaXNFbXB0eSgpKSkgewotCQkJLy8gY2xlYXIgdGhlIGFycmF5Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQkvLyBhZGQgZWxlbWVudCBhbmQgaXQncyBjb250cmlidXRvcnMKLQkJCWVsZW1lbnRMaXN0LmFkZChlbGVtZW50KTsKLQkJCWVsZW1lbnRMaXN0LmFkZEFsbChjb250cmlidXRvcnMpOwotCQkJZmlsdGVyRWxlbWVudExpc3QuYWRkQWxsKGVsZW1lbnRMaXN0KTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGVsZW1lbnRMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlID0gaXRvci5uZXh0KCk7Ci0JCQkJTGlzdCBncm91cGluZ3MgPSBudWxsOwotCQkJCWlmIChlIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJCQlncm91cGluZ3MgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKSBlKTsKLQotCQkJCX0KLQkJCQlpZiAoZSBpbnN0YW5jZW9mIFJvbGVTZXQpIHsKLQkJCQkJZ3JvdXBpbmdzID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0Um9sZVNldEdyb3VwcygoUm9sZVNldCkgZSk7Ci0JCQkJfQotCi0JCQkJaWYgKChncm91cGluZ3MgIT0gbnVsbCkgJiYgKCFncm91cGluZ3MuaXNFbXB0eSgpKSkKLQkJCQkJZmlsdGVyRWxlbWVudExpc3QuYWRkQWxsKGdyb3VwaW5ncyk7Ci0KLQkJCX0KLQotCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgQ29udHJpYnV0aW9uRmlsdGVyKCk7Ci0JCQkvLyBJdGVtc0ZpbHRlckRpYWxvZyBkbGcgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJLy8gLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkvLyBmaWx0ZXIsIG51bGwsIEZpbHRlckNvbnN0YW50cy5DT05GSUdfQ09OVEVOVF9FTEVNRU5UKTsKLQkJCS8vIGRsZy5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nW10geyBGaWx0ZXJDb25zdGFudHMuQ09ORklHX0NPTlRFTlRfRUxFTUVOVCB9OwotCQkJQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nIGRsZyA9IG5ldyBDb25maWd1cmF0aW9uQWRkVmlld3NEaWFsb2coCi0JCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQlkbGcuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQlkbGcuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLkNPTkZJR19DT05URU5UX0VMRU1FTlQpOwotCQkJZGxnLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJCWRsZy5zZXRUeXBlcyhzdHIpOwotCQkJZGxnLnNldElucHV0KFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeSgoRU9iamVjdCkgZWxlbWVudCkpOwotCQkJZGxnLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcikpLAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRJdGVtc0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCi0JCQlTdHJpbmcgdGl0bGUgPSBNZXNzYWdlRm9ybWF0Ci0JCQkJCS5mb3JtYXQoCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29udHJpYnV0aW9uU2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IGVsZW1lbnQuZ2V0TmFtZSgpIH0pOwotCi0JCQlkbGcuc2V0VGl0bGUodGl0bGUpOwotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGxnLm9wZW4oKTsKLQotCQkJTGlzdCByZXN1bHQgPSBkbGcuZ2V0U2VsZWN0ZWRJdGVtcygpOwotCQkJaWYgKChyZXN1bHQgPT0gbnVsbCkgfHwgKHJlc3VsdC5pc0VtcHR5KCkpKQotCQkJCXJldHVybiBudWxsOwotCQkJZWxzZQotCQkJCXJldHVybiByZXN1bHQuZ2V0KDApOwotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvRGlhbG9nSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9EaWFsb2dIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWNiZTIxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9EaWFsb2dIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc0FjdGl2aXR5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzUm9sZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuVmFyaWFiaWxpdHlQcm9jZXNzUm9sZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuVmFyaWFiaWxpdHlQcm9jZXNzVGFza0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuVmFyaWFiaWxpdHlQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGNvbGxlY3QgaW5wdXQgZGF0YSBmcm9tIHVzZXJzIHVzaW5nIGRpYWxvZyBib3hlcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYWxvZ0hlbHBlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0IHNlbGVjdEVsZW1lbnRzRm9yKEJyZWFrZG93bkVsZW1lbnQgZSwgSUZpbHRlciBmaWx0ZXIsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIHRhYk5hbWUpIHsKLQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBmaWx0ZXIsIHRhYk5hbWUsIG51bGwsCi0JCQkJY29uZmlnKTsKLQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWZkLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZShmYWxzZSk7Ci0JCWZkLnNldFRpdGxlKHRhYk5hbWUpOwotCQlmZC5vcGVuKCk7Ci0JCXJldHVybiBmZC5nZXRTZWxlY3RlZEl0ZW1zKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IHNlbGVjdFRhc2tzRm9yKEFjdGl2aXR5IGFjdCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuVEFTS1M7Ci0JCUlGaWx0ZXIgZmlsdGVyID0gbmV3IFZhcmlhYmlsaXR5UHJvY2Vzc1Rhc2tGaWx0ZXIoY29uZmlnLCBudWxsLAotCQkJCUZpbHRlckNvbnN0YW50cy5UQVNLUywgYWN0KTsKLQotCQlyZXR1cm4gc2VsZWN0RWxlbWVudHNGb3IoYWN0LCBmaWx0ZXIsIGNvbmZpZywgdGFiTmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IHNlbGVjdEVsZW1lbnRzRm9yKE9iamVjdCBvYmplY3QsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgPT0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQlyZXR1cm4gc2VsZWN0VGFza3NGb3IoKEFjdGl2aXR5KSBvYmplY3QsIGNvbmZpZyk7Ci0JCQl9IGVsc2UgaWYgKGFkYXB0ZXJGYWN0b3J5ID09IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuUk9MRVM7Ci0JCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgVmFyaWFiaWxpdHlQcm9jZXNzUm9sZUZpbHRlcihjb25maWcsIG51bGwsCi0JCQkJCQlGaWx0ZXJDb25zdGFudHMuUk9MRVMsIChBY3Rpdml0eSkgb2JqZWN0KTsKLQkJCQlyZXR1cm4gc2VsZWN0RWxlbWVudHNGb3IoKEJyZWFrZG93bkVsZW1lbnQpIG9iamVjdCwgZmlsdGVyLAotCQkJCQkJY29uZmlnLCB0YWJOYW1lKTsKLQkJCX0gZWxzZSBpZiAoYWRhcHRlckZhY3RvcnkgPT0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQlTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFM7Ci0JCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgVmFyaWFiaWxpdHlQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIoCi0JCQkJCQljb25maWcsIG51bGwsIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFMsCi0JCQkJCQkoQWN0aXZpdHkpIG9iamVjdCk7Ci0JCQkJcmV0dXJuIHNlbGVjdEVsZW1lbnRzRm9yKChCcmVha2Rvd25FbGVtZW50KSBvYmplY3QsIGZpbHRlciwKLQkJCQkJCWNvbmZpZywgdGFiTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgPT0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQlTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5ST0xFUzsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBQcm9jZXNzUm9sZUZpbHRlcihjb25maWcsIG51bGwsCi0JCQkJCQlGaWx0ZXJDb25zdGFudHMuUk9MRVMpOwotCQkJCXJldHVybiBzZWxlY3RFbGVtZW50c0ZvcigoQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0LCBmaWx0ZXIsCi0JCQkJCQljb25maWcsIHRhYk5hbWUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IHNlbGVjdEFjdGl2aXRpZXNGb3IoQWN0aXZpdHkgYWN0LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIGludCBjb21tYW5kKSB7Ci0JCS8vIHJldHVybiBudWxsOwotCQlTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5QUk9DRVNTRVM7Ci0JCUlGaWx0ZXIgZmlsdGVyID0gbmV3IFByb2Nlc3NBY3Rpdml0eUZpbHRlcihjb25maWcsIG51bGwsCi0JCQkJRmlsdGVyQ29uc3RhbnRzLlBST0NFU1NFUywgYWN0LCBjb21tYW5kKTsKLQkJTGlzdCBzZWxlY3Rpb24gPSBzZWxlY3RFbGVtZW50c0ZvcihhY3QsIGZpbHRlciwgY29uZmlnLCB0YWJOYW1lKTsKLQkJQXJyYXlMaXN0IGFjdGl2aXRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJYWN0aXZpdGllcy5hZGQoZWxlbWVudCk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBlbGVtZW50KS5nZXRQcm9jZXNzKCk7Ci0JCQkJaWYgKHByb2MgIT0gbnVsbCkgewotCQkJCQlhY3Rpdml0aWVzLmFkZChwcm9jKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFjdGl2aXRpZXM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvRmlsdGVyU29ydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9GaWx0ZXJTb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjIyMTNkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9GaWx0ZXJTb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db250ZW50Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci0KLQotCi0vKioKLSAqIEEge0BsaW5rIEl0ZW1zRmlsdGVyRGlhbG9nfSBkaWFsb2cgdmlld2VyIHNvcnRlciB0byBvcmRlciB0aGUgZGlzcGxheSBmb3IgY2VydGFpbiBlbGVtZW50IGFuZCBwYWNrYWdlcy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCi0JcHVibGljIEZpbHRlclNvcnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNhdGVnb3J5KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQlyZXR1cm4gMDsKLQkJZWxzZQotCQkJcmV0dXJuIDE7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbGxhdG9yCi0JICovCi0JcHVibGljIEZpbHRlclNvcnRlcihDb2xsYXRvciBjb2xsYXRvcikgewotCQlzdXBlcihjb2xsYXRvcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3IjY29tcGFyZShvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQotCQlpZiAoIShlMSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB8fCAhKGUyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKSB7Ci0JCQlpbnQgY2F0MSA9IGNhdGVnb3J5KGUxKTsKLQkJCWludCBjYXQyID0gY2F0ZWdvcnkoZTIpOwotCi0JCQlpZiAoY2F0MSAhPSBjYXQyKQotCQkJCXJldHVybiBjYXQxIC0gY2F0MjsKLQkJfQotCi0JCWlmIChlMSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiAmJiBlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlTdHJpbmcgbmFtZTE7Ci0JCVN0cmluZyBuYW1lMjsKLQotCQlpZiAodmlld2VyID09IG51bGwgfHwgISh2aWV3ZXIgaW5zdGFuY2VvZiBDb250ZW50Vmlld2VyKSkgewotCQkJbmFtZTEgPSBlMS50b1N0cmluZygpOwotCQkJbmFtZTIgPSBlMi50b1N0cmluZygpOwotCQl9IGVsc2UgewotCQkJSUJhc2VMYWJlbFByb3ZpZGVyIHByb3YgPSAoKENvbnRlbnRWaWV3ZXIpIHZpZXdlcikKLQkJCQkJLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCWlmIChwcm92IGluc3RhbmNlb2YgSUxhYmVsUHJvdmlkZXIpIHsKLQkJCQlJTGFiZWxQcm92aWRlciBscHJvdiA9IChJTGFiZWxQcm92aWRlcikgcHJvdjsKLQkJCQluYW1lMSA9IGxwcm92LmdldFRleHQoZTEpOwotCQkJCW5hbWUyID0gbHByb3YuZ2V0VGV4dChlMik7Ci0JCQl9IGVsc2UgewotCQkJCW5hbWUxID0gZTEudG9TdHJpbmcoKTsKLQkJCQluYW1lMiA9IGUyLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5hbWUxID09IG51bGwpCi0JCQluYW1lMSA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJaWYgKG5hbWUyID09IG51bGwpCi0JCQluYW1lMiA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNvbGxhdG9yLmNvbXBhcmUobmFtZTEsIG5hbWUyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvciNzb3J0KG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0W10pCi0JICovCi0JcHVibGljIHZvaWQgc29ydChmaW5hbCBWaWV3ZXIgdmlld2VyLCBPYmplY3RbXSBlbGVtZW50cykgewotCQlBcnJheXMuc29ydChlbGVtZW50cywgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQkJcmV0dXJuIEZpbHRlclNvcnRlci50aGlzLmNvbXBhcmUodmlld2VyLCBhLCBiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9GaWx0ZXJTb3J0ZXJGb3JBbGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0ZpbHRlclNvcnRlckZvckFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NGEyYTY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0ZpbHRlclNvcnRlckZvckFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkFsbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db250ZW50Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci0KLQotLyoqCi0gKiBBIEZpbHRlciBzb3J0ZXIgZm9yIHtAbGluayBJdGVtc0ZpbHRlckRpYWxvZ30gdXNpbmcge0BsaW5rIEFsbEZpbHRlcn0KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyU29ydGVyRm9yQWxsIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQotCXB1YmxpYyBGaWx0ZXJTb3J0ZXJGb3JBbGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbGxhdG9yCi0JICovCi0JcHVibGljIEZpbHRlclNvcnRlckZvckFsbChDb2xsYXRvciBjb2xsYXRvcikgewotCQlzdXBlcihjb2xsYXRvcik7Ci0JfQotCi0JcHVibGljIGludCBjYXRlZ29yeShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UKLQkJCXJldHVybiAxOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCi0JCWlmICghKGUxIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHx8ICEoZTIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkpIHsKLQkJCWludCBjYXQxID0gY2F0ZWdvcnkoZTEpOwotCQkJaW50IGNhdDIgPSBjYXRlZ29yeShlMik7Ci0KLQkJCWlmIChjYXQxICE9IGNhdDIpCi0JCQkJcmV0dXJuIGNhdDEgLSBjYXQyOwotCQl9Ci0KLQkJaWYgKGUxIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luICYmIGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoIShlMSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB8fCAhKGUyIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCVN0cmluZyBuYW1lMTsKLQkJU3RyaW5nIG5hbWUyOwotCi0JCWlmICh2aWV3ZXIgPT0gbnVsbCB8fCAhKHZpZXdlciBpbnN0YW5jZW9mIENvbnRlbnRWaWV3ZXIpKSB7Ci0JCQluYW1lMSA9IGUxLnRvU3RyaW5nKCk7Ci0JCQluYW1lMiA9IGUyLnRvU3RyaW5nKCk7Ci0JCX0gZWxzZSB7Ci0JCQlJQmFzZUxhYmVsUHJvdmlkZXIgcHJvdiA9ICgoQ29udGVudFZpZXdlcikgdmlld2VyKQotCQkJCQkuZ2V0TGFiZWxQcm92aWRlcigpOwotCQkJaWYgKHByb3YgaW5zdGFuY2VvZiBJTGFiZWxQcm92aWRlcikgewotCQkJCUlMYWJlbFByb3ZpZGVyIGxwcm92ID0gKElMYWJlbFByb3ZpZGVyKSBwcm92OwotCQkJCW5hbWUxID0gbHByb3YuZ2V0VGV4dChlMSk7Ci0JCQkJbmFtZTIgPSBscHJvdi5nZXRUZXh0KGUyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmFtZTEgPSBlMS50b1N0cmluZygpOwotCQkJCW5hbWUyID0gZTIudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlpZiAobmFtZTEgPT0gbnVsbCkKLQkJCW5hbWUxID0gIiI7Ly8kTk9OLU5MUy0xJAotCQlpZiAobmFtZTIgPT0gbnVsbCkKLQkJCW5hbWUyID0gIiI7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gY29sbGF0b3IuY29tcGFyZShuYW1lMSwgbmFtZTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNvcnQoZmluYWwgVmlld2VyIHZpZXdlciwgT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJQXJyYXlzLnNvcnQoZWxlbWVudHMsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJCXJldHVybiBGaWx0ZXJTb3J0ZXJGb3JBbGwudGhpcy5jb21wYXJlKHZpZXdlciwgYSwgYik7Ci0JCQl9Ci0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0lucHV0VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvSW5wdXRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4Y2NjYmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvSW5wdXRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLS8qKgotICogQGF1dGhvciBza2Fubm9vcgotICoKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIElucHV0VHlwZSB7Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgVEVYVCA9IDA7Ci0JcHVibGljIHN0YXRpYyBpbnQgQ09NQk8gPSAxOwotCXB1YmxpYyBzdGF0aWMgaW50IExJU1QgPSAyOwotCXB1YmxpYyBzdGF0aWMgaW50IFRSRUUgPSAzOwotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvSXRlbXNGaWx0ZXJEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0l0ZW1zRmlsdGVyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1M2RhZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvSXRlbXNGaWx0ZXJEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkRlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5FeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JUHJvY2Vzc0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2guaW50ZXJuYWwuY29yZS50ZXh0LlBhdHRlcm5Db25zdHJ1Y3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotCi0vKioKLSAqIEZpbHRlciBEaWFsb2cgLSBhbGxvdyB0aGUgdXNlciB0byBmaWx0ZXIgdGhlIGNvbnRlbnQgZWxlbWVudCwgY29udGVudAotICogY2F0ZWdvcmllcywgY3VzdG9tIGNhdGVnb3JpZXMsIEFsbCB0eXBlcyBvZiBjb250ZW50ZWxlbWVudHMgYmFzZWQgb24gbG9jYXRpb24gb2YgdGhlIHVzZSBvZiB0aGUgZmlsdGVyCi0gKiBkaWFsb2cuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICovCi1wdWJsaWMgY2xhc3MgSXRlbXNGaWx0ZXJEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cwotCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLCBJRG91YmxlQ2xpY2tMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uLCBjYW5jZWxCdXR0b247Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjdHJsX3BhdHRlcm4sIGN0cmxfYnJpZWZfZGVzYzsKLQotCXByaXZhdGUgU3RyaW5nIHBhdHRlcm4sIGZpbHRlclR5cGVTdHI7Ci0KLQlwcm90ZWN0ZWQgQ29tYm8gZmlsdGVyVHlwZTsKLQotCXByaXZhdGUgU3RyaW5nIGRpYWxvZ1RpdGxlLCB0YWJTdHI7Ci0KLQlwcml2YXRlIE9iamVjdCBjb250ZW50RWxlbWVudDsKLQotCXByaXZhdGUgQXJyYXlMaXN0IHNlbGVjdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgYm9vbGVhbiB2aWV3ZXJTZWxlY3Rpb25TaW5nbGUgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyB2aWV3ZXJMYWJlbCA9IG51bGw7Ci0JCi0JLyoKLQkgKiBUcmVldmlld2VyIGZvciBDb250ZW50RWxlbWVudHMgdG8gZGlzcGxheS4KLQkgKi8KLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJCS8vIHJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LCAiIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIG1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciA9IChNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIpVG5nVXRpbC5nZXRBZGFwdGVyKChNZXRob2RQbHVnaW4pb2JqZWN0LCBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChtZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmdldEZ1bGxOYW1lKG9iamVjdCk7Ci0JCQkJfQotCQkJfSAKLQkJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQlwcml2YXRlIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLQotCS8qCi0JICogRGlhbG9nIEF0dHJpYnV0ZXMKLQkgKi8KLQkvLyBwcml2YXRlIGJvb2xlYW4gYW55Q2hpbGRzID0gdHJ1ZTsKLQlwcml2YXRlIExpc3QgYWxyZWFkeVNlbGVjdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlQYXR0ZXJuIHJlZ2V4UGF0dGVybjsKLQotCS8vIHByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWd1cmF0aW9uOwotCXByb3RlY3RlZCBGaWx0ZXJIZWxwZXIgaGVscGVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgU1RPUkVfRVhQQU5ERURfTEVWRUxfSUQgPSAiLkxFVkVMX0lEIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIFBBVFRFUk5fSUQgPSAiLlBhdHRlcm4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgVFlQRV9JRCA9ICIuVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIERJQUxPR19OQU1FOwotCi0JcHJpdmF0ZSBCdXR0b24gZXhwYW5kQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY29sbGFwc2VCdXR0b247Ci0KLQlwcml2YXRlIE9iamVjdCBpbnB1dDsKLQotCXByaXZhdGUgU3RyaW5nW10gdHlwZXM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbHRlckRpYWxvZy4gVGhpcyBjb25zdHJ1Y3RvciB3aWxsIHVzZSBmaWx0ZXIgYmFzZWQgb24KLQkgKiB0YWJTdHIsIGZpbHRlcnMgb3V0IHRoZSBsaXN0IG9mIGVsZW1lbnRzIGJhc2VkIG9uIGFscmVhZHkgZXhpc3RpbmcKLQkgKiBzZWxlY3RlZCBlbGVtZW50IGluIHRoZSBzZWxlY3RlZCB0YWJsZS4gSW5pdGlhbGl6ZXMgdGhlIENvbnRlbnRQcm92aWRlcgotCSAqIGZvciB0aGUgdHJlZXZpZXdlci4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgSXRlbXNGaWx0ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIE9iamVjdCBjb250ZW50RWxlbWVudCwKLQkJCVN0cmluZyB0YWJTdHIsIExpc3QgYWxyZWFkeUV4aXN0cykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuY29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQkJdGhpcy50YWJTdHIgPSB0YWJTdHI7Ci0JCXRoaXMuZmlsdGVyID0gbnVsbDsKLQkJdGhpcy5hbHJlYWR5U2VsZWN0ZWRMaXN0ID0gYWxyZWFkeUV4aXN0czsKLQkJaGVscGVyID0gbmV3IEZpbHRlckhlbHBlcihjb250ZW50RWxlbWVudCwgdGFiU3RyLCBudWxsLCBudWxsLAotCQkJCXRoaXMuYWxyZWFkeVNlbGVjdGVkTGlzdCk7Ci0JCWluaXRQcm92aWRlckZvclRhYnMoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlbXNGaWx0ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElGaWx0ZXIgZmlsdGVyLCBTdHJpbmcgdGFiU3RyLAotCQkJTGlzdCBhbHJlYWR5RXhpc3RzLCBPYmplY3QgaW5wdXQpIHsKLQkJdGhpcyhwYXJlbnRTaGVsbCwgZmlsdGVyLCBudWxsLCB0YWJTdHIsIGFscmVhZHlFeGlzdHMpOwotCQl0aGlzLmlucHV0ID0gaW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBGaWx0ZXJEaWFsb2cuIFRoaXMgY29uc3RydWN0b3Igd2lsbCB1c2UgcGFzc2VkIGZpbHRlci4KLQkgKiB0YWJTdHIgaXMgdXNlZCBmb3IgdGhlIHNlYXJjaHR5cGUgb25seS4gSW5pdGlhbGl6ZXMgdGhlIENvbnRlbnRQcm92aWRlcgotCSAqIGZvciB0aGUgdHJlZXZpZXdlci4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgSXRlbXNGaWx0ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElGaWx0ZXIgZmlsdGVyLAotCQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50LCBTdHJpbmcgdGFiU3RyKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCXRoaXMudGFiU3RyID0gdGFiU3RyOwotCi0JCWhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIoY29udGVudEVsZW1lbnQsIHRhYlN0ciwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JCWluaXRQcm92aWRlckZvclRhYnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbHRlckRpYWxvZy4gVGhpcyBjb25zdHJ1Y3RvciB3aWxsIHVzZSBwYXNzZWQgZmlsdGVyLgotCSAqIHRhYlN0ciBpcyB1c2VkIGZvciB0aGUgc2VhcmNodHlwZSBvbmx5LiBJbml0aWFsaXplcyB0aGUgQ29udGVudFByb3ZpZGVyCi0JICogZm9yIHRoZSB0cmVldmlld2VyLgotCSAqIAotCSAqLwotCXB1YmxpYyBJdGVtc0ZpbHRlckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSUZpbHRlciBmaWx0ZXIsCi0JCQlPYmplY3QgY29udGVudEVsZW1lbnQsIFN0cmluZyB0YWJTdHIsIExpc3QgYWxyZWFkeUV4aXN0cykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl0aGlzLnRhYlN0ciA9IHRhYlN0cjsKLQkJdGhpcy5hbHJlYWR5U2VsZWN0ZWRMaXN0ID0gYWxyZWFkeUV4aXN0czsKLQkJaGVscGVyID0gbmV3IEZpbHRlckhlbHBlcihjb250ZW50RWxlbWVudCwgdGFiU3RyLCBudWxsLCBudWxsLAotCQkJCWFscmVhZHlFeGlzdHMpOwotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCWluaXRQcm92aWRlckZvclRhYnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbHRlckRpYWxvZy4gT25seSBmb3IgbWV0aG9kY29uZmlndXJhdGlvbi4gVGhpcwotCSAqIGNvbnN0cnVjdG9yIHdpbGwgdXNlIHBhc3NlZCBmaWx0ZXIuIEluaXRpYWxpemVzIHRoZSBDb250ZW50UHJvdmlkZXIgZm9yCi0JICogdGhlIHRyZWV2aWV3ZXIuCi0JICogCi0JICovCi0JLy8gcHVibGljIEl0ZW1zRmlsdGVyRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBPYmplY3QgY29udGVudEVsZW1lbnQsCi0JLy8gTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWd1cmF0aW9uLCBTdHJpbmcgdGFiU3RyKSB7Ci0JLy8gc3VwZXIocGFyZW50U2hlbGwpOwotCS8vIHRoaXMuY29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQkvLyB0aGlzLnRhYlN0ciA9IHRhYlN0cjsKLQkvLyB0aGlzLmZpbHRlciA9IG51bGw7Ci0JLy8gdGhpcy5tZXRob2RDb25maWd1cmF0aW9uID0gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQkvLyBoZWxwZXIgPSBuZXcgRmlsdGVySGVscGVyKGNvbnRlbnRFbGVtZW50LCB0YWJTdHIsIG51bGwsIG51bGwsIG51bGwpOwotCS8vIGluaXRQcm92aWRlckZvclRhYnMoKTsKLQkvLyB9Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBpcyB2ZXJ5IGdlbmVyaWMsIGluIG9yZGVyIHRvIGluaXRpYWxpemUgZmlsdGVyLCBpbnB1dAotCSAqIGFuZCBjb250ZW50cHJvdmlkZXIgc2hvdWxkIGJlIGhhbmRsZWQgZXhwbGljaXRseSBieSBjYWxsaW5nIGJlbG93IG1ldGhvZC4KLQkgKiBzZXRGaWx0ZXIoSUZpbHRlcikgc2V0SW5wdXQoT2JqZWN0KQotCSAqIHNldENvbnRlbnRQcm92aWRlcihJU3RydWN0dXJlZFByb3ZpZGVyKQotCSAqIAotCSAqLwotCXB1YmxpYyBJdGVtc0ZpbHRlckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCWhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGlmIGEgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0JCQlzYXZlVmFsdWVzKCk7Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCQlpZihjb21wb3NlZEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpewotCQkJY29tcG9zZWRBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoYXQgdGhlIGNhbmNlbCBidXR0b24gb2YgdGhpcyBkaWFsb2cgaGFzIGJlZW4gcHJlc3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkgewotCQlzdXBlci5jYW5jZWxQcmVzc2VkKCk7Ci0JCWlmKGNvbXBvc2VkQWRhcHRlckZhY3RvcnkgIT0gbnVsbCl7Ci0JCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aXRsZSBmb3IgZGlhbG9nIGJveCBlZzogU2VsZWN0IERpYWxvZyBGb3IgUm9sZSwgZGlhbG9nVGl0bGUgbmVlZHMgdG8KLQkgKiAiUm9sZSIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgZGlhbG9nVGl0bGUpIHsKLQkJdGhpcy5kaWFsb2dUaXRsZSA9IGRpYWxvZ1RpdGxlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0JCWlmIChkaWFsb2dUaXRsZSA9PSBudWxsKQotCQkJZGlhbG9nVGl0bGUgPSB0YWJTdHI7Ci0JCXNoZWxsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX3RpdGxlICsgZGlhbG9nVGl0bGUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogKG5vbi1KYXZhZG9jKSBBZGRzIGJ1dHRvbnMgdG8gdGhpcyBkaWFsb2cncyBidXR0b24gYmFyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBidXR0b24gYmFyIGNvbXBvc2l0ZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGRpYWxvZyBhcmVhIGFuZCBjb250cm9scyBhbmQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSB0aGUKLQkgKiAgICAgICAgICAgIHBhcmVudCBjb21wb3NpdGUgdG8gY29udGFpbiB0aGUgZGlhbG9nIGFyZWEKLQkgKiBAcmV0dXJuIHRoZSBkaWFsb2cgYXJlYSBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCQlHcmlkRGF0YSBnRCA9IChHcmlkRGF0YSkgY29tcG9zaXRlLmdldExheW91dERhdGEoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCi0JCUxhYmVsIHR5cGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJewotCQkJdHlwZUxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX1R5cGVfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJCUdyaWREYXRhIGdEMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJdHlwZUxhYmVsLnNldExheW91dERhdGEoZ0QxKTsKLQotCQl9Ci0JCWZpbHRlclR5cGUgPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdEMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ0QxLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWdEMS53aWR0aEhpbnQgPSAzOTA7Ci0JCQlmaWx0ZXJUeXBlLnNldExheW91dERhdGEoZ0QxKTsKLQkJfQotCi0JCWlmICh0eXBlcyA9PSBudWxsKSB7Ci0JCQlmaWxsRmlsdGVyVHlwZUNvbWJvKCk7Ci0JCX0gZWxzZSB7Ci0JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHR5cGVzKTsKLQkJCWlmIChoZWxwZXIgIT0gbnVsbCkgewotCQkJCWZpbHRlclR5cGVTdHIgPSBmaWx0ZXJUeXBlLmdldEl0ZW0oMCk7Ci0JCQkJaGVscGVyLnNldEZpbHRlclR5cGVTdHIoZmlsdGVyVHlwZS5nZXRJdGVtKDApKTsKLQkJCQlpZiAodGFiU3RyID09IG51bGwpIHsKLQkJCQkJdGFiU3RyID0gZmlsdGVyVHlwZVN0cjsKLQkJCQkJaGVscGVyLnNldFRhYlN0cih0YWJTdHIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaWx0ZXJUeXBlLnNlbGVjdCgwKTsKLQotCQlMYWJlbCBjdHJsX3BhdHRlcm5MYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJewotCQkJY3RybF9wYXR0ZXJuTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfUGF0dGVybl90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQkJZ0QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJY3RybF9wYXR0ZXJuTGFiZWwuc2V0TGF5b3V0RGF0YShnRCk7Ci0JCX0KLQotCQljdHJsX3BhdHRlcm4gPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl7Ci0JCQlHcmlkRGF0YSBnRDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdEMS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQljdHJsX3BhdHRlcm4uc2V0TGF5b3V0RGF0YShnRDEpOwotCQkJY3RybF9wYXR0ZXJuLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJCW5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX1BhdHRlcm5fdGV4dCArICAKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfUGF0dGVybl9kZXNjcmlwdGlvbikpOwotCQl9Ci0JCUxhYmVsIGN0cmxfcGF0dGVybkxhYmVsMSA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJewotCQkJY3RybF9wYXR0ZXJuTGFiZWwxLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX1BhdHRlcm5fZGVzY3JpcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX3BhdHRlcm5MYWJlbDEuc2V0TGF5b3V0RGF0YShnRCk7Ci0JCX0KLQkJCi0JCUNvbXBvc2l0ZSBidXR0b25zQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsJCQotCQkKLQkJR3JpZERhdGEgZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWdkMi5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWJ1dHRvbnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZDIpOwotCQlHcmlkTGF5b3V0IGJ1dHRvbnNMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlidXR0b25zTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlidXR0b25zTGF5b3V0Lm1hcmdpblJpZ2h0ID0gMDsKLQkJYnV0dG9uc0NvbXBvc2l0ZS5zZXRMYXlvdXQoYnV0dG9uc0xheW91dCk7Ci0JCQotCQlleHBhbmRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNDb21wb3NpdGUsIFNXVC5CVVRUT04xKTsKLQotCQlleHBhbmRCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJleHBhbmRhbGwuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWV4cGFuZEJ1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfRXhwYW5kQWxsKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJZXhwYW5kQnV0dG9uLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcigKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19FeHBhbmRBbGwpKTsJCQotCi0JCWdkMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORwotCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQotCQlleHBhbmRCdXR0b24uc2V0TGF5b3V0RGF0YShnZDIpOwotCi0JCWNvbGxhcHNlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWNvbGxhcHNlQnV0dG9uLnNldEltYWdlKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkiY29sbGFwc2VhbGwuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0KLQkJY29sbGFwc2VCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsKTsgLy8kTk9OLU5MUy0xJAotCQljb2xsYXBzZUJ1dHRvbi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsKSk7Ci0JCQotCQlnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCi0JCWNvbGxhcHNlQnV0dG9uLnNldExheW91dERhdGEoZ2QyKTsKLQkJCi0JCWNyZWF0ZUxpbmUoY29tcG9zaXRlLCAzKTsKLQkJY3JlYXRlVmlld2VyTGFiZWwoY29tcG9zaXRlKTsKLQkJLy8gY3JlYXRlIGEgdHJlZXZpZXdlciBhcmVhLgotCQljcmVhdGVWaWV3ZXIoY29tcG9zaXRlKTsKLQotCQlyZXN0b3JlTGFzdFNldHRpbmdzKCk7Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX0JyaWVmRGVzY3JpcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfYnJpZWZfZGVzYyA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5XUkFQCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQkJewotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJCWdkLmhlaWdodEhpbnQgPSA2MDsKLQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRMYXlvdXREYXRhKGdkKTsKLQkJfQotCQkvLyBSZXN0b3JlIHRoZSBsYXN0IHN0YXRlCi0JCWNyZWF0ZUxpbmUoY29tcG9zaXRlLCAzKTsKLQotCQkvLyBSZXR1cm4gcmVzdWx0cy4KLQkJYWRkTGlzdGVuZXIoKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgdmlld2VyIGluIHRoZSBwYXJlbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAodmlld2VyU2VsZWN0aW9uU2luZ2xlKSB7Ci0JCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMCi0JCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCX0gZWxzZSB7Ci0JCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwKLQkJCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJfQotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQotCQkvLyBTZXQgdGhlIGlucHV0IHRvIHRyZWVWaWV3ZXIKLQkJdHJlZVZpZXdlci5zZXRJbnB1dChnZXRJbnB1dCgpKTsKLQotCQl0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJdHJlZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKHRoaXMpOwotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0JCWlmICh0YWJTdHIuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0cmVlVmlld2VyLnNldFNvcnRlcihuZXcgRmlsdGVyU29ydGVyRm9yQWxsKCkpOwotCQl9IGVsc2UgewotCQkJdHJlZVZpZXdlci5zZXRTb3J0ZXIobmV3IEZpbHRlclNvcnRlcigpKTsKLQkJfQotCi0JCUdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJewotCQkJc3BlYy53aWR0aEhpbnQgPSAzMDA7Ci0JCQlzcGVjLmhlaWdodEhpbnQgPSAzMDA7Ci0JCQlzcGVjLmhvcml6b250YWxTcGFuID0gMzsKLQkJCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoc3BlYyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGlucHV0IGlmIGV4dGVybmFsbHkgc2V0IGJ5IHNldElucHV0IGludm9rZXIuCi0JICogRWxzZSwgY2FsY3VsYXRlcyB0aGUgaW5wdXQgYmFzZWQgb24gdGhlIE9iamVjdCBzZXQgdG8gdGhlIGRpYWxvZy4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRJbnB1dCgpewotCQlpZihpbnB1dCAhPSBudWxsKXsKLQkJCXJldHVybiBpbnB1dDsKLQkJfWVsc2V7Ci0JCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCQkJCVByb2Nlc3MgcHJvY2VzcyA9IChQcm9jZXNzKWNvbnRlbnRFbGVtZW50OwotCQkJCQkJaWYgKHByb2Nlc3MuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJCWlmICghKHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFKQotCQkJCQkJCQkJfHwgdGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUk9BRE1BUCkgCi0JCQkJCQkJCQl8fCB0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUykpKSB7Ci0JCQkJCQkJcmV0dXJuIHByb2Nlc3MuZUNvbnRhaW5lcigpOwotCQkJCQkJfSBlbHNlCi0JCQkJCQkJcmV0dXJuIHByb2Nlc3M7Ci0JCQkJCQl9Ci0JCQkJfSAKLQkJCQlyZXR1cm4gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KChFT2JqZWN0KSBjb250ZW50RWxlbWVudCk7Ci0JCQl9IAotCQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTGluZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbmNvbCkgewotCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMCi0JCQkJfCBTV1QuQk9MRCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbmNvbDsKLQkJbGluZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVmlld2VyTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgCQlpZiAodmlld2VyTGFiZWwgIT0gbnVsbCkgewotICAgCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KHZpZXdlckxhYmVsKTsKLSAgIAkJfQotICAgCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUoYm9vbGVhbiBzaW5nbGUpIHsKLQkJdmlld2VyU2VsZWN0aW9uU2luZ2xlID0gc2luZ2xlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lciNkb3VibGVDbGljayhvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBzLmdldEZpcnN0RWxlbWVudCgpOwotCQllbGVtZW50ID0gTGlicmFyeVV0aWwudW53cmFwKGVsZW1lbnQpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzCi0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQKLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudAotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJc2VsZWN0ZWRMaXN0LmFkZChlbGVtZW50KTsKLQkJfSAKLQkJc2F2ZUxhc3RTZXR0aW5ncygpOwotCQljbG9zZSgpOwotCQlpZihjb21wb3NlZEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpewotCQkJY29tcG9zZWRBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRpYWxvZyBzdG9yZSB0byBjYWNoZSB2YWx1ZXMgaW50bwotCSAqLwotCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKSB7Ci0JCURpYWxvZ1NldHRpbmdzIGRpYWxvZ1NldHRpbmdzID0gKERpYWxvZ1NldHRpbmdzKSBBdXRob3JpbmdVSVBsdWdpbgotCQkJCS5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IChEaWFsb2dTZXR0aW5ncykgZGlhbG9nU2V0dGluZ3MKLQkJCQkuZ2V0U2VjdGlvbihESUFMT0dfTkFNRSArIFNUT1JFX0VYUEFOREVEX0xFVkVMX0lEKTsKLQkJaWYgKHNlY3Rpb24gPT0gbnVsbCkKLQkJCXNlY3Rpb24gPSAoRGlhbG9nU2V0dGluZ3MpIGRpYWxvZ1NldHRpbmdzLmFkZE5ld1NlY3Rpb24oRElBTE9HX05BTUUKLQkJCQkJKyBTVE9SRV9FWFBBTkRFRF9MRVZFTF9JRCk7Ci0JCXJldHVybiBzZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIFVzZSB0aGUgZGlhbG9nIHNldHRpbmdzIHRvIHJlc3RvcmUgd2lkZ2V0IHZhbHVlcyB0byB0aGUgdmFsdWVzIHRoYXQgdGhleQotCSAqIGhlbGQgbGFzdCB0aW1lIHRoaXMgZGlhbG9nIHdhcyB1c2VkIHRvIGNvbXBsZXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZUxhc3RTZXR0aW5ncygpIHsKLQkJRElBTE9HX05BTUUgPSB0YWJTdHI7Ci0JCURpYWxvZ1NldHRpbmdzIGRpYWxvZ1NldHRpbmdzID0gKERpYWxvZ1NldHRpbmdzKSBnZXREaWFsb2dTZXR0aW5ncygpOwotCQlTdHJpbmcgdGVtcCA9IGRpYWxvZ1NldHRpbmdzLmdldChESUFMT0dfTkFNRSArIFBBVFRFUk5fSUQpOyAKLQkJaWYgKHRlbXAgIT0gbnVsbCAmJiB0ZW1wLmxlbmd0aCgpID4gMCkgeyAKLQkJCXBhdHRlcm4gPSBkaWFsb2dTZXR0aW5ncy5nZXQoRElBTE9HX05BTUUgKyBQQVRURVJOX0lEKTsgCi0JCQlmaWx0ZXJUeXBlU3RyID0gZGlhbG9nU2V0dGluZ3MuZ2V0KERJQUxPR19OQU1FICsgVFlQRV9JRCk7IAotCQkJZmlsdGVyVHlwZS5zZXRUZXh0KGZpbHRlclR5cGVTdHIpOwotCQkJcmVnZXhQYXR0ZXJuID0gZ2V0UmVnRXgocGF0dGVybik7Ci0JCQkKLQkJCS8vVHJpbSAiKiIgZnJvbSBwYXR0ZXJuIHN0cmluZyBiZWZvcmUgZGlzcGxheS4gVGhpcyBhY3Rpb24gaXMganVzdCBmb3IgZGlzcGxheS4KLS8vCQkJaWYocGF0dGVybiAhPSBudWxsKXsKLS8vCQkJCWlmKHBhdHRlcm4ubGFzdEluZGV4T2YoRmlsdGVyQ29uc3RhbnRzLkFOWV9TVFJJTkcpIAotLy8JCQkJCQk9PSBwYXR0ZXJuLmxlbmd0aCgpLTEpewotLy8JCQkJCXBhdHRlcm4gPSBwYXR0ZXJuLnN1YnN0cmluZygwLCBwYXR0ZXJuLmxlbmd0aCgpLTEpOwotLy8JCQkJfQotLy8JCQl9Ci0JCQljdHJsX3BhdHRlcm4uc2V0VGV4dChwYXR0ZXJuKTsKLQkJCQotCQkJaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0JCQkJaGVscGVyLnNldFBhdHRlcm4ocGF0dGVybik7Ci0JCQkJaGVscGVyLnNldFJlZ2V4UGF0dGVybihyZWdleFBhdHRlcm4pOwotCQkJCWhlbHBlci5zZXRGaWx0ZXJUeXBlU3RyKGZpbHRlclR5cGVTdHIpOwotCQkJfQotCQkJaW5pdFByb3ZpZGVyRm9yVGFicygpOwotCi0JCX0KLQkJTGlzdCBlbGVtZW50cyA9IChMaXN0KSBGaWx0ZXJDb25zdGFudHMuaGFzaE1hcC5nZXQoRElBTE9HX05BTUUKLQkJCQkrIFNUT1JFX0VYUEFOREVEX0xFVkVMX0lEKTsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwgfHwgZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQl0cmVlVmlld2VyLmV4cGFuZEFsbCgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGVsZW1lbnRzICE9IG51bGwgJiYgIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJdHJ5IHsKLQkJCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkRWxlbWVudHMoZWxlbWVudHMudG9BcnJheSgpKTsKLQkJCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgdHJhdmVyc2VUcmVlKFRyZWVJdGVtW10gaXRlbXMsIExpc3QgbGlzdCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUcmVlSXRlbVtdIGl0ZW1zeCA9IGl0ZW1zW2ldLmdldEl0ZW1zKCk7Ci0JCQlpZiAoaXRlbXN4Lmxlbmd0aCA+IDEpIHsKLQkJCQlsaXN0LmFkZChpdGVtc1tpXS5nZXREYXRhKCkpOwotCQkJCXRyYXZlcnNlVHJlZShpdGVtc3gsIGxpc3QpOwotCQkJfSBlbHNlIHsKLQkJCQlsaXN0LmFkZChpdGVtc1tpXS5nZXREYXRhKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2luY2UgT0sgd2FzIHByZXNzZWQsIHdyaXRlIHdpZGdldCB2YWx1ZXMgdG8gdGhlIGRpYWxvZyBzdG9yZSBzbyB0aGF0Ci0JICogdGhleSB3aWxsIHBlcnNpc3QgaW50byB0aGUgbmV4dCBpbnZvY2F0aW9uIG9mIHRoaXMgZGlhbG9nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVZhbHVlcygpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0cmVlVmlld2VyCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCU9iamVjdFtdIG9iamVjdEFyciA9IHNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdEFyci5sZW5ndGg7IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBMaWJyYXJ5VXRpbC51bndyYXAob2JqZWN0QXJyW2ldKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQgCi0JCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzIAotCQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudAotCQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudAotCQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJc2VsZWN0ZWRMaXN0LmFkZChvYmopOwotCQkJCX0gCi0JCQl9Ci0JCX0KLQkJc2F2ZUxhc3RTZXR0aW5ncygpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBsYXN0IHNldHRpbmdzIG9mIGRpYWxvZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTGFzdFNldHRpbmdzKCkgewotCi0JCS8vIGVjbGlwc2UgZG9jcyBmb3JJRGlhbG9nU2V0dGluZ3MgZm9yIHVuZGVyc3RhbmRpbmcuCi0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCURJQUxPR19OQU1FID0gdGFiU3RyOwotCQlPYmplY3RbXSBleHBhbmRlZEVsZW1lbnRzID0gdHJlZVZpZXdlci5nZXRFeHBhbmRlZEVsZW1lbnRzKCk7Ci0JCUxpc3QgZXhwYW5kTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gU3RyaW5nW10gZXhwYW5kZWRDYXRlZ29yeUlkcyA9IG5ldyBTdHJpbmdbZXhwYW5kZWRFbGVtZW50cy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGFuZGVkRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBleHBhbmRlZEVsZW1lbnRzW2ldOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotCQkJCWV4cGFuZExpc3QuYWRkKGV4cGFuZGVkRWxlbWVudHNbaV0pOwotCQkJfQotCQl9Ci0JCXNldHRpbmdzLnB1dChESUFMT0dfTkFNRSArIFBBVFRFUk5fSUQsIHBhdHRlcm4pOwotCQlzZXR0aW5ncy5wdXQoRElBTE9HX05BTUUgKyBUWVBFX0lELCBmaWx0ZXJUeXBlU3RyKTsKLQkJRmlsdGVyQ29uc3RhbnRzLmhhc2hNYXAucHV0KERJQUxPR19OQU1FICsgU1RPUkVfRVhQQU5ERURfTEVWRUxfSUQsCi0JCQkJZXhwYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhhdCB0aGUgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgZXZlbnQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGNoYW5nZQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCXVwZGF0ZVNlbGVjdGlvbihldmVudCk7Ci0JCXVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIGJ1dHRvbiBlbmFibGVtZW50IHN0YXRlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJ1dHRvbnMoKSB7Ci0JCS8vIG9rQnV0dG9uLnNldEVuYWJsZWQoZ2V0U2VsZWN0aW9uKCkubGVuZ3RoID4gMCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnRPYmplY3QoT2JqZWN0IGNvbnRlbnRFbGVtZW50KSB7Ci0JCXJldHVybiBNZXRob2RFbGVtZW50VXRpbC5nZXRNZXRob2RNb2RlbChjb250ZW50RWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBzZWxlY3Rpb24gb2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNlbGVjdGlvbihTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJLy8gQXJyYXlMaXN0IGRlc2NzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQlPYmplY3Qgc2VsZWN0ZWQgPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHx8Ci0JCQkJc2VsZWN0ZWQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyKXsKLQkJCU9iamVjdCB1bndyYXAgPSAgVG5nVXRpbC51bndyYXAoc2VsZWN0ZWQpOwotCQkJc2V0QnJpZWZEZXNjcmlwdGlvbih1bndyYXApOwotCQl9ZWxzZSB7Ci0JCQlzZXRCcmllZkRlc2NyaXB0aW9uKHNlbGVjdGVkKTsKLQkJfQotCX0KLQkvKioKLQkgKiBTZXQgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIHRvIGNvbnRyb2wKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0QnJpZWZEZXNjcmlwdGlvbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCVN0cmluZyBkZXNjID0gKChNZXRob2RFbGVtZW50KSBlbGVtZW50KS5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoZGVzYyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaWxsRmlsdGVyVHlwZUNvbWJvKCkgewotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgQ29uZmlndXJhdGlvbkZpbHRlcikgewotCQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1sxXTsKLQkJCXN0clswXSA9IChTdHJpbmcpIHRhYlN0cjsKLQkJCWZpbHRlclR5cGUuc2V0SXRlbXMoc3RyKTsKLQkJCWZpbHRlclR5cGVTdHIgPSBzdHJbMF07Ci0JCX0gZWxzZSBpZiAoRmlsdGVyQ29uc3RhbnRzLmNhdGVnb3J5U3Rycy5jb250YWlucyh0YWJTdHIpKSB7Ci0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nWzJdOwotCQkJc3RyWzBdID0gKFN0cmluZykgdGFiU3RyOwotCQkJc3RyWzFdID0gRmlsdGVyQ29uc3RhbnRzLk1FVEhPX1BMVUdJTlM7Ci0JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHN0cik7Ci0JCQlmaWx0ZXJUeXBlU3RyID0gc3RyWzBdOwotCQl9IGVsc2UgaWYgKEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUy5lcXVhbHNJZ25vcmVDYXNlKHRhYlN0cikpIHsKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbMl07Ci0JCQlzdHJbMF0gPSAoU3RyaW5nKSB0YWJTdHI7Ci0JCQlzdHJbMV0gPSBGaWx0ZXJDb25zdGFudHMuTUVUSE9fUExVR0lOUzsKLQkJCWZpbHRlclR5cGUuc2V0SXRlbXMoc3RyKTsKLQkJCWZpbHRlclR5cGVTdHIgPSBzdHJbMF07Ci0JCX0gZWxzZSBpZiAoRmlsdGVyQ29uc3RhbnRzLmJyZWFrZG93bkVsZW1lbnRzLmNvbnRhaW5zKHRhYlN0cikpIHsKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbMV07Ci0JCQlzdHJbMF0gPSAoU3RyaW5nKSB0YWJTdHI7Ci0JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHN0cik7Ci0JCQlmaWx0ZXJUeXBlU3RyID0gc3RyWzBdOwotCQl9IGVsc2UgaWYgKEZpbHRlckNvbnN0YW50cy5jb250ZW50RWxlbWVudFN0cnMuY29udGFpbnModGFiU3RyKSkgewotCQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1szXTsKLQkJCXN0clswXSA9IHRhYlN0cjsKLQkJCXN0clsxXSA9IEZpbHRlckNvbnN0YW50cy5DT05URU5UX1BBQ0tBR0VTOwotCQkJc3RyWzJdID0gRmlsdGVyQ29uc3RhbnRzLk1FVEhPX1BMVUdJTlM7Ci0JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHN0cik7Ci0JCQlmaWx0ZXJUeXBlU3RyID0gc3RyWzBdOwotCQl9IGVsc2UgaWYgKEZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFMuZXF1YWxzKHRhYlN0cikpIHsKLQkJCVN0cmluZyBzcGFjZSA9ICItIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1sxNF07Ci0JCQlpbnQgaSA9IDA7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5DT05URU5UX1BBQ0tBR0VTOwotCQkJc3RyW2krK10gPSBzcGFjZSArIEZpbHRlckNvbnN0YW50cy5ST0xFUzsKLQkJCXN0cltpKytdID0gc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuVEFTS1M7Ci0JCQlzdHJbaSsrXSA9IHNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUzsKLQkJCXN0cltpKytdID0gc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLlJPTEVTRVRTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RUWVBFUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5UT09MUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuUFJPQ0VTU0VTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuTUVUSE9fUExVR0lOUzsKLQkJCWZpbHRlclR5cGUuc2V0SXRlbXMoc3RyKTsKLQkJCWZpbHRlclR5cGVTdHIgPSBzdHJbMF07Ci0JCX0gZWxzZSBpZiAoRmlsdGVyQ29uc3RhbnRzLkNPTkZJR19DT05URU5UX0VMRU1FTlQuZXF1YWxzKHRhYlN0cikpIHsKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbMV07Ci0JCQlzdHJbMF0gPSAoU3RyaW5nKSB0YWJTdHI7Ci0JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHN0cik7Ci0JCQlmaWx0ZXJUeXBlU3RyID0gc3RyWzBdOwotCQl9IGVsc2UgewotCQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1sxXTsKLQkJCXN0clswXSA9IChTdHJpbmcpIHRhYlN0cjsKLQkJCWZpbHRlclR5cGUuc2V0SXRlbXMoc3RyKTsKLQkJCWZpbHRlclR5cGVTdHIgPSBzdHJbMF07Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBsb25nIHRpbWVyID0gMzsKLQlwdWJsaWMgbG9uZyBsYXN0dGltZXIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkKLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcigpIHsKLQkJY3RybF9wYXR0ZXJuLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQotCQkJCS8vIFNldCB0aW1lcgotCQkJCWxvbmcgY3VycmVudHRpbWVyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJaWYobGFzdHRpbWVyK3RpbWVyID4gY3VycmVudHRpbWVyKXsKLQkJCQkJcmV0dXJuOwotCQkJCX1lbHNlewotCQkJCQlsYXN0dGltZXIgID0gY3VycmVudHRpbWVyOwotCQkJCX0KLQkJCQkKLQkJCQl0cmVlVmlld2VyLmdldFRyZWUoKS5jbGVhckFsbCh0cnVlKTsKLQkJCQlpZiAoY3RybF9wYXR0ZXJuLmdldFRleHQoKSAhPSBudWxsCi0JCQkJCQkmJiBjdHJsX3BhdHRlcm4uZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJcGF0dGVybiA9IGN0cmxfcGF0dGVybi5nZXRUZXh0KCkudHJpbSgpOwotLy8JCQkJCWlmKHBhdHRlcm4uaW5kZXhPZihGaWx0ZXJDb25zdGFudHMuQU5ZX1NUUklORyk+IC0xIAotLy8JCQkJCQkJfHwgcGF0dGVybi5pbmRleE9mKEZpbHRlckNvbnN0YW50cy5BTllfQ0hBUkFDVEVSKSA+IC0xKXsKLS8vCQkJCQkJCi0vLwkJCQkJfWVsc2V7Ci0vLwkJCQkJCXBhdHRlcm4gPSBwYXR0ZXJuK0ZpbHRlckNvbnN0YW50cy5BTllfU1RSSU5HOwotLy8JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlwYXR0ZXJuID0gRmlsdGVyQ29uc3RhbnRzLkFOWV9TVFJJTkc7Ci0JCQkJCS8vcmV0dXJuOwotCQkJCX0KLQkJCQlyZWdleFBhdHRlcm4gPSBnZXRSZWdFeChwYXR0ZXJuKTsKLQkJCQlpZiAoaGVscGVyICE9IG51bGwpIHsKLQkJCQkJaGVscGVyLnNldFBhdHRlcm4ocGF0dGVybik7Ci0JCQkJCWhlbHBlci5zZXRSZWdleFBhdHRlcm4ocmVnZXhQYXR0ZXJuKTsKLQkJCQkJaGVscGVyLnNldEZpbHRlclR5cGVTdHIoZmlsdGVyVHlwZVN0cik7Ci0JCQkJCWhlbHBlci5zZXRUYWJTdHIoZmlsdGVyVHlwZVN0cik7Ci0JCQkJfQotCQkJCXJlZnJlc2hUcmVlVmlld2VyKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZpbHRlclR5cGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIHVwZGF0ZUZvbnRMaXN0KCk7Ci0JCQkJaWYgKGZpbHRlclR5cGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IC0xKSB7Ci0JCQkJCWZpbHRlclR5cGVTdHIgPSBmaWx0ZXJUeXBlLmdldEl0ZW0oZmlsdGVyVHlwZQotCQkJCQkJCS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCQl9Ci0JCQkJZmlsdGVyVHlwZVN0ci50cmltKCk7Ci0JCQkJaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0JCQkJCWhlbHBlci5zZXRQYXR0ZXJuKHBhdHRlcm4pOwotCQkJCQloZWxwZXIuc2V0UmVnZXhQYXR0ZXJuKHJlZ2V4UGF0dGVybik7Ci0JCQkJCWhlbHBlci5zZXRGaWx0ZXJUeXBlU3RyKGZpbHRlclR5cGVTdHIpOwotCQkJCQloZWxwZXIuc2V0VGFiU3RyKGZpbHRlclR5cGVTdHIpOwotCQkJCX0KLQkJCQkvLyBpbml0UHJvdmlkZXJGb3JUYWJzKCk7Ci0JCQkJcmVmcmVzaFRyZWVWaWV3ZXIoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlbGVjdGlvbmV2ZW50KSB7Ci0JCQl9Ci0JCX0pOwotCQlleHBhbmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CQkJCQotCQkJCWV4cGFuZE9yQ29sbGFwc2UodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCQljb2xsYXBzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlleHBhbmRPckNvbGxhcHNlKGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQlwdWJsaWMgQXJyYXlMaXN0IGdldFNlbGVjdGVkSXRlbXMoKSB7Ci0JCXJldHVybiBzZWxlY3RlZExpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRQcm92aWRlckZvclRhYnMoKSB7Ci0KLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQlpZiAoZmlsdGVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JRmlsdGVyKSB7Ci0JCQkJaWYoZmlsdGVyIGluc3RhbmNlb2YgSUNhdGVnb3J5RmlsdGVyKXsKLQkJCQkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IgY29udGVudGNhdGVnb3J5LgotCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3NDUyCi0JCQkJCWhlbHBlci5zZXRDb250ZW50Q2F0ZWdvcnlUYWJTdHIodGFiU3RyKTsKLQkJCQl9Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklGaWx0ZXIpIGZpbHRlcikKLQkJCQkJCS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX0gZWxzZSBpZiAoZmlsdGVyIGluc3RhbmNlb2YgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIpIHsKLQkJCQkoKERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyKSBmaWx0ZXIpLnNldEhlbHBlcihoZWxwZXIpOwotCQkJfWVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIEV4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcikgewotCQkJCSgoRXhQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yKSBmaWx0ZXIpLnNldEhlbHBlcihoZWxwZXIpOwotCQkJfQotCQl9Ci0JCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJUHJvY2Vzc0ZpbHRlcikgewotCQkJaWYgKHRhYlN0cgotCQkJCQkuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JTKSkgewotCQkJCWFkYXB0ZXJGYWN0b3J5ID1UbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKTsKLQkJCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJY29tcG9zZWRBZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQl9IGVsc2UgaWYgKHRhYlN0cgotCQkJCQkuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuUk9MRV9ERVNDUklQVE9SUykpIHsKLQkJCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpOyAKLQkJCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpOwotCQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcik7IAotCQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRJdGVtc0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeGlzdGluZ0VsZW1lbnRzKExpc3QgbGlzdCkgewotCQl0aGlzLmFscmVhZHlTZWxlY3RlZExpc3QgPSBsaXN0OwotCQlpZiAoaGVscGVyICE9IG51bGwpIHsKLQkJCWhlbHBlci5zZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KGxpc3QpOwotCQl9Ci0JfQotCi0JcHVibGljIEZpbHRlckhlbHBlciBnZXRIZWxwZXIoKSB7Ci0JCXJldHVybiB0aGlzLmhlbHBlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RmlsdGVyVHlwZUFycmF5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIHNldHMgdGhlIENvbnRlbnRQcm92aWRlciB1c2VkIGJ5IFRyZWVWaWV3ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudFByb3ZpZGVyKElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciwKLQkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgY29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQl0aGlzLmNvbnRlbnRQcm92aWRlciA9IGNvbnRlbnRQcm92aWRlcjsKLQkJdGhpcy5jb21wb3NlZEFkYXB0ZXJGYWN0b3J5ID0gY29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKgotCSAqIFBhc3NpbmcgU3RyaW5nW10gYXJyYXkgZmlsbHMgdGhlIEZpbHRlclR5cGUgbGlzdCBpbiBkcm9wZG93biBjb21ibyBib3guCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZXMoU3RyaW5nW10gc3RyKSB7Ci0JCXRoaXMudHlwZXMgPSBzdHI7Ci0JfQotCi0JLyoKLQkgKiBzZXQgdGhlIEZpbHRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCWlmIChoZWxwZXIgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZmlsdGVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JRmlsdGVyKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklGaWx0ZXIpIHRoaXMuZmlsdGVyKQotCQkJCQkJLnNldEhlbHBlcihoZWxwZXIpOwotCQkJfSBlbHNlIGlmICh0aGlzLmZpbHRlciBpbnN0YW5jZW9mIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyKSB7Ci0JCQkJKChEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcikgdGhpcy5maWx0ZXIpLnNldEhlbHBlcihoZWxwZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQl0aGlzLmlucHV0ID0gaW5wdXQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXJMYWJlbChTdHJpbmcgdmlld2VyTGFiZWwpIHsKLQkJdGhpcy52aWV3ZXJMYWJlbCA9IHZpZXdlckxhYmVsOwotCX0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hUcmVlVmlld2VyKCl7Ci0JCS8vIFRvIGltcHJvdmUgcGVyZm9ybWFuY2Ugb2YgZmlsdGVyLCBmaWx0ZXIgZmlyc3QgYW5kIHJlc2V0IHZpc2libGUgdG8KLQkJLy8gdHJ1ZS5UaGlzIHdpbGwgYXZvaWQgdGhlIGZsaWNrZXJpbmcgaW4gVUkgYXQgdGltZSBvZiBmaWx0ZXJpbmcKLQkJLy8gZWxlbWVudHMgaW4gdGhlIHRyZWUgc3RydWN0dXJlCi0JCQotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5jbGVhckFsbCh0cnVlKTsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQl0cmVlVmlld2VyLmV4cGFuZEFsbCgpOwotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGV4cGFuZE9yQ29sbGFwc2UoYm9vbGVhbiBleHBhbmQpewotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJaWYoZXhwYW5kKXsKLQkJCXRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCX1lbHNlewotCQkJdHJlZVZpZXdlci5jb2xsYXBzZUFsbCgpOwotCQl9Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCQotCXByaXZhdGUgUGF0dGVybiBnZXRSZWdFeChTdHJpbmcgcGF0dGVybil7Ci0JCXRyeXsKLQkJCXJldHVybiBQYXR0ZXJuQ29uc3RydWN0b3IuY3JlYXRlUGF0dGVybihwYXR0ZXJuLCBmYWxzZSwgZmFsc2UpOwotCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotCQkJcmV0dXJuIFBhdHRlcm5Db25zdHJ1Y3Rvci5jcmVhdGVQYXR0ZXJuKEZpbHRlckNvbnN0YW50cy5BTllfU1RSSU5HLCBmYWxzZSwgZmFsc2UpOyAKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9NZXRob2RBZGRJbWFnZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvTWV0aG9kQWRkSW1hZ2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGFlYWY5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9NZXRob2RBZGRJbWFnZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MuQWRkSW1hZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLQotLyoqCi0gKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIGltYWdlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIEhUTUwKLSAqIDxpbWc+IHRhZyBpbiB0aGUgUmljaCBUZXh0IEVkaXRvci4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEFkZEltYWdlRGlhbG9nIGV4dGVuZHMgQWRkSW1hZ2VEaWFsb2cgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9IRUlHSFQgPSA2MDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1dJRFRIID0gNjAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSEVJR0hUID0gMjAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfV0lEVEggPSAyMDA7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudDsKLQotCXByaXZhdGUgRmlsZSBmaWxlVG9Db3B5OwotCi0JcHJpdmF0ZSBTdHJpbmcgdXJsOwotCi0JcHJpdmF0ZSBpbnQgaGVpZ2h0ID0gREVGQVVMVF9IRUlHSFQ7Ci0KLQlwcml2YXRlIGludCB3aWR0aCA9IERFRkFVTFRfV0lEVEg7Ci0KLQlwcml2YXRlIFN0cmluZyBhbHRUYWcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUZXh0IGhlaWdodFRleHQ7Ci0KLQlwcml2YXRlIFRleHQgd2lkdGhUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IGFsdFRhZ1RleHQ7Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAob2tCdXR0b24gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXVybCA9IHVybFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJCQkJaGVpZ2h0ID0gSW50ZWdlci5wYXJzZUludChoZWlnaHRUZXh0LmdldFRleHQoKS50cmltKCkpOwotCQkJCQl3aWR0aCA9IEludGVnZXIucGFyc2VJbnQod2lkdGhUZXh0LmdldFRleHQoKS50cmltKCkpOwotCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKHVybC5sZW5ndGgoKSA+IDAgJiYgaGVpZ2h0ID4gMAotCQkJCQkJCSYmIHdpZHRoID4gMCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBzaGVsbC4KLQkgKiBAcGFyYW0gbWV0aG9kRWxlbWVudAotCSAqICAgICAgICAgICAgQSBtZXRob2QgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQWRkSW1hZ2VEaWFsb2coU2hlbGwgcGFyZW50LCBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5tZXRob2RFbGVtZW50ID0gbWV0aG9kRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkJhc2VEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUKLQkgKiAgICAgIHBhcmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQkoKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDQ7Ci0JCSgoR3JpZERhdGEpIHVybFRleHQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJdXJsVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcih1cmxUZXh0TGlzdGVuZXIpOwotCQl1cmxUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCQlicm93c2VCdXR0b24ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoYnJvd3NlU2VsZWN0aW9uQWRhcHRlcik7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJLmdldEFjdGl2ZVNoZWxsKCksIFNXVC5PUEVOKTsKLQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkKLQkJCQkJCSsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCSsgUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgobWV0aG9kRWxlbWVudCkpOwotCQkJCVN0cmluZyBhdHRhY2hGaWxlID0gZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoYXR0YWNoRmlsZSAhPSBudWxsICYmIGF0dGFjaEZpbGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmaWxlVG9Db3B5ID0gbmV3IEZpbGUoZGlhbG9nLmdldEZpbHRlclBhdGgoKSwgZGlhbG9nCi0JCQkJCQkJCS5nZXRGaWxlTmFtZSgpKTsKLQkJCQkJCXVybCA9ICIuLyIgKyBSZXNvdXJjZUhlbHBlci5nZXRVUkxGb3JBdHRhY2htZW50KGZpbGVUb0NvcHksIG1ldGhvZEVsZW1lbnQsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdXJsVGV4dC5zZXRUZXh0KHVybCk7Ci0KLQkJCQkJCS8vIFRyeSB0byBnZXQgdGhlIGltYWdlIGluZm8uCi0JCQkJCQlzZXRJbWFnZUluZm8oZmlsZVRvQ29weS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCUxhYmVsIGhlaWdodExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQloZWlnaHRMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmhlaWdodExhYmVsX3RleHQpOyAvLyROT04tTkxTLTEkCi0KLQkJaGVpZ2h0VGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWhlaWdodFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCWhlaWdodFRleHQuc2V0VGV4dCgiIiArIERFRkFVTFRfSEVJR0hUKTsgLy8kTk9OLU5MUy0xJAotCQloZWlnaHRUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCQlMYWJlbCBpbWFnZVNpemVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJewotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdkLndpZHRoSGludCA9IDMwMDsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWdkLnZlcnRpY2FsU3BhbiA9IDI7Ci0JCQlnZC5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCQlpbWFnZVNpemVMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJfQotCQlpbWFnZVNpemVMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmltYWdlU2l6ZUxhYmVsX3RleHQpOyAvLyROT04tTkxTLTEkCi0KLQkJTGFiZWwgd2lkdGhMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJd2lkdGhMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLndpZHRoTGFiZWxfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQotCQl3aWR0aFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl3aWR0aFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCXdpZHRoVGV4dC5zZXRUZXh0KCIiICsgREVGQVVMVF9XSURUSCk7IC8vJE5PTi1OTFMtMSQKLQkJd2lkdGhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCQlMYWJlbCBhbHRMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYWx0TGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5hbHRUYWdMYWJlbF90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQlhbHRUYWdUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJewotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJCWFsdFRhZ1RleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCX0KLQkJYWx0VGFnVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQkJYWx0VGFnID0gYWx0VGFnVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgdG8gYmUgY29waWVkIHRvIGEgcmVzb3VyY2UgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBGaWxlIGdldEZpbGVUb0NvcHkoKSB7Ci0JCXJldHVybiBmaWxlVG9Db3B5OwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRJbWFnZUluZm8oU3RyaW5nIGltYWdlTmFtZSkgewotCQlGaWxlIGltYWdlRmlsZSA9IG5ldyBGaWxlKGltYWdlTmFtZSk7Ci0JCWlmIChpbWFnZUZpbGUuZXhpc3RzKCkpIHsKLQkJCUltYWdlRGF0YSBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKGltYWdlTmFtZSk7Ci0JCQloZWlnaHRUZXh0LnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaW1hZ2VEYXRhLmhlaWdodCkpOwotCQkJd2lkdGhUZXh0LnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaW1hZ2VEYXRhLndpZHRoKSk7Ci0JCX0gZWxzZSB7Ci0JCQloZWlnaHRUZXh0LnNldFRleHQoU3RyaW5nLnZhbHVlT2YoREVGQVVMVF9IRUlHSFQpKTsKLQkJCXdpZHRoVGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKERFRkFVTFRfV0lEVEgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIFVSTC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBoZWlnaHQuCi0JICovCi0JcHVibGljIGludCBnZXRIZWlnaHQoKSB7Ci0JCXJldHVybiBNYXRoLm1pbihNQVhfSEVJR0hULCBNYXRoLm1heCgxMCwgaGVpZ2h0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2Ugd2lkdGguCi0JICovCi0JcHVibGljIGludCBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIE1hdGgubWluKE1BWF9XSURUSCwgTWF0aC5tYXgoMTAsIHdpZHRoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgQUxUIHRhZy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFsdFRhZygpIHsKLQkJcmV0dXJuIGFsdFRhZzsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJdXJsID0gTmV0VXRpbC5lbmNvZGVGaWxlVVJMKHVybCk7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvTWV0aG9kQWRkTGlua0RpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvTWV0aG9kQWRkTGlua0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZTM1OGJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01ldGhvZEFkZExpbmtEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5BZGRMaW5rRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuTmV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkFkZExpbmtEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IGEgbGluayB0eXBlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIEhUTUwgPGE+Ci0gKiB0YWcgaW4gdGhlIFJpY2ggVGV4dCBFZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RBZGRMaW5rRGlhbG9nIGV4dGVuZHMgQWRkTGlua0RpYWxvZyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElOS19VUkwgPSAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJTktfRklMRSA9IExJTktfVVJMICsgMTsKLQotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5LX0VMRU1FTlRfTElOSyA9IExJTktfVVJMICsgMjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5LX0VMRU1FTlRfTElOS19XSVRIX1RZUEUgPSBMSU5LX1VSTCArIDM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElOS19FTEVNRU5UX0xJTktfV0lUSF9VU0VSX1RFWFQgPSBMSU5LX1VSTCArIDQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTEVNRU5UX1RZUEVfTEFCRUxTID0gewotCQkJTGlicmFyeVVJUmVzb3VyY2VzLmxpbmtUb1VSTF9uYW1lLAotCQkJTGlicmFyeVVJUmVzb3VyY2VzLmxpbmtUb0ZpbGVfbmFtZSwKLQkJCUxpYnJhcnlVSVJlc291cmNlcy5lbGVtZW50TGlua19uYW1lLAotCQkJTGlicmFyeVVJUmVzb3VyY2VzLmVsZW1lbnRMaW5rV2l0aFR5cGVfbmFtZSwKLQkJCUxpYnJhcnlVSVJlc291cmNlcy5lbGVtZW50TGlua1dpdGhVc2VyVGV4dF9uYW1lIH07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9MSU5LX0lOX05FV19XSU5ET1dfQVRUUklCVVRFID0gInRhcmdldD1cIl9ibGFua1wiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgcmljaFRleHQ7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudDsKLQotCXByaXZhdGUgQ29tYm8gbGlua1R5cGVDb21ibzsKLQotCXByaXZhdGUgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIG9wZW5MaW5rQ2hlY2tib3g7Ci0KLQlwcml2YXRlIGludCBsaW5rVHlwZTsKLQotCXByaXZhdGUgYm9vbGVhbiBvcGVuTGlua0luTmV3V2luZG93ID0gdHJ1ZTsKLQotCXByaXZhdGUgRmlsZSBmaWxlVG9Db3B5OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IHNoZWxsLgotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgQSByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQWRkTGlua0RpYWxvZyhTaGVsbCBwYXJlbnQsIElNZXRob2RSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihwYXJlbnQsIHJpY2hUZXh0LmdldEJhc2VQYXRoKCkpOwotCQl0aGlzLnJpY2hUZXh0ID0gcmljaFRleHQ7Ci0JCXRoaXMubWV0aG9kRWxlbWVudCA9IHJpY2hUZXh0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkJhc2VEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUKLQkgKiAgICAgIHBhcmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0KLQkJTGFiZWwgbGlua1R5cGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGlua1R5cGVMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFkZExpbmtEaWFsb2dfbGlua1R5cGUpOwotCQlsaW5rVHlwZUxhYmVsLm1vdmVBYm92ZSh1cmxMYWJlbCk7Ci0KLQkJbGlua1R5cGVDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgY29tYm9HcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQljb21ib0dyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGlua1R5cGVDb21iby5zZXRMYXlvdXREYXRhKGNvbWJvR3JpZERhdGEpOwotCQlsaW5rVHlwZUNvbWJvLnNldEl0ZW1zKEVMRU1FTlRfVFlQRV9MQUJFTFMpOwotCQlsaW5rVHlwZUNvbWJvLnNldFRleHQoRUxFTUVOVF9UWVBFX0xBQkVMU1swXSk7Ci0JCWxpbmtUeXBlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlsaW5rVHlwZSA9IGxpbmtUeXBlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChsaW5rVHlwZSAhPSBMSU5LX1VSTCk7Ci0JCQkJdXJsRGlzcGxheU5hbWVMYWJlbC5zZXRFbmFibGVkKGxpbmtUeXBlID09IExJTktfVVJMKTsKLQkJCQl1cmxEaXNwbGF5TmFtZVRleHQuc2V0RW5hYmxlZChsaW5rVHlwZSA9PSBMSU5LX1VSTCk7Ci0JCQkJaWYgKGxpbmtUeXBlID09IExJTktfVVJMKSB7Ci0JCQkJCXVybERpc3BsYXlOYW1lVGV4dAotCQkJCQkJCS5zZXRUZXh0KHJpY2hUZXh0LmdldFNlbGVjdGVkKCkuZ2V0VGV4dCgpKTsKLQkJCQl9IGVsc2UgewotCQkJCQl1cmxEaXNwbGF5TmFtZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJb3BlbkxpbmtDaGVja2JveC5zZXRFbmFibGVkKGxpbmtUeXBlID09IExJTktfVVJMCi0JCQkJCQl8fCBsaW5rVHlwZSA9PSBMSU5LX0ZJTEUpOwotCQkJCXVybFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobGlua1R5cGUgIT0gTElOS19GSUxFKSB7Ci0JCQkJCWZpbGVUb0NvcHkgPSBudWxsOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCX0pOwotCQlsaW5rVHlwZUNvbWJvLm1vdmVBYm92ZSh1cmxMYWJlbCk7Ci0KLQkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuQlJPV1NFX0JVVFRPTl9URVhUKTsKLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmIChsaW5rVHlwZSA9PSBMSU5LX0ZJTEUpIHsKLQkJCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuT1BFTik7Ci0JCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGJhc2VQYXRoKTsKLQkJCQkJU3RyaW5nIGF0dGFjaEZpbGUgPSBkaWFsb2cub3BlbigpOwotCQkJCQlpZiAoYXR0YWNoRmlsZSAhPSBudWxsICYmIGF0dGFjaEZpbGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWZpbGVUb0NvcHkgPSBuZXcgRmlsZShkaWFsb2cuZ2V0RmlsdGVyUGF0aCgpLAotCQkJCQkJCQkJZGlhbG9nLmdldEZpbGVOYW1lKCkpOwotCQkJCQkJCVN0cmluZyBwYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0VVJMRm9yQXR0YWNobWVudCgKLQkJCQkJCQkJCWZpbGVUb0NvcHksIG1ldGhvZEVsZW1lbnQsIGZhbHNlKTsKLQkJCQkJCQlTdHJpbmcgdXJsID0gIjxhIGhyZWY9XCIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKFBsYXRmb3JtLmdldE9TKCkuZXF1YWxzKFBsYXRmb3JtLldTX1dJTjMyKSkgewotCQkJCQkJCQl1cmwgKz0gTmV0VXRpbAotCQkJCQkJCQkJCS5lbmNvZGVGaWxlVVJMKE5ldFV0aWwuRklMRV9VUklfUFJFRklYCi0JCQkJCQkJCQkJCQkrIHBhdGgpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXVybCArPSBOZXRVdGlsLmVuY29kZUZpbGVVUkwoIi4vIiArIHBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCXVybCArPSAiXCIiICsgKG9wZW5MaW5rSW5OZXdXaW5kb3cgPyAiICIgKyBPUEVOX0xJTktfSU5fTkVXX1dJTkRPV19BVFRSSUJVVEUgOiAiIikgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJCQkJIj4iICsgZmlsZVRvQ29weS5nZXROYW1lKCkgKyAiPC9hPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCXVybFRleHQuc2V0VGV4dCh1cmwpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gTWV0aG9kRWxlbWVudCBsaW5rCi0JCQkJZWxzZSB7Ci0JCQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IEFkZExpbmtGaWx0ZXIoKSB7Ci0JCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQlpZihvYmogaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHJldHVybiBmYWxzZTsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIG1ldGhvZEVsZW1lbnQsCi0JCQkJCQkJRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUyk7Ci0JCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTKTsKLQkJCQkJZmQub3BlbigpOwotCQkJCQlBcnJheUxpc3Qgc2VsID0gZmQuZ2V0U2VsZWN0ZWRJdGVtcygpOwotCQkJCQlpZiAoc2VsLnNpemUoKSA+IDApIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIHNlbAotCQkJCQkJCQkuZ2V0KDApOwotCQkJCQkJU3RyaW5nIHVybCA9IG51bGw7Ci0JCQkJCQlTdHJpbmcgaHJlZiA9IFJlc291cmNlSGVscGVyLmdldFVybChzZWxlY3RlZEVsZW1lbnQsCi0JCQkJCQkJCW1ldGhvZEVsZW1lbnQsICJodG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChsaW5rVHlwZSA9PSBMSU5LX0VMRU1FTlRfTElOS19XSVRIX1VTRVJfVEVYVCkgewotCQkJCQkJCVN0cmluZyBsaW5rTmFtZSA9ICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KQotCQkJCQkJCQkJLmdldFNlbGVjdGVkKCkuZ2V0VGV4dCgpOwotCQkJCQkJCWlmIChsaW5rTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCQkJCQkJbGlua05hbWUgPSBzZWxlY3RlZEVsZW1lbnQuZ2V0TmFtZSgpOwotCQkJCQkJCXVybCA9IFJlc291cmNlSGVscGVyCi0JCQkJCQkJCQkuZ2V0RWxlbWVudExpbmsoc2VsZWN0ZWRFbGVtZW50LCBsaW5rTmFtZSwKLQkJCQkJCQkJCQkJImZpbGU6Ly8iICsgaHJlZik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYm9vbGVhbiB3aXRoVHlwZSA9IChsaW5rVHlwZSA9PSBMSU5LX0VMRU1FTlRfTElOS19XSVRIX1RZUEUpID8gdHJ1ZQotCQkJCQkJCQkJOiBmYWxzZTsKLQkJCQkJCQl1cmwgPSBSZXNvdXJjZUhlbHBlcgotCQkJCQkJCQkJLmdldEVsZW1lbnRMaW5rKHNlbGVjdGVkRWxlbWVudCwgd2l0aFR5cGUsCi0JCQkJCQkJCQkJCSJmaWxlOi8vIiArIGhyZWYpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQl1cmxUZXh0LnNldFRleHQodXJsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZUJ1dHRvbi5tb3ZlQWJvdmUodXJsRGlzcGxheU5hbWVMYWJlbCk7Ci0KLQkJb3BlbkxpbmtDaGVja2JveCA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlHcmlkRGF0YSBjaGVja0JveEdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWNoZWNrQm94R3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlvcGVuTGlua0NoZWNrYm94LnNldExheW91dERhdGEoY2hlY2tCb3hHcmlkRGF0YSk7Ci0JCW9wZW5MaW5rQ2hlY2tib3guc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5vcGVuTGlua0NoZWNrYm94X3RleHQpOwotCQlvcGVuTGlua0NoZWNrYm94LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJb3BlbkxpbmtDaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlvcGVuTGlua0luTmV3V2luZG93ID0gb3BlbkxpbmtDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJdXJsRGlzcGxheU5hbWVUZXh0LnNldFRleHQocmljaFRleHQuZ2V0U2VsZWN0ZWQoKS5nZXRUZXh0KCkpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSB0byBiZSBjb3BpZWQgdG8gYSByZXNvdXJjZSBmb2xkZXIuCi0JICovCi0JcHVibGljIEZpbGUgZ2V0RmlsZVRvQ29weSgpIHsKLQkJcmV0dXJuIGZpbGVUb0NvcHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGluayBzaG91bGQgYmUgb3BlbmVkIGluIGEgbmV3IGJyb3dzZXIKLQkgKiB3aW5kb3cuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0T3BlbkxpbmtJbk5ld1dpbmRvdygpIHsKLQkJcmV0dXJuIG9wZW5MaW5rSW5OZXdXaW5kb3c7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCVN0cmluZyB1cmwgPSB1cmxUZXh0LmdldFRleHQoKTsKLQkJaWYgKHVybCAhPSBudWxsICYmIHVybC5sZW5ndGgoKSA+IDApIHsKLQkJCWlmIChsaW5rVHlwZSA9PSBMSU5LX1VSTCkgewotCQkJCVN0cmluZyB1cmxEaXNwbGF5TmFtZSA9IHVybERpc3BsYXlOYW1lVGV4dC5nZXRUZXh0KCk7Ci0JCQkJaWYgKHVybERpc3BsYXlOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXVybERpc3BsYXlOYW1lID0gdXJsOwotCQkJCX0KLQkJCQlTdHJpbmcgZnVsbFVSTCA9ICI8YSBocmVmPVwiIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXVybAotCQkJCQkJKyAiXCIiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJKG9wZW5MaW5rSW5OZXdXaW5kb3cgPyAiICIgKyBPUEVOX0xJTktfSU5fTkVXX1dJTkRPV19BVFRSSUJVVEUgOiAiIikgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCSI+IiArIHVybERpc3BsYXlOYW1lICsgIjwvYT4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlsaW5rLnNldFVSTChmdWxsVVJMKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbGluay5zZXRVUkwodXJsKTsKLQkJCX0KLQkJfQotCi0JCS8vIFNldCB3aWRnZXQgdGV4dCB0byBibGFuayBzbyBzdXBlci5va1ByZXNzZWQgZG9lc24ndCBvdmVyd3JpdGUgdGhlCi0JCS8vIGFib3ZlLgotCQl1cmxUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvTW92ZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvTW92ZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZmVhNmQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01vdmVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuVmlld0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5TdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kLk1vdmVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogRGlhbG9nIGZvciBtb3ZpbmcgTWV0aG9kRWxlbWVudCB3aXRoaW4gTWV0aG9kTGlicmFyeS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1vdmVEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQotCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGVsZW1lbnRzOwotCi0JLy8gcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gbG9ja2VkVUkgPSBmYWxzZTsKLQotCS8vIFRoZSBwcm9ncmVzcyBtb25pdG9yCi0JcHJpdmF0ZSBQcm9ncmVzc01vbml0b3JQYXJ0IHByb2dyZXNzTW9uaXRvclBhcnQ7Ci0KLQlwcml2YXRlIEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKLQotCXByaXZhdGUgT2JqZWN0IGRlc3RpbmF0aW9uOwotCi0JcHJpdmF0ZSBDdXJzb3Igd2FpdEN1cnNvcjsKLQotCXByaXZhdGUgYm9vbGVhbiBtb3Zpbmc7Ci0KLQlwdWJsaWMgTW92ZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgQ29sbGVjdGlvbiBlbGVtZW50c1RvTW92ZSwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbikgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuZWRpdGluZ0RvbWFpbiA9IGVkaXRpbmdEb21haW47Ci0KLQkJLy8gZmlsdGVyIG91dCB0aGUgcHJlZGVmaW5lZCBlbGVtZW50cyB0byBwcmV2ZW50IHRoZW0gZnJvbSBnZXR0aW5nIG1vdmVkCi0JCS8vCi0JCWVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvTW92ZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmIFRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBlKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ19kZXN0aW5hdGlvbl90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCi0JCXRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlhZGFwdGVyRmFjdG9yeSkpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJdHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCS8vIHRyZWVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLQotCQlHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXsKLQkJCXNwZWMud2lkdGhIaW50ID0gMzAwOwotCQkJc3BlYy5oZWlnaHRIaW50ID0gMzAwOwotCQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShzcGVjKTsKLQkJfQotCi0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQotCQkvLyBJbnNlcnQgYSBwcm9ncmVzcyBtb25pdG9yCi0JCUdyaWRMYXlvdXQgcG1sYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlwbWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJcHJvZ3Jlc3NNb25pdG9yUGFydCA9IGNyZWF0ZVByb2dyZXNzTW9uaXRvclBhcnQoY29tcG9zaXRlLCBwbWxheW91dCk7Ci0JCXByb2dyZXNzTW9uaXRvclBhcnQKLQkJCQkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXByb2dyZXNzTW9uaXRvclBhcnQuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJd2FpdEN1cnNvciA9IHBhcmVudC5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1DdXJzb3IoCi0JCQkJU1dULkNVUlNPUl9XQUlUKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBQcm9ncmVzc01vbml0b3JQYXJ0IGNyZWF0ZVByb2dyZXNzTW9uaXRvclBhcnQoCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlLCBHcmlkTGF5b3V0IHBtbGF5b3V0KSB7Ci0JCXJldHVybiBuZXcgUHJvZ3Jlc3NNb25pdG9yUGFydChjb21wb3NpdGUsIHBtbGF5b3V0LCBTV1QuREVGQVVMVCkgewotCQkJU3RyaW5nIGN1cnJlbnRUYXNrID0gbnVsbDsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuUHJvZ3Jlc3NNb25pdG9yUGFydCNzZXRCbG9ja2VkKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBzZXRCbG9ja2VkKElTdGF0dXMgcmVhc29uKSB7Ci0JCQkJc3VwZXIuc2V0QmxvY2tlZChyZWFzb24pOwotCQkJCWlmICghbG9ja2VkVUkpLy8gRG8gbm90IHNob3cgYmxvY2tlZCBpZiB3ZSBhcmUgbG9ja2luZyB0aGUgVUkKLQkJCQkJZ2V0QmxvY2tlZEhhbmRsZXIoKS5zaG93QmxvY2tlZChnZXRTaGVsbCgpLCB0aGlzLCByZWFzb24sCi0JCQkJCQkJY3VycmVudFRhc2spOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5Qcm9ncmVzc01vbml0b3JQYXJ0I2NsZWFyQmxvY2tlZCgpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGNsZWFyQmxvY2tlZCgpIHsKLQkJCQlzdXBlci5jbGVhckJsb2NrZWQoKTsKLQkJCQlpZiAoIWxvY2tlZFVJKS8vIERvIG5vdCB2bGVhciBpZiB3ZSBuZXZlciBzZXQgaXQKLQkJCQkJZ2V0QmxvY2tlZEhhbmRsZXIoKS5jbGVhckJsb2NrZWQoKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuUHJvZ3Jlc3NNb25pdG9yUGFydCNiZWdpblRhc2soamF2YS5sYW5nLlN0cmluZywKLQkJCSAqICAgICAgaW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBiZWdpblRhc2soU3RyaW5nIG5hbWUsIGludCB0b3RhbFdvcmspIHsKLQkJCQlzdXBlci5iZWdpblRhc2sobmFtZSwgdG90YWxXb3JrKTsKLQkJCQljdXJyZW50VGFzayA9IG5hbWU7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQjc2V0VGFza05hbWUoamF2YS5sYW5nLlN0cmluZykKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgc2V0VGFza05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCQlzdXBlci5zZXRUYXNrTmFtZShuYW1lKTsKLQkJCQljdXJyZW50VGFzayA9IG5hbWU7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQjc3ViVGFzayhqYXZhLmxhbmcuU3RyaW5nKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBzdWJUYXNrKFN0cmluZyBuYW1lKSB7Ci0JCQkJc3VwZXIuc3ViVGFzayhuYW1lKTsKLQkJCQkvLyBJZiB3ZSBoYXZlbid0IGdvdCBhbnl0aGluZyB5ZXQgdXNlIHRoaXMgdmFsdWUgZm9yIG1vcmUKLQkJCQkvLyBjb250ZXh0Ci0JCQkJaWYgKGN1cnJlbnRUYXNrID09IG51bGwpCi0JCQkJCWN1cnJlbnRUYXNrID0gbmFtZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotCQluZXdTaGVsbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1vdmVEaWFsb2dfbW92ZV90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJZGVzdGluYXRpb24gPSBUbmdVdGlsLnVud3JhcCgoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCS5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjb2tQcmVzc2VkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCWlmIChkb01vdmUoKSkgewotCQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZERlc3RpbmF0aW9uKCkgewotCQkvLyBwcmV2ZW50aW5nIG1vdmluZyBlbGVtZW50cyB0byBjYXRlZ29yeQotCQkvLwotCQlpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGRvIG5vdCBhbGxvdyBtb3ZpbmcgaW50byBTdGFuZGFyZCBDYXRlZ29yaWVzCi0JCWlmIChkZXN0aW5hdGlvbiBpbnN0YW5jZW9mIFN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY2hlY2sgY29udGFpbmVycyBmb3IgY29tcGF0aWJsZSB0eXBlcyB3aWxsIG5vdCB3b3JrIGlmIHdlIHdhbnQgdG8gbW92ZSBhIHN1Yi1hcnRpZmFjdAotCQkvLyB0byBhIGNvbnRlbnQgcGFja2FnZQotCQkvLwotCQkKLS8vCQkvLyBkbyBub3QgYWxsb3cgbW92ZSBpZiBkZXN0aW5hdGlvbiBpcyBub3QgdGhlIHNhbWUgdHlwZSBhcyBldmVyeQotLy8JCS8vIGVsZW1lbnRzJyBlQ29udGFpbmVyCi0vLwkJT2JqZWN0IHJlYWxEZXN0ID0gZGVzdGluYXRpb247Ci0vLwkJaWYgKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpIHsKLS8vCQkJcmVhbERlc3QgPSAoKFRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSBkZXN0aW5hdGlvbikKLS8vCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0vLwkJfQotLy8JCWlmIChkZXN0aW5hdGlvbiBpbnN0YW5jZW9mIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyKSB7Ci0vLwkJCXJlYWxEZXN0ID0gKChUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcikgZGVzdGluYXRpb24pLmdldFRhcmdldCgpOwotLy8JCX0JCQotLy8JCXRyeSB7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLS8vCQkJCWlmIChlIGluc3RhbmNlb2YgRU9iamVjdCkgewotLy8JCQkJCWlmICghcmVhbERlc3QuZ2V0Q2xhc3MoKS5pc0luc3RhbmNlKAotLy8JCQkJCQkJKChFT2JqZWN0KSBlKS5lQ29udGFpbmVyKCkpKQotLy8JCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLS8vCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLQotCQlpZiAoRGVwZW5kZW5jeUNoZWNrZXIubmV3Q2hlY2spIHsKLQkJCWlmIChkZXN0aW5hdGlvbiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCWlmICghIERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQKLQkJCQkJCSgoVmFyaWFiaWxpdHlFbGVtZW50KSBkZXN0aW5hdGlvbiwgZWxlbWVudHMpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQkJLy8gU3ViIEFydGlmYWN0IGNpcmN1bGFyIGNoZWNrIGNvZGUKLQkJZWxzZSBpZihkZXN0aW5hdGlvbiBpbnN0YW5jZW9mIEFydGlmYWN0KXsKLQkJCXJldHVybiBEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRm9yQXJ0aWZhY3RzKChBcnRpZmFjdClkZXN0aW5hdGlvbiwgCi0JCQkJCWVsZW1lbnRzKTsKLQkJfQkJCi0JCQotCQlDb21tYW5kIGFkZENvbW1hbmQgPSBBZGRDb21tYW5kLmNyZWF0ZShlZGl0aW5nRG9tYWluLCBkZXN0aW5hdGlvbiwKLQkJCQludWxsLCBlbGVtZW50cyk7Ci0JCWJvb2xlYW4gcmVzdWx0OwotCQl0cnkgewotCQkJcmVzdWx0ID0gYWRkQ29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlhZGRDb21tYW5kLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoIXJlc3VsdCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCWRlc3RpbmF0aW9uID0gKChUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcikgZGVzdGluYXRpb24pCi0JCQkJCS5nZXRUYXJnZXQoKTsKLQkJfQotCi0JCS8vIElTdGF0dXMgc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KChFT2JqZWN0KQotCQkvLyBkZXN0aW5hdGlvbiwgZ2V0U2hlbGwoKSk7Ci0JCS8vIGlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCS8vIHJldHVybiB0cnVlOwotCQkvLyB9Ci0JCS8vIGVsc2UgewotCQkvLyBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheSgKLQkJLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSVBsdWdpbi5tb3ZlRGlhbG9nLnRpdGxlIiksCi0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJLy8gc3RhdHVzKTsKLQkJLy8gcmV0dXJuIGZhbHNlOwotCQkvLyB9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBkb01vdmUoKSB7Ci0JCWlmIChkZXN0aW5hdGlvbiA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHByb2JsZW0gPSBBdXRob3JpbmdVSVJlc291cmNlcy5Nb3ZlRGlhbG9nX25vbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZzsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1vdmVEaWFsb2dfc2VsZWN0ZGVzdGluYXRpb25fdGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIHByb2JsZW0sIG1zZyk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoIWlzVmFsaWREZXN0aW5hdGlvbigpKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHByb2JsZW0gPSBBdXRob3JpbmdVSVJlc291cmNlcy5Nb3ZlRGlhbG9nX2ludmFsaWRfbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZzsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1vdmVEaWFsb2dfdmFsaWRkZXN0aW5hdGlvbl90ZXh0OyAvLyROT04tTkxTLTEkCi0JCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpOwotCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgcHJvYmxlbSwgbXNnKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoCi0JCQkJCShFT2JqZWN0KSBkZXN0aW5hdGlvbiwgZ2V0U2hlbGwoKSk7Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5Nb3ZlRGlhbG9nX2Nhbm5vdE1vZGlmeURlc3RpbmF0aW9uOyAvLyROT04tTkxTLTEkCi0JCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpOwotCQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZywgc3RhdHVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCW1vdmluZyA9IHRydWU7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQkJc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCi0JCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJcHJvZ3Jlc3NNb25pdG9yUGFydC5zZXRWaXNpYmxlKHRydWUpOwotCQlwcm9ncmVzc01vbml0b3JQYXJ0Ci0JCQkJLmJlZ2luVGFzaygKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLk1vdmVEaWFsb2dfbW92aW5nX3RleHQsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLQkJTW92ZU9wZXJhdGlvbiBtb3ZlT3AgPSBudWxsOwotCQl0cnkgewotCQkJLy8gY3JlYXRlIGNvbW1hbmQKLQkJCS8vCi0JCQlDb21tYW5kIGNvbW1hbmQgPSBBZGRDb21tYW5kLmNyZWF0ZShlZGl0aW5nRG9tYWluLCBkZXN0aW5hdGlvbiwKLQkJCQkJbnVsbCwgZWxlbWVudHMpOwotCi0JCQltb3ZlT3AgPSBuZXcgTW92ZU9wZXJhdGlvbihjb21tYW5kLCBwcm9ncmVzc01vbml0b3JQYXJ0LCBzaGVsbCk7Ci0JCQltb3ZlT3AucnVuKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb3ZpbmcgPSBmYWxzZTsKLQkJCXByb2dyZXNzTW9uaXRvclBhcnQuZG9uZSgpOwotCi0JCQkvLyBjbGVhciBjdXJzb3IKLQkJCWlmIChzaGVsbCAhPSBudWxsICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlzaGVsbC5zZXRDdXJzb3IobnVsbCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobW92ZU9wICE9IG51bGwpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gbW92ZU9wLmdldFN0YXR1cygpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yVGl0bGU7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvck1lc3NhZ2U7IC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJdGl0bGUsIG1lc3NhZ2UsIHN0YXR1cyk7Ci0JCQkJaWYgKG1vdmVPcC5yZWxvYWROZWVkZWQoKSkgewotCQkJCQlWaWV3SGVscGVyLnJlbG9hZEN1cnJlbnRMaWJyYXJ5KHNoZWxsLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJaWYgKG1vdmluZykKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9PcGVuQ29uZmlnRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9PcGVuQ29uZmlnRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiYTA0ZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvT3BlbkNvbmZpZ0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuQ29uZmlnRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0NPTkZJR19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuT3BlbkNvbmZpZ0RpYWxvZ25ld2NvbmZpZ190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQkvLyBDb21ibyBjb21ib19jb25maWdzOwotCVN0cmluZyBzZWVsY3RlZE5hbWU7Ci0KLQlCdXR0b25bXSBjdHJsX2NvbmZpZ3MgPSBudWxsOwotCi0JVGV4dCBjdHJsX25ld19jb25maWcgPSBudWxsOwotCi0JcHVibGljIE9wZW5Db25maWdEaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBhcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlmaW5hbCBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlhcmVhLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJewotCQkJR3JvdXAgZyA9IG5ldyBHcm91cChhcmVhLCBTV1QuTk9ORSk7Ci0JCQl7Ci0JCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCQlnLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCQlnLnNldExheW91dChsYXlvdXQpOwotCQkJfQotCi0JCQlTdHJpbmdbXSBuYW1lcyA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRNZXRob2RDb25maWd1cmF0aW9uTmFtZXMoCi0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCQlpZiAobmFtZXMgIT0gbnVsbCkgewotCQkJCWN0cmxfY29uZmlncyA9IG5ldyBCdXR0b25bbmFtZXMubGVuZ3RoICsgMV07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdHJsX2NvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBORVdfQ09ORklHX1RFWFQ7Ci0JCQkJCWlmIChpIDwgbmFtZXMubGVuZ3RoKSB7Ci0JCQkJCQluYW1lID0gbmFtZXNbaV07Ci0JCQkJCX0KLQkJCQkJY3RybF9jb25maWdzW2ldID0gbmV3IEJ1dHRvbihnLCBTV1QuUkFESU8pOwotCQkJCQljdHJsX2NvbmZpZ3NbaV0uc2V0VGV4dChuYW1lKTsKLQkJCQkJewotCQkJCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoCi0JCQkJCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQkJCQljdHJsX2NvbmZpZ3NbaV0uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWN0cmxfbmV3X2NvbmZpZyA9IG5ldyBUZXh0KGcsIFNXVC5CT1JERVIpOwotCQkJewotCQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQkJCWN0cmxfbmV3X2NvbmZpZy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCX0KLQotCQkJLy8gc2V0IGltYWdlIGFuZCB0aXRsZQotCQkJc3VwZXIKLQkJCQkJLmdldFNoZWxsKCkKLQkJCQkJLnNldFRleHQoCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuT3BlbkNvbmZpZ0RpYWxvZ29wZW5jb25maWdfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBhcmVhOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlzZWVsY3RlZE5hbWUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGN0cmxfY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGN0cmxfY29uZmlnc1tpXS5nZXRTZWxlY3Rpb24oKSkgewotCQkJCXNlZWxjdGVkTmFtZSA9IGN0cmxfY29uZmlnc1tpXS5nZXRUZXh0KCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc2VlbGN0ZWROYW1lID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChzZWVsY3RlZE5hbWUuZXF1YWxzKE5FV19DT05GSUdfVEVYVCkpIHsKLQkJCXNlZWxjdGVkTmFtZSA9IGN0cmxfbmV3X2NvbmZpZy5nZXRUZXh0KCk7Ci0JCX0KLQotCQlpZiAoc2VlbGN0ZWROYW1lID09IG51bGwgfHwgc2VlbGN0ZWROYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3Rpb24oKSB7Ci0JCWlmIChzdXBlci5vcGVuKCkgPT0gRGlhbG9nLk9LKSB7Ci0JCQlyZXR1cm4gc2VlbGN0ZWROYW1lOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1JlbmFtZUZpbGVDb25mbGljdERpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvUmVuYW1lRmlsZUNvbmZsaWN0RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJmYTkxZmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvUmVuYW1lRmlsZUNvbmZsaWN0RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIE9wZW5zIGRpYWxvZyB0byBhdHRhY2ggY3RybF9maWxlcGF0aHMKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW5hbWVGaWxlQ29uZmxpY3REaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JLyoqCi0JICogVGhlIE9LIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCi0JLyoqCi0JICogVGhlIENhbmNlbCBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjYW5jZWxCdXR0b247Ci0KLQkvKioKLQkgKiBUaGUgb3ZlcndyaXRlIGJ1dHRvbgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gb3ZlcldyaXRlQnV0dG9uOwotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQotCXByaXZhdGUgVGV4dCBjdHJsX2ZpbGVOYW1lOwotCi0JcHJpdmF0ZSBpbnQgT1ZFUl9XUklURV9JRCA9IDIyOwotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2VTdHI7Ci0JcHJpdmF0ZSBTdHJpbmcgZmlsZU5hbWU7Ci0JcHJpdmF0ZSBCdXR0b24gYnV0dG9uX3JlcGxhY2U7Ci0JcHJpdmF0ZSBCdXR0b24gYnV0dG9uX3VuaXF1ZTsKLQkKLQlwcml2YXRlIFN0cmluZyBkZXN0aW5hdGlvbjsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXB1YmxpYyBSZW5hbWVGaWxlQ29uZmxpY3REaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBkaWFsb2dBcmVhLmdldExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IChHcmlkRGF0YSkgZGlhbG9nQXJlYS5nZXRMYXlvdXREYXRhKCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gMTA7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDQ1MDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQkKLQkJLy8gQ3JlYXRlIG1lc3NhZ2UgYXJlYS4KLQkJCQkJCQotCQlJbWFnZSBpbWFnZSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1dBUk5JTkcpOwotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgTGFiZWwgaW1hZ2VMYWJlbCA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTlVMTCk7Ci0gICAgICAgICAgICBpbWFnZS5zZXRCYWNrZ3JvdW5kKGltYWdlTGFiZWwuZ2V0QmFja2dyb3VuZCgpKTsKLSAgICAgICAgICAgIGltYWdlTGFiZWwuc2V0SW1hZ2UoaW1hZ2UpOwotICAgICAgICAgICAgaW1hZ2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgKLSAgICAgICAgICAgICAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotICAgICAgICB9Ci0JCQotCQlMYWJlbCBtZXNzYWdlID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5XUkFQKTsKLQkJaWYobWVzc2FnZVN0ciAhPSBudWxsKXsKLQkJCW1lc3NhZ2Uuc2V0VGV4dChtZXNzYWdlU3RyKTsKLQkJfQotCQlHcmlkRGF0YSBkYXRhMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhMS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCW1lc3NhZ2Uuc2V0TGF5b3V0RGF0YShkYXRhMSk7Ci0JCQotCQlMYWJlbCBlbXB0eSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7IGVtcHR5LnNldFRleHQoIiIpOwotCQlMYWJlbCBub3RlID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJbm90ZS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfaWNvblNlY3Rpb25fZmlsZU5hbWVDb25mbGljdF9ub3RlKTsKLQkJR3JpZERhdGEgZGF0YTIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YTIuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlub3RlLnNldExheW91dERhdGEoZGF0YTIpOwotCQkKLQkJZW1wdHkgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOyBlbXB0eS5zZXRUZXh0KCIiKTsKLQkJR3JpZERhdGEgZGF0YTMgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YTMuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlkYXRhMy5oZWlnaHRIaW50ID0gMTA7Ci0JCWVtcHR5LnNldExheW91dERhdGEoZGF0YTMpOwotCQkKLQkJZW1wdHkgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOyBlbXB0eS5zZXRUZXh0KCIiKTsKLQkJTGFiZWwgc2VsZWN0QWN0aW9uID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJc2VsZWN0QWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9pY29uU2VjdGlvbl9maWxlTmFtZV9zZWxlY3RBY3Rpb25fbGFiZWwpOwotCQlHcmlkRGF0YSBkYXRhNCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhNC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXNlbGVjdEFjdGlvbi5zZXRMYXlvdXREYXRhKGRhdGE0KTsKLQkJCi0JCWVtcHR5ID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsgZW1wdHkuc2V0VGV4dCgiIik7Ci0JCWJ1dHRvbl9yZXBsYWNlID0gbmV3IEJ1dHRvbihkaWFsb2dBcmVhLCBTV1QuUkFESU8pOwotCQlMYWJlbCByZXBsYWNlX2xhYmVsID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJcmVwbGFjZV9sYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfaWNvblNlY3Rpb25fZmlsZU5hbWVfcmVwbGFjZV9tc2cpOwotCQlidXR0b25fcmVwbGFjZS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0KLQkJZW1wdHkgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpO2VtcHR5LnNldFRleHQoIiIpOwotCQlidXR0b25fdW5pcXVlID0gbmV3IEJ1dHRvbihkaWFsb2dBcmVhLCBTV1QuUkFESU8pOwotCQlMYWJlbCB1bmlxdWVMYWJlbCA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCXVuaXF1ZUxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9pY29uU2VjdGlvbl9maWxlTmFtZV91bmlxdWVfbXNnKTsKLQkJYnV0dG9uX3VuaXF1ZS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkKLQkJLy9DcmVhdGUgbGFiZWwgYXJlYS4gLS0gVE9ETzogZmluZCBkaWZmZXJlbnQgd2F5IGluc3RlYWQgb2YgZW1wdHkgbGFiZWxzLgotCQllbXB0eSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7ZW1wdHkuc2V0VGV4dCgiIik7Ci0JCWVtcHR5ID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTtlbXB0eS5zZXRUZXh0KCIiKTsKLQkJY3RybF9maWxlTmFtZSA9IG5ldyBUZXh0KGRpYWxvZ0FyZWEsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBncmlkRGF0YTEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJZ3JpZERhdGExLndpZHRoSGludCA9IDIwMDsKLQkJZ3JpZERhdGExLnZlcnRpY2FsQWxpZ25tZW50PSBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVI7Ci0JCWN0cmxfZmlsZU5hbWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YTEpOwotCQlpZihmaWxlTmFtZSAhPSBudWxsKXsKLQkJCWN0cmxfZmlsZU5hbWUuc2V0VGV4dChmaWxlTmFtZSk7Ci0JCQljdHJsX2ZpbGVOYW1lLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JCWN0cmxfZmlsZU5hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKG9rQnV0dG9uICE9IG51bGwpIHsKLQkJCQkJb2tCdXR0b24KLQkJCQkJCQkuc2V0RW5hYmxlZChjdHJsX2ZpbGVOYW1lLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwKTsKLQkJCQl9Ci0JCQkJZmlsZU5hbWUgPSBjdHJsX2ZpbGVOYW1lLmdldFRleHQoKTsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkZXN0aW5hdGlvbitGaWxlLnNlcGFyYXRvcitmaWxlTmFtZSk7Ci0JCQkJaWYoZmlsZS5leGlzdHMoKSl7Ci0JCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX1lbHNlewotCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlidXR0b25fcmVwbGFjZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWN0cmxfZmlsZU5hbWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJb2tCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWJ1dHRvbl91bmlxdWUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQljdHJsX2ZpbGVOYW1lLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZmlsZU5hbWUgPSBjdHJsX2ZpbGVOYW1lLmdldFRleHQoKTsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkZXN0aW5hdGlvbitGaWxlLnNlcGFyYXRvcitmaWxlTmFtZSk7Ci0JCQkJaWYoZmlsZS5leGlzdHMoKSl7Ci0JCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX1lbHNlewotCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCXN1cGVyCi0JCQkJLmdldFNoZWxsKCkKLQkJCQkuc2V0VGV4dCgKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfaWNvblNlY3Rpb25fZmlsZU5hbWVDb25mbGljdF90aXRsZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRpYWxvZyBidXR0b25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIE9LIGJ1dHRvbi4KLS8vCQljcmVhdGVCdXR0b24ocGFyZW50LCBPVkVSX1dSSVRFX0lELCAKLS8vCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfaWNvblNlY3Rpb25fZmlsZU5hbWVfb3ZlcldyaXRlLCB0cnVlKTsKLQkJCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0JCQkJdHJ1ZSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBDYW5jZWwgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCi0JCS8vIFNldCBoZWxwIGNvbnRleHQgZm9yIHRoZSBPSyBidXR0b24uCi0JCW9rQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpOwotCi0JCS8vIFNldCBoZWxwIGNvbnRleHQgZm9yIHRoZSBDYW5jZWwgYnV0dG9uLgotCQljYW5jZWxCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpOwotCi0JCS8vU2V0IGhlbHAgY29udGV4dCBmb3IgdGhlIG92ZXJ3cml0ZSBidXR0b24KLS8vCQlvdmVyV3JpdGVCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oT1ZFUl9XUklURV9JRCk7Ci0JCQotLy8JCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBGaWxlIE5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVQYXRoKCkgewotCQlyZXR1cm4gZmlsZU5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZpbGVQYXRoKFN0cmluZyBmaWxlTmFtZSl7Ci0JCXRoaXMuZmlsZU5hbWU9ZmlsZU5hbWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVCdXR0b25CYXIocGFyZW50KTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYoYnV0dG9uSWQgPT0gT1ZFUl9XUklURV9JRCl7Ci0JCQlvdmVyV3JpdGVQcmVzc2VkKCk7Ci0JCX0KLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG92ZXJXcml0ZVByZXNzZWQoKSB7Ci0JCXNldFJldHVybkNvZGUoT1ZFUl9XUklURV9JRCk7Ci0JCWNsb3NlKCk7Ci0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQoKSB7Ci0JCWZpbGVOYW1lID0gbnVsbDsKLQkJc3VwZXIuY2FuY2VsUHJlc3NlZCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZVN0cigpIHsKLQkJcmV0dXJuIG1lc3NhZ2VTdHI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZVN0cihTdHJpbmcgbWVzc2FnZVN0cikgewotCQl0aGlzLm1lc3NhZ2VTdHIgPSBtZXNzYWdlU3RyOwotCX0KLQlwdWJsaWMgdm9pZCBzZXREZXN0aWF0aW9uKFN0cmluZyBkZXN0aW5hdGlvbil7Ci0JCXRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9TZWN0aW9uc09yZGVyRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9TZWN0aW9uc09yZGVyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlmNGQ2MDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvU2VjdGlvbnNPcmRlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Nb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlNlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLQotCi0vKioKLSAqIERpYWxvZyB0byBvcmRlciB0aGUge0BsaW5rIFN0ZXB9cy4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VjdGlvbnNPcmRlckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBiYXNlQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF91cCwgY3RybF9kb3duOwotCi0JcHJpdmF0ZSBUYWJsZSBjdHJsX3N0ZXBzOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBzdGVwc1RhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBTZWN0aW9uTGlzdCBhbGxTZWN0aW9uczsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgc3RlcHNWaWV3ZXJDb250ZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIHN0ZXBzVmlld2VyTGFiZWxQcm92aWRlcjsKLQotCS8vIHByaXZhdGUgVGFzayBjb250ZW50RWxlbWVudDsKLQlwcml2YXRlIENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50OwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGl0bGU7Ci0KLQlwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBjb21tYW5kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSA8Y29kZT5BZHZhbmNlZFNlYXJjaERpYWxvZzwvY29kZT4gZ2l2ZWIgdGhlIHBhcmVudCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgU2VjdGlvbnNPcmRlckRpYWxvZyhTaGVsbCBwYXJlbnQsIENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50LAotCQkJSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWFuYWdlciwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwKLQkJCVN0cmluZyBsYWJlbCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCXRoaXMuYWN0aW9uTWFuYWdlciA9IGFjdGlvbk1hbmFnZXI7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQlhbGxTZWN0aW9ucyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQliYXNlQ29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlmaW5hbCBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSA0OwotCQliYXNlQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJYmFzZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCBtZXNzYWdlLCA0KTsKLQotCQkvLyBFbXB0eSBsaW5lCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgNCk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDEpOyAvLyROT04tTkxTLTEkCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsIGxhYmVsLCAzKTsKLQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDEpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfc3RlcHMgPSBuZXcgVGFibGUoYmFzZUNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNDAwOwotCQkJY3RybF9zdGVwcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWluaXRQcm92aWRlcnMoKTsKLQotCQlzdGVwc1RhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfc3RlcHMpOwotCQlzdGVwc1RhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihzdGVwc1ZpZXdlckNvbnRlbnRQcm92aWRlcik7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXIpOwotCi0JCUNvbXBvc2l0ZSBvcmRlckJ1dHRvblBhbmUgPSBuZXcgQ29tcG9zaXRlKGJhc2VDb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJb3JkZXJCdXR0b25QYW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJb3JkZXJCdXR0b25QYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJfQotCi0JCWN0cmxfdXAgPSBjcmVhdGVCdXR0b24ob3JkZXJCdXR0b25QYW5lLCBBdXRob3JpbmdVSVRleHQuVVBfQlVUVE9OX1RFWFQpOwotCQljdHJsX3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWN0cmxfZG93biA9IGNyZWF0ZUJ1dHRvbihvcmRlckJ1dHRvblBhbmUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRPV05fQlVUVE9OX1RFWFQpOwotCQljdHJsX2Rvd24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCS8vIEVtcHR5IGxpbmUKLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCA0KTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxpbmUoYmFzZUNvbXBvc2l0ZSwgNCk7Ci0KLQkJc3VwZXIuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQkJbG9hZERhdGEoKTsKLQotCQlyZXR1cm4gYmFzZUNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTGluZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbmNvbCkgewotCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMCi0JCQkJfCBTV1QuQk9MRCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbmNvbDsKLQkJbGluZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgbkNvbCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbkNvbDsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkaWFsb2cgYnV0dG9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBPSyBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0JCQkJdHJ1ZSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBDYW5jZWwgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UHJvdmlkZXJzKCkgewotCQlzdGVwc1ZpZXdlckNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCWlmIChhbGxTZWN0aW9ucyA9PSBudWxsKSB7Ci0JCQkJCWFsbFNlY3Rpb25zID0gbmV3IFNlY3Rpb25MaXN0KGNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVNlY3Rpb25MaXN0LlNURVBTX0ZPUl9FTEVNRU5UX0FORF9QQVJFTlRTKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGFsbFNlY3Rpb25zLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQlzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXIgPSBuZXcgVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gIWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkKLQkJCQkJCS5jb250YWlucyhlbGVtZW50KTsKLQkJCX0KLQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3RlcHNUYWJsZVZpZXdlcgotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMAotCQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpCi0JCQkJCQkJCQkmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCX0gZWxzZQotCQkJCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQkJCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkKLQkJCQkJCQkJCSYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQl9IGVsc2UKLQkJCQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJY3RybF91cC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQotCQkJCUFycmF5TGlzdCBtb3ZlVXBJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlVXBJdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQlNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQgY21kID0gbmV3IE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCgKLQkJCQkJCWNvbnRlbnRFbGVtZW50LCBtb3ZlVXBJdGVtcywgYWxsU2VjdGlvbnMsIDEpOwotCQkJCWFjdGlvbk1hbmFnZXIuZXhlY3V0ZShjbWQpOwotCQkJCWNvbW1hbmRzLmFkZChjbWQpOwotCi0JCQkJc3RlcHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWlmIChzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZG93bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlBcnJheUxpc3QgbW92ZURvd25JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlRG93bkl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCU1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCBjbWQgPSBuZXcgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kKAotCQkJCQkJY29udGVudEVsZW1lbnQsIG1vdmVEb3duSXRlbXMsIGFsbFNlY3Rpb25zLCAwKTsKLQkJCQlhY3Rpb25NYW5hZ2VyLmV4ZWN1dGUoY21kKTsKLQkJCQljb21tYW5kcy5hZGQoY21kKTsKLQotCQkJCXN0ZXBzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMAotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIGluaXRpYWwgZGF0YSBmcm9tIG1vZGVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotCQlzdGVwc1RhYmxlVmlld2VyLnNldElucHV0KGNvbnRlbnRFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJYWxsU2VjdGlvbnMuYXBwbHkoKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2FuY2VsUHJlc3NlZCgpIHsKLQkJaWYgKCFjb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSBjb21tYW5kcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCU9iamVjdCBjbWQgPSBjb21tYW5kcy5nZXQoaSk7Ci0JCQkJaWYgKGNtZCBpbnN0YW5jZW9mIE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCkgewotCQkJCQkoKE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCkgY21kKS51bmRvKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvVXNlckRlZmluZWREaWFncmFtRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGZiZWJhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc0d1aWRhbmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5HdWlkYW5jZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIERpYWxvZyB0byBhc3NpZ24gdXNlciBkZWZpbmVkIGRpYWdyYW0gdG8gcHJvY2VzcyBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcml2YXRlIEJ1dHRvbiBhc3NpZ25BREltYWdlQnV0dG9uLCBhc3NpZ25BRERJbWFnZUJ1dHRvbiwKLQkJCWFzc2lnbldQREltYWdlQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY2xlYXJBREltYWdlQnV0dG9uLCBjbGVhckFEREltYWdlQnV0dG9uLAotCQkJY2xlYXJXUERJbWFnZUJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIHVzZUFESW1hZ2VCdXR0b24sIHVzZUFEREltYWdlQnV0dG9uLCB1c2VXUERJbWFnZUJ1dHRvbjsKLQotCXByaXZhdGUgVGV4dCBhZEltYWdlVGV4dCwgYWRkSW1hZ2VUZXh0LCB3cGRJbWFnZVRleHQ7Ci0KLQlwcml2YXRlIElFZGl0b3JQYXJ0IGVkaXRvcjsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBhcmVhOwotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIFN1cHBvcnRpbmdNYXRlcmlhbCBhY3Rpdml0eURpYWdyYW0sIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSwKLQkJCXdwZERpYWdyYW07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgYnV0dG9uV2lkdGhIaW50ID0gNjA7Ci0JCi0JcHJpdmF0ZSBTZXQgZXhpc3RpbmdMaXN0OwotCQotCXByaXZhdGUgYm9vbGVhbiBpc1dyYXBwZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGVkaXRvcgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gaXNXcmFwcGVkCi0JICovCi0JcHVibGljIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZyhTaGVsbCBwYXJlbnQsIElFZGl0b3JQYXJ0IGVkaXRvciwKLQkJCUFjdGl2aXR5IGFjdGl2aXR5LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiBpc1dyYXBwZWQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQotCQl0aGlzLmVkaXRvciA9IGVkaXRvcjsKLQkJdGhpcy5pc1dyYXBwZWQgPSBpc1dyYXBwZWQ7Ci0JCQotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JCXRoaXMuZmlsdGVyID0gbmV3IFByb2Nlc3NHdWlkYW5jZUZpbHRlcihjb25maWcsIG51bGwsIHRhYk5hbWUpIHsKLQkJCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gKChHdWlkYW5jZUl0ZW1Qcm92aWRlcikgb2JqKS5nZXRUZXh0KG9iaik7Ci0JCQkJCWlmIChuYW1lCi0JCQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTKQotCQkJCQkJCSYmIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkhKChHdWlkYW5jZUl0ZW1Qcm92aWRlcikgb2JqKS5nZXRDaGlsZHJlbihvYmopCi0JCQkJCQkJCQkuaXNFbXB0eSgpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKChvYmogaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JCQotCQlleGlzdGluZ0xpc3QgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWFyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWZpbmFsIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKTsKLQkJYXJlYS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJLy8gVXNlIEFEIEltYWdlIGZvciBwdWJsaXNoaW5nCi0JCUxhYmVsIGJsYW5rTGFiZWwgPSBuZXcgTGFiZWwoYXJlYSwgU1dULk5PTkUpOwotCQlibGFua0xhYmVsLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJdXNlQURJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24oYXJlYSwgU1dULkNIRUNLKTsKLQkJdXNlQURJbWFnZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBREltYWdlKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBidXR0b25HRCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlidXR0b25HRC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXVzZUFESW1hZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25HRCk7Ci0KLQkJLy8gQXNzaWduIGFjdGl2aXR5IGRpYWdyYW0gaW1hZ2UKLQkJTGFiZWwgYUxhYmVsID0gbmV3IExhYmVsKGFyZWEsIFNXVC5OT05FKTsKLQkJYUxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkSW1hZ2UpOyAvLyROT04tTkxTLTEkCi0KLQkJYWRJbWFnZVRleHQgPSBuZXcgVGV4dChhcmVhLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORwotCQkJCXwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2Qud2lkdGhIaW50ID0gMzAwOwotCQlhZEltYWdlVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlhc3NpZ25BREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuTk9ORSk7Ci0JCWFzc2lnbkFESW1hZ2VCdXR0b24KLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYXNzaWduQnV0dG9uKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBidXR0b25HcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcKLQkJCQl8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWJ1dHRvbkdyaWREYXRhLndpZHRoSGludCA9IGJ1dHRvbldpZHRoSGludDsKLQkJYXNzaWduQURJbWFnZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkdyaWREYXRhKTsKLQotCQljbGVhckFESW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uKGFyZWEsIFNXVC5OT05FKTsKLQkJY2xlYXJBREltYWdlQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2xlYXJCdXR0b25fdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJY2xlYXJBREltYWdlQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uR3JpZERhdGEpOwotCi0JCS8vIFVzZSBBREQgSW1hZ2UgZm9yIHB1Ymxpc2hpbmcKLQkJYmxhbmtMYWJlbCA9IG5ldyBMYWJlbChhcmVhLCBTV1QuTk9ORSk7Ci0JCWJsYW5rTGFiZWwuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCQl1c2VBRERJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24oYXJlYSwgU1dULkNIRUNLKTsKLQkJdXNlQURESW1hZ2VCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURESW1hZ2UpOyAvLyROT04tTkxTLTEkCi0JCWJ1dHRvbkdEID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWJ1dHRvbkdELmhvcml6b250YWxTcGFuID0gMzsKLQkJdXNlQURESW1hZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25HRCk7Ci0KLQkJLy8gQXNzaWduIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtIGltYWdlCi0JCWFMYWJlbCA9IG5ldyBMYWJlbChhcmVhLCBTV1QuTk9ORSk7Ci0JCWFMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZGRJbWFnZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhZGRJbWFnZVRleHQgPSBuZXcgVGV4dChhcmVhLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCWFkZEltYWdlVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlhc3NpZ25BRERJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24oYXJlYSwgU1dULk5PTkUpOwotCQlhc3NpZ25BRERJbWFnZUJ1dHRvbgotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hc3NpZ25CdXR0b24pOyAvLyROT04tTkxTLTEkCi0JCWFzc2lnbkFEREltYWdlQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uR3JpZERhdGEpOwotCi0JCWNsZWFyQURESW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uKGFyZWEsIFNXVC5OT05FKTsKLQkJY2xlYXJBRERJbWFnZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNsZWFyQnV0dG9uX3RleHQpOyAvLyROT04tTkxTLTEkCi0JCWNsZWFyQURESW1hZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25HcmlkRGF0YSk7Ci0KLQkJLy8gVXNlIFdQRCBJbWFnZSBmb3IgcHVibGlzaGluZwotCQlibGFua0xhYmVsID0gbmV3IExhYmVsKGFyZWEsIFNXVC5OT05FKTsKLQkJYmxhbmtMYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXVzZVdQREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuQ0hFQ0spOwotCQl1c2VXUERJbWFnZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VXUERJbWFnZSk7IC8vJE5PTi1OTFMtMSQKLQkJYnV0dG9uR0QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HICk7Ci0JCWJ1dHRvbkdELmhvcml6b250YWxTcGFuID0gMzsKLQkJdXNlV1BESW1hZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25HRCk7Ci0KLQkJLy8gQXNzaWduIHdvcmsgcHJvZHVjdCBkZXBlbmRlbmN5IGRpYWdyYW0gaW1hZ2UKLQkJYUxhYmVsID0gbmV3IExhYmVsKGFyZWEsIFNXVC5OT05FKTsKLQkJYUxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3dwZEltYWdlKTsgLy8kTk9OLU5MUy0xJAotCi0JCXdwZEltYWdlVGV4dCA9IG5ldyBUZXh0KGFyZWEsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJd3BkSW1hZ2VUZXh0LnNldExheW91dERhdGEoZ2QpOwotCi0JCWFzc2lnbldQREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuTk9ORSk7Ci0JCWFzc2lnbldQREltYWdlQnV0dG9uCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2Fzc2lnbkJ1dHRvbik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzaWduV1BESW1hZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25HcmlkRGF0YSk7Ci0KLQkJY2xlYXJXUERJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24oYXJlYSwgU1dULk5PTkUpOwotCQljbGVhcldQREltYWdlQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2xlYXJCdXR0b25fdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJY2xlYXJXUERJbWFnZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkdyaWREYXRhKTsKLQotCQkvLyBsb2FkRGF0YQotCQlsb2FkRGF0YSgpOwotCQkKLQkJLy8gZGlzYWJsZUNvbnRyb2xzCi0JCWlmIChUbmdVdGlsLmlzTG9ja2VkKGFjdGl2aXR5KSB8fCBpc1dyYXBwZWQpewotCQkJZGlzYWJsZUNvbnRyb2xzKCk7Ci0JCX0KLQotCQkvLyBhZGQgbGlzdGVuZXJzCi0JCWFkZExpc3RlbmVycygpOwotCi0JCS8vIHNldCBpbWFnZSBhbmQgdGl0bGUKLQkJc3VwZXIKLQkJCQkuZ2V0U2hlbGwoKQotCQkJCS5zZXRUZXh0KAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBhcmVhOwotCX0KLQotCS8qKgotCSAqIERpc2FibGUgY29udHJvbHMKLQkgKgotCSAqLwotCXByaXZhdGUgdm9pZCBkaXNhYmxlQ29udHJvbHMoKQotCXsKLQkJdXNlQURJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJdXNlQURESW1hZ2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXVzZVdQREltYWdlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJYXNzaWduQURJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJYXNzaWduQURESW1hZ2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWFzc2lnbldQREltYWdlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJY2xlYXJBREltYWdlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQljbGVhckFEREltYWdlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQljbGVhcldQREltYWdlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkcyBpbml0aWFsIGRhdGEKLQkgKgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkRGF0YSgpIHsJCQotCQkvLwkgbG9hZCBleGlzdGluZyBzdXBwb3J0aW5nIG1hdGVyaWFscyBsaXN0Ci0JCWV4aXN0aW5nTGlzdC5hZGRBbGwoYWN0aXZpdHkuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpKTsKLQotCQkKLQkJRGlhZ3JhbUluZm8gaW5mbyA9IG5ldyBEaWFncmFtSW5mbyhhY3Rpdml0eSk7Ci0JCWlmIChpbmZvLmdldEFjdGl2aXR5RGlhZ3JhbSgpICE9IG51bGwpIHsKLQkJCWFkSW1hZ2VUZXh0LnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGluZm8KLQkJCQkJLmdldEFjdGl2aXR5RGlhZ3JhbSgpKSk7Ci0JCQlhY3Rpdml0eURpYWdyYW0gPSBpbmZvLmdldEFjdGl2aXR5RGlhZ3JhbSgpOwotCQkJCi0JCQlleGlzdGluZ0xpc3QuYWRkKGFjdGl2aXR5RGlhZ3JhbSk7Ci0JCX0KLQkJaWYgKGluZm8uZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkgIT0gbnVsbCkgewotCQkJYWRkSW1hZ2VUZXh0LnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGluZm8KLQkJCQkJLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpKSk7Ci0JCQlhY3Rpdml0eURldGFpbERpYWdyYW0gPSBpbmZvLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCQkJCi0JCQlleGlzdGluZ0xpc3QuYWRkKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSk7Ci0JCX0KLQkJaWYgKGluZm8uZ2V0V1BERGlhZ3JhbSgpICE9IG51bGwpIHsKLQkJCXdwZEltYWdlVGV4dAotCQkJCQkuc2V0VGV4dChUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoaW5mby5nZXRXUEREaWFncmFtKCkpKTsKLQkJCXdwZERpYWdyYW0gPSBpbmZvLmdldFdQRERpYWdyYW0oKTsKLQkJCQotCQkJZXhpc3RpbmdMaXN0LmFkZCh3cGREaWFncmFtKTsKLQkJfQotCi0JCXVzZUFESW1hZ2VCdXR0b24uc2V0U2VsZWN0aW9uKGluZm8uY2FuUHVibGlzaEFESW1hZ2UoKSk7Ci0JCXVzZUFEREltYWdlQnV0dG9uLnNldFNlbGVjdGlvbihpbmZvLmNhblB1Ymxpc2hBRERJbWFnZSgpKTsKLQkJdXNlV1BESW1hZ2VCdXR0b24uc2V0U2VsZWN0aW9uKGluZm8uY2FuUHVibGlzaFdQREltYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlhc3NpZ25BREltYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXRyeSB7Ci0JCQkJCVN1cHBvcnRpbmdNYXRlcmlhbCBzbSA9IG9wZW5GaWx0ZXJEaWFsb2coKTsKLQkJCQkJaWYgKHNtICE9IG51bGwpIHsKLQkJCQkJCWFjdGl2aXR5RGlhZ3JhbSA9IHNtOwotCQkJCQkJYWRJbWFnZVRleHQuc2V0VGV4dChUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoc20pKTsKLQkJCQkJCWV4aXN0aW5nTGlzdC5hZGQoYWN0aXZpdHlEaWFncmFtKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWFzc2lnbkFEREltYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXRyeSB7Ci0JCQkJCVN1cHBvcnRpbmdNYXRlcmlhbCBzbSA9IG9wZW5GaWx0ZXJEaWFsb2coKTsKLQkJCQkJaWYgKHNtICE9IG51bGwpIHsKLQkJCQkJCWFjdGl2aXR5RGV0YWlsRGlhZ3JhbSA9IHNtOwotCQkJCQkJYWRkSW1hZ2VUZXh0LnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKHNtKSk7Ci0JCQkJCQlleGlzdGluZ0xpc3QuYWRkKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlhc3NpZ25XUERJbWFnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0cnkgewotCQkJCQlTdXBwb3J0aW5nTWF0ZXJpYWwgc20gPSBvcGVuRmlsdGVyRGlhbG9nKCk7Ci0JCQkJCWlmIChzbSAhPSBudWxsKSB7Ci0JCQkJCQl3cGREaWFncmFtID0gc207Ci0JCQkJCQl3cGRJbWFnZVRleHQuc2V0VGV4dChUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoc20pKTsKLQkJCQkJCWV4aXN0aW5nTGlzdC5hZGQod3BkRGlhZ3JhbSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljbGVhckFESW1hZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZXhpc3RpbmdMaXN0LnJlbW92ZShhY3Rpdml0eURpYWdyYW0pOwotCQkJCWFkSW1hZ2VUZXh0LnNldFRleHQoIiIpOwotCQkJCWFjdGl2aXR5RGlhZ3JhbSA9IG51bGw7Ci0JCQl9Ci0JCX0pOwotCi0JCWNsZWFyQURESW1hZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZXhpc3RpbmdMaXN0LnJlbW92ZShhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQkJCWFkZEltYWdlVGV4dC5zZXRUZXh0KCIiKTsKLQkJCQlhY3Rpdml0eURldGFpbERpYWdyYW0gPSBudWxsOwotCQkJfQotCQl9KTsKLQotCQljbGVhcldQREltYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWV4aXN0aW5nTGlzdC5yZW1vdmUod3BkRGlhZ3JhbSk7Ci0JCQkJd3BkSW1hZ2VUZXh0LnNldFRleHQoIiIpOwotCQkJCXdwZERpYWdyYW0gPSBudWxsOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGEgZmlsdGVyIGRpYWxvZwotCSAqLwotCXByaXZhdGUgU3VwcG9ydGluZ01hdGVyaWFsIG9wZW5GaWx0ZXJEaWFsb2coKSB7Ci0JCi0JCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBhY3Rpdml0eSwKLQkJCQlGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFMsIEFycmF5cy5hc0xpc3QoZXhpc3RpbmdMaXN0LnRvQXJyYXkoKSkpOwotCQkKLQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTKTsKLQkJZmQuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKHRydWUpOwotCQlmZC5zZXRJbnB1dChVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGFjdGl2aXR5KSk7Ci0JCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlmZC5vcGVuKCk7Ci0KLQkJTGlzdCBsaXN0ID0gZmQuZ2V0U2VsZWN0ZWRJdGVtcygpOwotCQlpZiAoKGxpc3QgIT0gbnVsbCkgJiYgKCFsaXN0LmlzRW1wdHkoKSkpIHsKLQkJCU9iamVjdCBvYmogPSBsaXN0LmdldCgwKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQlyZXR1cm4gKFN1cHBvcnRpbmdNYXRlcmlhbCkgb2JqOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCWlmIChUbmdVdGlsLmlzTG9ja2VkKGFjdGl2aXR5KSB8fCBpc1dyYXBwZWQpewotCQkJLy8gdGhlbiBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLi4ganVzdCByZXR1cm4KLQkJCXN1cGVyLm9rUHJlc3NlZCgpOwotCQl9Ci0JCWJvb2xlYW4gZWRpdG9yRGlydHkgPSBmYWxzZTsKLQkJRGlhZ3JhbUluZm8gaW5mbyA9IG5ldyBEaWFncmFtSW5mbyhhY3Rpdml0eSk7Ci0KLQkJLy8gc2V0IGFjdGl2aXR5IGRpYWdyYW0KLQkJaWYgKGFjdGl2aXR5RGlhZ3JhbSAhPSBpbmZvLmdldEFjdGl2aXR5RGlhZ3JhbSgpKSB7Ci0JCQllZGl0b3JEaXJ0eSA9IHRydWU7Ci0JCX0KLQkJaW5mby5zZXRBY3Rpdml0eURpYWdyYW0oYWN0aXZpdHlEaWFncmFtKTsKLQotCQkvLyBzZXQgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0KLQkJaWYgKCFlZGl0b3JEaXJ0eSkgewotCQkJaWYgKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSAhPSBpbmZvLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpKQotCQkJCWVkaXRvckRpcnR5ID0gdHJ1ZTsKLQkJfQotCQlpbmZvLnNldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbShhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCi0JCS8vIHNldCB3b3JrIHByb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtCi0JCWlmICghZWRpdG9yRGlydHkpIHsKLQkJCWlmICh3cGREaWFncmFtICE9IGluZm8uZ2V0V1BERGlhZ3JhbSgpKQotCQkJCWVkaXRvckRpcnR5ID0gdHJ1ZTsKLQkJfQotCQlpbmZvLnNldFdQRERpYWdyYW0od3BkRGlhZ3JhbSk7Ci0KLQkJLy8gc2V0IGNhbiBwdWJsaXNoIGZsYWcgZm9yIGFjdGl2aXR5IGRpYWdyYW0KLQkJYm9vbGVhbiBvbGRDYW5QdWJsaXNoRmxhZyA9IGluZm8uY2FuUHVibGlzaEFESW1hZ2UoKTsKLQkJYm9vbGVhbiBuZXdDYW5QdWJsaXNoRmxhZyA9IHVzZUFESW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICgoIWVkaXRvckRpcnR5KSAmJiAob2xkQ2FuUHVibGlzaEZsYWcgIT0gbmV3Q2FuUHVibGlzaEZsYWcpKQotCQkJZWRpdG9yRGlydHkgPSB0cnVlOwotCQlpbmZvLnNldFB1Ymxpc2hBREltYWdlKHVzZUFESW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCi0JCS8vIHNldCBjYW4gcHVibGlzaCBmbGFnIGZvciBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbQotCQlvbGRDYW5QdWJsaXNoRmxhZyA9IGluZm8uY2FuUHVibGlzaEFEREltYWdlKCk7Ci0JCW5ld0NhblB1Ymxpc2hGbGFnID0gdXNlQURESW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICgoIWVkaXRvckRpcnR5KSAmJiAob2xkQ2FuUHVibGlzaEZsYWcgIT0gbmV3Q2FuUHVibGlzaEZsYWcpKQotCQkJZWRpdG9yRGlydHkgPSB0cnVlOwotCQlpbmZvLnNldFB1Ymxpc2hBRERJbWFnZSh1c2VBRERJbWFnZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJLy8gc2V0IGNhbiBwdWJsaXNoIGZsYWcgZm9yIHdvcmsgcHJvZHVjdCBkZXBlbmRlbmN5IGRpYWdyYW0KLQkJb2xkQ2FuUHVibGlzaEZsYWcgPSBpbmZvLmNhblB1Ymxpc2hXUERJbWFnZSgpOwotCQluZXdDYW5QdWJsaXNoRmxhZyA9IHVzZVdQREltYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlpZiAoKCFlZGl0b3JEaXJ0eSkgJiYgKG9sZENhblB1Ymxpc2hGbGFnICE9IG5ld0NhblB1Ymxpc2hGbGFnKSkKLQkJCWVkaXRvckRpcnR5ID0gdHJ1ZTsKLQkJaW5mby5zZXRQdWJsaXNoV1BESW1hZ2UodXNlV1BESW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRURpdG9yIGRpcnR5PSIgKyBlZGl0b3JEaXJ0eSk7Ci0JCWlmIChlZGl0b3JEaXJ0eSkgewotCi0JCQlpZiAoIXByb21wdFNhdmVBY3RpdmVFZGl0b3IoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCXNhdmVBY3RpdmVFZGl0b3IoKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHByb21wdFNhdmVBY3RpdmVFZGl0b3IoKSB7Ci0JCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ190aXRsZTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMjsgLy8kTk9OLU5MUy0xJAotCQkvLyBpZiAoZWRpdG9yLmlzRGlydHkoKSkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJLmRpc3BsYXlDb25maXJtYXRpb24odGl0bGUsIG1lc3NhZ2UpOwotCQkvLyB9Ci0JCS8vIHJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlQWN0aXZlRWRpdG9yKCkgewotCQkvLyBzYXZlIHRoZSBlZGl0b3IKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwKLQkJCQluZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJKChQcm9jZXNzRWRpdG9yKSBlZGl0b3IpLnJlc291cmNlc1RvU2F2ZQotCQkJCQkJCQkuYWRkKCgoUHJvY2Vzc0NvbXBvbmVudCkgKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGVkaXRvcgotCQkJCQkJCQkJCS5nZXRFZGl0b3JJbnB1dCgpKS5nZXRNZXRob2RFbGVtZW50KCkpCi0JCQkJCQkJCQkJLmdldFByb2Nlc3MoKS5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNhdmluZy4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQllZGl0b3IuZG9TYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzYXZpbmcgZG9uZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQotCQkJCX0pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvVXNlckludGVyYWN0aW9uRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Vc2VySW50ZXJhY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGMwNThmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Vc2VySW50ZXJhY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogVGhpcyBkaWFsb2cgYWN0cyBhcyBhIGlucHV0IGRpYWxvZyBkdXJpbmcgY29tbWFuZCBleGVjdXRpb24gIAotICogYmFzZWQgb24gdXNlciBpbnB1dCBhbmQgaW5wdXRUeXBlIGRpYWxvZyBiZWhhdmlvdXIgY2hhbmdlcy4gCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVXNlckludGVyYWN0aW9uRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSURvdWJsZUNsaWNrTGlzdGVuZXIgewotCi0JSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0JTGlzdCBvYmplY3RzVG9TZWxlY3Q7Ci0JTGlzdCBpbml0aWFsU2VsZWN0aW9uOwotCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCXByaXZhdGUgU3RyaW5nIG1zZzsKLQlMaXN0IHNlbGVjdGVkOwotCXByaXZhdGUgYm9vbGVhbiBtdWx0aXBsZSA9IGZhbHNlOwotCXByaXZhdGUgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXI7Ci0JcHJpdmF0ZSBPYmplY3QgaW5wdXQ7Ci0JcHJpdmF0ZSBpbnQgaW5wdXRUeXBlID0gSW5wdXRUeXBlLlRFWFQ7Ci0JcHJpdmF0ZSBUZXh0IHRleHQ7Ci0JcHJpdmF0ZSBTdHJpbmcgaW5wdXRMYWJlbDsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqIEBwYXJhbSBvYmplY3RzVG9TZWxlY3QKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlcgotCSAqIEBwYXJhbSBtdWx0aXBsZQotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSBtc2cKLQkgKi8KLQlwdWJsaWMgVXNlckludGVyYWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBMaXN0IG9iamVjdHNUb1NlbGVjdCwKLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsIGJvb2xlYW4gbXVsdGlwbGUsCi0JCQlTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMubGFiZWxQcm92aWRlciA9IGxhYmVsUHJvdmlkZXI7Ci0JCXRoaXMub2JqZWN0c1RvU2VsZWN0ID0gb2JqZWN0c1RvU2VsZWN0OwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXRoaXMubXNnID0gbXNnOwotCQl0aGlzLm11bHRpcGxlICA9IG11bHRpcGxlOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqIEBwYXJhbSBvYmplY3RzVG9TZWxlY3QKLQkgKi8KLQlwdWJsaWMgVXNlckludGVyYWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBMaXN0IG9iamVjdHNUb1NlbGVjdCl7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5vYmplY3RzVG9TZWxlY3QgPSBvYmplY3RzVG9TZWxlY3Q7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyI2RvdWJsZUNsaWNrKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gcy5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYoc2VsZWN0ZWQgIT0gbnVsbCl7Ci0JCQlzZWxlY3RlZC5hZGQoZWxlbWVudCk7Ci0JCX0KLQkJY2xvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2F2ZXMgdGhlIHNlbGVjdGlvbiBpbiBpbnB1dGRpYWxvZyAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzYXZlU2VsZWN0aW9uKCl7Ci0gICAgCWlmKHZpZXdlciAhPSBudWxsKXsKLQkgICAgCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCU9iamVjdFtdIG9iamVjdEFyciA9IHNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RBcnIubGVuZ3RoOyBpKyspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IG9iamVjdEFycltpXTsKLQkJCQkJLy9pZihvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KXsKLQkJCQkJCWlmKHNlbGVjdGVkICE9IG51bGwpewotCQkJCQkJCXNlbGVjdGVkLmFkZChvYmopOwotCQkJCQkJfQotCQkJCQkvL30KLQkJCQl9Ci0JCQl9Ci0gICAgCX1lbHNlewotICAgIAkJc2VsZWN0ZWQuYWRkKHRleHQuZ2V0VGV4dCgpKTsKLSAgICAJfQotCQkvLyBQZXJzaXN0IHRoZSBkaWFsb2cgc2V0dGluZ3MuCi0JCS8vIHNhdmVMYXN0U2V0dGluZ3MoKTsKLQkJLy9nZXRTaGVsbCgpLmdldAotICAgIH0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gaW5pdGlhbFNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oTGlzdCBpbml0aWFsU2VsZWN0aW9uKXsKLQkJdGhpcy5pbml0aWFsU2VsZWN0aW9uID0gaW5pdGlhbFNlbGVjdGlvbjsKLQl9Ci0JLyoqCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlc3VsdCgpewotCQlyZXR1cm4gdGhpcy5zZWxlY3RlZDsKLQl9Ci0JLyoqCi0JICogCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCAgc2V0TGFiZWxQcm92aWRlcihJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKXsKLQkJdGhpcy5sYWJlbFByb3ZpZGVyID0gbGFiZWxQcm92aWRlcjsKLQl9Ci0JLyoqCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKXsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCX0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbXNnKXsKLQkJdGhpcy5tc2cgPSBtc2c7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBtdWx0aXBsZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzTXVsdGlwbGUoYm9vbGVhbiBtdWx0aXBsZSl7Ci0JCXRoaXMubXVsdGlwbGUgPSBtdWx0aXBsZTsKLQl9Ci0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KXsKLQkJaWYgKCFtdWx0aXBsZSkgewotCQkJdmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMCi0JCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCX0gZWxzZSB7Ci0JCQl2aWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTAotCQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl9Ci0JCQotCQlHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXsKLQkJCXNwZWMud2lkdGhIaW50ID0gMjAwOwotCQkJc3BlYy5oZWlnaHRIaW50ID0gMjAwOwotCQkJc3BlYy5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoc3BlYyk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCl7Ci0JCXZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpewotCQkgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCSAgICAgICAgdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLQkgICAgICAgICAgICAgICAgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkgICAgICAgIHRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCSAgICAgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBpbnB1dGUKLQkgICAgICAgICAgICB9Ci0JICAgICAgICB9KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VsZWN0aW9uKFZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGluaXRpYWxTZWxlY3Rpb24gIT0gbnVsbCAmJiBpbml0aWFsU2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCWluaXRpYWxTZWxlY3Rpb24udG9BcnJheSgpKTsKLQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCB0cnVlKTsKLQkJfQotCi0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgTGFiZWwgY3JlYXRlTWVzc2FnZUFyZWEoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsU1dULldSQVApOwotCQlpZihtc2cgIT0gbnVsbCl7Ci0JCQlsYWJlbC5zZXRUZXh0KG1zZyk7Ci0JCX0KLQkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYXBwbHlEaWFsb2dGb250KGxhYmVsKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb21ib1ZpZXdlcihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihjb21wb3NpdGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0JCUdyaWREYXRhIGdEID0gKEdyaWREYXRhKSBjb21wb3NpdGUuZ2V0TGF5b3V0RGF0YSgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCS8vZ0QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdELndpZHRoSGludCA9IDE1MDsKLQkJZ0QuaGVpZ2h0SGludCA9IDE1MDsKLQkJCi0JCWNyZWF0ZU1lc3NhZ2VBcmVhKGNvbXBvc2l0ZSk7Ci0JCUxhYmVsIGVtcHR5bGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWVtcHR5bGFiZWwuc2V0VGV4dCgiIik7Ci0JCQotCQlpZihpbnB1dExhYmVsICE9IG51bGwgfHwgaW5wdXRMYWJlbCAhPSAiIil7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJCWxhYmVsLnNldFRleHQoaW5wdXRMYWJlbCk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCB8R3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCX0KLQkJCi0JCWlmKGlucHV0VHlwZSA9PSBJbnB1dFR5cGUuVFJFRSl7Ci0JCQljcmVhdGVUcmVlVmlld2VyKGNvbXBvc2l0ZSk7Ci0JCX1lbHNlIGlmKGlucHV0VHlwZSA9PSBJbnB1dFR5cGUuTElTVCl7Ci0JCQljcmVhdGVUYWJsZVZpZXdlcihjb21wb3NpdGUpOwotCQl9ZWxzZSBpZiAoaW5wdXRUeXBlID09IElucHV0VHlwZS5DT01CTyl7Ci0JCQljcmVhdGVDb21ib1ZpZXdlcihjb21wb3NpdGUpOwotCQl9ZWxzZSBpZihpbnB1dFR5cGUgPT0gSW5wdXRUeXBlLlRFWFQpewotCQkJY3JlYXRlVGV4dChjb21wb3NpdGUpOwotCQl9Ci0JCS8vCi0JCWlmKHZpZXdlciAhPSBudWxsKXsKLQkJCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQkJaWYoY29udGVudFByb3ZpZGVyICE9IG51bGwpewotCQkJCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJCX1lbHNlewotCQkJCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQkJfQotCQkJdmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0JCi0JCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJCXZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0JCQl9ZWxzZXsKLQkJCQl2aWV3ZXIuc2V0SW5wdXQob2JqZWN0c1RvU2VsZWN0KTsKLQkJCX0KLQkJCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCQl2aWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLQkJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJCXNldFNlbGVjdGlvbih2aWV3ZXIpOwotCQkJLy8gVE9ETzogdHJlZVZpZXdlciBTb3J0ZXIgYW5kIEV4cGFuZC9Db2xsYXBzZQotCQl9Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JCQotCX0KLQkKLQkvKgotICAgICAqIFVwZGF0ZSBPSyBidXR0b24gYmFzZWQgb24gc2VsZWN0aW9uCi0gICAgICoKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVPa0J1dHRvbigpIHsKLSAgICAgICAgQnV0dG9uIG9rQnV0dG9uID0gZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpOwotICAgICAgICBpZiAob2tCdXR0b24gIT0gbnVsbCkgewotCQkJb2tCdXR0b24uc2V0RW5hYmxlZChnZXRSZXN1bHQoKS5zaXplKCkgPiAwKTsKLQkJfQotICAgIH0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLSAgICAJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIAlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0gICAgCWlmICh0aGlzLnRpdGxlICE9IG51bGwpIHsKLQkJCW5ld1NoZWxsLnNldFRleHQodGhpcy50aXRsZSk7Ci0JCX0KLSAgICB9Ci0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNva1ByZXNzZWQoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLSAgICAJc2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCXNhdmVTZWxlY3Rpb24oKTsKLSAgICAJc3VwZXIub2tQcmVzc2VkKCk7Ci0gICAgfQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY2FuY2VsUHJlc3NlZCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2FuY2VsUHJlc3NlZCgpIHsKLSAgICAJc2VsZWN0ZWQgPSBudWxsOwotICAgIAlzdXBlci5jYW5jZWxQcmVzc2VkKCk7Ci0gICAgfQotICAgIAotICAgCi0gICAKLQlwdWJsaWMgdm9pZCBzZXRJbnB1dFR5cGUoaW50IGlucHV0VHlwZSkgewotCQl0aGlzLmlucHV0VHlwZSA9IGlucHV0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbnB1dAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW5wdXQoKSB7Ci0JCXJldHVybiBpbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBpbnB1dCkgewotCQl0aGlzLmlucHV0ID0gaW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlucHV0TGFiZWwgdGhlIGlucHV0TGFiZWwgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SW5wdXRMYWJlbChTdHJpbmcgaW5wdXRMYWJlbCkgewotCQl0aGlzLmlucHV0TGFiZWwgPSBpbnB1dExhYmVsOwotCX0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1ZhcmlhYmlsaXR5U2VsZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9WYXJpYWJpbGl0eVNlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NjIzZTYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1ZhcmlhYmlsaXR5U2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkFsbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkNvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogVGhlIGRpYWxvZyBmb3Igc2hvd2luZyBhbmQgcG9zc2libHkgc2VsZWN0aW5nIGFueSB2YXJpYWJpbGl0eSByZWxhdGVkIHRvIHRoZQotICogZ2l2ZW4gZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBWYXJpYWJpbGl0eVNlbGVjdGlvbiB7Ci0KLQlwcml2YXRlIEhhc2hTZXQgZmlsdGVyRWxlbWVudExpc3QgPSBuZXcgSGFzaFNldCgpOwotCi0JcHJpdmF0ZSBjbGFzcyBWYXJpYWJpbGl0eUZpbHRlciBleHRlbmRzIEFsbEZpbHRlciB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlPYmplY3QgY29udGVudEVsZW1lbnQgPSBoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iai5lcXVhbHMoaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCkpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpICE9IG51bGwpIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucygKLQkJCQkJCQkoKFByb2Nlc3NDb21wb25lbnQpIG9iaikuZ2V0UHJvY2VzcygpKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucyhvYmopKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBvYmopKSB7Ci0JCQkJCWlmICgoKEN1c3RvbUNhdGVnb3J5KSBvYmopLmdldENhdGVnb3JpemVkRWxlbWVudHMoKQotCQkJCQkJCS5pc0VtcHR5KCkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJaWYgKE1ldGhvZEVsZW1lbnRVdGlsLmdldEFsbE1vZGVscyhjb250ZW50RWxlbWVudCkKLQkJCQkJCQkJLmNvbnRhaW5zKG9iaikpCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlDb2xsZWN0aW9uIGxpc3QgPSAoKFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJZm9yIChJdGVyYXRvciBpb3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGlvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSBpb3IubmV4dCgpOwotCQkJCQlpZiAoKChDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqZWN0KQotCQkJCQkJCS5nZXRDaGlsZHJlbihvYmplY3QpLmlzRW1wdHkoKSkKLQkJCQkJCWlvci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAoKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KQotCQkJCQkmJiBmaWx0ZXJFbGVtZW50TGlzdC5jb250YWlucyhvYmopKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogRGlzcGxheSB2YXJpYWJpbGl0eSBzZWxlY3Rpb24gZGlhbG9nIHdoaWNoIGxpc3RzIGVsZW1lbnRzIGFuZCBpdCdzCi0JICogdmFyaWFiaWxpdGllcy4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlTZWxlY3Rpb24oKSB7Ci0JfQotCi0JLyoqCi0JICogSXQgc2hvd3MgZGlhbG9nIGJveCBmb3IgYWxsIHRoZSBjb250cmlidXRvcnMuIFVzZXIgaXMgZXhwZWN0ZWQgdG8gc2VsZWN0Ci0JICogb25lLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqIAkJT2JqZWN0IHNlbGVjdGVkIGJ5IHVzZXIKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkVmFyaWFiaWxpdHkoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQpIHsKLQkJU2V0IGVsZW1lbnRTZXQgPSBuZXcgSGFzaFNldCgpOwotCQllbGVtZW50U2V0LmFkZChlbGVtZW50KTsKLQkJZWxlbWVudFNldCA9IEFzc29jaWF0aW9uSGVscGVyLmdldFZhcmlhYmlsaXR5RWxlbWVudHMoZWxlbWVudFNldCwgdHJ1ZSwgdHJ1ZSk7Ci0KLQkJZmlsdGVyRWxlbWVudExpc3QuYWRkQWxsKGVsZW1lbnRTZXQpOwotCQlpZiAoIWVsZW1lbnRTZXQuaXNFbXB0eSgpKSB7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGVsZW1lbnRTZXQuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQgPSAoQ29udGVudEVsZW1lbnQpIGl0b3IubmV4dCgpOwotCQkJCUxpc3QgZ3JvdXBpbmdzID0gbnVsbDsKLQkJCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJCWdyb3VwaW5ncyA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldERpc2NpcGxpbmVHcm91cHMoKERpc2NpcGxpbmUpIGNvbnRlbnRFbGVtZW50KTsKLQotCQkJCX0KLQkJCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQkJCWdyb3VwaW5ncyA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldFJvbGVTZXRHcm91cHMoKFJvbGVTZXQpIGNvbnRlbnRFbGVtZW50KTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJZ3JvdXBpbmdzID0gZ2V0QW5jZXN0b3JzKChDdXN0b21DYXRlZ29yeSljb250ZW50RWxlbWVudCk7Ci0JCQkJfQotCi0JCQkJaWYgKChncm91cGluZ3MgIT0gbnVsbCkgJiYgKCFncm91cGluZ3MuaXNFbXB0eSgpKSkKLQkJCQkJZmlsdGVyRWxlbWVudExpc3QuYWRkQWxsKGdyb3VwaW5ncyk7Ci0KLQkJCX0KLQotCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgVmFyaWFiaWxpdHlGaWx0ZXIoKTsKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbXSB7IEZpbHRlckNvbnN0YW50cy5DT05GSUdfQ09OVEVOVF9FTEVNRU5UIH07Ci0JCQlJdGVtc0ZpbHRlckRpYWxvZyBkbGcgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSk7Ci0JCQlkbGcuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQlkbGcuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLkNPTkZJR19DT05URU5UX0VMRU1FTlQpOwotCQkJZGxnLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJCWRsZy5zZXRUeXBlcyhzdHIpOwotCQkJZGxnLnNldElucHV0KFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeSgoRU9iamVjdCkgZWxlbWVudCkpOwotCQkJZGxnLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcikpLAotCQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldEl0ZW1zRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0KLQkJCVN0cmluZyBlbGVtZW50TmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQKLQkJCQkJJiYgUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5pc1Nob3dQcmVzZW50YXRpb25OYW1lcygpKSB7Ci0JCQkJaWYgKCgoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50KS5nZXRQcmVzZW50YXRpb25OYW1lKCkudHJpbSgpCi0JCQkJCQkubGVuZ3RoKCkgPiAwKQotCQkJCQllbGVtZW50TmFtZSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50KQotCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQl9Ci0JCQlkbGcKLQkJCQkJLnNldFZpZXdlckxhYmVsKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3ZpZXdlckxhYmVsLCAobmV3IFN0cmluZ1tdIHsgZWxlbWVudE5hbWUgfSkpKTsKLQotCQkJU3RyaW5nIHRpdGxlID0gTWVzc2FnZUZvcm1hdAotCQkJCQkuZm9ybWF0KAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IGVsZW1lbnROYW1lIH0pOwotCi0JCQlkbGcuc2V0VGl0bGUodGl0bGUpOwotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGxnLm9wZW4oKTsKLQotCQkJTGlzdCByZXN1bHQgPSBkbGcuZ2V0U2VsZWN0ZWRJdGVtcygpOwotCQkJaWYgKChyZXN1bHQgPT0gbnVsbCkgfHwgKHJlc3VsdC5pc0VtcHR5KCkpKQotCQkJCXJldHVybiBudWxsOwotCQkJZWxzZQotCQkJCXJldHVybiByZXN1bHQuZ2V0KDApOwotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFuY2VzdG9ycyBmb3IgdGhlIGdpdmVuIEN1c3RvbSBDYXRlZ29yeS4KLQkgKiB0YWtlbiBmcm9tIGF1dGhvcmluZy51aS5DdXN0b21DYXRlZ29yeUFzc2lnblBhZ2UKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0QW5jZXN0b3JzKEN1c3RvbUNhdGVnb3J5IG1ldGhvZE9iamVjdCkgewotCQlMaXN0IGFuY2VzdG9yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBvYmpMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlvYmpMaXN0LmFkZChtZXRob2RPYmplY3QpOwotCQlnZXRBbmNlc3RvcnMoYW5jZXN0b3JMaXN0LCBvYmpMaXN0KTsKLQkJcmV0dXJuIGFuY2VzdG9yTGlzdDsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0QW5jZXN0b3JzKExpc3QgYW5jZXN0b3JMaXN0LCBMaXN0IG1ldGhvZE9iamVjdExpc3QpIHsKLQkJaWYgKG1ldGhvZE9iamVjdExpc3QuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGFuY2VzdG9yTGlzdDsKLQotCQlMaXN0IGFsbFBhcmVudEN1c3RDYXRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1ldGhvZE9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDdXN0b21DYXRlZ29yeSBlbGVtZW50ID0gKEN1c3RvbUNhdGVnb3J5KSBpdGVyLm5leHQoKTsKLQkJCUxpc3QgcGFyZW50TGlzdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldEN1c3RvbUNhdGVnb3JpZXMoZWxlbWVudCk7Ci0JCQlhbGxQYXJlbnRDdXN0Q2F0cy5hZGRBbGwocGFyZW50TGlzdCk7Ci0JCX0KLQotCQlhbmNlc3Rvckxpc3QuYWRkQWxsKG1ldGhvZE9iamVjdExpc3QpOwotCQlMaXN0IG5leHRDaGVja0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbFBhcmVudEN1c3RDYXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghYW5jZXN0b3JMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJbmV4dENoZWNrTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZ2V0QW5jZXN0b3JzKGFuY2VzdG9yTGlzdCwgbmV4dENoZWNrTGlzdCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzQzNzExOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBkaWFsb2dzIGZvciB0aGUgQXV0aG9yaW5nIFVJLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kbmQvRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL0VkaXRpbmdEb21haW5UYWJsZVRyZWVWaWV3ZXJEcm9wQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzE0OTEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kbmQvRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkRyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkRyYWdBbmREcm9wRmVlZGJhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0vKioKLSAqIERyb3AgYWRhcHRlciBmb3IgZHJhZyBhbmQgZHJvcAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyIGV4dGVuZHMKLQkJRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyIHsKLQotCXB1YmxpYyBFZGl0aW5nRG9tYWluVGFibGVUcmVlVmlld2VyRHJvcEFkYXB0ZXIoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKGRvbWFpbiwgdmlld2VyKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlciNkcmFnRW50ZXIob3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX05PTkUpIHsKLQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQkJc3VwZXIuZHJhZ0VudGVyKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIjZHJhZ092ZXIob3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfTk9ORSkgewotCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCi0JCXN1cGVyLmRyYWdPdmVyKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIjZHJvcEFjY2VwdChvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkcm9wQWNjZXB0KERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX05PTkUpIHsKLQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQotCQlzdXBlci5kcm9wQWNjZXB0KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIjaGVscGVyKG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhlbHBlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJVGFibGUgdGFibGUgPSBudWxsOwotCQlUYWJsZUl0ZW0gaXRlbSA9IG51bGw7Ci0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVRyZWVWaWV3ZXIpIHsKLQkJCXRhYmxlID0gKChUYWJsZVRyZWVWaWV3ZXIpIHZpZXdlcikuZ2V0VGFibGVUcmVlKCkuZ2V0VGFibGUoKTsKLQkJCWl0ZW0gPSB0YWJsZS5nZXRJdGVtKHRhYmxlLnRvQ29udHJvbChldmVudC54LCBldmVudC55KSk7Ci0JCQlldmVudC5pdGVtID0gaXRlbTsKLQkJfQotCi0JCXN1cGVySGVscGVyKGV2ZW50KTsKLQotCQlpZiAoaXRlbSAhPSBudWxsICYmIChldmVudC5mZWVkYmFjayAmIERORC5GRUVEQkFDS19TRUxFQ1QpICE9IDApIHsKLQkJCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10geyBpdGVtIH0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IGRyb3AgdGFyZ2V0Ci0JICogCi0JICogQHBhcmFtIGl0ZW0KLQkgKiBAcmV0dXJuIGRyb3AgdGFyZ2V0IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0RHJvcFRhcmdldChXaWRnZXQgaXRlbSkgewotCQlyZXR1cm4gRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyLmV4dHJhY3REcm9wVGFyZ2V0KGl0ZW0pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgY2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGRyb3AgYWN0aW9uIHNob3VsZCBiZSBpbnZva2VkLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlciNkcm9wKG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCS8vIEEgY29tbWFuZCB3YXMgY3JlYXRlZCBpZiB0aGUgc291cmNlIHdhcyBhdmFpbGFibGUgZWFybHksIGFuZCB0aGUKLQkJLy8gaW5mb3JtYXRpb24gdXNlZCB0byBjcmVhdGUgaXQgd2FzIGNhY2hlZC4uLgotCQlpZiAoZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24gIT0gbnVsbCkgewotCQkJLy8gUmVjcmVhdGUgdGhlIGNvbW1hbmQuCi0JCQljb21tYW5kID0gZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24uY3JlYXRlQ29tbWFuZCgpOwotCQl9IGVsc2UgewotCQkJLy8gT3RoZXJ3aXNlLCB0aGUgc291cmNlIHNob3VsZCBiZSBhdmFpbGFibGUgbm93IGFzIGV2ZW50LmRhdGEsIGFuZAotCQkJLy8gd2UgY2FuIGNyZWF0ZSB0aGUgY29tbWFuZC4KLQkJCXNvdXJjZSA9IGV4dHJhY3REcmFnU291cmNlKGV2ZW50LmRhdGEpOwotCQkJT2JqZWN0IHRhcmdldCA9IGdldERyb3BUYXJnZXQoZXZlbnQuaXRlbSk7Ci0JCQljb21tYW5kID0gRHJhZ0FuZERyb3BDb21tYW5kLmNyZWF0ZShkb21haW4sIHRhcmdldCwKLQkJCQkJZ2V0TG9jYXRpb24oZXZlbnQpLCBldmVudC5vcGVyYXRpb25zLCBvcmlnaW5hbE9wZXJhdGlvbiwKLQkJCQkJc291cmNlKTsKLQkJfQotCi0JCS8vIElmIHRoZSBjb21tYW5kIGNhbiBleGVjdXRlLi4uCi0JCWlmIChjb21tYW5kLmNhbkV4ZWN1dGUoKSkgewotCQkJLy8gRXhlY3V0ZSBpdC4KLQkJCWRvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCQl9IGVsc2UgewotCQkJLy8gT3RoZXJ3aXNlLCBsZXQncyBjYWxsIHRoZSB3aG9sZSB0aGluZyBvZmYuCi0JCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJY29tbWFuZC5kaXNwb3NlKCk7Ci0JCX0KLQotCQkvLyBDbGVhbiB1cCB0aGUgc3RhdGUuCi0JCWNvbW1hbmQgPSBudWxsOwotCQljb21tYW5kVGFyZ2V0ID0gbnVsbDsKLQkJc291cmNlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdGhlIHNhbWUgd2F5IGZvciBlYWNoIG9mIHRoZQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRMaXN0ZW5lcn0gbWV0aG9kcywgZXhjZXB0IGZvciBsZWF2ZQotCSAqIGFuZCBkcm9wLiBJZiB0aGUgc291cmNlIGlzIGF2YWlsYWJsZSBlYXJseSwgaXQgY3JlYXRlcyBvciByZXZhbGlkYXRlcyB0aGUKLQkgKiB7QGxpbmsgRHJhZ0FuZERyb3BDb21tYW5kfSwgYW5kIHVwZGF0ZXMgdGhlIGV2ZW50J3MgZGV0YWlsIChvcGVyYXRpb24pCi0JICogYW5kIGZlZWRiYWNrIChkcmFnIHVuZGVyIGVmZmVjdCksIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3VwZXJIZWxwZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCS8vIElmIHdlIGNhbid0IGRvIGFueXRoaW5nIGVsc2UsIHdlJ2xsIHByb3ZpZGUgdGhlIGRlZmF1bHQgc2VsZWN0Ci0JCS8vIGZlZWRiYWNrIGFuZCBlbmFibGUgYXV0by1zY3JvbGwgYW5kIGF1dG8tZXhwYW5kIGVmZmVjdHMuCi0JCWV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX1NFTEVDVCB8IGdldEF1dG9GZWVkYmFjaygpOwotCi0JCS8vIElmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBpdCwgdHJ5IHRvIGdldCB0aGUgc291cmNlIGVhcmx5LiBXZSBjYW4ndAotCQkvLyBnaXZlIGZlZWRiYWNrIGlmIGl0J3Mgbm90IGF2YWlsYWJsZSB5ZXQgKHRoaXMgaXMgcGxhdGZvcm0tZGVwZW5kZW50KS4KLQkJaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0JCQlzb3VyY2UgPSBnZXREcmFnU291cmNlKGV2ZW50KTsKLQkJCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBHZXQgdGhlIHRhcmdldCBvYmplY3QgZnJvbSB0aGUgaXRlbSB3aWRnZXQgYW5kIHRoZSBtb3VzZSBsb2NhdGlvbiBpbgotCQkvLyBpdC4KLQkJT2JqZWN0IHRhcmdldCA9IGdldERyb3BUYXJnZXQoZXZlbnQuaXRlbSk7Ci0JCWZsb2F0IGxvY2F0aW9uID0gZ2V0TG9jYXRpb24oZXZlbnQpOwotCi0JCS8vIERldGVybWluZSBpZiB3ZSBjYW4gY3JlYXRlIGEgdmFsaWQgY29tbWFuZCBhdCB0aGUgY3VycmVudCBsb2NhdGlvbi4KLQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCi0JCS8vIElmIHdlIGRvbid0IGhhdmUgYSBwcmV2aW91cyBjYWNoZWQgY29tbWFuZC4uLgotCQlpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0JCQkvLyBXZSdsbCBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGluZm9ybWF0aW9uIHdlIHVzZSB0byBjcmVhdGUgdGhlCi0JCQkvLyBjb21tYW5kLCBzbyB0aGF0IHdlIGNhbiByZWNyZWF0ZSBpdCBpbiBkcm9wLgotCQkJZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24gPSBuZXcgRHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24oCi0JCQkJCWRvbWFpbiwgdGFyZ2V0LCBsb2NhdGlvbiwgZXZlbnQub3BlcmF0aW9ucywKLQkJCQkJb3JpZ2luYWxPcGVyYXRpb24sIHNvdXJjZSk7Ci0KLQkJCS8vIFJlbWVtYmVyIHRoZSB0YXJnZXQ7IGNyZWF0ZSB0aGUgY29tbWFuZCBhbmQgdGVzdCBpZiBpdCBpcwotCQkJLy8gZXhlY3V0YWJsZS4KLQkJCWNvbW1hbmRUYXJnZXQgPSB0YXJnZXQ7Ci0JCQljb21tYW5kID0gZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24uY3JlYXRlQ29tbWFuZCgpOwotCQkJdmFsaWQgPSBjb21tYW5kLmNhbkV4ZWN1dGUoKTsKLQkJfSBlbHNlIHsKLQkJCS8vIENoZWNrIGlmIHRoZSBjYWNoZWQgY29tbWFuZCBjYW4gcHJvdmlkZSBETkQKLQkJCS8vIGZlZWRiYWNrL3JldmFsaWRhdGlvbi4KLQkJCWlmICh0YXJnZXQgPT0gY29tbWFuZFRhcmdldAotCQkJCQkmJiBjb21tYW5kIGluc3RhbmNlb2YgRHJhZ0FuZERyb3BGZWVkYmFjaykgewotCQkJCS8vIElmIHNvLCByZXZhbGlkYXRlIHRoZSBjb21tYW5kLgotCQkJCXZhbGlkID0gKChEcmFnQW5kRHJvcEZlZWRiYWNrKSBjb21tYW5kKS52YWxpZGF0ZSh0YXJnZXQsCi0JCQkJCQlsb2NhdGlvbiwgZXZlbnQub3BlcmF0aW9ucywgb3JpZ2luYWxPcGVyYXRpb24sIHNvdXJjZSk7Ci0KLQkJCQkvLyBLZWVwIHRyYWNrIG9mIGFueSBjaGFuZ2VzIHRvIHRoZSBjb21tYW5kIGluZm9ybWF0aW9uLgotCQkJCWRyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uID0gbmV3IERyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uKAotCQkJCQkJZG9tYWluLCB0YXJnZXQsIGxvY2F0aW9uLCBldmVudC5vcGVyYXRpb25zLAotCQkJCQkJb3JpZ2luYWxPcGVyYXRpb24sIHNvdXJjZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIElmIG5vdCwgZGlzcG9zZSB0aGUgY3VycmVudCBjb21tYW5kIGFuZCBjcmVhdGUgYSBuZXcgb25lLgotCQkJCWRyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uID0gbmV3IERyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uKAotCQkJCQkJZG9tYWluLCB0YXJnZXQsIGxvY2F0aW9uLCBldmVudC5vcGVyYXRpb25zLAotCQkJCQkJb3JpZ2luYWxPcGVyYXRpb24sIHNvdXJjZSk7Ci0JCQkJY29tbWFuZFRhcmdldCA9IHRhcmdldDsKLQkJCQljb21tYW5kLmRpc3Bvc2UoKTsKLQkJCQljb21tYW5kID0gZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24uY3JlYXRlQ29tbWFuZCgpOwotCQkJCXZhbGlkID0gY29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBJZiB0aGlzIGNvbW1hbmQgY2FuIHByb3ZpZGUgZGV0YWlsZWQgZHJhZyBhbmQgZHJvcCBmZWVkYmFjay4uLgotCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIERyYWdBbmREcm9wRmVlZGJhY2spIHsKLQkJCS8vIFVzZSBpdCBmb3IgdGhlIG9wZXJhdGlvbiBhbmQgZHJhZyB1bmRlciBlZmZlY3QuCi0JCQlEcmFnQW5kRHJvcEZlZWRiYWNrIGRyYWdBbmREcm9wRmVlZGJhY2sgPSAoRHJhZ0FuZERyb3BGZWVkYmFjaykgY29tbWFuZDsKLQkJCWV2ZW50LmRldGFpbCA9IGRyYWdBbmREcm9wRmVlZGJhY2suZ2V0T3BlcmF0aW9uKCk7Ci0JCQlldmVudC5mZWVkYmFjayA9IGRyYWdBbmREcm9wRmVlZGJhY2suZ2V0RmVlZGJhY2soKQotCQkJCQl8IGdldEF1dG9GZWVkYmFjaygpOwotCQl9IGVsc2UgaWYgKCF2YWxpZCkgewotCQkJLy8gVGhlcmUgaXMgbm8gZXhlY3V0YWJsZSBjb21tYW5kLCBzbyB3ZSdkIGJldHRlciBuaXggdGhlIHdob2xlCi0JCQkvLyBkZWFsLgotCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RuZC9MaWJyYXJ5Vmlld2VyRHJhZ0FkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kbmQvTGlicmFyeVZpZXdlckRyYWdBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRlNjE3NjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RuZC9MaWJyYXJ5Vmlld2VyRHJhZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuVmlld2VyRHJhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5IVE1MVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVGhlIGRyYWcgYWRhcHRlciBmb3IgdGhlIExpYnJhcnkgVmlld2VyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlWaWV3ZXJEcmFnQWRhcHRlciBleHRlbmRzIFZpZXdlckRyYWdBZGFwdGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWRpdG9yRHJhZ0FkYXB0ZXI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5Vmlld2VyRHJhZ0FkYXB0ZXIoVmlld2VyIHZpZXdlcikgewotCQlzdXBlcih2aWV3ZXIpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIGRyYWdnaW5nIGlzIGluaXRpYXRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmRyYWdTdGFydChldmVudCk7Ci0JCWV2ZW50LmRvaXQgPSAhdmlld2VyLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gdHJhbnNmZXIgdGhlIGRhdGEuCi0JICovCi0JcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChIVE1MVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlPYmplY3RbXSBzZWxlY3RlZEVsZW1lbnRzID0gc2VsZWN0aW9uLnRvTGlzdCgpLnRvQXJyYXkoCi0JCQkJCW5ldyBPYmplY3Rbc2VsZWN0aW9uLnNpemUoKV0pOwotCQkJaWYgKHNlbGVjdGVkRWxlbWVudHMgIT0gbnVsbCAmJiBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDApIHsKLQkJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gVG5nVXRpbC51bndyYXAoc2VsZWN0ZWRFbGVtZW50c1swXSk7Ci0JCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJU3RyaW5nIGxpbmtUZXh0ID0gZ2V0SHlwZXJsaW5rKChNZXRob2RFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnQpOwkJCQkJCi0JCQkJCWlmIChQbGF0Zm9ybS5nZXRPUygpLmVxdWFscyhQbGF0Zm9ybS5XU19XSU4zMikpIHsKLQkJCQkJCWV2ZW50LmRhdGEgPSBuZXcgU3RyaW5nKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKGxpbmtUZXh0KSk7CQkJCQkJCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlldmVudC5kYXRhID0gbGlua1RleHQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gCi0JCWlmIChUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlPYmplY3RbXSBzZWxlY3RlZEVsZW1lbnRzID0gc2VsZWN0aW9uLnRvTGlzdCgpLnRvQXJyYXkoCi0JCQkJCW5ldyBPYmplY3Rbc2VsZWN0aW9uLnNpemUoKV0pOwotCQkJaWYgKHNlbGVjdGVkRWxlbWVudHMgIT0gbnVsbCAmJiBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDApIHsKLQkJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gVG5nVXRpbC51bndyYXAoc2VsZWN0ZWRFbGVtZW50c1swXSk7Ci0JCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJU3RyaW5nIGxpbmtUZXh0ID0gZ2V0SHlwZXJsaW5rKChNZXRob2RFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnQpOwkJCQkJCi0JCQkJCWlmIChQbGF0Zm9ybS5nZXRPUygpLmVxdWFscyhQbGF0Zm9ybS5XU19XSU4zMikpIHsKLQkJCQkJCWV2ZW50LmRhdGEgPSBuZXcgU3RyaW5nKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKGxpbmtUZXh0KSk7CQkJCQkJCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlldmVudC5kYXRhID0gbGlua1RleHQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuZHJhZ1NldERhdGEoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGh5cGVybGluayBmb3IgdGhlIGdpdmVuIE1ldGhvZCBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SHlwZXJsaW5rKE1ldGhvZEVsZW1lbnQgZHJhZ0VsZW1lbnQpIHsKLQkJTWV0aG9kRWxlbWVudCBkcm9wRWxlbWVudCA9IG51bGw7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yID0gYWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJaWYgKGFjdGl2ZUVkaXRvciAhPSBudWxsKSB7Ci0JCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBhY3RpdmVFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJCWRyb3BFbGVtZW50ID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KQotCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYoZHJhZ0VsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KXsKLQkJCWRyYWdFbGVtZW50ID0gKChQcm9jZXNzQ29tcG9uZW50KWRyYWdFbGVtZW50KS5nZXRQcm9jZXNzKCk7Ci0JCX0KLQotCQlTdHJpbmcgaHJlZiA9IFJlc291cmNlSGVscGVyLmdldFVybChkcmFnRWxlbWVudCwgZHJvcEVsZW1lbnQsICIuaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50TGluayhkcmFnRWxlbWVudCwgdHJ1ZSwKLQkJCQkiZmlsZTovLyIgKyBocmVmKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RuZC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzg1N2Y1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGRyYWcgYW5kIGRyb3Agc3VwcG9ydCBmb3IgdGhlIEF1dGhvcmluZyBVSS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9BYnN0cmFjdEJhc2VGb3JtRWRpdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9BYnN0cmFjdEJhc2VGb3JtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0MjU5MWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQWJzdHJhY3RCYXNlRm9ybUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIG1ldGhvZCBlZGl0b3JzLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCYXNlRm9ybUVkaXRvciBleHRlbmRzIEZvcm1FZGl0b3IgewotCi0JLy8gR2xvYmFsIG1hcCB1c2VkIHRvIHJlY29yZCB3aGljaCBlZGl0b3IgbW9kaWZpZXMgdGhlIHNoYXJlZCByZXNvdXJjZQotCS8vIGZpcnN0LgotCS8vIFRoaXMgZW5hYmxlcyB0aGUgYXBwcm9wcmlhdGUgZWRpdG9ycyB0byBiZSBmbGFnZ2VkIGFzIGRpcnR5LgotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgTWFwIFNIQVJFRF9SRVNPVVJDRV9UT19FRElUT1JTX01BUCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBJZiB0cnVlLCBkZWJ1ZyB0cmFjaW5nIGlzIGVuYWJsZWQuCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8vIENvbGxlY3Rpb24gb2YgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9kZWwgZGF0YSBiZWluZyBlZGl0ZWQgYnkKLQkvLyB0aGlzIGVkaXRvci4KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiByZXNvdXJjZXM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdEJhc2VGb3JtRWRpdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3IjYWRkUGFnZXMoKQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZFBhZ2VzKCk7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zYXZlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJIkVycm9yIHNhdmluZyBsaWJyYXJ5OiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlQXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc1NhdmVBc0FsbG93ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJcmV0dXJuIG1hbmFnZXIgIT0gbnVsbCA/IG1hbmFnZXIuaXNNZXRob2RMaWJyYXJ5TW9kaWZpZWQoKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBlZGl0b3IuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGVkaXRvcidzIGRpcnR5IHN0YXRlIGJ5IGFkZGluZyBhICIqIiB0byB0aGUgZWRpdG9yIHRhYiBhbmQKLQkgKiBlbmFibGluZyB0aGUgU2F2ZSBidXR0b24uCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlRGlydHlTdGF0dXMoKSB7Ci0JCXN1cGVyLmVkaXRvckRpcnR5U3RhdGVDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9BYnN0cmFjdERpYWdyYW1FZGl0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0Fic3RyYWN0RGlhZ3JhbUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YWE2NzliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0Fic3RyYWN0RGlhZ3JhbUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ2hhbmdlQm91bmRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DcmVhdGVCZW5kcG9pbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNyZWF0ZUxpbmtDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNyZWF0ZU5vZGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLk1vdmVCZW5kcG9pbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGVjaXNpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5EaWFncmFtQWN0aW9uU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkZyZWVUZXh0Tm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTGlua0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUNvbnRhaW5lckVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuU3luY2hCYXJOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5GcmVlVGV4dEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuRGlhZ3JhbVByaW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuVmlld0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMuSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLlByb2Nlc3NEZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db250ZXh0TWVudVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLktleUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLktleVN0cm9rZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZG5kLlRlbXBsYXRlVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmRuZC5UZW1wbGF0ZVRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuU2NhbGFibGVGcmVlZm9ybVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkNvcHlUZW1wbGF0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuR0VGQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYWxldHRlLlBhbGV0dGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhbGV0dGUuUGFsZXR0ZVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYWxldHRlLkZseW91dFBhbGV0dGVDb21wb3NpdGUuRmx5b3V0UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkdyYXBoaWNhbEVkaXRvcldpdGhGbHlvdXRQYWxldHRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5HcmFwaGljYWxWaWV3ZXJLZXlIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5TY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5UcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRm9udERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIGRpYWdyYW0gZWRpdG9ycwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBKaW0gVGhhcmlvCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REaWFncmFtRWRpdG9yIGV4dGVuZHMKLQkJR3JhcGhpY2FsRWRpdG9yV2l0aEZseW91dFBhbGV0dGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRlJFU0hfRlJPTV9CQVNFX0FDVElWSVRZID0gInJlZnJlc2hfZnJvbV9iYXNlX2FjdGl2aXR5IjsgLy8kTk9OLU5MUy0xJAotCS8vIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX0hPUlpfQVZFUkFHRSA9Ci0JLy8gImFsaWduX2hvcml6b250YWxfdG9fYXZlcmFnZSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEID0KLQkvLyAiYWxpZ25faG9yaXpvbnRhbF90b19maXJzdF9zZWxlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fVkVSVF9BVkVSQUdFID0KLQkvLyAiYWxpZ25fdmVydGljYWxfdG9fYXZlcmFnZSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEID0KLQkvLyAiYWxpZ25fdmVydGljYWxfdG9fZmlyc3Rfc2VsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTlRfRElBTE9HID0gImZvbnRfZGlhbG9nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9MSU5LID0gImNyZWF0ZV9saW5rIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9MSU5LID0gInNlbGVjdF9saW5rIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9CRU5EX1BPSU5UID0gImNyZWF0ZV9iZW5kX3BvaW50IjsgLy8kTk9OLU5MUy0xJAkKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9GUkVFX1RFWFQgPSAiY3JlYXRlX2ZyZWVfdGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PVkUgPSAibW92ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRlJFU0ggPSAicmVmcmVzaCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX0JFTkRfUE9JTlQgPSAiYWxpZ25fYmVuZF9wb2ludCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBTEVUVEVfRE9DS19MT0NBVElPTiA9ICJEb2NrIGxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFMRVRURV9TSVpFID0gIlBhbGV0dGUgU2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBTEVUVEVfU1RBVEUgPSAiUGFsZXR0ZSBzdGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUEFMRVRURV9TSVpFID0gMTMwOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0RJQUdSQU0gPSAiZGVsZXRlX2FjdHZpdHlfZGV0YWlsX2RpYWdyYW0iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEtleUhhbmRsZXIgc2hhcmVkS2V5SGFuZGxlcjsKLQotCXByaXZhdGUgUGFsZXR0ZVJvb3QgcGFsZXR0ZVJvb3Q7Ci0KLQlwcm90ZWN0ZWQgRWRpdFBhcnQgZWRpdFBhcnQ7Ci0KLQlwcml2YXRlIENvbW1hbmRTdGFja0V2ZW50TGlzdGVuZXIgY21kU3RhY2tFdmVudExpc3RlbmVyOwotCi0JcHJvdGVjdGVkIENyZWF0aW9uRmFjdG9yeSBmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeTsKLQotCXByb3RlY3RlZCBEaWFncmFtQWN0aW9uU2VydmljZSBhY3Rpb25TZXJ2aWNlID0gbnVsbDsKLQkKLQotCS8qKgotCSAqIFRoZSBwYXJlbnQgaXMgdGhlIGVkaXRvciBmcm9tIHdoZXJlIHRoZSB1c2VyIG9wZW5lZCB0aGlzIGVkaXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgcGFyZW50RWRpdG9yID0gbnVsbDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byBsaXN0ZW4gZm9yIG91ciBwYXJlbnQgZWRpdG9yIGFuZCBvdXIgb3duIGNsb3NpbmcuIFdoZW4gaXQKLQkgKiBkb2VzLCB3ZSBhc2sgdGhlIHVzZXIgaWYgdGhleSB3YW50IHRvIGNsb3NlIHRoaXMgZGlhZ3JhbSBhcyB3ZWxsLgotCSAqLwotCXByb3RlY3RlZCBJUGFydExpc3RlbmVyIHBhcnRMaXN0ZW5lciA9IG5ldyBJUGFydExpc3RlbmVyKCkgewotCQlJRWRpdG9yUGFydCBtZSA9IEFic3RyYWN0RGlhZ3JhbUVkaXRvci50aGlzOwotCi0JCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJLy8gY2hlY2sgaWYgdGhlIGVkaXRvciBjbG9zZWQgYXMgYSByZXN1bHQgb2YgdXNlciBhY3Rpb24gb3IgdGhlCi0JCQkvLyB3b3JrYmVuY2ggY2xvc2luZwotCQkJLy8gSVdvcmtiZW5jaCB3YiA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCQlpZiAocGFydCA9PSBtZSkgewotCQkJCXNldFBhcmVudEVkaXRvcihudWxsKTsKLQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLQkJCQlwYWdlLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCQkJCS8vIHJlbW92ZSB0aGlzIGRpYWdyYW0gaWYgaXQgaXMgbmV3Ci0JCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pICgoRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkuZ2V0Q29udGVudHMoKSkuZ2V0TW9kZWwoKTsKLQkJCQkvLyBtYWtlIHN1cmUgd2UgcmVtb3ZlIHRoZSBVTUEgZGlhZ3JhbSBmcm9tIHRoZSBtb2RlbCBpZiBpdCBpcwotCQkJCS8vIG5ldyAobmV2ZXIgc2F2ZWQpCi0JCQkJaWYgKGRpYWdyYW0uaXNOZXcoKSkgewotCQkJCQlpZiAoZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkgIT0gbnVsbCkgewotCQkJCQlFY29yZVV0aWwucmVtb3ZlKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQkJfQotCQkJCQlpZihpc1Jlc291cmNlQ2hhbmdlZEJ5T3RoZXIoKSkgewotCQkJCQlkb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyBlbHNlIGlmICghd2IuaXNDbG9zaW5nKCkpIHsKLQkJCS8vIC8vIGFyZSB3ZSBiZWluZyBub3RpZmllZCBhYm91dCBvdXIgcGFyZW50IGVkaXRvciBvYmplY3Q/Ci0JCQkvLyBpZiAoZ2V0UGFyZW50RWRpdG9yKCkgIT0gbnVsbCkgewotCQkJLy8gaWYgKHBhcnQgPT0gZ2V0UGFyZW50RWRpdG9yKCkpIHsKLQkJCS8vIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpOwotCQkJLy8gLy8geWVzLCBhc2sgdGhlIHVzZXIgaWYgdGhleSB3YW50IHRvIGNsb3NlIHRoaXMKLQkJCS8vIC8vIGVkaXRvcgotCQkJLy8gaWYgKEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkvLyAuZ2V0RGVmYXVsdCgpCi0JCQkvLyAuZ2V0TXNnRGlhbG9nKCkKLQkJCS8vIC5kaXNwbGF5UHJvbXB0KAotCQkJLy8gRGlhZ3JhbVVJUmVzb3VyY2VzCi0JCQkvLyAuZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWJzdHJhY3REaWFncmFtRWRpdG9yLlBhcmVudEVkaXRvckNsb3NlLnRpdGxlIiksCi0JCQkvLyAvLyROT04tTkxTLTEkCi0JCQkvLyBEaWFncmFtVUlSZXNvdXJjZXMKLQkJCS8vIC5mb3JtYXRTdHJpbmcoCi0JCQkvLyAiRGlhZ3JhbVVJLkFic3RyYWN0RGlhZ3JhbUVkaXRvci5QYXJlbnRFZGl0b3JDbG9zZS50ZXh0IiwKLQkJCS8vIGdldFBhcmVudEVkaXRvcigpLmdldFRpdGxlKCksIG1lLmdldFRpdGxlKCkpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyAvLyB5ZXMsIGNsb3NlIHRoaXMgZGlhZ3JhbSwgYXNrIHRvIHNhdmUgY2hhbmdlcwotCQkJLy8gcGFnZS5jbG9zZUVkaXRvcihtZSwgdHJ1ZSk7Ci0JCQkvLyB9Ci0JCQkvLyAvLyBlaXRoZXIgd2F5LCBvdXIgcGFyZW50IGlzIGNsb3NlZCBhbmQgd2UgY2FuIHN0b3AKLQkJCS8vIC8vIGxpc3RlbmluZwotCQkJLy8gcGFnZS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBGb250IGZvbnQ7Ci0KLQlwcml2YXRlIENvbG9yIGNvbG9yOwotCi0JcHJpdmF0ZSBDb21tYW5kIHJlZnJlc2hGcm9tQmFzZUNvbW1hbmQgPSBuZXcgQ29tbWFuZChEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9ycmVmcmVzaGZyb21iYXNlKSB7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBBcnJheUxpc3Qgb2xkQ29udGVudCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0KLQkJCS8vIGJhY2sgdXAgb2xkIGRpYWdyYW0gY29udGVudAotCQkJLy8KLQkJCW9sZENvbnRlbnQuY2xlYXIoKTsKLQkJCW9sZENvbnRlbnQuYWRkQWxsKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpLmdldENvbnRhaW5lZCgpKTsKLQotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5yZWZyZXNoRnJvbUJhc2UoZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJaWYgKGVkaXRQYXJ0LmlzQWN0aXZlKCkpIHsKLQkJCQllZGl0UGFydC5kZWFjdGl2YXRlKCk7Ci0JCQl9Ci0JCQlkaWFncmFtLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJY3JlYXRlRWRpdFBhcnQoKTsKLQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLnNldENvbnRlbnRzKGVkaXRQYXJ0KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCWRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpLmdldENvbnRhaW5lZCgpLmNsZWFyKCk7Ci0JCQlkaWFncmFtLmdldFVNQURpYWdyYW0oKS5nZXRDb250YWluZWQoKS5hZGRBbGwob2xkQ29udGVudCk7Ci0JCQlpZiAoZWRpdFBhcnQuaXNBY3RpdmUoKSkgewotCQkJCWVkaXRQYXJ0LmRlYWN0aXZhdGUoKTsKLQkJCX0KLQkJCWRpYWdyYW0ucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQljcmVhdGVFZGl0UGFydCgpOwotCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2V0Q29udGVudHMoZWRpdFBhcnQpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBNYXAgdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXA7Ci0JLyoqCi0JICogUmVjb3JkcyB0aW1lIHdoZW4gdGhlIG1vZGVsIGZpcnN0IGhhcyBiZWVuIGNoYW5nZWQgYnkgdGhpcyBlZGl0b3IuIFRoaXMgd2lsbCBiZSB1c2VkIGxhdGVyCi0JICogdG8gZGV0ZXJtaW5lIGlmIHNhdmUgaXMgbmVlZGVkIHRvIHJldmVyc2UgdGhlIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIGxvbmcgY2hhbmdlVGltZSA9IC0xOwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWc7Ci0KLQljbGFzcyBEaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciBleHRlbmRzIENvbnRleHRNZW51UHJvdmlkZXIgewotCi0JCXByaXZhdGUgQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnk7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgV29ya2Zsb3dDb250ZXh0TWVudVByb3ZpZGVyIGFzc29pY2F0ZWQgd2l0aCB0aGUgZ2l2ZW4KLQkJICogdmlld2VyIGFuZCBhY3Rpb24gcmVnaXN0cnkuCi0JCSAqIAotCQkgKiBAcGFyYW0gdmlld2VyCi0JCSAqICAgICAgICAgICAgdGhlIHZpZXdlcgotCQkgKiBAcGFyYW0gcmVnaXN0cnkKLQkJICogICAgICAgICAgICB0aGUgYWN0aW9uIHJlZ2lzdHJ5Ci0JCSAqLwotCQlwdWJsaWMgRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIoRWRpdFBhcnRWaWV3ZXIgdmlld2VyLAotCQkJCUFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCQlzdXBlcih2aWV3ZXIpOwotCQkJc2V0QWN0aW9uUmVnaXN0cnkocmVnaXN0cnkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgQ29udGV4dE1lbnVQcm92aWRlciNidWlsZENvbnRleHRNZW51KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBidWlsZENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCQlHRUZBY3Rpb25Db25zdGFudHMuYWRkU3RhbmRhcmRBY3Rpb25Hcm91cHMobWVudSk7Ci0KLQkJCUlBY3Rpb24gYWN0aW9uOwotCQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5VTkRPLmdldElkKCkpOwotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5HUk9VUF9VTkRPLCBhY3Rpb24pOwotCi0JCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSk7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLkdST1VQX1VORE8sIGFjdGlvbik7Ci0KLQkJCWJvb2xlYW4gY2FuTW9kaWZ5ID0gIWlzUmVhZE9ubHkoKTsKLQotCQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKQotCQkJCQkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotCQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQlpZiAoIVRuZ1V0aWwuaXNMb2NrZWQoZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpKSkgewotCQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLkdST1VQX0VESVQsIGFjdGlvbik7Ci0JCQkJfQotCQkJfQotCi0JCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihSRUZSRVNIKTsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuR1JPVVBfVklFVywgYWN0aW9uKTsKLQotCQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oRk9OVF9ESUFMT0cpOwotCQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJCX0KLQotCQkJSUFjdGlvbiBjcmVhdGVGcmVlVGV4dEFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQlDUkVBVEVfRlJFRV9URVhUKTsKLQkJCWlmIChjcmVhdGVGcmVlVGV4dEFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJCWNyZWF0ZUZyZWVUZXh0QWN0aW9uKTsKLQkJCX0KLQotCQkJLy8gSUFjdGlvbiBtb3ZlQWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oTU9WRSk7Ci0JCQkvLyBpZihtb3ZlQWN0aW9uLmlzRW5hYmxlZCgpKXsKLQkJCS8vIG1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLG1vdmVBY3Rpb24pOwotCQkJLy8gfQotCQkJSUFjdGlvbiBsaW5rQWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0xJTkspOwotCQkJaWYgKGxpbmtBY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGxpbmtBY3Rpb24pOwotCQkJfQotCQkJSUFjdGlvbiBzZWxlY3RsaW5rQWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCVNFTEVDVF9MSU5LKTsKLQkJCWlmIChzZWxlY3RsaW5rQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQlzZWxlY3RsaW5rQWN0aW9uKTsKLQkJCX0KLQkJCUlBY3Rpb24gYmVuZHBvaW50QWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCUNSRUFURV9CRU5EX1BPSU5UKTsKLQkJCWlmIChiZW5kcG9pbnRBY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQliZW5kcG9pbnRBY3Rpb24pOwotCQkJfQotCQkJSUFjdGlvbiBhbGlnbmJlbmRwb2ludGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQlBTElHTl9CRU5EX1BPSU5UKTsKLQkJCWlmIChhbGlnbmJlbmRwb2ludGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJCWFsaWduYmVuZHBvaW50YWN0aW9uKTsKLQkJCX0KLQkJCQotCQkJLy9QcmludCBBY3Rpb24gZm9yIGRpYWdyYW0gdGhyb3VnaCBDb250ZXh0IE1lbnUuCi0JCQkvLyBFbmFibGUgdGhpcyBjb2RlIHdoZW4gcHJpbnQgcmVxdWlyZWQgZm9yIGRpYWdyYW0uCi0vLwkJCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuUFJJTlQuZ2V0SWQoKSk7Ci0vLwkJCWlmKGFjdGlvbi5pc0VuYWJsZWQoKSl7Ci0vLwkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLkdST1VQX1BSSU5ULCBhY3Rpb24pOwotLy8JCQl9Ci0JCQkKLQkJCWNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KG1lbnUpOwotCQl9Ci0KLQkJcHJpdmF0ZSBBY3Rpb25SZWdpc3RyeSBnZXRBY3Rpb25SZWdpc3RyeSgpIHsKLQkJCXJldHVybiBhY3Rpb25SZWdpc3RyeTsKLQkJfQotCi0JCS8qKgotCQkgKiBTZXRzIHRoZSBhY3Rpb24gcmVnaXN0cnkKLQkJICogCi0JCSAqIEBwYXJhbSByZWdpc3RyeQotCQkgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gcmVnaXN0cnkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEFjdGlvblJlZ2lzdHJ5KEFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCQlhY3Rpb25SZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICoKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3REaWFncmFtRWRpdG9yKCkgewotCQlzdXBlcigpOwotCQlzZXRFZGl0RG9tYWluKG5ldyBEZWZhdWx0RWRpdERvbWFpbih0aGlzKSk7Ci0JCWdldEVkaXREb21haW4oKS5zZXRDb21tYW5kU3RhY2sobmV3IENvbW1hbmRTdGFjaygpIHsKLQkJCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSBnZXRVbmRvQ29tbWFuZCgpOwotCQkJCWlmIChjbWQgIT0gbnVsbCAmJiAhY21kLmNhblVuZG8oKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5pc0RpcnR5KCk7Ci0JCQl9Ci0JCQkKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjayNleGVjdXRlKG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQkJCWlmKGNvbW1hbmQgPT0gbnVsbCB8fCAhY29tbWFuZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZihjaGFuZ2VUaW1lID09IC0xKSB7Ci0JCQkJCWNoYW5nZVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQl9Ci0JCQkJc3VwZXIuZXhlY3V0ZShjb21tYW5kKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gYWRkIENvbW1hbmRTdGFja0V2ZW50TGlzdGVuZXIKLQkJLy8KLQkJY21kU3RhY2tFdmVudExpc3RlbmVyID0gbmV3IENvbW1hbmRTdGFja0V2ZW50TGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHN0YWNrQ2hhbmdlZChDb21tYW5kU3RhY2tFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXREZXRhaWwoKSA9PSBDb21tYW5kU3RhY2suUE9TVF9FWEVDVVRFKSB7Ci0JCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQkJZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpLmFkZENvbW1hbmRTdGFja0V2ZW50TGlzdGVuZXIoCi0JCQkJY21kU3RhY2tFdmVudExpc3RlbmVyKTsKLQkJLy8gYWRkIG91ciBwYXJ0IGxpc3RlbmVyIGlmIGVpdGhlciBwYXJlbnQgb3IgdGhpcyBjbG9zZXMKLQkJSVdvcmtiZW5jaCB3YiA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luID0gd2IuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW4uZ2V0QWN0aXZlUGFnZSgpOwotCQlwYWdlLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkdyYXBoaWNhbEVkaXRvciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlnZXRDb21tYW5kU3RhY2soKQotCQkJCS5yZW1vdmVDb21tYW5kU3RhY2tFdmVudExpc3RlbmVyKGNtZFN0YWNrRXZlbnRMaXN0ZW5lcik7Ci0KLQkJaWYgKGlzRGlydHkoKSkgewotCQkJLy8gY2hhbmdlcyBkaXNjYXJkZWQsIHJldmVyc2UgdG8gc2F2ZWQKLQkJCS8vCi0JCQlyZXZlcnNlVG9TYXZlZCgpOwotCQl9Ci0KLQkJaWYgKGVkaXRQYXJ0ICE9IG51bGwpIHsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCWRpYWdyYW0ucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZm9udCAhPSBudWxsICYmICFmb250LmlzRGlzcG9zZWQoKSkgewotCQkJZm9udC5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGNvbG9yICE9IG51bGwgJiYgIWNvbG9yLmlzRGlzcG9zZWQoKSkgewotCQkJY29sb3IuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIucmVtb3ZlTGlzdGVuZXIobGlicmFyeUxpc3RlbmVyKTsKLQkJfQotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVzb3VyY2VDaGFuZ2VkQnlPdGhlcigpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCkuZVJlc291cmNlKCk7Ci0JCWlmKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkpewotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJcmV0dXJuIGZpbGUubGFzdE1vZGlmaWVkKCkgPiBjaGFuZ2VUaW1lOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmV2ZXJzZVRvU2F2ZWQoKSB7Ci0JCS8vIHNhdmUgdGhlIHVuZG9uZSBjaGFuZ2VzIG9ubHkgaWYgdGhlIHJlc291cmNlIGhhcyBiZWVuIGNoYW5nZWQgb3V0c2lkZSB0aGlzIGVkaXRvcgotCQkvLwotCQlib29sZWFuIHNhdmVOZWVkZWQgPSBnZXRDb21tYW5kU3RhY2soKS5pc0RpcnR5KCkgJiYgaXNSZXNvdXJjZUNoYW5nZWRCeU90aGVyKCk7Ci0JCWNoYW5nZVRpbWUgPSAtMTsKLQkJd2hpbGUgKGdldENvbW1hbmRTdGFjaygpLmlzRGlydHkoKSkgewotCQkJZ2V0Q29tbWFuZFN0YWNrKCkudW5kbygpOwotCQl9Ci0JCWlmIChzYXZlTmVlZGVkKSB7Ci0JCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJdHJ5IHsKLQkJCQlwZXJzaXN0ZXIuc2F2ZShnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCkuZVJlc291cmNlKCkpOwotCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJVmlld0hlbHBlci5yZWxvYWRDdXJyZW50TGlicmFyeShnZXRTaXRlKCkuZ2V0U2hlbGwoKSwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVRvQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJYm9vbGVhbiBjYW5Nb2RpZnkgPSAhaXNSZWFkT25seSgpOwotCQlJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCVJFRlJFU0hfRlJPTV9CQVNFX0FDVElWSVRZKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQl9Ci0JCS8vIHRoZSBhbGlnbiBtZW51IGlzIGEgY2FzY2FkaW5nIG1lbnUKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY2kgPSBjcmVhdGVBbGlnbk1lbnUoKTsKLQkJaWYgKGNpLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudQotCQkJCQkuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQkJCW5ldyBTZXBhcmF0b3IoKSk7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgY2kpOwotCQkJbWVudQotCQkJCQkuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQkJCW5ldyBTZXBhcmF0b3IoKSk7Ci0JCX0KLQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oREVMRVRFX0RJQUdSQU0pOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudQotCQkJCQkuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQkJCW5ldyBTZXBhcmF0b3IoKSk7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJCW1lbnUKLQkJCQkJLmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJCQluZXcgU2VwYXJhdG9yKCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElDb250cmlidXRpb25JdGVtIGNyZWF0ZUFsaWduTWVudSgpIHsKLQkJLy8gY3JlYXRlIGEgbmV3IG1lbnUgbWFuYWdlciBmb3IgdGhlIGNhc2NhZGluZyBtZW51Ci0JCU1lbnVNYW5hZ2VyIGFsaWduTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dCkgeyAvLyROT04tTkxTLTEkCi0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlpbnQgdG90YWwgPSAwOwotCQkJCS8vIGVuYWJsZSB0aGUgbWVudSBvbmx5IGlmIDIgb3IgbW9yZSBub2RlcyBvciBub2RlIGNvbnRhaW5lcnMKLQkJCQkvLyBhcmUgc2VsZWN0ZWQKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJLy8gbmVlZCBhdCBsZWFzdCB0d28gdGhpbmdzIHNlbGVjdGVkIHRvIGFsaWduCi0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgPiAxKSB7Ci0JCQkJCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQkJCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldChhKTsKLQkJCQkJCS8vIHdlIGNhbiBhbGlnbiBub2RlcyBhbmQgY29udGFpbmVycwotCQkJCQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0Ci0JCQkJCQkJCXx8IGVkaXRQYXJ0IGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkJCQkJLy8gYWRkIHVwIHRoZSBlbGVtZW50cyB3ZSBuZWVkLCB0aGVyZSBtYXkgYmUgbW9yZQotCQkJCQkJCS8vIGVsZW1lbnRzIHNlbGVjdGVkIChsaW5rcywgZXRjLikKLQkJCQkJCQl0b3RhbCsrOwotCQkJCQkJCWlmICh0b3RhbCA+IDEpIHsKLQkJCQkJCQkJLy8gd2Ugb25seSBuZWVkIHRvIGtub3cgdGhlcmUgaXMgbW9yZSB0aGFuIDEsIHNvCi0JCQkJCQkJCS8vIHdlIGNhbiBzdG9wIGhlcmUKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0b3RhbCA+IDE7Ci0JCQl9Ci0JCX07Ci0JCS8vIGFkZCB0aGUgYWN0aW9ucyB0byB0aGlzIG1lbnUKLQkJYWxpZ25NZW51TWFuYWdlci5hZGQoZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJRGlhZ3JhbUFjdGlvblNlcnZpY2UuQUxJR05fSE9SWl9BVkVSQUdFKSk7Ci0JCWFsaWduTWVudU1hbmFnZXIuYWRkKGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX0hPUlpfRklSU1RfU0VMRUNURUQpKTsKLQkJYWxpZ25NZW51TWFuYWdlci5hZGQoZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJRGlhZ3JhbUFjdGlvblNlcnZpY2UuQUxJR05fVkVSVF9BVkVSQUdFKSk7Ci0JCWFsaWduTWVudU1hbmFnZXIuYWRkKGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX1ZFUlRfRklSU1RfU0VMRUNURUQpKTsKLQkJcmV0dXJuIGFsaWduTWVudU1hbmFnZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZyb21CYXNlKCkgewotCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKHJlZnJlc2hGcm9tQmFzZUNvbW1hbmQpOwotCi0JCS8vIERpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkvLyBHcmFwaGljYWxEYXRhSGVscGVyLnJlZnJlc2hGcm9tQmFzZShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCS8vIE9iamVjdCBhY3QgPSBkaWFncmFtLmdldE9iamVjdCgpOwotCQkvLyBpZihlZGl0UGFydC5pc0FjdGl2ZSgpKSB7Ci0JCS8vIGVkaXRQYXJ0LmRlYWN0aXZhdGUoKTsKLQkJLy8gfQotCQkvLyBkaWFncmFtLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkvLyBlZGl0UGFydCA9IGNyZWF0ZUVkaXRQYXJ0KGFjdCk7Ci0JCS8vIGdldEdyYXBoaWNhbFZpZXdlcigpLnNldENvbnRlbnRzKGVkaXRQYXJ0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQlzdXBlci5jcmVhdGVBY3Rpb25zKCk7Ci0KLQkJQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRBY3Rpb25SZWdpc3RyeSgpOwotCQlJQWN0aW9uIGFjdGlvbjsKLQotCQkvLyByZXBsYWNlIGRlZmF1bHQgZGVsZXRlIGFjdGlvbiB3aXRoIGEgY3VzdG9tIG9uZQotCQkvLwotCQlhY3Rpb24gPSByZWdpc3RyeS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSk7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJcmVnaXN0cnkucmVtb3ZlQWN0aW9uKGFjdGlvbik7Ci0JCQlnZXRTZWxlY3Rpb25BY3Rpb25zKCkucmVtb3ZlKGFjdGlvbik7Ci0JCX0KLQkJYWN0aW9uID0gbmV3IERlbGV0ZUFjdGlvbigoSVdvcmtiZW5jaFBhcnQpIHRoaXMpIHsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5Xb3JrYmVuY2hQYXJ0QWN0aW9uI2lzRW5hYmxlZCgpCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlyZXR1cm4gc3VwZXIuaXNFbmFibGVkKCk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuRGVsZXRlQWN0aW9uI2NhbGN1bGF0ZUVuYWJsZWQoKQotCQkJICovCi0JCQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBjYWxjdWxhdGVFbmFibGVkKCkgewotCQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0U2VsZWN0ZWRPYmplY3RzKCkuaXRlcmF0b3IoKTsKLQkJCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkJLy8gT2JqZWN0IGVkaXRQYXJ0ID0gaXRlci5uZXh0KCk7Ci0JCQkvLyBpZihlZGl0UGFydCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkvLyBPYmplY3Qgb2JqID0gKChFZGl0UGFydCllZGl0UGFydCkuZ2V0TW9kZWwoKTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJLy8gT2JqZWN0IGVsZW1lbnQgPSAoKE5hbWVkTm9kZSlvYmopLmdldE9iamVjdCgpOwotCQkJLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCS8vIHJldHVybiBmYWxzZTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIHJldHVybiBzdXBlci5jYWxjdWxhdGVFbmFibGVkKCk7Ci0JCQkvLyB9Ci0JCQkvLyBUT0RPOiB1bmNvbW1lbnQgdGhpcyBjb2RlIGlmIHdlIGFyZSByZWFkeSB0byB0ZXN0IGRlbGV0aW5nCi0JCQkvLyBCcmVha2Rvd25FbGVtZW50IG5vZGUKLQkJCS8vCi0JCQkvLyAvKiAobm9uLUphdmFkb2MpCi0JCQkvLyAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuRGVsZXRlQWN0aW9uI3J1bigpCi0JCQkvLyAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0U2VsZWN0ZWRPYmplY3RzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVkaXRQYXJ0ID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gKChFZGl0UGFydCkgZWRpdFBhcnQpLmdldE1vZGVsKCk7Ci0JCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTmFtZWROb2RlKSB7Ci0JCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSAoKE5hbWVkTm9kZSkgb2JqKS5nZXRPYmplY3QoKTsKLQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJCQlQcm9jZXNzRGVsZXRlQWN0aW9uIGRlbGV0ZUFjdGlvbiA9IG5ldyBQcm9jZXNzRGVsZXRlQWN0aW9uKCkgewotCQkJCQkJLyoKLQkJCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJCSAqIAotCQkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbiNjcmVhdGVDb21tYW5kKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCQkJCQkJICovCi0JCQkJCQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQgY3JlYXRlQ29tbWFuZCgKLQkJCQkJCQkJQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQkJCQlkb21haW4gPSBudWxsOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQkJCQkJZG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbigKLQkJCQkJCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCQkJbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCkpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGRvbWFpbiA9PSBudWxsKSB7Ci0JCQkJCQkJCWRvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJCW5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbW1hbmQoc2VsZWN0aW9uKTsKLQkJCQkJCX0KLQotCQkJCQl9OwotCQkJCQlkZWxldGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJCWVsZW1lbnRzKSk7Ci0JCQkJCWRlbGV0ZUFjdGlvbi5ydW4oKTsKLQkJCQkJaWYgKGRlbGV0ZUFjdGlvbi5pc0RlbGV0aW9uQ29uZmlybWVkKCkpIHsKLQkJCQkJCXN1cGVyLnJ1bigpOwotCi0JCQkJCQkvLyBzYXZlIHRoZSBlZGl0b3IKLQkJCQkJCS8vIAotCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCkKLQkJCQkJCQkJLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlkb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0KLQotCQkJCX0gZWxzZSB7Ci0JCQkJCXN1cGVyLnJ1bigpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0KLQkJYWN0aW9uID0gbmV3IENvcHlUZW1wbGF0ZUFjdGlvbih0aGlzKTsKLQkJcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQkvLyByZWZyZXNoIGRpYWdyYW0gZnJvbSBiYXNlIGFjdGlvbgotCQkvLwotCQlhY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBSRUZSRVNIX0ZST01fQkFTRV9BQ1RJVklUWTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJlZnJlc2hGcm9tQmFzZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCk7Ci0JCQkJcmV0dXJuIGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQkvLyBhY3Rpb24gPSBuZXcgTWF0Y2hXaWR0aEFjdGlvbih0aGlzKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0KLQkJLy8gYWN0aW9uID0gbmV3IE1hdGNoSGVpZ2h0QWN0aW9uKHRoaXMpOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQotCQkvLyBhY3Rpb24gPSBuZXcgTG9naWNQYXN0ZVRlbXBsYXRlQWN0aW9uKHRoaXMpOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQotCQkvLyBhY3Rpb24gPSBuZXcgSW5jcmVtZW50RGVjcmVtZW50QWN0aW9uKHRoaXMsIHRydWUpOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQkJLy8KLQkJLy8gYWN0aW9uID0gbmV3IEluY3JlbWVudERlY3JlbWVudEFjdGlvbih0aGlzLCBmYWxzZSk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCQkvLwotCQkvLyBhY3Rpb24gPSBuZXcgRGlyZWN0RWRpdEFjdGlvbigoSVdvcmtiZW5jaFBhcnQpdGhpcyk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCQkvLwotCQkvLyBhY3Rpb24gPSBuZXcgQWxpZ25tZW50QWN0aW9uKChJV29ya2JlbmNoUGFydCl0aGlzLAotCQkvLyBQb3NpdGlvbkNvbnN0YW50cy5MRUZUKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0JCS8vCi0JCS8vIGFjdGlvbiA9IG5ldyBBbGlnbm1lbnRBY3Rpb24oKElXb3JrYmVuY2hQYXJ0KXRoaXMsCi0JCS8vIFBvc2l0aW9uQ29uc3RhbnRzLlJJR0hUKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0JCS8vCi0JCS8vIGFjdGlvbiA9IG5ldyBBbGlnbm1lbnRBY3Rpb24oKElXb3JrYmVuY2hQYXJ0KXRoaXMsCi0JCS8vIFBvc2l0aW9uQ29uc3RhbnRzLlRPUCk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCQkvLwotCQkvLyBhY3Rpb24gPSBuZXcgQWxpZ25tZW50QWN0aW9uKChJV29ya2JlbmNoUGFydCl0aGlzLAotCQkvLyBQb3NpdGlvbkNvbnN0YW50cy5CT1RUT00pOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQkJLy8KLQkJLy8gYWN0aW9uID0gbmV3IEFsaWdubWVudEFjdGlvbigoSVdvcmtiZW5jaFBhcnQpdGhpcywKLQkJLy8gUG9zaXRpb25Db25zdGFudHMuQ0VOVEVSKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0JCS8vCi0JCS8vIGFjdGlvbiA9IG5ldyBBbGlnbm1lbnRBY3Rpb24oKElXb3JrYmVuY2hQYXJ0KXRoaXMsCi0JCS8vIFBvc2l0aW9uQ29uc3RhbnRzLk1JRERMRSk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCi0JCUlBY3Rpb24gYWN0aW9uMSA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBGT05UX0RJQUxPRzsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlFZGl0UGFydCBzZWxlY3RlZEVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkJCQkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKS5nZXQoMCk7Ci0JCQkJCQkKLQkJCQkJCUZvbnREaWFsb2cgZmQgPSBuZXcgRm9udERpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQkJCQkvLyBSZXN0b3Jpbmcgb2xkIHZhbHVlcy4KLQkJCQkJCWlmKHNlbGVjdGVkRWRpdFBhcnQgIT0gbnVsbCl7Ci0JCQkJCQkJcmVzdG9yZUZvbnREYXRhKHNlbGVjdGVkRWRpdFBhcnQsIGZkKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJZmQub3BlbigpOwotCQkJCQkJaWYgKHNlbGVjdGVkRWRpdFBhcnQgaW5zdGFuY2VvZiBGcmVlVGV4dE5vZGVFZGl0UGFydCkgewotCQkJCQkJCWlmIChmZC5nZXRGb250TGlzdCgpICE9IG51bGwpIHsKLQkJCQkJCQkJRm9udERhdGEgZkRhdGEgPSBmZC5nZXRGb250TGlzdCgpWzBdOwotCQkJCQkJCQlpZiAoZkRhdGEgIT0gbnVsbCkgewotCQkJCQkJCQkJaWYgKGZvbnQgIT0gbnVsbCAmJiAhZm9udC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQkJCQlmb250LmRpc3Bvc2UoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCS8vIGlmKGNvbG9yICE9IG51bGwgJiYgIWZvbnQuaXNEaXNwb3NlZCgpKXsKLQkJCQkJCQkJCS8vIGNvbG9yLmRpc3Bvc2UoKTsKLQkJCQkJCQkJCS8vIH0KLQkJCQkJCQkJCWZvbnQgPSBuZXcgRm9udChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXREaXNwbGF5KCksIGZEYXRhKTsKLQkJCQkJCQkJCQotCQkJCQkJCQkJaWYoZmQuZ2V0UkdCKCkgIT0gbnVsbCkKLQkJCQkJCQkJCWNvbG9yID0gbmV3IENvbG9yKG51bGwsIGZkLmdldFJHQigpKTsKLQkJCQkJCQkJCQotCQkJCQkJCQkJKChGcmVlVGV4dEZpZ3VyZSkgKChGcmVlVGV4dE5vZGVFZGl0UGFydCkgc2VsZWN0ZWRFZGl0UGFydCkKLQkJCQkJCQkJCQkJLmdldEZpZ3VyZSgpKS5zZXRGb250KGZvbnQpOwotCQkJCQkJCQkJCi0JCQkJCQkJCQlpZihjb2xvciAhPSBudWxsKQotCQkJCQkJCQkJKChGcmVlVGV4dEZpZ3VyZSkgKChGcmVlVGV4dE5vZGVFZGl0UGFydCkgc2VsZWN0ZWRFZGl0UGFydCkKLQkJCQkJCQkJCQkJLmdldEZpZ3VyZSgpKQotCQkJCQkJCQkJCQkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQotCQkJCQkJCQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9ICgoTm9kZSkgc2VsZWN0ZWRFZGl0UGFydAotCQkJCQkJCQkJCQkuZ2V0TW9kZWwoKSkuZ2V0R3JhcGhOb2RlKCk7Ci0JCQkJCQkJCQlMaXN0IGxpc3QgPSBncmFwaE5vZGUKLQkJCQkJCQkJCQkJLmdldExpc3QoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSk7Ci0KLQkJCQkJCQkJCVN0cmluZyB0ZXh0ID0gKChGcmVlVGV4dEZpZ3VyZSkgKChGcmVlVGV4dE5vZGVFZGl0UGFydCkgc2VsZWN0ZWRFZGl0UGFydCkKLQkJCQkJCQkJCQkJLmdldEZpZ3VyZSgpKS5nZXRUZXh0KCk7Ci0JCQkJCQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IGdldFByb3BlcnR5QnlLZXkoCi0JCQkJCQkJCQkJCWxpc3QsCi0JCQkJCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuR1JBUEhfTk9ERV9GUkVFX1RFWFQpOwotCQkJCQkJCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQkJCQkJCQlwcm9wZXJ0eS5zZXRWYWx1ZSh0ZXh0KTsKLQkJCQkJCQkJCQlsaXN0LmFkZChwcm9wZXJ0eSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlzZXRQcm9wZXJ0eSgKLQkJCQkJCQkJCQkJbGlzdCwKLQkJCQkJCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9OQU1FLAotCQkJCQkJCQkJCQlmRGF0YS5nZXROYW1lKCkpOwotCQkJCQkJCQkJc2V0UHJvcGVydHkoCi0JCQkJCQkJCQkJCWxpc3QsCi0JCQkJCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfU1RZTEUsCi0JCQkJCQkJCQkJCW5ldyBJbnRlZ2VyKGZEYXRhLmdldFN0eWxlKCkpCi0JCQkJCQkJCQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJCQkJCQkJc2V0UHJvcGVydHkoCi0JCQkJCQkJCQkJCWxpc3QsCi0JCQkJCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfSEVJR0hULAotCQkJCQkJCQkJCQluZXcgSW50ZWdlcihmRGF0YS5nZXRIZWlnaHQoKSkKLQkJCQkJCQkJCQkJCQkudG9TdHJpbmcoKSk7Ci0JCQkJCQkJCQlpZihmZC5nZXRSR0IoKSAhPSBudWxsKXsKLQkJCQkJCQkJCXNldFByb3BlcnR5KAotCQkJCQkJCQkJCQlsaXN0LAotCQkJCQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX1JFRCwKLQkJCQkJCQkJCQkJbmV3IEludGVnZXIoZmQuZ2V0UkdCKCkucmVkKQotCQkJCQkJCQkJCQkJCS50b1N0cmluZygpKTsKLQkJCQkJCQkJCXNldFByb3BlcnR5KAotCQkJCQkJCQkJCQlsaXN0LAotCQkJCQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0JMVUUsCi0JCQkJCQkJCQkJCW5ldyBJbnRlZ2VyKGZkLmdldFJHQigpLmJsdWUpCi0JCQkJCQkJCQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJCQkJCQkJc2V0UHJvcGVydHkoCi0JCQkJCQkJCQkJCWxpc3QsCi0JCQkJCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfR1JFRU4sCi0JCQkJCQkJCQkJCW5ldyBJbnRlZ2VyKGZkLmdldFJHQigpLmdyZWVuKQotCQkJCQkJCQkJCQkJCS50b1N0cmluZygpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCXNlbGVjdGVkRWRpdFBhcnQucmVmcmVzaCgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpICE9IDEpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJCQlpZiAoZWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCQlyZXR1cm4gKCgoVHlwZWROb2RlKSBlZGl0UGFydC5nZXRNb2RlbCgpKS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkZSRUVfVEVYVCk7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFByb3BlcnR5IGdldFByb3BlcnR5QnlLZXkoTGlzdCBsaXN0LCBTdHJpbmcga2V5KSB7Ci0JCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGlyb3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGlyb3IuaGFzTmV4dCgpOykgewotCQkJCQkJUHJvcGVydHkgcHJvcGVydHkgPSAoUHJvcGVydHkpIGlyb3IubmV4dCgpOwotCQkJCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQkJCQlpZiAocHJvcGVydHkuZ2V0S2V5KCkuZXF1YWxzKGtleSkpIHsKLQkJCQkJCQkJcmV0dXJuIHByb3BlcnR5OwotCQkJCQkJCX0gCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KExpc3QgbGlzdCwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IGdldFByb3BlcnR5QnlLZXkobGlzdCwga2V5KTsKLQkJCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCQlwcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7Ci0KLQkJCQl9IGVsc2UgewotCQkJCQlwcm9wZXJ0eSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb3BlcnR5KCk7Ci0JCQkJCXByb3BlcnR5LnNldEtleShrZXkpOwotCQkJCQlwcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCQkJfQotCQkJCWxpc3QuYWRkKHByb3BlcnR5KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHJlc3RvcmVGb250RGF0YShFZGl0UGFydCBzZWxlY3RlZEVkaXRQYXJ0LCBGb250RGlhbG9nIGZkKXsKLQkJCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gKChOb2RlKSBzZWxlY3RlZEVkaXRQYXJ0Ci0JCQkJCQkuZ2V0TW9kZWwoKSkuZ2V0R3JhcGhOb2RlKCk7Ci0JCQkJCUxpc3QgbGlzdCA9IGdyYXBoTm9kZQotCQkJCQkJLmdldExpc3QoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSk7Ci0JCQkJCWlmKGxpc3QgIT0gbnVsbCAmJiAhbGlzdC5pc0VtcHR5KCkpewotCQkJCQkJUHJvcGVydHkgcHJvcGVydHkgPSBudWxsOwotCQkJCQkJU3RyaW5nIGZvbnRuYW1lID0gbnVsbCwgZm9udFN0eWxlID0gbnVsbCwgZm9udEhlaWdodCA9IG51bGwsIHJlZCA9IG51bGwsIGJsdWUgPSBudWxsLCBncmVlbiA9IG51bGw7Ci0KLQkJCQkJCXByb3BlcnR5ID0gZ2V0UHJvcGVydHlCeUtleShsaXN0LCBUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX05BTUUpOwotCQkJCQkJaWYocHJvcGVydHkgIT0gbnVsbCApewotCQkJCQkJCWZvbnRuYW1lID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJCX1lbHNlewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJcHJvcGVydHkgPSBnZXRQcm9wZXJ0eUJ5S2V5KGxpc3QsIFRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfU1RZTEUpOwotCQkJCQkJaWYocHJvcGVydHkgIT0gbnVsbCApewotCQkJCQkJCWZvbnRTdHlsZSA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlwcm9wZXJ0eSA9IGdldFByb3BlcnR5QnlLZXkobGlzdCwgVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9IRUlHSFQpOwotCQkJCQkJaWYocHJvcGVydHkgIT0gbnVsbCl7Ci0JCQkJCQkJZm9udEhlaWdodCA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlwcm9wZXJ0eSA9IGdldFByb3BlcnR5QnlLZXkobGlzdCwgVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9SRUQpOwotCQkJCQkJaWYocHJvcGVydHkgIT0gbnVsbCl7Ci0JCQkJCQkJcmVkID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJCX0KLQkJCQkJCXByb3BlcnR5ID0gZ2V0UHJvcGVydHlCeUtleShsaXN0LCBUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0JMVUUpOwotCQkJCQkJaWYocHJvcGVydHkgIT0gbnVsbCl7Ci0JCQkJCQkJYmx1ZSA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlwcm9wZXJ0eSA9IGdldFByb3BlcnR5QnlLZXkobGlzdCwgVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9HUkVFTik7Ci0JCQkJCQlpZihwcm9wZXJ0eSAhPSBudWxsKXsKLQkJCQkJCQlncmVlbiA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCUZvbnREYXRhIGZEYXRhID0gbmV3IEZvbnREYXRhKCk7Ci0JCQkJCQlmRGF0YS5zZXROYW1lKGZvbnRuYW1lKTsKLQkJCQkJCWZEYXRhLnNldEhlaWdodCgobmV3IEludGVnZXIoZm9udEhlaWdodCkpLmludFZhbHVlKCkpOwotCQkJCQkJZkRhdGEuc2V0U3R5bGUoKG5ldyBJbnRlZ2VyKGZvbnRTdHlsZSkpLmludFZhbHVlKCkpOwotCQkJCQkJCi0JCQkJCQkvLywgKG5ldyBJbnRlZ2VyKGZvbnRTdHlsZSkpLmludFZhbHVlKCksIChuZXcgSW50ZWdlcihmb250SGVpZ2h0KSkuaW50VmFsdWUoKSk7Ci0JCQkJCQlpZiggcmVkICE9IG51bGwgJiYgYmx1ZSAhPSBudWxsICYmIGdyZWVuICE9IG51bGwpewotCQkJCQkJCVJHQiByZ2IgPSBuZXcgUkdCKG5ldyBJbnRlZ2VyKHJlZCkuaW50VmFsdWUoKSwKLQkJCQkJCQkJCW5ldyBJbnRlZ2VyKGdyZWVuKS5pbnRWYWx1ZSgpLAotCQkJCQkJCQkJIG5ldyBJbnRlZ2VyKGJsdWUpLmludFZhbHVlKCkKLQkJCQkJCQkJCSApOwotCQkJCQkJCWZkLnNldFJHQihyZ2IpOwotLy8JCQkJCQkJaWYocmdiICE9IG51bGwpewotLy8JCQkJCQkJCXJnYi5yZWQgPSBuZXcgSW50ZWdlcihyZWQpLmludFZhbHVlKCk7Ci0vLwkJCQkJCQkJcmdiLmJsdWUgPSBuZXcgSW50ZWdlcihibHVlKS5pbnRWYWx1ZSgpOwotLy8JCQkJCQkJCXJnYi5ncmVlbiA9IG5ldyBJbnRlZ2VyKGdyZWVuKS5pbnRWYWx1ZSgpOwotLy8JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZmQuc2V0Rm9udExpc3QobmV3IEZvbnREYXRhW117ZkRhdGF9KTsKLQkJCQkJfQotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbjEpOwotCi0JCS8vIEppbmh1YSBYaQotCQkvLyBhZGRlZCB0aGlzIHRvIGNvbnNvbGlkYXRlIGNvbW1vbiBhY3Rpb25zIGludG8gYSBzZXJ2aWNlIGNsYXNzCi0JCWFjdGlvblNlcnZpY2UgPSBuZXcgRGlhZ3JhbUFjdGlvblNlcnZpY2UoZ2V0R3JhcGhpY2FsVmlld2VyKCksCi0JCQkJZ2V0RWRpdERvbWFpbigpLCByZWdpc3RyeSk7Ci0JCWFjdGlvblNlcnZpY2UucmVnaXN0ZXJIb3Jpem9udGFsQWxpZ25BdmVyYWdlQWN0aW9uKCk7Ci0JCWFjdGlvblNlcnZpY2UucmVnaXN0ZXJIb3Jpem9udGFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKCk7Ci0JCWFjdGlvblNlcnZpY2UucmVnaXN0ZXJWZXJ0aWNhbEFsaWduQXZlcmFnZUFjdGlvbigpOwotCQlhY3Rpb25TZXJ2aWNlLnJlZ2lzdGVyVmVydGljYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKTsKLQotCQkvLyAvLyBhbGlnbiBob3Jpem9udGFsbHkgdG8gYXZlcmFnZSB5LXZhbHVlIG9mIGFsbCBub2RlcwotCQkvLyBJQWN0aW9uIGhBbGlnbkF2ZXJhZ2VBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkvLyBEaWFncmFtVUlSZXNvdXJjZXMKLQkJLy8gLmdldFN0cmluZygiRGlhZ3JhbVVJLkFic3RyYWN0RGlhZ3JhbUVkaXRvci5oQWxpZ25BdmVyYWdlQWN0aW9uLnRleHQiKSkKLQkJLy8geyAvLyROT04tTkxTLTEkCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy8gaG9yaXpBbGlnblRvQXZlcmFnZVNlbGVjdGVkKCk7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJLy8gcmV0dXJuIEFMSUdOX0hPUlpfQVZFUkFHRTsKLQkJLy8gfQotCQkvLyB9OwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGhBbGlnbkF2ZXJhZ2VBY3Rpb24pOwotCQkvLwotCQkvLyAvLyBhbGlnbiBob3Jpem9udGFsbHkgdG8geS12YWx1ZSBvZiBmaXJzdCBzZWxlY3RlZCBub2RlCi0JCS8vIElBY3Rpb24gaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCS8vIERpYWdyYW1VSVJlc291cmNlcwotCQkvLyAuZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWJzdHJhY3REaWFncmFtRWRpdG9yLmhBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24udGV4dCIpKQotCQkvLyB7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcHVibGljIHZvaWQgcnVuKCkgewotCQkvLyBob3J6QWxpZ25Ub0ZpcnN0U2VsZWN0ZWQoKTsKLQkJLy8gfQotCQkvLwotCQkvLyBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkvLyByZXR1cm4gQUxJR05fSE9SWl9GSVJTVF9TRUxFQ1RFRDsKLQkJLy8gfQotCQkvLyB9OwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGhBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24pOwotCQkvLwotCQkvLyAvLyBhbGlnbiB2ZXJ0aWNhbGx5IHRvIGF2ZXJhZ2UgeC12YWx1ZSBvZiBhbGwgc2VsZWN0ZWQgbm9kZXMKLQkJLy8gSUFjdGlvbiB2QWxpZ25BdmVyYWdlQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJLy8gRGlhZ3JhbVVJUmVzb3VyY2VzCi0JCS8vIC5nZXRTdHJpbmcoIkRpYWdyYW1VSS5BYnN0cmFjdERpYWdyYW1FZGl0b3IudkFsaWduQXZlcmFnZUFjdGlvbi50ZXh0IikpCi0JCS8vIHsgLy8kTk9OLU5MUy0xJAotCQkvLyBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCS8vIHZlcnRpY2FsQWxpZ25Ub0F2ZXJhZ2VTZWxlY3RlZCgpOwotCQkvLyB9Ci0JCS8vCi0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCS8vIHJldHVybiBBTElHTl9WRVJUX0FWRVJBR0U7Ci0JCS8vIH0KLQkJLy8gfTsKLQkJLy8gZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbih2QWxpZ25BdmVyYWdlQWN0aW9uKTsKLQkJLy8KLQkJLy8gLy8gYWxpZ24gdmVydGljYWxseSB0byB4LXZhbHVlIG9mIGZpcnN0IHNlbGVjdGVkIG5vZGUKLQkJLy8gSUFjdGlvbiB2QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJLy8gRGlhZ3JhbVVJUmVzb3VyY2VzCi0JCS8vIC5nZXRTdHJpbmcoIkRpYWdyYW1VSS5BYnN0cmFjdERpYWdyYW1FZGl0b3IudkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbi50ZXh0IikpCi0JCS8vIHsgLy8kTk9OLU5MUy0xJAotCQkvLyBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCS8vIHZlcnRpY2FsQWxpZ25Ub0ZpcnN0U2VsZWN0ZWQoKTsKLQkJLy8gfQotCQkvLwotCQkvLyBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkvLyByZXR1cm4gQUxJR05fVkVSVF9GSVJTVF9TRUxFQ1RFRDsKLQkJLy8gfQotCQkvLyB9OwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24pOwotCi0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dCwgZnJlZVR4dE5vZGVDcmVhdGlvbkZhY3RvcnksIC8vJE5PTi1OTFMtMSQKLQkJCQlDUkVBVEVfRlJFRV9URVhULAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcCwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnJlZXRleHRfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlhY3Rpb24gPSBuZXcgQWN0aW9uKERpYWdyYW1VSVJlc291cmNlcy5tb3ZlQWN0aW9uX2xhYmVsKSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJcHVibGljIHZvaWQgc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBuZXdJbWFnZSkgewotCQkJCXN1cGVyLnNldEltYWdlRGVzY3JpcHRvcihuZXdJbWFnZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChFdmVudCBldmVudCkgewotCQkJCXN1cGVyLnJ1bldpdGhFdmVudChldmVudCk7Ci0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXN1cGVyLnJ1bigpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID4gMCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBNT1ZFOwotCQkJfQotCi0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlJQWN0aW9uIGxpbmtBY3Rpb24gPSBuZXcgQWN0aW9uKERpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fTGlua190ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgPT0gMikgewotCQkJCQlFZGl0UGFydCBzb3VyY2VFZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJCQkJRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMSk7Ci0JCQkJCUxpc3QgdGFyZ2V0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgRnJlZVRleHROb2RlRWRpdFBhcnQKLQkJCQkJCQl8fCB0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KQotCQkJCQkJcmV0dXJuOwotCQkJCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCXRhcmdldExpc3QgPSAoKE5vZGVFZGl0UGFydCkgc291cmNlRWRpdFBhcnQpCi0JCQkJCQkJCS5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJCQkJaWYgKCF0YXJnZXRMaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHRhcmdldExpc3QuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJTGlua0VkaXRQYXJ0IG9iaiA9IChMaW5rRWRpdFBhcnQpIGl0b3IubmV4dCgpOwotCQkJCQkJCQlpZiAodGFyZ2V0RWRpdFBhcnQuZXF1YWxzKG9iai5nZXRTb3VyY2UoKSkpCi0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCWlmICh0YXJnZXRFZGl0UGFydC5lcXVhbHMob2JqLmdldFRhcmdldCgpKSkKLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQl0YXJnZXRMaXN0ID0gKChOb2RlRWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQotCQkJCQkJCQkuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCQkJCWlmICghdGFyZ2V0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB0YXJnZXRMaXN0Lml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCUxpbmtFZGl0UGFydCBvYmogPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYgKHRhcmdldEVkaXRQYXJ0LmVxdWFscyhvYmouZ2V0U291cmNlKCkpKQotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQlpZiAodGFyZ2V0RWRpdFBhcnQuZXF1YWxzKG9iai5nZXRUYXJnZXQoKSkpCi0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCUxpbmsgbGluayA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluaygpOwotCQkJCQlpZiAoc291cmNlRWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIE5vZGUpCi0JCQkJCQlsaW5rLnNldFNvdXJjZSgoTm9kZSkgc291cmNlRWRpdFBhcnQuZ2V0TW9kZWwoKSk7Ci0JCQkJCWlmICh0YXJnZXRFZGl0UGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgTm9kZSkKLQkJCQkJCWxpbmsuc2V0VGFyZ2V0KChOb2RlKSB0YXJnZXRFZGl0UGFydC5nZXRNb2RlbCgpKTsKLQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDcmVhdGVMaW5rQ29tbWFuZCgKLQkJCQkJCQlsaW5rLCAoTm9kZSkgc291cmNlRWRpdFBhcnQuZ2V0TW9kZWwoKSk7Ci0JCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGVkaXRQYXJ0cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IHBhcnQgPSBpdG9yLm5leHQoKTsKLQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBGcmVlVGV4dE5vZGVFZGl0UGFydCkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgPT0gMikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBDUkVBVEVfTElOSzsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihsaW5rQWN0aW9uKTsKLQotCQlJQWN0aW9uIHNlbGVjdExpbmtBY3Rpb24gPSBuZXcgQWN0aW9uKERpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fTGlua19zZWxlY3QpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDEpIHsKLQkJCQkJRWRpdFBhcnQgcGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCUxpc3QgbGlzdCA9ICgoTm9kZUVkaXRQYXJ0KSBwYXJ0KQotCQkJCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQkJCWlmIChsaXN0ICE9IG51bGwgJiYgIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJTGlua0VkaXRQYXJ0IGxpbmtwYXJ0ID0gKExpbmtFZGl0UGFydCkgbGlzdC5nZXQoMCk7Ci0JCQkJCQkJbGlua3BhcnQuc2V0U2VsZWN0ZWQoMSk7Ci0JCQkJCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2VsZWN0KGxpbmtwYXJ0KTsKLQkJCQkJCQkvLyBwYXJ0LnNldFNlbGVjdGVkKDApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDEpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gU0VMRUNUX0xJTks7Ci0JCQl9Ci0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihzZWxlY3RMaW5rQWN0aW9uKTsKLQotCQlJQWN0aW9uIGNyZWF0ZUJlbmRQb2ludEFjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9CZW5kUG9pbnRfY3JlYXRlKSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJCQlpZiAoZWRpdFBhcnRzLnNpemUoKSA9PSAxKSB7Ci0JCQkJCUVkaXRQYXJ0IHBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMCk7Ci0JCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgTGlua0VkaXRQYXJ0KSB7Ci0JCQkJCQkvLyByZXR1cm4gdHJ1ZTsKLQkJCQkJCUxpbmsgbGluayA9IChMaW5rKSAoKExpbmtFZGl0UGFydCkgcGFydCkuZ2V0TW9kZWwoKTsKLQkJCQkJCUxpc3QgYmVuZHBvaW50cyA9IGxpbmsuZ2V0QmVuZHBvaW50cygpOwotCQkJCQkJaWYgKGJlbmRwb2ludHMgPT0gbnVsbCB8fCBiZW5kcG9pbnRzLnNpemUoKSA8IDEpIHsKLQkJCQkJCQlQb2ludCBzcCA9IGxpbmsuZ2V0U291cmNlRW5kUG9pbnQoKTsKLQkJCQkJCQlQb2ludCB0cCA9IGxpbmsuZ2V0VGFyZ2V0RW5kUG9pbnQoKTsKLQkJCQkJCQlpZiAoc3AgPT0gbnVsbCkgewotCQkJCQkJCQlpZiAobGluay5nZXRTb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkJCQkJCQlzcCA9ICgoTm9kZSkgbGluay5lQ29udGFpbmVyKCkpCi0JCQkJCQkJCQkJCS5nZXRMb2NhdGlvbigpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJc3AgPSBsaW5rLmdldFNvdXJjZSgpLmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHRwID09IG51bGwpIHsKLQkJCQkJCQkJdHAgPSBsaW5rLmdldFRhcmdldCgpLmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJfQotCQkJCQkJCVBvaW50IGJQb2ludCA9IG5ldyBQb2ludCgpOwotCQkJCQkJCWJQb2ludC54ID0gKHNwLnggKyB0cC54KSAvIDI7Ci0JCQkJCQkJYlBvaW50LnkgPSAoc3AueSArIHRwLnkpIC8gMjsKLQkJCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENyZWF0ZUJlbmRwb2ludENvbW1hbmQoCi0JCQkJCQkJCQlsaW5rLCBiUG9pbnQsIDApOwotCQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJCQlpZiAoZWRpdFBhcnRzLnNpemUoKSA9PSAxKSB7Ci0JCQkJCUVkaXRQYXJ0IHBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMCk7Ci0JCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgTGlua0VkaXRQYXJ0KSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIENSRUFURV9CRU5EX1BPSU5UOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGNyZWF0ZUJlbmRQb2ludEFjdGlvbik7Ci0KLQkJSUFjdGlvbiByZWZyZXNoQWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMucmVmcmVzaEFjdGlvbl9sYWJlbCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0LmlzQWN0aXZlKCkpIHsKLQkJCQkJZWRpdFBhcnQuZGVhY3RpdmF0ZSgpOwotCQkJCX0KLQkJCQlkaWFncmFtLnJlbW92ZUNvbnN1bWVyKEFic3RyYWN0RGlhZ3JhbUVkaXRvci50aGlzKTsKLQkJCQljcmVhdGVFZGl0UGFydCgpOwotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLnNldENvbnRlbnRzKGVkaXRQYXJ0KTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gUkVGUkVTSDsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihyZWZyZXNoQWN0aW9uKTsKLQkJSUFjdGlvbiBkZWxldGVEaWFncmFtQWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMuRGVsZXRlRGlhZ3JhbV90ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmIChBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkRlbGV0ZURpYWdyYW1fdGV4dCwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuRGVsZXRlRGlhZ3JhbV9wcm9tcHQpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pICgoRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJLmdldENvbnRlbnRzKCkpLmdldE1vZGVsKCk7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUoZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJCQlkb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCWdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoCi0JCQkJCQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKSwgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCXJldHVybiBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLnNpemUoKSA9PSAwOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBERUxFVEVfRElBR1JBTTsKLQkJCX0KLQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGRlbGV0ZURpYWdyYW1BY3Rpb24pOwotCQlJQWN0aW9uIGFsaWduQmVuZFBvaW50QWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMuYWxpZ25fYmVuZF9wb2ludF90ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUVkaXRQYXJ0IHBhcnQgPSAoRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKS5nZXQoMCk7Ci0JCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBMaW5rRWRpdFBhcnQpIHsKLQkJCQkJTGlua0VkaXRQYXJ0IGxpbmtwYXJ0ID0gKChMaW5rRWRpdFBhcnQpIHBhcnQpOwotCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgbGlua3BhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJaWYgKGxpbmsuZ2V0QmVuZHBvaW50cygpLnNpemUoKSA+IDApIHsKLQotCQkJCQkJR3JhcGhpY2FsRWRpdFBhcnQgc3BhcnQgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rcGFydAotCQkJCQkJCQkuZ2V0U291cmNlKCkpOwotCQkJCQkJR3JhcGhpY2FsRWRpdFBhcnQgdHBhcnQgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rcGFydAotCQkJCQkJCQkuZ2V0VGFyZ2V0KCkpOwotCi0JCQkJCQlQb2ludCBzcCA9IHNwYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotCQkJCQkJUG9pbnQgdHAgPSB0cGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTsKLQotCQkJCQkJaWYgKHNwYXJ0IGluc3RhbmNlb2YgRGVjaXNpb25Ob2RlRWRpdFBhcnQKLQkJCQkJCQkJfHwgc3BhcnQgaW5zdGFuY2VvZiBTeW5jaEJhck5vZGVFZGl0UGFydCkgewotCQkJCQkJCXNwID0gKChUeXBlZE5vZGUpIHNwYXJ0LmdldE1vZGVsKCkpLmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJTGlzdCBsaXN0ID0gKChOb2RlRWRpdFBhcnQpIHNwYXJ0KQotCQkJCQkJCQkJLmdldFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlMaW5rRWRpdFBhcnQgbHAgPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYgKGxwLmdldFRhcmdldCgpLmVxdWFscyh0cGFydCkpIHsKLQkJCQkJCQkJCVBvaW50IHNvdXJjZUVuZFBvaW50ID0gKChMaW5rKSBscAotCQkJCQkJCQkJCQkuZ2V0TW9kZWwoKSkuZ2V0U291cmNlRW5kUG9pbnQoKTsKLQkJCQkJCQkJCXNwID0gc3AuZ2V0VHJhbnNsYXRlZChzb3VyY2VFbmRQb2ludCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmICh0cGFydCBpbnN0YW5jZW9mIERlY2lzaW9uTm9kZUVkaXRQYXJ0Ci0JCQkJCQkJCXx8IHRwYXJ0IGluc3RhbmNlb2YgU3luY2hCYXJOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCQl0cCA9ICgoVHlwZWROb2RlKSB0cGFydC5nZXRNb2RlbCgpKS5nZXRMb2NhdGlvbigpOwotCQkJCQkJCUxpc3QgbGlzdCA9ICgoTm9kZUVkaXRQYXJ0KSB0cGFydCkKLQkJCQkJCQkJCS5nZXRUYXJnZXRDb25uZWN0aW9ucygpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJTGlua0VkaXRQYXJ0IGxwID0gKExpbmtFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmIChscC5nZXRTb3VyY2UoKS5lcXVhbHMoc3BhcnQpKSB7Ci0JCQkJCQkJCQlQb2ludCB0YXJnZXRFbmRQb2ludCA9ICgoTGluaykgbHAKLQkJCQkJCQkJCQkJLmdldE1vZGVsKCkpLmdldFRhcmdldEVuZFBvaW50KCk7Ci0JCQkJCQkJCQl0cCA9IHRwLmdldFRyYW5zbGF0ZWQodGFyZ2V0RW5kUG9pbnQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5rLmdldEJlbmRwb2ludHMoKS5zaXplKCk7IGkrKykgewotCQkJCQkJCUFic29sdXRlQmVuZHBvaW50IG9sZGJwID0gKEFic29sdXRlQmVuZHBvaW50KSBsaW5rCi0JCQkJCQkJCQkuZ2V0QmVuZHBvaW50cygpLmdldChpKTsKLQkJCQkJCQlBYnNvbHV0ZUJlbmRwb2ludCBicCA9IG5ldyBBYnNvbHV0ZUJlbmRwb2ludCgKLQkJCQkJCQkJCW5ldyBQb2ludCgtMSwgLTEpKTsKLQkJCQkJCQlBYnNvbHV0ZUJlbmRwb2ludCBwcmV2aW91c2JwID0gbnVsbDsKLQkJCQkJCQlpbnQgZGVsdGEgPSA0MDsKLQkJCQkJCQlpbnQgcG9zaXRpb24gPSAwOwotCi0JCQkJCQkJaWYgKGkgPT0gMCkgewotCQkJCQkJCQlwb3NpdGlvbiA9IHNwLmdldFBvc2l0aW9uKG9sZGJwKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlwcmV2aW91c2JwID0gKEFic29sdXRlQmVuZHBvaW50KSBsaW5rCi0JCQkJCQkJCQkJLmdldEJlbmRwb2ludHMoKS5nZXQoaSAtIDEpOwotCQkJCQkJCQlwb3NpdGlvbiA9IHByZXZpb3VzYnAuZ2V0UG9zaXRpb24ob2xkYnApOwotCQkJCQkJCX0KLQotCQkJCQkJCWlmIChwb3NpdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSAotCQkJCQkJCQkJfHwgcG9zaXRpb24gPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgpIHsKLQkJCQkJCQkJaWYgKGkgPT0gMCkgewotCQkJCQkJCQkJaWYgKHNwLnggLSBkZWx0YSA8IG9sZGJwLngKLQkJCQkJCQkJCQkJJiYgc3AueCArIGRlbHRhID4gb2xkYnAueAotCQkJCQkJCQkJCQkmJiAhKHNwLnggPT0gb2xkYnAueCkpIHsKLQkJCQkJCQkJCQlicC54ID0gc3AueDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWlmIChwcmV2aW91c2JwLnggLSBkZWx0YSA8IG9sZGJwLngKLQkJCQkJCQkJCQkJJiYgcHJldmlvdXNicC54ICsgZGVsdGEgPiBvbGRicC54Ci0JCQkJCQkJCQkJCSYmICEocHJldmlvdXNicC54ID09IG9sZGJwLngpKSB7Ci0JCQkJCQkJCQkJYnAueCA9IHByZXZpb3VzYnAueDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAobGluay5nZXRCZW5kcG9pbnRzKCkuc2l6ZSgpIC0gMSA9PSBpKSB7Ci0JCQkJCQkJCQlpZiAodHAueSAtIGRlbHRhIDwgb2xkYnAueQotCQkJCQkJCQkJCQkmJiB0cC55ICsgZGVsdGEgPiBvbGRicC55Ci0JCQkJCQkJCQkJCSYmICEodHAueSA9PSBvbGRicC55KSkgewotCQkJCQkJCQkJCWJwLnkgPSB0cC55OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJYnAueSA9IG9sZGJwLnk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHBvc2l0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLkVBU1QKLQkJCQkJCQkJCXx8IHBvc2l0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLldFU1QpIHsKLQotCQkJCQkJCQlpZiAoaSA9PSAwKSB7Ci0JCQkJCQkJCQlpZiAoc3AueSAtIGRlbHRhIDwgb2xkYnAueQotCQkJCQkJCQkJCQkmJiBzcC55ICsgZGVsdGEgPiBvbGRicC55Ci0JCQkJCQkJCQkJCSYmICEoc3AueSA9PSBvbGRicC55KSkgewotCQkJCQkJCQkJCWJwLnkgPSBzcC55OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJaWYgKHByZXZpb3VzYnAueSAtIGRlbHRhIDwgb2xkYnAueQotCQkJCQkJCQkJCQkmJiBwcmV2aW91c2JwLnkgKyBkZWx0YSA+IG9sZGJwLnkKLQkJCQkJCQkJCQkJJiYgIShwcmV2aW91c2JwLnkgPT0gb2xkYnAueSkpIHsKLQkJCQkJCQkJCQlicC55ID0gcHJldmlvdXNicC55OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChsaW5rLmdldEJlbmRwb2ludHMoKS5zaXplKCkgLSAxID09IGkpIHsKLQkJCQkJCQkJCWlmICh0cC54IC0gZGVsdGEgPCBvbGRicC54Ci0JCQkJCQkJCQkJCSYmIHRwLnggKyBkZWx0YSA+IG9sZGJwLngKLQkJCQkJCQkJCQkJJiYgISh0cC54ID09IG9sZGJwLngpKSB7Ci0JCQkJCQkJCQkJYnAueCA9IHRwLng7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlicC54ID0gb2xkYnAueDsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoYnAueCA9PSAtMSAmJiBicC55ICE9IC0xKSB7Ci0JCQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgTW92ZUJlbmRwb2ludENvbW1hbmQoCi0JCQkJCQkJCQkJbGluaywgbmV3IFBvaW50KG9sZGJwLngsIGJwLnkpLCBpKTsKLQkJCQkJCQkJLy8gKChSb290RWRpdFBhcnQpZ2V0Um9vdCgpKS5nZXRWaWV3ZXIoKS5nZXRFZGl0RG9tYWluKCkuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGJwLnggIT0gLTEgJiYgYnAueSA9PSAtMSkgewotCQkJCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IE1vdmVCZW5kcG9pbnRDb21tYW5kKAotCQkJCQkJCQkJCWxpbmssIG5ldyBQb2ludChicC54LCBvbGRicC55KSwgaSk7Ci0JCQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChicC54ICE9IC0xICYmIGJwLnkgIT0gLTEpIHsKLQkJCQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBNb3ZlQmVuZHBvaW50Q29tbWFuZCgKLQkJCQkJCQkJCQlsaW5rLCBuZXcgUG9pbnQoYnAueCwgYnAueSksIGkpOwotCQkJCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCUxpc3QgbGlzdCA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGxpc3Quc2l6ZSgpID09IDEpIHsKLQkJCQkJaWYgKGxpc3QuZ2V0KDApIGluc3RhbmNlb2YgTGlua0VkaXRQYXJ0KSB7Ci0JCQkJCQlMaW5rRWRpdFBhcnQgcGFydCA9IChMaW5rRWRpdFBhcnQpIGxpc3QuZ2V0KDApOwotCQkJCQkJTGluayBsaW5rID0gKExpbmspIHBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJCWlmIChsaW5rLmdldEJlbmRwb2ludHMoKS5zaXplKCkgPiAwKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fQkVORF9QT0lOVDsKLQkJCX0KLQotCQl9OwotCQkKLQkJLy8gVmlld2VyIFByaW50IEFjdGlvbgotCQlhY3Rpb24gPSBuZXcgRGlhZ3JhbVByaW50QWN0aW9uKHRoaXMsIGdldEdyYXBoaWNhbFZpZXdlcigpKTsKLQkJcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhbGlnbkJlbmRQb2ludEFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIElBY3Rpb24gY3JlYXRlQW5BY3Rpb24oU3RyaW5nIGFjdGlvbk5hbWUsCi0JCQlDcmVhdGlvbkZhY3RvcnkgY3JlYXRpb25GYWN0b3J5LCBTdHJpbmcgYWN0aW9uSWQsCi0JCQlTdHJpbmcgdG9vbHRpcFN0cmluZywgSW1hZ2VEZXNjcmlwdG9yIGltYWdlZGVzYykgewotCQlmaW5hbCBDcmVhdGlvbkZhY3RvcnkgZmFjdG9yeSA9IGNyZWF0aW9uRmFjdG9yeTsKLQkJZmluYWwgU3RyaW5nIGlkID0gYWN0aW9uSWQ7Ci0JCWZpbmFsIFN0cmluZyB0b29sdGlwID0gdG9vbHRpcFN0cmluZzsKLQkJZmluYWwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlZGVzY3JpcHRvciA9IGltYWdlZGVzYzsKLQkJcmV0dXJuIG5ldyBBY3Rpb24oYWN0aW9uTmFtZSkgeyAvLyROT04tTkxTLTEkCi0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlDcmVhdGVSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgQ3JlYXRlUmVxdWVzdCgpOwotCQkJCS8vIENyZWF0aW9uRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSh0ZW1wbGF0ZSk7Ci0JCQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCXJlcXVlc3Quc2V0RmFjdG9yeShmYWN0b3J5KTsKLQkJCQlyZXF1ZXN0LnNldExvY2F0aW9uKG5ldyBQb2ludCgxMCwgMTApKTsKLQotCQkJCWlmIChyZXF1ZXN0LmdldE5ld09iamVjdCgpIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQlQb2ludCBsb2MgPSByZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0JCQkJCURpYWdyYW0gcGFyZW50ID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ3JlYXRlTm9kZUNvbW1hbmQoCi0JCQkJCQkJKE5vZGUpIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCksIHBhcmVudCwgbG9jKTsKLQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIGlkOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfSBlbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQkJCXJldHVybiB0b29sdGlwOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCW9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvciBuZXdJbWFnZSkgewotCQkJCXN1cGVyLnNldEltYWdlRGVzY3JpcHRvcihpbWFnZWRlc2NyaXB0b3IpOwotCQkJfQotCi0JCQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJCQlyZXR1cm4gaW1hZ2VkZXNjcmlwdG9yOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBQYWxldHRlVmlld2VyUHJvdmlkZXIgY3JlYXRlUGFsZXR0ZVZpZXdlclByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFBhbGV0dGVWaWV3ZXJQcm92aWRlcihnZXRFZGl0RG9tYWluKCkpIHsKLQkJCXByaXZhdGUgSU1lbnVMaXN0ZW5lciBtZW51TGlzdGVuZXI7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVBhbGV0dGVWaWV3ZXIoUGFsZXR0ZVZpZXdlciB2aWV3ZXIpIHsKLQkJCQlzdXBlci5jb25maWd1cmVQYWxldHRlVmlld2VyKHZpZXdlcik7Ci0JCQkJLy8gVE9ETyB2aWV3ZXIuc2V0Q3VzdG9taXplcihuZXcgTG9naWNQYWxldHRlQ3VzdG9taXplcigpKTsKLQkJCQl2aWV3ZXIKLQkJCQkJCS5hZGREcmFnU291cmNlTGlzdGVuZXIobmV3IFRlbXBsYXRlVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXIoCi0JCQkJCQkJCXZpZXdlcikpOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgdm9pZCBob29rUGFsZXR0ZVZpZXdlcihQYWxldHRlVmlld2VyIHZpZXdlcikgewotCQkJCXN1cGVyLmhvb2tQYWxldHRlVmlld2VyKHZpZXdlcik7Ci0JCQkJZmluYWwgQ29weVRlbXBsYXRlQWN0aW9uIGNvcHkgPSAoQ29weVRlbXBsYXRlQWN0aW9uKSBnZXRBY3Rpb25SZWdpc3RyeSgpCi0JCQkJCQkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpKTsKLQkJCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGNvcHkpOwotCQkJCWlmIChtZW51TGlzdGVuZXIgPT0gbnVsbCkKLQkJCQkJbWVudUxpc3RlbmVyID0gbmV3IElNZW51TGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCQkJCQltYW5hZ2VyLmFwcGVuZFRvR3JvdXAoCi0JCQkJCQkJCQlHRUZBY3Rpb25Db25zdGFudHMuR1JPVVBfQ09QWSwgY29weSk7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJdmlld2VyLmdldENvbnRleHRNZW51KCkuYWRkTWVudUxpc3RlbmVyKG1lbnVMaXN0ZW5lcik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuR3JhcGhpY2FsRWRpdG9yV2l0aEZseW91dFBhbGV0dGUjZ2V0UGFsZXR0ZVByZWZlcmVuY2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgRmx5b3V0UHJlZmVyZW5jZXMgZ2V0UGFsZXR0ZVByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gbmV3IEZseW91dFByZWZlcmVuY2VzKCkgewotCQkJcHVibGljIGludCBnZXREb2NrTG9jYXRpb24oKSB7Ci0JCQkJcmV0dXJuIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCQkJLmdldEludChQQUxFVFRFX0RPQ0tfTE9DQVRJT04pOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldFBhbGV0dGVTdGF0ZSgpIHsKLQkJCQlyZXR1cm4gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJCQkuZ2V0SW50KFBBTEVUVEVfU1RBVEUpOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldFBhbGV0dGVXaWR0aCgpIHsKLQkJCQlyZXR1cm4gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJCQkuZ2V0SW50KFBBTEVUVEVfU0laRSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldERvY2tMb2NhdGlvbihpbnQgbG9jYXRpb24pIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoCi0JCQkJCQlQQUxFVFRFX0RPQ0tfTE9DQVRJT04sIGxvY2F0aW9uKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0UGFsZXR0ZVN0YXRlKGludCBzdGF0ZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQkJCVBBTEVUVEVfU1RBVEUsIHN0YXRlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0UGFsZXR0ZVdpZHRoKGludCB3aWR0aCkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQkJCVBBTEVUVEVfU0laRSwgd2lkdGgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBLZXlIYW5kbGVyIGdldENvbW1vbktleUhhbmRsZXIoKSB7Ci0JCWlmIChzaGFyZWRLZXlIYW5kbGVyID09IG51bGwpIHsKLQkJCXNoYXJlZEtleUhhbmRsZXIgPSBuZXcgS2V5SGFuZGxlcigpIHsKLQotCQkJCXB1YmxpYyBib29sZWFuIGtleVByZXNzZWQoS2V5RXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKChldmVudC5zdGF0ZU1hc2sgPT0gU1dULkNUUkwpCi0JCQkJCQkJJiYgKGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX1JJR0hUKSkgewotCQkJCQkJbW92ZSgxKTsKLQkJCQkJfQotCQkJCQlpZiAoKGV2ZW50LnN0YXRlTWFzayA9PSBTV1QuQ1RSTCkKLQkJCQkJCQkmJiAoZXZlbnQua2V5Q29kZSA9PSBTV1QuQVJST1dfRE9XTikpIHsKLQkJCQkJCW1vdmUoMik7Ci0KLQkJCQkJfQotCQkJCQlpZiAoKGV2ZW50LnN0YXRlTWFzayA9PSBTV1QuQ1RSTCkKLQkJCQkJCQkmJiAoZXZlbnQua2V5Q29kZSA9PSBTV1QuQVJST1dfVVApKSB7Ci0JCQkJCQltb3ZlKDMpOwotCQkJCQl9Ci0JCQkJCWlmICgoZXZlbnQuc3RhdGVNYXNrID09IFNXVC5DVFJMKQotCQkJCQkJCSYmIChldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19MRUZUKSkgewotCQkJCQkJbW92ZSg0KTsKLQkJCQkJfQotCi0JCQkJCXJldHVybiBzdXBlci5rZXlQcmVzc2VkKGV2ZW50KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBtb3ZlKGludCBkaXJlY3Rpb24pIHsKLQkJCQkJTGlzdCBsaXN0ID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJCQkJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgbGlzdC5nZXQoMCk7Ci0JCQkJCWlmIChwYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgcGFydC5nZXRNb2RlbCgpOwotCQkJCQkJUG9pbnQgcG9pbnQgPSBub2RlLmdldExvY2F0aW9uKCk7Ci0JCQkJCQlpbnQgbmV3eCA9IHBvaW50Lng7Ci0JCQkJCQlpbnQgbmV3eSA9IHBvaW50Lnk7Ci0JCQkJCQlpbnQgcHJlc3NsZW5ndGggPSAxOwotCQkJCQkJc3dpdGNoIChkaXJlY3Rpb24pIHsKLQkJCQkJCWNhc2UgMToKLQkJCQkJCQkvLyBub2RlLnNldExvY2F0aW9uKG5ldyBQb2ludChwb2ludC54KzEwLHBvaW50LnkpKTsKLQkJCQkJCQluZXd4ID0gcG9pbnQueCArIHByZXNzbGVuZ3RoOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAyOgotCQkJCQkJCS8vIG5vZGUuc2V0TG9jYXRpb24obmV3IFBvaW50KHBvaW50LngscG9pbnQueSsxMCkpOwotCQkJCQkJCW5ld3kgKz0gcHJlc3NsZW5ndGg7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDM6Ci0JCQkJCQkJLy8gbm9kZS5zZXRMb2NhdGlvbihuZXcgUG9pbnQocG9pbnQueCxwb2ludC55LTEwKSk7Ci0JCQkJCQkJbmV3eSAtPSBwcmVzc2xlbmd0aDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgNDoKLQkJCQkJCQkvLyBub2RlLnNldExvY2F0aW9uKG5ldyBQb2ludChwb2ludC54LTEwLHBvaW50LnkpKTsKLQkJCQkJCQluZXd4IC09IHByZXNzbGVuZ3RoOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgKLQkJCQkJCQkJbm9kZSwgbmV3IFBvaW50KG5ld3gsIG5ld3kpLCBub2RlLmdldFdpZHRoKCkpOwotCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJCS8vIFRPRE8tIGNoZWNrIGFkZGluZyBtb3JlIGJlbmRwb2ludCwgY2FwdHVyZSBiZW5kcG9pbnQKLQkJCQkJLy8gaW5kZXggb24gZmx5Ci0JCQkJCWlmIChwYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBMaW5rKSB7Ci0JCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgcGFydC5nZXRNb2RlbCgpOwotCQkJCQkJTGlzdCBibGlzdCA9IGxpbmsuZ2V0QmVuZHBvaW50cygpOwotCQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJCWlmIChibGlzdCAhPSBudWxsICYmIGJsaXN0LnNpemUoKSA+IDApIHsKLQkJCQkJCQlBYnNvbHV0ZUJlbmRwb2ludCBwb2ludCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgYmxpc3QKLQkJCQkJCQkJCS5nZXQoaW5kZXgpOwotCQkJCQkJCWludCBuZXd4ID0gcG9pbnQueDsKLQkJCQkJCQlpbnQgbmV3eSA9IHBvaW50Lnk7Ci0JCQkJCQkJaW50IHByZXNzbGVuZ3RoID0gNTsKLQkJCQkJCQlzd2l0Y2ggKGRpcmVjdGlvbikgewotCQkJCQkJCWNhc2UgMToKLQkJCQkJCQkJLy8gbm9kZS5zZXRMb2NhdGlvbihuZXcKLQkJCQkJCQkJLy8gUG9pbnQocG9pbnQueCsxMCxwb2ludC55KSk7Ci0JCQkJCQkJCW5ld3ggPSBwb2ludC54ICsgcHJlc3NsZW5ndGg7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMjoKLQkJCQkJCQkJLy8gbm9kZS5zZXRMb2NhdGlvbihuZXcKLQkJCQkJCQkJLy8gUG9pbnQocG9pbnQueCxwb2ludC55KzEwKSk7Ci0JCQkJCQkJCW5ld3kgKz0gcHJlc3NsZW5ndGg7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMzoKLQkJCQkJCQkJLy8gbm9kZS5zZXRMb2NhdGlvbihuZXcKLQkJCQkJCQkJLy8gUG9pbnQocG9pbnQueCxwb2ludC55LTEwKSk7Ci0JCQkJCQkJCW5ld3kgLT0gcHJlc3NsZW5ndGg7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgNDoKLQkJCQkJCQkJLy8gbm9kZS5zZXRMb2NhdGlvbihuZXcKLQkJCQkJCQkJLy8gUG9pbnQocG9pbnQueC0xMCxwb2ludC55KSk7Ci0JCQkJCQkJCW5ld3ggLT0gcHJlc3NsZW5ndGg7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IE1vdmVCZW5kcG9pbnRDb21tYW5kKAotCQkJCQkJCQkJbGluaywgbmV3IFBvaW50KG5ld3gsIG5ld3kpLCBpbmRleCk7Ci0JCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0KLQkJCX07Ci0JCQlzaGFyZWRLZXlIYW5kbGVyCi0JCQkJCS5wdXQoS2V5U3Ryb2tlLmdldFByZXNzZWQoU1dULkRFTCwgMTI3LCAwKSwKLQkJCQkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQkJCQkJCUFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpKTsKLQkJCXNoYXJlZEtleUhhbmRsZXIucHV0KEtleVN0cm9rZS5nZXRQcmVzc2VkKFNXVC5GMiwgMCksCi0JCQkJCWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQkJCUdFRkFjdGlvbkNvbnN0YW50cy5ESVJFQ1RfRURJVCkpOwotCi0JCX0KLQkJcmV0dXJuIHNoYXJlZEtleUhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZ3JhcGhpY2FsVmlld2VyIGZvciB0aGlzIEVkaXRvclBhcnQuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIGdyYXBoaWNhbCB2aWV3ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRHcmFwaGljYWxWaWV3ZXIoR3JhcGhpY2FsVmlld2VyIHZpZXdlcikgewotCQlzdXBlci5zZXRHcmFwaGljYWxWaWV3ZXIodmlld2VyKTsKLQkJaWYgKGFjdGlvblNlcnZpY2UgIT0gbnVsbCkgewotCQkJYWN0aW9uU2VydmljZS5zZXRHcmFwaGljYWxWaWV3ZXIodmlld2VyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJc3VwZXIuY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCk7Ci0JCVNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyKSBnZXRHcmFwaGljYWxWaWV3ZXIoKTsKLQotCQlTY2FsYWJsZUZyZWVmb3JtUm9vdEVkaXRQYXJ0IHJvb3QgPSBuZXcgU2NhbGFibGVGcmVlZm9ybVJvb3RFZGl0UGFydCgpOwotCi0JCS8vIExpc3Qgem9vbUxldmVscyA9IG5ldyBBcnJheUxpc3QoMyk7Ci0JCS8vIHpvb21MZXZlbHMuYWRkKFpvb21NYW5hZ2VyLkZJVF9BTEwpOwotCQkvLyB6b29tTGV2ZWxzLmFkZChab29tTWFuYWdlci5GSVRfV0lEVEgpOwotCQkvLyB6b29tTGV2ZWxzLmFkZChab29tTWFuYWdlci5GSVRfSEVJR0hUKTsKLQkJLy8gcm9vdC5nZXRab29tTWFuYWdlcigpLnNldFpvb21MZXZlbENvbnRyaWJ1dGlvbnMoem9vbUxldmVscyk7Ci0JCS8vCi0JCS8vIElBY3Rpb24gem9vbUluID0gbmV3IFpvb21JbkFjdGlvbihyb290LmdldFpvb21NYW5hZ2VyKCkpOwotCQkvLyBJQWN0aW9uIHpvb21PdXQgPSBuZXcgWm9vbU91dEFjdGlvbihyb290LmdldFpvb21NYW5hZ2VyKCkpOwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHpvb21Jbik7Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oem9vbU91dCk7Ci0JCS8vIGdldFNpdGUoKS5nZXRLZXlCaW5kaW5nU2VydmljZSgpLnJlZ2lzdGVyQWN0aW9uKHpvb21Jbik7Ci0JCS8vIGdldFNpdGUoKS5nZXRLZXlCaW5kaW5nU2VydmljZSgpLnJlZ2lzdGVyQWN0aW9uKHpvb21PdXQpOwotCi0JCXZpZXdlci5zZXRSb290RWRpdFBhcnQocm9vdCk7Ci0KLQkJLy8gdmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShuZXcgTWV0aG9kRWxlbWVudEVkaXRQYXJ0RmFjdG9yeSgpKTsKLQkJdmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSk7Ci0KLQkJQ29udGV4dE1lbnVQcm92aWRlciBwcm92aWRlciA9IG5ldyBEaWFncmFtQ29udGV4dE1lbnVQcm92aWRlcigKLQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKSwgZ2V0QWN0aW9uUmVnaXN0cnkoKSk7Ci0JCWdldEdyYXBoaWNhbFZpZXdlcigpLnNldENvbnRleHRNZW51KHByb3ZpZGVyKTsKLQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoCi0JCQkJIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy53b3JrZmxvdy5jb250ZXh0bWVudSIsIC8vJE5PTi1OTFMtMSQKLQkJCQlwcm92aWRlciwgZ2V0R3JhcGhpY2FsVmlld2VyKCkpOwotCi0JCXZpZXdlci5zZXRLZXlIYW5kbGVyKG5ldyBHcmFwaGljYWxWaWV3ZXJLZXlIYW5kbGVyKHZpZXdlcikKLQkJCQkuc2V0UGFyZW50KGdldENvbW1vbktleUhhbmRsZXIoKSkpOwotCi0JCS8vIGxvYWRQcm9wZXJ0aWVzKCk7Ci0KLQkJLy8gQWN0aW9ucwotCQkvLyBJQWN0aW9uIHNob3dSdWxlcnMgPSBuZXcKLQkJLy8gVG9nZ2xlUnVsZXJWaXNpYmlsaXR5QWN0aW9uKGdldEdyYXBoaWNhbFZpZXdlcigpKTsKLQkJLy8gZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihzaG93UnVsZXJzKTsKLQkJLy8gICAgCQotCQkvLyBJQWN0aW9uIHNuYXBBY3Rpb24gPSBuZXcKLQkJLy8gVG9nZ2xlU25hcFRvR2VvbWV0cnlBY3Rpb24oZ2V0R3JhcGhpY2FsVmlld2VyKCkpOwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHNuYXBBY3Rpb24pOwotCQkvLwotCQkvLyBJQWN0aW9uIHNob3dHcmlkID0gbmV3IFRvZ2dsZUdyaWRBY3Rpb24oZ2V0R3JhcGhpY2FsVmlld2VyKCkpOwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHNob3dHcmlkKTsKLQotCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlQWN0aXZhdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9OwotCi0JCWdldEdyYXBoaWNhbENvbnRyb2woKS5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIGxpc3RlbmVyKTsKLQkJZ2V0R3JhcGhpY2FsQ29udHJvbCgpLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBsaXN0ZW5lcik7Ci0KLQkJZ2V0R3JhcGhpY2FsQ29udHJvbCgpLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvdWJsZUNsaWNrLCBuZXcgTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlRG91YmxlQ2xpY2soZXZlbnQpOwotCQkJfQotCi0JCX0pOwotCQlpZiAoZ2V0RGlhZ3JhbVR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCVJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUwpKQotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscCgKLQkJCQkJCQlnZXRHcmFwaGljYWxDb250cm9sKCksCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRk9STV9FRElUT1JfQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fQ09OVEVYVCk7Ci0JCWVsc2UgaWYgKGdldERpYWdyYW1UeXBlKCkuZXF1YWxzSWdub3JlQ2FzZSgKLQkJCQlSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1cpKQotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCgKLQkJCQkJZ2V0R3JhcGhpY2FsQ29udHJvbCgpLCBBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5GT1JNX0VESVRPUl9BQ1RJVklUWV9ESUFHUkFNX0NPTlRFWFQpOyAKLQkJZWxzZSBpZiAoZ2V0RGlhZ3JhbVR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCVJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZKSkKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoZ2V0R3JhcGhpY2FsQ29udHJvbCgpLCBBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5GT1JNX0VESVRPUl9XUF9ERVBFTkRFTkNZX0RJQUdSQU1fQ09OVEVYVCk7Ci0KLQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0R3JhcGhpY2FsQ29udHJvbCgpLmdldERpc3BsYXkoKTsKLQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldFBhbGV0dGVSb290KCkgIT0gbnVsbCkgewotCQkJCQkJT2JqZWN0IG9iaiA9IGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKTsKLQkJCQkJCWlmIChUbmdVdGlsLmlzTG9ja2VkKChFT2JqZWN0KSBvYmopKSB7Ci0JCQkJCQkJTGlzdCBsaXN0ID0gZ2V0UGFsZXR0ZVJvb3QoKS5nZXRDaGlsZHJlbigpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJUGFsZXR0ZUVudHJ5IGVudHJ5ID0gKFBhbGV0dGVFbnRyeSkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJCWVudHJ5LnNldFZpc2libGUoZmFsc2UpOwotCQkJCQkJCX0KLQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlMaXN0IGxpc3QgPSBnZXRQYWxldHRlUm9vdCgpLmdldENoaWxkcmVuKCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlQYWxldHRlRW50cnkgZW50cnkgPSAoUGFsZXR0ZUVudHJ5KSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJZW50cnkuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLQkJY3VycmVudENvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCi0JCS8vIGxpc3RlbiB0byBjaGFuZ2UgZm9yIGN1cnJlbnQgc2VsZWN0aW9uIG9mIE1ldGhvZENvbmZpZ3VyYXRpb24gb3IgY2hhbmdlcyBpbiAKLQkJLy8gY3VycmVudCBjb25maWd1cmF0aW9uLgotCQkvLwotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmFkZExpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQltYW5hZ2VyLmFkZExpc3RlbmVyKGxpYnJhcnlMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5QUklOVC5nZXRJZCgpKTsKLQkJaWYoYWN0aW9uIGluc3RhbmNlb2YgRGlhZ3JhbVByaW50QWN0aW9uKXsKLQkJCSgoRGlhZ3JhbVByaW50QWN0aW9uKWFjdGlvbikuc2V0Vmlld2VyKHZpZXdlcik7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRWRpdFBhcnRGYWN0b3J5IGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpOwotCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRG91YmxlQ2xpY2soRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR3JhcGhpY2FsVmlld2VyKCkgewotCQlzdXBlci5pbml0aWFsaXplR3JhcGhpY2FsVmlld2VyKCk7Ci0JCWdldEdyYXBoaWNhbFZpZXdlcigpLnNldENvbnRlbnRzKGVkaXRQYXJ0KTsKLQotCQlUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lciBsaXN0ZW5lciA9IGNyZWF0ZURyb3BUYXJnZXRMaXN0ZW5lcigpOwotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuYWRkRHJvcFRhcmdldExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCi0JCS8vIEFic3RyYWN0RWRpdFBhcnRWaWV3ZXIKLQkJLy8gZ2V0R3JhcGhpY2FsVmlld2VyKCkuYWRkRHJvcFRhcmdldExpc3RlbmVyKAotCQkvLyBuZXcgVGV4dFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyKGdldEdyYXBoaWNhbFZpZXdlcigpLAotCQkvLyBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDcmVhdGlvbkZhY3RvcmllcygpIHsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCWlmIChmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkJZnJlZVR4dE5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCVR5cGVkTm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUeXBlZE5vZGUoKTsKLQkJCQkJbm9kZS5zZXRUeXBlKFR5cGVkTm9kZS5GUkVFX1RFWFQpOwotCQkJCQlub2RlLnNldE9iamVjdChHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJLm5ld1R5cGVkR3JhcGhOb2RlKFR5cGVkTm9kZS5GUkVFX1RFWFQpKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCQkJCQlyZXR1cm4gVGVtcGxhdGVDb25zdGFudHMuRlJFRV9URVhUOwotCQkJCX0KLQotCQkJfTsKLQkJQ3JlYXRpb25GYWN0b3J5IGNyZWF0aW9uRmFjdG9yeSA9IGZyZWVUeHROb2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCi0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2NyZWF0ZURyb3BUYXJnZXRMaXN0ZW5lcigpCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyIGNyZWF0ZURyb3BUYXJnZXRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBUZW1wbGF0ZVRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyKGdldEdyYXBoaWNhbFZpZXdlcigpKSB7Ci0KLQkJCXByb3RlY3RlZCBDcmVhdGlvbkZhY3RvcnkgZ2V0RmFjdG9yeShPYmplY3QgdGVtcGxhdGUpIHsKLQkJCQlyZXR1cm4gKENyZWF0aW9uRmFjdG9yeSkgdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAKLQkJCQkJCS5nZXQodGVtcGxhdGUpOwotCQkJfQotCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGlvbkNoYW5nZWQoRXZlbnQgZXZlbnQpIHsKLQkJSUFjdGlvbiBjb3B5ID0gbnVsbDsKLQkJaWYgKGV2ZW50LnR5cGUgPT0gU1dULkRlYWN0aXZhdGUpCi0JCQljb3B5ID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCkpOwotCQlpZiAoZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJCUFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpKSAhPSBjb3B5KSB7Ci0JCQlnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQkJCUFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpLCBjb3B5KTsKLQkJCWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkudXBkYXRlQWN0aW9uQmFycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuR3JhcGhpY2FsRWRpdG9yV2l0aEZseW91dFBhbGV0dGUjZ2V0UGFsZXR0ZVJvb3QoKQotCSAqLwotCXByb3RlY3RlZCBQYWxldHRlUm9vdCBnZXRQYWxldHRlUm9vdCgpIHsKLQkJaWYgKHBhbGV0dGVSb290ID09IG51bGwpIHsKLQkJCWNyZWF0ZVBhbGV0dGVSb290KCk7Ci0JCX0KLQkJcmV0dXJuIHBhbGV0dGVSb290OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVQYWxldHRlUm9vdCgpIHsKLQkJcGFsZXR0ZVJvb3QgPSBuZXcgUGFsZXR0ZVJvb3QoKTsKLQkJcGFsZXR0ZVJvb3QuYWRkQWxsKGNyZWF0ZUNhdGVnb3JpZXMocGFsZXR0ZVJvb3QpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgY3JlYXRlQ2F0ZWdvcmllcyhQYWxldHRlUm9vdCByb290KSB7Ci0JCUxpc3QgY2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlQYWxldHRlQ29udGFpbmVyIHBhbGV0dGVDb250YWluZXIgPSBjcmVhdGVDb250cm9sR3JvdXAocm9vdCk7Ci0JCWlmIChwYWxldHRlQ29udGFpbmVyICE9IG51bGwpIHsKLQkJCWNhdGVnb3JpZXMuYWRkKHBhbGV0dGVDb250YWluZXIpOwotCQl9Ci0KLQkJcmV0dXJuIGNhdGVnb3JpZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFBhbGV0dGVDb250YWluZXIgY3JlYXRlQ29udHJvbEdyb3VwKFBhbGV0dGVSb290IHJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpIHsKLQkJSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0KS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJLy8gc2F2ZURpYWdyYW0oKTsKLQkJLy8gc2F2ZVNjcmVlbigpOwotCi0JCWZpbmFsIE1ldGhvZEVsZW1lbnQgZSA9IGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKTsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU2FmZVJ1bm5hYmxlLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yCi0JCQkJCQkJLmJlZ2luVGFzaygKLQkJCQkJCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCQkJCW1vbml0b3IKLQkJCQkJCQkuc2V0VGFza05hbWUoRGlhZ3JhbVVJUmVzb3VyY2VzLmJpbmQoRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2UKLQkJCQkJCQkJCSwgZS5lUmVzb3VyY2UoKS5nZXRVUkkoKS5pc0ZpbGUoKSA/IGUuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkgOiBlLmdldE5hbWUoKSkpOyAKLQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBlcnNpc3Rlci5zYXZlKGUuZVJlc291cmNlKCkpOwotCQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pICgoRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJCS5nZXRDb250ZW50cygpKS5nZXRNb2RlbCgpOwotCQkJCQkJZGlhZ3JhbS5zZXROZXcoZmFsc2UpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJLmxvZ0Vycm9yKGV4KTsKLQkJCQkJCQlWaWV3SGVscGVyCi0JCQkJCQkJCQkucmVsb2FkQ3VycmVudExpYmFyeU9uUm9sbGJhY2tFcnJvcihnZXRTaXRlKCkKLQkJCQkJCQkJCQkJLmdldFNoZWxsKCkpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5V2FybmluZygKLQkJCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXRUZXh0KCksCi0JCQkJCQkJCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLmRpYWdyYW1fc2F2ZUVycm9yCi0JCQkJCQkJCQkJLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQkvLyBSZWZyZXNoIHRoZSBuZWNlc3Nhcnkgc3RhdGUuCi0JCQkJCS8vCi0JCQkJCS8vZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpLm1hcmtTYXZlTG9jYXRpb24oKTsKLQkJCQkJZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7Ci0JCQkJCWNoYW5nZVRpbWUgPSAtMTsKLQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOwotCi0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCX0KLQotCS8qKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlQXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlyZXR1cm4gZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpLmlzRGlydHkoKTsKLQl9Ci0KLQkvKiogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2lzU2F2ZUFzQWxsb3dlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJaWYgKGVkaXRQYXJ0ICE9IG51bGwpIHsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJcmV0dXJuIGRpYWdyYW0gIT0gbnVsbCAmJiBkaWFncmFtLmlzUmVhZE9ubHkoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVkaXRQYXJ0KCkgewotCQlCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpOwotCQlPYmplY3Qgb2JqZWN0OwotCQlpZiAoZWRpdG9ySW5wdXQuZ2V0V3JhcHBlcigpICE9IG51bGwpIHsKLQkJCW9iamVjdCA9IGVkaXRvcklucHV0LmdldFdyYXBwZXIoKTsKLQkJfSBlbHNlIHsKLQkJCW9iamVjdCA9IGVkaXRvcklucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJfQotCQkKLQkJY2hhbmdlVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQllZGl0UGFydCA9IGNyZWF0ZURpYWdyYW1FZGl0UGFydCgpOwotCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJLy8gcGFzcyBhbG9uZyB0aGUgU3VwcHJlc3Npb24gaW5zdGFuY2UgZnJvbSBpbnB1dCB0byBkaWFncmFtIG1vZGVsCi0JCS8vCi0JCWRpYWdyYW0uc2V0U3VwcHJlc3Npb24oZWRpdG9ySW5wdXQuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCWRpYWdyYW0uc2V0T2JqZWN0KG9iamVjdCk7Ci0JCWRpYWdyYW0uYWRkQ29uc3VtZXIodGhpcyk7Ci0JCQotCQlpZighZGlhZ3JhbS5pc05ldygpKSB7Ci0JCQljaGFuZ2VUaW1lID0gLTE7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNzZXRJbnB1dChvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLnNldElucHV0KGlucHV0KTsKLQotCQlNZXRob2RFbGVtZW50IGUgPSBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCk7Ci0JCWlmIChlICE9IG51bGwpIHsKLQkJCWNyZWF0ZUVkaXRQYXJ0KCk7Ci0KLQkJCUJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IChCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpIGdldEVkaXRvcklucHV0KCk7Ci0JCQlzZXRQYXJ0TmFtZShnZXRQYXJ0TmFtZVByZWZpeCgpCi0JCQkJCSsgZS5nZXROYW1lKCkKLQkJCQkJKyAiLCAiICsgZWRpdG9ySW5wdXQuZ2V0U3VwcHJlc3Npb24oKS5nZXRQcm9jZXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gc2V0VGl0bGVJbWFnZShnZXRUeXBlSW1hZ2UoZSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEVkaXRQYXJ0IGNyZWF0ZURpYWdyYW1FZGl0UGFydCgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQYXJ0TmFtZVByZWZpeCgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREaWFncmFtVHlwZSgpOwotCi0JLyoqCi0JICogR2V0IHBhcmVudCBlZGl0b3IKLQkgKiBAcmV0dXJuIGVkaXRvcgotCSAqLwotCXB1YmxpYyBJRWRpdG9yUGFydCBnZXRQYXJlbnRFZGl0b3IoKSB7Ci0JCXJldHVybiBwYXJlbnRFZGl0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50RWRpdG9yKElFZGl0b3JQYXJ0IHBhcmVudEVkaXRvcikgewotCQl0aGlzLnBhcmVudEVkaXRvciA9IHBhcmVudEVkaXRvcjsKLQl9Ci0JCi0JLy9BZGRpbmcgbGlicmFyeWNobmFnZWQgbGlzdGVuZXIsIGlmIGNvbmZpZ3VyYXRpb24gZ290IGNoYW5nZWQgZGlhZ3JhbSBuZWVkcyB0byByZWZyZXNoCi0JcHJpdmF0ZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpYnJhcnlMaXN0ZW5lciA9IG5ldyBJTGlicmFyeUNoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2hhbmdlZChpbnQgb3B0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJCXN3aXRjaCAob3B0aW9uKSB7Ci0JCQljYXNlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQ6IHsKLQkJCQlpZiAoY29sbGVjdGlvbiAhPSBudWxsICYmIGNvbGxlY3Rpb24uY29udGFpbnMoY3VycmVudENvbmZpZykpIHsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0Uuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjdXJyZW50Q29uZmlnKTsJCQkJCQotCQkJCQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihSRUZSRVNIKTsKLQkJCQkJCWFjdGlvbi5ydW4oKTsKLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCVByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0Uuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCQkJCQl9Ci0JCQkJfQkJCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvLyBoYW5kbGVkIGJ5IGxpYlN2Y0xpc3RlbmVyCi0JCQkvLwotLy8JCQljYXNlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NPTkZJR1VSQVRJT05fU0VMRUNURUQ6IHsKLS8vCQkJCWNvbmZpZ0NoYW5nZWQoKTsKLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCQotCXByaXZhdGUgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgbGliU3ZjTGlzdGVuZXIgPSBuZXcgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkJY29uZmlnQ2hhbmdlZCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0JCQotCX07Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ0NoYW5nZWQoKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQlpZihjdXJyZW50Q29uZmlnICE9IGNvbmZpZykgewotCQkJLy8gcmVmcmVzaCBvbmx5IGlmIHRoZSBhY3RpdmUgcGFydCBpcyB0aGlzIGRpYWdyYW0gZWRpdG9yIG9yIHByb2Nlc3MgZWRpdG9yIG9mIHRoZSBwcm9jZXNzCi0JCQkvLyB0aGF0IG93bnMgdGhpcyBkaWFncmFtCi0JCQkvLwotCQkJSVdvcmtiZW5jaFBhcnQgYWN0aXZlUGFydCA9IGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLmdldEFjdGl2ZVBhcnQoKTsKLQkJCWJvb2xlYW4gcmVmcmVzaCA9ICBhY3RpdmVQYXJ0ID09IHRoaXM7Ci0JCQlpZighcmVmcmVzaCkgewotCQkJCWlmKGFjdGl2ZVBhcnQgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9yKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBpbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpICgoUHJvY2Vzc0VkaXRvcilhY3RpdmVQYXJ0KS5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCQlPYmplY3QgcHJvY0NvbXAgPSBpbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCUVPYmplY3QgZGlhZ3JhbSA9ICgoRGlhZ3JhbSllZGl0UGFydC5nZXRNb2RlbCgpKS5nZXRVTUFEaWFncmFtKCk7Ci0JCQkJCXJlZnJlc2ggPSBVbWFVdGlsLmlzQ29udGFpbmVkQnkoZGlhZ3JhbSwgcHJvY0NvbXApOwotCQkJCX0KLQkJCX0KLQkJCWlmKHJlZnJlc2gpIHsKLQkJCQljdXJyZW50Q29uZmlnID0gY29uZmlnOwotCQkJCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oUkVGUkVTSCk7Ci0JCQkJYWN0aW9uLnJ1bigpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvbkxpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKiBvdmVycmlkZSB0byBkb25vdCBhbGxvdyBhbnkgbm9kZSBzZWxlY3Rpb24gaW4gQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gCi0JICogaWYgYWN0aXZpdHkgaXMgZXh0ZW5kcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChwYXJ0LCBzZWxlY3Rpb24pOwotCQlpZihlZGl0UGFydCAhPSBudWxsKXsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKWVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQlpZihkaWFncmFtLmlzUmVhZE9ubHkoKSB8fCBUbmdVdGlsLmlzTG9ja2VkKGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKSkpewotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLnNlbGVjdChlZGl0UGFydCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaERpYWdyYW0oKXsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oUkVGUkVTSCkucnVuKCk7Ci0JfQotCQotLy8JLyoKLS8vCSAqIE1ldGhvZCBzZXRzIHRoZSBjb250ZXh0IG1lbnUgY29udHJpYnV0aW5nIGl0ZW1zIHN0YXRlLgotLy8JICogVGhpcyBpcyBlZmZpY2llbnQgd2F5IGluc3RlYWQgb2YgZG9pbmcgYXQgZWFjaCBhY3Rpb24uIAotLy8JICogVW5jb21tZW50IHRoaXMgY29kZSwgb25jZSBhbGwgdGhlIHBsYWNlIGlzRW5hYmxlZCBDb2RlIGlzIHJlbW92ZWQuCi0vLwkgKi8KLS8vCXB1YmxpYyB2b2lkIHNldFN0YXRlTWVudUNvbnRyaWJ1dGVJdGVtcygpewotLy8JCQotLy8JCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLS8vCQlpZihlZGl0UGFydHMuc2l6ZSgpID09IDApewotLy8JCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihERUxFVEVfRElBR1JBTSkuc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQl9Ci0vLwkJaWYoZWRpdFBhcnRzLnNpemUoKSA9PSAxKXsKLS8vCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpZWRpdFBhcnRzLmdldCgwKTsKLS8vCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oU0VMRUNUX0xJTkspLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCWlmIChlZGl0UGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0vLwkJCQlpZigoKFR5cGVkTm9kZSkgZWRpdFBhcnQuZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5GUkVFX1RFWFQpCi0vLwkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihGT05UX0RJQUxPRykuc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKFNFTEVDVF9MSU5LKS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJfQotLy8JCQlpZihlZGl0UGFydCBpbnN0YW5jZW9mIExpbmtFZGl0UGFydCl7Ci0vLwkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfQkVORF9QT0lOVCkuc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCUxpbmsgbGluayA9IChMaW5rKWVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0vLwkJCQlpZihsaW5rLmdldEJlbmRwb2ludHMoKS5zaXplKCkgPiAwKXsKLS8vCQkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihBTElHTl9CRU5EX1BPSU5UKS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCQotLy8JCX0KLS8vCQlpZihlZGl0UGFydHMuc2l6ZSgpID09IDIpewotLy8JCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfTElOSykuc2V0RW5hYmxlZCh0cnVlKTsgCi0vLwkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGVkaXRQYXJ0cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLS8vCQkJCU9iamVjdCBwYXJ0ID0gaXRvci5uZXh0KCk7Ci0vLwkJCQlpZiAocGFydCBpbnN0YW5jZW9mIEZyZWVUZXh0RWRpdFBhcnQpCi0vLwkJCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0xJTkspLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCQl9Ci0vLwkJfQotLy8JfQotCQotLy8JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0vLwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotLy8JCXN1cGVyLnNldEZvY3VzKCk7Ci0vLwkJLy8gUmVmcmVzaCBpcyBleHBlbnNpdmUgb3BlcmF0aW9uLgotLy8JCS8vIFRPRE8gLSBmaW5kIHByb2Nlc3Mgc29sdXRpb24gZm9yIG5vdGlmaWNhdGlvbiBiZXR3ZWVuIAotLy8JCS8vIGJhc2UgZGlhZ3JhbSBhbmQgZXh0ZW5kIGRpYWdyYW0uICAgICAKLS8vCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCk7Ci0vLwkJaWYoKChEaWFncmFtKWVkaXRQYXJ0LmdldE1vZGVsKCkpLmlzUmVhZE9ubHkoKSl7Ci0vLwkJCWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKFJFRlJFU0gpLnJ1bigpOwotLy8JCX0KLS8vCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpewotLy8JCQlpZigoKFZhcmlhYmlsaXR5RWxlbWVudCllbGVtZW50KS5nZXRWYXJpYWJpbGl0eVR5cGUoKSAhPSBudWxsKXsKLS8vCQkJCWlmKCEoKFZhcmlhYmlsaXR5RWxlbWVudCllbGVtZW50KS5nZXRWYXJpYWJpbGl0eVR5cGUoKS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLk5BX0xJVEVSQUwpKXsKLS8vCQkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihSRUZSRVNIKS5ydW4oKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQkJCi0vLwkJfQotLy8JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxZjg3ZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGlhZ3JhbVVwZGF0ZVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5GcmVlVGV4dE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuTWFycXVlZVRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYW5uaW5nU2VsZWN0aW9uVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLQotCi0vKioKLSAqIEFuIGVkaXRvciBmb3IgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvciBleHRlbmRzIEFic3RyYWN0RGlhZ3JhbUVkaXRvciB7Ci0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNFVF9ESUFHUkFNX0xBWU9VVCA9ICJyZXNldF9kaWFncmFtX2xheW91dCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ3JlYXRpb25GYWN0b3J5IHJvbGVOb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3RvcnkgdGFza05vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSB3cGROb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBib29sZWFuIGluaXRpYWxDbGVhblVwID0gZmFsc2U7Ci0JcHJpdmF0ZSBCcmVha2Rvd25BZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQotCS8vIGEgaGFjawotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjcmVhdGVFZGl0UGFydEZhY3RvcnkoKQotCSAqLwotCXByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSgpOwotCQkvLyByZXR1cm4gbmV3IEVkaXRQYXJ0RmFjdG9yeSgpIHsKLQkJLy8KLQkJLy8gcHVibGljIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KEVkaXRQYXJ0IGNvbnRleHQsIE9iamVjdCBtb2RlbCkgewotCQkvLyBpZihtb2RlbCBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQkvLyByZXR1cm4gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KChBY3Rpdml0eURldGFpbERpYWdyYW0pCi0JCS8vIG1vZGVsKTsKLQkJLy8gfQotCQkvLyBlbHNlIGlmKG1vZGVsIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGUpIHsKLQkJLy8gcmV0dXJuIG5ldyBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KChSb2xlVGFza0NvbXBvc2l0ZSkgbW9kZWwpOwotCQkvLyB9Ci0JCS8vIGVsc2UgaWYobW9kZWwgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZSl7Ci0JCS8vIHJldHVybiBuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCgoV29ya1Byb2R1Y3RDb21wb3NpdGUpCi0JCS8vIG1vZGVsKTsKLQkJLy8gfQotCQkvLyBlbHNlIGlmKG1vZGVsIGluc3RhbmNlb2YgUm9sZU5vZGUKLQkJLy8gfHwgbW9kZWwgaW5zdGFuY2VvZiBUYXNrTm9kZQotCQkvLyB8fCBtb2RlbCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUKLQkJLy8gKQotCQkvLyB7Ci0JCS8vIHJldHVybiBuZXcgRGVzY3JpcHRvck5vZGVFZGl0UGFydCgoTmFtZWROb2RlKSBtb2RlbCk7Ci0JCS8vIH0KLQkJLy8gZWxzZSBpZihtb2RlbCBpbnN0YW5jZW9mIExpbmspIHsKLQkJLy8gcmV0dXJuIG5ldyBMaW5rRWRpdFBhcnQoKExpbmspIG1vZGVsKTsKLQkJLy8gfQotCQkvLyBpZihtb2RlbCBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkvLyBUeXBlZE5vZGUgbm9kZSA9IChUeXBlZE5vZGUpIG1vZGVsOwotCQkvLyBzd2l0Y2gobm9kZS5nZXRUeXBlKCkpIHsKLQkJLy8gY2FzZSBUeXBlZE5vZGUuU1RBUlQ6IHJldHVybiBuZXcgU3RhcnROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCS8vIGNhc2UgVHlwZWROb2RlLkVORDogcmV0dXJuIG5ldyBFbmROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCS8vIGNhc2UgVHlwZWROb2RlLkRFQ0lTSU9OOiByZXR1cm4gbmV3IERlY2lzaW9uTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkvLyBjYXNlIFR5cGVkTm9kZS5TWU5DSF9CQVI6IHJldHVybiBuZXcgU3luY2hCYXJOb2RlRWRpdFBhcnQobm9kZSk7Ci0JCS8vIGNhc2UgVHlwZWROb2RlLkZSRUVfVEVYVDogcmV0dXJuIG5ldyBGcmVlVGV4dEVkaXRQYXJ0KG5vZGUpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIG51bGw7Ci0JCS8vIH0KLQkJLy8JCQkKLQkJLy8gfTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2NyZWF0ZURpYWdyYW1FZGl0UGFydCgpCi0JICovCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZURpYWdyYW1FZGl0UGFydCgpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydChNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpKTsKLQl9Ci0KLS8vCS8qCi0vLwkgKiAobm9uLUphdmFkb2MpCi0vLwkgKiAKLS8vCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjcmVhdGVFZGl0UGFydChqYXZhLmxhbmcuT2JqZWN0KQotLy8JICovCi0vLwlwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IGUpIHsKLS8vCQlBY3Rpdml0eURldGFpbERpYWdyYW0gZGlhZ3JhbSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLS8vCQkJCS5jcmVhdGVBY3Rpdml0eURldGFpbERpYWdyYW0oKTsKLS8vCQlkaWFncmFtLnNldE9iamVjdChlKTsKLS8vCQlFZGl0UGFydCBwYXJ0ID0gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KGRpYWdyYW0pOwotLy8JCXBhcnQuc2V0TW9kZWwoZGlhZ3JhbSk7Ci0vLwkJZGlhZ3JhbS5hZGRDb25zdW1lcih0aGlzKTsKLS8vCQlyZXR1cm4gcGFydDsKLS8vCX0KLQkJCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2dldFBhcnROYW1lUHJlZml4KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnROYW1lUHJlZml4KCkgewotCQlyZXR1cm4gRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9wcmVmaXg7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgUGFsZXR0ZUNvbnRhaW5lciBjcmVhdGVDb250cm9sR3JvdXAoUGFsZXR0ZVJvb3Qgcm9vdCkgewotCQlpbml0aWFsaXplQ3JlYXRpb25GYWN0b3JpZXMoKTsKLQotCQlQYWxldHRlR3JvdXAgY29udHJvbEdyb3VwID0gbmV3IFBhbGV0dGVHcm91cCgiQ29udHJvbCBHcm91cCIpOyAvLyROT04tTkxTLTEkCi0KLQkJTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVRvb2xFbnRyeSB0b29sID0gbmV3IFBhbm5pbmdTZWxlY3Rpb25Ub29sRW50cnkoRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dCwgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3Rvb2x0aXAKLQkJKTsKLQkJdG9vbC5zZXRTbWFsbEljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkic2VsZWN0X3BhbDE2LmdpZiIpKTsKLQkJdG9vbC5zZXRMYXJnZUljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkic2VsZWN0X3BhbDI0LmdpZiIpKTsKLQkJZW50cmllcy5hZGQodG9vbCk7Ci0JCXJvb3Quc2V0RGVmYXVsdEVudHJ5KHRvb2wpOwotCi0JCXRvb2wgPSBuZXcgTWFycXVlZVRvb2xFbnRyeSgpOwotCQl0b29sLnNldFNtYWxsSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJtYXJxX3BhbDE2LmdpZiIpKTsKLQkJdG9vbC5zZXRMYXJnZUljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkibWFycV9wYWwyNC5naWYiKSk7Ci0JCWVudHJpZXMuYWRkKHRvb2wpOwotCi0JCUNvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5IGNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dCwgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcCwgLy8kTk9OLU5MUy0xJAotCQkJCVRlbXBsYXRlQ29uc3RhbnRzLkZSRUVfVEVYVCwgZnJlZVR4dE5vZGVDcmVhdGlvbkZhY3RvcnksCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmcmVldGV4dF9wYWwxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnJlZXRleHRfcGFsMjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQotCQljb250cm9sR3JvdXAuYWRkQWxsKGVudHJpZXMpOwotCQlyZXR1cm4gY29udHJvbEdyb3VwOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDcmVhdGlvbkZhY3RvcmllcygpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUNyZWF0aW9uRmFjdG9yaWVzKCk7Ci0KLQkJaWYgKHJvbGVOb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpIHsKLQkJCXJvbGVOb2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQlSb2xlVGFza0NvbXBvc2l0ZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVSb2xlVGFza0NvbXBvc2l0ZSgpOwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJbm9kZS5zZXRVTUFEaWFncmFtKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZURlc2NyaXB0b3IoKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLlJPTEVfREVTQ1JJUFRPUjsKLQkJCQl9Ci0KLQkJCX07Ci0JCX0KLQkJQ3JlYXRpb25GYWN0b3J5IGNyZWF0aW9uRmFjdG9yeSA9IHJvbGVOb2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCi0JCWlmICh0YXNrTm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQl0YXNrTm9kZUNyZWF0aW9uRmFjdG9yeSA9IG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpIHsKLQkJCQkJTmFtZWROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tOb2RlKCk7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlub2RlLnNldFVNQURpYWdyYW0oZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJCQlub2RlLnNldE9iamVjdChVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrRGVzY3JpcHRvcigpKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCQkJCQlyZXR1cm4gVGVtcGxhdGVDb25zdGFudHMuVEFTS19ERVNDUklQVE9SOwotCQkJCX0KLQotCQkJfTsKLQkJfQotCQljcmVhdGlvbkZhY3RvcnkgPSB0YXNrTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQotCQlpZiAod3BkTm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQl3cGROb2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQlOYW1lZE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpOwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJbm9kZS5zZXRVTUFEaWFncmFtKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5UQVNLX0RFU0NSSVBUT1I7Ci0JCQkJfQotCi0JCQl9OwotCQl9Ci0JCWNyZWF0aW9uRmFjdG9yeSA9IHdwZE5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogRWRpdG9yIElucHV0Ci0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEVkaXRvcklucHV0IGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IHsKLQotCQkvKioKLQkJICogQHBhcmFtIGUKLQkJICovCi0JCXB1YmxpYyBFZGl0b3JJbnB1dChPYmplY3QgZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJCXN1cGVyKGUsIHN1cHByZXNzaW9uKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogU2V0IGZvY3VzIG9uIHRoZSBlZGl0b3IKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5HcmFwaGljYWxFZGl0b3Ijc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlzdXBlci5zZXRGb2N1cygpOwotCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRDb250ZW50cygpLnJlZnJlc2goKTsKLQkJaWYgKCFpbml0aWFsQ2xlYW5VcCkgewotCQkJY2xlYW5VcERpYWdyYW0oKTsKLQkJCWluaXRpYWxDbGVhblVwID0gdHJ1ZTsKLQkJCS8vIExvY2tlZCBQbHVnaW4gY2FzZTogRGlzcGxheSBnZW5lcmF0ZWQgQUREIGRpYWdyYW0sIFBlcm1pc3Npb24gZGVuaWVkIHRvIHNhdmUsICAKLQkJCS8vIGFuZCBObyBkaXJ0eSBmbGFnIG9uIGVkaXRvci4gCi0JCQlpZihUbmdVdGlsLmlzTG9ja2VkKGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKSkpewotCQkJCS8vIEZsdXNoIGFsbCBjb21tYW5kcywgbWVhbnMgd2lsbCBub3Qgc2F2ZS4KLQkJCQlnZXRDb21tYW5kU3RhY2soKS5mbHVzaCgpOwotCQkJCS8vIEZpcmUgZGlydHkgZmxhZyBwcm9wZXJ0eSBjaGFuZ2UsIG5vIGRpcnR5IGZsYWcgb24gZWRpdG9yLgotCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMOwotCX0KLQotCS8qKgotCSAqIENsZWFuIGRpYWdyYW0KLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFuVXBEaWFncmFtKCkgewotLy8JCU1ldGhvZEVsZW1lbnQgb2JqID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGdldEVkaXRvcklucHV0KCkpCi0vLwkJCQkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQlEaWFncmFtVXBkYXRlU2VydmljZSBzZXJ2aWNlID0gbmV3IERpYWdyYW1VcGRhdGVTZXJ2aWNlKAotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLCBnZXRFZGl0RG9tYWluKCksIGdldEFjdGlvblJlZ2lzdHJ5KCkpOwotCQlzZXJ2aWNlLmNsZWFuVXBEaWFncmFtKCk7Ci0JCS8vIGlmIChUbmdVdGlsLmlzR2VuZXJhbGl6ZXIob2JqLAotCQkvLyBnZXRFeHRlbmRBbmRDb250cmlidXRlVmFyaWFiaWxpdHlUeXBlcygpKQotCQkvLyAmJiAhaW5pdGlhbENsZWFuVXApIHsKLQkJLy8gaW5pdGlhbENsZWFuVXAgPSB0cnVlOwotCQkvLyBJQWN0aW9uIHJlc2V0ID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCS8vIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5SRVNFVF9ESUFHUkFNX0xBWU9VVCk7Ci0JCS8vIHJlc2V0LnJ1bigpOwotCQkvLyBkb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCS8vIH0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3IjY29udHJpYnV0ZVRvQ29udGV4dE1lbnUob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlVG9Db250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5jb250cmlidXRlVG9Db250ZXh0TWVudShtZW51KTsKLQotCQlib29sZWFuIGNhbk1vZGlmeSA9ICFpc1JlYWRPbmx5KCk7Ci0KLQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihSRVNFVF9ESUFHUkFNX0xBWU9VVCk7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51Lmluc2VydEJlZm9yZShERUxFVEVfRElBR1JBTSwgYWN0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjcmVhdGVBY3Rpb25zKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQlzdXBlci5jcmVhdGVBY3Rpb25zKCk7Ci0JCUFjdGlvbiByZXNldExheW91dEFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcl9SZXNldERpYWdyYW1MYXlvdXRfdGV4dCkgeyAvLyROT04tTkxTLTEkCi0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihSRUZSRVNIKS5ydW4oKTsKLQkJCQlpZiAoZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0Q29udGVudHMoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSB7Ci0JCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGRlcCA9IChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkJCQkuZ2V0Q29udGVudHMoKTsKLQkJCQkJTGlzdCBsb2NhbCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaWYoZGVwLmdldENoaWxkcmVuKCkgIT0gbnVsbCAmJiAhZGVwLmdldENoaWxkcmVuKCkuaXNFbXB0eSgpKXsKLQkJCQkJCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IGRlcC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkJCQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCWlmKCEobmV4dCBpbnN0YW5jZW9mIEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KSl7Ci0JCQkJCQkJCWxvY2FsLmFkZChuZXh0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZGVwLmdldFJlY2VudGx5QWRkZWRQYXJ0cygpLmFkZEFsbChsb2NhbCk7Ci0JCQkJCWNsZWFuVXBEaWFncmFtKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJcmV0dXJuIGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCkuc2l6ZSgpID09IDA7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIFJFU0VUX0RJQUdSQU1fTEFZT1VUOwotCQkJfQotCi0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24ocmVzZXRMYXlvdXRBY3Rpb24pOwotCX0KLQotLy8JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBleHRlbmRBbmRDb250cmlidXRlVmFyaWFiaWxpdHlUeXBlcyA9IG51bGw7Ci0KLS8vCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb24gZ2V0RXh0ZW5kQW5kQ29udHJpYnV0ZVZhcmlhYmlsaXR5VHlwZXMoKSB7Ci0vLwkJaWYgKGV4dGVuZEFuZENvbnRyaWJ1dGVWYXJpYWJpbGl0eVR5cGVzID09IG51bGwpIHsKLS8vCQkJZXh0ZW5kQW5kQ29udHJpYnV0ZVZhcmlhYmlsaXR5VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCWV4dGVuZEFuZENvbnRyaWJ1dGVWYXJpYWJpbGl0eVR5cGVzCi0vLwkJCQkJLmFkZChWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKTsKLS8vCQkJZXh0ZW5kQW5kQ29udHJpYnV0ZVZhcmlhYmlsaXR5VHlwZXMKLS8vCQkJCQkuYWRkKFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFU19MSVRFUkFMKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIGV4dGVuZEFuZENvbnRyaWJ1dGVWYXJpYWJpbGl0eVR5cGVzOwotLy8JfQotCQotCS8qKgotCSAqIEJyZWFrIGRvd24gYWRhcHRlciBmYWN0b3J5IGNsYXNzCi0JICovCi0JcHVibGljIGNsYXNzIEJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5Ci0JewotCQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSB3YnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHRic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnkgd3Bic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgY2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCi0JCXB1YmxpYyBCcmVha2Rvd25BZGFwdGVyRmFjdG9yeShNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZykKLQkJewotCQkJLy8gY3JlYXRlIGFkYXB0IGZhY3RvcmllcwotCQkJd2JzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVdCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCXRic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5jcmVhdGVUQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQl3cGJzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVdQQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQljYnNBZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuY3JlYXRlUHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCQkJLy8gc2V0IGNvbmZpZ3VyYXRpb24gZmlsdGVyCi0JCQlEaWFncmFtQWRhcHRlckZhY3RvcnlGaWx0ZXIgY29uZmlndXJhdG9yID0gbmV3IERpYWdyYW1BZGFwdGVyRmFjdG9yeUZpbHRlcigKLQkJCQkJbWV0aG9kQ29uZmlnLCB0aGlzKTsKLQotCQkJd2JzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7Ci0JCQl0YnNBZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIoY29uZmlndXJhdG9yKTsKLQkJCXdwYnNBZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIoY29uZmlndXJhdG9yKTsKLQkJCWNic0FkYXB0ZXJGYWN0b3J5LnNldEZpbHRlcihjb25maWd1cmF0b3IpOwkJfQotCQkKLQkJcHVibGljIHZvaWQgY2xlYXIoKQotCQl7Ci0JCQlpZiAod2JzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXdic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCQl3YnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQl9Ci0KLQkJCWlmICh0YnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJdGJzQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJCXRic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJCX0KLQotCQkJaWYgKHdwYnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJd3Bic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCQl3cGJzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQkJfQotCi0JCQlpZiAoY2JzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWNic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCQljYnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRGlhZ3JhbSBBZGFwdGVyIGZhY3RvcnkgZmlsdGVyCi0JICoKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRGlhZ3JhbUFkYXB0ZXJGYWN0b3J5RmlsdGVyIGV4dGVuZHMgUHJvY2Vzc0NvbmZpZ3VyYXRvcgotCQkJaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnlGaWx0ZXIgewotCi0JCXByaXZhdGUgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5IGZhY3Rvcnk7Ci0KLQkJLyoKLQkJICogQ3JlYXRlIGFuIGluc3RhbmNlCi0JCSAqLwotCQlwdWJsaWMgRGlhZ3JhbUFkYXB0ZXJGYWN0b3J5RmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLAotCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCQlzdXBlcihtZXRob2RDb25maWcsIG51bGwpOwotCQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gV0JTIEFkYXB0ZXIgRmFjdG9yeQotCQkgKi8KLQkJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFdCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQkJcmV0dXJuIGZhY3Rvcnkud2JzQWRhcHRlckZhY3Rvcnk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIFRlYW0gQWxsb2NhdGlvbiBBZGFwdGVyIEZhY3RvcnkKLQkJICovCi0JCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRUQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJCXJldHVybiBmYWN0b3J5LnRic0FkYXB0ZXJGYWN0b3J5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBXUCBVc2FnZSBBZGFwdGVyIEZhY3RvcnkKLQkJICovCi0JCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRXUEJTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCQlyZXR1cm4gZmFjdG9yeS53cGJzQWRhcHRlckZhY3Rvcnk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIGNvbnNvbGlkYXRlZCB2aWV3IGFkYXB0ZXIgZmFjdG9yeQotCQkgKi8KLQkJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldENCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQkJcmV0dXJuIGZhY3RvcnkuY2JzQWRhcHRlckZhY3Rvcnk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIHN1cGVyLmFjY2VwdChvYmopOwotCQl9Ci0JfQotCQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKGZhY3RvcnkgIT0gbnVsbCl7Ci0JCQlmYWN0b3J5LmNsZWFyKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9CcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTYzMDEyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9CcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogQnJlYWtkb3duIEVsZW1lbnQgaW5wdXQgZm9yIGFuIGVkaXRvcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCA3LCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgZXh0ZW5kcyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgewotCi0JcHJpdmF0ZSBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbjsKLQotCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dChPYmplY3Qgb2JqZWN0LCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQlzdXBlcigoTWV0aG9kRWxlbWVudCkgVG5nVXRpbC51bndyYXAob2JqZWN0KSk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0OwotCQl9Ci0JCXRoaXMuc3VwcHJlc3Npb24gPSBzdXBwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN1cHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHN1cHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgd3JhcHBlci4KLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgZ2V0V3JhcHBlcigpIHsKLQkJcmV0dXJuIHdyYXBwZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZ2V0Q2xhc3MoKS5pc0luc3RhbmNlKG9iaikpIHsKLQkJCUJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCBvdGhlciA9IChCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpIG9iajsKLQkJCXJldHVybiBnZXRNZXRob2RFbGVtZW50KCkgPT0gb3RoZXIuZ2V0TWV0aG9kRWxlbWVudCgpCi0JCQkJCSYmIHN1cHByZXNzaW9uLmdldFByb2Nlc3MoKSA9PSBvdGhlci5nZXRTdXBwcmVzc2lvbigpCi0JCQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQ29sdW1uRGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQ29sdW1uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMGIzMmMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0NvbHVtbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotLyoqCi0gKiBDb2x1bW4gZGVzY3JpcHRvcnMgdXNlZCBmb3IgcHJvY2VzcyBlZGl0b3JzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2x1bW5EZXNjcmlwdG9yIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTY3MTg0NzY5ODU5NzA5OTdMOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VMTF9FRElUT1JfVFlQRV9OT05FID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTExfRURJVE9SX1RZUEVfVEVYVCA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRUxMX0VESVRPUl9UWVBFX0NPTUJPX0JPT0xFQU4gPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOID0gMzsKLQotCXB1YmxpYyBTdHJpbmcgaWQ7Ci0KLQlwdWJsaWMgU3RyaW5nIGxhYmVsOwotCi0JcHVibGljIGludCB3aWR0aDsKLQotCXB1YmxpYyBib29sZWFuIHJlc2l6YWJsZTsKLQotCXB1YmxpYyBpbnQgY2VsbEVkaXRvclR5cGU7Ci0KLQlwdWJsaWMgaW50IHdlaWdodDsKLQotCXB1YmxpYyBpbnQgYWxpZ25tZW50OwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogCQkJSUQgb2YgdGhlIGNvbHVtbgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIAkJCUNvbHVtbiBOYW1lCi0JICogQHBhcmFtIHdlaWdodAotCSAqIAkJCUNvbHVtbiB3ZWlnaHQKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiAJCQlDb2x1bW4gV2lkdGgKLQkgKiBAcGFyYW0gcmVzaXphYmxlCi0JICogCQkJRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIGNvbHVtbiBpcyByZXNpemFibGUgb3Igbm90Ci0JICogQHBhcmFtIGNlbGxFZGl0b3JUeXBlCi0JICogCQkJQ29sdW1uIGNlbGwgZWRpdG9yIHR5cGUKLQkgKi8KLQlwdWJsaWMgQ29sdW1uRGVzY3JpcHRvcihTdHJpbmcgaWQsIFN0cmluZyBsYWJlbCwgaW50IHdlaWdodCwgaW50IHdpZHRoLAotCQkJYm9vbGVhbiByZXNpemFibGUsIGludCBjZWxsRWRpdG9yVHlwZSkgewotCQl0aGlzKGlkLCBsYWJlbCwgd2VpZ2h0LCB3aWR0aCwgcmVzaXphYmxlLCBjZWxsRWRpdG9yVHlwZSwgU1dULkxFRlQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAJCQlJRCBvZiB0aGUgY29sdW1uCi0JICogQHBhcmFtIGxhYmVsCi0JICogCQkJQ29sdW1uIE5hbWUKLQkgKiBAcGFyYW0gd2VpZ2h0Ci0JICogCQkJQ29sdW1uIHdlaWdodAotCSAqIEBwYXJhbSB3aWR0aAotCSAqIAkJCUNvbHVtbiBXaWR0aAotCSAqIEBwYXJhbSByZXNpYWJsZQotCSAqIAkJCUZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBjb2x1bW4gaXMgcmVzaXphYmxlIG9yIG5vdAotCSAqIEBwYXJhbSBjZWxsRWRpdG9yVHlwZQotCSAqIAkJCUNvbHVtbiBjZWxsIGVkaXRvciB0eXBlCi0JICogQHBhcmFtIGFsaWdubWVudAotCSAqIAkJCUNvbHVtbiBhbGlnbm1lbnQKLQkgKi8KLQlwdWJsaWMgQ29sdW1uRGVzY3JpcHRvcihTdHJpbmcgaWQsIFN0cmluZyBsYWJlbCwgaW50IHdlaWdodCwgaW50IHdpZHRoLAotCQkJYm9vbGVhbiByZXNpYWJsZSwgaW50IGNlbGxFZGl0b3JUeXBlLCBpbnQgYWxpZ25tZW50KSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQl0aGlzLnJlc2l6YWJsZSA9IHJlc2lhYmxlOwotCQl0aGlzLndlaWdodCA9IHdlaWdodDsKLQkJdGhpcy53aWR0aCA9IHdpZHRoOwotCQl0aGlzLmNlbGxFZGl0b3JUeXBlID0gY2VsbEVkaXRvclR5cGU7Ci0JCXRoaXMuYWxpZ25tZW50ID0gYWxpZ25tZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQ29uZmlndXJhdGlvbkVkaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQ29uZmlndXJhdGlvbkVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NWRmMTY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0NvbmZpZ3VyYXRpb25FZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkNvbmZpZ1ZpZXdQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQ29uZmlndXJhdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uQ2xvc3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotCi0KLS8qKgotICogVGhlIE1ldGhvZCBDb25maWd1cmF0aW9uIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkVkaXRvciBleHRlbmRzIE1ldGhvZEVsZW1lbnRFZGl0b3IgewotCi0JLyoqCi0JICogVGhlIGVkaXRvciBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfSUQgPSBDb25maWd1cmF0aW9uRWRpdG9yLmNsYXNzLmdldE5hbWUoKTsKLQotCUNvbmZpZ3VyYXRpb25QYWdlIGNvbmZpZ1BhZ2UgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkVkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBlZGl0b3IuCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuICgoQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KSBzdXBlci5nZXRFZGl0b3JJbnB1dCgpKQotCQkJCS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvciNhZGRQYWdlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXRyeSB7Ci0JCQlhZGRQYWdlKG5ldyBDb25maWd1cmF0aW9uRGVzY3JpcHRpb24odGhpcykpOwotCQkJY29uZmlnUGFnZSA9IG5ldyBDb25maWd1cmF0aW9uUGFnZSh0aGlzKTsKLQkJCWFkZFBhZ2UoY29uZmlnUGFnZSk7Ci0JCQlhZGRQYWdlKG5ldyBDb25maWdWaWV3UGFnZSh0aGlzKSk7Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY2xvc3VyZSBmb3IgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBjbG9zdXJlCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25DbG9zdXJlIGdldENsb3N1cmUoKSB7Ci0JCXJldHVybiBjb25maWdQYWdlLmdldENsb3N1cmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2NyZWF0ZUlucHV0KG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IGNyZWF0ZUlucHV0KE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZihlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIExpc3Qgc2V0Rm9jdXNMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCi0JLyoqCi0JICogQWRkIGdpdmVuIGxpc3RlbmVyIHRvIGxpc3Qgb2YgZm9jdXMgbGlzdGVuZXJzCi0JICogQHBhcmFtIGxpcwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRvU2V0Rm9jdXNMaXNlbmVycyhMaXN0ZW5lciBsaXMpIHsKLQkJc2V0Rm9jdXNMaXN0ZW5lcnMuYWRkKGxpcyk7Ci0JfQotCQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I3NldEZvY3VzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsgICAgCQotICAgIAlFdmVudCBlID0gbmV3IEV2ZW50KCk7Ci0gICAgCWUuZGF0YSA9IGdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOyAgIAkKLSAgICAJZm9yIChpbnQgaT0wOyBpPHNldEZvY3VzTGlzdGVuZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgCQlMaXN0ZW5lciBsaXMgPSAoTGlzdGVuZXIpIHNldEZvY3VzTGlzdGVuZXJzLmdldChpKTsKLSAgICAJCWxpcy5oYW5kbGVFdmVudChlKTsKLSAgICAJfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQ29uZmlndXJhdGlvbkVkaXRvcklucHV0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Db25maWd1cmF0aW9uRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGM5YTAzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Db25maWd1cmF0aW9uRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuRGlhZ3JhbVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotCi0vKioKLSAqIEFuIGVkaXRvciBpbnB1dCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gZWRpdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQgZXh0ZW5kcyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBjb25maWcKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCS8vIG1ldGhvZENvbmZpZ3VyYXRpb24gPSBjb25maWc7Ci0JCXN1cGVyKGNvbmZpZyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIHJldHVybiBtZXRob2RDb25maWd1cmF0aW9uOwotCQlyZXR1cm4gKE1ldGhvZENvbmZpZ3VyYXRpb24pIHN1cGVyLmdldE1ldGhvZEVsZW1lbnQoKTsKLQl9Ci0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFRvb2xUaXBUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gRGlhZ3JhbVVJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dF9jb25maWdlZGl0b3IwOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvRWRpdG9yQ2hvb3Nlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvRWRpdG9yQ2hvb3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMGVjMDcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0VkaXRvckNob29zZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UuRGlhZ25vc3RpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5WaWV3SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBMYXVuY2hlcyBhIE1ldGhvZCBlZGl0b3IgdGhhdCBpcyBhcHByb3ByaWF0ZSBmb3IgYSBnaXZlbiBtZXRob2QgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yQ2hvb3NlciBpbXBsZW1lbnRzIElFZGl0b3JLZWVwZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgRWRpdG9yQ2hvb3NlciBzaW5nbGV0b24gPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWRpdG9yQ2hvb3NlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKHNpbmdsZXRvbiA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKEVkaXRvckNob29zZXIuY2xhc3MpIHsKLQkJCQlpZiAoc2luZ2xldG9uID09IG51bGwpIHsKLQkJCQkJc2luZ2xldG9uID0gbmV3IEVkaXRvckNob29zZXIoKTsKLQkJCQkJSUVkaXRvcktlZXBlci5SRUZFUkVOQ0Uuc2V0RWRpdG9yS2VlcGVyKHNpbmdsZXRvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgdGhlIHJlc3BlY3RpdmUgZWRpdG9yIGRlcGVuZGluZyBvbiB0aGUgZ2l2ZW4gTWV0aG9kIGVsZW1lbnQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIEEgTWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgb3BlbkVkaXRvcihPYmplY3Qgb2JqKSB7Ci0JCXRyeSB7Ci0JCQlvYmogPSBWaWV3SGVscGVyLmhhbmRsZURhbmdsaW5nKG9iaik7Ci0JCQlpZiAob2JqID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlvYmogPSBMaWJyYXJ5VXRpbC51bndyYXAob2JqKTsKLQotCQkJQXJyYXlMaXN0IGVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJUmVzb3VyY2UgcmVzID0gKChFT2JqZWN0KSBvYmopLmVSZXNvdXJjZSgpOwotCQkJCWlmIChyZXMgIT0gbnVsbCAmJiAhcmVzLmdldEVycm9ycygpLmlzRW1wdHkoKSkgewotCQkJCQllcnJvcnMuYWRkQWxsKHJlcy5nZXRFcnJvcnMoKSk7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQkJUmVzb3VyY2UgcHJlc1JlcyA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmopCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpOwotCQkJCQlpZiAocHJlc1JlcyAhPSBudWxsICYmICFwcmVzUmVzLmdldEVycm9ycygpLmlzRW1wdHkoKSkgewotCQkJCQkJZXJyb3JzLmFkZEFsbChwcmVzUmVzLmdldEVycm9ycygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWVycm9ycy5pc0VtcHR5KCkpIHsKLQkJCQkJZmluYWwgTXVsdGlTdGF0dXMgbXVsdGlTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoCi0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksCi0JCQkJCQkJMCwKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5FZGl0b3JDaG9vc2VyX1Jlc291cmNlc0Vycm9yLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlEaWFnbm9zdGljIGUgPSAoRGlhZ25vc3RpYykgaXRlci5uZXh0KCk7Ci0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLAotCQkJCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAwLCBlCi0JCQkJCQkJCQkJLmdldE1lc3NhZ2UoKSwgbnVsbCk7Ci0JCQkJCQltdWx0aVN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJaWYgKEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkVkaXRvckNob29zZXJfbG9hZGRFcnJvckRsZ1RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWRpdG9yQ2hvb3Nlcl9SZXNvdXJjZXNFcnJvciwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCW11bHRpU3RhdHVzKSA9PSBEaWFsb2cuQ0FOQ0VMKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICgob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHx8IChvYmogaW5zdGFuY2VvZiBSb2xlKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgVGFzaykgfHwgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHx8IChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgRG9tYWluKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgUm9sZVNldCkgfHwgKG9iaiBpbnN0YW5jZW9mIFRvb2wpCi0JCQkJCXx8IChvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpCi0JCQkJCXx8IChvYmogaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSkgewotCQkJCW9wZW5FZGl0b3IoKE1ldGhvZEVsZW1lbnQpIG9iaiwgTWV0aG9kRWxlbWVudEVkaXRvci5FRElUT1JfSUQpOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCUN1c3RvbUNhdGVnb3J5IGN1c3RDYXQgPSAoQ3VzdG9tQ2F0ZWdvcnkpIG9iajsKLQkJCQlpZihUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KGN1c3RDYXQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJb3BlbkVkaXRvcigoTWV0aG9kRWxlbWVudCkgb2JqLCBNZXRob2RFbGVtZW50RWRpdG9yLkVESVRPUl9JRCk7Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlvcGVuRWRpdG9yKChNZXRob2RFbGVtZW50KSBvYmosIFByb2Nlc3NFZGl0b3IuRURJVE9SX0lEKTsKLQotCQkJCS8vIG9wZW4gcHJvcGVydGllcyB2aWV3IGJ5IGRlZmF1bHQgd2hlbiB3ZSBvcGVuIFByb2Nlc3MgRWRpdG9yCi0JCQkJdHJ5IHsKLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCS5nZXRBY3RpdmVQYWdlKCkuc2hvd1ZpZXcoCi0JCQkJCQkJCQkib3JnLmVjbGlwc2UudWkudmlld3MuUHJvcGVydHlTaGVldCIsIG51bGwsIElXb3JrYmVuY2hQYWdlLlZJRVdfVklTSUJMRSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJCWV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJT2JqZWN0IGNvbnRhaW5lciA9ICgoUHJvY2Vzcykgb2JqKS5lQ29udGFpbmVyKCk7Ci0JCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJb3BlbkVkaXRvcigoTWV0aG9kRWxlbWVudCkgY29udGFpbmVyLAotCQkJCQkJCVByb2Nlc3NFZGl0b3IuRURJVE9SX0lEKTsKLQkJCQl9Ci0JCQl9ZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCW9wZW5FZGl0b3IoKE1ldGhvZENvbmZpZ3VyYXRpb24pIG9iaiwKLQkJCQkJCUNvbmZpZ3VyYXRpb25FZGl0b3IuRURJVE9SX0lEKTsKLQkJCX1lbHNlIGlmKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpewotCQkJCVByb2Nlc3MgcHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudClvYmopOwotCQkJCU9iamVjdCBjb250YWluZXIgPSBwcm9jZXNzLmVDb250YWluZXIoKTsKLQkJCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlvcGVuRWRpdG9yKChNZXRob2RFbGVtZW50KSBjb250YWluZXIsCi0JCQkJCQkJUHJvY2Vzc0VkaXRvci5FRElUT1JfSUQpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCXQucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX21lc3NhZ2U7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyByZWFzb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uOyAvLyROT04tTkxTLTEkCi0JCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpOwotCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgcmVhc29uLCB0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoZSBDb25maWd1cmF0aW9uIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIGVkaXRvcklkCi0JICovCi0JcHJpdmF0ZSB2b2lkIG9wZW5FZGl0b3IoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBlZGl0b3JJZCkKLQkJCXRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQoCi0JCQkJY29uZmlnKTsKLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKAotCQkJCQkJZWRpdG9ySW5wdXQsIGVkaXRvcklkKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGUgTWV0aG9kIGVkaXRvciBmb3IgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBBIE1ldGhvZCBlbGVtZW50LgotCSAqIEBwYXJhbSBlZGl0b3JJZAotCSAqICAgICAgICAgICAgVGhlIGVkaXRvciBJRC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcihNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBlZGl0b3JJZCkKLQkJCXRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQoCi0JCQkJZWxlbWVudCk7Ci0JCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkub3BlbkVkaXRvcigKLQkJCQkJCWVkaXRvcklucHV0LCBlZGl0b3JJZCk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0cyAoYnJpbmdzIHRvIGZyb250LCBidXQgZG9lcyBub3QgZ2l2ZSBmb2N1cykgdGhlIE1ldGhvZCBlZGl0b3IgZm9yCi0JICogdGhlIGdpdmVuIG9iamVjdC4gSWYgdGhlcmUgaXMgbm8gb3BlbiBlZGl0b3IgZm9yIHRoZSBvYmplY3QsIGRvZXMKLQkgKiBub3RoaW5nLgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3RFZGl0b3IoT2JqZWN0IG9iaikgewotCQl0cnkgewotCQkJb2JqID0gVmlld0hlbHBlci5oYW5kbGVEYW5nbGluZyhvYmopOwotCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCW9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChvYmopOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikKLQkJCWVkaXRvcklucHV0ID0gbmV3IENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCgKLQkJCQkJKE1ldGhvZENvbmZpZ3VyYXRpb24pIG9iaik7Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpCi0JCQllZGl0b3JJbnB1dCA9IG5ldyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQoKE1ldGhvZEVsZW1lbnQpIG9iaik7Ci0JCWlmIChlZGl0b3JJbnB1dCAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gcGFnZS5maW5kRWRpdG9yKGVkaXRvcklucHV0KTsKLQkJCWlmIChlZGl0b3JQYXJ0ICE9IG51bGwpCi0JCQkJcGFnZS5icmluZ1RvVG9wKGVkaXRvclBhcnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogUmV0dXJucyBzZWxlY3RlZCBlZGl0b3IgaW5wdXQKLQkgKiBAcmV0dXJuIFRoZSBvYmplY3Qgd2hpY2ggdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlZGl0b3IgaXMgZWRpdGluZyAob3IKLQkgKiAgICAgICAgIG51bGwpLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U2VsZWN0ZWRFZGl0b3JJbnB1dCgpIHsKLQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCWlmIChlZGl0b3JQYXJ0ICE9IG51bGwpIHsKLQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkKLQkJCQlyZXR1cm4gKChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KQotCQkJCQkJLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkKLQkJCQlyZXR1cm4gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KQotCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIE1ldGhvZCBlZGl0b3IgZm9yIHRoZSBnaXZlbiBNZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBBIE1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlRWRpdG9yKE9iamVjdCBvYmopIHsKLQkJdHJ5IHsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IGZpbmRFZGl0b3Iob2JqKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCQkJLmNsb3NlRWRpdG9yKGVkaXRvciwgZmFsc2UpOwotCQkJfQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElFZGl0b3JQYXJ0IGZpbmRFZGl0b3IoT2JqZWN0IG9iaikgewotCQl0cnkgewotCQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gbmV3IE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCgKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaik7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5maW5kRWRpdG9yKAotCQkJCQkJCWVkaXRvcklucHV0KTsKLQkJCXJldHVybiBlZGl0b3I7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGxpc3Qgb2YgZGlydHkgZWRpdG9ycyBmb3IgdGhlIGdpdmVuIGVsZW1lbnRzCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHJldHVybglMaXN0IG9mIGRpcnR5IGVkaXRvcgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzV2l0aERpcnR5RWRpdG9yKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJLy8gQXJyYXlMaXN0IGNsb3NlRWRpdG9yUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciAhPSBudWxsICYmIGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJCQllbGVtZW50ID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgewotCQkJCQllbGVtZW50ID0gKChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGUgPT0gZWxlbWVudCB8fCBVbWFVdGlsLmlzQ29udGFpbmVkQnkoZWxlbWVudCwgZSkpIHsKLQkJCQkJCQlyZXN1bHQuYWRkKGVsZW1lbnQpOwotCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENsb3NlcyB0aGUgYWxsIG9wZW4gTWV0aG9kIGVkaXRvcnMgb2ZvciB0aGUgZ2l2ZW4gKGRlbGV0ZWQpIGVsZW1lbnQgYW5kCi0JICogYWxsIG9mIGl0cyBjaGlsZHJlbiBhbmQgZ3JhbmQgY2hpbGRyZW4uCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIHRoZSBkZWxldGVkIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZUVkaXRvcnNPbkRlbGV0aW9uKE9iamVjdCBlKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlBcnJheUxpc3QgY2xvc2VFZGl0b3JSZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJCQllbGVtZW50ID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgewotCQkJCQllbGVtZW50ID0gKChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50ICE9IG51bGwKLQkJCQkJCSYmIChlbGVtZW50LmVDb250YWluZXIoKSA9PSBudWxsIHx8IFVtYVV0aWwKLQkJCQkJCQkJLmlzQ29udGFpbmVkQnkoZWxlbWVudCwgZSkpKSB7Ci0JCQkJCWNsb3NlRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaW50IHNpemUgPSBjbG9zZUVkaXRvclJlZnMuc2l6ZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IG5ldyBJRWRpdG9yUmVmZXJlbmNlW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVmZXJlbmNlc1tpXSA9IChJRWRpdG9yUmVmZXJlbmNlKSBjbG9zZUVkaXRvclJlZnMuZ2V0KGkpOwotCQl9Ci0JCXdvcmtiZW5jaFBhZ2UuY2xvc2VFZGl0b3JzKHJlZmVyZW5jZXMsIGZhbHNlKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9HcmFwaGljYWxXUERlcGVuZGVuY3lFZGl0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0dyYXBoaWNhbFdQRGVwZW5kZW5jeUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZDY2ZGU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0dyYXBoaWNhbFdQRGVwZW5kZW5jeUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LldQRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5Db21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5Db25uZWN0aW9uQ3JlYXRpb25Ub29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuTWFycXVlZVRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYW5uaW5nU2VsZWN0aW9uVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkdFRkFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLQotCi0vKioKLSAqIEFuIGVkaXRvciBmb3IgZ3JhcGhpY2FsIHdvcmsgcHJvZHVjdCBkZXBlbmVkZW5jeSBkaWFncmFtCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wIAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhpY2FsV1BEZXBlbmRlbmN5RWRpdG9yIGV4dGVuZHMgQWJzdHJhY3REaWFncmFtRWRpdG9yIHsKLQotCXByaXZhdGUgQ3JlYXRpb25GYWN0b3J5IHdwTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQotLy8JcHJpdmF0ZSBJUHJvcGVydHlTaGVldEVudHJ5IHJvb3RFbnRyeTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfV1BfTk9ERSA9ICJjcmVhdGVfd29ya3Byb2R1Y3RfZGVzY3JpcHRvcl9ub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgR3JhcGhpY2FsV1BEZXBlbmRlbmN5RWRpdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDcmVhdGlvbkZhY3RvcmllcygpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUNyZWF0aW9uRmFjdG9yaWVzKCk7Ci0KLQkJaWYgKHdwTm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQl3cE5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQlXb3JrUHJvZHVjdE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3ROb2RlKCk7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlub2RlLnNldFVNQURpYWdyYW0oZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCk7Ci0JCQkJCW5vZGUuc2V0RGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJbm9kZS5zZXRPYmplY3Qod3BkKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCi0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5XT1JLX1BST0RVQ1Q7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlDcmVhdGlvbkZhY3RvcnkgY3JlYXRpb25GYWN0b3J5ID0gd3BOb2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVRvQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvQ29udGV4dE1lbnUobWVudSk7Ci0KLQkJYm9vbGVhbiBjYW5Nb2RpZnkgPSAhaXNSZWFkT25seSgpOwotCi0JCS8vIElBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oUFJPUEVSVElFU19QQUdFKTsKLQkJLy8gaWYoYWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCS8vIG1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQkvLyB9Ci0JCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX1dQX05PREUpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQlzdXBlci5jcmVhdGVBY3Rpb25zKCk7Ci0JCS8vIEFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0QWN0aW9uUmVnaXN0cnkoKTsKLQkJLy8gSUFjdGlvbiBhY3Rpb247Ci0JCS8vCi0JCS8vIGFjdGlvbiA9IG5ldyBBY3Rpb24oIlNob3cgJlByb3BlcnRpZXMgVmlldyIpIHsKLQkJLy8gcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJLy8gcmV0dXJuIFBST1BFUlRJRVNfUEFHRTsKLQkJLy8gfQotCQkvLyBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCS8vIHRyeSB7Ci0JCS8vCi0JCS8vIGdldFNpdGUoKS5nZXRQYWdlKCkuc2hvd1ZpZXcoCi0JCS8vICJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7Ci0JCS8vIC8vIHNldElkKCJTaG93X1Byb3BlcnRpZXMiKTsKLQkJLy8gfQotCQkvLyBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCS8vIC8vQXV0aG9yaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleGNlcHRpb24pOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkvLyBMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCS8vIHJldHVybiAoZWRpdFBhcnRzLnNpemUoKSA9PSAxICYmIGVkaXRQYXJ0cy5nZXQoMCkgaW5zdGFuY2VvZgotCQkvLyBFZGl0UGFydCk7Ci0JCS8vIH0KLQkJLy8gfTsKLQkJLy8JCQotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCUlBY3Rpb24gYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dCwgd3BOb2RlQ3JlYXRpb25GYWN0b3J5LCAvLyROT04tTkxTLTEkCi0JCQkJQ1JFQVRFX1dQX05PREUsCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcCwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCX0KLQotCXByb3RlY3RlZCBQYWxldHRlQ29udGFpbmVyIGNyZWF0ZUNvbnRyb2xHcm91cChQYWxldHRlUm9vdCByb290KSB7Ci0JCWluaXRpYWxpemVDcmVhdGlvbkZhY3RvcmllcygpOwotCQlQYWxldHRlR3JvdXAgY29udHJvbEdyb3VwID0gbmV3IFBhbGV0dGVHcm91cCgiQ29udHJvbCBHcm91cCIpOyAvLyROT04tTkxTLTEkCi0KLQkJTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVRvb2xFbnRyeSB0b29sID0gbmV3IFBhbm5pbmdTZWxlY3Rpb25Ub29sRW50cnkoRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dCwgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3Rvb2x0aXAKLQkJKTsKLQkJdG9vbC5zZXRTbWFsbEljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkic2VsZWN0X3BhbDE2LmdpZiIpKTsKLQkJdG9vbC5zZXRMYXJnZUljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkic2VsZWN0X3BhbDI0LmdpZiIpKTsKLQkJZW50cmllcy5hZGQodG9vbCk7Ci0JCXJvb3Quc2V0RGVmYXVsdEVudHJ5KHRvb2wpOwotCi0JCXRvb2wgPSBuZXcgTWFycXVlZVRvb2xFbnRyeSgpOwotCQl0b29sLnNldFNtYWxsSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJtYXJxX3BhbDE2LmdpZiIpKTsKLQkJdG9vbC5zZXRMYXJnZUljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkibWFycV9wYWwyNC5naWYiKSk7Ci0JCWVudHJpZXMuYWRkKHRvb2wpOwotCi0JCXRvb2wgPSBuZXcgQ29ubmVjdGlvbkNyZWF0aW9uVG9vbEVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fTGlua190ZXh0LCBEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0xpbmtfdG9vbHRpcCwgCi0JCQkJbnVsbCwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJsaW5rX3BhbDE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJsaW5rX3BhbDI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZCh0b29sKTsKLQkJQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkgY29tYmluZWQgPSBuZXcgQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkoCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90ZXh0LCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwLCAvLyROT04tTkxTLTEkCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuRlJFRV9URVhULCBmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZyZWV0ZXh0X3BhbDE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmcmVldGV4dF9wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCVBhbGV0dGVTZXBhcmF0b3Igc2VwID0gbmV3IFBhbGV0dGVTZXBhcmF0b3IoCi0JCQkJR3JhcGhpY2FsV1BEZXBlbmRlbmN5RWRpdG9yLmNsYXNzLmdldE5hbWUoKSArICJzZXAxIik7IC8vJE5PTi1OTFMtMSQKLQkJc2VwCi0JCQkJLnNldFVzZXJNb2RpZmljYXRpb25QZXJtaXNzaW9uKFBhbGV0dGVFbnRyeS5QRVJNSVNTSU9OX05PX01PRElGSUNBVElPTik7Ci0JCWVudHJpZXMuYWRkKHNlcCk7IC8vJE5PTi1OTFMtMSQKLQotCQljb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0LCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcCwgLy8kTk9OLU5MUy0xJAotCQkJCVRlbXBsYXRlQ29uc3RhbnRzLldPUktfUFJPRFVDVCwgd3BOb2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZChjb21iaW5lZCk7Ci0JCWNvbnRyb2xHcm91cC5hZGRBbGwoZW50cmllcyk7Ci0JCXJldHVybiBjb250cm9sR3JvdXA7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXRQYXJ0RmFjdG9yeSBjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgV1BEaWFncmFtRWRpdFBhcnRGYWN0b3J5KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjcmVhdGVEaWFncmFtRWRpdFBhcnQoKQotCSAqLwotCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVEaWFncmFtRWRpdFBhcnQoKSB7Ci0JCSBEaWFncmFtRWRpdFBhcnQgZWRpdFBhcnQgPSBuZXcgRGlhZ3JhbUVkaXRQYXJ0KE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpKTsKLQkJIGVkaXRQYXJ0Lm1hcmtEaXJ0eSh0cnVlKTsKLQkJIHJldHVybiBlZGl0UGFydDsKLQl9Ci0JCi0vLwlwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IGUpIHsKLS8vCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIGRpYWdyYW0gPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0vLwkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpOwotLy8JCWRpYWdyYW0uc2V0T2JqZWN0KGUpOwotLy8JCUVkaXRQYXJ0IHBhcnQgPSBuZXcgRGlhZ3JhbUVkaXRQYXJ0KGRpYWdyYW0pOwotLy8JCXBhcnQuc2V0TW9kZWwoZGlhZ3JhbSk7Ci0vLwkJZGlhZ3JhbS5hZGRDb25zdW1lcih0aGlzKTsKLS8vCQlyZXR1cm4gcGFydDsKLS8vCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydE5hbWVQcmVmaXgoKSB7Ci0JCXJldHVybiBEaWFncmFtVUlSZXNvdXJjZXMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV9wcmVmaXg7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBbiBlZGl0b3IgaW5wdXQgCi0JICoKLQkgKgotCSAqLwotCS8qKgotCSAqIEBhdXRob3Igc2hpbHBhdAotCSAqCi0JICovCi0JcHVibGljIGNsYXNzIEVkaXRvcklucHV0IGltcGxlbWVudHMgSUVkaXRvcklucHV0IHsKLQotCQkvKioKLQkJICogQHBhcmFtIGUKLQkJICovCi0JCXB1YmxpYyBFZGl0b3JJbnB1dChNZXRob2RFbGVtZW50IGUpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNleGlzdHMoKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldEltYWdlRGVzY3JpcHRvcigpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldE5hbWUoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0UGVyc2lzdGFibGUoKQotCQkgKi8KLQkJcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRUb29sVGlwVGV4dCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyB0eXBlKSB7Ci0JCQkvLyBpZiAodHlwZS5lcXVhbHMoSVByb3BlcnR5U2hlZXRQYWdlLmNsYXNzKSkgewotCQkJLy8gcmV0dXJuIGdldFByb3BlcnR5U2hlZXRQYWdlKCk7Ci0JCQkvLyB9ZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotLy8JCXByaXZhdGUgT2JqZWN0IGdldFByb3BlcnR5U2hlZXRQYWdlKCkgewotLy8KLS8vCQkJaWYgKHJvb3RFbnRyeSA9PSBudWxsKSB7Ci0vLwkJCQkvLyBjcmVhdGUgYSBuZXcgcm9vdAotLy8JCQkJUHJvcGVydHlTaGVldEVudHJ5IHJvb3QgPSBuZXcgUHJvcGVydHlTaGVldEVudHJ5KCk7Ci0vLwkJCQlyb290RW50cnkgPSByb290OwotLy8JCQl9Ci0vLwkJCWlmIChyb290RW50cnkgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0RW50cnkpIHsKLS8vCQkJCS8vID0gd3BFZGl0UGFydC5nZXRWaWV3ZXIoKTsKLS8vCQkJCS8vIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG5ldwotLy8JCQkJLy8gQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoV1ApOwotLy8JCQkJLy8gKChQcm9wZXJ0eVNoZWV0RW50cnkpIHJvb3RFbnRyeSkuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcigpOwotLy8JCQl9Ci0vLwkJCXJldHVybiByb290RW50cnk7Ci0vLwkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9HcmFwaGljYWxXb3JrZmxvd0VkaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzgxYjNkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9HcmFwaGljYWxXb3JrZmxvd0VkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQWN0aXZpdHlEaWFncmFtRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuRGlhZ3JhbVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVGVtcGxhdGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLkNvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLkNvbm5lY3Rpb25DcmVhdGlvblRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5NYXJxdWVlVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbm5pbmdTZWxlY3Rpb25Ub29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuR0VGQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEFuIGVkaXRvciBmb3IgZ3JhcGhpY2FsIHdvcmtmbG93Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaGljYWxXb3JrZmxvd0VkaXRvciBleHRlbmRzIEFic3RyYWN0RGlhZ3JhbUVkaXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9XT1JLRkxPV19ERVRBSUxfRElBR1JBTSA9ICJvcGVuX3dvcmtmbG93X2RldGFpbF9kaWFncmFtIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9TVEFSVF9OT0RFID0gImNyZWF0ZV9zdGFydF9ub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9FTkRfTk9ERSA9ICJjcmVhdGVfZW5kX25vZGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX1NZTkNfQkFSID0gImNyZWF0ZV9zeW5jX2JhciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfREVDSVNJT05fQkFSID0gImNyZWF0ZV9kZWNpc2lvbl9iYXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0FDVElWSVRZID0gImNyZWF0ZV9hY3Rpdml0eSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfUEhBU0UgPSAiY3JlYXRlX3BoYXNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9JVEVSQVRJT04gPSAiY3JlYXRlX2l0ZXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfVEFTS19ERVNDUklQVE9SID0gImNyZWF0ZV90YXNrX2Rlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSBhY3Rpdml0eU5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSBwaGFzZU5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSBpdGVyYXRpb25Ob2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3Rvcnkgc3luY2hCYXJDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSBkZWNpc2lvbk5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSBzdGFydE5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSBlbmROb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3RvcnkgdGFza0Rlc2NyaXB0b3JOb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlCi0JICovCi0JcHVibGljIEdyYXBoaWNhbFdvcmtmbG93RWRpdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDcmVhdGlvbkZhY3RvcmllcygpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUNyZWF0aW9uRmFjdG9yaWVzKCk7Ci0KLQkJaWYgKGFjdGl2aXR5Tm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkJYWN0aXZpdHlOb2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQkvLyBBY3Rpdml0eU5vZGUgbm9kZSA9Ci0JCQkJCS8vIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHlOb2RlKCk7Ci0JCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKTsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCW5vZGUuc2V0VU1BRGlhZ3JhbShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCQkJCW5vZGUuc2V0RGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLkFDVElWSVRZOwotCQkJCX0KLQotCQkJfTsKLQkJQ3JlYXRpb25GYWN0b3J5IGNyZWF0aW9uRmFjdG9yeSA9IGFjdGl2aXR5Tm9kZUNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQotCQlpZiAocGhhc2VOb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCQlwaGFzZU5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCS8vIEFjdGl2aXR5Tm9kZSBub2RlID0KLQkJCQkJLy8gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eU5vZGUoKTsKLQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpOwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJbm9kZS5zZXRVTUFEaWFncmFtKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQkJbm9kZS5zZXREaWFncmFtKGRpYWdyYW0pOwotCQkJCQlub2RlLnNldE9iamVjdChVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQaGFzZSgpKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCQkJCQlyZXR1cm4gVGVtcGxhdGVDb25zdGFudHMuUEhBU0U7Ci0JCQkJfQotCi0JCQl9OwotCQljcmVhdGlvbkZhY3RvcnkgPSBwaGFzZU5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQkJaWYgKGl0ZXJhdGlvbk5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJCWl0ZXJhdGlvbk5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCS8vIEFjdGl2aXR5Tm9kZSBub2RlID0KLQkJCQkJLy8gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eU5vZGUoKTsKLQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpOwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJbm9kZS5zZXRVTUFEaWFncmFtKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQkJbm9kZS5zZXREaWFncmFtKGRpYWdyYW0pOwotCQkJCQlub2RlLnNldE9iamVjdChVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJdGVyYXRpb24oKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLklURVJBVElPTjsKLQkJCQl9Ci0KLQkJCX07Ci0JCWNyZWF0aW9uRmFjdG9yeSA9IGl0ZXJhdGlvbk5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQkJaWYgKHN5bmNoQmFyQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCQlzeW5jaEJhckNyZWF0aW9uRmFjdG9yeSA9IG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpIHsKLQkJCQkJVHlwZWROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVR5cGVkTm9kZSgpOwotCQkJCQlub2RlLnNldFR5cGUoVHlwZWROb2RlLlNZTkNIX0JBUik7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkubmV3VHlwZWRHcmFwaE5vZGUoVHlwZWROb2RlLlNZTkNIX0JBUikpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5TWU5DSF9CQVI7Ci0JCQkJfQotCi0JCQl9OwotCQljcmVhdGlvbkZhY3RvcnkgPSBzeW5jaEJhckNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQotCQlpZiAoZGVjaXNpb25Ob2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCQlkZWNpc2lvbk5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCVR5cGVkTm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUeXBlZE5vZGUoKTsKLQkJCQkJbm9kZS5zZXRUeXBlKFR5cGVkTm9kZS5ERUNJU0lPTik7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkubmV3VHlwZWRHcmFwaE5vZGUoVHlwZWROb2RlLkRFQ0lTSU9OKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLkRFQ0lTSU9OX05PREU7Ci0JCQkJfQotCi0JCQl9OwotCQljcmVhdGlvbkZhY3RvcnkgPSBkZWNpc2lvbk5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQkJaWYgKHN0YXJ0Tm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkJc3RhcnROb2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQlUeXBlZE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHlwZWROb2RlKCk7Ci0JCQkJCW5vZGUuc2V0VHlwZShUeXBlZE5vZGUuU1RBUlQpOwotCQkJCQlub2RlLnNldE9iamVjdChHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJLm5ld1R5cGVkR3JhcGhOb2RlKFR5cGVkTm9kZS5TVEFSVCkpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5TVEFSVF9OT0RFOwotCQkJCX0KLQotCQkJfTsKLQkJY3JlYXRpb25GYWN0b3J5ID0gc3RhcnROb2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCi0JCWlmIChlbmROb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCQllbmROb2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQlUeXBlZE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHlwZWROb2RlKCk7Ci0JCQkJCW5vZGUuc2V0VHlwZShUeXBlZE5vZGUuRU5EKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCS5uZXdUeXBlZEdyYXBoTm9kZShUeXBlZE5vZGUuRU5EKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLkVORF9OT0RFOwotCQkJCX0KLQotCQkJfTsKLQkJY3JlYXRpb25GYWN0b3J5ID0gZW5kTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQotCQlpZiAodGFza0Rlc2NyaXB0b3JOb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCQl0YXNrRGVzY3JpcHRvck5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKTsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCW5vZGUuc2V0VU1BRGlhZ3JhbShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCQkJCW5vZGUuc2V0RGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza0Rlc2NyaXB0b3IoKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLlRBU0tfREVTQ1JJUFRPUjsKLQkJCQl9Ci0KLQkJCX07Ci0JCWNyZWF0aW9uRmFjdG9yeSA9IHRhc2tEZXNjcmlwdG9yTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlVG9Db250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5jb250cmlidXRlVG9Db250ZXh0TWVudShtZW51KTsKLQotCQlib29sZWFuIGNhbk1vZGlmeSA9ICFpc1JlYWRPbmx5KCk7Ci0KLQkJbWVudS5pbnNlcnRBZnRlcihHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBuZXcgU2VwYXJhdG9yKAotCQkJCUdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQotCQlJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCU9QRU5fV09SS0ZMT1dfREVUQUlMX0RJQUdSQU0pOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJfQotCQltZW51Lmluc2VydEFmdGVyKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIG5ldyBTZXBhcmF0b3IoCi0JCQkJR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCi0JCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9TVEFSVF9OT0RFKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQl9Ci0KLQkJLy8gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0ZSRUVfVEVYVCk7Ci0JCS8vIGlmKGFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkvLyBtZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJLy8gfQotCi0JCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9TWU5DX0JBUik7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJfQotCi0JCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9ERUNJU0lPTl9CQVIpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQotCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfRU5EX05PREUpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQkJbWVudS5pbnNlcnRBZnRlcihHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBuZXcgU2VwYXJhdG9yKAotCQkJCUdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQotCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfQUNUSVZJVFkpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0lURVJBVElPTik7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJfQotCi0JCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9QSEFTRSk7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJfQotCi0JCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9UQVNLX0RFU0NSSVBUT1IpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQlzdXBlci5jcmVhdGVBY3Rpb25zKCk7Ci0KLQkJLy8gT3BlbiB3b3JrZmxvdyBkZXRhaWwgYWN0aW9uCi0JCS8vCi0JCUlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBPUEVOX1dPUktGTE9XX0RFVEFJTF9ESUFHUkFNOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUVkaXRQYXJ0IHNlbGVjdGVkRWRpdFBhcnQgPSAoRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJCS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLmdldCgwKTsKLQkJCQkJCUlFZGl0b3JQYXJ0IHBhcmVudCA9IGdldFNpdGUoKS5nZXRQYWdlKCkKLQkJCQkJCQkJLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5FZGl0b3JJbnB1dCgKLQkJCQkJCQkJKE1ldGhvZEVsZW1lbnQpICgoTm9kZSkgc2VsZWN0ZWRFZGl0UGFydAotCQkJCQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRPYmplY3QoKSwKLQkJCQkJCQkJKChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpKQotCQkJCQkJCQkJCS5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQkJCUlFZGl0b3JQYXJ0IHBhcnQgPSBnZXRTaXRlKCkKLQkJCQkJCQkJLmdldFBhZ2UoKQotCQkJCQkJCQkub3BlbkVkaXRvcigKLQkJCQkJCQkJCQlpbnB1dCwKLQkJCQkJCQkJCQlQcm9jZXNzRWRpdG9yLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX0VESVRPUl9JRCk7Ci0JCQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCQkJCUFic3RyYWN0RGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoQWJzdHJhY3REaWFncmFtRWRpdG9yKSBwYXJ0OwotCQkJCQkJCWVkaXRvci5zZXRQYXJlbnRFZGl0b3IocGFyZW50KTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgIT0gMSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDApOwotCQkJCXJldHVybiAoZWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSAmJiAoKExpbmtlZE9iamVjdCkgZWRpdFBhcnQKLQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KTsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCS8vIElBY3Rpb24gc3RhcnROb2RlQWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMuCi0JCS8vIGdldFN0cmluZygiRGlhZ3JhbVVJLkFjdGl2aXR5RGlhZ3JhbS5TdGFydE5vZGUudGV4dCIpKXsgLy8kTk9OLU5MUy0xJAotCQkvLwkJCQotCQkvLyBwdWJsaWMgdm9pZCBydW4oKXsKLQkJLy8gQ3JlYXRlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IENyZWF0ZVJlcXVlc3QoKTsKLQkJLy8gLy9DcmVhdGlvbkZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkodGVtcGxhdGUpOwotCQkvLyBpZiAoc3RhcnROb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCS8vIHJldHVybjsKLQkJLy8gcmVxdWVzdC5zZXRGYWN0b3J5KHN0YXJ0Tm9kZUNyZWF0aW9uRmFjdG9yeSk7Ci0JCS8vIHJlcXVlc3Quc2V0TG9jYXRpb24obmV3IFBvaW50KDEwLDEwKSk7Ci0JCS8vCQkJCQotCQkvLyBpZiAocmVxdWVzdC5nZXROZXdPYmplY3QoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJLy8gUG9pbnQgbG9jID0gcmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCQkvLyAvLygoR3JhcGhpY2FsRWRpdFBhcnQpZ2V0SG9zdCgpKS5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGxvYyk7Ci0JCS8vIERpYWdyYW0gcGFyZW50ID0gKERpYWdyYW0pZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJLy8gb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldwotCQkvLyBDcmVhdGVOb2RlQ29tbWFuZCgoTm9kZSlyZXF1ZXN0LmdldE5ld09iamVjdCgpLAotCQkvLyBwYXJlbnQsIGxvYyk7Ci0JCS8vIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBwdWJsaWMgU3RyaW5nIGdldElkKCl7Ci0JCS8vIHJldHVybiBDUkVBVEVfU1RBUlRfTk9ERTsKLQkJLy8gfQotCQkvLyBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKXsKLQkJLy8gcmV0dXJuIHRydWU7Ci0JCS8vIH0KLQkJLy8gcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJLy8gcmV0dXJuCi0JCS8vIERpYWdyYW1VSVJlc291cmNlcy5nZXRTdHJpbmcoIkRpYWdyYW1VSS5BY3Rpdml0eURpYWdyYW0uU3RhcnROb2RlLnRvb2x0aXAiKTsKLQkJLy8gfQotCQkvLwkJCQotCQkvLyB9OwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHN0YXJ0Tm9kZUFjdGlvbik7Ci0JCS8vCQkKLQkJLy8JCQotCQkvLyBJQWN0aW9uIGVuZE5vZGVBY3Rpb24gPSBuZXcgQWN0aW9uKERpYWdyYW1VSVJlc291cmNlcy4KLQkJLy8gZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWN0aXZpdHlEaWFncmFtLkVuZE5vZGUudGV4dCIpKXsgLy8kTk9OLU5MUy0xJAotCQkvLwkJCQotCQkvLyBwdWJsaWMgdm9pZCBydW4oKXsKLQkJLy8gQ3JlYXRlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IENyZWF0ZVJlcXVlc3QoKTsKLQkJLy8gaWYgKGVuZE5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJLy8gcmV0dXJuOwotCQkvLyByZXF1ZXN0LnNldEZhY3RvcnkoZW5kTm9kZUNyZWF0aW9uRmFjdG9yeSk7Ci0JCS8vIHJlcXVlc3Quc2V0TG9jYXRpb24obmV3IFBvaW50KDEwLDEwKSk7Ci0JCS8vCQkJCQotCQkvLyBpZiAocmVxdWVzdC5nZXROZXdPYmplY3QoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJLy8gUG9pbnQgbG9jID0gcmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCQkvLyBEaWFncmFtIHBhcmVudCA9IChEaWFncmFtKWVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCS8vIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcKLQkJLy8gQ3JlYXRlTm9kZUNvbW1hbmQoKE5vZGUpcmVxdWVzdC5nZXROZXdPYmplY3QoKSwKLQkJLy8gcGFyZW50LCBsb2MpOwotCQkvLyBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gcHVibGljIFN0cmluZyBnZXRJZCgpewotCQkvLyByZXR1cm4gQ1JFQVRFX0VORF9OT0RFOwotCQkvLyB9Ci0JCS8vIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpewotCQkvLyByZXR1cm4gdHJ1ZTsKLQkJLy8gfQotCQkvLyBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQkvLyByZXR1cm4KLQkJLy8gRGlhZ3JhbVVJUmVzb3VyY2VzLmdldFN0cmluZygiRGlhZ3JhbVVJLkFjdGl2aXR5RGlhZ3JhbS5FbmROb2RlLnRvb2x0aXAiKTsKLQkJLy8gfQotCQkvLyB9OwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGVuZE5vZGVBY3Rpb24pOwotCQkvLwkJCi0JCS8vIElBY3Rpb24gc3luY0JhckFjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLgotCQkvLyBnZXRTdHJpbmcoIkRpYWdyYW1VSS5BY3Rpdml0eURpYWdyYW0uU3luY0Jhci50ZXh0IikpeyAvLyROT04tTkxTLTEkCi0JCS8vCQkJCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpewotCQkvLyBDcmVhdGVSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgQ3JlYXRlUmVxdWVzdCgpOwotCQkvLyAvL0NyZWF0aW9uRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSh0ZW1wbGF0ZSk7Ci0JCS8vIGlmIChzeW5jaEJhckNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkvLyByZXR1cm47Ci0JCS8vIHJlcXVlc3Quc2V0RmFjdG9yeShzeW5jaEJhckNyZWF0aW9uRmFjdG9yeSk7Ci0JCS8vIHJlcXVlc3Quc2V0TG9jYXRpb24obmV3IFBvaW50KDEwLDEwKSk7Ci0JCS8vCQkJCQotCQkvLyBpZiAocmVxdWVzdC5nZXROZXdPYmplY3QoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJLy8gUG9pbnQgbG9jID0gcmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCQkvLyAvLygoR3JhcGhpY2FsRWRpdFBhcnQpZ2V0SG9zdCgpKS5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGxvYyk7Ci0JCS8vIERpYWdyYW0gcGFyZW50ID0gKERpYWdyYW0pZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJLy8gb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldwotCQkvLyBDcmVhdGVOb2RlQ29tbWFuZCgoTm9kZSlyZXF1ZXN0LmdldE5ld09iamVjdCgpLAotCQkvLyBwYXJlbnQsIGxvYyk7Ci0JCS8vIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBwdWJsaWMgU3RyaW5nIGdldElkKCl7Ci0JCS8vIHJldHVybiBDUkVBVEVfU1lOQ19CQVI7Ci0JCS8vIH0KLQkJLy8gcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCl7Ci0JCS8vIHJldHVybiB0cnVlOwotCQkvLyB9Ci0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCS8vIHJldHVybgotCQkvLyBEaWFncmFtVUlSZXNvdXJjZXMuZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWN0aXZpdHlEaWFncmFtLlN5bmNCYXIudG9vbHRpcCIpOwotCQkvLyB9Ci0JCS8vCQkJCi0JCS8vIH07Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oc3luY0JhckFjdGlvbik7Ci0JCS8vCQkKLQkJLy8JCQotCQkvLyBJQWN0aW9uIGRlY2lzaW9uQmFyQWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMuCi0JCS8vIGdldFN0cmluZygiRGlhZ3JhbVVJLkFjdGl2aXR5RGlhZ3JhbS5EZWNpc2lvbkJhci50ZXh0IikpewotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vCQkJCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpewotCQkvLyBDcmVhdGVSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgQ3JlYXRlUmVxdWVzdCgpOwotCQkvLyAvL0NyZWF0aW9uRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSh0ZW1wbGF0ZSk7Ci0JCS8vIGlmIChkZWNpc2lvbk5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJLy8gcmV0dXJuOwotCQkvLyByZXF1ZXN0LnNldEZhY3RvcnkoZGVjaXNpb25Ob2RlQ3JlYXRpb25GYWN0b3J5KTsKLQkJLy8gcmVxdWVzdC5zZXRMb2NhdGlvbihuZXcgUG9pbnQoMTAsMTApKTsKLQkJLy8JCQkJCi0JCS8vIGlmIChyZXF1ZXN0LmdldE5ld09iamVjdCgpIGluc3RhbmNlb2YgTm9kZSkgewotCQkvLyBQb2ludCBsb2MgPSByZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0JCS8vIC8vKChHcmFwaGljYWxFZGl0UGFydClnZXRIb3N0KCkpLmdldEZpZ3VyZSgpLnRyYW5zbGF0ZVRvUmVsYXRpdmUobG9jKTsKLQkJLy8gRGlhZ3JhbSBwYXJlbnQgPSAoRGlhZ3JhbSllZGl0UGFydC5nZXRNb2RlbCgpOwotCQkvLyBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3Ci0JCS8vIENyZWF0ZU5vZGVDb21tYW5kKChOb2RlKXJlcXVlc3QuZ2V0TmV3T2JqZWN0KCksCi0JCS8vIHBhcmVudCwgbG9jKTsKLQkJLy8gZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKXsKLQkJLy8gcmV0dXJuIENSRUFURV9ERUNJU0lPTl9CQVI7Ci0JCS8vIH0KLQkJLy8gcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCl7Ci0JCS8vIHJldHVybiB0cnVlOwotCQkvLyB9Ci0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCS8vIHJldHVybgotCQkvLyBEaWFncmFtVUlSZXNvdXJjZXMuZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWN0aXZpdHlEaWFncmFtLkRlY2lzaW9uQmFyLnRvb2x0aXAiKTsKLQkJLy8gfQotCQkvLwkJCQotCQkvLyB9OwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGRlY2lzaW9uQmFyQWN0aW9uKTsKLQotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0LCBzdGFydE5vZGVDcmVhdGlvbkZhY3RvcnksIC8vJE5PTi1OTFMtMSQKLQkJCQlDUkVBVEVfU1RBUlRfTk9ERSwKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90b29sdGlwLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJzdG5vZGVfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQsIGZyZWVUeHROb2RlQ3JlYXRpb25GYWN0b3J5LCAvLyROT04tTkxTLTEkCi0JCQkJQ1JFQVRFX0ZSRUVfVEVYVCwKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXAsIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZyZWV0ZXh0X3BhbDE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3RleHQsIHN5bmNoQmFyQ3JlYXRpb25GYWN0b3J5LCAvLyROT04tTkxTLTEkCi0JCQkJQ1JFQVRFX1NZTkNfQkFSLCBEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdG9vbHRpcAotCQkJCSwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJzeW5jYmFyX3BhbDE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdGV4dCwgZGVjaXNpb25Ob2RlQ3JlYXRpb25GYWN0b3J5LCAvLyROT04tTkxTLTEkCi0JCQkJQ1JFQVRFX0RFQ0lTSU9OX0JBUiwKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90b29sdGlwCi0JCQkJLCBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImRlY25vZGVfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dCwgZW5kTm9kZUNyZWF0aW9uRmFjdG9yeSwgLy8kTk9OLU5MUy0xJAotCQkJCUNSRUFURV9FTkRfTk9ERSwgRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3Rvb2x0aXAKLQkJCQksIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZW5kbm9kZV9wYWwxNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dCwgYWN0aXZpdHlOb2RlQ3JlYXRpb25GYWN0b3J5LCAvLyROT04tTkxTLTEkCi0JCQkJQ1JFQVRFX0FDVElWSVRZLAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdG9vbHRpcAotCQkJCSwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJhY3Rpdml0eTE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dCwgaXRlcmF0aW9uTm9kZUNyZWF0aW9uRmFjdG9yeSwgLy8kTk9OLU5MUy0xJAotCQkJCUNSRUFURV9JVEVSQVRJT04sCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdG9vbHRpcAotCQkJCSwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJJdGVyYXRpb24xNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGhhc2VfdGV4dCwgcGhhc2VOb2RlQ3JlYXRpb25GYWN0b3J5LCAvLyROT04tTkxTLTEkCi0JCQkJQ1JFQVRFX1BIQVNFLCBEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXAKLQkJCQksIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiUGhhc2UxNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dCwgdGFza0Rlc2NyaXB0b3JOb2RlQ3JlYXRpb25GYWN0b3J5LCAvLyROT04tTkxTLTEkCi0JCQkJQ1JFQVRFX1RBU0tfREVTQ1JJUFRPUiwKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3Rvb2x0aXAKLQkJCQksIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiVGFza0Rlc2NyaXB0b3IuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEb3VibGVDbGljayhFdmVudCBldmVudCkgewotCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0KLQkJLy8gZG8gbm90aGluZyBpZiAwIG9yIG1vcmUgdGhhbiAxIGVkaXQgcGFydHMgYXJlIHNlbGVjdGVkCi0JCS8vCi0JCWlmIChlZGl0UGFydHMuc2l6ZSgpICE9IDEpCi0JCQlyZXR1cm47Ci0KLQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMCk7Ci0JCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBub2RlID0gbnVsbDsKLQkJaWYgKGVkaXRQYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUKLQkJCQkmJiAobm9kZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIGVkaXRQYXJ0LmdldE1vZGVsKCkpLmdldE9iamVjdCgpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCS8vIG9wZW4gYWN0aXZpdHkgZGlhZ3JhbSBvZiB0aGUgc2VsZWN0ZWQgYWN0aXZpdHkgaW4gYSBuZXcgZWRpdG9yCi0JCQkvLwotCQkJdHJ5IHsKLQkJCQl0cnkgewotCQkJCQlCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpOwotCQkJCQlPYmplY3Qgb2JqZWN0ID0gbm9kZS5pc1JlYWRPbmx5KCkgPyBub2RlLmdldFdyYXBwZXIoKSA6IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBFZGl0b3JJbnB1dChvYmplY3QsIGVkaXRvcklucHV0LmdldFN1cHByZXNzaW9uKCkpOwotCQkJCQlJRWRpdG9yUGFydCBwYXJlbnQgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCQlJRWRpdG9yUGFydCBwYXJ0ID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5vcGVuRWRpdG9yKGlucHV0LAotCQkJCQkJCVByb2Nlc3NFZGl0b3IuV09SS0ZMT1dfRURJVE9SX0lEKTsKLQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHsKLQkJCQkJCUFic3RyYWN0RGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoQWJzdHJhY3REaWFncmFtRWRpdG9yKSBwYXJ0OwotCQkJCQkJZWRpdG9yLnNldFBhcmVudEVkaXRvcihwYXJlbnQpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFBhbGV0dGVDb250YWluZXIgY3JlYXRlQ29udHJvbEdyb3VwKFBhbGV0dGVSb290IHJvb3QpIHsKLQkJaW5pdGlhbGl6ZUNyZWF0aW9uRmFjdG9yaWVzKCk7Ci0KLQkJUGFsZXR0ZUdyb3VwIGNvbnRyb2xHcm91cCA9IG5ldyBQYWxldHRlR3JvdXAoIkNvbnRyb2wgR3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCi0JCUxpc3QgZW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlUb29sRW50cnkgdG9vbCA9IG5ldyBQYW5uaW5nU2VsZWN0aW9uVG9vbEVudHJ5KERpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3RleHQsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1NlbGVjdF90b29sdGlwCi0JCSk7Ci0JCXRvb2wuc2V0U21hbGxJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJInNlbGVjdF9wYWwxNi5naWYiKSk7Ci0JCXRvb2wuc2V0TGFyZ2VJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJInNlbGVjdF9wYWwyNC5naWYiKSk7Ci0JCWVudHJpZXMuYWRkKHRvb2wpOwotCQlyb290LnNldERlZmF1bHRFbnRyeSh0b29sKTsKLQotCQl0b29sID0gbmV3IE1hcnF1ZWVUb29sRW50cnkoKTsKLQkJdG9vbC5zZXRTbWFsbEljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkibWFycV9wYWwxNi5naWYiKSk7Ci0JCXRvb2wuc2V0TGFyZ2VJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJIm1hcnFfcGFsMjQuZ2lmIikpOwotCQllbnRyaWVzLmFkZCh0b29sKTsKLQotCQl0b29sID0gbmV3IENvbm5lY3Rpb25DcmVhdGlvblRvb2xFbnRyeShEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0xpbmtfdGV4dCwgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fTGlua190b29sdGlwLCAvLyROT04tTkxTLTEkCi0JCQkJbnVsbCwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJsaW5rX3BhbDE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJsaW5rX3BhbDI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZCh0b29sKTsKLQotCQlDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSBjb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0LCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdG9vbHRpcCwgLy8kTk9OLU5MUy0xJAotCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlNUQVJUX05PREUsIHN0YXJ0Tm9kZUNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJInN0bm9kZV9wYWwxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkic3Rub2RlX3BhbDI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZChjb21iaW5lZCk7Ci0KLQkJY29tYmluZWQgPSBuZXcgQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkoCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90ZXh0LCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwLCAvLyROT04tTkxTLTEkCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuRlJFRV9URVhULCBmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZyZWV0ZXh0X3BhbDE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmcmVldGV4dF9wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90ZXh0LCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3Rvb2x0aXAsIC8vJE5PTi1OTFMtMSQKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5TWU5DSF9CQVIsIHN5bmNoQmFyQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkic3luY2Jhcl9wYWwxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkic3luY2Jhcl9wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3RleHQsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90b29sdGlwLCAvLyROT04tTkxTLTEkCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuREVDSVNJT05fTk9ERSwgZGVjaXNpb25Ob2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZGVjbm9kZV9wYWwxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZGVjbm9kZV9wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90ZXh0LCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3Rvb2x0aXAsIC8vJE5PTi1OTFMtMSQKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5FTkRfTk9ERSwgZW5kTm9kZUNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImVuZG5vZGVfcGFsMTYuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImVuZG5vZGVfcGFsMjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQotCQlQYWxldHRlU2VwYXJhdG9yIHNlcCA9IG5ldyBQYWxldHRlU2VwYXJhdG9yKAotCQkJCUdyYXBoaWNhbFdvcmtmbG93RWRpdG9yLmNsYXNzLmdldE5hbWUoKSArICJzZXAxIik7IC8vJE5PTi1OTFMtMSQKLQkJc2VwCi0JCQkJLnNldFVzZXJNb2RpZmljYXRpb25QZXJtaXNzaW9uKFBhbGV0dGVFbnRyeS5QRVJNSVNTSU9OX05PX01PRElGSUNBVElPTik7Ci0JCWVudHJpZXMuYWRkKHNlcCk7IC8vJE5PTi1OTFMtMSQKLQotCQljb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXAsIC8vJE5PTi1OTFMtMSQKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5BQ1RJVklUWSwgYWN0aXZpdHlOb2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiYWN0aXZpdHkxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiYWN0aXZpdHkyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90b29sdGlwLCAvLyROT04tTkxTLTEkCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuSVRFUkFUSU9OLCBpdGVyYXRpb25Ob2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiSXRlcmF0aW9uMTYuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImFjdGl2aXR5MjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQotCQljb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeShEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BoYXNlX3RleHQsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXAsIC8vJE5PTi1OTFMtMSQKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QSEFTRSwgcGhhc2VOb2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiUGhhc2UxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiYWN0aXZpdHkyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dCwgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdG9vbHRpcCwgLy8kTk9OLU5MUy0xJAotCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlRBU0tfREVTQ1JJUFRPUiwKLQkJCQl0YXNrRGVzY3JpcHRvck5vZGVDcmVhdGlvbkZhY3RvcnksIEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiVGFza0Rlc2NyaXB0b3IuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImFjdGl2aXR5MjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQotCQljb250cm9sR3JvdXAuYWRkQWxsKGVudHJpZXMpOwotCQlyZXR1cm4gY29udHJvbEdyb3VwOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydE5hbWVQcmVmaXgoKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpKQotCQkJCS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXJldHVybiBnZXRUeXBlTmFtZSgoQWN0aXZpdHkpIGUpICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2NyZWF0ZURpYWdyYW1FZGl0UGFydCgpCi0JICovCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZURpYWdyYW1FZGl0UGFydCgpIHsKLQkJQWN0aXZpdHlEaWFncmFtRWRpdFBhcnQgYWRFZGl0UGFydCA9IG5ldyBBY3Rpdml0eURpYWdyYW1FZGl0UGFydChNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFjdGl2aXR5RGlhZ3JhbSgpKTsKLQkJYWRFZGl0UGFydC5tYXJrRGlydHkodHJ1ZSk7Ci0JCXJldHVybiBhZEVkaXRQYXJ0OwotCX0KLQotLy8JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KE9iamVjdCBlKSB7Ci0vLwkJQWN0aXZpdHlEaWFncmFtIGRpYWdyYW0gPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0vLwkJCQkuY3JlYXRlQWN0aXZpdHlEaWFncmFtKCk7Ci0vLwkJZGlhZ3JhbS5zZXRPYmplY3QoZSk7Ci0vLwkJRWRpdFBhcnQgcGFydCA9IG5ldyBBY3Rpdml0eURpYWdyYW1FZGl0UGFydChkaWFncmFtKTsKLS8vCQlwYXJ0LnNldE1vZGVsKGRpYWdyYW0pOwotLy8JCWRpYWdyYW0uYWRkQ29uc3VtZXIodGhpcyk7Ci0vLwkJcmV0dXJuIHBhcnQ7Ci0vLwl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoQWN0aXZpdHkgYWN0KSB7Ci0JCWlmIChhY3QgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCXJldHVybiBEaWFncmFtVUlSZXNvdXJjZXMuQWN0dml0aXZpdHlEaWFncmFtX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0OyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoYWN0IGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCXJldHVybiBEaWFncmFtVUlSZXNvdXJjZXMuQWN0dml0aXZpdHlEaWFncmFtX0NhcGFiaWxpdHlQYXR0ZXJuX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChhY3QgaW5zdGFuY2VvZiBQaGFzZSkgewotCQkJcmV0dXJuIERpYWdyYW1VSVJlc291cmNlcy5BY3R2aXRpdml0eURpYWdyYW1fUGhhc2VfdGV4OyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoYWN0IGluc3RhbmNlb2YgSXRlcmF0aW9uKSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dDsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBEaWFncmFtVUlSZXNvdXJjZXMuQWN0dml0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLS8vCXByaXZhdGUgc3RhdGljIEltYWdlIGdldFR5cGVJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0vLwkJSUl0ZW1MYWJlbFByb3ZpZGVyIGFkYXB0ZXIgPSAoSUl0ZW1MYWJlbFByb3ZpZGVyKSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotLy8JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQob2JqZWN0LAotLy8JCQkJCQlJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotLy8JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLS8vCQkJLy8gcmV0dXJuIG5ldyBJbWFnZShEaXNwbGF5LmdldEN1cnJlbnQoKSwKLS8vCQkJLy8gKChVUkwpYWRhcHRlci5nZXRJbWFnZShvYmplY3QpKS5nZXRDb250ZW50KCkpOwotLy8JCX0KLS8vCQlyZXR1cm4gbnVsbDsKLS8vCX0KLQotCS8qKgotCSAqIEFuIGVkaXRvciBpbnB1dCBmb3IgZ3JhaGljYWwgd29ya2Zsb3cgZWRpdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBFZGl0b3JJbnB1dCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCB7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBlCi0JCSAqLwotCQlwdWJsaWMgRWRpdG9ySW5wdXQoT2JqZWN0IGUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCQlzdXBlcihlLCBzdXBwcmVzc2lvbik7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjcmVhdGVFZGl0UGFydEZhY3RvcnkoKQotCSAqLwotCXByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1c7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9JRWRpdG9yS2VlcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9JRWRpdG9yS2VlcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ2OTc2ODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvSUVkaXRvcktlZXBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSB3aGljaCBtYW5hZ2VzIG9wZW5pbmcvY2xvc2luZyBvZiBhbiBlZGl0b3IKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRWRpdG9yS2VlcGVyIHsKLQotCS8qKgotCSAqIFJlZmVyZW5jZSBjbGFzcyBmb3IgZWRpdG9yIGtlZXBlcgotCSAqCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBSZWZlcmVuY2UgewotCQlwcml2YXRlIElFZGl0b3JLZWVwZXIgZWRpdG9yS2VlcGVyOwotCi0JCXByaXZhdGUgUmVmZXJlbmNlKCkgewotCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRFZGl0b3JLZWVwZXIoSUVkaXRvcktlZXBlciBlZGl0b3JLZWVwZXIpIHsKLQkJCXRoaXMuZWRpdG9yS2VlcGVyID0gZWRpdG9yS2VlcGVyOwotCQl9Ci0KLQkJcHVibGljIElFZGl0b3JLZWVwZXIgZ2V0RWRpdG9yS2VlcGVyKCkgewotCQkJcmV0dXJuIGVkaXRvcktlZXBlcjsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVmZXJlbmNlIFJFRkVSRU5DRSA9IG5ldyBSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIE9wZW4gYW4gZWRpdG9yIGZvciB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKi8KLQl2b2lkIG9wZW5FZGl0b3IoT2JqZWN0IG9iamVjdCk7Ci0KLQkvKioKLQkgKiBDbG9zZXMgYW4gb3BlbiBlZGl0b3IgaWYgZWxlbWVudCBpcyBkZWxldGVkCi0JICogQHBhcmFtIG9iamVjdAotCSAqLwotCXZvaWQgY2xvc2VFZGl0b3JzT25EZWxldGlvbihPYmplY3Qgb2JqZWN0KTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kRWxlbWVudEVkaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kRWxlbWVudEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOTc3MmY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZEVsZW1lbnRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWYWxpZGF0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkNoZWNrbGlzdEl0ZW1zUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkNvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQ29udGVudFBhY2thZ2VEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5DdXN0b21DYXRlZ29yeUFzc2lnblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5DdXN0b21DYXRlZ29yeURlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRpc2NpcGxpbmVEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EaXNjaXBsaW5lR3JvdXBpbmdEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGlzY2lwbGluZVRhc2tzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRvbWFpbkRlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRvbWFpbldvcmtQcm9kdWN0c1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuSUV4dGVuc2lvbkZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuSVJlZnJlc2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5NZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5QcmFjdGljZURlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlByYWN0aWNlUmVmZXJlbmNlc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Sb2xlQ2F0ZWdvcmllc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Sb2xlRGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUm9sZVNldERlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlJvbGVTZXRHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlJvbGVTZXRHcm91cGluZ1JvbGVTZXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUm9sZVNldFJvbGVzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlJvbGVXb3JrUHJvZHVjdHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuVGFza0NhdGVnb3JpZXNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuVGFza0Rlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlRhc2tSb2xlc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5UYXNrU3RlcHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuVGFza1dvcmtQcm9kdWN0c1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Ub29sRGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuVG9vbFRvb2xNZW50b3JzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLldvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Xb3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuV29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Xb3JrUHJvZHVjdFR5cGVEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Xb3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWwuTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWRpdG9yUGFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5MaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkVsZW1lbnRIVE1MVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5WaWV3SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBUaGUgTWV0aG9kIEVsZW1lbnQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudEVkaXRvciBleHRlbmRzIEFic3RyYWN0QmFzZUZvcm1FZGl0b3IgaW1wbGVtZW50cwotCQlJU2VsZWN0aW9uUHJvdmlkZXIgewotCi0JLyoqCi0JICogVGhlIGVkaXRvciBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfSUQgPSBNZXRob2RFbGVtZW50RWRpdG9yLmNsYXNzLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBpbnQgcHJldmlld19wYWdlX2luZGV4ID0gLTE7Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudEhUTUxWaWV3ZXIgcHJldmlld2VyID0gbnVsbDsKLQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGVsZW1lbnRPYmogPSBudWxsOwotCi0JLy8gVGhlIHJpY2ggdGV4dCBjb250cm9sIG9yIGVkaXRvciB3aG9zZSBjb250ZW50IHdhcyBsYXN0IG1vZGlmaWVkIGJlZm9yZQotCS8vIHRoZSBTYXZlIG9yIFNhdmUgQWxsIGJ1dHRvbiBrZXkgaXMgc2VsZWN0ZWQuCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBtb2RpZmllZFJpY2hUZXh0ID0gbnVsbDsKLQotCXByb3RlY3RlZCBBZGFwdGVyIG5hbWVDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE1ldGhvZEVsZW1lbnQuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCQkJbmFtZUNoYW5nZWQoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPigpOwotCi0JcHJvdGVjdGVkIElTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0KLQlwcm90ZWN0ZWQgQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGlydHk7Ci0KLQlwcml2YXRlIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXI7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlc1RvQWRqdXN0TG9jYXRpb24gPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjxPYmplY3Q+IHdpZGdldHNUb1Jlc3RvcmVWYWx1ZSA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQotCXByaXZhdGUgbG9uZyBjaGFuZ2VUaW1lID0gLTE7Ci0KLQlwdWJsaWMgT2JqZWN0IHdpZGdldFRvQ2hlY2s7Ci0KLQlwcml2YXRlIE9iamVjdCBjdXJyZW50RmVhdHVyZUVkaXRvcjsKLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGN1cnJlbnRFZGl0ZWRGZWF0dXJlOwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdDxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQkKLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIgZk1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyID0gbnVsbDsKLQkKLQkvKioKLQkgKiBMaXN0ZW5zIGZvciB3b3Jrc3BhY2UgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLnJlc291cmNlQ2hhbmdlZCgpOiBldmVudCA9ICIgKyBldmVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKGVsZW1lbnRPYmouZUlzUHJveHkoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJdHJ5IHsKLQkJCQljbGFzcyBSZXNvdXJjZURlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JCQkJCXByb3RlY3RlZCBNYXAgVVJJVG9Vc2VkUmVzb3VyY2VNYXAgPSBnZXRVUklUb1VzZWRSZXNvdXJjZU1hcCgpOwotCi0JCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQotCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCQkJCWlmIChkZWx0YS5nZXRGbGFncygpICE9IElSZXNvdXJjZURlbHRhLk1BUktFUlMKLQkJCQkJCQkJJiYgZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQkJCQlpZiAoKGRlbHRhLmdldEtpbmQoKSAmIChJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIHwgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkpICE9IDApIHsKLQkJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIFVSSVRvVXNlZFJlc291cmNlTWFwCi0JCQkJCQkJCQkJLmdldChVUkkuY3JlYXRlRmlsZVVSSShkZWx0YQotCQkJCQkJCQkJCQkJLmdldFJlc291cmNlKCkuZ2V0TG9jYXRpb24oKQotCQkJCQkJCQkJCQkJLnRvU3RyaW5nKCkpKTsKLQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmICgoZGVsdGEuZ2V0S2luZCgpICYgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgIT0gMCkgewotCQkJCQkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRDaGFuZ2VkUmVzb3VyY2VzKCkgewotCQkJCQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVtb3ZlZFJlc291cmNlcygpIHsKLQkJCQkJCXJldHVybiByZW1vdmVkUmVzb3VyY2VzOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpOwotCQkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yKTsKLQotCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpKTsKLQkJCQlpZiAoIXZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpLmlzRW1wdHkoKSAmJiAhaXNEaXJ0eSgpKSB7Ci0JCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcy5kaXNwb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQotCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX07Ci0KLQljbGFzcyBBY3RpdmF0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJUGFydExpc3RlbmVyLCBJV2luZG93TGlzdGVuZXIgewotCi0JCS8qKiBDYWNoZSBvZiB0aGUgYWN0aXZlIHdvcmtiZW5jaCBwYXJ0LiAqLwotCQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IGZBY3RpdmVQYXJ0OwotCi0JCS8qKiBJbmRpY2F0ZXMgd2hldGhlciBhY3RpdmF0aW9uIGhhbmRsaW5nIGlzIGN1cnJlbnRseSBiZSBkb25lLiAqLwotCQlwcml2YXRlIGJvb2xlYW4gZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIFRoZSBwYXJ0IHNlcnZpY2UuCi0JCSAqIAotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwcml2YXRlIElQYXJ0U2VydmljZSBmUGFydFNlcnZpY2U7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgdGhpcyBhY3RpdmF0aW9uIGxpc3RlbmVyLgotCQkgKiAKLQkJICogQHBhcmFtIHBhcnRTZXJ2aWNlCi0JCSAqICAgICAgICAgICAgdGhlIHBhcnQgc2VydmljZSBvbiB3aGljaCB0byBhZGQgdGhlIHBhcnQgbGlzdGVuZXIKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIEFjdGl2YXRpb25MaXN0ZW5lcihJUGFydFNlcnZpY2UgcGFydFNlcnZpY2UpIHsKLQkJCWZQYXJ0U2VydmljZSA9IHBhcnRTZXJ2aWNlOwotCQkJZlBhcnRTZXJ2aWNlLmFkZFBhcnRMaXN0ZW5lcih0aGlzKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuYWRkV2luZG93TGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQkvKioKLQkJICogRGlzcG9zZXMgdGhpcyBhY3RpdmF0aW9uIGxpc3RlbmVyLgotCQkgKiAKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWZQYXJ0U2VydmljZS5yZW1vdmVQYXJ0TGlzdGVuZXIodGhpcyk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLnJlbW92ZVdpbmRvd0xpc3RlbmVyKHRoaXMpOwotCQkJZlBhcnRTZXJ2aWNlID0gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0QWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlmQWN0aXZlUGFydCA9IHBhcnQ7Ci0JCQloYW5kbGVBY3RpdmF0aW9uKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydEJyb3VnaHRUb1RvcChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRDbG9zZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0RGVhY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJZkFjdGl2ZVBhcnQgPSBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRPcGVuZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWlmIChwYXJ0ID09IE1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcykgewotCQkJCWlmICghaXNJbnB1dFZhbGlkKCkpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlJbmZvKAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JUaXRsZSwgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvck1zZyk7IAotCQkJCQlNZXRob2RFbGVtZW50RWRpdG9yLnRoaXMuY2xvc2UoZmFsc2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCUNvbGxlY3Rpb24gdXNlZFJlc291cmNlcyA9IGdldFVzZWRSZXNvdXJjZXMoKTsKLQkJCQlpZiAoUmVzb3VyY2VVdGlsLmhhc091dE9mU3luY2godXNlZFJlc291cmNlcykpIHsKLQkJCQkJaGFuZGxlRmlsZUNoYW5nZWQodXNlZFJlc291cmNlcyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJdXBkYXRlVGltZVN0YW1wcyh1c2VkUmVzb3VyY2VzKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBIYW5kbGVzIHRoZSBhY3RpdmF0aW9uIHRyaWdnZXJpbmcgYSBlbGVtZW50IHN0YXRlIGNoZWNrIGluIHRoZQotCQkgKiBlZGl0b3IuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgaGFuZGxlQWN0aXZhdGlvbigpIHsKLQkJCWlmIChmSXNIYW5kbGluZ0FjdGl2YXRpb24gfHwgTWV0aG9kRWxlbWVudEVkaXRvci50aGlzLmRpc3Bvc2VkKQotCQkJCXJldHVybjsKLQotCQkJaWYgKGZBY3RpdmVQYXJ0ID09IE1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcykgewotCQkJCWZJc0hhbmRsaW5nQWN0aXZhdGlvbiA9IHRydWU7Ci0JCQkJdHJ5IHsKLQkJCQkJaGFuZGxlQWN0aXZhdGUoZkFjdGl2ZVBhcnQpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWZJc0hhbmRsaW5nQWN0aXZhdGlvbiA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyI3dpbmRvd0FjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aW5kb3dBY3RpdmF0ZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJCWlmICh3aW5kb3cgPT0gZ2V0RWRpdG9yU2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpKSB7Ci0JCQkJLyoKLQkJCQkgKiBXb3JrYXJvdW5kIGZvciBwcm9ibGVtIGRlc2NyaWJlZCBpbgotCQkJCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3MzEgV2lsbCBiZQotCQkJCSAqIHJlbW92ZWQgd2hlbiBTV1QgaGFzIHNvbHZlZCB0aGUgcHJvYmxlbS4KLQkJCQkgKi8KLQkJCQl3aW5kb3cuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaGFuZGxlQWN0aXZhdGlvbigpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lciN3aW5kb3dEZWFjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aW5kb3dEZWFjdGl2YXRlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93Q2xvc2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93T3BlbmVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpbmRvd09wZW5lZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl9Ci0JfQotCi0JcHJpdmF0ZSBBY3RpdmF0aW9uTGlzdGVuZXIgYWN0aXZhdGlvbkxpc3RlbmVyOwotCi0JcHJpdmF0ZSBIYXNoTWFwPFJlc291cmNlLCBMb25nPiBtb2RpZmljYXRpb25UaW1lU3RhbXBNYXA7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tGaWxlQ2hhbmdlZFJlcXVpcmVkID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgSGFzaFNldDxSZXNvdXJjZT4gbGFzdFVzZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGlzcG9zZWQ7Ci0KLQlwcml2YXRlIEhhc2hNYXA8UmVzb3VyY2UsIExvbmc+IGxvYWRUaW1lU3RhbXBNYXA7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEVkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCS8vIG1vdmVkIHRoZSBkZXRhaWxzIG91dCBzbyB0aGF0IHVzZXIgY2FuIG92ZXJyaWRlIHRoZSB0aWNrIHVwZGF0b3IKLQkJLy8gSmluaHVhIFhpIDMvMTUvMjAwNwotCQljcmVhdGVFZGl0b3JFcnJvclRpY2tVcGRhdGVyKCk7Ci0JCWNyZWF0ZUFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdG9yRXJyb3JUaWNrVXBkYXRlcigpIHsKLQkJCi0JCXRoaXMuZk1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyID0gbmV3IE1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyKHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25NYW5hZ2VyKCkgewotCQlhY3Rpb25NZ3IgPSBuZXcgQWN0aW9uTWFuYWdlcigpIHsKLQotCQkJcHJvdGVjdGVkIEZ1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjayBjcmVhdGVDb21tYW5kU3RhY2soKSB7Ci0JCQkJcmV0dXJuIG5ldyBGdWxseVJldmVydGlibGVDb21tYW5kU3RhY2sodGhpcykgewotCQkJCQlwdWJsaWMgYm9vbGVhbiBkb0V4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQkJCQkvLyBDaGVjayBtb2RpZnkgZmlyc3QuCi0JCQkJCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCQkJCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSAoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgY29tbWFuZCkKLQkJCQkJCQkJCS5nZXRNb2RpZmllZFJlc291cmNlcygpOwotCQkJCQkJCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsCi0JCQkJCQkJCQkmJiAhKG1vZGlmaWVkUmVzb3VyY2VzLmlzRW1wdHkoKSkpIHsKLQkJCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJCQkJCQkuY2hlY2tNb2RpZnkobW9kaWZpZWRSZXNvdXJjZXMsCi0JCQkJCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQkJCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCQkJTWV0aG9kRWxlbWVudEVkaXRvci50aGlzCi0JCQkJCQkJCQkJCS5oYW5kbGVFcnJvcihzdGF0dXMpOwotCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlFT2JqZWN0IG93bmVyID0gVG5nVXRpbC5nZXRPd25lcihjb21tYW5kKTsKLQkJCQkJCQlpZiAob3duZXIgIT0gbnVsbCkgewotCQkJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KG93bmVyLAotCQkJCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCQkuZGlzcGxheSgKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdERpYWxvZ19tc2dDYW5ub3RFZGl0LCAKLQkJCQkJCQkJCQkJCQlzdGF0dXMpOwotCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlpZiAoY2hhbmdlVGltZSA9PSAtMSkgewotCQkJCQkJCWNoYW5nZVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJCX0KLQkJCQkJCWJvb2xlYW4gcmV0ID0gc3VwZXIuZG9FeGVjdXRlKGNvbW1hbmQpOwotCQkJCQkJaWYgKCFyZXQgJiYgY2hhbmdlVGltZSAhPSAtMSkgewotCQkJCQkJCWNoYW5nZVRpbWUgPSAtMTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiByZXQ7Ci0JCQkJCX0KLQotCQkJCX07Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGRvQWN0aW9uKGludCBhY3Rpb25UeXBlLCBFT2JqZWN0IG9iamVjdCwKLQkJCQkJb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gVG5nVXRpbAotCQkJCQkJLmNoZWNrRWRpdChvYmplY3QsIGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJCQlyZXR1cm4gc3VwZXIuZG9BY3Rpb24oYWN0aW9uVHlwZSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQkJCQlpbmRleCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQsIAotCQkJCQkJCXN0YXR1cyk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCB2b2lkIHNhdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCQkvLyBkb24ndCBzYXZlIHJlc291cmNlIHRoYXQgaXMgY2hhbmdlZCBvdXRzaWRlIG9mIHRoaXMgZWRpdG9yCi0JCQkJLy8KLQkJCQlpZiAoY2hhbmdlZFJlc291cmNlcy5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkKLQkJCQlib29sZWFuIGNhblNhdmU7Ci0JCQkJaWYocmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJCQljYW5TYXZlID0gZmlsZS5sYXN0TW9kaWZpZWQoKSA+IGNoYW5nZVRpbWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljYW5TYXZlID0gdHJ1ZTsKLQkJCQl9CQkJCQotCQkJCXRyeSB7Ci0JCQkJCWlmKGNhblNhdmUpIHsKLQkJCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBnZXRQZXJzaXN0ZXIoKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKGUpOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCQlWaWV3SGVscGVyCi0JCQkJCQkJCS5yZWxvYWRDdXJyZW50TGliYXJ5T25Sb2xsYmFja0Vycm9yKGdldEVkaXRvclNpdGUoKQotCQkJCQkJCQkJCS5nZXRTaGVsbCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQljaGFuZ2VUaW1lID0gLTE7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCWFjdGlvbk1nci5nZXRDb21tYW5kU3RhY2soKS5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcigKLQkJCQluZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoRXZlbnRPYmplY3QgZXZlbnQpIHsKLQkJCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5zdGFydExpc3RlbmluZ1RvKGFjdGlvbk1nci5nZXRDb21tYW5kU3RhY2soKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbmFtZUNoYW5nZWQoKSB7Ci0JCVNhZmVVcGRhdGVDb250cm9sbGVyLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzZXRQYXJ0TmFtZSgpOwotCQkJCWlmIChwYWdlcyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHBhZ2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IHBhZ2UgPSBpdGVyLm5leHQoKTsKLQotCQkJCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBJUmVmcmVzaGFibGUpIHsKLQkJCQkJCQkoKElSZWZyZXNoYWJsZSkgcGFnZSkucmVmcmVzaE5hbWUoZWxlbWVudE9iagotCQkJCQkJCQkJLmdldE5hbWUoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBJQWN0aW9uTWFuYWdlciBnZXRBY3Rpb25NYW5hZ2VyKCkgewotCQlyZXR1cm4gYWN0aW9uTWdyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3IjaW5pdChJRWRpdG9yU2l0ZSwKLQkgKiAgICAgIElFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkKLQkJCXRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXNldFNpdGUoc2l0ZSk7Ci0JCXNldElucHV0KGlucHV0KTsKLQkJc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0aGlzKTsKLQkJYWN0aXZhdGlvbkxpc3RlbmVyID0gbmV3IEFjdGl2YXRpb25MaXN0ZW5lcihzaXRlLmdldFdvcmtiZW5jaFdpbmRvdygpCi0JCQkJLmdldFBhcnRTZXJ2aWNlKCkpOwotCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQlJbWFnZSB0aXRsZUltYWdlID0gbGFiZWxQcm92aWRlci5nZXRJbWFnZShlbGVtZW50T2JqKTsKLQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCXNldFRpdGxlSW1hZ2UodGl0bGVJbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjc2V0SW5wdXQob3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldElucHV0KElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5zZXRJbnB1dChpbnB1dCk7Ci0KLQkJLy8gR2V0IG1ldGhvZCBlbGVtZW50IG9iamVjdCBmcm9tIEVkaXRvciBpbnB1dC4KLQkJLy8KLQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IG1ldGhvZEVsZW1lbnRJbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0OwotCQllbGVtZW50T2JqID0gbWV0aG9kRWxlbWVudElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQotCQlzZXRQYXJ0TmFtZSgpOwotCQllbGVtZW50T2JqLmVBZGFwdGVycygpLmFkZChuYW1lQ2hhbmdlZExpc3RlbmVyKTsKLQkJCi0JCWlmIChmTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIgIT0gbnVsbCkKLQkJCWZNZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlci51cGRhdGVFZGl0b3JJbWFnZShlbGVtZW50T2JqKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVUaW1lU3RhbXBzKENvbGxlY3Rpb24gdXNlZFJlc291cmNlcykgewotCQl1cGRhdGVNb2RpZmljYXRpb25UaW1lU3RhbXBNYXAodXNlZFJlc291cmNlcyk7Ci0JCXVwZGF0ZUxvYWRUaW1lU3RhbXBNYXAodXNlZFJlc291cmNlcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZU1vZGlmaWNhdGlvblRpbWVTdGFtcE1hcChDb2xsZWN0aW9uIHVzZWRSZXNvdXJjZXMpIHsKLQkJaWYgKG1vZGlmaWNhdGlvblRpbWVTdGFtcE1hcCA9PSBudWxsKSB7Ci0JCQltb2RpZmljYXRpb25UaW1lU3RhbXBNYXAgPSBuZXcgSGFzaE1hcDxSZXNvdXJjZSwgTG9uZz4oKTsKLQkJfSBlbHNlIHsKLQkJCW1vZGlmaWNhdGlvblRpbWVTdGFtcE1hcC5jbGVhcigpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHVzZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihyZXNvdXJjZS5nZXRVUkkoKS5pc0ZpbGUoKSkgewotCQkJCW1vZGlmaWNhdGlvblRpbWVTdGFtcE1hcC5wdXQocmVzb3VyY2UsIG5ldyBMb25nKG5ldyBGaWxlKHJlc291cmNlCi0JCQkJCQkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLmxhc3RNb2RpZmllZCgpKSk7Ci0JCQl9Ci0JCX0KLQkJY2hlY2tGaWxlQ2hhbmdlZFJlcXVpcmVkID0gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlTG9hZFRpbWVTdGFtcE1hcChDb2xsZWN0aW9uIHVzZWRSZXNvdXJjZXMpIHsKLQkJaWYgKGxvYWRUaW1lU3RhbXBNYXAgPT0gbnVsbCkgewotCQkJbG9hZFRpbWVTdGFtcE1hcCA9IG5ldyBIYXNoTWFwPFJlc291cmNlLCBMb25nPigpOwotCQl9IGVsc2UgewotCQkJbG9hZFRpbWVTdGFtcE1hcC5jbGVhcigpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHVzZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2UpIHsKLQkJCQlsb2FkVGltZVN0YW1wTWFwLnB1dChyZXNvdXJjZSwgbmV3IExvbmcoKChJTGlicmFyeVJlc291cmNlKXJlc291cmNlKQotCQkJCQkJLmdldExvYWRTdGFtcCgpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlcmUgaXMgYW55IHJlc291cmNlIGluIHRoZSBnaXZlbiA8Y29kZT51c2VkUmVzb3VyY2VzPC9jb2RlPgotCSAqIHRoYXQgaGFzIGJlZW4gcmVsb2FkZWQgc2luY2UgbGFzdCB1cGRhdGUgb2YgbG9hZCB0aW1lIHN0YW1wcyBieSB0aGlzCi0JICogZWRpdG9yCi0JICogCi0JICogQHBhcmFtIHVzZWRSZXNvdXJjZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tSZWxvYWRlZChDb2xsZWN0aW9uIHVzZWRSZXNvdXJjZXMpIHsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBnZXRSZXNvdXJjZVNldCh1c2VkUmVzb3VyY2VzKTsKLQkJYm9vbGVhbiB4bWkgPSByZXNvdXJjZVNldCBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2VTZXQgCi0JCQkmJiAoKElMaWJyYXJ5UmVzb3VyY2VTZXQpcmVzb3VyY2VTZXQpLmdldFBlcnNpc3RlbmNlVHlwZSgpLmVxdWFscyhTZXJ2aWNlcy5YTUlfUEVSU0lTVEVOQ0VfVFlQRSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHVzZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2UpIHsKLQkJCQlMb25nIG9sZFRpbWUgPSAoTG9uZykgbG9hZFRpbWVTdGFtcE1hcC5nZXQocmVzb3VyY2UpOwotCQkJCWxvbmcgY3VycmVudFRpbWUgPSAoKElMaWJyYXJ5UmVzb3VyY2UpcmVzb3VyY2UpLmdldExvYWRTdGFtcCgpOwotCQkJCWlmIChvbGRUaW1lICE9IG51bGwgJiYgb2xkVGltZS5sb25nVmFsdWUoKSAhPSBjdXJyZW50VGltZSkgewotCQkJCQlpZih4bWkpIHsKLQkJCQkJCUlSZXNvdXJjZSB3c1JlcyA9IEZpbGVNYW5hZ2VyLmdldFJlc291cmNlRm9yTG9jYXRpb24ocmVzb3VyY2UKLQkJCQkJCQkJLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQkJCWlmICh3c1JlcyAhPSBudWxsKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KENvbGxlY3Rpb24gcmVzb3VyY2VzKSB7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VTZXQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrRmlsZUNoYW5nZWQoQ29sbGVjdGlvbiB1c2VkUmVzb3VyY2VzKSB7Ci0JCS8vIGNoZWNrIHJlc291cmNlIHNldCB0eXBlIGFuZCBjb250aW51ZSB0byBjaGVjayBmb3IgY2hhbmdlZCBmaWxlIGlmIHRoZQotCQkvLyB0eXBlIGlzIFhNSQotCQkvLwotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGdldFJlc291cmNlU2V0KHVzZWRSZXNvdXJjZXMpOwotCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlU2V0Ci0JCQkJJiYgKChJTGlicmFyeVJlc291cmNlU2V0KSByZXNvdXJjZVNldCkuZ2V0UGVyc2lzdGVuY2VUeXBlKCkuZXF1YWxzKFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdXNlZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJU3RyaW5nIGZpbGVQYXRoID0gRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKHJlc291cmNlLmdldFVSSSgpLCByZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKSk7Ci0JCQkJTG9uZyBvbGRUaW1lID0gKExvbmcpIG1vZGlmaWNhdGlvblRpbWVTdGFtcE1hcC5nZXQocmVzb3VyY2UpOwotCQkJCWJvb2xlYW4gY2hlY2tGb3JTeW5jaCA9IGZhbHNlOwotCQkJCWlmIChvbGRUaW1lID09IG51bGwpIHsKLQkJCQkJLy8gZWRpdG9yIGlzIGJlaW5nIG9wZW4gb3IgbmV3IHNhdmVkIGZpbGUKLQkJCQkJLy8KLQkJCQkJY2hlY2tGb3JTeW5jaCA9IE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCQkJLmNoZWNrU3luY2hyb25pemVkKHJlc291cmNlKSAhPSAxOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVQYXRoKTsKLQkJCQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCQlsb25nIGN1cnJlbnRUaW1lID0gZmlsZS5sYXN0TW9kaWZpZWQoKTsKLQkJCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCQkJLnNhbWUoY3VycmVudFRpbWUsIG9sZFRpbWUubG9uZ1ZhbHVlKCkpKSB7Ci0JCQkJCQkvLyBzb21lIHRlYW0gcHJvdmlkZXJzIGNoYW5nZWQgdGhlIHRpbWVzdGFtcCBvZiBsYXN0Ci0JCQkJCQkvLyBmaWxlCi0JCQkJCQkvLyBtb2RpZmljYXRpb24gYnkgcmVtb3Zpbmcgc2Vjb25kIGZyYWN0aW9uCi0JCQkJCQkvLyBldmVuIHRoZSBmaWxlIHdhcyBub3QgY2hhbmdlZAotCQkJCQkJLy8KLQkJCQkJCW1vZGlmaWNhdGlvblRpbWVTdGFtcE1hcC5wdXQocmVzb3VyY2UsIG5ldyBMb25nKAotCQkJCQkJCQljdXJyZW50VGltZSkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY2hlY2tGb3JTeW5jaCA9IG9sZFRpbWUubG9uZ1ZhbHVlKCkgIT0gY3VycmVudFRpbWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoY2hlY2tGb3JTeW5jaCkgewotCQkJCQlJUmVzb3VyY2Ugd3NSZXMgPSBGaWxlTWFuYWdlcgotCQkJCQkJCS5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKGZpbGVQYXRoKTsKLQkJCQkJaWYgKHdzUmVzICE9IG51bGwKLQkJCQkJCQkmJiAhd3NSZXMuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvbXB0UmVsb2FkRmlsZXMoKSB7Ci0JCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX3RpdGxlOwotCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfbWVzc2FnZTsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5UHJvbXB0KAotCQkJCXRpdGxlLCBtc2cpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYW5kbGVGaWxlQ2hhbmdlZChmaW5hbCBDb2xsZWN0aW9uIHVzZWRSZXNvdXJjZXMpIHsKLQkJYm9vbGVhbiByZXQgPSBwcm9tcHRSZWxvYWRGaWxlcygpOwotCQlpZiAocmV0KSB7Ci0JCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAxMCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbW9uaXRvci5zdWJUYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlZnJlc2hfdGV4dCk7IAotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJdHJ5IHsKLQotCQkJCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB1c2VkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYgKCFuZXcgRmlsZShyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkKLQkJCQkJCQkJCS5leGlzdHMoKSkgewotCQkJCQkJCQlyZW1vdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJQ29sbGVjdGlvbiBjaGFuZ2VkUmVzb3VyY2VzID0gUmVzb3VyY2VVdGlsCi0JCQkJCQkJCS5nZXRPdXRPZlN5bmNoUmVzb3VyY2VzKHVzZWRSZXNvdXJjZXMpOwotCQkJCQkJbW9uaXRvci53b3JrZWQoMik7Ci0KLQkJCQkJCS8vIHVubG9hZCB0aGUgcmVtb3ZlZCByZXNvdXJjZXMKLQkJCQkJCS8vCi0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZW1vdmVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBpdGVyCi0JCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXJlc291cmNlLnVubG9hZFdpdGhvdXRSZW1vdmUoKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCW1vbml0b3Iud29ya2VkKDIpOwotCi0JCQkJCQkvLyBSZWxvYWQgdGhlIGNoYW5nZWQgcmVzb3VyY2VzLgotCQkJCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJCQlDb2xsZWN0aW9uPFJlc291cmNlPiByZWxvYWRlZFJlc291cmNlcyA9IG1hbmFnZXIKLQkJCQkJCQkJCS5yZWxvYWRSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlcyk7Ci0JCQkJCQkJaWYgKCFyZWxvYWRlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJLmdldFJlbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcygpCi0JCQkJCQkJCQkJLmFkZEFsbChyZWxvYWRlZFJlc291cmNlcyk7Ci0JCQkJCQkJfQotCi0JCQkJCQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKQotCQkJCQkJCQkJfHwgIXJlbG9hZGVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCQkJCQkvLyBzYXZlIGNoYW5nZWQgcmVzb3VyY2VzIGJlZm9yZSByZWZyZXNoIHNvCi0JCQkJCQkJCS8vIGFjdGlvbgotCQkJCQkJCQkvLyBtYW5hZ2VyIHdpbGwgbm90IHRyeSB0byBzYXZlIHRoZXNlIGNoYW5nZWQKLQkJCQkJCQkJLy8gcmVzb3VyY2VzCi0JCQkJCQkJCS8vCi0JCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcy5jaGFuZ2VkUmVzb3VyY2VzCi0JCQkJCQkJCQkJLmFkZEFsbChyZWxvYWRlZFJlc291cmNlcyk7Ci0JCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcy5sYXN0VXNlZFJlc291cmNlcwotCQkJCQkJCQkJCS5yZW1vdmVBbGwocmVtb3ZlZFJlc291cmNlcyk7Ci0JCQkJCQkJCXJlZnJlc2godHJ1ZSk7Ci0JCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcy5jaGFuZ2VkUmVzb3VyY2VzCi0JCQkJCQkJCQkJLmNsZWFyKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJbW9uaXRvci53b3JrZWQoNCk7Ci0KLQkJCQkJCS8vIHJlZnJlc2ggb3V0LW9mLXN5bmNoIHJlc291cmNlcwotCQkJCQkJLy8KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoYW5nZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCUZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVmcmVzaCgKLQkJCQkJCQkJCShSZXNvdXJjZSkgaXRlci5uZXh0KCkpOwotCQkJCQkJfQotCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfTsKLQotCQkJdHJ5IHsKLQkJCQlnZXRTaXRlKCkKLQkJCQkJCS5nZXRXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkKLQkJCQkJCS5ydW5JblVJKAotCQkJCQkJCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKSwKLQkJCQkJCQkJcnVubmFibGUsIG51bGwpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JUaXRsZTsgCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCXRpdGxlLCBlLnRvU3RyaW5nKCksIGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJY2hlY2tGaWxlQ2hhbmdlZFJlcXVpcmVkID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0TmFtZSgpIHsKLQkJU3RyaW5nIHBhcnROYW1lID0gZWxlbWVudE9iai5nZXROYW1lKCk7Ci0JCWlmIChwYXJ0TmFtZSA9PSBudWxsKSB7Ci0JCQlwYXJ0TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc2V0UGFydE5hbWUocGFydE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNyZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLQkJCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjZ2V0U2VsZWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBjdXJyZW50U2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjc2V0U2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQotCQlmb3IgKEl0ZXJhdG9yIGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycykKLQkJCQkuaXRlcmF0b3IoKTsgbGlzdGVuZXJzLmhhc05leHQoKTspIHsKLQkJCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikgbGlzdGVuZXJzCi0JCQkJCS5uZXh0KCk7Ci0JCQlsaXN0ZW5lcgotCQkJCQkuc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIHNlbGVjdGlvbikpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvciNhZGRQYWdlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQlhZGRQYWdlKG5ldyBNZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZSh0aGlzKSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlhZGRQYWdlKG5ldyBNZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50T2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlhZGRQYWdlKG5ldyBDb250ZW50UGFja2FnZURlc2NyaXB0aW9uUGFnZSh0aGlzKSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQkJYWRkUGFnZShuZXcgUm9sZURlc2NyaXB0aW9uUGFnZSh0aGlzKSk7Ci0JCQkJYWRkUGFnZShuZXcgUm9sZVdvcmtQcm9kdWN0c1BhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKHRoaXMpKTsKLQkJCQlhZGRQYWdlKG5ldyBSb2xlQ2F0ZWdvcmllc1BhZ2UodGhpcykpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50T2JqIGluc3RhbmNlb2YgVGFzaykgewotCQkJCWFkZFBhZ2UobmV3IFRhc2tEZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IFRhc2tTdGVwc1BhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IFRhc2tSb2xlc1BhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IFRhc2tXb3JrUHJvZHVjdHNQYWdlKHRoaXMpKTsKLQkJCQlhZGRQYWdlKG5ldyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZSh0aGlzKSk7Ci0JCQkJYWRkUGFnZShuZXcgVGFza0NhdGVnb3JpZXNQYWdlKHRoaXMpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJYWRkUGFnZShuZXcgV29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCWlmIChlbGVtZW50T2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJYWRkUGFnZShuZXcgV29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZSh0aGlzKSk7Ci0JCQkJfQotCQkJCWFkZFBhZ2UobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKHRoaXMpKTsKLQkJCQlhZGRQYWdlKG5ldyBXb3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlKHRoaXMpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNBbGxvd2VkQXR0YWNobWVudHMoZWxlbWVudE9iaikpIHsKLQkJCQkJYWRkUGFnZShuZXcgR3VpZGFuY2VXaXRoQXR0YWNobWVudHNEZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCX0gZWxzZSBpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQkJCWFkZFBhZ2UobmV3IFByYWN0aWNlRGVzY3JpcHRpb25QYWdlKHRoaXMpKTsKLQkJCQkJYWRkUGFnZShuZXcgUHJhY3RpY2VSZWZlcmVuY2VzUGFnZSh0aGlzKSk7Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50T2JqIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWFkZFBhZ2UobmV3IEd1aWRhbmNlRGVzY3JpcHRpb25QYWdlKHRoaXMpKTsKLQkJCQkJYWRkUGFnZShuZXcgQ2hlY2tsaXN0SXRlbXNQYWdlKHRoaXMpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlhZGRQYWdlKG5ldyBHdWlkYW5jZURlc2NyaXB0aW9uUGFnZSh0aGlzKSk7Ci0JCQkJfQotCQkJCWlmICghKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBQcmFjdGljZSkpCi0JCQkJCWFkZFBhZ2UobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKHRoaXMpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCQlhZGRQYWdlKG5ldyBEaXNjaXBsaW5lRGVzY3JpcHRpb25QYWdlKHRoaXMpKTsKLQkJCQlhZGRQYWdlKG5ldyBEaXNjaXBsaW5lVGFza3NQYWdlKHRoaXMpKTsKLQkJCQlhZGRQYWdlKG5ldyBEaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlKHRoaXMpKTsKLQkJCQlhZGRQYWdlKG5ldyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZSh0aGlzKSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpIHsKLQkJCQlhZGRQYWdlKG5ldyBEaXNjaXBsaW5lR3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IERpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZSh0aGlzKSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCQlhZGRQYWdlKG5ldyBEb21haW5EZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IERvbWFpbldvcmtQcm9kdWN0c1BhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKHRoaXMpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkgewotCQkJCWFkZFBhZ2UobmV3IFdvcmtQcm9kdWN0VHlwZURlc2NyaXB0aW9uUGFnZSh0aGlzKSk7Ci0JCQkJYWRkUGFnZShuZXcgV29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZSh0aGlzKSk7Ci0JCQkJYWRkUGFnZShuZXcgQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UodGhpcykpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50T2JqIGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJCWFkZFBhZ2UobmV3IFJvbGVTZXREZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IFJvbGVTZXRSb2xlc1BhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKHRoaXMpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykgewotCQkJCWFkZFBhZ2UobmV3IFJvbGVTZXRHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZSh0aGlzKSk7Ci0JCQkJYWRkUGFnZShuZXcgUm9sZVNldEdyb3VwaW5nUm9sZVNldHModGhpcykpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50T2JqIGluc3RhbmNlb2YgVG9vbCkgewotCQkJCWFkZFBhZ2UobmV3IFRvb2xEZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IFRvb2xUb29sTWVudG9yc1BhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKHRoaXMpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJYWRkUGFnZShuZXcgQ3VzdG9tQ2F0ZWdvcnlEZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IEN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZSh0aGlzKSk7Ci0JCQl9Ci0KLQkJCXNldFBhcnROYW1lKGVsZW1lbnRPYmouZ2V0TmFtZSgpKTsKLQotCQkJaWYgKCEoZWxlbWVudE9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlIHx8IGVsZW1lbnRPYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKQotCQkJCWNyZWF0ZVByZXZpZXdQYWdlKCk7Ci0KLQkJCWlmIChlbGVtZW50T2JqIGluc3RhbmNlb2YgVGFzaykgewotCQkJCS8vIGNoZWNrIGZvciBleHRlbnN0aW9uIHBvaW50IGFuZCBhZGQgdGhlIHBhZ2UgaWYgdGhlcmUKLQkJCQlMaXN0IHBhZ2VQcm92aWRlcnMgPSBNZXRob2RFZGl0b3JQYWdlUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldFBhZ2VQcm92aWRlcnMoKTsKLQotCQkJCWlmIChwYWdlUHJvdmlkZXJzICE9IG51bGwgJiYgcGFnZVByb3ZpZGVycy5zaXplKCkgPiAwKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VQcm92aWRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQlPYmplY3QgcGFnZSA9IHBhZ2VQcm92aWRlcnMuZ2V0KGkpOwotCQkJCQkJCWlmIChwYWdlIGluc3RhbmNlb2YgSUV4dGVuc2lvbkZvcm1QYWdlKSB7Ci0JCQkJCQkJCUlFeHRlbnNpb25Gb3JtUGFnZSBmb3JtUGFnZSA9IChJRXh0ZW5zaW9uRm9ybVBhZ2UpIHBhZ2U7Ci0JCQkJCQkJCWZvcm1QYWdlLnNldEVkaXRvcih0aGlzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCWRpc3Bvc2UoKTsKLQkJCXRocm93IChTV1RFcnJvcikgdDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0QmFzZUZvcm1FZGl0b3IjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdHJ5IHsKLQkJCS8vIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKAotCQkJLy8gcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJCWlmIChhY3RpdmF0aW9uTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCWFjdGl2YXRpb25MaXN0ZW5lci5kaXNwb3NlKCk7Ci0JCQl9Ci0KLQkJCW1vZGlmaWVkUmljaFRleHQgPSBudWxsOwotCi0JCQlkaXNwb3NlRWRpdG9yRXJyb3JUaWNrVXBkYXRlcigpOwotCQkJCi0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCW1hbmFnZXIuc3RvcExpc3RlbmluZ1RvKGFjdGlvbk1nci5nZXRDb21tYW5kU3RhY2soKSk7Ci0JCQl9Ci0KLQkJCWlmIChpc0RpcnR5KCkpIHsKLQkJCQlhY3Rpb25NZ3IudW5kb0FsbCgpOwotCQkJfQotCQkJYWN0aW9uTWdyLmRpc3Bvc2UoKTsKLQkJCWVsZW1lbnRPYmouZUFkYXB0ZXJzKCkucmVtb3ZlKG5hbWVDaGFuZ2VkTGlzdGVuZXIpOwotCQl9IGZpbmFsbHkgewotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQkJZGlzcG9zZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUVkaXRvckVycm9yVGlja1VwZGF0ZXIoKQotCXsKLQkJaWYgKCBmTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIgIT0gbnVsbCApIHsKLQkJCWZNZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlci5kaXNwb3NlKCk7Ci0JCQlmTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3RCYXNlRm9ybUVkaXRvciNpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlpZiAoZGlydHkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZGlydHkgPSBhY3Rpb25NZ3IuaXNTYXZlTmVlZGVkKCk7Ci0JCXJldHVybiBkaXJ0eTsKLQl9Ci0KLQlwdWJsaWMgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGdldFBlcnNpc3RlcigpIHsKLQkJaWYgKHBlcnNpc3RlciA9PSBudWxsKSB7Ci0JCQlwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHBlcnNpc3RlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBhY3Rpb25NZ3IuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgbW9kaWZpZWQgcmljaCB0ZXh0IGZpZWxkCi0JICogQHBhcmFtIG1vZGlmaWVkUmljaFRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RpZmllZFJpY2hUZXh0KElNZXRob2RSaWNoVGV4dCBtb2RpZmllZFJpY2hUZXh0KSB7Ci0JCXRoaXMubW9kaWZpZWRSaWNoVGV4dCA9IG1vZGlmaWVkUmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBtb2RpZmllZCByaWNoIHRleHQgCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZU1vZGlmaWVkUmljaFRleHQoSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsICYmICFyaWNoVGV4dC5pc0Rpc3Bvc2VkKCkKLQkJCQkmJiByaWNoVGV4dC5nZXRNb2RpZmllZCgpKSB7Ci0JCQlFT2JqZWN0IG1vZGFsT2JqZWN0ID0gcmljaFRleHQuZ2V0TW9kYWxPYmplY3QoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBtb2RhbE9iamVjdEZlYXR1cmUgPSByaWNoVGV4dAotCQkJCQkuZ2V0TW9kYWxPYmplY3RGZWF0dXJlKCk7Ci0JCQlpZiAobW9kYWxPYmplY3QgIT0gbnVsbCAmJiBtb2RhbE9iamVjdEZlYXR1cmUgIT0gbnVsbCkgewotCQkJCU9iamVjdCBvbGRDb250ZW50ID0gbW9kYWxPYmplY3QuZUdldChtb2RhbE9iamVjdEZlYXR1cmUpOwotCQkJCWlmICghbXVzdFJlc3RvcmVWYWx1ZShyaWNoVGV4dCwgb2xkQ29udGVudCkpIHsKLQkJCQkJT2JqZWN0IG5ld0NvbnRlbnQgPSByaWNoVGV4dC5nZXRUZXh0KCk7Ci0JCQkJCXJpY2hUZXh0LnNldEluaXRpYWxUZXh0KChTdHJpbmcpbmV3Q29udGVudCk7Ci0JCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIG1vZGFsT2JqZWN0LAotCQkJCQkJCQltb2RhbE9iamVjdEZlYXR1cmUsIG5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmUgbGFzdCBtb2RpZmllZCByaWNoIHRleHQgCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZU1vZGlmaWVkUmljaFRleHQoKSB7Ci0JCXNhdmVNb2RpZmllZFJpY2hUZXh0KG1vZGlmaWVkUmljaFRleHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlicmFyeVZhbGlkYXRlQWN0aW9uIGNyZWF0ZVZhbGlkYXRlUmVzb3VyY2VBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgTGlicmFyeVZhbGlkYXRlQWN0aW9uKGZhbHNlKSB7Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5VmFsaWRhdGVBY3Rpb24jcmVmcmVzaFZpZXdzKCkKLQkJCSAqLwotCQkJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpZXdzKCkgewotCQkJCUxpYnJhcnlWaWV3LmdldFZpZXcoKS5yZWZyZXNoVmlld3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSZXNvdXJjZXMoQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlcykgewotCQlBcnJheUxpc3Q8RU9iamVjdD4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PEVPYmplY3Q+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJZWxlbWVudHMuYWRkQWxsKHJlc291cmNlLmdldENvbnRlbnRzKCkpOwotCQl9Ci0JCUxpYnJhcnlWYWxpZGF0ZUFjdGlvbiB2YWxpZGF0ZUFjdGlvbiA9IGNyZWF0ZVZhbGlkYXRlUmVzb3VyY2VBY3Rpb24oKTsKLQkJdmFsaWRhdGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVsZW1lbnRzKSk7Ci0JCXZhbGlkYXRlQWN0aW9uLnJ1bigpOwotCQlyZXR1cm4gdmFsaWRhdGVBY3Rpb24uaXNTdWNjZXNzZnVsKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3RCYXNlRm9ybUVkaXRvciNkb1NhdmUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IuZG9TYXZlOiBzYXZpbmcgY2hhbmdlcyB0byBtZXRob2QgbGlicmFyeSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlzYXZlTW9kaWZpZWRSaWNoVGV4dChtb2RpZmllZFJpY2hUZXh0KTsKLQotCQlnZXRQZXJzaXN0ZXIoKTsKLQkJdHJ5IHsKLQkJCS8vIGNoZWNrIGZvciBtb2RpZmlhYmxlCi0JCQkvLwotCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXMgPSBnZXRNb2RpZmllZFJlc291cmNlcygpOwotCi0JCQkvLyB1cGRhdGUgdmVyc2lvbiBpbmZvIGluIGxpYnJhcnkgcmVzb3VyY2UgaWYgbmVlZGVkIGJ5IGFkZGluZwotCQkJLy8gbGlicmFyeSByZXNvdXJjZSB0byBjb2xsZWN0aW9uCi0JCQkvLyBvZiBtb2RpZmllZCByZXNvdXJjZXMKLQkJCS8vCi0JCQlIYXNoU2V0PFJlc291cmNlPiByZXNvdXJjZXNUb1VwZGF0ZVZlcnNpb25JbmZvID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCQlpZiAoIW1vZGlmaWVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IFBlcnNpc3RlbmNlVXRpbAotCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJCQkJaWYgKG1lICE9IG51bGwpIHsKLQkJCQkJCU1ldGhvZExpYnJhcnkgbGliID0gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KG1lKTsKLQkJCQkJCWlmIChsaWIgIT0gbnVsbCkgewotCQkJCQkJCVJlc291cmNlIGxpYlJlc291cmNlID0gbGliLmVSZXNvdXJjZSgpOwotCQkJCQkJCWlmIChsaWJSZXNvdXJjZSAhPSBudWxsCi0JCQkJCQkJCQkmJiAhbW9kaWZpZWRSZXNvdXJjZXMuY29udGFpbnMobGliUmVzb3VyY2UpCi0JCQkJCQkJCQkmJiAhcmVzb3VyY2VzVG9VcGRhdGVWZXJzaW9uSW5mbwotCQkJCQkJCQkJCQkuY29udGFpbnMobGliUmVzb3VyY2UpCi0JCQkJCQkJCQkmJiBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJCQkJCQkJLmNoZWNrVG9vbFZlcnNpb24obGliUmVzb3VyY2UpICE9IDApIHsKLQkJCQkJCQkJcmVzb3VyY2VzVG9VcGRhdGVWZXJzaW9uSW5mby5hZGQobGliUmVzb3VyY2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwocmVzb3VyY2VzVG9VcGRhdGVWZXJzaW9uSW5mbyk7Ci0JCQl9Ci0KLQkJCUlTdGF0dXMgc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KAotCQkJCQltb2RpZmllZFJlc291cmNlcywgZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJaGFuZGxlRXJyb3Ioc3RhdHVzKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIGNoZWNrIGZvciBvdXQtb2Ytc3luY2gKLQkJCS8vCi0JCQlpZiAoY2hlY2tGaWxlQ2hhbmdlZChtb2RpZmllZFJlc291cmNlcykpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy51cGRhdGVfb3V0b2ZzeW5jaF90aXRsZTsKLQkJCQlTdHJpbmcgbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudXBkYXRlX291dG9mc3luY2hfbXNnOwotCQkJCWlmICghQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheVByb21wdCh0aXRsZSwgbXNnKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBmbGFnIHRoZSByZXNvdXJjZXMgdG8gdXBkYXRlIHZlcnNpb24gaW5mbyBhcyBtb2RpZmllZCBzbyB0aGV5Ci0JCQkvLyB3aWxsIGJlIHNhdmVkCi0JCQkvLwotCQkJaWYgKCFyZXNvdXJjZXNUb1VwZGF0ZVZlcnNpb25JbmZvLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlc1RvVXBkYXRlVmVyc2lvbkluZm8uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQlyZXNvdXJjZS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKGlzVmFsaWRhdGVSZXNvdXJjZXNCZWZvcmVTYXZlUmVxdWlyZWQoKSkgewotCQkJCS8vIHZhbGlkYXRlCi0JCQkJLy8KLQkJCQlpZighdmFsaWRhdGVSZXNvdXJjZXMobW9kaWZpZWRSZXNvdXJjZXMpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBubyB2YWxpZGF0aW9uIGJlZm9yZSBzYXZlCi0JCQkJLy8gcmVtb3ZlIGFsbCB2YWxpZGF0aW9uIGVycm9ycyBtYXJrZXJzIGFzc29jaWF0ZWQgd2l0aCBjdXJyZW50IG1ldGhvZCBlbGVtZW50Ci0JCQkJLy8KLQkJCQlMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlci5JTlNUQU5DRS5kZWxldGVNYXJrZXJzKGVsZW1lbnRPYmopOwotCQkJfQotCi0JCQkvLyBTYXZlLgotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclRpdGxlOyAKLQkJCQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMTsgCi0JCQkJCVN0cmluZyByZWFzb24gPSBlLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjEKLQkJCQkJCQk6IGUuZ2V0TWVzc2FnZSgpOyAKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQl0aXRsZSwgbXNnLCByZWFzb24sIGUpOwotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJZGlydHkgPSBmYWxzZTsKLQkJCQlhY3Rpb25NZ3Iuc2F2ZUlzRG9uZSgpOwotCQkJCWNoYW5nZVRpbWUgPSAtMTsKLQotCQkJCXVwZGF0ZVRpbWVTdGFtcHMoZ2V0VXNlZFJlc291cmNlcygpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIHJlYXNvbiA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCWlmIChTdHJVdGlsLmlzQmxhbmsocmVhc29uKSkgewotCQkJCQlyZWFzb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMjsgCi0JCQkJfQotCQkJCVN0cmluZ1dyaXRlciBkZXRhaWxzID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihkZXRhaWxzKSk7Ci0JCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclRpdGxlOyAKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMjsgCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCXRpdGxlLCBtZXNzYWdlLCByZWFzb24sIGRldGFpbHMudG9TdHJpbmcoKSwgZSk7Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQotCQkJLy8gUmVuYW1lLgotCQkJaWYgKCFyZXNvdXJjZXNUb0FkanVzdExvY2F0aW9uLmlzRW1wdHkoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5hZGp1c3RMb2NhdGlvbihyZXNvdXJjZXNUb0FkanVzdExvY2F0aW9uKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JUaXRsZTsgCi0JCQkJCVN0cmluZyB0ZW1wbGF0ZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvck1lc3NhZ2UxOyAKLQkJCQkJU3RyaW5nQnVmZmVyIGZpbGVMaXN0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXNUb0FkanVzdExvY2F0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJT2JqZWN0IG9iaiA9IEZpbGVNYW5hZ2VyLnRvRmlsZVN0cmluZyhyZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCQkJCQlpZihvYmogPT0gbnVsbCkgewotCQkJCQkJCW9iaiA9IHJlc291cmNlOwotCQkJCQkJfQotCQkJCQkJZmlsZUxpc3QuYXBwZW5kKG9iaikuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHRlbXBsYXRlLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IGZpbGVMaXN0IH0pOwotCQkJCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24xCi0JCQkJCQkJOiBlLmdldE1lc3NhZ2UoKTsgCi0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJdGl0bGUsIG1zZywgcmVhc29uLCBlKTsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0KLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3RyaW5nIHJlYXNvbiA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCQlpZiAoU3RyVXRpbC5pc0JsYW5rKHJlYXNvbikpIHsKLQkJCQkJCXJlYXNvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24yOyAKLQkJCQkJfQotCQkJCQlTdHJpbmdXcml0ZXIgZGV0YWlscyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKGRldGFpbHMpKTsKLQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yVGl0bGU7IAotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMjsgCi0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJdGl0bGUsIG1lc3NhZ2UsIHJlYXNvbiwgZGV0YWlscy50b1N0cmluZygpLCBlKTsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0KLQkJCQlyZXNvdXJjZXNUb0FkanVzdExvY2F0aW9uLmNsZWFyKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl0cnkgewotCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQlWaWV3SGVscGVyLnJlbG9hZEN1cnJlbnRMaWJhcnlPblJvbGxiYWNrRXJyb3IoZ2V0U2l0ZSgpCi0JCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZGF0ZVJlc291cmNlc0JlZm9yZVNhdmVSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5pc01vZGlmaWVkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJZ2V0UGVyc2lzdGVyKCkuc2F2ZShyZXNvdXJjZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZTsgCi0JCQkJU3RyaW5nIHRlbXBsYXRlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UxOyAKLQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQodGVtcGxhdGUsCi0JCQkJCQluZXcgT2JqZWN0W10geyByZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSB9KTsKLQkJCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24xCi0JCQkJCQk6IGUuZ2V0TWVzc2FnZSgpOyAKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJdGl0bGUsIG1zZywgcmVhc29uLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVByZXZpZXdQYWdlKCkgewotCQlDb21wb3NpdGUgcGFyZW50ID0gZ2V0Q29udGFpbmVyKCk7Ci0JCUNvbXBvc2l0ZSBwcmV2aWV3Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcHJldmlld0NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJUHJldmlld1BhZ2UgcGFnZSA9IG5ldyBQcmV2aWV3UGFnZShwcmV2aWV3Q29tcG9zaXRlKTsKLQkJcHJldmlld2VyID0gcGFnZS5nZXRQcmV2aWV3Vmlld2VyKCk7Ci0KLQkJcHJldmlld19wYWdlX2luZGV4ID0gYWRkUGFnZShwcmV2aWV3Q29tcG9zaXRlKTsKLQkJc2V0UGFnZVRleHQocHJldmlld19wYWdlX2luZGV4LCBBdXRob3JpbmdVSVJlc291cmNlcy5wcmV2aWV3UGFnZV90aXRsZSk7IAotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGxpc3RlbiB0byB0aGUgdGFiIGNoYW5nZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlKGludCBuZXdQYWdlSW5kZXgpIHsKLQkJc3VwZXIucGFnZUNoYW5nZShuZXdQYWdlSW5kZXgpOwotCi0JCWlmIChwcmV2aWV3X3BhZ2VfaW5kZXggPT0gbmV3UGFnZUluZGV4ICYmIHByZXZpZXdlciAhPSBudWxsKSB7Ci0JCQkvLyBVc2UgdGhlIGRlZmF1bHQgbGF5b3V0IG1hbmFnZXIuCi0JCQlwcmV2aWV3ZXIuc2V0TGF5b3V0TWFuYWdlcihudWxsKTsKLQkJCXByZXZpZXdlci5zaG93RWxlbWVudENvbnRlbnQoZWxlbWVudE9iaik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlydHkoKSB7Ci0JCWRpcnR5ID0gdHJ1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCX0KLQotCS8qKgotCSAqIFJlc3RvcmUgdmFsdWUgb2YgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4KLQkgKiAJCWJvb2xlYW4gdmFsdWUgdG8gaW5kaWNhdGUgd2hldGhlciBjb250cm9sIHdhcyByZXN0b3JlZCBvciBub3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtdXN0UmVzdG9yZVZhbHVlKE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHdpZGdldFRvQ2hlY2sgPT0gY29udHJvbCkgewotCQkJLy8gdGhlIGNvbnRyb2wgaXMgY3VycmVudGx5IGJlaW5nIGNoZWNrZWQgZm9yIGVkaXRhYmxlLCBidXQgdGhlcmUgaXMKLQkJCS8vIHN0aWxsIGZvY3VzIGxvc3QKLQkJCS8vIGV2ZW50IGlzIGJlaW5nIHNlbnQgb3V0IGV2ZW4gdGhlIGNoZWNrIGlzIG5vdCBjb21wbGV0ZWQgeWV0LgotCQkJLy8gcmV0dXJuIHRydWUgc28gdGhlIGZvY3VzTG9zdCgpIHdpbGwgbm90IG1ha2UgYW55IGNoYW5nZSB0byB0aGUKLQkJCS8vIGNvbnRyb2wuCi0JCQkvLwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlPYmplY3QgZWRpdENvbnRyb2wgPSBjb250cm9sOwotCQlpZiAoZWRpdENvbnRyb2wgaW5zdGFuY2VvZiBNZXRob2RSaWNoVGV4dEVkaXRvcikgewotCQkJZWRpdENvbnRyb2wgPSAoKE1ldGhvZFJpY2hUZXh0RWRpdG9yKSBjb250cm9sKS5nZXRSaWNoVGV4dENvbnRyb2woKTsKLQkJfQotCQlib29sZWFuIHJlc3RvcmUgPSB3aWRnZXRzVG9SZXN0b3JlVmFsdWUuY29udGFpbnMoZWRpdENvbnRyb2wpOwotCQlpZiAoIXJlc3RvcmUpIHsKLQkJCXN5bmNocm9uaXplZCAod2lkZ2V0c1RvUmVzdG9yZVZhbHVlKSB7Ci0JCQkJcmVzdG9yZSA9IHdpZGdldHNUb1Jlc3RvcmVWYWx1ZS5jb250YWlucyhlZGl0Q29udHJvbCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlc3RvcmUpIHsKLQkJCWlmIChlZGl0Q29udHJvbCBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQlUZXh0IHRleHQgPSAoKFRleHQpIGVkaXRDb250cm9sKTsKLQkJCQl0ZXh0LnNldFRleHQoKFN0cmluZykgdmFsdWUpOwotCQkJfSBlbHNlIGlmIChlZGl0Q29udHJvbCBpbnN0YW5jZW9mIElNZXRob2RSaWNoVGV4dCkgewotCQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IChJTWV0aG9kUmljaFRleHQpIGVkaXRDb250cm9sOwotCQkJCXJpY2hUZXh0LnNldFRleHQoKFN0cmluZykgdmFsdWUpOwotCQkJfQotCQkJd2lkZ2V0c1RvUmVzdG9yZVZhbHVlLnJlbW92ZShlZGl0Q29udHJvbCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3RvcmU7Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5IExpc3RlbmVyIAotCSAqCi0JICovCi0JcHVibGljIGNsYXNzIE1vZGlmeUxpc3RlbmVyIGltcGxlbWVudHMKLQkJCW9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXIgewotCi0JCXByaXZhdGUgRU9iamVjdCBlbGVtZW50OwotCi0JCXByaXZhdGUgYm9vbGVhbiBjaGVja0NvbnRhaW5lclJlc291cmNlOwotCi0JCXByaXZhdGUgYm9vbGVhbiBkaXNhYmxlZCA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCQkgKi8KLQkJcHVibGljIE1vZGlmeUxpc3RlbmVyKEVPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBjaGVja0NvbnRhaW5lcikgewotCQkJc3VwZXIoKTsKLQkJCWNoZWNrQ29udGFpbmVyUmVzb3VyY2UgPSBjaGVja0NvbnRhaW5lcjsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcmVzdG9yZVRleHQoT2JqZWN0IGNvbnRyb2wsIFN0cmluZyB0eHQpIHsKLQkJCWJvb2xlYW4gb2xkID0gZGlzYWJsZWQ7Ci0JCQl0cnkgewotCQkJCWRpc2FibGVkID0gdHJ1ZTsKLQkJCQlPYmplY3QgZWRpdENvbnRyb2wgPSBjb250cm9sOwotCQkJCWlmIChlZGl0Q29udHJvbCBpbnN0YW5jZW9mIE1ldGhvZFJpY2hUZXh0RWRpdG9yKSB7Ci0JCQkJCWVkaXRDb250cm9sID0gKChNZXRob2RSaWNoVGV4dEVkaXRvcikgY29udHJvbCkKLQkJCQkJCQkuZ2V0UmljaFRleHRDb250cm9sKCk7Ci0JCQkJfQotCQkJCWlmIChlZGl0Q29udHJvbCBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQkJVGV4dCB0ZXh0ID0gKChUZXh0KSBlZGl0Q29udHJvbCk7Ci0JCQkJCXRleHQuc2V0VGV4dCh0eHQpOwotCQkJCX0gZWxzZSBpZiAoZWRpdENvbnRyb2wgaW5zdGFuY2VvZiBJTWV0aG9kUmljaFRleHQpIHsKLQkJCQkJSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0ID0gKElNZXRob2RSaWNoVGV4dCkgZWRpdENvbnRyb2w7Ci0JCQkJCXJpY2hUZXh0LnNldFRleHQodHh0KTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWRpc2FibGVkID0gb2xkOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGNoZWNrRWRpdChFT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBjb250cm9sLAotCQkJCWJvb2xlYW4gY2hlY2tDb250YWluZXJSZXNvdXJjZSkgewotCQkJLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCB3aWRnZXQgc28gbXVzdFJlc3RvcmVWYWx1ZSgpIGNhbgotCQkJLy8gdXNlIGl0IHRvIGNoZWNrCi0JCQkvLyB3aGV0aGVyIGEgZm9jdXMgbG9zdCBldmVudCBpcyB0cmlnZ2VyZWQgZHVyaW5nIGEgY2hlY2tFZGl0LgotCQkJLy8gbXVzdFJlc3RvcmVWYWx1ZSgpIHRoZW4KLQkJCS8vIHJldHVybnMgdHJ1ZSBzbyBmb2N1c0xvc3QoKSB3aWxsIG5vdCB0cnkgdG8gbWFrZSBjaGFuZ2UgdG8gdGhlCi0JCQkvLyB2YWx1ZSBib3VuZCB0byB0aGUgd2lkZ2V0Ci0JCQkvLwotCQkJd2lkZ2V0VG9DaGVjayA9IGNvbnRyb2w7Ci0JCQl0cnkgewotCQkJCWlmIChERUJVRykgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IuY2hlY2tFZGl0OiBlbnRlciwgY29udHJvbD0iICsgY29udHJvbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQkJCWlmICh3aWRnZXRzVG9SZXN0b3JlVmFsdWUuY29udGFpbnMoY29udHJvbCkpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLmNoZWNrRWRpdDogd2lkZ2V0IGZvdW5kIGluIHdpZGdldHNUb1Jlc3RvcmVWYWx1ZSwgZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXN5bmNocm9uaXplZCAod2lkZ2V0c1RvUmVzdG9yZVZhbHVlKSB7Ci0JCQkJCWlmICh3aWRnZXRzVG9SZXN0b3JlVmFsdWUuY29udGFpbnMoY29udHJvbCkpIHsKLQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLmNoZWNrRWRpdDogd2lkZ2V0IGZvdW5kIGluIHdpZGdldHNUb1Jlc3RvcmVWYWx1ZSwgZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQotCQkJCQlzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChlbGVtZW50LCBnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0KLQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIElSaWNoVGV4dCkgewotCQkJCQkJCSgoSVJpY2hUZXh0KSBjb250cm9sKS5yZXN0b3JlVGV4dCgpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpZiAoY29udHJvbCA9PSBjdXJyZW50RmVhdHVyZUVkaXRvcikgewotCQkJCQkJCQlyZXN0b3JlVGV4dChjb250cm9sLCAoU3RyaW5nKSBlbGVtZW50Ci0JCQkJCQkJCQkJLmVHZXQoY3VycmVudEVkaXRlZEZlYXR1cmUpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBBZGQgdGhlIGNvbnRyb2wgdG8gdGhlIGxpc3Qgb2Ygd2lkZ2V0cyB3aG9zZQotCQkJCQkJCQkvLyB2YWx1ZSBuZWVkcwotCQkJCQkJCQkvLyB0byBiZSByZXN0b3JlZCB0byB0aGUgb3JpZ2luYWwgb25lLi4KLQkJCQkJCQkJd2lkZ2V0c1RvUmVzdG9yZVZhbHVlLmFkZChjb250cm9sKTsKLQkJCQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLmNoZWNrRWRpdDogYWRkZWQgd2lkZ2V0IHRvIHdpZGdldHNUb1Jlc3RvcmVWYWx1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoY2hlY2tDb250YWluZXJSZXNvdXJjZSkgewotCQkJCQkJaWYgKGVsZW1lbnQuZUNvbnRhaW5lcigpICE9IG51bGwKLQkJCQkJCQkJJiYgZWxlbWVudC5lQ29udGFpbmVyKCkuZVJlc291cmNlKCkgIT0gZWxlbWVudAotCQkJCQkJCQkJCS5lUmVzb3VyY2UoKSkgewotCQkJCQkJCXN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KGVsZW1lbnQuZUNvbnRhaW5lcigpLAotCQkJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCQkvLyAvLyBBZGQgdGhlIGNvbnRyb2wgdG8gdGhlIGxpc3Qgb2Ygd2lkZ2V0cwotCQkJCQkJCQkvLyB3aG9zZSB2YWx1ZQotCQkJCQkJCQkvLyAvLyBuZWVkcyB0byBiZSByZXN0b3JlZCB0byB0aGUgb3JpZ2luYWwgb25lLgotCQkJCQkJCQkvLyBpZiAoZGVidWcpIHsKLQkJCQkJCQkJLy8gU3lzdGVtLm91dAotCQkJCQkJCQkvLyAucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5jaGVja0VkaXQ6Ci0JCQkJCQkJCS8vIGFkZGVkIHdpZGdldCB0byB3aWRnZXRzVG9SZXN0b3JlVmFsdWUiKTsKLQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkvLyB9Ci0JCQkJCQkJCWlmIChjb250cm9sIGluc3RhbmNlb2YgSVJpY2hUZXh0KSB7Ci0JCQkJCQkJCQkoKElSaWNoVGV4dCkgY29udHJvbCkucmVzdG9yZVRleHQoKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWlmIChjb250cm9sID09IGN1cnJlbnRGZWF0dXJlRWRpdG9yKSB7Ci0JCQkJCQkJCQkJcmVzdG9yZVRleHQoY29udHJvbCwgKFN0cmluZykgZWxlbWVudAotCQkJCQkJCQkJCQkJLmVHZXQoY3VycmVudEVkaXRlZEZlYXR1cmUpKTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJd2lkZ2V0c1RvUmVzdG9yZVZhbHVlLmFkZChjb250cm9sKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXREaWFsb2dfdGl0bGUsIAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXREaWFsb2dfbXNnQ2Fubm90RWRpdCwgCi0JCQkJCQkJc3RhdHVzKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXJldHVybiB0cnVlOwotCQkJfSBmaW5hbGx5IHsKLQkJCQkvLyBjbGVhciB0aGUgcmVmZXJlbmNlIHdoZW4gdGhlIGNoZWNrIGlzIGRvbmUKLQkJCQkvLwotCQkJCXdpZGdldFRvQ2hlY2sgPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lciNtb2RpZnlUZXh0KE1vZGlmeUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lci5tb2RpZnlUZXh0OiBlbnRlciwgZGlzYWJsZWQ9IiArIGRpc2FibGVkKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKCFkaXNhYmxlZCAmJiBlbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoZS53aWRnZXQgPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJT2JqZWN0IHdpZGdldCA9IGUud2lkZ2V0OwotCQkJCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBCcm93c2VyKSB7Ci0JCQkJCXdpZGdldCA9ICgoQnJvd3Nlcikgd2lkZ2V0KQotCQkJCQkJCS5nZXREYXRhKElNZXRob2RSaWNoVGV4dC5QUk9QRVJUWV9OQU1FKTsKLQkJCQkJaWYgKHdpZGdldCA9PSBudWxsKSB7Ci0JCQkJCQl3aWRnZXQgPSBlLndpZGdldDsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyLm1vZGlmeVRleHQ6IHdpZGdldD0iICsgd2lkZ2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJCWlmICh3aWRnZXRzVG9SZXN0b3JlVmFsdWUuY29udGFpbnMod2lkZ2V0KSkgewotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIubW9kaWZ5VGV4dDogd2lkZ2V0IGZvdW5kIGluIHdpZGdldHNUb1Jlc3RvcmVWYWx1ZSwgZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmICghY2hlY2tFZGl0KGVsZW1lbnQsIHdpZGdldCwgY2hlY2tDb250YWluZXJSZXNvdXJjZSkpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyLm1vZGlmeVRleHQ6IGNoZWNrRWRpdCBmYWlsZWQsIGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgSU1ldGhvZFJpY2hUZXh0KSB7Ci0JCQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IChJTWV0aG9kUmljaFRleHQpIHdpZGdldDsKLQkJCQkJc2V0TW9kaWZpZWRSaWNoVGV4dChyaWNoVGV4dCk7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lci5tb2RpZnlUZXh0OiBhZGRpbmcgdG8gbW9kaWZpZWRSaWNoVGV4dHMgbGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyLm1vZGlmeVRleHQ6IG1hcmtpbmcgZWRpdG9yIGFzIGRpcnR5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJc2V0RGlydHkoKTsKLQkJCX0KLQotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIubW9kaWZ5VGV4dDogZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogU2V0cyB0aGUgdW5kZXJseWluZyBtb2RlbCBlbGVtZW50LgotCQkgKiAKLQkJICogQHBhcmFtIGVsZW1lbnQKLQkJICogICAgICAgICAgICBBIG1ldGhvZCBlbGVtZW50LgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0RWxlbWVudChFT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogU2V0cyB0aGUgZGlzYWJsZSBmbGFnLgotCQkgKiAKLQkJICogQHBhcmFtIGRpc2FibGVkCi0JCSAqICAgICAgICAgICAgSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGlnbm9yZSB0aGUgbW9kaWZ5IGV2ZW50cy4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldERpc2FibGUoYm9vbGVhbiBkaXNhYmxlZCkgewotCQkJdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBuZXcgaW5zdGFuY2Ugb2YgTW9kaWZ5TGlzdGVuZXIgdGhhdCBzdXBwb3J0cyB0ZWFtIGFuZCBDTQotCSAqIGludGVncmF0aW9uIEFueSBjb250cm9sIGluIHRoZSBlZGl0b3IsIGlmIGl0IG5lZWRzIGEgTW9kaWZ5TGlzdGVuZXIsIG11c3QKLQkgKiB1c2Ugb25lIGNyZWF0ZWQgYnkgdGhpcyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZU9iagotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTW9kaWZ5TGlzdGVuZXIgY3JlYXRlTW9kaWZ5TGlzdGVuZXIoRU9iamVjdCBlT2JqKSB7Ci0JCXJldHVybiBjcmVhdGVNb2RpZnlMaXN0ZW5lcihlT2JqLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBuZXcgaW5zdGFuY2Ugb2YgTW9kaWZ5TGlzdGVuZXIgdGhhdCBzdXBwb3J0cyB0ZWFtIGFuZCBDTQotCSAqIGludGVncmF0aW9uIEFueSBjb250cm9sIGluIHRoZSBlZGl0b3IsIGlmIGl0IG5lZWRzIGEgTW9kaWZ5TGlzdGVuZXIsIG11c3QKLQkgKiB1c2Ugb25lIGNyZWF0ZWQgYnkgdGhpcyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZU9iagotCSAqIEBwYXJhbSBjaGVja0NvbnRhaW5lcgotCSAqICAgICAgICAgICAgaWYgdHJ1ZSB3aWxsIGNoZWNrIHRoZSBjb250YWluZXIgb2YgdGhlIGdpdmVuIG9iamVjdCBmb3IKLQkgKiAgICAgICAgICAgIGVkaXRhYmxlIGFzIHdlbGwgd2hlbiBjaGVja2luZyB0aGUgZ2l2ZW4gb2JqZWN0IGZvciBlZGl0YWJsZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCU1vZGlmeSBMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBNb2RpZnlMaXN0ZW5lciBjcmVhdGVNb2RpZnlMaXN0ZW5lcihFT2JqZWN0IGVPYmosCi0JCQlib29sZWFuIGNoZWNrQ29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgTW9kaWZ5TGlzdGVuZXIoZU9iaiwgY2hlY2tDb250YWluZXIpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNwZWNpZmllZCBjb250cm9sIHRvIGJlIHRoZSBjdXJyZW50IGVkaXRvciBvZiB0aGUgc3BlY2lmaWVkCi0JICogZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoT2JqZWN0IGNvbnRyb2wsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQljdXJyZW50RmVhdHVyZUVkaXRvciA9IGNvbnRyb2w7Ci0JCWN1cnJlbnRFZGl0ZWRGZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb25pdG9yQ2hhbmdlKCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeQotCQkJCS5nZXRFeHRlbnNpb25Qb2ludCgib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucmVmcmVzaFByb3ZpZGVycyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChwb2ludCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IHBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiZXh0ZW5zaW9uOiBVSUQ9IiArIGV4dGVuc2lvbi5nZXRVbmlxdWVJZGVudGlmaWVyKCkgKyAiLCAiICsgZXh0ZW5zaW9uKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgcmVzb3VyY2UgdG8gYWRqdXN0IGxvY2F0aW9uCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgYWRkUmVzb3VyY2VUb0FkanVzdExvY2F0aW9uKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJlc291cmNlc1RvQWRqdXN0TG9jYXRpb24uYWRkKHJlc291cmNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRVc2VkRmVhdHVyZXMoKSB7Ci0JCXJldHVybiBlbGVtZW50T2JqLmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHJlc291cmNlcyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcgdXNlZCBieSB0aGlzIGVkaXRvcnMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQlsaXN0IG9mIHVzZWQgcmVzb3VyY2VzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0VXNlZFJlc291cmNlcygpIHsKLQkJSGFzaFNldDxSZXNvdXJjZT4gcmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZWxlbWVudE9iai5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQl9Ci0JCUxpc3QgYWxsRmVhdHVyZXMgPSBnZXRVc2VkRmVhdHVyZXMoKTsKLQkJZm9yIChpbnQgaSA9IGFsbEZlYXR1cmVzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGFsbEZlYXR1cmVzCi0JCQkJCS5nZXQoaSk7Ci0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUxpc3QgdmFsdWVzID0gKExpc3QpIGVsZW1lbnRPYmouZUdldChmZWF0dXJlKTsKLQkJCQlmb3IgKGludCBqID0gdmFsdWVzLnNpemUoKSAtIDE7IGogPiAtMTsgai0tKSB7Ci0JCQkJCUVPYmplY3QgdmFsdWUgPSAoRU9iamVjdCkgdmFsdWVzLmdldChqKTsKLQkJCQkJaWYgKHZhbHVlLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJCXJlc291cmNlcy5hZGQodmFsdWUuZVJlc291cmNlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50T2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRU9iamVjdAotCQkJCQkJJiYgKHJlc291cmNlID0gKChFT2JqZWN0KSB2YWx1ZSkuZVJlc291cmNlKCkpICE9IG51bGwpIHsKLQkJCQkJcmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWxhc3RVc2VkUmVzb3VyY2VzID0gcmVzb3VyY2VzOwotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCXByaXZhdGUgTWFwIGdldFVSSVRvVXNlZFJlc291cmNlTWFwKCkgewotCQlIYXNoTWFwPFVSSSwgUmVzb3VyY2U+IG1hcCA9IG5ldyBIYXNoTWFwPFVSSSwgUmVzb3VyY2U+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFVzZWRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCW1hcC5wdXQocmVzb3VyY2UuZ2V0VVJJKCksIHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUVycm9yKElTdGF0dXMgc3RhdHVzKSB7Ci0JCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5KAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQsIAotCQkJCXN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyB0aGUgYWN0aXZhdGlvbiBvZiB0aGlzIHZpZXcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGUoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkvLyBUT0RPOiBSZXZpZXcgaW1wbGVtZW50YXRpb24uCi0JCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBtZXRob2QgbGlicmFyeSBvcGVuIGlzIG5vdCBjbG9zZWQuCi0JCVhNSUxpYnJhcnlVdGlsLm9wZW5NZXRob2RMaWJyYXJ5UHJvamVjdChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkKLQkJCQkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJaWYgKGNoZWNrRmlsZUNoYW5nZWRSZXF1aXJlZCkgewotCQkJQ29sbGVjdGlvbiB1c2VkUmVzb3VyY2VzID0gZ2V0VXNlZFJlc291cmNlcygpOwotCQkJaWYgKGNoZWNrRmlsZUNoYW5nZWQodXNlZFJlc291cmNlcykpIHsKLQkJCQloYW5kbGVGaWxlQ2hhbmdlZCh1c2VkUmVzb3VyY2VzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIGEgZGlhbG9nIHRoYXQgYXNrcyBpZiBjb25mbGljdGluZyBjaGFuZ2VzIHNob3VsZCBiZSBkaXNjYXJkZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRGlydHlDb25mbGljdCgpIHsKLQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX0ZpbGVDb25mbGljdF9sYWJlbDsKLQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLl9XQVJOX0ZpbGVDb25mbGljdDsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5UHJvbXB0KAotCQkJCXRpdGxlLCBtc2cpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgY2hhbmdlZCByZXNvdXJjZXMgd2hlbiB0aGlzIHZpZXcgaXMgYWN0aXZhdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoKSB7Ci0JCWlmICgoZWxlbWVudE9iai5lSXNQcm94eSgpIHx8ICFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkKLQkJCQkmJiAoIWlzRGlydHkoKSB8fCBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpKSB7Ci0JCQkvLyBlZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7Ci0KLQkJCS8vIGZvciAoSXRlcmF0b3IgaSA9IGNoYW5nZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkvLyBSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaS5uZXh0KCk7Ci0JCQkvLyBpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJLy8gaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCS8vIHRyeSB7Ci0JCQkvLyAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXNvdXJjZSkucmVsb2FkKG51bGwpOwotCQkJLy8gfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gZWxzZSB7Ci0JCQkvLyByZXNvdXJjZS51bmxvYWQoKTsKLQkJCS8vIHRyeSB7Ci0JCQkvLyByZXNvdXJjZS5sb2FkKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCQkvLyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBpbnB1dCBpcyB2YWxpZCBvciBub3QKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lucHV0VmFsaWQoKSB7Ci0JCWlmIChlbGVtZW50T2JqICE9IG51bGwgJiYgZWxlbWVudE9iai5lSXNQcm94eSgpKSB7Ci0JCQlFT2JqZWN0IGUgPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb2x2ZShlbGVtZW50T2JqKTsKLQkJCXJldHVybiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgIWUuZUlzUHJveHkoKSAmJiBVbWFVdGlsCi0JCQkJCS5nZXRNZXRob2RMaWJyYXJ5KGUpID09IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVBhZ2VzKCkgewotCQl3aGlsZSAoZ2V0UGFnZUNvdW50KCkgPiAwKSB7Ci0JCQlyZW1vdmVQYWdlKDApOwotCQl9Ci0JCWFkZFBhZ2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBjcmVhdGVJbnB1dChNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQoZSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlZnJlc2goZmluYWwgYm9vbGVhbiBmb3JjZSkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksCi0JCQkJbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUNvbGxlY3Rpb24gdXNlZFJlc291cmNlcyA9IGxhc3RVc2VkUmVzb3VyY2VzOwotCQkJCQkJaWYgKCFmb3JjZSAmJiAhZWxlbWVudE9iai5lSXNQcm94eSgpCi0JCQkJCQkJCSYmICFjaGVja1JlbG9hZGVkKHVzZWRSZXNvdXJjZXMpKSB7Ci0JCQkJCQkJLy8gbm8gcmVzb3VyY2UgcmVsb2FkZWQsIG5vIG5lZWQgdG8gcmVmcmVzaAotCQkJCQkJCS8vCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJaW50IGFjdGl2ZVBhZ2VJbmRleCA9IGdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJCW1vZGlmaWVkUmljaFRleHQgPSBudWxsOwotCQkJCQkJaWYgKGlzRGlydHkoKSkgewotCQkJCQkJCWFjdGlvbk1nci51bmRvQWxsKCk7Ci0JCQkJCQkJZGlydHkgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCWlmIChlbGVtZW50T2JqLmVJc1Byb3h5KCkpIHsKLQkJCQkJCQllbGVtZW50T2JqLmVBZGFwdGVycygpLnJlbW92ZShuYW1lQ2hhbmdlZExpc3RlbmVyKTsKLQkJCQkJCQlFT2JqZWN0IGUgPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb2x2ZSgKLQkJCQkJCQkJCWVsZW1lbnRPYmopOwotCQkJCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJCQkJJiYgIWUuZUlzUHJveHkoKQotCQkJCQkJCQkJJiYgVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KGUpID09IExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkJCQkJCS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKSB7Ci0JCQkJCQkJCXNldElucHV0KGNyZWF0ZUlucHV0KChNZXRob2RFbGVtZW50KSBlKSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gaW5wdXQgZWxlbWVudCBpcyBpbnZhbGlkLCBjbG9zZSB0aGUgZWRpdG9yCi0JCQkJCQkJCS8vCi0JCQkJCQkJCWNsb3NlKGZhbHNlKTsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXVwZGF0ZVRpbWVTdGFtcHModXNlZFJlc291cmNlcyk7Ci0JCQkJCQl1cGRhdGVQYWdlcygpOwotCQkJCQkJaWYgKGFjdGl2ZVBhZ2VJbmRleCAhPSAtMSkgewotCQkJCQkJCXNldEFjdGl2ZVBhZ2UoYWN0aXZlUGFnZUluZGV4KTsKLQkJCQkJCX0KLQkJCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhlIGVkaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCS8vIHNhdmUgY2hhbmdlZCByZXNvdXJjZXMgYmVmb3JlIHJlZnJlc2ggc28gYWN0aW9uIG1hbmFnZXIgd2lsbCBub3QgdHJ5Ci0JCS8vIHRvIHNhdmUgdGhlc2UgY2hhbmdlZCByZXNvdXJjZXMKLQkJLy8KLQkJY2hhbmdlZFJlc291cmNlcy5hZGRBbGwoUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7Ci0JCXJlZnJlc2goZmFsc2UpOwotCQljaGFuZ2VkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBQdWJsaWMgbWV0aG9kIHRvIHJlZnJlc2ggZWRpdG9yIHRpdGxlIGltYWdlIG9uIGNlcnRhaW4gYWN0aW9uLgotCSAqIGUuZy4gSWYgbWV0aG9kUGx1Z2luIGlzIGxvY2tlZCwgZWRpdG9yIHRpdGxlIGltYWdlIHNob3VsZCBiZSBncmV5LWVkIG91dC4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hUaXRsZUltYWdlKCkgewotCQlpZiAoZk1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyICE9IG51bGwpCi0JCQlmTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIudXBkYXRlRWRpdG9ySW1hZ2UoZWxlbWVudE9iaik7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlZFRpdGxlSW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKLQkJc2V0VGl0bGVJbWFnZShpbWFnZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kRWxlbWVudEVkaXRvcklucHV0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzUxOWU1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLklNZXRob2RFbGVtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLQotCi0vKioKLSAqIEFuIGVkaXRvciBpbnB1dCBmb3IgbWV0aG9kIGVsZW1lbnQgZWRpdG9yCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IGltcGxlbWVudHMgSUVkaXRvcklucHV0LCBJTWV0aG9kRWxlbWVudFByb3ZpZGVyIHsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50OwotCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gbnVsbDsKLQotCXB1YmxpYyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCW1ldGhvZEVsZW1lbnQgPSBlOwotCX0KLQotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2V4aXN0cygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0SW1hZ2VEZXNjcmlwdG9yKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50LmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRQZXJzaXN0YWJsZSgpCi0JICovCi0JcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFRvb2xUaXBUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGdldENsYXNzKCkuaXNJbnN0YW5jZShvYmopKSB7Ci0JCQlyZXR1cm4gbWV0aG9kRWxlbWVudCA9PSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgb2JqKQotCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZExpYnJhcnlFZGl0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZExpYnJhcnlFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDk5NTAwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RMaWJyYXJ5RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZUlPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLS8qKgotICogVGhlIG1ldGhvZCBsaWJyYXJ5IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeUVkaXRvciBleHRlbmRzIE1ldGhvZEVsZW1lbnRFZGl0b3IgewotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3Ijc2V0UGFydE5hbWUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnROYW1lKCkgewotCQlTdHJpbmcgcGFydE5hbWUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5NZXRob2RMaWJyYXJ5RWRpdG9yX3RpdGxlOyAvLyROT04tTkxTLTEkCi0JCWlmIChlbGVtZW50T2JqLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQlwYXJ0TmFtZSArPSBlbGVtZW50T2JqLmdldE5hbWUoKTsKLQkJCTsKLQkJfQotCQlzZXRQYXJ0TmFtZShwYXJ0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciNhZGRQYWdlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXRyeSB7Ci0JCQlhZGRQYWdlKG5ldyBNZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZSh0aGlzKSk7Ci0JCQljcmVhdGVQcmV2aWV3UGFnZSgpOwotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBDbG9zZSBhbGwgdGhlIGVkaXRvcnMuCi0JCWdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VBbGxFZGl0b3JzKGZhbHNlKTsKLQotCQkvLyBDbGVhciB0aGUgTGlicmFyeSBWaWV3LgotCQlMaWJyYXJ5Vmlldy5nZXRWaWV3KCkuc2V0SW5wdXRGb3JWaWV3ZXIobnVsbCk7Ci0KLQkJdHJ5IHsKLQkJCS8vIENsb3NlIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jbG9zZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciNkb1NhdmUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yCi0JCQkJCS5iZWdpblRhc2soCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlbW9kZWxsaWJyYXJ5LCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0KLQkJCXRyeSB7Ci0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zYXZlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlTdHJpbmcgZXJyTXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJfc2F2ZTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBlcnJEZXRhaWxzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoZXguZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCQkJZXJyRGV0YWlscyA9IGV4LmdldE1lc3NhZ2UoKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAoZXggaW5zdGFuY2VvZiBNdWx0aUZpbGVJT0V4Y2VwdGlvbikgewotCQkJCQlPYmplY3QgdHJvdWJsZU9iaiA9ICgoTXVsdGlGaWxlSU9FeGNlcHRpb24pIGV4KQotCQkJCQkJCS5nZXRUcm91YmxlT2JqZWN0KCk7Ci0JCQkJCWlmICh0cm91YmxlT2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJZXJyRGV0YWlscyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1ldGhvZExpYnJhcnlFZGl0b3JfdHJvdWJsZW9iamVjdCArIE11bHRpRmlsZVNhdmVVdGlsLmdldFBhdGgoKE1ldGhvZEVsZW1lbnQpIHRyb3VibGVPYmopOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5NZXRob2RMaWJyYXJ5RWRpdG9yX2Vycm9yX2RpYWxvZ190aXRsZTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBwcm9ibGVtID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c7IC8vJE5PTi1OTFMtMSQKLQkJCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgcHJvYmxlbSwgZXJyTXNnLCBlcnJEZXRhaWxzKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBmaW5hbGx5IHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlyZXR1cm4gbWFuYWdlciAhPSBudWxsID8gbWFuYWdlci5pc01ldGhvZExpYnJhcnlNb2RpZmllZCgpIDogZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RSaWNoVGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kUmljaFRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjJmZjEzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RSaWNoVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0RpYWdub3N0aWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWxlbWVudExpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5SaWNoVGV4dENvbnRlbnRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLk1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uaHRtbC5IVE1MRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRGVjb3JhdGVkRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRmllbGREZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogQSBNZXRob2QgRWRpdG9yIFJpY2ggVGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUmljaFRleHQgZXh0ZW5kcyBSaWNoVGV4dCBpbXBsZW1lbnRzIElNZXRob2RSaWNoVGV4dCB7Ci0KLQkvLyBUaGUgbWV0aG9kIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQ7Ci0JCi0JLy8gdGhlIE1ldGhvZEVsZW1lbnQncyBDb250ZW50RGVzY3JpcHRpb24KLQlwcml2YXRlIENvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb247Ci0KLQkvLyBUaGUgbW9kYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCXByaXZhdGUgRU9iamVjdCBtb2RhbE9iamVjdDsKLQotCS8vIFRoZSBtb2RhbCBvYmplY3QgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBtb2RhbE9iamVjdEZlYXR1cmU7Ci0KLQkvLyBUaGUgcmVzb3VyY2UgYmVpbmcgZWRpdGVkICAgICAgIAotCXByb3RlY3RlZCBSZXNvdXJjZSByZXNvdXJjZTsKLQkKLQkvLyB0aGUgZGVjb3JhdGVkRmllbGQgbGFiZWwKLQlwcm90ZWN0ZWQgRGVjb3JhdGVkRmllbGQgbGFiZWw7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEZpZWxkRGVjb3JhdGlvbiBlcnJvckZpZWxkRGVjb3JhdGlvbiA9IEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRGaWVsZERlY29yYXRpb24oRmllbGREZWNvcmF0aW9uUmVnaXN0cnkuREVDX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JLy8gRmllbGQgbmFtZSBiZWluZyBlZGl0ZWQKLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBGaWVsZCBuYW1lIGJlaW5nIGVkaXRlZCB3aXRoIHRoZSB0cmFpbGluZyA6IHJlbW92ZWQgICAgIAotCXByb3RlY3RlZCBTdHJpbmcgZmllbGROYW1lVHJpbTsKLQkKLQkvLyBtYXJrZXIgaGVscGVyCi0JcHJvdGVjdGVkIE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyIG1hcmtlckhlbHBlcjsKLQotLy8JLy8gbWFya2VyIGF0dHJpYnV0ZQotLy8JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1FVEhPRF9GSUVMRE5BTUUgPSAiTWV0aG9kRmllbGROYW1lIjsKLQotLy8JLy8gbWFya2VyIElECi0vLwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLRVJfSUQgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5tZXRob2RSaWNoVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250cm9sLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIGluaXRpYWwgc3R5bGUgZm9yIHRoZSBlZGl0b3IuCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICBUaGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBocmVmcy4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kUmljaFRleHQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBTdHJpbmcgYmFzZVBhdGgpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSwgYmFzZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHByZXNlbnRhdGlvbiBuYW1lcyBvZiBhbGwgZWxlbWVudCBsaW5rcy4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgUmljaCB0ZXh0IGVuY29kZWQgaW4gSFRNTCBmb3JtYXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyB0aWR5VGV4dChTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIudmFsaWRhdGVSaWNoVGV4dENvbnRlbnQobWV0aG9kRWxlbWVudCwgdGV4dCwKLQkJCQluZXcgUmljaFRleHRDb250ZW50VmFsaWRhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1ldGhvZCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kRWxlbWVudChNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQpIHsKLQkJdGhpcy5tZXRob2RFbGVtZW50ID0gbWV0aG9kRWxlbWVudDsKLQkJaWYgKHRoaXMubWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXRoaXMubWV0aG9kRWxlbWVudCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgdGhpcy5tZXRob2RFbGVtZW50KS5nZXRQcm9jZXNzKCk7Ci0JCX0KLQkJaWYgKHRoaXMubWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCAmJgotCQkJCSgoRGVzY3JpYmFibGVFbGVtZW50KXRoaXMubWV0aG9kRWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uKCkgIT0gbnVsbCkgeyAKLQkJCXRoaXMuY29udGVudERlc2NyaXB0aW9uID0gKChEZXNjcmliYWJsZUVsZW1lbnQpdGhpcy5tZXRob2RFbGVtZW50KS5nZXRQcmVzZW50YXRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRNb2RhbE9iamVjdCgpIHsKLQkJcmV0dXJuIG1vZGFsT2JqZWN0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RhbE9iamVjdChFT2JqZWN0IG1vZGFsT2JqZWN0KSB7Ci0JCXRoaXMubW9kYWxPYmplY3QgPSBtb2RhbE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG1vZGFsIG9iamVjdCBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0TW9kYWxPYmplY3RGZWF0dXJlKCkgewotCQlyZXR1cm4gbW9kYWxPYmplY3RGZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGFsIG9iamVjdCBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGFsT2JqZWN0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgbW9kYWxPYmplY3RGZWF0dXJlKSB7Ci0JCXRoaXMubW9kYWxPYmplY3RGZWF0dXJlID0gbW9kYWxPYmplY3RGZWF0dXJlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkgewotCQlyZXR1cm4gZmllbGROYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlY29yYXRlZEZpZWxkTGFiZWwoRGVjb3JhdGVkRmllbGQgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJbGFiZWwuYWRkRmllbGREZWNvcmF0aW9uKGVycm9yRmllbGREZWNvcmF0aW9uLAotCQkJCQlTV1QuTEVGVCB8IFNXVC5CT1RUT00sIGZhbHNlKTsKLQkJCWxhYmVsLmhpZGVEZWNvcmF0aW9uKGVycm9yRmllbGREZWNvcmF0aW9uKTsKLQkJCXVwZGF0ZUZpZWxkTmFtZUZyb21MYWJlbChsYWJlbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRlRmllbGROYW1lRnJvbUxhYmVsKERlY29yYXRlZEZpZWxkIGxhYmVsKSB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSAoKExhYmVsKWxhYmVsLmdldENvbnRyb2woKSkuZ2V0VGV4dCgpOwotCQlpZiAoIXRoaXMuZmllbGROYW1lLmVxdWFscyhmaWVsZE5hbWUpKSB7Ci0JCQl0aGlzLmZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKLQkJCWludCBjb2xvbkluZGV4ID0gZmllbGROYW1lLmluZGV4T2YoJzonKTsKLQkJCWlmIChjb2xvbkluZGV4ID09IC0xKQotCQkJCWNvbG9uSW5kZXggPSBmaWVsZE5hbWUubGVuZ3RoKCk7Ci0JCQl0aGlzLmZpZWxkTmFtZVRyaW0gPSBmaWVsZE5hbWUuc3Vic3RyaW5nKDAsIGNvbG9uSW5kZXgpLnRyaW0oKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBEZWNvcmF0ZWRGaWVsZCBsYWJlbCkgewotCQlzZXRNZXRob2RFbGVtZW50KGVsZW1lbnQpOwotCQlzZXREZWNvcmF0ZWRGaWVsZExhYmVsKGxhYmVsKTsKLQkJbWFya2VySGVscGVyID0gTWV0aG9kUmljaFRleHRNYXJrZXJIZWxwZXIuSU5TVEFOQ0U7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZm9ybWF0SFRNTChTdHJpbmcgdGV4dCwgYm9vbGVhbiBpZ25vcmVFcnJvcnMpIHsKLQkJU3RyaW5nIGZvcm1hdHRlZFRleHQ7Ci0JCXRyeSB7Ci0JCQkvLyBjbGVhciBtYXJrZXJzCi0JCQlpZiAoIWlnbm9yZUVycm9ycykKLQkJCQljbGVhck1hcmtlcnMoKTsKLQkJCS8vIENhbGwgSlRpZHkgdG8gZm9ybWF0IHRoZSBzb3VyY2UgdG8gWEhUTUwuCi0JCQlmb3JtYXR0ZWRUZXh0ID0gaHRtbEZvcm1hdHRlci5mb3JtYXRIVE1MKHRleHQpOwotCQkJaWYgKCFpZ25vcmVFcnJvcnMgJiYgaHRtbEZvcm1hdHRlci5nZXRMYXN0RXJyb3JTdHIoKSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGVycm9yU3RyaW5nID0gaHRtbEZvcm1hdHRlci5nZXRMYXN0RXJyb3JTdHIoKTsKLS8vCQkJCWxvZ2dlci5sb2dFcnJvcihlcnJvclN0cmluZyk7Ci0JCQkJLy8gY3JlYXRlIG1hcmtlcnMKLQkJCQl0cnkgewotCQkJCQljcmVhdGVNYXJrZXIoZXJyb3JTdHJpbmcpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2V4KSB7Ci0JCQkJCWxvZ2dlci5sb2dFcnJvcihjZXgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmb3JtYXR0ZWRUZXh0OwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICghaWdub3JlRXJyb3JzKQotCQkJCXJlZnJlc2hEZWNvcmF0b3JzKCk7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNsZWFyTWFya2VycygpIHsKLQkJbWFya2VySGVscGVyLmRlbGV0ZU1hcmtlcnMoY29udGVudERlc2NyaXB0aW9uLCBmaWVsZE5hbWVUcmltKTsKLSAgICAgICAgZXJyb3JGaWVsZERlY29yYXRpb24uc2V0RGVzY3JpcHRpb24oIiIpOyAvLyROT04tTkxTLTEkCi0JCWhpZGVFcnJvckRlY29yYXRpb24oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaERlY29yYXRvcnMoKSB7Ci0JCS8vIHJlZnJlc2gKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkudXBkYXRlKE1ldGhvZEVsZW1lbnRMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yLkRFQ09SQVRPUl9JRCk7Ci0JfQotCQotCQotCS8qCi0JICogVE9ETzoKLQkgKiBoYWQgdG8gdW5kbyBjaGFuZ2UgaW4gRGVzY3JpYmFibGVFbGVtZW50SW1wbCB0byBzZXQgcHJlc2VudGF0aW9uIG9uIGFueSBuZXcgb2JqCi0JICogc28gZWRpdG9yIHdpbGwgbmVlZCB0byBhc3NpZ24gcHJlc2VudGF0aW9uIHdoZW4gZmllbGQgaXMgZWRpdGVkIHNvIHRoYXQgdGhlIG1hcmtlcgotCSAqIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJlc2VudGF0aW9uJ3MgcmVzb3VyY2UKLQkgKi8KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNYXJrZXIoU3RyaW5nIGZ1bGxFcnJNc2cpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJTWF0Y2hlciBtID0gSFRNTEZvcm1hdHRlci5qVGlkeUVycm9yUGFyc2VyLm1hdGNoZXIoZnVsbEVyck1zZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJaWYgKG0uZmluZCgpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCVN0cmluZyBsb2NhdGlvbiA9IG0uZ3JvdXAoMSk7Ci0JCQlTdHJpbmcgZXJyb3JNc2cgPSBtLmdyb3VwKDQpOwotCQkJQmFzaWNEaWFnbm9zdGljIGRpYWdub3N0aWNzID0gCi0JCSAgICAgICAgICBuZXcgQmFzaWNEaWFnbm9zdGljCi0JCSAgICAgICAgICAgIChIVE1MRm9ybWF0dGVyLkRJQUdOT1NUSUNfU09VUkNFLAotCQkgICAgICAgICAgICAgMCwgZmllbGROYW1lLAotCQkgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgY29udGVudERlc2NyaXB0aW9uLCBmaWVsZE5hbWVUcmltIH0pOwotCi0JCQlkaWFnbm9zdGljcy5hZGQoIAotCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMoRGlhZ25vc3RpYy5FUlJPUiwKLQkJCQkJbG9jYXRpb24sIDAsIGVycm9yTXNnLAotCQkJCQluZXcgT2JqZWN0W10geyBjb250ZW50RGVzY3JpcHRpb24sIGZpZWxkTmFtZVRyaW0gfSkpOwotCi0JICAgICAgICBtYXJrZXJIZWxwZXIuY3JlYXRlTWFya2VycyhkaWFnbm9zdGljcyk7Ci0JICAgICAgICBlcnJvckZpZWxkRGVjb3JhdGlvbi5zZXREZXNjcmlwdGlvbihlcnJvck1zZyk7Ci0JICAgICAgICBzaG93RXJyb3JEZWNvcmF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWNsZWFyTWFya2VycygpOwotCQlyZWZyZXNoRGVjb3JhdG9ycygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzaG93RXJyb3JEZWNvcmF0aW9uKCkgewotICAgICAgICBpZiAobGFiZWwgIT0gbnVsbCkgewotICAgICAgICAJbGFiZWwuc2hvd0RlY29yYXRpb24oZXJyb3JGaWVsZERlY29yYXRpb24pOwotICAgICAgICB9Ci0JfQotCi0JcHVibGljIHZvaWQgaGlkZUVycm9yRGVjb3JhdGlvbigpIHsKLSAgICAgICAgaWYgKGxhYmVsICE9IG51bGwpIHsKLSAgICAgICAgCWxhYmVsLmhpZGVEZWNvcmF0aW9uKGVycm9yRmllbGREZWNvcmF0aW9uKTsKLSAgICAgICAgfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCS8vIGNoZWNrIGlmIGxhYmVsIHRleHQgd2FzIGNoYW5nZWQgKHRoaXMgaGFwcGVucyB3aGVuIFJURSBpcyBleHBhbmRlZCkKLQkJLy8gdGhpcyBpcyBjYWxsZWQgd2hlbiBSVEUgaXMgdG9nZ2xlZCBpbiBlZGl0b3IgLSByZWFkIG5ldyBmaWVsZE5hbWUKLQkJaWYgKHVwZGF0ZUZpZWxkTmFtZUZyb21MYWJlbChsYWJlbCkpCi0JCQloaWRlRXJyb3JEZWNvcmF0aW9uKCk7Ci0JCXN1cGVyLnNldFRleHQodGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kUmljaFRleHRFZGl0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZFJpY2hUZXh0RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAyNzYwZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kUmljaFRleHRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5NZXRob2RBZGRJbWFnZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTWV0aG9kQWRkTGlua0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHRUb29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5BZGRPcmRlcmVkTGlzdEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5BZGRUYWJsZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5BZGRVbm9yZGVyZWRMaXN0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkJvbGRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQ2xlYXJDb250ZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkNvcHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQ3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkZpbmRSZXBsYWNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkZvbnROYW1lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkZvbnRTaXplQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkZvbnRTdHlsZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5JbmRlbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuSXRhbGljQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLk91dGRlbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuUGFzdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuU3Vic2NyaXB0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlN1cGVyc2NyaXB0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlVuZGVybGluZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRGVjb3JhdGVkRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotCi0vKioKLSAqIEEgUmljaCBUZXh0IGVkaXRvciB3aXRoIGFkZGVkIGV4dGVuc2lvbnMgdG8gc3VwcG9ydCBNZXRob2QgYnJvd3NpbmcgYW5kCi0gKiBhdXRob3JpbmcuIEluY2x1ZGVzIGEgdG9vbCBiYXIgYW5kIGFuIGludGVncmF0ZWQgSFRNTCBzb3VyY2UgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUmljaFRleHRFZGl0b3IgZXh0ZW5kcyBSaWNoVGV4dEVkaXRvciBpbXBsZW1lbnRzCi0JCUlNZXRob2RSaWNoVGV4dEVkaXRvciB7Ci0KLQkvLyBUaGUgbWV0aG9kIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQ7Ci0KLQkvLyBUaGUgbW9kYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCXByaXZhdGUgRU9iamVjdCBtb2RhbE9iamVjdDsKLQotCS8vIFRoZSBtb2RhbCBvYmplY3QgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBtb2RhbE9iamVjdEZlYXR1cmU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udHJvbC4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBpbml0aWFsIHN0eWxlIGZvciB0aGUgZWRpdG9yLgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgaHJlZnMuCi0JICovCi0JcHVibGljIE1ldGhvZFJpY2hUZXh0RWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgU3RyaW5nIGJhc2VQYXRoLAotCQkJTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50LCBEZWNvcmF0ZWRGaWVsZCBsYWJlbCwgSUVkaXRvclNpdGUgZWRpdG9yU2l0ZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlLCBlZGl0b3JTaXRlLCBiYXNlUGF0aCk7Ci0JCXRoaXMubWV0aG9kRWxlbWVudCA9IG1ldGhvZEVsZW1lbnQ7Ci0JCWluaXQobWV0aG9kRWxlbWVudCwgbGFiZWwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHVuZGVybHlpbmcgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgc3R5bGUgZm9yIHRoaXMgY29udHJvbC4KLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBsaW5rcy4KLQkgKi8KLQlwcm90ZWN0ZWQgSVJpY2hUZXh0IGNyZWF0ZVJpY2hUZXh0Q29udHJvbChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsCi0JCQlTdHJpbmcgYmFzZVBhdGgpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RSaWNoVGV4dChwYXJlbnQsIHN0eWxlLCBiYXNlUGF0aCk7Ci0JfQotCi0JLyoqCi0JICogRmlsbHMgdGhlIFJpY2ggVGV4dCBlZGl0b3IgdG9vbCBiYXIgd2l0aCBhY3Rpb24gaXRlbXMuCi0JICogCi0JICogQHBhcmFtIHRvb2xCYXIKLQkgKiAgICAgICAgICAgIFRoZSBSaWNoIHRleHQgZWRpdG9yIHRvb2wgYmFyLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxUb29sQmFyKElSaWNoVGV4dFRvb2xCYXIgdG9vbEJhcikgewotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgRm9udFN0eWxlQWN0aW9uKHJpY2hUZXh0KSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBGb250TmFtZUFjdGlvbihyaWNoVGV4dCkpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgRm9udFNpemVBY3Rpb24ocmljaFRleHQpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsJCQotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQ3V0QWN0aW9uKCkpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQ29weUFjdGlvbigpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IFBhc3RlQWN0aW9uKCkpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQ2xlYXJDb250ZW50QWN0aW9uKCkpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQm9sZEFjdGlvbihyaWNoVGV4dCkpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgSXRhbGljQWN0aW9uKHJpY2hUZXh0KSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBVbmRlcmxpbmVBY3Rpb24ocmljaFRleHQpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IFN1YnNjcmlwdEFjdGlvbihyaWNoVGV4dCkpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgU3VwZXJzY3JpcHRBY3Rpb24ocmljaFRleHQpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEFkZE9yZGVyZWRMaXN0QWN0aW9uKCkpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQWRkVW5vcmRlcmVkTGlzdEFjdGlvbigpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IE91dGRlbnRBY3Rpb24oKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBJbmRlbnRBY3Rpb24oKSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBGaW5kUmVwbGFjZUFjdGlvbigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJCQlyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpLmV4ZWN1dGUocmljaFRleHQpOwotCQkJfQotCQl9KTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IE1ldGhvZEFkZExpbmtBY3Rpb24oKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBNZXRob2RBZGRJbWFnZUFjdGlvbigpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEFkZFRhYmxlQWN0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRNb2RhbE9iamVjdCgpIHsKLQkJcmV0dXJuIG1vZGFsT2JqZWN0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RhbE9iamVjdChFT2JqZWN0IG1vZGFsT2JqZWN0KSB7Ci0JCXRoaXMubW9kYWxPYmplY3QgPSBtb2RhbE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG1vZGFsIG9iamVjdCBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0TW9kYWxPYmplY3RGZWF0dXJlKCkgewotCQlyZXR1cm4gbW9kYWxPYmplY3RGZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGFsIG9iamVjdCBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGFsT2JqZWN0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgbW9kYWxPYmplY3RGZWF0dXJlKSB7Ci0JCXRoaXMubW9kYWxPYmplY3RGZWF0dXJlID0gbW9kYWxPYmplY3RGZWF0dXJlOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBEZWNvcmF0ZWRGaWVsZCBsYWJlbCkgewotCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBJTWV0aG9kUmljaFRleHQpCi0JCQkoKElNZXRob2RSaWNoVGV4dClyaWNoVGV4dCkuaW5pdChtZXRob2RFbGVtZW50LCBsYWJlbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJldmlld1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1ByZXZpZXdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxZjIzNzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJldmlld1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5FbGVtZW50SFRNTFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WaWV3Rm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotCi0vKioKLSAqIFRoZSBQcmV2aWV3IHBhZ2UgaW4gdGhlIE1ldGhvZCBFZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByZXZpZXdQYWdlIHsKLQotCXByaXZhdGUgRWxlbWVudEhUTUxWaWV3ZXIgcHJldmlld2VyID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZQotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgUHJldmlld1BhZ2UoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkvLyBVc2UgdGhlIFZpZXdGb3JtIGNvbnRyb2wgdG8gZ2l2ZSBpdCB0aGUgRWNsaXBzZSBXb3JrYmVuY2ggd2luZG93Ci0JCS8vIGxvb2sgJiBmZWVsLgotCQlWaWV3Rm9ybSB2aWV3Rm9ybSA9IG5ldyBWaWV3Rm9ybShjb21wb3NpdGUsIFNXVC5ERUZBVUxUKTsKLQkJdmlld0Zvcm0ubWFyZ2luSGVpZ2h0ID0gMDsKLQkJdmlld0Zvcm0ubWFyZ2luV2lkdGggPSAwOwotCQl2aWV3Rm9ybS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXZpZXdGb3JtLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIFNldCB0b29sYmFyCi0JCUNvbnRyb2wgdG9vbGJhciA9IGNyZWF0ZVRvb2xiYXIodmlld0Zvcm0pOwotCQl2aWV3Rm9ybS5zZXRUb3BSaWdodCh0b29sYmFyKTsKLQotCQkvLyBTZXQgY29udGVudAotCQlDb250cm9sIGNvbnRlbnQgPSBjcmVhdGVDb250ZW50KHZpZXdGb3JtKTsKLQkJdmlld0Zvcm0uc2V0Q29udGVudChjb250ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgcHJldmlldyBjb250ZW50Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIENvbnRyb2wgY3JlYXRlQ29udGVudChWaWV3Rm9ybSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRlbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJY29udGVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29udGVudC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlwcmV2aWV3ZXIgPSBuZXcgRWxlbWVudEhUTUxWaWV3ZXIoY29udGVudCk7Ci0JCXJldHVybiAoQ29udHJvbCkgY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gRWxlbWVudFZpZXdlcgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCQlWaWV3ZXIKLQkgKi8KLQlwdWJsaWMgRWxlbWVudEhUTUxWaWV3ZXIgZ2V0UHJldmlld1ZpZXdlcigpIHsKLQkJcmV0dXJuIHByZXZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgVG9vbGJhciBJdCBoYXMgR28gYmFjaywgR28gZm9yd2FyZCwgU3RvcCBhbmQgcmVmcmVzaCBidXR0b25zCi0JICogCi0JICogQHBhcmFtIFZpZXdGb3JtCi0JICogICAgICAgICAgICBwYXJlbnQKLQkgKiBAcmV0dXJuIFRvb2xiYXIKLQkgKi8KLQlwcml2YXRlIFRvb2xCYXIgY3JlYXRlVG9vbGJhcihWaWV3Rm9ybSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBicm93c2VyIG5hdmlnYXRpb24gdG9vbGJhci4KLQkJVG9vbEJhciB0b29sYmFyID0gbmV3IFRvb2xCYXIocGFyZW50LCBTV1QuRkxBVCk7Ci0KLQkJLy8gQWRkIHRoZSBCYWNrIGJ1dHRvbi4KLQkJVG9vbEl0ZW0gYmFja0J1dHRvbiA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuTk9ORSk7Ci0JCWJhY2tCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0JBQ0spOwotCQliYWNrQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJhY2tCdXR0b25fdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJYmFja0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gcHJldmlld2VyLmdldEJyb3dzZXIoKTsKLQkJCQlpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJCWJyb3dzZXIuYmFjaygpOwotCQkJCX0KLQkJCX07Ci0JCX0pOwotCi0JCS8vIEFkZCB0aGUgRm93YXJkIGJ1dHRvbi4KLQkJVG9vbEl0ZW0gZm9yd2FyZEJ1dHRvbiA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuTk9ORSk7Ci0JCWZvcndhcmRCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0ZPUldBUkQpOwotCQlmb3J3YXJkQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcndhcmRCdXR0b25fdGV4dCk7IC8vJE5PTi1OTFMtMSQJCi0JCWZvcndhcmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUJyb3dzZXIgYnJvd3NlciA9IHByZXZpZXdlci5nZXRCcm93c2VyKCk7Ci0JCQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJCQlicm93c2VyLmZvcndhcmQoKTsKLQkJCQl9Ci0JCQl9OwotCQl9KTsKLQotCQkvLyBBZGQgdGhlIFN0b3AgYnV0dG9uLgotCQlUb29sSXRlbSBzdG9wQnV0dG9uID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5OT05FKTsKLQkJc3RvcEJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfU1RPUCk7Ci0JCXN0b3BCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RvcEJ1dHRvbl90ZXh0KTsgLy8kTk9OLU5MUy0xJAkKLQkJc3RvcEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gcHJldmlld2VyLmdldEJyb3dzZXIoKTsKLQkJCQlpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJCWJyb3dzZXIuc3RvcCgpOwotCQkJCX0KLQkJCX07Ci0JCX0pOwotCi0JCS8vIEFkZCB0aGUgUmVmcmVzaCBidXR0b24uCi0JCVRvb2xJdGVtIHJlZnJlc2hCdXR0b24gPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULk5PTkUpOwotCQlyZWZyZXNoQnV0dG9uLnNldEltYWdlKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19SRUZSRVNIKTsKLQkJcmVmcmVzaEJ1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5yZWZyZXNoQnV0dG9uX3RleHQpOyAvLyROT04tTkxTLTEkCQotCQlyZWZyZXNoQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkvLyBCcm93c2VyIGJyb3dzZXIgPSBwcmV2aWV3ZXIuZ2V0QnJvd3NlcigpOwotCQkJCS8vIGlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCQkvLyBicm93c2VyLnJlZnJlc2goKTsKLQkJCQkvLyB9Ci0KLQkJCQlwcmV2aWV3ZXIucmVmcmVzaCgpOwotCQkJfTsKLQkJfSk7Ci0KLQkJLy8gQWRkIHRoZSBQcmludCBidXR0b24uCi0JCVRvb2xJdGVtIHByaW50QnV0dG9uID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5OT05FKTsKLQkJcHJpbnRCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX1BSSU5UKTsKLQkJcHJpbnRCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJpbnRCdXR0b25fdGV4dCk7IC8vJE5PTi1OTFMtMSQJCi0JCXByaW50QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlwcmV2aWV3ZXIucHJpbnQoKTsKLQkJCX07Ci0JCX0pOwotCi0JCXJldHVybiB0b29sYmFyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJvY2Vzc0VkaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJvY2Vzc0VkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZjRhMDg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1Byb2Nlc3NFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuU2V0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5SZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db3B5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5QYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuTG9jYWxUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JV29ya2JlbmNoUGFydEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeVZhbGlkYXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5NZXRob2RMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLlByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLlN5bmNocm9uaXphdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuRGlhbG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kbmQuRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5JRXh0ZW5zaW9uRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkVQRlByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLlByb2Nlc3NFZGl0b3JQYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Qcm9jZXNzVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuVmlld0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nLnBhcnQuRVBGRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQWRhcHRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Db21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlJlc291cmNlQXdhcmVQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQWN0aXZpdHlEcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Db250cmlidXRlVG9BY3Rpdml0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuTG9jYWxseVJlcGxhY2VBbmREZWVwQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUmVwbGFjZUFjdGl2aXR5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklBY3Rpb25UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkVkaXRpbmdEb21haW5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbi5TdXBwcmVzc2lvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLlByZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLkxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuUHJvY2Vzc0RlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuZG9tYWluLlRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5MaWJyYXJ5RVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuSUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3I7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBFZGl0b3IgZm9yIHByb2Nlc3MgYXV0aG9yaW5nLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRWRpdG9yIGV4dGVuZHMgTWV0aG9kRWxlbWVudEVkaXRvciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluUHJvdmlkZXIsIElNZW51TGlzdGVuZXIsIElTZWxlY3Rpb25Qcm92aWRlciwKLQkJSVZpZXdlclByb3ZpZGVyLCBJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciB7Ci0KLQkvKioKLQkgKiBUaGUgZWRpdG9yIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9JRCA9IFByb2Nlc3NFZGl0b3IuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS0ZMT1dfRURJVE9SX0lEID0gR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9FRElUT1JfSUQgPSBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUERFUEVOREVOQ1lfRURJVE9SX0lEID0gR3JhcGhpY2FsV1BEZXBlbmRlbmN5RWRpdG9yLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JLyoqIENvbHVtbiBkZXNjcmlwdG9yIGNvbnN0YW50cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19OQU1FID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUsIFByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRSksCi0JCQkzLCAyMDAsIHRydWUsIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19JRCA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCwgUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCksCi0JCQkwLCA0MCwgdHJ1ZSwgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX05PTkUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX1BSRUZJWCA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVgsCi0JCQlQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCksIDAsIDgwLCB0cnVlLAotCQkJQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX01PREVMX0lORk8gPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTywKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTyksIDAsIDEyMCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9OT05FKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfVFlQRSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFLCBQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUpLAotCQkJMCwgODAsIHRydWUsIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9OT05FKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19QUkVERUNFU1NPUlMgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMpLCAyLCAxMDAsIHRydWUsCi0JCQlDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVCk7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX0lTX1JFUEVBVEFCTEUgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSwKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSksIDEsIDYwLCB0cnVlLAotCQkJQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NIRUNLX0JPT0xFQU4pOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19JU19PTkdPSU5HID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcsCi0JCQlQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcpLCAxLCA2MCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19JU19FVkVOVF9EUklWRU4gPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4pLCAxLCA2MCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfVEVBTSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9URUFNUywgUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9URUFNUyksCi0JCQkxLCAxMDAsIHRydWUsIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19FTlRSWV9TVEFURSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURSwKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfRU5UUllfU1RBVEUpLCAxLCA2MCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfRVhJVF9TVEFURSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFKSwgMSwgNjAsIHRydWUsCi0JCQlDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVCk7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX1BSRVNFTlRBVElPTl9OQU1FID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSksIDMsIDIwMCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfREVMSVZFUkFCTEUgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfREVMSVZFUkFCTEUsCi0JCQlQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFKSwgMSwgMTAwLCB0cnVlLAotCQkJQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQpOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19JU19PUFRJT05BTCA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PUFRJT05BTCwKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUwpLCAxLCA2MCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfSVNfUExBTk5FRCA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19QTEFOTkVELAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19QTEFOTkVEKSwgMSwgNjAsIHRydWUsCi0JCQlDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTik7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTKSwgMSwgNjAsCi0JCQl0cnVlLCBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTik7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0JTX0ZPUk1fSUQgPSAid2JzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFfRk9STV9JRCA9ICJ0YnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUEJTX0ZPUk1fSUQgPSAid3BicyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNPTElEQVRFRF9GT1JNX0lEID0gImNvbnNvbGlkYXRlZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGNoYW5nZSB0aGUgZGVmYXVsdCBvcmRlciBiYXNlZCBvbiAxNTI4NjcgLSBQdWJsaXNoIG9wdGlvbiBhbmQgcHJlZnJlbmNlcwotCS8qIFdCUzogUHJlc2VudGF0aW9uIE5hbWUsIEluZGV4LCBQcmVkZWNlc3NvcnMsIE1vZGVsIEluZm8sIFR5cGUsIFBsYW5uZWQsCi0JCQlSZXBlYXRhYmxlLCBNdWx0aXBsZSBPY2N1cnJlbmNlcywgT25nb2luZywgRXZlbnQtZHJpdmVuLCBPcHRpb25hbAotCQlUQTogUHJlc2VudGF0aW9uIE5hbWUsIE1vZGVsIEluZm8sIFRlYW0sIFR5cGUsIFBsYW5uZWQsIE11bHRpcGxlCi0JCQlPY2N1cnJlbmNlcywgT3B0aW9uYWwKLQkJV29yayBQcm9kdWN0IFVzYWdlOiBQcmVzZW50YXRpb24gTmFtZSwgTW9kZWwgSW5mbywgRW50cnkgU3RhdGUsIEV4aXQgU3RhdGUsIAotCQkJRGVsaXZlcmFibGUsIFR5cGUsIFBsYW5uZWQsIE11bHRpcGxlIE9jY3VycmVuY2VzLCBPcHRpb25hbAotCSovCi0JLy8gSmluaHVhIFhpLCAwOC8yMS8yMDA2Ci0JCi0JLy8gdGhlIGRlZmF1bHQgbGlzdCBtdXN0IGJlIGF2YWlsYWJsZSBpbiB0aGUgbGlicmFyeSBwbHVnaW4gYXMgd2VsbC4KLQkvLyBkdXBsaWNhdGUgZGVmaW5pdGlvbiBmb3Igbm93LCB3aWxsIG5lZWQgdG8gbWVyZ2UgdG9nZXRoZXIgbGF0ZXIKLQkvLyBzZWUgUHJlZmVyZW5jZUNvbnN0YW50cy5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBERUZBVUxUX1RCU19DT0xVTU5TID0gQXJyYXlzCi0JCQkuYXNMaXN0KG5ldyBDb2x1bW5EZXNjcmlwdG9yW10gewotCQkJCQlDT0xfREVTQ19QUkVTRU5UQVRJT05fTkFNRSwKLQkJCQkJLy8gQ09MX0RFU0NfSUQsCi0JCQkJCS8vQ09MX0RFU0NfUFJFRklYLCAKLQkJCQkJQ09MX0RFU0NfTU9ERUxfSU5GTywgQ09MX0RFU0NfVEVBTSwgQ09MX0RFU0NfVFlQRSwKLQkJCQkJQ09MX0RFU0NfSVNfUExBTk5FRCwKLQkJCQkJQ09MX0RFU0NfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLCBDT0xfREVTQ19JU19PUFRJT05BTCB9KTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBERUZBVUxUX1dQQlNfQ09MVU1OUyA9IEFycmF5cwotCQkJLmFzTGlzdChuZXcgQ29sdW1uRGVzY3JpcHRvcltdIHsKLQkJCQkJQ09MX0RFU0NfUFJFU0VOVEFUSU9OX05BTUUsCi0JCQkJCS8vIENPTF9ERVNDX0lELAotCQkJCQkvL0NPTF9ERVNDX1BSRUZJWCwgCi0JCQkJCUNPTF9ERVNDX01PREVMX0lORk8sIENPTF9ERVNDX0VOVFJZX1NUQVRFLAotCQkJCQlDT0xfREVTQ19FWElUX1NUQVRFLCAKLQkJCQkJQ09MX0RFU0NfREVMSVZFUkFCTEUsIENPTF9ERVNDX1RZUEUsIAotCQkJCQlDT0xfREVTQ19JU19QTEFOTkVELCBDT0xfREVTQ19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMsIENPTF9ERVNDX0lTX09QVElPTkFMIH0pOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IERFRkFVTFRfV0JTX0NPTFVNTlMgPSBBcnJheXMKLQkJCS5hc0xpc3QobmV3IENvbHVtbkRlc2NyaXB0b3JbXSB7IENPTF9ERVNDX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJCQlDT0xfREVTQ19JRCwgCi0JCQkJCS8vQ09MX0RFU0NfUFJFRklYLCAKLQkJCQkJQ09MX0RFU0NfUFJFREVDRVNTT1JTLCBDT0xfREVTQ19NT0RFTF9JTkZPLAotCQkJCQlDT0xfREVTQ19UWVBFLCBDT0xfREVTQ19JU19QTEFOTkVELCAKLQkJCQkJQ09MX0RFU0NfSVNfUkVQRUFUQUJMRSwgQ09MX0RFU0NfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLCBDT0xfREVTQ19JU19PTkdPSU5HLAotCQkJCQlDT0xfREVTQ19JU19FVkVOVF9EUklWRU4sIENPTF9ERVNDX0lTX09QVElPTkFMCi0JCQkJCSB9KTsKLQotCSAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgQUxMX1dCU19DT0xVTU5TID0gbmV3IEFycmF5TGlzdCgKLQkJCURFRkFVTFRfV0JTX0NPTFVNTlMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IEFMTF9UQlNfQ09MVU1OUyA9IG5ldyBBcnJheUxpc3QoCi0JCQlERUZBVUxUX1RCU19DT0xVTU5TKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBBTExfV1BCU19DT0xVTU5TID0gbmV3IEFycmF5TGlzdCgKLQkJCURFRkFVTFRfV1BCU19DT0xVTU5TKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWFwIGlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlzdGF0aWMgewotCQlBTExfV0JTX0NPTFVNTlMuYWRkKENPTF9ERVNDX1BSRUZJWCk7Ci0JCUFMTF9UQlNfQ09MVU1OUy5hZGQoQ09MX0RFU0NfUFJFRklYKTsKLQkJQUxMX1dQQlNfQ09MVU1OUy5hZGQoQ09MX0RFU0NfUFJFRklYKTsKLQkJCi0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX05BTUUuaWQsCi0JCQkJQ09MX0RFU0NfTkFNRSk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX0lELmlkLCBDT0xfREVTQ19JRCk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX1BSRUZJWC5pZCwKLQkJCQlDT0xfREVTQ19QUkVGSVgpOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19NT0RFTF9JTkZPLmlkLAotCQkJCUNPTF9ERVNDX01PREVMX0lORk8pOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19UWVBFLmlkLAotCQkJCUNPTF9ERVNDX1RZUEUpOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19QUkVERUNFU1NPUlMuaWQsCi0JCQkJQ09MX0RFU0NfUFJFREVDRVNTT1JTKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfSVNfUkVQRUFUQUJMRS5pZCwKLQkJCQlDT0xfREVTQ19JU19SRVBFQVRBQkxFKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfSVNfT05HT0lORy5pZCwKLQkJCQlDT0xfREVTQ19JU19PTkdPSU5HKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfSVNfRVZFTlRfRFJJVkVOLmlkLAotCQkJCUNPTF9ERVNDX0lTX0VWRU5UX0RSSVZFTik7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX1RFQU0uaWQsCi0JCQkJQ09MX0RFU0NfVEVBTSk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX0VOVFJZX1NUQVRFLmlkLAotCQkJCUNPTF9ERVNDX0VOVFJZX1NUQVRFKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfRVhJVF9TVEFURS5pZCwKLQkJCQlDT0xfREVTQ19FWElUX1NUQVRFKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoCi0JCQkJQ09MX0RFU0NfUFJFU0VOVEFUSU9OX05BTUUuaWQsIENPTF9ERVNDX1BSRVNFTlRBVElPTl9OQU1FKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfREVMSVZFUkFCTEUuaWQsCi0JCQkJQ09MX0RFU0NfREVMSVZFUkFCTEUpOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19JU19PUFRJT05BTC5pZCwKLQkJCQlDT0xfREVTQ19JU19PUFRJT05BTCk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX0lTX1BMQU5ORUQuaWQsCi0JCQkJQ09MX0RFU0NfSVNfUExBTk5FRCk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KAotCQkJCUNPTF9ERVNDX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUy5pZCwKLQkJCQlDT0xfREVTQ19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMpOwotCi0JCUFMTF9XQlNfQ09MVU1OUy5hZGQoQ09MX0RFU0NfTkFNRSk7Ci0JCUFMTF9UQlNfQ09MVU1OUy5hZGQoQ09MX0RFU0NfTkFNRSk7Ci0JCUFMTF9XUEJTX0NPTFVNTlMuYWRkKENPTF9ERVNDX05BTUUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gYWRkQWRhcHRlckZhY3RvcnlMaXN0ZW5lcnMgPSBmYWxzZTsKLQotCS8qKgotCSAqIEFjdGlvbiBiYXIgY29udHJpYnR1dG9yIGZvciBwcm9jZXNzIGVkaXRvcgotCSAqIAotCSAqCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBCU0FjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMKLQkJCU1ldGhvZExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciB7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbiByZWdpc3RlcmVkQWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwcml2YXRlIGJvb2xlYW4gbG9ja2VkOwotCi0JCXByaXZhdGUgSUFjdGlvbiByb2xsdXBBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxVcCkgeyAKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWJvb2xlYW4gd2FzUm9sbGVkVXAgPSBic0l0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCk7Ci0JCQkJYnNJdGVtUHJvdmlkZXIuc2V0Um9sbGVkVXAoIWJzSXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKSk7Ci0JCQkJKChJQ2hhbmdlTm90aWZpZXIpIGJzSXRlbVByb3ZpZGVyKQotCQkJCQkJLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24oCi0JCQkJCQkJCW5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLQkJCQkJCQkJCQkoSW50ZXJuYWxFT2JqZWN0KSBzZWxlY3RlZEFjdGl2aXR5LAotCQkJCQkJCQkJCU5vdGlmaWNhdGlvbi5BREQsIG51bGwsIG51bGwsIG51bGwsCi0JCQkJCQkJCQkJZmFsc2UpLCBzZWxlY3RlZEFjdGl2aXR5LCB0cnVlLCBmYWxzZSkpOwotCQkJCQotCQkJCWlmIChic0l0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCS8vIFJlZnJlc2hpbmcgZm9yIGdyZWVuIGFjdGl2aXRpZXMgZHVyaW5nIHJvbGx1cAotCQkJCQlEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciBwcm92aWRlciA9IChEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcikgYnNJdGVtUHJvdmlkZXI7Ci0JCQkJCXByb3ZpZGVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24oCi0JCQkJCQluZXcgTm90aWZpY2F0aW9uSW1wbChOb3RpZmljYXRpb24uU0VULCBwcm92aWRlciwKLQkJCQkJCQkJcHJvdmlkZXIpLCBwcm92aWRlciwgdHJ1ZSwgZmFsc2UpKTsKLQkJCQl9Ci0JCQkJaWYgKHdhc1JvbGxlZFVwKSB7Ci0JCQkJCVByb2Nlc3NWaWV3ZXIgdmlld2VyID0gKFByb2Nlc3NWaWV3ZXIpICgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKS5jdXJyZW50Vmlld2VyOwotCQkJCQl2aWV3ZXIuZXhwYW5kVG9MZXZlbChzZWxlY3RlZEFjdGl2aXR5LAotCQkJCQkJCUFic3RyYWN0VHJlZVZpZXdlci5BTExfTEVWRUxTKTsKLQotCQkJCQkvLyBldmVudGhvdWdoIHdlIHN3aXRjaGVkIG9mZiBjcmVhdGluZyBuZXcgYWN0aXZpdGllcyBpbgotCQkJCQkvLyBXQlMsCi0JCQkJCS8vIHVzZXIgY2FuIHN0aWxsIGNyZWF0ZSB0aHJ1IEFELiBIZW5jZSB3ZSBuZWVkIHRvIHVwZGF0ZQotCQkJCQkvLyBJRHMKLQkJCQkJLy8gYWZ0ZXJ3YXJkcwotCQkJCQlkb1JlZnJlc2goKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQotCQlwcml2YXRlIElBY3Rpb24gbW92ZVVwQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXAsCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmdWxsL2V0b29sMTYvbW92ZV91cC5naWYiKSkgeyAvLyROT04tTkxTLTEkICAgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7CQotCQkJCWJzSXRlbVByb3ZpZGVyLm1vdmVVcChzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQsCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkpOwotCQkJCXJlZnJlc2hNb3ZlQnV0dG9uQWN0aW9ucygpOwotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgSUFjdGlvbiBtb3ZlRG93bkFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZURvd24sCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmdWxsL2V0b29sMTYvbW92ZV9kb3duLmdpZiIpKSB7IC8vJE5PTi1OTFMtMSQgICAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlic0l0ZW1Qcm92aWRlci5tb3ZlRG93bihzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQsCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkpOwotCQkJCXJlZnJlc2hNb3ZlQnV0dG9uQWN0aW9ucygpOwotCQkJfQotCQl9OwotCQkKLQkJcHJpdmF0ZSBJQWN0aW9uIHByZWZlcmVuY2VBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1ByZWZlcmVuY2VzKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy8gb3BlbiBwcm9jZXNzIHByZWZlcmVuY2UgcGFnZQotCQkJCW9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsCi0JCQkJCQkuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKAotCQkJCQkJCQlnZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSwKLQkJCQkJCQkJIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlIiwgICAvLyROT04tTkxTLTEkCi0JCQkJCQkJCW51bGwsIG51bGwpLm9wZW4oKTsKLQkJCX0KLQkJfTsKLQkJCi0KLQkJcHJpdmF0ZSBJQWN0aW9uIG9wZW5CYXNlQWN0aXZpdHkgPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5CYXNlQWN0aXZpdHkpIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBzZWxlY3RlZEFjdGl2aXR5Ci0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwKLQkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBiYXNlKTsKLQkJCQl0cnkgewotCQkJCQlpbnQgaWQgPSAoKFByb2Nlc3NFZGl0b3IpIGFjdGl2ZUVkaXRvcikuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGJhc2UpOwotCi0JCQkJCS8vIFByb2Nlc3NFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBQcm9jZXNzRWRpdG9ySW5wdXQoCi0JCQkJCS8vIChNZXRob2RFbGVtZW50KSBwcm9jLmVDb250YWluZXIoKSk7Ci0JCQkJCS8vIGlucHV0LnNldEluaXRpYWxTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCQkJLy8gaW5wdXQuc2V0QWN0aXZlUGFnZShpZCk7Ci0JCQkJCS8vCQkJCQkKLQkJCQkJLy8gUHJvY2Vzc0VkaXRvciBlZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikKLQkJCQkJLy8gZ2V0UGFnZSgpLmZpbmRFZGl0b3IoaW5wdXQpOwotCQkJCQkvLyBpZihlZGl0b3IgIT0gbnVsbCkgewotCQkJCQkvLyAvLyBzZWxlY3QgdGhlIGJhc2UgYWN0aXZpdHkgYWZ0ZXIgdGhlIGVkaXRvciBpcyBvcGVuZWQKLQkJCQkJLy8gLy8KLQkJCQkJLy8gVmlld2VyIHZpZXdlciA9IGVkaXRvci5ic1BhZ2VzW2lkXS5nZXRWaWV3ZXIoKTsKLQkJCQkJLy8gZ2V0UGFnZSgpLmFjdGl2YXRlKGVkaXRvcik7Ci0JCQkJCS8vIGVkaXRvci5zZXRBY3RpdmVQYWdlKGlkKTsKLQkJCQkJLy8gdmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotCQkJCQkvLyB9Ci0JCQkJCS8vIGVsc2UgewotCQkJCQkvLyBlZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgZ2V0UGFnZSgpLm9wZW5FZGl0b3IoaW5wdXQsCi0JCQkJCS8vIEVESVRPUl9JRCk7Ci0JCQkJCS8vIH0KLQotCQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KAotCQkJCQkJCShNZXRob2RFbGVtZW50KSBwcm9jLmVDb250YWluZXIoKSk7Ci0JCQkJCVByb2Nlc3NFZGl0b3IgZWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpIGdldFBhZ2UoKQotCQkJCQkJCS5vcGVuRWRpdG9yKGlucHV0LCBFRElUT1JfSUQpOwotCQkJCQllZGl0b3Iuc2V0QWN0aXZlUGFnZShpZCk7Ci0JCQkJCWVkaXRvci5ic1BhZ2VzW2lkIC0gMV0uZ2V0Vmlld2VyKCkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwKLQkJCQkJCQl0cnVlKTsKLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uIG9wZW5Xb3JrZmxvd0VkaXRvckFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGlhZ3JhbSkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQl0cnkgewotCQkJCQkJSUVkaXRvclBhcnQgcGFyZW50ID0gZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IEdyYXBoaWNhbFdvcmtmbG93RWRpdG9yLkVkaXRvcklucHV0KAotCQkJCQkJCQlzZWxlY3RlZE9iamVjdCwgZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJCQlJRWRpdG9yUGFydCBwYXJ0ID0gZ2V0UGFnZSgpLm9wZW5FZGl0b3IoaW5wdXQsCi0JCQkJCQkJCVdPUktGTE9XX0VESVRPUl9JRCk7Ci0JCQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCQkJCUFic3RyYWN0RGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoQWJzdHJhY3REaWFncmFtRWRpdG9yKSBwYXJ0OwotCQkJCQkJCWVkaXRvci5zZXRQYXJlbnRFZGl0b3IocGFyZW50KTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkJCWV4Y2VwdGlvbik7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJcHJpdmF0ZSBJQWN0aW9uIG5ld0FjdGl2aXR5RGlhZ3JhbUVkaXRvciA9IG5ldyBBY3Rpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuCi0JCQkJUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGlhZ3JhbQotCQkJCSkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlvcGVuRGlhZ3JhbShJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSk7Ci0JCQl9CQkJCi0JCX07Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uIG5ld0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvciA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlvcGVuRGlhZ3JhbShJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pOwotCQkJfQotCQl9OwotCQkKLQkJcHJpdmF0ZSBJQWN0aW9uIG5ld1dQRGlhZ3JhbUVkaXRvciA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJb3BlbkRpYWdyYW0oSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0pOwotCQkJfQotCQl9OwotCi0JCS8vIE9wZW4gd29ya2Zsb3cgZGV0YWlsIGFjdGlvbgotCQkvLwotCQlwcml2YXRlIElBY3Rpb24gb3BlbldvcmtmbG93RGV0YWlsRWRpdG9yQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7IAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJRWRpdG9yUGFydCBwYXJlbnQgPSBnZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLkVkaXRvcklucHV0KAotCQkJCQkJCQlzZWxlY3RlZE9iamVjdCwgZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJCQlJRWRpdG9yUGFydCBwYXJ0ID0gZ2V0UGFnZSgpLm9wZW5FZGl0b3IoaW5wdXQsCi0JCQkJCQkJCUFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX0VESVRPUl9JRCk7Ci0JCQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCQkJCUFic3RyYWN0RGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoQWJzdHJhY3REaWFncmFtRWRpdG9yKSBwYXJ0OwotCQkJCQkJCWVkaXRvci5zZXRQYXJlbnRFZGl0b3IocGFyZW50KTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIElBY3Rpb24gb3BlbldQRGVwZW5kZW5jeUVkaXRvckFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlFZGl0b3JQYXJ0IHBhcmVudCA9IGdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQoCi0JCQkJCQkJCXNlbGVjdGVkT2JqZWN0LCBnZXRTdXBwcmVzc2lvbigpKSB7Ci0JCQkJCQl9OwotCQkJCQkJSUVkaXRvclBhcnQgcGFydCA9IGdldFBhZ2UoKS5vcGVuRWRpdG9yKGlucHV0LAotCQkJCQkJCQlXUERFUEVOREVOQ1lfRURJVE9SX0lEKTsKLQkJCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKSB7Ci0JCQkJCQkJQWJzdHJhY3REaWFncmFtRWRpdG9yIGVkaXRvciA9IChBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHBhcnQ7Ci0JCQkJCQkJZWRpdG9yLnNldFBhcmVudEVkaXRvcihwYXJlbnQpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIElBY3Rpb24gcmVwbGFjZUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmVwbGFjZSkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY21kID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQljbWQgPSBuZXcgUmVwbGFjZUFjdGl2aXR5Q29tbWFuZCgKLQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGJzSXRlbVByb3ZpZGVyKTsKLQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKGNtZCAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWNtZC5kaXNwb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJLmxvZ0Vycm9yKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgSUFjdGlvbiBsb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHkgPSBuZXcgQWN0aW9uKAotCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmxvY2FsUmVwbGFjZW1lbnRBbmREZWVwQ29weV90ZXh0KSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCBjbWQgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQljbWQgPSBuZXcgTG9jYWxseVJlcGxhY2VBbmREZWVwQ29weUNvbW1hbmQoCi0JCQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGJzSXRlbVByb3ZpZGVyKTsKLQkJCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJaWYgKGNtZCAhPSBudWxsKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQljbWQuZGlzcG9zZSgpOwotCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfTsKLQotCQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5JblVJKHJ1bm5hYmxlLCBnZXRUZXh0KCkpOwotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgSUFjdGlvbiBjb250cmlidXRlQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Db250cmlidXRlKSB7IAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCBjbWQgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWNtZCA9IG5ldyBDb250cmlidXRlVG9BY3Rpdml0eUNvbW1hbmQoCi0JCQkJCQkJKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBic0l0ZW1Qcm92aWRlcik7Ci0JCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJCS8vIFByb2Nlc3NVdGlsLmNvbnRyaWJ1dGVUb0FjdGl2aXR5KChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilic0l0ZW1Qcm92aWRlciwKLQkJCQkJLy8gKChQcm9jZXNzRm9ybUVkaXRvcilhY3RpdmVFZGl0b3IpLmVkaXRpbmdEb21haW4uZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChjbWQgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQljbWQuZGlzcG9zZSgpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIGNsYXNzIEVkaXRvclN1cHByZXNzaW9uQ29tbWFuZCBleHRlbmRzIFN1cHByZXNzaW9uQ29tbWFuZCB7Ci0JCQlFZGl0b3JTdXBwcmVzc2lvbkNvbW1hbmQoU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIExpc3Qgc2VsZWN0aW9uLAotCQkJCQlib29sZWFuIHN1cHByZXNzZWQpIHsKLQkJCQlzdXBlcihzdXBwcmVzc2lvbiwgc2VsZWN0aW9uLCBzdXBwcmVzc2VkKTsKLQkJCX0KLQotCQkJcHJpdmF0ZSB2b2lkIHJlZnJlc2goKSB7Ci0JCQkJaWYgKCFnZXRSZXN1bHQoKS5pc0VtcHR5KCkpIHsKLQkJCQkJUHJvY2Vzc0VkaXRvciBlZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJCWlmIChpc1JlYWRPbmx5RWxlbWVudEFmZmVjdGVkKCkpIHsKLQkJCQkJCWlmIChoYXNJbmhlcml0ZWQoc2VsZWN0aW9uKSkgewotCQkJCQkJCWVkaXRvci5yZWZyZXNoQWxsUHJvY2Vzc0VkaXRvcnMoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZWRpdG9yLmRvUmVmcmVzaEFsbChmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWRpdG9yLmZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQkJCQkJCi0JCQkJCS8vIERvIERpYWdyYW0gRWRpdG9ycyByZWZyZXNoCi0JCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJCVVJSGVscGVyLmNsb3NlRGlhZ3JhbUVkaXRvcnMoZWxlbWVudCwgbGlzdCk7Ci0JCQkJCQlVSUhlbHBlci5yZWZyZXNoT3BlbkRpYWdyYW1FZGl0b3JzT2ZQYXJlbnQoZWxlbWVudCwgbGlzdCk7Ci0JCQkJCQlsaXN0LmNsZWFyKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb24uU3VwcHJlc3Npb25Db21tYW5kI2RpZEV4ZWN1dGUoKQotCQkJICovCi0JCQlwcm90ZWN0ZWQgdm9pZCBkaWRFeGVjdXRlKCkgewotCQkJCXJlZnJlc2goKTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbi5TdXBwcmVzc2lvbkNvbW1hbmQjZGlkVW5kbygpCi0JCQkgKi8KLQkJCXByb3RlY3RlZCB2b2lkIGRpZFVuZG8oKSB7Ci0JCQkJcmVmcmVzaCgpOwotCQkJfQotCi0JCX0KLQotCQlwcml2YXRlIElBY3Rpb24gc3VwcHJlc3NUYXNrQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc19UYXNrKSB7IAotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy8gY2hlY2sgaWYgc3VwcHJlc3NpbmcgdGhlIHNlbGVjdGVkIGVsZW1lbnRzIHdpbGwgY2F1c2UKLQkJCQkvLyBkdXBsaWNhdGUgZGVzY3JpcHRvcnMuCi0JCQkJLy8gSWYgc28sIHByb21wdCB1c2VyIHRvIGRlbGV0ZSB0aGUgZHVwbGljYXRlcyBiZWZvcmUKLQkJCQkvLyBjb250aW51aW5nLgotCQkJCS8vCi0JCQkJCi0JCQkJZmluYWwgTGlzdCB0YXNrRGVzY3JpcHRvcnMgPSBQcm9jZXNzVXRpbC5nZXRUYXNrRGVzY3JpcHRvcnMoc2VsZWN0aW9uKTsKLQkJCQlDb2xsZWN0aW9uIGR1cGxpY2F0ZXMgPSBQcm9jZXNzVXRpbAotCQkJCQkJLmdldER1cGxpY2F0ZURlc2NyaXB0b3JzQWZ0ZXJTdXBwcmVzcyh0YXNrRGVzY3JpcHRvcnMpOwotCQkJCWlmICghZHVwbGljYXRlcy5pc0VtcHR5KCkpIHsKLQkJCQkJTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKS5nZXRJZCgpLCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZHVwbGljYXRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCURlc2NyaXB0b3IgZGVzYyA9IChEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJCVN0cmluZyBkZXNjVHh0ID0gVG5nVXRpbC5nZXRUeXBlVGV4dChkZXNjKQotCQkJCQkJCQkrICI6ICIgKyBkZXNjLmdldFByZXNlbnRhdGlvbk5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKS5nZXRJZCgpLCAwLCBkZXNjVHh0LCBudWxsKSk7Ci0JCQkJCX0KLQkJCQkJaWYgKEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQkJZ2V0VGV4dCgpLAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVN1cHByZXNzLCAKLQkJCQkJCQkJCXN0YXR1cykgPT0gRGlhbG9nLkNBTkNFTCkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQkJLy8gZGVsZXRlIGR1cGxpY2F0ZSBkZXNjcmlwdG9ycwotCQkJCQlDb21tYW5kIGNtZCA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljbWQgPSBQcm9jZXNzRGVsZXRlQWN0aW9uLmRlbGV0ZShkdXBsaWNhdGVzKTsKLQkJCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJaWYoY21kICE9IG51bGwpCi0JCQkJCQkJdHJ5IHsgY21kLmRpc3Bvc2UoKTsgfSBjYXRjaChFeGNlcHRpb24gZSkge30KLQkJCQkJfQotCQkJCX0KLQotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvclNpdGUoKQotCQkJCQkJLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJRWRpdG9yU3VwcHJlc3Npb25Db21tYW5kIGNtZCA9IG5ldyBFZGl0b3JTdXBwcmVzc2lvbkNvbW1hbmQoCi0JCQkJCQkJCWdldFN1cHByZXNzaW9uKCksIHRhc2tEZXNjcmlwdG9ycywgdHJ1ZSk7Ci0JCQkJCQljbWQuc2V0TGFiZWwoZ2V0VGV4dCgpKTsKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWJvb2xlYW4gc2hvdyA9IHRydWU7Ci0JCQkJLy8gdXBkYXRlIGNvbnRleHQgYmFyIG1lbnUgYWZ0ZXIgcGVyZm9ybWluZyBzdXBwcmVzcwotCQkJCWlmIChnZXRBZGFwdGVyRmFjdG9yeSgpID09IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5zaXplKCk7IGkrKykgewotCQkJCQkJaWYgKCEoc2VsZWN0aW9uLmdldChpKSBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IHNlbGVjdGlvbgotCQkJCQkJCQkuZ2V0KGkpIGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSkKLQkJCQkJCQlzaG93ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9IGVsc2UKLQkJCQkJc2hvdyA9IGZhbHNlOwotCQkJCQotCQkJCXJldmVhbFRhc2tBY3Rpb24uc2V0RW5hYmxlZChzaG93KTsKLQkJCQlzdXBwcmVzc1Rhc2tBY3Rpb24uc2V0RW5hYmxlZChzaG93KTsKLQotCQkJCS8vIGVuYWJsZSBzeW5jaHJvbml6ZSBhY3Rpb25zIGNvcnJlY3RseQotCQkJCWF1dG9TeW5jaHJvbml6ZS5zZXRFbmFibGVkKGF1dG9TeW5jaHJvbml6ZQotCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb24KLQkJCQkJCQkJLnRvQXJyYXkoKSkpKTsKLQkJCQltYW51YWxTeW5jaHJvbml6ZUFjdGlvbi5zZXRFbmFibGVkKG1hbnVhbFN5bmNocm9uaXplQWN0aW9uCi0JCQkJCQkudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbgotCQkJCQkJCQkudG9BcnJheSgpKSkpOwotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgSUFjdGlvbiBzdXBwcmVzc0FjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3MpIHsgCi0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvLyBjaGVjayBpZiBzdXBwcmVzc2luZyB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgd2lsbCBjYXVzZQotCQkJCS8vIGR1cGxpY2F0ZSBkZXNjcmlwdG9ycy4KLQkJCQkvLyBJZiBzbywgcHJvbXB0IHVzZXIgdG8gZGVsZXRlIHRoZSBkdXBsaWNhdGVzIGJlZm9yZQotCQkJCS8vIGNvbnRpbnVpbmcuCi0JCQkJLy8KLQkJCQlDb2xsZWN0aW9uIGR1cGxpY2F0ZXMgPSBQcm9jZXNzVXRpbAotCQkJCQkJLmdldER1cGxpY2F0ZURlc2NyaXB0b3JzQWZ0ZXJTdXBwcmVzcyhzZWxlY3Rpb24pOwotCQkJCWlmICghZHVwbGljYXRlcy5pc0VtcHR5KCkpIHsKLQkJCQkJTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKS5nZXRJZCgpLCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZHVwbGljYXRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCURlc2NyaXB0b3IgZGVzYyA9IChEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJCVN0cmluZyBkZXNjVHh0ID0gVG5nVXRpbC5nZXRUeXBlVGV4dChkZXNjKQotCQkJCQkJCQkrICI6ICIgKyBkZXNjLmdldFByZXNlbnRhdGlvbk5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKS5nZXRJZCgpLCAwLCBkZXNjVHh0LCBudWxsKSk7Ci0JCQkJCX0KLQkJCQkJaWYgKEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQkJZ2V0VGV4dCgpLAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVN1cHByZXNzLCAKLQkJCQkJCQkJCXN0YXR1cykgPT0gRGlhbG9nLkNBTkNFTCkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQkJLy8gZGVsZXRlIGR1cGxpY2F0ZSBkZXNjcmlwdG9ycwotCQkJCQlDb21tYW5kIGNtZCA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljbWQgPSBQcm9jZXNzRGVsZXRlQWN0aW9uLmRlbGV0ZShkdXBsaWNhdGVzKTsKLQkJCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJaWYoY21kICE9IG51bGwpCi0JCQkJCQkJdHJ5IHsgY21kLmRpc3Bvc2UoKTsgfSBjYXRjaChFeGNlcHRpb24gZSkge30KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIGZpbmFsIFByb2Nlc3NFZGl0b3IgZWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpCi0JCQkJLy8gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0KLQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCkKLQkJCQkJCS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCS8vIGlmIChnZXRTdXBwcmVzc2lvbigpLnN1cHByZXNzKHNlbGVjdGlvbikpIHsKLQkJCQkJCS8vIGlmIChoYXNJbmhlcml0ZWQoc2VsZWN0aW9uKSkgewotCQkJCQkJLy8gZWRpdG9yLnJlZnJlc2hBbGxQcm9jZXNzRWRpdG9ycygpOwotCQkJCQkJLy8gfSBlbHNlIHsKLQkJCQkJCS8vIGVkaXRvci5kb1JlZnJlc2hBbGwoZmFsc2UpOwotCQkJCQkJLy8gfQotCQkJCQkJLy8gfQotCQkJCQkJLy8gZWRpdG9yLmZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQotCQkJCQkJRWRpdG9yU3VwcHJlc3Npb25Db21tYW5kIGNtZCA9IG5ldyBFZGl0b3JTdXBwcmVzc2lvbkNvbW1hbmQoCi0JCQkJCQkJCWdldFN1cHByZXNzaW9uKCksIHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCQkJCQljbWQuc2V0TGFiZWwoZ2V0VGV4dCgpKTsKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCi0JCQkJLy8gdXBkYXRlIGNvbnRleHQgYmFyIG1lbnUgYWZ0ZXIgcGVyZm9ybWluZyBzdXBwcmVzcwotCQkJCXJldmVhbEFjdGlvbi5zZXRFbmFibGVkKGdldFN1cHByZXNzaW9uKCkuY2FuUmV2ZWFsKHNlbGVjdGlvbikpOwotCQkJCXN1cHByZXNzQWN0aW9uLnNldEVuYWJsZWQoZ2V0U3VwcHJlc3Npb24oKS5jYW5TdXBwcmVzcygKLQkJCQkJCXNlbGVjdGlvbikpOwotCi0JCQkJLy8gZW5hYmxlIHN5bmNocm9uaXplIGFjdGlvbnMgY29ycmVjdGx5Ci0JCQkJYXV0b1N5bmNocm9uaXplLnNldEVuYWJsZWQoYXV0b1N5bmNocm9uaXplCi0JCQkJCQkudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbgotCQkJCQkJCQkudG9BcnJheSgpKSkpOwotCQkJCW1hbnVhbFN5bmNocm9uaXplQWN0aW9uLnNldEVuYWJsZWQobWFudWFsU3luY2hyb25pemVBY3Rpb24KLQkJCQkJCS51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uCi0JCQkJCQkJCS50b0FycmF5KCkpKSk7Ci0JCQl9Ci0JCX07Ci0JCQotCQlwcml2YXRlIFVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24gdXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbiA9IG5ldyBVcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uKCk7Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uIHJldmVhbEFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsKSB7IAotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKGNhblJldmVhbChzZWxlY3Rpb24sIGdldEFkYXB0ZXJGYWN0b3J5KCksIGdldFN1cHByZXNzaW9uKCkpKSB7Ci0JCQkJCS8vIGZpbmFsIFByb2Nlc3NFZGl0b3IgZWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpCi0JCQkJCS8vIGdldEFjdGl2ZUVkaXRvcigpOwotCi0JCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvclNpdGUoKQotCQkJCQkJCS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJLy8gaWYgKGdldFN1cHByZXNzaW9uKCkucmV2ZWFsKHNlbGVjdGlvbikpIHsKLQkJCQkJCQkvLyBpZiAoaGFzSW5oZXJpdGVkKHNlbGVjdGlvbikpIHsKLQkJCQkJCQkvLyBlZGl0b3IucmVmcmVzaEFsbFByb2Nlc3NFZGl0b3JzKCk7Ci0JCQkJCQkJLy8gfSBlbHNlIHsKLQkJCQkJCQkvLyBlZGl0b3IuZG9SZWZyZXNoQWxsKGZhbHNlKTsKLQkJCQkJCQkvLyB9Ci0JCQkJCQkJLy8gfQotCQkJCQkJCS8vIGVkaXRvci5maXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSk7Ci0KLQkJCQkJCQlFZGl0b3JTdXBwcmVzc2lvbkNvbW1hbmQgY21kID0gbmV3IEVkaXRvclN1cHByZXNzaW9uQ29tbWFuZCgKLQkJCQkJCQkJCWdldFN1cHByZXNzaW9uKCksIHNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJCWNtZC5zZXRMYWJlbChnZXRUZXh0KCkpOwotCQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJCQl9Ci0KLQkJCQkJfSk7Ci0JCQkJCS8vIHVwZGF0ZSBjb250ZXh0IGJhciBtZW51IGFmdGVyIHBlcmZvcm1pbmcgcmV2ZWFsCi0JCQkJCXJldmVhbEFjdGlvbi5zZXRFbmFibGVkKGdldFN1cHByZXNzaW9uKCkuY2FuUmV2ZWFsKAotCQkJCQkJCXNlbGVjdGlvbikpOwotCQkJCQlzdXBwcmVzc0FjdGlvbi5zZXRFbmFibGVkKGdldFN1cHByZXNzaW9uKCkuY2FuU3VwcHJlc3MoCi0JCQkJCQkJc2VsZWN0aW9uKSk7Ci0JCQkJCS8vIGVuYWJsZSBzeW5jaHJvbml6ZSBhY3Rpb25zIGNvcnJlY3RseQotCQkJCQlhdXRvU3luY2hyb25pemUuc2V0RW5hYmxlZChhdXRvU3luY2hyb25pemUKLQkJCQkJCQkudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbgotCQkJCQkJCQkJLnRvQXJyYXkoKSkpKTsKLQkJCQkJbWFudWFsU3luY2hyb25pemVBY3Rpb24uc2V0RW5hYmxlZChtYW51YWxTeW5jaHJvbml6ZUFjdGlvbgotCQkJCQkJCS51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uCi0JCQkJCQkJCQkudG9BcnJheSgpKSkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCXByaXZhdGUgSUFjdGlvbiByZXZlYWxUYXNrQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxfVGFzaykgeyAKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWZpbmFsIExpc3QgdGFza0Rlc2NyaXB0b3JzID0gUHJvY2Vzc1V0aWwuZ2V0VGFza0Rlc2NyaXB0b3JzKHNlbGVjdGlvbik7Ci0JCQkJaWYgKGNhblJldmVhbCh0YXNrRGVzY3JpcHRvcnMsIGdldEFkYXB0ZXJGYWN0b3J5KCksIGdldFN1cHByZXNzaW9uKCkpKSB7Ci0JCQkJCQotCQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCkKLQkJCQkJCQkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCUVkaXRvclN1cHByZXNzaW9uQ29tbWFuZCBjbWQgPSBuZXcgRWRpdG9yU3VwcHJlc3Npb25Db21tYW5kKAotCQkJCQkJCQkJZ2V0U3VwcHJlc3Npb24oKSwgdGFza0Rlc2NyaXB0b3JzLCBmYWxzZSk7Ci0JCQkJCQkJY21kLnNldExhYmVsKGdldFRleHQoKSk7Ci0JCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCQkJCX0KLQotCQkJCQl9KTsKLQkJCQkJCi0JCQkJCS8vIGVuYWJsZSBzeW5jaHJvbml6ZSBhY3Rpb25zIGNvcnJlY3RseQotCQkJCQlhdXRvU3luY2hyb25pemUuc2V0RW5hYmxlZChhdXRvU3luY2hyb25pemUKLQkJCQkJCQkudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbgotCQkJCQkJCQkJLnRvQXJyYXkoKSkpKTsKLQkJCQkJbWFudWFsU3luY2hyb25pemVBY3Rpb24uc2V0RW5hYmxlZChtYW51YWxTeW5jaHJvbml6ZUFjdGlvbgotCQkJCQkJCS51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uCi0JCQkJCQkJCQkudG9BcnJheSgpKSkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIElCU0l0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gbnVsbDsKLQotCQlwcml2YXRlIEFjdGl2aXR5IHNlbGVjdGVkQWN0aXZpdHkgPSBudWxsOwotCi0JCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudCBzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQgPSBudWxsOwotCi0JCXByaXZhdGUgTGlzdCBzZWxlY3Rpb247Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uIHN1cHByZXNzRGlhZ3JhbUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3MyKSB7IAotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCWlmICghc3VwZXIuaXNFbmFibGVkKCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gIShic0l0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyICYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGJzSXRlbVByb3ZpZGVyKQotCQkJCQkJLmlzUmVhZE9ubHkoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoIXByb21wdFNhdmVBY3RpdmVFZGl0b3IoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCk7Ci0KLQkJCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJCVRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJCQkJcmV0dXJuIEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkJLmdldERpYWdyYW1UeXBlVGV4dCgoRGlhZ3JhbSkgb2JqZWN0KTsKLQkJCQkJfQotCQkJCX07Ci0KLQkJCQlDb2xsZWN0aW9uIGRpYWdyYW1zID0gR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJLmdldERpYWdyYW1zKHNlbGVjdGVkQWN0aXZpdHkpOwotCQkJCUFycmF5TGlzdCB1bnN1cHByZXNzZWREaWFncmFtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoIWRpYWdyYW0uZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQl1bnN1cHByZXNzZWREaWFncmFtcy5hZGQoZGlhZ3JhbSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKAotCQkJCQkJYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLAotCQkJCQkJZGlhZ3JhbXMsCi0JCQkJCQljb250ZW50UHJvdmlkZXIsCi0JCQkJCQlsYWJlbFByb3ZpZGVyLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19NZXNzYWdlKTsgCi0JCQkJZGxnLnNldEluaXRpYWxFbGVtZW50U2VsZWN0aW9ucyh1bnN1cHByZXNzZWREaWFncmFtcyk7Ci0JCQkJZGxnCi0JCQkJCQkuc2V0VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19UaXRsZSk7IAotCQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlkbGcub3BlbigpOwotCi0JCQkJT2JqZWN0W10gZGlhZ3JhbXNUb1JldmVhbCA9IGRsZy5nZXRSZXN1bHQoKTsKLQotCQkJCWlmIChkaWFncmFtc1RvUmV2ZWFsID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWJvb2xlYW4gY2hhbmdlZCA9IHRydWU7Ci0KLQkJCQkvLyBjaGVjayBpZiB0aGVyZSBpcyByZWFsbHkgYW55IGNoYW5nZQotCQkJCS8vCi0JCQkJaWYgKGRpYWdyYW1zVG9SZXZlYWwubGVuZ3RoID09IHVuc3VwcHJlc3NlZERpYWdyYW1zLnNpemUoKSkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpYWdyYW1zVG9SZXZlYWwubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmICghdW5zdXBwcmVzc2VkRGlhZ3JhbXMuY29udGFpbnMoZGlhZ3JhbXNUb1JldmVhbFtpXSkpIHsKLQkJCQkJCQljaGFuZ2VkID0gZmFsc2U7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoY2hhbmdlZCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBpdGVyLm5leHQoKTsKLQkJCQkJCWRpYWdyYW0uc2V0U3VwcHJlc3NlZChCb29sZWFuLlRSVUUpOwotCQkJCQl9Ci0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaWFncmFtc1RvUmV2ZWFsLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZGlhZ3JhbXNUb1JldmVhbFtpXTsKLQkJCQkJCWRpYWdyYW0uc2V0U3VwcHJlc3NlZChCb29sZWFuLkZBTFNFKTsKLQkJCQkJfQotCi0JCQkJCS8vIHNhdmUgdGhlIGVkaXRvcgotCQkJCQkvLwotCQkJCQlzYXZlQWN0aXZlRWRpdG9yKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQkKLQkJCi0JCQotCQlwcml2YXRlIElBY3Rpb24gbmV3U3VwcHJlc3NEaWFncmFtQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzczIpIHsgCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJaWYgKCFzdXBlci5pc0VuYWJsZWQoKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiAhKGJzSXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgJiYgKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgYnNJdGVtUHJvdmlkZXIpCi0JCQkJCQkuaXNSZWFkT25seSgpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICghcHJvbXB0U2F2ZUFjdGl2ZUVkaXRvcigpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKTsKLQotCQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQkJVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSkgewotCQkJCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJCQkvL1RPRE86IENoYW5nZSB0byBleGFjdCBzdHJpbmcuCi0JCQkJCQlyZXR1cm4gRGlhZ3JhbUhlbHBlci5nZXREaWFncmFtVHlwZVN0cmluZygob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSlvYmplY3QpOwotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCUNvbGxlY3Rpb24gZGlhZ3JhbXMgPSBEaWFncmFtSGVscGVyLmdldERpYWdyYW1zKHNlbGVjdGVkQWN0aXZpdHkpOwotCQkJCUFycmF5TGlzdCB1bnN1cHByZXNzZWREaWFncmFtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSBkaWFncmFtID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0pIGl0ZXIubmV4dCgpOwotCQkJCQkKLQkJCQkJLy9UT0RPOiBkbyBnZXQgVW5zdXBwcmVzc2VkIGxpc3QuCi0JCQkJCQotLy8JCQkJCWlmICghZGlhZ3JhbS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpIHsKLS8vCQkJCQkJdW5zdXBwcmVzc2VkRGlhZ3JhbXMuYWRkKGRpYWdyYW0pOwotLy8JCQkJCX0KLQkJCQl9Ci0KLQkJCQlMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKAotCQkJCQkJYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLAotCQkJCQkJZGlhZ3JhbXMsCi0JCQkJCQljb250ZW50UHJvdmlkZXIsCi0JCQkJCQlsYWJlbFByb3ZpZGVyLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19NZXNzYWdlKTsgCi0JCQkJZGxnLnNldEluaXRpYWxFbGVtZW50U2VsZWN0aW9ucyh1bnN1cHByZXNzZWREaWFncmFtcyk7Ci0JCQkJZGxnCi0JCQkJCQkuc2V0VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19UaXRsZSk7IAotCQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlkbGcub3BlbigpOwotCi0JCQkJT2JqZWN0W10gZGlhZ3JhbXNUb1JldmVhbCA9IGRsZy5nZXRSZXN1bHQoKTsKLQotCQkJCWlmIChkaWFncmFtc1RvUmV2ZWFsID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWJvb2xlYW4gY2hhbmdlZCA9IHRydWU7Ci0KLQkJCQkvLyBjaGVjayBpZiB0aGVyZSBpcyByZWFsbHkgYW55IGNoYW5nZQotCQkJCS8vCi0JCQkJaWYgKGRpYWdyYW1zVG9SZXZlYWwubGVuZ3RoID09IHVuc3VwcHJlc3NlZERpYWdyYW1zLnNpemUoKSkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpYWdyYW1zVG9SZXZlYWwubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmICghdW5zdXBwcmVzc2VkRGlhZ3JhbXMuY29udGFpbnMoZGlhZ3JhbXNUb1JldmVhbFtpXSkpIHsKLQkJCQkJCQljaGFuZ2VkID0gZmFsc2U7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoY2hhbmdlZCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0gZGlhZ3JhbSA9IChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtKSBpdGVyLm5leHQoKTsKLQkJCQkJCS8vVE9ETzogc2V0IFN1cHByZXNzaW9uLgotCQkJCQkJLy9kaWFncmFtLnNldFN1cHByZXNzZWQoQm9vbGVhbi5UUlVFKTsKLQkJCQkJfQotCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlhZ3JhbXNUb1JldmVhbC5sZW5ndGg7IGkrKykgewotCQkJCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSBkaWFncmFtID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0pIGRpYWdyYW1zVG9SZXZlYWxbaV07Ci0JCQkJCQkvL1RPRE86IHNldCBTdXBwcmVzc2lvbi4KLQkJCQkJCS8vZGlhZ3JhbS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4uRkFMU0UpOwotCQkJCQl9Ci0KLQkJCQkJLy8gc2F2ZSB0aGUgZWRpdG9yCi0JCQkJCS8vCi0JCQkJCXNhdmVBY3RpdmVFZGl0b3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCQotCQkKLQkJcHJpdmF0ZSBJQWN0aW9uIG5ld0Fzc2lnblVzZXJEaWFncmFtID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbSkgeyAKLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvL1RPRE86IG5lY2Vzc2FyeSBjaGFuZ2VzIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZydzIERpYWdyYW1JbmZvLgotCQkJCVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZyBkaWFsb2cgPSBuZXcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nKAotCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgYWN0aXZlRWRpdG9yLAotCQkJCQkJc2VsZWN0ZWRBY3Rpdml0eSwgZ2V0UHJvY2VzcygpLmdldERlZmF1bHRDb250ZXh0KCksIFRuZ1V0aWwuaXNXcmFwcGVkKHNlbGVjdGVkT2JqZWN0KSk7Ci0JCQkJZGlhbG9nLm9wZW4oKTsKLQkJCX0KLQkJfTsKLQkJCi0JCXByaXZhdGUgSUFjdGlvbiBuZXdTdXBwcmVzc0FsbERpYWdyYW1zID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc0FsbCkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQluZXdTZXRBbGxEaWFncmFtU3VwcHJlc3NlZCh0cnVlKTsKLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIElBY3Rpb24gbmV3UmV2ZWFsQWxsRGlhZ3JhbXMgPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbEFsbCkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQluZXdTZXRBbGxEaWFncmFtU3VwcHJlc3NlZChmYWxzZSk7Ci0JCQl9Ci0JCX07Ci0JCQotCQkKLQotCQlwcml2YXRlIElBY3Rpb24gc3VwcHJlc3NBbGxEaWFncmFtcyA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3NBbGwpIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc2V0QWxsRGlhZ3JhbVN1cHByZXNzZWQodHJ1ZSk7Ci0JCQl9Ci0JCX07Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uIHJldmVhbEFsbERpYWdyYW1zID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGwpIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc2V0QWxsRGlhZ3JhbVN1cHByZXNzZWQoZmFsc2UpOwotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgSUFjdGlvbiBhZGRBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZCkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQkJCWlmIChhZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCQkJCQkJY29uZmlnID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKAotCQkJCQkJCQkJCXNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJTGlzdCBzZWxlY3Rpb24gPSBEaWFsb2dIZWxwZXIuc2VsZWN0RWxlbWVudHNGb3IoCi0JCQkJCQkJCQlzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQsIGNvbmZpZywgYWRhcHRlckZhY3RvcnkpOwotCi0JCQkJCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQotCQkJCQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCQkJCQlzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQsCi0JCQkJCQkJCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCQkJCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQkJSVJlc291cmNlQXdhcmVDb21tYW5kIGNtZCA9ICgoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyKQotCQkJCQkJCQkJCS5jcmVhdGVEcm9wQ29tbWFuZChzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQsCi0JCQkJCQkJCQkJCQlzZWxlY3Rpb24pOwotCQkJCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9KTsKLQotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgSUFjdGlvbiBjb3B5QWN0aXZpdHlBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvcHkpIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCQkJY29uZmlnID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHNlbGVjdGVkQWN0aXZpdHkpCi0JCQkJCQkJLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQkJfQotCQkJCUxpc3Qgc2VsZWN0aW9uID0gRGlhbG9nSGVscGVyLnNlbGVjdEFjdGl2aXRpZXNGb3IoCi0JCQkJCQlzZWxlY3RlZEFjdGl2aXR5LCBjb25maWcsIElBY3Rpb25UeXBlUHJvdmlkZXIuQ09QWSk7Ci0KLQkJCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdG9yPXNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBvID0gaXRvci5uZXh0KCk7Ci0JCQkJCQotCQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgbzsKLQkJCQkKLS8vCQkJCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQpOwotLy8JCQkJCQkJaWYgKERlcGVuZGVuY3lDaGVja2VyLmhhc0N5Y2xpY0RlcGVuZGVuY3koYWN0LCBwcm9jKSkgewotLy8JCQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7IHNlbGVjdGVkQWN0aXZpdHkuZ2V0TmFtZSgpLAotLy8JCQkJCQkJCQkJYWN0LmdldE5hbWUoKSB9OwotLy8JCQkJCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLS8vCQkJCQkJCQkJCS5iaW5kKAotLy8JCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5hcHBseV9wYXR0ZXJuX2Vycm9yX21zZywKLS8vCQkJCQkJCQkJCQkJYXJncyk7Ci0vLwkKLS8vCQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hcHBseV9wYXR0ZXJuX2Vycm9yX3RpdGxlOwotLy8JCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJCQkJaXRvci5yZW1vdmUoKTsKLS8vCQkJCQkJCX0KLS8vCQkJCQkJCWVsc2UgaWYgKFByb2Nlc3NVdGlsLmhhc0NvbnRyaWJ1dG9yT3JSZXBsYWNlcihhY3QpKSB7Ci0vLwkJCQkJCQkJT2JqZWN0W10gYXJncyA9IHsgc2VsZWN0ZWRBY3Rpdml0eS5nZXROYW1lKCksCi0vLwkJCQkJCQkJCQlhY3QuZ2V0TmFtZSgpIH07Ci0vLwkJCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotLy8JCQkJCQkJCQkJLmJpbmQoCi0vLwkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZywKLS8vCQkJCQkJCQkJCQkJYXJncyk7Ci0vLwkKLS8vCQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLS8vCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLS8vCQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQkJCQkJCQlpdG9yLnJlbW92ZSgpOwotLy8JCQkJCQkJCXJldHVybjsKLS8vCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdCwgc2VsZWN0ZWRBY3Rpdml0eSk7Ci0JCQkJCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJCQkJCQlpdG9yLnJlbW92ZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0JCi0JCQkJCQlpZihzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJQWN0aXZpdHlEcm9wQ29tbWFuZCBjbWQgPSBuZXcgQWN0aXZpdHlEcm9wQ29tbWFuZCgKLQkJCQkJCXNlbGVjdGVkQWN0aXZpdHksIHNlbGVjdGlvbiwgbnVsbCwgZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBjbWQuY2hlY2tDb3B5KCk7Ci0JCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWNtZC5zZXRUeXBlKElBY3Rpb25UeXBlUHJvdmlkZXIuQ09QWSk7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIElBY3Rpb24gZXh0ZW5kQWN0aXZpdHlBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX0V4dGVuZCkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJCQljb25maWcgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Moc2VsZWN0ZWRBY3Rpdml0eSkKLQkJCQkJCQkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQl9Ci0JCQkJTGlzdCBzZWxlY3Rpb24gPSBEaWFsb2dIZWxwZXIuc2VsZWN0QWN0aXZpdGllc0ZvcigKLQkJCQkJCXNlbGVjdGVkQWN0aXZpdHksIGNvbmZpZywgSUFjdGlvblR5cGVQcm92aWRlci5FWFRFTkQpOwotCi0JCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0gCi0JCQkJZWxzZSB7CQkJCQkKLQkJCQkJZm9yIChJdGVyYXRvciBpdG9yPXNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBvID0gaXRvci5uZXh0KCk7Ci0JCQkJCQotCQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgbzsKLQkJCQkKLS8vCQkJCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQpOwotLy8JCQkJCQkJaWYgKERlcGVuZGVuY3lDaGVja2VyLmhhc0N5Y2xpY0RlcGVuZGVuY3koYWN0LCBwcm9jKSkgewotLy8JCQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7IHNlbGVjdGVkQWN0aXZpdHkuZ2V0TmFtZSgpLAotLy8JCQkJCQkJCQkJYWN0LmdldE5hbWUoKSB9OwotLy8JCQkJCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLS8vCQkJCQkJCQkJCS5iaW5kKAotLy8JCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5hcHBseV9wYXR0ZXJuX2Vycm9yX21zZywKLS8vCQkJCQkJCQkJCQkJYXJncyk7Ci0vLwkKLS8vCQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hcHBseV9wYXR0ZXJuX2Vycm9yX3RpdGxlOwotLy8JCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJCQkJaXRvci5yZW1vdmUoKTsKLS8vCQkJCQkJCX0KLS8vCQkJCQkJCWVsc2UgaWYgKFByb2Nlc3NVdGlsLmhhc0NvbnRyaWJ1dG9yT3JSZXBsYWNlcihhY3QpKSB7Ci0vLwkJCQkJCQkJT2JqZWN0W10gYXJncyA9IHsgc2VsZWN0ZWRBY3Rpdml0eS5nZXROYW1lKCksCi0vLwkJCQkJCQkJCQlhY3QuZ2V0TmFtZSgpIH07Ci0vLwkJCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotLy8JCQkJCQkJCQkJLmJpbmQoCi0vLwkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZywKLS8vCQkJCQkJCQkJCQkJYXJncyk7Ci0vLwkKLS8vCQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLS8vCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLS8vCQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQkJCQkJCQlpdG9yLnJlbW92ZSgpOwotLy8JCQkJCQkJCXJldHVybjsKLS8vCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IERlcGVuZGVuY3lDaGVja2VyLm5ld0NoZWNrQWN0ID8gCi0JCQkJCQkJCQlEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRGVwZW5kZW5jeUFmdGVyRmlsdGVyU2VsZWN0aW9uCi0JCQkJCQkJCQkJCShhY3QsIHNlbGVjdGVkQWN0aXZpdHksIFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpCi0JCQkJCQkJCQk6IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdCwgc2VsZWN0ZWRBY3Rpdml0eSk7Ci0JCQkJCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIHN0YXR1cyk7Ci0JCQkJCQkJCWl0b3IucmVtb3ZlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlBY3Rpdml0eURyb3BDb21tYW5kIGNtZCA9IG5ldyBBY3Rpdml0eURyb3BDb21tYW5kKAotCQkJCQkJc2VsZWN0ZWRBY3Rpdml0eSwgc2VsZWN0aW9uLCBudWxsLCBnZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IGNtZC5jaGVja0V4dGVuZCgpOwotCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQljbWQuc2V0VHlwZShJQWN0aW9uVHlwZVByb3ZpZGVyLkVYVEVORCk7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIElBY3Rpb24gZGVlcENvcHlBY3Rpdml0eUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9hY3Rpb25fZGVlcENvcHkpIHsgCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQkJCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJCQkJCWNvbmZpZyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhzZWxlY3RlZEFjdGl2aXR5KQotCQkJCQkJCQkJLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCQlMaXN0IHNlbGVjdGlvbiA9IERpYWxvZ0hlbHBlci5zZWxlY3RBY3Rpdml0aWVzRm9yKAotCQkJCQkJCQlzZWxlY3RlZEFjdGl2aXR5LCBjb25maWcsCi0JCQkJCQkJCUlBY3Rpb25UeXBlUHJvdmlkZXIuREVFUF9DT1BZKTsKLQotCQkJCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9IAotCQkJCQkJZWxzZSB7CQkJCQkKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3I9c2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCQlPYmplY3QgbyA9IGl0b3IubmV4dCgpOwotCQkJCQkJCQotCQkJCQkJCQlpZiAobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG87Ci0JCQkJCQkJCQkKLS8vCQkJCQkJCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCk7Ci0vLwkJCQkJCQkJCWlmIChQcm9jZXNzVXRpbC5oYXNDeWNsaWNEZXBlbmRlbmN5KGFjdCwgcHJvYykpIHsKLS8vCQkJCQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7IHNlbGVjdGVkQWN0aXZpdHkuZ2V0TmFtZSgpLAotLy8JCQkJCQkJCQkJCQlhY3QuZ2V0TmFtZSgpIH07Ci0vLwkJCQkJCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0vLwkJCQkJCQkJCQkJCS5iaW5kKAotLy8JCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnLAotLy8JCQkJCQkJCQkJCQkJCWFyZ3MpOwotLy8JCQkKLS8vCQkJCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFwcGx5X3BhdHRlcm5fZXJyb3JfdGl0bGU7Ci0vLwkJCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLS8vCQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJCQkJCQlpdG9yLnJlbW92ZSgpOwotLy8JCQkJCQkJCQl9Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koYWN0LCBzZWxlY3RlZEFjdGl2aXR5KTsKLQkJCQkJCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQkJCQlpdG9yLnJlbW92ZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJQWN0aXZpdHlEcm9wQ29tbWFuZCBjbWQgPSBuZXcgQWN0aXZpdHlEcm9wQ29tbWFuZCgKLQkJCQkJCQkJc2VsZWN0ZWRBY3Rpdml0eSwgc2VsZWN0aW9uLCBudWxsLAotCQkJCQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCQkJCWNtZC5zZXRUeXBlKElBY3Rpb25UeXBlUHJvdmlkZXIuREVFUF9DT1BZKTsKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0KLQkJCQkJfQotCQkJCX0pOwkJCQkKLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIE9iamVjdCBzZWxlY3RlZE9iamVjdDsKLQotCQlwcml2YXRlIElBY3Rpb24gZXhwYW5kQWxsQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRm9ybUVkaXRvcl9leHBhbkFsbEFjdGlvbkxhYmVsKSB7IAotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlWaWV3ZXIgdmlld2VyID0gKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpLmN1cnJlbnRWaWV3ZXI7Ci0JCQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIFRyZWVWaWV3ZXIpIHsKLQkJCQkJKChUcmVlVmlld2VyKSB2aWV3ZXIpLmV4cGFuZFRvTGV2ZWwoc2VsZWN0ZWRPYmplY3QsCi0JCQkJCQkJQWJzdHJhY3RUcmVlVmlld2VyLkFMTF9MRVZFTFMpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIElBY3Rpb24gY29sbGFwc2VBbGxBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NGb3JtRWRpdG9yX2NvbGxhcHNlQWxsQWN0aW9uTGFiZWwpIHsgCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVZpZXdlciB2aWV3ZXIgPSAoKFByb2Nlc3NFZGl0b3IpIGFjdGl2ZUVkaXRvcikuY3VycmVudFZpZXdlcjsKLQkJCQlpZiAodmlld2VyIGluc3RhbmNlb2YgVHJlZVZpZXdlcikgewotCQkJCQkoKFRyZWVWaWV3ZXIpIHZpZXdlcikuY29sbGFwc2VUb0xldmVsKHNlbGVjdGVkT2JqZWN0LAotCQkJCQkJCUFic3RyYWN0VHJlZVZpZXdlci5BTExfTEVWRUxTKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25BY3Rpb24gbWFudWFsU3luY2hyb25pemVBY3Rpb24gPSBuZXcgU3luY2hyb25pemF0aW9uQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXN1cGVyLnJ1bigpOwotCi0JCQkJLy8gcmVmcmVzaCBwcm9wZXJ0aWVzIHZpZXcgYWZ0ZXIgc3luY2gKLQkJCQlFUEZQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlID0gKEVQRlByb3BlcnR5U2hlZXRQYWdlKSAoKFByb2Nlc3NFZGl0b3IpIGFjdGl2ZUVkaXRvcikKLQkJCQkJCS5nZXRQcm9wZXJ0eVNoZWV0UGFnZSgpOwotCQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQkJcGFnZS5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbiBhdXRvU3luY2hyb25pemUgPSBuZXcgUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbigpIHsKLQkJCXByaXZhdGUgdm9pZCBzdXBlclJ1bigpIHsKLQkJCQlzdXBlci5ydW4oKTsKLQkJCX0KLQkJCQotCQkJLyoqCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uI3J1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCWlmICghQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9kZWZhdWx0U3luY2hyb25pemF0aW9uLAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfY29uZmlybUF1dG9TeW5jaCkpIHsgCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJLy8gKChTeW5jaHJvbml6ZUNvbW1hbmQpY29tbWFuZCkuc2V0VUlDb250ZXh0KGdldEFjdGl2ZUVkaXRvcigpLmdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQkJCXN1cGVyUnVuKCk7Ci0JCQkJCQkKLQkJCQkJCS8vIHJlZnJlc2ggcHJvcGVydGllcyB2aWV3IGFmdGVyIHN5bmNoCi0JCQkJCQlFUEZQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlID0gKEVQRlByb3BlcnR5U2hlZXRQYWdlKSgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKS5nZXRQcm9wZXJ0eVNoZWV0UGFnZSgpOwotCQkJCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCQkJCXBhZ2UucmVmcmVzaCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJCi0JCQl9Ci0JCX07Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uIHNob3dJbkxpYnJhcnlWaWV3ID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TaG93TGlua2VkRWxlbWVudGluTGlicmFyeVZpZXcsCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmdWxsL2V0b29sMTYvc2hvd19saW5rZWRfZWxlbWVudC5naWYiKSkgeyAvLyROT04tTkxTLTEkICAgLy8pIAotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZmluYWwgT2JqZWN0IGxpbmtlZEVsZW1lbnQgPSBQcm9jZXNzVXRpbAotCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChsaW5rZWRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCUxpYnJhcnlWaWV3LmdldFZpZXcoKS5zZXRTZWxlY3Rpb25Ub1ZpZXdlcigKLQkJCQkJCQkJCWxpbmtlZEVsZW1lbnQpOwotCQkJCQkJfQotCi0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCi0JCXByaXZhdGUgSUFjdGlvbiBhc3NpZ25Vc2VyRGlhZ3JhbSA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXNzaWduVXNlckRpYWdyYW0pIHsgCi0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVXNlckRlZmluZWREaWFncmFtRGlhbG9nIGRpYWxvZyA9IG5ldyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2coCi0JCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBhY3RpdmVFZGl0b3IsCi0JCQkJCQlzZWxlY3RlZEFjdGl2aXR5LCBnZXRQcm9jZXNzKCkuZ2V0RGVmYXVsdENvbnRleHQoKSwgVG5nVXRpbC5pc1dyYXBwZWQoc2VsZWN0ZWRPYmplY3QpKTsKLQotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQl9Ci0JCX07Ci0JCQotLy8JCXByaXZhdGUgSUFjdGlvbiBhY3Rpdml0eURldGFpbERpYWdyYW1JbmZvID0gIG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1JbmZvQWN0aW9uKCl7Ci0vLwkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotLy8JCQkJcmV0dXJuIHNlbGVjdGVkQWN0aXZpdHk7Ci0vLwkJCX0KLS8vCQkJcHVibGljIElXb3JrYmVuY2hQYWdlIGdldFBhZ2V4KCkgewotLy8JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotLy8JCQkJcmV0dXJuIGdldFBhZ2UoKTsKLS8vCQkJfQotLy8JCX07Ci0KLQkJcHJpdmF0ZSBib29sZWFuIG9sZExvY2tlZDsKLQotCQlwdWJsaWMgQlNBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQkJCXN1cGVyKEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3IpOwotCQkJCi0JCQkvLyBkb24ndCBzaG93IHZhbGlkYXRlIGFjdGlvbgotCQkJLy8KLQkJCXZhbGlkYXRlQWN0aW9uID0gbnVsbDsKLQotCQkJLy8gc2V0IGRpc2FibGVkIGltYWdlIGRlc2NyaXB0b3JzCi0JCQltb3ZlVXBBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkJImZ1bGwvZXRvb2wxNi9tb3ZlX3VwX2Rpc2FibGVkLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJbW92ZURvd25BY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkJImZ1bGwvZXRvb2wxNi9tb3ZlX2Rvd25fZGlzYWJsZWQuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCQlzaG93SW5MaWJyYXJ5Vmlldy5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCQkiZnVsbC9ldG9vbDE2L3Nob3dfbGlua2VkX2VsZW1lbnRfZGlzYWJsZWQuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCXByaXZhdGUgc3RhdGljIFByZWZlcmVuY2VzSGludCBnZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KGludCBkaWFncmFtVHlwZSkgewotCQkJc3dpdGNoKGRpYWdyYW1UeXBlKSB7Ci0JCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJCXJldHVybiBFUEZEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVDsKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJCXJldHVybiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UOwotCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCQlyZXR1cm4gV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQ7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgb3BlbkRpYWdyYW0oaW50IGRpYWdyYW1UeXBlKSB7Ci0JCQl0cnkgewotCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0KAotCQkJCQkJc2VsZWN0ZWRPYmplY3QsIGdldFN1cHByZXNzaW9uKCksIGRpYWdyYW1UeXBlKTsKLQkJCQlEaWFncmFtRWRpdG9yVXRpbC5vcGVuRGlhZ3JhbUVkaXRvcihnZXRQYWdlKCksIGlucHV0LCBnZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KGRpYWdyYW1UeXBlKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CQkJCQkKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyQWN0aW9uKElBY3Rpb24gYWN0aW9uKSB7Ci0JCQlpZiAoYWN0aW9uICE9IG51bGwgJiYgIXJlZ2lzdGVyZWRBY3Rpb25zLmNvbnRhaW5zKGFjdGlvbikpIHsKLQkJCQlyZWdpc3RlcmVkQWN0aW9ucy5hZGQoYWN0aW9uKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCByZWdpc3RlckFjdGlvbnMoKSB7Ci0JCQlyZWdpc3RlckFjdGlvbihhdXRvU3luY2hyb25pemUpOwotCQkJcmVnaXN0ZXJBY3Rpb24obWFudWFsU3luY2hyb25pemVBY3Rpb24pOwotCQkJcmVnaXN0ZXJBY3Rpb24odXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbik7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yI3VwZGF0ZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCQlzdXBlci51cGRhdGUoKTsKLQotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlRWRpdG9yIGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlRWRpdG9yCi0JCQkJCTogYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiA/IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uCi0JCQkJCTogU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVnaXN0ZXJlZEFjdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGFjdGlvbiA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBDb21tYW5kQWN0aW9uSGFuZGxlcikgewotCQkJCQkoKENvbW1hbmRBY3Rpb25IYW5kbGVyKSBhY3Rpb24pCi0JCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yI2FjdGl2YXRlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQkJbWFudWFsU3luY2hyb25pemVBY3Rpb24uc2V0UHJvY2VzcyhnZXRQcm9jZXNzKCkpOwotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlRWRpdG9yIGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlRWRpdG9yCi0JCQkJCTogYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVnaXN0ZXJlZEFjdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGFjdGlvbiA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBJV29ya2JlbmNoUGFydEFjdGlvbikgewotCQkJCQkoKElXb3JrYmVuY2hQYXJ0QWN0aW9uKSBhY3Rpb24pCi0JCQkJCQkJLnNldEFjdGl2ZVdvcmtiZW5jaFBhcnQoYWN0aXZlRWRpdG9yKTsKLQkJCQl9Ci0JCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIHsKLQkJCQkJc2VsZWN0aW9uUHJvdmlkZXIKLQkJCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBhY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJCXN1cGVyLmFjdGl2YXRlKCk7Ci0KLQkJCS8vIGNhbGwgc2V0IEFjdGl2ZSBwYWdlIGV4cGxpY2l0bHkgaW4gb3JkZXIgdG8gZ2V0IGNvcnJlY3QgYWN0aW9uCi0JCQkvLyBiYXJzCi0JCQlzZXRBY3RpdmVQYWdlKGFjdGl2ZUVkaXRvcik7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yI2RlYWN0aXZhdGUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlRWRpdG9yIGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlRWRpdG9yCi0JCQkJCTogYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWdpc3RlcmVkQWN0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgYWN0aW9uID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIElXb3JrYmVuY2hQYXJ0QWN0aW9uKSB7Ci0JCQkJCSgoSVdvcmtiZW5jaFBhcnRBY3Rpb24pIGFjdGlvbikKLQkJCQkJCQkuc2V0QWN0aXZlV29ya2JlbmNoUGFydChudWxsKTsKLQkJCQl9Ci0JCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIHsKLQkJCQkJc2VsZWN0aW9uUHJvdmlkZXIKLQkJCQkJCQkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBhY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5NZXRob2RMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjaW5pdChvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFycykKLQkJICovCi0JCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQkJc3VwZXIuaW5pdChhY3Rpb25CYXJzKTsKLQkJCXJlZ2lzdGVyQWN0aW9ucygpOwotCQkJY29udHJpYnV0ZVRvVG9vbEJhcihhY3Rpb25CYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCkpOwotCQl9Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBnZXRBY3Rpb25NYW5hZ2VyKCkgewotCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudEVkaXRvcikgYWN0aXZlRWRpdG9yKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCX0KLQotCQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHNldEFsbERpYWdyYW1TdXBwcmVzc2VkKGZpbmFsIGJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX3RpdGxlOyAKLQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UxOyAKLQotCQkJaWYgKCFBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24odGl0bGUsIG1lc3NhZ2UpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShhY3RpdmVFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCkKLQkJCQkJLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLnNldEFsbERpYWdyYW1TdXBwcmVzc2VkKGdldFByb2Nlc3MoKSwKLQkJCQkJCQlzdXBwcmVzc2VkKTsKLQkJCQkJZG9TYXZlQWN0aXZlRWRpdG9yKCk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIG5ld1NldEFsbERpYWdyYW1TdXBwcmVzc2VkKGZpbmFsIGJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX3RpdGxlOyAKLQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UxOyAKLQotCQkJaWYgKCFBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24odGl0bGUsIG1lc3NhZ2UpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShhY3RpdmVFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCkKLQkJCQkJLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlEaWFncmFtSGVscGVyLnNldEFsbERpYWdyYW1TdXBwcmVzc2VkKGdldFByb2Nlc3MoKSwKLQkJCQkJCQlzdXBwcmVzc2VkKTsKLQkJCQkJZG9TYXZlQWN0aXZlRWRpdG9yKCk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCQkKLQotCQlwcml2YXRlIGJvb2xlYW4gcHJvbXB0U2F2ZUFjdGl2ZUVkaXRvcigpIHsKLQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ190aXRsZTsgCi0JCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMjsgCi0JCQlpZiAoYWN0aXZlRWRpdG9yLmlzRGlydHkoKSkgewotCQkJCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKHRpdGxlLCBtZXNzYWdlKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHNhdmVBY3RpdmVFZGl0b3IoKSB7Ci0JCQkvLyBzYXZlIHRoZSBlZGl0b3IKLQkJCS8vCi0JCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShhY3RpdmVFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCkKLQkJCQkJLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlkb1NhdmVBY3RpdmVFZGl0b3IoKTsKLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGRvU2F2ZUFjdGl2ZUVkaXRvcigpIHsKLQkJCSgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKS5yZXNvdXJjZXNUb1NhdmUuYWRkKGdldFByb2Nlc3MoKQotCQkJCQkuZVJlc291cmNlKCkpOwotCQkJYWN0aXZlRWRpdG9yLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCi0JCXByb3RlY3RlZCBEZWxldGVBY3Rpb24gY3JlYXRlRGVsZXRlQWN0aW9uKCkgewotCQkJcmV0dXJuIG5ldyBQcm9jZXNzRGVsZXRlQWN0aW9uKCkgewotCQkJCXByb3RlY3RlZCB2b2lkIHNhdmVDdXJyZW50RWRpdG9yKCkgewotCQkJCQlpZiAoYWN0aXZlRWRpdG9yLmlzRGlydHkoKSkgewotCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKQotCQkJCQkJCQkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJYWN0aXZlRWRpdG9yLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsJCi0JCQkJCUlGb3JtUGFnZSBhY3RpdmVQYWdlID0gKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpCi0JCQkJCQkJLmdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOwotCQkJCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgaWQgPSBhY3RpdmVQYWdlLmdldElkKCk7Ci0JCQkJCQlpZiAoaWQgPT0gUHJvY2Vzc0VkaXRvci5XQlNfRk9STV9JRAotCQkJCQkJCQl8fCBpZCA9PSBQcm9jZXNzRWRpdG9yLlRBX0ZPUk1fSUQKLQkJCQkJCQkJfHwgaWQgPT0gUHJvY2Vzc0VkaXRvci5XUEJTX0ZPUk1fSUQKLQkJCQkJCQkJfHwgaWQgPT0gUHJvY2Vzc0VkaXRvci5DT05TT0xJREFURURfRk9STV9JRCkgewotCQkJCQkJCS8vIGZvciBhbGwgb3RoZXIgcGFnZXMsIGRpc2FibGUgREVMRVRFIAotCQkJCQkJCXN1cGVyLnJ1bigpOwotCQkJCQkJfQotCQkJCQl9IAotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQ3V0QWN0aW9uIGNyZWF0ZUN1dEFjdGlvbigpIHsKLQkJCXJldHVybiBuZXcgQ3V0QWN0aW9uKCkgewotCQkJCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihQcm9jZXNzRGVsZXRlQWN0aW9uCi0JCQkJCQkJLmZpbHRlclNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJvdGVjdGVkIFBhc3RlQWN0aW9uIGNyZWF0ZVBhc3RlQWN0aW9uKCkgewotCQkJcmV0dXJuIG5ldyBQYXN0ZUFjdGlvbigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oUHJvY2Vzc0RlbGV0ZUFjdGlvbgotCQkJCQkJCS5maWx0ZXJTZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JCQkJfQotCQkJCQotCQkJCS8qKgotCQkJCSAqIE92ZXJyaWRlZCB0byB1c2UgUmVzb3VyY2VBd2FyZVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5QYXN0ZUFjdGlvbiNjcmVhdGVDb21tYW5kKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlJlc291cmNlQXdhcmVQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kCi0JCQkJICovCi0JCQkJcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCSAgICBpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKQotCQkJCSAgICB7Ci0JCQkJICAgIAlyZXR1cm4gbmV3IFJlc291cmNlQXdhcmVQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKGRvbWFpbiwgc2VsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpLCBudWxsLCBDb21tYW5kUGFyYW1ldGVyLk5PX0lOREVYKTsKLQkJCQkgICAgfQotCQkJCSAgICBlbHNlCi0JCQkJICAgIHsKLQkJCQkgICAgICByZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJCQkgICAgfQotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQ29weUFjdGlvbiBjcmVhdGVDb3B5QWN0aW9uKCkgewotCQkJcmV0dXJuIG5ldyBDb3B5QWN0aW9uKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZG9tYWluIGluc3RhbmNlb2YgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQkJCQkoKFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZG9tYWluKQotCQkJCQkJCQkucmVzZXRDb3B5TWFwcygpOwotCQkJCQl9Ci0JCQkJCXN1cGVyLnJ1bigpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQkJLy8gLy8gZGlzYWxsb3cgY29weWluZyBtdWx0aXBsZSBlbGVtZW50cyBmb3Igbm93IHVudGlsIHdlCi0JCQkJCS8vIGZpbmQgYSByaWdodCB3YXkKLQkJCQkJLy8gLy8gdG8ga2VlcCB0aGUgY29weSB0byBvcmlnaW5hbCBtYXAKLQkJCQkJLy8gLy8KLQkJCQkJLy8gaWYoc2VsZWN0aW9uLnNpemUoKSA+IDEpIHsKLQkJCQkJLy8gcmV0dXJuIGZhbHNlOwotCQkJCQkvLyB9Ci0KLQkJCQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yI2FkZEdsb2JhbEFjdGlvbnMob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGFkZEdsb2JhbEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCQlzdXBlci5hZGRHbG9iYWxBY3Rpb25zKG1lbnVNYW5hZ2VyKTsKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKAotCQkJCQkiYWRkaXRpb25zIiwgbmV3IFNlcGFyYXRvcigiZml4ZWQtYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCS8vIG1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZml4ZWQtYWRkaXRpb25zIiwKLQkJCS8vIGluc2VydE5ld1BoYXNlQWN0aW9uKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7Ci0JCQlzdXBlci5jb250cmlidXRlVG9Ub29sQmFyKHRvb2xCYXJNYW5hZ2VyKTsKLQotCQkJbW92ZVVwQWN0aW9uCi0JCQkJCS5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXApOyAKLQkJCW1vdmVEb3duQWN0aW9uCi0JCQkJCS5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlRG93bik7IAotCQkJc2hvd0luTGlicmFyeVZpZXcKLQkJCQkJLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1Nob3dMaW5rZWRFbGVtZW50aW5MaWJyYXJ5Vmlldyk7IAotCQkJdG9vbEJhck1hbmFnZXIuYWRkKG1vdmVVcEFjdGlvbik7Ci0JCQl0b29sQmFyTWFuYWdlci5hZGQobW92ZURvd25BY3Rpb24pOwotCQkJdG9vbEJhck1hbmFnZXIuYWRkKHNob3dJbkxpYnJhcnlWaWV3KTsKLQkJfQkJCQkKLQotCQkvKiogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXIjbWVudUFib3V0VG9TaG93KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCQlJRm9ybVBhZ2UgYWN0aXZlUGFnZSA9ICgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKQotCQkJCQkuZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCk7Ci0JCQlpZiAoYWN0aXZlUGFnZSBpbnN0YW5jZW9mIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZQotCQkJCQkmJiAoKFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSkgYWN0aXZlUGFnZSkKLQkJCQkJCQkuYmFzaWNJc1JlYWRPbmx5KCkpIHsKLQkJCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigKLQkJCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7CQkJCQkJCQkKLQkJCQltZW51TWFuYWdlci5hZGQoc2hvd0luTGlicmFyeVZpZXcpOwotCQkJCWlmIChic0l0ZW1Qcm92aWRlciAhPSBudWxsCi0JCQkJLy8gJiYgKChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpCi0JCQkJLy8gYnNJdGVtUHJvdmlkZXIpLmhhc0NoaWxkcmVuKHNlbGVjdGVkT2JqZWN0KQotCQkJCSkgewotCQkJCQltZW51TWFuYWdlci5hZGQoZXhwYW5kQWxsQWN0aW9uKTsgCi0JCQkJCW1lbnVNYW5hZ2VyLmFkZChjb2xsYXBzZUFsbEFjdGlvbik7IAotCQkJCX0KLQkJCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCQlyZWZyZXNoVmlld2VyQWN0aW9uLnNldEVuYWJsZWQocmVmcmVzaFZpZXdlckFjdGlvbi5pc0VuYWJsZWQoKSk7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKHJlZnJlc2hWaWV3ZXJBY3Rpb24pOwotCQkJCW1lbnVNYW5hZ2VyLmFkZChzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlRWRpdG9yOwotCi0JCQlpZiAoc2VsZWN0ZWRBY3Rpdml0eSA9PSBudWxsCi0JCQkJCSYmIChzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSA9PSBudWxsIHx8IHNlbGVjdGlvblByb3ZpZGVyCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkpIHsKLQkJCQkvLyBmYWtlIGEgc2VsZWN0aW9uIGNoYW5nZSBldmVudCB3aXRoIHRoZSBwcm9jZXNzIHNlbGVjdGVkIGlmIG5vCi0JCQkJLy8gZWxlbWVudCBpcyBzZWxlY3RlZCB5ZXQuCi0JCQkJLy8KLQkJCQlzZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsCi0JCQkJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihnZXRQcm9jZXNzKCkpKSk7Ci0JCQl9Ci0JCQkvLyBkaXNhYmxlIGFsbCBuZXcgYWN0aW9uIGlmIGl0J3Mgcm9sbGVkIHVwCi0JCQlib29sZWFuIGlzUm9sbGVkVVAgPSBic0l0ZW1Qcm92aWRlciAhPSBudWxsCi0JCQkJCSYmIGJzSXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCXN1cGVyLnNldEVuYWJsZWQoIWlzUm9sbGVkVVApOwotCQkJc3VwZXIubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKLQotCQkJLy8gYWRkIG1hcmtlcnMKLQkJCS8vCi0JCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiZml4ZWQtYWRkaXRpb25zIiwgbmV3IFNlcGFyYXRvcigicHJlZmVyZW5jZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCQkJbWVudU1hbmFnZXIuYXBwZW5kVG9Hcm91cCgicHJlZmVyZW5jZSIsIHByZWZlcmVuY2VBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJmaXhlZC1hZGRpdGlvbnMiLCBuZXcgU2VwYXJhdG9yKCJvcGVuIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJaWYgKGJzSXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIKLQkJCQkJJiYgVG5nVXRpbC51bndyYXAoYnNJdGVtUHJvdmlkZXIpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGNvbnRyaWJ1dGVBY3Rpb24pOyAKLQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIHJlcGxhY2VBY3Rpb24pOyAKLQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoCi0JCQkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgbG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5KTsgCi0JCQl9Ci0KLQkJCWlmICghaXNSb2xsZWRVUCkgewotCQkJCWlmIChjcmVhdGVDaGlsZEFjdGlvbnMgIT0gbnVsbCAmJiAhY3JlYXRlQ2hpbGRBY3Rpb25zLmlzRW1wdHkoKSkgewotCQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFkZEFjdGlvbik7IAotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHJldmVhbEFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZml4ZWQtYWRkaXRpb25zIiwgcmV2ZWFsQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHJldmVhbFRhc2tBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImZpeGVkLWFkZGl0aW9ucyIsIHJldmVhbFRhc2tBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoc3VwcHJlc3NBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImZpeGVkLWFkZGl0aW9ucyIsIHN1cHByZXNzQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHN1cHByZXNzVGFza0FjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZml4ZWQtYWRkaXRpb25zIiwgc3VwcHJlc3NUYXNrQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfQkJCi0JCQlpZiAodXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgKLQkJCQkJCSJmaXhlZC1hZGRpdGlvbnMiLCB1cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAoKHNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCAhPSBudWxsKSAmJiAoYnNJdGVtUHJvdmlkZXIgIT0gbnVsbCkpIHsKLQkJCQlpZiAobW92ZVVwQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZml4ZWQtYWRkaXRpb25zIiwgbW92ZVVwQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAobW92ZURvd25BY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJmaXhlZC1hZGRpdGlvbnMiLCBtb3ZlRG93bkFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCW1lbnVNYW5hZ2VyLmFwcGVuZFRvR3JvdXAoIm9wZW4iLCBzaG93SW5MaWJyYXJ5Vmlldyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKChzZWxlY3RlZEFjdGl2aXR5ICE9IG51bGwpICYmIChic0l0ZW1Qcm92aWRlciAhPSBudWxsKSkgewotCQkJCWlmIChic0l0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCkpIHsKLQkJCQkJcm9sbHVwQWN0aW9uCi0JCQkJCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbERvd24pOyAKLQkJCQl9IGVsc2UgewotCQkJCQlyb2xsdXBBY3Rpb24KLQkJCQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Sb2xsVXApOyAKLQkJCQl9Ci0JCQkJbWVudU1hbmFnZXIuYXBwZW5kVG9Hcm91cCgib3BlbiIsIHJvbGx1cEFjdGlvbik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQl9Ci0KLQkJCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJLy8gIlJldXNlIiBtZW51Ci0JCQkJLy8KLQkJCQlNZW51TWFuYWdlciByZXVzZVN1Yk1lbnUgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BcHBseVBhdHRlcm4pOyAKLQkJCQlyZXVzZVN1Yk1lbnUuYWRkKGNvcHlBY3Rpdml0eUFjdGlvbik7Ci0JCQkJcmV1c2VTdWJNZW51LmFkZChleHRlbmRBY3Rpdml0eUFjdGlvbik7Ci0JCQkJcmV1c2VTdWJNZW51LmFkZChkZWVwQ29weUFjdGl2aXR5QWN0aW9uKTsKLQotCQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZShJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgcmV1c2VTdWJNZW51KTsgCi0JCQl9Ci0KLQkJCWlmIChhdXRvU3luY2hyb25pemUuaXNFbmFibGVkKCkpIHsKLQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGF1dG9TeW5jaHJvbml6ZSk7IAotCQkJfQotCQkJaWYgKG1hbnVhbFN5bmNocm9uaXplQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBtYW51YWxTeW5jaHJvbml6ZUFjdGlvbik7IAotCQkJfQotCi0JCQlpZiAoIShzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBNaWxlc3RvbmUpKSB7Ci0JCQkJTWVudU1hbmFnZXIgZGlhZ3JhbVN1Yk1lbnUgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9EaWFncmFtcyk7IAotCQkJCWlmIChzZWxlY3RlZEFjdGl2aXR5ICE9IG51bGwpIHsKLQkJCQkJaWYgKHNlbGVjdGVkQWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCW1lbnVNYW5hZ2VyLmFwcGVuZFRvR3JvdXAoIm9wZW4iLCBvcGVuQmFzZUFjdGl2aXR5KTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJZGlhZ3JhbVN1Yk1lbnUuYWRkKG9wZW5Xb3JrZmxvd0VkaXRvckFjdGlvbik7Ci0JCQkJCWRpYWdyYW1TdWJNZW51LmFkZChvcGVuV29ya2Zsb3dEZXRhaWxFZGl0b3JBY3Rpb24pOwotCQkJCQlkaWFncmFtU3ViTWVudS5hZGQob3BlbldQRGVwZW5kZW5jeUVkaXRvckFjdGlvbik7Ci0JCQkJCWRpYWdyYW1TdWJNZW51LmFkZChzdXBwcmVzc0RpYWdyYW1BY3Rpb24pOwotCQkJCQlkaWFncmFtU3ViTWVudS5hZGQoYXNzaWduVXNlckRpYWdyYW0pOwotCQkJCX0KLQkJCQlpZiAoc2VsZWN0ZWRBY3Rpdml0eSA9PSBnZXRQcm9jZXNzKCkpIHsKLQkJCQkJZGlhZ3JhbVN1Yk1lbnUuYWRkKHN1cHByZXNzQWxsRGlhZ3JhbXMpOwotCQkJCQlkaWFncmFtU3ViTWVudS5hZGQocmV2ZWFsQWxsRGlhZ3JhbXMpOwotCQkJCX0KLQkJCQkvLyBFbmFibGUgdGhpcyBjb2RlIGlmIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUluZm9EaWFsb2cgaXMgbmVlZC4KLS8vCQkJCWlmKHNlbGVjdGVkQWN0aXZpdHkgIT0gbnVsbCl7Ci0vLwkJCQkJZGlhZ3JhbVN1Yk1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0vLwkJCQkJZGlhZ3JhbVN1Yk1lbnUuYWRkKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbUluZm8pOwotLy8JCQkJfQotCQkJCW1lbnVNYW5hZ2VyLmFwcGVuZFRvR3JvdXAoIm9wZW4iLCBkaWFncmFtU3ViTWVudSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJCQlNZW51TWFuYWdlciBuZXdEaWFncmFtU3ViTWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQkJCSJOZXcgRGlhZ3JhbXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmKHNlbGVjdGVkQWN0aXZpdHkgIT0gbnVsbCl7Ci0JCQkJCW5ld0RpYWdyYW1TdWJNZW51LmFkZChuZXdBY3Rpdml0eURpYWdyYW1FZGl0b3IpOwotCQkJCQluZXdEaWFncmFtU3ViTWVudS5hZGQobmV3QWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yKTsKLQkJCQkJbmV3RGlhZ3JhbVN1Yk1lbnUuYWRkKG5ld1dQRGlhZ3JhbUVkaXRvcik7Ci0JCQkJCW5ld0RpYWdyYW1TdWJNZW51LmFkZChuZXdTdXBwcmVzc0RpYWdyYW1BY3Rpb24pOwotCQkJCQluZXdEaWFncmFtU3ViTWVudS5hZGQobmV3QXNzaWduVXNlckRpYWdyYW0pOwotCi0JCQkJfQotCQkJCQotCQkJCWlmIChzZWxlY3RlZEFjdGl2aXR5ID09IGdldFByb2Nlc3MoKSkgewotCQkJCQluZXdEaWFncmFtU3ViTWVudS5hZGQobmV3U3VwcHJlc3NBbGxEaWFncmFtcyk7Ci0JCQkJCW5ld0RpYWdyYW1TdWJNZW51LmFkZChuZXdSZXZlYWxBbGxEaWFncmFtcyk7Ci0JCQkJfQotCQkJCW1lbnVNYW5hZ2VyLmFwcGVuZFRvR3JvdXAoIm9wZW4iLCBuZXdEaWFncmFtU3ViTWVudSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJaWYgKGJzSXRlbVByb3ZpZGVyICE9IG51bGwKLQkJCS8vIHRoaXMgaXMgYW4gZXhwZW5zaXZlIGNoZWNrLCByZW1vdmVkIGl0Ci0JCQkvLwotCQkJLy8gJiYgKChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpCi0JCQkvLyBic0l0ZW1Qcm92aWRlcikuaGFzQ2hpbGRyZW4oc2VsZWN0ZWRPYmplY3QpCi0JCQkpIHsKLQkJCQltZW51TWFuYWdlci5hcHBlbmRUb0dyb3VwKCJvcGVuIiwgZXhwYW5kQWxsQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCW1lbnVNYW5hZ2VyLmFwcGVuZFRvR3JvdXAoIm9wZW4iLCBjb2xsYXBzZUFsbEFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJCXJldHVybiAoKFByb2Nlc3NDb21wb25lbnQpICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBhY3RpdmVFZGl0b3IKLQkJCQkJLmdldEVkaXRvcklucHV0KCkpLmdldE1ldGhvZEVsZW1lbnQoKSkuZ2V0UHJvY2VzcygpOwotCQl9Ci0KLQkJcHJpdmF0ZSBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbigpIHsKLQkJCXJldHVybiAoKFByb2Nlc3NFZGl0b3IpIGFjdGl2ZUVkaXRvcikuc3VwcHJlc3Npb247Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgZGVwb3B1bGF0ZUR5bmFtaWNNZW51SXRlbXMoKSB7Ci0JCQkvLyBSZW1vdmUgYW55IG1lbnUgaXRlbXMgZm9yIG9sZCBzZWxlY3Rpb24uCi0JCQkvLwotCQkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgewotCQkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucyk7Ci0JCQl9Ci0JCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsCi0JCQkJCQljcmVhdGVTaWJsaW5nQWN0aW9ucyk7Ci0JCQl9Ci0JCQljcmVhdGVDaGlsZEFjdGlvbnMgPSBudWxsOwotCQkJY3JlYXRlU2libGluZ0FjdGlvbnMgPSBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldCBhY3Rpb24gc3RhdGUgdG8gZW5hYmxlZCBvciBkaXNhYmxlZAotCQkgKiAKLQkJICogQHBhcmFtIGxvY2tlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNldEFjdGlvblN0YXRlKCkgewotCQkJaWYgKGxvY2tlZCkgewotCQkJCS8vIGRpc2FibGUgbW9kaWZ5aW5nIGFjdGlvbnMKLQkJCQlwYXN0ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQljdXRBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJZGVsZXRlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWF1dG9TeW5jaHJvbml6ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQltYW51YWxTeW5jaHJvbml6ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl1cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfSBlbHNlIGlmICghb2xkTG9ja2VkKSB7Ci0JCQkJLy8gdXBkYXRlIHN0YXRlIG9mIG1vZGlmeWluZyBhY3Rpb25zCi0JCQkJLy8KLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvblByb3ZpZGVyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJY3V0QWN0aW9uLnNldEVuYWJsZWQoY3V0QWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLQkJCQlwYXN0ZUFjdGlvbi5zZXRFbmFibGVkKHBhc3RlQWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLQkJCQlkZWxldGVBY3Rpb24KLQkJCQkJCS5zZXRFbmFibGVkKGRlbGV0ZUFjdGlvbi51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JCQkJYXV0b1N5bmNocm9uaXplLnNldEVuYWJsZWQoYXV0b1N5bmNocm9uaXplCi0JCQkJCQkudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotCQkJCW1hbnVhbFN5bmNocm9uaXplQWN0aW9uLnNldEVuYWJsZWQobWFudWFsU3luY2hyb25pemVBY3Rpb24KLQkJCQkJCS51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JCQkJdXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbgotCQkJCQkJLnNldEVuYWJsZWQodXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbgotCQkJCQkJCQkudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotCQkJfQotCi0JCQlib29sZWFuIGVuYWJsZWQgPSAhbG9ja2VkOwotCi0JCQlhZGRBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCWNvbnRyaWJ1dGVBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQotCQkJLy8gc3RhdGUgb2YgdGhlc2UgYWN0aW9ucyBpcyBzZXQgaW4gdXBkYXRlQWN0aW9ucygpCi0JCQkvLwotCQkJLy8gbW92ZURvd25BY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCS8vIG1vdmVVcEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJLy8gcmV2ZWFsQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQkvLyBzdXBwcmVzc0FjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJcmVwbGFjZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJbG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQlyZXZlYWxBbGxEaWFncmFtcy5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJc3VwcHJlc3NBbGxEaWFncmFtcy5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJc3VwcHJlc3NEaWFncmFtQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQljb3B5QWN0aXZpdHlBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCWV4dGVuZEFjdGl2aXR5QWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQlkZWVwQ29weUFjdGl2aXR5QWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLAotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlpZiAobG9ja2VkKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMoZGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKAotCQkJCUNvbGxlY3Rpb24gZGVzY3JpcHRvcnMsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlpZiAobG9ja2VkKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhkZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsKLQkJfQotCi0JCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTWV0aG9kTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJSVNlbGVjdGlvbiBzZWwgPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDsKLQkJCQlvbGRMb2NrZWQgPSBsb2NrZWQ7Ci0JCQkJbG9ja2VkID0gVmlld0hlbHBlci5pc0xvY2tlZChzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQotCQkJCXNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbCkudG9MaXN0KCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQlzZWxlY3RlZE9iamVjdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbCkKLQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChzZWxlY3RlZE9iamVjdCk7Ci0JCQkJCXN1cGVyLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCQlzZWxlY3RlZEVsZW1lbnQgPSBvYmo7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJc2VsZWN0ZWRBY3Rpdml0eSA9IChBY3Rpdml0eSkgb2JqOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gZGVwb3B1bGF0ZUR5bmFtaWNNZW51SXRlbXMoKTsKLQkJCQkJCS8vIGJzSXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJCQkJCXNlbGVjdGVkQWN0aXZpdHkgPSBudWxsOwotCQkJCQl9Ci0JCQkJCUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBkb21haW4gPSAoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIGFjdGl2ZUVkaXRvclBhcnQpCi0JCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJCQkJT2JqZWN0IHByb3ZpZGVyT2JqID0gZG9tYWluLmdldEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoCi0JCQkJCQkJc2VsZWN0ZWRPYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCWlmIChwcm92aWRlck9iaiBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikKLQkJCQkJCWJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgcHJvdmlkZXJPYmo7Ci0KLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCXNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBvYmo7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQgPSBudWxsOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGVwb3B1bGF0ZUR5bmFtaWNNZW51SXRlbXMoKTsKLQkJCQkJYnNJdGVtUHJvdmlkZXIgPSBudWxsOwotCQkJCQlzZWxlY3RlZEVsZW1lbnQgPSBudWxsOwotCQkJCQlzZWxlY3RlZEFjdGl2aXR5ID0gbnVsbDsKLQkJCQkJc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50ID0gbnVsbDsKLQkJCQkJc2VsZWN0ZWRPYmplY3QgPSBudWxsOwotCQkJCX0KLQotCQkJCXVwZGF0ZUFjdGlvbnMoKTsKLQotCQkJfSBlbHNlIHsKLQkJCQlkZXBvcHVsYXRlRHluYW1pY01lbnVJdGVtcygpOwotCQkJCWJzSXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJCQlzZWxlY3RlZEVsZW1lbnQgPSBudWxsOwotCQkJCXNlbGVjdGVkQWN0aXZpdHkgPSBudWxsOwotCQkJCXNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCA9IG51bGw7Ci0JCQl9Ci0KLQkJCS8vIC8vIHRlc3QgY29kZQotCQkJLy8gLy8KLQkJCS8vIGlmKHNlbGVjdGVkQWN0aXZpdHkgIT0gbnVsbCkgewotCQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0KLQkJCS8vIHNlbGVjdGVkQWN0aXZpdHkuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQkJLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkvLyBFQXR0cmlidXRlIGF0dHJpYiA9IChFQXR0cmlidXRlKSBpdGVyLm5leHQoKTsKLQkJCS8vIGlmKFN0cmluZy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGF0dHJpYi5nZXRFQXR0cmlidXRlVHlwZSgpLmdldEluc3RhbmNlQ2xhc3MoKSkpCi0JCQkvLyB7Ci0JCQkvLyBMaXN0IHZhbHVlcyA9Ci0JCQkvLyBDb25maWd1cmF0aW9uSGVscGVyLmdldFN0cmluZ0F0dHJpYnV0ZShzZWxlY3RlZEFjdGl2aXR5LCBhdHRyaWIpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oYXR0cmliLmdldE5hbWUoKSArICI6ICIgKyB2YWx1ZXMpOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFVwZGF0ZXMgYWN0aW9ucyBpbmNsdWRpbmcgZW5hYmxpbmcvZGlzYWJsaW5nIHRoZW0gYmFzZWQgb24gc2VsZWN0aW9uCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgdXBkYXRlQWN0aW9ucygpIHsKLQkJCXNob3dJbkxpYnJhcnlWaWV3Ci0JCQkJCS5zZXRFbmFibGVkKHNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaXB0b3IKLQkJCQkJCQkmJiBQcm9jZXNzVXRpbAotCQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQpICE9IG51bGwpOwotCi0JCQlpZiAoIWxvY2tlZCAmJiBzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJaWYgKGdldFN1cHByZXNzaW9uKCkuY2FuUmV2ZWFsKHNlbGVjdGlvbikpIHsKLQkJCQkJCXJldmVhbEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJc3VwcHJlc3NBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCX0gZWxzZSBpZiAoZ2V0U3VwcHJlc3Npb24oKS5jYW5TdXBwcmVzcyhzZWxlY3Rpb24pKSB7Ci0JCQkJCQlzdXBwcmVzc0FjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJcmV2ZWFsQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV2ZWFsQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJc3VwcHJlc3NBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZXZlYWxBY3Rpb24uc2V0RW5hYmxlZChnZXRTdXBwcmVzc2lvbigpLmNhblJldmVhbCgKLQkJCQkJCQlzZWxlY3Rpb24pKTsKLQkJCQkJc3VwcHJlc3NBY3Rpb24uc2V0RW5hYmxlZChnZXRTdXBwcmVzc2lvbigpLmNhblN1cHByZXNzKAotCQkJCQkJCXNlbGVjdGlvbikpOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBBY3Rpb24gRW5hYmxlL0Rpc2FibGUgZm9yIFN1cHByZXNzIFRhc2svUmV2ZWFsIFRhc2sgY29udGV4dCBtZW51Ci0JCQkJYm9vbGVhbiBzaG93ID0gdHJ1ZTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5zaXplKCk7IGkrKykgewotCQkJCQlpZiAoZ2V0QWRhcHRlckZhY3RvcnkoKSA9PSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJCQlpZiAoIShzZWxlY3Rpb24uZ2V0KGkpIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgc2VsZWN0aW9uCi0JCQkJCQkJCS5nZXQoaSkgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpKSB7Ci0JCQkJCQkJc2hvdyA9IGZhbHNlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9IGVsc2UKLQkJCQkJCXNob3cgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKHNob3cpIHsKLQkJCQkJTGlzdCB0YXNrRGVzY3JpcHRvcnMgPSBQcm9jZXNzVXRpbC5nZXRUYXNrRGVzY3JpcHRvcnMoc2VsZWN0aW9uKTsKLQkJCQkJc3VwcHJlc3NUYXNrQWN0aW9uLnNldEVuYWJsZWQoZ2V0U3VwcHJlc3Npb24oKS5jYW5TdXBwcmVzcyh0YXNrRGVzY3JpcHRvcnMpKTsKLQkJCQkJcmV2ZWFsVGFza0FjdGlvbi5zZXRFbmFibGVkKGdldFN1cHByZXNzaW9uKCkuY2FuUmV2ZWFsKHRhc2tEZXNjcmlwdG9ycykpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3VwcHJlc3NUYXNrQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlyZXZlYWxUYXNrQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQotCQkJCS8vIGJvb2xlYW4gaGFzSW5oZXJpdGVkID0gZmFsc2U7Ci0JCQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCS8vIE9iamVjdCBpdGVtID0gaXRlci5uZXh0KCk7Ci0JCQkJLy8gaWYgKGl0ZW0gaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCS8vICYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGl0ZW0pCi0JCQkJLy8gLmlzUmVhZE9ubHkoKSkgewotCQkJCS8vIGhhc0luaGVyaXRlZCA9IHRydWU7Ci0JCQkJLy8gYnJlYWs7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyB1cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uLnNldEVuYWJsZWQoaGFzSW5oZXJpdGVkKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV2ZWFsQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXN1cHByZXNzQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXN1cHByZXNzVGFza0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlyZXZlYWxUYXNrQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCi0JCQlpZiAoIWxvY2tlZCkgewotCQkJCXJlZnJlc2hNb3ZlQnV0dG9uQWN0aW9ucygpOwotCQkJfSBlbHNlIHsKLQkJCQltb3ZlVXBBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJbW92ZURvd25BY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCS8vIFNldCBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBBY3Rpb24gZW5hYmxlIHN0YXRlLgotCQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJfHwgc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpCi0JCQkJc2V0QWN0aW9uU3RhdGVGb3JBREQoKTsKLQotCQkJLy8gY2hhbmdlIGFjdGlvbiBzdGF0ZSBmb3IgbG9ja2VkIHBsdWdpbgotCQkJc2V0QWN0aW9uU3RhdGUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhZ2UoSUVkaXRvclBhcnQgcGFydCkgewotCQkJaWYgKHRoaXMuYWN0aXZlRWRpdG9yICE9IG51bGwpIHsKLQkJCQlpbnQgcGFnZSA9ICgoUHJvY2Vzc0VkaXRvcikgdGhpcy5hY3RpdmVFZGl0b3IpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlJQWN0aW9uQmFycyBhY3Rpb25CYXJzID0gdGhpcy5hY3RpdmVFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJCQkuZ2V0QWN0aW9uQmFycygpOwotCi0JCQkJaWYgKHBhZ2UgPT0gMCkgewotCQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ERUxFVEUKLQkJCQkJCQkuZ2V0SWQoKSwgbnVsbCk7Ci0JCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCQkJCQlBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpLCBudWxsKTsKLQkJCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ09QWQotCQkJCQkJCS5nZXRJZCgpLCBudWxsKTsKLQkJCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUEFTVEUKLQkJCQkJCQkuZ2V0SWQoKSwgbnVsbCk7Ci0JCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlVORE8KLQkJCQkJCQkuZ2V0SWQoKSwgbnVsbCk7Ci0JCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFRE8KLQkJCQkJCQkuZ2V0SWQoKSwgbnVsbCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFCi0JCQkJCQkJLmdldElkKCksIGRlbGV0ZUFjdGlvbik7Ci0JCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCQkJCQlBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpLCBjdXRBY3Rpb24pOwotCQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZCi0JCQkJCQkJLmdldElkKCksIGNvcHlBY3Rpb24pOwotCQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURQotCQkJCQkJCS5nZXRJZCgpLCBwYXN0ZUFjdGlvbik7Ci0JCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlVORE8KLQkJCQkJCQkuZ2V0SWQoKSwgdW5kb0FjdGlvbik7Ci0JCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFRE8KLQkJCQkJCQkuZ2V0SWQoKSwgcmVkb0FjdGlvbik7Ci0JCQkJfQotCQkJCWFjdGlvbkJhcnMudXBkYXRlQWN0aW9uQmFycygpOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgZG9SZWZyZXNoKCkgewotCQkJLy8gdXBkYXRlIElEcwotCQkJLy8KLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSA9PSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCQkJCQl8fCBhZGFwdGVyRmFjdG9yeSA9PSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJUHJvY2VzcyBwcm9jID0gZ2V0UHJvY2VzcygpOwotCQkJCVByb2Nlc3NVdGlsLnVwZGF0ZUlEcyhhZGFwdGVyRmFjdG9yeSwgcHJvYyk7Ci0JCQkJUHJvY2Vzc1V0aWwucmVmcmVzaFByZWRlY2Nlc3Nvckxpc3RzKGFkYXB0ZXJGYWN0b3J5LCBwcm9jKTsKLQkJCX0KLQotCQkJc3VwZXIuZG9SZWZyZXNoKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcmVmcmVzaE1vdmVCdXR0b25BY3Rpb25zKCkgewotCQkJaWYgKChzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQgIT0gbnVsbCkgJiYgKGJzSXRlbVByb3ZpZGVyICE9IG51bGwpKSB7Ci0JCQkJbW92ZVVwQWN0aW9uLnNldEVuYWJsZWQoIWJzSXRlbVByb3ZpZGVyLmlzRmlyc3RFbGVtZW50KHNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCkpOwotCQkJCW1vdmVEb3duQWN0aW9uLnNldEVuYWJsZWQoIWJzSXRlbVByb3ZpZGVyLmlzTGFzdEVsZW1lbnQoc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBTZXQgQWN0aW9uIHN0YXRlIGZvciBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBpbiBDb250ZXh0IE1lbnUgb24KLQkJICogc2VsZWN0aW9uIG9mIEFjdGl2aXR5LiBJZiBhbiBBY3Rpdml0eSBjb25zaXN0IGF0bGVhc3Qgb25lCi0JCSAqIHRhc2tkZXNjcmlwdG9yIGFuZCBpdHMgcHJpbWFyeSBwZXJmb3JtZXIgaW4gY3VycmVudCBjb25maWd1cmF0aW9uLAotCQkgKiB0aGVuIHN0YXRlIGlzIGVuYWJsZWQgZWxzZSBzdGF0ZSBpcyBkaXNhYmxlZCBpbiBjb250ZXh0IG1lbnUgKHByb2Nlc3MKLQkJICogZWRpdG9yKS4KLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRBY3Rpb25TdGF0ZUZvckFERCgpIHsKLQotCQkJLy8gc2V0IEFERCBBY3Rpb24gc3RhdGUgZmFsc2UKLQkJCW9wZW5Xb3JrZmxvd0RldGFpbEVkaXRvckFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJLy8gc2V0IEFEIEFjdGlvbiBzdGF0ZSB0cnVlIGFsd2F5cwotCQkJb3BlbldvcmtmbG93RWRpdG9yQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJCS8vIHNldCBXUEQgRGlhZ3JhbSBNZW51IEFjdGlvbiBzdGF0ZSB0cnUgYWx3YXlzCi0JCQlvcGVuV1BEZXBlbmRlbmN5RWRpdG9yQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJCWlmIChzZWxlY3RlZE9iamVjdCAhPSBudWxsKSB7Ci0KLQkJCQlpZiAoZ2V0U3VwcHJlc3Npb24oKS5pc1N1cHByZXNzZWQoc2VsZWN0ZWRPYmplY3QpKSB7Ci0JCQkJCW9wZW5Xb3JrZmxvd0RldGFpbEVkaXRvckFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJb3BlbldvcmtmbG93RWRpdG9yQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlvcGVuV1BEZXBlbmRlbmN5RWRpdG9yQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSBudWxsOwotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWFjdGl2aXR5ID0gc2VsZWN0ZWRBY3Rpdml0eTsKLQkJCQl9IGVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWFjdGl2aXR5ID0gKEFjdGl2aXR5KSAoKEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgc2VsZWN0ZWRPYmplY3QpCi0JCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQkJfQotCQkJCWlmIChhY3Rpdml0eSA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0KLQkJCQl3aGlsZSAoIWFjdGl2aXR5LmdldFZhcmlhYmlsaXR5VHlwZSgpLmVxdWFscygKLQkJCQkJCVZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMKSkgewotCi0JCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGFjdGl2aXR5Ci0JCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJLy8gSWYgQWN0aXZpdHkgaXMgc2V0IHRvIGxvY2FsIGNvbnRyaWJ1dGlvbiwKLQkJCQkJLy8gbmVlZCB0byBnZXQgYnJlYWtkb3duIGVsZW1lbnRzIG9mIGxvY2FsIGNvbnRyaWJ1dGVkCi0JCQkJCS8vIGFjdGl2aXR5ICsgYmFzZSBhY3Rpdml0eS4gQW5kIGJhc2UgYWN0aXZpdHkgYnJlYWtkb3duCi0JCQkJCS8vIGVsZW1lbnRzCi0JCQkJCS8vIGFyZSBjb2xsZWN0ZWQgYWZ0ZXIgd2hpbGUgbG9vcCBlbmRzKQotCQkJCQkvLyBpZiAoVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwuZXF1YWxzKGFjdGl2aXR5Ci0JCQkJCS8vIC5nZXRWYXJpYWJpbGl0eVR5cGUoKSkpIHsKLQkJCQkJLy8gbGlzdC5hZGRBbGwoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSk7Ci0JCQkJCS8vIH0KLQkJCQkJbGlzdC5hZGRBbGwoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSk7Ci0KLQkJCQkJaWYgKCh2ZSAhPSBudWxsKSAmJiAodmUgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCQkJCWFjdGl2aXR5ID0gKEFjdGl2aXR5KSB2ZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gRm9yIEFEIGRpYWdyYW0gbWVudSBvcHRpb24sIGlmIEJhc2UgQWN0aXZpdHkgZG9ub3QgaGF2ZSBhbnkKLQkJCQkvLyBBRCBkaWFncmFtLCBkb25vdCBzaG93IEFEIGRpYWdyYW0gb3B0aW9uIGluIGNvbnRleHQgbWVudSBmb3IKLQkJCQkvLyByZWFkb25seSBhY3Rpdml0eS4KLQkJCQlEaWFncmFtIGRpYWdyYW0gPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0VU1BRGlhZ3JhbShhY3Rpdml0eSwKLQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ESUFHUkFNLCBmYWxzZSk7Ci0JCQkJaWYgKGRpYWdyYW0gPT0gbnVsbAotCQkJCQkJJiYgc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJb3BlbldvcmtmbG93RWRpdG9yQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQotCQkJCS8vIEZvciBXUEQgZGlhZ3JhbSBtZW51IG9wdGlvbiwgaWYgQmFzZSBBY3Rpdml0eSBkb25vdCBoYXZlIGFueQotCQkJCS8vIFdQRCBkaWFncmFtLCBkb25vdCBzaG93IFdQRCBkaWFncmFtIG9wdGlvbiBpbiBjb250ZXh0IG1lbnUKLQkJCQkvLyBmb3IgcmVhZG9ubHkgYWN0aXZpdHkuCi0JCQkJZGlhZ3JhbSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0VU1BRGlhZ3JhbSgKLQkJCQkJCWFjdGl2aXR5LAotCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNLAotCQkJCQkJZmFsc2UpOwotCQkJCWlmIChkaWFncmFtID09IG51bGwKLQkJCQkJCSYmIHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCW9wZW5XUERlcGVuZGVuY3lFZGl0b3JBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCi0JCQkJLy8gQ29sbGVjdCB0aGUgYnJlYWtkb3duIGVsZW1lbnRzIHRvIHZlcmlmdHkgdGFza2Rlc2NyaXB0b3JzIGFyZQotCQkJCS8vIG5vdC4KLQkJCQlsaXN0LmFkZEFsbChhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKTsKLQotCQkJCS8vIEZvciBBREQgZGlhZ3JhbSBtZW51IG9wdGlvbiwgaWYgQmFzZSBBY3Rpdml0eSBkb25vdCBoYXZlIGFueQotCQkJCS8vIEFERCBkaWFncmFtLCBkb25vdCBzaG93IEFERCBkaWFncmFtIG9wdGlvbiBpbiBjb250ZXh0IG1lbnUKLQkJCQkvLyBmb3IKLQkJCQkvLyByZWFkb25seSBhY3Rpdml0eS4KLQkJCQlkaWFncmFtID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKAotCQkJCQkJYWN0aXZpdHksIEdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0sCi0JCQkJCQlmYWxzZSk7Ci0JCQkJaWYgKGRpYWdyYW0gPT0gbnVsbAotCQkJCQkJJiYgc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJb3BlbldvcmtmbG93RGV0YWlsRWRpdG9yQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgTGlzdCwgdG8gZmluZCB0YXNrZGVzY3JpcHRvciBhbmQgaGFzCi0JCQkJCS8vIHByaW1hcnkgcm9sZSB3aXRoaW4gY3VycmVudCBjb25maWd1cmF0aW9uLgotCQkJCQkvLyB0aGVuIGVuYWJsZSB0aGUgYWN0aW9uLgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJaWYgKCFnZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZChvYmopKSB7Ci0JCQkJCQkJCU9iamVjdCBlID0gKChUYXNrRGVzY3JpcHRvcikgb2JqKQotCQkJCQkJCQkJCS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCQkJCQkJCQlBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZG9tYWluID0gKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSBhY3RpdmVFZGl0b3JQYXJ0KQotCQkJCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCQkJCQkJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBkb21haW4KLQkJCQkJCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQkJCQkJaWYgKGZhY3RvcnkgaW5zdGFuY2VvZiBFeHBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJCQkJCUlGaWx0ZXIgZmlsdGVyID0gKChFeHBvc2VkQWRhcHRlckZhY3RvcnkpIGZhY3RvcnkpCi0JCQkJCQkJCQkJCS5nZXRGaWx0ZXIoKTsKLQkJCQkJCQkJCWlmIChmaWx0ZXIgIT0gbnVsbAotCQkJCQkJCQkJCQkmJiBmaWx0ZXIuYWNjZXB0KGUpCi0JCQkJCQkJCQkJCSYmICFnZXRTdXBwcmVzc2lvbigpCi0JCQkJCQkJCQkJCQkJLmlzU3VwcHJlc3NlZChlKSkgewotCQkJCQkJCQkJCW9wZW5Xb3JrZmxvd0RldGFpbEVkaXRvckFjdGlvbgotCQkJCQkJCQkJCQkJLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFByb2Nlc3NFZGl0b3JEcm9wQWRhcHRlciBleHRlbmRzCi0JCQlFZGl0aW5nRG9tYWluVGFibGVUcmVlVmlld2VyRHJvcEFkYXB0ZXIgewotCi0JCS8qKgotCQkgKiBAcGFyYW0gZG9tYWluCi0JCSAqIEBwYXJhbSB2aWV3ZXIKLQkJICovCi0JCXB1YmxpYyBQcm9jZXNzRWRpdG9yRHJvcEFkYXB0ZXIoRWRpdGluZ0RvbWFpbiBkb21haW4sIFZpZXdlciB2aWV3ZXIpIHsKLQkJCXN1cGVyKGRvbWFpbiwgdmlld2VyKTsKLQkJfQotCi0JCS8qKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRuZC5FZGl0aW5nRG9tYWluVGFibGVUcmVlVmlld2VyRHJvcEFkYXB0ZXIjZ2V0RHJvcFRhcmdldChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQpCi0JCSAqLwotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldERyb3BUYXJnZXQoV2lkZ2V0IGl0ZW0pIHsKLQkJCU9iamVjdCB0YXJnZXQgPSBzdXBlci5nZXREcm9wVGFyZ2V0KGl0ZW0pOwotCQkJaWYgKHRhcmdldCA9PSBudWxsICYmIHNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0ID0gc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50LmdldFByb2Nlc3MoKTsKLQkJCX0KLQkJCXJldHVybiB0YXJnZXQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRuZC5FZGl0aW5nRG9tYWluVGFibGVUcmVlVmlld2VyRHJvcEFkYXB0ZXIjZHJvcChvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoY3VycmVudFZpZXdlciBpbnN0YW5jZW9mIElBY3Rpb25UeXBlUHJvdmlkZXIpIHsKLQkJCQkoKElBY3Rpb25UeXBlUHJvdmlkZXIpIGN1cnJlbnRWaWV3ZXIpLnNldElucHV0RGF0YShuZXcgUG9pbnQoCi0JCQkJCQlldmVudC54LCBldmVudC55KSk7Ci0JCQl9Ci0JCQlzdXBlci5kcm9wKGV2ZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0KLQlwcml2YXRlIFZpZXdlciBjdXJyZW50Vmlld2VyOwotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uIHZpZXdTZWxlY3Rpb247Ci0KLQlwcml2YXRlIFByb2Nlc3NDb21wb25lbnQgc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50OwotCi0JcHJpdmF0ZSBQcm9jZXNzIHNlbGVjdGVkUHJvY2VzczsKLQotCXByaXZhdGUgQWRhcHRlciBwcm9jZXNzQ29tcG9uZW50TGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChQcm9jZXNzQ29tcG9uZW50LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19OQU1FOgotCQkJCVN0cmluZyBuYW1lID0gbXNnLmdldE5ld1N0cmluZ1ZhbHVlKCk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCQkJbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJc2V0UGFydE5hbWUobmFtZSk7Ci0KLQkJCQlpZiAocGFnZXMgIT0gbnVsbCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYWdlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBwYWdlID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAocGFnZSBpbnN0YW5jZW9mIFByb2Nlc3NEZXNjcmlwdGlvbikgewotCQkJCQkJCSgoUHJvY2Vzc0Rlc2NyaXB0aW9uKSBwYWdlKQotCQkJCQkJCQkJLnJlZnJlc2hFbGVtZW50TmFtZShuYW1lKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBwcm9wQ29udGVudFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWc7Ci0KLQlwcml2YXRlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGlicmFyeUxpc3RlbmVyID0gbmV3IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQlzd2l0Y2ggKG9wdGlvbikgewotCQkJLy8gY2FzZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9MT0FERUQ6Ci0JCQkvLyAvLyBjbG9zZSBhbGwgb3BlbiBkaWFncmFtIGVkaXRvcnMKLQkJCS8vIC8vCi0JCQkvLyBJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmcyA9Ci0JCQkvLyBnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmcy5sZW5ndGg7IGkrKykgewotCQkJLy8gSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IGVkaXRvclJlZnNbaV0uZ2V0RWRpdG9yKGZhbHNlKTsKLQkJCS8vIGlmKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBHcmFwaGljYWxXb3JrZmxvd0VkaXRvcgotCQkJLy8gfHwgZWRpdG9yUGFydCBpbnN0YW5jZW9mIFByb2Nlc3NGb3JtRWRpdG9yKSB7Ci0JCQkvLyBnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKGVkaXRvclBhcnQsIHRydWUpOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihQcm9jZXNzRm9ybUVkaXRvci50aGlzLCB0cnVlKTsKLQkJCWNhc2UgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRDogewotCQkJCWlmIChjb2xsZWN0aW9uICE9IG51bGwgJiYgY29sbGVjdGlvbi5jb250YWlucyhjdXJyZW50Q29uZmlnKSkgewotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJCQl0cnkgewotCQkJCQkJUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRQotCQkJCQkJCQkuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjdXJyZW50Q29uZmlnKTsKLQkJCQkJCXJlZnJlc2hBbGwoKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCVByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0UKLQkJCQkJCQkJLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCQkvLyBoYW5kbGVkIGJ5IGxpYlN2Y0xpc3RlbmVyCi0JCQkJLy8gY2FzZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DT05GSUdVUkFUSU9OX1NFTEVDVEVEOiB7Ci0JCQkJLy8gY29uZmlnQ2hhbmdlZCgpOwotCQkJCS8vIGJyZWFrOwotCQkJCS8vIH0KLQotCQkJfQotCi0JCX0KLQotCX07Ci0KLQlwcml2YXRlIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpYlN2Y0xpc3RlbmVyID0gbmV3IElMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCWNvbmZpZ0NoYW5nZWQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgV0JTVGFiOwotCi0JcHJpdmF0ZSBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgT0JTVGFiOwotCi0JcHJpdmF0ZSBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgUEJTVGFiOwotCi0JcHJpdmF0ZSBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgcHJvY1RhYjsKLQotCXByaXZhdGUgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlW10gZXh0ZW5zaW9uVGFicyA9IG51bGw7Ci0KLQlwcml2YXRlIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZVtdIGJzUGFnZXM7Ci0KLQlwcml2YXRlIEVQRlByb3BlcnR5U2hlZXRQYWdlIHByb3BlcnR5U2hlZXRQYWdlOwotCi0JcHVibGljIENvbGxlY3Rpb24gcmVzb3VyY2VzVG9TYXZlID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gcHJpdmF0ZSBib29sZWFuIGZpcnN0RXhwYW5kZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIGEgbGlzdGVuZXIgdGhhdCBpcyBpbnRlcmVzdGVkIGluIHBhcnQgYWN0aXZhdGlvbiBldmVudHMuCi0JICovCi0JcHJpdmF0ZSBJUGFydExpc3RlbmVyIHBhcnRBY3RpdmF0aW9uTGlzdGVuZXIgPSBuZXcgSVBhcnRMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgewotCQkJCXJlbW92ZVByb3BlcnRpZXNEcm9wRG93bk1lbnUocGFydCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCS8vIGlmKCFmaXJzdEV4cGFuZGVkKSB7Ci0JCQkvLyBzeW5jaHJvbml6ZWQoUHJvY2Vzc0Zvcm1FZGl0b3IudGhpcykgewotCQkJLy8gaWYoZmlyc3RFeHBhbmRlZCkgewotCQkJLy8gKChBYnN0cmFjdFRyZWVWaWV3ZXIpIFdCU1RhYi5nZXRWaWV3ZXIoKSkuZXhwYW5kQWxsKCk7Ci0JCQkvLyAoKEFic3RyYWN0VHJlZVZpZXdlcikgT0JTVGFiLmdldFZpZXdlcigpKS5leHBhbmRBbGwoKTsKLQkJCS8vICgoQWJzdHJhY3RUcmVlVmlld2VyKSBQQlNUYWIuZ2V0Vmlld2VyKCkpLmV4cGFuZEFsbCgpOwotCQkJLy8gZmlyc3RFeHBhbmRlZCA9IHRydWU7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgewotCQkJCXByb3BlcnR5U2hlZXRQYWdlID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgewotCQkJCXJlbW92ZVByb3BlcnRpZXNEcm9wRG93bk1lbnUocGFydCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcmVmU3RvcmVMaXN0ZW5lcjsKLQotCS8vIHByaXZhdGUgUHJvY2Vzc0NvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLQlwcml2YXRlIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uOwotCi0JcHJpdmF0ZSBib29sZWFuIHN5bmNocm9uaXppbmdTZWxlY3Rpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5wdXRDaGFuZ2VkOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJQWRhcHRlckZhY3RvcnlQcm92aWRlciBhZGFwdGVyRmFjdG9yeVByb3ZpZGVyID0gbmV3IElBZGFwdGVyRmFjdG9yeVByb3ZpZGVyKCkgewotCi0JCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRDQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJCXJldHVybiBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0KLQkJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFRCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQkJcmV0dXJuIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQotCQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0V0JTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCQlyZXR1cm4gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCi0JCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRXUEJTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCQlyZXR1cm4gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCX07Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IjaXNWYWxpZGF0ZVJlc291cmNlc0JlZm9yZVNhdmVSZXF1aXJlZCgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZGF0ZVJlc291cmNlc0JlZm9yZVNhdmVSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2NyZWF0ZVZhbGlkYXRlUmVzb3VyY2VBY3Rpb24oKQotCSAqLwotCXByb3RlY3RlZCBMaWJyYXJ5VmFsaWRhdGVBY3Rpb24gY3JlYXRlVmFsaWRhdGVSZXNvdXJjZUFjdGlvbigpIHsKLQkJTGlicmFyeVZhbGlkYXRlQWN0aW9uIHZhbGlkYXRlQWN0aW9uID0gc3VwZXIuY3JlYXRlVmFsaWRhdGVSZXNvdXJjZUFjdGlvbigpOwotCQl2YWxpZGF0ZUFjdGlvbi5wdXRDb250ZXh0RGF0YShMaWJyYXJ5RVZhbGlkYXRvci5DVFhfQURBUFRFUl9GQUNUT1JZX1BST1ZJREVSLAotCQkJCWFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIpOwotCQlyZXR1cm4gdmFsaWRhdGVBY3Rpb247Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGlucHV0Q2hhbmdlZChPYmplY3QgbmV3SW5wdXQpIHsKLQkJaW5wdXRDaGFuZ2VkID0gZmFsc2U7Ci0JCWlmICghKG5ld0lucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSkKLQkJCXJldHVybjsKLQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IG1ldGhvZEVsZW1lbnRJbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIG5ld0lucHV0OwotCi0JCU9iamVjdCBvYmogPSBtZXRob2RFbGVtZW50SW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpIG9iajsKLQkJCXNlbGVjdGVkUHJvY2VzcyA9IChQcm9jZXNzKSBQcm9jZXNzVXRpbAotCQkJCQkuZ2V0VG9wQnJlYWtkb3duRWxlbWVudChzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQpOwotCQkJc3VwcHJlc3Npb24gPSBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihzZWxlY3RlZFByb2Nlc3MpOwotCi0JCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYWdlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCS8vIE9iamVjdCBwYWdlID0gaXRlci5uZXh0KCk7Ci0JCQkvLyBpZihwYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSB7Ci0JCQkvLyAoKFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSlwYWdlKS5zZXRQcm9jZXNzKHByb2MpOwotCQkJLy8gfQotCQkJLy8gfQotCi0JCQlXQlNUYWIuc2V0UHJvY2VzcyhzZWxlY3RlZFByb2Nlc3MpOwotCQkJT0JTVGFiLnNldFByb2Nlc3Moc2VsZWN0ZWRQcm9jZXNzKTsKLQkJCVBCU1RhYi5zZXRQcm9jZXNzKHNlbGVjdGVkUHJvY2Vzcyk7Ci0JCQlwcm9jVGFiLnNldFByb2Nlc3Moc2VsZWN0ZWRQcm9jZXNzKTsKLQkJCWlmIChleHRlbnNpb25UYWJzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvblRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGV4dGVuc2lvblRhYnNbaV0gIT0gbnVsbCkgewotCQkJCQkJZXh0ZW5zaW9uVGFic1tpXS5zZXRQcm9jZXNzKHNlbGVjdGVkUHJvY2Vzcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCX0KLQotCS8vIHByaXZhdGUgU3RyaW5nIGdldFRpdGxlUHJlZml4KCkgewotCS8vIElFZGl0b3JJbnB1dCBpbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0JLy8gaWYgKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JLy8gT2JqZWN0IG9iaiA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dCkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCS8vIGlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JLy8gUHJvY2Vzc0NvbXBvbmVudCBwYyA9IChQcm9jZXNzQ29tcG9uZW50KSBvYmo7Ci0JLy8gUHJvY2VzcyBwcm9jID0gcGMuZ2V0UHJvY2VzcygpOwotCS8vIGlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkvLyByZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX0NBUEFCSUxJVFlfUEFUVEVSTjsKLQkvLyB9IGVsc2UgaWYgKHByb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkvLyByZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX0RFTElWRVJZX1BST0NFU1M7Ci0JLy8gfSBlbHNlIGlmIChwcm9jIGluc3RhbmNlb2YgUHJvY2Vzc0NvbnRyaWJ1dGlvbikgewotCS8vIHJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfUFJPQ0VTU19DT05UUklCVVRJT047Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JLy8gLmdldFN0cmluZygiQXV0aG9yaW5nVUkuUHJvY2Vzc0VkaXRvci5UaXRsZSIpOyAvLyROT04tTkxTLTEkCi0JLy8gfQotCi0JcHJpdmF0ZSBJbWFnZSBnZXRQcm9jVGl0bGVJbWFnZSgpIHsKLQkJSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQlPYmplY3Qgb2JqID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0KS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcGMgPSAoUHJvY2Vzc0NvbXBvbmVudCkgb2JqOwotCQkJCVByb2Nlc3MgcHJvYyA9IHBjLmdldFByb2Nlc3MoKTsKLQkJCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJCXJldHVybiBMaWJyYXJ5VUlJbWFnZXMuSU1HX0NBUEFCSUxJVFlfUEFUVEVSTjsKLQkJCQl9IGVsc2UgaWYgKHByb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfREVMSVZFUllfUFJPQ0VTUzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfUFJPQ0VTUzsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgUHJvcGVydGllcyB2aWV3IGRyb3AgZG93biBtZW51Ci0JICogCi0JICogQHBhcmFtIHBhcnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJvcGVydGllc0Ryb3BEb3duTWVudShJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCWlmIChwYXJ0IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgewotCQkJSVZpZXdTaXRlIHZpZXcgPSAoKFByb3BlcnR5U2hlZXQpIHBhcnQpLmdldFZpZXdTaXRlKCk7Ci0KLQkJCUlNZW51TWFuYWdlciBtZW51TWdyID0gdmlldy5nZXRBY3Rpb25CYXJzKCkuZ2V0TWVudU1hbmFnZXIoKTsKLQkJCS8vIElDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBtZW51TWdyLmdldEl0ZW1zKCk7Ci0JCQkvLyBmb3IgKGludCBpPTA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykKLQkJCS8vIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiSWQgPSIgKyBpICsgIiAiICsgaXRlbXNbaV0uZ2V0SWQoKSArICIkIik7Ci0JCQkvLyB9Ci0JCQltZW51TWdyLnJlbW92ZUFsbCgpOwotCQkJbWVudU1nci51cGRhdGVBbGwodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpCi0JCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQotCQkvLyBUT0RPOiBuZWVkIHJldmlzaXQKLQkJLy8gc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcihuZXcgRm9ybUVkaXRvclNlbGVjdGlvblByb3ZpZGVyKHRoaXMpKTsKLQkJLy8gYWN0aW9uTWFuYWdlciA9IGdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQlMaXN0IGZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoZmFjdG9yaWVzKTsKLQotCQkvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUKLQkJLy8gZXhlY3V0ZWQuCi0JCS8vCi0JCUNvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBhY3Rpb25NZ3IuZ2V0Q29tbWFuZFN0YWNrKCk7IC8vIG5ldwotCQkvLyBCYXNpY0NvbW1hbmRTdGFjaygpOwotCi0JCS8vIEFkZCBhIGxpc3RlbmVyIHRvIHNldCB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCdzIGFmZmVjdGVkIG9iamVjdHMgdG8KLQkJLy8gYmUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgdmlld2VyIHdpdGggZm9jdXMuCi0JCS8vCi0JCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcihuZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKGZpbmFsIEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCQkJYm9vbGVhbiBydW4gPSBmYWxzZTsKLQkJCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQpIHsKLQkJCQkJc3dpdGNoICgoKENvbW1hbmRTdGFja0NoYW5nZWRFdmVudCkgZXZlbnQpLmdldFR5cGUoKSkgewotCQkJCQljYXNlIENvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5FWEVDVVRFRDoKLQkJCQkJY2FzZSBDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQuVU5ETzoKLQkJCQkJCXJ1biA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXJ1biA9IHRydWU7Ci0JCQkJfQotCQkJCWlmIChydW4pIHsKLQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7Ci0KLQkJCQkJCQkvLyBUcnkgdG8gc2VsZWN0IHRoZSBhZmZlY3RlZCBvYmplY3RzLgotCQkJCQkJCS8vCi0JCQkJCQkJQ29tbWFuZCBtb3N0UmVjZW50Q29tbWFuZCA9ICgoQ29tbWFuZFN0YWNrKSBldmVudAotCQkJCQkJCQkJLmdldFNvdXJjZSgpKS5nZXRNb3N0UmVjZW50Q29tbWFuZCgpOwotCQkJCQkJCWlmIChtb3N0UmVjZW50Q29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmIChtb3N0UmVjZW50Q29tbWFuZCBpbnN0YW5jZW9mIENyZWF0ZUNoaWxkQ29tbWFuZAotCQkJCQkJCQkJCSYmIGN1cnJlbnRWaWV3ZXIgaW5zdGFuY2VvZiBQcm9jZXNzVmlld2VyKSB7Ci0JCQkJCQkJCQlPYmplY3RbXSBhcnIgPSBtb3N0UmVjZW50Q29tbWFuZAotCQkJCQkJCQkJCQkuZ2V0QWZmZWN0ZWRPYmplY3RzKCkudG9BcnJheSgpOwotCQkJCQkJCQkJaWYgKGFyci5sZW5ndGggPT0gMSkgewotCQkJCQkJCQkJCVByb2Nlc3NWaWV3ZXIgdmlld2VyID0gKFByb2Nlc3NWaWV3ZXIpIGN1cnJlbnRWaWV3ZXI7Ci0JCQkJCQkJCQkJdmlld2VyLmVkaXRFbGVtZW50KGFyclswXSwgMCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlpZiAoIShUbmdVdGlsLnVud3JhcChtb3N0UmVjZW50Q29tbWFuZCkgaW5zdGFuY2VvZiBTZXRDb21tYW5kKSkgewotCQkJCQkJCQkJCXNldFNlbGVjdGlvblRvVmlld2VyKG1vc3RSZWNlbnRDb21tYW5kCi0JCQkJCQkJCQkJCQkuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOwotCQkJCQkJCQkJfQotCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJLy8gaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKLQkJCQkJCQkvLyBwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7Ci0JCQkJCQkJLy8gfQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIENyZWF0ZSB0aGUgZWRpdGluZyBkb21haW4gd2l0aCBhIHNwZWNpYWwgY29tbWFuZCBzdGFjay4KLQkJZWRpdGluZ0RvbWFpbiA9IG5ldyBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjayk7Ci0KLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihsaWJTdmNMaXN0ZW5lcik7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5hZGRMaXN0ZW5lcihsaWJyYXJ5TGlzdGVuZXIpOwotCQkJbWFuYWdlci5zdGFydExpc3RlbmluZ1RvKGFjdGlvbk1nci5nZXRDb21tYW5kU3RhY2soKSk7Ci0KLQkJCS8vIFRPRE86IG5lZWQgdG8gcmV2aXNpdCB0aGlzIGNvZGUKLQkJCWlmICghYWRkQWRhcHRlckZhY3RvcnlMaXN0ZW5lcnMpIHsKLQkJCQlhZGRBZGFwdGVyRmFjdG9yeUxpc3RlbmVycyA9IHRydWU7Ci0JCQkJbWFuYWdlci5zdGFydExpc3RlbmluZ1RvKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJbWFuYWdlci5zdGFydExpc3RlbmluZ1RvKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJbWFuYWdlci5zdGFydExpc3RlbmluZ1RvKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQl9Ci0JCX0KLQotCQlzZXRQYXJ0TmFtZShpbnB1dC5nZXROYW1lKCkpOwotCQlzZXRUaXRsZUltYWdlKGdldFByb2NUaXRsZUltYWdlKCkpOwotCi0JCS8vIGdldCBtZXRob2QgZWxlbWVudCBvYmplY3QgZnJvbSBFZGl0b3IgaW5wdXQKLQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IG1ldGhvZEVsZW1lbnRJbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0OwotCQllbGVtZW50T2JqID0gbWV0aG9kRWxlbWVudElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQotCQlpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZWxlbWVudE9iaik7Ci0JCQlzZWxlY3RlZFByb2Nlc3MgPSBzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQuZ2V0UHJvY2VzcygpOwotCQl9Ci0KLQkJaWYgKHNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQuZUFkYXB0ZXJzKCkuYWRkKHByb2Nlc3NDb21wb25lbnRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyBsaXN0ZW4gdG8gcmVzb3VyY2UgY2hhbmdlIHRvIHVwZGF0ZSBkaXJ0eSBmbGFnCi0JCS8vCi0JCS8vIGFkZFJlc291cmNlQ2hhbmdlZExpc3RlbmVyKCk7Ci0KLQkJLy8gYWRkIHBhcnQgbGlzdGVuZXIgdG8gbGlzdGVuIHRvIHByb3BlcnR5U2hlZXQgY2xvc2UgZXZlbnQKLQkJZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKAotCQkJCXBhcnRBY3RpdmF0aW9uTGlzdGVuZXIpOwotCi0JCS8vIGlucHV0Q2hhbmdlZChpbnB1dCk7Ci0KLQkJLy8gbGlzdGVuIHRvIHRoZSBjaGFuZ2Ugb2YgY29sdW1uIGxpc3QgaW4gcHJlZmVyZW5jZSBzdG9yZQotCQkvLwotCQlpZiAocHJlZlN0b3JlTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJcHJlZlN0b3JlTGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCVByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBwYWdlID0gbnVsbDsKLQkJCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKAotCQkJCQkJCUFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKSkgewotCQkJCQkJcGFnZSA9IFdCU1RhYjsKLQkJCQkJfSBlbHNlIGlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscygKLQkJCQkJCQlBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUykpIHsKLQkJCQkJCXBhZ2UgPSBPQlNUYWI7Ci0JCQkJCX0gZWxzZSBpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoCi0JCQkJCQkJQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TKSkgewotCQkJCQkJcGFnZSA9IFBCU1RhYjsKLQkJCQkJfQotCQkJCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJCQlDb2x1bW5EZXNjcmlwdG9yW10gY29scyA9IHRvQ29sdW1uRGVzY3JpcHRvcnMoZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCQkJCQkJCWV2ZW50LmdldFByb3BlcnR5KCkpKTsKLQkJCQkJCXBhZ2UudXBkYXRlQ29sdW1ucyhjb2xzKTsKLQkJCQkJCWlmIChwYWdlID09IFdCU1RhYiB8fCBwYWdlID09IE9CU1RhYikgewotCQkJCQkJCS8vIHVwZGF0ZSBjb25zb2xpZGF0ZWQgdmlldyBhcyB3ZWxsCi0JCQkJCQkJLy8KLQkJCQkJCQkvLyBnZXQgV0JTIGNvbHVtbnMKLQkJCQkJCQlMaXN0IGxpc3QgPSB0b0NvbHVtbkRlc2NyaXB0b3JMaXN0KGdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJCQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKSk7Ci0KLQkJCQkJCQkvLyBnZXQgVEJTIGNvbHVtbnMgCi0JCQkJCQkJQ29sdW1uRGVzY3JpcHRvcltdIHRlYW1Db2x1bW5EZXNjcmlwdG9ycyA9IHRvQ29sdW1uRGVzY3JpcHRvcnMoZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkJCQkJCS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMpKTsKLQotCQkJCQkJCS8vIGlmIFRCUyBjb2x1bW5zIGhhcyBURUFNIGNvbHVtbiB0aGVuIGFkZCB0byBjb25zb2xpZGF0ZWQgdmlldwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVhbUNvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCUNvbHVtbkRlc2NyaXB0b3IgY29sRGVzYyA9IHRlYW1Db2x1bW5EZXNjcmlwdG9yc1tpXTsKLQkJCQkJCQkJaWYgKGNvbERlc2MgPT0gQ09MX0RFU0NfVEVBTSkgewotCQkJCQkJCQkJbGlzdC5hZGQoY29sRGVzYyk7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlDb2x1bW5EZXNjcmlwdG9yW10gY29sdW1ucyA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLQkJCQkJCQlsaXN0LnRvQXJyYXkoY29sdW1ucyk7Ci0JCQkJCQkJcHJvY1RhYi51cGRhdGVDb2x1bW5zKGNvbHVtbnMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9OwotCQl9Ci0KLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcmVmU3RvcmVMaXN0ZW5lcik7Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNldHMgdGhlIHNlbGVjdGlvbiBpbnRvIHdoaWNoZXZlciB2aWV3ZXIgaXMgYWN0aXZlLiAKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5zZXRTZWxlY3Rpb25Ub1ZpZXdlcjoKLQkJLy8gc2VsZWN0aW9uPSIrY29sbGVjdGlvbik7Ci0JCWZpbmFsIENvbGxlY3Rpb24gdGhlU2VsZWN0aW9uID0gY29sbGVjdGlvbjsKLQkJLy8gTWFrZSBzdXJlIGl0J3Mgb2theS4KLQkJLy8KLQkJaWYgKHRoZVNlbGVjdGlvbiAhPSBudWxsICYmICF0aGVTZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkvLyBJIGRvbid0IGtub3cgaWYgdGhpcyBzaG91bGQgYmUgcnVuIHRoaXMgZGVmZXJyZWQKLQkJCS8vIGJlY2F1c2Ugd2UgbWlnaHQgaGF2ZSB0byBnaXZlIHRoZSBlZGl0b3IgYSBjaGFuY2UgdG8gcHJvY2VzcyB0aGUKLQkJCS8vIHZpZXdlciB1cGRhdGUgZXZlbnRzCi0JCQkvLyBhbmQgaGVuY2UgdG8gdXBkYXRlIHRoZSB2aWV3cyBmaXJzdC4KLQkJCS8vCi0JCQkvLwotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkvLyBUcnkgdG8gc2VsZWN0IHRoZSBpdGVtcyBpbiB0aGUgY3VycmVudCBjb250ZW50IHZpZXdlciBvZgotCQkJCQkvLyB0aGUgZWRpdG9yLgotCQkJCQkvLwotCQkJCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7Ci0JCQkJCQljdXJyZW50Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCQkJdGhlU2VsZWN0aW9uLnRvQXJyYXkoKSksIHRydWUpOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJcnVubmFibGUucnVuKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgewotCQlyZXR1cm4gKEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcikgZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcmVmU3RvcmVMaXN0ZW5lcik7Ci0KLQkJLy8gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vCi0JCS8vIGdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0KLQkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCi0JCWlmIChnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLmdldEFjdGl2ZUVkaXRvcigpID09IHRoaXMpIHsKLQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKG51bGwpOwotCQl9Ci0KLQkJaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKLQkJCXByb3BlcnR5U2hlZXRQYWdlLmRpc3Bvc2UoKTsKLQkJfQotCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5yZW1vdmVMaXN0ZW5lcihsaWJyYXJ5TGlzdGVuZXIpOwotCQkJbWFuYWdlci5zdG9wTGlzdGVuaW5nVG8oZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSk7Ci0JCX0KLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW1vdmVMaXN0ZW5lcihsaWJTdmNMaXN0ZW5lcik7Ci0KLQkJaWYgKHNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQuZUFkYXB0ZXJzKCkucmVtb3ZlKAotCQkJCQlwcm9jZXNzQ29tcG9uZW50TGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gcmVtb3ZlUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIoKTsKLQotCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIoCi0JCQkJcGFydEFjdGl2YXRpb25MaXN0ZW5lcik7Ci0KLQkJYm9vbGVhbiBzYXZlTmVlZGVkID0gaXNEaXJ0eSgpOwotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQkvLyBjYWxsIHRoaXMgdG8gc2V0IG1vZGlmaWVkIGZsYWcgb2Ygc3VwcHJlc3Npb24gdG8gZmFsc2UKLQkJLy8KLQkJc3VwcHJlc3Npb24uc2F2ZUlzRG9uZSgpOwotCi0JCWlmIChzYXZlTmVlZGVkKSB7Ci0JCQkvLyB1c2VyIGRpc2NhcmRlZCBhbGwgdGhlIGNoYW5nZXMsIHNhdmUgdGhlIHJlc291cmNlcyBhZnRlciBjaGFuZ2VzCi0JCQkvLyBhcmUgdW5kb25lLgotCQkJLy8gVE9ETzogcmVsb2FkIHRoZSBwcm9jZXNzIGNvbXBvbmVudCByZXNvdXJjZSBpbnN0ZWFkIHNpbmNlIGl0IGlzCi0JCQkvLyBub3Qgc2hhcmVkLgotCQkJLy8KLQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCS8vIFJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCS8vIHNhdmVSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCQkvLyB9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRGVzY3JpcHRpb25QYWdlKCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJaWYgKHNlbGVjdGVkUHJvY2VzcyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJLy8gRGVsaXZlcnkgUHJvY2VzcwotCQkJYWRkUGFnZSgwLCBuZXcgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24odGhpcykpOwotCQl9IGVsc2UgewotCQkJLy8gQ2FwYWJpbGl0eSBQYXR0ZXJuCi0JCQkvLyBQcm9jZXNzIENvbnRyaWJ1dGlvbgotCQkJYWRkUGFnZSgwLCBuZXcgUHJvY2Vzc0Rlc2NyaXB0aW9uKHRoaXMpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3IjYWRkUGFnZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhZ2VzKCkgewotCQl0cnkgewotCQkJYWRkRGVzY3JpcHRpb25QYWdlKCk7Ci0KLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JCQkvLyBjcmVhdGUgRE5EIHRyYW5zZmVyIG9iamVjdHMKLQkJCS8vIGludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTks7Ci0JCQkvLyBUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdCi0JCQkvLyB7TG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07Ci0KLQkJCS8vIHByZWZlcmVuY2UgaXMgbWFuYWdlZCBieSBsaWJyYXJ5IHBsdWdpbiwKLQkJCS8vIHNpbmNlIHRoaXMgcHJlZmVyZW5jZXMgaXMgYWxzbyB1c2VkIGZvciBicm93c2luZyBhbmQgcHVibGlzaGluZwotCQkJLy8gSmluaHVhIFhpIDA4LzIxLzIwMDYKLQkJCS8vIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS8vIC5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCVByZWZlcmVuY2VVdGlsLnZhbGlkYXRlUHJlZmVyZW5jZXMoKTsKLQkJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCQotCQkJTGlzdCBwYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJLy8gV0JTIHRhYgotCQkJV0JTVGFiID0gbmV3IFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSh0aGlzLCBXQlNfRk9STV9JRCwKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9Xb3JrQnJlYWtkb3duU3RydWN0dXJlKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUNvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5EZXNjcmlwdG9ycyA9IHRvQ29sdW1uRGVzY3JpcHRvcnMoc3RvcmUKLQkJCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUykpOwotCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCWN1cnJlbnRDb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRQotCQkJCQkuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjdXJyZW50Q29uZmlnKTsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJLnNldEZpbHRlcihQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFKTsKLQkJCX0KLQkJCVdCU1RhYi5zZXRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0JCQlXQlNUYWIuc2V0Q29sdW1uRGVzY3JpcHRvcnMoY29sdW1uRGVzY3JpcHRvcnMpOwotCQkJaW50IGlkID0gYWRkUGFnZShXQlNUYWIuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSkpOwotCQkJc2V0UGFnZVRleHQoaWQsIFdCU1RhYi5nZXRUaXRsZSgpKTsKLQkJCVdCU1RhYi5zZXRUYWJJbmRleChpZCk7Ci0JCQlTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSBXQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQljcmVhdGVDb250ZXh0TWVudUZvcih2aWV3ZXIpOwotCQkJcGFnZXMuYWRkKFdCU1RhYik7Ci0JCQkvLyB2aWV3ZXIuYWRkRHJvcFN1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcKLQkJCS8vIFByb2Nlc3NFZGl0b3JEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKLQkJCS8vIHZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpCi0JCQkvLyB7Ci0JCQkvLyBwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KQotCQkJLy8gewotCQkJLy8gVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkuaGFuZGxlRG91YmxlQ2xpY2tFdmVudChldmVudCk7Ci0JCQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oImRvdWJsZSBjbGlja2VkIC4uLiIpOwotCQkJLy8gLy8KLQkJCS8vIC8vIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQkvLyBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigic2VsIitzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJLy8gLy8KLQkJCS8vIFByb2R1Y3RFZGl0b3JWaWV3LmdldFZpZXcoKS5nZXRQcm9kdWN0Vmlld2VyKCkuc2V0SW5wdXQoc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCS8vIH0KLQkJCS8vIH0pOwotCQkJLy8gYWRkUGFnZShXQlNUYWIpOwotCi0JCQkvLyBPQlMgdGFiCi0JCQlPQlNUYWIgPSBuZXcgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKHRoaXMsIFRBX0ZPUk1fSUQsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfVGVhbUFsbG9jYXRpb24pOyAvLyROT04tTkxTLTEkIAotCQkJY29sdW1uRGVzY3JpcHRvcnMgPSB0b0NvbHVtbkRlc2NyaXB0b3JzKHN0b3JlCi0JCQkJCS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMpKTsKLQkJCS8vIHNldENvbHVtbkluZGV4VG9OYW1lTWFwKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19BZGFwdGVyRmFjdG9yaWVzKCksCi0JCQkvLyBjb2x1bW5EZXNjcmlwdG9ycyk7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJCSgoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkuc2V0RmlsdGVyKFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0UpOwotCQkJfQotCQkJT0JTVGFiLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQkJCU9CU1RhYi5zZXRDb2x1bW5EZXNjcmlwdG9ycyhjb2x1bW5EZXNjcmlwdG9ycyk7Ci0JCQlpZCA9IGFkZFBhZ2UoT0JTVGFiLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpKTsKLQkJCXNldFBhZ2VUZXh0KGlkLCBPQlNUYWIuZ2V0VGl0bGUoKSk7Ci0JCQlPQlNUYWIuc2V0VGFiSW5kZXgoaWQpOwotCQkJdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIE9CU1RhYi5nZXRWaWV3ZXIoKTsKLQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHZpZXdlcik7Ci0JCQlwYWdlcy5hZGQoT0JTVGFiKTsKLQkJCS8vIHZpZXdlci5hZGREcm9wU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldwotCQkJLy8gUHJvY2Vzc0VkaXRvckRyb3BBZGFwdGVyKGVkaXRpbmdEb21haW4sIHZpZXdlcikpOwotCQkJLy8gYWRkUGFnZShPQlNUYWIpOwotCi0JCQkvLyBQQlMgdGFiCi0JCQlQQlNUYWIgPSBuZXcgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKHRoaXMsIFdQQlNfRk9STV9JRCwKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9Xb3JrUHJvZHVjdFVzYWdlKTsgLy8kTk9OLU5MUy0xJCAKLQkJCWNvbHVtbkRlc2NyaXB0b3JzID0gdG9Db2x1bW5EZXNjcmlwdG9ycyhzdG9yZQotCQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUykpOwotCQkJLy8gc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTX0FkYXB0ZXJGYWN0b3JpZXMoKSwKLQkJCS8vIGNvbHVtbkRlc2NyaXB0b3JzKTsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCS5zZXRGaWx0ZXIoUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRSk7Ci0JCQl9Ci0JCQlQQlNUYWIuc2V0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotCQkJUEJTVGFiLnNldENvbHVtbkRlc2NyaXB0b3JzKGNvbHVtbkRlc2NyaXB0b3JzKTsKLQkJCWlkID0gYWRkUGFnZShQQlNUYWIuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSkpOwotCQkJc2V0UGFnZVRleHQoaWQsIFBCU1RhYi5nZXRUaXRsZSgpKTsKLQkJCVBCU1RhYi5zZXRUYWJJbmRleChpZCk7Ci0JCQl2aWV3ZXIgPSAoU3RydWN0dXJlZFZpZXdlcikgUEJTVGFiLmdldFZpZXdlcigpOwotCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Iodmlld2VyKTsKLQkJCXBhZ2VzLmFkZChQQlNUYWIpOwotCQkJLy8gdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3Ci0JCQkvLyBQcm9jZXNzRWRpdG9yRHJvcEFkYXB0ZXIoZWRpdGluZ0RvbWFpbiwgdmlld2VyKSk7Ci0JCQkvLyBhZGRQYWdlKFBCU1RhYik7Ci0KLQkJCS8vIGNvbnNvbGlkYXRlZCB0YWIKLQkJCXByb2NUYWIgPSBuZXcgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKHRoaXMsCi0JCQkJCUNPTlNPTElEQVRFRF9GT1JNX0lELAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0NvbnNvbGlkYXRlZFZpZXcpOyAvLyROT04tTkxTLTEkIAotCQkJcHJvY1RhYi5zZXRSZWFkT25seSh0cnVlKTsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCS5zZXRGaWx0ZXIoUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRSk7Ci0JCQl9Ci0JCQlwcm9jVGFiLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLS8vCQkJY29sdW1uRGVzY3JpcHRvcnMgPSB0b0NvbHVtbkRlc2NyaXB0b3JzKHN0b3JlCi0vLwkJCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUykpOwotLy8JCQkKLQkJCS8vIGdldCBXQlMgY29sdW1ucwotCQkJTGlzdCBsaXN0ID0gdG9Db2x1bW5EZXNjcmlwdG9yTGlzdChzdG9yZQotCQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKSk7Ci0KLQkJCS8vIGdldCBUQlMgY29sdW1ucyAKLQkJCUNvbHVtbkRlc2NyaXB0b3JbXSB0ZWFtQ29sdW1uRGVzY3JpcHRvcnMgPSB0b0NvbHVtbkRlc2NyaXB0b3JzKHN0b3JlCi0JCQkJCS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMpKTsKLQotCQkJLy8gaWYgVEJTIGNvbHVtbnMgaGFzIFRFQU0gY29sdW1uIHRoZW4gYWRkIHRvIGNvbnNvbGlkYXRlZCB2aWV3Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRlYW1Db2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCUNvbHVtbkRlc2NyaXB0b3IgY29sRGVzYyA9IHRlYW1Db2x1bW5EZXNjcmlwdG9yc1tpXTsKLQkJCQlpZiAoY29sRGVzYyA9PSBDT0xfREVTQ19URUFNKSB7Ci0JCQkJCWxpc3QuYWRkKGNvbERlc2MpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUNvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5zID0gbmV3IENvbHVtbkRlc2NyaXB0b3JbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KGNvbHVtbnMpOwotCQkJcHJvY1RhYi5zZXRDb2x1bW5EZXNjcmlwdG9ycyhjb2x1bW5zKTsKLQkJCQotCQkJaWQgPSBhZGRQYWdlKHByb2NUYWIuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSkpOwotCQkJc2V0UGFnZVRleHQoaWQsIHByb2NUYWIuZ2V0VGl0bGUoKSk7Ci0JCQlwcm9jVGFiLnNldFRhYkluZGV4KGlkKTsKLQkJCXZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSBwcm9jVGFiLmdldFZpZXdlcigpOwotCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Iodmlld2VyKTsKLQkJCXBhZ2VzLmFkZChwcm9jVGFiKTsKLQotCQkJLy8gY2hlY2sgZm9yIGV4dGVuc3Rpb24gcG9pbnQgYW5kIGFkZCB0aGUgcGFnZSBpZiB0aGVyZQotCQkJTGlzdCBwYWdlUHJvdmlkZXJzID0gUHJvY2Vzc0VkaXRvclBhZ2VQcm92aWRlci5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRQYWdlUHJvdmlkZXJzKCk7Ci0KLQkJCWlmIChwYWdlUHJvdmlkZXJzICE9IG51bGwgJiYgcGFnZVByb3ZpZGVycy5zaXplKCkgPiAwKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZXh0ZW5zaW9uVGFicyA9IG5ldyBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2VbcGFnZVByb3ZpZGVycwotCQkJCQkJCS5zaXplKCldOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VQcm92aWRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCU9iamVjdCBwYWdlID0gcGFnZVByb3ZpZGVycy5nZXQoaSk7Ci0JCQkJCQlpZiAocGFnZSBpbnN0YW5jZW9mIElFeHRlbnNpb25Gb3JtUGFnZSkgewotCi0JCQkJCQkJSUV4dGVuc2lvbkZvcm1QYWdlIGZvcm1QYWdlID0gKElFeHRlbnNpb25Gb3JtUGFnZSkgcGFnZTsKLQkJCQkJCQlJRm9ybVBhZ2UgY29udHJvbCA9IGZvcm1QYWdlLnNldEVkaXRvcih0aGlzKTsKLQkJCQkJCQlmb3JtUGFnZS5zZXRJbnB1dChzZWxlY3RlZFByb2Nlc3MpOwotCQkJCQkJCVByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBleHRlbmRlZFBhZ2UgPSBudWxsOwotCQkJCQkJCWlmIChjb250cm9sIGluc3RhbmNlb2YgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSB7Ci0JCQkJCQkJCWV4dGVuZGVkUGFnZSA9IChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIGNvbnRyb2w7Ci0JCQkJCQkJCWV4dGVuc2lvblRhYnNbaV0gPSBleHRlbmRlZFBhZ2U7Ci0JCQkJCQkJfQotCi0JCQkJCQkJaWQgPSBhZGRQYWdlKGV4dGVuZGVkUGFnZQotCQkJCQkJCQkJLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpKTsKLQkJCQkJCQlzZXRQYWdlVGV4dChpZCwgZXh0ZW5kZWRQYWdlLmdldFRpdGxlKCkpOwotCQkJCQkJCWV4dGVuZGVkUGFnZS5zZXRUYWJJbmRleChpZCk7Ci0JCQkJCQkJdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIGV4dGVuZGVkUGFnZQotCQkJCQkJCQkJLmdldFZpZXdlcigpOwotCQkJCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHZpZXdlcik7Ci0KLQkJCQkJCQlwYWdlcy5hZGQoZXh0ZW5kZWRQYWdlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlic1BhZ2VzID0gbmV3IFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZVtwYWdlcy5zaXplKCldOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5zaXplKCk7IGkrKykgewotCQkJCWJzUGFnZXNbaV0gPSAoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSBwYWdlcy5nZXQoaSk7Ci0JCQl9Ci0KLQkJCS8vIGJzUGFnZXMgPSBuZXcgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlW10geyBXQlNUYWIsCi0JCQkvLyBPQlNUYWIsCi0JCQkvLyBQQlNUYWIsIHByb2NUYWIgfTsKLQotCQkJLy8gaWYoZ2V0RWRpdG9ySW5wdXQoKSBpbnN0YW5jZW9mIFByb2Nlc3NFZGl0b3JJbnB1dCkgewotCQkJLy8gaW50IHBhZ2VJZCA9Ci0JCQkvLyAoKFByb2Nlc3NFZGl0b3JJbnB1dClnZXRFZGl0b3JJbnB1dCgpKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkvLyBpZihwYWdlSWQgIT0gLTEpIHsKLQkJCS8vIHNldEFjdGl2ZVBhZ2UoMCk7Ci0JCQkvLyBzZXRBY3RpdmVQYWdlKHBhZ2VJZCk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0KLQkJCWlucHV0Q2hhbmdlZChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEFjdGl2ZVBhZ2UoaW50IHBhZ2VJbmRleCkgewotCQlzdXBlci5zZXRBY3RpdmVQYWdlKHBhZ2VJbmRleCk7Ci0KLQkJLy8gd29yayBhcm91bmQgZm9yIGFjdGl2ZSBwYWdlIHRoYXQgaXMgbm90IGEgZm9ybSBwYWdlLiBTdXBlciBtZXRob2QKLQkJLy8gZG9lcyBub3QgY2FsbCBwYWdlQ2hhbmdlKCkgaW4gdGhpcyBjYXNlCi0JCS8vCi0JCWhhbmRsZVBhZ2VDaGFuZ2UoKTsKLQkJaWYgKHBhZ2VJbmRleCA+IDAgJiYgYnNQYWdlcy5sZW5ndGggPD0gcGFnZUluZGV4KSB7Ci0JCQlWaWV3ZXIgdmlld2VyID0gYnNQYWdlc1twYWdlSW5kZXhdLmdldFZpZXdlcigpOwotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCUlTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbiA9IG51bGw7Ci0JCQkJaWYgKGdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9ySW5wdXQpIHsKLQkJCQkJaW5pdGlhbFNlbGVjdGlvbiA9ICgoUHJvY2Vzc0VkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpKQotCQkJCQkJCS5nZXRJbml0aWFsU2VsZWN0aW9uKCk7Ci0JCQkJfQotCQkJCWlmIChpbml0aWFsU2VsZWN0aW9uID09IG51bGwpIHsKLQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWRQcm9jZXNzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzZWxlY3Rpb24gPSBpbml0aWFsU2VsZWN0aW9uOwotCQkJCX0KLQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3Ijc2V0QWN0aXZlUGFnZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJRm9ybVBhZ2Ugc2V0QWN0aXZlUGFnZShTdHJpbmcgcGFnZUlkKSB7Ci0JCWludCBpZCA9IC0xOwotCQlJRm9ybVBhZ2UgYWN0aXZlUGFnZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBwYWdlID0gcGFnZXMuZ2V0KGkpOwotCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBJRm9ybVBhZ2UpIHsKLQkJCQlJRm9ybVBhZ2UgZnBhZ2UgPSAoSUZvcm1QYWdlKSBwYWdlOwotCQkJCWlmIChmcGFnZS5nZXRJZCgpLmVxdWFscyhwYWdlSWQpKSB7Ci0JCQkJCWlkID0gaTsKLQkJCQkJYWN0aXZlUGFnZSA9IGZwYWdlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYoaWQgPT0gLTEpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnNQYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCVByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBwYWdlID0gYnNQYWdlc1tpXTsKLQkJCQlpZiAocGFnZS5nZXRJZCgpLmVxdWFscyhwYWdlSWQpKSB7Ci0JCQkJCWlkID0gcGFnZS5nZXRUYWJJbmRleCgpOwotCQkJCQlhY3RpdmVQYWdlID0gcGFnZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKGlkID09IC0xICYmIGV4dGVuc2lvblRhYnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25UYWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIHBhZ2UgPSBleHRlbnNpb25UYWJzW2ldOwotCQkJCWlmIChwYWdlLmdldElkKCkuZXF1YWxzKHBhZ2VJZCkpIHsKLQkJCQkJaWQgPSBwYWdlLmdldFRhYkluZGV4KCk7Ci0JCQkJCWFjdGl2ZVBhZ2UgPSBwYWdlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZihhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCXNldEFjdGl2ZVBhZ2UoaWQpOwotCQkJcmV0dXJuIGFjdGl2ZVBhZ2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVQYWdlQ2hhbmdlKCkgewotCQlpbnQgaWQgPSBnZXRBY3RpdmVQYWdlKCk7Ci0JCWlmIChpZCAhPSAtMSkgewotCQkJT2JqZWN0IHBhZ2UgPSBwYWdlcy5nZXQoaWQpOwotCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBQcm9jZXNzRGVzY3JpcHRpb24pIHsKLQkJCQkoKFByb2Nlc3NEZXNjcmlwdGlvbikgcGFnZSkuc2V0Rm9ybVRleHQoKTsKLQkJCX0KLQkJCWlmIChpZCA9PSBXQlNUYWIuZ2V0VGFiSW5kZXgoKSkgewotCQkJCXNldEN1cnJlbnRWaWV3ZXIoV0JTVGFiLmdldFZpZXdlcigpKTsKLQkJCX0gZWxzZSBpZiAoaWQgPT0gT0JTVGFiLmdldFRhYkluZGV4KCkpIHsKLQkJCQlzZXRDdXJyZW50Vmlld2VyKE9CU1RhYi5nZXRWaWV3ZXIoKSk7Ci0JCQl9IGVsc2UgaWYgKGlkID09IFBCU1RhYi5nZXRUYWJJbmRleCgpKSB7Ci0JCQkJc2V0Q3VycmVudFZpZXdlcihQQlNUYWIuZ2V0Vmlld2VyKCkpOwotCQkJfSBlbHNlIGlmIChpZCA9PSBwcm9jVGFiLmdldFRhYkluZGV4KCkpIHsKLQkJCQlzZXRDdXJyZW50Vmlld2VyKHByb2NUYWIuZ2V0Vmlld2VyKCkpOwotCQkJfSBlbHNlIGlmIChleHRlbnNpb25UYWJzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvblRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGV4dGVuc2lvblRhYnNbaV0gIT0gbnVsbCAmJiBpZCA9PSBleHRlbnNpb25UYWJzW2ldLmdldFRhYkluZGV4KCkpCi0JCQkJCQlzZXRDdXJyZW50Vmlld2VyKGV4dGVuc2lvblRhYnNbaV0uZ2V0Vmlld2VyKCkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc2V0Q3VycmVudFZpZXdlcihudWxsKTsKLQkJCX0KLQotCQkJaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKLQkJCQlwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlKGludCBuZXdQYWdlSW5kZXgpIHsKLQkJc3VwZXIucGFnZUNoYW5nZShuZXdQYWdlSW5kZXgpOwotCQloYW5kbGVQYWdlQ2hhbmdlKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGNvbnRleHQgbWVudSBmb3IgdGhlIGdpdmUgdmlld2VyCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRleHRNZW51Rm9yKGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7Ci0JCU1lbnVNYW5hZ2VyIGNvbnRleHRNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wVXAiKTsgLy8kTk9OLU5MUy0xJAotCQljb250ZXh0TWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQljb250ZXh0TWVudS5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsKLQkJTWVudSBtZW51ID0gY29udGV4dE1lbnUuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKLQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoY29udGV4dE1lbnUsIHZpZXdlcik7Ci0KLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCXNldFNlbGVjdGlvbihzZWwpOwotCQkJfQotCQl9KTsKLQotCQlpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0xJTksgfCBETkQuRFJPUF9DT1BZOwotCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsgTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07Ci0JCXZpZXdlci5hZGREcm9wU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsCi0JCQkJbmV3IFByb2Nlc3NFZGl0b3JEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q3VycmVudFZpZXdlcihWaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIElmIGl0IGlzIGNoYW5naW5nLi4uCi0JCS8vCi0JCWlmIChjdXJyZW50Vmlld2VyICE9IHZpZXdlcikgewotCQkJaWYgKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQkJLy8gQ3JlYXRlIHRoZSBsaXN0ZW5lciBvbiBkZW1hbmQuCi0JCQkJLy8KLQkJCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJLy8gVGhpcyBqdXN0IG5vdGlmaWVzIHRob3NlIHRoaW5ncyB0aGF0IGFyZSBhZmZlY3RlZCBieSB0aGUKLQkJCQkJLy8gc2VjdGlvbi4KLQkJCQkJLy8KLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCgKLQkJCQkJCQlTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgc2VsZWN0aW9uQ2hhbmdlZEV2ZW50KSB7Ci0JCQkJCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCS8vIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBvbGQgb25lLgotCQkJLy8KLQkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKLQkJCQljdXJyZW50Vmlld2VyCi0JCQkJCQkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCQl9Ci0KLQkJCS8vIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbmV3IG9uZS4KLQkJCS8vCi0JCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCQl9Ci0KLQkJCS8vIFJlbWVtYmVyIGl0LgotCQkJLy8KLQkJCWN1cnJlbnRWaWV3ZXIgPSB2aWV3ZXI7Ci0KLQkJCS8vIFNldCBhZGFwdGVyIGZhY3Rvcnkgb2YgZWRpdGluZ0RvbWFpbiB0byB0aGF0IG9mIHRoZSBjdXJyZW50IHZpZXcKLQkJCS8vCi0JCQlpZiAoY3VycmVudFZpZXdlciBpbnN0YW5jZW9mIFByb2Nlc3NWaWV3ZXIpIHsKLQkJCQlJQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9ICgoUHJvY2Vzc1ZpZXdlcikgY3VycmVudFZpZXdlcikKLQkJCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCQlpZiAoY29udGVudFByb3ZpZGVyIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpIHsKLQkJCQkJQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgYWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgPSAoKEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKSBjb250ZW50UHJvdmlkZXIpOwotCQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyCi0JCQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIEVkaXRpbmdEb21haW5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJCQkoKEVkaXRpbmdEb21haW5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLnNldEVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllZGl0aW5nRG9tYWluLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQkJfQotCi0JCQkJCWlmIChwcm9wQ29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJCXByb3BDb250ZW50UHJvdmlkZXIuc2V0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBTZXQgdGhlIGVkaXRvcnMgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZpZXdlcidzCi0JCQkvLyBzZWxlY3Rpb24uCi0JCQkvLwotCQkJc2V0U2VsZWN0aW9uKGN1cnJlbnRWaWV3ZXIgPT0gbnVsbCA/IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkKLQkJCQkJOiBjdXJyZW50Vmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHkgZ2V0UGFyZW50QWN0aXZpdHkoQnJlYWtkb3duRWxlbWVudCBlLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJQWN0aXZpdHkgYWN0ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eShlKTsKLQkJaWYgKGFjdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWN0OwotCQl9Ci0KLQkJLy8gVE9ETzogaGFuZGxlIGVsZW1lbnQgdGhhdCBkb2VzIG5vdCBkaXJlY3RseSBiZWxvbmcgdG8gYW4gYWN0aXZpdHkKLQkJLy8gKGxpa2UgZGVsaXZlcmFibGUgcGFydCBvZiBhIGRlbGl2ZXJhYmxlIGRlc2NyaXB0b3IpCi0JCS8vCi0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKLQkJcmV0dXJuICgoQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpIHZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKSkKLQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNldFNlbGVjdGlvblRvVmlld2VyKFZpZXdlciB2aWV3ZXIsCi0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBvdGhlclNlbCwgYm9vbGVhbiBhbHRlcm5hdGVTZWxlY3Rpb24pIHsKLQkJaWYgKGFsdGVybmF0ZVNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJT2JqZWN0IGN1cnJlbnRTZWxlY3Rpb24gPSBudWxsOwotCQkJaWYgKHNlbC5zaXplKCkgPT0gMSkgewotCQkJCWN1cnJlbnRTZWxlY3Rpb24gPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKGN1cnJlbnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCUFjdGl2aXR5IGFjdCA9IGdldFBhcmVudEFjdGl2aXR5KAotCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBjdXJyZW50U2VsZWN0aW9uLAotCQkJCQkJCWdldEFkYXB0ZXJGYWN0b3J5KChTdHJ1Y3R1cmVkVmlld2VyKSB2aWV3ZXIpKTsKLQkJCQkJaWYgKGFjdCAhPSBvdGhlclNlbC5nZXRGaXJzdEVsZW1lbnQoKSkgewotCQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihvdGhlclNlbCwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24ob3RoZXJTZWwsIHRydWUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdmlld2VyLnNldFNlbGVjdGlvbihvdGhlclNlbCwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI3NldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzeW5jaHJvbml6aW5nU2VsZWN0aW9uKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyAvLyBjaGVjayBpZiB0aGUgcmVzb3VyY2VzIG9mIHNlbGVjdGVkIG9iamVjdHMgYXJlIG91dCBvZiBzeW5jaCBvciBhbnkKLQkJLy8gb2YgdGhlIHNlbGVjdGVkIG9iamVjdHMKLQkJLy8gLy8gYmVjYW1lIHByb3h5IHRoZW4gcmVmcmVzaCB0aGVtIGlmIG5lZWRlZAotCQkvLyAvLwotCQkvLyBpZihyZWZyZXNoT3V0T2ZTeW5jaChzZWxlY3Rpb24pKSB7Ci0JCS8vIHJldHVybjsKLQkJLy8gfQotCi0JCXZpZXdTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCUFycmF5TGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVyTGlzdAotCQkJCQkuZ2V0KGkpOwotCQkJbGlzdGVuZXIKLQkJCQkJLnNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBzZWxlY3Rpb24pKTsKLQkJfQotCi0JCS8vIHN5bmNocm9uaXplIHNlbGVjdGlvbiBpbiBhbGwgQlMgdmlld3MgaWYgb25seSBvbmUgZWxlbWVudCBpcyBzZWxlY3RlZAotCQkvLwotCQlzeW5jaHJvbml6ZVNlbGVjdGlvbihzZWxlY3Rpb24sIGN1cnJlbnRWaWV3ZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHJlZnJlc2hPdXRPZlN5bmNoKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCWJvb2xlYW4gcmVmcmVzaFJlcXVpcmVkID0gZmFsc2U7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCUhhc2hTZXQgcmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJRU9iamVjdCBlT2JqZWN0ID0gKChFT2JqZWN0KSBlKTsKLQkJCQkJaWYgKGVPYmplY3QuZUlzUHJveHkoKSkgewotCQkJCQkJZU9iamVjdCA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNvbHZlKGVPYmplY3QpOwotCQkJCQkJcmVmcmVzaFJlcXVpcmVkID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVPYmplY3QuZVJlc291cmNlKCk7Ci0JCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQlyZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICghcmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCUFycmF5TGlzdCByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUFycmF5TGlzdCBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCVJlc291cmNlVXRpbC5jaGVja091dE9mU3luY2hSZXNvdXJjZXMocmVzb3VyY2VzLAotCQkJCQkJcmVtb3ZlZFJlc291cmNlcywgY2hhbmdlZFJlc291cmNlcyk7Ci0JCQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSB8fCAhY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJYm9vbGVhbiByZXQgPSBwcm9tcHRSZWxvYWRGaWxlcygpOwotCQkJCQlpZiAocmV0KSB7Ci0JCQkJCQkvLyB1bmxvYWQgdGhlIHJlbW92ZWQgcmVzb3VyY2VzCi0JCQkJCQkvLwotCQkJCQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlbW92ZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgaXRlcgotCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlyZXNvdXJjZS51bmxvYWRXaXRob3V0UmVtb3ZlKCk7Ci0JCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlDb2xsZWN0aW9uIHJlbG9hZGVkUmVzb3VyY2VzID0gbnVsbDsKLQkJCQkJCWlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkvLyBSZWxvYWQgdGhlIGNoYW5nZWQgcmVzb3VyY2VzLgotCQkJCQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJCQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJCQkJcmVsb2FkZWRSZXNvdXJjZXMgPSBtYW5hZ2VyCi0JCQkJCQkJCQkJLnJlbG9hZFJlc291cmNlcyhjaGFuZ2VkUmVzb3VyY2VzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkKLQkJCQkJCQkJfHwgcmVsb2FkZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCQkJCXJlZnJlc2hSZXF1aXJlZCA9IHRydWU7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIHJlZnJlc2ggb3V0LW9mLXN5bmNoIHJlc291cmNlcwotCQkJCQkJLy8KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoYW5nZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCUZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVmcmVzaCgKLQkJCQkJCQkJCShSZXNvdXJjZSkgaXRlci5uZXh0KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlZnJlc2hSZXF1aXJlZCkgewotCQkJCWN1cnJlbnRWaWV3ZXIucmVmcmVzaCgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3luY2hyb25pemVTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24sIFZpZXdlciBjdXJyZW50Vmlld2VyKSB7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6aW5nU2VsZWN0aW9uID0gdHJ1ZTsKLQkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwKLQkJCQkJJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQlpZiAoc2VsLnNpemUoKSA9PSAxKSB7Ci0JCQkJCU9iamVjdCBzZWxlY3RlZCA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gb3RoZXJTZWwgPSBudWxsOwotCQkJCQlib29sZWFuIGFsdGVybmF0ZVNlbGVjdGlvbiA9IGZhbHNlOwotCQkJCQlBcnJheUxpc3Qgc2VsZWN0ZWRQYXRoID0gbnVsbDsKLQkJCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSgoU3RydWN0dXJlZFZpZXdlcikgY3VycmVudFZpZXdlcik7Ci0JCQkJCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlpZiAoKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgc2VsZWN0ZWQpCi0JCQkJCQkJCS5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJCQlpZiAoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQkJCQkvLyBnZXQgcGF0aAotCQkJCQkJCQkvLwotCQkJCQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKHNlbGVjdGVkKTsKLQkJCQkJCQkJc2VsZWN0ZWRQYXRoID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHNlbGVjdGVkOwotCQkJCQkJCQlkbyB7Ci0JCQkJCQkJCQlzZWxlY3RlZFBhdGguYWRkKDAsIGUpOwotCQkJCQkJCQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGUpOwotCQkJCQkJCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgcGFyZW50OwotCQkJCQkJCQkJCWUgPSBUbmdVdGlsLnVud3JhcChwYXJlbnQpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkJCQkJCS5hZGFwdCgKLQkJCQkJCQkJCQkJCQkJcGFyZW50LAotCQkJCQkJCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJCQkJCWUgPSBwYXJlbnQ7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gd2hpbGUgKHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAocHJvY1RhYi5nZXRWaWV3ZXIoKSA9PSBjdXJyZW50Vmlld2VyKSB7Ci0JCQkJCQkJc2VsZWN0ZWQgPSBUbmdVdGlsLnVud3JhcChzZWxlY3RlZCk7Ci0JCQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWQpOwotCQkJCQkJfSBlbHNlIGlmIChleHRlbnNpb25UYWJzICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvblRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJaWYgKGV4dGVuc2lvblRhYnNbaV0uZ2V0Vmlld2VyKCkgPT0gY3VycmVudFZpZXdlcikgewotCQkJCQkJCQkJc2VsZWN0ZWQgPSBUbmdVdGlsLnVud3JhcChzZWxlY3RlZCk7Ci0JCQkJCQkJCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCQkJCQkJc2VsZWN0ZWQpOwotCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJaWYgKHByb2NUYWIuZ2V0Vmlld2VyKCkgIT0gY3VycmVudFZpZXdlcikgewotCQkJCQkJCXByb2NUYWIuZ2V0Vmlld2VyKCkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJfQotCQkJCQkJaWYgKGV4dGVuc2lvblRhYnMgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uVGFicy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQlpZiAoZXh0ZW5zaW9uVGFic1tpXS5nZXRWaWV3ZXIoKSAhPSBjdXJyZW50Vmlld2VyKQotCQkJCQkJCQkJZXh0ZW5zaW9uVGFic1tpXS5nZXRWaWV3ZXIoKS5zZXRTZWxlY3Rpb24oCi0JCQkJCQkJCQkJCXNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCQkJfHwgc2VsZWN0ZWQgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCQkJCQlvdGhlclNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlBY3Rpdml0eSBhY3QgPSBnZXRQYXJlbnRBY3Rpdml0eSgKLQkJCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBzZWxlY3RlZCwgYWRhcHRlckZhY3RvcnkpOwotCQkJCQkJCWlmIChhY3QgIT0gbnVsbCkgewotCQkJCQkJCQlvdGhlclNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGFjdCk7Ci0JCQkJCQkJCWFsdGVybmF0ZVNlbGVjdGlvbiA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChvdGhlclNlbCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBvd24gZWxlbWVudCBpcyBzZWxlY3RlZAotCQkJCQkJLy8KLQkJCQkJCVZpZXdlciB2aWV3ZXIgPSBXQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQkJCQlpZiAodmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXNldFNlbGVjdGlvblRvVmlld2VyKHZpZXdlciwgb3RoZXJTZWwsCi0JCQkJCQkJCQkJYWx0ZXJuYXRlU2VsZWN0aW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQl2aWV3ZXIgPSBPQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQkJCQlpZiAodmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXNldFNlbGVjdGlvblRvVmlld2VyKHZpZXdlciwgb3RoZXJTZWwsCi0JCQkJCQkJCQkJYWx0ZXJuYXRlU2VsZWN0aW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQl2aWV3ZXIgPSBQQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQkJCQlpZiAodmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIGZhbHNlKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlzZXRTZWxlY3Rpb25Ub1ZpZXdlcih2aWV3ZXIsIG90aGVyU2VsLAotCQkJCQkJCQkJCWFsdGVybmF0ZVNlbGVjdGlvbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKHNlbGVjdGVkUGF0aCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBpbmhlcml0ZWQgZWxlbWVudCBpcyBzZWxlY3RlZAotCQkJCQkJLy8KLQkJCQkJCVZpZXdlciB2aWV3ZXIgPSBXQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQkJCQlpZiAodmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaW5kU2VsZWN0aW9uKAotCQkJCQkJCQkJc2VsZWN0ZWRQYXRoLCBXQlNUYWIuZ2V0QWRhcHRlckZhY3RvcnkoKSkpOwotCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCQl2aWV3ZXIgPSBPQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQkJCQlpZiAodmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaW5kU2VsZWN0aW9uKAotCQkJCQkJCQkJc2VsZWN0ZWRQYXRoLCBPQlNUYWIuZ2V0QWRhcHRlckZhY3RvcnkoKSkpOwotCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCQl2aWV3ZXIgPSBQQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQkJCQlpZiAodmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaW5kU2VsZWN0aW9uKAotCQkJCQkJCQkJc2VsZWN0ZWRQYXRoLCBQQlNUYWIuZ2V0QWRhcHRlckZhY3RvcnkoKSkpOwotCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCQl2aWV3ZXIgPSBwcm9jVGFiLmdldFZpZXdlcigpOwotCQkJCQkJaWYgKHZpZXdlciAhPSBjdXJyZW50Vmlld2VyKSB7Ci0JCQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmluZFNlbGVjdGlvbigKLQkJCQkJCQkJCXNlbGVjdGVkUGF0aCwgcHJvY1RhYi5nZXRBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIGZhbHNlKTsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKGV4dGVuc2lvblRhYnMgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uVGFicy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQl2aWV3ZXIgPSBleHRlbnNpb25UYWJzW2ldLmdldFZpZXdlcigpOwotCQkJCQkJCQlpZiAodmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQkJCXNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJCQkJCQlmaW5kU2VsZWN0aW9uKAotCQkJCQkJCQkJCQkJCXNlbGVjdGVkUGF0aCwKLQkJCQkJCQkJCQkJCQlleHRlbnNpb25UYWJzW2ldCi0JCQkJCQkJCQkJCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKSkpOwotCQkJCQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIGZhbHNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXN5bmNocm9uaXppbmdTZWxlY3Rpb24gPSBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIE9iamVjdCBmaW5kU2VsZWN0aW9uKExpc3Qgc2VsZWN0ZWRQYXRoLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJaW50IHNpemUgPSBzZWxlY3RlZFBhdGguc2l6ZSgpOwotCQlpZiAoc2l6ZSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlPYmplY3QgZSA9IHNlbGVjdGVkUGF0aC5nZXQoMCk7Ci0JCU9iamVjdCBzZWxlY3Rpb24gPSBlOwotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGUsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBhZGFwdGVyLmdldENoaWxkcmVuKGUpOwotCQlmaW5kX3NlbGVjdGlvbjogZm9yIChpbnQgaSA9IDE7IGkgPCBzaXplOyBpKyspIHsKLQkJCWUgPSBzZWxlY3RlZFBhdGguZ2V0KGkpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gZSkgewotCQkJCQlzZWxlY3Rpb24gPSBjaGlsZDsKLQkJCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCQkJCWNoaWxkLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQljaGlsZHJlbiA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZSk7Ci0JCQkJCWNvbnRpbnVlIGZpbmRfc2VsZWN0aW9uOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrIGZpbmRfc2VsZWN0aW9uOwotCQl9Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCi0JLy8gSW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIKLQkvLwotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2dldFNlbGVjdGlvbigpCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gdmlld1NlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyI2dldEVkaXRpbmdEb21haW4oKQotCSAqLwotCXB1YmxpYyBFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyI2dldFZpZXdlcigpCi0JICovCi0JcHVibGljIFZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0JCXJldHVybiBjdXJyZW50Vmlld2VyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0ZXIgZmFjdG9yeSBvZiB0aGUgY3VycmVudCBwYWdlIGlmIHRoZXJlIGlzIGFueQotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCUFkYXB0ZXIgRmFjdG9yeSBvZiB0aGUgY3VycmVudCBwYWdlIG9mIHRoZSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCUlGb3JtUGFnZSBwYWdlID0gZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCk7Ci0JCWlmIChwYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIHBhZ2UpCi0JCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lciNtZW51QWJvdXRUb1Nob3cob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCSgoSU1lbnVMaXN0ZW5lcikgZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkpCi0JCQkJLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7Ci0JCQotCQkvLyBwb3B1bGF0ZSBjb250cmlidXRlZCBtZW51IGl0ZW1zCi0JCS8vCi0JCUlGb3JtUGFnZSBhY3RpdmVQYWdlID0gZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCk7Ci0JCWlmKGFjdGl2ZVBhZ2UgaW5zdGFuY2VvZiBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIHsKLQkJCUlBY3Rpb25bXSBhY3Rpb25zID0gKChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpYWN0aXZlUGFnZSkuZ2V0QWRkaXRpb25hbEFjdGlvbnMoKTsKLQkJCWlmKGFjdGlvbnMgIT0gbnVsbCAmJiBhY3Rpb25zLmxlbmd0aCA+IDApIHsKLQkJCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgbmV3IFNlcGFyYXRvcigpKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFjdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUFjdGlvbiBhY3Rpb24gPSBhY3Rpb25zW2ldOwotCQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotCQkJCQlpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiAmJiBhY3Rpb24gaW5zdGFuY2VvZiBCYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24pIHsKLQkJCQkJCSgoQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uKWFjdGlvbikuc2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCQkJCX0KLQkJCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIElXb3JrYmVuY2hQYXJ0QWN0aW9uKSB7Ci0JCQkJCQkoKElXb3JrYmVuY2hQYXJ0QWN0aW9uKSBhY3Rpb24pCi0JCQkJCQkJCS5zZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KHRoaXMpOwotCQkJCQl9Ci0JCQkJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBwcm9wZXJ0eSBzaGVldCBwYWdlCi0JICogQHJldHVybgotCSAqIAkJCVByb3BlcnR5U2hlZXQgUGFnZQotCSAqLwotCXB1YmxpYyBJUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7Ci0JCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZSA9IG5ldyBFUEZQcm9wZXJ0eVNoZWV0UGFnZSh0aGlzKTsKLQkJCS8vIHsKLQkJCS8vIHB1YmxpYyB2b2lkIG1ha2VDb250cmlidXRpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlciwKLQkJCS8vIElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciwgSVN0YXR1c0xpbmVNYW5hZ2VyCi0JCQkvLyBzdGF0dXNMaW5lTWFuYWdlcikgewotCQkJLy8gc3VwZXIubWFrZUNvbnRyaWJ1dGlvbnMobWVudU1hbmFnZXIsIHRvb2xCYXJNYW5hZ2VyLAotCQkJLy8gc3RhdHVzTGluZU1hbmFnZXIpOwotCQkJLy8gfQotCQkJLy8KLQkJCS8vIHB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQkJLy8gc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLQkJCS8vIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2hhcmVHbG9iYWxBY3Rpb25zKHRoaXMsIGFjdGlvbkJhcnMpOwotCQkJLy8gfQotCQkJLy8gfTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2V0dGluZyBwcm92aWRlciAiKTsKLQkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKLQkJCQlBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSAoQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpICgoUHJvY2Vzc1ZpZXdlcikgY3VycmVudFZpZXdlcikKLQkJCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCQlwcm9wQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQkJY29udGVudFByb3ZpZGVyLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCXByb3BlcnR5U2hlZXRQYWdlCi0JCQkJCQkuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihwcm9wQ29udGVudFByb3ZpZGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvcGVydHlTaGVldFBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGtleSkgewotCQlpZiAoa2V5LmVxdWFscyhJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpKSB7Ci0JCQlyZXR1cm4gZ2V0UHJvcGVydHlTaGVldFBhZ2UoKTsKLQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKElHb3RvTWFya2VyLmNsYXNzKSkgewotCQkJcmV0dXJuIHRoaXM7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yI2dldENvbnRyaWJ1dG9ySWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udHJpYnV0b3JJZCgpIHsKLQkJcmV0dXJuIGdldFNpdGUoKS5nZXRJZCgpOwotCX0KLQotCQotCS8qKgotCSAqIFJldHVybiBjb2x1bW4gZGVzY3JpcHRvciBsaXN0IGZvciBnaXZlbiBzdHJpbmcKLQkgKiBAcGFyYW0gc3RyCi0JICogQHJldHVybgotCSAqIAkJCWxpc3Qgb2YgY29sdW1uIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBFTGlzdCB0b0NvbHVtbkRlc2NyaXB0b3JMaXN0KFN0cmluZyBzdHIpIHsKLQkJRUxpc3QgY29sdW1uRGVzY3JpcHRvcnMgPSBuZXcgQmFzaWNFTGlzdCgpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKLQkJCU9iamVjdCBjb2x1bW5EZXNjcmlwdG9yID0gUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcAotCQkJCQkuZ2V0KHRva2VuKTsKLQkJCWlmIChjb2x1bW5EZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQljb2x1bW5EZXNjcmlwdG9ycy5hZGQoY29sdW1uRGVzY3JpcHRvcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbHVtbkRlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhcnJheSBvZiBjb2x1bW4gZGVzY3JpcHRvcnMgZm9yIHRoZSBnaXZlbiBzdHJpbmcKLQkgKiBAcGFyYW0gc3RyCi0JICogQHJldHVybgotCSAqIAkJCWxpc3Qgb2YgY29sdW1uIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2x1bW5EZXNjcmlwdG9yW10gdG9Db2x1bW5EZXNjcmlwdG9ycyhTdHJpbmcgc3RyKSB7Ci0JCUxpc3QgbGlzdCA9IHRvQ29sdW1uRGVzY3JpcHRvckxpc3Qoc3RyKTsKLQkJQ29sdW1uRGVzY3JpcHRvcltdIGNvbHVtbnMgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShjb2x1bW5zKTsKLQkJcmV0dXJuIGNvbHVtbnM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvciNnZXRDdXJyZW50UGFnZSgpCi0JICovCi0JcHVibGljIGludCBnZXRDdXJyZW50UGFnZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEN1cnJlbnRQYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHN1cHByZXNzaW9uIGluZm8KLQkgKi8KLQlwdWJsaWMgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oKSB7Ci0JCXJldHVybiBzdXBwcmVzc2lvbjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29uZmlnQ2hhbmdlZCgpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCWlmIChjb25maWcgIT0gY3VycmVudENvbmZpZykgewotCQkJLy8gcmVmcmVzaCBvbmx5IGlmIHRoZSBhY3RpdmUgcGFydCBpcyB0aGlzIGVkaXRvciBvciBkaWFncmFtIGVkaXRvcgotCQkJLy8gb2YgYW55IGFjdGl2aXR5IGluIHRoaXMgcHJvY2VzcwotCQkJLy8KLQkJCUlXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkKLQkJCQkJLmdldFBhcnRTZXJ2aWNlKCkuZ2V0QWN0aXZlUGFydCgpOwotCQkJYm9vbGVhbiByZWZyZXNoID0gYWN0aXZlUGFydCA9PSB0aGlzOwotCQkJaWYgKCFyZWZyZXNoKSB7Ci0JCQkJaWYgKGFjdGl2ZVBhcnQgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IGlucHV0ID0gKEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCkgKChJRWRpdG9yUGFydCkgYWN0aXZlUGFydCkKLQkJCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQkJcmVmcmVzaCA9IGlucHV0LmdldFN1cHByZXNzaW9uKCkuZ2V0UHJvY2VzcygpID09IHNlbGVjdGVkUHJvY2VzczsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocmVmcmVzaCkgewotCQkJCWN1cnJlbnRDb25maWcgPSBjb25maWc7Ci0JCQkJcmVmcmVzaEFsbCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciNzZXRJbnB1dChvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCAhPSBnZXRFZGl0b3JJbnB1dCgpKSB7Ci0JCQlpbnB1dENoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCXN1cGVyLnNldElucHV0KGlucHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI3VwZGF0ZVBhZ2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQYWdlcygpIHsKLQkJLy8gcmVtb3ZlIGFuZCBhZGQgZGVzY3JpcHRpb24gcGFnZSBpZiB0aGUgbW9kZWwueG1pIG9yIGNvbnRlbnQueG1pIG9mCi0JCS8vIHRoZSBwcm9jZXNzIGhhdmUgYmVlbiBjaGFuZ2VkCi0JCS8vCi0JCVJlc291cmNlIG1vZGVsUmVzb3VyY2UgPSBzZWxlY3RlZFByb2Nlc3MuZVJlc291cmNlKCk7Ci0JCVJlc291cmNlIGNvbnRlbnRSZXNvdXJjZSA9IHNlbGVjdGVkUHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKQotCQkJCS5lUmVzb3VyY2UoKTsKLQkJaWYgKGNoYW5nZWRSZXNvdXJjZXMuY29udGFpbnMobW9kZWxSZXNvdXJjZSkKLQkJCQl8fCAoY29udGVudFJlc291cmNlICE9IG51bGwgJiYgY2hhbmdlZFJlc291cmNlcwotCQkJCQkJLmNvbnRhaW5zKGNvbnRlbnRSZXNvdXJjZSkpKSB7Ci0JCQlyZW1vdmVQYWdlKDApOwotCQkJdHJ5IHsKLQkJCQlhZGREZXNjcmlwdGlvblBhZ2UoKTsKLQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JUaXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JNc2csIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJaWYgKGlucHV0Q2hhbmdlZCkgewotCQkJaW5wdXRDaGFuZ2VkKGdldEVkaXRvcklucHV0KCkpOwotCQkJaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKLQkJCQlwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZWZyZXNoQWxsKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmcmVzaEFsbCgpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlkb1JlZnJlc2hBbGwodHJ1ZSk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2ggYWxsIHZpZXdlcnMgCi0JICogQHBhcmFtIHVwZGF0ZUlEcwotCSAqIAkJCWlmIHRydWUsIHRoZW4gcmVmcmVzaCBhbGwgaW5kZXggaW4gdmlld2VycwotCSAqLwotCXB1YmxpYyB2b2lkIGRvUmVmcmVzaEFsbChib29sZWFuIHVwZGF0ZUlEcykgewotCQlpZiAodXBkYXRlSURzKSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJUHJvY2Vzc1V0aWwudXBkYXRlSURzKGFkYXB0ZXJGYWN0b3J5LCBzZWxlY3RlZFByb2Nlc3MpOwotCQkJUHJvY2Vzc1V0aWwucmVmcmVzaFByZWRlY2Nlc3Nvckxpc3RzKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQlzZWxlY3RlZFByb2Nlc3MpOwotCi0JCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJUHJvY2Vzc1V0aWwudXBkYXRlSURzKGFkYXB0ZXJGYWN0b3J5LCBzZWxlY3RlZFByb2Nlc3MpOwotCQl9Ci0KLQkJV0JTVGFiLmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJT0JTVGFiLmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJUEJTVGFiLmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJcHJvY1RhYi5nZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0KLQkJaWYgKGV4dGVuc2lvblRhYnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25UYWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZXh0ZW5zaW9uVGFic1tpXS5nZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCkgewotCQkJcHJvcGVydHlTaGVldFBhZ2UucmVmcmVzaCgpOwotCQl9Ci0JfQotCQotCi0JLyoqCi0JICogUmVmcmVzaCBhbGwgb3BlbiBwcm9jZXNzIGVkaXRvcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoQWxsUHJvY2Vzc0VkaXRvcnMoKSB7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9yKSB7Ci0JCQkJKChQcm9jZXNzRWRpdG9yKSBlZGl0b3IpLmRvUmVmcmVzaEFsbChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yI2dldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIElGb3JtUGFnZSBnZXRBY3RpdmVQYWdlSW5zdGFuY2UoKSB7Ci0JCWludCBpbmRleCA9IGdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJcmV0dXJuIHN1cGVyLmdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBic1BhZ2VzW2luZGV4IC0gMV07Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSBzdXBlci5nZXRNb2RpZmllZFJlc291cmNlcygpOwotCQlpZiAoc3VwcHJlc3Npb24uaXNTYXZlTmVlZGVkKCkKLQkJCQkmJiAhbW9kaWZpZWRSZXNvdXJjZXMuY29udGFpbnMoc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50Ci0JCQkJCQkuZVJlc291cmNlKCkpKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50LmVSZXNvdXJjZSgpKTsKLQkJfQotCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwocmVzb3VyY2VzVG9TYXZlKTsKLQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciNkb1NhdmUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzdXBwcmVzc2lvbi5zYXZlVG9Nb2RlbCgpOwotCQlzdXBlci5kb1NhdmUobW9uaXRvcik7Ci0JCXN1cHByZXNzaW9uLnNhdmVJc0RvbmUoKTsKLQkJcmVzb3VyY2VzVG9TYXZlLmNsZWFyKCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCWlmIChzdXBwcmVzc2lvbi5pc1NhdmVOZWVkZWQoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzRGlydHkoKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNmaXJlUHJvcGVydHlDaGFuZ2UoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShpbnQgcHJvcGVydHlJZCkgewotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UocHJvcGVydHlJZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciNnZXRVc2VkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRVc2VkUmVzb3VyY2VzKCkgewotCQlIYXNoU2V0IHVzZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCi0JCS8vIG1vZGVsLnhtaQotCQkvLwotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVsZW1lbnRPYmouZVJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQl1c2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCX0KLQotCQkvLyBjb250ZW50LnhtaQotCQkvLwotCQlyZXNvdXJjZSA9IHNlbGVjdGVkUHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXVzZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJfQotCi0JCS8vIGNvbmZpZ3VyYXRpb24ueG1pCi0JCS8vCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gc2VsZWN0ZWRQcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJcmVzb3VyY2UgPSBjb25maWcuZVJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCXVzZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCi0JCS8vIHJlc291cmNlcyBvZiBvdGhlciBwcm9jZXNzZXMgdGhhdCB0aGlzIHByb2Nlc3MgaXMgZGVwZW5kaW5nIG9uCi0JCS8vCi0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gV0JTVGFiLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihhZGFwdGVyRmFjdG9yeSwKLQkJCQlzZWxlY3RlZFByb2Nlc3MpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCXJlc291cmNlID0gKChFT2JqZWN0KSBvYmopLmVSZXNvdXJjZSgpOwotCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXVzZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlsYXN0VXNlZFJlc291cmNlcyA9IHVzZWRSZXNvdXJjZXM7Ci0KLQkJcmV0dXJuIHVzZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgd2hldGhlciBzZWxlY3RlZCBvYmplY3RzIGNhbiBiZSByZXZlYWxlZCBvciBub3QgYW5kIHJldHVucyByZXN1bHQKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogCQkJTGlzdCBvZiBvYmplY3RzCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogCQkJQWRhcHRlciBmYWN0b3J5IG9mIHRoZSBzZWxlY3RlZCBvYmplY3RzCi0JICogQHBhcmFtIHN1cHByZXNzaW9uCi0JICogCQkJU3VwcHJlc3Npb24gaW5mb3JtYXRpb24KLQkgKiBAcmV0dXJuCi0JICogCQlCb29sZWFuIHZhbHVlIHRvIGluZGljYXRlIHdoZXRoZXIgc2VsZWN0ZWQgb2JqZWN0cyBjYW4gYmUgcmV2ZWFsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuUmV2ZWFsKENvbGxlY3Rpb24gc2VsZWN0aW9uLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCS8vIGNoZWNrIGlmIHJldmVhbGluZyB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgd2lsbCBjYXVzZSBuYW1lIGR1cGxpY2F0aW9uCi0JCS8vCi0JCVN0cmluZyBtc2cgPSBzdXBwcmVzc2lvbi5jaGVja0R1cGxpY2F0ZU5hbWVBZnRlclJldmVhbChzZWxlY3Rpb24sCi0JCQkJYWRhcHRlckZhY3RvcnkpOwotCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbCwgLy8kTk9OLU5MUy0xJCAKLQkJCQkJbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGNoZWNrIGlmIHJldmVhbGluZyB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgd2lsbCBjYXVzZSBkdXBsaWNhdGUKLQkJLy8gZGVzY3JpcHRvcnMuCi0JCS8vIElmIHNvLCBwcm9tcHQgdXNlciB0byBkZWxldGUgdGhlIGR1cGxpY2F0ZXMgYmVmb3JlIGNvbnRpbnVpbmcuCi0JCS8vCi0JCUNvbGxlY3Rpb24gZHVwbGljYXRlcyA9IFByb2Nlc3NVdGlsCi0JCQkJLmdldER1cGxpY2F0ZURlc2NyaXB0b3JzQWZ0ZXJSZXZlYWwoc2VsZWN0aW9uKTsKLQkJaWYgKCFkdXBsaWNhdGVzLmlzRW1wdHkoKSkgewotCQkJTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0SWQoKSwgMCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkdXBsaWNhdGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCURlc2NyaXB0b3IgZGVzYyA9IChEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQlTdHJpbmcgZGVzY1R4dCA9IFRuZ1V0aWwuZ2V0VHlwZVRleHQoZGVzYykKLQkJCQkJCSsgIjogIiArIGRlc2MuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgMCwgZGVzY1R4dCwgbnVsbCkpOwotCQkJfQotCQkJaWYgKEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbCwgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX3Byb21wdFRvRGVsZXRlQmVmb3JlUmV2ZWFsLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJc3RhdHVzKSA9PSBEaWFsb2cuQ0FOQ0VMKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQkvLyBkZWxldGUgZHVwbGljYXRlIGRlc2NyaXB0b3JzCi0JCQl0cnkgewotCQkJCVByb2Nlc3NEZWxldGVBY3Rpb24uZGVsZXRlKGR1cGxpY2F0ZXMpOwotCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzSW5oZXJpdGVkKENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoUHJvY2Vzc1V0aWwuaXNJbmhlcml0ZWQoZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJLy8gcHJlZmVyZW5jZSBpcyBtYW5hZ2VkIGJ5IGxpYnJhcnkgcGx1Z2luLAotCQkvLyBzaW5jZSB0aGlzIHByZWZlcmVuY2VzIGlzIGFsc28gdXNlZCBmb3IgYnJvd3NpbmcgYW5kIHB1Ymxpc2hpbmcKLQkJLy8gSmluaHVhIFhpIDA4LzIxLzIwMDYKLQkJLy8gSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkvLyAuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlyZXR1cm4gc3RvcmU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1Byb2Nlc3NFZGl0b3JJbnB1dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJvY2Vzc0VkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5YzU3OGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJvY2Vzc0VkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotCi0vKioKLSAqIEFuIGVkaXRvciBpbnB1dCBmb3IgcHJvY2VzcyBlZGl0b3IKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NFZGl0b3JJbnB1dCBleHRlbmRzIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCB7Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb247Ci0JcHJpdmF0ZSBpbnQgYWN0aXZlUGFnZSA9IC0xOwotCi0JcHVibGljIFByb2Nlc3NFZGl0b3JJbnB1dChNZXRob2RFbGVtZW50IGUpIHsKLQkJc3VwZXIoZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFjdGl2ZSBwYWdlIG9mIHRoZSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFjdGl2ZVBhZ2UoKSB7Ci0JCXJldHVybiBhY3RpdmVQYWdlOwotCX0KLQotCS8qKgotCSAqIFNldCBhY3RpdmUgcGFnZSBmb3IgdGhlIGVkaXRvcgotCSAqIEBwYXJhbSBhY3RpdmVQYWdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFnZShpbnQgYWN0aXZlUGFnZSkgewotCQl0aGlzLmFjdGl2ZVBhZ2UgPSBhY3RpdmVQYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBpbml0aWFsIHNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKiAJCQlTZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRJbml0aWFsU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gaW5pdGlhbFNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgaW5pdGlhbCBzZWxlY3Rpb24gCi0JICogQHBhcmFtIGluaXRpYWxTZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKElTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbikgewotCQl0aGlzLmluaXRpYWxTZWxlY3Rpb24gPSBpbml0aWFsU2VsZWN0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmMyNzI1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBtZXRob2QsIHByb2Nlc3MgYW5kIGFjdGl2aXR5IGRpYWdyYW0gZWRpdG9ycy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BYnN0cmFjdEJhc2VGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0Fic3RyYWN0QmFzZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OWIyMzRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0Fic3RyYWN0QmFzZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJIZWxwZXI7Ci0KLS8qKgotICogVGhlIGJhc2UgY2xhc3MgZm9yIFVJIGZpbHRlcnMuIFN1cHBvcnRzIG11bHRpcGxlIGZpbHRlcnMuCi0gKiBTdXBwb3J0IGZpbHRlcmluZyB0aGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgcGF0dGVybiBhbmQgdHlwZS4gCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFic3RyYWN0QmFzZUZpbHRlciB7Ci0KLQlwcm90ZWN0ZWQgRmlsdGVySGVscGVyIGhlbHBlcjsKLQotCXByb3RlY3RlZCBJRmlsdGVyW10gYWRkaXRpb25hbEZpbHRlcnMgPSBudWxsOwotCi0JLyoqCi0JICogYWRkZWQgZm9yIGZ1dGhlciBmaWx0ZXJpbmcuIEZvciBleGFtcGxlLCB3ZSBtYXkgc2V0IGEgZmlsZXIgdG8gcHJldmVudAotCSAqIGdlbmVyYWxpemVycyBhcyBiYXNlIGVsZW1lbnQgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeQotCSAqIAotCSAqIEBwYXJhbSBhZGRpdGlvbmFsRmlsdGVycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkZGl0aW9uYWxGaWx0ZXJzKElGaWx0ZXJbXSBhZGRpdGlvbmFsRmlsdGVycykgewotCQl0aGlzLmFkZGl0aW9uYWxGaWx0ZXJzID0gYWRkaXRpb25hbEZpbHRlcnM7Ci0JfQotCi0JcHVibGljIEZpbHRlckhlbHBlciBnZXRIZWxwZXIoKSB7Ci0JCXJldHVybiBoZWxwZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SGVscGVyKEZpbHRlckhlbHBlciBoZWxwZXIpIHsKLQkJdGhpcy5oZWxwZXIgPSBoZWxwZXI7Ci0JfQotCi0JLyoKLQkgKiBzdWJjbGFzcyBtZXRob2Qgc2hvdWxkIGNhbGwgdGhpcyBiZWZvcmUgcmV0dXJuaW5nIHRydWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQotCQkvLyBKaW5odWEgWGksIGFkZGVkIGZvciBmdXRoZXIgZmlsdGVyaW5nLgotCQkvLyBGb3IgZXhhbXBsZSwgd2UgbWF5IHNldCBhIGZpbGVyIHRvIHByZXZlbnQgZ2VuZXJhbGl6ZXJzIGFzIGJhc2UKLQkJLy8gZWxlbWVudCB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5Ci0JCWlmIChhZGRpdGlvbmFsRmlsdGVycyAhPSBudWxsICYmIGFkZGl0aW9uYWxGaWx0ZXJzLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkaXRpb25hbEZpbHRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoYWRkaXRpb25hbEZpbHRlcnNbaV0uYWNjZXB0KG9iaikgPT0gZmFsc2UpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWN0aXZpdHlWYXJpYWJpbGl0eUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWN0aXZpdHlWYXJpYWJpbGl0eUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNzdkNTYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0FjdGl2aXR5VmFyaWFiaWxpdHlGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotLyoqCi0gKiBBY3Rpdml0eSB2YXJpYWJpbGl0eSBmaWx0ZXIKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlWYXJpYWJpbGl0eUZpbHRlciBleHRlbmRzIEV4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvciB7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5ID0gbnVsbDsKLQkKLQlwcml2YXRlIExpc3QgdHJlZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBMaXN0IGdlbmVyYWxpemVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIExpc3QgYmFzZWVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTGlzdCBiYWRlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBBY3Rpdml0eVZhcmlhYmlsaXR5RmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJVGFibGVWaWV3ZXIgdmlld2VyLCBTdHJpbmcgdGFiTmFtZSwgQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIpOwotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JCQotCQkvLyBsb2FkIHRoZSBwYXJlbnRsaXN0Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXIgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlGaWx0ZXJVdGlsLmdldFN1YlRyZWUoYWRhcHRlciwgYWN0aXZpdHksIHRyZWVMaXN0KTsKLQkJRmlsdGVyVXRpbC5nZXRHZW5lcmFsaXplcnModHJlZUxpc3QsIGdlbmVyYWxpemVycyk7Ci0JCUZpbHRlclV0aWwuZ2V0VmFyaWFiaWxpdHlCYXNlKHRyZWVMaXN0LCBiYXNlZWxlbWVudHMpOwotCQkKLQkJRmlsdGVyVXRpbC5nZXRTdWJUcmVlKGFkYXB0ZXIsIGdlbmVyYWxpemVycywgYmFkZWxlbWVudHMpOwotCQlGaWx0ZXJVdGlsLmdldFN1YlRyZWUoYWRhcHRlciwgYmFzZWVsZW1lbnRzLCBiYWRlbGVtZW50cyk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJaWYgKHN1cGVyLmFjY2VwdChvYmopKSByZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGNoaWxkQWNjZXB0KG9iaik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiB0cnVlOwotCi0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgfHwgb2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCWlmICgob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpKXsKLQkJCQlpZih0aGlzLmFjdGl2aXR5LmVxdWFscygoQWN0aXZpdHkpIG9iaikpIAotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoKEFjdGl2aXR5KW9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmKGUgIT0gbnVsbCAmJiBhY3Rpdml0eS5lcXVhbHMoZSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJUHJvY2VzcyBzcmNQcm9jID0gVG5nVXRpbAotCQkJCQkJLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIG9iaik7Ci0JCQkJUHJvY2VzcyB0YXJnZXRQcm9jID0gVG5nVXRpbAotCQkJCQkJLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIHRoaXMuYWN0aXZpdHkpOwotCQkJCWlmIChzcmNQcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzCi0JCQkJCQkmJiB0YXJnZXRQcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQlpZihUbmdVdGlsLmNvbnRhaW5zKGdlbmVyYWxpemVycywgb2JqKSAKLQkJCQkJCXx8IFRuZ1V0aWwuY29udGFpbnMoYmFzZWVsZW1lbnRzLCBvYmopCi0JCQkJCQl8fFRuZ1V0aWwuY29udGFpbnMoYmFkZWxlbWVudHMsIG9iaikpewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJCi0vLwkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0vLwkJCQlQcm9jZXNzIHByb2MgPSAoUHJvY2Vzcykgb2JqOwotLy8JCQkJaWYgKHByb2MuZXF1YWxzKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyh0aGlzLmFjdGl2aXR5KSkpCi0vLwkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQl9Ci0vLwkJCWlmKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLS8vCQkJCWlmKFRuZ1V0aWwuY29udGFpbnMoY29udHJpYnV0b3JzLCBvYmopKSByZXR1cm4gZmFsc2U7Ci0vLwkJCQlpZihUbmdVdGlsLmNvbnRhaW5zKHZhcmlhYmlsaXR5YmFzZXMsIG9iaikpIHJldHVybiBmYWxzZTsKLS8vCQkJCWlmKG9iai5lcXVhbHMoRmlsdGVyVXRpbC5nZXRQYXJlbnRBY3Rpdml0eShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCAKLS8vCQkJCQkJYWN0aXZpdHkpKSkgcmV0dXJuIGZhbHNlOwotLy8JCQl9Ci0JCQkKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BZGRMaW5rRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BZGRMaW5rRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBjZmQ1YTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWRkTGlua0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5Db250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUFsbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5QbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiBGaWx0ZXIgZm9yIEFkZExpbmsgaW4gUmljaFRleHRFZGl0b3IuCi0gKiAKLSAqLwotCi1wdWJsaWMgY2xhc3MgQWRkTGlua0ZpbHRlciBleHRlbmRzIEFic3RyYWN0QmFzZUZpbHRlciBpbXBsZW1lbnRzIElBbGxGaWx0ZXIgewotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCi0JCS8vIGlmIGNhbid0IGJlIGFjY2RlcHRlZCBieSBzdXBlciwgcmV0dXJuLgotCQlpZihvYmogPT0gbnVsbCApcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKCFzdXBlci5hY2NlcHQob2JqKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIGZpbHRlclR5cGVTdHJpbmcgPSBoZWxwZXIuZ2V0RmlsdGVyVHlwZVN0cigpOwotCQlPYmplY3QgY29udGVudEVsZW1lbnQgPSBoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQotCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKSAhPSBudWxsKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKAotCQkJCQkJKChQcm9jZXNzQ29tcG9uZW50KSBvYmopLmdldFByb2Nlc3MoKSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMob2JqKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwKLQkJCQkmJiAhKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgfHwgb2JqIGluc3RhbmNlb2YgUHJvY2VzcykpIHsKLQkJCWlmIChvYmouZXF1YWxzKGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZmlsdGVyVHlwZVN0cmluZyA9PSBudWxsCi0JCQkJfHwgZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUykKLQkJCQl8fCBmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuTUVUSE9fUExVR0lOUykpIHsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBvYmopKSB7Ci0JCQkJCWlmICgoKEN1c3RvbUNhdGVnb3J5KSBvYmopLmdldENhdGVnb3JpemVkRWxlbWVudHMoKQotCQkJCQkJCS5pc0VtcHR5KCkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlDb2xsZWN0aW9uIGxpc3QgPSAoKFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJZm9yIChJdGVyYXRvciBpb3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGlvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSBpb3IubmV4dCgpOwotCQkJCQlpZiAoKChDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqZWN0KQotCQkJCQkJCS5nZXRDaGlsZHJlbihvYmplY3QpLmlzRW1wdHkoKSkKLQkJCQkJCWlvci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAoY2hpbGRBY2NlcHQob2JqKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKG9iaiwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykgewotCQkJCXJldHVybiAhKChEaXNjaXBsaW5lR3JvdXBpbmcpIG9iaikuZ2V0RGlzY2lwbGluZXMoKS5pc0VtcHR5KCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJCXJldHVybiB0cnVlOy8vIEFzc29jaWF0aW9uSGVscGVyLmdldERpc2NpcGxpbmVHcm91cHMoKERpc2NpcGxpbmUpb2JqKS5pc0VtcHR5KCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlJPTEVTRVRTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIikpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykgewotCQkJCXJldHVybiAhKChSb2xlU2V0R3JvdXBpbmcpIG9iaikuZ2V0Um9sZVNldHMoKS5pc0VtcHR5KCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJCXJldHVybiB0cnVlOy8vIEFzc29jaWF0aW9uSGVscGVyLmdldFJvbGVTZXRHcm91cHMoKFJvbGVTZXQpb2JqKS5pc0VtcHR5KCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQkKLQkJCQlyZXR1cm4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKG9iaiwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwIikpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuRE9NQUlOUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBhY2NlcHRDYXRlZ29yaWVzR3JvdXAob2JqLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBEb21haW4pCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlRPT0xTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVG9vbHNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUb29sKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ST0xFUykpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5UQVNLUykpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFMpKSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFKSkgeyAvLyROT04tTkxTLTEkCi0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5DT05URU5UX1BBQ0tBR0VTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUgfHwgb2JqIGluc3RhbmNlb2YgVGFzawotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCB8fCBvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSByZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQ1VTVE9NX0NBVEVHT1JJRVMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybihvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUFJPQ0VTU0VTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCS5nZXRDaGlsZHJlbihvYmopOwotCQkJCWZvciAoSXRlcmF0b3IgaW9yID0gbGlzdC5pdGVyYXRvcigpOyBpb3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqZWN0ID0gaW9yLm5leHQoKTsKLQkJCQkJaWYgKCgoQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iamVjdCkKLQkJCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCkpCi0JCQkJCQlpb3IucmVtb3ZlKCk7Ci0JCQkJfQotCQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKE9iamVjdCBvYmosIFN0cmluZyB0eXBlKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQlDb2xsZWN0aW9uIGxpc3QgPSAoKENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKCgoQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgb2JqKS5nZXRUZXh0KG9iaikuZXF1YWxzKAotCQkJCQl0eXBlKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0FsbEZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWxsRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFkOTdiMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWxsRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5Db250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUFsbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIEZpbHRlciBmb3IgYWxsIGVsZW1lbnRzIGVnOiB1c2VkIGluIHtAbGluayBDdXN0b21DYXRlZ29yeUFzc2lnblBhZ2V9IAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFsbEZpbHRlciBleHRlbmRzIEFic3RyYWN0QmFzZUZpbHRlciBpbXBsZW1lbnRzIElBbGxGaWx0ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQWxsRmlsdGVyI2dldE9iamVjdCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlciNhY2NlcHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZihvYmogPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gaWYgY2FuJ3QgYmUgYWNjZGVwdGVkIGJ5IHN1cGVyLCByZXR1cm4uCi0JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyBmaWx0ZXJUeXBlU3RyaW5nID0gaGVscGVyLmdldEZpbHRlclR5cGVTdHIoKTsKLQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50ID0gaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCk7Ci0KLQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkgIT0gbnVsbCkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucygKLQkJCQkJCSgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqKS5nZXRQcm9jZXNzKCkpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKG9iaikpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsCi0JCQkJJiYgIShvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50IHx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpKSB7Ci0JCQlpZihvYmogPT0gbnVsbCl7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJudWxsIik7Ci0JCQl9Ci0JCQlpZiAob2JqLmVxdWFscyhoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGZpbHRlclR5cGVTdHJpbmcgPT0gbnVsbAotCQkJCXx8IGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFMpCi0JCQkJfHwgZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLk1FVEhPX1BMVUdJTlMpCi0JCQkJfHwgZmlsdGVyVHlwZVN0cmluZwotCQkJCQkJLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuT05MWV9DT05URU5UX0VMRU1FTlRTKSkgewotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlpZiAoVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaikpIHsKLQkJCQkJaWYgKCgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaikuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJCQkJLmlzRW1wdHkoKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKSByZXR1cm4gZmFsc2U7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoTWV0aG9kRWxlbWVudFV0aWwuZ2V0QWxsTW9kZWxzKGNvbnRlbnRFbGVtZW50KQotCQkJCQkJCQkuY29udGFpbnMob2JqKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGlvciA9IGxpc3QuaXRlcmF0b3IoKTsgaW9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IGlvci5uZXh0KCk7Ci0JCQkJCWlmICgoKENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmplY3QpCi0JCQkJCQkJLmdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpKQotCQkJCQkJaW9yLnJlbW92ZSgpOwotCQkJCX0KLQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlpZiAoY2hpbGRBY2NlcHQob2JqKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCS8vCQkKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpIHsKLQkJCQlyZXR1cm4gISgoRGlzY2lwbGluZUdyb3VwaW5nKSBvYmopLmdldERpc2NpcGxpbmVzKCkuaXNFbXB0eSgpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsvLyBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKW9iaikuaXNFbXB0eSgpOwotCQkJfQotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ST0xFU0VUUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKG9iaiwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKSk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKSB7Ci0JCQkJcmV0dXJuICEoKFJvbGVTZXRHcm91cGluZykgb2JqKS5nZXRSb2xlU2V0cygpLmlzRW1wdHkoKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ly8gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Um9sZVNldEdyb3VwcygoUm9sZVNldClvYmopLmlzRW1wdHkoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RUWVBFUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKG9iaiwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwIikpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuRE9NQUlOUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKG9iaiwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Eb21haW5zX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRG9tYWluKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5UT09MUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKG9iaiwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Ub29sc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRvb2wpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlJPTEVTKSkgeyAvLyROT04tTkxTLTEkCi0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5UQVNLUykpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVGFzaykKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTKSkgeyAvLyROT04tTkxTLTEkCi0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0UpKSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5DT05URU5UX1BBQ0tBR0VTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlIHx8IG9iaiBpbnN0YW5jZW9mIFRhc2sKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QgfHwgb2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkgcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5QUk9DRVNTRVMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCS5nZXRDaGlsZHJlbihvYmopOwotCQkJCWZvciAoSXRlcmF0b3IgaW9yID0gbGlzdC5pdGVyYXRvcigpOyBpb3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqZWN0ID0gaW9yLm5leHQoKTsKLQkJCQkJaWYgKCgoQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iamVjdCkKLQkJCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCkpCi0JCQkJCQlpb3IucmVtb3ZlKCk7Ci0JCQkJfQotCQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkKLQkJCQkvL3JldHVybiB0cnVlOwotCQkJCXJldHVybiBjaGlsZEFjY2VwdChvYmopOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZihvYmogaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gcHVibGljIEZpbHRlckhlbHBlciBnZXRIZWxwZXIoKSB7Ci0JLy8gcmV0dXJuIGhlbHBlcjsKLQkvLyB9Ci0JLy8KLQkvLwkKLQkvLyBwdWJsaWMgdm9pZCBzZXRIZWxwZXIoRmlsdGVySGVscGVyIGhlbHBlcikgewotCS8vIHRoaXMuaGVscGVyID0gaGVscGVyOwotCS8vIH0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRBbmNlc3RvcnMoQ3VzdG9tQ2F0ZWdvcnkgbWV0aG9kT2JqZWN0KSB7Ci0JCUxpc3QgYW5jZXN0b3JMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUxpc3Qgb2JqTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJb2JqTGlzdC5hZGQobWV0aG9kT2JqZWN0KTsKLQotCQlnZXRBbmNlc3RvcnMoYW5jZXN0b3JMaXN0LCBvYmpMaXN0KTsKLQotCQlyZXR1cm4gYW5jZXN0b3JMaXN0OwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEFuY2VzdG9ycyhMaXN0IGFuY2VzdG9yTGlzdCwgTGlzdCBtZXRob2RPYmplY3RMaXN0KSB7Ci0JCWlmIChtZXRob2RPYmplY3RMaXN0LmlzRW1wdHkoKSkKLQkJCXJldHVybiBhbmNlc3Rvckxpc3Q7Ci0KLQkJTGlzdCBhbGxQYXJlbnRDdXN0Q2F0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZXRob2RPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ3VzdG9tQ2F0ZWdvcnkgZWxlbWVudCA9IChDdXN0b21DYXRlZ29yeSkgaXRlci5uZXh0KCk7Ci0JCQlMaXN0IHBhcmVudExpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKGVsZW1lbnQpOwotCQkJYWxsUGFyZW50Q3VzdENhdHMuYWRkQWxsKHBhcmVudExpc3QpOwotCi0JCX0KLQotCQlhbmNlc3Rvckxpc3QuYWRkQWxsKG1ldGhvZE9iamVjdExpc3QpOwotCQlMaXN0IG5leHRDaGVja0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbFBhcmVudEN1c3RDYXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghYW5jZXN0b3JMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKQotCQkJCW5leHRDaGVja0xpc3QuYWRkKGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIGdldEFuY2VzdG9ycyhhbmNlc3Rvckxpc3QsIG5leHRDaGVja0xpc3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdE1ldGhvZFBsdWdpbihPYmplY3Qgb2JqLCBPYmplY3QgY29udGVudEVsZW1lbnQpIHsKLQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmIChNZXRob2RFbGVtZW50VXRpbC5nZXRBbGxNb2RlbHMoY29udGVudEVsZW1lbnQpLmNvbnRhaW5zKG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRDYXRlZ29yaWVzR3JvdXAoT2JqZWN0IG9iaiwgU3RyaW5nIHR5cGUpIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoKChDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSBvYmopLmdldFRleHQob2JqKS5lcXVhbHMoCi0JCQkJCXR5cGUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0NhdGVnb3J5RmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9DYXRlZ29yeUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkY2Y4Y2EwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0NhdGVnb3J5RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0KLS8qKgotICogRmlsdGVyIGZvciB7QGxpbmsgQ29udGVudENhdGVnb3J5fQotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENhdGVnb3J5RmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RCYXNlRmlsdGVyIGltcGxlbWVudHMKLQkJSUNhdGVnb3J5RmlsdGVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUNhdGVnb3J5RmlsdGVyI2dldENhdGVnb3J5UGFja2FnZVBhdGgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRDYXRlZ29yeVBhY2thZ2VQYXRoKCkgewotCQlyZXR1cm4gaGVscGVyLmdldFBhdGhCYXNlZE9uVGFiU3RyaW5nKGhlbHBlci5nZXRDb250ZW50Q2F0ZWdvcnlUYWJTdHIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ2F0ZWdvcnlGaWx0ZXIjZ2V0T2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJcmV0dXJuIGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlciNhY2NlcHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyBpZiBjYW4ndCBiZSBhY2NkZXB0ZWQgYnkgc3VwZXIsIHJldHVybi4KLQkJaWYgKCFzdXBlci5hY2NlcHQob2JqKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCFoZWxwZXIuY2hlY2tPYmplY3RBY2NlcHRlZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCXJldHVybiBoZWxwZXIuYWNjZXB0TWV0aG9kUGx1Z2luKG9iaik7Ci0JCX0KLQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0NvbnRlbnRGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0NvbnRlbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTQ2OTA0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Db250ZW50RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDb250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLQotLyoqCi0gKiBGaWx0ZXIgaW1wbGVtZW50cyB7QGxpbmsgSUNvbnRlbnRGaWx0ZXJ9LiBGaWx0ZXIgY29udGVudCBlbGVtZW50IGluIGNvbnRlbnQgcGFja2FnZS4gCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRGaWx0ZXIgZXh0ZW5kcyBBYnN0cmFjdEJhc2VGaWx0ZXIgaW1wbGVtZW50cyBJQ29udGVudEZpbHRlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDb250ZW50RmlsdGVyI2dldENvbnRlbnRQYWNrYWdlUGF0aCgpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldENvbnRlbnRQYWNrYWdlUGF0aCgpIHsKLQkJcmV0dXJuIGhlbHBlci5nZXRQYXRoQmFzZWRPblRhYlN0cmluZyhoZWxwZXIuZ2V0VGFiU3RyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUNvbnRlbnRGaWx0ZXIjZ2V0T2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJcmV0dXJuIGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlciNhY2NlcHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyBpZiBjYW4ndCBiZSBhY2NkZXB0ZWQgYnkgc3VwZXIsIHJldHVybi4KLQkJaWYgKCFzdXBlci5hY2NlcHQob2JqKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gZnVydGhlciBmaWx0ZXJpbmcKLQkJaWYgKCFoZWxwZXIuY2hlY2tPYmplY3RBY2NlcHRlZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCXJldHVybiBoZWxwZXIuYWNjZXB0TWV0aG9kUGx1Z2luKG9iaik7Ci0JCX0KLQotCQlpZiAoY2hpbGRBY2NlcHQob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJcmV0dXJuIGhlbHBlci5hY2NlcHRDb250ZW50UGFja2FnZShvYmopOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0N1c3RvbUNhdGVnb3J5RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4NTQwZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUN1c3RvbUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0KLS8qKgotICogRmlsdGVyIHNwZWNpZmljIGZvciB7QGxpbmsgQ3VzdG9tQ2F0ZWdvcnl9IGVsZW1lbnRzLiAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yeUZpbHRlciBleHRlbmRzIEFic3RyYWN0QmFzZUZpbHRlciBpbXBsZW1lbnRzCi0JCUlDdXN0b21GaWx0ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ3VzdG9tRmlsdGVyI2dldENvbnRlbnRQYWNrYWdlUGF0aCgpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldENvbnRlbnRQYWNrYWdlUGF0aCgpIHsKLQkJcmV0dXJuIGhlbHBlci5nZXRQYXRoQmFzZWRPblRhYlN0cmluZyhoZWxwZXIuZ2V0VGFiU3RyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUN1c3RvbUZpbHRlciNnZXRPYmplY3QoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ3VzdG9tRmlsdGVyI2dldFN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlciNhY2NlcHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyBpZiBjYW4ndCBiZSBhY2NkZXB0ZWQgYnkgc3VwZXIsIHJldHVybi4KLQkJaWYgKCFzdXBlci5hY2NlcHQob2JqKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCFoZWxwZXIuY2hlY2tPYmplY3RBY2NlcHRlZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCXJldHVybiBoZWxwZXIuYWNjZXB0TWV0aG9kUGx1Z2luKG9iaik7Ci0JCX0KLQotCQlpZiAoY2hpbGRBY2NlcHQob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0Rlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9EZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZjgwM2YzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0Rlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLQotLyoqCi0gKiAgTWV0aG9kIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMgZmlsdGVyIGZvciBmaWx0ZXJpbmcgZWxlbWVudHMgYmFzZWQgb24gZmlsdGVyIHBhdHRlcm4KLSAqICBhbmQgdHlwZSBhZnRlciBlbGVtZW50cyBhcmUgcmVhbGl6ZWQgd2l0aGluIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhaXRvbi4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlciBleHRlbmRzIENvbmZpZ3VyYXRpb25GaWx0ZXIgewotCi0JU3RyaW5nIGZpbHRlclN0cjsKLQotCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQotCXByb3RlY3RlZCBGaWx0ZXJIZWxwZXIgaGVscGVyOwotCi0JLyoqCi0JICogQHBhcmFtIG1ldGhvZENvbmZpZwotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsCi0JCQlWaWV3ZXIgdmlld2VyLCBTdHJpbmcgZmlsdGVyU3RyKSB7Ci0JCXN1cGVyKG1ldGhvZENvbmZpZywgdmlld2VyKTsKLQkJdGhpcy5maWx0ZXJTdHIgPSBmaWx0ZXJTdHI7Ci0JCXRoaXMubWV0aG9kQ29uZmlndXJhdGlvbiA9IG1ldGhvZENvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlyZXR1cm4gbWV0aG9kQ29uZmlndXJhdGlvbi5lcXVhbHMob2JqKTsKLQkJfQotCi0JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmKGhlbHBlciAhPSBudWxsKSB7Ci0JCQlpZiAoaGVscGVyLmlzU2hvd1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybk9uUHJlc2VudGF0aW9uTmFtZShvYmopKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybihvYmopKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoIWhlbHBlci5pc09iamVjdEluU2VsZWN0ZWRJdGVtcyhvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoY2hpbGRBY2NlcHQob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0KLQl9Ci0KLQlwdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iaiwKLQkJCW9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlKSB7Ci0JCS8vIHJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmosIGNoaWxkRmVhdHVyZSk7Ci0JCS8vIE1vZGlmaWVkIGNvZGUgdG8gaGFuZGxlIHRoZSBmaWx0ZXJpbmcKLQkJLy8gdG8gY2hlY2sgaWYgdGhlIHZhcmlhYmlsaXR5IG9mIHBhcmVudCBpcyBub3QgTi9BLCBmaWx0ZXIgb3V0IGFscmVhZHkKLQkJLy8gZXhpc2l0bmcKLQkJLy8gZWxlbWVudCBmcm9tIGNoaWxkcmVuIGxpc3QuCi0JCUNvbGxlY3Rpb24gY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqLCBjaGlsZEZlYXR1cmUpOwotCQlpZihjb2wgIT0gbnVsbCl7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGNvbC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAoIWFjY2VwdChlbGVtZW50KSkKLQkJCQlpdG9yLnJlbW92ZSgpOwotCQl9Ci0JCX1lbHNlewotCQkJY29sID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCi0JCXJldHVybiBjb2w7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SGVscGVyKEZpbHRlckhlbHBlciBoZWxwZXIpIHsKLQkJdGhpcy5oZWxwZXIgPSBoZWxwZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpCi0JewotCQlzdXBlci5zZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCXRoaXMubWV0aG9kQ29uZmlndXJhdGlvbiA9IGNvbmZpZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0Rlc2NyaXB0b3JQcm9jZXNzRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9EZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYmM2M2RiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0Rlc2NyaXB0b3JQcm9jZXNzRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSVByb2Nlc3NGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci0KLQotLyoqCi0gKiB7QGxpbmsgUHJvY2Vzc30gZmlsdGVyIGZvciBmaWx0ZXJpbmcge0BsaW5rIFByb2Nlc3N9IGVsZW1lbnRzLiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIgZXh0ZW5kcyBBYnN0cmFjdEJhc2VGaWx0ZXIgaW1wbGVtZW50cwotCQlJUHJvY2Vzc0ZpbHRlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklGaWx0ZXIjZ2V0T2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJcmV0dXJuIGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlciNhY2NlcHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyBpZiBjYW4ndCBiZSBhY2NkZXB0ZWQgYnkgc3VwZXIsIHJldHVybi4KLQkJaWYgKCFzdXBlci5hY2NlcHQob2JqKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCFoZWxwZXIuaXNPYmplY3RJblNlbGVjdGVkSXRlbXMob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFtYXRjaFBhdHRlcm4ob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hQYXR0ZXJuKE9iamVjdCBvYmopIHsKLQkJLy8gaWYgbm8gdmFsaWQgZmlsdGVyIHR5cGUgb3IgcGF0dGVybiwgYWx3YXlzIHJldHVybiB0cnVlCi0JCVN0cmluZyBmaWx0ZXJUeXBlU3RyID0gaGVscGVyLmdldEZpbHRlclR5cGVTdHIoKTsKLQkJLy8gU3RyaW5nIHBhdHRlcm4gPSBoZWxwZXIuZ2V0UGF0dGVybigpOwotCQlTdHJpbmcgdGFiU3RyID0gaGVscGVyLmdldFRhYlN0cigpOwotCQlQYXR0ZXJuIHJlZ2V4UGF0dGVybiA9IGhlbHBlci5nZXRSZWdleFBhdHRlcm4oKTsKLQkJaWYgKGhlbHBlci5nZXRGaWx0ZXJUeXBlU3RyKCkgPT0gbnVsbCB8fCBoZWxwZXIuZ2V0UGF0dGVybigpID09IG51bGwKLQkJCQl8fCBoZWxwZXIuZ2V0UGF0dGVybigpLmVxdWFsc0lnbm9yZUNhc2UoIiIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAoZmlsdGVyVHlwZVN0ci5lcXVhbHNJZ25vcmVDYXNlKHRhYlN0cikpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlNYXRjaGVyIG0gPSByZWdleFBhdHRlcm4ubWF0Y2hlcigoKEJyZWFrZG93bkVsZW1lbnQpIG9iaikKLQkJCQkJCS5nZXROYW1lKCkpOwotCQkJCWJvb2xlYW4gZm91bmQgPSBtLm1hdGNoZXMoKTsKLQkJCQlpZiAoZm91bmQpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBlbHNlIGZvciBhbGwgb3RoZXIgdHlwZXMgb2YgZWxlbWVudHMKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlCi0JCQkvLyB0aGUgQWxsIGNhc2UKLQkJCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdldEFjdGl2aXRpZXNJblNjb3BlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50LCBMaXN0IGFjdGl2aXR5TGlzdCkgewotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCWFjdGl2aXR5TGlzdC5hZGQocGFyZW50KTsKLQkJCWdldEFjdGl2aXRpZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50LAotCQkJCQlhY3Rpdml0eUxpc3QpOwotCQl9Ci0JfQotCXB1YmxpYyBEZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFByb2Nlc3NDb25maWd1cmF0b3IoY29uZmlnLCBudWxsKSB9KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0V4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvRXhQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxODA2MzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvRXhQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZpbHRlciB0aGF0IHN0aWxsIHNob3dzIGNlcnRhaW4gZWxlbWVudHMgZHVyaW5nIHByb2Nlc3MgYXV0aG9yaW5nIHRoYXQKLSAqIFByb2Nlc3NDb25maWd1cmF0b3IgZG9lcyBub3Qgc2hvdy4gRmlsdGVyIGVsZW1lbnRzIGJhc2VkIG9uIHNlYXJjaCBwYXR0ZXJuIGFuZCB0eXBlLgotICogQGF1dGhvciBza2Fubm9vcgotICoKLSAqLwotcHVibGljIGNsYXNzIEV4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvciBleHRlbmRzCi0JCVByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IgewotCi0JU3RyaW5nIGZpbHRlclN0cjsKLQotCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQotCXByb3RlY3RlZCBGaWx0ZXJIZWxwZXIgaGVscGVyOwotCS8qKgotCSAqIEBwYXJhbSBtZXRob2RDb25maWcKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIEV4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywKLQkJCVZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIobWV0aG9kQ29uZmlnLCB2aWV3ZXIpOwotCQkvL3RoaXMuZmlsdGVyU3RyID0gZmlsdGVyU3RyOwotCQl0aGlzLm1ldGhvZENvbmZpZ3VyYXRpb24gPSBtZXRob2RDb25maWc7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0KLQkJaWYob2JqID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlyZXR1cm4gbWV0aG9kQ29uZmlndXJhdGlvbi5lcXVhbHMob2JqKTsKLQkJfQotCi0vLwkJaWYgKCFzdXBlci5hY2NlcHQob2JqKSkKLS8vCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobWV0aG9kQ29uZmlnID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlvYmogPSBMaWJyYXJ5VXRpbC51bndyYXAob2JqKTsKLQotLy8JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0vLwkJCXJldHVybiBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKG9iaik7Ci0vLwkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0vLwkJCXJldHVybiB0cnVlOwotLy8JCX0gZWxzZSB7Ci0vLwkJCWlmKExvZy5ERUJVRykgewotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmplY3QgZmlsdGVyZWQ6ICIgKyAob2JqID09IG51bGwgPyBudWxsIDogb2JqLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAotLy8JCQl9Ci0vLwkJfQotCQlpZiAoaGVscGVyLmlzU2hvd1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuT25QcmVzZW50YXRpb25OYW1lKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICghaGVscGVyLmlzT2JqZWN0SW5TZWxlY3RlZEl0ZW1zKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChjaGlsZEFjY2VwdChvYmopKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhlbHBlcihGaWx0ZXJIZWxwZXIgaGVscGVyKSB7Ci0JCXRoaXMuaGVscGVyID0gaGVscGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKQotCXsKLQkJc3VwZXIuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCQl0aGlzLm1ldGhvZENvbmZpZ3VyYXRpb24gPSBjb25maWc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvR3VpZGFuY2VGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0d1aWRhbmNlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0M2Q4YmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvR3VpZGFuY2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVySW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotCi0vKioKLSAqIEZpbHRlciBmb3Ige0BsaW5rIEd1aWRhbmNlfSB0eXBlIGVsZW1lbnRzLgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZUZpbHRlciBleHRlbmRzIENvbnRlbnRGaWx0ZXIgewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotLy8JCSBXaGVuIHR5cGUgaXMgc2VsZWN0ZWQgYWxsb3cgdGhvc2UgQ2xhc3MgdHlwZXMgdG8gZGlzcGxheS4KLQkJQ2xhc3MgY2xzID0gRmlsdGVySW5pdGlhbGl6ZXIuZ2V0SW5zdGFuY2UoKS4KLQkJCQkJCWdldENsYXNzRm9yVHlwZShoZWxwZXIuZ2V0RmlsdGVyVHlwZVN0cigpKTsKLQkJaWYoY2xzICE9IG51bGwpewotCQkJaWYoY2xzLmlzSW5zdGFuY2Uob2JqKSl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9ZWxzZXsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJLy8gRm9yIGFsbCBDb250ZW50RWxlbWVudCAtIHRoZXNlIGd1aWRhbmNlcyBhcmUgYXNzb2NpYXRlZAotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2hlY2tsaXN0IHx8IG9iaiBpbnN0YW5jZW9mIENvbmNlcHQKLQkJCQl8fCBvYmogaW5zdGFuY2VvZiBFeGFtcGxlIHx8IG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbAotCQkJCXx8IG9iaiBpbnN0YW5jZW9mIEd1aWRlbGluZSB8fCBvYmogaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KQkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJLy8gRm9yIHRhc2sgZXh0cmEgZ3VpZGFuY2VzCi0JCWlmKGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpIGluc3RhbmNlb2YgVGFzayl7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yIAotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gRm9yIHdvcmtQcm9kdWN0IEV4dHJhIGd1aWRhbmNlcy4KLQkJaWYoaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCl7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBSZXBvcnQgfHwgb2JqIGluc3RhbmNlb2YgVGVtcGxhdGUKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvciAKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzQWN0aXZpdHlGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NBY3Rpdml0eUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZTUxNTcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NBY3Rpdml0eUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuSUFjdGlvblR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotCi0vKioKLSAqIEFjdGl2aXR5IEZpbHRlciBmb3IgZG9pbmcgUHJvY2VzcyBjb3B5L2V4dGVuZAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0FjdGl2aXR5RmlsdGVyIGV4dGVuZHMgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIgewotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eSA9IG51bGw7Ci0KLQlwcml2YXRlIGludCBjb21tYW5kID0gMDsKLQotCXByaXZhdGUgQWN0aXZpdHlWYXJpYWJpbGl0eUZpbHRlciBkZWxlZ2F0ZUZpbHRlcjsKLQotCXB1YmxpYyBQcm9jZXNzQWN0aXZpdHlGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlUYWJsZVZpZXdlciB2aWV3ZXIsIFN0cmluZyB0YWJOYW1lLCBBY3Rpdml0eSBhY3Rpdml0eSwgaW50IGNvbW1hbmQpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUpOwotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JCXRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0JCWRlbGVnYXRlRmlsdGVyID0gbmV3IEFjdGl2aXR5VmFyaWFiaWxpdHlGaWx0ZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUsIGFjdGl2aXR5KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkRlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyI3NldEhlbHBlcihvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckhlbHBlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIZWxwZXIoRmlsdGVySGVscGVyIGhlbHBlcikgewotCQlzdXBlci5zZXRIZWxwZXIoaGVscGVyKTsKLQkJZGVsZWdhdGVGaWx0ZXIuc2V0SGVscGVyKGhlbHBlcik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlciNhY2NlcHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyBhbnkgYWN0aXZpdHkgY2FuIGJlIGRlZXAtY29waWVkCi0JCS8vCi0JCWlmKGNvbW1hbmQgPT0gSUFjdGlvblR5cGVQcm92aWRlci5ERUVQX0NPUFkgJiYgCi0JCQkJKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuYWNjZXB0KG9iaik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiB0cnVlOwotCi0JCX0KLQkJCi0vLwkJaWYgKChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgfHwgb2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLS8vCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLS8vCQkJCS8vIGlmIHNvdXJjZSBhbmQgdGFnZXQgaXMgc2FtZSBwcm9jZXNzLCBibG9jayBpdAotLy8JCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBvYmopLmdldFByb2Nlc3MoKTsKLS8vCQkJCWlmICghKHRoaXMuY29tbWFuZCA9PSBJQWN0aW9uVHlwZVByb3ZpZGVyLkNPUFkpKSB7Ci0vLwkJCQkJaWYgKHByb2MuZXF1YWxzKHRoaXMuYWN0aXZpdHkpKQotLy8JCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLS8vCQkJCS8vIGlmIHNvdXJjZSBhbmQgdGFnZXQgaXMgc2FtZSBwcm9jZXNzLCBibG9jayBpdAotLy8JCQkJUHJvY2VzcyBwcm9jID0gKFByb2Nlc3MpIG9iajsKLS8vCQkJCWlmICghKHRoaXMuY29tbWFuZCA9PSBJQWN0aW9uVHlwZVByb3ZpZGVyLkNPUFkpKSB7Ci0vLwkJCQkJaWYgKHByb2MuZXF1YWxzKHRoaXMuYWN0aXZpdHkpKQotLy8JCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCi0vLwkJCWlmIChvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0vLwkJCQlQcm9jZXNzIHNyY1Byb2MgPSBUbmdVdGlsCi0vLwkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBvYmopOwotLy8JCQkJUHJvY2VzcyB0YXJnZXRQcm9jID0gVG5nVXRpbAotLy8JCQkJCQkuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgdGhpcy5hY3Rpdml0eSk7Ci0vLwkJCQlpZiAoc3JjUHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcwotLy8JCQkJCQkmJiB0YXJnZXRQcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLS8vCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLS8vCQkJCVByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSBvYmo7Ci0vLwkJCQlpZiAocHJvYy5lcXVhbHModGhpcy5hY3Rpdml0eSkpCi0vLwkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQl9Ci0vLwotLy8JCQlyZXR1cm4gdHJ1ZTsKLS8vCQl9IGVsc2UKLS8vCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgb2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCXN3aXRjaChjb21tYW5kKSB7Ci0JCQkJY2FzZSBJQWN0aW9uVHlwZVByb3ZpZGVyLkVYVEVORDoKLQkJCQkJcmV0dXJuIGRlbGVnYXRlRmlsdGVyLmFjY2VwdChvYmopOwotCQkJCWNhc2UgSUFjdGlvblR5cGVQcm92aWRlci5DT1BZOgotCQkJCQkvLyBkaXNhbGxvdyBjb3B5aW5nIGZyb20gZGVsaXZlcnkgcHJvY2VzcyB0byBjYXBhYmlsaXR5IHBhdHRlcm4KLQkJCQkJLy8KLQkJCQkJUHJvY2VzcyBzcmNQcm9jID0gbnVsbDsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCS8vIGlmIHNvdXJjZSBhbmQgdGFnZXQgaXMgc2FtZSBwcm9jZXNzLCBibG9jayBpdAotCQkJCQkJc3JjUHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqKS5nZXRQcm9jZXNzKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJQnJlYWtkb3duRWxlbWVudCBiZSA9IChCcmVha2Rvd25FbGVtZW50KSBvYmo7Ci0JCQkJCQlzcmNQcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGJlKTsKLQkJCQkJfQotCQkJCQlpZihzcmNQcm9jICE9IG51bGwpIHsKLQkJCQkJCVByb2Nlc3MgdGFyZ2V0UHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyh0aGlzLmFjdGl2aXR5KTsKLQkJCQkJCWlmIChzcmNQcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzCi0JCQkJCQkJCSYmIHRhcmdldFByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzR3VpZGFuY2VGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NHdWlkYW5jZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZWQ0ZTU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NHdWlkYW5jZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci0KLQotLyoqCi0gKiBHdWlkYW5jZSBGaWx0ZXIgZm9yIFdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZS4gCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NHdWlkYW5jZUZpbHRlciBleHRlbmRzIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyIHsKLQotCXB1YmxpYyBQcm9jZXNzR3VpZGFuY2VGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlUYWJsZVZpZXdlciB2aWV3ZXIsIFN0cmluZyB0YWJOYW1lKSB7Ci0JCXN1cGVyKGNvbmZpZywgdmlld2VyLCB0YWJOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gc3VwZXIuYWNjZXB0KG9iaik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlSXRlbVByb3ZpZGVyKSkgewotCQkJQ29sbGVjdGlvbiBjb2wgPSAoKEd1aWRhbmNlSXRlbVByb3ZpZGVyKSBvYmopLmdldENoaWxkcmVuKG9iaik7Ci0JCQlpZiAoY29sLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1JvbGVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NSb2xlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRjYmVjYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1JvbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LlJvbGVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFJvbGVTZXR9LCB7QGxpbmsgUm9sZVNldEdyb3VwaW5nfSBpbiBzcGVjaWZpYyB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0KLSAqIGJhc2VkIG9uIHNlYXJjaCBwYXR0ZXJuLiAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUm9sZUZpbHRlciBleHRlbmRzIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyIHsKLQotCXB1YmxpYyBQcm9jZXNzUm9sZUZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgVGFibGVWaWV3ZXIgdmlld2VyLAotCQkJU3RyaW5nIHRhYk5hbWUpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQkJCWlmICgoKENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VGV4dChvYmopLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgUm9sZUl0ZW1Qcm92aWRlcikgfHwgKG9iaiBpbnN0YW5jZW9mIFJvbGUpCi0JCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIpKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlpZihvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpewotCQkJSXRlcmF0b3IgaXRlciA9IChUbmdVdGlsLmdldENvbnRyaWJ1dG9ycygoVmFyaWFiaWxpdHlFbGVtZW50KW9iaikpOwotCQkJaWYoaXRlciAhPSBudWxsKXsKLQkJCQl3aGlsZShpdGVyLmhhc05leHQoKSl7Ci0JCQkJCVJvbGVTZXRHcm91cGluZyBncm91cGluZyA9IChSb2xlU2V0R3JvdXBpbmcpaXRlci5uZXh0KCk7Ci0JCQkJCS8vIFRPRE8gOiBDaGVjayBmb3IgKHJlY3Vyc2l2ZSlSb2xlU2V0cyBpcyBlbXB0eSwgCi0JCQkJCS8vIGlmIHJvbGVzZXQncyByb2xlcyBhcmUgZW1wdHkgZG9ub3Qgc2hvdyBEaXNjaXBsaW5lIGdyb3VwaW5nIAotCQkJCQlpZighZ3JvdXBpbmcuZ2V0Um9sZVNldHMoKS5pc0VtcHR5KCkpIHJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCS8vIFRPRE8gOiBDaGVjayBmb3IgKHJlY3Vyc2l2ZSlSb2xlU2V0cyBpcyBlbXB0eSwgCi0JCQkvLyBpZiByb2xlc2V0J3Mgcm9sZXMgYXJlIGVtcHR5IGRvbm90IHNob3cgRGlzY2lwbGluZSBncm91cGluZyAKLQkJCXJldHVybiAhKChSb2xlU2V0R3JvdXBpbmcpb2JqKS5nZXRSb2xlU2V0cygpLmlzRW1wdHkoKTsKLQkJfQotCQlpZihvYmogaW5zdGFuY2VvZiBSb2xlU2V0KXsKLQkJCXJldHVybiAhKChSb2xlU2V0KW9iaikuZ2V0Um9sZXMoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NTcGVjaWZpY1dvcmtQcm9kdWN0RmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzU3BlY2lmaWNXb3JrUHJvZHVjdEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OTViOTc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NTcGVjaWZpY1dvcmtQcm9kdWN0RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotCi0KLS8qKgotICogRmlsdGVycyB7QGxpbmsgV29ya1Byb2R1Y3R9cyBiYXNlZCBvbiB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0gYW5kIHNlYXJjaCBwYXR0ZXJuLgotICogYW5kIHtAbGluayBXb3JrUHJvZHVjdFR5cGV9ICAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzU3BlY2lmaWNXb3JrUHJvZHVjdEZpbHRlciBleHRlbmRzIFByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlciB7Ci0KLQlDbGFzcyB3b3JrUHJvZHVjdFR5cGUgPSBudWxsOwotCi0JcHVibGljIFByb2Nlc3NTcGVjaWZpY1dvcmtQcm9kdWN0RmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJVGFibGVWaWV3ZXIgdmlld2VyLCBTdHJpbmcgdGFiTmFtZSwgQ2xhc3MgdHlwZSkgewotCQlzdXBlcihjb25maWcsIHZpZXdlciwgdGFiTmFtZSk7Ci0JCXRoaXMud29ya1Byb2R1Y3RUeXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChzdXBlci5jaGlsZEFjY2VwdChvYmopKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQlpZiAod29ya1Byb2R1Y3RUeXBlID09IG51bGwpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UgaWYgKG9iai5nZXRDbGFzcygpLmVxdWFscyh0aGlzLndvcmtQcm9kdWN0VHlwZSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1Rhc2tGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NUYXNrRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJiYTdiNTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1Rhc2tGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LlRhc2tJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFRhc2t9cyBpbiB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0gYmFzZWQgb24gc2VhcmNoIHBhdHRlcm4uCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1Rhc2tGaWx0ZXIgZXh0ZW5kcyBEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlciB7Ci0KLQlwdWJsaWMgUHJvY2Vzc1Rhc2tGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFRhYmxlVmlld2VyIHZpZXdlciwKLQkJCVN0cmluZyB0YWJOYW1lKSB7Ci0JCXN1cGVyKGNvbmZpZywgdmlld2VyLCB0YWJOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSB7Ci0JCQlpZiAoKChDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSBvYmopLmdldFRleHQob2JqKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgVGFza0l0ZW1Qcm92aWRlcikgfHwgKG9iaiBpbnN0YW5jZW9mIFRhc2spCi0JCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZyl7Ci0JCQlJdGVyYXRvciBpdGVyID0gKFRuZ1V0aWwuZ2V0Q29udHJpYnV0b3JzKChWYXJpYWJpbGl0eUVsZW1lbnQpb2JqKSk7Ci0JCQlpZihpdGVyICE9IG51bGwpewotCQkJCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKXsKLQkJCQkJRGlzY2lwbGluZUdyb3VwaW5nIGdyb3VwaW5nID0gKERpc2NpcGxpbmVHcm91cGluZylpdGVyLm5leHQoKTsKLQkJCQkJLy8gVE9ETyA6IENoZWNrIGZvciAocmVjdXJzaXZlKURpc2NpcGxpbmUgaXMgZW1wdHksIAotCQkJCQkvLyBpZiBkaXNjaXBsaW5lJ3MgdGFza3MgYXJlIGVtcHR5IGRvbm90IHNob3cgRGlzY2lwbGluZSBncm91cGluZyAKLQkJCQkJaWYoIWdyb3VwaW5nLmdldERpc2NpcGxpbmVzKCkuaXNFbXB0eSgpKSByZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBUT0RPIDogQ2hlY2sgZm9yIChyZWN1cnNpdmUpRGlzY2lwbGluZSBpcyBlbXB0eSwgCi0JCQkvLyBpZiBkaXNjaXBsaW5lJ3MgdGFza3MgYXJlIGVtcHR5IGRvbm90IHNob3cgRGlzY2lwbGluZSBncm91cGluZyAKLQkJCXJldHVybiAhKChEaXNjaXBsaW5lR3JvdXBpbmcpb2JqKS5nZXREaXNjaXBsaW5lcygpLmlzRW1wdHkoKTsKLQkJfQotCQlpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKXsKLQkJCXJldHVybiAhKChEaXNjaXBsaW5lKW9iaikuZ2V0VGFza3MoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NWaWV3RmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzVmlld0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkODQ2NTIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NWaWV3RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0KLS8qKgotICogRmlsdGVyIHtAbGluayBQcm9jZXNzfWVzIHdpdGhpbiB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0gdXNlZCBpbgotICoge0BsaW5rIEl0ZW1zRmlsdGVyRGlhbG9nfS4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1ZpZXdGaWx0ZXIgZXh0ZW5kcyBEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlciB7Ci0KLQlwdWJsaWMgUHJvY2Vzc1ZpZXdGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIFZpZXdlciB2aWV3ZXIsCi0JCQlTdHJpbmcgZmlsdGVyU3RyKSB7Ci0JCXN1cGVyKG1ldGhvZENvbmZpZywgdmlld2VyLCBmaWx0ZXJTdHIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIGZpbHRlclR5cGUgPSBoZWxwZXIuZ2V0RmlsdGVyVHlwZVN0cigpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGZpbHRlclR5cGUuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFMpKSB7Ci0JCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQgfHwgb2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTKSkgewotCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lIHx8IG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZyk7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKEZpbHRlckNvbnN0YW50cy5ET01BSU5TKSkgewotCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBEb21haW4pOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGUKLQkJCQkuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RUWVBFUykpIHsKLQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLlRPT0xTKSkgewotCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBUb29sKTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlCi0JCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTKSkgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5OwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGUuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTKSkgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQgfHwgb2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZQotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBEb21haW4gfHwgb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlCi0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFRvb2wgfHwgb2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nCi0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZzsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NXb3JrUHJvZHVjdEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjM2ZmMzBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NXb3JrUHJvZHVjdEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5VbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5Xb3JrUHJvZHVjdEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotCi0KLS8qKgotICogRmlsdGVycyB7QGxpbmsgV29ya1Byb2R1Y3R9cyB3aXRoIGluIHtAbGluayBNZXRob2RDb25maWd1cmF0aW9ufS4gCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyIGV4dGVuZHMgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIgewotCi0JcHVibGljIFByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCVRhYmxlVmlld2VyIHZpZXdlciwgU3RyaW5nIHRhYk5hbWUpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQkJCWlmICgoKENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VGV4dChvYmopLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXAiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCQkJaWYgKCgoQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgb2JqKS5nZXRUZXh0KG9iaikuZXF1YWxzSWdub3JlQ2FzZSgKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRG9tYWluc19ncm91cCIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIpCi0JCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KQotCQkJCXx8IChvYmogaW5zdGFuY2VvZiBVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKQotCQkJCXx8IChvYmogaW5zdGFuY2VvZiBEb21haW4pCi0JCQkJfHwgKG9iaiBpbnN0YW5jZW9mIERvbWFpbkl0ZW1Qcm92aWRlcikKLQkJCQl8fCAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKSkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUmVmZXJlbmNlV29ya0Zsb3dGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1JlZmVyZW5jZVdvcmtGbG93RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiYTAxZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUmVmZXJlbmNlV29ya0Zsb3dGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkNhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUFsbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotCi0KLS8qKgotICogRmlsdGVycyB0aGUge0BsaW5rIFByb2Nlc3N9cyBmb3IgcmVmZXJlbmNlIHdvcmtmbG93cyBvZiB7QGxpbmsgRGlzY2lwbGluZX0uIAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZmVyZW5jZVdvcmtGbG93RmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RCYXNlRmlsdGVyIGltcGxlbWVudHMKLQkJSUFsbEZpbHRlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklBbGxGaWx0ZXIjZ2V0T2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyI2FjY2VwdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCS8vIGlmIGNhbid0IGJlIGFjY2RlcHRlZCBieSBzdXBlciwgcmV0dXJuLgotCQlpZiAoIXN1cGVyLmFjY2VwdChvYmopKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlPYmplY3QgY29udGVudEVsZW1lbnQgPSBoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmIChvYmouZXF1YWxzKGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKSAhPSBudWxsKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKAotCQkJCQkJKChQcm9jZXNzQ29tcG9uZW50KSBvYmopLmdldFByb2Nlc3MoKSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoTWV0aG9kRWxlbWVudFV0aWwuZ2V0QWxsTW9kZWxzKGNvbnRlbnRFbGVtZW50KQotCQkJCQkJLmNvbnRhaW5zKG9iaikpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQlDb2xsZWN0aW9uIGxpc3QgPSAoKFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqKS5nZXRDaGlsZHJlbihvYmopOwotCQkJZm9yIChJdGVyYXRvciBpb3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGlvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGlvci5uZXh0KCk7Ci0JCQkJaWYgKCgoQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iamVjdCkuZ2V0Q2hpbGRyZW4oCi0JCQkJCQlvYmplY3QpLmlzRW1wdHkoKSkKLQkJCQkJaW9yLnJlbW92ZSgpOwotCQkJfQotCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSkgewotCQkJCWlmICgoKFByb2Nlc3NQYWNrYWdlKSBvYmopLmdldFByb2Nlc3NFbGVtZW50cygpLmlzRW1wdHkoKQotCQkJCQkJJiYgKChQcm9jZXNzUGFja2FnZSkgb2JqKS5nZXRDaGlsZFBhY2thZ2VzKCkuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Sb2xlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Sb2xlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk5Y2M0M2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUm9sZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotCi0KLS8qKgotICogRmlsdGVycyB7QGxpbmsgUm9sZX0gCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVGaWx0ZXIgZXh0ZW5kcyBBbGxGaWx0ZXIgewotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50ID0gZ2V0SGVscGVyKCkuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmIChvYmouZXF1YWxzKGNvbnRlbnRFbGVtZW50KSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZ2V0SGVscGVyKCkuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpICE9IG51bGwpIHsKLQkJCWlmIChnZXRIZWxwZXIoKS5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCFnZXRIZWxwZXIoKS5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCWlmIChNZXRob2RFbGVtZW50VXRpbC5nZXRBbGxNb2RlbHMoY29udGVudEVsZW1lbnQpCi0JCQkJCQkJLmNvbnRhaW5zKG9iaikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvVmFyaWFiaWxpdHlQcm9jZXNzUm9sZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvVmFyaWFiaWxpdHlQcm9jZXNzUm9sZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMGQwZTkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1JvbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUHJvY2Vzc0NvbW1hbmRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFByb2Nlc3N9J3Mge0BsaW5rIFJvbGV9IHdpdGhpbiB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWYXJpYWJpbGl0eVByb2Nlc3NSb2xlRmlsdGVyIGV4dGVuZHMgUHJvY2Vzc1JvbGVGaWx0ZXIgewotCi0JQWN0aXZpdHkgYWN0aXZpdHkgPSBudWxsOwotCi0JcHVibGljIFZhcmlhYmlsaXR5UHJvY2Vzc1JvbGVGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlUYWJsZVZpZXdlciB2aWV3ZXIsIFN0cmluZyB0YWJOYW1lLCBBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlzdXBlcihjb25maWcsIHZpZXdlciwgdGFiTmFtZSk7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChzdXBlci5jaGlsZEFjY2VwdChvYmopKSB7Ci0vLwkJCWlmIChQcm9jZXNzVXRpbC5nZXRWYXJpYWJpbGl0eUVsZW1lbnQodGhpcy5hY3Rpdml0eSkuY29udGFpbnMob2JqKSkgewotLy8JCQkJcmV0dXJuIGZhbHNlOwotLy8JCQl9IGVsc2UKLS8vCQkJCXJldHVybiB0cnVlOwotCQkJcmV0dXJuIFByb2Nlc3NDb21tYW5kVXRpbC5nZXRWYWxpZERlc2NyaXB0b3Iob2JqLCBhY3Rpdml0eSwgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgPT0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvVmFyaWFiaWxpdHlQcm9jZXNzVGFza0ZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvVmFyaWFiaWxpdHlQcm9jZXNzVGFza0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MDhjNjkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1Rhc2tGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUHJvY2Vzc0NvbW1hbmRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFByb2Nlc3N9J3Mge0BsaW5rIFRhc2t9IHdpdGhpbiB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmFyaWFiaWxpdHlQcm9jZXNzVGFza0ZpbHRlciBleHRlbmRzIFByb2Nlc3NUYXNrRmlsdGVyIHsKLQotCUFjdGl2aXR5IGFjdGl2aXR5ID0gbnVsbDsKLQotCXB1YmxpYyBWYXJpYWJpbGl0eVByb2Nlc3NUYXNrRmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJVGFibGVWaWV3ZXIgdmlld2VyLCBTdHJpbmcgdGFiTmFtZSwgQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUpOwotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkgewotLy8JCQlpZiAoUHJvY2Vzc1V0aWwuZ2V0VmFyaWFiaWxpdHlFbGVtZW50KHRoaXMuYWN0aXZpdHkpLmNvbnRhaW5zKG9iaikpIHsKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfSBlbHNlCi0vLwkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0VmFsaWREZXNjcmlwdG9yKG9iaiwgYWN0aXZpdHksIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpID09IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9WYXJpYWJpbGl0eVByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNDJjMmJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlByb2Nlc3NDb21tYW5kVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotCi0KLS8qKgotICogRmlsdGVycyB7QGxpbmsgUHJvY2Vzc30ncyB7QGxpbmsgV29ya1Byb2R1Y3R9IHdpdGhpbiB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmFyaWFiaWxpdHlQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIgZXh0ZW5kcwotCQlQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIgewotCi0JQWN0aXZpdHkgYWN0aXZpdHkgPSBudWxsOwotCi0JcHVibGljIFZhcmlhYmlsaXR5UHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJVGFibGVWaWV3ZXIgdmlld2VyLCBTdHJpbmcgdGFiTmFtZSwgQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUpOwotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkgewotLy8JCQlpZiAoUHJvY2Vzc1V0aWwuZ2V0VmFyaWFiaWxpdHlFbGVtZW50KHRoaXMuYWN0aXZpdHkpLmNvbnRhaW5zKG9iaikpIHsKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfSBlbHNlCi0vLwkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0VmFsaWREZXNjcmlwdG9yKG9iaiwgYWN0aXZpdHksIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpID09IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1dvcmtQcm9kdWN0RmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Xb3JrUHJvZHVjdEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZDYyMTM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1dvcmtQcm9kdWN0RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFdvcmtQcm9kdWN0fSBiYXNlZCBvbiBzZWFyY2ggcGF0dGVybgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdEZpbHRlciBleHRlbmRzIENvbnRlbnRGaWx0ZXIgewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTk4ZDQ3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBmaWx0ZXJzIGZvciB0aGUgbWV0aG9kIGFuZCBwcm9jZXNzIGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Bc3NvY2lhdGlvbkZvcm1QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQXNzb2NpYXRpb25Gb3JtUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZmI1MWU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Bc3NvY2lhdGlvbkZvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5JdGVtc0ZpbHRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuRWRpdG9yc0NvbnRleHRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNhdGVnb3J5U29ydEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci0KLQotLyoqCi0gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIEFzc29jaWF0aW9uIHR5cGUgZm9ybSBwYWdlcyBpbiB0aGUgTWV0aG9kIGVkaXRvcnMuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFzc29jaWF0aW9uRm9ybVBhZ2UgZXh0ZW5kcyBCYXNlRm9ybVBhZ2UgaW1wbGVtZW50cyBJTWVudUxpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfUFJFRklYID0gIkF1dGhvcmluZ1VJLiI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyU2VsZWN0ZWQ7Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKG9iamVjdCk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMjsKLQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyU2VsZWN0ZWQyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKG9iamVjdCk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMzsKLQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyU2VsZWN0ZWQzID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKG9iamVjdCk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gYVNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGFDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdmlld2VyX3NlbGVjdGVkLCB2aWV3ZXJfc2VsZWN0ZWQyLCB2aWV3ZXJfc2VsZWN0ZWQzOwotCi0JcHJvdGVjdGVkIFRhYmxlIGN0cmxfc2VsZWN0ZWQsIGN0cmxfc2VsZWN0ZWQyLCBjdHJsX3NlbGVjdGVkMzsKLQotCXByb3RlY3RlZCBCdXR0b24gY3RybF9hZGQsIGN0cmxfcmVtb3ZlLCBjdHJsX2FkZDIsIGN0cmxfcmVtb3ZlMiwgY3RybF9hZGQzLAotCQkJY3RybF9yZW1vdmUzOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX3VwMSwgY3RybF9kb3duMSwgY3RybF91cDIsIGN0cmxfZG93bjIsIGN0cmxfdXAzLAotCQkJY3RybF9kb3duMzsKLQotCXByb3RlY3RlZCBUZXh0IGN0cmxfYnJpZWZEZXNjOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX3NlbGVjdCwgY3RybF9jbGVhcjsKLQotCXByb3RlY3RlZCBBcnJheUxpc3QgdXNlZENhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgbGFiZWxfQ2F0ZWdvcnksIGxhYmVsX0NhdGVnb3J5MiwgbGFiZWxfQ2F0ZWdvcnkzOwotCi0JcHJpdmF0ZSBib29sZWFuIHVzZUNhdGVnb3J5MSA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdXNlQ2F0ZWdvcnkyID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiB1c2VDYXRlZ29yeTMgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIGFsbG93Q2hhbmdlMSA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gYWxsb3dDaGFuZ2UyID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBhbGxvd0NoYW5nZTMgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMiA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjIgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBMaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uIGxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb247Ci0JLy8gc3RyaW5ncyB1c2VkIGluIHRoZSBmb3JtCi0JcHJvdGVjdGVkIFN0cmluZyBmb3JtTmFtZVByZWZpeCA9ICJGb3JtIHByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBTdHJpbmcgc2VjdGlvbk5hbWUgPSAiU2VjdGlvbiBuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBzZWN0aW9uRGVzYyA9ICJTZWN0aW9uIGRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBzZWxlY3RlZExhYmVsID0gIlNlbGVjdGVkIExhYmVsIDEiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlbGVjdGVkTGFiZWwyID0gIlNlbGVjdGVkIExhYmVsIDIiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlbGVjdGVkTGFiZWwzID0gIlNlbGVjdGVkIExhYmVsIDMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBEYXRhIG1vZGVsIG1ldGhvZHMuCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgbmV3SXRlbXMpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwyKEFycmF5TGlzdCBuZXdJdGVtcykgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDMoQXJyYXlMaXN0IG5ld0l0ZW1zKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwzKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbW92ZVVwSXRlbXNJblNlbGVjdGVkSXRlbXMxKEFycmF5TGlzdCBtb3ZlVXBJdGVtcykgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1vdmVEb3duSXRlbXNJblNlbGVjdGVkSXRlbXMxKEFycmF5TGlzdCBtb3ZlRG93bkl0ZW1zKSB7Ci0JfQotCQotCS8vIFZpZXdlciBtZXRob2RzLgotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDMoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiAiY29udGVudGVsZW1lbnQiO30gLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcyKCkgewotCQlyZXR1cm4gZ2V0VGFiU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmczKCkgewotCQlyZXR1cm4gZ2V0VGFiU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBnZXRGaWx0ZXJUeXBlcyBzaG91bGQgYmUgb3ZlcnJpZGUgdG8gcGFzcyB0eXBlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyVHlwZXMoKXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qCi0JICogZ2V0RmlsdGVyVHlwZXMgc2hvdWxkIGJlIG92ZXJyaWRlIHRvIHBhc3MgdHlwZXMuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlclR5cGVzMigpewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoKLQkgKiBnZXRGaWx0ZXJUeXBlcyBzaG91bGQgYmUgb3ZlcnJpZGUgdG8gcGFzcyB0eXBlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyVHlwZXMzKCl7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQotCS8vIEZpbHRlciBpbmZvLgotCXByb3RlY3RlZCBJRmlsdGVyIGZpbHRlciwgZmlsdGVyMiwgZmlsdGVyMzsKLQotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIyKCkgewotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcjMoKSB7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JLy8gT3JkZXJpbmcgb2YgY29udHJpYnV0ZWQgY2F0ZWdvcml6ZWQgZWxlbWVudHMgaW4gY3VzdG9tCi0JLy8gY2F0ZWdvcmllcwotCXByb3RlY3RlZCBCdXR0b24gY3RybF9vcmRlcmluZzsKLQotCXByb3RlY3RlZCBDb21ib1ZpZXdlciB2aWV3ZXJfc29ydDE7Ci0JCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlclNvcnQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJTGlzdDxTdHJpbmc+IHNvcnRUeXBlc0xpc3QgPSBDYXRlZ29yeVNvcnRIZWxwZXIuZ2V0Q2F0ZWdvcnlTb3J0VHlwZXMoKTsKLQkJCXJldHVybiBzb3J0VHlwZXNMaXN0LnRvQXJyYXkoKTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlclNvcnQgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJU3RyaW5nIHN0ciA9ICgoU3RyaW5nKW9iamVjdCk7Ci0JCQkJcmV0dXJuIENhdGVnb3J5U29ydEhlbHBlci5nZXRTb3J0VHlwZURpc3BsYXlOYW1lKHN0cik7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX07Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQXNzb2NpYXRpb25Gb3JtUGFnZShGb3JtRWRpdG9yIGVkaXRvciwgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihlZGl0b3IsIGlkLCBuYW1lKTsKLQkJdGhpcy5lZGl0b3JUYWJOYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQmFzZUZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5jcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCXN1cGVyLmNyZWF0ZUZvcm1Db250ZW50KG1hbmFnZWRGb3JtKTsKLQotCQlVSUhlbHBlci5zZXRGb3JtVGV4dChmb3JtLCBjb250ZW50RWxlbWVudCk7Ci0JCQotCQkvLyBDcmVhdGUgYSBzZWN0aW9uLgotCQlhU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwgU2VjdGlvbi5USVRMRV9CQVIKLQkJCQl8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVEKTsKLQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJYVNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCWFTZWN0aW9uLnNldFRleHQoZ2V0U2VjdGlvbk5hbWUoKSk7Ci0JCWFTZWN0aW9uLnNldERlc2NyaXB0aW9uKGdldFNlY3Rpb25EZXNjcmlwdGlvbigpKTsKLQkJYVNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWFDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShhU2VjdGlvbik7Ci0JCWFDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWFDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWFTZWN0aW9uLnNldENsaWVudChhQ29tcG9zaXRlKTsKLQotCQlpbnQgbnVtVGFibGVzVXNlZCA9IDA7Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MSkKLQkJCW51bVRhYmxlc1VzZWQrKzsKLQkJaWYgKHVzZUNhdGVnb3J5MikKLQkJCW51bVRhYmxlc1VzZWQrKzsKLQkJaWYgKHVzZUNhdGVnb3J5MykKLQkJCW51bVRhYmxlc1VzZWQrKzsKLQotCQlpZiAodXNlQ2F0ZWdvcnkxKSB7Ci0JCQlDb21wb3NpdGUgcGFuZTEgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgYUNvbXBvc2l0ZSwgMSk7Ci0JCQlsYWJlbF9DYXRlZ29yeSA9IGNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUxLCBnZXRTZWxlY3RlZExhYmVsKCkpOwotCi0JCQlpZiAoY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEpCi0JCQkJY3RybF9zZWxlY3RlZCA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUxLCBTSU5HTEVfUk9XKTsKLQkJCWVsc2UgewotCQkJCWlmIChudW1UYWJsZXNVc2VkID09IDEpCi0JCQkJCWN0cmxfc2VsZWN0ZWQgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSwgTEFSR0VfU0laRSk7Ci0JCQkJZWxzZSBpZiAobnVtVGFibGVzVXNlZCA9PSAyKQotCQkJCQljdHJsX3NlbGVjdGVkID0gY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTEsIE1FRElVTV9TSVpFKTsKLQkJCQllbHNlCi0JCQkJCWN0cmxfc2VsZWN0ZWQgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSwgU01BTExfU0laRSk7Ci0JCQl9Ci0KLQkJCWxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24gPSBuZXcgTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpb25MYWJlbF9maW5kRWxlbWVudEluTGliTmF2KTsgCi0JCQl2aWV3ZXJfc2VsZWN0ZWQgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9zZWxlY3RlZCk7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyU2VsZWN0ZWQpOwotCQkJaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCk7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0SW5wdXQoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKCFpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEpCi0JCQkJdmlld2VyX3NlbGVjdGVkLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkpOwotCi0JCQljcmVhdGVDb250ZXh0TWVudUZvcih2aWV3ZXJfc2VsZWN0ZWQpOwotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCi0JCQlDb21wb3NpdGUgcGFuZTIgPSBjcmVhdGVDb21wb3NpdGVGb3JCdXR0b25zKHRvb2xraXQsIGFDb21wb3NpdGUpOwotCQkJaWYgKGFsbG93Q2hhbmdlMSkgewotCQkJCWN0cmxfYWRkID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQkJKGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xKSA/IFNFTEVDVF9CVVRUT04KLQkJCQkJCQkJOiBBRERfQlVUVE9OKTsKLQkJCQljdHJsX3JlbW92ZSA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQkJCShjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMSkgPyBDTEVBUl9CVVRUT04KLQkJCQkJCQkJOiBSRU1PVkVfQlVUVE9OKTsKLQotCQkJCWlmIChpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEpIHsKLQkJCQkJY3RybF91cDEgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIFVQX0JVVFRPTik7Ci0JCQkJCWN0cmxfZG93bjEgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIERPV05fQlVUVE9OKTsKLQkJCQkJY3RybF9vcmRlcmluZyA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwgT1JERVJfQlVUVE9OKTsKLQkJCQkJQ29tYm8gY3RybF9zb3J0MSA9IGNyZWF0ZUNvbWJvV2l0aExhYmVsKHRvb2xraXQsIHBhbmUyLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5Tb3J0VHlwZV9MYWJlbCk7Ci0JCQkJCXZpZXdlcl9zb3J0MSA9IG5ldyBDb21ib1ZpZXdlcihjdHJsX3NvcnQxKTsKLQkJCQkJdmlld2VyX3NvcnQxLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTb3J0KTsKLQkJCQkJdmlld2VyX3NvcnQxLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlclNvcnQpOwotCQkJCQl2aWV3ZXJfc29ydDEuc2V0SW5wdXQoY29udGVudEVsZW1lbnQpOwotCQkJCQkvLyBzZXQgaW5pdGlhbCBzZWxlY3Rpb24KLQkJCQkJU3RyaW5nIHNvcnRUeXBlID0gQ2F0ZWdvcnlTb3J0SGVscGVyLmdldENhdGVnb3J5U29ydFZhbHVlKGNvbnRlbnRFbGVtZW50KTsKLQkJCQkJdmlld2VyX3NvcnQxLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzb3J0VHlwZSksIHRydWUpOwotCi0JCQkJCS8vIGN0cmxfb3JkZXJpbmcuc2V0TGF5b3V0RGF0YShuZXcKLQkJCQkJLy8gR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCQl9Ci0JCQl9Ci0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMik7Ci0JCX0KLQotCQlpZiAodXNlQ2F0ZWdvcnkyKSB7Ci0JCQlDb21wb3NpdGUgcGFuZTMgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgYUNvbXBvc2l0ZSwgMSk7Ci0JCQlsYWJlbF9DYXRlZ29yeTIgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMywgZ2V0U2VsZWN0ZWRMYWJlbDIoKSk7Ci0JCQlpZiAoY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjIpCi0JCQkJY3RybF9zZWxlY3RlZDIgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMywgU0lOR0xFX1JPVyk7Ci0JCQllbHNlIHsKLQkJCQlpZiAobnVtVGFibGVzVXNlZCA9PSAxKQotCQkJCQljdHJsX3NlbGVjdGVkMiA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUzLCBMQVJHRV9TSVpFKTsKLQkJCQllbHNlIGlmIChudW1UYWJsZXNVc2VkID09IDIpCi0JCQkJCWN0cmxfc2VsZWN0ZWQyID0gY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTMsIE1FRElVTV9TSVpFKTsKLQkJCQllbHNlCi0JCQkJCWN0cmxfc2VsZWN0ZWQyID0gY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTMsIFNNQUxMX1NJWkUpOwotCQkJfQotCQkJdmlld2VyX3NlbGVjdGVkMiA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3NlbGVjdGVkMik7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlclNlbGVjdGVkMik7Ci0JCQlpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCk7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldElucHV0KGNvbnRlbnRFbGVtZW50KTsKLQkJCXZpZXdlcl9zZWxlY3RlZDIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSk7Ci0JCQljcmVhdGVDb250ZXh0TWVudUZvcih2aWV3ZXJfc2VsZWN0ZWQyKTsKLQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTMpOwotCi0JCQlDb21wb3NpdGUgcGFuZTQgPSBjcmVhdGVDb21wb3NpdGVGb3JCdXR0b25zKHRvb2xraXQsIGFDb21wb3NpdGUpOwotCQkJaWYgKGFsbG93Q2hhbmdlMikgewotCQkJCWN0cmxfYWRkMiA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lNCwgQUREX0JVVFRPTik7Ci0JCQkJY3RybF9yZW1vdmUyID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU0LCBSRU1PVkVfQlVUVE9OKTsKLQotCQkJCWlmIChpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDIpIHsKLQkJCQkJY3RybF91cDIgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTQsIFVQX0JVVFRPTik7Ci0JCQkJCWN0cmxfZG93bjIgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTQsIERPV05fQlVUVE9OKTsKLQkJCQl9Ci0JCQl9Ci0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lNCk7Ci0JCX0KLQotCQlpZiAodXNlQ2F0ZWdvcnkzKSB7Ci0JCQlDb21wb3NpdGUgcGFuZTUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgYUNvbXBvc2l0ZSwgMSk7Ci0JCQlsYWJlbF9DYXRlZ29yeTMgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lNSwgZ2V0U2VsZWN0ZWRMYWJlbDMoKSk7Ci0JCQlpZiAoY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjMpCi0JCQkJY3RybF9zZWxlY3RlZDMgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lNSwgU0lOR0xFX1JPVyk7Ci0JCQllbHNlIHsKLQkJCQlpZiAobnVtVGFibGVzVXNlZCA9PSAxKQotCQkJCQljdHJsX3NlbGVjdGVkMyA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmU1LCBMQVJHRV9TSVpFKTsKLQkJCQllbHNlIGlmIChudW1UYWJsZXNVc2VkID09IDIpCi0JCQkJCWN0cmxfc2VsZWN0ZWQzID0gY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTUsIE1FRElVTV9TSVpFKTsKLQkJCQllbHNlCi0JCQkJCWN0cmxfc2VsZWN0ZWQzID0gY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTUsIFNNQUxMX1NJWkUpOwotCQkJfQotCQkJdmlld2VyX3NlbGVjdGVkMyA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3NlbGVjdGVkMyk7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQzLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlclNlbGVjdGVkMyk7Ci0JCQlpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQzKCk7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQzLnNldElucHV0KGNvbnRlbnRFbGVtZW50KTsKLQkJCXZpZXdlcl9zZWxlY3RlZDMuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSk7Ci0JCQljcmVhdGVDb250ZXh0TWVudUZvcih2aWV3ZXJfc2VsZWN0ZWQzKTsKLQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTUpOwotCi0JCQlDb21wb3NpdGUgcGFuZTYgPSBjcmVhdGVDb21wb3NpdGVGb3JCdXR0b25zKHRvb2xraXQsIGFDb21wb3NpdGUpOwotCQkJaWYgKGFsbG93Q2hhbmdlMykgewotCQkJCWN0cmxfYWRkMyA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lNiwgQUREX0JVVFRPTik7Ci0JCQkJY3RybF9yZW1vdmUzID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU2LCBSRU1PVkVfQlVUVE9OKTsKLQotCQkJCWlmIChpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDMpIHsKLQkJCQkJY3RybF91cDMgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTYsIFVQX0JVVFRPTik7Ci0JCQkJCWN0cmxfZG93bjMgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTYsIERPV05fQlVUVE9OKTsKLQkJCQl9Ci0JCQl9Ci0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lNik7Ci0JCX0KLQotCQlzZXRFbmFibGVkQWRkQnV0dG9ucyh0cnVlKTsKLQotCQlzZXRXaWRnZXRXaWR0aHMoKTsKLQkJQ29tcG9zaXRlIHBhbmU3ID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGFDb21wb3NpdGUsCi0JCQkJR3JpZERhdGEuRklMTF9CT1RILCAxLCAxLCAxKTsKLQkJY3RybF9icmllZkRlc2MgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbExhcmdlKAotCQkJCXRvb2xraXQsCi0JCQkJcGFuZTcsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXNzb2NpYXRpb25Gb3JtUGFnZV9CcmllZkRlc2NyaXB0aW9uTGFiZWwpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfYnJpZWZEZXNjLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTcpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihhQ29tcG9zaXRlKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250ZXh0SGVscCgpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW5hYmxlZEFkZEJ1dHRvbnMoYm9vbGVhbiB2YWx1ZSkgewotCQlpZiAoYWxsb3dDaGFuZ2UxKQotCQkJY3RybF9hZGQuc2V0RW5hYmxlZCh2YWx1ZSk7Ci0JCWlmICh1c2VDYXRlZ29yeTIgJiYgYWxsb3dDaGFuZ2UyKQotCQkJY3RybF9hZGQyLnNldEVuYWJsZWQodmFsdWUpOwotCQlpZiAodXNlQ2F0ZWdvcnkzICYmIGFsbG93Q2hhbmdlMykKLQkJCWN0cmxfYWRkMy5zZXRFbmFibGVkKHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbmFibGVkUmVtb3ZlQnV0dG9ucyhib29sZWFuIHZhbHVlKSB7Ci0JCWlmIChhbGxvd0NoYW5nZTEpCi0JCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKHZhbHVlKTsKLQkJaWYgKHVzZUNhdGVnb3J5MiAmJiBhbGxvd0NoYW5nZTIpCi0JCQljdHJsX3JlbW92ZTIuc2V0RW5hYmxlZCh2YWx1ZSk7Ci0JCWlmICh1c2VDYXRlZ29yeTMgJiYgYWxsb3dDaGFuZ2UzKQotCQkJY3RybF9yZW1vdmUzLnNldEVuYWJsZWQodmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2FibGVCdXR0b25zQW5kRGVzZWxlY3RUYWJsZXMoKSB7Ci0JCS8vIHNldEVuYWJsZWRBZGRCdXR0b25zKGZhbHNlKTsKLQkJc2V0RW5hYmxlZFJlbW92ZUJ1dHRvbnMoZmFsc2UpOwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQlpZiAodXNlQ2F0ZWdvcnkyKQotCQkJdmlld2VyX3NlbGVjdGVkMi5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCWlmICh1c2VDYXRlZ29yeTMpCi0JCQl2aWV3ZXJfc2VsZWN0ZWQzLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJY3RybF9icmllZkRlc2Muc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlld2VycygpIHsKLQotCQl2aWV3ZXJfc2VsZWN0ZWQucmVmcmVzaCgpOwotCQkvLyBDaGVjayBpZiBleGlzdGluZyBlbGVtZW50IGlzIGNvbnRyaWJ1dG9yL2NvbnRyaWJ1dGVzIGZvciBzdGFuZGFyZAotCQkvLyBjYXRlZ29yaWVzCi0JCS8vIHNob3VsZCBub3Qgc2hvd24gaW4gdGhlIHRhYmxldmlld2VyLgotCQkvLyBDb21tZW50ZWQgYmVsb3cgdG8gYWxsb3cgY29udHJpYnV0b3JzIHRvIGRpc3BsYXkgaW4gdGhlIGxpc3QgYm94Ci0JCS8vIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KXsKLQkJLy8gaWYoIShjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSl7Ci0JCS8vIE9iamVjdFtdIGVsZW1lbnRzID0KLQkJLy8gY29udGVudFByb3ZpZGVyU2VsZWN0ZWQuZ2V0RWxlbWVudHMoY29udGVudEVsZW1lbnQpOwotCQkvLyBmb3IoaW50IGk9MDsgaTxlbGVtZW50cy5sZW5ndGg7IGkrKyl7Ci0JCS8vIE9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCl7Ci0JCS8vIGlmKFVJSGVscGVyLmlzQ29udHJpYnV0b3IoKENvbnRlbnRFbGVtZW50KWVsZW1lbnQpKXsKLQkJLy8gdmlld2VyX3NlbGVjdGVkLnJlbW92ZShlbGVtZW50KTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MikgewotCQkJdmlld2VyX3NlbGVjdGVkMi5yZWZyZXNoKCk7Ci0JCQkvLyBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSl7Ci0JCQkvLyBPYmplY3RbXSBlbGVtZW50cyA9Ci0JCQkvLyBjb250ZW50UHJvdmlkZXJTZWxlY3RlZDIuZ2V0RWxlbWVudHMoY29udGVudEVsZW1lbnQpOwotCQkJLy8gZm9yKGludCBpPTA7IGk8ZWxlbWVudHMubGVuZ3RoOyBpKyspewotCQkJLy8gT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCl7Ci0JCQkvLyBpZihVSUhlbHBlci5pc0NvbnRyaWJ1dG9yKChDb250ZW50RWxlbWVudCllbGVtZW50KSl7Ci0JCQkvLyB2aWV3ZXJfc2VsZWN0ZWQyLnJlbW92ZShlbGVtZW50KTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQotCQl9Ci0JCWlmICh1c2VDYXRlZ29yeTMpIHsKLQkJCXZpZXdlcl9zZWxlY3RlZDMucmVmcmVzaCgpOwotCQkJLy8gaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpewotCQkJLy8gT2JqZWN0W10gZWxlbWVudHMgPQotCQkJLy8gY29udGVudFByb3ZpZGVyU2VsZWN0ZWQzLmdldEVsZW1lbnRzKGNvbnRlbnRFbGVtZW50KTsKLQkJCS8vIGZvcihpbnQgaT0wOyBpPGVsZW1lbnRzLmxlbmd0aDsgaSsrKXsKLQkJCS8vIE9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpewotCQkJLy8gaWYoVUlIZWxwZXIuaXNDb250cmlidXRvcigoQ29udGVudEVsZW1lbnQpZWxlbWVudCkpewotCQkJLy8gdmlld2VyX3NlbGVjdGVkMy5yZW1vdmUoZWxlbWVudCk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCX0KLQkJY3RybF9icmllZkRlc2Muc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlmb3JtLmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmIChmb3JtICE9IG51bGwgJiYgIWZvcm0uaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCVVJSGVscGVyLnNldEZvcm1UZXh0KGZvcm0sIGNvbnRlbnRFbGVtZW50KTsKLQkJCQl9Ci0JCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJZW5hYmxlQ29udHJvbHMoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVuYWJsZUNvbnRyb2xzKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MSkgewotCQkJLy8gQWRkIGZvY3VzIGxpc3RlbmVyIG9uIHByaW1hcnkgdGFza3MgbGlzdAotCQkJY3RybF9zZWxlY3RlZC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCWRpc2FibGVCdXR0b25zQW5kRGVzZWxlY3RUYWJsZXMoKTsKLQotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZAotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKGFsbG93Q2hhbmdlMSAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQl2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZAotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJCQkJaWYgKGFsbG93Q2hhbmdlMSAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEKLQkJCQkJCQkJCSYmIHNlbGVjdGlvbi5zaXplKCkgPiAwCi0JCQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJCQkJaWYgKHZpZXdlcl9zZWxlY3RlZC5nZXRUYWJsZSgpCi0JCQkJCQkJCQkJLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpCi0JCQkJCQkJCQkJJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxICYmCi0JCQkJCQkJCQkJQ2F0ZWdvcnlTb3J0SGVscGVyLmlzTWFudWFsQ2F0ZWdvcnlTb3J0KGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQkJCQkJY3RybF91cDEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQkJfSBlbHNlCi0JCQkJCQkJCQljdHJsX3VwMS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJCQkJCQlpZiAodmlld2VyX3NlbGVjdGVkLmdldFRhYmxlKCkKLQkJCQkJCQkJCQkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHZpZXdlcl9zZWxlY3RlZAotCQkJCQkJCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KQotCQkJCQkJCQkJCSYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSAmJgotCQkJCQkJCQkJCUNhdGVnb3J5U29ydEhlbHBlci5pc01hbnVhbENhdGVnb3J5U29ydChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJCQkJCWN0cmxfZG93bjEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQkJfSBlbHNlCi0JCQkJCQkJCQljdHJsX2Rvd24xLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJCX0KLQotCQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCQkJU3RyaW5nIGRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGlvbgotCQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSkKLQkJCQkJCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCQlkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQljdHJsX2JyaWVmRGVzYy5zZXRUZXh0KGRlc2MpOwotCQkJCQkJCX0gZWxzZSBpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDEpIHsKLQkJCQkJCQkJY3RybF9icmllZkRlc2MKLQkJCQkJCQkJCQkuc2V0VGV4dChnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKHNlbGVjdGlvbgotCQkJCQkJCQkJCQkJLnNpemUoKSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQl9KTsKLQotCQkJaWYgKGFsbG93Q2hhbmdlMSkgewotCQkJCWN0cmxfYWRkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHZpZXdlcl9zZWxlY3RlZC5nZXRUYWJsZSgpCi0JCQkJCQkJCS5nZXRJdGVtcygpOwotCQkJCQkJTGlzdCBzZWxlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJc2VsZWN0ZWRMaXN0LmFkZChpdGVtc1tpXS5nZXREYXRhKCkpOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoZ2V0RmlsdGVyKCkgIT0gbnVsbCkgewotCQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKAotCQkJCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJLmdldFNoZWxsKCksIGdldEZpbHRlcigpLAotCQkJCQkJCQkJZ2V0Q29udGVudEVsZW1lbnQoKSwgZ2V0VGFiU3RyaW5nKCkpOwotCQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJCWZkLnNldFRpdGxlKGdldFRhYlN0cmluZygpKTsKLQkJCQkJCQlpZihjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMSl7Ci0JCQkJCQkJCWZkLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZmQuc2V0RXhpc3RpbmdFbGVtZW50cyhzZWxlY3RlZExpc3QpOwotCQkJCQkJCWlmKGdldEZpbHRlclR5cGVzKCkgIT0gbnVsbCl7Ci0JCQkJCQkJCWZkLnNldFR5cGVzKGdldEZpbHRlclR5cGVzKCkpOwotCQkJCQkJCX0KLQkJCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQkJYWRkSXRlbXNUb01vZGVsMShmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJfQotCQkJCQkJLy8gdmlld2VyX3NlbGVjdGVkLnJlZnJlc2goKTsKLQkJCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0KLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJY3RybF9yZW1vdmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJCXJlbW92ZUl0ZW1zRnJvbU1vZGVsMShybUl0ZW1zKTsKLQkJCQkJCQkvLyB2aWV3ZXJfc2VsZWN0ZWQucmVmcmVzaCgpOwotCQkJCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0JCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJCXZpZXdlcl9zZWxlY3RlZC5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCQkJY3RybF9icmllZkRlc2Muc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodXNlQ2F0ZWdvcnkyKSB7Ci0JCQkvLyBBZGQgZm9jdXMgbGlzdGVuZXIgb24gcHJpbWFyeSB0YXNrcyBsaXN0Ci0JCQljdHJsX3NlbGVjdGVkMi5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCWRpc2FibGVCdXR0b25zQW5kRGVzZWxlY3RUYWJsZXMoKTsKLQotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZDIKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChhbGxvd0NoYW5nZTIgJiYgc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJCWN0cmxfcmVtb3ZlMi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXZpZXdlcl9zZWxlY3RlZDIKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZDIKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQlsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCQkJCWlmIChhbGxvd0NoYW5nZTIgJiYgc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQkJCQljdHJsX3JlbW92ZTIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJCQlTdHJpbmcgZGVzYyA9ICgoTWV0aG9kRWxlbWVudCkgc2VsZWN0aW9uCi0JCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKQotCQkJCQkJCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJCQkJCWlmIChkZXNjID09IG51bGwpIHsKLQkJCQkJCQkJCWRlc2MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWN0cmxfYnJpZWZEZXNjLnNldFRleHQoZGVzYyk7Ci0JCQkJCQkJfSBlbHNlIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJCQkJCQljdHJsX2JyaWVmRGVzYwotCQkJCQkJCQkJCS5zZXRUZXh0KGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oc2VsZWN0aW9uCi0JCQkJCQkJCQkJCQkuc2l6ZSgpKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCX0pOwotCi0JCQlpZiAoYWxsb3dDaGFuZ2UyKSB7Ci0JCQkJY3RybF9hZGQyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHZpZXdlcl9zZWxlY3RlZDIuZ2V0VGFibGUoKQotCQkJCQkJCQkuZ2V0SXRlbXMoKTsKLQkJCQkJCUxpc3Qgc2VsZWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCXNlbGVjdGVkTGlzdC5hZGQoaXRlbXNbaV0uZ2V0RGF0YSgpKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChnZXRGaWx0ZXIyKCkgIT0gbnVsbCkgewotCQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKAotCQkJCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJLmdldFNoZWxsKCksIGdldEZpbHRlcjIoKSwKLQkJCQkJCQkJCWdldENvbnRlbnRFbGVtZW50KCksIGdldFRhYlN0cmluZzIoKSk7Ci0JCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQkJZmQuc2V0VGl0bGUoZ2V0VGFiU3RyaW5nMigpKTsKLQkJCQkJCQlmZC5zZXRFeGlzdGluZ0VsZW1lbnRzKHNlbGVjdGVkTGlzdCk7Ci0JCQkJCQkJZmQub3BlbigpOwotCQkJCQkJCWFkZEl0ZW1zVG9Nb2RlbDIoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJCX0KLQkJCQkJCXZpZXdlcl9zZWxlY3RlZDIucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX3JlbW92ZTIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkMgotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCQlyZW1vdmVJdGVtc0Zyb21Nb2RlbDIocm1JdGVtcyk7Ci0JCQkJCQkJdmlld2VyX3NlbGVjdGVkMi5yZWZyZXNoKCk7Ci0KLQkJCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCQkJdmlld2VyX3NlbGVjdGVkMi5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCQkJY3RybF9icmllZkRlc2Muc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWN0cmxfcmVtb3ZlMi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JCWlmICh1c2VDYXRlZ29yeTMpIHsKLQkJCS8vIEFkZCBmb2N1cyBsaXN0ZW5lciBvbiBwcmltYXJ5IHRhc2tzIGxpc3QKLQkJCWN0cmxfc2VsZWN0ZWQzLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJZGlzYWJsZUJ1dHRvbnNBbmREZXNlbGVjdFRhYmxlcygpOwotCi0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkMwotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKGFsbG93Q2hhbmdlMyAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQkJY3RybF9yZW1vdmUzLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJdmlld2VyX3NlbGVjdGVkMwotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkMwotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJCQkJaWYgKGFsbG93Q2hhbmdlMyAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQkJCWN0cmxfcmVtb3ZlMy5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQkJCVN0cmluZyBkZXNjID0gKChNZXRob2RFbGVtZW50KSBzZWxlY3Rpb24KLQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpCi0JCQkJCQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCQkJZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJY3RybF9icmllZkRlc2Muc2V0VGV4dChkZXNjKTsKLQkJCQkJCQl9IGVsc2UgaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJCQkJCWN0cmxfYnJpZWZEZXNjCi0JCQkJCQkJCQkJLnNldFRleHQoZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihzZWxlY3Rpb24KLQkJCQkJCQkJCQkJCS5zaXplKCkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJfSk7Ci0KLQkJCWlmIChhbGxvd0NoYW5nZTMpIHsKLQkJCQljdHJsX2FkZDMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdmlld2VyX3NlbGVjdGVkMy5nZXRUYWJsZSgpCi0JCQkJCQkJCS5nZXRJdGVtcygpOwotCQkJCQkJTGlzdCBzZWxlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJc2VsZWN0ZWRMaXN0LmFkZChpdGVtc1tpXS5nZXREYXRhKCkpOwotCQkJCQkJfQotCQkJCQkJaWYgKGdldEZpbHRlcjMoKSAhPSBudWxsKSB7Ci0JCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coCi0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0U2hlbGwoKSwgZ2V0RmlsdGVyMygpLAotCQkJCQkJCQkJZ2V0Q29udGVudEVsZW1lbnQoKSwgZ2V0VGFiU3RyaW5nMygpKTsKLQkJCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCQlmZC5zZXRUaXRsZShnZXRUYWJTdHJpbmczKCkpOwotCQkJCQkJCWZkLnNldEV4aXN0aW5nRWxlbWVudHMoc2VsZWN0ZWRMaXN0KTsKLQkJCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQkJYWRkSXRlbXNUb01vZGVsMyhmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJfQotCQkJCQkJdmlld2VyX3NlbGVjdGVkMy5yZWZyZXNoKCk7Ci0KLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJY3RybF9yZW1vdmUzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZDMKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQkJCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQkJcmVtb3ZlSXRlbXNGcm9tTW9kZWwzKHJtSXRlbXMpOwotCQkJCQkJCXZpZXdlcl9zZWxlY3RlZDMucmVmcmVzaCgpOwotCi0JCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJCXZpZXdlcl9zZWxlY3RlZDMuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQkJCWN0cmxfYnJpZWZEZXNjLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQljdHJsX3JlbW92ZTMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCi0JCWlmIChhbGxvd0NoYW5nZTEgJiYgaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKSB7Ci0JCQljdHJsX3VwMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCUFycmF5TGlzdCBtb3ZlVXBJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCW1vdmVVcEl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJbW92ZVVwSXRlbXNJblNlbGVjdGVkSXRlbXMxKG1vdmVVcEl0ZW1zKTsKLQkJCQkJfQotCQkJCQkvLyB2aWV3ZXJfc2VsZWN0ZWQucmVmcmVzaCgpOwotCQkJCQlyZWZyZXNoVmlld2VycygpOwotCQkJCQlpZiAodmlld2VyX3NlbGVjdGVkLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkgJiYKLQkJCQkJCQlDYXRlZ29yeVNvcnRIZWxwZXIuaXNNYW51YWxDYXRlZ29yeVNvcnQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQljdHJsX3VwMS5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9IGVsc2UKLQkJCQkJCWN0cmxfdXAxLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlpZiAodmlld2VyX3NlbGVjdGVkLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHZpZXdlcl9zZWxlY3RlZAotCQkJCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSAmJgotCQkJCQkJCUNhdGVnb3J5U29ydEhlbHBlci5pc01hbnVhbENhdGVnb3J5U29ydChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJCWN0cmxfZG93bjEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQljdHJsX2Rvd24xLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0pOwotCi0JCQljdHJsX2Rvd24xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJQXJyYXlMaXN0IG1vdmVEb3duSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQltb3ZlRG93bkl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJbW92ZURvd25JdGVtc0luU2VsZWN0ZWRJdGVtczEobW92ZURvd25JdGVtcyk7Ci0JCQkJCX0KLQkJCQkJLy8gdmlld2VyX3NlbGVjdGVkLnJlZnJlc2goKTsKLQkJCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJCQkJaWYgKHZpZXdlcl9zZWxlY3RlZC5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpICYmCi0JCQkJCQkJQ2F0ZWdvcnlTb3J0SGVscGVyLmlzTWFudWFsQ2F0ZWdvcnlTb3J0KGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQkJY3RybF91cDEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQljdHJsX3VwMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJaWYgKHZpZXdlcl9zZWxlY3RlZC5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCB2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkgJiYKLQkJCQkJCQlDYXRlZ29yeVNvcnRIZWxwZXIuaXNNYW51YWxDYXRlZ29yeVNvcnQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQljdHJsX2Rvd24xLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0gZWxzZQotCQkJCQkJY3RybF9kb3duMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJY3RybF9vcmRlcmluZy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nIGRsZyA9IG5ldyBDb250ZW50RWxlbWVudHNPcmRlckRpYWxvZygKLQkJCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LCBnZXRBY3Rpb25NYW5hZ2VyKCkpOwotCQkJCQlkbGcub3BlbigpOwotCQkJCQlpZiAoYWxsb3dDaGFuZ2UxICYmIGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSkgewotCQkJCQkJU3RyaW5nIHNvcnRUeXBlID0gQ2F0ZWdvcnlTb3J0SGVscGVyLmdldENhdGVnb3J5U29ydFZhbHVlKGNvbnRlbnRFbGVtZW50KTsKLQkJCQkJCXZpZXdlcl9zb3J0MS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc29ydFR5cGUpLCB0cnVlKTsKLQkJCQkJCXZpZXdlcl9zb3J0MS5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJdmlld2VyX3NvcnQxLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zb3J0MQotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJU3RyaW5nIHNvcnRUeXBlID0gKFN0cmluZylzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCWlmICghQ2F0ZWdvcnlTb3J0SGVscGVyLmdldENhdGVnb3J5U29ydFZhbHVlKGNvbnRlbnRFbGVtZW50KS5lcXVhbHMoc29ydFR5cGUpKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IENhdGVnb3J5U29ydEhlbHBlci5nZXRDYXRlZ29yeVNvcnRQcm9wZXJ0eShjb250ZW50RWxlbWVudCk7Ci0JCQkJCQkKLQkJCQkJCWlmIChwcm9wID09IG51bGwpIHsJCQkKLQkJCQkJCQlwcm9wID0gQ2F0ZWdvcnlTb3J0SGVscGVyLmNyZWF0ZU5ld1NvcnRQcm9wZXJ0eShzb3J0VHlwZSk7Ci0JCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKSwKLQkJCQkJCQkJCXByb3AsIC0xKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCXByb3AsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eV9WYWx1ZSgpLAotCQkJCQkJCQkJCXNvcnRUeXBlLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCQlMaWJyYXJ5Vmlldy5nZXRWaWV3KCkucmVmcmVzaFZpZXdzKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHZpZXdlcl9zZWxlY3RlZC5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpICYmCi0JCQkJCQkJQ2F0ZWdvcnlTb3J0SGVscGVyLmlzTWFudWFsQ2F0ZWdvcnlTb3J0KGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQkJY3RybF91cDEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQljdHJsX3VwMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJaWYgKHZpZXdlcl9zZWxlY3RlZC5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCB2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkgJiYKLQkJCQkJCQlDYXRlZ29yeVNvcnRIZWxwZXIuaXNNYW51YWxDYXRlZ29yeVNvcnQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQljdHJsX2Rvd24xLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0gZWxzZQotCQkJCQkJY3RybF9kb3duMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZUNvbnRyb2xzKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJaWYgKHVzZUNhdGVnb3J5MSkgewotCQkJaWYgKGFsbG93Q2hhbmdlMSkgewotCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKGFsbG93Q2hhbmdlMSAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAodXNlQ2F0ZWdvcnkyKSB7Ci0JCQlpZiAoYWxsb3dDaGFuZ2UyKSB7Ci0JCQkJY3RybF9hZGQyLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkMgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChhbGxvd0NoYW5nZTIgJiYgc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQljdHJsX3JlbW92ZTIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX3JlbW92ZTIuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHVzZUNhdGVnb3J5MykgewotCQkJaWYgKGFsbG93Q2hhbmdlMykgewotCQkJCWN0cmxfYWRkMy5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZDMKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoYWxsb3dDaGFuZ2UzICYmIHNlbGVjdGlvbi5zaXplKCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJY3RybF9yZW1vdmUzLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF9yZW1vdmUzLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQkJfQotCQkJfQotCQl9Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxICYmIHNlbGVjdGlvbi5zaXplKCkgPiAwCi0JCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQlpZiAodmlld2VyX3NlbGVjdGVkLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpICYmCi0JCQkJCUNhdGVnb3J5U29ydEhlbHBlci5pc01hbnVhbENhdGVnb3J5U29ydChjb250ZW50RWxlbWVudCkpIHsKLQkJCQljdHJsX3VwMS5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlCi0JCQkJY3RybF91cDEuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJCWlmICh2aWV3ZXJfc2VsZWN0ZWQuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgdmlld2VyX3NlbGVjdGVkCi0JCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkgJiYKLQkJCQkJQ2F0ZWdvcnlTb3J0SGVscGVyLmlzTWFudWFsQ2F0ZWdvcnlTb3J0KGNvbnRlbnRFbGVtZW50KSkgewotCQkJCWN0cmxfZG93bjEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZQotCQkJCWN0cmxfZG93bjEuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl2aWV3ZXJfc29ydDEuZ2V0Q29tYm8oKS5zZXRFbmFibGVkKHRydWUpOwotCQl9IGVsc2UgaWYgKGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJLy8gaXQncyBsb2NrZWQKLQkJCWN0cmxfdXAxLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJY3RybF9kb3duMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWN0cmxfb3JkZXJpbmcuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXZpZXdlcl9zb3J0MS5nZXRDb21ibygpLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgaWYgKGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSAmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCS8vIG5vIHNlbGVjdGlvbgotCQkJY3RybF91cDEuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQljdHJsX2Rvd24xLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJY3RybF9vcmRlcmluZy5zZXRFbmFibGVkKHRydWUpOwotCQkJdmlld2VyX3NvcnQxLmdldENvbWJvKCkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfSBlbHNlIGlmIChpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEpIHsKLQkJCS8vIGl0J3MgbG9ja2VkIGFuZCBubyBzZWxlY3Rpb24KLQkJCXZpZXdlcl9zb3J0MS5nZXRDb21ibygpLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0Jdm9pZCBzZXREaXJ0eShib29sZWFuIGIpIHsKLQkJLy8gUGhvbmcgKDAzLzA3LzIwMDUpOiB0aGUgZGlydHkgc3RhdGUgb2YgdGhlIGVkaXRvciBpcyBhbHJlYWR5IHRha2VuCi0JCS8vIGNhcmUgaW4gTWV0aG9kRWxlbWVudEVkaXRvciwgdHJhbnNwYXJlbnQgZnJvbSB1c2VyCi0JCS8vIGludGVyYWN0aW9uLiBObyBmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSkgc2hvdWxkIGJlIGNhbGxlZAotCQkvLyBzb21ld2hlcmUgZWxzZS4KLQkJLy8gTk9URTogdW5uZWNlc3NhcnkgY2FsbHMgdG8gZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpIHdpbGwgY2F1c2UKLQkJLy8gcGVyZm9ybWFuY2UgcHJvYmxlbS4KLQkJLy8gZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh1c2VkQ2F0ZWdvcmllcy5zaXplKCkgPiAwKQotCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWxlYXNlQ2F0ZWdvcmllcyhjb250ZW50RWxlbWVudCwKLQkJCQkJdXNlZENhdGVnb3JpZXMpOwotCi0JCWlmIChsYWJlbFByb3ZpZGVyU2VsZWN0ZWQgIT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlclNlbGVjdGVkLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAobGFiZWxQcm92aWRlclNlbGVjdGVkMiAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyU2VsZWN0ZWQyLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAobGFiZWxQcm92aWRlclNlbGVjdGVkMyAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyU2VsZWN0ZWQzLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VjdGlvbiBuYW1lLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlY3Rpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCS8vIFRWVCBpc3N1ZSBzaW5nbGUgcXVvdGUgCi0JCS8vIEZvcm1hdCBzaG91bGQgYmUgZG9uZSBvbmx5IGZvciBDYXRlZ29yeUd1aWRhbmNlUGFnZSwgQXV0aG9yaW5nVUkuY2F0ZWdvcnlHdWlkYW5jZXNQYWdlLnNlY3Rpb25EZXNjcmlwdGlvbiBrZXkgCi0JCS8vIGhhdmUgaGFzIHJlcGxhY2VtZW50IHZhcmlhYmxlIGluIGl0cyB2YWx1ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gY2hlY2sgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0JICAgLyogCi0JICAgICogTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0JICAgIFN0cmluZ3Mgd2hpY2ggY29udGFpbiByZXBsYWNlbWVudCB2YXJpYWJsZXMgYXJlIHByb2Nlc3NlZCBieSB0aGUgIAotCSAgICBNZXNzYWdlRm9ybWF0IGNsYXNzIChzaW5nbGUgcXVvdGUgbXVzdCBiZSBjb2RlZCBhcyAyIGNvbnNlY3V0aXZlIHNpbmdsZSAgCi0JICAgIHF1b3RlcyAnJykuIFN0cmluZ3Mgd2hpY2ggZG8gTk9UIGNvbnRhaW4gcmVwbGFjZW1lbnQgdmFyaWFibGVzIGFyZSBOT1QgICAKLQkgICAgcHJvY2Vzc2VkIGJ5IHRoZSBNZXNzYWdlRm9ybWF0IGNsYXNzIChzaW5nbGUgcXVvdGUgbXVzdCBiZSBjb2RlZCBhcyAxCi0JCXNpbmdsZSBxdW90ZSAnKS4qLwotCQkKLQkJaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudAotCQkJCSYmICJjYXRlZ29yeUd1aWRhbmNlc1BhZ2UiLmVxdWFsc0lnbm9yZUNhc2UoZ2V0SWQoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIE5MUy5iaW5kKFBBQ0tBR0VfUFJFRklYICsgZ2V0SWQoKSArICIuc2VjdGlvbkRlc2NyaXB0aW9uIiwgTGlicmFyeVVJVGV4dC5nZXRVSVRleHRMb3dlcihtZXRob2RFbGVtZW50KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBzZWxlY3RlZCBsYWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCS8vIGlmIChtZXRob2RFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCS8vIHJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5mb3JtYXRTdHJpbmcoUEFDS0FHRV9QUkVGSVggKyBnZXRJZCgpICsKLQkJLy8gIi5zZWxlY3RlZExhYmVsIiwgTGlicmFyeVVJVGV4dC5nZXRVSVRleHQobWV0aG9kRWxlbWVudCkpOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vIH0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2Vjb25kIHNlbGVjdGVkIGxhYmxlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRoaXJkIHNlbGVjdGVkIGxhYmxlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG11bHRpcGxlIHNlY3Rpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgUEFDS0FHRV9QUkVGSVggKyBnZXRJZCgpICsgIi5tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbXVsdGlwbGUgc2VjdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50LCBTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKGtleSwgbmV3IEludGVnZXIoY291bnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgZGVzY3JpcHRpb24gZm9yIHNlY3Rpb24KLQkgKiBAcGFyYW0gc2VjdGlvbkRlc2MKLQkgKiAJCQlEZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlY3Rpb25EZXNjKFN0cmluZyBzZWN0aW9uRGVzYykgewotCQl0aGlzLnNlY3Rpb25EZXNjID0gc2VjdGlvbkRlc2M7Ci0JfQotCi0JLyoqCi0JICogU2V0IGZpcnN0IGxhYmVsCi0JICogQHBhcmFtIHNlbGVjdGVkTGFiZWwxCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRMYWJlbChTdHJpbmcgc2VsZWN0ZWRMYWJlbDEpIHsKLQkJdGhpcy5zZWxlY3RlZExhYmVsID0gc2VsZWN0ZWRMYWJlbDE7Ci0JfQotCi0JLyoqCi0JICogU2V0IHNlY29uZCBsYWJlbAotCSAqIEBwYXJhbSBzZWxlY3RlZExhYmVsMgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkTGFiZWwyKFN0cmluZyBzZWxlY3RlZExhYmVsMikgewotCQl0aGlzLnNlbGVjdGVkTGFiZWwyID0gc2VsZWN0ZWRMYWJlbDI7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoaXJkIGxhYmVsCi0JICogQHBhcmFtIHNlbGVjdGVkTGFiZWwzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRMYWJlbDMoU3RyaW5nIHNlbGVjdGVkTGFiZWwzKSB7Ci0JCXRoaXMuc2VsZWN0ZWRMYWJlbDMgPSBzZWxlY3RlZExhYmVsMzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIGZvciB0aGUgZmlyc3QgY2F0ZWdvcnkgdG8gYmUgZWl0aGVyIHNpbmdsZSBzZWxlY3Rpb24gb3IgbXVsdGlwbGUgc2VsZWN0aW9uCi0JICogQHBhcmFtIGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEoYm9vbGVhbiBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMSkgewotCQl0aGlzLmNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xID0gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjE7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiBmb3IgdGhlIHNlY29uZCBjYXRlZ29yeSB0byBiZSBlaXRoZXIgc2luZ2xlIHNlbGVjdGlvbiBvciBtdWx0aXBsZSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMihib29sZWFuIGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24yKSB7Ci0JCXRoaXMuY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjIgPSBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIGZvciB0aGUgdGhpcmQgY2F0ZWdvcnkgdG8gYmUgZWl0aGVyIHNpbmdsZSBzZWxlY3Rpb24gb3IgbXVsdGlwbGUgc2VsZWN0aW9uCi0JICogQHBhcmFtIGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24zCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjMoYm9vbGVhbiBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMykgewotCQl0aGlzLmNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24zID0gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjM7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiB0byB1c2UgZmlyc3QgY2F0ZWdvcnkKLQkgKiBAcGFyYW0gdXNlQ2F0ZWdvcnkxCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlQ2F0ZWdvcnkxKGJvb2xlYW4gdXNlQ2F0ZWdvcnkxKSB7Ci0JCXRoaXMudXNlQ2F0ZWdvcnkxID0gdXNlQ2F0ZWdvcnkxOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gdG8gdXNlIHNlY29uZCBjYXRlZ29yeQotCSAqIEBwYXJhbSB1c2VDYXRlZ29yeTIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VDYXRlZ29yeTIoYm9vbGVhbiB1c2VDYXRlZ29yeTIpIHsKLQkJdGhpcy51c2VDYXRlZ29yeTIgPSB1c2VDYXRlZ29yeTI7Ci0JfQotCi0JCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiB0byB1c2UgdGhpcmQgY2F0ZWdvcnkKLQkgKiBAcGFyYW0gdXNlQ2F0ZWdvcnkzCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlQ2F0ZWdvcnkzKGJvb2xlYW4gdXNlQ2F0ZWdvcnkzKSB7Ci0JCXRoaXMudXNlQ2F0ZWdvcnkzID0gdXNlQ2F0ZWdvcnkzOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gdG8gYWxsb3cgY2hhbmdlcyBmb3IgZmlyc3QgdGFibGUgaW4gVUkKLQkgKiBAcGFyYW0gYWxsb3dDaGFuZ2UxCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsb3dDaGFuZ2UxKGJvb2xlYW4gYWxsb3dDaGFuZ2UxKSB7Ci0JCXRoaXMuYWxsb3dDaGFuZ2UxID0gYWxsb3dDaGFuZ2UxOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gdG8gYWxsb3cgY2hhbmdlcyBmb3IgdGhlIHNlY29uZCB0YWJsZSBpbiBVSQotCSAqIEBwYXJhbSBhbGxvd0NoYW5nZTIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd0NoYW5nZTIoYm9vbGVhbiBhbGxvd0NoYW5nZTIpIHsKLQkJdGhpcy5hbGxvd0NoYW5nZTIgPSBhbGxvd0NoYW5nZTI7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiB0byBhbGxvdyBjaGFuZ2VzIGZvciB0aGlyZCB0YWJsZS4KLQkgKiBAcGFyYW0gYWxsb3dDaGFuZ2UzCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsb3dDaGFuZ2UzKGJvb2xlYW4gYWxsb3dDaGFuZ2UzKSB7Ci0JCXRoaXMuYWxsb3dDaGFuZ2UzID0gYWxsb3dDaGFuZ2UzOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gdG8gc2hvdyBmaXJzdCBzZXQgb2YgdXAvZG93biBidXR0b25zCi0JICogQHBhcmFtIGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSgKLQkJCWJvb2xlYW4gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKSB7Ci0JCXRoaXMuaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxID0gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gdG8gc2hvdyBzZWNvbmQgc2V0IG9mIHVwL2Rvd24gYnV0dG9ucwotCSAqIEBwYXJhbSBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDIoCi0JCQlib29sZWFuIGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMikgewotCQl0aGlzLmlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMiA9IGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIHRvIHNob3cgdGhpcmQgc2V0IG9mIHVwL2Rvd24gYnV0dG9ucy4KLQkgKiBAcGFyYW0gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQzCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQzKAotCQkJYm9vbGVhbiBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDMpIHsKLQkJdGhpcy5pc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDMgPSBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDM7Ci0JfQotCi0JLy8gY2FsY3VsYXRlIHdpZHRocyBmb3IgbGFiZWxzIGFuZCB0YWJsZXMsIGJhc2VkIG9uIHdpZHRoIG9mIGxhYmVscwotCXByb3RlY3RlZCB2b2lkIHNldFdpZGdldFdpZHRocygpIHsKLQkJaW50IGFsbENhdGVnb3JpZXNXaWR0aCA9IDAsIGNhdGVnb3J5V2lkdGggPSAwLCBjYXRlZ29yeTJXaWR0aCA9IDAsIGNhdGVnb3J5M1dpZHRoID0gMDsKLQkJaW50IGxhcmdlc3RXaWR0aCA9IDA7Ci0JCS8vIGlmICh1c2VDYXRlZ29yeTEpIGFsbENhdGVnb3JpZXNXaWR0aCA9Ci0JCS8vIGxhYmVsX2FsbENhdGVnb3JpZXMuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotCQlpZiAodXNlQ2F0ZWdvcnkxKQotCQkJY2F0ZWdvcnlXaWR0aCA9IGxhYmVsX0NhdGVnb3J5Ci0JCQkJCS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLng7Ci0JCWlmICh1c2VDYXRlZ29yeTIpCi0JCQljYXRlZ29yeTJXaWR0aCA9IGxhYmVsX0NhdGVnb3J5Mi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwKLQkJCQkJU1dULkRFRkFVTFQpLng7Ci0JCWlmICh1c2VDYXRlZ29yeTMpCi0JCQljYXRlZ29yeTNXaWR0aCA9IGxhYmVsX0NhdGVnb3J5My5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwKLQkJCQkJU1dULkRFRkFVTFQpLng7Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MSkKLQkJCWxhcmdlc3RXaWR0aCA9IE1hdGgubWF4KGFsbENhdGVnb3JpZXNXaWR0aCwgY2F0ZWdvcnlXaWR0aCk7Ci0JCWlmICh1c2VDYXRlZ29yeTIpCi0JCQlsYXJnZXN0V2lkdGggPSBNYXRoLm1heChsYXJnZXN0V2lkdGgsIGNhdGVnb3J5MldpZHRoKTsKLQkJaWYgKHVzZUNhdGVnb3J5MykKLQkJCWxhcmdlc3RXaWR0aCA9IE1hdGgubWF4KGxhcmdlc3RXaWR0aCwgY2F0ZWdvcnkzV2lkdGgpOwotCi0JCWlmICh1c2VDYXRlZ29yeTEpIHsKLQkJCS8vICgoR3JpZERhdGEpbGFiZWxfYWxsQ2F0ZWdvcmllcy5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9Ci0JCQkvLyBsYXJnZXN0V2lkdGg7Ci0JCQkvLyAoKEdyaWREYXRhKWN0cmxfYWxsQXZhaWxhYmxlLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0KLQkJCS8vIGxhcmdlc3RXaWR0aDsKLQkJCSgoR3JpZERhdGEpIGxhYmVsX0NhdGVnb3J5LmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbGFyZ2VzdFdpZHRoOwotCQkJKChHcmlkRGF0YSkgY3RybF9zZWxlY3RlZC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGxhcmdlc3RXaWR0aDsKLQkJfQotCQlpZiAodXNlQ2F0ZWdvcnkyKSB7Ci0JCQkoKEdyaWREYXRhKSBsYWJlbF9DYXRlZ29yeTIuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBsYXJnZXN0V2lkdGg7Ci0JCQkoKEdyaWREYXRhKSBjdHJsX3NlbGVjdGVkMi5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGxhcmdlc3RXaWR0aDsKLQkJfQotCQlpZiAodXNlQ2F0ZWdvcnkzKSB7Ci0JCQkoKEdyaWREYXRhKSBsYWJlbF9DYXRlZ29yeTMuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBsYXJnZXN0V2lkdGg7Ci0JCQkoKEdyaWREYXRhKSBjdHJsX3NlbGVjdGVkMy5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGxhcmdlc3RXaWR0aDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJQWN0aW9uTWFuYWdlciBnZXRBY3Rpb25NYW5hZ2VyKCkgewotCQlGb3JtRWRpdG9yIGVkaXRvciA9IGdldEVkaXRvcigpOwotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcikgewotCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZWRpdG9yKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENvbnRleHRIZWxwKCkgewotCQkvLyBpbiB0aGUgZnV0dXJlLCB3ZSBzaG91bGQgY2hlY2sgdGhlIHN1YmNsYXNzIHR5cGUgdG8gc2V0IHVwIGEKLQkJLy8gZGlmZmVyZW50Ci0JCS8vIGNvbnRleHQgcGFnZSBmb3IgZWNoIHR5cGUgb2YgYXNzb2NpYXRpb25zCi0JCUVkaXRvcnNDb250ZXh0SGVscGVyLnNldEhlbHAoZ2V0UGFydENvbnRyb2woKSwgZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBjb250ZXh0IG1lbnUgZm9yIHRoZSBnaXZlbiB2aWV3ZXIKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udGV4dE1lbnVGb3IoZmluYWwgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKLQkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOyAvLyROT04tTkxTLTEkCi0JCWNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCWNvbnRleHRNZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkJY29udGV4dE1lbnUuYWRkTWVudUxpc3RlbmVyKHRoaXMpOwotCQlNZW51IG1lbnUgPSBjb250ZXh0TWVudS5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKLQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgdmlld2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyI21lbnVBYm91dFRvU2hvdyhvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3Iob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24pKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQmFzZUZvcm1QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQmFzZUZvcm1QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFhMWVlZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Jhc2VGb3JtUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0VG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRGVjb3JhdGVkRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuSUNvbnRyb2xDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkltYWdlSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci0KLQotLyoqCi0gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIE1ldGhvZCBlZGl0b3IgZm9ybSBwYWdlcy4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICogZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2MzgyCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlRm9ybVBhZ2UgZXh0ZW5kcyBGb3JtUGFnZSB7Ci0KLQkvKioKLQkgKiBCdXR0b24gdHlwZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREX0JVVFRPTiA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkVfQlVUVE9OID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQX0JVVFRPTiA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET1dOX0JVVFRPTiA9IDM7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBPUkRFUl9CVVRUT04gPSA0OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUX0JVVFRPTiA9IDU7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDTEVBUl9CVVRUT04gPSA2OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQVRUQUNIX0JVVFRPTiA9IDc7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBERVRBQ0hfQlVUVE9OID0gODsKLQotCS8qKgotCSAqIFRhYmxlIHR5cGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNNQUxMX1NJWkUgPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVESVVNX1NJWkUgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFSR0VfU0laRSA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU5HTEVfUk9XID0gMzsKLQotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnOwotCi0JcHJvdGVjdGVkIFNjcm9sbGVkRm9ybSBmb3JtOwotCi0JcHJvdGVjdGVkIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGVkaXRvclRhYk5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGVkaXRvck5hbWU7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50OwotCi0JcHJvdGVjdGVkIENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50ID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgY29udGVudEVsZW1lbnRQYXRoOwotCi0JcHJpdmF0ZSBpbnQgU0VDVElPTl9JRDsKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBEZWNvcmF0ZWRMYWJlbENyZWF0b3IgaW1wbGVtZW50cyBJQ29udHJvbENyZWF0b3IgewotCQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQkJcmV0dXJuIG5ldyBMYWJlbChwYXJlbnQsIHN0eWxlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgRGVjb3JhdGVkTGFiZWxDcmVhdG9yIGRlY29yYXRlZExhYmVsQ3JlYXRvciA9IG5ldyBEZWNvcmF0ZWRMYWJlbENyZWF0b3IoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGVkaXRvcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBmb3JtIGVkaXRvci4KLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIFRoZSB1bmlxdWUgSUQgZm9yIHRoZSBmb3JtIHBhZ2UuCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBmb3JtIHBhZ2UuCi0JICovCi0JcHVibGljIEJhc2VGb3JtUGFnZShGb3JtRWRpdG9yIGVkaXRvciwgU3RyaW5nIGlkLCBTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIoZWRpdG9yLCBpZCwgdGl0bGUpOwotCQlkZWJ1ZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzZXRTaXRlKHNpdGUpOwotCQlzZXRJbnB1dChpbnB1dCk7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIENvbnRlbnRFbGVtZW50IG9iamVjdCBmcm9tIHRoZSBlZGl0b3IgaW5wdXQuCi0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBtZXRob2RFbGVtZW50SW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dDsKLQkJU3RyaW5nIGxpYlBhdGggPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpOwotCQltZXRob2RFbGVtZW50ID0gbWV0aG9kRWxlbWVudElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlPYmplY3Qgb2JqID0gKChQcm9jZXNzQ29tcG9uZW50KSBtZXRob2RFbGVtZW50KS5nZXRQcm9jZXNzKCk7Ci0JCQljb250ZW50RWxlbWVudFBhdGggPSBsaWJQYXRoICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJKyBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aCgoTWV0aG9kRWxlbWVudCkgb2JqKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChtZXRob2RFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJY29udGVudEVsZW1lbnRQYXRoID0gbGliUGF0aCArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkrIFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKG1ldGhvZEVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQljb250ZW50RWxlbWVudCA9IChDb250ZW50RWxlbWVudCkgbWV0aG9kRWxlbWVudDsKLQkJCQljb250ZW50RWxlbWVudFBhdGggPSBsaWJQYXRoICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCSsgUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgobWV0aG9kRWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5jcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCWZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0JCXRvb2xraXQgPSBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCk7Ci0JCWZvcm0uZ2V0Qm9keSgpLnNldExheW91dChuZXcgVGFibGVXcmFwTGF5b3V0KCkpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBleHBhbmQvY29sbGFwc2UgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgVGhlIGFzc29jaWF0ZWQgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdG9nZ2xlKEh5cGVybGlua0V2ZW50IGV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIGV4cGFuZC9jb2xsYXBzZSBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBUaGUgYXNzb2NpYXRlZCBldmVudC4KLQkgKiBAcGFyYW0gbwotCSAqICAgICAgICAgICAgPz8/Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdG9nZ2xlKEh5cGVybGlua0V2ZW50IGV2ZW50LCBpbnQgbykgewotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWUgZm9yIHRoZSBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIGVkaXRvck5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBlZGl0b3IuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdG9yTmFtZShTdHJpbmcgZWRpdG9yTmFtZSkgewotCQl0aGlzLmVkaXRvck5hbWUgPSBlZGl0b3JOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIE1ldGhvZCBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICBBIFRhYmxlVmlld2VyLgotCSAqIEByZXR1cm4gQSBsaXN0IG9mIE1ldGhvZCBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgTGlzdCByZXRyaWV2ZVRhYmxlVmlld2VyQ29udGVudHMoVGFibGVWaWV3ZXIgdmlld2VyKSB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gKChJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcikgdmlld2VyCi0JCQkJLmdldENvbnRlbnRQcm92aWRlcigpKS5nZXRFbGVtZW50cyh2aWV3ZXIuZ2V0SW5wdXQoKSk7Ci0JCUxpc3QgZWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0JCQllbGVtZW50TGlzdC5hZGQoZWxlbWVudHNbaV0pOwotCQlyZXR1cm4gZWxlbWVudExpc3Q7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNlY3Rpb24gb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBzZWN0aW9uIG5hbWUuCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBUaGUgc2VjdGlvbiBkZXNjcmlwdGlvbi4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihwYXJlbnQsIFNlY3Rpb24uREVTQ1JJUFRJT04KLQkJCQl8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQgfCBTZWN0aW9uLlRJVExFX0JBUik7Ci0JCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCXNlY3Rpb24uc2V0VGV4dCh0aXRsZSk7Ci0vLwkJU3RyaW5nIHRleHQgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChkZXNjcmlwdGlvbiwKLS8vCQkJCW5ldyBTdHJpbmdbXSB7IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0TG93ZXIobWV0aG9kRWxlbWVudCkgfSk7Ci0vLwkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbih0ZXh0KTsKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IGZvciB0aGUgbGFiZWwuCi0JICogQHBhcmFtIGdyaWREYXRhU3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBHcmlkRGF0YSBzdHlsZS4KLQkgKiBAcGFyYW0gaG9yaXpvbnRhbFNwYW4KLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRha2VuIHVwIGJ5IHRoZSBMYWJlbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkxhYmVsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExhYmVsIGNyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgdGV4dCwgaW50IGdyaWREYXRhU3R5bGUsIGludCBob3Jpem9udGFsU3BhbikgewotCQlMYWJlbCBsYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwocGFyZW50LCB0ZXh0LCBTV1QuV1JBUAotCQkJCXwgU1dULkxFRlRfVE9fUklHSFQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkRGF0YVN0eWxlKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuVE9QOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAoaG9yaXpvbnRhbFNwYW4gPT0gMikgPyAxMTUgOiAxMDA7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCBvbiBhIGZvcm0gcGFnZSB3aXRob3V0IHdyYXAgYW5kIG5vIHdpZHRoSGludC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcGFyYW0gZ3JpZERhdGFTdHlsZQotCSAqICAgICAgICAgICAgVGhlIEdyaWREYXRhIHN0eWxlLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIExhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+TGFiZWw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWxXaXRoTm9XcmFwKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgdGV4dCwgaW50IGdyaWREYXRhU3R5bGUsIGludCBob3Jpem9udGFsU3BhbikgewotCQlMYWJlbCBsYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwocGFyZW50LCB0ZXh0LCBTV1QuTEVGVF9UT19SSUdIVCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWREYXRhU3R5bGUpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0JCS8vZ3JpZERhdGEud2lkdGhIaW50ID0gKGhvcml6b250YWxTcGFuID09IDIpID8gMTE1IDogMTAwOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkxhYmVsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExhYmVsIGNyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCB0ZXh0LCBHcmlkRGF0YS5CRUdJTk5JTkcsIDEpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcGFyYW0gaG9yaXpvbnRhbFNwYW4KLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRha2VuIHVwIGJ5IHRoZSBMYWJlbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkxhYmVsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExhYmVsIGNyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgdGV4dCwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCXJldHVybiBjcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIHRleHQsIEdyaWREYXRhLkJFR0lOTklORywKLQkJCQlob3Jpem9udGFsU3Bhbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGJsYW5rIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIExhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+TGFiZWw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTGFiZWwgY3JlYXRlQmxhbmtMYWJlbChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCXJldHVybiBjcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsCi0JCQkJIiIsIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgaG9yaXpvbnRhbFNwYW4pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRleHQgY29udHJvbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBUZXh0IHN0eWxlLgotCSAqIEBwYXJhbSBncmlkRGF0YVN0eWxlCi0JICogICAgICAgICAgICBUaGUgR3JpZERhdGEgc3R5bGUuCi0JICogQHBhcmFtIGhlaWd0aAotCSAqICAgICAgICAgICAgVGhlIGhlaWdodCBvZiB0aGUgY29udHJvbC4KLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiAgICAgICAgICAgIFRoZSB3aWR0aCBvZiB0aGUgdGV4dCBjb250cm9sLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIFRleHQgY29udHJvbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHRFZGl0KEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgc3R5bGUsIGludCBncmlkRGF0YVN0eWxlLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsCi0JCQlpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJVGV4dCBjb250cm9sID0gdG9vbGtpdC5jcmVhdGVUZXh0KHBhcmVudCwgIiIsIHN0eWxlKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkRGF0YVN0eWxlKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGhlaWdodDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzaW5nbGUtbGluZSB0ZXh0IGNvbnRyb2wgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0RWRpdChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuV1JBUCwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIFNXVC5ERUZBVUxULCAxMDAsIDEpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB0ZXh0IGNvbnRyb2wgd2l0aCBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSB0ZXh0U3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBUZXh0IHN0eWxlLgotCSAqIEBwYXJhbSBncmlkRGF0YVN0eWxlCi0JICogICAgICAgICAgICBUaGUgR3JpZERhdGEgc3R5bGUuCi0JICogQHBhcmFtIGhlaWdodAotCSAqICAgICAgICAgICAgVGhlIGhlaWdodCBvZiB0aGUgY29udHJvbC4KLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiAgICAgICAgICAgIFRoZSB3aWR0aCBvZiB0aGUgdGV4dCBjb250cm9sLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIFRleHQgY29udHJvbC4KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCB0ZXh0U3R5bGUsIGludCBncmlkRGF0YVN0eWxlLCBpbnQgaGVpZ2h0LAotCQkJaW50IHdpZHRoLCBpbnQgaG9yaXpvbnRhbFNwYW4sIFN0cmluZyB0ZXh0TGFiZWwpIHsKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCB0ZXh0TGFiZWwpOwotCQlyZXR1cm4gY3JlYXRlVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCB0ZXh0U3R5bGUsIGdyaWREYXRhU3R5bGUsCi0JCQkJaGVpZ2h0LCB3aWR0aCwgaG9yaXpvbnRhbFNwYW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzaW5nbGUtbGluZSB0ZXh0IGNvbnRyb2wgd2l0aCBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCwgMik7Ci0JCXJldHVybiBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkb3VibGUtbGluZSB0ZXh0IGNvbnRyb2wgd2l0aCBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDIoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQpIHsKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCBsYWJlbFRleHQsIDIpOwotCQlyZXR1cm4gY3JlYXRlVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMLCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCwgNDAsIDMwMCwgMSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNpbmdsZSBvciBtdWx0aS1saW5lIHRleHQgY29udHJvbCB3aXRoIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsMyhGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCwgaW50IGhlaWdodCwgaW50IHNpbmdsZU9yTXVsdGkpIHsKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCBsYWJlbFRleHQsIDIpOwotCQlyZXR1cm4gY3JlYXRlVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBzaW5nbGVPck11bHRpIHwgU1dULldSQVAKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwsIGhlaWdodCwKLQkJCQkzMDAsIDIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzaW5nbGUgb3IgbXVsdGktbGluZSB0ZXh0IGNvbnRyb2wgd2l0aCBhIGxhYmVsIGluIGEgY29tcG9zaXRlLgotCSAqIAotCSAqIEBhdXRob3IgaG9wZXNoYXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDQoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQsIGludCBoZWlnaHQsIGludCBzaW5nbGVPck11bHRpLCBTdHJpbmcgZmlsbFRleHQpIHsKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCBsYWJlbFRleHQsIDIpOwotCQkKLQkJaW50IGhvcml6b250YWxTcGFuID0gY2FsY3VsYXRlU3BhbihmaWxsVGV4dCk7Ci0JCQotCQlpZihob3Jpem9udGFsU3Bhbj09MSl7Ci0JCQlUZXh0IHRleHQgPSBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIHNpbmdsZU9yTXVsdGkgfCBTV1QuV1JBUAotCQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMLCBoZWlnaHQsIDIwMCwgMSk7Ci0JCQlUZXh0IHRleHQyID0gY3JlYXRlVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBzaW5nbGVPck11bHRpIHwgU1dULldSQVAKLQkJCQkJfCBTV1QuVl9TQ1JPTEwsIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCwgaGVpZ2h0LCAxMDAsIDEpOwotCQkJdGV4dDIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsCi0JCQkJCSIiLCAxKTsKLQkJCXJldHVybiB0ZXh0OwotCQl9ZWxzZXsKLQkJCXJldHVybiBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIHNpbmdsZU9yTXVsdGkgfCBTV1QuV1JBUAotCQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCwKLQkJCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMLCBoZWlnaHQsCi0JCQkJCTMwMCwgMyk7Ci0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRvdWJsZS1saW5lIHRleHQgY29udHJvbCB3aXRoIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogQGF1dGhvciBob3Blc2hhcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsNShGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCwgMik7Ci0JCXJldHVybiBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5XUkFQCi0JCQkJfCBTV1QuVl9TQ1JPTEwsIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMLCA0MCwgMzAwLCAyKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNpbmdsZSBvciBtdWx0aS1saW5lIHRleHQgY29udHJvbCB3aXRoIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogQGF1dGhvciBob3Blc2hhcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsNShGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCwgaW50IGhlaWdodCwgaW50IHNpbmdsZU9yTXVsdGkpIHsKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCBsYWJlbFRleHQsIDIpOwotCQlyZXR1cm4gY3JlYXRlVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBzaW5nbGVPck11bHRpIHwgU1dULldSQVAKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwsIGhlaWdodCwKLQkJCQkzMDAsIDMpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tYm9ib3ggY29udHJvbCB3aXRoIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQGF1dGhvciBob3Blc2hhcmVkCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgZm9yIHRoZSBMYWJlbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbWJvYm94PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tYm8gY3JlYXRlQ29tYm9XaXRoTGFiZWwzKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCWNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgbGFiZWxUZXh0LCAyKTsKLQkJcmV0dXJuIGNyZWF0ZUNvbWJvKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5GTEFUIHwgU1dULlJFQURfT05MWSB8U1dULlRSQVZFUlNFX1RBQl9ORVhULAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JfQotCQotCS8qKgotCSAqIENhbGN1bGF0ZSB0aGUgdGV4dCdzIGhvcml6b250YWwgc3Bhbi4KLQkgKiAKLQkgKiBAYXV0aG9yIGhvcGVzaGFyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBjYWxjdWxhdGVTcGFuKFN0cmluZyBmaWxsVGV4dCl7Ci0JCWludCBsZW5ndGggPSBmaWxsVGV4dC5sZW5ndGgoKTsKLQotCQlpZihsZW5ndGggPCA2MCkKLQkJCXJldHVybiAxOwotCQlyZXR1cm4gMjsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYXJnZSB0ZXh0IGNvbnRyb2wgd2l0aCBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIDxwPgotCSAqIFVzZWQgZm9yIHRoZSBCcmllZiBEZXNjcmlwdGlvbiBib3guCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsTGFyZ2UoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCk7Ci0JCSgoR3JpZERhdGEpIGxhYmVsLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gU1dULkRFRkFVTFQ7Ci0JCXJldHVybiBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5XUkFQCi0JCQkJfCBTV1QuVl9TQ1JPTEwsIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMLCA4MCwgU1dULkRFRkFVTFQsIDMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgaHlwZXJsaW5rIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIGh5cGVybGluay4KLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiAgICAgICAgICAgIFRoZSBoeXBlcmxpbmsgaW1hZ2UuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5JbWFnZUh5cGVybGluazwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIEltYWdlSHlwZXJsaW5rIGNyZWF0ZUltYWdlSHlwZXJsaW5rKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgSW1hZ2UgaW1hZ2UpIHsKLQkJSW1hZ2VIeXBlcmxpbmsgbGluayA9IHRvb2xraXQuY3JlYXRlSW1hZ2VIeXBlcmxpbmsocGFyZW50LCBTV1QuTEVGVAotCQkJCXwgU1dULlRPUCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKLQkJbGluay5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJbGluay5zZXRJbWFnZShpbWFnZSk7Ci0JCWlmICh0ZXh0ICE9IG51bGwpCi0JCQlsaW5rLnNldFRleHQodGV4dCk7Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgaHlwZXJsaW5rIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBzZWN0aW9uSWQKLQkgKiAgICAgICAgICAgIFRoZSBzY3Rpb24gSUQuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5JbWFnZUh5cGVybGluazwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIEltYWdlSHlwZXJsaW5rIGNyZWF0ZUh5cGVyTGluayhGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIGV4cGFuZGVkQ29tcG9zaXRlLCBpbnQgc2VjdGlvbklEKSB7Ci0JCVNFQ1RJT05fSUQgPSBzZWN0aW9uSUQ7Ci0JCUltYWdlSHlwZXJsaW5rIGV4cGFuZExpbmsgPSB0b29sa2l0LmNyZWF0ZUltYWdlSHlwZXJsaW5rKAotCQkJCWV4cGFuZGVkQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWV4cGFuZExpbmsuc2V0SW1hZ2UoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0VYUEFOREVEKTsKLQkJZXhwYW5kTGluay5zZXRVbmRlcmxpbmVkKGZhbHNlKTsKLQkJZXhwYW5kTGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCXRvZ2dsZShlLCBTRUNUSU9OX0lEKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBleHBhbmRMaW5rOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSByaWNoIHRleHQgY29udHJvbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSByaWNoIHRleHQgc3R5bGUuCi0JICogQHBhcmFtIGhlaWdodAotCSAqICAgICAgICAgICAgVGhlIGhlaWdodCBvZiB0aGUgY29udHJvbC4KLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiAgICAgICAgICAgIFRoZSB3aWR0aCBvZiB0aGUgdGV4dCBjb250cm9sLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIFRleHQgY29udHJvbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPklNZXRob2RSaWNoVGV4dDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBjcmVhdGVSaWNoVGV4dEVkaXQoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgaW50IGdyaWREYXRhU3R5bGUsIGludCBoZWlnaHQsCi0JCQlpbnQgd2lkdGgsIGludCBob3Jpem9udGFsU3BhbiwgRGVjb3JhdGVkRmllbGQgbGFiZWwpIHsKLQkJSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0ID0gTWV0aG9kRm9ybVRvb2xraXQuY3JlYXRlUmljaFRleHQodG9vbGtpdCwKLQkJCQlwYXJlbnQsICIiLCBzdHlsZSwgY29udGVudEVsZW1lbnRQYXRoLCBtZXRob2RFbGVtZW50LCBsYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZERhdGFTdHlsZSk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQlyaWNoVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIHJpY2hUZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSByaWNoIHRleHQgY29udHJvbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPklNZXRob2RSaWNoVGV4dDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBjcmVhdGVSaWNoVGV4dEVkaXQoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZVJpY2hUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5XUkFQCi0JCQkJfCBTV1QuVl9TQ1JPTEwsIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgU1dULkRFRkFVTFQsCi0JCQkJU1dULkRFRkFVTFQsIDEsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIERlY29yYXRlZEZpZWxkIGNyZWF0ZURlY29yYXRlZExhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gY3JlYXRlRGVjb3JhdGVkTGFiZWwodG9vbGtpdCwgcGFyZW50LCB0ZXh0LCBHcmlkRGF0YS5CRUdJTk5JTkcsIDEpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIERlY29yYXRlZEZpZWxkIGNyZWF0ZURlY29yYXRlZExhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgdGV4dCwgaW50IGdyaWREYXRhU3R5bGUsIGludCBob3Jpem9udGFsU3BhbikgewotCQlEZWNvcmF0ZWRGaWVsZCBkZWNvcmF0ZWRMYWJlbCA9IG5ldyBEZWNvcmF0ZWRGaWVsZChwYXJlbnQsIFNXVC5XUkFQIHwgU1dULkxFRlRfVE9fUklHSFQsIGRlY29yYXRlZExhYmVsQ3JlYXRvcik7Ci0JCWRlY29yYXRlZExhYmVsLnNldFVzZU1heGltdW1EZWNvcmF0aW9uV2lkdGgoZmFsc2UpOwotCQlMYWJlbCBsYWJlbCA9IChMYWJlbClkZWNvcmF0ZWRMYWJlbC5nZXRDb250cm9sKCk7Ci0JCS8vIHNldCBjb2xvcnMsIGV0YwotCQl0b29sa2l0LmFkYXB0KGxhYmVsLCBmYWxzZSwgZmFsc2UpOwotCQl0b29sa2l0LmFkYXB0KGRlY29yYXRlZExhYmVsLmdldExheW91dENvbnRyb2woKSwgZmFsc2UsIGZhbHNlKTsKLQkJLy8gc2V0IGxhYmVsIHRleHQKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJLy8gc2V0IGxheW91dCBkYXRhCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWREYXRhU3R5bGUpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IChob3Jpem9udGFsU3BhbiA9PSAyKSA/IDExNSA6IDEwMDsKLQkJZGVjb3JhdGVkTGFiZWwuZ2V0TGF5b3V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gZGVjb3JhdGVkTGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJpY2ggdGV4dCBjb250cm9sIHdpdGggYSBpbWFnZSBoeXBlckxpbmsgYW5kIGxhYmVsIG9uIGEgZm9ybQotCSAqIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcGFyYW0gc2VjdGlvbklkCi0JICogICAgICAgICAgICBUaGUgc2VjdGlvbiBJRC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPklSaWNoTWV0aG9kVGV4dDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGluaygKLQkJCUZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQsCi0JCQlpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGludCBob3Jpem9udGFsU3BhbikgewotCQlJbWFnZUh5cGVybGluayBsaW5rID0gY3JlYXRlSW1hZ2VIeXBlcmxpbmsodG9vbGtpdCwgcGFyZW50LCBudWxsLAotCQkJCUF1dGhvcmluZ1VJSW1hZ2VzLklNR19DT0xMQVBTRUQpOwotCQlsaW5rLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLm9wZW5SVEUpOwotCQkvLyBjcmVhdGUgRGVjb3JhdGVkRmllbGQgaGVyZSBmb3IgbWFya2VycwotCQlEZWNvcmF0ZWRGaWVsZCBkZWNvcmF0ZWRMYWJlbCA9IGNyZWF0ZURlY29yYXRlZExhYmVsKHRvb2xraXQsIHBhcmVudCwgbGFiZWxUZXh0KTsKLQotCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGNyZWF0ZVJpY2hUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSQotCQkJCXwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwsIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgaGVpZ2h0LAotCQkJCXdpZHRoLCBob3Jpem9udGFsU3BhbiwgZGVjb3JhdGVkTGFiZWwpOwotCi0JCWxpbmsuc2V0SHJlZihjb250cm9sKTsKLQkJbGluay5zZXREYXRhKCJUaXRsZSIsIGxhYmVsVGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJbGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCXRvZ2dsZShlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmljaCB0ZXh0IGNvbnRyb2wgd2l0aCBhIGltYWdlIGh5cGVyTGluayBhbmQgbGFiZWwgb24gYSBmb3JtCi0JICogcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEBwYXJhbSBzZWN0aW9uSWQKLQkgKiAgICAgICAgICAgIFRoZSBzZWN0aW9uIElELgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SVJpY2hNZXRob2RUZXh0PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCUZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQsCi0JCQlpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGludCBzZWN0aW9uSUQpIHsKLQkJZmluYWwgaW50IFNFQ1RJT05fSUQgPSBzZWN0aW9uSUQ7Ci0JCUltYWdlSHlwZXJsaW5rIGxpbmsgPSBjcmVhdGVJbWFnZUh5cGVybGluayh0b29sa2l0LCBwYXJlbnQsIG51bGwsCi0JCQkJQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0NPTExBUFNFRCk7Ci0JCWxpbmsuc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMub3BlblJURSk7Ci0JCS8vIGNyZWF0ZSBEZWNvcmF0ZWRGaWVsZCBoZXJlIGZvciBtYXJrZXJzCi0JCURlY29yYXRlZEZpZWxkIGRlY29yYXRlZExhYmVsID0gY3JlYXRlRGVjb3JhdGVkTGFiZWwodG9vbGtpdCwgcGFyZW50LCBsYWJlbFRleHQpOwotCi0JCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gY3JlYXRlUmljaFRleHRFZGl0KHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJCi0JCQkJfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCBoZWlnaHQsCi0JCQkJd2lkdGgsIDEsIGRlY29yYXRlZExhYmVsKTsKLQotCQlsaW5rLnNldEhyZWYoY29udHJvbCk7Ci0JCWxpbmsuc2V0RGF0YSgiVGl0bGUiLCBsYWJlbFRleHQpOyAvLyROT04tTkxTLTEkCi0JCWxpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQl0b2dnbGUoZSwgU0VDVElPTl9JRCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBjb250cm9sOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSByaWNoIHRleHQgZWRpdG9yIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIHJpY2ggdGV4dCBzdHlsZS4KLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICogICAgICAgICAgICBUaGUgaGVpZ2h0IG9mIHRoZSBjb250cm9sLgotCSAqIEBwYXJhbSB3aWR0aAotCSAqICAgICAgICAgICAgVGhlIHdpZHRoIG9mIHRoZSB0ZXh0IGNvbnRyb2wuCi0JICogQHBhcmFtIGhvcml6b250YWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0YWtlbiB1cCBieSB0aGUgVGV4dCBjb250cm9sLgotCSAqIEByZXR1cm4gVGhlIG5ldyA8Y29kZT5JTWV0aG9kUmljaFRleHRFZGl0b3I8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHRFZGl0b3IgY3JlYXRlUmljaFRleHRFZGl0b3IoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgaW50IGdyaWREYXRhU3R5bGUsIGludCBoZWlnaHQsCi0JCQlpbnQgd2lkdGgsIGludCBob3Jpem9udGFsU3BhbiwgRGVjb3JhdGVkRmllbGQgbGFiZWwpIHsKLQkJSU1ldGhvZFJpY2hUZXh0RWRpdG9yIGVkaXRvciA9IE1ldGhvZEZvcm1Ub29sa2l0LmNyZWF0ZVJpY2hUZXh0RWRpdG9yKAotCQkJCXRvb2xraXQsIHBhcmVudCwgIiIsIHN0eWxlLCBjb250ZW50RWxlbWVudFBhdGgsIG1ldGhvZEVsZW1lbnQsIGxhYmVsLCBnZXRFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWREYXRhU3R5bGUpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJZWRpdG9yLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gZWRpdG9yOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21ib2JveCBjb250cm9sIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIENvbWJvYm94IHN0eWxlLgotCSAqIEBwYXJhbSBncmlkRGF0YVN0eWxlCi0JICogICAgICAgICAgICBUaGUgR3JpZERhdGEgc3R5bGUuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21ib2JveDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIENvbWJvIGNyZWF0ZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgaW50IGdyaWREYXRhU3R5bGUpIHsKLQkJQ29tYm8gY29udHJvbCA9IG5ldyBDb21ibyhwYXJlbnQsIHN0eWxlKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbWJvYm94IGNvbnRyb2wgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21ib2JveDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIENvbWJvIGNyZWF0ZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbWJvKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5GTEFUIHwgU1dULlJFQURfT05MWSwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21ib2JveCBjb250cm9sIHdpdGggYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIExhYmVsLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIENvbWJvYm94IHN0eWxlLgotCSAqIEBwYXJhbSBncmlkRGF0YVN0eWxlCi0JICogICAgICAgICAgICBUaGUgR3JpZERhdGEgc3R5bGUuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21ib2JveDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIENvbWJvIGNyZWF0ZUNDb21ib1dpdGhMYWJlbChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHRMYWJlbCwgaW50IHN0eWxlLCBpbnQgZ3JpZERhdGFTdHlsZSkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIHRleHRMYWJlbCk7Ci0JCXJldHVybiBjcmVhdGVDb21ibyhwYXJlbnQsIHN0eWxlLCBncmlkRGF0YVN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tYm9ib3ggY29udHJvbCB3aXRoIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgZm9yIHRoZSBMYWJlbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbWJvYm94PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tYm8gY3JlYXRlQ29tYm9XaXRoTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBsYWJlbFRleHQpIHsKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCBsYWJlbFRleHQpOwotCQlyZXR1cm4gY3JlYXRlQ29tYm8ocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkZMQVQgfCBTV1QuUkVBRF9PTkxZLAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbXBvc2l0ZSBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gc2VjdGlvbgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBzZWN0aW9uLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKi8KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKEZvcm1Ub29sa2l0IHRvb2xraXQsIFNlY3Rpb24gc2VjdGlvbikgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlzZWN0aW9uLnNldENsaWVudChjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21wb3NpdGUgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIGdyaWREYXRhU3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBHcmlkRGF0YSBzdHlsZS4KLQkgKiBAcGFyYW0gdmVydGljYWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJvdyBjZWxscyB0YWtlbiB1cCBieSB0aGUgQ29tcG9zaXRlLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIENvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbnVtQ29sdW1ucwotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBncmlkLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCBncmlkRGF0YVN0eWxlLCBpbnQgdmVydGljYWxTcGFuLAotCQkJaW50IGhvcml6b250YWxTcGFuLCBpbnQgbnVtQ29sdW1ucykgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWREYXRhU3R5bGUpOwotCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSB2ZXJ0aWNhbFNwYW47Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dChudW1Db2x1bW5zLCBmYWxzZSkpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21wb3NpdGUgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHZlcnRpY2FsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiByb3cgY2VsbHMgdGFrZW4gdXAgYnkgdGhlIENvbXBvc2l0ZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgdmVydGljYWxTcGFuKSB7Ci0JCXJldHVybiBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgcGFyZW50LCBHcmlkRGF0YS5GSUxMX0JPVEgsCi0JCQkJdmVydGljYWxTcGFuLCAxLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tcG9zaXRlIGZvciBkaXNwbGF5aW5nIGJ1dHRvbnMgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIFRoZSBDb21wb3NpdGUgdHlwZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlRm9yQnV0dG9ucyhGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHBhcmVudCwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUiwgU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZXhwYW5kZWQgY29tcG9zaXRlIGluIHRoZSBmb3JtCi0JICogPHA+Ci0JICogVXNlZCB0byBob2xkIGFuIGV4cGFuZGVkIHJpY2ggdGV4dCBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlRXhwYW5kZWRDb21wb3NpdGUoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGV4cGFuZGVkQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWV4cGFuZGVkQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCXJldHVybiBleHBhbmRlZENvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdGFibGUgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgVGFibGUgc3R5bGUuCi0JICogQHBhcmFtIGdyaWREYXRhU3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBHcmlkRGF0YSBzdHlsZS4KLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICogICAgICAgICAgICBUaGUgaGVpZ2h0IG9mIHRoZSBUYWJsZS4KLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiAgICAgICAgICAgIFRoZSB3aWR0aCBvZiB0aGUgVGFibGUuCi0JICogQHBhcmFtIHZlcnRpY2FsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiByb3cgY2VsbHMgdGFrZW4gdXAgYnkgdGhlIFRhYmxlLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIFRhYmxlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+VGFibGU8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGFibGUgY3JlYXRlVGFibGUoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBzdHlsZSwgaW50IGdyaWREYXRhU3R5bGUsIGludCBoZWlnaHQsIGludCB3aWR0aCwKLQkJCWludCB2ZXJ0aWNhbFNwYW4sIGludCBob3Jpem9udGFsU3BhbikgewotCQlUYWJsZSB0YWJsZSA9IHRvb2xraXQuY3JlYXRlVGFibGUocGFyZW50LCBzdHlsZSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWREYXRhU3R5bGUpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLQkJZ3JpZERhdGEudmVydGljYWxTcGFuID0gdmVydGljYWxTcGFuOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB0YWJsZSBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgVGhlIHRhYmxlIHRhYmxlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+VGFibGU8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGFibGUgY3JlYXRlVGFibGUoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCB0eXBlKSB7Ci0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIFNNQUxMX1NJWkU6Ci0JCQlyZXR1cm4gY3JlYXRlVGFibGUodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEksIEdyaWREYXRhLkZJTExfQk9USCwKLQkJCQkJNTYsIDIwMCwgMSwgMSk7Ci0JCWNhc2UgTUVESVVNX1NJWkU6Ci0JCQlyZXR1cm4gY3JlYXRlVGFibGUodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEksIEdyaWREYXRhLkZJTExfQk9USCwKLQkJCQkJMTEyLCAyMDAsIDEsIDEpOwotCQljYXNlIExBUkdFX1NJWkU6Ci0JCQlyZXR1cm4gY3JlYXRlVGFibGUodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEksIEdyaWREYXRhLkZJTExfQk9USCwKLQkJCQkJMjAwLCAyMDAsIDEsIDEpOwotCQljYXNlIFNJTkdMRV9ST1c6Ci0JCQlyZXR1cm4gY3JlYXRlVGFibGUodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEksCi0JCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgMjAsIDIwMCwgMSwgMSk7Ci0JCWRlZmF1bHQ6Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgYnV0dG9uIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICBUaGUgYnV0dG9uIHR5cGUuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5CdXR0b248L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHR5cGUpIHsKLQkJQnV0dG9uIGJ1dHRvbjsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgQUREX0JVVFRPTjoKLQkJCWJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0LkFERF9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUkVNT1ZFX0JVVFRPTjoKLQkJCWJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0LlJFTU9WRV9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVVBfQlVUVE9OOgotCQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlBdXRob3JpbmdVSVRleHQuVVBfQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJCWJyZWFrOwotCQljYXNlIERPV05fQlVUVE9OOgotCQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlBdXRob3JpbmdVSVRleHQuRE9XTl9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1JERVJfQlVUVE9OOgotCQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlBdXRob3JpbmdVSVRleHQuT1JERVJfQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJCWJyZWFrOwotCQljYXNlIFNFTEVDVF9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5TRUxFQ1RfQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJCWJyZWFrOwotCQljYXNlIENMRUFSX0JVVFRPTjoKLQkJCWJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0LkNMRUFSX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCQlicmVhazsKLQkJY2FzZSBBVFRBQ0hfQlVUVE9OOgotCQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlBdXRob3JpbmdVSVRleHQuQVRUQUNIX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCQlicmVhazsKLQkJY2FzZSBERVRBQ0hfQlVUVE9OOgotCQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlBdXRob3JpbmdVSVRleHQuREVUQUNIX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGhlaWdodCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcmV0dXJuCi0JICogCQlIZWlnaHQgb2YgdGhlIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIGludCBnZXRSaWNoVGV4dEVkaXRvckhlaWdodCgpIHsKLQkJcmV0dXJuIGZvcm0uZ2V0Qm91bmRzKCkuaGVpZ2h0IC0gMyAqIDMyOwotCX0KLQotCS8qKgotCSAqIEdldCB3aWR0aCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcmV0dXJuCi0JICogCQlXaWR0aCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKSB7Ci0JCWludCB3aWR0aCA9IDg0MDsKLQkJaW50IGxhc3RXaWR0aCA9IFJpY2hUZXh0VG9vbEJhci5nZXRMYXN0V2lkdGgoKTsKLQkJaWYgKGxhc3RXaWR0aCAhPSAtMSkgewotCQkJd2lkdGggPSBsYXN0V2lkdGg7Ci0JCX0KLQkJcmV0dXJuIE1hdGgubWF4KHdpZHRoLCBmb3JtLmdldEJvdW5kcygpLndpZHRoIC0gMiAqIDMyKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NhdGVnb3J5R3VpZGFuY2VQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ2F0ZWdvcnlHdWlkYW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmU5OWYwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ2F0ZWdvcnlHdWlkYW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5HdWlkYW5jZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgR3VpZGFuY2UgcGFnZSBpbiB0aGUgY29udGVudCBlbGVtZW50IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqIFRPRE8gLSBjaGFuZ2UgbmFtZSBvZiBjbGFzcyB0byBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZQotICovCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcnlHdWlkYW5jZVBhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAiY2F0ZWdvcnlHdWlkYW5jZXNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ2F0ZWdvcnlHdWlkYW5jZVBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5HVUlEQU5DRV9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQkJc2V0QWxsb3dDaGFuZ2UyKHRydWUpOwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCUxpc3QgbGlzdCA9IE1ldGhvZEVsZW1lbnRVdGlsCi0JCQkJCQkuZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoY29udGVudEVsZW1lbnQpOwotCQkJCUxpc3QgbG9jYWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJCQlpZiAoIShvYmogaW5zdGFuY2VvZiBQcmFjdGljZQotCQkJCQkJCXx8IChvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yICYmIGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVG9vbCkgfHwgb2JqCi0JCQkJCQkJLmVxdWFscyhjb250ZW50RWxlbWVudAotCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkpKSB7Ci0JCQkJCQlsb2NhbC5hZGQob2JqKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gbG9jYWwudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBHdWlkYW5jZSBmb3IgY29udGVudCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJCQkJCQkoQ2hlY2tsaXN0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksCi0JCQkJCQkJKENvbmNlcHQpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJCQkJKEV4YW1wbGUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJKEd1aWRlbGluZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksCi0JCQkJCQkJKFJldXNhYmxlQXNzZXQpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkiVW5hYmxlIHRvIGFkZCBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJInRvICIKLQkJCQkJCQkJCQkJKyBjb250ZW50RWxlbWVudC5nZXRUeXBlKCkKLQkJCQkJCQkJCQkJCQkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkJCSsgIjoiICsgY29udGVudEVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gR3VpZGFuY2UgZm9yIHRoZSBtZXRob2QgZWxlbWVudC4KLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLAotCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJCQkJCShDb25jZXB0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCShFeGFtcGxlKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCQkJCShTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCQkJCQkJCShHdWlkZWxpbmUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCShSZXVzYWJsZUFzc2V0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJIlVuYWJsZSB0byByZW1vdmUgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSJmcm9tICIKLQkJCQkJCQkJCQkJKyBjb250ZW50RWxlbWVudC5nZXRUeXBlKCkKLQkJCQkJCQkJCQkJCQkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkJCSsgIjoiICsgY29udGVudEVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgR3VpZGFuY2VGaWx0ZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9DaGVja2xpc3RJdGVtc1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9DaGVja2xpc3RJdGVtc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTA2NWMzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ2hlY2tsaXN0SXRlbXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLlNlY3Rpb25zT3JkZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5FZGl0b3JzQ29udGV4dEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkFkZFRvU2VjdGlvbkxpc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5SZW1vdmVGcm9tU2VjdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlNlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5EZWNvcmF0ZWRGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5JbWFnZUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0KLS8qKgotICogVGhlIENoZWNrIEl0ZW0gcGFnZSBpbiB0aGUgQ2hlY2tsaXN0IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGVja2xpc3RJdGVtc1BhZ2UgZXh0ZW5kcyBCYXNlRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJjaGVja2xpc3RDaGVja0l0ZW1zUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVGV4dCBjdHJsX25hbWU7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZCwgY3RybF9kZWxldGUsIGN0cmxfdXAsIGN0cmxfZG93biwgY3RybF9vcmRlcjsKLQotCXByaXZhdGUgVGFibGUgY3RybF9jaGVja0l0ZW1zOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBjaGVja0l0ZW1zVGFibGVWaWV3ZXI7Ci0KLQlwcml2YXRlIFNlY3Rpb25MaXN0IGFsbGNoZWNrSXRlbXM7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBhY3RpdmVDb250cm9sOwotCi0JcHJpdmF0ZSBib29sZWFuIGRlc2NFeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dEVkaXRvciBjdHJsX2V4cGFuZGVkOwotCi0JcHJpdmF0ZSBJbWFnZUh5cGVybGluayBleHBhbmRMaW5rOwotCi0JcHJpdmF0ZSBEZWNvcmF0ZWRGaWVsZCBleHBhbmRMYWJlbDsKLQotCXByb3RlY3RlZCBTZWN0aW9uIGZvcm1TZWN0aW9uOwotCXByaXZhdGUgU2VjdGlvbiBnZW5lcmFsU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgc2VjdGlvbkNvbXBvc2l0ZTsKLQlwcml2YXRlIENvbXBvc2l0ZSBnZW5lcmFsQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgZXhwYW5kZWRDb21wb3NpdGU7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX21haW5kZXNjOwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjaGVja0l0ZW1zVmlld2VyQ29udGVudFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBjaGVja0l0ZW1zVmlld2VyTGFiZWxQcm92aWRlcjsKLQotCXByaXZhdGUgQ2hlY2tsaXN0IGNoZWNrbGlzdDsKLQotCXByaXZhdGUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uIGN1cnJlbnRJdGVtOwotCi0JcHJpdmF0ZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpYkxpc3RlbmVyID0gbnVsbDsKLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgY29udGVudE1vZGlmeUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDaGVja2xpc3RJdGVtc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5DSEVDS19JVEVNU19URVhUKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQmFzZUZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IG1ldGhvZEVsZW1lbnRJbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0OwotCQljaGVja2xpc3QgPSAoQ2hlY2tsaXN0KSBtZXRob2RFbGVtZW50SW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBmb3JtIGNvbnRlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJc3VwZXIuY3JlYXRlRm9ybUNvbnRlbnQobWFuYWdlZEZvcm0pOwotCi0JCVN0cmluZyBlbGVtZW50TGFiZWwgPSBMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dChtZXRob2RFbGVtZW50KTsKLQkJZm9ybS5zZXRUZXh0KExpYnJhcnlVSVRleHQuVEVYVF9HVUlEQU5DRQotCQkJCSsgIiAoIiArIGVsZW1lbnRMYWJlbCArICIpOiAiICsgbWV0aG9kRWxlbWVudC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCi0JCWZvcm1TZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGZvcm0uZ2V0Qm9keSgpLCBTZWN0aW9uLk5PX1RJVExFKTsKLQkJewotCQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJCWZvcm1TZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQkJZm9ybVNlY3Rpb24uc2V0TGF5b3V0KG5ldyBUYWJsZVdyYXBMYXlvdXQoKSk7Ci0JCX0KLQkJLy8gQ3JlYXRlIHRoZSBjb21wb3NpdGUgZm9yIHRoZSBzZWN0aW9ucy4KLQkJc2VjdGlvbkNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGZvcm1TZWN0aW9uLCBTV1QuTk9ORSk7Ci0JCXNlY3Rpb25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQlzZWN0aW9uQ29tcG9zaXRlLnNldExheW91dChuZXcgVGFibGVXcmFwTGF5b3V0KCkpOwotCQlmb3JtU2VjdGlvbi5zZXRDbGllbnQoc2VjdGlvbkNvbXBvc2l0ZSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBHZW5lcmFsIEluZm9ybWF0aW9uIHNlY3Rpb24uCi0JCWdlbmVyYWxTZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJU2VjdGlvbi5USVRMRV9CQVIgfCBTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFCi0JCQkJCQl8IFNlY3Rpb24uRVhQQU5ERUQpOwotCQlnZW5lcmFsU2VjdGlvbgotCQkJCS5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKSk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkNIRUNLX0lURU1TX1NFQ1RJT05fTkFNRSk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJVGV4dC5DSEVDS19JVEVNU19TRUNUSU9OX0RFU0MpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJZ2VuZXJhbENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxTZWN0aW9uKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoNCwgZmFsc2UpKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0Q2xpZW50KGdlbmVyYWxDb21wb3NpdGUpOwotCi0JCUVkaXRvcnNDb250ZXh0SGVscGVyLnNldEhlbHAoZ2VuZXJhbENvbXBvc2l0ZS5nZXRQYXJlbnQoKSwgY2hlY2tsaXN0KTsKLQotCQlDb21wb3NpdGUgcGFuZTEgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShnZW5lcmFsQ29tcG9zaXRlKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDE7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQlwYW5lMS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCXBhbmUxLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJfQotCi0JCUxhYmVsIGxfbmFtZSA9IHRvb2xraXQuY3JlYXRlTGFiZWwocGFuZTEsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkNIRUNLX0lURU1TX1RFWFQpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJbF9uYW1lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9jaGVja0l0ZW1zID0gdG9vbGtpdC5jcmVhdGVUYWJsZShwYW5lMSwgU1dULk1VTFRJKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSAxNTA7Ci0JCQljdHJsX2NoZWNrSXRlbXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlpbml0UHJvdmlkZXJzKCk7Ci0KLQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfY2hlY2tJdGVtcyk7Ci0JCWNoZWNrSXRlbXNUYWJsZVZpZXdlcgotCQkJCS5zZXRDb250ZW50UHJvdmlkZXIoY2hlY2tJdGVtc1ZpZXdlckNvbnRlbnRQcm92aWRlcik7Ci0JCWNoZWNrSXRlbXNUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGNoZWNrSXRlbXNWaWV3ZXJMYWJlbFByb3ZpZGVyKTsKLQotCQlDb21wb3NpdGUgcGFuZTIgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShnZW5lcmFsQ29tcG9zaXRlKTsKLQkJcGFuZTIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUikpOwotCQlwYW5lMi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJY3RybF9hZGQgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYW5lMiwgQXV0aG9yaW5nVUlUZXh0LkFERF9CVVRUT05fVEVYVCwKLQkJCQlTV1QuTk9ORSk7Ci0JCWN0cmxfYWRkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWN0cmxfZGVsZXRlID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFuZTIsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRFTEVURV9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQljdHJsX2RlbGV0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJY3RybF9kZWxldGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJY3RybF91cCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhbmUyLCBBdXRob3JpbmdVSVRleHQuVVBfQlVUVE9OX1RFWFQsCi0JCQkJU1dULk5PTkUpOwotCQljdHJsX3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWN0cmxfZG93biA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhbmUyLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ET1dOX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCWN0cmxfZG93bi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWN0cmxfb3JkZXIgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYW5lMiwKLQkJCQlBdXRob3JpbmdVSVRleHQuT1JERVJfQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJY3RybF9vcmRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkvLyBuYW1lCi0JCUxhYmVsIG5hbWVMYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuTkFNRV9URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gNDsKLQkJCW5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljdHJsX25hbWUgPSB0b29sa2l0LmNyZWF0ZVRleHQoZ2VuZXJhbENvbXBvc2l0ZSwgIiIsIFNXVC5TSU5HTEUpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0JCQljdHJsX25hbWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljcmVhdGVCbGFua0xhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIDQpOwotCQkKLQkJY3RybF9tYWluZGVzYyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rKAotCQkJCXRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9URVhULAotCQkJCTI1MCwgMzAwLCA0KTsKLQotCQljcmVhdGVSaWNoVGV4dEVkaXRvclNlY3Rpb24oKTsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUyKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGV4cGFuZGVkQ29tcG9zaXRlKTsKLQotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0JCWxvYWREYXRhKCk7Ci0JCWVuYWJsZUNvbnRyb2xzKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpYnJhcnkgYW5kIHNlbGVjdGlvbiBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJZmluYWwgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0JCWNvbnRlbnRNb2RpZnlMaXN0ZW5lciA9IGVkaXRvci5jcmVhdGVNb2RpZnlMaXN0ZW5lcihjdXJyZW50SXRlbSk7Ci0JCWN0cmxfbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQotCQlmb3JtLmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotLy8JCQkJSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdCgoRU9iamVjdCkgY2hlY2tsaXN0LAotLy8JCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0vLwkJCQlpZiAoc3RhdHVzLmlzT0soKSkgewotLy8JCQkJCWxvYWREYXRhKCk7Ci0vLwkJCQl9Ci0JCQkJbG9hZERhdGEoKTsKLQkJCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJZW5hYmxlQ29udHJvbHMoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCWNoZWNrU2VsZWN0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmb3JtLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZGVhY3RpdmF0ZSgpOwotCQkJfQotCQl9KTsKLQotCQlmb3JtLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlpZiAoY3RybF9leHBhbmRlZCAhPSBudWxsKSB7Ci0JCQkJCSgoR3JpZERhdGEpIGN0cmxfZXhwYW5kZWQuZ2V0TGF5b3V0RGF0YSgpKS5oZWlnaHRIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JIZWlnaHQoKTsKLQkJCQkJKChHcmlkRGF0YSkgY3RybF9leHBhbmRlZC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKTsKLQkJCQl9Ci0JCQkJZm9ybVNlY3Rpb24ubGF5b3V0KHRydWUsIHRydWUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjb250cm9sTW92ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJaWYgKGN1cnJlbnRJdGVtICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZE5hbWUgPSBjdXJyZW50SXRlbS5nZXROYW1lKCk7Ci0JCQkJCVN0cmluZyBuZXdOYW1lID0gY3RybF9uYW1lLmdldFRleHQoKTsKLQkJCQkJLy9uZXdOYW1lID0gU3RyVXRpbC5tYWtlVmFsaWRGaWxlTmFtZShuZXdOYW1lKTsKLQkJCQkJaWYgKGN0cmxfbmFtZS5nZXRUZXh0KCkgPT0gbnVsbAotCQkJCQkJCXx8IGN0cmxfbmFtZS5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVEaWFsb2dfdGl0bGUsIExpYnJhcnlVSVRleHQuVEVYVF9DSEVDS19JVEVNKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZywgU3RyVXRpbC50b0xvd2VyKExpYnJhcnlVSVRleHQuVEVYVF9DSEVDS19JVEVNKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChvbGROYW1lICE9IG51bGwgJiYgb2xkTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZyk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWdldEVkaXRvclNpdGUoKQotCQkJCQkJCQkJLmdldEFjdGlvbkJhcnMoKQotCQkJCQkJCQkJLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkKLQkJCQkJCQkJCS5zZXRFcnJvck1lc3NhZ2UoCi0JCQkJCQkJCQkJCVBsYXRmb3JtVUkKLQkJCQkJCQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCQkJCQkJCQkuZ2V0U2hhcmVkSW1hZ2VzKCkKLQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoCi0JCQkJCQkJCQkJCQkJCQlJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0VSUk9SX1RTSyksCi0JCQkJCQkJCQkJCW1zZyk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoIW9sZE5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJY3VycmVudEl0ZW0sCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCQkJCQkJCW5ld05hbWUsIC0xKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9tYWluZGVzYy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX21haW5kZXNjLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJc2F2ZU1haW5EZXNjcmlwdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQljaGVja0l0ZW1zVGFibGVWaWV3ZXIKLQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJY2hlY2tTZWxlY3Rpb24oKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCWN0cmxfYWRkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiBjaGlsZCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlU2VjdGlvbigpOwotCQkJCVN0cmluZyBuZXdOYW1lID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQlBdXRob3JpbmdVSVRleHQuTkVXX0VMRU1FTlRfVEVYVCwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7IExpYnJhcnlVSVRleHQuVEVYVF9DSEVDS19JVEVNIH0pOwotCQkJCWNoaWxkLnNldE5hbWUobmV3TmFtZSk7Ci0JCQkJQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQgY21kID0gbmV3IEFkZFRvU2VjdGlvbkxpc3RDb21tYW5kKAotCQkJCQkJY2hlY2tsaXN0LCBjaGlsZCwgYWxsY2hlY2tJdGVtcyk7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCQljaGVja0l0ZW1zVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCWNoZWNrSXRlbXNUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQljaGlsZCkpOwotCQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJCWN0cmxfbmFtZS5zZXRTZWxlY3Rpb24oMCwgbmV3TmFtZS5sZW5ndGgoKSk7Ci0JCQkJZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpCi0JCQkJCQkuc2V0RXJyb3JNZXNzYWdlKCIiKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9kZWxldGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpCi0JCQkJCQkuc2V0RXJyb3JNZXNzYWdlKCIiKTsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNoZWNrSXRlbXNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi50b0xpc3QoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbikgewotCQkJCQkJUmVtb3ZlRnJvbVNlY3Rpb25MaXN0IGNtZCA9IG5ldyBSZW1vdmVGcm9tU2VjdGlvbkxpc3QoCi0JCQkJCQkJCWNoZWNrbGlzdCwgKG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbikgbywKLQkJCQkJCQkJYWxsY2hlY2tJdGVtcyk7Ci0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNoZWNrSXRlbXNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJZWRpdEl0ZW0obnVsbCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfdXAuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjaGVja0l0ZW1zVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQotCQkJCUFycmF5TGlzdCBtb3ZlVXBJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlVXBJdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQlNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQgY21kID0gbmV3IE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCgKLQkJCQkJCWNoZWNrbGlzdCwgbW92ZVVwSXRlbXMsIGFsbGNoZWNrSXRlbXMsIDEpOwotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0KLQkJCQljaGVja0l0ZW1zVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKGNoZWNrSXRlbXNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjaGVja2xpc3QpKSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQlpZiAoY2hlY2tJdGVtc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IGNoZWNrSXRlbXNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjaGVja2xpc3QpKSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZG93bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNoZWNrSXRlbXNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCUFycmF5TGlzdCBtb3ZlRG93bkl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vdmVEb3duSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQoCi0JCQkJCQljaGVja2xpc3QsIG1vdmVEb3duSXRlbXMsIGFsbGNoZWNrSXRlbXMsIDApOwotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0KLQkJCQljaGVja0l0ZW1zVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKGNoZWNrSXRlbXNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjaGVja2xpc3QpKSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQlpZiAoY2hlY2tJdGVtc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IGNoZWNrSXRlbXNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjaGVja2xpc3QpKSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfb3JkZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU2VjdGlvbnNPcmRlckRpYWxvZyBkbGcgPSBuZXcgU2VjdGlvbnNPcmRlckRpYWxvZygKLQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCQljaGVja2xpc3QsCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5DaGVja2xpc3RPcmRlcl90aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ2hlY2tsaXN0T3JkZXJfZGVzY3JpcHRpb24sIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNoZWNrbGlzdE9yZGVyX2NoZWNrbGlzdGl0ZW1zX3RleHQpOyAvLyROT04tTkxTLTEkCi0JCQkJZGxnLm9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlQ29udHJvbHMoYm9vbGVhbiBlZGl0YWJsZSkgewotCQljdHJsX25hbWUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX21haW5kZXNjLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9hZGQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfZGVsZXRlLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljdHJsX3VwLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljdHJsX2Rvd24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfb3JkZXIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJaWYgKGN0cmxfZXhwYW5kZWQgIT0gbnVsbCkgewotCQkJY3RybF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCS8vIFNhdmUgdGhlIEl0ZW0gb3JkZXIuCi0JCWlmIChhbGxjaGVja0l0ZW1zICE9IG51bGwpIHsKLQkJCWFsbGNoZWNrSXRlbXMuYXBwbHkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBjb250cm9scyB3aXRoIGRhdGEgZnJvbSB0aGUgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotCQlhbGxjaGVja0l0ZW1zID0gbnVsbDsKLQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyLnNldElucHV0KGNoZWNrbGlzdCk7Ci0JCWNoZWNrSXRlbXNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCWVkaXRJdGVtKGN1cnJlbnRJdGVtKTsKLQl9Ci0KLQkvKioKLQkgKiBFZGl0IGN1cnJlbnQgSXRlbS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZWRpdEl0ZW0ob3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uIGl0ZW0pIHsKLQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0KLQkJaWYgKGN0cmxfbWFpbmRlc2MuZ2V0TW9kaWZpZWQoKSkgewotCQkJc2F2ZU1haW5EZXNjcmlwdGlvbigpOwotCQl9Ci0KLQkJY3VycmVudEl0ZW0gPSBpdGVtOwotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGN1cnJlbnRJdGVtICE9IG51bGwpIHsKLQkJCW5hbWUgPSBjdXJyZW50SXRlbS5nZXROYW1lKCk7Ci0JCQlkZXNjID0gY3VycmVudEl0ZW0uZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCk7Ci0JCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKQotCQkJCQkuc2V0RXJyb3JNZXNzYWdlKCIiKTsKLQkJfQotCQljdHJsX25hbWUuc2V0VGV4dChuYW1lID09IG51bGwgPyAiIiA6IG5hbWUpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfbWFpbmRlc2Muc2V0VGV4dChkZXNjID09IG51bGwgPyAiIiA6IGRlc2MpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfbWFpbmRlc2Muc2V0TW9kYWxPYmplY3QoY3VycmVudEl0ZW0pOwotCQljdHJsX21haW5kZXNjLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRTZWN0aW9uX1NlY3Rpb25EZXNjcmlwdGlvbigpKTsKLQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJLy8gY2xvc2UgYW55IEZpbmQvUmVwbGFjZSBkaWFsb2cgb3BlbiBpbiB0aGUgUlRFCi0JCQljdHJsX21haW5kZXNjLmdldEZpbmRSZXBsYWNlQWN0aW9uKCkuZGlzcG9zZSgpOwotCQl9Ci0KLQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJLnNldEVsZW1lbnQoY3VycmVudEl0ZW0pOwotCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkuc2V0RGlzYWJsZShjdXJyZW50SXRlbSA9PSBudWxsKTsKLQotCQllbmFibGVDb250cm9scygpOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZSBuYW1lIGFuZCBkZXNjcmlwdGlvbiBjb250cm9scwotCSAqLwotCXByaXZhdGUgdm9pZCBlbmFibGVDb250cm9scygpIHsKLQkJaWYgKGNoZWNrbGlzdC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmNvbnRhaW5zKGN1cnJlbnRJdGVtKSkgewotCQkJaWYgKCFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCWN0cmxfbmFtZS5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJCQljdHJsX21haW5kZXNjLnNldEVkaXRhYmxlKHRydWUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJY3RybF9uYW1lLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCWN0cmxfbWFpbmRlc2Muc2V0RWRpdGFibGUoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZSBsaXN0ZW5lcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChsaWJMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5yZW1vdmVMaXN0ZW5lcihsaWJMaXN0ZW5lcik7Ci0JCQl9Ci0JCQlsaWJMaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlUmljaFRleHRFZGl0b3JTZWN0aW9uKCkgewotCQlleHBhbmRlZENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGZvcm1TZWN0aW9uLCBTV1QuTk9ORSk7Ci0JCWV4cGFuZGVkQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCi0JCS8vIEh5cGVybGluayBkZXNjCi0JCWV4cGFuZExpbmsgPSB0b29sa2l0LmNyZWF0ZUltYWdlSHlwZXJsaW5rKGV4cGFuZGVkQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWV4cGFuZExpbmsuc2V0SW1hZ2UoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0VYUEFOREVEKTsKLQkJZXhwYW5kTGluay5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5jbG9zZVJURSk7IC8vJE5PTi1OTFMtMSQKLQkJZXhwYW5kTGluay5zZXRVbmRlcmxpbmVkKGZhbHNlKTsKLQkJZXhwYW5kTGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCXRvZ2dsZShlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZXhwYW5kTGFiZWwgPSBjcmVhdGVEZWNvcmF0ZWRMYWJlbCh0b29sa2l0LCBleHBhbmRlZENvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVG9nZ2xlIERlc2NyaXB0aW9uIGNvbnRyb2wgdG8gZXhwYW5kIGFuZCBjb250cm9sIHN0YXRlCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkJhc2VGb3JtUGFnZSN0b2dnbGUob3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRvZ2dsZShIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCWlmIChjdXJyZW50SXRlbSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoY3RybF9leHBhbmRlZCA9PSBudWxsKSB7Ci0JCQljdHJsX2V4cGFuZGVkID0gY3JlYXRlUmljaFRleHRFZGl0b3IodG9vbGtpdCwgZXhwYW5kZWRDb21wb3NpdGUsCi0JCQkJCVNXVC5NVUxUSSB8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMLCBHcmlkRGF0YS5GSUxMX0JPVEgsCi0JCQkJCWdldFJpY2hUZXh0RWRpdG9ySGVpZ2h0KCksIGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKSwgMiwgZXhwYW5kTGFiZWwpOwotCQkJY3RybF9leHBhbmRlZC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQl9Ci0KLQkJaWYgKGRlc2NFeHBhbmRGbGFnKSB7Ci0JCQlzZWN0aW9uQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWZvcm1TZWN0aW9uLnNldENsaWVudChzZWN0aW9uQ29tcG9zaXRlKTsKLQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IGdldEFjdGl2ZVJpY2hUZXh0Q29udHJvbCgpOwotCQkJcmljaFRleHQuc2V0VGV4dChjdHJsX2V4cGFuZGVkLmdldFRleHQoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByaWNoVGV4dC5nZXRMaXN0ZW5lcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmljaFRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChSaWNoVGV4dExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQljdHJsX2V4cGFuZGVkLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpLCBsaXN0ZW5lcgotCQkJCQkJLmdldExpc3RlbmVyKCkpOwotCQkJfQotCQkJaWYgKGN0cmxfZXhwYW5kZWQuZ2V0TW9kaWZpZWQoKSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkuc2F2ZU1vZGlmaWVkUmljaFRleHQoY3RybF9leHBhbmRlZCk7Ci0JCQl9Ci0JCQlyaWNoVGV4dC5zZXRGb2N1cygpOwotCQl9IGVsc2UgewotCQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRDbGllbnQoZXhwYW5kZWRDb21wb3NpdGUpOwotCQkJKChMYWJlbClleHBhbmRMYWJlbC5nZXRDb250cm9sKCkpLnNldFRleHQoY3VycmVudEl0ZW0uZ2V0TmFtZSgpICsKLQkJCQkJIiAtICIgKyAoU3RyaW5nKSAoKEltYWdlSHlwZXJsaW5rKSBlLmdldFNvdXJjZSgpKS5nZXREYXRhKCJUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSAoSU1ldGhvZFJpY2hUZXh0KSBlLmdldEhyZWYoKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0VGV4dChyaWNoVGV4dC5nZXRUZXh0KCkpOwotCQkJY3RybF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChyaWNoVGV4dC5nZXRNb2RhbE9iamVjdCgpKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKHJpY2hUZXh0Ci0JCQkJCS5nZXRNb2RhbE9iamVjdEZlYXR1cmUoKSk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEZpbmRSZXBsYWNlQWN0aW9uKHJpY2hUZXh0LmdldEZpbmRSZXBsYWNlQWN0aW9uKCkpOwotCQkJZm9yIChJdGVyYXRvciBpID0gcmljaFRleHQuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF9leHBhbmRlZC5hZGRMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwgbGlzdGVuZXIKLQkJCQkJCS5nZXRMaXN0ZW5lcigpKTsKLQkJCX0KLQkJCWJvb2xlYW4gZWRpdGFibGUgPSAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCWlmIChlZGl0YWJsZSkgewotCQkJCWN0cmxfZXhwYW5kZWQuc2V0Rm9jdXMoKTsKLQkJCX0KLQkJCXNldEFjdGl2ZVJpY2hUZXh0Q29udHJvbChyaWNoVGV4dCk7Ci0JCX0KLQotCQlmb3JtLmdldEJvZHkoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JCWRlc2NFeHBhbmRGbGFnID0gIWRlc2NFeHBhbmRGbGFnOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woSU1ldGhvZFJpY2hUZXh0IGVkaXRvcikgewotCQlhY3RpdmVDb250cm9sID0gZWRpdG9yOwotCX0KLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGdldEFjdGl2ZVJpY2hUZXh0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGFjdGl2ZUNvbnRyb2w7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRQcm92aWRlcnMoKSB7Ci0JCWNoZWNrSXRlbXNWaWV3ZXJDb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAob2JqZWN0ICE9IGNoZWNrbGlzdCkKLQkJCQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRzKG9iamVjdCk7Ci0JCQkJaWYgKGFsbGNoZWNrSXRlbXMgPT0gbnVsbCkgewotCQkJCQlhbGxjaGVja0l0ZW1zID0gbmV3IFNlY3Rpb25MaXN0KGNoZWNrbGlzdCwKLQkJCQkJCQlTZWN0aW9uTGlzdC5TVEVQU19GT1JfRUxFTUVOVF9PTkxZKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGFsbGNoZWNrSXRlbXMudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCWNoZWNrSXRlbXNWaWV3ZXJMYWJlbFByb3ZpZGVyID0gbmV3IFZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAhY2hlY2tsaXN0LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuY29udGFpbnMoCi0JCQkJCQllbGVtZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZU1haW5EZXNjcmlwdGlvbigpIHsKLQkJaWYgKGN1cnJlbnRJdGVtICE9IG51bGwpIHsKLQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCTogY3RybF9tYWluZGVzYzsKLQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjdXJyZW50SXRlbS5nZXRTZWN0aW9uRGVzY3JpcHRpb24oKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKGNvbnRyb2wsCi0JCQkJCW9sZENvbnRlbnQpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBjdXJyZW50SXRlbSwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3Rpb25fU2VjdGlvbkRlc2NyaXB0aW9uKCksCi0JCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgZ2V0QWN0aW9uTWFuYWdlcigpIHsKLQkJRm9ybUVkaXRvciBlZGl0b3IgPSBnZXRFZGl0b3IoKTsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IpIHsKLQkJCXJldHVybiAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1NlbGVjdGlvbigpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjaGVja0l0ZW1zVGFibGVWaWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiAhVG5nVXRpbC5pc0xvY2tlZChjaGVja2xpc3QpKSB7Ci0JCQljdHJsX2RlbGV0ZS5zZXRFbmFibGVkKHRydWUpOwotCi0JCQlpZiAoY2hlY2tJdGVtc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY2hlY2tsaXN0KSAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCWlmIChjaGVja0l0ZW1zVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjaGVja2xpc3QpICYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJZWRpdEl0ZW0oKG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbikgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29uZmlnVmlld1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db25maWdWaWV3UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZjE0NzJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db25maWdWaWV3UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5Db25maWd1cmF0aW9uT3JkZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc1ZpZXdGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLkZvcm1Db2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci0KLQotLyoqCi0gKiBQYWdlIGZvciBjdXN0b21pemluZyBwdWJsaXNoaW5nIHZpZXdzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTczODI3Ci0gKiBmaXggZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzQyNjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ1ZpZXdQYWdlIGV4dGVuZHMgRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBmb3JtUHJlZml4ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvbjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJpdmF0ZSBDVGFiRm9sZGVyIHRhYkZvbGRlcjsKLQlwcml2YXRlIENUYWJJdGVtIHRhYkRlZmF1bHR2aWV3SXRlbTsKLQotCXByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbiwgbWFrZURlZmF1bHRCdXR0b24sIG9yZGVyQnV0dG9uOwotCi0JcHJpdmF0ZSBPYmplY3Qgc2VsZWN0ZWRJdGVtID0gbnVsbDsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyID0gbnVsbDsKLQotCXByaXZhdGUgTG9nZ2VyIGxvZ2dlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIGVkaXRvcgotCSAqLwotCXB1YmxpYyBDb25maWdWaWV3UGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcigKLQkJCQllZGl0b3IsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdzLCBBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZV92aWV3cyk7IAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzZXRTaXRlKHNpdGUpOwotCQlzZXRJbnB1dChpbnB1dCk7Ci0KLQkJQ29uZmlndXJhdGlvbkVkaXRvcklucHV0IGNvbmZpZ0lucHV0ID0gKENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCWNvbmZpZyA9IGNvbmZpZ0lucHV0LmdldENvbmZpZ3VyYXRpb24oKTsKLQotCQlhY3Rpb25NZ3IgPSAoKENvbmZpZ3VyYXRpb25FZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0KLQkJLy8gZ2V0IHBsdWdpbiBsb2dnZXIKLQkJbG9nZ2VyID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2NyZWF0ZUZvcm1Db250ZW50KG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJU2Nyb2xsZWRGb3JtIGZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0JCWZvcm0uc2V0VGV4dChmb3JtUHJlZml4ICsgY29uZmlnLmdldE5hbWUoKSk7Ci0JCXRvb2xraXQgPSBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCk7Ci0JCWZvcm0uZ2V0Qm9keSgpLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQkvLyBDcmVhdGUgdGhlIHZpZXcgc2VjdGlvbi4KLQkJU2VjdGlvbiB2aWV3U2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwKLQkJCQlTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRAotCQkJCQkJfCBTZWN0aW9uLlRJVExFX0JBUik7Ci0JCUdyaWREYXRhIHRkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXZpZXdTZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQl2aWV3U2VjdGlvbgotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvblRpdGxlKTsgLy8kTk9OLU5MUy0xJAotCQl2aWV3U2VjdGlvbgotCQkJCS5zZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25NZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQl2aWV3U2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJQ29tcG9zaXRlIHBhcmVudCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHZpZXdTZWN0aW9uKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl2aWV3U2VjdGlvbi5zZXRDbGllbnQocGFyZW50KTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudC5nZXRQYXJlbnQoKSwKLQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5DT05GSUdVUkFUSU9OX0VESVRPUl9BTExfQ09OVEVYVCk7Ci0KLQkJLy8gY3JlYXRlIGJ1dHRvbiBwYW5lCi0JCWNyZWF0ZUJ1dHRvblBhbmUocGFyZW50KTsKLQotCQkvLyBjcmVhdGUgdGFiZm9sZGVyIHBhbmUKLQkJY3JlYXRlVGFiUGFuZShwYXJlbnQpOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhcmVudCk7Ci0JCWxvYWREYXRhKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUYWJQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGFiRm9sZGVyID0gbmV3IENUYWJGb2xkZXIocGFyZW50LCBTV1QuRkxBVCB8IFNXVC5UT1AgfCBTV1QuQk9SREVSKTsKLQkJdGFiRm9sZGVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJdGFiRm9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIHNldCB0YWJmb2xkZXIgYmFja2dyb3VuZCBjb2xvcgotCQlDb2xvciBzZWxlY3RlZENvbG9yID0gdG9vbGtpdC5nZXRDb2xvcnMoKS5nZXRDb2xvcihGb3JtQ29sb3JzLlRCX0JHKTsKLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbkJhY2tncm91bmQobmV3IENvbG9yW10geyBzZWxlY3RlZENvbG9yLCB0b29sa2l0LmdldENvbG9ycygpLmdldEJhY2tncm91bmQoKSB9LCBuZXcgaW50W10geyA1MCB9KTsKLQkJCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHRhYkZvbGRlcik7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJ1dHRvblBhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgYnV0dG9uUGFuZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0JCWJ1dHRvblBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWJ1dHRvblBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKSk7Ci0KLQkJQnV0dG9uIGFkZEJ1dHRvbiA9IHRvb2xraXQKLQkJCQkuY3JlYXRlQnV0dG9uKAotCQkJCQkJYnV0dG9uUGFuZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlX2FkZFZpZXdCdXR0b25UZXh0LCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2cgZmQgPSBuZXcKLQkJCQkvLyBDb25maWdQcm9jZXNzVmlld0RpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJLy8gY29uZmlnKTsKLQkJCQkvLyBDb25maWdQcm9jZXNzVmlld0RpYWxvZy5zZXREZWZhdWx0SW1hZ2UoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKS5nZXRJbWFnZSgpKTsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBQcm9jZXNzVmlld0ZpbHRlcihjb25maWcsIG51bGwsCi0JCQkJCQlGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTKTsKLQkJCQlDb25maWd1cmF0aW9uQWRkVmlld3NEaWFsb2cgZmQgPSBuZXcgQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nKAotCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQkJZmQuc2V0VHlwZXMoZ2V0VHlwZXMoKSk7Ci0JCQkJZmQKLQkJCQkJCS5zZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWdQcm9jZXNzVmlld0RpYWxvZ19TZWxlY3RDYXRlZ29yaWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZkLnNldElucHV0KGNvbmZpZyk7Ci0JCQkJZmQuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQkJZmQuc2V0RXhpc3RpbmdFbGVtZW50cyhjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCkpOwotCQkJCWZkLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0SXRlbXNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKSksCi0JCQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldEl0ZW1zRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZmQub3BlbigpOwotCQkJCUxpc3Qgdmlld3MgPSBmZC5nZXRTZWxlY3RlZEl0ZW1zKCk7Ci0KLQkJCQkvLyBhZGQgdmlldyB0byBjb25maWd1cmF0aW9uCi0JCQkJZm9yIChJdGVyYXRvciBpdG9yID0gdmlld3MuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCi0JCQkJCQlpZiAoY29uZmlnLmdldFByb2Nlc3NWaWV3cygpLmNvbnRhaW5zKAotCQkJCQkJCQkoQ29udGVudENhdGVnb3J5KSBvYmopKSB7Ci0JCQkJCQkJU3RyaW5nIG5hbWUgPSAoKENvbnRlbnRDYXRlZ29yeSkgb2JqKS5nZXROYW1lKCk7Ci0JCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX3RpdGxlOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ19tZXNzYWdlLCBuYW1lKTsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbWVzc2FnZSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJY29uZmlnLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXdzKCksCi0JCQkJCQkJCQkoQ29udGVudENhdGVnb3J5KSBvYmosIC0xKTsKLQkJCQkJCQlpZihzdGF0dXMpewotCQkJCQkJCQlhZGRWaWV3KChDb250ZW50Q2F0ZWdvcnkpIG9iaik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyByZW1vdmUgYnV0dG9uCi0JCXJlbW92ZUJ1dHRvbiA9IHRvb2xraXQKLQkJCQkuY3JlYXRlQnV0dG9uKAotCQkJCQkJYnV0dG9uUGFuZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlX3JlbW92ZVZpZXdCdXR0b25UZXh0LCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlyZW1vdmVWaWV3KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIG1ha2UgZGVmYXVsdCBidXR0b24KLQkJbWFrZURlZmF1bHRCdXR0b24gPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUJ1dHRvbigKLQkJCQkJCWJ1dHRvblBhbmUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZV9tYWtlRGVmYXVsdEJ1dHRvblRleHQsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJbWFrZURlZmF1bHRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJbWFrZURlZmF1bHRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCW1ha2VEZWZhdWx0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW1ha2VEZWZhdWx0VmlldygpOwotCQkJfQotCQl9KTsKLQkJCi0JCW9yZGVyQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oCi0JCQkJYnV0dG9uUGFuZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5vcmRlckJ1dHRvbl90ZXh0LCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlvcmRlckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUNvbmZpZ3VyYXRpb25PcmRlckRpYWxvZyBkbGcgPSBuZXcgQ29uZmlndXJhdGlvbk9yZGVyRGlhbG9nKAotCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCWNvbmZpZywKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSk7Ci0JCQkJaW50IHJldCA9IGRsZy5vcGVuKCk7Ci0JCQkJaWYocmV0ID09IFdpbmRvdy5PSykgcmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihidXR0b25QYW5lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNlbGVjdGVkIHZpZXcKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlVmlldygpIHsKLQkJQ1RhYkl0ZW0gaXRlbSA9IHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKGl0ZW0gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCS8vIGRvbid0IGNoYW5nZSBkZWZhdWx0IHZpZXcgaWYgdGhlIHZpZXcgaXMgbm90IHJlbW92ZWQuCi0JCS8vIDE1NTAyNSAtIGVycm9yIHdoZW4gcmVtb3ZpbmcgdGhlIHZpZXcgaW4gY29uZmlndXJhdGlvbgotCQlTdHJpbmcgaXRlbVRleHQgPSBpdGVtLmdldFRleHQoKTsJCQotCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZVJlbW92ZVZpZXdEaWFsb2dfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ19tZXNzYWdlLCBpdGVtIC8vJE5PTi1OTFMtMSQKLQkJLmdldFRleHQoKSk7Ci0JCWJvb2xlYW4gcmV0ID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJLmRpc3BsYXlDb25maXJtYXRpb24odGl0bGUsIG1lc3NhZ2UpOwotCi0JCWlmICghcmV0KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWJvb2xlYW4gcmVtb3ZlRGVmYXVsdCA9IGZhbHNlOwotCQlpZiAodGFiRGVmYXVsdHZpZXdJdGVtICE9IG51bGwgJiYgaXRlbSA9PSB0YWJEZWZhdWx0dmlld0l0ZW0pIHsKLQkJCXJlbW92ZURlZmF1bHQgPSB0cnVlOwotCQl9Ci0KLQkJCUxpc3Qgdmlld3MgPSBjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCk7Ci0JCQkvLyBpZiB0aGVyZSBpcyBhIGRlZmF1bHQgdmlldyB0YWIsIGFuZCBpdCdzIHRoZSBvbmUgc2xlY3RlZCB0byBiZSByZW1vdmVkCi0JCQlpZiAocmVtb3ZlRGVmYXVsdCkgewotCQkJCVN0cmluZyBkZWZhdWx0VGV4dCA9ICIgIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Rlc2NyaXB0aW9uX2RlZmF1bHQ7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbnQgaWR4ID0gaXRlbVRleHQubGFzdEluZGV4T2YoZGVmYXVsdFRleHQpOwotCQkJCWlmIChpZHggPiAwKSB7Ci0JCQkJCWl0ZW1UZXh0ID0gaXRlbVRleHQuc3Vic3RyaW5nKDAsaWR4KTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHZpZXdzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCUNvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSA9IChDb250ZW50Q2F0ZWdvcnkpIGl0b3IubmV4dCgpOwotCQkJCQotCQkJCWlmIChjYXRlZ29yeS5nZXROYW1lKCkuZXF1YWxzKGl0ZW1UZXh0KSkgewotCQkJCQkvLyByZW1vdmUgaXQgZnJvbSB2aWV3cwotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBjb25maWcsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpLAotCQkJCQkJCWNhdGVnb3J5LCAtMSk7Ci0KLQkJCQkJQ29udGVudENhdGVnb3J5IGRlZmF1bHRWaWV3ID0gY29uZmlnLmdldERlZmF1bHRWaWV3KCk7Ci0KLQkJCQkJaWYgKChkZWZhdWx0VmlldyAhPSBudWxsKSAmJiAoZGVmYXVsdFZpZXcuZXF1YWxzKGNhdGVnb3J5KSkpIHsKLQkJCQkJCWlmICh2aWV3cy5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQkJY29uZmlnLAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCksCi0JCQkJCQkJCQkJCShDb250ZW50Q2F0ZWdvcnkpIHZpZXdzLmdldCgwKSwgLTEpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQljb25maWcsCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKSwKLQkJCQkJCQkJCQkJbnVsbCwgLTEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIHJlbW92ZSB0YWIgaXRlbQotCQkJCQlpdGVtLmRpc3Bvc2UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCXZpZXdzID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpOwotCQlpZiAoKHZpZXdzID09IG51bGwpIHx8ICh2aWV3cy5zaXplKCkgPD0gMCkpIHsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCW1ha2VEZWZhdWx0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JCQotCQkvLyBtYWtlIHRoZSAxc3QgdGFiIGFzIHRoZSBkZWZhdWx0IHZpZXcgaWYgdGhlIGRlZmF1bHQgb25lIGlzIHJlbW92ZWQKLQkJaWYgKHJlbW92ZURlZmF1bHQpIHsKLQkJCUNvbnRyb2xbXSB0YWJMaXN0ID0gdGFiRm9sZGVyLmdldFRhYkxpc3QoKTsKLQkJCWlmICh0YWJMaXN0ICE9IG51bGwgJiYgdGFiTGlzdC5sZW5ndGggPiAwKSB7Ci0JCQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbigwKTsKLQkJCQltYWtlRGVmYXVsdFZpZXcoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB2aWV3Ci0JICogCi0JICogQHBhcmFtIG9iagotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRWaWV3KENvbnRlbnRDYXRlZ29yeSBvYmopIHsKLQkJc2VsZWN0ZWRJdGVtID0gb2JqOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJVHJlZVZpZXdlciB0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoY29tcG9zaXRlLCBTV1QuSF9TQ1JPTEwKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUlGaWx0ZXIgY29uZmlnRmlsdGVyID0gbmV3IENvbmZpZ3VyYXRpb25GaWx0ZXIoY29uZmlnLCB0cmVlVmlld2VyKTsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRDb25maWd1cmF0aW9uVmlld19BZGFwdGVyRmFjdG9yeShjb25maWdGaWx0ZXIpOwotCi0JCUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlhZGFwdGVyRmFjdG9yeSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQkvLyBHZXQgdGhlIGFkYXB0ZXIgZnJvbSB0aGUgZmFjdG9yeS4KLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCS5hZGFwdChzZWxlY3RlZEl0ZW0sIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0KLQkJCQlyZXR1cm4gaXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKHNlbGVjdGVkSXRlbSkudG9BcnJheSgpOwotCQkJCS8vIHJldHVybiBpdGVtUHJvdmlkZXIuZ2V0RWxlbWVudHMoc2VsZWN0ZWRJdGVtKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb25maWd1cmF0aW9uTGFiZWxQcm92aWRlcihjb25maWcsCi0JCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJdHJ5IHsKLQkJCXRyZWVWaWV3ZXIuc2V0SW5wdXQoY29uZmlnKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoIkVycm9yIGNyZWF0aW5nIHRyZWV2aWV3ZXIgZm9yIGNvbmZpZyIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJQ1RhYkl0ZW0gaXRlbSA9IG5ldyBDVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5UT1ApOwotCQlpdGVtLnNldFRleHQoKChDb250ZW50Q2F0ZWdvcnkpIG9iaikuZ2V0TmFtZSgpKTsKLQkJaXRlbS5zZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0KLQkJLy8gbWFrZSBhbGwgYnV0dG9ucyBlbmFibGVkCi0JCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQltYWtlRGVmYXVsdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbXBvc2l0ZSk7Ci0JCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oaXRlbSk7Ci0JfQotCi0JLyoqCi0JICogTWFrZSBzZWxlY3RlZCBhcyBkZWZhdWx0IHZpZXcKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbWFrZURlZmF1bHRWaWV3KCkgewotCQlDVGFiSXRlbSBpdGVtID0gdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpOwotCQlMaXN0IHZpZXdzID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB2aWV3cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSA9IChDb250ZW50Q2F0ZWdvcnkpIGl0b3IubmV4dCgpOwotCQkJaWYgKGNhdGVnb3J5LmdldE5hbWUoKS5lcXVhbHMoaXRlbS5nZXRUZXh0KCkpKSB7Ci0JCQkJY2xlYXJEZWZhdWx0Vmlld0luZGljYXRvcigpOwotCQkJCS8vIG1ha2UgdGhhdCB2aWV3IGRlZmF1bHQKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBjb25maWcsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpLAotCQkJCQkJY2F0ZWdvcnksIC0xKTsKLQkJCQlzZXREZWZhdWx0Vmlld0luZGljYXRvcihpdGVtKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWQgaW5pdGlhbCBkYXRhCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotCQkvLyBnZXQgcHJvY2VzcyB2aWV3cwotCQlMaXN0IHZpZXdzID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB2aWV3cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCS8vIGNyZWF0ZSB2aWV3IGluIFVJCi0JCQlhZGRWaWV3KChDb250ZW50Q2F0ZWdvcnkpIGl0b3IubmV4dCgpKTsKLQkJfQotCi0JCS8vIGdldCBkZWZhdWx0IHZpZXcKLQkJQ29udGVudENhdGVnb3J5IGRlZmF1bHRWaWV3ID0gY29uZmlnLmdldERlZmF1bHRWaWV3KCk7Ci0JCWludCBjbnQgPSB0YWJGb2xkZXIuZ2V0SXRlbUNvdW50KCk7Ci0JCWlmIChkZWZhdWx0VmlldyAhPSBudWxsKSB7Ci0JCQkvLyBpZiBkZWZhdWx0IHZpZXcgaXMgZGVmaW5lZCwgc2VsZWN0IHRoYXQgdmlldwotCQkJQ1RhYkl0ZW1bXSBpdGVtcyA9IHRhYkZvbGRlci5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gaXRlbXNbaV0uZ2V0VGV4dCgpOwotCQkJCWlmIChuYW1lLmVxdWFscyhkZWZhdWx0Vmlldy5nZXROYW1lKCkpKSB7Ci0JCQkJCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oaXRlbXNbaV0pOwotCQkJCQlzZXREZWZhdWx0Vmlld0luZGljYXRvcihpdGVtc1tpXSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChjbnQgPiAwKSB7Ci0JCQkvLyBlbHNlIHNlbGVjdCBmaXJzdCB2aWV3Ci0JCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKDApOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWZyZXNoKCl7Ci0JCUNvbnRlbnRDYXRlZ29yeSBkZWZhdWx0VmlldyA9IGNvbmZpZy5nZXREZWZhdWx0VmlldygpOwotCQlTdHJpbmcgZGVmYXVsdFZpZXdOYW1lID0gIiI7Ci0JCWlmKGRlZmF1bHRWaWV3IT1udWxsKSB7Ci0JCQlkZWZhdWx0Vmlld05hbWUgPSBkZWZhdWx0Vmlldy5nZXROYW1lKCk7Ci0JCQljbGVhckRlZmF1bHRWaWV3SW5kaWNhdG9yKCk7Ci0JCX0KLQkJU3RyaW5nIHNlbGVjdGVkVmlldyA9IHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKS5nZXRUZXh0KCk7Ci0JCU1hcCBvcmlnVmlld3MgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IoaW50IGk9MDtpPHRhYkZvbGRlci5nZXRJdGVtQ291bnQoKTtpKyspewotCQkJQ1RhYkl0ZW0gaXRlbSA9IHRhYkZvbGRlci5nZXRJdGVtKGkpOwotCQkJb3JpZ1ZpZXdzLnB1dChpdGVtLmdldFRleHQoKSwgaXRlbS5nZXRDb250cm9sKCkpOwotCQl9Ci0JCUxpc3Qgdmlld3MgPSBjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCk7Ci0JCWludCBpbmRleCA9IDA7Ci0JCWludCBzZWxlY3RlZEluZGV4ID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gdmlld3MuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCkgJiYgaW5kZXg8dGFiRm9sZGVyLmdldEl0ZW1Db3VudCgpOykgewotCQkJU3RyaW5nIHZpZXcgPSAoKENvbnRlbnRDYXRlZ29yeSlpdG9yLm5leHQoKSkuZ2V0TmFtZSgpOwotCQkJQ1RhYkl0ZW0gaXRlbSA9IHRhYkZvbGRlci5nZXRJdGVtKGluZGV4KyspOwotCQkJaXRlbS5zZXRUZXh0KHZpZXcpOwotCQkJaXRlbS5zZXRDb250cm9sKChDb250cm9sKW9yaWdWaWV3cy5nZXQodmlldykpOwotCQkJaWYodmlldy5lcXVhbHMoZGVmYXVsdFZpZXdOYW1lKSkgc2V0RGVmYXVsdFZpZXdJbmRpY2F0b3IoaXRlbSk7Ci0JCQlpZih2aWV3LmVxdWFscyhzZWxlY3RlZFZpZXcpKSBzZWxlY3RlZEluZGV4ID0gaW5kZXgtMTsKLQkJfQotCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGVkSW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgdGhlIGFwcGVuZGVkICIoZGVmYXVsdCkiIGZyb20gdGhlIHRhYiBmb3IgdGhlIGRlZmF1bHQKLQkgKiB2aWV3LiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2hhbmdpbmcgdGhlIGRlZmF1bHQgdmlldyEKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYXJEZWZhdWx0Vmlld0luZGljYXRvcigpIHsKLQkJQ29udGVudENhdGVnb3J5IGRlZmF1bHRWaWV3ID0gY29uZmlnLmdldERlZmF1bHRWaWV3KCk7Ci0JCWlmIChkZWZhdWx0VmlldyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZGVmYXVsdFZpZXdUYWJOYW1lID0gZGVmYXVsdFZpZXcuZ2V0TmFtZSgpCi0JCQkJCSsgIiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fZGVmYXVsdDsgLy8kTk9OLU5MUy0xJAotCQkJQ1RhYkl0ZW1bXSBpdGVtcyA9IHRhYkZvbGRlci5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gaXRlbXNbaV0uZ2V0VGV4dCgpOwotCQkJCWlmIChuYW1lLmVxdWFscyhkZWZhdWx0Vmlld1RhYk5hbWUpKSB7Ci0JCQkJCWl0ZW1zW2ldLnNldFRleHQoZGVmYXVsdFZpZXcuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYXBwZW5kcyAiKGRlZmF1bHQpIiB0byB0aGUgdGFiIG9mIHRoZSBkZWZhdWx0IHZpZXcuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRWaWV3SW5kaWNhdG9yKENUYWJJdGVtIGl0ZW0pIHsKLQkJdGFiRGVmYXVsdHZpZXdJdGVtID0gaXRlbTsKLQkJCi0JCVN0cmluZyBuYW1lID0gaXRlbS5nZXRUZXh0KCkKLQkJCQkrICIgIiAvLyROT04tTkxTLTEkCi0JCQkJKyBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fZGVmYXVsdDsgLy8kTk9OLU5MUy0xJAotCQlpdGVtLnNldFRleHQobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRUeXBlcygpIHsKLQkJU3RyaW5nW10gQ2F0ZWdvcmllcyA9IG5ldyBTdHJpbmdbXSB7IEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUywKLQkJCQlGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTLCBGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVMsCi0JCQkJRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlMsIEZpbHRlckNvbnN0YW50cy5ST0xFU0VUUywKLQkJCQlGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RUWVBFUywgRmlsdGVyQ29uc3RhbnRzLlRPT0xTIH07Ci0JCXJldHVybiBDYXRlZ29yaWVzOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgZ2V0QWN0aW9uTWFuYWdlcigpIHsKLQkJcmV0dXJuIGFjdGlvbk1ncjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1NzE5NGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgaW4gdGhlIENvbmZpZ3VyYXRpb24gZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbiBleHRlbmRzIEZvcm1QYWdlIGltcGxlbWVudHMgSVJlZnJlc2hhYmxlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BSRUZJWCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkZvcm1QcmVmaXg7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCi0JcHJpdmF0ZSBTY3JvbGxlZEZvcm0gZm9ybSA9IG51bGw7Ci0KLQlwcml2YXRlIFRleHQgbmFtZVRleHQ7Ci0KLQlwcml2YXRlIFRleHQgZGVzcFRleHQ7Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIG1vZGVsTW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbihGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcigKLQkJCQllZGl0b3IsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb24sIEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uKTsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXNldFNpdGUoc2l0ZSk7Ci0JCXNldElucHV0KGlucHV0KTsKLQkJQ29uZmlndXJhdGlvbkVkaXRvcklucHV0IGNvbmZpZ0lucHV0ID0gKENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCWNvbmZpZyA9IGNvbmZpZ0lucHV0LmdldENvbmZpZ3VyYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5jcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCWZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0JCWZvcm0uc2V0VGV4dChGT1JNX1BSRUZJWCArIGNvbmZpZy5nZXROYW1lKCkpOwotCQlGb3JtVG9vbGtpdCB0b29sa2l0ID0gbWFuYWdlZEZvcm0uZ2V0VG9vbGtpdCgpOwotCi0JCVRhYmxlV3JhcExheW91dCBsYXlvdXQgPSBuZXcgVGFibGVXcmFwTGF5b3V0KCk7Ci0JCWZvcm0uZ2V0Qm9keSgpLnNldExheW91dChsYXlvdXQpOwotCi0JCVNlY3Rpb24gZ2VuU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwKLQkJCQlTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRAotCQkJCQkJfCBTZWN0aW9uLlRJVExFX0JBUik7Ci0JCWNyZWF0ZUdlbmVyYWxDb250ZW50KHRvb2xraXQsIGdlblNlY3Rpb24pOwotCi0JCWFkZExpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBnZW5lcmFsIGNvbnRlbnQgZm9yIHRoZSBkZXNjcmlwdGlvbiBwYWdlCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcGFyYW0gc2VjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUdlbmVyYWxDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQsIFNlY3Rpb24gc2VjdGlvbikgewotCQlzZWN0aW9uLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQkJc2VjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkdlbmVyYWxJbmZvKTsgLy8kTk9OLU5MUy0xJAotCQlzZWN0aW9uCi0JCQkJLnNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uX3RleHQpOyAvLyROT04tTkxTLTEkCi0KLQkJQ29tcG9zaXRlIHNlY3Rpb25DbGllbnQgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJVGFibGVXcmFwTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZVdyYXBMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlzZWN0aW9uQ2xpZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCXRvb2xraXQKLQkJCQkuY3JlYXRlTGFiZWwoCi0JCQkJCQlzZWN0aW9uQ2xpZW50LAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uTmFtZSwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0JCW5hbWVUZXh0ID0gdG9vbGtpdC5jcmVhdGVUZXh0KHNlY3Rpb25DbGllbnQsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJbmFtZVRleHQuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCW5hbWVUZXh0LnNldFRleHQoY29uZmlnLmdldE5hbWUoKSk7Ci0KLQkJTGFiZWwgZGVzcExhYmVsID0gdG9vbGtpdAotCQkJCS5jcmVhdGVMYWJlbCgKLQkJCQkJCXNlY3Rpb25DbGllbnQsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbkxhYmVsLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJVGFibGVXcmFwRGF0YSB0d2QwID0gbmV3IFRhYmxlV3JhcERhdGEoKTsKLQkJZGVzcExhYmVsLnNldExheW91dERhdGEodHdkMCk7Ci0KLQkJZGVzcFRleHQgPSB0b29sa2l0LmNyZWF0ZVRleHQoc2VjdGlvbkNsaWVudCwKLQkJCQkiIiwgU1dULk5PTkUgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuV1JBUCk7IC8vJE5PTi1OTFMtMSQKLQkJVGFibGVXcmFwRGF0YSB0d2QgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCXR3ZC5oZWlnaHRIaW50ID0gNTA7Ci0JCWRlc3BUZXh0LnNldExheW91dERhdGEodHdkKTsKLQkJZGVzcFRleHQuc2V0VGV4dChjb25maWcuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQotCQlzZWN0aW9uLnNldENsaWVudChzZWN0aW9uQ2xpZW50KTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3Ioc2VjdGlvbkNsaWVudCk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCgKLQkJCQlzZWN0aW9uQ2xpZW50LmdldFBhcmVudCgpLCBBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5DT05GSUdVUkFUSU9OX0VESVRPUl9BTExfQ09OVEVYVCk7IAotCi0JCURpc3BsYXkgZGlzcGxheSA9IGZvcm0uZ2V0Qm9keSgpLmdldERpc3BsYXkoKTsKLQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJbmFtZVRleHQuc2V0Rm9jdXMoKTsKLQkJCQkJbmFtZVRleHQuc2V0U2VsZWN0aW9uKDAsIG5hbWVUZXh0LmdldFRleHQoKS5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlmaW5hbCBDb25maWd1cmF0aW9uRWRpdG9yIGVkaXRvciA9IChDb25maWd1cmF0aW9uRWRpdG9yKSBnZXRFZGl0b3IoKTsKLQkJbW9kZWxNb2RpZnlMaXN0ZW5lciA9IGVkaXRvci5jcmVhdGVNb2RpZnlMaXN0ZW5lcihjb25maWcpOwotCi0JCWFjdGlvbk1nciA9ICgoQ29uZmlndXJhdGlvbkVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQluYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJbmFtZVRleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlciNmb2N1c0dhaW5lZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbmZpZy5nZXROYW1lKCk7Ci0JCQkJZmluYWwgTWV0aG9kQ29uZmlndXJhdGlvbiBpQ29uZmlnID0gY29uZmlnOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJZS53aWRnZXQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKGlzVGV4dE5vbkVtcHR5KG5hbWVUZXh0KSkgewotCQkJCQlTdHJpbmcgbmFtZSA9IG5hbWVUZXh0LmdldFRleHQoKTsKLQkJCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVOYW1lVmFsaWRhdG9yKGNvbmZpZy5lQ29udGFpbmVyKCksIGNvbmZpZyk7Ci0JCQkJCVN0cmluZyBtc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChuYW1lKTsKLQkJCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ190aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCW1zZyk7Ci0JCQkJCQluYW1lVGV4dC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCW5hbWVUZXh0LnNldFRleHQoaUNvbmZpZy5nZXROYW1lKCkpOwotCQkJCQkJCQluYW1lVGV4dC5zZWxlY3RBbGwoKTsKLQkJCQkJCQkJbmFtZVRleHQuc2V0Rm9jdXMoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQluYW1lID0gbmFtZS50cmltKCk7CQkJLy8xNjY3NTUKLQkJCQkJCi0JCQkJCWlmICghbmFtZS5lcXVhbHMoY29uZmlnLmdldE5hbWUoKSkpIHsKLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJY29uZmlnLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCBuYW1lLCAtMSk7Ci0JCQkJCQlpZiAoc3RhdHVzKSB7Ci0JCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjb25maWcuZVJlc291cmNlKCk7Ci0JCQkJCQkJaWYocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZSAhPSBjb25maWcuZUNvbnRhaW5lcigpLmVSZXNvdXJjZSgpKSB7Ci0JCQkJCQkJCWVkaXRvci5hZGRSZXNvdXJjZVRvQWRqdXN0TG9jYXRpb24oY29uZmlnLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZm9ybS5zZXRUZXh0KEZPUk1fUFJFRklYICsgY29uZmlnLmdldE5hbWUoKSk7Ci0JCQkJCQkJbmFtZVRleHQuc2V0VGV4dChuYW1lKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVEaWFsb2dfdGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZywgU3RyVXRpbC50b0xvd2VyKExpYnJhcnlVSVRleHQuVEVYVF9NRVRIT0RfQ09ORklHVVJBVE9OKSkpOyAvLyROT04tTkxTLTEkCQotCQkJCQluYW1lVGV4dC5zZXRUZXh0KGNvbmZpZy5nZXROYW1lKCkpOwotCQkJCQluYW1lVGV4dC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQluYW1lVGV4dC5zZXRGb2N1cygpOwotCQkJCQkJCW5hbWVUZXh0LnNldFNlbGVjdGlvbigwLCBuYW1lVGV4dC5nZXRUZXh0KCkKLQkJCQkJCQkJCS5sZW5ndGgoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQotCQl9KTsKLQotCQlkZXNwVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJZGVzcFRleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbmZpZy5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgZGVzYzEgPSBkZXNwVGV4dC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFkZXNjMS5lcXVhbHMoY29uZmlnLmdldEJyaWVmRGVzY3JpcHRpb24oKSkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgY29uZmlnLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCksCi0JCQkJCQkJZGVzYzEsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIFRleHQgY29udHJvbCBjb250YWluIGNoYXJhY3RlcnMKLQkgKiBvdGhlciB0aGFuIHNwYWNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIFRleHQgY29udHJvbC4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBUZXh0IGNvbnRyb2wgY29udGFpbiBjaGFyYWN0ZXJzCi0JICogICAgICAgICBvdGhlciB0aGFuIHNwYWNlcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVGV4dE5vbkVtcHR5KFRleHQgdCkgewotCQlTdHJpbmcgcyA9IHQuZ2V0VGV4dCgpOwotCQlpZiAoKHMgIT0gbnVsbCkgJiYgKHMudHJpbSgpLmxlbmd0aCgpID4gMCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuSVJlZnJlc2hhYmxlI3JlZnJlc2hOYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKG5ld05hbWUgIT0gbnVsbCkgewotCQkJaWYgKChuYW1lVGV4dCAhPSBudWxsKSAmJiAhKG5hbWVUZXh0LmlzRGlzcG9zZWQoKSkpIHsKLQkJCQluYW1lVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJCQluYW1lVGV4dC5zZXRUZXh0KG5ld05hbWUpOwotCQkJCW5hbWVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQkJCWZvcm0uc2V0VGV4dChGT1JNX1BSRUZJWCArIGNvbmZpZy5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbmZpZ3VyYXRpb25QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29uZmlndXJhdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWRlZTMxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29uZmlndXJhdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklWaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db25maWd1cmF0aW9uRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db25maWd1cmF0aW9uRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db25maWd1cmF0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTWVzc2FnZVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50RGVwZW5kZW5jeUVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRXJyb3JJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkNvbnRlbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuRWxlbWVudFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVWaWV3ZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZUV4cGFuc2lvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0vKioKLSAqIFRoZSBDb25maWd1cmF0aW9uIHBhZ2UgaW4gdGhlIE1ldGhvZCBDb25maWd1cmF0aW9uIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25QYWdlIGV4dGVuZHMgRm9ybVBhZ2UgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIgewotCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQotCUNvbmZpZ3VyYXRpb25DbG9zdXJlIGNsb3N1cmUgPSBudWxsOwotCi0JQ29uZmlndXJhdGlvblZpZXdlciB0cmVlVmlld2VyOwotCi0JQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlciBjb250UHJvdmlkZXI7Ci0KLQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG51bGw7Ci0KLQlTY3JvbGxlZEZvcm0gZm9ybSA9IG51bGw7Ci0KLQlib29sZWFuIGlzRGlydHkgPSBmYWxzZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gbmVlZFVwZGF0ZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZm9ybVByZWZpeCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX0Zvcm1QcmVmaXg7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHByaXZhdGUgRU9iamVjdCBjdXJyZW50Um9vdE5vZGU7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgZXhwYW5kZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIHByaXZhdGUgVGV4dCBjdHJsX25hbWU7Ci0KLQkvLyBwcml2YXRlIFRleHQgY3RybF9icmllZl9kZXNjOwotCi0JcHJpdmF0ZSBMaXN0IG1vZGlmaWVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjbG9zdXJlQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gZml4V2FybmluZ0J1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGVycm9yQnV0dG9uOwotCi0JLy8gcHJpdmF0ZSBCdXR0b24gZGVwZW5kZW50QnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gaGlkZUJ1dHRvbjsKLQotCS8vIHByaXZhdGUgVGV4dCBkZXNwVGV4dDsKLQotCXByaXZhdGUgVGV4dCBlbGVtRGVzcENvbnRlbnRUZXh0OwotCi0JLy8gcHJpdmF0ZSBUZXh0IG5hbWVUZXh0OwotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIHByaXZhdGUgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBwYXJlbnRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIElTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VWaWV3IG1zZ1ZpZXc7Ci0KLQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIG1zZ1ZpZXdMaXN0ZW5lciA9IG51bGw7Ci0KLQlwcml2YXRlIENvbmZpZ1RyZWVGaWx0ZXIgY29uZmlnRmlsdGVyOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwcml2YXRlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGliTGlzdGVuZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXIgY29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIGVkaXRvcgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcigKLQkJCQllZGl0b3IsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24xLCBBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjIpOyAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc2V0U2l0ZShzaXRlKTsKLQkJc2V0SW5wdXQoaW5wdXQpOwotCi0JCUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCBjb25maWdJbnB1dCA9IChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIGlucHV0OwotCQljb25maWcgPSBjb25maWdJbnB1dC5nZXRDb25maWd1cmF0aW9uKCk7Ci0KLQkJCi0JCWNvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKAotCQkJCQlvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24gbXNnKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgY2F0Y2hlZCBtb2RpZnkgY29uZmlnIG5vdGlmaWNhdGlvbiA9Ci0JCQkJLy8gIiArIG1zZyk7Ci0JCQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCQkJaWYgKAl0eXBlID09IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbi5BREQKLQkJCQkJCXx8IHR5cGUgPT0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLkFERF9NQU5ZCi0JCQkJCQl8fCB0eXBlID09IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbi5SRU1PVkUKLQkJCQkJCXx8ICAgdHlwZSA9PSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24uUkVNT1ZFX01BTlkpIHsJCQkJCQotCQkJCQluZWVkVXBkYXRlID0gdHJ1ZTsKLQkJCQkJCi0vLwkJCQkJVGhpcyB3YXMgZG9uZSB0byByZWZyZXNoIGNvbmZpZ3VyYXRpb24gcGx1Z2luLXBhY2thZ2Ugc2VjdGlvbiBwYWdlLiBCdXQgaXRzIG5vdCBwZXJmZWN0Ci0vLwkJCQkJc29sdXRpb24uIERvZXNudCBjb3ZlciBhbGwgdGhlIHNjZW5hcmlvcy4gU28gY29tbWVudGluZyBpdCBvdXQuCi0vLwkJCQkJV2lsbCBoYXZlIHRvIHRoaW5rIG9mIGFsdGVybmF0ZSB3YXkgdG8gcmVmcmVzaCBwbHVnaW4vcGFja2FnZSBjb25maWd1cmF0aW9uIHBhZ2UuCi0vLwkJCQkJTG93IFByaW9yaXR5Ci0vLwkJCQkJCXx8IHR5cGUgPT0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLlJFTU9WRQotLy8JCQkJCQl8fCB0eXBlID09IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSApIHsKLS8vCQkJCQkKLQkJCQkJCi0vLwkJCQkJaWYgKHRyZWVWaWV3ZXIgIT0gbnVsbCkJewotLy8JCQkJCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLS8vCQkJCQkJdXBkYXRlQ2hlY2tTdGF0ZXMoKTsKLS8vCQkJCQkJc2hvd0Vycm9ycygpOwotLy8JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWNvbmZpZy5lQWRhcHRlcnMoKS5hZGQoY29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVJbml0aWFsaXplQ29uZmlnRmFjdG9yeSgpIHsKLQkJLy8gdGhlIGZvbGxvd2luZyBtYXkgbm90IGJlIHRoZSBtb3N0IGVmZmljaWVudCB3YXkKLQkJLy8gbmVlZCBhIGZhc3Qgd2F5IHRvIHVwZGF0ZSB0aGUgY2xvc3VyZQotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHJlSW5pdCBjbG9zdXJlIGZvciBjb25maWcgYWRkIG5vdGlmaWNhdGlvbiEiKTsKLQotCQljcmVhdGVDb25maWd1cmF0aW9uQ2xvc3VyZSgpOwotCi0JCWNvbmZpZ0ZpbHRlciA9IG5ldyBDb25maWdUcmVlRmlsdGVyKGNsb3N1cmUpOwotCX0KLQotCS8qKgotCSAqIFNldCBpbnB1dCBmb3IgY29ubmZpZ3VyYXRpb24gdmlld2VyCi0JICogQHBhcmFtIGlucHV0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0KSB7Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotCi0JCS8vIGluaXRpYWxseSBleHBhbmQgdGhlIHdob2xlIHRyZWUgYmVmb3JlIHVwZGF0aW5nIHRoZSB0cmVlCi0JCS8vIHRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciB0aGUgY29udGVudCBwcm92aWRlciB0byBidWlsZCB0aGUgY2hpbGQgLQotCQkvLyBwYXJlbnQgbG9va3VwIG1hcAotCQl0cmVlVmlld2VyLmV4cGFuZEFsbCgpOwotCi0JCS8vIHVwZGF0ZSB0aGUgdHJlZSB3aXRoIHRoZSBkZWZhdWx0IGNsb3N1cmUgc2VsZWN0aW9uCi0JCXVwZGF0ZUNoZWNrU3RhdGVzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjY3JlYXRlRm9ybUNvbnRlbnQob3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQkvLyBjcmVhdGUgZm9ybSB0b29sa2l0Ci0JCWZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0JCWZvcm0uc2V0VGV4dChmb3JtUHJlZml4ICsgY29uZmlnLmdldE5hbWUoKSk7Ci0JCUZvcm1Ub29sa2l0IHRvb2xraXQgPSBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCk7Ci0KLQkJVGFibGVXcmFwTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZVdyYXBMYXlvdXQoKTsKLQkJZm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJU2VjdGlvbiB0cmVlU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwKLQkJCQlTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRAotCQkJCQkJfCBTZWN0aW9uLlRJVExFX0JBUik7Ci0JCWNyZWF0ZVRyZWVDb250ZW50KHRvb2xraXQsIHRyZWVTZWN0aW9uKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQkvLyBmaW5hbGx5IHNldCB0aGUgaW5wdXQuCi0JCS8vIFJvb3RDb250ZW50IGlucHV0Tm9kZSA9IG5ldyBSb290Q29udGVudChjbG9zdXJlCi0JCS8vIC5nZXRDb25maWd1cmF0aW9uRmFjdG9yeSgpLmdldE1ldGhvZFBsdWdpbnMoKSk7Ci0JCXNldElucHV0KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRyZWUgY29udGVudAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogQHBhcmFtIHNlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVUcmVlQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0LCBTZWN0aW9uIHNlY3Rpb24pIHsKLQkJc2VjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnQpOyAvLyROT04tTkxTLTEkCi0JCXNlY3Rpb24KLQkJCQkuc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudERlc2NyaXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlzZWN0aW9uLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQotCQlDb21wb3NpdGUgc2VjdGlvbkNsaWVudCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQlzZWN0aW9uLnNldENsaWVudChzZWN0aW9uQ2xpZW50KTsKLQkJR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXNlY3Rpb25DbGllbnQuc2V0TGF5b3V0KGdsKTsKLQkJZ2wubnVtQ29sdW1ucyA9IDY7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCgKLQkJCQlzZWN0aW9uQ2xpZW50LmdldFBhcmVudCgpLAotCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkNPTkZJR1VSQVRJT05fRURJVE9SX0FMTF9DT05URVhUKTsKLQotCQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbkNsaWVudCk7Ci0JCXsKLQkJCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSA2OwotCQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDY7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gMzsKLQkJCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQl9Ci0KLQkJaGlkZUJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgIiIsIFNXVC5QVVNIIC8vJE5PTi1OTFMtMSQKLQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJaGlkZUJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImhpZGVVbmNoZWNrZWRFbGVtLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQloaWRlQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX2hpZGVUb29sVGlwKTsgLy8kTk9OLU5MUy0xJAotCQloaWRlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCkpOwotCi0JCWZpeFdhcm5pbmdCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsICIiLCBTV1QuUFVTSCk7IC8vJE5PTi1OTFMtMSQKLQkJZml4V2FybmluZ0J1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0U2hhcmVkSW1hZ2UoImFkZHJlZl9jby5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZml4V2FybmluZ0J1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9BZGRNaXNzaW5nVG9vbFRpcCk7IC8vJE5PTi1OTFMtMSQKLQkJZml4V2FybmluZ0J1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQpKTsKLQotCQkvLyBBZGQgdGhlIGNsb3N1cmUgYnV0dG9uLgotCQljbG9zdXJlQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCAiIiwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkCi0JCWNsb3N1cmVCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJjbG9zdXJlX2NvLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQljbG9zdXJlQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX01ha2VDbG9zdXJlVG9vbFRpcCk7IC8vJE5PTi1OTFMtMSQKLQkJY2xvc3VyZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQpKTsKLQkJLy8gY2xvc3VyZUJ1dHRvbi5zZXRUZXh0KCIiKTsKLQotCQllcnJvckJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgIiIsIFNXVC5QVVNIKTsgLy8kTk9OLU5MUy0xJAotCQllcnJvckJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJInNob3dDb25maWdFcnJvci5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZXJyb3JCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfU2hvd0Vycm9yVG9vbFRpcCk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ECi0JCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IDM7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQllcnJvckJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJfQotCi0JCUxhYmVsIHRyZWVUaXRsZUxhYmVsID0gdG9vbGtpdAotCQkJCS5jcmVhdGVMYWJlbCgKLQkJCQkJCXNlY3Rpb25DbGllbnQsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9UcmVlVGl0bGVMYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HCi0JCQkJCXwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRU5EKTsKLQkJCXRyZWVUaXRsZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSA2OwotCQl9Ci0KLQkJLy8gQ3JlYXRlIFZpZXdlciBhbmQgSGFuZGxlIExpc3RlbmVyIGZvciB0aGUgdmlld2VyLgotCQljcmVhdGVWaWV3ZXIoc2VjdGlvbkNsaWVudCk7Ci0KLQkJTGFiZWwgZWxlbURlc3BMYWJlbCA9IHRvb2xraXQKLQkJCQkuY3JlYXRlTGFiZWwoc2VjdGlvbkNsaWVudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGdkMSA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZDEuaG9yaXpvbnRhbFNwYW4gPSA2OwotCQllbGVtRGVzcExhYmVsLnNldExheW91dERhdGEoZ2QxKTsKLQotCQllbGVtRGVzcENvbnRlbnRUZXh0ID0gdG9vbGtpdC5jcmVhdGVUZXh0KHNlY3Rpb25DbGllbnQsICIiLCBTV1QuTk9ORSAvLyROT04tTkxTLTEkCi0JCQkJfCBTV1QuTVVMVEkgfCBTV1QuUkVBRF9PTkxZIHwgU1dULldSQVApOwotCQlHcmlkRGF0YSBnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QyLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlnZDIuaG9yaXpvbnRhbFNwYW4gPSA2OwotCQlnZDIuaGVpZ2h0SGludCA9IDUwOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHNlY3Rpb25DbGllbnQpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihidXR0b25Db21wb3NpdGUpOwotCQllbGVtRGVzcENvbnRlbnRUZXh0LnNldExheW91dERhdGEoZ2QyKTsKLQotCQloaWRlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWhpZGVCdXR0b24uc2V0VmlzaWJsZSh0cnVlKTsKLQkJZXJyb3JCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJZXJyb3JCdXR0b24uc2V0VmlzaWJsZSh0cnVlKTsKLQkJZml4V2FybmluZ0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQlmaXhXYXJuaW5nQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7Ci0JCWNsb3N1cmVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJY2xvc3VyZUJ1dHRvbi5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29uZmlndXJhdGlvbkNsb3N1cmUoKSB7Ci0JCS8vIHJlZnJlc2ggY29uZmlndXJhdGlvbiBmcm9tIGVkaXRvcgotCQkvLwotCQlGb3JtRWRpdG9yIGVkaXRvciA9IGdldEVkaXRvcigpOwotCQlpZihlZGl0b3IgIT0gbnVsbCkgewotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQlpZihpbnB1dCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgewotCQkJCWNvbmZpZyA9ICgoQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KWlucHV0KS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWNsb3N1cmUgPSBuZXcgQ29uZmlndXJhdGlvbkNsb3N1cmUoY29uZmlnKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gZmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVDb25maWdGYWN0b3J5KCkgewotCQkvLyBsb2FkaW5nIHRoZSBjb25maWd1cmF0aW9uIGNsb3N1cmUgbWlnaHQgYmUgc2xvdywKLQkJLy8gZGlzcGxheSBhIHByb2dyZXNzIGJhcgotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQljcmVhdGVDb25maWd1cmF0aW9uQ2xvc3VyZSgpOwotCQkJfQotCi0JCX07Ci0KLQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfTG9hZGluZ01lc3NhZ2UpOyAvLyROT04tTkxTLTEkCi0KLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJLy8gQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBjb25maWdGYWN0b3J5LmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWNvbnRQcm92aWRlciA9IG5ldyBDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyKC8vY29uZmlnRmFjdG9yeSwKLQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIKLQkJCQkuc2V0TGFiZWxQcm92aWRlcihuZXcgQ29uZmlnUGFja2FnZUxhYmVsUHJvdmlkZXIoY29udFByb3ZpZGVyKSk7Ci0KLQkJY29uZmlnRmlsdGVyID0gbmV3IENvbmZpZ1RyZWVGaWx0ZXIoY2xvc3VyZSk7Ci0JCXRyZWVWaWV3ZXIuYWRkRmlsdGVyKGNvbmZpZ0ZpbHRlcik7Ci0KLQkJLy8gc2hvdyB0aGUgbWVzc2FnZSB2aWV3IGlmIHRoZXJlIGlzIGVycm9yCi0JCXVwZGF0ZU1lc3NhZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBzZWN0aW9uQ2xpZW50KSB7Ci0KLQkJc2VjdGlvbkNsaWVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlzZWN0aW9uQ2xpZW50LnNldExheW91dChsYXlvdXQpOwotCQkvLyBjcmVhdGUgdGhlIGxpYnJhcnkgdHJlZSB2aWV3ZXIKLQkJdHJlZVZpZXdlciA9IG5ldyBDb25maWd1cmF0aW9uVmlld2VyKHNlY3Rpb25DbGllbnQpOwotCQkvLyB0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RICi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSAyMDA7Ci0JCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWluaXRpYWxpemVDb25maWdGYWN0b3J5KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJYWRkRWRpdG9yU2V0Rm9jdXNMaXNlbmVycygpOwkJCi0JCQotCQlhY3Rpb25NZ3IgPSAoKENvbmZpZ3VyYXRpb25FZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCS8vIG5hbWVUZXh0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJLy8gcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkvLyBpZiAoaXNUZXh0Tm9uRW1wdHkobmFtZVRleHQpKSB7Ci0JCS8vIFN0cmluZyBuYW1lID0gU3RyVXRpbC5tYWtlVmFsaWRGaWxlTmFtZShuYW1lVGV4dC5nZXRUZXh0KCkpOwotCQkvLyBpZiAoIW5hbWUuZXF1YWxzKGNvbmZpZy5nZXROYW1lKCkpKSB7Ci0JCS8vIGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGNvbmZpZywKLQkJLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJLy8gbmFtZSwgLTEpOwotCQkvLyBmb3JtLnNldFRleHQoZm9ybVByZWZpeCArIGNvbmZpZy5nZXROYW1lKCkpOwotCQkvLyBuYW1lVGV4dC5zZXRUZXh0KG5hbWUpOwotCQkvLyB9Ci0JCS8vIH0gZWxzZSB7Ci0JCS8vIC8vIERpc3BsYXkgYSB3YXJuaW5nIGRpYWxvZyBmb3IgZW1wdHkgTmFtZS4KLQkJLy8gbmFtZVRleHQuc2V0VGV4dChjb25maWcuZ2V0TmFtZSgpKTsKLQkJLy8gTWVzc2FnZURpYWxvZy5vcGVuV2FybmluZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCS8vIC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkvLyAiRW50ZXIgQ29uZmlndXJhdGlvbiBOYW1lIiwKLQkJLy8gIk5hbWUgZmllbGQgY2Fubm90IGJlIGVtcHR5ISIpOwotCQkvLyB9Ci0JCS8vIC8vIGNvbmZpZy5zZXROYW1lKFN0clV0aWwubWFrZVZhbGlkRmlsZU5hbWUobmFtZVRleHQuZ2V0VGV4dCgpKSk7Ci0JCS8vIC8vIGZvcm0uc2V0VGV4dChmb3JtUHJlZml4ICsgY29uZmlnLmdldE5hbWUoKSk7Ci0JCS8vIH0KLQkJLy8gfSk7Ci0JCS8vIGRlc3BUZXh0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJLy8gcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkvLyAvLyBjb25maWcuc2V0QnJpZWZEZXNjcmlwdGlvbihTdHJVdGlsLmdldFBsYWluVGV4dChkZXNwVGV4dAotCQkvLyAvLyAuZ2V0VGV4dCgpKSk7Ci0JCS8vIFN0cmluZyBkZXNjMSA9IGRlc3BUZXh0LmdldFRleHQoKTsKLQkJLy8gaWYgKCFkZXNjMS5lcXVhbHMoY29uZmlnLmdldEJyaWVmRGVzY3JpcHRpb24oKSkpIHsKLQkJLy8gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgY29uZmlnLAotCQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkvLyAuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCksCi0JCS8vIGRlc2MxLCAtMSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9KTsKLQkJY2xvc3VyZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWFrZUNsb3N1cmUoKTsKLQkJCX07Ci0JCX0pOwotCQlmaXhXYXJuaW5nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlmaXhXYXJuaW5nKCk7Ci0JCQl9OwotCQl9KTsKLQkJZXJyb3JCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNob3dFcnJvcnMoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JCWhpZGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNob3dIaWRlRWxlbWVudHMoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JCXRyZWVWaWV3ZXIuYWRkVHJlZUxpc3RlbmVyKG5ldyBJVHJlZVZpZXdlckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdHJlZUNvbGxhcHNlZChUcmVlRXhwYW5zaW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQkJCQlleHBhbmRlZEVsZW1lbnRzLnJlbW92ZShlbGVtZW50KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgdHJlZUV4cGFuZGVkKFRyZWVFeHBhbnNpb25FdmVudCBldmVudCkgewotCQkJCU9iamVjdCBlbGVtZW50ID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCQkJCWV4cGFuZGVkRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCi0JCQkJLy8gLy8gdGhpcyBpcyBhIHF1aWNrIGRpcnR5IGZpeCBmb3IgY2hlY2sgc3RhdGUgaW5pdGlhbGl6ZSBpc3N1ZQotCQkJCS8vIC8vIGJldHRlciBzb2x1dGlvbiBsYXRlci4ganhpIDA3LzAxLzA1Ci0JCQkJLy8gdXBkYXRlVHJlZSgpOwotCQkJCS8vCQkJCQotCQkJCS8vIC8vIHJlc3RvcmUgdGhlIGNoZWNrIHN0YXRlIG9mIHRoZSBVSSBlbGVtZW50cwotCQkJCS8vIE9iamVjdCBvYmogPSBldmVudC5nZXRFbGVtZW50KCk7Ci0JCQkJLy8gYm9vbGVhbiBwYXJlbnRTdGF0ZSA9IHRyZWVWaWV3ZXIuZ2V0Q2hlY2tlZChvYmopOwotCQkJCS8vCQkJCQotCQkJCS8vIENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIgY3AgPQotCQkJCS8vIChDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyKXRyZWVWaWV3ZXIuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCQkJLy8gT2JqZWN0W10gY2hpbGRyZW4gPSBjcC5nZXRDaGlsZHJlbihvYmopOwotCQkJCS8vIGlmICggY2hpbGRyZW4gIT0gbnVsbCApCi0JCQkJLy8gewotCQkJCS8vIGZvciAoIGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotCQkJCS8vIHsKLQkJCQkvLyBib29sZWFuIGNoZWNrID0gZmFsc2U7Ci0JCQkJLy8gLy8gaWYgdGhlIGZvbGRlciBpcyBhIFVJIGZvbGRlciwga2VlcCB0aGUgY2hlY2sgc3RhdGUKLQkJCQkvLyBpZiAoIGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luICkKLQkJCQkvLyB7Ci0JCQkJLy8gY2hlY2sgPQotCQkJCS8vIGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5jb250YWlucyhjaGlsZHJlbltpXSk7Ci0JCQkJLy8gfQotCQkJCS8vIGVsc2UgaWYgKCBjaGlsZHJlbltpXSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UgKQotCQkJCS8vIHsKLQkJCQkvLyBjaGVjayA9Ci0JCQkJLy8gY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jb250YWlucyhjaGlsZHJlbltpXSk7Ci0JCQkJLy8gfQotCQkJCS8vIGVsc2UKLQkJCQkvLyB7Ci0JCQkJLy8gY2hlY2sgPSBwYXJlbnRTdGF0ZTsKLQkJCQkvLyB9Ci0JCQkJLy8JCQkJCQkKLQkJCQkvLyBib29sZWFuIHJldCA9IHRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChjaGlsZHJlbltpXSwgY2hlY2spOwotCQkJCS8vIGlmICggcmV0ID09IGZhbHNlKQotCQkJCS8vIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNhbid0IHNldCBzdGF0ZSIpOwotCQkJCS8vIH0KLQkJCQkvLwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGxpc3RlbiB0byB0aGUgc2VsZWN0aW9uIGNoYW5nZSBvZiB0aGUgY3VycmVudCB0cmVlIHZpZXdlcgotCQlpZiAoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID09IG51bGwpIHsKLQkJCS8vIENyZWF0ZSB0aGUgbGlzdGVuZXIKLQkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCS8vIFRoaXMganVzdCBub3RpZmllcyB0aG9zZSB0aGluZ3MgdGhhdCBhcmUgYWZmZWN0ZWQgYnkgdGhlCi0JCQkJLy8gc2VjdGlvbi4KLQkJCQkvLwotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0vLwkJCQkJU3lzdGVtLm91dAotLy8JCQkJCQkJLnByaW50bG4oQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfU2VsZWN0ZWQgKyBldmVudC5nZXRTZWxlY3Rpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc2V0U2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9OwotCi0JCQl0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gYWRkIGEgY2hlY2sgc3RhdGUgY2hhbmdlIGxpc3RlbmVyCi0JCXRyZWVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCW1vZGlmaWVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJYm9vbGVhbiBjaGVja2VkID0gZXZlbnQuZ2V0Q2hlY2tlZCgpOwotCQkJCXVwZGF0ZUNoZWNrU3RhdGVzKGV2ZW50LmdldEVsZW1lbnQoKSwgY2hlY2tlZCk7Ci0KLQkJCQkvKgotCQkJCSAqIC8vIHNhdmUgdGhlIHByZXZpb3VzIGludmFsaWQgZWxlbWVudHMgTGlzdCBpbnZhbGlkID0KLQkJCQkgKiBjbG9zdXJlLmdldEludmFsaWRFbGVtZW50cygpOwotCQkJCSAqIAotCQkJCSAqIGNsb3N1cmUuc2V0U2VsZWN0aW9ucyh0cmVlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpKTsKLQkJCQkgKiAKLQkJCQkgKiBpZiAoIGNvbmZpZ0ZpbHRlci5pc0hpZGluZygpICkgeyB0cmVlVmlld2VyLnJlZnJlc2goKTsgfSBlbHNlIHsgLy8KLQkJCQkgKiBnZXQgdGhlIG5ldyBlcnJvciBlbGVtZW50cywgYWRkIHRvIHRoZSBwcmV2aW91cyBlcnJvcgotCQkJCSAqIGVsZW1lbnRzLCAvLyBhbmQgdXBkYXRlIHRoZW0gdG8gdXBkYXRlIHRoZSBlcnJvci93YXJuaW5nCi0JCQkJICogaW1hZ2VzIGludmFsaWQuYWRkQWxsKGNsb3N1cmUuZ2V0SW52YWxpZEVsZW1lbnRzKCkpOyAvLyBhbHNvCi0JCQkJICogYWRkIHRoZSBVSSBmb2xkZXJzIENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIgY3AgPQotCQkJCSAqIChDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyKXRyZWVWaWV3ZXIuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCQkJICogaW52YWxpZC5hZGRBbGwoY3AuZ2V0VUlFbGVtZW50cygpKTsKLQkJCQkgKiAKLQkJCQkgKiB0cmVlVmlld2VyLnVwZGF0ZShpbnZhbGlkLnRvQXJyYXkoKSwgbnVsbCk7IH0KLQkJCQkgKi8KLQotCQkJCXNob3dFcnJvcnMoKTsKLQkJCQlpZiAoIXNhdmVDb25maWd1cmF0aW9uKCkpIHsKLQkJCQkJdXBkYXRlQ2hlY2tTdGF0ZXMoZXZlbnQuZ2V0RWxlbWVudCgpLCBmYWxzZSk7Ci0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RpZmllZEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQl0cmVlVmlld2VyLnNldENoZWNrZWQobW9kaWZpZWRFbGVtZW50cy5nZXQoaSksIGZhbHNlKTsKLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyB0cmVlVmlld2VyLmFkZFRyZWVMaXN0ZW5lcihuZXcgSVRyZWVWaWV3ZXJMaXN0ZW5lcigpewotCQkvLwotCQkvLyBwdWJsaWMgdm9pZCB0cmVlQ29sbGFwc2VkKFRyZWVFeHBhbnNpb25FdmVudCBldmVudCkgewotCQkvLwkJCQkKLQkJLy8gfQotCQkvLwotCQkvLyBwdWJsaWMgdm9pZCB0cmVlRXhwYW5kZWQoVHJlZUV4cGFuc2lvbkV2ZW50IGV2ZW50KSB7Ci0JCS8vIC8vdXBkYXRlQ29uZmlnU2VsZWN0aW9uKCk7Ci0JCS8vCi0JCS8vIC8vIHJlc3RvcmUgdGhlIGNoZWNrIHN0YXRlIG9mIHRoZSBVSSBlbGVtZW50cwotCQkvLyBPYmplY3Qgb2JqID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCQkvLyBib29sZWFuIHBhcmVudFN0YXRlID0gdHJlZVZpZXdlci5nZXRDaGVja2VkKG9iaik7Ci0JCS8vCQkJCQotCQkvLyBDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyIGNwID0KLQkJLy8gKENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIpdHJlZVZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJLy8gT2JqZWN0W10gY2hpbGRyZW4gPSBjcC5nZXRDaGlsZHJlbihvYmopOwotCQkvLyBpZiAoIGNoaWxkcmVuICE9IG51bGwgKQotCQkvLyB7Ci0JCS8vIGZvciAoIGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotCQkvLyB7Ci0JCS8vIGJvb2xlYW4gY2hlY2sgPSBmYWxzZTsKLQkJLy8gLy8gaWYgdGhlIGZvbGRlciBpcyBhIFVJIGZvbGRlciwga2VlcCB0aGUgY2hlY2sgc3RhdGUKLQkJLy8gaWYgKCBjaGlsZHJlbltpXSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiApCi0JCS8vIHsKLQkJLy8gY2hlY2sgPSBjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuY29udGFpbnMoY2hpbGRyZW5baV0pOwotCQkvLyB9Ci0JCS8vIGVsc2UgaWYgKCBjaGlsZHJlbltpXSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UgKQotCQkvLyB7Ci0JCS8vIGNoZWNrID0gY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jb250YWlucyhjaGlsZHJlbltpXSk7Ci0JCS8vIH0KLQkJLy8gZWxzZQotCQkvLyB7Ci0JCS8vIGNoZWNrID0gcGFyZW50U3RhdGU7Ci0JCS8vIH0KLQkJLy8JCQkJCQkKLQkJLy8gYm9vbGVhbiByZXQgPSB0cmVlVmlld2VyLnNldENoZWNrZWQoY2hpbGRyZW5baV0sIGNoZWNrKTsKLQkJLy8gaWYgKCByZXQgPT0gZmFsc2UpCi0JCS8vIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJDYW4ndCBzZXQgc3RhdGUiKTsKLQkJLy8gfQotCQkvLwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8JCQkJCi0JCS8vIH19KTsKLQotCQkvLyBsaXN0ZW4gdG8gdGhlIGxpYnJhcnkgY2hhbmdlcyBhbmQgYXV0b21hdGljYWxseSB1cGRhdGUgdGhlCi0JCS8vIGNvbmZpZ3VyYXRpb24gdmlldwotCQlsaWJMaXN0ZW5lciA9IG5ldyBJTGlicmFyeUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjaGFuZ2VkSXRlbXMpIHsKLQkJCQkvLyBmb3IgcGVyZm9ybWFuY2UgcmVhc29uLCB3ZSBzaG91bGQgbm90IHJlc3BvbnNlIHRvIGV2ZXJ5Ci0JCQkJLy8gbGlicmFyeSBjaGFuZ2UKLQkJCQkvLyBvbmx5IGNvdmVyIHBhY2thZ2UgYW5kIHBsdWdpbiBjaGFuZ2VzCi0JCQkJaWYgKG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ERUxFVEVECi0JCQkJCQl8fCBvcHRpb24gPT0gSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTkVXQ0hJTEQKLQkJCQkJCXx8IG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ORVdDSElMRCkgewotCQkJCQlpZiAoY2hhbmdlZEl0ZW1zICE9IG51bGwgJiYgY2hhbmdlZEl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQkJCU9iamVjdCBvID0gY2hhbmdlZEl0ZW1zLnRvQXJyYXkoKVswXTsKLQkJCQkJCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luCi0JCQkJCQkJCXx8IG8gaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJCQkJCXx8IG8gaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQkJCXJlSW5pdGlhbGl6ZUNvbmZpZ0ZhY3RvcnkoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCQkJdXBkYXRlQ2hlY2tTdGF0ZXMoKTsKLQkJCQkJCQlzaG93RXJyb3JzKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQltYW5hZ2VyLmFkZExpc3RlbmVyKGxpYkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNob3dIaWRlRWxlbWVudHMoKSB7Ci0JCWNvbmZpZ0ZpbHRlci5zZXRIaWRlKCk7Ci0JCXVwZGF0ZUNoZWNrU3RhdGVzKCk7IC8vIG5lZGVkIHRvIGhhdmUgdGhpcyB0byB1cGRhdGUgdGhlIGNoZWNrIHN0YXR1cwotCX0KLQotCS8qKgotCSAqIHRoZSBVSSBzZWxlY3Rpb25zIGNvbnRhaW5zIFVJIGZvbGRlcnMsIG5lZWQgdG8gY29udmVydCB0byB0aGUKLQkgKiBjb3JyZXNwb25kaW5nIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbnMKLQkgKiAKLQkgKiBAcmV0dXJuIE9iamVjdFtdIHRoZSBjb252ZXJ0ZWQgc2VsZWN0aW9ucwotCSAqLwotCXByb3RlY3RlZCBPYmplY3RbXSBnZXRDb252ZXJ0ZWRTZWxlY3Rpb25zKCkgewotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlPYmplY3RbXSBzZWxzID0gdHJlZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQotCQlDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyIGNwID0gKENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIpIHRyZWVWaWV3ZXIKLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2Vscy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IHNlbCA9IGNwLmdldFVJVGFyZ2V0RWxlbWVudChzZWxzW2ldKTsKLQkJCWlmIChzZWwgIT0gbnVsbCAmJiAhaXRlbXMuY29udGFpbnMoc2VsKSkgewotCQkJCWl0ZW1zLmFkZChzZWwpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGl0ZW1zLnRvQXJyYXkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzaG93RXJyb3JzKCkgewotCQkvLyBDb25maWd1cmF0aW9uQ2xvc3VyZSBjID0gY2xvc3VyZTsKLQkJLy8gYy5zZXRTZWxlY3Rpb25zKHRyZWVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpOwotCi0JCS8vIHNhdmUgdGhlIHByZXZpb3VzIGludmFsaWQgZWxlbWVudHMKLQkJTGlzdCBpbnZhbGlkID0gY2xvc3VyZS5nZXRJbnZhbGlkRWxlbWVudHMoKTsKLQotCQkvLyBjb252ZXJ0IHNlbGVjdGlvbnMgdG8gbWV0aG9kIHBsdWdpbnMgYW5kIG1ldGhvZCBwYWNrYWdlcwotCQljbG9zdXJlLnNldFNlbGVjdGlvbnMoZ2V0Q29udmVydGVkU2VsZWN0aW9ucygpKTsKLQotCQlpZiAoY29uZmlnRmlsdGVyLmlzSGlkaW5nKCkpIHsKLQkJCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQl9IGVsc2UgewotCQkJLy8gZ2V0IHRoZSBuZXcgZXJyb3IgZWxlbWVudHMsIGFkZCB0byB0aGUgcHJldmlvdXMgZXJyb3IgZWxlbWVudHMsCi0JCQkvLyBhbmQgdXBkYXRlIHRoZW0gdG8gdXBkYXRlIHRoZSBlcnJvci93YXJuaW5nIGltYWdlcwotCQkJaW52YWxpZC5hZGRBbGwoY2xvc3VyZS5nZXRJbnZhbGlkRWxlbWVudHMoKSk7Ci0KLQkJCS8vIGFsc28gYWRkIHRoZSBVSSBmb2xkZXJzCi0JCQlDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyIGNwID0gKENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIpIHRyZWVWaWV3ZXIKLQkJCQkJLmdldENvbnRlbnRQcm92aWRlcigpOwotCQkJaW52YWxpZC5hZGRBbGwoY3AuZ2V0VUlFbGVtZW50cygpKTsKLQotCQkJdHJlZVZpZXdlci51cGRhdGUoaW52YWxpZC50b0FycmF5KCksIG51bGwpOwotCQl9Ci0KLQkJdXBkYXRlTWVzc2FnZSgpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI3JlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNnZXRTZWxlY3Rpb24oKQotCSAqLwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGN1cnJlbnRTZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNzZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQljdXJyZW50U2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCi0JCWZvciAoSXRlcmF0b3IgbGlzdGVuZXJzID0gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5pdGVyYXRvcigpOyBsaXN0ZW5lcnMKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBsaXN0ZW5lcnMKLQkJCQkJLm5leHQoKTsKLQkJCWxpc3RlbmVyCi0JCQkJCS5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgc2VsZWN0aW9uKSk7Ci0JCX0KLQotCQkvLyBub3RpZnkgdGhlIG1lc3NhZ2UgdmlldwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJT2JqZWN0W10gc2VsT2JqcyA9IHNlbC50b0FycmF5KCk7Ci0JCWlmICgoc2VsT2JqcyAhPSBudWxsKSAmJiAoc2VsT2Jqcy5sZW5ndGggPiAwKSkgewotCQkJT2JqZWN0IG5vZGUgPSBzZWxPYmpzWzBdOwotCQkJaWYgKGNsb3N1cmUuZ2V0RXJyb3Iobm9kZSkgIT0gbnVsbCkgewotCQkJCWdldE1lc3NhZ2VWaWV3KCkuc2hvd0Vycm9yKG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gdXBkYXRlIHRoZSBkZXNjcmlwdGlvbiBmaWVsZAotCQlPYmplY3QgbyA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlTdHJpbmcgYnJpZWZEZXNjID0gKChNZXRob2RFbGVtZW50KSBvKS5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQllbGVtRGVzcENvbnRlbnRUZXh0LnNldFRleHQoYnJpZWZEZXNjICE9IG51bGwgPyBicmllZkRlc2MgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JfQotCi0JLyoqCi0JICogTWFrZSBjb25maWd1cmF0aW9uIGNsb3N1cmUKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1ha2VDbG9zdXJlKCkgewotCQkvLyBzZXQgdGhlIHNlbGVjdGlvbnMgdG8gdGhlIGNsb3N1cmUKLQkJQ29uZmlndXJhdGlvbkNsb3N1cmUgYyA9IGNsb3N1cmU7Ci0JCS8vIGMuc2V0U2VsZWN0aW9ucyh0cmVlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpKTsKLQkJYy5tYWtlQ2xvc3VyZSgpOwotCi0JCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCi0JCXVwZGF0ZUNoZWNrU3RhdGVzKCk7Ci0KLQkJc2F2ZUNvbmZpZ3VyYXRpb24oKTsKLQotCQl1cGRhdGVNZXNzYWdlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBGaXggYWxsIHdhcm5pbmdzIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpeFdhcm5pbmcoKSB7Ci0JCUNvbmZpZ3VyYXRpb25DbG9zdXJlIGMgPSBjbG9zdXJlOwotCQkvLyBjLnNldFNlbGVjdGlvbnModHJlZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKSk7Ci0KLQkJYy5maXhQcm9ibGVtcygpOwotCi0JCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQl1cGRhdGVDaGVja1N0YXRlcygpOwotCi0JCXNhdmVDb25maWd1cmF0aW9uKCk7Ci0KLQkJdXBkYXRlTWVzc2FnZSgpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNoZWNrU3RhdGVzKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGNoZWNrZWQpIHsKLQotCQkvLyBPYmplY3QgZWxlbWVudCA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQotCQlpZiAoY2hlY2tlZCA9PSB0cnVlKSB7Ci0JCQlJVHJlZUNvbnRlbnRQcm92aWRlciBjcCA9IChJVHJlZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlcgotCQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCQljaGVja1BhcmVudChjcCwgZWxlbWVudCk7Ci0JCQkvLyB0cmVlVmlld2VyLnNldENoZWNrZWQoZWxlbWVudCwgdHJ1ZSk7Ci0JCX0gZWxzZQotCQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKGVsZW1lbnQsIGZhbHNlKTsKLQotCQlzZWxlY3Rpb25DaGlsZHJlbihlbGVtZW50LCBjaGVja2VkKTsKLQotCX0KLQotCS8qKgotCSAqIFNlbGVjdC91bnNlbGVjdCBhbGwgdGhlIGNoaWxkcmVuIGZvciB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNoZWNrZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGlsZHJlbihPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBjaGVja2VkKSB7Ci0JCUlUcmVlQ29udGVudFByb3ZpZGVyIGNwID0gKElUcmVlQ29udGVudFByb3ZpZGVyKSB0cmVlVmlld2VyCi0JCQkJLmdldENvbnRlbnRQcm92aWRlcigpOwotCQlPYmplY3RbXSBjaGlsZHMgPSBjcC5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHMubGVuZ3RoOyBpKyspIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChjaGlsZHNbaV0sIGNoZWNrZWQpOwotCQkJc2VsZWN0aW9uQ2hpbGRyZW4oY2hpbGRzW2ldLCBjaGVja2VkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVDaGVja1N0YXRlcygpIHsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCS8vIHRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0KLQkJdHJ5IHsKLQkJCU9iamVjdCBjb250ZW50ID0gdHJlZVZpZXdlci5nZXRJbnB1dCgpOwotCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0KLQkJCQkvLyBzZXQgdGhlIHNlbGVjdGlvbiBzaW5jZSB0aGUgY29sc3VyZSBtYXkgY2hhbmdlZCB3aXRoIG1ha2UKLQkJCQkvLyBjbG9zdXJlIG9yIGZpeCBlcnJvcgotCQkJCS8vIHRyZWVWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKGNsb3N1cmUKLQkJCQkvLyAuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCU9iamVjdFtdIHNlbGVjdGlvbkxpc3QgPSBjbG9zdXJlLmdldFNlbGVjdGlvbigpOwotCQkJCUNvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIgY3AgPSAoQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlcgotCQkJCQkJLmdldENvbnRlbnRQcm92aWRlcigpOwotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gc2VsZWN0aW9uTGlzdFtpXTsKLQotCQkJCQljaGVja1BhcmVudChjcCwgZWxlbWVudCk7Ci0JCQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChlbGVtZW50LCB0cnVlKTsKLQkJCQl9Ci0KLQkJCQkvLyBhbHNvIHNldCB0aGUgVUkgZm9sZGVycyBpZiB0aGUgY29ycmVzcG9uZGluZyBwYWNrYWdlIGlzCi0JCQkJLy8gc2VsZWN0ZWQKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbmV3IEFycmF5TGlzdChjcC5nZXRVSUVsZW1lbnRzKCkpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0Lm5leHQoKTsKLQkJCQkJT2JqZWN0IG8gPSBjcC5nZXRVSVRhcmdldEVsZW1lbnQoZWxlbWVudCk7Ci0JCQkJCWlmIChvICE9IG51bGwgJiYgY2xvc3VyZS5pc1NlbGVjdGVkKG8pKSB7Ci0JCQkJCQljaGVja1BhcmVudChjcCwgZWxlbWVudCk7Ci0JCQkJCQl0cmVlVmlld2VyLnNldENoZWNrZWQoZWxlbWVudCwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyByZXN0b3JlIHRoZSBleHBhbmQgc3RhdGUKLQkJCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkRWxlbWVudHMoZXhwYW5kZWRFbGVtZW50cy50b0FycmF5KCkpOwotCi0JCQl9Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1BhcmVudChJVHJlZUNvbnRlbnRQcm92aWRlciBjcCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSAvKgotCQkJCQkJCQkJCQkJCQkJCSAqIHx8IGVsZW1lbnQgPT0KLQkJCQkJCQkJCQkJCQkJCQkgKiBjdXJyZW50Um9vdE5vZGUKLQkJCQkJCQkJCQkJCQkJCQkgKi8pIHsKLQkJCXJldHVybjsKLQkJfQotCQltb2RpZmllZEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJT2JqZWN0IHBhcmVudCA9IExpYnJhcnlVdGlsLnVud3JhcChjcC5nZXRQYXJlbnQoZWxlbWVudCkpOwotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChwYXJlbnQsIHRydWUpOwotCQkJLy8gY29uZmlnRmFjdG9yeS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmFkZCgoRU9iamVjdClwYXJlbnQsCi0JCQkvLyBmYWxzZSk7Ci0JCQljaGVja1BhcmVudChjcCwgcGFyZW50KTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogR2V0IGFsbCBwYXJlbnRzCi0JICogQHBhcmFtIGxpc3QKLQkgKiBAcGFyYW0gcGtnCi0JICovCi0JcHVibGljIHZvaWQgZ2V0QWxsUGFyZW50cyhMaXN0IGxpc3QsIE1ldGhvZFBhY2thZ2UgcGtnKSB7Ci0JCU1ldGhvZFBhY2thZ2UgcGFyZW50UGtnID0gKChNZXRob2RQYWNrYWdlKSBwa2cpLmdldFBhcmVudFBhY2thZ2UoKTsKLQkJaWYgKHBhcmVudFBrZyAhPSBudWxsKSB7Ci0JCQlsaXN0LmFkZChwYXJlbnRQa2cpOwotCQkJZ2V0QWxsUGFyZW50cyhsaXN0LCBwYXJlbnRQa2cpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgcGFyZW50cyBmb3IgdGhlIGdpdmVuIGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBib29sZWFuIHNldFBhcmVudHNDaGVja2VkKE9iamVjdCBlbGVtZW50KSB7Ci0JCVdpZGdldCB3aWRnZXQgPSB0cmVlVmlld2VyLnRlc3RGaW5kSXRlbShlbGVtZW50KTsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRyZWVJdGVtKSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKSB3aWRnZXQ7Ci0JCQlpdGVtID0gaXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0JCQl3aGlsZSAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJaXRlbS5zZXRDaGVja2VkKHRydWUpOwotCQkJCWl0ZW0gPSBpdGVtLmdldFBhcmVudEl0ZW0oKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIHJldHVybiBpc0RpcnR5OwotCX0KLQotCS8qKgotCSAqIFNldCBkaXJ0eSBmbGFnCi0JICogQHBhcmFtIGRpcnR5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGlydHkoYm9vbGVhbiBkaXJ0eSkgewotCQlpc0RpcnR5ID0gZGlydHk7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudCBwcm92aWRlciBmb3IgY29uZmlndXJhdGlvbiBwYWNrYWdlcwotCSAqLwotCXB1YmxpYyBjbGFzcyBDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMKLQkJCUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIHsKLQkJLy9wcml2YXRlIENvbmZpZ3VyYXRpb25GYWN0b3J5IGNvbmZpZ0ZhY3Rvcnk7Ci0KLQkJLy8gcHJpdmF0ZSBib29sZWFuIHNob3dNZXRob2RNb2RlbE9ubHkgPSBmYWxzZTsKLQotCQkvLyB0aGVyZSBpcyBhIHByb2JsZW0gaW4gdGhlIHBhc3NlZCBpbiBBZGFwdGVyRmFjdG9yeQotCQkvLyBpdCBjYW4ndCBmaW5kIHRoZSBjb3JyZWN0IHBhcmVudCBmcm9tIHRoZSBjaGlsZAotCQkvLyBuZWVkIHRvIGJ1aWxkIGEgbWFwIG9mIGNoaWxkIHRvIGl0J3MgcGFyZW50IGlmIHRoZSBjaGlsZCBpcyBhIFVJCi0JCS8vIGZvbGRlcgotCQkvLyBjbGVhciB0aGUgbWFwIHdoZW4gdGhlIGlucHV0IGlzIHNldAotCQlNYXAgY2hpbGRVSVBhcmVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJTGlzdCB1aUZvbGRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHVibGljIExpc3QgZ2V0VUlFbGVtZW50cygpIHsKLQkJCXJldHVybiB1aUZvbGRlcnM7Ci0JCX0KLQotCQkvKioKLQkJICogQ3JlYXRlIGFuIGluc3RhbmNlCi0JCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCQkgKi8KLQkJcHVibGljIENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIoLy9Db25maWd1cmF0aW9uRmFjdG9yeSBjb25maWdGYWN0b3J5LAotCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LyogLCBib29sZWFuIHNob3dNZXRob2RNb2RlbE9ubHkgKi8pIHsKLQkJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCS8vIHRoaXMuc2hvd01ldGhvZE1vZGVsT25seSA9IHNob3dNZXRob2RNb2RlbE9ubHk7Ci0JCX0KLQotCQkvKgotCQlwdWJsaWMgQ29uZmlndXJhdGlvbkZhY3RvcnkgZ2V0Q29uZmlnRmFjdG9yeSgpIHsKLQkJCXJldHVybiBjb25maWdGYWN0b3J5OwotCQl9Ci0JCSovCi0KLQkJLy8gcHVibGljIHZvaWQgc2V0U2hvd01ldGhvZE1vZGVsT25seShib29sZWFuIHNob3dPbmx5KSB7Ci0JCS8vIHNob3dNZXRob2RNb2RlbE9ubHkgPSBzaG93T25seTsKLQkJLy8gfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCS8vIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9vdENvbnRlbnQpIHsKLQkJCS8vIHJldHVybiAoKFJvb3RDb250ZW50KSBwYXJlbnRFbGVtZW50KS5nZXRDaGlsZHJlbigpOwotCQkJLy8gfSBlbHNlIHsKLQkJCS8vIGlmIChzaG93TWV0aG9kTW9kZWxPbmx5KSB7Ci0JCQkvLyByZXR1cm4gbnVsbDsKLQkJCS8vIH0gZWxzZSB7Ci0JCQlPYmplY3RbXSBpdGVtcyA9IGdldFZhbGlkSXRlbXMocGFyZW50RWxlbWVudCwgc3VwZXIKLQkJCQkJLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpKTsKLQkJCXJldHVybiBpdGVtczsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJLy8gaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIFJvb3RDb250ZW50KSB7Ci0JCQkvLyByZXR1cm4gKChSb290Q29udGVudCkgaW5wdXRFbGVtZW50KS5nZXRDaGlsZHJlbigpOwotCQkJLy8gfSBlbHNlIHsKLQotCQkJT2JqZWN0W10gaXRlbXMgPSBnZXRWYWxpZEl0ZW1zKGlucHV0RWxlbWVudCwgc3VwZXIKLQkJCQkJLmdldEVsZW1lbnRzKGlucHV0RWxlbWVudCkpOwotCi0JCQkvLyBpZiAoc2hvd01ldGhvZE1vZGVsT25seSAmJiBpdGVtcyAhPSBudWxsKSB7Ci0JCQkvLyBMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJLy8gaWYgKGl0ZW1zW2ldIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkvLyBlbGVtZW50cy5hZGQoaXRlbXNbaV0pOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gcmV0dXJuIGVsZW1lbnRzLnRvQXJyYXkoKTsKLQkJCS8vCi0JCQkvLyB9IGVsc2UgewotCQkJcmV0dXJuIGl0ZW1zOwotCQkJLy8gfQotCQkJLy8gfQotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGlzVUlGb2xkZXIoT2JqZWN0IGUpIHsKLQkJCXJldHVybiAoZSBpbnN0YW5jZW9mIENvbnRlbnRJdGVtUHJvdmlkZXIKLQkJCQkJfHwgZSBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlciB8fCBlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXIgfHwKLQkJCQkJZSBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIKLQkJCS8qCi0JCQkgKiB8fCBlIGluc3RhbmNlb2YgU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIHx8IGUgaW5zdGFuY2VvZgotCQkJICogRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIgfHwgZSBpbnN0YW5jZW9mCi0JCQkgKiBEb21haW5zSXRlbVByb3ZpZGVyIHx8IGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyIHx8Ci0JCQkgKiBlIGluc3RhbmNlb2YgUm9sZVNldHNJdGVtUHJvdmlkZXIgfHwgZSBpbnN0YW5jZW9mCi0JCQkgKiBUb29sc0l0ZW1Qcm92aWRlciB8fCAoZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSAmJgotCQkJICogVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpZSkKLQkJCSAqLwotCQkJKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0VUlUYXJnZXRFbGVtZW50KE9iamVjdCBlKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJcmV0dXJuICgoQ3VzdG9tQ2F0ZWdvcnkpIGUpLmVDb250YWluZXIoKTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnRJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gKChDb250ZW50SXRlbVByb3ZpZGVyKSBlKS5nZXRQYXJlbnQobnVsbCk7Ci0JCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gKChQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIGUpLmdldFBhcmVudChudWxsKTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQlPYmplY3QgdGFyZ2V0ID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBlKS5nZXRUYXJnZXQoKTsKLQkJCQlpZiAodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlyZXR1cm4gdGFyZ2V0OwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwcml2YXRlIE9iamVjdFtdIGdldFZhbGlkSXRlbXMoT2JqZWN0IHBhcmVudCwgT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnRzOwotCQkJfQotCi0JCQlMaXN0IHBrZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJT2JqZWN0IGUgPSBMaWJyYXJ5VXRpbC51bndyYXAoZWxlbWVudHNbaV0pOwotCQkJCWJvb2xlYW4gdWlGb2xkZXIgPSBpc1VJRm9sZGVyKGUpOwotCQkJCWlmICh1aUZvbGRlciB8fCBlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZQotCQkJCQkJfHwgZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlwa2dzLmFkZChlKTsKLQotCQkJCQlpZiAodWlGb2xkZXIpIHsKLQkJCQkJCXVpRm9sZGVycy5hZGQoZSk7Ci0JCQkJCX0KLQotCQkJCQkvLyBpZiB0aGUgcGFyZW50IGlzIGEgVUkgZm9sZGVyLCBtYXAgdGhlIGNoaWxkIHRvIHRoZSBwYXJlbnQKLQkJCQkJLy8gc28gdGhhdCB3ZSBjYW4gZ2V0IHRoZSBwYXJlbnQgbGF0ZXIKLQkJCQkJLy8gaWYgKCAhKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpICkKLQkJCQkJewotCQkJCQkJY2hpbGRVSVBhcmVudE1hcC5wdXQoZSwgcGFyZW50KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCTsgLy8gU3lzdGVtLm91dC5wcmludGxuKCJJZ25vcmVkOiAiICsgZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gcGtncy50b0FycmF5KCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkvLyBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvb3RDb250ZW50KSB7Ci0JCQkvLyByZXR1cm4gbnVsbDsKLQkJCS8vIH0gZWxzZQotCQkJaWYgKGNoaWxkVUlQYXJlbnRNYXAuY29udGFpbnNLZXkoZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gY2hpbGRVSVBhcmVudE1hcC5nZXQoZWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCS8vIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9vdENvbnRlbnQpIHsKLQkJCS8vIHJldHVybiB0cnVlOwotCQkJLy8gfSBlbHNlCi0JCQkvLyBpZiAoc2hvd01ldGhvZE1vZGVsT25seSkgewotCQkJLy8gcmV0dXJuIGZhbHNlOwotCQkJLy8gfSBlbHNlIHsKLQkJCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCQlyZXR1cm4gKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCk7Ci0KLQkJCS8vIHJldHVybiB0cmVlTm9kZVByb3ZpZGVyLmhhc0NoaWxkcmVuKGVsZW1lbnQpOwotCQkJLy8gcmV0dXJuIHN1cGVyLmhhc0NoaWxkcmVuKGVsZW1lbnQpOwotCQkJLy8gfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQlzdXBlci5pbnB1dENoYW5nZWQodmlld2VyLCBvbGRJbnB1dCwgbmV3SW5wdXQpOwotCQkJY2hpbGRVSVBhcmVudE1hcC5jbGVhcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQotCQkJaWYgKChub3RpZmljYXRpb24gaW5zdGFuY2VvZiBJVmlld2VyTm90aWZpY2F0aW9uKSkgewotCQkJCWZpbmFsIElWaWV3ZXJOb3RpZmljYXRpb24gdm50ID0gKElWaWV3ZXJOb3RpZmljYXRpb24pIG5vdGlmaWNhdGlvbjsKLQkJCQlmaW5hbCBPYmplY3QgZWxlbWVudCA9IHZudC5nZXRFbGVtZW50KCk7Ci0JCQkJZmluYWwgQ29uZmlndXJhdGlvblZpZXdlciBjdHJsID0gKChDb25maWd1cmF0aW9uVmlld2VyKSBzdXBlci52aWV3ZXIpOwotCQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgKHZudC5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQURECi0JCQkJCQl8fCB2bnQuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVCkpIHsKLQotCQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJY3RybC5zZXRDaGVja2VkKGVsZW1lbnQsIHRydWUpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQl1aUZvbGRlcnMuY2xlYXIoKTsKLQkJCWNoaWxkVUlQYXJlbnRNYXAuY2xlYXIoKTsKLQkJCS8vY29uZmlnRmFjdG9yeSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMYWJlbCBwcm92aWRlciBmb3IgY29uZmlndXJhdGlvbiBwYWNrYWdlcwotCSAqLwotCXB1YmxpYyBjbGFzcyBDb25maWdQYWNrYWdlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQlDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQotCQkvL0NvbmZpZ3VyYXRpb25GYWN0b3J5IGNvbmZpZ0ZhY3Rvcnk7Ci0KLQkJQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGFmUHJvdmlkZXI7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkJICogQHBhcmFtIGNvbnRlbnRQcm92aWRlcgotCQkgKi8KLQkJcHVibGljIENvbmZpZ1BhY2thZ2VMYWJlbFByb3ZpZGVyKAotCQkJCUNvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCQl0aGlzLmNvbnRlbnRQcm92aWRlciA9IGNvbnRlbnRQcm92aWRlcjsKLQkJCWFmUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcgotCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkvL3RoaXMuY29uZmlnRmFjdG9yeSA9IGNvbnRlbnRQcm92aWRlci5nZXRDb25maWdGYWN0b3J5KCk7Ci0JCX0KLQotCQlwcml2YXRlIEVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZ2V0Rmlyc3RDaGlsZEVycm9yKE9iamVjdCBlKSB7Ci0JCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gbnVsbDsKLQkJCU9iamVjdFtdIGNoaWxkcmVuID0gY29udGVudFByb3ZpZGVyLmdldENoaWxkcmVuKGUpOwotCQkJaWYgKGNoaWxkcmVuID09IG51bGwgfHwgY2hpbGRyZW4ubGVuZ3RoID09IDApIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCU9iamVjdCBvYmplY3QgPSBjaGlsZHJlbltpXTsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQlyZXR1cm4gZ2V0Rmlyc3RDaGlsZEVycm9yKG9iamVjdCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXJyb3IgPSBjbG9zdXJlLmdldEVycm9yKG9iamVjdCk7Ci0JCQkJCWlmIChlcnJvciAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gZXJyb3I7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBlcnJvcjsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIElMYWJlbFByb3ZpZGVyfS5nZXRJbWFnZSBieSBmb3J3YXJkaW5nIGl0IHRvCi0JCSAqIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMKLQkJICoge0BsaW5rIElJdGVtTGFiZWxQcm92aWRlciNnZXRJbWFnZSBJSXRlbUxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2V9Ci0JCSAqLwotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQkJLy8gZGlzYWJsZSBmb3Igbm93IHRpbGwgaXQgd29ya3MKLQkJCUNvbmZpZ3VyYXRpb25DbG9zdXJlIGNvbmZpZzEgPSBjbG9zdXJlOwotCQkJaWYgKGNvbmZpZzEgIT0gbnVsbCkgewotCQkJCS8vIG5vLCB0aGlzIHdpbGwgc2hvdyB0aGUgZXJyb3IgbWFyayBldmVuIGlmIHRoZSBjaGlsZCBoYXMgbm8KLQkJCQkvLyBlcnJvciwgbm90IGdvb2QKLQkJCQkvLyBzaG93IHRoZSBlcnJvciBpZiB0aGVyZSBpcyBjaGlsZCBlcnJvcgotCQkJCS8vIHdoaWxlICggb2JqZWN0IGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikKLQkJCQkvLyB7Ci0JCQkJLy8gb2JqZWN0ID0gY29udGVudFByb3ZpZGVyLmdldFBhcmVudChvYmplY3QpOwotCQkJCS8vIH0KLQotCQkJCUVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZXJyb3IgPSBudWxsOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJCWVycm9yID0gZ2V0Rmlyc3RDaGlsZEVycm9yKG9iamVjdCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXJyb3IgPSBjbG9zdXJlLmdldEVycm9yKG9iamVjdCk7Ci0JCQkJfQotCi0JCQkJaWYgKGVycm9yICE9IG51bGwpIHsKLQkJCQkJaWYgKGVycm9yLmlzRXJyb3IoKSB8fCBlcnJvci5pc0NoaWxkRXJyb3IoKSkgewotCQkJCQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkKLQkJCQkJCQkJLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfV0FSTl9UU0spOyAvLyBJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0VSUk9SX1RTSwotCQkJCQkJLy8gc2hvdwotCQkJCQkJLy8gd2FybmluZwotCQkJCQkJLy8gYXMKLQkJCQkJCS8vIHdlbGwKLQkJCQkJfSBlbHNlIGlmIChlcnJvci5pc1dhcm5pbmcoKSB8fCBlcnJvci5pc0NoaWxkV2FybmluZygpKSB7Ci0JCQkJCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKQotCQkJCQkJCQkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19XQVJOX1RTSyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBhZlByb3ZpZGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2VGcm9tT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShvYmplY3QpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgSUxhYmVsUHJvdmlkZXJ9LmdldFRleHQgYnkgZm9yd2FyZGluZyBpdCB0bwotCQkgKiBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzCi0JCSAqIHtAbGluayBJSXRlbUxhYmVsUHJvdmlkZXIjZ2V0VGV4dCBJSXRlbUxhYmVsUHJvdmlkZXIuZ2V0VGV4dH0KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCS8vIHJldHVybgotCQkJCS8vICgoUHJvY2Vzc0NvbXBvbmVudClvYmplY3QpLmdldFByb2Nlc3MoKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJUHJvY2VzcyBwcm9jID0gKFByb2Nlc3MpICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqZWN0KQotCQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCQlpZiAocHJvYyAhPSBudWxsKQotCQkJCQlyZXR1cm4gcHJvYy5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJZWxzZQotCQkJCQkvLyBpZiBwcm9jZXNzIGlzIG51bGwsIHJldHVybiBwcm9jZXNzY29tcG9uZW50IG5hbWUKLQkJCQkJcmV0dXJuICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gYWZQcm92aWRlci5nZXRUZXh0KG9iamVjdCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCQljb250ZW50UHJvdmlkZXIgPSBudWxsOwotCQkJYWZQcm92aWRlciA9IG51bGw7Ci0JCQkvL2NvbmZpZ0ZhY3RvcnkgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRmlsdGVyIGZvciBjb25maWd1cmF0aW9uCi0JICogCi0JICoKLQkgKi8KLQlwdWJsaWMgY2xhc3MgQ29uZmlnVHJlZUZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0JCWJvb2xlYW4gaGlkZVVuY2hlY2tlZE5vZGVzID0gZmFsc2U7Ci0KLQkJQ2hlY2tib3hUcmVlVmlld2VyIGNoZWNrVHJlZSA9IG51bGw7Ci0KLQkJQ29uZmlndXJhdGlvbkNsb3N1cmUgY2xvc3VyZSA9IG51bGw7Ci0KLQkJQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlciBjcCA9IG51bGw7Ci0KLQkJcHVibGljIENvbmZpZ1RyZWVGaWx0ZXIoQ29uZmlndXJhdGlvbkNsb3N1cmUgY2xvc3VyZSkgewotCQkJdGhpcy5jbG9zdXJlID0gY2xvc3VyZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEhpZGUoKSB7Ci0JCQloaWRlVW5jaGVja2VkTm9kZXMgPSBoaWRlVW5jaGVja2VkTm9kZXMgPT0gdHJ1ZSA/IGZhbHNlIDogdHJ1ZTsKLQkJCWNoZWNrVHJlZS5yZWZyZXNoKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsCi0JCQkJT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChjaGVja1RyZWUgPT0gbnVsbCkgewotCQkJCWNoZWNrVHJlZSA9IChDaGVja2JveFRyZWVWaWV3ZXIpIHZpZXdlcjsKLQkJCQljcCA9IChDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyKSBjaGVja1RyZWUKLQkJCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCX0KLQotCQkJaWYgKGhpZGVVbmNoZWNrZWROb2RlcykgewotCQkJCU9iamVjdCBvID0gY3AuZ2V0VUlUYXJnZXRFbGVtZW50KGVsZW1lbnQpOwotCQkJCXJldHVybiBjbG9zdXJlLmlzU2VsZWN0ZWQobyk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzSGlkaW5nKCkgewotCQkJcmV0dXJuIGhpZGVVbmNoZWNrZWROb2RlczsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQljaGVja1RyZWUgPSBudWxsOwotCQkJY3AgPSBudWxsOwotCQkJY2xvc3VyZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuCi0JICogCQlUcnVlIGlmIGNvbmZpZ3VyYXRpb24gaXMgc2F2ZSBzdWNjZXNzZnVsbHksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhdmVDb25maWd1cmF0aW9uKCkgewotCi0JCWJvb2xlYW4gb2xkTm90aWZ5ID0gY29uZmlnLmVEZWxpdmVyKCk7Ci0JICAgIHRyeQotCSAgICB7Ci0JICAgIAkvL2NvbmZpZy5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JICAgIAkKLQkJCS8vIHJlbW92ZSB0aGUgb2xkIGVudHJpZXMKLQkJCUxpc3QgcGtnTGlzdCA9IGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCQlMaXN0IHBsZ0xpc3QgPSBjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0JCi0JCQlhY3Rpb25NZ3IgPSAoKENvbmZpZ3VyYXRpb25FZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCQlpZiAoIXBsZ0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJaWYgKGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgY29uZmlnLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCksCi0JCQkJCQlwbGdMaXN0LCAtMSkgPT0gZmFsc2UpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghcGtnTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlpZiAoYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCBjb25maWcsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksCi0JCQkJCQlwa2dMaXN0LCAtMSkgPT0gZmFsc2UpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkKLQkJCS8vIGFkZCB0aGUgbmV3IGVudHJpZXMKLQkJCXBrZ0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlwbGdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQotCQkJLy8gYWx3YXlzIGdldCBzZWxlY3Rpb24gZnJvbSBjbG9zdXJlCi0JCQkvLyBPYmplY3RbXSBvYmpzID0gdHJlZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJCS8vIC8vbW9kaWZpZWRMaXN0LnRvQXJyYXkoKTsKLQkJCU9iamVjdFtdIG9ianMgPSBjbG9zdXJlLmdldFNlbGVjdGlvbigpOwotCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCAob2Jqc1tpXSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgJiYgIXBsZ0xpc3QuY29udGFpbnMob2Jqc1tpXSkgKSB7CQkJCQotCQkJCQlwbGdMaXN0LmFkZChvYmpzW2ldKTsKLQkJCQkJCi0JCQkJCS8vIGFkZCBhbGwgc3lzdGVtIHBhY2thZ2VzIGludG8gdGhlIHBhY2thZ2Ugc2VsZWN0aW9uCi0JCQkJCUxpc3QgcGtncyA9IFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMoKE1ldGhvZFBsdWdpbilvYmpzW2ldKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IHBrZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IHBrZyA9IGl0Lm5leHQoKTsKLQkJCQkJCWlmICghcGtnTGlzdC5jb250YWlucyhwa2cpKSB7Ci0JCQkJCQkJcGtnTGlzdC5hZGQocGtnKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICggKG9ianNbaV0gaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSAmJiAhcGtnTGlzdC5jb250YWlucyhvYmpzW2ldKSApIHsKLQkJCQkJcGtnTGlzdC5hZGQob2Jqc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlhY3Rpb25NZ3IgPSAoKENvbmZpZ3VyYXRpb25FZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCQlpZiAoIXBsZ0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJaWYgKGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgY29uZmlnLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCksCi0JCQkJCQlwbGdMaXN0LCAtMSkgPT0gZmFsc2UpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghcGtnTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlpZiAoYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCBjb25maWcsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksCi0JCQkJCQlwa2dMaXN0LCAtMSkgPT0gZmFsc2UpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJfSBmaW5hbGx5IHsKLQkJCWNvbmZpZy5lU2V0RGVsaXZlcihvbGROb3RpZnkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCWlmIChsaWJMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5yZW1vdmVMaXN0ZW5lcihsaWJMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobXNnVmlldyAhPSBudWxsICYmIG1zZ1ZpZXdMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQltc2dWaWV3LnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihtc2dWaWV3TGlzdGVuZXIpOwotCQl9Ci0KLQkJaWYgKGNvbmZpZ0ZpbHRlciAhPSBudWxsKSB7Ci0JCQljb25maWdGaWx0ZXIuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYgKGNsb3N1cmUgIT0gbnVsbCkgewotCQkJY2xvc3VyZS5kaXNwb3NlKCk7Ci0JCQljbG9zdXJlID0gbnVsbDsKLQkJfQotCi0JCWNvbmZpZy5lQWRhcHRlcnMoKS5yZW1vdmUoY29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSBNZXNzYWdlVmlldyBnZXRNZXNzYWdlVmlldygpIHsKLQkJaWYgKG1zZ1ZpZXcgPT0gbnVsbCB8fCBtc2dWaWV3LmlzRGlzcG9zZWQoKSkgewotCQkJLy8gYWRkIGEgbGlzdGVuZXIgZm9yIG1lc3NhZ2Ugc2VsZWN0aW9uIGNoYW5nZXMKLQkJCW1zZ1ZpZXcgPSBNZXNzYWdlVmlldy5nZXRWaWV3KCk7Ci0JCQltc2dWaWV3LmNvbmZpZ3VyYXRpb25GYWN0b3J5Q2hhbmdlZChjbG9zdXJlKTsKLQotCQkJbXNnVmlld0xpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJT2JqZWN0W10gc2VsT2JqcyA9IHNlbC50b0FycmF5KCk7Ci0JCQkJCWlmICgoc2VsT2JqcyAhPSBudWxsKSAmJiAoc2VsT2Jqcy5sZW5ndGggPiAwKSkgewotCQkJCQkJRU9iamVjdCBub2RlID0gbnVsbDsKLQkJCQkJCWlmIChzZWxPYmpzWzBdIGluc3RhbmNlb2YgRWxlbWVudERlcGVuZGVuY3lFcnJvcikgewotCQkJCQkJCW5vZGUgPSAoRU9iamVjdCkgKChFbGVtZW50RGVwZW5kZW5jeUVycm9yKSBzZWxPYmpzWzBdKQotCQkJCQkJCQkJLmdldEVycm9yRWxlbWVudCgpOwotCQkJCQkJfSBlbHNlIGlmIChzZWxPYmpzWzBdIGluc3RhbmNlb2YgRXJyb3JJbmZvKSB7Ci0JCQkJCQkJRXJyb3JJbmZvIGluZm8gPSAoRXJyb3JJbmZvKSBzZWxPYmpzWzBdOwotCQkJCQkJCS8vIG5vZGUgPSAoRU9iamVjdCkgaW5mby5nZXRPd25lckVsZW1lbnQoKTsKLQotCQkJCQkJCS8vIHNob3cgdGhlIGNhdXNlIGVsZW1lbnQKLQkJCQkJCQlub2RlID0gKEVPYmplY3QpIGluZm8uZ2V0Q2F1c2VFbGVtZW50KCk7Ci0KLQkJCQkJCX0KLQotCQkJCQkJZWxzZSBpZiAoc2VsT2Jqc1swXSBpbnN0YW5jZW9mIEVsZW1lbnRSZWZlcmVuY2UpIHsKLQkJCQkJCQlub2RlID0gKEVPYmplY3QpICgoRWxlbWVudFJlZmVyZW5jZSkgc2VsT2Jqc1swXSkKLQkJCQkJCQkJCS5nZXRSZWZFbGVtZW50KCk7Ci0JCQkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkJCQlub2RlID0gbm9kZS5lQ29udGFpbmVyKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24oTGlicmFyeVV0aWwKLQkJCQkJCQkJCS5nZXRTZWxlY3RhYmxlKG5vZGUpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0KLQkJCW1zZ1ZpZXcuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG1zZ1ZpZXdMaXN0ZW5lcik7Ci0JCX0KLQotCQlyZXR1cm4gbXNnVmlldzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlTWVzc2FnZSgpIHsKLQkJLy8gaWYgbm90aGluZyB0byBzaG93LCBkb24ndCBzaG93IHRoZSBtZXNzYWdlIHZpZXcKLQkJaWYgKGNsb3N1cmUuaGFzUHJvYmxlbSgpCi0JCQkJfHwgKChtc2dWaWV3ICE9IG51bGwpICYmICFtc2dWaWV3LmlzRGlzcG9zZWQoKSkpIHsKLQkJCWdldE1lc3NhZ2VWaWV3KCkudXBkYXRlTWVzc2FnZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IGNvbmZpZ3VyYXRpb24gY2xvc3VyZQotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uQ2xvc3VyZSBnZXRDbG9zdXJlKCkgewotCQlyZXR1cm4gY2xvc3VyZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEVkaXRvclNldEZvY3VzTGlzZW5lcnMoKSB7Ci0JCWlmIChnZXRFZGl0b3IoKSBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25FZGl0b3IpIHsKLQkJCUxpc3RlbmVyIGxpcyA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKGV2ZW50LmRhdGEgPT0gQ29uZmlndXJhdGlvblBhZ2UudGhpcyAmJiBuZWVkVXBkYXRlICYmIHRyZWVWaWV3ZXIgIT0gbnVsbCkJewotCQkJCQkJcmVJbml0aWFsaXplQ29uZmlnRmFjdG9yeSgpOwotCQkJCQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCQl1cGRhdGVDaGVja1N0YXRlcygpOwotCQkJCQkJc2hvd0Vycm9ycygpOwotCQkJCQkJbmVlZFVwZGF0ZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCSgoQ29uZmlndXJhdGlvbkVkaXRvcikgZ2V0RWRpdG9yKCkpLmFkZFRvU2V0Rm9jdXNMaXNlbmVycyhsaXMpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWNmMjRhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuR3VpZGFuY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLS8qKgotICogQ2xhc3MgZm9yIEd1aWRhbmNlIHRhYiBwYWdlIGluIHRoZSBjb250ZW50IGVsZW1lbnQgZWRpdG9yLgotICogQ2xhc3MgQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UgcmVwbGFjZXMgQ2F0ZWdvcnlHdWlkYW5jZVBhZ2UgYW5kIGhhbmRsZXMKLSAqIGFsbCBjb250ZW50ZWxlbWVudCdzIGd1aWRhbmNlIHRhYiBmZWF0dXJlLiAgCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJjYXRlZ29yeUd1aWRhbmNlc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkdVSURBTkNFX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTIodHJ1ZSk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJTGlzdCBsaXN0ID0gTWV0aG9kRWxlbWVudFV0aWwKLQkJCQkJCS5nZXRTZWxlY3RlZEd1aWRhbmNlcyhjb250ZW50RWxlbWVudCk7Ci0JCQkJTGlzdCBsb2NhbCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFByYWN0aWNlCi0JCQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IgJiYgY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUb29sKSB8fCBvYmoKLQkJCQkJCQkuZXF1YWxzKGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSkpIHsKLQkJCQkJCWxvY2FsLmFkZChvYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBsb2NhbC50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCUlBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIGl0Lm5leHQoKTsKLQotCQkJCS8vIENvbnNvbGlkYXRpbmcgdGhlIHNlcGFyYXRlIGZvcm0gcGFnZSBjb2RlCi0JCQkJLy8gdG8gYWNjb21vZGF0ZSBiZXR0ZXIgZmlsdGVyaW5nLgotCQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRhc2spIHsKLS8vCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEVzdGltYXRlKSB7Ci0vLwkJCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotLy8JCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotLy8JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfRXN0aW1hdGUoKSwKLS8vCQkJCQkJCQkoRXN0aW1hdGUpIGl0ZW0sIC0xKTsKLS8vCQkJCQl9IGVsc2UgCi0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1Rvb2xNZW50b3JzKCksCi0JCQkJCQkJCShUb29sTWVudG9yKSBpdGVtLCAtMSk7Ci0JCQkJCX1lbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKSB7Ci0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCBjb250ZW50RWxlbWVudCwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwKLQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIEluIGNhc2Ugb2YgV29ya1Byb2R1Y3QsIFdvcmtQcm9kdWN0IGlzIGFzc29jaWF0ZWQgdG8gVG9vbE1lbnRvciwKLQkJCQkvLyBFc3RpbWF0ZSwgUmVwb3J0IGFuZCBUZW1wbGF0ZSBndWlkYW5jZQotCQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgVGVtcGxhdGUpIHsKLQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCBjb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpLAotCQkJCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcnMoKSwKLQkJCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJlcG9ydCkgewotCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKSwKLQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCQl9IAotLy8JCQkJCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFc3RpbWF0ZSkgewotLy8JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBjb250ZW50RWxlbWVudCwKLS8vCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpLAotLy8JCQkJCQkJCWl0ZW0sIC0xKTsKLS8vCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpIHsKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwKLQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gR3VpZGFuY2UgZm9yIGNvbnRlbnQgZWxlbWVudC4KLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLAotCQkJCQkJCQkJKENoZWNrbGlzdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJCQkJCShDb25jZXB0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCShFeGFtcGxlKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCQkJCShTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCQkJCQkJCShHdWlkZWxpbmUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCShSZXVzYWJsZUFzc2V0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJIlVuYWJsZSB0byBhZGQgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSJ0byAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyBjb250ZW50RWxlbWVudC5nZXRUeXBlKCkKLQkJCQkJCQkJCQkJCQkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkJCSsgIjoiICsgY29udGVudEVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gSW4gY2FzZSBvZiBUYXNrLCBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gVG9vbE1lbnRvciBhbmQKLQkJCQkvLyBFc3RpbWF0ZSBndWlkYW5jZQotCQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1Rvb2xNZW50b3JzKCksCi0JCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQkJfSAKLS8vCQkJCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXN0aW1hdGUpIHsKLS8vCQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0vLwkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0vLwkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19Fc3RpbWF0ZSgpLCBudWxsLAotLy8JCQkJCQkJCS0xKTsKLS8vCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpIHsKLQkJCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgaXRlbSwKLQkJCQkJCQkJLTEpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIEluIGNhc2Ugb2YgV29ya1Byb2R1Y3QsIFdvcmtQcm9kdWN0IGlzIGFzc29jaWF0ZWQgdG8gVG9vbE1lbnRvciwKLQkJCQkvLyBFc3RpbWF0ZSwgUmVwb3J0IGFuZCBUZW1wbGF0ZSBndWlkYW5jZQotCQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgUmVwb3J0KSB7Ci0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQljb250ZW50RWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpLCBpdGVtLCAtMSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFRlbXBsYXRlKSB7Ci0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQljb250ZW50RWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGVzKCksIGl0ZW0sIC0xKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQkJY29udGVudEVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcnMoKSwKLQkJCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJCX0gCi0vLwkJCQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEVzdGltYXRlKSB7Ci0vLwkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGNvbnRlbnRFbGVtZW50LAotLy8JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X0VzdGltYXRlKCksCi0vLwkJCQkJCQkJbnVsbCwgLTEpOwotLy8JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucykgewotCQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgaXRlbSwKLQkJCQkJCQkJLTEpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIEd1aWRhbmNlIGZvciB0aGUgbWV0aG9kIGVsZW1lbnQuCi0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQkoQ29uY2VwdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwKLQkJCQkJCQkoRXhhbXBsZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwKLQkJCQkJCQkoU3VwcG9ydGluZ01hdGVyaWFsKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJCQkoR3VpZGVsaW5lKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCQkJCQkoUmV1c2FibGVBc3NldCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gcmVtb3ZlIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkiZnJvbSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyBjb250ZW50RWxlbWVudC5nZXRUeXBlKCkKLQkJCQkJCQkJCQkJCQkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkJCSsgIjoiICsgY29udGVudEVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgR3VpZGFuY2VGaWx0ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRGaWx0ZXJUeXBlcygpCi0JICogICAgICBUeXBlcyBhcmUgcmV0dXJuZWQgaW4gb3JkZXIgdG8gZGlzcGxheSBpbiB0aGUgZmlsdGVyIGRpYWxvZyBmb3IKLQkgKiAgICAgIHNlYXJjaCBiYXNlZCBvbiB0eXBlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJUeXBlcygpIHsKLQkJCi0JCVN0cmluZ1tdIHN0cjsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVGFzaykgewotCQkJc3RyID0gbmV3IFN0cmluZ1sxMV07Ci0JCX0gZWxzZSBpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJc3RyID0gbmV3IFN0cmluZ1sxM107Ci0JCX0gZWxzZQotCQkJc3RyID0gbmV3IFN0cmluZ1s5XTsKLQkJaW50IGkgPSAwOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuQ0hFQ0tMSVNUUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuQ09OQ0VQVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkVYQU1QTEVTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5HVUlERUxJTkVTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5SRVVTQUJMRV9BU1NFVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5UT09MX01FTlRPUlM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5FU1RJTUFURV9DT05TSURFUkFUSU9OUzsKLQkJCS8vIFRPRE8gRXN0aW1hdGUgY29udGVudGVsZW1lbnQKLQkJfSBlbHNlIGlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5SRVBPUlRTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuVEVNUExBVEVTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuVE9PTF9NRU5UT1JTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuRVNUSU1BVEVfQ09OU0lERVJBVElPTlM7Ci0JCQkvLyBUT0RPIEVzdGltYXRlIGNvbnRlbnRlbGVtZW50Ci0JCX0KLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuQ09OVEVOVF9QQUNLQUdFUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuTUVUSE9fUExVR0lOUzsKLQkJcmV0dXJuIHN0cjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQkKLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlU2V0KXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc2V0c19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRGlzY2lwbGluZSl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya3Byb2R1Y3R0eXBlc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRG9tYWluKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5zX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUb29sKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50b29sc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9sZSl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUb29sKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50b29sc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgV2hpdGVwYXBlcil7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud2hpdGVwYXBlcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29uY2VwdCl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uY2VwdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ2hlY2tsaXN0KXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5jaGVja2xpc3RfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEV4YW1wbGUpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4YW1wbGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEd1aWRlbGluZSl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ3VpZGVsaW5lX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN1cHBvcnRpbmdtYXRlcmlhbF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9hZG1hcCl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9hZG1hcF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUHJhY3RpY2UpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZXBvcnQpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlcG9ydF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmV1c2FibGVhc3NldF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVGVtcGxhdGUpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlbXBsYXRlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbil7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGVybWRlZmluaXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRvb2xNZW50b3IpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xtZW50b3JfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5jdXN0b21jYXRlZ29yeV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCQotCQlpZihjb250ZW50RWxlbWVudCAhPSBudWxsKQotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbiwgY29udGVudEVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29udGVudFBhY2thZ2VEZXNjcmlwdGlvblBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db250ZW50UGFja2FnZURlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YmJmYTEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db250ZW50UGFja2FnZURlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuVUlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0KLS8qKgotICogVGhlIGRlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBDb250ZW50IFBhY2thZ2UgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50UGFja2FnZURlc2NyaXB0aW9uUGFnZSBleHRlbmRzIEZvcm1QYWdlIGltcGxlbWVudHMgSVJlZnJlc2hhYmxlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BSRUZJWCA9IExpYnJhcnlVSVRleHQuVEVYVF9DT05URU5UX1BBQ0tBR0UKLQkJCSsgIjogIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfbmFtZTsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmX2Rlc2M7Ci0KLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgY3RybF9kZXBlbmRlbmN5OwotCi0JcHJpdmF0ZSBTY3JvbGxlZEZvcm0gZm9ybTsKLQotCXByaXZhdGUgQ29udGVudFBhY2thZ2UgY29udGVudFBhY2thZ2U7Ci0KLQlwcml2YXRlIEhhc2h0YWJsZSBhUGFja2FnZU1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyIG1vZGVsTW9kaWZ5TGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb250ZW50UGFja2FnZURlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIENvbnRlbnRQYWNrYWdlIG9iamVjdCBmcm9tIHRoZSBFZGl0b3IgaW5wdXQuCi0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBtZXRob2RFbGVtZW50SW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dDsKLQkJT2JqZWN0IG9iaiA9IG1ldGhvZEVsZW1lbnRJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCWNvbnRlbnRQYWNrYWdlID0gKENvbnRlbnRQYWNrYWdlKSBvYmo7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQkvLyBDcmVhdGUgdGhlIGZvcm0gdG9vbGtpdC4KLQkJZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQkJZm9ybS5zZXRUZXh0KEZPUk1fUFJFRklYICsgY29udGVudFBhY2thZ2UuZ2V0TmFtZSgpKTsKLQkJVGFibGVXcmFwTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZVdyYXBMYXlvdXQoKTsKLQkJZm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBHZW5lcmFsIEluZm9ybWFpdG9uIHNlY3Rpb24uCi0JCVNlY3Rpb24gZ2VuZXJhbFNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksCi0JCQkJU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQKLQkJCQkJCXwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuR0VORVJBTF9JTkZPX1NFQ1RJT05fTkFNRSk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCUF1dGhvcmluZ1VJVGV4dC5HRU5FUkFMX0lORk9fU0VDVElPTl9ERVNDLAotCQkJCW5ldyBTdHJpbmdbXSB7IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0TG93ZXIoY29udGVudFBhY2thZ2UpIH0pKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCUNvbXBvc2l0ZSBnZW5lcmFsQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZ2VuZXJhbFNlY3Rpb24pOwotCQlnZW5lcmFsQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlnZW5lcmFsQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRDbGllbnQoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCgKLQkJCQlnZW5lcmFsQ29tcG9zaXRlLmdldFBhcmVudCgpLmdldFBhcmVudCgpLAotCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkNPTlRFTlRfUEFDS0FHRV9FRElUT1JfQUxMX0NPTlRFWFQpOyAKLQotCQkvLyBuYW1lCi0JCUxhYmVsIGxfbmFtZSA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuTkFNRV9URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWxfbmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfbmFtZSA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWN0cmxfbmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCS8vIGJyaWVmIGRlc2MKLQkJTGFiZWwgbF9icmllZl9kZXNjID0gdG9vbGtpdC5jcmVhdGVMYWJlbChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWxfYnJpZWZfZGVzYy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfYnJpZWZfZGVzYyA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCSIiLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCVNlY3Rpb24gZGVwZW5kZW5jeVNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksCi0JCQkJU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQKLQkJCQkJCXwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlUYWJsZVdyYXBEYXRhIHRkMSA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJZGVwZW5kZW5jeVNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZDEpOwotCQlkZXBlbmRlbmN5U2VjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5ERVBFTkRFTkNJRVNfU0VDVElPTl9OQU1FKTsKLQkJZGVwZW5kZW5jeVNlY3Rpb24KLQkJCQkuc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlUZXh0LkRFUEVOREVOQ0lFU19TRUNUSU9OX0RFU0MpOwotCQlkZXBlbmRlbmN5U2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJQ29tcG9zaXRlIGRlcGVuZGVuY3lDb21wb3NpdGUgPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUNvbXBvc2l0ZShkZXBlbmRlbmN5U2VjdGlvbik7Ci0JCWRlcGVuZGVuY3lDb21wb3NpdGUKLQkJCQkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWRlcGVuZGVuY3lDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWRlcGVuZGVuY3lTZWN0aW9uLnNldENsaWVudChkZXBlbmRlbmN5Q29tcG9zaXRlKTsKLQotCQlUYWJsZSBjdHJsX3RhYmxlID0gbmV3IFRhYmxlKGRlcGVuZGVuY3lDb21wb3NpdGUsIFNXVC5WX1NDUk9MTAotCQkJCXwgU1dULkNIRUNLIHwgU1dULlJFQURfT05MWSB8IFNXVC5DT0xPUl9CTFVFKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HCi0JCQkJCXwgR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSAxMDA7Ci0JCQljdHJsX3RhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9kZXBlbmRlbmN5ID0gbmV3IENoZWNrYm94VGFibGVWaWV3ZXIoY3RybF90YWJsZSk7Ci0KLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCX0KLQkJfTsKLQkJY3RybF9kZXBlbmRlbmN5LnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0KLQkJSGFzaHRhYmxlIGFNYXAgPSBnZXREZXBlbmRlbmNpZXNQYWNrYWdlcyhjb250ZW50UGFja2FnZSk7Ci0KLQkJaWYgKGFNYXAgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXQgPSBhTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQljdHJsX2RlcGVuZGVuY3kuYWRkKGtleSk7Ci0JCQl9Ci0JCX0KLQkJY3RybF9kZXBlbmRlbmN5LnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0JCWN0cmxfZGVwZW5kZW5jeS5zZXRBbGxHcmF5ZWQodHJ1ZSk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGRlcGVuZGVuY3lDb21wb3NpdGUpOwotCi0JCS8vIGxvYWQgZGF0YQotCQlsb2FkRGF0YSgpOwotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQkvLyBzZXQgZm9jdXMgb24gdGhlIG5hbWUgYXR0cmlidXRlCi0JCURpc3BsYXkgZGlzcGxheSA9IGZvcm0uZ2V0Qm9keSgpLmdldERpc3BsYXkoKTsKLQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJCWN0cmxfbmFtZS5zZXRTZWxlY3Rpb24oMCwgY3RybF9uYW1lLmdldFRleHQoKS5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJZmluYWwgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0JCW1vZGVsTW9kaWZ5TGlzdGVuZXIgPSBlZGl0b3IuY3JlYXRlTW9kaWZ5TGlzdGVuZXIoY29udGVudFBhY2thZ2UpOwotCi0JCWZvcm0uYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJLy8gcmVmcmVzaFZpZXdlcnMoKTsKLQkJCQljdHJsX2RlcGVuZGVuY3kucmVmcmVzaCgpOwotCQkJCUhhc2h0YWJsZSBhTWFwID0gZ2V0RGVwZW5kZW5jaWVzUGFja2FnZXMoY29udGVudFBhY2thZ2UpOwotCi0JCQkJaWYgKGFNYXAgIT0gbnVsbCkgewotCQkJCQlJdGVyYXRvciBpdCA9IGFNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQkJCWN0cmxfZGVwZW5kZW5jeS5hZGQoa2V5KTsKLQkJCQkJfQotCQkJCX0KLQkJCQljdHJsX2RlcGVuZGVuY3kuc2V0QWxsQ2hlY2tlZCh0cnVlKTsKLQkJCQljdHJsX2RlcGVuZGVuY3kuc2V0QWxsR3JheWVkKHRydWUpOwotCQkJCWlmIChUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRQYWNrYWdlKSkgewotCQkJCQllbmFibGVDb250cm9scyhmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZW5hYmxlQ29udHJvbHModHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJZmluYWwgQ29sbGVjdGlvbiBlQ2xhc3NlcyA9IENvbGxlY3Rpb25zCi0JCQkJCQkuc2luZ2xldG9uKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2UoKSk7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50UGFja2FnZS5nZXROYW1lKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3TmFtZSA9IGN0cmxfbmFtZS5nZXRUZXh0KCk7Ci0JCQkJaWYobmV3TmFtZSAhPSBudWxsKQotCQkJCQluZXdOYW1lID0gbmV3TmFtZS50cmltKCk7Ci0JCQkJU3RyaW5nIG1zZyA9IFRuZ1V0aWwuY2hlY2tOYW1lKGNvbnRlbnRQYWNrYWdlLCBuZXdOYW1lLCBlQ2xhc3Nlcyk7Ci0JCQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQkJCWlmICghbmV3TmFtZS5lcXVhbHMoY29udGVudFBhY2thZ2UuZ2V0TmFtZSgpKSkgewotCQkJCQkJY3RybF9uYW1lLnNldFRleHQobmV3TmFtZSk7Ci0JCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJY29udGVudFBhY2thZ2UsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCQkJCQkJCW5ld05hbWUsIC0xKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVEaWFsb2dfdGl0bGUsIG1zZyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY3RybF9uYW1lLnNldFRleHQoY29udGVudFBhY2thZ2UuZ2V0TmFtZSgpKTsKLQkJCQkJY3RybF9uYW1lLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJCQkJCWN0cmxfbmFtZS5zZWxlY3RBbGwoKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2JyaWVmX2Rlc2MuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfYnJpZWZfZGVzYy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudFBhY2thZ2UuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJZS53aWRnZXQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld05hbWUgPSBjdHJsX2JyaWVmX2Rlc2MuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3TmFtZS5lcXVhbHMoY29udGVudFBhY2thZ2UuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQljb250ZW50UGFja2FnZSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpLAotCQkJCQkJCW5ld05hbWUsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KG5ld05hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2RlcGVuZGVuY3kuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU9iamVjdCBvYmogPSBldmVudC5nZXRTb3VyY2UoKTsKLQkJCQkoKENoZWNrYm94VGFibGVWaWV3ZXIpIG9iaikuc2V0QWxsQ2hlY2tlZCh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVDb250cm9scyhib29sZWFuIGVkaXRhYmxlKSB7Ci0JCWN0cmxfbmFtZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfYnJpZWZfZGVzYy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgaW5pdGlhbCBkYXRhIGZyb20gbW9kZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERhdGEoKSB7Ci0JCVN0cmluZyBuYW1lID0gY29udGVudFBhY2thZ2UuZ2V0TmFtZSgpOwotCQlTdHJpbmcgZGVzYyA9IGNvbnRlbnRQYWNrYWdlLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQotCQlMaXN0IGRlcGVuZGVuY2llcyA9IGNvbnRlbnRQYWNrYWdlLmdldFJldXNlZFBhY2thZ2VzKCk7Ci0KLQkJY3RybF9uYW1lLnNldFRleHQobmFtZSA9PSBudWxsID8gIiIgOiBuYW1lKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChkZXNjID09IG51bGwgPyAiIiA6IGRlc2MpOyAvLyROT04tTkxTLTEkCi0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXBlbmRlbmNpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUl0ZXJhdG9yIGl0ID0gYVBhY2thZ2VNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCQlpZiAoZGVwZW5kZW5jaWVzLmdldChpKSA9PSBlbnRyeS5nZXRWYWx1ZSgpKSB7Ci0JCQkJCWN0cmxfZGVwZW5kZW5jeS5zZXRDaGVja2VkKGVudHJ5LmdldEtleSgpLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgZGVwZW5kZW5jeSBwYWNrYWdlcyBmb3IgdGhlIGdpdmVuIGNvbnRlbnQgcGFja2FnZQotCSAqIEByZXR1cm4KLQkgKiAJCUxpc3Qgb2YgZGVwZW5kZW5jeSBwYWNrYWdlcwotCSAqLwotCXB1YmxpYyBIYXNodGFibGUgZ2V0RGVwZW5kZW5jaWVzUGFja2FnZXMoQ29udGVudFBhY2thZ2UgY29udGVudFBhY2thZ2UpIHsKLQotCQlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250ZW50UGFja2FnZS5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChjb250ZW50RWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCWVsZW1lbnRzLmFkZCgoQ29udGVudEVsZW1lbnQpIGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJCX0KLQkJCWVsZW1lbnRzLmFkZEFsbChNZXRob2RFbGVtZW50VXRpbAotCQkJCQkuZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoY29udGVudEVsZW1lbnQpKTsKLQotCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9sZSkgewotCQkJCWlmIChBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJLmdldE1vZGlmaWVkV29ya1Byb2R1Y3RzKChSb2xlKSBjb250ZW50RWxlbWVudCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cy5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0TW9kaWZpZWRXb3JrUHJvZHVjdHMoKFJvbGUpIGNvbnRlbnRFbGVtZW50KSk7Ci0JCQkJfQotCQkJCWlmIChBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza3MoKFJvbGUpIGNvbnRlbnRFbGVtZW50KSAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXRQcmltYXJ5VGFza3MoKFJvbGUpIGNvbnRlbnRFbGVtZW50KSk7Ci0JCQkJfQotCQkJCWlmIChBc3NvY2lhdGlvbkhlbHBlci5nZXRTZWNvbmRhcnlUYXNrcygoUm9sZSkgY29udGVudEVsZW1lbnQpICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldFNlY29uZGFyeVRhc2tzKChSb2xlKSBjb250ZW50RWxlbWVudCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCQlpZiAoKChUYXNrKSBjb250ZW50RWxlbWVudCkuZ2V0UGVyZm9ybWVkQnkoKSAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZCgoKFRhc2spIGNvbnRlbnRFbGVtZW50KS5nZXRQZXJmb3JtZWRCeSgpKTsKLQkJCQl9Ci0JCQkJaWYgKCgoVGFzaykgY29udGVudEVsZW1lbnQpLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cy5hZGRBbGwoKChUYXNrKSBjb250ZW50RWxlbWVudCkKLQkJCQkJCQkuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCQkJfQotCQkJCWlmICgoKFRhc2spIGNvbnRlbnRFbGVtZW50KS5nZXRNYW5kYXRvcnlJbnB1dCgpICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMKLQkJCQkJCQkuYWRkQWxsKCgoVGFzaykgY29udGVudEVsZW1lbnQpLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQkJCX0KLQkJCQlpZiAoKChUYXNrKSBjb250ZW50RWxlbWVudCkuZ2V0T3B0aW9uYWxJbnB1dCgpICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMuYWRkQWxsKCgoVGFzaykgY29udGVudEVsZW1lbnQpLmdldE9wdGlvbmFsSW5wdXQoKSk7Ci0JCQkJfQotCQkJCWlmICgoKFRhc2spIGNvbnRlbnRFbGVtZW50KS5nZXRPdXRwdXQoKSAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbCgoKFRhc2spIGNvbnRlbnRFbGVtZW50KS5nZXRPdXRwdXQoKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRNb2RpZmllZEJ5KChXb3JrUHJvZHVjdCkgY29udGVudEVsZW1lbnQpICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldE1vZGlmaWVkQnkoKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudCkpOwotCQkJCX0KLQkJCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRNYW5kYXRvcnlJbnB1dFRvVGFza3MoKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cwotCQkJCQkJCS5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkJCS5nZXRNYW5kYXRvcnlJbnB1dFRvVGFza3MoKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudCkpOwotCQkJCX0KLQkJCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRPdXRwdXR0aW5nVGFza3MoKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cy5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0T3V0cHV0dGluZ1Rhc2tzKChXb3JrUHJvZHVjdCkgY29udGVudEVsZW1lbnQpKTsKLQkJCQl9Ci0JCQkJTGlzdCBsaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVzcG9uc2libGVSb2xlcygoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50KTsKLQkJCQlpZiAobGlzdCAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbChsaXN0KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmplY3QgPSAoKENvbnRlbnRFbGVtZW50KSBlbGVtZW50cy5nZXQoaSkpLmVDb250YWluZXIoKTsKLQkJCS8vIE9iamVjdCBvYmplY3QgPSBlbGVtZW50cy5nZXQoaSk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGUKLQkJCS8vICIrKChDb250ZW50UGFja2FnZSlvYmplY3QpLmdldFR5cGUoKS5nZXROYW1lKCkpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJaWYgKCFjb250ZW50UGFja2FnZS5lcXVhbHMob2JqZWN0KSkgewotCQkJCQlhUGFja2FnZU1hcC5wdXQoKChDb250ZW50UGFja2FnZSkgb2JqZWN0KS5nZXROYW1lKCksCi0JCQkJCQkJKENvbnRlbnRQYWNrYWdlKSBvYmplY3QpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCXJldHVybiBhUGFja2FnZU1hcDsKLQl9CQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLklSZWZyZXNoYWJsZSNyZWZyZXNoTmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hOYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmIChuZXdOYW1lICE9IG51bGwpIHsKLQkJCWlmICgoY3RybF9uYW1lICE9IG51bGwpICYmICEoY3RybF9uYW1lLmlzRGlzcG9zZWQoKSkpIHsKLQkJCQljdHJsX25hbWUucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJY3RybF9uYW1lLnNldFRleHQobmV3TmFtZSk7Ci0JCQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQkJCVVJSGVscGVyLnNldEZvcm1UZXh0KGZvcm0sIGNvbnRlbnRQYWNrYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0N1c3RvbUNhdGVnb3J5QXNzaWduUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0N1c3RvbUNhdGVnb3J5QXNzaWduUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzY2OGExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9DdXN0b21DYXRlZ29yeUFzc2lnblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeVZpZXdEZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkFsbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1vdmVJbkNhdGVnb3J5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ2F0ZWdvcnlTb3J0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29udGVudEVsZW1lbnRPcmRlckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLk1lc3NhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIEFzc2lnbiBwYWdlIGluIHRoZSBDdXN0b20gQ2F0ZWdvcnkgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnk7Ci0KLQlwcml2YXRlIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGFsbFN0ZXBzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuQVNTSUdOX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJY2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JCXNldElzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAoYWxsU3RlcHMgPT0gbnVsbCkgewotCQkJCQlhbGxTdGVwcyA9IG5ldyBDb250ZW50RWxlbWVudE9yZGVyTGlzdCgKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlDb250ZW50RWxlbWVudE9yZGVyTGlzdC5DT05URU5UX0VMRU1FTlRTX19GT1JfRUxFTUVOVF9PTkxZKTsKLQkJCQl9Ci0JCQkJTGlzdCByZXR1cm5MaXN0ID0gQ2F0ZWdvcnlTb3J0SGVscGVyLnNvcnRDYXRlZ29yeUVsZW1lbnRzKGNvbnRlbnRFbGVtZW50LCBhbGxTdGVwcy50b0FycmF5KCkpOwotCQkJCXJldHVybiByZXR1cm5MaXN0LnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJYm9vbGVhbiBvayA9IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQoY2F0ZWdvcnksIGFkZEl0ZW1zKTsKLQkJaWYoISBvaykgewotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2lyY3VsYXJfZGVwZW5kZW5jeV9lcnJvcl90aXRsZTsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsIExpYnJhcnlFZGl0UmVzb3VyY2VzLmNpcmN1bGFyX2RlcGVuZGVuY3lfZXJyb3JfbXNnKTsJCQkJCQkKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTGlzdCBhbmNlc3RvcnMgPSBnZXRBbmNlc3RvcnMoY2F0ZWdvcnkpOwotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RFbGVtZW50IGN1c3RvbUNhdGVnb3J5ID0gKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQlpZiAoY3VzdG9tQ2F0ZWdvcnkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeQotCQkJCQkJJiYgVG5nVXRpbAotCQkJCQkJCQkuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBjdXN0b21DYXRlZ29yeSkpIHsKLQkJCQl9IGVsc2UgaWYgKGFuY2VzdG9ycy5jb250YWlucyhjdXN0b21DYXRlZ29yeSkpIHsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoY3VzdG9tQ2F0ZWdvcnkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IG9iamVjdCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgY3VzdG9tQ2F0ZWdvcnkpCi0JCQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgY2F0ZWdvcnksIG9iamVjdCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgY2F0ZWdvcnksIGN1c3RvbUNhdGVnb3J5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJQXJyYXlMaXN0IGN1c3RvbUNhdGVnb3JpZXNUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCU1ldGhvZFBsdWdpbiBjdXJyZW50UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0ZWdvcnkpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotLy8JCQkJCUFkYXB0ZXIgYWRhcHRlciA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0vLwkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoCi0vLwkJCQkJCQkJCWNhdGVnb3J5LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotLy8JCQkJCWlmIChhZGFwdGVyICE9IG51bGwKLS8vCQkJCQkJCSYmIGFkYXB0ZXIgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0vLwkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlcikKLS8vCQkJCQkJCQkuZ2V0Q2hpbGRyZW4oY2F0ZWdvcnkpLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLS8vCQkJCQkJCWlmIChUbmdVdGlsLnVud3JhcChvKSA9PSBlKSB7Ci0vLwkJCQkJCQkJY3VzdG9tQ2F0ZWdvcmllc1RvRGVsZXRlLmFkZChvKTsKLS8vCQkJCQkJCX0KLS8vCQkJCQkJfQotLy8JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIHdpbGwgZGVsZXRlIGUgaWYgaXQgaXMgaW4gdGhlIGN1cnJlbnQgcGx1Z2luIGFuZAotCQkJCQkvLyB0aGUgbGFzdCBzdXBlciBjdXN0b20gY2F0ZWdvcnkgb2YgZSBpbiB0aGUgY3VycmVudCBwbHVnaW4KLQkJCQkJLy8KLQkJCQkJaWYoVG5nVXRpbC5pc0luUGx1Z2luV2l0aExlc3NUaGFuT25lU3VwZXJDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIGUsIGN1cnJlbnRQbHVnaW4pKSB7Ci0JCQkJCQljdXN0b21DYXRlZ29yaWVzVG9EZWxldGUuYWRkKGUpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbUN1c3RvbUNhdGVnb3J5KAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBjYXRlZ29yeSwgZSk7Ci0JCQl9Ci0KLQkJCWlmIChjdXN0b21DYXRlZ29yaWVzVG9EZWxldGUuc2l6ZSgpID4gMCkgewotCQkJCWludCBpID0gMDsKLQkJCQlTdHJpbmdCdWZmZXIgZWxlbWVudFN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY3VzdG9tQ2F0ZWdvcmllc1RvRGVsZXRlLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKGl0Lm5leHQoKSk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJCQllbGVtZW50U3RyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJZWxlbWVudFN0ci5hcHBlbmQoKChNZXRob2RFbGVtZW50KSBvYmopLmdldE5hbWUoKSk7Ci0KLQkJCQkJCWkrKzsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZighQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlDb25maXJtYXRpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVtb3ZlX3RleHQsCi0JCQkJCQlOTFMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5wcm9tcHREZWxldGVDdXN0b21DYXRlZ29yeUJlZm9yZVJlbW92ZUxhc3RSZWZUb0l0LCBlbGVtZW50U3RyKSkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlMaWJyYXJ5Vmlld0RlbGV0ZUFjdGlvbiBkZWxldGVBY3Rpb24gPSBuZXcgTGlicmFyeVZpZXdEZWxldGVBY3Rpb24oKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yVGl0bGU7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbmZpcm0gPSBmYWxzZTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJc3VwZXIucnVuKCk7Ci0JCQkJCQl9IGNhdGNoIChNZXNzYWdlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJU3RyaW5nIGRldGFpbHMgPSBUbmdVdGlsLnRvU3RhY2tUcmFjZVN0cmluZyhlKTsKLQkJCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yTWVzc2FnZTsgLy8kTk9OLU5MUy0xJAkJCi0JCQkJCQkJU3RyaW5nIHJlYXNvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yUmVhc29uOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCByZWFzb24sCi0JCQkJCQkJCQkJCWRldGFpbHMsIGUpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIHZvaWQgZGVsZXRlRmFpbGVkKCkgewotCQkJCQkJLy8gbGlicmFyeSBuZWVkIHRvIGJlIHJlbG9hZGVkCi0JCQkJCQkvLwotCQkJCQkJU3RyaW5nIGxpYkRpciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpOwotCQkJCQkJTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLm9wZW5MaWJyYXJ5KGxpYkRpcik7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfTsKLQkJCQlkZWxldGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihMaWJyYXJ5Vmlldy5nZXRWaWV3KCkKLQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCkpOwotCQkJCWRlbGV0ZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJY3VzdG9tQ2F0ZWdvcmllc1RvRGVsZXRlKSk7Ci0JCQkJZGVsZXRlQWN0aW9uLnJ1bigpOwotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNtb3ZlVXBJdGVtc0luU2VsZWN0ZWRJdGVtczEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1vdmVVcEl0ZW1zSW5TZWxlY3RlZEl0ZW1zMShBcnJheUxpc3QgbW92ZVVwSXRlbXMpIHsKLQkJaWYgKCFtb3ZlVXBJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0JCQlNb3ZlSW5DYXRlZ29yeUNvbW1hbmQgY21kID0gbmV3IE1vdmVJbkNhdGVnb3J5Q29tbWFuZCgKLQkJCQkJKEN1c3RvbUNhdGVnb3J5KSBjb250ZW50RWxlbWVudCwgbW92ZVVwSXRlbXMsIGFsbFN0ZXBzLAotCQkJCQlmZWF0dXJlLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCwgMSk7Ci0JCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjbW92ZURvd25JdGVtc0luU2VsZWN0ZWRJdGVtczEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1vdmVEb3duSXRlbXNJblNlbGVjdGVkSXRlbXMxKEFycmF5TGlzdCBtb3ZlRG93bkl0ZW1zKSB7Ci0JCWlmICghbW92ZURvd25JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0JCQlNb3ZlSW5DYXRlZ29yeUNvbW1hbmQgY21kID0gbmV3IE1vdmVJbkNhdGVnb3J5Q29tbWFuZCgKLQkJCQkJKEN1c3RvbUNhdGVnb3J5KSBjb250ZW50RWxlbWVudCwgbW92ZURvd25JdGVtcywgYWxsU3RlcHMsCi0JCQkJCWZlYXR1cmUsIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoLCAwKTsKLQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhbmNlc3RvcnMgZm9yIHRoZSBnaXZlbiBDdXN0b20gQ2F0ZWdvcnkuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldEFuY2VzdG9ycyhDdXN0b21DYXRlZ29yeSBtZXRob2RPYmplY3QpIHsKLQkJTGlzdCBhbmNlc3Rvckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgb2JqTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJb2JqTGlzdC5hZGQobWV0aG9kT2JqZWN0KTsKLQkJZ2V0QW5jZXN0b3JzKGFuY2VzdG9yTGlzdCwgb2JqTGlzdCk7Ci0JCXJldHVybiBhbmNlc3Rvckxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldEFuY2VzdG9ycyhMaXN0IGFuY2VzdG9yTGlzdCwgTGlzdCBtZXRob2RPYmplY3RMaXN0KSB7Ci0JCWlmIChtZXRob2RPYmplY3RMaXN0LmlzRW1wdHkoKSkKLQkJCXJldHVybiBhbmNlc3Rvckxpc3Q7Ci0KLQkJTGlzdCBhbGxQYXJlbnRDdXN0Q2F0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZXRob2RPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ3VzdG9tQ2F0ZWdvcnkgZWxlbWVudCA9IChDdXN0b21DYXRlZ29yeSkgaXRlci5uZXh0KCk7Ci0JCQlMaXN0IHBhcmVudExpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKGVsZW1lbnQpOwotCQkJYWxsUGFyZW50Q3VzdENhdHMuYWRkQWxsKHBhcmVudExpc3QpOwotCQl9Ci0KLQkJYW5jZXN0b3JMaXN0LmFkZEFsbChtZXRob2RPYmplY3RMaXN0KTsKLQkJTGlzdCBuZXh0Q2hlY2tMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbGxQYXJlbnRDdXN0Q2F0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIWFuY2VzdG9yTGlzdC5jb250YWlucyhlbGVtZW50KSkgewotCQkJCW5leHRDaGVja0xpc3QuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGdldEFuY2VzdG9ycyhhbmNlc3Rvckxpc3QsIG5leHRDaGVja0xpc3QpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gY2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFM7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDdXN0b21DYXRlZ29yeUFzc2lnbkZpbHRlciBleHRlbmRzIEFsbEZpbHRlciB7Ci0JCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYob2JqIGluc3RhbmNlb2YgTWlsZXN0b25lKXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCWlmIChUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgb2JqKSkgewotCQkJCQlyZXR1cm4gISgoKEN1c3RvbUNhdGVnb3J5KSBvYmopLmdldENhdGVnb3JpemVkRWxlbWVudHMoKQotCQkJCQkJCS5pc0VtcHR5KCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbikKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkvLyBpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSl7Ci0JCQkJLy8gcmV0dXJuCi0JCQkJLy8gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZUdyb3VwcygoRGlzY2lwbGluZSlvYmopLmlzRW1wdHkoKTsKLQkJCQkvLyB9Ci0JCQkJLy8gaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpewotCQkJCS8vIHJldHVybgotCQkJCS8vIEFzc29jaWF0aW9uSGVscGVyLmdldFJvbGVTZXRHcm91cHMoKFJvbGVTZXQpb2JqKS5pc0VtcHR5KCk7Ci0JCQkJLy8gfQotCQkJCXJldHVybiAhKGdldEhlbHBlcigpLmlzQ29udHJpYnV0b3IoKENvbnRlbnRFbGVtZW50KSBvYmopKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDdXN0b21DYXRlZ29yeUFzc2lnbkZpbHRlcigpOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0N1c3RvbUNhdGVnb3J5RGVzY3JpcHRpb25QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ3VzdG9tQ2F0ZWdvcnlEZXNjcmlwdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWYyNTgwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ3VzdG9tQ2F0ZWdvcnlEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DdXN0b21DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBEb21haW4gZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yeURlc2NyaXB0aW9uUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJjdXN0b21DYXRlZ29yeURlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeURlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJY2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGNvbnRlbnRFbGVtZW50OwotCQlwdWJsaXNoQ2F0ZWdvcnlPbiA9IHRydWU7Ci0JCXNldEljb25TZWN0aW9uT24odHJ1ZSk7Ci0JCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gY2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IEN1c3RvbUNhdGVnb3J5RmlsdGVyKCk7Ci0JCS8vIHNldCBhZGRpdGlvbmFsIGZpbHRlciBmb3IgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IGNoZWNraW5nCi0JCSgoQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJY2F0ZWdvcnkpIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQkKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jdXN0b21jYXRlZ29yeV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jdXN0b21jYXRlZ29yeV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tY2F0ZWdvcnlfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9ICBBdXRob3JpbmdVSVJlc291cmNlcy5jdXN0b21jYXRlZ29yeV9JY29uU2VjdGlvbl9kZXNjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTNjNTQ4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogRGVzY3JpcHRpb24gcGFnZSBmb3IgZGVsaXZlcnkgcHJvY2VzcwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBleHRlbmRzIFByb2Nlc3NEZXNjcmlwdGlvbiB7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX3NjYWxlLCBjdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9yaXNrX2xldmVsLCBjdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlczsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfcHJvamVjdF9tZW1iZXJfZXhwZXJ0aXNlLAotCQkJY3RybF90eXBlX29mX2NvbnRyYWN0OwotCi0JcHJpdmF0ZSBEZWxpdmVyeVByb2Nlc3MgZGVsaXZlcnlQcm9jZXNzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0Zvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZGVsaXZlcnlQcm9jZXNzID0gKERlbGl2ZXJ5UHJvY2VzcykgcHJvY2VzczsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzRGVzY3JpcHRpb24jY3JlYXRlRGV0YWlsU2VjdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGV0YWlsU2VjdGlvbigpIHsKLQkJc3VwZXIuY3JlYXRlRGV0YWlsU2VjdGlvbigpOwotCi0JCS8vIHNjYWxlCi0JCWN0cmxfc2NhbGUgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NfU2NhbGUsIDQwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHByb2plY3QgY2hhcmFjdGVyaXN0aWNzCi0JCWN0cmxfcHJvamVjdF9jaGFyYWN0ZXJpc3RpY3MgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24oCi0JCQkJdG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzLCA0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyByaXNrIGxldmVsCi0JCWN0cmxfcmlza19sZXZlbCA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX1Jpc2tMZXZlbCwgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCQkvLyBFc3RpbWF0aW5nIHRlY2huaXF1ZQotCQljdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlcyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX0VzdGltYXRpbmdUZWNobmlxdWUsIDQwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsgCi0KLQkJLy8gUHJvamVjdCBNZW1iZXIgZXhwZXJ0aXNlCi0JCWN0cmxfcHJvamVjdF9tZW1iZXJfZXhwZXJ0aXNlID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKAotCQkJCXRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NfUHJvamVjdE1lbWJlckV4cGVydGlzZSwgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gVHlwZSBvZiBjb250cmFjdAotCQljdHJsX3R5cGVfb2ZfY29udHJhY3QgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24oCi0JCQkJdG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19UeXBlT2ZDb250cmFjdCwgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCX0KLQotCS8qKgotCSAqIExvYWRzIGluaXRpYWwgZGF0YSBmcm9tIG1vZGVsCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlByb2Nlc3NEZXNjcmlwdGlvbiNsb2FkRGF0YSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERhdGEoKSB7Ci0JCXN1cGVyLmxvYWREYXRhKCk7Ci0KLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBjb250ZW50ID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pIGRlbGl2ZXJ5UHJvY2VzcwotCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJU3RyaW5nIHNjYWxlID0gY29udGVudC5nZXRTY2FsZSgpOwotCQlTdHJpbmcgcHJvamVjdENoYXIgPSBjb250ZW50LmdldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKTsKLQkJU3RyaW5nIGVzdGltYXRpbmdUZWNobmlxdWUgPSBjb250ZW50LmdldEVzdGltYXRpbmdUZWNobmlxdWUoKTsKLQkJU3RyaW5nIHJpc2tMZXZlbCA9IGNvbnRlbnQuZ2V0Umlza0xldmVsKCk7Ci0JCVN0cmluZyBwcm9qZWN0TWVtYmVyRXhwZXJ0aWVzZSA9IGNvbnRlbnQuZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpOwotCQlTdHJpbmcgdHlwZU9mQ29udHJhY3QgPSBjb250ZW50LmdldFR5cGVPZkNvbnRyYWN0KCk7Ci0KLQkJY3RybF9zY2FsZS5zZXRUZXh0KHNjYWxlID09IG51bGwgPyAiIiA6IHNjYWxlKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzCi0JCQkJLnNldFRleHQocHJvamVjdENoYXIgPT0gbnVsbCA/ICIiIDogcHJvamVjdENoYXIpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfZXN0aW1hdGluZ190ZWNobmlxdWVzCi0JCQkJLnNldFRleHQoZXN0aW1hdGluZ1RlY2huaXF1ZSA9PSBudWxsID8gIiIgOiBlc3RpbWF0aW5nVGVjaG5pcXVlKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3Jpc2tfbGV2ZWwuc2V0VGV4dChyaXNrTGV2ZWwgPT0gbnVsbCA/ICIiIDogcmlza0xldmVsKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3Byb2plY3RfbWVtYmVyX2V4cGVydGlzZQotCQkJCS5zZXRUZXh0KHByb2plY3RNZW1iZXJFeHBlcnRpZXNlID09IG51bGwgPyAiIiA6IHByb2plY3RNZW1iZXJFeHBlcnRpZXNlKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3R5cGVfb2ZfY29udHJhY3QKLQkJCQkuc2V0VGV4dCh0eXBlT2ZDb250cmFjdCA9PSBudWxsID8gIiIgOiB0eXBlT2ZDb250cmFjdCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlByb2Nlc3NEZXNjcmlwdGlvbiNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0JCU1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSk7Ci0JCWZpbmFsIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCWZpbmFsIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gY29udGVudCA9IChvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKSBkZWxpdmVyeVByb2Nlc3MKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0KLQkJY3RybF9zY2FsZS5zZXRNb2RhbE9iamVjdChkZWxpdmVyeVByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3NjYWxlLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpKTsKLQkJY3RybF9zY2FsZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3NjYWxlLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9zY2FsZTsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRTY2FsZSgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZGVsaXZlcnlQcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpLCBuZXdDb250ZW50LAotCQkJCQkJCS0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfcHJvamVjdF9jaGFyYWN0ZXJpc3RpY3Muc2V0TW9kYWxPYmplY3QoZGVsaXZlcnlQcm9jZXNzCi0JCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9wcm9qZWN0X2NoYXJhY3RlcmlzdGljcy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpKTsKLQkJY3RybF9wcm9qZWN0X2NoYXJhY3RlcmlzdGljcy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCW5ldyBMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQkJOiBjdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzOwotCQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkJCS5tdXN0UmVzdG9yZVZhbHVlKGNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQlkZWxpdmVyeVByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSwKLQkJCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJY3RybF9yaXNrX2xldmVsLnNldE1vZGFsT2JqZWN0KGRlbGl2ZXJ5UHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfcmlza19sZXZlbC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCkpOwotCQljdHJsX3Jpc2tfbGV2ZWwuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9yaXNrX2xldmVsLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9yaXNrX2xldmVsOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldFJpc2tMZXZlbCgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZGVsaXZlcnlQcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlcy5zZXRNb2RhbE9iamVjdChkZWxpdmVyeVByb2Nlc3MKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlcy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpKTsKLQkJY3RybF9lc3RpbWF0aW5nX3RlY2huaXF1ZXMuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9lc3RpbWF0aW5nX3RlY2huaXF1ZXMuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlczsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQlkZWxpdmVyeVByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpLAotCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9wcm9qZWN0X21lbWJlcl9leHBlcnRpc2Uuc2V0TW9kYWxPYmplY3QoZGVsaXZlcnlQcm9jZXNzCi0JCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9wcm9qZWN0X21lbWJlcl9leHBlcnRpc2UKLQkJCQkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpKTsKLQkJY3RybF9wcm9qZWN0X21lbWJlcl9leHBlcnRpc2UuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9wcm9qZWN0X21lbWJlcl9leHBlcnRpc2UuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQk6IGN0cmxfcHJvamVjdF9tZW1iZXJfZXhwZXJ0aXNlOwotCQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpOwotCQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkJCS5tdXN0UmVzdG9yZVZhbHVlKGNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQlkZWxpdmVyeVByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKSwKLQkJCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJY3RybF90eXBlX29mX2NvbnRyYWN0LnNldE1vZGFsT2JqZWN0KGRlbGl2ZXJ5UHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfdHlwZV9vZl9jb250cmFjdC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fVHlwZU9mQ29udHJhY3QoKSk7Ci0JCWN0cmxfdHlwZV9vZl9jb250cmFjdC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3R5cGVfb2ZfY29udHJhY3QuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX3R5cGVfb2ZfY29udHJhY3Q7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0VHlwZU9mQ29udHJhY3QoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGRlbGl2ZXJ5UHJvY2VzcwotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fVHlwZU9mQ29udHJhY3QoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0Rlc2NyaXB0aW9uI3JlZnJlc2goYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJc3VwZXIucmVmcmVzaChlZGl0YWJsZSk7Ci0JCWN0cmxfZXN0aW1hdGluZ190ZWNobmlxdWVzLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9wcm9qZWN0X2NoYXJhY3RlcmlzdGljcy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfcHJvamVjdF9tZW1iZXJfZXhwZXJ0aXNlLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9yaXNrX2xldmVsLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9zY2FsZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfdHlwZV9vZl9jb250cmFjdC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGVzY3JpcHRpb25Gb3JtUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rlc2NyaXB0aW9uRm9ybVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWVkYmJkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGVzY3JpcHRpb25Gb3JtUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQ2hhbmdlSGlzdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLlJlbmFtZUZpbGVDb25mbGljdERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ29udGVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuRWRpdG9yc0NvbnRleHRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkNvbnZlcnRHdWlkYW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRGVjb3JhdGVkRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkltYWdlSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkRhdGVGb3JtYXQ7Ci0KLQotLyoqCi0gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIERlc2NyaXB0aW9uIHBhZ2VzIGluIHRoZSBNZXRob2QgZWRpdG9ycy4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIGZpeCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NjM4MgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVzY3JpcHRpb25Gb3JtUGFnZSBleHRlbmRzIEJhc2VGb3JtUGFnZSBpbXBsZW1lbnRzIElSZWZyZXNoYWJsZSB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfQVBQTElDQUJMRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubm90QXBwbGljYWJsZV90ZXh0OyAKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUklCVVRFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29udHJpYnV0ZXNfdGV4dDsgCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX0NPTlRSSUJVVEVTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5sb2NhbENvbnRyaWJ1dGVzX3RleHQ7ICAKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVORFNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4dGVuZHNfdGV4dDsgCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBMQUNFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwbGFjZXNfdGV4dDsgCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfUkVQTEFDRVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmxvY2FsUmVwbGFjZXNfdGV4dDsgCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5EU19SRVBMQUNFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXh0ZW5kc1JlcGxhY2VzX3RleHQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSk7Ci0KLQkvLyBDb21wb3NpdGVzIGFuZCBzZWN0aW9ucy4KLQlwcm90ZWN0ZWQgU2VjdGlvbiBmb3JtU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgc2VjdGlvbkNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgZXhwYW5kZWRDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBnZW5lcmFsU2VjdGlvbjsKLQotCXByb3RlY3RlZCBTZWN0aW9uIHZhcmlhYmlsaXR5U2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgZ2VuZXJhbENvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgdmFyaWFiaWxpdHlDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiB2ZXJzaW9uU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgdmVyc2lvbkNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBTZWN0aW9uIGljb25TZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBpY29uQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBDYW52YXMgcGFuZTE7Ci0KLQlwcml2YXRlIENhbnZhcyBwYW5lMzsKLQotCXByb3RlY3RlZCBTZWN0aW9uIGRldGFpbFNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGRldGFpbENvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBTZWN0aW9uIG5vdGF0aW9uU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgbm90YXRpb25Db21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiB0YWlsb3JpbmdTZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSB0YWlsb3JpbmdDb21wb3NpdGU7Ci0KLQkvLyBFZGl0IGNvbnRyb2xzLgotCXByb3RlY3RlZCBUZXh0IGN0cmxfbmFtZTsKLQotCXByb3RlY3RlZCBUZXh0IGN0cmxfcHJlc2VudGF0aW9uX25hbWU7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgY3RybF90eXBlX2xhYmVsOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX3R5cGVfYnV0dG9uOwotCi0JcHJvdGVjdGVkIFRleHQgY3RybF9icmllZl9kZXNjOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBjdHJsX2Z1bGxfZGVzYzsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgY3RybF9rZXk7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0RWRpdG9yIGN0cmxfZXhwYW5kZWQ7Ci0KLQlwcm90ZWN0ZWQgQ29tYm9WaWV3ZXIgdmlld2VyX3ZhcmlhYmlsaXR5OwotCi0JcHJvdGVjdGVkIENvbWJvIGN0cmxfdmFyaWFiaWxpdHk7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgbGFiZWxfYmFzZTsKLQotCXByb3RlY3RlZCBUYWJsZVZpZXdlciBiYXNlX3ZpZXdlcjsKLQotCXByb3RlY3RlZCBUYWJsZSBjdHJsX2Jhc2U7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfYmFzZV9idXR0b247Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBhY3RpdmVDb250cm9sOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYXV0aG9yczsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2NoYW5nZV9kYXRlOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfY2hhbmdlX2Rlc2M7Ci0KLQlwcml2YXRlIEJ1dHRvbiB2aWV3X2hpc3RvcnlfYnV0dG9uOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfdmVyc2lvbjsKLQotCXByb3RlY3RlZCBMYWJlbCBsYWJlbF9jb3B5cmlnaHQ7Ci0KLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgY29weXJpZ2h0X3ZpZXdlcjsKLQotCXByb3RlY3RlZCBUYWJsZSBjdHJsX2NvcHlyaWdodDsKLQotCXByaXZhdGUgQnV0dG9uIGNvcHlyaWdodF9idXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBjb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0OwotCi0JcHJvdGVjdGVkIEltYWdlSHlwZXJsaW5rIGV4cGFuZERldGFpbExpbms7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgZXhwYW5kRGV0YWlsTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VIeXBlcmxpbmsgZXhwYW5kTm90YXRpb25MaW5rOwotCi0JcHJvdGVjdGVkIExhYmVsIGV4cGFuZE5vdGF0aW9uTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VIeXBlcmxpbmsgZXhwYW5kVGFpbG9yaW5nTGluazsKLQotCXByb3RlY3RlZCBMYWJlbCBleHBhbmRUYWlsb3JpbmdMYWJlbDsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgY3RybF9wdXJwb3NlOwotCi0JcHJvdGVjdGVkIFRleHQgY3RybF9leHRlcm5hbF9pZDsKLQotCXByaXZhdGUgSW1hZ2Ugc2hhcGVJbWFnZTsKLQotCXByaXZhdGUgSW1hZ2Ugbm9kZUltYWdlOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX3NlbGVjdF9zaGFwZUljb25fYnV0dG9uOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b247Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfc2VsZWN0X25vZGVJY29uX2J1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gY3RybF9jbGVhcl9ub2RlSWNvbl9idXR0b247Ci0JCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX3B1Ymxpc2hfY2F0ZWdvcmllc19idXR0b247Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VIeXBlcmxpbmsgZXhwYW5kVmVyc2lvbkxpbms7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgZXhwYW5kVmVyc2lvbkxhYmVsOwotCi0JcHJvdGVjdGVkIEltYWdlSHlwZXJsaW5rIGV4cGFuZExpbms7Ci0KLQlwcm90ZWN0ZWQgRGVjb3JhdGVkRmllbGQgZXhwYW5kTGFiZWw7Ci0KLQlwcml2YXRlIFN0cmluZyBsYXN0Q2hhbmdlSGlzdG9yeSA9ICIiOwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlclZhcmlhYmlsaXR5OwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlckJhc2U7Ci0JCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXJWYXJpYWJpbGl0eSA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJCVZhcmlhYmlsaXR5VHlwZSB2YXJPYmplY3QgPSAoVmFyaWFiaWxpdHlUeXBlKSBvYmplY3Q7Ci0JCQlpZiAodmFyT2JqZWN0ID09IFZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMKQotCQkJCXJldHVybiBOT1RfQVBQTElDQUJMRV9URVhUOwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCkKLQkJCQlyZXR1cm4gQ09OVFJJQlVURVNfVEVYVDsKLQkJCWlmICh2YXJPYmplY3QgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTl9MSVRFUkFMKQotCQkJCXJldHVybiBMT0NBTF9DT05UUklCVVRFU19URVhUOwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKQotCQkJCXJldHVybiBFWFRFTkRTX1RFWFQ7Ci0JCQlpZiAodmFyT2JqZWN0ID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFU19MSVRFUkFMKQotCQkJCXJldHVybiBSRVBMQUNFU19URVhUOwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlRfTElURVJBTCkKLQkJCQlyZXR1cm4gTE9DQUxfUkVQTEFDRVNfVEVYVDsKLQkJCWlmICh2YXJPYmplY3QgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfUkVQTEFDRVNfTElURVJBTCkKLQkJCQlyZXR1cm4gRVhURU5EU19SRVBMQUNFU19URVhUOwotCQkJCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlckJhc2UgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgob2JqZWN0KTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvcHlyaWdodENvbnRlbnRQcm92aWRlcjsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgY29weXJpZ2h0TGFiZWxQcm92aWRlckJhc2UgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBtb2RlbE1vZGlmeUxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcjsKLQotCS8vIEVkaXRpbmcgYW5kIGRpc3BsYXkgZmxhZ3MuCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVzY0V4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGdlbmVyYWxTZWN0aW9uRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGV0YWlsU2VjdGlvbkV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIG5vdGF0aW9uU2VjdGlvbkV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIHRhaWxvcmluZ1NlY3Rpb25FeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJzaW9uU2VjdGlvbkV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGVsZW1lbnRTZWN0aW9uRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaWNvblNlY3Rpb25FeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmdWxsRGVzY09uID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGtleUNvbnNpZGVyYXRpb25PbiA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBicmllZkRlc2NPbiA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbGVtZW50VHlwZU9uID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250ZW50RmllbGRPbiA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmVyc2lvblNlY3Rpb25PbiA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhbnlBdHRyaWJ1dGVNb2RpZmllZCA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhbFNlY3Rpb25PbiA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBub3RhdGlvblNlY3Rpb25PbiA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGV0YWlsU2VjdGlvbk9uID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBib29sZWFuIHRhaWxvcmluZ1NlY3Rpb25PbiA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFyaWFiaWxpdHlTZWN0aW9uT24gPSB0cnVlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHVycG9zZU9uID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleHRlcm5hbElkT24gPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGljb25TZWN0aW9uT24gPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwdWJsaXNoQ2F0ZWdvcnlPbiA9IGZhbHNlOwotCi0JLy8gY29tbWVudGVkIGJlY2F1c2UgdGhlc2UgdmFyaWFibGVzIGFyZSBub3QgaW4gdXNlCi0JLy8gcHJvdGVjdGVkIFN0cmluZyB2YXJpYWJpbGl0eVR5cGVOb25lID0gTk9UX0FQUExJQ0FCTEVfVEVYVDsKLQkvLyBwcm90ZWN0ZWQgU3RyaW5nIHZhcmlhYmlsaXR5VHlwZUNvbnRyaWJ1dGVzID0gQ09OVFJJQlVURVNfVEVYVDsKLQkvLyBwcm90ZWN0ZWQgU3RyaW5nIHZhcmlhYmlsaXR5VHlwZUV4dGVuZHMgPSBFWFRFTkRTX1RFWFQ7Ci0JLy8gcHJvdGVjdGVkIFN0cmluZyB2YXJpYWJpbGl0eVR5cGVSZXBsYWNlcyA9IFJFUExBQ0VTX1RFWFQ7Ci0KLQkvLyBJbnRlcm5hbCBJRHMgZm9yIHRoZSBzZWN0aW9ucy4KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBHRU5FUkFMX1NFQ1RJT05fSUQgPSAxOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgREVUQUlMX1NFQ1RJT05fSUQgPSAyOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl9TRUNUSU9OX0lEID0gMzsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE5PVEFUSU9OX1NFQ1RJT05fSUQgPSA0OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVEFJTE9SSU5HX1NFQ1RJT05fSUQgPSA1OwotCi0JcHJpdmF0ZSBpbnQgd2FybmluZ0NvdW50ID0gMTsKLQotCXByaXZhdGUgaW50IFNFQ1RJT05TID0gMDsKLQotCXByaXZhdGUgc3RhdGljIGludCBTSEFQRUlDT05fV0lEVEhfTUFYID0gMzI7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgU0hBUEVJQ09OX0hFSUdIVF9NQVggPSAzMjsKLQotCXByaXZhdGUgc3RhdGljIGludCBOT0RFSUNPTl9XSURUSF9NQVggPSAxNjsKLQotCXByaXZhdGUgc3RhdGljIGludCBOT0RFSUNPTl9IRUlHSFRfTUFYID0gMTY7Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGlzcG9zZWQ7Ci0KLQkvLyBUbyBoYW5kbGUgdGhlIGkxMThuIHByb3Blcmx5IGFuZCBhdm9pZCBzdHJpbmcgY29uY2F0ZW5hdGlvbi4KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIFN0cmluZyBkZXRhaWxTZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIFN0cmluZyB0YWlsb3JpbmdTZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIFN0cmluZyBub3RhdGlvblNlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgU3RyaW5nIHZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBTdHJpbmcgaWNvblNlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgU3RyaW5nIHZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwcml2YXRlIExhYmVsIG5vZGVJY29uUGF0aDsKLQotCXByaXZhdGUgTGFiZWwgc2hhcGVJY29uUGF0aDsKLQkKLQlwcml2YXRlIFN0cmluZ1tdIGltYWdlVHlwZXMgPSBuZXcgU3RyaW5nW10geyAiKi5naWY7ICouanBnOyAqLnBuZzsgKi5pY287ICouYm1wIiB9OwotCXByaXZhdGUgU3RyaW5nW10gaW1hZ2VOYW1lcyA9IG5ldyBTdHJpbmdbXSB7ICJJbWFnZSIrICIgKGdpZiwganBlZywgcG5nLCBpY28sIGJtcCkiIH07Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDb250ZW50IGZpbHRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWdlLgotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDb250ZW50IGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyQmFzZSgpIHsKLQkJY29udGVudFByb3ZpZGVyQmFzZSA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCUFycmF5TGlzdCBiYXNlX3NlbGVjdGVkX2xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGNvbnRlbnRFbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKQotCQkJCQliYXNlX3NlbGVjdGVkX2xpc3QuYWRkKGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSk7Ci0JCQkJcmV0dXJuIGJhc2Vfc2VsZWN0ZWRfbGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChWYXJpYWJpbGl0eUVsZW1lbnQuY2xhc3MpKSB7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWJhc2Vfdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJCYXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgZm9ybSBlZGl0b3IuCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBUaGUgdW5pcXVlIElEIGZvciB0aGUgZm9ybSBwYWdlLgotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZm9ybSBwYWdlLgotCSAqLwotCXB1YmxpYyBEZXNjcmlwdGlvbkZvcm1QYWdlKEZvcm1FZGl0b3IgZWRpdG9yLCBTdHJpbmcgaWQsIFN0cmluZyB0aXRsZSkgewotCQlzdXBlcihlZGl0b3IsIGlkLCB0aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkJhc2VGb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0KLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQljb250ZW50UHJvdmlkZXJWYXJpYWJpbGl0eSA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCQlMaXN0IHZhcmlhYmlsaXR5VHlwZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQl2YXJpYWJpbGl0eVR5cGVzTGlzdC5hZGQoVmFyaWFiaWxpdHlUeXBlLk5BX0xJVEVSQUwpOwotCQkJCQl2YXJpYWJpbGl0eVR5cGVzTGlzdAotCQkJCQkJCS5hZGQoVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwpOwotCQkJCQl2YXJpYWJpbGl0eVR5cGVzTGlzdC5hZGQoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUwpOwotCQkJCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlc0xpc3QudG9BcnJheSgpOwotCQkJCX0KLQkJCX07Ci0JCX0gZWxzZSB7Ci0JCQljb250ZW50UHJvdmlkZXJWYXJpYWJpbGl0eSA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCQlMaXN0IHZhcmlhYmlsaXR5VHlwZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQl2YXJpYWJpbGl0eVR5cGVzTGlzdC5hZGQoVmFyaWFiaWxpdHlUeXBlLk5BX0xJVEVSQUwpOwotCQkJCQl2YXJpYWJpbGl0eVR5cGVzTGlzdAotCQkJCQkJCS5hZGQoVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwpOwotCQkJCQl2YXJpYWJpbGl0eVR5cGVzTGlzdC5hZGQoVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCk7Ci0JCQkJCXZhcmlhYmlsaXR5VHlwZXNMaXN0LmFkZChWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVNfTElURVJBTCk7Ci0JCQkJCXZhcmlhYmlsaXR5VHlwZXNMaXN0LmFkZChWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19SRVBMQUNFU19MSVRFUkFMKTsKLQkJCQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZXNMaXN0LnRvQXJyYXkoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQlzdXBlci5jcmVhdGVGb3JtQ29udGVudChtYW5hZ2VkRm9ybSk7Ci0JCWNyZWF0ZUVkaXRvckNvbnRlbnQodG9vbGtpdCk7Ci0JCXNldENvbnRleHRIZWxwKCk7Ci0JCXNldEZvcm1UZXh0V2l0aFZhcmlhYmxlSW5mbygpOwotCQlsb2FkRGF0YSgpOwotCQlhZGRMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Rm9ybVRleHRXaXRoVmFyaWFibGVJbmZvKCkgewotCQlVSUhlbHBlci5zZXRGb3JtVGV4dChmb3JtLCBjb250ZW50RWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKiBAc2VlIFRuZ1V0aWwjZ2V0TGFiZWwgQ29kZSBtb3ZlZCB0byBUbmdVdGlsLmdldExhYmVsKGJlbG93IG1vcmUgc3BlY2lmaWMKLQkgKiAgICAgIG1ldGhvZClyZXR1cm5zIGxhYmVsIHdpdGggdmFyaWFiaWxpdHlJbmZvCi0JICogICAgICA8Y29kZT5UbmdVdGlsLmdldExhYmVsKFZhcmlhYmlsaXR5RWxlbWVudCBvYmplY3QsIFN0cmluZyBhbHRlcm5hdGl2ZUxhYmVsLCBib29sZWFuIHByZWZlckJhc2UpPC9jb2RlPgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoVmFyaWFiaWxpdHlFbGVtZW50IG9iamVjdCwgU3RyaW5nIGFsdGVybmF0aXZlTGFiZWwsCi0JCQlib29sZWFuIHByZWZlckJhc2UpIHsKLQkJU3RyaW5nIGxhYmVsID0gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGFsdGVybmF0aXZlTGFiZWwpOwotCQlpZiAocHJlZmVyQmFzZSAmJiBvYmplY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gb2JqZWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJU3RyaW5nIHZhcmlhYmlsaXR5VHh0ID0gbnVsbDsKLQkJCWlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFU19MSVRFUkFMKSB7Ci0JCQkJdmFyaWFiaWxpdHlUeHQgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJLmNvbnRyaWJ1dGVzX3RvX3RleHQ7IAotCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT05fTElURVJBTCkgewotCQkJCXZhcmlhYmlsaXR5VHh0ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJLmxvY2FsQ29udHJpYnV0ZXNfdGV4dDsgCQkJCi0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCkgewkJCQkJCi0JCQkJdmFyaWFiaWxpdHlUeHQgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJLmV4dGVuZHNfdGV4dDsKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVNfTElURVJBTCkgewotCQkJCXZhcmlhYmlsaXR5VHh0ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCS5yZXBsYWNlc190ZXh0OyAKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlRfTElURVJBTCkgewotCQkJCXZhcmlhYmlsaXR5VHh0ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCS5sb2NhbFJlcGxhY2VzX3RleHQ7IAotCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX1JFUExBQ0VTX0xJVEVSQUwpIHsKLQkJCQl2YXJpYWJpbGl0eVR4dCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJLmV4dGVuZHNSZXBsYWNlc190ZXh0OyAKLQkJCX0KLQkJCWlmICh2YXJpYWJpbGl0eVR4dCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIobGFiZWwpCi0JCQkJCQkuYXBwZW5kKCIgKCIpLmFwcGVuZCh2YXJpYWJpbGl0eVR4dCkuYXBwZW5kKCIgJyIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLmFwcGVuZCgKLQkJCQkJCQkJVG5nVXRpbC5nZXRMYWJlbChvYmplY3QKLQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLAotCQkJCQkJCQkJCWFsdGVybmF0aXZlTGFiZWwpKS5hcHBlbmQoIiciKTsgLy8kTk9OLU5MUy0xJAotCQkJCU1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ob2JqZWN0Ci0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJCQlpZiAoYmFzZVBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJCXN0ckJ1ZgotCQkJCQkJCS5hcHBlbmQoIiBpbiAnIikuYXBwZW5kKGJhc2VQbHVnaW4uZ2V0TmFtZSgpKS5hcHBlbmQoIicpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlsYWJlbCA9IHN0ckJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGVkaXRvciB0YWIgY29udGVudAotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQljcmVhdGVGb3JtQ29tcG9zaXRlcyh0b29sa2l0KTsKLQkJbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpOwotCQkvLyBDcmVhdGUgdGhlIEdlbmVyYWwgc2VjdGlvbi4KLQkJaWYgKGdlbmVyYWxTZWN0aW9uT24pIHsKLQkJCWNyZWF0ZUdlbmVyYWxTZWN0aW9uKHRvb2xraXQpOwotCQkJU0VDVElPTlMrKzsKLQkJfQotCi0JCS8vIENyZWF0ZSB0aGUgRGV0YWlsIHNlY3Rpb24uCi0JCWlmIChkZXRhaWxTZWN0aW9uT24pIHsKLQkJCWNyZWF0ZURldGFpbFNlY3Rpb24odG9vbGtpdCk7Ci0JCQlTRUNUSU9OUysrOwotCQl9Ci0KLQkJLy8gQ3JlYXRlIHRoZSBOb3RhdGlvbiBzZWN0aW9uLgotCQlpZiAobm90YXRpb25TZWN0aW9uT24pIHsKLQkJCWNyZWF0ZU5vdGF0aW9uU2VjdGlvbih0b29sa2l0KTsKLQkJCVNFQ1RJT05TKys7Ci0JCX0KLQotCQkvLyBDcmVhdGUgdGhlIFRhaWxvcmluZyBTZWN0aW9uLgotCQlpZiAodGFpbG9yaW5nU2VjdGlvbk9uKSB7Ci0JCQljcmVhdGVUYWlsb3JpbmdTZWN0aW9uKHRvb2xraXQpOwotCQkJU0VDVElPTlMrKzsKLQkJfQotCi0JCS8vIENyZWF0ZSB0aGUgVmVyc2lvbiBzZWN0aW9uLgotCQlpZiAodmVyc2lvblNlY3Rpb25PbikgewotCQkJY3JlYXRlVmVyc2lvblNlY3Rpb24odG9vbGtpdCk7Ci0JCQljcmVhdGVWZXJzaW9uU2VjdGlvbkNvbnRlbnQoKTsKLQkJCVNFQ1RJT05TKys7Ci0JCX0KLQotCQlpZiAodmFyaWFiaWxpdHlTZWN0aW9uT24pIHsKLQkJCWNyZWF0ZVZhcmlhYmlsaXR5U2VjdGlvbih0b29sa2l0KTsKLQkJCVNFQ1RJT05TKys7Ci0JCX0KLQotCQkvLyBJY29uIFNlY3Rpb24KLQkJaWYgKGljb25TZWN0aW9uT24pIHsKLQkJCWNyZWF0ZUljb25TZWN0aW9uKHRvb2xraXQpOwotCQkJY3JlYXRlSWNvblNlY3Rpb25Db250ZW50KCk7Ci0JCQlTRUNUSU9OUysrOwotCQl9Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IodmFyaWFiaWxpdHlDb21wb3NpdGUpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihleHBhbmRlZENvbXBvc2l0ZSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGdlbmVyYWxDb21wb3NpdGUpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcih2ZXJzaW9uQ29tcG9zaXRlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRm9ybUNvbXBvc2l0ZXMoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQkvLyBDcmVhdGUgdGhlIG1haW4gc2VjdGlvbiAodXNlZCBmb3Igc3dhcHBpbmcgZGlzcGxheSBvZgotCQkvLyBzZWN0aW9uQ29tcG9zaXRlIGFuZCBleHBhbmRlZENvbXBvc2l0ZSkuCi0JCWZvcm1TZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGZvcm0uZ2V0Qm9keSgpLCBTZWN0aW9uLk5PX1RJVExFKTsKLQkJewotCQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJCWZvcm1TZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQkJZm9ybVNlY3Rpb24uc2V0TGF5b3V0KG5ldyBUYWJsZVdyYXBMYXlvdXQoKSk7Ci0JCX0KLQotCQkvLyBDcmVhdGUgdGhlIGNvbXBvc2l0ZSBmb3IgdGhlIHNlY3Rpb25zLgotCQlzZWN0aW9uQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZm9ybVNlY3Rpb24sIFNXVC5OT05FKTsKLQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKSk7Ci0JCXNlY3Rpb25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBUYWJsZVdyYXBMYXlvdXQoKSk7Ci0JCWZvcm1TZWN0aW9uLnNldENsaWVudChzZWN0aW9uQ29tcG9zaXRlKTsKLQotCQkvLyBDcmVhdGUgdGhlIGNvbXBvc2l0ZSBmb3IgdGhlIFJpY2hUZXh0RWRpdG9yLgotCQlleHBhbmRlZENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGZvcm1TZWN0aW9uLCBTV1QuTk9ORSk7Ci0JCXsKLQkJCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKHRkKTsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0KLQotCQkvLyBBZGQgdGhlIGV4cGFuZC9jb2xsYXBzZSBoeXBlcmxpbmsgaW1hZ2UuCi0JCWV4cGFuZExpbmsgPSB0b29sa2l0LmNyZWF0ZUltYWdlSHlwZXJsaW5rKGV4cGFuZGVkQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWV4cGFuZExpbmsuc2V0SW1hZ2UoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0VYUEFOREVEKTsKLQkJZXhwYW5kTGluay5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5jbG9zZVJURSk7Ci0JCWV4cGFuZExpbmsuc2V0VW5kZXJsaW5lZChmYWxzZSk7Ci0JCWV4cGFuZExpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQl0b2dnbGUoZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIEFkZCB0aGUgZXhwYW5kL2NvbGxhcHNlIGh5cGVybGluayB0ZXh0LgotCQlleHBhbmRMYWJlbCA9IGNyZWF0ZURlY29yYXRlZExhYmVsKHRvb2xraXQsIGV4cGFuZGVkQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBHZW5lcmFsIHNlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlnZW5lcmFsU2VjdGlvbiA9IGNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuR0VORVJBTF9JTkZPX1NFQ1RJT05fTkFNRSwKLQkJCQlnZXRHZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uKCkpOwotCQlnZW5lcmFsQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGdlbmVyYWxTZWN0aW9uKTsKLQkJKChHcmlkTGF5b3V0KSBnZW5lcmFsQ29tcG9zaXRlLmdldExheW91dCgpKS5udW1Db2x1bW5zID0gNDsKLQkJY3JlYXRlR2VuZXJhbFNlY3Rpb25Db250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgR2VuZXJhbCBzZWN0aW9uIGNvbnRlbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUdlbmVyYWxTZWN0aW9uQ29udGVudCgpIHsKLQkJLy8gQWRkIHRoZSBOYW1lIGxhYmVsIGFuZCB0ZXh0IGNvbnRyb2wuCi0JCWN0cmxfbmFtZSA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsMyh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5OQU1FX1RFWFQsIFNXVC5ERUZBVUxULCBTV1QuU0lOR0xFKTsKLQotCQkvLyBBZGQgdGhlIFByZXNlbnRhdGlvbiBuYW1lIGxhYmVsIGFuZCB0ZXh0IGNvbnRyb2wuCi0JCWN0cmxfcHJlc2VudGF0aW9uX25hbWUgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDModG9vbGtpdCwKLQkJCQlnZW5lcmFsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuUFJFU0VOVEFUSU9OX05BTUVfVEVYVCwKLQkJCQlTV1QuREVGQVVMVCwgU1dULlNJTkdMRSk7Ci0KLQkJaWYgKGVsZW1lbnRUeXBlT24pIHsKLQkJCWNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5UWVBFX1RFWFQsIDIpOwotCQkJY3RybF90eXBlX2xhYmVsID0gY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQkJY3RybF90eXBlX2xhYmVsLnNldEJhY2tncm91bmQoRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJCS5nZXRTeXN0ZW1Db2xvcigxOSkpOwotCQkJCWN0cmxfdHlwZV9sYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCX0KLQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJY3RybF90eXBlX2J1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJCQlBdXRob3JpbmdVSVRleHQuQ0hBTkdFX1RZUEVfQlVUVE9OX1RFWFQsIFNXVC5QVVNIKTsKLQkJCQl7Ci0JCQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCQkJY3RybF90eXBlX2J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCQl9Ci0JCQkJaWYgKENvbnZlcnRHdWlkYW5jZVR5cGUKLQkJCQkJCS5nZXRWYWxpZE5ld0d1aWRhbmNlVHlwZXMoKEd1aWRhbmNlKSBjb250ZW50RWxlbWVudCkgPT0gbnVsbCkgewotCQkJCQljdHJsX3R5cGVfYnV0dG9uLnNldFZpc2libGUoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChleHRlcm5hbElkT24pIHsKLQkJCWN0cmxfZXh0ZXJuYWxfaWQgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDModG9vbGtpdCwKLQkJCQkJZ2VuZXJhbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LlVOSVFVRV9JRF9URVhULAotCQkJCQlTV1QuREVGQVVMVCwgU1dULlNJTkdMRSk7Ci0JCX0KLQotCQlpZiAoYnJpZWZEZXNjT24pIHsKLQkJCWN0cmxfYnJpZWZfZGVzYyA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsMyh0b29sa2l0LAotCQkJCQlnZW5lcmFsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuQlJJRUZfREVTQ1JJUFRJT05fVEVYVCwKLQkJCQkJNDAsIFNXVC5NVUxUSSB8IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCk7Ci0JCX0JCQotCi0JCWlmIChwdWJsaXNoQ2F0ZWdvcnlPbikgewotCQkJY3RybF9wdWJsaXNoX2NhdGVnb3JpZXNfYnV0dG9uID0gdG9vbGtpdAotCQkJLmNyZWF0ZUJ1dHRvbigKLQkJCQkJZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0LlBVQkxJU0hfQ0FURUdPUklFU19URVhULCBTV1QuQ0hFQ0spOyAKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJY3RybF9wdWJsaXNoX2NhdGVnb3JpZXNfYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBDb250ZW50IFZhcmlhYmlsaXR5IHNlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmFyaWFiaWxpdHlTZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJdmFyaWFiaWxpdHlTZWN0aW9uID0gY3JlYXRlU2VjdGlvbih0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5WQVJJQUJJTElUWV9TRUNUSU9OX05BTUUsCi0JCQkJZ2V0VmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCQotCQl2YXJpYWJpbGl0eUNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHZhcmlhYmlsaXR5U2VjdGlvbik7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMjQ7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQl2YXJpYWJpbGl0eUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQl2YXJpYWJpbGl0eUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoNSwgZmFsc2UpKTsKLQkJdmFyaWFiaWxpdHlTZWN0aW9uLnNldENsaWVudCh2YXJpYWJpbGl0eUNvbXBvc2l0ZSk7Ci0KLQkJY3RybF92YXJpYWJpbGl0eSA9IGNyZWF0ZUNvbWJvV2l0aExhYmVsMyh0b29sa2l0LCB2YXJpYWJpbGl0eUNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuVkFSSUFCSUxJVFlfVFlQRV9URVhUKTsKLQotCQl2aWV3ZXJfdmFyaWFiaWxpdHkgPSBuZXcgQ29tYm9WaWV3ZXIoY3RybF92YXJpYWJpbGl0eSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMjQ7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQl2aWV3ZXJfdmFyaWFiaWxpdHkuZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQl2aWV3ZXJfdmFyaWFiaWxpdHkuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclZhcmlhYmlsaXR5KTsKLQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlclZhcmlhYmlsaXR5KTsKLQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldElucHV0KGNvbnRlbnRFbGVtZW50KTsKLQotCQl0b29sa2l0LmNyZWF0ZUxhYmVsKHZhcmlhYmlsaXR5Q29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy9TdHJpbmcgYmFzZUVsZW1lbnQgPSBMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dExvd2VyKG1ldGhvZEVsZW1lbnQpOwotCQlsYWJlbF9iYXNlID0gY3JlYXRlTGFiZWwodG9vbGtpdCwgdmFyaWFiaWxpdHlDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkJBU0VfRUxFTUVOVF9URVhULCAyKTsKLQkJY3RybF9iYXNlID0gY3JlYXRlVGFibGUodG9vbGtpdCwgdmFyaWFiaWxpdHlDb21wb3NpdGUsIFNXVC5TSU5HTEUKLQkJCQl8IFNXVC5SRUFEX09OTFksIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkJFR0lOTklORywgNSwgMzAwLCAxLCAyKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSAyNDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJCWN0cmxfYmFzZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWJhc2Vfdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfYmFzZSk7Ci0JCWluaXRDb250ZW50UHJvdmlkZXJCYXNlKCk7Ci0JCWJhc2Vfdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlckJhc2UpOwotCQliYXNlX3ZpZXdlci5zZXRJbnB1dChjb250ZW50RWxlbWVudCk7Ci0KLQkJQ29tcG9zaXRlIGJhc2VCdXR0b25QYW5lID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHZhcmlhYmlsaXR5Q29tcG9zaXRlLCAKLQkJCQlHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcsIDEsIDEsIDEpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQkJYmFzZUJ1dHRvblBhbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY3RybF9iYXNlX2J1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJhc2VCdXR0b25QYW5lLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5TRUxFQ1RfQlVUVE9OX1RFWFQsIFNXVC5TSU1QTEUpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMTAwOwotCQkJY3RybF9iYXNlX2J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCS8vIFNldCBmb2N1cyBvbiB0aGUgTmFtZSB0ZXh0IGNvbnRyb2wuCi0JCURpc3BsYXkgZGlzcGxheSA9IGZvcm0uZ2V0Qm9keSgpLmdldERpc3BsYXkoKTsKLQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYoY3RybF9uYW1lLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQkKLQkJCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBjb250ZW50RWxlbWVudAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDaGFuZ2VEYXRlKCkgPT0gbnVsbCkKLQkJCQkJCWN0cmxfbmFtZS5zZXRTZWxlY3Rpb24oMCwgY3RybF9uYW1lLmdldFRleHQoKS5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJY3RybF9uYW1lLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0KLQkJaWYgKGJyaWVmRGVzY09uKSB7Ci0JCQljdHJsX2JyaWVmX2Rlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmIChwdXJwb3NlT24pIHsKLQkJCWN0cmxfcHVycG9zZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKGZ1bGxEZXNjT24pIHsKLQkJCWN0cmxfZnVsbF9kZXNjLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAoa2V5Q29uc2lkZXJhdGlvbk9uKSB7Ci0JCQljdHJsX2tleS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKGV4dGVybmFsSWRPbikgewotCQkJY3RybF9leHRlcm5hbF9pZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKGVsZW1lbnRUeXBlT24pIHsKLQkJCWN0cmxfdHlwZV9idXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKHZhcmlhYmlsaXR5U2VjdGlvbk9uKSB7Ci0JCQljdHJsX3ZhcmlhYmlsaXR5LnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJY3RybF9iYXNlX2J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCWlmICgoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfdmFyaWFiaWxpdHkuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSA9PSBWYXJpYWJpbGl0eVR5cGUuTkFfTElURVJBTCkgewotCQkJCWN0cmxfYmFzZV9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHZlcnNpb25TZWN0aW9uT24pIHsKLQkJCWN0cmxfY2hhbmdlX2RhdGUuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJY3RybF9jaGFuZ2VfZGVzYy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQljdHJsX2F1dGhvcnMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJY3RybF92ZXJzaW9uLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCWNvcHlyaWdodF9idXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQlzZXRDb3B5cmlnaHRCdXR0b25EZXNlbGVjdCgpOwotCQl9Ci0JCWlmIChpY29uU2VjdGlvbk9uKSB7Ci0JCQljdHJsX3NlbGVjdF9zaGFwZUljb25fYnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJY3RybF9jbGVhcl9zaGFwZUljb25fYnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUKLQkJCQkJJiYgY29udGVudEVsZW1lbnQuZ2V0U2hhcGVpY29uKCkgIT0gbnVsbCk7Ci0JCQljdHJsX3NlbGVjdF9ub2RlSWNvbl9idXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQljdHJsX2NsZWFyX25vZGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlCi0JCQkJCSYmIGNvbnRlbnRFbGVtZW50LmdldE5vZGVpY29uKCkgIT0gbnVsbCk7Ci0JCX0KLQkJaWYgKGN0cmxfZXhwYW5kZWQgIT0gbnVsbCkgewotCQkJY3RybF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIERldGFpbCBzZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURldGFpbFNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlkZXRhaWxTZWN0aW9uID0gY3JlYXRlU2VjdGlvbih0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ERVRBSUxfU0VDVElPTl9OQU1FLAotCQkJCWdldERldGFpbFNlY3Rpb25EZXNjcmlwdGlvbigpKTsKLQkJZGV0YWlsQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGRldGFpbFNlY3Rpb24pOwotCQljcmVhdGVEZXRhaWxTZWN0aW9uQ29udGVudCgpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihkZXRhaWxDb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIERldGFpbCBzZWN0aW9uIGNvbnRlbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURldGFpbFNlY3Rpb25Db250ZW50KCkgewotCQlpZiAocHVycG9zZU9uKSB7Ci0JCQljdHJsX3B1cnBvc2UgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuUFVSUE9TRV9URVhULCA0MCwgNDAwLAotCQkJCQlERVRBSUxfU0VDVElPTl9JRCk7Ci0JCX0KLQotCQlpZiAoZnVsbERlc2NPbikgewotCQkJY3RybF9mdWxsX2Rlc2MgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuTUFJTl9ERVNDUklQVElPTl9URVhULAotCQkJCQkxMDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOwotCi0JCX0KLQotCQlpZiAoa2V5Q29uc2lkZXJhdGlvbk9uKSB7Ci0JCQljdHJsX2tleSA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCQlkZXRhaWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5LRVlfQ09OU0lERVJBVElPTlNfVEVYVCwKLQkJCQkJNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgTm90YXRpb24gc2VjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVOb3RhdGlvblNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlub3RhdGlvblNlY3Rpb24gPSBjcmVhdGVTZWN0aW9uKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0Lk5PVEFUSU9OX1NFQ1RJT05fTkFNRSwKLQkJCQlnZXROb3RhdGlvblNlY3Rpb25EZXNjcmlwdGlvbigpKTsKLQkJbm90YXRpb25Db21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgbm90YXRpb25TZWN0aW9uKTsKLQkJY3JlYXRlTm90YXRpb25TZWN0aW9uQ29udGVudCgpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcihub3RhdGlvbkNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgTm90YXRpb24gc2VjdGlvbiBjb250ZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU5vdGF0aW9uU2VjdGlvbkNvbnRlbnQoKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFpbG9yaW5nIHNlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFpbG9yaW5nU2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCXRhaWxvcmluZ1NlY3Rpb24gPSBjcmVhdGVTZWN0aW9uKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlRBSUxPUklOR19TRUNUSU9OX05BTUUsCi0JCQkJZ2V0VGFpbG9yaW5nU2VjdGlvbkRlc2NyaXB0aW9uKCkpOwotCQl0YWlsb3JpbmdDb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgdGFpbG9yaW5nU2VjdGlvbik7Ci0JCWNyZWF0ZVRhaWxvcmluZ1NlY3Rpb25Db250ZW50KCk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHRhaWxvcmluZ0NvbXBvc2l0ZSk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWlsb3JpbmdTZWN0aW9uQ29udGVudCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzIHRvIG1vbml0b3IgZm9jdXMgYW5kIG1vZGlmaWNhdGlvbiBjaGFuZ2VzIGluIHRoZSBlZGl0Ci0JICogY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlmaW5hbCBNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQotCQltb2RlbE1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKGNvbnRlbnRFbGVtZW50KTsKLQkJY29udGVudE1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKGNvbnRlbnRFbGVtZW50Ci0JCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJYWN0aW9uTWdyID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQlmb3JtLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlpZiAoY3RybF9leHBhbmRlZCAhPSBudWxsKSB7Ci0JCQkJCSgoR3JpZERhdGEpIGN0cmxfZXhwYW5kZWQuZ2V0TGF5b3V0RGF0YSgpKS5oZWlnaHRIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JIZWlnaHQoKTsKLQkJCQkJKChHcmlkRGF0YSkgY3RybF9leHBhbmRlZC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKTsKLQkJCQl9Ci0JCQkJZm9ybVNlY3Rpb24ubGF5b3V0KHRydWUsIHRydWUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjb250cm9sTW92ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJZm9ybS5nZXRQYXJlbnQoKS5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYoZGlzcG9zZWQpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkKLQkJCQlyZWZyZXNoKCFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSk7Ci0JCQkJc2V0Rm9ybVRleHRXaXRoVmFyaWFibGVJbmZvKCk7Ci0JCQkJCi0JCQkJLy8gZG8gcmVmcmVzaCB2YXJpYWJpbGl0eSBhbmQgY29weXJpZ2h0IHZpZXdlcgotCQkJCWlmKHZhcmlhYmlsaXR5U2VjdGlvbk9uKQotCQkJCQliYXNlX3ZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJaWYodmVyc2lvblNlY3Rpb25PbikKLQkJCQkJY29weXJpZ2h0X3ZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWlmIChnZW5lcmFsU2VjdGlvbk9uKSB7Ci0JCQlhZGRHZW5lcmFsU2VjdGlvbkxpc3RlbmVycygpOwotCQl9Ci0KLQkJaWYgKGRldGFpbFNlY3Rpb25PbikgewotCQkJYWRkRGV0YWlsU2VjdGlvbkxpc3RlbmVycygpOwotCQl9Ci0KLQkJaWYgKHZlcnNpb25TZWN0aW9uT24pIHsKLQkJCWFkZFZlcnNpb25TZWN0aW9uTGlzdGVuZXJzKCk7Ci0JCX0KLQotCQlpZiAoaWNvblNlY3Rpb25PbikgewotCQkJYWRkSWNvblNlY3Rpb25MaXN0ZW5lcnMoKTsKLQkJfQotCi0JCXZpZXdlcl92YXJpYWJpbGl0eQotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl92YXJpYWJpbGl0eQotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCQkJCWlmIChjb250ZW50RWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gZWRpdG9yCi0JCQkJCQkJCQkuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKSwKLQkJCQkJCQkJCQkJKFZhcmlhYmlsaXR5VHlwZSkgc2VsZWN0aW9uCi0JCQkJCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpLCAtMSk7Ci0JCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgPT0gVmFyaWFiaWxpdHlUeXBlLk5BX0xJVEVSQUwpIHsKLQkJCQkJCQlpZiAoY29udGVudEVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBlZGl0b3IKLQkJCQkJCQkJCQkuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwKLQkJCQkJCQkJCQkJCW51bGwsIC0xKTsKLQkJCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQljdHJsX2Jhc2VfYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJCWJhc2Vfdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJTGlzdCBzZWxlY3Rpb25CYXNlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQkJCXNlbGVjdGlvbkJhc2VMaXN0LmFkZChiYXNlKTsKLQkJCQkJCQljdHJsX2Jhc2VfYnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJYmFzZV92aWV3ZXIucmVmcmVzaCgpOwotCQkJCQkJfQotCQkJCQkJc2V0Rm9ybVRleHRXaXRoVmFyaWFibGVJbmZvKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQljdHJsX2Jhc2VfYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWZpbHRlciA9IGdldEZpbHRlcigpOwotCQkJCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJLmdldFNoZWxsKCksIGZpbHRlciwgZ2V0Q29udGVudEVsZW1lbnQoKSwKLQkJCQkJCQlMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dChjb250ZW50RWxlbWVudCwgdHJ1ZSkpOwotCQkJCQlmZC5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQlmZC5zZXRUaXRsZShMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dChjb250ZW50RWxlbWVudCwgdHJ1ZSkpOwotCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCWZkLmdldFNlbGVjdGVkSXRlbXMoKTsKLQkJCQkJaWYgKGZkLmdldFNlbGVjdGVkSXRlbXMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJCQlJU3RhdHVzIGlzdGF0dXMgPSBEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRGVwZW5kZW5jeUFmdGVyRmlsdGVyU2VsZWN0aW9uKAotCQkJCQkJCQljb250ZW50RWxlbWVudCwgKFZhcmlhYmlsaXR5RWxlbWVudCkgZmQuZ2V0U2VsZWN0ZWRJdGVtcygpLmdldCgwKSk7Ci0JCQkJCQlpZighaXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy52YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLCBpc3RhdHVzLmdldE1lc3NhZ2UoKSk7CQkJCQkJCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBlZGl0b3IKLQkJCQkJCQkJLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwKLQkJCQkJCQkJCQkoVmFyaWFiaWxpdHlFbGVtZW50KSBmZAotCQkJCQkJCQkJCQkJLmdldFNlbGVjdGVkSXRlbXMoKS5nZXQoMCksIC0xKTsKLQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJc3RhdHVzID0gZWRpdG9yCi0JCQkJCQkJCS5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKSwKLQkJCQkJCQkJCQkoVmFyaWFiaWxpdHlUeXBlKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfdmFyaWFiaWxpdHkKLQkJCQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSwgLTEpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXNldEZvcm1UZXh0V2l0aFZhcmlhYmxlSW5mbygpOwotCQkJCWlmICgoY3RybF9iYXNlICE9IG51bGwpICYmICghKGN0cmxfYmFzZS5pc0Rpc3Bvc2VkKCkpKSkKLQkJCQkJY3RybF9iYXNlLnJlZHJhdygpOwotCQkJCWlmICgoYmFzZV92aWV3ZXIgIT0gbnVsbCkKLQkJCQkJCSYmICghKGJhc2Vfdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpKSkKLQkJCQkJYmFzZV92aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkR2VuZXJhbFNlY3Rpb25MaXN0ZW5lcnMoKSB7Ci0JCWN0cmxfbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9uYW1lLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGN0cmxfbmFtZS5nZXRUZXh0KCkudHJpbSgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJZS53aWRnZXQsIGNvbnRlbnRFbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAobmFtZS5lcXVhbHMoY29udGVudEVsZW1lbnQuZ2V0TmFtZSgpKSkKLQkJCQkJcmV0dXJuOwotCQkJCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVOYW1lVmFsaWRhdG9yKAotCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCVN0cmluZyBtc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChuYW1lKTsKLQkJCQlpZiAobXNnID09IG51bGwpIHsKLQkJCQkJbmFtZSA9IFN0clV0aWwubWFrZVZhbGlkRmlsZU5hbWUoY3RybF9uYW1lLmdldFRleHQoKSk7Ci0JCQkJCWlmICghbmFtZS5lcXVhbHMoY29udGVudEVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKAotCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsIGNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkJCQkJCQluYW1lLCAtMSk7Ci0JCQkJCQlpZiAoIXN1Y2Nlc3MpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotCQkJCQkJCQkuaGFzUHJlc2VudGF0aW9uKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQkJCVJlc291cmNlIGNvbnRlbnRSZXNvdXJjZSA9IGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCk7Ci0JCQkJCQkJaWYgKGNvbnRlbnRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkJCQkJLmFkZFJlc291cmNlVG9BZGp1c3RMb2NhdGlvbihjb250ZW50UmVzb3VyY2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXNldEZvcm1UZXh0V2l0aFZhcmlhYmxlSW5mbygpOwotCQkJCQkJY3RybF9uYW1lLnNldFRleHQobmFtZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lRXJyb3JfdGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCW1zZyk7Ci0JCQkJCWN0cmxfbmFtZS5zZXRUZXh0KGNvbnRlbnRFbGVtZW50LmdldE5hbWUoKSk7Ci0JCQkJCWN0cmxfbmFtZS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQkJCQljdHJsX25hbWUuc2VsZWN0QWxsKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IFN0clV0aWwuZ2V0UGxhaW5UZXh0KGN0cmxfcHJlc2VudGF0aW9uX25hbWUKLQkJCQkJCS5nZXRUZXh0KCkpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQljb250ZW50RWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlciNmb2N1c0dhaW5lZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKGJyaWVmRGVzY09uKSB7Ci0JCQljdHJsX2JyaWVmX2Rlc2MuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQljdHJsX2JyaWVmX2Rlc2MuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCQkJfQotCi0JCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXIjZm9jdXNMb3N0KG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudEVsZW1lbnQuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGN0cmxfYnJpZWZfZGVzYy5nZXRUZXh0KCk7Ci0JCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1nci5kb0FjdGlvbigKLQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULCBjb250ZW50RWxlbWVudCwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCksCi0JCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQobmV3Q29udGVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCWlmIChlbGVtZW50VHlwZU9uKSB7Ci0JCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCWN0cmxfdHlwZV9idXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCQkJZmluYWwgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0JCQkJCQlpZiAoZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX3RpdGxlOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlXYXJuaW5nKHRpdGxlLCBtZXNzYWdlKTsKLQkJCQkJCX0gZWxzZSBpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCQkJCU1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24gZGVsZXRlQWN0aW9uID0gbmV3IE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24oKTsKLQkJCQkJCQlkZWxldGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihMaWJyYXJ5Vmlldy5nZXRWaWV3KCkKLQkJCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCkpOwotCQkJCQkJCWRlbGV0ZUFjdGlvbgotCQkJCQkJCQkJLnNlbGVjdGlvbkNoYW5nZWQobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50KSk7Ci0JCQkJCQkJQ29tbWFuZCBjbWQgPSBkZWxldGVBY3Rpb24KLQkJCQkJCQkJCS5jcmVhdGVDb21tYW5kKENvbGxlY3Rpb25zCi0JCQkJCQkJCQkJCS5zaW5nbGV0b24oY29udGVudEVsZW1lbnQpKTsKLQkJCQkJCQlpZiAoY21kIGluc3RhbmNlb2YgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQpIHsKLQkJCQkJCQkJR3VpZGFuY2UgbmV3R3VpZGFuY2U7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQluZXdHdWlkYW5jZSA9IENvbnZlcnRHdWlkYW5jZVR5cGUKLQkJCQkJCQkJCQkuY29udmVydEd1aWRhbmNlKAotCQkJCQkJCQkJCQkJKEd1aWRhbmNlKSBjb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCQkJCW51bGwsCi0JCQkJCQkJCQkJCQkoRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQpIGNtZCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJCQl0cnkgeyBjbWQuZGlzcG9zZSgpOyB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7fQotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChuZXdHdWlkYW5jZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuY2xvc2VFZGl0b3IoCi0JCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50KTsKLQkJCQkJCQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRWRpdG9yKAotCQkJCQkJCQkJCQluZXdHdWlkYW5jZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ190aXRsZTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbWVzc2FnZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHB1Ymxpc2hDYXRlZ29yeU9uKQl7Ci0JCQljdHJsX3B1Ymxpc2hfY2F0ZWdvcmllc19idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CQkJCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewkJCQkKLQkJCQkJU3RyaW5nIHZhbCA9IG5ldyBCb29sZWFuKGN0cmxfcHVibGlzaF9jYXRlZ29yaWVzX2J1dHRvbi5nZXRTZWxlY3Rpb24oKSkudG9TdHJpbmcoKTsJCQkJCi0JCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gVG5nVXRpbC5nZXRQdWJsaXNoQ2F0ZWdvcnlQcm9wZXJ0eShjb250ZW50RWxlbWVudCk7Ci0JCQkJCQkJCQkJCi0JCQkJCWlmIChwcm9wID09IG51bGwpIHsJCQkKLQkJCQkJCXByb3AgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJCQkJCXByb3Auc2V0TmFtZShUbmdVdGlsLlBVQkxJU0hfQ0FURUdPUllfUFJPUEVSVFkpOwotCQkJCQkJcHJvcC5zZXRWYWx1ZSh2YWwpOwotCQkJCQkJCQkKLQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLAotCQkJCQkJCQlwcm9wLCAtMSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCXByb3AsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKSwKLQkJCQkJCQl2YWwsIC0xKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZERldGFpbFNlY3Rpb25MaXN0ZW5lcnMoKSB7Ci0JCWlmIChmdWxsRGVzY09uKSB7Ci0JCQljdHJsX2Z1bGxfZGVzYy5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQljdHJsX2Z1bGxfZGVzYy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSk7Ci0JCQljdHJsX2Z1bGxfZGVzYy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJY3RybF9mdWxsX2Rlc2MuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJOiBjdHJsX2Z1bGxfZGVzYzsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJEZXNjcmlwdGlvbkZvcm1QYWdlLmN0cmxfZnVsbF9kZXNjLmRlYWN0aXZhdGVMaXN0ZW5lcjogY29udHJvbD0iICsgY29udHJvbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIkRlc2NyaXB0aW9uRm9ybVBhZ2UuY3RybF9mdWxsX2Rlc2MuZGVhY3RpdmF0ZUxpc3RlbmVyOiBjb250ZW50IG5vdCBtb2RpZmllZCwgZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKQotCQkJCQkJCS5nZXRNYWluRGVzY3JpcHRpb24oKTsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJEZXNjcmlwdGlvbkZvcm1QYWdlLmN0cmxfZnVsbF9kZXNjLmRlYWN0aXZhdGVMaXN0ZW5lcjogcmVzdG9yZWQgb2xkIGNvbnRlbnQsIGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJEZXNjcmlwdGlvbkZvcm1QYWdlLmN0cmxfZnVsbF9kZXNjLmRlYWN0aXZhdGVMaXN0ZW5lcjogc2F2aW5nIG1vZGlmaWVkIGNvbnRlbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCksCi0JCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIkRlc2NyaXB0aW9uRm9ybVBhZ2UuY3RybF9mdWxsX2Rlc2MuZGVhY3RpdmF0ZUxpc3RlbmVyOiBzYXZlZCBzdGF0dXM9IiArIHN1Y2Nlc3MpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIkRlc2NyaXB0aW9uRm9ybVBhZ2UuY3RybF9mdWxsX2Rlc2MuZGVhY3RpdmF0ZUxpc3RlbmVyOiBleGl0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJaWYgKGtleUNvbnNpZGVyYXRpb25PbikgewotCQkJY3RybF9rZXkuc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJY3RybF9rZXkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKSk7Ci0JCQljdHJsX2tleS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJY3RybF9rZXkuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJOiBjdHJsX2tleTsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJEZXNjcmlwdGlvbkZvcm1QYWdlLmN0cmxfa2V5LmRlYWN0aXZhdGVMaXN0ZW5lcjogY29udHJvbD0iICsgY29udHJvbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIkRlc2NyaXB0aW9uRm9ybVBhZ2UuY3RybF9rZXkuZGVhY3RpdmF0ZUxpc3RlbmVyOiBjb250ZW50IG5vdCBtb2RpZmllZCwgZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKQotCQkJCQkJCS5nZXRLZXlDb25zaWRlcmF0aW9ucygpOwotCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIkRlc2NyaXB0aW9uRm9ybVBhZ2UuY3RybF9rZXkuZGVhY3RpdmF0ZUxpc3RlbmVyOiByZXN0b3JlZCBvbGQgY29udGVudCwgZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKSwKLQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2tleS5kZWFjdGl2YXRlTGlzdGVuZXI6IHNhdmVkIHN0YXR1cz0iICsgc3VjY2Vzcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2tleS5kZWFjdGl2YXRlTGlzdGVuZXI6IGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgY29udHJvbHMgd2l0aCBkYXRhIGZyb20gdGhlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWREYXRhKCkgewotCQlpZiAoZ2VuZXJhbFNlY3Rpb25PbikgewotCQkJbG9hZEdlbmVyYWxTZWN0aW9uRGF0YSgpOwotCQl9Ci0JCWlmIChkZXRhaWxTZWN0aW9uT24pIHsKLQkJCWxvYWREZXRhaWxTZWN0aW9uRGF0YSgpOwotCQl9Ci0JCWlmIChub3RhdGlvblNlY3Rpb25PbikgewotCQkJbG9hZE5vdGF0aW9uU2VjdGlvbkRhdGEoKTsKLQkJfQotCQlpZiAodGFpbG9yaW5nU2VjdGlvbk9uKSB7Ci0JCQlsb2FkVGFpbG9yaW5nU2VjdGlvbkRhdGEoKTsKLQkJfQotCQlpZiAodmVyc2lvblNlY3Rpb25PbikgewotCQkJbG9hZFZlcnNpb25TZWN0aW9uRGF0YSgpOwotCQl9Ci0JCWlmIChpY29uU2VjdGlvbk9uKSB7Ci0JCQlsb2FkSWNvblNlY3Rpb25EYXRhKCk7Ci0JCX0KLQkJaWYgKHZhcmlhYmlsaXR5U2VjdGlvbk9uKSB7Ci0JCQl2YXJpYWJpbGl0eVNlY3Rpb25EYXRhKCk7Ci0JCX0KLQkJZm9ybS5nZXRCb2R5KCkubGF5b3V0KHRydWUsIHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkR2VuZXJhbFNlY3Rpb25EYXRhKCkgewotCQlTdHJpbmcgbmFtZSA9IGNvbnRlbnRFbGVtZW50LmdldE5hbWUoKTsKLQkJU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUgPSAoY29udGVudEVsZW1lbnQpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJY3RybF9uYW1lLnNldFRleHQobmFtZSA9PSBudWxsID8gIiIgOiBuYW1lKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lCi0JCQkJLnNldFRleHQocHJlc2VudGF0aW9uTmFtZSA9PSBudWxsID8gIiIgOiBwcmVzZW50YXRpb25OYW1lKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChlbGVtZW50VHlwZU9uKSB7Ci0JCQkvLyBTdHJpbmcgdHlwZSA9IGNvbnRlbnRFbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgdHlwZSA9IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0KGNvbnRlbnRFbGVtZW50KTsKLQkJCWN0cmxfdHlwZV9sYWJlbC5zZXRUZXh0KHR5cGUgPT0gbnVsbCA/ICIiIDogdHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoYnJpZWZEZXNjT24pIHsKLQkJCVN0cmluZyBicmllZl9kZXNjID0gY29udGVudEVsZW1lbnQuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoYnJpZWZfZGVzYyA9PSBudWxsID8gIiIgOiBicmllZl9kZXNjKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlpZiAocHVibGlzaENhdGVnb3J5T24pIHsKLQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gVG5nVXRpbC5nZXRQdWJsaXNoQ2F0ZWdvcnlQcm9wZXJ0eShjb250ZW50RWxlbWVudCk7Ci0JCQlpZiAocHJvcCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHZhbCA9IHByb3AuZ2V0VmFsdWUoKTsKLQkJCQljdHJsX3B1Ymxpc2hfY2F0ZWdvcmllc19idXR0b24uc2V0U2VsZWN0aW9uKChuZXcgQm9vbGVhbih2YWwpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZERldGFpbFNlY3Rpb25EYXRhKCkgewotCQlpZiAoZnVsbERlc2NPbikgewotCQkJU3RyaW5nIGZ1bGxfZGVzYyA9IChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSkKLQkJCQkJLmdldE1haW5EZXNjcmlwdGlvbigpOwotCQkJY3RybF9mdWxsX2Rlc2Muc2V0VGV4dChmdWxsX2Rlc2MgPT0gbnVsbCA/ICIiIDogZnVsbF9kZXNjKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChrZXlDb25zaWRlcmF0aW9uT24pIHsKLQkJCVN0cmluZyBrZXlDb25zaWRlcmF0aW9ucyA9IChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSkKLQkJCQkJLmdldEtleUNvbnNpZGVyYXRpb25zKCk7Ci0JCQljdHJsX2tleQotCQkJCQkuc2V0VGV4dChrZXlDb25zaWRlcmF0aW9ucyA9PSBudWxsID8gIiIgOiBrZXlDb25zaWRlcmF0aW9ucyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQkKLQotCXByaXZhdGUgdm9pZCBsb2FkVGFpbG9yaW5nU2VjdGlvbkRhdGEoKSB7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWROb3RhdGlvblNlY3Rpb25EYXRhKCkgewotCX0KLQotCXByaXZhdGUgdm9pZCB2YXJpYWJpbGl0eVNlY3Rpb25EYXRhKCkgewotCQlWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gY29udGVudEVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCUxpc3Qgc2VsZWN0aW9uVmFyaWFiaWxpdHlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlzZWxlY3Rpb25WYXJpYWJpbGl0eUxpc3QuYWRkKHZhcmlhYmlsaXR5VHlwZSk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIG5ld1ZhcmlhYmlsaXR5U2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJc2VsZWN0aW9uVmFyaWFiaWxpdHlMaXN0KTsKLQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldFNlbGVjdGlvbihuZXdWYXJpYWJpbGl0eVNlbGVjdGlvbiwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogVG9nZ2xlIERlc2NyaXB0aW9uIGNvbnRyb2wgdG8gZXhwYW5kIGFuZCBjb250cm9sIHN0YXRlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRvZ2dsZShIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCWlmIChjdHJsX2V4cGFuZGVkID09IG51bGwpIHsKLQkJCWN0cmxfZXhwYW5kZWQgPSBjcmVhdGVSaWNoVGV4dEVkaXRvcih0b29sa2l0LCBleHBhbmRlZENvbXBvc2l0ZSwKLQkJCQkJU1dULk1VTFRJIHwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwsIEdyaWREYXRhLkZJTExfQk9USCwKLQkJCQkJZ2V0UmljaFRleHRFZGl0b3JIZWlnaHQoKSwgZ2V0UmljaFRleHRFZGl0b3JXaWR0aCgpLCAyLAotCQkJCQlleHBhbmRMYWJlbCk7Ci0JCQljdHJsX2V4cGFuZGVkLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCX0KLQotCQlpZiAoZGVzY0V4cGFuZEZsYWcpIHsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJZm9ybVNlY3Rpb24uc2V0Q2xpZW50KHNlY3Rpb25Db21wb3NpdGUpOwotCQkJZW5hYmxlU2VjdGlvbnModHJ1ZSk7Ci0JCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSBnZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woKTsKLQkJCXJpY2hUZXh0LnNldFRleHQoY3RybF9leHBhbmRlZC5nZXRUZXh0KCkpOwotCQkJcmljaFRleHQuc2V0RmluZFJlcGxhY2VBY3Rpb24oY3RybF9leHBhbmRlZC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpKTsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHJpY2hUZXh0LmdldExpc3RlbmVycygpOyBpLmhhc05leHQoKTspIHsKLQkJCQlSaWNoVGV4dExpc3RlbmVyIGxpc3RlbmVyID0gKFJpY2hUZXh0TGlzdGVuZXIpIGkubmV4dCgpOwotCQkJCWN0cmxfZXhwYW5kZWQucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIuZ2V0RXZlbnRUeXBlKCksIGxpc3RlbmVyCi0JCQkJCQkuZ2V0TGlzdGVuZXIoKSk7Ci0JCQl9Ci0JCQlpZiAoY3RybF9leHBhbmRlZC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCS5zYXZlTW9kaWZpZWRSaWNoVGV4dChjdHJsX2V4cGFuZGVkKTsKLQkJCX0KLQkJCXJpY2hUZXh0LnNldEZvY3VzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlzZWN0aW9uQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWZvcm1TZWN0aW9uLnNldENsaWVudChleHBhbmRlZENvbXBvc2l0ZSk7Ci0JCQllbmFibGVTZWN0aW9ucyhmYWxzZSk7Ci0JCQkoKExhYmVsKWV4cGFuZExhYmVsLmdldENvbnRyb2woKSkuc2V0VGV4dCgoU3RyaW5nKSAoKEltYWdlSHlwZXJsaW5rKSBlLmdldFNvdXJjZSgpKQotCQkJCQkuZ2V0RGF0YSgiVGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IChJTWV0aG9kUmljaFRleHQpIGUuZ2V0SHJlZigpOwotCQkJY3RybF9leHBhbmRlZC5zZXRUZXh0KHJpY2hUZXh0LmdldFRleHQoKSk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KHJpY2hUZXh0LmdldE1vZGFsT2JqZWN0KCkpOwotCQkJY3RybF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdEZlYXR1cmUocmljaFRleHQKLQkJCQkJLmdldE1vZGFsT2JqZWN0RmVhdHVyZSgpKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0RmluZFJlcGxhY2VBY3Rpb24ocmljaFRleHQuZ2V0RmluZFJlcGxhY2VBY3Rpb24oKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByaWNoVGV4dC5nZXRMaXN0ZW5lcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmljaFRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChSaWNoVGV4dExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQljdHJsX2V4cGFuZGVkLmFkZExpc3RlbmVyKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpLCBsaXN0ZW5lcgotCQkJCQkJLmdldExpc3RlbmVyKCkpOwotCQkJfQotCQkJYm9vbGVhbiBlZGl0YWJsZSA9ICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJaWYgKGVkaXRhYmxlKSB7Ci0JCQkJY3RybF9leHBhbmRlZC5zZXRGb2N1cygpOwotCQkJfQotCQkJc2V0QWN0aXZlUmljaFRleHRDb250cm9sKHJpY2hUZXh0KTsKLQkJfQotCQlmb3JtLmdldEJvZHkoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JCWRlc2NFeHBhbmRGbGFnID0gIWRlc2NFeHBhbmRGbGFnOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgYWN0aXZlIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woSU1ldGhvZFJpY2hUZXh0IGN0cmwpIHsKLQkJYWN0aXZlQ29udHJvbCA9IGN0cmw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWN0aXZlIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGdldEFjdGl2ZVJpY2hUZXh0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGFjdGl2ZUNvbnRyb2w7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QnJpZWZEZXNjT24oYm9vbGVhbiBicmllZkRlc2NPbikgewotCQl0aGlzLmJyaWVmRGVzY09uID0gYnJpZWZEZXNjT247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RnVsbERlc2NPbihib29sZWFuIGZ1bGxEZXNjT24pIHsKLQkJdGhpcy5mdWxsRGVzY09uID0gZnVsbERlc2NPbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRLZXlDb25zaWRlcmF0aW9uT24oYm9vbGVhbiBrZXlDb25zaWRlcmF0aW9uT24pIHsKLQkJdGhpcy5rZXlDb25zaWRlcmF0aW9uT24gPSBrZXlDb25zaWRlcmF0aW9uT247Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRUeXBlT24KLQkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50VHlwZU9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50VHlwZU9uKGJvb2xlYW4gZWxlbWVudFR5cGVPbikgewotCQl0aGlzLmVsZW1lbnRUeXBlT24gPSBlbGVtZW50VHlwZU9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYW55QXR0cmlidXRlTW9kaWZpZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbnlBdHRyaWJ1dGVNb2RpZmllZCgpIHsKLQkJcmV0dXJuIGFueUF0dHJpYnV0ZU1vZGlmaWVkOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGlzIGlmIGFueSBhdHRyaWJ1dGUgaXMgbW9kaWZpZWQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBjaGFuZ2UKLQkgKiBkYXRlIGZpZWxkIGluIHZlcnNpb24gc2VjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYW55QXR0cmlidXRlTW9kaWZpZWQKLQkgKiAgICAgICAgICAgIFRoZSBhbnlBdHRyaWJ1dGVNb2RpZmllZCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QW55QXR0cmlidXRlTW9kaWZpZWQoYm9vbGVhbiBhbnlBdHRyaWJ1dGVNb2RpZmllZCkgewotCQl0aGlzLmFueUF0dHJpYnV0ZU1vZGlmaWVkID0gYW55QXR0cmlidXRlTW9kaWZpZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB2ZXJzaW9uU2VjdGlvbk9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmVyc2lvblNlY3Rpb25PbigpIHsKLQkJcmV0dXJuIHZlcnNpb25TZWN0aW9uT247Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZlcnNpb25TZWN0aW9uT24KLQkgKiAgICAgICAgICAgIFRoZSB2ZXJzaW9uU2VjdGlvbk9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uU2VjdGlvbk9uKGJvb2xlYW4gdmVyc2lvblNlY3Rpb25PbikgewotCQl0aGlzLnZlcnNpb25TZWN0aW9uT24gPSB2ZXJzaW9uU2VjdGlvbk9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFZlcnNpb24gSW5mb3JtYXRpb24gc2VjdGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVmVyc2lvblNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQl2ZXJzaW9uU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihzZWN0aW9uQ29tcG9zaXRlLAotCQkJCVNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVECi0JCQkJCQl8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJdmVyc2lvblNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCXZlcnNpb25TZWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LlZFUlNJT05fSU5GT19TRUNUSU9OX05BTUUpOwotCQl2ZXJzaW9uU2VjdGlvbi5zZXREZXNjcmlwdGlvbihnZXRWZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uKCkpOwotCQl2ZXJzaW9uU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJdmVyc2lvbkNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHZlcnNpb25TZWN0aW9uKTsKLQkJdmVyc2lvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdmVyc2lvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoNSwgZmFsc2UpKTsKLQkJdmVyc2lvblNlY3Rpb24uc2V0Q2xpZW50KHZlcnNpb25Db21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgVmVyc2lvbiBzZWN0aW9uIGNvbnRlbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZlcnNpb25TZWN0aW9uQ29udGVudCgpIHsKLQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpOwotCQlTdHJpbmcgZmlsbFRleHQgPSAoY29udGVudERlc2NyaXB0aW9uLmdldFZlcnNpb24oKSA9PSBudWxsID8gIiIgOiBjb250ZW50RGVzY3JpcHRpb24uZ2V0VmVyc2lvbigpKTsKLQkJY3RybF92ZXJzaW9uID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWw0KHRvb2xraXQsIHZlcnNpb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlZFUlNJT05fVEVYVCwgU1dULkRFRkFVTFQsIFNXVC5TSU5HTEUsIGZpbGxUZXh0KTsKLQotCQlmaWxsVGV4dCA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDaGFuZ2VEYXRlKCkgPT0gbnVsbCA/ICIiIC8vJE5PTi1OTFMtMSQKLQkJCQk6IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKERhdGVGb3JtYXQuRlVMTCkuZm9ybWF0KAotCQkJCQkJY29udGVudERlc2NyaXB0aW9uLmdldENoYW5nZURhdGUoKSk7Ci0JCWN0cmxfY2hhbmdlX2RhdGUgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDQodG9vbGtpdCwgdmVyc2lvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQ0hBTkdFX0RBVEVfVEVYVCwgU1dULkRFRkFVTFQsIFNXVC5TSU5HTEUsIGZpbGxUZXh0KTsKLQkJY3RybF9jaGFuZ2VfZGF0ZS5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJY3RybF9jaGFuZ2VfZGVzYyA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsNSh0b29sa2l0LCB2ZXJzaW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5DSEFOR0VfREVTQ1JJUFRJT05fVEVYVCk7Ci0KLQkJQ29tcG9zaXRlIHZpZXdIaXN0b3J5QnV0dG9uUGFuZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LAotCQkJCXZlcnNpb25Db21wb3NpdGUsICBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCwgMSwgMSwgMSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNDA7Ci0JCQl2aWV3SGlzdG9yeUJ1dHRvblBhbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJdmlld19oaXN0b3J5X2J1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHZpZXdIaXN0b3J5QnV0dG9uUGFuZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuVklFV19ISVNUT1JZX0JVVFRPTl9URVhULCBTV1QuUFVTSCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDEwMDsKLQkJCXZpZXdfaGlzdG9yeV9idXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljdHJsX2F1dGhvcnMgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDUodG9vbGtpdCwgdmVyc2lvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQVVUSE9SU19URVhULCA0MCwgU1dULk1VTFRJKTsKLQotCQlsYWJlbF9jb3B5cmlnaHQgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCB2ZXJzaW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5DT1BZUklHSFRfVEVYVCwgMik7Ci0JCWN0cmxfY29weXJpZ2h0ID0gY3JlYXRlVGFibGUodG9vbGtpdCwgdmVyc2lvbkNvbXBvc2l0ZSwgU1dULlNJTkdMRQotCQkJCXwgU1dULlJFQURfT05MWSwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuQkVHSU5OSU5HIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCwKLQkJCQk1LCA0MDAsIDEsIDIpOwotCi0JCWNvcHlyaWdodF92aWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9jb3B5cmlnaHQpOwotCQlpbml0Q29udGVudFByb3ZpZGVyQ29weXJpZ2h0KCk7Ci0JCWNvcHlyaWdodF92aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihjb3B5cmlnaHRMYWJlbFByb3ZpZGVyQmFzZSk7Ci0JCWNvcHlyaWdodF92aWV3ZXIuc2V0SW5wdXQoY29udGVudEVsZW1lbnQpOwotCQlDb21wb3NpdGUgYnV0dG9ucGFuZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCB2ZXJzaW9uQ29tcG9zaXRlLAotCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5ELCAxLCAxLCAxKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJYnV0dG9ucGFuZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljb3B5cmlnaHRfYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9ucGFuZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuU0VMRUNUX0JVVFRPTl9URVhULCBTV1QuU0lNUExFKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMTAwOwotCQkJY29weXJpZ2h0X2J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0ID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9ucGFuZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuREVTRUxFQ1RfQlVUVE9OX1RFWFQsIFNXVC5TSU1QTEUpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAxMDA7Ci0JCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJc2V0Q29weXJpZ2h0QnV0dG9uRGVzZWxlY3QoKTsKLQotCQkvLyBDcmVhdGUgdGhlIGV4cGFuZGVkIGNvbXBvc2l0ZS4KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IodmVyc2lvbkNvbXBvc2l0ZSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHZpZXdIaXN0b3J5QnV0dG9uUGFuZSk7Ci0JCS8vdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoYnV0dG9ucGFuZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJDb3B5cmlnaHQoKSB7Ci0JCWNvcHlyaWdodENvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpZiAoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQlsaXN0LmFkZChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKQotCQkJCQkJCS5nZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSk7Ci0JCQkJfQotCQkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQl9Ci0JCX07Ci0JCWNvcHlyaWdodF92aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvcHlyaWdodENvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmVyc2lvblNlY3Rpb25MaXN0ZW5lcnMoKSB7Ci0JCWN0cmxfdmVyc2lvbi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3ZlcnNpb24uYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X1ZlcnNpb24oKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpCi0JCQkJCQkuZ2V0VmVyc2lvbigpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJZS53aWRnZXQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBTdHJVdGlsCi0JCQkJCQkuZ2V0UGxhaW5UZXh0KGN0cmxfdmVyc2lvbi5nZXRUZXh0KCkpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfVmVyc2lvbigpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN0YXR1cykgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2F1dGhvcnMuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9hdXRob3JzLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKQotCQkJCQkJLmdldEF1dGhvcnMoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gU3RyVXRpbAotCQkJCQkJLmdldFBsYWluVGV4dChjdHJsX2F1dGhvcnMuZ2V0VGV4dCgpKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0F1dGhvcnMoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdGF0dXMpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY29weXJpZ2h0X2J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBDb250ZW50RmlsdGVyKCkgewotCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCUxpc3QgYWxyZWFkeUV4c3RpbmcgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGN0cmxfY29weXJpZ2h0LmdldEl0ZW1Db3VudCgpID4gMCkgewotCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IGN0cmxfY29weXJpZ2h0LmdldEl0ZW1zKClbMF07Ci0JCQkJCWlmIChpdGVtLmdldERhdGEoKSAhPSBudWxsKQotCQkJCQkJYWxyZWFkeUV4c3RpbmcuYWRkKGl0ZW0uZ2V0RGF0YSgpKTsKLQkJCQl9Ci0JCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCQlmaWx0ZXIsIGNvbnRlbnRFbGVtZW50LAotCQkJCQkJRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTLCBhbHJlYWR5RXhzdGluZyk7Ci0JCQkJZmQuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKHRydWUpOwotCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUyk7Ci0JCQkJZmQub3BlbigpOwotCQkJCWZkLmdldFNlbGVjdGVkSXRlbXMoKTsKLQkJCQlpZiAoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpLnNpemUoKSA+IDApIHsKLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHRTdGF0ZW1lbnQoKSwKLQkJCQkJCQkoU3VwcG9ydGluZ01hdGVyaWFsKSBmZC5nZXRTZWxlY3RlZEl0ZW1zKCkuZ2V0KDApLAotCQkJCQkJCS0xKTsKLQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQljb3B5cmlnaHRfdmlld2VyLnJlZnJlc2goKTsKLQkJCQlzZXRDb3B5cmlnaHRCdXR0b25EZXNlbGVjdCgpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX2NoYW5nZV9kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfY2hhbmdlX2Rlc2MuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKQotCQkJCQkJLmdldENoYW5nZURlc2NyaXB0aW9uKCk7Ci0JCQkJY2hhciBkZWxpbWl0ZXIgPSBBdXRob3JpbmdVSVJlc291cmNlcy5DaGFuZ2VIaXN0b3J5RGlhbG9nX2RlbGltaXRlci5jaGFyQXQoMCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY3RybF9jaGFuZ2VfZGVzYy5nZXRUZXh0KCk7Ci0KLQkJCQluZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKGRlbGltaXRlciwgJyAnKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKGxhc3RDaGFuZ2VIaXN0b3J5KSkgewotCQkJCQlsYXN0Q2hhbmdlSGlzdG9yeSA9IG5ld0NvbnRlbnQ7Ci0JCQkJCWlmICgob2xkQ29udGVudCAhPSBudWxsKQotCQkJCQkJCSYmICghKFN0clV0aWwuaXNCbGFuayhvbGRDb250ZW50KSkpKSB7Ci0JCQkJCQluZXdDb250ZW50ID0gb2xkQ29udGVudCArIGRlbGltaXRlciArIG5ld0NvbnRlbnQ7Ci0JCQkJCX0KLQotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBjb250ZW50RWxlbWVudAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpLCBuZXdDb250ZW50LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQl2aWV3X2hpc3RvcnlfYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCi0JCQkJQ2hhbmdlSGlzdG9yeURpYWxvZyBkbGcgPSBuZXcgQ2hhbmdlSGlzdG9yeURpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJCWNvbnRlbnRFbGVtZW50KTsKLQkJCQlkbGcub3BlbigpOwotCQkJfQotCQl9KTsKLQotCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHRTdGF0ZW1lbnQoKSwgbnVsbCwgLTEpOwotCQkJCWlmIChzdGF0dXMpIHsKLQkJCQkJY29weXJpZ2h0X3ZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCXNldENvcHlyaWdodEJ1dHRvbkRlc2VsZWN0KCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKgotCSAqIHVwZGF0ZSB0aGUgY2hhbmdlIGRhdGUgaWYgYW55IGF0dHJpYnV0ZSBpcyBtb2RpZmllZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDaGFuZ2VEYXRlKCkgewotCi0JCURhdGUgY2hhbmdlRGF0ZSA9IGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldENoYW5nZURhdGUoKTsKLQkJRGF0ZUZvcm1hdCBkZiA9IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKERhdGVGb3JtYXQuRlVMTCk7Ci0KLQkJU3RyaW5nIG9sZENvbnRlbnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY2hhbmdlRGF0ZSAhPSBudWxsKSB7Ci0JCQlvbGRDb250ZW50ID0gZGYuZm9ybWF0KGNoYW5nZURhdGUpOwotCQl9Ci0KLQkJRGF0ZSBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7Ci0JCVN0cmluZyBuZXdDb250ZW50ID0gZGYuZm9ybWF0KGN1cnJlbnREYXRlKTsKLQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEYXRlKCksIGN1cnJlbnREYXRlLCAtMSk7Ci0JCQlpZiAoIXN0YXR1cykgewotCQkJCXJldHVybjsKLQkJCX0gZWxzZSB7Ci0JCQkJY3RybF9jaGFuZ2VfZGF0ZS5zZXRUZXh0KG5ld0NvbnRlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZFZlcnNpb25TZWN0aW9uRGF0YSgpIHsKLQotCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gY29udGVudEVsZW1lbnQKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCWN0cmxfdmVyc2lvbgotCQkJCS5zZXRUZXh0KGNvbnRlbnREZXNjcmlwdGlvbi5nZXRWZXJzaW9uKCkgPT0gbnVsbCA/ICIiIDogY29udGVudERlc2NyaXB0aW9uLmdldFZlcnNpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9hdXRob3JzCi0JCQkJLnNldFRleHQoY29udGVudERlc2NyaXB0aW9uLmdldEF1dGhvcnMoKSA9PSBudWxsID8gIiIgOiBjb250ZW50RGVzY3JpcHRpb24uZ2V0QXV0aG9ycygpKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2NoYW5nZV9kZXNjLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfY2hhbmdlX2RhdGUKLQkJCQkuc2V0VGV4dChjb250ZW50RGVzY3JpcHRpb24uZ2V0Q2hhbmdlRGF0ZSgpID09IG51bGwgPyAiIiAvLyROT04tTkxTLTEkCi0JCQkJCQk6IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKERhdGVGb3JtYXQuRlVMTCkuZm9ybWF0KAotCQkJCQkJCQljb250ZW50RGVzY3JpcHRpb24uZ2V0Q2hhbmdlRGF0ZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogVG9nZ2xlIERlc2NyaXB0aW9uIGNvbnRyb2wgdG8gZXhwYW5kIGFuZCBjb250cm9sIHN0YXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdG9nZ2xlKEh5cGVybGlua0V2ZW50IGUsIGludCBpZCkgewotCQkvLyBUT0RPLSB3ZSBzaG91bGQgY29tYmluZSB0aGVzZSBtZXRob2RzIGludG8gb25lLiBPbmUgd2F5IHRvIGRvIGl0LAotCQkvLyBkaXNwb2luZwotCQkvLyBjdHJsX2V4cGFuZGVkIGV2ZXJ5IHRpbWUgaXQgY29sbGFwc2VzIGFuZCBjcmVhdGluZyBpdCB3aGVuIHdlIGV4cGFuZC4KLQkJLy8gQXQgcHJlc2VudCwgdGhlcmUgaXMgbm8gbWV0aG9kIHRvIGRpc3Bvc2UKLQkJdG9nZ2xlKGUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaWNvblNlY3Rpb25Pbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ljb25TZWN0aW9uT24oKSB7Ci0JCXJldHVybiBpY29uU2VjdGlvbk9uOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpY29uU2VjdGlvbk9uCi0JICogICAgICAgICAgICBUaGUgaWNvblNlY3Rpb25PbiB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWNvblNlY3Rpb25Pbihib29sZWFuIGljb25TZWN0aW9uT24pIHsKLQkJdGhpcy5pY29uU2VjdGlvbk9uID0gaWNvblNlY3Rpb25PbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBJY29uIHNlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlSWNvblNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlpY29uU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihzZWN0aW9uQ29tcG9zaXRlLAotCQkJCVNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVECi0JCQkJCQl8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJaWNvblNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCWljb25TZWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LklDT05fU0VDVElPTl9OQU1FKTsKLQkJaWNvblNlY3Rpb24uc2V0RGVzY3JpcHRpb24oZ2V0SWNvblNlY3Rpb25EZXNjcmlwdGlvbigpKTsKLQkJaWNvblNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWljb25Db21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShpY29uU2VjdGlvbik7Ci0JCWljb25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWljb25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIHRydWUpKTsKLQkJaWNvblNlY3Rpb24uc2V0Q2xpZW50KGljb25Db21wb3NpdGUpOwotCX0KLQlwcml2YXRlIHZvaWQgY3JlYXRlSWNvblNlY3Rpb25Db250ZW50KCkgewotCQlDb21wb3NpdGUgc2hhcGVJY29uQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGljb25Db21wb3NpdGUsCi0JCQkJMSk7Ci0JCXNoYXBlSWNvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJc2hhcGVJY29uQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7Ci0vLwkJY3JlYXRlTGFiZWwoCi0vLwkJCQl0b29sa2l0LAotLy8JCQkJc2hhcGVJY29uQ29tcG9zaXRlLAotLy8JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0xhYmVsLCAyKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBObyB3cmFwIG5lZWRlZAotCQljcmVhdGVMYWJlbFdpdGhOb1dyYXAoCi0JCQkJdG9vbGtpdCwKLQkJCQlzaGFwZUljb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0xhYmVsLAotCQkJCUdyaWREYXRhLkJFR0lOTklORywKLQkJCQkyKTsgCi0JCQotCQlwYW5lMSA9IG5ldyBDYW52YXMoc2hhcGVJY29uQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDYwOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNjA7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAxOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJcGFuZTEuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlwYW5lMS5zZXRCYWNrZ3JvdW5kKENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSk7Ci0JCX0KLQkJLy8gcGFuZTEuc2V0U2l6ZSgzMCwzMCk7Ci0JCUNvbXBvc2l0ZSBwYW5lMiA9IGNyZWF0ZUNvbXBvc2l0ZUZvckJ1dHRvbnModG9vbGtpdCwgc2hhcGVJY29uQ29tcG9zaXRlKTsKLQkJY3RybF9zZWxlY3Rfc2hhcGVJY29uX2J1dHRvbiA9IHRvb2xraXQKLQkJCQkuY3JlYXRlQnV0dG9uKAotCQkJCQkJcGFuZTIsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWwsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b24gPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUJ1dHRvbigKLQkJCQkJCXBhbmUyLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWwsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY29udGVudEVsZW1lbnQuZ2V0U2hhcGVpY29uKCkgPT0gbnVsbCkKLQkJCWN0cmxfY2xlYXJfc2hhcGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZWxzZQotCQkJY3RybF9jbGVhcl9zaGFwZUljb25fYnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJQ29tcG9zaXRlIG5vZGVJY29uQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGljb25Db21wb3NpdGUsIDEpOwotCQlub2RlSWNvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbm9kZUljb25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0vLwkJY3JlYXRlTGFiZWwoCi0vLwkJCQl0b29sa2l0LAotLy8JCQkJbm9kZUljb25Db21wb3NpdGUsCi0vLwkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19MYWJlbCwgMik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gTm8gd3JhcCBuZWVkIGZvciAKLQkJY3JlYXRlTGFiZWxXaXRoTm9XcmFwKAotCQkJCXRvb2xraXQsCi0JCQkJbm9kZUljb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfTGFiZWwsCi0JCQkJR3JpZERhdGEuQkVHSU5OSU5HLAotCQkJCTIpOyAKLQkJcGFuZTMgPSBuZXcgQ2FudmFzKG5vZGVJY29uQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDQwOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNDA7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAxOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJcGFuZTMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlwYW5lMy5zZXRCYWNrZ3JvdW5kKENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSk7Ci0JCX0KLQkJQ29tcG9zaXRlIHBhbmU0ID0gY3JlYXRlQ29tcG9zaXRlRm9yQnV0dG9ucyh0b29sa2l0LCBub2RlSWNvbkNvbXBvc2l0ZSk7Ci0JCWN0cmxfc2VsZWN0X25vZGVJY29uX2J1dHRvbiA9IHRvb2xraXQKLQkJCQkuY3JlYXRlQnV0dG9uKAotCQkJCQkJcGFuZTQsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19TZWxlY3RCdXR0b25MYWJlbCwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfY2xlYXJfbm9kZUljb25fYnV0dG9uID0gdG9vbGtpdAotCQkJCS5jcmVhdGVCdXR0b24oCi0JCQkJCQlwYW5lNCwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWwsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY29udGVudEVsZW1lbnQuZ2V0Tm9kZWljb24oKSA9PSBudWxsKQotCQkJY3RybF9jbGVhcl9ub2RlSWNvbl9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVsc2UKLQkJCWN0cmxfY2xlYXJfbm9kZUljb25fYnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQotCQluZXcgTGFiZWwoaWNvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzaGFwZUljb25QYXRoID0gY3JlYXRlTGFiZWxXaXRoTm9XcmFwKHRvb2xraXQsCi0JCQkJaWNvbkNvbXBvc2l0ZSwgIiIsIEdyaWREYXRhLkJFR0lOTklORywgMSk7Ci0JCW5vZGVJY29uUGF0aCA9IGNyZWF0ZUxhYmVsV2l0aE5vV3JhcCh0b29sa2l0LAotCQkJCWljb25Db21wb3NpdGUsICIiLCBHcmlkRGF0YS5CRUdJTk5JTkcsIDIpOwotLy8JCQluZXcgTGFiZWwobm9kZUljb25Db21wb3NpdGUsIFNXVC5OT05FKTsKLS8vCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0vLwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9MjsKLS8vCQlub2RlSWNvblBhdGguc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUyKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTMpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lNCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWNvblNlY3Rpb25MaXN0ZW5lcnMoKSB7Ci0KLQkJY3RybF9zZWxlY3Rfc2hhcGVJY29uX2J1dHRvbgotCQkJCS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLS8vCQkJCQlGaWxlIGxpYkRpckZpbGUgPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0vLwkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkpOwotCi0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWphdmEubmV0LlVSSSBzaGFwZUljb25VcmkgPSBudWxsOwotCQkJCQkJRmlsZURpYWxvZyBmaWxlQ2hvb3NlciA9IG5ldyBGaWxlRGlhbG9nKERpc3BsYXkKLQkJCQkJCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuT1BFTik7Ci0JCQkJCQlmaWxlQ2hvb3Nlci5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfSWNvbkZpbGVDaG9vc2VyRGlhbG9nX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZmlsZUNob29zZXIuc2V0RmlsdGVyRXh0ZW5zaW9ucyhpbWFnZVR5cGVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZmlsZUNob29zZXIuc2V0RmlsdGVyTmFtZXMoaW1hZ2VOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyBpbWFnZUZpbGUgPSBudWxsOwotCQkJCQkJU3RyaW5nIGZpbGVuYW1lID0gbnVsbDsKLQkJCQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCQkJaW1hZ2VGaWxlID0gZmlsZUNob29zZXIub3BlbigpOwotCQkJCQkJCWZpbGVuYW1lID0gZmlsZUNob29zZXIuZ2V0RmlsZU5hbWUoKTsKLQkJCQkJCQlpZiAoaW1hZ2VGaWxlICE9IG51bGwpIHsKLQkJCQkJCQkJaWYgKG5ldyBGaWxlKGltYWdlRmlsZSkuZXhpc3RzKCkpIHsKLS8vCQkJCQkJCQkJSW1hZ2VEYXRhIGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoCi0vLwkJCQkJCQkJCQkJaW1hZ2VGaWxlKTsKLS8vCQkJCQkJCQkJaWYgKGltYWdlRGF0YS53aWR0aCA+IFNIQVBFSUNPTl9XSURUSF9NQVgKLS8vCQkJCQkJCQkJCQl8fCBpbWFnZURhdGEuaGVpZ2h0ID4gU0hBUEVJQ09OX0hFSUdIVF9NQVgpIHsKLS8vCQkJCQkJCQkJCS8vIG1zZyB1c2VyIC0gaW1hZ2UgdG9vIGJpZwotLy8JCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLS8vCQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotLy8JCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLS8vCQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLS8vCQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RpdGxlLCAvLyROT04tTkxTLTEkIAotLy8JCQkJCQkJCQkJCQkJCU1lc3NhZ2VGb3JtYXQKLS8vCQkJCQkJCQkJCQkJCQkJCS5mb3JtYXQoCi0vLwkJCQkJCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGVtcGxhdGUsIC8vJE5PTi1OTFMtMSQKLS8vCQkJCQkJCQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQlpbWFnZUZpbGUsCi0vLwkJCQkJCQkJCQkJCQkJCQkJCQkJbmV3IEludGVnZXIoCi0vLwkJCQkJCQkJCQkJCQkJCQkJCQkJCQlTSEFQRUlDT05fV0lEVEhfTUFYKSwKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQluZXcgSW50ZWdlcigKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVNIQVBFSUNPTl9IRUlHSFRfTUFYKSB9KSk7Ci0vLwkJCQkJCQkJCX0gZWxzZSB7Ci0vLwkJCQkJCQkJCQlicmVhazsKLS8vCQkJCQkJCQkJfQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkvLyBtc2cgdXNlciAtIGZpbGUgZG9lc24ndCBleGlzdAotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGl0bGUsIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJCQkJCQkJTWVzc2FnZUZvcm1hdAotCQkJCQkJCQkJCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RlbXBsYXRlLCAvLyROT04tTkxTLTEkIAotCQkJCQkJCQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyBpbWFnZUZpbGUgfSkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChpbWFnZUZpbGUgIT0gbnVsbCAmJiBpbWFnZUZpbGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJU3RyaW5nIHVybCA9IGNvcHlSZXNvdXJjZVRvTGliKGZpbGVuYW1lLAotCQkJCQkJCQkJCWZpbGVDaG9vc2VyLmdldEZpbHRlclBhdGgoKSwKLQkJCQkJCQkJCQljb250ZW50RWxlbWVudCk7Ci0JCQkJCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJsKTsKLQkJCQkJCQkJCXNoYXBlSWNvblVyaSA9IG5ldyBVUkkoTmV0VXRpbAotCQkJCQkJCQkJCQkuZW5jb2RlRmlsZVVSTChGaWxlVXRpbAotCQkJCQkJCQkJCQkJCS5nZXRSZWxhdGl2ZVBhdGgoZmlsZSwKLQkJCQkJCQkJCQkJCQkJCW5ldyBGaWxlKGdldFBsdWdpblBhdGgoY29udGVudEVsZW1lbnQpKSkpKTsKLQkJCQkJCQkJCWlmIChzaGFwZUljb25VcmkgIT0gbnVsbCkgewotCQkJCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKSwKLQkJCQkJCQkJCQkJCQkJc2hhcGVJY29uVXJpLCAtMSk7Ci0JCQkJCQkJCQkJaWYgKCFzdGF0dXMpCi0JCQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCXNoYXBlSW1hZ2UgPSBuZXcgSW1hZ2UoCi0JCQkJCQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLCBmaWxlCi0JCQkJCQkJCQkJCQkJLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCQkJCXNoYXBlSWNvblBhdGguc2V0VGV4dChzaGFwZUljb25VcmkuZ2V0UGF0aCgpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCQlzaGFwZUljb25VcmkgPSBudWxsOwotCQkJCQkJCQlzaGFwZUltYWdlID0gbnVsbDsKLQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJLmxvZ0Vycm9yKGV4KTsKLQkJCQkJCQkJaWYgKGV4IGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyX2NvcHlpbmdfZmlsZV90aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycl9jb3B5aW5nX2ZpbGVfZXJyb3IsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfY29weWluZ19maWxlX3JlYXNvbiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCWV4LmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycl9wcm9jZXNzaW5nX2ZpbGVfdGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfcHJvY2Vzc2luZ19maWxlX2Rlc2NyaXB0aW9uLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChzaGFwZUltYWdlICE9IG51bGwpIHsKLQkJCQkJCQlwYW5lMS5yZWRyYXcoKTsKLQkJCQkJCQljdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY3RybF9jbGVhcl9zaGFwZUljb25fYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9KTsKLQotCQljdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b24KLQkJCQkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJY29udGVudEVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKSwKLQkJCQkJCQkJbnVsbCwgLTEpOwotCQkJCQkJaWYgKCFzdGF0dXMpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJcGFuZTEucmVkcmF3KCk7Ci0JCQkJCQljdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQlzaGFwZUljb25QYXRoLnNldFRleHQoIiIpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJY3RybF9zZWxlY3Rfbm9kZUljb25fYnV0dG9uCi0JCQkJLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotLy8JCQkJCUZpbGUgbGliRGlyRmlsZSA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLS8vCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSk7Ci0KLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJamF2YS5uZXQuVVJJIG5vZGVJY29uVXJpID0gbnVsbDsKLQkJCQkJCUZpbGVEaWFsb2cgZmlsZUNob29zZXIgPSBuZXcgRmlsZURpYWxvZyhEaXNwbGF5Ci0JCQkJCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk9QRU4pOwotCQkJCQkJZmlsZUNob29zZXIuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWZpbGVDaG9vc2VyLnNldEZpbHRlckV4dGVuc2lvbnMoaW1hZ2VUeXBlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWZpbGVDaG9vc2VyLnNldEZpbHRlck5hbWVzKGltYWdlTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgaW1hZ2VGaWxlID0gbnVsbDsKLQkJCQkJCVN0cmluZyBmaWxlbmFtZSA9IG51bGw7Ci0JCQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQkJCWltYWdlRmlsZSA9IGZpbGVDaG9vc2VyLm9wZW4oKTsKLQkJCQkJCQlmaWxlbmFtZSA9IGZpbGVDaG9vc2VyLmdldEZpbGVOYW1lKCk7Ci0JCQkJCQkJaWYgKGltYWdlRmlsZSAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmIChuZXcgRmlsZShpbWFnZUZpbGUpLmV4aXN0cygpKSB7Ci0JCQkJCQkJCQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YSgKLQkJCQkJCQkJCQkJaW1hZ2VGaWxlKTsKLQkJCQkJCQkJCWlmIChpbWFnZURhdGEud2lkdGggPiBOT0RFSUNPTl9XSURUSF9NQVgKLQkJCQkJCQkJCQkJfHwgaW1hZ2VEYXRhLmhlaWdodCA+IE5PREVJQ09OX0hFSUdIVF9NQVgpIHsKLQkJCQkJCQkJCQkvLyBtc2cgdXNlciAtIGltYWdlIHRvbyBiaWcKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RpdGxlLCAvLyROT04tTkxTLTEkIAotCQkJCQkJCQkJCQkJCQlNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCQkJCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGVtcGxhdGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCWltYWdlRmlsZSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJbmV3IEludGVnZXIoCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJTk9ERUlDT05fV0lEVEhfTUFYKSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJbmV3IEludGVnZXIoCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJTk9ERUlDT05fSEVJR0hUX01BWCkgfSkpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCS8vIG1zZyB1c2VyIC0gZmlsZSBkb2Vzbid0IGV4aXN0Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCU1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJCQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190ZW1wbGF0ZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyBpbWFnZUZpbGUgfSkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChpbWFnZUZpbGUgIT0gbnVsbCAmJiBpbWFnZUZpbGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJU3RyaW5nIHVybCA9IGNvcHlSZXNvdXJjZVRvTGliKGZpbGVuYW1lLAotCQkJCQkJCQkJCWZpbGVDaG9vc2VyLmdldEZpbHRlclBhdGgoKSwKLQkJCQkJCQkJCQljb250ZW50RWxlbWVudCk7Ci0JCQkJCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJsKTsKLQkJCQkJCQkJCW5vZGVJY29uVXJpID0gbmV3IFVSSShOZXRVdGlsCi0JCQkJCQkJCQkJCS5lbmNvZGVGaWxlVVJMKEZpbGVVdGlsCi0JCQkJCQkJCQkJCQkJLmdldFJlbGF0aXZlUGF0aChmaWxlLAotCQkJCQkJCQkJCQkJCQkJbmV3IEZpbGUoZ2V0UGx1Z2luUGF0aChjb250ZW50RWxlbWVudCkpKSkpOwotCQkJCQkJCQkJaWYgKG5vZGVJY29uVXJpICE9IG51bGwpIHsKLQkJCQkJCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1ncgotCQkJCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfTm9kZWljb24oKSwKLQkJCQkJCQkJCQkJCQkJbm9kZUljb25VcmksIC0xKTsKLQkJCQkJCQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJbm9kZUltYWdlID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0Q3VycmVudCgpLAotCQkJCQkJCQkJCQlmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCQkJCW5vZGVJY29uUGF0aC5zZXRUZXh0KG5vZGVJY29uVXJpLmdldFBhdGgoKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJbm9kZUljb25VcmkgPSBudWxsOwotCQkJCQkJCQlub2RlSW1hZ2UgPSBudWxsOwotCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCQkubG9nRXJyb3IoZXgpOwotCQkJCQkJCQlpZiAoZXggaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikgewotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfY29weWluZ19maWxlX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyX2NvcHlpbmdfZmlsZV9lcnJvciwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycl9jb3B5aW5nX2ZpbGVfcmVhc29uLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJZXguZ2V0TWVzc2FnZSgpKTsKLQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfcHJvY2Vzc2luZ19maWxlX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyX3Byb2Nlc3NpbmdfZmlsZV9kZXNjcmlwdGlvbiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobm9kZUltYWdlICE9IG51bGwpIHsKLQkJCQkJCQlwYW5lMy5yZWRyYXcoKTsKLQkJCQkJCQljdHJsX2NsZWFyX25vZGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljdHJsX2NsZWFyX25vZGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCi0JCWN0cmxfY2xlYXJfbm9kZUljb25fYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWNvbnRlbnRFbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCksIG51bGwsIC0xKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJcmV0dXJuOwotCQkJCXBhbmUzLnJlZHJhdygpOwotCQkJCWN0cmxfY2xlYXJfbm9kZUljb25fYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCW5vZGVJY29uUGF0aC5zZXRUZXh0KCIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIHRoZSBzZWxlY3RlZCBzaGFwZU5vZGVJY29uIGFuZCBub2RlSWNvbiB0byByZXNvdXJjZXMgZm9sZGVyIG9mCi0JICogY29udGVudCBlbGVtZW50LiBQcm9tcHRzIHRvIG92ZXJ3cml0ZSBpZiBmaWxlIGFscmVhZHkgZXhpc3RzLgotCSAqIEBwYXJhbSBzRmlsZU5hbWUKLQkgKiBAcGFyYW0gc0ZpbGVQYXRoCi0JICogQHBhcmFtIG1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29weVJlc291cmNlVG9MaWIoU3RyaW5nIHNGaWxlTmFtZSwgU3RyaW5nIHNGaWxlUGF0aCwKLQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBsaWJEaXJzID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSk7Ci0JCVN0cmluZyByZXNvdXJjZUxvYyA9IGxpYkRpcnMuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCSsgTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXRSZXNvdXJjZVBhdGgobWV0aG9kRWxlbWVudCk7Ci0KLQkJRmlsZSBzRmlsZSA9IG5ldyBGaWxlKHNGaWxlUGF0aCArIEZpbGUuc2VwYXJhdG9yICsgc0ZpbGVOYW1lKTsKLQkJU3RyaW5nQnVmZmVyIHJlc291cmNlRmlsZSA9IG5ldyBTdHJpbmdCdWZmZXIocmVzb3VyY2VMb2MpLmFwcGVuZCgKLQkJCQlGaWxlLnNlcGFyYXRvcikuYXBwZW5kKHNGaWxlTmFtZSk7Ci0JCUZpbGUgZm9ybWF0RmlsZSA9IG5ldyBGaWxlKHJlc291cmNlRmlsZS50b1N0cmluZygpKTsKLQkJCi0JCWlmIChmb3JtYXRGaWxlLmV4aXN0cygpKSB7Ci0JCQlSZW5hbWVGaWxlQ29uZmxpY3REaWFsb2cgZGlhbG9nID0gbmV3IFJlbmFtZUZpbGVDb25mbGljdERpYWxvZygKLQkJCQkJY3RybF9zZWxlY3Rfbm9kZUljb25fYnV0dG9uLmdldFNoZWxsKCkpOwotCQkJZGlhbG9nCi0JCQkJCS5zZXRNZXNzYWdlU3RyKE1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9pY29uU2VjdGlvbl9maWxlTmFtZUNvbmZsaWN0X21zZywgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgc0ZpbGVOYW1lLCByZXNvdXJjZUxvYyB9KSk7Ci0JCQlkaWFsb2cuc2V0RGVzdGlhdGlvbihyZXNvdXJjZUxvYyk7Ci0JCQlkaWFsb2cuc2V0RmlsZVBhdGgoc0ZpbGVOYW1lKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0KLQkJCWlmKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpewotCQkJCXJldHVybiBudWxsOwotCQkJfWVsc2V7Ci0JCQkJc0ZpbGVOYW1lID0gZGlhbG9nLmdldEZpbGVQYXRoKCk7Ci0JCQkJZm9ybWF0RmlsZSA9IG5ldyBGaWxlKHJlc291cmNlTG9jK0ZpbGUuc2VwYXJhdG9yK3NGaWxlTmFtZSk7Ci0JCQl9Ci0JCX0KLQotCQlGaWxlVXRpbC5jb3B5ZmlsZShzRmlsZSwgZm9ybWF0RmlsZSk7Ci0KLQkJcmV0dXJuIGZvcm1hdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZEljb25TZWN0aW9uRGF0YSgpIHsKLQkJcGFuZTEuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQkvLyBwYWludCB0aGUgZ3JleSBiYWNrZ3JvdW5kCi0JCQkJUmVjdGFuZ2xlIGNsaWVudFJlY3QgPSBwYW5lMS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJZS5nYy5zZXRDbGlwcGluZyhjbGllbnRSZWN0KTsKLQkJCQllLmdjLnNldEJhY2tncm91bmQoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0U3lzdGVtQ29sb3IoMTUpKTsKLQkJCQllLmdjLmZpbGxSZWN0YW5nbGUoY2xpZW50UmVjdCk7Ci0KLQkJCQlqYXZhLm5ldC5VUkkgdXJpID0gY29udGVudEVsZW1lbnQuZ2V0U2hhcGVpY29uKCk7Ci0JCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gY29udGVudEVsZW1lbnQuZ2V0U2hhcGVpY29uKCkuZ2V0UGF0aCgpOwotCQkJCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotCQkJCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkgewotCQkJCQkJCQkJLy8gQ2hlY2sgZm9yIHRoZSB1cmkgY29udGFpbnMgdGhlIHJlbGF0aXZlIHRvIGxpYnJhcnkuCi0JCQkJCQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY29udGVudEVsZW1lbnQpOwotCQkJCQkJCQkJaWYocGF0aC5pbmRleE9mKHBsdWdpbi5nZXROYW1lKCkpID4gLTEpewotCQkJCQkJCQkJCXBhdGggPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpCi0JCQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIHBhdGg7CQotCQkJCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCQkJcGF0aCA9IGdldFBsdWdpblBhdGgoY29udGVudEVsZW1lbnQpCi0JCQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIHBhdGg7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQkKLQkJCQkJCQkJfQotCQkJCQkJCQlmaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJCWlmIChzaGFwZUltYWdlID09IG51bGwpIHsKLQkJCQkJCQkJCXNoYXBlSW1hZ2UgPSBuZXcgSW1hZ2UoCi0JCQkJCQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLCBwYXRoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZihjb250ZW50RWxlbWVudC5nZXRTaGFwZWljb24oKSAhPSBudWxsKXsKLQkJCQkJCQkJCXNoYXBlSWNvblBhdGguc2V0VGV4dChjb250ZW50RWxlbWVudC5nZXRTaGFwZWljb24oKS5nZXRQYXRoKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNsaWVudFJlY3QgPSBwYW5lMS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJCQkJCWUuZ2Muc2V0Q2xpcHBpbmcoY2xpZW50UmVjdCk7Ci0JCQkJCQkJCWUuZ2Muc2V0QmFja2dyb3VuZChEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJCQkJCS5nZXRTeXN0ZW1Db2xvcigxNSkpOwotCQkJCQkJCQllLmdjLmZpbGxSZWN0YW5nbGUoY2xpZW50UmVjdCk7Ci0JCQkJCQkJCWUuZ2MuZHJhd0ltYWdlKHNoYXBlSW1hZ2UsIHNoYXBlSW1hZ2UKLQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkueCwKLQkJCQkJCQkJCQlzaGFwZUltYWdlLmdldEJvdW5kcygpLnksIHNoYXBlSW1hZ2UKLQkJCQkJCQkJCQkJCS5nZXRCb3VuZHMoKS53aWR0aCwgc2hhcGVJbWFnZQotCQkJCQkJCQkJCQkJLmdldEJvdW5kcygpLmhlaWdodCwgcGFuZTEKLQkJCQkJCQkJCQkJCS5nZXRDbGllbnRBcmVhKCkueCwgcGFuZTEKLQkJCQkJCQkJCQkJCS5nZXRDbGllbnRBcmVhKCkueSwgcGFuZTEKLQkJCQkJCQkJCQkJCS5nZXRDbGllbnRBcmVhKCkud2lkdGgsIHBhbmUxCi0JCQkJCQkJCQkJCQkuZ2V0Q2xpZW50QXJlYSgpLmhlaWdodCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaWYgKHdhcm5pbmdDb3VudCA9PSAxKSB7Ci0JCQkJCQkJCQl3YXJuaW5nQ291bnQrKzsKLQkJCQkJCQkJCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbldhcm5pbmcsIChuZXcgT2JqZWN0W10geyBjb250ZW50RWxlbWVudC5nZXROYW1lKCksIHBhdGggfSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQlNc2dCb3guc2hvd1dhcm5pbmcobXNnKTsKLQkJCQkJCQkJfQotCi0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbkVycm9yLCAobmV3IE9iamVjdFtdIHsgZXguZ2V0TWVzc2FnZSgpIH0pKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9KTsKLQkJcGFuZTEucmVkcmF3KCk7Ci0JCWlmKGNvbnRlbnRFbGVtZW50LmdldFNoYXBlaWNvbigpICE9IG51bGwpewotCQkJc2hhcGVJY29uUGF0aC5zZXRUZXh0KGNvbnRlbnRFbGVtZW50LmdldFNoYXBlaWNvbigpLmdldFBhdGgoKSk7Ci0JCX0KLQkJCi0JCXBhbmUzLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQkJLy8gcGFpbnQgdGhlIGdyZXkgYmFja2dyb3VuZAotCQkJCVJlY3RhbmdsZSBjbGllbnRSZWN0ID0gcGFuZTMuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCWUuZ2Muc2V0Q2xpcHBpbmcoY2xpZW50UmVjdCk7Ci0JCQkJZS5nYy5zZXRCYWNrZ3JvdW5kKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFN5c3RlbUNvbG9yKDE1KSk7Ci0JCQkJZS5nYy5maWxsUmVjdGFuZ2xlKGNsaWVudFJlY3QpOwotCi0JCQkJamF2YS5uZXQuVVJJIHVyaSA9IGNvbnRlbnRFbGVtZW50LmdldE5vZGVpY29uKCk7Ci0JCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gY29udGVudEVsZW1lbnQuZ2V0Tm9kZWljb24oKS5nZXRQYXRoKCk7Ci0JCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJCQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY29udGVudEVsZW1lbnQpOwotCQkJCQkJCQkJaWYocGF0aC5pbmRleE9mKHBsdWdpbi5nZXROYW1lKCkpID4gLTEpewotCQkJCQkJCQkJCXBhdGggPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpCi0JCQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIHBhdGg7CQotCQkJCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCQkJcGF0aCA9IGdldFBsdWdpblBhdGgoY29udGVudEVsZW1lbnQpCi0JCQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIHBhdGg7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJCQlpZiAobm9kZUltYWdlID09IG51bGwpIHsKLQkJCQkJCQkJCW5vZGVJbWFnZSA9IG5ldyBJbWFnZShEaXNwbGF5LmdldEN1cnJlbnQoKSwKLQkJCQkJCQkJCQkJcGF0aCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYoY29udGVudEVsZW1lbnQuZ2V0Tm9kZWljb24oKSAhPSBudWxsKXsKLQkJCQkJCQkJCW5vZGVJY29uUGF0aC5zZXRUZXh0KGNvbnRlbnRFbGVtZW50LmdldE5vZGVpY29uKCkuZ2V0UGF0aCgpKTsKLQkJCQkJCQkJfQotCQkJCQkJCQljbGllbnRSZWN0ID0gcGFuZTMuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCQkJCQllLmdjLnNldENsaXBwaW5nKGNsaWVudFJlY3QpOwotCQkJCQkJCQllLmdjLnNldEJhY2tncm91bmQoRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJCQkJCQkuZ2V0U3lzdGVtQ29sb3IoMTUpKTsKLQkJCQkJCQkJZS5nYy5maWxsUmVjdGFuZ2xlKGNsaWVudFJlY3QpOwotCQkJCQkJCQllLmdjLmRyYXdJbWFnZShub2RlSW1hZ2UsCi0JCQkJCQkJCQkJbm9kZUltYWdlLmdldEJvdW5kcygpLngsIG5vZGVJbWFnZQotCQkJCQkJCQkJCQkJLmdldEJvdW5kcygpLnksIG5vZGVJbWFnZQotCQkJCQkJCQkJCQkJLmdldEJvdW5kcygpLndpZHRoLCBub2RlSW1hZ2UKLQkJCQkJCQkJCQkJCS5nZXRCb3VuZHMoKS5oZWlnaHQsIHBhbmUzCi0JCQkJCQkJCQkJCQkuZ2V0Q2xpZW50QXJlYSgpLngsIHBhbmUzCi0JCQkJCQkJCQkJCQkuZ2V0Q2xpZW50QXJlYSgpLnksIHBhbmUzCi0JCQkJCQkJCQkJCQkuZ2V0Q2xpZW50QXJlYSgpLndpZHRoLCBwYW5lMwotCQkJCQkJCQkJCQkJLmdldENsaWVudEFyZWEoKS5oZWlnaHQpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmICh3YXJuaW5nQ291bnQgPT0gMSkgewotCQkJCQkJCQkJd2FybmluZ0NvdW50Kys7Ci0JCQkJCQkJCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbldhcm5pbmcsIChuZXcgT2JqZWN0W10geyBjb250ZW50RWxlbWVudC5nZXROYW1lKCksIHBhdGggfSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQlNc2dCb3guc2hvd1dhcm5pbmcobXNnKTsKLQkJCQkJCQkJfQotCi0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uRXJyb3IsIChuZXcgT2JqZWN0W10geyBleC5nZXRNZXNzYWdlKCkgfSkpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCQlwYW5lMy5yZWRyYXcoKTsKLQkJaWYoY29udGVudEVsZW1lbnQuZ2V0Tm9kZWljb24oKSAhPSBudWxsKXsKLQkJCW5vZGVJY29uUGF0aC5zZXRUZXh0KGNvbnRlbnRFbGVtZW50LmdldE5vZGVpY29uKCkuZ2V0UGF0aCgpKTsKLQkJfQotCX0KLQotCQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVNlY3Rpb25zKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCWlmIChnZW5lcmFsU2VjdGlvbk9uKSB7Ci0JCQlnZW5lcmFsU2VjdGlvbi5zZXRWaXNpYmxlKGVuYWJsZSk7Ci0JCQlpZiAoZW5hYmxlKSB7Ci0JCQkJZ2VuZXJhbFNlY3Rpb24uc2V0RXhwYW5kZWQoZ2VuZXJhbFNlY3Rpb25FeHBhbmRGbGFnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZ2VuZXJhbFNlY3Rpb25FeHBhbmRGbGFnID0gZ2VuZXJhbFNlY3Rpb24uaXNFeHBhbmRlZCgpOwotCQkJCWdlbmVyYWxTZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGV0YWlsU2VjdGlvbk9uKSB7Ci0JCQlkZXRhaWxTZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJCWlmIChlbmFibGUpIHsKLQkJCQlkZXRhaWxTZWN0aW9uLnNldEV4cGFuZGVkKGRldGFpbFNlY3Rpb25FeHBhbmRGbGFnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGV0YWlsU2VjdGlvbkV4cGFuZEZsYWcgPSBkZXRhaWxTZWN0aW9uLmlzRXhwYW5kZWQoKTsKLQkJCQlkZXRhaWxTZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5vdGF0aW9uU2VjdGlvbk9uKSB7Ci0JCQlub3RhdGlvblNlY3Rpb24uc2V0VmlzaWJsZShlbmFibGUpOwotCQkJaWYgKGVuYWJsZSkgewotCQkJCW5vdGF0aW9uU2VjdGlvbi5zZXRFeHBhbmRlZChub3RhdGlvblNlY3Rpb25FeHBhbmRGbGFnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbm90YXRpb25TZWN0aW9uRXhwYW5kRmxhZyA9IG5vdGF0aW9uU2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQkJbm90YXRpb25TZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRhaWxvcmluZ1NlY3Rpb25PbikgewotCQkJdGFpbG9yaW5nU2VjdGlvbi5zZXRWaXNpYmxlKGVuYWJsZSk7Ci0JCQlpZiAoZW5hYmxlKSB7Ci0JCQkJdGFpbG9yaW5nU2VjdGlvbi5zZXRFeHBhbmRlZCh0YWlsb3JpbmdTZWN0aW9uRXhwYW5kRmxhZyk7Ci0JCQl9IGVsc2UgewotCQkJCXRhaWxvcmluZ1NlY3Rpb25FeHBhbmRGbGFnID0gdGFpbG9yaW5nU2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQkJdGFpbG9yaW5nU2VjdGlvbi5zZXRFeHBhbmRlZChlbmFibGUpOwotCQkJfQotCQl9Ci0JCWlmICh2ZXJzaW9uU2VjdGlvbk9uKSB7Ci0JCQl2ZXJzaW9uU2VjdGlvbi5zZXRWaXNpYmxlKGVuYWJsZSk7Ci0JCQlpZiAoZW5hYmxlKSB7Ci0JCQkJdmVyc2lvblNlY3Rpb24uc2V0RXhwYW5kZWQodmVyc2lvblNlY3Rpb25FeHBhbmRGbGFnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvblNlY3Rpb25FeHBhbmRGbGFnID0gdmVyc2lvblNlY3Rpb24uaXNFeHBhbmRlZCgpOwotCQkJCXZlcnNpb25TZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGljb25TZWN0aW9uT24pIHsKLQkJCWljb25TZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJCWlmIChlbmFibGUpIHsKLQkJCQlpY29uU2VjdGlvbi5zZXRFeHBhbmRlZChpY29uU2VjdGlvbkV4cGFuZEZsYWcpOwotCQkJfSBlbHNlIHsKLQkJCQlpY29uU2VjdGlvbkV4cGFuZEZsYWcgPSBpY29uU2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQkJaWNvblNlY3Rpb24uc2V0RXhwYW5kZWQoZW5hYmxlKTsKLQkJCX0KLQkJfQotCQlpZiAodmFyaWFiaWxpdHlTZWN0aW9uT24pIHsKLQkJCXZhcmlhYmlsaXR5U2VjdGlvbi5zZXRWaXNpYmxlKGVuYWJsZSk7Ci0JCQlpZiAoZW5hYmxlKSB7Ci0JCQkJdmFyaWFiaWxpdHlTZWN0aW9uLnNldEV4cGFuZGVkKGVsZW1lbnRTZWN0aW9uRXhwYW5kRmxhZyk7Ci0JCQl9IGVsc2UgewotCQkJCWVsZW1lbnRTZWN0aW9uRXhwYW5kRmxhZyA9IHZhcmlhYmlsaXR5U2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQkJdmFyaWFiaWxpdHlTZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoc2hhcGVJbWFnZSAhPSBudWxsKSB7Ci0JCQlzaGFwZUltYWdlLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAobm9kZUltYWdlICE9IG51bGwpIHsKLQkJCW5vZGVJbWFnZS5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGxhYmVsUHJvdmlkZXJWYXJpYWJpbGl0eSAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyVmFyaWFiaWxpdHkuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChjb250ZW50UHJvdmlkZXJWYXJpYWJpbGl0eSAhPSBudWxsKSB7Ci0JCQljb250ZW50UHJvdmlkZXJWYXJpYWJpbGl0eS5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGxhYmVsUHJvdmlkZXJCYXNlICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXJCYXNlLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoY29weXJpZ2h0TGFiZWxQcm92aWRlckJhc2UgIT0gbnVsbCkgewotCQkJY29weXJpZ2h0TGFiZWxQcm92aWRlckJhc2UuZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJCi0JCWRpc3Bvc2VkID0gdHJ1ZTsKLQl9CQkKLQotCXByaXZhdGUgdm9pZCBzZXRDb3B5cmlnaHRCdXR0b25EZXNlbGVjdCgpIHsKLQkJaWYgKGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldENvcHlyaWdodFN0YXRlbWVudCgpICE9IG51bGwpIHsKLQkJCWNvcHlyaWdodF9idXR0b25fZGVzZWxlY3QKLQkJCQkJLnNldEVuYWJsZWQoKGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpCi0JCQkJCQkJLmdldENvcHlyaWdodFN0YXRlbWVudCgpLmdldE5hbWUoKSA9PSBudWxsKSA/IGZhbHNlCi0JCQkJCQkJOiB0cnVlKTsKLQkJfSBlbHNlCi0JCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0LnNldEVuYWJsZWQoZmFsc2UpOwotCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpCi0JCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0LnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDb250ZXh0SGVscCgpIHsKLQkJaWYgKHNlY3Rpb25Db21wb3NpdGUgIT0gbnVsbCkgewotCQkJRWRpdG9yc0NvbnRleHRIZWxwZXIuc2V0SGVscChzZWN0aW9uQ29tcG9zaXRlLmdldFBhcmVudCgpLAotCQkJCQlnZXRDb250ZW50RWxlbWVudCgpKTsKLQkJfQotCQlpZiAoZXhwYW5kZWRDb21wb3NpdGUgIT0gbnVsbCkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCgKLQkJCQkJZXhwYW5kZWRDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLlJJQ0hfVEVYVF9FRElUT1JfQ09OVEVYVF9JRCk7Ci0JCX0KLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuSVJlZnJlc2hhYmxlI3JlZnJlc2hOYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKG5ld05hbWUgIT0gbnVsbCkgewotCQkJaWYgKChjdHJsX25hbWUgIT0gbnVsbCkgJiYgIShjdHJsX25hbWUuaXNEaXNwb3NlZCgpKSkgewotCQkJCWN0cmxfbmFtZS5yZW1vdmVNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJCQljdHJsX25hbWUuc2V0VGV4dChuZXdOYW1lKTsKLQkJCQljdHJsX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJc2V0Rm9ybVRleHRXaXRoVmFyaWFibGVJbmZvKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpewotCQkKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24oKXsKLQkJaWYoZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIGRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbjsKLQkJfQotCQlyZXR1cm4gQXV0aG9yaW5nVUlUZXh0LkRFVEFJTF9TRUNUSU9OX0RFU0M7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0R2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbigpewotCQlpZihnZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uIT0gbnVsbCl7Ci0JCQlyZXR1cm4gZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbjsKLQkJfQotCQlyZXR1cm4gQXV0aG9yaW5nVUlUZXh0LkdFTkVSQUxfSU5GT19TRUNUSU9OX0RFU0M7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFpbG9yaW5nU2VjdGlvbkRlc2NyaXB0aW9uKCl7Ci0JCWlmKHRhaWxvcmluZ1NlY3Rpb25EZXNjcmlwdGlvbiAhPSBudWxsKXsKLQkJCXJldHVybiB0YWlsb3JpbmdTZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJcmV0dXJuIEF1dGhvcmluZ1VJVGV4dC5UQUlMT1JJTkdfU0VDVElPTl9ERVNDOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uKCl7Ci0JCWlmKG5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIG5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uOwotCQl9Ci0JCXJldHVybiBBdXRob3JpbmdVSVRleHQuTk9UQVRJT05fU0VDVElPTl9ERVNDOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uKCl7Ci0JCWlmKHZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIHZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uOwotCQl9Ci0JCXJldHVybiBBdXRob3JpbmdVSVRleHQuVkFSSUFCSUxJVFlfU0VDVElPTl9ERVNDOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRJY29uU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHVicwotCQlpZihpY29uU2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIGljb25TZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJcmV0dXJuIEF1dGhvcmluZ1VJVGV4dC5JQ09OX1NFQ1RJT05fREVTQzsKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlpZih2ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIHZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJcmV0dXJuIEF1dGhvcmluZ1VJVGV4dC5WRVJTSU9OX0lORk9fU0VDVElPTl9ERVNDOwotCX0KLQotCS8qKiAKLQkgKiBGb2xsb3dpbmcgbWV0aG9kcyBiZWxvdyBleHBvc2VkIHB1YmxpYyBpbiBvcmRlciB0byBhbGxvdyAKLQkgKiB0ZXN0IGF1dG9tYXRpb24gdG8gYWNjZXNzIHRoZSBmb3JtIG9iamVjdHMgdGhyb3VnaCB0ZXN0IG9iamVjdHMKLQkgKiBvZiBhbnkgYXV0b21hdGlvbiB0b29scy4KLQkgKi8KLQkKLQkvKioKLQkgKiBHZXQgYnJpZWYgZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN0cmxfYnJpZWZfZGVzYy4KLQkgKi8KLQlwdWJsaWMgVGV4dCBnZXRDdHJsX2JyaWVmX2Rlc2MoKSB7Ci0JCXJldHVybiBjdHJsX2JyaWVmX2Rlc2M7Ci0JfQotCi0JLyoqCi0JICogU2V0IGJyaWVmIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGN0cmxfYnJpZWZfZGVzYyBUaGUgY3RybF9icmllZl9kZXNjIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdHJsX2JyaWVmX2Rlc2MoVGV4dCBjdHJsX2JyaWVmX2Rlc2MpIHsKLQkJdGhpcy5jdHJsX2JyaWVmX2Rlc2MgPSBjdHJsX2JyaWVmX2Rlc2M7Ci0JfQotCi0JLyoqCi0JICogR2V0IG1haW4gZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN0cmxfZnVsbF9kZXNjLgotCSAqLwotCXB1YmxpYyBJTWV0aG9kUmljaFRleHQgZ2V0Q3RybF9mdWxsX2Rlc2MoKSB7Ci0JCXJldHVybiBjdHJsX2Z1bGxfZGVzYzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgbWFpbiBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBjdHJsX2Z1bGxfZGVzYyBUaGUgY3RybF9mdWxsX2Rlc2MgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN0cmxfZnVsbF9kZXNjKElNZXRob2RSaWNoVGV4dCBjdHJsX2Z1bGxfZGVzYykgewotCQl0aGlzLmN0cmxfZnVsbF9kZXNjID0gY3RybF9mdWxsX2Rlc2M7Ci0JfQotCi0JLyoqCi0JICogR2V0IHByZXNlbnRhdGlvbiBuYW1lCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lLgotCSAqLwotCXB1YmxpYyBUZXh0IGdldEN0cmxfcHJlc2VudGF0aW9uX25hbWUoKSB7Ci0JCXJldHVybiBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lOwotCX0KLQotCS8qKgotCSAqIFNldCBwcmVzZW50YXRpb24gbmFtZQotCSAqIEBwYXJhbSBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lIFRoZSBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdHJsX3ByZXNlbnRhdGlvbl9uYW1lKFRleHQgY3RybF9wcmVzZW50YXRpb25fbmFtZSkgewotCQl0aGlzLmN0cmxfcHJlc2VudGF0aW9uX25hbWUgPSBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lOwotCX0KLQotCS8qKgotCSAqIEdldCBleHBhbmRlZCByaWNoIHRleHQgY29udHJvbAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3RybF9leHBhbmRlZC4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFJpY2hUZXh0RWRpdG9yIGdldEN0cmxfZXhwYW5kZWQoKSB7Ci0JCXJldHVybiBjdHJsX2V4cGFuZGVkOwotCX0KLQotCS8qKgotCSAqIFNldCBleHBhbmRlZCByaWNoIHRleHQgY29udHJvbAotCSAqIEBwYXJhbSBjdHJsX2V4cGFuZGVkIFRoZSBjdHJsX2V4cGFuZGVkIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdHJsX2V4cGFuZGVkKElNZXRob2RSaWNoVGV4dEVkaXRvciBjdHJsX2V4cGFuZGVkKSB7Ci0JCXRoaXMuY3RybF9leHBhbmRlZCA9IGN0cmxfZXhwYW5kZWQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHJpY2ggdGV4dCBjb250cm9sCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjdHJsX2tleS4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFJpY2hUZXh0IGdldEN0cmxfa2V5KCkgewotCQlyZXR1cm4gY3RybF9rZXk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHJpY2ggdGV4dCBjb250cm9sCi0JICogQHBhcmFtIGN0cmxfa2V5IFRoZSBjdHJsX2tleSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3RybF9rZXkoSU1ldGhvZFJpY2hUZXh0IGN0cmxfa2V5KSB7Ci0JCXRoaXMuY3RybF9rZXkgPSBjdHJsX2tleTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5QYXRoKE1ldGhvZEVsZW1lbnQgZSl7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJaWYocGx1Z2luICE9IG51bGwpewotCQkJRmlsZSBsaWJEaXJzID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSk7Ci0JCQlTdHJpbmcgcmVzb3VyY2VMb2MgPSBsaWJEaXJzLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJKyBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmdldEVsZW1lbnRQYXRoKHBsdWdpbik7Ci0JCQlyZXR1cm4gcmVzb3VyY2VMb2M7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lRGVzY3JpcHRpb25QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZURlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOWM2Y2QyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBEb21haW4gZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZURlc2NyaXB0aW9uUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJkaXNjaXBsaW5lRGVzY3JpcHRpb25QYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBEaXNjaXBsaW5lIGRpc2NpcGxpbmU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lRGVzY3JpcHRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlkaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpIGNvbnRlbnRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gZGlzY2lwbGluZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSk7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gc2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcKLQkJKChDYXRlZ29yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQlkaXNjaXBsaW5lKSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUzsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZUdyb3VwaW5nRGVzY3JpcHRpb25QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZUdyb3VwaW5nRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyNTAwZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUdyb3VwaW5nRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImRpc2NpcGxpbmVHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGlzY2lwbGluZUdyb3VwaW5nIGRpc2NpcGxpbmVHcm91cGluZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZGlzY2lwbGluZUdyb3VwaW5nID0gKERpc2NpcGxpbmVHcm91cGluZykgY29udGVudEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBkaXNjaXBsaW5lR3JvdXBpbmc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCX0KLQkJfTsKLQotCQkvLyBTZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZy4KLQkJKChDYXRlZ29yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQlkaXNjaXBsaW5lR3JvdXBpbmcpIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lZ3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZWdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZWdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZWZhYmZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEaXNjaXBsaW5lcyBwYWdlIGluIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJkaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2UiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBEaXNjaXBsaW5lR3JvdXBpbmcgZGlzY2lwbGluZUdyb3VwaW5nOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuRElTQ0lQTElORVNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlkaXNjaXBsaW5lR3JvdXBpbmcgPSAoRGlzY2lwbGluZUdyb3VwaW5nKSBjb250ZW50RWxlbWVudDsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKERpc2NpcGxpbmVHcm91cGluZykgb2JqZWN0KS5nZXREaXNjaXBsaW5lcygpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksCi0JCQkJCWRpc2NpcGxpbmVHcm91cGluZywKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCksCi0JCQkJCWFkZEl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLAotCQkJCQlkaXNjaXBsaW5lR3JvdXBpbmcsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpLAotCQkJCQlybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGRpc2NpcGxpbmVHcm91cGluZzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNWYzZjUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5SZWZlcmVuY2VXb3JrRmxvd0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBSZWZlcmVuY2UgV29ya2Zsb3cgcGFnZSBpbiB0aGUgRGlzY2lwbGluZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIERpc2NpcGxpbmUgZGlzY2lwbGluZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlJFRkVSRU5DRV9XT1JLRkxPV19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgY29udGVudEVsZW1lbnQ7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQkJc2V0QWxsb3dDaGFuZ2UyKHRydWUpOwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBkaXNjaXBsaW5lLmdldFJlZmVyZW5jZVdvcmtmbG93cygpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkvLyBPYmplY3Qgb2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0JCQkvLyBpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJLy8gUHJvY2VzcyBwcm9jZXNzID0KLQkJCS8vIChQcm9jZXNzKSgoUHJvY2Vzc0NvbXBvbmVudClvYmplY3QpLmdldFByb2Nlc3MoKTsKLQkJCS8vIGlmIChwcm9jZXNzICE9IG51bGwpIHsKLQkJCS8vIGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJLy8gZGlzY2lwbGluZSwKLQkJCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCksIHByb2Nlc3MsCi0JCQkvLyAtMSk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyBlbHNlIHsKLQkJCS8vIGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJLy8gZGlzY2lwbGluZSwKLQkJCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCksIG9iamVjdCwKLQkJCS8vIC0xKTsKLQkJCS8vIH0KLQkJCU1ldGhvZEVsZW1lbnQgb2JqZWN0ID0gKE1ldGhvZEVsZW1lbnQpIGl0b3IubmV4dCgpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlvYmplY3QgPSAoKFByb2Nlc3NDb21wb25lbnQpIG9iamVjdCkuZ2V0UHJvY2VzcygpOwotCQkJfQotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCk7Ci0JCQkJaWYgKFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeU9wcG9zaXRlKGRpc2NpcGxpbmUsCi0JCQkJCQlmZWF0dXJlLCBvYmplY3QpKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCWRpc2NpcGxpbmUsIGZlYXR1cmUsIG9iamVjdCwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksCi0JCQkJCWRpc2NpcGxpbmUsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCksCi0JCQkJCXJtSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gZGlzY2lwbGluZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlBST0NFU1NFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBSZWZlcmVuY2VXb3JrRmxvd0ZpbHRlcigpOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVUYXNrc1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lVGFza3NQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkZmI4ZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVUYXNrc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1lc3NlbmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFRhc2tzIHBhZ2UgaW4gdGhlIERpc2NpcGxpbmUgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZVRhc2tzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJkaXNjaXBsaW5lVGFza3NQYWdlIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgRGlzY2lwbGluZSBkaXNjaXBsaW5lOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZVRhc2tzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LlRBU0tTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKSBjb250ZW50RWxlbWVudDsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKERpc2NpcGxpbmUpIG9iamVjdCkuZ2V0VGFza3MoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJCi0JCQkJLy8JY2hlY2sgdG8gbWFpbnRhaW4gbWFueS10by1vbmUgcnVsZSBmb3IgZG9tYWluLXdvcmtwcm9kdWN0Ci0vLwkJCQlMaXN0IGRpc2NpcGxpbmVzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZXModGFzayk7Ci0vLwkJCQlpZiAoZGlzY2lwbGluZXMgIT0gbnVsbCAmJiBkaXNjaXBsaW5lcy5zaXplKCkgPiAwKQl7Ci0vLwkJCQkJT2JqZWN0IGFzc29jaWF0ZWREaXNjaXBsaW5lID0gZGlzY2lwbGluZXMuZ2V0KDApOwotLy8JCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0Ci0vLwkJCQkJLmZvcm1hdCgKLS8vCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLlVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHMsCi0vLwkJCQkJCQluZXcgT2JqZWN0W10gewotLy8JCQkJCQkJCQl0YXNrLmdldE5hbWUoKSwKLS8vCQkJCQkJCQkJVG5nVXRpbAotLy8JCQkJCQkJCQkJCS5nZXRMYWJlbFdpdGhQYXRoKGFzc29jaWF0ZWREaXNjaXBsaW5lKSwKLS8vCQkJCQkJCQkJZGlzY2lwbGluZS5nZXROYW1lKCkgfSk7Ci0vLwkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dXYXJuaW5nKAotLy8JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsIG1zZyk7Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJfQotCQkJCQotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9EaXNjaXBsaW5lKAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBkaXNjaXBsaW5lLCB0YXNrKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbURpc2NpcGxpbmUoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIGRpc2NpcGxpbmUsIHRhc2spOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBkaXNjaXBsaW5lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuVEFTS1M7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgQ29udGVudEZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkJaWYgKGdldEhlbHBlcigpLmlzQ29udHJpYnV0b3IoKENvbnRlbnRFbGVtZW50KSBvYmopKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFRhc2spOwotCQkJfQotCQl9OwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0RvbWFpbkRlc2NyaXB0aW9uUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0RvbWFpbkRlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNThmZjRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Eb21haW5EZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgRG9tYWluIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImRvbWFpbkRlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRG9tYWluIGRvbWFpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERvbWFpbkRlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZG9tYWluID0gKERvbWFpbikgY29udGVudEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBkb21haW47Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIERvbWFpbik7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gc2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcKLQkJKChDYXRlZ29yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQlkb21haW4pIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRvbWFpbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5fZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG9tYWluX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRG9tYWluV29ya1Byb2R1Y3RzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0RvbWFpbldvcmtQcm9kdWN0c1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmM2ZTFlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRG9tYWluV29ya1Byb2R1Y3RzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLldvcmtQcm9kdWN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXNzZW5nZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBXb3JrIFByb2R1Y3RzIHBhZ2UgaW4gdGhlIERvbWFpbiBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21haW5Xb3JrUHJvZHVjdHNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImRvbWFpbldvcmtQcm9kdWN0c1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIERvbWFpbiBkb21haW47Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERvbWFpbldvcmtQcm9kdWN0c1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5XT1JLX1BST0RVQ1RTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZG9tYWluID0gKERvbWFpbikgY29udGVudEVsZW1lbnQ7Ci0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gKChEb21haW4pIG9iamVjdCkuZ2V0V29ya1Byb2R1Y3RzKCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVdXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCQkvLyBjaGVjayB0byBtYWludGFpbiBtYW55LXRvLW9uZSBydWxlIGZvciBkb21haW4td29ya3Byb2R1Y3QKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlMaXN0IGRvbWFpbnMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXREb21haW5zKChXb3JrUHJvZHVjdCkgZWxlbWVudCk7Ci0JCQkJaWYgKGRvbWFpbnMgIT0gbnVsbCAmJiBkb21haW5zLnNpemUoKSA+IDApCXsKLQkJCQkJT2JqZWN0IGFzc29jaWF0ZWREb21haW4gPSBkb21haW5zLmdldCgwKTsKLQkJCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQKLQkJCQkJLmZvcm1hdCgKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQllbGVtZW50LmdldE5hbWUoKSwKLQkJCQkJCQkJCVRuZ1V0aWwKLQkJCQkJCQkJCQkJLmdldExhYmVsV2l0aFBhdGgoYXNzb2NpYXRlZERvbWFpbiksCi0JCQkJCQkJCQlkb21haW4uZ2V0TmFtZSgpIH0pOwotCQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd1dhcm5pbmcoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsIG1zZyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJLy8gY2hlY2sgaWYgdGhpcyBvcGVyYXRpb24gd2lsbCBtb2RpZnkgdGhlIGVsZW1lbnQgaW4gb3Bwb3NpdGUKLQkJCQkvLyBmZWF0dXJlIHZhbHVlCi0JCQkJLy8JCi0vLwkJCQlpZiAoIVVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeU9wcG9zaXRlKGRvbWFpbiwKLS8vCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpLCBlbGVtZW50KSkgewotLy8JCQkJCXJldHVybjsKLS8vCQkJCX0KLQkJCX0KLQotCQkJYWN0aW9uTWdyCi0JCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZG9tYWluLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKSwKLQkJCQkJCQlhZGRJdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCBkb21haW4sCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKSwgcm1JdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBkb21haW47Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgV29ya1Byb2R1Y3RGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCWlmIChnZXRIZWxwZXIoKS5pc0NvbnRyaWJ1dG9yKChDb250ZW50RWxlbWVudCkgb2JqKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9HdWlkYW5jZURlc2NyaXB0aW9uUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0d1aWRhbmNlRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxYWY0YzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0d1aWRhbmNlRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNvbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBpbiBhIEd1aWRhbmNlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAiZ3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgR3VpZGFuY2UgZ3VpZGFuY2U7Ci0KLQlwcml2YXRlIFN0cmluZyBlbGVtZW50TGFiZWw7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX2NvbnRlbnQ7Ci0KLQlwcml2YXRlIGludCBjb250ZW50RmllbGRIZWlnaHQgPSA0MDA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBHdWlkYW5jZURlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZ3VpZGFuY2UgPSAoR3VpZGFuY2UpIGNvbnRlbnRFbGVtZW50OwotCQllbGVtZW50TGFiZWwgPSBMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dChndWlkYW5jZSk7Ci0JCXNldEVsZW1lbnRUeXBlT24odHJ1ZSk7Ci0JCWlmIChndWlkYW5jZSBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKQotCQkJc2V0QnJpZWZEZXNjT24oZmFsc2UpOwotCQlzZXRGdWxsRGVzY09uKGZhbHNlKTsKLQkJc2V0S2V5Q29uc2lkZXJhdGlvbk9uKGZhbHNlKTsKLQkJc2V0SWNvblNlY3Rpb25Pbih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGb3JtUHJlZml4KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZvcm1QcmVmaXgoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKExpYnJhcnlVSVRleHQuVEVYVF9HVUlEQU5DRSkKLQkJCQkuYXBwZW5kKCIgKCIpLmFwcGVuZChlbGVtZW50TGFiZWwpLmFwcGVuZCgiKTogIikudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGVkaXRvciB0YWIgY29udGVudAotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlzdXBlci5jcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQpOwotCQljdHJsX2NvbnRlbnQgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5NQUlOX0RFU0NSSVBUSU9OX1RFWFQsCi0JCQkJY29udGVudEZpZWxkSGVpZ2h0LCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0KLQkJZmluYWwgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0KLQkJY3RybF9jb250ZW50LnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9jb250ZW50LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkpOwotCQljdHJsX2NvbnRlbnQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9jb250ZW50LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9jb250ZW50OwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBndWlkYW5jZS5nZXRQcmVzZW50YXRpb24oKQotCQkJCQkJLmdldE1haW5EZXNjcmlwdGlvbigpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNyZWZyZXNoKGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChib29sZWFuIGVkaXRhYmxlKSB7Ci0JCXN1cGVyLnJlZnJlc2goZWRpdGFibGUpOwotCQljdHJsX2NvbnRlbnQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWREYXRhKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGF0YSgpIHsKLQkJc3VwZXIubG9hZERhdGEoKTsKLQkJaWYgKGd1aWRhbmNlICE9IG51bGwpIHsKLQkJCVN0cmluZyBjb250ZW50ID0gbnVsbDsKLQkJCWlmIChndWlkYW5jZS5nZXRQcmVzZW50YXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJY29udGVudCA9IGd1aWRhbmNlLmdldFByZXNlbnRhdGlvbigpLmdldE1haW5EZXNjcmlwdGlvbigpOwotCQkJfQotCQkJY3RybF9jb250ZW50LnNldFRleHQoY29udGVudCA9PSBudWxsID8gIiIgOiBjb250ZW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBndWlkYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIE1haW4gRGVzY3JpcHRpb24gdGV4dCBib3guCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50RmllbGRIZWlnaHQoKSB7Ci0JCXJldHVybiBjb250ZW50RmllbGRIZWlnaHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBNYWluIERlc2NyaXB0aW9uIHRleHQgYm94LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRGaWVsZEhlaWdodChpbnQgY29udGVudEZpZWxkSGVpZ2h0KSB7Ci0JCXRoaXMuY29udGVudEZpZWxkSGVpZ2h0ID0gY29udGVudEZpZWxkSGVpZ2h0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDb250ZW50RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCQlyZXR1cm4gKCgoQ29udGVudEVsZW1lbnQpIG9iaikuZ2V0VHlwZSgpCi0JCQkJCQkJLmVxdWFscygoKEd1aWRhbmNlKSBjb250ZW50RWxlbWVudCkuZ2V0VHlwZSgpKSk7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQotCQkvLyBTZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZy4KLQkJKChDb250ZW50RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCWd1aWRhbmNlKSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBXaGl0ZXBhcGVyKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLndoaXRlcGFwZXJfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLndoaXRlcGFwZXJfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLndoaXRlcGFwZXJfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy53aGl0ZXBhcGVyX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMud2hpdGVwYXBlcl9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBDb25jZXB0KXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmNlcHRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmNlcHRfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmNlcHRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb25jZXB0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uY2VwdF9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBDaGVja2xpc3QpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGVja2xpc3RfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNoZWNrbGlzdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNoZWNrbGlzdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNoZWNrbGlzdF9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBFeGFtcGxlKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4YW1wbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4YW1wbGVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4YW1wbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5leGFtcGxlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXhhbXBsZV9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkZWxpbmUpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ3VpZGVsaW5lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5ndWlkZWxpbmVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmd1aWRlbGluZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmd1aWRlbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmd1aWRlbGluZV9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVzdGltYXRpb25jb25zaWRlcmF0aW9uX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVzdGltYXRpb25jb25zaWRlcmF0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25faWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUHJhY3RpY2UpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN1cHBvcnRpbmdtYXRlcmlhbF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3VwcG9ydGluZ21hdGVyaWFsX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdXBwb3J0aW5nbWF0ZXJpYWxfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdXBwb3J0aW5nbWF0ZXJpYWxfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdXBwb3J0aW5nbWF0ZXJpYWxfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVwb3J0KXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlcG9ydF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwb3J0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXBvcnRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXBvcnRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXBvcnRfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9hZG1hcCl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2FkbWFwX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2FkbWFwX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2FkbWFwX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9hZG1hcF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvYWRtYXBfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVGVtcGxhdGUpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGVtcGxhdGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlbXBsYXRlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50ZW1wbGF0ZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlbXBsYXRlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGVtcGxhdGVfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVGVybURlZmluaXRpb24pewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGVybWRlZmluaXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlcm1kZWZpbml0aW9uX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50ZXJtZGVmaW5pdGlvbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGVybWRlZmluaXRpb25faWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXN1YWJsZWFzc2V0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXN1YWJsZWFzc2V0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXN1YWJsZWFzc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVzdWFibGVhc3NldF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJldXNhYmxlYXNzZXRfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVG9vbE1lbnRvcil7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50b29sbWVudG9yX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50b29sbWVudG9yX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50b29sbWVudG9yX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbG1lbnRvcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xtZW50b3JfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9HdWlkYW5jZVdpdGhBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0d1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQxNDc1Y2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0d1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGluIGEgR3VpZGFuY2UgKHdpdGggYXR0YWNobWVudHMpIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UgewotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9hdHRhY2gsIGN0cmxfZGV0YWNoOyAvLyAsIGN0cmxfcmVtb3ZlOwotCi0JcHJpdmF0ZSBMaXN0IGN0cmxfYXR0YWNoZWRfZmlsZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJREFOQ0VfQVRUQUNITUVOVF9MQVNUX0RJUkVDVE9SWV9CUk9XU0VEX1BSRUYgPSAiZ3VpZGFuY2VfYXR0YWNobWVudF9sYXN0X2Rpcl9icm93c2VkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VXaXRoQXR0YWNobWVudHNEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjY3JlYXRlRWRpdG9yQ29udGVudChvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlzdXBlci5jcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQpOwotCi0JCWNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkFUVEFDSEVEX0ZJTEVfVEVYVCwgMik7Ci0JCWN0cmxfYXR0YWNoZWRfZmlsZXMgPSBuZXcgTGlzdChnZW5lcmFsQ29tcG9zaXRlLCBTV1QuU0lOR0xFCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQlHcmlkRGF0YSBsaXN0R3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkJFR0lOTklORywKLQkJCQl0cnVlLCB0cnVlKTsKLQkJbGlzdEdyaWREYXRhLmhlaWdodEhpbnQgPSAzMDsKLQkJbGlzdEdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJY3RybF9hdHRhY2hlZF9maWxlcy5zZXRMYXlvdXREYXRhKGxpc3RHcmlkRGF0YSk7Ci0KLQkJY3RybF9hdHRhY2hlZF9maWxlcy5zZXREYXRhKEZvcm1Ub29sa2l0LktFWV9EUkFXX0JPUkRFUiwKLQkJCQlGb3JtVG9vbGtpdC5URVhUX0JPUkRFUik7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCTEpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDE7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0KLQkJY3RybF9hdHRhY2ggPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uQ29tcG9zaXRlLCBBVFRBQ0hfQlVUVE9OKTsKLQkJY3RybF9kZXRhY2ggPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uQ29tcG9zaXRlLCBERVRBQ0hfQlVUVE9OKTsKLQkJLy8gY3RybF9yZW1vdmUgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uQ29tcG9zaXRlLCBSRU1PVkVfQlVUVE9OKTsKLQotCQlsYWJlbF9iYXNlLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkJBU0VfRUxFTUVOVF9URVhUKTsKLQotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCi0JCWZpbmFsIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJLmdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQljdHJsX2F0dGFjaC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpKTsKLQkJCQlkaWFsb2cKLQkJCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmF0dGFjaEd1aWRhbmNlRmlsZURpYWxvZ190aXRsZSk7IAotCQkJCVN0cmluZyBsYXN0RGlyID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCQkJLmdldFN0cmluZygKLQkJCQkJCQkJR1VJREFOQ0VfQVRUQUNITUVOVF9MQVNUX0RJUkVDVE9SWV9CUk9XU0VEX1BSRUYpOwotCQkJCWlmIChsYXN0RGlyICE9IG51bGwgJiYgbGFzdERpci50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGxhc3REaXIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkKLQkJCQkJCQkrIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkJKyBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChndWlkYW5jZSkpOwotCQkJCX0KLQkJCQlkaWFsb2cub3BlbigpOwotCQkJCWlmIChkaWFsb2cuZ2V0RmlsZU5hbWUoKSAhPSBudWxsICYmIGRpYWxvZy5nZXRGaWxlTmFtZSgpICE9ICIiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdHJ5IHsKLQkJCQkJCUZpbGUgZmlsZVRvQXR0YWNoID0gbmV3IEZpbGUoZGlhbG9nLmdldEZpbHRlclBhdGgoKSwKLQkJCQkJCQkJZGlhbG9nLmdldEZpbGVOYW1lKCkpOwotCQkJCQkJU3RyaW5nIGZpbGVVcmwgPSBSZXNvdXJjZUhlbHBlci5nZXRVUkxGb3JBdHRhY2htZW50KAotCQkJCQkJCQlmaWxlVG9BdHRhY2gsIGd1aWRhbmNlLCB0cnVlKTsKLQkJCQkJCWlmIChjdHJsX2F0dGFjaGVkX2ZpbGVzLmluZGV4T2YoZmlsZVVybCkgIT0gLTEpIHsKLQkJCQkJCQkvLyBmaWxlIGlzIGFscmVhZHkgYW4gYXR0YWNobWVudAotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXR0YWNobWVudERpYWxvZ2F0dGFjaEZpbGVfdGV4dCwgCi0JCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1zX0d1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlX2FscmVhZHlBdHRhY2hlZF9tc2cpOyAKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQljdHJsX2F0dGFjaGVkX2ZpbGVzLmFkZChmaWxlVXJsKTsKLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKSwKLQkJCQkJCQkJZ2V0RmlsZXNGcm9tTGlzdEN0cmwoKSwgLTEpOwotCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkJCQkJCS5zZXRWYWx1ZSgKLQkJCQkJCQkJCQkJR1VJREFOQ0VfQVRUQUNITUVOVF9MQVNUX0RJUkVDVE9SWV9CUk9XU0VEX1BSRUYsCi0JCQkJCQkJCQkJCWRpYWxvZy5nZXRGaWx0ZXJQYXRoKCkpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gVE9ETzogRGlzcGxheSBhbiBlcnJvciBkaWFsb2cuCi0JCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9kZXRhY2guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY3RybF9hdHRhY2hlZF9maWxlcy5yZW1vdmUoY3RybF9hdHRhY2hlZF9maWxlcwotCQkJCQkJLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWd1aWRhbmNlLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50cygpLAotCQkJCQkJZ2V0RmlsZXNGcm9tTGlzdEN0cmwoKSwgLTEpOwotCi0JCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJLy8gY3RybF9hdHRhY2hlZF9maWxlcy5zZXRUZXh0KG9sZENvbnRlbnQpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBjdHJsX3JlbW92ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCQkvLyBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCS8vIC8vY3RybF9hdHRhY2hlZF9maWxlcy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBTdHJpbmcgb2xkQ29udGVudCA9Ci0JCS8vICgoR3VpZGFuY2VEZXNjcmlwdGlvbilndWlkYW5jZS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0QXR0YWNobWVudHMoKTsKLQkJLy8gY3RybF9hdHRhY2hlZF9maWxlcy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCS8vIGd1aWRhbmNlLmdldFByZXNlbnRhdGlvbigpLAotCQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCksCi0JCS8vIGN0cmxfYXR0YWNoZWRfZmlsZXMuZ2V0VGV4dCgpLCAtMSk7Ci0JCS8vIGlmKCFzdGF0dXMpewotCQkvLyAvL2N0cmxfYXR0YWNoZWRfZmlsZXMuc2V0VGV4dChvbGRDb250ZW50KTsKLQkJLy8gcmV0dXJuOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlRGVzY3JpcHRpb25QYWdlI3JlZnJlc2goYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJc3VwZXIucmVmcmVzaChlZGl0YWJsZSk7Ci0JCWN0cmxfYXR0YWNoLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljdHJsX2RldGFjaC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJLy8gY3RybF9yZW1vdmUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCBpbml0aWFsIGRhdGEgZnJvbSBtb2RlbAotCSAqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlRGVzY3JpcHRpb25QYWdlI2xvYWREYXRhKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGF0YSgpIHsKLQkJc3VwZXIubG9hZERhdGEoKTsKLQkJaWYgKGd1aWRhbmNlICE9IG51bGwpIHsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQkJU3RyaW5nIHRoaXJkcGFydHlmb3JtYXQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbikgY29udGVudCkKLQkJCQkJLmdldEF0dGFjaG1lbnRzKCk7Ci0JCQlzZXRGaWxlc1RvTGlzdEN0cmwodGhpcmRwYXJ0eWZvcm1hdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBjb250ZW50RWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIHN0cmluZyBvZiBmaWxlcywgYWRkIHRoZSBmaWxlcyB0byB0aGUgTGlzdCBjb250cm9sCi0JICogCi0JICogQHBhcmFtIGZpbGVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEZpbGVzVG9MaXN0Q3RybChTdHJpbmcgZmlsZVN0cmluZykgewotCQlqYXZhLnV0aWwuTGlzdCBhdHRhY2htZW50TGlzdCA9IFRuZ1V0aWwKLQkJCQkuY29udmVydEd1aWRhbmNlQXR0YWNobWVudHNUb0xpc3QoZmlsZVN0cmluZyk7Ci0JCWN0cmxfYXR0YWNoZWRfZmlsZXMucmVtb3ZlQWxsKCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXR0YWNobWVudExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgYXR0YWNobWVudCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJY3RybF9hdHRhY2hlZF9maWxlcy5hZGQoYXR0YWNobWVudCk7Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIHJldHVybnMgdGhlIGxpc3Qgb2YgZmlsZXMgYXMgYSBzdHJpbmcKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZXNGcm9tTGlzdEN0cmwoKSB7Ci0JCVN0cmluZyBmaWxlc1tdID0gY3RybF9hdHRhY2hlZF9maWxlcy5nZXRJdGVtcygpOwotCQlyZXR1cm4gVG5nVXRpbC5jb252ZXJ0R3VpZGFuY2VBdHRhY2htZW50c1RvU3RyaW5nKEFycmF5cy5hc0xpc3QoZmlsZXMpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JRXh0ZW5zaW9uRm9ybVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JRXh0ZW5zaW9uRm9ybVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTE5ZjUzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvSUV4dGVuc2lvbkZvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuSUZvcm1QYWdlOwotCi0vKioKLSAqIEludGVyZmFjZSB0byBiZSB1c2VkIGZvciBhbGwgcGFnZXMgYWRkZWQgdGhyb3VnaCBleHRlbnNpb24gcG9pbnRzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUV4dGVuc2lvbkZvcm1QYWdlICAgewotCi0JLyoqCi0JICogU2V0IGVkaXRvciBmb3IgZm9ybSBwYWdlCi0JICogQHBhcmFtIGVkaXRvcgotCSAqLwotCXB1YmxpYyBJRm9ybVBhZ2Ugc2V0RWRpdG9yKEZvcm1FZGl0b3IgZWRpdG9yKSA7Ci0JCi0JLyoqCi0JICogU2V0IGlucHV0IGZvciBmb3JtIHBhZ2UKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0lSZWZyZXNoYWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0lSZWZyZXNoYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYWE2YTQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JUmVmcmVzaGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLS8qKgotICogSW50ZXJmYWNlIHVzZWQgdG8gcmVmcmVzaCBhIGZvcm0gdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW4gY2FzZSBvZiBtb2RlbCBjaGFuZ2Ugb3V0c2lkZSBvZiB0aGUgZm9ybQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZnJlc2hhYmxlIHsKLQkKLQkvKioKLQkgKiBSZWZyZXNoIG5hbWUgb2YgdGhlIGZvcm0KLQkgKiBAcGFyYW0gbmV3TmFtZQotCSAqLwotCXZvaWQgcmVmcmVzaE5hbWUoU3RyaW5nIG5ld05hbWUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL01ldGhvZEZvcm1Ub29sa2l0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvTWV0aG9kRm9ybVRvb2xraXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDNjOTMwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvTWV0aG9kRm9ybVRvb2xraXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRGVjb3JhdGVkRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLQotLyoqCi0gKiBBIGhlbHAgY2xhc3MgZm9yIGNyZWF0aW5nIFVJIHdpZGdldHMgYWRhcHRlZCBhZGFwdGVkIHRvIHdvcmsgaW4gRWNsaXBzZQotICogZm9ybXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRm9ybVRvb2xraXQgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIFJpY2ggVGV4dCBjb250cm9sIGFuZCBhZGFwdHMgaXQgdG8gYmUgdXNlZCBpbiBhIGZvcm0uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250cm9sLgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgaW5pdGlhbCB0ZXh0IGZvciB0aGUgdmlld2VyLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIGluaXRpYWwgc3R5bGUgZm9yIHRoZSB2aWV3ZXIuCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICBUaGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBocmVmcy4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPklNZXRob2RSaWNoVGV4dDwvY29kZT4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJTWV0aG9kUmljaFRleHQgY3JlYXRlUmljaFRleHQoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUsIFN0cmluZyBiYXNlUGF0aCwKLQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCwgRGVjb3JhdGVkRmllbGQgbGFiZWwpIHsKLQkJSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0ID0gbmV3IE1ldGhvZFJpY2hUZXh0KHBhcmVudCwgc3R5bGUsIGJhc2VQYXRoKTsKLQkJcmljaFRleHQuaW5pdChtZXRob2RFbGVtZW50LCBsYWJlbCk7Ci0JCXJpY2hUZXh0LmdldENvbnRyb2woKS5zZXREYXRhKEZvcm1Ub29sa2l0LktFWV9EUkFXX0JPUkRFUiwKLQkJCQlGb3JtVG9vbGtpdC5URVhUX0JPUkRFUik7Ci0JCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldFRleHQodGV4dCk7Ci0JCX0KLQkJcmV0dXJuIHJpY2hUZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBSaWNoIFRleHQgZWRpdG9yIGFuZCBhZGFwdHMgaXQgdG8gYmUgdXNlZCBpbiBhIGZvcm0uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250cm9sLgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgaW5pdGlhbCB0ZXh0IGZvciB0aGUgdmlld2VyLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIGluaXRpYWwgc3R5bGUgZm9yIHRoZSB2aWV3ZXIuCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICBUaGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBocmVmcy4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPklNZXRob2RSaWNoVGV4dEVkaXRvcjwvY29kZT4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJTWV0aG9kUmljaFRleHRFZGl0b3IgY3JlYXRlUmljaFRleHRFZGl0b3IoCi0JCQlGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHN0eWxlLAotCQkJU3RyaW5nIGJhc2VQYXRoLCBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQsIERlY29yYXRlZEZpZWxkIGxhYmVsLCBJRWRpdG9yU2l0ZSBlZGl0b3JTaXRlKSB7Ci0JCUlNZXRob2RSaWNoVGV4dEVkaXRvciBlZGl0b3IgPSBuZXcgTWV0aG9kUmljaFRleHRFZGl0b3IocGFyZW50LCBzdHlsZSwKLQkJCQliYXNlUGF0aCwgbWV0aG9kRWxlbWVudCwgbGFiZWwsIGVkaXRvclNpdGUpOwotCQllZGl0b3IuZ2V0Q29udHJvbCgpLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLAotCQkJCUZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJZWRpdG9yLnNldFRleHQodGV4dCk7Ci0JCX0KLQkJcmV0dXJuIGVkaXRvcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL01ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExZjFmZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL01ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci0KLQotLyoqCi0gKiBEZXNjcmlwdGlvbiBwYWdlIGZvciBtZXRob2QgbGlicmFyeQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2UgZXh0ZW5kcyBGb3JtUGFnZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UID0gMjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX25hbWU7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9icmllZl9kZXNjOwotCi0JcHJpdmF0ZSBTZWN0aW9uIGdlbmVyYWxTZWN0aW9uOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgZ2VuZXJhbENvbXBvc2l0ZTsKLQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsaWJyYXJ5OwotCi0JcHJpdmF0ZSBUZXh0IHRleHRBdXRob3JzOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfY2hhbmdlX2RhdGU7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9jaGFuZ2VfZGVzYzsKLQotCXByaXZhdGUgVGV4dCBjdHJsX3ZlcnNpb247Ci0KLQlwcml2YXRlIFRleHQgY3RybF9jb3B5cmlnaHQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIGVkaXRvcgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcigKLQkJCQllZGl0b3IsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVzY3JpcHRpb25QYWdlX3RpdGxlLCBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvblBhZ2VfdGl0bGUpOyAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0KLQkJLy8gZ2V0IE1ldGhvZExpYnJhcnkgb2JqZWN0IGZyb20gRWRpdG9yIGlucHV0Ci0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBtZXRob2RFbGVtZW50SW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dDsKLQotCQlPYmplY3Qgb2JqID0gbWV0aG9kRWxlbWVudElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCWxpYnJhcnkgPSAoTWV0aG9kTGlicmFyeSkgb2JqOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZm9ybSBjb250ZW50LgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2NyZWF0ZUZvcm1Db250ZW50KG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJLy8gY3JlYXRlIGZvcm0gdG9vbGtpdAotCQlTY3JvbGxlZEZvcm0gZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQkJZm9ybS5zZXRUZXh0KGdldEVkaXRvcigpLmdldFBhcnROYW1lKCkpOwotCi0JCVRhYmxlV3JhcExheW91dCBsYXlvdXQgPSBuZXcgVGFibGVXcmFwTGF5b3V0KCk7Ci0JCWZvcm0uZ2V0Qm9keSgpLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIENyZWF0ZSBlZGl0b3IgY29udGVudAotCQljcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQsIGZvcm0uZ2V0Qm9keSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWRpdG9yIHRhYiBjb250ZW50Ci0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcGFyYW0gZWRpdG9yQ29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBlZGl0b3JDb21wb3NpdGUpIHsKLQkJLy8gQ3JlYXRlIEdlbmVyYWwgSW5mb3JtYXRpb24gc2VjdGlvbgotCQlnZW5lcmFsU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihlZGl0b3JDb21wb3NpdGUsCi0JCQkJU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQKLQkJCQkJCXwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJZ2VuZXJhbFNlY3Rpb24KLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCQlnZW5lcmFsU2VjdGlvbgotCQkJCS5zZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX2Rlc2NyaXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlnZW5lcmFsU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJZ2VuZXJhbENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxTZWN0aW9uKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0Q2xpZW50KGdlbmVyYWxDb21wb3NpdGUpOwotCi0JCS8vIG5hbWUKLQkJTGFiZWwgbF9uYW1lID0gdG9vbGtpdC5jcmVhdGVMYWJlbChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5hbWVfdGV4dCk7IAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWxfbmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfbmFtZSA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIiwgU1dULlNJTkdMRSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQljdHJsX25hbWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBicmllZiBkZXNjCi0JCUxhYmVsIGxfYnJpZWZfZGVzYyA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvbl90ZXh0KTsgCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJbF9icmllZl9kZXNjLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9icmllZl9kZXNjID0gdG9vbGtpdC5jcmVhdGVUZXh0KGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJIiIsIFNXVC5NVUxUSSB8IFNXVC5XUkFQKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDQwOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNDAwOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCS8vIEF1dGhvcnMKLQkJTGFiZWwgbGFiZWwgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXV0aG9yc190ZXh0KTsgCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQl0ZXh0QXV0aG9ycyA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCSIiLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQl0ZXh0QXV0aG9ycy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCS8vIENoYW5nZSBEYXRlCi0JCUxhYmVsIGxfY2hhbmdlZGF0ZSA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJbF9jaGFuZ2VkYXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9jaGFuZ2VfZGF0ZSA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCSIiLCBTV1QuUkVBRF9PTkxZKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWN0cmxfY2hhbmdlX2RhdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBBdXRob3JzCi0JCUxhYmVsIGxfY2hhbmdlX2Rlc2MgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkNIQU5HRV9ERVNDUklQVElPTl9URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQlsX2NoYW5nZV9kZXNjLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9jaGFuZ2VfZGVzYyA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIiwgU1dULk1VTFRJKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDQwOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWN0cmxfY2hhbmdlX2Rlc2Muc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBWZXJzaW9uCi0JCUxhYmVsIGxfdmVyc2lvbiA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuVkVSU0lPTl9URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQlsX3ZlcnNpb24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljdHJsX3ZlcnNpb24gPSB0b29sa2l0LmNyZWF0ZVRleHQoZ2VuZXJhbENvbXBvc2l0ZSwgIiIsIFNXVC5NVUxUSSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQljdHJsX3ZlcnNpb24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJTGFiZWwgbF9jb3B5cmlnaHQgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29weXJpZ2h0X3RleHQpOyAKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQlsX2NvcHlyaWdodC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljdHJsX2NvcHlyaWdodCA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQljdHJsX2NvcHlyaWdodC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGdlbmVyYWxDb21wb3NpdGUpOwotCi0JCWFkZExpc3RlbmVycygpOwotCQlsb2FkRGF0YSgpOwotCi0JCS8vIFNldCBmb2N1cyBvbiB0aGUgbmFtZSBhdHRyaWJ1dGUKLQkJRGlzcGxheSBkaXNwbGF5ID0gZWRpdG9yQ29tcG9zaXRlLmdldERpc3BsYXkoKTsKLQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgaW5pdGlhbCBkYXRhIGZyb20gbW9kZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERhdGEoKSB7Ci0JCVN0cmluZyBuYW1lID0gbGlicmFyeS5nZXROYW1lKCk7Ci0JCVN0cmluZyBicmllZl9kZXNjID0gbGlicmFyeS5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0KLQkJY3RybF9uYW1lLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwobmFtZSkpOwotCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChicmllZl9kZXNjKSk7Ci0JCXRleHRBdXRob3JzLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwobGlicmFyeS5nZXRBdXRob3JzKCkpKTsKLQkJaWYgKGxpYnJhcnkuZ2V0Q2hhbmdlRGF0ZSgpICE9IG51bGwpIHsKLQkJCWN0cmxfY2hhbmdlX2RhdGUuc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChsaWJyYXJ5LmdldENoYW5nZURhdGUoKQotCQkJCQkudG9Mb2NhbGVTdHJpbmcoKSkpOwotCQl9Ci0JCWN0cmxfY2hhbmdlX2Rlc2Muc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChsaWJyYXJ5Ci0JCQkJLmdldENoYW5nZURlc2NyaXB0aW9uKCkpKTsKLQkJY3RybF92ZXJzaW9uLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwobGlicmFyeS5nZXRWZXJzaW9uKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgZm9jdXMgbGlzdGVuZXJzCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJY3RybF9uYW1lLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlsaWJyYXJ5LnNldE5hbWUoY3RybF9uYW1lLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYnJpZWZfZGVzYy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJbGlicmFyeS5zZXRCcmllZkRlc2NyaXB0aW9uKGN0cmxfYnJpZWZfZGVzYy5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQotCQl0ZXh0QXV0aG9ycy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJbGlicmFyeS5zZXRBdXRob3JzKHRleHRBdXRob3JzLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfY2hhbmdlX2Rlc2MuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWxpYnJhcnkuc2V0Q2hhbmdlRGVzY3JpcHRpb24oY3RybF9jaGFuZ2VfZGVzYy5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX3ZlcnNpb24uYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWxpYnJhcnkuc2V0VmVyc2lvbihjdHJsX3ZlcnNpb24uZ2V0VGV4dCgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9jb3B5cmlnaHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL01ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL01ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMWZlNzFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9NZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQ2hhbmdlSGlzdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuVmlld0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5SZW1vdmVSZWZlcmVuY2VzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5QbHVnaW5SZWZlcmVuY2VDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkRlY29yYXRlZEZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkltYWdlSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkRhdGVGb3JtYXQ7Ci0KLS8qKgotICogRGVzY3JpcHRpb24gcGFnZSBmb3IgbWV0aG9kIHBsdWdpbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2MzgyCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBCYXNlRm9ybVBhZ2UgaW1wbGVtZW50cyBJUmVmcmVzaGFibGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUFJFRklYID0gTGlicmFyeVVJVGV4dC5URVhUX01FVEhPRF9QTFVHSU4KLQkJCSsgIjogIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfbmFtZTsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmX2Rlc2MsIGN0cmxfcl9icmllZl9kZXNjOwotCi0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIGN0cmxfcmVmTW9kZWw7Ci0KLQlwcml2YXRlIFNlY3Rpb24gZ2VuZXJhbFNlY3Rpb24sIHJlZk1vZGVsU2VjdGlvbjsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGdlbmVyYWxDb21wb3NpdGUsIHJlZk1vZGVsQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBib29sZWFuIGRlc2NFeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcml2YXRlIE1ldGhvZFBsdWdpbiBwbHVnaW47Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCXByb3RlY3RlZCBTZWN0aW9uIHZlcnNpb25TZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSB2ZXJzaW9uQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYXV0aG9yczsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2NoYW5nZV9kYXRlOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfY2hhbmdlX2Rlc2M7Ci0KLQlwcml2YXRlIFRleHQgY3RybF92ZXJzaW9uOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmVyc2lvblNlY3Rpb25PbiA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhbnlBdHRyaWJ1dGVNb2RpZmllZCA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl9TRUNUSU9OX0lEID0gMzsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHRFZGl0b3IgY3RybF92ZXJzaW9uX2V4cGFuZGVkOwotCi0JcHJvdGVjdGVkIEltYWdlSHlwZXJsaW5rIGV4cGFuZFZlcnNpb25MaW5rOwotCi0JcHJvdGVjdGVkIERlY29yYXRlZEZpZWxkIGV4cGFuZFZlcnNpb25MYWJlbDsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgZXhwYW5kZWRWZXJzaW9uQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIG1vZGVsTW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgY29udGVudE1vZGlmeUxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgR0VORVJBTF9TRUNUSU9OX0lEID0gMTsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGFjdGl2ZUNvbnRyb2w7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgbGFiZWxfY29weXJpZ2h0OwotCi0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIGNvcHlyaWdodF92aWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgVGFibGUgY3RybF9jb3B5cmlnaHQ7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29weXJpZ2h0Q29udGVudFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyQmFzZSA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOzsKLQotCXByaXZhdGUgQnV0dG9uIGNvcHlyaWdodF9idXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBjb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0OwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9jaGFuZ2VhYmxlOwotCi0JcHJpdmF0ZSBCdXR0b24gdmlld19oaXN0b3J5X2J1dHRvbjsKLQotCXB1YmxpYyBib29sZWFuIG5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXIgdXNlckNoYW5nZWFibGVBZGFwdGVyOwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBuYW1lTW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBsYXN0Q2hhbmdlSGlzdG9yeSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSwKLQkJCQlBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0KLQkJYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJdXNlckNoYW5nZWFibGVBZGFwdGVyID0gbmV3IFVzZXJDaGFuZ2VhYmxlQWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5CYXNlRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgbWV0aG9kRWxlbWVudElucHV0ID0gKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCU9iamVjdCBvYmogPSBtZXRob2RFbGVtZW50SW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQlwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBvYmo7Ci0JCWlmICh1c2VyQ2hhbmdlYWJsZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcGx1Z2luLmVBZGFwdGVycygpLmFkZCh1c2VyQ2hhbmdlYWJsZUFkYXB0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQlzdXBlci5jcmVhdGVGb3JtQ29udGVudChtYW5hZ2VkRm9ybSk7Ci0JCWNyZWF0ZUVkaXRvckNvbnRlbnQodG9vbGtpdCk7Ci0JCWNyZWF0ZVJlZmVyZW5jZUNvbnRlbnQodG9vbGtpdCk7Ci0JCXNldENvbnRleHRIZWxwKCk7Ci0JCWxvYWREYXRhKCk7Ci0JCWFkZExpc3RlbmVycygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDb250ZXh0SGVscCgpIHsKLQkJaWYgKGdlbmVyYWxDb21wb3NpdGUgIT0gbnVsbCkgewotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscCgKLQkJCQkJCQlnZW5lcmFsQ29tcG9zaXRlLmdldFBhcmVudCgpLmdldFBhcmVudCgpLAotCQkJCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLlBMVUdJTl9FRElUT1JfREVTQ1JJUFRJT05fQUxMX0NPTlRFWFQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZWRpdG9yIHBhZ2UgY29udGVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJZm9ybS5zZXRUZXh0KEZPUk1fUFJFRklYICsgcGx1Z2luLmdldE5hbWUoKSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBHZW5lcmFsIHNlY3Rpb24uCi0JCWdlbmVyYWxTZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGZvcm0uZ2V0Qm9keSgpLAotCQkJCVNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVECi0JCQkJCQl8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQotCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuR0VORVJBTF9JTkZPX1NFQ1RJT05fTkFNRSk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCUF1dGhvcmluZ1VJVGV4dC5HRU5FUkFMX0lORk9fU0VDVElPTl9ERVNDLAotCQkJCW5ldyBTdHJpbmdbXSB7IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0TG93ZXIobWV0aG9kRWxlbWVudCkgfSkpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJZ2VuZXJhbENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxTZWN0aW9uKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0Q2xpZW50KGdlbmVyYWxDb21wb3NpdGUpOwotCi0JCS8vIG5hbWUKLQkJY3RybF9uYW1lID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuTkFNRV9URVhUKTsKLQotCQkvLyBicmllZiBkZXNjCi0JCWN0cmxfYnJpZWZfZGVzYyA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsMih0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhUKTsKLQotCQlpZiAodmVyc2lvblNlY3Rpb25PbikgewotCQkJY3JlYXRlVmVyc2lvblNlY3Rpb24odG9vbGtpdCk7Ci0JCQljcmVhdGVWZXJzaW9uU2VjdGlvbkNvbnRlbnQoKTsKLQkJfQotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGdlbmVyYWxDb21wb3NpdGUpOwotCi0JCS8vIHNldCBmb2N1cyBvbiB0aGUgbmFtZSBhdHRyaWJ1dGUKLQkJRGlzcGxheSBkaXNwbGF5ID0gZm9ybS5nZXRCb2R5KCkuZ2V0RGlzcGxheSgpOwotCQlpZiAoIShkaXNwbGF5ID09IG51bGwgfHwgZGlzcGxheS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVSZWZlcmVuY2VDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJLy8gUmVmIE1vZGVsIFNlY3Rpb24KLQkJcmVmTW9kZWxTZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGZvcm0uZ2V0Qm9keSgpLAotCQkJCVNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVECi0JCQkJCQl8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJVGFibGVXcmFwRGF0YSB0ZDEgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCXJlZk1vZGVsU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkMSk7Ci0JCXJlZk1vZGVsU2VjdGlvbgotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5SRUZFUkVOQ0VEX1BMVUdJTlNfU0VDVElPTl9OQU1FKTsKLQkJcmVmTW9kZWxTZWN0aW9uCi0JCQkJLnNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJVGV4dC5SRUZFUkVOQ0VEX1BMVUdJTlNfU0VDVElPTl9ERVNDKTsKLQkJcmVmTW9kZWxTZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlyZWZNb2RlbENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHJlZk1vZGVsU2VjdGlvbik7Ci0JCXJlZk1vZGVsQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZWZNb2RlbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJcmVmTW9kZWxTZWN0aW9uLnNldENsaWVudChyZWZNb2RlbENvbXBvc2l0ZSk7Ci0KLQkJVGFibGUgY3RybF90YWJsZSA9IHRvb2xraXQuY3JlYXRlVGFibGUocmVmTW9kZWxDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORwotCQkJCQl8IEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMTAwOwotCQkJY3RybF90YWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfcmVmTW9kZWwgPSBuZXcgQ2hlY2tib3hUYWJsZVZpZXdlcihjdHJsX3RhYmxlKTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIHBsdWdpbi5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JCWN0cmxfcmVmTW9kZWwuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQotCQlMYWJlbCBsX3JfYnJpZWZfZGVzYyA9IHRvb2xraXQuY3JlYXRlTGFiZWwocmVmTW9kZWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkJSSUVGX0RFU0NSSVBUSU9OX1RFWFQpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJbF9yX2JyaWVmX2Rlc2Muc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljdHJsX3JfYnJpZWZfZGVzYyA9IHRvb2xraXQuY3JlYXRlVGV4dChyZWZNb2RlbENvbXBvc2l0ZSwKLQkJCQkiIiwgU1dULk1VTFRJIHwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDgwOwotCQkJY3RybF9yX2JyaWVmX2Rlc2Muc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihyZWZNb2RlbENvbXBvc2l0ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENoZWNrYm94Rm9yQ3VycmVudEJhc2UoTGlzdCBjdXJyZW50QmFzZUxpc3QpIHsKLQkJY3RybF9yZWZNb2RlbC5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50QmFzZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZFBsdWdpbiBtb2RlbCA9IChNZXRob2RQbHVnaW4pIGN1cnJlbnRCYXNlTGlzdC5nZXQoaSk7Ci0JCQljdHJsX3JlZk1vZGVsLnNldENoZWNrZWQobW9kZWwsIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycwotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCU1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCi0JCWZvcm0uYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJLy8gQ2xlYXIgdGhlIG9sZCBpdGVtcyBhbmQgYWRkIHRoZSBuZXdseSBhbGxvd2FibGUgaXRlbXMuCi0JCQkJY3RybF9yZWZNb2RlbC5nZXRUYWJsZSgpLmNsZWFyQWxsKCk7Ci0JCQkJY3RybF9yZWZNb2RlbC5yZWZyZXNoKCk7Ci0KLQkJCQlMaXN0IGFsbG93YWJsZUxpc3QgPSBQbHVnaW5SZWZlcmVuY2VDaGVja2VyCi0JCQkJCQkuZ2V0QXBwbGljYWJsZUJhc2VQbHVnaW5zKHBsdWdpbik7Ci0JCQkJY3RybF9yZWZNb2RlbC5hZGQoYWxsb3dhYmxlTGlzdC50b0FycmF5KCkpOwotCi0JCQkJTGlzdCBjdXJyZW50QmFzZUxpc3QgPSBwbHVnaW4uZ2V0QmFzZXMoKTsKLQkJCQlzZXRDaGVja2JveEZvckN1cnJlbnRCYXNlKGN1cnJlbnRCYXNlTGlzdCk7Ci0KLQkJCQlpZiAoIXBsdWdpbi5nZXRVc2VyQ2hhbmdlYWJsZSgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCWVuYWJsZUNvbnRyb2xzKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQllbmFibGVDb250cm9scyh0cnVlKTsKLQkJCQl9Ci0JCQkJY29weXJpZ2h0X3ZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZpbmFsIE1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyID0gZWRpdG9yCi0JCQkJLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKHBsdWdpbik7Ci0KLQkJbmFtZU1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKHBsdWdpbiwgdHJ1ZSk7Ci0JCWN0cmxfbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihuYW1lTW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX25hbWUuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IHBsdWdpbi5nZXROYW1lKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoY3RybF9uYW1lLmdldFRleHQoKS5lcXVhbHMocGx1Z2luLmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIENoZWNrIGludmFsaWQgY2hhcmFjdGVycyBmaXJzdC4KLQkJCQlTdHJpbmcgbXNnID0gTGlicmFyeVV0aWwuY2hlY2tQbHVnaW5OYW1lKG51bGwsIGN0cmxfbmFtZQotCQkJCQkJLmdldFRleHQoKSk7Ci0JCQkJU3RyaW5nIHZhbGlkTmFtZSA9IFN0clV0aWwubWFrZVZhbGlkRmlsZU5hbWUoY3RybF9uYW1lCi0JCQkJCQkuZ2V0VGV4dCgpKTsKLQkJCQlpZiAobXNnID09IG51bGwpIHsKLQkJCQkJLy8gQ2hlY2sgZHVwbGljYXRlIHBsdWctaW4gbmFtZS4KLQkJCQkJbXNnID0gTGlicmFyeVV0aWwuY2hlY2tQbHVnaW5OYW1lKHBsdWdpbiwgdmFsaWROYW1lKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQkJCWlmICghdmFsaWROYW1lLmVxdWFscyhwbHVnaW4uZ2V0TmFtZSgpKSkgewotCQkJCQkJU2hlbGwgc2hlbGwgPSBnZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQkJCQkJCW1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMubWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWUsIChuZXcgT2JqZWN0W10geyBwbHVnaW4uZ2V0TmFtZSgpLCBjdHJsX25hbWUuZ2V0VGV4dCgpIH0pKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWVfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmICghTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybShzaGVsbCwgdGl0bGUsIG1zZykpIHsKLQkJCQkJCQljdHJsX25hbWUuc2V0VGV4dChwbHVnaW4uZ2V0TmFtZSgpKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0KLQkJCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQkJCQljdHJsX25hbWUuc2V0VGV4dCh2YWxpZE5hbWUpOwotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQlwbHVnaW4sIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIHZhbGlkTmFtZSwgLTEpOwotCi0JCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCWZvcm0uc2V0VGV4dChGT1JNX1BSRUZJWCArIHBsdWdpbi5nZXROYW1lKCkpOwotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCi0JCQkJCQkvLyBhZGp1c3QgcGx1Z2luIGxvY2F0aW9uIGFuZCBzYXZlIHRoZSBlZGl0b3IKLQkJCQkJCS8vCi0JCQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRTaXRlKCkuZ2V0U2hlbGwoKQotCQkJCQkJCQkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQkJCQkJCQkJZWRpdG9yLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IGVkaXRvcgotCQkJCQkJCQkJCS5nZXRQZXJzaXN0ZXIoKTsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCXBlcnNpc3RlcgotCQkJCQkJCQkJCQkuYWRqdXN0TG9jYXRpb24ocGx1Z2luLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCQkJLmxvZ0Vycm9yKGUpOwotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkJLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQkJCQkJCQlWaWV3SGVscGVyCi0JCQkJCQkJCQkJCQkucmVsb2FkQ3VycmVudExpYmFyeU9uUm9sbGJhY2tFcnJvcihnZXRTaXRlKCkKLQkJCQkJCQkJCQkJCQkJLmdldFNoZWxsKCkpOwotCQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkJCS5kaXNwbGF5V2FybmluZygKLQkJCQkJCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKQotCQkJCQkJCQkJCQkJCQkJLmdldFRleHQoKSwKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY2Fubm90UmVuYW1lUGx1Z2luRm9sZGVyCi0JCQkJCQkJCQkJCQkJLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfbmFtZS5zZXRUZXh0KHBsdWdpbi5nZXROYW1lKCkpOwotCQkJCQlTaGVsbCBzaGVsbCA9IGdldFNpdGUoKS5nZXRTaGVsbCgpOwotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCXNoZWxsLmdldFRleHQoKSwgbXNnKTsKLQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCWN0cmxfbmFtZS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQkJCQljdHJsX25hbWUuc2VsZWN0QWxsKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWN0cmxfbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX2JyaWVmX2Rlc2MuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2JyaWVmX2Rlc2MuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IHBsdWdpbi5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGN0cmxfYnJpZWZfZGVzYy5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJcGx1Z2luLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN0YXR1cykgewotCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQobmV3Q29udGVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfcmVmTW9kZWwKLQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZExpc3QgPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJTWV0aG9kUGx1Z2luIHNlbGVjdGVkT2JqID0gKE1ldGhvZFBsdWdpbikgc2VsZWN0ZWRMaXN0Ci0JCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJCWlmIChzZWxlY3RlZE9iaiA9PSBudWxsKQotCQkJCQkJCXJldHVybjsKLQkJCQkJCWN0cmxfcl9icmllZl9kZXNjLnNldFRleHQoc2VsZWN0ZWRPYmoKLQkJCQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCi0JCWN0cmxfcmVmTW9kZWwuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU9iamVjdCBvYmogPSBldmVudC5nZXRFbGVtZW50KCk7Ci0KLQkJCQljdHJsX3JfYnJpZWZfZGVzYy5zZXRUZXh0KCgoTWV0aG9kUGx1Z2luKSBvYmopCi0JCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQotCQkJCWlmIChUbmdVdGlsLmlzTG9ja2VkKHBsdWdpbikpIHsKLQkJCQkJY3RybF9yZWZNb2RlbC5zZXRDaGVja2VkKG9iaiwgIWV2ZW50LmdldENoZWNrZWQoKSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlpZiAoZXZlbnQuZ2V0Q2hlY2tlZCgpKSB7Ci0JCQkJCS8vIFRPRE86IENoYW5nZSB0aGlzIHRvIGJlIG5vdCB1bi1kb2FibGUgZHVlIHRvIHRoZSBjaXJjdWxhcgotCQkJCQkvLyBkZXBlbmRlbmN5IGNoZWNrLgotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCBwbHVnaW4sCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCksCi0JCQkJCQkJKE1ldGhvZFBsdWdpbikgb2JqLCAtMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZmluYWwgTWV0aG9kUGx1Z2luIGJhc2UgPSAoTWV0aG9kUGx1Z2luKSBvYmo7Ci0KLQkJCQkJLy8gQ2hlY2tzIGlmIHRoZSBwbHVnaW4gaGFzIGFueSByZWZlcmVuY2UgdGhhdCBpcyBhIGVsZW1lbnQKLQkJCQkJLy8gb2YgdGhlIHJlbW92ZWQgYmFzZQotCQkJCQkvLwotCQkJCQlpZiAoVW1hVXRpbC5oYXNSZWZlcmVuY2UocGx1Z2luLCBiYXNlKSkgewotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUmVtb3ZlUmVmQ29uZmlybV9tZXNzYWdlLCBwbHVnaW4uZ2V0TmFtZSgpKTsKLQkJCQkJCVNoZWxsIHNoZWxsID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCQkJCQlpZiAoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKHNoZWxsLmdldFRleHQoKSwgbWVzc2FnZSkpIHsKLQkJCQkJCQkvLyByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdGhhdCBhcmUgZWxlbWVudCBvZiB0aGUKLQkJCQkJCQkvLyByZW1vdmVkIGJhc2UKLQkJCQkJCQkvLwotCQkJCQkJCWFjdGlvbk1nci5leGVjdXRlKG5ldyBSZW1vdmVSZWZlcmVuY2VzQ29tbWFuZCgKLQkJCQkJCQkJCXBsdWdpbiwgYmFzZSkpOwotCQkJCQkJCWN0cmxfcmVmTW9kZWwuc2V0Q2hlY2tlZChiYXNlLCBmYWxzZSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIHJlc3RvcmUgdGhlIGNoZWNrZWQgc3RhdGUgb2YgdGhlCi0JCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQljdHJsX3JlZk1vZGVsLnNldENoZWNrZWQoYmFzZSwgdHJ1ZSk7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCX0pOwotCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy8gY2hhbmdlIHRoaXMgdG8gYmUgbm90IHVuLWRvYWJsZSBkdWUgdG8gdGhlIGNpcmN1bGFyCi0JCQkJCS8vIGRlcGVuZGVuY3kgY2hlY2sKLQkJCQkJLy8gcGx1Z2luLmdldEJhc2VzKCkucmVtb3ZlKG9iaik7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHBsdWdpbiwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fQmFzZXMoKSwKLQkJCQkJCQkoTWV0aG9kUGx1Z2luKSBvYmosIC0xKTsKLQkJCQl9Ci0KLQkJCQkvLyBkb3VibGUgY2hlY2sgY2lyY3VsYXIgZGVwZW5kZW5jeSwgbm90IG5lY2Vzc2FyeSBoZXJlCi0JCQkJUGx1Z2luUmVmZXJlbmNlQ2hlY2tlci5oYXNDaXJjdWxhckNvbmZsaWN0V2l0aFBsdWdpbihwbHVnaW4pOwotCi0JCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJfQotCi0JCX0pOwotCi0JCWlmICh2ZXJzaW9uU2VjdGlvbk9uKSB7Ci0JCQlhZGRWZXJzaW9uU2VjdGlvbkxpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlQ29udHJvbHMoYm9vbGVhbiBlZGl0YWJsZSkgewotCQljdHJsX25hbWUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2F1dGhvcnMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2JyaWVmX2Rlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX3ZlcnNpb24uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2NoYW5nZV9kZXNjLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY29weXJpZ2h0X2J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY29weXJpZ2h0X2J1dHRvbl9kZXNlbGVjdC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF9yX2JyaWVmX2Rlc2Muc2V0RWRpdGFibGUoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIExvYWRzIGluaXRpYWwgZGF0YSBmcm9tIG1vZGVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotCQlTdHJpbmcgbmFtZSA9IHBsdWdpbi5nZXROYW1lKCk7Ci0JCVN0cmluZyBkZXNjID0gcGx1Z2luLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJY3RybF9uYW1lLnNldFRleHQobmFtZSA9PSBudWxsID8gIiIgOiBuYW1lKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChkZXNjID09IG51bGwgPyAiIiA6IGRlc2MpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKHZlcnNpb25TZWN0aW9uT24pIHsKLQkJCWxvYWRWZXJzaW9uU2VjdGlvbkRhdGEoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIHRvIHNlZSB3aGV0aGVyIHZlcnNpb24gc2VjdGlvbiBpcyB2aXNpYmxlIG9yIG5vdAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmVyc2lvblNlY3Rpb25Pbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb25TZWN0aW9uT24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uU2VjdGlvbk9uOwotCX0KLQotCS8qKgotCSAqIFNldCB2ZXJzaW9uIHNlY3Rpb24gdG8gYmUgdmlzaWJsZSBvciBub3QKLQkgKiBAcGFyYW0gdmVyc2lvblNlY3Rpb25PbgotCSAqICAgICAgICAgICAgVGhlIHZlcnNpb25TZWN0aW9uT24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb25TZWN0aW9uT24oYm9vbGVhbiB2ZXJzaW9uU2VjdGlvbk9uKSB7Ci0JCXRoaXMudmVyc2lvblNlY3Rpb25PbiA9IHZlcnNpb25TZWN0aW9uT247Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZlcnNpb25TZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJdmVyc2lvblNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksCi0JCQkJU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQKLQkJCQkJCXwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQl2ZXJzaW9uU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJdmVyc2lvblNlY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuVkVSU0lPTl9JTkZPX1NFQ1RJT05fTkFNRSk7Ci0JCXZlcnNpb25TZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCUF1dGhvcmluZ1VJVGV4dC5WRVJTSU9OX0lORk9fU0VDVElPTl9ERVNDLAotCQkJCW5ldyBTdHJpbmdbXSB7IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0TG93ZXIobWV0aG9kRWxlbWVudCkgfSkpOwotCQl2ZXJzaW9uU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJdmVyc2lvbkNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHZlcnNpb25TZWN0aW9uKTsKLQkJdmVyc2lvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdmVyc2lvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoNSwgZmFsc2UpKTsKLQkJdmVyc2lvblNlY3Rpb24uc2V0Q2xpZW50KHZlcnNpb25Db21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgVmVyc2lvbiBzZWN0aW9uIGNvbnRlbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZlcnNpb25TZWN0aW9uQ29udGVudCgpIHsKLQkJU3RyaW5nIGZpbGxUZXh0ID0gKHBsdWdpbi5nZXRWZXJzaW9uKCkgPT0gbnVsbCA/ICIiIDogcGx1Z2luLmdldFZlcnNpb24oKSk7Ci0JCWN0cmxfdmVyc2lvbiA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsNCh0b29sa2l0LCB2ZXJzaW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5WRVJTSU9OX1RFWFQsIFNXVC5ERUZBVUxULCBTV1QuU0lOR0xFLCBmaWxsVGV4dCk7Ci0JCQotCQlmaWxsVGV4dCA9IHBsdWdpbi5nZXRDaGFuZ2VEYXRlKCkgPT0gbnVsbCA/ICIiIDogLy8kTk9OLU5MUy0xJAotCQkJRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoRGF0ZUZvcm1hdC5GVUxMKS5mb3JtYXQoCi0JCQkJCXBsdWdpbi5nZXRDaGFuZ2VEYXRlKCkpOwotCi0JCWN0cmxfY2hhbmdlX2RhdGUgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDQodG9vbGtpdCwgdmVyc2lvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQ0hBTkdFX0RBVEVfVEVYVCwgU1dULkRFRkFVTFQsIFNXVC5TSU5HTEUsIGZpbGxUZXh0KTsKLQkJY3RybF9jaGFuZ2VfZGF0ZS5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQotCQljdHJsX2NoYW5nZV9kZXNjID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWw1KHRvb2xraXQsIHZlcnNpb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkNIQU5HRV9ERVNDUklQVElPTl9URVhUKTsKLQotCQlDb21wb3NpdGUgdmlld0hpc3RvcnlCdXR0b25QYW5lID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsCi0JCQkJdmVyc2lvbkNvbXBvc2l0ZSwgIEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5ELCAxLCAxLCAxKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDsKLQkJCXZpZXdIaXN0b3J5QnV0dG9uUGFuZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQl2aWV3X2hpc3RvcnlfYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24odmlld0hpc3RvcnlCdXR0b25QYW5lLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5WSUVXX0hJU1RPUllfQlVUVE9OX1RFWFQsIFNXVC5QVVNIKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMTAwOwotCQkJdmlld19oaXN0b3J5X2J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQkKLQkJY3RybF9hdXRob3JzID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWw1KHRvb2xraXQsIHZlcnNpb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkFVVEhPUlNfVEVYVCwgNDAsIFNXVC5NVUxUSSk7Ci0JCQotCQlsYWJlbF9jb3B5cmlnaHQgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCB2ZXJzaW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5DT1BZUklHSFRfVEVYVCwgMik7Ci0JCWN0cmxfY29weXJpZ2h0ID0gY3JlYXRlVGFibGUodG9vbGtpdCwgdmVyc2lvbkNvbXBvc2l0ZSwgU1dULlNJTkdMRQotCQkJCXwgU1dULlJFQURfT05MWSwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuQkVHSU5OSU5HIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCwKLQkJCQk1LCA0MDAsIDEsIDIpOwotCQljb3B5cmlnaHRfdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfY29weXJpZ2h0KTsKLQkJaW5pdENvbnRlbnRQcm92aWRlckNvcHlyaWdodCgpOwotCQljb3B5cmlnaHRfdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlckJhc2UpOwotCQljb3B5cmlnaHRfdmlld2VyLnNldElucHV0KHBsdWdpbik7Ci0JCQotCQkKLQkJQ29tcG9zaXRlIGJ1dHRvbnBhbmUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgdmVyc2lvbkNvbXBvc2l0ZSwKLQkJCQlHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCwgMSwgMSwgMSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJCWJ1dHRvbnBhbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY29weXJpZ2h0X2J1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbnBhbmUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlNFTEVDVF9CVVRUT05fVEVYVCwgU1dULlNJTVBMRSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDEwMDsKLQkJCWNvcHlyaWdodF9idXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY29weXJpZ2h0X2J1dHRvbl9kZXNlbGVjdCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbnBhbmUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRFU0VMRUNUX0JVVFRPTl9URVhULCBTV1QuU0lNUExFKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMTAwOwotCQkJY29weXJpZ2h0X2J1dHRvbl9kZXNlbGVjdC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQkJCi0KLQkJY3RybF9jaGFuZ2VhYmxlID0gdG9vbGtpdAotCQkJCS5jcmVhdGVCdXR0b24oCi0JCQkJCQl2ZXJzaW9uQ29tcG9zaXRlLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5MYWJlbCwgU1dULkNIRUNLKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIENyZWF0ZSB0aGUgZXhwYW5kZWQgY29tcG9zaXRlLgotCQlleHBhbmRlZFZlcnNpb25Db21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZSh2ZXJzaW9uU2VjdGlvbiwKLQkJCQlTV1QuTk9ORSk7Ci0JCWV4cGFuZGVkVmVyc2lvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZXhwYW5kZWRWZXJzaW9uQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlleHBhbmRlZFZlcnNpb25Db21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJLy8gQWRkIHRoZSBleHBhbmQvY29sbGFwc2UgaHlwZXJsaW5rIGltYWdlLgotCQlleHBhbmRWZXJzaW9uTGluayA9IHRvb2xraXQuY3JlYXRlSW1hZ2VIeXBlcmxpbmsoCi0JCQkJZXhwYW5kZWRWZXJzaW9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWV4cGFuZFZlcnNpb25MaW5rLnNldEltYWdlKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19FWFBBTkRFRCk7Ci0JCWV4cGFuZFZlcnNpb25MaW5rLnNldFVuZGVybGluZWQoZmFsc2UpOwotCQlleHBhbmRWZXJzaW9uTGluay5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5jbG9zZVJURSk7IC8vJE5PTi1OTFMtMSQKLQkJZXhwYW5kVmVyc2lvbkxpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQl0b2dnbGUoZSwgVkVSU0lPTl9TRUNUSU9OX0lEKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQWRkIHRoZSBleHBhbmQvY29sbGFwc2UgaHlwZXJsaW5rIHRleHQuCi0JCWV4cGFuZFZlcnNpb25MYWJlbCA9IGNyZWF0ZURlY29yYXRlZExhYmVsKHRvb2xraXQsIGV4cGFuZGVkVmVyc2lvbkNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGV4cGFuZGVkVmVyc2lvbkNvbXBvc2l0ZSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHZlcnNpb25Db21wb3NpdGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyQ29weXJpZ2h0KCkgewotCQljb3B5cmlnaHRDb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKHBsdWdpbi5nZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCWxpc3QuYWRkKHBsdWdpbi5nZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSk7Ci0JCQkJfQotCQkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJY29weXJpZ2h0X3ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29weXJpZ2h0Q29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWZXJzaW9uU2VjdGlvbkxpc3RlbmVycygpIHsKLQotCQlmaW5hbCBNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQotCQltb2RlbE1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKHBsdWdpbik7Ci0JCWNvbnRlbnRNb2RpZnlMaXN0ZW5lciA9IGVkaXRvci5jcmVhdGVNb2RpZnlMaXN0ZW5lcihwbHVnaW4pOwotCi0JCWN0cmxfdmVyc2lvbi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3ZlcnNpb24uYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X1ZlcnNpb24oKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IHBsdWdpbi5nZXRWZXJzaW9uKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IFN0clV0aWwKLQkJCQkJCS5nZXRQbGFpblRleHQoY3RybF92ZXJzaW9uLmdldFRleHQoKSk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBwbHVnaW4sCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2F1dGhvcnMuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9hdXRob3JzLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBwbHVnaW4uZ2V0QXV0aG9ycygpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJZS53aWRnZXQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBTdHJVdGlsCi0JCQkJCQkuZ2V0UGxhaW5UZXh0KGN0cmxfYXV0aG9ycy5nZXRUZXh0KCkpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgcGx1Z2luLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfQXV0aG9ycygpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY29weXJpZ2h0X2J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBDb250ZW50RmlsdGVyKCkgewotCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCUxpc3QgYWxyZWFkeUV4c3RpbmcgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGN0cmxfY29weXJpZ2h0LmdldEl0ZW1Db3VudCgpID4gMCkgewotCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IGN0cmxfY29weXJpZ2h0LmdldEl0ZW1zKClbMF07Ci0JCQkJCWlmIChpdGVtLmdldERhdGEoKSAhPSBudWxsKQotCQkJCQkJYWxyZWFkeUV4c3RpbmcuYWRkKGl0ZW0uZ2V0RGF0YSgpKTsKLQkJCQl9Ci0JCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCQlmaWx0ZXIsIHBsdWdpbiwgRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTLAotCQkJCQkJYWxyZWFkeUV4c3RpbmcpOwotCQkJCWZkLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFMpOwotCQkJCWZkLm9wZW4oKTsKLQkJCQlmZC5nZXRTZWxlY3RlZEl0ZW1zKCk7Ci0JCQkJaWYgKGZkLmdldFNlbGVjdGVkSXRlbXMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCXBsdWdpbiwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldE1ldGhvZFVuaXRfQ29weXJpZ2h0U3RhdGVtZW50KCksCi0JCQkJCQkJKFN1cHBvcnRpbmdNYXRlcmlhbCkgZmQuZ2V0U2VsZWN0ZWRJdGVtcygpLmdldCgwKSwKLQkJCQkJCQktMSk7Ci0JCQkJfQotCQkJCWNvcHlyaWdodF92aWV3ZXIucmVmcmVzaCgpOwotCi0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfY2hhbmdlX2Rlc2MuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9jaGFuZ2VfZGVzYy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IHBsdWdpbi5nZXRDaGFuZ2VEZXNjcmlwdGlvbigpOwotCQkJCWNoYXIgZGVsaW1pdGVyID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ2hhbmdlSGlzdG9yeURpYWxvZ19kZWxpbWl0ZXIuY2hhckF0KDApOyAvLyROT04tTkxTLTEkCi0KLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY3RybF9jaGFuZ2VfZGVzYy5nZXRUZXh0KCk7Ci0KLQkJCQluZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKGRlbGltaXRlciwgJyAnKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKGxhc3RDaGFuZ2VIaXN0b3J5KSkgewotCQkJCQlsYXN0Q2hhbmdlSGlzdG9yeSA9IG5ld0NvbnRlbnQ7Ci0JCQkJCWlmICgob2xkQ29udGVudCAhPSBudWxsKQotCQkJCQkJCSYmICghKFN0clV0aWwuaXNCbGFuayhvbGRDb250ZW50KSkpKSB7Ci0JCQkJCQluZXdDb250ZW50ID0gb2xkQ29udGVudCArIGRlbGltaXRlciArIG5ld0NvbnRlbnQ7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCi0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHBsdWdpbiwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0KLQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCX0KLQotCQkJfQotCi0JCX0pOwotCi0JCXZpZXdfaGlzdG9yeV9idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0KLQkJCQlDaGFuZ2VIaXN0b3J5RGlhbG9nIGRsZyA9IG5ldyBDaGFuZ2VIaXN0b3J5RGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQkJcGx1Z2luKTsKLQkJCQlkbGcub3BlbigpOwotCQkJfQotCQl9KTsKLQotCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWFjdGlvbk1ncgotCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgcGx1Z2luLAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpLAotCQkJCQkJCQludWxsLCAtMSk7Ci0JCQkJY29weXJpZ2h0X3ZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfY2hhbmdlYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQotCQkJCQotCQkJCUlTdGF0dXMgc3RhdHVzID0gVG5nVXRpbC5jaGVja0VkaXQocGx1Z2luLCBnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCi0JCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luX21lc3NhZ2UsCi0JCQkJCQkJCQlwbHVnaW4uZ2V0TmFtZSgpKTsKLQkJCQkJU2hlbGwgc2hlbGwgPSBnZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQkJCQkJaWYgKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKHNoZWxsLmdldFRleHQoKSwgbWVzc2FnZSkpIHsKLQkJCQkJCS8vIGNsb3NlIGVkaXRvcnMgb24gYW55IGNoYW5nZSBpbiBjdHJsX2NoYW5nZWFibGUKLQkJCQkJCS8vIGlmIChjdHJsX2NoYW5nZWFibGUuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJCWdldERpcnR5RWRpdG9ycyhudWxsKTsKLQkJCQkJCWJvb2xlYW4gcmV0ID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJcGx1Z2luLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKSwKLQkJCQkJCQkJbmV3IEJvb2xlYW4oIWN0cmxfY2hhbmdlYWJsZS5nZXRTZWxlY3Rpb24oKSksCi0JCQkJCQkJCS0xKTsKLQkJCQkJCS8vIGluIGNhc2Ugb2YgcmVhZG9ubHkgZmlsZSwgcm9sbCBiYWNrIGNoYW5nZXMuCi0JCQkJCQlpZiAoIXJldCkgewotCQkJCQkJCWN0cmxfY2hhbmdlYWJsZS5zZXRTZWxlY3Rpb24oIWN0cmxfY2hhbmdlYWJsZQotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIH0KLQkJCQkJCWVuYWJsZUNvbnRyb2xzKCFjdHJsX2NoYW5nZWFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gYWN0aW9uTWdyLnVuZG8oKTsKLQkJCQkJCWN0cmxfY2hhbmdlYWJsZS5zZXRTZWxlY3Rpb24oIWN0cmxfY2hhbmdlYWJsZQotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQkJZW5hYmxlQ29udHJvbHMoIWN0cmxfY2hhbmdlYWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCQkvLyByZXR1cm47Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXREaWFsb2dfdGl0bGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdERpYWxvZ19tc2dDYW5ub3RFZGl0LAotCQkJCQkJCXN0YXR1cyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJY29weXJpZ2h0X3ZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCi0JCQkJLy8gcmVmcmVzaCBlZGl0b3IgdGl0bGUgaW1hZ2UuIAotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcilnZXRFZGl0b3IoKSkucmVmcmVzaFRpdGxlSW1hZ2UoKTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBSZXR1cm4gYSBsaXN0IG9mIGRpcnR5IGVkaXRvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBQbHVnaW4uCi0JCQkgKiBlZGl0b3JzIGZyb20gTWV0aG9kRWxlbWVudEVkaXRvci4KLQkJCSAqIAotCQkJICogQHJldHVybiBMaXN0IHRoZSBkaXJ0eSBlZGl0b3JzCi0JCQkgKi8KLQkJCUxpc3QgZ2V0RGlydHlFZGl0b3JzKE1ldGhvZFBsdWdpbiBtZXRob2RwbHVnaW4pIHsKLQkJCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQkJCUFycmF5TGlzdCBjbG9zZUVkaXRvclJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCQkJCQllbGVtZW50ID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIHsKLQkJCQkJCQllbGVtZW50ID0gKChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCQkJCQkJLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChlbGVtZW50ICE9IG51bGwKLQkJCQkJCQkJJiYgKGVsZW1lbnQuZUNvbnRhaW5lcigpID09IG51bGwgfHwgVW1hVXRpbAotCQkJCQkJCQkJCS5pc0NvbnRhaW5lZEJ5KGVsZW1lbnQsIHBsdWdpbikpKSB7Ci0JCQkJCQkJaWYgKCFlbGVtZW50LmVxdWFscyhwbHVnaW4pKQotCQkJCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaW50IHNpemUgPSBjbG9zZUVkaXRvclJlZnMuc2l6ZSgpOwotCQkJCUlFZGl0b3JSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbmV3IElFZGl0b3JSZWZlcmVuY2Vbc2l6ZV07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJcmVmZXJlbmNlc1tpXSA9IChJRWRpdG9yUmVmZXJlbmNlKSBjbG9zZUVkaXRvclJlZnMuZ2V0KGkpOwotCQkJCX0KLQkJCQl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9ycyhyZWZlcmVuY2VzLCB0cnVlKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoKLQkgKiB1cGRhdGUgdGhlIGNoYW5nZSBkYXRlIGlmIGFueSBhdHRyaWJ1dGUgaXMgbW9kaWZpZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2hhbmdlRGF0ZSgpIHsKLQotCQlEYXRlIGNoYW5nZURhdGUgPSBwbHVnaW4uZ2V0Q2hhbmdlRGF0ZSgpOwotCQlEYXRlRm9ybWF0IGRmID0gRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoRGF0ZUZvcm1hdC5GVUxMKTsKLQotCQlTdHJpbmcgb2xkQ29udGVudCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChjaGFuZ2VEYXRlICE9IG51bGwpIHsKLQkJCW9sZENvbnRlbnQgPSBkZi5mb3JtYXQoY2hhbmdlRGF0ZSk7Ci0JCX0KLQotCQlEYXRlIGN1cnJlbnREYXRlID0gbmV3IERhdGUoKTsKLQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBkZi5mb3JtYXQoY3VycmVudERhdGUpOwotCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBwbHVnaW4sIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKSwgY3VycmVudERhdGUsIC0xKTsKLQkJCWN0cmxfY2hhbmdlX2RhdGUuc2V0VGV4dChuZXdDb250ZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRWZXJzaW9uU2VjdGlvbkRhdGEoKSB7Ci0JCWN0cmxfdmVyc2lvbgotCQkJCS5zZXRUZXh0KHBsdWdpbi5nZXRWZXJzaW9uKCkgPT0gbnVsbCA/ICIiIDogcGx1Z2luLmdldFZlcnNpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9hdXRob3JzCi0JCQkJLnNldFRleHQocGx1Z2luLmdldEF1dGhvcnMoKSA9PSBudWxsID8gIiIgOiBwbHVnaW4uZ2V0QXV0aG9ycygpKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2NoYW5nZV9kZXNjLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfY2hhbmdlX2RhdGUuc2V0VGV4dChwbHVnaW4uZ2V0Q2hhbmdlRGF0ZSgpID09IG51bGwgPyAiIiA6IC8vJE5PTi1OTFMtMSQKLQkJCQlEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZShEYXRlRm9ybWF0LkZVTEwpLmZvcm1hdCgKLQkJCQkJCXBsdWdpbi5nZXRDaGFuZ2VEYXRlKCkpKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2NoYW5nZWFibGUKLQkJCQkuc2V0U2VsZWN0aW9uKCFwbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogVG9nZ2xlIERlc2NyaXB0aW9uIGNvbnRyb2wgdG8gZXhwYW5kIGFuZCBjb250cm9sIHN0YXRlCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdG9nZ2xlKEh5cGVybGlua0V2ZW50IGUsIGludCBpZCkgewotCQkvLyBUT0RPOiBXZSBzaG91bGQgY29tYmluZSB0aGVzZSBtZXRob2RzIGludG8gb25lLiBPbmUgd2F5IHRvIGRvIGl0LAotCQkvLyBkaXNwb2luZwotCQkvLyBjdHJsX2V4cGFuZGVkIGV2ZXJ5IHRpbWUgaXQgY29sbGFwc2VzIGFuZCBjcmVhdGluZyBpdCB3aGVuIHdlIGV4cGFuZC4KLQkJLy8gQXQgcHJlc2VudCwgdGhlcmUgaXMgbm8gbWV0aG9kIHRvIGRpc3Bvc2UKLQkJaWYgKGlkID09IEdFTkVSQUxfU0VDVElPTl9JRCkgewotCQkJdG9nZ2xlKGUpOwotCQl9Ci0JCWlmIChpZCA9PSBWRVJTSU9OX1NFQ1RJT05fSUQpIHsKLQkJCXRvZ2dsZVZlcnNpb25TZWN0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRvZ2dsZVZlcnNpb25TZWN0aW9uKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJaWYgKGN0cmxfdmVyc2lvbl9leHBhbmRlZCA9PSBudWxsKSB7Ci0JCQljdHJsX3ZlcnNpb25fZXhwYW5kZWQgPSBjcmVhdGVSaWNoVGV4dEVkaXRvcih0b29sa2l0LAotCQkJCQlleHBhbmRlZFZlcnNpb25Db21wb3NpdGUsIFNXVC5NVUxUSSB8IFNXVC5XUkFQCi0JCQkJCQkJfCBTV1QuVl9TQ1JPTEwsIEdyaWREYXRhLkZJTExfQk9USCwgZ2V0UmljaFRleHRFZGl0b3JIZWlnaHQoKSwgZ2V0UmljaFRleHRFZGl0b3JXaWR0aCgpLCAyLAotCQkJCQkJCWV4cGFuZFZlcnNpb25MYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJCWN0cmxfdmVyc2lvbl9leHBhbmRlZC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQl9Ci0KLQkJaWYgKGRlc2NFeHBhbmRGbGFnKSB7Ci0JCQl2ZXJzaW9uQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlleHBhbmRlZFZlcnNpb25Db21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQl2ZXJzaW9uU2VjdGlvbi5zZXRDbGllbnQodmVyc2lvbkNvbXBvc2l0ZSk7Ci0JCQlyZWZNb2RlbFNlY3Rpb24uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JCQlnZW5lcmFsU2VjdGlvbi5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IGdldEFjdGl2ZVJpY2hUZXh0Q29udHJvbCgpOwotCQkJcmljaFRleHQuc2V0VGV4dChjdHJsX3ZlcnNpb25fZXhwYW5kZWQuZ2V0VGV4dCgpKTsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHJpY2hUZXh0LmdldExpc3RlbmVycygpOyBpLmhhc05leHQoKTspIHsKLQkJCQlSaWNoVGV4dExpc3RlbmVyIGxpc3RlbmVyID0gKFJpY2hUZXh0TGlzdGVuZXIpIGkubmV4dCgpOwotCQkJCWN0cmxfdmVyc2lvbl9leHBhbmRlZC5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwKLQkJCQkJCWxpc3RlbmVyLmdldExpc3RlbmVyKCkpOwotCQkJfQotCQkJaWYgKGN0cmxfdmVyc2lvbl9leHBhbmRlZC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCS5zYXZlTW9kaWZpZWRSaWNoVGV4dChjdHJsX3ZlcnNpb25fZXhwYW5kZWQpOwotCQkJfQotCQkJcmljaFRleHQuc2V0Rm9jdXMoKTsKLQkJfSBlbHNlIHsKLQkJCXZlcnNpb25Db21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlleHBhbmRlZFZlcnNpb25Db21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCXZlcnNpb25TZWN0aW9uLnNldENsaWVudChleHBhbmRlZFZlcnNpb25Db21wb3NpdGUpOwotCQkJcmVmTW9kZWxTZWN0aW9uLnNldEV4cGFuZGVkKGZhbHNlKTsKLQkJCWdlbmVyYWxTZWN0aW9uLnNldEV4cGFuZGVkKGZhbHNlKTsKLQkJCSgoTGFiZWwpZXhwYW5kVmVyc2lvbkxhYmVsLmdldENvbnRyb2woKSkKLQkJCQkJLnNldFRleHQoKFN0cmluZykgKChJbWFnZUh5cGVybGluaykgZS5nZXRTb3VyY2UoKSkKLQkJCQkJCQkuZ2V0RGF0YSgiVGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQgICAgCQkKLQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IChJTWV0aG9kUmljaFRleHQpIGUuZ2V0SHJlZigpOwotCQkJY3RybF92ZXJzaW9uX2V4cGFuZGVkLnNldFRleHQocmljaFRleHQuZ2V0VGV4dCgpKTsKLQkJCWN0cmxfdmVyc2lvbl9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChyaWNoVGV4dC5nZXRNb2RhbE9iamVjdCgpKTsKLQkJCWN0cmxfdmVyc2lvbl9leHBhbmRlZC5zZXRNb2RhbE9iamVjdEZlYXR1cmUocmljaFRleHQKLQkJCQkJLmdldE1vZGFsT2JqZWN0RmVhdHVyZSgpKTsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHJpY2hUZXh0LmdldExpc3RlbmVycygpOyBpLmhhc05leHQoKTspIHsKLQkJCQlSaWNoVGV4dExpc3RlbmVyIGxpc3RlbmVyID0gKFJpY2hUZXh0TGlzdGVuZXIpIGkubmV4dCgpOwotCQkJCWN0cmxfdmVyc2lvbl9leHBhbmRlZC5hZGRMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwKLQkJCQkJCWxpc3RlbmVyLmdldExpc3RlbmVyKCkpOwotCQkJfQotCQkJY3RybF92ZXJzaW9uX2V4cGFuZGVkLnNldEZvY3VzKCk7Ci0JCQlzZXRBY3RpdmVSaWNoVGV4dENvbnRyb2wocmljaFRleHQpOwotCQl9Ci0KLQkJdmVyc2lvblNlY3Rpb24ubGF5b3V0KHRydWUpOwotCQlkZXNjRXhwYW5kRmxhZyA9ICFkZXNjRXhwYW5kRmxhZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYWN0aXZlIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFjdGl2ZVJpY2hUZXh0Q29udHJvbChJTWV0aG9kUmljaFRleHQgY3RybCkgewotCQlhY3RpdmVDb250cm9sID0gY3RybDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgQWN0aXZlIFJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGdldEFjdGl2ZVJpY2hUZXh0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGFjdGl2ZUNvbnRyb2w7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFVzZXJDaGFuZ2VhYmxlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTWV0aG9kUGx1Z2luLmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJc2V0VXNlckNoYW5nZWFibGUoYi5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXNlckNoYW5nZWFibGUoYm9vbGVhbiB1c2VyQ2hhbmdlYWJsZSkgewotCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCQlyZXR1cm47Ci0JCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJcGx1Z2luLnNldFVzZXJDaGFuZ2VhYmxlKEJvb2xlYW4udmFsdWVPZih1c2VyQ2hhbmdlYWJsZSkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXBsdWdpbi5lQWRhcHRlcnMoKS5yZW1vdmUodXNlckNoYW5nZWFibGVBZGFwdGVyKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5JUmVmcmVzaGFibGUjcmVmcmVzaE5hbWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoTmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAobmV3TmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoKGN0cmxfbmFtZSAhPSBudWxsKSAmJiAhKGN0cmxfbmFtZS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQkJY3RybF9uYW1lLnJlbW92ZU1vZGlmeUxpc3RlbmVyKG5hbWVNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJY3RybF9uYW1lLnNldFRleHQobmV3TmFtZSk7Ci0JCQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5hbWVNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJZm9ybS5zZXRUZXh0KEZPUk1fUFJFRklYICsgcGx1Z2luLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJhY3RpY2VEZXNjcmlwdGlvblBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9QcmFjdGljZURlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2N2ViMDVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9QcmFjdGljZURlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgaW4gYSBQcmFjdGljZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmFjdGljZURlc2NyaXB0aW9uUGFnZSBleHRlbmRzIEd1aWRhbmNlRGVzY3JpcHRpb25QYWdlIHsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfYWRkaXRpb25hbF9pbmZvLCBjdHJsX3Byb2JsZW0sCi0JCQljdHJsX2JhY2tncm91bmQ7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX2dvYWxzLCBjdHJsX2FwcGxpY2F0aW9uLCBjdHJsX2xldmVsc19hZG9wdGlvbjsKLQotCXByaXZhdGUgUHJhY3RpY2UgZ3VpZGFuY2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcmFjdGljZURlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWd1aWRhbmNlID0gKFByYWN0aWNlKSBjb250ZW50RWxlbWVudDsKLQkJc2V0Q29udGVudEZpZWxkSGVpZ2h0KDIwMCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlRGVzY3JpcHRpb25QYWdlI2NyZWF0ZUVkaXRvckNvbnRlbnQob3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdG9yQ29udGVudCh0b29sa2l0KTsKLQotCQljdHJsX2FkZGl0aW9uYWxfaW5mbyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkFERElUSU9OQUxfSU5GT19URVhULCA0MCwgNDAwLAotCQkJCURFVEFJTF9TRUNUSU9OX0lEKTsKLQkJY3RybF9nb2FscyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkdPQUxTX1RFWFQsIDQwLCA0MDAsCi0JCQkJREVUQUlMX1NFQ1RJT05fSUQpOwotCQljdHJsX2FwcGxpY2F0aW9uID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuQVBQTElDQVRJT05fVEVYVCwgNDAsIDQwMCwKLQkJCQlERVRBSUxfU0VDVElPTl9JRCk7Ci0JCWN0cmxfcHJvYmxlbSA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LlBST0JMRU1fVEVYVCwgNDAsIDQwMCwKLQkJCQlERVRBSUxfU0VDVElPTl9JRCk7Ci0JCWN0cmxfYmFja2dyb3VuZCA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkJBQ0tHUk9VTkRfVEVYVCwgNDAsIDQwMCwKLQkJCQlERVRBSUxfU0VDVElPTl9JRCk7Ci0JCWN0cmxfbGV2ZWxzX2Fkb3B0aW9uID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuTEVWRUxfT0ZfQURPUFRJT05fVEVYVCwgNDAsCi0JCQkJNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7Ci0KLQkJbGFiZWxfYmFzZS5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5CQVNFX0VMRU1FTlRfVEVYVCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycwotCSAqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlRGVzY3JpcHRpb25QYWdlI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQkJZmluYWwgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0KLQkJZmluYWwgTW9kaWZ5TGlzdGVuZXIgY29udGVudE1vZGlmeUxpc3RlbmVyID0gZWRpdG9yCi0JCQkJLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKGd1aWRhbmNlLmdldFByZXNlbnRhdGlvbigpKTsKLQotCQljdHJsX2FkZGl0aW9uYWxfaW5mbwotCQkJCS5zZXRNb2RhbE9iamVjdCgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9hZGRpdGlvbmFsX2luZm8uc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKSk7Ci0JCWN0cmxfYWRkaXRpb25hbF9pbmZvLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfYWRkaXRpb25hbF9pbmZvLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9hZGRpdGlvbmFsX2luZm87Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRBZGRpdGlvbmFsSW5mbygpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYXBwbGljYXRpb24KLQkJCQkuc2V0TW9kYWxPYmplY3QoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfYXBwbGljYXRpb24uc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKSk7Ci0JCWN0cmxfYXBwbGljYXRpb24uYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9hcHBsaWNhdGlvbi5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfYXBwbGljYXRpb247Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRBcHBsaWNhdGlvbigpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZ29hbHMuc2V0TW9kYWxPYmplY3QoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2dvYWxzLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCkpOwotCQljdHJsX2dvYWxzLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfZ29hbHMuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2dvYWxzOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0R29hbHMoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpLAotCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX3Byb2JsZW0uc2V0TW9kYWxPYmplY3QoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3Byb2JsZW0uc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpKTsKLQkJY3RybF9wcm9ibGVtLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfcHJvYmxlbS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfcHJvYmxlbTsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRQcm9ibGVtKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2JhY2tncm91bmQKLQkJCQkuc2V0TW9kYWxPYmplY3QoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfYmFja2dyb3VuZC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCkpOwotCQljdHJsX2JhY2tncm91bmQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9iYWNrZ3JvdW5kLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9iYWNrZ3JvdW5kOwotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldEJhY2tncm91bmQoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCShvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfbGV2ZWxzX2Fkb3B0aW9uCi0JCQkJLnNldE1vZGFsT2JqZWN0KChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2xldmVsc19hZG9wdGlvbi5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCkpOwotCQljdHJsX2xldmVsc19hZG9wdGlvbi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2xldmVsc19hZG9wdGlvbi5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfbGV2ZWxzX2Fkb3B0aW9uOwotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldExldmVsc09mQWRvcHRpb24oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQuZ2V0VGV4dCgpCi0JCQkJCQk6IGN0cmxfbGV2ZWxzX2Fkb3B0aW9uLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCShvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNyZWZyZXNoKGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChib29sZWFuIGVkaXRhYmxlKSB7Ci0JCXN1cGVyLnJlZnJlc2goZWRpdGFibGUpOwotCQljdHJsX2FkZGl0aW9uYWxfaW5mby5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfYXBwbGljYXRpb24uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2dvYWxzLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9wcm9ibGVtLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9sZXZlbHNfYWRvcHRpb24uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2JhY2tncm91bmQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCS8qKgotCSAqIExvYWQgaW5pdGlhbCBkYXRhIGZyb20gbW9kZWwKLQkgKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNsb2FkRGF0YSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERhdGEoKSB7Ci0JCXN1cGVyLmxvYWREYXRhKCk7Ci0JCWlmIChndWlkYW5jZSAhPSBudWxsKSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24gZ3VpZGFuY2VEZXNjcmlwdGlvbiA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCWN0cmxfYWRkaXRpb25hbF9pbmZvCi0JCQkJCS5zZXRUZXh0KGd1aWRhbmNlRGVzY3JpcHRpb24uZ2V0QWRkaXRpb25hbEluZm8oKSA9PSBudWxsID8gIiIgOiBndWlkYW5jZURlc2NyaXB0aW9uLmdldEFkZGl0aW9uYWxJbmZvKCkpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX3Byb2JsZW0KLQkJCQkJLnNldFRleHQoZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRQcm9ibGVtKCkgPT0gbnVsbCA/ICIiIDogZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRQcm9ibGVtKCkpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX2JhY2tncm91bmQKLQkJCQkJLnNldFRleHQoZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRCYWNrZ3JvdW5kKCkgPT0gbnVsbCA/ICIiIDogZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRCYWNrZ3JvdW5kKCkpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX2FwcGxpY2F0aW9uCi0JCQkJCS5zZXRUZXh0KGd1aWRhbmNlRGVzY3JpcHRpb24uZ2V0QXBwbGljYXRpb24oKSA9PSBudWxsID8gIiIgOiBndWlkYW5jZURlc2NyaXB0aW9uLmdldEFwcGxpY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX2dvYWxzCi0JCQkJCS5zZXRUZXh0KGd1aWRhbmNlRGVzY3JpcHRpb24uZ2V0R29hbHMoKSA9PSBudWxsID8gIiIgOiBndWlkYW5jZURlc2NyaXB0aW9uLmdldEdvYWxzKCkpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX2xldmVsc19hZG9wdGlvbgotCQkJCQkuc2V0VGV4dChndWlkYW5jZURlc2NyaXB0aW9uLmdldExldmVsc09mQWRvcHRpb24oKSA9PSBudWxsID8gIiIgOiBndWlkYW5jZURlc2NyaXB0aW9uLmdldExldmVsc09mQWRvcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGd1aWRhbmNlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9QcmFjdGljZVJlZmVyZW5jZXNQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJhY3RpY2VSZWZlcmVuY2VzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMzc0MTc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9QcmFjdGljZVJlZmVyZW5jZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFJlZmVyZW5jZXMgcGFnZSBpbiB0aGUgUHJhY3RpY2UgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmFjdGljZVJlZmVyZW5jZXNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInByYWN0aWNlUmVmZXJlbmNlc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFByYWN0aWNlIHByYWN0aWNlOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcmFjdGljZVJlZmVyZW5jZXNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuUkVGRVJFTkNFU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXByYWN0aWNlID0gKFByYWN0aWNlKSBjb250ZW50RWxlbWVudDsKLQkJYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlsaXN0LmFkZEFsbChwcmFjdGljZS5nZXRDb250ZW50UmVmZXJlbmNlcygpKTsKLQkJCQlsaXN0LmFkZEFsbChwcmFjdGljZS5nZXRBY3Rpdml0eVJlZmVyZW5jZXMoKSk7Ci0JCQkJcmV0dXJuIGxpc3QudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHByYWN0aWNlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSwgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHByYWN0aWNlLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlcygpLAotCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHByYWN0aWNlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSwgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHByYWN0aWNlLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlcygpLAotCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gcHJhY3RpY2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5PTkxZX0NPTlRFTlRfRUxFTUVOVFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgQWxsRmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmKG9iaiBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgcmV0dXJuIGZhbHNlOwotCQkJCWlmKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50Ci0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIAotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldEZpbHRlclR5cGVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyVHlwZXMoKSB7Ci0JCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbMTRdOwotCQlpbnQgaSA9IDA7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuUk9MRVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRBU0tTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLlRPT0xTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuUFJPQ0VTU0VTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5DT05URU5UX1BBQ0tBR0VTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5NRVRIT19QTFVHSU5TOwotCQlyZXR1cm4gc3RyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZVJlZmVyZW5jZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NjFlNmIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5Db2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycy5BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNlbGxlZGl0b3JzLlByb2Nlc3NDaGVja0JveENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbHVtbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuRXhwb3NlZEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLlZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Qcm9jZXNzVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklDb2x1bW5Bd2FyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9Cb3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29sb3JQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0KLS8qKgotICogQnJlYWRvd24gc3RydWN0dXJlIGVkaXRvcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBleHRlbmRzIFByb2Nlc3NGb3JtUGFnZQotCQlpbXBsZW1lbnRzIElWaWV3ZXJQcm92aWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFhUX1RSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWFRfRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gRUNMQVNTRVM7Ci0JCi0JcHJpdmF0ZSBpbnQgdGFiSW5kZXggPSAwOwotCQotCXN0YXRpYyB7Ci0JCUVDTEFTU0VTID0gbmV3IEFycmF5TGlzdCgpOwotCQlFQ0xBU1NFUy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBQcm9jZXNzQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGV4dGVuZHMKLQkJCVZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29sb3JQcm92aWRlciB7Ci0KLQkJcHJpdmF0ZSBEZWNvcmF0aW5nTGFiZWxQcm92aWRlciBkZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkJICovCi0JCXB1YmxpYyBQcm9jZXNzQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCQlkZWNvcmF0aW5nTGFiZWxQcm92aWRlciA9IG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcigKLQkJCQkJbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSksCi0JCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCkpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlzdXBlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQlkZWNvcmF0aW5nTGFiZWxQcm92aWRlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsJCQkKLQkJCXN1cGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCWRlY29yYXRpbmdMYWJlbFByb3ZpZGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCQkJCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlpZihjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQkJcmV0dXJuIGdldEltYWdlKG9iamVjdCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0Q29sdW1uSW1hZ2Uob2JqZWN0LCBjb2x1bW5JbmRleCk7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gZGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb2xvclByb3ZpZGVyI2dldEZvcmVncm91bmQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoaXNTdXBwcmVzc2VkKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIENvbG9ycy5TVVBSRVNTRURfRUxFTUVOVF9MQUJFTDsKLQkJCX0KLQkJCWVsc2UgaWYgKGlzRXh0ZXJuYWwoZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gQ29sb3JzLklOSEVSSVRFRF9FTEVNRU5UX0xBQkVMOwotCQkJfQotCQkJcmV0dXJuIENvbG9yQ29uc3RhbnRzLmxpc3RGb3JlZ3JvdW5kOwotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGlzU3VwcHJlc3NlZChPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldFN1cHByZXNzaW9uKCkKLQkJCQkJCS5pc1N1cHByZXNzZWQoKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gZ2V0U3VwcHJlc3Npb24oKS5pc1N1cHByZXNzZWQoCi0JCQkJCQkoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHJpdmF0ZSBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbigpIHsKLQkJCXJldHVybiAoKFByb2Nlc3NFZGl0b3IpIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZS50aGlzCi0JCQkJCS5nZXRFZGl0b3IoKSkuZ2V0U3VwcHJlc3Npb24oKTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb2xvclByb3ZpZGVyI2dldEJhY2tncm91bmQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkvLyBsZXQgT1MgdGFrZSBjb250cm9sIG92ZXIgdHJlZSB3aWRnZXQgYmFja2dyb3VuZAotCQkJLy8gcmF0aGVyIHRoYW4gc2VuZGluZyBvbmUgZml4ZWQgYmFja2dyb3VuZC4KLQkJCXJldHVybiBudWxsOy8vQ29sb3JDb25zdGFudHMubGlzdEJhY2tncm91bmQ7Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQudXRpbC5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyI2lzRXh0ZXJuYWwoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChlbGVtZW50KTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnV0aWwuVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlciNnZXRGb250KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgRm9udCBnZXRGb250KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoaXNFeHRlcm5hbChlbGVtZW50KSkgewotCQkJCXJldHVybiBpdGFsaWNGb250OwotCQkJfQotCQkJcmV0dXJuIHJlZ3VsYXJGb250OwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlkZWNvcmF0aW5nTGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQlkZWNvcmF0aW5nTGFiZWxQcm92aWRlciA9IG51bGw7Ci0JCQlzdXBlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBleHRlbmRzIFRleHRDZWxsRWRpdG9yIHsKLQkJcHJvdGVjdGVkIE9iamVjdCBsYXN0SW52YWxpZEVsZW1lbnQ7Ci0KLQkJcHJpdmF0ZSBpbnQgY29sdW1uSW5kZXg7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBwYXJlbnQKLQkJICovCi0JCXB1YmxpYyBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIocGFyZW50KTsKLQkJfQotCi0JCXZvaWQgc2V0Q29sdW1uSW5kZXgoaW50IGNvbHVtbkluZGV4KSB7Ci0JCQl0aGlzLmNvbHVtbkluZGV4ID0gY29sdW1uSW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvbHVtbkluZGV4KCkgewotCQkJcmV0dXJuIGNvbHVtbkluZGV4OwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRMYXN0SW52YWxpZEVsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gbGFzdEludmFsaWRFbGVtZW50OwotCQl9Ci0KLQkJU3RyaW5nIGlzVmFsaWQoU3RyaW5nIHR4dCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCU9iamVjdCBlID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBtc2cgPSBpc1ZhbGlkKGUsIHR4dCk7Ci0JCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCWxhc3RJbnZhbGlkRWxlbWVudCA9IGU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbGFzdEludmFsaWRFbGVtZW50ID0gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIG1zZzsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBpc1ZhbGlkKE9iamVjdCBlLCBTdHJpbmcgdHh0KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENlbGxFZGl0b3JWYWxpZGF0b3IgaW1wbGVtZW50cyBJQ2VsbEVkaXRvclZhbGlkYXRvciB7Ci0KLQkJcHJpdmF0ZSBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgY2VsbEVkaXRvcjsKLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwdWJsaWMgQ2VsbEVkaXRvclZhbGlkYXRvcihWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgY2VsbEVkaXRvcikgewotCQkJdGhpcy5jZWxsRWRpdG9yID0gY2VsbEVkaXRvcjsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKE9iamVjdCB2YWx1ZSkgewotCQkJcmV0dXJuIGNlbGxFZGl0b3IuaXNWYWxpZCgoU3RyaW5nKSB2YWx1ZSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgY2xhc3MgVmFsaWRhdGluZ0RlYWN0aXZhdGVMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQkJcHJpdmF0ZSBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgY2VsbEVkaXRvcjsKLQotCQlWYWxpZGF0aW5nRGVhY3RpdmF0ZUxpc3RlbmVyKFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBjZWxsRWRpdG9yKSB7Ci0JCQl0aGlzLmNlbGxFZGl0b3IgPSBjZWxsRWRpdG9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChjZWxsRWRpdG9yLmdldExhc3RJbnZhbGlkRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdFByb2Nlc3NFbGVtZW50RXJyb3JEaWFsb2dfdGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQljZWxsRWRpdG9yLmdldEVycm9yTWVzc2FnZSgpKTsKLQkJCQkJCXZpZXdlci5lZGl0RWxlbWVudChjZWxsRWRpdG9yLmdldExhc3RJbnZhbGlkRWxlbWVudCgpLAotCQkJCQkJCQljZWxsRWRpdG9yLmdldENvbHVtbkluZGV4KCkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCX0KLQotCS8vIHByaXZhdGUgY2xhc3MgVmFsaWRhdGluZ0ZvY3VzQWRhcHRlciBleHRlbmRzIEZvY3VzQWRhcHRlciB7Ci0JLy8gcHJpdmF0ZSBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgY2VsbEVkaXRvcjsKLQkvLwotCS8vIFZhbGlkYXRpbmdGb2N1c0FkYXB0ZXIoVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGNlbGxFZGl0b3IpIHsKLQkvLyB0aGlzLmNlbGxFZGl0b3IgPSBjZWxsRWRpdG9yOwotCS8vIH0KLQkvLwotCS8vIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkvLyBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCS8vCi0JLy8gcHVibGljIHZvaWQgcnVuKCkgewotCS8vIGlmIChjZWxsRWRpdG9yLmdldExhc3RJbnZhbGlkRWxlbWVudCgpICE9IG51bGwpIHsKLQkvLyBBdXRob3JpbmdVSVBsdWdpbgotCS8vIC5nZXREZWZhdWx0KCkKLQkvLyAuZ2V0TXNnRGlhbG9nKCkKLQkvLyAuZGlzcGxheUVycm9yKAotCS8vIEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JLy8gLmdldFN0cmluZygiQXV0aG9yaW5nVUkuZWRpdFByb2Nlc3NFbGVtZW50RXJyb3JEaWFsb2cudGl0bGUiKSwKLQkvLyAvLyROT04tTkxTLTEkCi0JLy8gY2VsbEVkaXRvci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0JLy8gdmlld2VyLmVkaXRFbGVtZW50KGNlbGxFZGl0b3IuZ2V0TGFzdEludmFsaWRFbGVtZW50KCksCi0JLy8gY2VsbEVkaXRvci5nZXRDb2x1bW5JbmRleCgpKTsKLQkvLyB9Ci0JLy8gfQotCS8vCi0JLy8gfSk7Ci0JLy8gfQotCS8vIH0KLQotCS8vIHByaXZhdGUgQ29tcG9zaXRlIHBhcmVudCA9IG51bGw7Ci0KLQlwcml2YXRlIENvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5EZXNjcmlwdG9yczsKLQotCS8vIHByaXZhdGUgYm9vbGVhbiB2YWxpZE5hbWVQcm9tcHRlZCA9IGZhbHNlOwotCS8vIHByaXZhdGUgaW50IHByb21wdENvdW50ID0gMDsKLQotCS8vIHByaXZhdGUgTWV0aG9kRWxlbWVudCBwcm9tcHRlZEVsZW1lbnQ7Ci0KLQkvLyBwcml2YXRlIFRhYmxlVHJlZVZpZXdlciB0YWJsZVRyZWVWaWV3ZXI7Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JLy8gcHJpdmF0ZSBpbnQgdGFiSW5kZXg7Ci0KLQkvLyBwcml2YXRlIE9iamVjdCB0YWJGb2xkZXI7Ci0KLQlwcm90ZWN0ZWQgUHJvY2Vzc1ZpZXdlciB2aWV3ZXI7Ci0KLQlwcml2YXRlIFRleHRDZWxsRWRpdG9yIHRleHRDZWxsRWRpdG9yOwotCi0JcHJpdmF0ZSBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgbmFtZUNlbGxFZGl0b3I7Ci0KLQlwcml2YXRlIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBwcmVkTGlzdENlbGxFZGl0b3I7Ci0KLQlwcml2YXRlIENvbWJvQm94Q2VsbEVkaXRvciBjb21ib0JveENlbGxFZGl0b3I7Ci0KLQlwcml2YXRlIENoZWNrYm94Q2VsbEVkaXRvciBjaGVja0JveENlbGxFZGl0b3I7Ci0KLQlwcml2YXRlIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBwcmVzZW50YXRpb25OYW1lQ2VsbEVkaXRvcjsKLQotCS8vIHByaXZhdGUgSGFzaE1hcCBjb2x1bW5JbmRleFRvTmFtZU1hcDsKLQlwcml2YXRlIGJvb2xlYW4gaXNSZWFkT25seTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIHRpdGxlCi0JICovCi0JcHVibGljIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZShGb3JtRWRpdG9yIGVkaXRvciwgU3RyaW5nIGlkLAotCQkJU3RyaW5nIHRpdGxlKSB7Ci0JCXN1cGVyKGVkaXRvciwgaWQsIHRpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiByZXR1cm5zIHRydWUsIGVkaXRpbmcgaXMgZGlzYWJsZWQgb3Igbm90IGF2YWlsYWJsZSBmb3IgdGhlIHByb2Nlc3MgCi0JICogYnJlYWtkb3duIHN0cnVjdHVyZS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlpZiAoaXNSZWFkT25seSkgewotCQkJcmV0dXJuIGlzUmVhZE9ubHk7Ci0JCX0KLQkJcmV0dXJuIFRuZ1V0aWwuaXNMb2NrZWQocHJvY2Vzcyk7Ci0JfQotCQotCS8qKgotCSAqIElmIHJldHVybnMgdHJ1ZSwgZWRpdGluZyBpcyBkaXNhYmxlZCBvciBub3QgYXZhaWxhYmxlIGZvciB0aGUgcHJvY2VzcyAKLQkgKiBicmVha2Rvd24gc3RydWN0dXJlLgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGJhc2ljSXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIGlzUmVhZE9ubHk7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlcy9kaXNhYmxlIG1vZGlmeWluZyBwcm9jZXNzIGJyZWFrZG93biBzdHJ1Y3R1cmUKLQkgKiAKLQkgKiBAcGFyYW0gaXNSZWFkT25seQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gaXNSZWFkT25seSkgewotCQl0aGlzLmlzUmVhZE9ubHkgPSBpc1JlYWRPbmx5OwotCX0KLQotCS8qKgotCSAqIFNldHMgYWRhcHRlciBmYWN0b3J5IHRvIGNyZWF0ZSBpdGVtIHByb3ZpZGVyIGZvciBlYWNoIGVsZW1lbnQgaW4gCi0JICogdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUKLQkgKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGNvbHVtbiBkZXNjcmlwdG9ycyB0byBkZWZpbmUgdGhlIGNvbHVtbnMgb2YgdGhlIHRyZWUuCi0JICogCi0JICogQHBhcmFtIGNvbHVtbkRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uRGVzY3JpcHRvcnMoQ29sdW1uRGVzY3JpcHRvcltdIGNvbHVtbkRlc2NyaXB0b3JzKSB7Ci0JCXRoaXMuY29sdW1uRGVzY3JpcHRvcnMgPSBjb2x1bW5EZXNjcmlwdG9yczsKLQotCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJQ29sdW1uQXdhcmUpIHsKLQkJCU1hcCBjb2x1bW5JbmRleFRvTmFtZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJY29sdW1uSW5kZXhUb05hbWVNYXAucHV0KG5ldyBJbnRlZ2VyKGkpLAotCQkJCQkJY29sdW1uRGVzY3JpcHRvcnNbaV0uaWQpOwotCQkJfQotCQkJKChJQ29sdW1uQXdhcmUpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkuc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoY29sdW1uSW5kZXhUb05hbWVNYXApOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFRleHQoQnJlYWtkb3duRWxlbWVudCBlLCBTdHJpbmcgcHJvcCwgU3RyaW5nIHR4dCkgewotCQlJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCWlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTKSB7Ci0JCQlMaXN0IHByZWRlY2Vzc29ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHdiZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZTsKLQkJCWlmIChQcm9jZXNzVXRpbC5jaGVja1ByZWRlY2Vzc29yTGlzdCh3YmUsIHR4dCwgYWRhcHRlckZhY3RvcnksCi0JCQkJCXByb2Nlc3MsIHByZWRlY2Vzc29ycykgPT0gbnVsbCkgewotCQkJCVdvcmtPcmRlciB3byA9IG51bGw7Ci0JCQkJaW50IHNpemUgPSB3YmUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5zaXplKCk7Ci0JCQkJCi0JCQkJLy8gcmVtb3ZlIFdvcmtPcmRlcnMgZm9yIHByZWRlY2Vzc29ycyB0aGF0IGFyZSBub3QgaW4gcHJlZGVjZXNzb3IgbGlzdCBhbmQgYWNjZXB0ZWQgYnkgdGhlIGZpbHRlcgotCQkJCS8vCi0JCQkJTGlzdCBwcmVkVG9CZURlbGV0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJSUZpbHRlciBmaWx0ZXIgPSBQcm9jZXNzVXRpbC5nZXRGaWx0ZXIoYWRhcHRlckZhY3RvcnkpOwotCQkJCWJvb2xlYW4gbnVsbEZpbHRlciA9IGZpbHRlciA9PSBudWxsOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdiZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCXdvID0gKFdvcmtPcmRlcikgaXRlci5uZXh0KCk7Ci0JCQkJCWludCBpZCA9IHByZWRlY2Vzc29ycy5pbmRleE9mKHdvLmdldFByZWQoKSk7Ci0JCQkJCWlmIChpZCA9PSAtMSAmJiAobnVsbEZpbHRlciB8fCBmaWx0ZXIuYWNjZXB0KHdvLmdldFByZWQoKSkpKSB7Ci0JCQkJCQlwcmVkVG9CZURlbGV0ZWQuYWRkKHdvKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcmVkVG9CZURlbGV0ZWQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQkJCXsKLQkJCQkJV29ya09yZGVyIHcgPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQl3YmUsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpLAotCQkJCQkJCXcsIC0xKTsKLQkJCQl9Ci0KLQkJCQlzaXplID0gcHJlZGVjZXNzb3JzLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBwcmVkZWNlc3NvcnMKLQkJCQkJCQkuZ2V0KGkpOwotCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCWZpbmRfcHJlZDogZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHdiZQotCQkJCQkJCS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCXdvID0gKFdvcmtPcmRlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKHdvLmdldFByZWQoKSA9PSBlbGVtZW50KSB7Ci0JCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGZpbmRfcHJlZDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIWZvdW5kKSB7Ci0JCQkJCQl3byA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtPcmRlcigpOwotCQkJCQkJd28uc2V0UHJlZChlbGVtZW50KTsKLQkJCQkJCS8vIHdvLnNldFN1Y2MoZSk7Ci0JCQkJCQl3by5zZXRMaW5rVHlwZShXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0hfTElURVJBTCk7Ci0KLQkJCQkJCS8vIC8vIHRyeSB0byBhZGQgdGhlIG5ldyBXb3JrT3JkZXIgdG8gdGhlIHJpZ2h0IHBsYWNlIHNvCi0JCQkJCQkvLyB0aGUgb3JkZXIgb2YgV29ya09yZGVyIGxpc3QgY2FuIGJlIHByZXNlcnZlZC4KLQkJCQkJCS8vIC8vCi0JCQkJCQkvLyBpZihwcmV2ICE9IG51bGwpIHsKLQkJCQkJCS8vIGludCBpZCA9IGUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5pbmRleE9mKHByZXYpICsgMTsKLQkJCQkJCS8vIGlmKGlkID49IGUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5zaXplKCkpIHsKLQkJCQkJCS8vIGUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5hZGQod28pOwotCQkJCQkJLy8gfQotCQkJCQkJLy8gZWxzZSB7Ci0JCQkJCQkvLyBlLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuYWRkKGlkLCB3byk7Ci0JCQkJCQkvLyB9Ci0JCQkJCQkvLyB9Ci0JCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCQl3YmUsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpLAotCQkJCQkJCQkJCXdvLCAtMSk7Ci0JCQkJCQkvLyB3YmUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5hZGQod28pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIElCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoZSwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gYWRhcHRlci5zZXRBdHRyaWJ1dGUoZSwgcHJvcCwgdHh0KTsKLQotCQlQcm9jZXNzVXRpbC5zZXRBdHRyaWJ1dGUoYWN0aW9uTWdyLCBlLCBwcm9wLCB0eHQpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFRleHQoQnJlYWtkb3duRWxlbWVudCBlLCBTdHJpbmcgcHJvcCkgewotCQkvLyBoYW5kbGUgZWRpdGluZyBwcmVzZW50YXRpb24gbmFtZSBvZiBleHRlbmRpbmcvY29udHJpYnV0aW5nIGFjdGl2aXR5Ci0JCS8vIHNwZWNpYWxseQotCQkvLwotCQlpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FCi0JCQkJJiYgUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoZSkpIHsKLQkJCXJldHVybiAoKERlc2NyaWJhYmxlRWxlbWVudCkgZSkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQl9Ci0KLQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChlLAotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXJldHVybiBhZGFwdGVyLmdldEF0dHJpYnV0ZShlLCBwcm9wKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGFiIGluZGV4IGZvciB0aGUgZm9ybSBwYWdlCi0JICogQHBhcmFtIGlkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFiSW5kZXgoaW50IGlkKSB7Ci0JCSB0YWJJbmRleCA9IGlkOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGFiIGluZGV4IGZvciB0aGUgZm9ybSBwYWdlCi0JICovCi0JcHVibGljIGludCBnZXRUYWJJbmRleCgpIHsKLQkJcmV0dXJuIHRhYkluZGV4OwotCX0KLQotCS8qKgotCSAqIFNldCB0YWIgZm9sZGVyCi0JICogQHBhcmFtIHRhYkZvbGRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYkZvbGRlcihDVGFiRm9sZGVyIHRhYkZvbGRlcikgewotCQkvLyB0aGlzLnRhYkZvbGRlciA9IHRhYkZvbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNjcmVhdGVGb3JtQ29udGVudChvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm0pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCS8vIGNyZWF0ZSBmb3JtIHRvb2xraXQKLQkJU2Nyb2xsZWRGb3JtIGZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0JCUZvcm1Ub29sa2l0IHRvb2xraXQgPSBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCk7Ci0JCWZvcm0uc2V0VGV4dChnZXRFZGl0b3IoKS5nZXRQYXJ0TmFtZSgpKTsKLQotCQlUYWJsZVdyYXBMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlV3JhcExheW91dCgpOwotCQlmb3JtLmdldEJvZHkoKS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlTZWN0aW9uIHNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksCi0JCQkJU2VjdGlvbi5FWFBBTkRFRCB8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCLAotCQkJCVRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJc2VjdGlvbgotCQkJCS5zZXRUZXh0KGdldFRpdGxlKCkKLQkJCQkJCSsgIiAiICsgQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlX0JTRWRpdG9yKTsgCi0JCXNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJLy8gY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7Ci0JCUNvbnRyb2wgY29udHJvbCA9IGNyZWF0ZUNvbnRyb2woY29tcG9zaXRlKTsKLQkJdG9vbGtpdC5hZGFwdChjb250cm9sLCB0cnVlLCB0cnVlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSAxMDsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDYwMDsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlQcm9jZXNzRWRpdG9yIGVkaXRvciA9IChQcm9jZXNzRWRpdG9yKSBnZXRFZGl0b3IoKTsKLQkJLy8gZWRpdG9yLmNyZWF0ZUNvbnRleHRNZW51Rm9yKHRhYmxlVHJlZVZpZXdlcik7Ci0JCWVkaXRvci5jcmVhdGVDb250ZXh0TWVudUZvcih2aWV3ZXIpOwotCi0JCXNldElucHV0KHByb2Nlc3MpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlIGNvbnRyb2wKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHJldHVybgotCSAqIAkJCUNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCS8vIFRoaXMgaXMgdGhlIHBhZ2UgZm9yIHRoZSB0YWJsZSB0cmVlIHZpZXdlci4KLQkJLy8KLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcgfCBHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQljb21wLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJdmlld2VyID0gbmV3IFByb2Nlc3NWaWV3ZXIoY29tcCwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdmlld2VyLnNldHVwQ29sdW1ucyhjb2x1bW5EZXNjcmlwdG9ycyk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlhZGFwdGVyRmFjdG9yeSkpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOwotCi0KLQkJdmlld2VyLnNldEFjdGlvbk1hbmFnZXIoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCS5nZXRBY3Rpb25NYW5hZ2VyKCkpOwotCi0JCXRleHRDZWxsRWRpdG9yID0gbmV3IFRleHRDZWxsRWRpdG9yKHZpZXdlci5nZXRDZWxsRWRpdG9yUGFyZW50KCkpOwotCQljb21ib0JveENlbGxFZGl0b3IgPSBuZXcgQ29tYm9Cb3hDZWxsRWRpdG9yKHZpZXdlcgotCQkJCS5nZXRDZWxsRWRpdG9yUGFyZW50KCksIG5ldyBTdHJpbmdbXSB7IFRYVF9UUlVFLCBUWFRfRkFMU0UgfSk7Ci0JCWNoZWNrQm94Q2VsbEVkaXRvciA9IG5ldyBDaGVja2JveENlbGxFZGl0b3Iodmlld2VyCi0JCQkJLmdldENlbGxFZGl0b3JQYXJlbnQoKSk7Ci0KLQkJLy9zZXQgYWxsIGVkaXRvcnMgYW5kIG1vZGlmaWVycwotCQlzZXRBbGxFZGl0b3JzQW5kTW9kaWZpZXJzKCk7Ci0JCQotCQl2aWV3ZXIuc2V0QXV0b0V4cGFuZExldmVsKDMpOwotCQl2aWV3ZXIuc2V0SW5wdXQocHJvY2Vzcyk7Ci0KLQkJLy8gaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSA7Ci0JCS8vIFRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10geyBUTkdPYmpUcmFuc2Zlci5nZXRJbnN0YW5jZSgpCi0JCS8vIH07Ci0JCS8vIHRhYmxlVHJlZVZpZXdlci5hZGREcm9wU3VwcG9ydChETkQuRFJPUF9NT1ZFLCB0cmFuc2ZlcnMsIG5ldwotCQkvLyBCU1RhYkRyb3BBZGFwdGVyKHRhYmxlVHJlZVZpZXdlcikpOwotCi0JCS8vIEJTRWRpdG9yVmlldy5nZXRWaWV3KCkuY3JlYXRlQ29udGV4dE1lbnVGb3IodGFibGVUcmVlVmlld2VyKTsKLQkJLy8gcmV0dXJuIHRhYmxlVHJlZVZpZXdlci5nZXRDb250cm9sKCk7Ci0KLQkJc2V0Q29udGV4dEhlbHAodmlld2VyLmdldENvbnRyb2woKSk7Ci0KLQkJcmV0dXJuIGNvbXA7Ci0KLQl9Ci0KLQkKLQkvKioKLQkgKiBTZXQgYWxsIGVkaXRvcnMgYW5kIG1vZGlmaWVycyBmb3IgdGhlIHZpZXdlcgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRBbGxFZGl0b3JzQW5kTW9kaWZpZXJzKCkKLQl7Ci0JCXNldENlbGxFZGl0b3JzKCk7Ci0JCXNldENoZWNrQm94Q2VsbEVkaXRvcnMoKTsKLQotCQkvLyBTZXQgdGhlIGNlbGwgbW9kaWZpZXIKLQkJdmlld2VyLnNldENlbGxNb2RpZmllcihuZXcgSUNlbGxNb2RpZmllcigpIHsKLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXIjY2FuTW9kaWZ5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjYW5Nb2RpZnk6IGVsZW1lbnQ9IitlbGVtZW50KyIsCi0JCQkJLy8gcHJvcGVydHk9Iitwcm9wZXJ0eSk7Ci0KLQkJCQlpZiAoaXNSZWFkT25seSgpIHx8Ci0JCQkJCQkoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyICYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQpLmlzUmVhZE9ubHkoKSkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotLy8JCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpCi0vLwkJCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyICYmICEoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50KQotLy8JCQkJCQkJCS5pc1JlYWRPbmx5KCkpKSB7Ci0vLwkJCQkJQ29sbGVjdGlvbiB0eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJCQl0eXBlcy5hZGQoVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCk7Ci0vLwkJCQkJaWYgKFRuZ1V0aWwKLS8vCQkJCQkJCS5pc0dlbmVyYWxpemVyKAotLy8JCQkJCQkJCQkoVmFyaWFiaWxpdHlFbGVtZW50KSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50KQotLy8JCQkJCQkJCQkJCS5nZXRPd25lcigpLCB0eXBlcykpCi0vLwkJCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJCX0KLQkJCQkKLQkJCQlpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRAotCQkJCQkJfHwgcHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFCi0JCQkJCQl8fCBwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8KLQkJCQkJCXx8IHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfREVMSVZFUkFCTEUpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCWVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKQotCQkJCQkJJiYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfRU5UUllfU1RBVEUgfHwgcHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkKLQkJCQkJCSYmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUykpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyI2dldFZhbHVlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0JCQkgKi8KLQkJCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0VmFsdWU6IGVsZW1lbnQ9IitlbGVtZW50KyIsCi0JCQkJLy8gcHJvcGVydHk9Iitwcm9wZXJ0eSk7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJCVN0cmluZyB2YWwgPSBnZXRUZXh0KGUsIHByb3BlcnR5KTsKLQkJCQlzd2l0Y2ggKGdldENlbGxFZGl0b3JUeXBlKHByb3BlcnR5KSkgewotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NPTUJPX0JPT0xFQU46Ci0JCQkJCWlmIChUWFRfVFJVRS5lcXVhbHNJZ25vcmVDYXNlKHZhbCkpIHsKLQkJCQkJCXJldHVybiBuZXcgSW50ZWdlcigwKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiBuZXcgSW50ZWdlcigxKTsKLQkJCQkJfQotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQ6Ci0JCQkJCXJldHVybiB2YWw7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTjoKLQkJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWwpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiB2YWw7Ci0JCQkJfQotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyI21vZGlmeShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBtb2RpZnkoZmluYWwgT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwKLQkJCQkJT2JqZWN0IHZhbHVlKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJtb2RpZnk6IGVsZW1lbnQ9IitlbGVtZW50KyIsCi0JCQkJLy8gcHJvcGVydHk9Iitwcm9wZXJ0eSsiLCB2YWx1ZT0iK3ZhbHVlKTsKLQkJCQlXaWRnZXQgaXRlbSA9IChXaWRnZXQpIGVsZW1lbnQ7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBiZSA9IChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcChpdGVtCi0JCQkJCQkuZ2V0RGF0YSgpKTsKLQotCQkJCWZpbmFsIGludCBjb2x1bW5JbmRleCA9IGdldENvbHVtbkluZGV4KHByb3BlcnR5KTsKLQkJCQlDZWxsRWRpdG9yIGNlbGxFZGl0b3IgPSB2aWV3ZXIuZ2V0Q2VsbEVkaXRvcnMoKVtjb2x1bW5JbmRleF07Ci0JCQkJU3RyaW5nIGVyck1zZyA9IGNlbGxFZGl0b3IuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCQkJaWYgKGVyck1zZyAhPSBudWxsKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcgdHh0OwotCQkJCXN3aXRjaCAoZ2V0Q2VsbEVkaXRvclR5cGUocHJvcGVydHkpKSB7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVDoKLQkJCQkJdHh0ID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NPTUJPX0JPT0xFQU46Ci0JCQkJCWludCBpbmRleCA9ICgoTnVtYmVyKSB2YWx1ZSkuaW50VmFsdWUoKTsKLQkJCQkJaWYgKGluZGV4ID09IDApIHsKLQkJCQkJCXR4dCA9IFRYVF9UUlVFOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHh0ID0gVFhUX0ZBTFNFOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NIRUNLX0JPT0xFQU46Ci0JCQkJCXR4dCA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXR4dCA9IFRuZ1V0aWwuY2hlY2tOdWxsKHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCQlzZXRUZXh0KGJlLCBwcm9wZXJ0eSwgdHh0KTsKLQkJCQlpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRQotCQkJCQkJJiYgU3RyVXRpbC5pc0JsYW5rKGJlLmdldE5hbWUoKSkpIHsKLQkJCQkJYmUuc2V0TmFtZSh0eHQpOwotCQkJCX0KLQkJCQkKLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogR2V0IGNlbGwgZWRpdG9yIGZvciB0aGUgZ2l2ZW4gY29sdW1uCi0JICogQHBhcmFtIGNvbHVtbklECi0JICogQHBhcmFtIGNvbHVtbkluZGV4Ci0JICogQHJldHVybgotCSAqIAkJCUNlbGwgRWRpdG9yCi0JICovCi0JcHVibGljIENlbGxFZGl0b3IgZ2V0Q2VsbEVkaXRvcihTdHJpbmcgY29sdW1uSUQsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoY29sdW1uSUQgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSkgewotCQkJaWYgKHByZXNlbnRhdGlvbk5hbWVDZWxsRWRpdG9yID09IG51bGwpIHsKLQkJCQlwcmVzZW50YXRpb25OYW1lQ2VsbEVkaXRvciA9IG5ldyBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IoCi0JCQkJCQl2aWV3ZXIuZ2V0Q2VsbEVkaXRvclBhcmVudCgpKSB7Ci0JCQkJCXByb3RlY3RlZCBTdHJpbmcgaXNWYWxpZChPYmplY3QgZSwgU3RyaW5nIHR4dCkgewotCQkJCQkJZSA9IFRuZ1V0aWwudW53cmFwKGUpOwotCQkJCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSAoKFByb2Nlc3NFZGl0b3IpZ2V0RWRpdG9yKCkpLmdldFN1cHByZXNzaW9uKCk7Ci0JCQkJCQlib29sZWFuIGlnbm9yZVN1cHByZXNzZWQgPSB0cnVlOwotCQkJCQkJcmV0dXJuIFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5jaGVja0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKAotCQkJCQkJCQkJCWFkYXB0ZXJGYWN0b3J5LCAoQnJlYWtkb3duRWxlbWVudCkgZSwKLQkJCQkJCQkJCQl0eHQsIHN1cHByZXNzaW9uLCBpZ25vcmVTdXBwcmVzc2VkKTsKLQkJCQkJfQotCQkJCX07Ci0KLQkJCQlwcmVzZW50YXRpb25OYW1lQ2VsbEVkaXRvcgotCQkJCQkJLnNldFZhbGlkYXRvcihuZXcgQ2VsbEVkaXRvclZhbGlkYXRvcigKLQkJCQkJCQkJcHJlc2VudGF0aW9uTmFtZUNlbGxFZGl0b3IpKTsKLQkJCQkvLyBwcmVzZW50YXRpb25OYW1lQ2VsbEVkaXRvci5nZXRDb250cm9sKCkuYWRkRm9jdXNMaXN0ZW5lcihuZXcKLQkJCQkvLyBWYWxpZGF0aW5nRm9jdXNBZGFwdGVyKHByZXNlbnRhdGlvbk5hbWVDZWxsRWRpdG9yKSk7Ci0JCQkJcHJlc2VudGF0aW9uTmFtZUNlbGxFZGl0b3IuZ2V0Q29udHJvbCgpLmFkZExpc3RlbmVyKAotCQkJCQkJU1dULkRlYWN0aXZhdGUsCi0JCQkJCQluZXcgVmFsaWRhdGluZ0RlYWN0aXZhdGVMaXN0ZW5lcigKLQkJCQkJCQkJcHJlc2VudGF0aW9uTmFtZUNlbGxFZGl0b3IpKTsKLQkJCX0KLQkJCXByZXNlbnRhdGlvbk5hbWVDZWxsRWRpdG9yLnNldENvbHVtbkluZGV4KGNvbHVtbkluZGV4KTsKLQotCQkJcmV0dXJuIHByZXNlbnRhdGlvbk5hbWVDZWxsRWRpdG9yOwotCQl9IGVsc2UgaWYgKGNvbHVtbklEID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRSkgewotCQkJaWYgKG5hbWVDZWxsRWRpdG9yID09IG51bGwpIHsKLQkJCQluYW1lQ2VsbEVkaXRvciA9IG5ldyBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3Iodmlld2VyCi0JCQkJCQkuZ2V0Q2VsbEVkaXRvclBhcmVudCgpKSB7Ci0JCQkJCXByb3RlY3RlZCBTdHJpbmcgaXNWYWxpZChPYmplY3QgZSwgU3RyaW5nIHR4dCkgewotCQkJCQkJZSA9IFRuZ1V0aWwudW53cmFwKGUpOwotCQkJCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSAoKFByb2Nlc3NFZGl0b3IpZ2V0RWRpdG9yKCkpLmdldFN1cHByZXNzaW9uKCk7Ci0JCQkJCQlyZXR1cm4gVG5nVXRpbAotCQkJCQkJCQkuY2hlY2tBY3Rpdml0eU5hbWUoYWRhcHRlckZhY3RvcnksIGUsIHR4dCwgc3VwcHJlc3Npb24pOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQluYW1lQ2VsbEVkaXRvci5zZXRWYWxpZGF0b3IobmV3IENlbGxFZGl0b3JWYWxpZGF0b3IoCi0JCQkJCQluYW1lQ2VsbEVkaXRvcikpOwotCQkJCS8vIG5hbWVDZWxsRWRpdG9yLmdldENvbnRyb2woKS5hZGRGb2N1c0xpc3RlbmVyKG5ldwotCQkJCS8vIFZhbGlkYXRpbmdGb2N1c0FkYXB0ZXIobmFtZUNlbGxFZGl0b3IpKTsKLQkJCQluYW1lQ2VsbEVkaXRvci5nZXRDb250cm9sKCkuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJCQluZXcgVmFsaWRhdGluZ0RlYWN0aXZhdGVMaXN0ZW5lcihuYW1lQ2VsbEVkaXRvcikpOwotCQkJfQotCQkJbmFtZUNlbGxFZGl0b3Iuc2V0Q29sdW1uSW5kZXgoY29sdW1uSW5kZXgpOwotCi0JCQlyZXR1cm4gbmFtZUNlbGxFZGl0b3I7Ci0JCX0gZWxzZSBpZiAoY29sdW1uSUQgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMpIHsKLQkJCWlmIChwcmVkTGlzdENlbGxFZGl0b3IgPT0gbnVsbCkgewotCQkJCXByZWRMaXN0Q2VsbEVkaXRvciA9IG5ldyBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3Iodmlld2VyCi0JCQkJCQkuZ2V0Q2VsbEVkaXRvclBhcmVudCgpKSB7Ci0JCQkJCXByb3RlY3RlZCBTdHJpbmcgaXNWYWxpZChPYmplY3QgZSwgU3RyaW5nIHR4dCkgewotCQkJCQkJZSA9IFRuZ1V0aWwudW53cmFwKGUpOwotCQkJCQkJcmV0dXJuIFByb2Nlc3NVdGlsLmNoZWNrUHJlZGVjZXNzb3JMaXN0KAotCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIGUsIHR4dCwgYWRhcHRlckZhY3RvcnksCi0JCQkJCQkJCXByb2Nlc3MsIG51bGwpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlwcmVkTGlzdENlbGxFZGl0b3Iuc2V0VmFsaWRhdG9yKG5ldyBDZWxsRWRpdG9yVmFsaWRhdG9yKAotCQkJCQkJcHJlZExpc3RDZWxsRWRpdG9yKSk7Ci0JCQkJLy8gcHJlZExpc3RDZWxsRWRpdG9yLmdldENvbnRyb2woKS5hZGRGb2N1c0xpc3RlbmVyKG5ldwotCQkJCS8vIFZhbGlkYXRpbmdGb2N1c0FkYXB0ZXIocHJlZExpc3RDZWxsRWRpdG9yKSk7Ci0JCQkJcHJlZExpc3RDZWxsRWRpdG9yLmdldENvbnRyb2woKS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwKLQkJCQkJCW5ldyBWYWxpZGF0aW5nRGVhY3RpdmF0ZUxpc3RlbmVyKHByZWRMaXN0Q2VsbEVkaXRvcikpOwotCQkJfQotCQkJcHJlZExpc3RDZWxsRWRpdG9yLnNldENvbHVtbkluZGV4KGNvbHVtbkluZGV4KTsKLQotCQkJcmV0dXJuIHByZWRMaXN0Q2VsbEVkaXRvcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgY2VsbCBlZGl0b3JzIGZvciBhbGwgY29sdW1ucyAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDZWxsRWRpdG9ycygpIHsKLQkJQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJQ2VsbEVkaXRvciBjZWxsRWRpdG9yID0gZ2V0Q2VsbEVkaXRvcihjb2x1bW5EZXNjcmlwdG9yc1tpXS5pZCwgaSk7Ci0JCQlpZiAoY2VsbEVkaXRvciAhPSBudWxsKSB7Ci0JCQkJY2VsbEVkaXRvcnNbaV0gPSBjZWxsRWRpdG9yOwotCQkJfSBlbHNlIHsKLQkJCQlzd2l0Y2ggKGNvbHVtbkRlc2NyaXB0b3JzW2ldLmNlbGxFZGl0b3JUeXBlKSB7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ09NQk9fQk9PTEVBTjoKLQkJCQkJY2VsbEVkaXRvcnNbaV0gPSBjb21ib0JveENlbGxFZGl0b3I7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQ6Ci0JCQkJCWNlbGxFZGl0b3JzW2ldID0gdGV4dENlbGxFZGl0b3I7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NIRUNLX0JPT0xFQU46Ci0JCQkJCWNlbGxFZGl0b3JzW2ldID0gY2hlY2tCb3hDZWxsRWRpdG9yOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQljZWxsRWRpdG9yc1tpXSA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXZpZXdlci5zZXRDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7Ci0JfQotCQotCQotCQotCi0JLyoqCi0JICogU2V0IGlucHV0IGZvciB2aWV3ZXIKLQkgKiBAcGFyYW0gbmV3SW5wdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJcHJvY2VzcyA9IChQcm9jZXNzKSBuZXdJbnB1dDsKLQkJCWlmIChwcm9jZXNzLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQl2aWV3ZXIuc2V0SW5wdXQocHJvY2Vzcy5lQ29udGFpbmVyKCkpOwotCQkJCS8vIHZpZXdlci5leHBhbmRBbGwoKTsKLS8vCQkJCXZpZXdlci5yZXZlYWwocHJvY2Vzcyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXZpZXdlci5zZXRJbnB1dChudWxsKTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRDb2x1bW5JbmRleChTdHJpbmcgcHJvcGVydHkpIHsKLQkJT2JqZWN0W10gY29sUHJvcHMgPSB2aWV3ZXIuZ2V0Q29sdW1uUHJvcGVydGllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbFByb3BzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29sUHJvcHNbaV0gPT0gcHJvcGVydHkpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXByaXZhdGUgaW50IGdldENlbGxFZGl0b3JUeXBlKFN0cmluZyBwcm9wZXJ0eSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb2x1bW5EZXNjcmlwdG9yIGRlc2MgPSBjb2x1bW5EZXNjcmlwdG9yc1tpXTsKLQkJCWlmIChkZXNjLmlkID09IHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIGRlc2MuY2VsbEVkaXRvclR5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9OT05FOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgcHJvY2VzcyBhcyBpbnB1dAotCSAqIEBwYXJhbSBwcm9jCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvY2VzcyhQcm9jZXNzIHByb2MpIHsKLQkJaWYgKHByb2Nlc3MgIT0gcHJvYykgewotCQkJc2V0SW5wdXQocHJvYyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhZGFwdGVyRmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgY29sdW1ucyB3aXRoIG5ldyBjb2x1bW4gZGVzY3JpcHRvcnMKLQkgKiBAcGFyYW0gbmV3Q29sdW1uRGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVDb2x1bW5zKENvbHVtbkRlc2NyaXB0b3JbXSBuZXdDb2x1bW5EZXNjcmlwdG9ycykgewotCQlzZXRDb2x1bW5EZXNjcmlwdG9ycyhuZXdDb2x1bW5EZXNjcmlwdG9ycyk7Ci0JCXZpZXdlci5zZXR1cENvbHVtbnMobmV3Q29sdW1uRGVzY3JpcHRvcnMpOwkKLQkJc2V0QWxsRWRpdG9yc0FuZE1vZGlmaWVycygpOwotCQl2aWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGlmKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgewotCQkvLyAoKENvbXBvc2VkQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmRpc3Bvc2UoKTsKLQkJLy8gfQotCi0JCWlmICh2aWV3ZXIuZ2V0Q29udGVudFByb3ZpZGVyKCkgIT0gbnVsbCkgewotCQkJdmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpLmRpc3Bvc2UoKTsKLQkJfQotCi0JCWlmICh2aWV3ZXIuZ2V0TGFiZWxQcm92aWRlcigpICE9IG51bGwpIHsKLQkJCXZpZXdlci5nZXRMYWJlbFByb3ZpZGVyKCkuZGlzcG9zZSgpOwotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDb250ZXh0SGVscChDb250cm9sIGNvbnRyb2wpIHsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhYyA9IGdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFsbEZhYyA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IHdic0ZhYyA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IG9ic0ZhYyA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IHBic0ZhYyA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgREVCVUc6IGN1cnJlbnQgZGFkcHRlciBmYWMgPSAiICsgYWRhcHRlckZhYyk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIERFQlVHOiBhbGwgZGFkcHRlciBmYWMgPSAiICsgYWxsRmFjKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgREVCVUc6IHdicyBkYWRwdGVyIGZhYyA9ICIgKyB3YnNGYWMpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBERUJVRzogb2JzIGRhZHB0ZXIgZmFjID0gIiArIG9ic0ZhYyk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIERFQlVHOiBwYnMgZGFkcHRlciBmYWMgPSAiICsgcGJzRmFjKTsKLQotCQlpZiAoYWRhcHRlckZhYyA9PSB3YnNGYWMpCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbnRyb2wsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkZPUk1fRURJVE9SX1BST0NFU1NfV0JTX0NPTlRFWFQpOwotCQllbHNlIGlmIChhZGFwdGVyRmFjID09IG9ic0ZhYykKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29udHJvbCwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRk9STV9FRElUT1JfUFJPQ0VTU19PQlNfQ09OVEVYVCk7Ci0JCWVsc2UgaWYgKGFkYXB0ZXJGYWMgPT0gcGJzRmFjKQotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb250cm9sLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5GT1JNX0VESVRPUl9QUk9DRVNTX1BCU19DT05URVhUKTsKLQkJZWxzZSBpZiAoYWRhcHRlckZhYyA9PSBhbGxGYWMpCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbnRyb2wsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkZPUk1fRURJVE9SX1BST0NFU1NfQUxMQlNfQ09OVEVYVCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgYWRkaXRpb25hbCBhY3Rpb25zIHRvIGNvbnRyaWJ1dGUgdG8gdGhlIGNvbnRleHQgbWVudS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQkJQWN0aW9ucwotCSAqLwotCXB1YmxpYyBJQWN0aW9uW10gZ2V0QWRkaXRpb25hbEFjdGlvbnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgY2hlY2sgYm94IGNlbGwgZWRpdG9ycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoZWNrQm94Q2VsbEVkaXRvcnMoKSB7Ci0JCUFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnMgPSBuZXcgQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3JbY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJc3dpdGNoIChjb2x1bW5EZXNjcmlwdG9yc1tpXS5jZWxsRWRpdG9yVHlwZSkgewotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NIRUNLX0JPT0xFQU46Ci0JCQkJCWNlbGxFZGl0b3JzW2ldID0gbmV3IFByb2Nlc3NDaGVja0JveENlbGxFZGl0b3Iodmlld2VyCi0JCQkJCQkJLmdldENlbGxFZGl0b3JQYXJlbnQoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWNlbGxFZGl0b3JzW2ldID0gbnVsbDsKLQkJCX0KLQkJfQotCQkoKFByb2Nlc3NWaWV3ZXIpIHZpZXdlcikuc2V0Q2hlY2tCb3hDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzRGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTFiYWIxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkVkaXRvcnNDb250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Db25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkRlY29yYXRlZEZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSW1hZ2VIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcExheW91dDsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgcHJvY2VzcyBkZXNjcmlwdGlvbi4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIAotICogVE9ETzogUmVuYW1lIHRoaXMgY2xhc3MgdG8gUHJvY2Vzc0Rlc2NyaXB0aW9uUGFnZQotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0Rlc2NyaXB0aW9uIGV4dGVuZHMgUHJvY2Vzc0Zvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicHJvY2Vzc0Rlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVCA9IDI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBHRU5FUkFMX1NFQ1RJT05fSUQgPSAxOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgREVUQUlMX1NFQ1RJT05fSUQgPSAyOwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQl9OwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBmb3JtU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgc2VjdGlvbkNvbXBvc2l0ZTsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGV4cGFuZGVkQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfbmFtZTsKLQotCXByaXZhdGUgVGV4dCBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZfZGVzYywgY3RybF9leHRlcm5hbF9pZDsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfcHVycG9zZTsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfZnVsbF9kZXNjOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9zY29wZSwgY3RybF91c2FnZV9ub3RlczsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfYWx0ZXJuYXRpdmVzLCBjdHJsX2hvd190b19zdGFmZiwKLQkJCWN0cmxfa2V5X2NvbnNpZGVyYXRpb247Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBhY3RpdmVDb250cm9sOwotCi0JcHJpdmF0ZSBTZWN0aW9uIGdlbmVyYWxTZWN0aW9uLCBkZXRhaWxTZWN0aW9uLCBjb25maWdTZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBnZW5lcmFsQ29tcG9zaXRlLCBkZXRhaWxDb21wb3NpdGUsIGNvbmZpZ0NvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGRlc2NFeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmFsU2VjdGlvbkV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGRldGFpbFNlY3Rpb25FeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25maWdTZWN0aW9uRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dEVkaXRvciBjdHJsX2V4cGFuZGVkOwotCi0JcHJpdmF0ZSBJbWFnZUh5cGVybGluayBleHBhbmRMaW5rOwotCi0JcHJpdmF0ZSBEZWNvcmF0ZWRGaWVsZCBleHBhbmRMYWJlbDsKLQotCS8vIHByaXZhdGUgU3RyaW5nW10gdmFyaWFiaWxpdHlUeXBlcyA9IG5ldyBTdHJpbmdbXSB7Ik4vQSIsICJDb250cmlidXRlcyIsCi0JLy8gIkV4dGVuZHMiLCAiUmVwbGFjZXMifTsKLQkvLyBwcml2YXRlIEhhc2hNYXAgdmFyaWFiaWxpdHlFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdCBsaXN0X2NvbmZpZ3VyYXRpb25zOwotCi0JcHJpdmF0ZSBMaXN0Vmlld2VyIGNvbmZpZ0xpc3RWaWV3ZXI7Ci0KLQlwcml2YXRlIEJ1dHRvbiBidXR0b25BZGQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBidXR0b25SZW1vdmU7Ci0KLQkvLyBwcml2YXRlIEJ1dHRvbiBidXR0b25FZGl0OwotCXByaXZhdGUgQnV0dG9uIGJ1dHRvbk1ha2VEZWZhdWx0OwotCi0JcHJpdmF0ZSBUZXh0IHRleHRDb25maWdEZXNjcmlwdGlvbjsKLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBjb25maWdMaXN0QWRhcHRlcjsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBjb250ZW50TW9kaWZ5TGlzdGVuZXI7Ci0KLS8vCXByaXZhdGUgQWRhcHRlciBwcm9jZXNzTGlzdGVuZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBwcm9jZXNzVHlwZTsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3I7Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIG5hbWVNb2RpZnlMaXN0ZW5lcjsKLQotCXByaXZhdGUgYm9vbGVhbiBkaXNwb3NlZDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NEZXNjcmlwdGlvbihGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVzY3JpcHRpb25QYWdlX3RpdGxlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQkvLyBjcmVhdGUgZm9ybSB0b29sa2l0Ci0JCXN1cGVyLmNyZWF0ZUZvcm1Db250ZW50KG1hbmFnZWRGb3JtKTsKLQotCQlwcm9jZXNzVHlwZSA9IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0TG93ZXIocHJvY2Vzcyk7Ci0JCXNldEZvcm1UZXh0KCk7Ci0KLQkJLy8gY3JlYXRlIGVkaXRvciBjb250ZW50Ci0JCWNyZWF0ZUVkaXRvckNvbnRlbnQodG9vbGtpdCk7Ci0KLS8vCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGlzdGVuIHRvIGNoYW5nZSBpbiBwcm9jZXNzJ3MgZGF0YQotLy8JCWlmIChwcm9jZXNzTGlzdGVuZXIgPT0gbnVsbCkgewotLy8JCQlwcm9jZXNzTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0vLwkJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLS8vCQkJCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoUHJvY2Vzcy5jbGFzcykpIHsKLS8vCQkJCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fTkFNRToKLS8vCQkJCQkJcmVmcmVzaEVsZW1lbnROYW1lKG1zZy5nZXROZXdTdHJpbmdWYWx1ZSgpKTsKLS8vCQkJCQkJYnJlYWs7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9OwotLy8JCX0KLS8vCQlwcm9jZXNzLmVBZGFwdGVycygpLmFkZChwcm9jZXNzTGlzdGVuZXIpOwotCi0JCWxvYWREYXRhKCk7Ci0JCWFkZExpc3RlbmVycygpOwotCi0JCUVkaXRvcnNDb250ZXh0SGVscGVyLnNldEhlbHAoZ2V0UGFydENvbnRyb2woKSwgcHJvY2Vzc1R5cGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGVkaXRvciB0YWIgY29udGVudAotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQljcmVhdGVGb3JtQ29tcG9zaXRlcygpOwotCQljcmVhdGVHZW5lcmFsU2VjdGlvbigpOwotCQljcmVhdGVEZXRhaWxTZWN0aW9uKCk7Ci0JCWNyZWF0ZUNvbmZpZ3VyYXRpb25TZWN0aW9uKCk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGRldGFpbENvbXBvc2l0ZSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbmZpZ0NvbXBvc2l0ZSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGV4cGFuZGVkQ29tcG9zaXRlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRm9ybUNvbXBvc2l0ZXMoKSB7Ci0JCWZvcm1TZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGZvcm0uZ2V0Qm9keSgpLCBTZWN0aW9uLk5PX1RJVExFKTsKLQkJewotCQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJCWZvcm1TZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQkJZm9ybVNlY3Rpb24uc2V0TGF5b3V0KG5ldyBUYWJsZVdyYXBMYXlvdXQoKSk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgdGhlIGNvbXBvc2l0ZSBmb3IgdGhlIHNlY3Rpb25zCi0JCXNlY3Rpb25Db21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShmb3JtU2VjdGlvbiwgU1dULk5PTkUpOwotCQlzZWN0aW9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoKSk7Ci0JCXNlY3Rpb25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBUYWJsZVdyYXBMYXlvdXQoKSk7Ci0JCWZvcm1TZWN0aW9uLnNldENsaWVudChzZWN0aW9uQ29tcG9zaXRlKTsKLQotCQlleHBhbmRlZENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGZvcm1TZWN0aW9uLCBTV1QuTk9ORSk7Ci0JCXsKLQkJCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKHRkKTsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0KLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGV4cGFuZGVkQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLlJJQ0hfVEVYVF9FRElUT1JfQ09OVEVYVF9JRCk7Ci0KLQkJLy8gQWRkIHRoZSBleHBhbmQvY29sbGFwc2UgaHlwZXJsaW5rIGltYWdlLgotCQlleHBhbmRMaW5rID0gdG9vbGtpdC5jcmVhdGVJbWFnZUh5cGVybGluayhleHBhbmRlZENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlleHBhbmRMaW5rLnNldEltYWdlKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19FWFBBTkRFRCk7Ci0JCWV4cGFuZExpbmsuc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2xvc2VSVEUpOwotCQlleHBhbmRMaW5rLnNldFVuZGVybGluZWQoZmFsc2UpOwotCQlleHBhbmRMaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJdG9nZ2xlKGUpOwotCQkJfQotCQl9KTsKLQotCQkvLyBBZGQgdGhlIGV4cGFuZC9jb2xsYXBzZSBoeXBlcmxpbmsgdGV4dC4KLQkJZXhwYW5kTGFiZWwgPSBjcmVhdGVEZWNvcmF0ZWRMYWJlbCh0b29sa2l0LCBleHBhbmRlZENvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZ2VuZXJhbCBzZWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oKSB7Ci0JCS8vIGNyZWF0ZSBHZW5lcmFsIEluZm9ybWF0aW9uIHNlY3Rpb24KLQkJZ2VuZXJhbFNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksCi0JCQkJU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQKLQkJCQkJCXwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuR0VORVJBTF9JTkZPX1NFQ1RJT05fTkFNRSk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCUF1dGhvcmluZ1VJVGV4dC5HRU5FUkFMX0lORk9fU0VDVElPTl9ERVNDLAotCQkJCW5ldyBTdHJpbmdbXSB7IHByb2Nlc3NUeXBlIH0pKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWdlbmVyYWxDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShnZW5lcmFsU2VjdGlvbik7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldENsaWVudChnZW5lcmFsQ29tcG9zaXRlKTsKLQotCQkvLyBuYW1lCi0JCWN0cmxfbmFtZSA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0Lk5BTUVfVEVYVCk7Ci0KLQkJLy8gUHJlc2VudGF0aW9uIG5hbWUKLQkJY3RybF9wcmVzZW50YXRpb25fbmFtZSA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsKHRvb2xraXQsCi0JCQkJZ2VuZXJhbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LlBSRVNFTlRBVElPTl9OQU1FX1RFWFQpOwotCi0JCS8vIGJyaWVmIGRlc2MKLQkJY3RybF9icmllZl9kZXNjID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWwyKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkJSSUVGX0RFU0NSSVBUSU9OX1RFWFQpOwotCi0JCS8vIEV4dGVybmFsIElkCi0JCWN0cmxfZXh0ZXJuYWxfaWQgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NfRXh0ZXJuYWxJRCk7IAotCi0JCS8vIFB1cnBvc2UKLQkJY3RybF9wdXJwb3NlID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKAotCQkJCXRvb2xraXQsCi0JCQkJZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX1B1cnBvc2UsIDQwLCA0MDAsIEdFTkVSQUxfU0VDVElPTl9JRCk7IAotCi0JCS8vIC8vIGNyZWF0ZSBleHBhbmRlZCBjb21wb3NpdGUKLQkJLy8gZXhwYW5kR2VuZXJhbENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxTZWN0aW9uKTsKLQkJLy8gZXhwYW5kR2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldwotCQkvLyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJLy8gZXhwYW5kR2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJLy8gZXhwYW5kR2VuZXJhbENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJLy8JCQotCQkvLyAvLyBIeXBlcmxpbmsgZGVzYwotCQkvLyBleHBhbmRHZW5lcmFsTGluayA9Ci0JCS8vIHRvb2xraXQuY3JlYXRlSW1hZ2VIeXBlcmxpbmsoZXhwYW5kR2VuZXJhbENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkvLyBleHBhbmRHZW5lcmFsTGluay5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfRVhQQU5ERUQpOwotCQkvLyBleHBhbmRHZW5lcmFsTGluay5zZXRVbmRlcmxpbmVkKGZhbHNlKTsKLQkJLy8gZXhwYW5kR2VuZXJhbExpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKQotCQkvLyB7Ci0JCS8vIHB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkKLQkJLy8gewotCQkvLyB0b2dnbGUoZSwgR0VORVJBTF9TRUNUSU9OX0lEKTsKLQkJLy8gfQotCQkvLyB9KTsKLQkJLy8JCQotCQkvLyBleHBhbmRHZW5lcmFsTGFiZWwgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBleHBhbmRHZW5lcmFsQ29tcG9zaXRlLAotCQkvLyAiIik7Ci0KLQkJLy8gc2V0IGZvY3VzIG9uIHRoZSBuYW1lIGF0dHJpYnV0ZQotCQlEaXNwbGF5IGRpc3BsYXkgPSBmb3JtLmdldEJvZHkoKS5nZXREaXNwbGF5KCk7Ci0JCWlmICghKGRpc3BsYXkgPT0gbnVsbCB8fCBkaXNwbGF5LmlzRGlzcG9zZWQoKSkpIHsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZGV0YWlsIHNlY3Rpb24KLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURldGFpbFNlY3Rpb24oKSB7Ci0JCS8vIGNyZWF0ZSBkZXRhaWwgc2VjdGlvbgotCQlkZXRhaWxTZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGZvcm0uZ2V0Qm9keSgpLAotCQkJCVNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVECi0JCQkJCQl8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJZGV0YWlsU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJZGV0YWlsU2VjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5ERVRBSUxfU0VDVElPTl9OQU1FKTsKLQkJZGV0YWlsU2VjdGlvbi5zZXREZXNjcmlwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQlBdXRob3JpbmdVSVRleHQuREVUQUlMX1NFQ1RJT05fREVTQywKLQkJCQluZXcgU3RyaW5nW10geyBwcm9jZXNzVHlwZSB9KSk7Ci0JCWRldGFpbFNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWRldGFpbENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGRldGFpbFNlY3Rpb24pOwotCQlkZXRhaWxDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWRldGFpbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJZGV0YWlsU2VjdGlvbi5zZXRDbGllbnQoZGV0YWlsQ29tcG9zaXRlKTsKLQotCQkvLyBmdWxsIGRlc2NyaXB0aW9uCi0JCWN0cmxfZnVsbF9kZXNjID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuTUFJTl9ERVNDUklQVElPTl9URVhULCAxMDAsCi0JCQkJNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7Ci0KLQkJLy8gc2NvcGUKLQkJY3RybF9zY29wZSA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19TY29wZSwgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gdXNhZ2Ugbm90ZXMKLQkJY3RybF91c2FnZV9ub3RlcyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX1VzYWdlTm90ZXMsIDQwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsgCi0KLQkJLy8gYWx0ZXJuYXRpdmVzCi0JCWN0cmxfYWx0ZXJuYXRpdmVzID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKAotCQkJCXRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NfQWx0ZXJuYXRpdmVzLCA0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7IAotCi0JCS8vIGhvdyB0byBzdGFmZgotCQljdHJsX2hvd190b19zdGFmZiA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX0hvd1RvU3RhZmYsIDQwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsgCi0KLQkJLy8ga2V5IGNvbnNpZGVyYXRpb24KLQkJY3RybF9rZXlfY29uc2lkZXJhdGlvbiA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX0tleUNvbnNpZGVyYXRpb24sIDQwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsgCi0KLQkJLy8gLy8gY3JlYXRlIGV4cGFuZGVkIGNvbXBvc2l0ZQotCQkvLyBleHBhbmREZXRhaWxDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShkZXRhaWxTZWN0aW9uKTsKLQkJLy8gZXhwYW5kRGV0YWlsQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3Ci0JCS8vIEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkvLyBleHBhbmREZXRhaWxDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCS8vIGV4cGFuZERldGFpbENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJLy8JCQotCQkvLyAvLyBIeXBlcmxpbmsgZGVzYwotCQkvLyBleHBhbmREZXRhaWxMaW5rID0KLQkJLy8gdG9vbGtpdC5jcmVhdGVJbWFnZUh5cGVybGluayhleHBhbmREZXRhaWxDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJLy8gZXhwYW5kRGV0YWlsTGluay5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfRVhQQU5ERUQpOwotCQkvLyBleHBhbmREZXRhaWxMaW5rLnNldFVuZGVybGluZWQoZmFsc2UpOwotCQkvLyBleHBhbmREZXRhaWxMaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkKLQkJLy8gewotCQkvLyBwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpCi0JCS8vIHsKLQkJLy8gdG9nZ2xlKGUsIERFVEFJTF9TRUNUSU9OX0lEKTsKLQkJLy8gfQotCQkvLyB9KTsKLQkJLy8JCQotCQkvLyBleHBhbmREZXRhaWxMYWJlbCA9IGNyZWF0ZUxhYmVsKHRvb2xraXQsIGV4cGFuZERldGFpbENvbXBvc2l0ZSwgIiIpOwotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGNvbmZpZ3VyYXRpb24gc2VjdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbmZpZ3VyYXRpb25TZWN0aW9uKCkgewotCQkvLyBjcmVhdGUgQ29uZmlndXJhdGlvbiBzZWN0aW9uCi0JCWNvbmZpZ1NlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksCi0JCQkJU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQKLQkJCQkJCXwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlUYWJsZVdyYXBEYXRhIHRkMSA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJY29uZmlnU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkMSk7Ci0JCWNvbmZpZ1NlY3Rpb24KLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25UaXRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJY29uZmlnU2VjdGlvbgotCQkJCS5zZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25NZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQljb25maWdTZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQljb25maWdDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShjb25maWdTZWN0aW9uKTsKLQkJY29uZmlnQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb25maWdDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWNvbmZpZ1NlY3Rpb24uc2V0Q2xpZW50KGNvbmZpZ0NvbXBvc2l0ZSk7Ci0KLQkJTGFiZWwgbF9lbGVtZW50ID0gdG9vbGtpdAotCQkJCS5jcmVhdGVMYWJlbCgKLQkJCQkJCWNvbmZpZ0NvbXBvc2l0ZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9ucyk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkVORCwgdHJ1ZSwKLQkJCQkJdHJ1ZSwgMiwgMSk7Ci0JCQlsX2VsZW1lbnQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlsaXN0X2NvbmZpZ3VyYXRpb25zID0gVUlIZWxwZXIuY3JlYXRlTGlzdCh0b29sa2l0LCBjb25maWdDb21wb3NpdGUsCi0JCQkJU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA4MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDIwMDsKLQkJCWxpc3RfY29uZmlndXJhdGlvbnMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY29uZmlnTGlzdFZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKGxpc3RfY29uZmlndXJhdGlvbnMpOwotCQljb25maWdMaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQljb25maWdMaXN0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpKSB7Ci0JCQkJCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoCi0JCQkJCQkJImljb25zL2NoZWNrZWQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCVN0cmluZyB0eHQgPSBsYWJlbFByb3ZpZGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpKSB7Ci0JCQkJCXR4dCA9IHR4dAotCQkJCQkJCSsgIiAiICsgQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Rlc2NyaXB0aW9uX2RlZmF1bHQ7IAotCQkJCX0KLQkJCQlyZXR1cm4gdHh0OwotCQkJfQotCQl9KTsKLQotCQlDb21wb3NpdGUgYnV0dG9uUGFuZWwgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShjb25maWdDb21wb3NpdGUpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCBmYWxzZSwKLQkJCQkJZmFsc2UpOwotCQkJLy8gZ3JpZERhdGEud2lkdGhIaW50ID0gODA7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gNDsKLQkJCWJ1dHRvblBhbmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJYnV0dG9uUGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCX0KLQkJLy8gQWRkIGJ1dHRvbgotCQlCdXR0b24gYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uUGFuZWwsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFkZEJ1dHRvbl90ZXh0LCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlidXR0b25BZGQgPSBidXR0b247Ci0KLQkJLy8gUmVtb3ZlIGJ1dHRvbgotCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25QYW5lbCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVtb3ZlQnV0dG9uX3RleHQsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJYnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWJ1dHRvblJlbW92ZSA9IGJ1dHRvbjsKLQotCQkvLyAvLyBFZGl0IGJ1dHRvbgotCQkvLyBidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25QYW5lbCwgIkVkaXQuLi4iLCBTV1QuTk9ORSk7Ci0JCS8vIHsKLQkJLy8gR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJLy8gZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVCAqIDY7Ci0JCS8vIGJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJLy8gfQotCQkvLyBidXR0b25FZGl0ID0gYnV0dG9uOwotCQkvLwkJCi0JCS8vCQkKLQkJLy8gTWFrZSBEZWZhdWx0IGJ1dHRvbgotCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25QYW5lbCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMubWFrZURlZmF1bHRCdXR0b25fdGV4dCwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlidXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJYnV0dG9uTWFrZURlZmF1bHQgPSBidXR0b247Ci0KLQkJLy8gY29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbgotCQlMYWJlbCBsYWJlbCA9IHRvb2xraXQKLQkJCQkuY3JlYXRlTGFiZWwoCi0JCQkJCQljb25maWdDb21wb3NpdGUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbkRlc2NyaXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuRU5ELCB0cnVlLAotCQkJCQlmYWxzZSwgMiwgMSk7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCXRleHRDb25maWdEZXNjcmlwdGlvbiA9IHRvb2xraXQuY3JlYXRlVGV4dChjb25maWdDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA4MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCXRleHRDb25maWdEZXNjcmlwdGlvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQl0ZXh0Q29uZmlnRGVzY3JpcHRpb24uc2V0RWRpdGFibGUoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0vLwkJaWYgKHByb2Nlc3NMaXN0ZW5lciAhPSBudWxsKSB7Ci0vLwkJCXByb2Nlc3MuZUFkYXB0ZXJzKCkucmVtb3ZlKHByb2Nlc3NMaXN0ZW5lcik7Ci0vLwkJfQotCi0JCWlmIChjb25maWdMaXN0QWRhcHRlciAhPSBudWxsKSB7Ci0JCQljb25maWdMaXN0QWRhcHRlci5kaXNwb3NlKCk7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQljb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlkaXNwb3NlZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudCBwcm92aWRlciBmb3IgY29uZmlndXJhdGlvbnMKLQkgKgotCSAqLwotCWNsYXNzIENvbmZpZ0xpc3RJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0JCQotCQkvKioKLQkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkJICovCi0JCXB1YmxpYyBDb25maWdMaXN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCQlwcm9jZXNzLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcgPSBwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCk7Ci0KLQkJCWlmIChkZWZhdWx0Q29uZmlnICE9IG51bGwKLQkJCQkJJiYgIXByb2Nlc3MuZ2V0VmFsaWRDb250ZXh0KCkuY29udGFpbnMoZGVmYXVsdENvbmZpZykpIHsKLQkJCQlwcm9jZXNzLmdldFZhbGlkQ29udGV4dCgpLmFkZCgwLCBkZWZhdWx0Q29uZmlnKTsKLQkJCX0KLQkJCXJldHVybiBwcm9jZXNzLmdldFZhbGlkQ29udGV4dCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIG1zZykgewotCQkJYm9vbGVhbiByZWZyZXNoID0gZmFsc2U7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoUHJvY2Vzcy5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUOgotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJcmVmcmVzaCA9IHRydWU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDoKLQkJCQlyZWZyZXNoID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChyZWZyZXNoKQotCQkJCWNvbmZpZ0xpc3RWaWV3ZXIucmVmcmVzaCgpOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgdm9pZCB1cGRhdGVNb2RlbENvbnRyb2xzKCkgewotCQlpZiAoKGN0cmxfbmFtZSAhPSBudWxsKSAmJiAoIWN0cmxfbmFtZS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQlTdHJpbmcgc3RyID0gVG5nVXRpbC5jaGVja051bGwocHJvY2Vzcy5nZXROYW1lKCkpOwotCQkJaWYgKCFzdHIuZXF1YWxzKGN0cmxfbmFtZS5nZXRUZXh0KCkpKSB7Ci0JCQkJY3RybF9uYW1lLnNldFRleHQoc3RyKTsKLQkJCX0KLQkJfQotCQlpZiAoKGN0cmxfYnJpZWZfZGVzYyAhPSBudWxsKSAmJiAoIWN0cmxfYnJpZWZfZGVzYy5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChwcm9jZXNzCi0JCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCkpKTsKLQkJfQotCQlpZiAoKGN0cmxfcHJlc2VudGF0aW9uX25hbWUgIT0gbnVsbCkKLQkJCQkmJiAoIWN0cmxfcHJlc2VudGF0aW9uX25hbWUuaXNEaXNwb3NlZCgpKSkKLQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChwcm9jZXNzCi0JCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBpbml0aWFsIGRhdGEgZnJvbSBtb2RlbAotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWREYXRhKCkgewotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiBjb250ZW50ID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uKSBwcm9jZXNzCi0JCQkJLmdldFByZXNlbnRhdGlvbigpOwotCi0JCVN0cmluZyBleHRlcm5hbElEID0gY29udGVudC5nZXRFeHRlcm5hbElkKCk7Ci0JCVN0cmluZyBwdXJwb3NlID0gY29udGVudC5nZXRQdXJwb3NlKCk7Ci0JCVN0cmluZyBmdWxsRGVzYyA9IGNvbnRlbnQuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyBzY29wZSA9IGNvbnRlbnQuZ2V0U2NvcGUoKTsKLQkJU3RyaW5nIHVzYWdlTm90ZXMgPSBjb250ZW50LmdldFVzYWdlTm90ZXMoKTsKLQkJU3RyaW5nIGFsdGVybmF0aXZlcyA9IGNvbnRlbnQuZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCVN0cmluZyBob3dUb1N0YWZmID0gY29udGVudC5nZXRIb3d0b1N0YWZmKCk7Ci0JCVN0cmluZyBrZXlDb25zaWRlcmF0aW9uID0gY29udGVudC5nZXRLZXlDb25zaWRlcmF0aW9ucygpOwotCi0JCXVwZGF0ZU1vZGVsQ29udHJvbHMoKTsKLQotCQljdHJsX2V4dGVybmFsX2lkLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwoZXh0ZXJuYWxJRCkpOwotCQljdHJsX3B1cnBvc2Uuc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChwdXJwb3NlKSk7Ci0JCWN0cmxfZnVsbF9kZXNjLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwoZnVsbERlc2MpKTsKLQkJY3RybF9zY29wZS5zZXRUZXh0KFRuZ1V0aWwuY2hlY2tOdWxsKHNjb3BlKSk7Ci0JCWN0cmxfdXNhZ2Vfbm90ZXMuc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbCh1c2FnZU5vdGVzKSk7Ci0JCWN0cmxfYWx0ZXJuYXRpdmVzLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwoYWx0ZXJuYXRpdmVzKSk7Ci0JCWN0cmxfaG93X3RvX3N0YWZmLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwoaG93VG9TdGFmZikpOwotCQljdHJsX2tleV9jb25zaWRlcmF0aW9uLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwoa2V5Q29uc2lkZXJhdGlvbikpOwotCi0JCWlmIChjb25maWdMaXN0QWRhcHRlciA9PSBudWxsKSB7Ci0JCQljb25maWdMaXN0QWRhcHRlciA9IG5ldyBDb25maWdMaXN0SXRlbVByb3ZpZGVyKAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCX0KLQotCQljb25maWdMaXN0Vmlld2VyLnNldElucHV0KGNvbmZpZ0xpc3RBZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQl0aGlzLmVkaXRvciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpOwotCQlmaW5hbCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlmaW5hbCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiBjb250ZW50ID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uKSBwcm9jZXNzCi0JCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQltb2RpZnlMaXN0ZW5lciA9IGVkaXRvci5jcmVhdGVNb2RpZnlMaXN0ZW5lcihwcm9jZXNzKTsKLQkJY29udGVudE1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKHByb2Nlc3MKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCi0JCWZvcm0uYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCWlmICghZGVzY0V4cGFuZEZsYWcpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoY3RybF9leHBhbmRlZCAhPSBudWxsKSB7Ci0JCQkJCSgoR3JpZERhdGEpIGN0cmxfZXhwYW5kZWQuZ2V0TGF5b3V0RGF0YSgpKS5oZWlnaHRIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JIZWlnaHQoKTsKLQkJCQkJKChHcmlkRGF0YSkgY3RybF9leHBhbmRlZC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKTsKLQkJCQl9Ci0JCQkJZm9ybVNlY3Rpb24ubGF5b3V0KHRydWUsIHRydWUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjb250cm9sTW92ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JCWZvcm0uZ2V0UGFyZW50KCkuYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYoZGlzcG9zZWQpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIHNhdmUgbGFzdCBtb2RpZmllZCByaWNoIHRleHQKLQkJCQllZGl0b3Iuc2F2ZU1vZGlmaWVkUmljaFRleHQoKTsJCQkKLQkJCQkKLQkJCQkvLyBTeW5jaCB1cCBkYXRhIGJldHdlZW4gZGVzY3JpcHRpb24gdGFiIGFuZCBwcm9wZXJ0aWVzIHdpbmRvdwotCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2V0VGV4dChwcm9jZXNzLmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCi0JCQkJY3RybF9icmllZl9kZXNjLnJlbW92ZU1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChwcm9jZXNzLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCQkJY3RybF9icmllZl9kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJCQkKLQkJCQljdHJsX3B1cnBvc2UucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQljdHJsX3B1cnBvc2Uuc2V0VGV4dChjb250ZW50LmdldFB1cnBvc2UoKSk7Ci0JCQkJY3RybF9wdXJwb3NlLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCi0JCQkJY3RybF9mdWxsX2Rlc2MucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsJCQkKLQkJCQljdHJsX2Z1bGxfZGVzYy5zZXRUZXh0KGNvbnRlbnQuZ2V0TWFpbkRlc2NyaXB0aW9uKCkpOwotCQkJCWN0cmxfZnVsbF9kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCi0JCQkJY3RybF9rZXlfY29uc2lkZXJhdGlvbi5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCWN0cmxfa2V5X2NvbnNpZGVyYXRpb24uc2V0VGV4dChjb250ZW50LmdldEtleUNvbnNpZGVyYXRpb25zKCkpOwotCQkJCWN0cmxfa2V5X2NvbnNpZGVyYXRpb24uYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQkKLQkJCQljdHJsX2FsdGVybmF0aXZlcy5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCWN0cmxfYWx0ZXJuYXRpdmVzLnNldFRleHQoY29udGVudC5nZXRBbHRlcm5hdGl2ZXMoKSk7Ci0JCQkJY3RybF9hbHRlcm5hdGl2ZXMuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQkKLQkJCQljdHJsX2hvd190b19zdGFmZi5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCWN0cmxfaG93X3RvX3N0YWZmLnNldFRleHQoY29udGVudC5nZXRIb3d0b1N0YWZmKCkpOwotCQkJCWN0cmxfaG93X3RvX3N0YWZmLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCi0JCQkJCi0JCQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQocHJvY2VzcykpIHsKLQkJCQkJcmVmcmVzaChmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVmcmVzaCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCW5hbWVNb2RpZnlMaXN0ZW5lciA9IGVkaXRvci5jcmVhdGVNb2RpZnlMaXN0ZW5lcihwcm9jZXNzLmVDb250YWluZXIoKSwKLQkJCQl0cnVlKTsKLQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5hbWVNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfbmFtZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gcHJvY2Vzcy5nZXROYW1lKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3TmFtZSA9IGN0cmxfbmFtZS5nZXRUZXh0KCkudHJpbSgpOwotCQkJCWlmIChuZXdOYW1lLmVxdWFscyhwcm9jZXNzLmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSAoUHJvY2Vzc0NvbXBvbmVudCkgcHJvY2VzcwotCQkJCQkJLmVDb250YWluZXIoKTsKLQkJCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuY3JlYXRlTmFtZVZhbGlkYXRvcigKLQkJCQkJCQkJcHJvY0NvbXAsCi0JCQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCQlTdHJpbmcgbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQobmV3TmFtZSk7Ci0JCQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX3RpdGxlOyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fbWVzc2FnZTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24odGl0bGUsIG1lc3NhZ2UpKSB7Ci0JCQkJCQllLmRvaXQgPSB0cnVlOwotCi0JCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCXByb2Nlc3MsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIGN0cmxfbmFtZQotCQkJCQkJCQkJCS5nZXRUZXh0KCksIC0xKTsKLQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJY3RybF9uYW1lLnNldFRleHQocHJvY2Vzcy5nZXROYW1lKCkpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHByb2NDb21wLAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkJCQkJCQljdHJsX25hbWUuZ2V0VGV4dCgpLCAtMSk7Ci0KLQkJCQkJCXNldEZvcm1UZXh0KCk7Ci0KLQkJCQkJCS8vIGFkanVzdCBwbHVnaW4gbG9jYXRpb24gYW5kIHNhdmUgdGhlIGVkaXRvcgotCQkJCQkJLy8KLQkJCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFNpdGUoKS5nZXRTaGVsbCgpCi0JCQkJCQkJCS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCQkJCQkJCQllZGl0b3IuYWRkUmVzb3VyY2VUb0FkanVzdExvY2F0aW9uKHByb2Nlc3MKLQkJCQkJCQkJCQkuZVJlc291cmNlKCkpOwotCQkJCQkJCQllZGl0b3IuZG9TYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQkJCX0KLQotCQkJCQkJfSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljdHJsX25hbWUuc2V0VGV4dChwcm9jZXNzLmdldE5hbWUoKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lRGlhbG9nX3RpdGxlLCBtc2cpOyAvLyROT04tTkxTLTEkCi0JCQkJCWN0cmxfbmFtZS5zZXRUZXh0KHByb2Nlc3MuZ2V0TmFtZSgpKTsKLQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCWN0cmxfbmFtZS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQkJCQljdHJsX25hbWUuc2VsZWN0QWxsKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWN0cmxfbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBwcm9jZXNzLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICgoY3RybF9wcmVzZW50YXRpb25fbmFtZS5nZXRUZXh0KCkgIT0gbnVsbCkKLQkJCQkJCSYmICghY3RybF9wcmVzZW50YXRpb25fbmFtZS5nZXRUZXh0KCkuZXF1YWxzKCIiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQkJCWlmICghY3RybF9wcmVzZW50YXRpb25fbmFtZS5nZXRUZXh0KCkuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0KLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJcHJvY2VzcywKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksCi0JCQkJCQkJCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5nZXRUZXh0KCksIC0xKTsKLQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5zZXRUZXh0KG9sZENvbnRlbnQpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLS8vCQkJCQkJTGlicmFyeVZpZXcgZWxlbWVudHNWaWV3ID0gTGlicmFyeVZpZXcuZ2V0VmlldygpOwotLy8JCQkJCQlpZiAoZWxlbWVudHNWaWV3ICE9IG51bGwpCi0vLwkJCQkJCQllbGVtZW50c1ZpZXcuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gcmVzdG9yZSB0aGUgb2xkIG5hbWUgZmlyc3QsIHRoZW4gcHJlc2VudCB0aGUgZXJyb3IKLQkJCQkJLy8gbWVzc2FnZSBib3gKLQkJCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5zZXRUZXh0KHByb2Nlc3MKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXREaWFsb2dfdGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmludmFsaWRQcmVzZW50YXRpb25OYW1lRXJyb3JfbXNnKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKAotCQkJCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5zZXRGb2N1cygpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX2JyaWVmX2Rlc2MuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2JyaWVmX2Rlc2MuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IHByb2Nlc3MuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJZS53aWRnZXQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjdHJsX2JyaWVmX2Rlc2MuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQlwcm9jZXNzLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KG5ld0NvbnRlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2V4dGVybmFsX2lkLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfZXh0ZXJuYWxfaWQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzRGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRFeHRlcm5hbElkKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljdHJsX2V4dGVybmFsX2lkLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY3RybF9leHRlcm5hbF9pZC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCXByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX0V4dGVybmFsSWQoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJCQljdHJsX2V4dGVybmFsX2lkLnNldFRleHQobmV3Q29udGVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJY3RybF9wdXJwb3NlLnNldE1vZGFsT2JqZWN0KHByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3B1cnBvc2Uuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpKTsKLQkJY3RybF9wdXJwb3NlLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfcHVycG9zZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfcHVycG9zZTsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRQdXJwb3NlKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljdHJsX3B1cnBvc2UsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHByb2Nlc3MKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpLCBuZXdDb250ZW50LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2Z1bGxfZGVzYy5zZXRNb2RhbE9iamVjdChwcm9jZXNzLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9mdWxsX2Rlc2Muc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSk7Ci0JCWN0cmxfZnVsbF9kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfZnVsbF9kZXNjLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9mdWxsX2Rlc2M7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljdHJsX2Z1bGxfZGVzYywgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgcHJvY2VzcwotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfc2NvcGUuc2V0TW9kYWxPYmplY3QocHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfc2NvcGUuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpKTsKLQkJY3RybF9zY29wZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3Njb3BlLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9zY29wZTsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRTY29wZSgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY3RybF9zY29wZSwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgcHJvY2VzcwotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCksIG5ld0NvbnRlbnQsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfdXNhZ2Vfbm90ZXMuc2V0TW9kYWxPYmplY3QocHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfdXNhZ2Vfbm90ZXMuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCkpOwotCQljdHJsX3VzYWdlX25vdGVzLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfdXNhZ2Vfbm90ZXMuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX3VzYWdlX25vdGVzOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldFVzYWdlTm90ZXMoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWN0cmxfdXNhZ2Vfbm90ZXMsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHByb2Nlc3MKLQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpLAotCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9hbHRlcm5hdGl2ZXMuc2V0TW9kYWxPYmplY3QocHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfYWx0ZXJuYXRpdmVzLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpKTsKLQkJY3RybF9hbHRlcm5hdGl2ZXMuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9hbHRlcm5hdGl2ZXMuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2FsdGVybmF0aXZlczsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRBbHRlcm5hdGl2ZXMoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWN0cmxfYWx0ZXJuYXRpdmVzLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBwcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpLCBuZXdDb250ZW50LAotCQkJCQkJCS0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfaG93X3RvX3N0YWZmLnNldE1vZGFsT2JqZWN0KHByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2hvd190b19zdGFmZi5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3d0b1N0YWZmKCkpOwotCQljdHJsX2hvd190b19zdGFmZi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2hvd190b19zdGFmZi5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfaG93X3RvX3N0YWZmOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldEhvd3RvU3RhZmYoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWN0cmxfaG93X3RvX3N0YWZmLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBwcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKSwgbmV3Q29udGVudCwKLQkJCQkJCQktMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2tleV9jb25zaWRlcmF0aW9uLnNldE1vZGFsT2JqZWN0KHByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2tleV9jb25zaWRlcmF0aW9uLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKSk7Ci0JCWN0cmxfa2V5X2NvbnNpZGVyYXRpb24uYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9rZXlfY29uc2lkZXJhdGlvbi5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfa2V5X2NvbnNpZGVyYXRpb247Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWN0cmxfa2V5X2NvbnNpZGVyYXRpb24sIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHByb2Nlc3MKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWNvbmZpZ0xpc3RWaWV3ZXIKLQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb25maWdMaXN0Vmlld2VyCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9ICgoTWV0aG9kQ29uZmlndXJhdGlvbikgc2VsZWN0aW9uCi0JCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJCQkJCWlmIChjb25maWcgPT0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpKSB7Ci0JCQkJCQkJCWJ1dHRvblJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlidXR0b25SZW1vdmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJU3RyaW5nIGRlc2MgPSBjb25maWcuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQkJCWlmIChkZXNjID09IG51bGwpIHsKLQkJCQkJCQkJZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCXRleHRDb25maWdEZXNjcmlwdGlvbi5zZXRUZXh0KGRlc2MpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJYnV0dG9uQWRkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkocHJvY2Vzcyk7Ci0KLQkJCQlmaW5hbCBDb25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlciBpbnB1dCA9IG5ldyBDb25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlcigKLQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWxpYiwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQlMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKAotCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCWlucHV0LAotCQkJCQkJY29udGVudFByb3ZpZGVyLAotCQkJCQkJbGFiZWxQcm92aWRlciwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NEZXNjcmlwdGlvbl9zZWxlY3RDb25maWd1cmF0aW9uKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQkJCQlDb250cm9sIGNvbnRyb2wgPSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCQkJCQlnZXRWaWV3ZXIoKS5hZGRGaWx0ZXIobmV3IFZpZXdlckZpbHRlcigpIHsKLQotCQkJCQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLAotCQkJCQkJCQkJT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCQkJCS8vIGludCBjb3VudCA9Ci0JCQkJCQkJCS8vIGNvbmZpZ0xpc3RWaWV3ZXIuZ2V0TGlzdCgpLmdldEl0ZW1Db3VudCgpOwotCQkJCQkJCQkvLyBmb3IoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCQkJCQkvLyBpZihlbGVtZW50ID09Ci0JCQkJCQkJCS8vIGNvbmZpZ0xpc3RWaWV3ZXIuZ2V0RWxlbWVudEF0KGkpKSByZXR1cm4KLQkJCQkJCQkJLy8gZmFsc2U7Ci0JCQkJCQkJCS8vIH0KLQkJCQkJCQkJLy8gcmV0dXJuIHRydWU7Ci0JCQkJCQkJCXJldHVybiAhcHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKS5jb250YWlucygKLQkJCQkJCQkJCQllbGVtZW50KTsKLQkJCQkJCQl9Ci0KLQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIGNvbnRyb2w7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJCQkJCWlucHV0LmRpc3Bvc2UoKTsKLQkJCQkJCXJldHVybiBzdXBlci5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlpZiAoZGxnLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQkJT2JqZWN0IG9ic1tdID0gZGxnLmdldFJlc3VsdCgpOwotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkJCQkJLy8gZ2V0IGRlZmF1bHQgY29uZmlndXJhdGlvbgotLy8JCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gZGVmYXVsdENvbmZpZyA9IHByb2Nlc3MKLS8vCQkJCQkJCS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9icy5sZW5ndGg7IGkrKykgewotCQkJCQkJY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIG9ic1tpXTsKLQkJCQkJCWlmIChjb25maWcgIT0gbnVsbCkgewotLy8JCQkJCQkJCXx8IGNoZWNrVmFsaWRpdHlGb3JTdXBlclNldChkZWZhdWx0Q29uZmlnLAotLy8JCQkJCQkJCQkJY29uZmlnKSkgewotCQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHByb2Nlc3MsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKSwgY29uZmlnLAotCQkJCQkJCQkJLTEpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5hZGRDb25maWdFcnJvckRpYWxvZ190aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmludmFsaWRDb25maWdFcnJvcl9tc2csIGNvbmZpZy5nZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlidXR0b25SZW1vdmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbmZpZ0xpc3RWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIHByb2Nlc3MsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpLAotCQkJCQkJc2VsZWN0aW9uLnRvTGlzdCgpLCAtMSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWJ1dHRvbk1ha2VEZWZhdWx0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb25maWdMaXN0Vmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBwcm9jZXNzCi0JCQkJCQkJLmdldERlZmF1bHRDb250ZXh0KCk7Ci0KLQkJCQkJaWYgKGN1cnJlbnRDb25maWcgIT0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKSB7Ci0JCQkJCQlib29sZWFuIGlzVmFsaWQgPSB0cnVlOwotCQkJCQkJTGlzdCB2YWxpZENvbnRleHQgPSBwcm9jZXNzLmdldFZhbGlkQ29udGV4dCgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gdmFsaWRDb250ZXh0Lml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdG9yCi0JCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCWlmICghKGNoZWNrVmFsaWRpdHlGb3JTdXBlclNldCgKLQkJCQkJCQkJCShNZXRob2RDb25maWd1cmF0aW9uKSBzZWxlY3Rpb24KLQkJCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpLCBjb25maWcpKSkgewotCQkJCQkJCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChpc1ZhbGlkKSB7Ci0JCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsIHByb2Nlc3MsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpLAotCQkJCQkJCQkJc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpLCAtMSk7Ci0JCQkJCQkJaWYgKCFzdGF0dXMpCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQlidXR0b25SZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCVN0cmluZyBzZWxlY3RlZENvbmZpZ05hbWUgPSAoKE1ldGhvZENvbmZpZ3VyYXRpb24pIHNlbGVjdGlvbgotCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKS5nZXROYW1lKCk7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2V0RGVmYXVsdENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2V0RGVmYXVsdENvbmZpZ0Vycm9yX21zZywgc2VsZWN0ZWRDb25maWdOYW1lKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaCBhbGwgdGhlIGNvbnRyb2xzCi0JICogCi0JICogQHBhcmFtIGVkaXRhYmxlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChib29sZWFuIGVkaXRhYmxlKSB7Ci0JCWN0cmxfbmFtZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2JyaWVmX2Rlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX3B1cnBvc2Uuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2Z1bGxfZGVzYy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfYWx0ZXJuYXRpdmVzLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9leHRlcm5hbF9pZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfa2V5X2NvbnNpZGVyYXRpb24uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2hvd190b19zdGFmZi5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfc2NvcGUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX3VzYWdlX25vdGVzLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJaWYgKGN0cmxfZXhwYW5kZWQgIT0gbnVsbCkgewotCQkJY3RybF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJYnV0dG9uQWRkLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlidXR0b25NYWtlRGVmYXVsdC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJYnV0dG9uUmVtb3ZlLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCX0KLQotCS8qKgotCSAqIFRvZ2dsZSBEZXNjcmlwdGlvbiBjb250cm9sIHRvIGV4cGFuZCBhbmQgY29udHJvbCBzdGF0ZQotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRvZ2dsZShIeXBlcmxpbmtFdmVudCBlLCBpbnQgaWQpIHsKLQkJLy8gVE9ETy0gd2Ugc2hvdWxkIGNvbWJpbmUgdGhlc2UgbWV0aG9kcyBpbnRvIG9uZS4gT25lIHdheSB0byBkbyBpdCwKLQkJLy8gZGlzcG9pbmcKLQkJLy8gY3RybF9leHBhbmRlZCBldmVyeSB0aW1lIGl0IGNvbGxhcHNlcyBhbmQgY3JlYXRpbmcgaXQgd2hlbiB3ZSBleHBhbmQuCi0JCS8vIEF0IHByZXNlbnQsIHRoZXJlIGlzIG5vIG1ldGhvZCB0byBkaXNwb3NlCi0JCXRvZ2dsZShlKTsKLQkJLy8gaWYgKGlkID09IEdFTkVSQUxfU0VDVElPTl9JRCkKLQkJLy8gewotCQkvLyB0b2dnbGVHZW5lcmFsU2VjdGlvbihlKTsKLQkJLy8gfQotCQkvLyBpZiAoaWQgPT0gREVUQUlMX1NFQ1RJT05fSUQpCi0JCS8vIHsKLQkJLy8gdG9nZ2xlRGV0YWlsU2VjdGlvbihlKTsKLQkJLy8gfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRvZ2dsZShIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCWlmIChjdHJsX2V4cGFuZGVkID09IG51bGwpIHsKLQkJCWN0cmxfZXhwYW5kZWQgPSBjcmVhdGVSaWNoVGV4dEVkaXRvcih0b29sa2l0LCBleHBhbmRlZENvbXBvc2l0ZSwKLQkJCQkJU1dULk1VTFRJIHwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwsCi0JCQkJCUdyaWREYXRhLkZJTExfVkVSVElDQUwsIGdldFJpY2hUZXh0RWRpdG9ySGVpZ2h0KCksCi0JCQkJCWdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKSwgMiwKLQkJCQkJZXhwYW5kTGFiZWwpOwotCQkJY3RybF9leHBhbmRlZC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQl9Ci0KLQkJaWYgKGRlc2NFeHBhbmRGbGFnKSB7Ci0JCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCXNlY3Rpb25Db21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWZvcm1TZWN0aW9uLnNldENsaWVudChzZWN0aW9uQ29tcG9zaXRlKTsKLQkJCWVuYWJsZVNlY3Rpb25zKHRydWUpOwotCQkJSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0ID0gZ2V0QWN0aXZlUmljaFRleHRDb250cm9sKCk7Ci0JCQlyaWNoVGV4dC5zZXRUZXh0KGN0cmxfZXhwYW5kZWQuZ2V0VGV4dCgpKTsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHJpY2hUZXh0LmdldExpc3RlbmVycygpOyBpLmhhc05leHQoKTspIHsKLQkJCQlSaWNoVGV4dExpc3RlbmVyIGxpc3RlbmVyID0gKFJpY2hUZXh0TGlzdGVuZXIpIGkubmV4dCgpOwotCQkJCWN0cmxfZXhwYW5kZWQucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIuZ2V0RXZlbnRUeXBlKCksIGxpc3RlbmVyCi0JCQkJCQkuZ2V0TGlzdGVuZXIoKSk7Ci0JCQl9Ci0JCQlpZiAoY3RybF9leHBhbmRlZC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCS5zYXZlTW9kaWZpZWRSaWNoVGV4dChjdHJsX2V4cGFuZGVkKTsKLQkJCX0KLQkJCWVkaXRvci5zZXRGb2N1cygpOwotCQl9IGVsc2UgewotCQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRDbGllbnQoZXhwYW5kZWRDb21wb3NpdGUpOwotCQkJZW5hYmxlU2VjdGlvbnMoZmFsc2UpOwotCQkJKChMYWJlbClleHBhbmRMYWJlbC5nZXRDb250cm9sKCkpLnNldFRleHQoKFN0cmluZykgKChJbWFnZUh5cGVybGluaykgZS5nZXRTb3VyY2UoKSkKLQkJCQkJLmdldERhdGEoIlRpdGxlIikpOyAvLyROT04tTkxTLTEkCi0JCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSAoSU1ldGhvZFJpY2hUZXh0KSBlLmdldEhyZWYoKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0VGV4dChyaWNoVGV4dC5nZXRUZXh0KCkpOwotCQkJY3RybF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChyaWNoVGV4dC5nZXRNb2RhbE9iamVjdCgpKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKHJpY2hUZXh0Ci0JCQkJCS5nZXRNb2RhbE9iamVjdEZlYXR1cmUoKSk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEZpbmRSZXBsYWNlQWN0aW9uKHJpY2hUZXh0LmdldEZpbmRSZXBsYWNlQWN0aW9uKCkpOwotCQkJZm9yIChJdGVyYXRvciBpID0gcmljaFRleHQuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF9leHBhbmRlZC5hZGRMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwgbGlzdGVuZXIKLQkJCQkJCS5nZXRMaXN0ZW5lcigpKTsKLQkJCX0KLQkJCWJvb2xlYW4gZWRpdGFibGUgPSAhVG5nVXRpbC5pc0xvY2tlZChwcm9jZXNzKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJaWYgKGVkaXRhYmxlKSB7Ci0JCQkJY3RybF9leHBhbmRlZC5zZXRGb2N1cygpOwotCQkJfQotCQkJc2V0QWN0aXZlUmljaFRleHRDb250cm9sKHJpY2hUZXh0KTsKLQkJfQotCQlmb3JtLmdldEJvZHkoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JCWRlc2NFeHBhbmRGbGFnID0gIWRlc2NFeHBhbmRGbGFnOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpcyBzdXBlcnNldCBvZiBzZWxlY3RlZAotCSAqIGNvbmZpZ3VyYXRpb24gb3Igbm90Ci0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tWYWxpZGl0eUZvclN1cGVyU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24gZGVmYXVsdENvbmZpZywKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCS8vIGdldCBkZWZhdWx0IHBsdWdpbnMgYW5kIHBhY2thZ2VzCi0JCUxpc3QgZGVmYXVsdFBsdWdpbnMgPSBkZWZhdWx0Q29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCQlMaXN0IGRlZmF1bHRQYWNrYWdlcyA9IGRlZmF1bHRDb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCi0JCS8vIGdldCBjb25maXVncmF0aW9uIHBsdWdpbnMgYW5kIHBhY2FrZ2VzCi0JCUxpc3QgcGFja2FnZXMgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQlMaXN0IHBsdWdpbnMgPSBjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0JCWJvb2xlYW4gcGx1Z2luQ29udGFpbnMgPSBmYWxzZTsKLQkJYm9vbGVhbiBwYWNrYWdlQ29udGFpbnMgPSBmYWxzZTsKLQkJaWYgKChwbHVnaW5zICE9IG51bGwpICYmICghKHBsdWdpbnMuaXNFbXB0eSgpKSkpIHsKLQkJCXBsdWdpbkNvbnRhaW5zID0gZGVmYXVsdFBsdWdpbnMuY29udGFpbnNBbGwocGx1Z2lucyk7Ci0JCX0KLQkJaWYgKChwYWNrYWdlcyAhPSBudWxsKSAmJiAoIShwYWNrYWdlcy5pc0VtcHR5KCkpKSkgewotCQkJcGFja2FnZUNvbnRhaW5zID0gZGVmYXVsdFBhY2thZ2VzLmNvbnRhaW5zQWxsKHBhY2thZ2VzKTsKLQkJfQotCi0JCXJldHVybiAocGx1Z2luQ29udGFpbnMpICYmIChwYWNrYWdlQ29udGFpbnMpOwotCX0KLQotCS8qKgotCSAqIFNldCBhY3RpdmUgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiAKLQkgKiBAcGFyYW0gY3RybAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woSU1ldGhvZFJpY2hUZXh0IGN0cmwpIHsKLQkJYWN0aXZlQ29udHJvbCA9IGN0cmw7Ci0JfQotCi0JLyoqCi0JICogR2V0IEFjdGl2ZSBSaWNoIHRleHQgY29udHJvbAotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCVJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgZ2V0QWN0aXZlUmljaFRleHRDb250cm9sKCkgewotCQlyZXR1cm4gYWN0aXZlQ29udHJvbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVTZWN0aW9ucyhib29sZWFuIGVuYWJsZSkgewotCQlnZW5lcmFsU2VjdGlvbi5zZXRWaXNpYmxlKGVuYWJsZSk7Ci0JCWlmIChlbmFibGUpIHsKLQkJCWdlbmVyYWxTZWN0aW9uLnNldEV4cGFuZGVkKGdlbmVyYWxTZWN0aW9uRXhwYW5kRmxhZyk7Ci0JCX0gZWxzZSB7Ci0JCQlnZW5lcmFsU2VjdGlvbkV4cGFuZEZsYWcgPSBnZW5lcmFsU2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQlnZW5lcmFsU2VjdGlvbi5zZXRFeHBhbmRlZChlbmFibGUpOwotCQl9Ci0KLQkJZGV0YWlsU2VjdGlvbi5zZXRWaXNpYmxlKGVuYWJsZSk7Ci0JCWlmIChlbmFibGUpIHsKLQkJCWRldGFpbFNlY3Rpb24uc2V0RXhwYW5kZWQoZGV0YWlsU2VjdGlvbkV4cGFuZEZsYWcpOwotCQl9IGVsc2UgewotCQkJZGV0YWlsU2VjdGlvbkV4cGFuZEZsYWcgPSBkZXRhaWxTZWN0aW9uLmlzRXhwYW5kZWQoKTsKLQkJCWRldGFpbFNlY3Rpb24uc2V0RXhwYW5kZWQoZW5hYmxlKTsKLQkJfQotCQljb25maWdTZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJaWYgKGVuYWJsZSkgewotCQkJY29uZmlnU2VjdGlvbi5zZXRFeHBhbmRlZChjb25maWdTZWN0aW9uRXhwYW5kRmxhZyk7Ci0JCX0gZWxzZSB7Ci0JCQljb25maWdTZWN0aW9uRXhwYW5kRmxhZyA9IGNvbmZpZ1NlY3Rpb24uaXNFeHBhbmRlZCgpOwotCQkJY29uZmlnU2VjdGlvbi5zZXRFeHBhbmRlZChlbmFibGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IG5hbWUgZm9yIHRoZSBmb3JtCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9ybVRleHQoKSB7Ci0KLQkJZm9ybS5zZXRUZXh0KExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0KHByb2Nlc3MpCi0JCQkJKyAiOiAiICsgbWV0aG9kRWxlbWVudC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmVmcmVzaCBmb3JtIG5hbWUKLQkgKiBAcGFyYW0gbmV3TmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hFbGVtZW50TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAobmV3TmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoKGN0cmxfbmFtZSAhPSBudWxsKSAmJiAhKGN0cmxfbmFtZS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQkJY3RybF9uYW1lLnJlbW92ZU1vZGlmeUxpc3RlbmVyKG5hbWVNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJY3RybF9uYW1lLnNldFRleHQobmV3TmFtZSk7Ci0JCQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5hbWVNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJc2V0Rm9ybVRleHQoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzRm9ybVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzRm9ybVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmVhZDViMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJvY2Vzc0Zvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgUHJvY2VzcyBmb3JtIHBhZ2VzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRm9ybVBhZ2UgZXh0ZW5kcyBCYXNlRm9ybVBhZ2UgewotCi0JcHJvdGVjdGVkIFByb2Nlc3MgcHJvY2VzczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGVkaXRvcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBmb3JtIGVkaXRvci4KLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIFRoZSB1bmlxdWUgSUQgZm9yIHRoZSBmb3JtIHBhZ2UuCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBmb3JtIHBhZ2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NGb3JtUGFnZShGb3JtRWRpdG9yIGVkaXRvciwgU3RyaW5nIGlkLCBTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIoZWRpdG9yLCBpZCwgdGl0bGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5CYXNlRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCi0JCS8vIEdldCB0aGUgUHJvY2VzcyBvYmplY3QgZnJvbSB0aGUgZWRpdG9yIGlucHV0LgotCQlNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgbWV0aG9kRWxlbWVudElucHV0ID0gKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0KLQkJT2JqZWN0IG9iaiA9IG1ldGhvZEVsZW1lbnRJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlwcm9jZXNzID0gKChQcm9jZXNzQ29tcG9uZW50KSBvYmopLmdldFByb2Nlc3MoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NGb3JtVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NGb3JtVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDBkMWMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzRm9ybVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29sdW1uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgdGhlIFByb2Nlc3MgZWRpdG9yIGZvcm0gcGFnZXMuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRm9ybVV0aWwgewotCi0JLyoqCi0JICogQ29udmVydHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGludG8gY29sdW1uIGRlc2NyaXB0b3JzIGxpc3QKLQkgKiBAcGFyYW0gc3RyCi0JICogQHJldHVybgotCSAqIAkJTGlzdCBvZiBjb2x1bW4gZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVMaXN0IHRvQ29sdW1uRGVzY3JpcHRvckxpc3QoU3RyaW5nIHN0cikgewotCQlFTGlzdCBjb2x1bW5EZXNjcmlwdG9ycyA9IG5ldyBCYXNpY0VMaXN0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0ciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5zLm5leHRUb2tlbigpOwotCQkJT2JqZWN0IGNvbHVtbkRlc2NyaXB0b3IgPSBQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwCi0JCQkJCS5nZXQodG9rZW4pOwotCQkJaWYgKGNvbHVtbkRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCWNvbHVtbkRlc2NyaXB0b3JzLmFkZChjb2x1bW5EZXNjcmlwdG9yKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sdW1uRGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGludG8gY29sdW1uIGRlc2NyaXB0b3JzIGFycmF5IGxpc3QKLQkgKiBAcGFyYW0gc3RyCi0JICogQHJldHVybgotCSAqIAkJQXJyYXkgaXN0IG9mIGNvbHVtbiBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sdW1uRGVzY3JpcHRvcltdIHRvQ29sdW1uRGVzY3JpcHRvcnMoU3RyaW5nIHN0cikgewotCQlMaXN0IGxpc3QgPSB0b0NvbHVtbkRlc2NyaXB0b3JMaXN0KHN0cik7Ci0JCUNvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5zID0gbmV3IENvbHVtbkRlc2NyaXB0b3JbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkoY29sdW1ucyk7Ci0JCXJldHVybiBjb2x1bW5zOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVDYXRlZ29yaWVzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVDYXRlZ29yaWVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZWVhZTdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlQ2F0ZWdvcmllc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBDYXRlZ29yaWVzIHBhZ2UgaW4gdGhlIFJvbGUgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZUNhdGVnb3JpZXNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInJvbGVDYXRlZ29yaWVzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUm9sZSByb2xlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZUNhdGVnb3JpZXNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuQ0FURUdPUklFU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXJvbGUgPSAoUm9sZSkgY29udGVudEVsZW1lbnQ7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQkJc2V0QWxsb3dDaGFuZ2UyKHRydWUpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRDYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldFJvbGVTZXRzKChSb2xlKSBvYmplY3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJUm9sZVNldCByb2xlU2V0ID0gKFJvbGVTZXQpIGl0Lm5leHQoKTsKLQkJCQkvLyBUT0RPOiBUZXN0IG9uLXRoZS1mbHkgY3JlYXRpb24gb2YgY2F0ZWdvcnkgY29udHJpYnV0b3IKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvUm9sZVNldChnZXRBY3Rpb25NYW5hZ2VyKCksCi0JCQkJCQlyb2xlU2V0LCByb2xlKTsKLQkJCQlpZiAodXNlZENhdGVnb3JpZXMuY29udGFpbnMocm9sZVNldCkpIHsKLQkJCQkJdXNlZENhdGVnb3JpZXMucmVtb3ZlKHJvbGVTZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlSb2xlU2V0IHJvbGVTZXQgPSAoUm9sZVNldCkgaXQubmV4dCgpOwotCQkJCS8vIFRPRE86IFRlc3Qgb24tdGhlLWZseSBjcmVhdGlvbiBvZiBjYXRlZ29yeSBjb250cmlidXRvcgotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbVJvbGVTZXQoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIHJvbGVTZXQsIHJvbGUpOwotCQkJCWlmICghdXNlZENhdGVnb3JpZXMuY29udGFpbnMocm9sZVNldCkpIHsKLQkJCQkJdXNlZENhdGVnb3JpZXMuYWRkKHJvbGVTZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMiA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKChSb2xlKSBvYmplY3QpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUN1c3RvbUNhdGVnb3J5IGN1c3RvbUNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBpdC5uZXh0KCk7Ci0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRUb0N1c3RvbUNhdGVnb3J5KAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBjdXN0b21DYXRlZ29yeSwgcm9sZSk7Ci0JCQkJaWYgKHVzZWRDYXRlZ29yaWVzLmNvbnRhaW5zKGN1c3RvbUNhdGVnb3J5KSkgewotCQkJCQl1c2VkQ2F0ZWdvcmllcy5yZW1vdmUoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlDdXN0b21DYXRlZ29yeSBjdXN0b21DYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbUN1c3RvbUNhdGVnb3J5KAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBjdXN0b21DYXRlZ29yeSwgcm9sZSk7Ci0JCQkJaWYgKCF1c2VkQ2F0ZWdvcmllcy5jb250YWlucyhjdXN0b21DYXRlZ29yeSkpIHsKLQkJCQkJdXNlZENhdGVnb3JpZXMuYWRkKGN1c3RvbUNhdGVnb3J5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHJvbGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ST0xFU0VUUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZzIoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuQ1VTVE9NX0NBVEVHT1JJRVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgQ2F0ZWdvcnlGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IEN1c3RvbUNhdGVnb3J5RmlsdGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVEZXNjcmlwdGlvblBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdhOTU0NTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ29udGVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBmb3IgdGhlIFJvbGUgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInJvbGVEZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9ST0xFID0gQXV0aG9yaW5nVUlUZXh0LkJBU0VfRUxFTUVOVF9URVhUOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9za2lsbHM7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX2Fzc2lnbjsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfc3lub255bXM7Ci0KLQlwcml2YXRlIFJvbGUgcm9sZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXJvbGUgPSAoUm9sZSkgY29udGVudEVsZW1lbnQ7Ci0JCW5vdGF0aW9uU2VjdGlvbk9uID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlzdXBlci5jcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQpOwotCQlsYWJlbF9iYXNlLnNldFRleHQoQkFTRV9ST0xFKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBTdGFmZmluZyBzZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU5vdGF0aW9uU2VjdGlvbkNvbnRlbnQoKSB7Ci0JCXN1cGVyLmNyZWF0ZU5vdGF0aW9uU2VjdGlvbkNvbnRlbnQoKTsKLQkJbm90YXRpb25TZWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LlNUQUZGSU5HX1NFQ1RJT05fTkFNRSk7Ci0JCW5vdGF0aW9uU2VjdGlvbi5zZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVRleHQuU1RBRkZJTkdfU0VDVElPTl9ERVNDKTsKLQkJY3RybF9za2lsbHMgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQlub3RhdGlvbkNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LlNLSUxMU19URVhULCA0MCwgNDAwLAotCQkJCU5PVEFUSU9OX1NFQ1RJT05fSUQpOwotCQljdHJsX2Fzc2lnbiA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCW5vdGF0aW9uQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuQVNTSUdOTUVOVF9BUFBST0FDSEVTX1RFWFQsCi0JCQkJNDAsIDQwMCwgTk9UQVRJT05fU0VDVElPTl9JRCk7Ci0JCWN0cmxfc3lub255bXMgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQlub3RhdGlvbkNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LlNZTk9OWU1TX1RFWFQsIDQwLCA0MDAsCi0JCQkJTk9UQVRJT05fU0VDVElPTl9JRCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCi0JCWZpbmFsIE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCi0JCWN0cmxfc2tpbGxzLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9za2lsbHMuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFJvbGVEZXNjcmlwdGlvbl9Ta2lsbHMoKSk7Ci0JCWN0cmxfc2tpbGxzLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfc2tpbGxzLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9za2lsbHM7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24pIHJvbGUKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0U2tpbGxzKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2Fzc2lnbi5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfYXNzaWduLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKSk7Ci0JCWN0cmxfYXNzaWduLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfYXNzaWduLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9hc3NpZ247Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24pIHJvbGUKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX3N5bm9ueW1zLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9zeW5vbnltcy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCkpOwotCQljdHJsX3N5bm9ueW1zLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfc3lub255bXMuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX3N5bm9ueW1zOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uKSByb2xlCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldFN5bm9ueW1zKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI3JlZnJlc2goYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJc3VwZXIucmVmcmVzaChlZGl0YWJsZSk7Ci0JCWN0cmxfc2tpbGxzLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9hc3NpZ24uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX3N5bm9ueW1zLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkRGF0YSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERhdGEoKSB7Ci0JCXN1cGVyLmxvYWREYXRhKCk7Ci0KLQkJU3RyaW5nIHNraWxscyA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24pIHJvbGUuZ2V0UHJlc2VudGF0aW9uKCkpCi0JCQkJLmdldFNraWxscygpOwotCQlTdHJpbmcgYXNzaWduID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbikgcm9sZS5nZXRQcmVzZW50YXRpb24oKSkKLQkJCQkuZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKTsKLQkJU3RyaW5nIHN5bm9ueW1zID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbikgcm9sZS5nZXRQcmVzZW50YXRpb24oKSkKLQkJCQkuZ2V0U3lub255bXMoKTsKLQotCQljdHJsX3NraWxscy5zZXRUZXh0KHNraWxscyA9PSBudWxsID8gIiIgOiBza2lsbHMpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfYXNzaWduLnNldFRleHQoYXNzaWduID09IG51bGwgPyAiIiA6IGFzc2lnbik7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9zeW5vbnltcy5zZXRUZXh0KHN5bm9ueW1zID09IG51bGwgPyAiIiA6IHN5bm9ueW1zKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gcm9sZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlJPTEVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgQ29udGVudEZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFJvbGUpOwotCQkJfQotCQl9OwotCi0JCS8vIFNldCBhZGRpdGlvbmFsIGZpbHRlciBmb3IgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IGNoZWNraW5nLgotCQkoKENvbnRlbnRGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJcm9sZSkgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlR3VpZGFuY2VQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZUd1aWRhbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZjcyOWI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlR3VpZGFuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuR3VpZGFuY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgR3VpZGFuY2UgcGFnZSBpbiB0aGUgUm9sZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVHdWlkYW5jZVBhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicm9sZUd1aWRhbmNlUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUm9sZSByb2xlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZUd1aWRhbmNlUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkdVSURBTkNFX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJcm9sZSA9IChSb2xlKSBjb250ZW50RWxlbWVudDsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTIodHJ1ZSk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIFVJSGVscGVyLmdldFNlbGVjdGVkR3VpZGFuY2VzKHJvbGUpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBHdWlkYW5jZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudC4KLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJcm9sZSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJCQkJCQkoQ2hlY2tsaXN0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQlyb2xlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQkoQ29uY2VwdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJcm9sZSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCShFeGFtcGxlKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJKFByYWN0aWNlKSBpdGVtLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSwgcm9sZSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQlyb2xlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCQkJCShTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCXJvbGUsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJKEd1aWRlbGluZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJcm9sZSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCQkJCQkoUmV1c2FibGVBc3NldCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gYWRkIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkidG8gIiArIHJvbGUuZ2V0VHlwZSgpLmdldE5hbWUoKQotCQkJCQkJCQkJCQkrICI6IiArIHJvbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gR3VpZGFuY2UgZm9yIHRoZSBtZXRob2QgZWxlbWVudC4KLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJcm9sZSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJCQkJCQkoQ2hlY2tsaXN0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQlyb2xlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQkoQ29uY2VwdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJcm9sZSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCShFeGFtcGxlKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJKFByYWN0aWNlKSBpdGVtLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSwgcm9sZSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQlyb2xlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCQkJCShTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJCXJvbGUsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJKEd1aWRlbGluZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJcm9sZSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCQkJCQkoUmV1c2FibGVBc3NldCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gcmVtb3ZlIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkiZnJvbSAiICsgcm9sZS5nZXRUeXBlKCkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkJCSsgIjoiICsgcm9sZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gcm9sZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IEd1aWRhbmNlRmlsdGVyKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXREZXNjcmlwdGlvblBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlU2V0RGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiMjU1ZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXREZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBmb3IgdGhlIERvbWFpbiBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXREZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicm9sZVNldERlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUm9sZVNldCByb2xlU2V0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVNldERlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJcm9sZVNldCA9IChSb2xlU2V0KSBjb250ZW50RWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHJvbGVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpOwotCQkJfQotCQl9OwotCi0JCS8vIHNldCBhZGRpdGlvbmFsIGZpbHRlciBmb3IgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IGNoZWNraW5nCi0JCSgoQ2F0ZWdvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJcm9sZVNldCkgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFM7Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZXNldF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NDlkZDdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlU2V0R3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgRG9tYWluIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEdyb3VwaW5nRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInJvbGVTZXRHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUm9sZVNldEdyb3VwaW5nIHJvbGVTZXRHcm91cGluZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJvbGVTZXRHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJcm9sZVNldEdyb3VwaW5nID0gKFJvbGVTZXRHcm91cGluZykgY29udGVudEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiByb2xlU2V0R3JvdXBpbmc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ST0xFU0VUUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKTsKLQkJCX0KLQkJfTsKLQotCQkvLyBzZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZwotCQkoKENhdGVnb3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCXJvbGVTZXRHcm91cGluZykgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVzZXRncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc2V0Z3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZXNldGdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc2V0Z3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVNldEdyb3VwaW5nUm9sZVNldHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlU2V0R3JvdXBpbmdSb2xlU2V0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYjJmMjg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlU2V0R3JvdXBpbmdSb2xlU2V0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFJvbGUgU2V0cyBwYWdlIGluIHRoZSBSb2xlIFNldCBHcm91cGluZyBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqIFRPRE86IFJlbmFtZSB0aGlzIGNsYXNzIHRvIFJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZSBhbmQgbW92ZSBpdCB0byB0aGUKLSAqIG9tLmlibS5ybWMuYXV0aG9yaW5nLnVpLnV0aWwuZm9ybXMgcGFja2FnZQotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEdyb3VwaW5nUm9sZVNldHMgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBSb2xlU2V0R3JvdXBpbmcgcm9sZVNldEdyb3VwaW5nOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVNldEdyb3VwaW5nUm9sZVNldHMoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ST0xFX1NFVFNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlyb2xlU2V0R3JvdXBpbmcgPSAoUm9sZVNldEdyb3VwaW5nKSBjb250ZW50RWxlbWVudDsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKFJvbGVTZXRHcm91cGluZykgb2JqZWN0KS5nZXRSb2xlU2V0cygpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksCi0JCQkJCXJvbGVTZXRHcm91cGluZywKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCksCi0JCQkJCWFkZEl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLAotCQkJCQlyb2xlU2V0R3JvdXBpbmcsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0cygpLAotCQkJCQlybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHJvbGVTZXRHcm91cGluZzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlJPTEVTRVRTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCk7Ci0JCQl9Ci0JCX07Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRSb2xlc1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlU2V0Um9sZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwMDNkODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRSb2xlc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNvbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFJvbGVzIHBhZ2UgaW4gdGhlIFJvbGUgU2V0IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRSb2xlc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicm9sZVNldFJvbGVzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUm9sZVNldCByb2xlU2V0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVNldFJvbGVzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LlJPTEVTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJcm9sZVNldCA9IChSb2xlU2V0KSBjb250ZW50RWxlbWVudDsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gKChSb2xlU2V0KSBvYmplY3QpLmdldFJvbGVzKCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwKLQkJCQkJcm9sZVNldCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpLCBhZGRJdGVtcywKLQkJCQkJLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwKLQkJCQkJcm9sZVNldCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpLCBybUl0ZW1zLAotCQkJCQktMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHJvbGVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ST0xFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDb250ZW50RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQlpZiAoZ2V0SGVscGVyKCkuaXNDb250cmlidXRvcigoQ29udGVudEVsZW1lbnQpIG9iaikpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlU2V0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlVGFza3NQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVRhc2tzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZGQ4MDVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlVGFza3NQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFRhc2tzIHBhZ2UgaW4gdGhlIFJvbGUgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza3NQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInJvbGVUYXNrc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFJvbGUgcm9sZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJvbGVUYXNrc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5UQVNLU19QQUdFX1RJVExFKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJcm9sZSA9IChSb2xlKSBjb250ZW50RWxlbWVudDsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UyKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UHJpbWFyeVRhc2tzKChSb2xlKSBvYmplY3QpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJTGlzdCBlbGVtZW50TGlzdCA9IHJldHJpZXZlVGFibGVWaWV3ZXJDb250ZW50cyh2aWV3ZXJfc2VsZWN0ZWQyKTsKLQkJCWZvciAoamF2YS51dGlsLkl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucyh0YXNrKSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQl0YXNrLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCksCi0JCQkJCQkJcm9sZSwgLTEpOwotCQkJCX0KLQkJCX0KLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCXRhc2suc2V0UGVyZm9ybWVkQnkobnVsbCk7Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMiA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRTZWNvbmRhcnlUYXNrcygoUm9sZSkgb2JqZWN0KQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwyKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwyKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJTGlzdCBlbGVtZW50TGlzdCA9IHJldHJpZXZlVGFibGVWaWV3ZXJDb250ZW50cyh2aWV3ZXJfc2VsZWN0ZWQpOwotCQkJZm9yIChqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKHRhc2spKSB7Ci0JCQkJCXRhc2suZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5hZGQocm9sZSk7Ci0JCQkJfQotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJdGFzay5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLnJlbW92ZShyb2xlKTsKLQkJCX0KLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiByb2xlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuVEFTS1M7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgQ29udGVudEZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFRhc2spOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVUYXNrc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVXb3JrUHJvZHVjdHNQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVdvcmtQcm9kdWN0c1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzEyMTBiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVdvcmtQcm9kdWN0c1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLldvcmtQcm9kdWN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFdvcmsgUHJvZHVjdHMgcGFnZSBpbiB0aGUgUm9sZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVXb3JrUHJvZHVjdHNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInJvbGVXb3JrUHJvZHVjdHNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBSb2xlIHJvbGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlV29ya1Byb2R1Y3RzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LldPUktfUFJPRFVDVFNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlyb2xlID0gKFJvbGUpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5jcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCXN1cGVyLmNyZWF0ZUZvcm1Db250ZW50KG1hbmFnZWRGb3JtKTsKLQkJY3RybF9hZGQyLnNldFZpc2libGUoZmFsc2UpOwotCQljdHJsX3JlbW92ZTIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuICgoUm9sZSkgb2JqZWN0KS5nZXRSZXNwb25zaWJsZUZvcigpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCByb2xlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIGFkZEl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0vLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcm1JdGVtcy5zaXplKCk7IGkrKykgewotLy8JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zZXRSZXNwb25zaWJsZVJvbGUoCi0vLwkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgKFdvcmtQcm9kdWN0KSBybUl0ZW1zLmdldChpKSwgbnVsbCk7Ci0vLwkJCX0KLQkJCQotCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCByb2xlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIHJtSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMiA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRNb2RpZmllZFdvcmtQcm9kdWN0cygoUm9sZSkgb2JqZWN0KQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHJvbGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgV29ya1Byb2R1Y3RGaWx0ZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza0NhdGVnb3JpZXNQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza0NhdGVnb3JpZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc5MGU3ODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tDYXRlZ29yaWVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DdXN0b21DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXNzZW5nZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBDYXRlZ29yaWVzIHBhZ2UgaW4gdGhlIFRhc2sgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFza0NhdGVnb3JpZXNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInRhc2tDYXRlZ29yaWVzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVGFzayB0YXNrOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGFza0NhdGVnb3JpZXNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuQ0FURUdPUklFU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXRhc2sgPSAoVGFzaykgY29udGVudEVsZW1lbnQ7Ci0vLwkJc2V0Q2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQkJc2V0QWxsb3dDaGFuZ2UyKHRydWUpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lcygoVGFzaykgb2JqZWN0KS50b0FycmF5KCk7CQkJCQotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyl7Ci0JCQkJT2JqZWN0IGRpc2NpcGxpbmUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYoZGlzY2lwbGluZSBpbnN0YW5jZW9mIERpc2NpcGxpbmUpewotLy8JCQkJCUxpc3QgZGlzY2lwbGluZXMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lcyh0YXNrKTsKLS8vCQkJCQlpZiAoZGlzY2lwbGluZXMgIT0gbnVsbCAmJiBkaXNjaXBsaW5lcy5zaXplKCkgPiAwKQl7Ci0vLwkJCQkJCU9iamVjdCBhc3NvY2lhdGVkRGlzY2lwbGluZSA9IGRpc2NpcGxpbmVzLmdldCgwKTsKLS8vCQkJCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQKLS8vCQkJCQkJLmZvcm1hdCgKLS8vCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzLAotLy8JCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0vLwkJCQkJCQkJCQl0YXNrLmdldE5hbWUoKSwKLS8vCQkJCQkJCQkJCVRuZ1V0aWwKLS8vCQkJCQkJCQkJCQkJLmdldExhYmVsV2l0aFBhdGgoYXNzb2NpYXRlZERpc2NpcGxpbmUpLAotLy8JCQkJCQkJCQkJKChEaXNjaXBsaW5lKSBkaXNjaXBsaW5lKS5nZXROYW1lKCkgfSk7Ci0vLwkJCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93V2FybmluZygKLS8vCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgbXNnKTsKLS8vCQkJCQkJcmV0dXJuOwotLy8JCQkJCX0KLQotCQkJCQkKLQkJCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRUb0Rpc2NpcGxpbmUoZ2V0QWN0aW9uTWFuYWdlcigpLAotCQkJCQkJKERpc2NpcGxpbmUpIGRpc2NpcGxpbmUsIHRhc2spOwotCQkJCQlpZiAodXNlZENhdGVnb3JpZXMuY29udGFpbnMoZGlzY2lwbGluZSkpIHsKLQkJCQkJCXVzZWRDYXRlZ29yaWVzLnJlbW92ZShkaXNjaXBsaW5lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbURpc2NpcGxpbmUoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIGRpc2NpcGxpbmUsIHRhc2spOwotCQkJCWlmICghdXNlZENhdGVnb3JpZXMuY29udGFpbnMoZGlzY2lwbGluZSkpIHsKLQkJCQkJdXNlZENhdGVnb3JpZXMuYWRkKGRpc2NpcGxpbmUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMiA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKChUYXNrKSBvYmplY3QpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUN1c3RvbUNhdGVnb3J5IGN1c3RvbUNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBpdC5uZXh0KCk7Ci0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRUb0N1c3RvbUNhdGVnb3J5KAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBjdXN0b21DYXRlZ29yeSwgdGFzayk7Ci0JCQkJaWYgKHVzZWRDYXRlZ29yaWVzLmNvbnRhaW5zKGN1c3RvbUNhdGVnb3J5KSkgewotCQkJCQl1c2VkQ2F0ZWdvcmllcy5yZW1vdmUoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlDdXN0b21DYXRlZ29yeSBjdXN0b21DYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbUN1c3RvbUNhdGVnb3J5KAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBjdXN0b21DYXRlZ29yeSwgdGFzayk7Ci0JCQkJaWYgKCF1c2VkQ2F0ZWdvcmllcy5jb250YWlucyhjdXN0b21DYXRlZ29yeSkpIHsKLQkJCQkJdXNlZENhdGVnb3JpZXMuYWRkKGN1c3RvbUNhdGVnb3J5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZzIoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuQ1VTVE9NX0NBVEVHT1JJRVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgQ2F0ZWdvcnlGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcjIoKSB7Ci0JCXJldHVybiBmaWx0ZXIyID0gbmV3IEN1c3RvbUNhdGVnb3J5RmlsdGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQl9Ci0JCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tEZXNjcmlwdGlvblBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0ZjVhNjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ29udGVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBmb3IgdGhlIFRhc2sgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInRhc2tEZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCQkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX1RBU0sgPSBBdXRob3JpbmdVSVRleHQuQkFTRV9FTEVNRU5UX1RFWFQ7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX2FsdGVybmF0aXZlczsKLQotCXByaXZhdGUgVGFzayB0YXNrOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGFza0Rlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJdGFzayA9IChUYXNrKSBjb250ZW50RWxlbWVudDsKLQkJcHVycG9zZU9uID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlzdXBlci5jcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQpOwotCQljdHJsX2FsdGVybmF0aXZlcyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkFMVEVSTkFUSVZFU19URVhULCA0MCwgNDAwLAotCQkJCURFVEFJTF9TRUNUSU9OX0lEKTsKLQkJbGFiZWxfYmFzZS5zZXRUZXh0KEJBU0VfVEFTSyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZERhdGEoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWREYXRhKCkgewotCQlzdXBlci5sb2FkRGF0YSgpOwotCQlTdHJpbmcgcHVycG9zZSA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24pIHRhc2suZ2V0UHJlc2VudGF0aW9uKCkpCi0JCQkJLmdldFB1cnBvc2UoKTsKLQkJU3RyaW5nIGFsdGVybmF0aXZlcyA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24pIHRhc2sKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldEFsdGVybmF0aXZlcygpOwotCQljdHJsX3B1cnBvc2Uuc2V0VGV4dChwdXJwb3NlID09IG51bGwgPyAiIiA6IHB1cnBvc2UpOyAvLyROT04tTkxTLTEkCQotCQljdHJsX2FsdGVybmF0aXZlcy5zZXRUZXh0KGFsdGVybmF0aXZlcyA9PSBudWxsID8gIiIgOiBhbHRlcm5hdGl2ZXMpOyAvLyROT04tTkxTLTEkCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQkJZmluYWwgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0KLQkJY3RybF9wdXJwb3NlLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9wdXJwb3NlLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpKTsKLQkJY3RybF9wdXJwb3NlLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfcHVycG9zZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfcHVycG9zZTsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbikgdGFzawotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRQdXJwb3NlKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9hbHRlcm5hdGl2ZXMuc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2FsdGVybmF0aXZlcy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpKTsKLQkJY3RybF9hbHRlcm5hdGl2ZXMuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9hbHRlcm5hdGl2ZXMuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2FsdGVybmF0aXZlczsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbikgdGFzawotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRBbHRlcm5hdGl2ZXMoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjcmVmcmVzaChib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBlZGl0YWJsZSkgewotCQlzdXBlci5yZWZyZXNoKGVkaXRhYmxlKTsKLQkJY3RybF9hbHRlcm5hdGl2ZXMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlRBU0tTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgQ29udGVudEZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFRhc2spOwotCQkJfQotCQl9OwotCi0JCS8vIFNldCBhZGRpdGlvbmFsIGZpbHRlciBmb3IgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IGNoZWNraW5nLgotCQkoKENvbnRlbnRGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJdGFzaykgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza19kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tHdWlkYW5jZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrR3VpZGFuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU0NzU3MWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tHdWlkYW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5HdWlkYW5jZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuVUlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgR3VpZGFuY2UgcGFnZSBpbiB0aGUgVGFzayBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tHdWlkYW5jZVBhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAidGFza0d1aWRhbmNlUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVGFzayB0YXNrOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGFza0d1aWRhbmNlUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkdVSURBTkNFX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJdGFzayA9IChUYXNrKSBjb250ZW50RWxlbWVudDsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBVSUhlbHBlci5nZXRTZWxlY3RlZEd1aWRhbmNlcyh0YXNrKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gR3VpZGFuY2VzIGZvciBjb250ZW50IGVsZW1lbnQuCi0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCXRhc2ssCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLAotCQkJCQkJCQkJKENoZWNrbGlzdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJdGFzaywKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksCi0JCQkJCQkJKENvbmNlcHQpIGl0ZW0sIC0xKTsKLQkJCQl9IAotCQkJCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCXRhc2ssCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwKLQkJCQkJCQkoRXhhbXBsZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCShQcmFjdGljZSkgaXRlbSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCksIHRhc2ssIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJdGFzaywKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwKLQkJCQkJCQkoU3VwcG9ydGluZ01hdGVyaWFsKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQl0YXNrLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCQkJCQkJCShHdWlkZWxpbmUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCXRhc2ssIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfVG9vbE1lbnRvcnMoKSwKLQkJCQkJCQkoVG9vbE1lbnRvcikgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJdGFzaywKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCQkJCQkoUmV1c2FibGVBc3NldCkgaXRlbSwgLTEpOwotCQkJCX0gCi0JCQkJZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gYWRkIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkidG8gIiArIHRhc2suZ2V0VHlwZSgpLmdldE5hbWUoKQotCQkJCQkJCQkJCQkrICI6IiArIHRhc2suZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gR3VpZGFuY2UgZm9yIHRoZSBtZXRob2QgZWxlbWVudC4KLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJdGFzaywKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJCQkJCQkoQ2hlY2tsaXN0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQl0YXNrLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQkoQ29uY2VwdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJdGFzaywKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCShFeGFtcGxlKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJKFByYWN0aWNlKSBpdGVtLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSwgdGFzaywgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQl0YXNrLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCQkJCShTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJCXRhc2ssCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJKEd1aWRlbGluZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJdGFzaywgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19Ub29sTWVudG9ycygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCXRhc2ssCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksCi0JCQkJCQkJKFJldXNhYmxlQXNzZXQpIGl0ZW0sIC0xKTsKLQkJCQl9IAotLy8JCQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEVzdGltYXRlKSB7Ci0vLwkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0vLwkJCQkJCQl0YXNrLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0VzdGltYXRlKCksCi0vLwkJCQkJCQludWxsLCAtMSk7Ci0vLwkJCQl9IAotCQkJCWVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkiVW5hYmxlIHRvIHJlbW92ZSBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJImZyb20gIiArIHRhc2suZ2V0VHlwZSgpLmdldE5hbWUoKQotCQkJCQkJCQkJCQkrICI6IiArIHRhc2suZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBHdWlkYW5jZUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza1JvbGVzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tSb2xlc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjE3NzRlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza1JvbGVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ29udGVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFJvbGVzIHBhZ2UgaW4gdGhlIFRhc2sgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrUm9sZXNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInRhc2tSb2xlc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFRhc2sgdGFzazsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGFza1JvbGVzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LlJPTEVTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJdGFzayA9IChUYXNrKSBjb250ZW50RWxlbWVudDsKLQkJYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlzZXRDYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMSh0cnVlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTIodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCVJvbGUgcm9sZSA9ICgoVGFzaykgb2JqZWN0KS5nZXRQZXJmb3JtZWRCeSgpOwotCQkJCWlmIChyb2xlICE9IG51bGwpCi0JCQkJCWxpc3QuYWRkKHJvbGUpOwotCQkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCS8vIEJlbG93IGxpbmUgaXMgbmVlZGVkIHRvIGRpc2FsbG93ZWQgcHJpbWFyeSBwZXJmb3JtZXIgYXMgYSBhZGRpdGlvbmFsIHBlcmZvcm1lci4KLQkJCUxpc3QgZWxlbWVudExpc3QgPSByZXRyaWV2ZVRhYmxlVmlld2VyQ29udGVudHModmlld2VyX3NlbGVjdGVkMik7Ci0JCQkvLyBCZWxvdyBsaW5lIGlzIG5lZWRlZCB0byB3YXJuIGJlZm9yZSBjaGFuZ2luZyBwcmltYXJ5IHBlcmZvcm1lci4KLQkJCUxpc3QgZWxlbWVudExpc3QxID0gcmV0cmlldmVUYWJsZVZpZXdlckNvbnRlbnRzKHZpZXdlcl9zZWxlY3RlZCk7Ci0JCQlib29sZWFuIG9rID0gdHJ1ZTsKLQkJCWlmKCFlbGVtZW50TGlzdDEuaXNFbXB0eSgpKXsKLQkJCQlTdHJpbmcgbmV3UHJpbWFyeVBlcmZvbWVyID0gKChSb2xlKWFkZEl0ZW1zLmdldCgwKSkuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy50YXNrUm9sZXNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbW9kaWZ5X21lc3NhZ2UsIChuZXcgU3RyaW5nW117bmV3UHJpbWFyeVBlcmZvbWVyfSkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHdhcm5pbmcgPSBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrUm9sZXNQYWdlX2NvbmZpcm1fdGl0bGU7Ci0JCQkJb2sgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbih3YXJuaW5nLCBtZXNzYWdlKTsKLQkJCX0KLQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnMoKChSb2xlKSBhZGRJdGVtcy5nZXQoMCkpKSAmJiBvaykgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHRhc2ssCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCksCi0JCQkJCQkoUm9sZSkgYWRkSXRlbXMuZ2V0KDApLCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCB0YXNrLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0VGFza19QZXJmb3JtZWRCeSgpLCBudWxsLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gKChUYXNrKSBvYmplY3QpLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gcmV0cmlldmVUYWJsZVZpZXdlckNvbnRlbnRzKHZpZXdlcl9zZWxlY3RlZCk7Ci0JCQlMaXN0IGFkZEl0ZW1zRmlsdGVyZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFkZEl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucygoKFJvbGUpIGFkZEl0ZW1zLmdldChpKSkpKSB7Ci0JCQkJCWFkZEl0ZW1zRmlsdGVyZWQuYWRkKGFkZEl0ZW1zLmdldChpKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFkZEl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIHRhc2ssCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksCi0JCQkJCQlhZGRJdGVtc0ZpbHRlcmVkLCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIHRhc2ssCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwKLQkJCQkJcm1JdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuUk9MRVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPQluZXcgQ29udGVudEZpbHRlciAoKXsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZih0YXNrLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgIT0gbnVsbCl7Ci0JCQkJCUxpc3QgbGlzdCA9IHRhc2suZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQkJCQkJZm9yKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KXsKLQkJCQkJCU9iamVjdCBuZXh0ID0gaXQubmV4dCgpOwotCQkJCQkJaWYobmV4dCBpbnN0YW5jZW9mIFJvbGUpewotCQkJCQkJCWlmKG9iaiA9PSBuZXh0KSByZXR1cm4gZmFsc2U7Ci0JCQkJCQkJaWYoIWNoZWNrQ29udHJpYnV0aW9uKChWYXJpYWJpbGl0eUVsZW1lbnQpbmV4dCwgb2JqKSkKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyMigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyMigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDb250ZW50RmlsdGVyICgpewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmKHRhc2suZ2V0UGVyZm9ybWVkQnkoKSAhPSBudWxsKXsKLQkJCQkJUm9sZSByb2xlID0gdGFzay5nZXRQZXJmb3JtZWRCeSgpOwotCQkJCQlpZihvYmogPT0gcm9sZSkgcmV0dXJuIGZhbHNlOwotCQkJCQlpZighY2hlY2tDb250cmlidXRpb24ocm9sZSwgb2JqKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBSb2xlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSb2xlIGZpbHRlcgotCSAqCi0JICovCi0JcHVibGljIGNsYXNzIFJvbGVGaWx0ZXIgZXh0ZW5kcyBDb250ZW50RmlsdGVyIHsKLQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJaWYodGFzay5nZXRQZXJmb3JtZWRCeSgpICE9IG51bGwpewotCQkJCVJvbGUgcm9sZSA9IHRhc2suZ2V0UGVyZm9ybWVkQnkoKTsKLQkJCQlpZihvYmogPT0gcm9sZSkgcmV0dXJuIGZhbHNlOwotCQkJCWlmKCFjaGVja0NvbnRyaWJ1dGlvbihyb2xlLCBvYmopKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFJvbGUpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENoZWNrIGNvbnRyaWJ1dGlvbgotCSAqIEBwYXJhbSBjb250cmlidXRvcgotCSAqIEBwYXJhbSBvYmoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjaGVja0NvbnRyaWJ1dGlvbihWYXJpYWJpbGl0eUVsZW1lbnQgY29udHJpYnV0b3IsIE9iamVjdCBvYmopewotCQlpZihUbmdVdGlsLmlzQ29udHJpYnV0b3IoY29udHJpYnV0b3IpICYmIG9iaiBpbnN0YW5jZW9mIFJvbGUpewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSBjb250cmlidXRvci5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZihlICE9IG51bGwpewotCQkJCWlmKGUuZXF1YWxzKG9iaikpIHJldHVybiBmYWxzZTsKLQkJCQlpZihUbmdVdGlsLmlzQ29udHJpYnV0b3IoZSkpCi0JCQkJCXJldHVybiBjaGVja0NvbnRyaWJ1dGlvbihlLCBvYmopOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrUm9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza1JvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrUm9sZXNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrUm9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrU3RlcHNQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza1N0ZXBzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZTZlYTJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrU3RlcHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLlNlY3Rpb25zT3JkZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5FZGl0b3JzQ29udGV4dEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Nb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlJlbW92ZUZyb21TZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU2VjdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5EZWNvcmF0ZWRGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5JbWFnZUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0KLS8qKgotICogVGhlIFN0ZXBzIHBhZ2UgaW4gdGhlIFRhc2sgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrU3RlcHNQYWdlIGV4dGVuZHMgQmFzZUZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAidGFza1N0ZXBzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVGV4dCBjdHJsX25hbWU7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZCwgY3RybF9kZWxldGUsIGN0cmxfdXAsIGN0cmxfZG93biwgY3RybF9vcmRlcmluZzsKLQotCXByaXZhdGUgVGFibGUgY3RybF9zdGVwczsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgc3RlcHNUYWJsZVZpZXdlcjsKLQotCXByaXZhdGUgU2VjdGlvbkxpc3QgYWxsU3RlcHM7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGFjdGl2ZUNvbnRyb2w7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZXNjRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dEVkaXRvciBjdHJsX2V4cGFuZGVkOwotCi0JcHJvdGVjdGVkIEltYWdlSHlwZXJsaW5rIGV4cGFuZExpbms7Ci0KLQlwcm90ZWN0ZWQgRGVjb3JhdGVkRmllbGQgZXhwYW5kTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBmb3JtU2VjdGlvbjsKLQotCXByb3RlY3RlZCBTZWN0aW9uIGdlbmVyYWxTZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlOwotCQotCXByb3RlY3RlZCBDb21wb3NpdGUgZ2VuZXJhbENvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgZXhwYW5kZWRDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGN0cmxfbWFpbmRlc2M7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHN0ZXBzVmlld2VyQ29udGVudFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXI7Ci0KLQlwcml2YXRlIFRhc2sgdGFzazsKLQotCXByaXZhdGUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uIGN1cnJlbnRTdGVwOwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBjb250ZW50TW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRhc2tTdGVwc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5TVEVQU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQmFzZUZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IG1ldGhvZEVsZW1lbnRJbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0OwotCQl0YXNrID0gKFRhc2spIG1ldGhvZEVsZW1lbnRJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtCi0JICogICAgICBtYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJc3VwZXIuY3JlYXRlRm9ybUNvbnRlbnQobWFuYWdlZEZvcm0pOwotCi0JCWZvcm0uc2V0VGV4dChMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dCh0YXNrKSArICI6ICIgKyB0YXNrLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3JtU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwgU2VjdGlvbi5OT19USVRMRSk7Ci0JCXsKLQkJCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCQlmb3JtU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJCWZvcm1TZWN0aW9uLnNldExheW91dChuZXcgVGFibGVXcmFwTGF5b3V0KCkpOwotCQl9Ci0JCS8vIENyZWF0ZSB0aGUgY29tcG9zaXRlIGZvciB0aGUgc2VjdGlvbnMuCi0JCXNlY3Rpb25Db21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShmb3JtU2VjdGlvbiwgU1dULk5PTkUpOwotCQlzZWN0aW9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IFRhYmxlV3JhcExheW91dCgpKTsKLQkJZm9ybVNlY3Rpb24uc2V0Q2xpZW50KHNlY3Rpb25Db21wb3NpdGUpOwotCi0JCS8vIENyZWF0ZSB0aGUgR2VuZXJhbCBJbmZvcm1hdGlvbiBzZWN0aW9uLgotCQlnZW5lcmFsU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihzZWN0aW9uQ29tcG9zaXRlLAotCQkJCVNlY3Rpb24uVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRQotCQkJCQkJfCBTZWN0aW9uLkVYUEFOREVEKTsKLQkJZ2VuZXJhbFNlY3Rpb24KLQkJCQkuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5TVEVQU19TRUNUSU9OX05BTUUpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVRleHQuU1RFUFNfU0VDVElPTl9ERVNDKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWdlbmVyYWxDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShnZW5lcmFsU2VjdGlvbik7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKSk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldENsaWVudChnZW5lcmFsQ29tcG9zaXRlKTsKLQotCQlFZGl0b3JzQ29udGV4dEhlbHBlci5zZXRIZWxwKGdlbmVyYWxDb21wb3NpdGUuZ2V0UGFyZW50KCksIHRhc2spOwotCi0JCUNvbXBvc2l0ZSBwYW5lMSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxDb21wb3NpdGUpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEudmVydGljYWxTcGFuID0gMTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJCXBhbmUxLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJcGFuZTEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl9Ci0KLQkJTGFiZWwgbF9uYW1lID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYW5lMSwgQXV0aG9yaW5nVUlUZXh0LlNURVBTX1RFWFQpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJbF9uYW1lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9zdGVwcyA9IHRvb2xraXQuY3JlYXRlVGFibGUocGFuZTEsIFNXVC5NVUxUSSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMTUwOwotCQkJY3RybF9zdGVwcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWluaXRQcm92aWRlcnMoKTsKLQotCQlzdGVwc1RhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfc3RlcHMpOwotCQlzdGVwc1RhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihzdGVwc1ZpZXdlckNvbnRlbnRQcm92aWRlcik7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXIpOwotCi0JCUNvbXBvc2l0ZSBwYW5lMiA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxDb21wb3NpdGUpOwotCQlwYW5lMi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKSk7Ci0JCXBhbmUyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQljdHJsX2FkZCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhbmUyLCBBdXRob3JpbmdVSVRleHQuQUREX0JVVFRPTl9URVhULAotCQkJCVNXVC5OT05FKTsKLQkJY3RybF9hZGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3RybF9kZWxldGUgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYW5lMiwKLQkJCQlBdXRob3JpbmdVSVRleHQuREVMRVRFX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCWN0cmxfZGVsZXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljdHJsX2RlbGV0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQljdHJsX3VwID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFuZTIsIEF1dGhvcmluZ1VJVGV4dC5VUF9CVVRUT05fVEVYVCwKLQkJCQlTV1QuTk9ORSk7Ci0JCWN0cmxfdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJY3RybF9kb3duID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFuZTIsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRPV05fQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJY3RybF9kb3duLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJY3RybF9vcmRlcmluZyA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhbmUyLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5PUkRFUl9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQljdHJsX29yZGVyaW5nLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCS8vIG5hbWUKLQkJTGFiZWwgbmFtZUxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5TVEVQX05BTUVfVEVYVCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0JCQluYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY3RybF9uYW1lID0gdG9vbGtpdC5jcmVhdGVUZXh0KGdlbmVyYWxDb21wb3NpdGUsICIiLCBTV1QuU0lOR0xFKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQkJY3RybF9uYW1lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3JlYXRlQmxhbmtMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCA0KTsKLQotCQljdHJsX21haW5kZXNjID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmsoCi0JCQkJdG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1RFWFQsCi0JCQkJMjUwLCAzMDAsIDQpOwotCi0JCWNyZWF0ZVJpY2hUZXh0RWRpdG9yU2VjdGlvbigpOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTIpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihnZW5lcmFsQ29tcG9zaXRlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZXhwYW5kZWRDb21wb3NpdGUpOwotCi0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQkJbG9hZERhdGEoKTsKLQkJZW5hYmxlQ29udHJvbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzIHRvIG1vbml0b3IgZm9jdXMgYW5kIG1vZGlmaWNhdGlvbiBjaGFuZ2VzIGluIHRoZSBlZGl0Ci0JICogY29udHJvbHMuCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlmaW5hbCBNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQkJY29udGVudE1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKGN1cnJlbnRTdGVwKTsKLQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCS5zZXREaXNhYmxlKHRydWUpOwotCi0JCWZvcm0uYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0vLwkJCQlJU3RhdHVzIHN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KChFT2JqZWN0KSB0YXNrLCBnZXRTaXRlKCkKLS8vCQkJCQkJLmdldFNoZWxsKCkpOwotLy8JCQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLS8vCQkJCQlsb2FkRGF0YSgpOwotLy8JCQkJfQotCQkJCWxvYWREYXRhKCk7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWVuYWJsZUNvbnRyb2xzKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX2FkZC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQljaGVja1NlbGVjdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZm9ybS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWRlYWN0aXZhdGUoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZm9ybS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJaWYgKGN0cmxfZXhwYW5kZWQgIT0gbnVsbCkgewotCQkJCQkoKEdyaWREYXRhKSBjdHJsX2V4cGFuZGVkLmdldExheW91dERhdGEoKSkuaGVpZ2h0SGludCA9IGdldFJpY2hUZXh0RWRpdG9ySGVpZ2h0KCk7Ci0JCQkJCSgoR3JpZERhdGEpIGN0cmxfZXhwYW5kZWQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCk7Ci0JCQkJfQotCQkJCWZvcm1TZWN0aW9uLmxheW91dCh0cnVlLCB0cnVlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY29udHJvbE1vdmVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX25hbWUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWlmIChjdXJyZW50U3RlcCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY3VycmVudFN0ZXAuZ2V0TmFtZSgpOwotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGN0cmxfbmFtZS5nZXRUZXh0KCk7Ci0JCQkJCWlmIChjdHJsX25hbWUuZ2V0VGV4dCgpID09IG51bGwKLQkJCQkJCQl8fCBjdHJsX25hbWUuZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lRGlhbG9nX3RpdGxlLCBMaWJyYXJ5VUlUZXh0LlRFWFRfU1RFUCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2csIFN0clV0aWwudG9Mb3dlcihMaWJyYXJ5VUlUZXh0LlRFWFRfU1RFUCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnKTsKLQkJCQkJCWN0cmxfbmFtZS5zZXRTZWxlY3Rpb24oMCwgb2xkQ29udGVudC5sZW5ndGgoKSk7Ci0JCQkJCX0gZWxzZSBpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBjdXJyZW50U3RlcCwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX21haW5kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfbWFpbmRlc2MuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlzYXZlTWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJY2hlY2tTZWxlY3Rpb24oKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCWN0cmxfYWRkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiBjaGlsZCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlU2VjdGlvbigpOwotCQkJCVN0cmluZyBuZXdOYW1lID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQlBdXRob3JpbmdVSVRleHQuTkVXX0VMRU1FTlRfVEVYVCwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7IExpYnJhcnlVSVRleHQuVEVYVF9TVEVQIH0pOwotCQkJCWNoaWxkLnNldE5hbWUobmV3TmFtZSk7Ci0JCQkJQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQgY21kID0gbmV3IEFkZFRvU2VjdGlvbkxpc3RDb21tYW5kKHRhc2ssCi0JCQkJCQljaGlsZCwgYWxsU3RlcHMpOwotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJc3RlcHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJc3RlcHNUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY2hpbGQpKTsKLQkJCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQljdHJsX25hbWUuc2V0U2VsZWN0aW9uKDAsIG5ld05hbWUubGVuZ3RoKCkpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX2RlbGV0ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24udG9MaXN0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24pIHsKLQkJCQkJCVJlbW92ZUZyb21TZWN0aW9uTGlzdCBjbWQgPSBuZXcgUmVtb3ZlRnJvbVNlY3Rpb25MaXN0KAotCQkJCQkJCQl0YXNrLCAob3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uKSBvLCBhbGxTdGVwcyk7Ci0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXN0ZXBzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCWVkaXRTdGVwKG51bGwpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX3VwLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCi0JCQkJQXJyYXlMaXN0IG1vdmVVcEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vdmVVcEl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCU1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCBjbWQgPSBuZXcgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kKAotCQkJCQkJdGFzaywgbW92ZVVwSXRlbXMsIGFsbFN0ZXBzLCAxKTsKLQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCi0JCQkJc3RlcHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZCh0YXNrKSkgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZCh0YXNrKSkgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2Rvd24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJQXJyYXlMaXN0IG1vdmVEb3duSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbW92ZURvd25JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQlNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQgY21kID0gbmV3IE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCgKLQkJCQkJCXRhc2ssIG1vdmVEb3duSXRlbXMsIGFsbFN0ZXBzLCAwKTsKLQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCi0JCQkJc3RlcHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZCh0YXNrKSkgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZCh0YXNrKSkgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX29yZGVyaW5nLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVNlY3Rpb25zT3JkZXJEaWFsb2cgZGxnID0gbmV3IFNlY3Rpb25zT3JkZXJEaWFsb2coCi0JCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJdGFzaywKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlN0ZXBzT3JkZXJEaWFsb2dfdGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlN0ZXBzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb24sIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnN0ZXBzX3RleHQpOyAvLyROT04tTkxTLTEkCi0JCQkJZGxnLm9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlQ29udHJvbHMoYm9vbGVhbiBlZGl0YWJsZSkgewotCQljdHJsX25hbWUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX21haW5kZXNjLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9hZGQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfZGVsZXRlLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljdHJsX3VwLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljdHJsX2Rvd24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfb3JkZXJpbmcuc2V0RW5hYmxlZCh0cnVlKTsKLQkJaWYgKGN0cmxfZXhwYW5kZWQgIT0gbnVsbCkgewotCQkJY3RybF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWFjdGl2YXRlKCkgewotCQkvLyBTYXZlIHRoZSBzdGVwIG9yZGVyLgotCQlpZiAoYWxsU3RlcHMgIT0gbnVsbCkgewotCQkJYWxsU3RlcHMuYXBwbHkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBjb250cm9scyB3aXRoIGRhdGEgZnJvbSB0aGUgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotCQlhbGxTdGVwcyA9IG51bGw7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIuc2V0SW5wdXQodGFzayk7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQllZGl0U3RlcChjdXJyZW50U3RlcCk7Ci0JfQotCi0JLyoqCi0JICogRWRpdCBjdXJyZW50IHN0ZXAuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVkaXRTdGVwKG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiBzdGVwKSB7Ci0JCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCS5zZXREaXNhYmxlKHRydWUpOwotCi0JCWlmIChjdHJsX21haW5kZXNjLmdldE1vZGlmaWVkKCkpIHsKLQkJCXNhdmVNYWluRGVzY3JpcHRpb24oKTsKLQkJfQotCi0JCWN1cnJlbnRTdGVwID0gc3RlcDsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChjdXJyZW50U3RlcCAhPSBudWxsKSB7Ci0JCQluYW1lID0gY3VycmVudFN0ZXAuZ2V0TmFtZSgpOwotCQkJZGVzYyA9IGN1cnJlbnRTdGVwLmdldFNlY3Rpb25EZXNjcmlwdGlvbigpOwotCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCX0KLQkJY3RybF9uYW1lLnNldFRleHQobmFtZSA9PSBudWxsID8gIiIgOiBuYW1lKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX21haW5kZXNjLnNldFRleHQoZGVzYyA9PSBudWxsID8gIiIgOiBkZXNjKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX21haW5kZXNjLnNldE1vZGFsT2JqZWN0KGN1cnJlbnRTdGVwKTsKLQkJY3RybF9tYWluZGVzYy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2VjdGlvbl9TZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCWlmIChzdGVwID09IG51bGwpIHsKLQkJCS8vIGNsb3NlIGFueSBGaW5kL1JlcGxhY2UgZGlhbG9nIG9wZW4gaW4gdGhlIFJURQotCQkJY3RybF9tYWluZGVzYy5nZXRGaW5kUmVwbGFjZUFjdGlvbigpLmRpc3Bvc2UoKTsKLQkJfQotCi0JCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCS5zZXRFbGVtZW50KGN1cnJlbnRTdGVwKTsKLQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJLnNldERpc2FibGUoY3VycmVudFN0ZXAgPT0gbnVsbCk7Ci0KLQkJZW5hYmxlQ29udHJvbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUgbmFtZSBhbmQgZGVzY3JpcHRpb24gY29udHJvbHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5hYmxlQ29udHJvbHMoKSB7Ci0JCWlmICh0YXNrLmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuY29udGFpbnMoY3VycmVudFN0ZXApKSB7Ci0JCQlpZiAoIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJY3RybF9uYW1lLnNldEVkaXRhYmxlKHRydWUpOwotCQkJCWN0cmxfbWFpbmRlc2Muc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX25hbWUuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJY3RybF9tYWluZGVzYy5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIGxpc3RlbmVyCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlUmljaFRleHRFZGl0b3JTZWN0aW9uKCkgewotCQlleHBhbmRlZENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGZvcm1TZWN0aW9uLCBTV1QuTk9ORSk7Ci0JCWV4cGFuZGVkQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCi0KLQkJLy8gSHlwZXJsaW5rIGRlc2MKLQkJZXhwYW5kTGluayA9IHRvb2xraXQuY3JlYXRlSW1hZ2VIeXBlcmxpbmsoZXhwYW5kZWRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZXhwYW5kTGluay5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfRVhQQU5ERUQpOwotCQlleHBhbmRMaW5rLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNsb3NlUlRFKTsgLy8kTk9OLU5MUy0xJAotCQlleHBhbmRMaW5rLnNldFVuZGVybGluZWQoZmFsc2UpOwotCQlleHBhbmRMaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJdG9nZ2xlKGUpOwotCQkJfQotCQl9KTsKLQotCQlleHBhbmRMYWJlbCA9IGNyZWF0ZURlY29yYXRlZExhYmVsKHRvb2xraXQsIGV4cGFuZGVkQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGUgRGVzY3JpcHRpb24gY29udHJvbCB0byBleHBhbmQgYW5kIGNvbnRyb2wgc3RhdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdG9nZ2xlKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJaWYgKGN1cnJlbnRTdGVwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChjdHJsX2V4cGFuZGVkID09IG51bGwpIHsKLQkJCWN0cmxfZXhwYW5kZWQgPSBjcmVhdGVSaWNoVGV4dEVkaXRvcih0b29sa2l0LCBleHBhbmRlZENvbXBvc2l0ZSwKLQkJCQkJU1dULk1VTFRJIHwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwsIEdyaWREYXRhLkZJTExfQk9USCwKLQkJCQkJZ2V0UmljaFRleHRFZGl0b3JIZWlnaHQoKSwgZ2V0UmljaFRleHRFZGl0b3JXaWR0aCgpLCAyLCBleHBhbmRMYWJlbCk7Ci0JCQljdHJsX2V4cGFuZGVkLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCX0KLQotCQlpZiAoZGVzY0V4cGFuZEZsYWcpIHsKLQkJCXNlY3Rpb25Db21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCQkJZm9ybVNlY3Rpb24uc2V0Q2xpZW50KHNlY3Rpb25Db21wb3NpdGUpOwotCQkJSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0ID0gYWN0aXZlQ29udHJvbDsKLQkJCXJpY2hUZXh0LnNldFRleHQoY3RybF9leHBhbmRlZC5nZXRUZXh0KCkpOwotCQkJZm9yIChJdGVyYXRvciBpID0gcmljaFRleHQuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF9leHBhbmRlZC5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwgbGlzdGVuZXIKLQkJCQkJCS5nZXRMaXN0ZW5lcigpKTsKLQkJCX0KLQkJCWlmIChjdHJsX2V4cGFuZGVkLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJLnNhdmVNb2RpZmllZFJpY2hUZXh0KGN0cmxfZXhwYW5kZWQpOwotCQkJfQotCQkJcmljaFRleHQuc2V0Rm9jdXMoKTsKLQkJfSBlbHNlIHsKLQkJCXNlY3Rpb25Db21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJZm9ybVNlY3Rpb24uc2V0Q2xpZW50KGV4cGFuZGVkQ29tcG9zaXRlKTsKLQkJCSgoTGFiZWwpZXhwYW5kTGFiZWwuZ2V0Q29udHJvbCgpKS5zZXRUZXh0KGN1cnJlbnRTdGVwLmdldE5hbWUoKSArCi0JCQkJCSIgLSAiICsgKFN0cmluZykgKChJbWFnZUh5cGVybGluaykgZS5nZXRTb3VyY2UoKSkuZ2V0RGF0YSgiVGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0ID0gKElNZXRob2RSaWNoVGV4dCkgZS5nZXRIcmVmKCk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldFRleHQocmljaFRleHQuZ2V0VGV4dCgpKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QocmljaFRleHQuZ2V0TW9kYWxPYmplY3QoKSk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0RmVhdHVyZShyaWNoVGV4dAotCQkJCQkuZ2V0TW9kYWxPYmplY3RGZWF0dXJlKCkpOwotCQkJY3RybF9leHBhbmRlZC5zZXRGaW5kUmVwbGFjZUFjdGlvbihyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpKTsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHJpY2hUZXh0LmdldExpc3RlbmVycygpOyBpLmhhc05leHQoKTspIHsKLQkJCQlSaWNoVGV4dExpc3RlbmVyIGxpc3RlbmVyID0gKFJpY2hUZXh0TGlzdGVuZXIpIGkubmV4dCgpOwotCQkJCWN0cmxfZXhwYW5kZWQuYWRkTGlzdGVuZXIobGlzdGVuZXIuZ2V0RXZlbnRUeXBlKCksIGxpc3RlbmVyCi0JCQkJCQkuZ2V0TGlzdGVuZXIoKSk7Ci0JCQl9Ci0JCQlib29sZWFuIGVkaXRhYmxlID0gIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpOwotCQkJY3RybF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQlpZiAoZWRpdGFibGUpIHsKLQkJCQljdHJsX2V4cGFuZGVkLnNldEZvY3VzKCk7Ci0JCQl9Ci0JCQlhY3RpdmVDb250cm9sID0gcmljaFRleHQ7Ci0JCX0KLQotCQlmb3JtLmdldEJvZHkoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JCWRlc2NFeHBhbmRGbGFnID0gIWRlc2NFeHBhbmRGbGFnOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UHJvdmlkZXJzKCkgewotCQlzdGVwc1ZpZXdlckNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCWlmIChhbGxTdGVwcyA9PSBudWxsKSB7Ci0JCQkJCWFsbFN0ZXBzID0gbmV3IFNlY3Rpb25MaXN0KHRhc2ssCi0JCQkJCQkJU2VjdGlvbkxpc3QuU1RFUFNfRk9SX0VMRU1FTlRfT05MWSk7Ci0JCQkJfQotCQkJCXJldHVybiBhbGxTdGVwcy50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJc3RlcHNWaWV3ZXJMYWJlbFByb3ZpZGVyID0gbmV3IFZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAhdGFzay5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmNvbnRhaW5zKGVsZW1lbnQpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlTWFpbkRlc2NyaXB0aW9uKCkgewotCQlpZiAoY3VycmVudFN0ZXAgIT0gbnVsbCkgewotCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJOiBjdHJsX21haW5kZXNjOwotCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9IGN1cnJlbnRTdGVwLmdldFNlY3Rpb25EZXNjcmlwdGlvbigpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoY29udHJvbCwKLQkJCQkJb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGN1cnJlbnRTdGVwLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdGlvbl9TZWN0aW9uRGVzY3JpcHRpb24oKSwKLQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBJQWN0aW9uTWFuYWdlciBnZXRBY3Rpb25NYW5hZ2VyKCkgewotCQlGb3JtRWRpdG9yIGVkaXRvciA9IGdldEVkaXRvcigpOwotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcikgewotCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZWRpdG9yKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrU2VsZWN0aW9uKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiAhVG5nVXRpbC5pc0xvY2tlZCh0YXNrKSkgewotCQkJY3RybF9kZWxldGUuc2V0RW5hYmxlZCh0cnVlKTsKLQotCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMAotCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZCh0YXNrKSAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCWlmIChzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKHRhc2spICYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJZWRpdFN0ZXAoKG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbikgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza1dvcmtQcm9kdWN0c1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrV29ya1Byb2R1Y3RzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OWVkNWM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrV29ya1Byb2R1Y3RzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuV29ya1Byb2R1Y3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgV29yayBQcm9kdWN0cyBwYWdlIGluIHRoZSBUYXNrIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFza1dvcmtQcm9kdWN0c1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAidGFza1dvcmtQcm9kdWN0c1BhZ2UiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBUYXNrIHRhc2s7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRhc2tXb3JrUHJvZHVjdHNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuV09SS19QUk9EVUNUU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXRhc2sgPSAoVGFzaykgY29udGVudEVsZW1lbnQ7Ci0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTIodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMyh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5jcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKFRhc2spIG9iamVjdCkuZ2V0TWFuZGF0b3J5SW5wdXQoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gcmV0cmlldmVUYWJsZVZpZXdlckNvbnRlbnRzKHZpZXdlcl9zZWxlY3RlZDIpOwotCQkJTGlzdCBhZGRJdGVtc0ZpbHRlcmVkID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRJdGVtcy5zaXplKCk7IGkrKykgewotCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnMoKChXb3JrUHJvZHVjdCkgYWRkSXRlbXMuZ2V0KGkpKSkpIHsKLQkJCQkJYWRkSXRlbXNGaWx0ZXJlZC5hZGQoYWRkSXRlbXMuZ2V0KGkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYWRkSXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgdGFzaywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwKLQkJCQkJCWFkZEl0ZW1zRmlsdGVyZWQsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgdGFzaywKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpLCBybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gKChUYXNrKSBvYmplY3QpLmdldE9wdGlvbmFsSW5wdXQoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSByZXRyaWV2ZVRhYmxlVmlld2VyQ29udGVudHModmlld2VyX3NlbGVjdGVkKTsKLQkJCUxpc3QgYWRkSXRlbXNGaWx0ZXJlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkSXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKCgoV29ya1Byb2R1Y3QpIGFkZEl0ZW1zLmdldChpKSkpKSB7Ci0JCQkJCWFkZEl0ZW1zRmlsdGVyZWQuYWRkKGFkZEl0ZW1zLmdldChpKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFkZEl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIHRhc2ssCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwKLQkJCQkJCWFkZEl0ZW1zRmlsdGVyZWQsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgdGFzaywKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCksIHJtSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDMoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMyA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKFRhc2spIG9iamVjdCkuZ2V0T3V0cHV0KCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQzLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDMoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgdGFzaywgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza19PdXRwdXQoKSwgYWRkSXRlbXMsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMyhBcnJheUxpc3Qgcm1JdGVtcykgewotCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIHRhc2ssCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKSwgcm1JdGVtcywgLTEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBXb3JrUHJvZHVjdEZpbHRlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcjIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcjIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgV29ya1Byb2R1Y3RGaWx0ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIzKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IFdvcmtQcm9kdWN0RmlsdGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Ub29sRGVzY3JpcHRpb25QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVG9vbERlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiODhkYjA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Ub29sRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBEb21haW4gZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInRvb2xEZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBUb29sIHRvb2w7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUb29sRGVzY3JpcHRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl0b29sID0gKFRvb2wpIGNvbnRlbnRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gdG9vbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgVG9vbCk7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gc2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcKLQkJKChDYXRlZ29yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQl0b29sKSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlRPT0xTOwotCX0KLQkKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50b29sX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Ub29sVG9vbE1lbnRvcnNQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVG9vbFRvb2xNZW50b3JzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYzdkMzBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Ub29sVG9vbE1lbnRvcnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuR3VpZGFuY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgVG9vbCBNZW50b3JzIHBhZ2UgaW4gdGhlIFRvb2wgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVG9vbFRvb2xNZW50b3JzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ0b29sVG9vbE1lbnRvcnNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUb29sIHRvb2w7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRvb2xUb29sTWVudG9yc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5UT09MX01FTlRPUlNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl0b29sID0gKFRvb2wpIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIHRvb2wuZ2V0VG9vbE1lbnRvcnMoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBjaGVjayBpZiB0aGlzIG9wZXJhdGlvbiB3aWxsIG1vZGlmeSB0aGUgZWxlbWVudCBpbiBvcHBvc2l0ZQotCQkJLy8gZmVhdHVyZSB2YWx1ZQotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoIVVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeU9wcG9zaXRlKHRvb2wsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3JzKCksIGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIHRvb2wsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2xfVG9vbE1lbnRvcnMoKSwgYWRkSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgdG9vbCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbF9Ub29sTWVudG9ycygpLCBybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRvb2w7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5UT09MX01FTlRPUlM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgR3VpZGFuY2VGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbFRvb2xNZW50b3JzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50b29sVG9vbE1lbnRvcnNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2MxYmI2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DdXN0b21DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXNzZW5nZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBDYXRlZ29yaWVzIHBhZ2UgaW4gdGhlIFdvcmsgUHJvZHVjdCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gIndvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkNBVEVHT1JJRVNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl3b3JrUHJvZHVjdCA9IChXb3JrUHJvZHVjdCkgY29udGVudEVsZW1lbnQ7Ci0JCXNldFVzZUNhdGVnb3J5Myh0cnVlKTsKLQkJc2V0Q2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldERvbWFpbnMoKFdvcmtQcm9kdWN0KSBvYmplY3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdCBkb21haW4gPSBhZGRJdGVtcy5nZXQoMCk7Ci0JCQlMaXN0IGRvbWFpbnMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXREb21haW5zKHdvcmtQcm9kdWN0KTsKLQkJCWlmIChkb21haW5zICE9IG51bGwgJiYgZG9tYWlucy5zaXplKCkgPiAwKQl7Ci0JCQkJT2JqZWN0IGFzc29jaWF0ZWREb21haW4gPSBkb21haW5zLmdldCgwKTsKLQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdAotCQkJCS5mb3JtYXQoCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzLAotCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJd29ya1Byb2R1Y3QuZ2V0TmFtZSgpLAotCQkJCQkJCQlUbmdVdGlsCi0JCQkJCQkJCQkJLmdldExhYmVsV2l0aFBhdGgoYXNzb2NpYXRlZERvbWFpbiksCi0JCQkJCQkJCSgoRG9tYWluKSBkb21haW4pLmdldE5hbWUoKSB9KTsKLQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd1dhcm5pbmcoCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgbXNnKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9Eb21haW4oZ2V0QWN0aW9uTWFuYWdlcigpLAotCQkJCQkoRG9tYWluKSBkb21haW4sIHdvcmtQcm9kdWN0KTsKLQkJCS8vIFN0YW5kYXJkIENhdGVnb3JpZXM6IGNvbnRyaWJ1dGluZyBzdGFuZGFyZAotCQkJLy8gY2F0ZWdvcnkgaXMgbm90IGRlbGV0ZWQgd2hlbiBpdCBpcyBlbXB0eQotCQkJaWYgKHVzZWRDYXRlZ29yaWVzLmNvbnRhaW5zKGRvbWFpbikpIHsKLQkJCQl1c2VkQ2F0ZWdvcmllcy5yZW1vdmUoZG9tYWluKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlEb21haW4gZG9tYWluID0gKERvbWFpbikgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbURvbWFpbigKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgZG9tYWluLCB3b3JrUHJvZHVjdCk7Ci0JCQkJLy8gU3RhbmRhcmQgQ2F0ZWdvcmllczogY29udHJpYnV0aW5nIHN0YW5kYXJkCi0JCQkJLy8gY2F0ZWdvcnkgaXMgbm90IGRlbGV0ZWQgd2hlbiBpdCBpcyBlbXB0eQotCQkJCWlmICghdXNlZENhdGVnb3JpZXMuY29udGFpbnMoZG9tYWluKSkgewotCQkJCQl1c2VkQ2F0ZWdvcmllcy5hZGQoZG9tYWluKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0V29ya1Byb2R1Y3RUeXBlcygKLQkJCQkJCShXb3JrUHJvZHVjdCkgb2JqZWN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoamF2YS51dGlsLkl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVdvcmtQcm9kdWN0VHlwZSB3cFR5cGUgPSAoV29ya1Byb2R1Y3RUeXBlKSBpdC5uZXh0KCk7Ci0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRUb1dvcmtQcm9kdWN0VHlwZSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgd3BUeXBlLCB3b3JrUHJvZHVjdCk7Ci0JCQkJLy8gU3RhbmRhcmQgQ2F0ZWdvcmllczogY29udHJpYnV0aW5nIHN0YW5kYXJkCi0JCQkJLy8gY2F0ZWdvcnkgaXMgbm90IGRlbGV0ZWQgd2hlbiBpdCBpcyBlbXB0eQotCQkJCWlmICh1c2VkQ2F0ZWdvcmllcy5jb250YWlucyh3cFR5cGUpKSB7Ci0JCQkJCXVzZWRDYXRlZ29yaWVzLnJlbW92ZSh3cFR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdFR5cGUgd3BUeXBlID0gKFdvcmtQcm9kdWN0VHlwZSkgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbVdvcmtQcm9kdWN0VHlwZSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgd3BUeXBlLCB3b3JrUHJvZHVjdCk7Ci0JCQkJaWYgKCF1c2VkQ2F0ZWdvcmllcy5jb250YWlucyh3cFR5cGUpKSB7Ci0JCQkJCXVzZWRDYXRlZ29yaWVzLmFkZCh3cFR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDMoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMyA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKAotCQkJCQkJKFdvcmtQcm9kdWN0KSBvYmplY3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkMy5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwzKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwzKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY3VzdG9tQ2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0Lm5leHQoKTsKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIGN1c3RvbUNhdGVnb3J5LCB3b3JrUHJvZHVjdCk7Ci0JCQkJaWYgKHVzZWRDYXRlZ29yaWVzLmNvbnRhaW5zKGN1c3RvbUNhdGVnb3J5KSkgewotCQkJCQl1c2VkQ2F0ZWdvcmllcy5yZW1vdmUoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMyhBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwzKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoamF2YS51dGlsLkl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY3VzdG9tQ2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0Lm5leHQoKTsKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUZyb21DdXN0b21DYXRlZ29yeSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgY3VzdG9tQ2F0ZWdvcnksIHdvcmtQcm9kdWN0KTsKLQkJCQlpZiAoIXVzZWRDYXRlZ29yaWVzLmNvbnRhaW5zKGN1c3RvbUNhdGVnb3J5KSkgewotCQkJCQl1c2VkQ2F0ZWdvcmllcy5hZGQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ET01BSU5TOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZzIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nMigpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFRZUEVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZzMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nMygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIERvbWFpbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyMigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyMigpIHsKLQkJcmV0dXJuIGZpbHRlcjIgPSBuZXcgQ2F0ZWdvcnlGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcjMoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcjMoKSB7Ci0JCXJldHVybiBmaWx0ZXIzID0gbmV3IEN1c3RvbUNhdGVnb3J5RmlsdGVyKCk7Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzhlZWQ2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLldvcmtQcm9kdWN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgRGVsaXZlcmFibGUgUGFydHMgcGFnZSBpbiB0aGUgV29yayBQcm9kdWN0IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV29ya1Byb2R1Y3Qgd29ya1Byb2R1Y3Q7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRFTElWRVJBQkxFX1BBUlRTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJRGVsaXZlcmFibGUgd3AgPSAoRGVsaXZlcmFibGUpIHdvcmtQcm9kdWN0OwotCQkJCXJldHVybiB3cC5nZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVdvcmtQcm9kdWN0IGl0ZW0gPSAoV29ya1Byb2R1Y3QpIGl0Lm5leHQoKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB3b3JrUHJvZHVjdCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSwgaXRlbSwKLQkJCQkJCS0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdCBpdGVtID0gKFdvcmtQcm9kdWN0KSBpdC5uZXh0KCk7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgd29ya1Byb2R1Y3QsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCksIGl0ZW0sCi0JCQkJCQktMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgV29ya1Byb2R1Y3RGaWx0ZXIoKSB7Ci0JCQkvKgotCQkJICogQXJyYXlMaXN0KGJhZGxpc3QpIGlzIHVzZWQgdG8gc3RvcmUgYWxsCi0JCQkgKiBnZW5lcmFsaXplci9iYXNldmFyaWFiaWxpdHkgZm9yIHN1YnBhcnRzIG9mCi0JCQkgKiBnZW5lcmFsaXplci9iYXNldmFyaWFiaWxpdHkgY2FuIGJlIHJlamVjdGVkLiBEZWxpdmVyYWJsZSBjYW5ub3QKLQkJCSAqIGhvbGQgaW5mb3JtYXRpb24gdG8gd2hvIGl0c2VsZiBpcyBhY3RpbmcgYXMgZGVsaXZlcmFibGUgcGFydC4KLQkJCSAqLwotCQkJTGlzdCBiYWRsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCQkvKiAKLQkJCQkJICogQ2hlY2sgRGVsaXZlcmFibGUgYW5kIERlbGl2ZXJhYmxlUGFydHMgYXNzb2NpYXRpb24KLQkJCQkJICogY2lyY3VsYXIgZGVwZW5kZW5jeS4KLQkJCQkJKi8KLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlCi0JCQkJCQkJJiYgd29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQkJLyoKLQkJCQkJCSAqIENoZWNrIHBhc3NlZCBvYmplY3QncyBjaGFpbmVkIGRlbGl2ZXJhYmxlIHBhcnRzCi0JCQkJCQkgKiAodHJlZSkgY29udGFpbiB3b3JrUHJvZHVjdCAoZWRpdG9yIG9iamVjdCkuCi0JCQkJCQkgKi8KLQkJCQkJCWlmICghVUlIZWxwZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcygKLQkJCQkJCQkJKERlbGl2ZXJhYmxlKSBvYmosIChEZWxpdmVyYWJsZSkgd29ya1Byb2R1Y3QpKSB7Ci0JCQkJCQkJYmFkbGlzdC5hZGQob2JqKTsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoIWNoZWNrVmFyaWFiaWxpdHkoKERlbGl2ZXJhYmxlKSBvYmosIGJhZGxpc3QpKSB7Ci0JCQkJCQkJYmFkbGlzdC5hZGQob2JqKTsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBicm93c2UgdGhyb3VnaCBiYWRsaXN0IGFuZCBpdHMgZGVsaXZlcmFibGUgcGFydHMuCi0JCQkJCQlMaXN0IHRlbXBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGJhZGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgYmFkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCVVJSGVscGVyLmRlbGl2ZXJhYmxlUGFydHNDaGFpbigoRGVsaXZlcmFibGUpIGJhZCwgdGVtcGxpc3QpOwotCQkJCQkJfQotCQkJCQkJaWYgKHRlbXBsaXN0LmNvbnRhaW5zKG9iaikpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCS8qCi0JCQkJCSAqIHJldHVybiB0cnVlIGlmIGFib3ZlIGNvbmRpdGlvbiBhcmUgc3VjY2Vzc2Z1bAotCQkJCQkgKi8KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja1ZhcmlhYmlsaXR5KERlbGl2ZXJhYmxlIGUsIExpc3QgYmFkbGlzdCkgewotCi0JCS8qCi0JCSAqIENoZWNrIGVkaXRvciBvYmplY3QncyB2YXJpYWJpbGl0eSBiYXNlIG9iamVjdCBpcyBjaGlsZCBpbgotCQkgKiBEZWxpdmVyYWJsZShlKSB0cmVlLiB0aGVuIERlbGl2ZXJhYmxlKGUpc2hvdWxkbm90IGJlIGFjY2VwdGVkLiBEMSAtPgotCQkgKiBEMiAtPiBEMyAoIC0+IGluZGljYXRlcyBkZWxpdmVyYWJsZSBwYXJ0IHJlbGF0aW9uc2hpcCkgRDYgY29udHJpYnV0ZXMKLQkJICogRDMuIEQ2IGNhbm5vdCBzZWxlY3QgRDEsRDIgYXMgZGVsaXZlcmFibGUgcGFydC4KLQkJICovCi0JCWlmICh3b3JrUHJvZHVjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJT2JqZWN0IG9iaiA9IHdvcmtQcm9kdWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmICghVUlIZWxwZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcyhlLCAoRGVsaXZlcmFibGUpIG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLyoKLQkJICogQ2hlY2sgZWRpdG9yIERlbGl2ZXJhYmxlJ3MgZ2VuZXJhbGl6ZXIsIGlmIGdlbmVyYWxpemVyJ3Mgc3VicGFydHMKLQkJICogKHRyZWUpIGNvbnRhaW5zIHBhc3NlZCBkZWxpdmVyYWJsZS4gUmV0dXJuIGZhbHNlLgotCQkgKi8KLQotCQlJdGVyYXRvciBpdCA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKHdvcmtQcm9kdWN0KTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCQkJaWYgKHZlICE9IG51bGwpIHsKLQkJCQkvKgotCQkJCSAqIGdlbmVyYWxpemVyIGlzIGFkZGVkIHRvIGJhZGxpc3QsIGJlY2F1c2UgaWYgdmFyaWFiaWxpdHkgYmFzZQotCQkJCSAqIGlzIGZpbHRlcmVkIGJlZm9yZSBjb21pbmcgdG8gY2hpbGRBY2NlcHQob2JqZWN0KSBtZXRob2QsIHRoaXMKLQkJCQkgKiB3aWxsIHByZXZlbnRzIGFueSBzdWJwYXJ0cyBvZiBnZW5lcmFsaXplciB0byBiZSBhZGRlZCBhcyBhCi0JCQkJICogZGVsaXZlcmFibGUgcGFydCBvZiBEZWxpdmVyYWJsZSAoRWRpdG9yIG9iamVjdCBvciBsb2NhbAotCQkJCSAqIGRlZmluZWQgdmFyaWFibGUid29ya1Byb2R1Y3QiKS4KLQkJCQkgKiAKLQkJCQkgKiBlZzogRDEgLT4gRDIgLT4gRDMuICgtPiBpbmRpY2F0ZXMgZGVsaXZlcmFibGUgcGFydCkuIEQxCi0JCQkJICogY29udHJpYnV0ZXMgRDUuIGFuZCBENSdzIGRlbGl2ZXJhYmxlIHBhcnRzIGFzc2lnbiBmaWx0ZXIKLQkJCQkgKiBzaG91bGRub3Qgc2hvdyBEMiBhbmQgRDMuCi0JCQkJICogCi0JCQkJICovCi0JCQkJYmFkbGlzdC5hZGQodmUpOwotCQkJCWlmICh2ZS5lcXVhbHMoZSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAoIVVJSGVscGVyLmNoZWNrQ2lyY3VsYXJEZWxpdmVyYWJsZXMoZSwgKERlbGl2ZXJhYmxlKSB2ZSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQl9Ci0JCS8qCi0JCSAqIAotCQkgKi8KLQkJaWYgKGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCU9iamVjdCBvYmogPSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmICghVUlIZWxwZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcygoRGVsaXZlcmFibGUpIG9iaiwKLQkJCQkJKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8qCi0JCSAqIENoZWNrIHBhc3NlZCBvYmplY3QncyBnZW5lcmFsaXplcidzIGRlbGl2ZXJhYmxlIHBhcnRzIGxpc3QgZG9ub3QgaGF2ZQotCQkgKiB3b3JrUHJvZHVjdC4KLQkJICovCi0JCUl0ZXJhdG9yIGl0MSA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKGUpOwotCQl3aGlsZSAoaXQxLmhhc05leHQoKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQxLm5leHQoKTsKLQkJCWlmICh2ZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHZlLmVxdWFscyhlKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmICghVUlIZWxwZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcygoRGVsaXZlcmFibGUpIHZlLAotCQkJCQkJKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQl9Ci0KLQkJLyoKLQkJICogQ2hlY2sgd29ya1Byb2R1Y3Qgb2JqZWN0IChlZGl0b3Igb2JqZWN0KSdzIHZhcmlhYmlsaXR5IGFuZCBpdHMKLQkJICogZGVsaXZlcmFibGVzIHNob3VsZCBub3QgY29udGFpbiBwYXNzZWQgb2JqZWN0LgotCQkgKi8KLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlkZWxpdmVyYWJsZVBhcnRzVmFyaWFiaWxpdHkoKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCwgbGlzdCk7Ci0JCWlmIChsaXN0LmNvbnRhaW5zKGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8qCi0JCSAqIENoZWNrIHBhc3NlZCBvYmplY3QgdmFyaWFiaWxpdHkgYW5kIGl0cyBkZWxpdmVyYWJsZXMgc2hvdWxkIG5vdAotCQkgKiBjb250YWluIHdvcmtwcm9kdWN0KGRlbGl2ZXJhYmxlIG9yIGVkaXRvciBvYmplY3QpLiBJZiBpdCBjb250YWlucywKLQkJICogcGFzc2VkIG9iamVjdCBzaG91bGRub3QgYmUgYWNjZXB0ZWQuCi0JCSAqLwotCQlkZWxpdmVyYWJsZVBhcnRzVmFyaWFiaWxpdHkoKERlbGl2ZXJhYmxlKSBlLCBsaXN0KTsKLQkJaWYgKGxpc3QuY29udGFpbnMod29ya1Byb2R1Y3QpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVsaXZlcmFibGVQYXJ0c1ZhcmlhYmlsaXR5KERlbGl2ZXJhYmxlIGUsIExpc3Qgcm9vdHMpIHsKLQkJTGlzdCBsaXN0ID0gKChEZWxpdmVyYWJsZSkgZSkuZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCk7Ci0JCWlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJaWYgKCgoRGVsaXZlcmFibGUpIG9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCXJvb3RzLmFkZCgoKERlbGl2ZXJhYmxlKSBvYmopCi0JCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJSXRlcmF0b3IgaXQxID0gVG5nVXRpbC5nZXRHZW5lcmFsaXplcnMoZSk7Ci0JCQkJCQl3aGlsZSAoaXQxLmhhc05leHQoKSkgewotCQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0MQotCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQlVSUhlbHBlci5kZWxpdmVyYWJsZVBhcnRzQ2hhaW4oKERlbGl2ZXJhYmxlKSB2ZSwgcm9vdHMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWRlbGl2ZXJhYmxlUGFydHNWYXJpYWJpbGl0eSgoRGVsaXZlcmFibGUpIG9iaiwgcm9vdHMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQlJdGVyYXRvciBpdDEgPSBUbmdVdGlsLmdldEdlbmVyYWxpemVycyhlKTsKLQkJCXdoaWxlIChpdDEuaGFzTmV4dCgpKSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQxLm5leHQoKTsKLQkJCQlVSUhlbHBlci5kZWxpdmVyYWJsZVBhcnRzQ2hhaW4oKERlbGl2ZXJhYmxlKSB2ZSwgcm9vdHMpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0RGVzY3JpcHRpb25QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTZkMDkzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Xb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuVUlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgaW4gYSBXb3JrIFByb2R1Y3QgKEFydGlmYWN0LCBEZWxpdmVyYWJsZSBhbmQgT3V0Y29tZSkKLSAqIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9pbXBhY3Q7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX3JlYXNvbjsKLQotCS8vIEZvciBBcnRpZmFjdAotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfYnJpZWZfb3V0bGluZTsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfcmVwcmVzZW50YXRpb25fb3B0aW9uczsKLQotCS8vIEZvciBEZWxpdmVyYWJsZQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfZXh0ZXJuYWxfZGVzYywgY3RybF9wYWNrYWdpbmdfZ3VpZGFuY2U7Ci0KLQlwcml2YXRlIFdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXdvcmtQcm9kdWN0ID0gKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudDsKLQkJcHVycG9zZU9uID0gdHJ1ZTsKLQkJZXh0ZXJuYWxJZE9uID0gdHJ1ZTsKLQkJaWYgKCEoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBPdXRjb21lKSkgewotCQkJbm90YXRpb25TZWN0aW9uT24gPSB0cnVlOwotCQl9Ci0JCXRhaWxvcmluZ1NlY3Rpb25PbiA9IHRydWU7Ci0JCWljb25TZWN0aW9uT24gPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2NyZWF0ZU5vdGF0aW9uU2VjdGlvbkNvbnRlbnQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU5vdGF0aW9uU2VjdGlvbkNvbnRlbnQoKSB7Ci0JCXN1cGVyLmNyZWF0ZU5vdGF0aW9uU2VjdGlvbkNvbnRlbnQoKTsKLQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWN0cmxfYnJpZWZfb3V0bGluZSA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCQlub3RhdGlvbkNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkJSSUVGX09VVExJTkVfVEVYVCwgNDAsCi0JCQkJCTQwMCwgTk9UQVRJT05fU0VDVElPTl9JRCk7Ci0JCQljdHJsX3JlcHJlc2VudGF0aW9uX29wdGlvbnMgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24oCi0JCQkJCXRvb2xraXQsIG5vdGF0aW9uQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSVRleHQuUkVQUkVTRU5UQVRJT05fT1BUSU9OU19URVhULCA0MCwgNDAwLAotCQkJCQlOT1RBVElPTl9TRUNUSU9OX0lEKTsKLQkJfSBlbHNlIGlmICh3b3JrUHJvZHVjdCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQljdHJsX2V4dGVybmFsX2Rlc2MgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQkJbm90YXRpb25Db21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5FWFRFUk5BTF9ERVNDUklQVElPTl9URVhULCA0MCwgNDAwLAotCQkJCQlOT1RBVElPTl9TRUNUSU9OX0lEKTsKLQkJCWN0cmxfcGFja2FnaW5nX2d1aWRhbmNlID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKAotCQkJCQl0b29sa2l0LCBub3RhdGlvbkNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0LlBBQ0tBR0lOR19HVUlEQU5DRV9URVhULCA0MCwgNDAwLAotCQkJCQlOT1RBVElPTl9TRUNUSU9OX0lEKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2NyZWF0ZVRhaWxvcmluZ1NlY3Rpb25Db250ZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWlsb3JpbmdTZWN0aW9uQ29udGVudCgpIHsKLQkJc3VwZXIuY3JlYXRlVGFpbG9yaW5nU2VjdGlvbkNvbnRlbnQoKTsKLQkJY3RybF9pbXBhY3QgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQl0YWlsb3JpbmdDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5JTVBBQ1RfT0ZfTk9UX0hBVklOR19URVhULAotCQkJCTQwLCA0MDAsIFRBSUxPUklOR19TRUNUSU9OX0lEKTsKLQkJY3RybF9yZWFzb24gPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQl0YWlsb3JpbmdDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlJFQVNPTl9GT1JfTk9UX05FRURJTkdfVEVYVCwgNDAsIDQwMCwKLQkJCQlUQUlMT1JJTkdfU0VDVElPTl9JRCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWZpbmFsIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJLmdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQotCQljdHJsX3B1cnBvc2Uuc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3B1cnBvc2Uuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpKTsKLQkJY3RybF9wdXJwb3NlLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfcHVycG9zZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfcHVycG9zZTsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24pIHdvcmtQcm9kdWN0Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldFB1cnBvc2UoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZXh0ZXJuYWxfaWQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9leHRlcm5hbF9pZC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24pIHdvcmtQcm9kdWN0Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldEV4dGVybmFsSWQoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWN0cmxfZXh0ZXJuYWxfaWQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjdHJsX2V4dGVybmFsX2lkLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfaW1wYWN0LnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9pbXBhY3Quc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKSk7Ci0JCWN0cmxfaW1wYWN0LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfaW1wYWN0LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9pbXBhY3Q7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRJbXBhY3RPZk5vdEhhdmluZygpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpLAotCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX3JlYXNvbi5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfcmVhc29uLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCkpOwotCQljdHJsX3JlYXNvbi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3JlYXNvbi5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfcmVhc29uOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbikgd29ya1Byb2R1Y3QKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKSwKLQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWN0cmxfYnJpZWZfb3V0bGluZS5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQljdHJsX2JyaWVmX291dGxpbmUuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpKTsKLQkJCWN0cmxfYnJpZWZfb3V0bGluZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJY3RybF9icmllZl9vdXRsaW5lLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCTogY3RybF9icmllZl9vdXRsaW5lOwotCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24pIHdvcmtQcm9kdWN0Ci0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRCcmllZk91dGxpbmUoKTsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCS5nZXRUZXh0KCkgOiBjdHJsX2JyaWVmX291dGxpbmUuZ2V0VGV4dCgpOwotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oCi0JCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwgY29udGVudEVsZW1lbnQKLQkJCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fQnJpZWZPdXRsaW5lKCksCi0JCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWN0cmxfcmVwcmVzZW50YXRpb25fb3B0aW9ucy5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudAotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJY3RybF9yZXByZXNlbnRhdGlvbl9vcHRpb25zCi0JCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKSk7Ci0JCQljdHJsX3JlcHJlc2VudGF0aW9uX29wdGlvbnMKLQkJCQkJLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQljdHJsX3JlcHJlc2VudGF0aW9uX29wdGlvbnMuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJCW5ldyBMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQkJOiBjdHJsX3JlcHJlc2VudGF0aW9uX29wdGlvbnM7Ci0JCQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKQotCQkJCQkJCQkJLmdldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpOwotCQkJCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJCQkJLm11c3RSZXN0b3JlVmFsdWUoY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyCi0JCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQkJY29udGVudEVsZW1lbnQKLQkJCQkJCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCksCi0JCQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQl9Ci0KLQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCWN0cmxfZXh0ZXJuYWxfZGVzYy5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQljdHJsX2V4dGVybmFsX2Rlc2Muc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKSk7Ci0JCQljdHJsX2V4dGVybmFsX2Rlc2MuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCWN0cmxfZXh0ZXJuYWxfZGVzYy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQk6IGN0cmxfZXh0ZXJuYWxfZGVzYzsKLQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpOwotCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCksCi0JCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJY3RybF9wYWNrYWdpbmdfZ3VpZGFuY2Uuc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJCWN0cmxfcGFja2FnaW5nX2d1aWRhbmNlLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpKTsKLQkJCWN0cmxfcGFja2FnaW5nX2d1aWRhbmNlLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQljdHJsX3BhY2thZ2luZ19ndWlkYW5jZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQk6IGN0cmxfcGFja2FnaW5nX2d1aWRhbmNlOwotCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pIHdvcmtQcm9kdWN0Ci0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRQYWNrYWdpbmdHdWlkYW5jZSgpOwotCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpLAotCQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNyZWZyZXNoKGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChib29sZWFuIGVkaXRhYmxlKSB7Ci0JCXN1cGVyLnJlZnJlc2goZWRpdGFibGUpOwotCQljdHJsX2ltcGFjdC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfcmVhc29uLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWN0cmxfYnJpZWZfb3V0bGluZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQljdHJsX3JlcHJlc2VudGF0aW9uX29wdGlvbnMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmICh3b3JrUHJvZHVjdCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQljdHJsX2V4dGVybmFsX2Rlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJY3RybF9wYWNrYWdpbmdfZ3VpZGFuY2Uuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZERhdGEoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWREYXRhKCkgewotCQlzdXBlci5sb2FkRGF0YSgpOwotCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBjb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24pIHdvcmtQcm9kdWN0Ci0JCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJU3RyaW5nIHB1cnBvc2UgPSBjb250ZW50LmdldFB1cnBvc2UoKTsKLQkJU3RyaW5nIGltcGFjdCA9IGNvbnRlbnQuZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKTsKLQkJU3RyaW5nIHJlYXNvbiA9IGNvbnRlbnQuZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQotCQljdHJsX3B1cnBvc2Uuc2V0VGV4dChwdXJwb3NlID09IG51bGwgPyAiIiA6IHB1cnBvc2UpOyAvLyROT04tTkxTLTEkCQotCQljdHJsX2ltcGFjdC5zZXRUZXh0KGltcGFjdCA9PSBudWxsID8gIiIgOiBpbXBhY3QpOyAvLyROT04tTkxTLTEkCQotCQljdHJsX3JlYXNvbi5zZXRUZXh0KHJlYXNvbiA9PSBudWxsID8gIiIgOiByZWFzb24pOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGV4dGVybmFsSWRPbikgewotCQkJU3RyaW5nIGV4dGVybmFsX2lkID0gY29udGVudC5nZXRFeHRlcm5hbElkKCk7Ci0JCQljdHJsX2V4dGVybmFsX2lkLnNldFRleHQoZXh0ZXJuYWxfaWQgPT0gbnVsbCA/ICIiIDogZXh0ZXJuYWxfaWQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJY3RybF9icmllZl9vdXRsaW5lCi0JCQkJCS5zZXRUZXh0KCgoQXJ0aWZhY3REZXNjcmlwdGlvbikgY29udGVudCkuZ2V0QnJpZWZPdXRsaW5lKCkgPT0gbnVsbCA/ICIiIDogKChBcnRpZmFjdERlc2NyaXB0aW9uKSBjb250ZW50KS5nZXRCcmllZk91dGxpbmUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWN0cmxfcmVwcmVzZW50YXRpb25fb3B0aW9ucwotCQkJCQkuc2V0VGV4dCgoKEFydGlmYWN0RGVzY3JpcHRpb24pIGNvbnRlbnQpCi0JCQkJCQkJLmdldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpID09IG51bGwgPyAiIiA6ICgoQXJ0aWZhY3REZXNjcmlwdGlvbikgY29udGVudCkuZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJY3RybF9leHRlcm5hbF9kZXNjCi0JCQkJCS5zZXRUZXh0KCgoRGVsaXZlcmFibGVEZXNjcmlwdGlvbikgY29udGVudCkKLQkJCQkJCQkuZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpID09IG51bGwgPyAiIiA6ICgoRGVsaXZlcmFibGVEZXNjcmlwdGlvbikgY29udGVudCkuZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJY3RybF9wYWNrYWdpbmdfZ3VpZGFuY2UKLQkJCQkJLnNldFRleHQoKChEZWxpdmVyYWJsZURlc2NyaXB0aW9uKSBjb250ZW50KQotCQkJCQkJCS5nZXRQYWNrYWdpbmdHdWlkYW5jZSgpID09IG51bGwgPyAiIiA6ICgoRGVsaXZlcmFibGVEZXNjcmlwdGlvbikgY29udGVudCkuZ2V0UGFja2FnaW5nR3VpZGFuY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBXb3JrUHJvZHVjdEZpbHRlcigpIHsKLQkJCUxpc3QgYmFkbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChzdXBlci5jaGlsZEFjY2VwdChvYmopKSB7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Ci0JCQkJCQkJCSYmICgoQ29udGVudEVsZW1lbnQpIGdldEhlbHBlcigpCi0JCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50KCkpLmdldFR5cGUoKS5lcXVhbHMoCi0JCQkJCQkJCQkJKChDb250ZW50RWxlbWVudCkgb2JqKS5nZXRUeXBlKCkpKSB7Ci0JCQkJCQkJLy8gcHJldmVudCBjaXJjdWxhciBkZXBlbmRlbmN5IGZyb20gZGVsaXZlcmFibGUKLQkJCQkJCQkvLyBwYXJ0cyBhbmQgdmFyaWFiaWxpdHkKLQkJCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUKLQkJCQkJCQkJCSYmIHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJCQkJaWYgKCFVSUhlbHBlci5jaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKAotCQkJCQkJCQkJCShEZWxpdmVyYWJsZSkgb2JqLAotCQkJCQkJCQkJCShEZWxpdmVyYWJsZSkgd29ya1Byb2R1Y3QpKSB7Ci0JCQkJCQkJCQliYWRsaXN0LmFkZChvYmopOwotCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmICgoKERlbGl2ZXJhYmxlKSBvYmopCi0JCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpZiAoIVVJSGVscGVyCi0JCQkJCQkJCQkJCS5jaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKAotCQkJCQkJCQkJCQkJCShEZWxpdmVyYWJsZSkgKChEZWxpdmVyYWJsZSkgb2JqKQotCQkJCQkJCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwKLQkJCQkJCQkJCQkJCQkoRGVsaXZlcmFibGUpIHdvcmtQcm9kdWN0KSkgewotCQkJCQkJCQkJCWJhZGxpc3QuYWRkKG9iaik7Ci0JCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCUl0ZXJhdG9yIGl0MSA9IFRuZ1V0aWwKLQkJCQkJCQkJCQkuZ2V0R2VuZXJhbGl6ZXJzKChEZWxpdmVyYWJsZSkgb2JqKTsKLQkJCQkJCQkJd2hpbGUgKGl0MS5oYXNOZXh0KCkpIHsKLQkJCQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0MQotCQkJCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCQkJaWYgKHZlICE9IG51bGwpIHsKLQkJCQkJCQkJCQlpZiAodmUuZXF1YWxzKG9iaikpCi0JCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQkJCQlpZiAoIVVJSGVscGVyCi0JCQkJCQkJCQkJCQkuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcygKLQkJCQkJCQkJCQkJCQkJKERlbGl2ZXJhYmxlKSB2ZSwKLQkJCQkJCQkJCQkJCQkJKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCkpIHsKLQkJCQkJCQkJCQkJYmFkbGlzdC5hZGQob2JqKTsKLQkJCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQotCQkJCQkJCQl9Ci0JCQkJCQkJCS8vIGJyb3dzZSB0aHJvdWdoIGJhZGxpc3QgYW5kIGl0cyBkZWxpdmVyYWJsZQotCQkJCQkJCQkvLyBwYXJ0cy4KLQkJCQkJCQkJTGlzdCB0ZW1wbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGJhZGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJT2JqZWN0IGJhZCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJCVVJSGVscGVyLmRlbGl2ZXJhYmxlUGFydHNDaGFpbigKLQkJCQkJCQkJCQkJKERlbGl2ZXJhYmxlKSBiYWQsIHRlbXBsaXN0KTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAodGVtcGxpc3QuY29udGFpbnMob2JqKSkKLQkJCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gc2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcKLQkJKChDb250ZW50RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCXdvcmtQcm9kdWN0KSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBBcnRpZmFjdCl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5hcnRpZmFjdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXJ0aWZhY3RfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFydGlmYWN0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXJ0aWZhY3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLm5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXJ0aWZhY3Rfbm90YXRpb25TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnRhaWxvcmluZ1NlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFydGlmYWN0X2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBPdXRjb21lKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm91dGNvbWVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm91dGNvbWVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm91dGNvbWVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5vdXRjb21lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5ub3RhdGlvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm91dGNvbWVfbm90YXRpb25TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnRhaWxvcmluZ1NlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm91dGNvbWVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMub3V0Y29tZV9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcmFibGUpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsaXZlcmFibGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGl2ZXJhYmxlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZWxpdmVyYWJsZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGl2ZXJhYmxlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5ub3RhdGlvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGl2ZXJhYmxlX25vdGF0aW9uU2VjdGlvbl9kZXNjOwotCQkJdGhpcy50YWlsb3JpbmdTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZWxpdmVyYWJsZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZWxpdmVyYWJsZV9pY29uU2VjdGlvbl9kZXNjOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdEd1aWRhbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OGJjNjMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdEd1aWRhbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkd1aWRhbmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBHdWlkYW5jZSBwYWdlIGluIHRoZSBXb3JrIFByb2R1Y3QgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0OwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdEd1aWRhbmNlUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkdVSURBTkNFX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIFVJSGVscGVyLmdldFNlbGVjdGVkR3VpZGFuY2VzKHdvcmtQcm9kdWN0KTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gVGhlIGd1aWRhbmNlIGZvciB0aGUgY29udGVudCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCShDaGVja2xpc3QpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB3b3JrUHJvZHVjdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIChQcmFjdGljZSkgaXRlbSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCksCi0JCQkJCQkJd29ya1Byb2R1Y3QsIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXBvcnQpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFRlbXBsYXRlKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gYWRkIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkidG8gIgotCQkJCQkJCQkJCQkrIHdvcmtQcm9kdWN0LmdldFR5cGUoKS5nZXROYW1lKCkKLQkJCQkJCQkJCQkJKyAiOiIgKyB3b3JrUHJvZHVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gVGhlIGd1aWRhbmNlIGZvciB0aGUgY29udGVudCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB3b3JrUHJvZHVjdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIChQcmFjdGljZSkgaXRlbSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCksCi0JCQkJCQkJd29ya1Byb2R1Y3QsIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXBvcnQpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFRlbXBsYXRlKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gcmVtb3ZlIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkiZnJvbSAiCi0JCQkJCQkJCQkJCSsgd29ya1Byb2R1Y3QuZ2V0VHlwZSgpLmdldE5hbWUoKQotCQkJCQkJCQkJCQkrICI6IiArIHdvcmtQcm9kdWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBHdWlkYW5jZUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRlbXBsYXRlKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUmVwb3J0KQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvcikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFJvbGVzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0Um9sZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0MTk1NjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0Um9sZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBSb2xlcyBwYWdlIGluIHRoZSBXb3JrIFByb2R1Y3QgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqIFRPRE86IFJlbmFtZSB0aGlzIGNsYXNzIHRvIFdvcmtQcm9kdWN0Um9sZXNGb3JtUGFnZQotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RSb2xlc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3RSb2xlc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0OwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFJvbGVzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LlJPTEVTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldENhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTEoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTIoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRSZXNwb25zaWJsZVJvbGVzKChXb3JrUHJvZHVjdCkgb2JqZWN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSb2xlIHJvbGUgPSAoUm9sZSkgYWRkSXRlbXMuZ2V0KDApOwotCQkJaWYgKFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeU9wcG9zaXRlKHJvbGUsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwgd29ya1Byb2R1Y3QpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgcm9sZSwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwKLQkJCQkJCXdvcmtQcm9kdWN0LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0vLwkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuc2V0UmVzcG9uc2libGVSb2xlKGdldEFjdGlvbk1hbmFnZXIoKSwKLS8vCQkJCQl3b3JrUHJvZHVjdCwgbnVsbCk7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJUm9sZSByb2xlID0gKFJvbGUpIGl0ZXIubmV4dCgpOwotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHJvbGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwgd29ya1Byb2R1Y3QsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMiA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRNb2RpZmllZEJ5KChXb3JrUHJvZHVjdCkgb2JqZWN0KQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFRhc2tzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0VGFza3NQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM5NjU5ODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0VGFza3NQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFRhc2tzIHBhZ2UgaW4gdGhlIFdvcmsgUHJvZHVjdCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0VGFza3NQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gIndvcmtQcm9kdWN0VGFza3NQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBXb3JrUHJvZHVjdCB3b3JrUHJvZHVjdDsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUYXNrc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5UQVNLU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXdvcmtQcm9kdWN0ID0gKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudDsKLQkJYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlzZXRBbGxvd0NoYW5nZTEoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTIoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRNYW5kYXRvcnlJbnB1dFRvVGFza3MoCi0JCQkJCQkoV29ya1Byb2R1Y3QpIG9iamVjdCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJTGlzdCBlbGVtZW50TGlzdCA9IHJldHJpZXZlVGFibGVWaWV3ZXJDb250ZW50cyh2aWV3ZXJfc2VsZWN0ZWQyKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKHRhc2spKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHRhc2ssCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpLAotCQkJCQkJCXdvcmtQcm9kdWN0LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgdGFzaywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwKLQkJCQkJCXdvcmtQcm9kdWN0LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlMaXN0IHNlbGVjdGVkVGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJTGlzdCBhdmFpbGFibGVUYXNrc0xpc3QgPSBMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0QXZhaWxhYmxlVGFza3Mod29ya1Byb2R1Y3QpOwotCQkJCWlmIChhdmFpbGFibGVUYXNrc0xpc3QgIT0gbnVsbCAmJiBhdmFpbGFibGVUYXNrc0xpc3Quc2l6ZSgpID4gMCkgewotCQkJCQlmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpdCA9IGF2YWlsYWJsZVRhc2tzTGlzdC5pdGVyYXRvcigpOyBpdAotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCQkJaWYgKHRhc2suZ2V0T3B0aW9uYWxJbnB1dCgpLmNvbnRhaW5zKHdvcmtQcm9kdWN0KSkKLQkJCQkJCQlzZWxlY3RlZFRhc2tzLmFkZCh0YXNrKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gc2VsZWN0ZWRUYXNrcy50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSByZXRyaWV2ZVRhYmxlVmlld2VyQ29udGVudHModmlld2VyX3NlbGVjdGVkKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKHRhc2spKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHRhc2ssCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCksCi0JCQkJCQkJd29ya1Byb2R1Y3QsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB0YXNrLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCksCi0JCQkJCQl3b3JrUHJvZHVjdCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMygpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQzID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldE91dHB1dHRpbmdUYXNrcygKLQkJCQkJCShXb3JrUHJvZHVjdCkgb2JqZWN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDMuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMyhBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMyhBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB0YXNrLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKSwgd29ya1Byb2R1Y3QsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMyhBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwzKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHRhc2ssCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpLCB3b3JrUHJvZHVjdCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLldvcmtQcm9kdWN0X1Rhc2tzX011bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RUeXBlRGVzY3JpcHRpb25QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RUeXBlRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5MjlmMDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0VHlwZURlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBXb3JrIHByb2R1Y3QgVHlwZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0VHlwZURlc2NyaXB0aW9uUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ3b3JrUHJvZHVjdFR5cGVEZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdvcmtQcm9kdWN0VHlwZSB3b3JrUHJvZHVjdFR5cGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGVEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXdvcmtQcm9kdWN0VHlwZSA9IChXb3JrUHJvZHVjdFR5cGUpIGNvbnRlbnRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3RUeXBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgQ2F0ZWdvcnlGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpOwotCQkJfQotCQl9OwotCi0JCS8vIHNldCBhZGRpdGlvbmFsIGZpbHRlciBmb3IgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IGNoZWNraW5nCi0JCSgoQ2F0ZWdvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJd29ya1Byb2R1Y3RUeXBlKSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFRZUEVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrcHJvZHVjdHR5cGVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya3Byb2R1Y3R0eXBlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrcHJvZHVjdHR5cGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyZTZkODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLldvcmtQcm9kdWN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBXb3JrIFByb2R1Y3RzIHBhZ2UgaW4gdGhlIFdvcmsgUHJvZHVjdCBUeXBlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV29ya1Byb2R1Y3RUeXBlIHdvcmtQcm9kdWN0VHlwZTsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LldPUktfUFJPRFVDVFNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl3b3JrUHJvZHVjdFR5cGUgPSAoV29ya1Byb2R1Y3RUeXBlKSBjb250ZW50RWxlbWVudDsKLQkJYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKFdvcmtQcm9kdWN0VHlwZSkgb2JqZWN0KS5nZXRXb3JrUHJvZHVjdHMoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIHdvcmtQcm9kdWN0VHlwZSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0cygpLAotCQkJCQlhZGRJdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCB3b3JrUHJvZHVjdFR5cGUsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSwKLQkJCQkJcm1JdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdFR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgV29ya1Byb2R1Y3RGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCWlmIChnZXRIZWxwZXIoKS5pc0NvbnRyaWJ1dG9yKChDb250ZW50RWxlbWVudCkgb2JqKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNiNzM3MTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGZvcm0gcGFnZXMgZm9yIHRoZSBtZXRob2QgYW5kIHByb2Nlc3MgZWRpdG9ycy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9JUHJvYmxlbUNoYW5nZWRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZGM4ZTkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9JUHJvYmxlbUNoYW5nZWRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLQotLyoqCi0gKiAKLSAqIENvZGUgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudmlld3N1cHBvcnQuSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIgewotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHByb2JsZW1zIGNoYW5nZWQuIFRoaXMgY2FsbCBpcyBwb3N0ZWQgaW4gYW4gYXluY2ggZXhlYywgdGhlcmVmb3JlIHBhc3NlZAotCSAqIHJlc291cmNlcyBtdXN0IG5vdCBleGlzdC4KLQkgKiBAcGFyYW0gY2hhbmdlZFJlc291cmNlcyAgQSBzZXQgd2l0aCBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4gdGhhdAotCSAqIGRlc2NyaWJlIHRoZSByZXNvdXJjZXMgdGhhdCBoYWQgYW4gcHJvYmxlbSBjaGFuZ2UuCi0JICogQHBhcmFtIGlzTWFya2VyQ2hhbmdlIElmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIGNoYW5nZSB3YXMgYSBtYXJrZXIgY2hhbmdlLCBpZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIGNoYW5nZSBjYW1lIGZyb20gYW4gYW5ub3RhdGlvbiBtb2RlbCBtb2RpZmljYXRpb24uCi0JICovCi0Jdm9pZCBwcm9ibGVtc0NoYW5nZWQoSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcywgYm9vbGVhbiBpc01hcmtlckNoYW5nZSk7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9JbWFnZURlc2NyaXB0b3JSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNjM4NTI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9JbWFnZURlc2NyaXB0b3JSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIAotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS52aWV3c3VwcG9ydC5JbWFnZURlc2NyaXB0b3JSZWdpc3RyeQotICoKLSAqLwotcHVibGljIGNsYXNzIEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5IHsKLQotCXByaXZhdGUgSGFzaE1hcDxJbWFnZURlc2NyaXB0b3IsIEltYWdlPiBmUmVnaXN0cnk9IG5ldyBIYXNoTWFwPEltYWdlRGVzY3JpcHRvciwgSW1hZ2U+KDEwKTsKLQlwcml2YXRlIERpc3BsYXkgZkRpc3BsYXk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGUgY3VycmVudCBvciBkZWZhdWx0IGRpc3BsYXksCi0JICogcmVzcGVjdGl2ZWx5LgotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJdGhpcyhBdXRob3JpbmdVSVBsdWdpbi5nZXRTdGFuZGFyZERpc3BsYXkoKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhlIGdpdmVuIGRpc3BsYXkuIEFsbCBpbWFnZXMKLQkgKiBtYW5hZ2VkIGJ5IHRoaXMgcmVnaXN0cnkgd2lsbCBiZSBkaXNwb3NlZCB3aGVuIHRoZSBkaXNwbGF5IGdldHMgZGlzcG9zZWQuCi0JICogCi0JICogQHBhcmFtIGRpc3BsYXkgdGhlIGRpc3BsYXkgdGhlIGltYWdlcyBtYW5hZ2VkIGJ5IHRoaXMgcmVnaXN0cnkgYXJlIGFsbG9jYXRlZCBmb3IgCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KERpc3BsYXkgZGlzcGxheSkgewotCQlmRGlzcGxheT0gZGlzcGxheTsKLQkJQXNzZXJ0LmlzTm90TnVsbChmRGlzcGxheSk7Ci0JCWhvb2tEaXNwbGF5KCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gaW1hZ2UgZGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvciB0aGUgaW1hZ2UgZGVzY3JpcHRvciBmb3Igd2hpY2ggdGhlIHJlZ2lzdHJ5IG1hbmFnZXMgYW4gaW1hZ2UKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGltYWdlIGRlc2NyaXB0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgaWYgdGhlIGltYWdlIGRlc2NyaXB0b3IgY2FuJ3QgY3JlYXRlIHRoZSByZXF1ZXN0ZWQgaW1hZ2UuCi0JICovCi0JcHVibGljIEltYWdlIGdldChJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKQotCQkJZGVzY3JpcHRvcj0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCQotCQlJbWFnZSByZXN1bHQ9IChJbWFnZSlmUmVnaXN0cnkuZ2V0KGRlc2NyaXB0b3IpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQotCQlBc3NlcnQuaXNUcnVlKGZEaXNwbGF5ID09IEF1dGhvcmluZ1VJUGx1Z2luLmdldFN0YW5kYXJkRGlzcGxheSgpLCAiQWxsb2NhdGluZyBpbWFnZSBmb3Igd3JvbmcgZGlzcGxheS4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQ9IGRlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJZlJlZ2lzdHJ5LnB1dChkZXNjcmlwdG9yLCByZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIGFsbCBpbWFnZXMgbWFuYWdlZCBieSB0aGlzIHJlZ2lzdHJ5LgotCSAqLwkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9IGZSZWdpc3RyeS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0JCQlJbWFnZSBpbWFnZT0gKEltYWdlKWl0ZXIubmV4dCgpOwotCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQl9Ci0JCWZSZWdpc3RyeS5jbGVhcigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaG9va0Rpc3BsYXkoKSB7Ci0JCWZEaXNwbGF5LmRpc3Bvc2VFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlkaXNwb3NlKCk7Ci0JCQl9CQotCQl9KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL0ltYWdlSW1hZ2VEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvSW1hZ2VJbWFnZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjc4NjRkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvSW1hZ2VJbWFnZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci0KLS8qKgotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS52aWV3c3VwcG9ydC5JbWFnZUltYWdlRGVzY3JpcHRvcgotICoKLSAqLwotcHVibGljIGNsYXNzIEltYWdlSW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgSW1hZ2VEZXNjcmlwdG9yIHsKLQotCXByaXZhdGUgSW1hZ2UgZkltYWdlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEltYWdJbWFnZURlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIEltYWdlSW1hZ2VEZXNjcmlwdG9yKEltYWdlIGltYWdlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZJbWFnZT0gaW1hZ2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSW1hZ2VEZXNjcmlwdG9yI2dldEltYWdlRGF0YSgpCi0JICovCi0JcHVibGljIEltYWdlRGF0YSBnZXRJbWFnZURhdGEoKSB7Ci0JCXJldHVybiBmSW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIChvYmogIT0gbnVsbCkgJiYgZ2V0Q2xhc3MoKS5lcXVhbHMob2JqLmdldENsYXNzKCkpICYmIGZJbWFnZS5lcXVhbHMoKChJbWFnZUltYWdlRGVzY3JpcHRvcilvYmopLmZJbWFnZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZkltYWdlLmhhc2hDb2RlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9NZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MGU3ODFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9NZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWxlbWVudFVJTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5Qcm9ibGVtc0xhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci0KLS8qKgotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5qYXZhZWRpdG9yLkphdmFFZGl0b3JFcnJvclRpY2tVcGRhdGVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIgaW1wbGVtZW50cyBJUHJvYmxlbUNoYW5nZWRMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnRFZGl0b3IgZk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci0JcHJpdmF0ZSBNZXRob2RFbGVtZW50VUlMYWJlbFByb3ZpZGVyIGZMYWJlbFByb3ZpZGVyOwotCi0JcHVibGljIE1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyKE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoZWRpdG9yKTsKLQkJZk1ldGhvZEVsZW1lbnRFZGl0b3I9IGVkaXRvcjsKLQkJZkxhYmVsUHJvdmlkZXI9IG5ldyBNZXRob2RFbGVtZW50VUlMYWJlbFByb3ZpZGVyKCk7Ci0JCWZMYWJlbFByb3ZpZGVyLmFkZExhYmVsRGVjb3JhdG9yKG5ldyBQcm9ibGVtc0xhYmVsRGVjb3JhdG9yKG51bGwpKTsKLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByb2JsZW1NYXJrZXJNYW5hZ2VyKCkuYWRkTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIjcHJvYmxlbXNDaGFuZ2VkKElSZXNvdXJjZVtdLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHByb2JsZW1zQ2hhbmdlZChJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzLCBib29sZWFuIGlzTWFya2VyQ2hhbmdlKSB7Ci0JCWlmICghaXNNYXJrZXJDaGFuZ2UpCi0JCQlyZXR1cm47Ci0KLQkJSUVkaXRvcklucHV0IGlucHV0PSBmTWV0aG9kRWxlbWVudEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIHsgLy8gbWlnaHQgcnVuIGFzeW5jLCB0ZXN0cyBuZWVkZWQKLQkJCU1ldGhvZEVsZW1lbnQgbWVsZW1lbnQgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dClpbnB1dCkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJaWYgKG1lbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCW1lbGVtZW50ID0gKChQcm9jZXNzQ29tcG9uZW50KSBtZWxlbWVudCkuZ2V0UHJvY2VzcygpOwotCQkJfQotCQkJaWYgKG1lbGVtZW50ICE9IG51bGwpIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2U9IFBlcnNpc3RlbmNlVXRpbC5nZXRXb3Jrc3BhY2VSZXNvdXJjZShtZWxlbWVudCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VkUmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChjaGFuZ2VkUmVzb3VyY2VzW2ldLmVxdWFscyhyZXNvdXJjZSkpIHsKLQkJCQkJCXVwZGF0ZUVkaXRvckltYWdlKG1lbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUVkaXRvckltYWdlKE1ldGhvZEVsZW1lbnQgbWVsZW1lbnQpIHsKLQkJSW1hZ2UgdGl0bGVJbWFnZT0gZk1ldGhvZEVsZW1lbnRFZGl0b3IuZ2V0VGl0bGVJbWFnZSgpOwotCQlpZiAodGl0bGVJbWFnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSW1hZ2UgbmV3SW1hZ2U7Ci0JCW5ld0ltYWdlPSBmTGFiZWxQcm92aWRlci5nZXRJbWFnZShtZWxlbWVudCk7Ci0JCWlmICh0aXRsZUltYWdlICE9IG5ld0ltYWdlKSB7Ci0JCQlwb3N0SW1hZ2VDaGFuZ2UobmV3SW1hZ2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvc3RJbWFnZUNoYW5nZShmaW5hbCBJbWFnZSBuZXdJbWFnZSkgewotCQlTaGVsbCBzaGVsbD0gZk1ldGhvZEVsZW1lbnRFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCk7Ci0JCWlmIChzaGVsbCAhPSBudWxsICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXNoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlmTWV0aG9kRWxlbWVudEVkaXRvci51cGRhdGVkVGl0bGVJbWFnZShuZXdJbWFnZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmTGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcm9ibGVtTWFya2VyTWFuYWdlcigpLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL01ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9NZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4ODIyMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL01ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbXBvc2l0ZUltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0vKioKLSAqIENvZGUgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yIHsKLQkKLQkvKiogRmxhZyB0byByZW5kZXIgdGhlIGVycm9yIGFkb3JubWVudC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFUlJPUj0JCQkweDA0MDsKLQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGZCYXNlSW1hZ2U7Ci0JcHJpdmF0ZSBpbnQgZkZsYWdzOwotCXByaXZhdGUgUG9pbnQgZlNpemU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IE1ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIGJhc2VJbWFnZSBhbiBpbWFnZSBkZXNjcmlwdG9yIHVzZWQgYXMgdGhlIGJhc2UgaW1hZ2UKLQkgKiBAcGFyYW0gZmxhZ3MgZmxhZ3MgaW5kaWNhdGluZyB3aGljaCBhZG9ybm1lbnRzIGFyZSB0byBiZSByZW5kZXJlZC4gU2VlIDxjb2RlPnNldEFkb3JubWVudHM8L2NvZGU+Ci0JICogCWZvciB2YWxpZCB2YWx1ZXMuCi0JICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBpbWFnZQotCSAqIEBzZWUgI3NldEFkb3JubWVudHMoaW50KQotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBiYXNlSW1hZ2UsIGludCBmbGFncywgUG9pbnQgc2l6ZSkgewotCQlmQmFzZUltYWdlPSBiYXNlSW1hZ2U7Ci0JCUFzc2VydC5pc05vdE51bGwoZkJhc2VJbWFnZSk7Ci0JCWZGbGFncz0gZmxhZ3M7Ci0JCUFzc2VydC5pc1RydWUoZkZsYWdzID49IDApOwotCQlmU2l6ZT0gc2l6ZTsKLQkJQXNzZXJ0LmlzTm90TnVsbChmU2l6ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGRlc2NyaXB0b3JzIGFkb3JubWVudHMuIFZhbGlkIHZhbHVlcyBhcmU6IDxjb2RlPkFCU1RSQUNUPC9jb2RlPiwgPGNvZGU+RklOQUw8L2NvZGU+LAotCSAqIDxjb2RlPlNZTkNIUk9OSVpFRDwvY29kZT4sIDwvY29kZT5TVEFUSUM8Y29kZT4sIDwvY29kZT5SVU5OQUJMRTxjb2RlPiwgPC9jb2RlPldBUk5JTkc8Y29kZT4sIAotCSAqIDwvY29kZT5FUlJPUjxjb2RlPiwgPC9jb2RlPk9WRVJSSURERVM8Y29kZT4sIDxjb2RlPklNUExFTUVOVFM8L2NvZGU+LCA8Y29kZT5DT05TVFJVQ1RPUjwvY29kZT4sCi0JICogPGNvZGU+REVQUkVDQVRFRDwvY29kZT4sICBvciBhbnkgY29tYmluYXRpb24gb2YgdGhvc2UuCi0JICogCi0JICogQHBhcmFtIGFkb3JubWVudHMgdGhlIGltYWdlIGRlc2NyaXB0b3JzIGFkb3JubWVudHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZG9ybm1lbnRzKGludCBhZG9ybm1lbnRzKSB7Ci0JCUFzc2VydC5pc1RydWUoYWRvcm5tZW50cyA+PSAwKTsKLQkJZkZsYWdzPSBhZG9ybm1lbnRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgYWRvcm5tZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGFkb3JubWVudHMKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFkcm9ubWVudHMoKSB7Ci0JCXJldHVybiBmRmxhZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UgY3JlYXRlZCBieSBjYWxsaW5nIDxjb2RlPmNyZWF0ZUltYWdlKCk8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIHRoZSBpbWFnZSByZXR1cm5lZCBmcm9tIGNhbGxpbmcgPGNvZGU+Y3JlYXRlSW1hZ2UoKTwvY29kZT4KLQkgKiBAc2VlIEltYWdlRGVzY3JpcHRvciNjcmVhdGVJbWFnZSgpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2VTaXplKFBvaW50IHNpemUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChzaXplKTsKLQkJQXNzZXJ0LmlzVHJ1ZShzaXplLnggPj0gMCAmJiBzaXplLnkgPj0gMCk7Ci0JCWZTaXplPSBzaXplOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBpbWFnZSBjcmVhdGVkIGJ5IGNhbGxpbmcgPGNvZGU+Y3JlYXRlSW1hZ2UoKTwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UgY3JlYXRlZCBieSBjYWxsaW5nIDxjb2RlPmNyZWF0ZUltYWdlKCk8L2NvZGU+Ci0JICogQHNlZSBJbWFnZURlc2NyaXB0b3IjY3JlYXRlSW1hZ2UoKQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRJbWFnZVNpemUoKSB7Ci0JCXJldHVybiBuZXcgUG9pbnQoZlNpemUueCwgZlNpemUueSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgaW4gQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGdldFNpemUoKSB7Ci0JCXJldHVybiBmU2l6ZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBPYmplY3QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsIHx8ICFNZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLmNsYXNzLmVxdWFscyhvYmplY3QuZ2V0Q2xhc3MoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvciBvdGhlcj0gKE1ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3Ipb2JqZWN0OwotCQlyZXR1cm4gKGZCYXNlSW1hZ2UuZXF1YWxzKG90aGVyLmZCYXNlSW1hZ2UpICYmIGZGbGFncyA9PSBvdGhlci5mRmxhZ3MgJiYgZlNpemUuZXF1YWxzKG90aGVyLmZTaXplKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgb24gT2JqZWN0LgotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBmQmFzZUltYWdlLmhhc2hDb2RlKCkgfCBmRmxhZ3MgfCBmU2l6ZS5oYXNoQ29kZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIGluIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJSW1hZ2VEYXRhIGJnPSBnZXRJbWFnZURhdGEoZkJhc2VJbWFnZSk7Ci0JCQkKLQkJCi0JCWRyYXdJbWFnZShiZywgMCwgMCk7Ci0JCQkJCi0JCWRyYXdUb3BSaWdodCgpOwotCQlkcmF3Qm90dG9tUmlnaHQoKTsKLQkJZHJhd0JvdHRvbUxlZnQoKTsKLQkJCi0KLQl9Ci0JCi0JcHJpdmF0ZSBJbWFnZURhdGEgZ2V0SW1hZ2VEYXRhKEltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCUltYWdlRGF0YSBkYXRhPSBkZXNjcmlwdG9yLmdldEltYWdlRGF0YSgpOyAvLyBzZWUgYnVnIDUxOTY1OiBnZXRJbWFnZURhdGEgY2FuIHJldHVybiBudWxsCi0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCWRhdGE9IERFRkFVTFRfSU1BR0VfREFUQTsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigiSW1hZ2UgZGF0YSBub3QgYXZhaWxhYmxlOiAiICsgZGVzY3JpcHRvci50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBkYXRhOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgZHJhd1RvcFJpZ2h0KCkgewkJCi0JfQkJCi0JCi0JcHJpdmF0ZSB2b2lkIGRyYXdCb3R0b21SaWdodCgpIHsKLQl9CQkKLQkKLQlwcml2YXRlIHZvaWQgZHJhd0JvdHRvbUxlZnQoKSB7Ci0JCVBvaW50IHNpemU9IGdldFNpemUoKTsKLQkJaW50IHg9IDA7Ci0JCWlmICgoZkZsYWdzICYgRVJST1IpICE9IDApIHsKLQkJCUltYWdlRGF0YSBkYXRhPSBnZXRJbWFnZURhdGEoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0RFU0NfT1ZSX0VSUk9SKTsKLQkJCWRyYXdJbWFnZShkYXRhLCB4LCBzaXplLnkgLSBkYXRhLmhlaWdodCk7Ci0JCQl4Kz0gZGF0YS53aWR0aDsKLQkJfQotCX0JCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL1Byb2JsZW1NYXJrZXJNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvUHJvYmxlbU1hcmtlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2YyMjMwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvUHJvYmxlbU1hcmtlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXJEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIExpc3RlbnMgdG8gcmVzb3VyY2UgZGVsdGFzIGFuZCBmaWx0ZXJzIGZvciBtYXJrZXIgY2hhbmdlcyBvZiB0eXBlIElNYXJrZXIuUFJPQkxFTQotICogVmlld2VycyBzaG93aW5nIGVycm9yIHRpY2tzIHNob3VsZCByZWdpc3RlciBhcyBsaXN0ZW5lciB0bwotICogdGhpcyB0eXBlLgotICogCi0gKiBDb2RlIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnZpZXdzdXBwb3J0LlByb2JsZW1NYXJrZXJNYW5hZ2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9ibGVtTWFya2VyTWFuYWdlciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIFZpc2l0b3JzIHVzZWQgdG8gbG9vayBpZiB0aGUgZWxlbWVudCBjaGFuZ2UgZGVsdGEgY29udGFpbnMgYSBtYXJrZXIgY2hhbmdlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFByb2plY3RFcnJvclZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCi0JCXByaXZhdGUgSGFzaFNldDxJUmVzb3VyY2U+IGZDaGFuZ2VkRWxlbWVudHM7IAotCQkKLQkJcHVibGljIFByb2plY3RFcnJvclZpc2l0b3IoSGFzaFNldDxJUmVzb3VyY2U+IGNoYW5nZWRFbGVtZW50cykgewotCQkJZkNoYW5nZWRFbGVtZW50cz0gY2hhbmdlZEVsZW1lbnRzOwotCQl9Ci0JCQkKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlSZXNvdXJjZSByZXM9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQlpZiAocmVzIGluc3RhbmNlb2YgSVByb2plY3QgJiYgZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0PSAoSVByb2plY3QpIHJlczsKLQkJCQlpZiAoIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJLy8gb25seSB0cmFjayBvcGVuIEphdmEgcHJvamVjdHMKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWNoZWNrSW52YWxpZGF0ZShkZWx0YSwgcmVzKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgY2hlY2tJbnZhbGlkYXRlKElSZXNvdXJjZURlbHRhIGRlbHRhLCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCWludCBraW5kPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCQlpZiAoa2luZCA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIHx8IGtpbmQgPT0gSVJlc291cmNlRGVsdGEuQURERUQgfHwgKGtpbmQgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiBpc0Vycm9yRGVsdGEoZGVsdGEpKSkgewotCQkJCS8vIGludmFsaWRhdGUgdGhlIHJlc291cmNlIGFuZCBhbGwgcGFyZW50cwotCQkJCXdoaWxlIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLlJPT1QgJiYgZkNoYW5nZWRFbGVtZW50cy5hZGQocmVzb3VyY2UpKSB7Ci0JCQkJCXJlc291cmNlPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJCQl9Ci0JCQl9IAotCQl9CQotCQkKLQkJcHJpdmF0ZSBib29sZWFuIGlzRXJyb3JEZWx0YShJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewkKLQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1BUktFUlMpICE9IDApIHsKLQkJCQlJTWFya2VyRGVsdGFbXSBtYXJrZXJEZWx0YXM9IGRlbHRhLmdldE1hcmtlckRlbHRhcygpOwotCQkJCWZvciAoaW50IGk9IDA7IGkgPCBtYXJrZXJEZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKG1hcmtlckRlbHRhc1tpXS5pc1N1YnR5cGVPZihJTWFya2VyLlBST0JMRU0pKSB7Ci0JCQkJCQlpbnQga2luZD0gbWFya2VyRGVsdGFzW2ldLmdldEtpbmQoKTsKLQkJCQkJCWlmIChraW5kID09IElSZXNvdXJjZURlbHRhLkFEREVEIHx8IGtpbmQgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCWludCBzZXZlcml0eT0gbWFya2VyRGVsdGFzW2ldLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCAtMSk7Ci0JCQkJCQlpbnQgbmV3U2V2ZXJpdHk9IG1hcmtlckRlbHRhc1tpXS5nZXRNYXJrZXIoKS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgLTEpOwotCQkJCQkJaWYgKG5ld1NldmVyaXR5ICE9IHNldmVyaXR5KQotCQkJCQkJCXJldHVybiB0cnVlOyAKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdGVuZXJMaXN0IGZMaXN0ZW5lcnM7Ci0JCi0JCi0JcHVibGljIFByb2JsZW1NYXJrZXJNYW5hZ2VyKCkgewotCQlmTGlzdGVuZXJzPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZAotCSAqLwkKLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJSGFzaFNldDxJUmVzb3VyY2U+IGNoYW5nZWRFbGVtZW50cz0gbmV3IEhhc2hTZXQ8SVJlc291cmNlPigpOwotCQkKLQkJdHJ5IHsKLQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhICE9IG51bGwpCi0JCQkJZGVsdGEuYWNjZXB0KG5ldyBQcm9qZWN0RXJyb3JWaXNpdG9yKGNoYW5nZWRFbGVtZW50cykpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCi0JCWlmICghY2hhbmdlZEVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJSVJlc291cmNlW10gY2hhbmdlcz0gKElSZXNvdXJjZVtdKSBjaGFuZ2VkRWxlbWVudHMudG9BcnJheShuZXcgSVJlc291cmNlW2NoYW5nZWRFbGVtZW50cy5zaXplKCldKTsKLQkJCWZpcmVDaGFuZ2VzKGNoYW5nZXMsIHRydWUpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElBbm5vdGF0aW9uTW9kZWxMaXN0ZW5lciNtb2RlbENoYW5nZWQoSUFubm90YXRpb25Nb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RlbENoYW5nZWQoSUFubm90YXRpb25Nb2RlbCBtb2RlbCkgewotCQkvLyBubyBhY3Rpb24KLQl9CQotCQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciBmb3IgcHJvYmxlbSBtYXJrZXIgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJUHJvYmxlbUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZkxpc3RlbmVycy5pc0VtcHR5KCkpIHsgCi0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlmTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIDxjb2RlPklQcm9ibGVtQ2hhbmdlZExpc3RlbmVyPC9jb2RlPi4KLQkgKi8JCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQlpZiAoZkxpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBmaXJlQ2hhbmdlcyhmaW5hbCBJUmVzb3VyY2VbXSBjaGFuZ2VzLCBmaW5hbCBib29sZWFuIGlzTWFya2VyQ2hhbmdlKSB7Ci0JCURpc3BsYXkgZGlzcGxheT0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChkaXNwbGF5ICE9IG51bGwgJiYgIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewkJCi0JCQkJCU9iamVjdFtdIGxpc3RlbmVycz0gZkxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJCQkJZm9yIChpbnQgaT0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQkJSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIgY3Vycj0gKElQcm9ibGVtQ2hhbmdlZExpc3RlbmVyKSBsaXN0ZW5lcnNbaV07Ci0JCQkJCQljdXJyLnByb2JsZW1zQ2hhbmdlZChjaGFuZ2VzLCBpc01hcmtlckNoYW5nZSk7Ci0JCQkJCX0JCi0JCQkJfQotCQkJfSk7Ci0JCX0JCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmFlYmIwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgVUkgc2VydmljZXMgZm9yIHRoZSBBdXRob3JpbmcgYW5kIEJyb3dzaW5nIHBlcnNwZWN0aXZlcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0MTU5MWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0FwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcy5QcmVmZXJlbmNlQ29uc3RhbnRzOwotCi0vKioKLSAqIAotICogUHJlZmVyZW5jZSBjb25zdGFudHMgZm9yIGFwcGxpY2F0aW9uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzIGltcGxlbWVudHMgUHJlZmVyZW5jZUNvbnN0YW50cyB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9FTkFCTEVfUFJPQ0VTU19DT05UUklCVVRJT04gPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX0VOQUJMRV9QUk9DRVNTX0NPTlRSSUJVVElPTjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfRU5BQkxFX0hFQUxUSF9DSEVDSyA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfRU5BQkxFX0hFQUxUSF9DSEVDSzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfSU5IRVJJVF9TVVBQUkVTU0lPTl9TVEFURSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfSU5IRVJJVF9TVVBQUkVTU0lPTl9TVEFURTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0F1dGhvcmluZ1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0F1dGhvcmluZ1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMmE3ZTJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9BdXRob3JpbmdQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLQotLyoqCi0gKiBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZm9yIEF1dGhvcmluZ1BsdWdpbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ1ByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzCi0JCUFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJc3RvcmUuc2V0RGVmYXVsdChBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUywKLQkJCQlQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UKLQkJCQkJCS50b1N0cmluZyhQcm9jZXNzRWRpdG9yLkRFRkFVTFRfV0JTX0NPTFVNTlMpKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUywKLQkJCQlQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UKLQkJCQkJCS50b1N0cmluZyhQcm9jZXNzRWRpdG9yLkRFRkFVTFRfVEJTX0NPTFVNTlMpKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XUEJTX0NPTFVNTlMsCi0JCQkJUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlCi0JCQkJCQkudG9TdHJpbmcoUHJvY2Vzc0VkaXRvci5ERUZBVUxUX1dQQlNfQ09MVU1OUykpOwotCQlzdG9yZS5zZXREZWZhdWx0KAotCQkJCUFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEUsCi0JCQkJdHJ1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQ29tbW9uUHJlZlBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9Db21tb25QcmVmUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNDA4NDZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9Db21tb25QcmVmUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFByZWZlcmVuY2UgcGFnZSBmb3IgY29tbW9uIG9wdGlvbnMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25QcmVmUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBkbyBub3RoaW5nIGluIHRoaXMgY29tbW9uIHByZWZlcmVuY2UgcGFnZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUdyaWRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvLyBHcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuRGlyZWN0b3J5RGlhbG9nKENvbXBvc2l0ZSBwYXJlbnQsIFRleHQgcGF0aF9jdHIpIHsKLQkJdHJ5IHsKLQkJCURpcmVjdG9yeURpYWxvZyBkZCA9IG5ldyBEaXJlY3RvcnlEaWFsb2cocGFyZW50LmdldFNoZWxsKCksCi0JCQkJCVNXVC5OT05FKTsKLQotCQkJU3RyaW5nIGRlc3RpbmF0aW9uID0gZGQub3BlbigpOwotCQkJaWYgKGRlc3RpbmF0aW9uICE9IG51bGwpIHsKLQkJCQlwYXRoX2N0ci5zZXRUZXh0KGRlc3RpbmF0aW9uKTsKLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHRvIGNyZWF0ZSBhIExhYmVsCi0JICogQHBhcmFtIHBhcmVudCBwYXJlbnQgY29tcG9zaXRlIG9mIHRoZSBMYWJlbAotCSAqIEBwYXJhbSB0ZXh0IExhYmVsIHRleHQKLQkgKiBAcGFyYW0gc3BhbiBob3Jpem9udGFsIHNwYW4KLQkgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIExhYmVsCi0JICovCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3BhbikgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0byBjcmVhdGUgYSByYWRpbyBidXR0b24KLQkgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBjb21wb3NpdGUgb2YgdGhlIGJ1dHRvbgotCSAqIEBwYXJhbSBsYWJlbCB0aGUgYnV0dG9uIGxhYmVsCi0JICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBSYWRpbyBCdXR0b24KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyB8IFNXVC5MRUZUKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0byBjcmVhdGUgYSBsaW5lCi0JICogQHBhcmFtIHBhcmVudCBwYXJlbnQgY29tcG9zaXRlIG9mIHRoZSBsaW5lCi0JICogQHBhcmFtIG5jb2wgaG9yaXpvbnRhbCBzcGFuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTGluZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbmNvbCkgewotCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMCi0JCQkJfCBTV1QuQk9MRCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbmNvbDsKLQkJbGluZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIHByZWZlcmVuY2Ugc3RvcmUKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQotCQlyZXR1cm4gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCS8vIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvRGVidWdQcmVmUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0RlYnVnUHJlZlBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTdmZjhhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvRGVidWdQcmVmUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBkZWJ1ZyBvcHRpb25zCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlYnVnUHJlZlBhZ2UgZXh0ZW5kcyBDb21tb25QcmVmUGFnZSBpbXBsZW1lbnRzCi0JCUlXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlpbnQgTlVNX0NPTFVNTiA9IDM7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGVfdGFiOwotCi0JLy8gcHJpdmF0ZSBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLQotCXByaXZhdGUgQnV0dG9uIGVuYWJsZUhlYWx0aENoZWNrOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gY29tcG9zaXRlX3RhYiA8PCBwYXJlbnQKLQkJY29tcG9zaXRlX3RhYiA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIE5VTV9DT0xVTU4pOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZV90YWIsICIgIiwgTlVNX0NPTFVNTik7IC8vJE5PTi1OTFMtMSQKLQotCQllbmFibGVIZWFsdGhDaGVjayA9IG5ldyBCdXR0b24oY29tcG9zaXRlX3RhYiwgU1dULkNIRUNLKTsKLQkJZW5hYmxlSGVhbHRoQ2hlY2suc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5lbmFibGVIZWFsdGhDaGVja190ZXh0KTsgCi0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlX3RhYiwgIiAiLCBOVU1fQ09MVU1OKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMaW5lKGNvbXBvc2l0ZV90YWIsIE5VTV9DT0xVTU4pOwotCi0JCWluaXRpYWxpemVWYWx1ZXMoKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlX3RhYjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQkvLyB0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFByZWZlcmVuY2VQYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJc3RvcmVWYWx1ZXMoKTsKLQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkNvbW1vblByZWZQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQotCQlyZXR1cm4gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBTdG9yZXMgdGhlIHZhbHVlcyBvZiB0aGUgY29udHJvbHMgYmFjayB0byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlzdG9yZS5zZXRWYWx1ZShBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9FTkFCTEVfSEVBTFRIX0NIRUNLLAotCQkJCWVuYWJsZUhlYWx0aENoZWNrLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIHVzaW5nIGRlZmF1bHQgdmFsdWVzIGluIHRoZSBwcmVmZXJlbmNlCi0JICogc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0cygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JCWVuYWJsZUhlYWx0aENoZWNrCi0JCQkJLnNldFNlbGVjdGlvbihzdG9yZQotCQkJCQkJLmdldERlZmF1bHRCb29sZWFuKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0VOQUJMRV9IRUFMVEhfQ0hFQ0spKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJZW5hYmxlSGVhbHRoQ2hlY2sKLQkJCQkuc2V0U2VsZWN0aW9uKHN0b3JlCi0JCQkJCQkuZ2V0Qm9vbGVhbihBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9FTkFCTEVfSEVBTFRIX0NIRUNLKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9EaWFncmFtUHJlZlBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9EaWFncmFtUHJlZlBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGZjZDFhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvRGlhZ3JhbVByZWZQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotCi0vKioKLSAqIFByZWZlcmVuY2UgcGFnZSBmb3IgZGlhZ3JhbSBvcHRpb25zCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTGUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVByZWZQYWdlIGV4dGVuZHMgQ29tbW9uUHJlZlBhZ2UgaW1wbGVtZW50cwotCQlJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQotCUNvbXBvc2l0ZSBjb21wb3NpdGU7Ci0KLQlpbnQgTlVNX0NPTFVNTiA9IDM7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX3B1Ymxpc2hfYWRfZm9yX2FjdGl2aXR5X2V4dGVuc2lvbjsKLQkKLQlwdWJsaWMgRGlhZ3JhbVByZWZQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQljb21wb3NpdGUgPSBjcmVhdGVHcmlkQ29tcG9zaXRlKHBhcmVudCwgTlVNX0NPTFVNTik7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAiICIsIE5VTV9DT0xVTU4pOyAvLyROT04tTkxTLTEkCi0KLQkJY3RybF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWN0cmxfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZAotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb21wdGZvcl9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkX3RleHQpOyAKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQljdHJsX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWN0cmxfcHVibGlzaF9hZF9mb3JfYWN0aXZpdHlfZXh0ZW5zaW9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWN0cmxfcHVibGlzaF9hZF9mb3JfYWN0aXZpdHlfZXh0ZW5zaW9uCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtKTsgCi0JCQkJCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgIiAiLCBOVU1fQ09MVU1OKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMaW5lKGNvbXBvc2l0ZSwgTlVNX0NPTFVNTik7Ci0KLQkJaW5pdGlhbGl6ZVZhbHVlcygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCi0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFByZWZlcmVuY2VQYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJc3RvcmVWYWx1ZXMoKTsKLQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQkvLyBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCS8vIHN0b3JlLnNldFZhbHVlKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUFJPTVBUX0ZPUl9MSUJSQVJZX0FUX1NUQVJUVVAsCi0JCS8vIGN0cmxfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZC5nZXRTZWxlY3Rpb24oKSk7Ci0JCUxpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLnNldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkKGN0cmxfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZAotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oY3RybF9wdWJsaXNoX2FkX2Zvcl9hY3Rpdml0eV9leHRlbnNpb24KLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0cygpIHsKLQkJLy8gSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQljdHJsX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGQuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJY3RybF9wdWJsaXNoX2FkX2Zvcl9hY3Rpdml0eV9leHRlbnNpb24uc2V0U2VsZWN0aW9uKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJLy8gSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkvLyBjdHJsX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGQuc2V0U2VsZWN0aW9uKHN0b3JlLmdldEJvb2xlYW4oTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9QUk9NUFRfRk9SX0xJQlJBUllfQVRfU1RBUlRVUCkpOwotCQljdHJsX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGQuc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkKCkpOwotCQljdHJsX3B1Ymxpc2hfYWRfZm9yX2FjdGl2aXR5X2V4dGVuc2lvbgotCQkJCS5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCS5nZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQ29tbW9uUHJlZlBhZ2UjZG9HZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5TG9jYXRpb25EYXRhLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTGlicmFyeUxvY2F0aW9uRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MGU4NjQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5TG9jYXRpb25EYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcy5MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLQotLyoqCi0gKiBMb2NhdGlvbiBEYXRhIGZvciBsaWJyYXJ5IAotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqIGZpeCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzQwMQotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeUxvY2F0aW9uRGF0YSB7Ci0KLQlwcml2YXRlIFN0cmluZyBwYXJlbnRGb2xkZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBsaWJOYW1lOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGliQnJpZWZEZXNjcmlwdGlvbjsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1NpbmdsZUxpYkZpbGU7Ci0KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0TGliRGlyOwotCi0JcHJpdmF0ZSBib29sZWFuIGRlZkxpYkRpckNoZWNrZWQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBsaWJyYXJ5RmlsZSA9ICJsaWJyYXJ5LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNPa1ByZXNzZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPa1ByZXNzZWQoKSB7Ci0JCXJldHVybiBpc09rUHJlc3NlZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXNPa1ByZXNzZWQKLQkgKiAgICAgICAgICAgIFRoZSBpc09rUHJlc3NlZCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0T2tQcmVzc2VkKGJvb2xlYW4gaXNPa1ByZXNzZWQpIHsKLQkJdGhpcy5pc09rUHJlc3NlZCA9IGlzT2tQcmVzc2VkOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc09rUHJlc3NlZDsKLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNTaW5nbGVMaWJGaWxlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2luZ2xlTGliRmlsZSgpIHsKLQkJcmV0dXJuIGlzU2luZ2xlTGliRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXNTaW5nbGVMaWJGaWxlCi0JICogICAgICAgICAgICBUaGUgaXNTaW5nbGVMaWJGaWxlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaW5nbGVMaWJGaWxlKGJvb2xlYW4gaXNTaW5nbGVMaWJGaWxlKSB7Ci0JCXRoaXMuaXNTaW5nbGVMaWJGaWxlID0gaXNTaW5nbGVMaWJGaWxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbGliTmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYk5hbWUoKSB7Ci0JCXJldHVybiBsaWJOYW1lOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gRnVsbCBwYXRoIG9mIGxpYnJhcnkueG1pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5RmlsZSgpIHsKLQkJcmV0dXJuIGdldFBhcmVudEZvbGRlcigpICsgRmlsZS5zZXBhcmF0b3IgKyBsaWJyYXJ5RmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGliTmFtZQotCSAqICAgICAgICAgICAgVGhlIGxpYk5hbWUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpYk5hbWUoU3RyaW5nIGxpYk5hbWUpIHsKLQkJdGhpcy5saWJOYW1lID0gbGliTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcmVudEZvbGRlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudEZvbGRlcigpIHsKLQkJcmV0dXJuIHBhcmVudEZvbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Rm9sZGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50Rm9sZGVyIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRGb2xkZXIoU3RyaW5nIHBhcmVudEZvbGRlcikgewotCQl0aGlzLnBhcmVudEZvbGRlciA9IHBhcmVudEZvbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxpYkJyaWVmRGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJCcmllZkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gbGliQnJpZWZEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGliQnJpZWZEZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgVGhlIGxpYkJyaWVmRGVzY3JpcHRpb24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpYkJyaWVmRGVzY3JpcHRpb24oU3RyaW5nIGxpYkJyaWVmRGVzY3JpcHRpb24pIHsKLQkJdGhpcy5saWJCcmllZkRlc2NyaXB0aW9uID0gbGliQnJpZWZEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlZkxpYkRpckNoZWNrZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZMaWJEaXJDaGVja2VkKCkgewotCQlyZXR1cm4gZGVmTGliRGlyQ2hlY2tlZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVmTGliRGlyQ2hlY2tlZAotCSAqICAgICAgICAgICAgVGhlIGRlZkxpYkRpckNoZWNrZWQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZkxpYkRpckNoZWNrZWQoYm9vbGVhbiBkZWZMaWJEaXJDaGVja2VkKSB7Ci0JCXRoaXMuZGVmTGliRGlyQ2hlY2tlZCA9IGRlZkxpYkRpckNoZWNrZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBkZWZhdWx0TGliRGlyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdExpYkRpcigpIHsKLQkJcmV0dXJuIGRlZmF1bHRMaWJEaXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlZmF1bHRMaWJEaXIKLQkgKiAgICAgICAgICAgIFRoZSBkZWZhdWx0TGliRGlyIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TGliRGlyKFN0cmluZyBkZWZhdWx0TGliRGlyKSB7Ci0JCXRoaXMuZGVmYXVsdExpYkRpciA9IGRlZmF1bHRMaWJEaXI7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgcHJlZmVyZW5jZXMgZnJvbSB0aGUgc3RvcmUKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRGcm9tUHJlZmVyZW5jZVN0b3JlKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJU3RyaW5nIGxhc3REaXIgPSBzdG9yZQotCQkJCS5nZXRTdHJpbmcoTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MQVNUX0xJQlJBUllfUEFSRU5UX0RJUkVDVE9SWSk7Ci0JCXRoaXMuc2V0UGFyZW50Rm9sZGVyKGxhc3REaXIpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHOiBsYXN0X2Rpcj0gIiArIGxhc3REaXIpOwotCi0JCWJvb2xlYW4gbGFzdENoZWNrZWQgPSBzdG9yZQotCQkJCS5nZXRCb29sZWFuKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTEFTVF9ERUZBVUxUX0RJUkVDVE9SWV9DSEVDS0VEKTsKLQkJLy8gdGhlIGNvbnRhaW5zIG1ldGhvZCBkb2VzIG5vdCBzZWVtIHRvIHdvcmsgc28gdXNlIGxhc3QgZGlyIGFzIGFuCi0JCS8vIGFwcHJveGltYXRpb24KLQkJLy8gaWYKLQkJLy8gKHN0b3JlLmNvbnRhaW5zKExpYmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MQVNUX0RFRkFVTFRfRElSRUNUT1JZX0NIRUNLRUQpKQotCQlpZiAobGFzdERpciA9PSBudWxsIHx8IGxhc3REaXIudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQl0aGlzLnNldERlZkxpYkRpckNoZWNrZWQodHJ1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMuc2V0RGVmTGliRGlyQ2hlY2tlZChsYXN0Q2hlY2tlZCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiREVCVUc6IGxhc3RfY2hlY2tlZCA9ICIgKyBsYXN0Q2hlY2tlZCk7Ci0KLQkJU3RyaW5nIGRlZkxpYlBQYXRoID0gc3RvcmUKLQkJCQkuZ2V0U3RyaW5nKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9MSUJSQVJZX1BBUkVOVF9ESVJFQ1RPUlkpOwotCQlpZiAoZGVmTGliUFBhdGggPT0gbnVsbCB8fCBkZWZMaWJQUGF0aC5sZW5ndGgoKSA9PSAwKQotCQkJZGVmTGliUFBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpICsgLy8kTk9OLU5MUy0xJAotCQkJCQlGaWxlVXRpbC5GSUxFX1NFUCArIExpYnJhcnlVSVByZWZlcmVuY2VzLmdldEFwcGxpY2F0aW9uU2hvcnROYW1lKCkgKyAKLQkJCQkJRmlsZVV0aWwuRklMRV9TRVAgKyAiTWV0aG9kIExpYnJhcmllcyI7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5zZXREZWZhdWx0TGliRGlyKGRlZkxpYlBQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyBkaWFsb2cgY2hvaWNlcyB0byB0aGUgcHJlZmVyZW5jZSBzdG9yZQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZVRvUHJlZmVyZW5jZVN0b3JlKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRoaXMuZ2V0UGFyZW50Rm9sZGVyKCkpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5zZXRTYXZlZExpYnJhcnlQYXRoKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlzdG9yZS5zZXRWYWx1ZSgKLQkJCQlMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xBU1RfTElCUkFSWV9QQVJFTlRfRElSRUNUT1JZLAotCQkJCWZpbGUuZ2V0UGFyZW50KCkpOwotCQlzdG9yZS5zZXRWYWx1ZSgKLQkJCQlMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xBU1RfREVGQVVMVF9ESVJFQ1RPUllfQ0hFQ0tFRCwKLQkJCQl0aGlzLmlzRGVmTGliRGlyQ2hlY2tlZCgpKTsKLQotCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZlBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZlBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2I1MmUwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTGlicmFyeVByZWZQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLQotLyoqCi0gKiBMaWJyYXJ5IG9wdGlvbnMgcHJlZmVyZW5jZSBwYWdlCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVByZWZQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cwotCQlJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIFNlbGVjdGlvbkxpc3RlbmVyLCBNb2RpZnlMaXN0ZW5lciB7Ci0KLQlDb21wb3NpdGUgY29tcG9zaXRlX3RhYjsKLQotCVRleHQgY3RybF9saWJQYXJlbnRQYXRoOwotCi0JQnV0dG9uIGN0cmxfYnJvd3NlQnV0dG9uOwotCi0JU3RyaW5nIGRlZkxpYlBQYXRoID0gIi8iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEJ1dHRvbiBiYWtDaGVja2JveDsKLQotCXByaXZhdGUgQnV0dG9uIGRpc2NhcmRVbnJlc29sdmVkUmVmQ2hlY2tCb3g7Ci0JCi0JVGV4dCBjdHJsX2RlZmF1bHRMaXN0TGVuZ3RoOwotCQotCXByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfTElTVF9MRU5HVEggPSAiMTAiOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gY29tcG9zaXRlX3RhYiA8PCBwYXJlbnQKLQkJY29tcG9zaXRlX3RhYiA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDMpOwotCi0JCS8vIGNyZWF0ZUxhYmVsKGNvbXBvc2l0ZV90YWIsICJDaG9vc2UgYSBsaWJyYXJ5IHNhdmUgb3B0aW9uOiIpOwotCQkvLwotCQkvLyByYWRpbyBidXR0b24gY29tcG9zaXRlIDw8IHRhYiBjb21wb3NpdGUKLQkJLy8gQ29tcG9zaXRlIGNvbXBvc2l0ZV9yYWRpb0J1dHRvbiA9IGNyZWF0ZUNvbXBvc2l0ZShjb21wb3NpdGVfdGFiLCAxKTsKLQkJLy8gcmFkaW9CdXR0b24xID0gY3JlYXRlUmFkaW9CdXR0b24oY29tcG9zaXRlX3JhZGlvQnV0dG9uLCAiU2F2ZSBhcwotCQkvLyBtdWx0aXBsZSBmb2xkZXJzIik7Ci0JCS8vIHJhZGlvQnV0dG9uMiA9IGNyZWF0ZVJhZGlvQnV0dG9uKGNvbXBvc2l0ZV9yYWRpb0J1dHRvbiwgIlNhdmUgYXMgYQotCQkvLyBzaW5nbGUgZmlsZSIpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZV90YWIsICIgIiwgMyk7IC8vJE5PTi1OTFMtMSQKLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlX3RhYiwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hvb3NlRGVmYXVsdERpcmVjdG9yeV90ZXh0LCAzKTsgCi0KLQkJLy8gRGlyZWN0b3J5IFBhdGgKLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlX3RhYiwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlyZWN0b3J5X3RleHQsIDEpOyAKLQotCQljdHJsX2xpYlBhcmVudFBhdGggPSBuZXcgVGV4dChjb21wb3NpdGVfdGFiLCBTV1QuQk9SREVSKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HCi0JCQkJCXwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWN0cmxfbGliUGFyZW50UGF0aC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfbGliUGFyZW50UGF0aC5zZXRUZXh0KGRlZkxpYlBQYXRoKTsKLQotCQljdHJsX2Jyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlX3RhYiwgU1dULk5PTkUpOwotCQljdHJsX2Jyb3dzZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5CUk9XU0VfQlVUVE9OX1RFWFQpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJY3RybF9icm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGVfdGFiLCAiICIsIDMpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGluZShjb21wb3NpdGVfdGFiLCAzKTsKLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlX3RhYiwgIiAiLCAzKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBiYWNrdXAgYmVmb3JlIHNhdmUgY2hlY2sgYm94Ci0JCS8vCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZV90YWIsICIgIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJYmFrQ2hlY2tib3ggPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZV90YWIsIFNXVC5DSEVDSyk7Ci0JCWJha0NoZWNrYm94LnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmFja3VwYmVmb3Jlc2F2ZV90ZXh0KTsgCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZV90YWIsICIgIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyAnZGlzY2FyZCB1bnJlc29sdmVkIHJlZmVyZW5jZXMnIGNoZWNrIGJveAotCQljcmVhdGVMYWJlbChjb21wb3NpdGVfdGFiLCAiICIsIDEpOyAvLyROT04tTkxTLTEkCi0JCWRpc2NhcmRVbnJlc29sdmVkUmVmQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZV90YWIsIFNXVC5DSEVDSyk7Ci0JCWRpc2NhcmRVbnJlc29sdmVkUmVmQ2hlY2tCb3guc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjYXJkdW5yZXNvbHZlZHJlZik7IAotCQljcmVhdGVMYWJlbChjb21wb3NpdGVfdGFiLCAiICIsIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlX3RhYiwgIiAiLCAzKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMaW5lKGNvbXBvc2l0ZV90YWIsIDMpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZV90YWJfc2l6ZSA9IGNyZWF0ZUNvbXBvc2l0ZShjb21wb3NpdGVfdGFiLCAzKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HCi0JCQkJCXwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuPTM7Ci0JCQljb21wb3NpdGVfdGFiX3NpemUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlX3RhYl9zaXplLCBBdXRob3JpbmdVSVJlc291cmNlcy5kZWZhdWx0X2xpc3RfbGVuZ3RoX2xhYmVsLCAxKTsgCi0JCWN0cmxfZGVmYXVsdExpc3RMZW5ndGggPSBuZXcgVGV4dChjb21wb3NpdGVfdGFiX3NpemUsIFNXVC5CT1JERVIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcKLQkJCQkJfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW49MjsKLQkJCWN0cmxfZGVmYXVsdExpc3RMZW5ndGguc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY3JlYXRlTGluZShjb21wb3NpdGVfdGFiLCAzKTsKLQotCQlpbml0aWFsaXplVmFsdWVzKCk7Ci0KLQkJY3RybF9icm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3BlbkRpcmVjdG9yeURpYWxvZygpOwotCQkJfQotCQl9KTsKLQotCQkvLyBmb250ID0gbnVsbDsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5EaXJlY3RvcnlEaWFsb2coKSB7Ci0JCXRyeSB7Ci0JCQlEaXJlY3RvcnlEaWFsb2cgZGQgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGNvbXBvc2l0ZV90YWIuZ2V0U2hlbGwoKSwKLQkJCQkJU1dULk5PTkUpOwotCi0JCQlTdHJpbmcgZGVzdGluYXRpb24gPSBkZC5vcGVuKCk7Ci0JCQlpZiAoZGVzdGluYXRpb24gIT0gbnVsbCkgewotCQkJCWN0cmxfbGliUGFyZW50UGF0aC5zZXRUZXh0KGRlc3RpbmF0aW9uKTsKLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHNwYW4pIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvLyBwcml2YXRlIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkvLyBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyB8IFNXVC5MRUZUKTsKLQkvLyBidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JLy8gYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCS8vIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkvLyBidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkvLyByZXR1cm4gYnV0dG9uOwotCS8vIH0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVMaW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBuY29sKSB7Ci0JCUxhYmVsIGxpbmUgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwKLQkJCQl8IFNXVC5CT0xEKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBuY29sOwotCQlsaW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNkb0dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0KLQkJcmV0dXJuIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkvLyByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdXNpbmcgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIHByZWZlcmVuY2UKLQkgKiBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJZGVmTGliUFBhdGggPSBzdG9yZQotCQkJCS5nZXREZWZhdWx0U3RyaW5nKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9MSUJSQVJZX1BBUkVOVF9ESVJFQ1RPUlkpOwotCQlpZiAoZGVmTGliUFBhdGggPT0gbnVsbCB8fCBkZWZMaWJQUGF0aC5sZW5ndGgoKSA9PSAwKQotCQkJZGVmTGliUFBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpICsgLy8kTk9OLU5MUy0xJAotLy8JCQkJCUZpbGVVdGlsLkZJTEVfU0VQICsgTGlicmFyeVVJTWFuYWdlci5nZXRBcHBOYW1lKCkgKyAvLyROT04tTkxTLTEkCi0JCQkJCUZpbGVVdGlsLkZJTEVfU0VQICsgTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0QXBwbGljYXRpb25TaG9ydE5hbWUoKSArIAotCQkJCQlGaWxlVXRpbC5GSUxFX1NFUCArICJNZXRob2QgTGlicmFyaWVzIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHOiBkZWZhdWx0IGRlZkxpYlBQYXRoID0gIiArCi0JCS8vIGRlZkxpYlBQYXRoKTsKLQkJY3RybF9saWJQYXJlbnRQYXRoLnNldFRleHQoZGVmTGliUFBhdGgpOwotCi0JCS8vIHJhZGlvQnV0dG9uMS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkvLyByYWRpb0J1dHRvbjIuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJLy8gaW50IGNob2ljZSA9Ci0JCS8vIHN0b3JlLmdldERlZmF1bHRJbnQoTGliYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVfUkFESU9fU0FWRV9DSE9JQ0UpOwotCQkvLyBzd2l0Y2ggKGNob2ljZSkgewotCQkvLyBjYXNlIDE6Ci0JCS8vIHJhZGlvQnV0dG9uMS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIDI6Ci0JCS8vIHJhZGlvQnV0dG9uMi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCS8vIGJyZWFrOwotCQkvLyBkZWZhdWx0OgotCQkvLyByYWRpb0J1dHRvbjEuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkvLyBicmVhazsKLQkJLy8gfQotCi0JCWJha0NoZWNrYm94Ci0JCQkJLnNldFNlbGVjdGlvbihzdG9yZQotCQkJCQkJLmdldERlZmF1bHRCb29sZWFuKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfQkFDS19VUF9CRUZPUkVfU0FWRSkpOwotCQlkaXNjYXJkVW5yZXNvbHZlZFJlZkNoZWNrQm94Ci0JCQkJLnNldFNlbGVjdGlvbihzdG9yZQotCQkJCQkJLmdldERlZmF1bHRCb29sZWFuKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMpKTsKLQkJCi0JCVN0cmluZyBsaXN0TGVuZ3RoID0gc3RvcmUKLQkJLmdldFN0cmluZyhMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfSElTVE9SWV9TSVpFKTsKLQkJaWYobGlzdExlbmd0aD09bnVsbCB8fCBsaXN0TGVuZ3RoLmxlbmd0aCgpPD0wKQotCQkJbGlzdExlbmd0aCA9IERFRkFVTFRfTElTVF9MRU5HVEg7Ci0JCQotCQljdHJsX2RlZmF1bHRMaXN0TGVuZ3RoLnNldFRleHQobGlzdExlbmd0aCk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc0RpZ2l0U3RyKFN0cmluZyBzdHIpewotCSAgICAgUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJbMC05XSsiKTsgCi0JICAgICBNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIoKENoYXJTZXF1ZW5jZSlzdHIpOyAKLQkgICAgIHJldHVybiBtYXRjaGVyLm1hdGNoZXMoKTsgCi0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJZGVmTGliUFBhdGggPSBzdG9yZQotCQkJCS5nZXRTdHJpbmcoTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0xJQlJBUllfUEFSRU5UX0RJUkVDVE9SWSk7Ci0JCWlmIChkZWZMaWJQUGF0aCA9PSBudWxsIHx8IGRlZkxpYlBQYXRoLmxlbmd0aCgpID09IDApCi0JCQlkZWZMaWJQUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIikgKyAvLyROT04tTkxTLTEkCi0vLwkJCQkJRmlsZVV0aWwuRklMRV9TRVAgKyBMaWJyYXJ5VUlNYW5hZ2VyLmdldEFwcE5hbWUoKSArIC8vJE5PTi1OTFMtMSQKLQkJCQkJRmlsZVV0aWwuRklMRV9TRVAgKyBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpICsgCi0JCQkJCUZpbGVVdGlsLkZJTEVfU0VQICsgIk1ldGhvZCBMaWJyYXJpZXMiOyAvLyROT04tTkxTLTEkIAotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHOiByZWFkIGRlZkxpYlBQYXRoID0gIiArIGRlZkxpYlBQYXRoKTsKLQkJY3RybF9saWJQYXJlbnRQYXRoLnNldFRleHQoZGVmTGliUFBhdGgpOwotCi0JCS8vIGludCBjaG9pY2UgPQotCQkvLyBzdG9yZS5nZXRJbnQoTGliYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVfUkFESU9fU0FWRV9DSE9JQ0UpOwotCQkvLyBzd2l0Y2ggKGNob2ljZSkgewotCQkvLyBjYXNlIDE6Ci0JCS8vIHJhZGlvQnV0dG9uMS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIDI6Ci0JCS8vIHJhZGlvQnV0dG9uMi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCS8vIGJyZWFrOwotCQkvLyBkZWZhdWx0OgotCQkvLyByYWRpb0J1dHRvbjEuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkvLyBicmVhazsKLQkJLy8gfQotCi0JCWJha0NoZWNrYm94Ci0JCQkJLnNldFNlbGVjdGlvbihzdG9yZQotCQkJCQkJLmdldEJvb2xlYW4oTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9CQUNLX1VQX0JFRk9SRV9TQVZFKSk7Ci0JCWRpc2NhcmRVbnJlc29sdmVkUmVmQ2hlY2tCb3gKLQkJCQkuc2V0U2VsZWN0aW9uKHN0b3JlCi0JCQkJCQkuZ2V0Qm9vbGVhbihMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTKSk7Ci0JCQotCQlTdHJpbmcgbGlzdExlbmd0aCA9IHN0b3JlCi0JCS5nZXRTdHJpbmcoTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0hJU1RPUllfU0laRSk7Ci0JCWlmKGxpc3RMZW5ndGg9PW51bGwgfHwgbGlzdExlbmd0aC5sZW5ndGgoKTw9MCkKLQkJCWxpc3RMZW5ndGggPSBERUZBVUxUX0xJU1RfTEVOR1RIOwotCQljdHJsX2RlZmF1bHRMaXN0TGVuZ3RoLnNldFRleHQobGlzdExlbmd0aCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWluaXRpYWxpemVEZWZhdWx0cygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gUHJlZmVyZW5jZVBhZ2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXN0b3JlVmFsdWVzKCk7Ci0JCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9yZXMgdGhlIHZhbHVlcyBvZiB0aGUgY29udHJvbHMgYmFjayB0byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlkZWZMaWJQUGF0aCA9IGN0cmxfbGliUGFyZW50UGF0aC5nZXRUZXh0KCkudHJpbSgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHOiBkZWZMaWJQUGF0aCA9ICIgKyBkZWZMaWJQUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJc3RvcmUKLQkJCQkuc2V0VmFsdWUoCi0JCQkJCQlMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfTElCUkFSWV9QQVJFTlRfRElSRUNUT1JZLAotCQkJCQkJZGVmTGliUFBhdGgpOwotCQkvLyBpbnQgY2hvaWNlID0gMTsKLQkJLy8gaWYgKHJhZGlvQnV0dG9uMi5nZXRTZWxlY3Rpb24oKSkKLQkJLy8gY2hvaWNlID0gMjsKLQkJLy8KLQkJLy8gc3RvcmUuc2V0VmFsdWUoTGliYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVfUkFESU9fU0FWRV9DSE9JQ0UsCi0JCS8vIGNob2ljZSk7Ci0KLQkJc3RvcmUuc2V0VmFsdWUoTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9CQUNLX1VQX0JFRk9SRV9TQVZFLAotCQkJCWJha0NoZWNrYm94LmdldFNlbGVjdGlvbigpKTsKLQkJc3RvcmUuc2V0VmFsdWUoCi0JCQkJTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUywKLQkJCQlkaXNjYXJkVW5yZXNvbHZlZFJlZkNoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCi0JCVN0cmluZyBsaXN0TGVuZ3RoID0gY3RybF9kZWZhdWx0TGlzdExlbmd0aC5nZXRUZXh0KCk7Ci0JCWlmKCFpc0RpZ2l0U3RyKGxpc3RMZW5ndGgpKQotCQkJbGlzdExlbmd0aCA9IERFRkFVTFRfTElTVF9MRU5HVEg7Ci0JCWVsc2V7Ci0JCQlpZihJbnRlZ2VyLnBhcnNlSW50KGxpc3RMZW5ndGgpPD0wKQotCQkJCWxpc3RMZW5ndGggPSBERUZBVUxUX0xJU1RfTEVOR1RIOwotCQl9Ci0JCXN0b3JlLnNldFZhbHVlKAotCQkJCUxpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9ISVNUT1JZX1NJWkUsIGxpc3RMZW5ndGgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lciNtb2RpZnlUZXh0KG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyM2YxYzI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLlByZWZlcmVuY2VDb25zdGFudHM7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBDb25zdGFudHMgZm9yIGxpYnJhcnkKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzIGV4dGVuZHMgUHJlZmVyZW5jZUNvbnN0YW50cyB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTGlicmFyeVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOTU2NzliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0KLS8qKgotICogSW5pdGlhbGl6ZXIgZm9yIGxpYnJhcnkgcHJlZmVyZW5jZXMKLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5UHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJLy8gVGhlc2Ugc2V0dGluZ3Mgd2lsbCBzaG93IHVwIHdoZW4gdGhlIExpYnJhcnkgcHJlZmVyZW5jZSBwYWdlCi0JCS8vIGlzIHNob3duIGZvciB0aGUgZmlyc3QgdGltZS4KLQotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCS8vIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPQotCQkvLyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlzdG9yZS5zZXREZWZhdWx0KExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUkFESU9fU0FWRV9DSE9JQ0UsIDEpOwotCQlzdG9yZS5zZXREZWZhdWx0KExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfQkFDS19VUF9CRUZPUkVfU0FWRSwKLQkJCQlmYWxzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTW9kZWxpbmdPcHRpb25zUHJlZlBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9Nb2RlbGluZ09wdGlvbnNQcmVmUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZWM0ZDc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9Nb2RlbGluZ09wdGlvbnNQcmVmUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBtb2RlbGluZyBvcHRpb25zCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsaW5nT3B0aW9uc1ByZWZQYWdlIGV4dGVuZHMgQ29tbW9uUHJlZlBhZ2UgaW1wbGVtZW50cwotCQlJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JaW50IE5VTV9DT0xVTU4gPSAxOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29tcG9zaXRlX3RhYjsKLQotCXByaXZhdGUgQnV0dG9uIGV4dGVuZFNlbWFudGljc0NoZWNrOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gY29tcG9zaXRlX3RhYiA8PCBwYXJlbnQKLQkJY29tcG9zaXRlX3RhYiA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIE5VTV9DT0xVTU4pOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZV90YWIsICIgIiwgTlVNX0NPTFVNTik7IC8vJE5PTi1OTFMtMSQKLQotCQlleHRlbmRTZW1hbnRpY3NDaGVjayA9IG5ldyBCdXR0b24oY29tcG9zaXRlX3RhYiwgU1dULkNIRUNLKTsKLQkJZXh0ZW5kU2VtYW50aWNzQ2hlY2suc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5leHRlbmRfc2VtYW50aWNzX2J1dHRvbl90ZXh0KTsKLQotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlX3RhYiwgU1dULkxFRlR8IFNXVC5XUkFQKTsKLQkJbGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5leHRlbmRfc2VtYW50aWNzX3RleHQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlX3RhYiwgIiAiLCBOVU1fQ09MVU1OKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMaW5lKGNvbXBvc2l0ZV90YWIsIE5VTV9DT0xVTU4pOwotCi0JCWluaXRpYWxpemVWYWx1ZXMoKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlX3RhYjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQkvLyB0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFByZWZlcmVuY2VQYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJc3RvcmVWYWx1ZXMoKTsKLQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkNvbW1vblByZWZQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQotCQlyZXR1cm4gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBTdG9yZXMgdGhlIHZhbHVlcyBvZiB0aGUgY29udHJvbHMgYmFjayB0byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlib29sZWFuIHZhbHVlID0gZXh0ZW5kU2VtYW50aWNzQ2hlY2suZ2V0U2VsZWN0aW9uKCk7Ci0JCXN0b3JlLnNldFZhbHVlKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRVhURU5EX1NFTUFOVElDU19DSEVDSywKLQkJCQl2YWx1ZSk7Ci0JCQotCQkvLyBzZXQgdGhpcyBhcyB3ZWxsCi0JCUVsZW1lbnRSZWFsaXplci5zZXRJZ25vcmVCYXNlVG9NYW55QXNzb2NpYXRpb25zKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIHVzaW5nIGRlZmF1bHQgdmFsdWVzIGluIHRoZSBwcmVmZXJlbmNlCi0JICogc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0cygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JCWV4dGVuZFNlbWFudGljc0NoZWNrCi0JCQkJLnNldFNlbGVjdGlvbihzdG9yZQotCQkJCQkJLmdldERlZmF1bHRCb29sZWFuKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRVhURU5EX1NFTUFOVElDU19DSEVDSykpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlleHRlbmRTZW1hbnRpY3NDaGVjawotCQkJCS5zZXRTZWxlY3Rpb24oc3RvcmUKLQkJCQkJCS5nZXRCb29sZWFuKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRVhURU5EX1NFTUFOVElDU19DSEVDSykpOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmNGEyZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL1Byb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29sdW1uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgZm9yIFByb2Nlc3NFZGl0b3IKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cwotCQlJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIFNlbGVjdGlvbkxpc3RlbmVyLCBNb2RpZnlMaXN0ZW5lciB7Ci0KLQkvLyBwcml2YXRlIFRleHQgbGluZVdpZHRoVGV4dDsKLQkvLyBwcml2YXRlIEJ1dHRvbiBpbmRlbnRDaGVja2JveDsKLQkvLyBwcml2YXRlIFRleHQgaW5kZW50U2l6ZVRleHQ7Ci0JLy8gcHJpdmF0ZSBDb21ibyBic0NvbWJvOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXQlNfVFhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9Xb3JrQnJlYWtkb3duU3RydWN0dXJlOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQlNfVFhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9UZWFtQWxsb2NhdGlvbjsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1BCU19UWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1dvcmtQcm9kdWN0VXNhZ2U7IAotCi0JcHJpdmF0ZSBMaXN0Vmlld2VyIHNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlcjsKLQotCS8vIHByaXZhdGUgTGlzdFZpZXdlciB0YnNTZWxlY3RlZENvbExpc3Q7Ci0JLy8gcHJpdmF0ZSBMaXN0Vmlld2VyIHdwYnNTZWxlY3RlZENvbExpc3Q7Ci0JcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCB3YnNDb2x1bW5EZXNjcmlwdG9yczsKLQotCXByaXZhdGUgamF2YS51dGlsLkxpc3QgdGJzQ29sdW1uRGVzY3JpcHRvcnM7Ci0KLQlwcml2YXRlIGphdmEudXRpbC5MaXN0IHdwYnNDb2x1bW5EZXNjcmlwdG9yczsKLQotCXByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGRvd25CdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiB1cEJ1dHRvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEJTX05BTUVTID0gbmV3IFN0cmluZ1tdIHsgV0JTX1RYVCwgVEJTX1RYVCwKLQkJCVdQQlNfVFhUIH07Ci0KLQlwcml2YXRlIExpc3RbXSBjb2x1bW5EZXNjcmlwdG9yTGlzdHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0W10gQUxMX0NPTFVNTl9ERVNDUklQVE9SX0xJU1RTID0gbmV3IExpc3RbXSB7Ci0JCQlQcm9jZXNzRWRpdG9yLkFMTF9XQlNfQ09MVU1OUywgUHJvY2Vzc0VkaXRvci5BTExfVEJTX0NPTFVNTlMsCi0JCQlQcm9jZXNzRWRpdG9yLkFMTF9XUEJTX0NPTFVNTlMgfTsKLQotCS8vIGNvbmZpZ3VyYXRpb24gc3dpdGNoaW5nIHByZWZlcmVuY2UKLQlwcml2YXRlIEJ1dHRvbiBjb25maWdTd2l0Y2hBbHdheXNCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBjb25maWdTd2l0Y2hOZXZlckJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGNvbmZpZ1N3aXRjaFByb21wdEJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGluaGVyaXRTdXBwcmVzc2lvbkJ1dHRvbjsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbHVtbkRlc2NyaXB0b3JQcm92aWRlciBpbXBsZW1lbnRzCi0JCQlJVHJlZUNvbnRlbnRQcm92aWRlciwgSUxhYmVsUHJvdmlkZXIgewotCi0JCXB1YmxpYyBDb2x1bW5EZXNjcmlwdG9yUHJvdmlkZXIoKSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChqYXZhLnV0aWwuTGlzdCkgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLQkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChDb2x1bW5EZXNjcmlwdG9yKSBlbGVtZW50KS5sYWJlbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdERhdGEoKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQ29tcG9zaXRlIGNvbHVtbnNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljb2x1bW5zQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQljb2x1bW5zQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbHVtbnNDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5jb2x1bW5zZWxlY3Rpb25fdGV4dCk7IAotCi0JCWZpbmFsIENvbWJvIGJzQ29tYm8gPSBuZXcgQ29tYm8oY29sdW1uc0NvbXBvc2l0ZSwgU1dULlJFQURfT05MWQotCQkJCXwgU1dULkJPUkRFUik7Ci0JCWJzQ29tYm8uc2V0SXRlbXMoQlNfTkFNRVMpOwotCQlic0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKSBlLmdldFNvdXJjZSgpOwotCQkJCWludCBpZCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJaWYgKGlkICE9IC0xKSB7Ci0JCQkJCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlcgotCQkJCQkJCS5zZXRJbnB1dChjb2x1bW5EZXNjcmlwdG9yTGlzdHNbaWRdKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0KLQkJCX0KLQotCQl9KTsKLQkJYnNDb21iby5zZWxlY3QoMCk7Ci0KLQkJLy8gQ1RhYkZvbGRlciB0YWJGb2xkZXIgPSBuZXcgQ1RhYkZvbGRlcihjb2x1bW5zQ29tcG9zaXRlLCBTV1QuVE9QIHwKLQkJLy8gU1dULkJPUkRFUik7Ci0JCUNvbXBvc2l0ZSBsaXN0Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGlzdENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJbGlzdENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihsaXN0Q29tcG9zaXRlLCBTV1QuTVVMVEkKLQkJCQl8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlmaW5hbCBDb2x1bW5EZXNjcmlwdG9yUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gbmV3IENvbHVtbkRlc2NyaXB0b3JQcm92aWRlcigpOwotCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGl0ZW1Qcm92aWRlcik7Ci0JCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGl0ZW1Qcm92aWRlcik7Ci0JCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5zZXRJbnB1dCh3YnNDb2x1bW5EZXNjcmlwdG9ycyk7Ci0JCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKXsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0IHJlbW92ZUxpc3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSkudG9MaXN0KCk7Ci0JCQkJaWYgKHJlbW92ZUxpc3QuY29udGFpbnMoUHJvY2Vzc0VkaXRvci5DT0xfREVTQ19JRCkKLQkJCQkJCXx8IHJlbW92ZUxpc3QKLQkJCQkJCQkJLmNvbnRhaW5zKFByb2Nlc3NFZGl0b3IuQ09MX0RFU0NfUFJFU0VOVEFUSU9OX05BTUUpKSB7Ci0JCQkJCS8vIGlmIHByZXNlbnQgbmFtZSBvciBpZCBzZWxlY3RlZCwgCi0JCQkJCS8vIGRpc2FibGUgInJlbW92ZSIsInVwIiBhbmQgImRvd24iIGJ1dHRvbgotCQkJCQkvLwotCQkJCQlpZihyZW1vdmVCdXR0b24uaXNFbmFibGVkKCkpIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJaWYodXBCdXR0b24uaXNFbmFibGVkKCkpIHVwQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlpZihkb3duQnV0dG9uLmlzRW5hYmxlZCgpKSBkb3duQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmKCFyZW1vdmVCdXR0b24uaXNFbmFibGVkKCkpIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQlpZighdXBCdXR0b24uaXNFbmFibGVkKCkpIHVwQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCWlmKCFkb3duQnV0dG9uLmlzRW5hYmxlZCgpKSBkb3duQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0pOwotCi0JCS8vIHdic1NlbGVjdGVkQ29sdW1uc1RhYmxlLnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7Ci0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfSUQsCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcsCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSwKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUsCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCwKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFLAotCQkvLyB9KTsKLQotCQkvLyBDVGFiSXRlbSB0YWJJdGVtID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQkvLyB0YWJJdGVtLnNldFRleHQoIldvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSIpOwotCQkvLyB0YWJJdGVtLnNldENvbnRyb2wod2JzU2VsZWN0ZWRDb2x1bW5zVGFibGUuZ2V0Q29udHJvbCgpKTsKLQotCQkvLyB0YnNTZWxlY3RlZENvbExpc3QgPSBuZXcgTGlzdFZpZXdlcihjb2x1bW5zQ29tcG9zaXRlLCBTV1QuQ0hFQ0sgfAotCQkvLyBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJLy8gdGJzU2VsZWN0ZWRDb2xMaXN0LnNldENvbnRlbnRQcm92aWRlcihpdGVtUHJvdmlkZXIpOwotCQkvLyB0YnNTZWxlY3RlZENvbExpc3Quc2V0TGFiZWxQcm92aWRlcihpdGVtUHJvdmlkZXIpOwotCQkvLyB0YnNTZWxlY3RlZENvbExpc3Quc2V0SW5wdXQodGJzQ29sdW1uRGVzY3JpcHRvcnMpOwotCQkvLyB0YnNTZWxlY3RlZENvbExpc3Quc2V0SXRlbXMobmV3IFN0cmluZ1tdIHsKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCwKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUsCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUsCi0JCS8vIH0pOwotCQkvLyB0YWJJdGVtID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQkvLyB0YWJJdGVtLnNldFRleHQoIlRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSIpOwotCQkvLyB0YWJJdGVtLnNldENvbnRyb2wodGJzU2VsZWN0ZWRDb2xMaXN0LmdldENvbnRyb2woKSk7Ci0KLQkJLy8gd3Bic1NlbGVjdGVkQ29sTGlzdCA9IG5ldyBMaXN0Vmlld2VyKGNvbHVtbnNDb21wb3NpdGUsIFNXVC5DSEVDSyB8Ci0JCS8vIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQkvLyB3cGJzU2VsZWN0ZWRDb2xMaXN0LnNldENvbnRlbnRQcm92aWRlcihpdGVtUHJvdmlkZXIpOwotCQkvLyB3cGJzU2VsZWN0ZWRDb2xMaXN0LnNldExhYmVsUHJvdmlkZXIoaXRlbVByb3ZpZGVyKTsKLQkJLy8gd3Bic1NlbGVjdGVkQ29sTGlzdC5zZXRJbnB1dCh3cGJzQ29sdW1uRGVzY3JpcHRvcnMpOwotCQkvLyB0YWJJdGVtID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQkvLyB0YWJJdGVtLnNldFRleHQoIldvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlIik7Ci0JCS8vIHRhYkl0ZW0uc2V0Q29udHJvbCh3cGJzU2VsZWN0ZWRDb2xMaXN0LmdldENvbnRyb2woKSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbnNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGxpc3RDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCS8vIGxheW91dC5tYXJnaW5MZWZ0ID0gNDsKLQkJLy8gbGF5b3V0Lm1hcmdpblJpZ2h0ID0gNDsKLQkJYnV0dG9uc0NvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gODA7Ci0JCWJ1dHRvbnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCi0JCWFkZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlhZGRCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuQUREX0JVVFRPTl9URVhUKTsKLQkJYWRkQnV0dG9uLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCWFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpbnQgaWQgPSBic0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJT2JqZWN0IGlucHV0ID0gQUxMX0NPTFVNTl9ERVNDUklQVE9SX0xJU1RTW2lkXTsKLQkJCQlmaW5hbCBMaXN0IHNlbGVjdGVkQ29sdW1ucyA9IGNvbHVtbkRlc2NyaXB0b3JMaXN0c1tpZF07Ci0JCQkJTGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgTGlzdFNlbGVjdGlvbkRpYWxvZygKLQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCQlpbnB1dCwKLQkJCQkJCWl0ZW1Qcm92aWRlciwKLQkJCQkJCWl0ZW1Qcm92aWRlciwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNlbGVjdENvbHVtbnN0b0FkZF90ZXh0KSB7IAotCQkJCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCQkJCUNvbnRyb2wgY29udHJvbCA9IHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJCQkJCWdldFZpZXdlcigpLmFkZEZpbHRlcihuZXcgVmlld2VyRmlsdGVyKCkgewotCi0JCQkJCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsCi0JCQkJCQkJCQlPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJCQkJcmV0dXJuICFzZWxlY3RlZENvbHVtbnMuY29udGFpbnMoZWxlbWVudCk7Ci0JCQkJCQkJfQotCi0JCQkJCQl9KTsKLQkJCQkJCXJldHVybiBjb250cm9sOwotCQkJCQl9Ci0KLQkJCQl9OwotCQkJCWlmIChkbGcub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCQlzZWxlY3RlZENvbHVtbnMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZGxnLmdldFJlc3VsdCgpKSk7Ci0JCQkJCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0pOwotCi0JCXJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlyZW1vdmVCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5yZW1vdmVCdXR0b25fdGV4dCk7IAotCQlyZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJamF2YS51dGlsLkxpc3QgY29sdW1ucyA9IChqYXZhLnV0aWwuTGlzdCkgc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyCi0JCQkJCQkuZ2V0SW5wdXQoKTsKLQkJCQlMaXN0IHJlbW92ZUxpc3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSkudG9MaXN0KCk7Ci0JCQkJaWYgKHJlbW92ZUxpc3QuY29udGFpbnMoUHJvY2Vzc0VkaXRvci5DT0xfREVTQ19JRCkKLQkJCQkJCXx8IHJlbW92ZUxpc3QKLQkJCQkJCQkJLmNvbnRhaW5zKFByb2Nlc3NFZGl0b3IuQ09MX0RFU0NfUFJFU0VOVEFUSU9OX05BTUUpKSB7Ci0JCQkJCS8vIGNhbm5vdCByZW1vdmUgbmFtZSBvciBJRCBjb2x1bW4KLQkJCQkJLy8KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQljb2x1bW5zLnJlbW92ZUFsbChyZW1vdmVMaXN0KTsKLQkJCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCi0JCX0pOwotCi0JCXVwQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXVwQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LlVQX0JVVFRPTl9URVhUKTsKLQkJdXBCdXR0b24uc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJdXBCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkKLQkJCQkJcmV0dXJuOwotCQkJCUVMaXN0IGNvbHVtbnMgPSAoRUxpc3QpIHNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5nZXRJbnB1dCgpOwotCQkJCU9iamVjdCBzZWxlY3RlZCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpbnQgaWQgPSBjb2x1bW5zLmluZGV4T2Yoc2VsZWN0ZWQpOwotCQkJCWlmIChic0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMCAmJiBpZCA8IDMpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoYnNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID4gMCAmJiBpZCA8IDIpCi0JCQkJCXJldHVybjsKLQkJCQljb2x1bW5zLm1vdmUoaWQgLSAxLCBpZCk7Ci0JCQkJc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLnJlZnJlc2goKTsKLQkJCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJc2VsZWN0ZWQpLCB0cnVlKTsKLQkJCX0KLQotCQl9KTsKLQotCQlkb3duQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWRvd25CdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuRE9XTl9CVVRUT05fVEVYVCk7Ci0JCWRvd25CdXR0b24uc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJZG93bkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKQotCQkJCQlyZXR1cm47Ci0JCQkJRUxpc3QgY29sdW1ucyA9IChFTGlzdCkgc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLmdldElucHV0KCk7Ci0JCQkJT2JqZWN0IHNlbGVjdGVkID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWludCBpZCA9IGNvbHVtbnMuaW5kZXhPZihzZWxlY3RlZCk7Ci0JCQkJCi0JCQkJaWYgKGlkID09IGNvbHVtbnMuc2l6ZSgpIC0gMSB8fCAoYnNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IDAgJiYgaWQgPCAyKSkKLQkJCQkJcmV0dXJuOwotCQkJCWlmIChpZCA9PSBjb2x1bW5zLnNpemUoKSAtIDEgfHwgKGJzQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAgJiYgaWQgPCAxKSkKLQkJCQkJcmV0dXJuOwotCQkJCWNvbHVtbnMubW92ZShpZCArIDEsIGlkKTsKLQkJCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIucmVmcmVzaCgpOwotCQkJCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQlzZWxlY3RlZCksIHRydWUpOwotCQkJfQotCi0JCX0pOwotCi0JCUdyb3VwIGNvbmZpZ1N3aXRjaEdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULlNIQURPV19PVVQpOwotCQljb25maWdTd2l0Y2hHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJY29uZmlnU3dpdGNoR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWNvbmZpZ1N3aXRjaEdyb3VwCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N3aXRjaENvbmZpZ3VyYXRpb24pOyAKLQotCQljb25maWdTd2l0Y2hBbHdheXNCdXR0b24gPSBuZXcgQnV0dG9uKGNvbmZpZ1N3aXRjaEdyb3VwLCBTV1QuUkFESU8pOwotCQljb25maWdTd2l0Y2hBbHdheXNCdXR0b24uc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMuYWx3YXlzQnV0dG9uX3RleHQpOwotCQljb25maWdTd2l0Y2hOZXZlckJ1dHRvbiA9IG5ldyBCdXR0b24oY29uZmlnU3dpdGNoR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWNvbmZpZ1N3aXRjaE5ldmVyQnV0dG9uLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLm5ldmVyQnV0dG9uX3RleHQpOwotCQljb25maWdTd2l0Y2hQcm9tcHRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbmZpZ1N3aXRjaEdyb3VwLCBTV1QuUkFESU8pOwotCQljb25maWdTd2l0Y2hQcm9tcHRCdXR0b24uc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMucHJvbXB0QnV0dG9uX3RleHQpOwotCi0JCXNldFN3aXRjaENvbmZpZ0J1dHRvbihMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRTd2l0Y2hDb25maWcoKSk7Ci0KLQkJLy8gaW5oZXJpdCBzdXBwcmVzc2lvbiBzdGF0ZXMKLQkJR3JvdXAgc3VwcHJlc3Npb25Hcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5TSEFET1dfT1VUKTsKLQkJc3VwcHJlc3Npb25Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXN1cHByZXNzaW9uR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXN1cHByZXNzaW9uR3JvdXAKLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3VwcHJlc3Npb25Hcm91cFRpdGxlKTsgCi0KLQkJaW5oZXJpdFN1cHByZXNzaW9uQnV0dG9uID0gbmV3IEJ1dHRvbihzdXBwcmVzc2lvbkdyb3VwLCBTV1QuQ0hFQ0spOwotCQlpbmhlcml0U3VwcHJlc3Npb25CdXR0b24KLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfaW5oZXJpdFN1cHByZXNzaW9uU3RhdGUpOyAKLQotCQlpbmhlcml0U3VwcHJlc3Npb25CdXR0b24uc2V0U2VsZWN0aW9uKGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oCi0JCQkJQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfSU5IRVJJVF9TVVBQUkVTU0lPTl9TVEFURSkpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIExvYWRzIGRhdGEgZnJvbSBwcmVmZXJlbmNlIHN0b3JlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXREYXRhKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJU3RyaW5nIHN0ciA9IHN0b3JlCi0JCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUyk7Ci0JCWlmIChzdHIgPT0gbnVsbCkgewotCQkJc3RyID0gc3RvcmUKLQkJCQkJLmdldERlZmF1bHRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpOwotCQl9Ci0JCXdic0NvbHVtbkRlc2NyaXB0b3JzID0gUHJvY2Vzc0VkaXRvci50b0NvbHVtbkRlc2NyaXB0b3JMaXN0KHN0cik7Ci0KLQkJc3RyID0gc3RvcmUuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TKTsKLQkJaWYgKHN0ciA9PSBudWxsKSB7Ci0JCQlzdHIgPSBzdG9yZQotCQkJCQkuZ2V0RGVmYXVsdFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUyk7Ci0JCX0KLQkJdGJzQ29sdW1uRGVzY3JpcHRvcnMgPSBQcm9jZXNzRWRpdG9yLnRvQ29sdW1uRGVzY3JpcHRvckxpc3Qoc3RyKTsKLQotCQlzdHIgPSBzdG9yZS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TKTsKLQkJaWYgKHN0ciA9PSBudWxsKSB7Ci0JCQlzdHIgPSBzdG9yZQotCQkJCQkuZ2V0RGVmYXVsdFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XUEJTX0NPTFVNTlMpOwotCQl9Ci0JCXdwYnNDb2x1bW5EZXNjcmlwdG9ycyA9IFByb2Nlc3NFZGl0b3IudG9Db2x1bW5EZXNjcmlwdG9yTGlzdChzdHIpOwotCi0JCS8vIGxvYWQgYW5kIHNldCB0byB0aGUgZGVmYXVsdCBpZiBub3RoaW5nIGluIHRoZSBzdG9yZQotCQkvLyAxNTQ3NTggLSBQcm9jZXNzZXM6IFdCUyBpcyBibGFuayBhcyBkZWZhdWx0IHByZWZlcmVuY2UgaXMgbm90IHNldCBmb3IgdGhlIGZpcnN0IHRpbWUKLQkJaWYgKCB3YnNDb2x1bW5EZXNjcmlwdG9ycy5zaXplKCkgPT0gMCApIHsKLQkJCXdic0NvbHVtbkRlc2NyaXB0b3JzLmFkZEFsbChQcm9jZXNzRWRpdG9yLkRFRkFVTFRfV0JTX0NPTFVNTlMpOwotCQkJc3RvcmUuc2V0VmFsdWUoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMsCi0JCQkJCXRvU3RyaW5nKHdic0NvbHVtbkRlc2NyaXB0b3JzKSk7Ci0JCQotCQl9Ci0JCQotCQlpZiAoIHRic0NvbHVtbkRlc2NyaXB0b3JzLnNpemUoKSA9PSAwICkgewotCQkJdGJzQ29sdW1uRGVzY3JpcHRvcnMuYWRkQWxsKFByb2Nlc3NFZGl0b3IuREVGQVVMVF9UQlNfQ09MVU1OUyk7Ci0JCQlzdG9yZS5zZXRWYWx1ZShBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUywKLQkJCQkJdG9TdHJpbmcodGJzQ29sdW1uRGVzY3JpcHRvcnMpKTsKLQkJfQotCQkKLQkJaWYgKCB3cGJzQ29sdW1uRGVzY3JpcHRvcnMuc2l6ZSgpID09IDAgKSB7Ci0JCQl3cGJzQ29sdW1uRGVzY3JpcHRvcnMuYWRkQWxsKFByb2Nlc3NFZGl0b3IuREVGQVVMVF9XUEJTX0NPTFVNTlMpOwotCQkJc3RvcmUuc2V0VmFsdWUoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TLAotCQkJCQl0b1N0cmluZyh3cGJzQ29sdW1uRGVzY3JpcHRvcnMpKTsKLQkJfQotCQkKLQkJY29sdW1uRGVzY3JpcHRvckxpc3RzID0gbmV3IExpc3RbXSB7IHdic0NvbHVtbkRlc2NyaXB0b3JzLAotCQkJCXRic0NvbHVtbkRlc2NyaXB0b3JzLCB3cGJzQ29sdW1uRGVzY3JpcHRvcnMgfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UucGVyZm9ybURlZmF1bHRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQotCQl3YnNDb2x1bW5EZXNjcmlwdG9ycy5jbGVhcigpOwotCQl3YnNDb2x1bW5EZXNjcmlwdG9ycy5hZGRBbGwoUHJvY2Vzc0VkaXRvci5ERUZBVUxUX1dCU19DT0xVTU5TKTsKLQotCQl0YnNDb2x1bW5EZXNjcmlwdG9ycy5jbGVhcigpOwotCQl0YnNDb2x1bW5EZXNjcmlwdG9ycy5hZGRBbGwoUHJvY2Vzc0VkaXRvci5ERUZBVUxUX1RCU19DT0xVTU5TKTsKLQotCQl3cGJzQ29sdW1uRGVzY3JpcHRvcnMuY2xlYXIoKTsKLQkJd3Bic0NvbHVtbkRlc2NyaXB0b3JzLmFkZEFsbChQcm9jZXNzRWRpdG9yLkRFRkFVTFRfV1BCU19DT0xVTU5TKTsKLQotCQlpbmhlcml0U3VwcHJlc3Npb25CdXR0b24KLQkJCQkuc2V0U2VsZWN0aW9uKGdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJCQkuZ2V0RGVmYXVsdEJvb2xlYW4oCi0JCQkJCQkJCUFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEUpKTsKLQotCQlzZXRTd2l0Y2hDb25maWdCdXR0b24oTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuUFJPTVBUKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlzdG9yZS5zZXRWYWx1ZShBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUywKLQkJCQl0b1N0cmluZyh3YnNDb2x1bW5EZXNjcmlwdG9ycykpOwotCQlzdG9yZS5zZXRWYWx1ZShBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUywKLQkJCQl0b1N0cmluZyh0YnNDb2x1bW5EZXNjcmlwdG9ycykpOwotCQlzdG9yZS5zZXRWYWx1ZShBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XUEJTX0NPTFVNTlMsCi0JCQkJdG9TdHJpbmcod3Bic0NvbHVtbkRlc2NyaXB0b3JzKSk7Ci0JCXN0b3JlLnNldFZhbHVlKAotCQkJCUFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEUsCi0JCQkJaW5oZXJpdFN1cHByZXNzaW9uQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJLy8gc3dpdGNoIGNvbmZpZyBwcmVmZXJlbmNlIGlzIGluIGxpYnJhcnkudWkKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0U3dpdGNoQ29uZmlnKGdldFN3aXRjaENvbmZpZ1ZhbHVlKCkpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGdpdmVuIGxpc3QgaW50byBzdHJpbmcgcmVwcmVzZW50YXRpb24KLQkgKiBAcGFyYW0gY29sdW1uRGVzY3JpcHRvcnMKLQkgKiBAcmV0dXJuIAotCSAqIAkJCVN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gbGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGphdmEudXRpbC5MaXN0IGNvbHVtbkRlc2NyaXB0b3JzKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBtYXggPSBjb2x1bW5EZXNjcmlwdG9ycy5zaXplKCkgLSAxOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlzdHJCdWYuYXBwZW5kKCgoQ29sdW1uRGVzY3JpcHRvcikgY29sdW1uRGVzY3JpcHRvcnMuZ2V0KGkpKS5pZCkKLQkJCQkJLmFwcGVuZCgnLCcpOwotCQl9Ci0JCXN0ckJ1Zi5hcHBlbmQoKChDb2x1bW5EZXNjcmlwdG9yKSBjb2x1bW5EZXNjcmlwdG9ycy5nZXQobWF4KSkuaWQpOwotCQlyZXR1cm4gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyI21vZGlmeVRleHQoTW9kaWZ5RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3dpdGNoQ29uZmlnVmFsdWUoKSB7Ci0JCWlmIChjb25maWdTd2l0Y2hBbHdheXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0JCQlyZXR1cm4gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuQUxXQVlTOwotCQlpZiAoY29uZmlnU3dpdGNoTmV2ZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0JCQlyZXR1cm4gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuTkVWRVI7Ci0JCWlmIChjb25maWdTd2l0Y2hQcm9tcHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0JCQlyZXR1cm4gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuUFJPTVBUOwotCi0JCS8vIHJldHVybiBQcm9tcHQgdmFsdWUgYXMgYSBkZWZhdWx0Ci0JCXJldHVybiBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5QUk9NUFQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFN3aXRjaENvbmZpZ0J1dHRvbihTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLkFMV0FZUy5lcXVhbHModmFsdWUpKSB7Ci0JCQljb25maWdTd2l0Y2hBbHdheXNCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJY29uZmlnU3dpdGNoTmV2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWNvbmZpZ1N3aXRjaFByb21wdEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9IGVsc2UgaWYgKE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLk5FVkVSLmVxdWFscyh2YWx1ZSkpIHsKLQkJCWNvbmZpZ1N3aXRjaEFsd2F5c0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJY29uZmlnU3dpdGNoTmV2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJY29uZmlnU3dpdGNoUHJvbXB0QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0gZWxzZSB7IC8vIE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLlBST01QVAotCQkJY29uZmlnU3dpdGNoQWx3YXlzQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQljb25maWdTd2l0Y2hOZXZlckJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJY29uZmlnU3dpdGNoUHJvbXB0QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwdWJsaWMgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCQotCQkvLyBjaGFuZ2UgdG8gdXNlIExpYnJhcnlQbHVnaW4gc3RvcmUKLQkJLy8gd2UgbmVlZCB0byBzaGFyZSB0aGUgcHJlZmVyZW5jZSBpbiBMaWJyYXJ5IGJyb3dzaW5nIGFuZCBwdWJsaXNoaW5nCi0JCS8vIEppbmh1YSBYaSAwOC8xOS8yMDA2Ci0JCXJldHVybiBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvUm9vdFByZWZQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvUm9vdFByZWZQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI1Njk5OTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL1Jvb3RQcmVmUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLQotLyoqCi0gKiBSb290IHByZWZlcmVuY2UgcGFnZQotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvb3RQcmVmUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbXBvc2l0ZV90YWI7Ci0KLQkvLyBwcml2YXRlIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCi0JLy8gRGlzYWJsZWluZyBlbmFibGUgcHJvY2VzcyBjb250cmlidXRpb24gcHJlZmVyZW5jZSBmb3Igbm93LgotCS8vIHByaXZhdGUgQnV0dG9uIGVuYWJsZVByb2Nlc3NDb250cmlidXRpb247Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkvLyBjb21wb3NpdGVfdGFiIDw8IHBhcmVudAotCQljb21wb3NpdGVfdGFiID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMyk7Ci0KLQkJLy8gZW5hYmxlUHJvY2Vzc0NvbnRyaWJ1dGlvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlX3RhYiwgU1dULkNIRUNLKTsKLQkJLy8gZW5hYmxlUHJvY2Vzc0NvbnRyaWJ1dGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdldFN0cmluZygiQXV0aG9yaW5nVUkuUm9vdFByZWZQYWdlLmVuYWJsZXByb2Nlc3Njb250cmlidXRpb24udGV4dCIpKTsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCi0JCWluaXRpYWxpemVWYWx1ZXMoKTsKLQotCQkvLyBmb250ID0gbnVsbDsKLQkJcmV0dXJuIGNvbXBvc2l0ZV90YWI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJLy8gdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWluaXRpYWxpemVEZWZhdWx0cygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gUHJlZmVyZW5jZVBhZ2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXN0b3JlVmFsdWVzKCk7Ci0JCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjZG9HZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkgewotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdXNpbmcgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIHByZWZlcmVuY2UKLQkgKiBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkgewotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvLyBHcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLy8gcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHNwYW4pIHsKLQkvLyBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkvLyBsYWJlbC5zZXRUZXh0KHRleHQpOwotCS8vIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkvLyBkYXRhLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkvLyBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCS8vIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JLy8gcmV0dXJuIGxhYmVsOwotCS8vIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL1N0YXJ0dXBQcmVmUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL1N0YXJ0dXBQcmVmUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZWVkMTc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9TdGFydHVwUHJlZlBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLQotLyoqCi0gKiBTdGFydHVwIHByZWZlcmVuY2UgcGFnZQotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU3RhcnR1cFByZWZQYWdlIGV4dGVuZHMgQ29tbW9uUHJlZlBhZ2UgaW1wbGVtZW50cwotCQlJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIFNlbGVjdGlvbkxpc3RlbmVyLCBNb2RpZnlMaXN0ZW5lciB7Ci0KLQlDb21wb3NpdGUgY29tcG9zaXRlX3RhYjsKLQotCWludCBuY29sID0gMzsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfc3RhcnR1cFByb21wdDsKLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQljb21wb3NpdGVfdGFiID0gY3JlYXRlR3JpZENvbXBvc2l0ZShwYXJlbnQsIG5jb2wpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZV90YWIsICIgIiwgbmNvbCk7IC8vJE5PTi1OTFMtMSQKLQotCQljdHJsX3N0YXJ0dXBQcm9tcHQgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZV90YWIsIFNXVC5DSEVDSyk7Ci0JCWN0cmxfc3RhcnR1cFByb21wdC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb21wdGZvcmxpYmFyeV90ZXh0KTsgCi0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlX3RhYiwgIiAiLCBuY29sKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMaW5lKGNvbXBvc2l0ZV90YWIsIG5jb2wpOwotCi0JCWluaXRpYWxpemVWYWx1ZXMoKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlX3RhYjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWluaXRpYWxpemVEZWZhdWx0cygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gUHJlZmVyZW5jZVBhZ2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXN0b3JlVmFsdWVzKCk7Ci0JCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBjb250cm9scyBiYWNrIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJLy8gSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkvLyBzdG9yZS5zZXRWYWx1ZShMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1BST01QVF9GT1JfTElCUkFSWV9BVF9TVEFSVFVQLAotCQkvLyBjdHJsX3N0YXJ0dXBQcm9tcHQuZ2V0U2VsZWN0aW9uKCkpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5zZXRQcm9tcHRGb3JNZXRob2RMaWJyYXJ5QXRTdGFydHVwKGN0cmxfc3RhcnR1cFByb21wdAotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkgewotCQkvLyBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWN0cmxfc3RhcnR1cFByb21wdC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQkvLyBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCS8vIGN0cmxfc3RhcnR1cFByb21wdC5zZXRTZWxlY3Rpb24oc3RvcmUuZ2V0Qm9vbGVhbihMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1BST01QVF9GT1JfTElCUkFSWV9BVF9TVEFSVFVQKSk7Ci0JCWN0cmxfc3RhcnR1cFByb21wdC5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0UHJvbXB0Rm9yTWV0aG9kTGlicmFyeUF0U3RhcnR1cCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQ29tbW9uUHJlZlBhZ2UjZG9HZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OGI1MzkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBwcmVmZXJlbmNlIHN1cHBvcnQgZm9yIHRoZSBBdXRob3JpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWJzdHJhY3RTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BYnN0cmFjdFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTRlYmMyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BYnN0cmFjdFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC52aWV3LlRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5BYnN0cmFjdFByb3BlcnR5U2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhIHNlY3Rpb24gaW4gYSB0YWIgaW4gdGhlIHByb3BlcnRpZXMgdmlldy4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFic3RyYWN0U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlTZWN0aW9uIGltcGxlbWVudHMKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudDsKLQotCXByb3RlY3RlZCBib29sZWFuIGVkaXRhYmxlID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgcGFnZTsKLQotCXByb3RlY3RlZCBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IG5ldyBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yKAotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpLAotCQkJbnVsbCk7Ci0KLQlwcm90ZWN0ZWQgTG9nZ2VyIGxvZ2dlcjsKLQotCS8qCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlCi0JICovCi0JcHVibGljIEFic3RyYWN0U2VjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQotCQkvLyBsaXN0ZW4gdG8gY2hhbmdlIGZvciBjdXJyZW50IHNlbGVjdGlvbiBvZiBNZXRob2RDb25maWd1cmF0aW9uCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5hZGRMaXN0ZW5lcihsaWJyYXJ5TGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gZ2V0IGxvZ2dlcgotCQlsb2dnZXIgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5BYnN0cmFjdFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wLCBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKGNvbXAsIHBhZ2UpOwotCQl0aGlzLnBhZ2UgPSBwYWdlOwotCX0KLQotCXByaXZhdGUgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaWJyYXJ5TGlzdGVuZXIgPSBuZXcgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2hhbmdlZChpbnQgb3B0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJCXN3aXRjaCAob3B0aW9uKSB7Ci0JCQljYXNlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQ6IHsKLQkJCQlzZWN0aW9uUmVmcmVzaCgpOwotCQkJfQotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIFJlZnJlc2ggdGhlIGN1cnJlbnQgc2VjdGlvbgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBzZWN0aW9uUmVmcmVzaCgpIHsKLQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJVGFiIHRhYiA9IHBhZ2UuZ2V0Q3VycmVudFRhYigpOwotCQkJaWYgKHRhYiAhPSBudWxsKSB7Ci0JCQkJSVNlY3Rpb24gc2VjdGlvbiA9IHRhYi5nZXRTZWN0aW9uQXRJbmRleCgwKTsKLQotCQkJCWlmICgoc2VjdGlvbiAhPSBudWxsKQotCQkJCQkJJiYgKHNlY3Rpb24gaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24pKSB7Ci0JCQkJCXNlY3Rpb24ucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24jZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAobGlicmFyeUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKGxpYnJhcnlMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24jc2V0SW5wdXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlci5zZXRJbnB1dChwYXJ0LCBzZWxlY3Rpb24pOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNldElucHV0OjpzZWxlY3Rpb24gLSAiK3NlbGVjdGlvbik7Ci0JCUFzc2VydC5pc1RydWUoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQlPYmplY3QgaW5wdXQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCi0JCWluaXRFbGVtZW50RGF0YShpbnB1dCk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdEVsZW1lbnREYXRhKE9iamVjdCBpbnB1dCkgewotCi0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCXRoaXMuZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBpbnB1dDsKLQkJCWlmIChUbmdVdGlsLmlzTG9ja2VkKHRoaXMuZWxlbWVudCkpCi0JCQkJdGhpcy5lZGl0YWJsZSA9IGZhbHNlOwotCQkJZWxzZSB7Ci0JCQkJdGhpcy5lZGl0YWJsZSA9IHRydWU7Ci0KLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJCQlpZiAoKHJvbGVEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpCi0JCQkJCQkJfHwgKHJvbGVEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpKQotCQkJCQkJdGhpcy5lZGl0YWJsZSA9IGZhbHNlOwotCQkJCQllbHNlCi0JCQkJCQl0aGlzLmVkaXRhYmxlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJdGhpcy5lbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIExpYnJhcnlVdGlsLnVud3JhcChpbnB1dCk7Ci0JCQl0aGlzLmVkaXRhYmxlID0gZmFsc2U7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFJldHVybiBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBFUEZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gZmlyc3QgZWxlbWVudCBmcm9tIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW5wdXQoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJT2JqZWN0IGlucHV0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCXJldHVybiBpbnB1dDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gcHJvY2VzcyBlZGl0b3IKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQlwcm9jZXNzIGVkaXRvcgotCSAqLwotCXB1YmxpYyBQcm9jZXNzRWRpdG9yIGdldEVkaXRvcigpIHsKLQkJcmV0dXJuIEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEVkaXRvcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBJdGVtUHJvdmlkZXIKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQkJYWRhcHRlcgotCSAqLwotCXB1YmxpYyBJdGVtUHJvdmlkZXJBZGFwdGVyIGdldEFkYXB0ZXIoKSB7Ci0JCXRyeSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgcHJvdmlkZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgZmFjdG9yeS5hZGFwdCgKLQkJCQkJZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXJldHVybiBwcm92aWRlcjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBBZGFwdGVyIGZhY3RvcnkKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQkJYWRhcHRlciBmYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IEVQRlByb3BlcnR5U2hlZXRQYWdlCi0JCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGVsZW1lbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCU9iamVjdCBpbnB1dCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImdldEVsZW1lbnQ6OnNlbGVjdGlvbiAtICIrc2VsZWN0aW9uKTsKLQkJCXRyeSB7Ci0JCQkJaW5pdEVsZW1lbnREYXRhKGlucHV0KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJbG9nZ2VyCi0JCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCSJFcnJvciBnZXR0aW5nIGVsZW1lbnQgZnJvbSB0aGUgc2VsZWN0aW9uICIgKyBlbGVtZW50LCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHByb3BlcnR5IHNoZWV0IHBhZ2UKLQkgKiBAcmV0dXJuCi0JICogCQkJcHJvcGVydHkgc2hlZXQgcGFnZQotCSAqLwotCXB1YmxpYyBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcm9lcHJ0eUNoYW5nZUV2ZW50IiArIGV2dCk7Ci0JCXJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gZmlsdGVyIGxpc3Qgb2YgZWxlbWVudHMuIEZpbHRlciBpcyBiYXNlZCBvbiBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGxpc3QKLQkgKiAJCQlPcmlnaW5hbCBsaXN0Ci0JICogQHJldHVybgotCSAqIAkJCWZpbHRlcmVkIGxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRGaWx0ZXJlZExpc3QoTGlzdCBsaXN0KSB7Ci0JCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCWlmIChjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJCU9iamVjdCBvYmogPSAoT2JqZWN0KSBpdG9yLm5leHQoKTsKLQkJCQljb25maWd1cmF0b3Iuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZQotCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJaWYgKGNvbmZpZ3VyYXRvci5hY2NlcHQob2JqKSkgewotCQkJCQluZXdMaXN0LmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3TGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZGVmYXVsdCBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gCi0JICogCQkJZGVmYXVsdCBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGdldERlZmF1bHRDb25maWd1cmF0aW9uKCkgewotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgZ2V0QWRhcHRlcigpOwotCQlPYmplY3QgcGFyZW50ID0gbnVsbDsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCUlCU0l0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXI7Ci0JCQlwYXJlbnQgPSBic0l0ZW1Qcm92aWRlci5nZXRUb3BJdGVtKCk7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSBwYXJlbnQpCi0JCQkJCS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJcmV0dXJuIGNvbmZpZzsKLQkJfSBlbHNlIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoIkFic3RyYWN0U2VjdGlvbjo6Z2V0RGVmYXVsdENvbmZpZ3VyYXRpb24gLSBJQlNJdGVtUHJvdmlkZXIgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHJldHVybgotCSAqIAkJCWN1cnJlbnQgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQkvLyBpZiBjb25maWd1cmF0aW9uIGlzIG5vdCBzZWxlY3RlZCwgdXNlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCQkJcmV0dXJuIGdldERlZmF1bHRDb25maWd1cmF0aW9uKCk7Ci0JCX0KLQotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCi0JLy8gcHVibGljIHZvaWQgdXBkYXRlVGl0bGUoT2JqZWN0IG9iaikKLQkvLyB7Ci0JLy8gU3RyaW5nIG5hbWUgPSBnZXROYW1lUHJlZml4KCkgKyAoKEJyZWFrZG93bkVsZW1lbnQpb2JqKS5nZXROYW1lKCk7Ci0JLy8gVGFiYmVkUHJvcGVydHlDb21wb3NpdGUgY29tcCA9IChUYWJiZWRQcm9wZXJ0eUNvbXBvc2l0ZSkKLQkvLyBwYWdlLmdldENvbnRyb2woKTsKLQkvLyBUYWJiZWRQcm9wZXJ0eVRpdGxlIHRpdGxlID0gY29tcC5nZXRUaXRsZSgpOwotCS8vIGlmICh0aXRsZUltYWdlID09IG51bGwpCi0JLy8gewotCS8vIHRpdGxlSW1hZ2UgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLmdldEltYWdlKCk7Ci0JLy8gfQotCS8vIHRpdGxlLnNldFRpdGxlKG5hbWUsIHRpdGxlSW1hZ2UpOwotCS8vIH0KLQkKLQkKLQkKLQkvKioKLQkgKiBHZXQgbmFtZSBwcmVmaXggZm9yIHRoZSBlbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lUHJlZml4KCkgewotCQlyZXR1cm4gIlByb2Nlc3NFbGVtZW50OiAiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlEb2N1bWVudFNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5RG9jdW1lbnRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE5YjI4NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlEb2N1bWVudFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuUmljaFRleHRJbWFnZUxpbmtDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLQotLyoqCi0gKiBUaGUgZG9jdW1lbnQgdGFiIGZvciBBY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURvY3VtZW50U2VjdGlvbiBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24gewotCi0JcHJvdGVjdGVkIEFjdGl2aXR5IGVsZW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IG1haW5EZXNjVGV4dDsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgcHVycG9zZVRleHQ7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGFsdGVybmF0aXZlc1RleHQ7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGhvd1RvU3RhZmZUZXh0OwotCi0JcHJpdmF0ZSBMaXN0ZW5lciBwdXJwb3NlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZXhwYW5kRmxhZyA/IGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJOiBwdXJwb3NlVGV4dDsKLQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKEFjdGl2aXR5RGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRQdXJwb3NlKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJcHVycG9zZVRleHQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlbGVtZW50Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCksIG5ld0NvbnRlbnQsIC0xKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIExpc3RlbmVyIG1haW5EZXNjTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZXhwYW5kRmxhZyA/IGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJOiBtYWluRGVzY1RleHQ7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChBY3Rpdml0eURlc2NyaXB0aW9uKSBlbGVtZW50Ci0JCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJbWFpbkRlc2NUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSwgbmV3Q29udGVudCwKLQkJCQkJCS0xKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIExpc3RlbmVyIGFsdGVybmF0aXZlc0xpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0JCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGV4cGFuZEZsYWcgPyBjdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCTogYWx0ZXJuYXRpdmVzVGV4dDsKLQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKEFjdGl2aXR5RGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRBbHRlcm5hdGl2ZXMoKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQlhbHRlcm5hdGl2ZXNUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCksIG5ld0NvbnRlbnQsIC0xKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIExpc3RlbmVyIGhvd1RvU3RhZmZMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZWxlbWVudCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBleHBhbmRGbGFnID8gY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQk6IGhvd1RvU3RhZmZUZXh0OwotCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9ICgoQWN0aXZpdHlEZXNjcmlwdGlvbikgZWxlbWVudAotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldEhvd3RvU3RhZmYoKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQlob3dUb1N0YWZmVGV4dCwgb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKSwgbmV3Q29udGVudCwgLTEpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNjcmVhdGVEb2N1bWVudFNlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURvY3VtZW50U2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWludCBtYWluRGVzY2hlaWdodEhpbnQgPSAxMDA7Ci0KLQkJc3VwZXIuY3JlYXRlRG9jdW1lbnRTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0KLQkJLy8gbWFpbiBkZXNjcmlwdGlvbgotCQlSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciBtYWluRGVzY0NvbnRhaW5lciA9IEZvcm1VSS5jcmVhdGVSaWNoVGV4dFdpdGhMaW5rKHRvb2xraXQsCi0JCQkJZG9jdW1lbnRDb21wb3NpdGUsIG1haW5EZXNjaGVpZ2h0SGludCwgY29udGVudEVsZW1lbnRQYXRoLCBlbGVtZW50LAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19tYWluRGVzY3JpcHRpb24pOwotCQlhZGRIeXBlckxpbmtMaXN0ZW5lcihtYWluRGVzY0NvbnRhaW5lci5saW5rKTsKLQkJbWFpbkRlc2NUZXh0ID0gbWFpbkRlc2NDb250YWluZXIucmljaFRleHQ7Ci0KLQkJLy8gcHVycG9zZQotCQlSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciBwdXJwb3NlQ29udGFpbmVyID0gRm9ybVVJLmNyZWF0ZVJpY2hUZXh0V2l0aExpbmsodG9vbGtpdCwKLQkJCQlkb2N1bWVudENvbXBvc2l0ZSwgaGVpZ2h0SGludCwgY29udGVudEVsZW1lbnRQYXRoLCBlbGVtZW50LAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19wdXJwb3NlKTsKLQkJYWRkSHlwZXJMaW5rTGlzdGVuZXIocHVycG9zZUNvbnRhaW5lci5saW5rKTsKLQkJcHVycG9zZVRleHQgPSBwdXJwb3NlQ29udGFpbmVyLnJpY2hUZXh0OwotCi0JCS8vIGNyZWF0ZSBhbHRlcm5hdGl2ZXMKLQkJUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIgYWx0ZXJuYXRpdmVzQ29udGFpbmVyID0gRm9ybVVJLmNyZWF0ZVJpY2hUZXh0V2l0aExpbmsodG9vbGtpdCwKLQkJCQlkb2N1bWVudENvbXBvc2l0ZSwgaGVpZ2h0SGludCwgY29udGVudEVsZW1lbnRQYXRoLCBlbGVtZW50LAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfYWx0ZXJuYXRpdmVzKTsKLQkJYWRkSHlwZXJMaW5rTGlzdGVuZXIoYWx0ZXJuYXRpdmVzQ29udGFpbmVyLmxpbmspOwotCQlhbHRlcm5hdGl2ZXNUZXh0ID0gYWx0ZXJuYXRpdmVzQ29udGFpbmVyLnJpY2hUZXh0OwotCQkKLQkJLy8gY3JlYXRlIGhvd3RvU3RhZmYKLQkJUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIgaG93VG9TdGFmZkNvbnRhaW5lciA9IEZvcm1VSS5jcmVhdGVSaWNoVGV4dFdpdGhMaW5rKHRvb2xraXQsCi0JCQkJZG9jdW1lbnRDb21wb3NpdGUsIGhlaWdodEhpbnQsIGNvbnRlbnRFbGVtZW50UGF0aCwgZWxlbWVudCwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X2hvd1RvU3RhZmYpOwotCQlhZGRIeXBlckxpbmtMaXN0ZW5lcihob3dUb1N0YWZmQ29udGFpbmVyLmxpbmspOwotCQlob3dUb1N0YWZmVGV4dCA9IGhvd1RvU3RhZmZDb250YWluZXIucmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0JCQotCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCQotCQlwdXJwb3NlVGV4dC5zZXRNb2RhbE9iamVjdChlbGVtZW50KTsKLQkJcHVycG9zZVRleHQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCkpOwotCQlwdXJwb3NlVGV4dC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgcHVycG9zZUxpc3RlbmVyKTsKLQkJCi0JCW1haW5EZXNjVGV4dC5zZXRNb2RhbE9iamVjdChlbGVtZW50KTsKLQkJbWFpbkRlc2NUZXh0LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkpOwotCQltYWluRGVzY1RleHQuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG1haW5EZXNjTGlzdGVuZXIpOwotCQkJCQotCQlhbHRlcm5hdGl2ZXNUZXh0LnNldE1vZGFsT2JqZWN0KGVsZW1lbnQpOwotCQlhbHRlcm5hdGl2ZXNUZXh0LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpKTsKLQkJYWx0ZXJuYXRpdmVzVGV4dC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgYWx0ZXJuYXRpdmVzTGlzdGVuZXIpOwotCQkKLQkJaG93VG9TdGFmZlRleHQuc2V0TW9kYWxPYmplY3QoZWxlbWVudCk7Ci0JCWhvd1RvU3RhZmZUZXh0LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKSk7Ci0JCWhvd1RvU3RhZmZUZXh0LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBob3dUb1N0YWZmTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jdXBkYXRlQ29udHJvbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlzdXBlci51cGRhdGVDb250cm9scygpOwotCQlwdXJwb3NlVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCW1haW5EZXNjVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWFsdGVybmF0aXZlc1RleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQlob3dUb1N0YWZmVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2F2ZU1vZGlmaWVkUmljaFRleHQoKTsKLQotCQkJCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQkJCQlBY3Rpdml0eURlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQWN0aXZpdHlEZXNjcmlwdGlvbikgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCi0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCW1haW5EZXNjVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCQlwdXJwb3NlVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCQlhbHRlcm5hdGl2ZXNUZXh0Ci0JCQkJCQkJLnJlbW92ZU1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCWhvd1RvU3RhZmZUZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCQkuc2V0RWxlbWVudChlbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCW1haW5EZXNjVGV4dC5zZXRUZXh0KGNvbnRlbnQuZ2V0TWFpbkRlc2NyaXB0aW9uKCkpOwotCQkJCXB1cnBvc2VUZXh0LnNldFRleHQoY29udGVudC5nZXRQdXJwb3NlKCkpOwotCQkJCWFsdGVybmF0aXZlc1RleHQuc2V0VGV4dChjb250ZW50LmdldEFsdGVybmF0aXZlcygpKTsKLQkJCQlob3dUb1N0YWZmVGV4dC5zZXRUZXh0KGNvbnRlbnQuZ2V0SG93dG9TdGFmZigpKTsKLQotCQkJCWlmIChleHBhbmRGbGFnKSB7Ci0JCQkJCWlmICgoKExhYmVsKWV4cGFuZERvY3VtZW50TGFiZWwuZ2V0Q29udHJvbCgpKS5nZXRUZXh0KCkuZXF1YWxzKAotCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19tYWluRGVzY3JpcHRpb24pKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0VGV4dChjb250ZW50Ci0JCQkJCQkJCS5nZXRNYWluRGVzY3JpcHRpb24oKSk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFNlbGVjdGlvbigwKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpKTsKLQotCQkJCQl9IGVsc2UgaWYgKCgoTGFiZWwpZXhwYW5kRG9jdW1lbnRMYWJlbC5nZXRDb250cm9sKCkpLmdldFRleHQoKS5lcXVhbHMoCi0JCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX3B1cnBvc2UpKSB7IAotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRUZXh0KGNvbnRlbnQuZ2V0UHVycG9zZSgpKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCkpOwotCQkJCQl9IGVsc2UgaWYgKCgoTGFiZWwpZXhwYW5kRG9jdW1lbnRMYWJlbC5nZXRDb250cm9sKCkpLmdldFRleHQoKS5lcXVhbHMoCi0JCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9hbHRlcm5hdGl2ZXMpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0VGV4dChjb250ZW50Ci0JCQkJCQkJCS5nZXRBbHRlcm5hdGl2ZXMoKSk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQkJCQkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkpOwotCQkJCQl9IGVsc2UgaWYgKCgoTGFiZWwpZXhwYW5kRG9jdW1lbnRMYWJlbC5nZXRDb250cm9sKCkpLmdldFRleHQoKS5lcXVhbHMoCi0JCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9ob3dUb1N0YWZmKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFRleHQoY29udGVudC5nZXRIb3d0b1N0YWZmKCkpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJCQkJLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZShmYWxzZSk7Ci0JCQkJfQotCi0JCQkJbWFpbkRlc2NUZXh0LnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCW1haW5EZXNjVGV4dC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkpOwotCQkJCW1haW5EZXNjVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCi0JCQkJcHVycG9zZVRleHQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJcHVycG9zZVRleHQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCkpOwotCQkJCXB1cnBvc2VUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCQlhbHRlcm5hdGl2ZXNUZXh0LnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCWFsdGVybmF0aXZlc1RleHQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSk7Ci0JCQkJYWx0ZXJuYXRpdmVzVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCi0JCQkJaG93VG9TdGFmZlRleHQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJaG93VG9TdGFmZlRleHQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3d0b1N0YWZmKCkpOwotCQkJCWhvd1RvU3RhZmZUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKAotCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBhY3Rpdml0eSBkb2N1bWVudGF0aW9uIHNlY3Rpb24gOiIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlHZW5lcmFsU2VjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlHZW5lcmFsU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YWNjYTdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5R2VuZXJhbFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkFjdGl2aXR5VmFyaWFiaWxpdHlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Qcm9jZXNzVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NWYXJpYWJpbGl0eUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQWN0aXZpdHlWYXJpYWJpbGl0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9ncy5Db252ZXJ0QWN0aXZpdHlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBUaGUgZ2VuZXJhbCB0YWIgc2VjdGlvbiBmb3IgQWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5R2VuZXJhbFNlY3Rpb24gZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgQWN0aXZpdHkgZWxlbWVudDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfQVBQTElDQUJMRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubm90QXBwbGljYWJsZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJJQlVURVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbnRyaWJ1dGVzX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTkRTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5leHRlbmRzX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBMQUNFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwbGFjZXNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUZXh0IG1vZGVsSW5mb1RleHQ7Ci0KLQlwcml2YXRlIExhYmVsIGFjdGl2aXR5VHlwZUxhYmVsOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfdHlwZV90ZXh0OwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF90eXBlX2J1dHRvbjsKLQotCXByaXZhdGUgQ29tYm8gY3RybF92YXJpYWJpbGl0eTsKLQotCXByaXZhdGUgQ29tYm9WaWV3ZXIgdmlld2VyX3ZhcmlhYmlsaXR5OwotCi0JcHJpdmF0ZSBUZXh0IGJhc2VUZXh0OwotCi0JcHJpdmF0ZSBCdXR0b24gc2VsZWN0QnV0dG9uOwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIHZhcmlhYmlsaXR5TGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJCVZhcmlhYmlsaXR5VHlwZSB2YXJPYmplY3QgPSAoVmFyaWFiaWxpdHlUeXBlKSBvYmplY3Q7Ci0JCQlpZiAodmFyT2JqZWN0ID09IFZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMKQotCQkJCXJldHVybiBOT1RfQVBQTElDQUJMRV9URVhUOwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCkKLQkJCQlyZXR1cm4gQ09OVFJJQlVURVNfVEVYVDsKLQkJCWlmICh2YXJPYmplY3QgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCkKLQkJCQlyZXR1cm4gRVhURU5EU19URVhUOwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVNfTElURVJBTCkKLQkJCQlyZXR1cm4gUkVQTEFDRVNfVEVYVDsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUNvbnRlbnRQcm92aWRlciB2YXJpYWJpbGl0eUNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJTGlzdCB2YXJpYWJpbGl0eVR5cGVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXZhcmlhYmlsaXR5VHlwZXNMaXN0LmFkZChWYXJpYWJpbGl0eVR5cGUuTkFfTElURVJBTCk7Ci0JCQl2YXJpYWJpbGl0eVR5cGVzTGlzdC5hZGQoVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwpOwotCQkJdmFyaWFiaWxpdHlUeXBlc0xpc3QuYWRkKFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpOwotCQkJdmFyaWFiaWxpdHlUeXBlc0xpc3QuYWRkKFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFU19MSVRFUkFMKTsKLQkJCXJldHVybiB2YXJpYWJpbGl0eVR5cGVzTGlzdC50b0FycmF5KCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCS8vIGdldCBhY3Rpdml0eSBvYmplY3QKLQkJZWxlbWVudCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jY3JlYXRlR2VuZXJhbFNlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdlbmVyYWxTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJc3VwZXIuY3JlYXRlR2VuZXJhbFNlY3Rpb24oY29tcG9zaXRlKTsKLQotCQkvLyBNb2RlbCBJbmZvCi0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfTW9kZWxJbmZvKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1vZGVsSW5mb1RleHQgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVNXVC5ERUZBVUxULCBob3Jpem9udGFsU3Bhbik7Ci0JCW1vZGVsSW5mb1RleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCW1vZGVsSW5mb1RleHQuc2V0VGV4dChnZXRNb2RlbEluZm8oKSk7Ci0KLQkJLy8gVHlwZSBvZiBhbiBBY3Rpdml0eQotCQlhY3Rpdml0eVR5cGVMYWJlbCA9IEZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfVHlwZSk7Ci0JCQotCQljdHJsX3R5cGVfdGV4dCA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIiwgU1dULlJFQURfT05MWSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HIHwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCWN0cmxfdHlwZV90ZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWN0cmxfdHlwZV9idXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5DSEFOR0VfVFlQRV9CVVRUT05fVEVYVCwgU1dULlBVU0gpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJY3RybF90eXBlX2J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlpZiAoQ29udmVydEFjdGl2aXR5RGlhbG9nLmdldFZhbGlkTmV3QWN0aXZpdHlUeXBlcyhlbGVtZW50KSA9PSBudWxsKSB7Ci0JCQljdHJsX3R5cGVfYnV0dG9uLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0KLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFZhcmlhYmlsaXR5IFR5cGUKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlZBUklBQklMSVRZX1RZUEVfVEVYVCk7Ci0KLQkJY3RybF92YXJpYWJpbGl0eSA9IEZvcm1VSS5jcmVhdGVDb21ibyh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCAyKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCWN0cmxfdmFyaWFiaWxpdHkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQl2aWV3ZXJfdmFyaWFiaWxpdHkgPSBuZXcgQ29tYm9WaWV3ZXIoY3RybF92YXJpYWJpbGl0eSk7Ci0JCXZpZXdlcl92YXJpYWJpbGl0eS5nZXRDb21ibygpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKDEpKTsKLQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldENvbnRlbnRQcm92aWRlcih2YXJpYWJpbGl0eUNvbnRlbnRQcm92aWRlcik7Ci0JCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRMYWJlbFByb3ZpZGVyKHZhcmlhYmlsaXR5TGFiZWxQcm92aWRlcik7Ci0JCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRJbnB1dChlbGVtZW50KTsKLQotCQlMYWJlbCBibGFua0xhYmVsID0gRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJYmxhbmtMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCS8vIEJhc2UgZWxlbWVudHMKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkJBU0VfRUxFTUVOVF9URVhUKTsKLQotCQliYXNlVGV4dCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUpOwotCQl7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcKLQkJCQkJfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJYmFzZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCX0KLQkJYmFzZVRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJLy8gQnV0dG9uIHRvIHNlbGVjdAotCQlzZWxlY3RCdXR0b24gPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlNFTEVDVF9CVVRUT05fVEVYVCk7Ci0JfQotCi0JLyoqCi0JICogYWRkIGxpc3RlbmVycwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0JCWN0cmxfdHlwZV9idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZmluYWwgUHJvY2Vzc0VkaXRvciBlZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgZ2V0RWRpdG9yKCk7Ci0JCQkJaWYgKGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hhbmdlQWN0aXZpdHlUeXBlV2FybmluZ0RpYWxvZ190aXRsZTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UxOyAvLyROT04tTkxTLTEkCi0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbWVzc2FnZSk7Ci0JCQkJfSBlbHNlICB7Ci0JCQkJCW5hbWVUZXh0LnJlbW92ZUxpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCQkJCW5hbWVEZWFjdGl2YXRlTGlzdGVuZXIpOwotCQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5yZW1vdmVMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwKLQkJCQkJCQlwcmVzZW50YXRpb25OYW1lRGVhY3RpdmF0ZUxpc3RlbmVyKTsKLQotCQkJCQlBY3Rpdml0eSBuZXdBY3Rpdml0eSA9IENvbnZlcnRBY3Rpdml0eURpYWxvZwotCQkJCQkucXVlcnlVc2VyQW5kQ29udmVydCgoQWN0aXZpdHkpIGVsZW1lbnQsIG51bGwsIG51bGwpOwotCQkJCQlpZiAobmV3QWN0aXZpdHkgIT0gbnVsbCkgewotCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQkJCW5ld0FjdGl2aXR5KTsKLQkJCQkJCS8vIGRlYWwgd2l0aCBwcm9wZXJ0eSBzaGVldCBkaXJlY3RseS4KLQkJCQkJCWdldFByb3BlcnR5U2hlZXRQYWdlKCkuc2VsZWN0aW9uQ2hhbmdlZChnZXRQYXJ0KCksCi0JCQkJCQkJCXNlbCk7Ci0JCQkJCQkvLyBnZXRFZGl0b3IoKS5zZXRTZWxlY3Rpb24oc2VsKTsKLQkJCQkJCXJlZnJlc2goKTsKLQkJCQkJCSgoUHJvY2Vzc1ZpZXdlcikgKChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIGdldEVkaXRvcigpCi0JCQkJCQkJCS5nZXRBY3RpdmVQYWdlSW5zdGFuY2UoKSkuZ2V0Vmlld2VyKCkpCi0JCQkJCQkJCS5leHBhbmRUb0xldmVsKG5ld0FjdGl2aXR5LCAzKTsKLQkJCQkJfQotCQkJCQluYW1lVGV4dC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwKLQkJCQkJCQluYW1lRGVhY3RpdmF0ZUxpc3RlbmVyKTsKLQkJCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJCQkJcHJlc2VudGF0aW9uTmFtZURlYWN0aXZhdGVMaXN0ZW5lcik7Ci0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfdmFyaWFiaWxpdHkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3ZhcmlhYmlsaXR5Ci0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSA9IChWYXJpYWJpbGl0eVR5cGUpIHNlbGVjdGlvbgotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCi0JCQkJaWYgKHZlICE9IG51bGwgJiB2ZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0vLwkJCQkJaWYodHlwZS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUwpCi0vLwkJCQkJCQkmJiB2ZSBpbnN0YW5jZW9mIFByb2Nlc3MpewotLy8JCQkJCQlPYmplY3RbXSBhcmdzID0geyBlbGVtZW50LmdldE5hbWUoKSB9OwotLy8JCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0vLwkJCQkJCS5iaW5kKAotLy8JCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzEsCi0vLwkJCQkJCQkJYXJncyk7Ci0vLwotLy8JCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLS8vCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0vLwkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCAiIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCQkJVmFyaWFiaWxpdHlUeXBlIHZ0eXBlID0gZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLS8vCQkJCQkJaWYodnR5cGUgIT0gbnVsbCl7Ci0vLwkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih2dHlwZSk7Ci0vLwkJCQkJCQl2aWV3ZXJfdmFyaWFiaWxpdHkuc2V0U2VsZWN0aW9uKHNlbCk7Ci0vLwkJCQkJCX0KLS8vCQkJCQkJcmV0dXJuOwotLy8JCQkJCX0KLS8vCQkJCQlpZiAoUHJvY2Vzc1V0aWwuaGFzQ29udHJpYnV0b3JPclJlcGxhY2VyKChBY3Rpdml0eSkgdmUpCi0vLwkJCQkJCQkmJiB0eXBlLmVxdWFscyhWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKSkgewotLy8JCQkJCQlPYmplY3RbXSBhcmdzID0geyBlbGVtZW50LmdldE5hbWUoKSwKLS8vCQkJCQkJCQkoKEFjdGl2aXR5KSB2ZSkuZ2V0TmFtZSgpIH07Ci0vLwkJCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLS8vCQkJCQkJCQkuYmluZCgKLS8vCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZywKLS8vCQkJCQkJCQkJCWFyZ3MpOwotLy8KLS8vCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0vLwkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQkJCQkJVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IGVsZW1lbnQKLS8vCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0vLwkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIG5ld1ZhcmlhYmlsaXR5U2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0vLwkJCQkJCQkJdmFyaWFiaWxpdHlUeXBlKTsKLS8vCQkJCQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldFNlbGVjdGlvbigKLS8vCQkJCQkJCQluZXdWYXJpYWJpbGl0eVNlbGVjdGlvbiwgdHJ1ZSk7Ci0vLwotLy8JCQkJCQlyZXR1cm47Ci0vLwkJCQkJfQotCQkJCQkKLQkJCQkJaWYodHlwZSAhPSBWYXJpYWJpbGl0eVR5cGUuTkFfTElURVJBTCkgewotCQkJCQkJSVN0YXR1cyBzdGF0ZSA9IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5QWZ0ZXJGaWx0ZXJTZWxlY3Rpb24oZWxlbWVudCwgKEFjdGl2aXR5KSB2ZSwgdHlwZSk7Ci0JCQkJCQlpZighc3RhdGUuaXNPSygpKSB7Ci0JCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwgc3RhdGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQkKLQkJCQkJCQkvLyBzZXQgdmFyaWFiaWxpdHkgdG8gYmFjayB3aGF0ZXZlciBpdCB3YXMgZm9yIFVJCi0JCQkJCQkJVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gbmV3VmFyaWFiaWxpdHlTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCQkJCXZhcmlhYmlsaXR5VHlwZSk7Ci0JCQkJCQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldFNlbGVjdGlvbihuZXdWYXJpYWJpbGl0eVNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQllbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKSwKLQkJCQkJCQl0eXBlLCAtMSk7Ci0JCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQlpZiAoZWxlbWVudC5nZXRQcmVzZW50YXRpb25OYW1lKCkgPT0gbnVsbAotCQkJCQkJCQl8fCBlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKS5lcXVhbHMoIiIpKSB7Ci0JCQkJCQkJaWYgKHR5cGUuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMKSkKLQkJCQkJCQkJZWxlbWVudC5zZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlpZiAoZWxlbWVudC5nZXRQcmVzZW50YXRpb25OYW1lKCkgPT0gbnVsbAotCQkJCQkJCXx8IGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpLmVxdWFscygiIikpIHsKLQkJCQkJCWlmICh0eXBlLmVxdWFscyhWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCkKLQkJCQkJCQkJfHwgdHlwZQotCQkJCQkJCQkJCS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUwpKQotCQkJCQkJCWVsZW1lbnQuc2V0UHJlc2VudGF0aW9uTmFtZShlbGVtZW50LmdldE5hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTkFfTElURVJBTCkgewotCQkJCQlpZiAodmUgIT0gbnVsbCkgewotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwKLQkJCQkJCQkJCQludWxsLCAtMSk7Ci0KLQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXNlbGVjdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJYmFzZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgewotCQkJCQlMaXN0IHNlbGVjdGlvbkJhc2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IGVsZW1lbnQKLQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQlzZWxlY3Rpb25CYXNlTGlzdC5hZGQoYmFzZSk7Ci0JCQkJCXNlbGVjdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCi0JCQkJfQotCQkJCS8vIHNldEZvcm1UZXh0V2l0aFZhcmlhYmxlSW5mbygpOwotCQkJfQotCQl9KTsKLQotCQlzZWxlY3RCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRDb25maWd1cmF0aW9uKCk7Ci0JCQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuUFJPQ0VTU0VTOwotCi0JCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSAoVmFyaWFiaWxpdHlUeXBlKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfdmFyaWFiaWxpdHkKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBBY3Rpdml0eVZhcmlhYmlsaXR5RmlsdGVyKGNvbmZpZywgbnVsbCwKLQkJCQkJCXRhYk5hbWUsIGVsZW1lbnQpOwotCi0JCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCQlmaWx0ZXIsIHRhYk5hbWUsIG51bGwsIGNvbmZpZyk7Ci0JCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZmQuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKHRydWUpOwotCQkJCWZkLnNldFRpdGxlKHRhYk5hbWUpOwotCQkJCWZkLm9wZW4oKTsKLQotCQkJCUxpc3Qgc2VsZWN0ZWRJdGVtcyA9IGZkLmdldFNlbGVjdGVkSXRlbXMoKTsKLQotCQkJCWlmIChzZWxlY3RlZEl0ZW1zICE9IG51bGwgJiYgIXNlbGVjdGVkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQkJCU9iamVjdCBvID0gc2VsZWN0ZWRJdGVtcy5nZXQoMCk7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLS8vCQkJCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvOwotLy8JCQkJCQlpZiAoaXNEaXJlY3RQYXJlbnQoYWN0KQotLy8JCQkJCQkJCXx8ICgoYWN0IGluc3RhbmNlb2YgUHJvY2VzcykgJiYgdHlwZS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUwpCi0vLwkJCQkJCQkJCQkmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSkpIAotLy8JCQkJCQl7Ci0vLwkJCQkJCQlPYmplY3RbXSBhcmdzID0geyBlbGVtZW50LmdldE5hbWUoKSB9OwotLy8JCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotLy8JCQkJCQkJCQkuYmluZCgKLS8vCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cxLAotLy8JCQkJCQkJCQkJCWFyZ3MpOwotLy8KLS8vCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotLy8JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0vLwkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQkJCQkJCXJldHVybjsKLS8vCQkJCQkJfQotLy8JCQkJCQlpZiAoaXNDaXJjdWxhckRlcGVuZGVuY3koYWN0KSkgewotLy8JCQkJCQkJT2JqZWN0W10gYXJncyA9IHsgZWxlbWVudC5nZXROYW1lKCksIGFjdC5nZXROYW1lKCkgfTsKLS8vCQkJCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLS8vCQkJCQkJCQkJLmJpbmQoCi0vLwkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMiwKLS8vCQkJCQkJCQkJCQlhcmdzKTsKLS8vCi0vLwkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLS8vCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCAiIik7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwkJCQkJCQlyZXR1cm47Ci0vLwkJCQkJCX0KLS8vCQkJCQkJLy8gYmxvY2sgZm9yIGNoaWxkcmVuCi0vLwkJCQkJCWlmIChQcm9jZXNzVXRpbC5oYXNDb250cmlidXRvck9yUmVwbGFjZXIoYWN0KQotLy8JCQkJCQkJCSYmIHR5cGUuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpKSB7Ci0vLwkJCQkJCQlPYmplY3RbXSBhcmdzID0geyBlbGVtZW50LmdldE5hbWUoKSwgYWN0LmdldE5hbWUoKSB9OwotLy8JCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotLy8JCQkJCQkJCQkuYmluZCgKLS8vCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2csCi0vLwkJCQkJCQkJCQkJYXJncyk7Ci0vLwotLy8JCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0vLwkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLS8vCQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0vLwotLy8JCQkJCQkJcmV0dXJuOwotLy8JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3lBZnRlckZpbHRlclNlbGVjdGlvbihlbGVtZW50LCAoQWN0aXZpdHkpIG8sIHR5cGUpOwotCQkJCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLCBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsJCQkJCQkKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIG87Ci0KLQkJCQkJCUlDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IFByb2Nlc3NWYXJpYWJpbGl0eUNvbmZpZ3VyYXRvcigKLQkJCQkJCQkJZ2V0RGVmYXVsdENvbmZpZ3VyYXRpb24oKSwgbnVsbCk7Ci0JCQkJCQlBY3Rpdml0eVZhcmlhYmlsaXR5Q29tbWFuZCBjbWQgPSBuZXcgQWN0aXZpdHlWYXJpYWJpbGl0eUNvbW1hbmQoCi0JCQkJCQkJCWVsZW1lbnQsIHZlLCB0eXBlLCBjb25maWd1cmF0b3IpOwotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCi0JCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQotCQkJCQkJYmFzZVRleHQuc2V0VGV4dChUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgodmUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgbW9kZWwgaW5mb3JtYXRpb24gZm9yIHRoZSBhY3Rpdml0eQotCSAqIEByZXR1cm4KLQkgKiAJCQltb2RlbCBpbmZvIHN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldE1vZGVsSW5mbygpIHsKLQkJU3RyaW5nIGluZm8gPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlPYmplY3QgbyA9IGdldEFkYXB0ZXIoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBvOwotCQkJCWluZm8gPSBhZGFwdGVyLmdldEF0dHJpYnV0ZShlbGVtZW50LAotCQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHByaW50IGV4Y2VwdGlvbgotCQl9Ci0JCWlmICghKFN0clV0aWwuaXNCbGFuayhpbmZvKSkpCi0JCQlyZXR1cm4gaW5mbzsKLQkJZWxzZQotCQkJcmV0dXJuIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Ob25lOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiN1cGRhdGVDb250cm9scygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCXN1cGVyLnVwZGF0ZUNvbnRyb2xzKCk7Ci0KLQkJY3RybF90eXBlX2J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF92YXJpYWJpbGl0eS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJc2VsZWN0QnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCi0JCWN0cmxfdmFyaWFiaWxpdHkuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmICgoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfdmFyaWFiaWxpdHkuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJLmdldEZpcnN0RWxlbWVudCgpID09IFZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMKSB7Ci0JCQlzZWxlY3RCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXN1cGVyLnJlZnJlc2goKTsKLQotCQkJCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQotCQkJCW1vZGVsSW5mb1RleHQuc2V0VGV4dChnZXRNb2RlbEluZm8oKSk7Ci0KLQkJCQljdHJsX3R5cGVfdGV4dC5zZXRUZXh0KFByb3BlcnRpZXNVdGlsLmdldFR5cGUoZWxlbWVudCkpOwotCi0JCQkJLy8gaGlkZS9zaG93IGNvbWJvCi0JCQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKQotCQkJCQkJJiYgKGVsZW1lbnQuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCB8fCBlbGVtZW50Ci0JCQkJCQkJCS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSkgewotCQkJCQlhY3Rpdml0eVR5cGVMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJY3RybF90eXBlX3RleHQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCWN0cmxfdHlwZV9idXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYWN0aXZpdHlUeXBlTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJY3RybF90eXBlX3RleHQuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJY3RybF90eXBlX2J1dHRvbi5zZXRWaXNpYmxlKHRydWUpOwotCQkJCX0KLQotCQkJCVZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBlbGVtZW50LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIG5ld1ZhcmlhYmlsaXR5U2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQl2YXJpYWJpbGl0eVR5cGUpOwotCQkJCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRTZWxlY3Rpb24obmV3VmFyaWFiaWxpdHlTZWxlY3Rpb24sIHRydWUpOwotCi0JCQkJaWYgKGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpCi0JCQkJCWJhc2VUZXh0LnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVsZW1lbnQKLQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSk7Ci0JCQkJZWxzZQotCQkJCQliYXNlVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgQWN0aXZpdHkgZ2VuZXJhbCBzZWN0aW9uIDogIiArIGVsZW1lbnQsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNnZXROYW1lUHJlZml4KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVQcmVmaXgoKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfQ0FQQUJJTElUWV9QQVRURVJOICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfREVMSVZFUllfUFJPQ0VTUyArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUGhhc2UpIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfUEhBU0UgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9JVEVSQVRJT04gKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZQotCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9BQ1RJVklUWSArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5R3VpZGFuY2VTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eUd1aWRhbmNlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxODc0YTIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5R3VpZGFuY2VTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzR3VpZGFuY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFkZEd1aWRhbmNlVG9BY3Rpdml0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotLyoqCi0gKiBUaGUgYWN0aXZpdHkgZ3VpZGFuY2Ugc2VjdGlvbi4gSXQgbGlzdCBhbGwgYXZhaWFibGUgZ3VpZGFuY2VzIG9mIGFuIGFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5R3VpZGFuY2VTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9hZGRfMSwgY3RybF9yZW1vdmVfMSwgY3RybF9hZGRfMiwgY3RybF9yZW1vdmVfMjsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfYWRkXzMsIGN0cmxfcmVtb3ZlXzMsIGN0cmxfYWRkXzQsIGN0cmxfcmVtb3ZlXzQ7Ci0KLQlwcml2YXRlIFRhYmxlIGN0cmxfdGFibGVfMSwgY3RybF90YWJsZV8yLCBjdHJsX3RhYmxlXzMsIGN0cmxfdGFibGVfNDsKLQotCXByaXZhdGUgU2VjdGlvbiBjb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uLCBlZHVjYXRpb25NYXRlcmlhbFNlY3Rpb247Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIHZpZXdlcl8xLCB2aWV3ZXJfMiwgdmlld2VyXzMsIHZpZXdlcl80OwotCi0JLy8gZWxlbWVudAotCXByaXZhdGUgQWN0aXZpdHkgZWxlbWVudDsKLQotCS8vIGFjdGlvbiBtYW5hZ2VyCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0KLQlwcml2YXRlIElGaWx0ZXIgcm9hZE1hcEZpbHRlciA9IG51bGw7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZ2VuZXJhbEd1aWRhbmNlRmlsdGVyID0gbnVsbDsKLQotCXByaXZhdGUgSUZpbHRlciBzdXBwb3J0aW5nTWF0ZXJpYWxGaWx0ZXIgPSBudWxsOwotCi0JLyoqCi0JICogR2V0IHJvYWQgbWFwIGd1aWRhbmNlIGZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFJvYWRNYXBGaWx0ZXIoKSB7Ci0JCWlmIChyb2FkTWFwRmlsdGVyID09IG51bGwpIHsKLQkJCXJvYWRNYXBGaWx0ZXIgPSBuZXcgUHJvY2Vzc0d1aWRhbmNlRmlsdGVyKGdldENvbmZpZ3VyYXRpb24oKSwgbnVsbCwKLQkJCQkJdGFiTmFtZSkgewotCQkJCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9ICgoR3VpZGFuY2VJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VGV4dChvYmopOwotCQkJCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1JvYWRtYXAiKSkgJiYgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkhKChHdWlkYW5jZUl0ZW1Qcm92aWRlcikgb2JqKS5nZXRDaGlsZHJlbihvYmopCi0JCQkJCQkJCQkJLmlzRW1wdHkoKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJaWYgKChvYmogaW5zdGFuY2VvZiBSb2FkbWFwKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfTsKLQkJfSBlbHNlIHsKLQkJCSgoUHJvY2Vzc0d1aWRhbmNlRmlsdGVyKSByb2FkTWFwRmlsdGVyKS5zZXRNZXRob2RDb25maWd1cmF0aW9uKGdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCX0KLQotCQlyZXR1cm4gcm9hZE1hcEZpbHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgR2VuZXJhbCBndWlkYW5jZSBmaWx0ZXIKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRHZW5lcmFsR3VpZGFuY2VGaWx0ZXIoKSB7Ci0JCWlmIChnZW5lcmFsR3VpZGFuY2VGaWx0ZXIgPT0gbnVsbCkgewotCQkJZ2VuZXJhbEd1aWRhbmNlRmlsdGVyID0gbmV3IFByb2Nlc3NHdWlkYW5jZUZpbHRlcigKLQkJCQkJZ2V0Q29uZmlndXJhdGlvbigpLCBudWxsLCB0YWJOYW1lKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2VJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCWlmICgoKEd1aWRhbmNlSXRlbVByb3ZpZGVyKSBvYmopLmdldENoaWxkcmVuKG9iaikKLQkJCQkJCQkJLmlzRW1wdHkoKSkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQkJQ2xhc3MgY2xzID0gRmlsdGVySW5pdGlhbGl6ZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDbGFzc0ZvclR5cGUoaGVscGVyLmdldEZpbHRlclR5cGVTdHIoKSk7Ci0JCQkJCWlmIChjbHMgIT0gbnVsbCkgewotCQkJCQkJaWYgKGNscy5pc0luc3RhbmNlKG9iaikpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICgob2JqIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB8fCAob2JqIGluc3RhbmNlb2YgQ29uY2VwdCkKLQkJCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgRXhhbXBsZSkKLQkJCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgR3VpZGVsaW5lKQotCQkJCQkJCXx8IChvYmogaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KQotCQkJCQkJCXx8IChvYmogaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkJfQotCQkJfTsKLQkJfWVsc2UgewotCQkJKChQcm9jZXNzR3VpZGFuY2VGaWx0ZXIpIGdlbmVyYWxHdWlkYW5jZUZpbHRlcikuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihnZXRDb25maWd1cmF0aW9uKCkpOwotCQl9Ci0JCXJldHVybiBnZW5lcmFsR3VpZGFuY2VGaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0IFN1cHBvcnRpbmcgbWF0ZXJpY2FsIGd1aWRhbmNlIGZpbHRlcgotCSAqIAotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFN1cHBvcnRpbmdNYXRlcmlhbEZpbHRlcigpIHsKLQkJaWYgKHN1cHBvcnRpbmdNYXRlcmlhbEZpbHRlciA9PSBudWxsKSB7Ci0JCQlzdXBwb3J0aW5nTWF0ZXJpYWxGaWx0ZXIgPSBuZXcgUHJvY2Vzc0d1aWRhbmNlRmlsdGVyKAotCQkJCQlnZXRDb25maWd1cmF0aW9uKCksIG51bGwsIHRhYk5hbWUpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJCWlmIChzdXBlci5jaGlsZEFjY2VwdChvYmopKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWlmICgob2JqIGluc3RhbmNlb2YgR3VpZGFuY2VJdGVtUHJvdmlkZXIpCi0JCQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX07Ci0JCX0gZWxzZSB7Ci0JCQkoKFByb2Nlc3NHdWlkYW5jZUZpbHRlcikgc3VwcG9ydGluZ01hdGVyaWFsRmlsdGVyKS5zZXRNZXRob2RDb25maWd1cmF0aW9uKGdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbEZpbHRlcjsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCQlpbml0KCk7Ci0KLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIGNyZWF0ZSBndWlkYW5jZSBzZWN0aW9uCi0JCWNyZWF0ZUd1aWRhbmNlU2VjdGlvbihwYXJlbnQpOwotCi0JCS8vIGFkZCBsaXN0ZW5lcnMKLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRyb2xzCi0JCXVwZGF0ZUNvbnRyb2xzKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCS8vIGdldCBhY3Rpdml0eSBvYmplY3QKLQkJZWxlbWVudCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCi0JCS8vIGdldCB0b29sa2l0Ci0JCXRvb2xraXQgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0KLQkJLy8gZ2V0IGFjdGlvbiBtYW5hZ2VyCi0JCWFjdGlvbk1nciA9IEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdG9nZ2xlU2VjdGlvbigpIHsKLQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykpIHsKLQkJCWlmIChjb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uLmlzRXhwYW5kZWQoKSkKLQkJCQljb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uLnNldEV4cGFuZGVkKGZhbHNlKTsKLQkJCWlmIChlZHVjYXRpb25NYXRlcmlhbFNlY3Rpb24uaXNFeHBhbmRlZCgpKQotCQkJCWVkdWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5zZXRFeHBhbmRlZChmYWxzZSk7Ci0KLQkJCWlmIChjb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uLmlzVmlzaWJsZSgpKQotCQkJCWNvbW11bmljYXRpb25NYXRlcmlhbFNlY3Rpb24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlpZiAoZWR1Y2F0aW9uTWF0ZXJpYWxTZWN0aW9uLmlzVmlzaWJsZSgpKQotCQkJCWVkdWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmICghY29tbXVuaWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5pc0V4cGFuZGVkKCkpCi0JCQkJY29tbXVuaWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJCWlmICghZWR1Y2F0aW9uTWF0ZXJpYWxTZWN0aW9uLmlzRXhwYW5kZWQoKSkKLQkJCQllZHVjYXRpb25NYXRlcmlhbFNlY3Rpb24uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0KLQkJCWlmICghY29tbXVuaWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5pc1Zpc2libGUoKSkKLQkJCQljb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlpZiAoIWVkdWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5pc1Zpc2libGUoKSkKLQkJCQllZHVjYXRpb25NYXRlcmlhbFNlY3Rpb24uc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogIFVwZGF0ZSBjb250cm9scyBiYXNlZCBvbiBlZGl0YWJsZSBmbGFnLiBDb250cm9scyBjYW4gYmVjb21lIGVkaXRhYmxlIG9yIHVuLWVkaXRhYmxlCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCWN0cmxfYWRkXzEuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfYWRkXzIuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfYWRkXzMuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfYWRkXzQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMQotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQkJc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMi5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQkJc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMy5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQljdHJsX3JlbW92ZV8zLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX3JlbW92ZV8zLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQkJc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfNC5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQljdHJsX3JlbW92ZV80LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX3JlbW92ZV80LnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0KLQkJCQl2aWV3ZXJfMS5yZWZyZXNoKCk7Ci0JCQkJdmlld2VyXzIucmVmcmVzaCgpOwotCQkJCXZpZXdlcl8zLnJlZnJlc2goKTsKLQkJCQl2aWV3ZXJfNC5yZWZyZXNoKCk7Ci0KLQkJCQkvLyBoaWRlL3Nob3cgY2VydGFpbiBzZWN0aW9ucy4KLQkJCQl0b2dnbGVTZWN0aW9uKCk7Ci0KLQkJCQkvLyBoaWRlL3Nob3cgY29udHJvbHMKLQkJCQl1cGRhdGVDb250cm9scygpOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKCJFcnJvciByZWZyZXNoaW5nIGFjdGl2aXR5IGd1aWRhbmNlIHNlY3Rpb246ICIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBndWlkYW5jZSBzZWN0aW9uIG9uIHRoZSBnaXZlbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUd1aWRhbmNlU2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWludCB0YWJsZUhlaWdodCA9IDUwOwotCQlTdHJpbmcgc2VjdGlvblRpdGxlID0gbnVsbDsKLQkJU3RyaW5nIHNlY3Rpb25EZXNjID0gbnVsbDsKLQkJU3RyaW5nIHRhYmxlVGl0bGUgPSBudWxsOwotCQkvLyBMYWJlbCB0YWJsZUxhYmVsID0gbnVsbDsKLQotCQkvLyBST0FETUFQCi0JCXsKLQkJCXNlY3Rpb25UaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfUm9hZG1hcFRpdGxlOyAvLyROT04tTkxTLTEkCi0JCQlzZWN0aW9uRGVzYyA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfUm9hZG1hcERlc2NyaXB0aW9uOyAvLyROT04tTkxTLTEkCi0JCQl0YWJsZVRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9TZWxlY3RlZF9Sb2FkbWFwOyAvLyROT04tTkxTLTEkCi0KLQkJCVNlY3Rpb24gc2VjdGlvbiA9IEZvcm1VSS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQkJc2VjdGlvblRpdGxlLCBzZWN0aW9uRGVzYyk7Ci0KLQkJCS8vIGNyZWF0ZSBjb21wb3NpdGUKLQkJCUNvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LAotCQkJCQlzZWN0aW9uLCAyLCBmYWxzZSk7Ci0KLQkJCUNvbXBvc2l0ZSBwYW5lMSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMSwgdGFibGVUaXRsZSk7Ci0KLQkJCWN0cmxfdGFibGVfMSA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSwgdGFibGVIZWlnaHQpOwotCQkJdmlld2VyXzEgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF90YWJsZV8xKTsKLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoZWxlbWVudC5nZXRSb2FkbWFwcygpKS50b0FycmF5KCk7Ci0JCQkJfQotCQkJfTsKLQotCQkJdmlld2VyXzEuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCQl2aWV3ZXJfMS5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQkJdmlld2VyXzEuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTEKLQkJCUNvbXBvc2l0ZSBwYW5lMiA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0KLQkJCWN0cmxfYWRkXzEgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsKLQkJCWN0cmxfcmVtb3ZlXzEgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsKLQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCQl9Ci0KLQkJLy8gR0VORVJBTCBHVUlEQU5DRQotCQl7Ci0JCQlzZWN0aW9uVGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZVRpdGxlOyAvLyROT04tTkxTLTEkCi0JCQlzZWN0aW9uRGVzYyA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlRGVzY3JpcHRpb247IC8vJE5PTi1OTFMtMSQKLQkJCXRhYmxlVGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1NlbGVjdGVkX0dlbmVyYWxHdWlkYW5jZTsgLy8kTk9OLU5MUy0xJAotCi0JCQlTZWN0aW9uIHNlY3Rpb24gPSBGb3JtVUkuY3JlYXRlU2VjdGlvbih0b29sa2l0LCBjb21wb3NpdGUsCi0JCQkJCXNlY3Rpb25UaXRsZSwgc2VjdGlvbkRlc2MpOwotCi0JCQkvLyBjcmVhdGUgY29tcG9zaXRlCi0JCQlDb21wb3NpdGUgc2VjdGlvbkNvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwKLQkJCQkJc2VjdGlvbiwgMiwgZmFsc2UpOwotCi0JCQlDb21wb3NpdGUgcGFuZTEgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTEsIHRhYmxlVGl0bGUpOwotCi0JCQljdHJsX3RhYmxlXzIgPSBGb3JtVUkuY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTEsIHRhYmxlSGVpZ2h0KTsKLQkJCXZpZXdlcl8yID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdGFibGVfMik7Ci0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KGdldFNlbGVjdGVkR3VpZGFuY2VzKCkpLnRvQXJyYXkoKTsKLQkJCQl9Ci0JCQl9OwotCi0JCQl2aWV3ZXJfMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJCXZpZXdlcl8yLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQl2aWV3ZXJfMi5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkJLy8gY3JlYXRlIGJ1dHRvbnMgZm9yIHRhYmxlMgotCQkJQ29tcG9zaXRlIHBhbmUyID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQotCQkJY3RybF9hZGRfMiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOwotCQkJY3RybF9yZW1vdmVfMiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW1vdmUpOwotCi0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0JCX0KLQotCQkvLyBDT01NVU5JQ0FUSU9OIE1BVEVSSUFMCi0JCXsKLQkJCXNlY3Rpb25UaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfQ29tbXVuaWNhdGlvbk1hdGVyaWFsVGl0bGU7IC8vJE5PTi1OTFMtMSQKLQkJCXNlY3Rpb25EZXNjID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbjsgLy8kTk9OLU5MUy0xJAotCQkJdGFibGVUaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfU2VsZWN0ZWRfQ29tbXVuaWNhdGlvbk1hdGVyaWFsOyAvLyROT04tTkxTLTEkCi0KLQkJCVNlY3Rpb24gc2VjdGlvbiA9IEZvcm1VSS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQkJc2VjdGlvblRpdGxlLCBzZWN0aW9uRGVzYyk7Ci0KLQkJCS8vIGNyZWF0ZSBjb21wb3NpdGUKLQkJCUNvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LAotCQkJCQlzZWN0aW9uLCAyLCBmYWxzZSk7Ci0KLQkJCUNvbXBvc2l0ZSBwYW5lMSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMSwgdGFibGVUaXRsZSk7Ci0KLQkJCWN0cmxfdGFibGVfMyA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSwgdGFibGVIZWlnaHQpOwotCQkJdmlld2VyXzMgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF90YWJsZV8zKTsKLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJCQkoKERlbGl2ZXJ5UHJvY2VzcykgZWxlbWVudCkKLQkJCQkJCQkJCQkuZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKSkKLQkJCQkJCQkJLnRvQXJyYXkoKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC50b0FycmF5KCk7Ci0JCQkJfQotCQkJfTsKLQotCQkJdmlld2VyXzMuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCQl2aWV3ZXJfMy5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQkJdmlld2VyXzMuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTIKLQkJCUNvbXBvc2l0ZSBwYW5lMiA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0KLQkJCWN0cmxfYWRkXzMgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsKLQkJCWN0cmxfcmVtb3ZlXzMgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsKLQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCi0JCQljb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uID0gc2VjdGlvbjsKLQotCQl9Ci0KLQkJLy8gRURVQ0FUSU9OIE1BVEVSSUFMCi0JCXsKLQkJCXNlY3Rpb25UaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfRWR1Y2F0aW9uTWF0ZXJpYWxUaXRsZTsgLy8kTk9OLU5MUy0xJAotCQkJc2VjdGlvbkRlc2MgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb247IC8vJE5PTi1OTFMtMSQKLQkJCXRhYmxlVGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1NlbGVjdGVkX0VkdWNhdGlvbk1hdGVyaWFsOyAvLyROT04tTkxTLTEkCi0KLQkJCVNlY3Rpb24gc2VjdGlvbiA9IEZvcm1VSS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQkJc2VjdGlvblRpdGxlLCBzZWN0aW9uRGVzYyk7Ci0KLQkJCS8vIGNyZWF0ZSBjb21wb3NpdGUKLQkJCUNvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LAotCQkJCQlzZWN0aW9uLCAyLCBmYWxzZSk7Ci0KLQkJCUNvbXBvc2l0ZSBwYW5lMSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMSwgdGFibGVUaXRsZSk7Ci0KLQkJCWN0cmxfdGFibGVfNCA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSwgdGFibGVIZWlnaHQpOwotCQkJdmlld2VyXzQgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF90YWJsZV80KTsKLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJCQkoKERlbGl2ZXJ5UHJvY2VzcykgZWxlbWVudCkKLQkJCQkJCQkJCQkuZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCkpLnRvQXJyYXkoKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC50b0FycmF5KCk7Ci0JCQkJfQotCQkJfTsKLQotCQkJdmlld2VyXzQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCQl2aWV3ZXJfNC5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQkJdmlld2VyXzQuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTIKLQkJCUNvbXBvc2l0ZSBwYW5lMiA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0KLQkJCWN0cmxfYWRkXzQgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsKLQkJCWN0cmxfcmVtb3ZlXzQgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsKLQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCi0JCQllZHVjYXRpb25NYXRlcmlhbFNlY3Rpb24gPSBzZWN0aW9uOwotCi0JCX0KLQotCQkvLyBoaWRlL3Nob3cgY2VydGFpbiBzZWN0aW9ucwotCQl0b2dnbGVTZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycwotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBnZXRBZGFwdGVyKCk7Ci0JCU9iamVjdCBwYXJlbnQgPSBudWxsOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJCXBhcmVudCA9IGJzSXRlbVByb3ZpZGVyLmdldFRvcEl0ZW0oKTsKLQkJfSBlbHNlIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoIkFjdGl2aXR5R3VpZGFuY2VTZWN0aW9uOjphZGRMaXN0ZW5lcnMgLSBJQlNJdGVtUHJvdmlkZXIgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQl7Ci0JCQljdHJsX3RhYmxlXzEuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8xCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJdmlld2VyXzEKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMQotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQljdHJsX2FkZF8xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRSb2FkTWFwRmlsdGVyKCk7Ci0JCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBlbGVtZW50LAotCQkJCQkJCUZpbHRlckNvbnN0YW50cy5ST0FETUFQLCBlbGVtZW50LmdldFJvYWRtYXBzKCkpOwotCi0JCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5ST0FETUFQKTsKLQkJCQkJZmQuc2V0SW5wdXQoVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KChFT2JqZWN0KSBlbGVtZW50KSk7Ci0JCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCWFkZEd1aWRhbmNlcyhmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQl2aWV3ZXJfMS5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWN0cmxfcmVtb3ZlXzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8xCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCXJlbW92ZUd1aWRhbmNlcyhybUl0ZW1zKTsKLQkJCQkJCXZpZXdlcl8xLnJlZnJlc2goKTsKLQotCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJdmlld2VyXzEuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQl9Ci0JCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQl7Ci0JCQljdHJsX3RhYmxlXzIuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8yCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCWN0cmxfcmVtb3ZlXzIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJdmlld2VyXzIKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMgotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQljdHJsX2FkZF8yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRHZW5lcmFsR3VpZGFuY2VGaWx0ZXIoKTsKLQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIGVsZW1lbnQsCi0JCQkJCQkJRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFLCBnZXRFeGlzdGluZ0VsZW1lbnRzKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFKTsKLQkJCQkJZmQuc2V0SW5wdXQoVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KChFT2JqZWN0KSBlbGVtZW50KSk7Ci0JCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQlmZC5zZXRUeXBlcyhnZXRGaWx0ZXJUeXBlcygpKTsKLQkJCQkJZmQub3BlbigpOwotCQkJCQlhZGRHdWlkYW5jZXMoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJdmlld2VyXzIucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0pOwotCi0JCQljdHJsX3JlbW92ZV8yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMgotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQlyZW1vdmVHdWlkYW5jZXMocm1JdGVtcyk7Ci0JCQkJCQl2aWV3ZXJfMi5yZWZyZXNoKCk7Ci0KLQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCXZpZXdlcl8yLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJCQkJfQotCQkJCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJewotCQkJY3RybF90YWJsZV8zLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMwotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQljdHJsX3JlbW92ZV8zLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXZpZXdlcl8zCi0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzMKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJfQotCQkJCQl9KTsKLQotCQkJY3RybF9hZGRfMy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCQlEZWxpdmVyeVByb2Nlc3MgcHJvYyA9IChEZWxpdmVyeVByb2Nlc3MpIGVsZW1lbnQ7Ci0KLQkJCQkJCUlGaWx0ZXIgZmlsdGVyID0gZ2V0U3VwcG9ydGluZ01hdGVyaWFsRmlsdGVyKCk7Ci0JCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBwcm9jLAotCQkJCQkJCQlGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFMsIHByb2MKLQkJCQkJCQkJCQkuZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKSk7Ci0KLQkJCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRSk7Ci0JCQkJCQlmZAotCQkJCQkJCQkuc2V0SW5wdXQoVW1hVXRpbAotCQkJCQkJCQkJCS5nZXRNZXRob2RMaWJyYXJ5KChFT2JqZWN0KSBlbGVtZW50KSk7Ci0JCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCWZkLm9wZW4oKTsKLQotCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwKLQkJCQkJCQkJCQlwcm9jLAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWxzKCksCi0JCQkJCQkJCQkJZmQuZ2V0U2VsZWN0ZWRJdGVtcygpLCAtMSk7Ci0JCQkJCX0KLQotCQkJCQl2aWV3ZXJfMy5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWN0cmxfcmVtb3ZlXzMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8zCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJCQlEZWxpdmVyeVByb2Nlc3MgcHJvYyA9IChEZWxpdmVyeVByb2Nlc3MpIGVsZW1lbnQ7Ci0JCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLAotCQkJCQkJCQkJCQlwcm9jLAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKSwKLQkJCQkJCQkJCQkJcm1JdGVtcywgLTEpOwotCQkJCQkJfQotCQkJCQkJdmlld2VyXzMucmVmcmVzaCgpOwotCi0JCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCQl2aWV3ZXJfMy5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCXsKLQkJCWN0cmxfdGFibGVfNC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzQKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJY3RybF9yZW1vdmVfNC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0pOwotCi0JCQl2aWV3ZXJfNAotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl80Ci0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCWN0cmxfYWRkXzQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQkJRGVsaXZlcnlQcm9jZXNzIHByb2MgPSAoRGVsaXZlcnlQcm9jZXNzKSBlbGVtZW50OwotCi0JCQkJCQlJRmlsdGVyIGZpbHRlciA9IGdldFN1cHBvcnRpbmdNYXRlcmlhbEZpbHRlcigpOwotCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJLmdldFNoZWxsKCksIGZpbHRlciwgcHJvYywKLQkJCQkJCQkJRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTLCBwcm9jCi0JCQkJCQkJCQkJLmdldEVkdWNhdGlvbk1hdGVyaWFscygpKTsKLQotCQkJCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFKTsKLQkJCQkJCWZkCi0JCQkJCQkJCS5zZXRJbnB1dChVbWFVdGlsCi0JCQkJCQkJCQkJLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGVsZW1lbnQpKTsKLQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJZmQub3BlbigpOwotCi0JCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLAotCQkJCQkJCQkJCXByb2MsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWxzKCksCi0JCQkJCQkJCQkJZmQuZ2V0U2VsZWN0ZWRJdGVtcygpLCAtMSk7Ci0KLQkJCQkJCXZpZXdlcl80LnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQljdHJsX3JlbW92ZV80LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfNAotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQkJCURlbGl2ZXJ5UHJvY2VzcyBwcm9jID0gKERlbGl2ZXJ5UHJvY2VzcykgZWxlbWVudDsKLQkJCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksCi0JCQkJCQkJCQkJCXByb2MsCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbHMoKSwKLQkJCQkJCQkJCQkJcm1JdGVtcywgLTEpOwotCQkJCQkJfQotCQkJCQkJdmlld2VyXzQucmVmcmVzaCgpOwotCi0JCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCQl2aWV3ZXJfNC5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0KLQkJCQkJfQotCQkJCQljdHJsX3JlbW92ZV80LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgZ3VpZGFuY2VzIHRvIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIGFkZEl0ZW1zCi0JICogCQkJCWxpc3Qgb2YgZ3VpZGFuY2VzIHRvIGFkZAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRHdWlkYW5jZXMoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQotCQlBZGRHdWlkYW5jZVRvQWN0aXZpdHlDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkR3VpZGFuY2VUb0FjdGl2aXR5Q29tbWFuZCgKLQkJCQllbGVtZW50LCBhZGRJdGVtcyk7Ci0JCWFjdGlvbk1nci5leGVjdXRlKGNvbW1hbmQpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBndWlkYW5jZXMgZnJvbSB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBybUl0ZW1zCi0JICogCQkJCWxpc3Qgb2YgZ3VpZGFuY2VzIHRvIHJlbW92ZQotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVHdWlkYW5jZXMoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gZ3VpZGFuY2VzIGZvciBhY3Rpdml0eQotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQ2hlY2tsaXN0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQ29uY2VwdHMoKSwgaXRlbSwKLQkJCQkJCQktMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X0V4YW1wbGVzKCksIGl0ZW0sCi0JCQkJCQkJLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0QWN0aXZpdHlfU3VwcG9ydGluZ01hdGVyaWFscygpLCBpdGVtLAotCQkJCQkJCS0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9HdWlkZWxpbmVzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9SZXVzYWJsZUFzc2V0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSb2FkbWFwKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfUm9hZG1hcHMoKSwgaXRlbSwKLQkJCQkJCQktMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbG9nZ2VyCi0JCQkJCQkJLmxvZ0Vycm9yKCJDYW4ndCByZW1vdmUgR3VpZGFuY2U6ICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBleGlzdGluZyBndWlkYW5jZXMgb2YgdGhlIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICogCQkJbGlzdCBvZiBleGlzdGluZyBndWlkYW5jZXMuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMoKSB7Ci0KLQkJTGlzdCBpdGVtTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRDaGVja2xpc3RzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRDb25jZXB0cygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0RXhhbXBsZXMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldEd1aWRlbGluZXMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldFJldXNhYmxlQXNzZXRzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkpOwotCi0JCURpYWdyYW1JbmZvIGluZm8gPSBuZXcgRGlhZ3JhbUluZm8oKEFjdGl2aXR5KSBlbGVtZW50KTsKLQkJaWYgKGluZm8uZ2V0QWN0aXZpdHlEaWFncmFtKCkgIT0gbnVsbCkKLQkJCWl0ZW1MaXN0LmFkZChpbmZvLmdldEFjdGl2aXR5RGlhZ3JhbSgpKTsKLQkJaWYgKGluZm8uZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkgIT0gbnVsbCkKLQkJCWl0ZW1MaXN0LmFkZChpbmZvLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpKTsKLQkJaWYgKGluZm8uZ2V0V1BERGlhZ3JhbSgpICE9IG51bGwpCi0JCQlpdGVtTGlzdC5hZGQoaW5mby5nZXRXUEREaWFncmFtKCkpOwotCi0JCXJldHVybiBpdGVtTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgc2VsZWN0ZWQgZ3VpZGFuY2VzCi0JICogQHJldHVybgotCSAqIAkJCWxpc3Qgb2Ygc2VsZWN0ZWQgZ3VpZGFuY2VzCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFNlbGVjdGVkR3VpZGFuY2VzKCkgewotCQlMaXN0IGl0ZW1MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldENoZWNrbGlzdHMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldENvbmNlcHRzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRFeGFtcGxlcygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0R3VpZGVsaW5lcygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0UmV1c2FibGVBc3NldHMoKSk7Ci0JCUxpc3Qgc3VwcG9ydGluZ01hdGVyaWFscyA9IGVsZW1lbnQuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpOwotCQlEaWFncmFtSW5mbyBpbmZvID0gbmV3IERpYWdyYW1JbmZvKChBY3Rpdml0eSkgZWxlbWVudCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHN1cHBvcnRpbmdNYXRlcmlhbHMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKQotCQkJCWlmICghaW5mby5pc0RpYWdyYW0oKFN1cHBvcnRpbmdNYXRlcmlhbCkgb2JqKSkgewotCQkJCQlpdGVtTGlzdC5hZGQob2JqKTsKLQkJCQl9Ci0JCX0KLQotCQlyZXR1cm4gaXRlbUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGxpc3Qgb2YgZmlsdGVyIHR5cGVzCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlclR5cGVzKCkgewotCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nWzE0XTsKLQkJaW50IGkgPSAwOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuQ0hFQ0tMSVNUUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuQ09OQ0VQVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJKyBGaWx0ZXJDb25zdGFudHMuRVNUSU1BVEVfQ09OU0lERVJBVElPTlM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkVYQU1QTEVTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5HVUlERUxJTkVTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5QUkFDVElDRVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlJFUE9SVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlJFVVNBQkxFX0FTU0VUUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRFTVBMQVRFUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuVE9PTF9NRU5UT1JTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5XSElURV9QQVBFUlM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRFUk1fREVGSU5JVElPTlM7Ci0JCXJldHVybiBzdHI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5Um9sbHVwU2VjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlSb2xsdXBTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczOTVmOWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlSb2xsdXBTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db2x1bW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkV4cG9zZWRBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlByb2Nlc3NWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUNvbHVtbkF3YXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIHJvbGx1cCBzZWN0aW9uIGZvciBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBY3Rpdml0eVJvbGx1cFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCS8vIGNvbnRyb2xzCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gc2VjdGlvbjsKLQotCXByaXZhdGUgQ29tcG9zaXRlIHJvbGx1cENvbXBvc2l0ZTsKLQotCXByaXZhdGUgUHJvY2Vzc1ZpZXdlciB2aWV3ZXI7Ci0KLQkvLyBwcml2YXRlIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0JLy8gZWxlbWVudAotCXByaXZhdGUgQWN0aXZpdHkgZWxlbWVudDsKLQotCS8vIGFjdGlvbiBtYW5hZ2VyCi0JLy8gcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlOwotCi0JcHJvdGVjdGVkIENvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5EZXNjcmlwdG9yczsKLQotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQotCS8qKgotCSAqIEluaXRpYWxpemUKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJLy8gZ2V0IEFjdGl2aXR5IG9iamVjdAotCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0KLQkJLy8gZ2V0IHRvb2xraXQKLQkJdG9vbGtpdCA9IGdldFdpZGdldEZhY3RvcnkoKTsKLQotCQkvLyBnZXQgYWN0aW9uIG1hbmFnZXIKLQkJLy8gYWN0aW9uTWdyID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0QWN0aW9uTWFuYWdlcigpOwotCi0JCS8vIGdldCBwcmVmZXJlbmNlIHN0b3JlCi0JCXN0b3JlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQkJaW5pdCgpOwotCi0JCS8vIHRoaXMudGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgPSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gY3JlYXRlIHJvbGx1cCBzZWN0aW9uCi0JCWNyZWF0ZVJvbGx1cFNlY3Rpb24ocGFyZW50KTsKLQotCQkvLyBhZGRMaXN0ZW5lcnMoKTsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSByb2xsdXAgc2VjdGlvbiBvbiB0aGUgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVSb2xsdXBTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJLy8gY3JlYXRlIHNlY3Rpb24KLQkJc2VjdGlvbiA9IEZvcm1VSQotCQkJCS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9Xb3JrUm9sbHVwLCAvLyROT04tTkxTLTEkCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1dvcmtSb2xsdXBEZXNjcmlwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBjcmVhdGUgcm9sbHVwIGNvbXBvc2l0ZQotCQlyb2xsdXBDb21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb24sIDIsIGZhbHNlKTsKLQotCQkvLyBzZXQgc2VjdGlvbiBsYWJlbHMKLQkJc2V0U2VjdGlvbkxhYmVscygpOwotCi0JCS8vIGNyZWF0ZSB2aWV3ZXIKLQkJdmlld2VyID0gbmV3IFByb2Nlc3NWaWV3ZXIocm9sbHVwQ29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IDEwOwotCQkvLyBncmlkRGF0YS5oZWlnaHRIaW50ID0gNjAwOwotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIGluaXRBZGFwdGVyRmFjdG9yeQotCQlpbml0QWRhcHRlckZhY3RvcnkoKTsKLQotCQkvLyBzZXQgdXAgY29sdW1ucwotCQl2aWV3ZXIuc2V0dXBDb2x1bW5zKGNvbHVtbkRlc2NyaXB0b3JzKTsKLQkJc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoYWRhcHRlckZhY3RvcnksIGNvbHVtbkRlc2NyaXB0b3JzKTsKLQotCQkvLyBzZXQgdXAgcHJvdmlkZXJzCi0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlhZGFwdGVyRmFjdG9yeSkpOwotCQl2aWV3ZXIKLQkJCQkuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQkJYWRhcHRlckZhY3RvcnkpKTsKLQotCQkvLyBkbyByb2xsIHVwCi0JCXJvbGxVcCgpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJvbGxVcCgpIHsKLQkJLy8gc2V0IHVwIGNvbHVtbnMKLQkJdmlld2VyLnNldElucHV0KGVsZW1lbnQpOwotCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCWVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWFkYXB0ZXIuc2V0Um9sbGVkVXAodHJ1ZSk7Ci0JCXZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LAotCQkJQ29sdW1uRGVzY3JpcHRvcltdIGNvbHVtbkRlc2NyaXB0b3JzKSB7Ci0JCU1hcCBjb2x1bW5JbmRleFRvTmFtZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbHVtbkluZGV4VG9OYW1lTWFwLnB1dChuZXcgSW50ZWdlcihpKSwgY29sdW1uRGVzY3JpcHRvcnNbaV0uaWQpOwotCQl9Ci0JCSgoSUNvbHVtbkF3YXJlKSBmYWN0b3J5KS5zZXRDb2x1bW5JbmRleFRvTmFtZU1hcChjb2x1bW5JbmRleFRvTmFtZU1hcCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCS8vIGdldCBBY3Rpdml0eSBvYmplY3QKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQotCQkJCXJvbGxVcCgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcigKLQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgYWN0aXZpdHkgd29yayByb2xsIHVwIHNlY3Rpb24iLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgYWRhcHRlciBmYWN0b3J5Ci0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0QWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIFNldCBsYWJlbCBmb3IgdGhlIHNlY3Rpb24KLQkgKgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNldFNlY3Rpb25MYWJlbHMoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5VGVhbVJvbGx1cFNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5VGVhbVJvbGx1cFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA4NzY5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eVRlYW1Sb2xsdXBTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlByb2Nlc3NGb3JtVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotCi0KLS8qKgotICogVGhlIHRlYW0gcm9sbHVwIHNlY3Rpb24gZm9yIGFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5VGVhbVJvbGx1cFNlY3Rpb24gZXh0ZW5kcyBBY3Rpdml0eVJvbGx1cFNlY3Rpb24gewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlSb2xsdXBTZWN0aW9uI2luaXRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEFkYXB0ZXJGYWN0b3J5KCkgewotCQkvLyBnZXQgY29sdW1uIGRlc2NyaXB0b3JzCi0JCWNvbHVtbkRlc2NyaXB0b3JzID0gUHJvY2Vzc0Zvcm1VdGlsLnRvQ29sdW1uRGVzY3JpcHRvcnMoc3RvcmUKLQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TKSk7Ci0KLQkJLy8gY3JlYXRlIGFkYXB0ZXIgZmFjdG9yeQotCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVRCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJLnNldEZpbHRlcihjb25maWd1cmF0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlSb2xsdXBTZWN0aW9uI3NldFNlY3Rpb25MYWJlbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNlY3Rpb25MYWJlbHMoKSB7Ci0JCXNlY3Rpb24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1RlYW1Sb2xsdXApOyAKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1RlYW1Sb2xsdXBEZXNjcmlwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eVdvcmtQcm9kdWN0c1JvbGx1cFNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5V29ya1Byb2R1Y3RzUm9sbHVwU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNDM2NDFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5V29ya1Byb2R1Y3RzUm9sbHVwU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzRm9ybVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIFRoZSB3b3JrIHByb2R1Y3RzIHJvbGx1cCBzZWN0aW9uIGZvciBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVdvcmtQcm9kdWN0c1JvbGx1cFNlY3Rpb24gZXh0ZW5kcyBBY3Rpdml0eVJvbGx1cFNlY3Rpb24gewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlSb2xsdXBTZWN0aW9uI2luaXRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEFkYXB0ZXJGYWN0b3J5KCkgewotCQkvLyBnZXQgY29sdW1uIGRlc2NyaXB0b3JzCi0JCWNvbHVtbkRlc2NyaXB0b3JzID0gUHJvY2Vzc0Zvcm1VdGlsLnRvQ29sdW1uRGVzY3JpcHRvcnMoc3RvcmUKLQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUykpOwotCi0JCS8vIGNyZWF0ZSBhZGFwdGVyIGZhY3RvcnkKLQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVXUEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BY3Rpdml0eVJvbGx1cFNlY3Rpb24jc2V0U2VjdGlvbkxhYmVscygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VjdGlvbkxhYmVscygpIHsKLQkJc2VjdGlvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwKTsgLy8kTk9OLU5MUy0xJAotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwRGVzY3JpcHRpb24pOyAvLyROT04tTkxTLTEkCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlXb3JrUm9sbHVwU2VjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlXb3JrUm9sbHVwU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMmVlMzQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5V29ya1JvbGx1cFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db2x1bW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqIFRoZSB3b3JrIHJvbGx1cCBzZWN0aW9uIGZvciBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVdvcmtSb2xsdXBTZWN0aW9uIGV4dGVuZHMgQWN0aXZpdHlSb2xsdXBTZWN0aW9uIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFjdGl2aXR5Um9sbHVwU2VjdGlvbiNpbml0QWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJLy8gZ2V0IGNvbHVtbiBkZXNjcmlwdG9ycwotCQljb2x1bW5EZXNjcmlwdG9ycyA9IHRvQ29sdW1uRGVzY3JpcHRvcnMoc3RvcmUKLQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKSk7Ci0KLQkJLy8gY3JlYXRlIGFkYXB0ZXIgZmFjdG9yeQotCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVdCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgc3RyaW5nIGludG8gY29sdW0gZGVzY3JpcHRvciBsaXN0Ci0JICogQHBhcmFtIHN0cgotCSAqIEByZXR1cm4KLQkgKiAJCUxpc3Qgb2YgY29sdW1uIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBFTGlzdCB0b0NvbHVtbkRlc2NyaXB0b3JMaXN0KFN0cmluZyBzdHIpIHsKLQkJRUxpc3QgY29sdW1uRGVzY3JpcHRvcnMgPSBuZXcgQmFzaWNFTGlzdCgpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKLQkJCS8vIERPTiJUIFBVVCBJTkRFWCBDT0xVTU4KLQkJCWlmICghKHRva2VuLmVxdWFscyhQcm9jZXNzRWRpdG9yLkNPTF9ERVNDX0lELmlkKSkpIHsKLQkJCQlPYmplY3QgY29sdW1uRGVzY3JpcHRvciA9IFByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAKLQkJCQkJCS5nZXQodG9rZW4pOwotCQkJCWlmIChjb2x1bW5EZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJY29sdW1uRGVzY3JpcHRvcnMuYWRkKGNvbHVtbkRlc2NyaXB0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sdW1uRGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBzdHJpbmcgaW50byBjb2x1bW4gZGVzY3JpcHRvcnMKLQkgKiBAcGFyYW0gc3RyCi0JICogQHJldHVybgotCSAqIAkJbGlzdCBvZiBjb2x1bW4gZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbHVtbkRlc2NyaXB0b3JbXSB0b0NvbHVtbkRlc2NyaXB0b3JzKFN0cmluZyBzdHIpIHsKLQkJTGlzdCBsaXN0ID0gdG9Db2x1bW5EZXNjcmlwdG9yTGlzdChzdHIpOwotCQlDb2x1bW5EZXNjcmlwdG9yW10gY29sdW1ucyA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KGNvbHVtbnMpOwotCQlyZXR1cm4gY29sdW1uczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BY3Rpdml0eVJvbGx1cFNlY3Rpb24jc2V0U2VjdGlvbkxhYmVscygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VjdGlvbkxhYmVscygpIHsKLQkJc2VjdGlvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfV29ya1JvbGx1cCk7IAotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfV29ya1JvbGx1cERlc2NyaXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0JyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0JyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjk5MzY2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkJhc2VGb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLk1ldGhvZEZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5SaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5EZWNvcmF0ZWRGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSW1hZ2VIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIGJyZWFrZG93biBlbGVtZW50IGRvY3VtZW50YXRpb24gc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQotCS8vIGNvbnRyb2xzCi0JcHJvdGVjdGVkIFRleHQgcHJlZml4VGV4dDsKLQotCXByb3RlY3RlZCBUZXh0IGJyaWVmRGVzY1RleHQ7Ci0KLQlwcm90ZWN0ZWQgRm9ybVRvb2xraXQgdG9vbGtpdDsKLQotCXByb3RlY3RlZCBTZWN0aW9uIGRvY3VtZW50U2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgZG9jdW1lbnRDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGV4cGFuZERvY3VtZW50Q29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dEVkaXRvciBjdHJsX2RvY3VtZW50X2V4cGFuZGVkOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCB1c2FnZUd1aWRhbmNlOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBrZXlDb25zaWRlcmF0aW9uczsKLQotCXByb3RlY3RlZCBUZXh0IGN0cmxfZG9jdW1lbnRfZXhwYW5kZWRfVGV4dDsKLQotCXByb3RlY3RlZCBJbWFnZUh5cGVybGluayBleHBhbmREb2N1bWVudExpbms7Ci0KLQlwcm90ZWN0ZWQgRGVjb3JhdGVkRmllbGQgZXhwYW5kRG9jdW1lbnRMYWJlbDsKLQotCXByb3RlY3RlZCBib29sZWFuIGV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGV4cGFuZEZsYWdUZXh0ID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGFjdGl2ZUNvbnRyb2w7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBhY3RpdmVDb250cm9sVGV4dDsKLQotCS8vIGVsZW1lbnQKLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudCBlbGVtZW50OwotCi0JLy8gYWN0aW9uIG1hbmFnZXIKLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLy8gbW9kaWZ5IGxpc3RlbmVyCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIG1vZGVsTW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgY29udGVudE1vZGlmeUxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIFN0cmluZyBjb250ZW50RWxlbWVudFBhdGg7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBjb250ZW50RWxlbWVudE5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGludCBoZWlnaHRIaW50ID0gNDA7Ci0JCi0JcHJpdmF0ZSBMaXN0ZW5lciB1c2FnZUd1aWRhbmNlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBleHBhbmRGbGFnID8gY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQk6IHVzYWdlR3VpZGFuY2U7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRVc2FnZUd1aWRhbmNlKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJdXNhZ2VHdWlkYW5jZSwgb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpLAotCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgTGlzdGVuZXIga2V5Q29uc2lkZXJhdGlvbnNMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGV4cGFuZEZsYWcgPyBjdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCToga2V5Q29uc2lkZXJhdGlvbnM7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChDb250ZW50RGVzY3JpcHRpb24pIGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpCi0JCQkJCS5nZXRLZXlDb25zaWRlcmF0aW9ucygpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCWtleUNvbnNpZGVyYXRpb25zLCBvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpLCBuZXdDb250ZW50LAotCQkJCQkJLTEpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEluaXRpYWxpemUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkvLyBnZXQgQnJlYWtkb3duRWxlbWVudCBvYmplY3QKLQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0KLQkJLy8gZ2V0IHRvb2xraXQKLQkJdG9vbGtpdCA9IGdldFdpZGdldEZhY3RvcnkoKTsKLQotCQkvLyBnZXQgYWN0aW9uIG1hbmFnZXIKLQkJYWN0aW9uTWdyID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0QWN0aW9uTWFuYWdlcigpOwotCi0JCS8vIHNldCBjb250ZW50IGVsZW1lbnQgcGF0aAotCQlTdHJpbmcgbGliUGF0aCA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCk7Ci0JCWNvbnRlbnRFbGVtZW50UGF0aCA9IGxpYlBhdGggKyBGaWxlLnNlcGFyYXRvcgotCQkJCSsgUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoZWxlbWVudCk7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQkJaW5pdCgpOwotCi0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBjcmVhdGUgRG9jbWVudCBzZWN0aW9uCi0JCWNyZWF0ZURvY3VtZW50U2VjdGlvbihwYXJlbnQpOwotCi0JCS8vIGFkZCBsaXN0ZW5lcnMKLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRyb2xzCi0JCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQotCQlwcmVmaXhUZXh0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQlwcmVmaXhUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gU3RyVXRpbC5nZXRQbGFpblRleHQocHJlZml4VGV4dC5nZXRUZXh0KCkpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKSwgbmV3Q29udGVudCwKLQkJCQkJCQktMSk7Ci0JCQkJCWlmIChzdGF0dXMpIHsKLQkJCQkJCXByZWZpeFRleHQuc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJYnJpZWZEZXNjVGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gZWxlbWVudC5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQlicmllZkRlc2NUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gU3RyVXRpbC5nZXRQbGFpblRleHQoYnJpZWZEZXNjVGV4dAotCQkJCQkJLmdldFRleHQoKSk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdGF0dXMpIHsKLQkJCQkJCWJyaWVmRGVzY1RleHQuc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQkKLQkJdXNhZ2VHdWlkYW5jZS5zZXRNb2RhbE9iamVjdChlbGVtZW50KTsKLQkJdXNhZ2VHdWlkYW5jZS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKSk7Ci0JCXVzYWdlR3VpZGFuY2UuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIHVzYWdlR3VpZGFuY2VMaXN0ZW5lcik7Ci0JCQotCQlrZXlDb25zaWRlcmF0aW9ucy5zZXRNb2RhbE9iamVjdChlbGVtZW50KTsKLQkJa2V5Q29uc2lkZXJhdGlvbnMuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpKTsKLQkJa2V5Q29uc2lkZXJhdGlvbnMKLQkJCQkuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIGtleUNvbnNpZGVyYXRpb25zTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZCBkb2N1bWVudGF0aW9uIHNlY3Rpb24gb24gdGhlIGdpdmVuIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEb2N1bWVudFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpbnQgaG9yaXpvbnRhbFNwYW4gPSAyOwotCi0JCS8vIGNyZWF0ZSBkb2N1bWVudCBzZWN0aW9uCi0JCWRvY3VtZW50U2VjdGlvbiA9IEZvcm1VSQotCQkJCS5jcmVhdGVTZWN0aW9uKAotCQkJCQkJdG9vbGtpdCwKLQkJCQkJCWNvbXBvc2l0ZSwKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Eb2N1bWVudEluZm9ybWF0aW9uVGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuYmluZChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uLCBQcm9wZXJ0aWVzVXRpbC5nZXRUeXBlTG93ZXIoZWxlbWVudCkpKTsgCi0KLQkJLy8gY3JlYXRlIGRvY3VtZW50IGNvbXBvc2l0ZQotCQlkb2N1bWVudENvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgZG9jdW1lbnRTZWN0aW9uLCAzLAotCQkJCWZhbHNlKTsKLQotCQkvLyBwcmVmaXgKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGRvY3VtZW50Q29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfcHJlZml4LCBob3Jpem9udGFsU3Bhbik7IC8vJE5PTi1OTFMtMSQKLQkJcHJlZml4VGV4dCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGRvY3VtZW50Q29tcG9zaXRlLCBoZWlnaHRIaW50KTsKLQotCQkvLyBicmllZiBkZXNjcmlwdGlvbgotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZG9jdW1lbnRDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19icmllZkRlc2NyaXB0aW9uLCBob3Jpem9udGFsU3Bhbik7IC8vJE5PTi1OTFMtMSQKLQkJYnJpZWZEZXNjVGV4dCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGRvY3VtZW50Q29tcG9zaXRlLAotCQkJCWhlaWdodEhpbnQpOwotCi0JCS8vIGNyZWF0ZSB1c2FnZSBndWlkYW5jZQotCQlSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciB1c2FnZUd1aWRhbmNlQ29udGFpbmVyID0gRm9ybVVJLmNyZWF0ZVJpY2hUZXh0V2l0aExpbmsodG9vbGtpdCwKLQkJCQlkb2N1bWVudENvbXBvc2l0ZSwgaGVpZ2h0SGludCwgY29udGVudEVsZW1lbnRQYXRoLCBlbGVtZW50LAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc191c2FnZUd1aWRhbmNlKTsKLQkJYWRkSHlwZXJMaW5rTGlzdGVuZXIodXNhZ2VHdWlkYW5jZUNvbnRhaW5lci5saW5rKTsKLQkJdXNhZ2VHdWlkYW5jZSA9IHVzYWdlR3VpZGFuY2VDb250YWluZXIucmljaFRleHQ7Ci0KLQkJLy8gY3JlYXRlIGtleSBjb25zaWRlcmF0aW9ucwotCQlSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciBrZXlDb25zaWRlcmF0aW9uc0NvbnRhaW5lciA9IEZvcm1VSS5jcmVhdGVSaWNoVGV4dFdpdGhMaW5rKHRvb2xraXQsCi0JCQkJZG9jdW1lbnRDb21wb3NpdGUsIGhlaWdodEhpbnQsIGNvbnRlbnRFbGVtZW50UGF0aCwgZWxlbWVudCwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkJyZWFrZG93bkVsZW1lbnRfa2V5Q29uc2lkZXJhdGlvbnMpOwotCQlhZGRIeXBlckxpbmtMaXN0ZW5lcihrZXlDb25zaWRlcmF0aW9uc0NvbnRhaW5lci5saW5rKTsKLQkJa2V5Q29uc2lkZXJhdGlvbnMgPSBrZXlDb25zaWRlcmF0aW9uc0NvbnRhaW5lci5yaWNoVGV4dDsKLQotCQkvLyBjcmVhdGUgZXhwYW5kZWQgY29tcG9zaXRlCi0JCWV4cGFuZERvY3VtZW50Q29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LAotCQkJCWRvY3VtZW50U2VjdGlvbiwgMiwgdHJ1ZSk7Ci0KLQkJLy8gSHlwZXJsaW5rIGRlc2MKLQkJZXhwYW5kRG9jdW1lbnRMaW5rID0gRm9ybVVJLmNyZWF0ZUltYWdlSHlwZXJMaW5rKHRvb2xraXQsCi0JCQkJZXhwYW5kRG9jdW1lbnRDb21wb3NpdGUsIEF1dGhvcmluZ1VJSW1hZ2VzLklNR19FWFBBTkRFRCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5jbG9zZVJURSk7IAotCQlhZGRIeXBlckxpbmtMaXN0ZW5lcihleHBhbmREb2N1bWVudExpbmspOwotCi0JCS8vIGV4cGFuZCBsYWJlbAotCQlleHBhbmREb2N1bWVudExhYmVsID0gQmFzZUZvcm1QYWdlLmNyZWF0ZURlY29yYXRlZExhYmVsKHRvb2xraXQsIGV4cGFuZERvY3VtZW50Q29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIeXBlckxpbmtMaXN0ZW5lcihJbWFnZUh5cGVybGluayBsaW5rKSB7Ci0JCWxpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQl0b2dnbGUoZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHRFZGl0b3IgdG9nZ2xlKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJSU1ldGhvZFJpY2hUZXh0IGN0cmwgPSAoSU1ldGhvZFJpY2hUZXh0KSBlLmdldEhyZWYoKTsKLQkJaWYgKGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQgPT0gbnVsbCkgewotCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZCA9IE1ldGhvZEZvcm1Ub29sa2l0LmNyZWF0ZVJpY2hUZXh0RWRpdG9yKAotCQkJCQl0b29sa2l0LCBleHBhbmREb2N1bWVudENvbXBvc2l0ZSwKLQkJCQkJIiIsIFNXVC5NVUxUSSB8IFNXVC5XUkFQLCBjb250ZW50RWxlbWVudFBhdGgsIGVsZW1lbnQsIGV4cGFuZERvY3VtZW50TGFiZWwsIGdldEVkaXRvcigpLmdldEVkaXRvclNpdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDA7Ci0JCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQl9Ci0KLQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJfQotCi0JCWlmIChleHBhbmRGbGFnKSB7Ci0JCQlkb2N1bWVudENvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJZG9jdW1lbnRTZWN0aW9uLnNldENsaWVudChkb2N1bWVudENvbXBvc2l0ZSk7Ci0KLQkJCWV4cGFuZERvY3VtZW50Q29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCi0JCQljdHJsID0gZ2V0QWN0aXZlUmljaFRleHRDb250cm9sKCk7Ci0JCQljdHJsLnNldFRleHQoY3RybF9kb2N1bWVudF9leHBhbmRlZC5nZXRUZXh0KCkpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBjdHJsLmdldExpc3RlbmVycygpOyBpLmhhc05leHQoKTspIHsKLQkJCQlSaWNoVGV4dExpc3RlbmVyIGxpc3RlbmVyID0gKFJpY2hUZXh0TGlzdGVuZXIpIGkubmV4dCgpOwotCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIuZ2V0RXZlbnRUeXBlKCksCi0JCQkJCQlsaXN0ZW5lci5nZXRMaXN0ZW5lcigpKTsKLQkJCX0KLQotCQkJaWYgKGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuZ2V0TW9kaWZpZWQoKSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkuc2F2ZU1vZGlmaWVkUmljaFRleHQoY3RybF9kb2N1bWVudF9leHBhbmRlZCk7Ci0JCQl9Ci0KLQkJCWN0cmwuc2V0Rm9jdXMoKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGV4cGFuZGVkCi0JCQlkb2N1bWVudENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWRvY3VtZW50U2VjdGlvbi5zZXRDbGllbnQoZXhwYW5kRG9jdW1lbnRDb21wb3NpdGUpOwotCi0JCQlleHBhbmREb2N1bWVudENvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotCi0JCQkoKExhYmVsKWV4cGFuZERvY3VtZW50TGFiZWwuZ2V0Q29udHJvbCgpKS5zZXRUZXh0KChTdHJpbmcpICgoSW1hZ2VIeXBlcmxpbmspIGUKLQkJCQkJLmdldFNvdXJjZSgpKS5nZXREYXRhKCJUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJc2V0QWN0aXZlUmljaFRleHRDb250cm9sKGN0cmwpOwotCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRUZXh0KGN0cmwuZ2V0VGV4dCgpKTsKLQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QoY3RybC5nZXRNb2RhbE9iamVjdCgpKTsKLQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKGN0cmwKLQkJCQkJLmdldE1vZGFsT2JqZWN0RmVhdHVyZSgpKTsKLQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0RmluZFJlcGxhY2VBY3Rpb24oY3RybC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpKTsKLQotCQkJZm9yIChJdGVyYXRvciBpID0gY3RybC5nZXRMaXN0ZW5lcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmljaFRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChSaWNoVGV4dExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLmFkZExpc3RlbmVyKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpLAotCQkJCQkJbGlzdGVuZXIuZ2V0TGlzdGVuZXIoKSk7Ci0JCQl9Ci0KLQkJfQotCi0JCWRvY3VtZW50U2VjdGlvbi5sYXlvdXQodHJ1ZSk7Ci0KLQkJLy8gc2V0IGVkaXRhYmxlCi0JCWlmIChjdHJsX2RvY3VtZW50X2V4cGFuZGVkICE9IG51bGwpCi0JCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQotCQlleHBhbmRGbGFnID0gIWV4cGFuZEZsYWc7Ci0JCXJldHVybiBjdHJsX2RvY3VtZW50X2V4cGFuZGVkOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5BYnN0cmFjdFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zYXZlTW9kaWZpZWRSaWNoVGV4dCgpOwotCi0JCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQkJQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKSBlbGVtZW50Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0KLQkJCQkvLyB1cGRhdGUgc2VjdGlvbiBuYW1lCi0JCQkJZG9jdW1lbnRTZWN0aW9uCi0JCQkJCQkuc2V0RGVzY3JpcHRpb24oUHJvcGVydGllc1Jlc291cmNlcy5iaW5kKFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb24sIFByb3BlcnRpZXNVdGlsLmdldFR5cGVMb3dlcihlbGVtZW50KSkpOyAKLQotCQkJCWlmIChtb2RlbE1vZGlmeUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJcHJlZml4VGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJCQkJYnJpZWZEZXNjVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJCQl9Ci0KLQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJdXNhZ2VHdWlkYW5jZS5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCQlrZXlDb25zaWRlcmF0aW9ucwotCQkJCQkJCS5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCX0KLQotCQkJCW1vZGVsTW9kaWZ5TGlzdGVuZXIgPSBnZXRFZGl0b3IoKS5jcmVhdGVNb2RpZnlMaXN0ZW5lcihlbGVtZW50KTsKLQkJCQljb250ZW50TW9kaWZ5TGlzdGVuZXIgPSBnZXRFZGl0b3IoKS5jcmVhdGVNb2RpZnlMaXN0ZW5lcigKLQkJCQkJCWVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCi0JCQkJaWYgKG1vZGVsTW9kaWZ5TGlzdGVuZXIgIT0gbnVsbAotCQkJCQkJJiYgbW9kZWxNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBtb2RlbE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXRFbGVtZW50KGVsZW1lbnQpOwotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIG1vZGVsTW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0JCQkJfQotCi0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciAhPSBudWxsCi0JCQkJCQkmJiBjb250ZW50TW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXRFbGVtZW50KGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQkJCQl9Ci0KLQkJCQlwcmVmaXhUZXh0LnNldFRleHQoZWxlbWVudC5nZXRQcmVmaXgoKSk7Ci0JCQkJYnJpZWZEZXNjVGV4dC5zZXRUZXh0KGVsZW1lbnQuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQotCQkJCXVzYWdlR3VpZGFuY2Uuc2V0VGV4dChjb250ZW50LmdldFVzYWdlR3VpZGFuY2UoKSk7Ci0JCQkJa2V5Q29uc2lkZXJhdGlvbnMuc2V0VGV4dChjb250ZW50LmdldEtleUNvbnNpZGVyYXRpb25zKCkpOwotCi0JCQkJaWYgKGV4cGFuZEZsYWcpIHsKLQkJCQkJaWYgKCgoTGFiZWwpZXhwYW5kRG9jdW1lbnRMYWJlbC5nZXRDb250cm9sKCkpLmdldFRleHQoKS5lcXVhbHMoCi0JCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX3VzYWdlR3VpZGFuY2UpKSAvLyROT04tTkxTLTEkCi0JCQkJCXsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0VGV4dChjb250ZW50Ci0JCQkJCQkJCS5nZXRVc2FnZUd1aWRhbmNlKCkpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRTZWxlY3Rpb24oMCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQkJCQkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCkpOwotCQkJCQl9IGVsc2UgaWYgKCgoTGFiZWwpZXhwYW5kRG9jdW1lbnRMYWJlbC5nZXRDb250cm9sKCkpCi0JCQkJCQkJLmdldFRleHQoKQotCQkJCQkJCS5lcXVhbHMoCi0JCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkJyZWFrZG93bkVsZW1lbnRfa2V5Q29uc2lkZXJhdGlvbnMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0VGV4dChjb250ZW50Ci0JCQkJCQkJCS5nZXRLZXlDb25zaWRlcmF0aW9ucygpKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQotCQkJCWlmIChtb2RlbE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIG1vZGVsTW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUoZmFsc2UpOwotCQkJCX0KLQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZShmYWxzZSk7Ci0JCQkJfQotCi0JCQkJcHJlZml4VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJCQlicmllZkRlc2NUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCi0JCQkJdXNhZ2VHdWlkYW5jZS5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQl1c2FnZUd1aWRhbmNlLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCkpOwotCQkJCXVzYWdlR3VpZGFuY2UuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQotCQkJCWtleUNvbnNpZGVyYXRpb25zLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCWtleUNvbnNpZGVyYXRpb25zLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpKTsKLQkJCQlrZXlDb25zaWRlcmF0aW9ucy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgYnJlYWtkb3duIGVsZW1lbnQgZG9jdW1lbnRhdGlvbiBzZWN0aW9uIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJcHJlZml4VGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWJyaWVmRGVzY1RleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl1c2FnZUd1aWRhbmNlLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJa2V5Q29uc2lkZXJhdGlvbnMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFjdGl2ZSAidW5leHBhbmRlZCIgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFjdGl2ZVJpY2hUZXh0Q29udHJvbChJTWV0aG9kUmljaFRleHQgY3RybCkgewotCQlhY3RpdmVDb250cm9sID0gY3RybDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY3RpdmUgInVuZXhwYW5kZWQiIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGdldEFjdGl2ZVJpY2hUZXh0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGFjdGl2ZUNvbnRyb2w7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyNjI1MGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllcy50YWJiZWQudmlldy5UYWJiZWRQcm9wZXJ0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC52aWV3LlRhYmJlZFByb3BlcnR5VGl0bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBUaGUgZ2VuZXJhbCB0YWIgc2VjdGlvbiBmb3IgYnJlYWtkb3duRWxlbWVudAotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCS8vIGNvbnRyb2xzCi0JcHJvdGVjdGVkIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBnZW5lcmFsU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgZ2VuZXJhbENvbXBvc2l0ZSwgY2hlY2tCb3hDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBuYW1lVGV4dDsKLQotCXByb3RlY3RlZCBUZXh0IHByZXNlbnRhdGlvbk5hbWVUZXh0OwotCi0JcHJpdmF0ZSBCdXR0b24gbXVsdGlwbGVCdXR0b24sIG9wdGlvbmFsQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gcGxhbm5lZEJ1dHRvbiwgc3VwcmVzc2VkQnV0dG9uOwotCi0JcHJvdGVjdGVkIGludCBudW1PZkNvbHVtbnMgPSA0OwotCi0JcHJvdGVjdGVkIGludCBob3Jpem9udGFsU3BhbiA9IDM7Ci0KLQkvLyBwcml2YXRlIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0JLy8gZWxlbWVudAotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQ7Ci0KLQkvLyBhY3Rpb24gbWFuYWdlcgotCXByb3RlY3RlZCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvLyBtb2RpZnkgbGlzdGVuZXIKLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgbW9kZWxNb2RpZnlMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBuYW1lTW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0KLQlmaW5hbCBib29sZWFuIGlnbm9yZVN1cHByZXNzZWQgPSB0cnVlOwotCi0JcHJvdGVjdGVkIExpc3RlbmVyIG5hbWVEZWFjdGl2YXRlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gRVBGUHJvcGVydHlTaGVldFBhZ2UKLQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBlbGVtZW50LmdldE5hbWUoKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQluYW1lVGV4dCwgb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCVN0cmluZyBtZXNzYWdlID0gbnVsbDsKLQkJCWlmICghU3RyVXRpbC5pc0JsYW5rKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0RWRpdG9yKCkKLQkJCQkJCS5nZXRTdXBwcmVzc2lvbigpOwotCQkJCW1lc3NhZ2UgPSBQcm9jZXNzVXRpbC5jaGVja0JyZWFrZG93bkVsZW1lbnROYW1lKAotCQkJCQkJYWRhcHRlckZhY3RvcnksIGVsZW1lbnQsIG5hbWVUZXh0LmdldFRleHQoKSwKLQkJCQkJCXN1cHByZXNzaW9uLCBpZ25vcmVTdXBwcmVzc2VkKTsKLQkJCX0KLQkJCWlmIChtZXNzYWdlID09IG51bGwpIHsKLQkJCQlpZiAoIW5hbWVUZXh0LmdldFRleHQoKS5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpCi0JCQkJCQkJJiYgKGVsZW1lbnQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkpIHsKLQkJCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSAoUHJvY2Vzc0NvbXBvbmVudCkgZWxlbWVudAotCQkJCQkJCQkuZUNvbnRhaW5lcigpOwotCQkJCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuY3JlYXRlTmFtZVZhbGlkYXRvcigKLQkJCQkJCQkJCQlwcm9jQ29tcCwKLQkJCQkJCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCQkJCVN0cmluZyBtc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChuYW1lVGV4dC5nZXRUZXh0KCkpOwotCi0JCQkJCQlpZiAobXNnID09IG51bGwpIHsKLQkJCQkJCQltc2cgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVuYW1lX01lc3NhZ2U7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkJCWlmIChBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1JlbmFtZV9UaXRsZSwgbXNnKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudCwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCQkJCQkJCQkJbmFtZVRleHQuZ2V0VGV4dCgpLCAtMSk7Ci0JCQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCQkvLyBuYW1lVGV4dC5zZXRUZXh0KGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQotCQkJCQkJCQl9Ci0JCQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJcHJvY0NvbXAsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJCQkJCQkJCQluYW1lVGV4dC5nZXRUZXh0KCksIC0xKTsKLQkJCQkJCQkJZ2V0RWRpdG9yKCkuc2V0UGFydE5hbWUoKTsKLQotCQkJCQkJCQkvLyBhZGp1c3QgcGx1Z2luIGxvY2F0aW9uIGFuZCBzYXZlIHRoZQotCQkJCQkJCQkvLyBlZGl0b3IKLQkJCQkJCQkJLy8KLQkJCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoRGlzcGxheQotCQkJCQkJCQkJCS5nZXREZWZhdWx0KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCQkJCQkJCQkJCWVkaXRvcgotCQkJCQkJCQkJCQkJLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gZWRpdG9yCi0JCQkJCQkJCQkJCQkuZ2V0UGVyc2lzdGVyKCk7Ci0JCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJcGVyc2lzdGVyCi0JCQkJCQkJCQkJCQkJLmFkanVzdExvY2F0aW9uKGVsZW1lbnQKLQkJCQkJCQkJCQkJCQkJCS5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCQkJCQkJCXRocm93IGU7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCi0JCQkJCQkJCX0pOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCS8vIHJlcGxhY2Ugd2l0aCBleGlzdGluZyBuYW1lCi0JCQkJCQkJCW5hbWVUZXh0LnNldFRleHQob2xkQ29udGVudCk7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIHJlc3RvcmUgdGhlIG9sZCBuYW1lIGZpcnN0LCB0aGVuIHByZXNlbnQgdGhlCi0JCQkJCQkJLy8gZXJyb3IgbWVzc2FnZSBib3gKLQkJCQkJCQluYW1lVGV4dC5zZXRUZXh0KG9sZENvbnRlbnQpOwotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlLCBtc2cpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCQkJbmFtZVRleHQuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCW5hbWVUZXh0LnNldEZvY3VzKCk7Ci0JCQkJCQkJCQluYW1lVGV4dC5zZWxlY3RBbGwoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkJCQkJCQkJCW5hbWVUZXh0LmdldFRleHQoKSwgLTEpOwotCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIHJlc3RvcmUgdGhlIG9sZCBuYW1lIGZpcnN0LCB0aGVuIHByZXNlbnQgdGhlIGVycm9yCi0JCQkJLy8gbWVzc2FnZSBib3gKLQkJCQluYW1lVGV4dC5zZXRUZXh0KG9sZENvbnRlbnQpOwotCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlLCBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCW5hbWVUZXh0LmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQluYW1lVGV4dC5zZXRGb2N1cygpOwotCQkJCQkJbmFtZVRleHQuc2VsZWN0QWxsKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBMaXN0ZW5lciBwcmVzZW50YXRpb25OYW1lRGVhY3RpdmF0ZUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IEVQRlByb3BlcnR5U2hlZXRQYWdlCi0JCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCi0JCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCVN0cmluZyBvbGRDb250ZW50ID0gZWxlbWVudC5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJcHJlc2VudGF0aW9uTmFtZVRleHQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlTdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0JCQkKLQkJCS8vIHlvdSBjYW4gaGF2ZSBibGFuayBwcmVzZW50YXRpb24gbmFtZSBmb3IgYWN0aXZpdHkgdGhhdCBleHRlbmRzIAotCQkJaWYgKFN0clV0aWwuaXNCbGFuayhwcmVzZW50YXRpb25OYW1lVGV4dC5nZXRUZXh0KCkpCi0JCQkJCSYmIGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50OwotCQkJCWlmICh2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbAotCQkJCQkJJiYgdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkuZXF1YWxzKAotCQkJCQkJCQlWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKSkgewotCQkJCQkKLQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCQkJaWYgKCFwcmVzZW50YXRpb25OYW1lVGV4dC5nZXRUZXh0KCkuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLAotCQkJCQkJCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LmdldFRleHQoKSwgLTEpOwotCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmICghU3RyVXRpbC5pc0JsYW5rKGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKSkgewotCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0RWRpdG9yKCkKLQkJCQkJCS5nZXRTdXBwcmVzc2lvbigpOwotCQkJCW1lc3NhZ2UgPSBQcm9jZXNzVXRpbAotCQkJCQkJLmNoZWNrQnJlYWtkb3duRWxlbWVudFByZXNlbnRhdGlvbk5hbWUoCi0JCQkJCQkJCWFkYXB0ZXJGYWN0b3J5LCBlbGVtZW50LAotCQkJCQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5nZXRUZXh0KCksIHN1cHByZXNzaW9uLCBpZ25vcmVTdXBwcmVzc2VkKTsKLQkJCX0KLQotCQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQkJaWYgKCFwcmVzZW50YXRpb25OYW1lVGV4dC5nZXRUZXh0KCkuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLAotCQkJCQkJCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuZ2V0VGV4dCgpLCAtMSk7Ci0JCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIHJlc3RvcmUgdGhlIG9sZCBuYW1lIGZpcnN0LCB0aGVuIHByZXNlbnQgdGhlIGVycm9yCi0JCQkJLy8gbWVzc2FnZSBib3gKLQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5zZXRUZXh0KGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQotCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlLCBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5zZXRGb2N1cygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9OwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCS8vIGdldCBCcmVha2Rvd25FbGVtZW50IG9iamVjdAotCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCQkvLyBnZXQgdG9vbGtpdAotCQl0b29sa2l0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpOwotCi0JCS8vIGdldCBhY3Rpb24gbWFuYWdlcgotCQlhY3Rpb25NZ3IgPSBFUEZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LAotCQkJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JCWluaXQoKTsKLQkJLy8gdGhpcy50YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSA9IHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBjcmVhdGUgZ2VuZXJhbCBzZWN0aW9uCi0JCWNyZWF0ZUdlbmVyYWxTZWN0aW9uKHBhcmVudCk7Ci0KLQkJLy8gYWRkTGlzdGVuZXJzCi0JCWFkZExpc3RlbmVycygpOwotCi0JCS8vIHVwZGF0ZSBjb250cm9scwotCQl1cGRhdGVDb250cm9scygpOwotCi0JfQotCi0JLyoqCi0JICogIEFkZCBsaXN0ZW5lcnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCW5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGV2ZW50LndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJfQotCQkJCi0JCX0pOwotCQluYW1lVGV4dC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmFtZURlYWN0aXZhdGVMaXN0ZW5lcik7Ci0KLQkJcHJlc2VudGF0aW9uTmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZXZlbnQud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQl9Ci0JCQkKLQkJfSk7CQkKLQkJcHJlc2VudGF0aW9uTmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIHByZXNlbnRhdGlvbk5hbWVEZWFjdGl2YXRlTGlzdGVuZXIpOwotCi0JCW11bHRpcGxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihtdWx0aXBsZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSksIC0xKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJbXVsdGlwbGVCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQKLQkJCQkJCQkuZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpLmJvb2xlYW5WYWx1ZSgpKTsKLQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlvcHRpb25hbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpLCBCb29sZWFuCi0JCQkJCQkJCS52YWx1ZU9mKG9wdGlvbmFsQnV0dG9uLmdldFNlbGVjdGlvbigpKSwgLTEpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCQlvcHRpb25hbEJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRJc09wdGlvbmFsKCkKLQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCXBsYW5uZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpLCBCb29sZWFuCi0JCQkJCQkJCS52YWx1ZU9mKHBsYW5uZWRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpLCAtMSk7Ci0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJCXBsYW5uZWRCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0SXNQbGFubmVkKCkKLQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlzdXByZXNzZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCWlmIChlbGVtZW50LmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkvLyByZXZlYWxpbmcKLQkJCQkJUHJvY2Vzc0VkaXRvciBlZGl0b3IgPSBnZXRFZGl0b3IoKTsKLQkJCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBlZGl0b3IuZ2V0U3VwcHJlc3Npb24oKTsKLQkJCQkJYm9vbGVhbiBjYW5SZXZlYWwgPSBQcm9jZXNzRWRpdG9yLmNhblJldmVhbCgKLQkJCQkJCQlBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IGVsZW1lbnQgfSksCi0JCQkJCQkJRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQlzdXBwcmVzc2lvbik7Ci0JCQkJCi0JCQkJCWlmICghY2FuUmV2ZWFsKQkJCQkJCi0JCQkJCQlzdXByZXNzZWRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwkKLQkJCQkJZWxzZQotCQkJCQkJc3VwcmVzc2VkQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJfQotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKSwgQm9vbGVhbgotCQkJCQkJCQkudmFsdWVPZihzdXByZXNzZWRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpLCAtMSk7Ci0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJCXN1cHJlc3NlZEJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRTdXBwcmVzc2VkKCkKLQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZ2VuZXJhbCBzZWN0aW9uIG9uIHRoZSBnaXZlbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkvLyBjcmVhdGUgZ2VuZXJhbCBzZWN0aW9uCi0JCWdlbmVyYWxTZWN0aW9uID0gRm9ybVVJCi0JCQkJLmNyZWF0ZVNlY3Rpb24oCi0JCQkJCQl0b29sa2l0LAotCQkJCQkJY29tcG9zaXRlLAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvblRpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLmJpbmQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uLCBQcm9wZXJ0aWVzVXRpbC5nZXRUeXBlTG93ZXIoZWxlbWVudCkpKTsgCi0KLQkJLy8gY3JlYXRlIGdlbmVyYWwgY29tcG9zaXRlCi0JCWdlbmVyYWxDb21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGdlbmVyYWxTZWN0aW9uLAotCQkJCW51bU9mQ29sdW1ucywgZmFsc2UpOwotCi0JCS8vIG5hbWUKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19uYW1lKTsgLy8kTk9OLU5MUy0xJAotCQluYW1lVGV4dCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIFNXVC5ERUZBVUxULAotCQkJCWhvcml6b250YWxTcGFuKTsKLQotCQkvLyBwcmVzZW50YXRpb24gbmFtZQotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9wcmVzZW50YXRpb25OYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlwcmVzZW50YXRpb25OYW1lVGV4dCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJU1dULkRFRkFVTFQsIGhvcml6b250YWxTcGFuKTsKLQotCQkvLyBjcmVhdGUgY29tcG9zaXRlIGZvciBjaGVja2JveAotCQljaGVja0JveENvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIG51bU9mQ29sdW1ucywgdHJ1ZSk7Ci0KLQkJLy8gb3B0aW9uYWwKLQkJb3B0aW9uYWxCdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCW9wdGlvbmFsQnV0dG9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5CcmVha2Rvd25FbGVtZW50X09wdGlvbl9PcHRpb25hbCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBNdWx0aXBsZSBPY3VycmFuY2VzCi0JCW11bHRpcGxlQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUNoZWNrQnV0dG9uKHRvb2xraXQsIGNoZWNrQm94Q29tcG9zaXRlLAotCQkJCTEpOwotCQltdWx0aXBsZUJ1dHRvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQnJlYWtkb3duRWxlbWVudF9PcHRpb25fTXVsdGlwbGVPY3VycmFuY2UpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gcGxhbm5lZAotCQlwbGFubmVkQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUNoZWNrQnV0dG9uKHRvb2xraXQsIGNoZWNrQm94Q29tcG9zaXRlLAotCQkJCTEpOwotCQlwbGFubmVkQnV0dG9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5CcmVha2Rvd25FbGVtZW50X09wdGlvbl9QbGFubmVkKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHN1cHJlc3NlZAotCQlzdXByZXNzZWRCdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCXN1cHJlc3NlZEJ1dHRvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3VwcmVzc2VkKTsgLy8kTk9OLU5MUy0xJAotCQlzdXByZXNzZWRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNoZWNrQm94Q29tcG9zaXRlKTsKLQotCX0KLQotCS8qKgotCSAqIE1vZGlmeSBsaXN0bmVyIGZvciBuYW1lIGFuZCBwcmVzZW50YXRpb24gbmFtZQotCSAqCi0JICovCi0JcHVibGljIGNsYXNzIE5hbWVNb2RpZnlMaXN0ZW5lciBleHRlbmRzIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIgewotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkJICovCi0KLQkJcHVibGljIE5hbWVNb2RpZnlMaXN0ZW5lcihFT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gY2hlY2tDb250YWluZXIpIHsKLQotCQkJZ2V0RWRpdG9yKCkuc3VwZXIoZWxlbWVudCwgY2hlY2tDb250YWluZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlzdXBlci5tb2RpZnlUZXh0KGUpOwotCi0JCQl1cGRhdGVUaXRsZShuYW1lVGV4dC5nZXRUZXh0KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIG5hbWUgbW9kaWZ5IGxpc3RlbmVyIGZvciB0aGUgZ2l2ZW4gb2JqZWN0Ci0JICogQHBhcmFtIGVPYmoKLQkgKiBAcmV0dXJuCi0JICogCQkJbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgTW9kaWZ5TGlzdGVuZXIgY3JlYXRlTmFtZU1vZGlmeUxpc3RlbmVyKEVPYmplY3QgZU9iaikgewotCQlyZXR1cm4gY3JlYXRlTmFtZU1vZGlmeUxpc3RlbmVyKGVPYmosIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgTW9kaWZ5TGlzdGVuZXIgY3JlYXRlTmFtZU1vZGlmeUxpc3RlbmVyKEVPYmplY3QgZU9iaiwKLQkJCWJvb2xlYW4gY2hlY2tDb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBOYW1lTW9kaWZ5TGlzdGVuZXIoZU9iaiwgY2hlY2tDb250YWluZXIpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aXRsZSBvZiB0aGUgcHJvcGVydGllcyBwYWdlCi0JICogQHBhcmFtIHR4dAotCSAqIAkJCW5ldyB0aXRsZQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVRpdGxlKFN0cmluZyB0eHQpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lUHJlZml4KCkgKyB0eHQ7Ci0JCVRhYmJlZFByb3BlcnR5Q29tcG9zaXRlIGNvbXAgPSAoVGFiYmVkUHJvcGVydHlDb21wb3NpdGUpIHBhZ2UKLQkJCQkuZ2V0Q29udHJvbCgpOwotCQlUYWJiZWRQcm9wZXJ0eVRpdGxlIHRpdGxlID0gY29tcC5nZXRUaXRsZSgpOwotCi0JCXRpdGxlLnNldFRpdGxlKG5hbWUsIGdldEltYWdlKGVsZW1lbnQpKTsKLQl9Ci0KLQlwcml2YXRlIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLQkJaWYgKGxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJCVRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkpOwotCQl9Ci0JCUltYWdlIHRpdGxlSW1hZ2UgPSBsYWJlbFByb3ZpZGVyLmdldEltYWdlKG9iaik7Ci0JCXJldHVybiB0aXRsZUltYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCS8vIGdldCBCcmVha2Rvd25FbGVtZW50IG9iamVjdAotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCi0JCQkJLy8gdXBkYXRlIHNlY3Rpb24gbmFtZQotCQkJCWdlbmVyYWxTZWN0aW9uCi0JCQkJCQkuc2V0RGVzY3JpcHRpb24oUHJvcGVydGllc1Jlc291cmNlcy5iaW5kKFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbiwgUHJvcGVydGllc1V0aWwuZ2V0VHlwZUxvd2VyKGVsZW1lbnQpKSk7IAotCi0JCQkJLy8gTW9kZWwgTW9kaWZ5IGxpc3RlbmVyIGZvciBwcmVzZW50YXRpb24gbmFtZQotCQkJCWlmIChtb2RlbE1vZGlmeUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJcHJlc2VudGF0aW9uTmFtZVRleHQKLQkJCQkJCQkucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJfQotCQkJCW1vZGVsTW9kaWZ5TGlzdGVuZXIgPSBnZXRFZGl0b3IoKS5jcmVhdGVNb2RpZnlMaXN0ZW5lcihlbGVtZW50KTsKLQotCQkJCS8vIE1vZGlmeSBsaXN0ZW5lciBmb3IgbmFtZQotCQkJCWlmIChuYW1lTW9kaWZ5TGlzdGVuZXIgIT0gbnVsbCkKLQkJCQkJbmFtZVRleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobmFtZU1vZGlmeUxpc3RlbmVyKTsKLQotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCQluYW1lTW9kaWZ5TGlzdGVuZXIgPSBjcmVhdGVOYW1lTW9kaWZ5TGlzdGVuZXIoCi0JCQkJCQkJKChQcm9jZXNzKSBlbGVtZW50KS5lQ29udGFpbmVyKCksIHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW5hbWVNb2RpZnlMaXN0ZW5lciA9IGNyZWF0ZU5hbWVNb2RpZnlMaXN0ZW5lcihlbGVtZW50KTsKLQkJCQl9Ci0KLQkJCQlpZiAobW9kZWxNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBtb2RlbE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXRFbGVtZW50KGVsZW1lbnQpOwotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIG1vZGVsTW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0JCQkJfQotCQkJCWlmIChuYW1lTW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgbmFtZU1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKHRydWUpOwotCQkJCX0KLQotCQkJCW5hbWVUZXh0LnNldFRleHQoZWxlbWVudC5nZXROYW1lKCkpOwotCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LnNldFRleHQoZWxlbWVudC5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCi0JCQkJaWYgKG1vZGVsTW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgbW9kZWxNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZShmYWxzZSk7Ci0JCQkJfQotCQkJCWlmIChuYW1lTW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgbmFtZU1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQluYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuYW1lTW9kaWZ5TGlzdGVuZXIpOwotCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCi0JCQkJbXVsdGlwbGVCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCQkJCW9wdGlvbmFsQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldElzT3B0aW9uYWwoKQotCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlwbGFubmVkQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldElzUGxhbm5lZCgpCi0JCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCQkJCS8vIGdldCBzZWxlY3RlZCBvcmlnaW5hbCBpbnB1dCBvYmplY3QKLQkJCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWlmIChnZXRFZGl0b3IoKS5nZXRTdXBwcmVzc2lvbigpLmlzSW5TdXBwcmVzc2VkTGlzdCgKLQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGlucHV0KSkgewotCQkJCQkJc3VwcmVzc2VkQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN1cHJlc3NlZEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSBlbHNlCi0JCQkJc3VwcmVzc2VkQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldFN1cHByZXNzZWQoKQotCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBicmVha2Rvd24gZWxlbWVudCBnZW5lcmFsIHNlY3Rpb24iICsgZWxlbWVudCwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJbmFtZVRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQlwcmVzZW50YXRpb25OYW1lVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCW5hbWVUZXh0LnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlwcmVzZW50YXRpb25OYW1lVGV4dC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQotCQltdWx0aXBsZUJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJb3B0aW9uYWxCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCXBsYW5uZWRCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0vLwkJc3VwcmVzc2VkQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0NvbXBvc2l0ZVJvbGVSb2xlU2VjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQ29tcG9zaXRlUm9sZVJvbGVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI0YzNjZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQ29tcG9zaXRlUm9sZVJvbGVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5JdGVtc0ZpbHRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIGNvbXBvc2l0ZSByb2xlIC0gcm9sZSBzZWN0aW9uCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZVJvbGVSb2xlU2VjdGlvbiBleHRlbmRzIE9CU1JlbGF0aW9uU2VjdGlvbiB7Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNpbml0Q29udGVudFByb3ZpZGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQllbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoCi0JCQkJCQkoKENvbXBvc2l0ZVJvbGUpIGVsZW1lbnQpLmdldEFnZ3JlZ2F0ZWRSb2xlcygpKQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJZWxlbWVudCA9IChDb21wb3NpdGVSb2xlKSBlbGVtZW50OwotCi0JCVN0cmluZyB0aXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25UaXRsZTsKLQkJU3RyaW5nIGRlc2MgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb247Ci0JCVN0cmluZyB0YWJsZTEgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkNvbXBvc2l0ZVJvbGVfUm9sZV9UYWJsZTE7Ci0JCXNldFRhYkRhdGEodGl0bGUsIGRlc2MsIHRhYmxlMSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzaG93QWRkRnJvbVByb2Nlc3NCdXR0b24gPSB0cnVlOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJCXN1cGVyLnJlZnJlc2goKTsKLQotCQkJCWVsZW1lbnQgPSAoQ29tcG9zaXRlUm9sZSkgZ2V0RWxlbWVudCgpOwotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKAotCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBDb21wb3NpdGUgcm9sZSAtIHJvbGUgc2VjdGluICIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIGNvbXBvc2l0ZSByb2xlcyAKLQkgKiBAcGFyYW0gaXRlbXMKLQkgKiAJCUxpc3Qgb2Ygcm9sZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkKExpc3QgaXRlbXMpIHsKLQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQlpZiAoaXRlbXMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJKENvbXBvc2l0ZVJvbGUpIGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKSwKLQkJCQkJCQkoUm9sZSkgb2JqLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQlSb2xlIHJvbGUgPSAoKFJvbGVEZXNjcmlwdG9yKSBvYmopLmdldFJvbGUoKTsKLQkJCQkJaWYgKHJvbGUgIT0gbnVsbCkKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCShDb21wb3NpdGVSb2xlKSBlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlcygpLAotCQkJCQkJCQlyb2xlLCAtMSk7Ci0JCQkJCWVsc2UgewotCQkJCQkJTWVzc2FnZUZvcm1hdCBtZiA9IG5ldyBNZXNzYWdlRm9ybWF0KAotCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQ29tcG9zaXRlUm9sZUFzc2lnbkVycm9yKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJT2JqZWN0W10gYXJncyA9IHsgKChSb2xlRGVzY3JpcHRvcikgb2JqKS5nZXROYW1lKCksCi0JCQkJCQkJCSgoQ29tcG9zaXRlUm9sZSkgZWxlbWVudCkuZ2V0TmFtZSgpIH07Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUluZm8oCi0JCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0Fzc2lnbm1lbnRJbmZvVGl0bGUsIG1mLmZvcm1hdChhcmdzKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNyZW1vdmUoamF2YS51dGlsLkFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCVJvbGUgcm9sZSA9IChSb2xlKSBpdG9yLm5leHQoKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJKENvbXBvc2l0ZVJvbGUpIGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlcygpLCByb2xlLCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jb3BlbkFkZERpYWxvZygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkFkZERpYWxvZygpIHsKLQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gKChDb21wb3NpdGVSb2xlKSBlbGVtZW50KS5nZXRBZ2dyZWdhdGVkUm9sZXMoKTsKLQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBnZXRGaWx0ZXIoKSwgZWxlbWVudCwKLQkJCQlGaWx0ZXJDb25zdGFudHMuUk9MRVMsIGV4aXN0aW5nRWxlbWVudHMpOwotCi0JCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuUk9MRVMpOwotCQlmZC5vcGVuKCk7Ci0JCWFkZChmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCi0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNvcGVuQWRkRnJvbVByb2Nlc3NEaWFsb2coKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5BZGRGcm9tUHJvY2Vzc0RpYWxvZygpIHsKLQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuUk9MRV9ERVNDUklQVE9SUzsKLQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gZ2V0RXhpc3RpbmdFbGVtZW50cygpOwotCQlQcm9jZXNzIHByb2Nlc3MgPSAoUHJvY2VzcykgZ2V0UHJvY2VzcyhlbGVtZW50KTsKLQkJSUZpbHRlciBkZXNjcmlwdG9yRmlsdGVyID0gZ2V0RGVzY3JpcHRvckZpbHRlcigpOwotCQlpZiAoZGVzY3JpcHRvckZpbHRlciAhPSBudWxsICYmIHByb2Nlc3MgIT0gbnVsbCkgewotCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJZGVzY3JpcHRvckZpbHRlciwgcHJvY2VzcywgdGFiTmFtZSwgZXhpc3RpbmdFbGVtZW50cyk7Ci0JCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5ST0xFX0RFU0NSSVBUT1JTKTsKLQkJCWZkLm9wZW4oKTsKLQkJCWFkZChmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHBhcmVudCBGaW5kIHBhcmVudCB1bnRpbCBpdCdzIGFjdGl2aXR5LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqIAkJcHJvY2VzcyBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb2Nlc3MoQnJlYWtkb3duRWxlbWVudCBlbGVtZW50KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCWVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChlbGVtZW50KTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiBnZXRQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGRlc2NyaXB0b3IgcHJvY2VzcyBmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXREZXNjcmlwdG9yRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IERlc2NyaXB0b3JQcm9jZXNzRmlsdGVyKGdldENvbmZpZ3VyYXRpb24oKSkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkvLyBMaXN0IGxpc3QgPSAoKEFjdGl2aXR5KW9iaikuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlnZXRBY3Rpdml0aWVzSW5TY29wZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBlbGVtZW50LCBsaXN0KTsKLQkJCQkJaWYgKGxpc3QuY29udGFpbnMob2JqKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJCWlmIChvYmouZXF1YWxzKGVsZW1lbnQpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9EZXNjcmlwdG9yRG9jdW1lbnRTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9EZXNjcmlwdG9yRG9jdW1lbnRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0ZjI5MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRGVzY3JpcHRvckRvY3VtZW50U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5SaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotCi0vKioKLSAqIFRoZSBkb2N1bWVudCB0YWIgc2VjdGlvbiBmb3IgRGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yRG9jdW1lbnRTZWN0aW9uIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgRGVzY3JpcHRvciBlbGVtZW50OwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgcmVmaW5lZERlc2M7Ci0KLQlwcml2YXRlIExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQllbGVtZW50ID0gKERlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZXhwYW5kRmxhZyA/IGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJOiByZWZpbmVkRGVzYzsKLQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKERlc2NyaXB0b3JEZXNjcmlwdGlvbikgZWxlbWVudAotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldFJlZmluZWREZXNjcmlwdGlvbigpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCXJlZmluZWREZXNjLCBvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKSwKLQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJZWxlbWVudCA9IChEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNjcmVhdGVEb2N1bWVudFNlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURvY3VtZW50U2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXN1cGVyLmNyZWF0ZURvY3VtZW50U2VjdGlvbihjb21wb3NpdGUpOwotCQlpbnQgaGVpZ2h0SGludCA9IDIwMDsKLQotCQkvLyByZWZpbmVkIGRlc2NyaXB0aW9uCi0JCVJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyIHJlZmluZWRDb250YWluZXIgPSBGb3JtVUkuY3JlYXRlUmljaFRleHRXaXRoTGluayh0b29sa2l0LAotCQkJCWRvY3VtZW50Q29tcG9zaXRlLCBoZWlnaHRIaW50LCBjb250ZW50RWxlbWVudFBhdGgsIGVsZW1lbnQsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5EZXNjcmlwdG9yX1JlZmluZWREZXNjcmlwdGlvbik7Ci0JCWFkZEh5cGVyTGlua0xpc3RlbmVyKHJlZmluZWRDb250YWluZXIubGluayk7Ci0JCXJlZmluZWREZXNjID0gcmVmaW5lZENvbnRhaW5lci5yaWNoVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQkJcmVmaW5lZERlc2Muc2V0TW9kYWxPYmplY3QoZ2V0RWxlbWVudCgpKTsKLQkJcmVmaW5lZERlc2Muc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpKTsKLQkJcmVmaW5lZERlc2MuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI3VwZGF0ZUNvbnRyb2xzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJc3VwZXIudXBkYXRlQ29udHJvbHMoKTsKLQkJcmVmaW5lZERlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zYXZlTW9kaWZpZWRSaWNoVGV4dCgpOwotCi0JCQkJZWxlbWVudCA9IChEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JCQkJRGVzY3JpcHRvckRlc2NyaXB0aW9uIGNvbnRlbnQgPSAoRGVzY3JpcHRvckRlc2NyaXB0aW9uKSBlbGVtZW50Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0KLQkJCQlzdXBlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJcmVmaW5lZERlc2MucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQotCQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJCS5zZXRFbGVtZW50KGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJCS5zZXREaXNhYmxlKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmVmaW5lZERlc2Muc2V0VGV4dChjb250ZW50LmdldFJlZmluZWREZXNjcmlwdGlvbigpKTsKLQotCQkJCWlmIChleHBhbmRGbGFnKSB7Ci0JCQkJCWlmICgoKExhYmVsKWV4cGFuZERvY3VtZW50TGFiZWwuZ2V0Q29udHJvbCgpKQotCQkJCQkJCS5nZXRUZXh0KCkKLQkJCQkJCQkuZXF1YWxzKAotCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5EZXNjcmlwdG9yX1JlZmluZWREZXNjcmlwdGlvbikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRUZXh0KGNvbnRlbnQKLQkJCQkJCQkJLmdldFJlZmluZWREZXNjcmlwdGlvbigpKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0U2VsZWN0aW9uKDApOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJCQkJLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUoZmFsc2UpOwotCQkJCX0KLQotCQkJCXJlZmluZWREZXNjLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCXJlZmluZWREZXNjLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKSk7Ci0JCQkJcmVmaW5lZERlc2MuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciB3aGlsZSByZWZyZXNoaW5nIGRlc2NyaXB0b3IgZG9jdW1lbnRhdGlvbiBzZWN0aW9uIDoiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0Rlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4YzQ2MmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotCi0vKioKLSAqIFRoZSBnZW5lcmFsIHRhYiBzZWN0aW9uIGZvciBEZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiB7Ci0JcHJvdGVjdGVkIERlc2NyaXB0b3IgZWxlbWVudDsKLQotCXByaXZhdGUgQnV0dG9uIHN5bmNocm9uaXplZEJ1dHRvbjsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0KLQkJLy8gZ2V0IERlc2NyaXB0b3Igb2JqZWN0Ci0JCWVsZW1lbnQgPSAoRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2NyZWF0ZUdlbmVyYWxTZWN0aW9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHZW5lcmFsU2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXN1cGVyLmNyZWF0ZUdlbmVyYWxTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0KLQkJLy8gY3JlYXRlIGNvbXBvc2l0ZSBmb3IgY2hlY2tib3gKLQkJY2hlY2tCb3hDb21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCBudW1PZkNvbHVtbnMsIHRydWUpOwotCi0JCXN5bmNocm9uaXplZEJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVDaGVja0J1dHRvbih0b29sa2l0LCBjaGVja0JveENvbXBvc2l0ZSwKLQkJCQkxKTsKLQkJc3luY2hyb25pemVkQnV0dG9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5CcmVha2Rvd25FbGVtZW50X09wdGlvbl9TeW5jaHJvbml6ZWQpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCi0JCXN5bmNocm9uaXplZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlbGVtZW50LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2Yoc3luY2hyb25pemVkQnV0dG9uLmdldFNlbGVjdGlvbigpKSwgLTEpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jdXBkYXRlQ29udHJvbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlzdXBlci51cGRhdGVDb250cm9scygpOwotCQlzeW5jaHJvbml6ZWRCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJZWxlbWVudCA9IChEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0KLQkJCQlzeW5jaHJvbml6ZWRCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQKLQkJCQkJCS5nZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciByZWZyZXNoaW5nIERlc2NyaXB0b3IgZ2VuZXJhbCBzZWN0aW9uOiAiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNnZXROYW1lUHJlZml4KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVQcmVmaXgoKSB7Ci0JCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfREVTQ1JJUFRPUiArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRVBGUHJvcGVydHlTaGVldFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0VQRlByb3BlcnR5U2hlZXRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4NTM5OTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRVBGUHJvcGVydHlTaGVldFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5JRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHByb3BlcnR5IHNoZWV0IHBhZ2UgZm9yIHByb2Nlc3MgZWxlbWVudHMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRVBGUHJvcGVydHlTaGVldFBhZ2UgZXh0ZW5kcyBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB7Ci0JLy8gcHJpdmF0ZSBUYWJiZWRQcm9wZXJ0eVZpZXdlciB2aWV3ZXI7Ci0KLQlwcml2YXRlIElQcm9wZXJ0eVNoZWV0RW50cnkgcm9vdEVudHJ5OwotCi0JcHJpdmF0ZSBzdGF0aWMgSVByb3BlcnR5U291cmNlUHJvdmlkZXIgc291cmNlUHJvdmlkZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwcml2YXRlIHN0YXRpYyBQcm9jZXNzRWRpdG9yIHByb2Nlc3NFZGl0b3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtUGFnZUlEID0gbnVsbDsKLQkKLQlwcml2YXRlIHN0YXRpYyBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgZm9ybVBhZ2UgPSBudWxsOwotCi0JLy8gcHVibGljIHN0YXRpYyBpbnQgY3VycmVudFBhZ2U9MDsKLQotCXB1YmxpYyBFUEZQcm9wZXJ0eVNoZWV0UGFnZShQcm9jZXNzRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcigoSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IpIGVkaXRvcik7Ci0KLQkJYWN0aW9uTWdyID0gKChQcm9jZXNzRWRpdG9yKSBlZGl0b3IpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJcHJvY2Vzc0VkaXRvciA9IGVkaXRvcjsKLQotCX0KLQotCS8qKgotCSAqIEdldCBhY3Rpb24gbWFuYWdlcgotCSAqIEByZXR1cm4KLQkgKiAJCQlBY3Rpb24gTWFuYWdlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUFjdGlvbk1hbmFnZXIgZ2V0QWN0aW9uTWFuYWdlcigpIHsKLQkJcmV0dXJuIGFjdGlvbk1ncjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZWRpdG9yIGFzc29jaWF0ZWQgd2l0aCBwcm9wZXJ0eSBzaGVldCBwYWdlCi0JICogQHJldHVybgotCSAqIAkJCVByb2Nlc3MgRWRpdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzRWRpdG9yIGdldEVkaXRvcigpIHsKLQkJcmV0dXJuIHByb2Nlc3NFZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZ2l2ZW4gcHJvcGVydHkgc291cmNlIHByb3ZpZGVyIGFzIHRoZSBwcm9wZXJ0eSBzb3VyY2UgcHJvdmlkZXIuCi0JICogPHA+Ci0JICogQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyBvbmx5IHZhbGlkIGlmIHlvdSBhcmUgdXNpbmcgdGhpcyBwYWdlJ3MgZGVmYXVsdAotCSAqIHJvb3QgZW50cnkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBuZXdQcm92aWRlcgotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IHNvdXJjZSBwcm92aWRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5U291cmNlUHJvdmlkZXIoSVByb3BlcnR5U291cmNlUHJvdmlkZXIgbmV3UHJvdmlkZXIpIHsKLQkJc291cmNlUHJvdmlkZXIgPSBuZXdQcm92aWRlcjsKLQkJaWYgKHJvb3RFbnRyeSA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgYSBuZXcgcm9vdAotCQkJUHJvcGVydHlTaGVldEVudHJ5IHJvb3QgPSBuZXcgUHJvcGVydHlTaGVldEVudHJ5KCk7Ci0KLQkJCXJvb3RFbnRyeSA9IHJvb3Q7Ci0JCX0KLQkJaWYgKHNvdXJjZVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCS8vIHNldCB0aGUgcHJvcGVydHkgc291cmNlIHByb3ZpZGVyIGZvciByb290IGVudHJ5Ci0JCQlpZiAocm9vdEVudHJ5IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldEVudHJ5KSB7Ci0JCQkJKChQcm9wZXJ0eVNoZWV0RW50cnkpIHJvb3RFbnRyeSkKLQkJCQkJCS5zZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKHNvdXJjZVByb3ZpZGVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBwcm9wZXJ0eSBzb3VyY2UgcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGdldFByb3BlcnR5U291cmNlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBzb3VyY2VQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gc2VsZWN0aW9uIG9mIHRoZSBvYmplY3QgZnJvbSBicmVha2Rvd24gc3RydWN0dXJlIG9mIHRoZSBwcm9jZXNzIGVkaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsKSB7Ci0JCXNlbGVjdGlvbiA9IHNlbDsKLQotCQlpZiAocGFydCBpbnN0YW5jZW9mIFByb2Nlc3NFZGl0b3IpIHsKLQkJCXByb2Nlc3NFZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgcGFydDsKLQkJCS8vIGN1cnJlbnRQYWdlID0gcHJvY2Vzc0Zvcm1FZGl0b3IuZ2V0Q3VycmVudFBhZ2UoKTsKLQkJCWFjdGlvbk1nciA9IHByb2Nlc3NFZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQkJSUZvcm1QYWdlIGFjdGl2ZVBhZ2UgPSBwcm9jZXNzRWRpdG9yLmdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOwotCQkJaWYgKGFjdGl2ZVBhZ2UgaW5zdGFuY2VvZiBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpCi0JCQkJZm9ybVBhZ2UgPSAoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSBhY3RpdmVQYWdlOwotCQkJZm9ybVBhZ2VJRCA9IGFjdGl2ZVBhZ2UgIT0gbnVsbCA/IGFjdGl2ZVBhZ2UuZ2V0SWQoKSA6IG51bGw7Ci0JCX0KLQotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHBhcnQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSNoYW5kbGVQYXJ0QWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZVBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlpZiAocGFydCBpbnN0YW5jZW9mIFByb2Nlc3NFZGl0b3IpIHsKLQkJCXByb2Nlc3NFZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgcGFydDsKLQkJCXNlbGVjdGlvbiA9IHByb2Nlc3NFZGl0b3IuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlhY3Rpb25NZ3IgPSBwcm9jZXNzRWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJCUlGb3JtUGFnZSBhY3RpdmVQYWdlID0gcHJvY2Vzc0VkaXRvci5nZXRBY3RpdmVQYWdlSW5zdGFuY2UoKTsKLQkJCWlmIChhY3RpdmVQYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKQotCQkJCWZvcm1QYWdlID0gKFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSkgYWN0aXZlUGFnZTsKLQkJCWZvcm1QYWdlSUQgPSBhY3RpdmVQYWdlICE9IG51bGwgPyBhY3RpdmVQYWdlLmdldElkKCkgOiBudWxsOwotCQl9Ci0KLQkJc3VwZXIuaGFuZGxlUGFydEFjdGl2YXRlZChwYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgY3VycmVudCBhZGFwdGVyIGZhY3Rvcnkgb2YgZWRpdG9yCi0JICogQHJldHVybgotCSAqIAkJCUFkYXB0ZXIgRmFjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBmb3JtUGFnZS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotLy8JCWlmIChmb3JtUGFnZUlELmVxdWFscyhQcm9jZXNzRWRpdG9yLldCU19GT1JNX0lEKSkgewotLy8JCQlyZXR1cm4gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLS8vCQl9IGVsc2UgaWYgKGZvcm1QYWdlSUQuZXF1YWxzKFByb2Nlc3NFZGl0b3IuVEFfRk9STV9JRCkpIHsKLS8vCQkJcmV0dXJuIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0vLwkJfSBlbHNlIGlmIChmb3JtUGFnZUlELmVxdWFscyhQcm9jZXNzRWRpdG9yLldQQlNfRk9STV9JRCkpIHsKLS8vCQkJcmV0dXJuIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0vLwkJfSBlbHNlIGlmIChmb3JtUGFnZUlELmVxdWFscyhQcm9jZXNzRWRpdG9yLkNPTlNPTElEQVRFRF9GT1JNX0lEKSkgewotLy8JCQlyZXR1cm4gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLS8vCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLS8vCQl9Ci0KLS8vCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0KLQkJLy8gd2lsbCBzZWUgaWYgdGhpcyB3b3Jrcy4uCi0JCXRyeQotCQl7Ci0JCQlzdXBlci5yZWZyZXNoKCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQkKLQkJfQotCQkKLS8vCQkgVE9ETyAtIGdldCByaWQgb2YgaW50ZXJuYWwgQVBJcy4KLS8vCQlpZiAodGhpcy5nZXRDdXJyZW50VGFiKCkgIT0gbnVsbCkgewotLy8JCQl0aGlzLmdldEN1cnJlbnRUYWIoKS5yZWZyZXNoKCk7Ci0vLwotLy8JCQkvLyBhbHNvIHJlZnJlc2ggc2VjdGlvbgotLy8JCQlJU2VjdGlvbiBzZWN0aW9uID0gdGhpcy5nZXRDdXJyZW50VGFiKCkuZ2V0U2VjdGlvbkF0SW5kZXgoMCk7Ci0vLwkJCWlmIChzZWN0aW9uICE9IG51bGwpIHsKLS8vCQkJCXNlY3Rpb24ucmVmcmVzaCgpOwotLy8JCQl9Ci0vLwkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRWxlbWVudExhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0VsZW1lbnRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFjODNkNTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRWxlbWVudExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVHlwZU1hcHBlcjsKLQotCi0vKioKLSAqIExhYmVsIHByb3ZpZGVyIGZvciB0aGUgdGl0bGUgYmFyIGZvciB0aGUgdGFiYmVkIHByb3BlcnR5IHNoZWV0IHBhZ2UuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJVHlwZU1hcHBlciB0eXBlTWFwcGVyOwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBFbGVtZW50TGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQkJdHlwZU1hcHBlciA9IG5ldyBFbGVtZW50VHlwZU1hcHBlcigpOwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3RzKSB7Ci0JCWlmIChvYmplY3RzID09IG51bGwgfHwgb2JqZWN0cy5lcXVhbHMoU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUltYWdlIGltYWdlID0gTGlicmFyeVVJSW1hZ2VzLklNR19QUk9DRVNTOwotCQlmaW5hbCBib29sZWFuIG11bHRpcGxlW10gPSB7IGZhbHNlIH07Ci0JCWZpbmFsIE9iamVjdCBvYmplY3QgPSBnZXRPYmplY3Qob2JqZWN0cywgbXVsdGlwbGUpOwotCQlpZiAob2JqZWN0ID09IG51bGwgfHwgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgb2JqZWN0cykuc2l6ZSgpID4gMSkgewotCQkJcmV0dXJuIGltYWdlOwotCQl9IGVsc2UgewotCQkJT2JqZWN0IG9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChvYmplY3QpOwotCQkJaWYgKGxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkpOwotCQkJfQotCQkJSW1hZ2UgdGl0bGVJbWFnZSA9IGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqKTsKLQotCQkJcmV0dXJuIHRpdGxlSW1hZ2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdHMpIHsKLQkJaWYgKG9iamVjdHMgPT0gbnVsbCB8fCBvYmplY3RzLmVxdWFscyhTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKSkgewotCQkJcmV0dXJuIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Ob0l0ZW1zOyAKLQkJfQotCQlmaW5hbCBib29sZWFuIG11bHRpcGxlW10gPSB7IGZhbHNlIH07Ci0JCWZpbmFsIE9iamVjdCBvYmplY3QgPSBnZXRPYmplY3Qob2JqZWN0cywgbXVsdGlwbGUpOwotCQlpZiAob2JqZWN0ID09IG51bGwgfHwgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgb2JqZWN0cykuc2l6ZSgpID4gMSkgewotCQkJT2JqZWN0IHNpemUgPSBuZXcgSW50ZWdlcigoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBvYmplY3RzKS5zaXplKCkpOwotCQkJU3RyaW5nIG1zZyA9IFByb3BlcnRpZXNSZXNvdXJjZXMuYmluZChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfSXRlbXNTZWxlY3RlZCwgKG5ldyBPYmplY3RbXSB7IHNpemUgfSkpOyAKLQkJCXJldHVybiBtc2c7Ci0JCX0gZWxzZSB7Ci0KLQkJCU9iamVjdCBvYmogPSBMaWJyYXJ5VXRpbC51bndyYXAob2JqZWN0KTsKLQkJCXJldHVybiBnZXROYW1lKG9iaik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXROYW1lKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCi0JCVN0cmluZyBwcmVmaXggPSBQcm9wZXJ0aWVzVXRpbC5nZXRUeXBlKG9iaik7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCW5hbWUgPSBwcmVmaXggKyAiIDogIiArICgoQnJlYWtkb3duRWxlbWVudCkgb2JqKS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCW5hbWUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTm9Qcm9wZXJ0aWVzQXZhaWxhYmxlOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgYSBtdWx0aXBsZSBvYmplY3Qgc2VsZWN0aW9uIGhhcyBiZWVuIHBhc3NlZCB0byB0aGUgbGFiZWwKLQkgKiBwcm92aWRlci4gSWYgdGhlIG9iamVjdHMgaXMgYSBJU3RydWN0dXJlZFNlbGVjdGlvbiwgc2VlIGlmIGFsbCB0aGUKLQkgKiBvYmplY3RzIGluIHRoZSBzZWxlY3Rpb24gYXJlIHRoZSBzYW1lIGFuZCBpZiBzbywgd2Ugd2FudCB0byBwcm92aWRlCi0JICogbGFiZWxzIGZvciB0aGUgY29tbW9uIHNlbGVjdGVkIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIG9iamVjdHMKLQkgKiAgICAgICAgICAgIGEgc2luZ2xlIG9iamVjdCBvciBhIElTdHJ1Y3R1cmVkU2VsZWN0aW9uLgotCSAqIEBwYXJhbSBtdWx0aXBsZQotCSAqICAgICAgICAgICAgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkgaXMgdHJ1ZSBpZiB0aGVyZSBpcyBtdWx0aXBsZQotCSAqICAgICAgICAgICAgdW5lcXVhbCBzZWxlY3RlZCBlbGVtZW50cyBpbiBhIElTdHJ1Y3R1cmVkU2VsZWN0aW9uLgotCSAqIEByZXR1cm4gdGhlIG9iamVjdCB0byBnZXQgbGFiZWxzIGZvci4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRPYmplY3QoT2JqZWN0IG9iamVjdHMsIGJvb2xlYW4gbXVsdGlwbGVbXSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG9iamVjdHMpOwotCQlPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLQkJaWYgKG9iamVjdHMgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBvYmplY3RzOwotCQkJb2JqZWN0ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCS8vIG9uZSBlbGVtZW50IHNlbGVjdGVkCi0JCQkJbXVsdGlwbGVbMF0gPSBmYWxzZTsKLQkJCQlyZXR1cm4gb2JqZWN0OwotCQkJfQotCQkJLy8gbXVsdGlwbGUgZWxlbWVudHMgc2VsZWN0ZWQKLQkJCW11bHRpcGxlWzBdID0gdHJ1ZTsKLS8vCQkJQ2xhc3MgZmlyc3RDbGFzcyA9IHR5cGVNYXBwZXIubWFwVHlwZShvYmplY3QsIG9iamVjdC5nZXRDbGFzcygpKTsKLQkJCUNsYXNzIGZpcnN0Q2xhc3MgPSB0eXBlTWFwcGVyLm1hcFR5cGUob2JqZWN0KTsKLQkJCS8vIGRldGVybWluZSBpZiBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIHNlbGVjdGlvbiBhcmUgdGhlIHNhbWUgdHlwZQotCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbmV4dCA9IGkubmV4dCgpOwotLy8JCQkJCUNsYXNzIG5leHRDbGFzcyA9IHR5cGVNYXBwZXIubWFwVHlwZShuZXh0LCBuZXh0Ci0vLwkJCQkJCQkuZ2V0Q2xhc3MoKSk7Ci0JCQkJCUNsYXNzIG5leHRDbGFzcyA9IHR5cGVNYXBwZXIubWFwVHlwZShuZXh0KTsKLQkJCQkJaWYgKCFuZXh0Q2xhc3MuZXF1YWxzKGZpcnN0Q2xhc3MpKSB7Ci0JCQkJCQkvLyB0d28gZWxlbWVudHMgbm90IGVxdWFsID09IG11bHRpcGxlIHNlbGVjdGVkIHVuZXF1YWwKLQkJCQkJCW11bHRpcGxlWzBdID0gZmFsc2U7Ci0JCQkJCQlvYmplY3QgPSBudWxsOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQltdWx0aXBsZVswXSA9IGZhbHNlOwotCQkJb2JqZWN0ID0gb2JqZWN0czsKLQkJfQotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0VsZW1lbnRUeXBlTWFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9FbGVtZW50VHlwZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOGVjMDU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0VsZW1lbnRUeXBlTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVR5cGVNYXBwZXI7Ci0KLQotLyoqCi0gKiBUeXBlIG1hcHBlciBmb3IgdGhlIGxvZ2ljIGV4YW1wbGUuIFdlIHdhbnQgdG8gZ2V0IHRoZSBHRUYgbW9kZWwgb2JqZWN0IGZyb20KLSAqIHRoZSBzZWxlY3RlZCBlbGVtZW50IGluIHRoZSBvdXRsaW5lIHZpZXcgYW5kIHRoZSBkaWFncmFtLiBXZSBjYW4gdGhlbiBmaWx0ZXIKLSAqIG9uIHRoZSBtb2RlbCBvYmplY3QgdHlwZS4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudFR5cGVNYXBwZXIgaW1wbGVtZW50cyBJVHlwZU1hcHBlciB7Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVR5cGVNYXBwZXIjbWFwVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDbGFzcyBtYXBUeXBlKE9iamVjdCBvYmplY3QpIHsKLS8vCQlDbGFzcyB0eXBlID0gZWZmZWN0aXZlVHlwZTsKLQkJQ2xhc3MgdHlwZSA9IG51bGw7Ci0JCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJdHlwZSA9IG9iamVjdC5nZXRDbGFzcygpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQl0eXBlID0gKChCcmVha2Rvd25FbGVtZW50KSBvYmplY3QpLmdldENsYXNzKCk7Ci0JCQl9Ci0JCX0KLQkKLQkJcmV0dXJuIHR5cGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0Zvcm1VSS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRm9ybVVJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU0NTZkYzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRm9ybVVJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQmFzZUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuTWV0aG9kRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5EZWNvcmF0ZWRGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkltYWdlSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLQotCi0vKioKLSAqIFRoZSBVSSB1dGlsIGNsYXNzIHRhaWxvcmVkIGZvciBwcm9wZXJ0aWVzIHZpZXcgZm9yIHByb2Nlc3MgYXV0aG9yaW5nCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZvcm1VSSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9XSURUSCA9IDMwMDsKLQotCXByaXZhdGUgc3RhdGljIExhYmVsIF9jcmVhdGVMYWJlbChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIHN0ciwgaW50IGdyaWREYXRhU3R5bGUsIGludCBob3Jpem9udGFsU3BhbikgewotCQlMYWJlbCBsYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwocGFyZW50LCBzdHIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkRGF0YVN0eWxlKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgc3RyKSB7Ci0JCS8vIG1ha2UgaG9yaXpvbmF0YWxTcGFuIDEKLQkJcmV0dXJuIF9jcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIHN0ciwgR3JpZERhdGEuQkVHSU5OSU5HLCAxKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgc3RyLCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJLy8gbWFrZSBob3Jpem9uYXRhbFNwYW4gMgotCQlyZXR1cm4gX2NyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgc3RyLCBHcmlkRGF0YS5CRUdJTk5JTkcsCi0JCQkJaG9yaXpvbnRhbFNwYW4pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRleHQgX2NyZWF0ZVRleHQoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCB0ZXh0U3R5bGUsIGludCBncmlkRGF0YVN0eWxlLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsCi0JCQlpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJVGV4dCBjb250cm9sID0gdG9vbGtpdC5jcmVhdGVUZXh0KHBhcmVudCwgIiIsIHRleHRTdHlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZERhdGFTdHlsZSk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQljb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlVGV4dChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBfY3JlYXRlVGV4dCh0b29sa2l0LCBwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuV1JBUCwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIFNXVC5ERUZBVUxULCBERUZBVUxUX1dJRFRILAotCQkJCVNXVC5ERUZBVUxUKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlVGV4dChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IGhlaWdodCkgewotCQlyZXR1cm4gX2NyZWF0ZVRleHQodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuV1JBUCwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIGhlaWdodCwgREVGQVVMVF9XSURUSCwgU1dULkRFRkFVTFQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0KEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgaGVpZ2h0LCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJcmV0dXJuIF9jcmVhdGVUZXh0KHRvb2xraXQsIHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5XUkFQLAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgaGVpZ2h0LCBERUZBVUxUX1dJRFRILCBob3Jpem9udGFsU3Bhbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSU1ldGhvZFJpY2hUZXh0IF9jcmVhdGVSaWNoVGV4dChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IGhlaWdodCwgaW50IHdpZHRoLCBTdHJpbmcgcGF0aCwKLQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCwgRGVjb3JhdGVkRmllbGQgbGFiZWwpIHsKLQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBNZXRob2RGb3JtVG9vbGtpdC5jcmVhdGVSaWNoVGV4dCh0b29sa2l0LAotCQkJCXBhcmVudCwKLQkJCQkiIiwgU1dULk1VTFRJIHwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwsIHBhdGgsIG1ldGhvZEVsZW1lbnQsIGxhYmVsKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQl8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciBjcmVhdGVSaWNoVGV4dFdpdGhMaW5rKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgaGVpZ2h0LCBTdHJpbmcgcGF0aCwKLQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCwgU3RyaW5nIGxhYmVsVGV4dCkgewotCQlJbWFnZUh5cGVybGluayBsaW5rID0gY3JlYXRlSW1hZ2VIeXBlckxpbmsodG9vbGtpdCwgcGFyZW50LCBBdXRob3JpbmdVSUltYWdlcy5JTUdfQ09MTEFQU0VELAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm9wZW5SVEUpOwotCQlsaW5rLnNldERhdGEoIlRpdGxlIiwgbGFiZWxUZXh0KTsgLy8kTk9OLU5MUy0xJAotCQlEZWNvcmF0ZWRGaWVsZCBkZWNvcmF0ZWRMYWJlbCA9IEJhc2VGb3JtUGFnZS5jcmVhdGVEZWNvcmF0ZWRMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCk7Ci0JCSgoR3JpZERhdGEpZGVjb3JhdGVkTGFiZWwuZ2V0TGF5b3V0Q29udHJvbCgpLmdldExheW91dERhdGEoKSkudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCi0JCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gX2NyZWF0ZVJpY2hUZXh0KHRvb2xraXQsIHBhcmVudCwgaGVpZ2h0LCBERUZBVUxUX1dJRFRILCBwYXRoLAotCQkJCW1ldGhvZEVsZW1lbnQsIGRlY29yYXRlZExhYmVsKTsKLQkJbGluay5zZXRIcmVmKGNvbnRyb2wpOwotCi0JCXJldHVybiBuZXcgUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIoY29udHJvbCwgbGluayk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZUh5cGVybGluayBjcmVhdGVJbWFnZUh5cGVyTGluayhGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgSW1hZ2UgaW1hZ2UsIFN0cmluZyB0b29sVGlwKSB7Ci0JCUltYWdlSHlwZXJsaW5rIGxpbmsgPSB0b29sa2l0LmNyZWF0ZUltYWdlSHlwZXJsaW5rKHBhcmVudCwgU1dULkxFRlQKLQkJCQl8IFNXVC5UT1ApOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlsaW5rLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlsaW5rLnNldEltYWdlKGltYWdlKTsKLQkJbGluay5zZXRUb29sVGlwVGV4dCh0b29sVGlwKTsKLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihwYXJlbnQsIFNlY3Rpb24uREVTQ1JJUFRJT04KLQkJCQl8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlzZWN0aW9uLnNldExheW91dERhdGEoZ2QpOwotCQlzZWN0aW9uLnNldFRleHQodGl0bGUpOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJdG9vbGtpdC5jcmVhdGVDb21wb3NpdGVTZXBhcmF0b3Ioc2VjdGlvbik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgZ2RTdHlsZSkgewotCQlTZWN0aW9uIHNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBTZWN0aW9uLkRFU0NSSVBUSU9OCi0JCQkJfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVEKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoZ2RTdHlsZSk7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNlY3Rpb24uc2V0VGV4dCh0aXRsZSk7Ci0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCQl0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZVNlcGFyYXRvcihzZWN0aW9uKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXJldHVybiBzZWN0aW9uOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJU2VjdGlvbiBzZWN0aW9uLCBpbnQgbnVtT2ZDb2x1bW5zLCBib29sZWFuIGV4cGFuZGVkKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KG51bU9mQ29sdW1ucywgZmFsc2UpKTsKLQkJaWYgKCFleHBhbmRlZCkKLQkJCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7Ci0JCWVsc2UKLQkJCWNvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgZ3JpZFN0eWxlKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWRTdHlsZSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlyZXR1cm4gcGFuZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCBncmlkU3R5bGUsIGludCBudW1PZkNvbHVtbnMsCi0JCQlib29sZWFuIGVxdWFsU2l6ZUNvbHVtbikgewotCQlDb21wb3NpdGUgcGFuZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkU3R5bGUpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IG51bU9mQ29sdW1uczsKLQkJcGFuZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dChudW1PZkNvbHVtbnMsIGVxdWFsU2l6ZUNvbHVtbik7Ci0JCWxheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotCQlsYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlwYW5lLnNldExheW91dChsYXlvdXQpOwotCQlyZXR1cm4gcGFuZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBCdXR0b24gX2NyZWF0ZUJ1dHRvbihGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGJ1dHRvblN0ciwgaW50IHN0eWxlLCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJQnV0dG9uIGNvbnRyb2wgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsIGJ1dHRvblN0ciwgc3R5bGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQljb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBCdXR0b24gX2NyZWF0ZUJ1dHRvbihGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGJ1dHRvblN0ciwgaW50IHN0eWxlKSB7Ci0JCUJ1dHRvbiBjb250cm9sID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LCBidXR0b25TdHIsIHN0eWxlKTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCQotCQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29tYm8gX2NyZWF0ZUNvbWJvKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgc3R5bGUsIGludCBob3Jpem9udGFsU3BhbikgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIHN0eWxlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZUNvbWJvKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJcmV0dXJuIF9jcmVhdGVDb21ibyh0b29sa2l0LCBwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuRkxBVAotCQkJCXwgU1dULlJFQURfT05MWSwgaG9yaXpvbnRhbFNwYW4pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVCdXR0b24oRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBidXR0b25TdHIpIHsKLQkJcmV0dXJuIF9jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFyZW50LCBidXR0b25TdHIsIFNXVC5OT05FKTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHN0eWxlLCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJcmV0dXJuIF9jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFyZW50LCAiIiwgc3R5bGUsIGhvcml6b250YWxTcGFuKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVDaGVja0J1dHRvbihGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LCBpbnQgaG9yaXpvbnRhbFNwYW4pCi0JewotCQlCdXR0b24gY29udHJvbCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwgIiIsIFNXVC5DSEVDSyk7CQkvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRhYmxlIF9jcmVhdGVUYWJsZShGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHRhYmxlU3R5bGUsIGludCBncmlkU3R5bGUsIGludCBoZWlnaHQsIGludCB3aWR0aCwKLQkJCWludCB2ZXJ0aWNhbFNwYW4sIGludCBob3Jpem9udGFsU3BhbikgewotCQlUYWJsZSB0YWJsZSA9IHRvb2xraXQuY3JlYXRlVGFibGUocGFyZW50LCB0YWJsZVN0eWxlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZFN0eWxlKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGhlaWdodDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0JCWdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IHZlcnRpY2FsU3BhbjsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRhYmxlIGNyZWF0ZVRhYmxlKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIF9jcmVhdGVUYWJsZSh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCTIwMCwgMjAwLCAxLCAxKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRhYmxlIGNyZWF0ZVRhYmxlKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgaGVpZ2h0KSB7Ci0JCXJldHVybiBfY3JlYXRlVGFibGUodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEksIEdyaWREYXRhLkZJTExfQk9USCwKLQkJCQloZWlnaHQsIDIwMCwgMSwgMSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvTWlsZXN0b25lRG9jdW1lbnRTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9NaWxlc3RvbmVEb2N1bWVudFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzAyYTU5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9NaWxlc3RvbmVEb2N1bWVudFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuUmljaFRleHRJbWFnZUxpbmtDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLQotLyoqCi0gKiBUaGUgZG9jdW1lbnQgdGFiIHNlY3Rpb24gZm9yIE1pbGVzdG9uZQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWxlc3RvbmVEb2N1bWVudFNlY3Rpb24gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uIHsKLQotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQ7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBtYWluRGVzYzsKLQotCXByaXZhdGUgTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBleHBhbmRGbGFnID8gY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQk6IG1haW5EZXNjOwotCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9ICgoQ29udGVudERlc2NyaXB0aW9uKSBlbGVtZW50LmdldFByZXNlbnRhdGlvbigpKQotCQkJCQkuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZShtYWluRGVzYywKLQkJCQkJb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCksIG5ld0NvbnRlbnQsCi0JCQkJCQktMSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNjcmVhdGVEb2N1bWVudFNlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURvY3VtZW50U2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXN1cGVyLmNyZWF0ZURvY3VtZW50U2VjdGlvbihjb21wb3NpdGUpOwotCQlpbnQgaGVpZ2h0SGludCA9IDIwMDsKLQotCQkvLyBtYWluIGRlc2NyaXB0aW9uCi0JCVJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyIG1haW5EZXNjQ29udGFpbmVyID0gRm9ybVVJLmNyZWF0ZVJpY2hUZXh0V2l0aExpbmsodG9vbGtpdCwKLQkJCQlkb2N1bWVudENvbXBvc2l0ZSwgaGVpZ2h0SGludCwgY29udGVudEVsZW1lbnRQYXRoLCBlbGVtZW50LAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19tYWluRGVzY3JpcHRpb24pOwotCQlhZGRIeXBlckxpbmtMaXN0ZW5lcihtYWluRGVzY0NvbnRhaW5lci5saW5rKTsKLQkJbWFpbkRlc2MgPSBtYWluRGVzY0NvbnRhaW5lci5yaWNoVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQkJbWFpbkRlc2Muc2V0TW9kYWxPYmplY3QoZ2V0RWxlbWVudCgpKTsKLQkJbWFpbkRlc2Muc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpKTsKLQkJbWFpbkRlc2MuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI3VwZGF0ZUNvbnRyb2xzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJc3VwZXIudXBkYXRlQ29udHJvbHMoKTsKLQkJbWFpbkRlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNhdmVNb2RpZmllZFJpY2hUZXh0KCk7Ci0KLQkJCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQotCQkJCXN1cGVyLnJlZnJlc2goKTsKLQotCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQltYWluRGVzYy5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCi0JCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkJLnNldEVsZW1lbnQoZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQltYWluRGVzYy5zZXRUZXh0KGNvbnRlbnQuZ2V0TWFpbkRlc2NyaXB0aW9uKCkpOwotCi0JCQkJaWYgKGV4cGFuZEZsYWcpIHsKLQkJCQkJaWYgKCgoTGFiZWwpZXhwYW5kRG9jdW1lbnRMYWJlbC5nZXRDb250cm9sKCkpLmdldFRleHQoKS5lcXVhbHMoCi0JCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX21haW5EZXNjcmlwdGlvbikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJewotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRUZXh0KGNvbnRlbnQKLQkJCQkJCQkJLmdldE1haW5EZXNjcmlwdGlvbigpKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0U2VsZWN0aW9uKDApOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJCQkJLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUoZmFsc2UpOwotCQkJCX0KLQotCQkJCW1haW5EZXNjLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCW1haW5EZXNjLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSk7Ci0JCQkJbWFpbkRlc2MuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciB3aGlsZSByZWZyZXNoaW5nIG1pbGVzdG9uZSBkb2N1bWVudGF0aW9uIHNlY3Rpb24gOiIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvT0JTUmVsYXRpb25TZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9PQlNSZWxhdGlvblNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTc0YmVlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9PQlNSZWxhdGlvblNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NSb2xlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBUaGUgYmFzZSBPQlMgcmVsYXRpb24gc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNSZWxhdGlvblNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQlwcml2YXRlIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZF8xLCBjdHJsX2FkZF8yLCBjdHJsX3JlbW92ZTsKLQotCXByaXZhdGUgVGFibGUgY3RybF9zZWxlY3RlZDsKLQotCXByb3RlY3RlZCBUYWJsZVZpZXdlciB2aWV3ZXI7Ci0KLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQkKLQlwcml2YXRlIFN0cmluZyBkZXNjOwotCQotCXByaXZhdGUgU3RyaW5nIHRhYmxlMTsKLQotCS8vIGVsZW1lbnQKLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudCBlbGVtZW50OwotCi0JLy8gYWN0aW9uIG1hbmFnZXIKLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLy8gYnkgZGVmYXVsdCB0aGlzIGJ1dHRvbiBpcyBmYWxzZQotCXByb3RlY3RlZCBib29sZWFuIHNob3dBZGRGcm9tUHJvY2Vzc0J1dHRvbiA9IGZhbHNlOwotCi0JLy8gZmlsdGVyCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlciA9IG51bGw7Ci0KLQlwdWJsaWMgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWlmIChmaWx0ZXIgPT0gbnVsbCkgewotCQkJZmlsdGVyID0gbmV3IFByb2Nlc3NSb2xlRmlsdGVyKGdldENvbmZpZ3VyYXRpb24oKSwgbnVsbCwKLQkJCQkJRmlsdGVyQ29uc3RhbnRzLlJPTEVTKTsKLQkJfQotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0KLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JCWluaXQoKTsKLQotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gY3JlYXRlIHNlY3Rpb24KLQkJY3JlYXRlU2VjdGlvbihwYXJlbnQpOwotCi0JCS8vIGFkZCBsaXN0ZW5lcnMKLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRyb2xzCi0JCXVwZGF0ZUNvbnRyb2xzKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJLy8gZ2V0IGJyZWFrZG93bmVsZW1lbnQgb2JqZWN0Ci0JCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCi0JCS8vIGdldCB0b29sa2l0Ci0JCXRvb2xraXQgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0KLQkJLy8gZ2V0IGFjdGlvbiBtYW5hZ2VyCi0JCWFjdGlvbk1nciA9IEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWJEYXRhKFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2MsIFN0cmluZyB0YWJsZTEpIHsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQl0aGlzLmRlc2MgPSBkZXNjOwotCQl0aGlzLnRhYmxlMSA9IHRhYmxlMTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBzZWN0aW9uCi0JCVNlY3Rpb24gYVNlY3Rpb24gPSBGb3JtVUkuY3JlYXRlU2VjdGlvbih0b29sa2l0LCBwYXJlbnQsCi0JCQkJdGl0bGUsIGRlc2MpOwotCi0JCS8vIGNyZWF0ZSBnZW5lcmFsIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBhU2VjdGlvbiwgMiwKLQkJCQlmYWxzZSk7Ci0KLQkJLy8gY3JlYXRlIHRhYmxlIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgcGFuZTEgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQlHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTEsIHRhYmxlMSk7Ci0KLQkJY3RybF9zZWxlY3RlZCA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSk7Ci0JCXZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3NlbGVjdGVkKTsKLQotCQlpbml0Q29udGVudFByb3ZpZGVyKCk7Ci0KLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXZpZXdlci5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkvLyBjcmVhdGUgYnV0dG9uIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgcGFuZTIgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCi0JCS8vIGNyZWF0ZSBidXR0b25zCi0JCWN0cmxfYWRkXzEgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc2hvd0FkZEZyb21Qcm9jZXNzQnV0dG9uKSB7Ci0JCQljdHJsX2FkZF8yID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZEZyb21Qcm9jZXNzKTsgCi0JCX0KLQkJY3RybF9yZW1vdmUgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbXBvc2l0ZSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTIpOwotCi0JfQotCi0JLyoqCi0JICogR2V0IERlZmF1bHQgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGdldERlZmF1bHRDb25maWd1cmF0aW9uKCkgewotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgZ2V0QWRhcHRlcigpOwotCQlPYmplY3QgcGFyZW50ID0gbnVsbDsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCUlCU0l0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXI7Ci0JCQlwYXJlbnQgPSBic0l0ZW1Qcm92aWRlci5nZXRUb3BJdGVtKCk7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSBwYXJlbnQpCi0JCQkJCS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJcmV0dXJuIGNvbmZpZzsKLQkJfSBlbHNlIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoIk9CU1JlbGF0aW9uU2VjdGlvbjo6Z2V0RGVmYXVsdENvbmZpZ3VyYXRpb24gLSBJQlNJdGVtUHJvdmlkZXIgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQkvLyBBZGQgZm9jdXMgbGlzdGVuZXIgb24gcHJpbWFyeSB0YXNrcyBsaXN0Ci0JCWN0cmxfc2VsZWN0ZWQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX2FkZF8xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW9wZW5BZGREaWFsb2coKTsKLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQotCQlpZiAoc2hvd0FkZEZyb21Qcm9jZXNzQnV0dG9uKSB7Ci0JCQljdHJsX2FkZF8yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJb3BlbkFkZEZyb21Qcm9jZXNzRGlhbG9nKCk7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQljdHJsX3JlbW92ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQlyZW1vdmUocm1JdGVtcyk7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCX0KLQkJCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRWxlbWVudCAiK2VsZW1lbnQuZ2V0TmFtZSgpICsKLQkJLy8gIkVkaXRhYmxlLSIrZWRpdGFibGUpOwotCQlpZiAoY3RybF9hZGRfMSAhPSBudWxsKQotCQkJY3RybF9hZGRfMS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKGN0cmxfYWRkXzIgIT0gbnVsbCkKLQkJCWN0cmxfYWRkXzIuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiBlZGl0YWJsZSkgewotCQkJaWYgKGN0cmxfcmVtb3ZlICE9IG51bGwpCi0JCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKHRydWUpOwotCQl9IGVsc2UgewotCQkJaWYgKGN0cmxfcmVtb3ZlICE9IG51bGwpCi0JCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5BYnN0cmFjdFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl1cGRhdGVDb250cm9scygpOwotCi0JCXN1cGVyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgcGFyZW50IGFjdGl2aXR5Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JLy8gcHJvdGVjdGVkIEFjdGl2aXR5IGdldFBhcmVudEFjdGl2aXR5KEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCkKLQkvLyB7Ci0JLy8gQWN0aXZpdHkgYWN0aXZpdHkgPSBudWxsOwotCS8vIEFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0KLQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCS8vIEl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKQotCS8vIGFGYWN0b3J5LmFkYXB0KGVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JLy8gT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCS8vIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkvLyB7Ci0JLy8gYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkvLyB9Ci0JLy8JCQotCS8vIHJldHVybiBhY3Rpdml0eTsKLQkvLyB9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBjb250ZW50IHByb3ZpZGVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIFVJIERpYWxvZyB0byBhZGQgbWV0aG9kIGVsZW1lbnRzCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQWRkRGlhbG9nKCkgewotCX0KLQotCS8qKgotCSAqIE9wZW4gVUkgRGlhbG9nIHRvIGFkZCBkZXNjcmlwdG9yIGVsZW1lbnRzCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQWRkRnJvbVByb2Nlc3NEaWFsb2coKSB7Ci0JfQotCi0JLy8gcHJvdGVjdGVkIHZvaWQgYWRkKE9iamVjdFtdIGl0ZW1zKSB7fQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZShBcnJheUxpc3Qgcm1JdGVtcykgewotCX0KLQotCS8qKgotCSAqIERpc3Bvc2UKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc29zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9QcmVkZWNlc3NvckRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUHJlZGVjZXNzb3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzlhNjliOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9QcmVkZWNlc3NvckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0KLS8qKgotICogRGlhbG9nIGZvciBhZGRpbmcgcHJlZGVjZXNzb3IgZGVwZW5kZW5jeQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJlZGVjZXNzb3JEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JcHJpdmF0ZSBUZXh0IHByZWRJZFRleHQ7Ci0KLQlwcml2YXRlIFRleHQgcHJlc2VudGF0aW9uTmFtZTsKLQotCXByaXZhdGUgQ29tYm8gZGVwZW5kZW5jeTsKLQotCS8qKiBEZXBlbmRlbmN5IExpdGVyYWxzICogKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOSVNIX1RPX1NUQVJUID0gUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19TVEFSVDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTklTSF9UT19GSU5JU0ggPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtPcmRlclR5cGVfRklOSVNIX1RPX0ZJTklTSDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RPX1NUQVJUID0gUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX1NUQVJUOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVE9fRklOSVNIID0gUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX0ZJTklTSDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmdbXSBkZXBlbmRlbmN5TGlzdCA9IG5ldyBTdHJpbmdbXSB7IEZJTklTSF9UT19TVEFSVCwKLQkJCUZJTklTSF9UT19GSU5JU0gsIFNUQVJUX1RPX1NUQVJULCBTVEFSVF9UT19GSU5JU0ggfTsKLQotCXByaXZhdGUgV29ya0JyZWFrZG93bkVsZW1lbnQgZWxlbWVudDsKLQotCXByaXZhdGUgT2JqZWN0IHByb2Nlc3M7Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBMaXN0IHByZWRlY2Vzc29ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgTGlzdCBwcmVkTWFwTGlzdDsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JcHJpdmF0ZSBQcmVkZWNlc3Nvck1hcCBwcmVkTWFwOwotCi0JLyoqCi0JICogRGlhbG9nIGZvciBzZXR0aW5nIHByZWRlY2Vzc29yIGZvciB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqIAkJCVRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIAkJCVdvcmsgQnJlYWsgZG93biBFbGVtZW50Ci0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiAJCQlQcm9jZXNzIG9mIHRoZSB3b3JrYnJlYWtkb3duIGVsZW1lbnQKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiAJCQlBZGFwdGVyIEZhY3RvcnkgCi0JICogQHBhcmFtIHByZWRNYXAKLQkgKiAJCQlQcmVkZWNlc3NvciBNYXAKLQkgKiBAcGFyYW0gcHJlZE1hcExpc3QKLQkgKiAJCQlQcmVkZWNlc3NvciBNYXAgbGlzdAotCSAqIEBwYXJhbSBhY3Rpb25NZ3IKLQkgKiAJCQlBY3Rpb24gTWFuYWdlcgotCSAqLwotCXB1YmxpYyBQcmVkZWNlc3NvckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgV29ya0JyZWFrZG93bkVsZW1lbnQgZWxlbWVudCwKLQkJCU9iamVjdCBwcm9jZXNzLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCVByZWRlY2Vzc29yTWFwIHByZWRNYXAsIExpc3QgcHJlZE1hcExpc3QsIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0KLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5wcm9jZXNzID0gcHJvY2VzczsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCQl0aGlzLnByZWRNYXAgPSBwcmVkTWFwOwotCQl0aGlzLnByZWRNYXBMaXN0ID0gcHJlZE1hcExpc3Q7Ci0JCXRoaXMuYWN0aW9uTWdyID0gYWN0aW9uTWdyOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIGRpYWxvZyBoZWFkZXIKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5QcmVkZWNlc3NvckRpYWxvZ19IZWFkZXJNZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIGJsYW5rIGxhYmVsCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIFByZWRlY2Vzc29yIElEIGluZGV4Ci0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJlZGVjZXNzb3JEaWFsb2dfSW5kZXgpOyAKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJcHJlZElkVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDEwMDsKLQkJcHJlZElkVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcHJlZElkVGV4dC5zZXRUZXh0KG5ldyBJbnRlZ2VyKHByZWRNYXAuZ2V0SWQoKSkudG9TdHJpbmcoKSk7Ci0JCS8vIHByZWRJZFRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0JCS8vIFByZXNlbnRhaW9uIE5hbWUKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5QcmVkZWNlc3NvckRpYWxvZ19QcmVzZW50YXRpb25OYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlwcmVzZW50YXRpb25OYW1lID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNDAwOwotCQlwcmVzZW50YXRpb25OYW1lLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJcHJlc2VudGF0aW9uTmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlXb3JrT3JkZXIgd28gPSBwcmVkTWFwLmdldFdvcmtPcmRlcigpOwotCQlwcmVzZW50YXRpb25OYW1lLnNldFRleHQoUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZSh3by5nZXRQcmVkKCkpKTsKLQotCQkvLyBEZXBlbmRlbmN5Ci0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJlZGVjZXNzb3JEaWFsb2dfRGVwZW5kZW5jeSk7IC8vJE5PTi1OTFMtMSQKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJZGVwZW5kZW5jeSA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJZGVwZW5kZW5jeS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJZGVwZW5kZW5jeS5zZXRJdGVtcyhkZXBlbmRlbmN5TGlzdCk7Ci0KLQkJU3RyaW5nIGRlcGVkZW5jeU5hbWUgPSB3by5nZXRMaW5rVHlwZSgpLmdldE5hbWUoKTsKLQkJaWYgKHdvLmdldExpbmtUeXBlKCkuZ2V0VmFsdWUoKSA9PSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0gpIHsKLQkJCWRlcGVkZW5jeU5hbWUgPSBGSU5JU0hfVE9fRklOSVNIOwotCQl9IGVsc2UgaWYgKHdvLmdldExpbmtUeXBlKCkuZ2V0VmFsdWUoKSA9PSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVCkgewotCQkJZGVwZWRlbmN5TmFtZSA9IEZJTklTSF9UT19TVEFSVDsKLQkJfSBlbHNlIGlmICh3by5nZXRMaW5rVHlwZSgpLmdldFZhbHVlKCkgPT0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19GSU5JU0gpIHsKLQkJCWRlcGVkZW5jeU5hbWUgPSBTVEFSVF9UT19GSU5JU0g7Ci0JCX0gZWxzZSBpZiAod28uZ2V0TGlua1R5cGUoKS5nZXRWYWx1ZSgpID09IFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fU1RBUlQpIHsKLQkJCWRlcGVkZW5jeU5hbWUgPSBTVEFSVF9UT19TVEFSVDsKLQkJfQotCQlkZXBlbmRlbmN5LnNldFRleHQoZGVwZWRlbmN5TmFtZSk7Ci0KLQkJTGFiZWwgbGluZSA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTAotCQkJCXwgU1dULkJPTEQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxpbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJcHJlZElkVGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBldmVudCkgewotCQkJCWludCBuZXdJZDsKLQkJCQl0cnkgewotCQkJCQluZXdJZCA9IG5ldyBJbnRlZ2VyKHByZWRJZFRleHQuZ2V0VGV4dCgpKS5pbnRWYWx1ZSgpOwotCQkJCQlpZiAobmV3SWQgPCAwKQotCQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5V2FybmluZygKLQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJUaXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlck1lc3NhZ2UpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJcHJlZElkVGV4dC5zZXRUZXh0KG5ldyBJbnRlZ2VyKHByZWRNYXAuZ2V0SWQoKSkudG9TdHJpbmcoKSk7Ci0JCQkJCXByZWRJZFRleHQuc2V0Rm9jdXMoKTsKLQkJCQkJcHJlZElkVGV4dC5zZWxlY3RBbGwoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmIChhbHJlYWR5RXhpc3RzKG5ld0lkKSkgewotCQkJCQlwcmVkSWRUZXh0LnNldFRleHQobmV3IEludGVnZXIocHJlZE1hcC5nZXRJZCgpKS50b1N0cmluZygpKTsKLQotCQkJCQlwcmVkSWRUZXh0LnNlbGVjdEFsbCgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHByZWRJRExpc3QgPSBnZXRQcmVkSWQobmV3SWQpOwotCQkJCWlmIChwcmVkSURMaXN0ID09IG51bGwpCi0JCQkJCXJldHVybjsKLQotCQkJCVN0cmluZyBzdHIgPSBQcm9jZXNzVXRpbC5jaGVja1ByZWRlY2Vzc29yTGlzdChlbGVtZW50LAotCQkJCQkJcHJlZElETGlzdCwgYWRhcHRlckZhY3RvcnksIHByb2Nlc3MsIHByZWRlY2Vzc29ycyk7Ci0JCQkJaWYgKHN0ciAhPSBudWxsKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JEaWFsb2dUaXRsZSwgc3RyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcmVkSWRUZXh0LnNldFRleHQobmV3IEludGVnZXIocHJlZE1hcC5nZXRJZCgpKS50b1N0cmluZygpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlwcmVzZW50YXRpb25OYW1lLnNldFRleHQoZ2V0TmFtZShuZXdJZCkpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEdldCBwcmVzZW50YXRpb24gbmFtZS9uYW1lIGZvciB0aGlzIHByZWRlY2Vzc29yIGlkCi0JICogCi0JICogQHBhcmFtIG5ld0lkCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldE5hbWUoaW50IG5ld0lkKSB7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGFkYXB0ZXJGYWN0b3J5LAotCQkJCXByb2Nlc3MpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQob2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJSW50ZWdlciBpZCA9IG5ldyBJbnRlZ2VyKGl0ZW1Qcm92aWRlci5nZXRJZCgpKTsKLQkJCW9iaiA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0KLQkJCWlmIChuZXdJZCA9PSBpZC5pbnRWYWx1ZSgpKSB7Ci0JCQkJbmFtZSA9ICgoQnJlYWtkb3duRWxlbWVudCkgb2JqKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJaWYgKFN0clV0aWwuaXNCbGFuayhuYW1lKSkgewotCQkJCQluYW1lID0gKChCcmVha2Rvd25FbGVtZW50KSBvYmopLmdldE5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIHdoZXRoZXIgcHJlZGVjZXNzb3IgSWQgYWxyZWFkeSBleGlzdHMKLQkgKiAKLQkgKiBAcGFyYW0gbmV3SWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGFscmVhZHlFeGlzdHMoaW50IG5ld0lkKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHByZWRNYXBMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJUHJlZGVjZXNzb3JNYXAgbWFwID0gKFByZWRlY2Vzc29yTWFwKSBpdG9yLm5leHQoKTsKLQkJCWlmICgobWFwLmdldElkKCkgPT0gbmV3SWQpICYmIChwcmVkTWFwLmdldElkKCkgIT0gbmV3SWQpKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yRGlhbG9nVGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yTWVzc2FnZSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgY29tbWFuZCBzZXBhcmF0ZWQgbGlzdCBvZiBhbGwgcHJlZGVjZXNzb3IKLQkgKiAKLQkgKiBAcGFyYW0gbmV3SWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZElkKGludCBuZXdJZCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHByZWRNYXBMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJUHJlZGVjZXNzb3JNYXAgbWFwID0gKFByZWRlY2Vzc29yTWFwKSBpdG9yLm5leHQoKTsKLQkJCWlmIChwcmVkTWFwLmdldElkKCkgPT0gbWFwLmdldElkKCkpIHsKLQkJCQlidWYuYXBwZW5kKG5ld0lkKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnVmLmFwcGVuZChtYXAuZ2V0SWQoKSk7Ci0JCQl9Ci0KLQkJCWJ1Zi5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHBhcmVudCk7Ci0JCXBhcmVudAotCQkJCS5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJlZGVjZXNzb3JEaWFsb2dfVGl0bGUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNva1ByZXNzZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJLy8gbmV3IGlkCi0JCWludCBuZXdJZCA9IG5ldyBJbnRlZ2VyKHByZWRJZFRleHQuZ2V0VGV4dCgpKS5pbnRWYWx1ZSgpOwotCQkvLyBuZSBsaW5rIHR5cGUKLQkJV29ya09yZGVyVHlwZSB3b3JrT3JkZXJUeXBlID0gZ2V0V29ya09yZGVyVHlwZSgpOwotCi0JCWlmICgobmV3SWQgIT0gcHJlZE1hcC5nZXRJZCgpKQotCQkJCXx8ICghd29ya09yZGVyVHlwZS5lcXVhbHMocHJlZE1hcC5nZXRXb3JrT3JkZXIoKS5nZXRMaW5rVHlwZSgpKSkpIHsKLQkJCVN0cmluZyBwcmVkSURMaXN0ID0gZ2V0UHJlZElkKG5ld0lkKTsKLQkJCWlmIChwcmVkSURMaXN0ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlTdHJpbmcgc3RyID0gUHJvY2Vzc1V0aWwuY2hlY2tQcmVkZWNlc3Nvckxpc3QoZWxlbWVudCwgcHJlZElETGlzdCwKLQkJCQkJYWRhcHRlckZhY3RvcnksIHByb2Nlc3MsIHByZWRlY2Vzc29ycyk7Ci0JCQlpZiAoc3RyICE9IG51bGwpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JEaWFsb2dUaXRsZSwgc3RyKTsgLy8kTk9OLU5MUy0xJAotCQkJCXByZWRJZFRleHQuc2V0VGV4dChuZXcgSW50ZWdlcihwcmVkTWFwLmdldElkKCkpLnRvU3RyaW5nKCkpOwotCQkJfQotCi0JCQkvLyByZW1vdmUgaXQKLQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSwKLQkJCQkJcHJlZE1hcC5nZXRXb3JrT3JkZXIoKSwgLTEpOwotCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQljbG9zZSgpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCXByZWRNYXBMaXN0LnJlbW92ZShwcmVkTWFwKTsKLQotCQkJaW50IHNpemUgPSBwcmVkZWNlc3NvcnMuc2l6ZSgpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHByZWRlY2Vzc29ycwotCQkJCQkJLmdldChpKTsKLQotCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQlmaW5kX3ByZWQ6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50Ci0JCQkJCQkuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVdvcmtPcmRlciB3byA9IChXb3JrT3JkZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKHdvLmdldFByZWQoKSA9PSBlKSB7Ci0JCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQlicmVhayBmaW5kX3ByZWQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFmb3VuZCkgewotCQkJCQlXb3JrT3JkZXIgd28gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrT3JkZXIoKTsKLQkJCQkJd28uc2V0UHJlZChlKTsKLQkJCQkJd28uc2V0TGlua1R5cGUod29ya09yZGVyVHlwZSk7Ci0JCQkJCWJvb2xlYW4gc3RhdCA9IGFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSwKLQkJCQkJCQkJCXdvLCAtMSk7Ci0JCQkJCWlmICghc3RhdCkKLQkJCQkJCXJldHVybjsKLQotCQkJCQlwcmVkTWFwLnNldElkKG5ld0lkKTsKLQkJCQkJcHJlZE1hcC5zZXRXb3JrT3JkZXIod28pOwotCQkJCQlwcmVkTWFwTGlzdC5hZGQocHJlZE1hcCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHdvcmsgb3JkZXIgbGluayB0eXBlIGZyb20gVUkKLQkgKiAKLQkgKiBAcmV0dXJuIAotCSAqIAkJCVdvcmsgT3JkZXIgdHlwZQotCSAqLwotCXByaXZhdGUgV29ya09yZGVyVHlwZSBnZXRXb3JrT3JkZXJUeXBlKCkgewotCQlpbnQgaW5kZXggPSBkZXBlbmRlbmN5LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCVdvcmtPcmRlclR5cGUgdHlwZTsKLQkJaWYgKGluZGV4ID09IDApIHsKLQkJCXR5cGUgPSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVF9MSVRFUkFMOwotCQl9IGVsc2UgaWYgKGluZGV4ID09IDEpIHsKLQkJCXR5cGUgPSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0hfTElURVJBTDsKLQkJfSBlbHNlIGlmIChpbmRleCA9PSAyKSB7Ci0JCQl0eXBlID0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19TVEFSVF9MSVRFUkFMOwotCQl9IGVsc2UgewotCQkJdHlwZSA9IFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fRklOSVNIX0xJVEVSQUw7Ci0JCX0KLQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9QcmVkZWNlc3Nvck1hcC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUHJlZGVjZXNzb3JNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODVkNTAyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9QcmVkZWNlc3Nvck1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci0KLS8qKgotICogTWFwIG9mIHByZWRlY2Vzc29yIElEIGFuZCBjb3JyZXNwb25kaW5nIHdvcmsgb3JkZXIKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUHJlZGVjZXNzb3JNYXAgewotCXByaXZhdGUgaW50IGlkOwotCi0JcHJpdmF0ZSBXb3JrT3JkZXIgd287Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAJCVByZWRlY2Vzc29yIElECi0JICogQHBhcmFtIHdvCi0JICogCQlXb3JrT3JkZXIgb2JqZWN0Ci0JICovCi0JcHVibGljIFByZWRlY2Vzc29yTWFwKGludCBpZCwgV29ya09yZGVyIHdvKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy53byA9IHdvOwotCX0KLQotCS8qKgotCSAqIEdldCBwcmVkZWNlc3NvciBJRAotCSAqIEByZXR1cm4KLQkgKiAJCQlQcmVkZWNlc3NvciBJRAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SWQoKSB7Ci0JCXJldHVybiB0aGlzLmlkOwotCX0KLQotCS8qKgotCSAqIFNldCBQcmVkZWNlc3NvciBJRAotCSAqIEBwYXJhbSBpZAotCSAqIAkJCVByZWRlY2Vzc29yIElECi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoaW50IGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHdvcmsgb3JkZXIKLQkgKiBAcmV0dXJuCi0JICogCQlXb3JrIE9yZGVyCi0JICovCi0JcHVibGljIFdvcmtPcmRlciBnZXRXb3JrT3JkZXIoKSB7Ci0JCXJldHVybiB0aGlzLndvOwotCX0KLQotCS8qKgotCSAqIFNldCBXb3JrIE9yZGVyCi0JICogQHBhcmFtIHdvCi0JICogCQkJV29yayBPcmRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtPcmRlcihXb3JrT3JkZXIgd28pIHsKLQkJdGhpcy53byA9IHdvOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNSZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDMzOWI1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Qcm9wZXJ0aWVzUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0vKioKLSAqIFByb3BlcnRpZXMgcmVzb3VyY2VzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9wZXJ0aWVzUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKQotCQkJCQkJCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgUHJvcGVydGllc1Jlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0RvY3VtZW50SW5mb3JtYXRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9ndWlkYW5jZUluZm9ybWF0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9vcHRpb25JbmZvcm1hdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdG9yX2RldGFpbEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlsZXN0b25lX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pbGVzdG9uZV9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyZWFrZG93bkVsZW1lbnRfRG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdG9yX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX05vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfUHJlc2VudGF0aW9uTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX2JyaWVmRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19tYWluRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19wdXJwb3NlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfcHJlZml4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyZWFrZG93bkVsZW1lbnRfVHlwZV9OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfVHlwZV9UYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfVHlwZV9Sb2xlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfVHlwZV9Xb3JrUHJvZHVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdF9UeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X01vZGVsSW5mbzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9UeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X3ByZXNlbnRhdGlvbk5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfYWx0ZXJuYXRpdmVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X2hvd1RvU3RhZmY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9rZXlDb25zaWRlcmF0aW9uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX3VzYWdlR3VpZGFuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfUm9hZG1hcFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1JvYWRtYXBEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9HZW5lcmFsR3VpZGFuY2VUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9HZW5lcmFsR3VpZGFuY2VEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfU2VsZWN0ZWRfUm9hZG1hcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9TZWxlY3RlZF9HZW5lcmFsR3VpZGFuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfU2VsZWN0ZWRfQ29tbXVuaWNhdGlvbk1hdGVyaWFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1NlbGVjdGVkX0VkdWNhdGlvbk1hdGVyaWFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0RpYWdyYW1UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9EaWFncmFtRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfQURJbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9BRERJbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9XUERJbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Vc2VBREltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1VzZUFEREltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1VzZVdQREltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0Fzc2lnbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Xb3JrUm9sbHVwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1RlYW1Sb2xsdXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1dvcmtSb2xsdXBEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9UZWFtUm9sbHVwRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9PcHRpb25fTXVsdGlwbGVPY3VycmFuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9PcHRpb25fT3B0aW9uYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9PcHRpb25fUGxhbm5lZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcmVha2Rvd25FbGVtZW50X09wdGlvbl9TdXByZXNzZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfRXZlbnREcml2ZW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfT25nb2luZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9SZXBlYXRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29yczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0lEX1RFWFQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfUFJFU0VOVEFUSU9OX05BTUVfVEVYVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9ERVBFTkRFTkNZX1RFWFQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9BZGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9FZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfUmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtPcmRlclR5cGVfRklOSVNIX1RPX1NUQVJUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtPcmRlclR5cGVfRklOSVNIX1RPX0ZJTklTSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrT3JkZXJUeXBlX1NUQVJUX1RPX0ZJTklTSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrT3JkZXJUeXBlX1NUQVJUX1RPX1NUQVJUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N5bmNocm9uaXplZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdG9yX1JlZmluZWREZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkX1N0ZXBzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19UYWJsZTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlc2NyaXB0b3JfVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9UZWFtX1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcG9zaXRlUm9sZV9Sb2xlX1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZWFtUHJvZmlsZV9Sb2xlX1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1JpY2hUZXh0X0NvbGxhcHNlSW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19SaWNoVGV4dF9FeHBhbmRJbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0FkZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0FkZEZyb21Qcm9jZXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfUmVuYW1lX01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19SZW1vdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19VcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0Rvd247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19NdWx0aXBsZVNlbGVjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0J1dHRvbl9MaW5rTWV0aG9kRWxlbWVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0ludmFsaWROYW1lVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19JbnZhbGlkTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1JlbmFtZV9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0ludmFsaWRQcmVzZW50YXRpb25OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0ludmFsaWRMaW5rTWV0aG9kRWxlbWVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0Fzc2lnbm1lbnRJbmZvVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19UZWFtQXNzaWduRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19UZWFtRGlhbG9nTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1RlYW1EaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0RlbGl2ZXJhYmxlQXNzaWduRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Db21wb3NpdGVSb2xlQXNzaWduRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Ob0l0ZW1zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfSXRlbXNTZWxlY3RlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX05vUHJvcGVydGllc0F2YWlsYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVkZWNlc3NvckRpYWxvZ19UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVkZWNlc3NvckRpYWxvZ19IZWFkZXJNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWRlY2Vzc29yRGlhbG9nX0luZGV4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWRlY2Vzc29yRGlhbG9nX1ByZXNlbnRhdGlvbk5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZGVjZXNzb3JEaWFsb2dfRGVwZW5kZW5jeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yRGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvck1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX3RleHRFZGl0Q2VsbF9wcm9ibGVtX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfY2VsbEVkaXRvcl9pbnZhbGlkUHJlZGNlc3Nvcl9wcm9ibGVtX21zZzsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFByb3BlcnRpZXNSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGtleSBhbmQgZm9ybWF0dGVkCi0JICogd2l0aCBhIGdpdmVuIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgQW4gb2JqZWN0LgotCSAqIEByZXR1cm4gQSBmb3JtYXR0ZWQgbG9jYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBrZXksIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiBOTFMuYmluZChrZXksIG5ldyBPYmplY3RbXSB7IGRhdGEgfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Qcm9wZXJ0aWVzVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YTBlNDUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBwcm9wZXJ0aWVzIAotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzVXRpbCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHR5cGUgb2YgdGhlIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuCi0JICogCQlUeXBlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBwcmVmaXggPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkJyZWFrZG93bkVsZW1lbnRfVHlwZV9OYW1lOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfQ0FQQUJJTElUWV9QQVRURVJOOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX0RFTElWRVJZX1BST0NFU1M7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX1BST0NFU1M7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUGhhc2UpIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9QSEFTRTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJdGVyYXRpb24pIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9JVEVSQVRJT047Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9BQ1RJVklUWTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX1RBU0tfREVTQ1JJUFRPUjsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX1JPTEVfREVTQ1JJUFRPUjsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUjsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9NSUxFU1RPTkU7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9URUFNX1BST0ZJTEU7Ci0JCX0KLQotCQlyZXR1cm4gcHJlZml4OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHlwZSBvZiB0aGUgb2JqZWN0IGluIGxvd2VyIGNhc2UKLQkgKiBAcGFyYW0gb2JqCi0JICogQHJldHVybgotCSAqIAkJVHlwZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVMb3dlcihPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyB0eXBlID0gZ2V0VHlwZShvYmopOwotCQkKLQkJcmV0dXJuIFN0clV0aWwudG9Mb3dlcih0eXBlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNWaWV3Q29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Qcm9wZXJ0aWVzVmlld0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjODY3NTA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNWaWV3Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLS8qKgotICogQ29uc3RhbnRzIGZvciBwcm9wZXJ0aWVzIHZpZXcKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnRpZXNWaWV3Q29uc3RhbnRzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfREVTQ1JJUFRPUiA9ICJSb2xlRGVzY3JpcHRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktQUk9EVUNUUyA9ICJXb3JrUHJvZHVjdHMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0RFU0NSSVBUT1IgPSAiVGFza0Rlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFUyA9ICJSb2xlcyI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVsYXRpb25TZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZWxhdGlvblNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzAyNmFmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZWxhdGlvblNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIHVzZWQgdG8gZGlzcGxheSByZWxhdGlvbnNoaXBzIGJldHdlZW4gZGVzY3JpcHRvcnMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUmVsYXRpb25TZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbnVsbDsKLQotCS8vIGVsZW1lbnQKLQlwcm90ZWN0ZWQgRGVzY3JpcHRvciBlbGVtZW50OwotCi0JLy8gYWN0aW9uIG1hbmFnZXIKLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9hZGRfMSwgY3RybF9hZGRfMiwgY3RybF9hZGRfMywgY3RybF9hZGRfNDsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfcmVtb3ZlXzEsIGN0cmxfcmVtb3ZlXzIsIGN0cmxfcmVtb3ZlXzMsIGN0cmxfcmVtb3ZlXzQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZF9wcm9jXzEsIGN0cmxfYWRkX3Byb2NfMiwgY3RybF9hZGRfcHJvY18zLAotCQkJY3RybF9hZGRfcHJvY180OzsKLQotCXByaXZhdGUgVGFibGUgY3RybF90YWJsZV8xLCBjdHJsX3RhYmxlXzIsIGN0cmxfdGFibGVfMywgY3RybF90YWJsZV80OwotCi0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyMSwgdGFibGVWaWV3ZXIyLCB0YWJsZVZpZXdlcjMsCi0JCQl0YWJsZVZpZXdlcjQ7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9icmllZl9kZXNjOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGFiU3RyaW5nOwotCQotCXByaXZhdGUgU3RyaW5nIHRpdGxlLCBkZXNjLCB0YWJsZTEsIHRhYmxlMiwgdGFibGUzLCB0YWJsZTQ7Ci0KLQlwcml2YXRlIGludCB0YWJsZUNvdW50OwotCi0JcHJpdmF0ZSBib29sZWFuW10gY2hhbmdlc0FsbG93ZWQ7Ci0KLQlQcm9jZXNzIHByb2Nlc3M7Ci0KLQlJRmlsdGVyIGRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyOwotCi0JcHJvdGVjdGVkIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyRm9yRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0b3JUYWJOYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCQlpbml0KCk7Ci0KLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIGNyZWF0ZSBzZWN0aW9uCi0JCWNyZWF0ZVNlY3Rpb24ocGFyZW50KTsKLQotCQkvLyBhZGQgbGlzdGVuZXJzCi0JCWFkZExpc3RlbmVycygpOwotCi0JCS8vIHVwZGF0ZSBjb250cm9scwotCQl1cGRhdGVDb250cm9scygpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFiRGF0YShTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjLCBTdHJpbmcgdGFibGUxLCBTdHJpbmcgdGFibGUyLCBTdHJpbmcgdGFibGUzLCBTdHJpbmcgdGFibGU0LCBTdHJpbmcgdGFiU3RyaW5nKSB7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQkJdGhpcy5kZXNjID0gZGVzYzsKLQkJdGhpcy50YWJsZTEgPSB0YWJsZTE7Ci0JCXRoaXMudGFibGUyID0gdGFibGUyOwotCQl0aGlzLnRhYmxlMyA9IHRhYmxlMzsKLQkJdGhpcy50YWJsZTQgPSB0YWJsZTQ7Ci0JCQotCQl0aGlzLnRhYlN0cmluZyA9IHRhYlN0cmluZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWJsZURhdGEoaW50IHRhYmxlQ291bnQsIGJvb2xlYW5bXSBjaGFuZ2VzQWxsb3dlZCkgewotCQl0aGlzLnRhYmxlQ291bnQgPSB0YWJsZUNvdW50OwotCQl0aGlzLmNoYW5nZXNBbGxvd2VkID0gY2hhbmdlc0FsbG93ZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJLy8gZ2V0IGRlc2NyaXB0b3Igb2JqZWN0Ci0JCWVsZW1lbnQgPSAoRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCi0JCS8vIGdldCB0b29sa2l0Ci0JCXRvb2xraXQgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0KLQkJLy8gZ2V0IGFjdGlvbiBtYW5hZ2VyCi0JCWFjdGlvbk1nciA9IEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCWVsZW1lbnQgPSAoRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCi0JCQkJaW5pdENvbnRlbnRQcm92aWRlcjEoKTsKLQkJCQlpbml0Q29udGVudFByb3ZpZGVyMigpOwotCQkJCWluaXRDb250ZW50UHJvdmlkZXIzKCk7Ci0JCQkJaW5pdENvbnRlbnRQcm92aWRlcjQoKTsKLQotCQkJCS8vIGhpZGUvc2hvdyBjb250cm9scyBiYXNlZCBvbiBlZGl0YWJsZQotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBkZXNjcmlwdG9yIHJlbGF0aW9uIHNlY3Rpb246ICIgKyBlbGVtZW50LCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBjb250cm9scyBiYXNlZCBvbiBlZGl0YWJsZSBib29sZWFuIHZhbHVlLiBDb250cm9scyBjb3VsZCBiZQotCSAqIGVkaXRhYmxlIG9yIHJlYWQtb25seSBhZnRlciB0aGlzLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVsZW1lbnQgIitlbGVtZW50LmdldE5hbWUoKSArCi0JCS8vICJFZGl0YWJsZS0iK2VkaXRhYmxlKTsKLQkJaWYgKGN0cmxfYWRkXzEgIT0gbnVsbCkKLQkJCWN0cmxfYWRkXzEuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX2FkZF8yICE9IG51bGwpCi0JCQljdHJsX2FkZF8yLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoY3RybF9hZGRfMyAhPSBudWxsKQotCQkJY3RybF9hZGRfMy5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKGN0cmxfYWRkXzQgIT0gbnVsbCkKLQkJCWN0cmxfYWRkXzQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0KLQkJaWYgKGN0cmxfYWRkX3Byb2NfMSAhPSBudWxsKQotCQkJY3RybF9hZGRfcHJvY18xLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoY3RybF9hZGRfcHJvY18yICE9IG51bGwpCi0JCQljdHJsX2FkZF9wcm9jXzIuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX2FkZF9wcm9jXzMgIT0gbnVsbCkKLQkJCWN0cmxfYWRkX3Byb2NfMy5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKGN0cmxfYWRkX3Byb2NfNCAhPSBudWxsKQotCQkJY3RybF9hZGRfcHJvY180LnNldEVuYWJsZWQoZWRpdGFibGUpOwotCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIxCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgZWRpdGFibGUpIHsKLQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotCQlpZiAodGFibGVWaWV3ZXIyICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIyLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQkJCWlmIChjdHJsX3JlbW92ZV8yICE9IG51bGwpCi0JCQkJY3RybF9yZW1vdmVfMi5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGN0cmxfcmVtb3ZlXzIgIT0gbnVsbCkKLQkJCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHRhYmxlVmlld2VyMyAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMy5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiBlZGl0YWJsZSkgewotCQkJCWN0cmxfcmVtb3ZlXzMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCWlmICh0YWJsZVZpZXdlcjQgIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgZWRpdGFibGUpIHsKLQkJCQljdHJsX3JlbW92ZV80LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIGFsbCBsYWJlbCBhbmQgY29udGVudCBwcm92aWRlcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJY29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgY29udGVudCBwcm92aWRlciBmb3IgdGhlIGZpcnN0IHRhYmxlIGluIHByb3BlcnRpZXMgdmlldwotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcjEoKSB7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgc2Vjb25kIHRhYmxlIGluIHByb3BlcnRpZXMgdmlldwotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcjIoKSB7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgdGhpcmQgdGFibGUgaW4gcHJvcGVydGllcyB2aWV3Ci0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMygpIHsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBmb3VydGggdGFibGUgaW4gcHJvcGVydGllcyB2aWV3Ci0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyNCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgbGlzdCBvZiBkZXNjcmlwdG9ycyBmcm9tIHRoZSBwcm9jZXNzCi0JICogQHJldHVybgotCSAqIAkJCUxpc3Qgb2YgZGVzY3JpcHRvcnMKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXREZXNjcmlwdG9yc0Zyb21Qcm9jZXNzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGZpbHRlciB3aGljaCBhbGxvd3MgZmlsdGVyaW5nIGVsZW1lbnQgYmFzZWQgb24gbWV0aG9kIGNvbmZpZ3VyYXRpb24gCi0JICogQHJldHVybgotCSAqIAkJRmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaW50IHRhYmxlSGVpZ2h0ID0gODA7Ci0KLQkJLy8gY3JlYXRlIHNlY3Rpb24KLQkJU2VjdGlvbiBhU2VjdGlvbiA9IEZvcm1VSS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQl0aXRsZSwgZGVzYyk7Ci0KLQkJLy8gY3JlYXRlIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgc2VjdGlvbkNvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgYVNlY3Rpb24sCi0JCQkJMiwgZmFsc2UpOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSAxCi0JCWludCBjb3VudCA9IDA7Ci0JCXsKLQkJCUNvbXBvc2l0ZSBwYW5lMSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMSwgdGFibGUxKTsKLQotCQkJY3RybF90YWJsZV8xID0gRm9ybVVJLmNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUxLCB0YWJsZUhlaWdodCk7Ci0JCQl0YWJsZVZpZXdlcjEgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF90YWJsZV8xKTsKLQkJCWluaXRDb250ZW50UHJvdmlkZXIxKCk7Ci0KLQkJCXRhYmxlVmlld2VyMS5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQkJdGFibGVWaWV3ZXIxLnNldElucHV0KGVsZW1lbnQpOwotCi0JCQkvLyBjcmVhdGUgYnV0dG9ucyBmb3IgdGFibGUxCi0JCQlDb21wb3NpdGUgcGFuZTIgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCi0JCQlpZiAoY2hhbmdlc0FsbG93ZWRbY291bnRdKSB7Ci0JCQkJY3RybF9hZGRfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsgCi0JCQkJY3RybF9hZGRfcHJvY18xID0gRm9ybVVJCi0JCQkJCQkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkRnJvbVByb2Nlc3MpOyAvLyROT04tTkxTLTEkCi0JCQkJY3RybF9yZW1vdmVfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsgCi0JCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQkJfQotCQljb3VudCsrOwotCi0JCS8vIGNyZWF0ZSB0YWJsZTIKLQkJaWYgKGNvdW50IDwgdGFibGVDb3VudCkgewotCQkJQ29tcG9zaXRlIHBhbmUzID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUzLCB0YWJsZTIpOwotCi0JCQljdHJsX3RhYmxlXzIgPSBGb3JtVUkuY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTMsIHRhYmxlSGVpZ2h0KTsKLQkJCXRhYmxlVmlld2VyMiA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3RhYmxlXzIpOwotCQkJaW5pdENvbnRlbnRQcm92aWRlcjIoKTsKLQotCQkJdGFibGVWaWV3ZXIyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQl0YWJsZVZpZXdlcjIuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTIKLQkJCUNvbXBvc2l0ZSBwYW5lNCA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0JCQlpZiAoY2hhbmdlc0FsbG93ZWRbY291bnRdKSB7Ci0JCQkJY3RybF9hZGRfMiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTQsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsgCi0JCQkJY3RybF9hZGRfcHJvY18yID0gRm9ybVVJCi0JCQkJCQkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU0LCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkRnJvbVByb2Nlc3MpOyAvLyROT04tTkxTLTEkCi0JCQkJY3RybF9yZW1vdmVfMiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTQsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsgCi0JCQkJY3RybF9yZW1vdmVfMi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUzKTsKLQkJfQotCi0JCWNvdW50Kys7Ci0KLQkJLy8gQ3JlYXRlIHRhYmxlMwotCQlpZiAoY291bnQgPCB0YWJsZUNvdW50KSB7Ci0JCQlDb21wb3NpdGUgcGFuZTUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTUsIHRhYmxlMyk7Ci0KLQkJCWN0cmxfdGFibGVfMyA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lNSwgdGFibGVIZWlnaHQpOwotCQkJdGFibGVWaWV3ZXIzID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdGFibGVfMyk7Ci0JCQlpbml0Q29udGVudFByb3ZpZGVyMygpOwotCi0JCQl0YWJsZVZpZXdlcjMuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJCXRhYmxlVmlld2VyMy5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkJLy8gY3JlYXRlIGJ1dHRvbnMgZm9yIHRhYmxlMgotCQkJQ29tcG9zaXRlIHBhbmU2ID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWlmICgobmV3IEJvb2xlYW4oY2hhbmdlc0FsbG93ZWRbY291bnRdKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQljdHJsX2FkZF8zID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lNiwKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOyAKLQkJCQljdHJsX2FkZF9wcm9jXzMgPSBGb3JtVUkKLQkJCQkJCS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTYsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGRGcm9tUHJvY2Vzcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQljdHJsX3JlbW92ZV8zID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lNiwKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW1vdmUpOyAKLQkJCQljdHJsX3JlbW92ZV8zLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTUpOwotCQl9Ci0JCWNvdW50Kys7Ci0KLQkJaWYgKGNvdW50IDwgdGFibGVDb3VudCkgewotCQkJQ29tcG9zaXRlIHBhbmU3ID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmU3LCB0YWJsZTQpOwotCi0JCQljdHJsX3RhYmxlXzQgPSBGb3JtVUkuY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTcsIHRhYmxlSGVpZ2h0KTsKLQkJCXRhYmxlVmlld2VyNCA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3RhYmxlXzQpOwotCQkJaW5pdENvbnRlbnRQcm92aWRlcjQoKTsKLQotCQkJdGFibGVWaWV3ZXI0LnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQl0YWJsZVZpZXdlcjQuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTQKLQkJCUNvbXBvc2l0ZSBwYW5lOCA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0JCQlpZiAoKG5ldyBCb29sZWFuKGNoYW5nZXNBbGxvd2VkW2NvdW50XSkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJY3RybF9hZGRfNCA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTgsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsgCi0JCQkJY3RybF9hZGRfcHJvY180ID0gRm9ybVVJCi0JCQkJCQkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU4LCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkRnJvbVByb2Nlc3MpOyAvLyROT04tTkxTLTEkCi0JCQkJY3RybF9yZW1vdmVfNCA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTgsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsgCi0JCQkJY3RybF9yZW1vdmVfNC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmU4KTsKLQotCQl9Ci0KLQkJLy8gY3JlYXRlIGJyaWVmIGRlc2NyaXB0aW9uCi0JCWludCBoZWlnaHRIaW50ID0gNDA7Ci0JCS8vIGludCBob3Jpem9udGFsU3BhbiA9IDI7Ci0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfYnJpZWZEZXNjcmlwdGlvbiwgaGVpZ2h0SGludCk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9icmllZl9kZXNjID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQloZWlnaHRIaW50LCBoZWlnaHRIaW50KTsKLQkJY3RybF9icmllZl9kZXNjLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihzZWN0aW9uQ29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGRMaXN0ZXJlcnMKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCS8qKgotCQkgKiBGaXJzdCBzZXQgb2YgbGlzdGVuZXJzCi0JCSAqLwotCQlpbnQgY291bnQgPSAwOwotCQlpZiAoY291bnQgPCB0YWJsZUNvdW50KSB7Ci0JCQljdHJsX3RhYmxlXzEuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMQotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXRhYmxlVmlld2VyMQotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMQotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYgZWRpdGFibGUpCi0JCQkJCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQkJCVN0cmluZyBkZXNjID0gKChNZXRob2RFbGVtZW50KSBzZWxlY3Rpb24KLQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpCi0JCQkJCQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCQkJZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoZGVzYyk7Ci0JCQkJCQkJfSBlbHNlIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJCQkJCQljdHJsX2JyaWVmX2Rlc2MKLQkJCQkJCQkJCQkuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb24gKyAiIC0gIiArIHNlbGVjdGlvbi5zaXplKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQlpZiAoY2hhbmdlc0FsbG93ZWRbY291bnRdKSB7Ci0JCQkJY3RybF9hZGRfMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRGaWx0ZXIoKTsKLQkJCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoZ2V0RXhpc3RpbmdFbGVtZW50czEoKSk7Ci0KLQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIGVsZW1lbnQsIHRhYlN0cmluZywKLQkJCQkJCQkJZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJZmQuc2V0VGl0bGUodGFiU3RyaW5nKTsKLQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCWFkZEl0ZW1zMShmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJdGFibGVWaWV3ZXIxLnJlZnJlc2goKTsKLQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX2FkZF9wcm9jXzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyID0gZ2V0RmlsdGVyRm9yRGVzY3JpcHRvcnMoKTsKLQkJCQkJCXByb2Nlc3MgPSBnZXRQcm9jZXNzKCk7Ci0JCQkJCQlpZiAoZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIgIT0gbnVsbCAmJiBwcm9jZXNzICE9IG51bGwpIHsKLQkJCQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBnZXRFeGlzdGluZ0VsZW1lbnRzMSgpOwotCQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKAotCQkJCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJLmdldFNoZWxsKCksCi0JCQkJCQkJCQlkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciwgcHJvY2VzcywKLQkJCQkJCQkJCWdldERlc2NyaXB0b3JUYWJOYW1lKCksIGV4aXN0aW5nRWxlbWVudHMpOwotCi0JCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQkJZmQub3BlbigpOwotCQkJCQkJCWFkZEZyb21Qcm9jZXNzSXRlbXMxKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCQkJdGFibGVWaWV3ZXIxLnJlZnJlc2goKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX3JlbW92ZV8xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMQotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCQlyZW1vdmVJdGVtczEocm1JdGVtcyk7Ci0JCQkJCQkJdGFibGVWaWV3ZXIxLnJlZnJlc2goKTsKLQotCQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCQl0YWJsZVZpZXdlcjEuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JCWNvdW50Kys7Ci0KLQkJLyoqCi0JCSAqIFNlY29uZCBzZXQgb2YgbGlzdGVuZXJzCi0JCSAqLwotCQlpZiAoY291bnQgPCB0YWJsZUNvdW50KSB7Ci0JCQljdHJsX3RhYmxlXzIuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMgotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpIHsKLQkJCQkJCWlmIChjdHJsX3JlbW92ZV8yICE9IG51bGwpCi0JCQkJCQkJY3RybF9yZW1vdmVfMi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXRhYmxlVmlld2VyMgotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMgotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKSB7Ci0JCQkJCQkJCWlmIChjdHJsX3JlbW92ZV8yICE9IG51bGwpCi0JCQkJCQkJCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCQkJU3RyaW5nIGRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGlvbgotCQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSkKLQkJCQkJCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCQlkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChkZXNjKTsKLQkJCQkJCQl9IGVsc2UgaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJCQkJCWN0cmxfYnJpZWZfZGVzYwotCQkJCQkJCQkJCS5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19NdWx0aXBsZVNlbGVjdGlvbiArICIgLSAiICsgc2VsZWN0aW9uLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCWlmIChjaGFuZ2VzQWxsb3dlZFtjb3VudF0pIHsKLQkJCQljdHJsX2FkZF8yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJRmlsdGVyIGZpbHRlciA9IGdldEZpbHRlcigpOwotCQkJCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50TGlzdChnZXRFeGlzdGluZ0VsZW1lbnRzMigpKTsKLQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIGVsZW1lbnQsIHRhYlN0cmluZywKLQkJCQkJCQkJZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJZmQuc2V0VGl0bGUodGFiU3RyaW5nKTsKLQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCWFkZEl0ZW1zMihmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJdGFibGVWaWV3ZXIyLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJY3RybF9hZGRfcHJvY18yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciA9IGdldEZpbHRlckZvckRlc2NyaXB0b3JzKCk7Ci0JCQkJCQlwcm9jZXNzID0gZ2V0UHJvY2VzcygpOwotCQkJCQkJaWYgKGRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyICE9IG51bGwgJiYgcHJvY2VzcyAhPSBudWxsKSB7Ci0JCQkJCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gZ2V0RXhpc3RpbmdFbGVtZW50czIoKTsKLQkJCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZygKLQkJCQkJCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCQkJCS5nZXRTaGVsbCgpLAotCQkJCQkJCQkJZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIsIHByb2Nlc3MsCi0JCQkJCQkJCQlnZXREZXNjcmlwdG9yVGFiTmFtZSgpLCBleGlzdGluZ0VsZW1lbnRzKTsKLQotCQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCQlhZGRGcm9tUHJvY2Vzc0l0ZW1zMihmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJCXRhYmxlVmlld2VyMi5yZWZyZXNoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfcmVtb3ZlXzIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIyCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJCXJlbW92ZUl0ZW1zMihybUl0ZW1zKTsKLQkJCQkJCQl0YWJsZVZpZXdlcjIucmVmcmVzaCgpOwotCi0JCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJCXRhYmxlVmlld2VyMi5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQkJY291bnQrKzsKLQotCQkvKioKLQkJICogVGhpcmQgc2V0IG9mIGxpc3RlbmVycwotCQkgKi8KLQkJaWYgKGNvdW50IDwgdGFibGVDb3VudCkgewotCQkJY3RybF90YWJsZV8zLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjMKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0pOwotCi0JCQl0YWJsZVZpZXdlcjMKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjMKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCQkJU3RyaW5nIGRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGlvbgotCQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSkKLQkJCQkJCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCQlkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChkZXNjKTsKLQkJCQkJCQl9IGVsc2UgaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJCQkJCWN0cmxfYnJpZWZfZGVzYwotCQkJCQkJCQkJCS5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19NdWx0aXBsZVNlbGVjdGlvbiArICIgLSAiICsgc2VsZWN0aW9uLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCWlmICgobmV3IEJvb2xlYW4oY2hhbmdlc0FsbG93ZWRbY291bnRdKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQljdHJsX2FkZF8zLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJRmlsdGVyIGZpbHRlciA9IGdldEZpbHRlcigpOwotCQkJCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50TGlzdChnZXRFeGlzdGluZ0VsZW1lbnRzMygpKTsKLQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIGVsZW1lbnQsIHRhYlN0cmluZywKLQkJCQkJCQkJZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJZmQuc2V0VGl0bGUodGFiU3RyaW5nKTsKLQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCWFkZEl0ZW1zMyhmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJdGFibGVWaWV3ZXIzLnJlZnJlc2goKTsKLQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX2FkZF9wcm9jXzMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyID0gZ2V0RmlsdGVyRm9yRGVzY3JpcHRvcnMoKTsKLQkJCQkJCXByb2Nlc3MgPSBnZXRQcm9jZXNzKCk7Ci0JCQkJCQlpZiAoZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIgIT0gbnVsbCAmJiBwcm9jZXNzICE9IG51bGwpIHsKLQkJCQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBnZXRFeGlzdGluZ0VsZW1lbnRzMygpOwotCQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKAotCQkJCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJLmdldFNoZWxsKCksCi0JCQkJCQkJCQlkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciwgcHJvY2VzcywKLQkJCQkJCQkJCWdldERlc2NyaXB0b3JUYWJOYW1lKCksIGV4aXN0aW5nRWxlbWVudHMpOwotCi0JCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQkJZmQub3BlbigpOwotCQkJCQkJCWFkZEZyb21Qcm9jZXNzSXRlbXMzKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCQkJdGFibGVWaWV3ZXIzLnJlZnJlc2goKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX3JlbW92ZV8zLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMwotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCQlyZW1vdmVJdGVtczMocm1JdGVtcyk7Ci0JCQkJCQkJdGFibGVWaWV3ZXIzLnJlZnJlc2goKTsKLQotCQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCQl0YWJsZVZpZXdlcjMuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JCWNvdW50Kys7Ci0KLQkJLyoqCi0JCSAqIEZvdXRoIHNldCBvZiBsaXN0ZW5lcnMKLQkJICovCi0JCWlmIChjb3VudCA8IHRhYmxlQ291bnQpIHsKLQkJCWN0cmxfdGFibGVfNC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXI0Ci0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJdGFibGVWaWV3ZXI0Ci0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXI0Ci0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQkJCVN0cmluZyBkZXNjID0gKChNZXRob2RFbGVtZW50KSBzZWxlY3Rpb24KLQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpCi0JCQkJCQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCQkJZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoZGVzYyk7Ci0JCQkJCQkJfSBlbHNlIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJCQkJCQljdHJsX2JyaWVmX2Rlc2MKLQkJCQkJCQkJCQkuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb24gKyAiIC0gIiArIHNlbGVjdGlvbi5zaXplKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQlpZiAoKG5ldyBCb29sZWFuKGNoYW5nZXNBbGxvd2VkW2NvdW50XSkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJY3RybF9hZGRfNC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRGaWx0ZXIoKTsKLQkJCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoZ2V0RXhpc3RpbmdFbGVtZW50czQoKSk7Ci0JCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBlbGVtZW50LCB0YWJTdHJpbmcsCi0JCQkJCQkJCWV4aXN0aW5nRWxlbWVudHMpOwotCi0JCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCWZkLnNldFRpdGxlKHRhYlN0cmluZyk7Ci0JCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQlhZGRJdGVtczQoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJCXRhYmxlVmlld2VyNC5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfYWRkX3Byb2NfNC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIgPSBnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpOwotCQkJCQkJcHJvY2VzcyA9IGdldFByb2Nlc3MoKTsKLQkJCQkJCWlmIChkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciAhPSBudWxsICYmIHByb2Nlc3MgIT0gbnVsbCkgewotCQkJCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IGdldEV4aXN0aW5nRWxlbWVudHM0KCk7Ci0JCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coCi0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0U2hlbGwoKSwKLQkJCQkJCQkJCWRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyLCBwcm9jZXNzLAotCQkJCQkJCQkJZ2V0RGVzY3JpcHRvclRhYk5hbWUoKSwgZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQkJYWRkRnJvbVByb2Nlc3NJdGVtczQoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJCQl0YWJsZVZpZXdlcjQucmVmcmVzaCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX3JlbW92ZV80LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyNAotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCQlyZW1vdmVJdGVtczQocm1JdGVtcyk7Ci0JCQkJCQkJdGFibGVWaWV3ZXI0LnJlZnJlc2goKTsKLQotCQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCQl0YWJsZVZpZXdlcjQuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJY3RybF9yZW1vdmVfNC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMxKExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtczIoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zMyhMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXM0KExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zMShMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczIoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMzKExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zNChMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXMxKExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczIoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMyhMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXM0KExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzMSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfTsKLQotCXByb3RlY3RlZCBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9OwotCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czMoKSB7Ci0JCXJldHVybiBudWxsOwotCX07Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzNCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JlbW92ZURlc2NyaXB0b3JDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZW1vdmVEZXNjcmlwdG9yQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTUxZjA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JlbW92ZURlc2NyaXB0b3JDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuRGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuUmVmZXJlbmNlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLlByb2Nlc3NEZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIENvbW1hbmQgdG8gcmVtb3ZlIGRlc2NyaXB0b3JzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIExpc3QgZWxlbWVudHM7Ci0KLQlwcml2YXRlIERlc2NyaXB0b3IgZGVzYzsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgQ29tbWFuZCBkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgPSBudWxsOwotCi0JcHJpdmF0ZSBpbnQgZmVhdHVyZUlEOwotCi0JcHJpdmF0ZSBMaXN0IHJlZmVyZW5jZXM7Ci0KLQkvKioKLQkgKiBSZW1vdmUgcmVsYXRpb25zaGlwcwotCSAqLwotCXB1YmxpYyBSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZChEZXNjcmlwdG9yIGRlc2MsIExpc3QgZWxlbWVudHMsIGludCBmZWF0dXJlSUQpIHsKLQotCQlzdXBlcigpOwotCi0JCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLQkJdGhpcy5kZXNjID0gZGVzYzsKLQkJdGhpcy5mZWF0dXJlSUQgPSBmZWF0dXJlSUQ7Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkKLQkJTGlzdCBub3RVc2VkUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJRGVzY3JpcHRvciBvID0gKERlc2NyaXB0b3IpIGVsZW1lbnRzLmdldChpKTsKLQotCQkJYm9vbGVhbiBjaGVja1JlZjsKLQkJCWlmIChvIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKQotCQkJewotCQkJCWNoZWNrUmVmID0gUHJvY2Vzc1V0aWwuY2hlY2tXb3JrUHJvZHVjdERlc2NyaXB0b3JSZWZlcmVuY2VzKENvbGxlY3Rpb25zCi0JCQkJLnNpbmdsZXRvbihkZXNjKSwgKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgbywgdHJ1ZSwgZmVhdHVyZUlEKTsKLQkJCX0KLQkJCWVsc2UKLQkJCQljaGVja1JlZiA9IFByb2Nlc3NVdGlsLmNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoZGVzYywgbyk7Ci0JCQkKLQkJCWlmICghY2hlY2tSZWYpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KGRlc2MpOwotCQkJCWlmIChhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhvKSkKLQkJCQkJbm90VXNlZFJlZmVyZW5jZXMuYWRkKG8pOwotCQkJfQotCQl9Ci0JCWlmICghKG5vdFVzZWRSZWZlcmVuY2VzLmlzRW1wdHkoKSkpIHsKLQkJCU9iamVjdFtdIHJlZlRvQmVEZWxldGVkID0gUmVmZXJlbmNlU2VsZWN0aW9uCi0JCQkJCS5nZXRSZWZlcmVuY2VzKG5vdFVzZWRSZWZlcmVuY2VzKTsKLQkJCXJlZmVyZW5jZXMgPSBBcnJheXMuYXNMaXN0KHJlZlRvQmVEZWxldGVkKTsKLQkJfQotCQkKLQkJcmVkbygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQlpZiAoZGVzYyBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKQotCQl7Ci0JCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5zZXRQZXJmb3JtZWRQcmltYXJpbHlCeShudWxsKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5yZW1vdmVBbGwoCi0JCQkJCQllbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWToKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRBc3Npc3RlZEJ5KCkucmVtb3ZlQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRNYW5kYXRvcnlJbnB1dCgpLnJlbW92ZUFsbChlbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRFeHRlcm5hbElucHV0KCkucmVtb3ZlQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldE9wdGlvbmFsSW5wdXQoKS5yZW1vdmVBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldE91dHB1dCgpLnJlbW92ZUFsbChlbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZGVzYyBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKQotCQl7Ci0JCQlzd2l0Y2ggKGZlYXR1cmVJRCl7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJKChSb2xlRGVzY3JpcHRvcikgZGVzYykuZ2V0UmVzcG9uc2libGVGb3IoKS5yZW1vdmVBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJlZmVyZW5jZXMgIT0gbnVsbCAmJiAhcmVmZXJlbmNlcy5pc0VtcHR5KCkpIHsKLQkJCWlmIChkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgPT0gbnVsbCkgewotCQkJCWRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCA9IG5ldyBEZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQoCi0JCQkJCQlyZWZlcmVuY2VzLCBmYWxzZSwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCkgewotCi0JCQkJCXByb3RlY3RlZCBDb21tYW5kIGRlbGV0ZShMaXN0IGVsZW1lbnRzKSB7Ci0JCQkJCQlyZXR1cm4gUHJvY2Vzc0RlbGV0ZUFjdGlvbi5kZWxldGUoZWxlbWVudHMpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJCWRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQotCQlpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJCi0JCQlpZiAoZGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGRlc2MuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQkJLy8gYmFzaWNhbGx5IHJlbW92ZSBmcm9tIGNvbmZpZ3VyYXRpb24gaWYgYW55dGhpbmcgd2FzIGFkZGVkCi0KLQkJaWYgKGRlc2MgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikKLQkJewotCQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0JCQkJT2JqZWN0IG8gPSBlbGVtZW50cy5nZXQoMCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikKLQkJCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKFJvbGVEZXNjcmlwdG9yKW8pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmFkZEFsbCgKLQkJCQkJCWVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldEFzc2lzdGVkQnkoKS5hZGRBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldEV4dGVybmFsSW5wdXQoKS5hZGRBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQ6Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0T3B0aW9uYWxJbnB1dCgpLmFkZEFsbChlbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0T3V0cHV0KCkuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChkZXNjIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpCi0JCXsKLQkJCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJKChSb2xlRGVzY3JpcHRvcikgZGVzYykuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGRBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJlZmVyZW5jZXMgIT0gbnVsbCAmJiAhcmVmZXJlbmNlcy5pc0VtcHR5KCkpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCAhPSBudWxsKQotCQkJCQlkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQudW5kbygpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQotCQkJfQotCQl9Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JewotCQlpZiAoZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kICE9IG51bGwpCi0JCQlkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuZGlzcG9zZSgpOwotCQlpZihyZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCXJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJfQotCQlpZihtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5jbGVhcigpOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3ByZXBhcmUoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM4N2Y2NjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uVGl0bGU9R2VuZXJhbCBJbmZvcm1hdGlvbgotUHJvY2Vzc19Eb2N1bWVudEluZm9ybWF0aW9uVGl0bGU9RG9jdW1lbnRhdGlvbiBJbmZvcm1hdGlvbgotQWN0aXZpdHlfZ3VpZGFuY2VJbmZvcm1hdGlvblRpdGxlPUd1aWRhbmNlCi1CcmVha2Rvd25FbGVtZW50X29wdGlvbkluZm9ybWF0aW9uVGl0bGU9QnJlYWtkb3duIE9wdGlvbnMKLVRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvblRpdGxlPVN0ZXBzCi0KLVRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVNwZWNpZnkgdGhlIHN0ZXBzIHRvIHBlcmZvcm0gdGhpcyB0YXNrIGRlc2NyaXB0b3IuCi0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgezB9LgotUHJvY2Vzc19kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBkb2N1bWVudGF0aW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgezB9LgotCi1EZXNjcmlwdG9yX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRlc2NyaXB0b3IuCi1EZXNjcmlwdG9yX2RldGFpbEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRlc2NyaXB0b3IuCi1NaWxlc3RvbmVfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbWlsZXN0b25lLgotTWlsZXN0b25lX2RldGFpbEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG1pbGVzdG9uZS4KLQotQnJlYWtkb3duRWxlbWVudF9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBicmVha2Rvd24gZWxlbWVudC4KLVdvcmtCcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQuCi1EZXNjcmlwdG9yX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0b249UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGVzY3JpcHRvci4KLUFjdGl2aXR5X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFjdGl2aXR5LgotCi1CcmVha2Rvd25FbGVtZW50X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGRvY3VtZW50YXRpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBicmVha2Rvd24gZWxlbWVudC4KLUFjdGl2aXR5X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGRvY3VtZW50YXRpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhY3Rpdml0eS4KLURlc2NyaXB0b3JfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZG9jdW1lbnRhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRlc2NyaXB0b3IuCi1Qcm9jZXNzX05vbmU9PDwgTk9ORSA+PgotUHJvY2Vzc19uYW1lPU5hbWU6Ci1Qcm9jZXNzX1ByZXNlbnRhdGlvbk5hbWU9UHJlc2VudGF0aW9uIG5hbWU6Ci1Qcm9jZXNzX2JyaWVmRGVzY3JpcHRpb249QnJpZWYgZGVzY3JpcHRpb246Ci1Qcm9jZXNzX21haW5EZXNjcmlwdGlvbj0gTWFpbiBkZXNjcmlwdGlvbjoKLVByb2Nlc3NfcHVycG9zZT1QdXJwb3NlOgotUHJvY2Vzc19wcmVmaXg9UHJlZml4OgotCi1CcmVha2Rvd25FbGVtZW50X1R5cGVfTmFtZT1CcmVha2Rvd24gRWxlbWVudAotCi1Qcm9jZXNzX1R5cGVfVGFzaz1NZXRob2QgdGFzazoKLVByb2Nlc3NfVHlwZV9Sb2xlPU1ldGhvZCByb2xlOgotUHJvY2Vzc19UeXBlX1dvcmtQcm9kdWN0PU1ldGhvZCB3b3JrIHByb2R1Y3Q6Ci0KLVdvcmtQcm9kdWN0X1R5cGU9V29yayBQcm9kdWN0IFR5cGU6Ci0KLUFjdGl2aXR5X01vZGVsSW5mbz1Nb2RlbCBpbmZvcm1hdGlvbjoKLUFjdGl2aXR5X1R5cGU9QWN0aXZpdHkgVHlwZToKLUFjdGl2aXR5X3ByZXNlbnRhdGlvbk5hbWU9UHJlc2VudGF0aW9uIG5hbWU6Ci1BY3Rpdml0eV9hbHRlcm5hdGl2ZXM9QWx0ZXJuYXRpdmVzOgotQWN0aXZpdHlfaG93VG9TdGFmZj1Ib3cgdG8gc3RhZmY6Ci1CcmVha2Rvd25FbGVtZW50X2tleUNvbnNpZGVyYXRpb25zPUtleSBjb25zaWRlcmF0aW9uczoKLVByb2Nlc3NfdXNhZ2VHdWlkYW5jZT1Vc2FnZSBndWlkYW5jZToKLQotQWN0aXZpdHlfUm9hZG1hcFRpdGxlPVJvYWRtYXBzCi1BY3Rpdml0eV9Sb2FkbWFwRGVzY3JpcHRpb249UHJvdmlkZSBsaW5rcyB0byBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZSBmb3JtIG9mIHJvYWRtYXBzLgotQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlVGl0bGU9R2VuZXJhbCBHdWlkYW5jZQotQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlRGVzY3JpcHRpb249UHJvdmlkZSBsaW5rcyB0byBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZSBmb3JtIG9mIGd1aWRhbmNlLgotQWN0aXZpdHlfQ29tbXVuaWNhdGlvbk1hdGVyaWFsVGl0bGU9Q29tbXVuaWNhdGlvbiBNYXRlcmlhbHMKLUFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uPVByb3ZpZGUgbGlua3MgdG8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybSBvZiBjb21tdW5pY2F0aW9uIG1hdGVyaWFscy4KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsVGl0bGU9RWR1Y2F0aW9uIE1hdGVyaWFscwotQWN0aXZpdHlfRWR1Y2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbj1Qcm92aWRlIGxpbmtzIHRvIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm0gb2YgZWR1Y2F0aW9uIG1hdGVyaWFscy4KLQotQWN0aXZpdHlfU2VsZWN0ZWRfUm9hZG1hcD1Sb2FkbWFwczoKLUFjdGl2aXR5X1NlbGVjdGVkX0dlbmVyYWxHdWlkYW5jZT1HdWlkYW5jZToKLUFjdGl2aXR5X1NlbGVjdGVkX0NvbW11bmljYXRpb25NYXRlcmlhbD1Db21tdW5pY2F0aW9uIE1hdGVyaWFsczoKLUFjdGl2aXR5X1NlbGVjdGVkX0VkdWNhdGlvbk1hdGVyaWFsPUVkdWNhdGlvbiBNYXRlcmlhbHM6Ci0KLUFjdGl2aXR5X0RpYWdyYW1UaXRsZT1EaWFncmFtCi1BY3Rpdml0eV9EaWFncmFtRGVzY3JpcHRpb24gPSBQcm92aWRlIGRpYWdyYW0gaW1hZ2VzIGZvciB0aGlzIHswfS4KLUFjdGl2aXR5X0FESW1hZ2U9QWN0aXZpdHkgRGlhZ3JhbQotQWN0aXZpdHlfQURESW1hZ2U9QWN0aXZpdHkgRGV0YWlsIERpYWdyYW0KLUFjdGl2aXR5X1dQREltYWdlPVdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0KLUFjdGl2aXR5X1VzZUFESW1hZ2U9VXNlIEFjdGl2aXR5IERpYWdyYW0gZm9yIHB1Ymxpc2hpbmcKLUFjdGl2aXR5X1VzZUFEREltYWdlPVVzZSBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBmb3IgcHVibGlzaGluZwotQWN0aXZpdHlfVXNlV1BESW1hZ2U9VXNlIFdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0gZm9yIHB1Ymxpc2hpbmcKLUFjdGl2aXR5X0Fzc2lnbj1Bc3NpZ24uLi4KLQotVGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRfU3RlcHM9U3RlcHM6Ci1UYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nVGl0bGU9U3RlcHMKLVRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dNZXNzYWdlPVNlbGVjdCBzdGVwcwotCi1BY3Rpdml0eV9Xb3JrUm9sbHVwPVdvcmsgUm9sbHVwCi1BY3Rpdml0eV9UZWFtUm9sbHVwPVRlYW0gUm9sbHVwCi1BY3Rpdml0eV9Xb3JrUHJvZHVjdHNSb2xsdXA9V29yayBQcm9kdWN0cyBSb2xsdXAKLUFjdGl2aXR5X1dvcmtSb2xsdXBEZXNjcmlwdGlvbj1SZXZpZXcgdGhlIHdvcmsgcm9sbC11cCBmb3IgdGhpcyBhY3Rpdml0eSBpbiB0aGlzIHNlY3Rpb24uCi1BY3Rpdml0eV9UZWFtUm9sbHVwRGVzY3JpcHRpb249UmV2aWV3IHRoZSB0ZWFtIHJvbGwtdXAgZm9yIHRoaXMgYWN0aXZpdHkgaW4gdGhpcyBzZWN0aW9uLgotQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwRGVzY3JpcHRpb249UmV2aWV3IHRoZSB3b3JrIHByb2R1Y3Qgcm9sbC11cCBmb3IgdGhpcyBhY3Rpdml0eSBpbiB0aGlzIHNlY3Rpb24uCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9NdWx0aXBsZU9jdXJyYW5jZT1NdWx0aXBsZSBPY2N1cnJlbmNlcwotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fT3B0aW9uYWw9T3B0aW9uYWwKLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1BsYW5uZWQ9UGxhbm5lZAotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3VwcmVzc2VkPVN1cHByZXNzZWQKLQotV29ya0JyZWFrZG93bkVsZW1lbnRfRXZlbnREcml2ZW49RXZlbnQgRHJpdmVuCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9PbmdvaW5nPU9uZ29pbmcKLVdvcmtCcmVha2Rvd25FbGVtZW50X1JlcGVhdGFibGU9UmVwZWF0YWJsZQotV29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3JzPVByZWRlY2Vzc29yczoKLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3k9RGVwZW5kZW5jeToKLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0lEX1RFWFQ9SW5kZXgKLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX1BSRVNFTlRBVElPTl9OQU1FX1RFWFQ9UHJlc2VudGF0aW9uIE5hbWUKLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0RFUEVOREVOQ1lfVEVYVD1EZXBlbmRlbmN5Ci1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0FkZD1BZGQKLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfRWRpdD1FZGl0Ci1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X1JlbW92ZT1SZW1vdmUKLQotV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fU1RBUlQ9RmluaXNoIFRvIFN0YXJ0Ci1Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19GSU5JU0g9RmluaXNoIFRvIEZpbmlzaAotV29ya09yZGVyVHlwZV9TVEFSVF9UT19GSU5JU0g9U3RhcnQgVG8gRmluaXNoCi1Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX1NUQVJUPVN0YXJ0IFRvIFN0YXJ0Ci0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N5bmNocm9uaXplZD1TeW5jaHJvbml6ZWQgd2l0aCBzb3VyY2UKLQotRGVzY3JpcHRvcl9SZWZpbmVkRGVzY3JpcHRpb249UmVmaW5lZCBkZXNjcmlwdGlvbjoKLQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvblRpdGxlPVJvbGVzCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uRGVzY3JpcHRpb249QXNzaWduIHRoZSByb2xlIGRlc2NyaXB0b3JzIHRvIHBlcmZvcm0gdGhpcyB0YXNrIGRlc2NyaXB0b3IuCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTE9UHJpbWFyeSBQZXJmb3JtZXI6Ci1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9QWRkaXRpb25hbCBQZXJmb3JtZXJzOgotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUzPUFzc2lzdGVkIEJ5OgotCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlPVdvcmsgUHJvZHVjdHMKLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249U3BlY2lmeSB0aGUgaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgZm9yIHRoaXMgdGFzayBkZXNjcmlwdG9yLgotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1NYW5kYXRvcnkgSW5wdXQ6Ci1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyPU9wdGlvbmFsIElucHV0OgotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMz1FeHRlcm5hbCBJbnB1dDoKLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTQ9T3V0cHV0OgotCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uVGl0bGU9VGFza3MKLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1NlY3Rpb25EZXNjcmlwdGlvbj1UaGlzIHJvbGUgZGVzY3JpcHRvciBpcyBwZXJmb3JtZXIgb2YgZm9sbG93aW5nIHRhc2sgZGVzY3JpcHRvcnMuCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTE9UHJpbWFyeSBQZXJmb3JtZXI6Ci1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTI9QWRkaXRpb25hbCBQZXJmb3JtZXJzOgotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUzPUFzc2lzdGVkIEJ5OgotCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlPVdvcmsgUHJvZHVjdHMKLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249VGhpcyByb2xlIGRlc2NyaXB0b3IgaXMgcmVzcG9uc2libGUgZm9yIGFuZCBtb2RpZmllcyBmb2xsb3dpbmcgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzLgotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1SZXNwb25zaWJsZSBmb3I6Ci1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyPU1vZGlmaWVzOgotCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvblRpdGxlPVJvbGVzCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPVRoZSBmb2xsb3dpbmcgcm9sZSBkZXNjcmlwdG9ycyBhcmUgcmVzcG9uc2libGUgZm9yIGFuZCBtb2RpZmllcyB0aGlzIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yLgotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMT1SZXNwb25zaWJsZSBmb3I6Ci1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfVGFibGUyPU1vZGlmaWVkIGJ5OgotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1R5cGU9VHlwZToKLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGU9QWN0aXZpdHkgRW50cnkgU3RhdGU6Ci1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGU9QWN0aXZpdHkgRXhpdCBTdGF0ZToKLQotV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9TZWN0aW9uVGl0bGU9RGVsaXZlcmFibGUgUGFydHMKLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvbkRlc2NyaXB0aW9uPVRoZSBkZWxpdmVyYWJsZSBoYXMgZm9sbG93aW5nIGRlbGl2ZXJhYmxlIHBhcnRzLgotV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9UYWJsZTE9RGVsaXZlcmFibGUgUGFydHMKLQotUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uVGl0bGU9VGVhbXMKLVJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvbkRlc2NyaXB0aW9uPVRoaXMgcm9sZSBkZXNjcmlwdG9yIHJlZmVycyB0byBmb2xsb3dpbmcgdGVhbXMuCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1RhYmxlMT1UZWFtczoKLQotQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25UaXRsZT1Sb2xlcwotQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbj1UaGlzIGNvbXBvc2l0ZSByb2xlIGhhcyBmb2xsb3dpbmcgYWdncmVnYXRlZCByb2xlcy4KLUNvbXBvc2l0ZVJvbGVfUm9sZV9UYWJsZTE9QWdncmVnYXRlZCBSb2xlczoKLQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uVGl0bGU9Um9sZXMKLVRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uPUFkZCBvciByZW1vdmUgcm9sZXMgdG8vZnJvbSB0aGUgdGVhbSBwcm9maWxlLgotVGVhbVByb2ZpbGVfUm9sZV9UYWJsZTE9Um9sZXM6Ci0KLVByb2Nlc3NfUmljaFRleHRfQ29sbGFwc2VJbWFnZT1jb2xsYXBzZWQuZ2lmCi1Qcm9jZXNzX1JpY2hUZXh0X0V4cGFuZEltYWdlPWV4cGFuZGVkLmdpZgotUHJvY2Vzc19BZGQ9QWRkLi4uCi1Qcm9jZXNzX0FkZEZyb21Qcm9jZXNzPUFkZCBmcm9tIFByb2Nlc3MuLi4KLVByb2Nlc3NfUmVuYW1lX01lc3NhZ2U9WW91IGFyZSBhYm91dCB0byBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBwcm9jZXNzLiBUaGlzIHdpbGwgc2F2ZSB0aGlzIGVkaXRvciBhbmQgcmVuYW1lIHRoZSBwcm9jZXNzIGZvbGRlciB0byB0aGUgbmV3IG5hbWUuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotUHJvY2Vzc19SZW1vdmU9UmVtb3ZlCi1Qcm9jZXNzX1VwPVVwCi1Qcm9jZXNzX0Rvd249RG93bgotUHJvY2Vzc19NdWx0aXBsZVNlbGVjdGlvbj1NdWx0aXBsZSBTZWxlY3Rpb24KLVByb2Nlc3NfQnV0dG9uX0xpbmtNZXRob2RFbGVtZW50PUxpbmsgTWV0aG9kIEVsZW1lbnQuLi4KLQotIyMgRXJyb3IvV2FybmluZwotUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlPUludmFsaWQgbmFtZQotUHJvY2Vzc19JbnZhbGlkTmFtZT1JVVBBMDA4MUU6IFRoZSBuYW1lIGNhbm5vdCBiZSBlbXB0eS4gUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBuYW1lLgotUHJvY2Vzc19SZW5hbWVfVGl0bGU9UmVuYW1lCi1Qcm9jZXNzX0ludmFsaWRQcmVzZW50YXRpb25OYW1lPUlVUEEwMDgyRTogVGhlIHByZXNlbnRhdGlvbiBuYW1lIGNhbm5vdCBiZSBlbXB0eS4gUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBwcmVzZW50YXRpb24gbmFtZS4KLVByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZT1MaW5rIE1ldGhvZCBFbGVtZW50Ci1Qcm9jZXNzX0ludmFsaWRMaW5rTWV0aG9kRWxlbWVudD1JVVBBMDA4M0U6IENhbm5vdCBsaW5rIHRvICcnezB9Jycgc2luY2UgdGhpcyBNZXRob2RFbGVtZW50IGlzIGFscmVhZHkgYmVpbmcgdXNlZCBmb3IgYW5vdGhlciBkZXNjcmlwdG9yIHVuZGVyIHRoZSBzYW1lIHBhcmVudC4KLVByb2Nlc3NfQXNzaWdubWVudEluZm9UaXRsZT1JbmZvcm1hdGlvbgotUHJvY2Vzc19UZWFtQXNzaWduRXJyb3I9SVVQQTAwODRFOiBDYW5ub3QgYWRkICcnezB9JycgdG8gdGhlIHRlYW0gJyd7MX0nJyBcblxuUm9sZSBkZXNjcmlwdG9yKHMpIG11c3QgaGF2ZSBtZXRob2QgZWxlbWVudCByb2xlIGFzc29jaWF0ZWQgd2l0aCBpdCB0byBiZSBhc3NpZ25lZCB0byB0ZWFtLlxuXG4gRml4IHRoZSBhc3NvY2F0aW9uIGZpcnN0IGFuZCB0cnkgYWdhaW4uCi1Qcm9jZXNzX1RlYW1EaWFsb2dNZXNzYWdlPVNlbGVjdCB0ZWFtcwotUHJvY2Vzc19UZWFtRGlhbG9nVGl0bGU9VGVhbXMKLQotUHJvY2Vzc19EZWxpdmVyYWJsZUFzc2lnbkVycm9yPUlVUEEwMDg1RTogQ2Fubm90IGFkZCAnJ3swfScnIHRvIHRoZSBkZWxpdmVyYWJsZSAnJ3sxfScnIHNpbmNlIGl0IGRvZXMgbm90IGhhdmUgbWV0aG9kIGVsZW1lbnQgd29ya3Byb2R1Y3QgYXNzb2NpYXRlZCB3aXRoIGl0LgotUHJvY2Vzc19Db21wb3NpdGVSb2xlQXNzaWduRXJyb3I9SVVQQTAwODZFOiBDYW5ub3QgYWRkICAnJ3swfScnIHRvIHRoZSBDb21wb3NpdGUgcm9sZSAnJ3sxfScnIHNpbmNlIGl0IGRvZXMgbm90IGhhdmUgbWV0aG9kIGVsZW1lbnQgcm9sZSBhc3NvY2lhdGVkIHdpdGggaXQuCi1Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlck1lc3NhZ2U9SVVQQTAwODdXOiBQbGVhc2UgZW50ZXIgdmFsaWQgbnVtYmVyIGZvciBwcmVkZWNlc3NvcnMuCi1Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlclRpdGxlPUludmFsaWQgUHJlZGVjZXNzb3IgSWQKLQotUHJvY2Vzc19Ob0l0ZW1zPU5vIGl0ZW1zIHNlbGVjdGVkCi1Qcm9jZXNzX0l0ZW1zU2VsZWN0ZWQ9ezB9IGl0ZW1zIHNlbGVjdGVkCi1Qcm9jZXNzX05vUHJvcGVydGllc0F2YWlsYWJsZT1ObyBQcm9wZXJ0aWVzIGF2YWlsYWJsZQotCi1QcmVkZWNlc3NvckRpYWxvZ19UaXRsZT1QcmVkZWNlc3NvciBEZXBlbmRlbmN5Ci1QcmVkZWNlc3NvckRpYWxvZ19IZWFkZXJNZXNzYWdlPUVudGVyIGRlcGVuZGVuY3kgdHlwZSBmb3IgcHJlZGVjZXNzb3I6Ci1QcmVkZWNlc3NvckRpYWxvZ19JbmRleD1JbmRleDoKLVByZWRlY2Vzc29yRGlhbG9nX1ByZXNlbnRhdGlvbk5hbWU9UHJlc2VudGF0aW9uIE5hbWU6Ci1QcmVkZWNlc3NvckRpYWxvZ19EZXBlbmRlbmN5PURlcGVuZGVuY3k6Ci1QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yRGlhbG9nVGl0bGU9UHJlZGVjZXNzb3IKLVByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JNZXNzYWdlPUlVUEEwMDg4RTogUHJlZGVjZXNzb3Igd2l0aCB0aGF0IElkIGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQuCi0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc190ZXh0RWRpdENlbGxfcHJvYmxlbV9tc2c9SVVQQTAwOTBFOiBUaGVyZSB3YXMgYW4gZXJyb3IgZWRpdGluZyBhIHByb3BlcnR5LgotUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX2NlbGxFZGl0b3JfaW52YWxpZFByZWRjZXNzb3JfcHJvYmxlbV9tc2c9SVVQQTAwODlXOiBJbnZhbGlkIHByZWRlY2Vzc29yIGxpc3QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JvbGVEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JvbGVEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWIwMjJkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Sb2xlRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5JdGVtc0ZpbHRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc1JvbGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuTGlua01ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIFRoZSBnZW5lcmFsIHRhYiBzZWN0aW9uIGZvciBSb2xlIERlc2NyaXB0b3IKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiBleHRlbmRzIERlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiB7Ci0JcHJvdGVjdGVkIFJvbGVEZXNjcmlwdG9yIGVsZW1lbnQ7Ci0KLQlwcml2YXRlIExhYmVsIGN0cmxfbWV0aG9kX2VsZW1lbnRfbGFiZWw7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9tZXRob2RfZWxlbWVudDsKLQotCXByaXZhdGUgQnV0dG9uIGxpbmtCdXR0b247Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJLy8gZ2V0IFJvbGVEZXNjcmlwdG9yIG9iamVjdAotCQllbGVtZW50ID0gKFJvbGVEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiNjcmVhdGVHZW5lcmFsU2VjdGlvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlzdXBlci5jcmVhdGVHZW5lcmFsU2VjdGlvbihjb21wb3NpdGUpOwotCi0JCS8vIG1ldGhvZCBlbGVtZW50Ci0JCWN0cmxfbWV0aG9kX2VsZW1lbnRfbGFiZWwgPSBGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwKLQkJCQlnZW5lcmFsQ29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfVHlwZV9Sb2xlKTsgLy8kTk9OLU5MUy0xJAotCi0JCWN0cmxfbWV0aG9kX2VsZW1lbnQgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVNXVC5ERUZBVUxULCAxKTsKLQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnROYW1lKGVsZW1lbnQpKTsKLQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlsaW5rQnV0dG9uID0gRm9ybVVJCi0JCQkJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBTV1QuUFVTSCwgMSk7Ci0JCWxpbmtCdXR0b24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQnV0dG9uX0xpbmtNZXRob2RFbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHNob3cvaGlkZSBtZXRob2Qgcm9sZQotCQl0b2dnbGVNZXRob2RSb2xlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRvZ2dsZU1ldGhvZFJvbGUoKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJY3RybF9tZXRob2RfZWxlbWVudF9sYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlsaW5rQnV0dG9uLnNldFZpc2libGUoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJY3RybF9tZXRob2RfZWxlbWVudF9sYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRWaXNpYmxlKHRydWUpOwotCQkJbGlua0J1dHRvbi5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0KLQkJbGlua0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBQcm9jZXNzUm9sZUZpbHRlcigKLQkJCQkJCWdldENvbmZpZ3VyYXRpb24oKSwgbnVsbCwgRmlsdGVyQ29uc3RhbnRzLlJPTEVTKTsKLQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0Um9sZSgpICE9IG51bGwpIHsKLQkJCQkJZXhpc3RpbmdFbGVtZW50cy5hZGQoZWxlbWVudC5nZXRSb2xlKCkpOwotCQkJCX0KLQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJCWZpbHRlciwgZWxlbWVudCwgRmlsdGVyQ29uc3RhbnRzLlJPTEVTLAotCQkJCQkJZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlmZC5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLlJPTEVTKTsKLQkJCQlmZC5vcGVuKCk7Ci0JCQkJc2V0TWV0aG9kRWxlbWVudChmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCi0JCQkJLy8gdXBkYXRlIG1ldGhvZCBlbGVtZW50IGNvbnRyb2wKLQkJCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZTEpIHsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE1ldGhvZEVsZW1lbnQoTGlzdCBpdGVtcykgewotCQlpZiAoKGl0ZW1zICE9IG51bGwpICYmIChpdGVtcy5zaXplKCkgPj0gMSkpIHsKLQkJCWlmIChpdGVtcy5nZXQoMCkgaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQkJUm9sZSByb2xlID0gKFJvbGUpIGl0ZW1zLmdldCgwKTsKLQotCQkJCUxpc3QgbGlzdCA9IFByb2Nlc3NVdGlsCi0JCQkJCQkuZ2V0U2libGluZ3MoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGdldEFkYXB0ZXIoKSwKLQkJCQkJCQkJZWxlbWVudCk7Ci0JCQkJYm9vbGVhbiBjYW5Bc3NpZ24gPSB0cnVlOwotCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgb2JqOwotCQkJCQkJaWYgKCghcm9sZURlc2MuZXF1YWxzKGVsZW1lbnQpKQotCQkJCQkJCQkmJiAoIXJvbGVEZXNjLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkpIHsKLQkJCQkJCQlSb2xlIGV4aXNpbmdSb2xlID0gcm9sZURlc2MuZ2V0Um9sZSgpOwotCQkJCQkJCWlmIChyb2xlLmVxdWFscyhleGlzaW5nUm9sZSkpIHsKLQkJCQkJCQkJY2FuQXNzaWduID0gZmFsc2U7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoY2FuQXNzaWduKSB7Ci0JCQkJCUxpbmtNZXRob2RFbGVtZW50Q29tbWFuZCBjbWQgPSBuZXcgTGlua01ldGhvZEVsZW1lbnRDb21tYW5kKAotCQkJCQkJCWVsZW1lbnQsIHJvbGUsIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFKTsKLQkJCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQotCQkJCQkvLyBzZXQgc2VsZWN0aW9uIHRvIHNhbWUgZWxlbWVudCB0byBlbmFibGUgY29ycmVjdCBhY3Rpb25zCi0JCQkJCWdldEVkaXRvcigpLnNldFNlbGVjdGlvbihnZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTWVzc2FnZUZvcm1hdCBtZiA9IG5ldyBNZXNzYWdlRm9ybWF0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19JbnZhbGlkTGlua01ldGhvZEVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJCU9iamVjdFtdIGFyZ3MgPSB7IHJvbGUuZ2V0TmFtZSgpIH07Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19MaW5rTWV0aG9kRWxlbWVudFRpdGxlLCBtZi5mb3JtYXQoYXJncykpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWV0aG9kRWxlbWVudE5hbWUoUm9sZURlc2NyaXB0b3IgZWxlbWVudCkgewotCQlTdHJpbmcgc3RyID0gUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX05vbmU7IAotCQlpZiAoZWxlbWVudC5nZXRSb2xlKCkgIT0gbnVsbCkgewotCQkJc3RyID0gZWxlbWVudC5nZXRSb2xlKCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI3VwZGF0ZUNvbnRyb2xzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJc3VwZXIudXBkYXRlQ29udHJvbHMoKTsKLQotCQlsaW5rQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlPYmplY3Qgb2JqID0gZ2V0RWxlbWVudCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBvYmo7Ci0JCQlpZiAoKHJvbGVEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpCi0JCQkJCXx8IChyb2xlRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSkgewotCQkJCW5hbWVUZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQluYW1lVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCXN1cGVyLnJlZnJlc2goKTsKLQotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJZWxlbWVudCA9IChSb2xlRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQkJCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50TmFtZShlbGVtZW50KSk7Ci0KLQkJCQkvLyBzaG93L2hpZGUgbWV0aG9kIHJvbGUKLQkJCQl0b2dnbGVNZXRob2RSb2xlKCk7Ci0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoCi0JCQkJCSJFcnJvciByZWZyZXNoaW5nIFJvbGVEZXNjcmlwdG9yIGdlbmVyYWwgc2VjdGlvbjogIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI2dldE5hbWVQcmVmaXgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZVByZWZpeCgpIHsKLQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfQ09NUE9TSVRFX1JPTEUgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9ST0xFX0RFU0NSSVBUT1IgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUm9sZURlc2NyaXB0b3JUZWFtU2VjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUm9sZURlc2NyaXB0b3JUZWFtU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2OTNlZjY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JvbGVEZXNjcmlwdG9yVGVhbVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIFJvbGUgZGVzY3JpcHRvciAtIHRlYW0gcHJvZmlsZSBzZWN0aW9uCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdG9yVGVhbVNlY3Rpb24gZXh0ZW5kcyBPQlNSZWxhdGlvblNlY3Rpb24gewotCXByaXZhdGUgSW1hZ2UgdGl0bGVJbWFnZSA9IG51bGw7Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcigpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldFNlbGVjdGVkVGVhbXMoZWxlbWVudCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQllbGVtZW50ID0gKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50OwotCi0JCQotCQlzZXRUYWJEYXRhKFByb3BlcnRpZXNSZXNvdXJjZXMuUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uVGl0bGUsIAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uRGVzY3JpcHRpb24sCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Sb2xlRGVzY3JpcHRvcl9UZWFtX1RhYmxlMSk7IAotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJZWxlbWVudCA9IChSb2xlRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKAotCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBSb2xlIERlc2NyaXB0b3IgdGVhbSBzZWN0aW9uICIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZChPYmplY3RbXSBpdGVtcykgewotCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgaXRlbXNbaV07Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJCUNvbXBvc2l0ZVJvbGUgY29tcFJvbGUgPSBQcm9jZXNzVXRpbAotCQkJCQkJCS5jcmVhdGVDb21wb3NpdGVSb2xlKChDb21wb3NpdGVSb2xlKSBlbGVtZW50KTsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgdGVhbSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCQljb21wUm9sZSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCVJvbGUgcm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFJvbGUoKTsKLQkJCQkJaWYgKHJvbGUgIT0gbnVsbCkgewotCQkJCQkJaWYgKCFpc1BhcnRPZlRlYW0ocm9sZSwgdGVhbSkpIHsKLQkJCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCQkuY3JlYXRlUm9sZURlc2NyaXB0b3Iocm9sZSk7Ci0JCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgdGVhbSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCQkJCXJvbGVEZXNjLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlNZXNzYWdlRm9ybWF0IG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQoCi0JCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19UZWFtQXNzaWduRXJyb3IpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlPYmplY3RbXSBhcmdzID0geyBlbGVtZW50LmdldE5hbWUoKSwgdGVhbS5nZXROYW1lKCkgfTsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gbWYuZm9ybWF0KGFyZ3MpOwotCQkJCQkJU3RyaW5nIHRpdGxlID0gZ2V0RWRpdG9yKCkuZ2V0VGl0bGUoKTsKLQkJCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpOwotCQkJCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgdGVhbSwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLAotCQkJCQkJZWxlbWVudCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI3JlbW92ZShqYXZhLnV0aWwuQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgaXRvci5uZXh0KCk7Ci0JCQkJUm9sZSByb2xlID0gKChSb2xlRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0Um9sZSgpOwotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHRlYW0sCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCWVsZW1lbnQsIC0xKTsKLQotCQkJCS8vIEdldCB0aGUgbGlzdCBvZiByb2xlRGVzY3JpcHRvcnMgZnJvbSB0ZWFtIHByb2ZpbGUgd2hpY2gKLQkJCQkvLyBoYXMgc2FtZSByb2xlIG9yaWdpbmFsIHJvbGUgZGVzY3JpcHRvcgotCQkJCUxpc3QgdGVhbVJvbGVzID0gdGVhbS5nZXRUZWFtUm9sZXMoKTsKLQkJCQlMaXN0IHJvbGVEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRlYW1Sb2xlcy5zaXplKCk7IGkrKykgewotCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgdGVhbVJvbGVzLmdldChpKTsKLQotCQkJCQlpZiAocm9sZURlc2MuZ2V0Um9sZSgpLmVxdWFscyhyb2xlKSkKLQkJCQkJewotCQkJCQkJcm9sZURlc2NMaXN0LmFkZChyb2xlRGVzYyk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBpZiByb2xlRGVzY3JpcG9yIGp1c3QgaGFzIG9uZSBlbGVtZW50LCBkZWxldGUgdGhhdCBvbmUgdG9vLgotCQkJCS8vIHNpbmNlIHRoYXQgd291bGQgYmUgdGhlIGxhc3Qgb25lCi0JCQkJaWYgKHJvbGVEZXNjTGlzdC5zaXplKCkgPT0gMSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB0ZWFtLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLAotCQkJCQkJCShSb2xlRGVzY3JpcHRvcikgcm9sZURlc2NMaXN0LmdldCgwKSwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNQYXJ0T2ZUZWFtKFJvbGUgcm9sZSwgVGVhbVByb2ZpbGUgdGVhbSkgewotCQlMaXN0IHRlYW1Sb2xlcyA9IHRlYW0uZ2V0VGVhbVJvbGVzKCk7Ci0JCUxpc3Qgcm9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHRlYW1Sb2xlcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdG9yLm5leHQoKTsKLQkJCXJvbGVzLmFkZChyb2xlRGVzYy5nZXRSb2xlKCkpOwotCQl9Ci0KLQkJaWYgKHJvbGVzLmNvbnRhaW5zKHJvbGUpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNvcGVuQWRkRGlhbG9nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQWRkRGlhbG9nKCkgewotCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB0ZWFtQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJTGlzdCBpdGVtcyA9IGdldFRlYW1zKCk7Ci0JCQkJaXRlbXMucmVtb3ZlQWxsKGdldFNlbGVjdGVkVGVhbXMoZWxlbWVudCkpOwotCQkJCXJldHVybiBpdGVtcy50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJSUxhYmVsUHJvdmlkZXIgdGVhbUxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCUxpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IExpc3RTZWxlY3Rpb25EaWFsb2coUGxhdGZvcm1VSQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBlbGVtZW50LAotCQkJCXRlYW1Db250ZW50UHJvdmlkZXIsIHRlYW1MYWJlbFByb3ZpZGVyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfVGVhbURpYWxvZ01lc3NhZ2UpOyAvLyROT04tTkxTLTEkCi0JCXRpdGxlSW1hZ2UgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLmdldEltYWdlKCk7Ci0JCUxpc3RTZWxlY3Rpb25EaWFsb2cuc2V0RGVmYXVsdEltYWdlKHRpdGxlSW1hZ2UpOwotCi0JCWRsZy5zZXRUaXRsZShQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfVGVhbURpYWxvZ1RpdGxlKTsgCi0JCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGxnLm9wZW4oKTsKLQkJYWRkKGRsZy5nZXRSZXN1bHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJY29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKiAJCVBhcmVudCBvZiB0aGUgZWxlbWVudAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0UGFyZW50KEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCkgewotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQllbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgVGVhbXMgZnJvbSBwYXJlbnQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQkJTGlzdCBvZiB0ZWFtcwotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRUZWFtcygpIHsKLQkJQXJyYXlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KGVsZW1lbnQpOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgcGFyZW50OwotCQkJCUxpc3QgYnJlYWtkb3duRWxlbWVudHMgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYnJlYWtkb3duRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgaXQubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBlbGVtZW50OwotCQkJCQkJaXRlbXMuYWRkKHRlYW0pOwotCQkJCQkJLy8gYWRkIGFueSBzdWIgdGVhbXMgaWYgdGhlcmUKLQkJCQkJCUxpc3Qgc3ViVGVhbXMgPSB0ZWFtLmdldFN1YlRlYW0oKTsKLQkJCQkJCWl0ZW1zLmFkZEFsbChzdWJUZWFtcyk7Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcGFyZW50ID0gZ2V0UGFyZW50KChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQpOwotCQl9Ci0KLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCS8qKgotCSAqIEdldCBzZWxlY3RlZCB0ZWFtcyBmb3IgdGhhdCByb2xlIGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqIAkJTGlzdCBvZiBzZWxlY3RlZCB0ZWFtIAotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRTZWxlY3RlZFRlYW1zKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiBQcm9jZXNzVXRpbAotCQkJCQkuZ2V0VGVhbVByb2ZpbGVzKChSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIGlucHV0KTsKLQkJfSBlbHNlIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBvYmplY3Q7Ci0JCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0VGVhbVByb2ZpbGVzKHJvbGVEZXNjLCBnZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJfQotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JvbGVEZXNjcmlwdG9yV29ya1Byb2R1Y3RTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Sb2xlRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MTVmZWE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JvbGVEZXNjcmlwdG9yV29ya1Byb2R1Y3RTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQXNzaWduV1BUb1JvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLklBY3Rpb25UeXBlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBSb2xlIERlc2NyaXB0b3IgLSB3b3JrIHByb2R1Y3Qgc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbiBleHRlbmRzIFJlbGF0aW9uU2VjdGlvbiB7Ci0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXQgcHJvY2VzcyB3b3JrIHByb2R1Y3QgZmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCWZpbHRlciA9IG5ldyBQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpLAotCQkJCQludWxsLCBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTKTsKLQkJfQotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0KLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXIxKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMSgpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdCgKLQkJCQkJCSgoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFJlc3BvbnNpYmxlRm9yKCkpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl0YWJsZVZpZXdlcjEuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXIyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMigpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdCgoKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRNb2RpZmllcygpKQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdGFibGVWaWV3ZXIyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0KLQkJbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQkJaW50IG51bU9mVGFibGVzID0gMjsKLQkJCi0JCXNldFRhYkRhdGEoUHJvcGVydGllc1Jlc291cmNlcy5Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbiwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTEsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyLAotCQkJCW51bGwsCi0JCQkJbnVsbCwKLQkJCQlGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTKTsgCi0KLQkJYm9vbGVhbltdIGNoYW5nZXNBbGxvd2VkID0geyB0cnVlLCBmYWxzZSB9OwotCQlzZXRUYWJsZURhdGEobnVtT2ZUYWJsZXMsIGNoYW5nZXNBbGxvd2VkKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCWVsZW1lbnQgPSAoUm9sZURlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJfQotCQlzdXBlci5yZWZyZXNoKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RGVzY3JpcHRvcnNGcm9tUHJvY2VzcygpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RGVzY3JpcHRvcnNGcm9tUHJvY2VzcygpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldEVsZW1lbnRzSW5TY29wZShnZXRBZGFwdGVyRmFjdG9yeSgpLCBlbGVtZW50LAotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRJdGVtczEoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMxKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUFzc2lnbldQVG9Sb2xlRGVzY3JpcHRvciBjbWQgPSBuZXcgQXNzaWduV1BUb1JvbGVEZXNjcmlwdG9yKAotCQkJCQkoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQsIGl0ZW1zLAotCQkJCQlJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfUkVTUE9OU0lCTEVfRk9SLCBnZXRDb25maWd1cmF0aW9uKCkpOwotCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVtb3ZlSXRlbXMxKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMShMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZCBjbWQgPSBuZXcgUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQoZWxlbWVudCwKLQkJCQkJaXRlbXMsIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1IpOwotCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIExpc3QgZ2V0V29ya1Byb2R1Y3RzKExpc3QgaXRlbXMpIHsKLQkJTGlzdCB3cExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJd3BMaXN0LmFkZCgoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgaXRlbXMuZ2V0KGkpKQotCQkJCQkJLmdldFdvcmtQcm9kdWN0KCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHdwTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RXhpc3RpbmdFbGVtZW50czEoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMxKCkgewotCQlyZXR1cm4gZ2V0V29ya1Byb2R1Y3RzKCgoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFJlc3BvbnNpYmxlRm9yKCkpOwotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0UHJvY2VzcygpCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IG9iaiA9IFByb2Nlc3NVdGlsLmdldFJvb3RQcm9jZXNzKGFGYWN0b3J5LCBhZGFwdGVyLCBlbGVtZW50KTsKLQkJcmV0dXJuIChQcm9jZXNzKSBvYmo7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEZpbHRlckZvckRlc2NyaXB0b3JzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBEZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcihnZXRDb25maWd1cmF0aW9uKCkpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlnZXRBY3Rpdml0aWVzSW5TY29wZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBlbGVtZW50LCBsaXN0KTsKLQkJCQkJaWYgKGxpc3QuY29udGFpbnMob2JqKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCS8vIFVuY29tbWVudCB0byBzaG93IGV4dGVuZGVkIGFjdGl2aXR5J3Mgd29ya3Byb2R1Y3RzCi0JCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJLy8gT2JqZWN0IG9iamVjdCA9Ci0JCQkJLy8gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilvYmopLmdldFBhcmVudChvYmopOwotCQkJCS8vIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkvLyBnZXRBY3Rpdml0aWVzSW5TY29wZSgKLQkJCQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCS8vIGVsZW1lbnQsIGxpc3QpOwotCQkJCS8vIGlmKGxpc3QuY29udGFpbnMob2JqZWN0KSkgcmV0dXJuIHRydWU7Ci0JCQkJLy8gfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RGVzY3JpcHRvclRhYk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRvclRhYk5hbWUoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRGcm9tUHJvY2Vzc0l0ZW1zMShqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zMShMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCksCi0JCQkJCWl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZmNjMzMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzVGFza0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuTGlua01ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotLyoqCi0gKiBUaGUgZ2VuZXJhbCB0YWIgc2VjdGlvbiBmb3IgVGFzayBEZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24gZXh0ZW5kcwotCQlXb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgVGFza0Rlc2NyaXB0b3IgZWxlbWVudDsKLQotCXByaXZhdGUgQnV0dG9uIHN5bmNocm9uaXplZEJ1dHRvbjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX21ldGhvZF9lbGVtZW50OwotCi0JcHJpdmF0ZSBCdXR0b24gbGlua0J1dHRvbjsKLQotCS8vIHByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgc3luY2hyb25pemVkQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJLy8gZ2V0IFRhc2tEZXNjcmlwdG9yIG9iamVjdAotCQllbGVtZW50ID0gKFRhc2tEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNjcmVhdGVHZW5lcmFsU2VjdGlvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlzdXBlci5jcmVhdGVHZW5lcmFsU2VjdGlvbihjb21wb3NpdGUpOwotCi0JCS8vIGNyZWF0ZSBjb21wb3NpdGUgZm9yIGNoZWNrYm94Ci0JCWNoZWNrQm94Q29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgbnVtT2ZDb2x1bW5zLCB0cnVlKTsKLQotCQkvLyBzeW5jaHJvbml6ZWQgd2l0aCBzb3VyY2UKLQkJc3luY2hyb25pemVkQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUNoZWNrQnV0dG9uKHRvb2xraXQsIGNoZWNrQm94Q29tcG9zaXRlLAotCQkJCTEpOwotCQlzeW5jaHJvbml6ZWRCdXR0b24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLkJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N5bmNocm9uaXplZCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBtZXRob2QgZWxlbWVudAotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1R5cGVfVGFzayk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9tZXRob2RfZWxlbWVudCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJU1dULkRFRkFVTFQsIDEpOwotCi0JCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50TmFtZShlbGVtZW50KSk7Ci0JCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJbGlua0J1dHRvbiA9IEZvcm1VSQotCQkJCS5jcmVhdGVCdXR0b24odG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgU1dULlBVU0gsIDEpOwotCQlsaW5rQnV0dG9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0J1dHRvbl9MaW5rTWV0aG9kRWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRNZXRob2RFbGVtZW50KExpc3QgaXRlbXMpIHsKLQkJaWYgKChpdGVtcyAhPSBudWxsKSAmJiAoaXRlbXMuc2l6ZSgpID49IDEpKSB7Ci0JCQlpZiAoaXRlbXMuZ2V0KDApIGluc3RhbmNlb2YgVGFzaykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdGVtcy5nZXQoMCk7Ci0KLQkJCQlMaXN0IGxpc3QgPSBQcm9jZXNzVXRpbAotCQkJCQkJLmdldFNpYmxpbmdzKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBnZXRBZGFwdGVyKCksCi0JCQkJCQkJCWVsZW1lbnQpOwotCQkJCWJvb2xlYW4gY2FuQXNzaWduID0gdHJ1ZTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIG9iajsKLQkJCQkJCWlmICgoIXRhc2tEZXNjLmVxdWFscyhlbGVtZW50KSkKLQkJCQkJCQkJJiYgKCF0YXNrRGVzYy5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpKSB7Ci0JCQkJCQkJVGFzayBleGlzaW5nVGFzayA9IHRhc2tEZXNjLmdldFRhc2soKTsKLQkJCQkJCQlpZiAodGFzay5lcXVhbHMoZXhpc2luZ1Rhc2spKSB7Ci0JCQkJCQkJCWNhbkFzc2lnbiA9IGZhbHNlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGNhbkFzc2lnbikgewotCQkJCQlMaW5rTWV0aG9kRWxlbWVudENvbW1hbmQgY21kID0gbmV3IExpbmtNZXRob2RFbGVtZW50Q29tbWFuZCgKLQkJCQkJCQllbGVtZW50LCB0YXNrLCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSyk7Ci0JCQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0KLQkJCQkJLy8gc2V0IHNlbGVjdGlvbiB0byBzYW1lIGVsZW1lbnQgdG8gZW5hYmxlIGNvcnJlY3QgYWN0aW9ucwotCQkJCQlnZXRFZGl0b3IoKS5zZXRTZWxlY3Rpb24oZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCU1lc3NhZ2VGb3JtYXQgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfSW52YWxpZExpbmtNZXRob2RFbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJCQlPYmplY3RbXSBhcmdzID0geyB0YXNrLmdldE5hbWUoKSB9OwotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUluZm8oCi0JCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZSwgbWYuZm9ybWF0KGFyZ3MpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE1ldGhvZEVsZW1lbnROYW1lKFRhc2tEZXNjcmlwdG9yIGVsZW1lbnQpIHsKLQkJU3RyaW5nIHN0ciA9IFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Ob25lOyAKLQkJaWYgKGVsZW1lbnQuZ2V0VGFzaygpICE9IG51bGwpIHsKLQkJCXN0ciA9IGVsZW1lbnQuZ2V0VGFzaygpLmdldE5hbWUoKTsKLQkJfQotCi0JCXJldHVybiBzdHI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc3luY2hyb25pemVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihzeW5jaHJvbml6ZWRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpLCAtMSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWxpbmtCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgUHJvY2Vzc1Rhc2tGaWx0ZXIoCi0JCQkJCQlnZXRDb25maWd1cmF0aW9uKCksIG51bGwsIEZpbHRlckNvbnN0YW50cy5UQVNLUyk7Ci0JCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWlmIChlbGVtZW50LmdldFRhc2soKSAhPSBudWxsKSB7Ci0JCQkJCWV4aXN0aW5nRWxlbWVudHMuYWRkKGVsZW1lbnQuZ2V0VGFzaygpKTsKLQkJCQl9Ci0JCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCQlmaWx0ZXIsIGVsZW1lbnQsIEZpbHRlckNvbnN0YW50cy5UQVNLUywKLQkJCQkJCWV4aXN0aW5nRWxlbWVudHMpOwotCi0JCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZmQuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKHRydWUpOwotCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5UQVNLUyk7Ci0JCQkJZmQub3BlbigpOwotCQkJCXNldE1ldGhvZEVsZW1lbnQoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQotCQkJCS8vIHVwZGF0ZSBtZXRob2QgZWxlbWVudCBjb250cm9sCi0JCQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnROYW1lKGVsZW1lbnQpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUxKSB7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jdXBkYXRlQ29udHJvbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlzdXBlci51cGRhdGVDb250cm9scygpOwotCQlzeW5jaHJvbml6ZWRCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWxpbmtCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJZWxlbWVudCA9IChUYXNrRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQkJCXN5bmNocm9uaXplZEJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudAotCQkJCQkJLmdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgVGFza0Rlc2NyaXB0b3IgZ2VuZXJhbCBzZWN0aW9uOiAiICsgZWxlbWVudCwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2dldE5hbWVQcmVmaXgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZVByZWZpeCgpIHsKLQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9UQVNLX0RFU0NSSVBUT1IgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JSb2xlU2VjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JSb2xlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZTM3N2E2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yUm9sZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc1JvbGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFzc2lnblByaW1hcnlQZXJmb3JtZXJUb1Rhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLklBY3Rpb25UeXBlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBUaGUgVGFzayBkZXNjcmlwdG9yIC0gcm9sZSB0YWIgc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvclJvbGVTZWN0aW9uIGV4dGVuZHMgUmVsYXRpb25TZWN0aW9uIHsKLQlwcml2YXRlIElGaWx0ZXIgcm9sZUZpbHRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXQgcHJvY2VzcyByb2xlZGVzY3JpcHRvciBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWlmIChyb2xlRmlsdGVyID09IG51bGwpIHsKLQkJCXJvbGVGaWx0ZXIgPSBuZXcgUHJvY2Vzc1JvbGVGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpLCBudWxsLAotCQkJCQlGaWx0ZXJDb25zdGFudHMuUk9MRVMpOwotCQl9Ci0JCXJldHVybiByb2xlRmlsdGVyOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0KLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXIxKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMSgpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGUgPSAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkJLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCQkJaWYgKHJvbGUgIT0gbnVsbCkKLQkJCQkJbGlzdC5hZGQocm9sZSk7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdChsaXN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyMS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcjIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIyKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcjMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIzKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0QXNzaXN0ZWRCeSgpKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyMy5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCi0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCWludCBudW1PZlRhYmxlcyA9IDM7Ci0JCQotCQlzZXRUYWJEYXRhKFByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvblRpdGxlLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUxLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUyLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUzLAotCQkJCW51bGwsCi0JCQkJRmlsdGVyQ29uc3RhbnRzLlJPTEVTKTsKLQkJCi0JCWJvb2xlYW5bXSBjaGFuZ2VzQWxsb3dlZCA9IHsgdHJ1ZSwgdHJ1ZSwgdHJ1ZSB9OwotCQlzZXRUYWJsZURhdGEobnVtT2ZUYWJsZXMsIGNoYW5nZXNBbGxvd2VkKTsKLQotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVmcmVzaGluZyBUYXNrRGVzY3JpcHRvciBST0xFUyBTZWN0aW9uIik7Ci0JCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJZWxlbWVudCA9IChUYXNrRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXN1cGVyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RGVzY3JpcHRvcnNGcm9tUHJvY2VzcygpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RGVzY3JpcHRvcnNGcm9tUHJvY2VzcygpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldEVsZW1lbnRzSW5TY29wZShnZXRBZGFwdGVyRmFjdG9yeSgpLCBlbGVtZW50LAotCQkJCVJvbGVEZXNjcmlwdG9yLmNsYXNzLCBpdGVtcyk7Ci0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0Um9sZXMoTGlzdCBpdGVtcykgewotCQlMaXN0IHJvbGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotCQkJCXJvbGVMaXN0LmFkZCgoKFJvbGVEZXNjcmlwdG9yKSBpdGVtcy5nZXQoaSkpLmdldFJvbGUoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcm9sZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEl0ZW1zMShqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtczEoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJTGlzdCBlbGVtZW50TGlzdCA9IGdldFJvbGVzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJCWVsZW1lbnRMaXN0LmFkZEFsbChnZXRSb2xlcygoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0QXNzaXN0ZWRCeSgpKSk7Ci0KLQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlbXMuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQkJCVJvbGUgcm9sZSA9IChSb2xlKSBvYmo7Ci0JCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnMocm9sZSkpCi0JCQkJCQluZXdMaXN0LmFkZChyb2xlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobmV3TGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJQXNzaWduUHJpbWFyeVBlcmZvcm1lclRvVGFza0Rlc2NyaXB0b3IgY21kID0gbmV3IEFzc2lnblByaW1hcnlQZXJmb3JtZXJUb1Rhc2tEZXNjcmlwdG9yKAotCQkJCQkJKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50LCAoUm9sZSkgbmV3TGlzdC5nZXQoMCksIGdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkSXRlbXMyKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zMihMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9ICgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCQkJTGlzdCBlbGVtZW50TGlzdCA9IGdldFJvbGVzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRBc3Npc3RlZEJ5KCkpOwotCQkJaWYgKHJvbGVEZXNjICE9IG51bGwpCi0JCQkJZWxlbWVudExpc3QuYWRkKHJvbGVEZXNjLmdldFJvbGUoKSk7Ci0KLQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlbXMuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQkJCVJvbGUgcm9sZSA9IChSb2xlKSBvYmo7Ci0JCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnMocm9sZSkpCi0JCQkJCQluZXdMaXN0LmFkZChyb2xlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobmV3TGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IgY21kID0gbmV3IEFzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yKAotCQkJCQkJKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50LCBuZXdMaXN0LAotCQkJCQkJSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0FERElUSU9OQUxfUEVSRk9STUVSLCBnZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEl0ZW1zMyhqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtczMoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSBnZXRSb2xlcygoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCQlpZiAocm9sZURlc2MgIT0gbnVsbCkKLQkJCQllbGVtZW50TGlzdC5hZGQocm9sZURlc2MuZ2V0Um9sZSgpKTsKLQotCQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBpdGVtcy5nZXQoaSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCQkJUm9sZSByb2xlID0gKFJvbGUpIG9iajsKLQkJCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucyhyb2xlKSkKLQkJCQkJCW5ld0xpc3QuYWRkKHJvbGUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChuZXdMaXN0LnNpemUoKSA+IDApIHsKLQkJCQlBc3NpZ25Sb2xlVG9UYXNrRGVzY3JpcHRvciBjbWQgPSBuZXcgQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IoCi0JCQkJCQkoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQsIG5ld0xpc3QsCi0JCQkJCQlJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfQVNTSVNURURfQlksIGdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkRnJvbVByb2Nlc3NJdGVtczEoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczEoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJCWl0ZW1zLnJlbW92ZUFsbCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRBc3Npc3RlZEJ5KCkpOwotCi0JCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwKLQkJCQkJCWl0ZW1zLmdldCgwKSwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEZyb21Qcm9jZXNzSXRlbXMyKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMyKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWl0ZW1zLnJlbW92ZUFsbCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRBc3Npc3RlZEJ5KCkpOwotCQkJaXRlbXMucmVtb3ZlKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkpOwotCi0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksCi0JCQkJCWl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkRnJvbVByb2Nlc3NJdGVtczMoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczMoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJCWl0ZW1zLnJlbW92ZSgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpKTsKLQotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCBlbGVtZW50LAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCksIGl0ZW1zLAotCQkJCQktMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVtb3ZlSXRlbXMxKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMShMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZCBjbWQgPSBuZXcgUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQoZWxlbWVudCwKLQkJCQkJaXRlbXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI3JlbW92ZUl0ZW1zMihqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczIoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQgY21kID0gbmV3IFJlbW92ZURlc2NyaXB0b3JDb21tYW5kKGVsZW1lbnQsCi0JCQkJCWl0ZW1zLAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSk7Ci0JCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZW1vdmVJdGVtczMoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXMzKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCVJlbW92ZURlc2NyaXB0b3JDb21tYW5kIGNtZCA9IG5ldyBSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZChlbGVtZW50LAotCQkJCQlpdGVtcywgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEV4aXN0aW5nRWxlbWVudHMxKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzMSgpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9ICgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCWlmIChyb2xlRGVzYyAhPSBudWxsKQotCQkJbGlzdC5hZGQocm9sZURlc2MpOwotCi0JCXJldHVybiBsaXN0OwotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RXhpc3RpbmdFbGVtZW50czIoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMyKCkgewotCQlyZXR1cm4gKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEV4aXN0aW5nRWxlbWVudHMzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzMygpIHsKLQkJcmV0dXJuICgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldEFzc2lzdGVkQnkoKTsKLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEZpbHRlckZvckRlc2NyaXB0b3JzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBEZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcihnZXRDb25maWd1cmF0aW9uKCkpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlnZXRBY3Rpdml0aWVzSW5TY29wZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBlbGVtZW50LCBsaXN0KTsKLQkJCQkJaWYgKGxpc3QuY29udGFpbnMob2JqKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRQcm9jZXNzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQllbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3Qgb2JqID0gUHJvY2Vzc1V0aWwuZ2V0Um9vdFByb2Nlc3MoYUZhY3RvcnksIGFkYXB0ZXIsIGVsZW1lbnQpOwotCQlyZXR1cm4gKFByb2Nlc3MpIG9iajsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RGVzY3JpcHRvclRhYk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRvclRhYk5hbWUoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuUk9MRV9ERVNDUklQVE9SUzsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UYXNrRGVzY3JpcHRvclN0ZXBTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UYXNrRGVzY3JpcHRvclN0ZXBTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM5ZmFjN2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JTdGVwU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLlZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdGlvbkFwcGxpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSB0YXNrIGRlc2NyaXB0b3IgLSBzdGVwIHNlY3Rpb24KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0b3JTdGVwU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JcHJpdmF0ZSBUYXNrRGVzY3JpcHRvciBlbGVtZW50OwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwcml2YXRlIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZCwgY3RybF9yZW1vdmUsIGN0cmxfdXAsIGN0cmxfZG93bjsKLQotCXByaXZhdGUgVGFibGUgY3RybF9zZWxlY3RlZDsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmlld2VyOwotCi0JLy8gcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZfZGVzYzsKLQlwcml2YXRlIEltYWdlIHRpdGxlSW1hZ2U7Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LAotCQkJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpIHsKLQotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQkJaW5pdCgpOwotCi0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBjcmVhdGUgc3RlcHMgc2VjdGlvbgotCQljcmVhdGVTdGVwU2VjdGlvbihwYXJlbnQpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZQotCSAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCS8vIGdldCBhY3Rpdml0eSBvYmplY3QKLQkJZWxlbWVudCA9IChUYXNrRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCi0JCS8vIGdldCB0b29sa2l0Ci0JCXRvb2xraXQgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0KLQkJLy8gZ2V0IGFjdGlvbiBtYW5hZ2VyCi0JCWFjdGlvbk1nciA9IEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQllbGVtZW50ID0gKFRhc2tEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JCQkJdmlld2VyLnJlZnJlc2goKTsKLQotCQkJCS8vIGhpZGUvcmVmcmVzaCBjb250cm9scwotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKCJFcnJvciByZWZyZXNoaW5nIFRhc2tEZXNjcmlwdG9yIHN0ZXAgc2VjdGlvbiIgKyBlbGVtZW50LCBleCk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBjb250cm9scyBiYXNlZCBvbiBlZGl0YWJsZSBmbGFnLiBDb250cm9scyB3aWxsIGJlIGVpdGhlciBlZGl0YWJsZSAKLQkgKiBvciByZWFkLW9ubHkgYWZ0ZXIgdXBkYXRpbmcgdGhpcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJY3RybF9hZGQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmIChlbGVtZW50LmdldFRhc2soKSA9PSBudWxsKQotCQkJY3RybF9hZGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVsc2UgewotCQkJTGlzdCBzdGVwcyA9IGdldFN0ZXBzKCk7Ci0JCQlpZiAoc3RlcHMgIT0gbnVsbCAmJiBzdGVwcy5zaXplKCkgPiAwKSAKLQkJCQljdHJsX2FkZC5zZXRFbmFibGVkKHRydWUpOwotCQkJZWxzZSAKLQkJCQljdHJsX2FkZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCQkKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiBlZGl0YWJsZSkgewotCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQljdHJsX3VwLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQl9IGVsc2UgewotCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgU3RlcCBzZWN0aW9uIG9uIHRoZSBnaXZlbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVN0ZXBTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJLy8gY3JlYXRlIHN0ZXAgc2VjdGlvbgotCQlTZWN0aW9uIHN0ZXBTZWN0aW9uID0gRm9ybVVJCi0JCQkJLmNyZWF0ZVNlY3Rpb24oCi0JCQkJCQl0b29sa2l0LAotCQkJCQkJY29tcG9zaXRlLAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25UaXRsZSwgCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvbkRlc2NyaXB0aW9uKTsgCi0KLQkJLy8gY3JlYXRlIHN0ZXAgY29tcG9zaXRlCi0JCUNvbXBvc2l0ZSBzdGVwQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzdGVwU2VjdGlvbiwKLQkJCQkyLCBmYWxzZSk7Ci0KLQkJLy8gY3JlYXRlIHRhYmxlIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgcGFuZTEgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHN0ZXBDb21wb3NpdGUsCi0JCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUxLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkX1N0ZXBzKTsgCi0KLQkJY3RybF9zZWxlY3RlZCA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSk7Ci0JCXZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3NlbGVjdGVkKTsKLQotCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZWxlbWVudC5nZXRTZWxlY3RlZFN0ZXBzKCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXZpZXdlci5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkvLyBjcmVhdGUgYnV0dG9uIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgcGFuZTIgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHN0ZXBDb21wb3NpdGUsCi0JCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQotCQkvLyBjcmVhdGUgYnV0dG9ucwotCQljdHJsX2FkZCA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOwotCQljdHJsX2FkZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3RybF9yZW1vdmUgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsgCi0JCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQljdHJsX3VwID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1VwKTsgCi0JCWN0cmxfZG93biA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Eb3duKTsgCi0KLQkJaWYgKGVsZW1lbnQuZ2V0VGFzaygpICE9IG51bGwpIHsKLQkJCUxpc3Qgc3RlcHMgPSBnZXRTdGVwcygpOwotCQkJaWYgKHN0ZXBzICE9IG51bGwgJiYgc3RlcHMuc2l6ZSgpID4gMCkgewotCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gY3JlYXRlIGJyaWVmIGRlc2NyaXB0aW9uCi0JCS8vIGludCBoZWlnaHRIaW50ID0gNDA7Ci0JCS8vIGludCBob3Jpem9udGFsU3BhbiA9IDI7Ci0JCS8vIExhYmVsIGxhYmVsID0gRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHN0ZXBDb21wb3NpdGUsCi0JCS8vIFByb3BlcnRpZXNSZXNvdXJjZXMuZ2V0U3RyaW5nKCJQcm9jZXNzLmJyaWVmRGVzY3JpcHRpb24iKSwKLQkJLy8gaGVpZ2h0SGludCk7Ci0JCS8vIGN0cmxfYnJpZWZfZGVzYyA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIHN0ZXBDb21wb3NpdGUsCi0JCS8vIGhlaWdodEhpbnQsIGhlaWdodEhpbnQpOwotCQkvLyBjdHJsX2JyaWVmX2Rlc2Muc2V0RWRpdGFibGUoZmFsc2UpOwotCQkvLwkJCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHN0ZXBDb21wb3NpdGUpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJLy8gQWRkIGZvY3VzIGxpc3RlbmVyIG9uIHByaW1hcnkgdGFza3MgbGlzdAotCQljdHJsX3NlbGVjdGVkLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpIHsKLQkJCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkgewotCQkJCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKHRydWUpOwotCi0JCQkJCWlmICh2aWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMAotCQkJCQkJCSYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9IGVsc2UKLQkJCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJCQkJaWYgKHZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCB2aWV3ZXIKLQkJCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCQkmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9IGVsc2UKLQkJCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJCX0KLQotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJU3RyaW5nIGRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSkKLQkJCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQlkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQkvLyBjdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChkZXNjKTsKLQkJCQl9IGVsc2UgaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJCS8vIGN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuZ2V0U3RyaW5nKCJQcm9jZXNzLk11bHRpcGxlU2VsZWN0aW9uIikKLQkJCQkJLy8gKyAiIC0gIiArIHNlbGVjdGlvbi5zaXplKCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9hZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgc3RlcENvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCi0JCQkJCQlyZXR1cm4gZ2V0U3RlcHMoKS50b0FycmF5KCk7Ci0vLwkJCQkJCS8vIGdldCBhbGwgc3RlcHMKLS8vCQkJCQkJSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIGNvbmZpZ0FwcGxpY2F0b3IgPSBQcm92aWRlcnMKLS8vCQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKTsKLS8vCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoCi0vLwkJCQkJCQkJZWxlbWVudCkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLS8vCQkJCQkJTGlzdCBzdGVwcyA9IChMaXN0KSBjb25maWdBcHBsaWNhdG9yLmdldFJlZmVyZW5jZSgKLS8vCQkJCQkJCQllbGVtZW50LmdldFRhc2soKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLS8vCQkJCQkJCQkJCS5nZXRUYXNrX1N0ZXBzKCksIGNvbmZpZyk7Ci0vLwotLy8JCQkJCQkvLyByZW1vdmUgYWxyZWFkeSBleGlzdGluZyBzdGVwcwotLy8JCQkJCQlzdGVwcy5yZW1vdmVBbGwoZWxlbWVudC5nZXRTZWxlY3RlZFN0ZXBzKCkpOwotLy8JCQkJCQlyZXR1cm4gc3RlcHMudG9BcnJheSgpOwotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCUlMYWJlbFByb3ZpZGVyIHN0ZXBMYWJlbFByb3ZpZGVyID0gbmV3IFZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIoCi0JCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQotCQkJCQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKE9iamVjdCBvYmopIHsKLQotCQkJCQkJYm9vbGVhbiBmbGFnID0gIWVsZW1lbnQuZ2V0VGFzaygpLmdldFByZXNlbnRhdGlvbigpCi0JCQkJCQkJCS5nZXRTZWN0aW9ucygpLmNvbnRhaW5zKG9iaik7Ci0JCQkJCQlyZXR1cm4gZmxhZzsKLQkJCQkJfQotCQkJCX07Ci0KLQkJCQlMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQkJZWxlbWVudC5nZXRUYXNrKCksIHN0ZXBDb250ZW50UHJvdmlkZXIsCi0JCQkJCQlzdGVwTGFiZWxQcm92aWRlciwgUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nTWVzc2FnZSk7IAotCQkJCXRpdGxlSW1hZ2UgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLmdldEltYWdlKCk7Ci0JCQkJTGlzdFNlbGVjdGlvbkRpYWxvZy5zZXREZWZhdWx0SW1hZ2UodGl0bGVJbWFnZSk7Ci0JCQkJZGxnLnNldFRpdGxlKFByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ1RpdGxlKTsKLQkJCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZGxnLm9wZW4oKTsKLQotCQkJCWFkZFN0ZXBzKGRsZy5nZXRSZXN1bHQoKSk7Ci0JCQkJCi0JCQkJLy8gZW5hYmxlL2Rpc2FibGUgYWRkIGJ1dHRvbgotCQkJCUxpc3Qgc3RlcHMgPSBnZXRTdGVwcygpOwotCQkJCWlmIChzdGVwcyAhPSBudWxsICYmIHN0ZXBzLnNpemUoKSA+IDApIAotCQkJCQljdHJsX2FkZC5zZXRFbmFibGVkKHRydWUpOwotCQkJCWVsc2UgCi0JCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfcmVtb3ZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCXJlbW92ZVN0ZXBzKHJtSXRlbXMpOwotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJCQkJLy8gY3RybF9icmllZl9kZXNjLnNldFRleHQoIiIpOwotCQkJCX0KLQkJCQkvLyBjdHJsX3JlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkKLQkJCQkvLyBlbmFibGUvZGlzYWJsZSBhZGQgYnV0dG9uCi0JCQkJTGlzdCBzdGVwcyA9IGdldFN0ZXBzKCk7Ci0JCQkJaWYgKHN0ZXBzICE9IG51bGwgJiYgc3RlcHMuc2l6ZSgpID4gMCkgCi0JCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZWxzZSAKLQkJCQkJY3RybF9hZGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfdXAuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJQXJyYXlMaXN0IHN0ZXBzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCUFycmF5TGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCUJhc2ljRUxpc3Qgc3RlcExpc3QgPSAoQmFzaWNFTGlzdCkgZWxlbWVudAotCQkJCQkJCS5nZXRTZWxlY3RlZFN0ZXBzKCk7Ci0KLQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0JCQkJCQlpbnQgaW5kZXggPSBzdGVwTGlzdC5pbmRleE9mKG9iamVjdCk7Ci0JCQkJCQlpZiAoaW5kZXggPiAwKQotCQkJCQkJCXN0ZXBMaXN0Lm1vdmUoaW5kZXggLSAxLCBvYmplY3QpOwotCi0JCQkJCX0KLQkJCQkJc3RlcHMuYWRkQWxsKHN0ZXBMaXN0KTsKLQkJCQkJLy8gVE9ETyAtIHdyaXRlIGEgY29tbWFuZC4gCi0JCQkJCS8vIGFjdGl2YXRlIGRpcnR5IGZsYWcKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpLAotCQkJCQkJCXN0ZXBMaXN0LCAtMSk7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSwgc3RlcHMsCi0JCQkJCQkJLTEpOwotCi0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCi0JCQkJaWYgKHZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwICYmIGVkaXRhYmxlKQotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZWxzZQotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQkJaWYgKHZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCB2aWV3ZXIuZ2V0VGFibGUoKQotCQkJCQkJLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkJJiYgZWRpdGFibGUpCi0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCWVsc2UKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCi0JCX0pOwotCi0JCWN0cmxfZG93bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlBcnJheUxpc3Qgc3RlcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJQXJyYXlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlpdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJQmFzaWNFTGlzdCBzdGVwTGlzdCA9IChCYXNpY0VMaXN0KSBlbGVtZW50Ci0JCQkJCQkJLmdldFNlbGVjdGVkU3RlcHMoKTsKLQotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLQkJCQkJCWludCBpbmRleCA9IHN0ZXBMaXN0LmluZGV4T2Yob2JqZWN0KTsKLQotCQkJCQkJaWYgKGluZGV4IDwgc3RlcExpc3Quc2l6ZSgpIC0gMSkKLQkJCQkJCQlzdGVwTGlzdC5tb3ZlKGluZGV4ICsgaXRlbXMuc2l6ZSgpLCBvYmplY3QpOwotCi0JCQkJCX0KLQkJCQkJc3RlcHMuYWRkQWxsKHN0ZXBMaXN0KTsKLQotCQkJCQkvLyBUT0RPIC0gd3JpdGUgYSBjbW1hbmQuIEhhY2tpbmcgaXQgZm9yIG5vdyB0byBhY3RpdmF0ZQotCQkJCQkvLyBkaXJ0eSBmbGFnCi0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSwKLQkJCQkJCQlzdGVwTGlzdCwgLTEpOwotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCksIHN0ZXBzLAotCQkJCQkJCS0xKTsKLQotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQotCQkJCWlmICh2aWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMCAmJiBlZGl0YWJsZSkKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCWVsc2UKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJCWlmICh2aWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgdmlld2VyLmdldFRhYmxlKCkKLQkJCQkJCS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCSYmIGVkaXRhYmxlKQotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQllbHNlCi0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJfQotCi0JCX0pOwotCX0KLQotCS8qKgotCSAqIEFzc2lnbiBTdGVwcyB0byB0YXNrIGRlc2NyaXB0b3IKLQkgKiBAcGFyYW0gYWRkSXRlbXMKLQkgKiAJCQlMaXN0IG9mIHN0ZXBzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFN0ZXBzKE9iamVjdFtdIGFkZEl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJaWYgKGFkZEl0ZW1zICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkSXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24gaXRlbSA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24pIGFkZEl0ZW1zW2ldOwotCi0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSwKLQkJCQkJCWl0ZW0sIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhc3NpZ25lZCBzdGVwcyBmb3IgdGhlIHRhc2sgZGVzY3JpcHRvcgotCSAqIEBwYXJhbSBybUl0ZW1zCi0JICogCQkJTGlzdCBvZiBzdGVwcyAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlU3RlcHMoTGlzdCBybUl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiBpdGVtID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbikgaXQubmV4dCgpOwotCi0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSwKLQkJCQkJCWl0ZW0sIC0xKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXQgc3RlcHMgdGhhdCBjb3VsZCBiZSBhc3NpZ25lZCB0byB0aGlzIHRhc2sgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0U3RlcHMoKXsKLQkJLy8JZ2V0IGFsbCBzdGVwcwotCQlJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlnQXBwbGljYXRvciA9IFByb3ZpZGVycwotCQkJCS5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygKLQkJCQllbGVtZW50KS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlMaXN0IHN0ZXBzID0gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKAotCQkJCWVsZW1lbnQuZ2V0VGFzaygpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFRhc2tfU3RlcHMoKSwgY29uZmlnKTsKLQotCQkvLyByZW1vdmUgYWxyZWFkeSBleGlzdGluZyBzdGVwcwotCQlzdGVwcy5yZW1vdmVBbGwoZWxlbWVudC5nZXRTZWxlY3RlZFN0ZXBzKCkpOwotCQlyZXR1cm4gc3RlcHM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yV29ya1Byb2R1Y3RTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UYXNrRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOGMxYjFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yV29ya1Byb2R1Y3RTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLklBY3Rpb25UeXBlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSB0YXNrIGRlc2NyaXB0b3IgLSB3b3JrIHByb2R1Y3Qgc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbiBleHRlbmRzIFJlbGF0aW9uU2VjdGlvbiB7Ci0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXQgcHJvY2VzcyB3b3JrIHByb2R1Y3QgZmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCWZpbHRlciA9IG5ldyBQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpLCBudWxsLAotCQkJCQlGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTKTsKLQkJfQotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0KLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcjEoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIxKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0TWFuZGF0b3J5SW5wdXQoKSkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyMS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcjIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIyKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0T3B0aW9uYWxJbnB1dCgpKQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdGFibGVWaWV3ZXIyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNpbml0Q29udGVudFByb3ZpZGVyMygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcjMoKSB7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoCi0JCQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRFeHRlcm5hbElucHV0KCkpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl0YWJsZVZpZXdlcjMuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXI0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyNCgpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRPdXRwdXQoKSkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyNC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCi0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCWludCBudW1PZlRhYmxlcyA9IDQ7Ci0JCXNldFRhYkRhdGEoUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbiwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTEsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMywKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTQsCi0JCQkJRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUyk7Ci0JCQotCQlib29sZWFuW10gY2hhbmdlc0FsbG93ZWQgPSB7IHRydWUsIHRydWUsIHRydWUsIHRydWUgfTsKLQkJc2V0VGFibGVEYXRhKG51bU9mVGFibGVzLCBjaGFuZ2VzQWxsb3dlZCk7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCWVsZW1lbnQgPSAoVGFza0Rlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJfQotCQlzdXBlci5yZWZyZXNoKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RGVzY3JpcHRvcnNGcm9tUHJvY2VzcygpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RGVzY3JpcHRvcnNGcm9tUHJvY2VzcygpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldEVsZW1lbnRzSW5TY29wZShnZXRBZGFwdGVyRmFjdG9yeSgpLCBlbGVtZW50LAotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgaXRlbXMpOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRXb3JrUHJvZHVjdHMoTGlzdCBpdGVtcykgewotCQlMaXN0IHdwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQl3cExpc3QuYWRkKCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdGVtcy5nZXQoaSkpCi0JCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gd3BMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRJdGVtczEoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMxKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSBnZXRXb3JrUHJvZHVjdHMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldE9wdGlvbmFsSW5wdXQoKSk7Ci0JCQllbGVtZW50TGlzdC5hZGRBbGwoZ2V0V29ya1Byb2R1Y3RzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRFeHRlcm5hbElucHV0KCkpKTsKLQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlbXMuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgb2JqOwotCQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKHdwKSkKLQkJCQkJCW5ld0xpc3QuYWRkKHdwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobmV3TGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yIGNtZCA9IG5ldyBBc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3IoCi0JCQkJCQkoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQsIG5ld0xpc3QsCi0JCQkJCQlJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfTUFOREFUT1JZX0lOUFVULAotCQkJCQkJZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRJdGVtczIoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMyKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSBnZXRXb3JrUHJvZHVjdHMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQkJZWxlbWVudExpc3QuYWRkQWxsKGdldFdvcmtQcm9kdWN0cygoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0RXh0ZXJuYWxJbnB1dCgpKSk7Ci0KLQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlbXMuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgb2JqOwotCQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKHdwKSkKLQkJCQkJCW5ld0xpc3QuYWRkKHdwKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChuZXdMaXN0LnNpemUoKSA+IDApIHsKLQkJCQlBc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3IgY21kID0gbmV3IEFzc2lnbldQVG9UYXNrRGVzY3JpcHRvcigKLQkJCQkJCShUYXNrRGVzY3JpcHRvcikgZWxlbWVudCwgbmV3TGlzdCwKLQkJCQkJCUlBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9PUFRJT05BTF9JTlBVVCwKLQkJCQkJCWdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkSXRlbXMzKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zMyhMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gZ2V0V29ya1Byb2R1Y3RzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRNYW5kYXRvcnlJbnB1dCgpKTsKLQkJCWVsZW1lbnRMaXN0LmFkZEFsbChnZXRXb3JrUHJvZHVjdHMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldE9wdGlvbmFsSW5wdXQoKSkpOwotCi0JCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZW1zLmdldChpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIG9iajsKLQkJCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucyh3cCkpCi0JCQkJCQluZXdMaXN0LmFkZCh3cCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5ld0xpc3Quc2l6ZSgpID4gMCkgewotCQkJCUFzc2lnbldQVG9UYXNrRGVzY3JpcHRvciBjbWQgPSBuZXcgQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yKAotCQkJCQkJKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50LCBuZXdMaXN0LAotCQkJCQkJSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0VYVEVSTkFMX0lOUFVULAotCQkJCQkJZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRJdGVtczQoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXM0KExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUFzc2lnbldQVG9UYXNrRGVzY3JpcHRvciBjbWQgPSBuZXcgQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yKAotCQkJCQkoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQsIGl0ZW1zLAotCQkJCQlJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfT1VUUFVULCBnZXRDb25maWd1cmF0aW9uKCkpOwotCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVtb3ZlSXRlbXMxKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMShMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZCBjbWQgPSBuZXcgUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQoZWxlbWVudCwKLQkJCQkJaXRlbXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQpOwotCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVtb3ZlSXRlbXMyKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMihMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZCBjbWQgPSBuZXcgUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQoZWxlbWVudCwKLQkJCQkJaXRlbXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVCk7Ci0JCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZW1vdmVJdGVtczMoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXMzKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCVJlbW92ZURlc2NyaXB0b3JDb21tYW5kIGNtZCA9IG5ldyBSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZChlbGVtZW50LAotCQkJCQlpdGVtcywgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI3JlbW92ZUl0ZW1zNChqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczQoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQgY21kID0gbmV3IFJlbW92ZURlc2NyaXB0b3JDb21tYW5kKGVsZW1lbnQsCi0JCQkJCWl0ZW1zLCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEV4aXN0aW5nRWxlbWVudHMxKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzMSgpIHsKLQkJcmV0dXJuICgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE1hbmRhdG9yeUlucHV0KCk7Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRFeGlzdGluZ0VsZW1lbnRzMigpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czIoKSB7Ci0JCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRPcHRpb25hbElucHV0KCk7Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRFeGlzdGluZ0VsZW1lbnRzMygpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czMoKSB7Ci0JCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRFeHRlcm5hbElucHV0KCk7Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRFeGlzdGluZ0VsZW1lbnRzNCgpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czQoKSB7Ci0JCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRPdXRwdXQoKTsKLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldFByb2Nlc3MoKQotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCWVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBvYmogPSBQcm9jZXNzVXRpbC5nZXRSb290UHJvY2VzcyhhRmFjdG9yeSwgYWRhcHRlciwgZWxlbWVudCk7Ci0JCXJldHVybiAoUHJvY2Vzcykgb2JqOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyRm9yRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBuZXcgRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUxpc3QgbGlzdDEgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWdldEFjdGl2aXRpZXNJblNjb3BlKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGVsZW1lbnQsIGxpc3QxKTsKLQkJCQkJaWYgKGxpc3QxLmNvbnRhaW5zKG9iaikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEZyb21Qcm9jZXNzSXRlbXMxKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMxKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWl0ZW1zLnJlbW92ZUFsbCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRPcHRpb25hbElucHV0KCkpOwotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldEV4dGVybmFsSW5wdXQoKSk7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCksCi0JCQkJCWl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkRnJvbVByb2Nlc3NJdGVtczIoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczIoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldEV4dGVybmFsSW5wdXQoKSk7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwKLQkJCQkJaXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRGcm9tUHJvY2Vzc0l0ZW1zMyhqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zMyhMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlpdGVtcy5yZW1vdmVBbGwoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0TWFuZGF0b3J5SW5wdXQoKSk7Ci0JCQlpdGVtcy5yZW1vdmVBbGwoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0T3B0aW9uYWxJbnB1dCgpKTsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZWxlbWVudCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpLAotCQkJCQlpdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEZyb21Qcm9jZXNzSXRlbXM0KGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXM0KExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZWxlbWVudCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCksIGl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RGVzY3JpcHRvclRhYk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRvclRhYk5hbWUoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JTOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1RlYW1Qcm9maWxlUm9sZVNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1RlYW1Qcm9maWxlUm9sZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWVjZTFlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UZWFtUHJvZmlsZVJvbGVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5XcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkNvbXBvc2l0ZVJvbGVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQWRkUm9sZVRvVGVhbUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIHRlYW0gcHJvZmlsZSAtIHJvbGUvY29tcG9zaXRlIHJvbGUgc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUZWFtUHJvZmlsZVJvbGVTZWN0aW9uIGV4dGVuZHMgT0JTUmVsYXRpb25TZWN0aW9uIHsKLQotCUxpc3Qgcm9sZUxpc3QgPSBudWxsOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNpbml0Q29udGVudFByb3ZpZGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJTGlzdCB0ZWFtUm9sZXMgPSAoKFRlYW1Qcm9maWxlKSBlbGVtZW50KS5nZXRUZWFtUm9sZXMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB0ZWFtUm9sZXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdG9yLm5leHQoKTsKLQkJCQkJaWYgKChyb2xlRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKQotCQkJCQkJCXx8IChyb2xlRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSkKLQkJCQkJCW5ld0xpc3QuYWRkKHJvbGVEZXNjKTsKLQkJCQl9Ci0KLQkJCQkvLyByZXR1cm4gKChUZWFtUHJvZmlsZSllbGVtZW50KS5nZXRUZWFtUm9sZXMoKS50b0FycmF5KCk7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdChuZXdMaXN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCWVsZW1lbnQgPSAoVGVhbVByb2ZpbGUpIGVsZW1lbnQ7Ci0KLQkJc2V0VGFiRGF0YShQcm9wZXJ0aWVzUmVzb3VyY2VzLlRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvblRpdGxlLCAKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGVhbVByb2ZpbGVfUm9sZV9UYWJsZTEpOyAKLQkJc2hvd0FkZEZyb21Qcm9jZXNzQnV0dG9uID0gdHJ1ZTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJc3VwZXIucmVmcmVzaCgpOwotCQkJCWVsZW1lbnQgPSAoVGVhbVByb2ZpbGUpIGdldEVsZW1lbnQoKTsKLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcigiRXJyb3IgcmVmcmVzaGluZyBUZWFtIFByb2ZpbGUgcm9sZSBzZWN0aW9uICIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUGFydE9mVGVhbShSb2xlIHJvbGUsIFRlYW1Qcm9maWxlIHRlYW0pIHsKLQkJTGlzdCB0ZWFtUm9sZXMgPSB0ZWFtLmdldFRlYW1Sb2xlcygpOwotCQlMaXN0IHJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB0ZWFtUm9sZXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgaXRvci5uZXh0KCk7Ci0JCQlyb2xlcy5hZGQocm9sZURlc2MuZ2V0Um9sZSgpKTsKLQkJfQotCi0JCWlmIChyb2xlcy5jb250YWlucyhyb2xlKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkKExpc3QgaXRlbXMpIHsKLQkJaWYgKGl0ZW1zICE9IG51bGwpIHsKLQkJCUxpc3Qgcm9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvbGUpCi0JCQkJCQkmJiAoIWlzUGFydE9mVGVhbSgoUm9sZSkgb2JqLCAoVGVhbVByb2ZpbGUpIGVsZW1lbnQpKSkgewotCQkJCQlyb2xlcy5hZGQoKFJvbGUpIG9iaik7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIXJvbGVzLmlzRW1wdHkoKSkgewotCQkJCUFkZFJvbGVUb1RlYW1Db21tYW5kIGNtZCA9IG5ldyBBZGRSb2xlVG9UZWFtQ29tbWFuZCgKLQkJCQkJCShUZWFtUHJvZmlsZSkgZWxlbWVudCwgcm9sZXMpOwotCQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRnJvbVByb2Nlc3MoTGlzdCBpdGVtcykgewotCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBpdGVtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCQkJQ29tcG9zaXRlUm9sZSBjb21wUm9sZSA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJLmNyZWF0ZUNvbXBvc2l0ZVJvbGUoKENvbXBvc2l0ZVJvbGUpIG9iaik7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJCQkJY29tcFJvbGUsIC0xKTsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCQlvYmosIC0xKTsKLQkJCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCVJvbGUgcm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIG9iaikuZ2V0Um9sZSgpOwotCQkJCQlpZiAocm9sZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoIWlzUGFydE9mVGVhbShyb2xlLCAoVGVhbVByb2ZpbGUpIGVsZW1lbnQpKSB7Ci0JCQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkJLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKHJvbGUpOwotCQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJCQkJCQlyb2xlRGVzYywgLTEpOwotCQkJCQkJfQotCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGVsZW1lbnQsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCQkJCQlvYmosIC0xKTsKLQotCQkJCQkJLy8gZmlyZSBOb3RpZmljYXRpb24KLQkJCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJCQlBY3Rpdml0eSBwYXJlbnQgPSAoQWN0aXZpdHkpIGdldFBhcmVudEFjdGl2aXR5KGVsZW1lbnQpOwotCQkJCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbihwYXJlbnQpOwotCi0JCQkJCQlmaXJlTm90aWZpY2F0aW9uKGNoaWxkcmVuLCAoUm9sZURlc2NyaXB0b3IpIG9iaik7Ci0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCU1lc3NhZ2VGb3JtYXQgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdCgKLQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1RlYW1Bc3NpZ25FcnJvcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7ICgoUm9sZURlc2NyaXB0b3IpIG9iaikuZ2V0TmFtZSgpLAotCQkJCQkJCQkoKFRlYW1Qcm9maWxlKSBlbGVtZW50KS5nZXROYW1lKCkgfTsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQXNzaWdubWVudEluZm9UaXRsZSwgbWYuZm9ybWF0KGFyZ3MpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVOb3RpZmljYXRpb24oQ29sbGVjdGlvbiBjaGlsZHJlbiwgUm9sZURlc2NyaXB0b3Igcm9sZURlc2MpIHsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCS5hZGFwdCgoQWN0aXZpdHkpIG9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQljaGlsZHJlbiA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oKEFjdGl2aXR5KSBvYmopOwotCQkJCWZpcmVOb3RpZmljYXRpb24oY2hpbGRyZW4sIHJvbGVEZXNjKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlPYmplY3QgbzEgPSAoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VmFsdWUoKTsKLQkJCQlBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIgYWN0aXZpdHlBZGFwdGVyID0gKEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqOwotCQkJCWZpcmVOb3RpZmljYXRpb24oYWN0aXZpdHlBZGFwdGVyLmdldENoaWxkcmVuKG8xKSwgcm9sZURlc2MpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCVJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciBwcm92aWRlciA9IChSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIG9iajsKLQkJCQlpZiAoKChSb2xlRGVzY3JpcHRvcikgcHJvdmlkZXIuZ2V0VmFsdWUoKSkuZ2V0Um9sZSgpLmVxdWFscygKLQkJCQkJCXJvbGVEZXNjLmdldFJvbGUoKSkpIHsKLQkJCQkJcHJvdmlkZXIuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbigKLQkJCQkJCQluZXcgTm90aWZpY2F0aW9uSW1wbChOb3RpZmljYXRpb24uU0VULCBwcm92aWRlciwKLQkJCQkJCQkJCXByb3ZpZGVyKSwgcHJvdmlkZXIsIGZhbHNlLCB0cnVlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNyZW1vdmUoamF2YS51dGlsLkFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSAoT2JqZWN0KSBpdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCQkoUm9sZURlc2NyaXB0b3IpIG9iaiwgLTEpOwotCQkJCX0KLQotCQkJCS8vIGZpbmQgbWF0Y2hpbmcgcm9sZURlc2NyaXB0b3IgaW4gdGVhbSByb2xlcwotCQkJCUxpc3Qgcm9sZURlc2NMaXN0ID0gZmluZFJvbGVEZXNjcmlwdG9yKChPYmplY3QpIG9iaik7Ci0JCQkJZm9yIChJdGVyYXRvciByb2xlRGVzY0l0b3IgPSByb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgcm9sZURlc2NJdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgcm9sZURlc2NJdG9yCi0JCQkJCQkJLm5leHQoKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJCQlyb2xlRGVzYywgLTEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdCBmaW5kUm9sZURlc2NyaXB0b3IoT2JqZWN0IG9iaikgewotCQlMaXN0IHRlYW1Sb2xlcyA9ICgoVGVhbVByb2ZpbGUpIGVsZW1lbnQpLmdldFRlYW1Sb2xlcygpOwotCQlMaXN0IHJvbGVEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gdGVhbVJvbGVzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0b3JPYmplY3QgPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJaWYgKGl0b3JPYmplY3QgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJCUxpc3QgZmlyc3RPYmplY3RBZ2dSb2xlcyA9ICgoQ29tcG9zaXRlUm9sZSkgb2JqKQotCQkJCQkJCS5nZXRBZ2dyZWdhdGVkUm9sZXMoKTsKLQkJCQkJTGlzdCBzZWNvbmRPYmplY3RBZ2dSb2xlcyA9ICgoQ29tcG9zaXRlUm9sZSkgaXRvck9iamVjdCkKLQkJCQkJCQkuZ2V0QWdncmVnYXRlZFJvbGVzKCk7Ci0JCQkJCWlmIChmaXJzdE9iamVjdEFnZ1JvbGVzLmVxdWFscyhzZWNvbmRPYmplY3RBZ2dSb2xlcykpIHsKLQkJCQkJCXJvbGVEZXNjTGlzdC5hZGQoaXRvck9iamVjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKChpdG9yT2JqZWN0IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpCi0JCQkJCQkmJiAoIShpdG9yT2JqZWN0IGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkpKSB7Ci0JCQkJCU9iamVjdCBvYmpSb2xlID0gKChSb2xlRGVzY3JpcHRvcikgb2JqKS5nZXRSb2xlKCk7Ci0JCQkJCU9iamVjdCBpdG9yT2JqUm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIGl0b3JPYmplY3QpCi0JCQkJCQkJLmdldFJvbGUoKTsKLQkJCQkJaWYgKG9ialJvbGUuZXF1YWxzKGl0b3JPYmpSb2xlKSkgewotCQkJCQkJcm9sZURlc2NMaXN0LmFkZChpdG9yT2JqZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByb2xlRGVzY0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI29wZW5BZGREaWFsb2coKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5BZGREaWFsb2coKSB7Ci0JCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IFByb2Nlc3NVdGlsCi0JCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50TGlzdCgoKFRlYW1Qcm9maWxlKSBlbGVtZW50KQotCQkJCQkJLmdldFRlYW1Sb2xlcygpKTsKLQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBnZXRGaWx0ZXIoKSwgZWxlbWVudCwKLQkJCQlGaWx0ZXJDb25zdGFudHMuUk9MRV9ERVNDUklQVE9SUywgZXhpc3RpbmdFbGVtZW50cyk7Ci0JCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuUk9MRVMpOwotCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nW117RmlsdGVyQ29uc3RhbnRzLlJPTEVTfTsKLQkJZmQuc2V0VHlwZXMoc3RyKTsKLQkJZmQub3BlbigpOwotCQlhZGQoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jb3BlbkFkZEZyb21Qcm9jZXNzRGlhbG9nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQWRkRnJvbVByb2Nlc3NEaWFsb2coKSB7Ci0JCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9ICgoVGVhbVByb2ZpbGUpIGVsZW1lbnQpLmdldFRlYW1Sb2xlcygpOwotCQlQcm9jZXNzIHByb2Nlc3MgPSAoUHJvY2VzcykgZ2V0UHJvY2VzcyhlbGVtZW50KTsKLQkJSUZpbHRlciBkZXNjcmlwdG9yRmlsdGVyID0gZ2V0RGVzY3JpcHRvckZpbHRlcigpOwotCi0JCWlmIChkZXNjcmlwdG9yRmlsdGVyICE9IG51bGwgJiYgcHJvY2VzcyAhPSBudWxsKSB7Ci0JCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQlkZXNjcmlwdG9yRmlsdGVyLCBwcm9jZXNzLAotCQkJCQlGaWx0ZXJDb25zdGFudHMuUk9MRV9ERVNDUklQVE9SUywgZXhpc3RpbmdFbGVtZW50cyk7Ci0JCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5ST0xFX0RFU0NSSVBUT1JTKTsKLQkJCWZkLm9wZW4oKTsKLQkJCWFkZEZyb21Qcm9jZXNzKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgcGFyZW50IEZpbmQgcGFyZW50IHVudGlsIGl0J3MgYWN0aXZpdHkuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICogCQkJUHJvY2VzcwotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvY2VzcyhCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQpIHsKLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJcmV0dXJuIHBhcmVudDsKLQotCQl9IGVsc2UgewotCQkJcmV0dXJuIGdldFByb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgZGVzY3JpcHRvciBmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXREZXNjcmlwdG9yRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IERlc2NyaXB0b3JQcm9jZXNzRmlsdGVyKGdldENvbmZpZ3VyYXRpb24oKSkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJCUxpc3QgcGFyZW50c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWdldEFjdGl2aXRpZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCBlbGVtZW50LCBwYXJlbnRzTGlzdCk7Ci0JCQkJCWlmIChwYXJlbnRzTGlzdC5jb250YWlucyhvYmopKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWlmIChvYmouZXF1YWxzKGdldFBhcmVudEFjdGl2aXR5KGVsZW1lbnQpKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlMaXN0IGNoaWxkTGlzdCA9ICgoQWN0aXZpdHkpIG9iaikuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCQkJaWYgKGNoaWxkTGlzdC5jb250YWlucyhnZXRQYXJlbnRBY3Rpdml0eShlbGVtZW50KSkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJTGlzdCBsaXN0ID0gZ2V0QWxsb3dhYmxlQWN0aXZpdGllcygpOwotCQkJCQlpZiAobGlzdC5jb250YWlucyhvYmopKXsKLQkJCQkJCUxpc3QgYmVsZW1lbnRzID0gKChBY3Rpdml0eSlvYmopLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQkJCQlpZighYmVsZW1lbnRzLmlzRW1wdHkoKSl7Ci0JCQkJCQkJaWYoY29udGFpbnNUeXBlKGJlbGVtZW50cywgUm9sZURlc2NyaXB0b3IuY2xhc3MsCi0JCQkJCQkJCQkJCWdldEhlbHBlcigpKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJT2JqZWN0IHBhcmVudEFjdGl2aXR5ID0gZ2V0UGFyZW50QWN0aXZpdHkoKEJyZWFrZG93bkVsZW1lbnQpIG9iaik7Ci0JCQkJCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnRBY3Rpdml0eShlbGVtZW50KTsKLQkJCQkJaWYgKHBhcmVudC5lcXVhbHMocGFyZW50QWN0aXZpdHkpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0KLQkJCQkJaWYgKHBhcmVudEFjdGl2aXR5IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCWlmIChnZXRCYXNlQWN0aXZpdGllcygoQWN0aXZpdHkpIHBhcmVudCkuY29udGFpbnMoCi0JCQkJCQkJCXBhcmVudEFjdGl2aXR5KSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCWlmIChnZXRBbGxvd2FibGVBY3Rpdml0aWVzKCkuY29udGFpbnMocGFyZW50QWN0aXZpdHkpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIKLQkJCQkJCXx8IG9iaiBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGVXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkJLmdldFBhcmVudChvYmopOwotCQkJCQlpZiAoZ2V0UGFyZW50QWN0aXZpdHkoZWxlbWVudCkuZXF1YWxzKG9iamVjdCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkJfHwgb2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJb2JqZWN0ID0gKChBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iamVjdCkKLQkJCQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCQkJfQotCQkJCQkJaWYgKGdldEFsbG93YWJsZUFjdGl2aXRpZXMoKS5jb250YWlucyhvYmplY3QpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJT2JqZWN0IHBhcmVudCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCQkuZ2V0UGFyZW50KG9iaik7Ci0JCQkJCWlmIChnZXRQYXJlbnRBY3Rpdml0eShlbGVtZW50KS5lcXVhbHMocGFyZW50KSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlPYmplY3Qgb2JqZWN0ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCUxpc3QgbGlzdCA9IGdldEFsbG93YWJsZUFjdGl2aXRpZXMoKTsKLQkJCQkJCWlmIChsaXN0LmNvbnRhaW5zKG9iamVjdCkpewotCQkJCQkJCS8vcmV0dXJuIHRydWU7Ci0JCQkJCQkJTGlzdCBiZWxlbWVudHMgPSAoKEFjdGl2aXR5KW9iaikuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCQkJCQlpZighYmVsZW1lbnRzLmlzRW1wdHkoKSl7Ci0JCQkJCQkJCWlmKGNvbnRhaW5zVHlwZShiZWxlbWVudHMsIFJvbGVEZXNjcmlwdG9yLmNsYXNzLGdldEhlbHBlcigpKSkKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBMaXN0IGdldEJhc2VBY3Rpdml0aWVzKEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKCFhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKQotCQkJCS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLk5BX0xJVEVSQUwpKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkJCWlmICgodmUgIT0gbnVsbCkgJiYgKHZlIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0KLQkJCQlsaXN0LmFkZCh2ZSk7Ci0KLQkJCQlhY3Rpdml0eSA9IChBY3Rpdml0eSkgdmU7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQgYWN0aXZpdHkgZm9yIGJyZWFrZG93bmVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gYnJFbGVtZW50Ci0JICogQHJldHVybgotCSAqIAkJCVBhcmVudCBhY3Rpdml0eQotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldFBhcmVudEFjdGl2aXR5KEJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGJyRWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJYnJFbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudDsKLQkJCWFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYnJFbGVtZW50LAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsbCBjaGlsZHJlbiBvZiB0aGUgYWN0aXZpdHkgcGFyZW50IHJlY3Vyc2l2ZWx5LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gYWN0aXZpdHlMaXN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGdldENoaWxkQWN0aXZpdGllc0luU2NvcGUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlBY3Rpdml0eSBwYXJlbnQsIExpc3QgYWN0aXZpdHlMaXN0KSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0KLQkJT2JqZWN0IG8gPSBhZGFwdGVyLmdldENoaWxkcmVuKHBhcmVudCk7Ci0JCWlmIChvIGluc3RhbmNlb2YgTGlzdCkgewotCQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBvOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWFjdGl2aXR5TGlzdC5hZGQob2JqKTsKLQkJCQlnZXRDaGlsZEFjdGl2aXRpZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIG9iaiwKLQkJCQkJCWFjdGl2aXR5TGlzdCk7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJT2JqZWN0IG8xID0gKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmopLmdldFZhbHVlKCk7Ci0JCQkJCWFjdGl2aXR5TGlzdC5hZGQobzEpOwotCQkJCQlnZXRDaGlsZEFjdGl2aXRpZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIG8xLAotCQkJCQkJCWFjdGl2aXR5TGlzdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zVHlwZShMaXN0IGxpc3QsIENsYXNzIGNsYXNzMSwgRmlsdGVySGVscGVyIGhlbHBlcikgewotCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgCi0JCQkJCSYmIGNsYXNzMS5pc0luc3RhbmNlKG9iaikKLQkJCQkJJiYgaGVscGVyLm1hdGNoZXIob2JqKSkgCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJcmV0dXJuIGNvbnRhaW5zVHlwZSgoKEFjdGl2aXR5KW9iaikuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSwKLQkJCQkJCWNsYXNzMSwgaGVscGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsbCBhY3Rpdml0aWVzIGluIHNjb3BlCi0JICogCi0JICogQHJldHVybgotCSAqIAkJTGlzdCBvZiBhY3Rpdml0aWVzIGluIHNjb3BlCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldEFsbG93YWJsZUFjdGl2aXRpZXMoKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gcGFyZW50IGFjdGl2aXR5Ci0JCU9iamVjdCBvYmplY3QgPSBnZXRQYXJlbnRBY3Rpdml0eShlbGVtZW50KTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJLy8gZ2V0IGFsbCBjaGlsZCBhY3Rpdml0aWVzIGluIHNjb3BlCi0JCQlnZXRDaGlsZEFjdGl2aXRpZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIG9iamVjdCwgbGlzdCk7Ci0JCX0KLQkJLy8gZ2V0IGJhc2UgYWN0aXZpdGllcyBmb3IgYWxsIGFjdGl2aXRpZXMgaW4gc2NvcGUKLQkJSGFzaFNldCBiYXNlQWN0aXZ0aWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWJhc2VBY3RpdnRpZXMuYWRkQWxsKGdldEJhc2VBY3Rpdml0aWVzKChBY3Rpdml0eSkgb2JqKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyByZXR1cm4gY29tcGxldGUgbGlzdCBvZiBjaGlsZCBhY3Rpdml0aWVzIGFuZCBpdCdzIGJhc2UgYWN0aXZpdGllcwotCQlsaXN0LmFkZEFsbChiYXNlQWN0aXZ0aWVzKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1dvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1dvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTNlMjlmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29sdW1uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib0JveENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogVGhlIGdlbmVyYWwgdGFiIHNlY3Rpb24gZm9yIFdvcmtCcmVha2Rvd25FbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24gZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24gewotCXByb3RlY3RlZCBXb3JrQnJlYWtkb3duRWxlbWVudCBlbGVtZW50OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBldmVudERyaXZlbkJ1dHRvbiwgb25nb2luZ0J1dHRvbiwgcmVwZWF0YWJsZUJ1dHRvbjsKLQotCS8vIHByb3RlY3RlZCBUZXh0IHByZWRlY2Vzc29yVGV4dDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGFkZEJ1dHRvbiwgZWRpdEJ1dHRvbiwgcmVtb3ZlQnV0dG9uOwotCi0JLy8gcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBldmVudERyaXZlbkJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyOwotCS8vIHByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgb25nb2luZ0J1dHRvblNlbGVjdGlvbkxpc3RlbmVyOwotCS8vIHByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgcmVwZWF0YWJsZUJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyOwotCi0JLy8gcHJpdmF0ZSBMaXN0ZW5lciBwcmVkZWNlc3NvcnNMaXN0ZW5lcjsKLQotCS8vIHByaXZhdGUgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmlld2VyOwotCi0JLy8gcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQlwcml2YXRlIFRleHRDZWxsRWRpdG9yIHRleHRDZWxsRWRpdG9yOwotCi0JcHJpdmF0ZSBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgaWRDZWxsRWRpdG9yOwotCi0JcHJpdmF0ZSBDb21ib0JveENlbGxFZGl0b3IgY29tYm9Cb3hDZWxsRWRpdG9yOwotCi0JLy8gcHJlZGVjZXNzb3IgbWFwIGxpc3QKLQlwcml2YXRlIExpc3QgcHJlZE1hcExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGNsYXNzIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBleHRlbmRzIFRleHRDZWxsRWRpdG9yIHsKLQkJcHJvdGVjdGVkIE9iamVjdCBsYXN0SW52YWxpZEVsZW1lbnQ7Ci0KLQkJcHJpdmF0ZSBpbnQgY29sdW1uSW5kZXg7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBwYXJlbnQKLQkJICovCi0JCXB1YmxpYyBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIocGFyZW50KTsKLQkJfQotCi0JCXZvaWQgc2V0Q29sdW1uSW5kZXgoaW50IGNvbHVtbkluZGV4KSB7Ci0JCQl0aGlzLmNvbHVtbkluZGV4ID0gY29sdW1uSW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvbHVtbkluZGV4KCkgewotCQkJcmV0dXJuIGNvbHVtbkluZGV4OwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRMYXN0SW52YWxpZEVsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gbGFzdEludmFsaWRFbGVtZW50OwotCQl9Ci0KLQkJU3RyaW5nIGlzVmFsaWQoU3RyaW5nIHR4dCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCU9iamVjdCBlID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBtc2cgPSBpc1ZhbGlkKGUsIHR4dCk7Ci0JCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCWxhc3RJbnZhbGlkRWxlbWVudCA9IGU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbGFzdEludmFsaWRFbGVtZW50ID0gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIG1zZzsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBpc1ZhbGlkKE9iamVjdCBlLCBTdHJpbmcgdHh0KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKiBEZXBlbmRlbmN5IExpdGVyYWxzICogKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOSVNIX1RPX1NUQVJUID0gUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19TVEFSVDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTklTSF9UT19GSU5JU0ggPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtPcmRlclR5cGVfRklOSVNIX1RPX0ZJTklTSDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RPX1NUQVJUID0gUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX1NUQVJUOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVE9fRklOSVNIID0gUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX0ZJTklTSDsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIENvbHVtbiBpZHMgKiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfSUQgPSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lEOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9QUkVTRU5UQVRJT05fTkFNRSA9IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0RFUEVOREVOQ1kgPSAiZGVwZW5kZW5jeSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKiBDb2x1bW4gZGVzY3JpcHRvciBjb25zdGFudHMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfSUQgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUNPTF9JRCwKLQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfSURfVEVYVCwgMCwgMTAwLCB0cnVlLCBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVCwgU1dULkNFTlRFUik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19QUkVTRU5UQVRJT05fTkFNRSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJQ09MX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9QUkVTRU5UQVRJT05fTkFNRV9URVhULCAxLCAyNTAsIHRydWUsIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9OT05FKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX0RFUEVOREVOQ1kgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUNPTF9ERVBFTkRFTkNZLAotCQkJUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9ERVBFTkRFTkNZX1RFWFQsIDIsIDEwMCwgdHJ1ZSwgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NPTUJPX0JPT0xFQU4pOyAvLyROT04tTkxTLTEkCi0KLQlDb2x1bW5EZXNjcmlwdG9yW10gY29sdW1uRGVzY3JpcHRvcnMgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcltdIHsKLQkJCUNPTF9ERVNDX0lELCBDT0xfREVTQ19QUkVTRU5UQVRJT05fTkFNRSwgQ09MX0RFU0NfREVQRU5ERU5DWSB9OwotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2VsbEVkaXRvclZhbGlkYXRvciBpbXBsZW1lbnRzIElDZWxsRWRpdG9yVmFsaWRhdG9yIHsKLQotCQlwcml2YXRlIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBjZWxsRWRpdG9yOwotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBDZWxsRWRpdG9yVmFsaWRhdG9yKFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBjZWxsRWRpdG9yKSB7Ci0JCQl0aGlzLmNlbGxFZGl0b3IgPSBjZWxsRWRpdG9yOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChPYmplY3QgdmFsdWUpIHsKLQkJCXJldHVybiBjZWxsRWRpdG9yLmlzVmFsaWQoKFN0cmluZykgdmFsdWUpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFZhbGlkYXRpbmdEZWFjdGl2YXRlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JCXByaXZhdGUgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGNlbGxFZGl0b3I7Ci0KLQkJVmFsaWRhdGluZ0RlYWN0aXZhdGVMaXN0ZW5lcihWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgY2VsbEVkaXRvcikgewotCQkJdGhpcy5jZWxsRWRpdG9yID0gY2VsbEVkaXRvcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlZhbGlkYXREZWFjdGl2YXRlZTo6cnVuIik7Ci0JCQkJCWlmIChjZWxsRWRpdG9yLmdldExhc3RJbnZhbGlkRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gY2VsbEVkaXRvci5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJCQkJCVN0cmluZyB0aXRsZSA9IGdldEVkaXRvcigpLmdldFRpdGxlKCk7Ci0JCQkJCQlTdHJpbmcgcHJvYmxlbSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX3RleHRFZGl0Q2VsbF9wcm9ibGVtX21zZzsgLy8kTk9OLU5MUy0xJAotCQkJCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQkJCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBwcm9ibGVtLCBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdmlld2VyLmVkaXRFbGVtZW50KGNlbGxFZGl0b3IuZ2V0TGFzdEludmFsaWRFbGVtZW50KCksCi0JCQkJCQkJCWNlbGxFZGl0b3IuZ2V0Q29sdW1uSW5kZXgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQotCQkvLyBnZXQgd29ya2JyZWFrZG93bmVsZW1lbnQgb2JqZWN0Ci0JCWVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jY3JlYXRlR2VuZXJhbFNlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdlbmVyYWxTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJc3VwZXIuY3JlYXRlR2VuZXJhbFNlY3Rpb24oY29tcG9zaXRlKTsKLQotCQkvLyBFdmVudCBEcml2ZW4KLQkJZXZlbnREcml2ZW5CdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCWV2ZW50RHJpdmVuQnV0dG9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrQnJlYWtkb3duRWxlbWVudF9FdmVudERyaXZlbik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBPbmdvaW5nCi0JCW9uZ29pbmdCdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCW9uZ29pbmdCdXR0b24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtCcmVha2Rvd25FbGVtZW50X09uZ29pbmcpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gcmVwZWF0YWJsZQotCQlyZXBlYXRhYmxlQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUNoZWNrQnV0dG9uKHRvb2xraXQsIGNoZWNrQm94Q29tcG9zaXRlLAotCQkJCTIpOwotCQlyZXBlYXRhYmxlQnV0dG9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrQnJlYWtkb3duRWxlbWVudF9SZXBlYXRhYmxlKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHByZWRlY2Vzc29ycwotCQkvLyBGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJLy8gUHJvcGVydGllc1Jlc291cmNlcy5nZXRTdHJpbmcoIldvcmtCcmVha2Rvd25FbGVtZW50LlByZWRlY2Vzc29ycyIpKTsKLQkJLy8gcHJlZGVjZXNzb3JUZXh0ID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJLy8gU1dULkRFRkFVTFQsIGhvcml6b250YWxTcGFuKTsKLQkJLy8gcHJlZGVjZXNzb3JUZXh0LnNldFRleHQoZ2V0UHJlZGVjZXNzb3JzTGlzdCgpKTsKLQotCQkvLyBkZXBlbmVuY3kgdHlwZQotCi0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3kpOyAvLyROT04tTkxTLTEkCi0KLQkJdHJ5IHsKLQkJCS8vIGNyZWF0ZSB2aWV3ZXIKLQkJCWNyZWF0ZVZpZXdlcihnZW5lcmFsQ29tcG9zaXRlLCAyKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciBjcmVhdGluZyB2aWV3ZXIgZm9yIHdvcmticmVha2Rvd24gZWxlbWVudCBnZW5lcmFsIHNlY3Rpb246ICIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gY3JlYXRlIGJ1dHRvbiBwYW5lCi0JCUNvbXBvc2l0ZSBidXR0b25QYW5lID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCWJ1dHRvblBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOwotCQlidXR0b25QYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgYnV0dG9uUGFuZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uUGFuZSwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQWRkKTsgLy8kTk9OLU5MUy0xJAotCQllZGl0QnV0dG9uID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBidXR0b25QYW5lLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9FZGl0KTsgLy8kTk9OLU5MUy0xJAotCQlyZW1vdmVCdXR0b24gPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIGJ1dHRvblBhbmUsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X1JlbW92ZSk7IC8vJE5PTi1OTFMtMSQKLQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0KLQkJZXZlbnREcml2ZW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQllbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKGV2ZW50RHJpdmVuQnV0dG9uLmdldFNlbGVjdGlvbigpKSwgLTEpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCQlldmVudERyaXZlbkJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRJc0V2ZW50RHJpdmVuKCkKLQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCW9uZ29pbmdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQllbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCksIEJvb2xlYW4KLQkJCQkJCQkJLnZhbHVlT2Yob25nb2luZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKSksIC0xKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJb25nb2luZ0J1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRJc09uZ29pbmcoKQotCQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJcmVwZWF0YWJsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihyZXBlYXRhYmxlQnV0dG9uLmdldFNlbGVjdGlvbigpKSwgLTEpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCQlyZXBlYXRhYmxlQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldElzUmVwZWF0YWJsZSgpCi0JCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIExpc3QgcHJlZExpc3QgPSBlbGVtZW50LmdldExpbmtUb1ByZWRlY2Vzc29yKCk7Ci0JCQkJV29ya09yZGVyIG8gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrT3JkZXIoKTsKLQkJCQlvLnNldExpbmtUeXBlKFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX1NUQVJUX0xJVEVSQUwpOwotCi0JCQkJLy8gcHJlZExpc3QuYWRkKG8pOwotCi0JCQkJUHJlZGVjZXNzb3JNYXAgbWFwID0gbmV3IFByZWRlY2Vzc29yTWFwKC0xLCAoV29ya09yZGVyKSBvKTsKLQkJCQlwcmVkTWFwTGlzdC5hZGQobWFwKTsKLQotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJdmlld2VyLmVkaXRFbGVtZW50KG1hcCwgMCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWVkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGdldCBzZWxlY3Rpb24KLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQlQcmVkZWNlc3Nvck1hcCBwcmVkTWFwID0gKFByZWRlY2Vzc29yTWFwKSBzZWxlY3Rpb24KLQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0QlNBZGFwdGVyKCk7Ci0JCQkJCU9iamVjdCBwcm9jZXNzID0gYWRhcHRlci5nZXRUb3BJdGVtKCk7Ci0KLQkJCQkJUHJlZGVjZXNzb3JEaWFsb2cgZGxnID0gbmV3IFByZWRlY2Vzc29yRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkuZ2V0U2hlbGwoKSwgZWxlbWVudCwgcHJvY2VzcywgZ2V0QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQlwcmVkTWFwLCBwcmVkTWFwTGlzdCwgYWN0aW9uTWdyKTsKLQkJCQkJZGxnLm9wZW4oKTsKLQotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlyZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCVByZWRlY2Vzc29yTWFwIG1hcCA9IChQcmVkZWNlc3Nvck1hcCkgc2VsZWN0aW9uCi0JCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlwcmVkTWFwTGlzdC5yZW1vdmUobWFwKTsKLQotCQkJCQlXb3JrT3JkZXIgd28gPSBtYXAuZ2V0V29ya09yZGVyKCk7Ci0JCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHdiZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQl3YmUsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSwKLQkJCQkJCQkJCXdvLCAtMSk7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQl9Ci0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEgJiYgZWRpdGFibGUpIHsKLQkJCQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCWVkaXRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBwcmVkZWNlc3NvcnMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JLy8gcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZGVjZXNzb3JzTGlzdCgpCi0JLy8gewotCS8vIElCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0QlNBZGFwdGVyKCk7Ci0JLy8gcmV0dXJuIGFkYXB0ZXIuZ2V0QXR0cmlidXRlKGVsZW1lbnQsIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTKTsKLQkvLyB9Ci0JLy8gcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkKLQkvLyB7Ci0JLy8gc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0JLy8JCQotCS8vIGV2ZW50RHJpdmVuQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50RHJpdmVuQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIpOwotCS8vIG9uZ29pbmdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIob25nb2luZ0J1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQkvLyByZXBlYXRhYmxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHJlcGVhdGFibGVCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0JLy8gLy9wcmVkZWNlc3NvclRleHQuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIHByZWRlY2Vzc29yc0xpc3RlbmVyKTsKLQkvLyB9Ci0JLy8JCi0JLy8gcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTGlzdGVuZXJzKCkKLQkvLyB7Ci0JLy8gc3VwZXIucmVtb3ZlTGlzdGVuZXJzKCk7Ci0JLy8JCQkKLQkvLyBldmVudERyaXZlbkJ1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihldmVudERyaXZlbkJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQkvLyBvbmdvaW5nQnV0dG9uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKG9uZ29pbmdCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0JLy8gcmVwZWF0YWJsZUJ1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihyZXBlYXRhYmxlQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIpOwotCS8vIC8vcHJlZGVjZXNzb3JUZXh0LnJlbW92ZUxpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBwcmVkZWNlc3NvcnNMaXN0ZW5lcik7Ci0JLy8gfQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlzdXBlci51cGRhdGVDb250cm9scygpOwotCQlldmVudERyaXZlbkJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJb25nb2luZ0J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJcmVwZWF0YWJsZUJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJdmlld2VyLmdldFRhYmxlKCkuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWFkZEJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSAmJiBlZGl0YWJsZSkgewotCQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotLy8JCWlmICgoRVBGUHJvcGVydHlTaGVldFBhZ2UuZm9ybVBhZ2VJRAotLy8JCQkJLmVxdWFscyhQcm9jZXNzRWRpdG9yLlRBX0ZPUk1fSUQpKQotLy8JCQkJfHwgKEVQRlByb3BlcnR5U2hlZXRQYWdlLmZvcm1QYWdlSUQKLS8vCQkJCQkJLmVxdWFscyhQcm9jZXNzRWRpdG9yLldQQlNfRk9STV9JRCkpKSB7Ci0JCWlmICghKEVQRlByb3BlcnR5U2hlZXRQYWdlLmZvcm1QYWdlSUQuZXF1YWxzKFByb2Nlc3NFZGl0b3IuV0JTX0ZPUk1fSUQpIHx8IEVQRlByb3BlcnR5U2hlZXRQYWdlLmZvcm1QYWdlSUQKLQkJCQkuZXF1YWxzKFByb2Nlc3NFZGl0b3IuQ09OU09MSURBVEVEX0ZPUk1fSUQpKSkgewotCQkJYWRkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXZpZXdlci5nZXRUYWJsZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlzdXBlci5yZWZyZXNoKCk7Ci0JCQkJZWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCi0JCQkJZXZlbnREcml2ZW5CdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0SXNFdmVudERyaXZlbigpCi0JCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCQkJCW9uZ29pbmdCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0SXNPbmdvaW5nKCkKLQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmVwZWF0YWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRJc1JlcGVhdGFibGUoKQotCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQkvLyBwcmVkZWNlc3NvclRleHQuc2V0VGV4dChnZXRQcmVkZWNlc3NvcnNMaXN0KCkpOwotCi0JCQkJLy8gcmUtaW5pdGlhbGl6ZSBwcmVkTGlzdAotCQkJCXByZWRNYXBMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWluaXRpYWxpemVQcmVkTGlzdCgpOwotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciByZWZyZXNoaW5nIFdvcmticmVha2Rvd24gZWxlbWVudCBnZW5lcmFsIHNlY3Rpb246IiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBob3Jpem9udGFsU3BhbikgewotCQkvLyBjcmVhdGUgcHJvY2VzcyB2aWV3ZXIKLQkJdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gMTA7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSA1MDsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBzZXQgdXAgY29sdW1ucwotCQlTdHJpbmdbXSBjb2xQcm9wcyA9IG5ldyBTdHJpbmdbY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJY29sUHJvcHNbaV0gPSBjb2x1bW5EZXNjcmlwdG9yc1tpXS5pZDsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih2aWV3ZXIuZ2V0VGFibGUoKSwKLQkJCQkJY29sdW1uRGVzY3JpcHRvcnNbaV0uYWxpZ25tZW50KTsKLQkJCWNvbHVtbi5zZXRUZXh0KGNvbHVtbkRlc2NyaXB0b3JzW2ldLmxhYmVsKTsKLQkJCWNvbHVtbi5zZXRSZXNpemFibGUoY29sdW1uRGVzY3JpcHRvcnNbaV0ucmVzaXphYmxlKTsKLQkJCWNvbHVtbi5zZXRXaWR0aChjb2x1bW5EZXNjcmlwdG9yc1tpXS53aWR0aCk7Ci0KLQkJfQotCQl2aWV3ZXIuZ2V0VGFibGUoKS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl2aWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhjb2xQcm9wcyk7Ci0KLQkJLy8gdGFibGUgPSB2aWV3ZXIuZ2V0VGFibGUoKTsKLQotCQkvLyBmaW5hbCBUYWJsZUN1cnNvciBjdXJzb3IgPSBuZXcgVGFibGVDdXJzb3IodGFibGUsIFNXVC5OT05FKTsKLQkJLy8gZmluYWwgQ29udHJvbEVkaXRvciBlZGl0b3IgPSBuZXcgQ29udHJvbEVkaXRvcihjdXJzb3IpOwotCQkvLyBlZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQkvLyBlZGl0b3IuZ3JhYlZlcnRpY2FsID0gdHJ1ZTsKLQotCQkvLyBmaW5hbCBUYWJsZUN1cnNvciBjdXJzb3IgPSBuZXcgVGFibGVDdXJzb3IodGFibGUsIFNXVC5OT05FKTsKLQkJLy8gLy8gY3JlYXRlIGFuIGVkaXRvciB0byBlZGl0IHRoZSBjZWxsIHdoZW4gdGhlIHVzZXIgaGl0cyAiRU5URVIiCi0JCS8vIC8vIHdoaWxlIG92ZXIgYSBjZWxsIGluIHRoZSB0YWJsZQotCQkvLyBmaW5hbCBDb250cm9sRWRpdG9yIGVkaXRvciA9IG5ldyBDb250cm9sRWRpdG9yKGN1cnNvcik7Ci0JCS8vIGVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCS8vIGVkaXRvci5ncmFiVmVydGljYWwgPSB0cnVlOwotCQkvLwotCQkvLyBjdXJzb3IuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCS8vIC8vIHdoZW4gdGhlIFRhYmxlRWRpdG9yIGlzIG92ZXIgYSBjZWxsLCBzZWxlY3QgdGhlIGNvcnJlc3BvbmRpbmcgcm93Ci0JCS8vIGluCi0JCS8vIC8vIHRoZSB0YWJsZQotCQkvLyBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCS8vIHRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10geyBjdXJzb3IuZ2V0Um93KCl9KTsKLQkJLy8gfQotCQkvLyAvLyB3aGVuIHRoZSB1c2VyIGhpdHMgIkVOVEVSIiBpbiB0aGUgVGFibGVDdXJzb3IsIHBvcCB1cCBhIHRleHQKLQkJLy8gZWRpdG9yIHNvIHRoYXQKLQkJLy8gLy8gdGhleSBjYW4gY2hhbmdlIHRoZSB0ZXh0IG9mIHRoZSBjZWxsCi0JCS8vIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCS8vIGZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KGN1cnNvciwgU1dULk5PTkUpOwotCQkvLyBUYWJsZUl0ZW0gcm93ID0gY3Vyc29yLmdldFJvdygpOwotCQkvLyBpbnQgY29sdW1uID0gY3Vyc29yLmdldENvbHVtbigpOwotCQkvLyB0ZXh0LnNldFRleHQocm93LmdldFRleHQoY29sdW1uKSk7Ci0JCS8vIHRleHQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCS8vIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkvLyAvLyBjbG9zZSB0aGUgdGV4dCBlZGl0b3IgYW5kIGNvcHkgdGhlIGRhdGEgb3ZlcgotCQkvLyAvLyB3aGVuIHRoZSB1c2VyIGhpdHMgIkVOVEVSIgotCQkvLyBpZiAoZS5jaGFyYWN0ZXIgPT0gU1dULkNSKSB7Ci0JCS8vIFRhYmxlSXRlbSByb3cgPSBjdXJzb3IuZ2V0Um93KCk7Ci0JCS8vIGludCBjb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uKCk7Ci0JCS8vIGlmIChjb2x1bW4gPT0gMSkgcmV0dXJuOwotCQkvLyByb3cuc2V0VGV4dChjb2x1bW4sIHRleHQuZ2V0VGV4dCgpKTsKLQkJLy8gdGV4dC5kaXNwb3NlKCk7Ci0JCS8vIH0KLQkJLy8gLy8gY2xvc2UgdGhlIHRleHQgZWRpdG9yIHdoZW4gdGhlIHVzZXIgaGl0cyAiRVNDIgotCQkvLyBpZiAoZS5jaGFyYWN0ZXIgPT0gU1dULkVTQykgewotCQkvLyB0ZXh0LmRpc3Bvc2UoKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0pOwotCQkvLyBlZGl0b3Iuc2V0RWRpdG9yKHRleHQpOwotCQkvLyB0ZXh0LnNldEZvY3VzKCk7Ci0JCS8vIH0KLQkJLy8gfSk7Ci0JCS8vIC8vIEhpZGUgdGhlIFRhYmxlQ3Vyc29yIHdoZW4gdGhlIHVzZXIgaGl0cyB0aGUgIkNUUkwiIG9yICJTSElGVCIga2V5LgotCQkvLyAvLyBUaGlzIGFsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCBtdWx0aXBsZSBpdGVtcyBpbiB0aGUgdGFibGUuCi0JCS8vIGN1cnNvci5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJLy8gcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCS8vIGlmIChlLmtleUNvZGUgPT0gU1dULkNUUkwKLQkJLy8gfHwgZS5rZXlDb2RlID09IFNXVC5TSElGVAotCQkvLyB8fCAoZS5zdGF0ZU1hc2sgJiBTV1QuQ09OVFJPTCkgIT0gMAotCQkvLyB8fCAoZS5zdGF0ZU1hc2sgJiBTV1QuU0hJRlQpICE9IDApIHsKLQkJLy8gY3Vyc29yLnNldFZpc2libGUoZmFsc2UpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfSk7Ci0JCS8vIC8vIFNob3cgdGhlIFRhYmxlQ3Vyc29yIHdoZW4gdGhlIHVzZXIgcmVsZWFzZXMgdGhlICJTSElGVCIgb3IgIkNUUkwiCi0JCS8vIGtleS4KLQkJLy8gLy8gVGhpcyBzaWduYWxzIHRoZSBlbmQgb2YgdGhlIG11bHRpcGxlIHNlbGVjdGlvbiB0YXNrLgotCQkvLyB0YWJsZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJLy8gcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkvLyBpZiAoZS5rZXlDb2RlID09IFNXVC5DT05UUk9MICYmIChlLnN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkKLQkJLy8gcmV0dXJuOwotCQkvLyBpZiAoZS5rZXlDb2RlID09IFNXVC5TSElGVCAmJiAoZS5zdGF0ZU1hc2sgJiBTV1QuQ09OVFJPTCkgIT0gMCkKLQkJLy8gcmV0dXJuOwotCQkvLyBpZiAoZS5rZXlDb2RlICE9IFNXVC5DT05UUk9MCi0JCS8vICYmIChlLnN0YXRlTWFzayAmIFNXVC5DT05UUk9MKSAhPSAwKQotCQkvLyByZXR1cm47Ci0JCS8vIGlmIChlLmtleUNvZGUgIT0gU1dULlNISUZUICYmIChlLnN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkKLQkJLy8gcmV0dXJuOwotCQkvLwotCQkvLyBUYWJsZUl0ZW1bXSBzZWxlY3Rpb24gPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJLy8gVGFibGVJdGVtIHJvdyA9IChzZWxlY3Rpb24ubGVuZ3RoID09IDApID8KLQkJLy8gdGFibGUuZ2V0SXRlbSh0YWJsZS5nZXRUb3BJbmRleCgpKSA6IHNlbGVjdGlvblswXTsKLQkJLy8gdGFibGUuc2hvd0l0ZW0ocm93KTsKLQkJLy8gY3Vyc29yLnNldFNlbGVjdGlvbihyb3csIDApOwotCQkvLyBjdXJzb3Iuc2V0VmlzaWJsZSh0cnVlKTsKLQkJLy8gY3Vyc29yLnNldEZvY3VzKCk7Ci0JCS8vIH0KLQkJLy8gfSk7Ci0KLQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcmVkTWFwTGlzdDo6IitwcmVkTWFwTGlzdCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJcmV0dXJuICgoTGlzdCkgcHJlZE1hcExpc3QpLnRvQXJyYXkoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0KLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iaiwgaW50IGkpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb246OmxhYmVsUHJvdmlkZXIKLQkJCQkvLyBPYmplY3QtICIgKyBvYmopOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcmVkZWNlc3Nvck1hcCkgewotCQkJCQlpbnQgaWQgPSAoKFByZWRlY2Vzc29yTWFwKSBvYmopLmdldElkKCk7Ci0JCQkJCVdvcmtPcmRlciB3byA9ICgoUHJlZGVjZXNzb3JNYXApIG9iaikuZ2V0V29ya09yZGVyKCk7Ci0KLQkJCQkJaWYgKGkgPT0gMCkgewotCQkJCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGlkKTsKLQkJCQkJfQotCQkJCQlpZiAoaSA9PSAxKSB7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAod28uZ2V0UHJlZCgpICE9IG51bGwpIHsKLQkJCQkJCQluYW1lID0gd28uZ2V0UHJlZCgpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQkJCQlpZiAoU3RyVXRpbC5pc0JsYW5rKG5hbWUpKSB7Ci0JCQkJCQkJCXJldHVybiB3by5nZXRQcmVkKCkuZ2V0TmFtZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXJldHVybiBuYW1lOwotCQkJCQl9Ci0JCQkJCWlmIChpID09IDIpIHsKLQkJCQkJCWlmICh3by5nZXRMaW5rVHlwZSgpLmdldFZhbHVlKCkgPT0gV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fRklOSVNIKQotCQkJCQkJCXJldHVybiBGSU5JU0hfVE9fRklOSVNIOwotCQkJCQkJZWxzZSBpZiAod28uZ2V0TGlua1R5cGUoKS5nZXRWYWx1ZSgpID09IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX1NUQVJUKQotCQkJCQkJCXJldHVybiBGSU5JU0hfVE9fU1RBUlQ7Ci0JCQkJCQllbHNlIGlmICh3by5nZXRMaW5rVHlwZSgpLmdldFZhbHVlKCkgPT0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19TVEFSVCkKLQkJCQkJCQlyZXR1cm4gU1RBUlRfVE9fU1RBUlQ7Ci0JCQkJCQllbHNlIGlmICh3by5nZXRMaW5rVHlwZSgpLmdldFZhbHVlKCkgPT0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19GSU5JU0gpCi0JCQkJCQkJcmV0dXJuIFNUQVJUX1RPX0ZJTklTSDsKLQkJCQkJCXJldHVybiB3by5nZXRMaW5rVHlwZSgpLmdldE5hbWUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQotCQl0ZXh0Q2VsbEVkaXRvciA9IG5ldyBUZXh0Q2VsbEVkaXRvcih2aWV3ZXIuZ2V0VGFibGUoKSk7Ci0JCWNvbWJvQm94Q2VsbEVkaXRvciA9IG5ldyBDb21ib0JveENlbGxFZGl0b3Iodmlld2VyLmdldFRhYmxlKCksCi0JCQkJbmV3IFN0cmluZ1tdIHsgRklOSVNIX1RPX1NUQVJULCBGSU5JU0hfVE9fRklOSVNILAotCQkJCQkJU1RBUlRfVE9fU1RBUlQsIFNUQVJUX1RPX0ZJTklTSCB9KTsKLQotCQlzZXRDZWxsRWRpdG9ycygpOwotCQlzZXRDZWxsTW9kaWZpZXJzKCk7Ci0KLQkJaW5pdGlhbGl6ZVByZWRMaXN0KCk7Ci0JCXZpZXdlci5zZXRJbnB1dChwcmVkTWFwTGlzdCk7Ci0JCXZpZXdlci5yZWZyZXNoKCk7Ci0KLQl9Ci0KLQlwcml2YXRlIGludCBnZXRDZWxsRWRpdG9yVHlwZShTdHJpbmcgcHJvcGVydHkpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJQ29sdW1uRGVzY3JpcHRvciBkZXNjID0gY29sdW1uRGVzY3JpcHRvcnNbaV07Ci0JCQlpZiAoZGVzYy5pZCA9PSBwcm9wZXJ0eSkgewotCQkJCXJldHVybiBkZXNjLmNlbGxFZGl0b3JUeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfTk9ORTsKLQl9Ci0KLQlwdWJsaWMgQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKFN0cmluZyBjb2x1bW5JRCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChjb2x1bW5JRCA9PSBDT0xfSUQpIHsKLQkJCWlmIChpZENlbGxFZGl0b3IgPT0gbnVsbCkgewotCQkJCWlkQ2VsbEVkaXRvciA9IG5ldyBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3Iodmlld2VyLmdldFRhYmxlKCkpIHsKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBpc1ZhbGlkKE9iamVjdCBlLCBTdHJpbmcgdHh0KSB7Ci0JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvcjo6aXNWYWxpZCIpOwotCQkJCQkJZSA9IFRuZ1V0aWwudW53cmFwKGUpOwotCi0JCQkJCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGdldEJTQWRhcHRlcigpOwotCQkJCQkJT2JqZWN0IHByb2Nlc3MgPSBhZGFwdGVyLmdldFRvcEl0ZW0oKTsKLQotCQkJCQkJTGlzdCBwcmVkZWNlc3NvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQkJCVN0cmluZyBzdHIgPSBnZXRQcmVkSWQoKTsKLQkJCQkJCVN0cmluZyByZXN1bHQgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkuY2hlY2tQcmVkZWNlc3Nvckxpc3Qod2JlLCBzdHIsCi0JCQkJCQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSwgcHJvY2VzcywKLQkJCQkJCQkJCQlwcmVkZWNlc3NvcnMpOwotCi0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCWlkQ2VsbEVkaXRvcgotCQkJCQkJLnNldFZhbGlkYXRvcihuZXcgQ2VsbEVkaXRvclZhbGlkYXRvcihpZENlbGxFZGl0b3IpKTsKLQkJCQlpZENlbGxFZGl0b3IuZ2V0Q29udHJvbCgpLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCQkJbmV3IFZhbGlkYXRpbmdEZWFjdGl2YXRlTGlzdGVuZXIoaWRDZWxsRWRpdG9yKSk7Ci0JCQl9Ci0JCQlpZENlbGxFZGl0b3Iuc2V0Q29sdW1uSW5kZXgoY29sdW1uSW5kZXgpOwotCi0JCQlyZXR1cm4gaWRDZWxsRWRpdG9yOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENlbGxFZGl0b3JzKCkgewotCQlDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvcltjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDZWxsRWRpdG9yIGNlbGxFZGl0b3IgPSBnZXRDZWxsRWRpdG9yKGNvbHVtbkRlc2NyaXB0b3JzW2ldLmlkLCBpKTsKLQkJCWlmIChjZWxsRWRpdG9yICE9IG51bGwpIHsKLQkJCQljZWxsRWRpdG9yc1tpXSA9IGNlbGxFZGl0b3I7Ci0JCQl9IGVsc2UgewotCQkJCXN3aXRjaCAoY29sdW1uRGVzY3JpcHRvcnNbaV0uY2VsbEVkaXRvclR5cGUpIHsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUOgotCQkJCQljZWxsRWRpdG9yc1tpXSA9IHRleHRDZWxsRWRpdG9yOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DT01CT19CT09MRUFOOgotCQkJCQljZWxsRWRpdG9yc1tpXSA9IGNvbWJvQm94Q2VsbEVkaXRvcjsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJY2VsbEVkaXRvcnNbaV0gPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQl2aWV3ZXIuc2V0Q2VsbEVkaXRvcnMoY2VsbEVkaXRvcnMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDZWxsTW9kaWZpZXJzKCkgewotCQkvLyBTZXQgdGhlIGNlbGwgbW9kaWZpZXIKLQkJdmlld2VyLnNldENlbGxNb2RpZmllcihuZXcgSUNlbGxNb2RpZmllcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjYW5Nb2RpZnk6IGVsZW1lbnQ9IitlbGVtZW50KyIsCi0JCQkJLy8gcHJvcGVydHk9Iitwcm9wZXJ0eSk7Ci0JCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIFByZWRlY2Vzc29yTWFwKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmIChwcm9wZXJ0eSA9PSBDT0xfUFJFU0VOVEFUSU9OX05BTUUpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImdldFZhbHVlOiBlbGVtZW50PSIrZWxlbWVudCsiLAotCQkJCS8vIHByb3BlcnR5PSIrcHJvcGVydHkpOwotCi0JCQkJU3RyaW5nIHZhbCA9IG51bGw7Ci0JCQkJc3dpdGNoIChnZXRDZWxsRWRpdG9yVHlwZShwcm9wZXJ0eSkpIHsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUOgotCQkJCQl2YWwgPSBuZXcgSW50ZWdlcigoKFByZWRlY2Vzc29yTWFwKSBlbGVtZW50KS5nZXRJZCgpKQotCQkJCQkJCS50b1N0cmluZygpOwotCQkJCQlyZXR1cm4gdmFsOwotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NPTUJPX0JPT0xFQU46Ci0JCQkJCWludCB2YWx1ZSA9ICgoKFByZWRlY2Vzc29yTWFwKSBlbGVtZW50KS5nZXRXb3JrT3JkZXIoKSkKLQkJCQkJCQkuZ2V0TGlua1R5cGUoKS5nZXRWYWx1ZSgpOwotCQkJCQlpZiAoV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fU1RBUlQgPT0gdmFsdWUpIHsKLQkJCQkJCXJldHVybiBuZXcgSW50ZWdlcigwKTsKLQkJCQkJfSBlbHNlIGlmIChXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0ggPT0gdmFsdWUpIHsKLQkJCQkJCXJldHVybiBuZXcgSW50ZWdlcigxKTsKLQkJCQkJfSBlbHNlIGlmIChXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX1NUQVJUID09IHZhbHVlKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IEludGVnZXIoMik7Ci0JCQkJCX0gZWxzZQotCQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKDMpOwotCi0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb2RpZnkoZmluYWwgT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwKLQkJCQkJT2JqZWN0IHZhbHVlKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJtb2RpZnk6IGVsZW1lbnQ9IitlbGVtZW50KyIsCi0JCQkJLy8gcHJvcGVydHk9Iitwcm9wZXJ0eSsiLCB2YWx1ZT0iK3ZhbHVlKTsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGVsZW1lbnQ7Ci0JCQkJUHJlZGVjZXNzb3JNYXAgcHJlZE1hcCA9IChQcmVkZWNlc3Nvck1hcCkgaXRlbS5nZXREYXRhKCk7Ci0JCQkJV29ya09yZGVyIHdvID0gcHJlZE1hcC5nZXRXb3JrT3JkZXIoKTsKLQotCQkJCWlmIChwcm9wZXJ0eS5lcXVhbHMoQ09MX0lEKSkgewotCQkJCQlpdGVtLnNldFRleHQoMCwgdmFsdWUudG9TdHJpbmcoKSk7Ci0KLQkJCQkJaW50IHByZWRJZDsKLQkJCQkJdHJ5IHsKLQkJCQkJCXByZWRJZCA9IG5ldyBJbnRlZ2VyKHZhbHVlLnRvU3RyaW5nKCkpLmludFZhbHVlKCk7Ci0JCQkJCQlpZiAocHJlZElkIDwgMCkKLQkJCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlclRpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlck1lc3NhZ2UpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlwcmVkTWFwTGlzdC5yZW1vdmUocHJlZE1hcCk7Ci0JCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXByZWRNYXAuc2V0SWQocHJlZElkKTsKLQkJCQl9Ci0KLQkJCQlmaW5hbCBpbnQgY29sdW1uSW5kZXggPSBnZXRDb2x1bW5JbmRleChwcm9wZXJ0eSk7Ci0JCQkJQ2VsbEVkaXRvciBjZWxsRWRpdG9yID0gdmlld2VyLmdldENlbGxFZGl0b3JzKClbY29sdW1uSW5kZXhdOwotCQkJCVN0cmluZyBlcnJNc2cgPSBjZWxsRWRpdG9yLmdldEVycm9yTWVzc2FnZSgpOwotCQkJCWlmIChlcnJNc2cgIT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJV29ya09yZGVyVHlwZSB0eXBlOwotCQkJCXN3aXRjaCAoZ2V0Q2VsbEVkaXRvclR5cGUocHJvcGVydHkpKSB7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVDoKLQotCQkJCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGdldEJTQWRhcHRlcigpOwotCQkJCQlPYmplY3QgcHJvY2VzcyA9IGFkYXB0ZXIuZ2V0VG9wSXRlbSgpOwotCi0JCQkJCUxpc3QgcHJlZGVjZXNzb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIHN0ciA9IGdldFByZWRJZCgpOwotCQkJCQlTdHJpbmcgcmVzdWx0ID0gUHJvY2Vzc1V0aWwuY2hlY2tQcmVkZWNlc3Nvckxpc3Qod2JlLCBzdHIsCi0JCQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSwgcHJvY2VzcywgcHJlZGVjZXNzb3JzKTsKLQotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJCVdvcmtPcmRlciBvID0gbnVsbDsKLQkJCQkJCWludCBzaXplID0gd2JlLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuc2l6ZSgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd2JlLmdldExpbmtUb1ByZWRlY2Vzc29yKCkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCW8gPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpbnQgaWQgPSBwcmVkZWNlc3NvcnMuaW5kZXhPZihvLmdldFByZWQoKSk7Ci0JCQkJCQkJaWYgKGlkID09IC0xKSB7Ci0JCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlzaXplID0gcHJlZGVjZXNzb3JzLnNpemUoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgcHJlZGVjZXNzb3JzCi0JCQkJCQkJCQkuZ2V0KGkpOwotCQkJCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJCQlmaW5kX3ByZWQ6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB3YmUKLQkJCQkJCQkJCS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlvID0gKFdvcmtPcmRlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQlpZiAoby5nZXRQcmVkKCkgPT0gZSkgewotCQkJCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCQkJYnJlYWsgZmluZF9wcmVkOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghZm91bmQpIHsKLQkJCQkJCQkJbyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtPcmRlcigpOwotCQkJCQkJCQlvLnNldFByZWQoZSk7Ci0JCQkJCQkJCW8KLQkJCQkJCQkJCQkuc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fU1RBUlRfTElURVJBTCk7Ci0JCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJCQkJd2JlLAotCQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCksCi0JCQkJCQkJCQkJCQlvLCAtMSk7Ci0JCQkJCQkJCWlmIChzdGF0dXMpIHsKLQkJCQkJCQkJCXByZWRNYXAuc2V0V29ya09yZGVyKG8pOwotCi0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlwcmVkTWFwTGlzdC5yZW1vdmUocHJlZE1hcCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBzaG93IGVycm9yIG1lc3NhZ2UgYm94Ci0JCQkJCQlTdHJpbmcgdGl0bGUgPSBnZXRFZGl0b3IoKS5nZXRUaXRsZSgpOwotCQkJCQkJU3RyaW5nIHByb2JsZW0gPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc19jZWxsRWRpdG9yX2ludmFsaWRQcmVkY2Vzc29yX3Byb2JsZW1fbXNnOyAvLyROT04tTkxTLTEkCi0JCQkJCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQkJCWRpYWxvZy5kaXNwbGF5V2FybmluZyh0aXRsZSwgcHJvYmxlbSwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcHJlZE1hcExpc3QucmVtb3ZlKHByZWRNYXApOwotCQkJCQl9Ci0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ09NQk9fQk9PTEVBTjoKLQkJCQkJaW50IGluZGV4ID0gKChOdW1iZXIpIHZhbHVlKS5pbnRWYWx1ZSgpOwotCQkJCQlpZiAoaW5kZXggPT0gMCkgewotCQkJCQkJdHlwZSA9IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX1NUQVJUX0xJVEVSQUw7Ci0JCQkJCX0gZWxzZSBpZiAoaW5kZXggPT0gMSkgewotCQkJCQkJdHlwZSA9IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX0ZJTklTSF9MSVRFUkFMOwotCQkJCQl9IGVsc2UgaWYgKGluZGV4ID09IDIpIHsKLQkJCQkJCXR5cGUgPSBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX1NUQVJUX0xJVEVSQUw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0eXBlID0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19GSU5JU0hfTElURVJBTDsKLQkJCQkJfQotCi0JCQkJCS8vIHNldCB3b3JrcHJvZHVjdCB0eXBlCi0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidHlwZSAtIit0eXBlKTsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgd28sCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya09yZGVyX0xpbmtUeXBlKCksIHR5cGUsCi0JCQkJCQkJLTEpOwotCQkJCQlicmVhazsKLQotCQkJCWRlZmF1bHQ6Ci0JCQkJCXR5cGUgPSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0hfTElURVJBTDsKLQkJCQl9Ci0KLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgbGlzdCBvZiBpdGVtIHByb3ZpZGVycyBmb3IgcHJlZGVjZXNzb3JzCi0JICogCi0JICogQHJldHVybgotCSAqLwotCS8vIHByaXZhdGUgT2JqZWN0IGdldFByZWRJdGVtUHJvdmlkZXJzKCkKLQkvLyB7Ci0JLy8gSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXRCU0FkYXB0ZXIoKTsKLQkvLyBpZiAoYWRhcHRlciAhPSBudWxsKQotCS8vIHJldHVybiBhZGFwdGVyLmdldFByZWRlY2Vzc29ycygpOwotCS8vICAgIAkKLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0JcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGdldEJTQWRhcHRlcigpIHsKLQkJdHJ5IHsKLQkJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSgpOy8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJCWVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBwcm92aWRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBmYWN0b3J5LmFkYXB0KAotCQkJCQllbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcmV0dXJuIHByb3ZpZGVyOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gY29sdW1uIGluZGV4IGZvciBwcm9wZXJ0eQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGludCBnZXRDb2x1bW5JbmRleChTdHJpbmcgcHJvcGVydHkpIHsKLQkJT2JqZWN0W10gY29sUHJvcHMgPSB2aWV3ZXIuZ2V0Q29sdW1uUHJvcGVydGllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbFByb3BzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29sUHJvcHNbaV0gPT0gcHJvcGVydHkpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNnZXROYW1lUHJlZml4KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVQcmVmaXgoKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfVEVBTV9QUk9GSUxFICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfTUlMRVNUT05FICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfV09SS19QUk9EVUNUX0VMRU1FTlQgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZElkKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHByZWRNYXBMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJUHJlZGVjZXNzb3JNYXAgbWFwID0gKFByZWRlY2Vzc29yTWFwKSBpdG9yLm5leHQoKTsKLQkJCWJ1Zi5hcHBlbmQobWFwLmdldElkKCkpOwotCQkJYnVmLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgcHJlZCBsaXN0Ci0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVQcmVkTGlzdCgpIHsKLQkJdHJ5IHsKLQkJCUxpc3QgcHJlZFByb3ZpZGVycyA9IG51bGw7Ci0KLQkJCS8vIGdldCB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JCQllbGVtZW50ID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0KLQkJCS8vIGdldCBwcmVkZWNlc3NvciBpdGVtIHByb3ZpZGVycwotCQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlJdGVtUHJvdmlkZXJBZGFwdGVyIHByb3ZpZGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGZhY3RvcnkKLQkJCQkJCS5hZGFwdChlbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChwcm92aWRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCQlwcmVkUHJvdmlkZXJzID0gKChJQlNJdGVtUHJvdmlkZXIpIHByb3ZpZGVyKQotCQkJCQkJCS5nZXRQcmVkZWNlc3NvcnMoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG5lZWQgZm9sbG93aW5nIGZvciBzcGVjaWFsIGNhc2UgKFdyYXBwZXJJdGVtUHJvdmlkZXJzKS4KLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlPYmplY3QgaW5wdXQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJcHJlZFByb3ZpZGVycyA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGlucHV0KQotCQkJCQkJCS5nZXRQcmVkZWNlc3NvcnMoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGdldCBsaW5rIHRvIHByZWRlY2Vzc29ycwotCQkJaWYgKChlbGVtZW50ICE9IG51bGwpICYmIChwcmVkUHJvdmlkZXJzICE9IG51bGwpKSB7Ci0JCQkJTGlzdCBwcmVkTGlzdCA9IGVsZW1lbnQuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZW1JdGVyYXRvciA9IHByZWRQcm92aWRlcnMuaXRlcmF0b3IoKTsgaXRlbUl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCU9iamVjdCBpdGVtT2JqID0gKE9iamVjdCkgaXRlbUl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJT2JqZWN0IHRhcmdldE9iaiA9IG51bGw7Ci0JCQkJCWlmIChpdGVtT2JqIGluc3RhbmNlb2YgV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJdGFyZ2V0T2JqID0gKChXcmFwcGVySXRlbVByb3ZpZGVyKSBpdGVtT2JqKS5nZXRWYWx1ZSgpOwotCQkJCQl9Ci0JCQkJCWlmIChpdGVtT2JqIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQkJdGFyZ2V0T2JqID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBpdGVtT2JqKS5nZXRUYXJnZXQoKTsKLQkJCQkJfQotCQkJCQlpZiAodGFyZ2V0T2JqICE9IG51bGwpIHsKLQkJCQkJCWludCBpZCA9ICgoSUJTSXRlbVByb3ZpZGVyKSBpdGVtT2JqKS5nZXRJZCgpOwotCQkJCQkJZm91bmQgPSBhZGRQcmVkZWNlc3NvcihwcmVkTGlzdCwgaWQsIHRhcmdldE9iaik7Ci0KLQkJCQkJCWlmICgoIWZvdW5kKQotCQkJCQkJCQkmJiAodGFyZ2V0T2JqIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSkgewotCQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIHRhcmdldE9iajsKLQkJCQkJCQlpZiAodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsID0gdmUKLQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQkJCQl0YXJnZXRPYmogPSBlbDsKLQotCQkJCQkJCQkvLyBhZGQgYmFzZSB2YXJpYWJpbGl0eSBvYmplY3QKLQkJCQkJCQkJYWRkUHJlZGVjZXNzb3IocHJlZExpc3QsIGlkLCB0YXJnZXRPYmopOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIGZvciAoSXRlcmF0b3IgaXRvcj1wcmVkTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspCi0JCQkJLy8gewotCQkJCS8vIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkvLyBPYmplY3QgbyA9IChPYmplY3QpIGl0b3IubmV4dCgpOwotCQkJCS8vIGlmIChvIGluc3RhbmNlb2YgV29ya09yZGVyKQotCQkJCS8vIHsKLQkJCQkvLyAvL1N5c3RlbS5vdXQucHJpbnRsbigiZ2V0RWxlbWVudDo6V29ya09yZGVyID0gIisgKChXb3JrT3JkZXIpCi0JCQkJLy8gbykuZ2V0UHJlZCgpKTsKLQkJCQkvLyBXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUgPSAoKFdvcmtPcmRlcikgbykuZ2V0UHJlZCgpOwotCQkJCS8vIGlmICh3YmUgIT0gbnVsbCkKLQkJCQkvLyB7Ci0JCQkJLy8gZm9yIChJdGVyYXRvciBpdGVtSXRlcmF0b3I9cHJlZFByb3ZpZGVycy5pdGVyYXRvcigpOwotCQkJCS8vIGl0ZW1JdGVyYXRvci5oYXNOZXh0KCk7KQotCQkJCS8vIHsKLQkJCQkvLyBPYmplY3QgaXRlbU9iaiA9IChPYmplY3QpIGl0ZW1JdGVyYXRvci5uZXh0KCk7Ci0JCQkJLy8gT2JqZWN0IHRhcmdldE9iaiA9IG51bGw7Ci0JCQkJLy8gaWYgKGl0ZW1PYmogaW5zdGFuY2VvZiBXcmFwcGVySXRlbVByb3ZpZGVyKQotCQkJCS8vIHsKLQkJCQkvLyB0YXJnZXRPYmogPSAoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIGl0ZW1PYmopLmdldFZhbHVlKCk7Ci0JCQkJLy8gfQotCQkJCS8vIGlmIChpdGVtT2JqIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikKLQkJCQkvLyB7Ci0JCQkJLy8gdGFyZ2V0T2JqID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKWl0ZW1PYmopLmdldFRhcmdldCgpOwotCQkJCS8vIH0KLQkJCQkvLyBpZiAodGFyZ2V0T2JqICE9IG51bGwpCi0JCQkJLy8gewotCQkJCS8vIGlmICh0YXJnZXRPYmouZXF1YWxzKHdiZSkpCi0JCQkJLy8gewotCQkJCS8vIC8vIGNyZWF0ZSBtYXBPYmplY3RMaXN0Ci0JCQkJLy8gaW50IGlkID0gKChJQlNJdGVtUHJvdmlkZXIpIGl0ZW1PYmopLmdldElkKCk7Ci0JCQkJLy8gUHJlZGVjZXNzb3JNYXAgbWFwID0gbmV3IFByZWRlY2Vzc29yTWFwKGlkLCAoV29ya09yZGVyKSBvKTsKLQkJCQkvLyBwcmVkTWFwTGlzdC5hZGQobWFwKTsKLQkJCQkvLwkJCi0JCQkJLy8gZm91bmQ9dHJ1ZTsKLQkJCQkvLyBicmVhazsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyBpZiAoIWZvdW5kKQotCQkJCS8vIHsKLQkJCQkvLyAvLyBpZiBwcm92aWRlciBpcyBub3QgZm91bmQsIHRoZW4gYWRkIHdpdGggaWQ9MAotCQkJCS8vIC8vIGRvIGl0IG9ubHkgZm9yIFRlYW1BbGxvY2F0aW9uIGFuZCBXb3JrUHJvZHVjdFVzYWdlIHZpZXcKLQkJCQkvLyAvLyBpZgotCQkJCS8vICgoRVBGUHJvcGVydHlTaGVldFBhZ2UuZm9ybVBhZ2VJRC5lcXVhbHMoUHJvY2Vzc0Zvcm1FZGl0b3IuVEFfRk9STV9JRCkpCi0JCQkJLy8gfHwKLQkJCQkvLyAvLwotCQkJCS8vIChFUEZQcm9wZXJ0eVNoZWV0UGFnZS5mb3JtUGFnZUlELmVxdWFscyhQcm9jZXNzRm9ybUVkaXRvci5XUEJTX0ZPUk1fSUQpKSkKLQkJCQkvLyB7Ci0JCQkJLy8gUHJlZGVjZXNzb3JNYXAgbWFwID0gbmV3IFByZWRlY2Vzc29yTWFwKDAsIChXb3JrT3JkZXIpIG8pOwotCQkJCS8vIHByZWRNYXBMaXN0LmFkZChtYXApOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoIkluaXRpYWxpemluZyBQcmVkZWNlc3NvciBMaXN0IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhZGRQcmVkZWNlc3NvcihMaXN0IHByZWRMaXN0LCBpbnQgaWQsIE9iamVjdCB0YXJnZXRPYmopIHsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gcHJlZExpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IChPYmplY3QpIGl0b3IubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImdldEVsZW1lbnQ6OldvcmtPcmRlciA9ICIrICgoV29ya09yZGVyKQotCQkJCS8vIG8pLmdldFByZWQoKSk7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgd2JlID0gKChXb3JrT3JkZXIpIG8pLmdldFByZWQoKTsKLQotCQkJCWlmICh0YXJnZXRPYmouZXF1YWxzKHdiZSkpIHsKLQkJCQkJLy8gY3JlYXRlIG1hcE9iamVjdExpc3QKLQkJCQkJUHJlZGVjZXNzb3JNYXAgbWFwID0gbmV3IFByZWRlY2Vzc29yTWFwKGlkLCAoV29ya09yZGVyKSBvKTsKLQkJCQkJcHJlZE1hcExpc3QuYWRkKG1hcCk7Ci0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGE0OTU2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc1NwZWNpZmljV29ya1Byb2R1Y3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Bc3NpZ25XUFRvRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuTGlua01ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSBnZW5lcmFsIHRhYiBzZWN0aW9uIGZvciBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiBleHRlbmRzCi0JCURlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiB7Ci0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBlbGVtZW50OwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfbWV0aG9kX2VsZW1lbnQ7Ci0KLQlwcml2YXRlIFRleHQgY3RybF93b3JrUHJvZHVjdF90eXBlOwotCi0JcHJpdmF0ZSBUZXh0IGFjdGl2aXR5RW50cnlTdGF0ZSwgYWN0aXZpdHlFeGl0U3RhdGU7Ci0KLQlwcml2YXRlIEJ1dHRvbiBsaW5rQnV0dG9uOwotCi0KLQlwcml2YXRlIFRhYmxlIGN0cmxfdGFibGVfMTsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmlld2VyXzE7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZF8xLCBjdHJsX2FkZF9wcm9jXzEsIGN0cmxfcmVtb3ZlXzE7Ci0KLQlwcml2YXRlIFNlY3Rpb24gZGVsaXZlcmFibGVTZWN0aW9uOwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciB3cE1vZGVsTW9kaWZ5TGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQkvLyBnZXQgV29ya1Byb2R1Y3REZXNjcmlwdG9yIG9iamVjdAotCQllbGVtZW50ID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCB0b2dnbGVTZWN0aW9uKCkgewotCQlpZiAoIShlbGVtZW50LmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkpIHsKLQkJCWlmIChkZWxpdmVyYWJsZVNlY3Rpb24uaXNFeHBhbmRlZCgpKQotCQkJCWRlbGl2ZXJhYmxlU2VjdGlvbi5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JCQlpZiAoZGVsaXZlcmFibGVTZWN0aW9uLmlzVmlzaWJsZSgpKQotCQkJCWRlbGl2ZXJhYmxlU2VjdGlvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmICghZGVsaXZlcmFibGVTZWN0aW9uLmlzRXhwYW5kZWQoKSkKLQkJCQlkZWxpdmVyYWJsZVNlY3Rpb24uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JCQlpZiAoIWRlbGl2ZXJhYmxlU2VjdGlvbi5pc1Zpc2libGUoKSkKLQkJCQlkZWxpdmVyYWJsZVNlY3Rpb24uc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWxpdmVyYWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlTdHJpbmcgc2VjdGlvblRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25UaXRsZTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc2VjdGlvbkRlc2MgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLldQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvbkRlc2NyaXB0aW9uOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0YWJsZVRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1RhYmxlMTsgLy8kTk9OLU5MUy0xJAotCi0JCVNlY3Rpb24gc2VjdGlvbiA9IEZvcm1VSS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQlzZWN0aW9uVGl0bGUsIHNlY3Rpb25EZXNjKTsKLQotCQkvLyBjcmVhdGUgY29tcG9zaXRlCi0JCUNvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uLAotCQkJCTIsIGZhbHNlKTsKLQotCQlDb21wb3NpdGUgcGFuZTEgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUxLCB0YWJsZVRpdGxlKTsKLQotCQlpbnQgdGFibGVIZWlnaHQgPSA4MDsKLQkJY3RybF90YWJsZV8xID0gRm9ybVVJLmNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUxLCB0YWJsZUhlaWdodCk7Ci0JCXZpZXdlcl8xID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdGFibGVfMSk7Ci0JCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlMaXN0IGRlbGl2ZXJhYmxlUGFydHMgPSBlbGVtZW50LmdldERlbGl2ZXJhYmxlUGFydHMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBkZWxpdmVyYWJsZVBhcnRzLml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdG9yCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJaWYgKHdwRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsCi0JCQkJCQkJfHwgd3BEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpCi0JCQkJCQluZXdMaXN0LmFkZCh3cERlc2MpOwotCQkJCX0KLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KG5ld0xpc3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJdmlld2VyXzEuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXZpZXdlcl8xLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXZpZXdlcl8xLnNldElucHV0KGVsZW1lbnQpOwotCi0JCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTIKLQkJQ29tcG9zaXRlIHBhbmUyID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0KLQkJY3RybF9hZGRfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfYWRkX3Byb2NfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZEZyb21Qcm9jZXNzKTsgCi0JCWN0cmxfcmVtb3ZlXzEgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQotCQlkZWxpdmVyYWJsZVNlY3Rpb24gPSBzZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJLy8gaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJLy8gewotCQkvLyBsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJLy8gfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiNjcmVhdGVHZW5lcmFsU2VjdGlvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlzdXBlci5jcmVhdGVHZW5lcmFsU2VjdGlvbihjb21wb3NpdGUpOwotCi0JCS8vIG1ldGhvZCBlbGVtZW50Ci0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfVHlwZV9Xb3JrUHJvZHVjdCk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9tZXRob2RfZWxlbWVudCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJU1dULkRFRkFVTFQsIDEpOwotCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQljdHJsX21ldGhvZF9lbGVtZW50LnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWxpbmtCdXR0b24gPSBGb3JtVUkKLQkJCQkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIFNXVC5QVVNILCAxKTsKLQkJbGlua0J1dHRvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19CdXR0b25fTGlua01ldGhvZEVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0KLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsICIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHR5cGUKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya1Byb2R1Y3RfVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF93b3JrUHJvZHVjdF90eXBlID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlTV1QuREVGQVVMVCwgaG9yaXpvbnRhbFNwYW4pOwotCQljdHJsX3dvcmtQcm9kdWN0X3R5cGUuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50VHlwZShlbGVtZW50KSk7Ci0JCWN0cmxfd29ya1Byb2R1Y3RfdHlwZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkvLyBhY3Rpdml0eUVudHJ5c3RhdGUKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJYWN0aXZpdHlFbnRyeVN0YXRlID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlTV1QuREVGQVVMVCwgaG9yaXpvbnRhbFNwYW4pOwotCi0JCS8vIGFjdGl2aXR5RXhpdHN0YXRlCi0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJYWN0aXZpdHlFeGl0U3RhdGUgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVNXVC5ERUZBVUxULCBob3Jpem9udGFsU3Bhbik7Ci0KLQkJLy8gQ1JFQVRFIERFTElWRVJBQkxFIFNFQ1RJT04KLQkJY3JlYXRlRGVsaXZlcmFibGVTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0JCXRvZ2dsZVNlY3Rpb24oKTsKLQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE1ldGhvZEVsZW1lbnROYW1lKFdvcmtQcm9kdWN0RGVzY3JpcHRvciBlbGVtZW50KSB7Ci0JCVN0cmluZyBzdHIgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTm9uZTsgCi0JCWlmIChlbGVtZW50LmdldFdvcmtQcm9kdWN0KCkgIT0gbnVsbCkgewotCQkJc3RyID0gZWxlbWVudC5nZXRXb3JrUHJvZHVjdCgpLmdldE5hbWUoKTsKLQkJfQotCi0JCXJldHVybiBzdHI7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWV0aG9kRWxlbWVudFR5cGUoV29ya1Byb2R1Y3REZXNjcmlwdG9yIGVsZW1lbnQpIHsKLQkJU3RyaW5nIHN0ciA9IFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Ob25lOyAKLQkJaWYgKGVsZW1lbnQuZ2V0V29ya1Byb2R1Y3QoKSAhPSBudWxsKSB7Ci0JCQlzdHIgPSBlbGVtZW50LmdldFdvcmtQcm9kdWN0KCkuZ2V0VHlwZSgpLmdldE5hbWUoKTsKLQkJfQotCi0JCXJldHVybiBzdHI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQotCQlhY3Rpdml0eUVudHJ5U3RhdGUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCkpOwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZWxlbWVudCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGVsZW1lbnQuZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQlhY3Rpdml0eUVudHJ5U3RhdGUsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBTdHJVdGlsLmdldFBsYWluVGV4dChhY3Rpdml0eUVudHJ5U3RhdGUKLQkJCQkJCS5nZXRUZXh0KCkpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKSwKLQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN0YXR1cykgewotCQkJCQkJYWN0aXZpdHlFbnRyeVN0YXRlLnNldFRleHQobmV3Q29udGVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWFjdGl2aXR5RXhpdFN0YXRlLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCkpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGVsZW1lbnQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBlbGVtZW50LmdldEFjdGl2aXR5RXhpdFN0YXRlKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQlhY3Rpdml0eUV4aXRTdGF0ZSwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IFN0clV0aWwuZ2V0UGxhaW5UZXh0KGFjdGl2aXR5RXhpdFN0YXRlCi0JCQkJCQkuZ2V0VGV4dCgpKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKSwKLQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN0YXR1cykgewotCQkJCQkJYWN0aXZpdHlFeGl0U3RhdGUuc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF90YWJsZV8xLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzEKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApCi0JCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9hZGRfMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIoCi0JCQkJCQlnZXRDb25maWd1cmF0aW9uKCksIG51bGwsIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFMpOyAvLyROT04tTkxTLTEkCi0JCQkJLy8gYmxvY2sgaXQncyBkZWxpdmVyYWJsZSBwYXJ0cwotCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlleGlzdGluZ0VsZW1lbnRzCi0JCQkJCQkuYWRkQWxsKFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCQkJCQkJLmdldERlbGl2ZXJhYmxlUGFydHMoKSkpOwotCQkJCS8vIGJsb2NrIGl0c2VsZgotCQkJCWV4aXN0aW5nRWxlbWVudHMuYWRkKFByb2Nlc3NVdGlsCi0JCQkJCQkuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkpOwotCQkJCS8vIGFsc28gYmxvY2sgaXQncyBwYXJlbnQgd29yayBwcm9kdWN0cywgaWYgYW55Ci0JCQkJZXhpc3RpbmdFbGVtZW50cwotCQkJCQkJLmFkZEFsbCgoQ29sbGVjdGlvbikgZ2V0UGFyZW50V29ya1Byb2R1Y3RzKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpKTsKLQotCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQkJZmlsdGVyLCBlbGVtZW50LCBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTLAotCQkJCQkJZXhpc3RpbmdFbGVtZW50cyk7Ci0JCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUyk7Ci0JCQkJZmQub3BlbigpOwotCQkJCWFkZEl0ZW1zKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJdmlld2VyXzEucmVmcmVzaCgpOwotCi0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYWRkX3Byb2NfMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUlM7Ci0JCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWV4aXN0aW5nRWxlbWVudHMuYWRkQWxsKCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkJLmdldERlbGl2ZXJhYmxlUGFydHMoKSk7Ci0JCQkJZXhpc3RpbmdFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0KLQkJCQlleGlzdGluZ0VsZW1lbnRzCi0JCQkJCQkuYWRkQWxsKGdldFBhcmVudERlbGl2ZXJhYmxlcygoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KSk7Ci0JCQkJUHJvY2VzcyBwcm9jZXNzID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGVsZW1lbnQpOwotCi0JCQkJSUZpbHRlciBkZXNjcmlwdG9yRmlsdGVyID0gZ2V0RGVzY3JpcHRvckZpbHRlcigpOwotCQkJCWlmIChkZXNjcmlwdG9yRmlsdGVyICE9IG51bGwgJiYgcHJvY2VzcyAhPSBudWxsKSB7Ci0JCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkuZ2V0U2hlbGwoKSwgZGVzY3JpcHRvckZpbHRlciwgcHJvY2VzcywgdGFiTmFtZSwKLQkJCQkJCQlleGlzdGluZ0VsZW1lbnRzKTsKLQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCWZkLnNldFRpdGxlKHRhYk5hbWUpOwotCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCWFkZEZyb21Qcm9jZXNzSXRlbXMoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJdmlld2VyXzEucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9yZW1vdmVfMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8xCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCXJlbW92ZUl0ZW1zKHJtSXRlbXMpOwotCQkJCQl2aWV3ZXJfMS5yZWZyZXNoKCk7Ci0KLQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQl2aWV3ZXJfMS5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWxpbmtCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTOyAvLyROT04tTkxTLTEkCi0JCQkJQ2xhc3Mgd29ya1Byb2R1Y3RUeXBlID0gbnVsbDsKLQkJCQlpZiAoZWxlbWVudC5nZXRXb3JrUHJvZHVjdCgpICE9IG51bGwpIHsKLQkJCQkJd29ya1Byb2R1Y3RUeXBlID0gZWxlbWVudC5nZXRXb3JrUHJvZHVjdCgpLmdldENsYXNzKCk7Ci0JCQkJfQotCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpZiAoZWxlbWVudC5nZXRXb3JrUHJvZHVjdCgpICE9IG51bGwpIHsKLQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSBlbGVtZW50LmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJCWV4aXN0aW5nRWxlbWVudHMuYWRkKHdwKTsKLQkJCQkJaWYgKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJCUxpc3Qgc3ViQXJ0aWZhY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZ2V0QWxsU3ViQXJ0aWZhY3RzKChBcnRpZmFjdCkgd3AsIHN1YkFydGlmYWN0cywKLQkJCQkJCQkJKChBcnRpZmFjdCkgd3ApLmdldENvbnRhaW5lZEFydGlmYWN0cygpKTsKLQkJCQkJCWV4aXN0aW5nRWxlbWVudHMuYWRkQWxsKHN1YkFydGlmYWN0cyk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlMaXN0IGxpc3QgPSBQcm9jZXNzVXRpbAotCQkJCQkJLmdldFNpYmxpbmdzKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBnZXRBZGFwdGVyKCksCi0JCQkJCQkJCWVsZW1lbnQpOwotCi0JCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqOwotCQkJCQkJaWYgKCghd3BEZXNjLmVxdWFscyhlbGVtZW50KSkKLQkJCQkJCQkJJiYgKCF3cERlc2MuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSkgewotCQkJCQkJCVdvcmtQcm9kdWN0IHdwID0gd3BEZXNjLmdldFdvcmtQcm9kdWN0KCk7Ci0KLQkJCQkJCQlpZiAod3AgIT0gbnVsbCkgewotCQkJCQkJCQlleGlzdGluZ0VsZW1lbnRzLmFkZCh3cCk7Ci0KLQkJCQkJCQkJaWYgKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJCQkJCUxpc3Qgc3ViQXJ0aWZhY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQkJZ2V0QWxsU3ViQXJ0aWZhY3RzKChBcnRpZmFjdCkgd3AsCi0JCQkJCQkJCQkJCXN1YkFydGlmYWN0cywgKChBcnRpZmFjdCkgd3ApCi0JCQkJCQkJCQkJCQkJLmdldENvbnRhaW5lZEFydGlmYWN0cygpKTsKLQkJCQkJCQkJCWV4aXN0aW5nRWxlbWVudHMuYWRkQWxsKHN1YkFydGlmYWN0cyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgUHJvY2Vzc1NwZWNpZmljV29ya1Byb2R1Y3RGaWx0ZXIoCi0JCQkJCQlnZXRDb25maWd1cmF0aW9uKCksIG51bGwsIHRhYk5hbWUsIHdvcmtQcm9kdWN0VHlwZSk7Ci0KLQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJCWZpbHRlciwgZWxlbWVudCwgdGFiTmFtZSwgZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlmZC5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQkJZmQuc2V0VGl0bGUodGFiTmFtZSk7Ci0JCQkJZmQub3BlbigpOwotCQkJCXNldE1ldGhvZEVsZW1lbnQoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQotCQkJCS8vIHVwZGF0ZSBtZXRob2QgZWxlbWVudCBjb250cm9sCi0JCQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnROYW1lKGVsZW1lbnQpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUxKSB7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRBbGxTdWJBcnRpZmFjdHMoQXJ0aWZhY3QgYXJ0aWZhY3QsIExpc3Qgc3ViQXJ0aWZhY3RzLAotCQkJTGlzdCBjb250YWluZWRBcnRpZmFjdHMpIHsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY29udGFpbmVkQXJ0aWZhY3RzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IChPYmplY3QpIGl0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJaWYgKCFzdWJBcnRpZmFjdHMuY29udGFpbnMob2JqKSkKLQkJCQkJc3ViQXJ0aWZhY3RzLmFkZChvYmopOwotCQkJCWdldEFsbFN1YkFydGlmYWN0cygoQXJ0aWZhY3QpIG9iaiwgc3ViQXJ0aWZhY3RzLAotCQkJCQkJKChBcnRpZmFjdCkgb2JqKS5nZXRDb250YWluZWRBcnRpZmFjdHMoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jdXBkYXRlQ29udHJvbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlzdXBlci51cGRhdGVDb250cm9scygpOwotCQlhY3Rpdml0eUVudHJ5U3RhdGUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQlhY3Rpdml0eUV4aXRTdGF0ZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWxpbmtCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWFjdGl2aXR5RW50cnlTdGF0ZS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJYWN0aXZpdHlFeGl0U3RhdGUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0KLQkJaWYgKGN0cmxfYWRkXzEgIT0gbnVsbCkKLQkJCWN0cmxfYWRkXzEuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX2FkZF9wcm9jXzEgIT0gbnVsbCkKLQkJCWN0cmxfYWRkX3Byb2NfMS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKGN0cmxfcmVtb3ZlXzEgIT0gbnVsbCkKLQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQllbGVtZW50ID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCi0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJLy8gTW9kZWwgTW9kaWZ5IGxpc3RlbmVyIGZvciBhY3Rpdml0eSBlbnRyeSBzdGF0ZSBhbmQgYWN0aXZpdHkKLQkJCQkvLyBleGl0IHN0YXRlCi0JCQkJaWYgKHdwTW9kZWxNb2RpZnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCWFjdGl2aXR5RW50cnlTdGF0ZQotCQkJCQkJCS5yZW1vdmVNb2RpZnlMaXN0ZW5lcih3cE1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQkJCQlhY3Rpdml0eUV4aXRTdGF0ZQotCQkJCQkJCS5yZW1vdmVNb2RpZnlMaXN0ZW5lcih3cE1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCi0JCQkJfQotCi0JCQkJd3BNb2RlbE1vZGlmeUxpc3RlbmVyID0gZ2V0RWRpdG9yKCkuY3JlYXRlTW9kaWZ5TGlzdGVuZXIoCi0JCQkJCQkoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KTsKLQotCQkJCWlmICh3cE1vZGVsTW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgd3BNb2RlbE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXRFbGVtZW50KGVsZW1lbnQpOwotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHdwTW9kZWxNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQkJCQl9Ci0KLQkJCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQkJCWN0cmxfd29ya1Byb2R1Y3RfdHlwZS5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnRUeXBlKGVsZW1lbnQpKTsKLQkJCQlhY3Rpdml0eUVudHJ5U3RhdGUuc2V0VGV4dChlbGVtZW50LmdldEFjdGl2aXR5RW50cnlTdGF0ZSgpKTsKLQkJCQlhY3Rpdml0eUV4aXRTdGF0ZS5zZXRUZXh0KGVsZW1lbnQuZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKSk7Ci0KLQkJCQlpZiAod3BNb2RlbE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHdwTW9kZWxNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZShmYWxzZSk7Ci0JCQkJfQotCi0JCQkJYWN0aXZpdHlFbnRyeVN0YXRlLmFkZE1vZGlmeUxpc3RlbmVyKHdwTW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJYWN0aXZpdHlFeGl0U3RhdGUuYWRkTW9kaWZ5TGlzdGVuZXIod3BNb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQotCQkJCWlmICh2aWV3ZXJfMSAhPSBudWxsKSB7Ci0JCQkJCXZpZXdlcl8xLnJlZnJlc2goKTsKLQkJCQl9Ci0KLQkJCQkvLyBoaWRlL3Nob3cgY2VydGFpbiBzZWN0aW9ucy4KLQkJCQl0b2dnbGVTZWN0aW9uKCk7Ci0KLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGdlbmVyYWwgc2VjdGlvbiA6ICIgKyBlbGVtZW50LCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRJdGVtcyhMaXN0IGl0ZW1zKSB7Ci0JCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQlMaXN0IHdwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCWlmICgob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpCi0JCQkJCQkmJiAoIWlzUGFydE9mRGVsaXZlcmFibGUoKFdvcmtQcm9kdWN0KSBvYmosCi0JCQkJCQkJCShXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpKSkgewotCQkJCQl3cHMuYWRkKChXb3JrUHJvZHVjdCkgb2JqKTsKLQotCQkJCX0KLQkJCX0KLQkJCWlmICghd3BzLmlzRW1wdHkoKSkgewotCQkJCUFzc2lnbldQVG9EZWxpdmVyYWJsZSBjbWQgPSBuZXcgQXNzaWduV1BUb0RlbGl2ZXJhYmxlKAotCQkJCQkJKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCwgd3BzKTsKLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQkJfQotCQl9Ci0JCXZpZXdlcl8xLnJlZnJlc2goKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXREZXNjcmlwdG9yRmlsdGVyKCkgewotCi0JCXJldHVybiBuZXcgRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZ2V0QWN0aXZpdGllc0luU2NvcGUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgZWxlbWVudCwgbGlzdCk7Ci0JCQkJCWlmIChsaXN0LmNvbnRhaW5zKG9iaikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMoTGlzdCBpdGVtcykgewotCQlpZiAoaXRlbXMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqKQotCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQlpZiAod3AgIT0gbnVsbCkgewotCQkJCQkJaWYgKCFpc1BhcnRPZkRlbGl2ZXJhYmxlKHdwLAotCQkJCQkJCQkoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KSkgewotCQkJCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3cCk7Ci0JCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwKLQkJCQkJCQkJCQkJd3BEZXNjLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwKLQkJCQkJCQkJCQlvYmosIC0xKTsKLQkJCQkJCQotCQkJCQl9IGVsc2UgewotCQkJCQkJTWVzc2FnZUZvcm1hdCBtZiA9IG5ldyBNZXNzYWdlRm9ybWF0KAotCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfRGVsaXZlcmFibGVBc3NpZ25FcnJvcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7Ci0JCQkJCQkJCSgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmopLmdldE5hbWUoKSwKLQkJCQkJCQkJKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE5hbWUoKSB9OwotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlJbmZvKAotCQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Bc3NpZ25tZW50SW5mb1RpdGxlLCBtZi5mb3JtYXQoYXJncykpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVJdGVtcyhMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBpdGVtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gKE9iamVjdCkgaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCksCi0JCQkJCQkJCQkoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmosIC0xKTsKLQkJCQl9Ci0KLQkJCQkvLyBmaW5kIG1hdGNoaW5nIGRlbGl2ZXJhYmxlIHBhcnRzCi0JCQkJT2JqZWN0IHdwRGVzYyA9IGZpbmREZWxpdmVyYWJsZVBhcnRzKChPYmplY3QpIG9iaik7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpLAotCQkJCQkJd3BEZXNjLCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBmaW5kRGVsaXZlcmFibGVQYXJ0cyhPYmplY3Qgb2JqKSB7Ci0JCUxpc3QgcGFydHMgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0RGVsaXZlcmFibGVQYXJ0cygpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHBhcnRzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0b3JPYmplY3QgPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlpZiAoaXRvck9iamVjdCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQlPYmplY3Qgb2JqV1AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqKQotCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQlPYmplY3QgaXRvcldQID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0b3JPYmplY3QpCi0JCQkJCQkJLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJCWlmIChvYmpXUC5lcXVhbHMoaXRvcldQKSkgewotCQkJCQkJcmV0dXJuIGl0b3JPYmplY3Q7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIHBhcmVudCBwcm9jZXNzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9jZXNzKEJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCWJyRWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3MpKSB7Ci0JCQlickVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50OwotCQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdChickVsZW1lbnQsCi0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHBhcmVudCBkZWxpdmVyYWJsZXMKLQkgKiAKLQkgKiBAcGFyYW0gYnJFbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRQYXJlbnREZWxpdmVyYWJsZXMoQnJlYWtkb3duRWxlbWVudCBickVsZW1lbnQpIHsKLQkJTGlzdCBwYXJlbnREZWxpdmVyYWJsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCWJyRWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJYnJFbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudDsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgcGFyZW50OwotCQkJCWlmICh3cGRlc2MuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJCXBhcmVudERlbGl2ZXJhYmxlcy5hZGQod3BkZXNjKTsKLQkJCQl9Ci0JCQl9Ci0JCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KGJyRWxlbWVudCwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIHBhcmVudERlbGl2ZXJhYmxlczsKLQl9Ci0JLyoqCi0JICogRmluZCBhbGwgc2libGluZyB3b3JrIHByb2R1Y3RzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0UGFyZW50V29ya1Byb2R1Y3RzKEJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50KSB7Ci0JCUhhc2hTZXQgd29ya1Byb2R1Y3RzID0gbmV3IEhhc2hTZXQoKTsKLQotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQlickVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCWJyRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQ7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHBhcmVudDsKLQkJCQlpZiAod3BkZXNjLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQl3b3JrUHJvZHVjdHMuYWRkKHdwZGVzYy5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KGJyRWxlbWVudCwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCX0KLQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUxpc3QgYnJFbGVtZW50cyA9ICgoQWN0aXZpdHkpIHBhcmVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGJyRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IChPYmplY3QpIGl0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqKQotCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQlpZiAod3AgIT0gbnVsbCkKLQkJCQkJCXdvcmtQcm9kdWN0cy5hZGQod3ApOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gd29ya1Byb2R1Y3RzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiNnZXROYW1lUHJlZml4KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVQcmVmaXgoKSB7Ci0JCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfV09SS19QUk9EVUNUX0RFU0NSSVBUT1IgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE1ldGhvZEVsZW1lbnQoTGlzdCBpdGVtcykgewotCQlpZiAoKGl0ZW1zICE9IG51bGwpICYmIChpdGVtcy5zaXplKCkgPj0gMSkpIHsKLQkJCWlmIChpdGVtcy5nZXQoMCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBpdGVtcy5nZXQoMCk7Ci0KLQkJCQlMaXN0IGxpc3QgPSBQcm9jZXNzVXRpbAotCQkJCQkJLmdldFNpYmxpbmdzKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBnZXRBZGFwdGVyKCksCi0JCQkJCQkJCWVsZW1lbnQpOwotCQkJCWJvb2xlYW4gY2FuQXNzaWduID0gdHJ1ZTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmo7Ci0JCQkJCQlpZiAoKCF3cERlc2MuZXF1YWxzKGVsZW1lbnQpKQotCQkJCQkJCQkmJiAoIXdwRGVzYy5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpKSB7Ci0JCQkJCQkJV29ya1Byb2R1Y3QgZXhpc2luZ1dQID0gd3BEZXNjLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJCQkJaWYgKHdwLmVxdWFscyhleGlzaW5nV1ApKSB7Ci0JCQkJCQkJCWNhbkFzc2lnbiA9IGZhbHNlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGNhbkFzc2lnbikgewotCQkJCQlMaW5rTWV0aG9kRWxlbWVudENvbW1hbmQgY21kID0gbmV3IExpbmtNZXRob2RFbGVtZW50Q29tbWFuZCgKLQkJCQkJCQllbGVtZW50LCB3cCwKLQkJCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QpOwotCQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCi0JCQkJCS8vIHNldCBzZWxlY3Rpb24gdG8gc2FtZSBlbGVtZW50IHRvIGVuYWJsZSBjb3JyZWN0IGFjdGlvbnMKLQkJCQkJZ2V0RWRpdG9yKCkuc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlNZXNzYWdlRm9ybWF0IG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0ludmFsaWRMaW5rTWV0aG9kRWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJT2JqZWN0W10gYXJncyA9IHsgd3AuZ2V0TmFtZSgpIH07Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19MaW5rTWV0aG9kRWxlbWVudFRpdGxlLCBtZi5mb3JtYXQoYXJncykpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUGFydE9mRGVsaXZlcmFibGUoV29ya1Byb2R1Y3Qgd3AsCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVsaXZlcmFibGUpIHsKLQotCQlMaXN0IGRlbGl2ZXJhYmxlUGFydHMgPSBQcm9jZXNzVXRpbAotCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoZGVsaXZlcmFibGUuZ2V0RGVsaXZlcmFibGVQYXJ0cygpKTsKLQkJaWYgKGRlbGl2ZXJhYmxlUGFydHMuY29udGFpbnMod3ApKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDdhYTdjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0YWJiZWQgcGFnZXMgZm9yIHRoZSBicmVha2Rvd24gZWxlbWVudHMgUHJvcGVydGllcyB2aWV3LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzY5ZmQwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NvbmZpZ3VyYXRpb25MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb2xvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBUaGUgbGFiZWwgcHJvdmlkZXIgZm9yIHRoZSBDb25maWd1cmF0aW9uIHZpZXcgdHJlZSwKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBWYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbG9yUHJvdmlkZXIgewotCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQotCXB1YmxpYyBDb25maWd1cmF0aW9uTGFiZWxQcm92aWRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBJTGFiZWxQcm92aWRlcn0uZ2V0SW1hZ2UgYnkgZm9yd2FyZGluZyBpdCB0byBhbgotCSAqIG9iamVjdCB0aGF0IGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSUl0ZW1MYWJlbFByb3ZpZGVyI2dldEltYWdlIElJdGVtTGFiZWxQcm92aWRlci5nZXRJbWFnZX0KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQkvLyBieSBkZWZhdWx0LCByZXR1cm4gdGhlIGRlZmF1bHQgaW1hZ2UKLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBJTGFiZWxQcm92aWRlcn0uZ2V0VGV4dCBieSBmb3J3YXJkaW5nIGl0IHRvIGFuCi0JICogb2JqZWN0IHRoYXQgaW1wbGVtZW50cwotCSAqIHtAbGluayBJSXRlbUxhYmVsUHJvdmlkZXIjZ2V0VGV4dCBJSXRlbUxhYmVsUHJvdmlkZXIuZ2V0VGV4dH0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqZWN0LCBjb25maWcpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJbmFtZSA9IFByb2Nlc3NVdGlsCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCW5hbWUgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAoU3RyVXRpbC5pc0JsYW5rKG5hbWUpKSB7Ci0JCQkJLy8gdHJ5IHRvIGdldCBuYW1lIG9uIHRoZSBvYmplY3QgaXRzZWxmLgotCQkJCW5hbWUgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoKE1ldGhvZEVsZW1lbnQpIG9iamVjdCk7Ci0JCQl9Ci0JCQkvLyBuYW1lID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXROYW1lKChNZXRob2RFbGVtZW50KW9iamVjdCwKLQkJCS8vIGNvbmZpZyk7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSAoKEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iamVjdCkKLQkJCQkJLmdldFZhbHVlKCk7Ci0JCQluYW1lID0gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQpOwotCQkJaWYgKFN0clV0aWwuaXNCbGFuayhuYW1lKSkgewotCQkJCW5hbWUgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUob2JqZWN0KTsKLQkJCX0KLQotCQl9Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCW5hbWUgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoVG5nVXRpbC51bndyYXAob2JqZWN0KSk7Ci0JCX0KLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJbmFtZSA9IHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQkJfQotCi0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWNvbmZpZyA9IG51bGw7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXIjZ2V0Rm9yZWdyb3VuZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChpc1N1cHByZXNzZWQoZWxlbWVudCkpIHsKLQkJCXJldHVybiBDb2xvcnMuU1VQUkVTU0VEX0VMRU1FTlRfTEFCRUw7Ci0JCX0KLQkJZWxzZSBpZiAoaXNFeHRlcm5hbChlbGVtZW50KSkgewotCQkJcmV0dXJuIENvbG9ycy5JTkhFUklURURfRUxFTUVOVF9MQUJFTDsKLQkJfQotCQlyZXR1cm4gQ29sb3JDb25zdGFudHMubGlzdEZvcmVncm91bmQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzU3VwcHJlc3NlZChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50KTsKLQkJCWlmKHByb2MgIT0gbnVsbCkgewotCQkJCXJldHVybiBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jKS5pc1N1cHByZXNzZWQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlPYmplY3QgdG9wID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcillbGVtZW50KS5nZXRUb3BJdGVtKCk7Ci0JCQlpZih0b3AgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIHsKLQkJCQlyZXR1cm4gU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24oKFByb2Nlc3MpIHRvcCkuaXNTdXBwcmVzc2VkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXIjZ2V0QmFja2dyb3VuZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kKE9iamVjdCBlbGVtZW50KSB7Ci0JCS8vIGxldCBPUyB0YWtlIGNvbnRyb2wgb3ZlciB0cmVlIHdpZGdldCBiYWNrZ3JvdW5kCi0JCS8vIHJhdGhlciB0aGFuIHNlbmRpbmcgb25lIGZpeGVkIGJhY2tncm91bmQuCi0JCXJldHVybiBudWxsOy8vQ29sb3JDb25zdGFudHMubGlzdEJhY2tncm91bmQ7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyI2lzRXh0ZXJuYWwoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChlbGVtZW50KSB8fCBQcm9jZXNzVXRpbC5pc0NvbnRyaWJ1dGVkKGVsZW1lbnQpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlciNnZXRGb250KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEZvbnQgZ2V0Rm9udChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoUHJvY2Vzc1V0aWwuaXNJbmhlcml0ZWQoZWxlbWVudCkpIHsKLQkJCXJldHVybiBpdGFsaWNGb250OwotCQl9Ci0JCWVsc2UgaWYoUHJvY2Vzc1V0aWwuaXNDb250cmlidXRlZChlbGVtZW50KSkgewotCQkJcmV0dXJuIGJvbGRJdGFsaWNGb250OwotCQl9Ci0JCXJldHVybiByZWd1bGFyRm9udDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0VkaXRvclBhZ2VFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0VkaXRvclBhZ2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmMjFmNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9FZGl0b3JQYWdlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogTW9kZWxzIGEgPGVkaXRvclBhZ2U+IGVsZW1lbnQgaW4gdGhlICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkVkaXRvclBhZ2VQcm92aWRlciIKLSAqIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVkaXRvclBhZ2VFbGVtZW50IHsKLQotCS8vIHBsdWdpbiBidW5kbGUKLQlCdW5kbGUgYnVuZGxlOwotCQotCS8vIFRoZSBwYWdlIElELgotCXByaXZhdGUgU3RyaW5nIGlkOwotCQotCS8vIFRoZSBwYWdlIG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCS8vIFRoZSBjb250cmlidXRvciBjbGFzcyBmb3IgdGhlIHBhZ2UuCi0JcHJpdmF0ZSBTdHJpbmcgY29udHJpYnV0b3JDbGFzczsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiAJCQkgIEluc3RhbGxlZCBCdW5kbGUKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIFRoZSBwYWdlIElELgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgcGFnZSBuYW1lLiAgICAgICAgICAgIAotCSAqIEBwYXJhbSBjb250cmlidXRvckNsYXNzCi0JICogICAgICAgICAgICBUaGUgcGFnZSBjb250cmlidXRvciBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgRWRpdG9yUGFnZUVsZW1lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRyaWJ1dG9yQ2xhc3MpIHsKLQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5jb250cmlidXRvckNsYXNzID0gY29udHJpYnV0b3JDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWdlIElELgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHBhZ2UgSUQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWdlIG5hbWUuCi0JICogCi0JICogQHJldHVybiBUaGUgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFnZSBjb250cmlidXRvciBjbGFzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBwYWdlIGNvbnRyaWJ1dG9yIGNsYXNzLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29udHJpYnV0b3JDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJQ2xhc3MgY2xhenogPSBidW5kbGUubG9hZENsYXNzKGNvbnRyaWJ1dG9yQ2xhc3MpOwotCQlyZXR1cm4gY2xhenoubmV3SW5zdGFuY2UoKTsJCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9FeHBvc2VkQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvRXhwb3NlZEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJjMDE2NDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9FeHBvc2VkQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvc2VkQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZXh0ZW5kcwotCQlBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElWaWV3ZXJQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWRpdG9yUGFnZVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVkaXRvclBhZ2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3N2MwMjRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWRpdG9yUGFnZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSA8ZWRpdG9yUGFnZT4gZWxlbWVudHMgZGVmaW5lZCB2aWEgdGhlCi0gKiAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5FZGl0b3JQYWdlUHJvdmlkZXIiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVkaXRvclBhZ2VQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRVNQQUNFID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9QUk9WSURFUlNfRVhURU5TSU9OX05BTUUgPSAiVGFza0VkaXRvclBhZ2VQcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gQXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfUFJPVklERVJfRVhURU5TSU9OX0FUVFJfSUQgPSAiaWQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9OQU1FID0gIm5hbWUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9DTEFTUyA9ICJjbGFzcyI7Ci0KLQkvLyBDb250YWlucyB0aGUgZWRpdG9yIHBhZ2UgcHJvdmlkZXJzIGxvYWRlZCB2aWEgdGhlCi0JLy8gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuTWV0aG9kRWRpdG9yUGFnZVByb3ZpZGVyIiBleHRlbnNpb24gcG9pbnQuCi0JcHJpdmF0ZSBBcnJheUxpc3QgcGFnZVByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vCSBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIE1ldGhvZEVkaXRvclBhZ2VQcm92aWRlciBpbnN0YW5jZSA9IG51bGw7Ci0JCi0JcHVibGljIHN0YXRpYyBNZXRob2RFZGl0b3JQYWdlUHJvdmlkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKE1ldGhvZEVkaXRvclBhZ2VQcm92aWRlci5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IE1ldGhvZEVkaXRvclBhZ2VQcm92aWRlcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE1ldGhvZEVkaXRvclBhZ2VQcm92aWRlcigpIHsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBwYWdlIHByb3ZpZGVycwotCSAqIAotCSAqIEByZXR1cm4gYWxsIHRoZSBwYWdlIHByb3ZpZGVycy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQYWdlUHJvdmlkZXJzKCkgewotCQlMaXN0IHBhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VQcm92aWRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCUVkaXRvclBhZ2VFbGVtZW50IHBhZ2VFbGVtZW50ID0gKEVkaXRvclBhZ2VFbGVtZW50KSBwYWdlUHJvdmlkZXJzCi0JCQkJCS5nZXQoaSk7Ci0JCQlPYmplY3QgY29udHJpYnV0b3JDbGFzcyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWNvbnRyaWJ1dG9yQ2xhc3MgPSBwYWdlRWxlbWVudC5nZXRDb250cmlidXRvckNsYXNzKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQkJcGFnZXMuYWRkKGNvbnRyaWJ1dG9yQ2xhc3MpOwotCQl9Ci0JCXJldHVybiBwYWdlczsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgY29uZmlndXJhdGlvbiBwcm92aWRlcnMgc3BlY2lmaWVkIHZpYSB0aGUKLQkgKiAiY29tLmlibS5wcm9jZXNzLnBhZ2VQcm92aWRlcnMiIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkUHJvdmlkZXJzKCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQlQQUdFX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRVNQQUNFLAotCQkJCVBBR0VfUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0KLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgaWQgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9JRCk7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZShQQUdFX1BST1ZJREVSX0VYVEVOU0lPTl9BVFRSX05BTUUpOwotCQkJCQkJU3RyaW5nIGNvbnRyaWJ1dG9yQ2xhc3MgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkJRWRpdG9yUGFnZUVsZW1lbnQgcGFnZUVsZW1lbnQgPSBuZXcgRWRpdG9yUGFnZUVsZW1lbnQoCi0JCQkJCQkJCWJ1bmRsZSwgaWQsIG5hbWUsIGNvbnRyaWJ1dG9yQ2xhc3MpOwotCQkJCQkJcGFnZVByb3ZpZGVycy5hZGQocGFnZUVsZW1lbnQpOwotCQkJCQkJCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkJCSJGYWlsZWQgdG8gbG9hZCBFZGl0b3IgUGFnZSBQcm92aWRlciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9NZXRob2RFbGVtZW50TGFiZWxEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTM0MGU1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIExhYmVsIGRlY29yYXRvciBmb3IgbWV0aG9kIGVsZW1lbnQKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50TGFiZWxEZWNvcmF0b3IgaW1wbGVtZW50cyBJTGFiZWxEZWNvcmF0b3IgewotCXByaXZhdGUgc3RhdGljIElMYWJlbERlY29yYXRvciBkZWxlZ2F0ZURlY29yYXRvcjsKLQkKLQlwcml2YXRlIHN0YXRpYyBJTGFiZWxEZWNvcmF0b3IgZ2V0RGVsZWdhdGVEZWNvcmF0b3IoKSB7Ci0JCWlmIChkZWxlZ2F0ZURlY29yYXRvciA9PSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZURlY29yYXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlRGVjb3JhdG9yOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJUmVzb3VyY2UgZ2V0V29ya3NwYWNlUmVzb3VyY2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkvLyBkb24ndCBkZWNvcmF0ZSBpY29uIG9mIHByZWRlZmluZWQgZWxlbWVudHMgaW4gbGlicmFyeSB2aWV3IGIvYyBzb21lIG9mIHRoZW0gYXJlIHNob3duIGFzIFVJIGZvbGRlcgotCQkvLwotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBUbmdVdGlsLmlzUHJlZGVmaW5lZCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBQZXJzaXN0ZW5jZVV0aWwuZ2V0V29ya3NwYWNlUmVzb3VyY2UoZWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBNZXRob2RFbGVtZW50TGFiZWxEZWNvcmF0b3IoKSB7Ci0JCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3IjZGVjb3JhdGVJbWFnZShvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGRlY29yYXRlSW1hZ2UoSW1hZ2UgaW1hZ2UsIE9iamVjdCBlbGVtZW50KSB7CQkKLQkJSVJlc291cmNlIHdzUmVzID0gZ2V0V29ya3NwYWNlUmVzb3VyY2UoZWxlbWVudCk7Ci0JCWlmKHdzUmVzICE9IG51bGwpIHsKLQkJCWltYWdlID0gZ2V0RGVsZWdhdGVEZWNvcmF0b3IoKS5kZWNvcmF0ZUltYWdlKGltYWdlLCB3c1Jlcyk7Ci0JCX0KLQkJcmV0dXJuIGdldERlbGVnYXRlRGVjb3JhdG9yKCkuZGVjb3JhdGVJbWFnZShpbWFnZSwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvciNkZWNvcmF0ZVRleHQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGRlY29yYXRlVGV4dChTdHJpbmcgdGV4dCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlnZXREZWxlZ2F0ZURlY29yYXRvcigpLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlJUmVzb3VyY2Ugd3NSZXMgPSBnZXRXb3Jrc3BhY2VSZXNvdXJjZShlbGVtZW50KTsKLQkJaWYod3NSZXMgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlRGVjb3JhdG9yKCkuaXNMYWJlbFByb3BlcnR5KHdzUmVzLCBwcm9wZXJ0eSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZ2V0RGVsZWdhdGVEZWNvcmF0b3IoKS5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0NDY3YTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9NZXRob2RFbGVtZW50TGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5MaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuTWV0aG9kUmljaFRleHRNYXJrZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50TGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciBpbXBsZW1lbnRzCi0JCUlMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3Igb3ZlcmxheSA9IG51bGw7Ci0JCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUNPUkFUT1JfSUQgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWxlbWVudExpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IiOwotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciNkZWNvcmF0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRGVjb3JhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWNvcmF0ZShPYmplY3QgZWxlbWVudCwgSURlY29yYXRpb24gZGVjb3JhdGlvbikgewotCQl0cnkgewotCQkJaWYoTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIuaXNJbnZhbGlkKGVsZW1lbnQpIHx8Ci0JCQkJCU1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyLmlzSW52YWxpZChlbGVtZW50KSkgewotCQkJCWRlY29yYXRpb24uYWRkT3ZlcmxheShnZXRFcnJvck92ZXJsYXkoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0JCi0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEVycm9yT3ZlcmxheSgpIHsKLQkJaWYob3ZlcmxheSA9PSBudWxsKSB7Ci0JCQlvdmVybGF5ID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmIik7Ci0JCX0KLQkJcmV0dXJuIG92ZXJsYXk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRVSUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWxlbWVudFVJTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyN2RiZTQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWxlbWVudFVJTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBDb2RlIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnZpZXdzdXBwb3J0LkphdmFVSUxhYmVsUHJvdmlkZXIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudFVJTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyIHsKLQkKLQlwcm90ZWN0ZWQgTGlzdGVuZXJMaXN0IGZMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JCi0JSUxhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCi0JcHJpdmF0ZSBBcnJheUxpc3Q8SUxhYmVsRGVjb3JhdG9yPiBmTGFiZWxEZWNvcmF0b3JzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsYWJlbCBwcm92aWRlciB3aXRoIGRlZmF1bHQgZmxhZ3MuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRVSUxhYmVsUHJvdmlkZXIoKSB7Ci0JCWZMYWJlbERlY29yYXRvcnM9IG51bGw7IAotCX0KLQkKLQkvKioKLQkgKiBBZGRzIGEgZGVjb3JhdG9yIHRvIHRoZSBsYWJlbCBwcm92aWRlcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExhYmVsRGVjb3JhdG9yKElMYWJlbERlY29yYXRvciBkZWNvcmF0b3IpIHsKLQkJaWYgKGZMYWJlbERlY29yYXRvcnMgPT0gbnVsbCkgewotCQkJZkxhYmVsRGVjb3JhdG9ycz0gbmV3IEFycmF5TGlzdDxJTGFiZWxEZWNvcmF0b3I+KDIpOwotCQl9Ci0JCWZMYWJlbERlY29yYXRvcnMuYWRkKGRlY29yYXRvcik7Ci0JfQotCQotCXByb3RlY3RlZCBJbWFnZSBkZWNvcmF0ZUltYWdlKEltYWdlIGltYWdlLCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZkxhYmVsRGVjb3JhdG9ycyAhPSBudWxsICYmIGltYWdlICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBmTGFiZWxEZWNvcmF0b3JzLnNpemUoKTsgaSsrKSB7Ci0JCQkJSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcj0gKElMYWJlbERlY29yYXRvcikgZkxhYmVsRGVjb3JhdG9ycy5nZXQoaSk7Ci0JCQkJaW1hZ2U9IGRlY29yYXRvci5kZWNvcmF0ZUltYWdlKGltYWdlLCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSW1hZ2UgcmVzdWx0PSBmTGFiZWxQcm92aWRlci5nZXRJbWFnZShlbGVtZW50KTsKLQkJcmV0dXJuIGRlY29yYXRlSW1hZ2UocmVzdWx0LCBlbGVtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlY29yYXRlVGV4dChTdHJpbmcgdGV4dCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGZMYWJlbERlY29yYXRvcnMgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGZMYWJlbERlY29yYXRvcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yPSAoSUxhYmVsRGVjb3JhdG9yKSBmTGFiZWxEZWNvcmF0b3JzLmdldChpKTsKLQkJCQl0ZXh0PSBkZWNvcmF0b3IuZGVjb3JhdGVUZXh0KHRleHQsIGVsZW1lbnQpOwotCQkJfQotCQl9CQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElMYWJlbFByb3ZpZGVyI2dldFRleHQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHJlc3VsdD0gZkxhYmVsUHJvdmlkZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJcmV0dXJuIGRlY29yYXRlVGV4dChyZXN1bHQsIGVsZW1lbnQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGZMYWJlbERlY29yYXRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGZMYWJlbERlY29yYXRvcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yPSAoSUxhYmVsRGVjb3JhdG9yKSBmTGFiZWxEZWNvcmF0b3JzLmdldChpKTsKLQkJCQlkZWNvcmF0b3IuZGlzcG9zZSgpOwotCQkJfQotCQkJZkxhYmVsRGVjb3JhdG9ycz0gbnVsbDsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChmTGFiZWxEZWNvcmF0b3JzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBmTGFiZWxEZWNvcmF0b3JzLnNpemUoKTsgaSsrKSB7Ci0JCQkJSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcj0gKElMYWJlbERlY29yYXRvcikgZkxhYmVsRGVjb3JhdG9ycy5nZXQoaSk7Ci0JCQkJZGVjb3JhdG9yLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCQlmTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoT2JqZWN0LCBTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIHRydWU7CQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGZMYWJlbERlY29yYXRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGZMYWJlbERlY29yYXRvcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yPSAoSUxhYmVsRGVjb3JhdG9yKSBmTGFiZWxEZWNvcmF0b3JzLmdldChpKTsKLQkJCQlkZWNvcmF0b3IucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JCWZMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUxhYmVsRGVjb3JhdG9yW10gZ2V0RGVjb3JhdG9ycyhib29sZWFuIGVycm9ydGljaywgSUxhYmVsRGVjb3JhdG9yIGV4dHJhKSB7Ci0JCWlmIChlcnJvcnRpY2spIHsKLQkJCWlmIChleHRyYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBJTGFiZWxEZWNvcmF0b3JbXSB7fTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG5ldyBJTGFiZWxEZWNvcmF0b3JbXSB7IGV4dHJhIH07Ci0JCQl9Ci0JCX0KLQkJaWYgKGV4dHJhICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgSUxhYmVsRGVjb3JhdG9yW10geyBleHRyYSB9OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLSAgICAvKioKLSAgICAgKiBGaXJlcyBhIGxhYmVsIHByb3ZpZGVyIGNoYW5nZWQgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzCi0gICAgICogT25seSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBhdCB0aGUgdGltZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYXJlIG5vdGlmaWVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGV2ZW50IGEgbGFiZWwgcHJvdmlkZXIgY2hhbmdlZCBldmVudAotICAgICAqCi0gICAgICogQHNlZSBJTGFiZWxQcm92aWRlckxpc3RlbmVyI2xhYmVsUHJvdmlkZXJDaGFuZ2VkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKGZpbmFsIExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgT2JqZWN0W10gbGlzdGVuZXJzID0gZkxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIGZpbmFsIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbCA9IChJTGFiZWxQcm92aWRlckxpc3RlbmVyKSBsaXN0ZW5lcnNbaV07Ci0gICAgICAgICAgICBTYWZlUnVubmVyLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgbC5sYWJlbFByb3ZpZGVyQ2hhbmdlZChldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvUHJvYmxlbXNMYWJlbERlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Qcm9ibGVtc0xhYmVsRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1NmVhOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Qcm9ibGVtc0xhYmVsRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbC5JUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsLkltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWwuSW1hZ2VJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbC5NZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLQotLyoqCi0gKiBDb2RlIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuamR0LnVpLlByb2JsZW1zTGFiZWxEZWNvcmF0b3IgCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUHJvYmxlbXNMYWJlbERlY29yYXRvciBpbXBsZW1lbnRzIElMYWJlbERlY29yYXRvciwgSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IgewotCQotCS8qKgotCSAqIFRoaXMgaXMgYSBzcGVjaWFsIDxjb2RlPkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ8L2NvZGU+IGNhcnJ5aW5nIGFkZGl0aW9uYWwgCi0JICogaW5mb3JtYXRpb24gd2hldGhlciB0aGUgZXZlbnQgb3JpZ2lucyBmcm9tIGEgbWFrZXIgY2hhbmdlLgotCSAqIDxwPgotCSAqIDxjb2RlPlByb2JsZW1zTGFiZWxDaGFuZ2VkRXZlbnQ8L2NvZGU+cyBhcmUgb25seSBnZW5lcmF0ZWQgYnkgPGNvZGU+Ci0JICogUHJvYmxlbXNMYWJlbERlY29yYXRvcjwvY29kZT5zLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFByb2JsZW1zTGFiZWxDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IHsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQ9IDFMOwotCQkKLQkJcHJpdmF0ZSBib29sZWFuIGZNYXJrZXJDaGFuZ2U7Ci0KLQkJLyoqCi0JCSAqIE5vdGU6IFRoaXMgY29uc3RydWN0b3IgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIGNvbnN0cnVjdG9yLgotCQkgKiAKLQkJICogQHBhcmFtIGV2ZW50U291cmNlIHRoZSBiYXNlIGxhYmVsIHByb3ZpZGVyCi0JCSAqIEBwYXJhbSBjaGFuZ2VkUmVzb3VyY2UgdGhlIGNoYW5nZWQgcmVzb3VyY2VzCi0JCSAqIEBwYXJhbSBpc01hcmtlckNoYW5nZSA8Y29kZT50cnVlPGNvZGU+IGlmIHRoZSBjaGFuZ2UgaXMgYSBtYXJrZXIgY2hhbmdlOyBvdGhlcndpc2UKLQkJICogIDxjb2RlPmZhbHNlPC9jb2RlPiAKLQkJICovCi0JCXB1YmxpYyBQcm9ibGVtc0xhYmVsQ2hhbmdlZEV2ZW50KElCYXNlTGFiZWxQcm92aWRlciBldmVudFNvdXJjZSwgSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlLCBib29sZWFuIGlzTWFya2VyQ2hhbmdlKSB7Ci0JCQlzdXBlcihldmVudFNvdXJjZSwgY2hhbmdlZFJlc291cmNlKTsKLQkJCWZNYXJrZXJDaGFuZ2U9IGlzTWFya2VyQ2hhbmdlOwotCQl9Ci0JCQotCQkvKioKLQkJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZXZlbnQgb3JpZ2lucyBmcm9tIG1hcmtlciBjaGFuZ2VzLiBJZiA8Y29kZT5mYWxzZTwvY29kZT4gYW4gYW5ub3RhdGlvbiAKLQkJICogbW9kZWwgY2hhbmdlIGlzIHRoZSBvcmlnaW4uIEluIHRoaXMgY2FzZSB2aWV3ZXJzIG5vdCBkaXNwbGF5aW5nIHdvcmtpbmcgY29waWVzIGNhbiBpZ25vcmUgdGhlc2UgCi0JCSAqIGV2ZW50cy4KLQkJICogCi0JCSAqIEByZXR1cm4gaWYgdGhpcyBldmVudCBvcmlnaW5zIGZyb20gYSBtYXJrZXIgY2hhbmdlLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNNYXJrZXJDaGFuZ2UoKSB7Ci0JCQlyZXR1cm4gZk1hcmtlckNoYW5nZTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVSUk9SVElDS19FUlJPUj0gTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUjsJCi0KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5IGZSZWdpc3RyeTsKLQlwcml2YXRlIGJvb2xlYW4gZlVzZU5ld1JlZ2lzdHJ5PSBmYWxzZTsKLQlwcml2YXRlIElQcm9ibGVtQ2hhbmdlZExpc3RlbmVyIGZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyOwotCQotCXByaXZhdGUgTGlzdGVuZXJMaXN0IGZMaXN0ZW5lcnM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlByb2JsZW1zTGFiZWxEZWNvcmF0b3I8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBQcm9ibGVtc0xhYmVsRGVjb3JhdG9yKCkgewotCQl0aGlzKG51bGwpOwotCQlmVXNlTmV3UmVnaXN0cnk9IHRydWU7Ci0JfQotCQotCS8qKgotCSAqIE5vdGU6IFRoaXMgY29uc3RydWN0b3IgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSByZWdpc3RyeSBUaGUgcmVnaXN0cnkgdG8gdXNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHVzZSB0aGUgSmF2YSBwbHVnaW4ncwotCSAqICBpbWFnZSByZWdpc3RyeQotCSAqLwotCXB1YmxpYyBQcm9ibGVtc0xhYmVsRGVjb3JhdG9yKEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCWZSZWdpc3RyeT0gcmVnaXN0cnk7Ci0JCWZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyPSBudWxsOwotCX0KLQkKLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCkgewotCQlpZiAoZlJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCWZSZWdpc3RyeT0gZlVzZU5ld1JlZ2lzdHJ5ID8gbmV3IEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkgOiBBdXRob3JpbmdVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBmUmVnaXN0cnk7Ci0JfQotCQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUxhYmVsRGVjb3JhdG9yI2RlY29yYXRlVGV4dChTdHJpbmcsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGRlY29yYXRlVGV4dChTdHJpbmcgdGV4dCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQkKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElMYWJlbERlY29yYXRvciNkZWNvcmF0ZUltYWdlKEltYWdlLCBPYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGRlY29yYXRlSW1hZ2UoSW1hZ2UgaW1hZ2UsIE9iamVjdCBvYmopIHsKLQkJaW50IGFkb3JubWVudEZsYWdzPSBjb21wdXRlQWRvcm5tZW50RmxhZ3Mob2JqKTsKLQkJaWYgKGFkb3JubWVudEZsYWdzICE9IDApIHsKLQkJCUltYWdlRGVzY3JpcHRvciBiYXNlSW1hZ2U9IG5ldyBJbWFnZUltYWdlRGVzY3JpcHRvcihpbWFnZSk7Ci0JCQlSZWN0YW5nbGUgYm91bmRzPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJCXJldHVybiBnZXRSZWdpc3RyeSgpLmdldChuZXcgTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvcihiYXNlSW1hZ2UsIGFkb3JubWVudEZsYWdzLCBuZXcgUG9pbnQoYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KSkpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBvYmogdGhlIGVsZW1lbnQgdG8gY29tcHV0ZSB0aGUgZmxhZ3MgZm9yCi0JICogCi0JICogQHJldHVybiB0aGUgYWRvcm5tZW50IGZsYWdzCi0JICovCi0JcHJvdGVjdGVkIGludCBjb21wdXRlQWRvcm5tZW50RmxhZ3MoT2JqZWN0IG9iaikgewotCQl0cnkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZ2V0RXJyb3JUaWNrc0Zyb21NYXJrZXJzKFBlcnNpc3RlbmNlVXRpbC5nZXRXb3Jrc3BhY2VSZXNvdXJjZShvYmopLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQlyZXR1cm4gZ2V0RXJyb3JUaWNrc0Zyb21NYXJrZXJzKChJUmVzb3VyY2UpIG9iaiwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgPT0gSVJlc291cmNlU3RhdHVzLk1BUktFUl9OT1RfRk9VTkQpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCQotCQkJQXV0aG9yaW5nVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCXByaXZhdGUgaW50IGdldEVycm9yVGlja3NGcm9tTWFya2VycyhJUmVzb3VyY2UgcmVzLCBpbnQgZGVwdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHJlcyA9PSBudWxsIHx8ICFyZXMuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWludCBpbmZvPSAwOwotCQkKLQkJSU1hcmtlcltdIG1hcmtlcnM9IHJlcy5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsIGRlcHRoKTsKLQkJaWYgKG1hcmtlcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoICYmIChpbmZvICE9IEVSUk9SVElDS19FUlJPUik7IGkrKykgewotCQkJCUlNYXJrZXIgY3Vycj0gbWFya2Vyc1tpXTsKLQkJCQlpbnQgcHJpb3JpdHk9IGN1cnIuZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIC0xKTsKLQkJCQlpZiAocHJpb3JpdHkgPT0gSU1hcmtlci5TRVZFUklUWV9FUlJPUikgewotCQkJCQlpbmZvPSBFUlJPUlRJQ0tfRVJST1I7Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JCXJldHVybiBpbmZvOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyICE9IG51bGwpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcm9ibGVtTWFya2VyTWFuYWdlcigpLnJlbW92ZUxpc3RlbmVyKGZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyKTsKLQkJCWZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyPSBudWxsOwotCQl9Ci0JCWlmIChmUmVnaXN0cnkgIT0gbnVsbCAmJiBmVXNlTmV3UmVnaXN0cnkpIHsKLQkJCWZSZWdpc3RyeS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KE9iamVjdCwgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChmTGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWZMaXN0ZW5lcnM9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQkJfQotCQlmTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCWlmIChmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcj0gbmV3IElQcm9ibGVtQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb2JsZW1zQ2hhbmdlZChJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzLCBib29sZWFuIGlzTWFya2VyQ2hhbmdlKSB7Ci0JCQkJCWZpcmVQcm9ibGVtc0NoYW5nZWQoY2hhbmdlZFJlc291cmNlcywgaXNNYXJrZXJDaGFuZ2UpOwotCQkJCX0KLQkJCX07Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvYmxlbU1hcmtlck1hbmFnZXIoKS5hZGRMaXN0ZW5lcihmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQl9CQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZkxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCQlpZiAoZkxpc3RlbmVycy5pc0VtcHR5KCkgJiYgZlByb2JsZW1DaGFuZ2VkTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcm9ibGVtTWFya2VyTWFuYWdlcigpLnJlbW92ZUxpc3RlbmVyKGZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyKTsKLQkJCQlmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcj0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZmlyZVByb2JsZW1zQ2hhbmdlZChJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzLCBib29sZWFuIGlzTWFya2VyQ2hhbmdlKSB7Ci0JCWlmIChmTGlzdGVuZXJzICE9IG51bGwgJiYgIWZMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQlMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50PSBuZXcgUHJvYmxlbXNMYWJlbENoYW5nZWRFdmVudCh0aGlzLCBjaGFuZ2VkUmVzb3VyY2VzLCBpc01hcmtlckNoYW5nZSk7Ci0JCQlPYmplY3RbXSBsaXN0ZW5lcnM9IGZMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJKChJTGFiZWxQcm92aWRlckxpc3RlbmVyKSBsaXN0ZW5lcnNbaV0pLmxhYmVsUHJvdmlkZXJDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQkJCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciNkZWNvcmF0ZShqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlY29yYXRlKE9iamVjdCBlbGVtZW50LCBJRGVjb3JhdGlvbiBkZWNvcmF0aW9uKSB7IAotCQlpbnQgYWRvcm5tZW50RmxhZ3M9IGNvbXB1dGVBZG9ybm1lbnRGbGFncyhlbGVtZW50KTsKLQkJaWYgKGFkb3JubWVudEZsYWdzID09IEVSUk9SVElDS19FUlJPUikgewotCQkJZGVjb3JhdGlvbi5hZGRPdmVybGF5KEF1dGhvcmluZ1VJSW1hZ2VzLklNR19ERVNDX09WUl9FUlJPUik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvUHJvY2Vzc0VkaXRvclBhZ2VQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Qcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1MDRmOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Qcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSA8ZWRpdG9yUGFnZT4gZWxlbWVudHMgZGVmaW5lZCB2aWEgdGhlCi0gKiAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5FZGl0b3JQYWdlUHJvdmlkZXIiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NFZGl0b3JQYWdlUHJvdmlkZXIgewotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9QUk9WSURFUlNfRVhURU5TSU9OX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FID0gIlByb2Nlc3NFZGl0b3JQYWdlUHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIEF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX1BST1ZJREVSX0VYVEVOU0lPTl9BVFRSX0lEID0gImlkIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfUFJPVklERVJfRVhURU5TSU9OX0FUVFJfTkFNRSA9ICJuYW1lIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfUFJPVklERVJfRVhURU5TSU9OX0FUVFJfQ0xBU1MgPSAiY2xhc3MiOwotCi0JLy8gQ29udGFpbnMgdGhlIGVkaXRvciBwYWdlIHByb3ZpZGVycyBsb2FkZWQgdmlhIHRoZQotCS8vICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlByb2Nlc3NFZGl0b3JQYWdlUHJvdmlkZXIiIGV4dGVuc2lvbiBwb2ludC4KLQlwcml2YXRlIEFycmF5TGlzdCBwYWdlUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8JIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUHJvY2Vzc0VkaXRvclBhZ2VQcm92aWRlciBpbnN0YW5jZSA9IG51bGw7Ci0JCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChQcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyLmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgUHJvY2Vzc0VkaXRvclBhZ2VQcm92aWRlcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFByb2Nlc3NFZGl0b3JQYWdlUHJvdmlkZXIoKSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgcGFnZSBwcm92aWRlcnMKLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCB0aGUgcGFnZSBwcm92aWRlcnMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UGFnZVByb3ZpZGVycygpIHsKLQkJTGlzdCBwYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlUHJvdmlkZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlFZGl0b3JQYWdlRWxlbWVudCBwYWdlRWxlbWVudCA9IChFZGl0b3JQYWdlRWxlbWVudCkgcGFnZVByb3ZpZGVycwotCQkJCQkuZ2V0KGkpOwotCQkJT2JqZWN0IGNvbnRyaWJ1dG9yQ2xhc3MgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQljb250cmlidXRvckNsYXNzID0gcGFnZUVsZW1lbnQuZ2V0Q29udHJpYnV0b3JDbGFzcygpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCXBhZ2VzLmFkZChjb250cmlidXRvckNsYXNzKTsKLQkJfQotCQlyZXR1cm4gcGFnZXM7Ci0JfQotCQotCS8qKgotCSAqIExvYWRzIHRoZSBjb25maWd1cmF0aW9uIHByb3ZpZGVycyBzcGVjaWZpZWQgdmlhIHRoZQotCSAqICJjb20uaWJtLnByb2Nlc3MucGFnZVByb3ZpZGVycyIgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRQcm92aWRlcnMoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KAotCQkJCVBBR0VfUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FU1BBQ0UsCi0JCQkJUEFHRV9QUk9WSURFUlNfRVhURU5TSU9OX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQkKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgaWQgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9JRCk7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZShQQUdFX1BST1ZJREVSX0VYVEVOU0lPTl9BVFRSX05BTUUpOwotCQkJCQkJU3RyaW5nIGNvbnRyaWJ1dG9yQ2xhc3MgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCUVkaXRvclBhZ2VFbGVtZW50IHBhZ2VFbGVtZW50ID0gbmV3IEVkaXRvclBhZ2VFbGVtZW50KGJ1bmRsZSwKLQkJCQkJCQkJaWQsIG5hbWUsIGNvbnRyaWJ1dG9yQ2xhc3MpOwotCQkJCQkJcGFnZVByb3ZpZGVycy5hZGQocGFnZUVsZW1lbnQpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJCQkiRmFpbGVkIHRvIGxvYWQgRWRpdG9yIFBhZ2UgUHJvdmlkZXIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL1ZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTU3MjdjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL1ZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUZvbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyIGV4dGVuZHMKLQkJQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUZvbnRQcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgcmVndWxhckZvbnQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgYm9sZEZvbnQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgaXRhbGljRm9udDsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgYm9sZEl0YWxpY0ZvbnQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgc3RyaWtlb3V0Rm9udDsJCi0KLQlzdGF0aWMgewotCQlGb250IGRlZmF1bHRGb250ID0gSkZhY2VSZXNvdXJjZXMuZ2V0RGVmYXVsdEZvbnQoKTsKLQkJcmVndWxhckZvbnQgPSBkZWZhdWx0Rm9udDsKLQkJRm9udERhdGFbXSBmZHMgPSBKRmFjZVJlc291cmNlcy5nZXREZWZhdWx0Rm9udCgpLmdldEZvbnREYXRhKCk7Ci0JCWlmIChmZHMubGVuZ3RoID4gMCkgewotCQkJRm9udERhdGEgZmQgPSBmZHNbMF07Ci0JCQlpbnQgaCA9IGZkLmdldEhlaWdodCgpOwotCQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQlib2xkRm9udCA9IG5ldyBGb250KGRpc3BsYXksIGZkLmdldE5hbWUoKSwgaCwgZmQuZ2V0U3R5bGUoKQotCQkJCQl8IFNXVC5CT0xEKTsKLQkJCWl0YWxpY0ZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBmZC5nZXROYW1lKCksIGgsIGZkLmdldFN0eWxlKCkKLQkJCQkJfCBTV1QuSVRBTElDKTsKLQkJCWJvbGRJdGFsaWNGb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZmQuZ2V0TmFtZSgpLCBoLCBmZC5nZXRTdHlsZSgpCi0JCQkJCXwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9udCBnZXRJdGFsaWNGb250KCkgewotCQlyZXR1cm4gaXRhbGljRm9udDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvbnQgZ2V0RGVmYXVsdEZvbnQoKSB7Ci0JCXJldHVybiByZWd1bGFyRm9udDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIEZvbnQgZ2V0Rm9udChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoaXNFeHRlcm5hbChlbGVtZW50KSkgewotCQkJcmV0dXJuIGl0YWxpY0ZvbnQ7Ci0JCX0KLQkJcmV0dXJuIGJvbGRGb250OwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRXh0ZXJuYWwoT2JqZWN0IGVsZW1lbnQpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMjZmM2U3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZXh0ZW5zaW9uIHBvaW50IG1hbmFnZW1lbnQgZm9yIHRoZSBBdXRob3JpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L0lNZXRob2RSaWNoVGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L0lNZXRob2RSaWNoVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYWIxZTg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9JTWV0aG9kUmljaFRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkRlY29yYXRlZEZpZWxkOwotCi0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBSaWNoIFRleHQgY29udHJvbCB1c2VkIGluIHRoZSBNZXRob2QgZWRpdG9ycy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZFJpY2hUZXh0IGV4dGVuZHMgSVJpY2hUZXh0IHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRNb2RhbE9iamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGFsT2JqZWN0KEVPYmplY3QgbW9kYWxPYmplY3QpOwotCi0JLyoqCi0JICogUmV0dXJucyBtb2RhbCBvYmplY3QgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE1vZGFsT2JqZWN0RmVhdHVyZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kYWwgb2JqZWN0IGZlYXR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kYWxPYmplY3RGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBtb2RhbE9iamVjdEZlYXR1cmUpOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgTWV0aG9kUmljaFRleHQgd2l0aCB0aGUgZWRpdGVkIE1ldGhvZEVsZW1udCBhbmQgbmFtZSBvZiB0aGUgZmllbGQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBmaWVsZE5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRGVjb3JhdGVkRmllbGQgbGFiZWwpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcmljaHRleHQvSU1ldGhvZFJpY2hUZXh0RWRpdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcmljaHRleHQvSU1ldGhvZFJpY2hUZXh0RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5ZjUzOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L0lNZXRob2RSaWNoVGV4dEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dFRvb2xCYXI7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBSaWNoIFRleHQgZWRpdG9yIHVzZWQgaW4gdGhlIE1ldGhvZCBlZGl0b3JzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWV0aG9kUmljaFRleHRFZGl0b3IgZXh0ZW5kcyBJTWV0aG9kUmljaFRleHQsIElSaWNoVGV4dEVkaXRvciB7Ci0KLQkvKioKLQkgKiBGaWxscyB0aGUgUmljaCBUZXh0IGVkaXRvciB0b29sIGJhciB3aXRoIGFjdGlvbiBpdGVtcy4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbEJhcgotCSAqICAgICAgICAgICAgVGhlIFJpY2ggdGV4dCBlZGl0b3IgdG9vbCBiYXIuCi0JICovCi0JcHVibGljIHZvaWQgZmlsbFRvb2xCYXIoSVJpY2hUZXh0VG9vbEJhciB0b29sQmFyKTsKLQkKLQkvKioKLQkgKiBTZWxlY3RzIHRoZSBSaWNoIFRleHQgb3IgSFRNTCB0YWIuCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICAwIGZvciB0aGUgUmljaCBUZXh0IHRhYiwgMSBmb3IgdGhlIEhUTUwgdGFiLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihpbnQgaW5kZXgpOwkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L1JpY2hUZXh0Q29udGVudFZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L1JpY2hUZXh0Q29udGVudFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYzk0ZDM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9SaWNoVGV4dENvbnRlbnRWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dDsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5EZWZhdWx0Q29udGVudFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGlua0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBTcGVjaWFsIGNvbnRlbnQgdmFsaWRhdG9yIGZvciB0aGUgUmljaCBUZXh0IEVkaXRvcgotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRDb250ZW50VmFsaWRhdG9yIGV4dGVuZHMgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3IgewotCi0JLyoqCi0JICogdmFsaWRhdGVzIGEgVVJMIHdpdGhvdXQgZGVjb2RpbmcgaXQKLQkgKi8KLQlwdWJsaWMgTGlua0luZm8gdmFsaWRhdGVMaW5rKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBhdHRyaWJ1dGVzLAotCQkJU3RyaW5nIHRleHQsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0KLQkJTGlua0luZm8gaW5mbyA9IG5ldyBMaW5rSW5mbyhvd25lciwgdGhpcywgcHViRGlyKSB7Ci0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlY29kZShTdHJpbmcgc3RyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCQkJcmV0dXJuIHN0cjsKLQkJCX0KLQkJfTsKLQkJaW5mby52YWxpZGF0ZUxpbmsoYXR0cmlidXRlcywgdGV4dCwgY29uZmlnKTsKLQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcmljaHRleHQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZDhlZmY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyByaWNoIHRleHQgZWRpdGluZyBzdXBwb3J0IGZvciB0aGUgZWRpdG9ycyBhbmQgUHJvcGVydGllcyB2aWV3LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0F1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmNGJjZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUxpc3RlbmVyOwotCi0vKioKLSAqIEFjY2Vzc2libGUgbGlzdGVuZXIgd2hpbGUgYXV0aG9yaW5nIHRoZSBjb250ZW50Ci0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lciBpbXBsZW1lbnRzIEFjY2Vzc2libGVMaXN0ZW5lciB7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKFN0cmluZyBuYW1lKXsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUxpc3RlbmVyI2dldERlc2NyaXB0aW9uKG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXREZXNjcmlwdGlvbihBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQllLnJlc3VsdCA9IHRoaXMuZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlTGlzdGVuZXIjZ2V0SGVscChvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZ2V0SGVscChBY2Nlc3NpYmxlRXZlbnQgZSkgewotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlTGlzdGVuZXIjZ2V0S2V5Ym9hcmRTaG9ydGN1dChvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZ2V0S2V5Ym9hcmRTaG9ydGN1dChBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUxpc3RlbmVyI2dldE5hbWUob3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsJCQotCQllLnJlc3VsdCA9IHRoaXMubmFtZTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogU2V0IG5hbWUgZm9yIHRoZSBsaXN0ZW5lcgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSl7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvRWRpdG9yc0NvbnRleHRIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0VkaXRvcnNDb250ZXh0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU3MWQ3NGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvRWRpdG9yc0NvbnRleHRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogRWRpdG9ycyBjb250ZXh0IGhlbHBlcgotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0b3JzQ29udGV4dEhlbHBlciB7Ci0KLQkvKioKLQkgKiBTZXQgY29udGV4dCBoZWxwIGZvciBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSB1aUNvbXBvc2l0ZQotCSAqIEBwYXJhbSBvYmoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SGVscChDb250cm9sIHVpQ29tcG9zaXRlLCBPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlvYmogPSBMaWJyYXJ5VXRpbC51bndyYXAob2JqKTsKLQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvbGUpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfUk9MRV9DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgVGFzaykpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9UQVNLX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkpIHsKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX1dPUktfUFJPRFVDVF9DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfR1VJREFOQ0VfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfRElTQ0lQTElORV9DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSkgewotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscCgKLQkJCQkJCQl1aUNvbXBvc2l0ZSwKLQkJCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfRElTQ0lQTElORV9HUk9VUElOR19DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgRG9tYWluKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX0RPTUFJTl9DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKSkgewotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscCgKLQkJCQkJCQl1aUNvbXBvc2l0ZSwKLQkJCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfV09SS19QUk9EVUNUX1RZUEVfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfUk9MRV9TRVRfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykpIHsKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX1JPTFNFX1NFVF9HUk9VUElOR19DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgVG9vbCkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9UT09MX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJCS5zZXRIZWxwKAotCQkJCQkJCXVpQ29tcG9zaXRlLAotCQkJCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9DVVNUT01fQ0FURUdPUllfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCBjb250ZXh0IGhlbHAgZm9yIHByb2Nlc3MgdHlwZQotCSAqIAotCSAqIEBwYXJhbSB1aUNvbXBvc2l0ZQotCSAqIEBwYXJhbSBwcm9jVHlwZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRIZWxwKENvbnRyb2wgdWlDb21wb3NpdGUsIFN0cmluZyBwcm9jVHlwZSkgewotCQlpZiAoKHByb2NUeXBlICE9IG51bGwgJiYgcHJvY1R5cGUKLQkJCQkuZXF1YWxzSWdub3JlQ2FzZSgiY2FwYWJpbGl0eSBwYXR0ZXJuIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX0NQX0RFU0NSSVBUSU9OX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoKHByb2NUeXBlICE9IG51bGwgJiYgcHJvY1R5cGUuZXF1YWxzSWdub3JlQ2FzZSgiZGVsaXZlcnkgcHJvY2VzcyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJCS5zZXRIZWxwKAotCQkJCQkJCXVpQ29tcG9zaXRlLAotCQkJCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9EUF9ERVNDUklQVElPTl9DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfRFBfREVTQ1JJUFRJT05fQ09OVEVYVF9IRUxQX0lEKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0xpYnJhcnlWYWxpZGF0aW9uTWFya2VySGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9MaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNjc5Y2E4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0xpYnJhcnlWYWxpZGF0aW9uTWFya2VySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbi5FY2xpcHNlUmVzb3VyY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LlRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkNvbnRlbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlciBleHRlbmRzIEVjbGlwc2VSZXNvdXJjZXNVdGlsIHsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlciBJTlNUQU5DRSA9IG5ldyBMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlcigpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSUQgPSAiZ3VpZCI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29udGFpbmVyU2V0IGV4dGVuZHMgSGFzaFNldCB7Ci0JCS8qKgotCQkgKiAKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXB1YmxpYyBDb250YWluZXJTZXQoKSB7Ci0JCQlzdXBlcigpOwotCQkJaW5pdCgpOwotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihuZXcgTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCQlpbml0KCk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJCWNsZWFyKCk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQkJaW5pdCgpOwotCQkJCX0JCQkJCi0JCQl9KTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCQljbGVhcigpOwotCQkJCi0JCQkvLyBmaWxsIHRoaXMgc2V0IHdpdGggY29udGFpbmVycyBvZiBtYXJrZWQgb2JqZWN0cwotCQkJLy8KLQkJCU1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJaWYobGliICE9IG51bGwpIHsKLQkJCQlJUHJvamVjdCBwcmogPSBNZXRob2RMaWJyYXJ5UHJvamVjdC5maW5kUHJvamVjdChsaWIpOwotCQkJCWlmKHByaiAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJTWFya2VyW10gbWFya2VycyA9IHByai5maW5kTWFya2VycyhJTlNUQU5DRS5nZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoR1VJRCk7Ci0JCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKS5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJCQkJCWlmKGUgIT0gbnVsbCkgewotCQkJCQkJCQkvLyByZW1vdmUgaXRzIGNvbnRhaW5lcnMgZnJvbSBjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzCi0JCQkJCQkJCS8vCi0JCQkJCQkJCW1hcmtDb250YWluZXJzKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBtYXJrQ29udGFpbmVycyhNZXRob2RFbGVtZW50IGUpIHsKLQkJCWZvcihFT2JqZWN0IGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOyBjb250YWluZXIgIT0gbnVsbDsgY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKSkgewotCQkJCWFkZChjb250YWluZXIpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHVubWFya0NvbnRhaW5lcnMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCQlmb3IoRU9iamVjdCBjb250YWluZXIgPSBlLmVDb250YWluZXIoKTsgY29udGFpbmVyICE9IG51bGw7IGNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCkpIHsKLQkJCQlyZW1vdmUoY29udGFpbmVyKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBDb250YWluZXJTZXQgY29udGFpbmVyc09mTWFya2VkT2JqZWN0cyA9IG5ldyBDb250YWluZXJTZXQoKTsJCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5NYXJrZXJIZWxwZXIjZ2V0RmlsZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXByb3RlY3RlZCBJRmlsZSBnZXRGaWxlKFVSSSB1cmkpIHsKLQkJaWYodXJpLmlzRmlsZSgpKSB7Ci0JCQlyZXR1cm4gKElGaWxlKSBGaWxlTWFuYWdlci5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKHVyaS50b0ZpbGVTdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEZpbGUodXJpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlNYXJrZXJIZWxwZXIjYWRqdXN0TWFya2VyKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkanVzdE1hcmtlcihJTWFya2VyIG1hcmtlciwgRGlhZ25vc3RpYyBkaWFnbm9zdGljKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gcmV0ID0gc3VwZXIuYWRqdXN0TWFya2VyKG1hcmtlciwgZGlhZ25vc3RpYyk7Ci0JCWlmKCFkaWFnbm9zdGljLmdldERhdGEoKS5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdCBvID0gZGlhZ25vc3RpYy5nZXREYXRhKCkuZ2V0KDApOwotCQkJaWYobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKEdVSUQsICgoTWV0aG9kRWxlbWVudClvKS5nZXRHdWlkKCkpOwotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MT0NBVElPTiwgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKG8pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnZhbGlkKE9iamVjdCBvYmplY3QpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkvLyB0aGlzIGlzIGFuIFVJIG9iamVjdDogUHJvY2Vzc2VzCi0JCQkvLwotCQkJUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGlwID0gKFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqZWN0OwotCQkJT2JqZWN0IG87Ci0JCQlyZXR1cm4gKChvID0gaXAuZ2V0Q2FwYWJpbGl0eVBhdHRlcm5QYWNrYWdlKCkpICE9IG51bGwgJiYgY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy5jb250YWlucyhvKSkKLQkJCQl8fCAoKG8gPSBpcC5nZXREZWxpdmVyeVByb2Nlc3NQYWNrYWdlKCkpICE9IG51bGwgJiYgY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy5jb250YWlucyhvKSk7Ci0JCX0KLQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlcgotCQkJCXx8IG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRJdGVtUHJvdmlkZXIpIHsKLQkJCS8vIHRoaXMgaXMgYW4gVUkgb2JqZWN0Ci0JCQkvLwotCQkJb2JqZWN0ID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKW9iamVjdCkuZ2V0VGFyZ2V0KCk7Ci0JCX0KLQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgewotCQkJLy8gdGhpcyBpcyBhbiBVSSBvYmplY3Q6IGVpdGhlciBUYXNrcywgUm9sZXMsIFdvcmsgUHJvZHVjdHMsIG9yIEd1aWRhbmNlCi0JCQkvLwotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9ICgoVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpb2JqZWN0KS5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJaWYoSU5TVEFOQ0UuaGFzTWFya2VycyhpdGVyLm5leHQoKSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQkJCQkKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy5jb250YWlucyhvYmplY3QpIHx8IElOU1RBTkNFLmhhc01hcmtlcnMob2JqZWN0KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5NYXJrZXJIZWxwZXIjaGFzTWFya2VycyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc01hcmtlcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRGaWxlKG9iamVjdCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5leGlzdHMoKSkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCVN0cmluZyBndWlkID0gKChNZXRob2RFbGVtZW50KW9iamVjdCkuZ2V0R3VpZCgpOwotCQkJCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKGdldE1hcmtlcklEKCksIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJCQkJaWYoZ3VpZC5lcXVhbHMobWFya2VyLmdldEF0dHJpYnV0ZShHVUlEKSkpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuaGFzTWFya2VycyhvYmplY3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkZWxldGVNYXJrZXJzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0RmlsZShvYmplY3QpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlTdHJpbmcgZ3VpZCA9ICgoTWV0aG9kRWxlbWVudClvYmplY3QpLmdldEd1aWQoKTsKLQkJCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhnZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJCWlmKGd1aWQuZXF1YWxzKG1hcmtlci5nZXRBdHRyaWJ1dGUoR1VJRCkpKSB7Ci0JCQkJCQkJbWFya2VyLmRlbGV0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3VwZXIuZGVsZXRlTWFya2VycyhvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZU1hcmtlcnMoSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIGluY2x1ZGVTdWJ0eXBlcywgaW50IGRlcHRoKSB7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQl0cnkgewkJCQkKLQkJCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKGdldE1hcmtlcklEKCksIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEdVSUQpOwotCQkJCQlNZXRob2RFbGVtZW50IGUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJCWlmKGUgIT0gbnVsbCkgewotCQkJCQkJLy8gcmVtb3ZlIGl0cyBjb250YWluZXJzIGZyb20gY29udGFpbmVyc09mTWFya2VkT2JqZWN0cwotCQkJCQkJLy8KLQkJCQkJCWNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMudW5tYXJrQ29udGFpbmVycyhlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCi0JCQl9CQkJCi0JCX0KLQkJCQotCQlzdXBlci5kZWxldGVNYXJrZXJzKHJlc291cmNlLCBpbmNsdWRlU3VidHlwZXMsIGRlcHRoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTWFya2VycyhJUmVzb3VyY2UgcmVzb3VyY2UsIERpYWdub3N0aWMgZGlhZ25vc3RpYywgRGlhZ25vc3RpYyBwYXJlbnREaWFnbm9zdGljKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmNyZWF0ZU1hcmtlcnMocmVzb3VyY2UsIGRpYWdub3N0aWMsIHBhcmVudERpYWdub3N0aWMpOwotCQkKLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCXRyeSB7CQkJCQotCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoZ2V0TWFya2VySUQoKSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoR1VJRCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCQkJaWYoZSAhPSBudWxsKSB7Ci0JCQkJCQkvLyByZW1vdmUgaXRzIGNvbnRhaW5lcnMgZnJvbSBjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzCi0JCQkJCQkvLwotCQkJCQkJY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy5tYXJrQ29udGFpbmVycyhlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCi0JCQl9CQkJCi0JCX0KLQl9Ci0JCi0JLy9PdmVycmlkZSB0byBzZXBlcmF0ZSBlcnJvciBtZXNzYWdlIGluIGVycm9yIGRpYWxvZyBhbmQgcHJvYmxlbXMgdmlldyAoYnVnIDE3NDM1MSkKLQkvL05vdGU6IGJldHRlciBmaXggaXMgdG8gZXh0ZW5kIEJhc2ljRGlhZ25vc3RpYyB0byBlbmNhcHN1bGF0ZSBib3RoIHR5cGVzIG9mIG1zZ3MgLT4gdG8gZG8gbGF0ZXIKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXBvc2VNZXNzYWdlKERpYWdub3N0aWMgZGlhZ25vc3RpYywgRGlhZ25vc3RpYyBwYXJlbnREaWFnbm9zdGljKSB7Ci0JCWludCBpeCA9IGRpYWdub3N0aWMuZ2V0TWVzc2FnZSgpLmluZGV4T2YoTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2cyKTsKLQkJaWYgKGl4ID4gMCkgewotCQkJcmV0dXJuIGRpYWdub3N0aWMuZ2V0TWVzc2FnZSgpLnN1YnN0cmluZygwLCBpeCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNvbXBvc2VNZXNzYWdlKGRpYWdub3N0aWMsIHBhcmVudERpYWdub3N0aWMpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL01hcmtlclJlc29sdXRpb25HZW5lcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL01hcmtlclJlc29sdXRpb25HZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjBhZDU4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3I7Ci0KLS8qKgotICogQ3JlYXRlIHJlc291bHRpb25zIGZvciB0aGUgZ2l2ZW4gbWFya2VyCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciBpbXBsZW1lbnRzIElNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJTWFya2VyUmVzb2x1dGlvbltdIEVNUFRZX1JFU09MVVRJT05TID0gbmV3IElNYXJrZXJSZXNvbHV0aW9uWzBdOwotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFNob3dPd25lckluTGlicmFyeVZpZXcgaW1wbGVtZW50cyBJTWFya2VyUmVzb2x1dGlvbiB7Ci0KLQkJcHJpdmF0ZSBPYmplY3Qgb3duZXI7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBvd25lcgotCQkgKi8KLQkJcHJpdmF0ZSBTaG93T3duZXJJbkxpYnJhcnlWaWV3KE9iamVjdCBvd25lcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMub3duZXIgPSBvd25lcjsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uI2dldExhYmVsKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9zaG93T3duZXJJbkxpYnJhcnlWaWV3OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb24jcnVuKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oSU1hcmtlciBtYXJrZXIpIHsKLQkJCUxpYnJhcnlWaWV3LmdldFZpZXcoKS5zZXRTZWxlY3Rpb25Ub1ZpZXdlcihvd25lcik7Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1hcmtlclJlc29sdXRpb24gaW1wbGVtZW50cyBJTWFya2VyUmVzb2x1dGlvbiB7Ci0JCXByaXZhdGUgRU9iamVjdCBvd25lcjsKLQkJcHJpdmF0ZSBFUmVmZXJlbmNlIHJlZmVyZW5jZTsKLQkJcHJpdmF0ZSBpbnQgaW5kZXg7Ci0JCQkJCi0JCXByaXZhdGUgTWFya2VyUmVzb2x1dGlvbihFT2JqZWN0IG93bmVyLCBFUmVmZXJlbmNlIHJlZiwgaW50IGluZGV4KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5vd25lciA9IG93bmVyOwotCQkJdGhpcy5yZWZlcmVuY2UgPSByZWY7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbiNnZXRMYWJlbCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlVW5yZXNvbHZlZFJlZmVyZW5jZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKElNYXJrZXIgbWFya2VyKSB7Ci0JCQlpZihyZWZlcmVuY2UuaXNNYW55KCkpIHsKLQkJCQkoKExpc3Qpb3duZXIuZUdldChyZWZlcmVuY2UpKS5yZW1vdmUoaW5kZXgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJb3duZXIuZVNldChyZWZlcmVuY2UsIG51bGwpOwotCQkJfQotCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJcGVyc2lzdGVyLnNhdmUob3duZXIuZVJlc291cmNlKCkpOwotCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJfQotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IjZ2V0UmVzb2x1dGlvbnMob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcikKLQkgKi8KLQlwdWJsaWMgSU1hcmtlclJlc29sdXRpb25bXSBnZXRSZXNvbHV0aW9ucyhJTWFya2VyIG1hcmtlcikgewotCQkvLyBUaGUgb25seSByZXNvbHV0aW9uIHdlIHByb3ZpZGUgcmlnaHQgbm93IGlzIHJlbW92aW5nIHRoZSB1bnJlc29sdmluZyBwcm94eQotCQkvLwotCQl0cnkgewotCQkJU3RyaW5nIHByb3h5VVJJID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyLlBST1hZX1VSSSk7Ci0JCQlTdHJpbmcgb3duZXJHVUlEID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyLk9XTkVSX0dVSUQpOwotCQkJaWYocHJveHlVUkkgIT0gbnVsbCAmJiBvd25lckdVSUQgIT0gbnVsbCkgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlKG1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCUVPYmplY3Qgb3duZXIgPSByZXNvdXJjZS5nZXRFT2JqZWN0KG93bmVyR1VJRCk7Ci0JCQkJCWlmKG93bmVyICE9IG51bGwpIHsKLQkJCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHByb3h5VVJJKTsKLQkJCQkJCS8vIGZpbmQgdGhlIHByb3h5Ci0JCQkJCQkvLwotCQkJCQkJaW50IGluZGV4ID0gLTE7Ci0JCQkJCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG51bGw7Ci0JCQkJCQlmaW5kX3Byb3h5X2xvb3A6Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvd25lci5lQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlFUmVmZXJlbmNlIHJlZiA9IChFUmVmZXJlbmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZihyZWYuaXNDaGFuZ2VhYmxlKCkgJiYgIXJlZi5pc0Rlcml2ZWQoKSkgewotCQkJCQkJCQlpZihyZWYuaXNNYW55KCkpIHsKLQkJCQkJCQkJCUludGVybmFsRUxpc3QgbGlzdCA9IChJbnRlcm5hbEVMaXN0KSBvd25lci5lR2V0KHJlZik7Ci0JCQkJCQkJCQlpbnQgaWQgPSAwOwotCQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuYmFzaWNJdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCUludGVybmFsRU9iamVjdCBvID0gKEludGVybmFsRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQkJCWlmKG8uZUlzUHJveHkoKSAmJiB1cmkuZXF1YWxzKG8uZVByb3h5VVJJKCkpKSB7Ci0JCQkJCQkJCQkJCWluZGV4ID0gaWQ7Ci0JCQkJCQkJCQkJCXJlZmVyZW5jZSA9IHJlZjsKLQkJCQkJCQkJCQkJYnJlYWsgZmluZF9wcm94eV9sb29wOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlpZCsrOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJSW50ZXJuYWxFT2JqZWN0IG8gPSAoSW50ZXJuYWxFT2JqZWN0KSBvd25lci5lR2V0KHJlZiwgZmFsc2UpOwotCQkJCQkJCQkJaWYobyAhPSBudWxsICYmIG8uZUlzUHJveHkoKSAmJiB1cmkuZXF1YWxzKG8uZVByb3h5VVJJKCkpKSB7Ci0JCQkJCQkJCQkJcmVmZXJlbmNlID0gcmVmOwotCQkJCQkJCQkJCWJyZWFrIGZpbmRfcHJveHlfbG9vcDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmKHJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQkJCQkJT2JqZWN0IHNlbGVjdGFibGVPd25lciA9IGdldFNlbGVjdGFibGVPYmplY3Qob3duZXIpOwotCQkJCQkJCWlmKHNlbGVjdGFibGVPd25lciAhPSBudWxsKSB7Ci0JCQkJCQkJCXJldHVybiBuZXcgSU1hcmtlclJlc29sdXRpb25bXSB7Ci0JCQkJCQkJCQkJbmV3IE1hcmtlclJlc29sdXRpb24ob3duZXIsIHJlZmVyZW5jZSwgaW5kZXgpLAotCQkJCQkJCQkJCW5ldyBTaG93T3duZXJJbkxpYnJhcnlWaWV3KHNlbGVjdGFibGVPd25lcikKLQkJCQkJCQkJfTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCXJldHVybiBuZXcgSU1hcmtlclJlc29sdXRpb25bXSB7Ci0JCQkJCQkJCQkJbmV3IE1hcmtlclJlc29sdXRpb24ob3duZXIsIHJlZmVyZW5jZSwgaW5kZXgpLAotCQkJCQkJCQl9OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gRU1QVFlfUkVTT0xVVElPTlM7Ci0JfQotCi0JLyoqCi0JICogR2V0IHNlbGVjdGFibGUgb2JqZWN0IAotCSAqIEBwYXJhbSBvd25lcgotCSAqIEByZXR1cm4KLQkgKiAJCQlvYmplY3QgaXRzZWxmCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldFNlbGVjdGFibGVPYmplY3QoRU9iamVjdCBvd25lcikgewotCQlpZihvd25lciBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBvd25lciBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50IHx8IG93bmVyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UgCi0JCQkJfHwgb3duZXIgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlyZXR1cm4gb3duZXI7Ci0JCX0KLQkJaWYob3duZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wID0gVW1hVXRpbC5nZXRQcm9jZXNzQ29tcG9uZW50KChNZXRob2RFbGVtZW50KSBvd25lcik7Ci0JCQlpZihwcm9jQ29tcCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHByb2NDb21wOwotCQkJfQotCQl9Ci0JCWlmKG93bmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCXJldHVybiBvd25lcjsKLQkJfQotCQlpZihvd25lciBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbiAmJiBvd25lci5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJcmV0dXJuIG93bmVyLmVDb250YWluZXIoKTsgCi0JCX0KLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBvd25lci5lUmVzb3VyY2UoKTsKLQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQlpZihlICE9IG93bmVyKSB7Ci0JCQlyZXR1cm4gZ2V0U2VsZWN0YWJsZU9iamVjdChlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9NZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvTWV0aG9kUmljaFRleHRNYXJrZXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmY4YThhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9NZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVmFsaWRhdGVBY3Rpb24uRWNsaXBzZVJlc291cmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuQ29udGVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5NZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBiYXNlZCBvbiBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIgCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlciBleHRlbmRzIEVjbGlwc2VSZXNvdXJjZXNVdGlsIHsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlciBJTlNUQU5DRSA9IG5ldyBNZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlcigpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSUQgPSAiZ3VpZCI7Ci0KLQkvLyBtYXJrZXIgSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLRVJfSUQgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5tZXRob2RSaWNoVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBtYXJrZXIgYXR0cmlidXRlCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1FVEhPRF9GSUVMRE5BTUUgPSAiTWV0aG9kRmllbGROYW1lIjsKLQotCS8vIHByaXZhdGUgY29uc3RydWN0b3IKLQlwcml2YXRlIE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyKCkgewotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250YWluZXJNYXAgZXh0ZW5kcyBIYXNoTWFwPE9iamVjdCwgSW50ZWdlcj4gewotCQkvKioKLQkJICogCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgQ29udGFpbmVyTWFwKCkgewotCQkJc3VwZXIoKTsKLQkJCWluaXRNYXAoKTsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobmV3IExpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQkJaW5pdE1hcCgpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCQljbGVhcigpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJCWluaXRNYXAoKTsKLQkJCQl9CQkJCQotCQkJfSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBpbml0TWFwKCkgewotCQkJY2xlYXIoKTsKLQkJCQotCQkJLy8gZmlsbCB0aGlzIHNldCB3aXRoIGNvbnRhaW5lcnMgb2YgbWFya2VkIG9iamVjdHMKLQkJCS8vCi0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCWlmKGxpYiAhPSBudWxsKSB7Ci0JCQkJSVByb2plY3QgcHJqID0gTWV0aG9kTGlicmFyeVByb2plY3QuZmluZFByb2plY3QobGliKTsKLQkJCQlpZihwcmogIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJSU1hcmtlcltdIG1hcmtlcnMgPSBwcmouZmluZE1hcmtlcnMoSU5TVEFOQ0UuZ2V0TWFya2VySUQoKSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEdVSUQpOwotCQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCQkJCQlpZihlICE9IG51bGwpIHsKLQkJCQkJCQkJLy8gcmVtb3ZlIGl0cyBjb250YWluZXJzIGZyb20gY29udGFpbmVyc09mTWFya2VkT2JqZWN0cwotCQkJCQkJCQkvLwotCQkJCQkJCQltYXJrQ29udGFpbmVycyhlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgaW5jcmVtZW50KE9iamVjdCBvYmplY3QpIHsKLQkJCUludGVnZXIgY291bnQ7Ci0JCQlpZiAoY29udGFpbnNLZXkob2JqZWN0KSkgewotCQkJCWNvdW50ID0gZ2V0KG9iamVjdCk7Ci0JCQl9IGVsc2UgewotCQkJCWNvdW50ID0gbmV3IEludGVnZXIoMCk7Ci0JCQl9Ci0JCQljb3VudCsrOwotCQkJcHV0KG9iamVjdCwgY291bnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGRlY3JlbWVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZiAoY29udGFpbnNLZXkob2JqZWN0KSkgewotCQkJCUludGVnZXIgY291bnQgPSBnZXQob2JqZWN0KTsKLQkJCQlpZiAoY291bnQgPT0gMSkgewotCQkJCQkvLyByZW1vdmUgb2JqZWN0Ci0JCQkJCXJlbW92ZShvYmplY3QpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvdW50LS07Ci0JCQkJCXB1dChvYmplY3QsIGNvdW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBtYXJrQ29udGFpbmVycyhNZXRob2RFbGVtZW50IGUpIHsKLQkJCWZvcihFT2JqZWN0IGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOyBjb250YWluZXIgIT0gbnVsbDsgY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKSkgewotCQkJCWluY3JlbWVudChjb250YWluZXIpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHVubWFya0NvbnRhaW5lcnMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCQlmb3IoRU9iamVjdCBjb250YWluZXIgPSBlLmVDb250YWluZXIoKTsgY29udGFpbmVyICE9IG51bGw7IGNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCkpIHsKLQkJCQlkZWNyZW1lbnQoY29udGFpbmVyKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBDb250YWluZXJNYXAgY29udGFpbmVyc09mTWFya2VkT2JqZWN0cyA9IG5ldyBDb250YWluZXJNYXAoKTsJCi0JCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXJrZXJJRCgpIHsKLQkJcmV0dXJuIE1BUktFUl9JRDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5NYXJrZXJIZWxwZXIjZ2V0RmlsZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXByb3RlY3RlZCBJRmlsZSBnZXRGaWxlKFVSSSB1cmkpIHsKLQkJaWYodXJpLmlzRmlsZSgpKSB7Ci0JCQlyZXR1cm4gKElGaWxlKSBGaWxlTWFuYWdlci5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKHVyaS50b0ZpbGVTdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEZpbGUodXJpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlNYXJrZXJIZWxwZXIjYWRqdXN0TWFya2VyKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkanVzdE1hcmtlcihJTWFya2VyIG1hcmtlciwgRGlhZ25vc3RpYyBkaWFnbm9zdGljKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gcmV0ID0gc3VwZXIuYWRqdXN0TWFya2VyKG1hcmtlciwgZGlhZ25vc3RpYyk7Ci0JCWlmKCFkaWFnbm9zdGljLmdldERhdGEoKS5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdCBvID0gZGlhZ25vc3RpYy5nZXREYXRhKCkuZ2V0KDApOwotCQkJT2JqZWN0IHN0ciA9IGRpYWdub3N0aWMuZ2V0RGF0YSgpLmdldCgxKTsKLQkJCWlmKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShHVUlELCAoKE1ldGhvZEVsZW1lbnQpbykuZ2V0R3VpZCgpKTsKLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTE9DQVRJT04sIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChvKSk7Ci0JCQl9Ci0JCQlpZiAoc3RyIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShNRVRIT0RfRklFTEROQU1FLCAoU3RyaW5nKXN0cik7Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnZhbGlkKE9iamVjdCBvYmplY3QpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkvLyB0aGlzIGlzIGFuIFVJIG9iamVjdDogUHJvY2Vzc2VzCi0JCQkvLwotCQkJUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGlwID0gKFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqZWN0OwotCQkJT2JqZWN0IG87Ci0JCQlyZXR1cm4gKChvID0gaXAuZ2V0Q2FwYWJpbGl0eVBhdHRlcm5QYWNrYWdlKCkpICE9IG51bGwgJiYgY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy5jb250YWluc0tleShvKSkKLQkJCQl8fCAoKG8gPSBpcC5nZXREZWxpdmVyeVByb2Nlc3NQYWNrYWdlKCkpICE9IG51bGwgJiYgY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy5jb250YWluc0tleShvKSk7Ci0JCX0KLQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlcgotCQkJCXx8IG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRJdGVtUHJvdmlkZXIpIHsKLQkJCS8vIHRoaXMgaXMgYW4gVUkgb2JqZWN0Ci0JCQkvLwotCQkJb2JqZWN0ID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKW9iamVjdCkuZ2V0VGFyZ2V0KCk7Ci0JCX0KLQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgewotCQkJLy8gdGhpcyBpcyBhbiBVSSBvYmplY3Q6IGVpdGhlciBUYXNrcywgUm9sZXMsIFdvcmsgUHJvZHVjdHMsIG9yIEd1aWRhbmNlCi0JCQkvLwotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9ICgoVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpb2JqZWN0KS5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmKGNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMuY29udGFpbnNLZXkob2JqKSB8fCBJTlNUQU5DRS5oYXNNYXJrZXJzKG9iaikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQkJCQkKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy5jb250YWluc0tleShvYmplY3QpIHx8IElOU1RBTkNFLmhhc01hcmtlcnMob2JqZWN0KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5NYXJrZXJIZWxwZXIjaGFzTWFya2VycyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc01hcmtlcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRGaWxlKG9iamVjdCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5leGlzdHMoKSkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCVN0cmluZyBndWlkID0gKChNZXRob2RFbGVtZW50KW9iamVjdCkuZ2V0R3VpZCgpOwotCQkJCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKGdldE1hcmtlcklEKCksIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJCQkJaWYoZ3VpZC5lcXVhbHMobWFya2VyLmdldEF0dHJpYnV0ZShHVUlEKSkpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuaGFzTWFya2VycyhvYmplY3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkZWxldGVNYXJrZXJzKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0RmlsZShvYmplY3QpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlTdHJpbmcgZ3VpZCA9ICgoTWV0aG9kRWxlbWVudClvYmplY3QpLmdldEd1aWQoKTsKLQkJCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhnZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJCWlmKGd1aWQuZXF1YWxzKG1hcmtlci5nZXRBdHRyaWJ1dGUoR1VJRCkpICYmIChmaWVsZE5hbWUgPT0gbnVsbCB8fAotCQkJCQkJCQlmaWVsZE5hbWUuZXF1YWxzKG1hcmtlci5nZXRBdHRyaWJ1dGUoTUVUSE9EX0ZJRUxETkFNRSkpKSkgewotCQkJCQkJCW1hcmtlci5kZWxldGUoKTsKLQkJCQkJCQlNZXRob2RFbGVtZW50IGUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJCQkJaWYoZSAhPSBudWxsKSB7Ci0JCQkJCQkJCS8vIHJlbW92ZSBpdHMgY29udGFpbmVycyBmcm9tIGNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMKLQkJCQkJCQkJLy8KLQkJCQkJCQkJY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy51bm1hcmtDb250YWluZXJzKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXN1cGVyLmRlbGV0ZU1hcmtlcnMob2JqZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVNYXJrZXJzKElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiBpbmNsdWRlU3VidHlwZXMsIGludCBkZXB0aCkgewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdHJ5IHsJCQkJCi0JCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhnZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShHVUlEKTsKLQkJCQkJTWV0aG9kRWxlbWVudCBlID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKS5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJCQlpZihlICE9IG51bGwpIHsKLQkJCQkJCS8vIHJlbW92ZSBpdHMgY29udGFpbmVycyBmcm9tIGNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMKLQkJCQkJCS8vCi0JCQkJCQljb250YWluZXJzT2ZNYXJrZWRPYmplY3RzLnVubWFya0NvbnRhaW5lcnMoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQotCQkJfQkJCQotCQl9Ci0JCQkKLQkJc3VwZXIuZGVsZXRlTWFya2VycyhyZXNvdXJjZSwgaW5jbHVkZVN1YnR5cGVzLCBkZXB0aCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU1hcmtlcnMoSVJlc291cmNlIHJlc291cmNlLCBEaWFnbm9zdGljIGRpYWdub3N0aWMsIERpYWdub3N0aWMgcGFyZW50RGlhZ25vc3RpYykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlci5jcmVhdGVNYXJrZXJzKHJlc291cmNlLCBkaWFnbm9zdGljLCBwYXJlbnREaWFnbm9zdGljKTsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IG51bGw7Ci0JCWlmKCFkaWFnbm9zdGljLmdldERhdGEoKS5pc0VtcHR5KCkgJiYgZGlhZ25vc3RpYy5nZXREYXRhKCkuc2l6ZSgpID4gMSkgewotCQkJZmllbGROYW1lID0gKFN0cmluZylkaWFnbm9zdGljLmdldERhdGEoKS5nZXQoMSk7Ci0JCX0KLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgZmllbGROYW1lICE9IG51bGwpIHsKLQkJCXRyeSB7CQkJCQotCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoZ2V0TWFya2VySUQoKSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoR1VJRCk7Ci0JCQkJCWlmKGZpZWxkTmFtZS5lcXVhbHMobWFya2VyLmdldEF0dHJpYnV0ZShNRVRIT0RfRklFTEROQU1FKSkpIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCQkJCWlmKGUgIT0gbnVsbCkgewotCQkJCQkJCS8vIGFkZCBpdHMgY29udGFpbmVycyB0byBjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzCi0JCQkJCQkJLy8KLQkJCQkJCQljb250YWluZXJzT2ZNYXJrZWRPYmplY3RzLm1hcmtDb250YWluZXJzKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkKLQkJCX0JCQkKLQkJfQotCi0JfQotCQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcG9zZU1lc3NhZ2UoRGlhZ25vc3RpYyBkaWFnbm9zdGljLCBEaWFnbm9zdGljIHBhcmVudERpYWdub3N0aWMpCi0gICAgewotICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBkaWFnbm9zdGljLmdldE1lc3NhZ2UoKTsKLSAgICAgIGlmIChwYXJlbnREaWFnbm9zdGljICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwYXJlbnRNZXNzYWdlID0gcGFyZW50RGlhZ25vc3RpYy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGlmIChwYXJlbnRNZXNzYWdlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZSAhPSBudWxsID8gcGFyZW50TWVzc2FnZSArICIgIiArIG1lc3NhZ2UgOiBwYXJlbnRNZXNzYWdlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvUmVmcmVzaEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL1JlZnJlc2hIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkMzhkZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvUmVmcmVzaEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db25maWd1cmF0aW9uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0U2VsZWN0aW9uRGlhbG9nOwotCi0vKioKLSAqIE5vdGlmeSBjaGFuZ2VzIGluIHJlc291cmNlcyB0byByZWZyZXNoCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZyZXNoSGFuZGxlciBpbXBsZW1lbnRzIElSZWZyZXNoSGFuZGxlciB7Ci0KLQlwcml2YXRlIExpYnJhcnlWaWV3IGxpYlZpZXc7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICovCi0JcHVibGljIFJlZnJlc2hIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hIYW5kbGVyI3JlZnJlc2gob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaChmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJbGliVmlldyA9IExpYnJhcnlWaWV3LmdldFZpZXcoKTsKLQkJVmlld2VyIHZpZXdlciA9IGxpYlZpZXcgIT0gbnVsbCA/IGxpYlZpZXcuZ2V0Vmlld2VyKCkgOiBudWxsOwotCQlDb250cm9sIGN0cmwgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQlpZiAoY3RybCA9PSBudWxsIHx8IGN0cmwuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0JCWlmIChjdHJsLmdldERpc3BsYXkoKS5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7Ci0JCQlkb1JlZnJlc2gobW9uaXRvcik7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlkb1JlZnJlc2gobW9uaXRvcik7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkb1JlZnJlc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmICghUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlbW92ZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKLQkJCUFycmF5TGlzdCByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdChSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldFJlbW92ZWRSZXNvdXJjZXMoKSk7Ci0JCQloYW5kbGVSZW1vdmVkUmVzb3VyY2VzKHJlbW92ZWRSZXNvdXJjZXMpOwotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlbW92ZWRSZXNvdXJjZXMoKS5yZW1vdmVBbGwoCi0JCQkJCXJlbW92ZWRSZXNvdXJjZXMpOwotCQl9Ci0JCWlmICghUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldENoYW5nZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKLQkJCUFycmF5TGlzdCBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdChSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7Ci0JCQloYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKGNoYW5nZWRSZXNvdXJjZXMpOwotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldENoYW5nZWRSZXNvdXJjZXMoKS5yZW1vdmVBbGwoCi0JCQkJCWNoYW5nZWRSZXNvdXJjZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIHJlbW92ZSByZXNvdXJjZXMKLQkgKiBAcGFyYW0gcmVtb3ZlZFJlc291cmNlczIKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gaGFuZGxlUmVtb3ZlZFJlc291cmNlcyhDb2xsZWN0aW9uIHJlbW92ZWRSZXNvdXJjZXMpIHsKLQkJcmV0dXJuIHJlbW92ZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIGNoYW5nZWQgcmVzb3VyY2VzCi0JICogCi0JICogQHBhcmFtIGNoYW5nZWRSZXNvdXJjZXMKLQkgKiBAcmV0dXJuIHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiByZWxvYWRlZAotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKENvbGxlY3Rpb24gY2hhbmdlZFJlc291cmNlcykgewotCQlDb250cm9sIGN0cmwgPSBsaWJWaWV3LmdldFZpZXdlcigpLmdldENvbnRyb2woKTsKLQkJaWYgKGN0cmwgPT0gbnVsbCB8fCBjdHJsLmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gbGliVmlldy5nZXRTaXRlKCkuZ2V0UGFnZSgpOwotCQlTaGVsbCBzaGVsbCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJQXJyYXlMaXN0IGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQXJyYXlMaXN0IGNoYW5nZWRSZXNvdXJjZUxpc3QgPSBuZXcgQXJyYXlMaXN0KGNoYW5nZWRSZXNvdXJjZXMpOwotCQkvLyBmaW5kIGFsbCBlZGl0b3Igd2l0aCBkaXJ0eSBjb25mbGljdAotCQkvLwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvciAmJiBlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJQ29sbGVjdGlvbiB1c2VkUmVzb3VyY2VzID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpCi0JCQkJCQkuZ2V0VXNlZFJlc291cmNlcygpOwotCQkJCWNoZWNrX3Jlc291cmNlOiBmb3IgKGludCBqID0gMDsgaiA8IGNoYW5nZWRSZXNvdXJjZUxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGNoYW5nZWRSZXNvdXJjZUxpc3QuZ2V0KGopOwotCQkJCQlpZiAodXNlZFJlc291cmNlcy5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJCWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5hZGQoZWRpdG9yKTsKLQkJCQkJCWJyZWFrIGNoZWNrX3Jlc291cmNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsIEFycmF5TGlzdCBlZGl0b3JzVG9SZWZyZXNoID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoIWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5pc0VtcHR5KCkpIHsKLQkJCS8vIHByb21wdCB1c2VyIHRvIGRpc2NhcmQgY2hhbmdlcyBpbiBlZGl0b3JzIHRoYXQgY29uZmxpY3Qgd2l0aAotCQkJLy8gb3V0c2lkZSBjaGFuZ2UKLQkJCS8vCi0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkJTGlzdCBmQ29udGVudHM7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCQlpZiAoZkNvbnRlbnRzICE9IG51bGwgJiYgZkNvbnRlbnRzID09IGlucHV0RWxlbWVudCkKLQkJCQkJCXJldHVybiBmQ29udGVudHMudG9BcnJheSgpOwotCQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsCi0JCQkJCQlPYmplY3QgbmV3SW5wdXQpIHsKLQkJCQkJaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgTGlzdCkKLQkJCQkJCWZDb250ZW50cyA9IChMaXN0KSBuZXdJbnB1dDsKLQkJCQkJZWxzZQotCQkJCQkJZkNvbnRlbnRzID0gbnVsbDsKLQotCQkJCX0KLQotCQkJfTsKLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JCQkJICovCi0JCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCQkJCXJldHVybiAoKElFZGl0b3JQYXJ0KSBlbGVtZW50KS5nZXRUaXRsZSgpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JCQkJICovCi0JCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCQkJCXJldHVybiAoKElFZGl0b3JQYXJ0KSBlbGVtZW50KS5nZXRUaXRsZUltYWdlKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOwotCQkJCX0KLQkJCX07Ci0JCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfRmlsZUNvbmZsaWN0X2xhYmVsOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1dBUk5fRmlsZUNvbmZsaWN0OyAKLQkJCUxpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IExpc3RTZWxlY3Rpb25EaWFsb2coc2hlbGwsCi0JCQkJCWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCwgY29udGVudFByb3ZpZGVyLCBsYWJlbFByb3ZpZGVyLAotCQkJCQltc2cpOwotCQkJZGxnLnNldFRpdGxlKHRpdGxlKTsKLQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWRsZy5vcGVuKCk7Ci0JCQlPYmplY3RbXSByZXN1bHQgPSBkbGcuZ2V0UmVzdWx0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJCU9iamVjdCBlZGl0b3IgPSByZXN1bHRbaV07Ci0JCQkJZWRpdG9yc1RvUmVmcmVzaC5hZGQoZWRpdG9yKTsKLQkJCQlkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QucmVtb3ZlKGVkaXRvcik7Ci0JCQl9Ci0JCQkvLyByZW1vdmUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IGRpcnR5IGVkaXRvcnMgd2l0aCBjb25mbGljdCBmcm9tIHRoZQotCQkJLy8gY29sbGVjdGlvbiBvZiBjaGFuZ2VkIHJlc291cmNlcwotCQkJLy8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0Ci0JCQkJCQkuZ2V0KGkpOwotCQkJCUNvbGxlY3Rpb24gdXNlZFJlc291cmNlcyA9IGVkaXRvci5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJY2hhbmdlZFJlc291cmNlTGlzdC5yZW1vdmVBbGwodXNlZFJlc291cmNlcyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWNoYW5nZWRSZXNvdXJjZUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvciAmJiAhZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCQlDb2xsZWN0aW9uIHVzZWRSZXNvdXJjZXMgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikKLQkJCQkJCQkuZ2V0VXNlZFJlc291cmNlcygpOwotCQkJCQljaGVja19yZXNvdXJjZTogZm9yIChpbnQgaiA9IDA7IGogPCBjaGFuZ2VkUmVzb3VyY2VMaXN0Ci0JCQkJCQkJLnNpemUoKTsgaisrKSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgY2hhbmdlZFJlc291cmNlTGlzdAotCQkJCQkJCQkuZ2V0KGopOwotCQkJCQkJaWYgKHVzZWRSZXNvdXJjZXMuY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQkJCQkJZWRpdG9yc1RvUmVmcmVzaC5hZGQoZWRpdG9yKTsKLQkJCQkJCQlicmVhayBjaGVja19yZXNvdXJjZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gUmVsb2FkIHRoZSBzZWxlY3RlZCBjaGFuZ2VkIHJlc291cmNlcy4KLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5yZWxvYWRSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlTGlzdCk7Ci0JCQl9Ci0KLQkJCWxpYlZpZXcuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCQkJQ29uZmlndXJhdGlvblZpZXcgY29uZmlnVmlldyA9IENvbmZpZ3VyYXRpb25WaWV3LmdldFZpZXcoKTsKLQkJCWlmIChjb25maWdWaWV3ICE9IG51bGwpIHsKLQkJCQljdHJsID0gY29uZmlnVmlldy5nZXRWaWV3ZXIoKS5nZXRDb250cm9sKCk7Ci0JCQkJaWYgKGN0cmwgIT0gbnVsbCAmJiAhY3RybC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJY29uZmlnVmlldy5nZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghZWRpdG9yc1RvUmVmcmVzaC5pc0VtcHR5KCkpIHsKLQkJCXNoZWxsLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvcnNUb1JlZnJlc2guc2l6ZSgpOyBpKyspIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcnNUb1JlZnJlc2gKLQkJCQkJCQkJLmdldChpKTsKLQkJCQkJCWVkaXRvci5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0KLQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZUxpc3Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9SaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmNiZDgwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9SaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5JbWFnZUh5cGVybGluazsKLQotLyoqCi0gKiBTaW1wbGUgY29udGFpbmVyIGNsYXNzIHVzZWQgYXMgYSByZXR1cm4gdmFsdWUgZm9yIEZvcm1VSSBjb252ZW5pZW5jZSBtZXRob2RzCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciB7Ci0JcHVibGljIElNZXRob2RSaWNoVGV4dCByaWNoVGV4dDsKLQlwdWJsaWMgSW1hZ2VIeXBlcmxpbmsgbGluazsKLQkKLQlwdWJsaWMgUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIoSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0LCBJbWFnZUh5cGVybGluayBsaW5rKSB7Ci0JCXRoaXMucmljaFRleHQgPSByaWNoVGV4dDsKLQkJdGhpcy5saW5rID0gbGluazsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9VSUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvVUlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjc5YWRlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9VSUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5CcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsLkNvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JSW5wdXRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JbnB1dERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLQotCi0vKioKLSAqIEhlbHBlciBVdGlsaXR5IGNsYXNzIGZvciBVSQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVJSGVscGVyIHsKLQotCS8qKgotCSAqIFNldHRpbmcgaXRlbXMgaW4gYSB0YWJsZQotCSAqIAotCSAqIEBwYXJhbSB0YWJsZQotCSAqIEBwYXJhbSBpdGVtcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJdGVtcyhUYWJsZSB0YWJsZSwgQXJyYXlMaXN0IGl0ZW1zKSB7Ci0JCXRhYmxlLnJlbW92ZUFsbCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCgoU3RyaW5nKSBpdGVtcy5nZXQoaSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGxpc3Qgb24gdGhlIGdpdmVuIGNvbXBvc2l0ZSB3aXRoIGdpdmVuIHN0eWxlCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGNyZWF0ZUxpc3QoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBzdHlsZSkgewotCQlMaXN0IGxpc3QgPSBuZXcgTGlzdChwYXJlbnQsIHN0eWxlIHwgU1dULk5VTEwpOwotCQl0b29sa2l0LmFkYXB0KGxpc3QsIHRydWUsIHRydWUpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKgotCSAqIE1ldGhvZCB3aWxsIHJldHVybiBPYmplY3RbXSBvZiBndWlkYW5jZSBleGNsdWRpbmcgUHJhY3RpY2UuCi0JICogTWV0aG9kRWxlbWVudFV0aWwjZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoRU9iamVjdCkgY2FsY3VsYXRlcyBhbGwgZ3VpZGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBnZXRTZWxlY3RlZEd1aWRhbmNlcyhDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCkgewotCQlqYXZhLnV0aWwuTGlzdCBsaXN0ID0gTWV0aG9kRWxlbWVudFV0aWwKLQkJCQkuZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoY29udGVudEVsZW1lbnQpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByYWN0aWNlKQotCQkJCWl0LnJlbW92ZSgpOwotCQl9Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Rm9ybVBhZ2VUaXRsZVByZWZpeEZvcihNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQpIHsKLQkJU3RyaW5nIGVsZW1lbnRMYWJlbCA9IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0KG1ldGhvZEVsZW1lbnQpOwotCQlpZiAobWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX1dPUktfUFJPRFVDVCArICIgKCIgKyBlbGVtZW50TGFiZWwgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGVsc2UgaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9HVUlEQU5DRSArICIgKCIgKyBlbGVtZW50TGFiZWwgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVsZW1lbnRMYWJlbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGV4dCBmb3IgdGhlIGdpdmVuIGZvcm0gYmFzZWQgb24gdGhlIGdpdmVuIGVsZW1lbnQsIGluY2x1ZGluZyB2YXJpYWJsZSBpbmZvcm1hdGlvbiBvZiB0aGUgZWxlbWVudAotCSAqIGlmIHRoZXJlIGlzIGFueS4KLQkgKiAKLQkgKiBAcGFyYW0gZm9ybQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZvcm1UZXh0KFNjcm9sbGVkRm9ybSBmb3JtLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGZvcm0gIT0gbnVsbCAmJiAhZm9ybS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzdHIuYXBwZW5kKGdldEZvcm1QYWdlVGl0bGVQcmVmaXhGb3IoZWxlbWVudCkpOwotCQkJc3RyLmFwcGVuZChBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JfdGl0bGVfY29sb25fd2l0aF9zcGFjZXMpOwotCQkJCi0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJc3RyLmFwcGVuZChUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQsCi0JCQkJCQkiIiwgdHJ1ZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmKGVsZW1lbnQuZ2V0TmFtZSgpICE9IG51bGwpewotCQkJCXN0ci5hcHBlbmQoZWxlbWVudC5nZXROYW1lKCkpOwotCQkJfQotCQkJZm9ybS5zZXRUZXh0KHN0ci50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgZ2l2ZW4gZGVsaXZlcmFibGVzIGxlYWRzIHRvIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkgKiBAcGFyYW0gdG9CZVBhcnQKLQkgKiBAcGFyYW0gZGVsaXZlcmFibGUKLQkgKiBAcmV0dXJuCi0JICogCQkJQm9vbGVhbiB2YWx1ZSB0byBpbmRpY2F0ZSB3aGV0aGVyIGNpY3VsYXIgZGVwZW5kZW5jeSBpcyBkZXRlY3RlZAotCSAqIEBkZXByZWNhdGVkIG1vdmVkIHRvIHtAbGluayBEZXBlbmRlbmN5Q2hlY2tlciNjaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKERlbGl2ZXJhYmxlLCBEZWxpdmVyYWJsZSl9Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJEZWxpdmVyYWJsZXMoRGVsaXZlcmFibGUgdG9CZVBhcnQsCi0JCQlEZWxpdmVyYWJsZSBkZWxpdmVyYWJsZSkgewotCQlyZXR1cm4gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcyh0b0JlUGFydCwgZGVsaXZlcmFibGUpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgZGVsaXZlcmFibGUgcGFydHMgYXJlIGluIGNoYWluCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gcm9vdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaXZlcmFibGVQYXJ0c0NoYWluKERlbGl2ZXJhYmxlIGUsIGphdmEudXRpbC5MaXN0IHJvb3RzKSB7Ci0JCWphdmEudXRpbC5MaXN0IGxpc3QgPSBlLmdldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpOwotCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJCXJvb3RzLmFkZChvYmopOwotCQkJCQlkZWxpdmVyYWJsZVBhcnRzQ2hhaW4oKERlbGl2ZXJhYmxlKSBvYmosIHJvb3RzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiBSZXNvbHZlIGNvbnRlbnQgZWxlbWVudCBuYW1lIGNvbmZsaWN0cwotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSByZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlQ29udGVudEVsZW1lbnROYW1lQ29uZmxpY3QoRU9iamVjdCBjb250YWluZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRVJlZmVyZW5jZQotCQkJcmVmZXJlbmNlKSB7Ci0KLQkJZmluYWwgSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yKGNvbnRhaW5lcgotCQkJCSwgcmVmZXJlbmNlLAotCQkJCShDb250ZW50RWxlbWVudCkgZWxlbWVudCwgbmV3IFZhbGlkYXRvckZhY3RvcnkuVHlwZUZpbHRlcihlbGVtZW50KSk7Ci0JCQotCQlTdHJpbmcgbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQoZWxlbWVudC5nZXROYW1lKCkpOwotCQkKLQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZmVhdHVyZVR4dCA9IFRuZ1V0aWwuZ2V0RmVhdHVyZVRleHQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMucmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190aXRsZTsgLy8kTk9OLU5MUy0xJAkJCQotCQkJU3RyaW5nIGRsZ01zZyA9IE5MUy5iaW5kKAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RleHQsCi0JCQkJCVN0clV0aWwudG9Mb3dlcihmZWF0dXJlVHh0KSwgZWxlbWVudC5nZXROYW1lKCkpOwotCQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IChTdHJpbmcpIGVsZW1lbnQuZUdldChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0KLQkJCUlJbnB1dFZhbGlkYXRvciBpbnB1dFZhbGlkYXRvciA9IG5ldyBJSW5wdXRWYWxpZGF0b3IoKSB7Ci0JCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJCXJldHVybiB2YWxpZGF0b3IuaXNWYWxpZChuZXdUZXh0KTsKLQkJCQl9Ci0JCQl9OwotCi0JCQlJbnB1dERpYWxvZyBpbnB1dERsZyA9IG5ldyBJbnB1dERpYWxvZygKLQkJCQkJTXNnQm94LmdldERlZmF1bHRTaGVsbCgpLCB0aXRsZSwgZGxnTXNnLCBjdXJyZW50VmFsdWUsCi0JCQkJCWlucHV0VmFsaWRhdG9yKTsKLQkJCWlmIChpbnB1dERsZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkgewotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJfQotCQkJcmV0dXJuIGlucHV0RGxnLmdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCS8qKgotCSAqIERpYWdyYW0gZWRpdG9ycyBvZiBvYmplY3QgaXRzZWxmIHdpbGwgYmUgY2xvc2VkLiBBbmQgUGFyZW50IGRpYWdyYW0gZWRpdG9ycyAKLQkgKiB3aWxsIGJlIHJlZnJlc2hlZC4gIAotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoT3BlbkRpYWdyYW1FZGl0b3JzT2ZQYXJlbnQoT2JqZWN0IHJlZnJlc2hFbGVtZW50LCBqYXZhLnV0aWwuTGlzdCBvcGVuRWRpdG9yUmVmcykgewotCQlvcGVuRWRpdG9yUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gTm93IHJlZnJlc2ggb2JqZWN0J3MgcGFyZW50J3MgZGlhZ3JhbXMuCi0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCBiaW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KWlucHV0OwotCQkJCQlpZiAoYmlucHV0LmdldFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQllbGVtZW50ID0gYmlucHV0LmdldFdyYXBwZXIoKTsKLQkJCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQkJT2JqZWN0IHBhcmVudCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpZWxlbWVudCkuZ2V0UGFyZW50KG51bGwpOwotCQkJCQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQkJaWYoZWxlbWVudC5lcXVhbHMocmVmcmVzaEVsZW1lbnQpKQotCQkJCQkJCQkJcmVmcmVzaE9wZW5EaWFncmFtRWRpdG9yc09mUGFyZW50KHBhcmVudCwgb3BlbkVkaXRvclJlZnMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVsZW1lbnQgPSBiaW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQl9Ci0JCQkJfSAKLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKQotCQkJCXsKLQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJCWlmKCgoQWN0aXZpdHkpZWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhyZWZyZXNoRWxlbWVudCkpCi0JCQkJCQkJb3BlbkVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQllbHNlIGlmKHJlZnJlc2hFbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCU9iamVjdCBsb2NhbFJlZnJlc2hFbGVtZW50ID0gcmVmcmVzaEVsZW1lbnQ7Ci0JCQkJCQkJd2hpbGUoKGxvY2FsUmVmcmVzaEVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikKLQkJCQkJCQkJCSYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpbG9jYWxSZWZyZXNoRWxlbWVudCkuZ2V0T3duZXIoKSE9IG51bGwpewotCQkJCQkJCQlpZigoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWxvY2FsUmVmcmVzaEVsZW1lbnQpLmdldE93bmVyKCkKLQkJCQkJCQkJCQkuZXF1YWxzKGVsZW1lbnQpKXsKLQkJCQkJCQkJCW9wZW5FZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWxvY2FsUmVmcmVzaEVsZW1lbnQgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWxvY2FsUmVmcmVzaEVsZW1lbnQpLmdldE93bmVyKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9ZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJQ29sbGVjdGlvbiBjID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcillbGVtZW50KS5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJCQkJCWlmKGMgIT0gbnVsbCAmJiBjLmNvbnRhaW5zKHJlZnJlc2hFbGVtZW50KSl7Ci0JCQkJCQkJb3BlbkVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JCWludCBzaXplID0gb3BlbkVkaXRvclJlZnMuc2l6ZSgpOwotCQkvL0lFZGl0b3JSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbmV3IElFZGl0b3JSZWZlcmVuY2Vbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChJRWRpdG9yUmVmZXJlbmNlKSBvcGVuRWRpdG9yUmVmcy5nZXQoaSk7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYoZWRpdG9yIGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yICl7Ci0JCQkJKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpZWRpdG9yKS5yZWZyZXNoRGlhZ3JhbSgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENsb3NlIGRpYWdyYW0gZWRpdG9ycyBpbmNsdWRpbmcgcGFyZW50IGVkaXRvcnMKLQkgKiBAcGFyYW0gY2xvc2VFbGVtZW50Ci0JICogQHBhcmFtIGNsb3NlRWRpdG9yUmVmcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZURpYWdyYW1FZGl0b3JzSW5jbHVkaW5nUGFyZW50KE9iamVjdCBjbG9zZUVsZW1lbnQsIGphdmEudXRpbC5MaXN0IGNsb3NlRWRpdG9yUmVmcykgewotCQljbG9zZUVkaXRvclJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCBiaW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KWlucHV0OwotCQkJCQlpZiAoYmlucHV0LmdldFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQllbGVtZW50ID0gYmlucHV0LmdldFdyYXBwZXIoKTsKLQkJCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQkJT2JqZWN0IHBhcmVudCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpZWxlbWVudCkuZ2V0UGFyZW50KG51bGwpOwotCQkJCQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQkJaWYoZWxlbWVudC5lcXVhbHMoY2xvc2VFbGVtZW50KSkKLQkJCQkJCQkJCWNsb3NlRGlhZ3JhbUVkaXRvcnNJbmNsdWRpbmdQYXJlbnQocGFyZW50LCBjbG9zZUVkaXRvclJlZnMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVsZW1lbnQgPSBiaW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQl9Ci0JCQkJfSAKLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKQotCQkJCXsKLQkJCQkJCS8vY2xvc2VFZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCQkJaWYoZWxlbWVudC5lcXVhbHMoY2xvc2VFbGVtZW50KSkKLQkJCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkKLQkJCQkJCWlmKCgoQWN0aXZpdHkpZWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhjbG9zZUVsZW1lbnQpKQotCQkJCQkJCWNsb3NlRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCWVsc2UgaWYoY2xvc2VFbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCWlmKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpY2xvc2VFbGVtZW50KS5nZXRPd25lcigpCi0JCQkJCQkJCQkhPSBudWxsKQotCQkJCQkJCQlpZigoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWNsb3NlRWxlbWVudCkuZ2V0T3duZXIoKQotCQkJCQkJCQkJLmVxdWFscyhlbGVtZW50KSl7Ci0JCQkJCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJCWlmKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpY2xvc2VFbGVtZW50KS5nZXRPd25lcigpCi0JCQkJCQkJCQlpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQkJCWlmKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikKLQkJCQkJCQkJCQkJY2xvc2VFbGVtZW50KS5nZXRPd25lcigpKS5nZXRPd25lcigpLmVxdWFscyhlbGVtZW50KSkKLQkJCQkJCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX1lbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQlDb2xsZWN0aW9uIGMgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWVsZW1lbnQpLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCQkJCQkJaWYoYyAhPSBudWxsICYmIGMuY29udGFpbnMoY2xvc2VFbGVtZW50KSl7Ci0JCQkJCQkJY2xvc2VFZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWludCBzaXplID0gY2xvc2VFZGl0b3JSZWZzLnNpemUoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgSUVkaXRvclJlZmVyZW5jZVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlZmVyZW5jZXNbaV0gPSAoSUVkaXRvclJlZmVyZW5jZSkgY2xvc2VFZGl0b3JSZWZzLmdldChpKTsKLQkJfQotCQl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9ycyhyZWZlcmVuY2VzLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIEdldCBiYXNlIGFjdGl2aXR5IGZvciB0aGUgZ2l2ZW4gYWN0aXZpdHkKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICogCQkJQmFzZSBhY3Rpdml0eQotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFyaWFiaWxpdHlFbGVtZW50IGdldEJhc2VBY3Rpdml0eShBY3Rpdml0eSBhY3Rpdml0eSl7Ci0JCXdoaWxlICghYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkuZXF1YWxzKAotCQkJCVZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMKSkgewotCi0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBhY3Rpdml0eQotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKCh2ZSAhPSBudWxsKSAmJiAodmUgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCQlhY3Rpdml0eSA9IChBY3Rpdml0eSkgdmU7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBhY3Rpdml0eTsKLQl9Ci0JCi0JLyoqCi0JICogQ2xvc2UgZGlhZ3JhbSBlZGl0b3JzCi0JICogCi0JICogQHBhcmFtIGNsb3NlRWxlbWVudAotCSAqIEBwYXJhbSBjbG9zZUVkaXRvclJlZnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VEaWFncmFtRWRpdG9ycyhPYmplY3QgY2xvc2VFbGVtZW50LCBqYXZhLnV0aWwuTGlzdCBjbG9zZUVkaXRvclJlZnMpIHsKLQkJY2xvc2VFZGl0b3JSZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJCQlCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgYmlucHV0ID0gKEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dClpbnB1dDsKLQkJCQkJaWYgKGJpbnB1dC5nZXRXcmFwcGVyKCkgIT0gbnVsbCkgewotCQkJCQkJZWxlbWVudCA9IGJpbnB1dC5nZXRXcmFwcGVyKCk7Ci0JCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCU9iamVjdCBwYXJlbnQgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWVsZW1lbnQpLmdldFBhcmVudChlbGVtZW50KTsKLQkJCQkJCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQkJCWlmKGVsZW1lbnQuZXF1YWxzKGNsb3NlRWxlbWVudCkpCi0JCQkJCQkJCQljbG9zZURpYWdyYW1FZGl0b3JzKHBhcmVudCwgY2xvc2VFZGl0b3JSZWZzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllbGVtZW50ID0gYmlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCX0gCi0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LmVxdWFscyhjbG9zZUVsZW1lbnQpKQotCQkJCXsKLQkJCQkJCWNsb3NlRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaW50IHNpemUgPSBjbG9zZUVkaXRvclJlZnMuc2l6ZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IG5ldyBJRWRpdG9yUmVmZXJlbmNlW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVmZXJlbmNlc1tpXSA9IChJRWRpdG9yUmVmZXJlbmNlKSBjbG9zZUVkaXRvclJlZnMuZ2V0KGkpOwotCQl9Ci0JCXdvcmtiZW5jaFBhZ2UuY2xvc2VFZGl0b3JzKHJlZmVyZW5jZXMsIGZhbHNlKTsKLQkJcmVmZXJlbmNlcyA9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIERpYWdyYW0gZWRpdG9ycyBvZiBvYmplY3QgaXRzZWxmIHdpbGwgYmUgY2xvc2VkLiBBbmQgUGFyZW50IGRpYWdyYW0gZWRpdG9ycyAKLQkgKiB3aWxsIGJlIHJlZnJlc2hlZC4gIGNvZGUgbm90IHRlc3RlZCB1c2UgcmVmcmVzaE9wZW5EaWFncmFtRWRpdG9ycyBtZXRob2QuCi0JICogQHBhcmFtIG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzeW5jRGlhZ3JhbUVkaXRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlqYXZhLnV0aWwuTGlzdCBjbG9zZUVkaXRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWphdmEudXRpbC5MaXN0IHJlZnJlc2hFZGl0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCU9iamVjdCBlZGl0b3JFbGVtZW50ID0gbnVsbDsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IGJpbnB1dCA9IChCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpaW5wdXQ7Ci0JCQkJCWlmKGJpbnB1dC5nZXRXcmFwcGVyKCkgIT0gbnVsbCl7Ci0JCQkJCQllZGl0b3JFbGVtZW50ID0gYmlucHV0LmdldFdyYXBwZXIoKTsKLQkJCQkJfWVsc2V7Ci0JCQkJCQllZGl0b3JFbGVtZW50ID0gYmlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihlZGl0b3JFbGVtZW50ICE9IG51bGwpewotCQkJCQlpZihlZGl0b3JFbGVtZW50LmVxdWFscyhvYmplY3QpKXsKLQkJCQkJCWNsb3NlRWRpdG9ycy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJfWVsc2V7Ci0JCQkJCQlpZihlZGl0b3JFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCQkJCWlmKCgoQWN0aXZpdHkpZWRpdG9yRWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhvYmplY3QpKQotCQkJCQkJCQlyZWZyZXNoRWRpdG9ycy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQkJT2JqZWN0IGxvY2FsID0gb2JqZWN0OwotCQkJCQkJCQl3aGlsZSgobG9jYWwgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikKLQkJCQkJCQkJCQkmJiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWxvY2FsKS5nZXRPd25lcigpIT0gbnVsbCl7Ci0JCQkJCQkJCQlpZigoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWxvY2FsKS5nZXRPd25lcigpCi0JCQkJCQkJCQkJCS5lcXVhbHMoZWRpdG9yRWxlbWVudCkpewotCQkJCQkJCQkJCXJlZnJlc2hFZGl0b3JzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJbG9jYWwgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWxvY2FsKS5nZXRPd25lcigpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfWVsc2UgaWYoZWRpdG9yRWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQlDb2xsZWN0aW9uIGMgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWVkaXRvckVsZW1lbnQpLmdldENoaWxkcmVuKGVkaXRvckVsZW1lbnQpOwotCQkJCQkJCWlmKGMgIT0gbnVsbCAmJiBjLmNvbnRhaW5zKG9iamVjdCkpewotCQkJCQkJCQlyZWZyZXNoRWRpdG9ycy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gQ2xvc2UgZWRpdG9yIHJlZmVyZW5jZXMgYW5kIHJlZnJlc2ggZWRpdG9ycy4KLQkJaW50IHNpemUgPSBjbG9zZUVkaXRvcnMuc2l6ZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IG5ldyBJRWRpdG9yUmVmZXJlbmNlW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVmZXJlbmNlc1tpXSA9IChJRWRpdG9yUmVmZXJlbmNlKSBjbG9zZUVkaXRvcnMuZ2V0KGkpOwotCQl9Ci0JCXdvcmtiZW5jaFBhZ2UuY2xvc2VFZGl0b3JzKHJlZmVyZW5jZXMsIGZhbHNlKTsKLQkJcmVmZXJlbmNlcyA9IG51bGw7Ci0JCQotCQlzaXplID0gcmVmcmVzaEVkaXRvcnMuc2l6ZSgpOwotCQkvL0lFZGl0b3JSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbmV3IElFZGl0b3JSZWZlcmVuY2Vbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChJRWRpdG9yUmVmZXJlbmNlKSByZWZyZXNoRWRpdG9ycy5nZXQoaSk7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYoZWRpdG9yIGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yICl7Ci0JCQkJKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpZWRpdG9yKS5yZWZyZXNoRGlhZ3JhbSgpOwotCQkJfQotCQl9Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL1VJTGF5b3V0SGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9VSUxheW91dEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNWZlMGM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL1VJTGF5b3V0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLkZvcm1Db2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci0KLQotLyoqCi0gKiBMYXlvdXQgSGVscGVyIGZvciBVSS4gCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVSUxheW91dEhlbHBlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb21wb3NpdGUgZWRpdG9yQ29tcG9zaXRlLCBwcmV2aWV3Q29tcG9zaXRlOwotCi0JcHJpdmF0ZSBzdGF0aWMgQ1RhYkZvbGRlciB0YWJGb2xkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGFicyBpbiBmb3JtIAotCSAqIEBwYXJhbSBmb3JtCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlVGFicyhTY3JvbGxlZEZvcm0gZm9ybSwgRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQkvLyBjcmVhdGUgdGFiZm9sZGVyCi0JCXRhYkZvbGRlciA9IG5ldyBDVGFiRm9sZGVyKGZvcm0uZ2V0Qm9keSgpLCBTV1QuRkxBVCB8IFNXVC5UT1ApOwotCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQl0YWJGb2xkZXIuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0KLQkJLy8gc2V0IHRhYmZvbGRlciBiYWNrZ3JvdW5kIGNvbG9yCi0JCUNvbG9yIHNlbGVjdGVkQ29sb3IgPSB0b29sa2l0LmdldENvbG9ycygpCi0JCQkJLmdldENvbG9yKEZvcm1Db2xvcnMuU0VQQVJBVE9SKTsKLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbkJhY2tncm91bmQobmV3IENvbG9yW10geyBzZWxlY3RlZENvbG9yLAotCQkJCXRvb2xraXQuZ2V0Q29sb3JzKCkuZ2V0QmFja2dyb3VuZCgpIH0sIG5ldyBpbnRbXSB7IDUwIH0pOwotCi0JCS8vIGNyZWF0ZSBlZGl0b3IgdGFiIGl0ZW0gYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBvc2l0ZQotCQlDVGFiSXRlbSBlZGl0b3JJdGVtID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5VTEwpOwotCQllZGl0b3JJdGVtLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkVESVRPUl9URVhUKTsKLQkJZWRpdG9yQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQpOwotCQllZGl0b3JJdGVtLnNldENvbnRyb2woZWRpdG9yQ29tcG9zaXRlKTsKLQotCQkvLyBjcmVhdGUgcHJldmlldyB0YWIgaXRlbSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY29tcG9zaXRlCi0JCUNUYWJJdGVtIHByZXZpZXdJdGVtID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5VTEwpOwotCQlwcmV2aWV3SXRlbS5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5QUkVWSUVXX1BBR0VfVElUTEUpOwotCQlwcmV2aWV3Q29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQpOwotCQlwcmV2aWV3SXRlbS5zZXRDb250cm9sKHByZXZpZXdDb21wb3NpdGUpOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHRhYkZvbGRlcik7Ci0KLQkJdG9vbGtpdC5hZGFwdCh0YWJGb2xkZXIsIHRydWUsIHRydWUpOwotCi0JCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oMCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGNvbXBvc2l0ZSBvbiB0aGUgZm9ybQotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogQHJldHVybgotCSAqIAkJCVVJIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUodGFiRm9sZGVyKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgVGFibGVXcmFwTGF5b3V0KCkpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGVkaXRvciBjb21wb3NpdGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQlVSSBDb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZSBnZXRFZGl0b3JDb21wb3NpdGUoKSB7Ci0JCXJldHVybiBlZGl0b3JDb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHByZXZpZXcgY29tcG9zaXRlCi0JICogCi0JICogQHJldHVybgotCSAqIAkJUHJldmlldyBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZSBnZXRQcmV2aWV3Q29tcG9zaXRlKCkgewotCQlyZXR1cm4gcHJldmlld0NvbXBvc2l0ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTY0NTY1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciB0aGUgQXV0aG9yaW5nIFVJLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9BYnN0cmFjdEJhc2VWaWV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQWJzdHJhY3RCYXNlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4Yjg5MGExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9BYnN0cmFjdEJhc2VWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlVJQWN0aW9uRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuSUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIE1ldGhvZCBMaWJyYXJ5IHZpZXdzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCYXNlVmlldyBleHRlbmRzIFNhdmVhYmxlTGlicmFyeVZpZXdQYXJ0Ci0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5Qcm92aWRlciwgSVNlbGVjdGlvblByb3ZpZGVyLAotCQlJTGlicmFyeVNlcnZpY2VMaXN0ZW5lciwgSU1lbnVMaXN0ZW5lciwgSVZpZXdlclByb3ZpZGVyLCBJR290b01hcmtlciB7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlTaGVldFBhZ2UgcHJvcGVydHlTaGVldFBhZ2U7Ci0KLQlwcm90ZWN0ZWQgVUlBY3Rpb25EaXNwYXRjaGVyIGFjdGlvbkRpc3BhdGNoZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHJvdGVjdGVkIElMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IgYWN0aW9uQmFyQ29udHJpYnV0b3I7Ci0KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgSVBhcnRMaXN0ZW5lciBwYXJ0TGlzdGVuZXIgPSBuZXcgSVBhcnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlpZiAocGFydCA9PSBBYnN0cmFjdEJhc2VWaWV3LnRoaXMpIHsKLQkJCQloYW5kbGVBY3RpdmF0ZShwYXJ0KTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogSGFuZGxlcyB0aGUgYWN0aXZhdGlvbiBvZiB0aGlzIHZpZXcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGUoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkvLyBTZXQgdGhlIHJpZ2h0IGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIGVkaXRpbmcgZG9tYWluLgotCQllZGl0aW5nRG9tYWluLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQotCQkvLyBSZWNvbXB1dGUgdGhlIHJlYWQgb25seSBzdGF0ZS4KLQkJaWYgKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKCkgIT0gbnVsbCkgewotCQkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKS5jbGVhcigpOwotCi0JCQkvLyBSZWZyZXNoIGFueSBhY3Rpb25zIHRoYXQgbWF5IGJlY29tZSBlbmFibGVkIG9yIGRpc2FibGVkLgotCQkJc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIGEgZGlhbG9nIHRoYXQgYXNrcyBpZiBjb25mbGljdGluZyBjaGFuZ2VzIHNob3VsZCBiZSBkaXNjYXJkZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRGlydHlDb25mbGljdCgpIHsKLQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX0ZpbGVDb25mbGljdF9sYWJlbDsgCi0JCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5fV0FSTl9GaWxlQ29uZmxpY3Q7IAotCQlyZXR1cm4gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlQcm9tcHQoCi0JCQkJdGl0bGUsIG1zZyk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBjaGFuZ2VkIHJlc291cmNlcyB3aGVuIHRoaXMgdmlldyBpcyBhY3RpdmF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZFJlc291cmNlcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0KCk7Ci0KLQkJYWN0aW9uRGlzcGF0Y2hlciA9IG5ldyBVSUFjdGlvbkRpc3BhdGNoZXIodGhpcyk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSB2aWV3ZXIuCi0JCWNyZWF0ZVZpZXdlcihwYXJlbnQpOwotCi0JCS8vIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgYWN0aW9uIGJhciBjb250cmlidXRvci4KLQkJdHJ5IHsKLQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yID0gY3JlYXRlQWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yLmluaXQoZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCksIGdldFNpdGUoKQotCQkJCQkuZ2V0UGFnZSgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCi0JCS8vIEFkZCBhIHNlbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgZm9yIHRoZSB2aWV3ZXIuCi0JCVZpZXdlciB2aWV3ZXIgPSBnZXRWaWV3ZXIoKTsKLQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQlpZiAoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID09IG51bGwpIHsKLQkJCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCgKLQkJCQkJCQlTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgc2VsZWN0aW9uQ2hhbmdlZEV2ZW50KSB7Ci0JCQkJCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyBBZGQgYSBsaWJyYXJ5IHNlcnZpY2UgbGlzdGVuZXIuCi0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIodGhpcyk7Ci0KLQkJT2JqZWN0IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCXNldElucHV0Rm9yVmlld2VyKGxpYnJhcnkpOwotCQkJTGlicmFyeVVJVXRpbC51cGRhdGVTaGVsbFRpdGxlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQllZGl0aW5nRG9tYWluID0gbWFuYWdlci5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IChDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBlZGl0aW5nRG9tYWluCi0JCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0KLQkJSVZpZXdTaXRlIHNpdGUgPSAoSVZpZXdTaXRlKSB0aGlzLmdldFNpdGUoKTsKLQkJc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0aGlzKTsKLQkJc2l0ZS5nZXRQYWdlKCkuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlcyBhIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250ZXh0TWVudUZvcihmaW5hbCBTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgewotCQlNZW51TWFuYWdlciBjb250ZXh0TWVudSA9IG5ldyBNZW51TWFuYWdlcigiI1BvcFVwIik7IC8vJE5PTi1OTFMtMSQKLQkJY29udGV4dE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQljb250ZXh0TWVudS5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsKLQkJTWVudSBtZW51ID0gY29udGV4dE1lbnUuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKLQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoY29udGV4dE1lbnUsIHZpZXdlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lciNtZW51QWJvdXRUb1Nob3cob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCXRyeSB7Ci0JCQlhY3Rpb25CYXJDb250cmlidXRvci5zZXRBY3RpdmVWaWV3KHRoaXMpOwotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3IubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXIjZ2V0RWRpdGluZ0RvbWFpbigpCi0JICovCi0JcHVibGljIEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLQkJcmV0dXJuIGVkaXRpbmdEb21haW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWFjdGlvbkRpc3BhdGNoZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI3JlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlhY3Rpb25EaXNwYXRjaGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjZ2V0QWRhcHRlcihDbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7Ci0JCWlmIChrZXkuZXF1YWxzKElHb3RvTWFya2VyLmNsYXNzKSkgewotCQkJcmV0dXJuIHRoaXM7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNnZXRTZWxlY3Rpb24oKQotCSAqLwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGFjdGlvbkRpc3BhdGNoZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNzZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRTZWxlY3Rpb24odGhpcywgc2VsZWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb25Qcm92aWRlciBzb3VyY2UsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWFjdGlvbkRpc3BhdGNoZXIuc2V0U2VsZWN0aW9uKHNvdXJjZSwgc2VsZWN0aW9uKTsKLQkJVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkuc2V0U2VsZWN0aW9uKHNvdXJjZSwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeUNyZWF0ZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlzZXRJbnB1dEZvclZpZXdlcihudWxsKTsKLQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJKChDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeVNldChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJc2V0SW5wdXRGb3JWaWV3ZXIobGlicmFyeSk7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yLnNldEFjdGl2ZVZpZXcoQWJzdHJhY3RCYXNlVmlldy50aGlzKTsKLQkJCUxpYnJhcnlVSVV0aWwudXBkYXRlU2hlbGxUaXRsZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKAotCQkvLyByZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQotCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCi0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCSgoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmRpc3Bvc2UoKTsKLQkJfQotCi0JCWlmIChhY3Rpb25CYXJDb250cmlidXRvci5nZXRBY3RpdmVWaWV3KCkgPT0gdGhpcykgewotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlVmlldyhudWxsKTsKLQkJfQotCi0JCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZS5kaXNwb3NlKCk7Ci0JCX0KLQotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIHByb3BlcnR5IHNoZWV0LgotCSAqLwotCXB1YmxpYyBJUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7Ci0JCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZSA9IG5ldyBQcm9wZXJ0eVNoZWV0UGFnZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBtYWtlQ29udHJpYnV0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsCi0JCQkJCQlJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIsCi0JCQkJCQlJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIpIHsKLQkJCQkJc3VwZXIubWFrZUNvbnRyaWJ1dGlvbnMobWVudU1hbmFnZXIsIHRvb2xCYXJNYW5hZ2VyLAotCQkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJCQkJc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLQkJCQkJaWYgKGFjdGlvbkJhckNvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLAotCQkJCQkJCQlhY3Rpb25CYXJzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZQotCQkJCQkuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydHlTaGVldFBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXIjZ290b01hcmtlcihJTWFya2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkJdHJ5IHsKLQkJCWlmIChtYXJrZXIuZ2V0VHlwZSgpLmVxdWFscyhFVmFsaWRhdG9yLk1BUktFUikpIHsKLQkJCQlTdHJpbmcgdXJpQXR0cmlidXRlID0gbWFya2VyLmdldEF0dHJpYnV0ZSgKLQkJCQkJCUVWYWxpZGF0b3IuVVJJX0FUVFJJQlVURSwgbnVsbCk7Ci0JCQkJaWYgKHVyaUF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaUF0dHJpYnV0ZSk7Ci0JCQkJCUVPYmplY3QgZU9iamVjdCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKQotCQkJCQkJCS5nZXRFT2JqZWN0KHVyaSwgdHJ1ZSk7Ci0JCQkJCWlmIChlT2JqZWN0ICE9IG51bGwpIHsKLQkJCQkJCXNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb25zCi0JCQkJCQkJCS5zaW5nbGV0b24oZWRpdGluZ0RvbWFpbi5nZXRXcmFwcGVyKGVPYmplY3QpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBzZWxlY3Rpb24gaW50byB3aGljaGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJZmluYWwgQ29sbGVjdGlvbiB0aGVTZWxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCQlpZiAodGhlU2VsZWN0aW9uICE9IG51bGwgJiYgIXRoZVNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgaXRlbXMgaW4gdGhlIGN1cnJlbnQgY29udGVudCB2aWV3ZXIgb2YKLQkJCQkJLy8gdGhlIGVkaXRvci4KLQkJCQkJVmlld2VyIHZpZXdlciA9IGdldFZpZXdlcigpOwotCQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQkJCXRoZVNlbGVjdGlvbi50b0FycmF5KCkpLCB0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlydW5uYWJsZS5ydW4oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgVmlld2VyIGdldFZpZXdlcigpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdmlld2VyIGluIHRoZSBnaXZlbiBwYXJlbnQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JLyoqCi0JICogQHJldHVybiBhIG5ldyBhY3Rpb25CYXJDb250cmlidXRlcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIGNyZWF0ZUFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbnB1dCBmb3IgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBtb2RlbCBuZXcgaW5wdXQgZm9yIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJbnB1dEZvclZpZXdlcihPYmplY3QgbW9kZWwpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQ29uZmlndXJhdGlvblZpZXcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db25maWd1cmF0aW9uVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YTUwMzMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db25maWd1cmF0aW9uVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5Mb2NhbFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuUGVyc3BlY3RpdmVMaXN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlVJQWN0aW9uRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuQ29uZmlndXJhdGlvblZpZXdFZGl0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kbmQuTGlicmFyeVZpZXdlckRyYWdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkNvbmZpZ3VyYXRpb25MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuSFRNTFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIERpc3BsYXlzIHRoZSBjb250ZW50IG9mIHRoZSBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotICogPHA+Ci0gKiBUaGUgY3VycmVudCBjb25maWd1cmF0aW9uIGlzIHNldCB2aWEgdGhlIENvbmZpZ3VyYXRpb24gY29tYm9ib3ggaW4gdGhlIHN5c3RlbQotICogdG9vbGJhci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25WaWV3IGV4dGVuZHMgQWJzdHJhY3RCYXNlVmlldyBpbXBsZW1lbnRzCi0JCUlMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhlIHZpZXcgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19JRCA9IENvbmZpZ3VyYXRpb25WaWV3LmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgU3RyaW5nIGNvbmZpZ05hbWU7Ci0KLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotCXByaXZhdGUgSURvdWJsZUNsaWNrTGlzdGVuZXIgZG91YmxlQ2xpY2tMaXN0ZW5lcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25WaWV3KCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCNpbml0KElWaWV3U2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3U2l0ZSBzaXRlKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlzdXBlci5pbml0KHNpdGUpOwotCQljcmVhdGVBY3Rpb25zKHNpdGUpOwotCQlMaWJyYXJ5VUlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZVBhcnRDb250cm9sKHBhcmVudCk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsCi0JCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuQ09ORklHVVJBVElPTl9WSUVXX0NPTlRFWFQpOwotCi0JCWVkaXRpbmdEb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKGFkYXB0ZXJGYWN0b3J5LAotCQkJCW5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJYWRhcHRlckZhY3RvcnkgPSAoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgZWRpdGluZ0RvbWFpbgotCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCi0JCS8vIE9wZW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLQkJc2V0Q29uZmlndXJhdGlvbihudWxsKTsKLQotCQkvLyBBZGQgYSBsaWJyYXJ5IGNoYW5nZSBsaXN0ZW5lci4KLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQltYW5hZ2VyLmFkZExpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJc2V0SW5wdXRGb3JWaWV3ZXIobnVsbCk7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCSgoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeVNldChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXNldE1ldGhvZENvbmZpZ3VyYXRpb24obnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSAgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIjbGlicmFyeUNoYW5nZWQoaW50LCBDb2xsZWN0aW9uKQotCSAqLwkKLQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2hhbmdlZChpbnQgb3B0aW9uLCBDb2xsZWN0aW9uIGNoYW5nZWRJdGVtcykgewotCQlzd2l0Y2ggKG9wdGlvbikgewotCQljYXNlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0RFTEVURUQ6Ci0JCQlpZiAoY2hhbmdlZEl0ZW1zICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hhbmdlZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQkJaWYgKCgoTWV0aG9kQ29uZmlndXJhdGlvbikgZWxlbWVudCkuZ2V0TmFtZSgpLmVxdWFscygKLQkJCQkJCQkJZ2V0Q3VycmVudENvbmZpZygpKSkgewotCQkJCQkJCXNldE1ldGhvZENvbmZpZ3VyYXRpb24obnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJLy8gQnVnemlsbGEgZGVmZWN0IDE2NDczOQotCQljYXNlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQ6Ci0JCQlpZiAoY2hhbmdlZEl0ZW1zICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hhbmdlZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQkJaWYgKCgoTWV0aG9kQ29uZmlndXJhdGlvbikgZWxlbWVudCkKLQkJCQkJCQkJLmVxdWFscyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkpKSB7Ci0JCQkJCQkJc2V0Q29udGVudERlc2NyaXB0aW9uKCgoTWV0aG9kQ29uZmlndXJhdGlvbikgZWxlbWVudCkKLQkJCQkJCQkJCS5nZXROYW1lKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2NvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgdmlld2VkIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRDb25maWcoKSB7Ci0JCXJldHVybiBjb25maWdOYW1lOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJYWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlVmlldyh0aGlzKTsKLQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3RlZC5pc0VtcHR5KCkpCi0JCQlhY3Rpb25CYXJDb250cmlidXRvci5kaXNhYmxlR2xvYmFsRWRpdE1lbnUoKTsKLQkJZWxzZQotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3IuZW5hYmxlR2xvYmFsRWRpdE1lbnUoKTsKLQotCQlpZiAodHJlZVZpZXdlciAhPSBudWxsKSB7Ci0JCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdmlld2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgY29udHJvbHMuCi0JCUNvbXBvc2l0ZSBjb250ZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb250ZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCXRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihjb250ZW50KTsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gQWRkIGRyYWctYW5kLWRyb3Agc3VwcG9ydC4KLQkJaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRTsKLQkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IEhUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLAotCQkJCUxvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OwotCQl0cmVlVmlld2VyLmFkZERyYWdTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywKLQkJCQluZXcgTGlicmFyeVZpZXdlckRyYWdBZGFwdGVyKHRyZWVWaWV3ZXIpKTsKLQotCQkvLyBBZGQgYSBkb3VibGUgY2xpY2sgbGlzdGVuZXIuCi0JCWRvdWJsZUNsaWNrTGlzdGVuZXIgPSBuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQkJVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkuaGFuZGxlRG91YmxlQ2xpY2tFdmVudChldmVudCk7Ci0JCQl9Ci0JCX07Ci0JCXRyZWVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihkb3VibGVDbGlja0xpc3RlbmVyKTsKLQotCQljcmVhdGVDb250ZXh0TWVudUZvcih0cmVlVmlld2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBhY3Rpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUFjdGlvbnMoSVZpZXdTaXRlIHZpZXdTaXRlKSB7Ci0JCUlBY3Rpb24gZWRpdEFjdGlvbiA9IG5ldyBBY3Rpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uTGFiZWxfZWRpdCkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlVSUFjdGlvbkRpc3BhdGNoZXIuZWRpdENvbmZpZ3VyYXRpb24oY29uZmlnTmFtZSk7Ci0JCQl9Ci0JCX07Ci0JCWVkaXRBY3Rpb24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdENvbmZpZ3VyYXRpb25fdG9vbHRpcCk7IAotCX0KLQotCXByaXZhdGUgdm9pZCByZXNldCgpIHsKLQkJLy8gUHJldmVudCBtZW1vcnkgbGVhay4KLQkJY29uZmlnTmFtZSA9IG51bGw7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJRGlzcG9zYWJsZSkgewotCQkJCSgoSURpc3Bvc2FibGUpIGFkYXB0ZXJGYWN0b3J5KS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCX0KLQkJZWRpdGluZ0RvbWFpbi5zZXRBZGFwdGVyRmFjdG9yeShudWxsKTsKLQkJSUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSB0cmVlVmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpOwotCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQkJSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSB0cmVlVmlld2VyLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBlbXB0eVNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0JCWFjdGlvbkRpc3BhdGNoZXIuc2V0U2VsZWN0aW9uKGVtcHR5U2VsZWN0aW9uKTsKLQkJVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkuc2V0U2VsZWN0aW9uKGVtcHR5U2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBnaXZlbiBNZXRob2QgQ29uZmlndXJhdGlvbiBhcyB0aGlzIHZpZXdlcidzIGlucHV0Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJQ29udHJvbCBjdHJsID0gdGhpcy5nZXRWaWV3ZXIoKS5nZXRDb250cm9sKCk7Ci0JCWlmIChjdHJsID09IG51bGwgfHwgY3RybC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICh0cmVlVmlld2VyLmdldElucHV0KCkgPT0gY29uZmlnKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgdGl0bGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJdGhpcy5jb25maWdOYW1lID0gY29uZmlnLmdldE5hbWUoKTsKLQkJCUlGaWx0ZXIgY29uZmlnRmlsdGVyID0gbmV3IENvbmZpZ3VyYXRpb25GaWx0ZXIoY29uZmlnLCB0cmVlVmlld2VyKTsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldENvbmZpZ3VyYXRpb25WaWV3X0FkYXB0ZXJGYWN0b3J5KGNvbmZpZ0ZpbHRlcik7Ci0JCQllZGl0aW5nRG9tYWluLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQkJCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXIoY29uZmlnLAotCQkJCQlhZGFwdGVyRmFjdG9yeSkpOwotCQkJdGl0bGUgPSBjb25maWcuZ2V0TmFtZSgpOwotCQl9IGVsc2UgewotCQkJLy8gUHJldmVudCBtZW1vcnkgbGVhay4KLQkJCWNvbmZpZ05hbWUgPSBudWxsOwotCQkJaWYgKGFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJRGlzcG9zYWJsZSkgewotCQkJCQkoKElEaXNwb3NhYmxlKSBhZGFwdGVyRmFjdG9yeSkuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQlhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQl9Ci0JCQllZGl0aW5nRG9tYWluLnNldEFkYXB0ZXJGYWN0b3J5KG51bGwpOwotCQkJSUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSB0cmVlVmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpOwotCQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJY29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCUlCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gdHJlZVZpZXdlci5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIGVtcHR5U2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLQkJCWFjdGlvbkRpc3BhdGNoZXIuc2V0U2VsZWN0aW9uKGVtcHR5U2VsZWN0aW9uKTsKLQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLnNldFNlbGVjdGlvbihlbXB0eVNlbGVjdGlvbik7Ci0JCX0KLQotCQl0cmVlVmlld2VyLnNldElucHV0KGNvbmZpZyk7Ci0JCXNldENvbnRlbnREZXNjcmlwdGlvbih0aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGlzIHZpZXdlcidzIGlucHV0IHRvIHRoZSBNZXRob2QgQ29uZmlndXJhdGlvbgotCSAqIHdpdGggdGhlIGdpdmVuIG5hbWUgCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCWNvbmZpZ05hbWUgPSBuYW1lOwotCi0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJCWNvbmZpZ05hbWUgPSBjb25maWcuZ2V0TmFtZSgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGNvbmZpZ05hbWUgIT0gbnVsbCkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBjb25maWdOYW1lKTsKLQkJCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJCXNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLmNvbmZpZ05hbWUgPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRvdWJsZUNsaWNrTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJdHJlZVZpZXdlci5yZW1vdmVEb3VibGVDbGlja0xpc3RlbmVyKGRvdWJsZUNsaWNrTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgQ29uZmlndXJhdGlvblZpZXcgb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uVmlldyBnZXRWaWV3KCkgewotCQl0cnkgewotCQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCQlJVmlld1BhcnQgdmlldyA9IGFjdGl2ZVBhZ2UuZmluZFZpZXcoVklFV19JRCk7Ci0JCQkJaWYgKHZpZXcgPT0gbnVsbCkgewotCQkJCQl2aWV3ID0gYWN0aXZlUGFnZS5zaG93VmlldyhWSUVXX0lEKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIChDb25maWd1cmF0aW9uVmlldykgdmlldzsKLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkFic3RyYWN0QmFzZVZpZXcjZ2V0Vmlld2VyKCkKLQkgKi8KLQlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIHRyZWVWaWV3ZXI7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDb25maWd1cmF0aW9uVmlld0FjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMKLQkJCUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciB7Ci0KLQkJcHJpdmF0ZSBMaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uIGxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb247Ci0KLQkJcHVibGljIENvbmZpZ3VyYXRpb25WaWV3QWN0aW9uQmFyQ29udHJpYnV0b3IoRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluKSB7Ci0JCQlzdXBlcihlZGl0aW5nRG9tYWluKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjaW5pdChJQWN0aW9uQmFycykKLQkJICovCi0JCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQkJdmlld0FjdGlvbkJhcnMgPSBhY3Rpb25CYXJzOwotCQkJY29uZmlnVmlld0VkaXRBY3Rpb24gPSBuZXcgQ29uZmlndXJhdGlvblZpZXdFZGl0QWN0aW9uKAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpb25MYWJlbF9lZGl0KTsgCi0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQkJCSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMub3BlbkVsZW1lbnQiLCAvLyROT04tTkxTLTEkCi0JCQkJCWNvbmZpZ1ZpZXdFZGl0QWN0aW9uKTsKLQkJCWxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24gPSBuZXcgTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbigKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdik7IAotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJCQlMaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uLkFDVElPTl9JRCwgCi0JCQkJCWxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNhY3RpdmF0ZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJCWFjdGl2ZVZpZXdQYXJ0LmFkZFByb3BlcnR5TGlzdGVuZXIodGhpcyk7Ci0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSBhY3RpdmVWaWV3UGFydCBpbnN0YW5jZW9mIElTZWxlY3Rpb25Qcm92aWRlciA/IChJU2VsZWN0aW9uUHJvdmlkZXIpIGFjdGl2ZVZpZXdQYXJ0Ci0JCQkJCTogYWN0aXZlVmlld1BhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoY29uZmlnVmlld0VkaXRBY3Rpb24pOwotCQkJc2VsZWN0aW9uUHJvdmlkZXIKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uKTsKLQkJCXVwZGF0ZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI2RlYWN0aXZhdGUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJCWFjdGl2ZVZpZXdQYXJ0LnJlbW92ZVByb3BlcnR5TGlzdGVuZXIodGhpcyk7Ci0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSBhY3RpdmVWaWV3UGFydCBpbnN0YW5jZW9mIElTZWxlY3Rpb25Qcm92aWRlciA/IChJU2VsZWN0aW9uUHJvdmlkZXIpIGFjdGl2ZVZpZXdQYXJ0Ci0JCQkJCTogYWN0aXZlVmlld1BhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlcgotCQkJCQkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGNvbmZpZ1ZpZXdFZGl0QWN0aW9uKTsKLQkJCXNlbGVjdGlvblByb3ZpZGVyCi0JCQkJCS5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbik7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjdXBkYXRlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZVZpZXdQYXJ0IGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlVmlld1BhcnQKLQkJCQkJOiBhY3RpdmVWaWV3UGFydC5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gPyAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbgotCQkJCQk6IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0JCQljb25maWdWaWV3RWRpdEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQkJbGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI3NlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNkaXNhYmxlR2xvYmFsRWRpdE1lbnUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzYWJsZUdsb2JhbEVkaXRNZW51KCkgewotCQkJY29uZmlnVmlld0VkaXRBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjZW5hYmxlR2xvYmFsRWRpdE1lbnUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZW5hYmxlR2xvYmFsRWRpdE1lbnUoKSB7Ci0JCQljb25maWdWaWV3RWRpdEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI21lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCQkvLyBBZGQgb3VyIHN0YW5kYXJkIG1hcmtlcnMuCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiZWRpdCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBBZGQgb3VyIG90aGVyIHN0YW5kYXJkIG1hcmtlci4KLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCi0KLQkJCWFkZEdsb2JhbEFjdGlvbnMobWVudU1hbmFnZXIpOwotCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShjb25maWdWaWV3RWRpdEFjdGlvbikpOwotCQkJaWYgKFBlcnNwZWN0aXZlTGlzdFV0aWwuaXNBdXRob3JpbmdQZXJzcGVjdGl2ZSgpKSB7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKAotCQkJCQkJbGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbikpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkFic3RyYWN0QmFzZVZpZXcjY3JlYXRlQWN0aW9uQmFyQ29udHJpYnV0b3IoKQotCSAqLwotCXB1YmxpYyBJTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIGNyZWF0ZUFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgewotCQlyZXR1cm4gbmV3IENvbmZpZ3VyYXRpb25WaWV3QWN0aW9uQmFyQ29udHJpYnV0b3IoZWRpdGluZ0RvbWFpbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkFic3RyYWN0QmFzZVZpZXcjc2V0SW5wdXRGb3JWaWV3ZXIoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElucHV0Rm9yVmlld2VyKE9iamVjdCBtb2RlbCkgewotCQlpZiAoKG1vZGVsID09IG51bGwpIHx8IChtb2RlbCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pKSB7Ci0JCQlzZXRNZXRob2RDb25maWd1cmF0aW9uKChNZXRob2RDb25maWd1cmF0aW9uKSBtb2RlbCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXNldCgpOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25WaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db25maWd1cmF0aW9uVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJiZjk4ZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgc2VsZWN0YWJsZSBwbHVnLWlucyBhbmQgcGFja2FnZXMgb2YgYSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiBhCi0gKiB0cmVlIHZpZXdlci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblZpZXdlciBleHRlbmRzIENoZWNrYm94VHJlZVZpZXdlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3RzIHRoZSBnaXZlbiBlbGVtZW50IGluIHRoZSB0cmVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihPYmplY3QgZWxlbWVudCkgewotCQlzdXBlci5leHBhbmRUb0xldmVsKGVsZW1lbnQsIDApOwotCQlXaWRnZXQgY3RybCA9IHN1cGVyLmZpbmRJdGVtKGVsZW1lbnQpOwotCQlpZiAoY3RybCAhPSBudWxsKSB7Ci0JCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaXRlbXMuYWRkKGN0cmwpOwotCQkJc3VwZXIuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQkJCXRoaXMuZ2V0VHJlZSgpLnNldEZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKGZpbmFsIE9iamVjdCBlbGVtZW50LCBmaW5hbCBib29sZWFuIHVwZGF0ZUxhYmVscykgewotCQlPYmplY3RbXSBjaGVja2VkID0gdGhpcy5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJc3VwZXIucmVmcmVzaChlbGVtZW50LCB1cGRhdGVMYWJlbHMpOwotCQl0aGlzLnNldENoZWNrZWRFbGVtZW50cyhjaGVja2VkKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db250ZW50Vmlldy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0NvbnRlbnRWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmMGU3MjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0NvbnRlbnRWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BY3Rpdml0eURpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5OZXdBY3Rpdml0eURpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQnJvd3NpbmdQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlVJQWN0aW9uRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlBlcnNwZWN0aXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5IdG1sQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0KLS8qKgotICogVGhlIENvbnRlbnQgdmlldy4KLSAqIDxwPgotICogRGlzcGxheXMgdGhlIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgYSBNZXRob2QgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0KLQkvKioKLQkgKiBUaGUgdmlldyBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX0lEID0gQ29udGVudFZpZXcuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBFbGVtZW50SFRNTFZpZXdlciBjb250ZW50Vmlld2VyOwotCi0JcHJpdmF0ZSBPYmplY3QgZGlzcGxheWVkRWxlbWVudDsKLQotCXByaXZhdGUgSVBhcnRMaXN0ZW5lciBwYXJ0TGlzdGVuZXIgPSBuZXcgSVBhcnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQloYW5kbGVTZWxlY3Rpb24oVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldFNlbGVjdGlvblNvdXJjZSgpLCBVSUFjdGlvbkRpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCX07Ci0KLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCWhhbmRsZVNlbGVjdGlvbihldmVudC5nZXRTb3VyY2UoKSwgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgPSBuZXcgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjaGFuZ2VkSXRlbXMpIHsKLS8vCQkJaWYgKG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9MT0FERUQKLS8vCQkJCQl8fCBvcHRpb24gPT0gSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ1JFQVRFRCkgewotLy8JCQkJaWYgKGNvbnRlbnRWaWV3ZXIgIT0gbnVsbCkgewotLy8JCQkJCWNvbnRlbnRWaWV3ZXIuc2V0SHRtbEJ1aWxkZXIobmV3IEh0bWxCdWlsZGVyKCkpOwotLy8JCQkJCWNvbnRlbnRWaWV3ZXIuZ2V0QnJvd3NlcigpLnJlZHJhdygpOwotLy8JCQkJfQotLy8JCQl9Ci0KLQkJCWlmIChjaGFuZ2VkSXRlbXMgIT0gbnVsbCAmJiBkaXNwbGF5ZWRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoY2hhbmdlZEl0ZW1zLmNvbnRhaW5zKGRpc3BsYXllZEVsZW1lbnQpKSB7Ci0JCQkJCWRpc3BsYXllZEVsZW1lbnQgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpYlN2Y0xpc3RlbmVyID0gbmV3IElMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29uZmlndXJhdGlvbiBzZXQ6ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShjb25maWcpKTsKLQkJCWNvbnRlbnRWaWV3ZXIuZ2V0QnJvd3NlcigpLnNldFVybCgiYWJvdXQ6YmxhbmsiKTsgLy8kTk9OLU5MUy0xJAotCQkJZGlzcGxheWVkRWxlbWVudCA9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJMaWJyYXJ5IGNsb3NlZDogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGxpYnJhcnkpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJMaWJyYXJ5IGNyZWF0ZWQ6ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShsaWJyYXJ5KSk7Ci0JCQljbGVhbnVwKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJMaWJyYXJ5IG9wZW5lZDogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGxpYnJhcnkpKTsKLQkJCWNsZWFudXAoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTGlicmFyeSByZW9wZW5lZDogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGxpYnJhcnkpKTsKLQkJCWNsZWFudXAoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkxpYnJhcnkgc2V0OiAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUobGlicmFyeSkpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgY2xlYW51cCgpIHsKLQkJCWlmIChjb250ZW50Vmlld2VyICE9IG51bGwpIHsKLQkJCQljb250ZW50Vmlld2VyLnNldEh0bWxCdWlsZGVyKG5ldyBIdG1sQnVpbGRlcigpKTsKLQkJCQljb250ZW50Vmlld2VyLmdldEJyb3dzZXIoKS5yZWRyYXcoKTsKLQkJCX0KLQkJfQotCX07Ci0JCi0JLy8gUGFnZSBuYXZpZ2F0aW9uIGFjdGlvbnMuCi0JcHJpdmF0ZSBBY3Rpb24gYmFja0FjdGlvbjsKLQotCXByaXZhdGUgQWN0aW9uIGZvcndhcmRBY3Rpb247Ci0KLQlwcml2YXRlIEFjdGlvbiBzdG9wQWN0aW9uOwotCi0JcHJpdmF0ZSBBY3Rpb24gcmVmcmVzaEFjdGlvbjsKLQotCXByaXZhdGUgQWN0aW9uIHByaW50QWN0aW9uOwotCi0JLy8gQSBoaWRkZW4gY29tcG9zaXRlIHRvIGhvbGQgdGhlIGRpYWdyYW0gdmlld2VyIGZvciBkaWFncmFtIGltYWdlCi0JLy8gZ2VuZXJhdGlvbi4KLQlwcml2YXRlIENvbXBvc2l0ZSBkaWFncmFtVmlld2VySG9sZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29udGVudFZpZXcoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdHJ5IHsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkJY29udGVudFZpZXdlciA9IG5ldyBFbGVtZW50SFRNTFZpZXdlcihwYXJlbnQpOwotCQkJZGlhZ3JhbVZpZXdlckhvbGRlciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlkaWFncmFtVmlld2VySG9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKDEsIDEpKTsgLy8gc2l6ZQotCQkJLy8gY2FuJ3QgYmUKLQkJCS8vIDAsMAotCQkJLy8gb3RoZXJ3aXNlCi0JCQkvLyB0aGUKLQkJCS8vIGRpYWdyYW0KLQkJCS8vIHdpbGwgbm90Ci0JCQkvLyBiZQotCQkJLy8gcGFpbnRlZAotCQkJZGlhZ3JhbVZpZXdlckhvbGRlci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlkaWFncmFtVmlld2VySG9sZGVyLnNldFZpc2libGUoZmFsc2UpOwotCi0JCQkvLyBDcmVhdGUgdGhlIHBhZ2UgbmF2aWdhdGlvbiB0b29sIGJ1dHRvbnMuCi0JCQljcmVhdGVBY3Rpb25zKCk7Ci0KLQkJCS8vIEFkZCBhIHBhcnQgbGlzdGVuZXIgdG8gbW9uaXRvciBwYXJ0IGFjdGl2YXRpb24gYW5kIHVwZGF0ZSB0aGlzCi0JCQkvLyB2aWV3Ci0JCQkvLyBhcyBhbmQgd2hlbiBuZWVkZWQuCi0JCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKS5hZGRQYXJ0TGlzdGVuZXIoCi0JCQkJCXBhcnRMaXN0ZW5lcik7Ci0KLQkJCWdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5hZGRQZXJzcGVjdGl2ZUxpc3RlbmVyKAotCQkJCQluZXcgSVBlcnNwZWN0aXZlTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBwZXJzcGVjdGl2ZUFjdGl2YXRlZChJV29ya2JlbmNoUGFnZSBwYWdlLAotCQkJCQkJCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGRlc2MpIHsKLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIHZvaWQgcGVyc3BlY3RpdmVDaGFuZ2VkKElXb3JrYmVuY2hQYWdlIHBhZ2UsCi0JCQkJCQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZGVzYywgU3RyaW5nIGlkKSB7Ci0JCQkJCQkJaWYgKGRlc2MuZ2V0SWQoKS5lcXVhbHMoCi0JCQkJCQkJCQlCcm93c2luZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKSkgewotCQkJCQkJCQlpZiAoaWQKLQkJCQkJCQkJCQkuZXF1YWxzKElXb3JrYmVuY2hQYWdlLkNIQU5HRV9FRElUT1JfQVJFQV9TSE9XKSkgewotCQkJCQkJCQkJcGFnZS5zZXRFZGl0b3JBcmVhVmlzaWJsZShmYWxzZSk7Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCQkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMud2FybmluZ0RpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWRkRWRpdG9yVG9QZXJzcGVjdGl2ZVdhcm5pbmdfbXNnKTsgCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQkvLyBBZGQgc2VsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciB0byB1cGRhdGUgdGhpcyB2aWV3IGFzIGFuZCB3aGVuCi0JCQkvLyBuZWVkZWQuCi0JCQlVSUFjdGlvbkRpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQkJCXNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLQotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihsaWJTdmNMaXN0ZW5lcik7Ci0KLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltYW5hZ2VyLmFkZExpc3RlbmVyKGxpYnJhcnlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPOiBEaXNwbGF5IGFuIGVycm9yIGRpYWxvZy4KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzZXRGb2N1cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQljb250ZW50Vmlld2VyLnNldEZvY3VzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjZGlzcG9zZQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVtb3ZlTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5yZW1vdmVMaXN0ZW5lcihsaWJyYXJ5Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JCVVJQWN0aW9uRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLQkJCQlzZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcik7Ci0JCWdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcigKLQkJCQlwYXJ0TGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGFjdGlvbnMgZm9yIHRoaXMgdmlldy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQliYWNrQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlCcm93c2VyIGJyb3dzZXIgPSBjb250ZW50Vmlld2VyLmdldEJyb3dzZXIoKTsKLQkJCQlpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJCWJyb3dzZXIuYmFjaygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJYmFja0FjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJhY2tfdGV4dCk7IAotCQliYWNrQWN0aW9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJhY2tfdGV4dCk7IAotCQliYWNrQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCUlTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQkFDSykpOwotCi0JCWZvcndhcmRBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUJyb3dzZXIgYnJvd3NlciA9IGNvbnRlbnRWaWV3ZXIuZ2V0QnJvd3NlcigpOwotCQkJCWlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCQkJYnJvd3Nlci5mb3J3YXJkKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlmb3J3YXJkQWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9yd2FyZF90ZXh0KTsgCi0JCWZvcndhcmRBY3Rpb24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9yd2FyZF90ZXh0KTsgCi0JCWZvcndhcmRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9GT1JXQVJEKSk7Ci0KLQkJc3RvcEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gY29udGVudFZpZXdlci5nZXRCcm93c2VyKCk7Ci0JCQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJCQlicm93c2VyLnN0b3AoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXN0b3BBY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5zdG9wX3RleHQpOyAKLQkJc3RvcEFjdGlvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5zdG9wX3RleHQpOyAKLQkJc3RvcEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0RFU0NfU1RPUCk7Ci0KLQkJcmVmcmVzaEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy8gQnJvd3NlciBicm93c2VyID0gY29udGVudFZpZXdlci5nZXRCcm93c2VyKCk7Ci0JCQkJLy8gaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJCS8vIGJyb3dzZXIucmVmcmVzaCgpOwotCQkJCS8vIH0KLQotCQkJCS8vIG5lZWQgdG8gcmVnZW5lcmF0ZSB0aGUgY29udGVudAotCQkJCWNvbnRlbnRWaWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9OwotCQlyZWZyZXNoQWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVmcmVzaF90ZXh0KTsgCi0JCXJlZnJlc2hBY3Rpb24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVmcmVzaF90ZXh0KTsgCi0JCXJlZnJlc2hBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19ERVNDX1JFRlJFU0gpOwotCi0JCXByaW50QWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQljb250ZW50Vmlld2VyLnByaW50KCk7Ci0JCQl9Ci0JCX07Ci0JCXByaW50QWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJpbnRfdGV4dCk7IAotCQlwcmludEFjdGlvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5wcmludF90ZXh0KTsgCi0JCXByaW50QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSUltYWdlcy5JTUdfREVTQ19QUklOVCk7Ci0KLQkJSUFjdGlvbkJhcnMgYmFycyA9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotCQlJVG9vbEJhck1hbmFnZXIgbWFuYWdlciA9IGJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkJbWFuYWdlci5hZGQoYmFja0FjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKGZvcndhcmRBY3Rpb24pOwotCQltYW5hZ2VyLmFkZChzdG9wQWN0aW9uKTsKLQkJbWFuYWdlci5hZGQocmVmcmVzaEFjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKHByaW50QWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIHRoZSBnaXZlbiBzZWxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIExpYnJhcnkgb3IgQ29uZmlndXJhdGlvbiB2aWV3LgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIFRoZSBzZWxlY3Rpb24gaW4gdGhlIExpYnJhcnkgb3IgQ29uZmlndXJhdGlvbiB2aWV3LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNlbGVjdGlvbihPYmplY3Qgc291cmNlLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkKLQkJCQkuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAoYWN0aXZlUGFnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJVmlld1BhcnQgdmlldyA9IGFjdGl2ZVBhZ2UuZmluZFZpZXcoVklFV19JRCk7Ci0JCWlmICh2aWV3ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlPYmplY3RbXSBzZWxlY3RlZEVsZW1lbnRzID0gc2VsLnRvQXJyYXkoKTsKLQkJCWlmIChzZWxlY3RlZEVsZW1lbnRzICE9IG51bGwgJiYgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzWzBdOwotCQkJCQotCQkJCS8vIGRvbid0IHVud3JhcCB0aGUgb2JqZWN0LiAKLQkJCQkvLyBGb3IgYWN0aXZpdHksIHdlIG5lZWQgdG8gd3JhcHBlZCBpdGVtIHByb3ZpZGVyIHRvIGdldCB0aGUgc3VwcHJlc3Mgc3RhdHVzLgotCQkJCS8vIE9iamVjdCBlbGVtZW50ID0gTGlicmFyeVV0aWwudW53cmFwKHNlbGVjdGVkRWxlbWVudCk7Ci0JCQkJaWYgKGRpc3BsYXllZEVsZW1lbnQgIT0gbnVsbCAmJiBkaXNwbGF5ZWRFbGVtZW50ID09IGVsZW1lbnQpIHsKLQkJCQkJZGlzcGxheWVkRWxlbWVudCA9IG51bGw7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKGRpc3BsYXlDb250ZW50UGFnZShzb3VyY2UsIGVsZW1lbnQpKSB7Ci0JCQkJCWRpc3BsYXllZEVsZW1lbnQgPSBlbGVtZW50OwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBjb250ZW50IHBhZ2UgZm9yIHRoZSBnaXZlbiBDb250ZW50RWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogICAgICAgICAgICBUaGUgTGlicmFyeSBvciBDb25maWd1cmF0aW9uIHZpZXcuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSBzZWxlY3RlZCBNZXRob2QgZWxlbWVudC4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50IHBhZ2UgaXMgZGlzcGxheWVkCi0JICogICAgICAgICBzdWNjZXNzZnVsbHkuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGlzcGxheUNvbnRlbnRQYWdlKE9iamVjdCBzb3VyY2UsIE9iamVjdCByYXdfZWxlbWVudCkgewotCQlPYmplY3QgZWxlbWVudCA9IExpYnJhcnlVdGlsLnVud3JhcChyYXdfZWxlbWVudCk7Ci0JCWVsZW1lbnQgPSBWaWV3SGVscGVyLmhhbmRsZURhbmdsaW5nKGVsZW1lbnQpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNZ3IgPSBudWxsOwotCQlib29sZWFuIGlzQnJvd3NpbmcgPSBQZXJzcGVjdGl2ZVV0aWwKLQkJCQkuaXNBY3RpdmVQZXJzcGVjdGl2ZShCcm93c2luZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKTsKLQkJYm9vbGVhbiBpc0NvbmZpZ1NvdXJjZSA9IChzb3VyY2UgIT0gbnVsbCkKLQkJCQkmJiAoc291cmNlIGluc3RhbmNlb2YgQ29uZmlndXJhdGlvblZpZXcpOwotCi0JCS8vIGlmIGluIGJyb3dzaW5nIGJ1dCB0aGUgc291cmNlIGlzIG5vdCBmcm9tIGNvbmZpZ3J1YXRpb24gdmlldwotCQkvLyBpZ25vcmUgaXQKLQkJaWYgKGlzQnJvd3NpbmcgJiYgIWlzQ29uZmlnU291cmNlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoaXNDb25maWdTb3VyY2UpIHsKLQkJCS8vIEdldCB0aGUgRWxlbWVudCBMYXlvdXQgTWFuYWdlciBmb3IgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLQkJCWxheW91dE1nciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldEVsZW1lbnRMYXlvdXRNYW5hZ2VyKCk7Ci0KLQkJCS8vIEFkZCB0aGUgYWN0aXZpdHkgZGlhZ3JhbSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGRpYWdyYW0gaW1hZ2VzLgotCQkJCi0JCQlTdHJpbmcgbmV3RGlhZ3JhbXMgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKCJQVUJMSVNIX05FV19ESUFHUkFNIik7Ci0JCQlCb29sZWFuIG5ld0RpYWdyYW0gPSBuZXcgQm9vbGVhbihuZXdEaWFncmFtcyk7Ci0JCQlpZihuZXdEaWFncmFtLmJvb2xlYW5WYWx1ZSgpKXsKLQkJCQlOZXdBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIGRpYWdyYW1TZXJ2aWNlID0gKE5ld0FjdGl2aXR5RGlhZ3JhbVNlcnZpY2UpIGxheW91dE1ncgotCQkJCQkuZ2V0QWN0aXZpdHlEaWFncmFtU2VydmljZSgpOwotCQkJCWlmIChkaWFncmFtU2VydmljZSA9PSBudWxsKSB7Ci0JCQkJCWRpYWdyYW1TZXJ2aWNlID0gbmV3IE5ld0FjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoCi0JCQkJCQlkaWFncmFtVmlld2VySG9sZGVyLAotCQkJCQkJbmV3IEZpbGUobGF5b3V0TWdyLmdldFB1Ymxpc2hEaXIoKSkpOwotCQkJCQlsYXlvdXRNZ3Iuc2V0QWN0aXZpdHlEaWFncmFtU2VydmljZShkaWFncmFtU2VydmljZSk7Ci0JCQkJfQotLy8JCQkJIEZvciBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSAKLQkJCQlib29sZWFuIG9wdGlvbiA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkKCk7Ci0JCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0UHVibGlzaGVkVW5DcmVhdGVkQUREKG9wdGlvbik7Ci0JCQkJCi0JCQkJLy8gRm9yIEFjdGl2aXR5IERpYWdyYW0gCi0JCQkJb3B0aW9uID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oKTsKLQkJCQlkaWFncmFtU2VydmljZS5zZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihvcHRpb24pOwotCQkJfWVsc2V7Ci0vLwkJCQkgQWRkIHRoZSBhY3Rpdml0eSBkaWFncmFtIHNlcnZpY2UgdG8gZ2VuZXJhdGUgZGlhZ3JhbSBpbWFnZXMuCi0JCQkJQWN0aXZpdHlEaWFncmFtU2VydmljZSBkaWFncmFtU2VydmljZSA9IChBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKSBsYXlvdXRNZ3IKLQkJCQkJCS5nZXRBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKCk7Ci0JCQkJaWYgKGRpYWdyYW1TZXJ2aWNlID09IG51bGwpIHsKLQkJCQkJZGlhZ3JhbVNlcnZpY2UgPSBuZXcgQWN0aXZpdHlEaWFncmFtU2VydmljZSgKLQkJCQkJCQlkaWFncmFtVmlld2VySG9sZGVyLAotCQkJCQkJCW5ldyBGaWxlKGxheW91dE1nci5nZXRQdWJsaXNoRGlyKCkpKTsKLQkJCQkJbGF5b3V0TWdyLnNldEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoZGlhZ3JhbVNlcnZpY2UpOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBGb3IgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gCi0JCQkJYm9vbGVhbiBvcHRpb24gPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCgpOwotCQkJCWRpYWdyYW1TZXJ2aWNlLnNldFB1Ymxpc2hlZFVuQ3JlYXRlZEFERChvcHRpb24pOwotCQkJCQotCQkJCS8vIEZvciBBY3Rpdml0eSBEaWFncmFtIAotCQkJCW9wdGlvbiA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKCk7Ci0JCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24ob3B0aW9uKTsKLQkJCX0KLQkJCQotCQkJCi0JCQkKLQkJfQotCi0JCWNvbnRlbnRWaWV3ZXIuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXRNZ3IpOwotCQljb250ZW50Vmlld2VyLnNob3dFbGVtZW50Q29udGVudChyYXdfZWxlbWVudCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIEhUTUwgY29udGVudCBwYWdlIGZvciBhIE1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBBIE1ldGhvZCBlbGVtZW50LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEhUTUwgY29udGVudCBwYWdlIGlzIGRpc3BsYXllZAotCSAqICAgICAgICAgc3VjY2Vzc2Z1bGx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc3BsYXlIVE1MQ29udGVudFBhZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJZWxlbWVudCA9IExpYnJhcnlVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJZWxlbWVudCA9IFZpZXdIZWxwZXIuaGFuZGxlRGFuZ2xpbmcoZWxlbWVudCk7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCWNvbnRlbnRWaWV3ZXIuc2V0TGF5b3V0TWFuYWdlcihudWxsKTsKLQkJCWNvbnRlbnRWaWV3ZXIuc2hvd0VsZW1lbnRDb250ZW50KGVsZW1lbnQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0VsZW1lbnRIVE1MVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvRWxlbWVudEhUTUxWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDEwOWUyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvRWxlbWVudEhUTUxWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSHRtbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5BYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLk9wZW5XaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5TdGF0dXNUZXh0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuU3RhdHVzVGV4dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLldpbmRvd0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgSFRNTCByZXByZXNlbnRhdGlvbiBvZiBhIE1ldGhvZCBlbGVtZW50IGluIGEgU1dUIEJyb3dzZXIuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRIVE1MVmlld2VyIHsKLQotLy8JLy8gVGhlIGRlZmF1bHQgSFRNTCB3cmFwcGVycyBmb3IgZGlzYWJsaW5nIHRoZSAiRGlzcGxheSBUcmVlIEJyb3dzZXIiIGxpbmsKLS8vCS8vIGluIHRoZSBIVE1MIGNvbnRlbnQgcGFnZXMuCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT05URU5UX1dSQVBQRVJfU1RBUlQgPSAiPGh0bWw+PGhlYWQ+IDxtZXRhIGh0dHAtZXF1aXY9XCJDb250ZW50LVR5cGVcIiBjb250ZW50PVwidGV4dC9odG1sOyBjaGFyc2V0PVVURi04XCI+PC9oZWFkPjx0aXRsZT5SYXRpb25hbCBVbmZpZWQgUHJvY2VzczwvdGl0bGU+IiAvLyROT04tTkxTLTEkCi0vLwkJCSsgIjxzY3JpcHQgbGFuZ3VhZ2U9XCJqYXZhc2NyaXB0XCI+ZnVuY3Rpb24gaW5pdCgpIHsgcGFyZW50Lm9yeV90b2M9XCJkaXNhYmxlXCI7IHBhcmVudC5jb250ZW50ZnJhbWUubG9jYXRpb249XCIiOyAvLyROT04tTkxTLTEkCi0vLwotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09OVEVOVF9XUkFQUEVSX0VORCA9ICJcIjsgfTwvc2NyaXB0PjwvaGVhZD4iIC8vJE5PTi1OTFMtMSQKLS8vCQkJKyAiPGZyYW1lc2V0IHJvd3M9XCIxMDAlLCpcIiBmcmFtZWJvcmRlcj1cIm5vXCIgYm9yZGVyPVwiMFwiIGZyYW1lc3BhY2luZz1cIjBcIiBpZD1cImNvbnRlbnRmcmFtZXNldFwiIG5hbWU9XCJjb250ZW50ZnJhbWVzZXRcIj4iIC8vJE5PTi1OTFMtMSQKLS8vCQkJKyAiPGZyYW1lIHNyYz1cImFib3V0OmJsYW5rXCIgaWQ9XCJjb250ZW50ZnJhbWVcIiBuYW1lPVwiY29udGVudGZyYW1lXCIgc2Nyb2xsaW5nPVwiYXV0b1wiLz4iIC8vJE5PTi1OTFMtMSQKLS8vCQkJKyAiPGZyYW1lIHNyYz1cImFib3V0OmJsYW5rXCIgaWQ9XCJibGFua2ZyYW1lXCIgbmFtZT1cImJsYW5rZnJhbWVcIiBvbmxvYWQ9XCJpbml0KClcIi8+IiAvLyROT04tTkxTLTEkCi0vLwkJCSsgIjwvZnJhbWVzZXQ+PC9odG1sPiI7IC8vJE5PTi1OTFMtMSQKLQotLy8JLy8gVGhlIGRlZmF1bHQgSFRNTCB3cmFwcGVycyBmb3IgcHJpbnRpbmcgdGhlIHByb2Nlc3MgY29udGVudCBwYWdlcy4KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BSSU5UX1dSQVBQRVJfU1RBUlQgPSBERUZBVUxUX0NPTlRFTlRfV1JBUFBFUl9TVEFSVAotLy8JCQkrICJwcmludCgpOyI7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QUklOVF9XUkFQUEVSX0VORCA9IERFRkFVTFRfQ09OVEVOVF9XUkFQUEVSX0VORDsKLS8vCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTlRfRklMRSA9ICJwcmludC5odG1sIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIEhUTUwgd3JhcHBlcnMgZm9yIGRpc2FibGluZyB0aGUgIkRpc3BsYXkgVHJlZSBCcm93c2VyIiBsaW5rIGluIHRoZQotCS8vIEhUTUwgY29udGVudCBwYWdlcy4KLS8vCXByaXZhdGUgU3RyaW5nIGNvbnRlbnRXcmFwcGVyU2FydDsKLS8vCi0vLwlwcml2YXRlIFN0cmluZyBjb250ZW50V3JhcHBlckVuZDsKLQotLy8JLy8gVGhlIEhUTUwgd3JhcHBlcnMgZm9yIHByaW50aW5nIHRoZSBIVE1MIGNvbnRlbnQgcGFnZXMuCi0vLwlwcml2YXRlIFN0cmluZyBwcmludFdyYXBwZXJTYXJ0OwotLy8KLS8vCXByaXZhdGUgU3RyaW5nIHByaW50V3JhcHBlckVuZDsKLS8vCi0vLwkvLyBUaGUgYnVpbHQtaW4gYnJvd3NlciBmb3IgcHJpbnRpbmcgdGhlIEhUTUwgcGFnZXMuCi0vLwkvLyBkb24ndCB1c2UgYSBzZWNvbmQgCi0vLwlwcml2YXRlIEJyb3dzZXIgcHJpbnRCcm93c2VyOwotCi0JcHJvdGVjdGVkIEJyb3dzZXIgYnJvd3NlciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHBhcmVudDsKLQotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRMb2NhdGlvbiA9IG51bGw7Ci0KLQkvLyBzYXZlIHRoZSBjdXJyZW50IHRleHQgZnJvbSB0aGUgc3RhdHVzIGxpc3RlbmVyCi0JLy8gd2UgbmVlZCB0aGlzIHRvIG9wZW4gYnJvd3NlciB3aXRoIHRoaXMgdXJsIAotCS8vIHNpbmNlIHVuZGVyIGxpbnV4IGJyb3dzZXIgY2FuJ3QgYmUgb3BlbmVkIGF1dG9tYXRpY2FsbHksIHdoaWNoIGlzIHJlYWxseSBiYWQKLQlwcml2YXRlIFN0cmluZyBjdXJyZW50VGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBIdG1sQnVpbGRlciBodG1sQnVpbGRlcjsKLQotCXByaXZhdGUgQ3Vyc29yIHdhaXRDdXJzb3IgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudEhUTUxWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJaHRtbEJ1aWxkZXIgPSBuZXcgSHRtbEJ1aWxkZXIoKTsKLQkJY3JlYXRlQ29udHJvbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFNXVCBicm93c2VyIGNvbnRyb2xzIGZvciB2aWV3aW5nIGFuZCBwcmludGluZyB0aGUgSFRNTAotCSAqIGNvbnRlbnQgcGFnZXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRyb2woKSB7Ci0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlicm93c2VyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USHxHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKSk7Ci0JCQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobmV3IExvY2F0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKExvY2F0aW9uRXZlbnQgZSkgewotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibG9jYXRpb24gY2hhbmdlZCIpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGNoYW5naW5nKExvY2F0aW9uRXZlbnQgZSkgewotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibG9jYXRpb24gY2hhbmdpbmcuLi4iKTsKLQkJCQkJLy8gR2V0IHRoZSBjdXJyZW50IGxvY2F0aW9uLgotCQkJCQlTdHJpbmcgbG9jYXRpb24gPSBnZXRFbGVtZW50VXJsKGUubG9jYXRpb24pOwotCQkJCQlpZiAoIGxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24uc3RhcnRzV2l0aChSZXNvdXJjZUhlbHBlci5VUkxfU1RSX0pBVkFTQ1JJUFQpKQotCQkJCQl7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJaWYgKGlzTG9jYXRpb25DaGFuZ2VkKGxvY2F0aW9uKSkgewotCQkJCQkJLy8gU2F2ZSB0aGUgY3VycmVudCBsb2NhdGlvbiBmb3IgcHJpbnRpbmcgcHVycG9zZXMuCi0JCQkJCQljdXJyZW50TG9jYXRpb24gPSBsb2NhdGlvbjsKLQkJCQkJCWdlbmVyYXRlSHRtbChjdXJyZW50TG9jYXRpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWJyb3dzZXIuYWRkU3RhdHVzVGV4dExpc3RlbmVyKG5ldyBTdGF0dXNUZXh0TGlzdGVuZXIoKQotCQkJewotCQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoU3RhdHVzVGV4dEV2ZW50IGV2ZW50KQotCQkJCXsKLQkJCQkJLy8gR2V0IHRoZSBjdXJyZW50IHRleHQuCi0JCQkJCVN0cmluZyB0ZXh0ID0gZXZlbnQudGV4dDsKLQkJCQkJaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpID4gMCkKLQkJCQkJewotCQkJCQkJLy8gU2F2ZSB0aGUgY3VycmVudCB0ZXh0IGZvciBhcHBsaWNhdGlvbiBsYXVuY2hpbmcgcHVycG9zZXMuCi0JCQkJCQljdXJyZW50VGV4dCA9IHRleHQ7Ci0JCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiU3RhdHVzIGNoYW5nZWQ6ICIgKyB0ZXh0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQlicm93c2VyLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihuZXcgT3BlbldpbmRvd0xpc3RlbmVyKCl7Ci0KLQkJCQlwdWJsaWMgdm9pZCBvcGVuKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJCS8vIGhhbmRsZSBvcGVuIHdpbmRvdy4KLQkJCQkJLy8gd2l0aCBtb3ppbGxhIGluIGxpbnV4LCBvcGVuIHdpbmRvdyBkb2VzIG5vdCB3b3JrCi0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJPcGVuIHdpbmRvdyBldmVudDogIiArIGV2ZW50KTsKLQkJCQkJCi0JCQkJCS8vIHdpbmRvd3MgY2FuIGxhdW5jaCB0aGUgYnJvd3NlciB3aXRob3V0IHByb2JsZW0KLQkJCQkJLy8gbGludXggbmVlZHMgbW9yZSBjYXJlCi0JCQkJCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIndpbjMyIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLQkJCQkJewotCQkJCQkgICAgcHVibGljIHZvaWQgcnVuKCkKLQkJCQkJCXsKLQkJCQkJCQl0cnkKLQkJCQkJCQl7Ci0vLwkJCQkJCQkJLy8gaWYgdGhlIHVybCBpcyBhIHJlc291cmNlIHdpdGggcmVsYXRpdmUgcGF0aCwgZmluZCB0aGUgYWJzb2x1dGUgcGF0aAotLy8JCQkJCQkJCWlmICggY3VycmVudFRleHQuc3RhcnRzV2l0aCgiZmlsZToiKSApCi0vLwkJCQkJCQkJewotLy8JCQkJCQkJCQkvLyBnZXQgdGhlIGZpbGUgcGF0aCBmcm9tIHRoZSAKLS8vCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQkJCQkJCi0vLwkJCQkJCQkJLy8gb3BlbiBhbm90aGVyIHN3dCBicm93c2VyIHNpbmNlIHdlIGhhdmUgbm8gKHNpbXBsZSkgd2F5IG9mIGNyZWF0aW5nIGEgc3lzdGVtIGRlZmF1bHQgYnJvd3NlcgotLy8JCQkJCQkJCS8vIHRoZSBFY2xpcHNlIGd1eXMgaGlkZSBhbGwgdGhlIGdvb2QgYXBpcyBhcyBpbnRlcm5hbAotCQkJCQkJCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCgpOwotCQkJCQkJCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQkJCQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJCQkJCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJCQkJCQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCQkJCQkJQnJvd3NlciBwb3B1cF9icm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJCQkJCQkJcG9wdXBfYnJvd3Nlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEh8R3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMfEdyaWREYXRhLkdSQUJfVkVSVElDQUwpKTsKLQkJCQkJCQkJcG9wdXBfYnJvd3Nlci5zZXRVcmwoY3VycmVudFRleHQpOwotCQkJCQkJCQkJCQkJCQkJCQotCQkJCQkJCQlzaGVsbC5vcGVuKCk7Ci0KLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQkJCQkJCXsKLQkJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX19KTsKLQkJCQotLy8JCQkvLyBkb24ndCB1c2UgYSBzZXBlcmF0ZSBicm93c2VyIGZvciBwcmludGluZyBzaW5jZSB0aGlzIHdpbGwgbG9zZSB0aGUgCi0vLwkJCS8vIHN0YXRlcyBvZiB0aGUgY3VycmVudCBwYWdlLCBmb3IgZXhhbXBsZSwgdGhlIGV4cGFuZGVkIHNlY3Rpb25zLCBldGMuCi0vLwkJCS8vIEppbmh1YSBYaSwgIDMvNS8yMDA3Ci0vLwkJCS8vIENyZWF0ZSB0aGUgaGlkZGVuIGJyb3dzZXIgdXNlZCBmb3IgcHJpbnRpbmcgdGhlIEhUTUwgY29udGVudAotLy8JCQkvLyBwYWdlcy4KLS8vCQkJcHJpbnRCcm93c2VyID0gbmV3IEJyb3dzZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0vLwkJCXByaW50QnJvd3Nlci5zZXRTaXplKDEsIDEpOwotLy8JCQlwcmludEJyb3dzZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0vLwotLy8JCQkvLyBMaW51eDogVGhlcmUgaXMgdW51c2VkIHNwYWNlIGluIHByZXZpZXcvYnJvd3NpbmcsIHdoaWNoIGlzIGluIGdyZXkuCi0vLwkJCS8vIHRoaXMgaXMgbmVlZGVkIGZvciBsaW51eAotLy8JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotLy8JCQlnZC5oZWlnaHRIaW50ID0gMTsKLS8vCQkJcHJpbnRCcm93c2VyLnNldExheW91dERhdGEoZ2QpOwotCQkJCi0JCQkKLQkJCS8vIFJlYWQgdGhlIEhUTUwgd3JhcHBlcnMgZm9yIGRpc2FibGluZyB0aGUgIkRpc3BsYXkgVHJlZSBCcm93c2VyIgotCQkJLy8gbGluayBpbiB0aGUgSFRNTCBjb250ZW50IHBhZ2VzLgotLy8JCQljb250ZW50V3JhcHBlclNhcnQgPSBIVE1MV3JhcHBlcnMKLS8vCQkJCQkuZ2V0U3RyaW5nKCJDT05URU5UX1dSQVBQRVJfU1RBUlQiKTsgLy8kTk9OLU5MUy0xJAotLy8JCQlpZiAoY29udGVudFdyYXBwZXJTYXJ0ID09IG51bGwpIHsKLS8vCQkJCWNvbnRlbnRXcmFwcGVyU2FydCA9IERFRkFVTFRfQ09OVEVOVF9XUkFQUEVSX1NUQVJUOwotLy8JCQl9Ci0vLwkJCWNvbnRlbnRXcmFwcGVyRW5kID0gSFRNTFdyYXBwZXJzLmdldFN0cmluZygiQ09OVEVOVF9XUkFQUEVSX0VORCIpOyAvLyROT04tTkxTLTEkCi0vLwkJCWlmIChjb250ZW50V3JhcHBlckVuZCA9PSBudWxsKSB7Ci0vLwkJCQljb250ZW50V3JhcHBlckVuZCA9IERFRkFVTFRfQ09OVEVOVF9XUkFQUEVSX1NUQVJUOwotLy8JCQl9Ci0KLS8vCQkJLy8gUmVhZCB0aGUgSFRNTCB3cmFwcGVycyBmb3IgcHJpbnRpbmcgdGhlIEhUTUwgY29udGVudCBwYWdlcy4KLS8vCQkJcHJpbnRXcmFwcGVyU2FydCA9IEhUTUxXcmFwcGVycy5nZXRTdHJpbmcoIlBSSU5UX1dSQVBQRVJfU1RBUlQiKTsgLy8kTk9OLU5MUy0xJAotLy8JCQlpZiAocHJpbnRXcmFwcGVyU2FydCA9PSBudWxsKSB7Ci0vLwkJCQlwcmludFdyYXBwZXJTYXJ0ID0gREVGQVVMVF9QUklOVF9XUkFQUEVSX1NUQVJUOwotLy8JCQl9Ci0vLwkJCXByaW50V3JhcHBlckVuZCA9IEhUTUxXcmFwcGVycy5nZXRTdHJpbmcoIlBSSU5UX1dSQVBQRVJfRU5EIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJaWYgKHByaW50V3JhcHBlckVuZCA9PSBudWxsKSB7Ci0vLwkJCQlwcmludFdyYXBwZXJFbmQgPSBERUZBVUxUX1BSSU5UX1dSQVBQRVJfRU5EOwotLy8JCQl9Ci0KLQkJCXdhaXRDdXJzb3IgPSBwYXJlbnQuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ3Vyc29yKAotCQkJCQlTV1QuQ1VSU09SX1dBSVQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJYnJvd3NlciA9IG51bGw7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNMb2NhdGlvbkNoYW5nZWQoU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsIHx8IGN1cnJlbnRMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoRmlsZS5zZXBhcmF0b3JDaGFyICE9ICcvJykgewotCQkJbG9jYXRpb24gPSBsb2NhdGlvbi5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLQkJCVN0cmluZyBvbGRMb2NhdGlvbiA9IGN1cnJlbnRMb2NhdGlvbi5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwKLQkJCQkJJy8nKTsKLQotCQkJLy8gU29tZSB0aW1lcyB0aGUgY29ycmVudCBVUkwgaXMgYSBmdWxsIHBhdGgsIHNvIGp1c3QgY29tcGFyZSB0aGUKLQkJCS8vIGVuZC4KLQkJCXJldHVybiAhbG9jYXRpb24uZW5kc1dpdGgob2xkTG9jYXRpb24pCi0JCQkJCSYmICFvbGRMb2NhdGlvbi5lbmRzV2l0aChsb2NhdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gIWxvY2F0aW9uLmVuZHNXaXRoKGN1cnJlbnRMb2NhdGlvbikKLQkJCQkJJiYgIWN1cnJlbnRMb2NhdGlvbi5lbmRzV2l0aChsb2NhdGlvbik7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFNXVCBicm93c2VyIHRoYXQgZGlzcGxheXMgdGhlIEhUTUwgY29udGVudCBwYWdlcy4KLQkgKi8KLQlwdWJsaWMgQnJvd3NlciBnZXRCcm93c2VyKCkgewotCQlyZXR1cm4gYnJvd3NlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGZvY3VzIHRvIHRoaXMgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJYnJvd3Nlci5zZXRGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSFRNTCBCdWlsZGVyLgotCSAqLwotCXB1YmxpYyBIdG1sQnVpbGRlciBnZXRIdG1sQnVpbGRlcigpIHsKLQkJcmV0dXJuIGh0bWxCdWlsZGVyOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIEhUTUwgQnVpbGRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIdG1sQnVpbGRlcihIdG1sQnVpbGRlciBidWlsZGVyKSB7Ci0JCXRoaXMuaHRtbEJ1aWxkZXIgPSBidWlsZGVyOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIEVsZW1lbnQgTGF5b3V0IE1hbmFnZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGF5b3V0TWFuYWdlcihFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNZ3IpIHsKLQkJaHRtbEJ1aWxkZXIuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXRNZ3IpOwotCX0KLQotCi0JCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIEhUTUwgcmVwcmVzZW50YXRpb24gZm9yIGEgTWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2hvd0VsZW1lbnRDb250ZW50KE9iamVjdCByYXdfZWxlbWVudCkgewotCi0JCXN0YXJ0V2FpdCgpOwotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgZmlsZV91cmwgPSAiYWJvdXQ6YmxhbmsiOyAvLyROT04tTkxTLTEkCi0JCQlPYmplY3QgZWxlbWVudCA9IExpYnJhcnlVdGlsLnVud3JhcChyYXdfZWxlbWVudCk7Ci0JCQlpZiAoIHJhd19lbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyICkgewotCQkJCUFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcilyYXdfZWxlbWVudDsKLQkJCQlPYmplY3QgcHJvYyA9IHdyYXBwZXIuZ2V0VG9wSXRlbSgpOwotCQkJCWlmICggZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgcHJvYyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyApIHsKLQkJCQkJU3RyaW5nIHBhdGggPSBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0LmdldFBhdGgod3JhcHBlcik7Ci0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKHRvcEl0ZW0pOwotCQkJCQlJRWxlbWVudExheW91dCBsYXlvdXQgPSBodG1sQnVpbGRlci5nZXRMYXlvdXRNYW5hZ2VyKCkKLQkJCQkJCS5jcmVhdGVMYXlvdXQoKE1ldGhvZEVsZW1lbnQpZWxlbWVudCwgCi0JCQkJCQkJCShvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpcHJvYywgcGF0aCk7Ci0JCQkJCWZpbGVfdXJsID0gaHRtbEJ1aWxkZXIuZ2VuZXJhdGVIdG1sKGxheW91dCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlmaWxlX3VybCA9IGh0bWxCdWlsZGVyLmdlbmVyYXRlSHRtbCgoTWV0aG9kRWxlbWVudCllbGVtZW50KTsKLQkJCX0KLQkJCQotCQkJaWYgKCBmaWxlX3VybCA9PSBudWxsICkgewotCQkJCWZpbGVfdXJsID0gImFib3V0OmJsYW5rIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLy8gb24gbGludXgsIHRoZSBmaWxlIHBhdGggbmVlZCB0byBiZSBzcGVjaWZpZWQgYXMgZmlsZSwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyB1cmwKLQkJCS8vIGFuZCBjYXN1aWduIGVuY29kaW5nL2RlY29kaW5nIGlzc3VlCi0JCQkvLyBMaW51eDogQ29uZmlndXJhdGlvbiBuYW1lcyBjb250YWluaW5nIGFjY2VudGVkIGNoYXJhY3RlcnMgY2Fubm90IGJlIGJyb3dzZWQuCi0JCQllbHNlIGlmICghU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJ3aW4zMiIpICYmICFmaWxlX3VybC5zdGFydHNXaXRoKCJmaWxlOi8vIikgJiYgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCSFmaWxlX3VybC5lcXVhbHMoImFib3V0OmJsYW5rIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlmaWxlX3VybCA9ICJmaWxlOi8vIiArIGZpbGVfdXJsOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQotCQkJLy8gU2V0IHRoZSBjdXJyZW50IGxvY2F0aW9uIHRvIGF2b2lkIHJlLWdlbmVyYXRpbmcgdGhlIEhUTUwgZmlsZSBpbgotCQkJLy8gcmVzcG9uZCB0byBhIGxvY2F0aW9uIGNoYW5nZS4KLQkJCWN1cnJlbnRMb2NhdGlvbiA9IGZpbGVfdXJsOwotCQkJYnJvd3Nlci5zZXRVcmwoZmlsZV91cmwpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCi0JCWVuZFdhaXQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVIdG1sKFN0cmluZyB1cmwpIHsKLQkJc3RhcnRXYWl0KCk7Ci0JCXRyeSB7Ci0JCQlodG1sQnVpbGRlci5nZW5lcmF0ZUh0bWwodXJsKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCQllbmRXYWl0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWxlbWVudCBVUkwuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RWxlbWVudFVybChTdHJpbmcgbG9jYXRpb24pIHsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24ubGVuZ3RoKCkgPT0gMAotCQkJCXx8IGxvY2F0aW9uLmVxdWFscygiYWJvdXQ6YmxhbmsiKSAgLy8kTk9OLU5MUy0xJAotCQkJCXx8IGxvY2F0aW9uLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChSZXNvdXJjZUhlbHBlci5VUkxfU1RSX0pBVkFTQ1JJUFQpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWxvY2F0aW9uID0gZ2V0VXJsKGxvY2F0aW9uKTsKLQkJaWYgKGxvY2F0aW9uLmluZGV4T2YoUmVzb3VyY2VIZWxwZXIuTUlTU0lOR19QQUdFU19GT0xERVIpID49IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gbWFrZSBzdXJlIHRoZSB1cmwgaXMgYW4gZWxlbWVudCB1cmwsIGNoZWNrIHRoZSBndWlkCi0JCWlmICggUmVzb3VyY2VIZWxwZXIuZ2V0R3VpZEZyb21GaWxlTmFtZShsb2NhdGlvbikgPT0gbnVsbCApCi0JCXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkwgZm9yIHRoZSBnaXZlbiBsb2NhdGlvbi4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRVcmwoU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCVN0cmluZyBwdWJsaXNoX2RpciA9IGh0bWxCdWlsZGVyLmdldFB1Ymxpc2hEaXIoKTsKLQkJU3RyaW5nIHVybCA9IGZpeFBhdGgobG9jYXRpb24pOwotCQlpbnQgaW5kZXggPSB1cmwudG9Mb3dlckNhc2UoKS5pbmRleE9mKAotCQkJCWZpeFBhdGgocHVibGlzaF9kaXIpLnRvTG93ZXJDYXNlKCkpOwotCQlpZiAoaW5kZXggPj0gMCkgewotCQkJdXJsID0gdXJsLnN1YnN0cmluZyhpbmRleCArIHB1Ymxpc2hfZGlyLmxlbmd0aCgpKTsKLQkJfQotCQlpbmRleCA9IHVybC5pbmRleE9mKCIjIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluZGV4ID4gMCkgewotCQkJdXJsID0gdXJsLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCX0KLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBmaXhQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCXRyeSB7Ci0JCQlwYXRoID0gVVJMRGVjb2Rlci5kZWNvZGUocGF0aCwgInV0Zi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChGaWxlLnNlcGFyYXRvckNoYXIgIT0gJy8nKSB7Ci0JCQkJcmV0dXJuIHBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCQl9Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFByaW50cyB0aGUgY3VycmVudCBIVE1MIHBhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnQoKSB7Ci0JCWJvb2xlYW4gYiA9IHRoaXMuYnJvd3Nlci5leGVjdXRlKCJ3aW5kb3cucHJpbnQoKTsiKTsKLS8vCQlpZiAoICFiICkgewotLy8JCQlmaW5hbCBTdHJpbmcgcHJpbnRGaWxlID0gaHRtbEJ1aWxkZXIuZ2V0UHVibGlzaERpcigpICsgUFJJTlRfRklMRTsKLS8vCQkJaWYgKGN1cnJlbnRMb2NhdGlvbiAhPSBudWxsKSB7Ci0vLwkJCQlTdHJpbmdCdWZmZXIgd3JhcHBlckhUTUwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0vLwkJCQl3cmFwcGVySFRNTC5hcHBlbmQocHJpbnRXcmFwcGVyU2FydCkuYXBwZW5kKGN1cnJlbnRMb2NhdGlvbikKLS8vCQkJCQkJLmFwcGVuZChwcmludFdyYXBwZXJFbmQpOwotLy8JCQkJU3RyaW5nIGh0bWxUZXh0ID0gd3JhcHBlckhUTUwudG9TdHJpbmcoKTsKLS8vCQkJCWlmIChGaWxlVXRpbC53cml0ZVVURjhGaWxlKHByaW50RmlsZSwgaHRtbFRleHQpKSB7Ci0vLwkJCQkJcHJpbnRCcm93c2VyLnNldFVybChwcmludEZpbGUpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydFdhaXQoKSB7Ci0JCXBhcmVudC5nZXRTaGVsbCgpLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5kV2FpdCgpIHsKLQkJcGFyZW50LmdldFNoZWxsKCkuc2V0Q3Vyc29yKG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyB0aGUgY29udGVudC4KLQkgKiA8cD4KLQkgKiBSZWdlbmVyYXRlcyB0aGUgY29udGVudCBiZWZvcmUgcmVmcmVzaGluZyB0aGUgYnJvd3Nlci4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlnZW5lcmF0ZUh0bWwoY3VycmVudExvY2F0aW9uKTsKLQkJYnJvd3Nlci5yZWZyZXNoKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvRWxlbWVudHNWaWV3Q29udGV4dEhlbHAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9FbGVtZW50c1ZpZXdDb250ZXh0SGVscC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYWIyMDU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9FbGVtZW50c1ZpZXdDb250ZXh0SGVscC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIAotICogQ29udGV4dCBIZWxwIGZvciBlbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRzVmlld0NvbnRleHRIZWxwIHsKLQotCS8qKgotCSAqIFNldHMgdGhlIGhlbHAgb2YgdGhlIGdpdmVuIHNlbGVjdGlvbgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gdWlDb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SGVscChJU2VsZWN0aW9uIHNlbGVjdGlvbiwgQ29tcG9zaXRlIHVpQ29tcG9zaXRlKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCS8vIGlmIG11bHRpcGxlIGl0ZW1zIHNlbGVjdGVkLCBvbmx5IHRoZSBmaXJzdCBpdGVtJ3MgY29udGV4dCBoZWxwIHdpbGwKLQkJLy8gYmUgZGlzcGxheWVkCi0JCU9iamVjdCBvYmogPSBzZWxlY3RlZC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgU2V0dGluZyBoZWxwIGZvciB0aGUgc2VsZWN0aW9uIG9iaiA9ICIgKwotCQkvLyBvYmopOwotCQlzZXRIZWxwKG9iaiwgdWlDb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGhlbHAgb2YgdGhlIG9iamVjdAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gdWlDb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SGVscChPYmplY3Qgb2JqLCBDb21wb3NpdGUgdWlDb21wb3NpdGUpIHsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCW9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChvYmopOwotCi0JCWlmICgob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBSb2xlKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgVGFzaykpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCgKLQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIERvbWFpbikpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBUb29sKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKSkgewotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscCgKLQkJCQkJCQl1aUNvbXBvc2l0ZSwKLQkJCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0hUTUxXcmFwcGVycy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0hUTUxXcmFwcGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMzJjOTlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9IVE1MV3JhcHBlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBUaGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgSFRNTCB3cmFwcGVycy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MV3JhcHBlcnMgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUKLQkJCS5nZXRCdW5kbGUoSFRNTFdyYXBwZXJzLmNsYXNzLmdldE5hbWUoKSk7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IHByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZvcm0gYmVpbmcKLQkgKiBpbnN0YW50aWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBIVE1MV3JhcHBlcnMoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHN0cmluZyBnaXZlbiB0aGUgcmVzb3VyY2Uga2V5LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkuCi0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIGZvcm1hdHRlZCBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2Uga2V5LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlIGFyZ3VtZW50cy4KLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGl6ZWQgZm9ybWF0dGVkIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0KFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmdzKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvSFRNTFdyYXBwZXJzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvSFRNTFdyYXBwZXJzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllNThjYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0hUTUxXcmFwcGVycy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DT05URU5UX1dSQVBQRVJfU1RBUlQ9XAotICA8aHRtbD5cCi0gIDxoZWFkPlwKLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPlwKLSAgPC9oZWFkPlwKLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+XAotICBmdW5jdGlvbiBpbml0KCkgeyBwYXJlbnQub3J5X3RvYz0iZGlzYWJsZSI7IHBhcmVudC5jb250ZW50ZnJhbWUubG9jYXRpb249IgotICAKLUNPTlRFTlRfV1JBUFBFUl9FTkQ9XAotICAiOyB9XAotICA8L3NjcmlwdD5cCi0gIDwvaGVhZD5cCi0gIDxmcmFtZXNldCByb3dzPSIxMDAlLCoiIGZyYW1lYm9yZGVyPSJubyIgYm9yZGVyPSIwIiBmcmFtZXNwYWNpbmc9IjAiIGlkPSJjb250ZW50ZnJhbWVzZXQiIG5hbWU9ImNvbnRlbnRmcmFtZXNldCI+XAotICA8ZnJhbWUgc3JjPSJhYm91dDpibGFuayIgaWQ9ImNvbnRlbnRmcmFtZSIgbmFtZT0iY29udGVudGZyYW1lIiBzY3JvbGxpbmc9ImF1dG8iLz5cCi0gIDxmcmFtZSBzcmM9ImFib3V0OmJsYW5rIiBpZD0iYmxhbmtmcmFtZSIgbmFtZT0iYmxhbmtmcmFtZSIgb25sb2FkPSJpbml0KCkiLz5cCi0gIDwvZnJhbWVzZXQ+XAotICA8L2h0bWw+Ci0KLVBSSU5UX1dSQVBQRVJfU1RBUlQ9XAotICA8aHRtbD5cCi0gIDxoZWFkPlwKLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPlwKLSAgPC9oZWFkPlwKLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+XAotICBmdW5jdGlvbiBpbml0KCkgeyBwYXJlbnQub3J5X3RvYz0iZGlzYWJsZSI7IH1cCi0gIDwvc2NyaXB0PlwKLSAgPC9oZWFkPlwKLSAgPGZyYW1lc2V0IHJvd3M9IjEwMCUsKiIgZnJhbWVib3JkZXI9Im5vIiBib3JkZXI9IjAiIGZyYW1lc3BhY2luZz0iMCIgaWQ9InByaW50ZnJhbWVzZXQiIG5hbWU9InByaW50ZnJhbWVzZXQiIG9ubG9hZD0iamF2YXNjcmlwdDpwcmludCgpIj5cCi0gIDxmcmFtZSBzcmM9ImFib3V0OmJsYW5rIiBpZD0iYmxhbmtmcmFtZSIgbmFtZT0iYmxhbmtmcmFtZSIgb25sb2FkPSJpbml0KCkiLz5cCi0gIDxmcmFtZSBzcmM9IgotCi1QUklOVF9XUkFQUEVSX0VORD1cCi0gICIgaWQ9InByaW50ZnJhbWUiIG5hbWU9InByaW50ZnJhbWUiIHNjcm9sbGluZz0iYXV0byIgb25sb2FkPSJqYXZhc2NyaXB0OnBhcmVudC5wcmludGZyYW1lLmZvY3VzKCkiLz5cCi0gIDwvZnJhbWVzZXQ+XAotICA8aHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTGlicmFyeVZpZXcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9MaWJyYXJ5Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZGVhNTE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9MaWJyYXJ5Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db3B5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uUGFzdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkxvY2FsVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuVUlBY3Rpb25EaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MYXlvdXRBY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5Vmlld0NvcHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWaWV3Q3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5Vmlld0RlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeVZpZXdQYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTmV3UGx1Z2luQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5Nb3ZlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5WYXJpYWJpbGl0eVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRuZC5MaWJyYXJ5Vmlld2VyRHJhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5JRWRpdG9yS2VlcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWxlbWVudExhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5MaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9ncy5Td2l0Y2hDb25maWdEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5JbXBvcnRFeHBvcnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuTGlicmFyeVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuZG9tYWluLlRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLk1lc3NhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JSW5wdXRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JbnB1dERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkhUTUxUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRleHRUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVByb3BlcnR5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTaG93SW5UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5TaG93SW5Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuTWFya2VyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VOYXZpZ2F0b3I7Ci0KLS8qKgotICogVGhlIExpYnJhcnkgdmlldy4KLSAqIDxwPgotICogRGlzcGxheXMgdGhlIHBoeXNpY2FsIHJlcHJlc2VudGF0aW9uIG9mIGEgTWV0aG9kIExpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VmlldyBleHRlbmRzIEFic3RyYWN0QmFzZVZpZXcgaW1wbGVtZW50cyBJUmVmcmVzaEhhbmRsZXIsCi0JCUlTaG93SW5UYXJnZXQgewotCi0JLyoqCi0JICogVGhlIHZpZXcgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19JRCA9IExpYnJhcnlWaWV3LmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCXByb3RlY3RlZCBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgSURvdWJsZUNsaWNrTGlzdGVuZXIgZG91YmxlQ2xpY2tMaXN0ZW5lciA9IG51bGw7Ci0KLQlwcml2YXRlIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotCQotCXByaXZhdGUgTGF5b3V0QWN0aW9uR3JvdXAgZkxheW91dEFjdGlvblNldDsKLQotCS8vIExpc3RlbiB0byBwcm9jZXNzIGVkaXRvciBhY3RpdmF0aW9uIGFuZCBwcm9tcHQgdGhlIHVzZXIgdG8gbG9hZCB0aGUKLQkvLyB0aGUgcHJvY2VzcydzIGRlZmF1bHQgQ29uZmlndXJhdGlvbiBpbnRvIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0JcHJpdmF0ZSBJUGFydExpc3RlbmVyIGVkaXRvclBhcnRMaXN0ZW5lciA9IG5ldyBJUGFydExpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCQlPYmplY3Qgb2JqID0gbnVsbDsKLQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCQlCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgaW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSAoKElFZGl0b3JQYXJ0KSBwYXJ0KQotCQkJCQkJCS5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCQlpZiAoaW5wdXQuZ2V0U3VwcHJlc3Npb24oKS5nZXRQcm9jZXNzKCkgIT0gbnVsbCkgewotCQkJCQkJb2JqID0gaW5wdXQuZ2V0U3VwcHJlc3Npb24oKS5nZXRQcm9jZXNzKCkuZUNvbnRhaW5lcigpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb2JqID0gRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLmdldFNlbGVjdGVkRWRpdG9ySW5wdXQoKTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJU3dpdGNoQ29uZmlnRGlhbG9nIGRpYWxvZyA9IG5ldyBTd2l0Y2hDb25maWdEaWFsb2coRGlzcGxheQotCQkJCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCQkoKFByb2Nlc3NDb21wb25lbnQpIG9iaikuZ2V0UHJvY2VzcygpCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdENvbnRleHQoKSk7Ci0JCQkJCWRpYWxvZy5leGVjdXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBsb25nIGxhc3RSZWZyZXNoVGltZVN0YW1wOwotCi0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBtYXJrZXJMaXN0ZW5lciA9IG5ldyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKSA9PSBudWxsCi0JCQkJCXx8IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkKLQkJCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpID09IG51bGwKLQkJCQkJfHwgTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKQotCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCWlmIChkZWx0YSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCXRyeSB7Ci0JCQkJY2xhc3MgUmVzb3VyY2VEZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkKLQkJCQkJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSA9PSBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSB7Ci0JCQkJCQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLQkJCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEOgotCQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRDoKLQkJCQkJCQkJLy8gc2hvdyBQcm9ibGVtcyBWaWV3Ci0JCQkJCQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoKElMaWJyYXJ5UmVzb3VyY2VTZXQpIExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkKLQkJCQkJCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkpOwotCQkJCQkJCQlpZiAocmVzb3VyY2VTZXQuaGFzVW5yZXNvbHZlZFByb3h5KCkpIHsKLQkJCQkJCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyCi0JCQkJCQkJCQkJCS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCQkJCVBsYXRmb3JtVUkKLQkJCQkJCQkJCQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJCQkJCQkuZ2V0QWN0aXZlUGFnZSgpCi0JCQkJCQkJCQkJCQkJCQkJLnNob3dWaWV3KAotCQkJCQkJCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb2JsZW1WaWV3IiwgbnVsbCwgSVdvcmtiZW5jaFBhZ2UuVklFV19WSVNJQkxFKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJCQkJCS8vIGNvdWxkbid0IG9wZW4gdGhlCi0JCQkJCQkJCQkJCQkJCS8vIHByb2JsZW0gdmlldywgdG9vCi0JCQkJCQkJCQkJCQkJCS8vIGJhZC4uCi0JCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQl9KTsKLQkJCQkJCQkJfQotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJOwotCi0JCQkJUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpOwotCQkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yKTsKLQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCX0KLQotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBJUmVmcmVzaExpc3RlbmVyIHJlZnJlc2hMaXN0ZW5lciA9IG5ldyBJUmVmcmVzaExpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIG5vdGlmeVJlZnJlc2hlZChJUmVmcmVzaEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZ2V0UmVmcmVzaGVkT2JqZWN0cygpICE9IG51bGwKLQkJCQkJJiYgIWV2ZW50LmdldFJlZnJlc2hlZE9iamVjdHMoKS5pc0VtcHR5KCkpIHsKLQkJCQlDb250cm9sIGN0cmwgPSBnZXRWaWV3ZXIoKS5nZXRDb250cm9sKCk7Ci0JCQkJaWYgKGN0cmwgPT0gbnVsbCB8fCBjdHJsLmlzRGlzcG9zZWQoKSkKLQkJCQkJcmV0dXJuOwotCi0JCQkJaWYgKGN0cmwuZ2V0RGlzcGxheSgpLmdldFRocmVhZCgpID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpIHsKLQkJCQkJZG9SZWZyZXNoKGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlkb1JlZnJlc2gobnVsbCk7Ci0JCQkJCQl9Ci0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeVZpZXcoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlUGFydENvbnRyb2wocGFyZW50KTsKLQkJCi0JCW1ha2VBY3Rpb25zKCk7Ci0JCQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwKLQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX05BVklHQVRPUl9WSUVXX0NPTlRFWFQpOwotCi0JCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRSZWZyZXNoSGFuZGxlcih0aGlzKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG1ha2VBY3Rpb25zKCkgewotCQlmTGF5b3V0QWN0aW9uU2V0PSBuZXcgTGF5b3V0QWN0aW9uR3JvdXAodGhpcyk7Ci0JCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnM9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotCQlmTGF5b3V0QWN0aW9uU2V0LmZpbGxBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJLy8gVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIHRoZSBnbG9iYWwgZWRpdCBhY3Rpb24gd29yayB0aGUgZmlyc3QgdGltZS4KLQkJYWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlVmlldyh0aGlzKTsKLQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3RlZC5pc0VtcHR5KCkpCi0JCQlhY3Rpb25CYXJDb250cmlidXRvci5kaXNhYmxlR2xvYmFsRWRpdE1lbnUoKTsKLQkJZWxzZQotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3IuZW5hYmxlR2xvYmFsRWRpdE1lbnUoKTsKLQotCQlpZiAodHJlZVZpZXdlciAhPSBudWxsKSB7Ci0JCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB0cmVlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIHRyZWVWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdW5kZXJseWluZyB0cmVlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50KSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlciNoYW5kbGVMYWJlbFByb3ZpZGVyQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQpCi0JCQkgKi8KLQkJCXByb3RlY3RlZCB2b2lkIGhhbmRsZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKAotCQkJCQlMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElSZXNvdXJjZQotCQkJCQkJJiYgZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBJTGFiZWxEZWNvcmF0b3IpIHsKLQkJCQkJdGhpcy5yZWZyZXNoKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJc3VwZXIuaGFuZGxlTGFiZWxQcm92aWRlckNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9OwotCi0JCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBjb21tYW5kIHN0YWNrIHRoYXQgd2lsbCBub3RpZnkgdGhpcyBlZGl0b3IgYXMgY29tbWFuZHMgYXJlCi0JCS8vIGV4ZWN1dGVkLgotCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsKLQotCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBzZXQgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQncyBhZmZlY3RlZCBvYmplY3RzIHRvCi0JCS8vIGJlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHZpZXdlciB3aXRoIGZvY3VzLgotCQljb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIobmV3IENvbW1hbmRTdGFja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChmaW5hbCBFdmVudE9iamVjdCBldmVudCkgewotCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7Ci0KLQkJCQkJCS8vIFRyeSB0byBzZWxlY3QgdGhlIGFmZmVjdGVkIG9iamVjdHMuCi0JCQkJCQlDb21tYW5kIG1vc3RSZWNlbnRDb21tYW5kID0gKChDb21tYW5kU3RhY2spIGV2ZW50Ci0JCQkJCQkJCS5nZXRTb3VyY2UoKSkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKTsKLQkJCQkJCWlmIChtb3N0UmVjZW50Q29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJCQkJc2V0U2VsZWN0aW9uVG9WaWV3ZXIobW9zdFJlY2VudENvbW1hbmQKLQkJCQkJCQkJCS5nZXRBZmZlY3RlZE9iamVjdHMoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbAotCQkJCQkJCQkmJiBwcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkgIT0gbnVsbAotCQkJCQkJCQkmJiAhcHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKQotCQkJCQkJCQkmJiBwcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuaXNWaXNpYmxlKCkpIHsKLQkJCQkJCQlwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsKSB7Ci0JCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcnVubmFibGUucnVuKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBDcmVhdGUgdGhlIGVkaXRpbmcgZG9tYWluIHdpdGggYSBzcGVjaWFsIGNvbW1hbmQgc3RhY2suCi0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gUGVyc2lzdGVuY2VTZXJ2aWNlLklOU1RBTkNFCi0JCQkJLmNyZWF0ZVJlc291cmNlU2V0KFNlcnZpY2VzLmdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVuY2VUeXBlKCkpOwotCi0JCWVkaXRpbmdEb21haW4gPSBuZXcgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCWFkYXB0ZXJGYWN0b3J5LCBjb21tYW5kU3RhY2ssIHJlc291cmNlU2V0KTsKLQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIucmVnaXN0ZXJFZGl0aW5nRG9tYWluKGVkaXRpbmdEb21haW4pOwotCi0JCQltYW5hZ2VyLmFkZFByb3BlcnR5TGlzdGVuZXIobmV3IElQcm9wZXJ0eUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgc291cmNlLCBpbnQgcHJvcElkKSB7Ci0JCQkJCS8vIFRPRE86IFJlcGxhY2UgaGFyZGNvZGVkIGNvbnN0YW50IHdpdGggdmFyaWFibGUuCi0JCQkJCWlmIChwcm9wSWQgPT0gMSkgewotCQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJYWRhcHRlckZhY3RvcnkpKTsKLQotCQkvLyB0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3Ci0JCS8vIEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOwotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IERlY29yYXRpbmdMYWJlbFByb3ZpZGVyKAotCQkJCW5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpLAotCQkJCW5ldyBNZXRob2RFbGVtZW50TGFiZWxEZWNvcmF0b3IoKSkpOwotCi0JCS8vIEFkZCBhIGRvdWJsZSBjbGljayBsaXN0ZW5lciBmb3IgbGF1bmNoaW5nIHRoZSBNZXRob2QgZWRpdG9ycy4KLQkJZG91YmxlQ2xpY2tMaXN0ZW5lciA9IG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCQlVSUFjdGlvbkRpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKS5oYW5kbGVEb3VibGVDbGlja0V2ZW50KGV2ZW50KTsKLQkJCX0KLQkJfTsKLQkJdHJlZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKGRvdWJsZUNsaWNrTGlzdGVuZXIpOwotCi0JCWdldFNpdGUoKS5nZXRQYWdlKCkuYWRkUGFydExpc3RlbmVyKGVkaXRvclBhcnRMaXN0ZW5lcik7Ci0KLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpCi0JCQkJLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIobWFya2VyTGlzdGVuZXIpOwotCi0JCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHRyZWVWaWV3ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I3NldElucHV0Rm9yVmlld2VyKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dEZvclZpZXdlcihPYmplY3QgbW9kZWwpIHsKLQkJQ29udHJvbCBjdHJsID0gdGhpcy5nZXRWaWV3ZXIoKS5nZXRDb250cm9sKCk7Ci0JCWlmIChjdHJsLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChtb2RlbCA9PSBudWxsIHx8IG1vZGVsIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJLy8gUHJldmVudCBtZW1vcnkgbGVhay4KLQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gZW1wdHlTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotCQkJYWN0aW9uRGlzcGF0Y2hlci5zZXRTZWxlY3Rpb24oZW1wdHlTZWxlY3Rpb24pOwotCQkJVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkuc2V0U2VsZWN0aW9uKGVtcHR5U2VsZWN0aW9uKTsKLQotCQkJZ2V0Vmlld2VyKCkuc2V0SW5wdXQobW9kZWwpOwotCQkJdXBkYXRlTGFzdFJlZnJlc2hUaW1lc3RhbXAoKTsKLQkJfSBlbHNlIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiTGlicmFyeSB2aWV3ZXIgaW5wdXQgaXMgbm90IGEgTWV0aG9kTGlicmFyeSBvYmplY3Q6ICIgKyBtb2RlbCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVMYXN0UmVmcmVzaFRpbWVzdGFtcCgpIHsKLQkJbGFzdFJlZnJlc2hUaW1lU3RhbXAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgdmlldy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpYnJhcnlWaWV3IGdldFZpZXcoKSB7Ci0JCXJldHVybiAoTGlicmFyeVZpZXcpIFZpZXdIZWxwZXIub3BlblZpZXcoVklFV19JRCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkFic3RyYWN0QmFzZVZpZXcjc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCSgoTGlicmFyeVZpZXdBY3Rpb25CYXJDb250cmlidXRvcikgYWN0aW9uQmFyQ29udHJpYnV0b3IpCi0JCQkJLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCi0JCXN1cGVyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQotCQkvLyBpZiBvbmx5IG9uZSBlbGVtZW50IGlzIHNlbGVjdGVkLCBzaG93IHBhdGggdG8gaXRzIGZpbGUgaW4gc3RhdHVzIGxpbmUKLQkJLy8KLQkJSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyID0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkKLQkJCQkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJaWYgKHN0YXR1c0xpbmVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCVN0cmluZyBwYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQlPYmplY3QgbyA9IFRuZ1V0aWwudW53cmFwKHN0cnVjdHVyZWRTZWxlY3Rpb24KLQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKChFT2JqZWN0KSBvKS5lUmVzb3VyY2UoKTsKLQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJVVJJIHVyaSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJCQkJCWlmICh1cmkgIT0gbnVsbCAmJiB1cmkuaXNGaWxlKCkpIHsKLQkJCQkJCQkJcGF0aCA9IHVyaS50b0ZpbGVTdHJpbmcoKTsKLQkJCQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQkJCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoKENvbnRlbnRFbGVtZW50KSBvKQotCQkJCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQkJCQkJCQlpZiAoY29udGVudCAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJcmVzb3VyY2UgPSBjb250ZW50LmVSZXNvdXJjZSgpOwotCQkJCQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCVVSSSBjb250ZW50VVJJID0gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCQkJCQkJCQkJCWlmIChjb250ZW50VVJJICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJCXBhdGggPSBwYXRoCi0JCQkJCQkJCQkJCQkJCSsgIiwuIiArIEZpbGUuc2VwYXJhdG9yQ2hhciArIGNvbnRlbnRVUkkuZGVyZXNvbHZlKHVyaSkudG9GaWxlU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UocGF0aCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJcmVmcmVzaFZpZXdzKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGFjdGlvbiBiYXIgZm9yIHRoZSBsaWJyYXJ5IHZpZXcKLQkgKi8KLQljbGFzcyBMaWJyYXJ5Vmlld0FjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQotCQlwcml2YXRlIElBY3Rpb24gbmV3UGx1Z2luQWN0aW9uID0gbmV3IE5ld1BsdWdpbkFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdfcGx1Z2luKTsKLQotCQlwcml2YXRlIElBY3Rpb24gbW92ZUFjdGlvbiA9IG5ldyBBY3Rpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMubW92ZSkgewotCi0JCQlwcml2YXRlIHZvaWQgZG9Nb3ZlKCkgewotCQkJCUNvbGxlY3Rpb24gZWxlbWVudHNUb01vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBMaWJyYXJ5Vmlldy50aGlzLnNlbGVjdGlvbjsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJCXx8IChlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCkpIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJCS8vIEhhbmRsZSBDdXN0b21DYXRlZ29yeSBzcGVjaWFsbHkuCi0JCQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoRU9iamVjdCkgZWxlbWVudCkuZUNvbnRhaW5lcigpOwotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoCi0JCQkJCQkJCWNvbnRhaW5lciwgZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX21vdmVFcnJvciwKLQkJCQkJCQkJCQkJc3RhdHVzKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQllbGVtZW50c1RvTW92ZS5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBUT0RPOiBQcm9tcHQgdGhlIHVzZXIgdGhlIHNhdmUgZWRpdGluZyBjaGFuZ2VzIGZvcgotCQkJCS8vIGVsZW1lbnRzIHRoYXQgd2lsbCBiZSBtb3ZlZC4KLQotCQkJCS8vIFJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBtb3ZlIGxpc3QgaWYgdGhlaXIgY29udGFpbmVycyBhcmUKLQkJCQkvLyBhbHJlYWR5IGluIHRoZSBtb3ZlIGxpc3QuCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnRzVG9Nb3ZlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlib29sZWFuIGlzQ29udGFpbmVkID0gZmFsc2U7Ci0JCQkJCWNoZWNrX2NvbnRhaW5lZDogZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb01vdmUKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKFVtYVV0aWwuaXNDb250YWluZWRCeShlbGVtZW50LCBlKSkgewotCQkJCQkJCWlzQ29udGFpbmVkID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBjaGVja19jb250YWluZWQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGlzQ29udGFpbmVkKSB7Ci0JCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCU1vdmVEaWFsb2cgZGxnID0gbmV3IE1vdmVEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCksCi0JCQkJCQllbGVtZW50c1RvTW92ZSwgZWRpdGluZ0RvbWFpbik7Ci0JCQkJZGxnLm9wZW4oKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJCQlydW5uZXIuc2V0UHJvZ3Jlc3NNb25pdG9yKGdldEFjdGlvbkJhcnMoKQotCQkJCQkJLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCWRvTW92ZSgpOwotCQkJCQl9Ci0KLQkJCQl9KTsKLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIElBY3Rpb24gcmVuYW1lQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVBY3Rpb25fdGV4dCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZmluYWwgTmFtZWRFbGVtZW50IGUgPSAoTmFtZWRFbGVtZW50KSBUbmdVdGlsCi0JCQkJCQkudW53cmFwKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKLQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKTsKLQotCQkJCUlTdGF0dXMgc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KGUsIGdldFNpdGUoKQotCQkJCQkJLmdldFNoZWxsKCkpOwotCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ190aXRsZSwKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVEaWFsb2dfcmVuYW1lRXJyb3IsCi0JCQkJCQkJc3RhdHVzKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmIChlLmVDb250YWluZXIoKSAhPSBudWxsCi0JCQkJCQkmJiBlLmVDb250YWluZXIoKS5lUmVzb3VyY2UoKSAhPSBlLmVSZXNvdXJjZSgpKSB7Ci0JCQkJCXN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShlLmVDb250YWluZXIoKSwKLQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lRGlhbG9nX3JlbmFtZUVycm9yLAotCQkJCQkJCQkJCXN0YXR1cyk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlmaW5hbCBJVmFsaWRhdG9yIHZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuY3JlYXRlTmFtZVZhbGlkYXRvcihlLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJSUlucHV0VmFsaWRhdG9yIGlucHV0VmFsaWRhdG9yID0gbmV3IElJbnB1dFZhbGlkYXRvcigpIHsKLQkJCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJCQlpZiAodmFsaWRhdG9yICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCQkJCQkuZ2V0U2ltcGxlRXJyb3JNZXNzYWdlKHZhbGlkYXRvcgotCQkJCQkJCQkJCQkuaXNWYWxpZChuZXdUZXh0KSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCX07Ci0KLQkJCQlib29sZWFuIGdldElucHV0ID0gdHJ1ZTsKLQkJCQlJbnB1dERpYWxvZyBpbnB1dERsZyA9IG5ldyBJbnB1dERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJLmdldEFjdGl2ZVNoZWxsKCksIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZV90ZXh0LAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3bmFtZV90ZXh0LCBlLmdldE5hbWUoKSwKLQkJCQkJCWlucHV0VmFsaWRhdG9yKTsKLQkJCQl3aGlsZSAoZ2V0SW5wdXQpIHsKLQkJCQkJZ2V0SW5wdXQgPSBmYWxzZTsKLQkJCQkJaWYgKGlucHV0RGxnLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQkJCWZpbmFsIFN0cmluZyBuZXdOYW1lID0gaW5wdXREbGcuZ2V0VmFsdWUoKS50cmltKCk7Ci0JCQkJCQlpZiAoIW5ld05hbWUuZXF1YWxzKGUuZ2V0TmFtZSgpKSkgewotCQkJCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQkJCQlTdHJpbmdbXSBjb25maWdOYW1lcyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uTmFtZXMoTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkJCQkJCS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCWlmIChuZXdOYW1lLmVxdWFscyhjb25maWdOYW1lc1tpXSkpIHsKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZywKLQkJCQkJCQkJCQkJCQkJCQkJCW5ld05hbWUpKTsKLQkJCQkJCQkJCQlnZXRJbnB1dCA9IHRydWU7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGdldElucHV0ID09IHRydWUpIHsKLQkJCQkJCQkJaW5wdXREbGcgPSBuZXcgSW5wdXREaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVfdGV4dCwKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXduYW1lX3RleHQsIGUKLQkJCQkJCQkJCQkJCS5nZXROYW1lKCksIGlucHV0VmFsaWRhdG9yKTsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJCWRvUmVuYW1lKGUsIG5ld05hbWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgSUFjdGlvbiByZXBsYWNlQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5FbGVtZW50c1ZpZXdfcmVwbGFjZUFjdGlvbl90ZXh0KSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoIWdldFBhZ2UoKS5jbG9zZUFsbEVkaXRvcnModHJ1ZSkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWZpbmFsIFByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSAoUHJvY2Vzc0NvbXBvbmVudCkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVByb2Nlc3MgcHJvYyA9IHByb2NDb21wLmdldFByb2Nlc3MoKTsKLQkJCQlmaW5hbCBTdHJpbmcgdHlwZVN0cjsKLQkJCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJCXR5cGVTdHIgPSBBdXRob3JpbmdVSVJlc291cmNlcy5FbGVtZW50c1ZpZXdfMjA7Ci0JCQkJfSBlbHNlIGlmIChwcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCXR5cGVTdHIgPSBBdXRob3JpbmdVSVJlc291cmNlcy5FbGVtZW50c1ZpZXdfMjE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdHlwZVN0ciA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld18yMjsKLQkJCQl9Ci0JCQkJRGlyZWN0b3J5RGlhbG9nIGRpckRsZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0U2l0ZSgpCi0JCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQkJZGlyRGxnLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3X3JlcGxhY2VfdGV4dCk7Ci0JCQkJZGlyRGxnCi0JCQkJCQkuc2V0TWVzc2FnZShNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3X21pZ3JhdGlvbl9kaXJfZGxnX2Rlc2NyaXB0aW9uX3RleHQsCi0JCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgdHlwZVN0ciB9KSk7Ci0JCQkJZmluYWwgU3RyaW5nIGRpciA9IGRpckRsZy5vcGVuKCk7Ci0JCQkJaWYgKGRpciA9PSBudWxsKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlib29sZWFuIHJldCA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkJLnJ1bldpdGhQcm9ncmVzcygKLQkJCQkJCQkJbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQlJbXBvcnRFeHBvcnRVdGlsLnJlcGxhY2UocHJvY0NvbXAsCi0JCQkJCQkJCQkJCQkJZGlyKTsKLQkJCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0sCi0JCQkJCQkJCU1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3X3JlcGxhY2Vpbmd3aXRoZm9ybWF0X3RleHQsCi0JCQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyB0eXBlU3RyIH0pKTsKLQotCQkJCWlmIChyZXQpIHsKLQkJCQkJLy8gUmVvcGVuIHRoZSBsaWJyYXJ5LgotCQkJCQlMaWJyYXJ5VUlNYW5hZ2VyLmdldEluc3RhbmNlKCkub3BlbkxpYnJhcnkoCi0JCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uIG9wZW5WYXJpYWJpbGl0eURpYWxvZ0FjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3X29wZW5WYXJpYWJpbGl0eURpYWxvZ0FjdGlvbl90ZXh0KSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKLQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iajsKLQkJCQkJVmFyaWFiaWxpdHlTZWxlY3Rpb24gdmFyaWFiaWxpdHlTZWxlY3Rpb24gPSBuZXcgVmFyaWFiaWxpdHlTZWxlY3Rpb24oKTsKLQkJCQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gdmFyaWFiaWxpdHlTZWxlY3Rpb24KLQkJCQkJCQkuZ2V0U2VsZWN0ZWRWYXJpYWJpbGl0eShlbGVtZW50KTsKLQkJCQkJaWYgKHNlbGVjdGVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRWRpdG9yKHNlbGVjdGVkT2JqZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIGJvb2xlYW4gbG9ja2VkOwotCi0JCXByaXZhdGUgYm9vbGVhbiBjYW5SZW5hbWU7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGNhbk1vdmU7Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uIHNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbl9sYWJlbCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlSZXNvdXJjZU5hdmlnYXRvciBuYXZpZ2F0b3I7Ci0JCQkJdHJ5IHsKLQkJCQkJbmF2aWdhdG9yID0gKFJlc291cmNlTmF2aWdhdG9yKSBnZXRQYWdlKCkuc2hvd1ZpZXcoCi0JCQkJCQkJIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlJlc291cmNlTmF2aWdhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwKLQkJCQkJCQkudW53cmFwKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKLQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQkJCUlSZXNvdXJjZSB3c1JlcyA9IFBlcnNpc3RlbmNlVXRpbC5nZXRXb3Jrc3BhY2VSZXNvdXJjZShvYmopOwotCQkJCQlpZiAod3NSZXMgIT0gbnVsbCkgewotCQkJCQkJbmF2aWdhdG9yLmdldFZpZXdlcigpLnNldFNlbGVjdGlvbigKLQkJCQkJCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24od3NSZXMpLCB0cnVlKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkJICovCi0JCXB1YmxpYyBMaWJyYXJ5Vmlld0FjdGlvbkJhckNvbnRyaWJ1dG9yKEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbikgewotCQkJc3VwZXIoZWRpdGluZ0RvbWFpbik7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI2NyZWF0ZURlbGV0ZUFjdGlvbigpCi0JCSAqLwotCQlwcm90ZWN0ZWQgRGVsZXRlQWN0aW9uIGNyZWF0ZURlbGV0ZUFjdGlvbigpIHsKLQkJCUxpYnJhcnlWaWV3RGVsZXRlQWN0aW9uIGFjdGlvbiA9IG5ldyBMaWJyYXJ5Vmlld0RlbGV0ZUFjdGlvbigpIHsKLQkJCQkvKioKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5FbGVtZW50c1ZpZXdQYXN0ZUFjdGlvbiN1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQkJICovCi0JCQkJcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCQlpZiAobG9ja2VkKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JUaXRsZTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXN1cGVyLnJ1bigpOwotCQkJCQl9IGNhdGNoIChNZXNzYWdlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTdHJpbmcgZGV0YWlscyA9IFRuZ1V0aWwudG9TdGFja1RyYWNlU3RyaW5nKGUpOwotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvck1lc3NhZ2U7Ci0JCQkJCQlTdHJpbmcgcmVhc29uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JSZWFzb247Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgcmVhc29uLCBkZXRhaWxzLAotCQkJCQkJCQkJCWUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcHJvdGVjdGVkIHZvaWQgZGVsZXRlRmFpbGVkKCkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUluZm8oCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGxnVGl0bGVfcmVsb2FkTGlicmFyeSwKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5tc2dfcmVsb2FkTGlicmFyeSk7Ci0KLQkJCQkJLy8gTGlicmFyeSBuZWVkIHRvIGJlIHJlbG9hZGVkLgotCQkJCQlTdHJpbmcgbGliRGlyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKTsKLQkJCQkJTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLm9wZW5MaWJyYXJ5KGxpYkRpcik7Ci0KLQkJCQkJLy8gVXNlciB0cmllZCB0byBzZWxlY3QgdGhlIG9sZCBzZWxlY3Rpb24uCi0JCQkJCWlmIChhY3RpdmVWaWV3UGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgewotCQkJCQkJZmluYWwgQXJyYXlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJCQlTdHJpbmcgZ3VpZCA9ICgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0R3VpZCgpOwotCQkJCQkJCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQkJCQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG1hbmFnZXIKLQkJCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJCQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKCFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpIGFjdGl2ZVZpZXdQYXJ0KQotCQkJCQkJCQkJLmdldFZpZXdlcigpOwotCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQkJCQllbGVtZW50cyksIHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCWFjdGlvbi5zZXRQcm9ncmVzc01vbml0b3IoZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkKLQkJCQkJLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCXJldHVybiBhY3Rpb247Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI2NyZWF0ZUN1dEFjdGlvbigpCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ3V0QWN0aW9uIGNyZWF0ZUN1dEFjdGlvbigpIHsKLQkJCXJldHVybiBuZXcgTGlicmFyeVZpZXdDdXRBY3Rpb24oKSB7Ci0JCQkJLyoqCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuRWxlbWVudHNWaWV3UGFzdGVBY3Rpb24jdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJCSAqLwotCQkJCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQkJaWYgKGxvY2tlZCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNjcmVhdGVDb3B5QWN0aW9uKCkKLQkJICovCi0JCXByb3RlY3RlZCBDb3B5QWN0aW9uIGNyZWF0ZUNvcHlBY3Rpb24oKSB7Ci0JCQlyZXR1cm4gbmV3IExpYnJhcnlWaWV3Q29weUFjdGlvbigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNjcmVhdGVQYXN0ZUFjdGlvbigpCi0JCSAqLwotCQlwcm90ZWN0ZWQgUGFzdGVBY3Rpb24gY3JlYXRlUGFzdGVBY3Rpb24oKSB7Ci0JCQlMaWJyYXJ5Vmlld1Bhc3RlQWN0aW9uIGFjdGlvbiA9IG5ldyBMaWJyYXJ5Vmlld1Bhc3RlQWN0aW9uKCkgewotCQkJCS8qKgotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkVsZW1lbnRzVmlld1Bhc3RlQWN0aW9uI3VwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCQkgKi8KLQkJCQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJCWlmIChsb2NrZWQpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQkJfQotCQkJfTsKLQkJCWFjdGlvbi5zZXRQcm9ncmVzc01vbml0b3IoZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkKLQkJCQkJLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCXJldHVybiBhY3Rpb247Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY2hlY2tMb2NrZWQoKSB7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlib29sZWFuIHdhc0xvY2tlZCA9IGxvY2tlZDsKLQkJCQlsb2NrZWQgPSBWaWV3SGVscGVyLmlzTG9ja2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsKLQkJCQlpZiAod2FzTG9ja2VkICE9IGxvY2tlZCkgewotCQkJCQlkZWxldGVBY3Rpb24uc2V0RW5hYmxlZChkZWxldGVBY3Rpb24KLQkJCQkJCQkudXBkYXRlU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKSk7Ci0JCQkJCWN1dEFjdGlvbi5zZXRFbmFibGVkKGN1dEFjdGlvbgotCQkJCQkJCS51cGRhdGVTZWxlY3Rpb24oKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pKTsKLQkJCQkJcGFzdGVBY3Rpb24uc2V0RW5hYmxlZChwYXN0ZUFjdGlvbgotCQkJCQkJCS51cGRhdGVTZWxlY3Rpb24oKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pKTsKLQkJCQkJYm9vbGVhbiBlbmFibGVkID0gIWxvY2tlZDsKLQkJCQkJcmVuYW1lQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQkJCW1vdmVBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQl2b2lkIHVwZGF0ZVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0KLQkJCWxvY2tlZCA9IFZpZXdIZWxwZXIuaXNMb2NrZWQoc2VsKTsKLQotCQkJYm9vbGVhbiBlbmFibGVkID0gIWxvY2tlZDsKLQkJCXJlbmFtZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJbW92ZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCi0JCQljYW5SZW5hbWUgPSBjYW5SZW5hbWUoc2VsKTsKLQkJCWNhbk1vdmUgPSBjYW5Nb3ZlKHNlbCk7Ci0KLQkJCWlmICghbG9ja2VkICYmIHNlbC5zaXplKCkgPT0gMQotCQkJCQkmJiBzZWwuZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJcmVwbGFjZUFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXBsYWNlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCi0JCQlpZiAoc2VsLnNpemUoKSA9PSAxKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKLQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQkJb3BlblZhcmlhYmlsaXR5RGlhbG9nQWN0aW9uCi0JCQkJCQkuc2V0RW5hYmxlZChvYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQKLQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBvYmopKTsKLQkJCQlzaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbgotCQkJCQkJLnNldEVuYWJsZWQob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjZW5hYmxlR2xvYmFsRWRpdE1lbnUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZW5hYmxlR2xvYmFsRWRpdE1lbnUoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yI2FkZEdsb2JhbEFjdGlvbnMoSU1lbnVNYW5hZ2VyKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgYWRkR2xvYmFsQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJCXN1cGVyLmFkZEdsb2JhbEFjdGlvbnMobWVudU1hbmFnZXIpOwotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImZpeGVkLWFkZGl0aW9ucyIsIG5ld1BsdWdpbkFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBjYW5Nb3ZlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkKLQkJCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkKLQkJCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikKLQkJCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JCQkJCQkmJiAhVG5nVXRpbC5pc1ByZWRlZmluZWQoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQkJY2hlY2tMb2NrZWQoKTsKLQotCQkJLy8gQWRkIG91ciBzdGFuZGFyZCBtYXJrZXIuCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiZml4ZWQtYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiZml4ZWQtYWRkaXRpb25zLWVuZCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImVkaXQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gQWRkIHRoZSBlZGl0IG1lbnUgYWN0aW9ucy4KLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShsaWJyYXJ5Vmlld0VkaXRBY3Rpb24pKTsKLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShjb3B5QWN0aW9uKSk7Ci0JCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0ocGFzdGVBY3Rpb24pKTsKLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGRlbGV0ZUFjdGlvbikpOwotCQkJaWYgKGNhblJlbmFtZSkgewotCQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShyZW5hbWVBY3Rpb24pKTsKLQkJCX0KLQkJCWlmIChjYW5Nb3ZlKSB7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKG1vdmVBY3Rpb24pKTsKLQkJCX0KLQotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoInZpZXciKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChvcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oCi0JCQkJCQlvcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb24pKTsKLQkJCX0KLQkJCWlmIChzaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSgKLQkJCQkJCXNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uKSk7Ci0JCQl9Ci0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQotCQkJLy8gQWRkIG91ciBvdGhlciBzdGFuZGFyZCBtYXJrZXIgd2hlcmUgb3RoZXIgcGx1Z2lucyB3aWxsIGNvbnRyaWJ1dGUKLQkJCS8vIG1lbnUKLQkJCS8vCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zLWVuZCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlhZGRHbG9iYWxBY3Rpb25zKG1lbnVNYW5hZ2VyKTsKLQotCQkJaWYgKCFsb2NrZWQpIHsKLQkJCQlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG51bGw7Ci0JCQkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtKTsKLQkJCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7Ci0JCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJmaXhlZC1hZGRpdGlvbnMiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJLy8gbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb24oIlJlbG9hZCIpIHsKLQkJCS8vIC8qCi0JCQkvLyAqIChub24tSmF2YWRvYykKLQkJCS8vICoKLQkJCS8vICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JCQkvLyAqLwotCQkJLy8gcHVibGljIHZvaWQgcnVuKCkgewotCQkJLy8gSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oKTsKLQkJCS8vIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJLy8gT2JqZWN0IG9iamVjdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKLQkJCS8vIC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCS8vIG9iamVjdCA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCQkvLyBpZiAob2JqZWN0IGluc3RhbmNlb2YgSW50ZXJuYWxFT2JqZWN0KSB7Ci0JCQkvLyBJbnRlcm5hbEVPYmplY3QgZSA9ICgoSW50ZXJuYWxFT2JqZWN0KSBvYmplY3QpOwotCQkJLy8gSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IChJTGlicmFyeVJlc291cmNlU2V0KSBlCi0JCQkvLyAuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCS8vIHJlc291cmNlU2V0LnVubG9hZChlKTsKLQkJCS8vIFVSSSB1cmkgPSBlLmVQcm94eVVSSSgpOwotCQkJLy8gRU9iamVjdCBuZXdPYmplY3QgPSByZXNvdXJjZVNldC5nZXRFT2JqZWN0KGUsIHVyaSwKLQkJCS8vIHRydWUpOwotCQkJLy8gcmVmcmVzaFZpZXdzKCk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9KTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZWxlY3RlZCBtZXRob2QgZWxlbWVudHMgY2FuIGJlCi0JCSAqIHJlbmFtZWQuCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gY2FuUmVuYW1lKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTmFtZWRFbGVtZW50Ci0JCQkJCSYmICFUbmdVdGlsLmlzUHJlZGVmaW5lZCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNyZWZyZXNoVmlld2VyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpZXdlcihmaW5hbCBWaWV3ZXIgdmlld2VyKSB7Ci0JCQlpZiAodmlld2VyID09IExpYnJhcnlWaWV3LnRoaXMuZ2V0Vmlld2VyKCkpIHsKLQkJCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDMpOyAvLyROT04tTkxTLTEkCi0JCQkJCQltb25pdG9yCi0JCQkJCQkJCS5zdWJUYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbSk7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gUmVmcmVzaCBhbGwgbG9hZGVkIHJlc291cmNlcy4KLQkJCQkJCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCQkJCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbWFuYWdlcgotCQkJCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQkJCQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZVNldAotCQkJCQkJCQkJCSYmICgoSUxpYnJhcnlSZXNvdXJjZVNldCkgcmVzb3VyY2VTZXQpCi0JCQkJCQkJCQkJCQkuZ2V0UGVyc2lzdGVuY2VUeXBlKCkKLQkJCQkJCQkJCQkJCS5lcXVhbHMoCi0JCQkJCQkJCQkJCQkJCVNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFKSkgewotCQkJCQkJCQkJTGlzdCByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQkJTGlzdCBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdCgKLQkJCQkJCQkJCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkpCi0JCQkJCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlcgotCQkJCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQkJCQlTdHJpbmcgbG9jID0gcmVzb3VyY2UuZ2V0VVJJKCkKLQkJCQkJCQkJCQkJCS50b0ZpbGVTdHJpbmcoKTsKLQkJCQkJCQkJCQlJUmVzb3VyY2Ugd3NSZXMgPSBGaWxlTWFuYWdlcgotCQkJCQkJCQkJCQkJLmdldFJlc291cmNlRm9yTG9jYXRpb24obG9jKTsKLQkJCQkJCQkJCQlpZiAod3NSZXMgPT0gbnVsbCkgewotCQkJCQkJCQkJCQlyZW1vdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQkJCQkJfSBlbHNlIGlmICghd3NSZXMKLQkJCQkJCQkJCQkJCS5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTykpIHsKLQkJCQkJCQkJCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCW1vbml0b3Iud29ya2VkKDIpOwotCQkJCQkJCQkJaWYgKHJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpCi0JCQkJCQkJCQkJCSYmIGNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJZG9SZWZyZXNoKHJlbW92ZWRSZXNvdXJjZXMsCi0JCQkJCQkJCQkJCQljaGFuZ2VkUmVzb3VyY2VzLCBudWxsLCBmYWxzZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfTsKLQkJCQlJUnVubmFibGVDb250ZXh0IGNvbnRleHQgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNpdGUoKQotCQkJCQkJLmdldFNoZWxsKCkpOwotCQkJCXRyeSB7Ci0JCQkJCWdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW5JblVJKGNvbnRleHQsIHJ1bm5hYmxlLAotCQkJCQkJCQkJbnVsbCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlOwotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCXRpdGxlLCBlLnRvU3RyaW5nKCksIGUpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlzdXBlci5yZWZyZXNoVmlld2VyKHZpZXdlcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNjcmVhdGVBY3Rpb25CYXJDb250cmlidXRvcigpCi0JICovCi0JcHVibGljIElMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IgY3JlYXRlQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7Ci0JCUlMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IgYWN0aW9uQmFyID0gbmV3IExpYnJhcnlWaWV3QWN0aW9uQmFyQ29udHJpYnV0b3IoCi0JCQkJZWRpdGluZ0RvbWFpbik7Ci0JCXJldHVybiBhY3Rpb25CYXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkFic3RyYWN0QmFzZVZpZXcjY3JlYXRlQ29udGV4dE1lbnVGb3Iob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRleHRNZW51Rm9yKGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRleHRNZW51Rm9yKHZpZXdlcik7Ci0JCWludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LOwotCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsgSFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCksCi0JCQkJVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCksIExvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OwotCQl2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLAotCQkJCW5ldyBMaWJyYXJ5Vmlld2VyRHJhZ0FkYXB0ZXIodmlld2VyKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkFic3RyYWN0QmFzZVZpZXcjbWVudUFib3V0VG9TaG93KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQlzdXBlci5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCNpbml0KG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3U2l0ZSBzaXRlKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlzdXBlci5pbml0KHNpdGUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRSZWZyZXNoSGFuZGxlcihudWxsKTsKLQotCQlpZiAoZkxheW91dEFjdGlvblNldCAhPSBudWxsKQkKLQkJCWZMYXlvdXRBY3Rpb25TZXQuZGlzcG9zZSgpOwotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRvdWJsZUNsaWNrTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJdHJlZVZpZXdlci5yZW1vdmVEb3VibGVDbGlja0xpc3RlbmVyKGRvdWJsZUNsaWNrTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iagotCSAqICAgICAgICAgICAgSXRlbVByb3ZpZGVyCi0JICogQHJldHVybiBQcm9jZXNzQ29tcG9uZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gb2JqCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnQgZ2V0UHJvY2Vzc0NvbXBvbmVudChPYmplY3Qgb2JqKSB7Ci0JCU9iamVjdCBwYXJlbnQ7Ci0JCWZvciAocGFyZW50ID0gb2JqOyAocGFyZW50ICE9IG51bGwgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSk7KSB7Ci0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCX0KLQkJcmV0dXJuIChQcm9jZXNzQ29tcG9uZW50KSBwYXJlbnQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU3RhdHVzV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIGV4dGVuZHMKLQkJCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiB7Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBlcnJNc2c7Ci0KLQkJcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gZXJyTXNnOwotCQl9Ci0JfQotCi0JLyoqCi0JICogb3BlbnMgYSBNZXRob2QgTGlicmFyeQotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBwYXRoIHRvIHRoZSBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgb3BlbkxpYnJhcnkoZmluYWwgU3RyaW5nIHBhdGgpIHsKLQkJLy8gRG8gdGhlIHdvcmsgd2l0aGluIGFuIG9wZXJhdGlvbiBiZWNhdXNlIHRoaXMgaXMgYSBsb25nIHJ1bm5pbmcKLQkJLy8gYWN0aXZpdHkgdGhhdCBtb2RpZmllcyB0aGUgd29ya2JlbmNoLgotCQlTdGF0dXNXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFN0YXR1c1dvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQotCQkJLy8gVGhpcyBpcyB0aGUgbWV0aG9kIHRoYXQgZ2V0cyBpbnZva2VkIHdoZW4gdGhlIG9wZXJhdGlvbiBydW5zLgotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzayhBdXRob3JpbmdVSVJlc291cmNlcy5vcGVuaW5nTGlicmFyeVRhc2tfbmFtZSwKLQkJCQkJCTIpOwotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gWE1JTGlicmFyeVV0aWwKLQkJCQkJCQkub3Blbk1ldGhvZExpYnJhcnkocGF0aCk7Ci0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2V0Q3VycmVudE1ldGhvZExpYnJhcnkoCi0JCQkJCQkJbGlicmFyeSk7Ci0JCQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzLnNldFNhdmVkTGlicmFyeVBhdGgocGF0aCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWlmIChleCBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7Ci0JCQkJCQlTdHJpbmcgbWVzc2FnZSA9IGV4LmdldE1lc3NhZ2UoKTsKLQkJCQkJCWlmIChtZXNzYWdlLnN0YXJ0c1dpdGgoIiMjIyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgcHJvamVjdEZpbGVOYW1lID0gbWVzc2FnZS5zdWJzdHJpbmcoMyk7Ci0JCQkJCQkJU3RyaW5nIHByb21wdCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5FbGVtZW50c1ZpZXdfMzUsCi0JCQkJCQkJCQkobmV3IE9iamVjdFtdIHsgcHJvamVjdEZpbGVOYW1lIH0pKTsKLQkJCQkJCQlpZiAoTXNnQm94LnByb21wdChwcm9tcHQsIFNXVC5SRVRSWSB8IFNXVC5DQU5DRUwpID09IFNXVC5SRVRSWSkgewotCQkJCQkJCQlvcGVuTGlicmFyeShwYXRoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfbXNnLAotCQkJCQkJCQkJCWV4KTsKLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJLy8gVGhpcyBydW5zIHRoZSBvcHRpb25zLCBhbmQgc2hvd3MgcHJvZ3Jlc3MuCi0JCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKS5ydW4odHJ1ZSwgZmFsc2UsCi0JCQkJCW9wZXJhdGlvbik7Ci0JCQlpZiAob3BlcmF0aW9uLmdldEVycm9yTWVzc2FnZSgpID09IG51bGwpIHsKLQkJCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlQWxsRWRpdG9ycyhmYWxzZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNoYW5kbGVBY3RpdmF0ZShvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBY3RpdmF0ZShJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCXN1cGVyLmhhbmRsZUFjdGl2YXRlKHBhcnQpOwotCi0JCS8vIFRPRE86IFJldmlldyBpbXBsZW1lbnRhdGlvbi4KLQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG1ldGhvZCBsaWJyYXJ5IG9wZW4gaXMgbm90IGNsb3NlZC4KLQkJWE1JTGlicmFyeVV0aWwub3Blbk1ldGhvZExpYnJhcnlQcm9qZWN0KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwgZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkKLQkJCQkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlNhdmVhYmxlTGlicmFyeVZpZXdQYXJ0I2lzU2F2ZUFzQWxsb3dlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQkvLyBUaGlzIHZpZXcgc2hvdWxkIG5vdCBwYXJ0aWNpcGF0ZSBpbiBhbGwgdGhlIHNhdmUgY29tbWFuZHMuCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuU2F2ZWFibGVMaWJyYXJ5Vmlld1BhcnQjZG9TYXZlQXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyIGdldFdyYXBwZXIoTGlzdCBsaXN0ZW5lcnMsIE9iamVjdCB2YWx1ZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbGlzdGVuZXIgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKGxpc3RlbmVyIGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCQkmJiBUbmdVdGlsLnVud3JhcChsaXN0ZW5lcikgPT0gdmFsdWUpIHsKLQkJCQlyZXR1cm4gKEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIGxpc3RlbmVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBVc2VkIGJ5IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaW5rV2l0aEVkaXRvciBHaXZlbiBhbgotCSAqIG9iamVjdCB0aGF0IGlzIGEgTWV0aG9kRWxlbWVudCwgc2VsZWN0cyB0aGF0IG9iamVjdCBpbiB0aGUgTGliIE5hdgotCSAqIAotCSAqIEBwYXJhbSBvCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoT2JqZWN0IG9iamVjdCkgewotCQlPYmplY3QgbyA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCWlmICghKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSkKLQkJCXJldHVybjsKLQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlzdXBlci5zZXRTZWxlY3Rpb25Ub1ZpZXdlcihBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IG8gfSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKE1ldGhvZEVsZW1lbnQpIG8pOwotCQkJdHJlZVZpZXdlci5zZXRFeHBhbmRlZFN0YXRlKHBsdWdpbiwgdHJ1ZSk7Ci0KLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwbHVnaW5BZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgVG5nVXRpbAotCQkJCQkuZ2V0QWRhcHRlcihwbHVnaW4sIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0KLQkJCWlmIChvIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewkJCQkKLQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpbyk7Ci0JCQkJaWYocHJvYyAhPSBudWxsKSB7Ci0JCQkJCW8gPSBwcm9jLmVDb250YWluZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgfHwgbyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0KLQkJCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUocGx1Z2luQWRhcHRlci5nZXRDaGlsZHJlbihwbHVnaW4pCi0JCQkJCQkudG9BcnJheSgpWzFdLCB0cnVlKTsKLQkJCQkvLyBFeHBhbmQgdGhlIHByb2Nlc3MgcGFja2FnZXMuCi0JCQkJZXhwYW5kVHJlZVZpZXdlclBhY2thZ2VzKCgoTWV0aG9kRWxlbWVudCkgbykuZUNvbnRhaW5lcigpKTsKLQotCQkJfSBlbHNlIHsKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgbWV0aG9kQ29udGVudFBrZyA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHBsdWdpbkFkYXB0ZXIKLQkJCQkJCS5nZXRDaGlsZHJlbihwbHVnaW4pLnRvQXJyYXkoKVswXTsKLQkJCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUobWV0aG9kQ29udGVudFBrZywgdHJ1ZSk7Ci0KLQkJCQlpZiAobyBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7CQkJCQkKLQkJCQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdENDID0gVG5nVXRpbAotCQkJCQkJCS5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkocGx1Z2luKTsKLQkJCQkJCQkJCQkKLQkJCQkJLy8gZmluZCB0aGUgdHJlZSBwYXRoIHRvIHRoZSBjdXN0b20gY2F0ZWdvcnkgZnJvbSB0aGUgcm9vdCBjdXN0b20gY2F0ZWdvcnkKLQkJCQkJLy8KLQkJCQkJZmluYWwgTGlzdCB0cmVlUGF0aCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yKEN1c3RvbUNhdGVnb3J5IGNjID0gKEN1c3RvbUNhdGVnb3J5KSBvOyBjYyAhPSByb290Q0M7KSB7Ci0JCQkJCQl0cmVlUGF0aC5hZGQoMCwgY2MpOwotCQkJCQkJY2MgPSAoQ3VzdG9tQ2F0ZWdvcnkpIEFzc29jaWF0aW9uSGVscGVyLmdldEN1c3RvbUNhdGVnb3JpZXMoY2MpLmdldCgwKTsJCQkJCQkgCi0JCQkJCX0KLQkJCQkJT2JqZWN0IHBhcmVudCA9IHJvb3RDQzsKLQkJCQkJaW50IHNpemUgPSB0cmVlUGF0aC5zaXplKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQlPYmplY3QgZSA9IHRyZWVQYXRoLmdldChpKTsKLQkJCQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShwYXJlbnQsIHRydWUpOwotCQkJCQkJLy8gZ2V0IHdyYXBwZXIKLQkJCQkJCS8vCi0JCQkJCQlDdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJZmluZF93cmFwcGVyOgotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFkYXB0ZXIuZ2V0Tm90aWZ5Q2hhbmdlZExpc3RlbmVycygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgbGlzdGVuZXIgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYobGlzdGVuZXIgaW5zdGFuY2VvZiBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyCi0JCQkJCQkJCQkmJiBUbmdVdGlsLnVud3JhcChsaXN0ZW5lcikgPT0gZSkgewotCQkJCQkJCQlGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgbGlzdGVuZXI7Ci0JCQkJCQkJCWZvcig7d3JhcHBlciAhPSBudWxsICYmIHdyYXBwZXIuZ2V0T3duZXIoKSAhPSBwYXJlbnQ7IAotCQkJCQkJCQkJd3JhcHBlciA9IGdldFdyYXBwZXIod3JhcHBlci5nZXROb3RpZnlDaGFuZ2VkTGlzdGVuZXJzKCksIGUpKSB7CQkJCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQkJaWYod3JhcHBlciAhPSBudWxsKSB7Ci0JCQkJCQkJCQlwYXJlbnQgPSB3cmFwcGVyOwotCQkJCQkJCQkJYnJlYWsgZmluZF93cmFwcGVyOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW8gPSBwYXJlbnQ7Ci0JCQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQkJCU9iamVjdCBzdGRDYXRzID0gbWV0aG9kQ29udGVudFBrZy5nZXRDaGlsZHJlbihvKS50b0FycmF5KClbMV07Ci0JCQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShzdGRDYXRzLCB0cnVlKTsKLQotCQkJCX0gZWxzZSB7Ci0JCQkJCU9iamVjdCBjb3JlQ29udGVudCA9IG1ldGhvZENvbnRlbnRQa2cuZ2V0Q2hpbGRyZW4obykKLQkJCQkJCQkudG9BcnJheSgpWzBdOwotCQkJCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUoY29yZUNvbnRlbnQsIHRydWUpOwotCi0JCQkJCS8vIEV4cGFuZCB0aGUgY29udGVudCBwYWNrYWdlcy4KLQkJCQkJZXhwYW5kVHJlZVZpZXdlclBhY2thZ2VzKCgoTWV0aG9kRWxlbWVudCkgbykuZUNvbnRhaW5lcigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJfQotCi0JCXN1cGVyLnNldFNlbGVjdGlvblRvVmlld2VyKEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsgbyB9KSk7Ci0KLQkJaWYobyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgJiYgb2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJLy8gb3BlbiB0aGUgcHJvY2VzcyBpbiBpdHMgZWRpdG9yIGFuZCBzZWxlY3QgdGhlIGJyZWFrZG93biBlbGVtZW50Ci0JCQkvLwotCQkJSUVkaXRvcktlZXBlci5SRUZFUkVOQ0UuZ2V0RWRpdG9yS2VlcGVyKCkub3BlbkVkaXRvcihvKTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IGdldFNpdGUoKS5nZXRQYWdlKCkuZmluZEVkaXRvcihuZXcgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KChNZXRob2RFbGVtZW50KSBvKSk7Ci0JCQlpZihlZGl0b3IgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9yKSB7Ci0JCQkJUHJvY2Vzc0VkaXRvciBwcm9jRWRpdG9yID0gKChQcm9jZXNzRWRpdG9yKWVkaXRvcik7Ci0JCQkJU3RyaW5nIHBhZ2VJZDsKLQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvciB8fCBvYmplY3QgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCQlwYWdlSWQgPSBQcm9jZXNzRWRpdG9yLlRBX0ZPUk1fSUQ7Ci0JCQkJfQotCQkJCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCXBhZ2VJZCA9IFByb2Nlc3NFZGl0b3IuV1BCU19GT1JNX0lEOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcGFnZUlkID0gUHJvY2Vzc0VkaXRvci5XQlNfRk9STV9JRDsKLQkJCQl9Ci0JCQkJcHJvY0VkaXRvci5zZXRBY3RpdmVQYWdlKHBhZ2VJZCk7Ci0JCQkJcHJvY0VkaXRvci5zZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG9iamVjdCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZFRyZWVWaWV3ZXJQYWNrYWdlcyhFT2JqZWN0IGUpIHsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSB8fCBlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCWV4cGFuZFRyZWVWaWV3ZXJQYWNrYWdlcyhlLmVDb250YWluZXIoKSk7Ci0JCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUoZSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLklSZWZyZXNoSGFuZGxlciNyZWZyZXNoKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUNvbnRyb2wgY3RybCA9IGdldFZpZXdlcigpLmdldENvbnRyb2woKTsKLQkJaWYgKGN0cmwgPT0gbnVsbCB8fCBjdHJsLmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQotCQlpZiAoY3RybC5nZXREaXNwbGF5KCkuZ2V0VGhyZWFkKCkgPT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSkgewotCQkJZG9SZWZyZXNoKGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJfSBlbHNlIHsKLQkJCWN0cmwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZG9SZWZyZXNoKG51bGwpOwotCQkJCX0KLQotCQkJfSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBibG9ja2luZ1JlZnJlc2goZmluYWwgQXJyYXlMaXN0IHJlbW92ZWRSZXNvdXJjZXMsCi0JCQlmaW5hbCBBcnJheUxpc3QgY2hhbmdlZFJlc291cmNlcywKLQkJCWZpbmFsIENvbGxlY3Rpb24gYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMsCi0JCQlmaW5hbCBib29sZWFuIHJlZnJlc2hWaWV3cywgU2hlbGwgc2hlbGwpIHsKLQkJZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgLy8kTk9OLU5MUy0xJAotCQkJCW1vbml0b3IKLQkJCQkJCS5zdWJUYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbSk7Ci0JCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCWRvUmVmcmVzaChyZW1vdmVkUmVzb3VyY2VzLCBjaGFuZ2VkUmVzb3VyY2VzLAotCQkJCQkJCWFkZGVkV29ya3NwYWNlUmVzb3VyY2VzLCByZWZyZXNoVmlld3MpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCi0JCUlSdW5uYWJsZUNvbnRleHQgY29udGV4dCA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpOwotCQl0cnkgewotCQkJZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpCi0JCQkJCS5ydW5JblVJKAotCQkJCQkJCWNvbnRleHQsCi0JCQkJCQkJcnVubmFibGUsCi0JCQkJCQkJbmV3IExpYnJhcnlTY2hlZHVsaW5nUnVsZShMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JUaXRsZTsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsCi0JCQkJCWUudG9TdHJpbmcoKSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNdXN0IGJlIHN5bmNocm9uaXplZCB0byBhdm9pZCBzdGVwcGluZyBvbiBlYWNoIG90aGVyIGluIHJlbG9hZGluZwotCSAqIHJlc291cmNlcy9yZWZyZXNoaW5nIFVJCi0JICogCi0JICogQHBhcmFtIHJlbW92ZWRSZXNvdXJjZXMKLQkgKiBAcGFyYW0gY2hhbmdlZFJlc291cmNlcwotCSAqIEBwYXJhbSBhZGRlZFdvcmtzcGFjZVJlc291cmNlcwotCSAqICAgICAgICAgICAgY29sbGVjdGlvbiBvZiBJUmVzb3VyY2Ugb2JqZWN0cyB0aGF0IGFyZSBqdXN0IG5ld2x5IGFkZGVkIHRvCi0JICogICAgICAgICAgICB0aGUgbGlicmFyeQotCSAqIEBwYXJhbSByZWZyZXNoVmlld3MKLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGRvUmVmcmVzaChDb2xsZWN0aW9uIHJlbW92ZWRSZXNvdXJjZXMsCi0JCQlDb2xsZWN0aW9uIGNoYW5nZWRSZXNvdXJjZXMsIENvbGxlY3Rpb24gYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMsCi0JCQlib29sZWFuIHJlZnJlc2hWaWV3cykgewotCQlIYXNoU2V0IGVkaXRvcnNUb1JlZnJlc2ggPSBuZXcgSGFzaFNldCgpOwotCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQloYW5kbGVSZW1vdmVkUmVzb3VyY2VzKHJlbW92ZWRSZXNvdXJjZXMsIGVkaXRvcnNUb1JlZnJlc2gpOwotCQkJcmVmcmVzaFZpZXdzID0gdHJ1ZTsKLQkJfQotCQlpZiAoIWNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQloYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKGNoYW5nZWRSZXNvdXJjZXMsIGVkaXRvcnNUb1JlZnJlc2gsCi0JCQkJCXJlZnJlc2hWaWV3cyk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocmVmcmVzaFZpZXdzKSB7Ci0JCQkJcmVmcmVzaFZpZXdzKCk7Ci0JCQl9Ci0KLQkJCWlmICghZWRpdG9yc1RvUmVmcmVzaC5pc0VtcHR5KCkpIHsKLQkJCQkvLyByZWZyZXNoIHRoZSBlZGl0b3JzIHRoYXQgaGFuZGxlUmVtb3ZlZFJlc291cmNlcyByZXF1ZXN0ZWQKLQkJCQkvLwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVkaXRvcnNUb1JlZnJlc2guaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVkaXRvciA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcikgewotCQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMgIT0gbnVsbAotCQkJCSYmICFhZGRlZFdvcmtzcGFjZVJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCUlMaWJyYXJ5TWFuYWdlciBtZ3IgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtZ3IgIT0gbnVsbCkgewotCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbWdyLmdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSB7Ci0JCQkJCSgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSByZXNvdXJjZVNldCkKLQkJCQkJCQkubG9hZE5ld1Jlc291cmNlcyhhZGRlZFdvcmtzcGFjZVJlc291cmNlcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmlld09iamVjdChPYmplY3QgbykgewotCQlyZXR1cm4gbyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkmJiAhKG8gaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24KLQkJCQkJCXx8IG8gaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCB8fCAobyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlICYmIFVtYVV0aWwKLQkJCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50KChNZXRob2RFbGVtZW50KSBvKSA9PSBudWxsKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvUmVmcmVzaChJUmVmcmVzaEV2ZW50IGV2ZW50LCBTaGVsbCBzaGVsbCkgewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIlJlZnJlc2hlZCBvYmplY3RzOiAiICsgZXZlbnQuZ2V0UmVmcmVzaGVkT2JqZWN0cygpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gcmVmcmVzaCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBldmVudC5nZXRSZWZyZXNoZWRPYmplY3RzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGlzVmlld09iamVjdChlKSkgewotCQkJCXJlZnJlc2ggPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChyZWZyZXNoKSB7Ci0JCQlyZWZyZXNoVmlld3MoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyB0aGUgTGlicmFyeSBWaWV3Ci0JICogCi0JICogQHBhcmFtIHNoZWxsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvUmVmcmVzaChTaGVsbCBzaGVsbCkgewotCQlBcnJheUxpc3QgbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRNb3ZlZFJlc291cmNlcygpKTsKLQkJaWYgKCFtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vdmVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoKChJUHJvamVjdClvKS5oYXNOYXR1cmUoTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuTkFUVVJFX0lEKSkgewotCQkJCQkJCS8vIFRPRE86IHNhZmUgdG8gYXNzdW1lIFhNSSBsaWJyYXJ5PwotCQkJCQkJCVhNSUxpYnJhcnlVdGlsLm9wZW5NZXRob2RMaWJyYXJ5KCgoSVByb2plY3QpbykuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7IAotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsIGJvb2xlYW4gcmVmcmVzaFZpZXdzID0gIVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRSZWxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMoKS5pc0VtcHR5KCkKLQkJCQl8fCAhUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldEFkZGVkUmVzb3VyY2VzKCkuaXNFbXB0eSgpOwotCQlBcnJheUxpc3QgcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFJlbW92ZWRSZXNvdXJjZXMoKSk7Ci0JCUFycmF5TGlzdCBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdChSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLQkJQXJyYXlMaXN0IGFkZGVkV3NSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRBZGRlZFdvcmtzcGFjZVJlc291cmNlcygpKTsKLQotCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpIHx8ICFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKQotCQkJCXx8ICFhZGRlZFdzUmVzb3VyY2VzLmlzRW1wdHkoKSB8fCByZWZyZXNoVmlld3MpIHsKLQkJCWJsb2NraW5nUmVmcmVzaChyZW1vdmVkUmVzb3VyY2VzLCBjaGFuZ2VkUmVzb3VyY2VzLAotCQkJCQlhZGRlZFdzUmVzb3VyY2VzLCByZWZyZXNoVmlld3MsIHNoZWxsKTsKLQkJfQotCi0JCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRSZW1vdmVkUmVzb3VyY2VzKCkucmVtb3ZlQWxsKAotCQkJCQlyZW1vdmVkUmVzb3VyY2VzKTsKLQkJfQotCQlpZiAoIWNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0Q2hhbmdlZFJlc291cmNlcygpLnJlbW92ZUFsbCgKLQkJCQkJY2hhbmdlZFJlc291cmNlcyk7Ci0JCX0KLQkJaWYgKCFhZGRlZFdzUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldEFkZGVkV29ya3NwYWNlUmVzb3VyY2VzKCkucmVtb3ZlQWxsKAotCQkJCQlhZGRlZFdzUmVzb3VyY2VzKTsKLQkJfQotCQlpZiAocmVmcmVzaFZpZXdzKSB7Ci0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0UmVsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzKCkKLQkJCQkJLmNsZWFyKCk7Ci0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0QWRkZWRSZXNvdXJjZXMoKS5jbGVhcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlbW92ZWRSZXNvdXJjZXMyCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGhhbmRsZVJlbW92ZWRSZXNvdXJjZXMoQ29sbGVjdGlvbiByZW1vdmVkUmVzb3VyY2VzLAotCQkJQ29sbGVjdGlvbiBlZGl0b3JzVG9SZWZyZXNoKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlBcnJheUxpc3QgZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlBcnJheUxpc3QgcmVtb3ZlZFJlc291cmNlTGlzdCA9IG5ldyBBcnJheUxpc3QocmVtb3ZlZFJlc291cmNlcyk7Ci0JCWlmIChlZGl0b3JzVG9SZWZyZXNoID09IG51bGwpIHsKLQkJCWVkaXRvcnNUb1JlZnJlc2ggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJLy8gZmluZCBhbGwgZWRpdG9yIHdpdGggZGlydHkgY29uZmxpY3QKLQkJLy8KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IgJiYgZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBpbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGVkaXRvcgotCQkJCQkJLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBpbnB1dC5nZXRNZXRob2RFbGVtZW50KCkgIT0gbnVsbCA/IGlucHV0Ci0JCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgpLmVSZXNvdXJjZSgpIDogbnVsbDsKLQkJCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQkJCUNvbGxlY3Rpb24gdXNlZFJlc291cmNlcyA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZWRpdG9yKQotCQkJCQkJCS5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJCWNoZWNrX3Jlc291cmNlOiBmb3IgKGludCBqID0gMDsgaiA8IHJlbW92ZWRSZXNvdXJjZUxpc3QKLQkJCQkJCQkuc2l6ZSgpOyBqKyspIHsKLQkJCQkJCXJlc291cmNlID0gKFJlc291cmNlKSByZW1vdmVkUmVzb3VyY2VMaXN0LmdldChqKTsKLQkJCQkJCWlmICh1c2VkUmVzb3VyY2VzLmNvbnRhaW5zKHJlc291cmNlKSkgewotCQkJCQkJCWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5hZGQoZWRpdG9yKTsKLQkJCQkJCQlicmVhayBjaGVja19yZXNvdXJjZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWVkaXRvcnNUb1JlZnJlc2guYWRkKGVkaXRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBzZWxlY3RlZCA9IHNlbGVjdERpcnR5RWRpdG9ycyhkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJCWVkaXRvcnNUb1JlZnJlc2guYWRkKHNlbGVjdGVkW2ldKTsKLQkJCX0KLQkJfQotCi0JCS8vIFVubG9hZCB0aGUgcmVtb3ZlZCByZXNvdXJjZXMuCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlbW92ZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlJTGlicmFyeVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gKElMaWJyYXJ5UmVzb3VyY2VTZXQpIHJlc291cmNlCi0JCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCQkJdHJ5IHsKLQkJCQlyZXNvdXJjZVNldC51bmxvYWQocmVzb3VyY2UsIENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQl9Ci0JCX0KLQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbWFuYWdlci5nZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJLmdldFJlc291cmNlU2V0KCk7Ci0JCQlpZiAocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLnJlbW92ZUFsbChyZW1vdmVkUmVzb3VyY2VzKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yICYmICFlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJQ29sbGVjdGlvbiB1c2VkUmVzb3VyY2VzID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpCi0JCQkJCQkuZ2V0VXNlZFJlc291cmNlcygpOwotCQkJCWNoZWNrX3Jlc291cmNlOiBmb3IgKGludCBqID0gMDsgaiA8IHJlbW92ZWRSZXNvdXJjZUxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIHJlbW92ZWRSZXNvdXJjZUxpc3QuZ2V0KGopOwotCQkJCQlpZiAodXNlZFJlc291cmNlcy5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJCWVkaXRvcnNUb1JlZnJlc2guYWRkKGVkaXRvcik7Ci0JCQkJCQlicmVhayBjaGVja19yZXNvdXJjZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZW1vdmVkUmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBjaGFuZ2VkUmVzb3VyY2VzCi0JICogQHJldHVybiByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gcmVsb2FkZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gaGFuZGxlQ2hhbmdlZFJlc291cmNlcyhDb2xsZWN0aW9uIGNoYW5nZWRSZXNvdXJjZXMsCi0JCQlDb2xsZWN0aW9uIGVkaXRvcnNUb1JlZnJlc2gsIGJvb2xlYW4gZm9yY2VSZWZyZXNoVmlld3MpIHsKLQkJaWYgKCFmb3JjZVJlZnJlc2hWaWV3cykgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hhbmdlZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZQotCQkJCQkJJiYgKChJTGlicmFyeVJlc291cmNlKSByZXNvdXJjZSkuZ2V0TG9hZFN0YW1wKCkgPiBsYXN0UmVmcmVzaFRpbWVTdGFtcCkgewotCQkJCQlmb3JjZVJlZnJlc2hWaWV3cyA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaGFuZGxlQ2hhbmdlZFJlc291cmNlcyhjaGFuZ2VkUmVzb3VyY2VzLCBudWxsLAotCQkJCWZvcmNlUmVmcmVzaFZpZXdzLCBlZGl0b3JzVG9SZWZyZXNoKTsKLQl9Ci0KLQkvKioKLQkgKiB1cGRhdGVzIExpYnJhcnkgVmlldyB3aGVuIHJlc291cmNlcyBjaGFuZ2UKLQkgKiAKLQkgKiBAcGFyYW0gY2hhbmdlZFJlc291cmNlcwotCSAqIEBwYXJhbSBlZGl0b3JzTm90VG9SZWZyZXNoCi0JICogQHBhcmFtIGZvcmNlUmVmcmVzaFZpZXdzCi0JICogQHBhcmFtIGVkaXRvcnNUb1JlZnJlc2gKLQkgKiBAcmV0dXJuIExpc3Qgb2YgY2hhbmdlZCByZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKENvbGxlY3Rpb24gY2hhbmdlZFJlc291cmNlcywKLQkJCUNvbGxlY3Rpb24gZWRpdG9yc05vdFRvUmVmcmVzaCwgYm9vbGVhbiBmb3JjZVJlZnJlc2hWaWV3cywKLQkJCUNvbGxlY3Rpb24gZWRpdG9yc1RvUmVmcmVzaCkgewotCQlDb250cm9sIGN0cmwgPSBnZXRWaWV3ZXIoKS5nZXRDb250cm9sKCk7Ci0JCWlmIChjdHJsID09IG51bGwgfHwgY3RybC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJQXJyYXlMaXN0IGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQXJyYXlMaXN0IGNoYW5nZWRSZXNvdXJjZUxpc3QgPSBuZXcgQXJyYXlMaXN0KGNoYW5nZWRSZXNvdXJjZXMpOwotCQkvLyBmaW5kIGFsbCBlZGl0b3Igd2l0aCBkaXJ0eSBjb25mbGljdAotCQkvLwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvciAmJiBlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJQ29sbGVjdGlvbiB1c2VkUmVzb3VyY2VzID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpCi0JCQkJCQkuZ2V0VXNlZFJlc291cmNlcygpOwotCQkJCWNoZWNrX3Jlc291cmNlOiBmb3IgKGludCBqID0gMDsgaiA8IGNoYW5nZWRSZXNvdXJjZUxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGNoYW5nZWRSZXNvdXJjZUxpc3QuZ2V0KGopOwotCQkJCQlpZiAodXNlZFJlc291cmNlcy5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJCWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5hZGQoZWRpdG9yKTsKLQkJCQkJCWJyZWFrIGNoZWNrX3Jlc291cmNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsIEFycmF5TGlzdCBlZGl0b3JMaXN0VG9SZWZyZXNoID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZWRpdG9yc1RvUmVmcmVzaCAhPSBudWxsKSB7Ci0JCQllZGl0b3JMaXN0VG9SZWZyZXNoLmFkZEFsbChlZGl0b3JzVG9SZWZyZXNoKTsKLQkJfQotCQlpZiAoIWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIHJlc3VsdCA9IHNlbGVjdERpcnR5RWRpdG9ycyhkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3QgZWRpdG9yID0gcmVzdWx0W2ldOwotCQkJCWlmICgoZWRpdG9yc05vdFRvUmVmcmVzaCA9PSBudWxsIHx8ICFlZGl0b3JzTm90VG9SZWZyZXNoCi0JCQkJCQkuY29udGFpbnMoZWRpdG9yKSkKLQkJCQkJCSYmIChlZGl0b3JzVG9SZWZyZXNoID09IG51bGwgfHwgIWVkaXRvcnNUb1JlZnJlc2gKLQkJCQkJCQkJLmNvbnRhaW5zKGVkaXRvcikpKSB7Ci0JCQkJCWVkaXRvckxpc3RUb1JlZnJlc2guYWRkKGVkaXRvcik7Ci0JCQkJCWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5yZW1vdmUoZWRpdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyByZW1vdmUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IGRpcnR5IGVkaXRvcnMgd2l0aCBjb25mbGljdCBmcm9tIHRoZQotCQkJLy8gY29sbGVjdGlvbiBvZiBjaGFuZ2VkIHJlc291cmNlcwotCQkJLy8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0Ci0JCQkJCQkuZ2V0KGkpOwotCQkJCUNvbGxlY3Rpb24gdXNlZFJlc291cmNlcyA9IGVkaXRvci5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJY2hhbmdlZFJlc291cmNlTGlzdC5yZW1vdmVBbGwodXNlZFJlc291cmNlcyk7Ci0JCQl9Ci0JCX0KLQotCQlib29sZWFuIHJlZnJlc2hWaWV3cyA9IGZhbHNlOwotCQlpZiAoIWNoYW5nZWRSZXNvdXJjZUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvciAmJiAhZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCQlDb2xsZWN0aW9uIHVzZWRSZXNvdXJjZXMgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikKLQkJCQkJCQkuZ2V0VXNlZFJlc291cmNlcygpOwotCQkJCQljaGVja19yZXNvdXJjZTogZm9yIChpbnQgaiA9IDA7IGogPCBjaGFuZ2VkUmVzb3VyY2VMaXN0Ci0JCQkJCQkJLnNpemUoKTsgaisrKSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgY2hhbmdlZFJlc291cmNlTGlzdAotCQkJCQkJCQkuZ2V0KGopOwotCQkJCQkJaWYgKHVzZWRSZXNvdXJjZXMuY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQkJCQkJZWRpdG9yTGlzdFRvUmVmcmVzaC5hZGQoZWRpdG9yKTsKLQkJCQkJCQlicmVhayBjaGVja19yZXNvdXJjZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gUmVsb2FkIHRoZSBzZWxlY3RlZCBjaGFuZ2VkIHJlc291cmNlcy4KLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJQ29sbGVjdGlvbiByZWxvYWRlZFJlc291cmNlcyA9IG1hbmFnZXIKLQkJCQkJCS5yZWxvYWRSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlTGlzdCk7Ci0KLQkJCQlyZWZyZXNoVmlld3MgPSAhcmVsb2FkZWRSZXNvdXJjZXMuaXNFbXB0eSgpOwotCQkJfQotCQl9Ci0JCWlmIChmb3JjZVJlZnJlc2hWaWV3cyB8fCByZWZyZXNoVmlld3MpIHsKLQkJCXJlZnJlc2hWaWV3cygpOwotCQl9Ci0JCWlmICghZWRpdG9yTGlzdFRvUmVmcmVzaC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yTGlzdFRvUmVmcmVzaC5zaXplKCk7IGkrKykgewotCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvckxpc3RUb1JlZnJlc2gKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJdHJ5IHsKLQkJCQkJZWRpdG9yLnJlZnJlc2goKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjaGFuZ2VkUmVzb3VyY2VMaXN0OwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyBMaWJyYXJ5IGFuZCBDb25maWd1cmF0aW9uIHZpZXdzIGlmIG5lY2Vzc2FyeQotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWZyZXNoVmlld3MoKSB7Ci0JCUVPYmplY3QgaW5wdXQgPSAoRU9iamVjdCkgZ2V0Vmlld2VyKCkuZ2V0SW5wdXQoKTsKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCWlmIChpbnB1dC5lSXNQcm94eSgpKSB7Ci0JCQkJc2V0SW5wdXRGb3JWaWV3ZXIoUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc29sdmUoaW5wdXQpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlnZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCQkJdXBkYXRlTGFzdFJlZnJlc2hUaW1lc3RhbXAoKTsKLQkJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCQlPYmplY3QgbyA9IG51bGw7Ci0JCQkJCWlmIChzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKSA9PSAxCi0JCQkJCQkJJiYgKG8gPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKSBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkJCQkmJiAoKEVPYmplY3QpIG8pLmVJc1Byb3h5KCkpIHsKLQkJCQkJCW8gPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb2x2ZSgoRU9iamVjdCkgbyk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXNldFNlbGVjdGlvblRvVmlld2VyKG8pOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlc3RvcmVTZWxlY3Rpb24oZ2V0Vmlld2VyKCksIHNlbGVjdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlDb25maWd1cmF0aW9uVmlldyBjb25maWdWaWV3ID0gQ29uZmlndXJhdGlvblZpZXcuZ2V0VmlldygpOwotCQlpZiAoY29uZmlnVmlldyAhPSBudWxsKSB7Ci0JCQlDb250cm9sIGN0cmwgPSBjb25maWdWaWV3LmdldFZpZXdlcigpLmdldENvbnRyb2woKTsKLQkJCWlmIChjdHJsICE9IG51bGwgJiYgIWN0cmwuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJaW5wdXQgPSAoRU9iamVjdCkgY29uZmlnVmlldy5nZXRWaWV3ZXIoKS5nZXRJbnB1dCgpOwotCQkJCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQkJCWlmIChpbnB1dC5lSXNQcm94eSgpKSB7Ci0JCQkJCQljb25maWdWaWV3LnNldElucHV0Rm9yVmlld2VyKFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkucmVzb2x2ZShpbnB1dCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBjb25maWdWaWV3LmdldFZpZXdlcigpCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCQkJCQkJcmVzdG9yZVNlbGVjdGlvbihjb25maWdWaWV3LmdldFZpZXdlcigpLCBzZWxlY3Rpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBzZWxlY3REaXJ0eUVkaXRvcnMoTGlzdCBkaXJ0eUVkaXRvcnMpIHsKLQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX0ZpbGVDb25mbGljdF9sYWJlbDsKLQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNlbGVjdEVkaXRvcnNUb0Rpc2NhcmRDb25mbGljdENoYW5nZXM7Ci0JCXJldHVybiBzZWxlY3RFZGl0b3JzKGRpcnR5RWRpdG9ycywgdGl0bGUsIG1zZyk7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBzZWxlY3RFZGl0b3JzKExpc3QgZWRpdG9ycywgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCS8vIHByb21wdCB1c2VyIHRvIGRpc2NhcmQgY2hhbmdlcyBpbiBlZGl0b3JzIHRoYXQgY29uZmxpY3Qgd2l0aCBvdXRzaWRlCi0JCS8vIGNoYW5nZQotCQkvLwotCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlMaXN0IGZDb250ZW50czsKLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlpZiAoZkNvbnRlbnRzICE9IG51bGwgJiYgZkNvbnRlbnRzID09IGlucHV0RWxlbWVudCkKLQkJCQkJcmV0dXJuIGZDb250ZW50cy50b0FycmF5KCk7Ci0JCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsCi0JCQkJCU9iamVjdCBuZXdJbnB1dCkgewotCQkJCWlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCWZDb250ZW50cyA9IChMaXN0KSBuZXdJbnB1dDsKLQkJCQllbHNlCi0JCQkJCWZDb250ZW50cyA9IG51bGw7Ci0KLQkJCX0KLQotCQl9OwotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCQkJcmV0dXJuICgoSUVkaXRvclBhcnQpIGVsZW1lbnQpLmdldFRpdGxlKCk7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0JCQkJCXJldHVybiAoKElFZGl0b3JQYXJ0KSBlbGVtZW50KS5nZXRUaXRsZUltYWdlKCk7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRJbWFnZShlbGVtZW50KTsKLQkJCX0KLQkJfTsKLQkJTGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgTGlzdFNlbGVjdGlvbkRpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSwKLQkJCQllZGl0b3JzLCBjb250ZW50UHJvdmlkZXIsIGxhYmVsUHJvdmlkZXIsIG1zZyk7Ci0JCWRsZy5zZXRUaXRsZSh0aXRsZSk7Ci0JCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGxnLm9wZW4oKTsKLQkJcmV0dXJuIGRsZy5nZXRSZXN1bHQoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlc3RvcmVTZWxlY3Rpb24oVmlld2VyIHZpZXdlciwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlib29sZWFuIHJlc3RvcmUgPSBmYWxzZTsKLQkJCUFycmF5TGlzdCByZXNvbHZlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgb2JqZWN0OwotCQkJCQlpZiAoZU9iai5lSXNQcm94eSgpKSB7Ci0JCQkJCQllT2JqID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc29sdmUoZU9iaik7Ci0JCQkJCQlyZXN0b3JlID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlpZiAoIWVPYmouZUlzUHJveHkoKSkgewotCQkJCQkJcmVzb2x2ZWRMaXN0LmFkZChlT2JqKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChyZXN0b3JlKSB7Ci0JCQkJdmlld2VyCi0JCQkJCQkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHJlc29sdmVkTGlzdCksCi0JCQkJCQkJCXRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVuYW1lIGFuIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgZWxlbWVudCB0byByZW5hbWUKLQkgKiBAcGFyYW0gbmV3TmFtZQotCSAqICAgICAgICAgICAgdGhlIG5ldyBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1blJlbmFtZShmaW5hbCBOYW1lZEVsZW1lbnQgZSwgZmluYWwgU3RyaW5nIG5ld05hbWUpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRvUmVuYW1lKGUsIG5ld05hbWUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGRvUmVuYW1lKGZpbmFsIE5hbWVkRWxlbWVudCBlLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IGUuZ2V0TmFtZSgpOwotCi0JCWlmIChmYWxzZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gb2xkTmFtZTogIiArIG9sZE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBuZXdOYW1lOiAiICsgbmV3TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWUuc2V0TmFtZShuZXdOYW1lKTsKLQotCQkvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBQcm9jZXNzQ29tcG9uZW50IHRvIGtlZXAgaXRzCi0JCS8vIG5hbWUgYW5kIHRoZSBuYW1lIG9mIGl0cyBwcm9jZXNzIGluIHN5bmMuCi0JCWlmIChlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBlKS5nZXRQcm9jZXNzKCk7Ci0JCQlwcm9jLnNldE5hbWUobmV3TmFtZSk7Ci0JCX0KLQotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIFNhdmUgdGhlIG1vZGlmaWVkIGZpbGUocykuCi0JCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkJLmdldEN1cnJlbnRQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5zYXZlKGUuZVJlc291cmNlKCkpOwotCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0KLQkJCQkJQ29sbGVjdGlvbiByZW5hbWVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50Ci0JCQkJCQkJJiYgQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotCQkJCQkJCQkJLmhhc1ByZXNlbnRhdGlvbigoTWV0aG9kRWxlbWVudCkgZSkpIHsKLQkJCQkJCXJlbmFtZWRSZXNvdXJjZXMuYWRkKCgoQ29udGVudEVsZW1lbnQpIGUpCi0JCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKSk7Ci0JCQkJCX0KLQkJCQkJcmVuYW1lZFJlc291cmNlcy5hZGQoZS5lUmVzb3VyY2UoKSk7Ci0KLQkJCQkJcGVyc2lzdGVyLmFkanVzdExvY2F0aW9uKHJlbmFtZWRSZXNvdXJjZXMpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZTEpOwotCi0JCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCi0JCQkJCVN0cmluZyBkZXRhaWxzID0gZTEuZ2V0TWVzc2FnZSgpICE9IG51bGwgPyBNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJLmZvcm1hdCgiOiB7MH0iLCBuZXcgT2JqZWN0W10geyBlMS5nZXRNZXNzYWdlKCkgfSkgOiAiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5FbGVtZW50c1ZpZXdfZXJyX3NhdmluZywKLQkJCQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJCQkJZS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSwKLQkJCQkJCQkJCWRldGFpbHMgfSk7Ci0JCQkJCXRocm93IG5ldyBNZXNzYWdlRXhjZXB0aW9uKG1zZyk7Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0KLQkJaWYgKCFVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld19yZW5hbWluZ190ZXh0KSkgewotCQkJLy8gcmVzdG9yZSBvbGQgbmFtZQotCQkJZS5zZXROYW1lKG9sZE5hbWUpOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblRhcmdldCNzaG93KG9yZy5lY2xpcHNlLnVpLnBhcnQuU2hvd0luQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG93KFNob3dJbkNvbnRleHQgY29udGV4dCkgewotCQlpZiAoY29udGV4dC5nZXRJbnB1dCgpIGluc3RhbmNlb2YgTWFya2VyQWRhcHRlcikgewotCQkJSVZpZXdQYXJ0IHZpZXcgPSBnZXRWaWV3U2l0ZSgpLmdldFBhZ2UoKS5maW5kVmlldygKLQkJCQkJIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb2JsZW1WaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQkJCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IHZpZXcuZ2V0Vmlld1NpdGUoKQotCQkJCQkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvblByb3ZpZGVyCi0JCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCU9iamVjdCBvID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBJTWFya2VyKSB7Ci0JCQkJSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgbzsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIG1hcmtlcgotCQkJCQkJCS5nZXRBdHRyaWJ1dGUoTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIuR1VJRCk7Ci0JCQkJCWlmIChndWlkICE9IG51bGwpIHsKLQkJCQkJCUlSZXNvdXJjZSB3c1JlcyA9IG1hcmtlci5nZXRSZXNvdXJjZSgpOwotCQkJCQkJSUxpYnJhcnlNYW5hZ2VyIGxpYk1nciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7CQkJCQkJCi0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGxpYk1nci5nZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKQotCQkJCQkJCQkuZ2V0UmVzb3VyY2UoCi0JCQkJCQkJCQkJVVJJLmNyZWF0ZUZpbGVVUkkod3NSZXMuZ2V0TG9jYXRpb24oKQotCQkJCQkJCQkJCQkJLnRvU3RyaW5nKCkpLCBmYWxzZSk7Ci0JCQkJCQlPYmplY3QgZWxlbWVudDsKLQkJCQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQllbGVtZW50ID0gcmVzb3VyY2UuZ2V0RU9iamVjdChndWlkKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWVsZW1lbnQgPSBsaWJNZ3IuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCQkJCX0KLQkJCQkJCWlmKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCXNldFNlbGVjdGlvblRvVmlld2VyKGVsZW1lbnQpOwotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY29udGV4dC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIFRyZWVTZWxlY3Rpb24pIHsKLQkJCS8vIGZyb20gc2VhcmNoIHJlc3VsdHMgdmlldwotCQkJVHJlZVNlbGVjdGlvbiBzZWwgPSAoVHJlZVNlbGVjdGlvbiljb250ZXh0LmdldFNlbGVjdGlvbigpOwotCQkJc2V0U2VsZWN0aW9uVG9WaWV3ZXIoc2VsLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL01lc3NhZ2VDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9NZXNzYWdlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhlZGMyMzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL01lc3NhZ2VDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25DbG9zdXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudERlcGVuZGVuY3lFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVycm9ySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5FbGVtZW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlBhY2thZ2VEZXBlbmRlbmN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlBhY2thZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIGEgQ29uZmlndXJhdGlvbiBlcnJvciBvciB3YXJuaW5nIG1lc3NhZ2UuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uQ2xvc3VyZSBjbG9zdXJlOwotCi0JcHVibGljIE1lc3NhZ2VDb250ZW50UHJvdmlkZXIoQ29uZmlndXJhdGlvbkNsb3N1cmUgY2xvc3VyZSkgewotCQl0aGlzLmNsb3N1cmUgPSBjbG9zdXJlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChjbG9zdXJlID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0KLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25DbG9zdXJlKSB7Ci0JCQlyZXR1cm4gKChDb25maWd1cmF0aW9uQ2xvc3VyZSkgaW5wdXRFbGVtZW50KS5nZXREZXBlbmRlbmN5RXJyb3JzKCk7Ci0JCX0gZWxzZSBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudERlcGVuZGVuY3lFcnJvcikgewotCQkJTGlzdCBlcnJvcnMgPSAoKEVsZW1lbnREZXBlbmRlbmN5RXJyb3IpIGlucHV0RWxlbWVudCkuZ2V0QWxsKCk7Ci0JCQlpZiAoZXJyb3JzICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZXJyb3JzLnRvQXJyYXkoKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEVycm9ySW5mbykgewotCQkJRXJyb3JJbmZvIGluZm8gPSAoRXJyb3JJbmZvKSBpbnB1dEVsZW1lbnQ7Ci0JCQlpbnQgcmVsYXRpb24gPSBpbmZvLmdldFJlbGF0aW9uKCk7Ci0JCQlNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpbmZvLmdldE93bmVyRWxlbWVudCgpOwotCQkJTWV0aG9kRWxlbWVudCBjYXVzZUVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgaW5mby5nZXRDYXVzZUVsZW1lbnQoKTsKLQkJCVBhY2thZ2VEZXBlbmRlbmN5IGRlcDsKLQkJCVBhY2thZ2VSZWZlcmVuY2UgcGtnUmVmID0gbnVsbDsKLQotCQkJaWYgKHJlbGF0aW9uID09IEVycm9ySW5mby5SRUZFUkVOQ0VfVE8pIHsKLQkJCQlkZXAgPSBjbG9zdXJlLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0RGVwZW5kZW5jeU1hbmFnZXIoKQotCQkJCQkJLmdldERlcGVuZGVuY3kob3duZXJFbGVtZW50KTsKLQkJCQlwa2dSZWYgPSBkZXAuZ2V0UmVmZXJlbmNlKGNhdXNlRWxlbWVudCwgZmFsc2UpOwotCQkJfSBlbHNlIGlmIChyZWxhdGlvbiA9PSBFcnJvckluZm8uUkVGRVJFTkNFRF9CWSkgewotCQkJCWRlcCA9IGNsb3N1cmUuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXREZXBlbmRlbmN5TWFuYWdlcigpCi0JCQkJCQkuZ2V0RGVwZW5kZW5jeShjYXVzZUVsZW1lbnQpOwotCQkJCXBrZ1JlZiA9IGRlcC5nZXRSZWZlcmVuY2Uob3duZXJFbGVtZW50LCBmYWxzZSk7Ci0JCQl9Ci0KLQkJCWlmIChwa2dSZWYgIT0gbnVsbCkgewotCQkJCUxpc3QgcmVmRXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwa2dSZWYuZ2V0UmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFbGVtZW50UmVmZXJlbmNlIHJlZiA9IChFbGVtZW50UmVmZXJlbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkJLy8gRG9uJ3Qgc2hvdyB0aGUgZW50cnkgaWYgdGhlIHJlZmVyZW5jZSBjYW4gYmUgaWdub3JlZC4KLQkJCQkJaWYgKHJlZi5jYW5JZ25vcmUoKSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJRXJyb3JJbmZvIGVsZW1lbnRFcnJvcjsKLQkJCQkJaWYgKHJlbGF0aW9uID09IEVycm9ySW5mby5SRUZFUkVOQ0VfVE8pIHsKLQkJCQkJCWVsZW1lbnRFcnJvciA9IG5ldyBFcnJvckluZm8oCi0JCQkJCQkJCWluZm8uZ2V0RXJyb3JUeXBlKCksCi0JCQkJCQkJCSIiLCByZWYuZ2V0RWxlbWVudCgpLCByZWYuZ2V0UmVmRWxlbWVudCgpLCByZWxhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVsZW1lbnRFcnJvciA9IG5ldyBFcnJvckluZm8oCi0JCQkJCQkJCWluZm8uZ2V0RXJyb3JUeXBlKCksCi0JCQkJCQkJCSIiLCByZWYuZ2V0UmVmRWxlbWVudCgpLCByZWYuZ2V0RWxlbWVudCgpLCByZWxhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCi0JCQkJCXJlZkVycm9ycy5hZGQoZWxlbWVudEVycm9yKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gcmVmRXJyb3JzLnRvQXJyYXkoKTsKLQkJCX0KLQotCQl9Ci0KLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7fTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudHMocGFyZW50RWxlbWVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29uZmlndXJhdGlvbkNsb3N1cmUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFcnJvckluZm8pIHsKLQkJCXJldHVybiB0aGlzLmNsb3N1cmU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29uZmlndXJhdGlvbkNsb3N1cmUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50RGVwZW5kZW5jeUVycm9yKSB7Ci0JCQlyZXR1cm4gKChFbGVtZW50RGVwZW5kZW5jeUVycm9yKSBlbGVtZW50KS5zaXplKCkgPiAwOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFcnJvckluZm8pIHsKLQkJCWlmICgoKEVycm9ySW5mbykgZWxlbWVudCkuZ2V0RXJyb3JNZXNzYWdlKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL01lc3NhZ2VMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTWVzc2FnZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmZhNjE2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTWVzc2FnZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudERlcGVuZGVuY3lFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVycm9ySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5FbGVtZW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogVGhlIGxhYmVsIHByb3ZpZGVyIGZvciBhIENvbmZpZ3VyYXRpb24gZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgewotCi0JcHVibGljIE1lc3NhZ2VMYWJlbFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWJvb2xlYW4gaXNfZXJyb3IgPSBmYWxzZTsKLQkJYm9vbGVhbiBpc193YXJuaW5nID0gZmFsc2U7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFbGVtZW50RGVwZW5kZW5jeUVycm9yKSB7Ci0JCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gKEVsZW1lbnREZXBlbmRlbmN5RXJyb3IpIG9iamVjdDsKLQkJCWlzX2Vycm9yID0gZXJyb3IuaXNFcnJvcigpIHx8IGVycm9yLmlzQ2hpbGRFcnJvcigpOwotCQkJaXNfd2FybmluZyA9IGVycm9yLmlzV2FybmluZygpIHx8IGVycm9yLmlzQ2hpbGRXYXJuaW5nKCk7Ci0JCX0gZWxzZSBpZiAoKG9iamVjdCBpbnN0YW5jZW9mIEVycm9ySW5mbykpIHsKLQkJCUVycm9ySW5mbyBlcnJvciA9IChFcnJvckluZm8pIG9iamVjdDsKLQkJCVN0cmluZyBtc2cgPSBlcnJvci5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJCWlmIChtc2cgIT0gbnVsbCAmJiBtc2cubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJaXNfZXJyb3IgPSBlcnJvci5pc0Vycm9yKCkgfHwgZXJyb3IuaXNDaGlsZEVycm9yKCk7Ci0JCQkJaXNfd2FybmluZyA9IGVycm9yLmlzV2FybmluZygpIHx8IGVycm9yLmlzQ2hpbGRXYXJuaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaXNfZXJyb3IpIHsKLQkJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKAotCQkJCQlJU2hhcmVkSW1hZ2VzLklNR19PQkpTX1dBUk5fVFNLKTsKLQkJfSBlbHNlIGlmIChpc193YXJuaW5nKSB7Ci0JCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZSgKLQkJCQkJSVNoYXJlZEltYWdlcy5JTUdfT0JKU19XQVJOX1RTSyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2VGcm9tT2JqZWN0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlRnJvbU9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRJbWFnZShvYmplY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN0cmluZyhPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXROYW1lKChNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJfQotCi0JCVN0cmluZyB0ZXh0ID0gZWxlbWVudC50b1N0cmluZygpOwotCQlpbnQgaW5kZXggPSB0ZXh0LmluZGV4T2YoIigiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgaW5kZXgyID0gdGV4dC5sYXN0SW5kZXhPZigiKSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbmRleCA+PSAwICYmIGluZGV4MiA+IDApIHsKLQkJCXJldHVybiB0ZXh0LnN1YnN0cmluZyhpbmRleCwgaW5kZXgyICsgMSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdGV4dDsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE5hbWUoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiAoZSA9PSBudWxsKSA/ICIiIDogZS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVN0cmluZyB0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRWxlbWVudERlcGVuZGVuY3lFcnJvcikgewotCQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IChFbGVtZW50RGVwZW5kZW5jeUVycm9yKSBvYmplY3Q7Ci0JCQlPYmplY3QgZSA9IGVycm9yLmdldEVycm9yRWxlbWVudCgpOwotCQkJT2JqZWN0W10gcmVmcyA9IGVycm9yLmdldENhdXNlRWxlbWVudHMoKTsKLQkJCWlmIChjb2x1bW5JbmRleCA9PSBNZXNzYWdlVmlldy5FUlJPUl9FTEVNRU5UX0NPTFVNTikgewotCQkJCXRleHQgPSBnZXRTdHJpbmcoZSk7Ci0KLQkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gTWVzc2FnZVZpZXcuQ0FVU0VfRUxFTUVOVF9DT0xVTU4pIHsKLQkJCQlpZiAocmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChpID4gMCkKLQkJCQkJCQliLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYi5hcHBlbmQoZ2V0U3RyaW5nKHJlZnNbaV0pKTsKLQkJCQkJfQotCQkJCQl0ZXh0ID0gYi50b1N0cmluZygpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGVycm9yLmlzRXJyb3IoKSB8fCBlcnJvci5pc1dhcm5pbmcoKSkgewotCQkJCQl0ZXh0ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5NZXNzYWdlTGFiZWxQcm92aWRlcl91bnNlbGVjdGVkcGFja2FnZXMsIChuZXcgU3RyaW5nW10geyBnZXRTdHJpbmcoZSkgfSkpOwotCQkJCX0gZWxzZSBpZiAoZXJyb3IuaXNDaGlsZEVycm9yKCkgfHwgZXJyb3IuaXNDaGlsZFdhcm5pbmcoKSkgewotCQkJCQl0ZXh0ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWVzc2FnZUxhYmVsUHJvdmlkZXJfZXJyY2hpbGRwa2dzOyAKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRXJyb3JJbmZvKSB7Ci0JCQlFcnJvckluZm8gZXJyb3IgPSAoRXJyb3JJbmZvKSBvYmplY3Q7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gTWVzc2FnZVZpZXcuRVJST1JfRUxFTUVOVF9DT0xVTU4pIHsKLQkJCQllbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGVycm9yLmdldE93bmVyRWxlbWVudCgpOwotCi0JCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IE1lc3NhZ2VWaWV3LkNBVVNFX0VMRU1FTlRfQ09MVU1OKSB7Ci0JCQkJZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBlcnJvci5nZXRDYXVzZUVsZW1lbnQoKTsKLQkJCX0KLQotCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCXRleHQgPSBnZXROYW1lKGVsZW1lbnQpOwotCQkJCWlmIChjb2x1bW5JbmRleCAhPSBNZXNzYWdlVmlldy5FUlJPUl9NRVNTQUdFX0NPTFVNTgotCQkJCQkJJiYgIUxpYnJhcnlVdGlsLnNlbGVjdGFibGUoZWxlbWVudCkpIHsKLQkJCQkJdGV4dCA9ICIgICAgICAiICsgdGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdGV4dCA9IGVycm9yLmdldEVycm9yTWVzc2FnZSgpOwotCQkJfQotCQl9Ci0KLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRWxlbWVudFJlZmVyZW5jZSkgewotCQkJRWxlbWVudFJlZmVyZW5jZSByZWYgPSAoRWxlbWVudFJlZmVyZW5jZSkgb2JqZWN0OwotCQkJaWYgKGNvbHVtbkluZGV4ID09IE1lc3NhZ2VWaWV3LkVSUk9SX0VMRU1FTlRfQ09MVU1OKSB7Ci0JCQkJZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSByZWYuZ2V0RWxlbWVudCgpOwotCQkJCXRleHQgPSAiICAgICAgIiArIGdldE5hbWUoZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gTWVzc2FnZVZpZXcuQ0FVU0VfRUxFTUVOVF9DT0xVTU4pIHsKLQkJCQllbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIHJlZi5nZXRSZWZFbGVtZW50KCk7Ci0JCQkJdGV4dCA9ICIgICAgICAiICsgZ2V0TmFtZShlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX0KLQotCQlpZiAodGV4dCA9PSBudWxsKSB7Ci0JCQl0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW5UZXh0KG9iamVjdCwgMCk7Ci0JfQotCi0JLyoqCi0JICogU2luY2Ugd2Ugd29uJ3QgZXZlciBnZW5lcmF0ZSB0aGVzZSBub3RpZmljYXRpb25zLCB3ZSBjYW4ganVzdCBpZ25vcmUKLQkgKiB0aGlzLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQl9Ci0KLQkvKioKLQkgKiBTaW5jZSB3ZSB3b24ndCBldmVyIGFkZCBsaXN0ZW5lcnMsIHdlIGNhbiBqdXN0IGlnbm9yZSB0aGlzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9NZXNzYWdlVmlldy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL01lc3NhZ2VWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE4MzEyMTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL01lc3NhZ2VWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db25maWd1cmF0aW9uRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50RGVwZW5kZW5jeUVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLQotCi0vKioKLSAqIFRoZSBNZXNzYWdlIHZpZXcuCi0gKiA8cD4KLSAqIERpc3BsYXlzIHRoZSBNZXRob2QgTGlicmFyeSBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZVZpZXcgZXh0ZW5kcyBWaWV3UGFydCBpbXBsZW1lbnRzIElTZWxlY3Rpb25Qcm92aWRlciwKLQkJSVBhcnRMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUaGUgdmlldyBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX0lEID0gTWVzc2FnZVZpZXcuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfTUVTU0FHRV9DT0xVTU4gPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfRUxFTUVOVF9DT0xVTU4gPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FVU0VfRUxFTUVOVF9DT0xVTU4gPSAyOwotCi0JcHJvdGVjdGVkIE1lc3NhZ2VWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkNsb3N1cmUgY2xvc3VyZSA9IG51bGw7Ci0KLQlwdWJsaWMgTWVzc2FnZVZpZXcoKSB7Ci0JfQotCi0JLyoqCi0JICogdXBkYXRlcyBWaWV3IHdoZW4gY29uZmlndXJhdGlvbkZhY3RvcnkgY2hhbmdlcwotCSAqIEBwYXJhbSBjbG9zdXJlCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJhdGlvbkZhY3RvcnlDaGFuZ2VkKENvbmZpZ3VyYXRpb25DbG9zdXJlIGNsb3N1cmUpIHsKLQkJdGhpcy5jbG9zdXJlID0gY2xvc3VyZTsKLQotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJaWYgKGNsb3N1cmUgIT0gbnVsbCkgewotCQkJYWRhcHRlckZhY3RvcnkgPSAoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgY2xvc3VyZQotCQkJCQkuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTWVzc2FnZUxhYmVsUHJvdmlkZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5KSk7Ci0JCX0KLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBNZXNzYWdlQ29udGVudFByb3ZpZGVyKGNsb3N1cmUpKTsKLQotCQl1cGRhdGVNZXNzYWdlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI3JlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNnZXRTZWxlY3Rpb24oKQotCSAqLwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGN1cnJlbnRTZWxlY3Rpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNzZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQljdXJyZW50U2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCi0JCWZvciAoSXRlcmF0b3IgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdChzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzKQotCQkJCS5pdGVyYXRvcigpOyBsaXN0ZW5lcnMuaGFzTmV4dCgpOykgewotCQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBsaXN0ZW5lcnMKLQkJCQkJLm5leHQoKTsKLQkJCWxpc3RlbmVyCi0JCQkJCS5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgc2VsZWN0aW9uKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJdGFibGVWaWV3ZXIgPSBuZXcgTWVzc2FnZVZpZXdlcihjb21wb3NpdGUpOwotCi0JCUlWaWV3U2l0ZSBzaXRlID0gKElWaWV3U2l0ZSkgdGhpcy5nZXRTaXRlKCk7Ci0JCXNpdGUuc2V0U2VsZWN0aW9uUHJvdmlkZXIodGhpcyk7Ci0KLQkJaWYgKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQkvLyBDcmVhdGUgdGhlIGxpc3RlbmVyCi0JCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkvLyBUaGlzIGp1c3Qgbm90aWZpZXMgdGhvc2UgdGhpbmdzIHRoYXQgYXJlIGFmZmVjdGVkIGJ5IHRoZQotCQkJCS8vIHNlY3Rpb24uCi0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLS8vCQkJCQlTeXN0ZW0ub3V0Ci0vLwkJCQkJCQkucHJpbnRsbihBdXRob3JpbmdVSVJlc291cmNlcy5NZXNzYWdlVmlld19zZWxlY3RlZF90ZXh0ICsgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCXNldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfTsKLQotCQkJdGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyBTZXQgY29sdW1uIGluZm8uCi0JCXNldENvbHVtbnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q29sdW1ucygpIHsKLQkJVHJlZSB0YWJsZSA9IHRhYmxlVmlld2VyLmdldFRyZWUoKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0JCVRyZWVDb2x1bW4gY29sdW1uOwotCi0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgRVJST1JfTUVTU0FHRV9DT0xVTU4pOwotCQljb2x1bW4uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5NZXNzYWdlVmlld19lcnJtc2dfdGV4dCk7IAotCQljb2x1bW4uc2V0V2lkdGgoNDUwKTsKLQotCQljb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0YWJsZSwgU1dULk5PTkUsIEVSUk9SX0VMRU1FTlRfQ09MVU1OKTsKLQkJY29sdW1uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWVzc2FnZVZpZXdfZXJyZWxlbWVudF90ZXh0KTsgCi0JCWNvbHVtbi5zZXRXaWR0aCgyMDApOwotCi0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgQ0FVU0VfRUxFTUVOVF9DT0xVTU4pOwotCQljb2x1bW4uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5NZXNzYWdlVmlld19yZWZlbGVtZW50X3RleHQpOyAKLQkJY29sdW1uLnNldFdpZHRoKDIwMCk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQljcmVhdGVWaWV3ZXIocGFyZW50KTsKLQotCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKTsKLQkJd29ya2JlbmNoV2luZG93LmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBNZXNzYWdlVmlldyBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1lc3NhZ2VWaWV3IGdldFZpZXcoKSB7Ci0JCXRyeSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJCUlWaWV3UGFydCB2aWV3ID0gYWN0aXZlUGFnZS5maW5kVmlldyhWSUVXX0lEKTsKLQkJCQlpZiAodmlldyA9PSBudWxsKSB7Ci0JCQkJCXZpZXcgPSBhY3RpdmVQYWdlLnNob3dWaWV3KFZJRVdfSUQpOwotCQkJCX0KLQkJCQlyZXR1cm4gKE1lc3NhZ2VWaWV3KSB2aWV3OwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB1cGRhdGUgTWVzc2FnZSBWaWV3IGFjY29yZGluZyB0byB0aGUgY29uZmlndXJhdGlvbiBjbG9zdXJlIHN0YXRlCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVNZXNzYWdlKCkgewotCQlpZiAoY2xvc3VyZSAhPSBudWxsKSB7Ci0JCQl0YWJsZVZpZXdlci5zZXRJbnB1dChjbG9zdXJlKTsKLQkJfSBlbHNlIHsKLQkJCXRhYmxlVmlld2VyLnNldElucHV0KG5ldyBPYmplY3QoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGlmIHZpZXdlciBoYXMgaW5wdXQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc3Bvc2VkKCkgewotCQlyZXR1cm4gKGNsb3N1cmUgPT0gbnVsbCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpOwotCQl3b3JrYmVuY2hXaW5kb3cuZ2V0UGFydFNlcnZpY2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIodGhpcyk7Ci0KLQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5jbGVhcigpOwotCQljbG9zdXJlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTaG93IHRoZSBlcnJvciBmb3IgdGhlIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2hvd0Vycm9yKE9iamVjdCBlKSB7Ci0JCUVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZXJyb3IgPSBjbG9zdXJlLmdldEVycm9yKGUpOwotCQlpZiAoZXJyb3IgIT0gbnVsbCkgewotCQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKGVycm9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBWaWV3ZXIgY2xhc3MgdW5kZXJseWluZyB0aGlzIHZpZXcgCi0JICoKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTWVzc2FnZVZpZXdlciBleHRlbmRzIFRyZWVWaWV3ZXIgewotCi0JCXB1YmxpYyBNZXNzYWdlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXRoaXMocGFyZW50LCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQl9Ci0KLQkJcHVibGljIE1lc3NhZ2VWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQotCQkJVHJlZSB0cmVlID0gZ2V0VHJlZSgpOwotCQkJdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQkJdHJlZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihPYmplY3QgZWxlbWVudCkgewotCQkJc3VwZXIuZXhwYW5kVG9MZXZlbChlbGVtZW50LCAxKTsKLQkJCVdpZGdldCBjdHJsID0gc3VwZXIuZmluZEl0ZW0oZWxlbWVudCk7Ci0JCQlpZiAoY3RybCAhPSBudWxsKSB7Ci0JCQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpdGVtcy5hZGQoY3RybCk7Ci0JCQkJc3VwZXIuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lciNwYXJ0QWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlpZiAocGFydCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25FZGl0b3IpIHsKLQkJCUNvbmZpZ3VyYXRpb25DbG9zdXJlIGMgPSAoKENvbmZpZ3VyYXRpb25FZGl0b3IpIHBhcnQpLmdldENsb3N1cmUoKTsKLQkJCWlmIChjICE9IGNsb3N1cmUpIHsKLQkJCQljb25maWd1cmF0aW9uRmFjdG9yeUNoYW5nZWQoYyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXIjcGFydEJyb3VnaHRUb1RvcChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXIjcGFydENsb3NlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uRWRpdG9yKSB7Ci0JCQlDb25maWd1cmF0aW9uQ2xvc3VyZSBjID0gKChDb25maWd1cmF0aW9uRWRpdG9yKSBwYXJ0KS5nZXRDbG9zdXJlKCk7Ci0JCQlpZiAoYyA9PSBjbG9zdXJlKSB7Ci0JCQkJY29uZmlndXJhdGlvbkZhY3RvcnlDaGFuZ2VkKG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyI3BhcnREZWFjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lciNwYXJ0T3BlbmVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1Byb2Nlc3NUcmVlVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvUHJvY2Vzc1RyZWVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjEwYmMwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvUHJvY2Vzc1RyZWVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbHVtbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5BY3Rpdml0eURyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuSUFjdGlvblR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklPcGVuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLk9wZW5TdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlVmlld2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlRXhwYW5zaW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyZWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyZWVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotCi0vKioKLSAqIERpc3BsYXlzIHRoZSBQcm9jZXNzIGVsZW1lbnRzIGluIGEgdHJlZSB0YWJsZSB2aWV3ZXIuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1RyZWVWaWV3ZXIgZXh0ZW5kcyBUcmVlVmlld2VyIGltcGxlbWVudHMKLQkJSUFjdGlvblR5cGVQcm92aWRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPUFlfVFhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29weV90ZXh0OyAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5EX1RYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4dGVuZF90ZXh0OyAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVFUF9DT1BZX1RYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlZXBDb3B5X3RleHQ7IAotCi0JcHJpdmF0ZSBpbnQgYWN0aW9uVHlwZSA9IElBY3Rpb25UeXBlUHJvdmlkZXIuQ09QWTsKLQotCXByaXZhdGUgTWVudSBhY3Rpb25UeXBlUG9wdXA7Ci0KLQlwcml2YXRlIFBvaW50IGFjdGlvblR5cGVQb3B1cExvY2F0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1RyZWVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCi0JCVRyZWUgdHJlZSA9IGdldFRyZWUoKTsKLQkJdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0cmVlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotCQlhZGRUcmVlTGlzdGVuZXIobmV3IElUcmVlVmlld2VyTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDb2xsYXBzZWQoVHJlZUV4cGFuc2lvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0SXRlbVByb3ZpZGVyRXhwYW5kZWQoZXZlbnQuZ2V0RWxlbWVudCgpLCBmYWxzZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHRyZWVFeHBhbmRlZChUcmVlRXhwYW5zaW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRJdGVtUHJvdmlkZXJFeHBhbmRlZChldmVudC5nZXRFbGVtZW50KCksIHRydWUpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCS8qKgotCSAqIFNldCB1cCBjb2x1bm1zIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gYXJyYXkgb2YgZGVzY3JpcHRvcnMKLQkgKiBAcGFyYW0gY29sdW1uRGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXR1cENvbHVtbnMoQ29sdW1uRGVzY3JpcHRvcltdIGNvbHVtbkRlc2NyaXB0b3JzKSB7Ci0JCS8vIFJlbW92ZSBhbGwgb2xkIFRyZWVDb2x1bW5zLgotCQlUcmVlQ29sdW1uW10gY29scyA9IGdldFRyZWUoKS5nZXRDb2x1bW5zKCk7Ci0JCWludCBzaXplID0gY29scy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQljb2xzW2ldLmRpc3Bvc2UoKTsKLQkJfQotCi0JCVN0cmluZ1tdIGNvbFByb3BzID0gbmV3IFN0cmluZ1tjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb2xQcm9wc1tpXSA9IGNvbHVtbkRlc2NyaXB0b3JzW2ldLmlkOwotCQkJVHJlZUNvbHVtbiBjb2x1bW4gPSBuZXcgVHJlZUNvbHVtbihnZXRUcmVlKCksCi0JCQkJCWNvbHVtbkRlc2NyaXB0b3JzW2ldLmFsaWdubWVudCk7Ci0JCQljb2x1bW4uc2V0VGV4dChjb2x1bW5EZXNjcmlwdG9yc1tpXS5sYWJlbCk7Ci0JCQljb2x1bW4uc2V0UmVzaXphYmxlKGNvbHVtbkRlc2NyaXB0b3JzW2ldLnJlc2l6YWJsZSk7Ci0JCQljb2x1bW4uc2V0V2lkdGgoY29sdW1uRGVzY3JpcHRvcnNbaV0ud2lkdGgpOwotCQl9Ci0KLQkJc2V0Q29sdW1uUHJvcGVydGllcyhjb2xQcm9wcyk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0SXRlbVByb3ZpZGVyRXhwYW5kZWQoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gZXhwYW5kKSB7Ci0JCU9iamVjdCBhZGFwdGVyID0gZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdChlbGVtZW50LAotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcikuc2V0RXhwYW5kZWQoQm9vbGVhbi52YWx1ZU9mKGV4cGFuZCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgQWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBnZXRDb250ZW50UHJvdmlkZXIoKSA9PSBudWxsID8gbnVsbAotCQkJCTogKChBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcikgZ2V0Q29udGVudFByb3ZpZGVyKCkpCi0JCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVUcmVlVmlld2VyI3NldEV4cGFuZGVkKEl0ZW0sIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXhwYW5kZWQoSXRlbSBub2RlLCBib29sZWFuIGV4cGFuZCkgewotCQlzdXBlci5zZXRFeHBhbmRlZChub2RlLCBleHBhbmQpOwotCQlPYmplY3QgYWRhcHRlciA9IGdldEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQobm9kZS5nZXREYXRhKCksCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCUlCU0l0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9ICgoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyKTsKLQkJCWlmIChic0l0ZW1Qcm92aWRlci5pc0V4cGFuZGVkKCkgPT0gbnVsbCkgewotCQkJCWJzSXRlbVByb3ZpZGVyLnNldEV4cGFuZGVkKChCb29sZWFuLnZhbHVlT2YoZXhwYW5kKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlciNjcmVhdGVUcmVlSXRlbShXaWRnZXQsCi0JICogICAgICBPYmplY3QsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUcmVlSXRlbShXaWRnZXQgcGFyZW50LCBPYmplY3QgZWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCXN1cGVyLmNyZWF0ZVRyZWVJdGVtKHBhcmVudCwgZWxlbWVudCwgaW5kZXgpOwotCQlPYmplY3QgYWRhcHRlciA9IGdldEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoZWxlbWVudCwKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJQm9vbGVhbiBleHBhbmQgPSAoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcikuaXNFeHBhbmRlZCgpOwotCQkJaWYgKGV4cGFuZCAhPSBudWxsKSB7Ci0JCQkJc2V0RXhwYW5kZWRTdGF0ZShlbGVtZW50LCBleHBhbmQuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVHJlZVZpZXdlciNkb1VwZGF0ZUl0ZW0oSXRlbSwgT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVXBkYXRlSXRlbShJdGVtIGl0ZW0sIE9iamVjdCBlbGVtZW50KSB7Ci0JCXN1cGVyLmRvVXBkYXRlSXRlbShpdGVtLCBlbGVtZW50KTsKLQkJc2V0RXhwYW5kZWQoaXRlbSwgZWxlbWVudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEV4cGFuZGVkKEl0ZW0gaXRlbSwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBnZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGVsZW1lbnQsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYoYWRhcHRlci5oYXNDaGlsZHJlbihlbGVtZW50KSkgewotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQlCb29sZWFuIGV4cGFuZCA9ICgoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5pc0V4cGFuZGVkKCk7Ci0JCQkJaWYgKGV4cGFuZCAhPSBudWxsKSB7Ci0JCQkJCXNldEV4cGFuZGVkU3RhdGUoaXRlbSwgZXhwYW5kLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyI2ludGVybmFsUmVmcmVzaChXaWRnZXQsCi0JICogICAgICBPYmplY3QsIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxSZWZyZXNoKFdpZGdldCB3aWRnZXQsIE9iamVjdCBlbGVtZW50LAotCQkJYm9vbGVhbiBkb1N0cnVjdCwgYm9vbGVhbiB1cGRhdGVMYWJlbHMpIHsKLQkJc3VwZXIuaW50ZXJuYWxSZWZyZXNoKHdpZGdldCwgZWxlbWVudCwgZG9TdHJ1Y3QsIHVwZGF0ZUxhYmVscyk7Ci0KLQkJaWYgKGRvU3RydWN0KSB7Ci0JCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgSXRlbSkgewotCQkJCXNldEV4cGFuZGVkKChJdGVtKSB3aWRnZXQsIGVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQlJdGVtW10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbih3aWRnZXQpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJSXRlbSBjaGlsZCA9IGNoaWxkcmVuW2ldOwotCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJdGVtKSB7Ci0JCQkJCQlJdGVtIGl0ZW0gPSAoSXRlbSkgY2hpbGQ7Ci0JCQkJCQlzZXRFeHBhbmRlZChpdGVtLCBpdGVtLmdldERhdGEoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgY29tbWFuZDsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWFuYWdlcjsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5JQWN0aW9uVHlwZVByb3ZpZGVyI2dldEFjdGlvblR5cGUoKQotCSAqLwotLy8JcHVibGljIGludCBnZXRBY3Rpb25UeXBlKCkgewotLy8JCWlmIChhY3Rpb25UeXBlUG9wdXAgPT0gbnVsbCkgewotLy8JCQljcmVhdGVBY3Rpb25UeXBlUG9wdXAoKTsKLS8vCQl9Ci0vLwotLy8JCURpc3BsYXkuZ2V0Q3VycmVudCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLS8vCi0vLwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLS8vCQkJCWFjdGlvblR5cGUgPSAwOwotLy8JCQkJYWN0aW9uVHlwZVBvcHVwLnNldExvY2F0aW9uKGFjdGlvblR5cGVQb3B1cExvY2F0aW9uKTsKLS8vCQkJCWFjdGlvblR5cGVQb3B1cC5zZXRWaXNpYmxlKHRydWUpOwotLy8JCQl9Ci0vLwotLy8JCX0pOwotLy8KLS8vCQlyZXR1cm4gYWN0aW9uVHlwZTsKLS8vCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVBY3Rpb25UeXBlUG9wdXAoYm9vbGVhbiBjYW5FeHRlbmQpIHsKLQkJYWN0aW9uVHlwZVBvcHVwID0gbmV3IE1lbnUoZ2V0Q29udHJvbCgpKTsKLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCU1lbnVJdGVtIGl0ZW0gPSAoKE1lbnVJdGVtKSBlLmdldFNvdXJjZSgpKTsKLQkJCQlTdHJpbmcgdGV4dCA9IGl0ZW0uZ2V0VGV4dCgpOwotCQkJCWlmICh0ZXh0ID09IENPUFlfVFhUKSB7Ci0JCQkJCVByb2Nlc3NUcmVlVmlld2VyLnRoaXMuYWN0aW9uVHlwZSA9IElBY3Rpb25UeXBlUHJvdmlkZXIuQ09QWTsKLQkJCQl9IGVsc2UgaWYgKHRleHQgPT0gRVhURU5EX1RYVCkgewotCQkJCQlQcm9jZXNzVHJlZVZpZXdlci50aGlzLmFjdGlvblR5cGUgPSBJQWN0aW9uVHlwZVByb3ZpZGVyLkVYVEVORDsKLQkJCQl9IGVsc2UgaWYgKHRleHQgPT0gREVFUF9DT1BZX1RYVCkgewotCQkJCQlQcm9jZXNzVHJlZVZpZXdlci50aGlzLmFjdGlvblR5cGUgPSBERUVQX0NPUFk7Ci0JCQkJfQotCi0JCQkJaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBBY3Rpdml0eURyb3BDb21tYW5kKSB7Ci0JCQkJCUFjdGl2aXR5RHJvcENvbW1hbmQgY21kID0gKChBY3Rpdml0eURyb3BDb21tYW5kKSBjb21tYW5kKTsKLQkJCQkJY21kLnNldFR5cGUoUHJvY2Vzc1RyZWVWaWV3ZXIudGhpcy5hY3Rpb25UeXBlKTsKLQkJCQkJY21kLnNldExhYmVsKHRleHQpOwotCQkJCX0KLQotCQkJCWlmIChhY3Rpb25NYW5hZ2VyICE9IG51bGwKLQkJCQkJCSYmIGNvbW1hbmQgaW5zdGFuY2VvZiBJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIHsKLQkJCQkJYWN0aW9uTWFuYWdlci5leGVjdXRlKChJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIGNvbW1hbmQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQkJCX0KLQotCQkJCWFjdGlvblR5cGVQb3B1cC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCX0KLQotCQl9OwotCQlNZW51SXRlbSBtZW51SXRlbTsKLQkJaWYgKGNhbkV4dGVuZCkJewotCQkJbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0oYWN0aW9uVHlwZVBvcHVwLCBTV1QuQ0FTQ0FERSk7Ci0JCQltZW51SXRlbS5zZXRUZXh0KENPUFlfVFhUKTsKLQkJCW1lbnVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJCW1lbnVJdGVtID0gbmV3IE1lbnVJdGVtKGFjdGlvblR5cGVQb3B1cCwgU1dULkNBU0NBREUpOwotCQkJbWVudUl0ZW0uc2V0VGV4dChFWFRFTkRfVFhUKTsKLQkJCW1lbnVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCQltZW51SXRlbSA9IG5ldyBNZW51SXRlbShhY3Rpb25UeXBlUG9wdXAsIFNXVC5DQVNDQURFKTsKLQkJbWVudUl0ZW0uc2V0VGV4dChERUVQX0NPUFlfVFhUKTsKLQkJbWVudUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5JQWN0aW9uVHlwZVByb3ZpZGVyI3NldElucHV0RGF0YShPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5wdXREYXRhKE9iamVjdCBvYmplY3QpIHsKLQkJYWN0aW9uVHlwZVBvcHVwTG9jYXRpb24gPSAoUG9pbnQpIG9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuSUFjdGlvblR5cGVQcm92aWRlciNleGVjdXRlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjbWQsIGJvb2xlYW4gY2FuRXh0ZW5kKSB7Ci0vLwkJaWYgKGFjdGlvblR5cGVQb3B1cCA9PSBudWxsKSB7Ci0JCQljcmVhdGVBY3Rpb25UeXBlUG9wdXAoY2FuRXh0ZW5kKTsKLS8vCQl9Ci0KLQkJdGhpcy5jb21tYW5kID0gY21kOwotCQlhY3Rpb25UeXBlUG9wdXAuc2V0TG9jYXRpb24oYWN0aW9uVHlwZVBvcHVwTG9jYXRpb24pOwotCQlhY3Rpb25UeXBlUG9wdXAuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlciNob29rQ29udHJvbChDb250cm9sKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhvb2tDb250cm9sKENvbnRyb2wgY29udHJvbCkgewotCQkvLyBGcm9tIENvbnRlbnRWaWV3ZXIuCi0JCWNvbnRyb2wuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQloYW5kbGVEaXNwb3NlKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gRnJvbSBTdHJ1Y3R1cmVkVmlld2VyLgotCQlPcGVuU3RyYXRlZ3kgaGFuZGxlciA9IG5ldyBPcGVuU3RyYXRlZ3koY29udHJvbCk7Ci0JCWhhbmRsZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVNlbGVjdChlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVEb3VibGVTZWxlY3QoZSk7Ci0JCQl9Ci0JCX0pOwotCQloYW5kbGVyLmFkZFBvc3RTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVQb3N0U2VsZWN0KGUpOwotCQkJfQotCQl9KTsKLQkJaGFuZGxlci5hZGRPcGVuTGlzdGVuZXIobmV3IElPcGVuRXZlbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZU9wZW4oU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVByb2Nlc3NUcmVlVmlld2VyLnRoaXMuaGFuZGxlT3BlbihlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gRnJvbSBBYnN0cmFjdFRyZWVWaWV3ZXIuCi0JCWFkZFRyZWVMaXN0ZW5lcihjb250cm9sLCBuZXcgVHJlZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdHJlZUV4cGFuZGVkKFRyZWVFdmVudCBldmVudCkgewotCQkJCWhhbmRsZVRyZWVFeHBhbmQoZXZlbnQpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB0cmVlQ29sbGFwc2VkKFRyZWVFdmVudCBldmVudCkgewotCQkJCWhhbmRsZVRyZWVDb2xsYXBzZShldmVudCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWdldFRyZWUoKS5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3VibGVDbGljaywgbmV3IExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCVRyZWVJdGVtW10gdHJlZUl0ZW1zID0gZ2V0VHJlZSgpLmdldFNlbGVjdGlvbigpOwotCi0JCQkJLy8gRG9uJ3QgZWRpdCBpZiBtb3JlIHRoYW4gb25lIGl0ZW1zIGFyZSBzZWxlY3RlZC4KLQkJCQlpZiAodHJlZUl0ZW1zID09IG51bGwgfHwgdHJlZUl0ZW1zLmxlbmd0aCAhPSAxKQotCQkJCQlyZXR1cm47Ci0KLQkJCQkvLyBGaW5kIHRoZSBlZGl0IGNvbHVtbi4KLQkJCQlUcmVlSXRlbSB0cmVlSXRlbSA9IHRyZWVJdGVtc1swXTsKLQkJCQlpZiAodHJlZUl0ZW0gPT0gbnVsbCB8fCB0cmVlSXRlbS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJLy8gSXRlbSBubyBsb25nZXIgZXhpc3RzLgotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWludCBjb2x1bW5Ub0VkaXQ7Ci0JCQkJaW50IGNvbHVtbnMgPSBnZXRUcmVlKCkuZ2V0Q29sdW1uQ291bnQoKTsKLQkJCQlpZiAoY29sdW1ucyA9PSAwKSB7Ci0JCQkJCS8vIElmIG5vIFRhYmxlQ29sdW1uLCBUYWJsZSBhY3RzIGFzIGlmIGl0IGhhcyBhIHNpbmdsZQotCQkJCQkvLyBjb2x1bW4gd2hpY2ggdGFrZXMgdGhlIHdob2xlIHdpZHRoLgotCQkJCQljb2x1bW5Ub0VkaXQgPSAwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvbHVtblRvRWRpdCA9IC0xOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnM7IGkrKykgewotCQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcyhpKTsKLQkJCQkJCWlmIChib3VuZHMuY29udGFpbnMoZXZlbnQueCwgZXZlbnQueSkpIHsKLQkJCQkJCQljb2x1bW5Ub0VkaXQgPSBpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChjb2x1bW5Ub0VkaXQgPT0gLTEpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWVkaXRFbGVtZW50KHRyZWVJdGVtLmdldERhdGEoKSwgY29sdW1uVG9FZGl0KTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuSUFjdGlvblR5cGVQcm92aWRlciNzZXRBY3Rpb25NYW5hZ2VyKElBY3Rpb25NYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGlvbk1hbmFnZXIoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCWFjdGlvbk1hbmFnZXIgPSBhY3Rpb25NZ3I7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1Byb2Nlc3NWaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Qcm9jZXNzVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiNzA1ZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1Byb2Nlc3NWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycy5BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgUHJvY2VzcyBlbGVtZW50cyBpbiBhIHRyZWUgdGFibGUgdmlld2VyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NWaWV3ZXIgZXh0ZW5kcyBQcm9jZXNzVHJlZVZpZXdlciB7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXM7Ci0KLQlwcml2YXRlIEFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yW10gY2hlY2tCb3hDZWxsRWRpdG9ycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gcGFyZW50IC0gdW5kZXJseWluZyB0cmVlCi0JICogCi0JICogQHJldHVybiBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIGdldENlbGxFZGl0b3JQYXJlbnQoKSB7Ci0JCXJldHVybiBnZXRUcmVlKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGNoZWNrIGJveCBjZWxsIGVkaXRvcnMKLQkgKiAKLQkgKiBAcGFyYW0gY2hlY2tCb3hDZWxsRWRpdG9ycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoZWNrQm94Q2VsbEVkaXRvcnMoCi0JCQlBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvcltdIGNoZWNrQm94Q2VsbEVkaXRvcnMpIHsKLQkJdGhpcy5jaGVja0JveENlbGxFZGl0b3JzID0gY2hlY2tCb3hDZWxsRWRpdG9yczsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja0JveENlbGxFZGl0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciBlZGl0b3IgPSBjaGVja0JveENlbGxFZGl0b3JzW2ldOwotCQkJaWYgKGVkaXRvciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJZWRpdG9yLnNldENvbHVtbkluZGV4KGkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlByb2Nlc3NUcmVlVmlld2VyI2hvb2tDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaG9va0NvbnRyb2woQ29udHJvbCBjb250cm9sKSB7Ci0JCXN1cGVyLmhvb2tDb250cm9sKGNvbnRyb2wpOwotCQlnZXRUcmVlKCkuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCW1vZGlmeUl0ZW0oZSk7Ci0JCQl9Ci0JCX0pOwotCQkvLyBnZXRUcmVlKCkuYWRkTW91c2VNb3ZlTGlzdGVuZXIobmV3IE1vdXNlTW92ZUxpc3RlbmVyKCl7Ci0JCS8vIHB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpewotCQkvLyBzZXRVbnNldEVkaXRvcihlKTsKLQkJLy8gfQotCQkvLyB9KTsKLQkJTGlzdGVuZXIgcGFpbnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuUGFpbnRJdGVtOiB7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZXZlbnQuaW5kZXggPSAiKyBldmVudC5pbmRleCk7Ci0JCQkJCUltYWdlIGltYWdlID0gZ2V0Q2hlY2tCb3hDZWxsRWRpdG9ySW1hZ2UoZXZlbnQpOwotCQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQkJCQkJVHJlZUNvbHVtbiBjb2wgPSBnZXRUcmVlKCkuZ2V0Q29sdW1uKGV2ZW50LmluZGV4KTsKLQkJCQkJaW50IHggPSBldmVudC54ICsgY29sLmdldFdpZHRoKCkgLyAyOwotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQkJCQlpbnQgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgKGV2ZW50LmhlaWdodCAtIHJlY3QuaGVpZ2h0KSAvIDIpOwotCQkJCQlldmVudC5nYy5kcmF3SW1hZ2UoaW1hZ2UsIHggLSByZWN0LndpZHRoIC8gMiwgZXZlbnQueQotCQkJCQkJCSsgb2Zmc2V0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJZ2V0VHJlZSgpLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Qcm9jZXNzVHJlZVZpZXdlciNkb1VwZGF0ZUl0ZW0ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbSwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9VcGRhdGVJdGVtKEl0ZW0gaXRlbSwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJc3VwZXIuZG9VcGRhdGVJdGVtKGl0ZW0sIGVsZW1lbnQpOwotCi0JCWlmIChjaGVja0JveENlbGxFZGl0b3JzICE9IG51bGwgJiYgY29sdW1uUHJvcGVydGllcyAhPSBudWxsCi0JCQkJJiYgY29sdW1uUHJvcGVydGllcy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrQm94Q2VsbEVkaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciBlZGl0b3IgPSBjaGVja0JveENlbGxFZGl0b3JzW2ldOwotCQkJCWlmIChlZGl0b3IgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJKChUcmVlSXRlbSkgaXRlbSkuc2V0VGV4dChpLCAiIik7Ci0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBJbWFnZSBnZXRDaGVja0JveENlbGxFZGl0b3JJbWFnZShFdmVudCBldmVudCkgewotCQlyZXR1cm4gZ2V0Q2hlY2tCb3hDZWxsRWRpdG9ySW1hZ2UoZXZlbnQuaW5kZXgsIChUcmVlSXRlbSkgZXZlbnQuaXRlbSk7Ci0JfQotCi0JcHJpdmF0ZSBJbWFnZSBnZXRDaGVja0JveENlbGxFZGl0b3JJbWFnZShpbnQgY29sdW1uSW5kZXgsIFRyZWVJdGVtIGl0ZW0pIHsKLQkJaWYgKGNoZWNrQm94Q2VsbEVkaXRvcnMgPT0gbnVsbAotCQkJCXx8IGNoZWNrQm94Q2VsbEVkaXRvcnNbY29sdW1uSW5kZXhdID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGNoZWNrQm94Q2VsbEVkaXRvcnNbY29sdW1uSW5kZXhdLmdldEltYWdlKGl0ZW0sCi0JCQkJY29sdW1uUHJvcGVydGllc1tjb2x1bW5JbmRleF0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyI3NldENlbGxNb2RpZmllcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2VsbE1vZGlmaWVyKElDZWxsTW9kaWZpZXIgbW9kaWZpZXIpIHsKLQkJc3VwZXIuc2V0Q2VsbE1vZGlmaWVyKG1vZGlmaWVyKTsKLQotCQlpZiAoY2hlY2tCb3hDZWxsRWRpdG9ycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrQm94Q2VsbEVkaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciBlZGl0b3IgPSBjaGVja0JveENlbGxFZGl0b3JzW2ldOwotCQkJCWlmIChlZGl0b3IgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJZWRpdG9yLnNldENlbGxNb2RpZmllcihtb2RpZmllcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBtb3VzZSBkb3duIGxpc3RlbmVyCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIG1vZGlmeUl0ZW0oTW91c2VFdmVudCBldmVudCkgewotCQlQb2ludCBwdCA9IG5ldyBQb2ludChldmVudC54LCBldmVudC55KTsKLQkJVHJlZUl0ZW0gaXRlbSA9IGdldFRyZWUoKS5nZXRJdGVtKHB0KTsKLQkJaWYgKGl0ZW0gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGdldFRyZWUoKS5nZXRDb2x1bW5Db3VudCgpOyBpKyspIHsKLQkJCVJlY3RhbmdsZSByZWN0ID0gaXRlbS5nZXRCb3VuZHMoaSk7Ci0JCQlpZiAocmVjdC5jb250YWlucyhwdCkpIHsKLQkJCQlJbWFnZSBpbWFnZSA9IGdldENoZWNrQm94Q2VsbEVkaXRvckltYWdlKGksIGl0ZW0pOwotCQkJCWlmIChpbWFnZSA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJUmVjdGFuZ2xlIGltZ1JlY3QgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgKHJlY3QuaGVpZ2h0IC0gaW1nUmVjdC5oZWlnaHQpIC8gMik7Ci0JCQkJaW50IHggPSByZWN0LnggKyByZWN0LndpZHRoIC8gMiAtIGltZ1JlY3Qud2lkdGggLyAyOwotCQkJCWludCB5ID0gcmVjdC55ICsgb2Zmc2V0OwotCQkJCWltZ1JlY3QgPSBuZXcgUmVjdGFuZ2xlKHgsIHksIGltZ1JlY3Qud2lkdGgsIGltZ1JlY3QuaGVpZ2h0KTsKLQkJCQlpZiAoaW1nUmVjdC5jb250YWlucyhwdCkpIHsKLQkJCQkJY2hlY2tCb3hDZWxsRWRpdG9yc1tpXS5tb2RpZnkoaXRlbSwgY29sdW1uUHJvcGVydGllc1tpXSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlciNzZXRDb2x1bW5Qcm9wZXJ0aWVzKGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW5Qcm9wZXJ0aWVzKFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXMpIHsKLQkJc3VwZXIuc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5Qcm9wZXJ0aWVzKTsKLQkJdGhpcy5jb2x1bW5Qcm9wZXJ0aWVzID0gY29sdW1uUHJvcGVydGllczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1NhdmVhYmxlTGlicmFyeVZpZXdQYXJ0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvU2F2ZWFibGVMaWJyYXJ5Vmlld1BhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTUyMGI0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvU2F2ZWFibGVMaWJyYXJ5Vmlld1BhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBjbGFzcyBmb3IgYWxsIHZpZXdzIHRoYXQgcmVxdWlyZXMgdGhlIHN1cHBvcnQgb2Ygc2F2aW5nIGEgTWV0aG9kCi0gKiBMaWJyYXJ5IHZpYSB0aGUgU2F2ZSBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2F2ZWFibGVMaWJyYXJ5Vmlld1BhcnQgZXh0ZW5kcyBWaWV3UGFydCBpbXBsZW1lbnRzCi0JCUlTYXZlYWJsZVBhcnQgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJbW9uaXRvcgotCQkJCQkuYmVnaW5UYXNrKAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmluZ0xpYnJhcnlUYXNrX25hbWUsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IAotCQkJU3RyaW5nIGxpYlBhdGggPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKTsKLQkJCXRyeSB7Ci0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zYXZlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeVRvRXJyb3JfbXNnLCBsaWJQYXRoKSwgCi0JCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yX3JlYXNvbiwgCi0JCQkJCQkJCWUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNkb1NhdmVBcygpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlT25DbG9zZU5lZWRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlT25DbG9zZU5lZWRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvVmlld0hlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1ZpZXdIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjZkYTA0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvVmlld0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzE0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3IgbWFuYWdpbmcgdGhlIHZpZXdzIGFuZCBlZGl0b3JzIGluIHRoZSBBdXRob3JpbmcKLSAqIHBlcnNwZWN0aXZlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWaWV3SGVscGVyIHsKLQotCS8qKgotCSAqIFByb21wdHMgdGhlIHVzZXIgdG8gc2F2ZSB0aGUgb3BlbiBsaWJyYXJ5IGlmIGl0IGhhcyBiZWVuIG1vZGlmaWVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTxjb2RlPiBpZiB0aGUgdXNlciBzYXZlZCBvciBkaXNjYXJkZWQgdGhlIGNoYW5nZSwKLQkgKiAJCSAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgdXNlciBjYW5jZWxsZWQgdGhlIGFjdGlvbiB0aGF0Ci0JICogICAgICAgICB0cmlnZ2VyZWQgdGhpcyBjYWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9tcHRTYXZlKCkgewotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwgJiYgbWFuYWdlci5pc01ldGhvZExpYnJhcnlNb2RpZmllZCgpKSB7Ci0JCQlpbnQgcmV0ID0gTXNnQm94LnByb21wdChBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeURpYWxvZ190aXRsZSwgCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RGlhbG9nX3RleHQsIAotCQkJCQlTV1QuWUVTIHwgU1dULk5PIHwgU1dULkNBTkNFTCk7Ci0JCQlzd2l0Y2ggKHJldCkgewotCQkJY2FzZSBTV1QuWUVTOgotCQkJCXRyeSB7Ci0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQkJZGlhbG9nCi0JCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RXJyb3JfbXNnLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yX3JlYXNvbiwgZSk7IAotCi0JCQkJCXJldHVybiBkaWFsb2cKLQkJCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RGlhbG9nX3RleHQpOyAKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNXVC5OTzoKLQkJCQkvLyBEaXNjYXJkIGFsbCBjaGFuZ2VzIGJ5IHJlc2V0dGluZyBhbGwgcmVzb3VyY2VzIGFzIHVuY2hhbmdlZC4KLQkJCQltYW5hZ2VyLmRpc2NhcmRNZXRob2RMaWJyYXJ5Q2hhbmdlcygpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1QuQ0FOQ0VMOgotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHNhdmUgdGhlIG9wZW4gbGlicmFyeSBpZiBpdCBoYXMgYmVlbiBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjaG9pY2UgdGhlIHVzZXIgbWFkZSB3aGVuIHByb21wdGVkIHRvIHNhdmUgLSBvbmUgb2YgU1dULllFUywgU1dULk5PLCBTV1QuQ0FOQ0VMCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgcHJvbXB0U2F2ZUludCgpIHsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsICYmIG1hbmFnZXIuaXNNZXRob2RMaWJyYXJ5TW9kaWZpZWQoKSkgewotCQkJaW50IHJldCA9IE1zZ0JveC5wcm9tcHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGUsIAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeURpYWxvZ190ZXh0LCAKLQkJCQkJU1dULllFUyB8IFNXVC5OTyB8IFNXVC5DQU5DRUwpOwotCQkJc3dpdGNoIChyZXQpIHsKLQkJCWNhc2UgU1dULllFUzoKLQkJCQl0cnkgewotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNhdmVDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQkJCWRpYWxvZwotCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeURpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeUVycm9yX21zZywgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvcl9yZWFzb24sIGUpOyAKLQkJCQl9Ci0JCQkJcmV0dXJuIFNXVC5ZRVM7Ci0JCQljYXNlIFNXVC5OTzoKLQkJCQkvLyBEaXNjYXJkIGFsbCBjaGFuZ2VzIGJ5IHJlc2V0dGluZyBhbGwgcmVzb3VyY2VzIGFzIHVuY2hhbmdlZC4KLQkJCQltYW5hZ2VyLmRpc2NhcmRNZXRob2RMaWJyYXJ5Q2hhbmdlcygpOwotCQkJCXJldHVybiBTV1QuTk87Ci0JCQljYXNlIFNXVC5DQU5DRUw6Ci0JCQkJcmV0dXJuIFNXVC5DQU5DRUw7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gU1dULkNBTkNFTDsKLQl9Ci0KLQkvKioKLQkgKiBjbG9zZXMgYWxsIGVkaXRvcnMgb24gdGhlIGFjdGl2ZSBwYWdlCi0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VBbGxFZGl0b3JzKCkgewotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCS5jbG9zZUFsbEVkaXRvcnModHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogY2xvc2VzIHRoZSBNZXNzYWdlVmlldyAoZXJyb3IgdmlldykKLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZU1lc3NhZ2VWaWV3KCkgewotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCS5oaWRlVmlldyhNZXNzYWdlVmlldy5nZXRWaWV3KCkpOwotCX0KLQotCS8qKgotCSAqIGhhbmRsZXMgYSBkYW5nbGluZyBvYmplY3QKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqIAkJCU9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGhhbmRsZURhbmdsaW5nKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkmJiAoKEVPYmplY3QpIG9iamVjdCkuZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsIAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVsZW1lbnRBbHJlYWR5RGVsZXRlZEVycm9yX21zZywgKChNZXRob2RFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKSkpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iamVjdDsKLQkJCU9iamVjdCB2YWx1ZSA9IGFkYXB0ZXIuZ2V0VmFsdWUoKTsKLQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJJiYgKChFT2JqZWN0KSB2YWx1ZSkuZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJCU9iamVjdCBvd25lciA9IFRuZ1V0aWwudW53cmFwKGFkYXB0ZXIuZ2V0UGFyZW50KHZhbHVlKSk7Ci0JCQkJaWYgKG93bmVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQkvLyBUaGlzIGlzIGEgVUkgaXRlbSBwcm92aWRlci4KLQkJCQkJb3duZXIgPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIG93bmVyKS5nZXRUYXJnZXQoKTsKLQkJCQl9Ci0JCQkJU3RyaW5nIG93bmVyTmFtZSA9ICgoTWV0aG9kRWxlbWVudCkgb3duZXIpLmdldE5hbWUoKTsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXIuZ2V0RmVhdHVyZSgpOwotCQkJCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCQkJaWYgKEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5UHJvbXB0KAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsZXRlRGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZGNvbmZpcm1fdGV4dCwgKChNZXRob2RFbGVtZW50KSB2YWx1ZSkKLQkJCQkJCQkJCS5nZXROYW1lKCksIG93bmVyTmFtZSkpKSB7IAotCQkJCQkJLy8gUmVtb3ZlIHRoZSBhc3NvY2lhdGlvbi4KLQkJCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJKChDb2xsZWN0aW9uKSAoKEVPYmplY3QpIG93bmVyKS5lR2V0KGZlYXR1cmUpKQotCQkJCQkJCQkJLnJlbW92ZSh2YWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsIAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5lbGVtZW50QWxyZWFkeURlbGV0ZWRFcnJvcl9tc2csICgoTWV0aG9kRWxlbWVudCkgdmFsdWUpCi0JCQkJCQkJCQkuZ2V0TmFtZSgpKSk7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotCi0JLyogVE9ETzogSXMgdGhpcyBzdGlsbCBuZWVkZWQ/Ci0JcHVibGljIHN0YXRpYyB2b2lkIGxvYWRBbGxBbmRTYXZlQWxsKCkgewotCQlmaW5hbCBNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24gYmVjYXVzZSB0aGlzIGlzIGEgbG9uZyBydW5uaW5nCi0JCS8vIGFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgdGhlIHdvcmtiZW5jaC4KLQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0JCQkvLyBUaGlzIGlzIHRoZSBtZXRob2QgdGhhdCBnZXRzIGludm9rZWQgd2hlbiB0aGUgb3BlcmF0aW9uIHJ1bnMuCi0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS51cGdyYWRpbmdMaWJyYXJ5VGFzay5uYW1lIiksIDMpOyAvLyROT04tTkxTLTEkCi0JCQkJdHJ5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQkJbW9uaXRvcgotCQkJCQkJCQkuc2V0VGFza05hbWUoQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS5sb2FkaW5nTGlicmFyeUVsZW1lbnRzVGFzay5uYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlNb2RlbFN0b3JhZ2UubG9hZEFsbFByb3hpZXMobGliKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCS5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLnVwZ3JhZGVMaWJyYXJ5RGlhbG9nLnRpdGxlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkudXBncmFkZUxpYnJhcnlFcnJvci5tc2ciKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS51cGdyYWRlTGlicmFyeUVycm9yLnJlYXNvbiIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJZSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJdHJ5IHsKLQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQkJbW9uaXRvcgotCQkJCQkJCQkuc2V0VGFza05hbWUoQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS5zYXZpbmdVcGdyYWRlZEVsZW1lbnRzVGFzay5uYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBsaWIKLQkJCQkJCQkJLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJCQlyZXNvdXJjZVNldC5zYXZlKExpYnJhcnlQcm9jZXNzb3IuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkuZ2V0U2F2ZU9wdGlvbnMoKSwgdHJ1ZSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS51cGdyYWRlTGlicmFyeURpYWxvZy50aXRsZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCS5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLnVwZ3JhZGVMaWJyYXJ5RXJyb3IubXNnIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkuc2F2ZVVwZ3JhZGVkTGlicmFyeUVycm9yLnJlYXNvbiIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJZSk7Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCS8vIFJ1biB0aGUgb3BlcmF0aW9uIGFuZCBkaXNwbGF5IHRoZSBwcm9ncmVzcy4KLQkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSkKLQkJCQkJLnJ1bih0cnVlLCBmYWxzZSwgb3BlcmF0aW9uKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCS5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLnVwZ3JhZGVMaWJyYXJ5RGlhbG9nLnRpdGxlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkudXBncmFkZUxpYnJhcnlFcnJvci5tc2ciKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS5pbnRlcm5hbEVycm9yLnJlYXNvbiIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJZSk7Ci0JCX0KLQl9Ci0JKi8KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gaXMgbG9ja2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xvY2tlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCXdoaWxlIChlbGVtZW50IGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJZWxlbWVudCA9ICgoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBlbGVtZW50KS5nZXRQYXJlbnQobnVsbCk7Ci0JCQl9Ci0JCQllbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkJJiYgVG5nVXRpbC5pc0xvY2tlZCgoRU9iamVjdCkgZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBGaXhlcyB0aGUgY29udGVudCBkZXNjcmlwdGlvbiBHVUlEcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZml4Q29udGVudERlc2NyaXB0aW9uR1VJRHMoKSB7Ci0JCWZpbmFsIE1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGliID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJSGFzaFNldCBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJSW50ZXJuYWxFT2JqZWN0IGVsZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQuZVByb3h5VVJJKCkgPT0gbnVsbCkgewotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIGVsZW1lbnQ7Ci0JCQkJCQkJRGVzY3JpYmFibGVFbGVtZW50IGNvbnRhaW5lciA9IChEZXNjcmliYWJsZUVsZW1lbnQpIGVsZW1lbnQKLQkJCQkJCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQkJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCQkJCVN0cmluZyBndWlkID0gVW1hVXRpbC5nZW5lcmF0ZUdVSUQoY29udGFpbmVyCi0JCQkJCQkJCQkJLmdldEd1aWQoKSk7Ci0JCQkJCQkJCWlmICghZ3VpZC5lcXVhbHMoY29udGVudC5nZXRHdWlkKCkpKSB7Ci0JCQkJCQkJCQljb250ZW50LnNldEd1aWQoZ3VpZCk7Ci0JCQkJCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoY29udGVudC5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJCQltb2RpZmllZFJlc291cmNlcwotCQkJCQkJCQkJCQkuYWRkKGNvbnRhaW5lci5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJIlVucmVzb2x2ZWQgcHJveHkgaW4gJyIgKyBlbGVtZW50LmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpICsgIic6ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9Ci0KLQkJCQltb25pdG9yLnN1YlRhc2soQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2F2aW5nRmlsZXNUYXNrX25hbWUpOwotCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQltb25pdG9yLnN1YlRhc2soQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5zYXZpbmdUYXNrX25hbWUsIHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKSk7Ci0JCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQkJVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJLnJ1bldpdGhQcm9ncmVzcygKLQkJCQkJCXJ1bm5hYmxlLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZml4aW5nQ29udGVudERlc2NyaXB0aW9uR1VJRHNUYXNrX25hbWUpOyAKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2hlY2tQcm94eShJbnRlcm5hbEVPYmplY3QgZWxlbWVudCwgRVJlZmVyZW5jZSByZWYsCi0JCQlPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZXJuYWxFT2JqZWN0KSB7Ci0JCQlJbnRlcm5hbEVPYmplY3QgZU9iaiA9IChJbnRlcm5hbEVPYmplY3QpIHZhbHVlOwotCQkJaWYgKGVPYmouZUlzUHJveHkoKSkgewotCQkJCUVPYmplY3QgcmVzb2x2ZWQgPSBlbGVtZW50LmVSZXNvbHZlUHJveHkoZU9iaik7Ci0JCQkJU3RyaW5nIGVyck1zZyA9IG51bGw7Ci0JCQkJaWYgKHJlc29sdmVkID09IGVPYmopIHsKLQkJCQkJZXJyTXNnID0gIlVucmVzb2x2ZWQgcHJveHkiOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIGlmICghcmVmLmdldEVUeXBlKCkuaXNJbnN0YW5jZShyZXNvbHZlZCkpIHsKLQkJCQkJZXJyTXNnID0gIkludmFsaWQgZGF0YSI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKGVyck1zZyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYXRoOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotCQkJCQkJcGF0aCA9IHJlZi5nZXRFVHlwZSgpLmdldE5hbWUoKQotCQkJCQkJCQkrICIoIiArIE1pc2MuZ2V0UGF0aFJlbGF0aXZlVG9MaWJyYXJ5KChOYW1lZEVsZW1lbnQpIGVsZW1lbnQpICsgIikuIiArIHJlZi5nZXROYW1lKCkgKyAiID0gIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXBhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybiBlcnJNc2cKLQkJCQkJCQkrICIgaW4gJyIgKyBlbGVtZW50LmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpICsgIic6ICIgKyBwYXRoICsgcmVzb2x2ZWQ7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBMaWJyYXJ5IGhlYWx0aCBjaGVjawotCSAqCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrTGlicmFyeUhlYWx0aCgpIHsKLQkJZmluYWwgTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dJbmZvKAotCQkJCQkJIisrKysgTElCUkFSWSBIRUFMVEggQ0hFQ0sgUkVQT1JUIC0gU1RBUlQgKysrIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmdXcml0ZXIgc3RyV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJCVByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN0cldyaXRlcik7Ci0JCQkJcHJpbnRXcml0ZXIucHJpbnRsbigpOwotCQkJCXByaW50V3JpdGVyCi0JCQkJCQkucHJpbnRsbigiVU5SRVNPTFZFRC9JTlZBTElEIFBST1hJRVMgSU4gWC1SRUZFUkVOQ0VTIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlwcmludFdyaXRlcgotCQkJCQkJLnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJSW50ZXJuYWxFT2JqZWN0IGVsZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQuZVByb3h5VVJJKCkgPT0gbnVsbCkgewotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIGVsZW1lbnQ7Ci0JCQkJCQkJRGVzY3JpYmFibGVFbGVtZW50IGNvbnRhaW5lciA9IChEZXNjcmliYWJsZUVsZW1lbnQpIGVsZW1lbnQKLQkJCQkJCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQkJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCQkJCVN0cmluZyBndWlkID0gVW1hVXRpbC5nZW5lcmF0ZUdVSUQoY29udGFpbmVyCi0JCQkJCQkJCQkJLmdldEd1aWQoKSk7Ci0JCQkJCQkJCWlmICghZ3VpZC5lcXVhbHMoY29udGVudC5nZXRHdWlkKCkpKSB7Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJCQkJIkNvbnRlbnREZXNjcmlwdGlvbiB3aXRoIGludmFsaWQgR1VJRDogIiArIGNvbnRlbnQuZ2V0R3VpZCgpICsgIiBpbiAnIiArIGNvbnRlbnQuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCQkJIkNvbnRlbnREZXNjcmlwdGlvbiB3aXRob3V0IGEgY29udGFpbmVyOiAiICsgY29udGVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0KLQkJCQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbikgewotCQkJCQkJCQkvLyBjaGVjayBpZiB0aGUgY29udGVudC54bWkgb2YgdGhlIHByb2Nlc3MgaXMgaW4KLQkJCQkJCQkJLy8gdGhlIHJpZ2h0IHBsYWNlCi0JCQkJCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSBVbWFVdGlsCi0JCQkJCQkJCQkJLmdldFByb2Nlc3NDb21wb25lbnQoY29udGVudCk7Ci0JCQkJCQkJCWlmIChwcm9jQ29tcCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlTdHJpbmcgbW9kZWxQYXRoID0gcHJvY0NvbXAuZVJlc291cmNlKCkKLQkJCQkJCQkJCQkJLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCQkJCQkJRmlsZSBkaXIgPSBuZXcgRmlsZShtb2RlbFBhdGgpCi0JCQkJCQkJCQkJCS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCQkJCQlTdHJpbmcgY29udGVudFBhdGggPSBjb250ZW50LmVSZXNvdXJjZSgpCi0JCQkJCQkJCQkJCS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQotCQkJCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJtb2RlbCBwYXRoOiAiICsKLQkJCQkJCQkJCS8vIG1vZGVsUGF0aCk7Ci0JCQkJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQgcGF0aDogIiArCi0JCQkJCQkJCQkvLyBjb250ZW50UGF0aCk7Ci0JCQkJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQotCQkJCQkJCQkJRmlsZSBjb250ZW50RGlyID0gbmV3IEZpbGUoY29udGVudFBhdGgpCi0JCQkJCQkJCQkJCS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCQkJCQlpZiAoIWRpci5lcXVhbHMoY29udGVudERpcikpIHsKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJCQkJCSJDb250ZW50IGZpbGUgb2YgIiArIGNvbnRhaW5lci5lQ2xhc3MoKS5nZXROYW1lKCkgKyAiICciICsgY29udGFpbmVyLmdldE5hbWUoKSArICInIGluICciICsgbW9kZWxQYXRoICsgIiBpcyBtaXNwbGFjZWQ6ICIgKyBjb250ZW50UGF0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJLy8gY2hlY2sgZm9yIHVucmVzb2x2ZWQgcHJveGllcyBpbiBjcm9zcyByZWZlcmVuY2VzCi0JCQkJCQlBcnJheUxpc3QgeFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnQuZUNsYXNzKCkKLQkJCQkJCQkJLmdldEVBbGxSZWZlcmVuY2VzKCkpOwotCQkJCQkJeFJlZmVyZW5jZXMucmVtb3ZlQWxsKGVsZW1lbnQuZUNsYXNzKCkKLQkJCQkJCQkJLmdldEVBbGxDb250YWlubWVudHMoKSk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0geFJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlFUmVmZXJlbmNlIHJlZiA9IChFUmVmZXJlbmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KHJlZiwgZmFsc2UpOwotCQkJCQkJCWlmIChyZWYuaXNNYW55KCkpIHsKLQkJCQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZXJuYWxFTGlzdCkgewotCQkJCQkJCQkJSW50ZXJuYWxFTGlzdCBsaXN0ID0gKEludGVybmFsRUxpc3QpIHZhbHVlOwotCQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IGxpc3QuYmFzaWNJdGVyYXRvcigpOyBpdGVyMQotCQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCVN0cmluZyBtc2cgPSBjaGVja1Byb3h5KGVsZW1lbnQsIHJlZiwKLQkJCQkJCQkJCQkJCWl0ZXIxLm5leHQoKSk7Ci0JCQkJCQkJCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCXByaW50V3JpdGVyLnByaW50bG4obXNnKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlTdHJpbmcgbXNnID0gY2hlY2tQcm94eShlbGVtZW50LCByZWYsIHZhbHVlKTsKLQkJCQkJCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQkJCQlwcmludFdyaXRlci5wcmludGxuKG1zZyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJIlVucmVzb2x2ZWQgcHJveHkgaW4gJyIgKyBlbGVtZW50LmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpICsgIic6ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQotCQkJCX0KLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQlzdHJXcml0ZXIudG9TdHJpbmcoKSk7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0luZm8oCi0JCQkJCQkiKysrKyBMSUJSQVJZIEhFQUxUSCBDSEVDSyBSRVBPUlQgLSBFTkQgKysrIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQl9OwotCQlpZiAoVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMudmlld0hlbHBlcl9wZXJmb3JtSGVhbHRoQ2hlY2spKSB7IAotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX3RpdGxlOyAKLQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX21lc3NhZ2U7IAotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlJbmZvKHRpdGxlLAotCQkJCQltZXNzYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHJlbW92ZXMgaW52YWxpZCByZWZlcmVuY2UgaW4gdGhlIG9wZW4gbGlicmFyeQotCSAqCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUludmFsaWRSZWZlcmVuY2VzKCkgewotCQlmaW5hbCBNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCUhhc2hTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUludGVybmFsRU9iamVjdCBlbGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50LmVQcm94eVVSSSgpID09IG51bGwpIHsKLQkJCQkJCUFycmF5TGlzdCB4UmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoZWxlbWVudC5lQ2xhc3MoKQotCQkJCQkJCQkuZ2V0RUFsbFJlZmVyZW5jZXMoKSk7Ci0JCQkJCQl4UmVmZXJlbmNlcy5yZW1vdmVBbGwoZWxlbWVudC5lQ2xhc3MoKQotCQkJCQkJCQkuZ2V0RUFsbENvbnRhaW5tZW50cygpKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB4UmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCUVSZWZlcmVuY2UgcmVmID0gKEVSZWZlcmVuY2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50LmVHZXQocmVmLCBmYWxzZSk7Ci0JCQkJCQkJaWYgKHJlZi5pc01hbnkoKSkgewotCQkJCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlcm5hbEVMaXN0KSB7Ci0JCQkJCQkJCQlJbnRlcm5hbEVMaXN0IGxpc3QgPSAoSW50ZXJuYWxFTGlzdCkgdmFsdWU7Ci0JCQkJCQkJCQlBcnJheUxpc3QgaW52YWxpZFByb3hpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gbGlzdC5iYXNpY0l0ZXJhdG9yKCk7IGl0ZXIxCi0JCQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJT2JqZWN0IHYgPSBpdGVyMS5uZXh0KCk7Ci0JCQkJCQkJCQkJaWYgKGlzSW52YWxpZFJlZmVyZW5jZShlbGVtZW50LCByZWYsIHYpKSB7Ci0JCQkJCQkJCQkJCWludmFsaWRQcm94aWVzLmFkZCh2KTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAoIWludmFsaWRQcm94aWVzLmlzRW1wdHkoKSkgewotCQkJCQkJCQkJCXJlbW92ZUludmFsaWRSZWZlcmVuY2VzKGVsZW1lbnQsIGxpc3QsCi0JCQkJCQkJCQkJCQlpbnZhbGlkUHJveGllcyk7Ci0JCQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGVsZW1lbnQKLQkJCQkJCQkJCQkJCS5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAoaXNJbnZhbGlkUmVmZXJlbmNlKGVsZW1lbnQsIHJlZiwgdmFsdWUpKSB7Ci0JCQkJCQkJCQllbGVtZW50LmVTZXQocmVmLCBudWxsKTsKLQkJCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChlbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCQkiVW5yZXNvbHZlZCBwcm94eSBpbiAnIiArIGVsZW1lbnQuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkgKyAiJzogIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQotCQkJCW1vbml0b3Iuc3ViVGFzayhBdXRob3JpbmdVSVJlc291cmNlcy5zYXZpbmdGaWxlc1Rhc2tfbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJCXRyeSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJbW9uaXRvci5zdWJUYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2F2aW5nVGFza19uYW1lLCByZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkpOwotCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlwcml2YXRlIGJvb2xlYW4gaXNJbnZhbGlkUmVmZXJlbmNlKEludGVybmFsRU9iamVjdCBlbGVtZW50LAotCQkJCQlFUmVmZXJlbmNlIHJlZiwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZXJuYWxFT2JqZWN0KSB7Ci0JCQkJCUludGVybmFsRU9iamVjdCBlT2JqID0gKEludGVybmFsRU9iamVjdCkgdmFsdWU7Ci0JCQkJCWlmIChlT2JqLmVJc1Byb3h5KCkpIHsKLQkJCQkJCUVPYmplY3QgcmVzb2x2ZWQgPSBlbGVtZW50LmVSZXNvbHZlUHJveHkoZU9iaik7Ci0JCQkJCQlpZiAoIXJlZi5nZXRFVHlwZSgpLmlzSW5zdGFuY2UocmVzb2x2ZWQpKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwcml2YXRlIHZvaWQgcmVtb3ZlSW52YWxpZFJlZmVyZW5jZXMoSW50ZXJuYWxFT2JqZWN0IGVsZW1lbnQsCi0JCQkJCUludGVybmFsRUxpc3QgdmFsdWVzLCBDb2xsZWN0aW9uIGludmFsaWRQcm94aWVzKSB7Ci0JCQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KHZhbHVlcy5iYXNpY0xpc3QoKSk7Ci0JCQkJbGlzdC5yZW1vdmVBbGwoaW52YWxpZFByb3hpZXMpOwotCQkJCXZhbHVlcy5jbGVhcigpOwotCQkJCWludCBtYXggPSBsaXN0LnNpemUoKSAtIDE7Ci0JCQkJZm9yIChpbnQgaSA9IG1heDsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJbGlzdC5zZXQoaSwgZWxlbWVudC5lUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIGxpc3QKLQkJCQkJCQkuZ2V0KGkpKSk7Ci0JCQkJfQotCQkJCXZhbHVlcy5hZGRBbGwobGlzdCk7Ci0JCQl9Ci0KLQkJfTsKLQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsZXRpbmdJbnZhbGlkUmVmZXJlbmNlc1Rhc2tfbmFtZSk7IAotCi0JfQotCi0JLyoqCi0JICogcmVsb2FkcyB0aGUgY3VycmVudCBsaWJyYXJ5LiAgVXNlZCBvbiBhIHJvbGxiYWNrIGVycm9yCi0JICogQHBhcmFtIHNoZWxsCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbG9hZEN1cnJlbnRMaWJhcnlPblJvbGxiYWNrRXJyb3IoU2hlbGwgc2hlbGwpIHsKLQkJcmVsb2FkQ3VycmVudExpYnJhcnkoc2hlbGwsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLlZpZXdIZWxwZXJfcmVsb2FkTGliT25Sb2xsYmFja0Vycm9yKTsgCi0JfQotCi0JLyoqCi0JICogZGlzcGxheXMgdGhlIG1lc3NhZ2UgYW5kIHJlbG9hZHMgdGhlIGN1cnJlbnQgbGlicmFyeSAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWxvYWRDdXJyZW50TGlicmFyeShTaGVsbCBzaGVsbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKHNoZWxsID09IG51bGwpIHsKLQkJCU1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKTsKLQkJfQotCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZWxvYWREaWFsb2dfdGl0bGU7IAotCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQltZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVsb2FkRGlhbG9nX21lc3NhZ2U7IAotCQl9Ci0JCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5SW5mbyh0aXRsZSwKLQkJCQltZXNzYWdlKTsKLQotCQkvLyBUaGUgbGlicmFyeSBuZWVkcyB0byBiZSByZWxvYWRlZC4KLQkJU3RyaW5nIGxpYkRpciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCk7Ci0JCUxpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5vcGVuTGlicmFyeShsaWJEaXIpOwotCX0KLQotCS8qKgotCSAqIG9wZW5zIHRoZSBnaXZlbiB2aWV3SWQKLQkgKiBAcGFyYW0gdmlld0lkCi0JICogQHJldHVybgotCSAqIAkJCVZpZXcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaWV3UGFydCBvcGVuVmlldyhTdHJpbmcgdmlld0lkKSB7Ci0JCXRyeSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJCUlWaWV3UGFydCB2aWV3ID0gYWN0aXZlUGFnZS5maW5kVmlldyh2aWV3SWQpOwotCQkJCWlmICh2aWV3ID09IG51bGwpIHsKLQkJCQkJdmlldyA9IGFjdGl2ZVBhZ2Uuc2hvd1ZpZXcodmlld0lkKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHZpZXc7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmludGVybmFsRXJyb3JfbXNnLCAKLQkJCQkJZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTMzOWJjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdmlld3MgZm9yIHRoZSBBdXRob3JpbmcgYW5kIEJyb3dzaW5nIHBlcnNwZWN0aXZlcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9Db25maWd1cmF0aW9uVGFibGVMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9Db25maWd1cmF0aW9uVGFibGVMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYxYThkZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLS8qKgotICogVGhlIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgQ29uZmlndXJhdGlvbiB0YWJsZSBpbiB0aGUgT3BlbiBDb25maWd1cmF0aW9uCi0gKiB3aXphcmQuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBpbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBpbmRleCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBlbGVtZW50OwotCQlyZXR1cm4gY29uZmlnLmdldE5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExYTMwNjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBlbnRlciBhIG5hbWUgYW5kIGRlc2NyaXB0aW9uIGZvciBhIG5ldwotICogTWV0aG9kIENvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdDb25maWd1cmF0aW9uTWFpblBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IE5ld0NvbmZpZ3VyYXRpb25NYWluUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgVGV4dCBuYW1lVGV4dCwgYnJpZWZEZXNjVGV4dDsKLQotCXByaXZhdGUgYm9vbGVhbiBub09wZW5MaWJyYXJ5OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZVRpdGxlKTsgLy8kTk9OLU5MUy0xJCk7Ci0JCXNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9OZXcuZ2lmIikpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyaWREYXRhIGxhYmVsR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgbmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQluYW1lTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVRleHQuTkFNRV9URVhUKTsKLQkJbmFtZUxhYmVsLnNldExheW91dERhdGEobGFiZWxHcmlkRGF0YSk7Ci0KLQkJbmFtZVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQluYW1lVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJKChHcmlkRGF0YSkgbmFtZVRleHQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJTGFiZWwgYnJpZWZEZXNjTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWJyaWVmRGVzY0xhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1RFWFQpOwotCQlicmllZkRlc2NMYWJlbC5zZXRMYXlvdXREYXRhKGxhYmVsR3JpZERhdGEpOwotCi0JCWJyaWVmRGVzY1RleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMKTsKLQkJYnJpZWZEZXNjVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJKChHcmlkRGF0YSkgYnJpZWZEZXNjVGV4dC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJKChHcmlkRGF0YSkgYnJpZWZEZXNjVGV4dC5nZXRMYXlvdXREYXRhKCkpLmhlaWdodEhpbnQgPSA3MDsKLQkJKChHcmlkRGF0YSkgYnJpZWZEZXNjVGV4dC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IDQ4MDsKLQkJYnJpZWZEZXNjVGV4dAotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZWZhdWx0QnJpZWZEZXNjcmlwdGlvbik7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJbm9PcGVuTGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSA9PSBudWxsOwotCQlpZiAobm9PcGVuTGlicmFyeSkgewotCQkJLy8gRklYTUUhIEV4dGVybmFsaXplIHN0cmluZy4KLQkJCXNldEVycm9yTWVzc2FnZShBdXRob3JpbmdVSVJlc291cmNlcy5ub09wZW5MaWJyYXJ5RXJyb3JfbXNnKTsKLQkJfQotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKG5vT3BlbkxpYnJhcnkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyBjb25maWdOYW1lID0gZ2V0Q29uZmlndXJhdGlvbk5hbWUoKTsKLQkJaWYgKGNvbmZpZ05hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGNvbmZpZ3VyYXRpb25FeGlzdHMoY29uZmlnTmFtZSkpIHsKLQkJCVN0cmluZyBlcnJNc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZywKLQkJCQkJY29uZmlnTmFtZSk7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQkJfSBlbHNlIHsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJfQotCi0JCXJldHVybiBnZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsOwotCX0KLQotCS8qKgotCSAqIEFkZHMgbGlzdGVuZXJzIHRvIHRoZSB3aXphcmQgY29udHJvbHMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJbmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBsaXN0ZW5lcnMgdG8gdGhlIHdpemFyZCBjb250cm9scy4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY29uZmlndXJhdGlvbkV4aXN0cyhTdHJpbmcgY29uZmlnTmFtZSkgewotCQlTdHJpbmdbXSBjb25maWdOYW1lcyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uTmFtZXMoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ05hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29uZmlnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKGNvbmZpZ05hbWVzW2ldKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHVzZXIgc3BlY2lmaWVkIG5hbWUgZm9yIHRoZSBuZXcgbWV0aG9kIGNvbmZpZ3VyYWl0b24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbmZpZ3VyYXRpb25OYW1lKCkgewotCQlyZXR1cm4gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBicmllZiBkZWNyaXB0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHVzZXIgc3BlY2lmaWVkIGJyaWVmIGRlY3JpcHRpb24gZm9yIHRoZSBuZXcgbWV0aG9kCi0JICogICAgICAgICBjb25maWd1cmFpdG9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb25maWd1cmF0aW9uQnJpZWZEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGJyaWVmRGVzY1RleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0NvbmZpZ3VyYXRpb25XaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0NvbmZpZ3VyYXRpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGNhNjkyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdDb25maWd1cmF0aW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBBIHdpemFyZCB0aGF0IGd1aWRlcyB0aGUgdXNlciB0byBjcmVhdGUgYSBuZXcgTWV0aG9kIENvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdDb25maWd1cmF0aW9uV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9JRCA9IE5ld0NvbmZpZ3VyYXRpb25XaXphcmQuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIE5ld0NvbmZpZ3VyYXRpb25NYWluUGFnZSBtYWluUGFnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0NvbmZpZ3VyYXRpb25XaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRXaW5kb3dUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9uZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJbWFpblBhZ2UgPSBuZXcgTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlKCk7Ci0JCWFkZFBhZ2UobWFpblBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkiZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdXBlci5jYW5GaW5pc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCVN0cmluZyBjb25maWdOYW1lID0gbWFpblBhZ2UuZ2V0Q29uZmlndXJhdGlvbk5hbWUoKTsKLQkJaWYgKGNvbmZpZ05hbWUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5jcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKAotCQkJCQkJCQljb25maWdOYW1lLAotCQkJCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQkJCVN0cmluZyBicmllZkRlc2NyaXB0aW9uID0gbWFpblBhZ2UKLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uQnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCWlmIChicmllZkRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJY29uZmlnLnNldEJyaWVmRGVzY3JpcHRpb24oYnJpZWZEZXNjcmlwdGlvbik7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9uZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlLAotCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5pbnRlcm5hbEVycm9yX21zZywgZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0xpYnJhcnlNYWluUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TGlicmFyeU1haW5QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1ZmUxMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TGlicmFyeU1haW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIGVudGVyIHRoZSBuYW1lLCBicmllZiBkZXNjcmlwdGlvbiBhbmQKLSAqIHR5cGUgZm9yIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5ld0xpYnJhcnlNYWluUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IE5ld0xpYnJhcnlNYWluUGFnZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCi0JcHJpdmF0ZSBDb21ibyBsaWJyYXJ5UGF0aENvbWJvOwotCi0JcHJpdmF0ZSBCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0JcHJpdmF0ZSBUZXh0IGJyaWVmRGVzY1RleHQ7Ci0KLQlwcml2YXRlIFN0cmluZyBsaWJyYXJ5VHlwZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0xpYnJhcnlNYWluUGFnZSgpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeVdpemFyZE1haW5QYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeVdpemFyZE1haW5QYWdlX2Rlc2NyaXB0aW9uKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL05ldy5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmxpYnJhcnlQYXRoTGFiZWxfdGV4dCk7Ci0KLQkJbGlicmFyeVBhdGhDb21ibyA9IGNyZWF0ZUNvbWJvYm94KGNvbXBvc2l0ZSk7Ci0KLQkJYnJvd3NlQnV0dG9uID0gY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQlJPV1NFX0JVVFRPTl9URVhUKTsKLQotCQlMYWJlbCBicmllZkRlc2NMYWJlbCA9IGNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fVEVYVCk7Ci0JCWJyaWVmRGVzY0xhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCi0JCWJyaWVmRGVzY1RleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQoY29tcG9zaXRlLCAiIiwgNDgwLCA3MCwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQlNYXAgdHlwZXMgPSBMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRMaWJyYXJ5VHlwZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHR5cGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWxpYnJhcnlUeXBlID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpbml0Q29udHJvbHMoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCVN0cmluZ1tdIG5ld0xpYnJhcnlQYXRocyA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldE5ld0xpYnJhcnlQYXRocygpOwotCQlsaWJyYXJ5UGF0aENvbWJvLnNldEl0ZW1zKG5ld0xpYnJhcnlQYXRocyk7Ci0JCWlmIChuZXdMaWJyYXJ5UGF0aHMubGVuZ3RoID4gMCkgewotCQkJbGlicmFyeVBhdGhDb21iby5zZXRUZXh0KG5ld0xpYnJhcnlQYXRoc1swXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlsaWJyYXJ5UGF0aENvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWxpYnJhcnlQYXRoQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coc2hlbGwsIFNXVC5OT05FKTsKLQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChnZXRMaWJyYXJ5UGF0aCgpKTsKLQkJCQlTdHJpbmcgc2VsZWN0ZWREaXIgPSBkaWFsb2cub3BlbigpOwotCQkJCWlmIChzZWxlY3RlZERpciAhPSBudWxsKSB7Ci0JCQkJCWxpYnJhcnlQYXRoQ29tYm8uYWRkKHNlbGVjdGVkRGlyLCAwKTsKLQkJCQkJbGlicmFyeVBhdGhDb21iby5zZXRUZXh0KHNlbGVjdGVkRGlyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlyZXR1cm4gZ2V0TGlicmFyeU5hbWUoKS5sZW5ndGgoKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlicmFyeSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoKSB7Ci0JCVN0cmluZyBsaWJQYXRoID0gZ2V0TGlicmFyeVBhdGgoKTsKLQkJU3RyaW5nIGxpYk5hbWUgPSBuZXcgRmlsZShsaWJQYXRoKS5nZXROYW1lKCk7Ci0JCWlmICghbGliUGF0aC5lcXVhbHMobGliTmFtZSkpIHsKLQkJCXJldHVybiBsaWJOYW1lOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBsaWJyYXJ5IHBhdGguCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5UGF0aCgpIHsKLQkJcmV0dXJuIGxpYnJhcnlQYXRoQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeSBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGJyaWVmRGVzY1RleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeSB0eXBlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVR5cGUoKSB7Ci0JCXJldHVybiBsaWJyYXJ5VHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0xpYnJhcnlNYWluUGFnZTIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0xpYnJhcnlNYWluUGFnZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmUxYzZhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5TWFpblBhZ2UyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTmV3TGlicmFyeVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5OZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBlbnRlciB0aGUgbmFtZSwgYnJpZWYgZGVzY3JpcHRpb24gYW5kCi0gKiB0eXBlIGZvciBhIG5ldyBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdMaWJyYXJ5TWFpblBhZ2UyIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBOZXdMaWJyYXJ5TWFpblBhZ2UyLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfSUQgPSAidHlwZUlkIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgVGV4dCBuYW1lVGV4dDsKLQotCXByaXZhdGUgVGV4dCBicmllZkRlc2NUZXh0OwotCi0JcHJpdmF0ZSBCdXR0b25bXSByYWRpb0J1dHRvbnM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdMaWJyYXJ5TWFpblBhZ2UyKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5V2l6YXJkTWFpblBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5V2l6YXJkTWFpblBhZ2VfZGVzY3JpcHRpb24pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vTmV3LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQotCQlMYWJlbCBuYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9STUFMKTsKLQkJbmFtZUxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0Lk5BTUVfVEVYVCk7Ci0KLQkJbmFtZVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQluYW1lVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJKChHcmlkRGF0YSkgbmFtZVRleHQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJTGFiZWwgYnJpZWZEZXNjTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9STUFMKTsKLQkJYnJpZWZEZXNjTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fVEVYVCk7Ci0KLQkJYnJpZWZEZXNjVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5XUkFQCi0JCQkJfCBTV1QuVl9TQ1JPTEwpOwotCQlicmllZkRlc2NUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkoKEdyaWREYXRhKSBicmllZkRlc2NUZXh0LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkoKEdyaWREYXRhKSBicmllZkRlc2NUZXh0LmdldExheW91dERhdGEoKSkuaGVpZ2h0SGludCA9IDcwOwotCQkoKEdyaWREYXRhKSBicmllZkRlc2NUZXh0LmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gNDgwOwotCi0JCUxhYmVsIGxpYnJhcnlUeXBlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9STUFMKTsKLQkJbGlicmFyeVR5cGVMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmxpYnJhcnlUeXBlTGFiZWxfdGV4dCk7Ci0KLQkJQ29tcG9zaXRlIHR5cGVDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PUk1BTCk7Ci0JCXR5cGVDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCXR5cGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTWFwIHR5cGVzID0gTGlicmFyeU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0TGlicmFyeVR5cGVzKCk7Ci0JCXJhZGlvQnV0dG9ucyA9IG5ldyBCdXR0b25bdHlwZXMuc2l6ZSgpXTsKLQkJaW50IHJhZGlvQnV0dG9uSW5kZXggPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdHlwZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHR5cGVJZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyB0eXBlTmFtZSA9IChTdHJpbmcpIHR5cGVzLmdldCh0eXBlSWQpOwotCQkJQnV0dG9uIHJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbih0eXBlQ29tcG9zaXRlLCBTV1QuUkFESU8pOwotCQkJcmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlyYWRpb0J1dHRvbi5zZXRUZXh0KHR5cGVOYW1lKTsKLQkJCXJhZGlvQnV0dG9uLnNldERhdGEoVFlQRV9JRCwgdHlwZUlkKTsKLQkJCXJhZGlvQnV0dG9uc1tyYWRpb0J1dHRvbkluZGV4KytdID0gcmFkaW9CdXR0b247Ci0JCX0KLQotCQlpZiAocmFkaW9CdXR0b25zLmxlbmd0aCA+IDApIHsKLQkJCXJhZGlvQnV0dG9uc1swXS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJTmV3TGlicmFyeVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IE5ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldFdpemFyZFBhZ2UoZ2V0TGlicmFyeVR5cGUoKSk7Ci0JCWlmICh3aXphcmRQYWdlICE9IG51bGwpIHsKLQkJCXdpemFyZFBhZ2Uub25FbnRlclBhZ2UoZ2V0TGlicmFyeU5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHdpemFyZFBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCXJldHVybiBnZXRMaWJyYXJ5TmFtZSgpLmxlbmd0aCgpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGxpc3RlbmVycyB0byB0aGUgd2l6YXJkIGNvbnRyb2xzLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCW5hbWVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpYnJhcnkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlOYW1lKCkgewotCQlyZXR1cm4gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IHR5cGUgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5VHlwZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByYWRpb0J1dHRvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUJ1dHRvbiByYWRpb0J1dHRvbiA9IHJhZGlvQnV0dG9uc1tpXTsKLQkJCWlmIChyYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCXJldHVybiAoU3RyaW5nKSByYWRpb0J1dHRvbi5nZXREYXRhKFRZUEVfSUQpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoU3RyaW5nKSByYWRpb0J1dHRvbnNbMF0uZ2V0RGF0YShUWVBFX0lEKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0xpYnJhcnlXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0xpYnJhcnlXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjczZmJmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlBlcnNwZWN0aXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEEgd2l6YXJkIHRoYXQgZ3VpZGVzIHRoZSB1c2VyIHRvIGNyZWF0ZSBhIG5ldyBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdMaWJyYXJ5V2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9JRCA9IE5ld0xpYnJhcnlXaXphcmQuY2xhc3MuZ2V0TmFtZSgpOwotCi0JLy8gVGhlIG1haW4gd2l6YXJkIHBhZ2UuCi0JcHJpdmF0ZSBOZXdMaWJyYXJ5TWFpblBhZ2UgbWFpblBhZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdMaWJyYXJ5V2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2V0V2luZG93VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeVdpemFyZF90aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJU2F2ZUFsbEVkaXRvcnNQYWdlLmFkZFBhZ2VJZk5lZWRlZCh0aGlzLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKTsKLQkJbWFpblBhZ2UgPSBuZXcgTmV3TGlicmFyeU1haW5QYWdlKCk7Ci0JCWFkZFBhZ2UobWFpblBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkiZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQl0cnkgewotCQkJU3RyaW5nIG5hbWUgPSBtYWluUGFnZS5nZXRMaWJyYXJ5TmFtZSgpOwotCQkJU3RyaW5nIGRlc2MgPSBtYWluUGFnZS5nZXRMaWJyYXJ5RGVzY3JpcHRpb24oKTsKLQkJCVN0cmluZyB0eXBlID0gbWFpblBhZ2UuZ2V0TGlicmFyeVR5cGUoKTsKLQkJCU1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJCUZpbGUgbGlicmFyeVBhdGggPSBuZXcgRmlsZShtYWluUGFnZS5nZXRMaWJyYXJ5UGF0aCgpKTsKLQkJCW9wdGlvbnMucHV0KFhNSUxpYnJhcnlNYW5hZ2VyLkFSR19MSUJSQVJZX1BBVEgsIGxpYnJhcnlQYXRoCi0JCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkKLQkJCWlmIChYTUlMaWJyYXJ5VXRpbAotCQkJCS5jb250YWluc1BsdWdpbk9yQ29uZmlnU3BlY0V4cG9ydEZpbGUobGlicmFyeVBhdGguZ2V0QWJzb2x1dGVQYXRoKCkpKSB7Ci0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlFcnJvcl9yZWFzb240KTsKLQkJCX0KLQkJCQotCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuY3JlYXRlTWV0aG9kTGlicmFyeShuYW1lLCB0eXBlLCBvcHRpb25zKTsKLQkJCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCQlpZiAoZGVzYy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJbGlicmFyeS5zZXRCcmllZkRlc2NyaXB0aW9uKGRlc2MpOwotCQkJCX0KLQkJCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5hZGROZXdMaWJyYXJ5UGF0aChsaWJyYXJ5UGF0aAotCQkJCQkJLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQlQZXJzcGVjdGl2ZVV0aWwKLQkJCQkJCS5vcGVuUGVyc3BlY3RpdmUoQXV0aG9yaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIHJlYXNvbiA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJaWYgKHJlYXNvbiA9PSBudWxsKSB7Ci0JCQkJcmVhc29uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeUludGVybmxFcnJvcl9yZWFzb247Ci0JCQl9Ci0JCQlyZWFzb24gKz0gIlxuXG4iICsgQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeUVycm9yX2FkdmljZTsgIC8vJE5PTi1OTFMtMSQKLQkJCWlmIChlLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeUVycm9yX21zZywgcmVhc29uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeUVycm9yX21zZywgcmVhc29uLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkMi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjIxZjcxNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuUGVyc3BlY3RpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5OZXdMaWJyYXJ5V2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLk5ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEEgd2l6YXJkIHRoYXQgZ3VpZGVzIHRoZSB1c2VyIHRvIGNyZWF0ZSBhIG5ldyBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdMaWJyYXJ5V2l6YXJkMiBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfSUQgPSBOZXdMaWJyYXJ5V2l6YXJkMi5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvLyBUaGUgbWFpbiB3aXphcmQgcGFnZS4KLQlwcml2YXRlIE5ld0xpYnJhcnlNYWluUGFnZSBtYWluUGFnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0xpYnJhcnlXaXphcmQyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2V0V2luZG93VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeVdpemFyZF90aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJU2F2ZUFsbEVkaXRvcnNQYWdlLmFkZFBhZ2VJZk5lZWRlZCh0aGlzLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKTsKLQkJbWFpblBhZ2UgPSBuZXcgTmV3TGlicmFyeU1haW5QYWdlKCk7Ci0JCWFkZFBhZ2UobWFpblBhZ2UpOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRMaWJyYXJ5VHlwZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgcGVyc2lzdGVuY2VJZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBwYWdlSWQgPSBwZXJzaXN0ZW5jZUlkICsgIlBhZ2UiOyAvLyROT04tTkxTLTEkCi0JCQlOZXdMaWJyYXJ5V2l6YXJkUGFnZSBwYWdlID0gTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5Ci0JCQkJCS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVdpemFyZFBhZ2UocGFnZUlkLCBwZXJzaXN0ZW5jZUlkKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlwYWdlLnNldEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvd2l6YmFuL05ldy5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQkJCQotCQkJCWFkZFBhZ2UocGFnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJc3VwZXIuY3JlYXRlUGFnZUNvbnRyb2xzKHBhZ2VDb250YWluZXIpOwotCQlwYWdlQ29udGFpbmVyLmdldFNoZWxsKCkuc2V0SW1hZ2UoCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCQkJImZ1bGwvb2JqMTYvTWV0aG9kTGlicmFyeS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCUlXaXphcmRQYWdlW10gcGFnZXMgPSBnZXRQYWdlcygpOwotCQlmb3IgKGludCBpID0gMTsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIXBhZ2VzW2ldLmlzUGFnZUNvbXBsZXRlKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCkgIT0gbWFpblBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCVN0cmluZyBuYW1lID0gbWFpblBhZ2UuZ2V0TGlicmFyeU5hbWUoKTsKLQkJU3RyaW5nIHR5cGUgPSBtYWluUGFnZS5nZXRMaWJyYXJ5VHlwZSgpOwotCQlOZXdMaWJyYXJ5V2l6YXJkUGFnZSBwYWdlID0gTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5LmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0V2l6YXJkUGFnZSh0eXBlKTsKLQkJdHJ5IHsKLQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmNyZWF0ZU1ldGhvZExpYnJhcnkobmFtZSwgdHlwZSwgcGFnZS5nZXRTZWxlY3Rpb25zKCkpOwotCQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJCWFkZFJlY2VudGx5T3BlbmVkTGlicmFyeShsaWJyYXJ5KTsKLQkJCQlQZXJzcGVjdGl2ZVV0aWwKLQkJCQkJCS5vcGVuUGVyc3BlY3RpdmUoQXV0aG9yaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIHJlYXNvbiA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJaWYgKHJlYXNvbiA9PSBudWxsKSB7Ci0JCQkJcmVhc29uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeUludGVybmxFcnJvcl9yZWFzb247Ci0JCQl9Ci0JCQlyZWFzb24gKz0gIlxuXG4iICsgQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeUVycm9yX2FkdmljZTsgIC8vJE5PTi1OTFMtMSQKLQkJCWlmIChlLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeUVycm9yX21zZywgcmVhc29uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeUVycm9yX21zZywgcmVhc29uLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbmV3bHkgb3BlbmVkIG9yIGNyZWF0ZWQgbWV0aG9kIGxpYnJhcnkgdG8gdGhlIHJlY2VudGx5IG9wZW5lZAotCSAqIG1ldGhvZCBsaWJyYXJpZXMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlY2VudGx5T3BlbmVkTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGxpYnJhcnlVUkkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldExpYnJhcnlNYW5hZ2VyKAotCQkJCQlsaWJyYXJ5KS5nZXRNZXRob2RMaWJyYXJ5VVJJKCkudG9TdHJpbmcoKTsKLQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzLmFkZE9wZW5MaWJyYXJ5VVJJKGxpYnJhcnlVUkkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdNZXRob2RQbHVnaW5XaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld01ldGhvZFBsdWdpbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTQ5Y2ZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld01ldGhvZFBsdWdpbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTW9kZWxTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEEgd2l6YXJkIHRoYXQgZ3VpZGVzIHRoZSB1c2VyIHRvIGNyZWF0ZSBhIG5ldyBNZXRob2QgUGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5ld01ldGhvZFBsdWdpbldpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfSUQgPSBOZXdNZXRob2RQbHVnaW5XaXphcmQuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIE5ld01ldGhvZFBsdWdpbldpemFyZFBhZ2UgbWFpblBhZ2U7Ci0KLQlwcml2YXRlIE1ldGhvZFBsdWdpbiBuZXdQbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdNZXRob2RQbHVnaW5XaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRXaW5kb3dUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5uZXdQbHVnaW5XaXphcmRfdGl0bGUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQltYWluUGFnZSA9IG5ldyBOZXdNZXRob2RQbHVnaW5XaXphcmRQYWdlKCk7Ci0JCWFkZFBhZ2UobWFpblBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkiZnVsbC9vYmoxNi9NZXRob2RQbHVnaW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NhbkZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY2FuRmluaXNoKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlTdHJpbmcgcGx1Z2luTmFtZSA9IG1haW5QYWdlLmdldFBsdWdpbk5hbWUoKTsKLQkJaWYgKHBsdWdpbk5hbWUgIT0gbnVsbCAmJiBwbHVnaW5OYW1lLmxlbmd0aCgpID4gMCkgewotCQkJdHJ5IHsKLQkJCQkvLyBDcmVhdGUgdGhlIG1ldGhvZCBwbHVnLWluIGFuZCBhZGQgaXQgdG8gdGhlIGN1cnJlbnQgbWV0aG9kCi0JCQkJLy8gbGlicmFyeS4KLQkJCQluZXdQbHVnaW4gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RQbHVnaW4oKTsKLQkJCQluZXdQbHVnaW4uc2V0TmFtZShTdHJVdGlsLm1ha2VWYWxpZEZpbGVOYW1lKHBsdWdpbk5hbWUpKTsKLQkJCQluZXdQbHVnaW4uc2V0QnJpZWZEZXNjcmlwdGlvbihtYWluUGFnZS5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCQkJCW5ld1BsdWdpbi5zZXRBdXRob3JzKG1haW5QYWdlLmdldEF1dGhvcnMoKSk7Ci0JCQkJT2JqZWN0W10gcmVmZXJlbmNlZFBsdWdpbnMgPSBtYWluUGFnZS5nZXRSZWZlcmVuY2VkUGx1Z2lucygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlZFBsdWdpbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHJlZmVyZW5jZWRQbHVnaW5zW2ldOwotCQkJCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCQkJCW5ld1BsdWdpbi5nZXRCYXNlcygpLmFkZChwbHVnaW4pOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQltYW5hZ2VyLmFkZE1ldGhvZFBsdWdpbihNb2RlbFN0b3JhZ2UuaW5pdGlhbGl6ZShuZXdQbHVnaW4pKTsKLQkJCQl9Ci0KLQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkvLyBTZWxlY3QgdGhlIG5ldyBNZXRob2QgUGx1Zy1pbiBpbiB0aGUgTGlicmFyeSB2aWV3LgotCQkJCQkJTGlzdCBzZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlzZWxlY3Rpb24uYWRkKG5ld1BsdWdpbik7Ci0JCQkJCQlMaWJyYXJ5Vmlldy5nZXRWaWV3KCkuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoc2VsZWN0aW9uKTsKLQotCQkJCQkJLy8gT3BlbiB0aGUgZWRpdG9yIGZvciBuZXdseSBjcmVhdGVkIHBsdWctaW4uCi0JCQkJCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkub3BlbkVkaXRvcihuZXdQbHVnaW4pOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIHJlYXNvbiA9IGUuZ2V0TWVzc2FnZSgpICE9IG51bGwgPyBlLmdldE1lc3NhZ2UoKSA6IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbkVycm9yX3JlYXNvbjsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3UGx1Z2luV2l6YXJkX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdQbHVnaW5FcnJvcl9tc2csIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJcmVhc29uLAotCQkJCQkJZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld01ldGhvZFBsdWdpbldpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld01ldGhvZFBsdWdpbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWFkNmY0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdNZXRob2RQbHVnaW5XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTW9kZWxTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gZW50ZXIgYSBuYW1lIGFuZCBkZXNjcmlwdGlvbiBmb3IgYSBuZXcKLSAqIE1ldGhvZCBQbHVnLWluLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTmV3TWV0aG9kUGx1Z2luV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBOZXdNZXRob2RQbHVnaW5XaXphcmRQYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBUZXh0IG5hbWVUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IGJyaWVmRGVzY1RleHQ7Ci0KLQlwcml2YXRlIFRleHQgYXV0aG9yc1RleHQ7Ci0KLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgcmVmZXJlbmNlZFBsdWdpbnNWaWV3ZXI7Ci0KLQlwcml2YXRlIExpc3QgcGx1Z2luczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld01ldGhvZFBsdWdpbldpemFyZFBhZ2UoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbldpemFyZFBhZ2VfdGl0bGUpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbldpemFyZFBhZ2VfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL05ldy5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJR3JpZERhdGEgbGFiZWxHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlMYWJlbCBuYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW5hbWVMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5OQU1FX1RFWFQpOwotCQluYW1lVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCS8vIFRPRE86IFByb3ZpZGUgYSB1bmlxdWUgZGVmYXVsdCBwbHVnLWluIG5hbWUuCi0JCW5hbWVUZXh0LnNldFRleHQoIm5ld19wbHVnLWluIik7IC8vJE5PTi1OTFMtMSQKLQkJbmFtZVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJTGFiZWwgYnJpZWZEZXNjTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWJyaWVmRGVzY0xhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkJSSUVGX0RFU0NSSVBUSU9OX1RFWFQpOwotCQlicmllZkRlc2NMYWJlbC5zZXRMYXlvdXREYXRhKGxhYmVsR3JpZERhdGEpOwotCQlicmllZkRlc2NUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULldSQVAKLQkJCQl8IFNXVC5WX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGJyaWVmRGVzY0dyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWJyaWVmRGVzY0dyaWREYXRhLmhlaWdodEhpbnQgPSA3MDsKLQkJYnJpZWZEZXNjVGV4dC5zZXRMYXlvdXREYXRhKGJyaWVmRGVzY0dyaWREYXRhKTsKLQotCQlMYWJlbCBhdXRob3JzTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWF1dGhvcnNMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5BVVRIT1JTX1RFWFQpOwotCQlhdXRob3JzTGFiZWwuc2V0TGF5b3V0RGF0YShsYWJlbEdyaWREYXRhKTsKLQkJYXV0aG9yc1RleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMKTsKLQkJR3JpZERhdGEgYXV0aG9yc0dyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWF1dGhvcnNHcmlkRGF0YS5oZWlnaHRIaW50ID0gMzU7Ci0JCWF1dGhvcnNUZXh0LnNldExheW91dERhdGEoYXV0aG9yc0dyaWREYXRhKTsKLQotCQlMYWJlbCByZWZlcmVuY2VkUGx1Z2luc0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlyZWZlcmVuY2VkUGx1Z2luc0xhYmVsCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LlJFRkVSRU5DRURfUExVR0lOU19TRUNUSU9OX05BTUUpOwotCQlyZWZlcmVuY2VkUGx1Z2luc0xhYmVsLnNldExheW91dERhdGEobGFiZWxHcmlkRGF0YSk7Ci0JCXBsdWdpbnMgPSBNb2RlbFN0b3JhZ2UuZ2V0QmFzZU1vZGVscygpOwotCQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbcGx1Z2lucy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZFBsdWdpbiBtb2RlbCA9IChNZXRob2RQbHVnaW4pIHBsdWdpbnMuZ2V0KGkpOwotCQkJaXRlbXNbaV0gPSBtb2RlbC5nZXROYW1lKCk7Ci0JCX0KLQkJcmVmZXJlbmNlZFBsdWdpbnNWaWV3ZXIgPSBDaGVja2JveFRhYmxlVmlld2VyLm5ld0NoZWNrTGlzdChjb21wb3NpdGUsCi0JCQkJU1dULkJPUkRFUiB8IFNXVC5GSUxMIHwgU1dULkhPUklaT05UQUwpOwotCQlHcmlkRGF0YSByZWZlcmVuY2VkUGx1Z2luc0dyaWREYXRhID0gbmV3IEdyaWREYXRhKAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXJlZmVyZW5jZWRQbHVnaW5zR3JpZERhdGEuaGVpZ2h0SGludCA9IDE1MDsKLQkJcmVmZXJlbmNlZFBsdWdpbnNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKAotCQkJCXJlZmVyZW5jZWRQbHVnaW5zR3JpZERhdGEpOwotCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX1BMVUdJTjsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJcmV0dXJuICgoTWV0aG9kUGx1Z2luKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQotCQlyZWZlcmVuY2VkUGx1Z2luc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCi0JCWlmIChwbHVnaW5zICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCXJlZmVyZW5jZWRQbHVnaW5zVmlld2VyLmFkZChpdC5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCi0JCS8vIEdldCB0aGUgcGFyZW50IHNoZWxsLgotCQlTaGVsbCBzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCi0JCW5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCQluYW1lVGV4dC5hZGRMaXN0ZW5lcihTV1QuRm9jdXNPdXQsIHRoaXMpOwotCi0JCURpc3BsYXkgZGlzcGxheSA9IHNoZWxsLmdldERpc3BsYXkoKTsKLQkJaWYgKGRpc3BsYXkgIT0gbnVsbCAmJiAhZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCW5hbWVUZXh0LnNldEZvY3VzKCk7Ci0JCQkJCW5hbWVUZXh0LnNldFNlbGVjdGlvbigwLCBuYW1lVGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IG5hbWVUZXh0KSB7Ci0JCQl2YWxpZGF0ZU5hbWUoKTsKLQkJfQotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGUgcGx1Zy1pbiBuYW1lLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmFtZSgpIHsKLQkJYm9vbGVhbiBhbnN3ZXI7Ci0KLQkJU3RyaW5nIG1zZyA9IExpYnJhcnlVdGlsLmNoZWNrUGx1Z2luTmFtZShudWxsLCBnZXRQbHVnaW5OYW1lKCkpOwotCQlpZiAobXNnID09IG51bGwpIHsKLQkJCWFuc3dlciA9IHRydWU7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlzZXRNZXNzYWdlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbldpemFyZFBhZ2VfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCWFuc3dlciA9IGZhbHNlOwotCQkJaW50IGlkeCA9IG1zZy5pbmRleE9mKCInLiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaWR4ID49IDApCi0JCQkJbXNnID0gbXNnLnN1YnN0cmluZyhpZHggKyAzKTsKLQkJCS8vIENoZWNrIGZvciBJVVBMMDEwMUUgaW4gdGhlIG1zZywgaW4gb3JkZXIgdG8gZGlzcGxheSBlcnJvciBtc2csCi0JCQkvLyBXaGljaCBmaXRzIGluIGVycm9yIG1lc3NhZ2UgYXJlYSBvZiB0aGUgd2l6YXJkLiAKLQkJCWludCBpID0gbXNnLmluZGV4T2YoIklVUEwwMTAxRSIpOyAvLyROT04tTkxTLTEkCi0JCQlpZihpPj0wKXsKLQkJCQltc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmR1cGxpY2F0ZVBsdWdpbk5hbWVFcnJvcl9tc2csIGdldFBsdWdpbk5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXNldEVycm9yTWVzc2FnZShtc2cpOwotCQkJc2V0TWVzc2FnZShudWxsKTsKLQkJfQotCi0JCXJldHVybiBhbnN3ZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCXJldHVybiBpc1RleHROb25FbXB0eShuYW1lVGV4dCkgJiYgZ2V0RXJyb3JNZXNzYWdlKCkgPT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIFRleHQgY29udHJvbCBjb250YWlucyBhIHZsYWlkIHRleHQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RleHROb25FbXB0eShUZXh0IHQpIHsKLQkJU3RyaW5nIHRleHQgPSB0LmdldFRleHQoKTsKLQkJcmV0dXJuIHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGgoKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBmb3IgdGhlIHBsdWctaW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5OYW1lKCkgewotCQlyZXR1cm4gbmFtZVRleHQuZ2V0VGV4dCgpICE9IG51bGwgPyBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBicmllZiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJyaWVmRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBicmllZkRlc2NUZXh0LmdldFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhdXRob3JzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9ycygpIHsKLQkJcmV0dXJuIGF1dGhvcnNUZXh0LmdldFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2VkIHBsdWctaW5zLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRSZWZlcmVuY2VkUGx1Z2lucygpIHsKLQkJcmV0dXJuIHJlZmVyZW5jZWRQbHVnaW5zVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OTY1MzFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL09wZW5Db25maWd1cmF0aW9uTWFpblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IGEgTWV0aG9kIENvbmZpZ3VyYXRpb24gdG8gb3Blbi4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzCi0JCUlDaGVja1N0YXRlTGlzdGVuZXIsIExpc3RlbmVyIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IE9wZW5Db25maWd1cmF0aW9uTWFpblBhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0KLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCi0JcHJpdmF0ZSBpbnQgY2hlY2tlZENvdW50ID0gMDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE9wZW5Db25maWd1cmF0aW9uTWFpblBhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmcgdGl0bGUsCi0JCQlJbWFnZURlc2NyaXB0b3IgdGl0bGVJbWFnZSkgewotCQlzdXBlcihwYWdlTmFtZSwgdGl0bGUsIHRpdGxlSW1hZ2UpOwotCQlzZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb24pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXIjY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdCBvYmogPSBldmVudC5nZXRFbGVtZW50KCk7Ci0KLQkJT3BlbkNvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkID0gKE9wZW5Db25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKTsKLQkJaWYgKGV2ZW50LmdldENoZWNrZWQoKSkgewotCQkJY2hlY2tlZENvdW50Kys7Ci0JCQl3aXphcmQuY29uZmlndXJhdGlvbnMuYWRkKG9iaik7Ci0JCX0gZWxzZSB7Ci0JCQljaGVja2VkQ291bnQtLTsKLQkJCXdpemFyZC5jb25maWd1cmF0aW9ucy5yZW1vdmUob2JqKTsKLQkJfQotCi0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQoRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlPcGVuQ29uZmlndXJhdGlvbldpemFyZCB3aXphcmQgPSAoT3BlbkNvbmZpZ3VyYXRpb25XaXphcmQpIGdldFdpemFyZCgpOwotCi0JCWlmIChjaGVja2VkQ291bnQgPiAwKSB7Ci0JCQl3aXphcmQub2tUb0NvbXBsZXRlID0gdHJ1ZTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJd2l6YXJkLm9rVG9Db21wbGV0ZSA9IGZhbHNlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIGNvbXBvc2l0ZSB0byBob2xkIHRoZSB3aWRnZXRzLgotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvLyBDcmVhdGUgdGhlIGRlc2lyZWQgbGF5b3V0IGZvciB0aGlzIHdpemFyZCBwYWdlLgotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0KLQkJLy8gQWRkIGFuIGVtcHR5IGxpbmUgZmlyc3QuCi0JCUxhYmVsIGVtcHR5TGluZSA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZW1wdHlMaW5lLnNldFRleHQoIiAgICIpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORwotCQkJCQl8IEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQllbXB0eUxpbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiICAgIik7IC8vJE5PTi1OTFMtMSQKLQotCQl0YWJsZSA9IG5ldyBUYWJsZShjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORwotCQkJCQl8IEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMzAwOwotCQkJdGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJdGFibGVWaWV3ZXIgPSBuZXcgQ2hlY2tib3hUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IENvbmZpZ3VyYXRpb25UYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25zKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQoY29uZmlncyk7Ci0KLQkJdGFibGVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIFNldCB0aGUgY29tcG9zaXRlIGFzIHRoZSBjb250cm9sIGZvciB0aGlzIHBhZ2UuCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL09wZW5Db25maWd1cmF0aW9uV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9PcGVuQ29uZmlndXJhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NjM5MmFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL09wZW5Db25maWd1cmF0aW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotCi0vKioKLSAqIEEgd2l6YXJkIHRoYXQgZ3VpZGVzIHRoZSB1c2VyIHRvIG9wZW4gYSBNZXRob2QgQ29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuQ29uZmlndXJhdGlvbldpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JcHJvdGVjdGVkIE9wZW5Db25maWd1cmF0aW9uTWFpblBhZ2UgbWFpblBhZ2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBva1RvQ29tcGxldGUgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBMaXN0IGNvbmZpZ3VyYXRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE9wZW5Db25maWd1cmF0aW9uV2l6YXJkKExpc3QgY29uZmlndXJhdGlvbnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb25maWd1cmF0aW9ucyA9IGNvbmZpZ3VyYXRpb25zOwotCQlzZXRXaW5kb3dUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbldpemFyZF93aW5kb3dUaXRsZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBPcGVuQ29uZmlndXJhdGlvbldpemFyZCgpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJbWFpblBhZ2UgPSBuZXcgT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZSgKLQkJCQlPcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlLlBBR0VfTkFNRSwgbnVsbCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkUGFnZShtYWluUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJcmV0dXJuIG9rVG9Db21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUNhbmNlbCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpIHsKLQkJaWYgKGNvbmZpZ3VyYXRpb25zICE9IG51bGwpCi0JCQljb25maWd1cmF0aW9ucy5jbGVhcigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1NhdmVBbGxFZGl0b3JzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU2F2ZUFsbEVkaXRvcnNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZmZTYxZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU2F2ZUFsbEVkaXRvcnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklQYWdlQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUGFnZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IGxpc3RzIHRoZSBjdXJyZW50bHkgb3BlbiBlZGl0b3JzIGFuZCBwcm9tcHRzIHRoZSB1c2VyIHRvCi0gKiBzYXZlIHRoZW0gYmVmb3JlIHBlcmZvcm1pbmcgYW4gaW1wb3J0IG9yIGV4cG9ydCBvcGVyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlQWxsRWRpdG9yc1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9BTkRfQ0xPU0VfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlVGl0bGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9BTkRfQ0xPU0VfUEFHRV9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VEZXNjcmlwdGlvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZVRpdGxlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfUEFHRV9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVEZXNjcmlwdGlvbjsKLQotCXByaXZhdGUgYm9vbGVhbiBkb0Nsb3NlOwotCi0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIGN0cmxfY2hrYm94VGFibGVWaWV3ZXI7Ci0KLQlwcml2YXRlIEJ1dHRvbiBzZWxlY3RBbGw7Ci0KLQlwcml2YXRlIEJ1dHRvbiBkZXNlbGVjdEFsbDsKLQotCS8qKgotCSAqIEFkZHMgdGhpcyB3aXphcmQgcGFnZSB0byBhIHdpemFyZCBvbmx5IHdoZW4gbmVjZXNzYXJ5LgotCSAqIAotCSAqIEBwYXJhbSB3aXphcmQKLQkgKiAgICAgICAgICAgIFRoZSB3aXphcmQgd2hpY2ggdGhpcyBwYWdlIG1pZ2h0IGJlIGFkZGVkLgotCSAqIEBwYXJhbSBkb0Nsb3NlCi0JICogICAgICAgICAgICBJZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhpcyBwYWdlIHdpbGwgYmUgYWRkZWQgaWZmIHRoZXJlIGFyZQotCSAqICAgICAgICAgICAgb3BlbiBlZGl0b3JzLiBJZiA8Y29kZT5mYWxzZTwvY29kZT4sIHRoaXMgcGFnZSB3aWxsIGJlCi0JICogICAgICAgICAgICBhZGRlZCBpZmYgdGhlcmUgYXJlIGRpcnR5IGVkaXRvcnMuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGFnZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSB3aXphcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZFBhZ2VJZk5lZWRlZChXaXphcmQgd2l6YXJkLCBib29sZWFuIGRvQ2xvc2UpIHsKLQkJaWYgKGlzVW5zYXZlZEVkaXRvcihkb0Nsb3NlKSkgewotCQkJd2l6YXJkLmFkZFBhZ2UobmV3IFNhdmVBbGxFZGl0b3JzUGFnZShkb0Nsb3NlKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoaXMgd2l6YXJkIHBhZ2UgdG8gYSB3aXphcmQgb25seSB3aGVuIG5lY2Vzc2FyeS4KLQkgKiAKLQkgKiBAcGFyYW0gd2l6YXJkCi0JICogICAgICAgICAgICBUaGUgd2l6YXJkIHdoaWNoIHRoaXMgcGFnZSBtaWdodCBiZSBhZGRlZC4KLQkgKiBAcGFyYW0gZG9DbG9zZQotCSAqICAgICAgICAgICAgSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoaXMgcGFnZSB3aWxsIGJlIGFkZGVkIGlmZiB0aGVyZSBhcmUKLQkgKiAgICAgICAgICAgIG9wZW4gZWRpdG9ycy4gSWYgPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGlzIHBhZ2Ugd2lsbCBiZQotCSAqICAgICAgICAgICAgYWRkZWQgaWZmIHRoZXJlIGFyZSBkaXJ0eSBlZGl0b3JzLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBhZ2Ugd2lsbCBiZSBhZGRlZCB0byB0aGUgd2l6YXJkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRQYWdlSWZOZWVkZWQoV2l6YXJkIHdpemFyZCwgYm9vbGVhbiBkb0Nsb3NlLAotCQkJU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24sIEltYWdlRGVzY3JpcHRvciBpbWFnZSkgewotCi0JCWlmIChpc1Vuc2F2ZWRFZGl0b3IoZG9DbG9zZSkpIHsKLQkJCVNhdmVBbGxFZGl0b3JzUGFnZSBwYWdlID0gbmV3IFNhdmVBbGxFZGl0b3JzUGFnZShkb0Nsb3NlKTsKLQkJCWlmICh0aXRsZSAhPSBudWxsKSB7Ci0JCQkJcGFnZS5zZXRUaXRsZSh0aXRsZSk7Ci0JCQl9Ci0JCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCXBhZ2Uuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCQkJfQotCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQlwYWdlLnNldEltYWdlRGVzY3JpcHRvcihpbWFnZSk7Ci0JCQl9Ci0JCQl3aXphcmQuYWRkUGFnZShwYWdlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGludGFuY2UuCi0JICovCi0JcHVibGljIFNhdmVBbGxFZGl0b3JzUGFnZShib29sZWFuIGNsb3NlKSB7Ci0JCXN1cGVyKFNBVkVfUEFHRV9USVRMRSk7Ci0JCXRoaXMuZG9DbG9zZSA9IGNsb3NlOwotCQlpZiAoZG9DbG9zZSkgewotCQkJc2V0VGl0bGUoU0FWRV9BTkRfQ0xPU0VfUEFHRV9USVRMRSk7Ci0JCQlzZXREZXNjcmlwdGlvbihTQVZFX0FORF9DTE9TRV9QQUdFX0RFU0MpOwotCQl9IGVsc2UgewotCQkJc2V0VGl0bGUoU0FWRV9QQUdFX1RJVExFKTsKLQkJCXNldERlc2NyaXB0aW9uKFNBVkVfUEFHRV9ERVNDKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QoY29udGFpbmVyLAotCQkJCVNXVC5CT1JERVIgfCBTV1QuRklMTCB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEoCi0JCQkJbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCi0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmID0gKElFZGl0b3JSZWZlcmVuY2UpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIHJlZi5nZXRFZGl0b3IoZmFsc2UpLmdldFRpdGxlKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmID0gKElFZGl0b3JSZWZlcmVuY2UpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIHJlZi5nZXRFZGl0b3IoZmFsc2UpLmdldFRpdGxlSW1hZ2UoKTsKLQkJCX0KLQkJfSk7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRJbnB1dChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCkpOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLmFkZEZpbHRlcihuZXcgVmlld2VyRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUVkaXRvclJlZmVyZW5jZSkgewotCQkJCQlpZiAoKChJRWRpdG9yUmVmZXJlbmNlKWVsZW1lbnQpLmlzRGlydHkoKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0pOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbkNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSkpOwotCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkRFRkFVTFQsIFNXVC5CRUdJTk5JTkcsCi0JCQkJZmFsc2UsIHRydWUpKTsKLQotCQlzZWxlY3RBbGwgPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOwotCQlzZWxlY3RBbGwKLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfU2VsZWN0QWxsQnV0dG9uTGFiZWwpOwotCQlzZWxlY3RBbGwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIGZhbHNlLAotCQkJCXRydWUpKTsKLQotCQlkZXNlbGVjdEFsbCA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCWRlc2VsZWN0QWxsCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX0Rlc2VsZWN0QWxsQnV0dG9uTGFiZWwpOwotCQlkZXNlbGVjdEFsbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgZmFsc2UsCi0JCQkJdHJ1ZSkpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWZyZXNoICgpIHsKLQkJaWYgKGN0cmxfY2hrYm94VGFibGVWaWV3ZXIgIT0gbnVsbCkgewotCQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQlpZiAoY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRUYWJsZSgpICE9IG51bGwpIHsKLQkJCQlpZiAoY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCkgIT0gbnVsbCkgewotCQkJCQlpZiAoY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCkubGVuZ3RoID09IDApIHsKLQkJCQkJCWlmIChjdHJsX2Noa2JveFRhYmxlVmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsKQotCQkJCQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJc2VsZWN0QWxsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJZGVzZWxlY3RBbGwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJaWYgKGdldFdpemFyZCgpICE9IG51bGwpIHsKLQkJCUlXaXphcmRDb250YWluZXIgY29udGFpbmVyID0gZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCk7Ci0JCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgV2l6YXJkRGlhbG9nKSB7Ci0JCQkJKChXaXphcmREaWFsb2cpY29udGFpbmVyKS5hZGRQYWdlQ2hhbmdlZExpc3RlbmVyKG5ldyBJUGFnZUNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgcGFnZUNoYW5nZWQoUGFnZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJcmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQkJc2VsZWN0QWxsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJZGVzZWxlY3RBbGwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtIG91ciBzYXZlIChhbmQgcG9zc2libHkgY2xvc2UpIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJT2JqZWN0W10gY2hlY2tlZEFycmF5ID0gY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja2VkQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5zYXZlRWRpdG9yKAotCQkJCQkJCSgoSUVkaXRvclJlZmVyZW5jZSkgY2hlY2tlZEFycmF5W2ldKQotCQkJCQkJCQkJLmdldEVkaXRvcihmYWxzZSksIGZhbHNlKTsKLQkJfQotCQlpZiAoZG9DbG9zZSkKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5jbG9zZUFsbEVkaXRvcnMoZmFsc2UpOwotCi0JCXJldHVybiBzdXBlci5nZXROZXh0UGFnZSgpOwotCX0KLQotCS8qKgotCSAqIENoZWNrZWQgd2hldGhlciB0aGVyZSBpcyBhbnkgdW5zYXZlZCBlZGl0b3Igb3BlbgotCSAqIAotCSAqIEBwYXJhbSBkb0Nsb3NlCi0JICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGFuIHVuc2F2ZWQgZWRpdG9yIG9wZW4KLQkgKiAJdHJ1ZSBpZiBkb0Nsb3NlIGlzIHRydWUgYW5kIHRoZXJlIGlzIGFuIG9wZW4gZWRpdG9yCi0JICogIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVbnNhdmVkRWRpdG9yKGJvb2xlYW4gZG9DbG9zZSkgewotCQlib29sZWFuIGFuRWRpdG9ySXNEaXJ0eSA9IGZhbHNlOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gbGlzdCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobGlzdFtpXS5pc0RpcnR5KCkpIHsKLQkJCQlhbkVkaXRvcklzRGlydHkgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiAoYW5FZGl0b3JJc0RpcnR5IHx8IGRvQ2xvc2UgJiYgbGlzdC5sZW5ndGggPiAwKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCXJldHVybiAhaXNVbnNhdmVkRWRpdG9yKGRvQ2xvc2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbkNob2ljZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbkNob2ljZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWQ1M2EyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25DaG9pY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLQotLyoqCi0gKiBJdCBzdG9yZXMgYW5kIG1hbmFnZXMgYWxsIGNob2ljZXMgZm9yIHN5bmNocm9uaXphdGlvbgotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6YXRpb25DaG9pY2VzIHsKLQotCXB1YmxpYyBzdGF0aWMgaW50IFNZTkNfTk9ORSA9IDA7Ci0JcHVibGljIHN0YXRpYyBpbnQgU1lOQ19GUk9NX0NPTkVUTlQgPSAxOwotCXB1YmxpYyBzdGF0aWMgaW50IFNZTkNfRlJPTV9QUk9DRVNTID0gMjsKLQkKLQlwcml2YXRlIFByb2Nlc3Mgc2VsZWN0ZWRQcm9jZXNzOwotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBzZWxlY3RlZENvbmZpZzsKLQlwcml2YXRlIGludCBzeW5jTmFtZT0gU1lOQ19GUk9NX0NPTkVUTlQ7Ci0JcHJpdmF0ZSBpbnQgc3luY1ByZXNOYW1lPSBTWU5DX0ZST01fQ09ORVROVDsKLQlwcml2YXRlIGludCBzeW5jQnJpZWZEZXNjPSBTWU5DX0ZST01fQ09ORVROVDsKLQlwcml2YXRlIGludCBzeW5jT3B0SW5wdXQ9IFNZTkNfRlJPTV9DT05FVE5UOwotCXByaXZhdGUgaW50IHN5bmNNYW5JbnB1dD0gU1lOQ19GUk9NX0NPTkVUTlQ7Ci0JcHJpdmF0ZSBpbnQgc3luY091dHB1dD0gU1lOQ19GUk9NX0NPTkVUTlQ7Ci0JcHJpdmF0ZSBpbnQgc3luY1ByaW1QZXJmb3JtZXI9IFNZTkNfRlJPTV9DT05FVE5UOwotCXByaXZhdGUgaW50IHN5bmNBZGRuUGVyZm9ybWVyPSBTWU5DX0ZST01fQ09ORVROVDsKLQlwcml2YXRlIGludCBzeW5jUmVzcFJvbGU9IFNZTkNfRlJPTV9DT05FVE5UOwotCXByaXZhdGUgaW50IHN5bmNDb250QXJ0aWZhY3Q9IFNZTkNfRlJPTV9DT05FVE5UOwotCXByaXZhdGUgaW50IHN5bmNEZWxpdlBhcnQ9IFNZTkNfRlJPTV9DT05FVE5UOwotCXByaXZhdGUgaW50IHN5bmNTZWxTdGVwPSBTWU5DX0ZST01fQ09ORVROVDsKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbmlzaFByZXNzZWQ7Ci0KLQkvKioKLQkgKiBHZXQgc2VsZWN0ZWQgcHJvY2VzcwotCSAqLwotCXB1YmxpYyBQcm9jZXNzIGdldFNlbGVjdGVkUHJvY2VzcygpIHsKLQkJcmV0dXJuIHNlbGVjdGVkUHJvY2VzczsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgc2VsZWN0ZWQgcHJvY2VzcwotCSAqIEBwYXJhbSBzZWxlY3RlZFByb2Nlc3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZFByb2Nlc3MoUHJvY2VzcyBzZWxlY3RlZFByb2Nlc3MpIHsKLQkJdGhpcy5zZWxlY3RlZFByb2Nlc3MgPSBzZWxlY3RlZFByb2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogR2V0IHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0U2VsZWN0ZWRDb25maWcoKSB7Ci0JCXJldHVybiBzZWxlY3RlZENvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gc2VsZWN0ZWRDb25maWcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZENvbmZpZyhNZXRob2RDb25maWd1cmF0aW9uIHNlbGVjdGVkQ29uZmlnKSB7Ci0JCXRoaXMuc2VsZWN0ZWRDb25maWcgPSBzZWxlY3RlZENvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3B0aW9uIG9mIHN5bmNocm9uaXppbmcgY29udGFpbmVkIGFydGlmYWN0cwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY0NvbnRBcnRpZmFjdCgpIHsKLQkJcmV0dXJuIHN5bmNDb250QXJ0aWZhY3Q7Ci0JfQotCi0JLyoqCi0JICogU2V0IG9wdGlvbiBmb3Igc3luY2hyb25pemluZyBjb250YWluZWQgYXJ0aWZhY3RzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY0NvbnRBcnRpZmFjdChpbnQgc3luY0NvbnRBcnRpZmFjdCkgewotCQl0aGlzLnN5bmNDb250QXJ0aWZhY3QgPSBzeW5jQ29udEFydGlmYWN0OwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBkZWxpdmVyYWJsZSBwYXJ0cwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY0RlbGl2UGFydCgpIHsKLQkJcmV0dXJuIHN5bmNEZWxpdlBhcnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IG9wdGlvbiBmb3Igc3luY2hyb25pemluZyBkZWxpdmVyYWJsZSBwYXJ0cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNEZWxpdlBhcnQoaW50IHN5bmNEZWxpdlBhcnQpIHsKLQkJdGhpcy5zeW5jRGVsaXZQYXJ0ID0gc3luY0RlbGl2UGFydDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3B0aW9uIG9mIHN5bmNocm9uaXppbmcgbWFuZGF0b3J5IGlucHV0Ci0JICovCi0JcHVibGljIGludCBnZXRTeW5jTWFuSW5wdXQoKSB7Ci0JCXJldHVybiBzeW5jTWFuSW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IG9wdGlvbiBmb3Igc3luY2hyb25pemluZyBtYW5kYXRvcnkgaW5wdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jTWFuSW5wdXQoaW50IHN5bmNNYW5JbnB1dCkgewotCQl0aGlzLnN5bmNNYW5JbnB1dCA9IHN5bmNNYW5JbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3B0aW9uIG9mIHN5bmNocm9uaXppbmcgb3B0aW9uYWwgaW5wdXQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN5bmNPcHRJbnB1dCgpIHsKLQkJcmV0dXJuIHN5bmNPcHRJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgb3B0aW9uIGZvciBzeW5jaHJvbml6aW5nIG9wdGlvbmFsIGlucHV0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY09wdElucHV0KGludCBzeW5jT3B0SW5wdXQpIHsKLQkJdGhpcy5zeW5jT3B0SW5wdXQgPSBzeW5jT3B0SW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIG91dHB1dAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY091dHB1dCgpIHsKLQkJcmV0dXJuIHN5bmNPdXRwdXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IG9wdGlvbiBmb3Igc3luY2hyb25pemluZyBvdXRwdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jT3V0cHV0KGludCBzeW5jT3V0cHV0KSB7Ci0JCXRoaXMuc3luY091dHB1dCA9IHN5bmNPdXRwdXQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIHByZXNlbnRhdGlvbiBuYW1lCi0JICovCi0JcHVibGljIGludCBnZXRTeW5jUHJlc05hbWUoKSB7Ci0JCXJldHVybiBzeW5jUHJlc05hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0IG9wdGlvbiBmb3Igc3luY2hyb25pemluZyBwcmVzZXRuYXRpb24gbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNQcmVzTmFtZShpbnQgc3luY1ByZXNOYW1lKSB7Ci0JCXRoaXMuc3luY1ByZXNOYW1lID0gc3luY1ByZXNOYW1lOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyByZXNwb25zaWJsZSByb2xlCi0JICovCi0JcHVibGljIGludCBnZXRTeW5jUmVzcFJvbGUoKSB7Ci0JCXJldHVybiBzeW5jUmVzcFJvbGU7Ci0JfQotCi0JLyoqCi0JICogU2V0IG9wdGlvbiBmb3Igc3luY2hyb25pemluZyByZXNwb25zaWJsZSByb2xlCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY1Jlc3BSb2xlKGludCBzeW5jUmVzcFJvbGUpIHsKLQkJdGhpcy5zeW5jUmVzcFJvbGUgPSBzeW5jUmVzcFJvbGU7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIHN0ZXBzCi0JICovCi0JcHVibGljIGludCBnZXRTeW5jU2VsU3RlcCgpIHsKLQkJcmV0dXJuIHN5bmNTZWxTdGVwOwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgc3RlcHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jU2VsU3RlcChpbnQgc3luY1NlbFN0ZXApIHsKLQkJdGhpcy5zeW5jU2VsU3RlcCA9IHN5bmNTZWxTdGVwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB3aXphcmQgaXMgY29tcGxldGVkIG9yIG5vdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmluaXNoUHJlc3NlZCgpIHsKLQkJcmV0dXJuIGlzRmluaXNoUHJlc3NlZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgb3B0aW9uIGJhc2VkIG9uIHdpemFyZCBpbiBjb21wbGV0ZWQgb3Igbm90Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RmluaXNoUHJlc3NlZChib29sZWFuIGlzRmluaXNoUHJlc3NlZCkgewotCQl0aGlzLmlzRmluaXNoUHJlc3NlZCA9IGlzRmluaXNoUHJlc3NlZDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3B0aW9uIG9mIHN5bmNocm9uaXppbmcgYWRkaXRpb25hbCBwZXJmb3JtZXIKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN5bmNBZGRuUGVyZm9ybWVyKCkgewotCQlyZXR1cm4gc3luY0FkZG5QZXJmb3JtZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0IG9wdGlvbiBmb3Igc3luY2hyb25pemluZyBhZGRpdGlvbmFsIHBlcmZvcm1lcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNBZGRuUGVyZm9ybWVyKGludCBzeW5jQWRkblBlcmZvcm1lcikgewotCQl0aGlzLnN5bmNBZGRuUGVyZm9ybWVyID0gc3luY0FkZG5QZXJmb3JtZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIHByaW1hcnkgcGVyZm9ybWVyCi0JICovCi0JcHVibGljIGludCBnZXRTeW5jUHJpbVBlcmZvcm1lcigpIHsKLQkJcmV0dXJuIHN5bmNQcmltUGVyZm9ybWVyOwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgcHJpbWFyeSBwZXJmb3JtZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jUHJpbVBlcmZvcm1lcihpbnQgc3luY1ByaW1QZXJmb3JtZXIpIHsKLQkJdGhpcy5zeW5jUHJpbVBlcmZvcm1lciA9IHN5bmNQcmltUGVyZm9ybWVyOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIGFsbCBzeW5jaHJvbml6YXRpb24gb3B0aW9ucy9jaG9pY2VzCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCi0JCVN0cmluZ0J1ZmZlciBzYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYnVmLmFwcGVuZCgiW1Byb2Nlc3M6IiArICgoc2VsZWN0ZWRQcm9jZXNzICE9IG51bGwpP3NlbGVjdGVkUHJvY2Vzcy5nZXROYW1lKCk6Im51bGwiKSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXNidWYuYXBwZW5kKCJDb25maWd1cmF0aW9uOiIgKyAoKHNlbGVjdGVkQ29uZmlnICE9IG51bGwpP3NlbGVjdGVkQ29uZmlnLmdldE5hbWUoKToibnVsbCIpICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJc2J1Zi5hcHBlbmQoIk5hbWU6IiArIHN5bmNOYW1lICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJQcmVzTmFtZToiICsgc3luY1ByZXNOYW1lICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJCcmVpZkRlc2M6IiArIHN5bmNCcmllZkRlc2MgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2J1Zi5hcHBlbmQoIk9wdElucHV0OiIgKyBzeW5jT3B0SW5wdXQgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2J1Zi5hcHBlbmQoIk1hbklucHV0OiIgKyBzeW5jTWFuSW5wdXQgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2J1Zi5hcHBlbmQoIk91dHB1dDoiICsgc3luY091dHB1dCArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzYnVmLmFwcGVuZCgiUHJpbVBlcmZvcm1lcjoiICsgc3luY1ByaW1QZXJmb3JtZXIgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2J1Zi5hcHBlbmQoIkFkZG5QZXJmb3JtZXJzOiIgKyBzeW5jQWRkblBlcmZvcm1lciArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzYnVmLmFwcGVuZCgiUmVzcFJvbGU6IiArIHN5bmNSZXNwUm9sZSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzYnVmLmFwcGVuZCgiQ29udEFydGlmYWN0OiIgKyBzeW5jQ29udEFydGlmYWN0ICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJEZWxpdlBhcnQ6IiArIHN5bmNEZWxpdlBhcnQgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2J1Zi5hcHBlbmQoIlNlbFN0ZXA6IiArIHN5bmNTZWxTdGVwICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJcmV0dXJuIHNidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3B0aW9uIG9mIHN5bmNocm9uaXppbmcgYnJpZWYgZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN5bmNCcmllZkRlc2MoKSB7Ci0JCXJldHVybiBzeW5jQnJpZWZEZXNjOwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgYnJpZWYgZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jQnJpZWZEZXNjKGludCBzeW5jQnJpZWZEZXNjKSB7Ci0JCXRoaXMuc3luY0JyaWVmRGVzYyA9IHN5bmNCcmllZkRlc2M7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIG5hbWUKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN5bmNOYW1lKCkgewotCQlyZXR1cm4gc3luY05hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0IG9wdGlvbiBmb3Igc3luY2hyb25pemluZyBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY05hbWUoaW50IHN5bmNOYW1lKSB7Ci0JCXRoaXMuc3luY05hbWUgPSBzeW5jTmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25EZXNjcmlwdGlvblBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbkRlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwODhjNGMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbkRlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBUaGUgd2l6YXJkIHBhZ2Ugd2hpY2ggZGVzY3JpYmVzIGN1c3RvbSBzeW5jaHJvbml6YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXphdGlvbkRlc2NyaXB0aW9uUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCXByaXZhdGUgU3luY2hyb25pemF0aW9uQ2hvaWNlcyBzeW5jQ2hvaWNlcyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBUZXh0IGN0cmxfZXhwbGFpblRleHQ7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemF0aW9uRGVzY3JpcHRpb25QYWdlKFN0cmluZyBwYWdlTmFtZSwKLQkJCVN5bmNocm9uaXphdGlvbkNob2ljZXMgY2hvaWNlcykgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfdGl0bGUpOyAKLQkJc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90ZXh0KTsgCi0JCXRoaXMuc3luY0Nob2ljZXMgPSBjaG9pY2VzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgY29tcG9zaXRlIHRvIGhvbGQgdGhlIHdpZGdldHMuCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCQotCQlTdHJpbmcgZXhwbGFpblRleHQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX2V4cGxhaW5UZXh0OyAKLQkJY3RybF9leHBsYWluVGV4dCA9IGNyZWF0ZVRleHRNdWx0aShjb21wb3NpdGUsICIgIiwgNDAwLCAyNDAsIDEpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfZXhwbGFpblRleHQuc2V0VGV4dChleHBsYWluVGV4dCk7Ci0JCQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbk9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1YTQwZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLQotLyoqCi0gKiBSdW5zIHN5bmNob25pemF0aW9uIG9wZXJhdGlvbgotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6YXRpb25PcGVyYXRpb24gaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCi0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25DaG9pY2VzIHN5bmNoQ2hvaWNlczsKLQlwcml2YXRlIENvbGxlY3Rpb24gZWxlbWVudHM7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIAkJCUxpc3Qgb2YgZWxlbWVudHMgdG8gYmUgc3luY2hyb25pemVkCi0JICogQHBhcmFtIGNob2ljZXMKLQkgKiAJCQlTeW5jaHJvbml6YXRpb24gb3B0aW9ucwotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6YXRpb25PcGVyYXRpb24oQ29sbGVjdGlvbiBlbGVtZW50cywgU3luY2hyb25pemF0aW9uQ2hvaWNlcyBjaG9pY2VzKSB7Ci0JCXRoaXMuc3luY2hDaG9pY2VzID0gY2hvaWNlczsKLQkJdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3MjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHdva2UgdXAgYWZ0ZXIgMSBzZWNvbmQgc2xlZXAsICMiICsgKGkrMSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25QcmV2aWV3UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uUHJldmlld1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2NjOGNmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25QcmV2aWV3UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBUaGUgd2l6YXJkIHBhZ2Ugd2hpY2ggbGV0cyB5b3UgcHJldmlldyBlbGVtZW50cyB0byBiZSBzeW5jaG9uaXplZAotICogYW5kIGFsc28gYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXphdGlvblByZXZpZXdQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25DaG9pY2VzIHN5bmNDaG9pY2VzID0gbnVsbDsKLQkKLQlwcml2YXRlIFRleHQgY3RybF9wcmV2aWV3VGV4dDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6YXRpb25QcmV2aWV3UGFnZShTdHJpbmcgcGFnZU5hbWUsCi0JCQlTeW5jaHJvbml6YXRpb25DaG9pY2VzIGNob2ljZXMpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGl0bGUpOyAKLQkJc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RleHQpOyAKLQkJdGhpcy5zeW5jQ2hvaWNlcyA9IGNob2ljZXM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBjb21wb3NpdGUgdG8gaG9sZCB0aGUgd2lkZ2V0cy4KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJCi0JCVN0cmluZyBleHBsYWluVGV4dCA9ICJQcmV2aWV3IHRleHQgY29taW5nIGhlcmUuXG5cbiIgKwkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCSJcdFRoaXMgaGFzIHRvIGJlIGNvbWluZyBmcm9tIHNvbWUgdW5kZXJseWluIEFQSSBjYWxsLiBUaGlzIG1heSBiZSBjdXQgb2ZmIGlmIHRoZXJlIGlzIG5vdCBlbm91ZyB0aW1lLiI7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9wcmV2aWV3VGV4dCA9IGNyZWF0ZVRleHRNdWx0aShjb21wb3NpdGUsICIgIiwgNDAwLCAyNDAsIDEpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfcHJldmlld1RleHQuc2V0VGV4dChleHBsYWluVGV4dCk7Ci0JCQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25TZWxlY3RDb25maWdQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25TZWxlY3RDb25maWdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhMTM4YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uU2VsZWN0Q29uZmlnUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSB3aXphcmQgcGFnZSB3aGljaCBsZXQgdXNlciBzZWxlY3QgbWV0aG9kIGNvbmZpZ3VyYXRpb24gZHVyaW5nCi0gKiBzeW5jaHJvbml6YXRpb24KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemF0aW9uU2VsZWN0Q29uZmlnUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIFN5bmNocm9uaXphdGlvbkNob2ljZXMgc3luY0Nob2ljZXMgPSBudWxsOwotCQotCXByaXZhdGUgQ29tYm9WaWV3ZXIgY29uZmlnQ29tYm9WaWV3ZXI7Ci0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uW10gdmFsaWRDb25maWd1cmF0aW9uczsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6YXRpb25TZWxlY3RDb25maWdQYWdlKFN0cmluZyBwYWdlTmFtZSwKLQkJCVN5bmNocm9uaXphdGlvbkNob2ljZXMgY2hvaWNlcykgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RpdGxlKTsgCi0JCXNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RleHQpOyAKLQkJdGhpcy5zeW5jQ2hvaWNlcyA9IGNob2ljZXM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBjb21wb3NpdGUgdG8gaG9sZCB0aGUgd2lkZ2V0cy4KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQl9Ci0JCQotCQkvLyBhZGQgYW4gZW1wdHkgbGluZQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsICIgIiwgMik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfY29uZmlnTGFiZWwpOyAKLQkJCi0JCWNvbmZpZ0NvbWJvVmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQljb25maWdDb21ib1ZpZXdlci5nZXRDb21ibygpLnNldExheW91dERhdGEoCi0JCQkJbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJY29uZmlnQ29tYm9WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJCi0JCS8vIGdldCBhbGwgdmFsaWQgY29uZmlndXJhdGlvbnMsIGFuZCBkZWZhdWx0IG9uZSwgYW5kIHNlbGVjdCBhbmQgc2hvdyB0aGUgZGVmYXVsdCBvbmUKLQkJUHJvY2VzcyBzZWxlY3RlZFByb2Nlc3MgPSBzeW5jQ2hvaWNlcy5nZXRTZWxlY3RlZFByb2Nlc3MoKTsKLQkJdmFsaWRDb25maWd1cmF0aW9ucyA9IChNZXRob2RDb25maWd1cmF0aW9uW10pc2VsZWN0ZWRQcm9jZXNzLmdldFZhbGlkQ29udGV4dCgpLnRvQXJyYXkoKTsKLQkJY29uZmlnQ29tYm9WaWV3ZXIuYWRkKHZhbGlkQ29uZmlndXJhdGlvbnMpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcgPSBzZWxlY3RlZFByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJc3luY0Nob2ljZXMuc2V0U2VsZWN0ZWRDb25maWcoZGVmYXVsdENvbmZpZyk7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gZGVmYXVsdFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGRlZmF1bHRDb25maWcpOwotCQljb25maWdDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24oZGVmYXVsdFNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCQotCQlhZGRMaXN0ZW5lcnMoY29tcG9zaXRlKTsKLQkJCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQkJCi0vLwkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgaW5pdCBjb25maWcgPSIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lcnMgZm9yIHRoZSBjb250cm9scyBvbiB0aGlzIHBhZ2UuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycyhmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWNvbmZpZ0NvbWJvVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBjb25maWcgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJc3luY0Nob2ljZXMuc2V0U2VsZWN0ZWRDb25maWcoKE1ldGhvZENvbmZpZ3VyYXRpb24pY29uZmlnWzBdKTsKLQkJfSAKLQkJCi0vLwkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgY29uZmlnID0iICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvblNlbGVjdERldGFpbHNQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25TZWxlY3REZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYjE3NzUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvblNlbGVjdERldGFpbHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIFRoZSB3aXphcmQgcGFnZSB3aGljaCBsZXQgdXNlciBzZWxlY3QgcHJvcGVydGllcyBvZiBtZXRob2QgY29udGVudCB0byAKLSAqIGJlIGNvbnNpZGVyZWQgZm9yIHN5bmNob25pemF0aW9uLiAKLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemF0aW9uU2VsZWN0RGV0YWlsc1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQotCXByaXZhdGUgU3luY2hyb25pemF0aW9uQ2hvaWNlcyBzeW5jQ2hvaWNlcyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gYmNfbmFtZTsKLQlwcml2YXRlIEJ1dHRvbiBiY19wcmVzTmFtZTsKLQlwcml2YXRlIEJ1dHRvbiBiY19icmllZkRlc2M7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfb3B0SW5wdXQ7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfbWFuSW5wdXQ7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfb3V0cHV0OwotCXByaXZhdGUgQnV0dG9uIGJjX3ByaW1QZXJmb3JtZXI7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfYWRkblBlcmZvcm1lcjsKLQlwcml2YXRlIEJ1dHRvbiBiY19yZXNwUm9sZTsKLQlwcml2YXRlIEJ1dHRvbiBiY19jb250QXJ0aWZhY3Q7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfZGVsaXZQYXJ0OwotCXByaXZhdGUgQnV0dG9uIGJjX3NlbFN0ZXA7Ci0JCi0vLwlwcml2YXRlIEJ1dHRvbltdIGJyX3ByZXNOYW1lID0gbmV3IEJ1dHRvblsyXTsKLS8vCXByaXZhdGUgQnV0dG9uW10gYnJfb3B0SW5wdXQgPSBuZXcgQnV0dG9uWzJdOwotLy8JcHJpdmF0ZSBCdXR0b25bXSBicl9tYW5JbnB1dCA9IG5ldyBCdXR0b25bMl07Ci0vLwlwcml2YXRlIEJ1dHRvbltdIGJyX291dHB1dCA9IG5ldyBCdXR0b25bMl07Ci0vLwlwcml2YXRlIEJ1dHRvbltdIGJyX3Jlc3BSb2xlID0gbmV3IEJ1dHRvblsyXTsKLS8vCXByaXZhdGUgQnV0dG9uW10gYnJfY29udEFydGlmYWN0ID0gbmV3IEJ1dHRvblsyXTsKLS8vCXByaXZhdGUgQnV0dG9uW10gYnJfZGVsaXZQYXJ0ID0gbmV3IEJ1dHRvblsyXTsKLS8vCXByaXZhdGUgQnV0dG9uW10gYnJfc2VsU3RlcCA9IG5ldyBCdXR0b25bMl07Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemF0aW9uU2VsZWN0RGV0YWlsc1BhZ2UoU3RyaW5nIHBhZ2VOYW1lLAotCQkJU3luY2hyb25pemF0aW9uQ2hvaWNlcyBjaG9pY2VzKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RpdGxlKTsgCi0JCXNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90ZXh0KTsgCi0JCXRoaXMuc3luY0Nob2ljZXMgPSBjaG9pY2VzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgY29tcG9zaXRlIHRvIGhvbGQgdGhlIHdpZGdldHMuCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQl7Ci0vLwkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCX0KLQkKLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJvcGVydGllc19sYWJsZSk7IAotLy8JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgIkNvbmV0bnQgVG8gUHJvY2VzcyAgIik7Ci0vLwkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAiICBQcm9jZXNzIFRvIENvbnRlbnQiKTsKLQkJCi0JCWJjX25hbWUgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9uYW1lX2xhYmxlKTsgCi0JCQotCQliY19wcmVzTmFtZSA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByZXNlbnRhdGlvbk5hbWVfbGFibGUpOyAKLS8vCQljcmVhdGVUd29SYWRpb0dyb3VwKGNvbXBvc2l0ZSwgYnJfcHJlc05hbWUpOwotCQkKLQkJYmNfYnJpZWZEZXNjID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYnJpZWZEZXNjX2xhYmxlKTsgCi0JCQotCQliY19vcHRJbnB1dCA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX29wdGlvbmFsSW5vdXRzX2xhYmVsKTsgCi0vLwkJY3JlYXRlVHdvUmFkaW9Hcm91cChjb21wb3NpdGUsIGJyX29wdElucHV0KTsKLQkJCi0JCWJjX21hbklucHV0ID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbWFuZGF0b3J5SW5wdXRzX2xhYmxlKTsgCi0vLwkJY3JlYXRlVHdvUmFkaW9Hcm91cChjb21wb3NpdGUsIGJyX21hbklucHV0KTsKLQkJCi0JCWJjX291dHB1dCA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX291dHB1dHNfbGFiZWwpOyAKLS8vCQljcmVhdGVUd29SYWRpb0dyb3VwKGNvbXBvc2l0ZSwgYnJfb3V0cHV0KTsKLQkJCi0JCWJjX3ByaW1QZXJmb3JtZXIgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX2xhYmVsKTsgCi0JCWJjX2FkZG5QZXJmb3JtZXIgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9hZGRuUGVyZm9ybWVyc19sYWJsZSk7IAotCQkKLQkJYmNfcmVzcFJvbGUgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9yZXNwb25zaWJsZVJvbGVzX2xhYmxlKTsgCi0vLwkJY3JlYXRlVHdvUmFkaW9Hcm91cChjb21wb3NpdGUsIGJyX3Jlc3BSb2xlKTsKLQkJCi0JCWJjX2NvbnRBcnRpZmFjdCA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2NvbnRuQXJ0aWZhY3RzX2xhYmVsKTsgCi0vLwkJY3JlYXRlVHdvUmFkaW9Hcm91cChjb21wb3NpdGUsIGJyX2NvbnRBcnRpZmFjdCk7Ci0JCQotCQliY19kZWxpdlBhcnQgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9kaWx2ZWRQYXJ0c19sYWJlbCk7IAotLy8JCWNyZWF0ZVR3b1JhZGlvR3JvdXAoY29tcG9zaXRlLCBicl9kZWxpdlBhcnQpOwotCQkKLQkJYmNfc2VsU3RlcCA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3NlbFN0ZXBzX2xhYmVsKTsgCi0vLwkJY3JlYXRlVHdvUmFkaW9Hcm91cChjb21wb3NpdGUsIGJyX3NlbFN0ZXApOwotCQkKLQkJYWRkTGlzdGVuZXJzKGNvbXBvc2l0ZSk7Ci0JCXNldEFsbENoZWNrZWQoKTsKLQkJCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQkJCi0vLwkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgaW5pdCBkZXRhaWwgPSIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldEFsbENoZWNrZWQoKSB7Ci0JCWJjX25hbWUuc2V0U2VsZWN0aW9uKHRydWUpOwotCQliY19wcmVzTmFtZS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX2JyaWVmRGVzYy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX29wdElucHV0LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmNfbWFuSW5wdXQuc2V0U2VsZWN0aW9uKHRydWUpOwotCQliY19vdXRwdXQuc2V0U2VsZWN0aW9uKHRydWUpOwotCQliY19wcmltUGVyZm9ybWVyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmNfYWRkblBlcmZvcm1lci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX3Jlc3BSb2xlLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmNfY29udEFydGlmYWN0LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmNfZGVsaXZQYXJ0LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmNfc2VsU3RlcC5zZXRTZWxlY3Rpb24odHJ1ZSk7CQotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lcnMgZm9yIHRoZSBjb250cm9scyBvbiB0aGlzIHBhZ2UuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycyhmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWJjX25hbWUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoYmNfbmFtZS5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY05hbWUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY05hbWUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX05PTkUpOwotCQkJCX0KLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCQliY19wcmVzTmFtZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19wcmVzTmFtZS5nZXRTZWxlY3Rpb24oKSkgewotLy8JCQkJCWJyX3ByZXNOYW1lWzBdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJYnJfcHJlc05hbWVbMV0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlpZiAoYnJfcHJlc05hbWVbMF0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUHJlc05hbWUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJCQkJZWxzZQotLy8JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUHJlc05hbWUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0JCQkJfSBlbHNlIHsKLS8vCQkJCQlicl9wcmVzTmFtZVswXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJCQlicl9wcmVzTmFtZVsxXS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY1ByZXNOYW1lKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJYmNfYnJpZWZEZXNjLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGJjX2JyaWVmRGVzYy5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY0JyaWVmRGVzYyhTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jQnJpZWZEZXNjKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJYmNfb3B0SW5wdXQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoYmNfb3B0SW5wdXQuZ2V0U2VsZWN0aW9uKCkpIHsKLS8vCQkJCQlicl9vcHRJbnB1dFswXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWJyX29wdElucHV0WzFdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJaWYgKGJyX29wdElucHV0WzBdLmdldFNlbGVjdGlvbigpKQotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY09wdElucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCQkJCWVsc2UKLS8vCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY09wdElucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotCQkJCX0gZWxzZSB7Ci0vLwkJCQkJYnJfb3B0SW5wdXRbMF0uc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJCQkJYnJfb3B0SW5wdXRbMV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNPcHRJbnB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfTk9ORSk7Ci0JCQkJfQotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgIiArIHN5bmNDaG9pY2VzLnRvU3RyaW5nKCkpOwotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQliY19tYW5JbnB1dC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19tYW5JbnB1dC5nZXRTZWxlY3Rpb24oKSkgewotLy8JCQkJCWJyX21hbklucHV0WzBdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJYnJfbWFuSW5wdXRbMV0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlpZiAoYnJfbWFuSW5wdXRbMF0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jTWFuSW5wdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJCQkJZWxzZQotLy8JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jTWFuSW5wdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0vLwkJCQkJCi0JCQkJfSBlbHNlIHsKLS8vCQkJCQlicl9tYW5JbnB1dFswXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJCQlicl9tYW5JbnB1dFsxXS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY01hbklucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWJjX291dHB1dC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19vdXRwdXQuZ2V0U2VsZWN0aW9uKCkpIHsKLS8vCQkJCQlicl9vdXRwdXRbMF0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlicl9vdXRwdXRbMV0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlpZiAoYnJfb3V0cHV0WzBdLmdldFNlbGVjdGlvbigpKQotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY091dHB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQkJCQllbHNlCi0vLwkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNPdXRwdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0JCQkJfSBlbHNlIHsKLS8vCQkJCQlicl9vdXRwdXRbMF0uc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJCQkJYnJfb3V0cHV0WzFdLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jT3V0cHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWJjX3ByaW1QZXJmb3JtZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoYmNfcHJpbVBlcmZvcm1lci5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUHJpbVBlcmZvcm1lcihTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUHJpbVBlcmZvcm1lcihTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfTk9ORSk7Ci0JCQkJfQotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQliY19hZGRuUGVyZm9ybWVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChiY19hZGRuUGVyZm9ybWVyLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jQWRkblBlcmZvcm1lcihTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNBZGRuUGVyZm9ybWVyKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQkJfQotCQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJfQotCQl9KTsKLQkJCi0JCWJjX3Jlc3BSb2xlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGJjX3Jlc3BSb2xlLmdldFNlbGVjdGlvbigpKSB7Ci0vLwkJCQkJYnJfcmVzcFJvbGVbMF0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlicl9yZXNwUm9sZVsxXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWlmIChicl9yZXNwUm9sZVswXS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNSZXNwUm9sZShTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQkJCQllbHNlCi0vLwkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNSZXNwUm9sZShTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLQkJCQl9IGVsc2UgewotLy8JCQkJCWJyX3Jlc3BSb2xlWzBdLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCQkJCWJyX3Jlc3BSb2xlWzFdLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUmVzcFJvbGUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX05PTkUpOwotCQkJCX0KLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkICIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYmNfY29udEFydGlmYWN0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGJjX2NvbnRBcnRpZmFjdC5nZXRTZWxlY3Rpb24oKSkgewotLy8JCQkJCWJyX2NvbnRBcnRpZmFjdFswXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWJyX2NvbnRBcnRpZmFjdFsxXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWlmIChicl9jb250QXJ0aWZhY3RbMF0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jQ29udEFydGlmYWN0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCQkJCWVsc2UKLS8vCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY0NvbnRBcnRpZmFjdChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLQkJCQl9IGVsc2UgewotLy8JCQkJCWJyX2NvbnRBcnRpZmFjdFswXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJCQlicl9jb250QXJ0aWZhY3RbMV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNDb250QXJ0aWZhY3QoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX05PTkUpOwotCQkJCX0KLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkICIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYmNfZGVsaXZQYXJ0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGJjX2RlbGl2UGFydC5nZXRTZWxlY3Rpb24oKSkgewotLy8JCQkJCWJyX2RlbGl2UGFydFswXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWJyX2RlbGl2UGFydFsxXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWlmIChicl9kZWxpdlBhcnRbMF0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jRGVsaXZQYXJ0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCQkJCWVsc2UKLS8vCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY0RlbGl2UGFydChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLQkJCQl9IGVsc2UgewotLy8JCQkJCWJyX2RlbGl2UGFydFswXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJCQlicl9kZWxpdlBhcnRbMV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNEZWxpdlBhcnQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX05PTkUpOwotCQkJCX0KLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkICIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYmNfc2VsU3RlcC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19zZWxTdGVwLmdldFNlbGVjdGlvbigpKSB7Ci0vLwkJCQkJYnJfc2VsU3RlcFswXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWJyX3NlbFN0ZXBbMV0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlpZiAoYnJfc2VsU3RlcFswXS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNTZWxTdGVwKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCQkJCWVsc2UKLS8vCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY1NlbFN0ZXAoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0JCQkJfSBlbHNlIHsKLS8vCQkJCQlicl9zZWxTdGVwWzBdLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCQkJCWJyX3NlbFN0ZXBbMV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNTZWxTdGVwKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQotLy8JCWJyX3ByZXNOYW1lWzBdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX29wdElucHV0WzBdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX21hbklucHV0WzBdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX291dHB1dFswXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9yZXNwUm9sZVswXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9jb250QXJ0aWZhY3RbMF0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfZGVsaXZQYXJ0WzBdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX3NlbFN0ZXBbMF0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJCi0vLwkJYnJfcHJlc05hbWVbMV0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfb3B0SW5wdXRbMV0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfbWFuSW5wdXRbMV0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfb3V0cHV0WzFdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX3Jlc3BSb2xlWzFdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX2NvbnRBcnRpZmFjdFsxXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9kZWxpdlBhcnRbMV0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfc2VsU3RlcFsxXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkKLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX3ByZXNOYW1lWzBdICYmIGJyX3ByZXNOYW1lWzBdLmdldFNlbGVjdGlvbigpKSB7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUHJlc05hbWUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfb3B0SW5wdXRbMF0gJiYgYnJfb3B0SW5wdXRbMF0uZ2V0U2VsZWN0aW9uKCkpIHsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNPcHRJbnB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9tYW5JbnB1dFswXSAmJiBicl9tYW5JbnB1dFswXS5nZXRTZWxlY3Rpb24oKSkgeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY01hbklucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX291dHB1dFswXSAmJiBicl9vdXRwdXRbMF0uZ2V0U2VsZWN0aW9uKCkpIHsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNPdXRwdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfcmVzcFJvbGVbMF0gJiYgYnJfcmVzcFJvbGVbMF0uZ2V0U2VsZWN0aW9uKCkpIHsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNSZXNwUm9sZShTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9jb250QXJ0aWZhY3RbMF0gJiYgYnJfY29udEFydGlmYWN0WzBdLmdldFNlbGVjdGlvbigpKSB7Ci0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNDb250QXJ0aWZhY3QoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfZGVsaXZQYXJ0WzBdICYmIGJyX2RlbGl2UGFydFswXS5nZXRTZWxlY3Rpb24oKSkgeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY0RlbGl2UGFydChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9zZWxTdGVwWzBdICYmIGJyX3NlbFN0ZXBbMF0uZ2V0U2VsZWN0aW9uKCkpeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY1NlbFN0ZXAoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJfQotLy8KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX3ByZXNOYW1lWzFdICYmIGJyX3ByZXNOYW1lWzFdLmdldFNlbGVjdGlvbigpKXsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNQcmVzTmFtZShTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9vcHRJbnB1dFsxXSAmJiBicl9vcHRJbnB1dFsxXS5nZXRTZWxlY3Rpb24oKSl7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jT3B0SW5wdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfbWFuSW5wdXRbMV0gJiYgYnJfbWFuSW5wdXRbMV0uZ2V0U2VsZWN0aW9uKCkpeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY01hbklucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX291dHB1dFsxXSAmJiBicl9vdXRwdXRbMV0uZ2V0U2VsZWN0aW9uKCkpeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY091dHB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9yZXNwUm9sZVsxXSAmJiBicl9yZXNwUm9sZVsxXS5nZXRTZWxlY3Rpb24oKSl7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUmVzcFJvbGUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfY29udEFydGlmYWN0WzFdICYmIGJyX2NvbnRBcnRpZmFjdFsxXS5nZXRTZWxlY3Rpb24oKSl7Ci0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNDb250QXJ0aWZhY3QoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfZGVsaXZQYXJ0WzFdICYmIGJyX2RlbGl2UGFydFsxXS5nZXRTZWxlY3Rpb24oKSl7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jRGVsaXZQYXJ0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX3NlbFN0ZXBbMV0gJiYgYnJfc2VsU3RlcFsxXS5nZXRTZWxlY3Rpb24oKSl7Ci0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNTZWxTdGVwKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotLy8JCX0KLS8vLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkICIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgREVCVUc6ICIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQkJaWYgKHN5bmNDaG9pY2VzLmdldFN5bmNOYW1lKCkgPiAwIHx8Ci0JCQlzeW5jQ2hvaWNlcy5nZXRTeW5jUHJlc05hbWUoKSA+IDAgfHwKLQkJCXN5bmNDaG9pY2VzLmdldFN5bmNCcmllZkRlc2MoKSA+IDAgfHwKLQkJCXN5bmNDaG9pY2VzLmdldFN5bmNPcHRJbnB1dCgpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY01hbklucHV0KCkgPiAwIHx8Ci0JCQlzeW5jQ2hvaWNlcy5nZXRTeW5jT3V0cHV0KCkgPiAwIHx8Ci0JCQlzeW5jQ2hvaWNlcy5nZXRTeW5jUHJpbVBlcmZvcm1lcigpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY0FkZG5QZXJmb3JtZXIoKSA+IDAgfHwKLQkJCXN5bmNDaG9pY2VzLmdldFN5bmNSZXNwUm9sZSgpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY0NvbnRBcnRpZmFjdCgpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY0RlbGl2UGFydCgpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY1NlbFN0ZXAoKSA+IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCX0KLQkKLS8vCXByaXZhdGUgdm9pZCBjcmVhdGVUd29SYWRpb0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIEJ1dHRvbltdIHJicykgewotLy8JCUNvbXBvc2l0ZSBhR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotLy8JCQotLy8JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotLy8JCWFHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLS8vCQkKLS8vCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotLy8JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLS8vCQlhR3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0vLwkJCi0vLwkJcmJzWzBdID0gY3JlYXRlUmFkaW9CdXR0b24oYUdyb3VwLCAiIiwgMSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLS8vCQlyYnNbMV0gPSBjcmVhdGVSYWRpb0J1dHRvbihhR3JvdXAsICIiLCAxLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLS8vCQkKLS8vCQlyYnNbMF0uc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJcmJzWzFdLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25XaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMjNjM2VhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotCi0vKioKLSAqIFRoZSB3aXphcmQgdGhhdCBndWlkZXMgdXNlciB0byBkbyBjdXN0b20gc3luY2hyb25pemF0aW9uIGZvciBwcm9jZXNzCi0gKiBkZXNjcmlwdG9ycyBmcm9tIG1ldGhvZCBlbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemF0aW9uV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQlwcml2YXRlIFN5bmNocm9uaXphdGlvbkRlc2NyaXB0aW9uUGFnZSBkZXNjUGFnZTsKLQlwcml2YXRlIFN5bmNocm9uaXphdGlvblNlbGVjdENvbmZpZ1BhZ2Ugc2VsZWN0Q29uZmlnUGFnZTsKLQlwcml2YXRlIFN5bmNocm9uaXphdGlvblNlbGVjdERldGFpbHNQYWdlIHNlbGVjdERldGFpbHNQYWdlOwotLy8JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25QcmV2aWV3UGFnZSBwcmV2aWV3UGFnZTsKLQkKLQlwcml2YXRlIFN5bmNocm9uaXphdGlvbkNob2ljZXMgc3luY0Nob2ljZXMgPSBudWxsOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXphdGlvbldpemFyZChTeW5jaHJvbml6YXRpb25DaG9pY2VzIGNob2ljZXMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zeW5jQ2hvaWNlcyA9IGNob2ljZXM7Ci0JCXNldFdpbmRvd1RpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF90aXRsZV90ZXh0KTsgCi0JfQotCQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvd2l6YmFuL3N5bmNocm9uaXphdGlvbi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWRlc2NQYWdlID0gbmV3IFN5bmNocm9uaXphdGlvbkRlc2NyaXB0aW9uUGFnZSgKLQkJCQkiU3luY2hyb25pemF0aW9uRGVzY3JpcHRpb25QYWdlIiwgc3luY0Nob2ljZXMpOyAvLyROT04tTkxTLTEkCi0JCWRlc2NQYWdlLnNldEltYWdlRGVzY3JpcHRvcihpbWFnZURlc2NyaXB0b3IpOwotCQlhZGRQYWdlKGRlc2NQYWdlKTsKLQotCQlzZWxlY3RDb25maWdQYWdlID0gbmV3IFN5bmNocm9uaXphdGlvblNlbGVjdENvbmZpZ1BhZ2UoCi0JCQkJIlN5bmNocm9uaXphdGlvblNlbGVjdENvbmZpZ1BhZ2UiLCBzeW5jQ2hvaWNlcyk7IC8vJE5PTi1OTFMtMSQKLQkJc2VsZWN0Q29uZmlnUGFnZS5zZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjcmlwdG9yKTsKLQkJYWRkUGFnZShzZWxlY3RDb25maWdQYWdlKTsKLQkJCi0JCXNlbGVjdERldGFpbHNQYWdlID0gbmV3IFN5bmNocm9uaXphdGlvblNlbGVjdERldGFpbHNQYWdlKAotCQkJCSJTeW5jaHJvbml6YXRpb25TZWxlY3REZXRhaWxzUGFnZSIsIHN5bmNDaG9pY2VzKTsgLy8kTk9OLU5MUy0xJAotCQlzZWxlY3REZXRhaWxzUGFnZS5zZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjcmlwdG9yKTsKLQkJYWRkUGFnZShzZWxlY3REZXRhaWxzUGFnZSk7Ci0JCQotLy8JCXByZXZpZXdQYWdlID0gbmV3IFN5bmNocm9uaXphdGlvblByZXZpZXdQYWdlKAotLy8JCQkJIlN5bmNocm9uaXphdGlvblByZXZpZXdQYWdlIiwgc3luY0Nob2ljZXMpOyAvLyROT04tTkxTLTEkCi0vLwkJcHJldmlld1BhZ2Uuc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvcik7Ci0vLwkJYWRkUGFnZShwcmV2aWV3UGFnZSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCXJldHVybiAoc2VsZWN0RGV0YWlsc1BhZ2UuaXNQYWdlQ29tcGxldGUoKSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlzeW5jQ2hvaWNlcy5zZXRGaW5pc2hQcmVzc2VkKHRydWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1DYW5jZWwoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1DYW5jZWwoKSB7Ci0JCXN5bmNDaG9pY2VzLnNldEZpbmlzaFByZXNzZWQoZmFsc2UpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFjNTYwMGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgd2l6YXJkcyBmb3IgYXV0aG9yaW5nIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTc5N2FkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTNhODE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlbl9saWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgbGljZW5zZV9lbi5odG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1Y2EwNTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLWZlYXR1cmVOYW1lPUVQRiBCYXNlIEZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotZGVzY3JpcHRpb249RVBGIEJhc2UgRmVhdHVyZS4KLXVwZGF0ZVNpdGVOYW1lPUVQRiBGZWF0dXJlIFVwZGF0ZXMKLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi1saWNlbnNlVVJMPWxpY2Vuc2VfZW4uaHRtbAotbGljZW5zZVRleHQ9VXNlIG9mIHRoaXMgZmVhdHVyZSBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIHRlcm1zIGFuZCBjb25kaXRpb25zIHdoaWNoIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBQcm9kdWN0IHdoaWNoIGluY2x1ZGVkIHRoaXMgZmVhdHVyZS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODhjM2UzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmJhc2UiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmJhc2UiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlVGV4dAotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kcmF3MmQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5nZWYiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmZvcm1zIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaW50cm8iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudGVhbS5jdnMudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJjb20uaWJtLmljdSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmFwYWNoZS5hbnQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVkaXQudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyZWNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJ4bWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLm9zZ2kiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5oZWxwLmJhc2UiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuYXBhY2hlLmx1Y2VuZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnNlYXJjaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWRpdCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmJhc2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYiCi0gICAgICAgICBvcz0id2luMzIiCi0gICAgICAgICB3cz0id2luMzIiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLSAgICAgICAgIAotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51aS5pbnRybyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnVtYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9saWNlbnNlX2VuLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvbGljZW5zZV9lbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9saWNlbnNlX2VuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDFiZTA5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmJhc2U8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWMwOWNhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZmVhdHVyZVBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5iYXNlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGM5OTA4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQuaW5pIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYwNGY0ZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lZmVhdHVyZVRleHQKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWFwcGxpY2F0aW9uXzMyLmdpZgotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLWFwcE5hbWU9JWZlYXR1cmVOYW1lCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotd2VsY29tZVBhZ2U9JG5sJC93ZWxjb21lLnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5tYXBwaW5ncyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFjYTk1MmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotIyBVc3VhbGx5IGdlbmVyYXRlZCBhdCBidWlsZCB0aW1lLgotCi0wPUBidWlsZElkQAotMT0xLjIuMApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MTk4NGEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgQmFzZQotCi1mZWF0dXJlVGV4dD1FUEYgQmFzZVxuXAotXG5cCi1WZXJzaW9uOiB7MX0gXG5cCi1CdWlsZCBMYWJlbDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuXAotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYXBwbGljYXRpb25fMzIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hcHBsaWNhdGlvbl8zMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hcHBsaWNhdGlvbl8zMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjY2VjNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uXzMyLmdpZixcCi0gICAgICAgICAgICAgICB3ZWxjb21lLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYwZTdhZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotZmVhdHVyZVBsdWdpbk5hbWU9RVBGIEJhc2UgRmVhdHVyZQotZmVhdHVyZVBsdWdpbk5hbWVOTD1FUEYgQmFzZSBGZWF0dXJlIChOTDEpCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL3dlbGNvbWUueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS93ZWxjb21lLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjY0MGQwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL3dlbGNvbWUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08d2VsY29tZVBhZ2UgCi0JdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiPgotCi08aW50cm8+V2VsY29tZSB0byBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrCi08L2ludHJvPgotCi08aXRlbT48Yj5XaGF0IGlzIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms/PC9iPgotCQotPC9pdGVtPgotCi08aXRlbT48Yj5MZWFybiBNb3JlPC9iPgotCi08L2l0ZW0+Ci0KLTwvd2VsY29tZVBhZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Ly5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmOWE0MzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ODZlNWRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4NgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2Uuc3d0Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFhMWEwMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMDE0N2NlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIFdpbjMyIENvbW1vbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3dpbjMyL1dpbjMySFRNTFRyYW5zZmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3dpbjMyL1dpbjMySFRNTFRyYW5zZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyNmQ4ZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi93aW4zMi9XaW4zMkhUTUxUcmFuc2Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkJ5dGVBcnJheVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuQ09NOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuRk9STUFURVRDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuSURhdGFPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi5TVEdNRURJVU07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLk9TOwotCi0vKioKLSAqIFRoZSBjbGFzcyA8Y29kZT5IVE1MVHJhbnNmZXI8L2NvZGU+IHByb3ZpZGVzIGEgcGxhdGZvcm0gc3BlY2lmaWMgbWVjaGFuaXNtCi0gKiBmb3IgY29udmVydGluZyB0ZXh0IGluIEhUTUwgZm9ybWF0IHJlcHJlc2VudGVkIGFzIGEgamF2YSA8Y29kZT5TdHJpbmc8L2NvZGU+Ci0gKiB0byBhIHBsYXRmb3JtIHNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRhIGFuZCB2aWNlIHZlcnNhLiBTZWUKLSAqIDxjb2RlPlRyYW5zZmVyPC9jb2RlPiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KLSAqIAotICogPHA+Ci0gKiBBbiBleGFtcGxlIG9mIGEgamF2YSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgSFRNTCB0ZXh0IGlzIHNob3duCi0gKiBiZWxvdzoKLSAqIDwvcD4KLSAqIAotICogPGNvZGU+PHByZT4KLSAqICAgICAgIFN0cmluZyBodG1sRGF0YSA9ICZxdW90OwotICogPHA+Ci0gKiAgVGhpcyBpcyBhIHBhcmFncmFwaCBvZiB0ZXh0LgotICogPC9wPgotICogICZxdW90OzsKLSAqIDwvY29kZT48L3ByZT4KLSAqLwotcHVibGljIGNsYXNzIFdpbjMySFRNTFRyYW5zZmVyIGV4dGVuZHMgQnl0ZUFycmF5VHJhbnNmZXIgewotCi0Jc3RhdGljIFdpbjMySFRNTFRyYW5zZmVyIF9pbnN0YW5jZSA9IG5ldyBXaW4zMkhUTUxUcmFuc2ZlcigpOwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0ZPUk1BVCA9ICJIVE1MIEZvcm1hdCI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBpbnQgSFRNTF9GT1JNQVRJRCA9IHJlZ2lzdGVyVHlwZShIVE1MX0ZPUk1BVCk7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIE5VTUJFUiA9ICIwMDAwMDAwMCI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSID0gIlZlcnNpb246MC45XHJcblN0YXJ0SFRNTDoiICsgTlVNQkVSCi0JCQkrICJcclxuRW5kSFRNTDoiICsgTlVNQkVSICsgIlxyXG5TdGFydEZyYWdtZW50OiIgKyBOVU1CRVIKLQkJCSsgIlxyXG5FbmRGcmFnbWVudDoiICsgTlVNQkVSICsgIlxyXG4iOwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAiPGh0bWw+PGJvZHk+PCEtLVN0YXJ0RnJhZ21lbnQtLT4iOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNVRkZJWCA9ICI8IS0tRW5kRnJhZ21lbnQtLT48L2JvZHk+PC9odG1sPiI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgU3RhcnRGcmFnbWVudCA9ICJTdGFydEZyYWdtZW50OiI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRW5kRnJhZ21lbnQgPSAiRW5kRnJhZ21lbnQ6IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFdpbjMySFRNTFRyYW5zZmVyKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgSFRNTFRyYW5zZmVyIGNsYXNzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgSFRNTFRyYW5zZmVyIGNsYXNzCi0JICovCi0JcHVibGljIHN0YXRpYyBXaW4zMkhUTUxUcmFuc2ZlciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIF9pbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPmphdmFUb05hdGl2ZTwvY29kZT4gY29udmVydHMKLQkgKiBIVE1MLWZvcm1hdHRlZCB0ZXh0IHJlcHJlc2VudGVkIGJ5IGEgamF2YSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIGEKLQkgKiBwbGF0Zm9ybSBzcGVjaWZpYyByZXByZXNlbnRhdGlvbi4gRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc2VlCi0JICogPGNvZGU+VHJhbnNmZXIjamF2YVRvTmF0aXZlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICBhIGphdmEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIEhUTUwgdGV4dAotCSAqIEBwYXJhbSB0cmFuc2ZlckRhdGEKLQkgKiAgICAgICAgICAgIGFuIGVtcHR5IDxjb2RlPlRyYW5zZmVyRGF0YTwvY29kZT4gb2JqZWN0OyB0aGlzIG9iamVjdCB3aWxsCi0JICogICAgICAgICAgICBiZSBmaWxsZWQgaW4gb24gcmV0dXJuIHdpdGggdGhlIHBsYXRmb3JtIHNwZWNpZmljIGZvcm1hdCBvZgotCSAqICAgICAgICAgICAgdGhlIGRhdGEKLQkgKi8KLQlwdWJsaWMgdm9pZCBqYXZhVG9OYXRpdmUoT2JqZWN0IG9iamVjdCwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCQlpZiAoIWNoZWNrSFRNTChvYmplY3QpIHx8ICFpc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJEYXRhKSkgewotCQkJRE5ELmVycm9yKERORC5FUlJPUl9JTlZBTElEX0RBVEEpOwotCQl9Ci0JCVN0cmluZyBzdHJpbmcgPSAoU3RyaW5nKSBvYmplY3Q7Ci0JCWludCBjb3VudCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbY291bnQgKyAxXTsKLQkJc3RyaW5nLmdldENoYXJzKDAsIGNvdW50LCBjaGFycywgMCk7Ci0JCWludCBjb2RlUGFnZSA9IE9TLkdldEFDUCgpOwotCQlpbnQgY2NoTXVsdGlCeXRlID0gT1MuV2lkZUNoYXJUb011bHRpQnl0ZShjb2RlUGFnZSwgMCwgY2hhcnMsIC0xLCBudWxsLAotCQkJCTAsIG51bGwsIG51bGwpOwotCQlpZiAoY2NoTXVsdGlCeXRlID09IDApIHsKLQkJCXRyYW5zZmVyRGF0YS5zdGdtZWRpdW0gPSBuZXcgU1RHTUVESVVNKCk7Ci0JCQl0cmFuc2ZlckRhdGEucmVzdWx0ID0gQ09NLkRWX0VfU1RHTUVESVVNOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBzdGFydEhUTUwgPSBIRUFERVIubGVuZ3RoKCk7Ci0JCWludCBzdGFydEZyYWdtZW50ID0gc3RhcnRIVE1MICsgUFJFRklYLmxlbmd0aCgpOwotCQlpbnQgZW5kRnJhZ21lbnQgPSBzdGFydEZyYWdtZW50ICsgY2NoTXVsdGlCeXRlIC0gMTsKLQkJaW50IGVuZEhUTUwgPSBlbmRGcmFnbWVudCArIFNVRkZJWC5sZW5ndGgoKTsKLQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihIRUFERVIpOwotCQlpbnQgbWF4TGVuZ3RoID0gTlVNQkVSLmxlbmd0aCgpOwotCQkvLyBzdGFydEhUTUwKLQkJaW50IHN0YXJ0ID0gYnVmZmVyLnRvU3RyaW5nKCkuaW5kZXhPZihOVU1CRVIpOwotCQlTdHJpbmcgdGVtcCA9IEludGVnZXIudG9TdHJpbmcoc3RhcnRIVE1MKTsKLQkJYnVmZmVyLnJlcGxhY2Uoc3RhcnQgKyBtYXhMZW5ndGggLSB0ZW1wLmxlbmd0aCgpLCBzdGFydCArIG1heExlbmd0aCwKLQkJCQl0ZW1wKTsKLQkJLy8gZW5kSFRNTAotCQlzdGFydCA9IGJ1ZmZlci50b1N0cmluZygpLmluZGV4T2YoTlVNQkVSLCBzdGFydCk7Ci0JCXRlbXAgPSBJbnRlZ2VyLnRvU3RyaW5nKGVuZEhUTUwpOwotCQlidWZmZXIucmVwbGFjZShzdGFydCArIG1heExlbmd0aCAtIHRlbXAubGVuZ3RoKCksIHN0YXJ0ICsgbWF4TGVuZ3RoLAotCQkJCXRlbXApOwotCQkvLyBzdGFydEZyYWdtZW50Ci0JCXN0YXJ0ID0gYnVmZmVyLnRvU3RyaW5nKCkuaW5kZXhPZihOVU1CRVIsIHN0YXJ0KTsKLQkJdGVtcCA9IEludGVnZXIudG9TdHJpbmcoc3RhcnRGcmFnbWVudCk7Ci0JCWJ1ZmZlci5yZXBsYWNlKHN0YXJ0ICsgbWF4TGVuZ3RoIC0gdGVtcC5sZW5ndGgoKSwgc3RhcnQgKyBtYXhMZW5ndGgsCi0JCQkJdGVtcCk7Ci0JCS8vIGVuZEZyYWdtZW50Ci0JCXN0YXJ0ID0gYnVmZmVyLnRvU3RyaW5nKCkuaW5kZXhPZihOVU1CRVIsIHN0YXJ0KTsKLQkJdGVtcCA9IEludGVnZXIudG9TdHJpbmcoZW5kRnJhZ21lbnQpOwotCQlidWZmZXIucmVwbGFjZShzdGFydCArIG1heExlbmd0aCAtIHRlbXAubGVuZ3RoKCksIHN0YXJ0ICsgbWF4TGVuZ3RoLAotCQkJCXRlbXApOwotCi0JCWJ1ZmZlci5hcHBlbmQoUFJFRklYKTsKLQkJYnVmZmVyLmFwcGVuZChzdHJpbmcpOwotCQlidWZmZXIuYXBwZW5kKFNVRkZJWCk7Ci0KLQkJY291bnQgPSBidWZmZXIubGVuZ3RoKCk7Ci0JCWNoYXJzID0gbmV3IGNoYXJbY291bnQgKyAxXTsKLQkJYnVmZmVyLmdldENoYXJzKDAsIGNvdW50LCBjaGFycywgMCk7Ci0JCWNjaE11bHRpQnl0ZSA9IE9TLldpZGVDaGFyVG9NdWx0aUJ5dGUoY29kZVBhZ2UsIDAsIGNoYXJzLCAtMSwgbnVsbCwgMCwKLQkJCQludWxsLCBudWxsKTsKLQkJaW50IGxwTXVsdGlCeXRlU3RyID0gT1MuR2xvYmFsQWxsb2MoT1MuR01FTV9GSVhFRCB8IE9TLkdNRU1fWkVST0lOSVQsCi0JCQkJY2NoTXVsdGlCeXRlKTsKLQkJT1MuV2lkZUNoYXJUb011bHRpQnl0ZShjb2RlUGFnZSwgMCwgY2hhcnMsIC0xLCBscE11bHRpQnl0ZVN0ciwKLQkJCQljY2hNdWx0aUJ5dGUsIG51bGwsIG51bGwpOwotCQl0cmFuc2ZlckRhdGEuc3RnbWVkaXVtID0gbmV3IFNUR01FRElVTSgpOwotCQl0cmFuc2ZlckRhdGEuc3RnbWVkaXVtLnR5bWVkID0gQ09NLlRZTUVEX0hHTE9CQUw7Ci0JCXRyYW5zZmVyRGF0YS5zdGdtZWRpdW0udW5pb25GaWVsZCA9IGxwTXVsdGlCeXRlU3RyOwotCQl0cmFuc2ZlckRhdGEuc3RnbWVkaXVtLnBVbmtGb3JSZWxlYXNlID0gMDsKLQkJdHJhbnNmZXJEYXRhLnJlc3VsdCA9IENPTS5TX09LOwotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5uYXRpdmVUb0phdmE8L2NvZGU+IGNvbnZlcnRzIGEgcGxhdGZvcm0KLQkgKiBzcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBIVE1MIHRleHQgdG8gYSBqYXZhIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc2VlIDxjb2RlPlRyYW5zZmVyI25hdGl2ZVRvSmF2YTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHRyYW5zZmVyRGF0YQotCSAqICAgICAgICAgICAgdGhlIHBsYXRmb3JtIHNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRhIHRvIGJlIGJlZW4KLQkgKiAgICAgICAgICAgIGNvbnZlcnRlZAotCSAqIEByZXR1cm4gYSBqYXZhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyBIVE1MIHRleHQgaWYgdGhlCi0JICogICAgICAgICBjb252ZXJzaW9uIHdhcyBzdWNjZXNzZnVsOyBvdGhlcndpc2UgbnVsbAotCSAqLwotCXB1YmxpYyBPYmplY3QgbmF0aXZlVG9KYXZhKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQkJaWYgKCFpc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJEYXRhKSB8fCB0cmFuc2ZlckRhdGEucElEYXRhT2JqZWN0ID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJSURhdGFPYmplY3QgZGF0YSA9IG5ldyBJRGF0YU9iamVjdCh0cmFuc2ZlckRhdGEucElEYXRhT2JqZWN0KTsKLQkJZGF0YS5BZGRSZWYoKTsKLQkJU1RHTUVESVVNIHN0Z21lZGl1bSA9IG5ldyBTVEdNRURJVU0oKTsKLQkJRk9STUFURVRDIGZvcm1hdGV0YyA9IHRyYW5zZmVyRGF0YS5mb3JtYXRldGM7Ci0JCXN0Z21lZGl1bS50eW1lZCA9IENPTS5UWU1FRF9IR0xPQkFMOwotCQl0cmFuc2ZlckRhdGEucmVzdWx0ID0gZGF0YS5HZXREYXRhKGZvcm1hdGV0Yywgc3RnbWVkaXVtKTsKLQkJZGF0YS5SZWxlYXNlKCk7Ci0JCWlmICh0cmFuc2ZlckRhdGEucmVzdWx0ICE9IENPTS5TX09LKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBoTWVtID0gc3RnbWVkaXVtLnVuaW9uRmllbGQ7Ci0KLQkJdHJ5IHsKLQkJCWludCBscE11bHRpQnl0ZVN0ciA9IE9TLkdsb2JhbExvY2soaE1lbSk7Ci0JCQlpZiAobHBNdWx0aUJ5dGVTdHIgPT0gMCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaW50IGNvZGVQYWdlID0gT1MuR2V0QUNQKCk7Ci0JCQkJaW50IGNjaFdpZGVDaGFyID0gT1MuTXVsdGlCeXRlVG9XaWRlQ2hhcihjb2RlUGFnZSwKLQkJCQkJCU9TLk1CX1BSRUNPTVBPU0VELCBscE11bHRpQnl0ZVN0ciwgLTEsIG51bGwsIDApOwotCQkJCWlmIChjY2hXaWRlQ2hhciA9PSAwKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQljaGFyW10gbHBXaWRlQ2hhclN0ciA9IG5ldyBjaGFyW2NjaFdpZGVDaGFyIC0gMV07Ci0JCQkJT1MKLQkJCQkJCS5NdWx0aUJ5dGVUb1dpZGVDaGFyKGNvZGVQYWdlLCBPUy5NQl9QUkVDT01QT1NFRCwKLQkJCQkJCQkJbHBNdWx0aUJ5dGVTdHIsIC0xLCBscFdpZGVDaGFyU3RyLAotCQkJCQkJCQlscFdpZGVDaGFyU3RyLmxlbmd0aCk7Ci0JCQkJcmV0dXJuIG5ldyBTdHJpbmcobHBXaWRlQ2hhclN0cik7Ci0JCQl9IGZpbmFsbHkgewotCQkJCU9TLkdsb2JhbFVubG9jayhoTWVtKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCU9TLkdsb2JhbEZyZWUoaE1lbSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgaW50W10gZ2V0VHlwZUlkcygpIHsKLQkJcmV0dXJuIG5ldyBpbnRbXSB7IEhUTUxfRk9STUFUSUQgfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgSFRNTF9GT1JNQVQgfTsKLQl9Ci0KLQlib29sZWFuIGNoZWNrSFRNTChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nICYmICgoU3RyaW5nKSBvYmplY3QpCi0JCQkJLmxlbmd0aCgpID4gMCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gY2hlY2tIVE1MKG9iamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi93aW4zMi9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3dpbjMyL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWM1NGU3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3dpbjMyL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHdpbmRvd3Mtc3BlY2lmaWMgY2xpcGJvYXJkIHRyYW5zZmVyIHNlcnZpY2VzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi8uY2R0cHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi8uY2R0cHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzFkY2UwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLmNkdHByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UtY2R0IHZlcnNpb249IjIuMCI/PgotCi08Y2R0cHJvamVjdD4KLTxkYXRhLz4KLTwvY2R0cHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzMjc3OGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYi9qdGlkeS04LjAtMjAwNjA4MDEuMTMxMDU5LTMuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTlmMTVmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIENvbW1vbiBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYuY29tbW9uL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWY1ZGQ1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuY29tbW9uPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjM4ZmYxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IGNvbW1vbi5qYXIsIGxpYi9qdGlkeS04LjAtMjAwNjA4MDEuMTMxMDU5LTMuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogY29tLmlibS5pY3U7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5hcGFjaGUuYW50Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5jb21tb24sCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5odG1sLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHksCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscywKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnhtbAotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYjQxYmY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iSUJNIFdlYlNwaGVyZSBTdHVkaW8iPgotPHRpdGxlPlBsdWctaW4gTGljZW5zZSBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotPGgzPlBsdWctaW4gTGljZW5zZSBBZ3JlZW1lbnQ8L2gzPgotCi08cD5Vc2Ugb2YgdGhpcyBQbHVnLWluIGlzIHN1YmplY3QgdG8gdGhlIHNhbWUgdGVybXMgYW5kIGNvbmRpdGlvbnMgd2hpY2ggZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIFByb2R1Y3Qgd2hpY2ggaW5jbHVkZWQgdGhpcyBQbHVnLWluLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZkODI3NTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS5jb21tb24uamFyID0gc3JjLwotb3V0cHV0LmNvbW1vbi5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBjb21tb24uamFyLFwKLSAgICAgICAgICAgICAgIGxpYi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL2xpYi9qdGlkeS04LjAtMjAwNjA4MDEuMTMxMDU5LTMuamFyIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL2xpYi9qdGlkeS04LjAtMjAwNjA4MDEuMTMxMDU5LTMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzN2ZjOTcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9saWIvanRpZHktOC4wLTIwMDYwODAxLjEzMTA1OS0zLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmYzNGZkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIENvbW1vbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NGZiMWViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ2ZXJzaW9uIiBuYW1lPSJWZXJzaW9uIiBzY2hlbWE9InNjaGVtYS9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnZlcnNpb24uZXhzZCIvPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9ImVwZiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnZlcnNpb24iPgotICAgICAgICAgPHZlcnNpb25zCi0gICAgICAgICAJY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuRVBGVmVyc2lvbnMiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zY2hlbWEvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi52ZXJzaW9uLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc2NoZW1hL29yZy5lY2xpcHNlLmVwZi5jb21tb24udmVyc2lvbi5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNWUyNWE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zY2hlbWEvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi52ZXJzaW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbiI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbiIgaWQ9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24udmVyc2lvbiIgbmFtZT0iVmVyc2lvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBEZWZpbmUgc2NoZW1hL3Rvb2wgdmVyc2lvbnMKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmVyc2lvbnMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImxpYnJhcnlFeHRlbnNpb25WZXJzaW9uQ2hlY2siIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InZlcnNpb25zIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LlZlcnNpb25zIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImxpYnJhcnlFeHRlbnNpb25WZXJzaW9uQ2hlY2siPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuSUxpYnJhcnlFeHRlbnNpb25WZXJzaW9uQ2hlY2siLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9Db21tb25QbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9Db21tb25QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDE0NTJiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vQ29tbW9uUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIENvbW1vbiBwbHVnLWluIGFjdGl2YXRvci4KLSAqLwotcHVibGljIGNsYXNzIENvbW1vblBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBDb21tb25QbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29tbW9uUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbW1vblBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9odG1sL0hUTUxGb3JtYXR0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9odG1sL0hUTUxGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGNhMWU5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vaHRtbC9IVE1MRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5odG1sOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLnczYy50aWR5LlRpZHk7Ci0KLS8qKgotICogUHJldHR5LWZvcm1hdHMgSFRNTCBzb3VyY2UgYW5kIG1ha2VzIGl0IFhIVE1MIGNvbXBsaWFudC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0JPRFlfU1RBUlRfVEFHID0gIjxib2R5PiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0JPRFlfRU5EX1RBRyA9ICI8L2JvZHk+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhUTUxfQk9EWV9TVEFSVF9UQUdfTEVOR1RIID0gSFRNTF9CT0RZX1NUQVJUX1RBRwotCQkJLmxlbmd0aCgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfQ09QWSA9ICImY29weTsiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0VVUk8gPSAiJmV1cm87IjsvLyROT04tTkxTLTEkIAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1JFRyA9ICImcmVnOyI7Ly8kTk9OLU5MUy0xJCAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1RSQURFTUFSSyA9ICImdHJhZGU7IjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFHTk9TVElDX1NPVVJDRSA9ICJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkhUTUxGb3JtYXR0ZXIiOwotCQotCXByaXZhdGUgaW50IGxpbmVXaWR0aDsKLQotCXByaXZhdGUgYm9vbGVhbiBpbmRlbnQ7Ci0KLQlwcml2YXRlIGludCBpbmRlbnRTaXplOwotCQotCXByaXZhdGUgU3RyaW5nIGxhc3RFcnJvclN0cjsKLQotCS8qIAkJU3RyaW5nIGxvY2F0aW9uID0gbS5ncm91cCgxKTsKLQkJCVN0cmluZyBsaW5lU3RyID0gbS5ncm91cCgyKTsKLQkJCVN0cmluZyBjb2x1bW5TdHIgPSBtLmdyb3VwKDMpOwotCQkJU3RyaW5nIGVycm9yTXNnID0gbS5ncm91cCg0KTsKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4galRpZHlFcnJvclBhcnNlciA9IFBhdHRlcm4uY29tcGlsZSgiKGxpbmVcXHMrKFxcZCspXFxzK2NvbHVtblxccysoXFxkKykpXFxzKy1cXHMrKC4rKSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBIVE1MRm9ybWF0dGVyKCkgewotCQl0aGlzKDEzMiwgdHJ1ZSwgNCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSFRNTEZvcm1hdHRlcihpbnQgbGluZVdpZHRoLCBib29sZWFuIGluZGVudCwgaW50IGluZGVudFNpemUpIHsKLQkJdGhpcy5saW5lV2lkdGggPSBsaW5lV2lkdGg7Ci0JCXRoaXMuaW5kZW50ID0gaW5kZW50OwotCQl0aGlzLmluZGVudFNpemUgPSBpbmRlbnRTaXplOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1heGltdW0gY2hhcmFjdGVyIHdpZHRoIG9mIGEgbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGluZVdpZHRoCi0JICogICAgICAgICAgICBUaGUgbGluZSB3aWR0aCAoaW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMpLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmVXaWR0aChpbnQgbGluZVdpZHRoKSB7Ci0JCXRoaXMubGluZVdpZHRoID0gbGluZVdpZHRoOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGFncyBpbmRlbnQuCi0JICogCi0JICogQHBhcmFtIGluZGVudAotCSAqICAgICAgICAgICAgSWYgdHJ1ZSwgaWRlbnQgdGhlIHRhZ3MuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5kZW50KGJvb2xlYW4gaW5kZW50KSB7Ci0JCXRoaXMuaW5kZW50ID0gaW5kZW50OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluZGVudCBzaXplLgotCSAqIAotCSAqIEBwYXJhbSBpbmRlbnRTaXplCi0JICogICAgICAgICAgICBUaGUgaW5kZW50IHNpemUgKGluIG51bWJlciBvZiBjaGFyYWN0ZXJzKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmRlbnRTaXplKGludCBpbmRlbnRTaXplKSB7Ci0JCXRoaXMuaW5kZW50U2l6ZSA9IGluZGVudFNpemU7Ci0JfQotCi0JLyoqCi0JICogRm9ybWF0cyB0aGUgZ2l2ZW4gSFRNTCBzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIGh0bWwKLQkgKiAgICAgICAgICAgIFRoZSBIVE1MIHNvdXJjZS4KLQkgKiBAcmV0dXJuIFRoZSBwcmV0dHktZm9ybWF0dGVkIEhUTUwgc291cmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZm9ybWF0SFRNTChTdHJpbmcgaHRtbCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotCQlpZiAoaHRtbCA9PSBudWxsIHx8IGh0bWwubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGh0bWw7Ci0JCX0KLQotCQlsYXN0RXJyb3JTdHIgPSBudWxsOwotCQkKLQkJVGlkeSB0aWR5ID0gbmV3IFRpZHkoKTsKLQkJdGlkeS5zZXRYSFRNTCh0cnVlKTsKLQkJdGlkeS5zZXREcm9wRW1wdHlQYXJhcyhmYWxzZSk7Ci0JCXRpZHkuc2V0RHJvcEZvbnRUYWdzKGZhbHNlKTsKLQkJdGlkeS5zZXRRdWlldCh0cnVlKTsKLQkJdGlkeS5zZXRTaG93V2FybmluZ3MoZmFsc2UpOwotCQl0aWR5LnNldFNtYXJ0SW5kZW50KGZhbHNlKTsKLQkJdGlkeS5zZXRUaWR5TWFyayhmYWxzZSk7Ci0JCXRpZHkuc2V0V3JhcGxlbihsaW5lV2lkdGgpOwotCQl0aWR5LnNldEluZGVudEF0dHJpYnV0ZXMoZmFsc2UpOwotCQl0aWR5LnNldEluZGVudENvbnRlbnQoaW5kZW50KTsKLQkJdGlkeS5zZXRTcGFjZXMoaW5kZW50U2l6ZSk7Ci0JCXRpZHkuc2V0SW5wdXRFbmNvZGluZygiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQl0aWR5LnNldE91dHB1dEVuY29kaW5nKCJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCXRpZHkuc2V0Rm9yY2VPdXRwdXQodHJ1ZSk7Ci0KLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaHRtbAotCQkJCS5nZXRCeXRlcygiVVRGLTgiKSk7IC8vJE5PTi1OTFMtMSQJCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0JCXRpZHkuc2V0RXJyb3V0KHB3KTsKLQkJdGlkeS5wYXJzZShpbnB1dCwgb3V0cHV0KTsKLQkJU3RyaW5nIGVycm9yID0gc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsKLQkJaWYgKGVycm9yICE9IG51bGwgJiYgZXJyb3IubGVuZ3RoKCkgPiAwCi0JCQkJJiYgZXJyb3Iuc3RhcnRzV2l0aCgibGluZSIpICYmIGVycm9yLmluZGV4T2YoImNvbHVtbiIpID4gMCkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWxhc3RFcnJvclN0ciA9IGVycm9yOwotCQl9Ci0KLQkJU3RyaW5nIGZvcm1hdHRlZEhUTUwgPSBuZXcgU3RyaW5nKG91dHB1dC50b0J5dGVBcnJheSgpLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3JtYXR0ZWRIVE1MID0gZXNjYXBlSFRNTChmb3JtYXR0ZWRIVE1MKTsKLQotCQlpZiAoIWh0bWwuc3RhcnRzV2l0aCgiPCFET0NUWVBFIikgJiYgIWh0bWwuc3RhcnRzV2l0aCgiPGh0bWwiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWludCBzdGFydCA9IGZvcm1hdHRlZEhUTUwuaW5kZXhPZihIVE1MX0JPRFlfU1RBUlRfVEFHKTsKLQkJCWludCBlbmQgPSBmb3JtYXR0ZWRIVE1MLmluZGV4T2YoSFRNTF9CT0RZX0VORF9UQUcpOwotCQkJaWYgKHN0YXJ0ID09IC0xIHx8IGVuZCA9PSAtMSkgewotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJc3RhcnQgKz0gSFRNTF9CT0RZX1NUQVJUX1RBR19MRU5HVEg7Ci0JCQlpZiAoc3RhcnQgPj0gZW5kKSB7Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzdGFydCArPSBGaWxlVXRpbC5MSU5FX1NFUF9MRU5HVEg7Ci0JCQllbmQgLT0gRmlsZVV0aWwuTElORV9TRVBfTEVOR1RIOwotCQkJaWYgKGluZGVudCAmJiBpbmRlbnRTaXplID4gMCkgewotCQkJCWVuZCAtPSBpbmRlbnRTaXplOwotCQkJfQotCQkJaWYgKHN0YXJ0ID49IGVuZCkgewotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJU3RyaW5nIHJlc3VsdCA9IGZvcm1hdHRlZEhUTUwuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotCQkJaWYgKGluZGVudCAmJiBpbmRlbnRTaXplID4gMCkgewotCQkJCVN0cmluZyBpbmRlbnRTdHIgPSBnZXRJbmRlbnRTdHIoaW5kZW50U2l6ZSAqIDIpOwotCQkJCXJlc3VsdCA9IGZpeEluZGVudGF0aW9uKHJlc3VsdCwgaW5kZW50U3RyKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBmb3JtYXR0ZWRIVE1MOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluZGVudCBzdHJpbmcuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEluZGVudFN0cihpbnQgaW5kZW50TGVuZ3RoKSB7Ci0JCWlmIChpbmRlbnRMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nQnVmZmVyIGluZGVudFN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRMZW5ndGg7IGkrKykgewotCQkJaW5kZW50U3RyLmFwcGVuZCgnICcpOwotCQl9Ci0JCXJldHVybiBpbmRlbnRTdHIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBFc2NhcGVzIEhUTUwgc3BlY2lhbCBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBoYW5kbGVkIGNvcnJlY3RseSBieSBKVGlkeS4KLQkgKiAKLQkgKiBAcGFyYW0gaHRtbAotCSAqICAgICAgICAgICAgVGhlIEhUTUwgc291cmNlLgotCSAqIEByZXR1cm4gVGhlIEhUTUwgc291cmNlIHdpdGggSFRNTCBzcGVjaWFsIGNoYXJhY3RlcnMgcHJlc2VydmVkIGluIGVzY2FwZWQKLQkgKiAgICAgICAgIGZvcm0uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVzY2FwZUhUTUwoU3RyaW5nIGh0bWwpIHsKLQkJaWYgKGh0bWwgPT0gbnVsbCB8fCBodG1sLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbGVuID0gaHRtbC5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjaCA9IGh0bWwuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnXHUwMGE5JzoKLQkJCQlzYi5hcHBlbmQoSFRNTF9DT1BZKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1x1MDBhZSc6Ci0JCQkJc2IuYXBwZW5kKEhUTUxfUkVHKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1x1MjBhYyc6Ci0JCQkJc2IuYXBwZW5kKEhUTUxfRVVSTyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcdTIxMjInOgotCQkJCXNiLmFwcGVuZChIVE1MX1RSQURFTUFSSyk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXNiLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFX1RBR19TVEFSVCA9ICI8cHJlPiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVfVEFHX0VORCA9ICI8L3ByZT4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFX1RBR19FTkRfTEVOR1RIID0gUFJFX1RBR19FTkQubGVuZ3RoKCk7Ci0JLyoqCi0JICogVW5kbyB0aGUgSlRpZHkgaW5kZW50LCBidXQgaWdub3JlICZsdDtwcmUmZ3Q7IHRhZ3MKLQkgKiBAcGFyYW0gaHRtbAotCSAqIEBwYXJhbSBpbmRlbnRTdHIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpeEluZGVudGF0aW9uKFN0cmluZyBodG1sLCBTdHJpbmcgaW5kZW50U3RyKSB7Ci0JCWlmIChodG1sLnN0YXJ0c1dpdGgoaW5kZW50U3RyKSkgewotCQkJaHRtbCA9IGh0bWwuc3Vic3RyaW5nKGluZGVudFN0ci5sZW5ndGgoKSk7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IHByZV9pbmRleCA9IC0xOwotCQlpbnQgbGFzdF9wcmVfZW5kX2luZGV4ID0gLTE7Ci0JCXdoaWxlICgocHJlX2luZGV4ID0gaHRtbC5pbmRleE9mKFBSRV9UQUdfU1RBUlQsIGxhc3RfcHJlX2VuZF9pbmRleCkpICE9IC0xKSB7Ci0JCQlzdHJCdWYuYXBwZW5kKGh0bWwuc3Vic3RyaW5nKGxhc3RfcHJlX2VuZF9pbmRleCA8IDAgPyAwIDogbGFzdF9wcmVfZW5kX2luZGV4ICsgUFJFX1RBR19FTkRfTEVOR1RILCBwcmVfaW5kZXgpLnJlcGxhY2VBbGwoIlxyXG4iICsgaW5kZW50U3RyLCAiXHJcbiIpKTsKLQkJCWxhc3RfcHJlX2VuZF9pbmRleCA9IGh0bWwuaW5kZXhPZihQUkVfVEFHX0VORCwgcHJlX2luZGV4KTsKLQkJCWlmIChsYXN0X3ByZV9lbmRfaW5kZXggIT0gLTEpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKGh0bWwuc3Vic3RyaW5nKHByZV9pbmRleCwgbGFzdF9wcmVfZW5kX2luZGV4ICsgUFJFX1RBR19FTkRfTEVOR1RIKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBmb3VuZCA8cHJlPiwgYnV0IG5vIGVuZGluZyA8L3ByZT4gLSBzaG91bGRuJ3QgZXZlciBnZXQgaGVyZQotCQkJCS8vIGFwcGVuZCByZXN0IG9mIHN0cmluZyBhbmQgcmV0dXJuIGl0Ci0JCQkJc3RyQnVmLmFwcGVuZChodG1sLnN1YnN0cmluZyhwcmVfaW5kZXgpKTsKLQkJCQlyZXR1cm4gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJc3RyQnVmLmFwcGVuZChodG1sLnN1YnN0cmluZyhsYXN0X3ByZV9lbmRfaW5kZXggPCAwID8gMCA6IGxhc3RfcHJlX2VuZF9pbmRleCArIFBSRV9UQUdfRU5EX0xFTkdUSCkucmVwbGFjZUFsbCgiXHJcbiIgKyBpbmRlbnRTdHIsICJcclxuIikpOwotCQlyZXR1cm4gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYXN0RXJyb3JTdHIoKSB7Ci0JCXJldHVybiBsYXN0RXJyb3JTdHI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL2h0bWwvSFRNTFBhcnNlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL2h0bWwvSFRNTFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTcyNDg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9odG1sL0hUTUxQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLmh0bWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy50aWR5LlRpZHk7Ci0KLS8qKgotICogRXh0cmFjdHMgdGhlIHRpdGxlLCBtZXRhIHRhZ3MgYW5kIHRleHQgZnJvbSBhIEhUTUwgZmlsZSBvciBzb3VyY2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSFRNTFBhcnNlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSA0MDk2OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfU0NSSVBUX1RBRyA9ICJzY3JpcHQiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfVElUTEVfVEFHID0gInRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfTUVUQV9UQUcgPSAibWV0YSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVGlkeSB0aWR5OwotCi0JcHJpdmF0ZSBTdHJpbmcgdGl0bGU7Ci0KLQlwcml2YXRlIFN0cmluZyBzdW1tYXJ5OwotCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQotCXByaXZhdGUgUHJvcGVydGllcyBtZXRhVGFnczsKLQotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGh0bWxUZXh0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSFRNTFBhcnNlcigpIHsKLQkJdHJ5IHsKLQkJCXRpZHkgPSBuZXcgVGlkeSgpOwotCQkJdGlkeS5zZXRYSFRNTCh0cnVlKTsKLQkJCXRpZHkuc2V0RHJvcEVtcHR5UGFyYXModHJ1ZSk7Ci0JCQl0aWR5LnNldERyb3BGb250VGFncyh0cnVlKTsKLQkJCXRpZHkuc2V0UXVpZXQodHJ1ZSk7Ci0JCQl0aWR5LnNldFNob3dXYXJuaW5ncyhmYWxzZSk7Ci0JCQl0aWR5LnNldFNtYXJ0SW5kZW50KGZhbHNlKTsKLQkJCXRpZHkuc2V0VGlkeU1hcmsoZmFsc2UpOwotCQkJdGlkeS5zZXRXcmFwbGVuKDEzMik7Ci0JCQl0aWR5LnNldEluZGVudEF0dHJpYnV0ZXMoZmFsc2UpOwotCQkJdGlkeS5zZXRJbmRlbnRDb250ZW50KGZhbHNlKTsKLQkJCXRpZHkuc2V0U3BhY2VzKDIpOwotCQkJdGlkeS5zZXRJbnB1dEVuY29kaW5nKCJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQl0aWR5LnNldE91dHB1dEVuY29kaW5nKCJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aWR5ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhcnNlcyB0aGUgZ2l2ZW4gSFRNTCBmaWxlLgotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnNlKEZpbGUgZmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICh0aWR5ID09IG51bGwgfHwgIWZpbGUuZXhpc3RzKCkgfHwgIWZpbGUuY2FuUmVhZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJSW5wdXRTdHJlYW1SZWFkZXIgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGZpcywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaXNyKTsKLQotCQlTdHJpbmdCdWZmZXIgdGV4dEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoQlVGRkVSX1NJWkUpOwotCQljaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbQlVGRkVSX1NJWkVdOwotCQlpbnQgY2hhcnNSZWFkOwotCQl3aGlsZSAoKGNoYXJzUmVhZCA9IGJyLnJlYWQoYnVmZmVyLCAwLCBCVUZGRVJfU0laRSkpID4gMCkgewotCQkJdGV4dEJ1ZmZlci5hcHBlbmQoYnVmZmVyLCAwLCBjaGFyc1JlYWQpOwotCQl9Ci0KLQkJcGFyc2UodGV4dEJ1ZmZlci50b1N0cmluZygpKTsKLQotCQlpZiAoYnIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlici5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIHRoZSBnaXZlbiBIVE1MIHNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZShTdHJpbmcgaHRtbFNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRpdGxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJc3VtbWFyeSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQltZXRhVGFncyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0KLQkJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoaHRtbFNvdXJjZSk7Ci0JCWlmIChkb2MgIT0gbnVsbCkgewotCQkJaHRtbFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMjQpOwotCQkJZXh0cmFjdChkb2MuZ2V0Q2hpbGROb2RlcygpKTsKLQkJCXRleHQgPSBodG1sVGV4dC50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGl0bGUgdGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSFRNTCBtZXRhIHRhZ3MuCi0JICovCi0JcHVibGljIFByb3BlcnRpZXMgZ2V0TWV0YVRhZ3MoKSB7Ci0JCXJldHVybiBtZXRhVGFnczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdW1tYXJ5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3VtbWFyeSgpIHsKLQkJcmV0dXJuIHN1bW1hcnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYm9keSB0ZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRE9NIGRvY3VtZW50IGZvciB0aGUgZ2l2ZW4gSFRNTCBzb3VyY2UuCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50IGdldERvY3VtZW50KFN0cmluZyBodG1sKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGh0bWwgPT0gbnVsbCB8fCBodG1sLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaHRtbAotCQkJCS5nZXRCeXRlcygiVVRGLTgiKSk7IC8vJE5PTi1OTFMtMSQJCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0JCXRpZHkuc2V0RXJyb3V0KHB3KTsKLQotCQlyZXR1cm4gdGlkeS5wYXJzZURPTShpbnB1dCwgb3V0cHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRyYWN0cyB0aGUgdGl0bGUsIG1ldGEgdGFncyBhbmQgYm9keSB0ZXh0IGZyb20gdGhlIGdpdmVuIG5vZGVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4dHJhY3QoTm9kZUxpc3Qgbm9kZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIG5vZGVOYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREU6Ci0JCQkJaWYgKCFub2RlTmFtZS5lcXVhbHMoSFRNTF9TQ1JJUFRfVEFHKSkgewotCQkJCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhdHRycy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQlOb2RlIGF0dHJOb2RlID0gYXR0cnMuaXRlbShqKTsKLQkJCQkJCVN0cmluZyBhdHRyTm9kZU5hbWUgPSBhdHRyTm9kZS5nZXROb2RlTmFtZSgpOwotCQkJCQkJU3RyaW5nIGF0dHJOb2RlVmFsdWUgPSBhdHRyTm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJCQkJCWlmIChhdHRyTm9kZU5hbWUuZXF1YWxzKEhUTUxfVElUTEVfVEFHKSkgewotCQkJCQkJCXRpdGxlID0gYXR0ck5vZGVWYWx1ZTsKLQkJCQkJCX0gZWxzZSBpZiAoYXR0ck5vZGVOYW1lLmVxdWFscyhIVE1MX01FVEFfVEFHKSkgewotCQkJCQkJCW1ldGFUYWdzLnB1dChhdHRyTm9kZU5hbWUsIGF0dHJOb2RlVmFsdWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCQkJaWYgKGNoaWxkTm9kZXMgIT0gbnVsbCAmJiBjaGlsZE5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJCQkJZXh0cmFjdChjaGlsZE5vZGVzKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5URVhUX05PREU6Ci0JCQkJaHRtbFRleHQuYXBwZW5kKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpLmFwcGVuZCgnICcpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vaHRtbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vaHRtbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjNTJiYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL2h0bWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgY29tbW9uIEhUTUwgcGFyc2luZyBhbmQgcHJldHR5LWZvcm1hdGluZyBzZXJ2aWNlcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjFmODkzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGFjdGl2YXRvciBmb3IgbWFuYWdpbmcgdGhlIENvbW1vbiBwbHVnLWluJ3MgbGlmZSBjeWNsZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcGx1Z2luL0Fic3RyYWN0UGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcGx1Z2luL0Fic3RyYWN0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE1N2Y5NmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3BsdWdpbi9BYnN0cmFjdFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuSTE4blV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBFUEYgcGx1Zy1pbnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvLyBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgaWNvbnMuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUEFUSCA9ICJpY29ucy8iOyAvLyROT04tTkxTLTEkOwotCi0JLy8gVGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhpcyBwbHVnLWluLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQkvLyBUaGlzIHBsdWctaW4gSUQuCi0JcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWQ7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBpbnN0YWxsIFVSTC4KLQlwcml2YXRlIFVSTCBpbnN0YWxsVVJMOwotCi0JLy8gVGhlIHBsdWctaW4gaW5zdGFsbCBwYXRoLgotCXByaXZhdGUgU3RyaW5nIGluc3RhbGxQYXRoOwotCi0JLy8gVGhlIHBsdWctaW4gaWNvbiBVUkwuCi0JcHJpdmF0ZSBVUkwgaWNvblVSTDsKLQotCS8vIFRoZSBsb2dnZXIgaGFzaCBtYXAuCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgTG9nZ2VyPiBsb2dnZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMb2dnZXI+KCk7Ci0KLQkvLyBUaGUgbWVzc2FnZSBkaWFsb2cgaGFzaCBtYXAuCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgTXNnRGlhbG9nPiBtc2dEaWFsb2dzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNc2dEaWFsb2c+KCk7Ci0KLQkvLyBUaGUgc2hhcmVkIGltYWdlIGhhc2ggbWFwLgotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEltYWdlPiBzaGFyZWRJbWFnZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEltYWdlPigpOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCi0JCWluaXQoY29udGV4dCk7Ci0KLQkJaWYgKGlzRGVidWdnaW5nKCkpIHsKLQkJCWdldExvZ2dlcigpLmxvZ0luZm8oIlN0YXJ0ZWQgIiArIHBsdWdpbklkKTsgLy8kTk9OLU5MUy0xJAkJCQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBGcmVlIHRoZSBzaGFyZWQgaW1hZ2VzLgotCQlmb3IgKEl0ZXJhdG9yIGltYWdlcyA9IHNoYXJlZEltYWdlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpbWFnZXMKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIGltYWdlcy5uZXh0KCk7Ci0JCQlpZiAoaW1hZ2UgIT0gbnVsbCAmJiAhaW1hZ2UuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0KLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQotCQlpZiAoaXNEZWJ1Z2dpbmcoKSkgewotCQkJZ2V0TG9nZ2VyKCkubG9nSW5mbygiU3RvcHBlZCAiICsgcGx1Z2luSWQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHBsdWctaW4uCi0JICogCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiAgICAgICAgICAgIFRoZSBidW5kbGUgY29udGV4dC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIEdldCB0aGUgYnVuZGxlIGZvciB0aGlzIHBsdWctaW4uCi0JCUJ1bmRsZSBidW5kbGUgPSBnZXRCdW5kbGUoKTsKLQotCQkvLyBHZXQgdGhlIHJlc291Y2UgYnVuZGxlIGZvciB0aGlzIHBsdWctaW4uCi0JCXJlc291cmNlQnVuZGxlID0gUGxhdGZvcm0uZ2V0UmVzb3VyY2VCdW5kbGUoYnVuZGxlKTsKLQotCQkvLyBHZXQgdGhlIElEIGZvciB0aGlzIHBsdWctaW4uCi0JCXBsdWdpbklkID0gYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpOwotCi0JCWlmIChpc0RlYnVnZ2luZygpKSB7Ci0JCQlnZXRMb2dnZXIoKS5sb2dJbmZvKCJJbml0aWFsaXppbmcgIiArIHBsdWdpbklkKTsgLy8kTk9OLU5MUy0xJAkJCi0JCX0KLQotCQkvLyBHZXQgdGhlIGluc3RhbGwgcGF0aCBvZiB0aGlzIHBsdWctaW4uCi0JCWluc3RhbGxVUkwgPSBidW5kbGUuZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRyeSB7Ci0JCQlpbnN0YWxsUGF0aCA9IEZpbGVMb2NhdG9yLnJlc29sdmUoaW5zdGFsbFVSTCkuZ2V0UGF0aCgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlpbnN0YWxsUGF0aCA9IFBsYXRmb3JtLmdldEluc3RhbGxMb2NhdGlvbigpLmdldFVSTCgpLmdldFBhdGgoKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlpY29uVVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLCBJQ09OX1BBVEgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlpZiAoaXNEZWJ1Z2dpbmcoKSkgewotCQkJZ2V0TG9nZ2VyKCkubG9nSW5mbygKLQkJCQkJIkluaXRpYWxpemVkICIgKyBwbHVnaW5JZCArICIsIGluc3RhbGxQYXRoPSIgKyBpbnN0YWxsUGF0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUQgb2YgdGhpcyBwbHVnLWluLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIElEIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gcGx1Z2luSWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5zdGFsbCBVUkwgb2YgdGhpcyBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBUaGUKLQkgKiAgICAgICAgICAgIGluc3RhbGwgVVJMIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldEluc3RhbGxVUkwoKSB7Ci0JCXJldHVybiBpbnN0YWxsVVJMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbGwgcGF0aCBvZiB0aGlzIHBsdWctaW4uCi0JICogCi0JICogQHBhcmFtIFRoZQotCSAqICAgICAgICAgICAgaW5zdGFsbCBwYXRoIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluc3RhbGxQYXRoKCkgewotCQlyZXR1cm4gaW5zdGFsbFBhdGg7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgYW5kIHJldHVybnMgdGhlIGxvY2FsaXplZCBwcm9wZXJ0aWVzIG9mIGEgSmF2YSBwcm9wZXJ0aWVzIGZpbGUuCi0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwcm9wZXJ0aWVzIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Zy1pbiByb290LgotCSAqIEByZXR1cm4gQSA8Y29kZT5Qcm9wZXJ0aWVzPC9jb2RlPiBvYmplY3QuCi0JICovCi0JcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcyhTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWlmIChwYXRoID09IG51bGwpIHsKLQkJCXJldHVybiBwcm9wczsKLQkJfQotCQkKLQkJU3RyaW5nIGZpbGVQYXRoID0gZ2V0TG9jYWxpemVkRmlsZShwYXRoLCB0cnVlKTsKLQkJCi0vLwkJU3RyaW5nIGZpbGVQYXRoID0gbnVsbDsKLS8vCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVXRpbC5nZXRGaWxlTmFtZShwYXRoKTsKLS8vCQlpbnQgaW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKGZpbGVOYW1lKTsKLS8vCQlTdHJpbmcgcGF0aE5hbWUgPSBwYXRoLnN1YnN0cmluZygwLCBpbmRleCk7Ci0vLwotLy8JCUxvY2FsZSBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotLy8JCUJ1bmRsZSBidW5kbGUgPSBnZXRCdW5kbGUoKTsKLS8vCQlCdW5kbGVbXSBidW5kbGVzID0gUGxhdGZvcm0uZ2V0RnJhZ21lbnRzKGJ1bmRsZSk7Ci0vLwkJaWYgKGJ1bmRsZXMgIT0gbnVsbCkgewotLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLS8vCQkJCVVSTCBlbnRyeSA9IGJ1bmRsZXNbaV0uZ2V0RW50cnkocGF0aE5hbWUpOwotLy8JCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLS8vCQkJCQlVUkwgdXJsID0gUGxhdGZvcm0ucmVzb2x2ZShlbnRyeSk7Ci0vLwkJCQkJZmlsZVBhdGggPSBJMThuVXRpbC5nZXRMb2NhbGl6ZWRGaWxlKHVybC5nZXRQYXRoKCkgKyBmaWxlTmFtZSwgbG9jYWxlKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJCWlmIChmaWxlUGF0aCAhPSBudWxsKSB7Ci0vLwkJCQkJCWJyZWFrOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCi0vLwkJaWYgKGZpbGVQYXRoID09IG51bGwpIHsKLS8vCQkJVVJMIGVudHJ5ID0gYnVuZGxlLmdldEVudHJ5KHBhdGgpOwotLy8JCQlpZiAoZW50cnkgIT0gbnVsbCkgewotLy8JCQkJVVJMIHVybCA9IFBsYXRmb3JtLnJlc29sdmUoZW50cnkpOwotLy8JCQkJZmlsZVBhdGggPSBJMThuVXRpbC5nZXRMb2NhbGl6ZWRGaWxlKHVybC5nZXRQYXRoKCksIGxvY2FsZSk7Ci0vLwkJCQlpZiAoZmlsZVBhdGggPT0gbnVsbCkgewotLy8JCQkJCWZpbGVQYXRoID0gdXJsLmdldFBhdGgoKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLQotCQlpZiAoZmlsZVBhdGggIT0gbnVsbCkgewotCQkJcHJvcHMubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVQYXRoKSk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvcHM7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBsb2NhbGUgc3BlY2lmaWMgYWJzb2x1dGUgZmlsZSBwYXRoIG5hbWUgb2YgdGhlIGdpdmVuIGZpbGUgaW4gdGhlIHBsdWdpbi4KLQkgKiBAcGFyYW0gcGF0aCBUaGUgcHJvcGVydGllcyBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4gcm9vdC4KLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgbG9jYWxlIHNwZWNpZmljIGFic29sdXRlIGZpbGUgcGF0aCBuYW1lIG9mIHRoZSBnaXZlbiBmaWxlLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsaXplZEZpbGUoU3RyaW5nIHBhdGgsIGJvb2xlYW4gdXNlRGVmYXVsdCkgdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQlTdHJpbmcgZmlsZVBhdGggPSBudWxsOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVXRpbC5nZXRGaWxlTmFtZShwYXRoKTsKLQkJaW50IGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZihmaWxlTmFtZSk7Ci0JCVN0cmluZyBwYXRoTmFtZSA9IHBhdGguc3Vic3RyaW5nKDAsIGluZGV4KTsKLQotCQlMb2NhbGUgbG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKLQkJCi0JCUJ1bmRsZSBidW5kbGUgPSBnZXRCdW5kbGUoKTsKLQkJQnVuZGxlW10gYnVuZGxlcyA9IFBsYXRmb3JtLmdldEZyYWdtZW50cyhidW5kbGUpOwotCQlpZiAoYnVuZGxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlVUkwgZW50cnkgPSBidW5kbGVzW2ldLmdldEVudHJ5KHBhdGhOYW1lKTsKLQkJCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJCQlVUkwgdXJsID0gRmlsZUxvY2F0b3IucmVzb2x2ZShlbnRyeSk7Ci0JCQkJCWZpbGVQYXRoID0gSTE4blV0aWwuZ2V0TG9jYWxpemVkRmlsZSh1cmwuZ2V0UGF0aCgpICsgZmlsZU5hbWUsIGxvY2FsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGZpbGVQYXRoICE9IG51bGwpIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGZpbGVQYXRoID09IG51bGwpIHsKLQkJCVVSTCBlbnRyeSA9IGJ1bmRsZS5nZXRFbnRyeShwYXRoKTsKLQkJCWlmIChlbnRyeSAhPSBudWxsKSB7Ci0JCQkJVVJMIHVybCA9IEZpbGVMb2NhdG9yLnJlc29sdmUoZW50cnkpOwotCQkJCWZpbGVQYXRoID0gSTE4blV0aWwuZ2V0TG9jYWxpemVkRmlsZSh1cmwuZ2V0UGF0aCgpLCBsb2NhbGUpOwotCQkJCWlmIChmaWxlUGF0aCA9PSBudWxsICYmIHVzZURlZmF1bHQpIHsKLQkJCQkJZmlsZVBhdGggPSB1cmwuZ2V0UGF0aCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmaWxlUGF0aDsKLQl9Ci0JCi0vLwkvKioKLS8vCSAqIGdldCB0aGUgbG9jYWxpemVkIGZpbGVzIGZvciB0aGUgZmlsZXMgaW4gdGhlIHNwZWNpZmllZCBmb2xkZXIuIFRoZSBmb2xkZXIgaXMgYSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBwbHVnaW4uCi0vLwkgKiByZXR1cm5zIGEgbWFwIG9mIHRoZSBmaWxlcyAoaW4gcmFsaXRpdmUgcGF0aCB0byB0aGUgcGx1Z2luKSB0byB0aGVpciBsb2NhbGl6ZWQgZmlsZXMgaW4gYWJzb2x1dGUgcGF0aC4KLS8vCSAqIEBwYXJhbSBmb2xkZXIgU3RyaW5nIHBhdGggcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcGx1Z2luCi0vLwkgKiBAcGFyYW0gcmVjdXJzaXZlIGJvb2xlYW4gaWYgdHJ1ZSByZWN1cmlzZWx5IGdldCBhbGwgZmlsZXMgaW4gc3ViIGZvbGRlcnMKLS8vCSAqIEByZXR1cm4gTWFwIGEgbWFwIG9mIHRoZSBmaWxlcyAoaW4gcmFsaXRpdmUgcGF0aCB0byB0aGUgcGx1Z2luKSB0byB0aGVpciBsb2NhbGl6ZWQgZmlsZXMgaW4gYWJzb2x1dGUgcGF0aC4KLS8vCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLS8vCSAqLwotLy8JcHVibGljIE1hcCBnZXRMb2NhbGl6ZWRGaWxlcyhTdHJpbmcgZm9sZGVyLCBib29sZWFuIHJlY3Vyc2l2ZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0vLwl7Ci0vLwkJTWFwIGZpbGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotLy8JCQotLy8JCVN0cmluZyBwbHVnaW5QYXRoID0gZ2V0SW5zdGFsbFBhdGgoKTsKLS8vCQkKLS8vCQlMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCUZpbGUgZiA9IG5ldyBGaWxlKHBsdWdpblBhdGgsIGZvbGRlcik7Ci0vLwkJRmlsZVV0aWwuZ2V0QWxsRmlsZXMoZiwgZmlsZXMsIHRydWUpOwotLy8KLS8vCQkvLyBmb3IgZWFjaCBmaWxlIGZvdW5kIGluIHRoZSBzcGVjaWZpZWQgZm9sZGVyLCBnZXQgdGhlIGxvY2FsaXplZCBmaWxlCi0vLwkJLy8gcHV0IGFuIGFudHJ5IG9mIHRoZSBvcmlnaW5hbCBmaWxlIGFuZCB0aGUgbG9jYWxpemVkIGZpbGUKLS8vCQlVUkkgcGx1Z2luVXJpID0gbmV3IEZpbGUocGx1Z2luUGF0aCkudG9VUkkoKTsKLS8vCQkKLS8vCQlmb3IgKCBJdGVyYXRvciBpdCA9IGZpbGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotLy8JCXsKLS8vCQkJRmlsZSBzcmMgPSAoRmlsZSlpdC5uZXh0KCk7Ci0vLwkJCVN0cmluZyByZWxQYXRoID0gcGx1Z2luVXJpLnJlbGF0aXZpemUoc3JjLnRvVVJJKCkpLmdldFBhdGgoKTsKLS8vCQkJCi0vLwkJCS8vIG9ubHkgZ2V0IHRoZSBsb2NhbGUgc3BlY2lmaWMgZmlsZSwgZG9uJ3QgaW5jbHVkZSB0aGUgZGVmYXVsdCBvbmUKLS8vCQkJU3RyaW5nIGxvY2FsaXplZEZpbGUgPSBnZXRMb2NhbGl6ZWRGaWxlKHJlbFBhdGgsIGZhbHNlKTsKLS8vCQkJaWYgKCBsb2NhbGl6ZWRGaWxlICE9IG51bGwgKQotLy8JCQl7Ci0vLwkJCQlmaWxlTWFwLnB1dChyZWxQYXRoLCBsb2NhbGl6ZWRGaWxlKTsKLS8vCQkJfQotLy8JCX0KLS8vCQkKLS8vCQlyZXR1cm4gZmlsZU1hcDsKLS8vCX0KLQkKLQkvKioKLQkgKiBmb3IgdGhlIGdpdmVuIHBhdGggaW4gdGhlIHBsdWdpbiwgZmluZCB0aGUgbG9jYWxpemVkIGZpbGVzIGZvcm0gdGhlIG5sIGZyYWdlbWVuZXRzIAotCSAqIGFuZCBjb3B5IHRoZSBsb2NhbGl6ZWQgZmlsZXMgdG8gdGhlIGRlc3RpbmF0aW9uIGZvbGRlcgotCSAqIEBwYXJhbSBwYXRoIFN0cmluZyBhIHJlbGF0aXZlIHBhdGggdG8gdGhlIHBsdWdpbiByb290LiAKLQkgKiBUaGUgZmlsZXMgaW4gdGhpcyBmb2xkZXIgd2lsbCBiZSBpdGVyYXRlZCBhbmQgdGhlaXIgbG9jYWxpemVkIGZpbGVzIHdpbGwgYmUgY29waWVkIG92ZXIKLQkgKiBAcGFyYW0gdG9EaXIgRklsZSB0aGUgZGVzdGluYXRpb24gZm9sZGVyIAotCSAqIEBwYXJhbSByZWN1cnNpdmUgYm9vbGVhbiByZWN1cml2ZWx5IGxvb2tpbmcgZm9yIGZpbGVzIGludCB0aGUgc3BlY2lmaWVkIGZvbGRlcgotCSAqIEBwYXJhbSB1c2VMb2NhbGVGaWxlTmFtZSBib29sZWFuIGlmIHRydWUgdGhlIGxvY2FsZSBzcGVjaWZpYyBmaWxlIG5hbWVzIHdpbGwgYmUgdXNlZCBpbiB0aGUgY29waWVkIGRlc3RpbmF0aW9uLCAKLQkgKiBvdGhlcndpc2UsIHRoZSBsb2NhbGUgc3BlY2lmaWMgZmlsZSBuYW1lIHdpbGwgYmUgcmVuYW1lZCB0byB0aGUgZGVmYXVsdCBvbmUgaW4gdGhlIGRlc3RpbmF0aW9uIGZvbGRlcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5TG9jYWxpemVkRmlsZXMoU3RyaW5nIHBhdGgsIEZpbGUgdG9EaXIsIGJvb2xlYW4gcmVjdXJzaXZlLCBib29sZWFuIHVzZUxvY2FsZUZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCVN0cmluZyBwbHVnaW5QYXRoID0gZ2V0SW5zdGFsbFBhdGgoKTsKLQkJVVJJIHBsdWdpblVyaSA9IG5ldyBGaWxlKHBsdWdpblBhdGgpLnRvVVJJKCk7Ci0JICAgIFVSSSBwYXRoVXJpID0gbmV3IEZpbGUocGx1Z2luUGF0aCwgcGF0aCkudG9VUkkoKTsKLQotCQlMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlGaWxlIGYgPSBuZXcgRmlsZShwbHVnaW5QYXRoLCBwYXRoKTsKLQkJRmlsZVV0aWwuZ2V0QWxsRmlsZXMoZiwgZmlsZXMsIHJlY3Vyc2l2ZSk7Ci0KLQkJLy8gZm9yIGVhY2ggZmlsZSBmb3VuZCBpbiB0aGUgc3BlY2lmaWVkIGZvbGRlciwgZ2V0IHRoZSBsb2NhbGl6ZWQgZmlsZQotCQlmb3IgKCBJdGVyYXRvciBpdCA9IGZpbGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotCQl7Ci0JCQlVUkkgc3JjVXJpID0gKChGaWxlKWl0Lm5leHQoKSkudG9VUkkoKTsKLQkJCQotCQkJLy8gZ2V0IHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBmaWxlIHRvIHRoZSBwbHVnaW4gcm9vdCwgdGhlbiBmaW5kIHRoZSBsb2NhbGl6ZWQgZmlsZQotCQkJU3RyaW5nIHJlbFBhdGggPSBwbHVnaW5VcmkucmVsYXRpdml6ZShzcmNVcmkpLmdldFBhdGgoKTsKLQkJCQotCQkJLy8gb25seSBnZXQgdGhlIGxvY2FsZSBzcGVjaWZpYyBmaWxlLCBkb24ndCBpbmNsdWRlIHRoZSBkZWZhdWx0IG9uZQotCQkJU3RyaW5nIGxvY2FsaXplZEZpbGUgPSBnZXRMb2NhbGl6ZWRGaWxlKHJlbFBhdGgsIGZhbHNlKTsKLQkJCWlmICggbG9jYWxpemVkRmlsZSA9PSBudWxsICkKLQkJCXsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQkJCQotICAgIAkJLy8gbmVlZCB0byBjaGFuZ2UgdGhlIHRhcmdldCBmaWxlIHBhdGggdG8gcmVsYXRpdmUgdG8gdGhlIHBhdGggaW5zdGVhZCBvZiB0aGUgcGx1Z2luIHJvb3QKLSAgICAJCXJlbFBhdGggPSBwYXRoVXJpLnJlbGF0aXZpemUoc3JjVXJpKS5nZXRQYXRoKCk7Ci0gICAgCQlGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShsb2NhbGl6ZWRGaWxlKTsKLSAgICAJCUZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRvRGlyLCByZWxQYXRoKTsKLSAgICAJCUZpbGUgdGFyZ2V0UGFyZW50ID0gdGFyZ2V0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgCQkKLQkJCS8vIGNvcHkgdGhlIGZpbGUgdG8gdGhlIGRlc2l0aW5hdGlvbgotCQkJLy8gaWYgdXNlTG9jYWxlRmlsZU5hbWUgaXMgdHJ1ZSwgdGhlIGRlc3RpbmF0aW9uIGZpbGUgbmFtZSBzaG91bGQgYWxzbyB1c2UgdGhlIGxvY2FsZSBzcGVjaWZpYyBmaWxlIG5hbWUKLSAgICAJCWlmICggdXNlTG9jYWxlRmlsZU5hbWUgKQotICAgIAkJewotICAgIAkJCVN0cmluZyBmaWxlTmFtZSA9IHNyY0ZpbGUuZ2V0TmFtZSgpOwotICAgIAkJCXRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXRQYXJlbnQsIGZpbGVOYW1lKTsKLSAgICAJCX0KLSAgICAJCQotICAgIAkJaWYgKGlzRGVidWdnaW5nKCkpIHsKLQkgICAgCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvcHlpbmcgbG9jYWxpemVkIGZpbGU6ICIpOyAvLyROT04tTkxTLTEkCi0JICAgIAkJU3lzdGVtLm91dC5wcmludGxuKCJTb3VyY2U6ICIgKyBzcmNGaWxlKTsgLy8kTk9OLU5MUy0xJAotCSAgICAJCVN5c3RlbS5vdXQucHJpbnRsbigiVGFyZ2V0OiAiICsgdGFyZ2V0RmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkgICAgCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOyAvLyROT04tTkxTLTEkCi0gICAgCQl9Ci0gICAgCQkKLSAgICAJCXRyeSB7Ci0gICAgCQkJaWYgKCAhdGFyZ2V0UGFyZW50LmV4aXN0cygpICkKLSAgICAJCQl7Ci0gICAgCQkJCXRhcmdldFBhcmVudC5ta2RpcnMoKTsKLSAgICAJCQl9Ci0gICAgCQkJCi0gICAgCQkJaWYgKCAhdGFyZ2V0RmlsZS5leGlzdHMoKSApCi0gICAgCQkJewotICAgIAkJCQl0YXJnZXRGaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLSAgICAJCQl9Ci0gICAgCQkJCi0JCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjRmlsZSwgdGFyZ2V0RmlsZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkuCi0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gJ1snICsga2V5ICsgJ10nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZvcm1hdHRlZCBsb2NhbGl6ZWQgbWVzc2FnZSBnaXZlbiB0aGUgcmVzb3VyY2Uga2V5IGFuZCB0aGUKLQkgKiBtZXNzYWdlIGFyZ3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGFyZ3VtZW50Ci0JICogICAgICAgICAgICBUaGUgbWVzc2FnZSBhcmd1bWVudC4KLQkgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbG9jYWxpemVkIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIFN0cmluZyBmb3JtYXRNZXNzYWdlKFN0cmluZyBrZXksIE9iamVjdCBhcmd1bWVudCkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbXNnID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQkJT2JqZWN0W10gYXJndW1lbnRzID0geyBhcmd1bWVudCB9OwotCQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChtc2csIGFyZ3VtZW50cyk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiAnWycgKyBrZXkgKyAnXSc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgVVJMIGdpdmVuIHRoZSByZWxhdGl2ZSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBpbWFnZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4ncyByb290LgotCSAqIEByZXR1cm4gVGhlIGltYWdlIFVSTC4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldEltYWdlVVJMKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKGljb25VUkwsIHJlbGF0aXZlUGF0aCk7Ci0JCQlyZXR1cm4gRmlsZUxvY2F0b3IucmVzb2x2ZSh1cmwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGdpdmVuIHRoZSByZWxhdGl2ZSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBpbWFnZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4ncyByb290LgotCSAqIEByZXR1cm4gVGhlIGltYWdlIGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwoaWNvblVSTCwgcmVsYXRpdmVQYXRoKTsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBnaXZlbiB0aGUgcmVsYXRpdmUgcGF0aC4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgcmV0dXJuZWQgaW1hZ2UgbmVlZCB0byBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgotCSAqIAotCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBpbWFnZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4ncyByb290LgotCSAqIEByZXR1cm4gVGhlIGltYWdlLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKHJlbGF0aXZlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoZmFsc2UpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbWFnZSBnaXZlbiB0aGUgcmVsYXRpdmUgcGF0aC4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgcmV0dXJuZWQgaW1hZ2Ugd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGZyZWVkIHdoZW4gdGhlIHBsdWctaW4KLQkgKiBzaHV0cyBkb3duLgotCSAqIAotCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBpbWFnZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4ncyByb290LgotCSAqIEByZXR1cm4gVGhlIGltYWdlLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRTaGFyZWRJbWFnZShTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCUltYWdlIGltYWdlID0gKEltYWdlKSBzaGFyZWRJbWFnZXMuZ2V0KHJlbGF0aXZlUGF0aCk7Ci0JCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaW1hZ2U7Ci0JCX0KLQotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKHJlbGF0aXZlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoZmFsc2UpOwotCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQlzaGFyZWRJbWFnZXMucHV0KHJlbGF0aXZlUGF0aCwgaW1hZ2UpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvZ2dlciBnaXZlbiB0aGUgcGx1Zy1pbiBJRC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuZXcgb3IgY2FjaGVkIGxvZ2dlci4KLQkgKi8KLQlwdWJsaWMgTG9nZ2VyIGdldExvZ2dlcigpIHsKLQkJTG9nZ2VyIGxvZ2dlciA9IChMb2dnZXIpIGxvZ2dlcnMuZ2V0KHBsdWdpbklkKTsKLQkJaWYgKGxvZ2dlciA9PSBudWxsKSB7Ci0JCQlsb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMpOwotCQkJbG9nZ2Vycy5wdXQocGx1Z2luSWQsIGxvZ2dlcik7Ci0JCX0KLQkJcmV0dXJuIGxvZ2dlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIGRpYWxvZyBnaXZlbiB0aGUgcGx1Zy1pbiBJRC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuZXcgb3IgY2FjaGVkIG1lc3NhZ2UgZGlhbG9nLgotCSAqLwotCXB1YmxpYyBNc2dEaWFsb2cgZ2V0TXNnRGlhbG9nKCkgewotCQlNc2dEaWFsb2cgbXNnRGlhbG9nID0gKE1zZ0RpYWxvZykgbXNnRGlhbG9ncy5nZXQocGx1Z2luSWQpOwotCQlpZiAobXNnRGlhbG9nID09IG51bGwpIHsKLQkJCW1zZ0RpYWxvZyA9IG5ldyBNc2dEaWFsb2codGhpcyk7Ci0JCQltc2dEaWFsb2dzLnB1dChwbHVnaW5JZCwgbXNnRGlhbG9nKTsKLQkJfQotCQlyZXR1cm4gbXNnRGlhbG9nOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBkaXNwbGF5IHRvIGJlIHVzZWQuIFRoZSBtZXRob2QgZmlyc3QgY2hlY2tzLCBpZgotCSAqIHRoZSB0aHJlYWQgY2FsbGluZyB0aGlzIG1ldGhvZCBoYXMgYW4gYXNzb2NpYXRlZCBkaXNhcGx5LiBJZiBzbywgdGhpcwotCSAqIGRpc3BsYXkgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgbWV0aG9kIHJldHVybnMgdGhlIGRlZmF1bHQgZGlzcGxheS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpc3BsYXkgZ2V0U3RhbmRhcmREaXNwbGF5KCkgewotCQlEaXNwbGF5IGRpc3BsYXk7Ci0JCWRpc3BsYXk9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlpZiAoZGlzcGxheSA9PSBudWxsKQotCQkJZGlzcGxheT0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCXJldHVybiBkaXNwbGF5OwkJCi0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wbHVnaW4vcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3BsdWdpbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyMTIyNjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3BsdWdpbi9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBjb21tb24gc2VydmljZXMgZm9yIGFjY2Vzc2luZyBhIHBsdWctaW4ncyBpbnN0YWxsIHBhdGgsIGltYWdlcywgbG9nZ2VyIGFuZCByZXNvdXJjZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0RlYnVnVHJhY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9EZWJ1Z1RyYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3MGJhODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0RlYnVnVHJhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5OwotCi0vKioKLSAqIEhlbHBlciB1dGlsaXR5IGZvciBwcmludGluZyBkZWJ1ZyB0cmFjZXMgdG8gdGhlIGNvbnNvbGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVidWdUcmFjZSB7Ci0KLQkvKioKLQkgKiBQcmludHMgYSBkZWJ1ZyB0cmFjZSB0byB0aGUgY29uc29sZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5zdGFuY2UKLQkgKiAgICAgICAgICAgIGEgY2xhc3MgaW5zdGFuY2UKLQkgKiBAcGFyYW0gbWV0aG9kCi0JICogICAgICAgICAgICBhIG1ldGhvZCBuYW1lCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgYSBkZWJ1ZyBtZXNzYWdlCi0JICogQHBhcmFtIHRoCi0JICogICAgICAgICAgICBhIDxjb2RlPlRocm93YWJsZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50KE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIG1ldGhvZCwgU3RyaW5nIG1zZywKLQkJCVRocm93YWJsZSB0aCkgewotCQlTdHJpbmdCdWZmZXIgZGVidWdNc2cgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChpbnN0YW5jZSAhPSBudWxsKSB7Ci0JCQlkZWJ1Z01zZy5hcHBlbmQoaW5zdGFuY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJZGVidWdNc2cuYXBwZW5kKCcuJykuYXBwZW5kKG1ldGhvZCk7Ci0JCQl9Ci0JCQlkZWJ1Z01zZy5hcHBlbmQoIjogIik7Ci0JCX0KLQkJaWYgKG1zZyAhPSBudWxsICYmIG1zZy5sZW5ndGgoKSA+IDApIHsKLQkJCWRlYnVnTXNnLmFwcGVuZChtc2cpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKGRlYnVnTXNnKTsKLQkJaWYgKHRoICE9IG51bGwpIHsKLQkJCXRoLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIGEgZGVidWcgdHJhY2UgdG8gdGhlIGNvbnNvbGUuCi0JICogCi0JICogQHBhcmFtIGluc3RhbmNlCi0JICogICAgICAgICAgICBhIGNsYXNzIGluc3RhbmNlCi0JICogQHBhcmFtIG1ldGhvZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgbmFtZQotCSAqIEBwYXJhbSB0aAotCSAqICAgICAgICAgICAgYSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludChPYmplY3QgaW5zdGFuY2UsIFN0cmluZyBtZXRob2QsIFRocm93YWJsZSB0aCkgewotCQlwcmludChpbnN0YW5jZSwgbWV0aG9kLCBudWxsLCB0aCk7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIGEgZGVidWcgdHJhY2UgdG8gdGhlIGNvbnNvbGUuCi0JICogCi0JICogQHBhcmFtIGluc3RhbmNlCi0JICogICAgICAgICAgICBhIGNsYXNzIGluc3RhbmNlCi0JICogQHBhcmFtIG1ldGhvZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgbmFtZQotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIGEgZGVidWcgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludChPYmplY3QgaW5zdGFuY2UsIFN0cmluZyBtZXRob2QsIFN0cmluZyBtc2cpIHsKLQkJcHJpbnQoaW5zdGFuY2UsIG1ldGhvZCwgbXNnLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgYSBkZWJ1ZyB0cmFjZSB0byB0aGUgY29uc29sZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5zdGFuY2UKLQkgKiAgICAgICAgICAgIGEgY2xhc3MgaW5zdGFuY2UKLQkgKiBAcGFyYW0gbWV0aG9kCi0JICogICAgICAgICAgICBhIG1ldGhvZCBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50KE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIG1ldGhvZCkgewotCQlwcmludChpbnN0YW5jZSwgbWV0aG9kLCBudWxsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgYSBkZWJ1ZyB0cmFjZSB0byB0aGUgY29uc29sZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGgKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnQoVGhyb3dhYmxlIHRoKSB7Ci0JCWlmICh0aCAhPSBudWxsKSB7Ci0JCQl0aC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0VQRlZlcnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9FUEZWZXJzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVkN2QwMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0VQRlZlcnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5OwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgc2luZ2xlIHZlcnNpb24gb2YgRVBGIENvbXBvc2VyLgotICogSXQgY29udGFpbnMgYWxsIHRoZSB2ZXJzaW9ucyBvZiB0aGUgc3ViLWNvbXBvbmVudHMgb2YgRVBGLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaWNuZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVQRlZlcnNpb24gewotCi0JLy8gdGhlIHRvb2wgdmVyc2lvbgotCXByb3RlY3RlZCBWZXJzaW9uIHRvb2xWZXJzaW9uOwotCQotCS8vIHRoZSBsaWJyYXJ5IHZlcnNpb24KLQlwcm90ZWN0ZWQgVmVyc2lvbiBsaWJyYXJ5VmVyc2lvbjsKLQkKLQkvLyB0aGUgc2NoZW1hIHZlcnNpb24KLQlwcm90ZWN0ZWQgVmVyc2lvbiB4bWxTY2hlbWFWZXJzaW9uOwotCQotCQotCXB1YmxpYyBFUEZWZXJzaW9uKCkgewotCQl0aGlzLnRvb2xWZXJzaW9uID0gVmVyc2lvbi5lbXB0eVZlcnNpb247Ci0JCXRoaXMubGlicmFyeVZlcnNpb24gPSBWZXJzaW9uLmVtcHR5VmVyc2lvbjsKLQkJdGhpcy54bWxTY2hlbWFWZXJzaW9uID0gVmVyc2lvbi5lbXB0eVZlcnNpb247Ci0JfTsKLQkKLQlwdWJsaWMgRVBGVmVyc2lvbihTdHJpbmcgdG9vbFZlcnNpb24sIFN0cmluZyBsaWJyYXJ5VmVyc2lvbiwgU3RyaW5nIHhtbFNjaGVtYVZlcnNpb24pIHsKLQkJdGhpcy50b29sVmVyc2lvbiA9IG5ldyBWZXJzaW9uKHRvb2xWZXJzaW9uKTsKLQkJdGhpcy5saWJyYXJ5VmVyc2lvbiA9IG5ldyBWZXJzaW9uKGxpYnJhcnlWZXJzaW9uKTsKLQkJdGhpcy54bWxTY2hlbWFWZXJzaW9uID0gbmV3IFZlcnNpb24oeG1sU2NoZW1hVmVyc2lvbik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgdG9vbCB2ZXJzaW9uCi0JICovCi0JcHVibGljIFZlcnNpb24gZ2V0VG9vbFZlcnNpb24oKSB7Ci0JCXJldHVybiB0b29sVmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBsaWJyYXJ5IHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgVmVyc2lvbiBnZXRMaWJyYXJ5VmVyc2lvbigpIHsKLQkJcmV0dXJuIGxpYnJhcnlWZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIFhNTCBzY2hlbWEgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBWZXJzaW9uIGdldFhNTFNjaGVtYVZlcnNpb24oKSB7Ci0JCXJldHVybiB4bWxTY2hlbWFWZXJzaW9uOwotCX0KLQkKLQkvKioKLQkgKiBDb21wYXJlcyB0aGUgZ2l2ZW4gdG9vbCB2ZXJzaW9uIHRvIHRoaXMgb25lCi0JICogCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbiNjb21wYXJlVG8oKQotCSAqIAotCSAqIEBwYXJhbSBzY2hlbWFWZXJzaW9uIFRoZSBzY2hlbWEgdmVyc2lvbiB0byBiZSBjb21wYXJlZC4KLQkgKiBAcmV0dXJuIEEgbmVnYXRpdmUgaW50ZWdlciBpZiB0aGlzIHRvb2wgdmVyc2lvbiBpcyBsZXNzIHRoYW4gdGhlIGdpdmVuIG9uZTxiciAvPgotCSAqIFplcm8gaWYgdGhlIHRoaXMgdG9vbCB2ZXJzaW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBnaXZlbiBvbmU8YnIgLz4KLQkgKiBBIHBvc2l0aXZlIGludGVnZXIgaWYgdGhpcyB0b29sIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiBvbmU8YnIgLz4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmVUb29sVmVyc2lvblRvKFZlcnNpb24gdG9vbFZlcnNpb24pIHsKLQkJaWYgKCFWZXJzaW9uVXRpbC5pc1ZlcnNpb25DaGVja2luZ0Rpc2FibGVkKCkpCi0JCQlyZXR1cm4gZ2V0VG9vbFZlcnNpb24oKS5jb21wYXJlVG8odG9vbFZlcnNpb24pOwotCQllbHNlIAotCQkJcmV0dXJuIDA7Ci0JfQotCQotCS8qKgotCSAqIENvbXBhcmVzIHRoZSBnaXZlbiBsaWJyYXJ5IHZlcnNpb24gdG8gdGhpcyBvbmUKLQkgKiAKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uI2NvbXBhcmVUbygpCi0JICogCi0JICogQHBhcmFtIHNjaGVtYVZlcnNpb24gVGhlIHNjaGVtYSB2ZXJzaW9uIHRvIGJlIGNvbXBhcmVkLgotCSAqIEByZXR1cm4gQSBuZWdhdGl2ZSBpbnRlZ2VyIGlmIHRoaXMgbGlicmFyeSB2ZXJzaW9uIGlzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gb25lPGJyIC8+Ci0JICogWmVybyBpZiB0aGUgdGhpcyBsaWJyYXJ5IHZlcnNpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGdpdmVuIG9uZTxiciAvPgotCSAqIEEgcG9zaXRpdmUgaW50ZWdlciBpZiB0aGlzIGxpYnJhcnkgdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIG9uZTxiciAvPgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZUxpYnJhcnlWZXJzaW9uVG8oVmVyc2lvbiBsaWJyYXJ5VmVyc2lvbikgewotCQlpZiAoIVZlcnNpb25VdGlsLmlzVmVyc2lvbkNoZWNraW5nRGlzYWJsZWQoKSkKLQkJCXJldHVybiBnZXRMaWJyYXJ5VmVyc2lvbigpLmNvbXBhcmVUbyhsaWJyYXJ5VmVyc2lvbik7Ci0JCWVsc2UgCi0JCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBDb21wYXJlcyB0aGUgZ2l2ZW4gWE1MIFNjaGVtYSB2ZXJzaW9uIHRvIHRoaXMgb25lCi0JICogCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbiNjb21wYXJlVG8oKQotCSAqIAotCSAqIEBwYXJhbSBzY2hlbWFWZXJzaW9uIFRoZSBzY2hlbWEgdmVyc2lvbiB0byBiZSBjb21wYXJlZC4KLQkgKiBAcmV0dXJuIEEgbmVnYXRpdmUgaW50ZWdlciBpZiB0aGlzIFhNTCBTY2hlbWEgdmVyc2lvbiBpcyBsZXNzIHRoYW4gdGhlIGdpdmVuIG9uZTxiciAvPgotCSAqIFplcm8gaWYgdGhlIHRoaXMgWE1MIFNjaGVtYSB2ZXJzaW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBnaXZlbiBvbmU8YnIgLz4KLQkgKiBBIHBvc2l0aXZlIGludGVnZXIgaWYgdGhpcyBYTUwgU2NoZW1hIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiBvbmU8YnIgLz4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmVYTUxTY2hlbWFWZXJzaW9uVG8oVmVyc2lvbiBYTUxTY2hlbWFWZXJzaW9uKSB7Ci0JCWlmICghVmVyc2lvblV0aWwuaXNWZXJzaW9uQ2hlY2tpbmdEaXNhYmxlZCgpKQotCQkJcmV0dXJuIGdldFhNTFNjaGVtYVZlcnNpb24oKS5jb21wYXJlVG8oWE1MU2NoZW1hVmVyc2lvbik7Ci0JCWVsc2UgCi0JCQlyZXR1cm4gMDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldFRvb2xWZXJzaW9uKCkudG9TdHJpbmcoKSArICIsIiArIC8vJE5PTi1OTFMtMSQKLQkJZ2V0TGlicmFyeVZlcnNpb24oKS50b1N0cmluZygpICsgIiwiICsgLy8kTk9OLU5MUy0xJAotCQlnZXRYTUxTY2hlbWFWZXJzaW9uKCkudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSB0aGlzKSB7IC8vIHF1aWNrdGVzdAotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBFUEZWZXJzaW9uKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJRVBGVmVyc2lvbiBvdGhlciA9IChFUEZWZXJzaW9uKSBvYmplY3Q7Ci0JCXJldHVybiAoZ2V0VG9vbFZlcnNpb24oKS5lcXVhbHMob3RoZXIuZ2V0VG9vbFZlcnNpb24oKSkpICYmIChnZXRMaWJyYXJ5VmVyc2lvbigpLmVxdWFscyhvdGhlci5nZXRMaWJyYXJ5VmVyc2lvbigpKSkKLQkJCQkmJiAoZ2V0WE1MU2NoZW1hVmVyc2lvbigpLmVxdWFscyhvdGhlci5nZXRYTUxTY2hlbWFWZXJzaW9uKCkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvRVBGVmVyc2lvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9FUEZWZXJzaW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0M2FkY2RhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9FUEZWZXJzaW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc3RvcmVzIGFsbCBvZiB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGtub3duIEVQRiB2ZXJzaW9ucy4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFUEZWZXJzaW9ucyB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTF9JRCA9ICJlcGYiOyAvLyROT04tTkxTLTEkCi0JCi0JLy90aGUgbmFtZSBzcGFjZSBVUkkgc3RyaW5nIGZvciB0aGUgVE9PTF9JRAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBuc1VyaSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIEVQRiAxLjAKLQlwcml2YXRlIHN0YXRpYyBFUEZWZXJzaW9uIEVQRl8xMCA9IAotCQluZXcgRVBGVmVyc2lvbigiMS4wIiwgLy8kTk9OLU5MUy0xJCAgdG9vbCB2ZXJzaW9uCi0JCQkJIjEuMC4zLjAiLCAvLyROT04tTkxTLTEkICBsaWJyYXJ5IHZlcnNpb24KLQkJCQkiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJCAgeG1sIHNjaGVtYSB2ZXJzaW9uCi0KLQkvLyBFUEYgMS4xIC0gVGhpcyBpcyBFUEYgMS4yIEl0ZXJhdGlvbiAxCi0JcHJpdmF0ZSBzdGF0aWMgRVBGVmVyc2lvbiBFUEZfMTEgPSAKLQluZXcgRVBGVmVyc2lvbigiMS4xIiwgLy8kTk9OLU5MUy0xJCAgdG9vbCB2ZXJzaW9uCi0JCQkiMS4wLjQuMCIsIC8vJE5PTi1OTFMtMSQgIGxpYnJhcnkgdmVyc2lvbgotCQkJIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQgIHhtbCBzY2hlbWEgdmVyc2lvbgotCQotCXByaXZhdGUgc3RhdGljIEVQRlZlcnNpb24gY3VycmVudFZlcnNpb24gPSBFUEZfMTE7Ci0JCi0JcHVibGljIEVQRlZlcnNpb24gZ2V0Q3VycmVudFZlcnNpb24oKSB7Ci0JCXJldHVybiBjdXJyZW50VmVyc2lvbjsKLQl9Ci0JCi0JcHVibGljIEVQRlZlcnNpb24gZ2V0VmVyc2lvbihTdHJpbmcgdG9vbFZlcnNpb24pIHsKLQkJaWYgKHRvb2xWZXJzaW9uICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldEFsbFZlcnNpb25zKCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFUEZWZXJzaW9uIHZlciA9IChFUEZWZXJzaW9uKWl0ZXIubmV4dCgpOwotCQkJCWlmICh2ZXIuZ2V0VG9vbFZlcnNpb24oKS5lcXVhbHMobmV3IFZlcnNpb24odG9vbFZlcnNpb24pKSkgewotCQkJCQlyZXR1cm4gdmVyOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWxsVmVyc2lvbnMoKSB7Ci0JCUxpc3QgdmVyc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXZlcnNpb25zLmFkZChFUEZfMTApOwotCQl2ZXJzaW9ucy5hZGQoRVBGXzExKTsKLQkJcmV0dXJuIHZlcnNpb25zOwotCX0KLQkKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5VmVyc2lvbgotCSAqIEByZXR1cm4gdGhlIG1pbmltdW0gdG9vbCB2ZXJzaW9uIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkIGxpYnJhcnkgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBFUEZWZXJzaW9uIGdldE1pblRvb2xWZXJzaW9uRm9yTGlicmFyeVZlcnNpb24oVmVyc2lvbiBsaWJyYXJ5VmVyc2lvbikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRBbGxWZXJzaW9ucygpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFUEZWZXJzaW9uIHZlcnNpb25JbmZvID0gKEVQRlZlcnNpb24paXRlci5uZXh0KCk7Ci0JCQlpZiAodmVyc2lvbkluZm8uZ2V0TGlicmFyeVZlcnNpb24oKS5jb21wYXJlVG8obGlicmFyeVZlcnNpb24pID09IDApIHsKLQkJCQlyZXR1cm4gdmVyc2lvbkluZm87Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1pbmltdW0gdG9vbCB2ZXJzaW9uIHRoYXQgdXNlcyB0aGUgY3VycmVudCBsaWJyYXJ5IHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgRVBGVmVyc2lvbiBnZXRNaW5Ub29sVmVyc2lvbkZvckN1cnJlbnRMaWJyYXJ5VmVyc2lvbigpIHsKLQkJVmVyc2lvbiBsaWJyYXJ5VmVyc2lvbiA9IGdldEN1cnJlbnRWZXJzaW9uKCkuZ2V0TGlicmFyeVZlcnNpb24oKTsKLQkJcmV0dXJuIGdldE1pblRvb2xWZXJzaW9uRm9yTGlicmFyeVZlcnNpb24obGlicmFyeVZlcnNpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB4bWxTY2hlbWFWZXJzaW9uCi0JICogQHJldHVybiB0aGUgbWluaW11bSB0b29sIHZlcnNpb24gdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgWE1MIFNjaGVtYSB2ZXJzaW9uCi0JICovCi0JcHVibGljIEVQRlZlcnNpb24gZ2V0TWluVG9vbFZlcnNpb25Gb3JYTUxTY2hlbWFWZXJzaW9uKFZlcnNpb24geG1sU2NoZW1hVmVyc2lvbikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRBbGxWZXJzaW9ucygpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFUEZWZXJzaW9uIHZlcnNpb25JbmZvID0gKEVQRlZlcnNpb24paXRlci5uZXh0KCk7Ci0JCQlpZiAodmVyc2lvbkluZm8uZ2V0WE1MU2NoZW1hVmVyc2lvbigpLmNvbXBhcmVUbyh4bWxTY2hlbWFWZXJzaW9uKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIHZlcnNpb25JbmZvOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIHRvb2wgdmVyc2lvbiB0aGF0IHVzZXMgdGhlIGN1cnJlbnQgWE1MIFNjaGVtYSB2ZXJzaW9uCi0JICovCi0JcHVibGljIEVQRlZlcnNpb24gZ2V0TWluVG9vbFZlcnNpb25Gb3JDdXJyZW50WE1MU2NoZW1hVmVyc2lvbigpIHsKLQkJVmVyc2lvbiB4bWxTY2hlbWFWZXJzaW9uID0gZ2V0Q3VycmVudFZlcnNpb24oKS5nZXRYTUxTY2hlbWFWZXJzaW9uKCk7Ci0JCXJldHVybiBnZXRNaW5Ub29sVmVyc2lvbkZvclhNTFNjaGVtYVZlcnNpb24oeG1sU2NoZW1hVmVyc2lvbik7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgc3BhY2UgVVJJIHN0cmluZyBmb3IgdGhlIFRPT0xfSUQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5zVVJJKCkgewotCQlyZXR1cm4gbnNVcmk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvRXJyb3JEaWFsb2dOb1JlYXNvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0Vycm9yRGlhbG9nTm9SZWFzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTY2MTk2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvRXJyb3JEaWFsb2dOb1JlYXNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JY29uQW5kTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBEaXNwbGF5cyBhbiBlcnJvciBkaWFsb2cgd2l0aG91dCB0aGUgRGV0YWlscyBidXR0b24uCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JEaWFsb2dOb1JlYXNvbiBleHRlbmRzIEljb25BbmRNZXNzYWdlRGlhbG9nIHsKLQotCS8qKgotCSAqIFN0YXRpYyB0byBwcmV2ZW50IG9wZW5pbmcgb2YgZXJyb3IgZGlhbG9ncyBmb3IgYXV0b21hdGVkIHRlc3RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIEFVVE9NQVRFRF9NT0RFID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBSZXNlcnZlIHJvb20gZm9yIHRoaXMgbWFueSBsaXN0IGl0ZW1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSVNUX0lURU1fQ09VTlQgPSA3OwotCi0JLyoqCi0JICogVGhlIG5lc3RpbmcgaW5kZW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVNUSU5HX0lOREVOVCA9ICIgICI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBEZXRhaWxzIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGRldGFpbHNCdXR0b247Ci0KLQkvKioKLQkgKiBUaGUgdGl0bGUgb2YgdGhlIGRpYWxvZy4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotCS8qKgotCSAqIFRoZSBTV1QgbGlzdCBjb250cm9sIHRoYXQgZGlzcGxheXMgdGhlIGVycm9yIGRldGFpbHMuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGxpc3Q7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZXJyb3IgZGV0YWlscyB2aWV3ZXIgaXMgY3VycmVudGx5IGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGxpc3RDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBGaWx0ZXIgbWFzayBmb3IgZGV0ZXJtaW5pbmcgd2hpY2ggc3RhdHVzIGl0ZW1zIHRvIGRpc3BsYXkuCi0JICovCi0JcHJpdmF0ZSBpbnQgZGlzcGxheU1hc2sgPSAweEZGRkY7Ci0KLQkvKioKLQkgKiBUaGUgbWFpbiBzdGF0dXMgb2JqZWN0LgotCSAqLwotCXByaXZhdGUgSVN0YXR1cyBzdGF0dXM7Ci0KLQkvKioKLQkgKiBUaGUgY3VycmVudCBjbGlwYm9hcmQuIFRvIGJlIGRpc3Bvc2VkIHdoZW4gY2xvc2luZyB0aGUgZGlhbG9nLgotCSAqLwotCXByaXZhdGUgQ2xpcGJvYXJkIGNsaXBib2FyZDsKLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRJbmNsdWRlVG9wTGV2ZWxFcnJvckluRGV0YWlscyA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlcnJvciBkaWFsb2cuIE5vdGUgdGhhdCB0aGUgZGlhbG9nIHdpbGwgaGF2ZSBubyB2aXN1YWwKLQkgKiByZXByZXNlbnRhdGlvbiAobm8gd2lkZ2V0cykgdW50aWwgaXQgaXMgdG9sZCB0byBvcGVuLgotCSAqIDxwPgotCSAqIE5vcm1hbGx5IG9uZSBzaG91bGQgdXNlIDxjb2RlPm9wZW5FcnJvcjwvY29kZT4gdG8gY3JlYXRlIGFuZCBvcGVuIG9uZQotCSAqIG9mIHRoZXNlLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBvbmx5IGlmIHRoZSBlcnJvciBvYmplY3QgYmVpbmcKLQkgKiBkaXNwbGF5ZWQgY29udGFpbnMgY2hpbGQgaXRlbXMgPGl0PmFuZCA8L2l0PiB5b3UgbmVlZCB0byBzcGVjaWZ5IGEgbWFzawotCSAqIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgdGhlc2UgY2hpbGRyZW4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqICAgICAgICAgICAgdGhlIHNoZWxsIHVuZGVyIHdoaWNoIHRvIGNyZWF0ZSB0aGlzIGRpYWxvZwotCSAqIEBwYXJhbSBkaWFsb2dUaXRsZQotCSAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotCSAqICAgICAgICAgICAgcHJpbWFyeSBtZXNzYWdlCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLQkgKiBAcGFyYW0gZGlzcGxheU1hc2sKLQkgKiAgICAgICAgICAgIHRoZSBtYXNrIHRvIHVzZSB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgY2hpbGQgaXRlbXMsIGFzCi0JICogICAgICAgICAgICBwZXIgPGNvZGU+SVN0YXR1cy5tYXRjaGVzPC9jb2RlPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMjbWF0Y2hlcyhpbnQpCi0JICovCi0JcHVibGljIEVycm9yRGlhbG9nTm9SZWFzb24oU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwKLQkJCVN0cmluZyBtZXNzYWdlLCBJU3RhdHVzIHN0YXR1cywgaW50IGRpc3BsYXlNYXNrKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy50aXRsZSA9IGRpYWxvZ1RpdGxlID09IG51bGwgPyBKRmFjZVJlc291cmNlcwotCQkJCS5nZXRTdHJpbmcoIlByb2JsZW1fT2NjdXJyZWQiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlkaWFsb2dUaXRsZTsKLQkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZSA9PSBudWxsID8gc3RhdHVzLmdldE1lc3NhZ2UoKSA6IG1lc3NhZ2U7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0JCXRoaXMuZGlzcGxheU1hc2sgPSBkaXNwbGF5TWFzazsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4gSGFuZGxlcyB0aGUgcHJlc3Npbmcgb2YgdGhlIE9rCi0JICogb3IgRGV0YWlscyBidXR0b24gaW4gdGhpcyBkaWFsb2cuIElmIHRoZSBPayBidXR0b24gd2FzIHByZXNzZWQgdGhlbiBjbG9zZQotCSAqIHRoaXMgZGlhbG9nLiBJZiB0aGUgRGV0YWlscyBidXR0b24gd2FzIHByZXNzZWQgdGhlbiB0b2dnbGUgdGhlIGRpc3BsYXlpbmcKLQkgKiBvZiB0aGUgZXJyb3IgZGV0YWlscyBhcmVhLiBOb3RlIHRoYXQgdGhlIERldGFpbHMgYnV0dG9uIHdpbGwgb25seSBiZQotCSAqIHZpc2libGUgaWYgdGhlIGVycm9yIGJlaW5nIGRpc3BsYXllZCBzcGVjaWZpZXMgY2hpbGQgZGV0YWlscy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBpZCkgewotCQlpZiAoaWQgPT0gSURpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lEKSB7Ci0JCQkvLyB3YXMgdGhlIGRldGFpbHMgYnV0dG9uIHByZXNzZWQ/Ci0JCQl0b2dnbGVEZXRhaWxzQXJlYSgpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuYnV0dG9uUHJlc3NlZChpZCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIGluIFdpbmRvdy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0JCXNoZWxsLnNldFRleHQodGl0bGUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgT0sgYW5kIERldGFpbHMgYnV0dG9ucwotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCQlpZiAoc2hvdWxkU2hvd0RldGFpbHNCdXR0b24oKSkgewotCQkJZGV0YWlsc0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCwKLQkJCQkJSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwsIGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlPkRpYWxvZzwvY29kZT4gZnJhbWV3b3JrIG1ldGhvZCBjcmVhdGVzCi0JICogYW5kIGxheXMgb3V0IGEgY29tcG9zaXRlIGFuZCBjYWxscyA8Y29kZT5jcmVhdGVNZXNzYWdlQXJlYTwvY29kZT4gYW5kCi0JICogPGNvZGU+Y3JlYXRlQ3VzdG9tQXJlYTwvY29kZT4gdG8gcG9wdWxhdGUgaXQuIFN1YmNsYXNzZXMgc2hvdWxkCi0JICogb3ZlcnJpZGUgPGNvZGU+Y3JlYXRlQ3VzdG9tQXJlYTwvY29kZT4gdG8gYWRkIGNvbnRlbnRzIGJlbG93IHRoZQotCSAqIG1lc3NhZ2UuCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZU1lc3NhZ2VBcmVhKHBhcmVudCk7Ci0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB3aXRoIHN0YW5kYXJkIG1hcmdpbnMgYW5kIHNwYWNpbmcKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGNoaWxkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQljaGlsZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShjaGlsZERhdGEpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSWNvbkFuZE1lc3NhZ2VEaWFsb2cjY3JlYXRlRGlhbG9nQW5kQnV0dG9uQXJlYShDb21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGlhbG9nQW5kQnV0dG9uQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZURpYWxvZ0FuZEJ1dHRvbkFyZWEocGFyZW50KTsKLQkJaWYgKHRoaXMuZGlhbG9nQXJlYSBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgewotCQkJLy8gQ3JlYXRlIGEgbGFiZWwgaWYgdGhlcmUgYXJlIG5vIGNoaWxkcmVuIHRvIGZvcmNlIGEgc21hbGxlciBsYXlvdXQKLQkJCUNvbXBvc2l0ZSBkaWFsb2dDb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBkaWFsb2dBcmVhOwotCQkJaWYgKGRpYWxvZ0NvbXBvc2l0ZS5nZXRDaGlsZHJlbigpLmxlbmd0aCA9PSAwKQotCQkJCW5ldyBMYWJlbChkaWFsb2dDb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JY29uQW5kTWVzc2FnZURpYWxvZyNnZXRJbWFnZSgpCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkgewotCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpCi0JCQkJcmV0dXJuIGdldFdhcm5pbmdJbWFnZSgpOwotCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuSU5GTykKLQkJCQlyZXR1cm4gZ2V0SW5mb0ltYWdlKCk7Ci0JCX0KLQkJLy8gSWYgaXQgd2FzIG5vdCBhIHdhcm5pbmcgb3IgYW4gZXJyb3IgdGhlbiByZXR1cm4gdGhlIGVycm9yIGltYWdlCi0JCXJldHVybiBnZXRFcnJvckltYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoaXMgZGlhbG9nJ3MgZHJvcC1kb3duIGxpc3QgY29tcG9uZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgZHJvcC1kb3duIGxpc3QgY29tcG9uZW50Ci0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlRHJvcERvd25MaXN0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIHRoZSBsaXN0Ci0JCWxpc3QgPSBuZXcgTGlzdChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwKLQkJCQl8IFNXVC5NVUxUSSk7Ci0JCS8vIGZpbGwgdGhlIGxpc3QKLQkJcG9wdWxhdGVMaXN0KGxpc3QpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTAotCQkJCXwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IGxpc3QuZ2V0SXRlbUhlaWdodCgpICogTElTVF9JVEVNX0NPVU5UOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGlzdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsaXN0LnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCU1lbnUgY29weU1lbnUgPSBuZXcgTWVudShsaXN0KTsKLQkJTWVudUl0ZW0gY29weUl0ZW0gPSBuZXcgTWVudUl0ZW0oY29weU1lbnUsIFNXVC5OT05FKTsKLQkJY29weUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJLyoKLQkJCSAqIEBzZWUgU2VsZWN0aW9uTGlzdGVuZXIud2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY29weVRvQ2xpcGJvYXJkKCk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBAc2VlIFNlbGVjdGlvbkxpc3RlbmVyLndpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljb3B5VG9DbGlwYm9hcmQoKTsKLQkJCX0KLQkJfSk7Ci0JCWNvcHlJdGVtLnNldFRleHQoSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJjb3B5IikpOyAvLyROT04tTkxTLTEkCi0JCWxpc3Quc2V0TWVudShjb3B5TWVudSk7Ci0JCWxpc3RDcmVhdGVkID0gdHJ1ZTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBXaW5kb3cuCi0JICovCi0JLyoqCi0JICogRXh0ZW5kcyA8Y29kZT5XaW5kb3cub3BlbigpPC9jb2RlPi4gT3BlbnMgYW4gZXJyb3IgZGlhbG9nIHRvIGRpc3BsYXkKLQkgKiB0aGUgZXJyb3IuIElmIHlvdSBzcGVjaWZpZWQgYSBtYXNrIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiB0aGVzZQotCSAqIGNoaWxkcmVuLCB0aGUgZXJyb3IgZGlhbG9nIHdpbGwgb25seSBiZSBkaXNwbGF5ZWQgaWYgdGhlcmUgaXMgYXQgbGVhc3QKLQkgKiBvbmUgY2hpbGQgc3RhdHVzIG1hdGNoaW5nIHRoZSBtYXNrLgotCSAqLwotCXB1YmxpYyBpbnQgb3BlbigpIHsKLQkJaWYgKCFBVVRPTUFURURfTU9ERSAmJiBzaG91bGREaXNwbGF5KHN0YXR1cywgZGlzcGxheU1hc2spKSB7Ci0JCQlyZXR1cm4gc3VwZXIub3BlbigpOwotCQl9Ci0JCXNldFJldHVybkNvZGUoT0spOwotCQlyZXR1cm4gT0s7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYW4gZXJyb3IgZGlhbG9nIHRvIGRpc3BsYXkgdGhlIGdpdmVuIGVycm9yLiBVc2UgdGhpcyBtZXRob2QgaWYgdGhlCi0JICogZXJyb3Igb2JqZWN0IGJlaW5nIGRpc3BsYXllZCBkb2VzIG5vdCBjb250YWluIGNoaWxkIGl0ZW1zLCBvciBpZiB5b3Ugd2lzaAotCSAqIHRvIGRpc3BsYXkgYWxsIHN1Y2ggaXRlbXMgd2l0aG91dCBmaWx0ZXJpbmcuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0JICogICAgICAgICAgICB0aGUgdGl0bGUgdG8gdXNlIGZvciB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGRlZmF1bHQgdGl0bGUgc2hvdWxkIGJlIHVzZWQKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGVycm9yJ3MgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24gYXMgdGhlCi0JICogICAgICAgICAgICBwcmltYXJ5IG1lc3NhZ2UKLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgdG8gc2hvdyB0byB0aGUgdXNlcgotCSAqIEByZXR1cm4gdGhlIGNvZGUgb2YgdGhlIGJ1dHRvbiB0aGF0IHdhcyBwcmVzc2VkIHRoYXQgcmVzdWx0ZWQgaW4gdGhpcwotCSAqICAgICAgICAgZGlhbG9nIGNsb3NpbmcuIFRoaXMgd2lsbCBiZSA8Y29kZT5EaWFsb2cuT0s8L2NvZGU+IGlmIHRoZSBPSwotCSAqICAgICAgICAgYnV0dG9uIHdhcyBwcmVzc2VkLCBvciA8Y29kZT5EaWFsb2cuQ0FOQ0VMPC9jb2RlPiBpZiB0aGlzCi0JICogICAgICAgICBkaWFsb2cncyBjbG9zZSB3aW5kb3cgZGVjb3JhdGlvbiBvciB0aGUgRVNDIGtleSB3YXMgdXNlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBvcGVuRXJyb3IoU2hlbGwgcGFyZW50LCBTdHJpbmcgZGlhbG9nVGl0bGUsCi0JCQlTdHJpbmcgbWVzc2FnZSwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJcmV0dXJuIG9wZW5FcnJvcihwYXJlbnQsIGRpYWxvZ1RpdGxlLCBtZXNzYWdlLCBzdGF0dXMsIElTdGF0dXMuT0sKLQkJCQl8IElTdGF0dXMuSU5GTyB8IElTdGF0dXMuV0FSTklORyB8IElTdGF0dXMuRVJST1IpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGFuIGVycm9yIGRpYWxvZyB0byBkaXNwbGF5IHRoZSBnaXZlbiBlcnJvci4gVXNlIHRoaXMgbWV0aG9kIGlmIHRoZQotCSAqIGVycm9yIG9iamVjdCBiZWluZyBkaXNwbGF5ZWQgY29udGFpbnMgY2hpbGQgaXRlbXMgPGl0PmFuZCA8L2l0PiB5b3Ugd2lzaAotCSAqIHRvIHNwZWNpZnkgYSBtYXNrIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgdGhlc2UKLQkgKiBjaGlsZHJlbi4gVGhlIGVycm9yIGRpYWxvZyB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGlmIHRoZXJlIGlzIGF0IGxlYXN0Ci0JICogb25lIGNoaWxkIHN0YXR1cyBtYXRjaGluZyB0aGUgbWFzay4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotCSAqICAgICAgICAgICAgcHJpbWFyeSBtZXNzYWdlCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLQkgKiBAcGFyYW0gZGlzcGxheU1hc2sKLQkgKiAgICAgICAgICAgIHRoZSBtYXNrIHRvIHVzZSB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgY2hpbGQgaXRlbXMsIGFzCi0JICogICAgICAgICAgICBwZXIgPGNvZGU+SVN0YXR1cy5tYXRjaGVzPC9jb2RlPgotCSAqIEByZXR1cm4gdGhlIGNvZGUgb2YgdGhlIGJ1dHRvbiB0aGF0IHdhcyBwcmVzc2VkIHRoYXQgcmVzdWx0ZWQgaW4gdGhpcwotCSAqICAgICAgICAgZGlhbG9nIGNsb3NpbmcuIFRoaXMgd2lsbCBiZSA8Y29kZT5EaWFsb2cuT0s8L2NvZGU+IGlmIHRoZSBPSwotCSAqICAgICAgICAgYnV0dG9uIHdhcyBwcmVzc2VkLCBvciA8Y29kZT5EaWFsb2cuQ0FOQ0VMPC9jb2RlPiBpZiB0aGlzCi0JICogICAgICAgICBkaWFsb2cncyBjbG9zZSB3aW5kb3cgZGVjb3JhdGlvbiBvciB0aGUgRVNDIGtleSB3YXMgdXNlZC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzI21hdGNoZXMoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IG9wZW5FcnJvcihTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIHRpdGxlLAotCQkJU3RyaW5nIG1lc3NhZ2UsIElTdGF0dXMgc3RhdHVzLCBpbnQgZGlzcGxheU1hc2spIHsKLQkJRXJyb3JEaWFsb2dOb1JlYXNvbiBkaWFsb2cgPSBuZXcgRXJyb3JEaWFsb2dOb1JlYXNvbihwYXJlbnRTaGVsbCwKLQkJCQl0aXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBkaXNwbGF5TWFzayk7Ci0JCXJldHVybiBkaWFsb2cub3BlbigpOwotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgbGlzdCB1c2luZyB0aGlzIGVycm9yIGRpYWxvZydzIHN0YXR1cyBvYmplY3QuIFRoaXMgd2Fsa3MKLQkgKiB0aGUgY2hpbGQgc3RhdGljIG9mIHRoZSBzdGF0dXMgb2JqZWN0IGFuZCBkaXNwbGF5cyB0aGVtIGluIGEgbGlzdC4gVGhlCi0JICogZm9ybWF0IGZvciBlYWNoIGVudHJ5IGlzIHN0YXR1c19wYXRoIDogc3RhdHVzX21lc3NhZ2UgSWYgdGhlIHN0YXR1cydzCi0JICogcGF0aCB3YXMgbnVsbCB0aGVuIGl0IChhbmQgdGhlIGNvbG9uKSBhcmUgb21pdHRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdFRvUG9wdWxhdGUKLQkgKiAgICAgICAgICAgIFRoZSBsaXN0IHRvIGZpbGwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlTGlzdChMaXN0IGxpc3RUb1BvcHVsYXRlKSB7Ci0JCXBvcHVsYXRlTGlzdChsaXN0VG9Qb3B1bGF0ZSwgc3RhdHVzLCAwLAotCQkJCXNob3VsZEluY2x1ZGVUb3BMZXZlbEVycm9ySW5EZXRhaWxzKTsKLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZSB0aGUgbGlzdCB3aXRoIHRoZSBtZXNzYWdlcyBmcm9tIHRoZSBnaXZlbiBzdGF0dXMuIFRyYXZlcnNlIHRoZQotCSAqIGNoaWxkcmVuIG9mIHRoZSBzdGF0dXMgZGVlcGx5IGFuZCBhbHNvIHRyYXZlcnNlIENvcmVFeGNlcHRpb25zIHRoYXQKLQkgKiBhcHBlYXIgaW4gdGhlIHN0YXR1cy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdFRvUG9wdWxhdGUKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0IHRvIHBvcHVsYXRlCi0JICogQHBhcmFtIGJ1aWxkaW5nU3RhdHVzCi0JICogICAgICAgICAgICB0aGUgc3RhdHVzIGJlaW5nIGRpc3BsYXllZAotCSAqIEBwYXJhbSBuZXN0aW5nCi0JICogICAgICAgICAgICB0aGUgbmVzdGluZyBsZXZlbCAoaW5jcmVhc2VzIG9uZSBsZXZlbCBmb3IgZWFjaCBsZXZlbCBvZgotCSAqICAgICAgICAgICAgY2hpbGRyZW4pCi0JICogQHBhcmFtIGluY2x1ZGVTdGF0dXMKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgYnVpbGRpbmdTdGF0dXMgaW4gdGhlIGRpc3BsYXkgb3IganVzdAotCSAqICAgICAgICAgICAgaXRzIGNoaWxkcmVuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlTGlzdChMaXN0IGxpc3RUb1BvcHVsYXRlLCBJU3RhdHVzIGJ1aWxkaW5nU3RhdHVzLAotCQkJaW50IG5lc3RpbmcsIGJvb2xlYW4gaW5jbHVkZVN0YXR1cykgewotCi0JCWlmICghYnVpbGRpbmdTdGF0dXMubWF0Y2hlcyhkaXNwbGF5TWFzaykpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVRocm93YWJsZSB0ID0gYnVpbGRpbmdTdGF0dXMuZ2V0RXhjZXB0aW9uKCk7Ci0JCWJvb2xlYW4gaXNDb3JlRXhjZXB0aW9uID0gdCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb247Ci0JCWJvb2xlYW4gaW5jcmVtZW50TmVzdGluZyA9IGZhbHNlOwotCi0JCWlmIChpbmNsdWRlU3RhdHVzKSB7Ci0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5lc3Rpbmc7IGkrKykgewotCQkJCXNiLmFwcGVuZChORVNUSU5HX0lOREVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCVN0cmluZyBtZXNzYWdlID0gYnVpbGRpbmdTdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQkJc2IuYXBwZW5kKG1lc3NhZ2UpOwotCQkJbGlzdFRvUG9wdWxhdGUuYWRkKHNiLnRvU3RyaW5nKCkpOwotCQkJaW5jcmVtZW50TmVzdGluZyA9IHRydWU7Ci0JCX0KLQotCQlpZiAoIWlzQ29yZUV4Y2VwdGlvbiAmJiB0ICE9IG51bGwpIHsKLQkJCS8vIEluY2x1ZGUgbG93LWxldmVsIGV4Y2VwdGlvbiBtZXNzYWdlCi0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5lc3Rpbmc7IGkrKykgewotCQkJCXNiLmFwcGVuZChORVNUSU5HX0lOREVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCVN0cmluZyBtZXNzYWdlID0gdC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCQlpZiAobWVzc2FnZSA9PSBudWxsKQotCQkJCW1lc3NhZ2UgPSB0LnRvU3RyaW5nKCk7Ci0KLQkJCXNiLmFwcGVuZChtZXNzYWdlKTsKLQkJCWxpc3RUb1BvcHVsYXRlLmFkZChzYi50b1N0cmluZygpKTsKLQkJCWluY3JlbWVudE5lc3RpbmcgPSB0cnVlOwotCQl9Ci0KLQkJaWYgKGluY3JlbWVudE5lc3RpbmcpCi0JCQluZXN0aW5nKys7Ci0KLQkJLy8gTG9vayBmb3IgYSBuZXN0ZWQgY29yZSBleGNlcHRpb24KLQkJaWYgKGlzQ29yZUV4Y2VwdGlvbikgewotCQkJQ29yZUV4Y2VwdGlvbiBjZSA9IChDb3JlRXhjZXB0aW9uKSB0OwotCQkJSVN0YXR1cyBlU3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0JCQkvLyBPbmx5IHByaW50IHRoZSBleGNlcHRpb24gbWVzc2FnZSBpZiBpdCBpcyBub3QgY29udGFpbmVkIGluIHRoZQotCQkJLy8gcGFyZW50IG1lc3NhZ2UKLQkJCWlmIChtZXNzYWdlID09IG51bGwgfHwgbWVzc2FnZS5pbmRleE9mKGVTdGF0dXMuZ2V0TWVzc2FnZSgpKSA9PSAtMSkgewotCQkJCXBvcHVsYXRlTGlzdChsaXN0VG9Qb3B1bGF0ZSwgZVN0YXR1cywgbmVzdGluZywgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBMb29rIGZvciBjaGlsZCBzdGF0dXMKLQkJSVN0YXR1c1tdIGNoaWxkcmVuID0gYnVpbGRpbmdTdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJcG9wdWxhdGVMaXN0KGxpc3RUb1BvcHVsYXRlLCBjaGlsZHJlbltpXSwgbmVzdGluZywgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHN0YXR1cyBvYmplY3Qgc2hvdWxkIGJlIGRpc3BsYXllZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogICAgICAgICAgICBhIHN0YXR1cyBvYmplY3QKLQkgKiBAcGFyYW0gbWFzawotCSAqICAgICAgICAgICAgYSBtYXNrIGFzIHBlciA8Y29kZT5JU3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gc3RhdHVzIHNob3VsZCBiZSBkaXNwbGF5ZWQsIGFuZAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMjbWF0Y2hlcyhpbnQpCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHNob3VsZERpc3BsYXkoSVN0YXR1cyBzdGF0dXMsIGludCBtYXNrKSB7Ci0JCUlTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCB8fCBjaGlsZHJlbi5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIHN0YXR1cy5tYXRjaGVzKG1hc2spOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjaGlsZHJlbltpXS5tYXRjaGVzKG1hc2spKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGVzIHRoZSB1bmZvbGRpbmcgb2YgdGhlIGRldGFpbHMgYXJlYS4gVGhpcyBpcyB0cmlnZ2VyZWQgYnkgdGhlIHVzZXIKLQkgKiBwcmVzc2luZyB0aGUgZGV0YWlscyBidXR0b24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRvZ2dsZURldGFpbHNBcmVhKCkgewotCQlQb2ludCB3aW5kb3dTaXplID0gZ2V0U2hlbGwoKS5nZXRTaXplKCk7Ci0JCVBvaW50IG9sZFNpemUgPSBnZXRTaGVsbCgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWlmIChsaXN0Q3JlYXRlZCkgewotCQkJbGlzdC5kaXNwb3NlKCk7Ci0JCQlsaXN0Q3JlYXRlZCA9IGZhbHNlOwotCQkJZGV0YWlsc0J1dHRvbi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMKTsKLQkJfSBlbHNlIHsKLQkJCWxpc3QgPSBjcmVhdGVEcm9wRG93bkxpc3QoKENvbXBvc2l0ZSkgZ2V0Q29udGVudHMoKSk7Ci0JCQlkZXRhaWxzQnV0dG9uLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5ISURFX0RFVEFJTFNfTEFCRUwpOwotCQl9Ci0JCVBvaW50IG5ld1NpemUgPSBnZXRTaGVsbCgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWdldFNoZWxsKCkKLQkJCQkuc2V0U2l6ZSgKLQkJCQkJCW5ldyBQb2ludCh3aW5kb3dTaXplLngsIHdpbmRvd1NpemUueQotCQkJCQkJCQkrIChuZXdTaXplLnkgLSBvbGRTaXplLnkpKSk7Ci0JfQotCi0JLyoqCi0JICogUHV0IHRoZSBkZXRhaWxzIG9mIHRoZSBzdGF0dXMgb2YgdGhlIGVycm9yIG9udG8gdGhlIHN0cmVhbS4KLQkgKiAKLQkgKiBAcGFyYW0gYnVpbGRpbmdTdGF0dXMKLQkgKiBAcGFyYW0gYnVmZmVyCi0JICogQHBhcmFtIG5lc3RpbmcKLQkgKi8KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb3B5QnVmZmVyKElTdGF0dXMgYnVpbGRpbmdTdGF0dXMsCi0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgbmVzdGluZykgewotCQlpZiAoIWJ1aWxkaW5nU3RhdHVzLm1hdGNoZXMoZGlzcGxheU1hc2spKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0aW5nOyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQoTkVTVElOR19JTkRFTlQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYnVmZmVyLmFwcGVuZChidWlsZGluZ1N0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gTG9vayBmb3IgYSBuZXN0ZWQgY29yZSBleGNlcHRpb24KLQkJVGhyb3dhYmxlIHQgPSBidWlsZGluZ1N0YXR1cy5nZXRFeGNlcHRpb24oKTsKLQkJaWYgKHQgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQlDb3JlRXhjZXB0aW9uIGNlID0gKENvcmVFeGNlcHRpb24pIHQ7Ci0JCQlwb3B1bGF0ZUNvcHlCdWZmZXIoY2UuZ2V0U3RhdHVzKCksIGJ1ZmZlciwgbmVzdGluZyArIDEpOwotCQl9Ci0KLQkJSVN0YXR1c1tdIGNoaWxkcmVuID0gYnVpbGRpbmdTdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJcG9wdWxhdGVDb3B5QnVmZmVyKGNoaWxkcmVuW2ldLCBidWZmZXIsIG5lc3RpbmcgKyAxKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdGF0dXNlcyB0byB0aGUgY2xpcGJvYXJkLgotCSAqLwotCXByaXZhdGUgdm9pZCBjb3B5VG9DbGlwYm9hcmQoKSB7Ci0JCWlmIChjbGlwYm9hcmQgIT0gbnVsbCkKLQkJCWNsaXBib2FyZC5kaXNwb3NlKCk7Ci0JCVN0cmluZ0J1ZmZlciBzdGF0dXNCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXBvcHVsYXRlQ29weUJ1ZmZlcihzdGF0dXMsIHN0YXR1c0J1ZmZlciwgMCk7Ci0JCWNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQobGlzdC5nZXREaXNwbGF5KCkpOwotCQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IE9iamVjdFtdIHsgc3RhdHVzQnVmZmVyLnRvU3RyaW5nKCkgfSwKLQkJCQluZXcgVHJhbnNmZXJbXSB7IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjbG9zZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCWlmIChjbGlwYm9hcmQgIT0gbnVsbCkKLQkJCWNsaXBib2FyZC5kaXNwb3NlKCk7Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFNob3cgdGhlIGRldGFpbHMgcG9ydGlvbiBvZiB0aGUgZGlhbG9nIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHZpc2libGUuIFRoaXMKLQkgKiBtZXRob2Qgd2lsbCBvbmx5IHdvcmsgd2hlbiBpdCBpcyBpbnZva2VkIGFmdGVyIHRoZSBjb250cm9sIG9mIHRoZSBkaWFsb2cKLQkgKiBoYXMgYmVlbiBzZXQuIEluIG90aGVyIHdvcmRzLCBhZnRlciB0aGUgPGNvZGU+Y3JlYXRlQ29udGVudHM8L2NvZGU+Ci0JICogbWV0aG9kIGhhcyBiZWVuIGludm9rZWQgYW5kIGhhcyByZXR1cm5lZCB0aGUgY29udHJvbCBmb3IgdGhlIGNvbnRlbnQgYXJlYQotCSAqIG9mIHRoZSBkaWFsb2cuIEludm9raW5nIHRoZSBtZXRob2QgYmVmb3JlIHRoZSBjb250ZW50IGFyZWEgaGFzIGJlZW4gc2V0Ci0JICogb3IgYWZ0ZXIgdGhlIGRpYWxvZyBoYXMgYmVlbiBkaXNwb3NlZCB3aWxsIGhhdmUgbm8gZWZmZWN0LgotCSAqIAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzaG93RGV0YWlsc0FyZWEoKSB7Ci0JCWlmICghbGlzdENyZWF0ZWQpIHsKLQkJCUNvbnRyb2wgY29udHJvbCA9IGdldENvbnRlbnRzKCk7Ci0JCQlpZiAoY29udHJvbCAhPSBudWxsICYmICFjb250cm9sLmlzRGlzcG9zZWQoKSkKLQkJCQl0b2dnbGVEZXRhaWxzQXJlYSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIERldGFpbHMgYnV0dG9uIHNob3VsZCBiZSBpbmNsdWRlZC4gVGhpcyBtZXRob2QgaXMKLQkgKiBpbnZva2VkIG9uY2Ugd2hlbiB0aGUgZGlhbG9nIGlzIGJ1aWx0LiBCeSBkZWZhdWx0LCB0aGUgRGV0YWlscyBidXR0b24gaXMKLQkgKiBvbmx5IGluY2x1ZGVkIGlmIHRoZSBzdGF0dXMgdXNlZCB3aGVuIGNyZWF0aW5nIHRoZSBkaWFsb2cgd2FzIGEKLQkgKiBtdWx0aS1zdGF0dXMgb3IgaWYgdGhlIHN0YXR1cyBjb250YWlucyBhbiBleGNlcHRpb24uIFN1YmNsYXNzZXMgbWF5Ci0JICogb3ZlcnJpZGUuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBEZXRhaWxzIGJ1dHRvbiBzaG91bGQgYmUgaW5jbHVkZWQKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2hvd0RldGFpbHNCdXR0b24oKSB7Ci0JCXJldHVybiBzdGF0dXMuaXNNdWx0aVN0YXR1cygpIHx8IHN0YXR1cy5nZXRFeGNlcHRpb24oKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3RhdHVzIGRpc3BsYXllZCBieSB0aGlzIGVycm9yIGRpYWxvZyB0byB0aGUgZ2l2ZW4gc3RhdHVzLiBUaGlzCi0JICogb25seSBhZmZlY3RzIHRoZSBzdGF0dXMgZGlzcGxheWVkIGJ5IHRoZSBEZXRhaWxzIGxpc3QuIFRoZSBtZXNzYWdlLCBpbWFnZQotCSAqIGFuZCB0aXRsZSBzaG91bGQgYmUgdXBkYXRlZCBieSB0aGUgc3ViY2xhc3MsIGlmIGRlc2lyZWQuCi0JICogCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgdGhlIHN0YXR1cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGRldGFpbHMgbGlzdAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRTdGF0dXMoSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKHRoaXMuc3RhdHVzICE9IHN0YXR1cykgewotCQkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0JCX0KLQkJc2hvdWxkSW5jbHVkZVRvcExldmVsRXJyb3JJbkRldGFpbHMgPSB0cnVlOwotCQlpZiAobGlzdENyZWF0ZWQpIHsKLQkJCXJlcG9wdWxhdGVMaXN0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcHVsYXRlIHRoZSBzdXBwbGllZCBsaXN0IHdpZGdldC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVwb3B1bGF0ZUxpc3QoKSB7Ci0JCWlmIChsaXN0ICE9IG51bGwgJiYgIWxpc3QuaXNEaXNwb3NlZCgpKSB7Ci0JCQlsaXN0LnJlbW92ZUFsbCgpOwotCQkJcG9wdWxhdGVMaXN0KGxpc3QpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0lMaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvSUxpYnJhcnlFeHRlbnNpb25WZXJzaW9uQ2hlY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTgyODNmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvSUxpYnJhcnlFeHRlbnNpb25WZXJzaW9uQ2hlY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LlZlcnNpb25VdGlsLlZlcnNpb25DaGVja0luZm87Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgcGVyZm9ybWluZyBtZXRob2QgbGlicmFyeSB2ZXJzaW9uIGNoZWNrLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeUV4dGVuc2lvblZlcnNpb25DaGVjayB7Ci0KLQkvKioKLQkgKiBDaGVja3MgYW5kIHJldHVybnMgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgbWV0aG9kCi0JICogbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeSBYTUkgZmlsZQotCSAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGxpYnJhcnkgWE1JIGZpbGUgZG9lcyBub3QgY29udGFpbiB0aGUKLQkgKiAgICAgICAgIHZlcnNpb24gaW5mb3JtYXRpb24gb2YgdGhlIHRvb2wgdGhhdCBjcmVhdGVkIGl0OyBvcgotCSAqICAgICAgICAgPGNvZGU+VmVyc2lvbkNoZWNrSW5mbzwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIFZlcnNpb25DaGVja0luZm8gY2hlY2tMaWJyYXJ5VmVyc2lvbihGaWxlIGxpYlBhdGgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvTG9nZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMwMzhmODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luOwotCi0vKioKLSAqIEdlbmVyaWMgbG9nZ2VyIHVzZWQgZm9yIGxvZ2dpbmcgc3RhdHVzIG1lc3NhZ2VzLCB3YXJuaW5nIG1lc3NhZ2VzLCBlcnJvcgotICogbWVzc2FnZXMsIGFuZCBleGNlcHRpb24gc3RhY2sgdHJhY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIEFic3RyYWN0UGx1Z2luIHBsdWdpbjsKLQotCS8vIFRoZSBwbHVnLWluIElELgotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IDxjb2RlPkxvZ2dlcjwvY29kZT4gZ2l2ZW4gdGhlIHBsdWctaW4gaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgVGhlIHBsdWdpbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTG9nZ2VyKEFic3RyYWN0UGx1Z2luIHBsdWdpbikgewotCQl0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLQkJdGhpcy5wbHVnaW5JZCA9IHBsdWdpbi5nZXRJZCgpOwotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1zZykgewotCQlsb2dNc2coSVN0YXR1cy5FUlJPUiwgbXNnLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBnaXZlbiBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGV4Ci0JICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFRocm93YWJsZSBleCkgewotCQlsb2dNc2coSVN0YXR1cy5FUlJPUiwgbnVsbCwgZXgpOwotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZS4KLQkgKiBAcGFyYW0gZXgKLQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1zZywgVGhyb3dhYmxlIGV4KSB7Ci0JCWxvZ01zZyhJU3RhdHVzLkVSUk9SLCBtc2csIGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBnaXZlbiB3YXJuaW5nIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dXYXJuaW5nKFN0cmluZyBtc2cpIHsKLQkJbG9nTXNnKElTdGF0dXMuV0FSTklORywgbXNnLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBnaXZlbiB3YXJuaW5nIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgd2FybmluZyBtZXNzYWdlLgotCSAqIEBwYXJhbSBleAotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dXYXJuaW5nKFN0cmluZyBtc2csIFRocm93YWJsZSBleCkgewotCQlsb2dNc2coSVN0YXR1cy5XQVJOSU5HLCBtc2csIGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBnaXZlbiBzdGF0dXMgbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBzdGF0dXMgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dJbmZvKFN0cmluZyBtc2cpIHsKLQkJbG9nTXNnKElTdGF0dXMuSU5GTywgbXNnLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogICAgICAgICAgICBUaGUgc2V2ZXJpdHkuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIG1lc3NhZ2UuCi0JICogQHBhcmFtIGV4Ci0JICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2dNc2coaW50IHNldmVyaXR5LCBTdHJpbmcgbXNnLCBUaHJvd2FibGUgZXgpIHsKLQkJaWYgKG1zZyA9PSBudWxsICYmIGV4ICE9IG51bGwpIHsKLQkJCW1zZyA9IGV4LmdldE1lc3NhZ2UoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQltc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIHBsdWdpbklkLCBJU3RhdHVzLk9LLCBtc2csIGV4KTsKLQotCQkvLyBDYWxsIHRoZSBFY2xpcHNlIExvZ2dlci4KLQkJcGx1Z2luLmdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9Nc2dCb3guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9Nc2dCb3guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWZjMTUyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvTXNnQm94LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZXNzYWdlQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBkaXNwbGF5IGEgbWVzc2FnZSBib3guCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1zZ0JveCB7Ci0JLyoqCi0JICogVXNlIHRoaXMgbWV0aG9kIHRvIHNob3cgZXJyb3IgbWVzc2FnZSBpZiB5b3UgZG9uJ3Qgd2FudCBsb25nIHBhdGggdG8gYmUKLQkgKiBjdXQgb2ZmLgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgbmF0aXZlU2hvd0Vycm9yKFNoZWxsIHNoZWxsLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQlzaGVsbCA9IGdldERlZmF1bHRTaGVsbCgpOwotCQkJaWYgKHNoZWxsID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJTWVzc2FnZUJveCBtc2dCb3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULk9LIHwgU1dULklDT05fRVJST1IpOwotCQltc2dCb3guc2V0TWVzc2FnZShtc2cpOwotCQltc2dCb3guc2V0VGV4dChzaGVsbC5nZXRUZXh0KCkpOwotCQltc2dCb3gub3BlbigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzaG93RXJyb3IoU3RyaW5nIG1zZykgewotCQlzaG93RXJyb3IoZ2V0RGVmYXVsdFNoZWxsKCksIG1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNob3dFcnJvcihTaGVsbCBzaGVsbCwgU3RyaW5nIG1zZykgewotCQlXcmFwcGVkTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIHNoZWxsID09IG51bGwgPyBudWxsIDogc2hlbGwKLQkJCQkuZ2V0VGV4dCgpLCBtc2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzaG93V2FybmluZyhTdHJpbmcgbXNnKSB7Ci0JCXNob3dXYXJuaW5nKGdldERlZmF1bHRTaGVsbCgpLCBtc2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzaG93V2FybmluZyhTaGVsbCBzaGVsbCwgU3RyaW5nIG1zZykgewotCQlXcmFwcGVkTWVzc2FnZURpYWxvZy5vcGVuV2FybmluZyhzaGVsbCwgc2hlbGwgPT0gbnVsbCA/IG51bGwgOiBzaGVsbAotCQkJCS5nZXRUZXh0KCksIG1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTaGVsbCBnZXREZWZhdWx0U2hlbGwoKSB7Ci0JCXRyeSB7Ci0JCQlEaXNwbGF5IGQgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJCWlmIChkID09IG51bGwpIHsKLQkJCQlkID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQl9Ci0KLQkJCVNoZWxsIHMgPSBudWxsOwotCQkJaWYgKGQgIT0gbnVsbCkgewotCQkJCXMgPSBkLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBzOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0JCXRyeSB7Ci0JCQlEaXNwbGF5IGQgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJCWlmIChkID09IG51bGwpIHsKLQkJCQlkID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBkOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvbXB0KFN0cmluZyBtc2cpIHsKLQkJcmV0dXJuIHByb21wdChnZXREZWZhdWx0U2hlbGwoKSwgbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9tcHQoU2hlbGwgc2hlbGwsIFN0cmluZyBtc2cpIHsKLQkJcmV0dXJuIHByb21wdChzaGVsbCwgbnVsbCwgbXNnLCBTV1QuWUVTIHwgU1dULk5PIHwgU1dULkNBTkNFTCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvbXB0KFN0cmluZyBtc2csIGludCBidXR0b25zKSB7Ci0JCXJldHVybiBwcm9tcHQoZ2V0RGVmYXVsdFNoZWxsKCksIG51bGwsIG1zZywgYnV0dG9ucyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvbXB0KFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgaW50IGJ1dHRvbnMpIHsKLQkJcmV0dXJuIHByb21wdChnZXREZWZhdWx0U2hlbGwoKSwgdGl0bGUsIG1zZywgYnV0dG9ucyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvbXB0KFNoZWxsIHNoZWxsLCBTdHJpbmcgbXNnLCBpbnQgYnV0dG9ucykgewotCQlyZXR1cm4gcHJvbXB0KHNoZWxsLCBudWxsLCBtc2csIGJ1dHRvbnMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb21wdChTaGVsbCBzaGVsbCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLAotCQkJaW50IGJ1dHRvbnMpIHsKLQkJTWVzc2FnZUJveCBtc2dCb3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgYnV0dG9ucyB8IFNXVC5JQ09OX1FVRVNUSU9OKTsKLQkJbXNnQm94LnNldFRleHQodGl0bGUgIT0gbnVsbCAmJiB0aXRsZS5sZW5ndGgoKSA+IDAgPyB0aXRsZSA6IHNoZWxsCi0JCQkJLmdldFRleHQoKSk7Ci0JCW1zZ0JveC5zZXRNZXNzYWdlKG1zZyk7Ci0JCXJldHVybiBtc2dCb3gub3BlbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L01zZ0RpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L01zZ0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZWJkNTZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9Nc2dEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogQSBtZXNzYWdlIGRpYWxvZyB1c2VkIGZvciBkaXNwbGF5aW5nIGVycm9yLCB3YXJuaW5nLCBjb25maXJtYXRpb24gb3IKLSAqIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTXNnRGlhbG9nIHsKLQotCS8vIFRoZSBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgQWJzdHJhY3RQbHVnaW4gcGx1Z2luOwotCi0JLy8gVGhlIHBsdWctaW4gSUQuCi0JcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWQ7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBsb2dnZXIuCi0JcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBwbHVnLWluIGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIFRoZSBwbHVnaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1zZ0RpYWxvZyhBYnN0cmFjdFBsdWdpbiBwbHVnaW4pIHsKLQkJdGhpcy5wbHVnaW4gPSBwbHVnaW47Ci0JCXRoaXMucGx1Z2luSWQgPSBwbHVnaW4uZ2V0SWQoKTsKLQkJdGhpcy5sb2dnZXIgPSBwbHVnaW4uZ2V0TG9nZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UgaW4gYW4gZXJyb3IgZGlhbG9nIHdpdGhvdXQgdGhlIGVycm9yCi0JICogcmVhc29uIGFuZCBEZXRhaWxzIGJ1dHRvbi4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgZXJyb3IgbWVzc2FnZSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpIHsKLQkJZGlzcGxheShJU3RhdHVzLkVSUk9SLCB0aXRsZSwgbXNnLCBudWxsLCBudWxsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZSBpbiBhbiBlcnJvciBkaWFsb2cgd2l0aG91dCB0aGUgZXJyb3IKLQkgKiByZWFzb24gYW5kIERldGFpbHMgYnV0dG9uLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBlcnJvciBtZXNzYWdlIGFuZCB0aGUgZXhjZXB0aW9uIHN0YWNrIHRyYWNlIHdpbGwgYmUgd3JpdHRlbiB0bwotCSAqIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZS4KLQkgKiBAcGFyYW0gZXgKLQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBUaHJvd2FibGUgZXgpIHsKLQkJZGlzcGxheShJU3RhdHVzLkVSUk9SLCB0aXRsZSwgbXNnLCBudWxsLCBudWxsLCBleCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UgaW4gYW4gZXJyb3IgZGlhbG9nIHdpdGhvdXQgdGhlIERldGFpbHMKLQkgKiBidXR0b24uCi0JICogPHA+Ci0JICogTm90ZTogVGhlIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZS4KLQkgKiBAcGFyYW0gcmVhc29uCi0JICogICAgICAgICAgICBUaGUgcmVhc29uIGZvciB0aGUgZXJyb3IuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheUVycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbikgewotCQlkaXNwbGF5KElTdGF0dXMuRVJST1IsIHRpdGxlLCBtc2csIHJlYXNvbiwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UgaW4gYW4gZXJyb3IgZGlhbG9nIHdpdGhvdXQgdGhlIERldGFpbHMKLQkgKiBidXR0b24uCi0JICogPHA+Ci0JICogTm90ZTogVGhlIGVycm9yIG1lc3NhZ2UgYW5kIHRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2Ugd2lsbCBiZSB3cml0dGVuIHRvCi0JICogdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlLgotCSAqIEBwYXJhbSByZWFzb24KLQkgKiAgICAgICAgICAgIFRoZSByZWFzb24gZm9yIHRoZSBlcnJvci4KLQkgKiBAcGFyYW0gZXgKLQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLAotCQkJVGhyb3dhYmxlIGV4KSB7Ci0JCWRpc3BsYXkoSVN0YXR1cy5FUlJPUiwgdGl0bGUsIG1zZywgcmVhc29uLCBudWxsLCBleCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UgaW4gYW4gZXJyb3IgZGlhbG9nLiBUaGUgRGV0YWlscyBidXR0b24KLQkgKiB3aWxsIGJlIGRpc3BsYXllZCBpZiB0aGUgPGNvZGU+ZGV0YWlsczwvY29kZT4gcGFyYW1ldGVyIGl0IG5vdCBudWxsIG9yCi0JICogZW1wdHkuCi0JICogPHA+Ci0JICogTm90ZTogVGhlIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZS4KLQkgKiBAcGFyYW0gcmVhc29uCi0JICogICAgICAgICAgICBUaGUgcmVhc29uIGZvciB0aGUgZXJyb3IuCi0JICogQHBhcmFtIGRldGFpbHMKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBkZXRhaWxzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sCi0JCQlTdHJpbmcgZGV0YWlscykgewotCQlkaXNwbGF5KElTdGF0dXMuRVJST1IsIHRpdGxlLCBtc2csIHJlYXNvbiwgZGV0YWlscywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UgaW4gYW4gZXJyb3IgZGlhbG9nLiBUaGUgRGV0YWlscyBidXR0b24KLQkgKiB3aWxsIGJlIGRpc3BsYXllZCBpZiB0aGUgPGNvZGU+ZGV0YWlsczwvY29kZT4gcGFyYW1ldGVyIGl0IG5vdCBudWxsIG9yCi0JICogZW1wdHkuCi0JICogPHA+Ci0JICogTm90ZTogVGhlIGVycm9yIG1lc3NhZ2UgYW5kIHRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2Ugd2lsbCBiZSB3cml0dGVuIHRvCi0JICogdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlLgotCSAqIEBwYXJhbSByZWFzb24KLQkgKiAgICAgICAgICAgIFRoZSByZWFzb24gZm9yIHRoZSBlcnJvci4KLQkgKiBAcGFyYW0gZGV0YWlscwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIGRldGFpbHMuCi0JICogQHBhcmFtIGV4Ci0JICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheUVycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwKLQkJCVN0cmluZyBkZXRhaWxzLCBUaHJvd2FibGUgZXgpIHsKLQkJZGlzcGxheShJU3RhdHVzLkVSUk9SLCB0aXRsZSwgbXNnLCByZWFzb24sIGRldGFpbHMsIGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZXJyb3Igc3RhdHVzIGluIGFuIGVycm9yIGRpYWxvZy4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgZXJyb3IgbWVzc2FnZSBhbmQgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZSB3aWxsIGJlIHdyaXR0ZW4gdG8KLQkgKiB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIHN0YXR1cy4KLQkgKi8KLQlwdWJsaWMgaW50IGRpc3BsYXlFcnJvcihTdHJpbmcgdGl0bGUsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCXJldHVybiBkaXNwbGF5KHRpdGxlLCBudWxsLCBzdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBzdGF0dXMgaW4gYW4gZXJyb3IgZGlhbG9nLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBlcnJvciBtZXNzYWdlIGFuZCB0aGUgZXhjZXB0aW9uIHN0YWNrIHRyYWNlIHdpbGwgYmUgd3JpdHRlbiB0bwotCSAqIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZS4KLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogICAgICAgICAgICBUaGUgZXJyb3Igc3RhdHVzLgotCSAqLwotCXB1YmxpYyBpbnQgZGlzcGxheUVycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgSVN0YXR1cyBzdGF0dXMpIHsKLQkJcmV0dXJuIGRpc3BsYXkodGl0bGUsIG1zZywgc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gd2FybmluZyBtZXNzYWdlIGluIGEgd2FybmluZyBkaWFsb2cgd2l0aG91dCB0aGUKLQkgKiB3YXJuaW5nIHJlYXNvbiBhbmQgRGV0YWlscyBidXR0b24uCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHdhbmluZyBtZXNzYWdlIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSB3YXJuaW5nIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgd2FybmluZyBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZykgewotCQlkaXNwbGF5KElTdGF0dXMuV0FSTklORywgdGl0bGUsIG1zZywgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIHdhcm5pbmcgbWVzc2FnZSBpbiBhIHdhcm5pbmcgZGlhbG9nIHdpdGhvdXQgdGhlCi0JICogd2FybmluZyByZWFzb24gYW5kIERldGFpbHMgYnV0dG9uLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSB3YXJuaW5nIG1lc3NhZ2UgYW5kIHRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2Ugd2lsbCBiZSB3cml0dGVuCi0JICogdG8gdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgd2FybmluZyBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLQkgKiBAcGFyYW0gZXgKLQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXJuaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgVGhyb3dhYmxlIGV4KSB7Ci0JCWRpc3BsYXkoSVN0YXR1cy5XQVJOSU5HLCB0aXRsZSwgbXNnLCBudWxsLCBudWxsLCBleCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIHdhcm5pbmcgbWVzc2FnZSBpbiBhIHdhcm5pbmcgZGlhbG9nIHdpdGhvdXQgdGhlCi0JICogd2FybmluZyByZWFzb24gYW5kIERldGFpbHMgYnV0dG9uLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSB3YW5pbmcgbWVzc2FnZSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgd2FybmluZyBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLQkgKiBAcGFyYW0gcmVhc29uCi0JICogICAgICAgICAgICBUaGUgcmVhc29uIGZvciB0aGUgd2FybmluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24pIHsKLQkJZGlzcGxheShJU3RhdHVzLldBUk5JTkcsIHRpdGxlLCBtc2csIHJlYXNvbiwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIHdhcm5pbmcgbWVzc2FnZSBpbiBhIHdhcm5pbmcgZGlhbG9nIHdpdGhvdXQgdGhlCi0JICogd2FybmluZyByZWFzb24gYW5kIERldGFpbHMgYnV0dG9uLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSB3YXJuaW5nIG1lc3NhZ2UgYW5kIHRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2Ugd2lsbCBiZSB3cml0dGVuCi0JICogdG8gdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgd2FybmluZyBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLQkgKiBAcGFyYW0gcmVhc29uCi0JICogICAgICAgICAgICBUaGUgcmVhc29uIGZvciB0aGUgd2FybmluZy4KLQkgKiBAcGFyYW0gZXgKLQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXJuaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwKLQkJCVRocm93YWJsZSBleCkgewotCQlkaXNwbGF5KElTdGF0dXMuV0FSTklORywgdGl0bGUsIG1zZywgcmVhc29uLCBudWxsLCBleCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIHdhcm5pbmcgbWVzc2FnZSBpbiBhIHdhcm5pbmcgZGlhbG9nLiBUaGUgRGV0YWlscwotCSAqIGJ1dHRvbiB3aWxsIGJlIGRpc3BsYXllZCBpZiB0aGUgPGNvZGU+ZGV0YWlsczwvY29kZT4gcGFyYW1ldGVyIGl0IG5vdAotCSAqIG51bGwgb3IgZW1wdHkuCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHdhbmluZyBtZXNzYWdlIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLQkgKiBAcGFyYW0gcmVhc29uCi0JICogICAgICAgICAgICBUaGUgcmVhc29uIGZvciB0aGUgd2FybmluZy4KLQkgKiBAcGFyYW0gZGV0YWlscwotCSAqICAgICAgICAgICAgVGhlIHdhcm5pbmcgZGV0YWlscy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sCi0JCQlTdHJpbmcgZGV0YWlscykgewotCQlkaXNwbGF5KElTdGF0dXMuV0FSTklORywgdGl0bGUsIG1zZywgcmVhc29uLCBkZXRhaWxzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gd2FybmluZyBtZXNzYWdlIGluIGEgd2FybmluZyBkaWFsb2cuIFRoZSBEZXRhaWxzCi0JICogYnV0dG9uIHdpbGwgYmUgZGlzcGxheWVkIGlmIHRoZSA8Y29kZT5kZXRhaWxzPC9jb2RlPiBwYXJhbWV0ZXIgaXQgbm90Ci0JICogbnVsbCBvciBlbXB0eS4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgd2FybmluZyBtZXNzYWdlIGFuZCB0aGUgZXhjZXB0aW9uIHN0YWNrIHRyYWNlIHdpbGwgYmUgd3JpdHRlbgotCSAqIHRvIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgd2FybmluZyBtZXNzYWdlLgotCSAqIEBwYXJhbSByZWFzb24KLQkgKiAgICAgICAgICAgIFRoZSByZWFzb24gZm9yIHRoZSB3YXJuaW5nLgotCSAqIEBwYXJhbSBkZXRhaWxzCi0JICogICAgICAgICAgICBUaGUgd2FybmluZyBkZXRhaWxzLgotCSAqIEBwYXJhbSBleAotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHdhcm5pbmcuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLAotCQkJU3RyaW5nIGRldGFpbHMsIFRocm93YWJsZSBleCkgewotCQlkaXNwbGF5KElTdGF0dXMuV0FSTklORywgdGl0bGUsIG1zZywgcmVhc29uLCBkZXRhaWxzLCBleCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIHdhcm5pbmcgc3RhdHVzIGluIGFuIGVycm9yIGRpYWxvZy4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgd2FybmluZyBtZXNzYWdlIGFuZCB0aGUgZXhjZXB0aW9uIHN0YWNrIHRyYWNlIHdpbGwgYmUgd3JpdHRlbgotCSAqIHRvIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogICAgICAgICAgICBUaGUgZXJyb3Igc3RhdHVzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKFN0cmluZyB0aXRsZSwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJZGlzcGxheSh0aXRsZSwgbnVsbCwgc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gd2FybmluZyBzdGF0dXMgaW4gYW4gZXJyb3IgZGlhbG9nLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSB3YXJuaW5nIG1lc3NhZ2UgYW5kIHRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2Ugd2lsbCBiZSB3cml0dGVuCi0JICogdG8gdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlLgotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBzdGF0dXMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBJU3RhdHVzIHN0YXR1cykgewotCQlkaXNwbGF5KHRpdGxlLCBtc2csIHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIGVycm9yIG9yIHdhcm5pbmcgbWVzc2FnZSBpbiBhbiBlcnJvciBvciB3YXJuaW5nCi0JICogZGlhbG9nLiBUaGUgRGV0YWlscyBidXR0b24gd2lsbCBiZSBkaXNwbGF5ZWQgaWYgdGhlIDxjb2RlPmRldGFpbHM8L2NvZGU+Ci0JICogcGFyYW1ldGVyIGl0IG5vdCBudWxsIG9yIGVtcHR5LgotCSAqIAotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqICAgICAgICAgICAgVGhlIHNldmVyaXR5LCBlaXRoZXIgSVN0YXR1cy5FUlJPUiBvciBJU3RhdHVzLldBUk5JTkcuCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIHJlYXNvbgotCSAqICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgdGhlIGVycm9yLgotCSAqIEBwYXJhbSBkZXRhaWxzCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgZGV0YWlscy4KLQkgKiBAcGFyYW0gZXgKLQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGlzcGxheShpbnQgc2V2ZXJpdHksIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywKLQkJCVN0cmluZyByZWFzb24sIFN0cmluZyBkZXRhaWxzLCBUaHJvd2FibGUgZXgpIHsKLQkJaWYgKG1zZyA9PSBudWxsICYmIGV4ICE9IG51bGwpIHsKLQkJCW1zZyA9IGV4LmdldE1lc3NhZ2UoKTsKLQkJfQotCi0JCWlmIChtc2cgPT0gbnVsbCkgewotCQkJbXNnID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChzZXZlcml0eSA9PSBJU3RhdHVzLkVSUk9SIHx8IHNldmVyaXR5ID09IElTdGF0dXMuV0FSTklORykgewotCQkJbG9nZ2VyLmxvZ01zZyhzZXZlcml0eSwgbXNnLCBleCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkic2V2ZXJpdHkgYXJndW1lbnQgbXVzdCBiZSBJU3RhdHVzLkVSUk9SIG9yIElTdGF0dXMuV0FSTklORyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlJbWFnZSBvbGRJbWFnZSA9IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2cKLQkJCQkuZ2V0RGVmYXVsdEltYWdlKCk7Ci0JCUltYWdlIHNoZWxsSW1hZ2UgPSBnZXRTaGVsbEltYWdlKCk7Ci0JCWlmIChzaGVsbEltYWdlICE9IG51bGwpIHsKLQkJCUVycm9yRGlhbG9nLnNldERlZmF1bHRJbWFnZShzaGVsbEltYWdlKTsKLQkJfQotCi0JCVNoZWxsIHNoZWxsID0gcGx1Z2luLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpOwotCi0JCWlmIChkZXRhaWxzICE9IG51bGwgJiYgZGV0YWlscy5sZW5ndGgoKSA+IDApIHsKLQkJCU11bHRpU3RhdHVzIG1TdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMocGx1Z2luSWQsIElTdGF0dXMuT0ssIHJlYXNvbiwKLQkJCQkJZXgpOwotCQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIHBsdWdpbklkLCBJU3RhdHVzLk9LLCBkZXRhaWxzLAotCQkJCQlleCk7Ci0JCQltU3RhdHVzLmFkZChzdGF0dXMpOwotCQkJb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIHRpdGxlLCBtc2csCi0JCQkJCW1TdGF0dXMpOwotCQl9IGVsc2UgaWYgKHJlYXNvbiAhPSBudWxsICYmIHJlYXNvbi5sZW5ndGgoKSA+IDApIHsKLQkJCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBwbHVnaW5JZCwgSVN0YXR1cy5PSywgcmVhc29uLAotCQkJCQlleCk7Ci0JCQlvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsIG1zZywKLQkJCQkJc3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChzZXZlcml0eSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCB0aXRsZSwgbXNnKTsKLQkJCX0gZWxzZSBpZiAoc2V2ZXJpdHkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7Ci0JCQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoc2hlbGwsIHRpdGxlLCBtc2cpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJRXJyb3JEaWFsb2cuc2V0RGVmYXVsdEltYWdlKG9sZEltYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBvciB3YXJuaW5nIG1lc3NhZ2UgaW4gYW4gZXJyb3Igb3Igd2FybmluZwotCSAqIGRpYWxvZy4gVGhlIERldGFpbHMgYnV0dG9uIHdpbGwgYmUgZGlzcGxheWVkIGlmIHRoZSA8Y29kZT5kZXRhaWxzPC9jb2RlPgotCSAqIHBhcmFtZXRlciBpdCBub3QgbnVsbCBvciBlbXB0eS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogICAgICAgICAgICBUaGUgZXJyb3Igc3RhdHVzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGRpc3BsYXkoU3RyaW5nIHRpdGxlLCBJU3RhdHVzIHN0YXR1cykgewotCQlyZXR1cm4gZGlzcGxheSh0aXRsZSwgbnVsbCwgc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlIGluIGFuIGVycm9yIG9yIHdhcm5pbmcKLQkgKiBkaWFsb2cuIFRoZSBEZXRhaWxzIGJ1dHRvbiB3aWxsIGJlIGRpc3BsYXllZCBpZiB0aGUgPGNvZGU+ZGV0YWlsczwvY29kZT4KLQkgKiBwYXJhbWV0ZXIgaXQgbm90IG51bGwgb3IgZW1wdHkuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIHN0YXR1cy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBkaXNwbGF5KFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKHN0YXR1cyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGF0dXMgYXJndW1lbnQgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQltc2cgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCWlmIChtc2cgPT0gbnVsbCkgewotCQkJbXNnID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWludCBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOwotCQlpZiAoc2V2ZXJpdHkgPT0gSVN0YXR1cy5FUlJPUiB8fCBzZXZlcml0eSA9PSBJU3RhdHVzLldBUk5JTkcpIHsKLQkJCWxvZ2dlci5sb2dNc2coc2V2ZXJpdHksIG1zZywgc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsKLQkJfQotCi0JCUltYWdlIG9sZEltYWdlID0gb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZwotCQkJCS5nZXREZWZhdWx0SW1hZ2UoKTsKLQkJSW1hZ2Ugc2hlbGxJbWFnZSA9IGdldFNoZWxsSW1hZ2UoKTsKLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJRXJyb3JEaWFsb2cuc2V0RGVmYXVsdEltYWdlKHNoZWxsSW1hZ2UpOwotCQl9Ci0KLQkJU2hlbGwgc2hlbGwgPSBwbHVnaW4uZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0KLQkJaW50IHJjID0gb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIHRpdGxlLAotCQkJCW1zZywgc3RhdHVzKTsKLQotCQlpZiAoc2hlbGxJbWFnZSAhPSBudWxsKSB7Ci0JCQlFcnJvckRpYWxvZy5zZXREZWZhdWx0SW1hZ2Uob2xkSW1hZ2UpOwotCQl9Ci0KLQkJcmV0dXJuIHJjOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBtZXNzYWdlIGluIGEgaW5mb3JtYXRpb25hbCBkaWFsb2cgd2l0aCBhbiAiT0siIGJ1dHRvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGluZm9ybWF0aW9uIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBkaXNwbGF5LgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlJbmZvKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZykgewotCQlpZiAobXNnID09IG51bGwpIHsKLQkJCW1zZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlJbWFnZSBvbGRJbWFnZSA9IFdyYXBwZWRNZXNzYWdlRGlhbG9nLmdldERlZmF1bHRJbWFnZSgpOwotCQlJbWFnZSBzaGVsbEltYWdlID0gZ2V0U2hlbGxJbWFnZSgpOwotCQlpZiAoc2hlbGxJbWFnZSAhPSBudWxsKSB7Ci0JCQlXcmFwcGVkTWVzc2FnZURpYWxvZy5zZXREZWZhdWx0SW1hZ2Uoc2hlbGxJbWFnZSk7Ci0JCX0KLQotCQlTaGVsbCBzaGVsbCA9IHBsdWdpbi5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHNoZWxsLCB0aXRsZSwgbXNnKTsKLQotCQlpZiAoc2hlbGxJbWFnZSAhPSBudWxsKSB7Ci0JCQlXcmFwcGVkTWVzc2FnZURpYWxvZy5zZXREZWZhdWx0SW1hZ2Uob2xkSW1hZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIG1lc3NhZ2UgaW4gYSBxdWVzdGlvbiBkaWFsb2cgd2l0aCBhICJZZXMiIGFuZCAiTm8iCi0JICogYnV0dG9uLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgaW5mb3JtYXRpb24gZGlhbG9nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzcGxheVByb21wdChTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpIHsKLQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQltc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBXcmFwcGVkTWVzc2FnZURpYWxvZy5nZXREZWZhdWx0SW1hZ2UoKTsKLQkJSW1hZ2Ugc2hlbGxJbWFnZSA9IGdldFNoZWxsSW1hZ2UoKTsKLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cuc2V0RGVmYXVsdEltYWdlKHNoZWxsSW1hZ2UpOwotCQl9Ci0KLQkJU2hlbGwgc2hlbGwgPSBwbHVnaW4uZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gV3JhcHBlZE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKHNoZWxsLCB0aXRsZSwgbXNnKTsKLQotCQlpZiAoc2hlbGxJbWFnZSAhPSBudWxsKSB7Ci0JCQlXcmFwcGVkTWVzc2FnZURpYWxvZy5zZXREZWZhdWx0SW1hZ2Uob2xkSW1hZ2UpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gbWVzc2FnZSBpbiBhIGNvbmZpcm1hdGlvbiBkaWFsb2cgd2l0aCBhICJZZXMiIGFuZAotCSAqICJDYW5jZWwiIGJ1dHRvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGluZm9ybWF0aW9uIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBkaXNwbGF5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc3BsYXlDb25maXJtYXRpb24oU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChtc2cgPT0gbnVsbCkgewotCQkJbXNnID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUltYWdlIG9sZEltYWdlID0gV3JhcHBlZE1lc3NhZ2VEaWFsb2cuZ2V0RGVmYXVsdEltYWdlKCk7Ci0JCUltYWdlIHNoZWxsSW1hZ2UgPSBnZXRTaGVsbEltYWdlKCk7Ci0JCWlmIChzaGVsbEltYWdlICE9IG51bGwpIHsKLQkJCVdyYXBwZWRNZXNzYWdlRGlhbG9nLnNldERlZmF1bHRJbWFnZShzaGVsbEltYWdlKTsKLQkJfQotCi0JCVNoZWxsIHNoZWxsID0gcGx1Z2luLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQlib29sZWFuIHJlc3VsdCA9IFdyYXBwZWRNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKHNoZWxsLCB0aXRsZSwgbXNnKTsKLQotCQlpZiAoc2hlbGxJbWFnZSAhPSBudWxsKSB7Ci0JCQlXcmFwcGVkTWVzc2FnZURpYWxvZy5zZXREZWZhdWx0SW1hZ2Uob2xkSW1hZ2UpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGRpc3BsYXlDb25maXJtYXRpb24oU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBJU3RhdHVzIHN0YXR1cykgewotCQlpZiAoc3RhdHVzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInN0YXR1cyBhcmd1bWVudCBjYW5ub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAobXNnID09IG51bGwpIHsKLQkJCW1zZyA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCX0KLQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQltc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJSW1hZ2Ugc2hlbGxJbWFnZSA9IGdldFNoZWxsSW1hZ2UoKTsKLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJRXJyb3JEaWFsb2dOb1JlYXNvbi5zZXREZWZhdWx0SW1hZ2Uoc2hlbGxJbWFnZSk7Ci0JCX0KLQotCQlTaGVsbCBzaGVsbCA9IHBsdWdpbi5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQotCQlpbnQgcmMgPSBFcnJvckRpYWxvZ05vUmVhc29uLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsIG1zZywgc3RhdHVzKTsKLQotCQlyZXR1cm4gcmM7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmb3IgdGhlIGN1cnJlbnQgc2hlbGwuCi0JICogCi0JICogQHJldHVybiBUaGUgY3VycmVudCBzaGVsbCBpbWFnZS4KLQkgKi8KLQlwcml2YXRlIEltYWdlIGdldFNoZWxsSW1hZ2UoKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJaWYgKHdvcmtiZW5jaCAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaAotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQlpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpIHsKLQkJCQlTaGVsbCBzaGVsbCA9IHdvcmtiZW5jaFdpbmRvdy5nZXRTaGVsbCgpOwotCQkJCWlmIChzaGVsbCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBzaGVsbC5nZXRJbWFnZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvVmVyc2lvbk1pc21hdGNoRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvVmVyc2lvbk1pc21hdGNoRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3NzM0MTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L1ZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eTsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSB0b29sIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlCi0gKiBtZXRob2QgbGlicmFyeSBpdCBpcyB0cnlpbmcgdG8gb3Blbi4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JcHJpdmF0ZSBWZXJzaW9uIGV4cGVjdGVkOwotCi0JcHJpdmF0ZSBWZXJzaW9uIGFjdHVhbDsKLQotCXB1YmxpYyBWZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24oVmVyc2lvbiBleHBlY3RlZCwgU3RyaW5nIGFjdHVhbCkgewotCQlzdXBlcigpOwotCQl0aGlzLmV4cGVjdGVkID0gZXhwZWN0ZWQ7Ci0JCWlmIChhY3R1YWwgPT0gbnVsbCkgewotCQkJdGhpcy5hY3R1YWwgPSBWZXJzaW9uLmVtcHR5VmVyc2lvbjsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuYWN0dWFsID0gbmV3IFZlcnNpb24oYWN0dWFsKTsKLQkJfQotCX0KLQotCXB1YmxpYyBWZXJzaW9uIGdldEFjdHVhbCgpIHsKLQkJcmV0dXJuIGFjdHVhbDsKLQl9Ci0KLQlwdWJsaWMgVmVyc2lvbiBnZXRFeHBlY3RlZCgpIHsKLQkJcmV0dXJuIGV4cGVjdGVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9WZXJzaW9uVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L1ZlcnNpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkNmU0MjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L1ZlcnNpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBQcm92aWRlcyB1dGlsaXRpZXMgdG8gcXVlcnkgYSBtZXRob2QgbGlicmFyeSBzY2hlbWEgYW5kIHRoZSB2ZXJzaW9uIG9mIHRoZQotICogdG9vbCB0aGF0IGNyZWF0ZWQgaXQuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmVyc2lvblV0aWwgewotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBWZXJzaW9uQ2hlY2tJbmZvIHsKLQkJcHVibGljIFZlcnNpb25DaGVja0luZm8oU3RyaW5nIGlkLCBTdHJpbmcgdG9vbFZlcnNpb24sCi0JCQkJU3RyaW5nIGN1cnJlbnRNaW5Ub29sVmVyc2lvbiwgaW50IHJlc3VsdCkgewotCQkJdGhpcy50b29sSUQgPSBpZDsKLQkJCXRoaXMudG9vbFZlcnNpb24gPSB0b29sVmVyc2lvbjsKLQkJCXRoaXMuY3VycmVudE1pblRvb2xWZXJzaW9uID0gY3VycmVudE1pblRvb2xWZXJzaW9uOwotCQkJdGhpcy5yZXN1bHQgPSByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvb2xJRDsKLQotCQlwdWJsaWMgU3RyaW5nIHRvb2xWZXJzaW9uOwotCi0JCXB1YmxpYyBTdHJpbmcgY3VycmVudE1pblRvb2xWZXJzaW9uOwotCi0JCS8qKgotCQkgKiA8IDA6IGZpbGVUb29sVmVyc2lvbiBpcyBvbGRlciB0aGFuIGN1cnJlbnRNaW5Ub29sVmVyc2lvbiA8YnIvPiA9PSAwOgotCQkgKiBtYXRjaCA8YnIvPiA+IDAgOiBmaWxlVG9vbFZlcnNpb24gaXMgbmV3ZXIgdGhhbiBjdXJyZW50TWluVG9vbFZlcnNpb24KLQkJICogPGJyLz4KLQkJICovCi0JCXB1YmxpYyBpbnQgcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UgPSBDb21tb25QbHVnaW4uY2xhc3MKLQkJCS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fVkVSU0lPTlNfSU5GTyA9ICJ2ZXJzaW9ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9MSUJfRVhURU5TSU9OX0NIRUNLID0gImxpYnJhcnlFeHRlbnNpb25WZXJzaW9uQ2hlY2siOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRV9WRVJTSU9OX0NIRUNLSU5HX1BSRUYgPSAiZGlzYWJsZV92ZXJzaW9uX2NoZWNraW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBNYXAgdmVyc2lvbnMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCi0JcHVibGljIHN0YXRpYyBNYXAgbGliRXh0Q2hlY2tlcnMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHZlcnNpb25DaGVja2luZ0Rpc2FibGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBMaXN0IG9mIHRvb2xJRHMgdG8gY2hlY2ssIGluIG9yZGVyCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCB0b29sSURzQ2hlY2tMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0Jc3RhdGljIHsKLQkJdG9vbElEc0NoZWNrTGlzdC5hZGQoRVBGVmVyc2lvbnMuVE9PTF9JRCk7Ci0KLQkJLy8gcmVhZCBwcm9wZXJ0aWVzIGZpbGUKLQkJdHJ5IHsKLQkJCVN0cmluZyB2YWx1ZVN0ciA9IENvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkJLmdldFN0cmluZyhESVNBQkxFX1ZFUlNJT05fQ0hFQ0tJTkdfUFJFRik7Ci0JCQl2ZXJzaW9uQ2hlY2tpbmdEaXNhYmxlZCA9IEJvb2xlYW4udmFsdWVPZih2YWx1ZVN0cikuYm9vbGVhblZhbHVlKCk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQl2ZXJzaW9uQ2hlY2tpbmdEaXNhYmxlZCA9IGZhbHNlOwotCQl9Ci0KLQkJLy8gUHJvY2VzcyB0aGUgIm9yZy5lY2xpcHNlLmVwZi5jb21tb24udmVyc2lvbiIgZXh0ZW5zaW9uIHBvaW50Ci0JCS8vIGNvbnRyaWJ1dG9ycy4KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSwgRVhURU5TSU9OX1BPSU5UX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJaW5pdEV4dGVuc2lvbihleHRlbnNpb24pOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW5pdEV4dGVuc2lvbihJRXh0ZW5zaW9uIGV4dGVuc2lvbikgewotCQlTdHJpbmcgZXh0ZW5zaW9uSUQgPSBleHRlbnNpb24uZ2V0U2ltcGxlSWRlbnRpZmllcigpOwotCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQl0cnkgewotCQkJCWlmIChFWFRFTlNJT05fVkVSU0lPTlNfSU5GTy5lcXVhbHMoY29uZmlnRWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQkJCXZlcnNpb25zLnB1dChleHRlbnNpb25JRCwgKEVQRlZlcnNpb25zKSBidW5kbGUKLQkJCQkJCQkJLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKEVYVEVOU0lPTl9MSUJfRVhURU5TSU9OX0NIRUNLLmVxdWFscyhjb25maWdFbGVtZW50Ci0JCQkJCQkuZ2V0TmFtZSgpKSkgewotCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQlsaWJFeHRDaGVja2Vycy5wdXQoZXh0ZW5zaW9uSUQsCi0JCQkJCQkJCShJTGlicmFyeUV4dGVuc2lvblZlcnNpb25DaGVjaykgYnVuZGxlCi0JCQkJCQkJCQkJLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtYXAgb2YgVG9vbCBJRHMtdG8tVmVyc2lvbnMgY2xhc3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRWZXJzaW9uc01hcCgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh2ZXJzaW9ucyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBhIFNldCBvZiBhbGwga25vd24gVG9vbCBJRHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNldCBnZXRBbGxUb29sSURzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KHZlcnNpb25zLmtleVNldCgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdG9vbElECi0JICogQHJldHVybiBUaGUgVmVyc2lvbnMgY2xhc3MgZm9yIHRoZSBnaXZlbiBUb29sIElECi0JICovCi0JcHVibGljIHN0YXRpYyBFUEZWZXJzaW9ucyBnZXRWZXJzaW9ucyhTdHJpbmcgdG9vbElEKSB7Ci0JCXJldHVybiAoRVBGVmVyc2lvbnMpIHZlcnNpb25zLmdldCh0b29sSUQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZmYgdmVyc2lvbiBjaGVja2luZyBpcyBkaXNhYmxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZlcnNpb25DaGVja2luZ0Rpc2FibGVkKCkgewotCQlyZXR1cm4gdmVyc2lvbkNoZWNraW5nRGlzYWJsZWQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfWE1JVmVyc2lvblBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoCi0JCQkiKFxcdys/KTp2ZXJzaW9uPVwiKC4rPylcIiIsIFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfWE1MVmVyc2lvbkF0dHJpYnV0ZVBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoCi0JCQkidG9vbD1cIiguKj8pXCIiLCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX1hNSV9FTEVNRU5UX1NUQVJUX1RBRyA9IFBhdHRlcm4KLQkJCS5jb21waWxlKCI8P3htbCB2ZXJzaW9uPVwiLis/XCIgZW5jb2Rpbmc9XCIuKz9cIj8+Iik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX0VORF9UQUcgPSAiPiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNSV9BVFRSSUJVVEVfVEFHID0gInhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX1NUQVJUX1RBRyA9ICI8dW1hOk1ldGhvZExpYnJhcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVkVSU0lPTlNfU0VQQVJBVE9SID0gIjsiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVE9PTF9WRVJTSU9OX1NFUEFSQVRPUiA9ICI9IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogR2l2ZW4gYW4gWE1MIGZpbGUsIHdpbGwgcmVhZCB0aGUgdG9vbD0iZm9vPWEuYi5jLmQ7YmFyPXcueC55LnoiCi0JICogYXR0cmlidXRlcyBhbmQgcmV0dXJuIGEgbWFwIG9mIHRoZSBpZC10by12ZXJzaW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0geG1sRmlsZQotCSAqICAgICAgICAgICAgZmlsZSB0byBwcm9jZXNzCi0JICogQHJldHVybiBudWxsIGlmIG5vIHZlcnNpb25zIGZvdW5kOyBhIG1hcCBvZiB0aGUgaWQtdG8tdmVyc2lvbnMgb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBNYXAgcmVhZFZlcnNpb25zRnJvbVhNTEZpbGUoRmlsZSB4bWxGaWxlKSB7Ci0JCU1hcCB2ZXJzaW9ucyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBudWxsOwotCQl0cnkgewotCQkJYnVmID0gRmlsZVV0aWwucmVhZEZpbGUoeG1sRmlsZSwgRmlsZVV0aWwuRU5DT0RJTkdfVVRGXzgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQl9Ci0JCWlmIChidWYgIT0gbnVsbCkgewotCQkJaW50IHhtaUVsZW1lbnRTdGFydElkeCA9IGJ1Zi5pbmRleE9mKFhNTF9FTEVNRU5UX1NUQVJUX1RBRyk7Ci0JCQlpZiAoeG1pRWxlbWVudFN0YXJ0SWR4ICE9IC0xKSB7Ci0JCQkJaW50IHhtaUVsZW1lbnRFbmRJZHggPSBidWYuaW5kZXhPZihYTUxfRUxFTUVOVF9FTkRfVEFHLAotCQkJCQkJeG1pRWxlbWVudFN0YXJ0SWR4ICsgWE1MX0VMRU1FTlRfU1RBUlRfVEFHLmxlbmd0aCgpKTsKLQkJCQlpZiAoeG1pRWxlbWVudEVuZElkeCAhPSAtMSkgewotCQkJCQlTdHJpbmcgcm9vdEVsZW1lbnQgPSBidWYuc3Vic3RyaW5nKHhtaUVsZW1lbnRTdGFydElkeCwKLQkJCQkJCQl4bWlFbGVtZW50RW5kSWR4KTsKLQkJCQkJTWF0Y2hlciBtQXR0cmlidXRlID0gcF9YTUxWZXJzaW9uQXR0cmlidXRlUGF0dGVybgotCQkJCQkJCS5tYXRjaGVyKHJvb3RFbGVtZW50KTsKLQkJCQkJaWYgKG1BdHRyaWJ1dGUuZmluZCgpKSB7Ci0JCQkJCQlTdHJpbmcgdG9vbHNBdHRyaWJ1dGUgPSBtQXR0cmlidXRlLmdyb3VwKDEpOwotCQkJCQkJaWYgKHRvb2xzQXR0cmlidXRlICE9IG51bGwKLQkJCQkJCQkJJiYgdG9vbHNBdHRyaWJ1dGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJU3RyaW5nW10gdmVyc2lvbnNBcnJheSA9IFN0clV0aWwuc3BsaXQoCi0JCQkJCQkJCQl0b29sc0F0dHJpYnV0ZSwgWE1MX1ZFUlNJT05TX1NFUEFSQVRPUik7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2ZXJzaW9uc0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCWlmICh2ZXJzaW9uc0FycmF5W2ldICE9IG51bGwKLQkJCQkJCQkJCQkmJiB2ZXJzaW9uc0FycmF5W2ldLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQkJU3RyaW5nW10gdmVyc2lvbkluZm9BcnJheSA9IFN0clV0aWwuc3BsaXQoCi0JCQkJCQkJCQkJCXZlcnNpb25zQXJyYXlbaV0sCi0JCQkJCQkJCQkJCVhNTF9UT09MX1ZFUlNJT05fU0VQQVJBVE9SKTsKLQkJCQkJCQkJCWlmICh2ZXJzaW9uSW5mb0FycmF5Lmxlbmd0aCAhPSAyKQotCQkJCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCQkJU3RyaW5nIHRvb2xJRCA9IHZlcnNpb25JbmZvQXJyYXlbMF07Ci0JCQkJCQkJCQlTdHJpbmcgdG9vbFZlcnNpb24gPSB2ZXJzaW9uSW5mb0FycmF5WzFdOwotCQkJCQkJCQkJaWYgKHRvb2xJRCAhPSBudWxsCi0JCQkJCQkJCQkJCSYmIHRvb2xJRC50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCQkJCSYmIHRvb2xWZXJzaW9uICE9IG51bGwKLQkJCQkJCQkJCQkJJiYgdG9vbFZlcnNpb24udHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJCQkJCQkJCQl2ZXJzaW9ucy5wdXQodG9vbElELCB0b29sVmVyc2lvbik7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHZlcnNpb25zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB2ZXJzaW9uczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdpdmVuIGFuIFhNSSBmaWxlLCB3aWxsIHJlYWQgdGhlIGZvbzp2ZXJzaW9uPSJ4LngueCIgYXR0cmlidXRlcyBhbmQKLQkgKiByZXR1cm4gYSBtYXAgb2YgdGhlIGlkLXRvLXZlcnNpb25zLgotCSAqIAotCSAqIEBwYXJhbSB4bWxGaWxlCi0JICogICAgICAgICAgICBmaWxlIHRvIHByb2Nlc3MKLQkgKiBAcmV0dXJuIG51bGwgaWYgbm8gdmVyc2lvbnMgZm91bmQ7IGEgbWFwIG9mIHRoZSBpZC10by12ZXJzaW9ucyBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCByZWFkVmVyc2lvbnNGcm9tWE1JRmlsZShGaWxlIHhtaUZpbGUpIHsKLQkJTWFwIHZlcnNpb25zID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlidWYgPSBGaWxlVXRpbC5yZWFkRmlsZSh4bWlGaWxlLCBGaWxlVXRpbC5FTkNPRElOR19VVEZfOCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCX0KLQkJaWYgKGJ1ZiAhPSBudWxsKSB7Ci0JCQlNYXRjaGVyIGRvY1N0YXJ0TWF0Y2hlciA9IHBfWE1JX0VMRU1FTlRfU1RBUlRfVEFHLm1hdGNoZXIoYnVmKTsKLQkJCWlmIChkb2NTdGFydE1hdGNoZXIuZmluZCgpKSB7Ci0JCQkJaW50IGRvY0hlYWRlckVuZElkeCA9IGRvY1N0YXJ0TWF0Y2hlci5lbmQoKTsKLQkJCQlpbnQgeG1pRWxlbWVudEVuZElkeCA9IGJ1Zi5pbmRleE9mKFhNTF9FTEVNRU5UX0VORF9UQUcsCi0JCQkJCQlkb2NIZWFkZXJFbmRJZHgpOwotCQkJCWlmICh4bWlFbGVtZW50RW5kSWR4ICE9IC0xKSB7Ci0JCQkJCVN0cmluZyByb290RWxlbWVudCA9IGJ1Zi5zdWJzdHJpbmcoZG9jSGVhZGVyRW5kSWR4LAotCQkJCQkJCXhtaUVsZW1lbnRFbmRJZHggKyAxKTsKLQkJCQkJTWF0Y2hlciBtID0gcF9YTUlWZXJzaW9uUGF0dGVybi5tYXRjaGVyKHJvb3RFbGVtZW50KTsKLQkJCQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQkJCQlTdHJpbmcgdG9vbElEID0gbS5ncm91cCgxKTsKLQkJCQkJCWlmICh0b29sSUQuZXF1YWxzKFhNSV9BVFRSSUJVVEVfVEFHKSkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCVN0cmluZyB0b29sVmVyc2lvbiA9IG0uZ3JvdXAoMik7Ci0JCQkJCQlpZiAodG9vbElEICE9IG51bGwgJiYgdG9vbElELnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkJCQkJJiYgdG9vbFZlcnNpb24gIT0gbnVsbAotCQkJCQkJCQkmJiB0b29sVmVyc2lvbi50cmltKCkubGVuZ3RoKCkgPiAwKQotCQkJCQkJCXZlcnNpb25zLnB1dCh0b29sSUQsIHRvb2xWZXJzaW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAodmVyc2lvbnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHZlcnNpb25zOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSBmaWxlLCB3aWxsIHJlYWQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgcmV0dXJuIGEgbWFwIG9mIHRoZQotCSAqIGlkLXRvLXZlcnNpb25zLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBmaWxlIHRvIHByb2Nlc3MKLQkgKiBAcmV0dXJuIG51bGwgaWYgbm8gdmVyc2lvbnMgZm91bmQ7IGEgbWFwIG9mIHRoZSBpZC10by12ZXJzaW9ucyBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCByZWFkVmVyc2lvbnNGcm9tRmlsZShGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUuZ2V0TmFtZSgpLnRvVXBwZXJDYXNlKCkuZW5kc1dpdGgoIlhNSSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiByZWFkVmVyc2lvbnNGcm9tWE1JRmlsZShmaWxlKTsKLQkJfSBlbHNlIGlmIChmaWxlLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpLmVuZHNXaXRoKCJYTUwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gcmVhZFZlcnNpb25zRnJvbVhNTEZpbGUoZmlsZSk7Ci0JCX0gZWxzZSB7Ci0JCQlNYXAgdmVyc2lvbnMgPSByZWFkVmVyc2lvbnNGcm9tWE1JRmlsZShmaWxlKTsKLQkJCWlmICh2ZXJzaW9ucyAhPSBudWxsKQotCQkJCXJldHVybiB2ZXJzaW9uczsKLQkJCXZlcnNpb25zID0gcmVhZFZlcnNpb25zRnJvbVhNTEZpbGUoZmlsZSk7Ci0JCQlpZiAodmVyc2lvbnMgIT0gbnVsbCkKLQkJCQlyZXR1cm4gdmVyc2lvbnM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSBmaWxlLCB3aWxsIGNvbXBhcmUgd2l0aCBjdXJyZW50IFhNTCBTY2hlbWEgdmVyc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4gbnVsbCBpZiBmaWxlIHRvb2wgdmVyc2lvbiBjYW4gbm90IGJlIGZvdW5kOyBhIFZlcnNpb25DaGVja0luZm8KLQkgKiAgICAgICAgIG9iamVjdCBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlcnNpb25DaGVja0luZm8gY2hlY2tYTUxWZXJzaW9uKEZpbGUgZmlsZSkgewotCQlNYXAgdmVyc2lvbk1hcCA9IFZlcnNpb25VdGlsLnJlYWRWZXJzaW9uc0Zyb21GaWxlKGZpbGUpOwotCQlpZiAodmVyc2lvbk1hcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCVZlcnNpb25DaGVja0luZm8gdmNpID0gbnVsbDsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRvb2xJRHNDaGVja0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIHRvb2xJRCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCWlmICh2ZXJzaW9uTWFwLmdldCh0b29sSUQpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHRvb2xWZXJzaW9uID0gKFN0cmluZykgdmVyc2lvbk1hcC5nZXQodG9vbElEKTsKLQkJCQkJdmNpID0gX2NoZWNrWE1MVmVyc2lvbih0b29sSUQsIHRvb2xWZXJzaW9uKTsKLQkJCQkJaWYgKHZjaSAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHZjaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVmVyc2lvbkNoZWNrSW5mbyBfY2hlY2tYTUxWZXJzaW9uKFN0cmluZyB0b29sSUQsCi0JCQlTdHJpbmcgdG9vbFZlcnNpb24pIHsKLQkJLy8gZ2V0IHRoZSBjbGFzcyB0aGF0IHN0b3JlcyBhbGwgdGhlIHZlcnNpb24gaW5mbyBmb3IgdGhpcyB0b29sIElECi0JCUVQRlZlcnNpb25zIHZlcnNpb25zID0gZ2V0VmVyc2lvbnModG9vbElEKTsKLQkJaWYgKHZlcnNpb25zICE9IG51bGwpIHsKLQkJCUVQRlZlcnNpb24gbWluQ3VyclZlcnNpb24gPSB2ZXJzaW9ucwotCQkJCQkuZ2V0TWluVG9vbFZlcnNpb25Gb3JDdXJyZW50WE1MU2NoZW1hVmVyc2lvbigpOwotCQkJaW50IHJlc3VsdCA9IG1pbkN1cnJWZXJzaW9uLmNvbXBhcmVUb29sVmVyc2lvblRvKG5ldyBWZXJzaW9uKAotCQkJCQl0b29sVmVyc2lvbikpOwotCQkJU3RyaW5nIGN1cnJlbnRNaW5Ub29sVmVyc2lvbiA9IG1pbkN1cnJWZXJzaW9uLmdldFRvb2xWZXJzaW9uKCkKLQkJCQkJLnRvU3RyaW5nKCk7Ci0JCQlyZXR1cm4gbmV3IFZlcnNpb25DaGVja0luZm8odG9vbElELCB0b29sVmVyc2lvbiwKLQkJCQkJY3VycmVudE1pblRvb2xWZXJzaW9uLCAtcmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIGZpbGUsIGNvbXBhcmVzIHdpdGggY3VycmVudCBsaWJyYXJ5IHNjaGVtYSB2ZXJzaW9uCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuIG51bGwgaWYgZmlsZSB0b29sIHZlcnNpb24gY2FuIG5vdCBiZSBmb3VuZDsgYSBWZXJzaW9uQ2hlY2tJbmZvCi0JICogICAgICAgICBvYmplY3Qgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBWZXJzaW9uQ2hlY2tJbmZvIGNoZWNrTGlicmFyeVZlcnNpb24oRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlLmdldE5hbWUoKS5lcXVhbHMoImxpYnJhcnkueG1pIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gY2hlY2sgbGlicmFyeSBleHRlbnNpb25zIGZpcnN0Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0b29sSURzQ2hlY2tMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyB0b29sSUQgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAobGliRXh0Q2hlY2tlcnMuZ2V0KHRvb2xJRCkgIT0gbnVsbCkgewotCQkJCQlWZXJzaW9uQ2hlY2tJbmZvIHZjaSA9IG51bGw7Ci0JCQkJCUlMaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrIGV4dENoZWNrID0gKElMaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrKSBsaWJFeHRDaGVja2VycwotCQkJCQkJCS5nZXQodG9vbElEKTsKLQkJCQkJdmNpID0gZXh0Q2hlY2suY2hlY2tMaWJyYXJ5VmVyc2lvbihmaWxlLmdldFBhcmVudEZpbGUoKSk7Ci0JCQkJCWlmICh2Y2kgIT0gbnVsbCkKLQkJCQkJCXJldHVybiB2Y2k7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCU1hcCB2ZXJzaW9uTWFwID0gVmVyc2lvblV0aWwucmVhZFZlcnNpb25zRnJvbUZpbGUoZmlsZSk7Ci0JCWlmICh2ZXJzaW9uTWFwID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgewotCQkJVmVyc2lvbkNoZWNrSW5mbyB2Y2kgPSBudWxsOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdG9vbElEc0NoZWNrTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgdG9vbElEID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHZlcnNpb25NYXAuZ2V0KHRvb2xJRCkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgdG9vbFZlcnNpb24gPSAoU3RyaW5nKSB2ZXJzaW9uTWFwLmdldCh0b29sSUQpOwotCQkJCQl2Y2kgPSBfY2hlY2tMaWJWZXJzaW9uKHRvb2xJRCwgdG9vbFZlcnNpb24pOwotCQkJCQlpZiAodmNpICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gdmNpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBWZXJzaW9uQ2hlY2tJbmZvIF9jaGVja0xpYlZlcnNpb24oU3RyaW5nIHRvb2xJRCwKLQkJCVN0cmluZyB0b29sVmVyc2lvbikgewotCQkvLyBnZXQgdGhlIGNsYXNzIHRoYXQgc3RvcmVzIGFsbCB0aGUgdmVyc2lvbiBpbmZvIGZvciB0aGlzIHRvb2wgSUQKLQkJRVBGVmVyc2lvbnMgdmVyc2lvbnMgPSBnZXRWZXJzaW9ucyh0b29sSUQpOwotCQlpZiAodmVyc2lvbnMgIT0gbnVsbCkgewotCQkJRVBGVmVyc2lvbiBtaW5DdXJyVmVyc2lvbiA9IHZlcnNpb25zCi0JCQkJCS5nZXRNaW5Ub29sVmVyc2lvbkZvckN1cnJlbnRMaWJyYXJ5VmVyc2lvbigpOwotCQkJaW50IHJlc3VsdCA9IG1pbkN1cnJWZXJzaW9uLmNvbXBhcmVUb29sVmVyc2lvblRvKG5ldyBWZXJzaW9uKAotCQkJCQl0b29sVmVyc2lvbikpOwotCQkJU3RyaW5nIGN1cnJlbnRNaW5Ub29sVmVyc2lvbiA9IG1pbkN1cnJWZXJzaW9uLmdldFRvb2xWZXJzaW9uKCkKLQkJCQkJLnRvU3RyaW5nKCk7Ci0JCQlyZXR1cm4gbmV3IFZlcnNpb25DaGVja0luZm8odG9vbElELCB0b29sVmVyc2lvbiwKLQkJCQkJY3VycmVudE1pblRvb2xWZXJzaW9uLCAtcmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCB0b29sSUQgdGhhdCBpcyBjaGVja2VkLiBJbiBtb3N0IGNhc2VzLCB0aGUgSUQgb2YgdGhlCi0JICogICAgICAgICBjdXJyZW50bHkgcnVubmluZyBhcHBsaWNhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByaW1hcnlUb29sSUQoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0b29sSURzQ2hlY2tMaXN0LmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgdG9vbCBJRCB0byB0aGUgb3JkZXIgb2YgdG9vbHMgdG8gY2hlY2suCi0JICogCi0JICogQHBhcmFtIHRvb2xJRAotCSAqICAgICAgICAgICAgdG9vbElEIHRvIGFkZAotCSAqIEBwYXJhbSB0b29sSURmb2xsb3dpbmcKLQkgKiAgICAgICAgICAgIGlmIG51bGwsIGFkZHMgdG9vbElEIHRvIGZyb250IG9mIGxpc3QuIG90aGVyd2lzZSwgYWRkcyB0b29sSUQKLQkgKiAgICAgICAgICAgIGJlZm9yZSB0aGUgc3BlY2lmaWVkIElECi0JICogQHJldHVybiBmYWxzZSBpZmYgdG9vbElEZm9sbG93aW5nIGlzIG5vdCBudWxsIGFuZCBjb3VsZCBub3QgYmUgZm91bmQgaW4KLQkgKiAgICAgICAgIGxpc3Q7IHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZFRvb2xJRChTdHJpbmcgdG9vbElELCBTdHJpbmcgdG9vbElEZm9sbG93aW5nKSB7Ci0JCWlmICh0b29sSURmb2xsb3dpbmcgIT0gbnVsbCkgewotCQkJaW50IGlkeCA9IHRvb2xJRHNDaGVja0xpc3QuaW5kZXhPZih0b29sSURmb2xsb3dpbmcpOwotCQkJaWYgKGlkeCAhPSAtMSkgewotCQkJCXRvb2xJRHNDaGVja0xpc3QuYWRkKGlkeCwgdG9vbElEKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXRvb2xJRHNDaGVja0xpc3QuYWRkKDAsIHRvb2xJRCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L1ZlcnNpb25VdGlsLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvVmVyc2lvblV0aWwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTRmMjZlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvVmVyc2lvblV0aWwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZlcnNpb25DaGVja2luZ0VuYWJsZWQ9dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L1dyYXBwZWRNZXNzYWdlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvV3JhcHBlZE1lc3NhZ2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWMyMzIwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvV3JhcHBlZE1lc3NhZ2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBEaXNwbGF5cyBhIG1lc3NhZ2UgZGlhbG9nIHRoYXQgZGlzcGxheXMgd3JhcHBlZCB0ZXh0LgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdyYXBwZWRNZXNzYWdlRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZyB7Ci0KLQlwdWJsaWMgV3JhcHBlZE1lc3NhZ2VEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwKLQkJCUltYWdlIGRpYWxvZ1RpdGxlSW1hZ2UsIFN0cmluZyBkaWFsb2dNZXNzYWdlLCBpbnQgZGlhbG9nSW1hZ2VUeXBlLAotCQkJU3RyaW5nW10gZGlhbG9nQnV0dG9uTGFiZWxzLCBpbnQgZGVmYXVsdEluZGV4KSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgZGlhbG9nVGl0bGVJbWFnZSwgZGlhbG9nTWVzc2FnZSwKLQkJCQlkaWFsb2dJbWFnZVR5cGUsIGRpYWxvZ0J1dHRvbkxhYmVscywgZGVmYXVsdEluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVNZXNzYWdlQXJlYShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0KLQkJQ29udHJvbCByQ29tcG9zaXRlID0gc3VwZXIuY3JlYXRlTWVzc2FnZUFyZWEoY29tcG9zaXRlKTsKLQotCQlpbnQgbWluV2lkdGggPSBJRGlhbG9nQ29uc3RhbnRzLk1JTklNVU1fTUVTU0FHRV9BUkVBX1dJRFRIOy8vICsgMzAwOwotCQkvLyBUTy1ETzogbmVlZCB0byByZXZpc3QgdGhlICMgb2YgZGlhbG9nIGRpc3BsYXkgdW5pdHMgYW5kIG1hcmdpbgotCQkvLyB3aGVuIGluIG90aGVyIGxhbmd1YWdlcwotCQlpbnQgY2hhcnNQZXJMaW5lID0gbWluV2lkdGggLyA0IC0gMTU7Ci0JCUdyaWREYXRhIGdkID0gKEdyaWREYXRhKSBtZXNzYWdlTGFiZWwuZ2V0TGF5b3V0RGF0YSgpOwotCQlnZC5taW5pbXVtV2lkdGggPSBtaW5XaWR0aDsKLQkJbWVzc2FnZUxhYmVsLnNldFRleHQoYWRkTGluZUJyZWFrcyhtZXNzYWdlLCBjaGFyc1BlckxpbmUpKTsKLQotCQlyZXR1cm4gckNvbXBvc2l0ZTsKLQl9Ci0KLQlTdHJpbmcgYWRkTGluZUJyZWFrcyhTdHJpbmcgbXNnLCBpbnQgbWF4Q2hhcnMpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgREVCVUc6IG9yaWdpbmFsIG1lc3NhZ2UgPSAiICsgbXNnKTsKLQotCQlpZiAobXNnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1zZy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlzdHJCdWYuYXBwZW5kKG1zZy5jaGFyQXQoaSkpOwotCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UobXNnLmNoYXJBdChpKSkpCi0JCQkJY291bnQgPSAwOwotCQkJZWxzZQotCQkJCWNvdW50Kys7Ci0KLQkJCWlmIChjb3VudCA+PSBtYXhDaGFycykgewotCQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShtc2cuY2hhckF0KGkpKSkgewotCQkJCQlzdHJCdWYuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWNvdW50ID0gMDsKLQkJCX0KLQkJfQotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIERFQlVHOiBicm9rZW4gbWVzc2FnZSA9ICIgKwotCQkvLyBzdHJCdWYudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlbkNvbmZpcm0oU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCVdyYXBwZWRNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBXcmFwcGVkTWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLAotCQkJCW51bGwsIC8vIGFjY2VwdAotCQkJCS8vIHRoZQotCQkJCS8vIGRlZmF1bHQKLQkJCQkvLyB3aW5kb3cKLQkJCQkvLyBpY29uCi0JCQkJbWVzc2FnZSwgUVVFU1RJT04sIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0JCQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCB9LCAwKTsgLy8gT0sgaXMgdGhlCi0JCS8vIGRlZmF1bHQKLQkJcmV0dXJuIGRpYWxvZy5vcGVuKCkgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkVycm9yKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotCQlXcmFwcGVkTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgV3JhcHBlZE1lc3NhZ2VEaWFsb2cocGFyZW50LCB0aXRsZSwKLQkJCQludWxsLCAvLyBhY2NlcHQKLQkJCQkvLyB0aGUKLQkJCQkvLyBkZWZhdWx0Ci0JCQkJLy8gd2luZG93Ci0JCQkJLy8gaWNvbgotCQkJCW1lc3NhZ2UsIEVSUk9SLCBuZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMIH0sIDApOyAvLyBvawotCQkvLyBpcwotCQkvLyB0aGUKLQkJLy8gZGVmYXVsdAotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm47Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5JbmZvcm1hdGlvbihTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwKLQkJCVN0cmluZyBtZXNzYWdlKSB7Ci0JCVdyYXBwZWRNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBXcmFwcGVkTWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLAotCQkJCW51bGwsIC8vIGFjY2VwdAotCQkJCS8vIHRoZQotCQkJCS8vIGRlZmF1bHQKLQkJCQkvLyB3aW5kb3cKLQkJCQkvLyBpY29uCi0JCQkJbWVzc2FnZSwgSU5GT1JNQVRJT04sCi0JCQkJbmV3IFN0cmluZ1tdIHsgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCB9LCAwKTsKLQkJLy8gb2sgaXMgdGhlIGRlZmF1bHQKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuUXVlc3Rpb24oU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsCi0JCQlTdHJpbmcgbWVzc2FnZSkgewotCQlXcmFwcGVkTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgV3JhcHBlZE1lc3NhZ2VEaWFsb2cocGFyZW50LCB0aXRsZSwKLQkJCQludWxsLCAvLyBhY2NlcHQKLQkJCQkvLyB0aGUKLQkJCQkvLyBkZWZhdWx0Ci0JCQkJLy8gd2luZG93Ci0JCQkJLy8gaWNvbgotCQkJCW1lc3NhZ2UsIFFVRVNUSU9OLCBuZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwKLQkJCQkJCUlEaWFsb2dDb25zdGFudHMuTk9fTEFCRUwgfSwgMCk7IC8vIHllcyBpcyB0aGUKLQkJLy8gZGVmYXVsdAotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKSA9PSAwOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuV2FybmluZyhTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IFdyYXBwZWRNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsCi0JCQkJbnVsbCwgLy8gYWNjZXB0Ci0JCQkJLy8gdGhlCi0JCQkJLy8gZGVmYXVsdAotCQkJCS8vIHdpbmRvdwotCQkJCS8vIGljb24KLQkJCQltZXNzYWdlLCBXQVJOSU5HLCBuZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMIH0sIDApOyAvLyBvawotCQkvLyBpcwotCQkvLyB0aGUKLQkJLy8gZGVmYXVsdAotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxMzM0N2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGNvbW1vbiBlcnJvciBoYW5kbGluZywgbG9nZ2luZyBhbmQgdmVyc2lvbmluZyBzZXJ2aWNlcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvQ2xpcGJvYXJkVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0NsaXBib2FyZFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjU0MDZjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvQ2xpcGJvYXJkVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHJldHJpZXZpbmcgZGF0YSBmcm9tIHRoZSBjbGlwYm9hcmQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2xpcGJvYXJkVXRpbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX1VSTCA9ICJTb3VyY2VVUkw6IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNmZXIgaHRtbFRyYW5zZmVyID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0KLQkJCQkJCS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlDbGFzcyBjID0gYnVuZGxlCi0JCQkJCQkubG9hZENsYXNzKCJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLldpbjMySFRNTFRyYW5zZmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQkJCWh0bWxUcmFuc2ZlciA9IChUcmFuc2ZlcikgYy5uZXdJbnN0YW5jZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaHRtbFRyYW5zZmVyID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIEhUTUwgc291cmNlIFVSTCBmcm9tIHRoZSBjdXJyZW50IGNsaXBib2FyZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBIVE1MIHNvdXJjZSBVUkwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRIVE1MU291cmNlVVJMKCkgewotCQlpZiAoaHRtbFRyYW5zZmVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZVVSTCA9IG51bGw7Ci0JCQlTdHJpbmcgaHRtbENvbnRlbnQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHMoaHRtbFRyYW5zZmVyKTsKLQkJCWlmIChodG1sQ29udGVudCAhPSBudWxsICYmIGh0bWxDb250ZW50Lmxlbmd0aCgpID4gMCkgewotCQkJCWludCBpbmRleCA9IGh0bWxDb250ZW50LmluZGV4T2YoU09VUkNFX1VSTCk7Ci0JCQkJaWYgKGluZGV4ID4gMCkgewotCQkJCQlzb3VyY2VVUkwgPSBodG1sQ29udGVudC5zdWJzdHJpbmcoaW5kZXgKLQkJCQkJCQkrIFNPVVJDRV9VUkwubGVuZ3RoKCkpOwotCQkJCQlzb3VyY2VVUkwgPSBzb3VyY2VVUkwuc3Vic3RyaW5nKDAsIHNvdXJjZVVSTAotCQkJCQkJCS5pbmRleE9mKEZpbGVVdGlsLkxJTkVfU0VQKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHNvdXJjZVVSTDsKLQkJfSBmaW5hbGx5IHsKLQkJCWNsaXBib2FyZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9GaWxlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0ZpbGVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYwMzcyOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0ZpbGVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmlvLkNoYXJCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlTG9jazsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5PdmVybGFwcGluZ0ZpbGVMb2NrRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXREZWNvZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIG1hbmFnaW5nIGRpcmVjdG9yaWVzIGFuZCBmaWxlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmlsZVV0aWwgewotCi0JLyoqCi0JICogUGxhdGZvcm0tc3BlY2lmaWMgbGluZSBzZXBhcmF0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9TRVAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBsYXRmb3JtLXNwZWNpZmljIGZpbGUgc2VwYXJhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfU0VQID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQbGF0Zm9ybS1zcGVjaWZpYyBsaW5lIHNlcGFyYXRvciBsZW5ndGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElORV9TRVBfTEVOR1RIID0gTElORV9TRVAubGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBVTkMgcGF0aCBwcmVmaXguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5DX1BBVEhfUFJFRklYID0gIlxcXFwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBVTkMgcGF0aCBwcmVmaXggbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOQ19QQVRIX1BSRUZJWF9MRU5HVEggPSBVTkNfUEFUSF9QUkVGSVgubGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBJU08tODg1OS0xIGVuY29kaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX0lTT184ODU5XzEgPSAiSVNPLTg4NTktMSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFVURi04IGVuY29kaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX1VURl84ID0gIlVURi04IjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4gQWxsCi0JICogbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHNob3VsZCBiZSBzdGF0aWMuCi0JICovCi0JcHJpdmF0ZSBGaWxlVXRpbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIGZvciB0aGUgZ2l2ZW4gZmlsZSBvciBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBnaXZlbiBmaWxlIG9yIGRpcmVjdG9yeS4KLQkgKiBAcmV0dXJuIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBnaXZlbiBmaWxlIG9yIGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBmaWxlLmdldEFic29sdXRlUGF0aCgpLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIGZvciB0aGUgZ2l2ZW4gZmlsZSBvciBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBnaXZlbiBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lLgotCSAqIEByZXR1cm4gVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGdpdmVuIGZpbGUgb3IgZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFic29sdXRlUGF0aChTdHJpbmcgZmlsZSkgewotCQlyZXR1cm4gZ2V0QWJzb2x1dGVQYXRoKG5ldyBGaWxlKGZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIGZvciB0aGUgZ2l2ZW4gVVJMLgotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIFRoZSBnaXZlbiBVUkwuCi0JICogQHJldHVybiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZ2l2ZW4gVVJMLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFic29sdXRlUGF0aChVUkwgdXJsKSB7Ci0JCVN0cmluZyBwYXRoTmFtZSA9IHVybC5nZXRGaWxlKCkuc3Vic3RyaW5nKDEpOwotCQlTdHJpbmcgcmVzdWx0ID0gTmV0VXRpbC5kZWNvZGVVcmwocGF0aE5hbWUsIG51bGwpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIG5hbWUuCi0JICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXJlbnREaXJlY3RvcnkoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIChuZXcgRmlsZShwYXRoKSkuZ2V0UGFyZW50KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSBuYW1lIGFuZCBleHRlbnNpb24gZnJvbSB0aGUgZ2l2ZW4gcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGggbmFtZS4KLQkgKiBAcmV0dXJuIFRoZSBmaWxlIG5hbWUgYW5kIHRoZSBmaWxlIGV4dGVuc2lvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlTmFtZShTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gZ2V0RmlsZU5hbWUocGF0aCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSBuYW1lIGZyb20gdGhlIGdpdmVuIHBhdGgsIHdpdGggb3Igd2l0aG91dCB0aGUgZmlsZQotCSAqIGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGggbmFtZS4KLQkgKiBAcGFyYW0gd2l0aEV4dGVuc2lvbgotCSAqICAgICAgICAgICAgSWYgdHJ1ZSwgaW5jbHVkZSB0aGUgZmlsZSBleHRlbnNpb24gaW4gdGhlIHJlc3VsdC4KLQkgKiBAcmV0dXJuIFRoZSBmaWxlIG5hbWUgd2l0aCBvciB3aXRob3V0IHRoZSBmaWxlIGV4dGVuc2lvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlTmFtZShTdHJpbmcgcGF0aCwgYm9vbGVhbiB3aXRoRXh0ZW5zaW9uKSB7Ci0JCVN0cmluZyBub3JtYWxpemVkUGF0aCA9IHBhdGgucmVwbGFjZSgnXFwnLCAnLycpOwotCi0JCWludCBwcmVmaXhMZW5ndGggPSAwOwotCQlpZiAobm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChOZXRVdGlsLkZJTEVfVVJJX1BSRUZJWCkpIHsKLQkJCXByZWZpeExlbmd0aCA9IE5ldFV0aWwuRklMRV9VUklfUFJFRklYX0xFTkdUSDsKLQkJfSBlbHNlIGlmIChub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKE5ldFV0aWwuSFRUUF9VUklfUFJFRklYKSkgewotCQkJcHJlZml4TGVuZ3RoID0gTmV0VXRpbC5IVFRQX1VSSV9QUkVGSVhfTEVOR1RIOwotCQl9Ci0KLQkJU3RyaW5nIGZpbGVOYW1lOwotCQlpbnQgaW5kZXggPSBub3JtYWxpemVkUGF0aC5sYXN0SW5kZXhPZigiLyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbmRleCA8IHByZWZpeExlbmd0aCkgewotCQkJZmlsZU5hbWUgPSBub3JtYWxpemVkUGF0aC5zdWJzdHJpbmcocHJlZml4TGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCWZpbGVOYW1lID0gcGF0aC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJfQotCi0JCWlmICh3aXRoRXh0ZW5zaW9uKSB7Ci0JCQlyZXR1cm4gZmlsZU5hbWU7Ci0JCX0KLQotCQlpbmRleCA9IGZpbGVOYW1lLmluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gKGluZGV4ID4gMCkgPyBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpIDogZmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVsYXRpdmUgcGF0aCBmb3IgdGhlIHRhcmdldCBwYXRoIGZyb20gdGhlIGJhc2UgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBwYXRoLgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGJhc2UgcGF0aC4KLQkgKiBAcmV0dXJuIFRoZSByZWxhdGl2ZSBwYXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlbGF0aXZlUGF0aFRvQmFzZShGaWxlIHBhdGgsIEZpbGUgYmFzZVBhdGgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBkaXIgPSBwYXRoLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCVN0cmluZyBiYXNlRGlyID0gYmFzZVBhdGgudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWlmIChkaXIuaW5kZXhPZihiYXNlRGlyKSA9PSAwKSB7Ci0JCQkJU3RyaW5nIGRlbHRhID0gZGlyLnN1YnN0cmluZyhiYXNlRGlyLmxlbmd0aCgpKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhLmxlbmd0aCgpOyBpKyspIHsKLQkJCQkJaWYgKGRlbHRhLmNoYXJBdChpKSA9PSAnLycpIHsKLQkJCQkJCXJlc3VsdC5hcHBlbmQoIi4uLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlbGF0aXZlUGF0aChGaWxlIHBhdGgsIEZpbGUgYmFzZVBhdGgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBkaXIgPSBwYXRoLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCVN0cmluZyBiYXNlRGlyID0gYXBwZW5kU2VwYXJhdG9yKGJhc2VQYXRoLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKSwKLQkJCQkJIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXdoaWxlIChkaXIuaW5kZXhPZihiYXNlRGlyKSA9PSAtMSkgewotCQkJCWJhc2VQYXRoID0gYmFzZVBhdGguZ2V0UGFyZW50RmlsZSgpOwotCQkJCWJhc2VEaXIgPSBhcHBlbmRTZXBhcmF0b3IoYmFzZVBhdGgudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpLAotCQkJCQkJIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQoIi4uLyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZGlyLmluZGV4T2YoYmFzZURpcikgPT0gMCkgewotCQkJCVN0cmluZyBkZWx0YSA9IGRpci5zdWJzdHJpbmcoYmFzZURpci5sZW5ndGgoKSk7Ci0JCQkJcmVzdWx0LmFwcGVuZChkZWx0YSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGVuZHMgdGhlIHBsYXRmb3JtIHNwZWNpZmljIHBhdGggc2VwYXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIGdpdmVuCi0JICogcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGggbmFtZS4KLQkgKiBAcmV0dXJuIFRoZSBwYXRoIG5hbWUgYXBwZW5kZWQgd2l0aCB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgcGF0aCBzZXBhcmF0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwZW5kU2VwYXJhdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBhcHBlbmRTZXBhcmF0b3IocGF0aCwgRmlsZS5zZXBhcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZHMgdGhlIGdpdmVuIHBhdGggc2VwYXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIG5hbWUuCi0JICogQHBhcmFtIHNlcGFyYXRvcgotCSAqICAgICAgICAgICAgVGhlIHBhdGggc2VwYXJhdG9yLgotCSAqIEByZXR1cm4gVGhlIHBhdGggbmFtZSBhcHBlbmRlZCB3aXRoIHRoZSBnaXZlbiBzZXBhcmF0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwZW5kU2VwYXJhdG9yKFN0cmluZyBwYXRoLCBTdHJpbmcgc2VwYXJhdG9yKSB7Ci0JCXJldHVybiBwYXRoLmVuZHNXaXRoKHNlcGFyYXRvcikgPyBwYXRoIDogcGF0aCArIHNlcGFyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBlbmRpbmcgcGF0aCBzZXBhcmF0b3IgZnJvbSB0aGUgZ2l2ZW4gcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGggbmFtZS4KLQkgKiBAcmV0dXJuIFRoZSBwYXRoIG5hbWUgbWludXMgdGhlIHBsYXRmb3JtIHNwZWNpZmljIHBhdGggc2VwYXJhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZVNlcGFyYXRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gcGF0aC5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikgPyBwYXRoLnN1YnN0cmluZygwLAotCQkJCXBhdGgubGVuZ3RoKCkgLSAxKSA6IHBhdGg7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZW5kaW5nIHBhdGggc2VwYXJhdG9yIGZyb20gdGhlIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIG5hbWUuCi0JICogQHJldHVybiBUaGUgcGF0aCBuYW1lIG1pbnVzIHRoZSBwYXRoIHNlcGFyYXRvciAiXFwiIG9yICIvIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVBbGxTZXBhcmF0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIHBhdGguZW5kc1dpdGgoIi8iKSB8fCBwYXRoLmVuZHNXaXRoKCJcXCIpID8gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDEpIDogcGF0aDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZW5kaW5nIHBhdGggc2VwYXJhdG9yIGZyb20gdGhlIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIG5hbWUuCi0JICogQHBhcmFtIHNlcGFyYXRvcgotCSAqICAgICAgICAgICAgVGhlIHBhdGggc2VwYXJhdG9yLgotCSAqIEByZXR1cm4gVGhlIHBhdGggbmFtZSBtaW51cyB0aGUgc2VwYXJhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZVNlcGFyYXRvcihTdHJpbmcgcGF0aCwgU3RyaW5nIHNlcGFyYXRvcikgewotCQlyZXR1cm4gcGF0aC5lbmRzV2l0aChzZXBhcmF0b3IpID8gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDEpCi0JCQkJOiBwYXRoOwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2VzIHRoZSBmaWxlIG5hbWUgd2l0aCBhbm90aGVyIGluIHRoZSBnaXZlbiBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBUaGUgcGF0aCBuYW1lLgotCSAqIEBwYXJhbSBvbGRGaWxlTmFtZQotCSAqICAgICAgICAgICAgVGhlIG9sZCBmaWxlIG5hbWUuCi0JICogQHBhcmFtIG5ld0ZpbGVOYW1lCi0JICogICAgICAgICAgICBUaGUgbmV3IGZpbGUgbmFtZS4KLQkgKiBAcmV0dXJuIFRoZSBuZXcgcGF0aCBuYW1lIHdpdGggdGhlIG5ldyBmaWxlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZUZpbGVOYW1lKFN0cmluZyBwYXRoLCBTdHJpbmcgb2xkRmlsZU5hbWUsCi0JCQlTdHJpbmcgbmV3RmlsZU5hbWUpIHsKLQkJaW50IGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZihvbGRGaWxlTmFtZSk7Ci0JCXJldHVybiBwYXRoLnN1YnN0cmluZygwLCBpbmRleCkgKyBuZXdGaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyB0aGUgZmlsZSBleHRlbnNpb24gd2l0aCBhbm90aGVyIGluIHRoZSBnaXZlbiBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBUaGUgcGF0aCBuYW1lLgotCSAqIEBwYXJhbSBvbGRGaWxlRXh0Ci0JICogICAgICAgICAgICBUaGUgb2xkIGZpbGUgZXh0ZW5zaW9uLgotCSAqIEBwYXJhbSBuZXdGaWxlRXh0Ci0JICogICAgICAgICAgICBUaGUgbmV3IGZpbGUgZXh0ZW5zaW9uLgotCSAqIEByZXR1cm4gVGhlIG5ldyBwYXRoIHdpdGggdGhlIG5ldyBmaWxlIGV4dGVuc2lvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlRXh0ZW5zaW9uKFN0cmluZyBwYXRoLCBTdHJpbmcgb2xkRXh0LAotCQkJU3RyaW5nIG5ld0V4dCkgewotCQlpbnQgaW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKG9sZEV4dCk7Ci0JCXJldHVybiBwYXRoLnN1YnN0cmluZygwLCBpbmRleCkgKyBuZXdFeHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIHBhdGggb2YgYSBiYXNlIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBiYXNlIHBhdGggbmFtZS4KLQkgKiBAcGFyYW0gbG9jYWxlU3RyCi0JICogICAgICAgICAgICBUaGUgbG9jYWxlIHN0cmluZy4KLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2NhbGVQYXRoKFN0cmluZyBwYXRoLCBTdHJpbmcgbG9jYWxlU3RyKSB7Ci0JCWlmIChTdHJVdGlsLmlzQmxhbmsobG9jYWxlU3RyKSkgewotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KLQkJU3RyaW5nIGZpbGVOYW1lID0gZ2V0RmlsZU5hbWUocGF0aCk7Ci0JCXJldHVybiByZXBsYWNlRmlsZU5hbWUocGF0aCwgZmlsZU5hbWUsIGxvY2FsZVN0ciArICIvIiArIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBwYXRoIG9mIGEgYmFzZSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBUaGUgYmFzZSBwYXRoIG5hbWUuCi0JICogQHBhcmFtIGxvY2FsZQotCSAqICAgICAgICAgICAgVGhlIGxvY2FsZSBvYmplY3QuCi0JICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIHBhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYWxlUGF0aChTdHJpbmcgcGF0aCwgTG9jYWxlIGxvY2FsZSkgewotCQlyZXR1cm4gbG9jYWxlID09IG51bGwgPyBwYXRoIDogZ2V0TG9jYWxlUGF0aChwYXRoLCBsb2NhbGUudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBnaXZlbiB0ZXh0IHRvIGEgdGV4dCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBmaWxlIG5hbWUuCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IHRvIHdyaXRlLgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gdGV4dCBpcyB3cml0dGVuIHN1Y2Nlc3NmdWxseSB0byBmaWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB3cml0ZUZpbGUoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgdGV4dCkgewotCQlGaWxlV3JpdGVyIHdyaXRlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIgPSBuZXcgRmlsZVdyaXRlcihmaWxlbmFtZSk7Ci0JCQl3cml0ZXIud3JpdGUodGV4dCk7Ci0JCQl3cml0ZXIuZmx1c2goKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9IGZpbmFsbHkgewotCQkJaWYgKHdyaXRlciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSB0aGUgZ2l2ZW4gdGV4dCB0byBhIGZpbGUgd2l0aCBVVEYtOCBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgZmlsZSBuYW1lLgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCB0byB3cml0ZS4KLQkgKiBAcGFyYW0gYXBwZW5kIHR1cmUgdG8gYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGZhbHNlIHRvIG92ZXJyaWRlIHRoZSBmaWxlCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiB0ZXh0IGlzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5IHRvIGZpbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHdyaXRlVVRGOEZpbGUoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gd3JpdGVVVEY4RmlsZShmaWxlbmFtZSwgdGV4dCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFdyaXRlIHRoZSBnaXZlbiB0ZXh0IHRvIGEgZmlsZSB3aXRoIFVURi04IGVuY29kaW5nLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBmaWxlIG5hbWUuCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IHRvIHdyaXRlLgotCSAqIEBwYXJhbSBhcHBlbmQgdHVyZSB0byBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgZmFsc2UgdG8gb3ZlcnJpZGUgdGhlIGZpbGUKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHRleHQgaXMgd3JpdHRlbiBzdWNjZXNzZnVsbHkgdG8gZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gd3JpdGVVVEY4RmlsZShTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyB0ZXh0LCBib29sZWFuIGFwcGVuZCkgewotCQlPdXRwdXRTdHJlYW1Xcml0ZXIgd3JpdGVyID0gbnVsbDsKLQkJRmlsZU91dHB1dFN0cmVhbSBmaWxlT3V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZpbGVPdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSwgYXBwZW5kKTsKLQkJCXdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZmlsZU91dCwgRU5DT0RJTkdfVVRGXzgpOwotCQkJd3JpdGVyLndyaXRlKHRleHQpOwotCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCQlmaWxlT3V0LmZsdXNoKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAod3JpdGVyICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQl3cml0ZXIuY2xvc2UoKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZmlsZU91dCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZmlsZU91dC5jbG9zZSgpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogV3JpdGUgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIFVSSSB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBUaGUgc291cmNlIFVSSS4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVGaWxlKFN0cmluZyB1cmksIE91dHB1dFN0cmVhbSBvdXRwdXQpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAodXJpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlucHV0ID0gTmV0VXRpbC5nZXRJbnB1dFN0cmVhbSh1cmkpOwotCQkJaW50IGJ5dGVzUmVhZDsKLQkJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs0MDk2XTsKLQkJCXdoaWxlICgoYnl0ZXNSZWFkID0gaW5wdXQucmVhZChidWYsIDAsIDQwOTYpKSA+IDApIHsKLQkJCQlvdXRwdXQud3JpdGUoYnVmLCAwLCBieXRlc1JlYWQpOwotCQkJfQotCQkJb3V0cHV0LmZsdXNoKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gVVJJIHRvIHRoZSBnaXZlbiBQcmludFdyaXRlci4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBUaGUgc291cmNlIFVSSS4KLQkgKiBAcGFyYW0gd3JpdGVyCi0JICogICAgICAgICAgICBUaGUgUHJpbnRXcml0ZXIgb2JlamN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUZpbGUoU3RyaW5nIHVyaSwgUHJpbnRXcml0ZXIgcHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICh1cmkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSW5wdXRTdHJlYW1SZWFkZXIgaW5wdXQgPSBudWxsOwotCQl0cnkgewotCQkJaW5wdXQgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoTmV0VXRpbC5nZXRJbnB1dFN0cmVhbSh1cmkpKTsKLQkJCWludCBjaGFyc1JlYWQ7Ci0JCQljaGFyW10gYnVmID0gbmV3IGNoYXJbNDA5Nl07Ci0JCQl3aGlsZSAoKGNoYXJzUmVhZCA9IGlucHV0LnJlYWQoYnVmLCAwLCA0MDk2KSkgPiAwKSB7Ci0JCQkJcHcud3JpdGUoYnVmLCAwLCBjaGFyc1JlYWQpOwotCQkJfQotCQkJcHcuZmx1c2goKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW5wdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBhbGwgc3ViLWRpcmVjdG9yaWVzIGFuZCBmaWxlcyBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgotCSAqIERvZXMgbm90IGRlbGV0ZSB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiAgICAgICAgICAgIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgc3ViLWRpcmVjdG9yaWVzIGFuZCBmaWxlcy4KLQkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBkZWxldGUgc3VjY2Vzc2Z1bAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWxldGVBbGxGaWxlcyhTdHJpbmcgZGlyKSB7Ci0JCWJvb2xlYW4gcmV0ID0gdHJ1ZTsKLQkJRmlsZSB0YXJnZXREaXIgPSBuZXcgRmlsZShkaXIpOwotCQlGaWxlW10gZmlsZXMgPSB0YXJnZXREaXIubGlzdEZpbGVzKCk7Ci0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJcmV0ID0gcmV0ICYmIGRlbGV0ZUFsbEZpbGVzKGZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQl9Ci0JCQkJcmV0ID0gcmV0ICYmIGZpbGVzW2ldLmRlbGV0ZSgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHNvdXJjZSBmaWxlIHRvIHRoZSB0YXJnZXQgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3JjRmlsZQotCSAqICAgICAgICAgICAgVGhlIHNvdXJjZSBmaWxlIG9yIHBhdGguCi0JICogQHBhcmFtIHRndEZpbGUKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgZmlsZSBvciBwYXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RmlsZShGaWxlIHNyY0ZpbGUsIEZpbGUgdGd0RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHNyY0ZpbGUuZXF1YWxzKHRndEZpbGUpKQotCQkJcmV0dXJuOwotCi0JCWlmICghc3JjRmlsZS5leGlzdHMoKSB8fCAhc3JjRmlsZS5jYW5SZWFkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICh0Z3RGaWxlLmV4aXN0cygpICYmICF0Z3RGaWxlLmNhbldyaXRlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICghc3JjRmlsZS5pc0ZpbGUoKSkgewotCQkJRmlsZVtdIGZpbGVzID0gc3JjRmlsZS5saXN0RmlsZXMoKTsKLQkJCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQljb3B5RmlsZShmaWxlc1tpXSwgdGd0RmlsZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuOwotCQl9CQotCi0JCUZpbGVJbnB1dFN0cmVhbSBzcmMgPSBudWxsOwotCQlGaWxlT3V0cHV0U3RyZWFtIHRndCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzcmMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyY0ZpbGUpOwotCQkJaWYgKHRndEZpbGUuaXNGaWxlKCkpIHsKLQkJCQl0Z3QgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0Z3RGaWxlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIHNyY1BhdGggPSBzcmNGaWxlLnRvVVJMKCkudG9TdHJpbmcoKTsKLQkJCQlpbnQgaW5kZXggPSBzcmNQYXRoLmxhc3RJbmRleE9mKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgc3JjRmlsZU5hbWUgPSBzcmNQYXRoLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJCVN0cmluZyBzcmNDYW5vbmljYWxQYXRoID0gc3JjRmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCQkJU3RyaW5nIHRndENhbm9uaWNhbFBhdGggPSBuZXcgRmlsZSh0Z3RGaWxlLCBzcmNGaWxlTmFtZSkuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJCWlmIChzcmNDYW5vbmljYWxQYXRoLmVxdWFscyh0Z3RDYW5vbmljYWxQYXRoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXRndCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ldyBGaWxlKHRndEZpbGUsIHNyY0ZpbGVOYW1lKSk7Ci0JCQl9Ci0JCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNDA5Nl07Ci0JCQlpbnQgYnl0ZXNfcmVhZDsKLQkJCXdoaWxlICgoYnl0ZXNfcmVhZCA9IHNyYy5yZWFkKGJ1ZmZlcikpICE9IC0xKSB7Ci0JCQkJdGd0LndyaXRlKGJ1ZmZlciwgMCwgYnl0ZXNfcmVhZCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc3JjICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlzcmMuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCWlmICh0Z3QgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXRndC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQkJdGd0RmlsZS5zZXRMYXN0TW9kaWZpZWQoc3JjRmlsZS5sYXN0TW9kaWZpZWQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHNvdXJjZSBmaWxlIHRvIHRoZSB0YXJnZXQgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3JjRmlsZU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBzb3VyY2UgZmlsZSBuYW1lLgotCSAqIEBwYXJhbSB0Z3RGaWxlTmFtZQotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBmaWxlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlGaWxlKFN0cmluZyBzcmNGaWxlTmFtZSwgU3RyaW5nIHRndEZpbGVOYW1lKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJY29weUZpbGUobmV3IEZpbGUoc3JjRmlsZU5hbWUpLCBuZXcgRmlsZSh0Z3RGaWxlTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIENvcGllcyB0aGUgY29udGVudCBvZiBhIGRpcmVjdG9yeSB0byBhbm90aGVyIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gc3JjRGlyTmFtZQotCSAqICAgICAgICAgICAgVGhlIHNvdXJjZSBkaXJlY3RvcnkgbmFtZS4KLQkgKiBAcGFyYW0gdGd0RGlyTmFtZQotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBkaXJlY3RvcnkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weURpcihTdHJpbmcgc3JjRGlyTmFtZSwgU3RyaW5nIHRndERpck5hbWUpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQljb3B5RmlsZShuZXcgRmlsZShzcmNEaXJOYW1lKSwgbmV3IEZpbGUodGd0RGlyTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBvbmUgZmlsZSB0byBhbm90aGVyIC0gb3BlcmF0ZXMgT05MWSBvbiBmaWxlcywgbm90IG9uIGRpcmVjdG9yaWVzLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gZGVzdAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weWZpbGUoRmlsZSBzb3VyY2UsIEZpbGUgZGVzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHNvdXJjZS5lcXVhbHMoZGVzdCkpCi0JCQlyZXR1cm47Ci0KLQkJRmlsZUlucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJRmlsZU91dHB1dFN0cmVhbSBvdXRwdXQgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc291cmNlKTsKLQkJCUZpbGVDaGFubmVsIGluID0gaW5wdXQuZ2V0Q2hhbm5lbCgpOwotCQkJaWYgKCFkZXN0LmV4aXN0cygpKSB7Ci0JCQkJZGVzdC5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQl9Ci0JCQlvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0KTsKLQkJCUZpbGVDaGFubmVsIG91dCA9IG91dHB1dC5nZXRDaGFubmVsKCk7Ci0JCQlvdXQudHJhbnNmZXJGcm9tKGluLCAwLCBzb3VyY2UubGVuZ3RoKCkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAob3V0cHV0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlvdXRwdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlkaXJlY3RvcnkoRmlsZSBzb3VyY2VEaXIsIEZpbGUgZGVzdERpcikKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICghc291cmNlRGlyLmV4aXN0cygpIHx8ICFkZXN0RGlyLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoIXNvdXJjZURpci5pc0RpcmVjdG9yeSgpIHx8ICFkZXN0RGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUZpbGVbXSBmaWxlcyA9IHNvdXJjZURpci5saXN0RmlsZXMoKTsKLQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBjYWxjIGRlc3RpbmF0aW9uIG5hbWUKLQkJCQlTdHJpbmcgZGVzdE5hbWUgPSBkZXN0RGlyCi0JCQkJCQkrIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkrIGZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpLnN1YnN0cmluZygKLQkJCQkJCQkJc291cmNlRGlyLmdldEFic29sdXRlUGF0aCgpLmxlbmd0aCgpICsgMSk7Ci0JCQkJaWYgKGZpbGVzW2ldLmlzRmlsZSgpKSB7Ci0JCQkJCS8vIGNvcHkgdGhlIGZpbGUKLQkJCQkJY29weWZpbGUoZmlsZXNbaV0sIG5ldyBGaWxlKGRlc3ROYW1lKSk7Ci0JCQkJfSBlbHNlIGlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCS8vIGNvcHkgZGlyZWN0b3J5IHJlY3Vyc2l2ZWx5Ci0JCQkJCUZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZShkZXN0TmFtZSk7Ci0JCQkJCWRlc3RGaWxlLm1rZGlycygpOwotCQkJCQljb3B5ZGlyZWN0b3J5KGZpbGVzW2ldLCBkZXN0RmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvLyBmb3Igc29tZSByZWFzb24sIHRoaXMgZ3V5IGxvY2tzIHRoZSBmaWxlLCBpZiB5b3UgdHJ5IHRvIHVwZGF0ZSB0aGUgZmlsZSwKLQkvLyBnb3QgdGhlIGZvbGxvd2luZyBleGNlcHRpb24KLQkvLyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjoKLQkvLyAoVGhlIHJlcXVlc3RlZCBvcGVyYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCBvbiBhIGZpbGUgd2l0aCBhIHVzZXItbWFwcGVkCi0JLy8gc2VjdGlvbiBvcGVuKQotCS8vIG5lZWQgdG8gaGFuZGxlIGxhdGVyCi0JcHVibGljIHN0YXRpYyBDaGFyQnVmZmVyIHJlYWRGaWxlKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZUlucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJQ2hhckJ1ZmZlciBjaGFyQnVmZmVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJCUZpbGVDaGFubmVsIGluQ2hhbm5lbCA9IGlucHV0LmdldENoYW5uZWwoKTsKLQkJCWludCBsZW5ndGggPSAoaW50KSBpbkNoYW5uZWwuc2l6ZSgpOwotCQkJTWFwcGVkQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gaW5DaGFubmVsLm1hcCgKLQkJCQkJRmlsZUNoYW5uZWwuTWFwTW9kZS5SRUFEX09OTFksIDAsIGxlbmd0aCk7Ci0JCQlDaGFyc2V0IGNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoRU5DT0RJTkdfSVNPXzg4NTlfMSk7Ci0JCQlDaGFyc2V0RGVjb2RlciBkZWNvZGVyID0gY2hhcnNldC5uZXdEZWNvZGVyKCk7Ci0JCQljaGFyQnVmZmVyID0gZGVjb2Rlci5kZWNvZGUoYnl0ZUJ1ZmZlcik7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hhckJ1ZmZlcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciByZWFkRmlsZShGaWxlIGZpbGUsIFN0cmluZyBlbmNvZGluZykKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7Ci0JCUlucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbMTAyNF07Ci0JCQlmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQkJcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGZpcywgZW5jb2RpbmcpOwotCQkJaW50IHNpemU7Ci0JCQl3aGlsZSAoKHNpemUgPSByZWFkZXIucmVhZChidWZmZXIsIDAsIDEwMjQpKSA+IDApIHsKLQkJCQlyZXN1bHQuYXBwZW5kKGJ1ZmZlciwgMCwgc2l6ZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZmlzICE9IG51bGwpIHsKLQkJCQlmaXMuY2xvc2UoKTsKLQkJCX0KLQotCQkJaWYgKHJlYWRlciAhPSBudWxsKSB7Ci0JCQkJcmVhZGVyLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFVzZXMgSmF2YSAxLjQncyBGaWxlTG9jayBjbGFzcyB0byB0ZXN0IGZvciBhIGZpbGUgbG9jawotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZpbGVMb2NrZWQoRmlsZSBmaWxlKSB7Ci0JCWJvb2xlYW4gaXNMb2NrZWQgPSBmYWxzZTsKLQkJRmlsZU91dHB1dFN0cmVhbSBpbnB1dCA9IG51bGw7Ci0JCUZpbGVMb2NrIGxvY2sgPSBudWxsOwotCi0JCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXRyeSB7Ci0JCQlpbnB1dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQkJRmlsZUNoYW5uZWwgZmlsZUNoYW5uZWwgPSBpbnB1dC5nZXRDaGFubmVsKCk7Ci0KLQkJCWxvY2sgPSBmaWxlQ2hhbm5lbC50cnlMb2NrKCk7Ci0KLQkJCWlmIChsb2NrID09IG51bGwpCi0JCQkJaXNMb2NrZWQgPSB0cnVlOwotCQkJZWxzZQotCQkJCWxvY2sucmVsZWFzZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBTZWN1cml0eUV4Y2VwdGlvbikKLQkJCQkvLyBDYW4ndCB3cml0ZSB0byBmaWxlLgotCQkJCWlzTG9ja2VkID0gdHJ1ZTsKLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBGaWxlTm90Rm91bmRFeGNlcHRpb24pCi0JCQkJaXNMb2NrZWQgPSBmYWxzZTsKLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikKLQkJCQlpc0xvY2tlZCA9IHRydWU7Ci0JCQkvLyBPdmVybGFwcGluZ0ZpbGVMb2NrRXhjZXB0aW9uIG1lYW5zIHRoYXQgdGhpcyBKVk0gaGFzIGl0IGxvY2tlZAotCQkJLy8gdGhlcmVmb3JlIGl0IGlzIG5vdCBsb2NrZWQgdG8gdXMKLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBPdmVybGFwcGluZ0ZpbGVMb2NrRXhjZXB0aW9uKQotCQkJCWlzTG9ja2VkID0gZmFsc2U7Ci0JCQkvLyBDb3VsZCBub3QgZ2V0IGEgbG9jayBmb3Igc29tZSBvdGhlciByZWFzb24uCi0JCQllbHNlCi0JCQkJaXNMb2NrZWQgPSB0cnVlOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNMb2NrZWQ7Ci0JfQotCi0JLyoqCi0JICogTG9ja3MgYSBmaWxlIGZvciB0aGUgY3VycmVudCBKVk0uIFdpbGwgY3JlYXRlIHRoZSBmaWxlIGlmIGl0IGRvZXMgbm90Ci0JICogZXhpc3QKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4gYSBGaWxlTG9jayBvYmplY3QsIG9yIG51bGwgaWYgZmlsZSBjb3VsZCBub3QgYmUgbG9ja2VkCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlTG9jayBsb2NrRmlsZShGaWxlIGZpbGUpIHsKLQkJRmlsZU91dHB1dFN0cmVhbSBpbnB1dCA9IG51bGw7Ci0JCUZpbGVMb2NrIGxvY2sgPSBudWxsOwotCQl0cnkgewotCQkJaW5wdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLQkJCUZpbGVDaGFubmVsIGZpbGVDaGFubmVsID0gaW5wdXQuZ2V0Q2hhbm5lbCgpOwotCQkJbG9jayA9IGZpbGVDaGFubmVsLnRyeUxvY2soKTsKLQotCQkJaWYgKGxvY2suaXNWYWxpZCgpKQotCQkJCXJldHVybiBsb2NrOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gQ291bGQgbm90IGdldCBhIGxvY2sgZm9yIHNvbWUgcmVhc29uLgotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpbnB1dCAhPSBudWxsICYmIChsb2NrID09IG51bGwgfHwgIWxvY2suaXNWYWxpZCgpKSkgewotCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldCBhbGwgZmlsZXMgaW4gdGhlIHNwZWNpZmllZCBwYXRoCi0JICogQHBhcmFtIHBhdGgsIGFic29sdXRlIHBhdGggb2YgYSBmb2xkZXIKLQkgKiBAcGFyYW0gZmlsZUxpc3QgTGlzdCB0aGUgbGlzdCB0byBjb2xsZWN0IHRoZSBGaWxlcwotCSAqIEBwYXJhbSByZWN1cnNpdmUgYm9vbGVhbiwgaWYgdHJ1ZSBmaW5kIHRoZSBmaWxlcyBpbiBzdWIgZm9sZGVycyBhcyB3ZWxsCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldEFsbEZpbGVzKEZpbGUgcGF0aCwgTGlzdCBmaWxlTGlzdCwgYm9vbGVhbiByZWN1cnNpdmUpCi0JewotCQkvLyBnZXQgYWxsIGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgZm9sZGVyCi0JCWlmIChwYXRoLmlzRGlyZWN0b3J5KCkpIAotCQl7CQkKLQkJCUZpbGVbXSBmaWxlcyA9IHBhdGgubGlzdEZpbGVzKCk7Ci0JCQlpZiAoZmlsZXMgIT0gbnVsbCkgCi0JCQl7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgCi0JCQkJewkKLQkJCQkJaWYgKCBmaWxlc1tpXS5pc0ZpbGUoKSApCi0JCQkJCXsKLQkJCQkJCWZpbGVMaXN0LmFkZChmaWxlc1tpXSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocmVjdXJzaXZlKQotCQkJCQl7Ci0JCQkJCQlnZXRBbGxGaWxlcyhmaWxlc1tpXSwgZmlsZUxpc3QsIHJlY3Vyc2l2ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnaXZlbiBhIGRpcmVjdG9yeSBhbmQgZXh0ZW5zaW9uLCByZXR1cm5zIGFsbCBmaWxlcyAocmVjdXJzaXZlbHkpIHdob3NlCi0JICogZXh0ZW5zaW9uIHN0YXJ0c1dpdGggdGhlIGdpdmVuIGV4dGVuc2lvbgotCSAqIAotCSAqIEBwYXJhbSBmCi0JICogQHBhcmFtIGV4dGVuc2lvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZmlsZUxpc3QoRmlsZSBmLCBTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JCWV4dGVuc2lvbiA9IGV4dGVuc2lvbi50b1VwcGVyQ2FzZSgpOwotCQlMaXN0IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlpZiAoZi5pc0RpcmVjdG9yeSgpKSB7IC8vIGlmIGRpciB0aGVuIHJlY3Vyc2UKLQkJCQlTdHJpbmdbXSBmbGlzdCA9IGYubGlzdCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxpc3QubGVuZ3RoOyArK2kpIHsKLQkJCQkJRmlsZSBmYyA9IG5ldyBGaWxlKGYuZ2V0UGF0aCgpLCBmbGlzdFtpXSk7Ci0JCQkJCXJldHVybkxpc3QuYWRkQWxsKGZpbGVMaXN0KGZjLCBleHRlbnNpb24pKTsKLQkJCQl9Ci0JCQl9IGVsc2UgeyAvLyBvcmRpbmFyeSBmaWxlCi0JCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gZi5nZXROYW1lKCkudG9VcHBlckNhc2UoKTsKLQkJCQkJaWYgKG5hbWUubGFzdEluZGV4T2YoIi4iKSAhPSAtMSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKG5hbWUKLQkJCQkJCQkJLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKS5zdGFydHNXaXRoKGV4dGVuc2lvbikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXJldHVybkxpc3QuYWRkKGYpOwotCQkJCQkJfQotCQkJCX0gZWxzZQotCQkJCQlyZXR1cm5MaXN0LmFkZChmKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gcmV0dXJuTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBnaXZlbiBhIGRpcmVjdG9yeSBhbmQgZXh0ZW5zaW9uLCByZXR1cm5zIGFsbCBmaWxlcyAocmVjdXJzaXZlbHkpd2hvc2UKLQkgKiBleHRlbnNpb24gZG9lcyBub3Qgc3RhcnRzV2l0aCB0aGUgZ2l2ZW4gZXh0ZW5zaW9uCi0JICogCi0JICogQHBhcmFtIGYKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBmaWxlTGlzdEV4Y2x1ZGVFeHQoRmlsZSBmLCBTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JCUxpc3QgcmV0dXJuTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCWlmIChmLmlzRGlyZWN0b3J5KCkpIHsgLy8gaWYgZGlyIHRoZW4gcmVjdXJzZQotCQkJCVN0cmluZ1tdIGZsaXN0ID0gZi5saXN0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGlzdC5sZW5ndGg7ICsraSkgewotCQkJCQlGaWxlIGZjID0gbmV3IEZpbGUoZi5nZXRQYXRoKCksIGZsaXN0W2ldKTsKLQkJCQkJcmV0dXJuTGlzdC5hZGRBbGwoZmlsZUxpc3RFeGNsdWRlRXh0KGZjLCBleHRlbnNpb24pKTsKLQkJCQl9Ci0JCQl9IGVsc2UgeyAvLyBvcmRpbmFyeSBmaWxlCi0JCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gZi5nZXROYW1lKCk7Ci0JCQkJCWlmIChuYW1lLmxhc3RJbmRleE9mKCIuIikgIT0gLTEpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmICghKG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpLnN0YXJ0c1dpdGgoZXh0ZW5zaW9uKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXJldHVybkxpc3QuYWRkKGYpOwotCQkJCQkJfQotCQkJCX0gZWxzZQotCQkJCQlyZXR1cm5MaXN0LmFkZChmKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gcmV0dXJuTGlzdDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGFsbCBmaWxlIHBhdGhzIGluIHRoZSBzcGVjaWZpZWQgcGF0aAotCSAqIEBwYXJhbSBwYXRoLCBhYnNvbHV0ZSBwYXRoIG9mIGEgZm9sZGVyCi0JICogQHBhcmFtIHJlY3Vyc2l2ZSBib29sZWFuLCBpZiB0cnVlIGZpbmQgdGhlIGZpbGVzIGluIHN1YiBmb2xkZXJzIGFzIHdlbGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFycmF5TGlzdCBnZXRBbGxGaWxlQWJzb2x1dGVQYXRocyhGaWxlIHBhdGgsIGJvb2xlYW4gcmVjdXJzaXZlKSB7CQotCQlBcnJheUxpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldEFsbEZpbGVzKHBhdGgsIGZpbGVzLCByZWN1cnNpdmUpOwotCQlBcnJheUxpc3QgcGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGk9MDsgaTxmaWxlcy5zaXplKCk7IGkrKykgewotCQkJU3RyaW5nIGFic1BhdGggPSAoKEZpbGUpIGZpbGVzLmdldChpKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQlwYXRocy5hZGQoYWJzUGF0aCk7Ci0JCX0KLQkJcmV0dXJuIHBhdGhzOwotCX0KLQkKLQkvKioKLQkgKiBNb3ZlcyBhIGZpbGUKLQkgKiAKLQkgKiBBdHRlbXB0cyB0byByZW5hbWUgdGhlIGZpbGUgZmlyc3QuICBJZiB0aGF0IGZhaWxzLAotCSAqIHdpbGwgY29weSB0aGUgc291cmNlRmlsZSB0byBkZXN0RmlsZSBhbmQgZGVsZXRlIHRoZSBzb3VyY2VGaWxlLgotCSAqIEBwYXJhbSBzb3VyY2VGaWxlCi0JICogQHBhcmFtIGRlc3RGaWxlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtb3ZlRmlsZShGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdEZpbGUpIHsKLQkJdHJ5IHsKLQkJCS8vIGZpcnN0IHRyeSB0aGUgcmVuYW1lVG8gbWV0aG9kCi0JCQlpZiAoc291cmNlRmlsZS5yZW5hbWVUbyhkZXN0RmlsZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHRyeSB0byBjb3B5IGZpbGUsIGRlbGV0ZSBvcmlnaW5hbAotCQkJCWNvcHlmaWxlKHNvdXJjZUZpbGUsIGRlc3RGaWxlKTsKLQkJCQlzb3VyY2VGaWxlLmRlbGV0ZSgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gdCkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcih0KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvSTE4blV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9JMThuVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYWY2NmI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9JMThuVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBIZWxwZXIgdXRpbHRpaWVzIGZvciBoYW5kbGluZyBpbnRlcm5hdGlvbmFsaXphdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJMThuVXRpbCB7Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4gQWxsCi0JICogbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHNob3VsZCBiZSBzdGF0aWMuCi0JICovCi0JcHJpdmF0ZSBJMThuVXRpbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGUKLQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2UgYnVuZGxlLgotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2Uga2V5LgotCSAqIEByZXR1cm4gQSBsb2NhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSwgU3RyaW5nIGtleSkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiAnWycgKyBrZXkgKyAnXSc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBrZXkgYW5kIGZvcm1hdHRlZAotCSAqIHdpdGggYSBnaXZlbiBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlQnVuZGxlCi0JICogICAgICAgICAgICBBIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgQW4gb2JqZWN0LgotCSAqIEByZXR1cm4gQSBmb3JtYXR0ZWQgbG9jYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXRTdHJpbmcoUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUsCi0JCQlTdHJpbmcga2V5LCBPYmplY3QgZGF0YSkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbG9jYWxpemVkU3RyID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQKLQkJCQkJCS5mb3JtYXQobG9jYWxpemVkU3RyLCBuZXcgT2JqZWN0W10geyBkYXRhIH0pOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gJ1snICsga2V5ICsgJ10nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2Uga2V5IGFuZCBmb3JtYXR0ZWQKLQkgKiB3aXRoIHR3byBnaXZlbiBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlQnVuZGxlCi0JICogICAgICAgICAgICBBIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YTEKLQkgKiAgICAgICAgICAgIEFuIG9iamVjdC4KLQkgKiBAcGFyYW0gZGF0YTIKLQkgKiAgICAgICAgICAgIEFuIG9iamVjdC4KLQkgKiBAcmV0dXJuIEEgZm9ybWF0dGVkIGxvY2FsaXplZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0U3RyaW5nKFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLAotCQkJU3RyaW5nIGtleSwgT2JqZWN0IGRhdGExLCBPYmplY3QgZGF0YTIpIHsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGxvY2FsaXplZFN0ciA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChsb2NhbGl6ZWRTdHIsIG5ldyBPYmplY3RbXSB7IGRhdGExLAotCQkJCQkJZGF0YTIgfSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiAnWycgKyBrZXkgKyAnXSc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBrZXkgYW5kIGZvcm1hdHRlZAotCSAqIHdpdGggYSBnaXZlbiBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlQnVuZGxlCi0JICogICAgICAgICAgICBBIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgQW4gYXJyYXkgb2Ygb2JqZWN0cy4KLQkgKiBAcmV0dXJuIEEgZm9ybWF0dGVkIGxvY2FsaXplZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0U3RyaW5nKFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLAotCQkJU3RyaW5nIGtleSwgT2JqZWN0W10gZGF0YSkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbG9jYWxpemVkU3RyID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGxvY2FsaXplZFN0ciwgZGF0YSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiAnWycgKyBrZXkgKyAnXSc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIGludGVnZXIgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2Uga2V5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBidW5kbGUuCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZQotCSAqICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSByZXNvdXJjZSBrZXkgY2Fubm90IGJlCi0JICogICAgICAgICAgICBsb2NhdGVkLgotCSAqIEByZXR1cm4gQSBsb2NhbGl6ZWQgaW50ZXJnZXIgdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50KFN0cmluZyBpbnRTdHJpbmcsCi0JCQlpbnQgZGVmYXVsdFZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoaW50U3RyaW5nICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChpbnRTdHJpbmcpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHZlcnNpb24gb2YgYSBVUyBFbmdsaXNoIHJlc291cmNlIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgcmVzb3VyY2UgZmlsZS4KLQkgKiBAcGFyYW0gbG9jYWxlCi0JICogICAgICAgICAgICBBIGxvY2FsZS4KLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGl6ZWQgcmVzb3VyY2UgZmlsZS4gSWYgbm9uZSBleGlzdHMsIHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2FsaXplZEZpbGUoU3RyaW5nIHBhdGgsIExvY2FsZSBsb2NhbGUpIHsKLQkJaWYgKGxvY2FsZS5lcXVhbHMoTG9jYWxlLlVTKSB8fCBwYXRoID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gQnVpbGQgdGhlIGxvY2FsZSBzdHJpbmcgYXJyYXkuIFRoaXMgaXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlCi0JCS8vIGxvY2FsaXplZCBmaWxlIG5hbWVzLgotCQlTdHJpbmcgbGFuZ3VhZ2UgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKLQkJU3RyaW5nIGNvdW50cnkgPSBsb2NhbGUuZ2V0Q291bnRyeSgpOwotCQlTdHJpbmcgdmFyaWFudCA9IGxvY2FsZS5nZXRWYXJpYW50KCk7Ci0KLQkJU3RyaW5nW10gbG9jYWxlU3RycyA9IG5ldyBTdHJpbmdbM107Ci0JCWlmICh2YXJpYW50ICE9IG51bGwgJiYgdmFyaWFudC5sZW5ndGgoKSA+IDApIHsKLQkJCWxvY2FsZVN0cnNbMF0gPSBsb2NhbGUudG9TdHJpbmcoKTsKLQkJfQotCQlpZiAoY291bnRyeSAhPSBudWxsICYmIGNvdW50cnkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlsb2NhbGVTdHJzWzFdID0gbGFuZ3VhZ2UgKyAiXyIgKyBjb3VudHJ5OyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxhbmd1YWdlICE9IG51bGwpIHsKLQkJCWxvY2FsZVN0cnNbMl0gPSBsYW5ndWFnZTsKLQkJfQotCi0JCVN0cmluZyBkaXIgPSBwYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJU3RyaW5nIGZpbGVOYW1lOwotCi0JCWludCBwYXRoSW5kZXggPSBkaXIubGFzdEluZGV4T2YoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocGF0aEluZGV4ID4gMCkgewotCQkJZGlyID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aEluZGV4ICsgMSk7Ci0JCQlmaWxlTmFtZSA9IHBhdGguc3Vic3RyaW5nKHBhdGhJbmRleCArIDEpOwotCQl9IGVsc2UgewotCQkJZmlsZU5hbWUgPSBkaXI7Ci0JCQlkaXIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJU3RyaW5nIGZpbGVFeHQgPSAiIjsgLy8kTk9OLU5MUy0xJAkJCi0JCWludCBleHRJbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGV4dEluZGV4ID4gMCkgewotCQkJZmlsZUV4dCA9IGZpbGVOYW1lLnN1YnN0cmluZyhleHRJbmRleCk7Ci0JCQlmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBleHRJbmRleCk7Ci0JCX0KLQotCQlmaWxlTmFtZSA9IGRpciArIGZpbGVOYW1lICsgIl8iOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gTG9vayBmb3IgdGhlIGxvY2FsaXplZCBmaWxlLgotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJaWYgKGxvY2FsZVN0cnNbaV0gIT0gbnVsbCkgewotCQkJCS8vIEdldHMgdGhlIGxvY2FsaXplZCBwYXRoIG5hbWUuCi0JCQkJU3RyaW5nIGZuYW1lID0gZmlsZU5hbWUgKyBsb2NhbGVTdHJzW2ldICsgZmlsZUV4dDsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmbmFtZSk7Ci0JCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJcmV0dXJuIGZuYW1lOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9JbWFnZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9JbWFnZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjg4ZTVlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvSW1hZ2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5Gb250OwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7Ci1pbXBvcnQgamF2YS5hd3QuSW1hZ2U7Ci1pbXBvcnQgamF2YS5hd3QuTWVkaWFUcmFja2VyOwotaW1wb3J0IGphdmEuYXd0LmZvbnQuRm9udFJlbmRlckNvbnRleHQ7Ci1pbXBvcnQgamF2YS5hd3QuZm9udC5MaW5lQnJlYWtNZWFzdXJlcjsKLWltcG9ydCBqYXZhLmF3dC5mb250LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YS5hd3QuZm9udC5UZXh0TGF5b3V0OwotaW1wb3J0IGphdmEuYXd0Lmdlb20uUG9pbnQyRDsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOwotaW1wb3J0IGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3I7Ci1pbXBvcnQgamF2YS50ZXh0LkF0dHJpYnV0ZWRTdHJpbmc7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBtYW5hZ2luZyBpbWFnZSBmaWxlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbWFnZVV0aWwgewotCi0JLy8gVGhlIGRlZmF1bHQgbWF4aW11bSBsaW5lcyBvZiB3cmFwcGVkIHRleHQuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9XUkFQX0xJTkUgPSAzOwotCi0JLy8gVGhlIEJ1ZmZlcmVkSW1hZ2UgY2FjaGUuCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCBpbWFnZUNhY2hlID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLiBBbGwKLQkgKiBtZXRob2RzIGluIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHN0YXRpYy4KLQkgKi8KLQlwcml2YXRlIEltYWdlVXRpbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgPGNvZGU+QnVmZmVyZWRJbWFnZTwvY29kZT4gZnJvbSB0aGUgZ2l2ZW4gaW1hZ2UgZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJ1ZmZlcmVkSW1hZ2UgZ2V0QnVmZmVyZWRJbWFnZShTdHJpbmcgaW1hZ2VGaWxlLCBDb21wb25lbnQgYykgewotCQlpZiAoaW1hZ2VGaWxlID09IG51bGwgfHwgYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUJ1ZmZlcmVkSW1hZ2UgYnVmZmVyZWRJbWFnZSA9IChCdWZmZXJlZEltYWdlKSBpbWFnZUNhY2hlLmdldChpbWFnZUZpbGUpOwotCQlpZiAoYnVmZmVyZWRJbWFnZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYnVmZmVyZWRJbWFnZTsKLQkJfQotCi0JCUltYWdlIGltYWdlID0gYy5nZXRUb29sa2l0KCkuZ2V0SW1hZ2UoaW1hZ2VGaWxlKTsKLQkJTWVkaWFUcmFja2VyIHRyYWNrZXIgPSBuZXcgTWVkaWFUcmFja2VyKGMpOwotCQl0cmFja2VyLmFkZEltYWdlKGltYWdlLCAwKTsKLQkJdHJ5IHsKLQkJCXRyYWNrZXIud2FpdEZvckFsbCgpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlidWZmZXJlZEltYWdlID0gbmV3IEJ1ZmZlcmVkSW1hZ2UoaW1hZ2UuZ2V0V2lkdGgoYyksCi0JCQkJaW1hZ2UuZ2V0SGVpZ2h0KGMpLCBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpOwotCi0JCUdyYXBoaWNzMkQgZzJkID0gYnVmZmVyZWRJbWFnZS5jcmVhdGVHcmFwaGljcygpOwotCQlnMmQuZHJhd0ltYWdlKGltYWdlLCAwLCAwLCBjKTsKLQkJaW1hZ2VDYWNoZS5wdXQoaW1hZ2VGaWxlLCBidWZmZXJlZEltYWdlKTsKLQotCQlyZXR1cm4gYnVmZmVyZWRJbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGltYWdlIGlzIGxvYWRlZCBzdWNjZXNzZnVsbHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHdhaXRGb3JJbWFnZShJbWFnZSBpbWFnZSwgQ29tcG9uZW50IGMpIHsKLQkJTWVkaWFUcmFja2VyIHRyYWNrZXIgPSBuZXcgTWVkaWFUcmFja2VyKGMpOwotCQl0cmFja2VyLmFkZEltYWdlKGltYWdlLCAwKTsKLQkJdHJ5IHsKLQkJCXRyYWNrZXIud2FpdEZvckFsbCgpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQl9Ci0JCXJldHVybiAoIXRyYWNrZXIuaXNFcnJvckFueSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBEcmF3cyB0aGUgZ2l2ZW4gdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gZzJkCi0JICogICAgICAgICAgICBUaGUgPGNvZGU+R3JhcGhpY3MyRDwvY29kZT4gY29udGV4dC4KLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgdG8gYmUgcmVuZGVyZWQuCi0JICogQHBhcmFtIGZvbnQKLQkgKiAgICAgICAgICAgIFRoZSBmb250IHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgdGV4dC4KLQkgKiBAcGFyYW0gY29sb3IKLQkgKiAgICAgICAgICAgIFRoZSBjb2xvciB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHRleHQuCi0JICogQHBhcmFtIHgKLQkgKiAgICAgICAgICAgIFRoZSBob3Jpem9udGFsIGNvb3JkaW5hdGUgdXNlZCBmb3IgcmVuZGVyaW5nIHRoZSB0ZXh0LgotCSAqIEBwYXJhbSB5Ci0JICogICAgICAgICAgICBUaGUgdmVydGljYWxjb29yZGluYXRlIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZHJhd1RleHQoR3JhcGhpY3MyRCBnMmQsIFN0cmluZyB0ZXh0LCBGb250IGZvbnQsCi0JCQlDb2xvciBjb2xvciwgaW50IHgsIGludCB5KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZzJkLnNldENvbG9yKGNvbG9yKTsKLQkJRm9udFJlbmRlckNvbnRleHQgZnJjID0gZzJkLmdldEZvbnRSZW5kZXJDb250ZXh0KCk7Ci0JCVRleHRMYXlvdXQgdGV4dGxheW91dCA9IG5ldyBUZXh0TGF5b3V0KHRleHQsIGZvbnQsIGZyYyk7Ci0JCXRleHRsYXlvdXQuZHJhdyhnMmQsIHgsIHkpOwotCX0KLQotCS8qKgotCSAqIERyYXdzIHRoZSBnaXZlbiB0ZXh0IGFuZCB3cmFwcyBpdCBiYXNlZCBvbiB0aGUgZ2l2ZW4gd2lkdGguCi0JICogCi0JICogQHBhcmFtIGcyZAotCSAqICAgICAgICAgICAgVGhlIDxjb2RlPkdyYXBoaWNzMkQ8L2NvZGU+IGNvbnRleHQuCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IHRvIGJlIHJlbmRlcmVkLgotCSAqIEBwYXJhbSBmb250Ci0JICogICAgICAgICAgICBUaGUgZm9udCB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHRleHQuCi0JICogQHBhcmFtIGNvbG9yCi0JICogICAgICAgICAgICBUaGUgY29sb3IgdXNlZCBmb3IgcmVuZGVyaW5nIHRoZSB0ZXh0LgotCSAqIEBwYXJhbSB4Ci0JICogICAgICAgICAgICBUaGUgaG9yaXpvbnRhbCBjb29yZGluYXRlIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgdGV4dC4KLQkgKiBAcGFyYW0geQotCSAqICAgICAgICAgICAgVGhlIHZlcnRpY2FsY29vcmRpbmF0ZSB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHRleHQuCi0JICogQHBhcmFtIHdpZHRoCi0JICogICAgICAgICAgICBUaGUgbWF4aW11bSB3aWR0aCBvZiB0aGUgd3JhcHBlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkcmF3VGV4dChHcmFwaGljczJEIGcyZCwgU3RyaW5nIHRleHQsIEZvbnQgZm9udCwKLQkJCUNvbG9yIGNvbG9yLCBpbnQgeCwgaW50IHksIGZsb2F0IHdpZHRoKSB7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmxvYXQgbWF4V3JhcFdpZHRoID0gd2lkdGggLSAxMDsKLQkJZzJkLnNldENvbG9yKGNvbG9yKTsKLQkJUG9pbnQyRC5GbG9hdCBwZW4gPSBuZXcgUG9pbnQyRC5GbG9hdCh4LCB5KTsKLQkJTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlhdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLkZPTlQsIGZvbnQpOwotCQlBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IgdGV4dEl0ZXJhdG9yID0gbmV3IEF0dHJpYnV0ZWRTdHJpbmcodGV4dCwKLQkJCQlhdHRyaWJ1dGVzKS5nZXRJdGVyYXRvcigpOwotCQlGb250UmVuZGVyQ29udGV4dCBmcmMgPSBnMmQuZ2V0Rm9udFJlbmRlckNvbnRleHQoKTsKLQkJTGluZUJyZWFrTWVhc3VyZXIgbWVhc3VyZXIgPSBuZXcgTGluZUJyZWFrTWVhc3VyZXIodGV4dEl0ZXJhdG9yLCBmcmMpOwotCQlpbnQgbGluZSA9IDE7Ci0JCXdoaWxlIChsaW5lIDw9IE1BWF9XUkFQX0xJTkUpIHsKLQkJCVRleHRMYXlvdXQgbGF5b3V0ID0gbWVhc3VyZXIubmV4dExheW91dChtYXhXcmFwV2lkdGgpOwotCQkJaWYgKGxheW91dCA9PSBudWxsKQotCQkJCWJyZWFrOwotCQkJcGVuLnkgKz0gbGF5b3V0LmdldEFzY2VudCgpOwotCQkJZmxvYXQgZHggPSAwOwotCQkJaWYgKGxheW91dC5pc0xlZnRUb1JpZ2h0KCkpIHsKLQkJCQlkeCA9ICh3aWR0aCAtIGxheW91dC5nZXRBZHZhbmNlKCkpOwotCQkJfQotCQkJbGF5b3V0LmRyYXcoZzJkLCBwZW4ueCArIGR4IC8gMiwgcGVuLnkpOwotCQkJcGVuLnkgKz0gbGF5b3V0LmdldERlc2NlbnQoKSArIGxheW91dC5nZXRMZWFkaW5nKCkgLSAxOwotCQkJbGluZSsrOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvTWF0aFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9NYXRoVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYzA3NGZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9NYXRoVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBwZXJmb3JtaW5nIG1hdGggb3BlcmF0aW9ucy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1hdGhVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBjZWlsMTAwMChsb25nIGwpIHsKLQkJcmV0dXJuIChsIC0gKGwgJiA3KSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvTWVudVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9NZW51VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NWVhMTQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9NZW51VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciByZXRyaWV2aW5nIEVjbGlwc2UgbWVudXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWVudVV0aWwgewotCi0JLyoqCi0JICogU2VhcmNoZXMgYW4gYXJyYXkgb2YgbWVudSBpdGVtcyBhbmQgcmV0dXJucyB0aGUgbWVudSBpdGVtIHRoYXQgbWF0Y2hlcwotCSAqIHRoZSBnaXZlbiBtZW51IHRleHQuCi0JICogCi0JICogQHBhcmFtIG1lbnVJdGVtcwotCSAqICAgICAgICAgICAgQW4gYXJyYXkgb2YgbWVudSBpdGVtcy4KLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgdG8gbG9vayBmb3IuCi0JICogQHJldHVybiBUaGUgbWVudSBpdGVtIGlmIGZvdW5kLCA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZW51SXRlbSBnZXRNZW51SXRlbShNZW51SXRlbVtdIG1lbnVJdGVtcywgU3RyaW5nIHRleHQpIHsKLQkJaWYgKG1lbnVJdGVtcyA9PSBudWxsIHx8IHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW51SXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChtZW51SXRlbXNbaV0uZ2V0VGV4dCgpLnN0YXJ0c1dpdGgodGV4dCkpIHsKLQkJCQlyZXR1cm4gbWVudUl0ZW1zW2ldOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvTmV0VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL05ldFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzEzYmFlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvTmV0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci0KLS8qKgotICogSW1wbGVtZW50cyBhIHV0aWxpdHkgY2xhc3MgZm9yIG1hbmFnaW5nIFVSTHMgYW5kIFVSSXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTmV0VXRpbCB7Ci0KLQkvKioKLQkgKiBGSUxFIHNjaGVtZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGSUxFX1NDSEVNRSA9ICJmaWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRmlsZSBVUkkgcHJlZml4LgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZJTEVfVVJJX1BSRUZJWCA9IEZJTEVfU0NIRU1FICsgIjovIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRmlsZSBVUkkgcHJlZml4IHNpemUuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRklMRV9VUklfUFJFRklYX0xFTkdUSCA9IEZJTEVfVVJJX1BSRUZJWC5sZW5ndGgoKTsKLQotCS8qKgotCSAqIEhUVFAgc2NoZW1lLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEhUVFBfU0NIRU1FID0gImh0dHAiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBIVFRQIFVSSSBwcmVmaXguCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSFRUUF9VUklfUFJFRklYID0gSFRUUF9TQ0hFTUUgKyAiOi8vIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSFRUUCBVUkkgcHJlZml4IHNpemUuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSFRUUF9VUklfUFJFRklYX0xFTkdUSCA9IEhUVFBfVVJJX1BSRUZJWC5sZW5ndGgoKTsKLQotCS8qKgotCSAqIEEgdGFibGUgb2YgaGV4IHZhbHVlcy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBIRVhfVkFMVUVTID0gewotCQkJIiUwMCIsICIlMDEiLCAiJTAyIiwgIiUwMyIsICIlMDQiLCAiJTA1IiwgIiUwNiIsICIlMDciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlMDgiLCAiJTA5IiwgIiUwQSIsICIlMEIiLCAiJTBDIiwgIiUwRCIsICIlMEUiLCAiJTBGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTEwIiwgIiUxMSIsICIlMTIiLCAiJTEzIiwgIiUxNCIsICIlMTUiLCAiJTE2IiwgIiUxNyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiUxOCIsICIlMTkiLCAiJTFBIiwgIiUxQiIsICIlMUMiLCAiJTFEIiwgIiUxRSIsICIlMUYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlMjAiLCAiJTIxIiwgIiUyMiIsICIlMjMiLCAiJTI0IiwgIiUyNSIsICIlMjYiLCAiJTI3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTI4IiwgIiUyOSIsICIlMkEiLCAiJTJCIiwgIiUyQyIsICIlMkQiLCAiJTJFIiwgIiUyRiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiUzMCIsICIlMzEiLCAiJTMyIiwgIiUzMyIsICIlMzQiLCAiJTM1IiwgIiUzNiIsICIlMzciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlMzgiLCAiJTM5IiwgIiUzQSIsICIlM0IiLCAiJTNDIiwgIiUzRCIsICIlM0UiLCAiJTNGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTQwIiwgIiU0MSIsICIlNDIiLCAiJTQzIiwgIiU0NCIsICIlNDUiLCAiJTQ2IiwgIiU0NyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU0OCIsICIlNDkiLCAiJTRBIiwgIiU0QiIsICIlNEMiLCAiJTREIiwgIiU0RSIsICIlNEYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlNTAiLCAiJTUxIiwgIiU1MiIsICIlNTMiLCAiJTU0IiwgIiU1NSIsICIlNTYiLCAiJTU3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTU4IiwgIiU1OSIsICIlNUEiLCAiJTVCIiwgIiU1QyIsICIlNUQiLCAiJTVFIiwgIiU1RiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU2MCIsICIlNjEiLCAiJTYyIiwgIiU2MyIsICIlNjQiLCAiJTY1IiwgIiU2NiIsICIlNjciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlNjgiLCAiJTY5IiwgIiU2QSIsICIlNkIiLCAiJTZDIiwgIiU2RCIsICIlNkUiLCAiJTZGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTcwIiwgIiU3MSIsICIlNzIiLCAiJTczIiwgIiU3NCIsICIlNzUiLCAiJTc2IiwgIiU3NyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU3OCIsICIlNzkiLCAiJTdBIiwgIiU3QiIsICIlN0MiLCAiJTdEIiwgIiU3RSIsICIlN0YiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlODAiLCAiJTgxIiwgIiU4MiIsICIlODMiLCAiJTg0IiwgIiU4NSIsICIlODYiLCAiJTg3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTg4IiwgIiU4OSIsICIlOEEiLCAiJThCIiwgIiU4QyIsICIlOEQiLCAiJThFIiwgIiU4RiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU5MCIsICIlOTEiLCAiJTkyIiwgIiU5MyIsICIlOTQiLCAiJTk1IiwgIiU5NiIsICIlOTciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlOTgiLCAiJTk5IiwgIiU5QSIsICIlOUIiLCAiJTlDIiwgIiU5RCIsICIlOUUiLCAiJTlGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUEwIiwgIiVBMSIsICIlQTIiLCAiJUEzIiwgIiVBNCIsICIlQTUiLCAiJUE2IiwgIiVBNyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVBOCIsICIlQTkiLCAiJUFBIiwgIiVBQiIsICIlQUMiLCAiJUFEIiwgIiVBRSIsICIlQUYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlQjAiLCAiJUIxIiwgIiVCMiIsICIlQjMiLCAiJUI0IiwgIiVCNSIsICIlQjYiLCAiJUI3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUI4IiwgIiVCOSIsICIlQkEiLCAiJUJCIiwgIiVCQyIsICIlQkQiLCAiJUJFIiwgIiVCRiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVDMCIsICIlQzEiLCAiJUMyIiwgIiVDMyIsICIlQzQiLCAiJUM1IiwgIiVDNiIsICIlQzciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlQzgiLCAiJUM5IiwgIiVDQSIsICIlQ0IiLCAiJUNDIiwgIiVDRCIsICIlQ0UiLCAiJUNGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUQwIiwgIiVEMSIsICIlRDIiLCAiJUQzIiwgIiVENCIsICIlRDUiLCAiJUQ2IiwgIiVENyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVEOCIsICIlRDkiLCAiJURBIiwgIiVEQiIsICIlREMiLCAiJUREIiwgIiVERSIsICIlREYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlRTAiLCAiJUUxIiwgIiVFMiIsICIlRTMiLCAiJUU0IiwgIiVFNSIsICIlRTYiLCAiJUU3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUU4IiwgIiVFOSIsICIlRUEiLCAiJUVCIiwgIiVFQyIsICIlRUQiLCAiJUVFIiwgIiVFRiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVGMCIsICIlRjEiLCAiJUYyIiwgIiVGMyIsICIlRjQiLCAiJUY1IiwgIiVGNiIsICIlRjciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlRjgiLCAiJUY5IiwgIiVGQSIsICIlRkIiLCAiJUZDIiwgIiVGRCIsICIlRkUiLCAiJUZGIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQl9OwotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQuIEFsbAotCSAqIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBzaG91bGQgYmUgc3RhdGljLgotCSAqLwotCXByaXZhdGUgTmV0VXRpbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkkgZm9yIHRoZSBnaXZlbiBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBUaGUgaW5wdXQgZmlsZS4KLQkgKiBAcmV0dXJuIFRoZSBVUkkgZm9yIHRoZSBnaXZlbiBmaWxlLgotCSAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXIgd2hpbGUgY29uc3RydWN0aW5nIHRoZSBVUkkgZm9yIHRoZSBnaXZlbgotCSAqICAgICAgICAgICAgIGZpbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VXJpKEZpbGUgZmlsZSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB1cmwgPSBmaWxlLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IHVybExlbmd0aCA9IHVybC5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxMZW5ndGg7IGkrKykgewotCQkJY2hhciBjaCA9IHVybC5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICcgJzoKLQkJCQlzdHJCdWYuYXBwZW5kKCIlMjAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzdHJCdWYuYXBwZW5kKGNoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmVzb2x2ZXMgdGhlIGdpdmVuIFVSSSB1c2luZyB0aGUgZ2l2ZW4gdGhlIGJhc2UgVVJJLgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIFRoZSBVUkkgdG8gcmVzb2x2ZS4KLQkgKiBAcGFyYW0gYmFzZVVyaQotCSAqICAgICAgICAgICAgVGhlIGJhc2UgVVJJLgotCSAqIEByZXR1cm4gQSBmdWxseSBmb3JtZWQgVVJJLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVVcmkoU3RyaW5nIHVyaSwgU3RyaW5nIGJhc2VVcmkpIHsKLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmICh1cmkuc3RhcnRzV2l0aCgiLi4vIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGJhc2VVcmkuZW5kc1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJYmFzZVVyaSA9IGJhc2VVcmkuc3Vic3RyaW5nKDAsIGJhc2VVcmkubGVuZ3RoKCkgLSAxKTsKLQkJCX0KLQkJCXdoaWxlICh1cmkuc3RhcnRzV2l0aCgiLi4vIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXVyaSA9IHVyaS5zdWJzdHJpbmcoMyk7Ci0JCQkJaW50IGluZGV4ID0gYmFzZVVyaS5sYXN0SW5kZXhPZignLycpOwotCQkJCWlmIChpbmRleCA+IDApIHsKLQkJCQkJYmFzZVVyaSA9IGJhc2VVcmkuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCQl1cmkgPSAiLyIgKyB1cmk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmICh1cmkuc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBiYXNlVXJpLmVuZHNXaXRoKCIvIikgLy8kTk9OLU5MUy0xJAotCQkJCQk/IGJhc2VVcmkgKyB1cmkuc3Vic3RyaW5nKDEpIDogYmFzZVVyaSArIHVyaTsKLQkJfQotCi0JCWlmICh1cmkuc3RhcnRzV2l0aChGSUxFX1VSSV9QUkVGSVgpIHx8IHVyaS5zdGFydHNXaXRoKEhUVFBfVVJJX1BSRUZJWCkpIHsKLQkJCXJldHVybiB1cmk7Ci0JCX0KLQotCQlyZXR1cm4gYmFzZVVyaS5lbmRzV2l0aCgiLyIpID8gYmFzZVVyaSArIHVyaSA6IGJhc2VVcmkgKyAnLycgKyB1cmk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnB1dCBzdHJlYW0gZm9yIHRoZSBnaXZlbiBVUkkuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgVGhlIHNvdXJjZSBVUkkuCi0JICogQHJldHVybiBUaGUgaW5wdXQgc3RyZWFtIGZvciB0aGUgZ2l2ZW4gVVJJLgotCSAqIEB0aHJvdyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaWYgYSBnaXZlbiBYTUwgZG9jdW1lbnQgVVJJIGlzIGludmFsaWQuCi0JICogQHRocm93IElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1ciB3aGlsZSBhY2Nlc3NpbmcgdGhlIFVSSS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyB1cmkpCi0JCQl0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWlmICh1cmkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAodXJpLnN0YXJ0c1dpdGgoSFRUUF9VUklfUFJFRklYKSkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwodXJpKTsKLQkJCXJldHVybiB1cmwub3BlblN0cmVhbSgpOwotCQl9IGVsc2UgaWYgKHVyaS5zdGFydHNXaXRoKEZJTEVfVVJJX1BSRUZJWCkpIHsKLQkJCXVyaSA9IHVyaS5zdWJzdHJpbmcoRklMRV9VUklfUFJFRklYX0xFTkdUSCk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShOZXRVdGlsLmRlY29kZVVybCh1cmksIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKYXZhIHN0cmluZyByZXByZXNlbnRpb24gKGVuY29kZWQgaW4gVVRGLTE2KSBvZiB0aGUgZ2l2ZW4gVVJMCi0JICogKGVuY29kZWQgaW4gdGhlIGdpdmVuIGVuY29kaW5nIGFuZCBBU0NJSS1lc2NhcGVkKS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICBUaGUgVVJMIHRvIGRlY29kZS4KLQkgKiBAcGFyYW0gZW5jb2RpbmcKLQkgKiAgICAgICAgICAgIFRoZSBlbmNvZGluZyBvZiB0aGUgVVJMLgotCSAqIEByZXR1cm4gVGhlIEphdmEgVVRGLTE2IHN0cmluZyByZXNwcmVzZW50YXRpb24uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gVVJMIGNvbnRhaW4gaW1wcm9wZXJseSBlc2NhcGVkIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlVXJsKFN0cmluZyB1cmwsIFN0cmluZyBlbmNvZGluZykgewotCQlpZiAodXJsID09IG51bGwpIHsKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQkJCi0JCWludCBsZW4gPSB1cmwubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIHVybDsKLQkJfQotCi0JCS8vIFVuZXNjYXBlIHRoZSB1cmwuCi0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgY2ggPSB1cmwuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnKyc6Ci0JCQkJc3RyQnVmLmFwcGVuZCgnICcpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnJSc6Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyQnVmLmFwcGVuZCgoY2hhcikgSW50ZWdlci5wYXJzZUludCh1cmwuc3Vic3RyaW5nKGkgKyAxLAotCQkJCQkJCWkgKyAzKSwgMTYpKTsKLQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCWkgKz0gMjsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc3RyQnVmLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvLyBDb252ZXJ0IHRoZSB1bi1lc2NhcGVkIGJ5dGUgdmFsdWVzIHRvIEphdmEgVVRGLTE2IHN0cmluZy4KLQkJU3RyaW5nIHJlc3VsdCA9IHN0ckJ1Zi50b1N0cmluZygpOwotCQlpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlieXRlW10gYnl0ZXMgPSByZXN1bHQuZ2V0Qnl0ZXMoIjg4NTlfMSIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0ID0gbmV3IFN0cmluZyhieXRlcywgZW5jb2RpbmcpOwotCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEFTQ0lJLWVzY2FwZWQgcmVwcmVzZW50YXRpb24gKGVuY29kZWQgaW4gdGhlIHNwZWNpZmllZAotCSAqIGVuY29kaW5nKSBvZiB0aGUgZ2l2ZW4gVVJMIChlbmNvZGVkIGluIFVURi0xNikuCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgVGhlIFVSTCB0byBlbmNvZGUuCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICogICAgICAgICAgICBUaGUgZW5jb2Rpbmcgb2YgdGhlIFVSTC4KLQkgKiBAcmV0dXJuIHRoZSBBU0NJSS1lc2NhcGVkIHJlc3ByZXNlbnRhdGlvbi4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBVUkwgY29udGFpbiBpbXByb3Blcmx5IGVzY2FwZWQgY2hhcmFjdGVycy4KLQkgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gY29kaW5nIGlzIHVuc3VwcG9ydC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGVVcmwoU3RyaW5nIHVybCwgU3RyaW5nIGVuY29kaW5nKQotCQkJdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotCQlpZiAodXJsID09IG51bGwpIHsKLQkJCXJldHVybiB1cmw7Ci0JCX0JCQotCQlpbnQgbGVuID0gdXJsLmxlbmd0aCgpOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWJ5dGVbXSBieXRlcyA9IHVybC5nZXRCeXRlcyhlbmNvZGluZyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgY2ggPSAoY2hhcikgYnl0ZXNbaV07Ci0KLQkJCWlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKSB7Ci0JCQkJcmVzdWx0LmFwcGVuZChjaCk7Ci0JCQl9IGVsc2UgaWYgKGNoID49ICdBJyAmJiBjaCA8PSAnWicpIHsKLQkJCQlyZXN1bHQuYXBwZW5kKGNoKTsKLQkJCX0gZWxzZSBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgewotCQkJCXJlc3VsdC5hcHBlbmQoY2gpOwotCQkJfSBlbHNlIHsKLQkJCQlzd2l0Y2ggKGNoKSB7Ci0JCQkJY2FzZSAnLSc6Ci0JCQkJY2FzZSAnXyc6Ci0JCQkJY2FzZSAnLic6Ci0JCQkJY2FzZSAnISc6Ci0JCQkJY2FzZSAnfic6Ci0JCQkJY2FzZSAnKic6Ci0JCQkJY2FzZSAnXCcnOgotCQkJCWNhc2UgJygnOgotCQkJCWNhc2UgJyknOgotCQkJCQlyZXN1bHQuYXBwZW5kKGNoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmVzdWx0LmFwcGVuZChIRVhfVkFMVUVTW2NoICYgMHhGRl0pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQVNDSUktZXNjYXBlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gZmlsZSBVUkwuCi0JICogCi0JICogQHBhcmFtIGZpbGVVUkwKLQkgKiAgICAgICAgICAgIFRoZSBmaWxlIFVSTCB0byBlbmNvZGUuCi0JICogQHJldHVybiB0aGUgQVNDSUktZXNjYXBlZCByZXNwcmVzZW50YXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlRmlsZVVSTChTdHJpbmcgZmlsZVVSTCkgewotCQlTdHJpbmcgdXJsID0gZmlsZVVSTDsKLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IHVybExlbmd0aCA9IHVybC5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxMZW5ndGg7IGkrKykgewotCQkJY2hhciBjaCA9IHVybC5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICcgJzoKLQkJCQlzdHJCdWYuYXBwZW5kKCIlMjAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzdHJCdWYuYXBwZW5kKGNoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQVNDSUktZXNjYXBlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gZmlsZSBVUkwuCi0JICogCi0JICogQHBhcmFtIGZpbGVVUkwKLQkgKiAgICAgICAgICAgIFRoZSBmaWxlIFVSTCB0byBlbmNvZGUuCi0JICogQHJldHVybiB0aGUgQVNDSUktZXNjYXBlZCByZXNwcmVzZW50YXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlZEZpbGVVcmwoU3RyaW5nIGZpbGVVUkwpIHsKLQkJU3RyaW5nIHVybCA9IGZpbGVVUkw7Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCB1cmxMZW5ndGggPSB1cmwubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJsTGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgY2ggPSB1cmwuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnJSc6Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyQnVmLmFwcGVuZCgoY2hhcikgSW50ZWdlci5wYXJzZUludCh1cmwuc3Vic3RyaW5nKGkgKyAxLAotCQkJCQkJCWkgKyAzKSwgMTYpKTsKLQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCWkgKz0gMjsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc3RyQnVmLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGVVUkwgKFN0cmluZyB1cmwpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLS8vCQl1cmwgPSB1cmwucmVwbGFjZUFsbCgiXFwrIiwgIiUyQiIpOyAvLyROT04tTkxTLTEkCi0JCXVybCA9IFVSTERlY29kZXIuZGVjb2RlKHVybCwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHVybDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvUGVyc3BlY3RpdmVVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvUGVyc3BlY3RpdmVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NWNkMjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1BlcnNwZWN0aXZlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRXhjZXB0aW9uOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGFjY2Vzc2luZyBwZXJzcGVjdGl2ZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVVdGlsIHsKLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLiBBbGwKLQkgKiBtZXRob2RzIGluIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHN0YXRpYy4KLQkgKi8KLQlwcml2YXRlIFBlcnNwZWN0aXZlVXRpbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgYWN0aXZlIHBlcnNwZWN0aXZlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGFjdGl2ZSBwZXJzcGVjdGl2ZSBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3RpdmVQZXJzcGVjdGl2ZUlkKCkgewotCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgYWN0aXZlUGVyc3BlY3RpdmUgPSBhY3RpdmVQYWdlCi0JCQkJCS5nZXRQZXJzcGVjdGl2ZSgpOwotCQkJcmV0dXJuIGFjdGl2ZVBlcnNwZWN0aXZlLmdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYSBwZXJzcGVjdGl2ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGVyc3BlY3RpdmVJZAotCSAqICAgICAgICAgICAgVGhlIHBlcnNwZWN0aXZlIElELgotCSAqIEByZXR1cm4gVGhlIHByZXZpb3VzbHkgYWN0aXZlIHBlcnNwZWN0aXZlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBvcGVuUGVyc3BlY3RpdmUoU3RyaW5nIHBlcnNwZWN0aXZlSWQpIHsKLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQlJUGVyc3BlY3RpdmVSZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKTsKLQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3Igb2xkUGVyc3BlY3RpdmUgPSBhY3RpdmVQYWdlLmdldFBlcnNwZWN0aXZlKCk7Ci0JCQlpZiAoIW9sZFBlcnNwZWN0aXZlLmdldElkKCkuZXF1YWxzKHBlcnNwZWN0aXZlSWQpKSB7Ci0JCQkJSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBwZXJzcGVjdGl2ZSA9IHJlZ2lzdHJ5Ci0JCQkJCQkuZmluZFBlcnNwZWN0aXZlV2l0aElkKHBlcnNwZWN0aXZlSWQpOwotCQkJCWFjdGl2ZVBhZ2Uuc2V0UGVyc3BlY3RpdmUocGVyc3BlY3RpdmUpOwotCQkJfQotCQkJcmV0dXJuIG9sZFBlcnNwZWN0aXZlOwotCQl9IGVsc2UgewotCQkJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCXRyeSB7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5zaG93UGVyc3BlY3RpdmUoCi0JCQkJCQlwZXJzcGVjdGl2ZUlkLCBhY3RpdmVXaW5kb3cpOwotCQkJfSBjYXRjaCAoV29ya2JlbmNoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHBlcnNwZWN0aXZlIGlzIGFscmVhZHkgYWN0aXZlLgotCSAqIAotCSAqIEBwYXJhbSBwZXJzcGVjdGl2ZUlkCi0JICogICAgICAgICAgICBUaGUgcGVyc3BlY3RpdmUgSUQuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FjdGl2ZVBlcnNwZWN0aXZlKFN0cmluZyBwZXJzcGVjdGl2ZUlkKSB7Ci0JCVN0cmluZyBhY3RpdmVQZXJzcGVjdGl2ZUlkID0gUGVyc3BlY3RpdmVVdGlsLmdldEFjdGl2ZVBlcnNwZWN0aXZlSWQoKTsKLQkJaWYgKHBlcnNwZWN0aXZlSWQgPT0gbnVsbCB8fCBhY3RpdmVQZXJzcGVjdGl2ZUlkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gYWN0aXZlUGVyc3BlY3RpdmVJZC5lcXVhbHNJZ25vcmVDYXNlKHBlcnNwZWN0aXZlSWQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZpZXcgcGFydCB3aXRoIHRoZSBnaXZlbiB2aWV3IElELgotCSAqIAotCSAqIEBwYXJhbSB2aWV3SWQKLQkgKiAgICAgICAgICAgIFRoZSB2aWV3IElELgotCSAqIEByZXR1cm4gVGhlIHZpZXcgcGFydC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaWV3UGFydCBnZXRWaWV3KFN0cmluZyB2aWV3SWQpIHsKLQkJdHJ5IHsKLQkJCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQkJSVZpZXdQYXJ0IHZpZXcgPSBhY3RpdmVQYWdlLmZpbmRWaWV3KHZpZXdJZCk7Ci0JCQkJaWYgKHZpZXcgPT0gbnVsbCkgewotCQkJCQl2aWV3ID0gYWN0aXZlUGFnZS5zaG93Vmlldyh2aWV3SWQpOwotCQkJCX0KLQkJCQlyZXR1cm4gdmlldzsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9QcmVmZXJlbmNlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1ByZWZlcmVuY2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRiOGE4MzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1ByZWZlcmVuY2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgYWNjZXNzaW5nIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VVdGlsIHsKLQotCS8vIFRoZSBtdWx0aS1zdHJpbmcgcHJlZmVyZW5jZSBkZWxpbWl0ZXIuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfREVMSU1JVEVSID0gIjsiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9MSVNUID0gbmV3IE9iamVjdFswXTsKLQotCS8qKgotCSAqIEdldHMgYSBsaXN0IGNvbnRhaW5pbmcgc3RyaW5nIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggYSBuYW1lZCBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwcmVmU3RvcmUKLQkgKiAgICAgICAgICAgIGEgcHJlZmVyZW5jZSBzdG9yZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSBuYW1lCi0JICogQHJldHVybiBhIGxpc3Qgb2Ygc3RyaW5nIHZhbHVlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRMaXN0KElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlLCBTdHJpbmcgbmFtZSkgewotCQlMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHByZWZTdG9yZSAhPSBudWxsICYmIG5hbWUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHZhbHVlID0gcHJlZlN0b3JlLmdldFN0cmluZyhuYW1lKTsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLAotCQkJCQlQUkVGRVJFTkNFX0RFTElNSVRFUik7Ci0JCQlpbnQgdG9rZW5Db3VudCA9IHRva2VuaXplci5jb3VudFRva2VucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbkNvdW50OyBpKyspIHsKLQkJCQl2YWx1ZXMuYWRkKHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzdHJpbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVkIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHByZWZTdG9yZQotCSAqICAgICAgICAgICAgYSBwcmVmZXJlbmNlIHN0b3JlCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIG5hbWUKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBzdHJpbmcgcHJlZmVyZW5jZSB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFN0cmluZ1ZhbHVlcyhJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSwKLQkJCVN0cmluZyBuYW1lKSB7Ci0JCUxpc3QgbGlzdCA9IGdldExpc3QocHJlZlN0b3JlLCBuYW1lKTsKLQkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheSh2YWx1ZXMpOwotCQlyZXR1cm4gdmFsdWVzOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIGEgbGlzdCBjb250YWluaW5nIHN0cmluZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJlZlN0b3JlCi0JICogICAgICAgICAgICBhIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgbmFtZQotCSAqIEBwYXJhbSB2YWx1ZXMKLQkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBzdHJpbmcgdmFsdWVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldExpc3QoSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUsIFN0cmluZyBuYW1lLAotCQkJTGlzdCB2YWx1ZXMpIHsKLQkJaWYgKHByZWZTdG9yZSAhPSBudWxsICYmIG5hbWUgIT0gbnVsbCAmJiB2YWx1ZXMgIT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQlidWZmZXIuYXBwZW5kKHZhbHVlKTsKLQkJCQlidWZmZXIuYXBwZW5kKFBSRUZFUkVOQ0VfREVMSU1JVEVSKTsKLQkJCX0KLQkJCXByZWZTdG9yZS5zZXRWYWx1ZShuYW1lLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgc3RyaW5nIHZhbHVlIHRvIGEgbGlzdCBjb250YWluaW5nIHN0cmluZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGEKLQkgKiBuYW1lZCBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwcmVmU3RvcmUKLQkgKiAgICAgICAgICAgIGEgcHJlZmVyZW5jZSBzdG9yZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBhIHN0cmluZyB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUb0xpc3QoSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUsIFN0cmluZyBuYW1lLAotCQkJU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChwcmVmU3RvcmUgIT0gbnVsbCAmJiBuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkgewotCQkJTGlzdCBsaXN0ID0gZ2V0TGlzdChwcmVmU3RvcmUsIG5hbWUpOwotCQkJbGlzdC5yZW1vdmUodmFsdWUpOwotCQkJbGlzdC5hZGQoMCwgdmFsdWUpOwotCQkJLy8gRklYTUUhIFJlYWQgZnJvbSBnbG9iYWwgcHJlZmVyZW5jZS4KLQkJCWlmIChsaXN0LnNpemUoKSA+IDEwKSB7Ci0JCQkJbGlzdCA9IGxpc3Quc3ViTGlzdCgwLCAxMCk7Ci0JCQl9Ci0JCQlzZXRMaXN0KHByZWZTdG9yZSwgbmFtZSwgbGlzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVkIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHByZWZTdG9yZQotCSAqICAgICAgICAgICAgYSBwcmVmZXJlbmNlIHN0b3JlCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIG5hbWUKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICogICAgICAgICAgICBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFN0cmluZ1ZhbHVlcyhJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSwgU3RyaW5nIG5hbWUsCi0JCQlTdHJpbmdbXSB2YWx1ZXMpIHsKLQkJaWYgKHByZWZTdG9yZSAhPSBudWxsICYmIG5hbWUgIT0gbnVsbCAmJiB2YWx1ZXMgIT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCh2YWx1ZXNbaV0pOwotCQkJCWJ1ZmZlci5hcHBlbmQoUFJFRkVSRU5DRV9ERUxJTUlURVIpOwotCQkJfQotCQkJcHJlZlN0b3JlLnNldFZhbHVlKG5hbWUsIGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1Byb2ZpbGluZ1V0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9Qcm9maWxpbmdVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQzZDQwM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1Byb2ZpbGluZ1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgcHJvZmlsaW5nCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvZmlsaW5nVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnVsbEdDKCkgewotCQlSdW50aW1lIHJ0ID0gUnVudGltZS5nZXRSdW50aW1lKCk7Ci0JCWxvbmcgaXNGcmVlID0gcnQuZnJlZU1lbW9yeSgpOwotCQlsb25nIHdhc0ZyZWU7Ci0JCWRvIHsKLQkJCXdhc0ZyZWUgPSBpc0ZyZWU7Ci0JCQlydC5ydW5GaW5hbGl6YXRpb24oKTsKLQkJCXJ0LmdjKCk7Ci0JCQlpc0ZyZWUgPSBydC5mcmVlTWVtb3J5KCk7Ci0JCX0gd2hpbGUgKGlzRnJlZSA+IHdhc0ZyZWUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9TdHJVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvU3RyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYTM4MzZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9TdHJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgZm9yIG1hbnVpcHVsYXRpbmcgc3RyaW5ncy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RyVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUIgPSAiXHQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYUF9BTllfU1BFQ0lBTF9DSEFSUyA9ICIoYHx+fCF8QHwjfFxcJHwlfFxcXnwmfFxcKnxcXCh8XFwpfFxcK3w9fFxcW3xcXF18XFx8fFxcOnxcInw8fD58XFw/fC98J3xcXHN8XFxcXCkrIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWFBfSU5WQUxJRF9QVUJMSVNIRURfUEFUSF9DSEFSUyA9ICIoXFxbfCN8XFwqfFxcP3xcInw8fD58XFx8fCF8JXwvfFxcXSkrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYUF9JTlZBTElEX1BVQkxJU0hFRF9QQVRIX0NIQVJTX0xJTlVYID0gIihcXFt8I3xcXCp8XFw/fFwifDx8PnxcXHx8IXwlfFxcXSkrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYUF9JTlZBTElEX0ZJTEVOQU1FX0NIQVJTID0gIihcXFt8I3wvfFxcXFx8XFw6fFxcKnxcXD98XCJ8PHw+fFxcfHxcXF18XFxzKSsiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gSEVYX0RJR0lUUyA9IHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywKLQkJCSc2JywgJzcnLCAnOCcsICc5JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJyB9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9GRUVEID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX0ZFRURfUkVHRVggPSBMSU5FX0ZFRUQucmVwbGFjZUFsbCgiXFxcXCIsICJcXFxcIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfQlJFQUsgPSAiPGJyLz4iOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLiBBbGwKLQkgKiBtZXRob2RzIGluIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHN0YXRpYy4KLQkgKi8KLQlwcml2YXRlIFN0clV0aWwoKSB7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgZm9yIG51bGwgc3RyaW5nLgotCSAqIDxwPgotCSAqIEEgbnVsbCBzdHJpbmcgaXMgZGVmaW5lZCBhcyBvbmUgdGhhdCBoYXMgYW4gZW1wdHkgcmVmZXJlbmNlIG9yIGhhcyB6ZXJvCi0JICogbGVuZ3RoLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIEEgc3RyaW5nLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBhIG51bGwgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc051bGwoU3RyaW5nIHN0cikgewotCQlyZXR1cm4gc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDA7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgZm9yIGJsYW5rIHN0cmluZy4KLQkgKiA8cD4KLQkgKiBBIGJsYW5rIHN0cmluZyBpcyBkZWZpbmVkIGFzIG9uZSB0aGF0IGhhcyBhbiBlbXB0eSByZWZlcmVuY2Ugb3IgaGFzIHplcm8KLQkgKiBsZW5ndGggYWZ0ZXIgdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlIGNoYXJhY3RlcnMgYXJlIHRyaW1tZWQuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgQSBzdHJpbmcuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIGEgYmxhbmsgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0JsYW5rKFN0cmluZyBzdHIpIHsKLQkJcmV0dXJuIHN0ciA9PSBudWxsIHx8IHN0ci50cmltKCkubGVuZ3RoKCkgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZSBjaGFyYWN0ZXJzIGZyb20gYSBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgQSBzdHJpbmcuCi0JICogQHJldHVybiBBIHN0cmluZyB3aXRoIG5vIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHJpbShTdHJpbmcgc3RyKSB7Ci0JCXJldHVybiBzdHIgPT0gbnVsbCA/IG51bGwgOiBzdHIudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIChUQUIsIENSLCBMRiBhbmQgU1BBQ0UpIGZyb20gYSBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgQSBzdHJpbmcuCi0JICogQHJldHVybiBBIHN0cmluZyB3aXRoIHdoaXRlc3BhY2UgY2hhcmFjdGVycyByZW1vdmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZVdoaXRlU3BhY2VDaGFycyhTdHJpbmcgc3RyKSB7Ci0JCWludCBsZW4gPSAoc3RyID09IG51bGwpID8gMCA6IHN0ci5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJc3dpdGNoIChzdHIuY2hhckF0KGkpKSB7Ci0JCQljYXNlICdcdCc6Ci0JCQljYXNlICdccic6Ci0JCQljYXNlICdcbic6Ci0JCQljYXNlICcgJzoKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIHN0cjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBTcGxpdHMgYSBzdHJpbmcgaW50byBhbiBhcnJheSBvZiBzdHJpbmcgdG9rZW5zLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIEEgc3RyaW5nLgotCSAqIEBwYXJhbSBzZXAKLQkgKiAgICAgICAgICAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHN0cmluZyBzZXBhcmF0b3JzLgotCSAqIEBwYXJhbSBjb3VudAotCSAqICAgICAgICAgICAgVGhlIGRlc2lyZWQgbnVtYmVyIG9mIHN0cmluZyB0b2tlbnMuCi0JICogQHJldHVybiBBbiBhcnJheSBvZiBzdHJpbmcgdG9rZW5zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gc3BsaXQoU3RyaW5nIHN0ciwgU3RyaW5nIHNlcCwgaW50IGNvdW50KSB7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBjb3VudCA9PSAwIHx8IGNvdW50IDwgLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCBzZXAsCi0JCQkJY291bnQgPT0gLTEgPyBmYWxzZSA6IHRydWUpOwotCi0JCWlmIChjb3VudCA9PSAtMSkgewotCQkJY291bnQgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLQkJfQotCi0JCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbY291bnRdOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCWlmIChpIDwgY291bnQpIHsKLQkJCQlpZiAoKHQubGVuZ3RoKCkgPT0gMSkgJiYgKHNlcC5pbmRleE9mKHQpICE9IC0xKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJcmVzdWx0W2krK10gPSB0OwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHRbY291bnQgLSAxXSArPSB0OwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogU3BsaXRzIGEgc3RyaW5nIGludG8gYW4gYXJyYXkgb2Ygc3RyaW5nIHRva2Vucy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBBIHN0cmluZy4KLQkgKiBAcGFyYW0gc2VwCi0JICogICAgICAgICAgICBBIHN0cmluZyBjb250YWluaW5nIHRoZSBzdHJpbmcgc2VwYXJhdG9ycy4KLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHN0cmluZyB0b2tlbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBzcGxpdChTdHJpbmcgc3RyLCBTdHJpbmcgc2VwKSB7Ci0JCXJldHVybiBzcGxpdChzdHIsIHNlcCwgLTEpOwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2VzIGEgc3Vic3RyaW5nIHdpdGhpbiBhIHN0cmluZyB3aXRoIGFub3RoZXIgc3Vic3RyaW5nLgotCSAqIDxwPgotCSAqIE5vdGU6IE9ubHkgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHN1YnN0cmluZyB3aWxsIGJlIHJlcGxhY2VkLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIEEgc3RyaW5nLgotCSAqIEBwYXJhbSBzcmMKLQkgKiAgICAgICAgICAgIFRoZSBzdWJzdHJpbmcgdG8gcmVwbGFjZS4KLQkgKiBAcGFyYW0gdGd0Ci0JICogICAgICAgICAgICBUaGUgc3Vic3RyaW5nIHRvIHVzZSBmb3IgdGhlIHJlcGxhY2VtZW50LgotCSAqIEByZXR1cm4gQSBzdHJpbmcgd2l0aCB0aGUgZmlyc3Qgc3Vic3RyaW5nIHJlcGxhY2VkLgotCSAqIAotCSAqIFRPRE86IFJldmlldyBpbXBsZW1lbnRhdGlvbi4gQ2FsbCBTdHJpbmcucmVwbGFjZUZpcnN0KCkgaW5zdGVhZD8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlKFN0cmluZyBzdHIsIFN0cmluZyBzcmMsIFN0cmluZyB0Z3QpIHsKLQkJaWYgKChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkKLQkJCQl8fCAoc3JjID09IG51bGwgfHwgc3JjLmxlbmd0aCgpID09IDApKSB7Ci0JCQlyZXR1cm4gc3RyOwotCQl9Ci0KLQkJU3RyaW5nIHRtcFN0ciA9IHN0cjsKLQkJaW50IGluZGV4OwotCQl3aGlsZSAoKGluZGV4ID0gdG1wU3RyLmluZGV4T2Yoc3JjKSkgIT0gLTEpIHsKLQkJCXRtcFN0ciA9IHRtcFN0ci5zdWJzdHJpbmcoMCwgaW5kZXgpICsgdGd0Ci0JCQkJCSsgdG1wU3RyLnN1YnN0cmluZyhpbmRleCArIHNyYy5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIHRtcFN0cjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIGEgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIEEgc3RyaW5nLgotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKLQkgKiAgICAgICAgICAgIEEgZGVmYXVsdCBpbnRlZ2VyIHZhbHVlIGZvciB0aGUgc3RyaW5nLgotCSAqIEBwYXJhbSBUaGUKLQkgKiAgICAgICAgICAgIGludGVnZXIgdmFsdWUgb2YgdGhlIGdpdmVuIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRJbnRWYWx1ZShTdHJpbmcgc3RyLCBpbnQgZGVmYXVsdFZhbHVlKSB7Ci0JCWlmIChTdHJVdGlsLmlzQmxhbmsoc3RyKSkgewotCQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChzdHIpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBVVEYtOCBlbmNvZGluZyBvZiBhIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBBIHN0cmluZy4KLQkgKiBAcmV0dXJuIEEgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBVVEYtOCBlbmNvZGluZyBvZiB0aGUgZ2l2ZW4gc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGdldFVURjhCeXRlcyhTdHJpbmcgc3RyKSB7Ci0JCWNoYXJbXSBjID0gc3RyLnRvQ2hhckFycmF5KCk7Ci0JCWludCBsZW4gPSBjLmxlbmd0aDsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaW50IGNoID0gY1tpXTsKLQkJCWlmIChjaCA8PSAweDdmKSB7Ci0JCQkJY291bnQrKzsKLQkJCX0gZWxzZSBpZiAoY2ggPD0gMHg3ZmYpIHsKLQkJCQljb3VudCArPSAyOwotCQkJfSBlbHNlIHsKLQkJCQljb3VudCArPSAzOwotCQkJfQotCQl9Ci0KLQkJYnl0ZVtdIGIgPSBuZXcgYnl0ZVtjb3VudF07Ci0JCWludCBvZmYgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpbnQgY2ggPSBjW2ldOwotCQkJaWYgKGNoIDw9IDB4N2YpIHsKLQkJCQliW29mZisrXSA9IChieXRlKSBjaDsKLQkJCX0gZWxzZSBpZiAoY2ggPD0gMHg3ZmYpIHsKLQkJCQliW29mZisrXSA9IChieXRlKSAoKGNoID4+IDYpIHwgMHhjMCk7Ci0JCQkJYltvZmYrK10gPSAoYnl0ZSkgKChjaCAmIDB4M2YpIHwgMHg4MCk7Ci0JCQl9IGVsc2UgewotCQkJCWJbb2ZmKytdID0gKGJ5dGUpICgoY2ggPj4gMTIpIHwgMHhlMCk7Ci0JCQkJYltvZmYrK10gPSAoYnl0ZSkgKCgoY2ggPj4gNikgJiAweDNmKSB8IDB4ODApOwotCQkJCWJbb2ZmKytdID0gKGJ5dGUpICgoY2ggJiAweDNmKSB8IDB4ODApOwotCQkJfQotCQl9Ci0JCXJldHVybiBiOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhleGlkZWNpbWFsIGNoYXJhY3RlciByZXByZXNlbnRhdGlvbiBmb3IgYW4gaW50ZWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIEFuIGludGVnZXIuCi0JICogQHJldHVybiBUaGUgaGV4aWRlY2ltYWwgcmVwcmVzZW50YXRpb24uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhciB0b0hleChpbnQgdmFsdWUpIHsKLQkJcmV0dXJuIEhFWF9ESUdJVFNbKHZhbHVlICYgMHhGKV07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXNjYXBlZCBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIGEgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIEEgc3RyaW5nLgotCSAqIEBwYXJhbSBza2lwQVNDSUkKLQkgKiAgICAgICAgICAgIElmIHRydWUsIGF2b2lkIGVzY2FwaW5nIHRoZSBBU0NJSSBjaGFyYWN0ZXJzLgotCSAqIEByZXR1cm4gVGhlIGVzY2FwZWQgVW5pY29kZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvRXNjYXBlZFVuaWNvZGUoU3RyaW5nIHN0ciwgYm9vbGVhbiBza2lwQVNDSUkpIHsKLQkJaW50IGxlbiA9IHN0ci5sZW5ndGgoKTsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIobGVuICogMik7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjaCA9IHN0ci5jaGFyQXQoaSk7Ci0KLQkJCWlmIChza2lwQVNDSUkgJiYgY2ggPCAweDAwN0UpIHsKLQkJCQlyZXN1bHQuYXBwZW5kKGNoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0LmFwcGVuZCgiXFx1Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYXBwZW5kKHRvSGV4KChjaCA+PiAxMikgJiAweEYpKTsKLQkJCQlyZXN1bHQuYXBwZW5kKHRvSGV4KChjaCA+PiA4KSAmIDB4RikpOwotCQkJCXJlc3VsdC5hcHBlbmQodG9IZXgoKGNoID4+IDQpICYgMHhGKSk7Ci0JCQkJcmVzdWx0LmFwcGVuZCh0b0hleChjaCAmIDB4RikpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsYWluIHRleHQgZnJvbSBIVE1MIHRleHQuCi0JICogPHA+Ci0JICogTm90ZTogQWxsIEhUTUwgdGFncyB3aWxsIGJlIHN0cmlwcGVkLgotCSAqIAotCSAqIEBwYXJhbSBodG1sCi0JICogICAgICAgICAgICBUaGUgSFRNTCB0ZXh0LgotCSAqIEByZXR1cm4gVGhlIHBsYWluIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIEhUTUwgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbGFpblRleHQoU3RyaW5nIGh0bWwpIHsKLQkJaWYgKGh0bWwgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlmaW5hbCBQYXR0ZXJuIHBfcGxhaW50ZXh0X2ZpbHRlciA9IFBhdHRlcm4uY29tcGlsZSgKLQkJCQkiPFtePl0qPz4iLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgUGF0dGVybiBwX3BsYWludGV4dF9maWx0ZXIyID0gUGF0dGVybi5jb21waWxlKAotCQkJCSImLnsxLDV9W147XTsiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgUGF0dGVybiBwX3BsYWludGV4dF9maWx0ZXIzID0gUGF0dGVybi5jb21waWxlKAotCQkJCSJcXHMrIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIHJlc3VsdCA9IGh0bWwucmVwbGFjZUFsbChwX3BsYWludGV4dF9maWx0ZXIucGF0dGVybigpLCAiICIpIC8vJE5PTi1OTFMtMSQKLQkJCQkucmVwbGFjZUFsbChwX3BsYWludGV4dF9maWx0ZXIyLnBhdHRlcm4oKSwgIiAiKSAvLyROT04tTkxTLTEkCi0JCQkJLnJlcGxhY2VBbGwocF9wbGFpbnRleHRfZmlsdGVyMy5wYXR0ZXJuKCksICIgIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIHN0cmluZyBpbnRvIGEgdmFsaWQgZmlsZSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIEEgc3RyaW5nLgotCSAqIEByZXR1cm4gQSB2YWxpZCBmaWxlIG5hbWUgZGVydmllZCBmcm9tIHRoZSBnaXZlbiBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZVZhbGlkRmlsZU5hbWUoU3RyaW5nIHN0cikgewotCQlpZiAoc3RyID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQbGFpblRleHQoc3RyKS5yZXBsYWNlQWxsKFJFR0VYUF9JTlZBTElEX0ZJTEVOQU1FX0NIQVJTLCAiICIpLnRyaW0oKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlU3BlY2lhbENoYXJhY3RlcnMoU3RyaW5nIHN0cikgewotCQlpZiAoc3RyID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQbGFpblRleHQoc3RyKS5yZXBsYWNlQWxsKFJFR0VYUF9BTllfU1BFQ0lBTF9DSEFSUywgIiAiKS50cmltKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhdGggZG9lcyBub3QgY29udGFpbiBhbnkgaW52YWxpZCBmaWxlbmFtZQotCSAqIGNoYXJhY3RlcnMuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBmaWxlIHBhdGguCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcGF0aCBjb250YWlucyBvbmx5IHZhbGlkCi0JICogICAgICAgICBmaWxlbmFtZSBjaGFyYWN0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkUHVibGlzaFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJLy8gcmV0dXJuIHBhdGgucmVwbGFjZUFsbChpbnZhbGlkUHVibGlzaFBhdGhDaGFyc1JlZ0V4cCwKLQkJLy8gIiIpLmVxdWFscyhwYXRoKTsKLQotCQlpZiAoUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoUGxhdGZvcm0uV1NfV0lOMzIpKSB7Ci0JCQlyZXR1cm4gcGF0aAotCQkJCQkucmVwbGFjZUFsbChSRUdFWFBfSU5WQUxJRF9QVUJMSVNIRURfUEFUSF9DSEFSUywgIiIpLmVxdWFscyhwYXRoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gZWxzZSBkZWZhdWx0IHRvIExpbnV4Ci0JCXJldHVybiBwYXRoCi0JCQkJLnJlcGxhY2VBbGwoUkVHRVhQX0lOVkFMSURfUFVCTElTSEVEX1BBVEhfQ0hBUlNfTElOVVgsICIiKS5lcXVhbHMocGF0aCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb3dlci1jYXNlIG9mIHN0ciB1bmxlc3MgdGhlIGN1cnJlbnQgbG9jYWxlIGlzIEdlcm1hbgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9Mb3dlcihTdHJpbmcgc3RyKSB7Ci0JCWlmIChQbGF0Zm9ybS5nZXROTCgpLnN0YXJ0c1dpdGgoImRlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHN0cjsKLQkJfQotCQlyZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogZXNjYXBlIHRoZSAiIGFuZCAnCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHN0cikgewotCQlyZXR1cm4gc3RyLnJlcGxhY2VBbGwoIiciLCAiXFxcXFwnIikucmVwbGFjZUFsbCgiXCIiLCAiXFxcXFwiIik7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnRzIGEgPGNvZGU+TGlzdDwvY29kZT4gdG8gYW4gU3RyaW5nIGFycmF5LgotCSAqIAotCSAqIEBwYXJhbSBsaXN0IGEgPGNvZGU+TGlzdDwvY29kZT4KLQkgKiBAcmV0dXJuIGEgU3RyaW5nIGFycmF5Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBjb252ZXJ0TGlzdFRvU3RyQXJyYXkoTGlzdCBsaXN0KSB7Ci0JCWlmIChsaXN0ICE9IG51bGwpIHsKLQkJCWludCBjbnQgPSBsaXN0LnNpemUoKTsKLQkJCVN0cmluZ1tdIHN0ckFycmF5ID0gbmV3IFN0cmluZ1tjbnRdOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNudDsgaSsrKSB7Ci0JCQkJU3RyaW5nIHN0ciA9IChTdHJpbmcpIGxpc3QuZ2V0KGkpOwotCQkJCXN0ckFycmF5W2ldID0gbmV3IFN0cmluZyhzdHIpOwotCQkJfQotCQkJcmV0dXJuIHN0ckFycmF5OwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuYW1lLnJlcGxhY2VBbGwoUkVHRVhQX0FOWV9TUEVDSUFMX0NIQVJTLCAiIikuZXF1YWxzKG5hbWUpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0JCi0JLyoqCi0JICogYWRkZWQgc29tZSB0ZXN0IGNvZGUKLQkgKiAKLQkgKiBAcGFyYW0gYXJncwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQlTdHJpbmcgdGV4dCA9ICJBJiUgICAgICBgJiMgICAgICAgICAgICR+IUAjJCVeJiooKV8tKz17fVtcIl06fFxcOjtcIic8LD4uPy8gXHRcclxuWiI7Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlsiICsgdGV4dCArICJdIDw9PSB0ZXh0Iik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiWyIgKyB0ZXh0LnJlcGxhY2VBbGwoUkVHRVhQX0FOWV9TUEVDSUFMX0NIQVJTLCAiICIpICsgIl0gPD09IEFsbCIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlsiICsgdGV4dC5yZXBsYWNlQWxsKFJFR0VYUF9JTlZBTElEX0ZJTEVOQU1FX0NIQVJTLCAiICIpICsgIl0gPD09IEZpbGUgTmFtZSIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlsiICsgdGV4dC5yZXBsYWNlQWxsKFJFR0VYUF9JTlZBTElEX1BVQkxJU0hFRF9QQVRIX0NIQVJTLCAiICIpICsgIl0gPD09IHBhdGgiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJbIiArIHRleHQucmVwbGFjZUFsbChSRUdFWFBfSU5WQUxJRF9QVUJMSVNIRURfUEFUSF9DSEFSU19MSU5VWCwgIiAiKSArICJdIDw9PSBwYXRoLCBMaW51eCIpOwotCQkKLQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydHMgdGhlIHBsYXRmb3JtIGxpbmUtc2VwYXJhdG9yIChcbiBvciBcblxyIG9yIFxyKSB0byAmbHQ7YnIvJmd0OwotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnROZXdsaW5lc1RvSFRNTChTdHJpbmcgdGV4dCkgewotCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gdGV4dC5yZXBsYWNlQWxsKExJTkVfRkVFRF9SRUdFWCwgSFRNTF9CUkVBSyArIExJTkVfRkVFRCk7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9UaHJlYWRVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvVGhyZWFkVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNWI0MjNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9UaHJlYWRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGhhbmRsaW5nIHRocmVhZHMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGhyZWFkVXRpbCB7Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4gQWxsCi0JICogbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHNob3VsZCBiZSBzdGF0aWMuCi0JICovCi0JcHJpdmF0ZSBUaHJlYWRVdGlsKCkgewotCX0KLQotCS8qKgotCSAqIFB1dHMgdGhlIGN1cnJlbnQgdGhyZWFkIHRvIHNsZWVwIGZvciBhIGdpdmVuIGR1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB0aW1lCi0JICogICAgICAgICAgICBUaGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYXVzZShsb25nIHRpbWUpIHsKLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcCh0aW1lKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvVGltZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9UaW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OWYyOThhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9UaW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0vKioKLSAqIEEgc2ltcGxlIHRpbWVyIGZvciB0cmFja2luZyB0aW1lLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGltZXIgewotCi0JcHJpdmF0ZSBsb25nIGluaXRUaW1lOwotCi0JcHJpdmF0ZSBsb25nIHN0YXJ0VGltZTsKLQotCXByaXZhdGUgbG9uZyBlbmRUaW1lOwotCi0JcHVibGljIFRpbWVyKCkgewotCQlzdGFydCgpOwotCQlpbml0VGltZSA9IHN0YXJ0VGltZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJc3RhcnRUaW1lID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lSW5NaWxsaXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQllbmRUaW1lID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lSW5NaWxsaXMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRpbWUoKSB7Ci0JCXJldHVybiAoaW50KSAoZW5kVGltZSAtIHN0YXJ0VGltZSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUb3RhbFRpbWUoKSB7Ci0JCXJldHVybiAoaW50KSAoZW5kVGltZSAtIGluaXRUaW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9XYXJVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvV2FyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOTJhZmUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9XYXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuV2FyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7Ci0KLQotcHVibGljIGNsYXNzIFdhclV0aWwgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHdhciBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBvdXRwdXRXYXJGaWxlCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB0YXJnZXQgd2FyIGZpbGUKLQkgKiBAcGFyYW0gd2ViQXBwRGlyZWN0b3J5Ci0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZpbGVzIGFuZCBzdWIKLQkgKiAgICAgICAgICAgIGRpcmVjdG9yaWVzIHRvIGJlIHdhcmVkCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhlIHppcCBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGJ1aWxkV2FyRmlsZShTdHJpbmcgb3V0cHV0V2FyRmlsZSwgU3RyaW5nIHdlYkFwcERpcmVjdG9yeSwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQl0cnkgewotCQkJUHJvamVjdCBhbnRQcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKLQkJCWFudFByb2plY3QuaW5pdCgpOwotCQkJV2FyIHdhclRhc2sgPSBuZXcgV2FyKCk7Ci0JCQl3YXJUYXNrLnNldFByb2plY3QoYW50UHJvamVjdCk7Ci0JCQl3YXJUYXNrLnNldERlc3RGaWxlKG5ldyBGaWxlKG91dHB1dFdhckZpbGUpKTsKLQkJCXdhclRhc2suc2V0V2VieG1sKG5ldyBGaWxlKHdlYkFwcERpcmVjdG9yeSArIEZpbGUuc2VwYXJhdG9yICsgIldFQi1JTkYiCi0JCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyAid2ViLnhtbCIpKTsKLQkJCUZpbGVTZXQgd2ViRmlsZXMgPSBuZXcgRmlsZVNldCgpOwotCQkJd2ViRmlsZXMuc2V0RGlyKG5ldyBGaWxlKHdlYkFwcERpcmVjdG9yeSkpOwotCQkJd2FyVGFzay5hZGRGaWxlc2V0KHdlYkZpbGVzKTsKLQkJCXdhclRhc2suZXhlY3V0ZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvWE1MVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1hNTFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzJlYWY2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvWE1MVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBwcm9jZXNzaW5nIFhNTCBkb2N1bWVudHMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNTFV0aWwgewotCi0JLyoqCi0JICogWE1MIGRlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9ERUNMQVJBVElPTiA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBYTUwgRXNjYXBlIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX0FNUCA9ICImYW1wOyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfQkFDS1NMQVNIID0gIiYjOTI7IjsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9BUE9TID0gIiZhcG9zOyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9DUiA9ICImIzEzOyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9HVCA9ICImZ3Q7IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX0xUID0gIiZsdDsiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfTEYgPSAiJiMxMDsiOyAvLyROT04tTkxTLTEkCQotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX1FVT1QgPSAiJnF1b3Q7IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX1RBQiA9ICImIzk7IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSTEYgPSAiXHJcbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBDUkxGX0JZVEVTID0gQ1JMRi5nZXRCeXRlcygpOwotCQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLiBBbGwKLQkgKiBtZXRob2RzIGluIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHN0YXRpYy4KLQkgKi8KLQlwcml2YXRlIFhNTFV0aWwoKSB7Ci0JfQotCi0JLyoqCi0JICogQ2xvbmVzIHRoZSBnaXZlbiBET00gbm9kZSBpbnRvIHRoZSBnaXZlbiBET00gZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIFRoZSBET00gbm9kZSB0byBjbG9uZS4KLQkgKiBAcGFyYW0gZG9jCi0JICogICAgICAgICAgICBUaGUgdGFyZ2V0IERPTSBkb2N1bWVudC4KLQkgKiBAcmV0dXJuIFRoZSBjbG9uZWQgbm9kZSBpbiB0aGUgdGFyZ2V0IERPTSBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUgY2xvbmVOb2RlKE5vZGUgbm9kZSwgRG9jdW1lbnQgZG9jKSB7Ci0JCU5vZGUgY2xvbmUgPSBudWxsOwotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFOgotCQkJY2xvbmUgPSBkb2MuY3JlYXRlRWxlbWVudChub2RlLmdldE5vZGVOYW1lKCkpOwotCQkJTmFtZWROb2RlTWFwIGF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlOb2RlIGF0dHJOb2RlID0gYXR0cnMuaXRlbShpKTsKLQkJCQlBdHRyIGF0dHJDbG9uZSA9IGRvYy5jcmVhdGVBdHRyaWJ1dGUoYXR0ck5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJYXR0ckNsb25lLnNldE5vZGVWYWx1ZShhdHRyTm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0JCQkJKChFbGVtZW50KSBjbG9uZSkuc2V0QXR0cmlidXRlTm9kZShhdHRyQ2xvbmUpOwotCQkJfQotCi0JCQkvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBjaGlsZCBub2Rlcy4KLQkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCWlmIChjaGlsZE5vZGVzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlOb2RlIGNoaWxkTm9kZSA9IGNoaWxkTm9kZXMuaXRlbShpKTsKLQkJCQkJTm9kZSBjaGlsZENsb25lID0gY2xvbmVOb2RlKGNoaWxkTm9kZSwgZG9jKTsKLQkJCQkJY2xvbmUuYXBwZW5kQ2hpbGQoY2hpbGRDbG9uZSk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBOb2RlLlRFWFRfTk9ERToKLQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERToKLQkJCWNsb25lID0gZG9jLmNyZWF0ZVRleHROb2RlKG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQljbG9uZS5zZXROb2RlVmFsdWUobm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0JCQlicmVhazsKLQkJfQotCQlyZXR1cm4gY2xvbmU7Ci0JfQotCQotCS8qKgotCSAqIEVzY2FwZXMgYSBYTUwgYXR0cmlidXRlIHRvIG1ha2UgaXQgWE1MIHBhcnNlciBmcmllbmRseS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBUaGUgWE1MIGF0dHJpYnV0ZSBzdHJpbmcuCi0JICogQHJldHVybiBUaGUgZXNjYXBlZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlQXR0cihTdHJpbmcgc3RyKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBzdHIuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnPCc6Ci0JCQkJc2IuYXBwZW5kKFhNTF9MVCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICcmJzoKLQkJCQlzYi5hcHBlbmQoWE1MX0FNUCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICciJzoKLQkJCQlzYi5hcHBlbmQoWE1MX1FVT1QpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzYi5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0JCi0KLQkvKioKLQkgKiBFc2NhcGVzIHRoZSBnaXZlbiBzdHJpbmcgdG8gbWFrZSBpdCBYTUwgcGFyc2VyIGZyaWVuZGx5LgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIFRoZSBzb3VyY2Ugc3RyaW5nLgotCSAqIEByZXR1cm4gVGhlIGVzY2FwZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZShTdHJpbmcgc3RyKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBzdHIuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnPCc6Ci0JCQkJc2IuYXBwZW5kKFhNTF9MVCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICc+JzoKLQkJCQlzYi5hcHBlbmQoWE1MX0dUKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJyYnOgotCQkJCXNiLmFwcGVuZChYTUxfQU1QKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJyInOgotCQkJCXNiLmFwcGVuZChYTUxfUVVPVCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcJyc6Ci0JCQkJc2IuYXBwZW5kKFhNTF9BUE9TKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xyJzoKLQkJCQlzYi5hcHBlbmQoWE1MX0NSKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xuJzoKLQkJCQlzYi5hcHBlbmQoWE1MX0xGKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xcJzoKLQkJCQlzYi5hcHBlbmQoWE1MX0JBQ0tTTEFTSCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXNiLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogRXNjYXBlcyB0aGUgZ2l2ZW4gc3RyaW5nIHRvIG1ha2UgaXQgWE1MIHBhcnNlciBmcmllbmRseS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBUaGUgc291cmNlIHN0cmluZy4KLQkgKiBAcGFyYW0gaWdub3JlQ1JMRgotCSAqICAgICAgICAgICAgSWYgdHJ1ZSwgZG8gbm90IGVzY2FwZSB0aGUgQ1IgYW5kIExGIGNoYXJhY3RlcnMuCi0JICogQHJldHVybiBUaGUgZXNjYXBlZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyBzdHIsIGJvb2xlYW4gaWdub3JlQ1JMRikgewotCQlpZiAoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbGVuID0gc3RyLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGNoID0gc3RyLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJzwnOgotCQkJCXNiLmFwcGVuZChYTUxfTFQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnPic6Ci0JCQkJc2IuYXBwZW5kKFhNTF9HVCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICcmJzoKLQkJCQlzYi5hcHBlbmQoWE1MX0FNUCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICciJzoKLQkJCQlzYi5hcHBlbmQoWE1MX1FVT1QpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXCcnOgotCQkJCXNiLmFwcGVuZChYTUxfQVBPUyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdccic6Ci0JCQkJaWYgKGlnbm9yZUNSTEYpCi0JCQkJCXNiLmFwcGVuZChjaCk7Ci0JCQkJZWxzZQotCQkJCQlzYi5hcHBlbmQoWE1MX0NSKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xuJzoKLQkJCQlpZiAoaWdub3JlQ1JMRikKLQkJCQkJc2IuYXBwZW5kKGNoKTsKLQkJCQllbHNlCi0JCQkJCXNiLmFwcGVuZChYTUxfTEYpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzYi5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFVuZXNjYXBlcyB0aGUgZ2l2ZW4gWE1MIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBUaGUgc291cmNlIHN0cmluZy4KLQkgKiBAcmV0dXJuIFRoZSBlc2NhcGVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmVzY2FwZShTdHJpbmcgc3RyKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBzdHIuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnJic6Ci0JCQkJaWYgKHN0ci5zdGFydHNXaXRoKFhNTF9MVCwgaSkpIHsKLQkJCQkJc2IuYXBwZW5kKCc8Jyk7Ci0JCQkJCWkgKz0gMzsKLQkJCQl9IGVsc2UgaWYgKHN0ci5zdGFydHNXaXRoKFhNTF9HVCwgaSkpIHsKLQkJCQkJc2IuYXBwZW5kKCc+Jyk7Ci0JCQkJCWkgKz0gMzsKLQkJCQl9IGVsc2UgaWYgKHN0ci5zdGFydHNXaXRoKFhNTF9BTVAsIGkpKSB7Ci0JCQkJCXNiLmFwcGVuZCgnJicpOwotCQkJCQlpICs9IDQ7Ci0JCQkJfSBlbHNlIGlmIChzdHIuc3RhcnRzV2l0aChYTUxfUVVPVCwgaSkpIHsKLQkJCQkJc2IuYXBwZW5kKCciJyk7Ci0JCQkJCWkgKz0gNTsKLQkJCQl9IGVsc2UgaWYgKHN0ci5zdGFydHNXaXRoKFhNTF9BUE9TLCBpKSkgewotCQkJCQlzYi5hcHBlbmQoIlwnIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaSArPSA1OwotCQkJCX0gZWxzZSBpZiAoc3RyLnN0YXJ0c1dpdGgoWE1MX0NSLCBpKSkgewotCQkJCQlzYi5hcHBlbmQoJ1xyJyk7Ci0JCQkJCWkgKz0gNDsKLQkJCQl9IGVsc2UgaWYgKHN0ci5zdGFydHNXaXRoKFhNTF9MRiwgaSkpIHsKLQkJCQkJc2IuYXBwZW5kKCdcbicpOwotCQkJCQlpICs9IDQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2IuYXBwZW5kKGNoKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXNiLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBET00gZG9jdW1lbnQgdG8gdGhlIG91dHB1dCBzdHJlYW0uCi0JICogCi0JICogQHBhcmFtIHhtbERvYwotCSAqICAgICAgICAgICAgVGhlIERPTSBkb2N1bWVudC4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHN0cmVhbS4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VyIHdoaWxlIGFjY2Vzc2luZyB0aGUgb3V0cHV0IHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVEb2N1bWVudChEb2N1bWVudCB4bWxEb2MsIE91dHB1dFN0cmVhbSBvdXRwdXQpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG91dHB1dCk7Ci0JCXdyaXRlTm9kZSh4bWxEb2MsICIiLCBvdXQpOyAvLyROT04tTkxTLTEkCi0JCW91dC5mbHVzaCgpOwotCX0KLQotCS8qKgotCSAqIFdyaXRlcyB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gRE9NIGRvY3VtZW50IHRvIHRoZSBQcmludFdyaXRlci4KLQkgKiAKLQkgKiBAcGFyYW0geG1sRG9jCi0JICogICAgICAgICAgICBUaGUgRE9NIGRvY3VtZW50LgotCSAqIEBwYXJhbSBwdwotCSAqICAgICAgICAgICAgVGhlIFByaW50V3JpdGVyIG9iamVjdC4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VyIHdoaWxlIGFjY2Vzc2luZyB0aGUgb3V0cHV0IHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVEb2N1bWVudChEb2N1bWVudCB4bWxEb2MsIFByaW50V3JpdGVyIHB3KQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG9zKTsKLQkJd3JpdGVOb2RlKHhtbERvYywgIiIsIG91dCk7IC8vJE5PTi1OTFMtMSQKLQkJb3V0LmZsdXNoKCk7Ci0JCS8vIEZJWE1FISBOZWVkIHRvIHNwZWNpZnkgZW5jb2Rpbmc/Ci0JCVN0cmluZyBzID0gb3MudG9TdHJpbmcoKTsKLQkJcHcud3JpdGUocyk7Ci0JCXB3LmZsdXNoKCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIERPTSBkb2N1bWVudCB0byBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB4bWxEb2MKLQkgKiAgICAgICAgICAgIFRoZSBET00gZG9jdW1lbnQuCi0JICogQHBhcmFtIHhtbEZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgZmlsZS4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VyIHdoaWxlIGFjY2Vzc2luZyB0aGUgb3V0cHV0IHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZURvY3VtZW50KERvY3VtZW50IHhtbERvYywgU3RyaW5nIHhtbEZpbGUpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKAotCQkJCXhtbEZpbGUpKTsKLQkJd3JpdGVOb2RlKHhtbERvYywgIiIsIG91dCk7IC8vJE5PTi1OTFMtMSQKLQkJb3V0LmZsdXNoKCk7Ci0JCW91dC5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBnaXZlbiBYTUwgc3RyaW5nIHRvIHRoZSBnaXZlbiBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc3RyaW5nLgotCSAqIEBwYXJhbSB4bWxGaWxlCi0JICogICAgICAgICAgICBUaGUgWE1MIGZpbGUuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1ciB3aGlsZSBhY2Nlc3NpbmcgdGhlIG91dHB1dCBzdHJlYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVEb2N1bWVudChTdHJpbmcgeG1sU3RyLCBTdHJpbmcgeG1sRmlsZSkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oCi0JCQkJeG1sRmlsZSkpOwotCQlvdXQud3JpdGUoeG1sU3RyLmdldEJ5dGVzKCkpOwotCQlvdXQuZmx1c2goKTsKLQkJb3V0LmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBnaXZlbiBET00gdHJlZSBub2RlIHRvIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBUaGUgRE9NIG5vZGUuCi0JICogQHBhcmFtIGluZGVudAotCSAqICAgICAgICAgICAgVGhlIHN0cmluZyBpbmRlbnRhdGlvbiAoY29udGFpbmluZyBzcGFjZSBjaGFyYWN0ZXJzKS4KLQkgKiBAcGFyYW0gb3V0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHN0cmVhbS4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VyIHdoaWxlIGFjY2Vzc2luZyB0aGUgb3V0cHV0IHN0cmVhbS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlTm9kZShOb2RlIG5vZGUsIFN0cmluZyBpbmRlbnQsIERhdGFPdXRwdXRTdHJlYW0gb3V0KQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRleHQ7Ci0KLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJY2FzZSBOb2RlLkRPQ1VNRU5UX05PREU6Ci0JCQkvLyBXcml0ZSB0aGUgWE1MIGZpbGUgc2lnbmF0dXJlLgotCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKFhNTF9ERUNMQVJBVElPTikpOwotCQkJb3V0LndyaXRlKENSTEZfQllURVMpOwotCi0JCQkvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBjaGlsZCBub2Rlcy4KLQkJCU5vZGVMaXN0IG5vZGVzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlpZiAobm9kZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQl3cml0ZU5vZGUobm9kZXMuaXRlbShpKSwgIiIsIG91dCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFOgotCQkJU3RyaW5nIG5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQlvdXQud3JpdGUoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMoaW5kZW50ICsgIjwiICsgbmFtZSkpOyAvLyROT04tTkxTLTEkCi0JCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCU5vZGUgYXR0ck5vZGUgPSBhdHRycy5pdGVtKGkpOwotCQkJCW91dC53cml0ZShTdHJVdGlsLmdldFVURjhCeXRlcygiICIgKyBhdHRyTm9kZS5nZXROb2RlTmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgIj1cIiIgKyBlc2NhcGUoYXR0ck5vZGUuZ2V0Tm9kZVZhbHVlKCkpICsgIlwiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCW91dC53cml0ZShTdHJVdGlsLmdldFVURjhCeXRlcygiPiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJb3V0LndyaXRlKENSTEZfQllURVMpOwotCi0JCQkvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBjaGlsZCBub2Rlcy4KLQkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCWlmIChjaGlsZE5vZGVzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQl3cml0ZU5vZGUoY2hpbGROb2Rlcy5pdGVtKGkpLCBpbmRlbnQsIG91dCk7Ci0JCQkJfQotCQkJfQotCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKGluZGVudCArICI8LyIgKyBuYW1lICsgIj4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJb3V0LndyaXRlKENSTEZfQllURVMpOwotCi0JCQlicmVhazsKLQotCQljYXNlIE5vZGUuVEVYVF9OT0RFOgotCQkJdGV4dCA9IFN0clV0aWwucmVtb3ZlV2hpdGVTcGFjZUNoYXJzKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotCQkJaWYgKHRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKGVzY2FwZSh0ZXh0KSkpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERToKLQkJCXRleHQgPSBTdHJVdGlsLnJlbW92ZVdoaXRlU3BhY2VDaGFycyhub2RlLmdldE5vZGVWYWx1ZSgpKTsKLQkJCWlmICh0ZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJCW91dC53cml0ZShTdHJVdGlsLmdldFVURjhCeXRlcygiPCFbQ0RBVEFbIikpOyAvLyROT04tTkxTLTEkCi0JCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKHRleHQpKTsKLQkJCQlvdXQud3JpdGUoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMoIl1dPiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCW91dC53cml0ZShDUkxGX0JZVEVTKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6Ci0JCQlvdXQud3JpdGUoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMoIjw/IiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCSsgIiAiICsgbm9kZS5nZXROb2RlVmFsdWUoKSArICI/PiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlvdXQud3JpdGUoQ1JMRl9CWVRFUyk7Ci0JCQlicmVhazsKLQotCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFOgotCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKCImIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICI7IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSBsb2NhdGlvbiB3aGVyZSB0aGUgZ2l2ZW4gU0FYIGV4Y2VwdGlvbiBvY2N1cnJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgVGhlIFNBWCBwYXJzZSBleGNlcHRpb24uCi0JICogQHJldHVybiBBIHN0cmluZyBjb250YWluaW5nIHRoZSBmaWxlIGxvY2F0aW9uIHdoZXJlIHRoZSBleGNlcHRpb24KLQkgKiAgICAgICAgIG9jY3VycmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2F0aW9uT2ZFeGNlcHRpb24oU0FYUGFyc2VFeGNlcHRpb24gZSkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZCgicm93ICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChlLmdldExpbmVOdW1iZXIoKSk7Ci0JCXNiLmFwcGVuZCgiLCBjb2wgIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKGUuZ2V0Q29sdW1uTnVtYmVyKCkpOwotCi0JCVN0cmluZyBzeXN0ZW1JZCA9IGUuZ2V0U3lzdGVtSWQoKTsKLQkJaWYgKHN5c3RlbUlkICE9IG51bGwpIHsKLQkJCWludCBpbmRleCA9IHN5c3RlbUlkLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQlzeXN0ZW1JZCA9IHN5c3RlbUlkLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJfQotCQkJc2IuYXBwZW5kKCIgb2YgWE1MIGRvY3VtZW50ICIpOyAvLyROT04tTkxTLTEkCi0JCQlzYi5hcHBlbmQoc3lzdGVtSWQpOwotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudCBsb2FkWG1sKEZpbGUgZmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50QnVpbGRlckZhY3RvcnkgYnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Ci0JCQkJLm5ld0luc3RhbmNlKCk7Ci0JCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gYnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0KLQkJcmV0dXJuIGJ1aWxkZXIucGFyc2UoZmlsZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudCBjcmVhdGVEb2N1bWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeQotCQkJCS5uZXdJbnN0YW5jZSgpOwotCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQlyZXR1cm4gYnVpbGRlci5uZXdEb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqIHRleHQgb2YgYSBsZWFmIG5vZGUsIHdpdGhvdXQgY2hpbGQgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSB0YWcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5vZGVUZXh0KEVsZW1lbnQgdGFnKSB7Ci0JCVN0cmluZyB0ZXh0ID0gdGFnLnRvU3RyaW5nKCk7Ci0JCWludCBpID0gdGV4dC5pbmRleE9mKCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGogPSB0ZXh0Lmxhc3RJbmRleE9mKCI8LyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpIDwgMCB8fCBqIDwgMCB8fCBqIDwgaSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcoaSArIDEsIGopOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENoaWxkVGV4dChFbGVtZW50IHRhZywgU3RyaW5nIGNoaWxkVGFnTmFtZSkgewotCQlFbGVtZW50IGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCh0YWcsIGNoaWxkVGFnTmFtZSk7Ci0JCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0Tm9kZVRleHQoY2hpbGQpOwotCQl9Ci0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBFbGVtZW50IGdldEZpcnN0Q2hpbGQoRWxlbWVudCB0YWcsIFN0cmluZyBjaGlsZFRhZ05hbWUpIHsKLQkJTm9kZUxpc3Qgbm9kZXMgPSB0YWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoY2hpbGRUYWdOYW1lKTsKLQkJaWYgKG5vZGVzID09IG51bGwgfHwgbm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gKEVsZW1lbnQpIG5vZGVzLml0ZW0oMCk7Ci0JfQotCi0JLyoqCi0JICogaXRlcmF0b3Igb2YgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSB0YWcKLQkgKiBAcmV0dXJuIEl0ZXJhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvciBjaGlsZEl0ZXJhdG9yKEVsZW1lbnQgdGFnKSB7Ci0JCU5vZGVMaXN0IG5vZGVzID0gdGFnLmdldENoaWxkTm9kZXMoKTsKLQotCQkvLyBOb2RlTGlzdCBjb250YWlucyBubyBFbGVtZW50IG5vZGVzIHN1Y2ggYXMgdGV4dCBub2RlcywgaWdub3JlIHRob3NlCi0JCUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChub2RlcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IG5vZGVzLmdldExlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKGkpOwotCQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCQllbGVtZW50cy5hZGQobm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9kZUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCQlpbnQgY3VycmVudEluZGV4ID0gLTE7Ci0KLQkJaW50IHNpemUgPSAwOwotCi0JCU5vZGVMaXN0IG5vZGVzID0gbnVsbDsKLQotCQlwdWJsaWMgTm9kZUl0ZXJhdG9yKE5vZGVMaXN0IG5vZGVzKSB7Ci0JCQl0aGlzLm5vZGVzID0gbm9kZXM7Ci0JCQlpZiAobm9kZXMgIT0gbnVsbCkKLQkJCQlzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkvLyBEbyBub3RoaW5nLCB0aGlzIGlzIGEgcmVhZG9ubHkgaXRlcmF0b3IuCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIGN1cnJlbnRJbmRleCArIDEgPCBzaXplOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJaWYgKGhhc05leHQoKSkgewotCQkJCXJldHVybiBub2Rlcy5pdGVtKCsrY3VycmVudEluZGV4KTsKLQkJCX0KLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogaXRlcmF0b3Igb2YgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSB0YWcKLQkgKiBAcmV0dXJuIEl0ZXJhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvciBjaGlsZEl0ZXJhdG9yKEVsZW1lbnQgdGFnLCBTdHJpbmcgY2hpbGRUYWdOYW1lKSB7Ci0JCU5vZGVMaXN0IG5vZGVzID0gdGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKGNoaWxkVGFnTmFtZSk7Ci0JCXJldHVybiBuZXcgTm9kZUl0ZXJhdG9yKG5vZGVzKTsKLQl9Ci0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvWmlwVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1ppcFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZThiNzMwZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvWmlwVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgemlwIGZpbGVzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFppcFV0aWwgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHppcCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB6aXBGaWxlUGF0aAotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgdGFyZ2V0IHppcCBmaWxlCi0JICogQHBhcmFtIGNvbnRlbnRQYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZpbGVzIGFuZCBzdWIKLQkgKiAgICAgICAgICAgIGRpcmVjdG9yaWVzIHRvIGJlIHppcHBlZAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIHRoZSB6aXAgZmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVaaXBGaWxlKFN0cmluZyB6aXBGaWxlUGF0aCwgU3RyaW5nIGNvbnRlbnRQYXRoLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlaaXBPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW91dCA9IG5ldyBaaXBPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oCi0JCQkJCXppcEZpbGVQYXRoKSk7Ci0JCQlGaWxlIGNvbnRlbnREaXIgPSBuZXcgRmlsZShjb250ZW50UGF0aCk7Ci0JCQlwb3B1bGF0ZVppcEZpbGUob3V0LCBjb250ZW50RGlyLmdldEFic29sdXRlUGF0aCgpLCBjb250ZW50RGlyLAotCQkJCQltb25pdG9yKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAob3V0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUG9wdWxhdGVzIGEgemlwIGZpbGUgd2l0aCBkaXJlY3RvcmllcyBhbmQgZmlsZXMuCi0JICogCi0JICogQHBhcmFtIG91dAotCSAqICAgICAgICAgICAgYSB6aXAgZmlsZSBvdXRwdXQgc3RyZWFtCi0JICogQHBhcmFtIHJvb3RQYXRoCi0JICogICAgICAgICAgICBhIHJvb3QgcGF0aCB0aGF0IGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlCi0JICogICAgICAgICAgICB6aXAgY29udGVudAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBhIGZpbGUgb3IgZGlyZWN0b3J5Ci0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwb3B1bGF0ZVppcEZpbGUoWmlwT3V0cHV0U3RyZWFtIG91dCwgU3RyaW5nIHJvb3RQYXRoLAotCQkJRmlsZSBmaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVbXSBmaWxlcyA9IGZpbGUubGlzdEZpbGVzKCk7Ci0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJcG9wdWxhdGVaaXBGaWxlKG91dCwgcm9vdFBhdGgsIGZpbGVzW2ldLCBtb25pdG9yKTsKLQkJCQl9IGVsc2UgewotCQkJCQlTdHJpbmcgZmlsZVBhdGggPSBmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQkJRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlUGF0aCk7Ci0JCQkJCVN0cmluZyByZWxhdGl2ZVBhdGggPSBmaWxlUGF0aAotCQkJCQkJCS5zdWJzdHJpbmcocm9vdFBhdGgubGVuZ3RoKCkgKyAxKTsKLQkJCQkJb3V0LnB1dE5leHRFbnRyeShuZXcgWmlwRW50cnkocmVsYXRpdmVQYXRoKSk7Ci0JCQkJCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsKLQkJCQkJaW50IGxlbjsKLQkJCQkJd2hpbGUgKChsZW4gPSBpbi5yZWFkKGJ1ZmZlcikpID4gMCkgewotCQkJCQkJb3V0LndyaXRlKGJ1ZmZlciwgMCwgbGVuKTsKLQkJCQkJfQotCQkJCQlvdXQuY2xvc2VFbnRyeSgpOwotCQkJCQlpbi5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcyMTZiYWE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBjb21tb24gY2xpcGJvYXJkLCBmaWxlLCBJMThOLCBpbWFnZSwgbmV0d29ya2luZywgc3RyaW5nIG1hbmlwdWxhdGlvbiBhbmQgdGhyZWFkaW5nIHNlcnZpY2VzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi94bWwvQWJzdHJhY3RTQVhQYXJzZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi94bWwvQWJzdHJhY3RTQVhQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGM5MWExZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24veG1sL0Fic3RyYWN0U0FYUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBTQVggcGFyc2VyIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGFyc2UgYSBzaW5nbGUgWE1MIGZpbGUgb3IgYQotICogZGlyZWN0b3J5IG9mIFhNTCBmaWxlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNBWFBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLQotCS8qKgotCSAqIFRoZSBsb2dnZXIgdXNlZCBmb3IgbG9nZ2luZyB3YXJuaW5ncywgZXJyb3JzIGFuZCBleGNlcHRpb25zLgotCSAqLwotCXByb3RlY3RlZCBMb2dnZXIgbG9nZ2VyOwotCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgWE1MIGZpbGUgYmVpbmcgcGFyc2VkLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgeG1sRmlsZTsKLQotCS8qKgotCSAqIFRoZSBTdHJpbmcgYnVmZmVyIGZvciBhY2N1bXVsYXRpbmcgdGV4dC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIHN0ckJ1ZjsKLQotCS8qKgotCSAqIFRoZSBYTUwgdmFsaWRhdGluZyBmbGFnLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0aW5nOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdFNheFBhcnNlcjwvY29kZT4gZ2l2ZW4gdGhlIHZhbGlkYXRpbmcgZmxhZy4KLQkgKiAKLQkgKiBAcGFyYW0gbG9nZ2VyCi0JICogICAgICAgICAgICBUaGUgbG9nZ2VyIGZvciBsb2dnaW5nIHdhcm5pbmdzIGFuZCBlcnJvcnMuCi0JICogQHBhcmFtIHZhbGlkYXRpbmcKLQkgKiAgICAgICAgICAgIElmIHRydWUsIHZhbGlkYXRlIHRoZSBYTUwgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIEFic3RyYWN0U0FYUGFyc2VyKExvZ2dlciBsb2dnZXIsIGJvb2xlYW4gdmFsaWRhdGluZykgewotCQl0aGlzLmxvZ2dlciA9IGxvZ2dlcjsKLQkJdGhpcy52YWxpZGF0aW5nID0gdmFsaWRhdGluZzsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIGdpdmVuIFhNTCBkaXJlY3Rvcnkgb3IgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0geG1sUGF0aAotCSAqICAgICAgICAgICAgVGhlIFhNTCBkaXJlY3Rvcnkgb3IgZmlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZShTdHJpbmcgeG1sUGF0aCkgewotCQlTdHJpbmcgcGF0aE5hbWUgPSBTdHJVdGlsLnJlcGxhY2UoeG1sUGF0aCwgIiUyMCIsICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlGaWxlIHBhdGggPSBuZXcgRmlsZShwYXRoTmFtZSk7Ci0JCUZpbGVbXSBmaWxlcyA9IHBhdGguaXNGaWxlKCkgPyBuZXcgRmlsZVtdIHsgcGF0aCB9IDogcGF0aC5saXN0RmlsZXMoKTsKLQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIWZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBhcnNlRmlsZShmaWxlc1tpXS5nZXRBYnNvbHV0ZUZpbGUoKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlpZiAobG9nZ2VyICE9IG51bGwpIHsKLQkJCQkJCQlsb2dnZXIKLQkJCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCQkJIkZhaWxlZCB0byBwYXJzZSBcIiIgKyBmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSArICciJywgZSk7IC8vJE5PTi1OTFMtMSQJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFBhcnNlcyB0aGUgZ2l2ZW4gWE1MIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHhtbEZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgZmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZUZpbGUoRmlsZSB4bWxGaWxlKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwKLQkJCUlPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCQkvLyBDcmVhdGUgdGhlIFNBWCBwYXJzZXIgZmFjdG9yeS4KLQkJU0FYUGFyc2VyRmFjdG9yeSBzcGYgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLQkJLy8gU2V0IHRoZSBYTUwgdmFsaWRhdGluZyBmbGFnLgotCQlzcGYuc2V0VmFsaWRhdGluZyh2YWxpZGF0aW5nKTsKLQotCQkvLyBDcmVhdGUgdGhlIFNBWCBwYXJzZXIuCi0JCVNBWFBhcnNlciBzYXhQYXJzZXIgPSBzcGYubmV3U0FYUGFyc2VyKCk7Ci0KLQkJLy8gR2V0IHRoZSBTQVggWE1MIHJlYWRlci4KLQkJWE1MUmVhZGVyIHhtbFJlYWRlciA9IHNheFBhcnNlci5nZXRYTUxSZWFkZXIoKTsKLQotCQkvLyBTZXQgdGhlIFNBWCBwYXJzZXIgaGFuZGxlcnMgdG8gdGhpcyBjbGFzcy4KLQkJeG1sUmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKHRoaXMpOwotCQl4bWxSZWFkZXIuc2V0RXJyb3JIYW5kbGVyKHRoaXMpOwotCi0JCS8vIEluc3RydWN0IHRoZSBTQVggcGFyc2VyIHRvIHBhcnNlIHRoZSBnaXZlbiBYTUwgZmlsZS4KLQkJdGhpcy54bWxGaWxlID0geG1sRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJeG1sUmVhZGVyLnBhcnNlKE5ldFV0aWwuZ2V0VXJpKHhtbEZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgWE1MIHBhcnNlciBzdGFydHMgdG8gcGFyc2UgdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB7Ci0JCXN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgdGhlIFhNTCBwYXJzZXIgZW5jb3VudGVycyB0aGUgY2hhcmFyYWN0ZXIgZGF0YSB3aXRoaW4gYQotCSAqIHRleHQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBidWZmZXIsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlzdHJCdWYuYXBwZW5kKGJ1ZmZlciwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIHBhcnNlciBzdGFydHMgdG8gcGFyc2UgZWFjaCBuZXcgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSTCwgU3RyaW5nIGxvY2FsTmFtZSwKLQkJCVN0cmluZyBxbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKTsKLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBYTUwgcGFyc2VyIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgYW4gZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBlbmRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkwsIFN0cmluZyBsb2NhbE5hbWUsCi0JCQlTdHJpbmcgcW5hbWUpOwotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIFhNTCBwYXJzZXIgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBTQVggcGFyc2luZyB3YXJuaW5nLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBUaGUgU0FYIHBhcnNlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKLQkJaWYgKGxvZ2dlciAhPSBudWxsKSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ1dhcm5pbmcoIlNBWCBwYXJzaW5nIHdhcm5pbmcgZW5jb3VudGVyZWQgYXQgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBYTUxVdGlsLmdldExvY2F0aW9uT2ZFeGNlcHRpb24oZSkKLQkJCQkJCQkrICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIFNBWCBwYXJzaW5nIGVycm9yLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBUaGUgU0FYIHBhcnNlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCWlmIChsb2dnZXIgIT0gbnVsbCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigiU0FYIHBhcnNpbmcgZXJyb3IgZW5jb3VudGVyZWQgYXQgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBYTUxVdGlsLmdldExvY2F0aW9uT2ZFeGNlcHRpb24oZSkKLQkJCQkJCQkrICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIFNBWCBub24tcmVjb3ZlcmFibGUgZXJyb3IgYW5kIGV4aXRzLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBUaGUgU0FYIHBhcnNlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAobG9nZ2VyICE9IG51bGwpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoIlNBWCBwYXJzaW5nIGZhdGFsIGVycm9yIGVuY291bnRlcmVkIGF0ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgWE1MVXRpbC5nZXRMb2NhdGlvbk9mRXhjZXB0aW9uKGUpCi0JCQkJCQkJKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IFhNTCBmaWxlIHRoYXQgaXMgYmVpbmcgcGFyc2VkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIFhNTCBmaWxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0WE1MRmlsZSgpIHsKLQkJcmV0dXJuIHhtbEZpbGU7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3htbC9YU0xUUHJvY2Vzc29yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24veG1sL1hTTFRQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjM3MzEzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24veG1sL1hTTFRQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnhtbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci0KLS8qKgotICogQSB3cmFwcGVyIG92ZXIgdGhlIFhTTFQgcHJvY2Vzc29yIGJ1bmRsZWQgd2l0aCB0aGUgSlJFLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhTTFRQcm9jZXNzb3IgewotCi0JLy8gSWYgdHJ1ZSwgY2FjaGUgdGhlIGNvbXBpbGVkIHRoZSBYU0wgdHJhbnNmb3JtZXIgd2l0aCB0aGUgY29tcGlsZWQgWFNMCi0JLy8gdGVtcGxhdGVzLgotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2FjaGVYU0w7Ci0KLQkvLyBDYWNoZXMgdGhlIFhTTCB0cmFuc2Zvcm1lcnMuCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgVHJhbnNmb3JtZXI+IHRyYW5zZm9ybWVyQ2FjaGU7Ci0KLQlzdGF0aWMgewotCQlTdHJpbmcgY2FjaGVYU0xQcm9wZXJ0eSA9IENvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nKAotCQkJCSJjYWNoZVhTTCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChjYWNoZVhTTFByb3BlcnR5ICE9IG51bGwgJiYgIWNhY2hlWFNMUHJvcGVydHkuc3RhcnRzV2l0aCgiWyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWNhY2hlWFNMID0gQm9vbGVhbi5nZXRCb29sZWFuKGNhY2hlWFNMUHJvcGVydHkpOwotCQl9IGVsc2UgewotCQkJY2FjaGVYU0wgPSB0cnVlOwotCQl9Ci0JCWlmIChjYWNoZVhTTCkgewotCQkJdHJhbnNmb3JtZXJDYWNoZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgVHJhbnNmb3JtZXI+KCk7Ci0JCX0KLQkJCi0JCS8vIEluY3JlYXNlIHRoZSBlbnRpdHkgZXhwYW5zaW9uIGxpbmUgbGltaXQgdG8gaGFuZGxlIGEgbGFyZ2VyIG51bWJlciBvZiBYTUwgZW50aXRpZXMuIAotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImVudGl0eUV4cGFuc2lvbkxpbWl0IiwgIjEwMDAwMDAiKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IHByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcKLQkgKiBpbnN0YW50aWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBYU0xUUHJvY2Vzc29yKCkgewotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzb3VyY2UsIFhNTCBzb3VyY2UsIHRhcmdldAotCSAqIG91dHB1dCBhbmQgZW5jb2RpbmcuCi0JICogCi0JICogQHBhcmFtIHhzbFNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzb3VyY2UuCi0JICogQHBhcmFtIHhtbFNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIFhNTCBzb3VyY2UuCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCB0YXJnZXQuCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24uCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICogICAgICAgICAgICBUaGUgdGFyZ2V0IGVuY29kaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU291cmNlIHhzbFNvdXJjZSwgU291cmNlIHhtbFNvdXJjZSwKLQkJCVdyaXRlciBvdXRwdXQsIFByb3BlcnRpZXMgcGFyYW1zLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoeHNsU291cmNlICE9IG51bGwgJiYgeG1sU291cmNlICE9IG51bGwpIHsKLQkJCVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gbnVsbDsKLQkJCVN0cmluZyB4c2xGaWxlID0geHNsU291cmNlLmdldFN5c3RlbUlkKCk7Ci0JCQlpZiAoY2FjaGVYU0wgJiYgeHNsRmlsZSAhPSBudWxsKSB7Ci0JCQkJc3luY2hyb25pemVkICh0cmFuc2Zvcm1lckNhY2hlKSB7Ci0JCQkJCXRyYW5zZm9ybWVyID0gKFRyYW5zZm9ybWVyKSB0cmFuc2Zvcm1lckNhY2hlLmdldCh4c2xGaWxlKTsKLQkJCQkJaWYgKHRyYW5zZm9ybWVyID09IG51bGwpIHsKLQkJCQkJCVRyYW5zZm9ybWVyRmFjdG9yeSBmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Ci0JCQkJCQkJCS5uZXdJbnN0YW5jZSgpOwotCQkJCQkJdHJhbnNmb3JtZXIgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKHhzbFNvdXJjZSk7Ci0JCQkJCQl0cmFuc2Zvcm1lckNhY2hlLnB1dCh4c2xGaWxlLCB0cmFuc2Zvcm1lcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVRyYW5zZm9ybWVyRmFjdG9yeSBmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCQkJdHJhbnNmb3JtZXIgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKHhzbFNvdXJjZSk7Ci0JCQl9Ci0JCQlpZiAocGFyYW1zICE9IG51bGwgJiYgcGFyYW1zLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBwYXJhbXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVN0cmluZyBwYXJhbU5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCQkJU3RyaW5nIHBhcmFtVmFsdWUgPSBwYXJhbXMuZ2V0UHJvcGVydHkocGFyYW1OYW1lKTsKLQkJCQkJdHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGVuY29kaW5nICE9IG51bGwgJiYgZW5jb2RpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoImVuY29kaW5nIiwgZW5jb2RpbmcpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJlbmNvZGluZyIsICJ1dGYtOCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCXRyYW5zZm9ybWVyLnRyYW5zZm9ybSh4bWxTb3VyY2UsIG5ldyBTdHJlYW1SZXN1bHQob3V0cHV0KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc291cmNlLCBYTUwgc291cmNlLCB0YXJnZXQKLQkgKiBvdXRwdXQgYW5kIGVuY29kaW5nLgotCSAqIAotCSAqIEBwYXJhbSB4c2xTb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc291cmNlLgotCSAqIEBwYXJhbSB4bWxTb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc291cmNlLgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgdGFyZ2V0LgotCSAqIEBwYXJhbSBlbmNvZGluZwotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBlbmNvZGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFNvdXJjZSB4c2xTb3VyY2UsIFNvdXJjZSB4bWxTb3VyY2UsCi0JCQlXcml0ZXIgb3V0cHV0LCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQl0cmFuc2Zvcm0oeHNsU291cmNlLCB4bWxTb3VyY2UsIG91dHB1dCwgbnVsbCwgZW5jb2RpbmcpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzdHlsZXNoZWV0IFVSSSwgWE1MIHNvdXJjZSwKLQkgKiB0YXJnZXQgb3V0cHV0IGFuZCBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc291cmNlLgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgdGFyZ2V0LgotCSAqIEBwYXJhbSBwYXJhbXMKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uLgotCSAqIEBwYXJhbSBlbmNvZGluZwotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBlbmNvZGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFN0cmluZyB4c2xVcmksIFNvdXJjZSB4bWxTb3VyY2UsCi0JCQlXcml0ZXIgb3V0cHV0LCBQcm9wZXJ0aWVzIHBhcmFtcywgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0geHNsSW5wdXQgPSBnZXRYc2xJbnB1dFN0cmVhbSh4c2xVcmkpOwotCQlpZiAoeHNsSW5wdXQgIT0gbnVsbCkgewotCQkJU3RyZWFtU291cmNlIHhzbFNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoeHNsSW5wdXQpOwotCQkJeHNsU291cmNlLnNldFN5c3RlbUlkKG5ldyBGaWxlKHhzbFVyaSkpOwotCQkJdHJhbnNmb3JtKHhzbFNvdXJjZSwgeG1sU291cmNlLCBvdXRwdXQsIHBhcmFtcywgZW5jb2RpbmcpOwotCQkJdHJ5IHsKLQkJCQl4c2xJbnB1dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzdHlsZXNoZWV0IFVSSSwgWE1MIHNvdXJjZSwKLQkgKiB0YXJnZXQgb3V0cHV0IGFuZCBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc291cmNlLgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgdGFyZ2V0LgotCSAqIEBwYXJhbSBlbmNvZGluZwotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBlbmNvZGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFN0cmluZyB4c2xVcmksIFNvdXJjZSB4bWxTb3VyY2UsCi0JCQlXcml0ZXIgb3V0cHV0LCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQl0cmFuc2Zvcm0oeHNsVXJpLCB4bWxTb3VyY2UsIG91dHB1dCwgbnVsbCwgZW5jb2RpbmcpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzdHlsZXNoZWV0IFVSSSwgWE1MIHN0cmluZywKLQkgKiB0YXJnZXQgb3V0cHV0IGFuZCBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc3RyaW5nLgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgdGFyZ2V0LgotCSAqIEBwYXJhbSBwYXJhbXMKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uLgotCSAqIEBwYXJhbSBlbmNvZGluZwotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBlbmNvZGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFN0cmluZyB4c2xVcmksIFN0cmluZyB4bWxTdHIsIFdyaXRlciBvdXRwdXQsCi0JCQlQcm9wZXJ0aWVzIHBhcmFtcywgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0geHNsSW5wdXQgPSBnZXRYc2xJbnB1dFN0cmVhbSh4c2xVcmkpOwotCQlpZiAoeHNsSW5wdXQgIT0gbnVsbCkgewotCQkJU3RyZWFtU291cmNlIHhzbFNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoeHNsSW5wdXQpOwotCQkJeHNsU291cmNlLnNldFN5c3RlbUlkKG5ldyBGaWxlKHhzbFVyaSkpOwotCi0JCQlieXRlW10geG1sID0geG1sU3RyLmdldEJ5dGVzKCJ1dGYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSB4bWxJbnB1dCA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWwpOwotCQkJU3RyZWFtU291cmNlIHhtbFNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoeG1sSW5wdXQpOwotCi0JCQl0cmFuc2Zvcm0oeHNsU291cmNlLCB4bWxTb3VyY2UsIG91dHB1dCwgcGFyYW1zLCBlbmNvZGluZyk7Ci0KLQkJCXRyeSB7Ci0JCQkJeHNsSW5wdXQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc3R5bGVzaGVldCBVUkksIFhNTCBzdHJpbmcsCi0JICogdGFyZ2V0IG91dHB1dCBhbmQgZW5jb2RpbmcuCi0JICogCi0JICogQHBhcmFtIHhzbFVSSQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzdHlsZXNoZWV0IFVSSS4KLQkgKiBAcGFyYW0geG1sU3RyCi0JICogICAgICAgICAgICBUaGUgWE1MIHN0cmluZy4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHRhcmdldC4KLQkgKiBAcGFyYW0gZW5jb2RpbmcKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgZW5jb2RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybShTdHJpbmcgeHNsVXJpLCBTdHJpbmcgeG1sU3RyLCBXcml0ZXIgb3V0cHV0LAotCQkJU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJhbnNmb3JtKHhzbFVyaSwgeG1sU3RyLCBvdXRwdXQsIG51bGwsIGVuY29kaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc3R5bGVzaGVldCBVUkksIFhNTCBzdHJpbmcsCi0JICogdGFyZ2V0IG91dHB1dCBhbmQgZW5jb2RpbmcuCi0JICogCi0JICogQHBhcmFtIHhzbFVSSQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzdHlsZXNoZWV0IFVSSS4KLQkgKiBAcGFyYW0geG1sU3RyCi0JICogICAgICAgICAgICBUaGUgWE1MIHN0cmluZy4KLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCBmaWxlLgotCSAqIEBwYXJhbSBwYXJhbXMKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uLgotCSAqIEBwYXJhbSBlbmNvZGluZwotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBlbmNvZGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFN0cmluZyB4c2xVcmksIFN0cmluZyB4bWxTdHIsIEZpbGUgZmlsZSwKLQkJCVByb3BlcnRpZXMgcGFyYW1zLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQlGaWxlV3JpdGVyIG91dHB1dCA9IG5ldyBGaWxlV3JpdGVyKGZpbGUpOwotCQlpZiAob3V0cHV0ICE9IG51bGwpIHsKLQkJCXRyYW5zZm9ybSh4c2xVcmksIHhtbFN0ciwgb3V0cHV0LCBwYXJhbXMsIGVuY29kaW5nKTsKLQkJCXRyeSB7Ci0JCQkJb3V0cHV0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHN0eWxlc2hlZXQgVVJJLCBYTUwgc3RyaW5nLAotCSAqIHRhcmdldCBvdXRwdXQgYW5kIGVuY29kaW5nLgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzdHJpbmcuCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgZmlsZS4KLQkgKiBAcGFyYW0gZW5jb2RpbmcKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgZW5jb2RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybShTdHJpbmcgeHNsVXJpLCBTdHJpbmcgeG1sU3RyLCBGaWxlIGZpbGUsCi0JCQlTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQl0cmFuc2Zvcm0oeHNsVXJpLCB4bWxTdHIsIGZpbGUsIG51bGwsIGVuY29kaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc3R5bGVzaGVldCBVUkksIFhNTCBzb3VyY2UKLQkgKiBhbmQgdGFyZ2V0IG91dHB1dC4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc291cmNlLgotCSAqIEBwYXJhbSBwYXJhbXMKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uLgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU3RyaW5nIHhzbFVyaSwgU291cmNlIHhtbFNvdXJjZSwKLQkJCVByb3BlcnRpZXMgcGFyYW1zLCBXcml0ZXIgb3V0cHV0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJhbnNmb3JtKHhzbFVyaSwgeG1sU291cmNlLCBvdXRwdXQsIHBhcmFtcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHN0eWxlc2hlZXQgVVJJLCBYTUwgc291cmNlCi0JICogYW5kIHRhcmdldCBvdXRwdXQuCi0JICogCi0JICogQHBhcmFtIHhzbFVSSQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzdHlsZXNoZWV0IFVSSS4KLQkgKiBAcGFyYW0geG1sU3RyCi0JICogICAgICAgICAgICBUaGUgWE1MIHNvdXJjZS4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHRhcmdldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFN0cmluZyB4c2xVcmksIFNvdXJjZSB4bWxTb3VyY2UsIFdyaXRlciBvdXRwdXQpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJhbnNmb3JtKHhzbFVyaSwgeG1sU291cmNlLCBvdXRwdXQsIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzdHlsZXNoZWV0IFVSSSwgWE1MIHN0cmluZwotCSAqIGFuZCB0YXJnZXQgb3V0cHV0LgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzdHJpbmcuCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24uCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybShTdHJpbmcgeHNsVXJpLCBTdHJpbmcgeG1sU3RyLAotCQkJUHJvcGVydGllcyBwYXJhbXMsIFdyaXRlciBvdXRwdXQpIHRocm93cyBFeGNlcHRpb24gewotCQl0cmFuc2Zvcm0oeHNsVXJpLCB4bWxTdHIsIG91dHB1dCwgcGFyYW1zLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc3R5bGVzaGVldCBVUkksIFhNTCBzdHJpbmcKLQkgKiBhbmQgdGFyZ2V0IG91dHB1dC4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc3RyaW5nLgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU3RyaW5nIHhzbFVyaSwgU3RyaW5nIHhtbFN0ciwgV3JpdGVyIG91dHB1dCkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQl0cmFuc2Zvcm0oeHNsVXJpLCB4bWxTdHIsIG91dHB1dCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHN0eWxlc2hlZXQgVVJJLCBYTUwgc3RyaW5nCi0JICogYW5kIHRhcmdldCBvdXRwdXQgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc3RyaW5nLgotCSAqIEBwYXJhbSBwYXJhbXMKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uLgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU3RyaW5nIHhzbFVyaSwgU3RyaW5nIHhtbFN0ciwKLQkJCVByb3BlcnRpZXMgcGFyYW1zLCBGaWxlIGZpbGUpIHRocm93cyBFeGNlcHRpb24gewotCQl0cmFuc2Zvcm0oeHNsVXJpLCB4bWxTdHIsIGZpbGUsIHBhcmFtcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHN0eWxlc2hlZXQgVVJJLCBYTUwgc3RyaW5nCi0JICogYW5kIHRhcmdldCBvdXRwdXQgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc3RyaW5nLgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU3RyaW5nIHhzbFVyaSwgU3RyaW5nIHhtbFN0ciwgRmlsZSBmaWxlKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyYW5zZm9ybSh4c2xVcmksIHhtbFN0ciwgZmlsZSwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgWFNMIGlucHV0IHN0cmVhbSBnaXZlbiB0aGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0WHNsSW5wdXRTdHJlYW0oU3RyaW5nIHhzbFVyaSkgewotCQlJbnB1dFN0cmVhbSB4c2xJbnB1dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl4c2xJbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oeHNsVXJpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmICh4c2xJbnB1dCA9PSBudWxsKSB7Ci0JCQkJeHNsSW5wdXQgPSBYU0xUUHJvY2Vzc29yLmNsYXNzLmdldENsYXNzTG9hZGVyKCkKLQkJCQkJCS5nZXRSZXNvdXJjZUFzU3RyZWFtKHhzbFVyaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHhzbElucHV0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3htbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24veG1sL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODJjYTc0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24veG1sL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIFhNTCBhbmQgWFNMVCBwcm9jZXNzaW5nIHNlcnZpY2VzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxYjllODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE1MjlmMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcsCi0gb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbnRlcm5hbC5pbXBvcnRpbmcsCi0gb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzN2Q5ODQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjYyNmM1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi1wbHVnaW5OYW1lPUVQRiBEYXRhIEV4Y2hhbmdlIFBsdWctaW4KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbXBvcnRpbmcvTGlicmFyeVNlcnZpY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbXBvcnRpbmcvTGlicmFyeVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWU0NzIzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW1wb3J0aW5nL0xpYnJhcnlTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW50ZXJuYWwuaW1wb3J0aW5nLkxpYnJhcnlTZXJ2aWNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLQotLyoqCi0gKiBMaWJyYXJ5IHNlcnZpY2UgZm9yIGltcG9ydGluZyBleHRlcm5hbCBsaWJyYXJ5L3BsdWdpbnMgaW50byB0aGUgY3VycmVudCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBMaWJyYXJ5U2VydmljZSB7Ci0KLQlwdWJsaWMgc3RhdGljIExpYnJhcnlTZXJ2aWNlIElOU1RBTkNFID0gbmV3IExpYnJhcnlTZXJ2aWNlSW1wbCgpOwotCS8qKgotCSAqIGNyZWF0ZSBhIG5ldyBNZXRob2RQbHVnaW4gYW5kIGFkZCB0byB0aGUgbGlicmFyeSwgcGVyZm9ybSBpbml0aWFsaXphdGlvbiBhcyBuZWVkZWQKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gTWV0aG9kUGx1Z2luIAotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW4gY3JlYXRlUGx1Z2luKFN0cmluZyBuYW1lLCBTdHJpbmcgZ3VpZCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIE1ldGhvZENvbmZpZ3VyYXRpb24gZm9yIHRoaXMgbGlicmFyeQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBNZXRob2RDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gY3JlYXRlQ29uZmlndXJhdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGd1aWQpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgcGx1Z2luIHNlcnZpY2UgZm9yIHRoZSBzcGVjaWZpZWQgcGx1Z2luCi0JICogQHBhcmFtIHBsdWdpbiBNZXRob2RQbHVnaW4KLQkgKiBAcmV0dXJuIFBsdWdpblNlcnZpY2UKLQkgKi8KLQlwdWJsaWMgUGx1Z2luU2VydmljZSBjcmVhdGVQbHVnaW5TZXJ2aWNlKE1ldGhvZFBsdWdpbiBwbHVnaW4pOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbXBvcnRpbmcvUGx1Z2luU2VydmljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ltcG9ydGluZy9QbHVnaW5TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU0NTU2MzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ltcG9ydGluZy9QbHVnaW5TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogUGx1Z2luIHNlcnZpY2UgZm9yIGltcG9ydGluZyBleHRlcm5hbCBwbHVnaW4gZGF0YSBpbnRvIHRoZSBjdXJyZW50IGxpYnJhcnkKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGx1Z2luU2VydmljZSB7Ci0KLQlwdWJsaWMgQ29udGVudFBhY2thZ2UgZ2V0Q29udGVudFBhY2thZ2VSb290KCk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBEaXNjaXBsaW5lIG9iamVjdCBhZGQgYWRkIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBEaXNjaXBsaW5lcyBwYWNrYWdlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIERpc2NpcGxpbmUKLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZSBjcmVhdGVEaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBEaXNjaXBsaW5lR3JvdXBpbmcgb2JqZWN0IGFkZCBhZGQgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IERpc2NpcGxpbmVzIHBhY2thZ2UKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gRGlzY2lwbGluZUdyb3VwaW5nCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVHcm91cGluZyBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIFRvb2wgb2JqZWN0IGFkZCBhZGQgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IFRvb2xzIHBhY2thZ2UKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gVG9vbAotCSAqLwotCXB1YmxpYyBUb29sIGNyZWF0ZVRvb2woKTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIERvbWFpbiBvYmplY3QgYWRkIGFkZCB0byB0aGUgc3lzdGVtIGRlZmF1bHQgRG9tYWlucyBwYWNrYWdlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIERvbWFpbgotCSAqLwotCXB1YmxpYyBEb21haW4gY3JlYXRlRG9tYWluKCk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBXb3JrUHJvZHVjdFR5cGUgb2JqZWN0IGFkZCBhZGQgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IFdvcmtQcm9kdWN0VHlwZXMgcGFja2FnZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBXb3JrUHJvZHVjdFR5cGUKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUeXBlIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgUm9sZVNldCBvYmplY3QgYWRkIGFkZCB0byB0aGUgc3lzdGVtIGRlZmF1bHQgUm9sZVNldHMgcGFja2FnZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBSb2xlU2V0Ci0JICovCi0JcHVibGljIFJvbGVTZXQgY3JlYXRlUm9sZVNldCgpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgUm9sZVNldEdyb3VwaW5nIG9iamVjdCBhZGQgYWRkIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBSb2xlU2V0cyBwYWNrYWdlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIFJvbGVTZXRHcm91cGluZwotCSAqLwotCXB1YmxpYyBSb2xlU2V0R3JvdXBpbmcgY3JlYXRlUm9sZVNldEdyb3VwaW5nKCk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBDdXN0b21DYXRlZ29yeSBvYmplY3QgYWRkIGFkZCB0byB0aGUgc3lzdGVtIGRlZmF1bHQgQ3VzdG9tQ2F0ZWdvcmllcyBwYWNrYWdlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIEN1c3RvbUNhdGVnb3J5Ci0JICovCi0JcHVibGljIEN1c3RvbUNhdGVnb3J5IGNyZWF0ZUN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IHBhcmVudCk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBDYXBhYmlsaXR5UGF0dGVybiBvYmplY3QgYWRkIGFkZCB0byB0aGUgc3lzdGVtIGRlZmF1bHQgQ2FwYWJpbGl0eVBhdHRlcm5zIHBhY2thZ2UKLQkgKiBwZXJmb3JtIG90aGVyIGluaXRpYWxpemF0aW9ucyBhcyBuZWVkZWQsIHN1Y2ggYXMgY3JlYXRlIHRoZSBjb250YWluaW5nIFByb2Nlc3NDb21wb25lbnQuCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIFByb2Nlc3NTZXJ2aWNlIGEgUHJvY2Vzc1NlcnZpY2UgdGhhdCBjb250YWlucyB0aGUgY3JlYXRlZCBDYXBhYmlsaXR5UGF0dGVybgotCSAqLwotCXB1YmxpYyBDYXBhYmlsaXR5UGF0dGVybiBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybihNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgRGVsaXZlcnlQcm9jZXNzIG9iamVjdCBhZGQgYWRkIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBEZWxpdmVyeVByb2Nlc3NlcyBwYWNrYWdlLgotCSAqIHBlcmZvcm0gb3RoZXIgaW5pdGlhbGl6YXRpb25zIGFzIG5lZWRlZCwgc3VjaCBhcyBjcmVhdGUgdGhlIGNvbnRhaW5pbmcgUHJvY2Vzc0NvbXBvbmVudC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gUHJvY2Vzc1NlcnZpY2UgYSBQcm9jZXNzU2VydmljZSB0aGF0IGNvbnRhaW5zIHRoZSBjcmVhdGVkIERlbGl2ZXJ5UHJvY2VzcwotCSAqLwotCXB1YmxpYyBEZWxpdmVyeVByb2Nlc3MgY3JlYXRlRGVsaXZlcnlQcm9jZXNzKE1ldGhvZENvbmZpZ3VyYXRpb24gZGVmYXVsdENvbmZpZyk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBjb250ZW50IHBhY2thZ2UgYXMgdGhlIGNoaWxkIG9mIHRoZSBpbnRlcm5hbCByb290IGNvbnRlbnQgcGFja2FnZSwKLQkgKiBAcmV0dXJuIENvbnRlbnRQYWNrYWdlU2VydmljZSBhIENvbnRlbnRQYWNrYWdlU2VydmljZSB0aGF0IGNvbnRhaW5zIHRoZSBjcmVhdGVkIENvbnRlbnRQYWNrYWdlCi0JICovCi0JcHVibGljIENvbnRlbnRQYWNrYWdlIGNyZWF0ZUNvbnRlbnRQYWNrYWdlKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0KLQotCS8qKgotCSAqIGNyZWF0ZSBhIG5ldyBjaGlsZCBwYWNrYWdlCi0JICogQHJldHVybiBDb250ZW50UGFja2FnZVNlcnZpY2UgYSBDb250ZW50UGFja2FnZVNlcnZpY2UgZm9yIHRoZSBjcmVhdGVkIHBhY2thZ2UKLQkgKi8KLQkvL3B1YmxpYyBDb250ZW50UGFja2FnZSBjcmVhdGVDaGlsZFBhY2thZ2UoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQotCXB1YmxpYyBBcnRpZmFjdCBjcmVhdGVBcnRpZmFjdChDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBDaGVja2xpc3QgY3JlYXRlQ2hlY2tsaXN0KENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIENvbmNlcHQgY3JlYXRlQ29uY2VwdChDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBEZWxpdmVyYWJsZSBjcmVhdGVEZWxpdmVyYWJsZShDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBFeGFtcGxlIGNyZWF0ZUV4YW1wbGUoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgR3VpZGFuY2UgY3JlYXRlR3VpZGFuY2UoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgT3V0Y29tZSBjcmVhdGVPdXRjb21lKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIFByYWN0aWNlIGNyZWF0ZVByYWN0aWNlKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIFJlcG9ydCBjcmVhdGVSZXBvcnQoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgUmV1c2FibGVBc3NldCBjcmVhdGVSZXVzYWJsZUFzc2V0KENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIFJvYWRtYXAgY3JlYXRlUm9hZG1hcChDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBSb2xlIGNyZWF0ZVJvbGUoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBUYXNrIGNyZWF0ZVRhc2soQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgVGVtcGxhdGUgY3JlYXRlVGVtcGxhdGUoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgVGVybURlZmluaXRpb24gY3JlYXRlVGVybURlZmluaXRpb24oQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgVG9vbE1lbnRvciBjcmVhdGVUb29sTWVudG9yKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIFdoaXRlcGFwZXIgY3JlYXRlV2hpdGVwYXBlcihDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCi0KLQkvKioKLQkgKiBjcmVhdGUgYSBuZXcgQWN0aXZpdHkgYXMgYSBicmVha2Rvd24gZWxlbWVudCBvZiB0aGUgc2VydmljaW5nIGVsZW1lbnQuCi0JICogQHJldHVybiBBY3Rpdml0eQotCSAqLwotCXB1YmxpYyBBY3Rpdml0eSBjcmVhdGVBY3Rpdml0eShBY3Rpdml0eSBzdXBlckFjdGl2aXR5KTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIG5ldyBQaGFzZSBhcyBhIGJyZWFrZG93biBlbGVtZW50IG9mIHRoZSBzZXJ2aWNpbmcgZWxlbWVudC4KLQkgKiBAcmV0dXJuIFBoYXNlCi0JICovCi0JcHVibGljIFBoYXNlIGNyZWF0ZVBoYXNlKEFjdGl2aXR5IHN1cGVyQWN0aXZpdHkpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgbmV3IEl0ZXJhdGlvbiBhcyBhIGJyZWFrZG93biBlbGVtZW50IG9mIHRoZSBzZXJ2aWNpbmcgZWxlbWVudC4KLQkgKiBAcmV0dXJuIEl0ZXJhdGlvbgotCSAqLwotCXB1YmxpYyBJdGVyYXRpb24gY3JlYXRlSXRlcmF0aW9uKEFjdGl2aXR5IHN1cGVyQWN0aXZpdHkpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgbmV3IE1pbGVzdG9uZSBhcyBhIGJyZWFrZG93biBlbGVtZW50IG9mIHRoZSBzZXJ2aWNpbmcgZWxlbWVudC4KLQkgKiBAcmV0dXJuIE1pbGVzdG9uZQotCSAqLwotCXB1YmxpYyBNaWxlc3RvbmUgY3JlYXRlTWlsZXN0b25lKEFjdGl2aXR5IHN1cGVyQWN0aXZpdHkpOwotCi0KLQkvKioKLQkgKiBhZGQgdGhlIHRhc2sgYW5kIGNyZWF0ZSB0aGUgYnJlYWtkb3duIGVsZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzawotCSAqIGNhbGwgdGhpcyBtZXRob2Qgb25seSB3aGVuIHRoZSBjcm9zcyByZWZlcmVuY2VzIChSb2xlcywgd29ya3Byb2R1Y3RzKSBvZiB0aGUgVGFzayBpcyBhbHJlYWR5IGVzdGFibGlzaGVkLgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgYWRkVGFza1RvQWN0aXZpdHkoQWN0aXZpdHkgYWN0LCBUYXNrIGVsZW1lbnQpOwotCi0JcHVibGljIHZvaWQgYWRkVGFza3NUb0FjdGl2aXR5KEFjdGl2aXR5IGFjdCwgTGlzdCB0YXNrcyk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbXBvcnRpbmcvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ltcG9ydGluZy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0NGJiODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ltcG9ydGluZy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgdGhlIGRhdGEgZXhjaGFuZ2Ugc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW50ZXJuYWwvaW1wb3J0aW5nL0xpYnJhcnlTZXJ2aWNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ludGVybmFsL2ltcG9ydGluZy9MaWJyYXJ5U2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTliMjZmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW50ZXJuYWwvaW1wb3J0aW5nL0xpYnJhcnlTZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbnRlcm5hbC5pbXBvcnRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTW9kZWxTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NZXRob2RMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotCi0vKioKLSAqIExpYnJhcnkgc2VydmljZSBmb3IgaW1wb3J0aW5nIGV4dGVybmFsIGxpYnJhcnkvcGx1Z2lucyBpbnRvIHRoZSBjdXJyZW50Ci0gKiBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogCi0gKiBUT0RPOiBNZXJnZSB3aXRoIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5U2VydmljZUltcGwgaW1wbGVtZW50cyBMaWJyYXJ5U2VydmljZSB7Ci0KLQlwdWJsaWMgTGlicmFyeVNlcnZpY2VJbXBsKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuTGlicmFyeVNlcnZpY2UjY3JlYXRlUGx1Z2luKFN0cmluZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW4gY3JlYXRlUGx1Z2luKFN0cmluZyBuYW1lLCBTdHJpbmcgZ3VpZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RQbHVnaW4oKTsKLQkJcGx1Z2luLnNldE5hbWUobmFtZSk7Ci0JCXBsdWdpbi5zZXRHdWlkKGd1aWQpOwotCi0JCS8vIGluaXRpYWxpemUgdGhlIHBsdWdpbgotCQlwbHVnaW4gPSBNb2RlbFN0b3JhZ2UuaW5pdGlhbGl6ZShwbHVnaW4pOwotCi0JCS8vIE1VU1Qgc2F2ZSB0aGUgcGx1Z2luIGJlZm9yZSBwcm9jZXNzIGFueXRoaW5nIGVsc2UKLQkJLy8gdGhpcyBtZXRob2QgY2FsbCB3aWxsIGNhdXNlIHJlc291cmNlIHJlZnJlc2ggd2hpY2ggaXMgbm90IGRlc2lyZWQgaW4KLQkJLy8gdGhlIGltcG9ydGluZyBwcm9jZXNzCi0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQkKLQkJbGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCkuYWRkKHBsdWdpbik7Ci0JCQotCQkvLyAxNTAwNjMgLSBYTUwgaW1wb3J0OiBDUC9EUHMgYXJlIHVucmVzb3ZsZWQgYWZ0ZXIgWE1MIHBsdWdpbiBpbXBvcnQgCi0JCS8vIG5lZWQgdG8gc2F2ZSB0aHQgbGlicmFyeSBhbmQgcGx1Z2luIHJlc291cmNlcyBzcGVjaWZpY2FsbHksIGNhbid0IHVzZSBzYXZlTGlicmFyeQotLy8JCUxpYnJhcnlVdGlsLnNhdmVMaWJyYXJ5KGxpYnJhcnksIGZhbHNlLCBmYWxzZSk7Ci0JCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0Uuc2F2ZShsaWJyYXJ5LmVSZXNvdXJjZSgpKTsKLQkJTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5zYXZlKHBsdWdpbi5lUmVzb3VyY2UoKSk7Ci0KLQkJLy8gc3RpbGwgbWFyayB0aGUgcmVzb3VyY2UgYXMgZGlydHkKLQkJbGlicmFyeS5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJcGx1Z2luLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuTGlicmFyeVNlcnZpY2UjY3JlYXRlQ29uZmlndXJhdGlvbihTdHJpbmcsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVDb25maWd1cmF0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgZ3VpZCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJY29uZmlnLnNldE5hbWUobmFtZSk7Ci0JCWNvbmZpZy5zZXRHdWlkKGd1aWQpOwotCi0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJYm9vbGVhbiBvbGROb3RpZnkgPSBsaWJyYXJ5LmVEZWxpdmVyKCk7Ci0JCXRyeSB7Ci0JCQlsaWJyYXJ5LmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCWxpYnJhcnkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkuYWRkKGNvbmZpZyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlsaWJyYXJ5LmVTZXREZWxpdmVyKG9sZE5vdGlmeSk7Ci0JCX0KLQotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBhIHBsdWdpbiBzZXJ2aWNlIGZvciB0aGUgc3BlY2lmaWVkIHBsdWdpbgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqIEByZXR1cm4gUGx1Z2luU2VydmljZQotCSAqLwotCXB1YmxpYyBQbHVnaW5TZXJ2aWNlIGNyZWF0ZVBsdWdpblNlcnZpY2UoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlyZXR1cm4gbmV3IFBsdWdpblNlcnZpY2VJbXBsKHBsdWdpbik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbnRlcm5hbC9pbXBvcnRpbmcvUGx1Z2luU2VydmljZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbnRlcm5hbC9pbXBvcnRpbmcvUGx1Z2luU2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTI1OTRiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW50ZXJuYWwvaW1wb3J0aW5nL1BsdWdpblNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbnRlcm5hbC5pbXBvcnRpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuV0JTRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBQbHVnaW4gc2VydmljZSBmb3IgaW1wb3J0aW5nIGV4dGVybmFsIHBsdWdpbiBkYXRhIGludG8gdGhlIGN1cnJlbnQgbGlicmFyeQotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpblNlcnZpY2VJbXBsIGltcGxlbWVudHMgUGx1Z2luU2VydmljZSB7Ci0KLQlNZXRob2RQbHVnaW4gcGx1Z2luOwotCi0JcHVibGljIFBsdWdpblNlcnZpY2VJbXBsKE1ldGhvZFBsdWdpbiBlbGVtZW50KQotCXsKLQkJcGx1Z2luID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIG1ldGhvZCBwbHVnaGluCi0JICogQHJldHVybiB7QGxpbmsgTWV0aG9kUGx1Z2lufQotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW4gZ2V0UGx1Z2luKCkKLQl7Ci0JCXJldHVybiAoTWV0aG9kUGx1Z2luKXBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjZ2V0Q29udGVudFBhY2thZ2VSb290KCkKLQkgKi8KLQlwdWJsaWMgQ29udGVudFBhY2thZ2UgZ2V0Q29udGVudFBhY2thZ2VSb290KCkKLQl7Ci0JCXJldHVybiBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlRGlzY2lwbGluZSgpCi0JICovCi0JcHVibGljIERpc2NpcGxpbmUgY3JlYXRlRGlzY2lwbGluZSgpIHsKLQkJRGlzY2lwbGluZSBkID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzY2lwbGluZSgpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSAoQ29udGVudFBhY2thZ2UpVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShnZXRQbHVnaW4oKSwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCQlwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGQpOwotCi0JCXJldHVybiBkOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKQotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lR3JvdXBpbmcgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCkgewotCQlEaXNjaXBsaW5lR3JvdXBpbmcgZCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSAoQ29udGVudFBhY2thZ2UpVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShnZXRQbHVnaW4oKSwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCQlwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGQpOwotCi0JCXJldHVybiBkOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVUb29sKCkKLQkgKi8KLQlwdWJsaWMgVG9vbCBjcmVhdGVUb29sKCkgewotCQlUb29sIHRvb2wgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUb29sKCk7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGdldFBsdWdpbigpLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoKTsKLQkJKChDb250ZW50UGFja2FnZSlwa2cpLmdldENvbnRlbnRFbGVtZW50cygpLmFkZCh0b29sKTsKLQkJcmV0dXJuIHRvb2w7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZURvbWFpbigpCi0JICovCi0JcHVibGljIERvbWFpbiBjcmVhdGVEb21haW4oKSB7Ci0JCURvbWFpbiBkID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRG9tYWluKCk7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGdldFBsdWdpbigpLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGgpOwotCQkoKENvbnRlbnRQYWNrYWdlKXBrZykuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGQpOwotCQlyZXR1cm4gZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCkKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUeXBlIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpIHsKLQkJV29ya1Byb2R1Y3RUeXBlIHcgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdFR5cGUoKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoZ2V0UGx1Z2luKCksIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCk7Ci0JCSgoQ29udGVudFBhY2thZ2UpcGtnKS5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQodyk7Ci0JCXJldHVybiB3OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVSb2xlU2V0KCkKLQkgKi8KLQlwdWJsaWMgUm9sZVNldCBjcmVhdGVSb2xlU2V0KCkgewotCQlSb2xlU2V0IHIgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlU2V0KCk7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGdldFBsdWdpbigpLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKTsKLQkJKChDb250ZW50UGFja2FnZSlwa2cpLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChyKTsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVJvbGVTZXRHcm91cGluZygpCi0JICovCi0JcHVibGljIFJvbGVTZXRHcm91cGluZyBjcmVhdGVSb2xlU2V0R3JvdXBpbmcoKSB7Ci0JCVJvbGVTZXRHcm91cGluZyByID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZVNldEdyb3VwaW5nKCk7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGdldFBsdWdpbigpLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKTsKLQkJKChDb250ZW50UGFja2FnZSlwa2cpLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChyKTsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZUN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5KQotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeSBjcmVhdGVDdXN0b21DYXRlZ29yeShDdXN0b21DYXRlZ29yeSBwYXJlbnQpIHsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoZ2V0UGx1Z2luKCksIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoKTsKLQkJQ3VzdG9tQ2F0ZWdvcnkgYyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUN1c3RvbUNhdGVnb3J5KCk7Ci0KLQkJLy8gYWxzbyBuZWVkIHRvIGFkZCB0aGUgY2F0ZWdvcnkgb2JqZWN0IGludG8gdGhlIHBhcmVudCBwYWNrYWdlCi0JCXBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoYyk7Ci0JCWlmICggcGFyZW50ICE9IG51bGwgKQotCQl7Ci0JCQkoKEN1c3RvbUNhdGVnb3J5KXBhcmVudCkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLmFkZChjKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIGFkZCB0byB0aGUgcm9vdCBjYXRlZ29yeQotCQkJVG5nVXRpbC5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkoZ2V0UGx1Z2luKCkpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5hZGQoYyk7Ci0JCX0KLQotCQlyZXR1cm4gYzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oTWV0aG9kQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgQ2FwYWJpbGl0eVBhdHRlcm4gY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29uZmlnKSB7Ci0KLQkJQ2FwYWJpbGl0eVBhdHRlcm4gY3AgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpOwotCQljcC5zZXREZWZhdWx0Q29udGV4dChkZWZhdWx0Q29uZmlnKTsKLQotCQlQcm9jZXNzUGFja2FnZSBjYXBhYmlsaXR5UGF0dGVyblBrZ3MgPSAoUHJvY2Vzc1BhY2thZ2UpVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShnZXRQbHVnaW4oKSwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGgpOwotCQlMaXN0IGl0ZW1zID0gY2FwYWJpbGl0eVBhdHRlcm5Qa2dzLmdldENoaWxkUGFja2FnZXMoKTsKLQotCQkvLyBuZWVkIHRvIGNyZWF0ZSBhIHBhY2thZ2UgZm9yIHRoaXMgY2FwYWJpbGl0eSBwYXR0ZXJuCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJDcmVhdGUgcGtnLCBUT0RJTyIpOwotCQkvLyB0byBhZGQgYSBjYXBhYmlsaXR5IHByb2Nlc3MsIHlvdSBuZWVkIHRvIGNyZWF0ZSBhIFByb2Nlc3NDb21wb25lbnQgcGFja2FnZSB0byBob2xkIHRoZSBwcm9jZXNzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudCBwYyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NDb21wb25lbnQoKTsKLQkJcGMuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCQlpdGVtcy5hZGQocGMpOwotCQlwYy5zZXRQcm9jZXNzKGNwKTsKLQotCQlyZXR1cm4gY3A7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZURlbGl2ZXJ5UHJvY2VzcyhNZXRob2RDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyBEZWxpdmVyeVByb2Nlc3MgY3JlYXRlRGVsaXZlcnlQcm9jZXNzKE1ldGhvZENvbmZpZ3VyYXRpb24gZGVmYXVsdENvbmZpZykgewotCQlEZWxpdmVyeVByb2Nlc3MgZHAgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyeVByb2Nlc3MoKTsKLQkJZHAuc2V0RGVmYXVsdENvbnRleHQoZGVmYXVsdENvbmZpZyk7Ci0KLQkJLy8gdGhpcyBpcyB0aGUgcGFja2FnZSB0aGF0IHN0b3JlcyBhbGwgY2FwYWJpbGl0eSBwYXR0ZXJucwotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gZ2V0UGx1Z2luKCk7Ci0JCVByb2Nlc3NQYWNrYWdlIGRlbGl2ZXJ5UHJvY2Vzc1BrZ3MgPSAoUHJvY2Vzc1BhY2thZ2UpVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aCk7Ci0JCUxpc3QgaXRlbXMgPSBkZWxpdmVyeVByb2Nlc3NQa2dzLmdldENoaWxkUGFja2FnZXMoKTsKLQotCQkvLyB5b3UgbmVlZCB0byBjcmVhdGUgYSBQcm9jZXNzQ29tcG9uZW50IHBhY2thZ2UgdG8gaG9sZCB0aGUgcHJvY2VzcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQgcGMgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzQ29tcG9uZW50KCk7Ci0JCXBjLnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQkJaXRlbXMuYWRkKHBjKTsKLQkJcGMuc2V0UHJvY2VzcyhkcCk7Ci0KLQkJcmV0dXJuIGRwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVDb250ZW50UGFja2FnZShDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgQ29udGVudFBhY2thZ2UgY3JlYXRlQ29udGVudFBhY2thZ2UoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0KLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudFBhY2thZ2UoKTsKLQkJaWYgKCBjb250YWluZXIgPT0gbnVsbCkKLQkJewotCQkJY29udGFpbmVyID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoZ2V0UGx1Z2luKCksIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQkJfQotCQljb250YWluZXIuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChwa2cpOwotCQlyZXR1cm4gcGtnOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVBcnRpZmFjdChDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3QgY3JlYXRlQXJ0aWZhY3QoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCUFydGlmYWN0IGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcnRpZmFjdCgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlQ2hlY2tsaXN0KENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBDaGVja2xpc3QgY3JlYXRlQ2hlY2tsaXN0KENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlDaGVja2xpc3QgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNoZWNrbGlzdCgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlQ29uY2VwdChDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgQ29uY2VwdCBjcmVhdGVDb25jZXB0KENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlDb25jZXB0IGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25jZXB0KCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVEZWxpdmVyYWJsZShDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcmFibGUgY3JlYXRlRGVsaXZlcmFibGUoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCURlbGl2ZXJhYmxlIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyYWJsZSgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlRXhhbXBsZShDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgRXhhbXBsZSBjcmVhdGVFeGFtcGxlKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlFeGFtcGxlIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFeGFtcGxlKCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVHdWlkYW5jZShDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2UgY3JlYXRlR3VpZGFuY2UoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCUd1aWRhbmNlIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkZWxpbmUoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZU91dGNvbWUoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIE91dGNvbWUgY3JlYXRlT3V0Y29tZShDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJT3V0Y29tZSBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3V0Y29tZSgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlUHJhY3RpY2UoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIFByYWN0aWNlIGNyZWF0ZVByYWN0aWNlKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlQcmFjdGljZSBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJhY3RpY2UoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVJlcG9ydChDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgUmVwb3J0IGNyZWF0ZVJlcG9ydChDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJUmVwb3J0IGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZXBvcnQoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVJldXNhYmxlQXNzZXQoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIFJldXNhYmxlQXNzZXQgY3JlYXRlUmV1c2FibGVBc3NldChDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJUmV1c2FibGVBc3NldCBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmV1c2FibGVBc3NldCgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlUm9hZG1hcChDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgUm9hZG1hcCBjcmVhdGVSb2FkbWFwKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlSb2FkbWFwIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2FkbWFwKCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVSb2xlKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBSb2xlIGNyZWF0ZVJvbGUoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCVJvbGUgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGUoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJU3VwcG9ydGluZ01hdGVyaWFsIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVRhc2soQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIFRhc2sgY3JlYXRlVGFzayhDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJVGFzayBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFzaygpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlVGVtcGxhdGUoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIFRlbXBsYXRlIGNyZWF0ZVRlbXBsYXRlKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlUZW1wbGF0ZSBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVtcGxhdGUoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVRlcm1EZWZpbml0aW9uKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBUZXJtRGVmaW5pdGlvbiBjcmVhdGVUZXJtRGVmaW5pdGlvbihDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJVGVybURlZmluaXRpb24gZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRlcm1EZWZpbml0aW9uKCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVUb29sTWVudG9yKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBUb29sTWVudG9yIGNyZWF0ZVRvb2xNZW50b3IoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCVRvb2xNZW50b3IgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRvb2xNZW50b3IoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVdoaXRlcGFwZXIoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIFdoaXRlcGFwZXIgY3JlYXRlV2hpdGVwYXBlcihDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJV2hpdGVwYXBlciBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2hpdGVwYXBlcigpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlQWN0aXZpdHkoQWN0aXZpdHkpCi0JICovCi0JcHVibGljIEFjdGl2aXR5IGNyZWF0ZUFjdGl2aXR5KEFjdGl2aXR5IHN1cGVyQWN0aXZpdHkpIHsKLQkJQWN0aXZpdHkgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5KCk7Ci0JCXN1cGVyQWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoZSk7Ci0KLQkJYWRkQWN0aXZpdHlUb0NvbnRhaW5lcihlKTsKLQkJCi0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVQaGFzZShBY3Rpdml0eSkKLQkgKi8KLQlwdWJsaWMgUGhhc2UgY3JlYXRlUGhhc2UoQWN0aXZpdHkgc3VwZXJBY3Rpdml0eSkgewotCQlQaGFzZSBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGhhc2UoKTsKLQkJc3VwZXJBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChlKTsKLQotCQlhZGRBY3Rpdml0eVRvQ29udGFpbmVyKGUpOwotCi0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVJdGVyYXRpb24oQWN0aXZpdHkpCi0JICovCi0JcHVibGljIEl0ZXJhdGlvbiBjcmVhdGVJdGVyYXRpb24oQWN0aXZpdHkgc3VwZXJBY3Rpdml0eSkgewotCQlJdGVyYXRpb24gZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUl0ZXJhdGlvbigpOwotCQlzdXBlckFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGUpOwotCi0JCWFkZEFjdGl2aXR5VG9Db250YWluZXIoZSk7Ci0KLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZU1pbGVzdG9uZShBY3Rpdml0eSkKLQkgKi8KLQlwdWJsaWMgTWlsZXN0b25lIGNyZWF0ZU1pbGVzdG9uZShBY3Rpdml0eSBzdXBlckFjdGl2aXR5KSB7Ci0JCU1pbGVzdG9uZSBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWlsZXN0b25lKCk7Ci0JCXN1cGVyQWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoZSk7Ci0KLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2FkZFRhc2tUb0FjdGl2aXR5KEFjdGl2aXR5LCBUYXNrKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRhc2tUb0FjdGl2aXR5KEFjdGl2aXR5IGFjdCwgVGFzayB0YXNrKSB7Ci0JCWFkZFRhc2tzVG9BY3Rpdml0eShhY3QsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodGFzaykpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjYWRkVGFza3NUb0FjdGl2aXR5KEFjdGl2aXR5LCBMaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRhc2tzVG9BY3Rpdml0eShmaW5hbCBBY3Rpdml0eSBhY3QsIGZpbmFsIExpc3QgdGFza3MpIHsKLQkJLy8gdGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayBhbnkgbW9yZWR1ZSB0byBsYXRlciBjaGFuZ2VzCi0JCS8vIHVzZSBvdXIgb3duIGNvZGUgaW5zdGVhZAotCQkvL1Byb2Nlc3NVdGlsLmFkZFRhc2tUb0FjdGl2aXR5KHRhc2ssIGFjdCk7Ci0JCQotCQkvLyBiZWZvcmUgZG9pbmcgdGhlIGNvbW1hbmQsIG1ha2Ugc3VyZSB0aGUgb2JqZWN0IGlzIAotCQkvLyBpbiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIHRoZSBvd2luZyBwcm9jZXNzCi0JCS8vIG90aGVyd2lzZSB5b3Ugd2lsbCBnZXQgbXNnIGJveCBhc2tpbmcgZm9yIHRoYXQsIHdoaWNoIG1heSBjYXVzZSBlcnJvciBmb3IgYmFja2dyb3VuZCBwcm9jZXNzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdCk7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gcHJvYy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlpZiAoIGNvbmZpZyAhPSBudWxsICkgewotCQkJCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdGFza3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaylpdC5uZXh0KCk7CQkJCi0JCQkJTWV0aG9kUGFja2FnZSBwa2cgPSAoTWV0aG9kUGFja2FnZSl0YXNrLmVDb250YWluZXIoKTsKLQkJCQlMaXN0IHBrZ3MgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQkJCWlmICggIXBrZ3MuY29udGFpbnMocGtnKSApIHsKLQkJCQkJcGtncy5hZGQocGtnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7cHVibGljIHZvaWQgcnVuKCkgewotCQkJV0JTRHJvcENvbW1hbmQgY21kID0gbmV3IFdCU0Ryb3BDb21tYW5kKGFjdCwgdGFza3MpOwotCQkJdHJ5IHsKLQkJCQkJY21kLmV4ZWN1dGUoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQkKLQkJCWZpbmFsbHkgewotCQkJCWNtZC5kaXNwb3NlKCk7Ci0JCQl9CQotCSAgICB9fSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHByb2Nlc3MgY29tcG9uZW50IGZvciB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBlIEJyZWFrZG93bkVsZW1lbnQKLQkgKiBAcmV0dXJuIFByb2Nlc3NDb21wb25lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb2Nlc3NDb21wb25lbnQgZ2V0UHJvY2Vzc0NvbXBvbmVudChCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJCi0JCWlmICggZS5lQ29udGFpbmVyKCkgPT0gbnVsbCApIHsKLQkJCUFjdGl2aXR5IHBhcmVudCA9IGUuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQlpZiAoIHBhcmVudCA9PSBudWxsICkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gZ2V0UHJvY2Vzc0NvbXBvbmVudChwYXJlbnQpOwotCQl9Ci0JCi0JCUVPYmplY3QgY29udGFpbmVyOwotCQlmb3IgKGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOyBjb250YWluZXIgIT0gbnVsbAotCQkJCSYmICEoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCk7IGNvbnRhaW5lciA9IGNvbnRhaW5lcgotCQkJCS5lQ29udGFpbmVyKCkpCi0JCQk7Ci0KLQkJaWYgKCBjb250YWluZXIgIT0gbnVsbCApIHsKLQkJCXJldHVybiAoKFByb2Nlc3NDb21wb25lbnQpIGNvbnRhaW5lcik7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkQWN0aXZpdHlUb0NvbnRhaW5lcihBY3Rpdml0eSBhY3QpIHsKLQkJUHJvY2Vzc0NvbXBvbmVudCBwYyA9IGdldFByb2Nlc3NDb21wb25lbnQoYWN0KTsKLQkJaWYgKCBwYyAhPSBudWxsICkgewotCQkJLy8gY3JlYXRlIGEgcHJvY2VzcyBwYWNrYWdlIGZvciB0aGUgYWN0aXZpdHkKLQkJCSBQcm9jZXNzUGFja2FnZSBwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJIHBrZy5zZXROYW1lKGFjdC5nZXROYW1lKCkpOwotCQkJIHBrZy5zZXRHdWlkKEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSk7Ci0JCQkgcGMuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChwa2cpOwotCQkJIAotCQkJIHBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoYWN0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbnRlcm5hbC9pbXBvcnRpbmcvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ludGVybmFsL2ltcG9ydGluZy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiMDFkYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ludGVybmFsL2ltcG9ydGluZy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBkYXRhIGV4Y2hhbmdlIHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvQmFzZVJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvQmFzZVJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjJjMjU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0Jhc2VSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci0KLS8qKgotICogY29udGVudCByZXNvdXJjZSBoYW5kbGVyIHRvIHByb2Nlc3MgdGhlIHJlc3BvdXJjZXMgaW4gdGhlIGNvbnRlbnQKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlUmVzb3VyY2VIYW5kbGVyIGltcGxlbWVudHMgSVJlc291cmNlSGFuZGxlciB7Ci0KLQlwcm90ZWN0ZWQgRmlsZSBzb3VyY2VMaWJSb290OwotCXByb3RlY3RlZCBGaWxlIHRhcmdldExpYlJvb3Q7Ci0KLQlwdWJsaWMgQmFzZVJlc291cmNlSGFuZGxlcihGaWxlIHNvdXJjZUxpYlJvb3QsIEZpbGUgdGFyZ2V0TGliUm9vdCkgewotCQl0aGlzLnNvdXJjZUxpYlJvb3QgPSBzb3VyY2VMaWJSb290OwotCQl0aGlzLnRhcmdldExpYlJvb3QgPSB0YXJnZXRMaWJSb290OwotCX0KLQkKLQlwdWJsaWMgYWJzdHJhY3QgVXJsSW5mbyByZXNvbHZlRmlsZVVybChPYmplY3Qgb3duZXIsIFN0cmluZyBzcmNVcmwpIHRocm93cyBFeGNlcHRpb247Ci0JCi0JCi0JLyoqCi0JICogY29weWluZyB0aGUgcmVzb3VyY2UgZmlsZSBmcm9tIHRoZSBzb3VyY2UgbGlicmFyeSB0byB0aGUgdGFyZ2V0Ci0JICogCi0JICogQHBhcmFtIHNvdXJjZUZpbGUgdGhlIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgc291cmNlIHJvb3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmVzb3VyY2UoU3RyaW5nIHNvdXJjZUZpbGUpIHsKLQkJRmlsZSBzcmMgPSBuZXcgRmlsZShzb3VyY2VMaWJSb290LCBzb3VyY2VGaWxlKTsKLQkJaWYgKCBzcmMuZXhpc3RzKCkgKSB7Ci0JCQlGaWxlIHRndCA9IG5ldyBGaWxlKHRhcmdldExpYlJvb3QsIHNvdXJjZUZpbGUpOwotCQkJUmVzb3VyY2VIZWxwZXIuY29weUZpbGUoc3JjLCB0Z3QpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvQ29udGVudFByb2Nlc3Nvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvQ29udGVudFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYjZhMDNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0NvbnRlbnRQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci0KLQotCi0vKioKLSAqIGNvbnRlbnQgcHJvY2Vzc2VyIHRvIGZpeCByZWZlcmVuY2VzIGFuZCBjb3B5IHJlc291cmNlcyB0byB0aGUgdGFyZ2V0IGxpYnJhcnkgbG9jYXRpb24KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50UHJvY2Vzc29yIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUGF0dGVybiBwX3NyY19yZWYgPSBQYXR0ZXJuLmNvbXBpbGUoInNyY1xccyo9XFxzKlwiKC4qPylcIiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotLy8JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfbGlua19yZWYgPSBQYXR0ZXJuLmNvbXBpbGUoIjxhXFxzKz8oW14+XSopPiguKj8pPC9hPiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2hyZWZfcmVmID0gUGF0dGVybi5jb21waWxlKCJocmVmXFxzKj1cXHMqXCIoLio/KVwiIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlJUmVzb3VyY2VIYW5kbGVyIGhhbmRsZXI7Ci0JSUxvZ2dlciBsb2dnZXI7Ci0JCi0JcHVibGljIENvbnRlbnRQcm9jZXNzb3IoSVJlc291cmNlSGFuZGxlciBoYW5kbGVyLCBJTG9nZ2VyIGxvZ2dlcikgewotCQl0aGlzLmhhbmRsZXIgPSBoYW5kbGVyOwotCQl0aGlzLmxvZ2dlciA9IGxvZ2dlcjsKLQl9Ci0JCi0JLyoqCi0JICogcmVzb3ZsZSB0aGUgcmVzb3VyY2Ugc3RyaW5nIGZvciB0aGUgZ2l2ZW4gb3duZXIuIAotCSAqIFRoZSBvd25lciBpcyBhIG1ldGhvZCBlbGVtZW50LCBidXQgY2FuIGJlIGVpdGhlciBmcm9tIHVtYSBtb2RlbCBvciB4bWwgbW9kZWwuIAotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlUmVzb3VyY2VGaWxlcyhPYmplY3Qgb3duZXIsIFN0cmluZyBzb3VyY2UpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCXRyeQotCQl7Ci0JCQkvLyBwcm9jZXNzIGltYWdlcyBhbmQgb3RoZXIgc3JjIHJlc291cmNlcwotCQkJTWF0Y2hlciBtID0gcF9zcmNfcmVmLm1hdGNoZXIoc291cmNlKTsKLQkJCXdoaWxlICggbS5maW5kKCkgKQotCQkJewotCQkJCVN0cmluZyB1cmwgPSBtLmdyb3VwKDEpOwotCQkJCVN0cmluZyBuZXdfdXJsICA9IHByb2Nlc3NSZXNvdXJjZVVybChvd25lciwgdXJsKTsKLQkJCQlTdHJpbmcgcmVwbGFjZW1lbnQgPSAic3JjPVwiIiArIG5ld191cmwgKyAiXCIiOyAJCSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCBmaXhSZXBsYWNlbWVudFN0cihyZXBsYWNlbWVudCkpOwotCQkJfQotCQkJbS5hcHBlbmRUYWlsKHNiKTsKLQkJCQotCQkJLy8gcHJvY2VzcyBocmVmcwotCQkJbSA9IHBfaHJlZl9yZWYubWF0Y2hlcihzYi50b1N0cmluZygpKTsKLQkJCXNiLnNldExlbmd0aCgwKTsKLQkJCQotCQkJd2hpbGUgKCBtLmZpbmQoKSApCi0JCQl7Ci0JCQkJU3RyaW5nIHVybCA9IG0uZ3JvdXAoMSk7Ci0JCQkJU3RyaW5nIG1hcmsgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQkJaW50IGluZGV4ID0gdXJsLmluZGV4T2YoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICggaW5kZXggPj0gMCApCi0JCQkJewotCQkJCQltYXJrID0gdXJsLnN1YnN0cmluZyhpbmRleCk7Ci0JCQkJCXVybCA9IHVybC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCX0KLQotCQkJCWlmICggdXJsLmxlbmd0aCgpID4gMCApCi0JCQkJewotCQkJCQl1cmwgPSBwcm9jZXNzUmVzb3VyY2VVcmwob3duZXIsIHVybCk7Ci0JCQkJfQotCQkJCW0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIGZpeFJlcGxhY2VtZW50U3RyKCJocmVmPVwiIiArIHVybCArIG1hcmsgKyAiXCIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJbS5hcHBlbmRUYWlsKHNiKTsKLQkJCQotCQkJLy8gYW55dGhpbmcgZWxzZSA/Pz8KLQkJCQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpCi0JCXsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihzYik7Ci0JCQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZml4UmVwbGFjZW1lbnRTdHIoU3RyaW5nIHN0cikgewotCQkvLyBlc2NhcGUgdGhlICQgc2luY2UgaXQncyB0cmVhdGVkIGFzIGEgZ3JvdXAgc2VxdWVuY2UKLQkJdHJ5IHsKLQkJCWludCBpbmRleCA9IHN0ci5pbmRleE9mKCIkIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICggaW5kZXggPCAwICkgewotCQkJCXJldHVybiBzdHI7Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJaW50IHN0YXJ0ID0gMDsKLQkJCXdoaWxlICggaW5kZXggPj0gMCApIHsKLQkJCQliLmFwcGVuZChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCkpLmFwcGVuZCgiXFwkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdGFydCA9IGluZGV4KzE7Ci0JCQkJaW5kZXggPSBzdHIuaW5kZXhPZigiJCIsIHN0YXJ0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQliLmFwcGVuZChzdHIuc3Vic3RyaW5nKHN0YXJ0KSk7Ci0JCQkKLQkJCXJldHVybiBiLnRvU3RyaW5nKCk7Ci0JCQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBzdHI7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzRmlsZVVybChTdHJpbmcgdXJsKQotCXsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3NpbmcgaW1hZ2UgdXJsIFsiICsgdXJsICsgIl0iKTsKLQkJaWYgKCAJdXJsID09IG51bGwgfHwgdXJsLmxlbmd0aCgpID09IDAKLQkJCQl8fCB1cmwuc3RhcnRzV2l0aCgiaHR0cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQl8fCB1cmwuc3RhcnRzV2l0aCgid3d3LiIpIC8vJE5PTi1OTFMtMSQKLQkJCQl8fCB1cmwuc3RhcnRzV2l0aCgibWFpbHRvOiIpIC8vJE5PTi1OTFMtMSQKLQkJCQl8fCB1cmwudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJqYXZhc2NyaXB0OiIpID49MCApIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRGaWxlUGF0aChGaWxlIGYpIHsKLQkJcmV0dXJuIChmICE9IG51bGwpICYmIGYuZXhpc3RzKCk7Ci0JfQotCQotCi0JcHVibGljIFN0cmluZyBwcm9jZXNzUmVzb3VyY2VVcmwoT2JqZWN0IG93bmVyLCBTdHJpbmcgdXJsKQotCXsKLQkJaWYgKCAhaXNGaWxlVXJsKHVybCkgKQotCQl7Ci0JCQlyZXR1cm4gdXJsOwotCQl9Ci0KLQkJVXJsSW5mbyBpbmZvID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluZm8gPSBoYW5kbGVyLnJlc29sdmVGaWxlVXJsKG93bmVyLCB1cmwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKCJlcnJvciBwcm9jZXNzaW5nIHVybCAnIiArIHVybCArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIHVybDsKLQkJfQotCQkKLQkJaWYgKCBpbmZvLnNvdXJjZUZpbGUgPT0gbnVsbCB8fCBpbmZvLnRhcmdldEZpbGUgPT0gbnVsbCApIHsKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQkJCi0JCWlmICggaW5mby5zb3VyY2VGaWxlLmlzRmlsZSgpICYmIGluZm8uc291cmNlRmlsZS5leGlzdHMoKSApCi0JCXsKLQkJCVJlc291cmNlSGVscGVyLmNvcHlGaWxlKGluZm8uc291cmNlRmlsZSwgaW5mby50YXJnZXRGaWxlKTsKLQkJCQotCQkJLy8gcmV0dXJuIHRoZSBmaXhlZCB0YXJnZXQgdXJsIGlmIHRoZSBmaWxlIGV4aXN0cyAKLQkJCS8vIGFuZCBpcyBjb3BpZWQgb3ZlciB0byB0aGUgdGFyZ2V0IGxvY2F0aW9uCi0JCQlyZXR1cm4gaW5mby50YXJnZXRVcmw7Ci0JCX0KLQotCQlyZXR1cm4gdXJsOwotCX0KLQotCi0JLyoqCi0JICogcHJvY2VzcyB0aGUgdXJsLCB1cGRhdGUgdGhlIHJlc3VsdCBidWZmZXIsIGFuZCByZXR1cm4gdGhlIGFzc29jaWF0ZWQgZWxlbWVudCBpZiBhbnkKLQkgKiBAcGFyYW0gc291cmNlIHRlaCB1cmwgdGV4dCBzdHJpbmcKLQkgKiBAcGFyYW0gcmVzdWx0IFN0cmluZ0J1ZmZlcgotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudCB0aGUgbGlua2VkIGVsZW1lbnQgb3IgbnVsbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NVcmxUZXh0KE9iamVjdCBvd25lciwgU3RyaW5nIHNvdXJjZSkKLQl7Ci0JCU1hdGNoZXIgbSA9IHBfaHJlZl9yZWYubWF0Y2hlcihzb3VyY2UpOwotCQlpZiAoIG0uZmluZCgpICkKLQkJewotCQkJU3RyaW5nIHVybCA9IG0uZ3JvdXAoMSk7Ci0JCQlpZiAoIHVybC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImphdmFTY3JpcHQ6IikgPCAwICkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCWludCBpbmRleCA9IHVybC5pbmRleE9mKCIjIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoIGluZGV4ID49IDAgKQotCQkJCXsKLQkJCQkJdXJsID0gdXJsLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJfQotCi0JCQkJaWYgKCB1cmwubGVuZ3RoKCkgPiAwICkKLQkJCQl7Ci0JCQkJCXByb2Nlc3NSZXNvdXJjZVVybChvd25lciwgdXJsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgY29weVJlc291cmNlKFN0cmluZyBzb3VyY2VGaWxlKSB7Ci0JCWhhbmRsZXIuY29weVJlc291cmNlKHNvdXJjZUZpbGUpOwotCX0KLQkKLQkvKioKLQkgKiB0aGlzIG1ldGhvZCBpcyBmb3IgcmVzb2x2ZWluZyB0aGUgdGVtcGxhdGUgYXR0YWNobWVudCByZXNvdXJjZXMKLQkgKiBUaGUgcmVzb3VyY2UgaXMgYSBzZXQgb2YgdXJscyBzZXBlcmF0ZWQgYnkgfAotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSB1cmxzCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVBdHRhY2htZW50UmVzb3VyY2VzKE9iamVjdCBvd25lciwgU3RyaW5nIHVybHMpIHsKLQkJaWYgKCAodXJscyAhPSBudWxsKSAmJiB1cmxzLmxlbmd0aCgpICE9IDAgKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih1cmxzLCAifCIpOyAvLyB0aGlzIGlzIGhhcmRjb2RlZCBzb21laG93Ci0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpICkgewotCQkJCVN0cmluZyB1cmwgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQl1cmwgPSBwcm9jZXNzUmVzb3VyY2VVcmwob3duZXIsIHVybCk7Ci0JCQkJaWYgKCBidWZmZXIubGVuZ3RoKCkgPiAwICkgewotCQkJCQlidWZmZXIuYXBwZW5kKCJ8Iik7Ci0JCQkJfQotCQkJCWJ1ZmZlci5hcHBlbmQodXJsKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0JCQotCQlyZXR1cm4gIiI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvRGVmYXVsdExvZ2dlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvRGVmYXVsdExvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNGY5NTBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0RlZmF1bHRMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TG9nZ2VyIGltcGxlbWVudHMgSUxvZ2dlciB7Ci0KLQlwcm90ZWN0ZWQgUHJpbnRTdHJlYW0gaW5mbyA9IFN5c3RlbS5vdXQ7Ci0JcHJvdGVjdGVkIFByaW50U3RyZWFtIHdhcm5pbmcgPSBTeXN0ZW0ub3V0OwotCXByb3RlY3RlZCBQcmludFN0cmVhbSBlcnJvciA9IFN5c3RlbS5lcnI7Ci0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aCkgewotCQllcnJvci5wcmludGxuKCk7Ci0JCWlmICggdGggIT0gbnVsbCApIHsKLQkJCXRoLnByaW50U3RhY2tUcmFjZShlcnJvcik7Ci0JCX0JCi0JfQotCXB1YmxpYyB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJd2FybmluZy5wcmludGxuKG1lc3NhZ2UpOwotCX0KLQlwdWJsaWMgdm9pZCBsb2dNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWluZm8ucHJpbnRsbihtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9GaWxlTG9nZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9GaWxlTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhNTAwYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvRmlsZUxvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotCi0vKioKLSAqIGZpbGUgTG9nZ2VyIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRmlsZUxvZ2dlciBleHRlbmRzIERlZmF1bHRMb2dnZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTE9HX0ZJTEVOQU1FID0gImVycm9yLmxvZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUk5JTkdfTE9HX0ZJTEVOQU1FID0gIndhcm5pbmcubG9nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT19MT0dfRklMRU5BTUUgPSAiaW5mby5sb2ciOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgRmlsZSBsb2dQYXRoOwotCi0JcHVibGljIEZpbGVMb2dnZXIoRmlsZSBsb2dQYXRoKSB7Ci0JCXRoaXMubG9nUGF0aCA9IGxvZ1BhdGg7Ci0KLQkJaWYgKCF0aGlzLmxvZ1BhdGguZXhpc3RzKCkpIHsKLQkJCXRoaXMubG9nUGF0aC5ta2RpcnMoKTsKLQkJfQotCi0JCXN1cGVyLmluZm8gPSBnZXRTdHJlYW0obmV3IEZpbGUobG9nUGF0aCwgSU5GT19MT0dfRklMRU5BTUUpKTsKLQkJc3VwZXIud2FybmluZyA9IGdldFN0cmVhbShuZXcgRmlsZShsb2dQYXRoLCBXQVJOSU5HX0xPR19GSUxFTkFNRSkpOwotCQlzdXBlci5lcnJvciA9IGdldFN0cmVhbShuZXcgRmlsZShsb2dQYXRoLCBFUlJPUl9MT0dfRklMRU5BTUUpKTsKLQotCX0KLQotCXByaXZhdGUgUHJpbnRTdHJlYW0gZ2V0U3RyZWFtKEZpbGUgZikgewotCQl0cnkgewotCQkJRmlsZSBkaXIgPSBmLmdldFBhcmVudEZpbGUoKTsKLQkJCWRpci5ta2RpcnMoKTsKLQotCQkJaWYgKCFmLmV4aXN0cygpKSB7Ci0JCQkJZi5jcmVhdGVOZXdGaWxlKCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZiksIHRydWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpbmZvLmNsb3NlKCk7Ci0JCXdhcm5pbmcuY2xvc2UoKTsKLQkJZXJyb3IuY2xvc2UoKTsKLQotCX0KLQkKLQlwdWJsaWMgRmlsZSBnZXRMb2dQYXRoKCkgewotCQlyZXR1cm4gbG9nUGF0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9JTG9nZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9JTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMwZjE1YmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvSUxvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsOwotCi0vKioKLSAqIExvZ2dlciBpbnRlcmZhY2UgZm9yIGV4cG9ydCBhbmQgaW1wb3J0Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMb2dnZXIgewotCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aCk7Ci0JCi0JcHVibGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgbWVzc2FnZSk7Ci0JCi0JcHVibGljIHZvaWQgbG9nTWVzc2FnZShTdHJpbmcgbWVzc2FnZSk7Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvSVJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvSVJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNWY3MjhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0lSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbDsKLQotLyoqCi0gKiBSZXNvdXJjZSBoYW5kbGVyIGludGVyZmFjZSBmb3IgeG1sIGV4cG9ydCBhbmQgaW1wb3J0Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZXNvdXJjZUhhbmRsZXIgewotCi0JcHVibGljIFVybEluZm8gcmVzb2x2ZUZpbGVVcmwoT2JqZWN0IG93bmVyLCBTdHJpbmcgc3JjVXJsKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JLyoqCi0JICogY29weWluZyB0aGUgcmVzb3VyY2UgZmlsZSBmcm9tIHRoZSBzb3VyY2UgbGlicmFyeSB0byB0aGUgdGFyZ2V0Ci0JICogCi0JICogQHBhcmFtIHNvdXJjZUZpbGUgdGhlIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgc291cmNlIHJvb3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmVzb3VyY2UoU3RyaW5nIHNvdXJjZUZpbGUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvVXJsSW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvVXJsSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YzJlOGM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL1VybEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBEYXRhIHN0cnVjdHVyZSB0byBzdG9yZSB1cmwgaW5mbyBpbiBjb250ZW50Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVXJsSW5mbyB7Ci0KLQlwdWJsaWMgRmlsZSBzb3VyY2VGaWxlOwotCXB1YmxpYyBGaWxlIHRhcmdldEZpbGU7Ci0JcHVibGljIFN0cmluZyBzb3VyY2VVcmw7Ci0JcHVibGljIFN0cmluZyB0YXJnZXRVcmw7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI2OWM2MGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgdGhlIGRhdGEgZXhjaGFuZ2Ugc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmMjY3YjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNDJmYjRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW07IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZHJhdzJkLAotIG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbSwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTcyZTNjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIC5wcm9qZWN0LFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vbW9kZWwvZGlhZ3JhbS5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vbW9kZWwvZGlhZ3JhbS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzBhNzhlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL21vZGVsL2RpYWdyYW0uZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJtb2RlbCIKLSAgICBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW0iIGVTdXBlclR5cGVzPSIjLy9Ob2RlQ29udGFpbmVyIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTGluayIgZVN1cGVyVHlwZXM9IiMvL0xpbmtlZE9iamVjdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzb3VyY2UiIGVUeXBlPSIjLy9Ob2RlIgotICAgICAgICBlT3Bwb3NpdGU9IiMvL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXJnZXQiIGVUeXBlPSIjLy9Ob2RlIgotICAgICAgICBlT3Bwb3NpdGU9IiMvL05vZGUvaW5jb21pbmdDb25uZWN0aW9ucyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiZW5kcG9pbnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Fic29sdXRlQmVuZHBvaW50IiB0cmFuc2llbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic291cmNlRW5kUG9pbnQiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhcmdldEVuZFBvaW50IiBlVHlwZT0iIy8vUG9pbnQiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMaW5rZWRPYmplY3QiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGlua2VkRWxlbWVudCIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC40L3VtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib2JqZWN0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSmF2YU9iamVjdCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5hbWVkTm9kZSIgZVN1cGVyVHlwZXM9IiMvL05vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5vZGUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTGlua2VkT2JqZWN0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9jYXRpb24iIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndpZHRoIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Ii0xIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhlaWdodCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSItMSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmNvbWluZ0Nvbm5lY3Rpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0xpbmsiIGVPcHBvc2l0ZT0iIy8vTGluay90YXJnZXQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0Z29pbmdDb25uZWN0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9MaW5rIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiBlT3Bwb3NpdGU9IiMvL0xpbmsvc291cmNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlYWRPbmx5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eURpYWdyYW0iIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVHlwZWROb2RlIiBlU3VwZXJUeXBlcz0iIy8vTm9kZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW0iLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdE5vZGUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZE5vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW0iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRvTGF5b3V0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOb2RlQ29udGFpbmVyIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL05vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJub2RlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Ob2RlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVOb2RlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWROb2RlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZVRhc2tDb21wb3NpdGUiIGVTdXBlclR5cGVzPSIjLy9Ob2RlQ29udGFpbmVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm93SW5kZXgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza05vZGUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZE5vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbmRleCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iLTEiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkTm9kZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkTm9kZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlIiBlU3VwZXJUeXBlcz0iIy8vTm9kZUNvbnRhaW5lciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQWJzb2x1dGVCZW5kcG9pbnQiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJQb2ludCIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlJvbGVEZXNjcmlwdG9yIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciIvPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjI3NTlkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtIiBtb2RlbE5hbWU9IkRpYWdyYW0iIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLmVtZi5pbXBvcnRlci5qYXZhIgotICAgIHVzZWRHZW5QYWNrYWdlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC91bWEuZ2VubW9kZWwjLy91bWEiPgotICA8Zm9yZWlnbk1vZGVsPkBtb2RlbDwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJNb2RlbCIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgZWNvcmVQYWNrYWdlPSJkaWFncmFtLmVjb3JlIy8iPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iZGlhZ3JhbS5lY29yZSMvL0Fic29sdXRlQmVuZHBvaW50Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJkaWFncmFtLmVjb3JlIy8vUG9pbnQiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9ImRpYWdyYW0uZWNvcmUjLy9Sb2xlRGVzY3JpcHRvciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9EaWFncmFtIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL0xpbmsiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9MaW5rL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZGlhZ3JhbS5lY29yZSMvL0xpbmsvc291cmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZGlhZ3JhbS5lY29yZSMvL0xpbmsvdGFyZ2V0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL0xpbmsvYmVuZHBvaW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9MaW5rL3NvdXJjZUVuZFBvaW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL0xpbmsvdGFyZ2V0RW5kUG9pbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vTGlua2VkT2JqZWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkaWFncmFtLmVjb3JlIy8vTGlua2VkT2JqZWN0L2xpbmtlZEVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTGlua2VkT2JqZWN0L29iamVjdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vTmFtZWROb2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTmFtZWROb2RlL25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vTm9kZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL05vZGUvbG9jYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTm9kZS93aWR0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9Ob2RlL2hlaWdodCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRpYWdyYW0uZWNvcmUjLy9Ob2RlL2luY29taW5nQ29ubmVjdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZGlhZ3JhbS5lY29yZSMvL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9Ob2RlL3JlYWRPbmx5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9BY3Rpdml0eURpYWdyYW0iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vVHlwZWROb2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vVHlwZWROb2RlL3R5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3ROb2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3ROb2RlL3R5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbSIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL05vZGVDb250YWluZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vUm9sZU5vZGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vUm9sZVRhc2tDb21wb3NpdGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vVGFza05vZGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3RDb21wb3NpdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdENvbXBvc2l0ZS90eXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxuZXN0ZWRHZW5QYWNrYWdlcyBwcmVmaXg9Ik1vZGVsIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0iIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICAgIGVjb3JlUGFja2FnZT0iZGlhZ3JhbS5lY29yZSMvIj4KLSAgICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iZGlhZ3JhbS5lY29yZSMvL0Fic29sdXRlQmVuZHBvaW50Ii8+Ci0gICAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9ImRpYWdyYW0uZWNvcmUjLy9Qb2ludCIvPgotICAgICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJkaWFncmFtLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9EaWFncmFtIiBsYWJlbEZlYXR1cmU9IiMvL21vZGVsL21vZGVsL0xpbmtlZE9iamVjdC9vYmplY3QiLz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9MaW5rIiBsYWJlbEZlYXR1cmU9IiMvL21vZGVsL21vZGVsL0xpbmsvbmFtZSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTGluay9uYW1lIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZGlhZ3JhbS5lY29yZSMvL0xpbmsvc291cmNlIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiCi0gICAgICAgICAgICBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZGlhZ3JhbS5lY29yZSMvL0xpbmsvdGFyZ2V0Ii8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTGluay9iZW5kcG9pbnRzIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTGluay9zb3VyY2VFbmRQb2ludCIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL0xpbmsvdGFyZ2V0RW5kUG9pbnQiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL0xpbmtlZE9iamVjdCIgbGFiZWxGZWF0dXJlPSIjLy9tb2RlbC9tb2RlbC9MaW5rZWRPYmplY3Qvb2JqZWN0Ij4KLSAgICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIKLSAgICAgICAgICAgIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkaWFncmFtLmVjb3JlIy8vTGlua2VkT2JqZWN0L2xpbmtlZEVsZW1lbnQiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9MaW5rZWRPYmplY3Qvb2JqZWN0Ii8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vTmFtZWROb2RlIiBsYWJlbEZlYXR1cmU9IiMvL21vZGVsL21vZGVsL05hbWVkTm9kZS9uYW1lIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vTm9kZSIgbGFiZWxGZWF0dXJlPSIjLy9tb2RlbC9tb2RlbC9MaW5rZWRPYmplY3Qvb2JqZWN0Ij4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9Ob2RlL2xvY2F0aW9uIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTm9kZS93aWR0aCIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL05vZGUvaGVpZ2h0Ii8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiCi0gICAgICAgICAgICBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZGlhZ3JhbS5lY29yZSMvL05vZGUvaW5jb21pbmdDb25uZWN0aW9ucyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRpYWdyYW0uZWNvcmUjLy9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9Ob2RlL3JlYWRPbmx5Ii8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vQWN0aXZpdHlEaWFncmFtIiBsYWJlbEZlYXR1cmU9IiMvL21vZGVsL21vZGVsL0xpbmtlZE9iamVjdC9vYmplY3QiLz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9UeXBlZE5vZGUiIGxhYmVsRmVhdHVyZT0iIy8vbW9kZWwvbW9kZWwvTGlua2VkT2JqZWN0L29iamVjdCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vVHlwZWROb2RlL3R5cGUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIiBsYWJlbEZlYXR1cmU9IiMvL21vZGVsL21vZGVsL0xpbmtlZE9iamVjdC9vYmplY3QiLz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdE5vZGUiIGxhYmVsRmVhdHVyZT0iIy8vbW9kZWwvbW9kZWwvTmFtZWROb2RlL25hbWUiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL1dvcmtQcm9kdWN0Tm9kZS90eXBlIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vQWN0aXZpdHlEZXRhaWxEaWFncmFtIiBsYWJlbEZlYXR1cmU9IiMvL21vZGVsL21vZGVsL0xpbmtlZE9iamVjdC9vYmplY3QiLz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL05vZGVDb250YWluZXIiIGxhYmVsRmVhdHVyZT0iIy8vbW9kZWwvbW9kZWwvTGlua2VkT2JqZWN0L29iamVjdCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZGlhZ3JhbS5lY29yZSMvL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9Sb2xlTm9kZSIgbGFiZWxGZWF0dXJlPSIjLy9tb2RlbC9tb2RlbC9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL1JvbGVUYXNrQ29tcG9zaXRlIiBsYWJlbEZlYXR1cmU9IiMvL21vZGVsL21vZGVsL0xpbmtlZE9iamVjdC9vYmplY3QiLz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9UYXNrTm9kZSIgbGFiZWxGZWF0dXJlPSIjLy9tb2RlbC9tb2RlbC9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIGxhYmVsRmVhdHVyZT0iIy8vbW9kZWwvbW9kZWwvTmFtZWROb2RlL25hbWUiLz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUiIGxhYmVsRmVhdHVyZT0iIy8vbW9kZWwvbW9kZWwvTmFtZWROb2RlL25hbWUiLz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdENvbXBvc2l0ZSIgbGFiZWxGZWF0dXJlPSIjLy9tb2RlbC9tb2RlbC9MaW5rZWRPYmplY3Qvb2JqZWN0Ij4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdENvbXBvc2l0ZS90eXBlIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPC9uZXN0ZWRHZW5QYWNrYWdlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDQwZTdjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBEaWFncmFtIE1vZGVsCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotDQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYTNhMWQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgPHBhY2thZ2UgCi0gICAgICAgdXJpID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSIgCi0gICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlIiAvPgotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5kaWFncmFtTWFuYWdlciI+Ci0gICAgIDxkaWFncmFtTWFuYWdlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtTWFuYWdlciIvPgotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL0RpYWdyYW1SZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL0RpYWdyYW1SZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjZjNTFlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9EaWFncmFtUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSByZXNvdXJjZSBjbGFzcyBvZiBkaWFncmFtIHBsdWdpbgotICogCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGlhZ3JhbVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIERpYWdyYW1SZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHR5cGVfYWN0aXZpdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdEJhc2VOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHR5cGVfV1BEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHR5cGVfYWN0aXZpdHlEZXRhaWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkRnJlZVR4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0eXBlX3Vua25vd247Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBEaWFncmFtUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9SZXNvdXJjZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MzcxYTVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotdHlwZV9hY3Rpdml0eT1BY3Rpdml0eSBEaWFncmFtCi1kZWZhdWx0QmFzZU5hbWU9TmV3IHswfQotdHlwZV9XUEQ9V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbQotdHlwZV9hY3Rpdml0eURldGFpbD1BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbQotYWRkRnJlZVR4dD1BZGQgRnJlZSBUZXh0Ci10eXBlX3Vua25vd249VW5rbm93bgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvQWN0aXZpdHlEZXRhaWxEaWFncmFtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9BY3Rpdml0eURldGFpbERpYWdyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTMyNDc3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9BY3Rpdml0eURldGFpbERpYWdyYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0gbW9kZWwgb2JqZWN0Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aXZpdHlEZXRhaWxEaWFncmFtIGV4dGVuZHMgRGlhZ3JhbSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRvIExheW91dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXV0byBMYXlvdXQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXV0byBMYXlvdXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF1dG9MYXlvdXQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZSNnZXRBY3Rpdml0eURldGFpbERpYWdyYW1fQXV0b0xheW91dCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNBdXRvTGF5b3V0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW0jaXNBdXRvTGF5b3V0IDxlbT5BdXRvIExheW91dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXV0byBMYXlvdXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzQXV0b0xheW91dCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXV0b0xheW91dChib29sZWFuIHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvQWN0aXZpdHlEaWFncmFtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9BY3Rpdml0eURpYWdyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTIyYjAzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9BY3Rpdml0eURpYWdyYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgYWN0aXZpdHkgZGlhZ3JhbSBtb2RlbCBvYmplY3QKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjdGl2aXR5RGlhZ3JhbSBleHRlbmRzIERpYWdyYW0gewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9EaWFncmFtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9EaWFncmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1Y2VjZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvRGlhZ3JhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotCi0vKioKLSAqIEJhc2UgZGlhZ3JhbSBpbnRlcmZhY2UKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpYWdyYW0gZXh0ZW5kcyBOb2RlQ29udGFpbmVyIHsKLQotCS8qKgotCSAqIEdldHMgdGhlIFVNQSBtb2RlbCBvYmplY3QgZm9yIHRoaXMgZGlhZ3JhbQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gZ2V0VU1BRGlhZ3JhbSgpOwotCi0JLyoqCi0JICogU2V0cyBkZWZhdWx0IG5hbWUgZm9yIG5ldyBub2RlCi0JICogCi0JICogQHBhcmFtIG5ld05vZGUKLQkgKi8KLQl2b2lkIHNldERlZmF1bHROYW1lKE5hbWVkTm9kZSBuZXdOb2RlKTsKLQotCS8qKgotCSAqIFNldHMgYSBzdXBwcmVzc2lvbiBpbnN0YW5jZSBmb3IgdGhpcyBkaWFncmFtCi0JICogCi0JICogQHBhcmFtIHN1cHByZXNzaW9uCi0JICovCi0Jdm9pZCBzZXRTdXBwcmVzc2lvbihTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbik7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzdXBwcmVzc2lvbiBpbnN0YW5jZSB1c2VkIGluIHRoaXMgZGlhZ3JhbQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyBmaWx0ZXIgdXNlZCB0byB0byBmaWx0ZXIgZGlhZ3JhbSBlbGVtZW50cyBpbiB0aGlzIGRpYWdyYW0KLQkgKiAKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICovCi0Jdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpOwotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoaXMgZGlhZ3JhbSBpcyBuZXdseSBjcmVhdGVkIGFuZCBub3Qgc2F2ZWQgeWV0KQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGlzTmV3KCk7Ci0KLQkvKioKLQkgKiBTZXRzIG9yIHVuc2V0cyB0aGUgaXNOZXcgZmxhZyBvZiB0aGlzIGRpYWdyYW0KLQkgKiAKLQkgKiBAcGFyYW0gbgotCSAqIEBzZWUgI2lzTmV3KCkKLQkgKi8KLQl2b2lkIHNldE5ldyhib29sZWFuIG4pOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0xpbmsuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0xpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjllMjI3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9MaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgbW9kZWwgb2JqZWN0IGZvciBhIGxpbmsgYmV0d2VlbiBkaWFncmFtIG5vZGVzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBMaW5rIGV4dGVuZHMgTGlua2VkT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZSNnZXRMaW5rX05hbWUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHNvdXJjZSBub2RlIG9mIHRoaXMgbGluay4KLQkgKiAKLQkgKiBAbW9kZWwKLQkgKi8KLQlOb2RlIGdldFNvdXJjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXRTb3VyY2UgPGVtPlNvdXJjZTwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb3VyY2U8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNvdXJjZShOb2RlIHZhbHVlKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHRhcmdldCBub2RlIG9mIHRoaXMgbGluawotCSAqIAotCSAqIEBtb2RlbAotCSAqLwotCU5vZGUgZ2V0VGFyZ2V0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldFRhcmdldCA8ZW0+VGFyZ2V0PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRUYXJnZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhcmdldChOb2RlIHZhbHVlKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGxpc3Qgb2YgYmVuZCBwb2ludHMgaW4gdGhpcyBsaW5rCi0JICogCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludCIgbG93ZXI9IjAiIHRyYW5zaWVudD0idHJ1ZSIKLQkgKi8KLQlFTGlzdCBnZXRCZW5kcG9pbnRzKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBlbmQgcG9pbnQgb2YgdGhpcyBsaW5rIGluIHRoZSBzb3VyY2Ugbm9kZQotCSAqIAotCSAqIEBtb2RlbCB0cmFuc2llbnQ9InRydWUiCi0JICogQHJldHVybgotCSAqLwotCVBvaW50IGdldFNvdXJjZUVuZFBvaW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldFNvdXJjZUVuZFBvaW50IDxlbT5Tb3VyY2UgRW5kIFBvaW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U291cmNlIEVuZCBQb2ludDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U291cmNlRW5kUG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNvdXJjZUVuZFBvaW50KFBvaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGVuZCBwb2ludCBvZiB0aGlzIGxpbmsgaW4gdGFyZ2V0IG5vZGUKLQkgKiAKLQkgKiBAbW9kZWwgdHJhbnNpZW50PSJ0cnVlIgotCSAqIEByZXR1cm4KLQkgKi8KLQlQb2ludCBnZXRUYXJnZXRFbmRQb2ludCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXRUYXJnZXRFbmRQb2ludCA8ZW0+VGFyZ2V0IEVuZCBQb2ludDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBFbmQgUG9pbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRhcmdldEVuZFBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUYXJnZXRFbmRQb2ludChQb2ludCB2YWx1ZSk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9MaW5rZWRPYmplY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0xpbmtlZE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZjFlNzBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0xpbmtlZE9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyBvYmplY3RzIHRoYXQgaXMgbGlua2VkIHdpdGggb3RoZXIgb2JqZWN0IGluIGEKLSAqIGRpZmZlcmVuY2UgbW9kZWwKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqLwotcHVibGljIGludGVyZmFjZSBMaW5rZWRPYmplY3QgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBAbW9kZWwgdHJhbnNpZW50PSJ0cnVlIgotCSAqLwotCU9iamVjdCBnZXRPYmplY3QoKTsKLQotCXZvaWQgc2V0T2JqZWN0KE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAbW9kZWwKLQkgKi8KLQlNZXRob2RFbGVtZW50IGdldExpbmtlZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdCNnZXRMaW5rZWRFbGVtZW50IDxlbT5MaW5rZWQgRWxlbWVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGlua2VkIEVsZW1lbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldExpbmtlZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExpbmtlZEVsZW1lbnQoTWV0aG9kRWxlbWVudCB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL01vZGVsRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTW9kZWxGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczOGY5ZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTW9kZWxGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgTW9kZWxGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxGYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIERpYWdyYW0gY3JlYXRlRGlhZ3JhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5MaW5rPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5MaW5rPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBMaW5rIGNyZWF0ZUxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TmFtZWQgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TmFtZWQgTm9kZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgTmFtZWROb2RlIGNyZWF0ZU5hbWVkTm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eSBEaWFncmFtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eSBEaWFncmFtPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBBY3Rpdml0eURpYWdyYW0gY3JlYXRlQWN0aXZpdHlEaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlR5cGVkIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlR5cGVkIE5vZGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFR5cGVkTm9kZSBjcmVhdGVUeXBlZE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSBjcmVhdGVXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgTm9kZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya1Byb2R1Y3ROb2RlIGNyZWF0ZVdvcmtQcm9kdWN0Tm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZpdHkgRGV0YWlsIERpYWdyYW08L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBjcmVhdGVBY3Rpdml0eURldGFpbERpYWdyYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIE5vZGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvbGVOb2RlIGNyZWF0ZVJvbGVOb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgVGFzayBDb21wb3NpdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgVGFzayBDb21wb3NpdGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvbGVUYXNrQ29tcG9zaXRlIGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2sgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzayBOb2RlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXNrTm9kZSBjcmVhdGVUYXNrTm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBOb2RlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50IE5vZGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBjcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IENvbXBvc2l0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IENvbXBvc2l0ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya1Byb2R1Y3RDb21wb3NpdGUgY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgTW9kZWxQYWNrYWdlIGdldE1vZGVsUGFja2FnZSgpOwotCi19IC8vTW9kZWxGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Nb2RlbFBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL01vZGVsUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjI4YzNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL01vZGVsUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5Ci0gKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNb2RlbFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBTdHJpbmcgZU5BTUUgPSAibW9kZWwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBNb2RlbFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlQ29udGFpbmVySW1wbCA8ZW0+Tm9kZSBDb250YWluZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVDb250YWluZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0Tm9kZUNvbnRhaW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOT0RFX0NPTlRBSU5FUiA9IDEwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtlZE9iamVjdEltcGwgPGVtPkxpbmtlZCBPYmplY3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtlZE9iamVjdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRMaW5rZWRPYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBpbnQgTElOS0VEX09CSkVDVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwgPGVtPkRpYWdyYW08L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0RGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIGludCBESUFHUkFNID0gMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5MaW5rSW1wbCA8ZW0+TGluazwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgaW50IExJTksgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsIDxlbT5Ob2RlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBpbnQgTk9ERSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTmFtZWROb2RlSW1wbCA8ZW0+TmFtZWQgTm9kZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTmFtZWROb2RlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldE5hbWVkTm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIGludCBOQU1FRF9OT0RFID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5BY3Rpdml0eURpYWdyYW1JbXBsIDxlbT5BY3Rpdml0eSBEaWFncmFtPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5BY3Rpdml0eURpYWdyYW1JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0QWN0aXZpdHlEaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgaW50IEFDVElWSVRZX0RJQUdSQU0gPSA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlR5cGVkTm9kZUltcGwgPGVtPlR5cGVkIE5vZGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlR5cGVkTm9kZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRUeXBlZE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBpbnQgVFlQRURfTk9ERSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwgPGVtPldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW08L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNID0gNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdE5vZGVJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgTm9kZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3ROb2RlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0Tm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfTk9ERSA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCA8ZW0+QWN0aXZpdHkgRGV0YWlsIERpYWdyYW08L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0gPSA5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlJvbGVOb2RlSW1wbCA8ZW0+Um9sZSBOb2RlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Sb2xlTm9kZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRSb2xlTm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xFX05PREUgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Sb2xlVGFza0NvbXBvc2l0ZUltcGwgPGVtPlJvbGUgVGFzayBDb21wb3NpdGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlJvbGVUYXNrQ29tcG9zaXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFJvbGVUYXNrQ29tcG9zaXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEUgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5UYXNrTm9kZUltcGwgPGVtPlRhc2sgTm9kZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuVGFza05vZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0VGFza05vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEFTS19OT0RFID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIE5vZGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19MSU5LRURfRUxFTUVOVCA9IE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fT0JKRUNUID0gTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19PQkpFQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19MT0NBVElPTiA9IE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fTE9DQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19XSURUSCA9IE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fV0lEVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fSEVJR0hUID0gTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19JTkNPTUlOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX09VVEdPSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1JFQURfT05MWSA9IE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBESUFHUkFNX19OT0RFUyA9IE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fTk9ERVM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlhZ3JhbTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBESUFHUkFNX0ZFQVRVUkVfQ09VTlQgPSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMSU5LX19MSU5LRURfRUxFTUVOVCA9IE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX19MSU5LRURfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMSU5LX19PQkpFQ1QgPSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9fT0JKRUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMSU5LX19OQU1FID0gTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U291cmNlPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IExJTktfX1NPVVJDRSA9IE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IExJTktfX1RBUkdFVCA9IE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJlbmRwb2ludHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IExJTktfX0JFTkRQT0lOVFMgPSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2UgRW5kIFBvaW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElOS19fU09VUkNFX0VORF9QT0lOVCA9IE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbmQgUG9pbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMSU5LX19UQVJHRVRfRU5EX1BPSU5UID0gTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TGluazwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBMSU5LX0ZFQVRVUkVfQ09VTlQgPSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJTktFRF9PQkpFQ1RfX0xJTktFRF9FTEVNRU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMSU5LRURfT0JKRUNUX19PQkpFQ1QgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxpbmtlZCBPYmplY3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5BTUVEX05PREVfX0xJTktFRF9FTEVNRU5UID0gTW9kZWxQYWNrYWdlLk5PREVfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5BTUVEX05PREVfX09CSkVDVCA9IE1vZGVsUGFja2FnZS5OT0RFX19PQkpFQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBOQU1FRF9OT0RFX19MT0NBVElPTiA9IE1vZGVsUGFja2FnZS5OT0RFX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5BTUVEX05PREVfX1dJRFRIID0gTW9kZWxQYWNrYWdlLk5PREVfX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5BTUVEX05PREVfX0hFSUdIVCA9IE1vZGVsUGFja2FnZS5OT0RFX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5BTUVEX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBOQU1FRF9OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FRF9OT0RFX19SRUFEX09OTFkgPSBNb2RlbFBhY2thZ2UuTk9ERV9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBOQU1FRF9OT0RFX19OQU1FID0gTW9kZWxQYWNrYWdlLk5PREVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TmFtZWQgTm9kZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBOQU1FRF9OT0RFX0ZFQVRVUkVfQ09VTlQgPSBNb2RlbFBhY2thZ2UuTk9ERV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfX0xJTktFRF9FTEVNRU5UID0gTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfX09CSkVDVCA9IE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX19PQkpFQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBOT0RFX19MT0NBVElPTiA9IE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTk9ERV9fV0lEVEggPSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBOT0RFX19IRUlHSFQgPSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZyBDb25uZWN0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOT0RFX19SRUFEX09OTFkgPSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Ob2RlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5PREVfRkVBVFVSRV9DT1VOVCA9IE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfRElBR1JBTV9fTElOS0VEX0VMRU1FTlQgPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfRElBR1JBTV9fT0JKRUNUID0gTW9kZWxQYWNrYWdlLkRJQUdSQU1fX09CSkVDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RJQUdSQU1fX0xPQ0FUSU9OID0gTW9kZWxQYWNrYWdlLkRJQUdSQU1fX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfRElBR1JBTV9fV0lEVEggPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fV0lEVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfRElBR1JBTV9fSEVJR0hUID0gTW9kZWxQYWNrYWdlLkRJQUdSQU1fX0hFSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZyBDb25uZWN0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfRElBR1JBTV9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RJQUdSQU1fX09VVEdPSU5HX0NPTk5FQ1RJT05TID0gTW9kZWxQYWNrYWdlLkRJQUdSQU1fX09VVEdPSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RJQUdSQU1fX1JFQURfT05MWSA9IE1vZGVsUGFja2FnZS5ESUFHUkFNX19SRUFEX09OTFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IEFDVElWSVRZX0RJQUdSQU1fX05PREVTID0gTW9kZWxQYWNrYWdlLkRJQUdSQU1fX05PREVTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFjdGl2aXR5IERpYWdyYW08L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgQUNUSVZJVFlfRElBR1JBTV9GRUFUVVJFX0NPVU5UID0gTW9kZWxQYWNrYWdlLkRJQUdSQU1fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUWVBFRF9OT0RFX19MSU5LRURfRUxFTUVOVCA9IE1vZGVsUGFja2FnZS5OT0RFX19MSU5LRURfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUWVBFRF9OT0RFX19PQkpFQ1QgPSBNb2RlbFBhY2thZ2UuTk9ERV9fT0JKRUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgVFlQRURfTk9ERV9fTE9DQVRJT04gPSBNb2RlbFBhY2thZ2UuTk9ERV9fTE9DQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBUWVBFRF9OT0RFX19XSURUSCA9IE1vZGVsUGFja2FnZS5OT0RFX19XSURUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBUWVBFRF9OT0RFX19IRUlHSFQgPSBNb2RlbFBhY2thZ2UuTk9ERV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBUWVBFRF9OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgVFlQRURfTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBNb2RlbFBhY2thZ2UuTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVFlQRURfTk9ERV9fUkVBRF9PTkxZID0gTW9kZWxQYWNrYWdlLk5PREVfX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgVFlQRURfTk9ERV9fVFlQRSA9IE1vZGVsUGFja2FnZS5OT0RFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlR5cGVkIE5vZGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgVFlQRURfTk9ERV9GRUFUVVJFX0NPVU5UID0gTW9kZWxQYWNrYWdlLk5PREVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNX19MSU5LRURfRUxFTUVOVCA9IE1vZGVsUGFja2FnZS5ESUFHUkFNX19MSU5LRURfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNX19PQkpFQ1QgPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fT0JKRUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTV9fTE9DQVRJT04gPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fTE9DQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNX19XSURUSCA9IE1vZGVsUGFja2FnZS5ESUFHUkFNX19XSURUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNX19IRUlHSFQgPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IE1vZGVsUGFja2FnZS5ESUFHUkFNX19JTkNPTUlOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fT1VUR09JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTV9fUkVBRF9PTkxZID0gTW9kZWxQYWNrYWdlLkRJQUdSQU1fX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTV9fTk9ERVMgPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fTk9ERVM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNX0ZFQVRVUkVfQ09VTlQgPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFX19MSU5LRURfRUxFTUVOVCA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19MSU5LRURfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfTk9ERV9fT0JKRUNUID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX09CSkVDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFX19MT0NBVElPTiA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFX19XSURUSCA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19XSURUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfTk9ERV9fSEVJR0hUID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX0hFSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZyBDb25uZWN0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX05PREVfX1JFQURfT05MWSA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19SRUFEX09OTFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFX19OQU1FID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFX19UWVBFID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0IE5vZGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX05PREVfRkVBVFVSRV9DT1VOVCA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0xJTktFRF9FTEVNRU5UID0gTW9kZWxQYWNrYWdlLkRJQUdSQU1fX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19PQkpFQ1QgPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fT0JKRUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0xPQ0FUSU9OID0gTW9kZWxQYWNrYWdlLkRJQUdSQU1fX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX1dJRFRIID0gTW9kZWxQYWNrYWdlLkRJQUdSQU1fX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19IRUlHSFQgPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE1vZGVsUGFja2FnZS5ESUFHUkFNX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fUkVBRF9PTkxZID0gTW9kZWxQYWNrYWdlLkRJQUdSQU1fX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX05PREVTID0gTW9kZWxQYWNrYWdlLkRJQUdSQU1fX05PREVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dG8gTGF5b3V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0FVVE9fTEFZT1VUID0gTW9kZWxQYWNrYWdlLkRJQUdSQU1fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWN0aXZpdHkgRGV0YWlsIERpYWdyYW08L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fRkVBVFVSRV9DT1VOVCA9IE1vZGVsUGFja2FnZS5ESUFHUkFNX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTk9ERV9DT05UQUlORVJfX0xJTktFRF9FTEVNRU5UID0gTW9kZWxQYWNrYWdlLk5PREVfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfQ09OVEFJTkVSX19PQkpFQ1QgPSBNb2RlbFBhY2thZ2UuTk9ERV9fT0JKRUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTk9ERV9DT05UQUlORVJfX0xPQ0FUSU9OID0gTW9kZWxQYWNrYWdlLk5PREVfX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTk9ERV9DT05UQUlORVJfX1dJRFRIID0gTW9kZWxQYWNrYWdlLk5PREVfX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfQ09OVEFJTkVSX19IRUlHSFQgPSBNb2RlbFBhY2thZ2UuTk9ERV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOT0RFX0NPTlRBSU5FUl9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfQ09OVEFJTkVSX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOT0RFX0NPTlRBSU5FUl9fUkVBRF9PTkxZID0gTW9kZWxQYWNrYWdlLk5PREVfX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTk9ERV9DT05UQUlORVJfX05PREVTID0gTW9kZWxQYWNrYWdlLk5PREVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Tm9kZSBDb250YWluZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTk9ERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCA9IE1vZGVsUGFja2FnZS5OT0RFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9OT0RFX19MSU5LRURfRUxFTUVOVCA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19MSU5LRURfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX05PREVfX09CSkVDVCA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19PQkpFQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX05PREVfX0xPQ0FUSU9OID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9OT0RFX19XSURUSCA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19XSURUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX05PREVfX0hFSUdIVCA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9OT0RFX19SRUFEX09OTFkgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX05PREVfX05BTUUgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIE5vZGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9OT0RFX0ZFQVRVUkVfQ09VTlQgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEVfX0xJTktFRF9FTEVNRU5UID0gTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19MSU5LRURfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1RBU0tfQ09NUE9TSVRFX19PQkpFQ1QgPSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX09CSkVDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEVfX0xPQ0FUSU9OID0gTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEVfX1dJRFRIID0gTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19XSURUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1RBU0tfQ09NUE9TSVRFX19IRUlHSFQgPSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX0hFSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZyBDb25uZWN0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9UQVNLX0NPTVBPU0lURV9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1RBU0tfQ09NUE9TSVRFX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fT1VUR09JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9UQVNLX0NPTVBPU0lURV9fUkVBRF9PTkxZID0gTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19SRUFEX09OTFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEVfX05PREVTID0gTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19OT0RFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb3cgSW5kZXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1RBU0tfQ09NUE9TSVRFX19ST1dfSU5ERVggPSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBUYXNrIENvbXBvc2l0ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1RBU0tfQ09NUE9TSVRFX0ZFQVRVUkVfQ09VTlQgPSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX05PREVfX0xJTktFRF9FTEVNRU5UID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfTk9ERV9fT0JKRUNUID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX09CSkVDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfTk9ERV9fTE9DQVRJT04gPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTE9DQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX05PREVfX1dJRFRIID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfTk9ERV9fSEVJR0hUID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX0hFSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZyBDb25uZWN0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX05PREVfX1JFQURfT05MWSA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19SRUFEX09OTFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfTk9ERV9fTkFNRSA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZGV4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19OT0RFX19JTkRFWCA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRhc2sgTm9kZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX05PREVfRkVBVFVSRV9DT1VOVCA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERV9fTElOS0VEX0VMRU1FTlQgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERV9fT0JKRUNUID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX09CSkVDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREVfX0xPQ0FUSU9OID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERV9fV0lEVEggPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fV0lEVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERV9fSEVJR0hUID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX0hFSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZyBDb25uZWN0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREVfX1JFQURfT05MWSA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19SRUFEX09OTFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREVfX05BTUUgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBOb2RlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREVfRkVBVFVSRV9DT1VOVCA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUltcGwgPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQgTm9kZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREUgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERV9fTElOS0VEX0VMRU1FTlQgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFX19PQkpFQ1QgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fT0JKRUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFX19MT0NBVElPTiA9IE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERV9fV0lEVEggPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fV0lEVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFX19IRUlHSFQgPSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERV9fUkVBRF9PTkxZID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFX19OQU1FID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERV9GRUFUVVJFX0NPVU5UID0gTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgQ29tcG9zaXRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdENvbXBvc2l0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19MSU5LRURfRUxFTUVOVCA9IE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0NPTVBPU0lURV9fT0JKRUNUID0gTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19PQkpFQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19MT0NBVElPTiA9IE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fTE9DQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19XSURUSCA9IE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fV0lEVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0NPTVBPU0lURV9fSEVJR0hUID0gTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9DT01QT1NJVEVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19JTkNPTUlOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0NPTVBPU0lURV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX09VVEdPSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9DT01QT1NJVEVfX1JFQURfT05MWSA9IE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19OT0RFUyA9IE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fTk9ERVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9DT01QT1NJVEVfX1RZUEUgPSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0IENvbXBvc2l0ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFX0ZFQVRVUkVfQ09VTlQgPSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkFic29sdXRlIEJlbmRwb2ludDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldEFic29sdXRlQmVuZHBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgaW50IEFCU09MVVRFX0JFTkRQT0lOVCA9IDE3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Qb2ludDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgaW50IFBPSU5UID0gMTg7Ci0KLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUiA9IDE5OwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIDxlbT5EaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVDbGFzcyBnZXREaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rIDxlbT5MaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkxpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVDbGFzcyBnZXRMaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExpbmtfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXRTb3VyY2UgPGVtPlNvdXJjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5Tb3VyY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldFNvdXJjZSgpCi0JICogQHNlZSAjZ2V0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVSZWZlcmVuY2UgZ2V0TGlua19Tb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXRUYXJnZXQgPGVtPlRhcmdldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlRhcmdldDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0VGFyZ2V0KCkKLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRVJlZmVyZW5jZSBnZXRMaW5rX1RhcmdldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0QmVuZHBvaW50cyA8ZW0+QmVuZHBvaW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QmVuZHBvaW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0QmVuZHBvaW50cygpCi0JICogQHNlZSAjZ2V0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0TGlua19CZW5kcG9pbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0U291cmNlRW5kUG9pbnQgPGVtPlNvdXJjZSBFbmQgUG9pbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Tb3VyY2UgRW5kIFBvaW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXRTb3VyY2VFbmRQb2ludCgpCi0JICogQHNlZSAjZ2V0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TGlua19Tb3VyY2VFbmRQb2ludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldFRhcmdldEVuZFBvaW50IDxlbT5UYXJnZXQgRW5kIFBvaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFyZ2V0IEVuZCBQb2ludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0VGFyZ2V0RW5kUG9pbnQoKQotCSAqIEBzZWUgI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExpbmtfVGFyZ2V0RW5kUG9pbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdCA8ZW0+TGlua2VkIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5MaW5rZWQgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVDbGFzcyBnZXRMaW5rZWRPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0I2dldExpbmtlZEVsZW1lbnQgPGVtPkxpbmtlZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+TGlua2VkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3QjZ2V0TGlua2VkRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0TGlua2VkT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRMaW5rZWRPYmplY3RfTGlua2VkRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3QjZ2V0T2JqZWN0IDxlbT5PYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3QjZ2V0T2JqZWN0KCkKLQkgKiBAc2VlICNnZXRMaW5rZWRPYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExpbmtlZE9iamVjdF9PYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZSA8ZW0+TmFtZWQgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5OYW1lZCBOb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVDbGFzcyBnZXROYW1lZE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldE5hbWVkTm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0TmFtZWROb2RlX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUgPGVtPk5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Tm9kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUNsYXNzIGdldE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRMb2NhdGlvbiA8ZW0+TG9jYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2NhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0TG9jYXRpb24oKQotCSAqIEBzZWUgI2dldE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQXR0cmlidXRlIGdldE5vZGVfTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRXaWR0aCA8ZW0+V2lkdGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5XaWR0aDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0V2lkdGgoKQotCSAqIEBzZWUgI2dldE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQXR0cmlidXRlIGdldE5vZGVfV2lkdGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRIZWlnaHQgPGVtPkhlaWdodDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhlaWdodDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0SGVpZ2h0KCkKLQkgKiBAc2VlICNnZXROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUF0dHJpYnV0ZSBnZXROb2RlX0hlaWdodCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0SW5jb21pbmdDb25uZWN0aW9ucyA8ZW0+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkluY29taW5nIENvbm5lY3Rpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkKLQkgKiBAc2VlICNnZXROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRVJlZmVyZW5jZSBnZXROb2RlX0luY29taW5nQ29ubmVjdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI2dldE91dGdvaW5nQ29ubmVjdGlvbnMgPGVtPk91dGdvaW5nIENvbm5lY3Rpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5PdXRnb2luZyBDb25uZWN0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpCi0JICogQHNlZSAjZ2V0Tm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVSZWZlcmVuY2UgZ2V0Tm9kZV9PdXRnb2luZ0Nvbm5lY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjaXNSZWFkT25seSA8ZW0+UmVhZCBPbmx5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVhZCBPbmx5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNpc1JlYWRPbmx5KCkKLQkgKiBAc2VlICNnZXROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXROb2RlX1JlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW0gPGVtPkFjdGl2aXR5IERpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWN0aXZpdHkgRGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQ2xhc3MgZ2V0QWN0aXZpdHlEaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGUgPGVtPlR5cGVkIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VHlwZWQgTm9kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQ2xhc3MgZ2V0VHlwZWROb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZSNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRUeXBlZE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQXR0cmlidXRlIGdldFR5cGVkTm9kZV9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIDxlbT5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGUgPGVtPldvcmsgUHJvZHVjdCBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBOb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0Tm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3ROb2RlX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSA8ZW0+QWN0aXZpdHkgRGV0YWlsIERpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWN0aXZpdHkgRGV0YWlsIERpYWdyYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW0jaXNBdXRvTGF5b3V0IDxlbT5BdXRvIExheW91dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF1dG8gTGF5b3V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtI2lzQXV0b0xheW91dCgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURldGFpbERpYWdyYW1fQXV0b0xheW91dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lciA8ZW0+Tm9kZSBDb250YWluZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Tm9kZSBDb250YWluZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXROb2RlQ29udGFpbmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lciNnZXROb2RlcyA8ZW0+Tm9kZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk5vZGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lciNnZXROb2RlcygpCi0JICogQHNlZSAjZ2V0Tm9kZUNvbnRhaW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Tm9kZUNvbnRhaW5lcl9Ob2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGUgPGVtPlJvbGUgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlIE5vZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9sZU5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlIDxlbT5Sb2xlIFRhc2sgQ29tcG9zaXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGUgVGFzayBDb21wb3NpdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9sZVRhc2tDb21wb3NpdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGUjZ2V0Um93SW5kZXggPGVtPlJvdyBJbmRleDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJvdyBJbmRleDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlI2dldFJvd0luZGV4KCkKLQkgKiBAc2VlICNnZXRSb2xlVGFza0NvbXBvc2l0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZVRhc2tDb21wb3NpdGVfUm93SW5kZXgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlIDxlbT5UYXNrIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFzayBOb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhc2tOb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlI2dldEluZGV4IDxlbT5JbmRleDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluZGV4PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGUjZ2V0SW5kZXgoKQotCSAqIEBzZWUgI2dldFRhc2tOb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrTm9kZV9JbmRleCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3IgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBOb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIDxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50IE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlIDxlbT5Xb3JrIFByb2R1Y3QgQ29tcG9zaXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3RDb21wb3NpdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZSNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdENvbXBvc2l0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RDb21wb3NpdGVfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludCA8ZW0+QWJzb2x1dGUgQmVuZHBvaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5BYnNvbHV0ZSBCZW5kcG9pbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFRGF0YVR5cGUgZ2V0QWJzb2x1dGVCZW5kcG9pbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQgPGVtPlBvaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Qb2ludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludAotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVEYXRhVHlwZSBnZXRQb2ludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IgPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Um9sZURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIE1vZGVsRmFjdG9yeSBnZXRNb2RlbEZhY3RvcnkoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludGVyZmFjZSBMaXRlcmFscyAgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwgPGVtPkRpYWdyYW08L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldERpYWdyYW0oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRElBR1JBTSA9IGVJTlNUQU5DRS5nZXREaWFncmFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtJbXBsIDxlbT5MaW5rPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5MaW5rSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRMaW5rKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIExJTksgPSBlSU5TVEFOQ0UuZ2V0TGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExJTktfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TGlua19OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2U8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTElOS19fU09VUkNFID0gZUlOU1RBTkNFLmdldExpbmtfU291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBMSU5LX19UQVJHRVQgPSBlSU5TVEFOQ0UuZ2V0TGlua19UYXJnZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJlbmRwb2ludHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExJTktfX0JFTkRQT0lOVFMgPSBlSU5TVEFOQ0UuZ2V0TGlua19CZW5kcG9pbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2UgRW5kIFBvaW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTElOS19fU09VUkNFX0VORF9QT0lOVCA9IGVJTlNUQU5DRS5nZXRMaW5rX1NvdXJjZUVuZFBvaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW5kIFBvaW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTElOS19fVEFSR0VUX0VORF9QT0lOVCA9IGVJTlNUQU5DRS5nZXRMaW5rX1RhcmdldEVuZFBvaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtlZE9iamVjdEltcGwgPGVtPkxpbmtlZCBPYmplY3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtlZE9iamVjdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0TGlua2VkT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIExJTktFRF9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0TGlua2VkT2JqZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIExJTktFRF9PQkpFQ1RfX0xJTktFRF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldExpbmtlZE9iamVjdF9MaW5rZWRFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PYmplY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMSU5LRURfT0JKRUNUX19PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0TGlua2VkT2JqZWN0X09iamVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5OYW1lZE5vZGVJbXBsIDxlbT5OYW1lZCBOb2RlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5OYW1lZE5vZGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldE5hbWVkTm9kZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBOQU1FRF9OT0RFID0gZUlOU1RBTkNFLmdldE5hbWVkTm9kZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE5BTUVEX05PREVfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TmFtZWROb2RlX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwgPGVtPk5vZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldE5vZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTk9ERSA9IGVJTlNUQU5DRS5nZXROb2RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE5PREVfX0xPQ0FUSU9OID0gZUlOU1RBTkNFLmdldE5vZGVfTG9jYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTk9ERV9fV0lEVEggPSBlSU5TVEFOQ0UuZ2V0Tm9kZV9XaWR0aCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTk9ERV9fSEVJR0hUID0gZUlOU1RBTkNFLmdldE5vZGVfSGVpZ2h0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZyBDb25uZWN0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBlSU5TVEFOQ0UuZ2V0Tm9kZV9JbmNvbWluZ0Nvbm5lY3Rpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBlSU5TVEFOQ0UuZ2V0Tm9kZV9PdXRnb2luZ0Nvbm5lY3Rpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBOT0RFX19SRUFEX09OTFkgPSBlSU5TVEFOQ0UuZ2V0Tm9kZV9SZWFkT25seSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5BY3Rpdml0eURpYWdyYW1JbXBsIDxlbT5BY3Rpdml0eSBEaWFncmFtPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5BY3Rpdml0eURpYWdyYW1JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldEFjdGl2aXR5RGlhZ3JhbSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBQ1RJVklUWV9ESUFHUkFNID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5RGlhZ3JhbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5UeXBlZE5vZGVJbXBsIDxlbT5UeXBlZCBOb2RlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5UeXBlZE5vZGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFR5cGVkTm9kZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUWVBFRF9OT0RFID0gZUlOU1RBTkNFLmdldFR5cGVkTm9kZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRZUEVEX05PREVfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0VHlwZWROb2RlX1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwgPGVtPldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW08L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0Tm9kZUltcGwgPGVtPldvcmsgUHJvZHVjdCBOb2RlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdE5vZGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0Tm9kZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1RfTk9ERSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdE5vZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfTk9ERV9fVFlQRSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdE5vZGVfVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5BY3Rpdml0eURldGFpbERpYWdyYW1JbXBsIDxlbT5BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0gPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdXRvIExheW91dDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19BVVRPX0xBWU9VVCA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eURldGFpbERpYWdyYW1fQXV0b0xheW91dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlQ29udGFpbmVySW1wbCA8ZW0+Tm9kZSBDb250YWluZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVDb250YWluZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldE5vZGVDb250YWluZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTk9ERV9DT05UQUlORVIgPSBlSU5TVEFOQ0UuZ2V0Tm9kZUNvbnRhaW5lcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Tm9kZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE5PREVfQ09OVEFJTkVSX19OT0RFUyA9IGVJTlNUQU5DRS5nZXROb2RlQ29udGFpbmVyX05vZGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlJvbGVOb2RlSW1wbCA8ZW0+Um9sZSBOb2RlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Sb2xlTm9kZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0Um9sZU5vZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9OT0RFID0gZUlOU1RBTkNFLmdldFJvbGVOb2RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlJvbGVUYXNrQ29tcG9zaXRlSW1wbCA8ZW0+Um9sZSBUYXNrIENvbXBvc2l0ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuUm9sZVRhc2tDb21wb3NpdGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFJvbGVUYXNrQ29tcG9zaXRlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPTEVfVEFTS19DT01QT1NJVEUgPSBlSU5TVEFOQ0UuZ2V0Um9sZVRhc2tDb21wb3NpdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvdyBJbmRleDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfVEFTS19DT01QT1NJVEVfX1JPV19JTkRFWCA9IGVJTlNUQU5DRS5nZXRSb2xlVGFza0NvbXBvc2l0ZV9Sb3dJbmRleCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5UYXNrTm9kZUltcGwgPGVtPlRhc2sgTm9kZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuVGFza05vZGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFRhc2tOb2RlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRBU0tfTk9ERSA9IGVJTlNUQU5DRS5nZXRUYXNrTm9kZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5kZXg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX05PREVfX0lOREVYID0gZUlOU1RBTkNFLmdldFRhc2tOb2RlX0luZGV4KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBOb2RlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREUgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJbXBsIDxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50IE5vZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnROb2RlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERSA9IGVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgQ29tcG9zaXRlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3RDb21wb3NpdGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUX0NPTVBPU0lURSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdENvbXBvc2l0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9DT01QT1NJVEVfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RDb21wb3NpdGVfVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+QWJzb2x1dGUgQmVuZHBvaW50PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldEFic29sdXRlQmVuZHBvaW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIEFCU09MVVRFX0JFTkRQT0lOVCA9IGVJTlNUQU5DRS5nZXRBYnNvbHV0ZUJlbmRwb2ludCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+UG9pbnQ8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0UG9pbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgUE9JTlQgPSBlSU5TVEFOQ0UuZ2V0UG9pbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0Um9sZURlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgUk9MRV9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yKCk7Ci0KLQl9Ci0KLX0gLy9Nb2RlbFBhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL05hbWVkTm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTmFtZWROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVkYzNjZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTmFtZWROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotLyoqCi0gKiBBIGRpYWdyYW0gbm9kZSB3aXRoIG5hbWUKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVkTm9kZSBleHRlbmRzIE5vZGUgewotCS8qKgotCSAqIEdldHMgbm9kZSBuYW1lCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIG5vZGUKLQkgKiBAbW9kZWwKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzdXBwcmVzc2lvbiBzdGF0dXMgb2YgdGhpcyBub2RlCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCBpcyBzdXBwcmVzc2VkLCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZQotCSAqLwotCWJvb2xlYW4gaXNTdXBwcmVzc2VkKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3cmFwcGVyIG9mIHRoZSBtZXRob2QgZWxlbWVudCB0aGF0IHRoaXMgbm9kZSByZXByZXNlbnRzCi0JICogCi0JICogQHJldHVybiB0aGUgd3JhcHBlcgotCSAqLwotCU9iamVjdCBnZXRXcmFwcGVyKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Ob2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVkNTVjOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotCi0vKioKLSAqIFRoZSBkaWFncmFtIG5vZGUKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqLwotcHVibGljIGludGVyZmFjZSBOb2RlIGV4dGVuZHMgTGlua2VkT2JqZWN0IHsKLQotCS8qKgotCSAqIEdldHMgbG9jYXRpb24gb2YgdGhpcyBub2RlCi0JICogCi0JICogQG1vZGVsIHRyYW5zaWVudD0idHJ1ZSIKLQkgKi8KLQlQb2ludCBnZXRMb2NhdGlvbigpOwotCi0JLyoqCi0JICogR2V0cyB3aWR0aAotCSAqIAotCSAqIEBtb2RlbCBkZWZhdWx0PSItMSIgdHJhbnNpZW50PSJ0cnVlIgotCSAqLwotCWludCBnZXRXaWR0aCgpOwotCi0JLyoqCi0JICogR2V0cyBoZWlnaHQKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBoZWlnaHQKLQkgKiBAbW9kZWwgZGVmYXVsdD0iLTEiIHRyYW5zaWVudD0idHJ1ZSIKLQkgKi8KLQlpbnQgZ2V0SGVpZ2h0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI2dldEhlaWdodCA8ZW0+SGVpZ2h0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SGVpZ2h0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIZWlnaHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEhlaWdodChpbnQgdmFsdWUpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRXaWR0aCA8ZW0+V2lkdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5XaWR0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V2lkdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdpZHRoKGludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TG9jYXRpb24oUG9pbnQgdmFsdWUpOwotCi0JLyoqCi0JICogR2V0cyBpbmNvbWluZyBsaW5rcwotCSAqIAotCSAqIEBtb2RlbCB0eXBlPSJMaW5rIiBvcHBvc2l0ZT0idGFyZ2V0IiBsb3dlcj0iMCIKLQkgKi8KLQlFTGlzdCBnZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBHZXRzIG91dGdvaW5nIGxpbmtzCi0JICogCi0JICogQG1vZGVsIHR5cGU9IkxpbmsiIGNvbnRhaW5tZW50PSJ0cnVlIiBvcHBvc2l0ZT0ic291cmNlIiBsb3dlcj0iMCIKLQkgKi8KLQlFTGlzdCBnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhpcyBub2RlIGlzIHJlYWQtb25seQotCSAqIAotCSAqIEBtb2RlbAotCSAqLwotCWJvb2xlYW4gaXNSZWFkT25seSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNpc1JlYWRPbmx5IDxlbT5SZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFkIE9ubHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzUmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgZGlhZ3JhbSBvZiB0aGlzIG5vZGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JRGlhZ3JhbSBnZXREaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBTZXRzIGRpYWdyYW0gZm9yIHRoaXMgbm9kZQotCSAqIAotCSAqIEBwYXJhbSBkaWFncmFtCi0JICovCi0Jdm9pZCBzZXREaWFncmFtKERpYWdyYW0gZGlhZ3JhbSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBHcmFwaE5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JR3JhcGhOb2RlIGdldEdyYXBoTm9kZSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgdHlwZSBvZiBtZXRob2QgZWxlbWVudCBhZGFwdGVyLiBNZXRob2QgZWxlbWVudCBhZGFwdGVyIGlzIGEgbm9kZQotCSAqIGludGVybmFsIHtAbGluayBBZGFwdGVyIGFkYXB0ZXJ9IHRoYXQgaXMgbGlzdGVuaW5nIG9uIGNoYW5nZXMgb2YgbGlua2VkCi0JICogbWV0aG9kIGVsZW1lbnQgb3IgaXRzIHdyYXBwZXIgdG8gdXBkYXRlIHRoZSBub2RlIGFjY29yZGluZ2x5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNsYXNzIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhZGFwdGVyIG9mIHRoaXMgbm9kZQotCSAqLwotCUNsYXNzIGdldE1ldGhvZEVsZW1lbnRBZGFwdGVyVHlwZSgpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBzZXQgdGhlIFVNQSBkaWFncmFtIGZvciB0aGUgbmV3IG5vZGUgc28gaXQgY2FuCi0JICogZmluZCB0aGUgR3JhcGhOb2RlIGZvciB0aGUgbGlua2VkIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSB1bWFEaWFncmFtCi0JICovCi0Jdm9pZCBzZXRVTUFEaWFncmFtKG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSB1bWFEaWFncmFtKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGdyYXBoIG5vZGUgdGhhdCBpcyB0aGUgY29udGFpbmVyIG9mIHRoZQotCSAqIHtAbGluayAjZ2V0R3JhcGhOb2RlKCkgbGlua2VkIGdyYXBoIG5vZGV9Ci0JICogCi0JICogQHBhcmFtIHVtYUNvbnRhaW5lcgotCSAqLwotCXZvaWQgc2V0VU1BQ29udGFpbmVyKEdyYXBoTm9kZSB1bWFDb250YWluZXIpOwotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gY29uc3VtZXIgdG8gdGhlIGNvbnN1bWVyIGxpc3Qgb2YgdGhpcyBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBjb25zdW1lcgotCSAqLwotCXZvaWQgYWRkQ29uc3VtZXIoT2JqZWN0IGNvbnN1bWVyKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGNvbnN1bWVyIGZyb20gdGhlIGNvbnN1bWVyIGxpc3Qgb2YgdGhpcyBub2RlLiBEaXNwb3NlcwotCSAqIHRoZSBub2RlIGlmIGl0IGRvZXMgbm90IGhhdmUgYW55IG1vcmUgY29uc3VtZXIgYWZ0ZXIgdGhpcyBjYWxsLiBEaXNwb3NpbmcKLQkgKiBhIG5vZGUgd2lsbCB0YWtlIGNhcmUgb2YgcmVtb3ZpbmcgdGhpcyBub2RlJ3MgbGlzdGVuZXIgZnJvbSB0aGUgVU1BCi0JICogb2JqZWN0IGFuZCBhbGwgdGhlIGFkYXB0ZXJzIHRoYXQgaGFkIGJlZW4gYWRkZWQgdG8gdGhlIGFkYXB0ZXIgbGlzdCBvZgotCSAqIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uc3VtZXIKLQkgKi8KLQl2b2lkIHJlbW92ZUNvbnN1bWVyKE9iamVjdCBjb25zdW1lcik7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Ob2RlQ29udGFpbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Ob2RlQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNiMjU5MTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTm9kZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogQSBjb21wb3NpdGUgbm9kZSB0aGF0IGNhbiBjb250YWluIGNoaWxkIG5vZGVzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTm9kZUNvbnRhaW5lciBleHRlbmRzIE5vZGUgewotCS8qKgotCSAqIEdldHMgY2hpbGQgbm9kZXMKLQkgKiAKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHR5cGU9Ik5vZGUiCi0JICovCi0JRUxpc3QgZ2V0Tm9kZXMoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1JvbGVOb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Sb2xlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYWE0NjczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1JvbGVOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotLyoqCi0gKiBOb2RlIHRoYXQgcmVwcmVzZW50cyBhIHJvbGUgaW4gZGlhZ3JhbQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZU5vZGUgZXh0ZW5kcyBOYW1lZE5vZGUgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Sb2xlVGFza0NvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvUm9sZVRhc2tDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTk2MzZlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Sb2xlVGFza0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLS8qKgotICogQSBjb250YWluZXIgdGhhdCBncm91cHMgYSBSb2xlTm9kZSBhbmQgVGFza05vZGVzIHdob3NlIHRhc2tzIHRoZSBSb2xlIHBlcmZvcm1zLgotICogVGhlIGxpbmtlZCBvYmplY3QgZm9yIFJvbGVUYXNrQ29tcG9zaXRlIGlzIFJvbGVEZXNjcmlwdG9yLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZVRhc2tDb21wb3NpdGUgZXh0ZW5kcyBOb2RlQ29udGFpbmVyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb3cgSW5kZXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvdyBJbmRleDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3cgSW5kZXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJvd0luZGV4KGludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZSNnZXRSb2xlVGFza0NvbXBvc2l0ZV9Sb3dJbmRleCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBnZXRSb3dJbmRleCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGUjZ2V0Um93SW5kZXggPGVtPlJvdyBJbmRleDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um93IEluZGV4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSb3dJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Um93SW5kZXgoaW50IHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvVGFza05vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1Rhc2tOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEwNDEzZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvVGFza05vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi0vKioKLSAqIE5vZGUgdGhhdCByZXByZXNlbnRzIGEgdGFzayBpbiBkaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBUYXNrTm9kZSBleHRlbmRzIE5hbWVkTm9kZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmRleDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiItMSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEluZGV4KGludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZSNnZXRUYXNrTm9kZV9JbmRleCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9Ii0xIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgZ2V0SW5kZXgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlI2dldEluZGV4IDxlbT5JbmRleDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEluZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbmRleChpbnQgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9UeXBlZE5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1R5cGVkTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YzBmNGNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1R5cGVkTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLS8qKgotICogTm9kZSB0aGF0IGlzIG5vdCBsaW5rZWQgdG8gYW55IG1ldGhvZCBlbGVtZW50IChub3QgYSB7QGxpbmsgTGlua2VkT2JqZWN0fSkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBUeXBlZE5vZGUgZXh0ZW5kcyBOb2RlIHsKLQlzdGF0aWMgZmluYWwgaW50IFNZTkNIX0JBUiA9IDE7Ci0KLQlzdGF0aWMgZmluYWwgaW50IERFQ0lTSU9OID0gMjsKLQotCXN0YXRpYyBmaW5hbCBpbnQgU1RBUlQgPSAzOwotCi0Jc3RhdGljIGZpbmFsIGludCBFTkQgPSA0OwotCi0Jc3RhdGljIGZpbmFsIGludCBTVElDS1lfTk9URSA9IDU7Ci0KLQlzdGF0aWMgZmluYWwgaW50IEZSRUVfVEVYVCA9IDY7Ci0KLQkvKioKLQkgKiBHZXRzIHR5cGUuIFRoZSB0eXBlIG11c3QgYmUgb25lIG9mIHRoZSBjb25zdGFudHMgZGVmaW5lZCBpbiB0aGlzCi0JICogaW50ZXJmYWNlLgotCSAqIAotCSAqIEBtb2RlbAotCSAqLwotCWludCBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoaW50IHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI3MTRmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLQotLyoqCi0gKiBOb2RlIHRoYXQgcmVwcmVzZW50cyBhIHtAbGluayBXb3JrQnJlYWtkb3duRWxlbWVudH0KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBleHRlbmRzIE5hbWVkTm9kZSB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0Q29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrUHJvZHVjdENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYzEyNjEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLS8qKgotICogTm9kZSB0aGF0IHJlcHJlc2VudHMgYSBncm91cCBvZiB7QGxpbmsgV29ya1Byb2R1Y3R9Ci0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3RDb21wb3NpdGUgZXh0ZW5kcyBOb2RlQ29udGFpbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOUFVUUyA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRQVVRTID0gMjsKLQotCS8qKgotCSAqIEdldHMgdHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHtAbGluayAjSU5QVVRTfSBvciB7QGxpbmsgI09VVFBVVFN9Ci0JICogQG1vZGVsCi0JICovCi0JaW50IGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKGludCB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTdkYjgxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIHRoZSBtb2RlbCBvZiB0aGUgV29yayBQcm9kdWN0IERlcGVuZGVuY3kgZGlhZ3JhbQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSBleHRlbmRzIERpYWdyYW0gewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRjNDgxMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLS8qKgotICogTm9kZSBmb3IgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGluIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgZXh0ZW5kcyBOYW1lZE5vZGUgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrUHJvZHVjdE5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNWQ0ZmFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbm9kZSBpbiBXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdE5vZGUgZXh0ZW5kcyBOYW1lZE5vZGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVJUSUZBQ1QgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVMSVZFUkFCTEUgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUQ09NRSA9IDM7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3b3JrIHByb2R1Y3QgdHlwZSBvZiB0aGlzIG5vZGUuIFRoaXMgbXVzdCBiZSBvbmUgb2YgdGhlCi0JICogZm9sbG93aW5nIGNvbnN0YW50czoge0BsaW5rICNBUlRJRkFDVH0sIHtAbGluayAjREVMSVZFUkFCTEV9LCB7QGxpbmsgI09VVENPTUV9Ci0JICogCi0JICogQG1vZGVsCi0JICovCi0JaW50IGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShpbnQgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZTZlYTBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2aXR5IERldGFpbCBEaWFncmFtPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwjaXNBdXRvTGF5b3V0IDxlbT5BdXRvIExheW91dDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgZXh0ZW5kcyBEaWFncmFtSW1wbCBpbXBsZW1lbnRzCi0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQXV0b0xheW91dCgpIDxlbT5BdXRvIExheW91dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBdXRvTGF5b3V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQVVUT19MQVlPVVRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQXV0b0xheW91dCgpIDxlbT5BdXRvIExheW91dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBdXRvTGF5b3V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdXRvTGF5b3V0ID0gQVVUT19MQVlPVVRfRURFRkFVTFQ7Ci0KLQlwcml2YXRlIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgQWN0aXZpdHlBZGFwdGVyCi0JCQlpbXBsZW1lbnRzIElBY3Rpdml0eURldGFpbERpYWdyYW1DaGFuZ2VMaXN0ZW5lciB7Ci0JCS8vIC8qIChub24tSmF2YWRvYykKLQkJLy8gKiBAc2VlCi0JCS8vIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwuQWN0aXZpdHlBZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkvLyAqLwotCQkvLyBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJLy8gaWYoIW5vdGlmaWNhdGlvbkVuYWJsZWQpIHJldHVybjsKLQkJLy8gbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkvLyB0cnkgewotCQkvLyBPYmplY3Qgb2JqOwotCQkvLyBzd2l0Y2gobXNnLmdldEZlYXR1cmVJRChBY3Rpdml0eS5jbGFzcykpIHsKLQkJLy8gY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCS8vIHJlcG9wdWxhdGVEaWFncmFtKCk7Ci0JCS8vIGJyZWFrOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gZmluYWxseSB7Ci0JCS8vIG5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCQkvLyB9Ci0JCS8vCi0JCS8vIH0KLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCWRpYWdyYW1DaGFuZ2VMaXN0ZW5lciA9IG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1DaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19BVVRPX0xBWU9VVDoKLQkJCQlyZXR1cm4gaXNBdXRvTGF5b3V0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fQVVUT19MQVlPVVQ6Ci0JCQkJc2V0QXV0b0xheW91dCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0FVVE9fTEFZT1VUOgotCQkJCXNldEF1dG9MYXlvdXQoQVVUT19MQVlPVVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0FVVE9fTEFZT1VUOgotCQkJCXJldHVybiBhdXRvTGF5b3V0ICE9IEFVVE9fTEFZT1VUX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYXV0b0xheW91dDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXV0b0xheW91dCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlcG9wdWxhdGVEaWFncmFtKCkgewotCQkvLyBjbGVhciBkaWFncmFtCi0JCS8vCi0KLQkJaW50IHNpemUgPSBnZXROb2RlcygpLnNpemUoKTsKLQotCQkvLyBkaXNhYmxlIG5vdGlmaWNhdGlvbiBmb3IgYWxsIG5vZGVzIGluIHRoaXMgZGlhZ3JhbSB0byBhdm9pZCB1bndhbnRlZAotCQkvLyBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBvZiB0aGVpciBjb25uZWN0aW9uIGxpc3QKLQkJLy8KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU5vZGVJbXBsIG5vZGUgPSAoKE5vZGVJbXBsKSBnZXROb2RlcygpLmdldChpKSk7Ci0JCQlub2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdGlvbiA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0aW9uLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyYXRpb24ubmV4dCgpOwotCi0JCQkvLyBjbGVhciBhbGwgbGlua3MKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCWxpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQkJfQotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCWxpbmsuc2V0U291cmNlKG51bGwpOwotCQkJfQotCQkJbm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuY2xlYXIoKTsKLQkJCW5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLmNsZWFyKCk7Ci0JCX0KLQotCQlnZXROb2RlcygpLmNsZWFyKCk7Ci0KLQkJcG9wdWxhdGVEaWFncmFtKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBdXRvTGF5b3V0KCkgewotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQlyZXR1cm4gR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0FVVE9fTEFZT1VUX1ZBTFVFX1RSVUUuZXF1YWxzKAotCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmdldEF1dG9MYXlvdXRGbGFnKHRoaXMpKTsKLQkJfQotCQlyZXR1cm4gYXV0b0xheW91dDsKLQl9Ci0KLQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0b0xheW91dChib29sZWFuIG5ld0F1dG9MYXlvdXQpIHsKLQkJYm9vbGVhbiBvbGRBdXRvTGF5b3V0ID0gYXV0b0xheW91dDsKLQkJYXV0b0xheW91dCA9IG5ld0F1dG9MYXlvdXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fQVVUT19MQVlPVVQsIG9sZEF1dG9MYXlvdXQsIGF1dG9MYXlvdXQpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9TZXRBdXRvTGF5b3V0KGJvb2xlYW4gbmV3QXV0b0xheW91dCkgewotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQlHcmFwaGljYWxEYXRhSGVscGVyLmNyZWF0ZVByb3BlcnR5KHRoaXMuZ3JhcGhOb2RlLCAKLQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0FVVE9fTEFZT1VULCAKLQkJCQkJU3RyaW5nLnZhbHVlT2YobmV3QXV0b0xheW91dCkpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0QXV0b0xheW91dChuZXdBdXRvTGF5b3V0KTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGdldEFsbEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgYnJlYWtkb3duIGVsZW1lbnRzIG9yIHRoZWlyIHdyYXBwZXJzIGZvciB0aGUgYWN0aXZpdHkgb2YgdGhpcwotCSAqIGRpYWdyYW0KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JQ29sbGVjdGlvbiBnZXRBbGxCcmVha2Rvd25FbGVtZW50cygpIHsKLQkJQXJyYXlMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXM7Ci0JCWlmKGZpbHRlciBpbnN0YW5jZW9mIElBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJSUFkYXB0ZXJGYWN0b3J5RmlsdGVyIGFkYXB0ZXJGYWN0b3J5RmlsdGVyID0gKElBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyOwotCQkJYWRhcHRlckZhY3RvcmllcyA9IG5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJYWRhcHRlckZhY3RvcnlGaWx0ZXIuZ2V0V0JTQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJYWRhcHRlckZhY3RvcnlGaWx0ZXIuZ2V0VEJTQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJYWRhcHRlckZhY3RvcnlGaWx0ZXIuZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCkgCi0JCQl9OwotCQl9Ci0JCWVsc2UgewotCQkJYWRhcHRlckZhY3RvcmllcyA9IERFRkFVTFRfQURBUFRFUl9GQUNUT1JJRVM7Ci0JCX0KLQkJaWYgKHdyYXBwZXIgIT0gbnVsbCkgewotCQkJTGlzdCB3cmFwcGVycyA9IFByb2Nlc3NVdGlsLmdldFdyYXBwZXJzKHdyYXBwZXIsIGFkYXB0ZXJGYWN0b3JpZXMpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3JhcHBlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgdyA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgaXRlcgotCQkJCQkJLm5leHQoKTsKLQkJCQlleHRyYWN0Q2hpbGRyZW4odywgdywgYnJlYWtkb3duRWxlbWVudHMpOwotCQkJfQotCQl9IGVsc2UgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRlckZhY3Rvcmllcy5sZW5ndGg7IGkrKykgewotCQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3JpZXNbaV07Ci0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkuYWRhcHQoZ2V0T2JqZWN0KCksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJZXh0cmFjdENoaWxkcmVuKGFkYXB0ZXIsIGdldE9iamVjdCgpLCBicmVha2Rvd25FbGVtZW50cyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnRzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNwb3B1bGF0ZU5vZGVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZU5vZGVzKCkgewotCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldE9iamVjdCgpOwotCQlpZiAoYWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQkvLyB0byBwb3B1bGF0ZSB0aGUgdHlwZWRub2RlLgotCQkJc3VwZXIucG9wdWxhdGVOb2RlcygpOwotCQl9Ci0KLQkJaWYoZmlsdGVyID09IG51bGwpewotCQkJZmlsdGVyID0gKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KURFRkFVTFRfQURBUFRFUl9GQUNUT1JJRVNbMF0pLmdldEZpbHRlcigpOwkKLQkJfQotCQkKLQkJLy9Ob2RlIG5ld05vZGUgPSBudWxsOwotCQlBcnJheUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNvbGxlY3Rpb24gYnJlYWtkb3duRWxlbWVudHMgPSBnZXRBbGxCcmVha2Rvd25FbGVtZW50cygpOwotCQlDb2xsZWN0aW9uIHJvbGVEZXNjcmlwdG9ycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBicmVha2Rvd25FbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCVRhc2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQ7Ci0JCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yCi0JCQkJLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCQkJaWYgKHJvbGVEZXNjcmlwdG9yICE9IG51bGwgJiYgZmlsdGVyLmFjY2VwdChyb2xlRGVzY3JpcHRvcikKLQkJCQkJCS8vVE9ETzogbmVlZCB0byBjaGVjayBpZiB0aGUgcm9sZSBkZXNjcmlwdG9yIGlzIGluaGVyaXRlZCBhbmQgbG9jYWxseSBzdXBwcmVzc2VkCi0JCQkJCQkvLyBpZiBsb2NhbGx5IHN1cHByZXNzZWQsIGNoZWNrIHRoZSB3cmFwcGVyIG9mIHRoZSByb2xlIGRlc2NyaXB0b3IKLQkJCQkJCS8vCi0JCQkJCQkmJiAhcm9sZURlc2NyaXB0b3IuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpIAotCQkJCQkJJiYgIXJvbGVEZXNjcmlwdG9ycy5jb250YWlucyhyb2xlRGVzY3JpcHRvcikpIHsKLQkJCQkJcm9sZURlc2NyaXB0b3JzLmFkZChyb2xlRGVzY3JpcHRvcik7Ci0vLwkJCQkJbmV3Tm9kZSA9IGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKHJvbGVEZXNjcmlwdG9yKTsKLS8vCQkJCQlpZihuZXdOb2RlICE9IG51bGwpIHsKLS8vCQkJCQkJaWYoUHJvY2Vzc1V0aWwuaXNJbmhlcml0ZWQob2JqZWN0KSkgewotLy8JCQkJCQkJLy8gdGFzayBkZXNjcmlwdG9yIGlzIGluaGVyaXRlZCwgaXRzIHByaW1hcnkgcGVyZm9ybWVyIGlzIG5vdCBsb2NhbAotLy8JCQkJCQkJLy8gc2V0IHJvbGUgbm9kZSBvZiB0aGUgUm9sZVRhc2tDb21wb3NpdGUgdG8gcmVhZC1vbmx5CQkJCQkJCi0vLwkJCQkJCQkvLwotLy8JCQkJCQkJTm9kZSByb2xlTm9kZSA9IChOb2RlKSAoKE5vZGVDb250YWluZXIpbmV3Tm9kZSkuZ2V0Tm9kZXMoKS5nZXQoMCk7Ci0vLwkJCQkJCQlyb2xlTm9kZS5zZXRSZWFkT25seSh0cnVlKTsKLS8vCQkJCQkJfQotLy8JCQkJCQlub2Rlcy5hZGQobmV3Tm9kZSk7Ci0vLwkJCQkJfQotCQkJCQljcmVhdGVSb2xlVGFza0NvbXBvc2l0ZVJvd3Mocm9sZURlc2NyaXB0b3IsIG9iamVjdCwgbm9kZXMpOwotCQkJCX0KLQkJCQlpZihyb2xlRGVzY3JpcHRvcnMuY29udGFpbnMocm9sZURlc2NyaXB0b3IpKXsKLQkJCQkJY3JlYXRlVGFza0lucHV0T3V0cHV0Tm9kZXMoZGVzY3JpcHRvciwgbm9kZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzZWxlY3ROb2Rlcyhub2Rlcyk7Ci0JfQkKLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZVJvd3MoUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IsIAotICAgIAkJT2JqZWN0IG9iamVjdCwgTGlzdCBub2RlcykgewotICAgIAkKLSAgICAJaW50IHRhc2tzUGVyUm93ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRUYXNrc1BlclJvdygpOwotICAgIAlMaXN0IHByaW1hcnlUYXNrRGVzY3JpcHRvcnMgPSAvL0Fzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocm9sZURlc2NyaXB0b3IpOwotICAgIAkJZ2V0UmVhbGl6ZWRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjcmlwdG9yKTsKLSAgICAJaW50IHRvdGFsVGFza3MgPSBwcmltYXJ5VGFza0Rlc2NyaXB0b3JzLnNpemUoKTsKLSAgICAJCi0gICAgCWlmKHRhc2tzUGVyUm93ID4gMCAmJiB0b3RhbFRhc2tzID4gMCAgJiYgdG90YWxUYXNrcyA+IHRhc2tzUGVyUm93Ci0gICAgCQkJJiYgaXNBdXRvTGF5b3V0KCkpewotICAgIAkJZm9yKGludCBpID0wOyBpIDw9IHRvdGFsVGFza3MvdGFza3NQZXJSb3c7IGkrKyl7Ci0gICAgCQkJTm9kZSBuZXdOb2RlID0gY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUocm9sZURlc2NyaXB0b3IsIGkpOwotICAgIAkJCWlmKG5ld05vZGUgIT0gbnVsbCkgewotICAgIAkJCQlpZihQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChvYmplY3QpKSB7Ci0gICAgCQkJCQkvLyB0YXNrIGRlc2NyaXB0b3IgaXMgaW5oZXJpdGVkLCBpdHMgcHJpbWFyeSBwZXJmb3JtZXIgaXMgbm90IGxvY2FsCi0gICAgCQkJCQkvLyBzZXQgcm9sZSBub2RlIG9mIHRoZSBSb2xlVGFza0NvbXBvc2l0ZSB0byByZWFkLW9ubHkJCQkJCQkKLSAgICAJCQkJCS8vCi0gICAgCQkJCQlMaXN0IG5vZHMgPSAoKE5vZGVDb250YWluZXIpbmV3Tm9kZSkuZ2V0Tm9kZXMoKTsKLSAgICAJCQkJCWlmKCFub2RzLmlzRW1wdHkoKSl7Ci0gICAgCQkJCQkJTm9kZSByb2xlTm9kZSA9IChOb2RlKSBub2RzLmdldCgwKTsKLSAgICAJCQkJCQlyb2xlTm9kZS5zZXRSZWFkT25seSh0cnVlKTsKLSAgICAJCQkJCX0KLSAgICAJCQkJfQotICAgIAkJCQlub2Rlcy5hZGQobmV3Tm9kZSk7Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAl9ZWxzZXsKLSAgICAJCU5vZGUgbmV3Tm9kZSA9IGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmKG5ld05vZGUgIT0gbnVsbCkgewotCQkJCWlmKFByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKG9iamVjdCkpIHsKLQkJCQkJLy8gdGFzayBkZXNjcmlwdG9yIGlzIGluaGVyaXRlZCwgaXRzIHByaW1hcnkgcGVyZm9ybWVyIGlzIG5vdCBsb2NhbAotCQkJCQkvLyBzZXQgcm9sZSBub2RlIG9mIHRoZSBSb2xlVGFza0NvbXBvc2l0ZSB0byByZWFkLW9ubHkJCQkJCQkKLQkJCQkJLy8KLQkJCQkJTGlzdCBub2RzID0gKChOb2RlQ29udGFpbmVyKW5ld05vZGUpLmdldE5vZGVzKCk7Ci0JCQkJCWlmKCFub2RzLmlzRW1wdHkoKSl7Ci0JCQkJCQlOb2RlIHJvbGVOb2RlID0gKE5vZGUpIG5vZHMuZ2V0KDApOwotCQkJCQkJcm9sZU5vZGUuc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbm9kZXMuYWRkKG5ld05vZGUpOwotCQkJfQotICAgIAl9Ci0gICAgCQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXNrRGVzY3JpcHRvcgotCSAqIEByZXR1cm4KLQkgKi8KLQlOb2RlIGNyZWF0ZU5vZGUoVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IpIHsKLQkJTm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrTm9kZSgpOwotCQlub2RlLnNldFVNQUNvbnRhaW5lcihnZXRHcmFwaE5vZGUoKSk7Ci0JCW5vZGUuc2V0RGlhZ3JhbSh0aGlzKTsKLQkJbm9kZS5zZXRPYmplY3QodGFza0Rlc2NyaXB0b3IpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqIEByZXR1cm4KLQkgKi8KLQlOb2RlIGNyZWF0ZU5vZGUoV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJTm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCk7Ci0JCW5vZGUuc2V0VU1BQ29udGFpbmVyKGdldEdyYXBoTm9kZSgpKTsKLQkJbm9kZS5zZXREaWFncmFtKHRoaXMpOwotCQlub2RlLnNldE9iamVjdChkZXNjcmlwdG9yKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI3BvcHVsYXRlTGlua3MoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTGlua3MoKSB7Ci0JCXBvcHVsYXRlTGlua3MoZ2V0Tm9kZXMoKSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld05vZGVzCi0JICogQHBhcmFtIGRpc2FibGVOb3RpZmljYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVMaW5rcyhDb2xsZWN0aW9uIG5ld05vZGVzLCBib29sZWFuIGRpc2FibGVOb3RpZmljYXRpb24pIHsKLQkJLy8gZmlsbCBvdXRnb2luZy9pbmNvbWluZyBjb25uZWN0aW9uIGxpc3RzIG9mIGFsbCBub2RlcwotCQkvLwotCQlpbnQgc2l6ZSA9IGdldE5vZGVzKCkuc2l6ZSgpOwotCQlib29sZWFuW10gbm90aWZpZXMgPSBuZXcgYm9vbGVhbltzaXplXTsKLQkJdHJ5IHsKLQkJCWlmIChkaXNhYmxlTm90aWZpY2F0aW9uKQotCQkJCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uIGZvciBhbGwgbm9kZXMgaW4gdGhpcyBkaWFncmFtIHRvIGF2b2lkCi0JCQkJLy8gdW53YW50ZWQgY29uY3VycmVudCBtb2RpZmljYXRpb24gb2YgdGhlaXIgY29ubmVjdGlvbiBsaXN0Ci0JCQkJLy8KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlOb2RlIG5vZGUgPSAoKE5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpKTsKLQkJCQkJbm90aWZpZXNbaV0gPSBub2RlLmVEZWxpdmVyKCk7Ci0JCQkJCW5vZGUuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3Tm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTm9kZSBjaGlsZCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZSkgewotCQkJCQkvLyBXb3JrUHJvZHVjdENvbXBvc2l0ZSB3b3JrcHJvZHVjdENvbXBvc2l0ZSA9Ci0JCQkJCS8vIChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgY2hpbGQuZ2V0T2JqZWN0KCk7Ci0JCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdvcmtwcm9kdWN0Q29tcG9zaXRlID0gKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSBjaGlsZDsKLQkJCQkJaWYgKHdvcmtwcm9kdWN0Q29tcG9zaXRlLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCQkJCU9iamVjdCBvYmplY3QgPSB3b3JrcHJvZHVjdENvbXBvc2l0ZS5nZXRPYmplY3QoKTsKLQkJCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJCU5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywKLQkJCQkJCQkJCW9iamVjdCk7Ci0JCQkJCQkJaWYoR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTGluayhjaGlsZCwgb2JqZWN0KSA9PSBudWxsKSB7Ci0JCQkJCQkJCUxpbmsgbGluayA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluaygpOwotCQkJCQkJCQlsaW5rLnNldFNvdXJjZShjaGlsZCk7Ci0JCQkJCQkJCWxpbmsuc2V0VGFyZ2V0KG5vZGUpOwotCQkJCQkJCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmFkZEdyYXBoaWNhbERhdGEobGluayk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHdvcmtwcm9kdWN0Q29tcG9zaXRlLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKSB7Ci0JCQkJCQlPYmplY3Qgb2JqZWN0ID0gd29ya3Byb2R1Y3RDb21wb3NpdGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCQlOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKHRoaXMsCi0JCQkJCQkJCQlvYmplY3QpOwotCQkJCQkJCWlmKEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZExpbmsobm9kZSwgb2JqZWN0KSA9PSBudWxsKSB7Ci0JCQkJCQkJCUxpbmsgbGluayA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluaygpOwotCQkJCQkJCQlsaW5rLnNldFNvdXJjZShub2RlKTsKLQkJCQkJCQkJbGluay5zZXRUYXJnZXQoY2hpbGQpOwotCQkJCQkJCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmFkZEdyYXBoaWNhbERhdGEobGluayk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0gCQl9IGZpbmFsbHkgewotCQkJaWYgKGRpc2FibGVOb3RpZmljYXRpb24pCi0JCQkJLy8gcmVzdG9yZSBub3RpZmljYXRpb24gZmxhZwotCQkJCS8vCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJKChFT2JqZWN0KSBnZXROb2RlcygpLmdldChpKSkuZVNldERlbGl2ZXIobm90aWZpZXNbaV0pOwotCQkJCX0KLQkJfQotCi0JfQotCQotCXByaXZhdGUgUm9sZVRhc2tDb21wb3NpdGUgZG9DcmVhdGVSb2xlVGFza0NvbXBvc2l0ZShSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvcikgewotCQlSb2xlVGFza0NvbXBvc2l0ZSByb2xlVGFza0NvbXBvc2l0ZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIGVsZW1lbnQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlKSB7Ci0JCQkJUm9sZVRhc2tDb21wb3NpdGUgcnRjID0gKFJvbGVUYXNrQ29tcG9zaXRlKSBlbGVtZW50OwotCQkJCWlmKHJ0Yy5nZXRMaW5rZWRFbGVtZW50KCkgPT0gcm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJcm9sZVRhc2tDb21wb3NpdGUgPSBydGM7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChyb2xlVGFza0NvbXBvc2l0ZSA9PSBudWxsKSB7Ci0JCQlyb2xlVGFza0NvbXBvc2l0ZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKCk7Ci0JCQlyb2xlVGFza0NvbXBvc2l0ZS5zZXRVTUFDb250YWluZXIoZ2V0R3JhcGhOb2RlKCkpOwotCQkJcm9sZVRhc2tDb21wb3NpdGUuc2V0RGlhZ3JhbSh0aGlzKTsKLQkJfQotCQlyZXR1cm4gcm9sZVRhc2tDb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIFJvbGVUYXNrQ29tcG9zaXRlIGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKAotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IpIHsKLQkJUm9sZVRhc2tDb21wb3NpdGUgcm9sZVRhc2tDb21wb3NpdGUgPSBkb0NyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKHJvbGVEZXNjcmlwdG9yKTsKLQkJcm9sZVRhc2tDb21wb3NpdGUuc2V0T2JqZWN0KHJvbGVEZXNjcmlwdG9yKTsKLQkJcmV0dXJuIHJvbGVUYXNrQ29tcG9zaXRlOwotCX0KLQkKLQlwdWJsaWMgUm9sZVRhc2tDb21wb3NpdGUgY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUoCi0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciwgaW50IHJvd0luZGV4KSB7Ci0JCVJvbGVUYXNrQ29tcG9zaXRlIHJvbGVUYXNrQ29tcG9zaXRlID0gZG9DcmVhdGVSb2xlVGFza0NvbXBvc2l0ZShyb2xlRGVzY3JpcHRvcik7Ci0JCSgoUm9sZVRhc2tDb21wb3NpdGVJbXBsKXJvbGVUYXNrQ29tcG9zaXRlKS5zZXRSb3dJbmRleChyb3dJbmRleCk7Ci0JCXJvbGVUYXNrQ29tcG9zaXRlLnNldE9iamVjdChyb2xlRGVzY3JpcHRvcik7Ci0JCXJldHVybiByb2xlVGFza0NvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgV29ya1Byb2R1Y3RDb21wb3NpdGUgY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoCi0JCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciwgaW50IHR5cGUpIHsKLQkJV29ya1Byb2R1Y3RDb21wb3NpdGUgd29ya3Byb2R1Y3RDb21wb3NpdGUgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBlbGVtZW50ID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZSkgewotCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdwYyA9IChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgZWxlbWVudDsKLQkJCQlpZih3cGMuZ2V0TGlua2VkRWxlbWVudCgpID09IHRhc2tEZXNjcmlwdG9yICYmIHdwYy5nZXRUeXBlKCkgPT0gdHlwZSkgewkJCQkJCi0JCQkJCXdvcmtwcm9kdWN0Q29tcG9zaXRlID0gd3BjOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYod29ya3Byb2R1Y3RDb21wb3NpdGUgPT0gbnVsbCkgewotCQkJd29ya3Byb2R1Y3RDb21wb3NpdGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkuY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoKTsKLQkJCXdvcmtwcm9kdWN0Q29tcG9zaXRlLnNldFR5cGUodHlwZSk7Ci0JCX0KLQkJd29ya3Byb2R1Y3RDb21wb3NpdGUuc2V0VU1BQ29udGFpbmVyKGdldEdyYXBoTm9kZSgpKTsKLQkJd29ya3Byb2R1Y3RDb21wb3NpdGUuc2V0RGlhZ3JhbSh0aGlzKTsKLQkJd29ya3Byb2R1Y3RDb21wb3NpdGUuc2V0T2JqZWN0KHRhc2tEZXNjcmlwdG9yKTsKLQkJcmV0dXJuIHdvcmtwcm9kdWN0Q29tcG9zaXRlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNnZXRUeXBlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiBHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNnZXREaWFncmFtQ2hhbmdlTGlzdGVuZXJUeXBlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0RGlhZ3JhbUNoYW5nZUxpc3RlbmVyVHlwZSgpIHsKLQkJcmV0dXJuIElBY3Rpdml0eURldGFpbERpYWdyYW1DaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjZ2V0QnJlYWtkb3duRWxlbWVudFR5cGUoKQotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXRCcmVha2Rvd25FbGVtZW50VHlwZSgpIHsKLQkJcmV0dXJuIERlc2NyaXB0b3IuY2xhc3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI3RvTm9kZShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgdG9Ob2RlKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlMaXN0IGxpc3QgPSAvL0Fzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMoKFJvbGVEZXNjcmlwdG9yKSBlKTsKLQkJCQlnZXRSZWFsaXplZFByaW1hcnlUYXNrRGVzY3JpcHRvcnMoKFJvbGVEZXNjcmlwdG9yKWUpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCWNyZWF0ZVRhc2tJbnB1dE91dHB1dE5vZGVzKChUYXNrRGVzY3JpcHRvcikgb2JqLCBnZXROb2RlcygpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUoKFJvbGVEZXNjcmlwdG9yKSBlKTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCWNyZWF0ZVRhc2tJbnB1dE91dHB1dE5vZGVzKChUYXNrRGVzY3JpcHRvcikgZSwgZ2V0Tm9kZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI2FkZE5vZGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBhZGROb2RlKE9iamVjdCBvYmopIHsKLQkJaWYgKGZpbHRlciA9PSBudWxsKSB7Ci0JCQlmaWx0ZXIgPSAoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIERFRkFVTFRfQURBUFRFUl9GQUNUT1JJRVNbMF0pCi0JCQkJCS5nZXRGaWx0ZXIoKTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IKLQkJCQkmJiAhZmlsdGVyLmFjY2VwdCgoKFRhc2tEZXNjcmlwdG9yKSBvYmopCi0JCQkJCQkuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZSBub2RlID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciA9ICgoVGFza0Rlc2NyaXB0b3IpIG9iaikKLQkJCQkJLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCQlub2RlID0gZmluZE5vZGUodGhpcywgcm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCW5vZGUgPSBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZShyb2xlRGVzY3JpcHRvcik7Ci0JCQkJZ2V0Tm9kZXMoKS5hZGQobm9kZSk7Ci0JCQl9IGVsc2UgewotCQkJCW5vZGUgPSBzdXBlci5hZGROb2RlKGdldE5vZGVzKCksIG9iaik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlub2RlID0gc3VwZXIuYWRkTm9kZShnZXROb2RlcygpLCBvYmopOwotCQl9Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXBvcHVsYXRlTGlua3MoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChub2RlKSwgZmFsc2UpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNhZGROb2RlcyhqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBhZGROb2RlcyhDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJQ29sbGVjdGlvbiBub2RlcyA9IHN1cGVyLmFkZE5vZGVzKGNvbGxlY3Rpb24pOwotCQlpZiAoIW5vZGVzLmlzRW1wdHkoKSkgewotCQkJcG9wdWxhdGVMaW5rcyhub2RlcywgZmFsc2UpOwotCQl9Ci0JCXJldHVybiBub2RlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjcmVtb3ZlRnJvbVVtYU1vZGVsKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVtYU1vZGVsKE5vZGUgcmVtb3ZlZE5vZGUpIHsKLQkJLy8gaWYgdGhlIHJlbW92ZWQgbm9kZSBpcyBhIFRhc2tOb2RlIHRoYXQgaGFkIGJlZW4gbW92ZWQgdG8gYQotCQkvLyBSb2xlVGFza0NvbXBvc2l0ZQotCQkvLyB0aGVuIGl0cyBUYXNrRGVzY3JpcHRvciB3aWxsIG5vdCBiZSByZW1vdmVkIGZyb20gbW9kZWwKLQkJLy8KLQkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywgcmVtb3ZlZE5vZGUuZ2V0T2JqZWN0KCkpICE9IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAocmVtb3ZlZE5vZGUgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZQotCQkJCXx8IHJlbW92ZWROb2RlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUpCi0JCQlyZXR1cm47Ci0KLQkJc3VwZXIucmVtb3ZlRnJvbVVtYU1vZGVsKHJlbW92ZWROb2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1VtYU1vZGVsKGludCBwb3NpdGlvbiwgTm9kZSBhZGRlZE5vZGUpIHsKLQkJc3VwZXIuYWRkVG9VbWFNb2RlbChwb3NpdGlvbiwgYWRkZWROb2RlKTsKLQotCQlpZiAoYWRkZWROb2RlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRPYmplY3QoKTsKLQkJCS8vIHRyYW5zbGF0ZSBOb2RlIGluZGV4IHRvIEFjdGl2aXR5IGluZGV4Ci0JCQlpbnQgaSA9IHRvQWN0aXZpdHlJbmRleChwb3NpdGlvbik7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJBY3Rpdml0eURldGFpbERpYWdyYW0uYWRkVG9VbWFNb2RlbCgpOiBXb3JrQnJlYWtkb3duRWxlbWVudCBpbmRleDogIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaSA9PSAtMSkgewotCQkJCWFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChhZGRlZE5vZGUuZ2V0T2JqZWN0KCkpOwotCQkJfSBlbHNlIHsKLQkJCQlhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoaSwgYWRkZWROb2RlLmdldE9iamVjdCgpKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBpbnQgdG9BY3Rpdml0eUluZGV4KGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPT0gLTEpCi0JCQlyZXR1cm4gaW5kZXg7Ci0JCWludCBzaXplID0gZ2V0Tm9kZXMoKS5zaXplKCk7Ci0JCWludCBpID0gaW5kZXggKyAxOwotCQlpZiAoaSA9PSBzaXplKQotCQkJcmV0dXJuIC0xOwotCQlOb2RlIG5vZGUgPSAoTm9kZSkgZ2V0Tm9kZXMoKS5nZXQoaSk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJZm9yICg7ICEobm9kZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpICYmIGkgPCBzaXplOyBpKyspIHsKLQkJCW5vZGUgPSAoTm9kZSkgZ2V0Tm9kZXMoKS5nZXQoaSk7Ci0JCX0KLQkJaWYgKGkgPT0gc2l6ZSkKLQkJCXJldHVybiAtMTsKLQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRPYmplY3QoKTsKLQkJcmV0dXJuIGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmluZGV4T2Yobm9kZS5nZXRPYmplY3QoKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgTm9kZSBmaW5kTm9kZShBY3Rpdml0eURldGFpbERpYWdyYW0gZGlhZ3JhbSwgT2JqZWN0IG9iamVjdCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIGVsZW1lbnQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0ID09IGVsZW1lbnQuZ2V0T2JqZWN0KCkpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRhcHRlckZhY3RvcnlbXSBERUZBVUxUX0FEQVBURVJfRkFDVE9SSUVTID0gewkJCQotCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIAotCX07IAotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZVRhc2tJbnB1dE91dHB1dE5vZGVzKFRhc2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIENvbGxlY3Rpb24gbm9kZXMpIHsKLQkJTm9kZSBuZXdOb2RlID0gbnVsbDsKLQkJaWYgKCFkZXNjcmlwdG9yLmdldE1hbmRhdG9yeUlucHV0KCkuaXNFbXB0eSgpKSB7Ci0JCQluZXdOb2RlID0gY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoZGVzY3JpcHRvciwKLQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKTsKLQkJCW5vZGVzLmFkZChuZXdOb2RlKTsKLQkJfQotCQlpZiAoIWRlc2NyaXB0b3IuZ2V0T3V0cHV0KCkuaXNFbXB0eSgpKSB7Ci0JCQluZXdOb2RlID0gY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoZGVzY3JpcHRvciwKLQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUuT1VUUFVUUyk7Ci0JCQlub2Rlcy5hZGQobmV3Tm9kZSk7Ci0JCX0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNzZXROZXcoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZXcoYm9vbGVhbiBuKSB7Ci0JCXN1cGVyLnNldE5ldyhuKTsKLQkJaWYobil7Ci0JCQlkb1NldEF1dG9MYXlvdXQodHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNtb3ZlTm9kZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdmVOb2RlKE9iamVjdCBvbGRWYWx1ZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotCQotCXB1YmxpYyBMaXN0IGdldFJlYWxpemVkUHJpbWFyeVRhc2tEZXNjcmlwdG9ycyhSb2xlRGVzY3JpcHRvciByKXsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZihyICE9IG51bGwpewotCQkJTGlzdCBhY3R1YWxMaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UHJpbWFyeVRhc2tEZXNjcmlwdG9ycyhyKTsKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IGdldEFsbEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBhY3R1YWxMaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkJCU9iamVjdCBlID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKFRuZ1V0aWwuY29udGFpbnMoY29sbGVjdGlvbiwgZSkpewotCQkJCQlsaXN0LmFkZChlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotfSAvLyBBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0FjdGl2aXR5RGlhZ3JhbUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvQWN0aXZpdHlEaWFncmFtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YjIwMzk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvQWN0aXZpdHlEaWFncmFtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklBY3Rpdml0eURpYWdyYW1DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklBZGFwdGVyRmFjdG9yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZpdHkgRGlhZ3JhbTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGlhZ3JhbUltcGwgZXh0ZW5kcyBEaWFncmFtSW1wbCBpbXBsZW1lbnRzIEFjdGl2aXR5RGlhZ3JhbSB7Ci0JcHJpdmF0ZSBjbGFzcyBBY3Rpdml0eURpYWdyYW1DaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEFjdGl2aXR5QWRhcHRlcgotCQkJaW1wbGVtZW50cyBJQWN0aXZpdHlEaWFncmFtQ2hhbmdlTGlzdGVuZXIgewotCi0JfTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eURpYWdyYW1JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCWRpYWdyYW1DaGFuZ2VMaXN0ZW5lciA9IG5ldyBBY3Rpdml0eURpYWdyYW1DaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBDbGFzcyBnZXREaWFncmFtQ2hhbmdlTGlzdGVuZXJUeXBlKCkgewotCQlyZXR1cm4gSUFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9ESUFHUkFNOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTm9kZXMoKSB7Ci0JCS8vIEFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0T2JqZWN0KCk7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSBkaWFncmFtID0gZ2V0VU1BRGlhZ3JhbSgpOwotCi0JCS8vIGFkZCBUeXBlZE5vZGVzCi0JCS8vCi0JCUxpc3QgdHlwZWROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXRDb250YWluZWQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpbnQgdHlwZSA9IGdldFR5cGUoZWxlbWVudCk7Ci0JCQlpZiAodHlwZSA+IDApIHsKLQkJCQlUeXBlZE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHlwZWROb2RlKCk7Ci0JCQkJbm9kZS5zZXRUeXBlKHR5cGUpOwotCQkJCW5vZGUuc2V0T2JqZWN0KGVsZW1lbnQpOwotCQkJCXR5cGVkTm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JCWdldE5vZGVzKCkuYWRkQWxsKHR5cGVkTm9kZXMpOwotCi0JCS8vIGFkZCBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVzCi0JCS8vCi0JCWFkZEVsZW1lbnROb2RlcygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFdvcmtPcmRlcihXb3JrT3JkZXIgd28sIE9iamVjdCBwcmVkKSB7Ci0JCWlmICh3by5nZXRQcmVkKCkgPT0gcHJlZCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlpZiAocHJlZCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIHByZWQ7Ci0JCQkvLyBjaGVjayBpZiBwcmVkZWNlc3NvciByZWZlcmVuY2UgaW4gdGhlIGdpdmVuIHdvcmsgb3JkZXIgaXMgYmFzZSBvZgotCQkJLy8gcHJlZAotCQkJLy8KLQkJCWZvciAoVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsgdmUgIT0gbnVsbDsgdmUgPSB2ZQotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSB7Ci0JCQkJaWYgKHZlID09IHdvLmdldFByZWQoKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQoTGluayBsaW5rKSB7Ci0JCWlmIChsaW5rLmdldFNvdXJjZSgpID09IG51bGwgfHwgbGluay5nZXRUYXJnZXQoKSA9PSBudWxsCi0JCQkJfHwgIWdldE5vZGVzKCkuY29udGFpbnMobGluay5nZXRTb3VyY2UoKSkKLQkJCQl8fCAhZ2V0Tm9kZXMoKS5jb250YWlucyhsaW5rLmdldFRhcmdldCgpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTGlua3MoKSB7Ci0JCXN1cGVyLnBvcHVsYXRlTGlua3MoKTsKLQotCQkvLyByZW1vdmUgdGhlIGludmFsaWQgbGlua3MKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9ICgoTm9kZSkgaXRlci5uZXh0KCkpOwotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgd2JlID0gbnVsbDsKLQkJCWlmIChub2RlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQl3YmUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQl9Ci0JCQlBcnJheUxpc3QgbGlua3NUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWxpbmtMaXN0V2FsazogZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5vZGUKLQkJCQkJLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoIWlzVmFsaWQobGluaykpIHsKLQkJCQkJbGlua3NUb1JlbW92ZS5hZGQobGluayk7Ci0JCQkJfQotCi0JCQkJaWYgKHdiZSAhPSBudWxsKSB7Ci0JCQkJCS8vIFRPRE86IG5lZWQgcmV2aXNpdCB0byBjaGVjayB0aGUgdmFsaWQgY29ubmVjdGlvbiBmcm9tIGEKLQkJCQkJLy8gVHlwZWROb2RlCi0JCQkJCS8vCi0JCQkJCWlmIChsaW5rLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgVHlwZWROb2RlKQotCQkJCQkJY29udGludWUgbGlua0xpc3RXYWxrOwotCi0JCQkJCU9iamVjdCBwcmVkID0gbGluay5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKTsKLQkJCQkJYm9vbGVhbiB3b3JrT3JkZXJGb3VuZCA9IGZhbHNlOwotCQkJCQlmaW5kX1dvcmtPcmRlcjogZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSB3YmUKLQkJCQkJCQkuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5pdGVyYXRvcigpOyBpdGVyYXRvcjEKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJV29ya09yZGVyIHdvID0gKFdvcmtPcmRlcikgaXRlcmF0b3IxLm5leHQoKTsKLQkJCQkJCWlmIChpc1ZhbGlkV29ya09yZGVyKHdvLCBwcmVkKSkgewotCQkJCQkJCXdvcmtPcmRlckZvdW5kID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmaW5kX1dvcmtPcmRlcjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIXdvcmtPcmRlckZvdW5kKSB7Ci0JCQkJCQkvLyBpbnZhbGlkIGxpbmssIHJlbW92ZSBpdAotCQkJCQkJLy8KLQkJCQkJCWxpbmtzVG9SZW1vdmUuYWRkKGxpbmspOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlua3NUb1JlbW92ZS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5yZW1vdmVMaW5rKGxpbmspOwotCQkJfQotCQkJbGlua3NUb1JlbW92ZS5jbGVhcigpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICghaXNWYWxpZChsaW5rKSkgewotCQkJCQlsaW5rc1RvUmVtb3ZlLmFkZChsaW5rKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaW5rc1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZUxpbmsobGluayk7Ci0JCQl9Ci0JCQlsaW5rc1RvUmVtb3ZlLmNsZWFyKCk7Ci0JCQlsaW5rc1RvUmVtb3ZlID0gbnVsbDsKLQkJfQotCi0JCS8vIENoZWNrIHRoZSBsaW5rcyBvZiBlYWNoIEFjdGl2aXR5Tm9kZQotCQkvLyBzZXQgdGhlIFdvcmtPcmRlciB0byB0aGUgbGluayBpZiBuZWVkZWQKLQkJLy8gYWRkIG5ldyBsaW5rIGZvciB0aG9zZSBXb3JrT3JkZXJzIHRoYXQgc3RpbGwgZG9uJ3QgaGF2ZSB0aGUKLQkJLy8gY29ycmVzcG9uZGluZyBsaW5rCi0JCS8vCi0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoKE5vZGUpIGl0ZXIubmV4dCgpKTsKLQkJCWlmIChub2RlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7IAotCQkJCS8vIEdldCB0aGUgcmF3IGRhdGEgb2Ygd29ya29yZGVycyBmb3Igb2JqZWN0LgotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGxvY2FsID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlLmdldE9iamVjdCgpOwotCQkJCWxpc3QuYWRkQWxsKGxvY2FsLmdldExpbmtUb1ByZWRlY2Vzc29yKCkpOwotCQkJCQotCQkJCS8vIEdldCB0aGUgUHJlZGVjZXNzb3IgTGlzdCBvbiB0b3Agb2YgcmF3IGRhdGEsIHRoaXMgaXMgbmVlZCBmb3IgaW4gY2FzZSBvZiBleHRlbmQuCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSBudWxsOwotCQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKWFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJCQkuYWRhcHQobG9jYWwsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcil7Ci0JCQkJCWxpc3QuYWRkQWxsKCgoSUJTSXRlbVByb3ZpZGVyKWFkYXB0ZXIpLmdldFByZWRlY2Vzc29ycygpKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gSXRlcmF0ZSB3b3JrIG9yZGVycyBhbmQgY3JlYXRlIGxpbmtzLgotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJV29ya09yZGVyIHdvcmtPcmRlciA9IG51bGw7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnQgcHJlZCA9IG51bGw7Ci0JCQkJCWlmKG5leHQgaW5zdGFuY2VvZiBXb3JrT3JkZXIpewotCQkJCQkJd29ya09yZGVyID0gKFdvcmtPcmRlciluZXh0OwotCQkJCQkJcHJlZCA9IHdvcmtPcmRlci5nZXRQcmVkKCk7Ci0JCQkJCX0KLQkJCQkJaWYobmV4dCBpbnN0YW5jZW9mIFdCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKXsKLQkJCQkJCXByZWQgPSAoQnJlYWtkb3duRWxlbWVudCkoKFdCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKW5leHQpLmdldFRhcmdldCgpOyAKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKHByZWQgIT0gbnVsbCAmJiBwcmVkIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCU5vZGUgcHJlZE5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKHRoaXMsCi0JCQkJCQkJCXByZWQsIHRydWUpOwotCQkJCQkJaWYgKHByZWROb2RlICE9IG51bGwpIHsKLQkJCQkJCQkvLyBjaGVjayBpZiB0aGVyZSBpcyBhIGxpbmsgZm9yIHRoaXMgd29yayBvcmRlcgotCQkJCQkJCS8vIGFscmVhZHkKLQkJCQkJCQkvLwotCQkJCQkJCWJvb2xlYW4gbGlua0ZvdW5kID0gZmFsc2U7Ci0JCQkJCQkJZmluZF9saW5rOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMSA9IG5vZGUKLQkJCQkJCQkJCS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IxCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlcmF0b3IxLm5leHQoKTsKLQkJCQkJCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgPT0gcHJlZE5vZGUpIHsKLQkJCQkJCQkJCS8vIGxpbmsgYWxyZWFkeSBleGlzdHMKLQkJCQkJCQkJCS8vIGNoZWNrIGlmIHdvcmsgb3JkZXIgaXMgc2V0IHRvIHRoaXMgbGluawotCQkJCQkJCQkJLy8KLQkJCQkJCQkJCWxpbmtGb3VuZCA9IHRydWU7Ci0JCQkJCQkJCQlHcmFwaEVkZ2UgZWRnZSA9IChHcmFwaEVkZ2UpIGxpbmsKLQkJCQkJCQkJCQkJLmdldE9iamVjdCgpOwotCQkJCQkJCQkJaWYgKGVkZ2UuZ2V0U2VtYW50aWNNb2RlbCgpID09IG51bGwpIHsKLQkJCQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLnNldFNlbWFudGljTW9kZWwoCi0JCQkJCQkJCQkJCQlsaW5rLCB3b3JrT3JkZXIpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJYnJlYWsgZmluZF9saW5rOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghbGlua0ZvdW5kKSB7Ci0JCQkJCQkJCS8vIGNoZWNrIGlmIHRoaXMgV29ya09yZGVyIGNhbiBiZSByZXByZXNlbnRlZAotCQkJCQkJCQkvLyB2aWEgbGlua3Mgb2YgVHlwZWROb2RlcwotCQkJCQkJCQkvLwotCQkJCQkJCQlpZiAoIWNhblJlYWNoQXNGaXJzdEFjdGl2aXR5Tm9kZShwcmVkTm9kZSwgbm9kZSkpIHsKLQkJCQkJCQkJCS8vIGFkZCBuZXcgbGluayBmb3IgdGhpcyB3b3JrIG9yZGVyCi0JCQkJCQkJCQkvLwotCQkJCQkJCQkJTmFtZWROb2RlSW1wbCBub2RlSW1wbCA9ICgoTmFtZWROb2RlSW1wbCkgbm9kZSk7Ci0JCQkJCQkJCQlOYW1lZE5vZGVJbXBsIHByZWROb2RlSW1wbCA9IChOYW1lZE5vZGVJbXBsKSBwcmVkTm9kZTsKLQkJCQkJCQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQkJCQkJCWJvb2xlYW4gcHJlZE5vZGVOb3RpZnkgPSBwcmVkTm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQkJCQkJCXByZWROb2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCQkJCQkJbm9kZUltcGwuYWRkSW5jb21pbmdDb25uZWN0aW9uKHByZWQpOyAKLQkJCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IG9sZE5vdGlmeTsKLQkJCQkJCQkJCQlwcmVkTm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IHByZWROb2RlTm90aWZ5OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNsZWFuRHVwbGljYXRlTGlua3MoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYW5EdXBsaWNhdGVMaW5rcygpIHsKLQkJTGlzdCBkdXBsaWNhdGVMaW5rcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBub2RlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQlOb2RlIHdiTm9kZSA9IChOb2RlKSBub2RlOwotCQkJCWlmKHdiTm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkgIT0gbnVsbCl7Ci0JCQkJCWZpbmREdXBsaWNhdGVMaW5rcyhkdXBsaWNhdGVMaW5rcywgd2JOb2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKSk7Ci0JCQkJfQotCQkJCWlmKHdiTm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkgIT1udWxsKXsKLQkJCQkJZmluZER1cGxpY2F0ZUxpbmtzKGR1cGxpY2F0ZUxpbmtzLCB3Yk5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZHVwbGljYXRlTGlua3MuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlTGluayhsaW5rKTsKLQkJfQotCQlkdXBsaWNhdGVMaW5rcy5jbGVhcigpOwotCQlkdXBsaWNhdGVMaW5rcyA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbmREdXBsaWNhdGVMaW5rcyhMaXN0IGR1cGxpY2F0ZUxpbmtzLCBMaXN0IGxpbmtzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlua3Muc2l6ZSgpOyBpKyspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBsaW5rcy5nZXQoaSk7Ci0JCQlpZighZHVwbGljYXRlTGlua3MuY29udGFpbnMobGluaykpewotCQkJCWZvciAoaW50IGogPSBpICsgMTsgaiA8IGxpbmtzLnNpemUoKTsgaisrKSB7Ci0JCQkJCUxpbmsgbGluazEgPSAoTGluaykgbGlua3MuZ2V0KGopOwotCQkJCQlpZiAobGluazEuZ2V0U291cmNlKCkgPT0gbGluay5nZXRTb3VyY2UoKQotCQkJCQkJCSYmIGxpbmsxLmdldFRhcmdldCgpID09IGxpbmsuZ2V0VGFyZ2V0KCkpIHsKLQkJCQkJCWR1cGxpY2F0ZUxpbmtzLmFkZChsaW5rMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgTm9kZSBzcmMgY2FuIHJlYWNoIE5vZGUgdGFyZ2V0IGFzIHRoZSBmaXJzdCBBY3Rpdml0eU5vZGUgaW4gdGhlCi0JICogZGlhZ3JhbQotCSAqIAotCSAqIEBwYXJhbSBzcmMKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2FuUmVhY2hBc0ZpcnN0QWN0aXZpdHlOb2RlKE5vZGUgc3JjLCBOb2RlIHRhcmdldCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzcmMuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgPT0gdGFyZ2V0KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAobGluay5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZQotCQkJCQkmJiBjYW5SZWFjaEFzRmlyc3RBY3Rpdml0eU5vZGUobGluay5nZXRUYXJnZXQoKSwgdGFyZ2V0KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBwcml2YXRlIExpc3QgdG9Ob2RlcyhMaXN0IGFjdGl2aXRpZXMpIHsKLQkvLyBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aXZpdGllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBsaXN0LmFkZCh0b05vZGUoKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpKSk7Ci0JLy8gfQotCS8vIHJldHVybiBsaXN0OwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNuZXdOb2RlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBuZXdOb2RlKCkgewotCQlyZXR1cm4gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbigpIHsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQotCQkJLy9UdXJuIG9mZiB0aGUgVmFyaWFiaWxpdHlJbmZvIGZvciB0aGUgYWN0aXZpdHkgZGlhZ3JhbS4KLQkJCU9iamVjdCBvYmogPSBudWxsOwotCQkJYm9vbGVhbiBlbmFibGVWYXJpYWJpbGl0eUluZm8gPSBmYWxzZTsKLQkJCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCW9iaiA9ICgoQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKWFkYXB0ZXIpLmdldERlbGVnYXRpbmdJdGVtUHJvdmlkZXIoKTsKLQkJCX0KLQkJCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKXsKLQkJCQlvYmogPSBhZGFwdGVyOwotCQkJfQotCQkJCi0JCQlpZihvYmogaW5zdGFuY2VvZiBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKXsKLQkJCQllbmFibGVWYXJpYWJpbGl0eUluZm8gPSAoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpb2JqKS5pc0VuYWJsZVZhcmlhYmlsaXR5SW5mbygpOwotCQkJCSgoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcilvYmopLnNldEVuYWJsZVZhcmlhYmlsaXR5SW5mbyhmYWxzZSk7Ci0JCQl9Ci0JCQkvLyBlbmQgb2YgdmFyaWFiaWxpdHkgaW5mbyAKLQkJCQotCQkJCi0JCQkvLyByZXR1cm4gYWRhcHRlci5nZXRDaGlsZHJlbihnZXRPYmplY3QoKSk7Ci0JCQkvLyBjb21tZW50ZWQgYWJvdmUgbGluZSwgRm9yIGRpYWdyYW1zIC0gcm9sbHVwIHNob3VsZCBiZSBmYWxzZSwgZm9yCi0JCQkvLyBoYW5kbGluZyByb2xsdXAgc3RhdGUgYmVsb3cgY29kZS4KLQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlleHRyYWN0Q2hpbGRyZW4oYWRhcHRlciwgZ2V0T2JqZWN0KCksIGNoaWxkcmVuKTsKLQkJCQotCQkJLy8gcmVzZXQgdmFyaWFiaWxpdHlpbmZvIHN0YXR1cyBiYWNrCi0JCQlpZihvYmogaW5zdGFuY2VvZiBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKXsKLQkJCQkoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpb2JqKS5zZXRFbmFibGVWYXJpYWJpbGl0eUluZm8oZW5hYmxlVmFyaWFiaWxpdHlJbmZvKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGNoaWxkcmVuOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRWxlbWVudE5vZGVzKCkgewotCi0JCUFycmF5TGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgY2hpbGQgPSBUbmdVdGlsLnVud3JhcChlKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJTmFtZWROb2RlSW1wbCBub2RlID0gKE5hbWVkTm9kZUltcGwpIHRvTm9kZSgoTWV0aG9kRWxlbWVudCkgY2hpbGQpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGUpOwotCQkJCQlpZiAod3JhcHBlci5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJCW5vZGUuaXRlbVByb3ZpZGVyID0gd3JhcHBlcjsKLQkJCQkJCS8vIFRPRE86IGNoZWNrIGlmIHJlYWRPbmx5IGF0dHJpYnV0ZSBpcyBzdGlsbCBuZWVkZWQKLQkJCQkJCS8vIGFmdGVyIGludHJvZHVjdGlvbiBvZiBpdGVtUHJvdmlkZXIKLQkJCQkJCS8vCi0JCQkJCQlub2RlLnJlYWRPbmx5ID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlub2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlnZXROb2RlcygpLmFkZEFsbChub2Rlcyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFR5cGUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgR3JhcGhOb2RlKSB7Ci0JCQlHcmFwaE5vZGUgbm9kZSA9IChHcmFwaE5vZGUpIG9iajsKLQkJCVNlbWFudGljTW9kZWxCcmlkZ2UgbW9kZWxCcmlkZ2UgPSBub2RlLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCWlmIChtb2RlbEJyaWRnZSBpbnN0YW5jZW9mIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KSB7Ci0JCQkJU3RyaW5nIHR5cGUgPSAoKFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KSBtb2RlbEJyaWRnZSkKLQkJCQkJCS5nZXRUeXBlSW5mbygpOwotCQkJCWlmIChHcmFwaGljYWxEYXRhSGVscGVyLkdSQVBIX05PREVfU1lOQ0hfQkFSLmVxdWFscyh0eXBlKSkgewotCQkJCQlyZXR1cm4gVHlwZWROb2RlLlNZTkNIX0JBUjsKLQkJCQl9IGVsc2UgaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuR1JBUEhfTk9ERV9ERUNJU0lPTi5lcXVhbHModHlwZSkpIHsKLQkJCQkJcmV0dXJuIFR5cGVkTm9kZS5ERUNJU0lPTjsKLQkJCQl9IGVsc2UgaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuR1JBUEhfTk9ERV9FTkQuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCXJldHVybiBUeXBlZE5vZGUuRU5EOwotCQkJCX0gZWxzZSBpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX1NUQVJULmVxdWFscyh0eXBlKSkgewotCQkJCQlyZXR1cm4gVHlwZWROb2RlLlNUQVJUOwotCQkJCX0gZWxzZSBpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0ZSRUVfVEVYVAotCQkJCQkJLmVxdWFscyh0eXBlKSkgewotCQkJCQlyZXR1cm4gVHlwZWROb2RlLkZSRUVfVEVYVDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfRElBR1JBTTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRCcmVha2Rvd25FbGVtZW50VHlwZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIGludCB0b0FjdGl2aXR5SW5kZXgoaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA9PSAtMSkKLQkJCXJldHVybiBpbmRleDsKLQkJaW50IHNpemUgPSBnZXROb2RlcygpLnNpemUoKTsKLQkJaW50IGkgPSBpbmRleCArIDE7Ci0JCWlmIChpID09IHNpemUpCi0JCQlyZXR1cm4gLTE7Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSBnZXROb2RlcygpLmdldChpKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlmb3IgKDsgIShub2RlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgJiYgaSA8IHNpemU7IGkrKykgewotCQkJbm9kZSA9IChOb2RlKSBnZXROb2RlcygpLmdldChpKTsKLQkJfQotCQlpZiAoaSA9PSBzaXplKQotCQkJcmV0dXJuIC0xOwotCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldE9iamVjdCgpOwotCQlyZXR1cm4gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaW5kZXhPZihub2RlLmdldE9iamVjdCgpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNhZGRUb1VtYU1vZGVsKGludCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9VbWFNb2RlbChpbnQgcG9zaXRpb24sIE5vZGUgYWRkZWROb2RlKSB7Ci0JCWlmIChhZGRlZE5vZGUuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldE9iamVjdCgpOwotCi0JCQkvLyB0cmFuc2xhdGUgQWN0aXZpdHlOb2RlIGluZGV4IHRvIEFjdGl2aXR5IGluZGV4Ci0JCQkvLwotCQkJaW50IGkgPSB0b0FjdGl2aXR5SW5kZXgocG9zaXRpb24pOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJEaWFncmFtSW1wbC5hZGRUb1VtYU1vZGVsKCk6Ci0JCQkvLyBXb3JrQnJlYWtkb3duRWxlbWVudCBpbmRleDogIiArIGkpOwotCQkJaWYgKGkgPT0gLTEpIHsKLQkJCQlhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoYWRkZWROb2RlLmdldE9iamVjdCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGksIGFkZGVkTm9kZS5nZXRPYmplY3QoKSk7Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5hZGRUb1VtYU1vZGVsKHBvc2l0aW9uLCBhZGRlZE5vZGUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNhZGROb2RlKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBhZGROb2RlKENvbGxlY3Rpb24gbm9kZXMsIE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG9iajsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQkvLyBmaW5kIGV4aXN0aW5nIG5vZGUgZm9yIGJhc2UgYW5kIGxpbmsgaXQgdG8gdGhlIGFjdGl2aXR5Ci0JCQkJLy8KLQkJCQlOb2RlSW1wbCBiYXNlTm9kZSA9IChOb2RlSW1wbCkgR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSgKLQkJCQkJCXRoaXMsIGJhc2UpOwotCQkJCWlmIChiYXNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBiYXNlTm9kZS5nZXRHcmFwaE5vZGUoKTsKLQkJCQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSAoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgZ3JhcGhOb2RlCi0JCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCQkJaWYgKGJyaWRnZS5nZXRFbGVtZW50KCkgIT0gYWN0KSB7Ci0JCQkJCQlicmlkZ2Uuc2V0RWxlbWVudChhY3QpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYmFzZU5vZGUgPSAoTm9kZUltcGwpIEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywKLQkJCQkJCQlhY3QpOwotCQkJCX0KLQkJCQlpZiAoYmFzZU5vZGUgIT0gbnVsbCkgewotCQkJCQkvLyBkaXNhc3NvY2lhdGUgd2l0aCB0aGUgYmFzZQotCQkJCQkvLwotCQkJCQlpZiAoYmFzZU5vZGUubWV0aG9kRWxlbWVudEFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJYmFzZS5lQWRhcHRlcnMoKS5yZW1vdmUoYmFzZU5vZGUubWV0aG9kRWxlbWVudEFkYXB0ZXIpOwotCQkJCQl9Ci0KLQkJCQkJYmFzZU5vZGUuYmFzaWNTZXRPYmplY3QoYWN0KTsKLQkJCQkJYmFzZU5vZGUuc2V0UmVhZE9ubHkoZmFsc2UpOwotCi0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuYWRkTm9kZShub2Rlcywgb2JqKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjcmVtb3ZlTm9kZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZU5vZGUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgb2JqOwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCS8vIGZpbmQgZXhpc3Rpbmcgbm9kZSBmb3IgdGhlIG9sZCBhY3Rpdml0eSBhbmQgcmVsaW5rIGl0IHRvIGl0cwotCQkJCS8vIGJhc2UKLQkJCQkvLwotCQkJCU5vZGVJbXBsIG5vZGUgPSAoTm9kZUltcGwpIEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywKLQkJCQkJCWFjdCk7Ci0JCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gbm9kZS5nZXRHcmFwaE5vZGUoKTsKLQkJCQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSAoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgZ3JhcGhOb2RlCi0JCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCQkJaWYgKGJyaWRnZS5nZXRFbGVtZW50KCkgIT0gYmFzZSkgewotCQkJCQkJYnJpZGdlLnNldEVsZW1lbnQoYmFzZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlub2RlID0gKE5vZGVJbXBsKSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKHRoaXMsIGJhc2UpOwotCQkJCX0KLQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCS8vIGRpc2Fzc29jaWF0ZSB3aXRoIHRoZSBvbGQgYWN0aXZpdHkKLQkJCQkJLy8KLQkJCQkJaWYgKG5vZGUubWV0aG9kRWxlbWVudEFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJYWN0LmVBZGFwdGVycygpLnJlbW92ZShub2RlLm1ldGhvZEVsZW1lbnRBZGFwdGVyKTsKLQkJCQkJfQotCi0JCQkJCW5vZGUuYmFzaWNTZXRPYmplY3QoYmFzZSk7Ci0JCQkJCW5vZGUuc2V0UmVhZE9ubHkodHJ1ZSk7Ci0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIucmVtb3ZlTm9kZShvYmopOwotCX0KLQkvKioKLQkgKiBNb3ZlZCBjb2RlIGZyb20gZ2V0Q2hpbGRyZW4uIGdldEFkYXB0ZXIoKSB3aWxsIHJldHVybiBBZGFwdGVyLAotCSAqIHdoaWNoIHdpbGwgYWxsb3cgdXMgdG8gZmluZCBpdGVtcHJvdmlkZXIgZm9yIHRoZSBjaGlsZHJlbi4gCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGdldEFkYXB0ZXIoKXsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSBudWxsOwotCQlpZiAod3JhcHBlciAhPSBudWxsKSB7Ci0JCQlhZGFwdGVyID0gd3JhcHBlcjsKLQkJfSBlbHNlIHsKLQkJCQotCQkJYWRhcHRlciA9KElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcilnZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KAotCQkJCQlnZXRPYmplY3QoKSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpewotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCWlmIChmaWx0ZXIgPT0gbnVsbCkgewotCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIElBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJYWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgKChJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJLmdldFdCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLX0gLy8gQWN0aXZpdHlEaWFncmFtSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9EaWFncmFtSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9EaWFncmFtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YTg1MWY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvRGlhZ3JhbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uRGlhZ3JhbVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JRGlhZ3JhbUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1JbXBsIGV4dGVuZHMgTm9kZUNvbnRhaW5lckltcGwgaW1wbGVtZW50cyBEaWFncmFtIHsKLQotCXByaXZhdGUgYm9vbGVhbiBuZXdEaWFncmFtOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaWFncmFtSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTTsKLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQkvLyBTdGFydCBjdXN0b20gY29kZSAvLwotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCi0JcHJvdGVjdGVkIGNsYXNzIEFjdGl2aXR5QWRhcHRlciBleHRlbmRzIFRyYW5zYWN0aW9uYWxOb2RlTGluayBpbXBsZW1lbnRzCi0JCQlJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklEaWFncmFtQ2hhbmdlTGlzdGVuZXIjZ2V0RGlhZ3JhbSgpCi0JCSAqLwotCQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQkJcmV0dXJuIERpYWdyYW1JbXBsLnRoaXM7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChBY3Rpdml0eS5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTOgotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgYWRkTm9kZShtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJaWYgKG1zZy5nZXROb3RpZmllcigpID09IGJhc2VBY3QpIHsKLQkJCQkJCW5vZGUuc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlyZW1vdmVOb2RlKG1zZy5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCUNvbGxlY3Rpb24gbm9kZXMgPSBhZGROb2RlcygoQ29sbGVjdGlvbikgbXNnCi0JCQkJCQkJLmdldE5ld1ZhbHVlKCkpOwotCQkJCQlpZiAobXNnLmdldE5vdGlmaWVyKCkgPT0gYmFzZUFjdCkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCW5vZGUgPSAoTm9kZUltcGwpIGl0ZXIubmV4dCgpOwotCQkJCQkJCW5vZGUuc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCXJlbW92ZU5vZGVzKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLk1PVkU6Ci0JCQkJCW1vdmVOb2RlKG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciBkaWFncmFtQ2hhbmdlTGlzdGVuZXI7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGJhc2VBY3Q7Ci0KLQlwcml2YXRlIE9iamVjdCBkaWFncmFtQWRhcHRlciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCQkJcmV0dXJuOwotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQkvL0FjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0T2JqZWN0KCk7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKERpYWdyYW0uY2xhc3MpKSB7Ci0JCQkJY2FzZSBNb2RlbFBhY2thZ2UuRElBR1JBTV9fTk9ERVM6Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLm5vdGlmeUNoYW5nZWQoKTogaW5kZXg9IiArCi0JCQkJCS8vIG1zZy5nZXRQb3NpdGlvbigpKTsKLQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uOwotCQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCQlub2RlQWRkZWQobXNnLmdldFBvc2l0aW9uKCksIChOb2RlKSBtc2cKLQkJCQkJCQkJLmdldE5ld1ZhbHVlKCkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCQlub2RlUmVtb3ZlZCgoTm9kZSkgbXNnLmdldE9sZFZhbHVlKCkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJbm9kZUFkZGVkKG1zZy5nZXRQb3NpdGlvbigpLCBub2RlKTsKLQkJCQkJCX0KLQotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlub2RlUmVtb3ZlZCgoTm9kZSkgaXRlci5uZXh0KCkpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBOb2RlIGFkZE5vZGUoT2JqZWN0IG9iaikgewotCQlOb2RlIG5vZGUgPSBhZGROb2RlKGdldE5vZGVzKCksIG9iaik7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbm9kZTsKLQkJcG9wdWxhdGVMaW5rcyhub2RlLCB0cnVlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgYWRkTm9kZShDb2xsZWN0aW9uIG5vZGVzLCBPYmplY3Qgb2JqKSB7Ci0JCWlmIChUbmdVdGlsLmlzSW5zdGFuY2VPZihnZXRCcmVha2Rvd25FbGVtZW50VHlwZXMoKSwgb2JqKSkgewotCQkJTm9kZSBub2RlID0gdG9Ob2RlKChNZXRob2RFbGVtZW50KSBvYmopOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBhZGROb2RlcyhDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJTGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWFkZE5vZGUobm9kZXMsIGl0ZXIubmV4dCgpKTsKLQkJfQotCi0JCS8vIHVzZSBhZGRBbGwoKSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBub3RpZmljYXRpb25zCi0JCS8vCi0JCWdldE5vZGVzKCkuYWRkQWxsKG5vZGVzKTsKLQkJcmV0dXJuIG5vZGVzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmoKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVOb2RlKE9iamVjdCBvYmopIHsKLQkJaWYgKCFUbmdVdGlsLmlzSW5zdGFuY2VPZihnZXRCcmVha2Rvd25FbGVtZW50VHlwZXMoKSwgb2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKHRoaXMsIG9iaik7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlsaW5rLnNldFRhcmdldChudWxsKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJbGluay5zZXRTb3VyY2UobnVsbCk7Ci0JCX0KLQkJbm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuY2xlYXIoKTsKLQkJbm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuY2xlYXIoKTsKLQotCQlnZXROb2RlcygpLnJlbW92ZShub2RlKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm9kZXMoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlyZW1vdmVOb2RlKGl0ZXIubmV4dCgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSNnZXRVTUFEaWFncmFtKCkKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIGdldFVNQURpYWdyYW0oKSB7Ci0JCXJldHVybiAob3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtKSBnZXRHcmFwaE5vZGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0RGlhZ3JhbUNoYW5nZUxpc3RlbmVyVHlwZSgpIHsKLQkJcmV0dXJuIElEaWFncmFtQ2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0QnJlYWtkb3duRWxlbWVudFR5cGVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChCcmVha2Rvd25FbGVtZW50LmNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub2RlQWRkZWQoaW50IGluZGV4LCBOb2RlIG5vZGUpIHsKLQkJYWRkVG9VbWFNb2RlbChpbmRleCwgbm9kZSk7Ci0JCW5vZGUuYWRkQ29uc3VtZXIodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm9kZVJlbW92ZWQoTm9kZSBub2RlKSB7Ci0JCXJlbW92ZUZyb21VbWFNb2RlbChub2RlKTsKLQkJbm9kZS5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05ldygpIHsKLQkJcmV0dXJuIHRoaXMubmV3RGlhZ3JhbTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXcoYm9vbGVhbiBuKSB7Ci0JCXRoaXMubmV3RGlhZ3JhbSA9IG47Ci0JfQotCi0JLyoqCi0JICogTk9URTogdGhpcyBtZXRob2QgaXMgcmUtZW50cmFudCwgbWFrZSBzdXJlIHRvIGhhbmRsZSB0aGUgZGF0YSBjb3JyZWN0bHkgdG8gYXZvaWQgbWVtb3J5IGxlYWsgYW5kIGRhdGEgY29ycnVwdGlvbgotCSAqIAotCSAqIEBwYXJhbSBuZXdPYmplY3QKLQkgKiAgICAgICAgICAgIG11c3QgYmUgYW4gQWN0aXZpdHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG5ld09iamVjdCkgewotCQlpZiAobmV3T2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIKLQkJCQkmJiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBuZXdPYmplY3QpCi0JCQkJCQkuaXNSZWFkT25seSgpKSB7Ci0JCQl3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBuZXdPYmplY3Q7Ci0JCQlzZXRSZWFkT25seSh0cnVlKTsKLQkJfQotCQluZXdPYmplY3QgPSBUbmdVdGlsLnVud3JhcChuZXdPYmplY3QpOwotCi0JCU9iamVjdCBvbGRPYmplY3QgPSBvYmplY3Q7Ci0JCW9iamVjdCA9IG5ld09iamVjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfX09CSkVDVCwgb2xkT2JqZWN0LCBvYmplY3QpKTsKLQotCQkvLyBhZGQgZGlhZ3JhbSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhlIGxpbmtlZCBvYmplY3QuIFJlbW92ZSB0aGUgb2xkCi0JCS8vIGxpc3RlbmVyIGlmIHRoZXJlIGlzIGFueS4KLQkJLy8gQnV0IGZpcnN0IGtlZXAgdGhlIG9sZCBsaXN0ZW5lciB0byBoZWxwIGZpbmQgdGhlIFVNQSBkaWFncmFtIG9mIHRoZQotCQkvLyBhY3Rpdml0eSBxdWlja2x5LgotCQkvLwotCQlBY3Rpdml0eSBlID0gKEFjdGl2aXR5KSBuZXdPYmplY3Q7CQkKLQkJaWYoUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoZSkpIHsKLQkJCWJhc2VBY3QgPSAoQWN0aXZpdHkpIGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQl9Ci0JCWJhc2VBY3QgPSBudWxsOwotCQkKLQkJaWYobmV3T2JqZWN0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIHNldCB0aGUgVU1BIGRpYWdyYW0gZm9yIHRoaXMgZGlhZ3JhbQotCQkvLwotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQlncmFwaE5vZGUgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFVNQURpYWdyYW0oZSwKLQkJCQkJZ2V0VHlwZSgpLCBmYWxzZSk7Ci0JCQkvLyBzZXQgdGhlIGZsYWcgdG8gaW5kaWNhdGUgdGhpcyBpcyBhIG5ldyBkaWFncmFtIG9yIG5vdAotCQkJaWYgKGdyYXBoTm9kZSA9PSBudWxsKSB7Ci0JCQkJZ3JhcGhOb2RlID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKGUsCi0JCQkJCQlnZXRUeXBlKCksIHRydWUpOwotCQkJCXNldE5ldyh0cnVlKTsKLQkJCX0KLQkJfQotCi0JCWlmKCFlLmVBZGFwdGVycygpLmNvbnRhaW5zKGRpYWdyYW1DaGFuZ2VMaXN0ZW5lcikpIHsKLQkJCWUuZUFkYXB0ZXJzKCkuYWRkKGRpYWdyYW1DaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQkJaWYgKGJhc2VBY3QgIT0gbnVsbCkgewotCQkJYmFzZUFjdC5lQWRhcHRlcnMoKS5hZGQoZGlhZ3JhbUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCi0JCXBvcHVsYXRlRGlhZ3JhbSgpOwotCi0JCWlmKCFlQWRhcHRlcnMoKS5jb250YWlucyhkaWFncmFtQWRhcHRlcikpIHsKLQkJCXRoaXMuZUFkYXB0ZXJzKCkuYWRkKGRpYWdyYW1BZGFwdGVyKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUG9wdWxhdGVzIHRoZSBkaWFncmFtIHdpdGggdGhlIGRhdGEgZnJvbSB0aGUgVU1BIG1vZGVsLiBTdWJjbGFzcyBzaG91bGQKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZURpYWdyYW0oKSB7Ci0JCXBvcHVsYXRlTm9kZXMoKTsKLQkJcG9wdWxhdGVMaW5rcygpOwotCi0JCS8vIGFkZCB0aGlzIGRpYWdyYW0gdG8gdGhlIGNvbnN1bWVyIGxpc3Qgb2YgYWxsIG5vZGVzIHNvIHRoZXkgd2lsbCBub3QKLQkJLy8gYmUgZGlzcG9zZWQKLQkJLy8gYmVmb3JlIHRoaXMgZGlhZ3JhbS4KLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGVJbXBsIG5vZGUgPSAoTm9kZUltcGwpIGl0ZXIubmV4dCgpOwotCQkJbm9kZS5hZGRDb25zdW1lcih0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgaW5jb21pbmcvb3V0Z29pbmcgbGlua3Mgb2YgdGhlIGdpdmVuIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTGlua3MoTm9kZSBub2RlLCBib29sZWFuIGRpc2FibGVOb3RpZmljYXRpb24pIHsKLQkJaW50IHNpemUgPSAwOwotCQlib29sZWFuW10gbm90aWZpZXMgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGRpc2FibGVOb3RpZmljYXRpb24pIHsKLQkJCQlzaXplID0gZ2V0Tm9kZXMoKS5zaXplKCk7Ci0JCQkJbm90aWZpZXMgPSBuZXcgYm9vbGVhbltzaXplXTsKLQkJCQkvLyBkaXNhYmxlIG5vdGlmaWNhdGlvbiBmb3IgYWxsIG5vZGVzIGluIHRoaXMgZGlhZ3JhbSB0byBhdm9pZAotCQkJCS8vIHVud2FudGVkIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIG9mIHRoZWlyIGNvbm5lY3Rpb24gbGlzdAotCQkJCS8vCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJTm9kZSBjaGlsZCA9ICgoTm9kZSkgZ2V0Tm9kZXMoKS5nZXQoaSkpOwotCQkJCQlub3RpZmllc1tpXSA9IGNoaWxkLmVEZWxpdmVyKCk7Ci0JCQkJCWNoaWxkLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBub2RlLmdldEdyYXBoTm9kZSgpOwotCQkJaWYgKGdyYXBoTm9kZSAhPSBudWxsKSB7Ci0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5maWxsQ29ubmVjdGlvbnMobm9kZSwgZ3JhcGhOb2RlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChkaXNhYmxlTm90aWZpY2F0aW9uKSB7Ci0JCQkJLy8gcmVzdG9yZSBub3RpZmljYXRpb24gZmxhZwotCQkJCS8vCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJKChFT2JqZWN0KSBnZXROb2RlcygpLmdldChpKSkuZVNldERlbGl2ZXIobm90aWZpZXNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTm9kZXMoKSB7CQkKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIGRpYWdyYW0gPSBnZXRVTUFEaWFncmFtKCk7Ci0JCWlmKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJTGlzdCB0eXBlZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXRDb250YWluZWQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWludCB0eXBlID0gZ2V0VHlwZShlbGVtZW50KTsKLQkJCQlpZiAodHlwZSA+IDApIHsKLQkJCQkJVHlwZWROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVR5cGVkTm9kZSgpOwotCQkJCQlub2RlLnNldFR5cGUodHlwZSk7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KGVsZW1lbnQpOwotCQkJCQl0eXBlZE5vZGVzLmFkZChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlnZXROb2RlcygpLmFkZEFsbCh0eXBlZE5vZGVzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBnZXRUeXBlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEdyYXBoTm9kZSkgewotCQkJR3JhcGhOb2RlIG5vZGUgPSAoR3JhcGhOb2RlKSBvYmo7Ci0JCQlTZW1hbnRpY01vZGVsQnJpZGdlIG1vZGVsQnJpZGdlID0gbm9kZS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQlpZiAobW9kZWxCcmlkZ2UgaW5zdGFuY2VvZiBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCkgewotCQkJCVN0cmluZyB0eXBlID0gKChTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCkgbW9kZWxCcmlkZ2UpCi0JCQkJCQkuZ2V0VHlwZUluZm8oKTsKLQkJCQlpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX1NZTkNIX0JBUi5lcXVhbHModHlwZSkpIHsKLQkJCQkJcmV0dXJuIFR5cGVkTm9kZS5TWU5DSF9CQVI7Ci0JCQkJfSBlbHNlIGlmIChHcmFwaGljYWxEYXRhSGVscGVyLkdSQVBIX05PREVfREVDSVNJT04uZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCXJldHVybiBUeXBlZE5vZGUuREVDSVNJT047Ci0JCQkJfSBlbHNlIGlmIChHcmFwaGljYWxEYXRhSGVscGVyLkdSQVBIX05PREVfRU5ELmVxdWFscyh0eXBlKSkgewotCQkJCQlyZXR1cm4gVHlwZWROb2RlLkVORDsKLQkJCQl9IGVsc2UgaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuR1JBUEhfTk9ERV9TVEFSVC5lcXVhbHModHlwZSkpIHsKLQkJCQkJcmV0dXJuIFR5cGVkTm9kZS5TVEFSVDsKLQkJCQl9IGVsc2UgaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuR1JBUEhfTk9ERV9GUkVFX1RFWFQKLQkJCQkJCS5lcXVhbHModHlwZSkpIHsKLQkJCQkJcmV0dXJuIFR5cGVkTm9kZS5GUkVFX1RFWFQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUxpbmtzKCkgewotCQkvLyBmaWxsIG91dGdvaW5nL2luY29taW5nIGNvbm5lY3Rpb24gbGlzdHMgb2YgYWxsIG5vZGVzCi0JCS8vCi0JCWludCBzaXplID0gZ2V0Tm9kZXMoKS5zaXplKCk7Ci0JCWJvb2xlYW5bXSBub3RpZmllcyA9IG5ldyBib29sZWFuW3NpemVdOwotCQl0cnkgewotCQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24gZm9yIGFsbCBub2RlcyBpbiB0aGlzIGRpYWdyYW0gdG8gYXZvaWQKLQkJCS8vIHVud2FudGVkIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIG9mIHRoZWlyIGNvbm5lY3Rpb24gbGlzdAotCQkJLy8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJTm9kZSBub2RlID0gKChOb2RlKSBnZXROb2RlcygpLmdldChpKSk7Ci0JCQkJbm90aWZpZXNbaV0gPSBub2RlLmVEZWxpdmVyKCk7Ci0JCQkJbm9kZS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQlwb3B1bGF0ZUxpbmtzKG5vZGUsIGZhbHNlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCS8vIHJlc3RvcmUgbm90aWZpY2F0aW9uIGZsYWcKLQkJCS8vCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCSgoRU9iamVjdCkgZ2V0Tm9kZXMoKS5nZXQoaSkpLmVTZXREZWxpdmVyKG5vdGlmaWVzW2ldKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZGF0YSBmb3IgdGhlIHJlbW92ZWQgbm9kZSBmcm9tIHRoZSBVTUEgbW9kZWwgU3ViY2xhc3Mgc2hvdWxkCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIHJlbW92ZWROb2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVtYU1vZGVsKE5vZGUgcmVtb3ZlZE5vZGUpIHsKLQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRPYmplY3QoKTsKLQkJaWYgKHJlbW92ZWROb2RlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlKHJlbW92ZWROb2RlLmdldE9iamVjdCgpKTsKLQkJfQotCQkKLQkJaWYoZ2V0VU1BRGlhZ3JhbSgpICE9IG51bGwpIHsKLQkJCWdldFVNQURpYWdyYW0oKS5nZXRDb250YWluZWQoKS5yZW1vdmUocmVtb3ZlZE5vZGUuZ2V0R3JhcGhOb2RlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZGF0YSBmb3IgdGhlIG5ld2x5IGFkZGVkIG5vZGUgdG8gdGhlIFVNQSBtb2RlbCBTdWJjbGFzcyBzaG91bGQKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1VtYU1vZGVsKGludCBwb3NpdGlvbiwgTm9kZSBhZGRlZE5vZGUpIHsKLQotCQlpZiAoYWRkZWROb2RlLmdldEdyYXBoTm9kZSgpID09IG51bGwpIHsKLQkJCS8vIHRoaXMgbm9kZSBpcyByZWFkZGVkIGFmdGVyIHVuZG8KLQkJCS8vCi0JCQkoKE5vZGVJbXBsKSBhZGRlZE5vZGUpLmJhc2ljU2V0T2JqZWN0KGFkZGVkTm9kZS5nZXRPYmplY3QoKSk7Ci0JCX0KLQkJCi0JCWlmKGdldFVNQURpYWdyYW0oKSAhPSBudWxsKSB7Ci0JCQlnZXRVTUFEaWFncmFtKCkuZ2V0Q29udGFpbmVkKCkuYWRkKGFkZGVkTm9kZS5nZXRHcmFwaE5vZGUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIG5ldyBub2RlIGZvciB0aGlzIGRpYWdyYW0gZm9yIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBOb2RlIHRvTm9kZShNZXRob2RFbGVtZW50IGUpIHsKLQkJTm9kZSBub2RlID0gbmV3Tm9kZSgpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCW5vZGUuc2V0VU1BRGlhZ3JhbShnZXRVTUFEaWFncmFtKCkpOwotCQlub2RlLnNldERpYWdyYW0odGhpcyk7Ci0JCW5vZGUuc2V0T2JqZWN0KGUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBuZXdOb2RlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkgewotCQlyZXR1cm4gZ2V0RGlhZ3JhbUNoYW5nZUxpc3RlbmVyVHlwZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNkaXNwb3NlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkaXNwb3NlIGFsbCBub2RlcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGVJbXBsIG5vZGUgPSAoTm9kZUltcGwpIGl0ZXIubmV4dCgpOwotCQkJbm9kZS5kaXNwb3NlKCk7Ci0JCX0KLQotCQlpZiAoZGlhZ3JhbUNoYW5nZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCUFjdGl2aXR5IGUgPSAoQWN0aXZpdHkpIGdldE9iamVjdCgpOwotCQkJaWYgKGJhc2VBY3QgIT0gbnVsbCkgewotCQkJCWJhc2VBY3QuZUFkYXB0ZXJzKCkucmVtb3ZlKGRpYWdyYW1DaGFuZ2VMaXN0ZW5lcik7Ci0JCQl9Ci0JCQllLmVBZGFwdGVycygpLnJlbW92ZShkaWFncmFtQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSNzZXREZWZhdWx0TmFtZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGUpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoTmFtZWROb2RlIG5ld05vZGUpIHsKLQkJTWV0aG9kRWxlbWVudCBvYmogPSAoTWV0aG9kRWxlbWVudCkgbmV3Tm9kZS5nZXRPYmplY3QoKTsKLQkJaW50IGNsYXNzSUQgPSBvYmouZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCk7Ci0JCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0T2JqZWN0KCk7Ci0JCUFycmF5TGlzdCBzaWJsaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZS5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKSA9PSBjbGFzc0lEKSB7Ci0JCQkJc2libGluZ3MuYWRkKGUpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBiYXNlTmFtZSA9IE1lc3NhZ2VGb3JtYXQKLQkJCQkuZm9ybWF0KAotCQkJCQkJRGlhZ3JhbVJlc291cmNlcy5kZWZhdWx0QmFzZU5hbWUsIG5ldyBPYmplY3RbXSB7IFRuZ1V0aWwuZ2V0VHlwZVRleHQob2JqLmVDbGFzcygpLmdldE5hbWUoKSkgfSk7IAotCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKHNpYmxpbmdzLCBvYmosIGJhc2VOYW1lKTsKLQkJbmV3Tm9kZS5zZXROYW1lKG9iai5nZXROYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBleHRyYWN0Q2hpbGRyZW4oSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIsIE9iamVjdCBvYmplY3QsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJLy8gZGlzYWJsZSByb2xsdXAgYmVmb3JlIGdldHRpbmcgdGhlIGNoaWxkcmVuCi0JCS8vCi0JCWJvb2xlYW4gb2xkUm9sbGVkVXAgPSBmYWxzZTsKLQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpYWRhcHRlcjsKLQkJCW9sZFJvbGxlZFVwID0gaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCWl0ZW1Qcm92aWRlci5iYXNpY1NldFJvbGxlZFVwKGZhbHNlKTsKLQkJfQotCQllbHNlIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpewotCQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpYWRhcHRlcjsKLQkJCW9sZFJvbGxlZFVwID0gaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCWl0ZW1Qcm92aWRlci5zZXRSb2xsZWRVcChmYWxzZSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQkvLyBmaWx0ZXIgb3V0IHRoZSBzdXBwcmVzc2VkIGVsZW1lbnRzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmKCFnZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZChjaGlsZCkpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGRvbid0IGZpbHRlciBzdXBwcmVzc2VkIGVsZW1lbnRzCi0JCQkvLwotCQkJLy9jaGlsZHJlbi5hZGRBbGwoYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIHJlc3RvcmUgdGhlIHJvbGxlZC11cCBmbGFnCi0JCQkvLwotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCSgoSUJTSXRlbVByb3ZpZGVyKWFkYXB0ZXIpLnNldFJvbGxlZFVwKG9sZFJvbGxlZFVwKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHN1cHByZXNzaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN1cHByZXNzaW9uKFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCXRoaXMuc3VwcHJlc3Npb24gPSBzdXBwcmVzc2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0jc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qKgotCSAqIEluIFByb2Nlc3MgV0JTLCBpZiBicmVha2Rvd25lbGVtZW50IGlzIG1vdmVkCi0JICogdXAgb3IgZG93biwgZGlhZ3JhbSBzaG91bGQgYmUgdXBkYXRlZCBhY2NvcmRpbmdseS4gCi0JICogU3ViLWNsYXNzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiBkaWFncmFtIG5lZWRzIHVwZGF0ZSBvbiBtb3ZlLiAKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3ZlTm9kZShPYmplY3Qgb2xkVmFsdWUpIHsKLQl9Ci0JCQotCXB1YmxpYyBib29sZWFuIGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkgewotCQlyZXR1cm4gZ3JhcGhpY2FsRGF0YVJlcXVpcmVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdyYXBoaWNhbERhdGFSZXF1aXJlZChib29sZWFuIGdyYXBoaWNhbERhdGFSZXF1aXJlZCkgewotCQl0aGlzLmdyYXBoaWNhbERhdGFSZXF1aXJlZCA9IGdyYXBoaWNhbERhdGFSZXF1aXJlZDsKLQl9Ci0JCQotCXB1YmxpYyBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0V3JhcHBlcihCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCXRoaXMud3JhcHBlciA9IHdyYXBwZXI7Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCi0JcHJpdmF0ZSBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbjsKLQotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyOwotCi0JcHJvdGVjdGVkIElGaWx0ZXIgZmlsdGVyOwotCQotCXByaXZhdGUgYm9vbGVhbiBncmFwaGljYWxEYXRhUmVxdWlyZWQgPSB0cnVlOwotCi19IC8vIERpYWdyYW1JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0xpbmtJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0xpbmtJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhYjE0NTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9MaW5rSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxpbms8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua0ltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5MaW5rSW1wbCNnZXRTb3VyY2UgPGVtPlNvdXJjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5MaW5rSW1wbCNnZXRUYXJnZXQgPGVtPlRhcmdldDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5MaW5rSW1wbCNnZXRCZW5kcG9pbnRzIDxlbT5CZW5kcG9pbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtJbXBsI2dldFNvdXJjZUVuZFBvaW50IDxlbT5Tb3VyY2UgRW5kIFBvaW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtJbXBsI2dldFRhcmdldEVuZFBvaW50IDxlbT5UYXJnZXQgRW5kIFBvaW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua0ltcGwgZXh0ZW5kcyBMaW5rZWRPYmplY3RJbXBsIGltcGxlbWVudHMgTGluayB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0KCkgPGVtPlRhcmdldDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhcmdldCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgdGFyZ2V0ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJlbmRwb2ludHMoKSA8ZW0+QmVuZHBvaW50czwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmVuZHBvaW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGJlbmRwb2ludHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvdXJjZUVuZFBvaW50KCkgPGVtPlNvdXJjZSBFbmQgUG9pbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb3VyY2VFbmRQb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQb2ludCBTT1VSQ0VfRU5EX1BPSU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvdXJjZUVuZFBvaW50KCkgPGVtPlNvdXJjZSBFbmQgUG9pbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb3VyY2VFbmRQb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IHNvdXJjZUVuZFBvaW50ID0gU09VUkNFX0VORF9QT0lOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXRFbmRQb2ludCgpIDxlbT5UYXJnZXQgRW5kIFBvaW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFyZ2V0RW5kUG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUG9pbnQgVEFSR0VUX0VORF9QT0lOVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXRFbmRQb2ludCgpIDxlbT5UYXJnZXQgRW5kIFBvaW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFyZ2V0RW5kUG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCB0YXJnZXRFbmRQb2ludCA9IFRBUkdFVF9FTkRfUE9JTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpbmtJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5MSU5LOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuTElOS19fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRTb3VyY2UoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0UpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKE5vZGUpZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFNvdXJjZShOb2RlIG5ld1NvdXJjZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3U291cmNlLCBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZShOb2RlIG5ld1NvdXJjZSkgewotCQlpZiAobmV3U291cmNlICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0UgJiYgbmV3U291cmNlICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3U291cmNlKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3U291cmNlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1NvdXJjZSkuZUludmVyc2VBZGQodGhpcywgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TLCBOb2RlLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFNvdXJjZShuZXdTb3VyY2UsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRSwgbmV3U291cmNlLCBuZXdTb3VyY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vZGUgZ2V0VGFyZ2V0KCkgewotCQlpZiAodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0LmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRUYXJnZXQgPSAoSW50ZXJuYWxFT2JqZWN0KXRhcmdldDsKLQkJCXRhcmdldCA9IChOb2RlKWVSZXNvbHZlUHJveHkob2xkVGFyZ2V0KTsKLQkJCWlmICh0YXJnZXQgIT0gb2xkVGFyZ2V0KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVCwgb2xkVGFyZ2V0LCB0YXJnZXQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGFyZ2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm9kZSBiYXNpY0dldFRhcmdldCgpIHsKLQkJcmV0dXJuIHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VGFyZ2V0KE5vZGUgbmV3VGFyZ2V0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCU5vZGUgb2xkVGFyZ2V0ID0gdGFyZ2V0OwotCQl0YXJnZXQgPSBuZXdUYXJnZXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVQsIG9sZFRhcmdldCwgbmV3VGFyZ2V0KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vZGUgbmV3VGFyZ2V0KSB7Ci0JCWlmIChuZXdUYXJnZXQgIT0gdGFyZ2V0KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh0YXJnZXQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdGFyZ2V0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlMsIE5vZGUuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld1RhcmdldCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdUYXJnZXQpLmVJbnZlcnNlQWRkKHRoaXMsIE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUywgTm9kZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRUYXJnZXQobmV3VGFyZ2V0LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVQsIG5ld1RhcmdldCwgbmV3VGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRCZW5kcG9pbnRzKCkgewotCQlpZiAoYmVuZHBvaW50cyA9PSBudWxsKSB7Ci0JCQliZW5kcG9pbnRzID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0KEFic29sdXRlQmVuZHBvaW50LmNsYXNzLCB0aGlzLCBNb2RlbFBhY2thZ2UuTElOS19fQkVORFBPSU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGJlbmRwb2ludHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRTb3VyY2VFbmRQb2ludCgpIHsKLQkJcmV0dXJuIHNvdXJjZUVuZFBvaW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VFbmRQb2ludChQb2ludCBuZXdTb3VyY2VFbmRQb2ludCkgewotCQlQb2ludCBvbGRTb3VyY2VFbmRQb2ludCA9IHNvdXJjZUVuZFBvaW50OwotCQlzb3VyY2VFbmRQb2ludCA9IG5ld1NvdXJjZUVuZFBvaW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFX0VORF9QT0lOVCwgb2xkU291cmNlRW5kUG9pbnQsIHNvdXJjZUVuZFBvaW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRUYXJnZXRFbmRQb2ludCgpIHsKLQkJcmV0dXJuIHRhcmdldEVuZFBvaW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbmRQb2ludChQb2ludCBuZXdUYXJnZXRFbmRQb2ludCkgewotCQlQb2ludCBvbGRUYXJnZXRFbmRQb2ludCA9IHRhcmdldEVuZFBvaW50OwotCQl0YXJnZXRFbmRQb2ludCA9IG5ld1RhcmdldEVuZFBvaW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUX0VORF9QT0lOVCwgb2xkVGFyZ2V0RW5kUG9pbnQsIHRhcmdldEVuZFBvaW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRTb3VyY2UoKE5vZGUpb3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUOgotCQkJCWlmICh0YXJnZXQgIT0gbnVsbCkKLQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXRhcmdldCkuZUludmVyc2VSZW1vdmUodGhpcywgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TLCBOb2RlLmNsYXNzLCBtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRUYXJnZXQoKE5vZGUpb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U291cmNlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUOgotCQkJCXJldHVybiBiYXNpY1NldFRhcmdldChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUywgTm9kZS5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRToKLQkJCQlyZXR1cm4gZ2V0U291cmNlKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVQ6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRUYXJnZXQoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRUYXJnZXQoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX0JFTkRQT0lOVFM6Ci0JCQkJcmV0dXJuIGdldEJlbmRwb2ludHMoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRV9FTkRfUE9JTlQ6Ci0JCQkJcmV0dXJuIGdldFNvdXJjZUVuZFBvaW50KCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVRfRU5EX1BPSU5UOgotCQkJCXJldHVybiBnZXRUYXJnZXRFbmRQb2ludCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoTm9kZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUOgotCQkJCXNldFRhcmdldCgoTm9kZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fQkVORFBPSU5UUzoKLQkJCQlnZXRCZW5kcG9pbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRCZW5kcG9pbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0VfRU5EX1BPSU5UOgotCQkJCXNldFNvdXJjZUVuZFBvaW50KChQb2ludCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUX0VORF9QT0lOVDoKLQkJCQlzZXRUYXJnZXRFbmRQb2ludCgoUG9pbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoTm9kZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVQ6Ci0JCQkJc2V0VGFyZ2V0KChOb2RlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX0JFTkRQT0lOVFM6Ci0JCQkJZ2V0QmVuZHBvaW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFX0VORF9QT0lOVDoKLQkJCQlzZXRTb3VyY2VFbmRQb2ludChTT1VSQ0VfRU5EX1BPSU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVRfRU5EX1BPSU5UOgotCQkJCXNldFRhcmdldEVuZFBvaW50KFRBUkdFVF9FTkRfUE9JTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFOgotCQkJCXJldHVybiBnZXRTb3VyY2UoKSAhPSBudWxsOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUOgotCQkJCXJldHVybiB0YXJnZXQgIT0gbnVsbDsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX0JFTkRQT0lOVFM6Ci0JCQkJcmV0dXJuIGJlbmRwb2ludHMgIT0gbnVsbCAmJiAhYmVuZHBvaW50cy5pc0VtcHR5KCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0VfRU5EX1BPSU5UOgotCQkJCXJldHVybiBTT1VSQ0VfRU5EX1BPSU5UX0VERUZBVUxUID09IG51bGwgPyBzb3VyY2VFbmRQb2ludCAhPSBudWxsIDogIVNPVVJDRV9FTkRfUE9JTlRfRURFRkFVTFQuZXF1YWxzKHNvdXJjZUVuZFBvaW50KTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVF9FTkRfUE9JTlQ6Ci0JCQkJcmV0dXJuIFRBUkdFVF9FTkRfUE9JTlRfRURFRkFVTFQgPT0gbnVsbCA/IHRhcmdldEVuZFBvaW50ICE9IG51bGwgOiAhVEFSR0VUX0VORF9QT0lOVF9FREVGQVVMVC5lcXVhbHModGFyZ2V0RW5kUG9pbnQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGJlbmRwb2ludHM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGJlbmRwb2ludHMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNvdXJjZUVuZFBvaW50OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzb3VyY2VFbmRQb2ludCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdGFyZ2V0RW5kUG9pbnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRhcmdldEVuZFBvaW50KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQkJc3VwZXIuc2V0T2JqZWN0KG5ld09iamVjdCk7Ci0KLQkJaWYgKG5ld09iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUdyYXBoRWRnZSBlZGdlID0gKEdyYXBoRWRnZSkgbmV3T2JqZWN0OwotCi0JCS8vIGNvcHkgYmVuZHBvaW50cyBmcm9tIGVkZ2UKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWRnZS5nZXRXYXlwb2ludHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWdldEJlbmRwb2ludHMoKS5hZGQoCi0JCQkJCW5ldyBBYnNvbHV0ZUJlbmRwb2ludChHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJLnRvUG9pbnQoKG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQpIGl0ZXIubmV4dCgpKSkpOwotCQl9Ci0KLQkJLy8gY29weSBlbmQgcG9pbnRzIGZyb20gR3JhcGhDb25uZWN0b3JzCi0JCS8vCi0JCWlmIChnZXRTb3VyY2VHcmFwaENvbm5lY3RvcigpLmdldFBvc2l0aW9uKCkgIT0gbnVsbCkgewotCQkJc291cmNlRW5kUG9pbnQgPSBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCS50b1BvaW50KGdldFNvdXJjZUdyYXBoQ29ubmVjdG9yKCkuZ2V0UG9zaXRpb24oKSk7Ci0JCX0KLQkJaWYgKGdldFRhcmdldEdyYXBoQ29ubmVjdG9yKCkuZ2V0UG9zaXRpb24oKSAhPSBudWxsKSB7Ci0JCQl0YXJnZXRFbmRQb2ludCA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJLnRvUG9pbnQoZ2V0VGFyZ2V0R3JhcGhDb25uZWN0b3IoKS5nZXRQb3NpdGlvbigpKTsKLQkJfQotCQkJCQotCQllQWRhcHRlcnMoKS5hZGQobmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCQlQb2ludCBwOwotCQkJCUdyYXBoRWRnZSBlZGdlID0gKEdyYXBoRWRnZSkgZ2V0T2JqZWN0KCk7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKExpbmsuY2xhc3MpKSB7Ci0JCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fQkVORFBPSU5UUzoKLQkJCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQkJcCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlpbnQgaW5kZXggPSBtc2cuZ2V0UG9zaXRpb24oKTsKLQkJCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgdW1hUG9pbnQgPSBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJCS5uZXdNb2RlbFBvaW50KHAueCwgcC55KTsKLQkJCQkJCWlmIChpbmRleCA9PSBOb3RpZmljYXRpb24uTk9fSU5ERVgpIHsKLQkJCQkJCQllZGdlLmdldFdheXBvaW50cygpLmFkZCh1bWFQb2ludCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWVkZ2UuZ2V0V2F5cG9pbnRzKCkuYWRkKGluZGV4LCB1bWFQb2ludCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJCS8vIHAgPSAoQWJzb2x1dGVCZW5kcG9pbnQpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJLy8gZWRnZS5nZXRXYXlwb2ludHMoKS5yZW1vdmUoR3JhcGhpY2FsRGF0YUhlbHBlci5uZXdNb2RlbFBvaW50KHAueCwKLQkJCQkJCS8vIHAueSkpOwotCi0JCQkJCQlpbmRleCA9IG1zZy5nZXRQb3NpdGlvbigpOwotCQkJCQkJaWYgKGluZGV4ID09IE5vdGlmaWNhdGlvbi5OT19JTkRFWCkgewotCQkJCQkJCWVkZ2UuZ2V0V2F5cG9pbnRzKCkucmVtb3ZlKG1zZy5nZXRQb3NpdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZWRnZS5nZXRXYXlwb2ludHMoKS5yZW1vdmUoaW5kZXgpOwotCQkJCQkJfQotCi0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJQXJyYXlMaXN0IHVtYVBvaW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCXAgPSAoQWJzb2x1dGVCZW5kcG9pbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkJCXVtYVBvaW50cy5hZGQoR3JhcGhpY2FsRGF0YUhlbHBlci5uZXdNb2RlbFBvaW50KAotCQkJCQkJCQkJcC54LCBwLnkpKTsKLQkJCQkJCX0KLQkJCQkJCWluZGV4ID0gbXNnLmdldFBvc2l0aW9uKCk7Ci0JCQkJCQlpZiAoaW5kZXggPT0gTm90aWZpY2F0aW9uLk5PX0lOREVYKSB7Ci0JCQkJCQkJZWRnZS5nZXRXYXlwb2ludHMoKS5hZGRBbGwodW1hUG9pbnRzKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZWRnZS5nZXRXYXlwb2ludHMoKS5hZGRBbGwoaW5kZXgsIHVtYVBvaW50cyk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCS8vIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQkvLyBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLy8gLmhhc05leHQoKTspIHsKLQkJCQkJLy8gcCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCS8vIGVkZ2UuZ2V0V2F5cG9pbnRzKCkucmVtb3ZlKEdyYXBoaWNhbERhdGFIZWxwZXIubmV3TW9kZWxQb2ludChwLngsCi0JCQkJCS8vIHAueSkpOwotCQkJCQkvLyB9Ci0JCQkJCS8vIHJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotCQkJCQkJcCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0vLwkJCQkJCVBvaW50IG9sZHAgPSAoQWJzb2x1dGVCZW5kcG9pbnQpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJaW50IHBvaW50SW5kZXggPSBtc2cuZ2V0UG9zaXRpb24oKTsKLQkJCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgbmV3VW1hUG9pbnQgPSBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJCS5uZXdNb2RlbFBvaW50KHAueCwgcC55KTsKLS8vCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCBvbGRVbWFQb2ludCA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLS8vCQkJCQkJCQkubmV3TW9kZWxQb2ludChvbGRwLngsIG9sZHAueSk7Ci0JCQkJCQlpZiAocG9pbnRJbmRleCA9PSBOb3RpZmljYXRpb24uTk9fSU5ERVgpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiSW5kZXggZm9yIGJlbmRwb2ludCBpcyAtMSwgQ2Fubm90IHNldCB0aGUgYmVuZCBwb2ludCBsb2NhdGlvbi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQllZGdlLmdldFdheXBvaW50cygpLnJlbW92ZShwb2ludEluZGV4KTsKLQkJCQkJCQllZGdlLmdldFdheXBvaW50cygpLmFkZChwb2ludEluZGV4LCBuZXdVbWFQb2ludCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRV9FTkRfUE9JTlQ6Ci0JCQkJCXAgPSAoUG9pbnQpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi5ub3RpZnlDaGFuZ2VkKCk6IG5ldyBzb3VyY2UgZW5kCi0JCQkJCS8vIHBvaW50OiAiICsgcCArICIuICIgKyBnZXRTb3VyY2UoKSk7Ci0JCQkJCWlmIChwICE9IG51bGwpIHsKLQkJCQkJCS8vIHRyYW5zbGF0ZSB0byByZWxhdGl2ZSBwb3NpdGlvbgotCQkJCQkJLy8KLQkJCQkJCS8vIHAudHJhbnNsYXRlKGdldFNvdXJjZSgpLmdldExvY2F0aW9uKCkuZ2V0TmVnYXRlZCgpKTsKLQkJCQkJCWdldFNvdXJjZUdyYXBoQ29ubmVjdG9yKCkuc2V0UG9zaXRpb24oCi0JCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIubmV3TW9kZWxQb2ludChwLngsIHAueSkpOwotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVRfRU5EX1BPSU5UOgotCQkJCQlwID0gKFBvaW50KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIubm90aWZ5Q2hhbmdlZCgpOiBuZXcgdGFyZ2V0IGVuZAotCQkJCQkvLyBwb2ludDogIiArIHAgKyAiLiAiICsgZ2V0VGFyZ2V0KCkpOwotCQkJCQlpZiAocCAhPSBudWxsKSB7Ci0JCQkJCQkvLyB0cmFuc2xhdGUgdG8gcmVsYXRpdmUgcG9zaXRpb24KLQkJCQkJCS8vCi0JCQkJCQkvLyBwLnRyYW5zbGF0ZShMaW5rSW1wbC50aGlzLmdldFRhcmdldCgpLmdldExvY2F0aW9uKCkuZ2V0TmVnYXRlZCgpKTsKLQkJCQkJCWdldFRhcmdldEdyYXBoQ29ubmVjdG9yKCkuc2V0UG9zaXRpb24oCi0JCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIubmV3TW9kZWxQb2ludChwLngsIHAueSkpOwotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0U6Ci0JCQkJCS8vIFRPRE8KLQkJCQkJcmV0dXJuOwotCQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVDoKLQkJCQkJLy8gVE9ETwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIEdyYXBoQ29ubmVjdG9yIGdldFNvdXJjZUdyYXBoQ29ubmVjdG9yKCkgewotCQlyZXR1cm4gKEdyYXBoQ29ubmVjdG9yKSAoKEdyYXBoRWRnZSkgZ2V0T2JqZWN0KCkpLmdldEFuY2hvcigpLmdldCgwKTsKLQl9Ci0KLQlwcml2YXRlIEdyYXBoQ29ubmVjdG9yIGdldFRhcmdldEdyYXBoQ29ubmVjdG9yKCkgewotCQlyZXR1cm4gKEdyYXBoQ29ubmVjdG9yKSAoKEdyYXBoRWRnZSkgZ2V0T2JqZWN0KCkpLmdldEFuY2hvcigpLmdldCgxKTsKLQl9Ci0KLX0gLy8gTGlua0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTGlua2VkT2JqZWN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9MaW5rZWRPYmplY3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0Y2EwMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9MaW5rZWRPYmplY3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TGlua2VkIE9iamVjdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5MaW5rZWRPYmplY3RJbXBsI2dldExpbmtlZEVsZW1lbnQgPGVtPkxpbmtlZCBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtlZE9iamVjdEltcGwjZ2V0T2JqZWN0IDxlbT5PYmplY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaW5rZWRPYmplY3RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cwotCQlMaW5rZWRPYmplY3QgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtlZEVsZW1lbnQoKSA8ZW0+TGlua2VkIEVsZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmtlZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGxpbmtlZEVsZW1lbnQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9iamVjdCgpIDxlbT5PYmplY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgT0JKRUNUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9iamVjdCgpIDxlbT5PYmplY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBvYmplY3QgPSBPQkpFQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpbmtlZE9iamVjdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLkxJTktFRF9PQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TGlua2VkRWxlbWVudCgpIHsKLQkJaWYgKGxpbmtlZEVsZW1lbnQgIT0gbnVsbCAmJiAoKEVPYmplY3QpbGlua2VkRWxlbWVudCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZExpbmtlZEVsZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KWxpbmtlZEVsZW1lbnQ7Ci0JCQlsaW5rZWRFbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpZVJlc29sdmVQcm94eShvbGRMaW5rZWRFbGVtZW50KTsKLQkJCWlmIChsaW5rZWRFbGVtZW50ICE9IG9sZExpbmtlZEVsZW1lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQsIG9sZExpbmtlZEVsZW1lbnQsIGxpbmtlZEVsZW1lbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlua2VkRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBiYXNpY0dldExpbmtlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBsaW5rZWRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmtlZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBuZXdMaW5rZWRFbGVtZW50KSB7Ci0JCU1ldGhvZEVsZW1lbnQgb2xkTGlua2VkRWxlbWVudCA9IGxpbmtlZEVsZW1lbnQ7Ci0JCWxpbmtlZEVsZW1lbnQgPSBuZXdMaW5rZWRFbGVtZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQsIG9sZExpbmtlZEVsZW1lbnQsIGxpbmtlZEVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJcmV0dXJuIG9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG5ld09iamVjdCkgewotCQlPYmplY3Qgb2xkT2JqZWN0ID0gb2JqZWN0OwotCQlvYmplY3QgPSBuZXdPYmplY3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX19PQkpFQ1QsIG9sZE9iamVjdCwgb2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQ6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TGlua2VkRWxlbWVudCgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9fT0JKRUNUOgotCQkJCXJldHVybiBnZXRPYmplY3QoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQ6Ci0JCQkJc2V0TGlua2VkRWxlbWVudCgoTWV0aG9kRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9fT0JKRUNUOgotCQkJCXNldE9iamVjdCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQ6Ci0JCQkJc2V0TGlua2VkRWxlbWVudCgoTWV0aG9kRWxlbWVudCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX19PQkpFQ1Q6Ci0JCQkJc2V0T2JqZWN0KE9CSkVDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX19MSU5LRURfRUxFTUVOVDoKLQkJCQlyZXR1cm4gbGlua2VkRWxlbWVudCAhPSBudWxsOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9fT0JKRUNUOgotCQkJCXJldHVybiBPQkpFQ1RfRURFRkFVTFQgPT0gbnVsbCA/IG9iamVjdCAhPSBudWxsIDogIU9CSkVDVF9FREVGQVVMVC5lcXVhbHMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG9iamVjdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQob2JqZWN0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIExpbmtlZE9iamVjdEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTW9kZWxGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Nb2RlbEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVhY2RjMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Nb2RlbEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgTW9kZWxGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2RlbEZhY3RvcnkgaW5pdCgpIHsKLQkJdHJ5IHsKLQkJCU1vZGVsRmFjdG9yeSB0aGVNb2RlbEZhY3RvcnkgPSAoTW9kZWxGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiKTsgCi0JCQlpZiAodGhlTW9kZWxGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdGhlTW9kZWxGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IE1vZGVsRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbEZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuRElBR1JBTTogcmV0dXJuIGNyZWF0ZURpYWdyYW0oKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTks6IHJldHVybiBjcmVhdGVMaW5rKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFOiByZXR1cm4gY3JlYXRlTmFtZWROb2RlKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5BQ1RJVklUWV9ESUFHUkFNOiByZXR1cm4gY3JlYXRlQWN0aXZpdHlEaWFncmFtKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFOiByZXR1cm4gY3JlYXRlVHlwZWROb2RlKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOiByZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX05PREU6IHJldHVybiBjcmVhdGVXb3JrUHJvZHVjdE5vZGUoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOiByZXR1cm4gY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ST0xFX05PREU6IHJldHVybiBjcmVhdGVSb2xlTm9kZSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9UQVNLX0NPTVBPU0lURTogcmV0dXJuIGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5UQVNLX05PREU6IHJldHVybiBjcmVhdGVUYXNrTm9kZSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERTogcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERTogcmV0dXJuIGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX0NPTVBPU0lURTogcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkFCU09MVVRFX0JFTkRQT0lOVDoKLQkJCQlyZXR1cm4gY3JlYXRlQWJzb2x1dGVCZW5kcG9pbnRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlBPSU5UOgotCQkJCXJldHVybiBjcmVhdGVQb2ludEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9ERVNDUklQVE9SOgotCQkJCXJldHVybiBjcmVhdGVSb2xlRGVzY3JpcHRvckZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5BQlNPTFVURV9CRU5EUE9JTlQ6Ci0JCQkJcmV0dXJuIGNvbnZlcnRBYnNvbHV0ZUJlbmRwb2ludFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5QT0lOVDoKLQkJCQlyZXR1cm4gY29udmVydFBvaW50VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUjoKLQkJCQlyZXR1cm4gY29udmVydFJvbGVEZXNjcmlwdG9yVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBjcmVhdGVEaWFncmFtKCkgewotCQlEaWFncmFtSW1wbCBkaWFncmFtID0gbmV3IERpYWdyYW1JbXBsKCk7Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGluayBjcmVhdGVMaW5rKCkgewotCQlMaW5rSW1wbCBsaW5rID0gbmV3IExpbmtJbXBsKCk7Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTmFtZWROb2RlIGNyZWF0ZU5hbWVkTm9kZSgpIHsKLQkJTmFtZWROb2RlSW1wbCBuYW1lZE5vZGUgPSBuZXcgTmFtZWROb2RlSW1wbCgpOwotCQlyZXR1cm4gbmFtZWROb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEaWFncmFtIGNyZWF0ZUFjdGl2aXR5RGlhZ3JhbSgpIHsKLQkJQWN0aXZpdHlEaWFncmFtSW1wbCBhY3Rpdml0eURpYWdyYW0gPSBuZXcgQWN0aXZpdHlEaWFncmFtSW1wbCgpOwotCQlyZXR1cm4gYWN0aXZpdHlEaWFncmFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHlwZWROb2RlIGNyZWF0ZVR5cGVkTm9kZSgpIHsKLQkJVHlwZWROb2RlSW1wbCB0eXBlZE5vZGUgPSBuZXcgVHlwZWROb2RlSW1wbCgpOwotCQlyZXR1cm4gdHlwZWROb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSBjcmVhdGVXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCkgewotCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSW1wbCB3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtID0gbmV3IFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3ROb2RlIGNyZWF0ZVdvcmtQcm9kdWN0Tm9kZSgpIHsKLQkJV29ya1Byb2R1Y3ROb2RlSW1wbCB3b3JrUHJvZHVjdE5vZGUgPSBuZXcgV29ya1Byb2R1Y3ROb2RlSW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3ROb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEZXRhaWxEaWFncmFtIGNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpIHsKLQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCBhY3Rpdml0eURldGFpbERpYWdyYW0gPSBuZXcgQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCgpOwotCQlyZXR1cm4gYWN0aXZpdHlEZXRhaWxEaWFncmFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZU5vZGUgY3JlYXRlUm9sZU5vZGUoKSB7Ci0JCVJvbGVOb2RlSW1wbCByb2xlTm9kZSA9IG5ldyBSb2xlTm9kZUltcGwoKTsKLQkJcmV0dXJuIHJvbGVOb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZVRhc2tDb21wb3NpdGUgY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUoKSB7Ci0JCVJvbGVUYXNrQ29tcG9zaXRlSW1wbCByb2xlVGFza0NvbXBvc2l0ZSA9IG5ldyBSb2xlVGFza0NvbXBvc2l0ZUltcGwoKTsKLQkJcmV0dXJuIHJvbGVUYXNrQ29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFza05vZGUgY3JlYXRlVGFza05vZGUoKSB7Ci0JCVRhc2tOb2RlSW1wbCB0YXNrTm9kZSA9IG5ldyBUYXNrTm9kZUltcGwoKTsKLQkJcmV0dXJuIHRhc2tOb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbCB3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlID0gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpIHsKLQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbCB3b3JrQnJlYWtkb3duRWxlbWVudE5vZGUgPSBuZXcgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbCgpOwotCQlyZXR1cm4gd29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RDb21wb3NpdGUgY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoKSB7Ci0JCVdvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbCB3b3JrUHJvZHVjdENvbXBvc2l0ZSA9IG5ldyBXb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwoKTsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0Q29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWJzb2x1dGVCZW5kcG9pbnQgY3JlYXRlQWJzb2x1dGVCZW5kcG9pbnRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChBYnNvbHV0ZUJlbmRwb2ludClzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0QWJzb2x1dGVCZW5kcG9pbnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgY3JlYXRlUG9pbnRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChQb2ludClzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0UG9pbnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRvciBjcmVhdGVSb2xlRGVzY3JpcHRvckZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFJvbGVEZXNjcmlwdG9yKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRSb2xlRGVzY3JpcHRvclRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsCi0JCQlPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbFBhY2thZ2UgZ2V0TW9kZWxQYWNrYWdlKCkgewotCQlyZXR1cm4gKE1vZGVsUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9kZWxQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvLyBNb2RlbEZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL01vZGVsUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTW9kZWxQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmM2UzMDJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTW9kZWxQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uIDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBNb2RlbFBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkaWFncmFtRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsaW5rRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsaW5rZWRPYmplY3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG5hbWVkTm9kZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgbm9kZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYWN0aXZpdHlEaWFncmFtRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0eXBlZE5vZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0Tm9kZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYWN0aXZpdHlEZXRhaWxEaWFncmFtRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBub2RlQ29udGFpbmVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlTm9kZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZVRhc2tDb21wb3NpdGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRhc2tOb2RlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrQnJlYWtkb3duRWxlbWVudE5vZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0Q29tcG9zaXRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBhYnNvbHV0ZUJlbmRwb2ludEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgcG9pbnRFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHJvbGVEZXNjcmlwdG9yRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUKLQkgKiBwYWNrYWdlIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPgotCSAqIE5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMgZmFjdG9yeQotCSAqIG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcyBpbml0aWFsaXphdGlvbiBvZiB0aGUKLQkgKiBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNb2RlbFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2RlbFBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKE1vZGVsUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNb2RlbFBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlNb2RlbFBhY2thZ2VJbXBsIHRoZU1vZGVsUGFja2FnZSA9IChNb2RlbFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIE1vZGVsUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBNb2RlbFBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJTW9kZWxQYWNrYWdlSW1wbCB0aGVNb2RlbFBhY2thZ2VfMSA9IChNb2RlbFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNb2RlbFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBNb2RlbFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kZWxQYWNrYWdlLmVOU19VUkkpIDogTW9kZWxQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlTW9kZWxQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVNb2RlbFBhY2thZ2VfMS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZU1vZGVsUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZU1vZGVsUGFja2FnZV8xLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZU1vZGVsUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlTW9kZWxQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERpYWdyYW0oKSB7Ci0JCXJldHVybiBkaWFncmFtRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExpbmsoKSB7Ci0JCXJldHVybiBsaW5rRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExpbmtfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxpbmtFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TGlua19Tb3VyY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlsaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldExpbmtfVGFyZ2V0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbGlua0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMaW5rX0JlbmRwb2ludHMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExpbmtfU291cmNlRW5kUG9pbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExpbmtfVGFyZ2V0RW5kUG9pbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TGlua2VkT2JqZWN0KCkgewotCQlyZXR1cm4gbGlua2VkT2JqZWN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldExpbmtlZE9iamVjdF9MaW5rZWRFbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbGlua2VkT2JqZWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGlua2VkT2JqZWN0X09iamVjdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxpbmtlZE9iamVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE5hbWVkTm9kZSgpIHsKLQkJcmV0dXJuIG5hbWVkTm9kZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TmFtZWROb2RlX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSluYW1lZE5vZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXROb2RlKCkgewotCQlyZXR1cm4gbm9kZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Tm9kZV9Mb2NhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW5vZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Tm9kZV9XaWR0aCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW5vZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Tm9kZV9IZWlnaHQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlub2RlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE5vZGVfSW5jb21pbmdDb25uZWN0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW5vZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Tm9kZV9PdXRnb2luZ0Nvbm5lY3Rpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upbm9kZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXROb2RlX1JlYWRPbmx5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbm9kZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFjdGl2aXR5RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RGlhZ3JhbUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUeXBlZE5vZGUoKSB7Ci0JCXJldHVybiB0eXBlZE5vZGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFR5cGVkTm9kZV9UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdHlwZWROb2RlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3ROb2RlKCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3ROb2RlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdE5vZGVfVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0Tm9kZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURldGFpbERpYWdyYW1fQXV0b0xheW91dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE5vZGVDb250YWluZXIoKSB7Ci0JCXJldHVybiBub2RlQ29udGFpbmVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXROb2RlQ29udGFpbmVyX05vZGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upbm9kZUNvbnRhaW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvbGVOb2RlKCkgewotCQlyZXR1cm4gcm9sZU5vZGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZVRhc2tDb21wb3NpdGUoKSB7Ci0JCXJldHVybiByb2xlVGFza0NvbXBvc2l0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlVGFza0NvbXBvc2l0ZV9Sb3dJbmRleCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVUYXNrQ29tcG9zaXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFza05vZGUoKSB7Ci0JCXJldHVybiB0YXNrTm9kZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrTm9kZV9JbmRleCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tOb2RlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnROb2RlKCkgewotCQlyZXR1cm4gd29ya0JyZWFrZG93bkVsZW1lbnROb2RlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0Q29tcG9zaXRlKCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3RDb21wb3NpdGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0Q29tcG9zaXRlX1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdENvbXBvc2l0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEFic29sdXRlQmVuZHBvaW50KCkgewotCQlyZXR1cm4gYWJzb2x1dGVCZW5kcG9pbnRFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0UG9pbnQoKSB7Ci0JCXJldHVybiBwb2ludEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRSb2xlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHJvbGVEZXNjcmlwdG9yRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kZWxGYWN0b3J5IGdldE1vZGVsRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChNb2RlbEZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWRpYWdyYW1FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElBR1JBTSk7Ci0KLQkJbGlua0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMSU5LKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsaW5rRUNsYXNzLCBMSU5LX19OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsaW5rRUNsYXNzLCBMSU5LX19TT1VSQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGxpbmtFQ2xhc3MsIExJTktfX1RBUkdFVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobGlua0VDbGFzcywgTElOS19fQkVORFBPSU5UUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobGlua0VDbGFzcywgTElOS19fU09VUkNFX0VORF9QT0lOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobGlua0VDbGFzcywgTElOS19fVEFSR0VUX0VORF9QT0lOVCk7Ci0KLQkJbGlua2VkT2JqZWN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKExJTktFRF9PQkpFQ1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKGxpbmtlZE9iamVjdEVDbGFzcywgTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGxpbmtlZE9iamVjdEVDbGFzcywgTElOS0VEX09CSkVDVF9fT0JKRUNUKTsKLQotCQluYW1lZE5vZGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTkFNRURfTk9ERSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobmFtZWROb2RlRUNsYXNzLCBOQU1FRF9OT0RFX19OQU1FKTsKLQotCQlub2RlRUNsYXNzID0gY3JlYXRlRUNsYXNzKE5PREUpOwotCQljcmVhdGVFQXR0cmlidXRlKG5vZGVFQ2xhc3MsIE5PREVfX0xPQ0FUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShub2RlRUNsYXNzLCBOT0RFX19XSURUSCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobm9kZUVDbGFzcywgTk9ERV9fSEVJR0hUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShub2RlRUNsYXNzLCBOT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uobm9kZUVDbGFzcywgTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKG5vZGVFQ2xhc3MsIE5PREVfX1JFQURfT05MWSk7Ci0KLQkJYWN0aXZpdHlEaWFncmFtRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFDVElWSVRZX0RJQUdSQU0pOwotCi0JCXR5cGVkTm9kZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUWVBFRF9OT0RFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0eXBlZE5vZGVFQ2xhc3MsIFRZUEVEX05PREVfX1RZUEUpOwotCi0JCXdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSk7Ci0KLQkJd29ya1Byb2R1Y3ROb2RlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfUFJPRFVDVF9OT0RFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdE5vZGVFQ2xhc3MsIFdPUktfUFJPRFVDVF9OT0RFX19UWVBFKTsKLQotCQlhY3Rpdml0eURldGFpbERpYWdyYW1FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVDbGFzcywgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0FVVE9fTEFZT1VUKTsKLQotCQlub2RlQ29udGFpbmVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKE5PREVfQ09OVEFJTkVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShub2RlQ29udGFpbmVyRUNsYXNzLCBOT0RFX0NPTlRBSU5FUl9fTk9ERVMpOwotCi0JCXJvbGVOb2RlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPTEVfTk9ERSk7Ci0KLQkJcm9sZVRhc2tDb21wb3NpdGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9UQVNLX0NPTVBPU0lURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZVRhc2tDb21wb3NpdGVFQ2xhc3MsIFJPTEVfVEFTS19DT01QT1NJVEVfX1JPV19JTkRFWCk7Ci0KLQkJdGFza05vZGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEFTS19OT0RFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrTm9kZUVDbGFzcywgVEFTS19OT0RFX19JTkRFWCk7Ci0KLQkJd29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFKTsKLQotCQl3b3JrQnJlYWtkb3duRWxlbWVudE5vZGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFKTsKLQotCQl3b3JrUHJvZHVjdENvbXBvc2l0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX1BST0RVQ1RfQ09NUE9TSVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdENvbXBvc2l0ZUVDbGFzcywgV09SS19QUk9EVUNUX0NPTVBPU0lURV9fVFlQRSk7Ci0KLQkJLy8gQ3JlYXRlIGRhdGEgdHlwZXMKLQkJYWJzb2x1dGVCZW5kcG9pbnRFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoQUJTT0xVVEVfQkVORFBPSU5UKTsKLQkJcG9pbnRFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoUE9JTlQpOwotCQlyb2xlRGVzY3JpcHRvckVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShST0xFX0RFU0NSSVBUT1IpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJTW9kZWxQYWNrYWdlIHRoZU1vZGVsUGFja2FnZV8xID0gKE1vZGVsUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNb2RlbFBhY2thZ2UuZU5TX1VSSSk7Ci0JCVVtYVBhY2thZ2UgdGhlVW1hUGFja2FnZSA9IChVbWFQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFVtYVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQlkaWFncmFtRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU1vZGVsUGFja2FnZV8xLmdldE5vZGVDb250YWluZXIoKSk7Ci0JCWxpbmtFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlTW9kZWxQYWNrYWdlXzEuZ2V0TGlua2VkT2JqZWN0KCkpOwotCQluYW1lZE5vZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlTW9kZWxQYWNrYWdlXzEuZ2V0Tm9kZSgpKTsKLQkJbm9kZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVNb2RlbFBhY2thZ2VfMS5nZXRMaW5rZWRPYmplY3QoKSk7Ci0JCWFjdGl2aXR5RGlhZ3JhbUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVNb2RlbFBhY2thZ2VfMS5nZXREaWFncmFtKCkpOwotCQl0eXBlZE5vZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlTW9kZWxQYWNrYWdlXzEuZ2V0Tm9kZSgpKTsKLQkJd29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVNb2RlbFBhY2thZ2VfMS5nZXREaWFncmFtKCkpOwotCQl3b3JrUHJvZHVjdE5vZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlTW9kZWxQYWNrYWdlXzEuZ2V0TmFtZWROb2RlKCkpOwotCQlhY3Rpdml0eURldGFpbERpYWdyYW1FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlTW9kZWxQYWNrYWdlXzEuZ2V0RGlhZ3JhbSgpKTsKLQkJbm9kZUNvbnRhaW5lckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVNb2RlbFBhY2thZ2VfMS5nZXROb2RlKCkpOwotCQlyb2xlTm9kZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVNb2RlbFBhY2thZ2VfMS5nZXROYW1lZE5vZGUoKSk7Ci0JCXJvbGVUYXNrQ29tcG9zaXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU1vZGVsUGFja2FnZV8xLmdldE5vZGVDb250YWluZXIoKSk7Ci0JCXRhc2tOb2RlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU1vZGVsUGFja2FnZV8xLmdldE5hbWVkTm9kZSgpKTsKLQkJd29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVNb2RlbFBhY2thZ2VfMS5nZXROYW1lZE5vZGUoKSk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVNb2RlbFBhY2thZ2VfMS5nZXROYW1lZE5vZGUoKSk7Ci0JCXdvcmtQcm9kdWN0Q29tcG9zaXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU1vZGVsUGFja2FnZV8xLmdldE5vZGVDb250YWluZXIoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhkaWFncmFtRUNsYXNzLCBEaWFncmFtLmNsYXNzLCAiRGlhZ3JhbSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGxpbmtFQ2xhc3MsIExpbmsuY2xhc3MsICJMaW5rIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMaW5rX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCAiIiwgMCwgMSwgTGluay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TGlua19Tb3VyY2UoKSwgdGhlTW9kZWxQYWNrYWdlXzEuZ2V0Tm9kZSgpLCB0aGVNb2RlbFBhY2thZ2VfMS5nZXROb2RlX091dGdvaW5nQ29ubmVjdGlvbnMoKSwgInNvdXJjZSIsIG51bGwsIDAsIDEsIExpbmsuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMaW5rX1RhcmdldCgpLCB0aGVNb2RlbFBhY2thZ2VfMS5nZXROb2RlKCksIHRoZU1vZGVsUGFja2FnZV8xLmdldE5vZGVfSW5jb21pbmdDb25uZWN0aW9ucygpLCAidGFyZ2V0IiwgbnVsbCwgMCwgMSwgTGluay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGlua19CZW5kcG9pbnRzKCksIHRoZU1vZGVsUGFja2FnZV8xLmdldEFic29sdXRlQmVuZHBvaW50KCksICJiZW5kcG9pbnRzIiwgbnVsbCwgMCwgLTEsIExpbmsuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGlua19Tb3VyY2VFbmRQb2ludCgpLCB0aGVNb2RlbFBhY2thZ2VfMS5nZXRQb2ludCgpLCAic291cmNlRW5kUG9pbnQiLCBudWxsLCAwLCAxLCBMaW5rLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExpbmtfVGFyZ2V0RW5kUG9pbnQoKSwgdGhlTW9kZWxQYWNrYWdlXzEuZ2V0UG9pbnQoKSwgInRhcmdldEVuZFBvaW50IiwgbnVsbCwgMCwgMSwgTGluay5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobGlua2VkT2JqZWN0RUNsYXNzLCBMaW5rZWRPYmplY3QuY2xhc3MsICJMaW5rZWRPYmplY3QiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TGlua2VkT2JqZWN0X0xpbmtlZEVsZW1lbnQoKSwgdGhlVW1hUGFja2FnZS5nZXRNZXRob2RFbGVtZW50KCksIG51bGwsICJsaW5rZWRFbGVtZW50IiwgbnVsbCwgMCwgMSwgTGlua2VkT2JqZWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMaW5rZWRPYmplY3RfT2JqZWN0KCksIGVjb3JlUGFja2FnZS5nZXRFSmF2YU9iamVjdCgpLCAib2JqZWN0IiwgbnVsbCwgMCwgMSwgTGlua2VkT2JqZWN0LmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhuYW1lZE5vZGVFQ2xhc3MsIE5hbWVkTm9kZS5jbGFzcywgIk5hbWVkTm9kZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TmFtZWROb2RlX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBOYW1lZE5vZGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhub2RlRUNsYXNzLCBOb2RlLmNsYXNzLCAiTm9kZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXROb2RlX0xvY2F0aW9uKCksIHRoZU1vZGVsUGFja2FnZV8xLmdldFBvaW50KCksICJsb2NhdGlvbiIsIG51bGwsIDAsIDEsIE5vZGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Tm9kZV9XaWR0aCgpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAid2lkdGgiLCAiLTEiLCAwLCAxLCBOb2RlLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE5vZGVfSGVpZ2h0KCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJoZWlnaHQiLCAiLTEiLCAwLCAxLCBOb2RlLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE5vZGVfSW5jb21pbmdDb25uZWN0aW9ucygpLCB0aGVNb2RlbFBhY2thZ2VfMS5nZXRMaW5rKCksIHRoZU1vZGVsUGFja2FnZV8xLmdldExpbmtfVGFyZ2V0KCksICJpbmNvbWluZ0Nvbm5lY3Rpb25zIiwgbnVsbCwgMCwgLTEsIE5vZGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE5vZGVfT3V0Z29pbmdDb25uZWN0aW9ucygpLCB0aGVNb2RlbFBhY2thZ2VfMS5nZXRMaW5rKCksIHRoZU1vZGVsUGFja2FnZV8xLmdldExpbmtfU291cmNlKCksICJvdXRnb2luZ0Nvbm5lY3Rpb25zIiwgbnVsbCwgMCwgLTEsIE5vZGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE5vZGVfUmVhZE9ubHkoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJyZWFkT25seSIsIG51bGwsIDAsIDEsIE5vZGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhY3Rpdml0eURpYWdyYW1FQ2xhc3MsIEFjdGl2aXR5RGlhZ3JhbS5jbGFzcywgIkFjdGl2aXR5RGlhZ3JhbSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHR5cGVkTm9kZUVDbGFzcywgVHlwZWROb2RlLmNsYXNzLCAiVHlwZWROb2RlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUeXBlZE5vZGVfVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAidHlwZSIsIG51bGwsIDAsIDEsIFR5cGVkTm9kZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FQ2xhc3MsIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0uY2xhc3MsICJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Mod29ya1Byb2R1Y3ROb2RlRUNsYXNzLCBXb3JrUHJvZHVjdE5vZGUuY2xhc3MsICJXb3JrUHJvZHVjdE5vZGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0Tm9kZV9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgV29ya1Byb2R1Y3ROb2RlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYWN0aXZpdHlEZXRhaWxEaWFncmFtRUNsYXNzLCBBY3Rpdml0eURldGFpbERpYWdyYW0uY2xhc3MsICJBY3Rpdml0eURldGFpbERpYWdyYW0iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9BdXRvTGF5b3V0KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiYXV0b0xheW91dCIsIG51bGwsIDAsIDEsIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG5vZGVDb250YWluZXJFQ2xhc3MsIE5vZGVDb250YWluZXIuY2xhc3MsICJOb2RlQ29udGFpbmVyIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE5vZGVDb250YWluZXJfTm9kZXMoKSwgdGhlTW9kZWxQYWNrYWdlXzEuZ2V0Tm9kZSgpLCBudWxsLCAibm9kZXMiLCBudWxsLCAwLCAtMSwgTm9kZUNvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJvbGVOb2RlRUNsYXNzLCBSb2xlTm9kZS5jbGFzcywgIlJvbGVOb2RlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Mocm9sZVRhc2tDb21wb3NpdGVFQ2xhc3MsIFJvbGVUYXNrQ29tcG9zaXRlLmNsYXNzLCAiUm9sZVRhc2tDb21wb3NpdGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVUYXNrQ29tcG9zaXRlX1Jvd0luZGV4KCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJyb3dJbmRleCIsIG51bGwsIDAsIDEsIFJvbGVUYXNrQ29tcG9zaXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3ModGFza05vZGVFQ2xhc3MsIFRhc2tOb2RlLmNsYXNzLCAiVGFza05vZGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tOb2RlX0luZGV4KCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJpbmRleCIsICItMSIsIDAsIDEsIFRhc2tOb2RlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVDbGFzcywgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZS5jbGFzcywgIldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh3b3JrQnJlYWtkb3duRWxlbWVudE5vZGVFQ2xhc3MsIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5jbGFzcywgIldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHdvcmtQcm9kdWN0Q29tcG9zaXRlRUNsYXNzLCBXb3JrUHJvZHVjdENvbXBvc2l0ZS5jbGFzcywgIldvcmtQcm9kdWN0Q29tcG9zaXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdENvbXBvc2l0ZV9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgV29ya1Byb2R1Y3RDb21wb3NpdGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCi0JCWluaXRFRGF0YVR5cGUoYWJzb2x1dGVCZW5kcG9pbnRFRGF0YVR5cGUsIEFic29sdXRlQmVuZHBvaW50LmNsYXNzLCAiQWJzb2x1dGVCZW5kcG9pbnQiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RURhdGFUeXBlKHBvaW50RURhdGFUeXBlLCBQb2ludC5jbGFzcywgIlBvaW50IiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVEYXRhVHlwZShyb2xlRGVzY3JpcHRvckVEYXRhVHlwZSwgUm9sZURlc2NyaXB0b3IuY2xhc3MsICJSb2xlRGVzY3JpcHRvciIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JfQotCi19IC8vIE1vZGVsUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTmFtZWROb2RlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9OYW1lZE5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI0ZWQ0OWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9OYW1lZE5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLmltcGwuSW50ZXJuYWxUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uaW1wbC5JbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklOb2RlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZWQgTm9kZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5OYW1lZE5vZGVJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lZE5vZGVJbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBOYW1lZE5vZGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5hbWVkTm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX05PREU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQkvLyBTdGFydCBjdXN0b20gY29kZSAgLy8KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQotCXByb3RlY3RlZCBjbGFzcyBNZXRob2RFbGVtZW50QWRhcHRlciBleHRlbmRzIFRyYW5zYWN0aW9uYWxOb2RlTGluayB7Ci0JCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJCXNldE5hbWUobXNnLmdldE5ld1N0cmluZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCQkJcmV0dXJuOwotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlJbnRlcm5hbFRyYW5zYWN0aW9uIHR4ID0gbnVsbDsKLQkJCQlJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IChJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihnZXROb2RlKCkpOwotCQkJCWlmKGRvbWFpbiAhPSBudWxsKSB7Ci0JCQkJCXR4ID0gZG9tYWluLnN0YXJ0VHJhbnNhY3Rpb24oZmFsc2UsIENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCQkJfQotCQkJCQotCQkJCWhhbmRsZU5vdGlmaWNhdGlvbihtc2cpOwotCQkJCQotCQkJCWlmKHR4ICE9IG51bGwpIHsKLQkJCQkJdHguY29tbWl0KCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gTmFtZWROb2RlSW1wbC50aGlzOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGluayBhZGRJbmNvbWluZ0Nvbm5lY3Rpb24oTWV0aG9kRWxlbWVudCBzb3VyY2UpIHsKLQkJTm9kZSBzcmNOb2RlID0gZmluZE5vZGUoc291cmNlKTsKLQkJaWYgKHNyY05vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlMaW5rIGxpbmsgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmsoKTsKLQkJbGluay5zZXRUYXJnZXQodGhpcyk7Ci0KLQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24gb2Ygc3JjTm9kZSBiZWZvcmUgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGxpbmsKLQkJLy8gc28gaXQgd2lsbCBub3QgY3JlYXRlIGR1cGxpY2F0ZSBVTUEgZGF0YQotCQkvLwotCQlOb2RlSW1wbCBzcmNOb2RlSW1wbCA9IChOb2RlSW1wbCkgc3JjTm9kZTsKLQkJYm9vbGVhbiBub3RpZnkgPSBzcmNOb2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkOwotCQl0cnkgewotCQkJc3JjTm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJbGluay5zZXRTb3VyY2Uoc3JjTm9kZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzcmNOb2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5OwotCQl9Ci0KLQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5hZGRHcmFwaGljYWxEYXRhKGxpbmspOwotCQl9Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCXByb3RlY3RlZCBOb2RlIGZpbmROb2RlKE1ldGhvZEVsZW1lbnQgbGlua2VkRWxlbWVudCkgewotCQlyZXR1cm4gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZShnZXREaWFncmFtKCksIGxpbmtlZEVsZW1lbnQpOwotCX0KLQotCXByb3RlY3RlZCBMaW5rIGFkZE91dGdvaW5nQ29ubmVjdGlvbihNZXRob2RFbGVtZW50IHRhcmdldCkgewotCQlOb2RlIHRhcmdldE5vZGUgPSBmaW5kTm9kZSh0YXJnZXQpOwotCQlpZiAodGFyZ2V0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpbmsgbGluayA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluaygpOwotCi0JCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uIG9mIHRhcmdldE5vZGUgYmVmb3JlIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBsaW5rCi0JCS8vIHNvIGl0IHdpbGwgbm90IGNyZWF0ZSBkdXBsaWNhdGUgVU1BIGRhdGEKLQkJLy8KLQkJTm9kZUltcGwgbm9kZUltcGwgPSAoTm9kZUltcGwpIHRhcmdldE5vZGU7Ci0JCWJvb2xlYW4gbm90aWZ5ID0gbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJdHJ5IHsKLQkJCW5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCWxpbmsuc2V0VGFyZ2V0KHRhcmdldE5vZGUpOwotCQl9IGZpbmFsbHkgewotCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQkJfQotCi0JCWxpbmsuc2V0U291cmNlKHRoaXMpOwotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQlHcmFwaGljYWxEYXRhSGVscGVyLmFkZEdyYXBoaWNhbERhdGEobGluayk7Ci0JCX0KLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKE1ldGhvZEVsZW1lbnQgc291cmNlKSB7Ci0JCS8vIGxvb2sgZm9yIHRoZSBpbmNvbWluZyBjb25uZWN0aW9uIHdpdGggc291cmNlIGFzIGxpbmtlZCBvYmplY3Qgb2YgdGhlCi0JCS8vIHNvdXJjZSBub2RlCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCWlmIChsaW5rLmdldFNvdXJjZSgpICE9IG51bGwKLQkJCQkJJiYgbGluay5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKSA9PSBzb3VyY2UpIHsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZUdyYXBoaWNhbERhdGEobGluayk7Ci0JCQkJLy8gZGlzYWJsZSBpbnRlcm5hbCBub3RpZmljYXRpb24gb2YgdGhlIHNvdXJjZSBub2RlCi0JCQkJLy8KLQkJCQlOb2RlSW1wbCBzb3VyY2VOb2RlID0gKE5vZGVJbXBsKSBsaW5rLmdldFNvdXJjZSgpOwotCQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCXRyeSB7Ci0JCQkJCXNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBvbGROb3RpZnk7Ci0JCQkJfQotCQkJCWxpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQkJCWxpbmsuc2V0T2JqZWN0KG51bGwpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVPdXRnb2luZ0Nvbm5lY3Rpb24oTWV0aG9kRWxlbWVudCB0YXJnZXQpIHsKLQkJLy8gbG9vayBmb3IgdGhlIGluY29taW5nIGNvbm5lY3Rpb24gd2l0aCBzb3VyY2UgYXMgbGlua2VkIG9iamVjdCBvZiB0aGUKLQkJLy8gc291cmNlIG5vZGUKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbAotCQkJCQkmJiBsaW5rLmdldFRhcmdldCgpLmdldE9iamVjdCgpID09IHRhcmdldCkgewotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlR3JhcGhpY2FsRGF0YShsaW5rKTsKLQkJCQkvLyBkaXNhYmxlIGludGVybmFsIG5vdGlmaWNhdGlvbiBvZiB0aGUgc291cmNlIG5vZGUKLQkJCQkvLwotCQkJCU5vZGVJbXBsIHRhcmdldE5vZGUgPSAoTm9kZUltcGwpIGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCQkJYm9vbGVhbiBvbGROb3RpZnkgPSB0YXJnZXROb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJdHJ5IHsKLQkJCQkJdGFyZ2V0Tm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCWxpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXRhcmdldE5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IG9sZE5vdGlmeTsKLQkJCQl9Ci0JCQkJbGluay5zZXRTb3VyY2UobnVsbCk7Ci0JCQkJbGluay5zZXRPYmplY3QobnVsbCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3QgbmV3T2JqZWN0KSB7Ci0JCXN1cGVyLnNldE9iamVjdChuZXdPYmplY3QpOwotCi0JCWlmIChuZXdPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCi0JCS8vIHVzZSBwcmVzZW50YXRpb24gbmFtZQotCQlpZiAobmV3T2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZWxlbWVudCA9IChEZXNjcmliYWJsZUVsZW1lbnQpIG5ld09iamVjdDsKLQkJCW5hbWUgPSBQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50KTsKLQkJfQotCi0JCS8vIGlmIGl0J3MgYmxhbmsgdGhlbiB1c2UgbmFtZQotCQlpZiAoU3RyVXRpbC5pc0JsYW5rKG5hbWUpKSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgbmV3T2JqZWN0OwotCQkJbmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJdGhpcy5uYW1lID0gbmFtZTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNiYXNpY1NldE9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJhc2ljU2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQkJc3VwZXIuYmFzaWNTZXRPYmplY3QobmV3T2JqZWN0KTsKLQotCQlpZiAobmV3T2JqZWN0IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50Ci0JCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCS5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZygoQnJlYWtkb3duRWxlbWVudCkgbmV3T2JqZWN0KSkgewotCQkJLy8gbGlzdGVuIHRvIGNoYW5nZSBpbiB0aGUgYmFzZQotCQkJLy8KLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gKChWYXJpYWJpbGl0eUVsZW1lbnQpIG5ld09iamVjdCkKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQlpZiAoYmFzZUxpc3RlbmVyID09IG51bGwpIHsKLQkJCQkJYmFzZUxpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQkJCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcykpIHsKLQkJCQkJCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkJCQkJCURlc2NyaWJhYmxlRWxlbWVudCBlID0gKERlc2NyaWJhYmxlRWxlbWVudCkgZ2V0T2JqZWN0KCk7Ci0JCQkJCQkJCWlmIChTdHJVdGlsLmlzQmxhbmsoZS5nZXRQcmVzZW50YXRpb25OYW1lKCkpKSB7Ci0JCQkJCQkJCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCQkJCQkJCQluYW1lID0gbXNnLmdldE5ld1N0cmluZ1ZhbHVlKCk7Ci0JCQkJCQkJCQlpZiAoIW5hbWUuZXF1YWxzKG9sZE5hbWUpKSB7Ci0JCQkJCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLQkJCQkJCQkJCQkJTmFtZWROb2RlSW1wbC50aGlzLCAtMSwKLQkJCQkJCQkJCQkJTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX05BTUUsCi0JCQkJCQkJCQkJCW9sZE5hbWUsIG5hbWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJfQotCQkJCWJhc2UuZUFkYXB0ZXJzKCkuYWRkKGJhc2VMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjZGlzcG9zZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgZ2V0T2JqZWN0KCk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJaWYgKGJhc2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJb2JqLmVBZGFwdGVycygpLnJlbW92ZShiYXNlTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNjcmVhdGVOb2RlQWRhcHRlcigpCi0JICovCi0JcHJvdGVjdGVkIEFkYXB0ZXIgY3JlYXRlTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTm9kZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCQkJCXJldHVybjsKLQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE5hbWVkTm9kZS5jbGFzcykpIHsKLQkJCQkJY2FzZSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTkFNRToKLQkJCQkJCWlmIChtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVAotCQkJCQkJCQkmJiBnZXRPYmplY3QoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCQlTdHJpbmcgbmV3TmFtZSA9IG1zZy5nZXROZXdTdHJpbmdWYWx1ZSgpOwotCQkJCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9ICgoQnJlYWtkb3duRWxlbWVudCkgZ2V0T2JqZWN0KCkpOwotCQkJCQkJCWUuc2V0UHJlc2VudGF0aW9uTmFtZShuZXdOYW1lKTsKLQkJCQkJCQlpZiAoU3RyVXRpbC5pc0JsYW5rKGUuZ2V0TmFtZSgpKSkgewotCQkJCQkJCQllLnNldE5hbWUobmV3TmFtZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQkJCQl9Ci0KLQkJCX0KLQkJfTsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpIHsKLQkJcmV0dXJuIG5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChib29sZWFuIG5vdGlmaWNhdGlvbkVuYWJsZWQpIHsKLQkJdGhpcy5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZpY2F0aW9uRW5hYmxlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHByZXNzZWQoKSB7Ci0JCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gZ2V0RGlhZ3JhbSgpLmdldFN1cHByZXNzaW9uKCk7Ci0JCWlmIChzdXBwcmVzc2lvbiAhPSBudWxsKSB7Ci0JCQlPYmplY3QgbyA9IGl0ZW1Qcm92aWRlciAhPSBudWxsID8gaXRlbVByb3ZpZGVyIDogZ2V0TGlua2VkRWxlbWVudCgpOwotCQkJcmV0dXJuIGdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZChvKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBPYmplY3QgZ2V0V3JhcHBlcigpIHsKLQkJcmV0dXJuIGl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpdGVtIHByb3ZpZGVyIGZvciB0aGUgdGhpcyBub2RlIGlmIHRoZXJlIGlzIGEgcmVhZC1vbmx5IHdyYXBwZXIKLQkgKiBmb3IgdGhlIG5vZGUgaW4gdGhlIGdpdmVuIGVsZW1lbnQgY29sbGVjdGlvbgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGFsbEVsZW1lbnRzCi0JICovCi0Jdm9pZCBzZXRJdGVtUHJvdmlkZXIoQ29sbGVjdGlvbiBhbGxFbGVtZW50cykgewotCQlPYmplY3Qgb2JqZWN0ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kRWxlbWVudChhbGxFbGVtZW50cywKLQkJCQlnZXRPYmplY3QoKSk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0OwotCQkJaWYgKHdyYXBwZXIuaXNSZWFkT25seSgpKSB7Ci0JCQkJaXRlbVByb3ZpZGVyID0gd3JhcHBlcjsKLQkJCQlyZWFkT25seSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXJJbXBsIGJhc2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEl0ZW0gcHJvdmlkZXIgb2YgdGhlIGxpbmtlZCBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyOwotCi19IC8vIE5hbWVkTm9kZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTm9kZUNvbnRhaW5lckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTm9kZUNvbnRhaW5lckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzMwOTM3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL05vZGVDb250YWluZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5vZGUgQ29udGFpbmVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVDb250YWluZXJJbXBsI2dldE5vZGVzIDxlbT5Ob2RlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5vZGVDb250YWluZXJJbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cwotCQlOb2RlQ29udGFpbmVyIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb2RlcygpIDxlbT5Ob2RlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm9kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBub2RlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVDb250YWluZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX0NPTlRBSU5FUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE5vZGVzKCkgewotCQlpZiAobm9kZXMgPT0gbnVsbCkgewotCQkJbm9kZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTm9kZS5jbGFzcywgdGhpcywgTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19OT0RFUyk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19OT0RFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE5vZGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX05PREVTOgotCQkJCXJldHVybiBnZXROb2RlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fTk9ERVM6Ci0JCQkJZ2V0Tm9kZXMoKS5jbGVhcigpOwotCQkJCWdldE5vZGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX05PREVTOgotCQkJCWdldE5vZGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19OT0RFUzoKLQkJCQlyZXR1cm4gbm9kZXMgIT0gbnVsbCAmJiAhbm9kZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjc2V0UmVhZE9ubHkoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIG5ld1JlYWRPbmx5KSB7Ci0JCXN1cGVyLnNldFJlYWRPbmx5KG5ld1JlYWRPbmx5KTsKLQkJaWYgKG5ld1JlYWRPbmx5KSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU5vZGUgY2hpbGQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJY2hpbGQuc2V0UmVhZE9ubHkobmV3UmVhZE9ubHkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlbW92ZWROb2RlcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hCYWNrVG9EaWFncmFtKENvbGxlY3Rpb24gcmVtb3ZlZE5vZGVzKSB7Ci0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgZGlhZ3JhbSA9IChBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKSBnZXREaWFncmFtKCk7Ci0JCUNvbGxlY3Rpb24gYnJlYWtkb3duRWxlbWVudHMgPSBkaWFncmFtLmdldEFsbEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlbW92ZWROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmICghYnJlYWtkb3duRWxlbWVudHMuY29udGFpbnMobm9kZS5nZXRPYmplY3QoKSkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCS8vIHsKLQkJLy8gT2JqZWN0IG5vZGUgPSBpdGVyLm5leHQoKTsKLQkJLy8gaWYobm9kZSBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlKXsKLQkJLy8gTGlzdCBsaXN0ID0gKChSb2xlVGFza0NvbXBvc2l0ZSlub2RlKS5nZXROb2RlcygpOwotCQkvLyBib29sZWFuIGRlc3Ryb3kgPSB0cnVlOwotCQkvLyBmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkvLyBPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkvLyBpZihvYmogaW5zdGFuY2VvZiBUYXNrTm9kZSkgZGVzdHJveSA9IGZhbHNlOwotCQkvLyB9Ci0JCS8vIGlmKGRlc3Ryb3kpIGl0ZXIucmVtb3ZlKCk7Ci0JCS8vIH0KLQkJLy8gfQotCQlpZiAoIXJlbW92ZWROb2Rlcy5pc0VtcHR5KCkpIHsKLQkJCWRpYWdyYW0uZ2V0Tm9kZXMoKS5hZGRBbGwocmVtb3ZlZE5vZGVzKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3ROb2RlcyhDb2xsZWN0aW9uIG5vZGVzKSB7Ci0JCWlmICghbm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlOb2RlSW1wbCBub2RlID0gKE5vZGVJbXBsKSBpdGVyLm5leHQoKTsKLQkJCQlub2RlLnZpc2libGUgPSB0cnVlOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlOb2RlSW1wbCBub2RlID0gKE5vZGVJbXBsKSBpdGVyLm5leHQoKTsKLQkJCQlpZighbm9kZXMuY29udGFpbnMobm9kZSkpIHsKLQkJCQkJbm9kZS52aXNpYmxlID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJZ2V0Tm9kZXMoKS5hZGRBbGwobm9kZXMpOwotCQl9Ci0JCWVsc2UgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlOb2RlSW1wbCBub2RlID0gKE5vZGVJbXBsKSBpdGVyLm5leHQoKTsKLQkJCQlub2RlLnZpc2libGUgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQkKLX0gLy8gTm9kZUNvbnRhaW5lckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTm9kZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzJlMzc0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL05vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uaW1wbC5JbnRlcm5hbFRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLkludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5hbWVkTm9kZUltcGwuTWV0aG9kRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JTm9kZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5vZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2dldFdpZHRoIDxlbT5XaWR0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNnZXRIZWlnaHQgPGVtPkhlaWdodDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNnZXRJbmNvbWluZ0Nvbm5lY3Rpb25zIDxlbT5JbmNvbWluZyBDb25uZWN0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zIDxlbT5PdXRnb2luZyBDb25uZWN0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNpc1JlYWRPbmx5IDxlbT5SZWFkIE9ubHk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb2RlSW1wbCBleHRlbmRzIExpbmtlZE9iamVjdEltcGwgaW1wbGVtZW50cyBOb2RlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYXRpb24oKSA8ZW0+TG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQb2ludCBMT0NBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvbigpIDxlbT5Mb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgbG9jYXRpb24gPSBMT0NBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXaWR0aCgpIDxlbT5XaWR0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdpZHRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBXSURUSF9FREVGQVVMVCA9IC0xOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2lkdGgoKSA8ZW0+V2lkdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXaWR0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCB3aWR0aCA9IFdJRFRIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhlaWdodCgpIDxlbT5IZWlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIZWlnaHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEhFSUdIVF9FREVGQVVMVCA9IC0xOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGVpZ2h0KCkgPGVtPkhlaWdodDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhlaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCBoZWlnaHQgPSBIRUlHSFRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkgPGVtPkluY29taW5nIENvbm5lY3Rpb25zPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5jb21pbmdDb25uZWN0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkgPGVtPk91dGdvaW5nIENvbm5lY3Rpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgb3V0Z29pbmdDb25uZWN0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZWFkT25seSgpIDxlbT5SZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlYWRPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVBRF9PTkxZX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlYWRPbmx5KCkgPGVtPlJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlYWRPbmx5ID0gUkVBRF9PTkxZX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFBvaW50IG5ld0xvY2F0aW9uKSB7Ci0JCVBvaW50IG9sZExvY2F0aW9uID0gbG9jYXRpb247Ci0JCWxvY2F0aW9uID0gbmV3TG9jYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5OT0RFX19MT0NBVElPTiwgb2xkTG9jYXRpb24sIGxvY2F0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7Ci0JCXJldHVybiB3aWR0aDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2lkdGgoaW50IG5ld1dpZHRoKSB7Ci0JCWludCBvbGRXaWR0aCA9IHdpZHRoOwotCQl3aWR0aCA9IG5ld1dpZHRoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuTk9ERV9fV0lEVEgsIG9sZFdpZHRoLCB3aWR0aCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEhlaWdodCgpIHsKLQkJcmV0dXJuIGhlaWdodDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCBuZXdIZWlnaHQpIHsKLQkJaW50IG9sZEhlaWdodCA9IGhlaWdodDsKLQkJaGVpZ2h0ID0gbmV3SGVpZ2h0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuTk9ERV9fSEVJR0hULCBvbGRIZWlnaHQsIGhlaWdodCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpIHsKLQkJaWYgKGluY29taW5nQ29ubmVjdGlvbnMgPT0gbnVsbCkgewotCQkJaW5jb21pbmdDb25uZWN0aW9ucyA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdChMaW5rLmNsYXNzLCB0aGlzLCBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlMsIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVQpOwotCQl9Ci0JCXJldHVybiBpbmNvbWluZ0Nvbm5lY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpIHsKLQkJaWYgKG91dGdvaW5nQ29ubmVjdGlvbnMgPT0gbnVsbCkgewotCQkJb3V0Z29pbmdDb25uZWN0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KExpbmsuY2xhc3MsIHRoaXMsIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUywgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRSk7Ci0JCX0KLQkJcmV0dXJuIG91dGdvaW5nQ29ubmVjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiByZWFkT25seTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxvY2F0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsb2NhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd2lkdGg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdpZHRoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoZWlnaHQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGhlaWdodCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVhZE9ubHk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlYWRPbmx5KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBpbmNvbWluZyBjb25uZWN0aW9uCi0JICogCi0JICogQHBhcmFtIGxpbmsKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkVG9VTUEoTGluayBsaW5rKSB7Ci0JCWlmIChsaW5rLmdldFRhcmdldCgpID09IG51bGwgfHwgbGluay5nZXRTb3VyY2UoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQlHcmFwaGljYWxEYXRhSGVscGVyLmFkZEdyYXBoaWNhbERhdGEobGluayk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBvdXRnb2luZyBjb25uZWN0aW9uCi0JICogCi0JICogQHBhcmFtIGxpbmsKLQkgKiBAcGFyYW0gb2xkU291cmNlCi0JICogQHBhcmFtIG9sZFRhcmdldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21VTUEoTGluayBsaW5rLCBOb2RlIG9sZFNvdXJjZSwgTm9kZSBvbGRUYXJnZXQpIHsKLQkJLy8gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVHcmFwaENvbm5lY3RvclBhaXIob2xkU291cmNlLmdldEdyYXBoTm9kZSgpLAotCQkvLyBvbGRUYXJnZXQuZ2V0R3JhcGhOb2RlKCkpOwotCQkKLQkJR3JhcGhpY2FsRGF0YUhlbHBlci5yZW1vdmVHcmFwaGljYWxEYXRhKGxpbmspOwotCX0KLQotCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gZ2V0VU1BRGlhZ3JhbSgpIHsKLQkJaWYgKGdldERpYWdyYW0oKSA9PSBudWxsKQotCQkJcmV0dXJuIHVtYURpYWdyYW07Ci0JCXJldHVybiBnZXREaWFncmFtKCkuZ2V0VU1BRGlhZ3JhbSgpOwotCX0KLQotCXByb3RlY3RlZCBHcmFwaE5vZGUgZ2V0VU1BQ29udGFpbmVyKCkgewotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBlQ29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkKLQkJCXJldHVybiB1bWFDb250YWluZXI7Ci0JCXJldHVybiBjb250YWluZXIuZ2V0R3JhcGhOb2RlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI3NldFVNQUNvbnRhaW5lcihvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVTUFDb250YWluZXIoR3JhcGhOb2RlIHVtYUNvbnRhaW5lcikgewotCQl0aGlzLnVtYUNvbnRhaW5lciA9IHVtYUNvbnRhaW5lcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5Tm9kZSNzZXRVTUFEaWFncmFtKG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVTUFEaWFncmFtKG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSB1bWFEaWFncmFtKSB7Ci0JCXRoaXMudW1hRGlhZ3JhbSA9IHVtYURpYWdyYW07Ci0JCXVtYUNvbnRhaW5lciA9IHVtYURpYWdyYW07Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIE5vZGVBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChOb2RlLmNsYXNzKSkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fV0lEVEg6Ci0JCQkJZ2V0R3JhcGhOb2RlKCkuZ2V0U2l6ZSgpLnNldFdpZHRoKAotCQkJCQkJbmV3IERvdWJsZShtc2cuZ2V0TmV3SW50VmFsdWUoKSkpOwotCQkJCXJldHVybjsKLQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSEVJR0hUOgotCQkJCWlmIChnZXRHcmFwaE5vZGUoKSAhPSBudWxsKSB7Ci0JCQkJCWdldEdyYXBoTm9kZSgpLmdldFNpemUoKS5zZXRIZWlnaHQoCi0JCQkJCQkJbmV3IERvdWJsZShtc2cuZ2V0TmV3SW50VmFsdWUoKSkpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0xPQ0FUSU9OOgotCQkJCWlmIChnZXRHcmFwaE5vZGUoKSAhPSBudWxsICYmIG1zZy5nZXROZXdWYWx1ZSgpICE9IG51bGwpIHsKLQkJCQkJUG9pbnQgcCA9IChQb2ludCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWdldEdyYXBoTm9kZSgpLmdldFBvc2l0aW9uKCkuc2V0WChuZXcgRG91YmxlKHAueCkpOwotCQkJCQlnZXRHcmFwaE5vZGUoKS5nZXRQb3NpdGlvbigpLnNldFkobmV3IERvdWJsZShwLnkpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCi0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzoKLQkJCQlMaW5rIGxpbms7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCWxpbmsgPSAoTGluaykgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWFkZFRvVU1BKGxpbmspOwotCQkJCQlyZXR1cm47Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJYWRkVG9VTUEoKExpbmspIGl0ZXIubmV4dCgpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCWxpbmsgPSAoTGluaykgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWlmIChsaW5rLmdldFNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJCSgoTm9kZUltcGwpIGxpbmsuZ2V0U291cmNlKCkpLnJlbW92ZUZyb21VTUEobGluaywgbGluawotCQkJCQkJCQkuZ2V0U291cmNlKCksIChOb2RlKSBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChsaW5rLmdldFNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJCQkoKE5vZGVJbXBsKSBsaW5rLmdldFNvdXJjZSgpKS5yZW1vdmVGcm9tVU1BKGxpbmssCi0JCQkJCQkJCQlsaW5rLmdldFNvdXJjZSgpLCAoTm9kZSkgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJbGluayA9IChMaW5rKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkJCQkJKChOb2RlSW1wbCkgbGluay5nZXRUYXJnZXQoKSkuYWRkVG9VTUEobGluayk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChsaW5rLmdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJCQkJCQkoKE5vZGVJbXBsKSBsaW5rLmdldFRhcmdldCgpKS5hZGRUb1VNQShsaW5rKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCWxpbmsgPSAoTGluaykgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWlmIChsaW5rLmdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJCQkJCXJlbW92ZUZyb21VTUEobGluaywgKE5vZGUpIG1zZy5nZXROb3RpZmllcigpLCBsaW5rCi0JCQkJCQkJCS5nZXRUYXJnZXQoKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChsaW5rLmdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJCQkJCQlyZW1vdmVGcm9tVU1BKGxpbmssIChOb2RlKSBtc2cuZ2V0Tm90aWZpZXIoKSwgbGluawotCQkJCQkJCQkJLmdldFRhcmdldCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCi0JCQl9Ci0JCX0KLQotCX0KLQkKLQkvKioKLQkgKiBMb2FkcyBncmFwaG5vZGUgZGF0YSBhbmQgYXNzb2NpYXRlcyB0aGUgYWRhcHRlcnMuCi0JICogQHBhcmFtIG5ld09iamVjdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJhc2ljU2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQkJaWYgKG5ld09iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRoaXMub2JqZWN0ID0gbmV3T2JqZWN0OwotCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgbmV3T2JqZWN0OwotCQkKLQkJZ3JhcGhOb2RlID0gZ2V0R3JhcGhOb2RlKGVsZW1lbnQpOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTm9kZUltcGwuc2V0T2JqZWN0KCk6IGVsZW1lbnQ6ICciICsKLQkJLy8gZWxlbWVudC5nZXROYW1lKCkgKyAiJywgZ3JhcGhOb2RlOiAiICsgZ3JhcGhOb2RlKTsKLQotCQlpZihncmFwaE5vZGUgIT0gbnVsbCkgewotCQkJLy8gcG9wdWxhdGUvc3luY2ggZGF0YQotCQkJLy8KLQkJCWlmIChoZWlnaHQgPT0gSEVJR0hUX0VERUZBVUxUKSB7Ci0JCQkJc2V0SGVpZ2h0KGdyYXBoTm9kZS5nZXRTaXplKCkuZ2V0SGVpZ2h0KCkuaW50VmFsdWUoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWdyYXBoTm9kZS5nZXRTaXplKCkuc2V0SGVpZ2h0KG5ldyBEb3VibGUoaGVpZ2h0KSk7Ci0JCQl9Ci0KLQkJCWlmICh3aWR0aCA9PSBXSURUSF9FREVGQVVMVCkgewotCQkJCXNldFdpZHRoKGdyYXBoTm9kZS5nZXRTaXplKCkuZ2V0V2lkdGgoKS5pbnRWYWx1ZSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZ3JhcGhOb2RlLmdldFNpemUoKS5zZXRXaWR0aChuZXcgRG91YmxlKHdpZHRoKSk7Ci0JCQl9Ci0KLQkJCWlmIChsb2NhdGlvbiA9PSBMT0NBVElPTl9FREVGQVVMVCkgewotCQkJCXNldExvY2F0aW9uKEdyYXBoaWNhbERhdGFIZWxwZXIudG9Qb2ludChncmFwaE5vZGUuZ2V0UG9zaXRpb24oKSkpOwotCQkJfSBlbHNlIHsKLQkJCQlncmFwaE5vZGUuZ2V0UG9zaXRpb24oKS5zZXRYKG5ldyBEb3VibGUobG9jYXRpb24ueCkpOwotCQkJCWdyYXBoTm9kZS5nZXRQb3NpdGlvbigpLnNldFkobmV3IERvdWJsZShsb2NhdGlvbi55KSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgbWV0aG9kRWxlbWVudEFkYXB0ZXIKLQkJLy8KLQkJZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXIoKTsKLQkJaWYgKG1ldGhvZEVsZW1lbnRBZGFwdGVyICE9IG51bGwpIHsKLQkJCWVsZW1lbnQuZUFkYXB0ZXJzKCkuYWRkKG1ldGhvZEVsZW1lbnRBZGFwdGVyKTsKLQkJfQotCi0JCXRoaXMuZUFkYXB0ZXJzKCkuYWRkKGNyZWF0ZU5vZGVBZGFwdGVyKCkpOwotCQkJCQotCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCWlmKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlzZXRMaW5rZWRFbGVtZW50KChNZXRob2RFbGVtZW50KSBlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgVHJhbnNhY3Rpb25hbE5vZGVMaW5rIGV4dGVuZHMgQWRhcHRlckltcGwgCi0JaW1wbGVtZW50cyBJTm9kZUNoYW5nZUxpc3RlbmVyCi0JewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmICghbm90aWZpY2F0aW9uRW5hYmxlZCkKLQkJCQlyZXR1cm47Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCUludGVybmFsVHJhbnNhY3Rpb24gdHggPSBudWxsOwotCQkJCUludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluID0gKEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4pIFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGdldE5vZGUoKSk7Ci0JCQkJaWYoZG9tYWluICE9IG51bGwpIHsKLQkJCQkJdHggPSBkb21haW4uc3RhcnRUcmFuc2FjdGlvbihmYWxzZSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaGFuZGxlTm90aWZpY2F0aW9uKG1zZyk7Ci0JCQkJCi0JCQkJaWYodHggIT0gbnVsbCkgewotCQkJCQl0eC5jb21taXQoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpOwotCi0JCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gTm9kZUltcGwudGhpczsKLQkJfQotCX0KLQotCQotCS8qKgotCSAqIFN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIE1ldGhvZEVsZW1lbnRBZGFwdGVyIHRoYXQgd2lsbCBzeW5jaHJvbml6ZQotCSAqIHRoZSBjaGFuZ2UgZnJvbSBtZXRob2QgZWxlbWVudCB0byB0aGUgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRob2QgZWxlbWVudCBhZGFwdGVyIG9mIHRoaXMgbm9kZQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50QWRhcHRlcjsKLQl9Ci0KLQlwdWJsaWMgR3JhcGhOb2RlIGdldEdyYXBoTm9kZShNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQpewotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQlyZXR1cm4gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRHcmFwaE5vZGUoCi0JCQkJCWdldFVNQURpYWdyYW0oKSwgbWV0aG9kRWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtlZE9iamVjdEltcGwjc2V0T2JqZWN0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQkJc3VwZXIuc2V0T2JqZWN0KG5ld09iamVjdCk7Ci0JCQotCQkvL1RPRE86ID8/PyB3aHkgdGFzayBkZXNjcmlwdG9yIGlzIGV4Y2x1ZGVkIGlmIHRoZSBkaWFncmFtIGlzIGFuIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtCi0JCS8vCi0vLwkJaWYgKCEoKG5ld09iamVjdCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSAmJiBnZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pKQotCQkJYmFzaWNTZXRPYmplY3QobmV3T2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEFkYXB0ZXIgY3JlYXRlTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTm9kZUFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgR3JhcGhOb2RlIGdldEdyYXBoTm9kZSgpIHsKLQkJcmV0dXJuIGdyYXBoTm9kZTsKLQl9Ci0KLQkvLyBUT0RPOiBmb3JjZSBzdWJjbGFzcyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQlwdWJsaWMgQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkgewotCQlyZXR1cm4gSU5vZGVDaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0RGlhZ3JhbSgpCi0JICovCi0JcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJRU9iamVjdCBwYXJlbnQgPSBlQ29udGFpbmVyOwotCQlmb3IgKDsgcGFyZW50ICE9IG51bGwgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBEaWFncmFtKTsgcGFyZW50ID0gcGFyZW50Ci0JCQkJLmVDb250YWluZXIoKSkKLQkJCTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCXJldHVybiAoRGlhZ3JhbSkgcGFyZW50OwotCQl9Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNzZXREaWFncmFtKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlhZ3JhbShEaWFncmFtIGRpYWdyYW0pIHsKLQkJdGhpcy5kaWFncmFtID0gZGlhZ3JhbTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjYWRkQ29uc3VtZXIoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb25zdW1lcihPYmplY3QgY29uc3VtZXIpIHsKLQkJaWYgKCFjb25zdW1lcnMuY29udGFpbnMoY29uc3VtZXIpKSB7Ci0JCQljb25zdW1lcnMuYWRkKGNvbnN1bWVyKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNyZW1vdmVDb25zdW1lcihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnN1bWVyKE9iamVjdCBjb25zdW1lcikgewotCQljb25zdW1lcnMucmVtb3ZlKGNvbnN1bWVyKTsKLQkJaWYgKGNvbnN1bWVycy5pc0VtcHR5KCkpIHsKLQkJCS8vIG5vIG1vcmUgY29uc3VtZXIgb2YgdGhpcyBub2RlLCBpdCBzaG91bGQgYmUgZGlzcG9zZWQKLQkJCWRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpIGdldE9iamVjdCgpOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCWlmIChtZXRob2RFbGVtZW50QWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJb2JqLmVBZGFwdGVycygpLnJlbW92ZShtZXRob2RFbGVtZW50QWRhcHRlcik7Ci0JCQl9Ci0JCX0KLQotCQllQWRhcHRlcnMoKS5jbGVhcigpOwotCi0JCXVtYUNvbnRhaW5lciA9IG51bGw7Ci0JCXVtYURpYWdyYW0gPSBudWxsOwotCQlncmFwaE5vZGUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIG5ld1JlYWRPbmx5KSB7Ci0JCWJvb2xlYW4gb2xkUmVhZE9ubHkgPSByZWFkT25seTsKLQkJcmVhZE9ubHkgPSBuZXdSZWFkT25seTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLk5PREVfX1JFQURfT05MWSwgb2xkUmVhZE9ubHksIHJlYWRPbmx5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE91dGdvaW5nQ29ubmVjdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19MT0NBVElPTjoKLQkJCQlyZXR1cm4gZ2V0TG9jYXRpb24oKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1dJRFRIOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRXaWR0aCgpKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0hFSUdIVDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0SGVpZ2h0KCkpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM6Ci0JCQkJcmV0dXJuIGdldEluY29taW5nQ29ubmVjdGlvbnMoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOgotCQkJCXJldHVybiBnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19SRUFEX09OTFk6Ci0JCQkJcmV0dXJuIGlzUmVhZE9ubHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0xPQ0FUSU9OOgotCQkJCXNldExvY2F0aW9uKChQb2ludCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fV0lEVEg6Ci0JCQkJc2V0V2lkdGgoKChJbnRlZ2VyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19IRUlHSFQ6Ci0JCQkJc2V0SGVpZ2h0KCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM6Ci0JCQkJZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlM6Ci0JCQkJZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fUkVBRF9PTkxZOgotCQkJCXNldFJlYWRPbmx5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19MT0NBVElPTjoKLQkJCQlzZXRMb2NhdGlvbihMT0NBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fV0lEVEg6Ci0JCQkJc2V0V2lkdGgoV0lEVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0hFSUdIVDoKLQkJCQlzZXRIZWlnaHQoSEVJR0hUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzoKLQkJCQlnZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJCQlnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19SRUFEX09OTFk6Ci0JCQkJc2V0UmVhZE9ubHkoUkVBRF9PTkxZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0xPQ0FUSU9OOgotCQkJCXJldHVybiBMT0NBVElPTl9FREVGQVVMVCA9PSBudWxsID8gbG9jYXRpb24gIT0gbnVsbCA6ICFMT0NBVElPTl9FREVGQVVMVC5lcXVhbHMobG9jYXRpb24pOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fV0lEVEg6Ci0JCQkJcmV0dXJuIHdpZHRoICE9IFdJRFRIX0VERUZBVUxUOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSEVJR0hUOgotCQkJCXJldHVybiBoZWlnaHQgIT0gSEVJR0hUX0VERUZBVUxUOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM6Ci0JCQkJcmV0dXJuIGluY29taW5nQ29ubmVjdGlvbnMgIT0gbnVsbCAmJiAhaW5jb21pbmdDb25uZWN0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJCQlyZXR1cm4gb3V0Z29pbmdDb25uZWN0aW9ucyAhPSBudWxsICYmICFvdXRnb2luZ0Nvbm5lY3Rpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1JFQURfT05MWToKLQkJCQlyZXR1cm4gcmVhZE9ubHkgIT0gUkVBRF9PTkxZX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gY29uc3VtZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBHcmFwaE5vZGUgdW1hQ29udGFpbmVyOwotCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gdW1hRGlhZ3JhbTsKLQotCXByaXZhdGUgRGlhZ3JhbSBkaWFncmFtOwotCi0JcHJvdGVjdGVkIEdyYXBoTm9kZSBncmFwaE5vZGU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBJTm9kZUNoYW5nZUxpc3RlbmVyIG1ldGhvZEVsZW1lbnRBZGFwdGVyOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmlzaWJsZTsKLQkKLQkvKioKLQkgKiBhZGREZWZhdWx0V29ya09yZGVyIGlzIG1vdmVkIGZyb20KLQkgKiBHcmFwaGljYWxEYXRhSGVscGVyLmFkZERlZmF1bHRXb3JrT3JkZXIoTmFtZWROb2RlSW1wbCwKLQkgKiBXb3JrYnJlYWtkb3duRWxlbWVudCkgTWV0aG9kIHdpbGwgc2V0IG5vdGlmaWNhdGlvbkVuYWJsZWQgZmxhZyB0byBmYWxzZQotCSAqIG9mIGFsbCBhZGFwdGVycyBvZiB0eXBlIE1ldGhvZEVsZW1lbnRBZGFwdGVyIG9mIFN1Y2Nlc3NvciBvYmplY3QgYmVmb3JlCi0JICogY3JlYXRpbmcgYSBXb3JrT3JkZXIgb2JqZWN0LiBBZnRlciBjcmVhdGlvbiBvZiBXb3JrT3JkZXIgKFByZWRlY2Vzc29yCi0JICogbGluaykgcmVzdG9yZXMgdGhlIG5vdGlmaWNhdGlvbkVuYWJsZWQgZmxhZyBvZiBTdWNjZXNzb3IncyBhZGFwdGVycyBvZgotCSAqIHR5cGUgTWV0aG9kRWxlbWVudEFkYXB0ZXIuCi0JICogCi0JICogZWc6IElmIGFuIEFjdGl2aXR5ICJhY3RBIiBpcyBleHRlbmRlZCBpbiBhbm90aGVyIENQLiBCYXNlICJhY3RBIiBBRAotCSAqIGRpYWdyYW0gaXMgb3BlbmVkLCBhbmQgRXh0ZW5kZWQgImFjdEEiIEFEIERpYWdyYW0gaXMgb3BlbmVkLiBPbiBjcmVhdGluZwotCSAqIHByZWRlY2Vzc29yIGxpbmsgYmV0d2VlbiBhbnkgdHdvIGNoaWxkIGFjdGl2aXRpZXMsIGNyZWF0ZXMgYSBleHRyYSBsaW5rCi0JICogaW4gRXh0ZW5kZWQgImFjdEEiIEFEIGRpYWdyYW0sIGJlY2F1c2UgY3JlYXRpbmcgd29ya29yZGVyIHdpbGwgbm90aWZ5IHRoZQotCSAqIGV4dGVuZGVkICJhY3RBIiBkaWFncmFtIHRvIGRyYXcgYSBsaW5rLiBUbyBhdm9pZCBkdXBsaWNhdGUgbGlua3MgaW4gdGhlCi0JICogZXh0ZW5kZWQgYWN0aXZpdHkgZGlhZ3JhbSwgd2UgaGF2ZSB0byBzZXQgbm90aWZpY2F0aW9uRW5hYmxlZCBmbGFnIHRvCi0JICogZmFsc2UsIGJlZm9yZSBjcmVhdGluZyBhIFdvcmtPcmRlciBvYmplY3QuCi0JICogCi0JICovCi0JcHVibGljIFdvcmtPcmRlciBhZGREZWZhdWx0V29ya09yZGVyKE5hbWVkTm9kZUltcGwgbm9kZSwKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWRCcmVha2Rvd25FbGVtZW50KSB7Ci0JCWJvb2xlYW4gbm90aWZ5ID0gbm9kZS5pc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3QgbGlzdCA9ICgoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUuZ2V0T2JqZWN0KCkpLmVBZGFwdGVycygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRBZGFwdGVyKSB7Ci0JCQkJTm9kZUltcGwgbm9kZW9iaiA9IChOb2RlSW1wbCkgKChNZXRob2RFbGVtZW50QWRhcHRlcikgb2JqKQotCQkJCQkJLmdldE5vZGUoKTsKLQkJCQlib29sZWFuIHByZWROb3RpZmljYXRpb24gPSBub2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJKChOb2RlSW1wbCkgKCgoTWV0aG9kRWxlbWVudEFkYXB0ZXIpIG9iaikuZ2V0Tm9kZSgpKSkubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCW1hcC5wdXQobm9kZW9iaiwgbmV3IEJvb2xlYW4ocHJlZE5vdGlmaWNhdGlvbikpOwotCQkJfQotCQl9Ci0JCXRyeSB7Ci0JCQlub2RlLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJcmV0dXJuIFVtYVV0aWwuY3JlYXRlRGVmYXVsdFdvcmtPcmRlcigoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUKLQkJCQkJLmdldE9iamVjdCgpLCBwcmVkQnJlYWtkb3duRWxlbWVudCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlub2RlLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZ5KTsKLQkJCVNldCBzZXQgPSBtYXAua2V5U2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBvYmogPSBtYXAuZ2V0KG9iamVjdCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLQkJCQkJYm9vbGVhbiBwcmVkbm90ID0gKChCb29sZWFuKSBvYmopLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQkoKE5vZGVJbXBsKSBvYmplY3QpLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBwcmVkbm90OwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpIHsKLQkJRGlhZ3JhbUltcGwgZGlhZ3JhbSA9IChEaWFncmFtSW1wbCkgZ2V0RGlhZ3JhbSgpOwotCQlyZXR1cm4gZGlhZ3JhbS5pc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0JCXJldHVybiB2aXNpYmxlIDsKLQl9Ci0KLX0gLy8gTm9kZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvUm9sZU5vZGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1JvbGVOb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOGYxZGNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvUm9sZU5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBOb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZU5vZGVJbXBsIGV4dGVuZHMgTmFtZWROb2RlSW1wbCBpbXBsZW1lbnRzIFJvbGVOb2RlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZU5vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCW1ldGhvZEVsZW1lbnRBZGFwdGVyID0gbmV3IFJvbGVEZXNjcmlwdG9yQWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5ST0xFX05PREU7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBSb2xlRGVzY3JpcHRvckFkYXB0ZXIgZXh0ZW5kcyBNZXRob2RFbGVtZW50QWRhcHRlciB7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkgewotCQlyZXR1cm4gUm9sZURlc2NyaXB0b3JBZGFwdGVyLmNsYXNzOwotCX0KLX0gLy8gUm9sZU5vZGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1JvbGVUYXNrQ29tcG9zaXRlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Sb2xlVGFza0NvbXBvc2l0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTVmYzRjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1JvbGVUYXNrQ29tcG9zaXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIFRhc2sgQ29tcG9zaXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlJvbGVUYXNrQ29tcG9zaXRlSW1wbCNnZXRSb3dJbmRleCA8ZW0+Um93IEluZGV4PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVJbXBsIGV4dGVuZHMgTm9kZUNvbnRhaW5lckltcGwgaW1wbGVtZW50cwotCQlSb2xlVGFza0NvbXBvc2l0ZSB7Ci0JCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvd0luZGV4KCkgPGVtPlJvdyBJbmRleDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um93SW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFJPV19JTkRFWF9FREVGQVVMVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb3dJbmRleCgpIDxlbT5Sb3cgSW5kZXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvd0luZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHJvd0luZGV4ID0gUk9XX0lOREVYX0VERUZBVUxUOwotCi0vLwlwcml2YXRlIGludCByb3dJbmRleDsKLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZVRhc2tDb21wb3NpdGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCW1ldGhvZEVsZW1lbnRBZGFwdGVyID0gbmV3IFJvbGVEZXNjcmlwdG9yQWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5ST0xFX1RBU0tfQ09NUE9TSVRFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Um93SW5kZXgoKSB7Ci0JCXJldHVybiByb3dJbmRleDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb3dJbmRleChpbnQgbmV3Um93SW5kZXgpIHsKLQkJaW50IG9sZFJvd0luZGV4ID0gcm93SW5kZXg7Ci0JCXJvd0luZGV4ID0gbmV3Um93SW5kZXg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5ST0xFX1RBU0tfQ09NUE9TSVRFX19ST1dfSU5ERVgsIG9sZFJvd0luZGV4LCByb3dJbmRleCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlJPTEVfVEFTS19DT01QT1NJVEVfX1JPV19JTkRFWDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0Um93SW5kZXgoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlJPTEVfVEFTS19DT01QT1NJVEVfX1JPV19JTkRFWDoKLQkJCQlzZXRSb3dJbmRleCgoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ST0xFX1RBU0tfQ09NUE9TSVRFX19ST1dfSU5ERVg6Ci0JCQkJc2V0Um93SW5kZXgoUk9XX0lOREVYX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlJPTEVfVEFTS19DT01QT1NJVEVfX1JPV19JTkRFWDoKLQkJCQlyZXR1cm4gcm93SW5kZXggIT0gUk9XX0lOREVYX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocm93SW5kZXg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJvd0luZGV4KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhDb2xsZWN0aW9uIG1peGVkQ29sbGVjdGlvbiwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbWl4ZWRDb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJaWYoIGVsZW1lbnQgPT0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpICkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQkJCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjc2V0T2JqZWN0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQkJc3VwZXIuc2V0T2JqZWN0KG5ld09iamVjdCk7Ci0JCXBvcHVsYXRlTm9kZXMobmV3T2JqZWN0KTsKLS8vCQlpZiAobmV3T2JqZWN0IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLS8vCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IgPSAoUm9sZURlc2NyaXB0b3IpIG5ld09iamVjdDsKLS8vCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCBkaWFncmFtID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKTsKLS8vCQkJQ29sbGVjdGlvbiBhbGxFbGVtZW50cyA9IGRpYWdyYW0uZ2V0QWxsQnJlYWtkb3duRWxlbWVudHMoKTsKLS8vCQkJTGlzdCBwcmltYXJ5VGFza0Rlc2NyaXB0b3JzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UHJpbWFyeVRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzY3JpcHRvcik7Ci0vLwkJCWlmICghcHJpbWFyeVRhc2tEZXNjcmlwdG9ycy5pc0VtcHR5KCkpIHsgLy8gb3ZlcnJpZGluZwotLy8JCQkJCQkJCQkJCQkJCQkJCQotLy8JCQkJLy8gdXNlIGxpc3QgdG8gbWFpbnRhaW4gb3JkZXIgb2YKLS8vCQkJCS8vIHRhc2tkZXNjcmlwdG9ycy4KLS8vCQkJCUxpc3QgdGFza0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQkJdGFza0Rlc2NyaXB0b3JzLmFkZEFsbChwcmltYXJ5VGFza0Rlc2NyaXB0b3JzKTsKLS8vCQkJCS8vIHRhc2tEZXNjcmlwdG9ycy5hZGRBbGwocm9sZURlc2NyaXB0b3IuZ2V0UGVyZm9ybXNBZGRpdGlvbmFsbHkoKSk7Ci0vLwkJCQkvLyB0YXNrRGVzY3JpcHRvcnMuYWRkQWxsKHJvbGVEZXNjcmlwdG9yLmdldEFzc2lzdHNJbigpKTsKLS8vCi0vLwkJCQlIYXNoU2V0IHNlbGVjdGVkRGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldCgpOwotLy8JCQkJTGlzdCB0YXNrTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCQkKLS8vCQkJCVN0cmluZyBhdXRvbGF5b3V0ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRBdXRvTGF5b3V0RmxhZygoQWN0aXZpdHlEZXRhaWxEaWFncmFtKWdldERpYWdyYW0oKSk7IAotLy8JCQkJaWYoYXV0b2xheW91dCAhPSBudWxsKXsKLS8vCQkJCQlpbnQgaW5kZXggPSAwOwotLy8JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0vLwkJCQkJCW9iaiA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0vLwkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcgotLy8JCQkJCQkJCSYmIFRuZ1V0aWwuY29udGFpbnModGFza0Rlc2NyaXB0b3JzLCBvYmopKSB7Ci0vLwkJCQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgb2JqOwotLy8KLS8vCQkJCQkJCS8vIGVsaW1pbmF0ZSBkZXNjcmlwdG9yIHRoYXQgaXMgZHVwbGljYXRlLAotLy8JCQkJCQkJLy8gc3VwcHJlc3NlZCBvciBmaWx0ZXJlZCBvdXQKLS8vCQkJCQkJCS8vCi0vLwkJCQkJCQlpZiAoIXNlbGVjdGVkRGVzY3JpcHRvcnMuY29udGFpbnModGFza0Rlc2NyaXB0b3IpCi0vLwkJCQkJCQkvLyAmJiBjb250YWlucyhhbGxFbGVtZW50cywgdGFza0Rlc2NyaXB0b3IpIC8vIG1ha2UKLS8vCQkJCQkJCS8vIHN1cmUgdGhhdCB0YXNrIGRlc2NyaXB0b3IgaXMgb2YgdGhlIG93bmluZwotLy8JCQkJCQkJLy8gYWN0aXZpdHkKLS8vCQkJCQkJCSkgewotLy8JCQkJCQkJCXNlbGVjdGVkRGVzY3JpcHRvcnMuYWRkKHRhc2tEZXNjcmlwdG9yKTsKLS8vCQkJCQkJCQlOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKAotLy8JCQkJCQkJCQkJdGhpcywgdGFza0Rlc2NyaXB0b3IsCi0vLwkJCQkJCQkJCQlUYXNrTm9kZS5jbGFzcyk7Ci0vLwkJCQkJCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotLy8JCQkJCQkJCQlub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotLy8JCQkJCQkJCQkJCS5jcmVhdGVUYXNrTm9kZSgpOwotLy8JCQkJCQkJCQlub2RlLnNldERpYWdyYW0oZ2V0RGlhZ3JhbSgpKTsKLS8vCQkJCQkJCQkJbm9kZS5zZXRPYmplY3QodGFza0Rlc2NyaXB0b3IpOwotLy8JCQkJCQkJCQkoKE5hbWVkTm9kZUltcGwpIG5vZGUpCi0vLwkJCQkJCQkJCQkJLnNldEl0ZW1Qcm92aWRlcihhbGxFbGVtZW50cyk7Ci0vLwkJCQkJCQkJCWlmKEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZFByb3BlcnR5KG5vZGUuZ2V0R3JhcGhOb2RlKCksIAotLy8JCQkJCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWCkgPT0gbnVsbAotLy8JCQkJCQkJCQkJCXx8IEdyYXBoaWNhbERhdGFIZWxwZXIuaXNBdXRvTGF5b3V0KChBY3Rpdml0eURldGFpbERpYWdyYW0pZ2V0RGlhZ3JhbSgpKSl7Ci0vLwkJCQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmNyZWF0ZVByb3BlcnR5KG5vZGUKLS8vCQkJCQkJCQkJCQkuZ2V0R3JhcGhOb2RlKCksCi0vLwkJCQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0lOREVYLAotLy8JCQkJCQkJCQkJCW5ldyBJbnRlZ2VyKGluZGV4KS50b1N0cmluZygpKTsKLS8vCQkJCQkJCQkJCWluZGV4Kys7Ci0vLwkJCQkJCQkJCX0KLS8vCQkJCQkJCQkJCi0vLwkJCQkJCQkJfQotLy8JCQkJCQkJCXRhc2tOb2Rlcy5hZGQobm9kZSk7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQkJLy8gU29ydCB0aGUgdGFza05vZGUgYmFzZWQgb24gdGhlaXIgaW5kZXggaWYgYXV0b2xheW91dCBpcwotLy8JCQkJCS8vIGZhbHNlCi0vLwkJCQkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPX0xBWU9VVF9WQUxVRV9GQUxTRQotLy8JCQkJCQkJLmVxdWFscyhhdXRvbGF5b3V0KSkgewotLy8JCQkJCQlDb2xsZWN0aW9ucy5zb3J0KHRhc2tOb2RlcywgY29tcGFyYXRvcik7Ci0vLwkJCQkJfQotLy8JCQkgIH1lbHNlewotLy8JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhc2tEZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotLy8JCQkJCQkKLS8vCQkJCQkJLy8gZWxpbWluYXRlIGRlc2NyaXB0b3IgdGhhdCBpcyBkdXBsaWNhdGUsIHN1cHByZXNzZWQgb3IgZmlsdGVyZWQgb3V0Ci0vLwkJCQkJCS8vCi0vLwkJCQkJCWlmKCFzZWxlY3RlZERlc2NyaXB0b3JzLmNvbnRhaW5zKHRhc2tEZXNjcmlwdG9yKQotLy8JCQkJCQkJCSYmIGNvbnRhaW5zKGFsbEVsZW1lbnRzLCB0YXNrRGVzY3JpcHRvcikgLy8gbWFrZSBzdXJlIHRoYXQgdGFzayBkZXNjcmlwdG9yIGlzIG9mIHRoZSBvd25pbmcgYWN0aXZpdHkKLS8vCQkJCQkJKSB7Ci0vLwkJCQkJCQlzZWxlY3RlZERlc2NyaXB0b3JzLmFkZCh0YXNrRGVzY3JpcHRvcik7CQkJCQkKLS8vCQkJCQkJTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZShnZXREaWFncmFtKCksCi0vLwkJCQkJCQkJCXRhc2tEZXNjcmlwdG9yLCBUYXNrTm9kZS5jbGFzcyk7Ci0vLwkJCQkJCWlmIChub2RlID09IG51bGwpIHsKLS8vCQkJCQkJCW5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tOb2RlKCk7Ci0vLwkJCQkJCQlub2RlLnNldERpYWdyYW0oZ2V0RGlhZ3JhbSgpKTsKLS8vCQkJCQkJCW5vZGUuc2V0T2JqZWN0KHRhc2tEZXNjcmlwdG9yKTsKLS8vCQkJCQkJCSgoTmFtZWROb2RlSW1wbCkgbm9kZSkuc2V0SXRlbVByb3ZpZGVyKGFsbEVsZW1lbnRzKTsKLS8vCQkJCQkJfQotLy8JCQkJCQl0YXNrTm9kZXMuYWRkKG5vZGUpOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQkJaWYoIXRhc2tOb2Rlcy5pc0VtcHR5KCkpIHsKLS8vCQkJCQkvLyBhZGQgcm9sZSBub2RlCi0vLwkJCQkJLy8KLS8vCQkJCQlOb2RlIG5vZGUgPSAoTmFtZWROb2RlSW1wbCkgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlTm9kZSgpOwotLy8JCQkJCW5vZGUuc2V0RGlhZ3JhbShnZXREaWFncmFtKCkpOwotLy8JCQkJCW5vZGUuc2V0T2JqZWN0KHJvbGVEZXNjcmlwdG9yKTsKLS8vCQkJCQkoKE5hbWVkTm9kZUltcGwpIG5vZGUpLnNldEl0ZW1Qcm92aWRlcihhbGxFbGVtZW50cyk7Ci0vLwkJCQkJZ2V0Tm9kZXMoKS5hZGQobm9kZSk7Ci0vLwkJCQkJLy8gYWRkIHRhc2sgbm9kZXMKLS8vCQkJCQkvLwotLy8JCQkJCWdldE5vZGVzKCkuYWRkQWxsKHRhc2tOb2Rlcyk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0KLQkJCi0JfQotCQotCXB1YmxpYyBHcmFwaE5vZGUgZ2V0R3JhcGhOb2RlKE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCkgewotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQlpZiAoZ2V0VU1BRGlhZ3JhbSgpID09IG51bGwpIHsKLQkJCQkvLyBuZXcgTWV0aG9kRWxlbWVudAotCQkJCS8vCi0JCQkJcmV0dXJuIEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlR3JhcGhOb2RlKG1ldGhvZEVsZW1lbnQpOwotCQkJfQotCQkJR3JhcGhOb2RlIG5vZGUgPSBmaW5kR3JhcGhOb2RlKGdldFVNQURpYWdyYW0oKSwgbWV0aG9kRWxlbWVudCk7Ci0JCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJbm9kZSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlR3JhcGhOb2RlKG1ldGhvZEVsZW1lbnQpOwotCQkJCS8vIGNyZWF0ZUdyYXBoQ29ubmVjdG9ycyhub2RlLCBnZXRVTUFEaWFncmFtKCkpOwotCQkJCWdldFVNQURpYWdyYW0oKS5nZXRDb250YWluZWQoKS5hZGQobm9kZSk7Ci0JCQl9Ci0JCQlTdHJpbmcgYXV0b2xheW91dCA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0QXV0b0xheW91dEZsYWcoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSlnZXREaWFncmFtKCkpOwotCQkJaWYoYXV0b2xheW91dCAhPSBudWxsKXsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmNyZWF0ZVByb3BlcnR5KG5vZGUsIEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWCwgbmV3IEludGVnZXIocm93SW5kZXgpLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEdyYXBoTm9kZSBmaW5kR3JhcGhOb2RlKERpYWdyYW0gZGlhZ3JhbSwgT2JqZWN0IG1ldGhvZEVsZW1lbnQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXRDb250YWluZWQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUdyYXBoTm9kZSBlbGVtZW50ID0gKEdyYXBoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5nZXRTZW1hbnRpY01vZGVsKCkgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlCi0JCQkJCSYmIG1ldGhvZEVsZW1lbnQgPT0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBlbGVtZW50Ci0JCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKSkuZ2V0RWxlbWVudCgpKSB7Ci0KLQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZFByb3BlcnR5KGVsZW1lbnQsIEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWCk7Ci0JCQkJCi0JCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGluZGV4ID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKGluZGV4ICE9IG51bGwpIHsKLQkJCQkJCWlmIChnZXRSb3dJbmRleCgpID09IG5ldyBJbnRlZ2VyKGluZGV4KS5pbnRWYWx1ZSgpKQotCQkJCQkJCXJldHVybiBlbGVtZW50OwotCQkJCQl9Ci0JCQkJfWVsc2V7Ci0JCQkJCXJldHVybiBlbGVtZW50OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0vLwlwdWJsaWMgR3JhcGhOb2RlIGNyZWF0ZUdyYXBoTm9kZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLS8vCQlHcmFwaE5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlR3JhcGhOb2RlKGVsZW1lbnQpOwotLy8JCUdyYXBoaWNhbERhdGFIZWxwZXIuY3JlYXRlUHJvcGVydHkobm9kZSwKLS8vCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWCwgbmV3IEludGVnZXIocm93SW5kZXgpCi0vLwkJCQkJCS50b1N0cmluZygpKTsKLS8vCQlyZXR1cm4gbm9kZTsKLS8vCX0KLQkKLQlwcml2YXRlIGNsYXNzIFJvbGVEZXNjcmlwdG9yQWRhcHRlciBleHRlbmRzIFRyYW5zYWN0aW9uYWxOb2RlTGluayB7Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZihtc2cgaW5zdGFuY2VvZiBPcHBvc2l0ZUZlYXR1cmVOb3RpZmljYXRpb24pIHsKLQkJCQlPYmplY3QgZmVhdHVyZSA9ICgoT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uKW1zZykuZ2V0T3Bwc2l0ZUZlYXR1cmUoKTsKLQkJCQlpZihmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX1ByaW1hcnlUYXNrRGVzY3JpcHRvcnMpIHsKLQkJCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQkJYWRkTm9kZSgoVGFza0Rlc2NyaXB0b3IpIG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQkJcmVtb3ZlTm9kZShtc2cuZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQkJYWRkTm9kZSgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJCXJlbW92ZU5vZGUoKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChBY3Rpdml0eS5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTOgotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJNT1ZFRUVFRUVFRCIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvbGRWYWx1ZQotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVOb2RlKE9iamVjdCBvbGRWYWx1ZSkgewotCQlDb2xsZWN0aW9uIHJlbW92ZWROb2RlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG9sZFZhbHVlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIFJvbGVOb2RlKSB7Ci0JCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgZCA9IChBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKWdldERpYWdyYW0oKTsKLQkJCQkJTGlzdCBsaXN0ID0gLy9Bc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKChSb2xlRGVzY3JpcHRvcikgbm9kZS5nZXRPYmplY3QoKSk7Ci0JCQkJCQlkLmdldFJlYWxpemVkUHJpbWFyeVRhc2tEZXNjcmlwdG9ycygoUm9sZURlc2NyaXB0b3IpIG5vZGUuZ2V0T2JqZWN0KCkpOwotCQkJCQlpZiAobGlzdCA9PSBudWxsIHx8IGxpc3Quc2l6ZSgpIDwgMSkgewotCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCXJlbW92ZWROb2Rlcy5hZGQobm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobm9kZS5nZXRPYmplY3QoKSA9PSBvbGRWYWx1ZSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJcmVtb3ZlZE5vZGVzLmFkZChub2RlKTsKLQkJCQlpZiAob2xkVmFsdWUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQlOb2RlIHdwbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUoCi0JCQkJCQkJKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgZ2V0RGlhZ3JhbSgpLCBvbGRWYWx1ZSk7Ci0JCQkJCWdldERpYWdyYW0oKS5nZXROb2RlcygpLnJlbW92ZSh3cG5vZGUpOwotCQkJCQl3cG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKAotCQkJCQkJCShBY3Rpdml0eURldGFpbERpYWdyYW0pIGdldERpYWdyYW0oKSwgb2xkVmFsdWUpOwotCQkJCQlnZXREaWFncmFtKCkuZ2V0Tm9kZXMoKS5yZW1vdmUod3Bub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG5vZGVzLmlzRW1wdHkoKSkgewotCQkJZ2V0RGlhZ3JhbSgpLmdldE5vZGVzKCkucmVtb3ZlKHRoaXMpOwotCQl9Ci0JCS8vIHB1c2hCYWNrVG9EaWFncmFtKHJlbW92ZWROb2Rlcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTm9kZShUYXNrRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCWFkZE5vZGUoZ2V0Tm9kZXMoKSwgZGVzY3JpcHRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE5vZGUoQ29sbGVjdGlvbiBub2RlcywgVGFza0Rlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCi0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgZGlhZ3JhbSA9IChBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKSBnZXREaWFncmFtKCk7Ci0JCU5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUoKE5vZGVDb250YWluZXIpIGRpYWdyYW0sCi0JCQkJZGVzY3JpcHRvcik7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCWlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciA9ICgoVGFza0Rlc2NyaXB0b3IpIGRlc2NyaXB0b3IpCi0JCQkJCQkuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQkJCQlOb2RlIHJvbGVOb2RlID0gKChBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKSBnZXREaWFncmFtKCkpLmZpbmROb2RlKAotCQkJCQkJKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgZ2V0RGlhZ3JhbSgpLCByb2xlRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJvbGVOb2RlID09IG51bGwpIHsKLQkJCQkJcm9sZU5vZGUgPSAoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKSkKLQkJCQkJCQkuY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUocm9sZURlc2NyaXB0b3IpOwotCQkJCQlnZXREaWFncmFtKCkuZ2V0Tm9kZXMoKS5hZGQocm9sZU5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW5vZGUgPSBkaWFncmFtLmNyZWF0ZU5vZGUoZGVzY3JpcHRvcik7Ci0JCQkJCWludCBpID0gZ2V0TmV4dEluZGV4KGdldE5vZGVzKCkpOwotCQkJCQlpZihub2RlIGluc3RhbmNlb2YgVGFza05vZGVJbXBsKXsKLQkJCQkJCSgoVGFza05vZGVJbXBsKW5vZGUpLmRvU2V0SW5kZXgoaSArIDEpOwotCQkJCQl9Ci0JCQkJCS8vY3JlYXRlVGFza0lucHV0T3V0cHV0Tm9kZXMoZGVzY3JpcHRvciwgZ2V0RGlhZ3JhbSgpLmdldE5vZGVzKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZihub2RlICE9IG51bGwpewotCQkJbm9kZXMuYWRkKG5vZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9sZFZhbHVlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU5vZGUoQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQlDb2xsZWN0aW9uIG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50cy5jb250YWlucyhub2RlLmdldE9iamVjdCgpKSkgewotCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCQlnZXROb2RlcygpLnJlbW92ZUFsbChub2Rlcyk7Ci0JCS8vIHB1c2hCYWNrVG9EaWFncmFtKG5vZGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTm9kZShDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCUNvbGxlY3Rpb24gbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVGFza0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQlhZGROb2RlKG5vZGVzLCBkZXNjcmlwdG9yKTsKLQkJfQotCi0JCWdldE5vZGVzKCkuYWRkQWxsKG5vZGVzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkgewotCQlyZXR1cm4gUm9sZURlc2NyaXB0b3JBZGFwdGVyLmNsYXNzOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0TmV4dEluZGV4KExpc3Qgbm9kZXMpIHsKLQkJaW50IGluZGV4ID0gMDsKLQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyl7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwkJCQotLy8JCQlpZihvYmogaW5zdGFuY2VvZiBOb2RlKXsKLS8vCQkJCU5vZGUgbm9kZSA9IChOb2RlKW9iajsKLS8vCQkJCS8vU3RyaW5nIHRlbXAgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmRQcm9wZXJ0eShub2RlLmdldEdyYXBoTm9kZSgpLCBHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfSU5ERVgpLmdldFZhbHVlKCk7Ci0vLwkJCQlMaXN0IGxpc3QgPSBub2RlLmdldEdyYXBoTm9kZSgpLmdldExpc3QoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSk7Ci0vLwkJCQlpZihsaXN0ICE9IG51bGwgJiYgIWxpc3QuaXNFbXB0eSgpKXsKLS8vCQkJCQlmb3IgKGludCBpID0gbGlzdC5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotLy8JCQkJCQlQcm9wZXJ0eSBwcm9wID0gKFByb3BlcnR5KSBsaXN0LmdldChpKTsKLS8vCQkJCQkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWC5lcXVhbHMocHJvcC5nZXRLZXkoKSkpewotLy8JCQkJCQkJaW50IHRlbXAgID0gSW50ZWdlci5wYXJzZUludChwcm9wLmdldFZhbHVlKCkpOwotLy8JCQkJCQkJaWYodGVtcCA+IGluZGV4ICkgaW5kZXggPSB0ZW1wOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBUYXNrTm9kZUltcGwpIHsKLQkJCQlpbnQgaWQgPSAoKFRhc2tOb2RlSW1wbClvYmopLmRvR2V0SW5kZXgoKTsKLQkJCQlpZihpZCA+IGluZGV4KSB7Ci0JCQkJCWluZGV4ID0gaWQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvYmoxLCBPYmplY3Qgb2JqMikgewotCQkJaWYgKG9iajEgPT0gb2JqMikKLQkJCQlyZXR1cm4gMDsKLQkJCWlmKG9iajEgaW5zdGFuY2VvZiBUYXNrTm9kZUltcGwgJiYgb2JqMiBpbnN0YW5jZW9mIFRhc2tOb2RlSW1wbCl7Ci0JCQkJVGFza05vZGVJbXBsIG5vZGUxID0gKFRhc2tOb2RlSW1wbClvYmoxOwotCQkJCVRhc2tOb2RlSW1wbCBub2RlMiA9IChUYXNrTm9kZUltcGwpb2JqMjsKLQkJCQlpZihub2RlMS5kb0dldEluZGV4KCkgPiAgbm9kZTIuZG9HZXRJbmRleCgpKQotCQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0KLQl9OwotCi0JcHVibGljIHZvaWQgY3JlYXRlVGFza0lucHV0T3V0cHV0Tm9kZXMoVGFza0Rlc2NyaXB0b3IgZGVzY3JpcHRvciwgQ29sbGVjdGlvbiBub2RlcykgewotCQlOb2RlIG5ld05vZGUgPSBudWxsOwotCQlpZiAoIWRlc2NyaXB0b3IuZ2V0TWFuZGF0b3J5SW5wdXQoKS5pc0VtcHR5KCkpIHsKLQkJCW5ld05vZGUgPSBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZShkZXNjcmlwdG9yLAotCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpOwotCQkJbm9kZXMuYWRkKG5ld05vZGUpOwotCQl9Ci0JCWlmICghZGVzY3JpcHRvci5nZXRPdXRwdXQoKS5pc0VtcHR5KCkpIHsKLQkJCW5ld05vZGUgPSBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZShkZXNjcmlwdG9yLAotCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKTsKLQkJCW5vZGVzLmFkZChuZXdOb2RlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgV29ya1Byb2R1Y3RDb21wb3NpdGUgY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoCi0JCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciwgaW50IHR5cGUpIHsKLQkJV29ya1Byb2R1Y3RDb21wb3NpdGUgd29ya3Byb2R1Y3RDb21wb3NpdGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlKCk7Ci0JCXdvcmtwcm9kdWN0Q29tcG9zaXRlLnNldFVNQUNvbnRhaW5lcihnZXRHcmFwaE5vZGUoKSk7Ci0JCXdvcmtwcm9kdWN0Q29tcG9zaXRlLnNldERpYWdyYW0oZ2V0RGlhZ3JhbSgpKTsKLQkJd29ya3Byb2R1Y3RDb21wb3NpdGUuc2V0VHlwZSh0eXBlKTsKLQkJd29ya3Byb2R1Y3RDb21wb3NpdGUuc2V0T2JqZWN0KHRhc2tEZXNjcmlwdG9yKTsKLQkJcmV0dXJuIHdvcmtwcm9kdWN0Q29tcG9zaXRlOwotCX0KLQkKLQlwcml2YXRlIFRhc2tOb2RlIGNyZWF0ZVRhc2tOb2RlKFRhc2tEZXNjcmlwdG9yIHRkKSB7Ci0JCVRhc2tOb2RlIHRhc2tOb2RlID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBUYXNrTm9kZSkgewotCQkJCVRhc2tOb2RlIHRuID0gKFRhc2tOb2RlKSBub2RlOwotCQkJCWlmKHRuLmdldExpbmtlZEVsZW1lbnQoKSA9PSB0ZCkgewotCQkJCQl0YXNrTm9kZSA9IHRuOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYodGFza05vZGUgPT0gbnVsbCkgewotCQkJdGFza05vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tOb2RlKCk7Ci0JCQl0YXNrTm9kZS5zZXREaWFncmFtKGdldERpYWdyYW0oKSk7Ci0JCX0KLQkJdGFza05vZGUuc2V0T2JqZWN0KHRkKTsKLQkJcmV0dXJuIHRhc2tOb2RlOwotCX0KLQkKLQlwcml2YXRlIFJvbGVOb2RlIGNyZWF0ZVJvbGVOb2RlKFJvbGVEZXNjcmlwdG9yIHJkKSB7Ci0JCVJvbGVOb2RlIHJvbGVOb2RlID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBSb2xlTm9kZSkgewotCQkJCVJvbGVOb2RlIHJuID0gKFJvbGVOb2RlKSBub2RlOwotCQkJCWlmKHJuLmdldExpbmtlZEVsZW1lbnQoKSA9PSByZCkgewotCQkJCQlyb2xlTm9kZSA9IHJuOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYocm9sZU5vZGUgPT0gbnVsbCkgewotCQkJcm9sZU5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVOb2RlKCk7Ci0JCQlyb2xlTm9kZS5zZXREaWFncmFtKGdldERpYWdyYW0oKSk7Ci0JCQlyb2xlTm9kZS5zZXRPYmplY3QocmQpOwotCQl9Ci0JCXJldHVybiByb2xlTm9kZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcG9wdWxhdGVOb2RlcyhPYmplY3QgbmV3T2JqZWN0KXsKLQkJCi0JCWlmIChuZXdPYmplY3QgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IgPSAoUm9sZURlc2NyaXB0b3IpIG5ld09iamVjdDsKLQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgZGlhZ3JhbSA9IChBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKSBnZXREaWFncmFtKCk7Ci0JCQlDb2xsZWN0aW9uIGFsbEVsZW1lbnRzID0gZGlhZ3JhbS5nZXRBbGxCcmVha2Rvd25FbGVtZW50cygpOwotCQkJTGlzdCB0YXNrTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlMaXN0IHByaW1hcnlUYXNrRGVzY3JpcHRvcnMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmICghcHJpbWFyeVRhc2tEZXNjcmlwdG9ycy5pc0VtcHR5KCkpIHsgLy8gb3ZlcnJpZGluZwotCQkJCQkJCQkJCQkJCQkJCQkKLQkJCQlMaXN0IHRhc2tEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQl0YXNrRGVzY3JpcHRvcnMuYWRkQWxsKHByaW1hcnlUYXNrRGVzY3JpcHRvcnMpOwotCQkJCUhhc2hTZXQgc2VsZWN0ZWREZXNjcmlwdG9ycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJYm9vbGVhbiBhdXRvTGF5b3V0ID0gKChBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKWdldERpYWdyYW0oKSkuaXNBdXRvTGF5b3V0KCk7Ci0JCQkJaWYoYXV0b0xheW91dCkgewotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlpbnQgcm93VGFza3NDb3VudCA9IDA7Ci0JCQkJCWludCBzdGFydENvdW50ID0gMDsKLQkJCQkJCi0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCQkJb2JqID0gVG5nVXRpbC51bndyYXAob2JqKTsKLQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcgotCQkJCQkJCQkmJiBUbmdVdGlsLmNvbnRhaW5zKHRhc2tEZXNjcmlwdG9ycywgb2JqKSkgewotCQkJCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSBvYmo7Ci0JCQkJCQkJCi0JCQkJCQkJaWYoc3RhcnRDb3VudCA8IHJvd0luZGV4ICogR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRUYXNrc1BlclJvdygpKXsKLQkJCQkJCQkJc3RhcnRDb3VudCsrOwotCQkJCQkJCX0gZWxzZSB7Ci0KLQkJCQkJCQkJaWYgKCFzZWxlY3RlZERlc2NyaXB0b3JzCi0JCQkJCQkJCQkJLmNvbnRhaW5zKHRhc2tEZXNjcmlwdG9yKSkgewotCQkJCQkJCQkJc2VsZWN0ZWREZXNjcmlwdG9ycy5hZGQodGFza0Rlc2NyaXB0b3IpOwotCQkJCQkJCQkJTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSgKLQkJCQkJCQkJCQkJdGhpcywgdGFza0Rlc2NyaXB0b3IsCi0JCQkJCQkJCQkJCVRhc2tOb2RlLmNsYXNzKTsKLQkJCQkJCQkJCWlmIChub2RlID09IG51bGwpIHsKLS8vCQkJCQkJCQkJCW5vZGUgPSBjcmVhdGVUYXNrTm9kZSh0YXNrRGVzY3JpcHRvciwKLS8vCQkJCQkJCQkJCQkJaW5kZXgsIGFsbEVsZW1lbnRzKTsKLQkJCQkJCQkJCQlub2RlID0gY3JlYXRlVGFza05vZGUodGFza0Rlc2NyaXB0b3IpOwotCQkJCQkJCQkJCSgoTmFtZWROb2RlSW1wbCkgbm9kZSkuc2V0SXRlbVByb3ZpZGVyKGFsbEVsZW1lbnRzKTsKLQkJCQkJCQkJCQlUYXNrTm9kZUltcGwgdG4gPSAoVGFza05vZGVJbXBsKSBub2RlOwotCQkJCQkJCQkJCWlmIChhdXRvTGF5b3V0IHx8IHRuLmRvR2V0SW5kZXgoKSA9PSAtMSkgewotCQkJCQkJCQkJCQl0bi5kb1NldEluZGV4KGluZGV4KTsKLQkJCQkJCQkJCQkJaW5kZXgrKzsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJLy9yZXR1cm4gbm9kZTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJCQkJCQlpZiAocm93VGFza3NDb3VudCA8IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkJCQkJCS5nZXRUYXNrc1BlclJvdygpKSB7Ci0JCQkJCQkJCQkJCXRhc2tOb2Rlcy5hZGQobm9kZSk7Ci0JCQkJCQkJCQkJCXJvd1Rhc2tzQ291bnQrKzsKLQkJCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gU29ydCB0aGUgdGFza05vZGUgYmFzZWQgb24gdGhlaXIgaW5kZXggaWYgYXV0b2xheW91dCBpcwotCQkJCQkvLyBmYWxzZQotCQkJCQlpZiAoIWF1dG9MYXlvdXQpIHsKLQkJCQkJCUNvbGxlY3Rpb25zLnNvcnQodGFza05vZGVzLCBjb21wYXJhdG9yKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUxpc3Qgb2xkVGFza0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlEaWFncmFtIHVtYURpYWdyYW0gPSBnZXRVTUFEaWFncmFtKCk7Ci0JCQkJCWlmKHVtYURpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJLy8gTGFtZSB3YXkgb2YgZG9pbmcgdGhpcywgdG8gZml4IGEgZGVmZWN0IG9mIDEuMCB0byAxLjAuMSBtaWdyYXRpb24JCQkJICAKLQkJCQkJCUxpc3QgZ3JhcGhOb2RlcyA9IHVtYURpYWdyYW0uZ2V0Q29udGFpbmVkKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBncmFwaE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCUdyYXBoTm9kZSBlbGVtZW50ID0gKEdyYXBoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJT2JqZWN0IGJyaWRnZSA9IGVsZW1lbnQuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQkJCWlmKGJyaWRnZSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpewotCQkJCQkJCQlPYmplY3QgdGFza09iamVjdCA9ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSlicmlkZ2UpLmdldEVsZW1lbnQoKTsKLQkJCQkJCQkJTGlzdCBsaXN0ID0gZWxlbWVudC5nZXRMaXN0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFkpOwotCQkJCQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0UHJvcGVydHlCeUtleShsaXN0LAotCQkJCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX1RZUEUpOwotCQkJCQkJCQlpZiAodGFza0Rlc2NyaXB0b3JzLmNvbnRhaW5zKHRhc2tPYmplY3QpICYmIHByb3BlcnR5ID09IG51bGwpIHsKLQkJCQkJCQkJCW9sZFRhc2tEZXNjcmlwdG9ycy5hZGQodGFza09iamVjdCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYobm9kZS5nZXRMaW5rZWRFbGVtZW50KCkgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJCQlvbGRUYXNrRGVzY3JpcHRvcnMuYWRkKG5vZGUuZ2V0TGlua2VkRWxlbWVudCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2xkVGFza0Rlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCi0JCQkJCQkvLyBlbGltaW5hdGUgZGVzY3JpcHRvciB0aGF0IGlzIGR1cGxpY2F0ZSwgc3VwcHJlc3NlZCBvciBmaWx0ZXJlZCBvdXQKLQkJCQkJCS8vCi0JCQkJCQlpZighc2VsZWN0ZWREZXNjcmlwdG9ycy5jb250YWlucyh0YXNrRGVzY3JpcHRvcikKLQkJCQkJCQkJJiYgY29udGFpbnMoYWxsRWxlbWVudHMsIHRhc2tEZXNjcmlwdG9yKSAvLyBtYWtlIHN1cmUgdGhhdCB0YXNrIGRlc2NyaXB0b3IgaXMgb2YgdGhlIG93bmluZyBhY3Rpdml0eQotCQkJCQkJKSB7Ci0JCQkJCQkJc2VsZWN0ZWREZXNjcmlwdG9ycy5hZGQodGFza0Rlc2NyaXB0b3IpOwkJCQkJCi0JCQkJCQkJTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZShnZXREaWFncmFtKCksCi0JCQkJCQkJCQl0YXNrRGVzY3JpcHRvciwgVGFza05vZGUuY2xhc3MpOwotCQkJCQkJCWlmIChub2RlID09IG51bGwpIHsKLQkJCQkJCQkJbm9kZSA9IGNyZWF0ZVRhc2tOb2RlKHRhc2tEZXNjcmlwdG9yKTsKLQkJCQkJCQkJKChOYW1lZE5vZGVJbXBsKSBub2RlKS5zZXRJdGVtUHJvdmlkZXIoYWxsRWxlbWVudHMpOwotCQkJCQkJCX0KLQkJCQkJCQl0YXNrTm9kZXMuYWRkKG5vZGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYoIXRhc2tOb2Rlcy5pc0VtcHR5KCkpIHsKLQkJCQkvLyBhZGQgcm9sZSBub2RlCi0JCQkJLy8KLQkJCQlOYW1lZE5vZGVJbXBsIG5hbWVkTm9kZSA9ICgoTmFtZWROb2RlSW1wbCkgY3JlYXRlUm9sZU5vZGUocm9sZURlc2NyaXB0b3IpKTsKLQkJCQluYW1lZE5vZGUudmlzaWJsZSA9IHRydWU7Ci0JCQkJbmFtZWROb2RlLnNldEl0ZW1Qcm92aWRlcihhbGxFbGVtZW50cyk7Ci0JCQkJZ2V0Tm9kZXMoKS5hZGQobmFtZWROb2RlKTsJCQotCQkJCXRhc2tOb2Rlcy5hZGQobmFtZWROb2RlKTsKLQkJCX0KLQkJCXNlbGVjdE5vZGVzKHRhc2tOb2Rlcyk7Ci0JCX0KLQkJCi0JfQotCQotLy8JcHVibGljIE5vZGUgY3JlYXRlVGFza05vZGUoVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IsIGludCBpbmRleCwgQ29sbGVjdGlvbiBhbGxFbGVtZW50cykgewotLy8JCU5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza05vZGUoKTsKLS8vCQlub2RlLnNldERpYWdyYW0oZ2V0RGlhZ3JhbSgpKTsKLS8vCQlub2RlLnNldE9iamVjdCh0YXNrRGVzY3JpcHRvcik7Ci0vLwkJKChOYW1lZE5vZGVJbXBsKSBub2RlKS5zZXRJdGVtUHJvdmlkZXIoYWxsRWxlbWVudHMpOwotLy8JCWlmIChHcmFwaGljYWxEYXRhSGVscGVyLmZpbmRQcm9wZXJ0eShub2RlLmdldEdyYXBoTm9kZSgpLAotLy8JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0lOREVYKSA9PSBudWxsCi0vLwkJCQl8fCBHcmFwaGljYWxEYXRhSGVscGVyCi0vLwkJCQkJCS5pc0F1dG9MYXlvdXQoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgZ2V0RGlhZ3JhbSgpKSkgewotLy8JCQlHcmFwaGljYWxEYXRhSGVscGVyLmNyZWF0ZVByb3BlcnR5KG5vZGUuZ2V0R3JhcGhOb2RlKCksCi0vLwkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0lOREVYLCBuZXcgSW50ZWdlcihpbmRleCkKLS8vCQkJCQkJCS50b1N0cmluZygpKTsKLS8vCQkJaW5kZXgrKzsKLS8vCQl9Ci0vLwkJcmV0dXJuIG5vZGU7Ci0vLwl9Ci0JCi19IC8vIFJvbGVUYXNrQ29tcG9zaXRlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9UYXNrTm9kZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvVGFza05vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllYmQyNTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9UYXNrTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzayBOb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlRhc2tOb2RlSW1wbCNnZXRJbmRleCA8ZW0+SW5kZXg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTm9kZUltcGwgZXh0ZW5kcyBOYW1lZE5vZGVJbXBsIGltcGxlbWVudHMgVGFza05vZGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmRleCgpIDxlbT5JbmRleDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IElOREVYX0VERUZBVUxUID0gLTE7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmRleCgpIDxlbT5JbmRleDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgaW5kZXggPSBJTkRFWF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXByb3RlY3RlZCBUYXNrTm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJbWV0aG9kRWxlbWVudEFkYXB0ZXIgPSBuZXcgVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLlRBU0tfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCQotCXB1YmxpYyBpbnQgZG9HZXRJbmRleCgpIHsKLQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJUHJvcGVydHkgcHJvcCA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0UHJvcGVydHkodGhpcywgR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0lOREVYKTsKLQkJCWlmKHByb3AgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWludCBpID0gSW50ZWdlci5wYXJzZUludChwcm9wLmdldFZhbHVlKCkpOwotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQkJY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldEluZGV4KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5kZXgoaW50IG5ld0luZGV4KSB7Ci0JCWludCBvbGRJbmRleCA9IGluZGV4OwotCQlpbmRleCA9IG5ld0luZGV4OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuVEFTS19OT0RFX19JTkRFWCwgb2xkSW5kZXgsIGluZGV4KSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvU2V0SW5kZXgoaW50IG5ld0luZGV4KSB7Ci0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuY3JlYXRlUHJvcGVydHkoZ2V0R3JhcGhOb2RlKCksIAotCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfSU5ERVgsIFN0cmluZy52YWx1ZU9mKG5ld0luZGV4KSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRJbmRleChuZXdJbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5UQVNLX05PREVfX0lOREVYOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRJbmRleCgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVEFTS19OT0RFX19JTkRFWDoKLQkJCQlzZXRJbmRleCgoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5UQVNLX05PREVfX0lOREVYOgotCQkJCXNldEluZGV4KElOREVYX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRBU0tfTk9ERV9fSU5ERVg6Ci0JCQkJcmV0dXJuIGluZGV4ICE9IElOREVYX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaW5kZXg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGluZGV4KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUYXNrRGVzY3JpcHRvckFkYXB0ZXIgZXh0ZW5kcyBNZXRob2RFbGVtZW50QWRhcHRlciB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYgKCFub3RpZmljYXRpb25FbmFibGVkKQotCQkJCXJldHVybjsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBvYmo7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKFRhc2tEZXNjcmlwdG9yLmNsYXNzKSkgewotCQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJYWRkSW5jb21pbmdDb25uZWN0aW9uKG9iaik7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJCXJlbW92ZUluY29taW5nQ29ubmVjdGlvbihvYmopOwotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQkJCQlhZGRJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCQljb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkJCXJlbW92ZUluY29taW5nQ29ubmVjdGlvbihvYmopOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJYWRkT3V0Z29pbmdDb25uZWN0aW9uKG9iaik7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJCXJlbW92ZU91dGdvaW5nQ29ubmVjdGlvbihvYmopOwotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQkJCQlhZGRPdXRnb2luZ0Nvbm5lY3Rpb24ob2JqKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCQljb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkJCXJlbW92ZU91dGdvaW5nQ29ubmVjdGlvbihvYmopOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7Ci0JCQl9Ci0KLQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JTm9kZUNoYW5nZUxpc3RlbmVyI2dldE5vZGUoKQotCQkgKi8KLQkJcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJCXJldHVybiBUYXNrTm9kZUltcGwudGhpczsKLQkJfQotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5hbWVkTm9kZUltcGwjc2V0T2JqZWN0KGphdmEubGFuZy5PYmplY3QpCi0JLy8gKi8KLQkvLyBwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG5ld09iamVjdCkgewotCS8vIE9iamVjdCBvbGRPYmplY3QgPSBvYmplY3Q7Ci0JLy8gb2JqZWN0ID0gbmV3T2JqZWN0OwotCS8vIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkvLyBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCS8vIE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX19PQkpFQ1QsIG9sZE9iamVjdCwgb2JqZWN0KSk7Ci0JLy8KLQkvLyBpZihuZXdPYmplY3QgPT0gbnVsbCkgcmV0dXJuOwotCS8vCQkKLQkvLyBNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgbmV3T2JqZWN0OwotCS8vIGlmKGVsZW1lbnQgIT0gbnVsbCAmJiBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSAhPSBudWxsKSB7Ci0JLy8gLy8gcmVtb3ZlIG9sZCBtZXRob2RFbGVtZW50QWRhcHRlcgotCS8vIC8vCi0JLy8gT2JqZWN0IG9sZEFkYXB0ZXIgPSBVbWFVdGlsLmdldEFkYXB0ZXIoZWxlbWVudCwKLQkvLyBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSk7Ci0JLy8gaWYob2xkQWRhcHRlciAhPSBudWxsKSB7Ci0JLy8gZWxlbWVudC5lQWRhcHRlcnMoKS5yZW1vdmUob2xkQWRhcHRlcik7Ci0JLy8gfQotCS8vIH0KLQkvLyBncmFwaE5vZGUgPQotCS8vIEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0R3JhcGhOb2RlKGdldFVNQURpYWdyYW0oKSwKLQkvLyBlbGVtZW50KTsKLQkvLyAgICAgICAgCi0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJOb2RlSW1wbC5zZXRPYmplY3QoKTogZWxlbWVudDogJyIgKwotCS8vIGVsZW1lbnQuZ2V0TmFtZSgpICsgIicsIGdyYXBoTm9kZTogIiArIGdyYXBoTm9kZSk7Ci0JLy8gICAgICAgIAotCS8vIC8vIHBvcHVsYXRlIGRhdGEKLQkvLyAvLwotCS8vIHNldEhlaWdodChncmFwaE5vZGUuZ2V0U2l6ZSgpLmdldEhlaWdodCgpLmludFZhbHVlKCkpOwotCS8vIHNldExvY2F0aW9uKEdyYXBoaWNhbERhdGFIZWxwZXIudG9Qb2ludChncmFwaE5vZGUuZ2V0UG9zaXRpb24oKSkpOwotCS8vIHNldFdpZHRoKGdyYXBoTm9kZS5nZXRTaXplKCkuZ2V0V2lkdGgoKS5pbnRWYWx1ZSgpKTsKLQkvLyAgICAgICAgCi0JLy8gLy8gYWRkIG1ldGhvZEVsZW1lbnRBZGFwdGVyCi0JLy8gLy8KLQkvLyBpZihtZXRob2RFbGVtZW50QWRhcHRlciAhPSBudWxsKSB7Ci0JLy8gZWxlbWVudC5lQWRhcHRlcnMoKS5hZGQobWV0aG9kRWxlbWVudEFkYXB0ZXIpOwotCS8vIH0KLQkvLyAgICAgICAgCi0JLy8gdGhpcy5lQWRhcHRlcnMoKS5hZGQoY3JlYXRlTm9kZUFkYXB0ZXIoKSk7Ci0JLy8KLQkvLyBzZXROYW1lKGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjYWRkVG9VTUEob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluaykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRUb1VNQShMaW5rIGxpbmspIHsKLQkJaWYgKCFzdXBlci5hZGRUb1VNQShsaW5rKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvL1Rhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKSBnZXRPYmplY3QoKTsKLQkJTm9kZUltcGwgbm9kZUltcGwgPSAoTm9kZUltcGwpIGxpbmsuZ2V0U291cmNlKCk7Ci0JCWJvb2xlYW4gbm90aWZ5ID0gbm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJYm9vbGVhbiBub3RpZnlTb3VyY2UgPSBub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkOwotCQl0cnkgewotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJLy8gdGFza0Rlc2MuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQobGluay5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5OwotCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeVNvdXJjZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNyZW1vdmVGcm9tVU1BKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmssCi0JICogICAgICBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlLCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21VTUEoTGluayBsaW5rLCBOb2RlIG9sZFNvdXJjZSwgTm9kZSBvbGRUYXJnZXQpIHsKLQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIGdldE9iamVjdCgpOwotCQl0YXNrRGVzYy5nZXRPdXRwdXQoKS5yZW1vdmUobGluay5nZXRUYXJnZXQoKS5nZXRPYmplY3QoKSk7Ci0KLQkJc3VwZXIucmVtb3ZlRnJvbVVNQShsaW5rLCBvbGRTb3VyY2UsIG9sZFRhcmdldCk7Ci0JfQotCi19IC8vIFRhc2tOb2RlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9UeXBlZE5vZGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1R5cGVkTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTk3OTRjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1R5cGVkTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlR5cGVkIE5vZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuVHlwZWROb2RlSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVHlwZWROb2RlSW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgVHlwZWROb2RlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9FREVGQVVMVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUeXBlZE5vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5UWVBFRF9OT0RFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCBuZXdUeXBlKSB7Ci0JCWludCBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fVFlQRToKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0VHlwZSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fVFlQRToKLQkJCQlzZXRUeXBlKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX1RZUEU6Ci0JCQkJcmV0dXJuIHR5cGUgIT0gVFlQRV9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0eXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0eXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYmFzaWNTZXRPYmplY3QoT2JqZWN0IG5ld09iamVjdCkgewotCQkvL3BvcHVsYXRlIGRhdGEgZnJvbSBsaW5rZWQgR3JhcGhOb2RlCi0JCS8vIAotCQlncmFwaE5vZGUgPSAoR3JhcGhOb2RlKSBuZXdPYmplY3Q7Ci0JCXNldFdpZHRoKGdyYXBoTm9kZS5nZXRTaXplKCkuZ2V0V2lkdGgoKS5pbnRWYWx1ZSgpKTsKLQkJc2V0SGVpZ2h0KGdyYXBoTm9kZS5nZXRTaXplKCkuZ2V0SGVpZ2h0KCkuaW50VmFsdWUoKSk7Ci0JCXNldExvY2F0aW9uKEdyYXBoaWNhbERhdGFIZWxwZXIudG9Qb2ludChncmFwaE5vZGUuZ2V0UG9zaXRpb24oKSkpOwotLy8JCSB0aGlzLmVBZGFwdGVycygpLmFkZChuZXcgQWRhcHRlckltcGwoKSB7Ci0JCS8vIC8qIChub24tSmF2YWRvYykKLQkJLy8gKiBAc2VlCi0JCS8vIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCS8vICovCi0JCS8vIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkvLyBHcmFwaE5vZGUgZ3JhcGhOb2RlID0gKEdyYXBoTm9kZSkgZ2V0T2JqZWN0KCk7Ci0JCS8vIHN3aXRjaChtc2cuZ2V0RmVhdHVyZUlEKFR5cGVkTm9kZS5jbGFzcykpIHsKLQkJLy8gY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fV0lEVEg6Ci0JCS8vIGdyYXBoTm9kZS5nZXRTaXplKCkuc2V0V2lkdGgobmV3IERvdWJsZShtc2cuZ2V0TmV3SW50VmFsdWUoKSkpOwotCQkvLyByZXR1cm47Ci0JCS8vICAgICAgICAgICAgICAgICAgICAKLQkJLy8gY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fSEVJR0hUOgotCQkvLyBncmFwaE5vZGUuZ2V0U2l6ZSgpLnNldEhlaWdodChuZXcgRG91YmxlKG1zZy5nZXROZXdJbnRWYWx1ZSgpKSk7Ci0JCS8vIHJldHVybjsKLQkJLy8gICAgICAgICAgICAgICAgICAgICAgICAKLQkJLy8gY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fTE9DQVRJT046Ci0JCS8vIFBvaW50IHAgPSAoUG9pbnQpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVkTm9kZUltcGwkLm5vdGlmeUNoYW5nZWQoKTogbmV3IGxvY2F0aW9uOiAiICsKLQkJLy8gcCArICIuICIgKyBUeXBlZE5vZGVJbXBsLnRoaXMpOwotCQkvLyBncmFwaE5vZGUuZ2V0UG9zaXRpb24oKS5zZXRYKG5ldyBEb3VibGUocC54KSk7Ci0JCS8vIGdyYXBoTm9kZS5nZXRQb3NpdGlvbigpLnNldFkobmV3IERvdWJsZShwLnkpKTsKLQkJLy8gcmV0dXJuOwotCQkvLyAgICAgICAgICAgICAgICAgICAgCi0JCS8vIGNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOgotCQkvLyBMaW5rIGxpbms7Ci0JCS8vIHN3aXRjaChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJLy8gY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkvLyBhZGRUb1VNQSgoTGluaykgbXNnLmdldE5ld1ZhbHVlKCkpOwotCQkvLyBicmVhazsKLQkJLy8gY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbiltc2cuZ2V0TmV3VmFsdWUoKSkuaXRlcmF0b3IoKTsgaXRlcgotCQkvLyAuaGFzTmV4dCgpOykgewotCQkvLyBhZGRUb1VNQSgoTGluaykgaXRlci5uZXh0KCkpOwotCQkvLyB9Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCS8vIGxpbmsgPSAoTGluaykgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCS8vIGlmKGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbCkgewotCQkvLyAoKE5vZGVJbXBsKWxpbmsuZ2V0U291cmNlKCkpLnJlbW92ZUZyb21VTUEobGluaywgbGluay5nZXRTb3VyY2UoKSwKLQkJLy8gKE5vZGUpbXNnLmdldE5vdGlmaWVyKCkpOwotCQkvLyB9Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKW1zZy5nZXRPbGRWYWx1ZSgpKS5pdGVyYXRvcigpOyBpdGVyCi0JCS8vIC5oYXNOZXh0KCk7KSB7Ci0JCS8vIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCS8vIGlmKGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbCkgewotCQkvLyAoKE5vZGVJbXBsKWxpbmsuZ2V0U291cmNlKCkpLnJlbW92ZUZyb21VTUEobGluaywgbGluay5nZXRTb3VyY2UoKSwKLQkJLy8gKE5vZGUpbXNnLmdldE5vdGlmaWVyKCkpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuOwotCQkvLwotCQkvLyBjYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJLy8gc3dpdGNoKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCS8vIGFkZFRvVU1BKChMaW5rKSBtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKW1zZy5nZXROZXdWYWx1ZSgpKS5pdGVyYXRvcigpOyBpdGVyCi0JCS8vIC5oYXNOZXh0KCk7KSB7Ci0JCS8vIGFkZFRvVU1BKChMaW5rKSBpdGVyLm5leHQoKSk7Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vCi0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJLy8gbGluayA9IChMaW5rKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJLy8gaWYobGluay5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCS8vIHJlbW92ZUZyb21VTUEobGluaywgKE5vZGUpbXNnLmdldE5vdGlmaWVyKCksIGxpbmsuZ2V0VGFyZ2V0KCkpOwotCQkvLyB9Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKW1zZy5nZXRPbGRWYWx1ZSgpKS5pdGVyYXRvcigpOyBpdGVyCi0JCS8vIC5oYXNOZXh0KCk7KSB7Ci0JCS8vIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCS8vIGlmKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkvLyByZW1vdmVGcm9tVU1BKGxpbmssIChOb2RlKW1zZy5nZXROb3RpZmllcigpLCBsaW5rLmdldFRhcmdldCgpKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIGJyZWFrOwotCQkvLyB9Ci0JCS8vIHJldHVybjsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vCi0JCS8vIH0pOwotCQllQWRhcHRlcnMoKS5hZGQobmV3IE5vZGVBZGFwdGVyKCkpOwotCX0KLQkKLQlwdWJsaWMgQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRUb1VNQShMaW5rIGxpbmspIHsKLQkJaWYgKCFzdXBlci5hZGRUb1VNQShsaW5rKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAobGluay5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBUeXBlZE5vZGUKLQkJCQkJJiYgKChUeXBlZE5vZGUpIGxpbmsuZ2V0VGFyZ2V0KCkpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1lOQ0hfQkFSKSB7Ci0JCQkJQ29sbGVjdGlvbiB0YXJnZXRBY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmdldFN5bmNCYXJUYXJnZXROb2RlcygoVHlwZWROb2RlKSBsaW5rCi0JCQkJCQkuZ2V0VGFyZ2V0KCksIHRhcmdldEFjdE5vZGVzKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXRBY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTmFtZWROb2RlSW1wbCBub2RlID0gKChOYW1lZE5vZGVJbXBsKSBpdGVyLm5leHQoKSk7Ci0JCQkJCWlmIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlCi0JCQkJCQkJLmdldE9iamVjdCgpLCAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGxpbmsKLQkJCQkJCQkuZ2V0U291cmNlKCkuZ2V0T2JqZWN0KCkpID09IG51bGwpIHsKLQkJCQkJCWFkZERlZmF1bHRXb3JrT3JkZXIobm9kZSwgKFdvcmtCcmVha2Rvd25FbGVtZW50KSBsaW5rCi0JCQkJCQkJCS5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobGluay5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJLy8gUHJlZGVjZXNzb3Igc2hvdWxkIGJlIGNyZWF0ZWQgb25seSBpbiBjYXNlIG9mCi0JCQkvLyBTeW5jcm9uaXphdGlvbiBCYXIsIG5vdCBmb3IgRGVjaXNpb25Qb2ludC4KLQkJCWlmICgoKFR5cGVkTm9kZSkgbGluay5nZXRTb3VyY2UoKSkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TWU5DSF9CQVIpIHsKLQkJCQlDb2xsZWN0aW9uIHNyY0FjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0U3luY0JhclNvdXJjZU5vZGVzKChUeXBlZE5vZGUpIGxpbmsKLQkJCQkJCS5nZXRTb3VyY2UoKSwgc3JjQWN0Tm9kZXMpOwotCQkJCUNvbGxlY3Rpb24gdGFyZ2V0QWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRTeW5jQmFyVGFyZ2V0Tm9kZXMoKFR5cGVkTm9kZSkgbGluawotCQkJCQkJLmdldFRhcmdldCgpLCB0YXJnZXRBY3ROb2Rlcyk7Ci0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXRBY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTmFtZWROb2RlSW1wbCBub2RlID0gKChOYW1lZE5vZGVJbXBsKSBpdGVyLm5leHQoKSk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzcmNBY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSAoKE5vZGUpIGl0ZXJhdG9yCi0JCQkJCQkJCS5uZXh0KCkpLmdldE9iamVjdCgpOwotCQkJCQkJaWYgKFVtYVV0aWwuZmluZFdvcmtPcmRlcigoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUKLQkJCQkJCQkJLmdldE9iamVjdCgpLCBwcmVkKSA9PSBudWxsKSB7Ci0JCQkJCQkJYWRkRGVmYXVsdFdvcmtPcmRlcihub2RlLCBwcmVkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21VTUEoTGluayBsaW5rLCBOb2RlIG9sZFNvdXJjZSwgTm9kZSBvbGRUYXJnZXQpIHsKLQkJVHlwZWROb2RlIHR5cGVkTm9kZSA9IChUeXBlZE5vZGUpIG9sZFNvdXJjZTsKLQkJQ29sbGVjdGlvbiBzcmNBY3ROb2RlcyA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0U291cmNlTm9kZXModHlwZWROb2RlLAotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5jbGFzcyk7Ci0KLQkJaWYgKG9sZFRhcmdldCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNyY0FjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkvLyBPYmplY3QgcHJlZCA9ICgoTm9kZSkgaXRlcmF0b3IubmV4dCgpKS5nZXRPYmplY3QoKTsKLQkJCQkvLyBHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZVdvcmtPcmRlcigoTmFtZWROb2RlSW1wbCkKLQkJCQkvLyBvbGRUYXJnZXQsIHByZWQpOwotCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCS5jYW5SZW1vdmVBbGxQcmVkcyhsaW5rLCBub2RlLCBvbGRUYXJnZXQpKSB7Ci0JCQkJCXdoaWxlIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIoCi0JCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBvbGRUYXJnZXQuZ2V0T2JqZWN0KCksCi0JCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlLmdldE9iamVjdCgpKSAhPSBudWxsKSB7Ci0JCQkJCQlVbWFVdGlsLnJlbW92ZVdvcmtPcmRlcigKLQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBvbGRUYXJnZXQuZ2V0T2JqZWN0KCksCi0JCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZS5nZXRPYmplY3QoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAob2xkVGFyZ2V0IGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQlDb2xsZWN0aW9uIHRhcmdldEFjdE5vZGVzID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRUYXJnZXROb2RlcygKLQkJCQkJKFR5cGVkTm9kZSkgb2xkVGFyZ2V0LCBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCi0JCQkvLyByZW1vdmUgdGhlIHdvcmsgb3JkZXJzIG9mIHRhcmdldCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSB0aGUKLQkJCS8vIHByZWRlY2Vzc29yIGluIHNyY0FjdE5vZGVzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFyZ2V0QWN0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTmFtZWROb2RlSW1wbCBub2RlID0gKChOYW1lZE5vZGVJbXBsKSBpdGVyLm5leHQoKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNyY0FjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkvLyBPYmplY3QgcHJlZCA9ICgoTm9kZSkgaXRlcmF0b3IubmV4dCgpKS5nZXRPYmplY3QoKTsKLQkJCQkJLy8gR3JhcGhpY2FsRGF0YUhlbHBlci5yZW1vdmVXb3JrT3JkZXIobm9kZSwgcHJlZCk7Ci0JCQkJCU5vZGUgcHJlZG5vZGUgPSAoTm9kZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5jYW5SZW1vdmVBbGxQcmVkcyhsaW5rLCBwcmVkbm9kZSwKLQkJCQkJCQlub2RlKSkgewotCQkJCQkJd2hpbGUgKFVtYVV0aWwuZmluZFdvcmtPcmRlcigKLQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlLmdldE9iamVjdCgpLAotCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHByZWRub2RlLmdldE9iamVjdCgpKSAhPSBudWxsKSB7Ci0JCQkJCQkJVW1hVXRpbAotCQkJCQkJCQkJLnJlbW92ZVdvcmtPcmRlcigKLQkJCQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlCi0JCQkJCQkJCQkJCQkJLmdldE9iamVjdCgpLAotCQkJCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHByZWRub2RlCi0JCQkJCQkJCQkJCQkJLmdldE9iamVjdCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXN1cGVyLnJlbW92ZUZyb21VTUEobGluaywgb2xkU291cmNlLCBvbGRUYXJnZXQpOwotCX0KLX0gLy8gVHlwZWROb2RlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmM1YjdmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbCBleHRlbmRzIE5hbWVkTm9kZUltcGwgaW1wbGVtZW50cwotCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXByb3RlY3RlZCBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCW1ldGhvZEVsZW1lbnRBZGFwdGVyID0gbmV3IFdvcmtCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREU7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBXb3JrQnJlYWtkb3duRWxlbWVudEFkYXB0ZXIgZXh0ZW5kcyBNZXRob2RFbGVtZW50QWRhcHRlciB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYgKCFub3RpZmljYXRpb25FbmFibGVkKQotCQkJCXJldHVybjsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJV29ya09yZGVyIG9iajsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpKSB7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1I6Ci0JCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJCW9iaiA9IChXb3JrT3JkZXIpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJYWRkSW5jb21pbmdDb25uZWN0aW9uKG9iai5nZXRQcmVkKCkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCQlvYmogPSAoV29ya09yZGVyKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJCXJlbW92ZUluY29taW5nQ29ubmVjdGlvbihvYmouZ2V0UHJlZCgpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlvYmogPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlhZGRJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqLmdldFByZWQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCW9iaiA9IChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpOwotCQkJCQkJCXJlbW92ZUluY29taW5nQ29ubmVjdGlvbihvYmouZ2V0UHJlZCgpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7Ci0JCQl9Ci0KLQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVNQShMaW5rIGxpbmssIE5vZGUgb2xkU291cmNlLCBOb2RlIG9sZFRhcmdldCkgewotCQlpZiAob2xkVGFyZ2V0IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkvLyB0aGlzIGlzIGEgZGlyZWN0IGxpbmsKLQkJCS8vIHJlbW92ZSBXb3JrT3JkZXIKLQkJCS8vCi0JCQkvLyBHcmFwaEVkZ2UgZWRnZSA9IChHcmFwaEVkZ2UpIGxpbmsuZ2V0T2JqZWN0KCk7Ci0JCQkvLyBXb3JrT3JkZXIgb3JkZXIgPSAoV29ya09yZGVyKQotCQkJLy8gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKWVkZ2UuZ2V0U2VtYW50aWNNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCQkvLyBXb3JrQnJlYWtkb3duRWxlbWVudCBiZSA9IFVtYVV0aWwuZ2V0T3duZXIob3JkZXIpOwotCQkJLy8gaWYoYmUgIT0gbnVsbCkgewotCQkJTmFtZWROb2RlSW1wbCB0YXJnZXQgPSAoTmFtZWROb2RlSW1wbCkgb2xkVGFyZ2V0OwotCQkJYm9vbGVhbiBub3RpZnkgPSB0YXJnZXQubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCXRyeSB7Ci0JCQkJdGFyZ2V0Lm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkvLyBiZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLnJlbW92ZShvcmRlcik7Ci0JCQkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuY2FuUmVtb3ZlQWxsUHJlZHMobGluaywgb2xkU291cmNlLAotCQkJCQkJb2xkVGFyZ2V0KSkgewotCQkJCQl3aGlsZSAoVW1hVXRpbC5maW5kV29ya09yZGVyKChXb3JrQnJlYWtkb3duRWxlbWVudCkgdGFyZ2V0Ci0JCQkJCQkJLmdldE9iamVjdCgpLCBvbGRTb3VyY2UuZ2V0T2JqZWN0KCkpICE9IG51bGwpIHsKLQkJCQkJCVVtYVV0aWwucmVtb3ZlV29ya09yZGVyKChXb3JrQnJlYWtkb3duRWxlbWVudCkgdGFyZ2V0Ci0JCQkJCQkJCS5nZXRPYmplY3QoKSwgb2xkU291cmNlLmdldE9iamVjdCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJdGFyZ2V0Lm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCQl9Ci0JCQkvLyB9Ci0JCX0gZWxzZSBpZiAob2xkVGFyZ2V0IGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkvLyBnZXQgYWxsIHRoZSBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVzIHRoYXQgdGhpcyBUeXBlZE5vZGUgYXJlCi0JCQkvLyBjb21pbmcgdG8gYW5kCi0JCQkvLyByZW1vdmUgdGhlIFdvcmtPcmRlcnMgd2l0aCB0aGlzIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSdzCi0JCQkvLyBhY3Rpdml0eSBhcyBwcmVkZWNlc3NvciBmcm9tIHRoZW0KLQkJCS8vCi0JCQlDb2xsZWN0aW9uIGFjdE5vZGVzID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRUYXJnZXROb2RlcygKLQkJCQkJKFR5cGVkTm9kZSkgb2xkVGFyZ2V0LCBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTmFtZWROb2RlSW1wbCBub2RlID0gKE5hbWVkTm9kZUltcGwpIGl0ZXIubmV4dCgpOwotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUKLQkJCQkJCS5nZXRPYmplY3QoKTsKLQkJCQlib29sZWFuIG5vdGlmeSA9IG5vZGUubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQl0cnkgewotCQkJCQlub2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuY2FuUmVtb3ZlQWxsUHJlZHMobGluaywgb2xkU291cmNlLAotCQkJCQkJCW5vZGUpKSB7Ci0JCQkJCQl3aGlsZSAoVW1hVXRpbC5maW5kV29ya09yZGVyKGUsIG9sZFNvdXJjZS5nZXRPYmplY3QoKSkgIT0gbnVsbCkgewotCQkJCQkJCVVtYVV0aWwucmVtb3ZlV29ya09yZGVyKGUsIG9sZFNvdXJjZS5nZXRPYmplY3QoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQlub2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIHJlbW92ZSBncmFwaGljYWwgZGF0YSBmcm9tIFVNQSBtb2RlbAotCQkvLwotCQlzdXBlci5yZW1vdmVGcm9tVU1BKGxpbmssIG9sZFNvdXJjZSwgb2xkVGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGluawotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZFRvVU1BKExpbmsgbGluaykgewotCQlpZiAoIXN1cGVyLmFkZFRvVU1BKGxpbmspKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCU5vZGUgc3JjID0gbGluay5nZXRTb3VyY2UoKTsKLQkJaWYgKHNyYyBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJLy8gdGhpcyBpcyBhIGRpcmVjdCBsaW5rCi0JCQkvLyBhZGQgbmV3IFdvcmtPcmRlciBvYmplY3QgdG8gVU1BCi0JCQkvLwotCQkJV29ya09yZGVyIG9yZGVyID0gbnVsbDsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHN1Y2MgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGxpbmsuZ2V0VGFyZ2V0KCkKLQkJCQkJLmdldE9iamVjdCgpOwotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgc3JjLmdldE9iamVjdCgpOwotCQkJaWYgKFVtYVV0aWwuZmluZFdvcmtPcmRlcihzdWNjLCBwcmVkKSA9PSBudWxsKSB7Ci0JCQkJTm9kZUltcGwgc291cmNlTm9kZSA9ICgoTm9kZUltcGwpIHNyYyk7Ci0JCQkJYm9vbGVhbiBzb3VyY2VOb3RpZnkgPSBzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJdHJ5IHsKLQkJCQkJc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCS8vVW1hVXRpbC5jcmVhdGVEZWZhdWx0V29ya09yZGVyKHN1Y2MsIHByZWQpOwotCQkJCQkvL0NyZWF0ZSBhIHdvcmtvcmRlciBhbmQgZGlzYWJsZSBub3RpZmljYXRpb24gZmxhZy4KLQkJCQkJYWRkRGVmYXVsdFdvcmtPcmRlcigoTmFtZWROb2RlSW1wbClsaW5rLmdldFRhcmdldCgpLCBwcmVkKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBzb3VyY2VOb3RpZnk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBzZXQgdGhlIFdvcmtPcmRlciBhcyB0aGUgZWxlbWVudCBvZiB0aGUgU2VtYW50aWNNb2RlbCBvZiB0aGUKLQkJCS8vIGxpbmsncyBHcmFwaEVkZ2UKLQkJCS8vCi0JCQlHcmFwaGljYWxEYXRhSGVscGVyLnNldFNlbWFudGljTW9kZWwobGluaywgb3JkZXIpOwotCQl9IGVsc2UgaWYgKHNyYyBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJLy8gZ2V0IGFsbCBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVzIHRoYXQgYXJlIGNvbW1pbmcgdG8gdGhpcwotCQkJLy8gVHlwZWROb2RlLCBib3RoIGRpcmVjdGx5IGFuZCBpbmRpcmVjdGx5Ci0JCQkvLyBhbmQgY3JlYXRlIHdvcmsgb3JkZXJzIHdpdGggdGhlaXIgYWN0aXZpdHkgYXMgcHJlZGVjZXNzb3IKLQkJCS8vCi0KLQkJCS8vIFByZWRlY2Vzc29yIHNob3VsZCBiZSBjcmVhdGVkIG9ubHkgaW4gY2FzZSBvZgotCQkJLy8gU3luY3Jvbml6YXRpb24gQmFyLCBub3QgZm9yIERlY2lzaW9uUG9pbnQuCi0JCQlpZiAoKChUeXBlZE5vZGUpIHNyYykuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TWU5DSF9CQVIpIHsKLQkJCQkKLQkJCQlDb2xsZWN0aW9uIGFjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCS8vIEdldCB0aGUgY29sbGVjdGlvbiBpbmNvbWluZyBjb25uZWN0aW9uIG9mIHN5bmNiYXIgCi0JCQkJLy8gZXhjbHVkaW5nIGRlY2lzaW9ucG9pbnQgaW5jb21pbmcgY29ubmVjdGlvbgotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0U3luY0JhclNvdXJjZU5vZGVzKChUeXBlZE5vZGUpc3JjLCBhY3ROb2Rlcyk7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgc3VjYyA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgbGluawotCQkJCQkJLmdldFRhcmdldCgpLmdldE9iamVjdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUKLQkJCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQkJCWlmIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIoc3VjYywgcHJlZCkgPT0gbnVsbCkgewotCQkJCQkJTm9kZUltcGwgc291cmNlTm9kZSA9ICgoTm9kZUltcGwpIG5vZGUpOwotCQkJCQkJYm9vbGVhbiBzb3VyY2VOb3RpZnkgPSBzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQkJCS8vVW1hVXRpbC5jcmVhdGVEZWZhdWx0V29ya09yZGVyKHN1Y2MsIHByZWQpOwotCQkJCQkJCS8vIENyZWF0ZSBhIHdvcmtvcmRlciBhbmQgZGlzYWJsZSBub3RpZmljYXRpb24gZmxhZy4KLQkJCQkJCQlhZGREZWZhdWx0V29ya09yZGVyKChOYW1lZE5vZGVJbXBsKWxpbmsuZ2V0VGFyZ2V0KCkscHJlZCk7Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCXNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IHNvdXJjZU5vdGlmeTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBMaW5rIGFkZEluY29taW5nQ29ubmVjdGlvbihNZXRob2RFbGVtZW50IHNvdXJjZSkgewotCQlMaW5rIGxpbmsgPSBzdXBlci5hZGRJbmNvbWluZ0Nvbm5lY3Rpb24oc291cmNlKTsKLQkJaWYgKGxpbmsgPT0gbnVsbCkKLQkJCXJldHVybiBsaW5rOwotCi0JCVdvcmtPcmRlciB3b3JrT3JkZXIgPSBVbWFVdGlsLmZpbmRXb3JrT3JkZXIoCi0JCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBnZXRPYmplY3QoKSwgc291cmNlKTsKLQkJR3JhcGhpY2FsRGF0YUhlbHBlci5zZXRTZW1hbnRpY01vZGVsKGxpbmssIHdvcmtPcmRlcik7Ci0KLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JcHJvdGVjdGVkIExpbmsgYWRkT3V0Z29pbmdDb25uZWN0aW9uKE1ldGhvZEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCUxpbmsgbGluayA9IHN1cGVyLmFkZE91dGdvaW5nQ29ubmVjdGlvbih0YXJnZXQpOwotCi0JCVdvcmtPcmRlciB3b3JrT3JkZXIgPSBVbWFVdGlsLmZpbmRXb3JrT3JkZXIoCi0JCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSB0YXJnZXQsIGdldE9iamVjdCgpKTsKLQkJR3JhcGhpY2FsRGF0YUhlbHBlci5zZXRTZW1hbnRpY01vZGVsKGxpbmssIHdvcmtPcmRlcik7Ci0KLQkJcmV0dXJuIGxpbms7Ci0JfQotCi19IC8vIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOTVkMDhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IENvbXBvc2l0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbCBleHRlbmRzIE5vZGVDb250YWluZXJJbXBsIGltcGxlbWVudHMKLQkJV29ya1Byb2R1Y3RDb21wb3NpdGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUWVBFX0VERUZBVUxUID0gMDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0NPTVBPU0lURTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShpbnQgbmV3VHlwZSkgewotCQlpbnQgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX0NPTVBPU0lURV9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9DT01QT1NJVEVfX1RZUEU6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFR5cGUoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9DT01QT1NJVEVfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19UWVBFOgotCQkJCXJldHVybiB0eXBlICE9IFRZUEVfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFza0Rlc2NyaXB0b3JBZGFwdGVyIGV4dGVuZHMgVHJhbnNhY3Rpb25hbE5vZGVMaW5rIHsKLQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChUYXNrRGVzY3JpcHRvci5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJT2JqZWN0IG9iaiA9IG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlpZiAob2JqICE9IG51bGwgJiYgdHlwZSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKSB7Ci0JCQkJCQlhZGROb2RlKG9iaik7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJb2JqID0gbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWlmIChvYmogIT0gbnVsbCAmJiB0eXBlID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLk9VVFBVVFMpIHsKLQkJCQkJCXJlbW92ZU5vZGUob2JqKTsKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlPYmplY3Qgb2JqID0gbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWlmIChvYmogIT0gbnVsbCAmJiB0eXBlID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLklOUFVUUykgewotCQkJCQkJYWRkTm9kZShvYmopOwotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCW9iaiA9IG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlpZiAob2JqICE9IG51bGwgJiYgdHlwZSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCQkJCXJlbW92ZU5vZGUob2JqKTsKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCX0KLQotCXByaXZhdGUgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCURpYWdyYW1JbXBsIGRpYWdyYW0gPSAoRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKTsKLQkJaWYgKGRpYWdyYW0uZmlsdGVyID09IG51bGwpIHsKLQkJCUNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlyZXR1cm4gYWRhcHRlckZhY3RvcnkuZ2V0RmlsdGVyKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZGlhZ3JhbS5maWx0ZXI7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQkJCi0JCXN1cGVyLnNldE9iamVjdChuZXdPYmplY3QpOwotCQlwb3B1bGF0ZU5vZGVzKG5ld09iamVjdCk7Ci0JCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJhc2ljU2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQotCQlzdXBlci5iYXNpY1NldE9iamVjdChuZXdPYmplY3QpOwotCQkKLQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJLy8gU2V0IHRoZSBUeXBlIGluZm9ybWF0aW9uIGZvciB3b3JrcHJvZHVjdCBjb21wb3NpdGUuCi0JCQlpZiAodHlwZSA9PSBUWVBFX0VERUZBVUxUKSB7Ci0JCQkJTGlzdCBsaXN0ID0gZ3JhcGhOb2RlLmdldExpc3QoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSk7Ci0JCQkJUHJvcGVydHkgcHJvcGVydHkgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFByb3BlcnR5QnlLZXkobGlzdCwKLQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX1RZUEUpOwotCQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJCXByb3BlcnR5LnNldFZhbHVlKHByb3BlcnR5LmdldFZhbHVlKCkpOwotCQkJCQlsaXN0LmFkZChwcm9wZXJ0eSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlMaXN0IGxpc3QgPSBncmFwaE5vZGUuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0UHJvcGVydHlCeUtleShsaXN0LAotCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX1dPUktfUFJPRFVDVF9DT01QT1NJVEVfVFlQRSk7Ci0JCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQkJcHJvcGVydHkuc2V0VmFsdWUobmV3IEludGVnZXIoZ2V0VHlwZSgpKS50b1N0cmluZygpKTsKLQkJCQkJbGlzdC5hZGQocHJvcGVydHkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZShXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkKSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgd3BkTm9kZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihub2RlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSAmJiBub2RlLmdldExpbmtlZEVsZW1lbnQoKSA9PSB3cGQpIHsKLQkJCQl3cGROb2RlID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpIG5vZGU7Ci0JCQl9Ci0JCX0KLQkJaWYod3BkTm9kZSA9PSBudWxsKSB7Ci0JCQl3cGROb2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCk7Ci0JCQl3cGROb2RlLnNldERpYWdyYW0oZ2V0RGlhZ3JhbSgpKTsKLQkJfQotCQl3cGROb2RlLnNldE9iamVjdCh3cGQpOwotCQlyZXR1cm4gd3BkTm9kZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcG9wdWxhdGVOb2RlcyhPYmplY3QgbmV3T2JqZWN0KXsKLQkJaWYgKG5ld09iamVjdCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlMaXN0IHdwbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChnZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKSB7Ci0JCQkJaWYgKCEoKFRhc2tEZXNjcmlwdG9yKSBuZXdPYmplY3QpLmdldE1hbmRhdG9yeUlucHV0KCkuaXNFbXB0eSgpKQotCQkJCQl3cGxpc3QuYWRkQWxsKCgoVGFza0Rlc2NyaXB0b3IpIG5ld09iamVjdCkKLQkJCQkJCQkuZ2V0TWFuZGF0b3J5SW5wdXQoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghKChUYXNrRGVzY3JpcHRvcikgbmV3T2JqZWN0KS5nZXRPdXRwdXQoKS5pc0VtcHR5KCkpCi0JCQkJCXdwbGlzdC5hZGRBbGwoKChUYXNrRGVzY3JpcHRvcikgbmV3T2JqZWN0KS5nZXRPdXRwdXQoKSk7Ci0JCQl9Ci0KLQkJCUlGaWx0ZXIgZmlsdGVyID0gZ2V0RmlsdGVyKCk7Ci0JCQlDb2xsZWN0aW9uIGFsbEVsZW1lbnRzID0gKChBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKSBnZXREaWFncmFtKCkpCi0JCQkJCS5nZXRBbGxCcmVha2Rvd25FbGVtZW50cygpOwotCQkJQXJyYXlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjcmlwdG9yID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgaXRlcgotLy8JCQkJCQkubmV4dCgpOwotLy8JCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQod3BEZXNjcmlwdG9yKSkgewotLy8JCQkJCU5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywKLS8vCQkJCQkJCXdwRGVzY3JpcHRvcik7Ci0vLwkJCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotLy8JCQkJCQlub2RlID0gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSh3cERlc2NyaXB0b3IpOwotLy8JCQkJCQkoKE5hbWVkTm9kZUltcGwpIG5vZGUpLnNldEl0ZW1Qcm92aWRlcihhbGxFbGVtZW50cyk7Ci0vLwkJCQkJfQotLy8JCQkJCW5vZGVzLmFkZChub2RlKTsKLS8vCQkJCX0KLS8vCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFsbEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJT2JqZWN0IHdwRGVzY3JpcHRvciA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCQkJaWYod3BEZXNjcmlwdG9yIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKXsKLQkJCQkJaWYoVG5nVXRpbC5jb250YWlucyh3cGxpc3QsIHdwRGVzY3JpcHRvcikpewotCQkJCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQod3BEZXNjcmlwdG9yKSkgewotCQkJCQkJCU5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywKLQkJCQkJCQkJCXdwRGVzY3JpcHRvcik7Ci0JCQkJCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCQkJCQlub2RlID0gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKXdwRGVzY3JpcHRvcik7Ci0JCQkJCQkJCSgoTmFtZWROb2RlSW1wbCkgbm9kZSkuc2V0SXRlbVByb3ZpZGVyKGFsbEVsZW1lbnRzKTsKLQkJCQkJCQl9Ci0JCQkJCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCX0KLQkJCX0KLQkJCXNlbGVjdE5vZGVzKG5vZGVzKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGROb2RlKENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlDb2xsZWN0aW9uIG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdGVyCi0JCQkJCS5uZXh0KCk7Ci0JCQlhZGROb2RlKG5vZGVzLCBkZXNjcmlwdG9yKTsKLQkJfQotCi0JCWdldE5vZGVzKCkuYWRkQWxsKG5vZGVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVOb2RlKE9iamVjdCBvbGRWYWx1ZSkgewotCQlDb2xsZWN0aW9uIHJlbW92ZWROb2RlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChvbGRWYWx1ZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlOb2RlIG5vZGUgPSBmaW5kTm9kZSgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBnZXREaWFncmFtKCksCi0JCQkJCWdldE9iamVjdCgpKTsKLQkJCWdldERpYWdyYW0oKS5nZXROb2RlcygpLnJlbW92ZShub2RlKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChub2RlLmdldE9iamVjdCgpID09IG9sZFZhbHVlKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCQlyZW1vdmVkTm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JCS8vIHB1c2hCYWNrVG9EaWFncmFtKHJlbW92ZWROb2Rlcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTm9kZShPYmplY3QgZGVzY3JpcHRvcikgewotCQlhZGROb2RlKGdldE5vZGVzKCksIGRlc2NyaXB0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGROb2RlKENvbGxlY3Rpb24gbm9kZXMsIE9iamVjdCBkZXNjcmlwdG9yKSB7Ci0JCQotCQlpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlOb2RlIG5vZGUgPSBmaW5kTm9kZSgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBnZXREaWFncmFtKCksCi0JCQkJCWRlc2NyaXB0b3IpOwotCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCW5vZGUgPSAoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKSkKLQkJCQkJCS5jcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZSgKLQkJCQkJCQkJKFRhc2tEZXNjcmlwdG9yKSBkZXNjcmlwdG9yLCB0aGlzLnR5cGUpOwotCQkJCWdldERpYWdyYW0oKS5nZXROb2RlcygpLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCQlpZihkZXNjcmlwdG9yIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKXsKLQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgZGlhZ3JhbSA9IChBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKSBnZXREaWFncmFtKCk7Ci0JCQlOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKHRoaXMgLAotCQkJCQlkZXNjcmlwdG9yKTsKLQkJCWlmIChub2RlID09IG51bGwpIHsKLQkJCQlpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcil7Ci0JCQkJCW5vZGUgPSBkaWFncmFtLmNyZWF0ZU5vZGUoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZGVzY3JpcHRvcik7Ci0JCQkJfQotCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvbGRWYWx1ZQotCSAqLwotLy8JcHJpdmF0ZSB2b2lkIHJlbW92ZU5vZGUoQ29sbGVjdGlvbiBlbGVtZW50cykgewotLy8JCUNvbGxlY3Rpb24gbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLS8vCQkJaWYgKGVsZW1lbnRzLmNvbnRhaW5zKG5vZGUuZ2V0T2JqZWN0KCkpKSB7Ci0vLwkJCQlub2Rlcy5hZGQobm9kZSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJZ2V0Tm9kZXMoKS5yZW1vdmVBbGwobm9kZXMpOwotLy8JCXB1c2hCYWNrVG9EaWFncmFtKG5vZGVzKTsKLS8vCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSB7Ci0JCXJldHVybiBUYXNrRGVzY3JpcHRvckFkYXB0ZXIuY2xhc3M7Ci0JfQotCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKCkgewotCQlpZiAoZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLklOUFVUUykgewotCQkJcmV0dXJuIHN1cGVyLmdldExvY2F0aW9uKCk7Ci0JCX0KLQkJaWYgKGdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0TG9jYXRpb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBuZXcgUG9pbnQoLTEsIC0xKTsKLQkJfQotCX0KLQotCXB1YmxpYyBHcmFwaE5vZGUgZ2V0R3JhcGhOb2RlKE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCkgewotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQlpZiAoZ2V0VU1BRGlhZ3JhbSgpID09IG51bGwpIHsKLQkJCQkvLyBuZXcgTWV0aG9kRWxlbWVudAotCQkJCS8vCi0JCQkJcmV0dXJuIGNyZWF0ZUdyYXBoTm9kZShtZXRob2RFbGVtZW50KTsKLQkJCX0KLQkJCUdyYXBoTm9kZSBub2RlID0gZmluZEdyYXBoTm9kZShnZXRVTUFEaWFncmFtKCksIG1ldGhvZEVsZW1lbnQpOwotCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCW5vZGUgPSBjcmVhdGVHcmFwaE5vZGUobWV0aG9kRWxlbWVudCk7Ci0JCQkJLy8gY3JlYXRlR3JhcGhDb25uZWN0b3JzKG5vZGUsIGdldFVNQURpYWdyYW0oKSk7Ci0JCQkJZ2V0VU1BRGlhZ3JhbSgpLmdldENvbnRhaW5lZCgpLmFkZChub2RlKTsKLQkJCX0KLQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBHcmFwaE5vZGUgZmluZEdyYXBoTm9kZShEaWFncmFtIGRpYWdyYW0sIE9iamVjdCBtZXRob2RFbGVtZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlHcmFwaE5vZGUgZWxlbWVudCA9IChHcmFwaE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQuZ2V0U2VtYW50aWNNb2RlbCgpIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZQotCQkJCQkmJiBtZXRob2RFbGVtZW50ID09ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgZWxlbWVudAotCQkJCQkJCS5nZXRTZW1hbnRpY01vZGVsKCkpLmdldEVsZW1lbnQoKSkgewotCi0JCQkJTGlzdCBsaXN0ID0gZWxlbWVudC5nZXRMaXN0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFkpOwotCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRQcm9wZXJ0eUJ5S2V5KGxpc3QsCi0JCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfV09SS19QUk9EVUNUX0NPTVBPU0lURV9UWVBFKTsKLQkJCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgdHlwZVN0cmluZyA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JCQkJCWlmICh0eXBlU3RyaW5nICE9IG51bGwpIHsKLQkJCQkJCWlmIChnZXRUeXBlKCkgPT0gbmV3IEludGVnZXIodHlwZVN0cmluZykuaW50VmFsdWUoKSkKLQkJCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEdyYXBoTm9kZSBjcmVhdGVHcmFwaE5vZGUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHcmFwaE5vZGUoKTsKLQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBtb2RlbEJyaWRnZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQkJbW9kZWxCcmlkZ2Uuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJZ3JhcGhOb2RlLnNldFNlbWFudGljTW9kZWwobW9kZWxCcmlkZ2UpOwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50IHBvaW50ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9pbnQoKTsKLQkJcG9pbnQuc2V0WChuZXcgRG91YmxlKC0xKSk7Ci0JCXBvaW50LnNldFkobmV3IERvdWJsZSgtMSkpOwotCQlncmFwaE5vZGUuc2V0UG9zaXRpb24ocG9pbnQpOwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbiBkaW0gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaW1lbnNpb24oKTsKLQkJZGltLnNldFdpZHRoKG5ldyBEb3VibGUoLTEpKTsKLQkJZGltLnNldEhlaWdodChuZXcgRG91YmxlKC0xKSk7Ci0JCWdyYXBoTm9kZS5zZXRTaXplKGRpbSk7Ci0KLQkJLy8gRm9yIHNldHRpbmcgdHlwZSBvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZQotCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb3BlcnR5KCk7Ci0JCXByb3BlcnR5LnNldEtleShHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfV09SS19QUk9EVUNUX0NPTVBPU0lURV9UWVBFKTsKLQkJcHJvcGVydHkuc2V0VmFsdWUobmV3IEludGVnZXIoZ2V0VHlwZSgpKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWxpc3QuYWRkKHByb3BlcnR5KTsKLQkJZ3JhcGhOb2RlLnNldChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZLCBsaXN0KTsKLQkJcmV0dXJuIGdyYXBoTm9kZTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBmaW5kTm9kZShBY3Rpdml0eURldGFpbERpYWdyYW0gZGlhZ3JhbSwgT2JqZWN0IG9iamVjdCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIGVsZW1lbnQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0ID09IGVsZW1lbnQuZ2V0T2JqZWN0KCkKLQkJCQkJJiYgZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlKSB7Ci0JCQkJaWYgKCgoV29ya1Byb2R1Y3RDb21wb3NpdGUpIGVsZW1lbnQpLmdldFR5cGUoKSA9PSB0aGlzLnR5cGUpCi0JCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE1ldGhvZEVsZW1lbnRBZGFwdGVyKCkgewotCQlpZihtZXRob2RFbGVtZW50QWRhcHRlciA9PSBudWxsKSB7Ci0JCQltZXRob2RFbGVtZW50QWRhcHRlciA9IG5ldyBUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kRWxlbWVudEFkYXB0ZXI7Ci0JfQotfSAvLyBXb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGYzZGViNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklBZGFwdGVyRmFjdG9yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklXUEREaWFncmFtQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JbXBsIGV4dGVuZHMgRGlhZ3JhbUltcGwgaW1wbGVtZW50cwotCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIHsKLQlwcml2YXRlIGNsYXNzIFdQRERpYWdyYW1DaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEFjdGl2aXR5QWRhcHRlciBpbXBsZW1lbnRzCi0JCQlJV1BERGlhZ3JhbUNoYW5nZUxpc3RlbmVyIHsKLQotCX07Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJZGlhZ3JhbUNoYW5nZUxpc3RlbmVyID0gbmV3IFdQRERpYWdyYW1DaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBDbGFzcyBnZXREaWFncmFtQ2hhbmdlTGlzdGVuZXJUeXBlKCkgewotCQlyZXR1cm4gSVdQRERpYWdyYW1DaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBZGFwdGVyRmFjdG9yeVtdIERFRkFVTFRfQURBUFRFUl9GQUNUT1JJRVMgPSB7CQkJCi0JCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgCi0JfTsgCi0KLQkvLwotCS8vIFN0YXJ0IGN1c3RvbSBjb2RlCi0JLy8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbigpIHsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSBudWxsOwotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCWlmICh3cmFwcGVyICE9IG51bGwpIHsKLQkJCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NzU1MgotCQkJTGlzdCB3cmFwcGVycyA9IFByb2Nlc3NVdGlsLmdldFdyYXBwZXJzKHdyYXBwZXIsIERFRkFVTFRfQURBUFRFUl9GQUNUT1JJRVMpOwotCQkJaWYod3JhcHBlcnMgIT0gbnVsbCAmJiB3cmFwcGVycy5zaXplKCkgPiAwKXsKLQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcil3cmFwcGVycy5nZXQoMCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGdldE9iamVjdCgpLAotCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJfSBlbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIHsKLQkJCQlhZGFwdGVyRmFjdG9yeSA9ICgoSUFkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCQkuZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCQkJZ2V0T2JqZWN0KCksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJLy8gcmV0dXJuIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZ2V0T2JqZWN0KCkpOwotCQkJLy8gY29tbWVudGVkIGFib3ZlIGxpbmUsIEZvciBkaWFncmFtcyAtIHJvbGx1cCBzaG91bGQgYmUgZmFsc2UsIGZvcgotCQkJLy8gaGFuZGxpbmcgcm9sbHVwIHN0YXRlIGJlbG93IGNvZGUuCi0JCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZXh0cmFjdENoaWxkcmVuKGFkYXB0ZXIsIGdldE9iamVjdCgpLCBjaGlsZHJlbik7Ci0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTm9kZXMoKSB7Ci0JCS8vIEFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0T2JqZWN0KCk7Ci0KLQkJLy8gZ2V0IGFsbCBXb3JrUHJvZHVjdERlc2NyaXB0b3JzIHVuZGVyIHRoZSBhY3Rpdml0eQotCQkvLwotCQlzdXBlci5wb3B1bGF0ZU5vZGVzKCk7Ci0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikKLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChhY3QsCi0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0KLQkJLy8gQXJyYXlMaXN0IHdwRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFycmF5TGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGUpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdE5vZGUgbm9kZSA9IChXb3JrUHJvZHVjdE5vZGUpIEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywgZWxlbWVudCk7Ci0JCQkJaWYobm9kZSA9PSBudWxsKSB7Ci0JCQkJCW5vZGUgPSAoV29ya1Byb2R1Y3ROb2RlKSB0b05vZGUoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQkJCX0KLQkJCQlpZiAoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGU7Ci0JCQkJCWlmICh3cmFwcGVyLmlzUmVhZE9ubHkoKSkgewotCQkJCQkJKChOYW1lZE5vZGVJbXBsKSBub2RlKS5pdGVtUHJvdmlkZXIgPSB3cmFwcGVyOwotCQkJCQkJbm9kZS5zZXRSZWFkT25seSh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQlub2RlLnNldFR5cGUoMSk7Ci0JCQkJfQotCQkJCWlmICgoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJCW5vZGUuc2V0VHlwZSgyKTsKLQkJCQl9Ci0JCQkJaWYgKCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgT3V0Y29tZSkgewotCQkJCQlub2RlLnNldFR5cGUoMyk7Ci0JCQkJfQotCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCQlzZWxlY3ROb2Rlcyhub2Rlcyk7Ci0JfQotCXByb3RlY3RlZCBOb2RlIHRvTm9kZShNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcil7Ci0JCQlyZXR1cm4gc3VwZXIudG9Ob2RlKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBOb2RlIG5ld05vZGUoKSB7Ci0JCXJldHVybiBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0Tm9kZSgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEdyYXBoaWNhbERhdGFIZWxwZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0QnJlYWtkb3duRWxlbWVudFR5cGUoKSB7Ci0JCXJldHVybiBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3M7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9VbWFNb2RlbChpbnQgcG9zaXRpb24sIE5vZGUgYWRkZWROb2RlKSB7CQkKLQkJaWYgKGFkZGVkTm9kZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCSgoQWN0aXZpdHkpIGdldE9iamVjdCgpKS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZCgKLQkJCQkJYWRkZWROb2RlLmdldE9iamVjdCgpKTsKLQkJfQotCQlzdXBlci5hZGRUb1VtYU1vZGVsKHBvc2l0aW9uLCBhZGRlZE5vZGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBub2RlQWRkZWQoaW50IGluZGV4LCBOb2RlIG5vZGUpIHsKLQkJaWYobm9kZS5nZXRPYmplY3QoKSA9PSBudWxsKSB7Ci0JCQlpZihub2RlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3ROb2RlKSB7Ci0JCQkJbm9kZS5zZXRPYmplY3QoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vZGVBZGRlZChpbmRleCwgbm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTGlua3MoKSB7Ci0JCXN1cGVyLnBvcHVsYXRlTGlua3MoKTsKLQkJCi0JCS8vIENsZWFuIHVwIHVuLXVzZWQgdGhlIGxpbmtzLgotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKChOb2RlKSBpdGVyLm5leHQoKSk7Ci0JCQlBcnJheUxpc3Q8TGluaz4gbGlua3NUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3Q8TGluaz4oKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBub2RlCi0JCQkJCS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKCFpc1ZhbGlkKGxpbmspKSB7Ci0JCQkJCWxpbmtzVG9SZW1vdmUuYWRkKGxpbmspOwotCQkJCX0KLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaW5rc1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZUxpbmsobGluayk7Ci0JCQl9Ci0JCQlsaW5rc1RvUmVtb3ZlLmNsZWFyKCk7Ci0JCQlsaW5rc1RvUmVtb3ZlID0gbnVsbDsKLQkJfQotCQkvLyBSZWZyZXNoIGxpbmtzIGJhc2VkIG9uIG1vZGVsIGluZm8uCi0JCWZvcihJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspewotCQkJTm9kZSBub2RlID0gKChOb2RlKWl0ZXIubmV4dCgpKTsKLQkJCU9iamVjdCB3YmUgPSBudWxsOwotCQkJLy93YmUgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBub2RlLmdldE9iamVjdCgpOwotCQkJLy9pZih3YmUgIT0gbnVsbCl7Ci0JCQl3YmUgPSAgbm9kZS5nZXRPYmplY3QoKTsKLQkJCWlmKHdiZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcil7Ci0JCQkJTGlzdCBpbXBhY3RlZEJ5ID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3Ipd2JlKS5nZXRJbXBhY3RlZEJ5KCk7Ci0JCQkJaWYoIWltcGFjdGVkQnkuaXNFbXB0eSgpKXsKLQkJCQkJZm9yKEl0ZXJhdG9yIGl0ZXIxID0gaW1wYWN0ZWRCeS5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KXsKLQkJCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBzb3VyY2UgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKWl0ZXIxLm5leHQoKTsKLQkJCQkJCUxpbmsgbGluayA9IGZpbmRMaW5rKG5vZGUsIHNvdXJjZSk7Ci0JCQkJCQlpZihsaW5rID09IG51bGwpewotCQkJCQkJCU5hbWVkTm9kZUltcGwgbm9kZUltcGwgPSAoKE5hbWVkTm9kZUltcGwpIG5vZGUpOwotCQkJCQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCQkJCW5vZGVJbXBsLmFkZEluY29taW5nQ29ubmVjdGlvbihzb3VyY2UpOyAKLQkJCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gb2xkTm90aWZ5OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkKExpbmsgbGluaykgewotCQlpZiAobGluay5nZXRTb3VyY2UoKSA9PSBudWxsIHx8IGxpbmsuZ2V0VGFyZ2V0KCkgPT0gbnVsbAotCQkJCXx8ICFnZXROb2RlcygpLmNvbnRhaW5zKGxpbmsuZ2V0U291cmNlKCkpCi0JCQkJfHwgIWdldE5vZGVzKCkuY29udGFpbnMobGluay5nZXRUYXJnZXQoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIExpbmsgZmluZExpbmsoTm9kZSB0YXJnZXQsIE9iamVjdCBzb3VyY2VMaW5rZWRFbGVtZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhcmdldC5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCQlpZihzb3VyY2UuZ2V0TGlua2VkRWxlbWVudCgpID09IHNvdXJjZUxpbmtlZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gbGluazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19IC8vIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMTRkZjU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIE5vZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbCBleHRlbmRzIE5hbWVkTm9kZUltcGwgaW1wbGVtZW50cwotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJbWV0aG9kRWxlbWVudEFkYXB0ZXIgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFOwotCX0KLQotCXByaXZhdGUgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRBZGFwdGVyIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5hbWVkTm9kZUltcGwuTWV0aG9kRWxlbWVudEFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmICghbm90aWZpY2F0aW9uRW5hYmxlZCkKLQkJCQlyZXR1cm47Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0KLQkJCXRyeSB7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcykpIHsKLQkJCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19TVVBQUkVTU0VEOgotCQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQ6Ci0JCQkJCQlCb29sZWFuIGIgPSAoQm9vbGVhbiltc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCS8vIFRPRE86IGltcGxlbWVudCBoYW5kbGluZyBzdXBwcmVzcy4KLQkJCQkJfQotCQkJCX0KLQkJCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCQkJfQotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTmFtZWROb2RlSW1wbC5NZXRob2RFbGVtZW50QWRhcHRlciNnZXROb2RlKCkKLQkJICovCi0JCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwudGhpczsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5OYW1lZE5vZGVJbXBsI2ZpbmROb2RlKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBmaW5kTm9kZShNZXRob2RFbGVtZW50IGxpbmtlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUoCi0JCQkJKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgZ2V0RGlhZ3JhbSgpLCBsaW5rZWRFbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkgewotCQlyZXR1cm4gV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlci5jbGFzczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjYWRkVG9VTUEob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluaykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRUb1VNQShMaW5rIGxpbmspIHsKLQkJaWYgKCFzdXBlci5hZGRUb1VNQShsaW5rKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0T2JqZWN0KCk7Ci0KLQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24gb2Ygc291cmNlIG5vZGUgYmVmb3JlIGNoYW5naW5nIHRoZSBVTUEgb2JqZWN0Ci0JCS8vIGFzc29jaWF0ZWQgd2l0aCBpdAotCQkvLyBzbyBpdCB3aWxsIG5vdCBjcmVhdGUgZHVwbGljYXRlIGxpbmtzCi0JCS8vCi0JCU5vZGVJbXBsIG5vZGVJbXBsID0gKE5vZGVJbXBsKSBsaW5rLmdldFNvdXJjZSgpOwotCQlib29sZWFuIG5vdGlmeSA9IG5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCWJvb2xlYW4gbm90aWZ5VGFyZ2V0ID0gbm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJdHJ5IHsKLQkJCW5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLS8vCQkJd3BkLmdldE91dHB1dEZyb20oKS5hZGQobGluay5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKSk7Ci0JCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgbGluay5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKTsKLQkJCWlmKHRhc2tEZXNjICE9IG51bGwpIHsKLQkJCQl0YXNrRGVzYy5nZXRPdXRwdXQoKS5hZGQod3BkKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5VGFyZ2V0OwotCQl9Ci0KLQkJLy8gVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIGxpbmsuZ2V0U291cmNlKCkuZ2V0T2JqZWN0KCk7Ci0JCS8vIHRkLmdldE91dHB1dCgpLmFkZChnZXRPYmplY3QoKSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI3JlbW92ZUZyb21VTUEob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluaywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUsIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVNQShMaW5rIGxpbmssIE5vZGUgb2xkU291cmNlLCBOb2RlIG9sZFRhcmdldCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0T2JqZWN0KCk7Ci0vLwkJd3BkLmdldE1hbmRhdG9yeUlucHV0VG8oKS5yZW1vdmUob2xkVGFyZ2V0LmdldE9iamVjdCgpKTsKLQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIG9sZFRhcmdldC5nZXRPYmplY3QoKTsKLQkJaWYodGFza0Rlc2MgIT0gbnVsbCkgewotCQkJdGFza0Rlc2MuZ2V0TWFuZGF0b3J5SW5wdXQoKS5yZW1vdmUod3BkKTsKLQkJfQotCi0JCXN1cGVyLnJlbW92ZUZyb21VTUEobGluaywgb2xkU291cmNlLCBvbGRUYXJnZXQpOwotCX0KLX0gLy8gV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3ROb2RlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdE5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1MTU3NTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdE5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgTm9kZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdE5vZGVJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVJbXBsIGV4dGVuZHMgTmFtZWROb2RlSW1wbCBpbXBsZW1lbnRzCi0JCVdvcmtQcm9kdWN0Tm9kZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRZUEVfRURFRkFVTFQgPSAwOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCXByaXZhdGUgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRBZGFwdGVyIHsKLQotCQlwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotCQkJcmV0dXJuIFdvcmtQcm9kdWN0Tm9kZUltcGwudGhpczsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYgKCFub3RpZmljYXRpb25FbmFibGVkKQotCQkJCXJldHVybjsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQotCQkJdHJ5IHsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzKSkgewotCQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQkJCU1ldGhvZEVsZW1lbnQgb2JqOwotCQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlhZGRJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKG9iaik7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkJCWFkZEluY29taW5nQ29ubmVjdGlvbihvYmopOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKG9iaik7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19TVVBQUkVTU0VEOgotCQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQ6Ci0JCQkJCQlCb29sZWFuIGIgPSAoQm9vbGVhbiltc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWlmKGIuYm9vbGVhblZhbHVlKCk9PXRydWUpewotCQkJCQkJCXJlbW92ZUxpbmtzKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdE5vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCW1ldGhvZEVsZW1lbnRBZGFwdGVyID0gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX05PREU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IG5ld1R5cGUpIHsKLQkJaW50IG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9OT0RFX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX05PREVfX1RZUEU6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFR5cGUoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9OT0RFX19UWVBFOgotCQkJCXNldFR5cGUoKChJbnRlZ2VyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX05PREVfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9OT0RFX19UWVBFOgotCQkJCXJldHVybiB0eXBlICE9IFRZUEVfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFkZFRvVU1BKExpbmsgbGluaykgewotCQlpZiAoIXN1cGVyLmFkZFRvVU1BKGxpbmspKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgbGluawotCQkJCS5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKTsKLQotCQlOb2RlSW1wbCBzb3VyY2UgPSAoTm9kZUltcGwpIGxpbmsuZ2V0U291cmNlKCk7Ci0JCU5vZGVJbXBsIHRhcmdldCA9IChOb2RlSW1wbCkgbGluay5nZXRUYXJnZXQoKTsKLQkJYm9vbGVhbiBub3RpZnlTb3VyY2UgPSBzb3VyY2Uubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJYm9vbGVhbiBub3RpZnlUYXJnZXQgPSB0YXJnZXQubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJdHJ5IHsKLQkJCXNvdXJjZS5ub3RpZmljYXRpb25FbmFibGVkID0gdGFyZ2V0Lm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCWRlc2NyaXB0b3IuZ2V0SW1wYWN0cygpLmFkZChsaW5rLmdldFRhcmdldCgpLmdldE9iamVjdCgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNvdXJjZS5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5U291cmNlOwotCQkJdGFyZ2V0Lm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnlUYXJnZXQ7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tVU1BKExpbmsgbGluaywgTm9kZSBvbGRTb3VyY2UsIE5vZGUgb2xkVGFyZ2V0KSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2xkVGFyZ2V0Ci0JCQkJLmdldE9iamVjdCgpOwotCQkvLyBkaXNhYmxlIGludGVybmFsIG5vdGlmaWNhdGlvbiBvZiB0aGUgdGFyZ2V0IG5vZGUgYmVmb3JlIHJlbW92aW5nIGl0cwotCQkvLyBkZXNjcmlwdG9yIGZyb20gdGhlIGRlcGVuZGVuY3kgbGlzdAotCQkvLwotCQlOYW1lZE5vZGVJbXBsIG5vZGVJbXBsID0gKE5hbWVkTm9kZUltcGwpIG9sZFNvdXJjZTsKLQkJYm9vbGVhbiBub3RpZnkgPSBub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkOwotCQl0cnkgewotCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJZGVzY3JpcHRvci5nZXRJbXBhY3RlZEJ5KCkucmVtb3ZlKG5vZGVJbXBsLmdldE9iamVjdCgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCX0KLQotCQlzdXBlci5yZW1vdmVGcm9tVU1BKGxpbmssIG9sZFNvdXJjZSwgb2xkVGFyZ2V0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVMaW5rcygpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbCkgewotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlR3JhcGhpY2FsRGF0YShsaW5rKTsKLQkJCQkvLyBkaXNhYmxlIGludGVybmFsIG5vdGlmaWNhdGlvbiBvZiB0aGUgc291cmNlIG5vZGUKLQkJCQkvLwotCQkJCU5vZGVJbXBsIHNvdXJjZU5vZGUgPSAoTm9kZUltcGwpIGxpbmsuZ2V0U291cmNlKCk7Ci0JCQkJYm9vbGVhbiBvbGROb3RpZnkgPSBzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJdHJ5IHsKLQkJCQkJc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCWxpbmsuc2V0U291cmNlKG51bGwpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IG9sZE5vdGlmeTsKLQkJCQl9Ci0JCQkJLy9saW5rLnNldFRhcmdldChudWxsKTsKLQkJCQlsaW5rLnNldE9iamVjdChudWxsKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCWlmIChsaW5rLmdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZUdyYXBoaWNhbERhdGEobGluayk7Ci0JCQkJLy8gZGlzYWJsZSBpbnRlcm5hbCBub3RpZmljYXRpb24gb2YgdGhlIHNvdXJjZSBub2RlCi0JCQkJLy8KLQkJCQlOb2RlSW1wbCB0YXJnZXROb2RlID0gKE5vZGVJbXBsKSBsaW5rLmdldFRhcmdldCgpOwotCQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gdGFyZ2V0Tm9kZS5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCXRyeSB7Ci0JCQkJCXRhcmdldE5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQlsaW5rLnNldFRhcmdldChudWxsKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQl0YXJnZXROb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBvbGROb3RpZnk7Ci0JCQkJfQotCQkJCS8vbGluay5zZXRTb3VyY2UobnVsbCk7Ci0JCQkJbGluay5zZXRPYmplY3QobnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci19IC8vIFdvcmtQcm9kdWN0Tm9kZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNiMWRmMTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBhY3Rpdml0eSBkaWFncmFtIG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNjlkOTVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciB0aGUgYWN0aXZpdHkgZGlhZ3JhbSBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvRGlhZ3JhbUluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvRGlhZ3JhbUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTAyNzA1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0RpYWdyYW1JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25zdHJhaW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc3RvcmVzIGRpYWdyYW0gcHVibGlzaCBvcHRpb25zIGFuZCByZWZlcmVuY2VzIHRvIHVzZXItc3BlY2lmaWVkCi0gKiBkaWFncmFtcyB0byByZXBsYWNlIHRoZSBhY3Rpdml0eSBkaWFncmFtLCBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbSwgb3Igd29yawotICogcHJvZHVjdCBkZXBlbmRlbmN5IGRpYWdyYW0gZm9yIGFuIGFjdGl2aXR5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUluZm8gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBRF9JTUFHRV9VUkkgPSAiYWRfaW1hZ2VfdXJpIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfSU1BR0VfVVJJID0gImFkZF9pbWFnZV91cmkiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdQRF9JTUFHRV9VUkkgPSAid3BkX2ltYWdlX3VyaSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9BRF9JTUFHRSA9ICJwdWJsaXNoX2FkX2ltYWdlIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0FERF9JTUFHRSA9ICJwdWJsaXNoX2FkZF9pbWFnZSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9XUERfSU1BR0UgPSAicHVibGlzaF93cGRfaW1hZ2UiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElNSVRFUiA9ICJ8IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgU3RyaW5nIEFEX0ltYWdlVVJJOwotCi0JcHJpdmF0ZSBTdHJpbmcgQUREX0ltYWdlVVJJOwotCi0JcHJpdmF0ZSBTdHJpbmcgV1BEX0ltYWdlVVJJOwotCi0JcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hBREltYWdlOwotCi0JcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hBRERJbWFnZTsKLQotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoV1BESW1hZ2U7Ci0KLQlwcml2YXRlIENvbnN0cmFpbnQgY29uc3RyYWludDsKLQotCXByaXZhdGUgU3VwcG9ydGluZ01hdGVyaWFsIGFjdGl2aXR5RGlhZ3JhbTsKLQotCXByaXZhdGUgU3VwcG9ydGluZ01hdGVyaWFsIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLQotCXByaXZhdGUgU3VwcG9ydGluZ01hdGVyaWFsIHdwZERpYWdyYW07Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGFuZCBsb2FkcyBhIERpYWdyYW1JbmZvIGluc3RhbmNlIGZvciBhIGdpdmVuIGFjdGl2aXR5Ci0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICovCi0JcHVibGljIERpYWdyYW1JbmZvKEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQkJcmVmcmVzaCgpOwotCX0KLQotCXByaXZhdGUgRGlhZ3JhbUluZm8oKSB7Ci0JCUFEX0ltYWdlVVJJID0gQUREX0ltYWdlVVJJID0gV1BEX0ltYWdlVVJJID0gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIERpYWdyYW1JbmZvIGxvYWQoKSB7Ci0JCURpYWdyYW1JbmZvIGluZm8gPSBuZXcgRGlhZ3JhbUluZm8oKTsKLQkJZm9yIChTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihjb25zdHJhaW50LmdldEJvZHkoKSwKLQkJCQlERUxJTUlURVIpOyB0b2tlbnMuaGFzTW9yZVRva2VucygpOykgewotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5zLm5leHRUb2tlbigpOwotCQkJaW50IGlkID0gdG9rZW4uaW5kZXhPZignPScpOwotCQkJaW50IG1heCA9IHRva2VuLmxlbmd0aCgpIC0gMTsKLQkJCWlmIChpZCAhPSAtMSAmJiBpZCA8IG1heCkgewotCQkJCVN0cmluZyBrZXkgPSB0b2tlbi5zdWJzdHJpbmcoMCwgaWQpOwotCQkJCWlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShBRF9JTUFHRV9VUkkpKSB7Ci0JCQkJCWluZm8uQURfSW1hZ2VVUkkgPSB0b2tlbi5zdWJzdHJpbmcoaWQgKyAxKTsKLQkJCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKEFERF9JTUFHRV9VUkkpKSB7Ci0JCQkJCWluZm8uQUREX0ltYWdlVVJJID0gdG9rZW4uc3Vic3RyaW5nKGlkICsgMSk7Ci0JCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShXUERfSU1BR0VfVVJJKSkgewotCQkJCQlpbmZvLldQRF9JbWFnZVVSSSA9IHRva2VuLnN1YnN0cmluZyhpZCArIDEpOwotCQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoUFVCTElTSF9BRF9JTUFHRSkpIHsKLQkJCQkJaW5mby5wdWJsaXNoQURJbWFnZSA9IEJvb2xlYW4udmFsdWVPZigKLQkJCQkJCQl0b2tlbi5zdWJzdHJpbmcoaWQgKyAxKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShQVUJMSVNIX0FERF9JTUFHRSkpIHsKLQkJCQkJaW5mby5wdWJsaXNoQURESW1hZ2UgPSBCb29sZWFuLnZhbHVlT2YoCi0JCQkJCQkJdG9rZW4uc3Vic3RyaW5nKGlkICsgMSkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoUFVCTElTSF9XUERfSU1BR0UpKSB7Ci0JCQkJCWluZm8ucHVibGlzaFdQREltYWdlID0gQm9vbGVhbi52YWx1ZU9mKAotCQkJCQkJCXRva2VuLnN1YnN0cmluZyhpZCArIDEpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmUoKSB7Ci0JCWlmIChjb25zdHJhaW50ID09IG51bGwpIHsKLQkJCWNvbnN0cmFpbnQgPSBDb25zdHJhaW50TWFuYWdlci5nZXRDb25zdHJhaW50KGFjdGl2aXR5LAotCQkJCQlDb25zdHJhaW50TWFuYWdlci5BQ0lUSVZZX0RJQUdSQU0sIHRydWUpOwotCQl9Ci0JCWlmIChhY3Rpdml0eURpYWdyYW0gIT0gbnVsbCkgewotCQkJQURfSW1hZ2VVUkkgPSBhY3Rpdml0eURpYWdyYW0uZ2V0R3VpZCgpOwotCQl9Ci0JCWlmIChhY3Rpdml0eURldGFpbERpYWdyYW0gIT0gbnVsbCkgewotCQkJQUREX0ltYWdlVVJJID0gYWN0aXZpdHlEZXRhaWxEaWFncmFtLmdldEd1aWQoKTsKLQkJfQotCQlpZiAod3BkRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQlXUERfSW1hZ2VVUkkgPSB3cGREaWFncmFtLmdldEd1aWQoKTsKLQkJfQotCi0JCURpYWdyYW1JbmZvIGluZm8gPSBsb2FkKCk7Ci0KLQkJaWYgKEFEX0ltYWdlVVJJICE9IG51bGwpIHsKLQkJCWluZm8uQURfSW1hZ2VVUkkgPSBBRF9JbWFnZVVSSTsKLQkJfQotCQlpZiAoQUREX0ltYWdlVVJJICE9IG51bGwpIHsKLQkJCWluZm8uQUREX0ltYWdlVVJJID0gQUREX0ltYWdlVVJJOwotCQl9Ci0JCWlmIChXUERfSW1hZ2VVUkkgIT0gbnVsbCkgewotCQkJaW5mby5XUERfSW1hZ2VVUkkgPSBXUERfSW1hZ2VVUkk7Ci0JCX0KLQkJaW5mby5wdWJsaXNoQURJbWFnZSA9IHB1Ymxpc2hBREltYWdlOwotCQlpbmZvLnB1Ymxpc2hBRERJbWFnZSA9IHB1Ymxpc2hBRERJbWFnZTsKLQkJaW5mby5wdWJsaXNoV1BESW1hZ2UgPSBwdWJsaXNoV1BESW1hZ2U7Ci0KLQkJU3RyaW5nIHN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoQURfSU1BR0VfVVJJKS5hcHBlbmQoJz0nKS5hcHBlbmQoCi0JCQkJaW5mby5BRF9JbWFnZVVSSSkuYXBwZW5kKERFTElNSVRFUikuYXBwZW5kKFBVQkxJU0hfQURfSU1BR0UpCi0JCQkJLmFwcGVuZCgnPScpLmFwcGVuZChTdHJpbmcudmFsdWVPZihpbmZvLnB1Ymxpc2hBREltYWdlKSkKLQkJCQkuYXBwZW5kKERFTElNSVRFUikuYXBwZW5kKEFERF9JTUFHRV9VUkkpLmFwcGVuZCgnPScpLmFwcGVuZCgKLQkJCQkJCVN0cmluZy52YWx1ZU9mKGluZm8uQUREX0ltYWdlVVJJKSkuYXBwZW5kKERFTElNSVRFUikKLQkJCQkuYXBwZW5kKFBVQkxJU0hfQUREX0lNQUdFKS5hcHBlbmQoJz0nKS5hcHBlbmQoCi0JCQkJCQlTdHJpbmcudmFsdWVPZihpbmZvLnB1Ymxpc2hBRERJbWFnZSkpLmFwcGVuZChERUxJTUlURVIpCi0JCQkJLmFwcGVuZChXUERfSU1BR0VfVVJJKS5hcHBlbmQoJz0nKS5hcHBlbmQoCi0JCQkJCQlTdHJpbmcudmFsdWVPZihpbmZvLldQRF9JbWFnZVVSSSkpLmFwcGVuZChERUxJTUlURVIpCi0JCQkJLmFwcGVuZChQVUJMSVNIX1dQRF9JTUFHRSkuYXBwZW5kKCc9JykuYXBwZW5kKAotCQkJCQkJU3RyaW5nLnZhbHVlT2YoaW5mby5wdWJsaXNoV1BESW1hZ2UpKS50b1N0cmluZygpOwotCi0JCWNvbnN0cmFpbnQuc2V0Qm9keShzdHIpOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyB0aGlzIERpYWdyYW1JbmZvIG9iamVjdCBmcm9tIHRoZSBtb2RlbAotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCWNvbnN0cmFpbnQgPSBDb25zdHJhaW50TWFuYWdlci5nZXRDb25zdHJhaW50KGFjdGl2aXR5LAotCQkJCUNvbnN0cmFpbnRNYW5hZ2VyLkFDSVRJVllfRElBR1JBTSwgZmFsc2UpOwotCQlpZiAoY29uc3RyYWludCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlEaWFncmFtSW5mbyBpbmZvID0gbG9hZCgpOwotCi0JCUFEX0ltYWdlVVJJID0gaW5mby5BRF9JbWFnZVVSSTsKLQkJQUREX0ltYWdlVVJJID0gaW5mby5BRERfSW1hZ2VVUkk7Ci0JCVdQRF9JbWFnZVVSSSA9IGluZm8uV1BEX0ltYWdlVVJJOwotCQlwdWJsaXNoQURJbWFnZSA9IGluZm8ucHVibGlzaEFESW1hZ2U7Ci0JCXB1Ymxpc2hBRERJbWFnZSA9IGluZm8ucHVibGlzaEFEREltYWdlOwotCQlwdWJsaXNoV1BESW1hZ2UgPSBpbmZvLnB1Ymxpc2hXUERJbWFnZTsKLQotCQlhY3Rpdml0eURpYWdyYW0gPSBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoQURfSW1hZ2VVUkkpOwotCQlhY3Rpdml0eURldGFpbERpYWdyYW0gPSBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoQUREX0ltYWdlVVJJKTsKLQkJd3BkRGlhZ3JhbSA9IGdldFN1cHBvcnRpbmdNYXRlcmlhbChXUERfSW1hZ2VVUkkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QURfSW1hZ2VVUkkoKSB7Ci0JCXJldHVybiBBRF9JbWFnZVVSSTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFERF9JbWFnZVVSSSgpIHsKLQkJcmV0dXJuIEFERF9JbWFnZVVSSTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdQRF9JbWFnZVVSSSgpIHsKLQkJcmV0dXJuIFdQRF9JbWFnZVVSSTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcHRpb24gdG8gcHVibGlzaCB1c2VyLXNwZWNpZmllZCBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbQotCSAqIGluc3RlYWQuCi0JICogCi0JICogQHJldHVybgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUHVibGlzaEFEREltYWdlKCkgewotCQlyZXR1cm4gcHVibGlzaEFEREltYWdlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG9wdGlvbiB0byBwdWJsaXNoIHVzZXItc3BlY2lmaWVkIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtCi0JICogaW5zdGVhZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaEFEREltYWdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaEFEREltYWdlKGJvb2xlYW4gcHVibGlzaEFEREltYWdlKSB7Ci0JCXRoaXMucHVibGlzaEFEREltYWdlID0gcHVibGlzaEFEREltYWdlOwotCQlzYXZlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgb3B0aW9uIHRvIHB1Ymxpc2ggdXNlci1zcGVjaWZpZWQgYWN0aXZpdHkgZGlhZ3JhbSBpbnN0ZWFkLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eURpYWdyYW0oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblB1Ymxpc2hBREltYWdlKCkgewotCQlyZXR1cm4gcHVibGlzaEFESW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgb3B0aW9uIHRvIHB1Ymxpc2ggdXNlci1zcGVjaWZpZWQgaW1hZ2UgZm9yIGFjdGl2aXR5IGRpYWdyYW0KLQkgKiBpbnN0ZWFkIG9mIHRoZSBhY3Rpdml0eSBkaWFncmFtCi0JICogCi0JICogQHBhcmFtIHB1Ymxpc2hBREltYWdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaEFESW1hZ2UoYm9vbGVhbiBwdWJsaXNoQURJbWFnZSkgewotCQl0aGlzLnB1Ymxpc2hBREltYWdlID0gcHVibGlzaEFESW1hZ2U7Ci0JCXNhdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcHRpb24gdG8gcHVibGlzaCB1c2VyLXNwZWNpZmllZCB3b3JrIHByb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtCi0JICogaW5zdGVhZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogQHNlZSAjZ2V0V1BERGlhZ3JhbSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUHVibGlzaFdQREltYWdlKCkgewotCQlyZXR1cm4gcHVibGlzaFdQREltYWdlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG9wdGlvbiB0byBwdWJsaXNoIHVzZXItc3BlY2lmaWVkIGltYWdlIGZvciB3b3JrIHByb2R1Y3QKLQkgKiBkZXBlbmRlbmN5IGRpYWdyYW0gaW5zdGVhZCBvZiB0aGUgd29yayBwcm9kdWN0IGRlcGVuZGVuY3kgZGlhZ3JhbQotCSAqIAotCSAqIEBwYXJhbSBwdWJsaXNoV1BESW1hZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoV1BESW1hZ2UoYm9vbGVhbiBwdWJsaXNoV1BESW1hZ2UpIHsKLQkJdGhpcy5wdWJsaXNoV1BESW1hZ2UgPSBwdWJsaXNoV1BESW1hZ2U7Ci0JCXNhdmUoKTsKLQl9Ci0KLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsIGdldEFjdGl2aXR5RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RGlhZ3JhbTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHVzZXItc3BlY2lmaWVkIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtLgotCSAqIAotCSAqIEByZXR1cm4gYSB7QGxpbmsgU3VwcG9ydGluZ01hdGVyaWFsfSB3aXRoIHRoZSBkaWdyYW0gaW4gaXRzIG1haW4KLQkgKiAgICAgICAgIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIFN1cHBvcnRpbmdNYXRlcmlhbCBnZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKSB7Ci0JCXJldHVybiBhY3Rpdml0eURldGFpbERpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB1c2VyLXNwZWNpZmllZCB3b3JrIHByb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtLgotCSAqIAotCSAqIEByZXR1cm4gYSB7QGxpbmsgU3VwcG9ydGluZ01hdGVyaWFsfSB3aXRoIHRoZSBkaWdyYW0gaW4gaXRzIG1haW4KLQkgKiAgICAgICAgIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIFN1cHBvcnRpbmdNYXRlcmlhbCBnZXRXUEREaWFncmFtKCkgewotCQlyZXR1cm4gd3BkRGlhZ3JhbTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXUEREaWFncmFtKFN1cHBvcnRpbmdNYXRlcmlhbCB3cGREaWFncmFtKSB7Ci0JCWlmICh0aGlzLndwZERpYWdyYW0gIT0gd3BkRGlhZ3JhbSkgewotCQkJU3VwcG9ydGluZ01hdGVyaWFsIG9sZCA9IHRoaXMud3BkRGlhZ3JhbTsKLQkJCXRoaXMud3BkRGlhZ3JhbSA9IHdwZERpYWdyYW07Ci0JCQl1cGRhdGUob2xkLCB3cGREaWFncmFtKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbCBhY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJaWYgKHRoaXMuYWN0aXZpdHlEZXRhaWxEaWFncmFtICE9IGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQkJU3VwcG9ydGluZ01hdGVyaWFsIG9sZCA9IHRoaXMuYWN0aXZpdHlEZXRhaWxEaWFncmFtOwotCQkJdGhpcy5hY3Rpdml0eURldGFpbERpYWdyYW0gPSBhY3Rpdml0eURldGFpbERpYWdyYW07Ci0JCQl1cGRhdGUob2xkLCBhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZpdHlEaWFncmFtKFN1cHBvcnRpbmdNYXRlcmlhbCBhY3Rpdml0eURpYWdyYW0pIHsKLQkJaWYgKHRoaXMuYWN0aXZpdHlEaWFncmFtICE9IGFjdGl2aXR5RGlhZ3JhbSkgewotCQkJU3VwcG9ydGluZ01hdGVyaWFsIG9sZCA9IHRoaXMuYWN0aXZpdHlEaWFncmFtOwotCQkJdGhpcy5hY3Rpdml0eURpYWdyYW0gPSBhY3Rpdml0eURpYWdyYW07Ci0JCQl1cGRhdGUob2xkLCBhY3Rpdml0eURpYWdyYW0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgU3VwcG9ydGluZ01hdGVyaWFsIG9iamVjdCBmb3IgdGhlIGRpYWdyYW0gd2l0aCB0aGUgZ2l2ZW4gVVJJCi0JICogCi0JICogQHBhcmFtIGRpYWdyYW1VUkkKLQkgKiBAcmV0dXJuIG51bGwgb2YgdGhlIFN1cHBvcnRpbmdNYXRlcmlhbCBvYmplY3QgY291bGQgbm90IGJlIGZvdW5kIGluIHRoZQotCSAqICAgICAgICAgbGlicmFyeQotCSAqLwotCXByaXZhdGUgU3VwcG9ydGluZ01hdGVyaWFsIGdldFN1cHBvcnRpbmdNYXRlcmlhbChTdHJpbmcgZGlhZ3JhbVVSSSkgewotCQkvLyBkaWFncmFtVVJJIGlzIHRoZSBHVUlEIG9mIHRoZSBzdXBwb3J0aW5nIG1hdGVyaWFsIHRoYXQgbXVzdCBiZSBpbiB0aGUKLQkJLy8gbGlzdAotCQkvLyBvZiBzdXBwb3J0aW5nIG1hdGVyaWFscyBvZiB0aGUgYWN0aXZpdHkKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aXZpdHkuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJU3VwcG9ydGluZ01hdGVyaWFsIGUgPSAoU3VwcG9ydGluZ01hdGVyaWFsKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlLmdldEd1aWQoKS5lcXVhbHMoZGlhZ3JhbVVSSSkpIHsKLQkJCQlyZXR1cm4gZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlKFN1cHBvcnRpbmdNYXRlcmlhbCBvbGQsIFN1cHBvcnRpbmdNYXRlcmlhbCBuZXUpIHsKLQkJaWYgKG9sZCAhPSBudWxsKSB7Ci0JCQlhY3Rpdml0eS5nZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkucmVtb3ZlKG9sZCk7Ci0JCX0KLQkJaWYgKG5ldSAhPSBudWxsKSB7Ci0JCQlhY3Rpdml0eS5nZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkuYWRkKG5ldSk7Ci0JCX0KLQkJc2F2ZSgpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gc3VwcG9ydGluZyBtYXRlcmlhbCBpcyBhIHVzZXItZGVmaW5lZCBkaWFncmFtIG9mIHRoaXMKLQkgKiBEaWFncmFtSW5mbydzIGFjdGl2aXR5Ci0JICogCi0JICogQHBhcmFtIHNtCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlhZ3JhbShTdXBwb3J0aW5nTWF0ZXJpYWwgc20pIHsKLQkJcmV0dXJuIHNtICE9IG51bGwKLQkJCQkmJiAoc20gPT0gYWN0aXZpdHlEaWFncmFtIHx8IHNtID09IGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSB8fCBzbSA9PSB3cGREaWFncmFtKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0RpYWdyYW1NYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0RpYWdyYW1NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4MzNiNjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9EaWFncmFtTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci0KLS8qKgotICogRXh0ZW5zaW9uIHRvIGNvbnRyaWJ1dGUgdG8gZXh0ZW5zaW9uIHBvaW50Ci0gKiAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5kaWFncmFtTWFuYWdlciIKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdW4gMjcsIDIwMDYKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1NYW5hZ2VyIGltcGxlbWVudHMgSURpYWdyYW1NYW5hZ2VyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlciNnZXREaWFncmFtKG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHksCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbShBY3Rpdml0eSBhY3QsIGludCB0eXBlKSB7Ci0JCXJldHVybiBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFVNQURpYWdyYW0oYWN0LCB0eXBlLAotCQkJCWZhbHNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvR3JhcGhpY2FsRGF0YUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9HcmFwaGljYWxEYXRhSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkNWEwOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9HcmFwaGljYWxEYXRhSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uRGlhZ3JhbVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5OYW1lZE5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhpY2FsRGF0YUhlbHBlciB7Ci0JLyoqIERpYWdyYW0gdHlwZSBjb25zdGFudHMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJVklUWV9ESUFHUkFNID0gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNID0gSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTSA9IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTTsKLQotCXN0YXRpYyBmaW5hbCBpbnRbXSBESUFHUkFNX1RZUEVTID0geyBBQ1RJVklUWV9ESUFHUkFNLAotCQkJQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0sIFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0gfTsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBESUFHUkFNX1RZUEVfVEVYVFMgPSB7Ci0JCQlEaWFncmFtUmVzb3VyY2VzLnR5cGVfYWN0aXZpdHksIERpYWdyYW1SZXNvdXJjZXMudHlwZV9XUEQsIERpYWdyYW1SZXNvdXJjZXMudHlwZV9hY3Rpdml0eURldGFpbCB9OyAKLQotCS8qKiBQcm9wZXJ0eSBuYW1lcyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX1RZUEUgPSAid3BDb21wb3NpdGVUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBwcm9wZXJ0eSBuYW1lcyBmb3IgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0gKiovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9BVVRPX0xBWU9VVCA9ICJhdXRvbGF5b3V0IjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfSU5ERVggPSAiaW5kZXgiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHByb3BlcnR5IHZhbHVlcyBjb25zdGFudHMgZm9yIGF1dG9sYXlvdXQgKiovCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9BVVRPX0xBWU9VVF9WQUxVRV9UUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9BVVRPX0xBWU9VVF9WQUxVRV9GQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogVHlwZSBpbmZvIGZvciBVSSBub2RlIChAc2VlIFR5cGVkTm9kZSkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9OT0RFX1NZTkNIX0JBUiA9ICJzeW5jaG5vbml6YXRpb24gYmFyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfTk9ERV9TVEFSVCA9ICJzdGFydCBub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfTk9ERV9FTkQgPSAiZW5kIG5vZGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9OT0RFX0RFQ0lTSU9OID0gImRlY2lzaW9uIG5vZGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9OT0RFX0ZSRUVfVEVYVCA9ICJmcmVlIHRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKiogRGlhZ3JhbSB0eXBlIHN0cmluZyBjb25zdGFudHMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFHUkFNX1dPUktGTE9XID0gIldvcmtmbG93IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR1JBTV9XT1JLX1BST0RVQ1RfREVQRU5ERU5DWSA9ICJXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdSQU1fQUNUSVZJVFlfREVUQUlMID0gIkFjdGl2aXR5IERldGFpbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfRElBR1JBTV9UQVNLU19QRVJfUk9XID0gIkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX1RBU0tTX1BFUl9ST1ciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFBvaW50IHRvUG9pbnQob3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCBwKSB7Ci0JCXJldHVybiBuZXcgUG9pbnQocC5nZXRYKCkuZG91YmxlVmFsdWUoKSwgcC5nZXRZKCkuZG91YmxlVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50IG5ld01vZGVsUG9pbnQoaW50IHgsIGludCB5KSB7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgcCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvaW50KCk7Ci0JCXAuc2V0WChuZXcgRG91YmxlKHgpKTsKLQkJcC5zZXRZKG5ldyBEb3VibGUoeSkpOwotCQlyZXR1cm4gcDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByb3BlcnR5IGZpbmRQcm9wZXJ0eShHcmFwaE5vZGUgbm9kZSwgU3RyaW5nIHByb3BLZXkpIHsKLQkJZm9yIChpbnQgaSA9IG5vZGUuZ2V0UHJvcGVydHkoKS5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJUHJvcGVydHkgcHJvcCA9IChQcm9wZXJ0eSkgbm9kZS5nZXRQcm9wZXJ0eSgpLmdldChpKTsKLQkJCWlmIChwcm9wS2V5LmVxdWFscyhwcm9wLmdldEtleSgpKSkKLQkJCQlyZXR1cm4gcHJvcDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGltZW5zaW9uIG5ld01vZGVsRGltZW5zaW9uKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlEaW1lbnNpb24gc2l6ZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpbWVuc2lvbigpOwotCQlzaXplLnNldFdpZHRoKG5ldyBEb3VibGUod2lkdGgpKTsKLQkJc2l6ZS5zZXRIZWlnaHQobmV3IERvdWJsZShoZWlnaHQpKTsKLQkJcmV0dXJuIHNpemU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGZpbGxDb25uZWN0aW9ucyhOb2RlIG5vZGUsIEdyYXBoTm9kZSBncmFwaE5vZGUpIHsKLQkJYm9vbGVhbiBvbGQgPSBub2RlLmVEZWxpdmVyKCk7Ci0JCXRyeSB7Ci0JCQlub2RlLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0gZGlhZ3JhbSA9IChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKSBub2RlCi0JCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBncmFwaE5vZGUuZ2V0QW5jaG9yYWdlKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUdyYXBoQ29ubmVjdG9yIGNvbm4gPSAoKEdyYXBoQ29ubmVjdG9yKSBpdGVyLm5leHQoKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbm4uZ2V0R3JhcGhFZGdlKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUdyYXBoRWRnZSBlZGdlID0gKEdyYXBoRWRnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZihlZGdlLmdldEFuY2hvcigpLnNpemUoKSA+IDEpIHsgCi0JCQkJCQlHcmFwaENvbm5lY3RvciB0YXJnZXRDb25uZWN0b3I7Ci0JCQkJCQlMaW5rIGxpbmsgPSBudWxsOwotCQkJCQkJaWYgKGVkZ2UuZUNvbnRhaW5lcigpID09IGdyYXBoTm9kZSkgewotCQkJCQkJCXRhcmdldENvbm5lY3RvciA9IChHcmFwaENvbm5lY3RvcikgZWRnZS5nZXRBbmNob3IoKQotCQkJCQkJCS5nZXQoMSk7Ci0JCQkJCQkJR3JhcGhOb2RlIHRhcmdldEdyYXBoTm9kZSA9IChHcmFwaE5vZGUpIHRhcmdldENvbm5lY3RvcgotCQkJCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQkJCQkJaWYgKGdyYXBoTm9kZS5lQ29udGFpbmVyKCkgPT0gdGFyZ2V0R3JhcGhOb2RlCi0JCQkJCQkJCQkuZUNvbnRhaW5lcigpKSB7Ci0JCQkJCQkJCU9iamVjdCBsaW5rZWRPYmplY3QgPSB0YXJnZXRHcmFwaE5vZGU7Ci0JCQkJCQkJCWlmICh0YXJnZXRHcmFwaE5vZGUuZ2V0U2VtYW50aWNNb2RlbCgpIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgewotCQkJCQkJCQkJbGlua2VkT2JqZWN0ID0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSB0YXJnZXRHcmFwaE5vZGUKLQkJCQkJCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCU5vZGUgdGFyZ2V0Tm9kZSA9IGZpbmROb2RlKGRpYWdyYW0sIGxpbmtlZE9iamVjdCk7Ci0JCQkJCQkJCWxpbmsgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmsoKTsKLQkJCQkJCQkJbGluay5zZXRTb3VyY2Uobm9kZSk7Ci0JCQkJCQkJCWxpbmsuc2V0VGFyZ2V0KHRhcmdldE5vZGUpOwotCQkJCQkJCQlsaW5rLnNldE9iamVjdChlZGdlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW5vZGUuZVNldERlbGl2ZXIob2xkKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgTm9kZSBmaW5kTm9kZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGRpYWdyYW0sCi0JCQlHcmFwaE5vZGUgZ05vZGUsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCVNlbWFudGljTW9kZWxCcmlkZ2UgYnJpZGdlID0gZ05vZGUuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQlpZiAoYnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgewotCQkJSU5vZGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IChJTm9kZUNoYW5nZUxpc3RlbmVyKSBVbWFVdGlsCi0JCQkJCS5nZXRBZGFwdGVyKCgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgYnJpZGdlKS5nZXRFbGVtZW50KCksCi0JCQkJCQkJYWRhcHRlclR5cGUpOwotCQkJcmV0dXJuIGxpc3RlbmVyLmdldE5vZGUoKTsKLQkJfQotCi0JCS8vIGdOb2RlIGlzIG5vdCBhIGFjdGl2aXR5J3MgR3JhcGhOb2RlLiBUcnkgdG8gZmluZCBhIE5vZGUgd2l0aCBnTm9kZSBhcwotCQkvLyBhIGxpbmtlZCBvYmplY3QgaW4gdGhlIGRpYWdyYW0uCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgZWxlbWVudCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChnTm9kZSA9PSBlbGVtZW50LmdldE9iamVjdCgpKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgbm9kZSB3aG9zZSBsaW5rZWQgb2JqZWN0IGlzIHRoZSBnaXZlbiBvYmplY3QKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBOb2RlIGZpbmROb2RlKE5vZGVDb250YWluZXIgY29udGFpbmVyLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRhaW5lci5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBlbGVtZW50ID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iamVjdCA9PSBlbGVtZW50LmdldE9iamVjdCgpIHx8IG9iamVjdCA9PSBlbGVtZW50LmdldExpbmtlZEVsZW1lbnQoKSkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIG5vZGUgd2hvc2UgbGlua2VkIG9iamVjdCBvciBvbmUgb2YgaXRzIGJhc2UgaXMgdGhlIGdpdmVuIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTm9kZSBmaW5kTm9kZShOb2RlQ29udGFpbmVyIGNvbnRhaW5lciwgT2JqZWN0IG9iamVjdCwKLQkJCWJvb2xlYW4gY2hlY2tCYXNlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRhaW5lci5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iamVjdCA9PSBub2RlLmdldE9iamVjdCgpKSB7Ci0JCQkJcmV0dXJuIG5vZGU7Ci0JCQl9IGVsc2UgaWYgKGNoZWNrQmFzZQotCQkJCQkmJiBub2RlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJZm9yIChWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoKFZhcmlhYmlsaXR5RWxlbWVudCkgbm9kZQotCQkJCQkJLmdldE9iamVjdCgpKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7IHZlICE9IG51bGw7IHZlID0gdmUKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpIHsKLQkJCQkJaWYgKHZlID09IG9iamVjdCkgewotCQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBOb2RlIGZpbmROb2RlKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBkaWFncmFtLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCU5vZGUgbm9kZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgZWxlbWVudCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGUpIHsKLQkJCQlub2RlID0gZmluZE5vZGUoKE5vZGVDb250YWluZXIpIGVsZW1lbnQsIG9iamVjdCk7Ci0JCQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQl9Ci0JCQlpZiAob2JqZWN0ID09IGVsZW1lbnQuZ2V0T2JqZWN0KCkpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaW5rIGZpbmRMaW5rKE5vZGUgc291cmNlLCBPYmplY3QgdGFyZ2V0TGlua2VkRWxlbWVudCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2UuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJTm9kZSB0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJaWYodGFyZ2V0LmdldExpbmtlZEVsZW1lbnQoKSA9PSB0YXJnZXRMaW5rZWRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGxpbms7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFR5cGVTdHJpbmcoaW50IHR5cGUpIHsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgVHlwZWROb2RlLkRFQ0lTSU9OOgotCQkJcmV0dXJuIEdSQVBIX05PREVfREVDSVNJT047Ci0JCWNhc2UgVHlwZWROb2RlLkVORDoKLQkJCXJldHVybiBHUkFQSF9OT0RFX0VORDsKLQkJY2FzZSBUeXBlZE5vZGUuU1RBUlQ6Ci0JCQlyZXR1cm4gR1JBUEhfTk9ERV9TVEFSVDsKLQkJY2FzZSBUeXBlZE5vZGUuU1lOQ0hfQkFSOgotCQkJcmV0dXJuIEdSQVBIX05PREVfU1lOQ0hfQkFSOwotCQljYXNlIFR5cGVkTm9kZS5GUkVFX1RFWFQ6Ci0JCQlyZXR1cm4gR1JBUEhfTk9ERV9GUkVFX1RFWFQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBHcmFwaE5vZGUgbmV3VHlwZWRHcmFwaE5vZGUoaW50IHR5cGUpIHsKLQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoTm9kZSgpOwotCQlTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCBicmlkZ2UgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpOwotCQlicmlkZ2Uuc2V0VHlwZUluZm8oZ2V0VHlwZVN0cmluZyh0eXBlKSk7Ci0JCWdyYXBoTm9kZS5zZXRTZW1hbnRpY01vZGVsKGJyaWRnZSk7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgcG9pbnQgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb2ludCgpOwotCQlwb2ludC5zZXRYKG5ldyBEb3VibGUoLTEpKTsKLQkJcG9pbnQuc2V0WShuZXcgRG91YmxlKC0xKSk7Ci0JCWdyYXBoTm9kZS5zZXRQb3NpdGlvbihwb2ludCk7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uIGRpbSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpbWVuc2lvbigpOwotCQlkaW0uc2V0V2lkdGgobmV3IERvdWJsZSgtMSkpOwotCQlkaW0uc2V0SGVpZ2h0KG5ldyBEb3VibGUoLTEpKTsKLQkJZ3JhcGhOb2RlLnNldFNpemUoZGltKTsKLQotCQlpZiAodHlwZSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKSB7Ci0JCQlncmFwaE5vZGUuc2V0TmFtZShEaWFncmFtUmVzb3VyY2VzLmFkZEZyZWVUeHQpOyAKLQkJfQotCQlpZiAodHlwZSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKSB7Ci0JCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb3BlcnR5KCk7Ci0JCQlwcm9wZXJ0eS5zZXRLZXkoR1JBUEhfTk9ERV9GUkVFX1RFWFQpOwotCQkJcHJvcGVydHkuc2V0VmFsdWUoRGlhZ3JhbVJlc291cmNlcy5hZGRGcmVlVHh0KTsgCi0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlsaXN0LmFkZChwcm9wZXJ0eSk7Ci0JCQlncmFwaE5vZGUuc2V0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFksIGxpc3QpOwotCQl9Ci0KLQkJcmV0dXJuIGdyYXBoTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGluawotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVHcmFwaGljYWxEYXRhKExpbmsgbGluaykgewotCQkvLyBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUdyYXBoQ29ubmVjdG9yUGFpcihsaW5rLmdldFNvdXJjZSgpLmdldEdyYXBoTm9kZSgpLAotCQkvLyBsaW5rLmdldFRhcmdldCgpLmdldEdyYXBoTm9kZSgpKTsKLQkJCi0JCUdyYXBoRWRnZSBlZGdlID0gKEdyYXBoRWRnZSkgbGluay5nZXRPYmplY3QoKTsKLQkJaWYoZWRnZSAhPSBudWxsKSB7Ci0JCQlHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUdyYXBoRWRnZShlZGdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaW5rCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEdyYXBoaWNhbERhdGEoTGluayBsaW5rKSB7Ci0JCUdyYXBoRWRnZSBlZGdlID0gKEdyYXBoRWRnZSkgbGluay5nZXRPYmplY3QoKTsKLQkJaWYgKGVkZ2UgPT0gbnVsbCkgewotCQkJLy8gbmV3IGxpbmsKLQkJCS8vCi0JCQllZGdlID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRHcmFwaENvbm5lY3RvclBhaXIoCi0JCQkJCWxpbmsuZ2V0U291cmNlKCkuZ2V0R3JhcGhOb2RlKCksCi0JCQkJCWxpbmsuZ2V0VGFyZ2V0KCkuZ2V0R3JhcGhOb2RlKCkpOwotCQkJbGluay5zZXRPYmplY3QoZWRnZSk7Ci0KLQkJCS8vIHNhdmUgdGhlIHNvdXJjZSBlbmQgcG9pbnQgYW5kIHRhcmdldCBlbmQgcG9pbnQgZnJvbSB0aGUgZ2l2ZW4KLQkJCS8vIGxpbmsKLQkJCS8vCi0JCQlsaW5rLnNldFNvdXJjZUVuZFBvaW50KGxpbmsuZ2V0U291cmNlRW5kUG9pbnQoKSk7Ci0JCQlsaW5rLnNldFRhcmdldEVuZFBvaW50KGxpbmsuZ2V0VGFyZ2V0RW5kUG9pbnQoKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyB1bmRvIGRlbGV0ZWQgbGluawotCQkJLy8KLQkJCUdyYXBoTm9kZSBzcmNOb2RlID0gbGluay5nZXRTb3VyY2UoKS5nZXRHcmFwaE5vZGUoKTsKLQkJCUdyYXBoTm9kZSB0YXJnZXROb2RlID0gbGluay5nZXRUYXJnZXQoKS5nZXRHcmFwaE5vZGUoKTsKLQkJCU9iamVjdCBzcmNDb25uZWN0b3IgPSBlZGdlLmdldEFuY2hvcigpLmdldCgwKTsKLQkJCXNyY05vZGUuZ2V0QW5jaG9yYWdlKCkuYWRkKHNyY0Nvbm5lY3Rvcik7Ci0JCQlzcmNOb2RlLmdldENvbnRhaW5lZCgpLmFkZChlZGdlKTsKLQkJCU9iamVjdCB0YXJnZXRDb25uZWN0b3IgPSBlZGdlLmdldEFuY2hvcigpLmdldCgxKTsKLQkJCXRhcmdldE5vZGUuZ2V0QW5jaG9yYWdlKCkuYWRkKHRhcmdldENvbm5lY3Rvcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2VtYW50aWNNb2RlbChMaW5rIGxpbmssIFdvcmtPcmRlciB3b3JrT3JkZXIpIHsKLQkJLy8gc2V0IHRoZSBXb3JrT3JkZXIgYXMgdGhlIGVsZW1lbnQgb2YgdGhlIFNlbWFudGljTW9kZWwgb2YgdGhlIGxpbmsncwotCQkvLyBHcmFwaEVkZ2UKLQkJLy8KLQkJR3JhcGhFZGdlIGVkZ2UgPSAoR3JhcGhFZGdlKSBsaW5rLmdldE9iamVjdCgpOwotCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIGJyaWRnZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQkJYnJpZGdlLnNldEVsZW1lbnQod29ya09yZGVyKTsKLQkJZWRnZS5zZXRTZW1hbnRpY01vZGVsKGJyaWRnZSk7Ci0JfQotCi0JLy8gcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldFNvdXJjZUFjdGl2aXR5Tm9kZXMoVHlwZWROb2RlIHR5cGVkTm9kZSkgewotCS8vIExpc3QgYWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gZ2V0U291cmNlQWN0aXZpdHlOb2RlcyhhY3ROb2RlcywgdHlwZWROb2RlKTsKLQkvLyByZXR1cm4gYWN0Tm9kZXM7Ci0JLy8gfQotCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldFNvdXJjZU5vZGVzKFR5cGVkTm9kZSB0eXBlZE5vZGUsIENsYXNzIHR5cGUpIHsKLQkJTGlzdCBhY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0U291cmNlTm9kZXMoYWN0Tm9kZXMsIHR5cGVkTm9kZSwgdHlwZSk7Ci0JCXJldHVybiBhY3ROb2RlczsKLQl9Ci0KLQkvLyBwdWJsaWMgc3RhdGljIHZvaWQgZ2V0U291cmNlQWN0aXZpdHlOb2RlcyhDb2xsZWN0aW9uIGFjdE5vZGVzLCBUeXBlZE5vZGUKLQkvLyB0eXBlZE5vZGUpIHsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlZE5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7Ci0JLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gTGluayBsaW5rID0gKExpbmspaXRlci5uZXh0KCk7Ci0JLy8gTm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCS8vIGlmKHNvdXJjZSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCS8vIGFjdE5vZGVzLmFkZChzb3VyY2UpOwotCS8vIH0KLQkvLyBlbHNlIGlmKHNvdXJjZSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCS8vIGdldFNvdXJjZUFjdGl2aXR5Tm9kZXMoYWN0Tm9kZXMsIChUeXBlZE5vZGUpIHNvdXJjZSk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0KLQkvLyBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0VGFyZ2V0QWN0aXZpdHlOb2RlcyhUeXBlZE5vZGUgdHlwZWROb2RlKSB7Ci0JLy8gTGlzdCBhY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBnZXRUYXJnZXRBY3Rpdml0eU5vZGVzKGFjdE5vZGVzLCB0eXBlZE5vZGUpOwotCS8vIHJldHVybiBhY3ROb2RlczsKLQkvLyB9Ci0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0VGFyZ2V0Tm9kZXMoVHlwZWROb2RlIHR5cGVkTm9kZSwgQ2xhc3MgdHlwZSkgewotCQlMaXN0IGFjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRUYXJnZXROb2RlcyhhY3ROb2RlcywgdHlwZWROb2RlLCB0eXBlKTsKLQkJcmV0dXJuIGFjdE5vZGVzOwotCX0KLQotCS8vIHB1YmxpYyBzdGF0aWMgdm9pZCBnZXRUYXJnZXRBY3Rpdml0eU5vZGVzKENvbGxlY3Rpb24gYWN0Tm9kZXMsIFR5cGVkTm9kZQotCS8vIHR5cGVkTm9kZSkgewotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkTm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsKLQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBMaW5rIGxpbmsgPSAoTGluaylpdGVyLm5leHQoKTsKLQkvLyBOb2RlIHRhcmdldCA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JLy8gaWYodGFyZ2V0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JLy8gYWN0Tm9kZXMuYWRkKHRhcmdldCk7Ci0JLy8gfQotCS8vIGVsc2UgaWYodGFyZ2V0IGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JLy8gZ2V0VGFyZ2V0QWN0aXZpdHlOb2RlcyhhY3ROb2RlcywgKFR5cGVkTm9kZSkgdGFyZ2V0KTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQotCS8qKgotCSAqIEdldHMgYWxsIG5vZGVzIHdpdGggdGhlIGdpdmVuIHR5cGUgdGhhdCBhcmUgZGlyZWN0IG9yIGluZGlyZWN0IHRhcmdldHMgb2YKLQkgKiB0aGUgZ2l2ZW4gc291cmNlIHR5cGVkTm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0Tm9kZXMKLQkgKiBAcGFyYW0gdHlwZWROb2RlCi0JICogQHBhcmFtIHR5cGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0VGFyZ2V0Tm9kZXMoQ29sbGVjdGlvbiBhY3ROb2RlcywgVHlwZWROb2RlIHR5cGVkTm9kZSwKLQkJCUNsYXNzIHR5cGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCU5vZGUgdGFyZ2V0ID0gbGluay5nZXRUYXJnZXQoKTsKLQkJCWlmICh0eXBlLmlzSW5zdGFuY2UodGFyZ2V0KSkgewotCQkJCWFjdE5vZGVzLmFkZCh0YXJnZXQpOwotCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQlnZXRUYXJnZXROb2RlcyhhY3ROb2RlcywgKFR5cGVkTm9kZSkgdGFyZ2V0LCB0eXBlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRTb3VyY2VOb2RlcyhDb2xsZWN0aW9uIGFjdE5vZGVzLCBUeXBlZE5vZGUgdHlwZWROb2RlLAotCQkJQ2xhc3MgdHlwZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlZE5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJTm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCQkJaWYgKHR5cGUuaXNJbnN0YW5jZShzb3VyY2UpKSB7Ci0JCQkJYWN0Tm9kZXMuYWRkKHNvdXJjZSk7Ci0JCQl9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCWdldFNvdXJjZU5vZGVzKGFjdE5vZGVzLCAoVHlwZWROb2RlKSBzb3VyY2UsIHR5cGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBOb2RlIGdldEZpcnN0U291cmNlTm9kZShUeXBlZE5vZGUgdHlwZWROb2RlLCBDbGFzcyB0eXBlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkTm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCQlpZiAodHlwZS5pc0luc3RhbmNlKHNvdXJjZSkpIHsKLQkJCQlyZXR1cm4gc291cmNlOwotCQkJfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQlzb3VyY2UgPSBnZXRGaXJzdFNvdXJjZU5vZGUoKFR5cGVkTm9kZSkgc291cmNlLCB0eXBlKTsKLQkJCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJCXJldHVybiBzb3VyY2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXIgcmVtb3ZlV29ya09yZGVyKE5hbWVkTm9kZUltcGwgbm9kZSwKLQkJCU9iamVjdCBwcmVkQnJlYWtkb3duRWxlbWVudCkgewotCQlib29sZWFuIG5vdGlmeSA9IG5vZGUuaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlub2RlLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJcmV0dXJuIFVtYVV0aWwucmVtb3ZlV29ya09yZGVyKChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZQotCQkJCQkuZ2V0T2JqZWN0KCksIHByZWRCcmVha2Rvd25FbGVtZW50KTsKLQkJfSBmaW5hbGx5IHsKLQkJCW5vZGUuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChub3RpZnkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXIgYWRkRGVmYXVsdFdvcmtPcmRlcihOYW1lZE5vZGVJbXBsIG5vZGUsCi0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkQnJlYWtkb3duRWxlbWVudCkgewotCQlib29sZWFuIG5vdGlmeSA9IG5vZGUuaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlub2RlLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJcmV0dXJuIFVtYVV0aWwuY3JlYXRlRGVmYXVsdFdvcmtPcmRlcigoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUKLQkJCQkJLmdldE9iamVjdCgpLCBwcmVkQnJlYWtkb3duRWxlbWVudCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlub2RlLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZ5KTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhc2tEZXNjcmlwdG9yCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNOb1JvbGVEZXNjcmlwdG9yQXNzb2NpYXRlZCgKLQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yKSB7Ci0JCXJldHVybiB0YXNrRGVzY3JpcHRvci5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpID09IG51bGw7Ci0JCS8vIGNvbW1lbnRlZCAtIHJlcXVpcmVtZW50cyBub3QgdG8gYWxsb3cgYWRkaXRpb25hbCBwZXJmb3JtZXIgYW5kCi0JCS8vIGFzc2lzdGVkIGJ5IGluIGRpYWdyYW1zLgotCQkvLyAmJiB0YXNrRGVzY3JpcHRvci5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmlzRW1wdHkoKTsKLQkJLy8gJiYgdGFza0Rlc2NyaXB0b3IuZ2V0QXNzaXN0ZWRCeSgpLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhOb2RlQ29udGFpbmVyIGNvbnRhaW5lciwgTm9kZSBub2RlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRhaW5lci5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgPT0gbm9kZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIKLQkJCQkJJiYgY29udGFpbnMoKE5vZGVDb250YWluZXIpIGNoaWxkLCBub2RlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVmcmVzaEZyb21CYXNlKERpYWdyYW0gZGlhZ3JhbSkgewotCQkvLyBmaW5kIHRoZSBiYXNlIGRpYWdyYW0KLQkJLy8KLQkJU2VtYW50aWNNb2RlbEJyaWRnZSBtb2RlbEJyaWRnZSA9IGRpYWdyYW0uZ2V0U2VtYW50aWNNb2RlbCgpOwotCQlpZiAobW9kZWxCcmlkZ2UgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSB7Ci0JCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIHVtYU1vZGVsQnJpZGdlID0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBtb2RlbEJyaWRnZSk7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIHVtYU1vZGVsQnJpZGdlLmdldEVsZW1lbnQoKTsKLQkJCUFjdGl2aXR5IGJhc2UgPSAoQWN0aXZpdHkpIGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoYmFzZSA9PSBudWxsCi0JCQkJCXx8IGFjdC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlRfTElURVJBTCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWludCBkaWFncmFtVHlwZSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldERpYWdyYW1UeXBlKGRpYWdyYW0pOwotCQkJc3dpdGNoIChkaWFncmFtVHlwZSkgewotCQkJY2FzZSBBQ1RJVklUWV9ESUFHUkFNOiB7Ci0JCQkJRGlhZ3JhbSBiYXNlRGlhZ3JhbSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRVTUFEaWFncmFtKGJhc2UsIGRpYWdyYW1UeXBlLCBmYWxzZSk7Ci0JCQkJaWYgKGJhc2VEaWFncmFtID09IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlMaXN0IG9sZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCURpYWdyYW0gY29weSA9IGNvcHlEaWFncmFtKGJhc2VEaWFncmFtKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBiYXNlRGlhZ3JhbS5nZXRDb250YWluZWQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlHcmFwaE5vZGUgYmFzZU5vZGUgPSAoR3JhcGhOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJbW9kZWxCcmlkZ2UgPSBiYXNlTm9kZS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJCWlmIChtb2RlbEJyaWRnZSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIHsKLQkJCQkJCS8vIHRoaXMgaXMgYSBlbGVtZW50J3Mgbm9kZQotCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBtb2RlbEJyaWRnZSkKLQkJCQkJCQkJLmdldEVsZW1lbnQoKTsKLQkJCQkJCUdyYXBoTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZmluZEdyYXBoTm9kZSgKLQkJCQkJCQkJZGlhZ3JhbSwgZSk7Ci0JCQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJb2xkTm9kZXMuYWRkKG5vZGUpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKGlzVUlHcmFwaE5vZGUoYmFzZU5vZGUpKSB7Ci0JCQkJCQlHcmFwaE5vZGUgbm9kZSA9IGZpbmRVSUdyYXBoTm9kZShkaWFncmFtLCBiYXNlTm9kZQotCQkJCQkJCQkuZ2V0R3VpZCgpKTsKLQkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJCQlvbGROb2Rlcy5hZGQobm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyAvLyByZW1vdmUgYWxsIHRoZSBHcmFwaEVkZ2VzIG9mIHRoZSBvbGQgbm9kZXMKLQkJCQkvLyAvLwotCQkJCS8vIExpc3QgcmVtb3ZlRWRnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gb2xkTm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJLy8gR3JhcGhOb2RlIG5vZGUgPSAoR3JhcGhOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbm9kZS5nZXRDb250YWluZWQoKS5pdGVyYXRvcigpOwotCQkJCS8vIGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkvLyBPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgR3JhcGhFZGdlKSB7Ci0JCQkJLy8gcmVtb3ZlRWRnZXMuYWRkKGVsZW1lbnQpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIGlmKCFyZW1vdmVFZGdlcy5pc0VtcHR5KCkpIHsKLQkJCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZW1vdmVFZGdlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLy8gLmhhc05leHQoKTspIHsKLQkJCQkvLyBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUdyYXBoRWRnZSgoR3JhcGhFZGdlKQotCQkJCS8vIGl0ZXIubmV4dCgpKTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCi0JCQkJLy8gcmVtb3ZlIG9sZCBub2RlcwotCQkJCS8vCi0JCQkJZGlhZ3JhbS5nZXRDb250YWluZWQoKS5yZW1vdmVBbGwob2xkTm9kZXMpOwotCi0JCQkJLy8gcmVtb3ZlIHVudXNlZCBvbGQgVUkgbm9kZXMgJiYgbm9kZXMgb2YgY29udHJpYnV0b3IvcmVwbGFjZXIKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldENvbnRhaW5lZCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUdyYXBoTm9kZSBub2RlID0gKEdyYXBoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChpc1VJR3JhcGhOb2RlKG5vZGUpCi0JCQkJCQkJJiYgbm9kZS5nZXRCcmllZkRlc2NyaXB0aW9uKCkgIT0gbnVsbAotCQkJCQkJCSYmIG5vZGUuZ2V0QnJpZWZEZXNjcmlwdGlvbigpLmxlbmd0aCgpID4gMAotCQkJCQkvLyAmJiBub2RlLmdldENvbnRhaW5lZCgpLmlzRW1wdHkoKQotCQkJCQkpIHsKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlIGJyaWRnZSA9IG5vZGUuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQkJaWYgKGJyaWRnZSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIHsKLQkJCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGJyaWRnZSkKLQkJCQkJCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJCQkJJiYgKChBY3Rpdml0eSkgZSkKLQkJCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gcmVwbGFjZSBhc3NvY2lhdGVkIGJhc2UgZWxlbWVudCB3aXRoIGNvbnRyaWJ1dGluZy9yZXBsYWNpbmcKLQkJCQkvLyBlbGVtZW50Ci0JCQkJLy8KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZUVsZW1lbnQgPSAoKEFjdGl2aXR5KSBlbGVtZW50KQotCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQkJR3JhcGhOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5maW5kR3JhcGhOb2RlKAotCQkJCQkJCQljb3B5LCBiYXNlRWxlbWVudCk7Ci0JCQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSAoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgbm9kZQotCQkJCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCQkJCQlicmlkZ2Uuc2V0RWxlbWVudCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBhZGQgbmV3IG5vZGVzCi0JCQkJLy8KLQkJCQlkaWFncmFtLmdldENvbnRhaW5lZCgpLmFkZEFsbChjb3B5LmdldENvbnRhaW5lZCgpKTsKLQotCQkJCWJyZWFrOwotCQkJfQotCQkJZGVmYXVsdDogewotCQkJCURpYWdyYW0gYmFzZURpYWdyYW0gPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0VU1BRGlhZ3JhbShiYXNlLCBkaWFncmFtVHlwZSwgZmFsc2UpOwotCQkJCWlmIChiYXNlRGlhZ3JhbSA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJTGlzdCBvbGROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlEaWFncmFtIGNvcHkgPSBjb3B5RGlhZ3JhbShiYXNlRGlhZ3JhbSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYmFzZURpYWdyYW0uZ2V0Q29udGFpbmVkKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJR3JhcGhOb2RlIGJhc2VOb2RlID0gKEdyYXBoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCW1vZGVsQnJpZGdlID0gYmFzZU5vZGUuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQlpZiAobW9kZWxCcmlkZ2UgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSB7Ci0JCQkJCQkvLyB0aGlzIGlzIGEgZWxlbWVudCdzIG5vZGUKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgbW9kZWxCcmlkZ2UpCi0JCQkJCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQkJCQlHcmFwaE5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmZpbmRHcmFwaE5vZGUoCi0JCQkJCQkJCWRpYWdyYW0sIGUpOwotCQkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkJCW9sZE5vZGVzLmFkZChub2RlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHJlbW92ZSBvbGQgbm9kZXMKLQkJCQkvLwotCQkJCWRpYWdyYW0uZ2V0Q29udGFpbmVkKCkucmVtb3ZlQWxsKG9sZE5vZGVzKTsKLQotCQkJCS8vIGFkZCBuZXcgbm9kZXMKLQkJCQkvLwotCQkJCWRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuYWRkQWxsKGNvcHkuZ2V0Q29udGFpbmVkKCkpOwotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHBhcmFtIGJhc2VHdWlkCi0JICogICAgICAgICAgICB0aGUgR1VJRCBvZiB0aGUgYmFzZSBVSSBHcmFwaE5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgR3JhcGhOb2RlIGZpbmRVSUdyYXBoTm9kZShEaWFncmFtIGRpYWdyYW0sIFN0cmluZyBiYXNlR3VpZCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldENvbnRhaW5lZCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJR3JhcGhOb2RlIG5vZGUgPSAoR3JhcGhOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChpc1VJR3JhcGhOb2RlKG5vZGUpCi0JCQkJCSYmIGJhc2VHdWlkLmVxdWFscyhub2RlLmdldEJyaWVmRGVzY3JpcHRpb24oKSkpIHsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVSUdyYXBoTm9kZShHcmFwaE5vZGUgZ05vZGUpIHsKLQkJU2VtYW50aWNNb2RlbEJyaWRnZSBtb2RlbEJyaWRnZSA9IGdOb2RlLmdldFNlbWFudGljTW9kZWwoKTsKLQkJaWYgKG1vZGVsQnJpZGdlIGluc3RhbmNlb2YgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpIHsKLQkJCVN0cmluZyB0eXBlSW5mbyA9ICgoU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpIG1vZGVsQnJpZGdlKQotCQkJCQkuZ2V0VHlwZUluZm8oKTsKLQkJCWlmICh0eXBlSW5mby5lcXVhbHMoR1JBUEhfTk9ERV9ERUNJU0lPTikKLQkJCQkJfHwgdHlwZUluZm8uZXF1YWxzKEdSQVBIX05PREVfRU5EKQotCQkJCQl8fCB0eXBlSW5mby5lcXVhbHMoR1JBUEhfTk9ERV9TVEFSVCkKLQkJCQkJfHwgdHlwZUluZm8uZXF1YWxzKEdSQVBIX05PREVfU1lOQ0hfQkFSKQotCQkJCQl8fCB0eXBlSW5mby5lcXVhbHMoR1JBUEhfTk9ERV9GUkVFX1RFWFQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbSBjb3B5RGlhZ3JhbShEaWFncmFtIGJhc2VEaWFncmFtKSB7Ci0JCURpYWdyYW0gY29weSA9IChEaWFncmFtKSBUbmdVdGlsLmNvcHkoYmFzZURpYWdyYW0pOwotCi0JCS8vIEhBQ0s6Ci0JCS8vIGdvIHRocnUgdGhlIG5vZGVzIG9mIHRoZSBkaWFncmFtIGNvcHksIGlmIGFueSBub2RlIGlzIGEgVUktb25seSBub2RlCi0JCS8vIChzZWUgVHlwZWROb2RlKQotCQkvLyBzYXZlIHRoZSBHVUlEIG9mIHRoZSBvcmlnaW5hbCBvbmUgaW4gaXRzIGJyaWVmRGVzY3JpcHRpb24gdG8gcmVtZW1iZXIKLQkJLy8gd2hvIGlzIGJhc2UuCi0JCS8vCi0JCWludCBzaXplID0gY29weS5nZXRDb250YWluZWQoKS5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlHcmFwaE5vZGUgZ05vZGUgPSAoR3JhcGhOb2RlKSBjb3B5LmdldENvbnRhaW5lZCgpLmdldChpKTsKLQkJCWlmIChHcmFwaGljYWxEYXRhSGVscGVyLmlzVUlHcmFwaE5vZGUoZ05vZGUpKSB7Ci0JCQkJZ05vZGUuc2V0QnJpZWZEZXNjcmlwdGlvbigoKERpYWdyYW1FbGVtZW50KSBiYXNlRGlhZ3JhbQotCQkJCQkJLmdldENvbnRhaW5lZCgpLmdldChpKSkuZ2V0R3VpZCgpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjb3B5OwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIGRpYWdyYW1zIG9mIHRoaXMgYWN0aXZpdGllcy4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0ZWRBY3Rpdml0eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0RGlhZ3JhbXMoQWN0aXZpdHkgYWN0KSB7Ci0JCXJldHVybiBnZXREaWFncmFtcyhhY3QsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0RGlhZ3JhbXMoQWN0aXZpdHkgYWN0LCBib29sZWFuIGNyZWF0ZSkgewotCQlBcnJheUxpc3QgZGlhZ3JhbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgRElBR1JBTV9UWVBFUy5sZW5ndGg7IGkrKykgewotCQkJRGlhZ3JhbSBkaWFncmFtID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKAotCQkJCQlhY3QsIERJQUdSQU1fVFlQRVNbaV0sIGNyZWF0ZSk7Ci0JCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJZGlhZ3JhbXMuYWRkKGRpYWdyYW0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBkaWFncmFtczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREaWFncmFtVHlwZVRleHQoRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCWludCB0eXBlID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXREaWFncmFtVHlwZShkaWFncmFtKTsKLQkJaWYgKHR5cGUgIT0gLTEpIHsKLQkJCXJldHVybiBESUFHUkFNX1RZUEVfVEVYVFNbdHlwZV07Ci0JCX0KLQkJcmV0dXJuIERpYWdyYW1SZXNvdXJjZXMudHlwZV91bmtub3duOyAKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIG9yIHVuc2V0cyBzdXBwcmVzc2VkIGZsYWcgb2YgYWxsIGRpYWdyYW1zIGluIHRoZSBnaXZlbiBwcm9jZXNzCi0JICogCi0JICogQHBhcmFtIHByb2MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QWxsRGlhZ3JhbVN1cHByZXNzZWQoUHJvY2VzcyBwcm9jLCBib29sZWFuIHN1cHByZXNzZWQpIHsKLQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihwcm9jKSB7Ci0KLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTYxODk0OTAxNDQ3NjM3MTExNEw7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvYmplY3Q7Ci0JCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCX0KLQotCQl9OwotCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJQ29sbGVjdGlvbiBkaWFncmFtcyA9IGdldERpYWdyYW1zKChBY3Rpdml0eSkgaXRlci5uZXh0KCksCi0JCQkJCXN1cHByZXNzZWQpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRpYWdyYW1zLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWRpYWdyYW0uc2V0U3VwcHJlc3NlZChCb29sZWFuLnZhbHVlT2Yoc3VwcHJlc3NlZCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZVVNQVBvaW50KENvbGxlY3Rpb24gdW1hUG9pbnRzLCBpbnQgeCwgaW50IHkpCi0JLy8gewotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHVtYVBvaW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50IHAgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCkgaXRlci5uZXh0KCk7Ci0JLy8gaWYocC5nZXRYKCkuaW50VmFsdWUoKSA9PSB4ICYmIHAuZ2V0WSgpLmludFZhbHVlKCkgPT0geSkgewotCS8vIGl0ZXIucmVtb3ZlKCk7Ci0JLy8gcmV0dXJuIHRydWU7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUxpbmsoTGluayBsaW5rKSB7Ci0JCU5vZGUgc291cmNlTm9kZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCU5vZGUgdGFyZ2V0Tm9kZSA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCWJvb2xlYW4gc3JjTm90aWZ5ID0gc291cmNlTm9kZSAhPSBudWxsID8gc291cmNlTm9kZS5lRGVsaXZlcigpIDogZmFsc2U7Ci0JCWJvb2xlYW4gdGFyZ2V0Tm90aWZ5ID0gdGFyZ2V0Tm9kZSAhPSBudWxsID8gdGFyZ2V0Tm9kZS5lRGVsaXZlcigpCi0JCQkJOiBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlmIChzb3VyY2VOb2RlICE9IG51bGwpIHsKLQkJCQlzb3VyY2VOb2RlLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCX0KLQkJCWlmICh0YXJnZXROb2RlICE9IG51bGwpIHsKLQkJCQl0YXJnZXROb2RlLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCX0KLQkJCWxpbmsuc2V0U291cmNlKG51bGwpOwotCQkJbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc291cmNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJc291cmNlTm9kZS5lU2V0RGVsaXZlcihzcmNOb3RpZnkpOwotCQkJfQotCQkJaWYgKHRhcmdldE5vZGUgIT0gbnVsbCkgewotCQkJCXRhcmdldE5vZGUuZVNldERlbGl2ZXIodGFyZ2V0Tm90aWZ5KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSBvYmplY3Qgb3IgaXRzIHdyYXBwZXIgaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24KLQkgKiAKLQkgKiBAcGFyYW0gYWxsRWxlbWVudHMKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBmaW5kRWxlbWVudChDb2xsZWN0aW9uIGFsbEVsZW1lbnRzLCBPYmplY3QgZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbGxFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZSA9PSBUbmdVdGlsLnVud3JhcChlbGVtZW50KSkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQkJLy8gSWYgb2JqZWN0IChlKSBpcyBhIHdvcmtwcm9kdWN0IGRlc2NyaXB0b3IoIHN1Yi1hcnRpZmFjdCkKLQkJCS8vIHBhc3NlZCBjb2xsZWN0aW9uIGRvbm90IGhhdmUgd3JhcHBlciBmb3Igc3ViLWFydGlmYWN0LCBjaGVjayB0aGUKLQkJCS8vIGNvbnRhaW5lciBhcnRpZmFjdCdzIHdyYXBwZXIuCi0JCQkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTU5MTQKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQlPYmplY3QgY2hpbGRFbGVtZW50ID0gZmluZEVsZW1lbnQoKChXb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKWVsZW1lbnQpLmdldENoaWxkcmVuKGVsZW1lbnQpLCBlKTsKLQkJCQlpZihjaGlsZEVsZW1lbnQgIT0gbnVsbCl7Ci0JCQkJCXJldHVybiBjaGlsZEVsZW1lbnQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogTWV0aG9kIHRvIGNoZWNrIGlmIGFueSBkdXBsaWNhdGUgcHJlZGVjZXNzb3IgaW4gdGhlIHByZWRlY2Vzc29ycyBsaXN0IG9mCi0JICogV29ya0JyZWFrZG93bkVsZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFueUR1cGxpY2F0ZVByZWRlY2Vzc29ycyhXb3JrQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBwcmVkbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0UHJlZHMoZSwgcHJlZGxpc3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBwcmVkbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmICghbGlzdC5jb250YWlucyhvYmopKSB7Ci0JCQkJbGlzdC5hZGQob2JqKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogVXRpbGl0eSBtZXRob2QgdG8gZ2V0IGFsbCB0aGUgcHJlZGVjZXNzb3JzIGFjdGl2aXRpZXMgaW5zdGVhZCBvZgotCSAqIHdvcmtvcmRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFByZWRzKFdvcmtCcmVha2Rvd25FbGVtZW50IGUsIExpc3QgbGlzdCkgewotCQlMaXN0IHByZWRsaXN0ID0gZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBwcmVkbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCVdvcmtPcmRlciB3b3Jrb3JkZXIgPSAoV29ya09yZGVyKSBpdG9yLm5leHQoKTsKLQkJCWxpc3QuYWRkKHdvcmtvcmRlci5nZXRQcmVkKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBNZXRob2QgdG8gY2hlY2sgYmVmb3JlIGRlbGV0aW5nIGEgbGluay4gSWYgZHVwbGljYXRlIHByZWRlY2Vzc29yIGV4aXN0cwotCSAqIGluIHRoZSBsZWdhY3kgZGF0YSwgY2hlY2sgaWYgZGVsZXRpbmcgbGluayBzaG91bGQgcmVtb3ZlIGFsbCB0aGUKLQkgKiBwcmVkZWNlc3NvcnMgb3Igbm90IGJ5IHZlcmlmeWluZyBpZiB0YXJnZXQgb3IgaW5kaXJlY3QgdGFyZ2V0IGhhdmUgZGlyZWN0Ci0JICogb3IgaW5kaXJlY3QgbGlua3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhblJlbW92ZUFsbFByZWRzKExpbmsgbGluaywgTm9kZSBvbGRTb3VyY2UsCi0JCQlOb2RlIG9sZFRhcmdldCkgewotCi0JCWlmIChvbGRUYXJnZXQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCUxpc3QgaW5saXN0ID0gb2xkVGFyZ2V0LmdldEluY29taW5nQ29ubmVjdGlvbnMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGlubGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGluY29taW5nbGluayA9IChMaW5rKSBpdG9yLm5leHQoKTsKLQkJCQkvLyBSQVRMQzAwMzg0MjQ1IDogUHJlZGVjZXNzb3IgY2hhbmdlcyBzaG91bGQgYmUgZG9uZSBvbmx5IGluCi0JCQkJLy8gY2FzZSBvZiBTeW5jaHJvbml6YXRpb24gQmFyLgotCQkJCWlmIChpbmNvbWluZ2xpbmsuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBUeXBlZE5vZGUKLQkJCQkJCSYmICgoVHlwZWROb2RlKSBpbmNvbWluZ2xpbmsuZ2V0U291cmNlKCkpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1lOQ0hfQkFSKSB7Ci0JCQkJCUNvbGxlY3Rpb24gY29sID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRTb3VyY2VOb2RlcygKLQkJCQkJCQkoVHlwZWROb2RlKSBpbmNvbWluZ2xpbmsuZ2V0U291cmNlKCksCi0JCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCQkJaWYgKGNvbC5jb250YWlucyhvbGRTb3VyY2UpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGluY29taW5nbGluay5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJCQlpZiAoaW5jb21pbmdsaW5rLmdldFNvdXJjZSgpLmVxdWFscyhvbGRTb3VyY2UpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIE1ldGhvZCB0byBnZXQgdGhlIHNvdXJjZXMgb2YgU3luY0JhciBpbkNvbW1pbmcgY29ubmVjdGlvbnMKLQkgKiBhbmQgaWYgc3luY2JhciBoYXZlIGluY29taW5nIGNvbm5lY3Rpb24gZnJvbSBkZWNpc2lvbiBwb2ludCwgCi0JICogYW5kIGRlY2lzaW9uIHBvaW50IGhhdmUgaW5jb21taW5nIGNvbm5lY3Rpb25zICh3b3JrYnJlYWRkb3duIGVsZW10bnMpCi0JICogY29sbGVjdGlvbnMgd2lsbCBpZ25vcmUgYWxsIHRoZSBpbmNvbWluZyBjb25uZWN0aW9uIGZyb20gZGVjaXNpb24gcG9pbnQuICAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFN5bmNCYXJTb3VyY2VOb2RlcyhUeXBlZE5vZGUgdHlwZWROb2RlLCBDb2xsZWN0aW9uIGFjdE5vZGVzKXsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJTm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCQkJCWlmKHNvdXJjZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSl7Ci0JCQkJCWFjdE5vZGVzLmFkZChzb3VyY2UpOwotCQkJCX1lbHNlIGlmKHNvdXJjZSBpbnN0YW5jZW9mIFR5cGVkTm9kZSl7Ci0JCQkJCWlmKCgoVHlwZWROb2RlKXNvdXJjZSkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TWU5DSF9CQVIpCi0JCQkJCQlnZXRTeW5jQmFyU291cmNlTm9kZXMoKFR5cGVkTm9kZSlzb3VyY2UsYWN0Tm9kZXMpOwotCQkJCX0KLQkJfQotCX0KLQkvKgotCSAqIE1ldGhvZCB0byBjb2xsZWN0IHN5bmNocm9uaXphdGlvbiBiYXIgb3V0Z29pbmcgY29ubmVjdGlvbgotCSAqIGV4Y2VwdCBhbnkgY29ubmVjdGlvbiBnb2luZyBmcm9tIGRlY2lzaW9uIHBvaW50cy4gIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRTeW5jQmFyVGFyZ2V0Tm9kZXMoVHlwZWROb2RlIHR5cGVkTm9kZSwgQ29sbGVjdGlvbiBhY3ROb2Rlcyl7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkTm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCU5vZGUgdGFyZ2V0ID0gbGluay5nZXRUYXJnZXQoKTsKLQkJCQlpZih0YXJnZXQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpewotCQkJCQlhY3ROb2Rlcy5hZGQodGFyZ2V0KTsKLQkJCQl9ZWxzZSBpZih0YXJnZXQgaW5zdGFuY2VvZiBUeXBlZE5vZGUpewotCQkJCQlpZigoKFR5cGVkTm9kZSl0YXJnZXQpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1lOQ0hfQkFSKQotCQkJCQkJZ2V0U3luY0JhclRhcmdldE5vZGVzKChUeXBlZE5vZGUpdGFyZ2V0LCBhY3ROb2Rlcyk7Ci0JCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTm9kZSBmaW5kTm9kZShOb2RlQ29udGFpbmVyIGNvbnRhaW5lciwgT2JqZWN0IG9iamVjdCwgQ2xhc3Mgbm9kZVR5cGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29udGFpbmVyLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIGVsZW1lbnQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0ID09IGVsZW1lbnQuZ2V0T2JqZWN0KCkgJiYgbm9kZVR5cGUuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQotCS8qKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIHRvIGFkZCBhIHByb3BlcnR5IHRvIEdyYXBoTm9kZSBwcm9wZXJ0eSBsaXN0Ci0JICogKFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFkpIFZlcmlmaWVzIHByb3BlcnR5IGV4aXN0cyBvciBub3QsIGlmIG5vdAotCSAqIGNyZWF0ZXMgYSBwcm9wZXJ0eSB3aXRoIGdpdmVuIGtleSBhbmQgdmFsdWUuIGFuZCBzZXQgaW50byBncmFwaCBub2RlCi0JICogcHJvcGVydHkgbGlzdCwgaWYgZXhpc3RzIGp1c3Qgc2V0cyB2YWx1ZSBmb3IgcHJvcGVydHkuCi0JICogCi0JICogQHBhcmFtIGdyYXBoTm9kZQotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIFByb3BlcnR5Ci0JICogQGF1dGhvciBza2Fubm9vcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHkgY3JlYXRlUHJvcGVydHkoR3JhcGhOb2RlIGdyYXBoTm9kZSwgU3RyaW5nIGtleSwKLQkJCVN0cmluZyB2YWx1ZSkgewotCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IG51bGw7Ci0JCWlmIChncmFwaE5vZGUgIT0gbnVsbCkgewotCQkJcHJvcGVydHkgPSBmaW5kUHJvcGVydHkoZ3JhcGhOb2RlLCBrZXkpOwotCQl9Ci0JCWlmIChwcm9wZXJ0eSA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0eSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb3BlcnR5KCk7Ci0JCQlwcm9wZXJ0eS5zZXRLZXkoa2V5KTsKLQkJCXByb3BlcnR5LnNldFZhbHVlKHZhbHVlKTsKLQkJCUxpc3QgbGlzdCA9IGdyYXBoTm9kZS5nZXRMaXN0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFkpOwotCQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZ3JhcGhOb2RlLnNldChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZLCBsaXN0KTsKLQkJCX0KLQkJCWxpc3QuYWRkKHByb3BlcnR5KTsKLQkJfSBlbHNlIHsKLQkJCXByb3BlcnR5LnNldFZhbHVlKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydHk7Ci0JfQotCQotCS8qKgotCSAqIEFjY2VzaWJsZSBtZXRob2QgZm9yIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSwgdG8gZ2V0IGEgYXV0b2xheW91dCBmbGFnIGZyb20KLQkgKiBHcmFwaGhOb2RlIHByb3BlcnR5IGxpc3QuIHJldHVybiBzdHJpbmcgY2FuIGJlCi0JICogR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0FVVE9MQVlPVVRfVkFMVUVfVFJVRSwKLQkgKiBHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT0xBWU9VVF9WQUxVRV9GQUxTRSwgb3IgbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXV0b0xheW91dEZsYWcoQWN0aXZpdHlEZXRhaWxEaWFncmFtIGRpYWdyYW0pIHsKLQkJU3RyaW5nIGZsYWcgPSBudWxsOwotCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gZGlhZ3JhbS5nZXRHcmFwaE5vZGUoKTsKLQkJaWYgKGdyYXBoTm9kZSAhPSBudWxsKSB7Ci0JCQlMaXN0IHByb3BMaXN0ID0gZ3JhcGhOb2RlLmdldExpc3QoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSk7Ci0JCQlpZiAocHJvcExpc3QgIT0gbnVsbCAmJiBwcm9wTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJUHJvcGVydHkgcHJvcGVydHkgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmRQcm9wZXJ0eShncmFwaE5vZGUsCi0JCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT19MQVlPVVQpOwotCQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJCWZsYWcgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmxhZzsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXV0b0xheW91dChBY3Rpdml0eURldGFpbERpYWdyYW0gZGlhZ3JhbSl7Ci0JCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBkaWFncmFtLmdldEdyYXBoTm9kZSgpOwotCQlpZihncmFwaE5vZGUgIT0gbnVsbCl7Ci0JCQlMaXN0IHByb3BMaXN0ID0gZ3JhcGhOb2RlLmdldExpc3QoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSk7Ci0JCQlpZihwcm9wTGlzdCAhPSBudWxsICYmIHByb3BMaXN0LnNpemUoKSA+IDApewotCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kUHJvcGVydHkoCi0JCQkJCWdyYXBoTm9kZSwgR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0FVVE9fTEFZT1VUKTsKLQkJCQlpZihwcm9wZXJ0eSAhPSBudWxsKXsKLQkJCQkJU3RyaW5nIHRlbXAgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQkJCQlpZih0ZW1wICE9IG51bGwgJiYgdGVtcCAhPSAiIiAmJiAKLQkJCQkJCQkoR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0FVVE9fTEFZT1VUX1ZBTFVFX1RSVUUuZXF1YWxzKHRlbXApCi0JCQkJCQkJCQl8fCBHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT19MQVlPVVRfVkFMVUVfRkFMU0UuZXF1YWxzKHRlbXApKSl7Ci0JCQkJCQlyZXR1cm4gbmV3IEJvb2xlYW4odGVtcCkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGludCBnZXRUYXNrc1BlclJvdygpewotCQlTdHJpbmcgY291bnQgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJLmdldFN0cmluZyhHcmFwaGljYWxEYXRhSGVscGVyLkFERF9ESUFHUkFNX1RBU0tTX1BFUl9ST1cpOwotCQlpZihjb3VudCAhPSBudWxsIHx8IGNvdW50ICE9ICIiKXsKLQkJCWludCBpID0gSW50ZWdlci5wYXJzZUludChjb3VudCk7Ci0JCQlyZXR1cm4gaTsKLQkJfQotCQlyZXR1cm4gMTA7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpc3QgdGhlIGxpc3Qgb2Yge0BsaW5rIFByb3BlcnR5fSBvYmplY3RzCi0JICogQHBhcmFtIGtleQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BlcnR5IGdldFByb3BlcnR5QnlLZXkoTGlzdCBsaXN0LCBTdHJpbmcga2V5KSB7Ci0JCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXJvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXJvci5oYXNOZXh0KCk7KSB7Ci0JCQkJUHJvcGVydHkgcHJvcGVydHkgPSAoUHJvcGVydHkpIGlyb3IubmV4dCgpOwotCQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJCWlmIChwcm9wZXJ0eS5nZXRLZXkoKS5lcXVhbHMoa2V5KSkgewotCQkJCQkJcmV0dXJuIHByb3BlcnR5OwotCQkJCQl9Ci0vLwkJCQkJCWVsc2UgewotLy8JCQkJCQlyZXR1cm4gbnVsbDsKLS8vCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHkgZ2V0UHJvcGVydHkoTm9kZSBub2RlLCBTdHJpbmcga2V5KSB7Ci0JCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBub2RlLmdldEdyYXBoTm9kZSgpOwotCQlpZiAoZ3JhcGhOb2RlICE9IG51bGwpIHsKLQkJCUxpc3QgbGlzdCA9IGdyYXBoTm9kZS5nZXRQcm9wZXJ0eSgpOwotCQkJaWYgKGxpc3QgIT0gbnVsbCAmJiAhbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKGludCBpID0gbGlzdC5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCQlQcm9wZXJ0eSBwcm9wID0gKFByb3BlcnR5KSBsaXN0LmdldChpKTsKLQkJCQkJaWYgKGtleS5lcXVhbHMocHJvcC5nZXRLZXkoKSkpIHsKLQkJCQkJCXJldHVybiBwcm9wOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvR3JhcGhpY2FsRGF0YU1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvR3JhcGhpY2FsRGF0YU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjUwYjdiMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0dyYXBoaWNhbERhdGFNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbW1hbmRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5WYXJ5QWN0aXZpdHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIERpYWdyYW0gZGF0YSBzdG9yZWQgaW4gVU1BOiBTZW1hbnRpY01vZGVsQnJpZGdlIC5QcmVzZW50YXRpb24gZGlhZ3JhbSB0eXBlLAotICogaXRzIHZhbHVlIGNhbiBiZSBvbmUgb2YgZm9sbG93aW5nIGNvbnN0YW50cyBkZWZpbmVkIGluIEdyYXBoaWNhbERhdGFIZWxwZXIKLSAqIERJQUdSQU1fV09SS0ZMT1csIERJQUdSQU1fV09SS19QUk9EVUNUX0RFUEVOREVOQ1ksIERJQUdSQU1fQUNUSVZJVFlfREVUQUlMCi0gKiAKLSAqIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgLkVsZW1lbnQgQnJlYWtkb3duRWxlbWVudCB0aGF0IHRoZSBEaWFncmFtRWxlbWVudCBvZgotICogdGhpcyBTZW1hbnRpY01vZGVsQnJpZGdlIHJlcHJlc2VudHMKLSAqIAotICogU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgLlR5cGVJbmZvIHR5cGUgaW5mb3JtYXRpb24gZm9yIFR5cGVkTm9kZSwgaXRzCi0gKiB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBjb25zdGFudHMgZGVmaW5lZCBpbiBHcmFwaGljYWxEYXRhSGVscGVyCi0gKiB3cENvbXBvc2l0ZVR5cGUgV29ya1Byb2R1Y3RDb21wb3NpdGUgdHlwZQotICogCi0gKiBEaWFncmFtRWxlbWVudCAuUHJvcGVydHkgKGxpc3Qgb2YgcHJvcGVydGllcykKLSAqIAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgR3JhcGhpY2FsRGF0YU1hbmFnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGRpYWdyYW1QcmVzZW50YXRpb25zID0gbmV3IFN0cmluZ1tdIHsKLQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuRElBR1JBTV9XT1JLRkxPVywKLQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuRElBR1JBTV9XT1JLX1BST0RVQ1RfREVQRU5ERU5DWSwKLQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuRElBR1JBTV9BQ1RJVklUWV9ERVRBSUwgfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gY2hpbGRUeXBlcyA9IG5ldyBDbGFzc1tdIHsgQWN0aXZpdHkuY2xhc3MsCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIERlc2NyaXB0b3IuY2xhc3MgfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gZGlhZ3JhbUNoYW5nZUxpc3RlbmVyQ2xhc3NlcyA9IG5ldyBDbGFzc1tdIHsKLQkJCUlBY3Rpdml0eURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5jbGFzcywKLQkJCUlXUEREaWFncmFtQ2hhbmdlTGlzdGVuZXIuY2xhc3MsCi0JCQlJQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2hhbmdlTGlzdGVuZXIuY2xhc3MgfTsKLQotCXByaXZhdGUgc3RhdGljIEdyYXBoaWNhbERhdGFNYW5hZ2VyIGluc3RhbmNlID0gbnVsbDsKLQotCS8vcHJpdmF0ZSBNYXAgZ3JhcGhpY2FsRGF0YU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIExpc3QgY29tbWFuZExpc3RlbmVyczsKLQotCXByaXZhdGUgR3JhcGhpY2FsRGF0YU1hbmFnZXIoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBHcmFwaGljYWxEYXRhTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoR3JhcGhpY2FsRGF0YU1hbmFnZXIuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBHcmFwaGljYWxEYXRhTWFuYWdlcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLy8gcHVibGljIEdyYXBoTm9kZSBnZXRHcmFwaE5vZGUoQWN0aXZpdHkgYWN0LCBpbnQgZGlhZ3JhbVR5cGUsIEFjdGl2aXR5Ci0JLy8gcGFyZW50KSB7Ci0JLy8gLy8gSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpCi0JLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChhY3QsCi0JLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkvLyAvLyBPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYWN0KTsKLQkvLyAvLyBpZihwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCS8vIGlmKHBhcmVudCA9PSBudWxsKSB7Ci0JLy8gLy8gbmV3IEFjdGl2aXR5Ci0JLy8gLy8KLQkvLyByZXR1cm4gY3JlYXRlR3JhcGhOb2RlKGFjdCk7Ci0JLy8gfQotCS8vIGlmKCFhY3QuZ2V0U3VwZXJBY3Rpdml0aWVzKCkuY29udGFpbnMocGFyZW50KSkgewotCS8vIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc3VwZXIgYWN0aXZpdHkgZm9yICIgKyBhY3QgKwotCS8vICI6ICIgKyBwYXJlbnQpOwotCS8vIH0KLQkvLyBBY3Rpdml0eSBwYXJlbnRBY3QgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkvLyBEaWFncmFtIGRpYWdyYW0gPSBnZXREaWFncmFtKHBhcmVudEFjdCwgZGlhZ3JhbVR5cGUpLmdldFVNQURpYWdyYW0oKTsKLQkvLyByZXR1cm4gZ2V0R3JhcGhOb2RlKGRpYWdyYW0sIGFjdCk7Ci0JLy8gfQotCi0JLyoqCi0JICogR2V0cyB0aGUgR3JhcGhOb2RlIG9mIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCBmb3IgdGhlIGdpdmVuIGRpYWdyYW0uCi0JICogQ3JlYXRlIHRoZSBHcmFwaE5vZGUgaWYgaXQgZG9lcyBub3QgZXhpc3QgeWV0LgotCSAqIAotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHBhcmFtIG1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEdyYXBoTm9kZSBnZXRHcmFwaE5vZGUoRGlhZ3JhbSBkaWFncmFtLCBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQpIHsKLQkJaWYgKGRpYWdyYW0gPT0gbnVsbCkgewotCQkJLy8gbmV3IE1ldGhvZEVsZW1lbnQKLQkJCS8vCi0JCQlyZXR1cm4gY3JlYXRlR3JhcGhOb2RlKG1ldGhvZEVsZW1lbnQpOwotCQl9Ci0JCUdyYXBoTm9kZSBub2RlID0gZmluZEdyYXBoTm9kZShkaWFncmFtLCBtZXRob2RFbGVtZW50KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJbm9kZSA9IGNyZWF0ZUdyYXBoTm9kZShtZXRob2RFbGVtZW50KTsKLQkJCWNyZWF0ZUdyYXBoQ29ubmVjdG9ycyhub2RlLCBkaWFncmFtKTsKLQkJCWRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuYWRkKG5vZGUpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgR3JhcGhOb2RlIGZpbmRHcmFwaE5vZGUoRGlhZ3JhbSBkaWFncmFtLCBPYmplY3QgbWV0aG9kRWxlbWVudCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldENvbnRhaW5lZCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJR3JhcGhOb2RlIGVsZW1lbnQgPSAoR3JhcGhOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50LmdldFNlbWFudGljTW9kZWwoKSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UKLQkJCQkJJiYgbWV0aG9kRWxlbWVudCA9PSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGVsZW1lbnQKLQkJCQkJCQkuZ2V0U2VtYW50aWNNb2RlbCgpKS5nZXRFbGVtZW50KCkpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyBwdWJsaWMgRGlhZ3JhbUVsZW1lbnQgZ2V0RGlhZ3JhbUVsZW1lbnQoT2JqZWN0IG9iamVjdCkgewotCS8vIGlmKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JLy8gcmV0dXJuIGdldEdyYXBoTm9kZSgoQWN0aXZpdHkpIG9iamVjdCk7Ci0JLy8gfQotCS8vIGVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgV29ya09yZGVyKSB7Ci0JLy8gV29ya09yZGVyIHdvcmtPcmRlciA9IChXb3JrT3JkZXIpIG9iamVjdDsKLQkvLyBCcmVha2Rvd25FbGVtZW50IGJlID0gd29ya09yZGVyLmdldFByZWQoKTsKLQkvLyBpZihiZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JLy8gR3JhcGhOb2RlIGdyYXBoTm9kZSA9IGdldEdyYXBoTm9kZSgoQWN0aXZpdHkpIGJlKTsKLQkvLyBMaXN0IGxpc3QgPSBncmFwaE5vZGUuZ2V0Q29udGFpbmVkKCk7Ci0JLy8gUG9seWxpbmUgcG9seWxpbmUgPSBudWxsOwotCS8vIGZvcihpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JLy8gT2JqZWN0IG9iaiA9IGxpc3QuZ2V0KGkpOwotCS8vIGlmKG9iaiBpbnN0YW5jZW9mIFBvbHlsaW5lKSB7Ci0JLy8gcG9seWxpbmUgPSAoUG9seWxpbmUpIG9iajsKLQkvLyBicmVhazsKLQkvLyB9Ci0JLy8gfQotCS8vIGlmKHBvbHlsaW5lID09IG51bGwpIHsKLQkvLyBwb2x5bGluZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvbHlsaW5lKCk7Ci0JLy8gbGlzdC5hZGQoMCwgcG9seWxpbmUpOwotCS8vIH0KLQkvLyByZXR1cm4gcG9seWxpbmU7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgRGlhZ3JhbSBjcmVhdGVEaWFncmFtKEFjdGl2aXR5IGFjdCwgaW50IGRpYWdyYW1UeXBlKSB7Ci0JCS8vIGNoZWNrIGlmIHRoaXMgYWN0aXZpdHkgY29udHJpYnV0ZXMvZXh0ZW5kcyBvdGhlciBhY3Rpdml0eSBhbmQgdHJ5Ci0JCS8vIGNvcHkKLQkJLy8gdGhlIGV4aXN0aW5nIGRpYWdyYW0gZnJvbSB0aGUgYmFzZQotCQkvLwotCQlpZiAoUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoYWN0KSkgewotCQkJRGlhZ3JhbSBiYXNlRGlhZ3JhbSA9IGdldFVNQURpYWdyYW0oKEFjdGl2aXR5KSBhY3QKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwgZGlhZ3JhbVR5cGUsIGZhbHNlKTsKLQkJCWlmIChiYXNlRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJRGlhZ3JhbSBjb3B5ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5jb3B5RGlhZ3JhbShiYXNlRGlhZ3JhbSk7Ci0KLQkJCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG1vZGVsQnJpZGdlID0gKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGNvcHkKLQkJCQkJCS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJbW9kZWxCcmlkZ2Uuc2V0RWxlbWVudChhY3QpOwotCQkJCXJldHVybiBjb3B5OwotCQkJfQotCQl9Ci0KLQkJRGlhZ3JhbSBkaWFncmFtID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlhZ3JhbSgpOwotCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG1vZGVsQnJpZGdlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCQltb2RlbEJyaWRnZS5zZXRFbGVtZW50KGFjdCk7Ci0JCW1vZGVsQnJpZGdlLnNldFByZXNlbnRhdGlvbihkaWFncmFtUHJlc2VudGF0aW9uc1tkaWFncmFtVHlwZV0pOwotCQlkaWFncmFtLnNldFNlbWFudGljTW9kZWwobW9kZWxCcmlkZ2UpOwotCi0JCS8vIGdldERpYWdyYW0oYWN0LCBkaWFncmFtVHlwZSkuc2V0VU1BRGlhZ3JhbShkaWFncmFtKTsKLQotCQlwb3B1bGF0ZURpYWdyYW0oZGlhZ3JhbSwgYWN0LCBkaWFncmFtVHlwZSk7Ci0KLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRGlhZ3JhbShEaWFncmFtIGRpYWdyYW0sIEFjdGl2aXR5IGFjdCwgaW50IGRpYWdyYW1UeXBlKSB7Ci0JCS8vIGNyZWF0ZSBHcmFwaE5vZGUgZm9yIGVhY2ggQnJlYWtkb3duRWxlbWVudCBhbmQgYWRkIGl0IHRvIHRoZSBkaWFncmFtCi0JCS8vCi0JCUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZFR5cGVzW2RpYWdyYW1UeXBlXS5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQkJR3JhcGhOb2RlIG5vZGUgPSBjcmVhdGVHcmFwaE5vZGUoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQkJCWRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuYWRkKG5vZGUpOwotCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCi0JCS8vIGNyZWF0ZSBHcmFwaENvbm5lY3RvcnMgZm9yIGVhY2ggQnJlYWtkb3duRWxlbWVudAotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUdyYXBoTm9kZSBub2RlID0gKEdyYXBoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQljcmVhdGVHcmFwaENvbm5lY3RvcnMobm9kZSwgZGlhZ3JhbSwgZGlhZ3JhbVR5cGUpOwotCQl9Ci0JfQotCi0vLwlwcml2YXRlIHZvaWQgcG9wdWxhdGVBY3Rpdml0eURpYWdyYW0oRGlhZ3JhbSBkaWFncmFtLCBBY3Rpdml0eSBhY3QpIHsKLS8vCQkvLyBjcmVhdGUgR3JhcGhOb2RlIGZvciBlYWNoIGNoaWxkIGFjdGl2aXR5IGFuZCBhZGQgaXQgdG8gdGhlIGRpYWdyYW0KLS8vCQkvLyAKLS8vCQlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0vLwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLS8vCQkJCUFjdGl2aXR5IGNoaWxkQWN0ID0gKEFjdGl2aXR5KSBlbGVtZW50OwotLy8JCQkJR3JhcGhOb2RlIG5vZGUgPSBjcmVhdGVHcmFwaE5vZGUoY2hpbGRBY3QpOwotLy8JCQkJZGlhZ3JhbS5nZXRDb250YWluZWQoKS5hZGQobm9kZSk7Ci0vLwkJCQlub2Rlcy5hZGQobm9kZSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCS8vIGNyZWF0ZSBHcmFwaENvbm5lY3RvcnMgZm9yIGVhY2ggY2hpbGQgYWN0aXZpdHkKLS8vCQkvLwotLy8JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQlHcmFwaE5vZGUgbm9kZSA9IChHcmFwaE5vZGUpIGl0ZXIubmV4dCgpOwotLy8JCQljcmVhdGVHcmFwaENvbm5lY3RvcnMobm9kZSwgZGlhZ3JhbSk7Ci0vLwkJfQotLy8JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdAotCSAqIEBwYXJhbSBkaWFncmFtVHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciBnZXREaWFncmFtQ2hhbmdlTGlzdGVuZXIoQWN0aXZpdHkgYWN0LAotCQkJaW50IGRpYWdyYW1UeXBlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdC5lQWRhcHRlcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZGlhZ3JhbUNoYW5nZUxpc3RlbmVyQ2xhc3Nlc1tkaWFncmFtVHlwZV0uaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCXJldHVybiAoSURpYWdyYW1DaGFuZ2VMaXN0ZW5lcikgZWxlbWVudDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBHcmFwaE5vZGUgY3JlYXRlR3JhcGhOb2RlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGhOb2RlKCk7Ci0JCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbW9kZWxCcmlkZ2UgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0JCW1vZGVsQnJpZGdlLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0JCWdyYXBoTm9kZS5zZXRTZW1hbnRpY01vZGVsKG1vZGVsQnJpZGdlKTsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCBwb2ludCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvaW50KCk7Ci0JCXBvaW50LnNldFgobmV3IERvdWJsZSgtMSkpOwotCQlwb2ludC5zZXRZKG5ldyBEb3VibGUoLTEpKTsKLQkJZ3JhcGhOb2RlLnNldFBvc2l0aW9uKHBvaW50KTsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24gZGltID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGltZW5zaW9uKCk7Ci0JCWRpbS5zZXRXaWR0aChuZXcgRG91YmxlKC0xKSk7Ci0JCWRpbS5zZXRIZWlnaHQobmV3IERvdWJsZSgtMSkpOwotCQlncmFwaE5vZGUuc2V0U2l6ZShkaW0pOwotCi0JCXJldHVybiBncmFwaE5vZGU7Ci0JfQotCi0JcHVibGljIEdyYXBoRWRnZSBhZGRHcmFwaENvbm5lY3RvclBhaXIoRGlhZ3JhbSBkaWFncmFtLAotCQkJR3JhcGhOb2RlIGdyYXBoTm9kZSwgV29ya09yZGVyIGVsZW1lbnQpIHsKLQkJR3JhcGhDb25uZWN0b3Igc3JjQ29ubmVjdG9yID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlR3JhcGhDb25uZWN0b3IoKTsKLQkJZ3JhcGhOb2RlLmdldEFuY2hvcmFnZSgpLmFkZChzcmNDb25uZWN0b3IpOwotCQlHcmFwaEVkZ2UgZWRnZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoRWRnZSgpOwotCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIGJyaWRnZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQkJYnJpZGdlLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0JCWVkZ2Uuc2V0U2VtYW50aWNNb2RlbChicmlkZ2UpOwotCQlncmFwaE5vZGUuZ2V0Q29udGFpbmVkKCkuYWRkKGVkZ2UpOwotCQllZGdlLmdldEFuY2hvcigpLmFkZChzcmNDb25uZWN0b3IpOwotCi0JCUdyYXBoTm9kZSBzdWNjTm9kZSA9IGdldEdyYXBoTm9kZShkaWFncmFtLCBVbWFVdGlsCi0JCQkJLmdldE93bmluZ0FjdGl2aXR5KGVsZW1lbnQpKTsKLQkJR3JhcGhDb25uZWN0b3IgdGFyZ2V0Q29ubmVjdG9yID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlR3JhcGhDb25uZWN0b3IoKTsKLQkJc3VjY05vZGUuZ2V0QW5jaG9yYWdlKCkuYWRkKHRhcmdldENvbm5lY3Rvcik7Ci0JCWVkZ2UuZ2V0QW5jaG9yKCkuYWRkKHRhcmdldENvbm5lY3Rvcik7Ci0JCXJldHVybiBlZGdlOwotCX0KLQotCXB1YmxpYyBHcmFwaEVkZ2UgYWRkR3JhcGhDb25uZWN0b3JQYWlyKEdyYXBoTm9kZSBzcmNOb2RlLAotCQkJR3JhcGhOb2RlIHRhcmdldE5vZGUpIHsKLQkJR3JhcGhDb25uZWN0b3Igc3JjQ29ubmVjdG9yID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlR3JhcGhDb25uZWN0b3IoKTsKLQkJc3JjTm9kZS5nZXRBbmNob3JhZ2UoKS5hZGQoc3JjQ29ubmVjdG9yKTsKLQkJR3JhcGhFZGdlIGVkZ2UgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHcmFwaEVkZ2UoKTsKLQkJc3JjTm9kZS5nZXRDb250YWluZWQoKS5hZGQoZWRnZSk7Ci0JCWVkZ2UuZ2V0QW5jaG9yKCkuYWRkKHNyY0Nvbm5lY3Rvcik7Ci0KLQkJR3JhcGhDb25uZWN0b3IgdGFyZ2V0Q29ubmVjdG9yID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlR3JhcGhDb25uZWN0b3IoKTsKLQkJdGFyZ2V0Tm9kZS5nZXRBbmNob3JhZ2UoKS5hZGQodGFyZ2V0Q29ubmVjdG9yKTsKLQkJZWRnZS5nZXRBbmNob3IoKS5hZGQodGFyZ2V0Q29ubmVjdG9yKTsKLQkJcmV0dXJuIGVkZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlR3JhcGhFZGdlKEdyYXBoRWRnZSBlZGdlKSB7Ci0JCUVjb3JlVXRpbC5yZW1vdmUoZWRnZSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVkZ2UuZ2V0QW5jaG9yKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlHcmFwaENvbm5lY3RvciBjb25uID0gKEdyYXBoQ29ubmVjdG9yKSBpdGVyLm5leHQoKTsKLQkJCUVjb3JlVXRpbC5yZW1vdmUoY29ubik7Ci0JCX0KLQl9Ci0KLQkvLyBwdWJsaWMgdm9pZCByZW1vdmVHcmFwaENvbm5lY3RvclBhaXIoR3JhcGhOb2RlIHNyY05vZGUsIEdyYXBoTm9kZQotCS8vIHRhcmdldE5vZGUpIHsKLQkvLyAvLyBmaW5kIHRoZSBzb3VyY2UgR3JhcGhDb25uZWN0b3IgYW5kIHJlbW92ZSBpdCwgaXRzIEdyYXBoRWRnZSwgYW5kIGl0cwotCS8vIHRhcmdldCBHcmFwaENvbm5lY3RvcgotCS8vIC8vCi0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gc3JjTm9kZS5nZXRBbmNob3JhZ2UoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JLy8gewotCS8vIEdyYXBoQ29ubmVjdG9yIGNvbm5lY3RvciA9IChHcmFwaENvbm5lY3RvcikgaXRlci5uZXh0KCk7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbm5lY3Rvci5nZXRHcmFwaEVkZ2UoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCS8vIC5oYXNOZXh0KCk7KSB7Ci0JLy8gR3JhcGhFZGdlIGVkZ2UgPSAoR3JhcGhFZGdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JLy8gT2JqZWN0IHRhcmdldENvbm5lY3RvciA9IGVkZ2UuZ2V0QW5jaG9yKCkuZ2V0KDEpOwotCS8vIGlmKHRhcmdldE5vZGUuZ2V0QW5jaG9yYWdlKCkucmVtb3ZlKHRhcmdldENvbm5lY3RvcikpIHsKLQkvLyBzcmNOb2RlLmdldENvbnRhaW5lZCgpLnJlbW92ZShlZGdlKTsKLQkvLyAvLyBkb24ndCByZW1vdmUgdGhlIGVkZ2UgZnJvbSBjb25uZWN0b3IgdG8gc3VwcG9ydCB1bmRvCi0JLy8gLy8KLQkvLyAvLyBpdGVyYXRvci5yZW1vdmUoKTsKLQkvLyB9Ci0JLy8gfQotCS8vIGlmKGNvbm5lY3Rvci5nZXRHcmFwaEVkZ2UoKS5pc0VtcHR5KCkpIHsKLQkvLyBpdGVyLnJlbW92ZSgpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlR3JhcGhDb25uZWN0aW9uUGFpcihHcmFwaE5vZGUgZ3JhcGhOb2RlLAotCQkJV29ya09yZGVyIHdvcmtPcmRlcikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBncmFwaE5vZGUuZ2V0QW5jaG9yYWdlKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlHcmFwaENvbm5lY3RvciBjb25uID0gKEdyYXBoQ29ubmVjdG9yKSBpdGVyLm5leHQoKTsKLQkJCUdyYXBoRWRnZSBlZGdlID0gKEdyYXBoRWRnZSkgY29ubi5nZXRHcmFwaEVkZ2UoKS5nZXQoMCk7Ci0JCQlpZiAoZWRnZS5lQ29udGFpbmVyKCkgPT0gZ3JhcGhOb2RlKSB7Ci0JCQkJR3JhcGhDb25uZWN0b3IgY29ubjIgPSAoR3JhcGhDb25uZWN0b3IpIGVkZ2UuZ2V0QW5jaG9yKCkuZ2V0KDEpOwotCQkJCVNlbWFudGljTW9kZWxCcmlkZ2UgYnJpZGdlID0gY29ubjIuZ2V0R3JhcGhFbGVtZW50KCkKLQkJCQkJCS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJaWYgKGJyaWRnZSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UKLQkJCQkJCSYmICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgYnJpZGdlKS5nZXRFbGVtZW50KCkgPT0gVW1hVXRpbAotCQkJCQkJCQkuZ2V0T3duaW5nQWN0aXZpdHkod29ya09yZGVyKSkgewotCQkJCQljb25uMi5nZXRHcmFwaEVsZW1lbnQoKS5nZXRBbmNob3JhZ2UoKS5yZW1vdmUoY29ubjIpOwotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQlncmFwaE5vZGUuZ2V0Q29udGFpbmVkKCkucmVtb3ZlKGVkZ2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUdyYXBoQ29ubmVjdG9ycyhHcmFwaE5vZGUgZ3JhcGhOb2RlLCBEaWFncmFtIGRpYWdyYW0pIHsKLQkJY3JlYXRlR3JhcGhDb25uZWN0b3JzKGdyYXBoTm9kZSwgZGlhZ3JhbSwgZ2V0RGlhZ3JhbVR5cGUoZGlhZ3JhbSkpOwotCX0KLQotCWludCBnZXREaWFncmFtVHlwZShEaWFncmFtIGRpYWdyYW0pIHsKLQkJU3RyaW5nIHR5cGVTdHIgPSBkaWFncmFtLmdldFNlbWFudGljTW9kZWwoKS5nZXRQcmVzZW50YXRpb24oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaWFncmFtUHJlc2VudGF0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGRpYWdyYW1QcmVzZW50YXRpb25zW2ldLmVxdWFscyh0eXBlU3RyKSkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUdyYXBoQ29ubmVjdG9ycyhHcmFwaE5vZGUgZ3JhcGhOb2RlLCBEaWFncmFtIGRpYWdyYW0sCi0JCQlpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJTWV0aG9kRWxlbWVudCBlID0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBncmFwaE5vZGUKLQkJCQkuZ2V0U2VtYW50aWNNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCXN3aXRjaCAoZGlhZ3JhbVR5cGUpIHsKLQkJY2FzZSBHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBlOwotCQkJCS8vIGNyZWF0ZSBjb25uZWN0b3JzCi0JCQkJLy8KLQkJCQkvLyBMaXN0IGxpc3QgPSBhY3QuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKTsKLQkJCQkvLyBpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQkJCS8vCQkJCQotCQkJCS8vIEFjdGl2aXR5IHBhcmVudCA9IChBY3Rpdml0eSkKLQkJCQkvLyAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpZGlhZ3JhbS5nZXRTZW1hbnRpY01vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJCQkvLyBMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gcGFyZW50LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQkJLy8gZm9yKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCS8vIFdvcmtPcmRlciB3b3JrT3JkZXIgPSAoV29ya09yZGVyKSBsaXN0LmdldChpKTsKLQkJCQkvLyBpZihicmVha2Rvd25FbGVtZW50cy5jb250YWlucyh3b3JrT3JkZXIuZ2V0UHJlZCgpKSkgewotCQkJCS8vIGFkZEdyYXBoQ29ubmVjdG9yUGFpcihkaWFncmFtLCBncmFwaE5vZGUsIHdvcmtPcmRlcik7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdC5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVdvcmtPcmRlciB3b3JrT3JkZXIgPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJR3JhcGhOb2RlIHNyY05vZGUgPSBmaW5kR3JhcGhOb2RlKGRpYWdyYW0sIHdvcmtPcmRlcgotCQkJCQkJCS5nZXRQcmVkKCkpOwotCQkJCQlpZiAoc3JjTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRHcmFwaENvbm5lY3RvclBhaXIoc3JjTm9kZSwgZ3JhcGhOb2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJYnJlYWs7Ci0JCWNhc2UgR3JhcGhpY2FsRGF0YUhlbHBlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGU7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVzY3JpcHRvci5nZXRJbXBhY3RzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGltcGFjdGVkRGVzY3JpcHRvciA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0ZXIKLQkJCQkJCQkubmV4dCgpOwotCQkJCQlHcmFwaE5vZGUgdGFyZ2V0Tm9kZSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmZpbmRHcmFwaE5vZGUoCi0JCQkJCQkJZGlhZ3JhbSwgaW1wYWN0ZWREZXNjcmlwdG9yKTsKLQkJCQkJaWYgKHRhcmdldE5vZGUgIT0gbnVsbCkgewotCQkJCQkJYWRkR3JhcGhDb25uZWN0b3JQYWlyKGdyYXBoTm9kZSwgdGFyZ2V0Tm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBVTUEgZGlhZ3JhbSBmcm9tIHRoZSBVTUEgbW9kZWwgZm9yIHRoZSBnaXZlbiBhY3Rpdml0eS4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBkaWFncmFtVHlwZQotCSAqICAgICAgICAgICAgb25lIG9mIHRoZSBkaWFncmFtIHR5cGUgY29uc3RhbnRzIGRlZmluZWQgaW4KLQkgKiAgICAgICAgICAgIHtAbGluayBHcmFwaGljYWxEYXRhSGVscGVyIEdyYXBoaWNhbERhdGFIZWxwZXIgfQotCSAqIEBwYXJhbSBjcmVhdGUKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIG5ldyBVTUEgZGlhZ3JhbSB3aWxsIGJlIGNyZWF0ZWQgaWYgdGhlIGFjdGl2aXR5IGRvZXMKLQkgKiAgICAgICAgICAgIG5vdCBoYXZlIG9uZSBhbHJlYWR5LgotCSAqIEByZXR1cm4KLQkgKiBAc2VlIEdyYXBoaWNhbERhdGFIZWxwZXIjQUNUSVZJVFlfRElBR1JBTQotCSAqIEBzZWUgR3JhcGhpY2FsRGF0YUhlbHBlciNBQ1RJVklUWV9ERVRBSUxfRElBR1JBTQotCSAqIEBzZWUgR3JhcGhpY2FsRGF0YUhlbHBlciNXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNCi0JICovCi0JcHVibGljIERpYWdyYW0gZ2V0VU1BRGlhZ3JhbShBY3Rpdml0eSBlLCBpbnQgZGlhZ3JhbVR5cGUsIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IG51bGw7Ci0KLQkJLy8gLy8gbG9vayBmb3IgSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciBpbiBhY3Rpdml0eSdzIGFkYXB0ZXIgbGlzdCBmaXJzdAotCQkvLyBJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gKElEaWFncmFtQ2hhbmdlTGlzdGVuZXIpCi0JCS8vIFVtYVV0aWwuZ2V0QWRhcHRlcihlLCBkaWFncmFtTGlzdGVuZXJUeXBlKTsKLQkJLy8gaWYobGlzdGVuZXIgIT0gbnVsbCkgewotCQkvLyBkaWFncmFtID0gbGlzdGVuZXIuZ2V0RGlhZ3JhbSgpLmdldFVNQURpYWdyYW0oKTsKLQkJLy8gaWYoZGlhZ3JhbSAhPSBudWxsKSByZXR1cm4gZGlhZ3JhbTsKLQkJLy8gfQotCi0JCU9iamVjdCBjb250YWluZXIgPSBlLmVDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGNvbnRhaW5lcjsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHBrZy5nZXREaWFncmFtcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWRpYWdyYW0gPSAoRGlhZ3JhbSkgaXRlci5uZXh0KCk7Ci0JCQkJU2VtYW50aWNNb2RlbEJyaWRnZSBtb2RlbEJyaWRnZSA9IGRpYWdyYW0uZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCWlmIChtb2RlbEJyaWRnZSAhPSBudWxsCi0JCQkJCQkmJiBtb2RlbEJyaWRnZSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UKLQkJCQkJCSYmIGUgPT0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBtb2RlbEJyaWRnZSkKLQkJCQkJCQkJLmdldEVsZW1lbnQoKQotCQkJCQkJJiYgZGlhZ3JhbVByZXNlbnRhdGlvbnNbZGlhZ3JhbVR5cGVdCi0JCQkJCQkJCS5lcXVhbHMoKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBtb2RlbEJyaWRnZSkKLQkJCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpKSB7Ci0JCQkJCXJldHVybiBkaWFncmFtOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChjcmVhdGUpIHsKLQkJCS8vIGNvdWxkIG5vdCBmaW5kIGl0LCBjcmVhdGUgbmV3IG9uZQotCQkJLy8KLQkJCWRpYWdyYW0gPSBjcmVhdGVEaWFncmFtKGUsIGRpYWdyYW1UeXBlKTsKLQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCSgoUHJvY2Vzc1BhY2thZ2UpIGNvbnRhaW5lcikuZ2V0RGlhZ3JhbXMoKS5hZGQoZGlhZ3JhbSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZGlhZ3JhbTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyBwdWJsaWMgRGlhZ3JhbSBnZXRVTUFEaWFncmFtKEFjdGl2aXR5IGFjdCwgaW50IGRpYWdyYW1UeXBlKSB7Ci0JLy8gRGlhZ3JhbSBkaWFncmFtID0gbnVsbDsKLQkvLyAgICAgICAgCi0JLy8gLy8gbG9vayBmb3IgSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciBpbiBhY3Rpdml0eSdzIGFkYXB0ZXIgbGlzdCBmaXJzdAotCS8vIElEaWFncmFtQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBnZXREaWFncmFtQ2hhbmdlTGlzdGVuZXIoYWN0LAotCS8vIGRpYWdyYW1UeXBlKTsKLQkvLyBpZihsaXN0ZW5lciAhPSBudWxsKSB7Ci0JLy8gZGlhZ3JhbSA9IGxpc3RlbmVyLmdldERpYWdyYW0oKS5nZXRVTUFEaWFncmFtKCk7Ci0JLy8gaWYoZGlhZ3JhbSAhPSBudWxsKSByZXR1cm4gZGlhZ3JhbTsKLQkvLyB9Ci0JLy8gT2JqZWN0IGNvbnRhaW5lciA9IGFjdC5lQ29udGFpbmVyKCk7Ci0JLy8gaWYoY29udGFpbmVyICE9IG51bGwpIHsKLQkvLyBQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGNvbnRhaW5lcjsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0RGlhZ3JhbXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBkaWFncmFtID0gKERpYWdyYW0pIGl0ZXIubmV4dCgpOwotCS8vIFNlbWFudGljTW9kZWxCcmlkZ2UgbW9kZWxCcmlkZ2UgPSBkaWFncmFtLmdldFNlbWFudGljTW9kZWwoKTsKLQkvLyBpZihtb2RlbEJyaWRnZSAhPSBudWxsICYmIG1vZGVsQnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZQotCS8vICYmIGFjdCA9PSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpbW9kZWxCcmlkZ2UpLmdldEVsZW1lbnQoKQotCS8vICYmCi0JLy8gZGlhZ3JhbVByZXNlbnRhdGlvbnNbZGlhZ3JhbVR5cGVdLmVxdWFscygoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpbW9kZWxCcmlkZ2UpLmdldFByZXNlbnRhdGlvbigpKSkKLQkvLyB7Ci0JLy8gcmV0dXJuIGRpYWdyYW07Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gICAgICAgIAotCS8vIC8vIGNvdWxkIG5vdCBmaW5kIGl0LCBjcmVhdGUgbmV3IG9uZQotCS8vIC8vCi0JLy8gcmV0dXJuIGNyZWF0ZURpYWdyYW0oYWN0LCBkaWFncmFtVHlwZSk7Ci0JLy8gfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSBnZXREaWFncmFtKEFjdGl2aXR5IGFjdCwKLQkJCWludCBkaWFncmFtVHlwZSkgewotCQlJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gZ2V0RGlhZ3JhbUNoYW5nZUxpc3RlbmVyKGFjdCwKLQkJCQlkaWFncmFtVHlwZSk7Ci0JCXJldHVybiBsaXN0ZW5lciA9PSBudWxsID8gbnVsbCA6IGxpc3RlbmVyLmdldERpYWdyYW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGxpc3Qgb2YgY29tbWFuZCBsaXN0ZW5lcnMgdGhhdCB3aWxsIGhhbmRsZSB0aGUgZGlhZ3JhbSByZWxhdGVkIGNoYW5nZXMgb2YgdGhlIGNvbW1hbmRzIG9mIGludGVyZXNzZXMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogQHNlZSBJQ29tbWFuZExpc3RlbmVyCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q29tbWFuZExpc3RlbmVycygpIHsKLQkJaWYgKGNvbW1hbmRMaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJY29tbWFuZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCi0JCWNvbW1hbmRMaXN0ZW5lcnMuYWRkKG5ldyBJQ29tbWFuZExpc3RlbmVyKCkgewotCQkJCi0JCQlwdWJsaWMgdm9pZCBub3RpZnlFeGVjdXRlZChDb21tYW5kIGNvbW1hbmQpIHsKLQkJCQkvLyBnZXQgY29udHJpYnV0b3IvcmVwbGFjZXIgb2YgdGhlIGFjdGl2aXR5Ci0JCQkJLy8KLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGNvbW1hbmQuZ2V0UmVzdWx0KCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJQWN0aXZpdHkgYmFzZSA9IChBY3Rpdml0eSkgYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJCUFjdGl2aXR5IHBhcmVudEFjdCA9IGFjdC5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gZ2V0VU1BRGlhZ3JhbShwYXJlbnRBY3QsCi0JCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ESUFHUkFNLCBmYWxzZSk7Ci0JCQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJCS8vIGZpbmQgZXhpc3Rpbmcgbm9kZSBmb3IgYmFzZSBhbmQgbGluayBpdCB0byB0aGUKLQkJCQkJCS8vIGNvbnRyaWJ1dG9yZS9yZXBsYWNlciBvZiB0aGUgYWN0aXZpdHkKLQkJCQkJCS8vCi0JCQkJCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gZmluZEdyYXBoTm9kZShkaWFncmFtLCBiYXNlKTsKLQkJCQkJCWlmIChncmFwaE5vZGUgIT0gbnVsbCkgewotCQkJCQkJCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgYnJpZGdlID0gKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGdyYXBoTm9kZQotCQkJCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCQkJCQlpZiAoYnJpZGdlLmdldEVsZW1lbnQoKSAhPSBhY3QpIHsKLQkJCQkJCQkJYnJpZGdlLnNldEVsZW1lbnQoYWN0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmKGFjdC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OX0xJVEVSQUwpIHsKLQkJCQkJCS8vIGNvcHkgZGlhZ3JhbXMgYW5kIHRoZWlyIHB1Ymxpc2hpbmcgb3B0aW9ucwotCQkJCQkJLy8KLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgR3JhcGhpY2FsRGF0YUhlbHBlci5ESUFHUkFNX1RZUEVTLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJaW50IGRpYWdyYW1UeXBlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5ESUFHUkFNX1RZUEVTW2ldOwotCQkJCQkJCWRpYWdyYW0gPSBnZXRVTUFEaWFncmFtKGJhc2UsIGRpYWdyYW1UeXBlLCBmYWxzZSk7Ci0JCQkJCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJCQlEaWFncmFtIGNvcHkgPSBnZXRVTUFEaWFncmFtKGFjdCwgZGlhZ3JhbVR5cGUsIHRydWUpOwotCQkJCQkJCQljb3B5LnNldFN1cHByZXNzZWQoZGlhZ3JhbS5nZXRTdXBwcmVzc2VkKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIENsYXNzIGdldENvbW1hbmRUeXBlKCkgewotCQkJCXJldHVybiBWYXJ5QWN0aXZpdHlDb21tYW5kLmNsYXNzOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwcmVVbmRvKENvbW1hbmQgY29tbWFuZCkgewotCQkJCS8vIGdldCBvbGQgY29udHJpYnV0b3IvcmVwbGFjZXIgb2YgdGhlIGFjdGl2aXR5Ci0JCQkJLy8KLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGNvbW1hbmQuZ2V0UmVzdWx0KCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0vLwkJCQlWYXJ5QWN0aXZpdHlDb21tYW5kIGNtZCA9IChWYXJ5QWN0aXZpdHlDb21tYW5kKSBjb21tYW5kOwotLy8JCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgYWRhcHRlciA9IGNtZC5nZXRXcmFwcGVyKCk7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2VBY3QgPSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmIChiYXNlQWN0ICE9IG51bGwpIHsKLQkJCQkJQWN0aXZpdHkgcGFyZW50QWN0ID0gYWN0LmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSBnZXRVTUFEaWFncmFtKHBhcmVudEFjdCwKLQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RJQUdSQU0sIGZhbHNlKTsKLQkJCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJLy8gZmluZCBleGlzdGluZyBub2RlIGZvciB0aGUgb2xkIGNvbnRyaWJ1dG9yZS9yZXBsYWNlcgotCQkJCQkJLy8gb2xkIGFuZCByZWxpbmsgaXQgdG8gdGhlIGJhc2UgYWN0aXZpdHkKLQkJCQkJCS8vCi0JCQkJCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gZmluZEdyYXBoTm9kZShkaWFncmFtLCBhY3QpOwotCQkJCQkJaWYgKGdyYXBoTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSAoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgZ3JhcGhOb2RlCi0JCQkJCQkJCQkuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQkJCWlmIChicmlkZ2UuZ2V0RWxlbWVudCgpICE9IGJhc2VBY3QpIHsKLQkJCQkJCQkJYnJpZGdlLnNldEVsZW1lbnQoYmFzZUFjdCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwcmVFeGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQkJCQotCQkJfQotCi0JCX0pOwotCi0JCXJldHVybiBjb21tYW5kTGlzdGVuZXJzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBY3Rpdml0eURldGFpbERpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNzBlYTU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi0vKioKLSAqIERpYWdyYW0gY2hhbmdlIGxpc3RlbmVyIGZvciBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBY3Rpdml0eURldGFpbERpYWdyYW1DaGFuZ2VMaXN0ZW5lciBleHRlbmRzCi0JCUlEaWFncmFtQ2hhbmdlTGlzdGVuZXIgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBY3Rpdml0eURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JQWN0aXZpdHlEaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmEyYWRjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBY3Rpdml0eURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotLyoqCi0gKiBEaWFncmFtIGNoYW5nZSBsaXN0ZW5lciBmb3IgYWN0aXZpdHkgZGlhZ3JhbQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBY3Rpdml0eURpYWdyYW1DaGFuZ2VMaXN0ZW5lciBleHRlbmRzIElEaWFncmFtQ2hhbmdlTGlzdGVuZXIgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBY3Rpdml0eU5vZGVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JQWN0aXZpdHlOb2RlQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDFjY2UzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBY3Rpdml0eU5vZGVDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotLyoqCi0gKiBOb2RlIGNoYW5nZSBsaXN0ZW5lciBmb3IgYWN0aXZpdHkgbm9kZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBY3Rpdml0eU5vZGVDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIElOb2RlQ2hhbmdlTGlzdGVuZXIgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBZGFwdGVyRmFjdG9yeUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JQWRhcHRlckZhY3RvcnlGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTViMDk0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBZGFwdGVyRmFjdG9yeUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotCi0vKioKLSAqIEZpbHRlciB0aGF0IHByb3ZpZGVzIGFkYXB0ZXIgZmFjdG9yaWVzIGZvciBkaWZmZXJlbnQgdmlld3Mgb2YgcHJvY2VzcwotICogYnJlYWtkb3duIHN0cnVjdHVyZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWRhcHRlckZhY3RvcnlGaWx0ZXIgZXh0ZW5kcyBJRmlsdGVyLCBJQWRhcHRlckZhY3RvcnlQcm92aWRlciB7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lEaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYjE4OWE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLQotLyoqCi0gKiBBZGFwdGVyIHRvIGxpc3RlbiB0byBkaWFncmFtIGNoYW5nZXMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgQWRhcHRlciB7Ci0JRGlhZ3JhbSBnZXREaWFncmFtKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lOb2RlQ2hhbmdlTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSU5vZGVDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNDgwZDA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSU5vZGVDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLQotLyoqCi0gKiBBZGFwdGVyIHRvIGxpc3RlbiB0byBjaGFuZ2VzIGluIGRpYWdyYW0gbm9kZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElOb2RlQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBBZGFwdGVyIHsKLQlOb2RlIGdldE5vZGUoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSVdQRERpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JV1BERGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFjNjAyZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JV1BERGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi0vKioKLSAqIERpYWdyYW0gY2hhbmdlIGxpc3RlbmVyIGZvciB3b3JrIHByb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXUEREaWFncmFtQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9Nb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL01vZGVsQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODU2YmRhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL01vZGVsQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBNb2RlbFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBNb2RlbEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IE1vZGVsUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgTW9kZWxTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgTW9kZWxTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEaWFncmFtKERpYWdyYW0gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURpYWdyYW1BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMaW5rKExpbmsgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUxpbmtBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMaW5rZWRPYmplY3QoTGlua2VkT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMaW5rZWRPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VOYW1lZE5vZGUoTmFtZWROb2RlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVOYW1lZE5vZGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VOb2RlKE5vZGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU5vZGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBY3Rpdml0eURpYWdyYW0oQWN0aXZpdHlEaWFncmFtIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBY3Rpdml0eURpYWdyYW1BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUeXBlZE5vZGUoVHlwZWROb2RlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUeXBlZE5vZGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrUHJvZHVjdE5vZGUoV29ya1Byb2R1Y3ROb2RlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdE5vZGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBY3Rpdml0eURldGFpbERpYWdyYW0oQWN0aXZpdHlEZXRhaWxEaWFncmFtIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBY3Rpdml0eURldGFpbERpYWdyYW1BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VOb2RlQ29udGFpbmVyKE5vZGVDb250YWluZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU5vZGVDb250YWluZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSb2xlTm9kZShSb2xlTm9kZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUm9sZU5vZGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSb2xlVGFza0NvbXBvc2l0ZShSb2xlVGFza0NvbXBvc2l0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUm9sZVRhc2tDb21wb3NpdGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUYXNrTm9kZShUYXNrTm9kZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGFza05vZGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrUHJvZHVjdENvbXBvc2l0ZShXb3JrUHJvZHVjdENvbXBvc2l0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNb2RlbF9MaW5rZWRPYmplY3QoTGlua2VkT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNb2RlbF9MaW5rZWRPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNb2RlbF9Ob2RlKE5vZGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1vZGVsX05vZGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNb2RlbF9Ob2RlQ29udGFpbmVyKE5vZGVDb250YWluZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1vZGVsX05vZGVDb250YWluZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNb2RlbF9EaWFncmFtKERpYWdyYW0gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1vZGVsX0RpYWdyYW1BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNb2RlbF9OYW1lZE5vZGUoTmFtZWROb2RlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNb2RlbF9OYW1lZE5vZGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpYWdyYW1BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsgPGVtPkxpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVMaW5rQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3QgPGVtPkxpbmtlZCBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxpbmtlZE9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlIDxlbT5OYW1lZCBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVOYW1lZE5vZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUgPGVtPk5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVOb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW0gPGVtPkFjdGl2aXR5IERpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlIDxlbT5UeXBlZCBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVUeXBlZE5vZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gPGVtPldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGUgPGVtPldvcmsgUHJvZHVjdCBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdE5vZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSA8ZW0+QWN0aXZpdHkgRGV0YWlsIERpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lciA8ZW0+Tm9kZSBDb250YWluZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVOb2RlQ29udGFpbmVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZSA8ZW0+Um9sZSBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVOb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZSA8ZW0+Um9sZSBUYXNrIENvbXBvc2l0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGUgPGVtPlRhc2sgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3IgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlIDxlbT5Xb3JrIFByb2R1Y3QgQ29tcG9zaXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3QgPGVtPkxpbmtlZCBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZGVsX0xpbmtlZE9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSA8ZW0+Tm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZGVsX05vZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXIgPGVtPk5vZGUgQ29udGFpbmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kZWxfTm9kZUNvbnRhaW5lckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZGVsX0RpYWdyYW1BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZSA8ZW0+TmFtZWQgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kZWxfTmFtZWROb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL01vZGVsQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvTW9kZWxTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvTW9kZWxTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTI3MmVkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL01vZGVsU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgTW9kZWxQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgTW9kZWxTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuRElBR1JBTTogewotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEaWFncmFtKGRpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX05vZGVDb250YWluZXIoZGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTm9kZShkaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9MaW5rZWRPYmplY3QoZGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOSzogewotCQkJCUxpbmsgbGluayA9IChMaW5rKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VMaW5rKGxpbmspOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX0xpbmtlZE9iamVjdChsaW5rKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUOiB7Ci0JCQkJTGlua2VkT2JqZWN0IGxpbmtlZE9iamVjdCA9IChMaW5rZWRPYmplY3QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdChsaW5rZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5BTUVEX05PREU6IHsKLQkJCQlOYW1lZE5vZGUgbmFtZWROb2RlID0gKE5hbWVkTm9kZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTmFtZWROb2RlKG5hbWVkTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTm9kZShuYW1lZE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX0xpbmtlZE9iamVjdChuYW1lZE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREU6IHsKLQkJCQlOb2RlIG5vZGUgPSAoTm9kZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTm9kZShub2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9MaW5rZWRPYmplY3Qobm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuQUNUSVZJVFlfRElBR1JBTTogewotCQkJCUFjdGl2aXR5RGlhZ3JhbSBhY3Rpdml0eURpYWdyYW0gPSAoQWN0aXZpdHlEaWFncmFtKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBY3Rpdml0eURpYWdyYW0oYWN0aXZpdHlEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9EaWFncmFtKGFjdGl2aXR5RGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTm9kZUNvbnRhaW5lcihhY3Rpdml0eURpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX05vZGUoYWN0aXZpdHlEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9MaW5rZWRPYmplY3QoYWN0aXZpdHlEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFOiB7Ci0JCQkJVHlwZWROb2RlIHR5cGVkTm9kZSA9IChUeXBlZE5vZGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVR5cGVkTm9kZSh0eXBlZE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX05vZGUodHlwZWROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9MaW5rZWRPYmplY3QodHlwZWROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOiB7Ci0JCQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSB3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtID0gKFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0od29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfRGlhZ3JhbSh3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9Ob2RlQ29udGFpbmVyKHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX05vZGUod29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTGlua2VkT2JqZWN0KHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9OT0RFOiB7Ci0JCQkJV29ya1Byb2R1Y3ROb2RlIHdvcmtQcm9kdWN0Tm9kZSA9IChXb3JrUHJvZHVjdE5vZGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0Tm9kZSh3b3JrUHJvZHVjdE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX05hbWVkTm9kZSh3b3JrUHJvZHVjdE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX05vZGUod29ya1Byb2R1Y3ROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9MaW5rZWRPYmplY3Qod29ya1Byb2R1Y3ROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTTogewotCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBhY3Rpdml0eURldGFpbERpYWdyYW0gPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBY3Rpdml0eURldGFpbERpYWdyYW0oYWN0aXZpdHlEZXRhaWxEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9EaWFncmFtKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTm9kZUNvbnRhaW5lcihhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX05vZGUoYWN0aXZpdHlEZXRhaWxEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9MaW5rZWRPYmplY3QoYWN0aXZpdHlEZXRhaWxEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUjogewotCQkJCU5vZGVDb250YWluZXIgbm9kZUNvbnRhaW5lciA9IChOb2RlQ29udGFpbmVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VOb2RlQ29udGFpbmVyKG5vZGVDb250YWluZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX05vZGUobm9kZUNvbnRhaW5lcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTGlua2VkT2JqZWN0KG5vZGVDb250YWluZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlJPTEVfTk9ERTogewotCQkJCVJvbGVOb2RlIHJvbGVOb2RlID0gKFJvbGVOb2RlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSb2xlTm9kZShyb2xlTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTmFtZWROb2RlKHJvbGVOb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9Ob2RlKHJvbGVOb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9MaW5rZWRPYmplY3Qocm9sZU5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlJPTEVfVEFTS19DT01QT1NJVEU6IHsKLQkJCQlSb2xlVGFza0NvbXBvc2l0ZSByb2xlVGFza0NvbXBvc2l0ZSA9IChSb2xlVGFza0NvbXBvc2l0ZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUm9sZVRhc2tDb21wb3NpdGUocm9sZVRhc2tDb21wb3NpdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX05vZGVDb250YWluZXIocm9sZVRhc2tDb21wb3NpdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX05vZGUocm9sZVRhc2tDb21wb3NpdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX0xpbmtlZE9iamVjdChyb2xlVGFza0NvbXBvc2l0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVEFTS19OT0RFOiB7Ci0JCQkJVGFza05vZGUgdGFza05vZGUgPSAoVGFza05vZGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRhc2tOb2RlKHRhc2tOb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9OYW1lZE5vZGUodGFza05vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX05vZGUodGFza05vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX0xpbmtlZE9iamVjdCh0YXNrTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERTogewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgd29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX05hbWVkTm9kZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RlbF9Ob2RlKHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX0xpbmtlZE9iamVjdCh3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREU6IHsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgd29ya0JyZWFrZG93bkVsZW1lbnROb2RlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKHdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTmFtZWROb2RlKHdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kZWxfTm9kZSh3b3JrQnJlYWtkb3duRWxlbWVudE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX0xpbmtlZE9iamVjdCh3b3JrQnJlYWtkb3duRWxlbWVudE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9DT01QT1NJVEU6IHsKLQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSB3b3JrUHJvZHVjdENvbXBvc2l0ZSA9IChXb3JrUHJvZHVjdENvbXBvc2l0ZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3RDb21wb3NpdGUod29ya1Byb2R1Y3RDb21wb3NpdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX05vZGVDb250YWluZXIod29ya1Byb2R1Y3RDb21wb3NpdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX05vZGUod29ya1Byb2R1Y3RDb21wb3NpdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsX0xpbmtlZE9iamVjdCh3b3JrUHJvZHVjdENvbXBvc2l0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIE9iamVjdCBjYXNlRGlhZ3JhbShEaWFncmFtIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGluazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MaW5rPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VMaW5rKExpbmsgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MaW5rZWQgT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxpbmtlZCBPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBPYmplY3QgY2FzZUxpbmtlZE9iamVjdChMaW5rZWRPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lZCBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVkIE5vZGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBPYmplY3QgY2FzZU5hbWVkTm9kZShOYW1lZE5vZGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ob2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBPYmplY3QgY2FzZU5vZGUoTm9kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5IERpYWdyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHkgRGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIE9iamVjdCBjYXNlQWN0aXZpdHlEaWFncmFtKEFjdGl2aXR5RGlhZ3JhbSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlR5cGVkIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VHlwZWQgTm9kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIE9iamVjdCBjYXNlVHlwZWROb2RlKFR5cGVkTm9kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbShXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IE5vZGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtQcm9kdWN0Tm9kZShXb3JrUHJvZHVjdE5vZGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQWN0aXZpdHlEZXRhaWxEaWFncmFtKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgQ29udGFpbmVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgQ29udGFpbmVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VOb2RlQ29udGFpbmVyKE5vZGVDb250YWluZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBOb2RlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSb2xlTm9kZShSb2xlTm9kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgVGFzayBDb21wb3NpdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBUYXNrIENvbXBvc2l0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUm9sZVRhc2tDb21wb3NpdGUoUm9sZVRhc2tDb21wb3NpdGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzayBOb2RlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUYXNrTm9kZShUYXNrTm9kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3IgTm9kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZShXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQgTm9kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IENvbXBvc2l0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV29ya1Byb2R1Y3RDb21wb3NpdGUoV29ya1Byb2R1Y3RDb21wb3NpdGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MaW5rZWQgT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxpbmtlZCBPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1vZGVsX0xpbmtlZE9iamVjdChMaW5rZWRPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ob2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1vZGVsX05vZGUoTm9kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgQ29udGFpbmVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgQ29udGFpbmVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNb2RlbF9Ob2RlQ29udGFpbmVyKE5vZGVDb250YWluZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1vZGVsX0RpYWdyYW0oRGlhZ3JhbSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVkIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TmFtZWQgTm9kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTW9kZWxfTmFtZWROb2RlKE5hbWVkTm9kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vTW9kZWxTd2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxN2M4YTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBhY2Nlc3NpbmcgdGhlIGFjdGl2aXR5IGRpYWdyYW0gbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0OWM0MGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcmVzb3VyY2UgYnVuZGxlIHN1cHBvcnQgZm9yIHRoZSBhY3Rpdml0eSBkaWFncmFtIG1vZGVscy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmMjc0ZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgUmljaCBUZXh0IHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NDAzMWJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTkzM2ZiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLkV4cG9ydE1TUFBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZywKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1DbGFzc1BhdGg6IGV4cG9ydG1zcC5qYXIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZDJlNDZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotc291cmNlLmV4cG9ydG1zcC5qYXIgPSBzcmMvCi1vdXRwdXQuZXhwb3J0bXNwLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IGV4cG9ydG1zcC5qYXIsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB0ZW1wbGF0ZS8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNWZlMGQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgV2l6YXJkcwotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkTmFtZT1NaWNyb3NvZnQgUHJvamVjdAotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkRGVzY3JpcHRpb249RXhwb3J0IGEgcHJvY2VzcyB0byBhIE1pY3Jvc29mdCBQcm9qZWN0LgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNjdlMmY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi08IS0tCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkud2l6YXJkcy5FeHBvcnRNU1BXaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L01TUHJvamVjdC5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Aud2l6YXJkcy5FeHBvcnRUb01TUHJvamVjdFdpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVleHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmROYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVleHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmREZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJleHBvcnRNU1BXaXphcmQiCi0gICAgICAgICBuYW1lPSJFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgV2l6YXJkIEV4dGVuc2lvbiIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL0V4cG9ydE1TUFdpemFyZC5leHNkIiAvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Aud2l6YXJkcy5FeHBvcnRUb01TUHJvamVjdFdpemFyZCIvPgotICAgPC9leHRlbnNpb24+Ci0tLT4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNGJjNzI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGFuIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBvcGVyYXRpb24gaGFzIGZhaWxlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRNU1BFeGNlcHRpb24gZXh0ZW5kcyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC05MjMxODk3MDA1NjE4MDYyNjJMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIEV4cG9ydE1TUEV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKHJvb3RDYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIEV4cG9ydE1TUEV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbiBhbmQgdGhlCi0JICogZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSwgU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKHJvb3RDYXVzZSwgZXJyb3JNc2cpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUE9wdGlvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUE9wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjljNzI1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BPcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UHJvY2Vzc09wdGlvbnM7Ci0KLS8qKgotICogVGhlIGV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBvcHRpb25zLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSA3LjIKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE1TUE9wdGlvbnMgZXh0ZW5kcyBFeHBvcnRQcm9jZXNzT3B0aW9ucyB7Ci0KLQlwcml2YXRlIFN0cmluZyBtc3Byb2plY3ROYW1lOwotCi0JLyoqCi0JICogR2V0cyB0aGUgTWljcm9zb2Z0IFByb2plY3QgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBleHBvcnRlZCBNaWNyb3NvZnQgUHJvamVjdCBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNU1Byb2plY3ROYW1lKCkgewotCQlyZXR1cm4gbXNwcm9qZWN0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wbGF0ZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBleHBvcnRlZCBNaWNyb3NvZnQgUHJvamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1TUHJvamVjdE5hbWUoU3RyaW5nIG1zcHJvamVjdE5hbWUpIHsKLQkJdGhpcy5tc3Byb2plY3ROYW1lID0gbXNwcm9qZWN0TmFtZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4ZDZiMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE1TUFBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgRXhwb3J0TVNQUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydE1TUFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdG9wKEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4cG9ydE1TUFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQUmVzb3VyY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTJhZjQ4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IG1lc3NhZ2UgcmVzb3VyY2UgYnVuZGxlIGFjY2Vzc29yIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEV4cG9ydE1TUFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBFeHBvcnRNU1BSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBFeHBvcnRNU1BSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydE1TUFdpemFyZF90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NHcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FwYWJpbGl0eVBhdHRlcm5SYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcnlQcm9jZXNzUmFkaW9CdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NOYW1lTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRleHROYW1lTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wdGlvbnNHcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaENvbmZpZ3VyYXRpb25DaGVja0JveF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0T25seVBsYW5uZWRFbGVtZW50c0NoZWNrQm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9qZWN0TmFtZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXJMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRNU1BUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdmVyd3JpdGVUZXh0X21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBsZXRlZFRleHRfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0TVNQRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0TVNQRXJyb3JfcmVhc29uOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRXhwb3J0TVNQUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQU2VydmljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YjYyNzBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBTZXJ2aWNlIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE1TUFNlcnZpY2UgaW1wbGVtZW50cyBJRXhwb3J0TVNQU2VydmljZSB7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEV4cG9ydE1TUFNlcnZpY2UgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwb3J0TVNQU2VydmljZSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoRXhwb3J0TVNQU2VydmljZS5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IEV4cG9ydE1TUFNlcnZpY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AuSUV4cG9ydE1TUFNlcnZpY2UjZXhwb3J0TVNQcm9qZWN0KFByb2Nlc3MsCi0JICogICAgICBFeHBvcnRNU1BPcHRpb25zKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cG9ydE1TUHJvamVjdChQcm9jZXNzIHByb2Nlc3MsCi0JCQlFeHBvcnRNU1BPcHRpb25zIGV4cG9ydE9wdGlvbnMpIHRocm93cyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBFeHBvcnRNU1BYTUxTZXJ2aWNlKCkuZXhwb3J0KHByb2Nlc3MsIGV4cG9ydE9wdGlvbnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZmZhMTFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIEV4cG9ydCBQcm9qZWN0IFBsYW4gU2VydmljZSBvcGVyYXRpb24gaGFzIGZhaWxlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02MTAzNjg5ODY4NTcyNDgwMzU5TDsKLQotCS8qKgotCSAqIFRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIFRocm93YWJsZSByb290Q2F1c2U7Ci0KLQkvKioKLQkgKiBUaGUgZXJyb3IgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTXNnOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJdGhpcyhyb290Q2F1c2UsIHJvb3RDYXVzZS5nZXRNZXNzYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZykgewotCQl0aGlzKG51bGwsIGVycm9yTXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24gYW5kIHRoZQotCSAqIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlLCBTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yb290Q2F1c2UgPSByb290Q2F1c2U7Ci0JCXRoaXMuZXJyb3JNc2cgPSBlcnJvck1zZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIFRocm93YWJsZSBnZXRSb290Q2F1c2UoKSB7Ci0JCXJldHVybiByb290Q2F1c2U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQWE1MT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BYTUxPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTZlYzNlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BYTUxPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLkFic3RyYWN0UHVibGlzaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBmaWxlIG9wZXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRNU1BYTUxPcGVyYXRpb24gaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCi0JcHJpdmF0ZSBBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyIHB1Ymxpc2hNZ3I7Ci0KLQlwcml2YXRlIFN0cmluZyBwdWJsaXNoZWRfdXJsOwotCi0JcHJpdmF0ZSBFeGNlcHRpb24gZXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQWE1MT3BlcmF0aW9uKEFic3RyYWN0UHVibGlzaE1hbmFnZXIgcHVibGlzaE1ncikgewotCQlzdXBlcigpOwotCQl0aGlzLnB1Ymxpc2hNZ3IgPSBwdWJsaXNoTWdyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHB1Ymxpc2hlZCBVUkwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoZWRVcmwoKSB7Ci0JCXJldHVybiBwdWJsaXNoZWRfdXJsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4Y2VwdGlvbiwgaWYgYW55LCB0aGF0IG9jY3VycmVkIHdoaWxlIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsKLQkJcmV0dXJuIGV4Y2VwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3MjcnVuKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWV4Y2VwdGlvbiA9IG51bGw7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCW1vbml0b3Iuc2V0VGFza05hbWUoRXhwb3J0TVNQUmVzb3VyY2VzLmV4cG9ydE1TUFRhc2tfbmFtZSk7Ci0JCXRyeSB7Ci0JCQlwdWJsaXNoTWdyLnB1Ymxpc2gobW9uaXRvcik7Ci0JCQlwdWJsaXNoZWRfdXJsID0gcHVibGlzaE1nci5nZXRQdWJsaXNoZWRVcmwoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFhNTFNlcnZpY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFhNTFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGQ0MDBjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BYTUxTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByZWRlY2Vzc29yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsLk1zcHJvamVjdFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy53aXphcmRzLlB1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgUGxhbiBTZXJ2aWNlIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogCi0gKiBCdWdzIGZpeGVkOiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1MDg5Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1MDg2Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1MDk1Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3MjY1Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1MTU1Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU2OTU5Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3MzIxCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU5MjMwCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyMzM2Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY4ODAxCi0gKiBmaXggZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzY5NTEKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE1TUFhNTFNlcnZpY2UgewotCi0JLy8gSWYgdHJ1ZSwgZ2VuZXJhdGUgZGVidWcgdHJhY2VzLgotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBFeHBvcnRNU1BQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvLyBBbGwgVGFza3MgcmVmZXJlbmNlZCBieSB0aGUgZXhwb3J0ZWQgUHJvamVjdCBUZW1wbGF0ZS4KLQlwcml2YXRlIExpc3QgcmVmZXJlbmNlZFRhc2tzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHJvbGVzVG9VaWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHRhc2tVaWRUb1dic1dhcHBlclBhdGhNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHdic1dhcHBlclBhdGhUb0xvY2FsUHJlZExpc3RNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHdic0d1aWRUb1Rhc2tVaWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHdic1dyYXBwZXJQYXRoVG9QcmVkTGlzdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBUaGUgbmFtZSBvZiB0aGUgY29udGVudCBmb2xkZXIuIFRoaXMgd2lsbCBiZSBuYW1lZCBhZnRlciB0aGUgY29udGV4dC4KLQlwcml2YXRlIFN0cmluZyBjb250ZW50Rm9sZGVyTmFtZTsKLQotCXByaXZhdGUgU3RyaW5nIGFiVGFyZ2V0RGlyOwotCi0JLy8gSWYgdHJ1ZSwgb25seSBleHBvcnQgYnJlYWtkb3duIGVsZW1lbnRzIHdpdGggJ2lzUGxhbm5lZCcgYXR0cmlidXRlcyBzZXQKLQkvLyB0byB0cnVlLgotCXByaXZhdGUgYm9vbGVhbiBleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzOwotCi0JcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hDb250ZW50U2l0ZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBpbnQgdGFza191aWQgPSAxOwotCi0JcHJpdmF0ZSBpbnQgcmVzX3VpZCA9IDE7Ci0KLQlwcml2YXRlIGludCBhc3NpZ25fdWlkID0gMTsKLQotCXByaXZhdGUgTXNwcm9qZWN0RmFjdG9yeSBwcm9qZWN0RmFjdG9yeSA9IE1zcHJvamVjdEZhY3RvcnkuZUlOU1RBTkNFOwotCi0JLy8gVGhlIHByb2Nlc3MgdG8gYmUgZXhwb3J0ZWQuCi0JcHJpdmF0ZSBQcm9jZXNzIHByb2Nlc3M7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnkgd2JzQWRhcHRlckZhY3Rvcnk7Ci0KLQkvLyBUaGUgcHJvY2VzcyBjb25maWd1cmF0b3IgZm9yIGZpbHRlcmluZyBicmVha2Rvd24gZWxlbWVudHMgaW4gYQotCS8vIGNvbmZpZ3VyYXRpb24uCi0JcHJpdmF0ZSBQcm9jZXNzQ29uZmlndXJhdG9yIGJyZWFrZG93bkVsZW1lbnRGaWx0ZXI7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHdic0NvbnRlbnRQcm92aWRlcjsKLQotCS8vIE1hcCBwcm9jZXNzZXMgdG8gc3VwcHJlc3Npb24gb2JqZWN0cy4KLQlwcml2YXRlIE1hcCBzdXBwcmVzc2lvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBUaGUgc3VwcHJlc3Npb24gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VsZWN0ZWQgcHJvY2VzcyB0byBiZQotCS8vIGV4cG9ydGVkLgotCXByaXZhdGUgU3VwcHJlc3Npb24gc3VwcHJlc3Npb247Ci0KLQkvLyBUaGUgV0JTIGVsZW1lbnQgcGF0aHMuCi0JcHJpdmF0ZSBTdGFjayBlbGVtZW50UGF0aHMgPSBuZXcgU3RhY2soKTsKLQotCXByaXZhdGUgT2JqZWN0IGN1cnJlbnRFbGVtZW50OwotCi0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudEVsZW1lbnRQYXRoOwotCi0JcHJpdmF0ZSBQcmVkZWNlc3Nvckxpc3QgY3VycmVudFByZWRMaXN0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQWE1MU2VydmljZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHBvcnQgYSBwcm9jZXNzIHRvIGEgTWljcm9zb2Z0IFByb2plY3QgWE1MIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiAgICAgICAgICAgIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MKLQkgKiBAcGFyYW0gZXhwb3J0T3B0aW9ucwotCSAqICAgICAgICAgICAgYSBjb2xsZWN0aW9uIG9mIHVzZXIgc3BlY2lmaWVkIGV4cG9ydCBvcHRpb25zCi0JICogQHRocm93cyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwb3J0KFByb2Nlc3MgcHJvY2VzcywgRXhwb3J0TVNQT3B0aW9ucyBleHBvcnRPcHRpb25zKQotCQkJdGhyb3dzIEV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24gewotCQlTdHJpbmcgbXNwcm9qZWN0TmFtZSA9IGV4cG9ydE9wdGlvbnMuZ2V0TVNQcm9qZWN0TmFtZSgpOwotCQlGaWxlIGV4cG9ydERpciA9IGV4cG9ydE9wdGlvbnMuZ2V0RXhwb3J0RGlyKCk7Ci0JCXB1Ymxpc2hDb250ZW50U2l0ZSA9IGV4cG9ydE9wdGlvbnMuZ2V0UHVibGlzaFdlYlNpdGUoKTsKLQkJUHVibGlzaE9wdGlvbnMgcHVibGlzaGluZ09wdGlvbnMgPSBleHBvcnRPcHRpb25zLmdldFB1Ymxpc2hpbmdPcHRpb25zKCk7Ci0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBleHBvcnRpbmcgdG8gTWljcm9zb2Z0IFByb2plY3QhIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHByb2Nlc3MgICAgICAgICAgICAgICAgICAgPSAiICsgcHJvY2Vzcyk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIG1zcHJvamVjdE5hbWUgICAgICAgICAgICAgPSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBtc3Byb2plY3ROYW1lKTsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIiQkJCB0YXJnZXREaXIgICAgICAgICAgICAgICAgID0gIiArIGV4cG9ydERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgPSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHB1Ymxpc2hDb25maWdPcHRpb25zICAgICAgPSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBwdWJsaXNoaW5nT3B0aW9ucyk7Ci0JCX0KLQotCQkvLyBjb25zdHJ1Y3QgdGhlIGV4cG9ydCB0YXJnZXQgeG1sIGZpbGUgcGF0aAotCQlpZiAoIWV4cG9ydERpci5leGlzdHMoKSkgewotCQkJZXhwb3J0RGlyLm1rZGlycygpOwotCQl9Ci0JCWFiVGFyZ2V0RGlyID0gZXhwb3J0RGlyLmdldEFic29sdXRlUGF0aCgpOwotCQlQYXRoIGV4cG9ydFBhdGggPSBuZXcgUGF0aChhYlRhcmdldERpcik7Ci0JCWJvb2xlYW4gZW5kV2l0aFhtbEV4dCA9IG1zcHJvamVjdE5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBleHBvcnRQYXRoU3RyID0gKGV4cG9ydFBhdGguYXBwZW5kKGVuZFdpdGhYbWxFeHQgPyBtc3Byb2plY3ROYW1lCi0JCQkJOiAobXNwcm9qZWN0TmFtZSArICIueG1sIikpKS50b09TU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGRlYnVnKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgZXhwb3J0UGF0aFN0ciAgICAgICAgICAgICAgICAgPSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBleHBvcnRQYXRoU3RyKTsKLQotCQkvLyBjb25zdHJ1Y3QgdGhlIGVtcHR5IE1TIHByb2plY3QgeG1sIHRlbXBsYXRlIGZpbGUgcGF0aAotCQlTdHJpbmcgZW1wdHlUZW1wbGF0ZUZpbGUgPSBFeHBvcnRNU1BQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldEluc3RhbGxQYXRoKCkKLQkJCQkrICJ0ZW1wbGF0ZSIgLy8kTk9OLU5MUy0xJAotCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyAibXNwcm9qZWN0XzIwMDNfdGVtcGxhdGUueG1sIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZGVidWcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBlbXB0eVRlbXBsYXRlRmlsZSAgICAgICAgICAgICA9ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIGVtcHR5VGVtcGxhdGVGaWxlKTsKLQotCQkvLyBjb3B5IHRoZSBlbXB0eSB0ZW1wbGF0ZSBNUyBwcm9qZWN0IHhtbCBmaWxlIHRvIHRoZSBleHBvcnQgdGFyZ2V0Ci0JCXRyeSB7Ci0JCQlGaWxlIHNyYyA9IG5ldyBGaWxlKGVtcHR5VGVtcGxhdGVGaWxlKTsKLQkJCUZpbGUgZHN0ID0gbmV3IEZpbGUoZXhwb3J0UGF0aFN0cik7Ci0JCQljb3B5KHNyYywgZHN0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlVUkkgZmlsZVVSSSA9IFVSSS5jcmVhdGVGaWxlVVJJKGV4cG9ydFBhdGhTdHIpOwotCi0JCXRyeSB7Ci0KLQkJCVhNTFJlc291cmNlIHJlcyA9IG5ldyBNc3Byb2plY3RSZXNvdXJjZUltcGwoZmlsZVVSSSk7Ci0JCQlyZXMuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KAotCQkJCQlYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOwotCQkJcmVzLmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dCgKLQkJCQkJWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQkJCXJlcy5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1NDSEVNQV9MT0NBVElPTiwKLQkJCQkJQm9vbGVhbi5UUlVFKTsKLQkJCXJlcy5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoCi0JCQkJCVhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsCi0JCQkJCUJvb2xlYW4uVFJVRSk7Ci0JCQlyZXMuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KAotCQkJCQlYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0xFWElDQUxfSEFORExFUiwgQm9vbGVhbi5UUlVFKTsKLQkJCXJlcy5sb2FkKG51bGwpOwotCi0JCQlEb2N1bWVudFJvb3QgZG9jUm9vdCA9IChEb2N1bWVudFJvb3QpIHJlcy5nZXRFT2JqZWN0KCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCXByb2plY3QgPSAoUHJvamVjdCkgZG9jUm9vdC5nZXRQcm9qZWN0KCk7Ci0KLQkJCWdlbmVyYXRlTVNQcm9qZWN0KHByb2Nlc3MsIHByb2plY3QsIGV4cG9ydE9wdGlvbnMpOwotCi0JCQlyZXMuc2F2ZShudWxsKTsKLQotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnRNU1Byb2plY3QocHJvamVjdCk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBuZXcgRXhwb3J0TVNQRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogRXhwb3J0cyBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzIHRvIGEgTWljcm9zb2Z0IFByb2plY3QKLQkgKiBYTUwgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqICAgICAgICAgICAgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcwotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBhIE1pY3Jvc29mdCBQcm9qZWN0IG9iamVjdAotCSAqIEBwYXJhbSBleHBvcnRPcHRpb25zCi0JICogICAgICAgICAgICBhIGNvbGxlY3Rpb24gb2YgdXNlciBzcGVjaWZpZWQgZXhwb3J0IG9wdGlvbnMKLQkgKiBAdGhyb3dzIEV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZW5lcmF0ZU1TUHJvamVjdChQcm9jZXNzIHByb2Nlc3MsIFByb2plY3QgcHJvamVjdCwKLQkJCUV4cG9ydE1TUE9wdGlvbnMgZXhwb3J0T3B0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9jZXNzID09IG51bGwgfHwgcHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBleHBvcnRPcHRpb25zLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJCS8vIEdldCB0aGUgZGVmYXVsdCBtZXRob2QgY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlCi0JCQkJLy8gcHJvY2Vzcy4KLQkJCQlpZiAocHJvY2VzcyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQljb25maWcgPSAoKERlbGl2ZXJ5UHJvY2VzcykgcHJvY2VzcykuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQl9IGVsc2UgaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQljb25maWcgPSAoKENhcGFiaWxpdHlQYXR0ZXJuKSBwcm9jZXNzKS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIENyZWF0ZSB0aGUgc3ViIGZvbGRlciB0byBzdG9yZSB0aGUgcHVibGlzaGVkIEhUTUwgY29udGVudCBmaWxlcy4KLQkJCWNvbnRlbnRGb2xkZXJOYW1lID0gY29uZmlnLmdldE5hbWUoKTsKLQotCQkJUHVibGlzaE9wdGlvbnMgcHVibGlzaGluZ09wdGlvbnMgPSBleHBvcnRPcHRpb25zCi0JCQkJCS5nZXRQdWJsaXNoaW5nT3B0aW9ucygpOwotCQkJaWYgKHB1Ymxpc2hDb250ZW50U2l0ZSAmJiBwdWJsaXNoaW5nT3B0aW9ucyAhPSBudWxsKSB7Ci0JCQkJRmlsZSBjb250ZW50RGlyID0gbmV3IEZpbGUoZXhwb3J0T3B0aW9ucy5nZXRFeHBvcnREaXIoKSwKLQkJCQkJCWNvbnRlbnRGb2xkZXJOYW1lKTsKLQkJCQlpZiAoIWNvbnRlbnREaXIuZXhpc3RzKCkpIHsKLQkJCQkJY29udGVudERpci5ta2RpcnMoKTsKLQkJCQl9Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHZpZUJ1aWxkZXIgbWV0aG9kQ29uZmlnID0gIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBjb25maWcpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCB2aWVCdWlsZGVyIHB1Ymxpc2hDb25maWdPcHRpb25zID0gIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBwdWJsaXNoaW5nT3B0aW9ucyk7Ci0JCQkJfQotCi0JCQkJLy8gUHVibGlzaCB0aGUgYXNzb2NpYXRlZCBjb25maWd1cmF0aW9uLgotCQkJCWlmICghcHVibGlzaENvbmZpZ3VyYXRpb24oY29udGVudERpci5nZXRBYnNvbHV0ZVBhdGgoKSwgY29uZmlnLAotCQkJCQkJcHVibGlzaGluZ09wdGlvbnMpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgPSBleHBvcnRPcHRpb25zCi0JCQkJCS5nZXRFeHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzKCk7Ci0KLQkJCS8vIEdlbmVyYXRlIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBYTUwgZmlsZS4KLQkJCS8vIHBvcHVsYXRlIHRoZSBwcm9qZWN0J3MgYXR0cmlidXRlcwotCQkJcHJvamVjdC5zZXROYW1lKHByb2Nlc3MuZ2V0TmFtZSgpKTsKLQkJCXByb2plY3Quc2V0U3RhcnREYXRlKG5ldyBEYXRlKCkpOwotCQkJcHJvamVjdC5zZXRDcmVhdGlvbkRhdGUobmV3IERhdGUoKSk7Ci0JCQlwcm9qZWN0LnNldExhc3RTYXZlZChuZXcgRGF0ZSgpKTsKLQkJCXByb2plY3Quc2V0RmluaXNoRGF0ZShuZXcgRGF0ZSgpKTsKLQotCQkJZ2VuZXJhdGVQcm9qZWN0UmVzb3VyY2VzKHByb2Nlc3MsIGNvbmZpZywgcHJvamVjdCk7Ci0JCQlnZW5lcmF0ZVByb2plY3RUYXNrcyhwcm9jZXNzLCBjb25maWcsIHByb2plY3QpOwotCQkJZ2VuZXJhdGVMaW5rcyhwcm9jZXNzLCBwcm9qZWN0KTsKLQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXhwb3J0IG9wdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGV4cG9ydE9wdGlvbnMKLQkgKiAgICAgICAgICAgIGEgY29sbGVjdGlvbiBvZiB1c2VyIHNwZWNpZmllZCBleHBvcnQgb3B0aW9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEV4cG9ydE9wdGlvbnMoRXhwb3J0T3B0aW9ucyBleHBvcnRPcHRpb25zKSB7Ci0JCUJvb2xlYW4gZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cyA9IChCb29sZWFuKSBleHBvcnRPcHRpb25zCi0JCQkJLmdldChFeHBvcnRPcHRpb25zLkVYUE9SVF9PTkxZX1BMQU5ORURfRUxFTUVOVFMpOwotCQl0aGlzLmV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgPSBleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgcHJvamVjdCByZXNvdXJjZXMgZm9yIGFsbCB0aGUgdGFzayBkZXNjcmlwdG9ycyBpbiB0aGUKLQkgKiBwcm9jZXNzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICogICAgICAgICAgICBhIHByb2Nlc3MKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHVzZWQgdG8gZmlsdGVyIHRoZSB3b3JrIGJyZWFrZG93bgotCSAqICAgICAgICAgICAgZWxlbWVudHMgaW4gdGhlIHByb2Nlc3MKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgYW4gb2JqZWN0IHRvIHN0b3JlIHRoZSBnZW5lcmF0ZWQgTWljcm9zb2Z0IFByb2plY3QgV0JTCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZ2VuZXJhdGluZyB0aGUgTWljcm9zb2Z0IFByb2plY3QgV0JTCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVQcm9qZWN0UmVzb3VyY2VzKFByb2Nlc3MgcHJvY2VzcywKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQcm9qZWN0IHByb2plY3QpIHRocm93cyBFeGNlcHRpb24gewotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVRCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJLnNldEZpbHRlcihuZXcgUHJvY2Vzc0NvbmZpZ3VyYXRvcihjb25maWcsIG51bGwpKTsKLQkJCX0KLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCi0JCQlMaXN0IGVsZW1lbnRzID0gcHJvY2Vzcy5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA+IDApIHsKLQkJCQlnZW5lcmF0ZVByb2plY3RSZXNvdXJjZShjb250ZW50UHJvdmlkZXIsCi0JCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgcHJvY2VzcywgcHJvamVjdCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIHRoZSBwcm9qZWN0IHJlc291cmNlcyBmb3IgYWxsIHRoZSByb2xlIGRlc2NyaXB0b3JzIGluIHRoZQotCSAqIHByb2Nlc3MuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVQcm9qZWN0UmVzb3VyY2UoCi0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0JCQlCcmVha2Rvd25FbGVtZW50IGJyZWFrZG93bkVsZW1lbnQsIFByb2plY3QgcHJvamVjdCkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlpZiAoYnJlYWtkb3duRWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCQkJCXx8IGJyZWFrZG93bkVsZW1lbnQuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpCi0JCQkJfHwgKGV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgJiYgIWJyZWFrZG93bkVsZW1lbnQKLQkJCQkJCS5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKSkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChicmVha2Rvd25FbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCWFkZFJlc291cmNlKGJyZWFrZG93bkVsZW1lbnQsIHByb2plY3QpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9IGNvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhicmVha2Rvd25FbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciBwcm92aWRlciA9IChSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQ7Ci0JCQkJCU9iamVjdCB2YWx1ZSA9IHByb3ZpZGVyLmdldFZhbHVlKCk7Ci0JCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCQlhZGRSZXNvdXJjZSgoQnJlYWtkb3duRWxlbWVudCkgdmFsdWUsIHByb2plY3QpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJYWRkUmVzb3VyY2UoKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQsIHByb2plY3QpOwotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCQkJCQlPYmplY3QgdmFsdWUgPSBwcm92aWRlci5nZXRWYWx1ZSgpOwotCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJZ2VuZXJhdGVQcm9qZWN0UmVzb3VyY2UoY29udGVudFByb3ZpZGVyLAotCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHZhbHVlLCBwcm9qZWN0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCWdlbmVyYXRlUHJvamVjdFJlc291cmNlKGNvbnRlbnRQcm92aWRlciwKLQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQsIHByb2plY3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JLy8gZm9yIGVhY2ggUm9sZURlc2NyaXB0b3IsIGNyZWF0ZSBhIE1TIFByb2plY3QgcmVzb3VyY2UKLQkvLyBmb3IgdGhlIFJvbGVEZXNjcmlwdG9yIGFuZCBpdHMgdW5kZXJseWluZyByb2xlLCByZW1lbWJlciB0aGUgYXNzaWduZWQKLQkvLyByZXNfdWlkCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2UoQnJlYWtkb3duRWxlbWVudCBicmVha2Rvd25FbGVtZW50LCBQcm9qZWN0IHByb2opCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKCEoYnJlYWtkb3duRWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gY2hlY2sgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgdW5kZXJseWluZyByb2xlIG9mIHRoaXMgcm9sZURlc2NyaXB0b3IKLQkJLy8gYW5kIHNraXAgdGhlIGNyZWF0aW9uIGlmIGEgcmVzb3VyY2UgZm9yIHRoZSByb2xlIGFscmVhZHkgZXhpc3RzCi0JCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yID0gKFJvbGVEZXNjcmlwdG9yKSBicmVha2Rvd25FbGVtZW50OwotCQlpZiAoZGVidWcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBoYW5kbGUgUm9sZURlc2NyaXB0b3IgPSAiICsgcm9sZURlc2NyaXB0b3IpOyAvLyROT04tTkxTLTEkCi0JCVJvbGUgcmVmX2VkUm9sZSA9IHJvbGVEZXNjcmlwdG9yLmdldFJvbGUoKTsKLQkJaWYgKGRlYnVnKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgaGFuZGxlIFJlZi1lZCBSb2xlID0gIiArIHJlZl9lZFJvbGUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gY2hlY2sgdGhlIG5lZWQgdG8gYWRkIGEgbmV3IHJlc291cmNlIGJhc2VkIG9uIFJvbGVEZXNjcmlwdG9yJ3MgZGlzcGx5Ci0JCS8vIG5hbWUKLQkJYm9vbGVhbiBuZXdSRFJlc291cmNlID0gdHJ1ZTsKLQkJU3RyaW5nIHJkUmVzb3VyY2VOYW1lID0gZ2V0RGlzcGxheU5hbWUocm9sZURlc2NyaXB0b3IpOwotCQlpZiAocm9sZXNUb1VpZE1hcC5nZXQocmRSZXNvdXJjZU5hbWUpICE9IG51bGwpIHsKLQkJCW5ld1JEUmVzb3VyY2UgPSBmYWxzZTsKLQkJfQotCi0JCS8vIGNoZWNrIHRoZSBuZWVkIHRvIGFkZCBhIG5ldyByZXNvdXJjZSBiYXNlZCBvbiBhc3NvY2lhdGVkIHJvbGUncwotCQkvLyBkaXNwbHkgbmFtZQotCQlib29sZWFuIG5ld1JvbGVSZW91cmNlID0gZmFsc2U7Ci0JCVN0cmluZyByb2xlUmVzb3VyY2VOYW1lID0gbnVsbDsKLQkJaWYgKHJlZl9lZFJvbGUgIT0gbnVsbAotCQkJCSYmIHJvbGVzVG9VaWRNYXAKLQkJCQkJCS5nZXQoKHJvbGVSZXNvdXJjZU5hbWUgPSBnZXREaXNwbGF5TmFtZShyZWZfZWRSb2xlKSkpID09IG51bGwKLQkJCQkmJiAhcm9sZVJlc291cmNlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKHJkUmVzb3VyY2VOYW1lKSkgewotCQkJbmV3Um9sZVJlb3VyY2UgPSB0cnVlOwotCQl9Ci0KLQkJLy8gY3JlYXRlIGEgcmVzb3VyY2UgZm9yIHRoZSBSb2xlRGVzY3JpcHRvcgotCQlpZiAobmV3UkRSZXNvdXJjZSkgewotCQkJUmVzb3VyY2UgYVJlcyA9IHByb2plY3RGYWN0b3J5LmNyZWF0ZVJlc291cmNlKCk7Ci0KLQkJCWFSZXMuc2V0VUlEKEJpZ0ludGVnZXIudmFsdWVPZihyZXNfdWlkKSk7Ci0JCQlhUmVzLnNldElEKEJpZ0ludGVnZXIudmFsdWVPZihyZXNfdWlkKSk7Ci0JCQlhUmVzLnNldE5hbWUocmRSZXNvdXJjZU5hbWUpOwotCQkJcHJvai5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZSgpLmFkZChhUmVzKTsKLQotCQkJcm9sZXNUb1VpZE1hcC5wdXQocmRSZXNvdXJjZU5hbWUsIEJpZ0ludGVnZXIudmFsdWVPZihyZXNfdWlkKSk7Ci0JCQlyZXNfdWlkKys7Ci0JCX0KLQotCQkvLyBjcmVhdGUgYSByZXNvdXJjZSBmb3IgdGhlIHVuZGVybHlpbmcgYXNzb2NpYXRlZCByb2xlIHRvbwotCQlpZiAobmV3Um9sZVJlb3VyY2UpIHsKLQkJCVJlc291cmNlIGFSZXMgPSBwcm9qZWN0RmFjdG9yeS5jcmVhdGVSZXNvdXJjZSgpOwotCi0JCQlhUmVzLnNldFVJRChCaWdJbnRlZ2VyLnZhbHVlT2YocmVzX3VpZCkpOwotCQkJYVJlcy5zZXRJRChCaWdJbnRlZ2VyLnZhbHVlT2YocmVzX3VpZCkpOwotCQkJYVJlcy5zZXROYW1lKHJvbGVSZXNvdXJjZU5hbWUpOwotCQkJcHJvai5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZSgpLmFkZChhUmVzKTsKLQotCQkJcm9sZXNUb1VpZE1hcC5wdXQocm9sZVJlc291cmNlTmFtZSwgQmlnSW50ZWdlci52YWx1ZU9mKHJlc191aWQpKTsKLQkJCXJlc191aWQrKzsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgTVMgUHJvamVjdCBXQlMgZm9yIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5Ci0JICogcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqICAgICAgICAgICAgYSBwcm9jZXNzCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiB1c2VkIHRvIGZpbHRlciB0aGUgd29yayBicmVha2Rvd24KLQkgKiAgICAgICAgICAgIGVsZW1lbnRzIGluIHRoZSBwcm9jZXNzCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIGFuIG9iamVjdCB0byBzdG9yZSB0aGUgZ2VuZXJhdGVkIE1pY3Jvc29mdCBQcm9qZWN0IFdCUwotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGdlbmVyYXRpbmcgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFdCUwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlUHJvamVjdFRhc2tzKFByb2Nlc3MgcHJvY2VzcywKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQcm9qZWN0IHByb2plY3QpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBTYXZlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGV4cG9ydGVkIHByb2Nlc3MuCi0JCXRoaXMucHJvY2VzcyA9IHByb2Nlc3M7Ci0KLQkJd2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQl0cnkgewotCQkJLy8gQWRkIHRoZSBzdXBwcmVzc2lvbiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzIHRvIGJlCi0JCQkvLyBleHBvcnRlZAotCQkJLy8gdG8gdGhlIHN1cHByZXNzaW9uIG1hcC4KLQkJCXN1cHByZXNzaW9uID0gbmV3IFN1cHByZXNzaW9uKHByb2Nlc3MpOwotCQkJc3VwcHJlc3Npb25NYXAucHV0KHByb2Nlc3MsIHN1cHByZXNzaW9uKTsKLQotCQkJd2JzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVdCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCWJyZWFrZG93bkVsZW1lbnRGaWx0ZXIgPSBuZXcgUHJvY2Vzc0NvbmZpZ3VyYXRvcihjb25maWcsIG51bGwpOwotCQkJd2JzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKGJyZWFrZG93bkVsZW1lbnRGaWx0ZXIpOwotCi0JCQl3YnNDb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCXdic0FkYXB0ZXJGYWN0b3J5KTsKLQotCQkJLy8gdGVzdAotCQkJLy8gZW51bWVyYXRlUHJvY2Vzc1ByZWRlY2Vzc29yTGlzdHMoKTsKLQotCQkJY3VycmVudEVsZW1lbnQgPSBwcm9jZXNzOwotCQkJaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCWdlbmVyYXRlUHJvamVjdFRhc2sod2JzQ29udGVudFByb3ZpZGVyLAotCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIHByb2Nlc3MsIDEsIHByb2plY3QpOwotCQkJfSBlbHNlIHsKLQkJCQlMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gcHJvY2Vzcy5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJCWlmIChicmVha2Rvd25FbGVtZW50cy5zaXplKCkgPiAwKSB7Ci0JCQkJCWdlbmVyYXRlUHJvamVjdFRhc2sod2JzQ29udGVudFByb3ZpZGVyLAotCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBwcm9jZXNzLCAxLCBwcm9qZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh3YnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJd2JzQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJfQotCQkJaWYgKHN1cHByZXNzaW9uTWFwICE9IG51bGwpIHsKLQkJCQlzdXBwcmVzc2lvbk1hcC5jbGVhcigpOwotCQkJCXN1cHByZXNzaW9uTWFwID0gbnVsbDsKLQkJCX0KLQkJCWlmICh3YnNDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCXdic0NvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW51bWVyYXRlUHJvY2Vzc1ByZWRlY2Vzc29yTGlzdHMoKSB7Ci0JCS8vIFdCUyB0cmVlCi0JCUl0ZXJhdG9yIHdic1RyZWVJdGVyYXRvciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcigKLQkJCQl3YnNBZGFwdGVyRmFjdG9yeSwgcHJvY2Vzcyk7Ci0JCU9iamVjdCBvYmo7Ci0JCXdoaWxlICh3YnNUcmVlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlvYmogPSB3YnNUcmVlSXRlcmF0b3IubmV4dCgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0cmVlSXRlcmF0b3I6ICIgKyBvYmopOwotCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSB3YnNBZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQob2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJUHJlZGVjZXNzb3JMaXN0IHByZWRMaXN0ID0gYWRhcHRlci5nZXRQcmVkZWNlc3NvcnMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHByZWRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlCU0l0ZW1Qcm92aWRlciBlID0gKElCU0l0ZW1Qcm92aWRlcikgaXRlci5uZXh0KCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgcHJlZExpc3Q6ICIgKyBlKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgdW53cmFwcGVkUHJlZExpc3Q6ICIKLQkJCQkJCQkrICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgZSkuZ2V0VGFyZ2V0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgTWljcm9zZnQgUHJvamVjdCB0YXNrIGZvciBhIGJyZWFrZG93biBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50UHJvdmlkZXIKLQkgKiAgICAgICAgICAgIGEgY29udGVudCBwcm92aWRlcgotCSAqIEBwYXJhbSBicmVha2Rvd25FbGVtZW50Ci0JICogICAgICAgICAgICBhIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHBhcmFtIHN0ckJ1ZgotCSAqICAgICAgICAgICAgYSA8Y29kZT5TdHJpbmdCdWZmZXI8L2NvZGU+IHRvIHN0b3JlIHRoZSBnZW5lcmF0ZWQgWE1MCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVQcm9qZWN0VGFzaygKLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciwKLQkJCU9iamVjdCBlbGVtZW50T3JXcmFwcGVyLCBpbnQgdGFza09MZXZlbCwgUHJvamVjdCBwcm9qKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJV29ya0JyZWFrZG93bkVsZW1lbnQgYnJlYWtkb3duRWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbAotCQkJCS51bndyYXAoZWxlbWVudE9yV3JhcHBlcik7Ci0KLQkJLy8gbm90IHJlYWxseSBuZWNjZXNzYXJ5IGhlcmUKLQkJaWYgKGJyZWFrZG93bkVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkJCQl8fCBicmVha2Rvd25FbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IKLQkJCQl8fCBicmVha2Rvd25FbGVtZW50LmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKQotCQkJCXx8IChleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzICYmICFicmVha2Rvd25FbGVtZW50Ci0JCQkJCQkuZ2V0SXNQbGFubmVkKCkuYm9vbGVhblZhbHVlKCkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlib29sZWFuIGlzU3ViVGFza3NQbGFubmVkID0gZmFsc2U7Ci0JCWlmIChleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzICYmIGJyZWFrZG93bkVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCSYmIGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9IGNvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhlbGVtZW50T3JXcmFwcGVyKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQkJfHwgKChBY3Rpdml0eSkgZWxlbWVudCkuZ2V0SXNQbGFubmVkKCkKLQkJCQkJCQkJCS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJaXNTdWJUYXNrc1BsYW5uZWQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJT2JqZWN0IHdyYXBwZWRFbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQkJCWlmICh3cmFwcGVkRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlpZiAoIWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMKLQkJCQkJCQkJfHwgKChBY3Rpdml0eSkgd3JhcHBlZEVsZW1lbnQpLmdldElzUGxhbm5lZCgpCi0JCQkJCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJaXNTdWJUYXNrc1BsYW5uZWQgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJVGFza0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQkJfHwgZGVzY3JpcHRvci5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJaXNTdWJUYXNrc1BsYW5uZWQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJT2JqZWN0IHdyYXBwZWRFbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQkJCWlmICh3cmFwcGVkRWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCQlUYXNrRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSB3cmFwcGVkRWxlbWVudDsKLQkJCQkJCWlmICghZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cwotCQkJCQkJCQl8fCBkZXNjcmlwdG9yLmdldElzUGxhbm5lZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJaXNTdWJUYXNrc1BsYW5uZWQgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY3JlYXRlIGEgdGFzayBmb3IgdGhlIFdvcmtCcmVha2Rvd25FbGVtZW50Ci0JCS8vIGRlY2lkZWQganVzdCB0byBjaGVjayB0aGUgaXNQbGFubmVkIGZsYWcgb24gdGhlIFdCUwotCQlib29sZWFuIGlzUGxhbm5lZFRhc2sgPSBicmVha2Rvd25FbGVtZW50LmdldElzUGxhbm5lZCgpLmJvb2xlYW5WYWx1ZSgpOwotCQlUYXNrIG5ld1Rhc2sgPSBudWxsOwotCQlpZiAoIWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgfHwgZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cwotCQkJCSYmIGlzUGxhbm5lZFRhc2spIHsKLQkJCWJvb2xlYW4gc3VwcHJlc3NlZCA9IGlzU3VwcHJlc3NlZChicmVha2Rvd25FbGVtZW50KTsKLQkJCWlmICghc3VwcHJlc3NlZCkgewotCQkJCW5ld1Rhc2sgPSBhZGRUYXNrKGVsZW1lbnRPcldyYXBwZXIsIHRhc2tPTGV2ZWwsIHByb2opOwotCQkJfQotCQl9Ci0KLQkJLy8gaWYgZXhwb3J0IHBsYW5uZWQgb25seSB3YnMsIHRoZW4gd2UgbmVlZCB0byBkbyB0aGUgcm9sZSByb2xsdXAKLQkJLy8gY2FsY3VsYXRpb24KLQkJaWYgKGV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgJiYgbmV3VGFzayAhPSBudWxsCi0JCQkJJiYgYnJlYWtkb3duRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJJiYgY29udGVudFByb3ZpZGVyICE9IG51bGwgJiYgIWlzU3ViVGFza3NQbGFubmVkKSB7Ci0JCQlBcnJheUxpc3Qgcm9sbHVwUm9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlib29sZWFuIHJiID0gY2FsY3VsYXRlUm9sbHVwUm9sZXMoY29udGVudFByb3ZpZGVyLAotCQkJCQlicmVha2Rvd25FbGVtZW50LCByb2xsdXBSb2xlcyk7Ci0JCQkvLyBpZiB0aGUgd2hvbGUgc3VidHJlZSBvZiB0aGUgYnJlYWtkb3duRWxlbW50IGlzIG5vdCBwbGFubmVkCi0JCQkvLyB0aGVuIHJvbGwgdXAgYWxsIHRoZSByb2xlcwotCQkJaWYgKCFyYikgewotCQkJCUhhc2hTZXQgcm9sZXNTZXQgPSBuZXcgSGFzaFNldChyb2xsdXBSb2xlcyk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcm9sZXNTZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVN0cmluZyByb2xlTmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQlhZGRBc3NpZ25tZW50KHJvbGVOYW1lLCBuZXdUYXNrLmdldFVJRCgpLmludFZhbHVlKCksIHByb2opOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGV4cG9ydCB0aGUgbmV4dCBsZXZlbCB3YnMKLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHN1cHByZXNzZWQgPSBpc1N1cHByZXNzZWQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAoIXN1cHByZXNzZWQpIHsKLQkJCQllbGVtZW50UGF0aHMucHVzaChicmVha2Rvd25FbGVtZW50LmdldEd1aWQoKSk7Ci0JCQkJT2JqZWN0W10gZWxlbWVudHMgPSBjb250ZW50UHJvdmlkZXIKLQkJCQkJCS5nZXRFbGVtZW50cyhlbGVtZW50T3JXcmFwcGVyKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0KLQkJCQkJLy8gZ2V0IHRoZSBjdXJyZW50IGVsZW1lbnRPcldyYXBwZXIgYW5kIHRoZSBoaWVyYXJjYWwgZ3VpZAotCQkJCQkvLyBwYXRoIHRvIGl0Ci0JCQkJCWN1cnJlbnRFbGVtZW50ID0gZWxlbWVudDsKLQkJCQkJU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW2VsZW1lbnRQYXRocy5zaXplKCldOwotCQkJCQllbGVtZW50UGF0aHMudG9BcnJheShwYXRocyk7Ci0JCQkJCVN0cmluZ0J1ZmZlciBwYXRoU3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHBhdGhzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlwYXRoU3RyLmFwcGVuZChwYXRoc1tqXSArICIuIik7Ci0JCQkJCX0KLQkJCQkJaWYgKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCU9iamVjdCB3cmFwcGVkID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQkJCQlwYXRoU3RyLmFwcGVuZCgoKEJyZWFrZG93bkVsZW1lbnQpIHdyYXBwZWQpLmdldEd1aWQoKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwYXRoU3RyLmFwcGVuZCgoKEJyZWFrZG93bkVsZW1lbnQpIGN1cnJlbnRFbGVtZW50KQotCQkJCQkJCQkuZ2V0R3VpZCgpKTsKLQkJCQkJfQotCQkJCQljdXJyZW50RWxlbWVudFBhdGggPSBwYXRoU3RyLnRvU3RyaW5nKCk7Ci0JCQkJCS8vIGlmIChkZWJ1ZykgU3lzdGVtLm91dC5wcmludGxuKCIgcGF0aDogIiArCi0JCQkJCS8vIGN1cnJlbnRFbGVtZW50UGF0aCk7Ci0KLQkJCQkJZ2VuZXJhdGVQcm9qZWN0VGFzayhjb250ZW50UHJvdmlkZXIsIGVsZW1lbnQsCi0JCQkJCQkJdGFza09MZXZlbCArIDEsIHByb2opOwotCQkJCX0KLQkJCQlnZW5lcmF0ZUxpbmtzKHByb2Nlc3MsIHByb2opOwotCQkJCWVsZW1lbnRQYXRocy5wb3AoKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBhIHN1cHByZXNzZWQgd29yayBicmVha2Rvd24gZWxlbWVudCBpbgotCSAqIGl0cyBvd25pbmcgcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICBhbiBvYmplY3QKLQkgKiBAcmV0dXJuIDxvY2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgYSBzdXBwcmVzc2VkIHdvcmsgYnJlYWtkb3duCi0JICogICAgICAgICBlbGVtZW50IGluIGl0cyBvd25pbmcgcHJvY2Vzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1cHByZXNzZWQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKGRlYnVnKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRlc2NyaXB0b3IgPSAiCi0JCQkJCQkJKyAoKERlc2NyaXB0b3IpIG9iamVjdCkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCVByb2Nlc3Mgb3duaW5nUHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhvYmplY3QpOwotCQkJU3VwcHJlc3Npb24gb3duaW5nUHJvY2Vzc1N1cHByZXNzaW9uID0gKFN1cHByZXNzaW9uKSBzdXBwcmVzc2lvbk1hcAotCQkJCQkuZ2V0KG93bmluZ1Byb2Nlc3MpOwotCQkJaWYgKG93bmluZ1Byb2Nlc3NTdXBwcmVzc2lvbiA9PSBudWxsKSB7Ci0JCQkJb3duaW5nUHJvY2Vzc1N1cHByZXNzaW9uID0gbmV3IFN1cHByZXNzaW9uKG93bmluZ1Byb2Nlc3MpOwotCQkJCXN1cHByZXNzaW9uTWFwLnB1dChvd25pbmdQcm9jZXNzLCBvd25pbmdQcm9jZXNzU3VwcHJlc3Npb24pOwotCQkJfQotCQkJaWYgKG93bmluZ1Byb2Nlc3NTdXBwcmVzc2lvbi5pc1N1cHByZXNzZWQob2JqZWN0KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKG93bmluZ1Byb2Nlc3MgIT0gcHJvY2VzcwotCQkJCQkmJiBvYmplY3QgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCWVsZW1lbnRQYXRocy5wdXNoKCgoV29ya0JyZWFrZG93bkVsZW1lbnQpIG9iamVjdCkuZ2V0R3VpZCgpKTsKLQkJCQlTdHJpbmdbXSBwYXRocyA9IG5ldyBTdHJpbmdbZWxlbWVudFBhdGhzLnNpemUoKV07Ci0JCQkJZWxlbWVudFBhdGhzLnRvQXJyYXkocGF0aHMpOwotCQkJCU9iamVjdCB3cmFwcGVyID0gc3VwcHJlc3Npb24uZ2V0T2JqZWN0QnlQYXRoKHBhdGhzLAotCQkJCQkJd2JzQWRhcHRlckZhY3RvcnkpOwotCQkJCWVsZW1lbnRQYXRocy5wb3AoKTsKLQkJCQlyZXR1cm4gc3VwcHJlc3Npb24uaXNTdXBwcmVzc2VkKHdyYXBwZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgdGFzayB0byBhIE1pY3Jvc29mdCBQcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQKLQkgKiBAcGFyYW0gdGFza09MZXZlbAotCSAqICAgICAgICAgICAgdGhlIG91dGxpbmUgbGV2ZWwKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgYSBNaWNyb3NvZnQgUHJvamVjdCBvYmplY3QKLQkgKiBAcmV0dXJuIHRoZSBuZXdseSBhZGRlZCB0YXNrCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnJzIHdoaWxlIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBUYXNrIGFkZFRhc2soT2JqZWN0IGVsZW1lbnRPcldyYXBwZXIsIGludCB0YXNrT0xldmVsLAotCQkJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlpZiAoZWxlbWVudE9yV3JhcHBlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVdvcmtCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwKLQkJCQkudW53cmFwKGVsZW1lbnRPcldyYXBwZXIpOwotCi0JCVRhc2sgdGFzayA9IHByb2plY3RGYWN0b3J5LmNyZWF0ZVRhc2soKTsKLQkJdGFzay5zZXROYW1lKGdldERpc3BsYXlOYW1lKGVsZW1lbnQpKTsKLQkJdGFzay5zZXRPdXRsaW5lTGV2ZWwoQmlnSW50ZWdlci52YWx1ZU9mKHRhc2tPTGV2ZWwpKTsKLQkJdGFzay5zZXRVSUQoQmlnSW50ZWdlci52YWx1ZU9mKHRhc2tfdWlkKSk7Ci0JCXRhc2suc2V0SUQoQmlnSW50ZWdlci52YWx1ZU9mKHRhc2tfdWlkKSk7Ci0JCXRhc2suc2V0VHlwZShCaWdJbnRlZ2VyLnZhbHVlT2YoMCkpOwotCi0JCUdyZWdvcmlhbkNhbGVuZGFyIGdjRGF0ZSA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwotCQkvLyBnY0RhdGUuYWRkKEdyZWdvcmlhbkNhbGVuZGFyLkRBVEUsIDgwKTsKLQkJRGF0ZSBzdGFydERhdGUgPSBnY0RhdGUuZ2V0VGltZSgpOwotCQl0YXNrLnNldFN0YXJ0KHN0YXJ0RGF0ZSk7Ci0KLQkJLy8gdGFzay5zZXREdXJhdGlvbigiUFQyMEgwTTBTIik7Ci0KLQkJU3RyaW5nIG5vdGVzID0gZ2V0QnJpZWZEZXNjcmlwdGlvbihlbGVtZW50KTsKLQkJaWYgKG5vdGVzICE9IG51bGwgfHwgbm90ZXMudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJdGFzay5zZXROb3Rlcyhub3Rlcyk7Ci0JCX0KLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJdGFzay5zZXRNaWxlc3RvbmUodHJ1ZSk7Ci0JCQl0YXNrLnNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIudmFsdWVPZig3KSk7Ci0JCX0KLQotCQkvLyBBc3NpZ24gdGhlIHRhc2sgdG8gYWxsIHRoZSBhc3NvY2lhdGVkIHJvbGVzLgotCQlMaXN0IHJvbGVzTGlzdCA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCXJvbGVzTGlzdCA9IGdldFJvbGVzRm9yVGFza0QoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrKSB7Ci0JCQlyb2xlc0xpc3QgPSBnZXRSb2xlc0ZvclRhc2soKG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzaykgZWxlbWVudCk7Ci0JCX0KLQkJaWYgKHJvbGVzTGlzdCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlc0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIHJvbGVOYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJYWRkQXNzaWdubWVudChyb2xlTmFtZSwgdGFza191aWQsIHByb2plY3QpOwotCQkJfQotCQl9Ci0KLQkJLy8gQWRkIHRoZSBnZW5lcmF0ZWQgVVJMIGxpbmsgdG8gdGhlIHRhc2suCi0JCWlmIChwdWJsaXNoQ29udGVudFNpdGUpIHsKLQkJCVN0cmluZyBsaW5rVVJMID0gZ2V0RWxlbWVudFVSTChlbGVtZW50KTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sgcmVmX2VkVGFzayA9IHRhc2tEZXNjcmlwdG9yLmdldFRhc2soKTsKLQkJCQlyZWZlcmVuY2VkVGFza3MuYWRkKHJlZl9lZFRhc2spOwotCQkJfQotCQkJdGFzay5zZXRIeXBlcmxpbmtBZGRyZXNzKGxpbmtVUkwpOwotCQl9Ci0KLQkJLy8gYVRhc2suc2V0VHlwZShuZXcgQmlnSW50ZWdlcigiMSIpKTsKLQkJLy8gYVRhc2suc2V0U3RhcnQobmV3IERhdGUoKSk7Ci0JCS8vIGFUYXNrLnNldFN1bW1hcnkoZmFsc2UpOwotCQkvLyBhVGFzay5zZXRDb25zdHJhaW50VHlwZShuZXcgQmlnSW50ZWdlcigiMiIpKTsKLQotCQkvLyBBZGQgdGhlIHRhc2sgdG8gdGhlIE1pY3Jvc29mdCBQcm9qZWN0IG9iamVjdC4KLQkJcHJvamVjdC5nZXRUYXNrcygpLmdldFRhc2soKS5hZGQodGFzayk7Ci0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCB0aGVDdXJyZW50IGVsZW1lbnQ6IHRhc2tVaWQ9IiArIHRhc2tfdWlkCi0JCQkJCSsgIiwgIiArIGN1cnJlbnRFbGVtZW50KTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICAgICAgICAgICAgcGF0aDogIiArIGN1cnJlbnRFbGVtZW50UGF0aCk7Ci0JCX0KLQotCQkvLyBTdG9yZSB0aGUgdGFzaydzIGxvY2FsIHByZWRlY2Vzc29ycy4KLQkJc3RvcmVUYXNrUHJlZGVjZXNzb3JzKGVsZW1lbnQpOwotCi0JCXRhc2tVaWRUb1dic1dhcHBlclBhdGhNYXAucHV0KEJpZ0ludGVnZXIudmFsdWVPZih0YXNrX3VpZCksCi0JCQkJY3VycmVudEVsZW1lbnRQYXRoKTsKLQkJd2JzR3VpZFRvVGFza1VpZE1hcAotCQkJCS5wdXQoZWxlbWVudC5nZXRHdWlkKCksIEJpZ0ludGVnZXIudmFsdWVPZih0YXNrX3VpZCkpOwotCi0JCS8vIGdldCBwcmVkZWNlc3NvcnMgb2YgYSB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgd2JzQWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJZWxlbWVudE9yV3JhcHBlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJUHJlZGVjZXNzb3JMaXN0IGN1cnJlbnRQcmVkTGlzdCA9IGFkYXB0ZXIuZ2V0UHJlZGVjZXNzb3JzKCk7Ci0JCUxpc3QgZ3VpZFByZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjdXJyZW50UHJlZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGRlYnVnKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIHdyYXBwZXJQcmVkTGlzdE1lbWJlcjogIiArIGUpOwotCQkJT2JqZWN0IHVud3JhcHBlZEUgPSBUbmdVdGlsLnVud3JhcChlKTsKLQkJCWlmICh1bndyYXBwZWRFIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlndWlkUHJlZExpc3QuYWRkKCgoV29ya0JyZWFrZG93bkVsZW1lbnQpIHVud3JhcHBlZEUpLmdldEd1aWQoKSk7Ci0JCQkJaWYgKGRlYnVnKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICB1bndyYXBwZWRQcmVkTGlzdE1lbWJlcjogIgotCQkJCQkJCSsgdW53cmFwcGVkRSk7Ci0JCQl9Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQl1bndyYXBwZWRFID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBlKS5nZXRUYXJnZXQoKTsKLQkJCQlndWlkUHJlZExpc3QuYWRkKCgoQnJlYWtkb3duRWxlbWVudCkgdW53cmFwcGVkRSkuZ2V0R3VpZCgpKTsKLQkJCQlpZiAoZGVidWcpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIHVud3JhcHBlZFByZWRMaXN0TWVtYmVyOiAiCi0JCQkJCQkJKyB1bndyYXBwZWRFKTsKLQkJCX0KLQkJfQotCQl3YnNXcmFwcGVyUGF0aFRvUHJlZExpc3RNYXAucHV0KGN1cnJlbnRFbGVtZW50UGF0aCwgZ3VpZFByZWRMaXN0KTsKLQkJaWYgKGRlYnVnKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgX193cmFwcGVyUHJlZExpc3Q6ICIgKyBndWlkUHJlZExpc3QpOwotCi0JCXRhc2tfdWlkKys7Ci0KLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QnJpZWZEZXNjcmlwdGlvbihXb3JrQnJlYWtkb3duRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgYnJpZWZEZXNjID0gZWxlbWVudC5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCWlmICgoYnJpZWZEZXNjID09IG51bGwgfHwgYnJpZWZEZXNjLnRyaW0oKS5sZW5ndGgoKSA8PSAwKSkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayByZWZfZWRUYXNrID0gdGFza0Rlc2NyaXB0b3IuZ2V0VGFzaygpOwotCQkJCWlmIChyZWZfZWRUYXNrICE9IG51bGwpCi0JCQkJCWJyaWVmRGVzYyA9IHJlZl9lZFRhc2suZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGJyaWVmRGVzYzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQXNzaWdubWVudChTdHJpbmcgcmVzTmFtZSwgaW50IHRhc2tVaWQsIFByb2plY3QgcHJvaikgewotCQlBc3NpZ25tZW50IGFzc2lnbm1lbnQgPSBwcm9qZWN0RmFjdG9yeS5jcmVhdGVBc3NpZ25tZW50KCk7Ci0KLQkJYXNzaWdubWVudC5zZXRVSUQoQmlnSW50ZWdlci52YWx1ZU9mKGFzc2lnbl91aWQpKTsKLQkJYXNzaWdubWVudC5zZXRUYXNrVUlEKEJpZ0ludGVnZXIudmFsdWVPZih0YXNrVWlkKSk7Ci0JCUJpZ0ludGVnZXIgcmVzSUQgPSAoQmlnSW50ZWdlcikgcm9sZXNUb1VpZE1hcC5nZXQocmVzTmFtZSk7Ci0JCWFzc2lnbm1lbnQuc2V0UmVzb3VyY2VVSUQocmVzSUQpOwotCi0JCXByb2ouZ2V0QXNzaWdubWVudHMoKS5nZXRBc3NpZ25tZW50KCkuYWRkKGFzc2lnbm1lbnQpOwotCi0JCWFzc2lnbl91aWQrKzsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0Um9sZXNGb3JUYXNrRChUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvcikgewotCQlBcnJheUxpc3Qgcm9sZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcnAgPSB0YXNrRGVzY3JpcHRvci5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JwID0gKFJvbGVEZXNjcmlwdG9yKSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJLmdldENhbGN1bGF0ZWRFbGVtZW50KHRhc2tEZXNjcmlwdG9yLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCksCi0JCQkJCQlicmVha2Rvd25FbGVtZW50RmlsdGVyLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0KLQkJaWYgKHJvbGVEZXNjcnAgIT0gbnVsbCkgewotCQkJcm9sZXNMaXN0LmFkZChnZXREaXNwbGF5TmFtZShyb2xlRGVzY3JwKSk7Ci0JCX0KLQkJLy8gTGlzdCByb2xlRGVzY3JwTGlzdCA9IHRhc2tEZXNjcmlwdG9yLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0JCUxpc3Qgcm9sZURlc2NycExpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50cygKLQkJCQl0YXNrRGVzY3JpcHRvci5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQkJCWJyZWFrZG93bkVsZW1lbnRGaWx0ZXIuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlRGVzY3JwTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCXJvbGVEZXNjcnAgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJcm9sZXNMaXN0LmFkZChnZXREaXNwbGF5TmFtZShyb2xlRGVzY3JwKSk7Ci0JCX0KLQotCQlyZXR1cm4gcm9sZXNMaXN0OwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRSb2xlc0ZvclRhc2sob3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrIHVtYVRhc2spIHsKLQkJQXJyYXlMaXN0IHJvbGVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlSb2xlIHJvbGUgPSB1bWFUYXNrLmdldFBlcmZvcm1lZEJ5KCk7Ci0JCWlmIChyb2xlICE9IG51bGwpIHsKLQkJCXJvbGVzTGlzdC5hZGQoZ2V0RGlzcGxheU5hbWUocm9sZSkpOwotCQl9Ci0JCUxpc3QgbGlzdCA9IHVtYVRhc2suZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCXJvbGUgPSAoUm9sZSkgaXRlci5uZXh0KCk7Ci0JCQlyb2xlc0xpc3QuYWRkKGdldERpc3BsYXlOYW1lKHJvbGUpKTsKLQkJfQotCi0JCXJldHVybiByb2xlc0xpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNhbGN1bGF0ZVJvbGx1cFJvbGVzKAotCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyLAotCQkJQnJlYWtkb3duRWxlbWVudCBicmVha2Rvd25FbGVtZW50LCBMaXN0IHJvbGx1cFJvbGVzKSB7Ci0KLQkJYm9vbGVhbiBpc0FueVN1YlRhc2tQbGFubmVkID0gZmFsc2U7Ci0KLQkJT2JqZWN0W10gZWxlbWVudHMgPSBjb250ZW50UHJvdmlkZXIuZ2V0RWxlbWVudHMoYnJlYWtkb3duRWxlbWVudCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQl8fCAoKEFjdGl2aXR5KSBlbGVtZW50KS5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlpc0FueVN1YlRhc2tQbGFubmVkID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlpc0FueVN1YlRhc2tQbGFubmVkID0gY2FsY3VsYXRlUm9sbHVwUm9sZXMoY29udGVudFByb3ZpZGVyLAotCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50LCByb2xsdXBSb2xlcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJT2JqZWN0IHdyYXBwZWRFbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQkJaWYgKHdyYXBwZWRFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQkJfHwgKChBY3Rpdml0eSkgd3JhcHBlZEVsZW1lbnQpLmdldElzUGxhbm5lZCgpCi0JCQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCWlzQW55U3ViVGFza1BsYW5uZWQgPSB0cnVlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaXNBbnlTdWJUYXNrUGxhbm5lZCA9IGNhbGN1bGF0ZVJvbGx1cFJvbGVzKAotCQkJCQkJCQljb250ZW50UHJvdmlkZXIsCi0JCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSB3cmFwcGVkRWxlbWVudCwgcm9sbHVwUm9sZXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQlUYXNrRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJCWlmICghZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cwotCQkJCQkJfHwgZGVzY3JpcHRvci5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlpc0FueVN1YlRhc2tQbGFubmVkID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyb2xsdXBSb2xlcwotCQkJCQkJCS5hZGRBbGwoZ2V0Um9sZXNGb3JUYXNrRCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlPYmplY3Qgd3JhcHBlZEVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCQlpZiAod3JhcHBlZEVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQlUYXNrRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSB3cmFwcGVkRWxlbWVudDsKLQkJCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQkJfHwgZGVzY3JpcHRvci5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJaXNBbnlTdWJUYXNrUGxhbm5lZCA9IHRydWU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyb2xsdXBSb2xlcwotCQkJCQkJCQkuYWRkQWxsKGdldFJvbGVzRm9yVGFza0QoKFRhc2tEZXNjcmlwdG9yKSB3cmFwcGVkRWxlbWVudCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGlzQW55U3ViVGFza1BsYW5uZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIGEgd29yayBicmVha2Rvd24gZWxlbWVudCdzIHByZWRlY2Vzc29ycywgc3RvcmVzIHRoZW0gaW4gYW4KLQkgKiA8b2NkZT5BcnJheUxpc3Q8L2NvZGU+LCBhbmQgcHV0IGl0IGludG8gYSBtYXAuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgd29yayBicmVha2Rvd24gZWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVRhc2tQcmVkZWNlc3NvcnMoV29ya0JyZWFrZG93bkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IHByZWRlY2Vzc29ycyA9IGVsZW1lbnQuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKTsKLQkJTGlzdCBwcmVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHByZWRlY2Vzc29ycyAhPSBudWxsICYmIHByZWRlY2Vzc29ycy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBwcmVkZWNlc3NvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJV29ya09yZGVyIHdvcmtPcmRlciA9IChXb3JrT3JkZXIpIGkubmV4dCgpOwotCQkJCUJyZWFrZG93bkVsZW1lbnQgcHJlZGVjZXNzb3IgPSB3b3JrT3JkZXIuZ2V0UHJlZCgpOwotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBsb2NhbFByZWRMaXN0TWVtYmVyOiAiCi0JCQkJCQkJKyBwcmVkZWNlc3Nvcik7Ci0JCQkJfQotCQkJCWlmIChwcmVkZWNlc3NvciAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwcmVkR3VpZCA9IHByZWRlY2Vzc29yLmdldEd1aWQoKTsKLQkJCQkJaWYgKHByZWRHdWlkICE9IG51bGwpCi0JCQkJCQlwcmVkTGlzdC5hZGQocHJlZEd1aWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgbG9jYWwgcHJlZGxpc3QgZm9yICIgKyBlbGVtZW50LmdldE5hbWUoKQotCQkJCQkrICIgPSAiICsgcHJlZExpc3QudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQl3YnNXYXBwZXJQYXRoVG9Mb2NhbFByZWRMaXN0TWFwLnB1dChjdXJyZW50RWxlbWVudFBhdGgsIHByZWRMaXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUxpbmtzKFByb2Nlc3MgcHJvY2VzcywgUHJvamVjdCBwcm9qZWN0KQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVMaXN0IHRhc2tzID0gcHJvamVjdC5nZXRUYXNrcygpLmdldFRhc2soKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFza3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlUYXNrIHRhc2sgPSAoVGFzaykgaXRlci5uZXh0KCk7Ci0JCQlCaWdJbnRlZ2VyIHRhc2tVaWQgPSB0YXNrLmdldFVJRCgpOwotCQkJLy8gc2tpcCB0aGUgTVMgcHJvamVjdCBoaWRkZW4gdGFzayB3aXRoIHVpZCA9IDAKLQkJCWlmICh0YXNrVWlkLmludFZhbHVlKCkgPT0gMCkKLQkJCQljb250aW51ZTsKLQotCQkJU3RyaW5nIHdic1BhdGhTdHIgPSAoU3RyaW5nKSB0YXNrVWlkVG9XYnNXYXBwZXJQYXRoTWFwLmdldCh0YXNrVWlkKTsKLQotCQkJLy8gTGlzdCBwcmVkTGlzdCA9IChBcnJheUxpc3QpCi0JCQkvLyB3YnNXYXBwZXJQYXRoVG9Mb2NhbFByZWRMaXN0TWFwLmdldCh3YnNQYXRoU3RyKTsKLQkJCUxpc3QgcHJlZExpc3QgPSAoQXJyYXlMaXN0KSB3YnNXcmFwcGVyUGF0aFRvUHJlZExpc3RNYXAKLQkJCQkJLmdldCh3YnNQYXRoU3RyKTsKLQkJCWlmIChwcmVkTGlzdCAhPSBudWxsKSB7Ci0JCQkJTGlzdCByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwcmVkTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJU3RyaW5nIHByZWRHdWlkID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlCaWdJbnRlZ2VyIHByZWRUYXNrVWlkID0gKEJpZ0ludGVnZXIpIHdic0d1aWRUb1Rhc2tVaWRNYXAKLQkJCQkJCQkuZ2V0KHByZWRHdWlkKTsKLQotCQkJCQlpZiAocHJlZFRhc2tVaWQgPT0gbnVsbAotCQkJCQkJCXx8IHByZWRUYXNrVWlkLmludFZhbHVlKCkgPT0gdGFza1VpZC5pbnRWYWx1ZSgpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgdGFza1VpZCA9ICIgKyB0YXNrVWlkCi0JCQkJCQkJCSsgIiwgd2JzUGF0aFN0ciA9ICIgKyB3YnNQYXRoU3RyKTsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIGxvY2FsUHJlZExpc3Q6ICIgKyBwcmVkTGlzdCk7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBmb3VuZCBwcmVkIGd1aWQ6ICIgKyBwcmVkR3VpZCk7Ci0JCQkJCX0KLQotCQkJCQlyZW1vdmVMaXN0LmFkZChwcmVkR3VpZCk7Ci0KLQkJCQkJUHJlZGVjZXNzb3JMaW5rIHByZUxpbmsgPSBwcm9qZWN0RmFjdG9yeQotCQkJCQkJCS5jcmVhdGVQcmVkZWNlc3NvckxpbmsoKTsKLQkJCQkJdGFzay5nZXRQcmVkZWNlc3NvckxpbmsoKS5hZGQocHJlTGluayk7Ci0JCQkJCXByZUxpbmsuc2V0UHJlZGVjZXNzb3JVSUQocHJlZFRhc2tVaWQpOwotCQkJCQlwcmVMaW5rLnNldFR5cGUobmV3IEJpZ0ludGVnZXIoIjEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJlTGluay5zZXRDcm9zc1Byb2plY3QoZmFsc2UpOwotCQkJCQlwcmVMaW5rLnNldExpbmtMYWcobmV3IEJpZ0ludGVnZXIoIjAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJlTGluay5zZXRMYWdGb3JtYXQobmV3IEJpZ0ludGVnZXIoIjciKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcHJlZExpc3QucmVtb3ZlQWxsKHJlbW92ZUxpc3QpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ2VuZXJhdGVkIEhUTUwgY29udGVudCBmaWxlIFVSTCBmb3IgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIFVSTCBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgY29udGVudCBmaWxlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFbGVtZW50VVJMKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIGVsZW1lbnRQYXRoID0gbnVsbDsKLQkJU3RyaW5nIGVsZW1lbnRGaWxlTmFtZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50UGF0aCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKGVsZW1lbnQpOwotCQkJZWxlbWVudEZpbGVOYW1lID0gUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZU5hbWUoZWxlbWVudCwKLQkJCQkJUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGVsZW1lbnRQYXRoICE9IG51bGwgJiYgZWxlbWVudEZpbGVOYW1lICE9IG51bGwpIHsKLQkJCWVsZW1lbnRQYXRoID0gZWxlbWVudFBhdGgucmVwbGFjZSgnXFwnLCAnLycpOwotCQkJZWxlbWVudEZpbGVOYW1lID0gZWxlbWVudEZpbGVOYW1lLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJCVN0cmluZyB1cmwgPSBjb250ZW50Rm9sZGVyTmFtZQotCQkJCQkrICIvIiArIGVsZW1lbnRQYXRoICsgZWxlbWVudEZpbGVOYW1lOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gYWJUYXJnZXREaXIgKyBGaWxlLnNlcGFyYXRvciArIHVybDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheSBuYW1lIG9mIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpc3BsYXlOYW1lKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJbmFtZSA9IFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCW5hbWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQl9Ci0JCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQluYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIFhNTFV0aWwuZXNjYXBlQXR0cihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBQdWJsaXNoZXMgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBleHBvcnRlZAotCSAqIHByb2Nlc3MuCi0JICogCi0JICogQHBhcmFtIGRpcgotCSAqICAgICAgICAgICAgdGhlIG91dHB1dCBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiB0byBwdWJsaXNoCi0JICogQHBhcmFtIHB1Ymxpc2hDb25maWdPcHRpb25zCi0JICogICAgICAgICAgICB0aGUgcHVibGlzaGluZyBvcHRpb25zCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29uZmlndXJhdGlvbiB3YXMgcHVibGlzaGVkCi0JICogICAgICAgICBzdWNjZXNzZnVsbHksIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwdWJsaXNoaW5nIHRoZSBjb25maWd1cmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHVibGlzaENvbmZpZ3VyYXRpb24oU3RyaW5nIGRpciwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQdWJsaXNoT3B0aW9ucyBwdWJsaXNoQ29uZmlnT3B0aW9ucykKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlQdWJsaXNoTWFuYWdlciBwdWJsaXNoTWdyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXB1Ymxpc2hNZ3IgPSBuZXcgUHVibGlzaE1hbmFnZXIoKTsKLQkJCXB1Ymxpc2hNZ3IuaW5pdChkaXIsIGNvbmZpZywgcHVibGlzaENvbmZpZ09wdGlvbnMpOwotCi0JCQlFeHBvcnRNU1BYTUxPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEV4cG9ydE1TUFhNTE9wZXJhdGlvbigKLQkJCQkJcHVibGlzaE1ncik7Ci0JCQlQdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIGRsZyA9IG5ldyBQdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKAotCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBwdWJsaXNoTWdyCi0JCQkJCQkJLmdldFZpZXdCdWlsZGVyKCkpOwotCQkJYm9vbGVhbiBzdWNjZXNzID0gVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhvcGVyYXRpb24sCi0JCQkJCWRsZywgdHJ1ZSwgRXhwb3J0TVNQUmVzb3VyY2VzLmV4cG9ydE1TUFdpemFyZF90aXRsZSk7Ci0JCQlpZiAob3BlcmF0aW9uLmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQl0aHJvdyBvcGVyYXRpb24uZ2V0RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VjY2VzcyAmJiAhZGxnLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocHVibGlzaE1nciAhPSBudWxsKSB7Ci0JCQkJcHVibGlzaE1nci5kaXNwb3NlKCk7Ci0JCQkJcHVibGlzaE1nciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgYSBzb3VyY2UgZmlsZSB0byBhIGRlc3RpbmF0aW9uIGZpbGUuIFRoZSBkZXN0aW5hdGlvbiBmaWxlIGlzCi0JICogY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGlmIGl0IG9kZXMgbm90IGV4aXN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gc3JjCi0JICogICAgICAgICAgICB0aGUgc291cmNlIGZpbGUKLQkgKiBAcGFyYW0gdGd0Ci0JICogICAgICAgICAgICB0aGUgdGFyZ2V0IGZpbGUKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNvcHkgdGhlIGZpbGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29weShGaWxlIHNyYywgRmlsZSBkc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzcmMpOwotCQlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZHN0KTsKLQotCQkvLyBUcmFuc2ZlciBieXRlcyBmcm9tIGluIHRvIG91dAotCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07Ci0JCWludCBsZW47Ci0JCXdoaWxlICgobGVuID0gaW4ucmVhZChidWYpKSA+IDApIHsKLQkJCW91dC53cml0ZShidWYsIDAsIGxlbik7Ci0JCX0KLQkJaW4uY2xvc2UoKTsKLQkJb3V0LmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIHRoZSB0cmFjZSBpbmZvcm1hdGlvbiBmb3IgdGhlIE1pY3Jvc29mdCBQcm9qZWN0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRNU1Byb2plY3QoUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXG4kJCQgcmVhZC1pbiBwcm9qZWN0ID0gIiArIHByb2plY3QpOyAvLyROT04tTkxTLTEkCi0KLQkJRUxpc3QgdGFza3MgPSBwcm9qZWN0LmdldFRhc2tzKCkuZ2V0VGFzaygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXNrcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVRhc2sgZWxlbWVudCA9IChUYXNrKSBpdGVyLm5leHQoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGEgdGFzayA9ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJRUxpc3QgcmVzb3VyY2VzID0gcHJvamVjdC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlIGVsZW1lbnQgPSAob3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSkgaXRlcgotCQkJCQkubmV4dCgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgYSByZXNvdXJjZSA9ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJRUxpc3QgYXNzaWdubWVudHMgPSBwcm9qZWN0LmdldEFzc2lnbm1lbnRzKCkuZ2V0QXNzaWdubWVudCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhc3NpZ25tZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFzc2lnbm1lbnQgZWxlbWVudCA9IChBc3NpZ25tZW50KSBpdGVyLm5leHQoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGFuIGFzc2lnbm1lbnQgPSAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkPT09XG4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0T3B0aW9ucy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0T3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDkyMGNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQSBIYXNoTWFwIGZvciBFeHBvcnQgT3B0aW9ucwotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRPcHRpb25zIGV4dGVuZHMgSGFzaE1hcCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTg5NzAxMjE1OTEzMjEyMjczTDsKLQkKLQkvKioKLQkgKiBUaGUgcHVibGlzaCBzZWxlY3RlZCBjb25maWd1cmF0aW9uIG9wdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJRyA9ICJwdWJsaXNoQ29uZmlnIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4cG9ydCBvbmx5IHBsYW5uZWQgd29ya2JyZWFrZG93biBlbGVtZW50cyBvcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX09OTFlfUExBTk5FRF9FTEVNRU5UUyA9ICJleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4cG9ydCBlZmZvcnQgZXN0aW1hdGVzIGZvciB3b3JrYnJlYWtkb3duIGVsZW1lbnRzIG9wdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfRVNUSU1BVEVTID0gImV4cG9ydEVzdGltYXRlcyI7Ci0KLQkvKioKLQkgKiBUaGUgZXN0aW1hdGluZyBtb2RlbCB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgZWZmb3J0IGVzdGltYXRlcyBvZiB0aGUKLQkgKiBleHBvcnRlZCB3b3JrYnJlYWtkb3duIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVTVElNQVRJTkdfTU9ERUwgPSAiZXN0aW1hdGluZ01vZGVsIjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRPcHRpb25zKCkgewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvSUV4cG9ydE1TUFNlcnZpY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0lFeHBvcnRNU1BTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0OTM0YTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvSUV4cG9ydE1TUFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgU2VydmljZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUV4cG9ydE1TUFNlcnZpY2UgewotCi0JLyoqCi0JICogRXhwb3J0IGEgcHJvY2VzcyB0byBhIE1pY3Jvc29mdCBQcm9qZWN0IGZpbGUuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiAgICAgICAgICAgIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MKLQkgKiBAcGFyYW0gZXhwb3J0T3B0aW9ucwotCSAqICAgICAgICAgICAgYSBjb2xsZWN0aW9uIG9mIHVzZXIgc3BlY2lmaWVkIGV4cG9ydCBvcHRpb25zCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb3BlcmF0aW9uIHdhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Ci0JICogQHRocm93cyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwb3J0TVNQcm9qZWN0KFByb2Nlc3MgcHJvY2VzcywKLQkJCUV4cG9ydE1TUE9wdGlvbnMgZXhwb3J0T3B0aW9ucykgdGhyb3dzIEV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1ODM2NDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFdpemFyZAotZXhwb3J0TVNQV2l6YXJkX3RpdGxlPUV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdAotCi0jIFNlbGVjdCBQcm9jZXNzIFdpemFyZCBQYWdlCi1zZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90aXRsZT1TZWxlY3QgcHJvY2VzcyBhbmQgZXhwb3J0IG9wdGlvbnMKLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RleHQ9U2VsZWN0IGEgcHJvY2VzcyB0byBleHBvcnQgYW5kIHNwZWNpZnkgdGhlIGV4cG9ydCBvcHRpb25zLgotcHJvY2Vzc0dyb3VwX3RleHQ9UHJvY2VzcwotY2FwYWJpbGl0eVBhdHRlcm5SYWRpb0J1dHRvbl90ZXh0PUNhcGFiaWxpdHkgUGF0dGVybgotZGVsaXZlcnlQcm9jZXNzUmFkaW9CdXR0b25fdGV4dD1EZWxpdmVyeSBQcm9jZXNzCi1vcHRpb25zR3JvdXBfdGV4dD1FeHBvcnQgb3B0aW9ucwotcHJvY2Vzc05hbWVMYWJlbF90ZXh0PU5hbWU6Ci1jb250ZXh0TmFtZUxhYmVsX3RleHQ9Q29uZmlndXJhdGlvbjoKLXB1Ymxpc2hDb25maWd1cmF0aW9uQ2hlY2tCb3hfdGV4dD1QdWJsaXNoIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uCi1leHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzQ2hlY2tCb3hfdGV4dD1FeHBvcnQgb25seSBicmVha2Rvd24gZWxlbWVudHMgdGhhdCBhcmUgcGxhbm5lZAotCi0jIFNlbGVjdCBQdWJsaXNoaW5nIE9wdGlvbnMgV2l6YXJkIFBhZ2UKLXNlbGVjdFB1Ymxpc2hPcHRpb25zV2l6YXJkUGFnZV90aXRsZT1TZWxlY3QgcHVibGlzaGluZyBvcHRpb25zCi1zZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGV4dD1TZWxlY3QgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucyB0aGF0IHdpbGwgYmUgdXNlZCB0byBwdWJsaXNoIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbi4KLQotIyBTZWxlY3QgRXhwb3J0IERpcmVjdG9yeSBXaXphcmQgcGFnZQotc2VsZWN0RXhwb3J0RGlyV2l6YXJkUGFnZV90aXRsZT1TcGVjaWZ5IHByb2plY3QgbmFtZSBhbmQgZXhwb3J0IGRpcmVjdG9yeQotc2VsZWN0RXhwb3J0RGlyV2l6YXJkUGFnZV90ZXh0PVNwZWNpZnkgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IG5hbWUgYW5kIGV4cG9ydCBkaXJlY3RvcnkuCi1wcm9qZWN0TmFtZUxhYmVsX3RleHQ9TmFtZToKLWRpckxhYmVsX3RleHQ9RGlyZWN0b3J5OgotYnJvd3NlQnV0dG9uX3RleHQ9QnJvd3NlLi4uCi0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMKLWV4cG9ydE1TUFRhc2tfbmFtZT1FeHBvcnRpbmcgc2VsZWN0ZWQgcHJvY2VzcyB0byBNaWNyb3NvZnQgUHJvamVjdC4uLgotCi0jIENvbmZpcm1hdGlvbiBNZXNzYWdlcwotb3ZlcndyaXRlVGV4dF9tc2c9QSBNaWNyb3NvZnQgUHJvamVjdCAnJ3swfScnIGFscmVhZHkgZXhpc3RzIGluICcnezF9JycuXG5EbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgaXQ/Ci1jb21wbGV0ZWRUZXh0X21zZz1UaGUgc2VsZWN0ZWQgcHJvY2VzcyAnJ3swfScnIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBleHBvcnRlZCB0byBNaWNyb3NvZnQgUHJvamVjdCBYTUwgZmlsZSAnJ3sxfScnLgotCi0jIEVycm9yIE1lc3NhZ2VzCi1leHBvcnRNU1BFcnJvcl9tc2c9QW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIGV4cG9ydGluZyB0aGUgc2VsZWN0ZWQgcHJvY2VzcyAnJ3swfScnIHRvIE1pY3Jvc29mdCBQcm9qZWN0ICcnezF9JycuCi1leHBvcnRNU1BFcnJvcl9yZWFzb249Q2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmZhNTIyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBhbmQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3Qgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3RlbXBsYXRlL21zcHJvamVjdF8yMDAzX3RlbXBsYXRlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvdGVtcGxhdGUvbXNwcm9qZWN0XzIwMDNfdGVtcGxhdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZmU1MGMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvdGVtcGxhdGUvbXNwcm9qZWN0XzIwMDNfdGVtcGxhdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9lcGYuZWNsaXBzZS5vcmcvbXNwcm9qZWN0Ij4KLTxOYW1lPm1zcHJvamVjdF8yMDAzX3RlbXBsYXRlLnhtbDwvTmFtZT4KLTxDb21wYW55PkVjbGlwc2Uub3JnPC9Db21wYW55PgotPEF1dGhvcj48L0F1dGhvcj4KLTxDcmVhdGlvbkRhdGU+MjAwNi0wMi0xMFQxNDozNjowMDwvQ3JlYXRpb25EYXRlPgotPExhc3RTYXZlZD4yMDA2LTAyLTEwVDE1OjE5OjAwPC9MYXN0U2F2ZWQ+Ci08U2NoZWR1bGVGcm9tU3RhcnQ+MTwvU2NoZWR1bGVGcm9tU3RhcnQ+Ci08U3RhcnREYXRlPjIwMDYtMDItMTBUMDg6MDA6MDA8L1N0YXJ0RGF0ZT4KLTxGaW5pc2hEYXRlPjIwMDYtMDItMTBUMDg6MDA6MDA8L0ZpbmlzaERhdGU+Ci08RllTdGFydERhdGU+MTwvRllTdGFydERhdGU+Ci08Q3JpdGljYWxTbGFja0xpbWl0PjA8L0NyaXRpY2FsU2xhY2tMaW1pdD4KLTxDdXJyZW5jeURpZ2l0cz4yPC9DdXJyZW5jeURpZ2l0cz4KLTxDdXJyZW5jeVN5bWJvbD4kPC9DdXJyZW5jeVN5bWJvbD4KLTxDdXJyZW5jeVN5bWJvbFBvc2l0aW9uPjA8L0N1cnJlbmN5U3ltYm9sUG9zaXRpb24+Ci08Q2FsZW5kYXJVSUQ+MTwvQ2FsZW5kYXJVSUQ+Ci08RGVmYXVsdFN0YXJ0VGltZT4wODowMDowMDwvRGVmYXVsdFN0YXJ0VGltZT4KLTxEZWZhdWx0RmluaXNoVGltZT4xNzowMDowMDwvRGVmYXVsdEZpbmlzaFRpbWU+Ci08TWludXRlc1BlckRheT40ODA8L01pbnV0ZXNQZXJEYXk+Ci08TWludXRlc1BlcldlZWs+MjQwMDwvTWludXRlc1BlcldlZWs+Ci08RGF5c1Blck1vbnRoPjIwPC9EYXlzUGVyTW9udGg+Ci08RGVmYXVsdFRhc2tUeXBlPjA8L0RlZmF1bHRUYXNrVHlwZT4KLTxEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbD4zPC9EZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbD4KLTxEZWZhdWx0U3RhbmRhcmRSYXRlPjA8L0RlZmF1bHRTdGFuZGFyZFJhdGU+Ci08RGVmYXVsdE92ZXJ0aW1lUmF0ZT4wPC9EZWZhdWx0T3ZlcnRpbWVSYXRlPgotPER1cmF0aW9uRm9ybWF0Pjc8L0R1cmF0aW9uRm9ybWF0PgotPFdvcmtGb3JtYXQ+MjwvV29ya0Zvcm1hdD4KLTxFZGl0YWJsZUFjdHVhbENvc3RzPjA8L0VkaXRhYmxlQWN0dWFsQ29zdHM+Ci08SG9ub3JDb25zdHJhaW50cz4wPC9Ib25vckNvbnN0cmFpbnRzPgotPEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeT4xPC9JbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnk+Ci08TXVsdGlwbGVDcml0aWNhbFBhdGhzPjA8L011bHRpcGxlQ3JpdGljYWxQYXRocz4KLTxOZXdUYXNrc0VmZm9ydERyaXZlbj4xPC9OZXdUYXNrc0VmZm9ydERyaXZlbj4KLTxOZXdUYXNrc0VzdGltYXRlZD4xPC9OZXdUYXNrc0VzdGltYXRlZD4KLTxTcGxpdHNJblByb2dyZXNzVGFza3M+MTwvU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzPgotPFNwcmVhZEFjdHVhbENvc3Q+MDwvU3ByZWFkQWN0dWFsQ29zdD4KLTxTcHJlYWRQZXJjZW50Q29tcGxldGU+MDwvU3ByZWFkUGVyY2VudENvbXBsZXRlPgotPFRhc2tVcGRhdGVzUmVzb3VyY2U+MTwvVGFza1VwZGF0ZXNSZXNvdXJjZT4KLTxGaXNjYWxZZWFyU3RhcnQ+MDwvRmlzY2FsWWVhclN0YXJ0PgotPFdlZWtTdGFydERheT4wPC9XZWVrU3RhcnREYXk+Ci08TW92ZUNvbXBsZXRlZEVuZHNCYWNrPjA8L01vdmVDb21wbGV0ZWRFbmRzQmFjaz4KLTxNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaz4wPC9Nb3ZlUmVtYWluaW5nU3RhcnRzQmFjaz4KLTxNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZD4wPC9Nb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZD4KLTxNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQ+MDwvTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkPgotPEJhc2VsaW5lRm9yRWFybmVkVmFsdWU+MDwvQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZT4KLTxBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3M+MTwvQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzPgotPEN1cnJlbnREYXRlPjIwMDYtMDItMTBUMDg6MDA6MDA8L0N1cnJlbnREYXRlPgotPE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkw+MTwvTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTD4KLTxBdXRvbGluaz4xPC9BdXRvbGluaz4KLTxOZXdUYXNrU3RhcnREYXRlPjA8L05ld1Rhc2tTdGFydERhdGU+Ci08RGVmYXVsdFRhc2tFVk1ldGhvZD4wPC9EZWZhdWx0VGFza0VWTWV0aG9kPgotPFByb2plY3RFeHRlcm5hbGx5RWRpdGVkPjA8L1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkPgotPEV4dGVuZGVkQ3JlYXRpb25EYXRlPjE5ODQtMDEtMDFUMDA6MDA6MDA8L0V4dGVuZGVkQ3JlYXRpb25EYXRlPgotPEFjdHVhbHNJblN5bmM+MTwvQWN0dWFsc0luU3luYz4KLTxSZW1vdmVGaWxlUHJvcGVydGllcz4wPC9SZW1vdmVGaWxlUHJvcGVydGllcz4KLTxBZG1pblByb2plY3Q+MDwvQWRtaW5Qcm9qZWN0PgotPE91dGxpbmVDb2Rlcy8+Ci08V0JTTWFza3MvPgotPEV4dGVuZGVkQXR0cmlidXRlcy8+Ci08Q2FsZW5kYXJzPgotPENhbGVuZGFyPgotPFVJRD4xPC9VSUQ+Ci08TmFtZT5TdGFuZGFyZDwvTmFtZT4KLTxJc0Jhc2VDYWxlbmRhcj4xPC9Jc0Jhc2VDYWxlbmRhcj4KLTxCYXNlQ2FsZW5kYXJVSUQ+LTE8L0Jhc2VDYWxlbmRhclVJRD4KLTxXZWVrRGF5cz4KLTxXZWVrRGF5PgotPERheVR5cGU+MTwvRGF5VHlwZT4KLTxEYXlXb3JraW5nPjA8L0RheVdvcmtpbmc+Ci08L1dlZWtEYXk+Ci08V2Vla0RheT4KLTxEYXlUeXBlPjI8L0RheVR5cGU+Ci08RGF5V29ya2luZz4xPC9EYXlXb3JraW5nPgotPFdvcmtpbmdUaW1lcz4KLTxXb3JraW5nVGltZT4KLTxGcm9tVGltZT4wODowMDowMDwvRnJvbVRpbWU+Ci08VG9UaW1lPjEyOjAwOjAwPC9Ub1RpbWU+Ci08L1dvcmtpbmdUaW1lPgotPFdvcmtpbmdUaW1lPgotPEZyb21UaW1lPjEzOjAwOjAwPC9Gcm9tVGltZT4KLTxUb1RpbWU+MTc6MDA6MDA8L1RvVGltZT4KLTwvV29ya2luZ1RpbWU+Ci08L1dvcmtpbmdUaW1lcz4KLTwvV2Vla0RheT4KLTxXZWVrRGF5PgotPERheVR5cGU+MzwvRGF5VHlwZT4KLTxEYXlXb3JraW5nPjE8L0RheVdvcmtpbmc+Ci08V29ya2luZ1RpbWVzPgotPFdvcmtpbmdUaW1lPgotPEZyb21UaW1lPjA4OjAwOjAwPC9Gcm9tVGltZT4KLTxUb1RpbWU+MTI6MDA6MDA8L1RvVGltZT4KLTwvV29ya2luZ1RpbWU+Ci08V29ya2luZ1RpbWU+Ci08RnJvbVRpbWU+MTM6MDA6MDA8L0Zyb21UaW1lPgotPFRvVGltZT4xNzowMDowMDwvVG9UaW1lPgotPC9Xb3JraW5nVGltZT4KLTwvV29ya2luZ1RpbWVzPgotPC9XZWVrRGF5PgotPFdlZWtEYXk+Ci08RGF5VHlwZT40PC9EYXlUeXBlPgotPERheVdvcmtpbmc+MTwvRGF5V29ya2luZz4KLTxXb3JraW5nVGltZXM+Ci08V29ya2luZ1RpbWU+Ci08RnJvbVRpbWU+MDg6MDA6MDA8L0Zyb21UaW1lPgotPFRvVGltZT4xMjowMDowMDwvVG9UaW1lPgotPC9Xb3JraW5nVGltZT4KLTxXb3JraW5nVGltZT4KLTxGcm9tVGltZT4xMzowMDowMDwvRnJvbVRpbWU+Ci08VG9UaW1lPjE3OjAwOjAwPC9Ub1RpbWU+Ci08L1dvcmtpbmdUaW1lPgotPC9Xb3JraW5nVGltZXM+Ci08L1dlZWtEYXk+Ci08V2Vla0RheT4KLTxEYXlUeXBlPjU8L0RheVR5cGU+Ci08RGF5V29ya2luZz4xPC9EYXlXb3JraW5nPgotPFdvcmtpbmdUaW1lcz4KLTxXb3JraW5nVGltZT4KLTxGcm9tVGltZT4wODowMDowMDwvRnJvbVRpbWU+Ci08VG9UaW1lPjEyOjAwOjAwPC9Ub1RpbWU+Ci08L1dvcmtpbmdUaW1lPgotPFdvcmtpbmdUaW1lPgotPEZyb21UaW1lPjEzOjAwOjAwPC9Gcm9tVGltZT4KLTxUb1RpbWU+MTc6MDA6MDA8L1RvVGltZT4KLTwvV29ya2luZ1RpbWU+Ci08L1dvcmtpbmdUaW1lcz4KLTwvV2Vla0RheT4KLTxXZWVrRGF5PgotPERheVR5cGU+NjwvRGF5VHlwZT4KLTxEYXlXb3JraW5nPjE8L0RheVdvcmtpbmc+Ci08V29ya2luZ1RpbWVzPgotPFdvcmtpbmdUaW1lPgotPEZyb21UaW1lPjA4OjAwOjAwPC9Gcm9tVGltZT4KLTxUb1RpbWU+MTI6MDA6MDA8L1RvVGltZT4KLTwvV29ya2luZ1RpbWU+Ci08V29ya2luZ1RpbWU+Ci08RnJvbVRpbWU+MTM6MDA6MDA8L0Zyb21UaW1lPgotPFRvVGltZT4xNzowMDowMDwvVG9UaW1lPgotPC9Xb3JraW5nVGltZT4KLTwvV29ya2luZ1RpbWVzPgotPC9XZWVrRGF5PgotPFdlZWtEYXk+Ci08RGF5VHlwZT43PC9EYXlUeXBlPgotPERheVdvcmtpbmc+MDwvRGF5V29ya2luZz4KLTwvV2Vla0RheT4KLTwvV2Vla0RheXM+Ci08L0NhbGVuZGFyPgotPC9DYWxlbmRhcnM+Ci08VGFza3M+Ci08VGFzaz4KLTxVSUQ+MDwvVUlEPgotPElEPjA8L0lEPgotPFR5cGU+MTwvVHlwZT4KLTxJc051bGw+MDwvSXNOdWxsPgotPENyZWF0ZURhdGU+MjAwNi0wMi0xMFQxNDozNjowMDwvQ3JlYXRlRGF0ZT4KLTxXQlM+MDwvV0JTPgotPE91dGxpbmVOdW1iZXI+MDwvT3V0bGluZU51bWJlcj4KLTxPdXRsaW5lTGV2ZWw+MDwvT3V0bGluZUxldmVsPgotPFByaW9yaXR5PjUwMDwvUHJpb3JpdHk+Ci08U3RhcnQ+MjAwNi0wMi0xMFQwODowMDowMDwvU3RhcnQ+Ci08RmluaXNoPjIwMDYtMDItMTBUMDg6MDA6MDA8L0ZpbmlzaD4KLTxEdXJhdGlvbj5QVDBIME0wUzwvRHVyYXRpb24+Ci08RHVyYXRpb25Gb3JtYXQ+NTM8L0R1cmF0aW9uRm9ybWF0PgotPFdvcms+UFQwSDBNMFM8L1dvcms+Ci08UmVzdW1lVmFsaWQ+MDwvUmVzdW1lVmFsaWQ+Ci08RWZmb3J0RHJpdmVuPjA8L0VmZm9ydERyaXZlbj4KLTxSZWN1cnJpbmc+MDwvUmVjdXJyaW5nPgotPE92ZXJBbGxvY2F0ZWQ+MDwvT3ZlckFsbG9jYXRlZD4KLTxFc3RpbWF0ZWQ+MTwvRXN0aW1hdGVkPgotPE1pbGVzdG9uZT4wPC9NaWxlc3RvbmU+Ci08U3VtbWFyeT4xPC9TdW1tYXJ5PgotPENyaXRpY2FsPjE8L0NyaXRpY2FsPgotPElzU3VicHJvamVjdD4wPC9Jc1N1YnByb2plY3Q+Ci08SXNTdWJwcm9qZWN0UmVhZE9ubHk+MDwvSXNTdWJwcm9qZWN0UmVhZE9ubHk+Ci08RXh0ZXJuYWxUYXNrPjA8L0V4dGVybmFsVGFzaz4KLTxFYXJseVN0YXJ0PjIwMDYtMDItMTBUMDg6MDA6MDA8L0Vhcmx5U3RhcnQ+Ci08RWFybHlGaW5pc2g+MjAwNi0wMi0xMFQwODowMDowMDwvRWFybHlGaW5pc2g+Ci08TGF0ZVN0YXJ0PjIwMDYtMDItMTBUMDg6MDA6MDA8L0xhdGVTdGFydD4KLTxMYXRlRmluaXNoPjIwMDYtMDItMTBUMDg6MDA6MDA8L0xhdGVGaW5pc2g+Ci08U3RhcnRWYXJpYW5jZT4wPC9TdGFydFZhcmlhbmNlPgotPEZpbmlzaFZhcmlhbmNlPjA8L0ZpbmlzaFZhcmlhbmNlPgotPFdvcmtWYXJpYW5jZT4wPC9Xb3JrVmFyaWFuY2U+Ci08RnJlZVNsYWNrPjA8L0ZyZWVTbGFjaz4KLTxUb3RhbFNsYWNrPjA8L1RvdGFsU2xhY2s+Ci08Rml4ZWRDb3N0PjA8L0ZpeGVkQ29zdD4KLTxGaXhlZENvc3RBY2NydWFsPjM8L0ZpeGVkQ29zdEFjY3J1YWw+Ci08UGVyY2VudENvbXBsZXRlPjA8L1BlcmNlbnRDb21wbGV0ZT4KLTxQZXJjZW50V29ya0NvbXBsZXRlPjA8L1BlcmNlbnRXb3JrQ29tcGxldGU+Ci08Q29zdD4wPC9Db3N0PgotPE92ZXJ0aW1lQ29zdD4wPC9PdmVydGltZUNvc3Q+Ci08T3ZlcnRpbWVXb3JrPlBUMEgwTTBTPC9PdmVydGltZVdvcms+Ci08QWN0dWFsRHVyYXRpb24+UFQwSDBNMFM8L0FjdHVhbER1cmF0aW9uPgotPEFjdHVhbENvc3Q+MDwvQWN0dWFsQ29zdD4KLTxBY3R1YWxPdmVydGltZUNvc3Q+MDwvQWN0dWFsT3ZlcnRpbWVDb3N0PgotPEFjdHVhbFdvcms+UFQwSDBNMFM8L0FjdHVhbFdvcms+Ci08QWN0dWFsT3ZlcnRpbWVXb3JrPlBUMEgwTTBTPC9BY3R1YWxPdmVydGltZVdvcms+Ci08UmVndWxhcldvcms+UFQwSDBNMFM8L1JlZ3VsYXJXb3JrPgotPFJlbWFpbmluZ0R1cmF0aW9uPlBUMEgwTTBTPC9SZW1haW5pbmdEdXJhdGlvbj4KLTxSZW1haW5pbmdDb3N0PjA8L1JlbWFpbmluZ0Nvc3Q+Ci08UmVtYWluaW5nV29yaz5QVDBIME0wUzwvUmVtYWluaW5nV29yaz4KLTxSZW1haW5pbmdPdmVydGltZUNvc3Q+MDwvUmVtYWluaW5nT3ZlcnRpbWVDb3N0PgotPFJlbWFpbmluZ092ZXJ0aW1lV29yaz5QVDBIME0wUzwvUmVtYWluaW5nT3ZlcnRpbWVXb3JrPgotPEFDV1A+MDwvQUNXUD4KLTxDVj4wPC9DVj4KLTxDb25zdHJhaW50VHlwZT4wPC9Db25zdHJhaW50VHlwZT4KLTxDYWxlbmRhclVJRD4tMTwvQ2FsZW5kYXJVSUQ+Ci08TGV2ZWxBc3NpZ25tZW50cz4xPC9MZXZlbEFzc2lnbm1lbnRzPgotPExldmVsaW5nQ2FuU3BsaXQ+MTwvTGV2ZWxpbmdDYW5TcGxpdD4KLTxMZXZlbGluZ0RlbGF5PjA8L0xldmVsaW5nRGVsYXk+Ci08TGV2ZWxpbmdEZWxheUZvcm1hdD44PC9MZXZlbGluZ0RlbGF5Rm9ybWF0PgotPElnbm9yZVJlc291cmNlQ2FsZW5kYXI+MDwvSWdub3JlUmVzb3VyY2VDYWxlbmRhcj4KLTxIaWRlQmFyPjA8L0hpZGVCYXI+Ci08Um9sbHVwPjA8L1JvbGx1cD4KLTxCQ1dTPjA8L0JDV1M+Ci08QkNXUD4wPC9CQ1dQPgotPFBoeXNpY2FsUGVyY2VudENvbXBsZXRlPjA8L1BoeXNpY2FsUGVyY2VudENvbXBsZXRlPgotPEVhcm5lZFZhbHVlTWV0aG9kPjA8L0Vhcm5lZFZhbHVlTWV0aG9kPgotPEFjdHVhbFdvcmtQcm90ZWN0ZWQ+UFQwSDBNMFM8L0FjdHVhbFdvcmtQcm90ZWN0ZWQ+Ci08QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkPlBUMEgwTTBTPC9BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ+Ci08L1Rhc2s+Ci08L1Rhc2tzPgotPFJlc291cmNlcz4KLTxSZXNvdXJjZT4KLTxVSUQ+MDwvVUlEPgotPElEPjA8L0lEPgotPFR5cGU+MTwvVHlwZT4KLTxJc051bGw+MDwvSXNOdWxsPgotPFdvcmtHcm91cD4wPC9Xb3JrR3JvdXA+Ci08TWF4VW5pdHM+MTwvTWF4VW5pdHM+Ci08UGVha1VuaXRzPjA8L1BlYWtVbml0cz4KLTxPdmVyQWxsb2NhdGVkPjA8L092ZXJBbGxvY2F0ZWQ+Ci08Q2FuTGV2ZWw+MTwvQ2FuTGV2ZWw+Ci08QWNjcnVlQXQ+MzwvQWNjcnVlQXQ+Ci08V29yaz5QVDBIME0wUzwvV29yaz4KLTxSZWd1bGFyV29yaz5QVDBIME0wUzwvUmVndWxhcldvcms+Ci08T3ZlcnRpbWVXb3JrPlBUMEgwTTBTPC9PdmVydGltZVdvcms+Ci08QWN0dWFsV29yaz5QVDBIME0wUzwvQWN0dWFsV29yaz4KLTxSZW1haW5pbmdXb3JrPlBUMEgwTTBTPC9SZW1haW5pbmdXb3JrPgotPEFjdHVhbE92ZXJ0aW1lV29yaz5QVDBIME0wUzwvQWN0dWFsT3ZlcnRpbWVXb3JrPgotPFJlbWFpbmluZ092ZXJ0aW1lV29yaz5QVDBIME0wUzwvUmVtYWluaW5nT3ZlcnRpbWVXb3JrPgotPFBlcmNlbnRXb3JrQ29tcGxldGU+MDwvUGVyY2VudFdvcmtDb21wbGV0ZT4KLTxTdGFuZGFyZFJhdGU+MDwvU3RhbmRhcmRSYXRlPgotPFN0YW5kYXJkUmF0ZUZvcm1hdD4yPC9TdGFuZGFyZFJhdGVGb3JtYXQ+Ci08Q29zdD4wPC9Db3N0PgotPE92ZXJ0aW1lUmF0ZT4wPC9PdmVydGltZVJhdGU+Ci08T3ZlcnRpbWVSYXRlRm9ybWF0PjI8L092ZXJ0aW1lUmF0ZUZvcm1hdD4KLTxPdmVydGltZUNvc3Q+MDwvT3ZlcnRpbWVDb3N0PgotPENvc3RQZXJVc2U+MDwvQ29zdFBlclVzZT4KLTxBY3R1YWxDb3N0PjA8L0FjdHVhbENvc3Q+Ci08QWN0dWFsT3ZlcnRpbWVDb3N0PjA8L0FjdHVhbE92ZXJ0aW1lQ29zdD4KLTxSZW1haW5pbmdDb3N0PjA8L1JlbWFpbmluZ0Nvc3Q+Ci08UmVtYWluaW5nT3ZlcnRpbWVDb3N0PjA8L1JlbWFpbmluZ092ZXJ0aW1lQ29zdD4KLTxXb3JrVmFyaWFuY2U+MDwvV29ya1ZhcmlhbmNlPgotPENvc3RWYXJpYW5jZT4wPC9Db3N0VmFyaWFuY2U+Ci08U1Y+MDwvU1Y+Ci08Q1Y+MDwvQ1Y+Ci08QUNXUD4wPC9BQ1dQPgotPENhbGVuZGFyVUlEPjI8L0NhbGVuZGFyVUlEPgotPEJDV1M+MDwvQkNXUz4KLTxCQ1dQPjA8L0JDV1A+Ci08SXNHZW5lcmljPjA8L0lzR2VuZXJpYz4KLTxJc0luYWN0aXZlPjA8L0lzSW5hY3RpdmU+Ci08SXNFbnRlcnByaXNlPjA8L0lzRW50ZXJwcmlzZT4KLTxCb29raW5nVHlwZT4wPC9Cb29raW5nVHlwZT4KLTxBY3R1YWxXb3JrUHJvdGVjdGVkPlBUMEgwTTBTPC9BY3R1YWxXb3JrUHJvdGVjdGVkPgotPEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZD5QVDBIME0wUzwvQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkPgotPENyZWF0aW9uRGF0ZT4yMDA2LTAyLTEwVDE0OjM2OjAwPC9DcmVhdGlvbkRhdGU+Ci08L1Jlc291cmNlPgotPC9SZXNvdXJjZXM+Ci08QXNzaWdubWVudHMvPgotPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNzMxYmQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIHhtbCBleHBvcnQgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcxNzllMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMGFlMjQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWw7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5FeHBvcnRYTUxQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2U7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbCwKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5wcmVmZXJlbmNlcywKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcywKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY4YmNjMmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvaWNvbnMvZnVsbC9vYmoxNi9YTUxGaWxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvaWNvbnMvZnVsbC9vYmoxNi9YTUxGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODNiNDRiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2ljb25zL2Z1bGwvb2JqMTYvWE1MRmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydFhNTC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydFhNTC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyNDk4MzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9pY29ucy9mdWxsL3dpemJhbi9FeHBvcnRYTUwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmMmJhM2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBFeHBvcnQgWE1MIFBsdWctaW4KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIEV4cG9ydCBYTUwgV2l6YXJkCi1leHBvcnRYTUxXaXphcmROYW1lPVhNTAotZXhwb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249RXhwb3J0IG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgdG8gYSBYTUwgZmlsZS4KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjQ2NDY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwud2l6YXJkcy5FeHBvcnRYTUxXaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L1hNTEZpbGUuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLndpemFyZHMuRXhwb3J0WE1MV2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJWV4cG9ydFhNTFdpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJWV4cG9ydFhNTFdpemFyZERlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLndpemFyZHMuRXhwb3J0WE1MV2l6YXJkIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9FeHBvcnRYTUxQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL0V4cG9ydFhNTFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZWMzMThjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL0V4cG9ydFhNTFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IFhNTCBwbHVnLWluIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRYTUxQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgRXhwb3J0WE1MUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydFhNTFBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdG9wKEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwb3J0WE1MUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9FeHBvcnRYTUxSZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL0V4cG9ydFhNTFJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YmUxNDM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL0V4cG9ydFhNTFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBFeHBvcnQgWE1MIG1lc3NhZ2UgcmVzb3VyY2UgYnVuZGxlIGFjY2Vzc29yIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEV4cG9ydFhNTFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBFeHBvcnRYTUxSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBFeHBvcnRYTUxSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydFhNTFdpemFyZF90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRDb25maWdzUmFkaW9CdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFhNTEZpbGVQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdmVyd3JpdGVUZXh0X21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydGluZ1hNTF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFhNTEZpbGVfZXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRYTUxXaXphcmRfZXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRYTUxXaXphcmRfcmV2aWV3TG9nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydFhNTFNlcnZpY2VfZXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRYTUxTZXJ2aWNlX2ZlYXR1cmVfZXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X2Vycm9yX2xvYWRfeG1sOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9ub19wbHVnaW47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X25vX2ZlYXR1cmU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X25vX2NsYXNzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9pbnZhbGlkX2ZlYXR1cmVfdmFsdWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfZXJyb3JfcHJvY2Vzc193cm9uZ19jb250YWluZXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X25ld19pZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfaWRfbm90X3VuaXF1ZTsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEV4cG9ydFhNTFJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0OTk4M2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIwotIyBNZXNzYWdlIElEIFJhbmdlOgotIwotCi0jIEV4cG9ydCBYTUwgV2l6YXJkCi1leHBvcnRYTUxXaXphcmRfdGl0bGU9RXhwb3J0IFhNTAotCi0jIFNlbGVjdCBFeHBvcnQgVHlwZSBXaXphcmQgUGFnZQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYz1TZWxlY3QgdGhlIHR5cGUgb2YgbWV0aG9kIGxpYnJhcnkgY29udGVudCB0byBleHBvcnQuCi1leHBvcnRMaWJyYXJ5UmFkaW9CdXR0b25fdGV4dD1FeHBvcnQgdGhlIGVudGlyZSBtZXRob2QgbGlicmFyeQotZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uX3RleHQ9RXhwb3J0IG9uZSBvciBtb3JlIG1ldGhvZCBwbHVnLWlucwotZXhwb3J0Q29uZmlnc1JhZGlvQnV0dG9uX3RleHQ9RXhwb3J0IGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQotIyBTZWxlY3QgRGVzdGluYXRpb24gWE1MIEZpbGUgV2l6YXJkIFBhZ2UKLXNlbGVjdFhNTEZpbGVQYWdlX3RpdGxlPVNwZWNpZnkgZXhwb3J0IGZpbGUKLXNlbGVjdFhNTEZpbGVQYWdlX2Rlc2M9U3BlY2lmeSBhIGRlc3RpbmF0aW9uIFhNTCBmaWxlIHRvIHN0b3JlIHRoZSBleHBvcnRlZCBtZXRob2QgbGlicmFyeSBjb250ZW50LgotZmlsZUxhYmVsX3RleHQ9WE1MIEZpbGU6Ci1icm93c2VCdXR0b25fdGV4dD1Ccm93c2UuLi4KLQotIyBPdmVyd3JpdGUgQ29uZmlybWF0aW9uIERpYWxvZwotb3ZlcndyaXRlVGV4dF9tc2c9Jyd7MH0nJyBhbHJlYWR5IGV4aXN0cy5cbkRvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSBpdD8KLQotIyBQcm9ncmVzcyBNZXNzYWdlcwotZXhwb3J0aW5nWE1MX3RleHQ9RXhwb3J0IG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgdG8gWE1MIGZpbGUuLi4KLQotIyBFcnJvciBNZXNzYWdlcwotaW52YWxpZFhNTEZpbGVfZXJyb3I9VGhlIHNwZWNpZmllZCBYTUwgZmlsZSBpcyBub3QgdmFsaWQuCi1leHBvcnRYTUxXaXphcmRfZXJyb3I9SVVQTTAwMDBFOiBUaGUgRXhwb3J0IGZhaWxlZDogezB9Ci1leHBvcnRYTUxXaXphcmRfcmV2aWV3TG9nPUV4cG9ydCBjb21wbGV0ZWQuIFBsZWFzZSByZXZpZXcgdGhlIGxvZyBmaWxlcyB1bmRlciB0aGUgZXhwb3J0IGRpcmVjdG9yeS4KLWV4cG9ydFhNTFNlcnZpY2VfZXJyb3I9RXJyb3IgZXhwb3J0aW5nIGxpYnJhcnk6IHswfQotZXhwb3J0WE1MU2VydmljZV9mZWF0dXJlX2Vycm9yPUVycm9yIHNldHRpbmcgZmVhdHVyZSB2YWx1ZTo6IEVsZW1lbnQ9ezB9LCBmZWF0dXJlPXsxfQoteG1sTGlicmFyeV9lcnJvcl9sb2FkX3htbD1VbmFibGUgdG8gbG9hZCB4bWwgc291cmNlICcnezB9JycKLXhtbExpYnJhcnlfbm9fcGx1Z2luPU5vIE1ldGhvZFBsdWdpbiBmb3IgaWQgezB9Ci14bWxMaWJyYXJ5X25vX2ZlYXR1cmU9VW5hYmxlIHRvIGdldCBYbWwgZmVhdHVyZSBmb3IgezB9X3sxfQoteG1sTGlicmFyeV9ub19jbGFzcz1VbmFibGUgdG8gZ2V0IEVDbGFzcyBmb3IgezB9Ci14bWxMaWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50PUVycm9yIGNyZWF0aW5nIGVsZW1lbnQsIERvbicndCBrbm93IGhvdyB0byBzZXQgdmFsdWUgZm9yIGZlYXR1cmUgezB9Ci14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZT1FcnJvciBjcmVhdGluZyBlbGVtZW50LCBDYW4nJ3Qgc2V0IHZhbHVlIHswfSB0byBjb250YWluZXIgezF9Ci14bWxMaWJyYXJ5X2ludmFsaWRfZmVhdHVyZV92YWx1ZT1JbnZhbGlkIGF0dHJpYnV0ZSBmZWF0dXJlIHZhbHVlIGZvciBmZWF0dXJlIHswfSwgd2l0aCB2YWx1ZSB7MX0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzI9RXJyb3Igc2V0dGluZyBhdHRyaWJ1dGUsIFVuYWJsZSB0byBzZXQgdmFsdWUgZm9yIGZlYXR1cmU9ezB9LCBvYmplY3Q9ezF9LCB2YWx1ZT17Mn0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzM9RG9uJyd0IGtub3cgaG93IHRvIHNldCB2YWx1ZSBmb3IgZmVhdHVyZT17MH0sIG9iamVjdD17MX0sIHZhbHVlPXsyfQoteG1sTGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlPUVycm9yIHNldHRpbmcgcmVmZXJlbmNlLCBVbmFibGUgdG8gc2V0IHZhbHVlIGZvciBmZWF0dXJlPXswfSwgb2JqZWN0PXsxfSwgdmFsdWU9ezJ9Ci14bWxMaWJyYXJ5X2Vycm9yX3Byb2Nlc3Nfd3JvbmdfY29udGFpbmVyPXByb2Nlc3MgJyd7MH0nJyBkb24nJ3QgaGF2ZSBhIHZhbGlkIGNvbnRhaW5lci4gVGhlIGNvbnRhaW5lciBpcyBvZiB0eXBlICcnezF9JycsIHdoaWNoIGlzIG5vdCBhIFByb2Nlc3NwYWNrYWdlCi14bWxMaWJyYXJ5X25ld19pZD1FbGVtZW50IHswfSBpcyBhc3NpZ25lZCB3aXRoIGEgbmV3IGlkIHsxfSBiZWNhdXNlIGl0IGRvZXMgbm90IGhhdmUgYSB2YWxpZCBvbmUKLXhtbExpYnJhcnlfaWRfbm90X3VuaXF1ZT1FbGVtZW50IElkICcnezB9JycgaXMgdXNlZCBieSBtb3JlIHRoYW4gb25lIGVsZW1lbnQKLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUzMDk5ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGFjdGl2YXRvciBmb3IgbWFuYWdpbmcgdGhlIEV4cG9ydCBYTUwgcGx1Zy1pbidzIGxpZmUgY3ljbGUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvcHJlZmVyZW5jZXMvRXhwb3J0WE1MUHJlZmVyZW5jZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3ByZWZlcmVuY2VzL0V4cG9ydFhNTFByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4M2UwNzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvcHJlZmVyZW5jZXMvRXhwb3J0WE1MUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzLkV4cG9ydFhNTERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIFRoZSBFeHBvcnQgWE1MIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFhNTFByZWZlcmVuY2VzIHsKLQotCS8qKgotCSAqIFRoZSBleHBvcnQgdHlwZSBwcmVmZXJlbmNlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfVFlQRSA9ICJleHBvcnRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4cG9ydGVkIFhNTCBmaWxlIHByZWZlcmVuY2Uga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9GSUxFID0gInhtbEZpbGUiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgewotCQkvLyBJbml0aWFsaXplIHRoZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzLgotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChFWFBPUlRfVFlQRSwgRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX0xJQlJBUlkpOyAvLyROT04tTkxTLTEkCQkKLQkJc3RvcmUuc2V0RGVmYXVsdChYTUxfRklMRSwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXhwb3J0IHR5cGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBleHBvcnQgdHlwZSBwcmVmZXJlbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0RXhwb3J0VHlwZSgpIHsKLQkJcmV0dXJuIEV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0SW50KAotCQkJCUVYUE9SVF9UWVBFKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBleHBvcnRlZCB0eXBlIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIGV4cG9ydFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB1c2VyIHNwZWNpZmllZCBleHBvcnQgdHlwZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRFeHBvcnRUeXBlKGludCBleHBvcnRUeXBlKSB7Ci0JCUV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoRVhQT1JUX1RZUEUsCi0JCQkJZXhwb3J0VHlwZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXhwb3J0ZWQgWE1MIGZpbGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBleHBvcnRlZCBYTUwgZmlsZSBwcmVmZXJlbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0WE1MRmlsZSgpIHsKLQkJcmV0dXJuIEV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCVhNTF9GSUxFKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBleHBvcnRlZCBYTUwgZmlsZSBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgYWJzb2x1dGUgcGF0aCB0byBhIFhNTCBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFhNTEZpbGUoU3RyaW5nIHBhdGgpIHsKLQkJRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShYTUxfRklMRSwKLQkJCQlwYXRoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTJjMjBjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBwcmVmZXJlbmNlIHN1cHBvcnQgZm9yIHRoZSBFeHBvcnQgWE1MIHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0UmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTQwNjE0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLkJhc2VSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLlVybEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIFRoZSByZXNvdXJjZSBoYW5kbGVyIGZvciBjb250ZW50IGluIHRoZSBleHBvcnRlZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0UmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgQmFzZVJlc291cmNlSGFuZGxlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRSZXNvdXJjZUhhbmRsZXIoRmlsZSBzb3VyY2VMaWJSb290LCBGaWxlIHRhcmdldExpYlJvb3QpIHsKLQkJc3VwZXIoc291cmNlTGliUm9vdCwgdGFyZ2V0TGliUm9vdCk7Ci0JfQotCi0JLyoqCi0JICogcmVzb2x2ZSB0aGUgdXJsLiBGb3IgWE1MIGV4cG9ydCwgd2Ugc2hvdWxkIHJlc2VydmUgdGhlIHJlc291cmNlIGxvY2F0aW9ucy4KLQkgKi8KLQlwdWJsaWMgVXJsSW5mbyByZXNvbHZlRmlsZVVybChPYmplY3Qgb3duZXIsIFN0cmluZyBzcmNVcmwpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gbG9hZFVybEluZm9XaXRoRml4ZWRQYXRoKG93bmVyLCBzcmNVcmwpOwotCX0KLQotCQotCS8qKgotCSAqIHRoZSByZXNvdXJjZSBwYXRoIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGxpYmFyeSByb290LiB1cmxzIG5lZWRzIHRvIGJlCi0JICogZml4ZWQKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIHRoZSBvd25lciBvYmplY3QgaW4gdGhlIHRhcmdldCBsaWJyYXJ5Ci0JICogQHBhcmFtIHNyY1VybAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFVybEluZm8gbG9hZFVybEluZm9XaXRoRml4ZWRQYXRoKE9iamVjdCBvd25lciwgU3RyaW5nIHNyY1VybCkgewotCQlVcmxJbmZvIGluZm8gPSBuZXcgVXJsSW5mbygpOwotCQlpbmZvLnNvdXJjZVVybCA9IHNyY1VybDsKLQkJaW5mby50YXJnZXRVcmwgPSBzcmNVcmw7Ci0JCVN0cmluZyBzcmNGaWxlID0gZ2V0RmlsZVJlbFBhdGgob3duZXIsIHNyY1VybCk7Ci0JCWlmIChzcmNGaWxlICE9IG51bGwpIHsKLQkJCWluZm8uc291cmNlRmlsZSA9IG5ldyBGaWxlKHNvdXJjZUxpYlJvb3QsIHNyY0ZpbGUpOwotCQkJaW5mby50YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0TGliUm9vdCwgc3JjRmlsZSk7Ci0JCQlpbmZvLnRhcmdldFVybCA9IHNyY0ZpbGUucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCX0KLQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRGaWxlUmVsUGF0aChPYmplY3Qgb3duZXIsIFN0cmluZyBzcmNVcmwpIHsKLQkJdHJ5IHsKLQkJCWlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgaWQgPSAoKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQpIG93bmVyKQotCQkJCQkJLmdldElkKCk7Ci0JCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQoaWQpOwotCQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlGaWxlIGYgPSBuZXcgRmlsZShuZXcgRmlsZShzb3VyY2VMaWJSb290LAotCQkJCQkJCQlSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChlbGVtZW50KSksIHNyY1VybCk7Ci0JCQkJCQlTdHJpbmcgcGF0aCA9IGYuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKHNvdXJjZUxpYlJvb3QuZ2V0Q2Fub25pY2FsUGF0aCgpCi0JCQkJCQkJCS5sZW5ndGgoKSArIDEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBMb2cgZXJyb3IgaGVyZQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0vLwkvKioKLS8vCSAqIHRoZSByZXNvdXJjZSBwYXRoIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIG93bmVyIGVsZW1lbnQuIHVybHMgd2lsbCBub3QgYmUKLS8vCSAqIGNoYW5nZWQgYnV0IHJlc291cmNlIGZpbGVzIGlzIHJlbGljYXRlZC4KLS8vCSAqIAotLy8JICogQHBhcmFtIG93bmVyCi0vLwkgKiBAcGFyYW0gc3JjVXJsCi0vLwkgKiBAcmV0dXJuCi0vLwkgKi8KLS8vCXByaXZhdGUgVXJsSW5mbyBsb2FkVXJsSW5mb1dpdGhSZWxhdGl2ZVBhdGgoT2JqZWN0IG93bmVyLCBTdHJpbmcgc3JjVXJsKSB7Ci0vLwkJVXJsSW5mbyBpbmZvID0gbmV3IFVybEluZm8oKTsKLS8vCi0vLwkJdHJ5IHsKLS8vCQkJaW5mby5zb3VyY2VVcmwgPSBzcmNVcmw7Ci0vLwkJCWluZm8udGFyZ2V0VXJsID0gc3JjVXJsOyAvLyBubyB1cmwgY2hhbmdlCi0vLwotLy8JCQkvLyBnZXQgdGhlIHJtYyBvYmplY3QKLS8vCQkJaWYgKG93bmVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCkgewotLy8JCQkJU3RyaW5nIGlkID0gKChvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50KSBvd25lcikKLS8vCQkJCQkJLmdldElkKCk7Ci0vLwkJCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLS8vCQkJCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotLy8JCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotLy8JCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudChpZCk7Ci0vLwkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotLy8JCQkJCQlGaWxlIGYgPSBuZXcgRmlsZShuZXcgRmlsZShzb3VyY2VMaWJSb290LAotLy8JCQkJCQkJCVJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKGVsZW1lbnQpKSwgc3JjVXJsKTsKLS8vCQkJCQkJZiA9IGYuZ2V0Q2Fub25pY2FsRmlsZSgpOwotLy8KLS8vCQkJCQkJaW5mby5zb3VyY2VGaWxlID0gZjsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCi0vLwkJCWluZm8udGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldExpYlJvb3QsIHNyY1VybCkKLS8vCQkJCQkuZ2V0Q2Fub25pY2FsRmlsZSgpOwotLy8KLS8vCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0vLwkJCS8vIGxvZyBlcnJvciBUT0RPCi0vLwkJfQotLy8JCXJldHVybiBpbmZvOwotLy8JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRYTUxEYXRhLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRYTUxEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyOTQwMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0WE1MRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogU3RvcmVzIHRoZSBzZWxlY3Rpb25zIGFuZCBzZXR0aW5ncyBtYWRlIGJ5IHRoZSB1c2VyIGluIHRoZSBFeHBvcnQgWE1MIHdpemFyZC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0WE1MRGF0YSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBPUlRfTUVUSE9EX0xJQlJBUlkgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQT1JUX01FVEhPRF9QTFVHSU5TID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUE9SVF9NRVRIT0RfQ09ORklHUyA9IDM7Ci0KLQlwcm90ZWN0ZWQgaW50IGV4cG9ydFR5cGUgPSBFWFBPUlRfTUVUSE9EX0xJQlJBUlk7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBzZWxlY3RlZFBsdWdpbnM7Ci0JCi0JcHJvdGVjdGVkIEhhc2hTZXQgYXNzb2NpYXRlZENvbmZpZ3M7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBzZWxlY3RlZENvbmZpZ3M7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHhtbEZpbGU7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBleHBvcnQgdHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIGV4cG9ydCBvcGVyYXRpb24gdG8gcGVyZm9ybS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEV4cG9ydFR5cGUoKSB7Ci0JCXJldHVybiBleHBvcnRUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGV4cG9ydCB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBleHBvclR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGV4cG9ydCBvcGVyYXRpb24gdG8gcGVyZm9ybQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cG9ydFR5cGUoaW50IGV4cG9ydFR5cGUpIHsKLQkJdGhpcy5leHBvcnRUeXBlID0gZXhwb3J0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNlbGVjdGVkIG1ldGhvZCBwbHVnLWlucy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBtZXRob2QgcGx1Zy1pbnMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZWxlY3RlZFBsdWdpbnMoKSB7Ci0JCXJldHVybiBzZWxlY3RlZFBsdWdpbnM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYXNzb2NpYXRlZCBjb25maWdzIHdpdGggcmVzcGVjdGVkIHRvIHNlbGVjdGVkIHBsdWctaW5zCi0JICogCi0JICogQHBhcmFtIGFzc29jaWF0ZWRDb25maWdNYXAKLQkgKiAgICAgICAgICAgTWFwIG9mIHNlbGVjdGVkIHBsdWctaW5zIHRvIGFzc29jaWF0ZWQgY29uZmlncwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFzc29jaWF0ZWRDb25maWdzKE1hcCBhc3NvY2lhdGVkQ29uZmlnTWFwKSB7Ci0JCWlmIChhc3NvY2lhdGVkQ29uZmlnTWFwID09IG51bGwgfHwgYXNzb2NpYXRlZENvbmZpZ01hcC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NvY2lhdGVkQ29uZmlncyA9IG5ldyBIYXNoU2V0KCk7IAotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYXNzb2NpYXRlZENvbmZpZ01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlMaXN0IGNvbmZpZ0xpc3QgPSAoTGlzdCkgaXQubmV4dCgpOwotCQkJaW50IHN6ID0gY29uZmlnTGlzdCA9PSBudWxsID8gMCA6IGNvbmZpZ0xpc3Quc2l6ZSgpOwotCQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBjb25maWdMaXN0LmdldChpKTsKLQkJCQlpZiAoIWFzc29jaWF0ZWRDb25maWdzLmNvbnRhaW5zKGNvbmZpZy5nZXRHdWlkKCkpKSB7Ci0JCQkJCWFzc29jaWF0ZWRDb25maWdzLmFkZChjb25maWcuZ2V0R3VpZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB1c2VyIHNlbGVjdGVkIG1ldGhvZCBwbHVnLWlucy4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2lucwotCSAqICAgICAgICAgICAgYSBsaXN0IG9mIG1ldGhvZCBwbHVnLWlucwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkUGx1Z2lucyhMaXN0IHBsdWdpbnMpIHsKLQkJc2VsZWN0ZWRQbHVnaW5zID0gcGx1Z2luczsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzZWxlY3RlZCBtZXRob2QgY29uZmlndXJhdGlvbnMuCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgbWV0aG9kIGNvbmZpZ3VyYXRpb25zCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VsZWN0ZWRDb25maWdzKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRDb25maWdzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVzZXIgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdzCi0JICogICAgICAgICAgICBhIGxpc3Qgb2YgbWV0aG9kIGNvbmZpZ3VyYXRpb25zCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRDb25maWdzKExpc3QgY29uZmlncykgewotCQlzZWxlY3RlZENvbmZpZ3MgPSBjb25maWdzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIFhNTCBmaWxlLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgWE1MIGZpbGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFhNTEZpbGUoKSB7Ci0JCXJldHVybiB4bWxGaWxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIFhNTCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB4bWxGaWxlCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBYTUwgZmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFhNTEZpbGUoU3RyaW5nIHhtbEZpbGUpIHsKLQkJdGhpcy54bWxGaWxlID0geG1sRmlsZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0V4cG9ydFhNTExvZ2dlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0WE1MTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhNTMzNDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0WE1MTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5GaWxlTG9nZ2VyOwotCi0KLS8qKgotICogTG9nZ2VyIGNsYXNzIGZvciB4bWwgZXhwb3J0Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0WE1MTG9nZ2VyIGV4dGVuZHMgRmlsZUxvZ2dlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HU19GT0xERVIgPSAibG9ncyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRYTUxMb2dnZXIoRmlsZSBsb2dSb290KSB7Ci0JCXN1cGVyKG5ldyBGaWxlKGxvZ1Jvb3QsIExPR1NfRk9MREVSKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0WE1MU2VydmljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0WE1MU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTA3MDk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0V4cG9ydFhNTFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5Db250ZW50UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5JUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuRGlhZ3JhbUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogWG1sRXhwb3J0IHNlcnZpY2UgY2xhc3MgdG8gcHJvY2VzcyB0aGUgZXhwb3J0aW5nIHRhc2sKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFhNTFNlcnZpY2UgewotCi0JLy8gU3RyaW5nIHhtbFBhdGg7Ci0JcHJpdmF0ZSBFeHBvcnRYTUxEYXRhIGRhdGE7Ci0KLQlwcml2YXRlIFhNTExpYnJhcnkgeG1sTGliOwotCi0JcHJpdmF0ZSBMaXN0IGRpc2NhcmRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JRXhwb3J0WE1MTG9nZ2VyIGxvZ2dlciA9IG51bGw7Ci0KLQkvLyBpbiBjYXNlIHdlIG5lZWQgdG8gbWFwcGluZyB0aGUgdW1hIG9iamVjdHMgdG8geG1sIG9iamVjdHMKLQkvLyBzdWNoIGFzIHRoZSBjb250ZW50IGNhdGVnb3JpZXMKLQlwcml2YXRlIE1hcCB1bWFJZFRvWG1sSWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgRGlhZ3JhbUhhbmRsZXIgZGlhZ3JhbUhhbmRsZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRYTUxTZXJ2aWNlKEV4cG9ydFhNTERhdGEgZGF0YSkgewotCQl0aGlzLmRhdGEgPSBkYXRhOwotCQlsb2dnZXIgPSBuZXcgRXhwb3J0WE1MTG9nZ2VyKG5ldyBGaWxlKHRoaXMuZGF0YS54bWxGaWxlKQotCQkJCS5nZXRQYXJlbnRGaWxlKCkpOwotCX0KLQkvKioKLQkgKiBHZXRzIHRoZSBsb2dnZXIgZmlsZS4KLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRMb2dQYXRoKCkgewotCQlyZXR1cm4gbG9nZ2VyLmdldExvZ1BhdGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJbG9nZ2VyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBEb2VzIFhNTCBsaWJyYXJ5IGV4cG9ydC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0V4cG9ydChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQotCQkJSVJlc291cmNlSGFuZGxlciBoYW5kbGVyID0gbmV3IEV4cG9ydFJlc291cmNlSGFuZGxlcigKLQkJCQkJbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSksIG5ldyBGaWxlKGRhdGEKLQkJCQkJCQkuZ2V0WE1MRmlsZSgpKS5nZXRQYXJlbnRGaWxlKCkpOwotCQkJQ29udGVudFByb2Nlc3NvciBjb250ZW50UHJvYyA9IG5ldyBDb250ZW50UHJvY2Vzc29yKGhhbmRsZXIsCi0JCQkJCXRoaXMubG9nZ2VyKTsKLQkJCQotCQkJZGlhZ3JhbUhhbmRsZXIgPSBuZXcgRGlhZ3JhbUhhbmRsZXIoCi0JCQkJCW5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkpLCBuZXcgRmlsZShkYXRhCi0JCQkJCQkJLmdldFhNTEZpbGUoKSkuZ2V0UGFyZW50RmlsZSgpKTsKLQotCQkJLy8gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UucHJpbnRGZWF0dXJlTmFtZU1hcHBpbmcoKTsKLQotCQkJLy8gZXhwb3J0IHRoZSBjdXJyZW50IGxpYnJhcnkgdG8gdGhlIHhtbCBmaWxlCi0JCQkvLyBnZXQgdGhlIGN1cnJlbnQgbGlicmFyeSBpbnN0YW5jZSBhbmQgZXhwb3J0IGFsbCB0byB0aGUgeG1sCi0JCQlNZXRob2RMaWJyYXJ5IHNyYyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkJCXRoaXMueG1sTGliID0gbmV3IFhNTExpYnJhcnkoY29udGVudFByb2MsIGxvZ2dlciwgZGF0YQotCQkJCQkuZ2V0WE1MRmlsZSgpKTsKLQotCQkJdGhpcy54bWxMaWIuY3JlYXRlTGlicmFyeShzcmMuZ2V0R3VpZCgpLCBzcmMuZ2V0TmFtZSgpKTsKLQkJCUVEYXRhT2JqZWN0IHRhcmdldCA9IHRoaXMueG1sTGliLmdldFJvb3QoKTsKLQotCQkJY3JlYXRFRGF0YU9iamVjdFRyZWUoc3JjLCB0YXJnZXQpOwotCQkJaXRlcmF0RURhdGFPYmplY3Qoc3JjKTsKLQotCQkJdGhpcy54bWxMaWIuZml4TGlicmFyeUZvckV4cG9ydCgpOwotCQkJCi0JCQl0aGlzLnhtbExpYi5zYXZlKCk7Ci0JCQlkaWFncmFtSGFuZGxlci5leGVjdXRlKCk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcihOTFMuYmluZChFeHBvcnRYTUxSZXNvdXJjZXMuZXhwb3J0WE1MU2VydmljZV9lcnJvciwKLQkJCQkJZS5nZXRNZXNzYWdlKCkpLCBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1BsdWdpblNlbGVjdGVkKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJaWYgKGRhdGEuZXhwb3J0VHlwZSA9PSBFeHBvcnRYTUxEYXRhLkVYUE9SVF9NRVRIT0RfTElCUkFSWSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZGF0YS5leHBvcnRUeXBlID09IEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9QTFVHSU5TKSB7Ci0JCQlyZXR1cm4gKGRhdGEuc2VsZWN0ZWRQbHVnaW5zICE9IG51bGwpCi0JCQkJCSYmIGRhdGEuc2VsZWN0ZWRQbHVnaW5zLmNvbnRhaW5zKHBsdWdpbik7Ci0JCX0gZWxzZSBpZiAoZGF0YS5leHBvcnRUeXBlID09IEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9DT05GSUdTKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0NvbmZpZ0V4Y2x1ZGVkKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmIChkYXRhLmV4cG9ydFR5cGUgPT0gRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX1BMVUdJTlMpIHsKLQkJCXJldHVybiBkYXRhLmFzc29jaWF0ZWRDb25maWdzID09IG51bGwgfHwgCi0JCQkJCSFkYXRhLmFzc29jaWF0ZWRDb25maWdzLmNvbnRhaW5zKGNvbmZpZy5nZXRHdWlkKCkpOwotCQl9IAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdEVEYXRhT2JqZWN0VHJlZShNZXRob2RFbGVtZW50IHNyY09iaiwKLQkJCUVEYXRhT2JqZWN0IHRhcmdldE9iaikgewotCi0JCS8vIGlmIGl0J3MgYSBwbHVnaW4sIHNraXAgYWxsIHRoZSBzeXN0ZW0gcGFja2FnZXMKLQkJLy8gYW5kIGZpbmQgdGhlIHRvcCBtb3N0IHVzZXIgcGFja2FnZXMKLQkJaWYgKHNyY09iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgc3JjT2JqOwotCQkJaWYgKCFpc1BsdWdpblNlbGVjdGVkKHBsdWdpbikpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIGFsbCBzeXN0ZW0gcGFja2FnZXMgYXJlIGRpc2NhcmRlZAotCQkJZGlzY2FyZGVkRWxlbWVudHMuYWRkQWxsKFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMocGx1Z2luKSk7Ci0KLQkJCUxpc3QgdG9wbW9zdFVzZXJQYWNrYWdlcyA9IGdldFRvcG1vc3RVc2VyUGFja2FnZShwbHVnaW4pOwotCQkJTGlzdCBjYXRlZ29yeVBrZ3MgPSBUbmdVdGlsLmdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VzKHBsdWdpbik7Ci0KLQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UgeG1sUGtnID0gKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UpIHRoaXMueG1sTGliCi0JCQkJCS5nZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKHBsdWdpbi5nZXRHdWlkKCkpOwotCQkJU3RyaW5nIGNvbnRlbnRDYXRlZ29yeVBhY2thZ2VJZCA9IHhtbFBrZy5nZXRJZCgpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0cCA9IHRvcG1vc3RVc2VyUGFja2FnZXMuaXRlcmF0b3IoKTsgaXRwLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RQYWNrYWdlIHBrZyA9IChNZXRob2RQYWNrYWdlKSBpdHAubmV4dCgpOwotCi0JCQkJLy8gaWYgaXQncyBhIGNhdGVnb3J5IHBhY2thZ2UsCi0JCQkJLy8gY3JlYXRlIGFsbCBjb250YWluZWQgZWxlbWVudHMgaW4gdGhlIHNpbmdsZSBjdXN0b20gY2F0ZWdvcnkKLQkJCQkvLyBwYWNrYWdlCi0JCQkJaWYgKGNhdGVnb3J5UGtncy5jb250YWlucyhwa2cpKSB7Ci0KLQkJCQkJLy8gc2V0IHRoZSBpdCBtYXBwaW5nCi0JCQkJCXNldElkTWFwcGluZyhwa2cuZ2V0R3VpZCgpLCBjb250ZW50Q2F0ZWdvcnlQYWNrYWdlSWQpOwotCQkJCQljcmVhdEVEYXRhT2JqZWN0VHJlZShwa2csIHhtbFBrZyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3JlYXRFRGF0YU9iamVjdFRyZWUocGtnLCB0YXJnZXRPYmopOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBzcmNPYmouZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgY2hpbGQgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotCi0JCQkJLy8gaW4gdW1hIG1vZGVsLCBXb3JrT3JkZXIgaXMgY29udGFpbmVkIGluIHBhY2thZ2UKLQkJCQkvLyBpbiB4bWwgbW9kZWwsIFdvcmtPcmRlciBpcyBjb250YWluZWQgYnkgdGhlIG93bmluZwotCQkJCS8vIFdvcmtCcmVha2Rvd25FbGVtZW50LAotCQkJCS8vIHNvIGRlbGF5IHRoZSBjcmVhdGlvbiBpZiB0aGUgb3duZXIgaXMgYSBwYWNrYWdlCi0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgV29ya09yZGVyCi0JCQkJCQkmJiBzcmNPYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmICgoY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pCi0JCQkJCQkmJiAhaXNQbHVnaW5TZWxlY3RlZCgoTWV0aG9kUGx1Z2luKSBjaGlsZCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24gJiYKLQkJCQkJaXNDb25maWdFeGNsdWRlZCgoTWV0aG9kQ29uZmlndXJhdGlvbikgY2hpbGQpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmICghaXNEaXNjYXJkZWQoY2hpbGQpKSB7Ci0JCQkJCWNyZWF0ZVhtbE9iamVjdChjaGlsZCwgdGFyZ2V0T2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0SWRNYXBwaW5nKFN0cmluZyB1bWFJZCwgU3RyaW5nIHhtbElkKSB7Ci0JCWlmICghdW1hSWRUb1htbElkTWFwLmNvbnRhaW5zS2V5KHVtYUlkKSkgewotCQkJdW1hSWRUb1htbElkTWFwLnB1dCh1bWFJZCwgeG1sSWQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0WG1sSWQoU3RyaW5nIHVtYUlkKSB7Ci0JCWlmICh1bWFJZFRvWG1sSWRNYXAuY29udGFpbnNLZXkodW1hSWQpKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgdW1hSWRUb1htbElkTWFwLmdldCh1bWFJZCk7Ci0JCX0KLQkJcmV0dXJuIHVtYUlkOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0Rpc2NhcmRlZChPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBkaXNjYXJkZWRFbGVtZW50cy5jb250YWlucyhvKTsKLQl9Ci0KLQlwcml2YXRlIEVEYXRhT2JqZWN0IGdldFhtbE9iamVjdChNZXRob2RFbGVtZW50IHNyY09iaikgewotCQlTdHJpbmcgaWQgPSBzcmNPYmouZ2V0R3VpZCgpOwotCQlpZiAodW1hSWRUb1htbElkTWFwLmNvbnRhaW5zS2V5KGlkKSkgewotCQkJaWQgPSAoU3RyaW5nKSB1bWFJZFRvWG1sSWRNYXAuZ2V0KGlkKTsKLQkJfQotCQlyZXR1cm4gdGhpcy54bWxMaWIuZ2V0RWxlbWVudChpZCk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGFuIHhtbCBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyLCBiYXNlZCBvbiB0aGUgdW1hIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gdW1hRWxlbWVudAotCSAqIEBwYXJhbSB0YXJnZXRDb250YWluZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlWG1sT2JqZWN0KE1ldGhvZEVsZW1lbnQgdW1hRWxlbWVudCwKLQkJCUVEYXRhT2JqZWN0IHRhcmdldENvbnRhaW5lcikgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IHVtYUVsZW1lbnQuZUNvbnRhaW5tZW50RmVhdHVyZSgpOwotCQljcmVhdGVYbWxPYmplY3QodW1hRWxlbWVudCwgdGFyZ2V0Q29udGFpbmVyLCBmZWF0dXJlLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGFuIHhtbCBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyLCBiYXNlZCBvbiB0aGUgdW1hIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gdW1hRWxlbWVudAotCSAqIEBwYXJhbSB0YXJnZXRDb250YWluZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlWG1sT2JqZWN0KE1ldGhvZEVsZW1lbnQgdW1hRWxlbWVudCwKLQkJCUVEYXRhT2JqZWN0IHRhcmdldENvbnRhaW5lciwgU3RyaW5nIGNvbnRhaW5tZW50RmVhdHVyZSkgewotCi0JCXRyeSB7Ci0JCQlpZiAodW1hRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBnZXQgdGhlIGNvbnRhaW5tZW50IGZlYXR1cmUgc28gd2UgY2FuIGNyZWF0ZSB0aGUgb2JqZWN0IG9mIHRoZQotCQkJLy8gc2FtZSB0eXBlCi0JCQlTdHJpbmcgZWxlbWVudFR5cGUgPSB1bWFFbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCk7Ci0JCQlFRGF0YU9iamVjdCB4bWxFbGVtZW50ID0geG1sTGliLmNyZWF0ZUVsZW1lbnQodGFyZ2V0Q29udGFpbmVyLAotCQkJCQljb250YWlubWVudEZlYXR1cmUsIHVtYUVsZW1lbnQuZUNsYXNzKCkuZ2V0TmFtZSgpLAotCQkJCQllbGVtZW50VHlwZSwgdW1hRWxlbWVudC5nZXRHdWlkKCkpOwotCQkJaWYgKHhtbEVsZW1lbnQgIT0gbnVsbCkgewotCi0JCQkJLy8gcmVjdXJzaXZlCi0JCQkJY3JlYXRFRGF0YU9iamVjdFRyZWUodW1hRWxlbWVudCwgeG1sRWxlbWVudCk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyB0aGUgZXJyb3IgYW5kIGNvbnRpbnVlPz8/Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGl0ZXJhdEVEYXRhT2JqZWN0KE1ldGhvZEVsZW1lbnQgc3JjT2JqKSB7Ci0JCWRpYWdyYW1IYW5kbGVyLnJlZ2lzdGVyRWxlbWVudChzcmNPYmosIHRydWUpOwotCQkKLQkJaWYgKHNyY09iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHNyY09iajsKLQkJCWlmICghaXNQbHVnaW5TZWxlY3RlZChwbHVnaW4pKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJaWYgKGlzUHJvY2Vzc2VkKHNyY09iai5nZXRHdWlkKCkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0UHJvY2Vzc2VkKHNyY09iai5nZXRHdWlkKCkpOwotCi0JCUVEYXRhT2JqZWN0IHRhcmdldE9iaiA9IGdldFhtbE9iamVjdChzcmNPYmopOwotCi0JCS8vIGlmIG9iamVjdCBpcyBub3QgY3JlYXRlZCwKLQkJLy8gd2hpY2ggbWVhbnMgaXQncyBlaXRoZXIgYSBzeXN0ZW0gcGFja2FnZSBvciBzb21ldGhpbmcgd3JvbmcKLQkJaWYgKHRhcmdldE9iaiA9PSBudWxsKSB7Ci0JCQlpZiAoc3JjT2JqIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCS8vIGl0ZXJhdGUgdGhlIGNoaWxkIHBhY2thZ2VzCi0JCQkJZm9yIChJdGVyYXRvciBpdCA9ICgoTWV0aG9kUGFja2FnZSkgc3JjT2JqKS5nZXRDaGlsZFBhY2thZ2VzKCkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCWl0ZXJhdEVEYXRhT2JqZWN0KChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gLy8gZWxlbWVudHMgY2FuIGJlIHJlZmVyZW5jZSBpbiBvdGhlciBwbHVnaW5zCi0JCQkvLyAvLyBkb24ndCBuZWVkIHRvIGNhcmUgYWJvdXQgdGhpcwotCQkJLy8gZWxzZSBpZiAoIWlzRGlzY2FyZGVkKHNyY09iaikgKSB7Ci0JCQkvLyBsb2dnZXIubG9nV2FybmluZygiV2FybmluZzogeG1sIG9iamVjdCBub3QgY3JlYXRlZCBmb3IgIiArCi0JCQkvLyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShzcmNPYmopICk7Ci0JCQkvLyB9Ci0KLQkJCXJldHVybjsKLQkJfQotCi0JCUVDbGFzcyBlQ2xhc3MgPSBzcmNPYmouZUNsYXNzKCk7Ci0KLQkJRUxpc3QgZmVhdHVyZXMgPSBlQ2xhc3MuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdC5uZXh0KCk7Ci0KLQkJCU9iamVjdCB2YWx1ZSA9IHNyY09iai5lR2V0KGZlYXR1cmUpOwotCi0JCQl0cnkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdHYgPSAoKExpc3QpIHZhbHVlKS5pdGVyYXRvcigpOyBpdHYKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJTWV0aG9kRWxlbWVudCBzcmNfdmFsdWUgPSAoTWV0aG9kRWxlbWVudCkgaXR2Lm5leHQoKTsKLQotCQkJCQkJLy8gaGFuZGxlIHRoZQotCQkJCQkJLy8gVW1hUGFja2FnZSNnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcgotCQkJCQkJLy8gZmVhdHVyZSB2YWx1ZQotCQkJCQkJLy8gdGhlIFdvcmtPcmRlciBpbiB1bWEgaXMgYSBwcm9jZXNzIGVsZW1lbnQgaW4gYQotCQkJCQkJLy8gcGFja2FnZQotCQkJCQkJLy8gaW4geG1sIG1vZGVsLCBpdCdzIGFuIEVEYXRhT2JqZWN0IGNvbnRhaW5lZCBieSB0aGUKLQkJCQkJCS8vIFdvcmtCcmVha2Rvd25FbGVtZW50Ci0JCQkJCQlpZiAoc3JjX3ZhbHVlIGluc3RhbmNlb2YgV29ya09yZGVyKSB7Ci0JCQkJCQkJLy8gZ2V0IHRoZSBvd25lciBvZiB0aGUgV29ya09yZGVyCi0JCQkJCQkJRURhdGFPYmplY3Qgd29ya09yZGVyID0gZ2V0WG1sT2JqZWN0KHNyY192YWx1ZSk7Ci0JCQkJCQkJaWYgKHdvcmtPcmRlciA9PSBudWxsKSB7Ci0JCQkJCQkJCWNyZWF0ZVhtbE9iamVjdChzcmNfdmFsdWUsIHRhcmdldE9iaiwgZmVhdHVyZQotCQkJCQkJCQkJCS5nZXROYW1lKCkpOwotCQkJCQkJCX0KLQkJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIndvcmtvcmRlciB2YWx1ZSIpOwotCQkJCQkJfQotCi0JCQkJCQkvLyBzZXQgdGhlIHJlZmVyZW5jZQotCQkJCQkJU3RyaW5nIHhtbElkID0gZ2V0WG1sSWQoc3JjX3ZhbHVlLmdldEd1aWQoKSk7Ci0JCQkJCQl4bWxMaWIuc2V0UmVmZXJlbmNlVmFsdWUodGFyZ2V0T2JqLCBmZWF0dXJlLmdldE5hbWUoKSwKLQkJCQkJCQkJeG1sSWQsIHNyY192YWx1ZS5nZXRUeXBlKCkpOwotCi0JCQkJCQlpdGVyYXRFRGF0YU9iamVjdChzcmNfdmFsdWUpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJLy8gZ2V0IHRoZSB4bWwgb2JqZWN0IGFuZCBpdGVyYXRlIGFnYWluCi0JCQkJCU1ldGhvZEVsZW1lbnQgc3JjX3ZhbHVlID0gKE1ldGhvZEVsZW1lbnQpIHZhbHVlOwotCi0JCQkJCS8vIGlmICggc3JjX3ZhbHVlIGluc3RhbmNlb2YgV29ya09yZGVyICkgewotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIndvcmtvcmRlciB2YWx1ZSIpOwotCQkJCQkvLyB9Ci0KLQkJCQkJLy8gZWxlbWVudHMgbGlrZSBQcmVzZW50YXRpb24gbWF5IG5vdCBoYXZlIGEgQ29udGVudAotCQkJCQkvLyBEZXNjcmlwdGlvbgotCQkJCQkvLyB0aGUgb25lIHJldHVybmVkIG1heSBub3QgaGF2ZSBhIGNvbnRhaW5lcgotCQkJCQlpZiAoc3JjX3ZhbHVlLmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgeG1sSWQgPSBnZXRYbWxJZChzcmNfdmFsdWUuZ2V0R3VpZCgpKTsKLQkJCQkJCXhtbExpYi5zZXRSZWZlcmVuY2VWYWx1ZSh0YXJnZXRPYmosIGZlYXR1cmUuZ2V0TmFtZSgpLAotCQkJCQkJCQl4bWxJZCwgc3JjX3ZhbHVlLmdldFR5cGUoKSk7Ci0KLQkJCQkJCWl0ZXJhdEVEYXRhT2JqZWN0KHNyY192YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKCFpc0Rpc2NhcmRlZChzcmNPYmopKSB7Ci0JCQkJCS8vIGlmICggdGFyZ2V0T2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5UGFja2FnZSkgewotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImhycmUiKTsKLQkJCQkJLy8gfQotCi0JCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFdvcmtPcmRlclR5cGUpIHsKLQkJCQkJCXZhbHVlID0gKChXb3JrT3JkZXJUeXBlKSB2YWx1ZSkuZ2V0TmFtZSgpOwotCQkJCQl9Ci0KLQkJCQkJeG1sTGliLnNldEF0cmlidXRlRmVhdHVyZVZhbHVlKHRhcmdldE9iaiwKLQkJCQkJCQlmZWF0dXJlLmdldE5hbWUoKSwgdmFsdWUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKAotCQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydFhNTFNlcnZpY2VfZmVhdHVyZV9lcnJvciwKLQkJCQkJCUxpYnJhcnlVdGlsLmdldFR5cGVOYW1lKHNyY09iaiksIGZlYXR1cmUuZ2V0TmFtZSgpKTsKLQkJCQlsb2dnZXIubG9nRXJyb3IobXNnLCBlKTsKLQkJCX0KLQotCQl9Ci0KLQl9Ci0KLQkvLyBnb2lkIG9mIHByb2Nlc3NlZCBlbGVtZW50Ci0JcHJpdmF0ZSBMaXN0IHByb2Nlc3NlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzUHJvY2Vzc2VkKFN0cmluZyBndWlkKSB7Ci0JCXJldHVybiBwcm9jZXNzZWRFbGVtZW50cy5jb250YWlucyhndWlkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UHJvY2Vzc2VkKFN0cmluZyBndWlkKSB7Ci0JCWlmICghcHJvY2Vzc2VkRWxlbWVudHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCXByb2Nlc3NlZEVsZW1lbnRzLmFkZChndWlkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRUb3Btb3N0VXNlclBhY2thZ2UoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCi0JCU1ldGhvZFBhY2thZ2UgcGtnX2NvcmVfY29udGVudCA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQotCQlNZXRob2RQYWNrYWdlIHBrZ19jdXN0b21fY2F0ZWdvcmllcyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoKTsKLQotCQlNZXRob2RQYWNrYWdlIHBrZ19kaXNjaXBsaW5lcyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKTsKLQotCQlNZXRob2RQYWNrYWdlIHBrZ19kb21haW5zID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kb21haW5QYXRoKTsKLQotCQlNZXRob2RQYWNrYWdlIHBrZ19yb2xlc2V0cyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCi0JCU1ldGhvZFBhY2thZ2UgcGtnX3Rvb2xzID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCk7Ci0KLQkJTWV0aG9kUGFja2FnZSBwa2dfd3B0eXBlcyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCk7Ci0KLQkJTWV0aG9kUGFja2FnZSBwa2dfY3AgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCk7Ci0KLQkJTWV0aG9kUGFja2FnZSBwa2dfZHAgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGgpOwotCi0JCU1ldGhvZFBhY2thZ2UgcGtnX3Byb2NfY29udHJpYnV0aW9uID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5wcm9jZXNzQ29udHJpYnV0aW9uUGF0aCk7Ci0KLQkJTGlzdCBwa2dzID0gbmV3IEFycmF5TGlzdCgpOwotCQlwa2dzLmFkZChwa2dfY29yZV9jb250ZW50KTsKLQkJcGtncy5hZGQocGtnX2N1c3RvbV9jYXRlZ29yaWVzKTsKLQkJcGtncy5hZGQocGtnX2Rpc2NpcGxpbmVzKTsKLQkJcGtncy5hZGQocGtnX2RvbWFpbnMpOwotCQlwa2dzLmFkZChwa2dfcm9sZXNldHMpOwotCQlwa2dzLmFkZChwa2dfdG9vbHMpOwotCQlwa2dzLmFkZChwa2dfd3B0eXBlcyk7Ci0JCXBrZ3MuYWRkKHBrZ19jcCk7Ci0JCXBrZ3MuYWRkKHBrZ19kcCk7Ci0KLQkJaWYgKCBwa2dfcHJvY19jb250cmlidXRpb24gIT0gbnVsbCApIHsKLQkJCXBrZ3MuYWRkKHBrZ19wcm9jX2NvbnRyaWJ1dGlvbik7Ci0JCX0KLQkJCi0JCXJldHVybiBwa2dzOwotCi0JCS8vIExpc3Qgc3lzdGVtUGtncyA9IFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMocGx1Z2luKTsKLQkJLy8JCQotCQkvLyBMaXN0IHVucHJvY2Vzc2VkUGtncyA9IG5ldyBBcnJheUxpc3QocGx1Z2luLmdldE1ldGhvZFBhY2thZ2VzKCkpOwotCQkvLyB3aGlsZSAodW5wcm9jZXNzZWRQa2dzLnNpemUoKSA+IDAgKSB7Ci0JCS8vIE1ldGhvZFBhY2thZ2UgcGtnID0gKE1ldGhvZFBhY2thZ2UpIHVucHJvY2Vzc2VkUGtncy5yZW1vdmUoMCk7Ci0JCS8vIGlmICggIXN5c3RlbVBrZ3MuY29udGFpbnMocGtnKSApIHsKLQkJLy8gaWYgKCAhcGtncy5jb250YWlucyhwa2cpICkgewotCQkvLyBwa2dzLmFkZChwa2cpOwotCQkvLyB9Ci0JCS8vIGNvbnRpbnVlOwotCQkvLyB9Ci0JCS8vCQkJCi0JCS8vIGZvciAoIEl0ZXJhdG9yIGl0ID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7Ci0JCS8vICkgewotCQkvLyBNZXRob2RQYWNrYWdlIHAgPSAoTWV0aG9kUGFja2FnZSlpdC5uZXh0KCk7Ci0JCS8vIGlmICggc3lzdGVtUGtncy5jb250YWlucyhwKSApCi0JCS8vIHsKLQkJLy8gaWYgKCAhdW5wcm9jZXNzZWRQa2dzLmNvbnRhaW5zKHApICkgewotCQkvLyB1bnByb2Nlc3NlZFBrZ3MuYWRkKHApOwotCQkvLyB9Ci0JCS8vIH0gZWxzZSB7Ci0JCS8vIGlmICggIXBrZ3MuY29udGFpbnMocCkgKSB7Ci0JCS8vIHBrZ3MuYWRkKHApOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLwkJCQotCQkvLyBpZiAoIHVucHJvY2Vzc2VkUGtncy5zaXplKCkgPT0gMCApIHsKLQkJLy8gYnJlYWs7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLwkJCi0JCS8vIC8vIG5lZWQgdG8gaW5jbHVkZSB0aGUgY29udGVudCBwYWNrYWdlcwotCQkvLyBwa2dzLmFkZEFsbChUbmdVdGlsLmdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VzKHBsdWdpbikpOwotCi0JfQotCi0JLy8gcHJpdmF0ZSBib29sZWFuIGlzU3lzdGVtUGFja2FnZShFRGF0YU9iamVjdCBlbGVtZW50KSB7Ci0JLy8JCQotCS8vIGlmICggIShlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgKSB7Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQkvLwkJCi0JLy8gTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkvLyBpZiAoIHBsdWdpbiA9PSBudWxsICkgewotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0JLy8JCQotCS8vIHJldHVybiBUbmdVdGlsLmdldEFsbFN5c3RlbVBhY2thZ2VzKHBsdWdpbikuY29udGFpbnMoZWxlbWVudCk7Ci0JLy8JCQotCS8vIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0ZlYXR1cmVNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9GZWF0dXJlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZjQzZjQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0ZlYXR1cmVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRXh0ZW5kZWRNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBtYW5hZ2UgdGhlIGZlYXR1cmVzIG9mIEVDbGFzcy4KLSAqIG1haW50YWlucyBhIG1hcCBvZiBmZWF0dXJlIG5hbWUgdG8gdGhlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3QgZm9yIGVhc2llciBhY2Nlc3MKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlTWFuYWdlciB7Ci0KLQlwdWJsaWMgc3RhdGljIEZlYXR1cmVNYW5hZ2VyIElOU1RBTkNFID0gbmV3IEZlYXR1cmVNYW5hZ2VyKCk7Ci0JCi0JLy9wcml2YXRlIE1hcCBjbGFzc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JLy8gbWFwIG9mIHVtYSBmZWF0dXJlIG5hbWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgeG1sIGZlYXR1cmUgbmFtZQotCXByaXZhdGUgTWFwIGZlYXR1cmVOYW1lTWFwID0gbmV3IFRyZWVNYXAoKTsKLQkKLQkvLyB1bWEgZmVhdHVyZXMgdGhhdCBzaG91bGQgYmUgaWdub3JlZAotCXByaXZhdGUgTGlzdCB1bm5lZWRlZFJtY0ZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8geG1sIGZlYXR1cmVzIHRoYXQgY2FuIGJlIGlnbm9yZWQKLQlwcml2YXRlIExpc3QgdW5uZWVkZWRYbWxGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIG1hcCBvZiBFQ2xhc3MgbmFtZSB0byBFQ2xhc3MgT2JqZWN0IGZvciB4bWwgbW9kZWwKLQkvLyBub3RlOiB3ZSBjYW4ndCB1c2UgZmVhdHVyZS5nZXRFVHlwZSgpIHRvIGdldCB0aGUgRUNsYXNzIGZyb20gZmVhdHVyZQotCS8vIHRoZSBwcm9ibGVtIGlzIHRoZSBhYm92ZSByZXR1cm5lZCBFQ2xhc3MgbWF5IG5vdCBiZSB0aGUgY29uY3JlYXRlIEVDbGFzcywgaW5zdGVhZCwgaXQgaXMgdGhlIGJhc2UgY2xhc3MKLQkvLyBmb3IgZXhhbXBsZSwgaXQgcmV0dXJucyBNZXRob2RQYWNrYWdlIGluc3RlYWQgb2YgUHJvY2Vzc1BhY2thZ2Ugb3IgQ29udGVudFBhY2thZ2UKLQkvLyBzbyB3ZSBoYXZlIHRvIG1haW50YWluIGEgbWFwIG1hbnVhbGx5Ci0JcHJpdmF0ZSBNYXAgeG1sRUNsYXNzTWFwID0gbmV3IFRyZWVNYXAoKTsKLQkKLQkvLyBtYXAgb2YgRWNsYXMgbmFtZSB0byBFQ2xhc3Mgb2JqZWN0IGZvciB1bWEgbW9kZWwKLQlwcml2YXRlIE1hcCB1bWFFQ2xhc3NNYXAgPSBuZXcgVHJlZU1hcCgpOwotCQotCXByaXZhdGUgRmVhdHVyZU1hbmFnZXIoKSB7Ci0JCQotCQlmZWF0dXJlTmFtZU1hcC5wdXQoIk9wdGlvbmFsSW5wdXRUbyIsICJvcHRpb25hbElucHV0VG8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiUm9sZSIsICJyb2xlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoIlRhc2siLCAidGFzayIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJhY3Rpdml0eVJlZmVyZW5jZXMiLCAiYWN0aXZpdHlSZWZlcmVuY2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiYWdncmVnYXRlZFJvbGVzIiwgImFnZ3JlZ2F0ZWRSb2xlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImFzc2V0cyIsICJyZXVzYWJsZUFzc2V0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImF0dGFjaG1lbnRzIiwgImF0dGFjaG1lbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiYmFzZUNvbmZpZ3VyYXRpb25zIiwgImJhc2VDb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImJhc2VkT25Qcm9jZXNzZXMiLCAiYmFzZVByb2Nlc3MiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiYmFzZXMiLCAicmVmZXJlbmNlZE1ldGhvZFBsdWdpbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJib2R5IiwgIm1haW5EZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJicmVha2Rvd25FbGVtZW50cyIsICJicmVha2Rvd25FbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNhdGVnb3JpemVkRWxlbWVudHMiLCAiY2F0ZWdvcml6ZWRFbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNoZWNrbGlzdHMiLCAiY2hlY2tsaXN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNoaWxkUGFja2FnZXMiLCAibWV0aG9kUGFja2FnZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJjb21tdW5pY2F0aW9uc01hdGVyaWFscyIsICJjb21tdW5pY2F0aW9uc01hdGVyaWFsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNvbmNlcHRzIiwgImNvbmNlcHQsd2hpdGVwYXBlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJjb25jZXB0c0FuZFBhcGVycyIsICJjb25jZXB0LHdoaXRlcGFwZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiY29udGFpbmVkQXJ0aWZhY3RzIiwgImNvbnRhaW5lZEFydGlmYWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNvbnRlbnRFbGVtZW50cyIsICJjb250ZW50RWxlbWVudCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJjb250ZW50UmVmZXJlbmNlcyIsICJjb250ZW50UmVmZXJlbmNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNvcHlyaWdodFN0YXRlbWVudCIsICJjb3B5cmlnaHQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiZGVsaXZlcmVkV29ya1Byb2R1Y3RzIiwgImRlbGl2ZXJlZFdvcmtQcm9kdWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImRpc2NpcGxpbmVzIiwgImRpc2NpcGxpbmUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiZWR1Y2F0aW9uTWF0ZXJpYWxzIiwgImVkdWNhdGlvbk1hdGVyaWFsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImVzdGltYXRpb25Db25kZXJhdGlvbnMiLCAiZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImV4YW1wbGVzIiwgImV4YW1wbGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiZ3VpZCIsICJpZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJndWlkZWxpbmVzIiwgImd1aWRlbGluZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJob3d0b1N0YWZmIiwgImhvd1RvU3RhZmYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiaW5jbHVkZXNQYXR0ZXJucyIsICJpbmNsdWRlc1BhdHRlcm4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiaW50ZXJmYWNlcyIsICJpbnRlcmZhY2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgibGlua1RvUHJlZGVjZXNzb3IiLCAicHJlZGVjZXNzb3IiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgibWV0aG9kUGFja2FnZXMiLCAibWV0aG9kUGFja2FnZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJtZXRob2RQbHVnaW5zIiwgIm1ldGhvZFBsdWdpbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJvd25lZFJ1bGVzIiwgIm93bmVkUnVsZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiLCAibWV0aG9kQ29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJwcm9jZXNzRWxlbWVudHMiLCAicHJvY2Vzc0VsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgicHJvY2Vzc1ZpZXdzIiwgInByb2Nlc3NWaWV3Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInJlZmVyZW5jZVdvcmtmbG93cyIsICJyZWZlcmVuY2VXb3JrZmxvdyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJyZXBvcnRzIiwgInJlcG9ydCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJyZXVzYWJsZUFzc2V0cyIsICJyZXVzYWJsZUFzc2V0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInJldXNlZFBhY2thZ2VzIiwgInJldXNlZFBhY2thZ2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgicm9hZG1hcHMiLCAicm9hZG1hcCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJyb2xlU2V0cyIsICJyb2xlU2V0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInJvbGVzIiwgInJvbGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgic2VjdGlvbkRlc2NyaXB0aW9uIiwgImRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInNlY3Rpb25zIiwgInNlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgic2VsZWN0ZWRTdGVwcyIsICJzdGVwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInN1YkNhdGVnb3JpZXMiLCAic3ViQ2F0ZWdvcnkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgic3ViZGlzY2lwbGluZSIsICJzdWJEaXNjaXBsaW5lIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInN1YlByYWN0aWNlcyIsICJzdWJQcmFjdGljZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJzdWJTZWN0aW9ucyIsICJzdWJTZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInN1YmRvbWFpbnMiLCAic3ViZG9tYWluIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInN1cGVyQWN0aXZpdGllcyIsICJzdXBlckFjdGl2aXR5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInN1cHBvcnRpbmdNYXRlcmlhbHMiLCAic3VwcG9ydGluZ01hdGVyaWFsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInRhc2tzIiwgInRhc2siKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgidGVhbVJvbGVzIiwgInJvbGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgidGVtcGxhdGVzIiwgInRlbXBsYXRlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInRvb2xNZW50b3JzIiwgInRvb2xNZW50b3IiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiV29ya1Byb2R1Y3QiLCAid29ya1Byb2R1Y3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgid29ya1Byb2R1Y3RzIiwgIndvcmtQcm9kdWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInByZWQiLCAidmFsdWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQotCQl1bm5lZWRlZFJtY0ZlYXR1cmVzLmFkZCgiY29udGFpbmVyQXJ0aWZhY3QiKTsgLy8kTk9OLU5MUy0xJAotCQl1bm5lZWRlZFJtY0ZlYXR1cmVzLmFkZCgibW9kaWZpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl1bm5lZWRlZFJtY0ZlYXR1cmVzLmFkZCgicGFyZW50UGFja2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkUm1jRmVhdHVyZXMuYWRkKCJkaWFncmFtcyIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkUm1jRmVhdHVyZXMuYWRkKCJtb2RpZmllcyIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkUm1jRmVhdHVyZXMuYWRkKCJzdGVwcyIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkUm1jRmVhdHVyZXMuYWRkKCJ3b3JrZWRPbkJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJdW5uZWVkZWRSbWNGZWF0dXJlcy5hZGQoImRpYWdyYW1zIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXVubmVlZGVkWG1sRmVhdHVyZXMuYWRkKCJncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkWG1sRmVhdHVyZXMuYWRkKCJncm91cDEiKTsgLy8kTk9OLU5MUy0xJAotCQl1bm5lZWRlZFhtbEZlYXR1cmVzLmFkZCgiZ3JvdXAyIik7IC8vJE5PTi1OTFMtMSQKLQkJdW5uZWVkZWRYbWxGZWF0dXJlcy5hZGQoInByZWRlY2Vzc29yMSIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlsb2FkWG1sQ2xhc3NlcygpOwotCQlsb2FkUm1jQ2xhc3NlcygpOwotCQkKLS8vCQkvLyBwcmludCBvdXQgdGhlIEVDbGFzc2VzIGFuZCBmZWF0dXJlIG1hcCwgZm9yIHRlc3RpbmcgcHVycG9zZQotLy8JCS8vIGRvbid0IGRlbGV0ZSB0aGlzIGNvZGUgc2VnbWVudAotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09IExvYWRpbmcgRUNsYXNzZXMgZm9yIFhNTCBVbWEgbW9kZWwgPT09PT09PT09PT09PT09PT0iKTsKLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ID0geG1sRUNsYXNzTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgaXQubmV4dCgpKTsJCQkKLS8vCQl9Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotLy8KLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZmVhdHVyZU5hbWVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotLy8JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0vLwkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKWVudHJ5LmdldEtleSgpOwotLy8JCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKWVudHJ5LmdldFZhbHVlKCk7Ci0vLwkJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCApIHsKLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRmZWF0dXJlTmFtZU1hcC5wdXQoXCIiICsga2V5ICsgIlwiLCBcIiIgKyB2YWx1ZSArICJcIik7Iik7CQotLy8JCQl9Ci0vLwkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9hZFJtY0NsYXNzZXMoKSB7Ci0JCQotCQkvLyBsb2FkIEVDbGFzcyBtYXAKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENhcGFiaWxpdHlQYXR0ZXJuKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDaGVja2xpc3QoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmNlcHQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnN0cmFpbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudFBhY2thZ2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEV4YW1wbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkZWxpbmUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEl0ZXJhdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kTGlicmFyeSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNaWxlc3RvbmUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0Y29tZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFja2FnZWFibGVFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQaGFzZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGxhbm5pbmdEYXRhKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmFjdGljZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2VzcygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXBvcnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJldXNhYmxlQXNzZXQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvYWRtYXAoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3IoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVtcGxhdGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlcm1EZWZpbml0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sTWVudG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXaGl0ZXBhcGVyKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0RlZmluaXRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtPcmRlcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlKCkpOwkKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRYbWxDbGFzc2VzKCkgewotCQkKLQkJLy8gbG9hZCBFQ2xhc3MgbWFwCi0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDaGVja2xpc3QoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb3NpdGVSb2xlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uY2VwdCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnN0cmFpbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5KCkpOwotLy8JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXRlZ29yeVR5cGUoKSk7Ci0vLwkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENhdGVnb3J5VHlwZU9iamVjdCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2VzcygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lR3JvdXBpbmcoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW4oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFc3RpbWF0ZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVzdGltYXRpbmdNZXRyaWMoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGFtcGxlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGVsaW5lKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SXRlcmF0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFVuaXQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNaWxlc3RvbmUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRjb21lKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFja2FnZWFibGVFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGhhc2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQbGFubmluZ0RhdGEoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmFjdGljZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByYWN0aWNlRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXBvcnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXVzYWJsZUFzc2V0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9hZG1hcCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmcoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFzaygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZW1wbGF0ZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlcm1EZWZpbml0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2xNZW50b3IoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXaGl0ZXBhcGVyKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrRGVmaW5pdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtPcmRlcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZSgpKTsJCi0JfQotCQotCXByaXZhdGUgdm9pZCBsb2FkTW9kZWxDbGFzc2VzKE1hcCBjbGFzc01hcCwgRUNsYXNzIGNsYXp6KSB7Ci0KLQkJU3RyaW5nIG5hbWUgPSBjbGF6ei5nZXROYW1lKCk7Ci0JCWlmKCBjbGFzc01hcC5jb250YWluc0tleShuYW1lKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJY2xhc3NNYXAucHV0KG5hbWUsIGNsYXp6KTsKLQkJCQotCQkvL2ZvciAoSXRlcmF0b3IgaXQgPSBjbGF6ei5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJZm9yIChJdGVyYXRvciBlbGVtZW50cyA9IEV4dGVuZGVkTWV0YURhdGEuSU5TVEFOQ0UuZ2V0QWxsRWxlbWVudHMoY2xhenopLml0ZXJhdG9yKCk7IAotCQkJCWVsZW1lbnRzLmhhc05leHQoKTsgKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZVN0cnVjdHVyYWxGZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSllbGVtZW50cy5uZXh0KCk7Ci0JCQlFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA9IGVTdHJ1Y3R1cmFsRmVhdHVyZS5nZXRFVHlwZSgpOwotCQkJaWYgKGVDbGFzc2lmaWVyIGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpZUNsYXNzaWZpZXI7CQkJCQotCQkJCS8vIHJlY3Vyc2l2ZWx5IGZpbmQgdGhlIG5lc3RlZHQgZmVhdHVyZXMKLQkJCQlsb2FkTW9kZWxDbGFzc2VzKGNsYXNzTWFwLCBlQ2xhc3MpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNsYXp6Ci0JICogQHBhcmFtIHVtYUZlYXR1cmVOYW1lCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB4bWwgZmVhdHVyZS4KLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldFhtbEZlYXR1cmUoRUNsYXNzIGNsYXp6LCBTdHJpbmcgdW1hRmVhdHVyZU5hbWUpIHsKLQkJcmV0dXJuIGdldFhtbEZlYXR1cmUoY2xhenosIHVtYUZlYXR1cmVOYW1lLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHVtYUNsYXp6Ci0JICogQHBhcmFtIHhtbEZlYXR1cmVOYW1lCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBFU3RydWN0dXJhbEZlYXR1cmUgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Um1jRmVhdHVyZShFQ2xhc3MgdW1hQ2xhenosIFN0cmluZyB4bWxGZWF0dXJlTmFtZSkgewotCQlmb3IgKCBJdGVyYXRvciBpdCA9IHVtYUNsYXp6LmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLQkJewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKWl0Lm5leHQoKTsKLQkJCVN0cmluZyB1bWFGZWF0dXJlbmFtZSA9IGZlYXR1cmUuZ2V0TmFtZSgpOwotCQkJCi0JCQkvLyBpZiB0aGUgZmVhdHVyZSBuYW1lIGlzIHRoZSBzYW1lLCBnb3QgaXQKLQkJCWlmICggdW1hRmVhdHVyZW5hbWUuZXF1YWxzKHhtbEZlYXR1cmVOYW1lKSApIHsKLQkJCQlyZXR1cm4gZmVhdHVyZTsKLQkJCX0KLQkJCQotCQkJLy8gY2hlY2sgaWYgdGhlIGZlYXR1cmUgbmFtZSBpcyBtYXBwZWQgdG8gYW5vdGhlciB4bWwgZmVhdHVyZSBuYW1lCi0JCQlTdHJpbmcgZmVhdHVyZU5hbWUgPSAoU3RyaW5nKWZlYXR1cmVOYW1lTWFwLmdldCh1bWFGZWF0dXJlbmFtZSk7Ci0JCQlpZiAoIGZlYXR1cmVOYW1lICE9IG51bGwgKSB7Ci0JCQkJaW50IGkgPSBmZWF0dXJlTmFtZS5pbmRleE9mKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoIGkgPiAwICkgewotCQkJCQlpZiAoIGZlYXR1cmVOYW1lLnN1YnN0cmluZygwLGkpLmVxdWFscyh4bWxGZWF0dXJlTmFtZSkgfHwgCi0JCQkJCQkgZmVhdHVyZU5hbWUuc3Vic3RyaW5nKGkrMSkuZXF1YWxzKHhtbEZlYXR1cmVOYW1lKQkpIHsKLQkJCQkJCXJldHVybiBmZWF0dXJlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKCBmZWF0dXJlTmFtZS5lcXVhbHMoeG1sRmVhdHVyZU5hbWUpICkgewotCQkJCQkJcmV0dXJuIGZlYXR1cmU7Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJfQotCQl9Ci0KLQkJLy9TeXN0ZW0ub3V0LnByaW50KCJGZWF0dXJlTWFuYWdlcjogVW5hYmxlIHRvIGZpbmQgdW1hIGZlYXR1cmUgZm9yIHhtbCBmZWF0dXJlIiArIHhtbEZlYXR1cmVOYW1lKTsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gY2xhenoKLQkgKiBAcGFyYW0gdW1hRmVhdHVyZU5hbWUKLQkgKiBAcGFyYW0gb2JqZWN0VHlwZQotCSAqIEByZXR1cm4gdGhlIGNvcnJzcG9uZGluZyB4bWwgZmVhdHVyZS4KLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldFhtbEZlYXR1cmUoRUNsYXNzIGNsYXp6LCBTdHJpbmcgdW1hRmVhdHVyZU5hbWUsIFN0cmluZyBvYmplY3RUeXBlKSB7Ci0KLQkJU3RyaW5nIGZlYXR1cmVOYW1lID0gdW1hRmVhdHVyZU5hbWU7Ci0JCWlmICggZmVhdHVyZU5hbWVNYXAuY29udGFpbnNLZXkoZmVhdHVyZU5hbWUpICkgewotCQkJZmVhdHVyZU5hbWUgPSAoU3RyaW5nKWZlYXR1cmVOYW1lTWFwLmdldChmZWF0dXJlTmFtZSk7Ci0JCQkKLQkJCS8vIGlmIHRoZSBmZWF0dXJlIGlzIG5vdCB1bmlxdWUsIHVzZSB0aGUgZmlyc3Qgb25lCi0JCQlpbnQgaSA9IGZlYXR1cmVOYW1lLmluZGV4T2YoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCBpID4gMCApIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGZlYXR1cmVOYW1lLnN1YnN0cmluZygwLCBpKTsKLQkJCQlpZiAoIG9iamVjdFR5cGUgIT0gbnVsbCApIHsJCQkJCi0JCQkJCS8vIHBpY2sgdGhlIGZlYXR1cmUgYmFzZWQgb24gb2JqZWN0IHR5cGUKLQkJCQkJaWYgKCAhbmFtZS5lcXVhbHNJZ25vcmVDYXNlKG9iamVjdFR5cGUpICkgewotCQkJCQkJbmFtZSA9IGZlYXR1cmVOYW1lLnN1YnN0cmluZyhpKzEpOwotCQkJCQl9Ci0JCQkJCWlmICggIW5hbWUuZXF1YWxzSWdub3JlQ2FzZShvYmplY3RUeXBlKSApIHsKLQkJCQkJCW5hbWUgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWZlYXR1cmVOYW1lID0gbmFtZTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCBmZWF0dXJlTmFtZSA9PSBudWxsICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gY2xhenouZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKGZlYXR1cmVOYW1lKTsKLQkJaWYgKCAoZmVhdHVyZT09bnVsbCkgJiYgKGNsYXp6LmdldE5hbWUoKS5lcXVhbHMoIkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiKSkgJiYgZmVhdHVyZU5hbWUuZXF1YWxzKCJjb250ZW50RWxlbWVudCIpICkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZlYXR1cmUgPSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0NvbnRlbnRDYXRlZ29yeSgpOwotCQl9Ci0KLS8vCQlpZiAoIGZlYXR1cmUgPT0gbnVsbCApIHsKLS8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJObyB4bWwgZmVhdHVyZSAiICsgZmVhdHVyZU5hbWUgKyAiIGZvciBjbGFzcyAiICsgY2xhenouZ2V0TmFtZSgpKTsKLS8vCQl9Ci0JCQotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHVtYUVDbGFzc05hbWUKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHhtbCBlY2xhc3MKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVDbGFzcyhTdHJpbmcgdW1hRUNsYXNzTmFtZSkgewotLy8JCUVDbGFzcyByb290Q2xhc3MgPSBFeHRlbmRlZE1ldGFEYXRhLklOU1RBTkNFLmdldERvY3VtZW50Um9vdChvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRSk7Ci0vLwkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3Mpcm9vdENsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSh1bWFFQ2xhc3NOYW1lKTsKLS8vCQlyZXR1cm4gZUNsYXNzOwotCQkKLQkJRUNsYXNzIGNscyA9IChFQ2xhc3MpeG1sRUNsYXNzTWFwLmdldCh1bWFFQ2xhc3NOYW1lKTsKLS8vCQlpZiAoIGNscyA9PSBudWxsICkgewotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIHhtbCBFQ2xhc3MgZm9yIHVtYSBjbGFzcyAiICsgdW1hRUNsYXNzTmFtZSk7Ci0vLwkJfQotCQkKLQkJcmV0dXJuIGNsczsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHhtbEVDbGFzc05hbWUKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIEVDbGFzcyBvYmplY3QuCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSbWNFQ2xhc3MoU3RyaW5nIHhtbEVDbGFzc05hbWUpIHsKLQkJRUNsYXNzIGNscyA9IChFQ2xhc3MpdW1hRUNsYXNzTWFwLmdldCh4bWxFQ2xhc3NOYW1lKTsKLS8vCQlpZiAoIGNscyA9PSBudWxsICkgewotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIHVtYSBFQ2xhc3MgZm9yIHhtbCBjbGFzcyAiICsgeG1sRUNsYXNzTmFtZSk7Ci0vLwkJfQotCQkKLQkJcmV0dXJuIGNsczsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGZlYXR1cmVuYW1lCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBmZWF0dXJlIGlzIHVubmVlZGVkIGdpdmVuIGJ5IGZlYXR1cmVuYW1lLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVW5uZWVkZWRSbWNGZWF0dXJlKFN0cmluZyBmZWF0dXJlbmFtZSkgewotCQlyZXR1cm4gdW5uZWVkZWRSbWNGZWF0dXJlcy5jb250YWlucyhmZWF0dXJlbmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBmZWF0dXJlbmFtZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgeG1sIGZlYXR1cmUgaXMgdW5uZWVkZWQgZ2l2ZW4gYnkgZmVhdHVyZW5hbWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVbm5lZWRlZFhtbEZlYXR1cmUoU3RyaW5nIGZlYXR1cmVuYW1lKSB7Ci0JCXJldHVybiB1bm5lZWRlZFhtbEZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmVuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogUHJpbnRzIHRoZSBmZWF0dXJlLW5hbWUgbWFwLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50RmVhdHVyZU5hbWVNYXBwaW5nKCkgewotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcnRpZmFjdCgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcnRpZmFjdCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNoZWNrbGlzdCgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDaGVja2xpc3QoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb21wb3NpdGVSb2xlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbXBvc2l0ZVJvbGUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25jZXB0KCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbmNlcHQoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudFBhY2thZ2UoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudFBhY2thZ2UoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDdXN0b21DYXRlZ29yeSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDdXN0b21DYXRlZ29yeSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJhYmxlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJhYmxlKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJ5UHJvY2VzcygpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzY2lwbGluZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEb21haW4oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRG9tYWluKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUV4YW1wbGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXhhbXBsZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUd1aWRlbGluZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkZWxpbmUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJdGVyYXRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSXRlcmF0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kTGlicmFyeSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RMaWJyYXJ5KCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFBsdWdpbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1pbGVzdG9uZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNaWxlc3RvbmUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVPdXRjb21lKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU91dGNvbWUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQaGFzZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQaGFzZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBsYW5uaW5nRGF0YSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQbGFubmluZ0RhdGEoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmFjdGljZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmFjdGljZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NDb21wb25lbnQoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVwb3J0KCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlcG9ydCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJldXNhYmxlQXNzZXQoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmV1c2FibGVBc3NldCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvYWRtYXAoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9hZG1hcCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRvcigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRvcigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVTZXQoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZVNldCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVTZXRHcm91cGluZygpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlU2V0R3JvdXBpbmcoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZWN0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlY3Rpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFzaygpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza0Rlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tEZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVhbVByb2ZpbGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVhbVByb2ZpbGUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZW1wbGF0ZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZW1wbGF0ZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRlcm1EZWZpbml0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRlcm1EZWZpbml0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVG9vbCgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUb29sKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVG9vbE1lbnRvcigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUb29sTWVudG9yKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2hpdGVwYXBlcigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXaGl0ZXBhcGVyKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya09yZGVyKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtPcmRlcigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdFR5cGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCkpOwotLy8JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlKCkpOwotLy8JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlKCkpOwotCi0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIHByaW50RmVhdHVyZShFT2JqZWN0IG9iajEsIEVPYmplY3Qgb2JqMikgewotCQlMaXN0IG1hdGNoZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgdW5tYXRjaGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHVtYUZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQotCQlFTGlzdCBmZWF0dXJlcyA9IG9iajEuZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQlmb3IgKCBJdGVyYXRvciBpdCA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpaXQubmV4dCgpOwotCQkJU3RyaW5nIG5hbWUgPSBmZWF0dXJlLmdldE5hbWUoKTsKLQkJCWlmICggZmVhdHVyZU5hbWVNYXAuY29udGFpbnNLZXkobmFtZSkgKSB7Ci0JCQkJU3RyaW5nIHhtbF9uYW1lID0gKFN0cmluZykgZmVhdHVyZU5hbWVNYXAuZ2V0KG5hbWUpOwotCQkJCWludCBpbmR4ID0geG1sX25hbWUuaW5kZXhPZigiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKCBpbmR4ID4gMCApIHsKLQkJCQkJbWF0Y2hlZC5hZGQoeG1sX25hbWUuc3Vic3RyaW5nKDAsIGluZHgpKTsKLQkJCQkJbWF0Y2hlZC5hZGQoeG1sX25hbWUuc3Vic3RyaW5nKGluZHgrMSkudHJpbSgpKTsJCQkJCQotCQkJCX0KLQkJCQllbHNlIGlmICggIW1hdGNoZWQuY29udGFpbnMoeG1sX25hbWUpICkgewotCQkJCQltYXRjaGVkLmFkZCh4bWxfbmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoIXVubmVlZGVkUm1jRmVhdHVyZXMuY29udGFpbnMobmFtZSkgJiYgIXVtYUZlYXR1cmVzLmNvbnRhaW5zKG5hbWUpICkgewotCQkJCXVtYUZlYXR1cmVzLmFkZChuYW1lKTsKLQkJCX0KLQkJfQkJCQotCQkKLQkJZmVhdHVyZXMgPSBvYmoyLmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKWl0Lm5leHQoKTsKLQkJCVN0cmluZyBuYW1lID0gZmVhdHVyZS5nZXROYW1lKCk7Ci0JCQlpZiAoIHVtYUZlYXR1cmVzLmNvbnRhaW5zKG5hbWUpICkgewotCQkJCXVtYUZlYXR1cmVzLnJlbW92ZShuYW1lKTsKLQkJCX0gZWxzZSBpZiAoIXVubmVlZGVkWG1sRmVhdHVyZXMuY29udGFpbnMobmFtZSkgJiYgIW1hdGNoZWQuY29udGFpbnMobmFtZSkgJiYgIXVubWF0Y2hlZC5jb250YWlucyhuYW1lKSApIHsKLQkJCQl1bm1hdGNoZWQuYWRkKG5hbWUpOwotCQkJfQotCQl9CQotCQkKLQkJaWYgKCB1bWFGZWF0dXJlcy5zaXplKCkgKyB1bm1hdGNoZWQuc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT0gdW4tbWF0Y2hlZCBmZWF0dXJlcyBmb3IgIiArIG9iajEuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIiA9PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gdW1hRmVhdHVyZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBuYW1lID0gKFN0cmluZylpdC5uZXh0KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0ZmVhdHVyZU5hbWVNYXAucHV0KFwiIiArIG5hbWUgKyAiXCIsIFwiXCIpOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKG5hbWUpOwotCQl9Ci0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gdW5tYXRjaGVkLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpaXQubmV4dCgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IiArIG5hbWUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOyAvLyROT04tTkxTLTEkCi0JCQotCX0KLQkKLS8vCXB1YmxpYyBjbGFzcyBGZWF0dXJlTWFwIHsKLS8vCQlwcml2YXRlIE1hcCBmZWF0dXJlTWFwID0gbmV3IEhhc2hNYXAoKTsKLS8vCQkKLS8vCQlGZWF0dXJlTWFwKEVDbGFzcyBjbGF6eikgewotLy8JCQlFTGlzdCBmZWF0dXJlcyA9IGNsYXp6LmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLS8vCQkJZm9yICggSXRlcmF0b3IgaXQgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotLy8JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKWl0Lm5leHQoKTsKLS8vCQkJCWZlYXR1cmVNYXAucHV0KGZlYXR1cmUuZ2V0TmFtZSgpLCBmZWF0dXJlKTsKLS8vCQkJfQkJCQotLy8JCX0KLS8vCQkKLS8vCQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0vLwkJCXJldHVybiAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlTWFwLmdldChmZWF0dXJlTmFtZSk7CQkJCi0vLwkJfQotLy8JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvWE1MTGlicmFyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvWE1MTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYzBhOTIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL1hNTExpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5Db250ZW50UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5JTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWwuVW1hUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGNvbW1vbmouc2RvLlR5cGU7Ci0KLS8qKgotICogWG1sTGlicmFyeSByZXByZXNlbnRzIGEgbWV0aG9kIGxpYnJhcnkgbG9hZGVkIGZyb20gYSBzcGVjaWZpZWQgeG1sIGZpbGUgVGhlCi0gKiB4bWwgZmlsZSBzaG91bGQgYmUgdmFsaWQgdG8gdGhlIHhtbCBzY2hlbWEgZm9yIE1ldGhvZExpYnJhcnkKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjIxNTMKLSAqLwotcHVibGljIGNsYXNzIFhNTExpYnJhcnkgewotCi0JcHJpdmF0ZSBTdHJpbmcgZmlsZVBhdGg7Ci0KLQlwcml2YXRlIElMb2dnZXIgbG9nZ2VyOwotCi0JcHJpdmF0ZSBDb250ZW50UHJvY2Vzc29yIGNvbnRlbnRQcm9jID0gbnVsbDsKLQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSByb290T2JqZWN0OwotCi0JLy8gbWFwIG9mIGNvbnRlbnQgY2F0ZWdvcnkgcGFja2FnZSBmb3IgZWFjaCBwbHVnaW4gaWQKLQlwcml2YXRlIE1hcCBjb250ZW50Q2F0ZWdvcnlQa2dNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gbWFwIG9mIGNyZWF0ZWQgZWxlbWVudHMsIGd1aWQgLSBFRGF0YU9iamVjdAotCXByaXZhdGUgTWFwIGVsZW1lbnRzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFhNTExpYnJhcnkoQ29udGVudFByb2Nlc3NvciBjb250ZW50UHJvYywgSUxvZ2dlciBsb2dnZXIsCi0JCQlTdHJpbmcgZmlsZVBhdGgpIHsKLQkJdGhpcy5jb250ZW50UHJvYyA9IGNvbnRlbnRQcm9jOwotCQl0aGlzLmxvZ2dlciA9IGxvZ2dlcjsKLQkJdGhpcy5maWxlUGF0aCA9IGZpbGVQYXRoOwotCi0JfQotCi0JLyoqCi0JICogQHJldHVybiByb290IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgZ2V0Um9vdCgpIHsKLQkJcmV0dXJuIHRoaXMucm9vdE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGZpbGUgcGF0aCBzdHJpbmcuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlUGF0aCgpIHsKLQkJcmV0dXJuIHRoaXMuZmlsZVBhdGg7Ci0JfQotCi0JLyoqCi0JICogZ2V0IGFuIGFycmF5IG9mIHBsdWdpbiBpZHMgaW4gdGhlIGxpYnJhcnkKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFBsdWdpbklkcygpIHsKLQkJTGlzdCBwbHVnaW5zID0gcm9vdE9iamVjdC5nZXRNZXRob2RQbHVnaW4oKTsKLQkJU3RyaW5nW10gaWRzID0gbmV3IFN0cmluZ1twbHVnaW5zLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJaWRzW2ldID0gKChNZXRob2RQbHVnaW4pIHBsdWdpbnMuZ2V0KGkpKS5nZXRJZCgpOwotCQl9Ci0KLQkJcmV0dXJuIGlkczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gYSBuZXcgWE1MIGxpYnJhcnkuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGNyZWF0ZUxpYnJhcnkoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotCi0JCU1ldGhvZExpYnJhcnkgcm9vdCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZExpYnJhcnkoKTsKLQkJU3RyaW5nIHZlcnNpb24gPSAiIjsJCQkJCQkJCS8vJE5PTi1OTFMtMSQJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IFZlcnNpb25VdGlsLmdldEFsbFRvb2xJRHMoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHRvb2xJRCA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgdG9vbFZlcnNpb24gPSBWZXJzaW9uVXRpbC5nZXRWZXJzaW9ucyh0b29sSUQpLmdldE1pblRvb2xWZXJzaW9uRm9yQ3VycmVudFhNTFNjaGVtYVZlcnNpb24oKS5nZXRUb29sVmVyc2lvbigpLnRvU3RyaW5nKCk7Ci0JCQlpZiAodmVyc2lvbi5sZW5ndGgoKSA+IDApIHsKLQkJCQl2ZXJzaW9uICs9IFZlcnNpb25VdGlsLlhNTF9WRVJTSU9OU19TRVBBUkFUT1I7Ci0JCQl9Ci0JCQl2ZXJzaW9uICs9IHRvb2xJRCArIFZlcnNpb25VdGlsLlhNTF9UT09MX1ZFUlNJT05fU0VQQVJBVE9SICsgdG9vbFZlcnNpb247CQkKLQkJfQotCQlpZiAodmVyc2lvbi5sZW5ndGgoKSA+IDApIHsKLQkJCXJvb3Quc2V0VG9vbCh2ZXJzaW9uKTsKLQkJfQotCQlyZXR1cm4gY3JlYXRlKGlkLCBuYW1lLCByb290KTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgeG1sIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgbG9hZCgpIHsKLQkJdHJ5IHsKLQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotCi0JCQkvLyBHZXQgdGhlIFVSSSBvZiB0aGUgbW9kZWwgZmlsZS4KLQkJCS8vCi0JCQlVUkkgZmlsZVVSSSA9IFVSSS5jcmVhdGVGaWxlVVJJKChuZXcgRmlsZSh0aGlzLmZpbGVQYXRoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0JCQkvLyBDcmVhdGUgYSByZXNvdXJjZSBmb3IgdGhpcyBmaWxlLgotCQkJLy8KLQkJCS8vIFJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoZmlsZVVSSSk7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBVbWFSZXNvdXJjZUZhY3RvcnlJbXBsKCkKLQkJCQkJLmNyZWF0ZVJlc291cmNlKGZpbGVVUkkpOwotCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc291cmNlKTsKLQotCQkJcmVzb3VyY2UubG9hZChuZXcgSGFzaE1hcCgpKTsKLQotCQkJLy8gUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShmaWxlVVJJLCBmYWxzZSk7Ci0KLQkJCS8vIEVDbGFzcyBlQ2xhc3MgPQotCQkJLy8gRXh0ZW5kZWRNZXRhRGF0YS5JTlNUQU5DRS5nZXREb2N1bWVudFJvb3QodW1hUGFja2FnZSk7Ci0KLQkJCURvY3VtZW50Um9vdCByb290ID0gKERvY3VtZW50Um9vdCkgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHJvb3QuZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgbyA9IGl0ci5uZXh0KCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJCXRoaXMucm9vdE9iamVjdCA9IChNZXRob2RMaWJyYXJ5KSBvOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgbG9hZGVkIik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcihOTFMuYmluZCgKLQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfZXJyb3JfbG9hZF94bWwsIGZpbGVQYXRoKSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgdGhlIGxpYnJhcnkgYW5kIHJldHVybiB0aGUgcm9vdCBvYmplY3QKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVBhdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGNyZWF0ZShTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBNZXRob2RFbGVtZW50IHJvb3QpIHsKLQotCQkvLyBDcmVhdGUgYSByZXNvdXJjZSBzZXQKLQkJLy8KLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0KLQkJLy8gR2V0IHRoZSBVUkkgb2YgdGhlIG1vZGVsIGZpbGUuCi0JCS8vCi0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRoaXMuZmlsZVBhdGgpOwotCQlVUkkgZmlsZVVSSSA9IFVSSS5jcmVhdGVGaWxlVVJJKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0JCS8vIENyZWF0ZSBhIHJlc291cmNlIGZvciB0aGlzIGZpbGUuCi0JCS8vCi0JCS8vIFJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoZmlsZVVSSSk7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbmV3IFVtYVJlc291cmNlRmFjdG9yeUltcGwoKQotCQkJCS5jcmVhdGVSZXNvdXJjZShmaWxlVVJJKTsKLQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc291cmNlKTsKLQotCQkvLyBBZGQgdGhlIGluaXRpYWwgbW9kZWwgb2JqZWN0IHRvIHRoZSBjb250ZW50cy4KLQkJLy8gcm9vdC5zZXRJZChpZCk7Ci0JCS8vIHJvb3Quc2V0TmFtZShuYW1lKTsKLQotCQlzZXRFbGVtZW50KGlkLCByb290KTsKLQotCQkvLyB0aGlzLnJvb3RPYmplY3QgPSByb290OwotCQlpZiAocm9vdCAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChyb290KTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlvcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRU5DT0RJTkcsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXNvdXJjZS5zYXZlKG9wdGlvbnMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJaWYgKHJvb3QgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQl0aGlzLnJvb3RPYmplY3QgPSAoTWV0aG9kTGlicmFyeSkgcm9vdDsKLQkJfQotCi0JCXJldHVybiB0aGlzLnJvb3RPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBsdWdpbklkCi0JICogQHJldHVybiBhIGNvbnRlbnQgY2F0ZXJnb3J5IHBhY2thZ2UgaW4gdGhlIHBsdWdpbiBnaXZlbiBieSBwbHVnaW5JZC4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZShTdHJpbmcgcGx1Z2luSWQpIHsKLQotCQlDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIHBrZyA9IChDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKSBjb250ZW50Q2F0ZWdvcnlQa2dNYXAKLQkJCQkuZ2V0KHBsdWdpbklkKTsKLQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGtnOwotCQl9Ci0KLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGdldEVsZW1lbnQocGx1Z2luSWQpOwotCQlpZiAocGx1Z2luID09IG51bGwpIHsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKEV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X25vX3BsdWdpbiwKLQkJCQkJcGx1Z2luSWQpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudENhdGVnb3J5UGFja2FnZSgpOwotCQlwa2cuc2V0TmFtZSgiQ29udGVudENhdGVnb3JpZXMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXNldEVsZW1lbnQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpLCBwa2cpOwotCi0JCXBsdWdpbi5nZXRNZXRob2RQYWNrYWdlKCkuYWRkKHBrZyk7Ci0KLQkJY29udGVudENhdGVnb3J5UGtnTWFwLnB1dChwbHVnaW5JZCwgcGtnKTsKLQkJcmV0dXJuIHBrZzsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgeG1sIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBTYXZlIHRoZSBjb250ZW50cyBvZiB0aGUgcmVzb3VyY2UgdG8gdGhlIGZpbGUgc3lzdGVtLgotCQkvLwotCQlNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCW9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByb290T2JqZWN0LmVSZXNvdXJjZSgpOwotCQlyZXNvdXJjZS5zYXZlKG9wdGlvbnMpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHJvb3Qgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBvcGVuKCkgewotCQlyZXR1cm4gcm9vdE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZ3VpZAotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgYmFzZSBsaWJyYXJ5IGVsZW1lbnQuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGdldEVsZW1lbnQoU3RyaW5nIGd1aWQpIHsKLQkJcmV0dXJuIChFRGF0YU9iamVjdCkgZWxlbWVudHNNYXAuZ2V0KGd1aWQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGJhc2UgbGlicmFyeSBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBnZXRFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRFbGVtZW50KCgoTWV0aG9kRWxlbWVudCkgb2JqKS5nZXRJZCgpKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCQotCS8qKgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuIGVsbWVuZW50IGlkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRJZChFRGF0YU9iamVjdCBvYmopIHsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudCkgb2JqKS5nZXRJZCgpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtPcmRlcikgewotCQkJcmV0dXJuICgoV29ya09yZGVyKSBvYmopLmdldElkKCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RWxlbWVudChTdHJpbmcgZ3VpZCwgRURhdGFPYmplY3Qgb2JqKSB7Ci0JCS8vIGFkZEVsZW1lbnRUb0NvbnRhaW5lcihjb250YWluZXIsIG9iaik7Ci0JCWlmICghZWxlbWVudHNNYXAuY29udGFpbnNLZXkoZ3VpZCkpIHsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnQpIG9iaikuc2V0SWQoZ3VpZCk7Ci0JCQl9Ci0KLQkJCWVsZW1lbnRzTWFwLnB1dChndWlkLCBvYmopOwotCQl9Ci0JfQotCi0JLy8gcHJpdmF0ZSB2b2lkIGFkZEVsZW1lbnRUb0NvbnRhaW5lcihFRGF0YU9iamVjdCBjb250YWluZXIsIEVEYXRhT2JqZWN0Ci0JLy8gY2hpbGQpIHsKLQkvLwkJCi0JLy8gdHJ5IHsKLQkvLyBpZiAoIGNvbnRhaW5lciA9PSBudWxsICkgewotCS8vIHJldHVybjsKLQkvLyB9Ci0JLy8JCQkKLQkvLyBpZiAoIGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSB8fCBjaGlsZCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fAotCS8vIGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSApIHsKLQkvLyByZXR1cm47Ci0JLy8gfQotCS8vCQkJCi0JLy8gd2hpbGUgKCAhKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpICYmIChjb250YWluZXIgIT0gbnVsbCkgKSB7Ci0JLy8gY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsKLQkvLyB9Ci0JLy8JCQkKLQkvLyBpZiAoIGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlICkgewotCS8vICgoQ29udGVudFBhY2thZ2UpY29udGFpbmVyKS5nZXRDb250ZW50RWxlbWVudCgpLmFkZChjaGlsZCk7Ci0JLy8gfSBlbHNlIGlmICggY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UgKSB7Ci0JLy8gKChQcm9jZXNzUGFja2FnZSljb250YWluZXIpLmdldFByb2Nlc3NFbGVtZW50KCkuYWRkKGNoaWxkKTsKLQkvLyB9IGVsc2UgewotCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRG9uJ3Qga25vdyBob3cgdG8gc2V0IGVsZW1lbnQgIiArIGNoaWxkKTsKLQkvLyB9Ci0JLy8gfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JLy8gLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JLy8gfQotCS8vIH0KLQotCS8qKgotCSAqIGNyZWF0ZSBhIGNoaWxkIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGd1aWQKLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmVyCi0JICogICAgICAgICAgICBjb250YWluZXIgb2YgdGhlIGVsZW1lbnQgdG8gYmUgY3JlYXRlZAotCSAqIEBwYXJhbSB1bWFGZWF0dXJlTmFtZQotCSAqICAgICAgICAgICAgdW1hIGZlYXR1cmUgZm9yIHRoZSBlbGVtZW50IHRvIGJlIGNyZWF0ZWQKLQkgKiBAcGFyYW0gdW1hRUNsYXNzTmFtZQotCSAqICAgICAgICAgICAgdW1hIEVDbGFzcyBuYW1lIGZvciB0aGUgZmVhdHVyZQotCSAqIEBwYXJhbSB1bWFFbGVtZW50VHlwZQotCSAqICAgICAgICAgICAgdW1hIGVsZW1lbnQgdHlwZSBmb3IgdGhlIGVsZW1lbnQgdG8gYmUgY3JlYXRlZAotCSAqIEBwYXJhbSBndWlkCi0JICogICAgICAgICAgICBndWlkIG9mIHRoZSBlbGVtZW50IHRvIGJlIGNyZWF0ZWQKLQkgKiBAcmV0dXJuIEVEYXRhT2JqZWN0IHRoZSBYbWwgdW1hIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgY3JlYXRlRWxlbWVudChFRGF0YU9iamVjdCBjb250YWluZXIsCi0JCQlTdHJpbmcgdW1hRmVhdHVyZU5hbWUsIFN0cmluZyB1bWFFQ2xhc3NOYW1lLCBTdHJpbmcgdW1hRWxlbWVudFR5cGUsCi0JCQlTdHJpbmcgZ3VpZCkgewotCi0JCUVEYXRhT2JqZWN0IG9iaiA9IGdldEVsZW1lbnQoZ3VpZCk7Ci0JCWlmIChvYmogPT0gbnVsbCkgewotCQkJaWYgKEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmlzVW5uZWVkZWRSbWNGZWF0dXJlKHVtYUZlYXR1cmVOYW1lKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRYbWxGZWF0dXJlKAotCQkJCQljb250YWluZXIuZUNsYXNzKCksIHVtYUZlYXR1cmVOYW1lLCB1bWFFbGVtZW50VHlwZSk7Ci0JCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoCi0JCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9ub19mZWF0dXJlLCBjb250YWluZXIKLQkJCQkJCQkJLmVDbGFzcygpLmdldE5hbWUoKSwgdW1hRmVhdHVyZU5hbWUpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gaWYgKCAhKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSApIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgY3JlYXRpbmcgZWxlbWVudDogY29udGFpbm1lbnQgZmVhdHVyZQotCQkJLy8gc2hvdWxkIGJlIEVSZWZlcmVuY2UgdHlwZS4gIiArIGZlYXR1cmUuZ2V0TmFtZSgpKTsKLQkJCS8vIC8vcmV0dXJuIG51bGw7Ci0JCQkvLyB9Ci0KLQkJCS8vIC8vIHRoaXMgaXMgYW4gZWFzaWVyIHdheSwgdGVzdCBpdCwKLQkJCS8vIC8vIGRvZXMgbm90IHdvcmsgc2luY2UgZmVhdHVyZS5nZXRFVHlwZSgpIHJldHVybnMgdGhlIGJhc2UKLQkJCS8vIGVsZW1lbnQgdHlwZSwgbm90IHRoZSBleHRlbmRlZCBvbmUKLQkJCS8vIC8vIGZvciBleGFtcGxlLCBpdCByZXR1cm5zIE1ldGhvZFBhY2thZ2UgaW5zdGVhZCBvZgotCQkJLy8gUHJvY2Vzc1BhY2thZ2Ugb3IgQ29udGVudFBhY2thZ2UKLQkJCS8vIC8vIHNvIHdlIG5lZWQgdG8gbWFrZSBvdXIgb3duIG1hcAotCQkJLy8gRUNsYXNzaWZpZXIgYyA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJCS8vIGlmICggIWMuZ2V0TmFtZSgpLmVxdWFscyh1bWFFQ2xhc3NOYW1lKSApIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRUNsYXNzIG5hbWUgbm90IG1hdGNoOiAiICsgYy5nZXROYW1lKCkgKyAiCi0JCQkvLyAtLS0gIiArIHVtYUVDbGFzc05hbWUpOwotCQkJLy8gfQotCi0JCQlFQ2xhc3Mgb2JqQ2xhc3MgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRQotCQkJCQkuZ2V0WG1sRUNsYXNzKHVtYUVDbGFzc05hbWUpOwotCQkJaWYgKG9iakNsYXNzID09IG51bGwpIHsKLQkJCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZCgKLQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X25vX2NsYXNzLCB1bWFFQ2xhc3NOYW1lKSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCW9iaiA9IChFRGF0YU9iamVjdCkgRWNvcmVVdGlsLmNyZWF0ZShvYmpDbGFzcyk7Ci0JCQlzZXRFbGVtZW50KGd1aWQsIG9iaik7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkJCQkvLyBXb3JrT3JkZXIgaXMgbm90IGNvbnRhaW5lZCBpbiBhIHByb2Nlc3NQYWNrYWdlIGluIHhtbCBtb2RlbAotCQkJCS8vIGl0J3MgY29udGFpbmVkIGJ5IHRoZSBicmVha2Rvd25FbGVtZW50Ci0JCQkJLy8gc28gd2Ugc2F2ZSB0aGUgZWxlbWVudCBpZC1vYmplY3QgdG8gdGhlIG1hcCBhbmQgY29udGludWUKLQkJCQkvLyBkb24ndCBzZXQgdGhlIGZlYXR1cmUgdmFsdWUKLQkJCQkKLQkJCQkvLyB0aGUgd29ya09yZGVyIGluIEVQRiBVTUEgbW9kZWwgaXMgcmVmZXJlbmNlZCBieSBmZWF0dXJlCi0JCQkJLy8gV29ya0JyZWFrRG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IsCi0JCQkJLy8gdGhlIGNvcnJlc3BvbmRpbmcgZmVhdHVyZSBpbiB0aGUgeG1sIG1vZGVsIGlzIAotCQkJCS8vIFdvcmtCcmVha0Rvd25FbGVtZW50X1ByZWRlY2Vzc29yLCAKLQkJCQkvLyB0aGUgZmVhdHVyZSB2YWx1ZSBpcyBhIGxpc3Qgb2YgZ3VpZCBvZiB0aGUgV29ya09yZGVycwotCQkJCS8vIHdoZW4gdGhpcyBmZWF0dXJlIHZhbHVlIGlzIHNldCBpbiB0aGUgc2V0UmVmZXJlbmNlVmFsdWUoKSBjYWxsCi0JCQkJLy8gZ2V0IHRoZSBYbWxVbWEgb2JqZWN0LCBpZiBpdCdzIFdvcmtPcmRlciwgCi0JCQkJLy8gYWRkIHRvIHRoZSBjdXJyZW50IHdvcmtvcmRlciB0byB0aGUgV29ya0JyZWFrRG93bkVsZW1lbnQKLQkJCQkvLyBKaW5odWEgWGksIDA4LzI0LzIwMDYKLQkJCQlyZXR1cm4gb2JqOwotCQkJfQotCi0JCQkvLyBub3RlOiBhbGwgZWxlbWVudCByZWZlcmVuY2VzIGFyZSBzdHJpbmcgdHlwZSAoaWQpCi0JCQkvLyBwYWNrYWdlIHJlZmVyZW5jZXMgYXJlIG9iamVjdCByZWZlcmVuY2VzCi0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUxpc3QgdmFsdWVzID0gKExpc3QpIGNvbnRhaW5lci5lR2V0KGZlYXR1cmUpOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgewotCQkJCQkJdmFsdWVzLmFkZChndWlkKTsKLQotCQkJCQkJLy8gbmVlZCB0byBwdXQgdGhlIG9iamVjdCBpbiBhIGNvbnRhaW5lcgotCQkJCQkJLy8gZm9yIGV4YW1wbGUsIHRoZSBDb250YWllZEFydGlmYWN0cwotCQkJCQkJYWRkVG9Db250YWluZXIoY29udGFpbmVyLCBvYmopOwotCi0JCQkJCX0gZWxzZSBpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWVzLmFkZChvYmopOwotCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlsb2dnZXIKLQkJCQkJCQkJLmxvZ1dhcm5pbmcoTkxTCi0JCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudCwKLQkJCQkJCQkJCQkJCWZlYXR1cmUuZ2V0TmFtZSgpKSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKE5MUy5iaW5kKAotCQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZSwgb2JqLAotCQkJCQkJCWNvbnRhaW5lciksIGUpOwotCQkJCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSB7Ci0JCQkJCWNvbnRhaW5lci5lU2V0KGZlYXR1cmUsIGd1aWQpOwotCQkJCQlhZGRUb0NvbnRhaW5lcihjb250YWluZXIsIG9iaik7Ci0JCQkJfSBlbHNlIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgewotCQkJCQljb250YWluZXIuZVNldChmZWF0dXJlLCBvYmopOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKAotCQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50LAotCQkJCQkJCWZlYXR1cmUuZ2V0TmFtZSgpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG9iajsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVG9Db250YWluZXIoRU9iamVjdCBjb250YWluZXIsIEVPYmplY3Qgb2JqKSB7Ci0KLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkoKENvbnRlbnRQYWNrYWdlKSBjb250YWluZXIpLmdldENvbnRlbnRFbGVtZW50KCkuYWRkKG9iaik7Ci0JCX0gZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCSgoUHJvY2Vzc1BhY2thZ2UpIGNvbnRhaW5lcikuZ2V0UHJvY2Vzc0VsZW1lbnQoKS5hZGQob2JqKTsKLQkJCS8vIH0gZWxzZSBpZiAoIChvYmogaW5zdGFuY2VvZiBDb25zdHJhaW50KSAmJiAoY29udGFpbmVyIGluc3RhbmNlb2YKLQkJCS8vIE1ldGhvZEVsZW1lbnQpICkgewotCQkJLy8gLy8gdGhlIG93bmVyIHJ1bGUgc2hvdWxkIGJlIGEgY29udGFpbm1lbnQgMC4ubiBmZWF0dXJlLCB3YWl0aW5nCi0JCQkvLyBmb3IgbW9kZWwgZml4Ci0JCQkvLyAvLygoTWV0aG9kRWxlbWVudCljb250YWluZXIpLnNldE8KLQkJfSBlbHNlIHsKLQkJCWFkZFRvQ29udGFpbmVyKGNvbnRhaW5lci5lQ29udGFpbmVyKCksIG9iaik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGF0dHJpYnV0ZSBmZWF0dXJlIHZhbHVlLgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gZmVhdHVyZU5hbWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0cmlidXRlRmVhdHVyZVZhbHVlKEVEYXRhT2JqZWN0IG9iaiwgU3RyaW5nIGZlYXR1cmVOYW1lLAotCQkJT2JqZWN0IHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG9iaiA9PSBudWxsIHx8IGZlYXR1cmVOYW1lID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCB8fCB2YWx1ZSBpbnN0YW5jZW9mIEVEYXRhT2JqZWN0KSB7Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZCgKLQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfaW52YWxpZF9mZWF0dXJlX3ZhbHVlLAotCQkJCQlmZWF0dXJlTmFtZSwgdmFsdWUpKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZmluZCB0aGUgZmVhdHVyZSBhbmQgc2V0IHRoZSB2YWx1ZQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFhtbEZlYXR1cmUob2JqCi0JCQkJLmVDbGFzcygpLCBmZWF0dXJlTmFtZSk7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQotCQkJLy8gaWdub3JlIG1pc3NpbmcgZmVhdHVyZXMgZm9yIFdvcmtPcmRlcgotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgV29ya09yZGVyKSkgewotCQkJCU9iamVjdFtdIHBhcmFzID0gbmV3IE9iamVjdFtdIHsgZmVhdHVyZU5hbWUsIG9iaiwgdmFsdWUgfTsKLQkJCQlsb2dnZXIKLQkJCQkJCS5sb2dXYXJuaW5nKE5MUwotCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMiwKLQkJCQkJCQkJCQlwYXJhcykpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gMTU4Njg4IC0gTWlzc2luZyB0ZW1wbGF0ZSBmaWxlcyBpbiBleHBvcnRlZCB4bWwgbGlicmFyeQotCQkvLyBwcm9jZXNzIHRoZSBhdHRhY2htZW50IHVybAotCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50KCkgKSB7Ci0JCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7Ci0JCQkJdmFsdWUgPSBjb250ZW50UHJvYy5yZXNvbHZlQXR0YWNobWVudFJlc291cmNlcyhvYmosIHZhbHVlLnRvU3RyaW5nKCkudHJpbSgpKTsKLQkJCX0KLQkJCW9iai5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJfQotCQkKLQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSB7Ci0JCQl0cnkgewotCQkJCWlmIChmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoInZhcmlhYmlsaXR5VHlwZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsdWUgPSBWYXJpYWJpbGl0eVR5cGUuZ2V0KHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJCX0gZWxzZSBpZiAoZmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJsaW5rVHlwZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsdWUgPSBXb3JrT3JkZXJUeXBlLmdldCh2YWx1ZS50b1N0cmluZygpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgamF2YS51dGlsLkRhdGUpIHsKLQkJCQkJLy8gY29udmVydCBqYXZhLnV0aWwuRGF0ZSB0byB4bWwgRGF0ZQotCQkJCQl2YWx1ZSA9IGdldFhtbERhdGUoKGphdmEudXRpbC5EYXRlKSB2YWx1ZSk7Ci0JCQkJfSBlbHNlIGlmICgoY29udGVudFByb2MgIT0gbnVsbCkKLQkJCQkJCSYmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KQotCQkJCQkJJiYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCQl2YWx1ZSA9IGNvbnRlbnRQcm9jLnJlc29sdmVSZXNvdXJjZUZpbGVzKAotCQkJCQkJCShNZXRob2RFbGVtZW50KSBvYmosIChTdHJpbmcpIHZhbHVlKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgamF2YS5uZXQuVVJJKSB7Ci0JCQkJCXZhbHVlID0gKChqYXZhLm5ldC5VUkkpIHZhbHVlKS5nZXRQYXRoKCk7Ci0JCQkJCWlmIChjb250ZW50UHJvYyAhPSBudWxsKSB7Ci0JCQkJCQljb250ZW50UHJvYy5jb3B5UmVzb3VyY2UoKFN0cmluZykgdmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCW9iai5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCU9iamVjdFtdIHBhcmFzID0gbmV3IE9iamVjdFtdIHsgZmVhdHVyZU5hbWUsIG9iaiwgdmFsdWUgfTsKLQkJCQlsb2dnZXIKLQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJTkxTCi0JCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMiwKLQkJCQkJCQkJCQkJCXBhcmFzKSwgZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgaWQgcmVmZXJlbmNlcyBmb3IgdGhlIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIEVEYXRhT2JqZWN0IHRoZSBvYmplY3QKLQkgKiBAcGFyYW0gZmVhdHVyZU5hbWUKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgZmVhdHVyZSBvZiB0aGUgb2JqZWN0Ci0JICogQHBhcmFtIGlkVmFsdWUKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgaWQgcmVmZXJlbmNlIHZhbHVlIG9mIHRoZSBmZWF0dXJlCi0JICogQHBhcmFtIHZhbHVlVHlwZQotCSAqICAgICAgICAgICAgVHlwZSB0aGUgb2JqZWN0IHR5cGUgb2YgdGhlIHJlZmVyZW5jZS4gTmVlZCB0byBoYXZlIHRoaXMgdG8KLQkgKiAgICAgICAgICAgIGRldGVybWluZSB0aGUgeG1sIGZlYXR1cmUgaW4gY2FzZSB0aGUgZmVhdHVyZSBtYXBwdGluZyBpcyBub3QKLQkgKiAgICAgICAgICAgIHVuaXF1ZQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlVmFsdWUoRURhdGFPYmplY3Qgb2JqLCBTdHJpbmcgZmVhdHVyZU5hbWUsCi0JCQlTdHJpbmcgaWRWYWx1ZSwgVHlwZSB2YWx1ZVR5cGUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAob2JqID09IG51bGwgfHwgZmVhdHVyZU5hbWUgPT0gbnVsbCB8fCBpZFZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5pc1VubmVlZGVkUm1jRmVhdHVyZShmZWF0dXJlTmFtZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGZpbmQgdGhlIGZlYXR1cmUgYW5kIHNldCB0aGUgdmFsdWUKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRYbWxGZWF0dXJlKG9iagotCQkJCS5lQ2xhc3MoKSwgZmVhdHVyZU5hbWUsIHZhbHVlVHlwZS5nZXROYW1lKCkpOwotCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQlPYmplY3RbXSBwYXJhcyA9IG5ldyBPYmplY3RbXSB7IGZlYXR1cmVOYW1lLCBvYmosIGlkVmFsdWUgfTsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKAotCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlLCBwYXJhcykpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIHN0ciA9IGZlYXR1cmUuZ2V0RVR5cGUoKS5nZXROYW1lKCk7Ci0JCWlmIChzdHIuZXF1YWxzKCJTdHJpbmciKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUxpc3QgbCA9IChMaXN0KSBvYmouZUdldChmZWF0dXJlKTsKLQkJCQlpZiAoIWwuY29udGFpbnMoaWRWYWx1ZSkpIHsKLQkJCQkJbC5hZGQoaWRWYWx1ZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlvYmouZVNldChmZWF0dXJlLCBpZFZhbHVlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnQoKSkgewotCQkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IgYnJlYWtkb3duIGVsZW1lbnQuIEluIHVtYSwgYnJlYWtkb3duCi0JCQkvLyBlbGVtZW50cyBhcmUgdW5kZXIgcHJvY2VzcyBwYWNrYWdlcwotCQkJLy8gaW4geG1sIG1vZGVsLCB0aGV5IGFyZSBvd25lZCBieSB0aGUgYWN0aXZpdHkKLQkJCUVEYXRhT2JqZWN0IHYgPSBnZXRFbGVtZW50KGlkVmFsdWUpOwotCQkJaWYgKHYgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJRU9iamVjdCBvbGRfY29udGFpbmVyID0gdi5lQ29udGFpbmVyKCk7Ci0JCQkJTGlzdCBsID0gKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpOwotCQkJCWlmICghbC5jb250YWlucyh2KSkgewotCQkJCQlsLmFkZCh2KTsKLQkJCQl9Ci0KLQkJCQkvLyBpZiB0aGUgb2xkIGNvbnRhaW5lciBwYWNrYWdlIGlzIGVtcHR5LCBkZWxldGUgaXQKLQkJCQlpZiAoKG9sZF9jb250YWluZXIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkKLQkJCQkJCSYmIChvbGRfY29udGFpbmVyLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpKSB7Ci0JCQkJCWlmICgoKFByb2Nlc3NQYWNrYWdlKSBvbGRfY29udGFpbmVyKS5nZXRQcm9jZXNzRWxlbWVudCgpCi0JCQkJCQkJLnNpemUoKSA9PSAwKSB7Ci0JCQkJCQkoKFByb2Nlc3NQYWNrYWdlKSBvbGRfY29udGFpbmVyLmVDb250YWluZXIoKSkKLQkJCQkJCQkJLmdldE1ldGhvZFBhY2thZ2UoKS5yZW1vdmUob2xkX2NvbnRhaW5lcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3IoKSApIHsKLQkJCS8vIHRoZSBvcmtlciBvcmRlciBuZWVkcyB0byBiZSBhZGRlZCB0byB0aGUgV29ya0JyZWFrZG93bkVsZW1lbnQKLQkJCS8vIHNpbmNlIGluIFhtbCBtb2RlbCB0aGUgd29yayBvcmRlciBpcyBjb250YWluZWQgYnkgdGhlIFdvcmtCcmVha2Rvd25FbGVtZW50Ci0JCQkvLyBKaW5odWEgWGksIDA4LzI0LzIwMDYKLQkJCU9iamVjdCB2ID0gZ2V0RWxlbWVudChpZFZhbHVlKTsKLQkJCWlmICh2IGluc3RhbmNlb2YgV29ya09yZGVyKSB7Ci0JCQkJKChXb3JrQnJlYWtkb3duRWxlbWVudClvYmopLmdldFByZWRlY2Vzc29yKCkuYWRkKHYpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gbm90IGhhbmRsZWQsIGFkZCB3YXJuaW5nIGxvZwotCQkJLy8gdGhlIGlkIGZlYXR1cmUgdmFsdWUgaXMgbm90IHNldAotCQkJLy8gSkluaHVhIFhpLCBUT0RPCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZHQKLQkgKiBAcmV0dXJuIGEgWG1sIGRhdGUuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRYbWxEYXRlKGphdmEudXRpbC5EYXRlIGR0KSB7Ci0JCVNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQgaGg6bW06c3MiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZHRTdHIgPSBzZGYuZm9ybWF0KGR0KTsKLQkJZHRTdHIgPSBkdFN0ci5yZXBsYWNlKCcgJywgJ1QnKTsKLQkJRURhdGFUeXBlIHR5cGUgPSBYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGF0ZVRpbWUoKTsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKHR5cGUsIGR0U3RyKTsKLQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN0cmluZyhPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBzdHIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJTWV0aG9kRWxlbWVudCBtZSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQlzdHIgPSBtZS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgbWUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAob2JqICE9IG51bGwpIHsKLQkJCXN0ciA9IG9iai50b1N0cmluZygpOwotCQl9Ci0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQkvKioKLQkgKiBmaXggdGhlIGxpYnJhcnkgc28gdGhhdCBpdCBtZWV0cyB0aGUgdW1hIGxpYnJhcnkgc3RhbmRhcmRzCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZml4TGlicmFyeUZvckltcG9ydCgpIHsKLQotCQlmaXhHdWlkKChNZXRob2RFbGVtZW50KSByb290T2JqZWN0KTsKLQotCQlpZiAocm9vdE9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSAoKE1ldGhvZExpYnJhcnkpIHJvb3RPYmplY3QpLmdldE1ldGhvZFBsdWdpbigpCi0JCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJZml4UGx1Z2luKChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocm9vdE9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJZml4UGx1Z2luKChNZXRob2RQbHVnaW4pIHJvb3RPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZml4IHRoZSBsaWJyYXJ5IHNvIHRoYXQgaXQgbWVldHMgdGhlIHhtbCBzY2hlbWEgc3RhbmRhcmRzCi0JICogYWxzbyByZW1vdmUgcG9zc2libGUgc3RydWN0dXJlIGVycm9ycyBzdWNoIGFzIFByb2Nlc3NDb21wb25lbnQgd2l0aG91dCBwcm9jZXNzIGluIGl0LgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpeExpYnJhcnlGb3JFeHBvcnQoKSB7Ci0KLQkJTGlzdCBpbnZhbGlkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSAoKE1ldGhvZExpYnJhcnkpIHJvb3RPYmplY3QpLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50ICkgewotCQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudClvYmopLmdldFByb2Nlc3MoKTsKLQkJCQlpZiAoIHByb2MgPT0gbnVsbCApIHsKLQkJCQkJaW52YWxpZEl0ZW1zLmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHJlbW92ZSB0aGUgb2JqZWN0cwotCQl3aGlsZSAoaW52YWxpZEl0ZW1zLnNpemUoKSA+IDAgKSB7Ci0JCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KWludmFsaWRJdGVtcy5yZW1vdmUoMCk7Ci0JCQlFY29yZVV0aWwucmVtb3ZlKG9iaik7Ci0JCX0KLQl9Ci0KLQkKLQkKLQkvKioKLQkgKiBnZXQgYSBsaXN0IG9mIHJlZmVyZW5jZWQgcGx1Z2lucyBmb3IgdGhlIGxpYnJhcnkuIFRoZSByZWZlcmVuY2VkIHBsdWdpbnMKLQkgKiBkb2VzIG5vdCBpbmNsdWRlIHRoZSBvbmVzIGluc2lkZSB0aGlzIGxpYnJhcnkuIFdoZW4gaW1wb3J0aW5nLCB0aGVzZQotCSAqIHBsdWdpbnMgbXVzdCBiZSBpbiB0aGUgdGFyZ2V0IGxpYnJhcnkgYWxyZWFkeS4KLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIHJlZmVyZW5jZWQgcGx1Z2lucwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlZmVyZW5jZWRQbHVnaW5zKCkgewotCi0JCUxpc3QgZXh0ZXJuYWxQbHVnaW5zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmICghKHJvb3RPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSkgewotCQkJcmV0dXJuIGV4dGVybmFsUGx1Z2luczsKLQkJfQotCi0JCUxpc3Qgc2VsZWN0ZWRQbHVnaW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gKChNZXRob2RMaWJyYXJ5KSByb290T2JqZWN0KS5nZXRNZXRob2RQbHVnaW4oKQotCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJU3RyaW5nIGlkID0gcGx1Z2luLmdldElkKCk7Ci0JCQlzZWxlY3RlZFBsdWdpbnMuYWRkKGlkKTsKLQkJCWlmIChleHRlcm5hbFBsdWdpbnMuY29udGFpbnMoaWQpKSB7Ci0JCQkJZXh0ZXJuYWxQbHVnaW5zLnJlbW92ZShpZCk7Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRyID0gcGx1Z2luLmdldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4oKS5pdGVyYXRvcigpOyBpdHIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgcmVmID0gKFN0cmluZykgaXRyLm5leHQoKTsKLQkJCQlpZiAoIXNlbGVjdGVkUGx1Z2lucy5jb250YWlucyhyZWYpCi0JCQkJCQkmJiAhZXh0ZXJuYWxQbHVnaW5zLmNvbnRhaW5zKHJlZikpIHsKLQkJCQkJZXh0ZXJuYWxQbHVnaW5zLmFkZChyZWYpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBleHRlcm5hbFBsdWdpbnM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpeEd1aWQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGlmIHRoZSB4bWwgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIGlkIHNwZWNpZmllZCwgY3JlYXRlIGEgbmV3IG9uZQotCQlTdHJpbmcgaWQgPSBlbGVtZW50LmdldElkKCk7Ci0JCWlmIChpZCA9PSBudWxsIHx8IGlkLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWQgPSBFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCk7Ci0JCQllbGVtZW50LnNldElkKGlkKTsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9uZXdfaWQsCi0JCQkJCWdldFN0cmluZyhlbGVtZW50KSwgaWQpOwotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcobXNnKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGNoZWNrIGlmIHRoZSBlbGVtZW50IGhhcyBhIHVuaXF1ZSBpZCBvciBub3QKLQkJCU9iamVjdCBvbGQgPSBnZXRFbGVtZW50KGlkKTsKLQkJCWlmICgob2xkICE9IG51bGwpICYmIChvbGQgIT0gZWxlbWVudCkpIHsKLQkJCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZCgKLQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2lkX25vdF91bmlxdWUsIGlkKSk7Ci0JCQl9Ci0KLQkJCXNldEVsZW1lbnQoaWQsIGVsZW1lbnQpOwotCQl9Ci0JCS8vIGl0ZXJhdGUgdGhlIGNoaWxkcmVuCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50LmVDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJZml4R3VpZCgoTWV0aG9kRWxlbWVudCkgbyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZml4UGx1Z2luKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQotCQkvLyBmaW5kIGFsbCBwcm9jZXNzZXMgYW5kIG1ha2Ugc3VyZSB0aGV5IGFyZSB3cmFwcGVkIHdpdGggYQotCQkvLyBQcm9jZXNzQ29tcG9uZW50LAotCQkvLyBpZiBub3QsIGNyZWF0ZSBvbmUuCi0JCS8vIGNvbGxlY3QgdGhlIHByb2Nlc3NlcyB0byBiZSBmaXhlZCwKLQkJLy8gZG9uJ3QgZml4IHdpdGhpbiB0aGUgaXRlcmF0aW9uLCBtYXkgY2F1c2UgY29uY3VycmVudCBtb2RpZmljYXRpb24KLQkJLy8gZXhlY2VwdGlvbgotCQlMaXN0IHByb2NzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2luLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJaWYgKGlzUHJvY2VzcyhvKSkgewotCQkJCXByb2NzLmFkZChvKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9jcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvY3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWZpeFByb2Nlc3MoKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MpIGl0Lm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbiBFUEYsIGEgcHJvY2VzcyAoQ2FwYWJpbGl0eSBwYXR0ZXJuIGFuZCBEZWxpdmVyeSBQcm9jZXNzKSBjYW4gYmUgcmVzaWRlCi0JICogaW4gYSBQcm9jZXNzUGFja2FnZSBvciBhIFByb2Nlc3NDb21wb25lbnQuIElmIGl0J3MgaW4gYSBwcm9jZXNzQ29tcG9uZW50LAotCSAqIGl0IGlzIHRyZWF0ZWQgYXMgYSByb290IGxldmVsIHByb2Nlc3MuIElmIGl0J3MgaW4gYSBQcm9jZXNzUGFja2FnZSwgaXQgaXMKLQkgKiB0cmVhdGVkIGFzIGEgbG9jYWwgY29weSBvZiBhbm90aGVyIHByb2Nlc3MuIFNvIHdlIG5lZWQgdG8gY2hlY2sgdGhlCi0JICogcGFyZW50IGFuZCBzZWUgaXQgdGhpcyBwcm9jZXNzIGlzIGNvbnRhaW5lZCBieSBhIFByb2Nlc3NDb21wb25lbnQuCi0JICogCi0JICogQHBhcmFtIE9iagotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1Byb2Nlc3MoRU9iamVjdCBvYmopIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCW9iaiA9IG9iai5lQ29udGFpbmVyKCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIGlmIGl0J3MgaW1tZWRpYXRlIHBhcmVudCBpcyBub3QgYSBQcm9jZXNzQ29tcG9uZW50IGJ1dCBpdCdzIHdpdGhpbiBhCi0JCS8vIFByb2Nlc3NDb21wb25lbnQKLQkJLy8gaXQncyBhIGxvY2FsIGNvcHkgb2YgdGhlIHByb2Nlc3MKLQkJd2hpbGUgKCgob2JqID0gb2JqLmVDb250YWluZXIoKSkgIT0gbnVsbCkKLQkJCQkmJiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaXhQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgcHJvYykgewotCQlFRGF0YU9iamVjdCBjb250YWluZXIgPSAoRURhdGFPYmplY3QpIHByb2MuZUNvbnRhaW5lcigpOwotCQlQcm9jZXNzQ29tcG9uZW50IHBjID0gbnVsbDsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICghKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSkgewotCQkJU3RyaW5nIG1zZyA9IE5MUwotCQkJCQkuYmluZCgKLQkJCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9wcm9jZXNzX3dyb25nX2NvbnRhaW5lciwKLQkJCQkJCQlwcm9jLmdldE5hbWUoKSwgY29udGFpbmVyLmdldFR5cGUoKS5nZXROYW1lKCkpOwotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcobXNnKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXBjID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpOwotCQlTdHJpbmcgaWQgPSBnZXRUYXJnZXRQYXJlbnRJZChwcm9jLmdldElkKCkpOwotCQlpZiAoaWQgPT0gbnVsbCkgewotCQkJaWQgPSBFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCk7Ci0JCX0KLQotCQlwYy5zZXRJZChpZCk7Ci0JCXBjLnNldE5hbWUocHJvYy5nZXROYW1lKCkpOwotCQkoKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXIpLmdldFByb2Nlc3NFbGVtZW50KCkucmVtb3ZlKHByb2MpOwotCQkoKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXIpLmdldE1ldGhvZFBhY2thZ2UoKS5hZGQocGMpOwotCQlwYy5zZXRQcm9jZXNzKHByb2MpOwotCi0JfQotCi0JLyoqCi0JICogaWYgdGhlIHByb2Nlc3MgZXhpc3RzIGluIHRoZSB0YXJnZXQgbGlicmFyeSwgZ2V0IHRoZSBwcm9jZXNzIGNvbXBvbmVudCBpZAotCSAqIGZyb20gdGhlIHRhcmdldCBsaWJyYXJ5Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0UGFyZW50SWQoU3RyaW5nIGlkKSB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJRU9iamVjdCBvYmogPSBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQoaWQpOwotCQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQkJb2JqID0gb2JqLmVDb250YWluZXIoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkgb2JqKS5nZXRHdWlkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBrZwotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHByb2Nlc3NlcyBpbiBwa2cuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWxsUHJvY2Vzc2VzKE1ldGhvZFBhY2thZ2UgcGtnKSB7Ci0JCUxpc3QgcHJvY2Vzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlfaXRlcmF0ZVBhY2thZ2VGb3JQcm9jZXNzZXMocGtnLCBwcm9jZXNzZXMpOwotCi0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9pdGVyYXRlUGFja2FnZUZvclByb2Nlc3NlcyhNZXRob2RQYWNrYWdlIHBrZywgTGlzdCBwcm9jZXNzZXMpIHsKLQkJaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgcCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgcGtnKQotCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJaWYgKHAgIT0gbnVsbCAmJiAhcHJvY2Vzc2VzLmNvbnRhaW5zKHApKSB7Ci0JCQkJcHJvY2Vzc2VzLmFkZChwKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBwa2cuZ2V0TWV0aG9kUGFja2FnZSgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCV9pdGVyYXRlUGFja2FnZUZvclByb2Nlc3NlcygoTWV0aG9kUGFja2FnZSkgaXQubmV4dCgpLCBwcm9jZXNzZXMpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmYjc2NzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgYW5kIGltcGxlbWVudGF0aW9uIGZvciB0aGUgRXhwb3J0IFhNTCBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvRXhwb3J0WE1MV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL0V4cG9ydFhNTFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOTEyODUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvRXhwb3J0WE1MV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5wcmVmZXJlbmNlcy5FeHBvcnRYTUxQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcy5FeHBvcnRYTUxEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzLkV4cG9ydFhNTFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBYTUwgd2l6YXJkLgotICogPHA+Ci0gKiBUaGlzIHdpemFyZCBpcyB1c2VkIHRvIGV4cG9ydCBtZXRob2QgbGlicmFyeSBjb250ZW50IHRvIFhNTCBmaWxlcy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0WE1MV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7Ci0KLQlwcml2YXRlIFNlbGVjdEV4cG9ydFR5cGVQYWdlIHNlbGVjdEV4cG9ydFR5cGVQYWdlOwotCi0JcHJvdGVjdGVkIFNlbGVjdFBsdWdpblBhZ2Ugc2VsZWN0UGx1Z2luUGFnZTsKLQotCXByb3RlY3RlZCBWaWV3UGx1Z2luSW5mb1BhZ2Ugdmlld1BsdWdpbkluZm9QYWdlOwotCi0JcHJvdGVjdGVkIFZpZXdFeHBvcnRTdW1tYXJ5UGFnZSB2aWV3RXhwb3J0U3VtbWFyeVBhZ2U7Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0Q29uZmlnUGFnZSBzZWxlY3RDb25maWdQYWdlOwotCi0JcHJvdGVjdGVkIFNlbGVjdFhNTEZpbGVQYWdlIHNlbGVjdFhNTEZpbGVQYWdlOwotCi0JcHJvdGVjdGVkIEV4cG9ydFhNTERhdGEgeG1sRGF0YSA9IG5ldyBFeHBvcnRYTUxEYXRhKCk7Ci0KLQlwcm90ZWN0ZWQgUGx1Z2luRXhwb3J0RGF0YSBwbHVnaW5EYXRhID0gbmV3IFBsdWdpbkV4cG9ydERhdGEoKTsKLQotCXByb3RlY3RlZCBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBjb25maWdEYXRhID0gbmV3IENvbmZpZ3VyYXRpb25FeHBvcnREYXRhKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRYTUxXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdpbmRvd1RpdGxlKEV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRYTUxXaXphcmRfdGl0bGUpOwotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJc2VsZWN0RXhwb3J0VHlwZVBhZ2UgPSBuZXcgU2VsZWN0RXhwb3J0VHlwZVBhZ2UoKTsKLQkJc2VsZWN0UGx1Z2luUGFnZSA9IG5ldyBTZWxlY3RQbHVnaW5QYWdlKHBsdWdpbkRhdGEpOwotCQl2aWV3UGx1Z2luSW5mb1BhZ2UgPSBuZXcgVmlld1BsdWdpbkluZm9QYWdlKHBsdWdpbkRhdGEpOwotCQl2aWV3RXhwb3J0U3VtbWFyeVBhZ2UgPSBuZXcgVmlld0V4cG9ydFN1bW1hcnlQYWdlKHBsdWdpbkRhdGEpOwotCQlzZWxlY3RDb25maWdQYWdlID0gbmV3IFNlbGVjdENvbmZpZ1BhZ2UoY29uZmlnRGF0YSk7Ci0JCXNlbGVjdFhNTEZpbGVQYWdlID0gbmV3IFNlbGVjdFhNTEZpbGVQYWdlKCk7Ci0KLQkJYWRkUGFnZShzZWxlY3RFeHBvcnRUeXBlUGFnZSk7Ci0JCWFkZFBhZ2Uoc2VsZWN0UGx1Z2luUGFnZSk7Ci0JCWFkZFBhZ2Uodmlld1BsdWdpbkluZm9QYWdlKTsKLQkJYWRkUGFnZSh2aWV3RXhwb3J0U3VtbWFyeVBhZ2UpOwotCQlhZGRQYWdlKHNlbGVjdENvbmZpZ1BhZ2UpOwotCQlhZGRQYWdlKHNlbGVjdFhNTEZpbGVQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJc3VwZXIuY3JlYXRlUGFnZUNvbnRyb2xzKHBhZ2VDb250YWluZXIpOwotCQlwYWdlQ29udGFpbmVyLmdldFNoZWxsKCkuc2V0SW1hZ2UoCi0JCQkJRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkJCSJmdWxsL29iajE2L1hNTEZpbGUuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJcmV0dXJuIGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCkgPT0gc2VsZWN0WE1MRmlsZVBhZ2UKLQkJCQkmJiBzZWxlY3RYTUxGaWxlUGFnZS5pc1BhZ2VDb21wbGV0ZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJU3RyaW5nIHhtbEZpbGVQYXRoID0gc2VsZWN0WE1MRmlsZVBhZ2UuZ2V0UGF0aCgpOwotCQlGaWxlIHhtbEZpbGUgPSBuZXcgRmlsZSh4bWxGaWxlUGF0aCk7Ci0JCWlmICh4bWxGaWxlLmV4aXN0cygpKSB7Ci0JCQlib29sZWFuIG9rID0gRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMuZXhwb3J0WE1MV2l6YXJkX3RpdGxlLAotCQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy5iaW5kKAotCQkJCQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLm92ZXJ3cml0ZVRleHRfbXNnLAotCQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgeG1sRmlsZVBhdGggfSkpOwotCQkJaWYgKCFvaykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJRXhwb3J0WE1MU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLmJlZ2luVGFzayhFeHBvcnRYTUxSZXNvdXJjZXMuZXhwb3J0aW5nWE1MX3RleHQsCi0JCQkJCQkJSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQotCQkJCQl4bWxEYXRhLnNldFhNTEZpbGUoc2VsZWN0WE1MRmlsZVBhZ2UuZ2V0UGF0aCgpKTsKLQkJCQkJc2VydmljZSA9IG5ldyBFeHBvcnRYTUxTZXJ2aWNlKHhtbERhdGEpOwotCQkJCQlzZXJ2aWNlLmRvRXhwb3J0KG1vbml0b3IpOwotCQkJCQlFeHBvcnRYTUxQcmVmZXJlbmNlcy5zZXRFeHBvcnRUeXBlKHhtbERhdGEuZ2V0RXhwb3J0VHlwZSgpKTsKLQkJCQkJRXhwb3J0WE1MUHJlZmVyZW5jZXMuc2V0WE1MRmlsZSh4bWxEYXRhLmdldFhNTEZpbGUoKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCWlmIChzZXJ2aWNlICE9IG51bGwpIHsKLQkJCQkJCXNlcnZpY2UuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIGZhbHNlLCBvcCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgcmVhbEV4Y2VwdGlvbiA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQlFeHBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydFhNTFdpemFyZF90aXRsZSwKLQkJCQkJTkxTLmJpbmQoRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydFhNTFdpemFyZF9lcnJvciwKLQkJCQkJCQlyZWFsRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSksIHJlYWxFeGNlcHRpb24pOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIG1zZyA9IEV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRYTUxXaXphcmRfcmV2aWV3TG9nOwotCQlNc2dCb3gucHJvbXB0KG1zZywgU1dULk9LKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvU2VsZWN0Q29uZmlnUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RDb25maWdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQxZTZjYmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RDb25maWdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IG9uZSBvciBtb3JlIG1ldGhvZCBjb25maWd1cmF0aW9uCi0gKiBzcGVjaWZpY2F0aW9ucyB0byBleHBvcnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0Q29uZmlnUGFnZSBleHRlbmRzIEV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5lcyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0Q29uZmlnUGFnZShDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKGRhdGEpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXN1cGVyLnNhdmVEYXRhVG9Nb2RlbCgpOwotCQlFeHBvcnRYTUxXaXphcmQgd2l6YXJkID0gKEV4cG9ydFhNTFdpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCXdpemFyZC54bWxEYXRhLnNldFNlbGVjdGVkQ29uZmlncyh3aXphcmQuY29uZmlnRGF0YS5zZWxlY3RlZENvbmZpZ3MpOwkJCi0JCXJldHVybiB3aXphcmQuc2VsZWN0WE1MRmlsZVBhZ2U7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RFeHBvcnRUeXBlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RFeHBvcnRUeXBlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZWU5ZGUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvU2VsZWN0RXhwb3J0VHlwZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5wcmVmZXJlbmNlcy5FeHBvcnRYTUxQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcy5FeHBvcnRYTUxEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBkaXNwbGF5cyB0aGUgdHlwZSBvZiBtZXRob2QgbGlicmFyeSBjb250ZW50IHRvIGV4cG9ydC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0RXhwb3J0VHlwZVBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdEV4cG9ydFR5cGVQYWdlLmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgQnV0dG9uIGV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGV4cG9ydFBsdWdpbnNSYWRpb0J1dHRvbjsKLQotCS8vIFBvc3Rwb25lZCB0byBuZXh0IHJlbGVhc2UuCi0JLy9wcml2YXRlIEJ1dHRvbiBleHBvcnRDb25maWdzUmFkaW9CdXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RFeHBvcnRUeXBlUGFnZSgpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoRXhwb3J0UmVzb3VyY2VzLnNlbGVjdEV4cG9ydFR5cGVQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oRXhwb3J0WE1MUmVzb3VyY2VzLnNlbGVjdEV4cG9ydFR5cGVQYWdlX2Rlc2MpOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vRXhwb3J0WE1MLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oY29udGFpbmVyLAotCQkJCUV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRMaWJyYXJ5UmFkaW9CdXR0b25fdGV4dCwgMSwgZmFsc2UpOwotCi0JCWV4cG9ydFBsdWdpbnNSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKGNvbnRhaW5lciwKLQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMuZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uX3RleHQsIDEsIGZhbHNlKTsKLQotCQkvLyBQb3N0cG9uZWQgdG8gbmV4dCByZWxlYXNlLgotCQkvL2V4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKGNvbnRhaW5lciwKLQkJLy8JCUV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRDb25maWdzUmFkaW9CdXR0b25fdGV4dCwgMSwgZmFsc2UpOwotCQkKLQkJc3dpdGNoIChFeHBvcnRYTUxQcmVmZXJlbmNlcy5nZXRFeHBvcnRUeXBlKCkpIHsKLQkJY2FzZSBFeHBvcnRYTUxEYXRhLkVYUE9SVF9NRVRIT0RfTElCUkFSWToKLQkJCWV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBFeHBvcnRYTUxEYXRhLkVYUE9SVF9NRVRIT0RfUExVR0lOUzoKLQkJCWV4cG9ydFBsdWdpbnNSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlicmVhazsKLQkJLy8gUG9zdHBvbmVkIHRvIG5leHQgcmVsZWFzZS4JCQkKLQkJLy9jYXNlIEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9DT05GSUdTOgotCQkvLwlleHBvcnRDb25maWdzUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkvLwlicmVhazsKLQkJfQotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQkvLyBQb3N0cG9uZWQgdG8gbmV4dCByZWxlYXNlLgkJCi0JCS8vZXhwb3J0Q29uZmlnc1JhZGlvQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQoRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlFeHBvcnRYTUxXaXphcmQgd2l6YXJkID0gKEV4cG9ydFhNTFdpemFyZCkgZ2V0V2l6YXJkKCk7Ci0KLQkJaWYgKGV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJd2l6YXJkLnhtbERhdGEuc2V0RXhwb3J0VHlwZShFeHBvcnRYTUxEYXRhLkVYUE9SVF9NRVRIT0RfTElCUkFSWSk7Ci0JCQlyZXR1cm4gd2l6YXJkLnNlbGVjdFhNTEZpbGVQYWdlOwotCQl9IGVsc2UgaWYgKGV4cG9ydFBsdWdpbnNSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJd2l6YXJkLnhtbERhdGEuc2V0RXhwb3J0VHlwZShFeHBvcnRYTUxEYXRhLkVYUE9SVF9NRVRIT0RfUExVR0lOUyk7Ci0JCQlyZXR1cm4gd2l6YXJkLnNlbGVjdFBsdWdpblBhZ2U7Ci0JCX0KLQkJLy8gUG9zdHBvbmVkIHRvIG5leHQgcmVsZWFzZS4KLQkJLy9lbHNlIGlmIChleHBvcnRDb25maWdzUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJLy8Jd2l6YXJkLnhtbERhdGEuc2V0RXhwb3J0VHlwZShFeHBvcnRYTUxEYXRhLkVYUE9SVF9NRVRIT0RfQ09ORklHUyk7Ci0JCS8vCXJldHVybiB3aXphcmQuc2VsZWN0Q29uZmlnUGFnZTsKLQkJLy99Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RQbHVnaW5QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1NlbGVjdFBsdWdpblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTFiNmYzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1NlbGVjdFBsdWdpblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBvbmUgb3IgbW9yZSBtZXRob2QgcGx1Zy1pbnMgdG8KLSAqIGV4cG9ydC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RQbHVnaW5QYWdlIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLlNlbGVjdFBsdWdpblBhZ2UgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0UGx1Z2luUGFnZShQbHVnaW5FeHBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoZGF0YSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlzdXBlci5zYXZlRGF0YVRvTW9kZWwoKTsKLQkJRXhwb3J0WE1MV2l6YXJkIHdpemFyZCA9IChFeHBvcnRYTUxXaXphcmQpIGdldFdpemFyZCgpOwotCQl3aXphcmQueG1sRGF0YS5zZXRTZWxlY3RlZFBsdWdpbnMod2l6YXJkLnBsdWdpbkRhdGEuc2VsZWN0ZWRQbHVnaW5zKTsKLQkJVmlld1BsdWdpbkluZm9QYWdlIHBhZ2UgPSB3aXphcmQudmlld1BsdWdpbkluZm9QYWdlOwotCQlwYWdlLm9uRW50ZXJQYWdlKG51bGwpOwotCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvU2VsZWN0WE1MRmlsZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvU2VsZWN0WE1MRmlsZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTQwNzFlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1NlbGVjdFhNTEZpbGVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5FeHBvcnRYTUxQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnByZWZlcmVuY2VzLkV4cG9ydFhNTFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNwZWNpZnkgYSBYTUwgZmlsZSB0byBzdG9yZSB0aGUKLSAqIGV4cG9ydGVkIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdFhNTEZpbGVQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RYTUxGaWxlUGFnZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIFRleHQgcGF0aFRleHQ7Ci0KLQlwcml2YXRlIFN0cmluZyBwYXRoOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0WE1MRmlsZVBhZ2UoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEV4cG9ydFhNTFJlc291cmNlcy5zZWxlY3RYTUxGaWxlUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFhNTFJlc291cmNlcy5zZWxlY3RYTUxGaWxlUGFnZV9kZXNjKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9FeHBvcnRYTUwuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgZmlsZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlmaWxlTGFiZWwuc2V0VGV4dChFeHBvcnRYTUxSZXNvdXJjZXMuZmlsZUxhYmVsX3RleHQpOwotCi0JCXBhdGhUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJcGF0aFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXBhdGhUZXh0LnNldFRleHQoRXhwb3J0WE1MUHJlZmVyZW5jZXMuZ2V0WE1MRmlsZSgpKTsKLQkJcGF0aFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKGlzVmFsaWRQYXRoKHBhdGhUZXh0LmdldFRleHQoKS50cmltKCkpKSB7Ci0JCQkJCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShFeHBvcnRYTUxSZXNvdXJjZXMuaW52YWxpZFhNTEZpbGVfZXJyb3IpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQpKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoRXhwb3J0WE1MUmVzb3VyY2VzLmJyb3dzZUJ1dHRvbl90ZXh0KTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUZpbGVEaWFsb2cgZmQgPSBuZXcgRmlsZURpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJLmdldEFjdGl2ZVNoZWxsKCksIFNXVC5TQVZFKTsKLQkJCQlmZC5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqLnhtbCIsICIqLioiIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTdHJpbmcgcGF0aCA9IGZkLm9wZW4oKTsKLQkJCQlib29sZWFuIG9rID0gZmFsc2U7Ci0JCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCQlwYXRoVGV4dC5zZXRUZXh0KHBhdGgpOwotCQkJCQlvayA9IGlzVmFsaWRQYXRoKHBhdGgpOwotCQkJCX0KLQkJCQlzZXRQYWdlQ29tcGxldGUob2spOwotCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCi0JCXNldFBhZ2VDb21wbGV0ZShpc1ZhbGlkUGF0aChwYXRoVGV4dC5nZXRUZXh0KCkudHJpbSgpKSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIHVzZXIgc3BlY2lmaWMgcGF0aCBpcyB2YWxpZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIHVzZXIgc3BlY2lmaWMgcGF0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgc3BlY2lmaWVkIHBhdGggaXMgdmFsaWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCUlQYXRoIGVjUGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKHBhdGgpOwotCQlpZiAoZWNQYXRoLmlzVmFsaWRQYXRoKHBhdGgpICYmIHBhdGguZW5kc1dpdGgoIi54bWwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLnBhdGggPSBwYXRoOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJcmV0dXJuIG51bGw7IC8vIG5vIG1vcmUgcGFnZQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIFhNTCBmaWxlLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgWE1MIGZpbGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JCXJldHVybiB0aGlzLnBhdGg7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1ZpZXdFeHBvcnRTdW1tYXJ5UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9WaWV3RXhwb3J0U3VtbWFyeVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzRjODYzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1ZpZXdFeHBvcnRTdW1tYXJ5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuUGx1Z2luRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBkaXNwbGF5cyBhIHN1bW1hcnkgb2YgdGhlIHNlbGVjdGVkIG1ldGhvZCBwbHVnLWlucyB0aGF0Ci0gKiB3aWxsIGJlIGV4cG9ydGVkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZpZXdFeHBvcnRTdW1tYXJ5UGFnZSBleHRlbmRzIEV4cG9ydFBsdWdpblN1bW1hcnlQYWdlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFZpZXdFeHBvcnRTdW1tYXJ5UGFnZShQbHVnaW5FeHBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoZGF0YSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlFeHBvcnRYTUxXaXphcmQgd2l6YXJkID0gKEV4cG9ydFhNTFdpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCXJldHVybiB3aXphcmQuc2VsZWN0WE1MRmlsZVBhZ2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1ZpZXdQbHVnaW5JbmZvUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9WaWV3UGx1Z2luSW5mb1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQ3OWRjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1ZpZXdQbHVnaW5JbmZvUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuUGx1Z2luRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuUGx1Z2luSW5mb1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHJldmlldyB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBtZXRob2QKLSAqIHBsdWctaW5zIHRoYXQgaGF2ZSBiZWVuIHNlbGVjdGVkIGZvciBleHBvcnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmlld1BsdWdpbkluZm9QYWdlIGV4dGVuZHMgUGx1Z2luSW5mb1BhZ2UgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVmlld1BsdWdpbkluZm9QYWdlKFBsdWdpbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXN1cGVyLnNhdmVEYXRhVG9Nb2RlbCgpOwotCQlFeHBvcnRYTUxXaXphcmQgd2l6YXJkID0gKEV4cG9ydFhNTFdpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCXdpemFyZC54bWxEYXRhLnNldEFzc29jaWF0ZWRDb25maWdzKHdpemFyZC5wbHVnaW5EYXRhLmFzc29jaWF0ZWRDb25maWdNYXApOwotCQlWaWV3RXhwb3J0U3VtbWFyeVBhZ2UgcGFnZSA9IHdpemFyZC52aWV3RXhwb3J0U3VtbWFyeVBhZ2U7Ci0JCXBhZ2Uub25FbnRlclBhZ2UobnVsbCk7Ci0JCXJldHVybiBwYWdlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDRjMWNjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHdpemFyZHMgZm9yIGV4cG9ydGluZyBtZXRob2QgbGlicmFyeSBjb250ZW50IHRvIFhNTC4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YzRmMjBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIj4KLQkJPGF0dHJpYnV0ZXM+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhdHRyaWJ1dGVzPgotCQk8L2F0dHJpYnV0ZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmY3NTk0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIGV4cG9ydCBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDVhYTQ5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZXhwb3J0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGJkMTkxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcywKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMKLVJlcXVpcmUtQnVuZGxlOiBvcmcuYXBhY2hlLmFudCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeSwKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmM3ODBjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvQXV0aG9yaW5nLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9BdXRob3JpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MzFiYWYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9BdXRob3JpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL0NvbnRlbnRQYWNrYWdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9Db250ZW50UGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL0NvbnRlbnRQYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9Gb2xkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL0ZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NDE5ZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL0ZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvTWV0aG9kUGx1Z2luLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9NZXRob2RQbHVnaW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYjgyYzM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9NZXRob2RQbHVnaW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1BhY2thZ2luZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvUGFja2FnaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTk2Mzk0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvUGFja2FnaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9Sb2xlcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvUm9sZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NGEzZjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9Sb2xlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvVGFza3MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1Rhc2tzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjM4YmQ4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvVGFza3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2NvbmZpZ3VyYXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2NvbmZpZ3VyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZTg5NjAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9jb25maWd1cmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9lcnJvci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZXJyb3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNWU3YTk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9lcnJvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZnVsbC93aXpiYW4vRXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI0OTgzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZnVsbC93aXpiYW4vRXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydE1ldGhvZFBsdWdpbnMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydE1ldGhvZFBsdWdpbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjQ5ODMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9mdWxsL3dpemJhbi9FeHBvcnRNZXRob2RQbHVnaW5zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy93YXJuaW5nLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy93YXJuaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWVlMjBhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvd2FybmluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0ZDI3ODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBFeHBvcnQKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIFBlcnNwZWN0aXZlCi1wYWNrYWdpbmdQZXJzcGVjdGl2ZU5hbWU9UGFja2FnaW5nCi0KLSMgQ2F0ZWdvcnkKLXBhY2thZ2luZ0NhdGVnb3J5TmFtZT1QYWNrYWdpbmcKLQotIyBWaWV3cwotcGFja2FnaW5nVmlld05hbWU9UGFja2FnaW5nIE1ldGhvZCBMaWJyYXJ5Ci1wYWNrYWdpbmdNZXNzYWdlVmlld05hbWU9TGlicmFyeSBQYWNrYWdpbmcgTWVzc2FnZQotCi0jIEFjdGlvbiBTZXQKLXBhY2thZ2luZ0FjdGlvblNldD1QYWNrYWdpbmcKLQotIyBBY3Rpb25zCi1uZXdDb25maWdBY3Rpb249JkNvbmZpZ3VyYXRpb24KLW5ld0NvbmZpZ0FjdGlvblRvb2x0aXA9Q3JlYXRlIGEgbmV3IGxpYnJhcnkgQ29uZmlndXJhdGlvbgotb3BlbkNvbmZpZ0FjdGlvbj0mQ29uZmlndXJhdGlvbgotb3BlbkNvbmZpZ0FjdGlvblRvb2x0aXA9T3BlbiBhbiBleGlzdGluZyBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24KLQotIyBFeHBvcnQgV2l6YXJkIENhdGVnb3J5Ci1leHBvcnRDYXRlZ29yeU5hbWU9TWV0aG9kCi0KLSMgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQKLWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1MaWJyYXJ5IENvbmZpZ3VyYXRpb24KLWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uPUV4cG9ydCBhIGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLQotIyBFeHBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZAotZXhwb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9TWV0aG9kIFBsdWctaW5zCi1leHBvcnRNZXRob2RQbHVnaW5zPUV4cG9ydCBvbmUgb3IgbW9yZSBtZXRob2QgcGx1Zy1pbnMuCi0KLQotCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NWZkM2ExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZCIKLSAgICAgICAgICAgIGljb249Ii9pY29ucy9jb25maWd1cmF0aW9uLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVleHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLkV4cG9ydFBsdWdpbldpemFyZCIKLSAgICAgICAgICAgIGljb249Ii9pY29ucy9NZXRob2RQbHVnaW4uZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5FeHBvcnRQbHVnaW5XaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlZXhwb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPiAKLSAgICAgICAgICAgICAgICVleHBvcnRNZXRob2RQbHVnaW5zCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+IAotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZCIvPgotICAgICAgPHdpemFyZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLkV4cG9ydFBsdWdpbldpemFyZCIvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydE9wdGlvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9FeHBvcnRPcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcyMTNiNDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydE9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogVGhlIGV4cG9ydCBvcHRpb25zLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE9wdGlvbnMgewotCi0JcHJvdGVjdGVkIEZpbGUgZXhwb3J0RGlyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0T3B0aW9ucygpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNlbGVjdGVkIGV4cG9ydCBkaXJlY3RvcnkuCi0JICogCi0JICogQHJldHVybiBhIGRpcmVjdG9yeSBmb3Igc3RvcmluZyB0aGUgZXhwb3J0ZWQgY29udGVudAotCSAqLwotCXB1YmxpYyBGaWxlIGdldEV4cG9ydERpcigpIHsKLQkJcmV0dXJuIGV4cG9ydERpcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB1c2VyIHNlbGVjdGVkIGV4cG9ydCBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGV4cG9ydERpcgotCSAqICAgICAgICAgICAgYSBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgdGhlIGV4cG9ydGVkIGNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBvcnREaXIoRmlsZSBleHBvcnREaXIpIHsKLQkJdGhpcy5leHBvcnREaXIgPSBleHBvcnREaXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvRXhwb3J0UGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvRXhwb3J0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5OTY4NzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0KLS8qKgotICogVGhlIEV4cG9ydCBwbHVnaW4gY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEV4cG9ydFBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBFeHBvcnRQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmNvcmUucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuY29yZS5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4cG9ydFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFByb2Nlc3NPcHRpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvRXhwb3J0UHJvY2Vzc09wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2M4NTk5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvRXhwb3J0UHJvY2Vzc09wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIFRoZSBleHBvcnQgcHJjb2VzcyBvcHRpb25zLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFByb2Nlc3NPcHRpb25zIGV4dGVuZHMgRXhwb3J0T3B0aW9ucyB7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHVibGlzaFdlYlNpdGU7Ci0KLQlwcml2YXRlIFB1Ymxpc2hPcHRpb25zIHB1Ymxpc2hpbmdPcHRpb25zOwotCi0JcHJpdmF0ZSBib29sZWFuIGV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRQcm9jZXNzT3B0aW9ucygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCBleHBvcnQgdGhlIHByb2Nlc3MuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCBleHBvcnQgdGhlIHByb2Nlc3MuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBwcm9jZXNzIHdlYiBzaXRlIG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9jZXNzIHdlYiBzaXRlIHNob3VsZCBiZSBwdWJsaXNoZWQKLQkgKiAgICAgICAgIGFzIHBhcnQgb2YgdGhlIGV4cG9ydCBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRQdWJsaXNoV2ViU2l0ZSgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hXZWJTaXRlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggcHJvY2VzcyB3ZWIgc2l0ZSBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIHB1Ymxpc2hXZWJTaXRlCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcHVibGlzaCB0aGUgcHJvY2VzcyB3ZWIgc2l0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hXZWJTaXRlKGJvb2xlYW4gcHVibGlzaFdlYlNpdGUpIHsKLQkJdGhpcy5wdWJsaXNoV2ViU2l0ZSA9IHB1Ymxpc2hXZWJTaXRlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcHVibGlzaCB0aGUgcHJvY2VzcwotCSAqICAgICAgICAgd2ViIHNpdGUKLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wdGlvbnMgZ2V0UHVibGlzaGluZ09wdGlvbnMoKSB7Ci0JCXJldHVybiBwdWJsaXNoaW5nT3B0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMuCi0JICogCi0JICogQHBhcmFtIHB1Ymxpc2hpbmdPcHRpb25zCi0JICogICAgICAgICAgICB0aGUgcHVibGlzaGluZyBvcHRpb25zIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHB1Ymxpc2ggdGhlCi0JICogICAgICAgICAgICBwcm9jZXNzIHdlYiBzaXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaGluZ09wdGlvbnMoUHVibGlzaE9wdGlvbnMgcHVibGlzaGluZ09wdGlvbnMpIHsKLQkJdGhpcy5wdWJsaXNoaW5nT3B0aW9ucyA9IHB1Ymxpc2hpbmdPcHRpb25zOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGV4cG9ydCBvbmx5IHBsYW5uZWQgV0JTIGVsZW1lbnRzIG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIG9ubHkgcGxhbm5lZCBXQlMgZWxlbWVudHMgc2hvdWxkIGJlCi0JICogICAgICAgICBleHBvcnRlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFeHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzKCkgewotCQlyZXR1cm4gZXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBleHBvcnQgb25seSBwbGFubmVkIFdCUyBlbGVtZW50cyBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIGV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHMKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBleHBvcnQgb25seSBwbGFubmVkIFdCUyBlbGVtZW50cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHMoCi0JCQlib29sZWFuIGV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHMpIHsKLQkJdGhpcy5leHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzID0gZXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50czsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9FeHBvcnRSZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9FeHBvcnRSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGI0ZDU2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvRXhwb3J0UmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBFeHBvcnRSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVwZi5leHBvcnQuUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEV4cG9ydFJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0Q29uZmlnV2l6YXJkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEV4cG9ydFR5cGVQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEV4cG9ydFR5cGVQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdTcGVjc0xhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb25maWdQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnUGFnZV9jb25maWdzTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb25maWdTcGVjc1BhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrQ29uZmlnUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0NvbmZpZ1BhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3REZXN0aW5hdGlvblBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RGVzdGluYXRpb25QYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0UGx1Z2luc1dpemFyZF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQbHVnaW5zUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQbHVnaW5zUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFBsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldmlld1BsdWdpbnNQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldmlld1BsdWdpbnNQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV2aWV3UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV2aWV3UGx1Z2luc1BhZ2VfZGVwZW5kZW50UGx1Z2luc0xhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV2aWV3UGx1Z2luc1BhZ2VfYXNzb2NpYXRlZENvbmZpZ3NMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2Vfbm9QbHVnaW5fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzcGVjaWZ5UGF0aFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3BlY2lmeVBhdGhQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZVBsdWdpblBhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBvcnRQbHVnaW5XaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0UGx1Z2luRXJyb3JfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhbmFseXppbmdDb25maWdUYXNrX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2VfTVNHMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9jaGVja2luZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9icm93c2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2RlZmF1bHRfZGlyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGlyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydFBsdWdpbldpemFyZF9lcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXN0aW5hdGlvbkNvbW1vblBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzdGluYXRpb25Db21tb25QYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGx1Z2luRXhwb3J0U2VydmljZV9NU0cwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGx1Z2luRXhwb3J0U2VydmljZV9NU0czOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlTGlicmFyeVBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZVBsdWdpblBhZ2VfbGFiZWxfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlTGlicmFyeVBhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBvcnRQbHVnaW5XaXphcmRfTVNHMTsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEV4cG9ydFJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWM2NjE3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIwotIyBNZXNzYWdlIElEIFJhbmdlOiBJVVBFMDAwMEUgLSBJVVBFMDA5OUUKLSMKLQotIyBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZAotZXhwb3J0Q29uZmlnV2l6YXJkX3RpdGxlPUV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX3RpdGxlPVNlbGVjdCBleHBvcnQgdHlwZQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYz1TZWxlY3QgdGhlIHR5cGUgb2YgbGlicmFyeSBjb25maWd1cmF0aW9uIHRvIGV4cG9ydC4KLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ0xhYmVsX3RleHQ9RXhwb3J0IGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gYW5kIGFsbCBpdHMgbWV0aG9kIHBsdWctaW5zCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdTcGVjc0xhYmVsX3RleHQ9RXhwb3J0IG9uZSBvciBtb3JlIG1ldGhvZCBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb25zCi1zZWxlY3RDb25maWdQYWdlX3RpdGxlPVNlbGVjdCBtZXRob2QgY29uZmlndXJhdGlvbgotc2VsZWN0Q29uZmlnUGFnZV9kZXNjPVNlbGVjdCBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHRvIGV4cG9ydC4gQWxsIHJlZmVyZW5jZWQgbWV0aG9kIHBsdWctaW5zIGluIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGV4cG9ydC4KLXNlbGVjdENvbmZpZ1BhZ2VfY29uZmlnc0xhYmVsX3RleHQ9TWV0aG9kIGNvbmZpZ3VyYXRpb25zOgotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX3RpdGxlPVNlbGVjdCBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb25zCi1zZWxlY3RDb25maWdTcGVjc1BhZ2VfZGVzYz1TZWxlY3Qgb25lIG9yIG1vcmUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdG9ucyB0byBleHBvcnQuCi1zZWxlY3RDb25maWdTcGVjc1BhZ2VfY29uZmlnc0xhYmVsX3RleHQ9TWV0aG9kIGNvbmZpZ3VyYXRpb25zOgotY2hlY2tDb25maWdQYWdlX3RpdGxlPVJldmlldyBjb25maWd1cmF0aW9uIGVycm9ycwotY2hlY2tDb25maWdQYWdlX2Rlc2M9QW4gaW50ZWdyaXR5IGNoZWNrIGhhcyBiZWVuIHBlcmZvcm1lZCBvbiB0aGUgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uIFJldmlldyB0aGUgZXJyb3IgcmVwb3J0IGFuZCBwZXJmb3JtIHRoZSBuZWNlc3NhcnkgY29ycmVjdGl2ZSBhY3Rpb25zLgotc2VsZWN0RGVzdGluYXRpb25QYWdlX3RpdGxlPVNwZWNpZnkgZXhwb3J0IGRpcmVjdG9yeQotc2VsZWN0RGVzdGluYXRpb25QYWdlX2Rlc2M9U3BlY2lmeSBhIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB0byBzdG9yZSB0aGUgZXhwb3J0ZWQgY29uZmlndXJhdGlvbi4KLQotIyBFeHBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZAotZXhwb3J0UGx1Z2luc1dpemFyZF90aXRsZT1FeHBvcnQgTWV0aG9kIFBsdWctaW5zCi1zZWxlY3RQbHVnaW5zUGFnZV90aXRsZT1TZWxlY3QgbWV0aG9kIHBsdWctaW5zCi1zZWxlY3RQbHVnaW5zUGFnZV9kZXNjPVNlbGVjdCBvbmUgb3IgbW9yZSBtZXRob2QgcGx1Zy1pbnMgdG8gZXhwb3J0Lgotc2VsZWN0UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQ9TWV0aG9kIHBsdWctaW5zOgotcmV2aWV3UGx1Z2luc1BhZ2VfdGl0bGU9UmV2aWV3IGRlcGVuZGVuY2llcwotcmV2aWV3UGx1Z2luc1BhZ2VfZGVzYz1TZWxlY3QgZWFjaCBtZXRob2QgcGx1Zy1pbiB0byByZXZpZXcgaXRzIGRlcGVuZGVuY2llcy4gQ2xpY2sgQmFjayB0byBzZWxlY3QgdGhlIGRlcGVuZGVudCBwbHVnLWlucyBpZiB0aGV5IG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGV4cG9ydC4KLXJldmlld1BsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0PU1ldGhvZCBQbHVnLWluczoKLXJldmlld1BsdWdpbnNQYWdlX2RlcGVuZGVudFBsdWdpbnNMYWJlbF90ZXh0PURlcGVuZGVudCBtZXRob2QgcGx1Zy1pbnM6Ci1yZXZpZXdQbHVnaW5zUGFnZV9hc3NvY2lhdGVkQ29uZmlnc0xhYmVsX3RleHQ9QXNzb2NpYXRlZCBtZXRob2QgY29uZmlndXJhdGlvbnM6Ci1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV90aXRsZT1Db25maXJtIGV4cG9ydAotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfZGVzYz1Db25maXJtIHRoZSBtZXRob2QgcGx1Zy1pbnMgdGhhdCB3aWxsIGJlIGV4cG9ydGVkLgotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2Vfbm9QbHVnaW5fdGV4dD1ObyBtZXRob2QgcGx1Zy1pbiBoYXMgYmVlbiBzZWxlY3RlZC4KLXNwZWNpZnlQYXRoUGFnZV90aXRsZT1TcGVjaWZ5IGV4cG9ydCBkaXJlY3RvcnkKLXNwZWNpZnlQYXRoUGFnZV9kZXNjPVNwZWNpZnkgYSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgdG8gc3RvcmUgdGhlIGV4cG9ydGVkIG1ldGhvZCBwbHVnLWlucy4KLVNhdmVQbHVnaW5QYWdlX2Rlc2M9RXhwb3J0IHRoZSBzZWxlY3RlZCBQbHVnaW5zIGFuZCBDb25maWd1cmF0aW9ucyB0byB0aGUgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KLUV4cG9ydFBsdWdpbldpemFyZF90aXRsZT1FeHBvcnQgTWV0aG9kIFBsdWctaW4gV2l6YXJkIEVycm9yCi1FeHBvcnRQbHVnaW5FcnJvcl9tc2c9SVVQRTAwMDBFOiBFcnJvciBlbmNvdW50ZXJlZCBpbiBleHBvcnRpbmcKLQotIyBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIEVycm9yIERpYWxvZwotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9RXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbgotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfbXNnPUlVUEUwMDAxRTogVGhlIGV4cG9ydCBvcGVyYXRpb24gY2Fubm90IHByb2NlZWQuCi0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMKLWFuYWx5emluZ0NvbmZpZ1Rhc2tfbmFtZT1BbmFseXppbmcgbGlicmFyeSBjb25maWd1cmF0aW9uLi4uCi0KLSMgVGhlIGZvbGxvd2luZyBtZXNzYWdlcyBoYXZlIG5vdCBiZWVuIHJldmlld2VkLgotQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cwPUV4cG9ydGluZyBjb25maWd1cmF0aW9uLi4uCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzE9RXhwb3J0IGRvbmUuCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8xPUNoZWNraW5nIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24uLi5cbgotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMj1ObyBjb25pZ3VyYXRpb24gc2VsZWN0ZWQuXG4KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzM9VGhlcmUgaXMgbm8gcHJvYmxlbSBpbiB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbi5cbgotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfND1UaGVyZSBhcmUgezB9IHByb2JsZW1zIGluIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uLiBcbllvdSBjYW4gb3BlbiB0aGUgY29uZmlndXJhdGlvbiBlZGl0b3IgYW5kIGZpeCB0aG9zZSBwcm9ibGVtcy4gXG5PciB5b3UgY2FuIGNob29zZSB0byBpZ25vcmUgdGhlc2UgcHJvYmxlbXMgYW5kIGNvbnRpbnVlLgotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX2NoZWNraW5nPUNoZWNraW5nIGNvbmZpZ3VyYXRpb24sIHBsZWFzZSB3YWl0Li4uCi1FeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlX3RpdGxlPUNob29zZSBNZXRob2QgQ29uZmlndXJhdGlvbgotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Jyb3dzZT1Ccm93c2UuLi4KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9kZWZhdWx0X2Rpcj1Vc2UgZGVmYXVsdCBkaXJlY3RvcnkKLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzA9RXhwb3J0aW5nIGNvbmZpZ3VyYXRpb24uLi4KLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzI9SVVQRTAwMDJFOiBFeHBvcnQgZmFpbGVkOiBFcnJvciBsb2FkaW5nIGxpYnJhcnkKLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzQ9SVVQRTAwMDNFOiBFeHBvcnQgZmFpbGVkOiBFcnJvciBjb3B5aW5nIGxpYnJhcnkKLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzE9SVVQRTAwMDRFOiBFeHBvcnQgZmFpbGVkOiBFcnJvciBtYWtpbmcgbGlicmFyeSBjb25maWd1cmF0aW9uIGNsb3N1cmUKLUNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzk9SVVQRTAwMDVFOiBFeHBvcnQgZmFpbGVkOiBFcnJvciBzYXZpbmcgbGlicmFyeQotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX25hbWU9TmFtZToKLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9kaXI9RGlyZWN0b3J5OgotRXhwb3J0UGx1Z2luV2l6YXJkX2Vycm9yPUVycm9yCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfdGl0bGU9RGVmYXVsdCBUaXRsZQotRGVzdGluYXRpb25Db21tb25QYWdlX2Rlc2M9RGVmYXVsdCBkZXNjcmlwdGlvbjoKLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMD1FeHBvcnRpbmcgcGx1Zy1pbnMuLi4KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMT1DcmVhdGluZyBleHBvcnQgZGlyZWN0b3J5Li4uCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzI9Q29weWluZyBmaWxlcy4uLgotUGx1Z2luRXhwb3J0U2VydmljZV9NU0czPUdlbmVyYXRpbmcgbGlicmFyeSBhbmQgcmVzb3VyY2UgZmlsZS4uLgotUGx1Z2luRXhwb3J0U2VydmljZV9NU0c0PUV4cG9ydCBkb25lLgotU2F2ZUxpYnJhcnlQYWdlX3RpdGxlPUV4cG9ydCBNZXRob2QgUGx1Zy1pbgotU2F2ZVBsdWdpblBhZ2VfbGFiZWxfbmFtZT1FeHBvcnQgbmFtZToKLVNhdmVMaWJyYXJ5UGFnZV9kZXNjPUV4cG9ydCB0aGUgc2VsZWN0ZWQgbWV0aG9kIHBsdWctaW5zIGFuZCBhc3NvY2lhdGVkIGNvbmZpZ3VyYXRpb25zCi1FeHBvcnRQbHVnaW5XaXphcmRfTVNHMT1BbmFseXppbmcgbGlicmFyeSBjb25maWd1cmF0aW9uLi4uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjNiNmFhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGFjdGl2YXRvciBmb3IgbWFuYWdpbmcgdGhlIEV4cG9ydCBwbHVnLWluJ3MgbGlmZSBjeWNsZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQmFzZUV4cG9ydFNlcnZpY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9CYXNlRXhwb3J0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNjgwNzFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9CYXNlRXhwb3J0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHRoZSBFeHBvcnQgU2VydmljZS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUV4cG9ydFNlcnZpY2UgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXhwb3J0RmlsZSA9ICJleHBvcnQueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgbGlicmFyeUZpbGUgPSAibGlicmFyeS54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgTGlzdCBzZWxlY3RlZElkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBMaXN0IHNlbGVjdGVkUGx1Z2luTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0lkU2VsZWN0ZWQoU3RyaW5nIHVyaSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc2VsZWN0ZWRJZHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJaWYgKHVyaS5pbmRleE9mKGlkKSA+PSAwKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU2VsZWN0ZWRQbHVnaW5SZXNvdXJjZShTdHJpbmcgdXJpKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBzZWxlY3RlZFBsdWdpbk5hbWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBwbHVnaW5fbmFtZSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCWlmICh1cmkuc3RhcnRzV2l0aChwbHVnaW5fbmFtZSArICIvIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Jlc291cmNlU2VsZWN0ZWQoU3RyaW5nIHVyaSkgewotCQlpZiAoaXNJZFNlbGVjdGVkKHVyaSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBpc1NlbGVjdGVkUGx1Z2luUmVzb3VyY2UodXJpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlicmFyeURvY3VtZW50IHByb2Nlc3NMaWJyYXJ5RmlsZShGaWxlIHNvdXJjZSwgRmlsZSB0YXJnZXQpIHsKLQkJdHJ5IHsKLQkJCUxpYnJhcnlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBMaWJyYXJ5RG9jdW1lbnQoc291cmNlKTsKLQotCQkJLy8gUmVsb2FkIHRoZSBlbGVtZW50IG1hcHBpbmcuCi0JCQlOb2RlTGlzdCBub2RlcyA9IGRvY3VtZW50LmdldFBsdWdpbnMoKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgbm9kZXMuZ2V0TGVuZ3RoKCkpIHsKLQkJCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCQlTdHJpbmcgdXJpID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfaHJlZik7Ci0JCQkJaWYgKCFpc0lkU2VsZWN0ZWQodXJpKSkgewotCQkJCQlkb2N1bWVudC5yZW1vdmVQbHVnaW4obm9kZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gUmVtb3ZlIHRoZSB1bm5lZWRlZCBjb25maWd1cmF0aW9ucy4KLQkJCW5vZGVzID0gZG9jdW1lbnQuZ2V0Q29uZmlndXJhdGlvbnMoKTsKLQkJCWkgPSAwOwotCQkJd2hpbGUgKGkgPCBub2Rlcy5nZXRMZW5ndGgoKSkgewotCQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJCQotCQkJCS8vIDE0MjM3OSAtIHVwZGF0ZSBwbHVnaW4gaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgdG8gbWF0Y2ggd2l0aCB0aGUgbmV3IGZpbGUgZm9ybWF0Ci0JCQkJLy8gY29uZmlndXJhdGlvbiBpcyBzYXZlZCBhcyBzZXBlcmF0ZSByZXNvdXJjZSBzaW5jZSAxLjBtMwotCQkJCVN0cmluZyB1cmkgPSBub2RlLmdldEF0dHJpYnV0ZShMaWJyYXJ5RG9jdW1lbnQuQVRUUl9ocmVmKTsKLQkJCQlpZiAoIWlzSWRTZWxlY3RlZCh1cmkpKSB7Ci0JCQkJCWRvY3VtZW50LnJlbW92ZUNvbmZpZ3VyYXRpb24obm9kZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gUmVsb2FkIHRoZSBlbGVtZW50IG1hcHBpbmcuCi0JCQlub2RlcyA9IGRvY3VtZW50LmdldFJlc291cmNlRGVzY3JpcHRvcnMoKTsKLQkJCWkgPSAwOwotCQkJd2hpbGUgKGkgPCBub2Rlcy5nZXRMZW5ndGgoKSkgewotCQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJCVN0cmluZyBpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX2lkKTsKLQkJCQlTdHJpbmcgdXJpID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfdXJpKTsKLQkJCQlpZiAoIWlzSWRTZWxlY3RlZChpZCkKLQkJCQkJCSYmICFpc1Jlc291cmNlU2VsZWN0ZWQoVVJMRGVjb2Rlci5kZWNvZGUodXJpLCAiVVRGLTgiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlkb2N1bWVudC5yZW1vdmVSZXNvdXJjZURlc2NyaXB0b3Iobm9kZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQotCQkJbm9kZXMgPSBkb2N1bWVudC5nZXRSZXNvdXJjZVN1Yk1hbmFnZXJzKCk7Ci0JCQlpID0gMDsKLQkJCXdoaWxlIChpIDwgbm9kZXMuZ2V0TGVuZ3RoKCkpIHsKLQkJCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCQlTdHJpbmcgdXJpID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfaHJlZik7Ci0JCQkJaWYgKCFpc1Jlc291cmNlU2VsZWN0ZWQodXJpKSkgewotCQkJCQlkb2N1bWVudC5yZW1vdmVSZXNvdXJjZURlc2NyaXB0b3Iobm9kZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQotCQkJTGlzdCBwbHVnaW5MaXN0ID0gIExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKQotCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJCWRvY3VtZW50LnN0b3JlRXh0cmFJbmZvKHBsdWdpbkxpc3QpOwotCQkJCi0JCQlkb2N1bWVudC5zYXZlQXModGFyZ2V0LmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQotCQkJcmV0dXJuIGRvY3VtZW50OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uRXhwb3J0RGF0YS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25FeHBvcnREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ1YmY5ZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25FeHBvcnREYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkxpYnJhcnlMb2NhdGlvbkRhdGE7Ci0KLQotLyoqCi0gKiBFbmNhcHN1bGF0ZXMgdGhlIGlucHV0IGRhdGEgcmVxdWlyZWQgdG8gZXhwb3J0IGEgbGlicmFyeSBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgewotCi0JcHVibGljIGJvb2xlYW4gZXhwb3J0T25lQ29uZmlnOwotCi0JcHVibGljIGJvb2xlYW4gZXhwb3J0Q29uZmlnU3BlY3M7Ci0KLQlwdWJsaWMgTGlzdCBzZWxlY3RlZENvbmZpZ3M7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgdGhlIGJyb2tlbiByZWZlcmVuY2VzIHNob3VsZCBiZSByZW1vdmVkIG9yIG5vdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVCcm9rZW5SZWZlcmVuY2VzID0gZmFsc2U7Ci0KLQlwdWJsaWMgTGlicmFyeUxvY2F0aW9uRGF0YSBsbERhdGEgPSBudWxsOwotCi0JcHVibGljIFN0cmluZyBlcnJvck1zZyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmVzIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSgpIHsKLQkJbGxEYXRhID0gbmV3IExpYnJhcnlMb2NhdGlvbkRhdGEoKTsKLQkJbGxEYXRhLmxvYWRGcm9tUHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgYXR0cmlidXRlCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjhlNDg4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUNvbmZpZ3VyYXRpb25DbG9zdXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5TWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIEV4cG9ydHMgYSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGNsdWRlcyA9ICIuY29weWFyZWEuZGF0LCAqKi8uY29weWFyZWEuZGF0LCAuY29weWFyZWEuZGIsICoqLy5jb3B5YXJlYS5kYiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZShDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCQotCS8qKgotCSAqIFJ1biB0byBleHBvcnQgYSBjb25maWd1cmF0aW9uIGNsb3N1cmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZGF0YS5zZWxlY3RlZENvbmZpZ3MgPT0gbnVsbAotCQkJCQl8fCBkYXRhLnNlbGVjdGVkQ29uZmlncy5zaXplKCkgPT0gMCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCW1vbml0b3Iuc2V0VGFza05hbWUoRXhwb3J0UmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzApOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZXhwb3J0TGliUGF0aCA9IGRhdGEubGxEYXRhLmdldFBhcmVudEZvbGRlcigpOwotCQkJRmlsZSBleHBvcnRMaWJGb2xkZXIgPSBuZXcgRmlsZShleHBvcnRMaWJQYXRoKTsKLQkJCWlmICghZXhwb3J0TGliRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJZXhwb3J0TGliRm9sZGVyLm1rZGlyKCk7Ci0JCQl9Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBkYXRhLnNlbGVjdGVkQ29uZmlncwotCQkJCQkuZ2V0KDApOwotCQkJZXhwb3J0Q29uZmlnKGNvbmZpZy5nZXROYW1lKCksIGV4cG9ydExpYkZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSwKLQkJCQkJbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhwb3J0IGEgY29uZmlndXJhdGlvbiBjbG9zdXJlCi0JICovCi0JcHVibGljIHZvaWQgZXhwb3J0Q29uZmlnKFN0cmluZyBzZWxlY3RlZENvbmZpZ05hbWUsIFN0cmluZyBmaWxlUGF0aCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gbmVlZCB0byBkaXNhYmxlIHRoZSB3b3Jrc3BhY2UgcmVmcmVzaGluZwotCQlib29sZWFuIHJlZnJlc2ggPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuaXNFbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlpZiAocmVmcmVzaCkgewotCQkJCS8vIGRpc2FibGUgcmVzb3VyY2UgcmVmcmVzaGluZyBkdXJpbmcgaW1wb3J0Ci0JCQkJLy8KLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQlkb0VleHBvcnRDb25maWcoc2VsZWN0ZWRDb25maWdOYW1lLCBmaWxlUGF0aCwgbW9uaXRvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVmcmVzaCkgewotCQkJCS8vIHJlLWVuYWJsZSByZXNvdXJjZSByZWZyZXNoaW5nCi0JCQkJLy8KLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkb0VleHBvcnRDb25maWcoU3RyaW5nIHNlbGVjdGVkQ29uZmlnTmFtZSwgU3RyaW5nIGZpbGVQYXRoLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlNZXRob2RMaWJyYXJ5IGN1cnJlbnRMaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkJdHJ5IHsKLQkJCS8vIExvYWQgdGhlIHdob2xlIE1ldGhvZCBMaWJyYXJ5LgotCQkJTGlicmFyeVV0aWwubG9hZEFsbChjdXJyZW50TGliKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCUV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCSJFcnJvciBsb2FkaW5nIGxpYnJhcnkiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJZGF0YS5lcnJvck1zZyA9IEV4cG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cyOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBDb3B5IHRoZSBjdXJyZW50IGxpYnJhcnkgdG8gYSBuZXcgbGlicmFyeSwKLQkJLy8gc2luY2Ugd2UgbmVlZCB0byBtYWtlIGNoYW5nZXMgd2hlbiBwYWNrYWdpbmcgdGhlIG5ldyBsaWJyYXJ5LgotCQlNZXRob2RMaWJyYXJ5IG5ld0xpYnJhcnkgPSBudWxsOwotCQl0cnkgewotCQkJbmV3TGlicmFyeSA9IChNZXRob2RMaWJyYXJ5KSBFY29yZVV0aWwuY29weShjdXJyZW50TGliKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCUV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlkYXRhLmVycm9yTXNnID0gRXhwb3J0UmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzQ7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCUlDb25maWd1cmF0aW9uQ2xvc3VyZSBjbG9zdXJlID0gbnVsbDsKLQkJSUxpYnJhcnlNYW5hZ2VyIGxpYk1nciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBEZXRhY2ggdGhlIG5ldyBsaWJyYXJ5IGZyb20gdGhlIGN1cnJlbnQgcmVzb3VyY2Ugc28gaXQgY2FuIGJlCi0JCQkvLyBhZGRlZCB0byBhIG5ldyBMaWJyYXJ5IFByb2Nlc3NvciBpbnN0YW5jZS4KLQkJCUxpYnJhcnlVdGlsLmRldGFjaEZyb21SZXNvdXJjZShuZXdMaWJyYXJ5KTsKLQotCQkJLy8gQ3JlYXRlIGEgbmV3IExpYnJhcnkgTWFuYWdlciBhbmQgY3JlYXRlIGEgbmV3IHJlc291cmNlIGZvciB0aGUKLQkJCS8vIG5ldyBsaWJyYXJ5LgotCQkJLy8gVE9ETzogVXBkYXRlIHRoZSBVSSB0byBwcm9tcHQgZm9yIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlLgotCQkJTWFwIHBhcmFtcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlwYXJhbXMucHV0KCJsaWJyYXJ5LnBhdGgiLCBmaWxlUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJLy8gdGhpcyB3aWxsIG5vdCB3b3JrIHNpbmNlIHRoaXMgd2lsbCBtZXNzIHVwIHRoZSBtYWluIGxpYnJhcnkKLQkJCS8vIEppbmh1YSBYaSAwNy8xMy8wNgotLy8JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0vLwkJCQkJLmNyZWF0ZU1ldGhvZExpYnJhcnkoImxpYnJhcnkueG1pIiwgInhtaSIsIHBhcmFtcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotLy8JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlcGxhY2VNZXRob2RMaWJyYXJ5KGxpYnJhcnksCi0vLwkJCQkJbmV3TGlicmFyeSk7Ci0vLwkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2V0Q3VycmVudE1ldGhvZExpYnJhcnkobmV3TGlicmFyeSk7Ci0KLQkJCVN0cmluZyBuYW1lID0gImxpYnJhcnkueG1pIjsJLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHR5cGUgPSAieG1pIjsJCS8vJE5PTi1OTFMtMSQKLQkJCWxpYk1nciA9IExpYnJhcnlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpCi0JCQkJLmNyZWF0ZUxpYnJhcnlNYW5hZ2VyKHR5cGUpOwkKLQkJCWxpYk1nci5jcmVhdGVNZXRob2RMaWJyYXJ5KG5hbWUsIHBhcmFtcyk7Ci0JCQlsaWJNZ3Iuc2V0TWV0aG9kTGlicmFyeShuZXdMaWJyYXJ5KTsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2V0TGlicmFyeU1hbmFnZXIobGliTWdyKTsKLQkJCQotCQkJLy8gQmVnaW4gcGFja2FnaW5nIHRoZSBuZXcgbGlicmFyeSBmb3IgZXhwb3J0LgotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24obmV3TGlicmFyeSwgc2VsZWN0ZWRDb25maWdOYW1lKTsKLQotCQkJLy8gVmFsaWRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIG1ha2Ugc3VyZSB0aGUgZ2xvYmFsIHBhY2thZ2VzIGFyZQotCQkJLy8gc2VsZWN0ZWQuIElmIGdsb2JhbCBwYWNrYWdlcyBhcmUgbWlzc2luZywgdGhlIGV4cG9ydGVkIGxpYnJhcnkKLQkJCS8vIGNhbid0IGJlIGxvYWRlZC4KLQkJCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCi0JCQljbG9zdXJlID0gbmV3IENvbmZpZ3VyYXRpb25DbG9zdXJlKGNvbmZpZyk7Ci0JCQljbG9zdXJlLnBhY2thZ2VMaWJyYXJ5KGRhdGEucmVtb3ZlQnJva2VuUmVmZXJlbmNlcyk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkiRXJyb3IgbWFraW5nIGxpYnJhcnkgY29uZmlndXJhdGlvbiBjbG9zdXJlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRhdGEuZXJyb3JNc2cgPSBFeHBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoY2xvc3VyZSAhPSBudWxsKQotCQkJCWNsb3N1cmUuZGlzcG9zZSgpOwotCQkJaWYgKCBsaWJNZ3IgIT0gbnVsbCApIHsKLQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpYnJhcnlNYW5hZ2VyKGxpYk1ncik7Ci0JCQkJbGliTWdyLmNsb3NlTWV0aG9kTGlicmFyeSgpOwotCQkJCWxpYk1nci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybjsKLQkJfQotCi0JCXRyeSB7Ci0JCQlMaWJyYXJ5VXRpbC5zYXZlQWxsKG5ld0xpYnJhcnkpOwotCi0JCQkvLyB0aGUgZmlyc3Qgcm91bmQgb2Ygc2F2ZSB3aWxsIGNyZWF0ZSB0aGUgcmVzb3VyY2Ugc3RydWN0dXJlLAotCQkJLy8gbmVlZCB0byBzYXZlIGFnYWluIHRvIG1ha2Ugc3VyZSBhbGwgcmVmZXJlbmNlcyBhcmUgc2F2ZWQuCi0JCQkvLyBUaGlzIHN0ZXAgaXMgY3JpdGljYWwgc2luY2UgdGhlIGZpcnN0IHJvdW5kIG9ubHkgY3JlYXRlZCB0aGUgZGF0YQotCQkJLy8gc3RydWN0dXJlCi0JCQkvLyBzb21lIG9mIHRoZSBjcm9zcy1yZWZlcmVuY2VkIGVsZW1lbnRzIG1pZ2h0IGJlIGxvc3Qgb24gdGhlIGZpcnN0Ci0JCQkvLyBzYXZpbmcKLQkJCS8vIGZvciBleGFtcGxlLCB3aGVuIGNyZWF0ZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHdpdGggcmVmZXJlbmNlcwotCQkJLy8gdG8gYSBuZXcgcGx1Z2luLAotCQkJLy8gd2hpY2ggYXJlIG5vdCBzYXZlZCB5ZXQsIHRob3NlIHJlZmVyZW5jZXMgd2lsbCBiZSBsb3N0LgotCQkJLy8gMTQ1ODkxIC0gSW1wb3J0IENvbmZpZ3VyYXRpb246IGRlZmF1bHQgY29uZmlnIGlzIGxvc3MgYWZ0ZXIKLQkJCS8vIGltcG9ydAotCQkJTGlicmFyeVV0aWwuc2F2ZUFsbChuZXdMaWJyYXJ5KTsKLQotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJIkVycm9yIHNhdmluZyBsaWJyYXJ5IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRhdGEuZXJyb3JNc2cgPSBFeHBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHOTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoY2xvc3VyZSAhPSBudWxsKQotCQkJCWNsb3N1cmUuZGlzcG9zZSgpOwotCQkJaWYgKCBsaWJNZ3IgIT0gbnVsbCApIHsKLQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpYnJhcnlNYW5hZ2VyKGxpYk1ncik7Ci0JCQkJbGliTWdyLmNsb3NlTWV0aG9kTGlicmFyeSgpOwotCQkJCWxpYk1nci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBDb3B5IHRoZSByZXNvdXJjZSBmaWxlcyBpbiB0aGUgY3VycmVudCBsaWJyYXJ5IHRvIHRoZSBuZXcgbGlicmFyeS4KLQkJLy8gRm9yIHNpbXBsaWNpdHkgc2FrZSwgY29weSBhbGwgcmVzb3VyY2UgZmlsZXMgaWYgdGhlIGZpbGVzIGRvIG5vdAotCQkvLyBleGlzdCBpbiB0aGUgdGFyZ2V0IGxpYnJhcnkgb3IgaWYgdGhlIGZpbGVzIGFyZSBuZXdlcgotCQkvL1N0cmluZyBpbmNsdWRlcyA9ICJyZXNvdXJjZXMvKiosICoqL3Jlc291cmNlcy8qKiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGluY2x1ZGVzID0gInJlc291cmNlcy8qKiwgKiovcmVzb3VyY2VzLyoqLCAqKi9kaWFncmFtLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCQlGaWxlIHNyY0RpciA9IExpYnJhcnlVdGlsLmdldExpYnJhcnlSb290UGF0aChjdXJyZW50TGliKTsKLQkJRmlsZSBkZXN0RGlyID0gTGlicmFyeVV0aWwuZ2V0TGlicmFyeVJvb3RQYXRoKG5ld0xpYnJhcnkpOwotCi0JCUxheW91dFJlc291cmNlcy5jb3B5RGlyKHNyY0RpciwgZGVzdERpciwgaW5jbHVkZXMsIGV4Y2x1ZGVzKTsKLQotCQkvLyBDbG9zZSB0aGUgbmV3bHkgY3JlYXRlZCBsaWJyYXJ5LgotCQlpZiAoY2xvc3VyZSAhPSBudWxsKQotCQkJY2xvc3VyZS5kaXNwb3NlKCk7Ci0JCWlmICggbGliTWdyICE9IG51bGwgKSB7Ci0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpYnJhcnlNYW5hZ2VyKGxpYk1ncik7Ci0JCQlsaWJNZ3IuY2xvc2VNZXRob2RMaWJyYXJ5KCk7Ci0JCQlsaWJNZ3IuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25TcGVjLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvblNwZWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGFkZGM5OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvblNwZWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIE1vZGVscyBhIGxpYnJhcnkgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblNwZWMgewotCi0JcHVibGljIFN0cmluZyBuYW1lOwotCi0JcHVibGljIFN0cmluZyBndWlkOwotCi0JcHVibGljIFN0cmluZyB2ZXJzaW9uOwotCi0JcHVibGljIFN0cmluZyBicmllZl9kZXNjOwotCi0JcHVibGljIExpc3QgcGx1Z2luSWRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIExpc3QgcGFja2FnZUlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBMaXN0IHZpZXdJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uU3BlYygpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNWM2ZTcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotCi0vKioKLSAqIEV4cG9ydHMgYSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjIxNTMKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2UgZXh0ZW5kcyBCYXNlRXhwb3J0U2VydmljZSB7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlKENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGEpIHsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBSdW4gdG8gZXhwb3J0IGEgY29uZmlndXJhdGlvbiBzcGVjaWZpY2FpdG9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKGRhdGEuc2VsZWN0ZWRDb25maWdzID09IG51bGwgfHwgZGF0YS5zZWxlY3RlZENvbmZpZ3Muc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCW1vbml0b3Iuc2V0VGFza05hbWUoRXhwb3J0UmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2VfTVNHMCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgdGhlIGV4cG9ydCBsaWJyYXJ5IGZvbGRlci4KLQkJRmlsZSBsaWJGb2xkZXI7Ci0JCUZpbGUgZXhwb3J0TGliRm9sZGVyOwotCi0JCVN0cmluZyBleHBvcnRMaWJQYXRoID0gKG5ldyBGaWxlKGRhdGEubGxEYXRhLmdldFBhcmVudEZvbGRlcigpKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCWV4cG9ydExpYkZvbGRlciA9IG5ldyBGaWxlKGV4cG9ydExpYlBhdGgpOwotCQlpZiAoIWV4cG9ydExpYkZvbGRlci5leGlzdHMoKSkgewotCQkJZXhwb3J0TGliRm9sZGVyLm1rZGlyKCk7Ci0JCX0KLQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBkYXRhLnNlbGVjdGVkQ29uZmlncwotCQkJCS5nZXQoMCk7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gKE1ldGhvZExpYnJhcnkpIGNvbmZpZy5lQ29udGFpbmVyKCk7Ci0JCVVSSSB1cmkgPSBsaWIuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCVN0cmluZyBwYXRoID0gdXJpLnRvRmlsZVN0cmluZygpOwotCQlsaWJGb2xkZXIgPSAobmV3IEZpbGUocGF0aCkpLmdldFBhcmVudEZpbGUoKTsKLQotCQkvLyBQcmVwYXJlIHRoZSBpZCBzZWxlY3Rpb25zLAotCQlnZXRTZWxlY3RlZElkcyhkYXRhLnNlbGVjdGVkQ29uZmlncyk7Ci0KLQkJLy8gTG9hZCB0aGUgbGlicmFyeS54bWkgYW5kIHJlbW92ZSB1bm5lZWRlZCBlbGVtZW50cy4KLQkJTGlicmFyeURvY3VtZW50IGRvY3VtZW50ID0gcHJvY2Vzc0xpYnJhcnlGaWxlKG5ldyBGaWxlKGxpYkZvbGRlciwgbGlicmFyeUZpbGUpLCBuZXcgRmlsZSgKLQkJCQlleHBvcnRMaWJGb2xkZXIsIGV4cG9ydEZpbGUpKTsKLQotCQlpZiAoIGRvY3VtZW50ICE9IG51bGwgKSB7Ci0JCQkvLyBjb3B5IHRoZSBjb25pZnVyYXRpb24gZmlsZXMKLQkJCS8vIDE0MzAzMyAtIHVwZGF0ZSBjb25maWcgc3BlY3MnIGltcG9ydGluZyBhbmQgZXhwb3J0aW5nIHRvIG1hdGNoIHdpdGggdGhlIG5ldyBmaWxlIGZvcm1hdAotCQkJY29weUNvbmZpZ3VyYXRpb25GaWxlcyhkb2N1bWVudCwgbGliRm9sZGVyLCBleHBvcnRMaWJGb2xkZXIpOwotCQl9Ci0JCQotCQltb25pdG9yLnNldFRhc2tOYW1lKEV4cG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzEpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29weUNvbmZpZ3VyYXRpb25GaWxlcyhMaWJyYXJ5RG9jdW1lbnQgZG9jdW1lbnQsIEZpbGUgbGliRm9sZGVyLCBGaWxlIGV4cG9ydExpYkZvbGRlcikgewotCQkvLyAxNDMwMzMgLSB1cGRhdGUgY29uZmlnIHNwZWNzJyBpbXBvcnRpbmcgYW5kIGV4cG9ydGluZyB0byBtYXRjaCB3aXRoIHRoZSBuZXcgZmlsZSBmb3JtYXQKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuc2VsZWN0ZWRDb25maWdzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBndWlkID0gY29uZmlnLmdldEd1aWQoKTsKLQkJCVN0cmluZyB1cmkgPSBkb2N1bWVudC5nZXRSZXNvdXJjZVVyaShndWlkKTsKLQkJCWlmICh1cmkgPT0gbnVsbCkgewotCQkJCVVSSSByZXNVcmkgPSBjb25maWcuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQkJdXJpID0gTXVsdGlGaWxlU2F2ZVV0aWwuTUVUSE9EX0NPTkZJR1VSQVRJT05fRk9MREVSX05BTUUgKyBGaWxlLnNlcGFyYXRvciArIHJlc1VyaS5sYXN0U2VnbWVudCgpOwotCQkJCXVyaSA9IGRvY3VtZW50LmRlY29kZVVyaSh1cmkpOwotCQkJfQotCQkJaWYgKCB1cmkgIT0gbnVsbCApIHsKLQkJCQlGaWxlIHNyYyA9IG5ldyBGaWxlKGxpYkZvbGRlciwgdXJpKTsKLQkJCQlGaWxlIHRhcmdldCA9ICBuZXcgRmlsZShleHBvcnRMaWJGb2xkZXIsIHVyaSk7Ci0JCQkJUmVzb3VyY2VIZWxwZXIuY29weUZpbGUoc3JjLCB0YXJnZXQpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBnZXRTZWxlY3RlZElkcyhMaXN0IGNvbmZpZ3MpIHsKLQkJc2VsZWN0ZWRJZHMuY2xlYXIoKTsKLQkJc2VsZWN0ZWRQbHVnaW5OYW1lcy5jbGVhcigpOwotCi0JCS8vIEdldCBzZWxlY3RlZCBjb25maWcgaWRzLgotCQlpZiAoY29uZmlncyA9PSBudWxsIHx8IGNvbmZpZ3Muc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBjb25maWdzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBndWlkID0gY29uZmlnLmdldEd1aWQoKTsKLQkJCWlmIChzZWxlY3RlZElkcy5jb250YWlucyhndWlkKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvLyBBZGQgdGhlIGNvbmZpZ3VyYXRpb24uCi0JCQlzZWxlY3RlZElkcy5hZGQoZ3VpZCk7Ci0KLQkJCS8vIEZvciBlYWNoIGNvbmZpZ3VyYXRpb24sIHdlIG5lZWQgdG8gc2F2ZSB0aGUgbWV0aG9kIHBsdWdpbiBpZHMgYW5kCi0JCQkvLyBtZXRob2QgcGFja2FnZSBpZHMgc28gdGhhdCB0aGVpciBlbnRyaWVzIGluIHRoZSByZXNvdXJjZSBmaWxlIGNhbgotCQkJLy8gYmUga2VwdC4KLQkJCUxpc3QgcmVmcyA9IGNvbmZpZy5lQ3Jvc3NSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHJlZnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgbyA9IGl0ci5uZXh0KCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgbyBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJZ3VpZCA9ICgoTWV0aG9kRWxlbWVudCkgbykuZ2V0R3VpZCgpOwotCQkJCQlpZiAoIXNlbGVjdGVkSWRzLmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJCQlzZWxlY3RlZElkcy5hZGQoZ3VpZCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlFeHBvcnRQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJIlVuZXhwZWN0ZWQgZWxlbWVudCB0eXBlICciICsgKChNZXRob2RFbGVtZW50KSBvKS5nZXRUeXBlKCkuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyAiJyBpbiBjb25maWd1cmF0aW9uICciICsgY29uZmlnLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9EaWFncmFtSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0RpYWdyYW1IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJlYzg4NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0RpYWdyYW1IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGhhbmRsZSBkaWFncmFtIGV4cG9ydC9pbXBvcnQKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICoKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1IYW5kbGVyIHsKLQkKLQkvL1RvIGRvOiBuZWVkIHRvIGNvbnNpZGVyIGVsZW1lbnQgcmVuYW1lIGlzc3VlLiAKLQkvLwkJIC0+IFJlc292bGUgdGhlIGludm9sdmVkIGZpbGUgbmFtZXMgYWZ0ZXIgYWxsIHJlc291cmNlIG5hbWVzIGFyZSBzZXR0bGVkLgotCS8vCQkgLT4gTGV0IGEgc3ViIGNsYXNzIHRvIHRha2Ugb2YgaXQ/Ci0KLQlwcml2YXRlIEZpbGUgc291cmNlTGliUm9vdDsKLQlwcml2YXRlIEZpbGUgdGFyZ2V0TGliUm9vdDsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIE1hcEVudHJ5VmFsdWU+IGVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcEVudHJ5VmFsdWU+KCk7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOwotCQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwkKLQlwdWJsaWMgRGlhZ3JhbUhhbmRsZXIoRmlsZSBzb3VyY2VMaWJSb290LCBGaWxlIHRhcmdldExpYlJvb3QpIHsKLQkJdGhpcy5zb3VyY2VMaWJSb290ID0gc291cmNlTGliUm9vdDsKLQkJdGhpcy50YXJnZXRMaWJSb290ID0gdGFyZ2V0TGliUm9vdDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG5lZWRUb1Byb2Nlc3MoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCWJvb2xlYW4gYiA9IGVsZW0gaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybiB8fAotCQkJCQkJCQllbGVtIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzOwotCQlyZXR1cm4gYjsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW0pIHsKLQkJcmVnaXN0ZXJFbGVtZW50KGVsZW0sIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbSwgYm9vbGVhbiBwcm9jZXNzRW50cnkpIHsKLQkJaWYgKCEgbmVlZFRvUHJvY2VzcyhlbGVtKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChlbGVtZW50TWFwLmNvbnRhaW5zS2V5KGVsZW0uZ2V0R3VpZCgpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlNYXBFbnRyeVZhbHVlIG1hcEVudHJ5VmFsdWUgPSBuZXcgTWFwRW50cnlWYWx1ZSgpOwotCQltYXBFbnRyeVZhbHVlLmVsZW1lbnQgPSBlbGVtOwotCQllbGVtZW50TWFwLnB1dChlbGVtLmdldEd1aWQoKSwgbWFwRW50cnlWYWx1ZSk7CQkKLQkJCi0JCWlmIChwcm9jZXNzRW50cnkpIHsKLQkJCXByb2Nlc3NFbnRyeShlbGVtLCBtYXBFbnRyeVZhbHVlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwb3N0UmVnaXN0ZXJFbGVtZW50cygpIHsKLQkJZm9yIChJdGVyYXRvcjxNYXBFbnRyeVZhbHVlPiBpdCA9IGVsZW1lbnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwRW50cnlWYWx1ZSB2YWx1ZSA9IGl0Lm5leHQoKTsKLQkJCXByb2Nlc3NFbnRyeSh2YWx1ZS5lbGVtZW50LCB2YWx1ZSk7Ci0JCX0JCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NFbnRyeShNZXRob2RFbGVtZW50IGVsZW0sIE1hcEVudHJ5VmFsdWUgbWFwRW50cnlWYWx1ZSkgewotCQlGaWxlW10gZmlsZXMgPSBnZXRGaWxlcyhlbGVtKTsKLQkJRmlsZSBzb3VyY2VGaWxlID0gZmlsZXNbMF07Ci0JCUZpbGUgdGFyZ2V0RmlsZSA9IGZpbGVzWzFdOwotCi0JCWlmIChzb3VyY2VGaWxlICE9IG51bGwgJiYgc291cmNlRmlsZS5leGlzdHMoKSkgewotCQkJbWFwRW50cnlWYWx1ZS5zb3VyY2VGaWxlID0gc291cmNlRmlsZTsKLQkJfQotCi0JCWlmICh0YXJnZXRGaWxlLmV4aXN0cygpKSB7Ci0JCQlpZiAobWFwRW50cnlWYWx1ZS5zb3VyY2VGaWxlID09IG51bGwgfHwgbmVlZENvcHkobWFwRW50cnlWYWx1ZS5zb3VyY2VGaWxlLCB0YXJnZXRGaWxlKSkgewotCQkJCW1hcEVudHJ5VmFsdWUudGFyZ2V0RmlsZSA9IHRhcmdldEZpbGU7Ci0JCQl9Ci0JCQltYXBFbnRyeVZhbHVlLmV4aXN0aW5nID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCWlmIChtYXBFbnRyeVZhbHVlLnNvdXJjZUZpbGUgIT0gbnVsbCkgewotCQkJCW1hcEVudHJ5VmFsdWUudGFyZ2V0RmlsZSA9IHRhcmdldEZpbGU7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gbWFwRW50cnlWYWx1ZTogIik7CQkJCQkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4obWFwRW50cnlWYWx1ZS50b0RlYnVnU3RyaW5nKCJMRD4gIikpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0TW9kaWZpZWRGaWxlcygpIHsKLQkJTGlzdCByZXQgPSBuZXcgQXJyYXlMaXN0KCk7CQkKLQkJZm9yIChJdGVyYXRvcjxNYXBFbnRyeVZhbHVlPiBpdCA9IGVsZW1lbnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwRW50cnlWYWx1ZSB2YWx1ZSA9IGl0Lm5leHQoKTsKLQkJCWlmICh2YWx1ZS5leGlzdGluZyAmJiB2YWx1ZS50YXJnZXRGaWxlICE9IG51bGwpIHsKLQkJCQlyZXQuYWRkKHZhbHVlLnRhcmdldEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJfQotCQl9CQkKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBjb3B5IGFsbCB0aGUgZmlsZXMgdG8gdGhlIGRlc3RpbmF0aW9uCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQl0cnkgewotCQkJZXhlY3V0ZV8oKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0JCi0JfQotCQotCXByaXZhdGUgdm9pZCBleGVjdXRlXygpIHsKLQkJCi0JCWZvciAoSXRlcmF0b3I8TWFwRW50cnlWYWx1ZT4gaXQgPSBlbGVtZW50TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlNYXBFbnRyeVZhbHVlIHZhbHVlID0gaXQubmV4dCgpOwotCQkJaWYgKHZhbHVlLnRhcmdldEZpbGUgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmICh2YWx1ZS5zb3VyY2VGaWxlICE9IG51bGwpIHsKLQkJCQlGaWxlIHBhcmVudEZpbGUgPSB2YWx1ZS50YXJnZXRGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCQlSZXNvdXJjZUhlbHBlci5jb3B5RmlsZSh2YWx1ZS5zb3VyY2VGaWxlLCB2YWx1ZS50YXJnZXRGaWxlKTsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRDogRmlsZSBjb3BpZWQ6ICIgKyB2YWx1ZS5zb3VyY2VGaWxlKTsJLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdmFsdWUudGFyZ2V0RmlsZS5kZWxldGUoKTsKLQkJCX0KLQkJfQkKLQl9Ci0JCQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGNvcHkgYWN0aW9uIGlzIG5lZWRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbmVlZENvcHkoRmlsZSBzb3VyY2UsIEZpbGUgZGVzdCkgewotCQlib29sZWFuIHJldCA9IHRydWU7Ci0JCWlmIChkZXN0LmV4aXN0cygpKSB7Ci0JCQlyZXQgPSAoZGVzdC5sYXN0TW9kaWZpZWQoKSAhPSBzb3VyY2UubGFzdE1vZGlmaWVkKCkpCi0JCQkJCXx8IChkZXN0Lmxlbmd0aCgpICE9IHNvdXJjZS5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0Jc3RhdGljIGNsYXNzIE1hcEVudHJ5VmFsdWUgewotCi0JCXB1YmxpYyBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0JCXB1YmxpYyBGaWxlIHNvdXJjZUZpbGU7Ci0JCXB1YmxpYyBGaWxlIHRhcmdldEZpbGU7Ci0JCXB1YmxpYyBib29sZWFuIGV4aXN0aW5nID0gZmFsc2U7CQkKLQkJCi0JCXB1YmxpYyBTdHJpbmcgdG9EZWJ1Z1N0cmluZyhTdHJpbmcgcHJvbXB0KSB7Ci0JCQlTdHJpbmcgc3RyID0gcHJvbXB0ICsgImVsZW1lbnQ6ICIgKyBlbGVtZW50LmdldE5hbWUoKTsJCS8vJE5PTi1OTFMtMSQKLQkJCXN0ciArPSAiXG4iICsgcHJvbXB0ICsgInNvdXJjZUZpbGU6ICIgKyBzb3VyY2VGaWxlOwkJLy8kTk9OLU5MUy0xJAotCQkJc3RyICs9ICJcbiIgKyBwcm9tcHQgKyAidGFyZ2V0RmlsZTogIiArIHRhcmdldEZpbGU7CQkvLyROT04tTkxTLTEkIAkvLyROT04tTkxTLTIkCi0JCQlzdHIgKz0gIlxuIiArIHByb21wdCArICJleGlzdGluZzogIiArIGV4aXN0aW5nOwkJCS8vJE5PTi1OTFMtMSQgCS8vJE5PTi1OTFMtMiQJCQkKLQkJCXJldHVybiBzdHI7Ci0JCX0KLQkJCi0JfQotCi0JLy9bMF06IHNvdXJjZUZpbGUKLQkvL1sxXTogdGFyZ2V0RmlsZQotCXByaXZhdGUgRmlsZVtdIGdldEZpbGVzKE1ldGhvZEVsZW1lbnQgZWxlbSkgewotCQlGaWxlW10gZmlsZXMgPSBuZXcgRmlsZVsyXTsKLQkJCi0JCVN0cmluZyBlbGVtZW50UGF0aCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKGVsZW0pOwotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGVsZW1lbnRQYXRoOiAiICsgZWxlbWVudFBhdGgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGVsZW1lbnRQYXRoID09IG51bGwgfHwgZWxlbWVudFBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZWxlbWVudFBhdGggaXMgbnVsbCBvciBlbXB0eSEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIGZpbGVzOwotCQl9Ci0KLQkJU3RyaW5nIGRpYWdyYW1QYXRoID0gZWxlbWVudFBhdGggKyBlbGVtLmdldE5hbWUoKSArIEZpbGUuc2VwYXJhdG9yICsgCi0JCQkJCQkJCSJkaWFncmFtLnhtaSI7CQkJCS8vJE5PTi1OTFMtMSQKLQotCQlmaWxlc1swXSA9IG5ldyBGaWxlKHNvdXJjZUxpYlJvb3QsIGRpYWdyYW1QYXRoKTsKLQkJZmlsZXNbMV0gPSBuZXcgRmlsZSh0YXJnZXRMaWJSb290LCBkaWFncmFtUGF0aCk7CQkKLQotCQlyZXR1cm4gZmlsZXM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0xpYnJhcnlEb2N1bWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0xpYnJhcnlEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZTY0MmRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9MaWJyYXJ5RG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKiBFbmNhcHN1bGF0ZXMgYSBtZXRob2QgbGlicmFyeSB1c2luZyBhIERPTSBkb2N1bWVudC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeURvY3VtZW50IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19tZXRob2RQbHVnaW5zID0gIm1ldGhvZFBsdWdpbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zID0gInByZWRlZmluZWRDb25maWd1cmF0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19yZXNvdXJjZURlc2NyaXB0b3JzID0gInJlc291cmNlRGVzY3JpcHRvcnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfcmVzb3VyY2VTdWJNYW5hZ2VycyA9ICJzdWJNYW5hZ2VycyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfbWV0aG9kRWxlbWVudFByb3BlcnR5ID0gIm1ldGhvZEVsZW1lbnRQcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfaHJlZiA9ICJocmVmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9pZCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfdXJpID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfZ3VpZCA9ICJndWlkIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfdmFsdWUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBleHBvcnRGaWxlID0gImV4cG9ydC54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBsaWJyYXJ5RmlsZSA9ICJsaWJyYXJ5LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBGaWxlIGxpYkZpbGU7Ci0KLQlwcm90ZWN0ZWQgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudCBsaWJUYWcgPSBudWxsOwotCi0JcHJvdGVjdGVkIEVsZW1lbnQgcmVzVGFnID0gbnVsbDsKLQkKLQlwcml2YXRlIEhhc2hNYXAgZ3VpZFRvVXJpTWFwID0gbnVsbDsKLQkKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZ3VpZFRvUGx1Z05hbWVNYXA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5RG9jdW1lbnQoRmlsZSBsaWJGaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5saWJGaWxlID0gbGliRmlsZTsKLQkJaW5pdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZG9jdW1lbnQgPSBYTUxVdGlsLmxvYWRYbWwobGliRmlsZSk7Ci0KLQkJRWxlbWVudCByb290ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCU5vZGVMaXN0IG5vZGVzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5vZGVzICE9IG51bGwgJiYgbm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlsaWJUYWcgPSAoRWxlbWVudCkgbm9kZXMuaXRlbSgwKTsKLQkJfQotCi0JCW5vZGVzID0gcm9vdAotCQkJCS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5vZGVzICE9IG51bGwgJiYgbm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlyZXNUYWcgPSAoRWxlbWVudCkgbm9kZXMuaXRlbSgwKTsKLQkJfQotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRvY3VtZW50IGZpZWxkCi0gICAgICovCi0JcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gdGhpcy5kb2N1bWVudDsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaWJGaWxlIGZpZWxkCi0gICAgICovCi0JcHVibGljIEZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIGxpYkZpbGU7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGliVGFnIGZpZWxkCi0gICAgICovCi0JcHVibGljIEVsZW1lbnQgZ2V0TGliVGFnKCkgewotCQlyZXR1cm4gbGliVGFnOwotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpYnJhcnkgbmFtZQotICAgICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoKSB7Ci0JCXJldHVybiBsaWJUYWcuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IGd1aWQKLSAgICAgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlHdWlkKCkgewotCQlyZXR1cm4gbGliVGFnLmdldEF0dHJpYnV0ZSgiZ3VpZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2UgdGFnCi0gICAgICovCi0JcHVibGljIEVsZW1lbnQgZ2V0UmVzb3VyY2VUYWcoKSB7Ci0JCXJldHVybiByZXNUYWc7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIHBsdWdpbiBub2RlCi0gICAgICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUGx1Z2luKEVsZW1lbnQgbm9kZSkgewotCQlsaWJUYWcucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIGNvbmZpZyBub2RlCi0gICAgICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29uZmlndXJhdGlvbihFbGVtZW50IG5vZGUpIHsKLQkJbGliVGFnLnJlbW92ZUNoaWxkKG5vZGUpOwotCX0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSByZXNvdXJjZSBkZXNjcmlwdG9yIG5vZGUKLSAgICAgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZURlc2NyaXB0b3IoRWxlbWVudCBub2RlKSB7Ci0JCXJlc1RhZy5yZW1vdmVDaGlsZChub2RlKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHBsdWdpbiBub2RlIGxpc3QKLSAgICAgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0UGx1Z2lucygpIHsKLQkJcmV0dXJuIGxpYlRhZy5nZXRFbGVtZW50c0J5VGFnTmFtZShUQUdfbWV0aG9kUGx1Z2lucyk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBjb25maWd1cmF0aW9uIG5vZGUgbGlzdAotICAgICAqLwotCXB1YmxpYyBOb2RlTGlzdCBnZXRDb25maWd1cmF0aW9ucygpIHsKLQkJcmV0dXJuIGxpYlRhZy5nZXRFbGVtZW50c0J5VGFnTmFtZShUQUdfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHJlc291cmNlIGRlc2NyaXB0b3Igbm9kZSBsaXN0Ci0gICAgICovCi0JcHVibGljIE5vZGVMaXN0IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiByZXNUYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoVEFHX3Jlc291cmNlRGVzY3JpcHRvcnMpOwotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgcmVzb3VyY2Ugc3VibWFuYWdlciBub2RlIGxpc3QKLSAgICAgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0UmVzb3VyY2VTdWJNYW5hZ2VycygpIHsKLQkJcmV0dXJuIHJlc1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZShUQUdfcmVzb3VyY2VTdWJNYW5hZ2Vycyk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHBsdWdpbiBub2RlCi0gICAgICovCi0JcHVibGljIHZvaWQgYWRkUGx1Z2luKEVsZW1lbnQgbm9kZSkgewotCQlsaWJUYWcuYXBwZW5kQ2hpbGQoZ2V0VmFsaWROb2RlKG5vZGUpKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgY29uZmlndXJhdGlvbiBub2RlCi0gICAgICovCi0JcHVibGljIHZvaWQgYWRkQ29uZmlndXJhdGlvbihFbGVtZW50IG5vZGUpIHsKLQkJbGliVGFnLmFwcGVuZENoaWxkKGdldFZhbGlkTm9kZShub2RlKSk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHJlc291cmNlIG5vZGUKLSAgICAgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZShFbGVtZW50IG5vZGUpIHsKLQkJcmVzVGFnLmFwcGVuZENoaWxkKGdldFZhbGlkTm9kZShub2RlKSk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHZhbGlkIG5vZGUKLSAgICAgKi8KLQlwdWJsaWMgTm9kZSBnZXRWYWxpZE5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE93bmVyRG9jdW1lbnQoKSA9PSBkb2N1bWVudCkgewotCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQotCQlyZXR1cm4gZG9jdW1lbnQuaW1wb3J0Tm9kZShub2RlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmUgcGx1Z2lucyBieSBndWlkCi0JICogCi0JICogQHBhcmFtIHJlbW92ZUxpc3QKLQkgKiAgICAgICAgICAgIExpc3QgYSBsaXN0IG9mIGd1aWRzCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUGx1Z2lucyhMaXN0IHJlbW92ZUxpc3QpIHsKLQkJLy8gSW1wb3J0aW5nIGEgcGFja2FnZSBvZiBwbGdpbnMgdHdpY2UgZ2VuZXJhdGVzIDIKLQkJLy8gaWRlbnRpY2FsIHBsdWdpbnMKLQkJLy8gcmVtb3ZlIHRoZSBub2RlIHdpbGwgY2F1c2UgdGhlIG5vZGUgbGlzdCB0byBzaHJpbmssIHNvIGRvbid0IGluY3JlYXNlCi0JCS8vIHRoZSBpbmRleAotCQlOb2RlTGlzdCBub2RlcyA9IGdldFBsdWdpbnMoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZChub2RlKTsKLQkJCWlmIChyZW1vdmVMaXN0LmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJbGliVGFnLnJlbW92ZUNoaWxkKG5vZGUpOwotCQkJfSBlbHNlIHsKLQkJCQlpKys7Ci0JCQl9Ci0JCX0KLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhlIGxpc3QgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBub2RlcwotICAgICAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbmZpZ3VyYXRpb25zKExpc3QgcmVtb3ZlTGlzdCkgewotCQkvLyByZW1vdmUgdGhlIHVubmVlZGVkIGNvbmZpZ3VyYXRpb25zCi0JCU5vZGVMaXN0IG5vZGVzID0gZ2V0Q29uZmlndXJhdGlvbnMoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZChub2RlKTsKLQkJCWlmIChyZW1vdmVMaXN0LmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJbGliVGFnLnJlbW92ZUNoaWxkKG5vZGUpOwotCQkJfSBlbHNlIHsKLQkJCQlpKys7Ci0JCQl9Ci0JCX0KLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhlIGxpc3QgZnJvbSB0aGUgcmVzb3VyY2Ugbm9kZXMKLSAgICAgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZUVudHJpZXMoTGlzdCByZW1vdmVMaXN0KSB7Ci0JCU5vZGVMaXN0IG5vZGVzID0gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpIDwgbm9kZXMuZ2V0TGVuZ3RoKCkpIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIGd1aWQgPSBub2RlLmdldEF0dHJpYnV0ZShBVFRSX2lkKTsKLQkJCVN0cmluZyB1cmkgPSBub2RlLmdldEF0dHJpYnV0ZShBVFRSX3VyaSk7Ci0JCQlpZiAocmVtb3ZlTGlzdC5jb250YWlucyhndWlkKSkgewotCQkJCXJlc1RhZy5yZW1vdmVDaGlsZChub2RlKTsKLQotCQkJCS8vIGNoZWNrIHRoZSBwbHVnaW4geG1pIGZpbGUsIGlmIGV4aXN0cywgZGVsZXRlIHRoZSBmb2xkZXIKLQkJCQlGaWxlIHBsdWduX2ZpbGUgPSBnZXRGaWxlRnJvbVVyaSh1cmkpOwotCQkJCWlmIChwbHVnbl9maWxlLmV4aXN0cygpKSB7Ci0JCQkJCS8vIGRlbGV0ZSB0aGUgZm9sZGVyID8/PwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0KLQkJLy8gYWxzbyByZW1vdmUgdGhlIHN1YiBtYW5hZ2VycwotCQlub2RlcyA9IGdldFJlc291cmNlU3ViTWFuYWdlcnMoKTsKLQkJaSA9IDA7Ci0JCXdoaWxlIChpIDwgbm9kZXMuZ2V0TGVuZ3RoKCkpIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIGd1aWQgPSBnZXRTdWJNYW5hZ2VyQmFzZUd1aWQobm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9ocmVmKSk7Ci0JCQlpZiAocmVtb3ZlTGlzdC5jb250YWlucyhndWlkKSkgewotCQkJCXJlc1RhZy5yZW1vdmVDaGlsZChub2RlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSByZXNvdXJjZSB1cmkgZm9yIHRoZSByZXNvdXJjZSBndWlkCi0JICogQHBhcmFtIGd1aWQKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgdXJpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVVyaShTdHJpbmcgZ3VpZCkgewotCQlTdHJpbmcgdXJpID0gZ2V0VXJpRnJvbUd1aWRUb1VyaU1hcChndWlkKTsKLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQl1cmkgPSBnZXRSZXNvdXJjZVVyaV8oZ3VpZCk7Ci0JCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQkvL2FkZFRvR3VpZFRvVXJpTWFwKGd1aWQsIHVyaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHVyaTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UmVzb3VyY2VVcmlfKFN0cmluZyBndWlkKSB7Ci0JCi0JCU5vZGVMaXN0IG5vZGVzID0gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKysgKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfaWQpOwotCQkJU3RyaW5nIHVyaSA9IG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfdXJpKTsKLQkJCWlmICggZ3VpZC5lcXVhbHMoaWQpICkgewotCQkJCXJldHVybiBkZWNvZGVVcmkodXJpKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVjb3JlZCBVUkkuCi0JICovCi0JcHVibGljIFN0cmluZyBkZWNvZGVVcmkoU3RyaW5nIHVyaSkgewotCQl0cnkgewotCQkJdXJpID0gVVJMRGVjb2Rlci5kZWNvZGUodXJpLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiB1cmk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgZ2l2ZW4gdGhlIHVyaS4KLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRGaWxlRnJvbVVyaShTdHJpbmcgdXJpKSB7Ci0JCXVyaSA9IGRlY29kZVVyaSh1cmkpOwotCQkKLQkJaW50IGkgPSB1cmkuaW5kZXhPZigiIyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpID4gMCkgewotCQkJdXJpID0gdXJpLnN1YnN0cmluZygwLCBpKTsKLQkJfQotCi0JCXJldHVybiBuZXcgRmlsZShsaWJGaWxlLmdldFBhcmVudEZpbGUoKSwgdXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlzYXZlQXMobGliRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGRvY3VtZW50IGluIHRoZSBmaWxlIGdpdmVuIGJ5IGZpbGVQYXRoTmFtZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlQXMoU3RyaW5nIGZpbGVQYXRoTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhNTFV0aWwuc2F2ZURvY3VtZW50KHRoaXMuZG9jdW1lbnQsIGZpbGVQYXRoTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogSXMgdGhlIGRvY3VtZW50IGZvciBjb25maWd1dGF0aW9uIHNwZWNpZmljYXRpb24gZXhwb3J0L2ltcG9ydCBvbmx5PwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29uZmlnU3BlY3NPbmx5KCkgewotCQlOb2RlTGlzdCBub2RlcyA9IGdldFBsdWdpbnMoKTsKLQkJaWYgKG5vZGVzID09IG51bGwgfHwgbm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIGhyZWYgPSBub2RlLmdldEF0dHJpYnV0ZShMaWJyYXJ5RG9jdW1lbnQuQVRUUl9ocmVmKTsKLQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZEZyb21IcmVmKGhyZWYpOwotCQkJU3RyaW5nIHVyaSA9IGdldFJlc291cmNlVXJpKGd1aWQpOwotCQkJCi0JCQkvLyBjaGVjayBpZiB0aGUgcmVzb3VyY2UgZmlsZXMgYXJlIHRoZXJlCi0JCQlGaWxlIHBsdWduX2ZpbGUgPSBnZXRGaWxlRnJvbVVyaSh1cmkpOwotCQkJaWYgKHBsdWduX2ZpbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyBzdGF0aWMgaGxwZXIgbWV0aG9kcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLyoqCi0JICogUmV0dXJucyBzdWJtYW5hZ2VyJ3MgYmFzZSBndWlkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN1Yk1hbmFnZXJCYXNlR3VpZChTdHJpbmcgaHJlZikgewotCQlmaW5hbCBQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUoCi0JCQkJInVtYTovLyguKj8pIyguKj8pIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0JCU1hdGNoZXIgbSA9IHAubWF0Y2hlcihocmVmKTsKLQkJaWYgKG0uZmluZCgpKSB7Ci0JCQlyZXR1cm4gbS5ncm91cCgxKTsKLQkJfQotCi0JCXJldHVybiBocmVmOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY2hpbGQgdmFsdWUgb2YgdGhlIGNoaWxkIHRhZyBnaXZlbiBieSBjaGlsZFRhZ05hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2hpbGRWYWx1ZShFbGVtZW50IHRhZywgU3RyaW5nIGNoaWxkVGFnTmFtZSkgewotCQlOb2RlTGlzdCBub2RlcyA9IHRhZy5nZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChub2RlcyA9PSBudWxsIHx8IG5vZGVzLmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaW50IHNpemUgPSBub2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotCQkJCQkmJiAoKEVsZW1lbnQpIG5vZGUpLmdldFRhZ05hbWUoKS5lcXVhbHMoY2hpbGRUYWdOYW1lKSkgewotCQkJCXJldHVybiBnZXROb2RlVGV4dCgoRWxlbWVudCkgbm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiB0ZXh0IG9mIGEgbGVhZiBub2RlLCB3aXRob3V0IGNoaWxkIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gdGFnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5vZGVUZXh0KEVsZW1lbnQgdGFnKSB7Ci0KLQkJTm9kZUxpc3Qgbm9kZXMgPSB0YWcuZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAobm9kZXMgPT0gbnVsbCB8fCBub2Rlcy5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWludCBzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKGkpOwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCWJ1ZmZlci5hcHBlbmQobm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBndWlkIGZyb20gaHJlZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHdWlkRnJvbUhyZWYoU3RyaW5nIGhyZWYpIHsKLQkJaW50IGkgPSBocmVmLmluZGV4T2YoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaSA+IDApIHsKLQkJCXJldHVybiBocmVmLnN1YnN0cmluZyhpICsgMSk7Ci0JCX0KLQotCQlyZXR1cm4gaHJlZjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGd1aWQgb2YgdGhlIG5vZGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R3VpZChFbGVtZW50IG5vZGUpIHsKLQkJU3RyaW5nIGlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoInhtaTppZCIpOyAvLyROT04tTkxTLTEkCi0JCWlmICggaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwICkgewotCQkJU3RyaW5nIGhyZWYgPSBub2RlLmdldEF0dHJpYnV0ZShBVFRSX2hyZWYpOwotCQkJaWQgPSBnZXRHdWlkRnJvbUhyZWYoaHJlZik7Ci0JCX0KLQkJCi0JCXJldHVybiBpZDsKLQl9Ci0JCi0JLy8gMTQzMDMzIC0gdXBkYXRlIGNvbmZpZyBzcGVjcycgaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgdG8gbWF0Y2ggd2l0aCB0aGUgbmV3IGZpbGUgZm9ybWF0Ci0JcHJvdGVjdGVkIEVsZW1lbnQgZ2V0Q29uZmlnTm9kZShFbGVtZW50IGNvbmZpZ05vZGUpIHsKLQkJdHJ5IHsKLQkJCQotCQkJLy8gbmV3IG1vZGVsIGRlZmluZXMgaHJlZiBmb3IgY29uZmlndXJhdGlvbiAKLQkJCVN0cmluZyBocmVmID0gY29uZmlnTm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9ocmVmKTsKLQkJCWlmIChocmVmID09IG51bGwgfHwgaHJlZi5sZW5ndGgoKSA9PSAwICkgewotCQkJCXJldHVybiBjb25maWdOb2RlOwotCQkJfSAKLQotCQkJU3RyaW5nIGd1aWQgPSBnZXRHdWlkRnJvbUhyZWYoaHJlZik7Ci0JCQlTdHJpbmcgdXJpID0gZ2V0UmVzb3VyY2VVcmkoZ3VpZCk7Ci0JCQlpZiAoIHVyaSA9PSBudWxsICkgewotCQkJCXJldHVybiBjb25maWdOb2RlOwotCQkJfQotCQkJCi0JCQlGaWxlIHNvdXJjZSA9IGdldEZpbGVGcm9tVXJpKHVyaSk7Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IFhNTFV0aWwubG9hZFhtbChzb3VyY2UpOwotCQkJRWxlbWVudCByb290ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLQkJCUVsZW1lbnQgY29uZmlnVGFnID0gbnVsbDsKLQkJCWlmIChyb290LmdldFRhZ05hbWUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJY29uZmlnVGFnID0gcm9vdDsKLQkJCX0gZWxzZSB7Ci0JCQkJTm9kZUxpc3Qgbm9kZXMgPSByb290Ci0JCQkJCQkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKG5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJCQljb25maWdUYWcgPSAoRWxlbWVudCkgbm9kZXMuaXRlbSgwKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBjb25maWdUYWc7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBjb25maWdOb2RlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIENvbmZpZ3VyYXRpb25TcGVjIGluc3RhbmNlIGdpdmVuIHRoZSBlbGVtZW50IG5vZGUgY29uZmlnLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uU3BlYyBnZXRDb25maWd1cmF0aW9uU3BlYyhFbGVtZW50IGNvbmZpZykgewotCQlDb25maWd1cmF0aW9uU3BlYyBzcGVjID0gbmV3IENvbmZpZ3VyYXRpb25TcGVjKCk7Ci0JCQotCQlFbGVtZW50IGNvbmZpZ05vZGUgPSBnZXRDb25maWdOb2RlKGNvbmZpZyk7Ci0JCXNwZWMuZ3VpZCA9IGNvbmZpZ05vZGUuZ2V0QXR0cmlidXRlKCJ4bWk6aWQiKTsgLy8kTk9OLU5MUy0xJAotCQlzcGVjLm5hbWUgPSBjb25maWdOb2RlLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCXNwZWMuYnJpZWZfZGVzYyA9IGNvbmZpZ05vZGUuZ2V0QXR0cmlidXRlKCJicmllZkRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vIGdldCBwbHVnaW5zCi0JCU5vZGVMaXN0IG5vZGVzID0gY29uZmlnTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibWV0aG9kUGx1Z2luU2VsZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5vZGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZEZyb21IcmVmKG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfaHJlZikpOwotCQkJCXNwZWMucGx1Z2luSWRzLmFkZChndWlkKTsKLQkJCX0KLQkJfQotCi0JCS8vIGdldCBwYWNrYWdlcwotCQlub2RlcyA9IGNvbmZpZ05vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobm9kZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIGd1aWQgPSBnZXRHdWlkRnJvbUhyZWYobm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9ocmVmKSk7Ci0JCQkJc3BlYy5wYWNrYWdlSWRzLmFkZChndWlkKTsKLQkJCX0KLQkJfQotCi0JCS8vIGdldCB2aWV3cwotCQlub2RlcyA9IGNvbmZpZ05vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInByb2Nlc3NWaWV3cyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChub2RlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCQlTdHJpbmcgZ3VpZCA9IGdldEd1aWRGcm9tSHJlZihub2RlLmdldEF0dHJpYnV0ZShBVFRSX2hyZWYpKTsKLQkJCQlzcGVjLnZpZXdJZHMuYWRkKGd1aWQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHNwZWM7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgZ3VpZC91cmkgcGFpciB0byBndWlkVG9VcmlNYXAuCi0JICovCi0JcHVibGljIHZvaWQgYWRkVG9HdWlkVG9VcmlNYXAoU3RyaW5nIGd1aWQsIFN0cmluZyB1cmkpIHsKLQkJaWYgKGd1aWRUb1VyaU1hcCA9PSBudWxsKSB7Ci0JCQlndWlkVG9VcmlNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCWd1aWRUb1VyaU1hcC5wdXQoZ3VpZCwgdXJpKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB1cmkgZnJvbSBndWlkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJpRnJvbUd1aWRUb1VyaU1hcChTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gZ3VpZFRvVXJpTWFwID09IG51bGwgPyBudWxsIDogKFN0cmluZykgZ3VpZFRvVXJpTWFwLmdldChndWlkKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29uZmlnRG9jVmlzaXRvciB7Ci0JCXB1YmxpYyB2b2lkIHZpc2l0KEZpbGUgZmlsZSwgRWxlbWVudCBub2RlKSB7CQkJCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVmlzaXQgY29uZmlndXJhdGlvbiBmaWxlcyBnaXZlbiBieSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGZvbGRlciBjb25maWdEaXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHZpc2l0Q29uZmlnRmlsZXMoRmlsZSBjb25maWdEaXIsIENvbmZpZ0RvY1Zpc2l0b3IgdmlzaXRvcikgewkKLQkJRmlsZUZpbHRlciBmaWx0ZXIgPSBuZXcgRmlsZUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIHBhdGhuYW1lKSB7Ci0JCQkJcmV0dXJuICFwYXRobmFtZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiY3ZzIikgJiYgCQkvLyROT04tTkxTLTEkCi0JCQkJCQlwYXRobmFtZS5pc0RpcmVjdG9yeSgpIHx8IHBhdGhuYW1lLmdldE5hbWUoKS5lbmRzV2l0aChNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0ZJTEVfRVhURU5TSU9OKTsKLQkJCX0JCQkKLQkJfTsJCQotCQlGaWxlW10gZmlsZXMgPSBjb25maWdEaXIubGlzdEZpbGVzKGZpbHRlcik7Ci0JCWlmIChmaWxlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaT0wOyBpPGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGZpbGUgPSBmaWxlc1tpXTsKLQkJCXRyeSB7Ci0JCQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkKLQkJCQkJCS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCQlEb2N1bWVudCBkb2MgPSBidWlsZGVyLnBhcnNlKGZpbGUpOwotCQkJCUVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCQl2aXNpdG9yLnZpc2l0KGZpbGUsIHJvb3QpOwkJCQkKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGEgbWFwIGZyb20gcGx1aWduIGd1aWRzIHRvIHJlc291cmNlIG1hbmFnZXIgZ3VpZHMuCi0JICovCi0JcHVibGljIE1hcCBidWlsZFBsdWdpbkd1aWRUb1Jlc01nckd1aWRNYXAoTGlzdCBwbHVnaW5HdWlkcykgewotCQlpZiAocGx1Z2luR3VpZHMgPT0gbnVsbCB8fCBwbHVnaW5HdWlkcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTm9kZUxpc3Qgc3ViTWdycyA9IGdldFJlc291cmNlU3ViTWFuYWdlcnMoKTsKLQkJaWYgKHN1Yk1ncnMgPT0gbnVsbCB8fCBzdWJNZ3JzLmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9CQkJCQotCQlIYXNoTWFwIHBsdWdpbkd1aWRUb1Jlc01nckd1aWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpPTA7IGk8cGx1Z2luR3VpZHMuc2l6ZSgpOyBpKyspIHsJCQkKLQkJCVN0cmluZyBwbHVnaW5HdWlkID0gKFN0cmluZykgcGx1Z2luR3VpZHMuZ2V0KGkpOwotCQkJcGx1Z2luR3VpZFRvUmVzTWdyR3VpZE1hcC5wdXQocGx1Z2luR3VpZCwgbnVsbCk7Ci0JCX0KLQkJYm9vbGVhbiBpc0VtcHR5ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaT0wOyBpPHN1Yk1ncnMuZ2V0TGVuZ3RoKCk7IGkrKykgewkJCQotCQkJRWxlbWVudCBtZ3IgPSAoRWxlbWVudCkgc3ViTWdycy5pdGVtKGkpOwotCQkJU3RyaW5nICBocmVmID0gbWdyLmdldEF0dHJpYnV0ZShBVFRSX2hyZWYpOwotCQkJU3RyaW5nIHBsdWdpbkd1aWQgPSBnZXRTdWJNYW5hZ2VyQmFzZUd1aWQoaHJlZik7Ci0JCQlpZiAocGx1Z2luR3VpZFRvUmVzTWdyR3VpZE1hcC5jb250YWluc0tleShwbHVnaW5HdWlkKSkgewotCQkJCXBsdWdpbkd1aWRUb1Jlc01nckd1aWRNYXAucHV0KHBsdWdpbkd1aWQsIGdldEd1aWRGcm9tSHJlZihocmVmKSk7Ci0JCQkJaXNFbXB0eSA9IGZhbHNlOwotCQkJfQotCQl9CQkKLQkJcmV0dXJuIGlzRW1wdHkgPyAgbnVsbCA6IHBsdWdpbkd1aWRUb1Jlc01nckd1aWRNYXA7Ci0JfQotCQotCS8qKgotCSAqIFNhdmUgZXh0cmEgaW5mbyAoYWxsIHBsdWdpbiBndWlkcyBhbmQgbmFtZXMpIGluIGxpYlRhZydzIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3JlRXh0cmFJbmZvKExpc3Q8TWV0aG9kUGx1Z2luPiBwbHVnaW5zKSB7Ci0JCWlmIChwbHVnaW5zID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQkJCi0KLQkJRWxlbWVudCB2ZXJzaW9uTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoVEFHX21ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7Ci0JCXZlcnNpb25Ob2RlLnNldEF0dHJpYnV0ZShBVFRSX3ZhbHVlLCAiMCIpOwkvLyROT04tTkxTLTEkIAotCQlsaWJUYWcuYXBwZW5kQ2hpbGQodmVyc2lvbk5vZGUpOwkJCi0JCQotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZFBsdWdpbj4gaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnID0gaXQubmV4dCgpOwotCQkJCi0JCQlFbGVtZW50IGd1aWROb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChUQUdfbWV0aG9kRWxlbWVudFByb3BlcnR5KTsJCi0JCQlndWlkTm9kZS5zZXRBdHRyaWJ1dGUoQVRUUl92YWx1ZSwgcGx1Zy5nZXRHdWlkKCkpOwotCQkJRWxlbWVudCBuYW1lTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoVEFHX21ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7CQotCQkJbmFtZU5vZGUuc2V0QXR0cmlidXRlKEFUVFJfdmFsdWUsIHBsdWcuZ2V0TmFtZSgpKTsKLQkJCQotCQkJbGliVGFnLmFwcGVuZENoaWxkKGd1aWROb2RlKTsKLQkJCWxpYlRhZy5hcHBlbmRDaGlsZChuYW1lTm9kZSk7Ci0JCX0KLQkJCi0JfQkKLQkKLQlwcml2YXRlIHZvaWQgcmVjYWxsRXh0cmFJbmZvKCkgewotCQl0cnkgewotCQkJTm9kZUxpc3Qgbm9kZXMgPSBnZXRNZXRob2RFbGVtZW50UHJvcGVydGllcygpOwotCQkJaWYgKG5vZGVzID09IG51bGwgfHwgbm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCUVsZW1lbnQgdmVyc2lvbk5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbSgwKTsKLQkJCVN0cmluZyB2ZXJzaW9uU3RyID0gdmVyc2lvbk5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfdmFsdWUpOwotCQkJCi0JCQlpZiAodmVyc2lvblN0ci5lcXVhbHMoIjAiKSkgeyAvLyROT04tTkxTLTEkIAotCQkJCWd1aWRUb1BsdWdOYW1lTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTspIHsKLQkJCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJCVN0cmluZyBndWlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl92YWx1ZSk7Ci0JCQkJCW5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpICsgMSk7Ci0JCQkJCVN0cmluZyBuYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl92YWx1ZSk7Ci0JCQkJCWd1aWRUb1BsdWdOYW1lTWFwLnB1dChndWlkLCBuYW1lKTsKLQkJCQkJaWYgKGZhbHNlKSB7CQkJCQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZ3VpZDogIiArIGd1aWQpOwotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gbmFtZTogIiArIG5hbWUpOwotCQkJCQl9CQkJCQkKLQkJCQkJaSArPSAyOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlndWlkVG9QbHVnTmFtZU1hcCA9IG51bGw7Ci0JCX0KLQkJCi0JfQotCQotCS8qKgotCSAqIEdldCBndWlkIHRvIHBsdWdpbiBtYXAKLQkgKi8KLQlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRHdWlkVG9QbHVnTmFtZU1hcCgpIHsKLQkJaWYgKGd1aWRUb1BsdWdOYW1lTWFwID09IG51bGwpIHsKLQkJCXJlY2FsbEV4dHJhSW5mbygpOwotCQl9CQkKLQkJcmV0dXJuIGd1aWRUb1BsdWdOYW1lTWFwOwotCX0KLQkKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBub2RlIGxpc3QKLSAgICAgKi8KLQlwcml2YXRlIE5vZGVMaXN0IGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gbGliVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKFRBR19tZXRob2RFbGVtZW50UHJvcGVydHkpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9QbHVnaW5FeHBvcnREYXRhLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvUGx1Z2luRXhwb3J0RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYjU4MjMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9QbHVnaW5FeHBvcnREYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuTGlicmFyeUxvY2F0aW9uRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0KLS8qKgotICogRW5jYXBzdWxhdGVzIHRoZSBpbnB1dCBkYXRhIHJlcXVpcmVkIHRvIGV4cG9ydCBhIG1ldGhvZCBwbHVnLWluLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5FeHBvcnREYXRhIHsKLQotCXB1YmxpYyBMaXN0IHNlbGVjdGVkUGx1Z2lucyA9IG51bGw7Ci0KLQlwdWJsaWMgTGlicmFyeUxvY2F0aW9uRGF0YSBsbERhdGEgPSBudWxsOwotCi0JcHVibGljIEhhc2h0YWJsZSBhc3NvY2lhdGVkQ29uZmlnTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JLy8gZG9uJ3QgbmVlZCBpdCBhZnRlciB0aGUgc2VydmljZSBjb2RlIGNoYW5nZXMKLQlwdWJsaWMgTGlzdCBhc3NvY2lhdGVkQ29uZmlncyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFBsdWdpbkV4cG9ydERhdGEoKSB7Ci0JCWxsRGF0YSA9IG5ldyBMaWJyYXJ5TG9jYXRpb25EYXRhKCk7Ci0JCWxsRGF0YS5sb2FkRnJvbVByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpc3Qgb2Ygc2VsZWN0ZWQgcGx1Z2lucy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZWxlY3RlZFBsdWdpbnMoKSB7Ci0JCXJldHVybiBzZWxlY3RlZFBsdWdpbnM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGlzdCBvZiBzZWxlY3RlZCBwbHVnaW5zLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkUGx1Z2lucyhMaXN0IHNlbGVjdGVkUGx1Z2lucykgewotCQl0aGlzLnNlbGVjdGVkUGx1Z2lucyA9IHNlbGVjdGVkUGx1Z2luczsKLQl9OwotCi0JLyoqCi0JICogdmFsaWRhdGUgYXR0cmlidXRlCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZHMgYXNzb2NpYXRlZENvbmZpZ01hcC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBidWlsZEFzc29jaWF0ZWRDb25maWdNYXAoKSB7Ci0JCWlmIChnZXRTZWxlY3RlZFBsdWdpbnMoKSAhPSBudWxsKSB7Ci0JCQlhc3NvY2lhdGVkQ29uZmlnTWFwLmNsZWFyKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRTZWxlY3RlZFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kUGx1Z2luIGVsZW1lbnQgPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCQlhc3NvY2lhdGVkQ29uZmlnTWFwLnB1dChlbGVtZW50LCBMaWJyYXJ5VXRpbAotCQkJCQkJLmdldEFzc29jaWF0ZWRDb25maWd1cmF0aW9ucyhlbGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9QbHVnaW5FeHBvcnRTZXJ2aWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvUGx1Z2luRXhwb3J0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0M2JhNmVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9QbHVnaW5FeHBvcnRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29weTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0vKioKLSAqIEV4cG9ydHMgb25lIG9yIG1vcmUgbWV0aG9kIHBsdWctaW5zIHRvIGEgdGFyZ2V0IGRpcmVjdG9yeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MjE1MwotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luRXhwb3J0U2VydmljZSBleHRlbmRzIEJhc2VFeHBvcnRTZXJ2aWNlIHsKLQotCVBsdWdpbkV4cG9ydERhdGEgZGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFBsdWdpbkV4cG9ydFNlcnZpY2UoUGx1Z2luRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogUnVuIHRvIGV4cG9ydCBwbHVnaW5zCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQltb25pdG9yLnNldFRhc2tOYW1lKEV4cG9ydFJlc291cmNlcy5QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzApOyAvLyROT04tTkxTLTEkCi0KLQkJTGlzdCBwbHVnaW5zID0gZGF0YS5zZWxlY3RlZFBsdWdpbnM7Ci0JCWlmIChwbHVnaW5zID09IG51bGwgfHwgcGx1Z2lucy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJbW9uaXRvci5zZXRUYXNrTmFtZShFeHBvcnRSZXNvdXJjZXMuUGx1Z2luRXhwb3J0U2VydmljZV9NU0cxKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIENyZWF0ZSB0aGUgbGlicmFyeSBmb2xkZXIgaW4gdGhlIHRhcmdldCBkaXJlY3RvcnkuCi0JCVN0cmluZyBleHBvcnRMaWJQYXRoID0gKG5ldyBGaWxlKGRhdGEubGxEYXRhLmdldFBhcmVudEZvbGRlcigpKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCUZpbGUgZXhwb3J0TGliRm9sZGVyID0gbmV3IEZpbGUoZXhwb3J0TGliUGF0aCk7Ci0JCWlmICghZXhwb3J0TGliRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQlleHBvcnRMaWJGb2xkZXIubWtkaXIoKTsKLQkJfQotCi0JCUZpbGUgbGliRm9sZGVyID0gbnVsbDsKLQotCQltb25pdG9yLnNldFRhc2tOYW1lKEV4cG9ydFJlc291cmNlcy5QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gSXRlcmF0ZSB0aGUgc2VsZWN0ZWQgcGx1Zy1pbnMgYW5kIGNvcHkgdGhlaXIgYXNzb2NpYXRlZCBtb2RlbCBmaWxlcy4KLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvLyBTdGVwIDE6IENyZWF0ZSB0aGUgcGx1Zy1pbiBmb2xkZXIuCi0JCQlVUkkgdXJpID0gcGx1Z2luLmVSZXNvdXJjZSgpLmdldFVSSSgpOwotCQkJU3RyaW5nIHBhdGggPSB1cmkudG9GaWxlU3RyaW5nKCk7Ci0KLQkJCUZpbGUgcGx1Z2luRm9sZGVyID0gKG5ldyBGaWxlKHBhdGgpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQlpZiAobGliRm9sZGVyID09IG51bGwpIHsKLQkJCQlsaWJGb2xkZXIgPSBwbHVnaW5Gb2xkZXIuZ2V0UGFyZW50RmlsZSgpOwotCQkJfQotCi0JCQlTdHJpbmcgcGx1Z2luUGF0aCA9IGxpYkZvbGRlci50b1VSSSgpLnJlbGF0aXZpemUoCi0JCQkJCXBsdWdpbkZvbGRlci50b1VSSSgpKS5nZXRQYXRoKCk7Ci0JCQlGaWxlIGV4cG9ydFBsdWdpbkZvbGRlciA9IG5ldyBGaWxlKGV4cG9ydExpYkZvbGRlciwgcGx1Z2luUGF0aCk7Ci0KLQkJCS8vIFN0ZXAgMjogQ29weSB0aGUgcGx1Zy1pbiBmaWxlcy4KLQkJCWNvcHlEaXIocGx1Z2luRm9sZGVyLCBleHBvcnRQbHVnaW5Gb2xkZXIpOwkJCQotCQl9Ci0KLQkJbW9uaXRvci5zZXRUYXNrTmFtZShFeHBvcnRSZXNvdXJjZXMuUGx1Z2luRXhwb3J0U2VydmljZV9NU0czKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEdldCB0aGUgc2VsZWN0ZWQgcGx1Zy1pbiBhbmQgY29uZmlndXJhdGlvbiBpZHMgc28gd2UgY2FuIHJlbW92ZSB0aGUKLQkJLy8gdW5uZWVkZWQgc3R1ZmYuCi0JCWdldFNlbGVjdGVkSWRzKGRhdGEuc2VsZWN0ZWRQbHVnaW5zLCBkYXRhLmFzc29jaWF0ZWRDb25maWdNYXApOwotCi0JCS8vIFN0ZXAgMzogTG9hZCB0aGUgbGlicmFyeS54bWkgYW5kIHRoZSByZXNtZ3IueG1pLCByZW1vdmUgdGhlIHVubmVlZGVkCi0JCS8vIHN0dWZmLgotCQlMaWJyYXJ5RG9jdW1lbnQgZG9jdW1lbnQgPSBwcm9jZXNzTGlicmFyeUZpbGUobmV3IEZpbGUobGliRm9sZGVyLCBsaWJyYXJ5RmlsZSksIG5ldyBGaWxlKAotCQkJCWV4cG9ydExpYkZvbGRlciwgZXhwb3J0RmlsZSkpOwotCi0JCWlmICggZG9jdW1lbnQgIT0gbnVsbCApIHsKLQkJCS8vIGNvcHkgdGhlIGNvbmlmdXJhdGlvbiBmaWxlcwotCQkJLy8gMTQyMzc5IC0gdXBkYXRlIHBsdWdpbiBpbXBvcnRpbmcgYW5kIGV4cG9ydGluZyB0byBtYXRjaCB3aXRoIHRoZSBuZXcgZmlsZSBmb3JtYXQKLQkJCWNvcHlDb25maWd1cmF0aW9uRmlsZXMoZG9jdW1lbnQsIGxpYkZvbGRlciwgZXhwb3J0TGliRm9sZGVyKTsKLQkJfQotCQkKLQkJbW9uaXRvci5zZXRUYXNrTmFtZShFeHBvcnRSZXNvdXJjZXMuUGx1Z2luRXhwb3J0U2VydmljZV9NU0c0KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCQotCXByaXZhdGUgdm9pZCBjb3B5Q29uZmlndXJhdGlvbkZpbGVzKExpYnJhcnlEb2N1bWVudCBkb2N1bWVudCwgRmlsZSBsaWJGb2xkZXIsIEZpbGUgZXhwb3J0TGliRm9sZGVyKSB7Ci0JCS8vIC8vIDE0MjM3OSAtIHVwZGF0ZSBwbHVnaW4gaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgdG8gbWF0Y2ggd2l0aCB0aGUgbmV3IGZpbGUgZm9ybWF0Ci0JCS8vIEdldCB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBpZHMuCi0JCWZvciAoSXRlcmF0b3IgaXRjID0gZGF0YS5hc3NvY2lhdGVkQ29uZmlnTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Yy5oYXNOZXh0KCk7KSB7Ci0JCQlMaXN0IGNvbmZpZ3MgPSAoTGlzdCkgaXRjLm5leHQoKTsKLQkJCWlmIChjb25maWdzID09IG51bGwgfHwgY29uZmlncy5zaXplKCkgPT0gMCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29uZmlncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXQubmV4dCgpOwotCQkJCVN0cmluZyBndWlkID0gY29uZmlnLmdldEd1aWQoKTsKLQkJCQlTdHJpbmcgdXJpID0gZG9jdW1lbnQuZ2V0UmVzb3VyY2VVcmkoZ3VpZCk7Ci0JCQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQkJCVVSSSByZXNVcmkgPSBjb25maWcuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQkJCXVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FICsgRmlsZS5zZXBhcmF0b3IgKyByZXNVcmkubGFzdFNlZ21lbnQoKTsKLQkJCQkJdXJpID0gZG9jdW1lbnQuZGVjb2RlVXJpKHVyaSk7Ci0JCQkJfQkJCQkKLQkJCQlpZiAoIHVyaSAhPSBudWxsICkgewotCQkJCQlGaWxlIHNyYyA9IG5ldyBGaWxlKGxpYkZvbGRlciwgdXJpKTsKLQkJCQkJRmlsZSB0YXJnZXQgPSAgbmV3IEZpbGUoZXhwb3J0TGliRm9sZGVyLCB1cmkpOwotCQkJCQlSZXNvdXJjZUhlbHBlci5jb3B5RmlsZShzcmMsIHRhcmdldCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIGRpcmVjdG9yaWVzIGZyb20gImZyb21EaXIiIHRvICJ0b0RpciIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlEaXIoRmlsZSBmcm9tRGlyLCBGaWxlIHRvRGlyKSB7Ci0JCUNvcHkgY3AgPSBuZXcgQ29weSgpOwotCQljcC5zZXRPdmVyd3JpdGUodHJ1ZSk7Ci0JCUZpbGVTZXQgc2V0ID0gbmV3IEZpbGVTZXQoKTsKLQkJc2V0LnNldEV4Y2x1ZGVzKENvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlLmV4Y2x1ZGVzKTsKLQkJc2V0LnNldERpcihmcm9tRGlyKTsKLQkJY3AuYWRkRmlsZXNldChzZXQpOwotCQljcC5zZXRUb2Rpcih0b0Rpcik7Ci0JCWNwLnNldFByb2plY3QobmV3IFByb2plY3QoKSk7Ci0JCWNwLnNldFByZXNlcnZlTGFzdE1vZGlmaWVkKHRydWUpOwotCQljcC5leGVjdXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFNlbGVjdGVkSWRzKExpc3QgcGx1Z2lucywgTWFwIGNvbmZpZ3NNYXApIHsKLQkJc2VsZWN0ZWRJZHMuY2xlYXIoKTsKLQkJc2VsZWN0ZWRQbHVnaW5OYW1lcy5jbGVhcigpOwotCi0JCS8vIEdldCB0aGUgcGx1Zy1pbiBpZHMgYW5kIG5hbWVzLgotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJU3RyaW5nIGd1aWQgPSBwbHVnaW4uZ2V0R3VpZCgpOwotCQkJc2VsZWN0ZWRQbHVnaW5OYW1lcy5hZGQocGx1Z2luLmdldE5hbWUoKSk7Ci0JCQlpZiAoIXNlbGVjdGVkSWRzLmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJc2VsZWN0ZWRJZHMuYWRkKGd1aWQpOwotCQkJfQotCQl9Ci0KLQkJLy8gU2F2ZSB0aGUgbGlicmFyeSBndWlkIHNvIHRoYXQgdGhlIGVudHJ5IGluIHJlc2dyLnhtaSB3aWxsIGJlIGtlcHQuCi0JCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSAoTWV0aG9kTGlicmFyeSkgcGx1Z2luLmVDb250YWluZXIoKTsKLQkJCWlmIChsaWIgIT0gbnVsbCkgewotCQkJCXNlbGVjdGVkSWRzLmFkZChsaWIuZ2V0R3VpZCgpKTsKLQkJCX0KLQkJfQotCi0JCS8vIEdldCB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBpZHMuCi0JCWZvciAoSXRlcmF0b3IgaXRjID0gY29uZmlnc01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGMuaGFzTmV4dCgpOykgewotCQkJTGlzdCBjb25maWdzID0gKExpc3QpIGl0Yy5uZXh0KCk7Ci0JCQlpZiAoY29uZmlncyA9PSBudWxsIHx8IGNvbmZpZ3Muc2l6ZSgpID09IDApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNvbmZpZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0Lm5leHQoKTsKLQkJCQlTdHJpbmcgZ3VpZCA9IGNvbmZpZy5nZXRHdWlkKCk7Ci0JCQkJaWYgKHNlbGVjdGVkSWRzLmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCS8vIEFkZCB0aGUgY29uZmlndXJhdGlvbi4KLQkJCQlzZWxlY3RlZElkcy5hZGQoZ3VpZCk7Ci0KLQkJCQkvLyBGb3IgZWFjaCBjb25maWd1cmF0aW9uLCBzYXZlIHRoZSBtZXRob2QgcGx1Zy1pbiBhbmQgcGFja2FnZQotCQkJCS8vIGlkcyBzbyB0aGF0IHRoZWlyIGVudHJpZXMgaW4gdGhlIHJlc291cmNlIGZpbGUgY2FuIGJlIGtlcHQuCi0JCQkJTGlzdCByZWZzID0gY29uZmlnLmVDcm9zc1JlZmVyZW5jZXMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHJlZnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG8gPSBpdHIubmV4dCgpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBvIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCQkJZ3VpZCA9ICgoTWV0aG9kRWxlbWVudCkgbykuZ2V0R3VpZCgpOwotCQkJCQkJaWYgKCFzZWxlY3RlZElkcy5jb250YWlucyhndWlkKSkgewotCQkJCQkJCXNlbGVjdGVkSWRzLmFkZChndWlkKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIlVuZXhwZWN0ZWQgZWxlbWVudCB0eXBlICciICsgKChNZXRob2RFbGVtZW50KSBvKS5nZXRUeXBlKCkuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkrICInIGluIGNvbmZpZ3VyYXRpb24gJyIgKyBjb25maWcuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZDRhYWE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBhbmQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBtZXRob2QgcGx1Zy1pbiBhbmQgY29uZmlndXJhdGlvbiBleHBvcnQgc2VydmljZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRGVzdGluYXRpb25Db21tb25QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9EZXN0aW5hdGlvbkNvbW1vblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmI5Yjc3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9EZXN0aW5hdGlvbkNvbW1vblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkxpYnJhcnlMb2NhdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBmb3IgYW4KLSAqIGV4cG9ydCBvciBpbXBvcnQgb3BlcmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3NDAxCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXN0aW5hdGlvbkNvbW1vblBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwYWdlVGl0bGUgPSBFeHBvcnRSZXNvdXJjZXMuRGVzdGluYXRpb25Db21tb25QYWdlX3RpdGxlOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcGFnZURlc2MgPSBFeHBvcnRSZXNvdXJjZXMuRGVzdGluYXRpb25Db21tb25QYWdlX2Rlc2M7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY29udGFpbmVyOwotCi0JcHJvdGVjdGVkIENvbWJvIGN0cmxfZXhwb3J0UGF0aDsKLQotCXByb3RlY3RlZCBCdXR0b24gY3RybF9icm93c2VfYnV0dG9uOwotCi0JcHJvdGVjdGVkIExpYnJhcnlMb2NhdGlvbkRhdGEgbGxEYXRhOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGVzdGluYXRpb25Db21tb25QYWdlKFN0cmluZyBwYWdlTmFtZSwgTGlicmFyeUxvY2F0aW9uRGF0YSBsbERhdGEpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShwYWdlVGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihwYWdlRGVzYyk7Ci0JCXRoaXMubGxEYXRhID0gbGxEYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgRXhwb3J0UmVzb3VyY2VzLkRlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9kaXIpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfZXhwb3J0UGF0aCA9IHN1cGVyLmNyZWF0ZUNvbWJvYm94KGNvbnRhaW5lciwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9icm93c2VfYnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5OT05FKTsKLQkJY3RybF9icm93c2VfYnV0dG9uLnNldFRleHQoRXhwb3J0UmVzb3VyY2VzLkRlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9icm93c2UpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfYnJvd3NlX2J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlvcGVuRGlyZWN0b3J5RGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgIiIpOyAvLyROT04tTkxTLTEkCQkKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0KLQkJaW5pdENvbWJvSXRlbXMoKTsKLQkJCi0JCXNldERlZmF1bHRWYWx1ZSgpOwotCQkKLQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFZhbHVlKCl7Ci0vLwkJc2V0IGxhc3Qgb3BlbmVkIGRpciBhcyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gd2hlbiBpbml0IHRoaXMgcGFnZQotCQlhZGREZWZhdWx0VG9JdGVtcygpOwotCQljdHJsX2V4cG9ydFBhdGguc2VsZWN0KDApOwotCQljdHJsX2V4cG9ydFBhdGguc2V0RW5hYmxlZCh0cnVlKTsKLQkJY3RybF9icm93c2VfYnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdFRvSXRlbXMoKXsKLQkJU3RyaW5nW10gaXRlbXMgPSBjdHJsX2V4cG9ydFBhdGguZ2V0SXRlbXMoKTsKLQkJaW50IGluZGV4PTA7Ci0JCWlmKGl0ZW1zIT1udWxsICYmIGl0ZW1zLmxlbmd0aD4wKXsKLQkJCWZvcihpbnQgaT0wOyBpPGl0ZW1zLmxlbmd0aDsgaSsrKXsKLQkJCQlpZihpdGVtc1tpXS5lcXVhbHMoRXhwb3J0VUlQcmVmZXJlbmNlcy5nZXREZWZhdWx0RXhwb3J0UGF0aCgpKSkKLQkJCQkJcmV0dXJuOwotCQkJCWluZGV4ID0gaTsKLQkJCX0KLQkJCWluZGV4Kys7Ci0JCX0KLQkJaWYoaW5kZXg+RXhwb3J0VUlQcmVmZXJlbmNlcy5nZXRMaXN0TGVuZ3RoKCktMSl7Ci0JCQlpbmRleCA9IEV4cG9ydFVJUHJlZmVyZW5jZXMuZ2V0TGlzdExlbmd0aCgpLTE7Ci0JCQljdHJsX2V4cG9ydFBhdGgucmVtb3ZlKGluZGV4KTsKLQkJfQotCQljdHJsX2V4cG9ydFBhdGguYWRkKEV4cG9ydFVJUHJlZmVyZW5jZXMuZ2V0RGVmYXVsdEV4cG9ydFBhdGgoKSwgaW5kZXgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWN0cmxfZXhwb3J0UGF0aC5hZGRMaXN0ZW5lcihTV1QuRm9jdXNJbiwgdGhpcyk7Ci0JCWN0cmxfZXhwb3J0UGF0aC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQkJY3RybF9leHBvcnRQYXRoLmFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgdGhpcyk7Ci0JCWN0cmxfZXhwb3J0UGF0aC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nUGFnZSNzZXRWaXNpYmxlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJaWYgKHZpc2libGUpIHsKLQkJCURpc3BsYXkgZGlzcGxheSA9IGNvbnRhaW5lci5nZXREaXNwbGF5KCk7Ci0JCQlpZiAoIShkaXNwbGF5ID09IG51bGwgfHwgZGlzcGxheS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQljdHJsX2V4cG9ydFBhdGguc2V0Rm9jdXMoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlXaXphcmQgd2l6YXJkID0gKFdpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCQotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCXdpemFyZC5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlVG9EYXRhTW9kZWwoKSB7Ci0JCVN0cmluZyBsaWJOYW1lID0gY3RybF9leHBvcnRQYXRoLmdldFRleHQoKTsKLQkJaWYgKGxpYk5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpZiAoIWxpYk5hbWUuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKXsKLQkJCQlsaWJOYW1lID0gbGliTmFtZS5zdWJzdHJpbmcobGliTmFtZS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcikrMSwgbGliTmFtZS5sZW5ndGgoKSk7Ci0JCQl9ZWxzZQotCQkJCWxpYk5hbWUgPSAiIjsKLQkJfQotCQlsbERhdGEuc2V0TGliTmFtZShsaWJOYW1lKTsKLQkJbGxEYXRhLnNldFBhcmVudEZvbGRlcihjdHJsX2V4cG9ydFBhdGguZ2V0VGV4dCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbkRpcmVjdG9yeURpYWxvZygpIHsKLQkJdHJ5IHsKLQkJCURpcmVjdG9yeURpYWxvZyBkZCA9IG5ldyBEaXJlY3RvcnlEaWFsb2coY29udGFpbmVyLmdldFNoZWxsKCksCi0JCQkJCVNXVC5OT05FKTsKLQkJCWRkLnNldEZpbHRlclBhdGgoY3RybF9leHBvcnRQYXRoLmdldFRleHQoKSk7Ci0KLQkJCVN0cmluZyBkZXN0aW5hdGlvbiA9IGRkLm9wZW4oKTsKLQkJCWlmIChkZXN0aW5hdGlvbiAhPSBudWxsKSB7Ci0JCQkJY3RybF9leHBvcnRQYXRoLnNldFRleHQoZGVzdGluYXRpb24pOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIHVzZSB0aGUgb3BlbmVkIGRpcnMgdG8gaW5pdCBjb21ibyBsaXN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbWJvSXRlbXMoKXsKLQkJcmV0dXJuOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWdDaGVja2luZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDgwZjQyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWdDaGVja2luZ1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUNvbmZpZ3VyYXRpb25DbG9zdXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IGRpc3BsYXlzIHRoZSByZXN1bHQgb2YgYSBjb25maWd1cmF0aW9uIGludGVncml0eSBjaGVjay4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IEV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgVGV4dFZpZXdlciB0ZXh0Vmlld2VyOwotCi0JcHJpdmF0ZSBUZXh0UHJlc2VudGF0aW9uIHN0eWxlOwotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhOwotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkNsb3N1cmUgY2xvc3VyZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2UoQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShFeHBvcnRSZXNvdXJjZXMuY2hlY2tDb25maWdQYWdlX3RpdGxlKTsgCi0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFJlc291cmNlcy5jaGVja0NvbmZpZ1BhZ2VfZGVzYyk7IAotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL0V4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJdGV4dFZpZXdlciA9IGNyZWF0ZVRleHRWaWV3ZXIoY29udGFpbmVyLCAzNjAsIDE2MCwgMSk7Ci0JCURvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgiICIpOyAvLyROT04tTkxTLTEkCi0JCXRleHRWaWV3ZXIuc2V0RG9jdW1lbnQoZG9jKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzcGxheVN1bW1hcnkoKSB7Ci0JCXN0eWxlID0gbmV3IFRleHRQcmVzZW50YXRpb24oKTsKLQkJRG9jdW1lbnQgZG9jID0gZ2V0U3VtbWFyeVRleHQoKTsKLQkJdGV4dFZpZXdlci5zZXREb2N1bWVudChkb2MpOwotCQl0ZXh0Vmlld2VyLmNoYW5nZVRleHRQcmVzZW50YXRpb24oc3R5bGUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2Ujb25FbnRlclBhZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJZGlzcGxheVN1bW1hcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZG9jdW1lbnQgb2Ygc3VtbWFyeSB0ZXh0LgotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBnZXRTdW1tYXJ5VGV4dCgpIHsKLQkJZmluYWwgU3RyaW5nQnVmZmVyIHRleHRCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJaWYgKGRhdGEuc2VsZWN0ZWRDb25maWdzLnNpemUoKSA9PSAwKSB7Ci0JCQl0ZXh0QnVmLmFwcGVuZChFeHBvcnRSZXNvdXJjZXMuRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCWZpbmFsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGRhdGEuc2VsZWN0ZWRDb25maWdzCi0JCQkJCS5nZXQoMCk7Ci0JCQlpZiAoKGNsb3N1cmUgPT0gbnVsbCkgfHwgKGNsb3N1cmUuZ2V0Q29uZmlndXJhdGlvbigpICE9IGNvbmZpZykpIHsKLQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkvLyBDaGVjayB0aGUgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotCQkJCQkJY2xvc3VyZSA9IG5ldyBDb25maWd1cmF0aW9uQ2xvc3VyZShjb25maWcpOwotCQkJCQl9Ci0KLQkJCQl9OwotCi0JCQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgRXhwb3J0UmVzb3VyY2VzLkV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9jaGVja2luZyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCUxpc3QgZXJyb3JzID0gY2xvc3VyZS5nZXRBbGxFcnJvcnMoKTsKLQkJaWYgKGVycm9ycy5zaXplKCkgPT0gMCkgewotCQkJdGV4dEJ1Zi5hcHBlbmQoRXhwb3J0UmVzb3VyY2VzLkV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzMpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQl0ZXh0QnVmCi0JCQkJCS5hcHBlbmQoRXhwb3J0UmVzb3VyY2VzLmJpbmQoRXhwb3J0UmVzb3VyY2VzLkV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzQsIChuZXcgT2JqZWN0W10geyBJbnRlZ2VyLnRvU3RyaW5nKGVycm9ycy5zaXplKCkpIH0pKSk7IAotCQl9Ci0KLQkJRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KHRleHRCdWYudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBkb2M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWdDaG9vc2VNb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWdDaG9vc2VNb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ4NzRjMzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IGRpc3BsYXlzIHRoZSB0eXBlcyBvZiBjb25maWd1cmF0aW9uIHRoYXQgY2FuIGJlIGV4cG9ydGVkLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMgTGlzdGVuZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgQnV0dG9uIG9uZUNvbmZpZ0J1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGNvbmZpZ1NwZWNCdXR0b247Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRDb25maWdDaG9vc2VNb2RlKENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoRXhwb3J0UmVzb3VyY2VzLnNlbGVjdEV4cG9ydFR5cGVQYWdlX3RpdGxlKTsgCi0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFJlc291cmNlcy5zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL0V4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJb25lQ29uZmlnQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oCi0JCQkJY29udGFpbmVyLAotCQkJCUV4cG9ydFJlc291cmNlcy5zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdMYWJlbF90ZXh0LCAxLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JCWNvbmZpZ1NwZWNCdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbigKLQkJCQljb250YWluZXIsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLnNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ1NwZWNzTGFiZWxfdGV4dCwgMSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJb25lQ29uZmlnQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQljb25maWdTcGVjQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVEYXRhVG9Nb2RlbCgpIHsKLQkJZGF0YS5leHBvcnRPbmVDb25maWcgPSBvbmVDb25maWdCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCWRhdGEuZXhwb3J0Q29uZmlnU3BlY3MgPSBjb25maWdTcGVjQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJc2F2ZURhdGFUb01vZGVsKCk7Ci0JCWlmIChkYXRhLmV4cG9ydE9uZUNvbmZpZykgewotCQkJRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZSBwYWdlID0gKChFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkuc2VsZWN0Q29uZmlnUGFnZTsKLQkJCXJldHVybiBwYWdlOwotCQl9IGVsc2UgaWYgKGRhdGEuZXhwb3J0Q29uZmlnU3BlY3MpIHsKLQkJCUV4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZSBwYWdlID0gKChFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkuc2VsZWN0U3BlY3NQYWdlOwotCQkJcmV0dXJuIHBhZ2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWdEZXN0aW5hdGlvblBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNDQwNDM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0RGF0YTsKLQotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIGZvciB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IG9mIGFuCi0gKiBleHBvcnQgb3BlcmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0Q29uZmlnRGVzdGluYXRpb25QYWdlIGV4dGVuZHMgRGVzdGluYXRpb25Db21tb25QYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IEV4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZShDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSwgZGF0YS5sbERhdGEpOwotCQlzZXRUaXRsZShFeHBvcnRSZXNvdXJjZXMuc2VsZWN0RGVzdGluYXRpb25QYWdlX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMuc2VsZWN0RGVzdGluYXRpb25QYWdlX2Rlc2MpOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vRXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCUV4cG9ydENvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkID0gKEV4cG9ydENvbmZpZ3VyYXRpb25XaXphcmQpIGdldFdpemFyZCgpOwotCQlpZiAoY3RybF9leHBvcnRQYXRoLmdldFRleHQoKS5sZW5ndGgoKT4wICYmICFjdHJsX2V4cG9ydFBhdGguZ2V0VGV4dCgpLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgewotCQkJc2F2ZVRvRGF0YU1vZGVsKCk7Ci0JCQl3aXphcmQub2tUb0NvbXBsZXRlID0gdHJ1ZTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXdpemFyZC5va1RvQ29tcGxldGUgPSBmYWxzZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRGVzdGluYXRpb25Db21tb25QYWdlI2luaXRDb21ib0l0ZW1zKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29tYm9JdGVtcygpIHsKLQkJTGlzdCBkaXJMaXN0ID0gRXhwb3J0VUlQcmVmZXJlbmNlcy5nZXRSZWNlbnRseUV4cG9ydGVkQ29uZmlnRGlycygpOwotCQkKLQkJaWYoZGlyTGlzdCE9bnVsbCAmJiAhZGlyTGlzdC5pc0VtcHR5KCkpewotCQkJU3RyaW5nW10gZGlycyA9IG5ldyBTdHJpbmdbZGlyTGlzdC5zaXplKCldOwotCQkJZm9yKGludCBpPTA7IGk8ZGlyTGlzdC5zaXplKCk7IGkrKyl7Ci0JCQkJZGlyc1tpXSA9IGRpckxpc3QuZ2V0KGkpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQljdHJsX2V4cG9ydFBhdGguc2V0SXRlbXMoZGlycyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDNiNTNlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHRvCi0gKiBleHBvcnQuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cwotCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLCBMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBFeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgY3RybF90YWJsZVZpZXdlcjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmRGVzYzsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UoQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShFeHBvcnRSZXNvdXJjZXMuc2VsZWN0Q29uZmlnUGFnZV90aXRsZSk7IAotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMuc2VsZWN0Q29uZmlnUGFnZV9kZXNjKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL0V4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBFeHBvcnRSZXNvdXJjZXMuc2VsZWN0Q29uZmlnUGFnZV9jb25maWdzTGFiZWxfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQotCQljdHJsX3RhYmxlVmlld2VyID0gY3JlYXRlVGFibGVWaWV3ZXIoY29udGFpbmVyLCAzNjAsIDEyMCwgMSk7Ci0JCXRhYmxlID0gY3RybF90YWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25zKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gTGlicmFyeVVJSW1hZ2VzLklNR19NRVRIT0RfUExVR0lOOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQkJcmV0dXJuICgoTWV0aG9kQ29uZmlndXJhdGlvbikgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQljdHJsX3RhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCWN0cmxfdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJaWYgKGNvbmZpZ3MgIT0gbnVsbCkgewotCQkJY3RybF90YWJsZVZpZXdlci5zZXRJbnB1dChjb25maWdzKTsKLQkJfQotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgQXV0aG9yaW5nVUlUZXh0LkJSSUVGX0RFU0NSSVBUSU9OX1RFWFQpOyAvLyROT04tTkxTLTEkCi0KLQkJY3RybF9icmllZkRlc2MgPSBjcmVhdGVUZXh0TXVsdGkoY29udGFpbmVyLCAiIiwgMzYwLCA4MCwgMyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoY29uZmlncyAhPSBudWxsICYmIGNvbmZpZ3MubGVuZ3RoID4gMCkgewotCQkJdGFibGUuc2VsZWN0KDApOwotCQkJc2V0RGlzcGxheUF0dHJpYnV0ZXMoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ3NbMF0pOwotCQl9Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJY3RybF90YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBjb25maWdzID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCXNldERpc3BsYXlBdHRyaWJ1dGVzKChNZXRob2RDb25maWd1cmF0aW9uKSBjb25maWdzWzBdKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlzcGxheUF0dHJpYnV0ZXMoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJY3RybF9icmllZkRlc2Muc2V0VGV4dChjb25maWcuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlRGF0YVRvTW9kZWwoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY3RybF90YWJsZVZpZXdlcgotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0W10gY29uZmlncyA9IHNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ3NbMF07Ci0JCUxpc3QgYXJyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYXJyTGlzdC5hZGQoY29uZmlnKTsKLQkJZGF0YS5zZWxlY3RlZENvbmZpZ3MgPSBhcnJMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJc2F2ZURhdGFUb01vZGVsKCk7Ci0JCUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZSBwYWdlID0gKChFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkuY29uZmlnQ2hlY2tpbmdQYWdlOwotCQlwYWdlLm9uRW50ZXJQYWdlKG51bGwpOwotCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnU2VsZWN0U3BlY3NQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY3YjIzMDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnU2VsZWN0U3BlY3NQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IG9uZSBvciBtb3JlIG1ldGhvZAotICogY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucyB0byBleHBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSUNoZWNrU3RhdGVMaXN0ZW5lciwgTGlzdGVuZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gRXhwb3J0Q29uZmlnU2VsZWN0U3BlY3NQYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBjdHJsX2Noa2JveFRhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZEZXNjOwotCi0JcHJpdmF0ZSBpbnQgY2hlY2tlZENvdW50ID0gMDsKLQotCXByaXZhdGUgTGlzdCBjaGVja2VkQ29uZmlnTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZShDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEV4cG9ydFJlc291cmNlcy5zZWxlY3RDb25maWdTcGVjc1BhZ2VfdGl0bGUpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFJlc291cmNlcy5zZWxlY3RDb25maWdTcGVjc1BhZ2VfZGVzYyk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9FeHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgRXhwb3J0UmVzb3VyY2VzLnNlbGVjdENvbmZpZ1NwZWNzUGFnZV9jb25maWdzTGFiZWxfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyID0gY3JlYXRlQ2hlY2tib3hUYWJsZVZpZXdlcihjb250YWluZXIsIDEpOwotCQl0YWJsZSA9IGN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLQotCQlNZXRob2RDb25maWd1cmF0aW9uW10gY29uZmlncyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9ucyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0KLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX1BMVUdJTjsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJCXJldHVybiAoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWlmIChjb25maWdzICE9IG51bGwpIHsKLQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0SW5wdXQoY29uZmlncyk7Ci0JCX0KLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsIEF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhUKTsKLQkJY3RybF9icmllZkRlc2MgPSBjcmVhdGVUZXh0TXVsdGkoY29udGFpbmVyLCAiIiwgMzYwLCA4MCwgMyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoY29uZmlncyAhPSBudWxsICYmIGNvbmZpZ3MubGVuZ3RoID4gMCkgewotCQkJc2V0RGlzcGxheUF0dHJpYnV0ZXMoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ3NbMF0pOwotCQl9Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyI2NoZWNrU3RhdGVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdCBvYmogPSBldmVudC5nZXRFbGVtZW50KCk7Ci0KLQkJaWYgKGV2ZW50LmdldENoZWNrZWQoKSkgewotCQkJY2hlY2tlZENvdW50Kys7Ci0JCQljaGVja2VkQ29uZmlnTGlzdC5hZGQob2JqKTsKLQkJfSBlbHNlIHsKLQkJCWNoZWNrZWRDb3VudC0tOwotCQkJY2hlY2tlZENvbmZpZ0xpc3QucmVtb3ZlKG9iaik7Ci0JCX0KLQotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIGNvbmZpZ3MgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJc2V0RGlzcGxheUF0dHJpYnV0ZXMoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ3NbMF0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlzcGxheUF0dHJpYnV0ZXMoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJY3RybF9icmllZkRlc2Muc2V0VGV4dChjb25maWcuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKGdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBjaGVja2VkQ291bnQgPiAwOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVEYXRhVG9Nb2RlbCgpIHsKLQkJZGF0YS5zZWxlY3RlZENvbmZpZ3MgPSBjaGVja2VkQ29uZmlnTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXNhdmVEYXRhVG9Nb2RlbCgpOwotCQlFeHBvcnRDb25maWdEZXN0aW5hdGlvblBhZ2UgcGFnZSA9ICgoRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLmRlc3RpbmF0aW9uUGFnZTsKLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFlNjJmMzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuU2F2ZUFsbEVkaXRvcnNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuRGlyZWN0b3J5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLQotLyoqCi0gKiBUaGUgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiB3aXphcmQuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7Ci0KLQlwcm90ZWN0ZWQgRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZSBtb2RlUGFnZTsKLQotCXByb3RlY3RlZCBFeHBvcnRDb25maWdTZWxlY3RTcGVjc1BhZ2Ugc2VsZWN0U3BlY3NQYWdlOwotCi0JcHJvdGVjdGVkIEV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2Ugc2VsZWN0Q29uZmlnUGFnZTsKLQotCXByb3RlY3RlZCBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2UgY29uZmlnQ2hlY2tpbmdQYWdlOwotCi0JcHJvdGVjdGVkIEV4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZSBkZXN0aW5hdGlvblBhZ2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBva1RvQ29tcGxldGUgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhID0gbmV3IENvbmZpZ3VyYXRpb25FeHBvcnREYXRhKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkKCkgewotCQlzZXRXaW5kb3dUaXRsZShFeHBvcnRSZXNvdXJjZXMuZXhwb3J0Q29uZmlnV2l6YXJkX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJU2F2ZUFsbEVkaXRvcnNQYWdlLmFkZFBhZ2VJZk5lZWRlZCh0aGlzLCBmYWxzZSwgbnVsbCwgbnVsbCwKLQkJCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmdWxsL3dpemJhbi9FeHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQltb2RlUGFnZSA9IG5ldyBFeHBvcnRDb25maWdDaG9vc2VNb2RlKGRhdGEpOwotCQlhZGRQYWdlKG1vZGVQYWdlKTsKLQotCQlzZWxlY3RTcGVjc1BhZ2UgPSBuZXcgRXhwb3J0Q29uZmlnU2VsZWN0U3BlY3NQYWdlKGRhdGEpOwotCQlhZGRQYWdlKHNlbGVjdFNwZWNzUGFnZSk7Ci0KLQkJc2VsZWN0Q29uZmlnUGFnZSA9IG5ldyBFeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlKGRhdGEpOwotCQlhZGRQYWdlKHNlbGVjdENvbmZpZ1BhZ2UpOwotCi0JCWNvbmZpZ0NoZWNraW5nUGFnZSA9IG5ldyBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2UoZGF0YSk7Ci0JCWFkZFBhZ2UoY29uZmlnQ2hlY2tpbmdQYWdlKTsKLQotCQlkZXN0aW5hdGlvblBhZ2UgPSBuZXcgRXhwb3J0Q29uZmlnRGVzdGluYXRpb25QYWdlKGRhdGEpOwotCQlhZGRQYWdlKGRlc3RpbmF0aW9uUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUxpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX0NPTkZJR1VSQVRPTik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJLy8gQ2Fubm90IGNvbXBsZXRlIHRoZSB3aXphcmQgaWYgaXQncyBub3QgdGhlIGxhc3QgcGFnZS4KLQkJaWYgKHRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKSAhPSBkZXN0aW5hdGlvblBhZ2UpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBva1RvQ29tcGxldGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlTdHJpbmcgZXhwb3J0TGliUGF0aCA9IGRhdGEubGxEYXRhLmdldFBhcmVudEZvbGRlcigpOwotCQlpZiAoIWNoZWNrQW5kQ3JlYXRlRGlyKGV4cG9ydExpYlBhdGgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3IKLQkJCQkJCQkuYmVnaW5UYXNrKAotCQkJCQkJCQkJRXhwb3J0UmVzb3VyY2VzLmV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJaWYgKGRhdGEudmFsaWRhdGUoKSkgewotCQkJCQkJaWYgKGRhdGEuZXhwb3J0Q29uZmlnU3BlY3MpIHsKLQkJCQkJCQkvLyBFeHBvcnQgY29uZmlndXJhdGlvbiBzcGVjcyBvbmx5LgotCQkJCQkJCShuZXcgQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZShkYXRhKSkKLQkJCQkJCQkJCS5ydW4obW9uaXRvcik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEV4cG9ydCBhIGNvbmZpZ3VyYXRpb24gY2xvc3VyZS4KLQkJCQkJCQkobmV3IENvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlKGRhdGEpKS5ydW4obW9uaXRvcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCBmYWxzZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUV4cG9ydFJlc291cmNlcy5leHBvcnRDb25maWdFcnJvckRpYWxvZ190aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQlyZWFsRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZGF0YS5lcnJvck1zZyAhPSBudWxsICYmIGRhdGEuZXJyb3JNc2cubGVuZ3RoKCkgPiAwKSB7Ci0JCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJRXhwb3J0UmVzb3VyY2VzLmV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCWRhdGEuZXJyb3JNc2cpOwotCQl9Ci0JCQotCQkvL3JlY29yZCB0aGlzIGV4cG9ydCBwYXRoIGludG8gcHJlZmVyZW5jZSBzdG9yZSB3aGVuIHN1Y2Nlc3MKLQkJRXhwb3J0VUlQcmVmZXJlbmNlcy5hZGRSZWNlbnRseUV4cG9ydENvbmZpZ0RpcihleHBvcnRMaWJQYXRoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tBbmRDcmVhdGVEaXIoU3RyaW5nIGRpcikgewotCQlyZXR1cm4gRGlyZWN0b3J5VmFsaWRhdG9yLmNoZWNrQW5kQ3JlYXRlRGlyKGRpciwgRXhwb3J0UmVzb3VyY2VzLmV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJRXhwb3J0UmVzb3VyY2VzLkV4cG9ydFBsdWdpbkVycm9yX21zZyk7IAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydFBsdWdpblN1bW1hcnlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQzMmRhNTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBkaXNwbGF5cyBhIHN1bW1hcnkgb2YgdGhlIHNlbGVjdGVkIG1ldGhvZCBwbHVnLWlucyB0aGF0Ci0gKiB3aWxsIGJlIGV4cG9ydGVkLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRQbHVnaW5TdW1tYXJ5UGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IEV4cG9ydFBsdWdpblN1bW1hcnlQYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBUZXh0Vmlld2VyIHRleHRWaWV3ZXI7Ci0KLQlwcml2YXRlIFRleHRQcmVzZW50YXRpb24gc3R5bGU7Ci0KLQlwcml2YXRlIFBsdWdpbkV4cG9ydERhdGEgZGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydFBsdWdpblN1bW1hcnlQYWdlKFBsdWdpbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShFeHBvcnRSZXNvdXJjZXMuZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfdGl0bGUpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFJlc291cmNlcy5leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9kZXNjKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL0V4cG9ydE1ldGhvZFBsdWdpbnMuZ2lmIikpOyAvLyROT04tTkxTLTEkCQkKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCXRleHRWaWV3ZXIgPSBjcmVhdGVUZXh0Vmlld2VyKGNvbnRhaW5lciwgMzYwLCAxNjAsIDEpOwotCQlEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoIiIpOyAvLyROT04tTkxTLTEkCQkKLQkJdGV4dFZpZXdlci5zZXREb2N1bWVudChkb2MpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNwbGF5U3VtbWFyeSgpIHsKLQkJc3R5bGUgPSBuZXcgVGV4dFByZXNlbnRhdGlvbigpOwotCQlEb2N1bWVudCBkb2MgPSBnZXRTdW1tYXJ5VGV4dCgpOwotCQl0ZXh0Vmlld2VyLnNldERvY3VtZW50KGRvYyk7Ci0JCXRleHRWaWV3ZXIuY2hhbmdlVGV4dFByZXNlbnRhdGlvbihzdHlsZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNvbkVudGVyUGFnZShPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgb25FbnRlclBhZ2UoT2JqZWN0IG9iaikgewotCQlkaXNwbGF5U3VtbWFyeSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBkb2N1bWVudCBvZiB0aGUgc3VtbWFyeSB0ZXh0LgotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBnZXRTdW1tYXJ5VGV4dCgpIHsKLQkJU3RyaW5nQnVmZmVyIHRleHRCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJaWYgKGRhdGEuc2VsZWN0ZWRQbHVnaW5zID09IG51bGwgfHwgZGF0YS5zZWxlY3RlZFBsdWdpbnMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG5ldyBEb2N1bWVudChFeHBvcnRSZXNvdXJjZXMuZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2Vfbm9QbHVnaW5fdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbnQgc3RhcnQgPSAwOwotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLnNlbGVjdGVkUGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGRhdGEuc2VsZWN0ZWRQbHVnaW5zLmdldChpKTsKLQkJCXN0YXJ0ID0gdGV4dEJ1Zi5sZW5ndGgoKTsKLQkJCW9mZnNldCA9IHBsdWdpbi5nZXROYW1lKCkubGVuZ3RoKCk7Ci0JCQlzdHlsZS5hZGRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCBvZmZzZXQsIG51bGwsIG51bGwsCi0JCQkJCVNXVC5CT0xEKSk7Ci0JCQl0ZXh0QnVmLmFwcGVuZChwbHVnaW4uZ2V0TmFtZSgpKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJc3RhcnQgPSB0ZXh0QnVmLmxlbmd0aCgpOwotCQkJb2Zmc2V0ID0gQXV0aG9yaW5nVUlUZXh0LkFVVEhPUlNfVEVYVC5sZW5ndGgoKTsKLQkJCXN0eWxlLmFkZFN0eWxlUmFuZ2UobmV3IFN0eWxlUmFuZ2Uoc3RhcnQsIG9mZnNldCwgbnVsbCwgbnVsbCwKLQkJCQkJU1dULkJPTEQgfCBTV1QuSVRBTElDKSk7Ci0JCQl0ZXh0QnVmCi0JCQkJCS5hcHBlbmQoIlx0IikuYXBwZW5kKEF1dGhvcmluZ1VJVGV4dC5BVVRIT1JTX1RFWFQpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0ZXh0QnVmLmFwcGVuZCgiXHRcdCIpLmFwcGVuZChwbHVnaW4uZ2V0QXV0aG9ycygpKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQlzdGFydCA9IHRleHRCdWYubGVuZ3RoKCk7Ci0JCQlvZmZzZXQgPSBBdXRob3JpbmdVSVRleHQuVkVSU0lPTl9URVhULmxlbmd0aCgpOwotCQkJc3R5bGUuYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZShzdGFydCwgb2Zmc2V0LCBudWxsLCBudWxsLAotCQkJCQlTV1QuQk9MRCB8IFNXVC5JVEFMSUMpKTsKLQkJCXRleHRCdWYKLQkJCQkJLmFwcGVuZCgiXHQiKS5hcHBlbmQoQXV0aG9yaW5nVUlUZXh0LlZFUlNJT05fVEVYVCkuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXRleHRCdWYuYXBwZW5kKCJcdFx0IikuYXBwZW5kKHBsdWdpbi5nZXRWZXJzaW9uKCkpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCXN0YXJ0ID0gdGV4dEJ1Zi5sZW5ndGgoKTsKLQkJCW9mZnNldCA9IEF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhULmxlbmd0aCgpOwotCQkJc3R5bGUuYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZShzdGFydCwgb2Zmc2V0LCBudWxsLCBudWxsLAotCQkJCQlTV1QuQk9MRCB8IFNXVC5JVEFMSUMpKTsKLQkJCXRleHRCdWYKLQkJCQkJLmFwcGVuZCgiXHQiKS5hcHBlbmQoQXV0aG9yaW5nVUlUZXh0LkJSSUVGX0RFU0NSSVBUSU9OX1RFWFQpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0ZXh0QnVmCi0JCQkJCS5hcHBlbmQoIlx0XHQiKS5hcHBlbmQocGx1Z2luLmdldEJyaWVmRGVzY3JpcHRpb24oKSkuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJc3RhcnQgPSB0ZXh0QnVmLmxlbmd0aCgpOwotCQkJb2Zmc2V0ID0gRXhwb3J0UmVzb3VyY2VzLnJldmlld1BsdWdpbnNQYWdlX2RlcGVuZGVudFBsdWdpbnNMYWJlbF90ZXh0Lmxlbmd0aCgpOyAvLyROT04tTkxTLTEkCi0JCQlzdHlsZS5hZGRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCBvZmZzZXQsIG51bGwsIG51bGwsCi0JCQkJCVNXVC5CT0xEIHwgU1dULklUQUxJQykpOwotCQkJdGV4dEJ1ZgotCQkJCQkuYXBwZW5kKCJcdCIpLmFwcGVuZChFeHBvcnRSZXNvdXJjZXMucmV2aWV3UGx1Z2luc1BhZ2VfZGVwZW5kZW50UGx1Z2luc0xhYmVsX3RleHQpLmFwcGVuZCgiXG4iKTsgCi0JCQlMaXN0IGRlcGVuZGVudFBsdWdpbkxpc3QgPSBwbHVnaW4uZ2V0QmFzZXMoKTsKLQkJCWJvb2xlYW4gYWRkTGluZWZlZWQgPSB0cnVlOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVwZW5kZW50UGx1Z2luTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RQbHVnaW4gZWxlbWVudCA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJCXRleHRCdWYuYXBwZW5kKCJcdFx0IikuYXBwZW5kKGVsZW1lbnQuZ2V0TmFtZSgpKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWFkZExpbmVmZWVkID0gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoYWRkTGluZWZlZWQpCi0JCQkJdGV4dEJ1Zi5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJc3RhcnQgPSB0ZXh0QnVmLmxlbmd0aCgpOwotCQkJb2Zmc2V0ID0gRXhwb3J0UmVzb3VyY2VzLnJldmlld1BsdWdpbnNQYWdlX2Fzc29jaWF0ZWRDb25maWdzTGFiZWxfdGV4dC5sZW5ndGgoKTsgLy8kTk9OLU5MUy0xJAotCQkJc3R5bGUuYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZShzdGFydCwgb2Zmc2V0LCBudWxsLCBudWxsLAotCQkJCQlTV1QuQk9MRCB8IFNXVC5JVEFMSUMpKTsKLQkJCXRleHRCdWYKLQkJCQkJLmFwcGVuZCgiXHQiKS5hcHBlbmQoRXhwb3J0UmVzb3VyY2VzLnJldmlld1BsdWdpbnNQYWdlX2Fzc29jaWF0ZWRDb25maWdzTGFiZWxfdGV4dCkuYXBwZW5kKCJcbiIpOyAKLQkJCUxpc3QgYXNzb2NpYXRlZENvbmZpZ0xpc3QgPSAoTGlzdCkgZGF0YS5hc3NvY2lhdGVkQ29uZmlnTWFwCi0JCQkJCS5nZXQocGx1Z2luKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFzc29jaWF0ZWRDb25maWdMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGVsZW1lbnQgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJdGV4dEJ1Zi5hcHBlbmQoIlx0XHQiKS5hcHBlbmQoZWxlbWVudC5nZXROYW1lKCkpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCXRleHRCdWYuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQodGV4dEJ1Zi50b1N0cmluZygpKTsKLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydFBsdWdpbldpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0UGx1Z2luV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyZWY5YjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0UGx1Z2luV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TYXZlQWxsRWRpdG9yc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuUGx1Z2luRXhwb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5EaXJlY3RvcnlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotCi0vKioKLSAqIFRoZSBFeHBvcnQgTWV0aG9kIFBsdWctaW4gd2l6YXJkLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRQbHVnaW5XaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJSW1wb3J0V2l6YXJkIHsKLQotCXByb3RlY3RlZCBTZWxlY3RQbHVnaW5QYWdlIHBhZ2UxOwotCi0JcHJvdGVjdGVkIFBsdWdpbkluZm9QYWdlIHBhZ2UyOwotCi0JcHJvdGVjdGVkIEV4cG9ydFBsdWdpblN1bW1hcnlQYWdlIHBhZ2UzOwotCi0JcHJvdGVjdGVkIFNhdmVQbHVnaW5QYWdlIHBhZ2U0OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gb2tUb0NvbXBsZXRlID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgUGx1Z2luRXhwb3J0RGF0YSBkYXRhID0gbmV3IFBsdWdpbkV4cG9ydERhdGEoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydFBsdWdpbldpemFyZCgpIHsKLQkJc2V0V2luZG93VGl0bGUoRXhwb3J0UmVzb3VyY2VzLmV4cG9ydFBsdWdpbnNXaXphcmRfdGl0bGUpOyAvLyROT04tTkxTLTEkCi0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlTYXZlQWxsRWRpdG9yc1BhZ2UuYWRkUGFnZUlmTmVlZGVkKHRoaXMsIGZhbHNlLCBudWxsLCBudWxsLAotCQkJCUV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZ1bGwvd2l6YmFuL0V4cG9ydE1ldGhvZFBsdWdpbnMuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0KLQkJcGFnZTEgPSBuZXcgU2VsZWN0UGx1Z2luUGFnZShkYXRhKTsKLQkJYWRkUGFnZShwYWdlMSk7Ci0KLQkJcGFnZTIgPSBuZXcgUGx1Z2luSW5mb1BhZ2UoZGF0YSk7Ci0JCWFkZFBhZ2UocGFnZTIpOwotCi0JCXBhZ2UzID0gbmV3IEV4cG9ydFBsdWdpblN1bW1hcnlQYWdlKGRhdGEpOwotCQlhZGRQYWdlKHBhZ2UzKTsKLQotCQlwYWdlNCA9IG5ldyBTYXZlUGx1Z2luUGFnZShkYXRhKTsKLQkJYWRkUGFnZShwYWdlNCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKExpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX1BMVUdJTik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJaWYgKHRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKSAhPSBwYWdlNCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG9rVG9Db21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCVN0cmluZyBleHBvcnRMaWJQYXRoID0gZGF0YS5sbERhdGEuZ2V0UGFyZW50Rm9sZGVyKCk7Ci0JCWlmIChjaGVja0FuZENyZWF0ZURpcihleHBvcnRMaWJQYXRoKSA9PSBmYWxzZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yCi0JCQkJCQkJLmJlZ2luVGFzaygKLQkJCQkJCQkJCUV4cG9ydFJlc291cmNlcy5FeHBvcnRQbHVnaW5XaXphcmRfTVNHMSwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCWlmIChkYXRhLnZhbGlkYXRlKCkpIHsKLQkJCQkJCShuZXcgUGx1Z2luRXhwb3J0U2VydmljZShkYXRhKSkucnVuKG1vbml0b3IpOwotCQkJCQl9Ci0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCBmYWxzZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJRXhwb3J0UGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJRXhwb3J0UmVzb3VyY2VzLkV4cG9ydFBsdWdpbldpemFyZF9lcnJvciwgcmVhbEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0vLwkJcmVjb3JkIHRoaXMgZXhwb3J0IHBhdGggaW50byBwcmVmZXJlbmNlIHN0b3JlIHdoZW4gc3VjY2VzcwotCQlFeHBvcnRVSVByZWZlcmVuY2VzLmFkZFJlY2VudGx5RXhwb3J0UGx1Z2luRGlyKGV4cG9ydExpYlBhdGgpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0FuZENyZWF0ZURpcihTdHJpbmcgZGlyKSB7Ci0JCXJldHVybiBEaXJlY3RvcnlWYWxpZGF0b3IuY2hlY2tBbmRDcmVhdGVEaXIoZGlyLCBFeHBvcnRSZXNvdXJjZXMuRXhwb3J0UGx1Z2luV2l6YXJkX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJRXhwb3J0UmVzb3VyY2VzLkV4cG9ydFBsdWdpbkVycm9yX21zZyk7IAotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydFVJUHJlZmVyZW5jZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydFVJUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGEzNzEzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRVSVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBleHBvcnQgVUkgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgaG9wZXNoYXJlZAotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0VUlQcmVmZXJlbmNlcyB7Ci0JCi0JLyoqCi0JICogVGhlIHJlY2VudGx5IG9wZW5lZCBkaXIgcHJlZmVyZW5jZSBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9ERUxJTUlURVIgPSAiOyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBzZXQgPGNvZGU+MTA8L2NvZGU+IGFzIHRoZSBkZWZhdWx0IGxlbmd0aCBvZiB0aGUgY29tYm8gcG9wdXAgbGlzdAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBSUxfTElTVF9MRU5HVEggPSAxMDsKLQkKLQkvKioKLQkgKiBUaGUgRXhwb3J0IFBsdWdpbiBwcmVmZXJlbmNlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX0VYUE9SVF9QTFVHSU5fUEFUSCA9ICJsYXN0RXhwb3J0UGx1Z2luUGF0aCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgRXhwb3J0IENvbmZpZ3VyYXRpb24gcHJlZmVyZW5jZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFTVF9FWFBPUlRfQ09ORklHX1BBVEggPSAibGFzdEV4cG9ydENvbmZpZ1BhdGgiOyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgZXhwb3J0IHBhdGguCi0JICogCi0JICogQHJldHVybiBUaGUgZGVmYXVsdCBleHBvcnQgcGF0aC4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdEV4cG9ydFBhdGgoKSB7Ci0JCVN0cmluZyBkZWZFeHBvcnRQUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIikgKyAvLyROT04tTkxTLTEkCi0JCQkJRmlsZVV0aWwuRklMRV9TRVAgKyBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpICsgCi0JCQkJRmlsZVV0aWwuRklMRV9TRVAgKyAiRXhwb3J0IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZGVmRXhwb3J0UFBhdGg7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHJlY2VudGx5IG9wZW5lZCBtZXRob2QgcGx1Z2luIGRpciBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSZWNlbnRseUV4cG9ydGVkUGx1Z2luRGlycygpIHsKLQkJTGlzdCBkaXJzID0gZ2V0UHJvcGVydHlMaXN0KExBU1RfRVhQT1JUX1BMVUdJTl9QQVRIKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChkaXJzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBkaXJzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgZGlyID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCXJlc3VsdC5hZGQoZGlyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSByZWNlbnRseSBvcGVuZWQgbWV0aG9kIHBsdWdpbiBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBkaXIgICBleHBvcnQgcGx1Z2luIGRpcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRSZWNlbnRseUV4cG9ydFBsdWdpbkRpcihTdHJpbmcgZGlyKSB7Ci0JCWlmIChkaXIgPT0gbnVsbCB8fCBkaXIubGVuZ3RoKCk9PTApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3QgZGlycyA9IGdldFJlY2VudGx5RXhwb3J0ZWRQbHVnaW5EaXJzKCk7Ci0KLQkJYWRkUHJvcGVydHkoZGlycywgZGlyLCBMQVNUX0VYUE9SVF9QTFVHSU5fUEFUSCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHJlY2VudGx5IGV4cG9ydCBjb25maWcgZGlycyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSZWNlbnRseUV4cG9ydGVkQ29uZmlnRGlycygpIHsKLQkJLy9UT0RPCi0JCUxpc3QgZGlycyA9IGdldFByb3BlcnR5TGlzdChMQVNUX0VYUE9SVF9DT05GSUdfUEFUSCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGlycy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGlycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIGRpciA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQlyZXN1bHQuYWRkKGRpcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgcmVjZW50bHkgb3BlbmVkIG1ldGhvZCBjb25maWcgZGlyIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIGRpciAgIGV4cG9ydCBjb25maWcgZGlyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFJlY2VudGx5RXhwb3J0Q29uZmlnRGlyKFN0cmluZyBkaXIpIHsKLQkJaWYgKGRpciA9PSBudWxsIHx8IGRpci5sZW5ndGgoKT09MCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCBkaXJzID0gZ2V0UmVjZW50bHlFeHBvcnRlZENvbmZpZ0RpcnMoKTsKLQotCQlhZGRQcm9wZXJ0eShkaXJzLCBkaXIsIExBU1RfRVhQT1JUX0NPTkZJR19QQVRIKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIHRoZSBwcm9wZXJ0eSB0byB0aGUgZmlyc3QgcG9zaXRpb24uCi0JICogCi0JICogQHBhcmFtIG9sZFByb3BlcnR5TGlzdCAgIG9sZCBwcm9wZXJ0eSBsaXN0Ci0JICogQHBhcmFtIG5ld1Byb3BlcnR5ICAgICAgIG5ldyBwcm9wZXJ0eSB2YWx1ZSAKLQkgKiBAcGFyYW0gcHJvcGVydHlLZXkgICAgICAgdGFyZ2V0IHByb3BlcnR5IGtleQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkUHJvcGVydHkoTGlzdCBvbGRQcm9wZXJ0eUxpc3QsIFN0cmluZyBuZXdQcm9wZXJ0eSwgU3RyaW5nIHByb3BlcnR5S2V5KXsKLQkJTGlzdCBkaXJzUmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJaWYob2xkUHJvcGVydHlMaXN0LmNvbnRhaW5zKG5ld1Byb3BlcnR5KSkKLQkJCW9sZFByb3BlcnR5TGlzdC5yZW1vdmUobmV3UHJvcGVydHkpOwotCQkKLQkJZGlyc1Jlc3VsdC5hZGQoMCwgbmV3UHJvcGVydHkpOwotCQkKLQkJZm9yIChpbnQgaT0wOyBpPG9sZFByb3BlcnR5TGlzdC5zaXplKCk7IGkrKykgewotCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBvbGRQcm9wZXJ0eUxpc3QuZ2V0KGkpOwotCQkJZGlyc1Jlc3VsdC5hZGQoaSsxLCBwYXRoKTsKLQkJfQotCQkKLQkJaWYoZGlyc1Jlc3VsdC5zaXplKCk+Z2V0TGlzdExlbmd0aCgpKQotCQkJZGlyc1Jlc3VsdCA9IGRpcnNSZXN1bHQuc3ViTGlzdCgwLCBnZXRMaXN0TGVuZ3RoKCkpOwotCQkJCi0JCXNldFByb3BlcnR5TGlzdChwcm9wZXJ0eUtleSwgU3RyVXRpbC5jb252ZXJ0TGlzdFRvU3RyQXJyYXkoZGlyc1Jlc3VsdCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZWQgcHJlZmVyZW5jZSBhcyBhCi0JICogPG9jZGU+TGlzdDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBnZXRQcm9wZXJ0eUxpc3QoU3RyaW5nIG5hbWUpIHsKLQkJTGlzdCBsaXN0ID0gY29udmVydFRvTGlzdChFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJLmdldFN0cmluZyhuYW1lKSk7Ci0JCWludCBsZW5ndGggPSBnZXRMaXN0TGVuZ3RoKCk7Ci0JCWlmKGxpc3Quc2l6ZSgpPmxlbmd0aCl7Ci0JCQlsaXN0ID0gbGlzdC5zdWJMaXN0KDAsIGxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIFNhdmVzIHRoZSBnaXZlbiBzdHJpbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZWQgcHJlZmVyZW5jZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNldFByb3BlcnR5TGlzdChTdHJpbmcgbmFtZSwgU3RyaW5nW10gaXRlbXMpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZChpdGVtc1tpXSk7Ci0JCQlidWZmZXIuYXBwZW5kKFBSRUZFUkVOQ0VfREVMSU1JVEVSKTsKLQkJfQotCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKG5hbWUsCi0JCQkJYnVmZmVyLnRvU3RyaW5nKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0cyB0aGUgc3VwcGxpZWQgUFJFRkVSRU5DRV9ERUxJTUlURVIgZGVsaW1pdGVkIHN0cmluZyBpbnRvIGEKLQkgKiA8Y29kZT5MaXN0PC9jb2RlPiBvYmplY3QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNvbnZlcnRUb0xpc3QoU3RyaW5nIHByZWZlcmVuY2VWYWx1ZSkgewotCQlBcnJheUxpc3QgdG9waWNzID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcmVmZXJlbmNlVmFsdWUsCi0JCQkJUFJFRkVSRU5DRV9ERUxJTUlURVIpOwotCQlpbnQgdG9rZW5Db3VudCA9IHRva2VuaXplci5jb3VudFRva2VucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2VuQ291bnQ7IGkrKykgewotCQkJdG9waWNzLmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQl9Ci0JCXJldHVybiB0b3BpY3M7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiBsaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TGlzdExlbmd0aCgpewotCQlTdHJpbmcgbGVuZ3RoID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9ISVNUT1JZX1NJWkUpOwotCQlpbnQgbGwgPSAwOwotCQlpZihsZW5ndGghPW51bGwgJiYgbGVuZ3RoLmxlbmd0aCgpPjApewotCQkJdHJ5ewotCQkJCWxsID0gSW50ZWdlci5wYXJzZUludChsZW5ndGgpOwotCQkJfWNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQkJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxsPjA/bGw6REVGQUlMX0xJU1RfTEVOR1RIOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL1BsdWdpbkluZm9QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9QbHVnaW5JbmZvUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTAxNTcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL1BsdWdpbkluZm9QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gcmV2aWV3IHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIG1ldGhvZAotICogcGx1Zy1pbnMgdGhhdCBoYXZlIGJlZW4gc2VsZWN0ZWQgZm9yIGV4cG9ydC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luSW5mb1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzCi0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIExpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFBsdWdpbkluZm9QYWdlLmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgVGFibGUgdGFibGU7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIGN0cmxfdGFibGVWaWV3ZXI7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIGN0cmxfZGVwZW5kUGx1Z2luc1ZpZXdlcjsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgY3RybF9hc3NvY2lhdGVkQ29uZmlnVmlld2VyOwotCi0JcHJpdmF0ZSBMaXN0IGRlcGVuZGVudFBsdWdpbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIExpc3QgYXNzb2NpYXRlZENvbmZpZ0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIFBsdWdpbkV4cG9ydERhdGEgZGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFBsdWdpbkluZm9QYWdlKFBsdWdpbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShFeHBvcnRSZXNvdXJjZXMucmV2aWV3UGx1Z2luc1BhZ2VfdGl0bGUpOyAKLQkJc2V0RGVzY3JpcHRpb24oRXhwb3J0UmVzb3VyY2VzLnJldmlld1BsdWdpbnNQYWdlX2Rlc2MpOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vRXhwb3J0TWV0aG9kUGx1Z2lucy5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBFeHBvcnRSZXNvdXJjZXMucmV2aWV3UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQpOyAvLyROT04tTkxTLTEkCi0KLQkJY3RybF90YWJsZVZpZXdlciA9IGNyZWF0ZVRhYmxlVmlld2VyKGNvbnRhaW5lciwgMzYwLCA2MCwgMSk7Ci0JCXRhYmxlID0gY3RybF90YWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBMaWJyYXJ5VUlJbWFnZXMuSU1HX01FVEhPRF9QTFVHSU47Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCXJldHVybiAoKE1ldGhvZFBsdWdpbikgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQljdHJsX3RhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCWN0cmxfdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJaWYgKGRhdGEuZ2V0U2VsZWN0ZWRQbHVnaW5zKCkgIT0gbnVsbCkgewotCQkJY3RybF90YWJsZVZpZXdlci5zZXRJbnB1dChkYXRhLmdldFNlbGVjdGVkUGx1Z2lucygpLnRvQXJyYXkoKSk7Ci0JCX0KLQotCQljcmVhdGVMYWJlbCgKLQkJCQljb250YWluZXIsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLnJldmlld1BsdWdpbnNQYWdlX2RlcGVuZGVudFBsdWdpbnNMYWJlbF90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCi0JCWN0cmxfZGVwZW5kUGx1Z2luc1ZpZXdlciA9IGNyZWF0ZVRhYmxlVmlld2VyKGNvbnRhaW5lciwgMzYwLCA2MCwgMSk7Ci0JCWN0cmxfZGVwZW5kUGx1Z2luc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljdHJsX2RlcGVuZFBsdWdpbnNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJY3RybF9kZXBlbmRQbHVnaW5zVmlld2VyLnNldElucHV0KGRlcGVuZGVudFBsdWdpbkxpc3QpOwotCi0JCWNyZWF0ZUxhYmVsKAotCQkJCWNvbnRhaW5lciwKLQkJCQlFeHBvcnRSZXNvdXJjZXMucmV2aWV3UGx1Z2luc1BhZ2VfYXNzb2NpYXRlZENvbmZpZ3NMYWJlbF90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCi0JCWN0cmxfYXNzb2NpYXRlZENvbmZpZ1ZpZXdlciA9IGNyZWF0ZVRhYmxlVmlld2VyKGNvbnRhaW5lciwgMzYwLCA2MCwgMSk7Ci0JCWN0cmxfYXNzb2NpYXRlZENvbmZpZ1ZpZXdlcgotCQkJCS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb25maWd1cmF0aW9uVGFibGVMYWJlbFByb3ZpZGVyKCkpOwotCQljdHJsX2Fzc29jaWF0ZWRDb25maWdWaWV3ZXIKLQkJCQkuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJY3RybF9hc3NvY2lhdGVkQ29uZmlnVmlld2VyLnNldElucHV0KGFzc29jaWF0ZWRDb25maWdMaXN0KTsKLQotCQlpZiAoZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKSAhPSBudWxsCi0JCQkJJiYgIWRhdGEuZ2V0U2VsZWN0ZWRQbHVnaW5zKCkuaXNFbXB0eSgpKSB7Ci0JCQl0YWJsZS5zZWxlY3QoMCk7Ci0JCQlkaXNwbGF5UmVsYXRlZEluZm8oKE1ldGhvZFBsdWdpbikgZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKS5nZXQoMCkpOwotCQl9Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWN0cmxfdGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gcGx1Z2luID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCWRpc3BsYXlSZWxhdGVkSW5mbygoTWV0aG9kUGx1Z2luKSBwbHVnaW5bMF0pOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2Ujb25FbnRlclBhZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJaWYgKGRhdGEuZ2V0U2VsZWN0ZWRQbHVnaW5zKCkgIT0gbnVsbAotCQkJCSYmICFkYXRhLmdldFNlbGVjdGVkUGx1Z2lucygpLmlzRW1wdHkoKSkgewotCQkJY3RybF90YWJsZVZpZXdlci5zZXRJbnB1dChkYXRhLmdldFNlbGVjdGVkUGx1Z2lucygpLnRvQXJyYXkoKSk7Ci0JCQl0YWJsZS5zZWxlY3QoMCk7Ci0JCQlkaXNwbGF5UmVsYXRlZEluZm8oKE1ldGhvZFBsdWdpbikgZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKS5nZXQoMCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3BsYXlSZWxhdGVkSW5mbyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlkZXBlbmRlbnRQbHVnaW5MaXN0ID0gcGx1Z2luLmdldEJhc2VzKCk7Ci0JCWN0cmxfZGVwZW5kUGx1Z2luc1ZpZXdlci5zZXRJbnB1dChkZXBlbmRlbnRQbHVnaW5MaXN0LnRvQXJyYXkoKSk7Ci0JCWFzc29jaWF0ZWRDb25maWdMaXN0ID0gTGlicmFyeVV0aWwuZ2V0QXNzb2NpYXRlZENvbmZpZ3VyYXRpb25zKHBsdWdpbik7Ci0JCWN0cmxfYXNzb2NpYXRlZENvbmZpZ1ZpZXdlci5zZXRJbnB1dChhc3NvY2lhdGVkQ29uZmlnTGlzdC50b0FycmF5KCkpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVEYXRhVG9Nb2RlbCgpIHsKLQkJLy9XaWxsIHJlZmFjdG9yIHRvIHVzZTogZGF0YS5idWlsZEFzc29jaWF0ZWRDb25maWdNYXAoKQotCQkKLQkJaWYgKGRhdGEuZ2V0U2VsZWN0ZWRQbHVnaW5zKCkgIT0gbnVsbCkgewotCQkJZGF0YS5hc3NvY2lhdGVkQ29uZmlnTWFwLmNsZWFyKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkYXRhLmdldFNlbGVjdGVkUGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RQbHVnaW4gZWxlbWVudCA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJCWRhdGEuYXNzb2NpYXRlZENvbmZpZ01hcC5wdXQoZWxlbWVudCwgTGlicmFyeVV0aWwKLQkJCQkJCS5nZXRBc3NvY2lhdGVkQ29uZmlndXJhdGlvbnMoZWxlbWVudCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlzYXZlRGF0YVRvTW9kZWwoKTsKLQkJRXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2UgcGFnZSA9ICgoRXhwb3J0UGx1Z2luV2l6YXJkKSBnZXRXaXphcmQoKSkucGFnZTM7Ci0JCXBhZ2Uub25FbnRlclBhZ2UobnVsbCk7Ci0JCXJldHVybiBwYWdlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvU2F2ZVBsdWdpblBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL1NhdmVQbHVnaW5QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkYjJkNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvU2F2ZVBsdWdpblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuUGx1Z2luRXhwb3J0RGF0YTsKLQotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBpbmZvcm1zIHRoZSB1c2VyIHRoYXQgY2hhbmdlcyB0byB0aGUgZXhpc3RpbmcgbWV0aG9kCi0gKiBwbHVnLWlucyB3aWxsIGJlIHNhdmVkIHByaW9yIHRvIGFuIGV4cG9ydCBvcGVyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNhdmVQbHVnaW5QYWdlIGV4dGVuZHMgRGVzdGluYXRpb25Db21tb25QYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNhdmVQbHVnaW5QYWdlLmNsYXNzLmdldE5hbWUoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNhdmVQbHVnaW5QYWdlKFBsdWdpbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihQQUdFX05BTUUsIGRhdGEubGxEYXRhKTsKLQkJc2V0VGl0bGUoRXhwb3J0UmVzb3VyY2VzLnNwZWNpZnlQYXRoUGFnZV90aXRsZSk7IAotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMuc3BlY2lmeVBhdGhQYWdlX2Rlc2MpOyAKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9FeHBvcnRNZXRob2RQbHVnaW5zLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlFeHBvcnRQbHVnaW5XaXphcmQgd2l6YXJkID0gKEV4cG9ydFBsdWdpbldpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCWlmIChjdHJsX2V4cG9ydFBhdGguZ2V0VGV4dCgpLmxlbmd0aCgpPjAgJiYgIWN0cmxfZXhwb3J0UGF0aC5nZXRUZXh0KCkuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0JCQlzYXZlVG9EYXRhTW9kZWwoKTsKLQkJCXdpemFyZC5va1RvQ29tcGxldGUgPSB0cnVlOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJd2l6YXJkLm9rVG9Db21wbGV0ZSA9IGZhbHNlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5EZXN0aW5hdGlvbkNvbW1vblBhZ2UjaW5pdENvbWJvSXRlbXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb21ib0l0ZW1zKCkgewotCQlMaXN0IGRpckxpc3QgPSBFeHBvcnRVSVByZWZlcmVuY2VzLmdldFJlY2VudGx5RXhwb3J0ZWRQbHVnaW5EaXJzKCk7Ci0JCQotCQlpZihkaXJMaXN0IT1udWxsICYmICFkaXJMaXN0LmlzRW1wdHkoKSl7Ci0JCQlTdHJpbmdbXSBkaXJzID0gbmV3IFN0cmluZ1tkaXJMaXN0LnNpemUoKV07Ci0JCQlmb3IoaW50IGk9MDsgaTxkaXJMaXN0LnNpemUoKTsgaSsrKXsKLQkJCQlkaXJzW2ldID0gZGlyTGlzdC5nZXQoaSkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWN0cmxfZXhwb3J0UGF0aC5zZXRJdGVtcyhkaXJzKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvU2VsZWN0UGx1Z2luUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvU2VsZWN0UGx1Z2luUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZWFhMTY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL1NlbGVjdFBsdWdpblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IHRoZSBtZXRob2QgcGx1Zy1pbnMgdG8gYmUKLSAqIGV4cG9ydGVkLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RQbHVnaW5QYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cwotCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLCBJQ2hlY2tTdGF0ZUxpc3RlbmVyLCBMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RQbHVnaW5QYWdlLmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgVGFibGUgdGFibGU7Ci0KLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgY3RybF9jaGtib3hUYWJsZVZpZXdlcjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2F1dGhvcjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX3ZlcnNpb247Ci0KLQlwcml2YXRlIFRleHQgY3RybF9icmllZkRlc2M7Ci0KLQlwcml2YXRlIGludCBjaGVja2VkQ291bnQgPSAwOwotCi0JcHJpdmF0ZSBMaXN0IGNoZWNrZWRQbHVnaW5MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBQbHVnaW5FeHBvcnREYXRhIGRhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RQbHVnaW5QYWdlKFBsdWdpbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShFeHBvcnRSZXNvdXJjZXMuc2VsZWN0UGx1Z2luc1BhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMuc2VsZWN0UGx1Z2luc1BhZ2VfZGVzYyk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9FeHBvcnRNZXRob2RQbHVnaW5zLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLAotCQkJCUV4cG9ydFJlc291cmNlcy5zZWxlY3RQbHVnaW5zUGFnZV9wbHVnaW5zTGFiZWxfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyID0gY3JlYXRlQ2hlY2tib3hUYWJsZVZpZXdlcihjb250YWluZXIsIDEpOwotCQl0YWJsZSA9IGN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLQotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCUxpc3QgcGx1Z2lucyA9IChsaWJyYXJ5ID09IG51bGwpID8gbmV3IEFycmF5TGlzdCgpIDogbGlicmFyeQotCQkJCS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBMaWJyYXJ5VUlJbWFnZXMuSU1HX01FVEhPRF9QTFVHSU47Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCXJldHVybiAoKE1ldGhvZFBsdWdpbikgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQlpZiAocGx1Z2lucyAhPSBudWxsKSB7Ci0JCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldElucHV0KHBsdWdpbnMudG9BcnJheSgpKTsKLQkJfQotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgQXV0aG9yaW5nVUlUZXh0LkFVVEhPUlNfVEVYVCk7Ci0JCWN0cmxfYXV0aG9yID0gY3JlYXRlVGV4dE11bHRpKGNvbnRhaW5lciwgIiIsIDM2MCwgNDAsIDMpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBBdXRob3JpbmdVSVRleHQuVkVSU0lPTl9URVhUKTsKLQkJY3RybF92ZXJzaW9uID0gY3JlYXRlVGV4dChjb250YWluZXIsICIiLCAzNjAsIDMpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBBdXRob3JpbmdVSVRleHQuQlJJRUZfREVTQ1JJUFRJT05fVEVYVCk7Ci0JCWN0cmxfYnJpZWZEZXNjID0gY3JlYXRlVGV4dE11bHRpKGNvbnRhaW5lciwgIiIsIDM2MCwgODAsIDMpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKHBsdWdpbnMgIT0gbnVsbCAmJiAhcGx1Z2lucy5pc0VtcHR5KCkpIHsKLQkJCXRhYmxlLnNlbGVjdCgwKTsKLQkJCXNldERpc3BsYXlBdHRyaWJ1dGVzKChNZXRob2RQbHVnaW4pIHBsdWdpbnMuZ2V0KDApKTsKLQkJfQotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXIjY2hlY2tTdGF0ZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJT2JqZWN0IG9iaiA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQotCQlpZiAoZXZlbnQuZ2V0Q2hlY2tlZCgpKSB7Ci0JCQljaGVja2VkQ291bnQrKzsKLQkJCWNoZWNrZWRQbHVnaW5MaXN0LmFkZChvYmopOwotCQl9IGVsc2UgewotCQkJY2hlY2tlZENvdW50LS07Ci0JCQljaGVja2VkUGx1Z2luTGlzdC5yZW1vdmUob2JqKTsKLQkJfQotCi0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gcGx1Z2luID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCXNldERpc3BsYXlBdHRyaWJ1dGVzKChNZXRob2RQbHVnaW4pIHBsdWdpblswXSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERpc3BsYXlBdHRyaWJ1dGVzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJY3RybF9hdXRob3Iuc2V0VGV4dChwbHVnaW4uZ2V0QXV0aG9ycygpKTsKLQkJY3RybF92ZXJzaW9uLnNldFRleHQocGx1Z2luLmdldFZlcnNpb24oKSk7Ci0JCWN0cmxfYnJpZWZEZXNjLnNldFRleHQocGx1Z2luLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gY2hlY2tlZENvdW50ID4gMDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlRGF0YVRvTW9kZWwoKSB7Ci0JCWRhdGEuc2V0U2VsZWN0ZWRQbHVnaW5zKGNoZWNrZWRQbHVnaW5MaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXNhdmVEYXRhVG9Nb2RlbCgpOwotCQlQbHVnaW5JbmZvUGFnZSBwYWdlID0gKChFeHBvcnRQbHVnaW5XaXphcmQpIGdldFdpemFyZCgpKS5wYWdlMjsKLQkJcGFnZS5vbkVudGVyUGFnZShudWxsKTsKLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhjNzY3OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgd2l6YXJkcyBmb3IgZXhwb3J0aW5nIG1ldGhvZCBwbHVnLWlucyBhbmQgY29uZmlndXJhdGlvbnMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhMzZkYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2M8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmRlYTkwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2M7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLkRvY1BsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmhlbHAKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtQ2xhc3NQYXRoOiBkb2MuamFyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9hY2Nlc3NpYmlsaXR5LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2FjY2Vzc2liaWxpdHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYzljOTE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2FjY2Vzc2liaWxpdHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJBY2Nlc3NpYmlsaXR5IiBsaW5rX3RvPSJtYWluLnhtbCNhY2Nlc3NpYmlsaXR5X2lkIj4KLSAgIDx0b3BpYyBsYWJlbD0iS2V5Ym9hcmQgbmF2aWdhdGlvbiIgaHJlZj0iaHRtbC9oZWxwL2FjX25hdmlnYXRpb24uaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJGb250cyBhbmQgY29sb3JzIiBocmVmPSJodG1sL2hlbHAvYWNfZm9udHNhbmRjb2xvcnMuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTdhMGFlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotc291cmNlLmRvYy5qYXIgPSBzcmMvCi1vdXRwdXQuZG9jLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgZG9jLmphcixcCi0gICAgICAgICAgICAgICBkb2MuemlwLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFjY2Vzc2liaWxpdHkueG1sLFwKLSAgICAgICAgICAgICAgIGNhdGVnb3JpemluZ19tZXRob2RfY29udGVudC54bWwsXAotICAgICAgICAgICAgICAgY29kZV9tYW5hZ2VtZW50LnhtbCxcCi0gICAgICAgICAgICAgICBjb25jZXB0cy54bWwsXAotICAgICAgICAgICAgICAgY29udGV4dHNfYXV0aG9yaW5nX3VpLnhtbCxcCi0gICAgICAgICAgICAgICBjcmVhdGluZ19tZXRob2RfY29udGVudC54bWwsXAotICAgICAgICAgICAgICAgY3JlYXRpbmdfcHJvY2Vzc2VzLnhtbCxcCi0gICAgICAgICAgICAgICBnZXR0aW5nc3RhcnRlZC54bWwsXAotICAgICAgICAgICAgICAgZ2xvc3NhcnkueG1sLFwKLSAgICAgICAgICAgICAgIG1haW4ueG1sLFwKLSAgICAgICAgICAgICAgIG92ZXJ2aWV3LnhtbCxcCi0gICAgICAgICAgICAgICBwdWJsaXNoaW5nX2V4cG9ydGluZy54bWwsXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlLnhtbCxcCi0gICAgICAgICAgICAgICB0YXNrcy54bWwsXAotICAgICAgICAgICAgICAgdHV0b3JpYWxzLnhtbCxcCi0gICAgICAgICAgICAgICBjaGVhdHNoZWV0cy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jYXRlZ29yaXplbWV0aGNvbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2F0ZWdvcml6ZW1ldGhjb250LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWQ1MjY5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jYXRlZ29yaXplbWV0aGNvbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJDYXRlZ29yaXplIG1ldGhvZCBjb250ZW50IiBsaW5rX3RvPSJtYWluLnhtbCNjYXRlZ29yaXplbWV0aG9kY29udF9pZCI+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiIGhyZWY9Imh0bWwvaGVscC9jb250ZW50X2NhdGVnb3JpZXMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBtZXRob2QgdmlldyB3aXRoIGN1c3RvbSBjYXRlZ29yaWVzIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2N1c3RvbV9jYXRlZ29yaWVzLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2F0ZWdvcml6aW5nX21ldGhvZF9jb250ZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NhdGVnb3JpemluZ19tZXRob2RfY29udGVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE5MmMzMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2F0ZWdvcml6aW5nX21ldGhvZF9jb250ZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iQ2F0ZWdvcml6aW5nIG1ldGhvZCBjb250ZW50IiBsaW5rX3RvPSJtYWluLnhtbCNjYXRlZ29yaXppbmdfbWV0aG9kX2NvbnRlbnRfaWQiPiAgCi0gIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIgaHJlZj0iaHRtbC9oZWxwL2NvbnRlbnRfY2F0ZWdvcmllcy5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgbWV0aG9kIHZpZXcgd2l0aCBjdXN0b20gY2F0ZWdvcmllcyIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9jdXN0b21fY2F0ZWdvcmllcy5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2FkZG1ldGhvZHJlZl9vcl9oeXBlcmxpbmsueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvYWRkbWV0aG9kcmVmX29yX2h5cGVybGluay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkOTg3ZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvYWRkbWV0aG9kcmVmX29yX2h5cGVybGluay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGNoZWF0c2hlZXQgdGl0bGU9IkFkZCBhIE1ldGhvZCBSZWZlcmVuY2Ugb3IgSHlwZXJsaW5rIChVUkwpIj4KLQk8aW50cm8gCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRhcmVmZXJlbmNlb3JoeXBlcmxpbmsuaHRtbCI+Ci0JCTxkZXNjcmlwdGlvbj5UaGVyZSBhcmUgdHdvIHR5cGVzIG9mIHJlZmVyZW5jZXMgb3IgaHlwZXJsaW5rcyB0byBvdGhlciBjb250ZW50IHdpdGhpbiB5b3VyIGNvbnRlbnQgdGV4dDogcmVmZXJlbmNlcyAgdG8gb3RoZXIgZWxlbWVudHMgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5IG9yIHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwgdGV4dCBvdXRzaWRlIHRoZSBtZXRob2QgbGlicmFyeSB3aXRoIGEgVVJMLiBUaGlzIGNoZWF0IHNoZWV0IHdhbGtzIHlvdSB0aHJvdWdoIGNyZWF0aW5nIGJvdGggdHlwZXMuPC9kZXNjcmlwdGlvbj4KLQk8L2ludHJvPgotCi0JPGl0ZW0KLQkJdGl0bGU9IkNyZWF0ZSBhIEh5cGVybGluayB0byBhbm90aGVyIGVsZW1lbnQgaW4gdGhlIE1ldGhvZCBMaWJyYXJ5IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgY2FuIHJlY29nbml6ZSBhIHRleHQgZmllbGQgdGhhdCBzdXBwb3J0cyBoeXBlcmxpbmtzIGJ5IHRoZSBsaXR0bGUgdHJpYW5nbGUgbmV4dCB0byB0aGUgdGV4dCBmaWVsZCdzIGxhYmVsLiAgVGhpcyB0cmlhbmdsZSBhbGxvd3MgeW91IHRvIGV4cGFuZCB0aGUgdGV4dCBmaWVsZCBpbnRvIGEgZnVsbCBzaXplIGVkaXRvciB3aXRoIGFuIGVkaXRvciB0b29sYmFyIHByb3ZpZGluZyByaWNoIHRleHQgZWRpdGluZyBmdW5jdGlvbmFsaXR5IHN1Y2ggYXMgZm9udCBzdHlsZXMsIGJ1bGxldCBwb2ludHMsIGV0Yy48YnIvPjxici8+VG8gaW5zZXJ0IGEgaHlwZXJsaW5rIHRvIGFub3RoZXIgZWxlbWVudCBpbiB0aGUgbWV0aG9kIGxpYnJhcnkgaW4gdGhlIHRleHQgZmllbGQgc2ltcGx5IGZpbmQgdGhlIGVsZW1lbnQgaW4gdGhlIGxpYnJhcnkgb3IgY29uZmlndXJhdGlvbiB2aWV3IGFuZCBkcmFnIGl0IGludG8gYW4gZXhwYW5kZWQgb3IgY29sbGFwc2VkIGZvcm0gZmllbGQuPGJyLz48YnIvPkFsdGVybmF0aXZlbHksIHlvdSBjYW4gYWxzbyBwb3NpdGlvbiB0aGUgY3Vyc29yIHdoZXJlIHlvdSB3YW50IHRoZSBsaW5rIHRvIGJlIGFkZGVkIGFuZCBjbGljayB0aGUgQWRkIExpbmsgYnV0dG9uIGluIHRoZSB0b29sIGJhci4gSXQgb3BlbnMgdGhlIEFkZCBMaW5rIGRpYWxvZyB0aGF0IHByb3ZpZGVzIHlvdSBhbW9uZ3N0IG90aGVycyB3aXRoIHRocmVlIG9wdGlvbnMgZm9yIGNyZWF0aW5nIGxpbmtzIHRvIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYnkgc2VsZWN0aW5nIHRoZSBlbGVtZW50IHZpYSB0aGUgIkJyb3dzZS4uLiIgYnV0dG9uLiAgRXZlcnkgb3B0aW9uIG9mZmVycyBhIGRpZmZlcmVudCB3YXkgZm9yIGRpc3BsYXlpbmcgdGhlIGxpbmsncyBuYW1lOjxici8+PGJyLz4iTWV0aG9kIEVsZW1lbnQiOiBsaW5rcyB0aGF0IGRpc3BsYXlzIHRoZSBlbGVtZW50IG5hbWUuIjxici8+PGJyLz4iTWV0aG9kIHdpdGggdHlwZSBwcmVmaXgiOiBsaW5rIHRoYXQgZGlzcGxheXMgdGhlIGVsZW1lbnQgbmFtZSBhbmQgdHlwZS48YnIvPjxici8+Ik1ldGhvZCBlbGVtZW50IHdpdGggY3VzdG9tIHRleHQiOiBsaW5rIHRoYXQgZGlzcGxheXMgYSB1c2VyIGRlZmluZWQgdGV4dC4gVG8gZGVmaW5lIHRoaXMgdGV4dCBtYW5pcHVsYXRlIHRoZSB0ZXh0IGluIGJldHdlZW4gdGhlICZsdDthJmd0OyZsdDsvYSZndDsgdGFncyBpbiB0aGUgVVJMIHRleHQgZmllbGQgb25jZSB5b3UgaGF2ZSBzZWxlY3RlZCBhbiBlbGVtZW50IHVzaW5nIHRoZSAiQnJvd3NlLi4uIiBidXR0b24uPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iQ3JlYXRlIGEgSHlwZXJsaW5rIHRvIGFuIEV4dGVybmFsIHBhZ2UgdXNpbmcgYSBVUkwiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPlRvIGluc2VydCBhIGh5cGVybGluayB0byBhbiBleHRlcm5hbCBVUkwsIGV4cGFuZCB0aGUgZWRpdG9yLCBwb3NpdGlvbiB0aGUgY3Vyc29yIHdoZXJlIHlvdSB3YW50IHRoZSBsaW5rIHRvIGJlIGFkZGVkIGFuZCB0aGVuIGNsaWNrIHRoZSAiQWRkIExpbmsiIGJ1dHRvbiBpbiB0aGUgdG9vbCBiYXIuIEZpbGwgaW4gdGhlIGRpYWxvZyB3aXRoIHRoZSBsaW5rIFVSTCBkZXRhaWxzIGFuZCB0aGVuIGNsaWNrIE9LLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJEb25lIj48ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj48L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9hZGRuZXdtZXRob2Rjb250ZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2FkZG5ld21ldGhvZGNvbnRlbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYzdkNTRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2FkZG5ld21ldGhvZGNvbnRlbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxjaGVhdHNoZWV0IHRpdGxlPSJBZGQgbmV3IE1ldGhvZCBDb250ZW50IHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzIG9yIEd1aWRhbmNlIj4KLQotCTxpbnRybyAKLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCI+Ci0JCTxkZXNjcmlwdGlvbj5UaGlzIGNoZWF0IHNoZWV0IGd1aWRlcyB5b3UgdGhvdWdoIHRoZSBzdGVwcyBvZiBjcmVhdGluZyB5b3VyIG93biBtZXRob2QgY29udGVudC4gWW91IHNob3VsZCBhbHdheXMgY3JlYXRlIG1ldGhvZCBjb250ZW50IGluIGEgbWV0aG9kIHBsdWctaW4gdGhhdCB5b3UgcHJvZHVjZS4gVGhpcyBzZXBhcmF0ZXMgeW91ciBjb250ZW50IGZyb20gY29udGVudCB0aGF0IHlvdSByZXVzZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFuZCBhbGxvd3MgeW91IHRvIHVwZGF0ZSB5b3VyIG93biBsaWJyYXJ5IHdpdGggbmV3IHJlbGVhc2VzIG9mIHN1Y2ggdGhpcmQgcGFydHkgcGx1Zy1pbnMgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNvbnRlbnQgdGhhdCB5b3UgaGF2ZSBjcmVhdGVkIGluIHlvdXIgb3duIHBsdWctaW5zLjxici8+PGJyLz5BbGwgcGx1Zy1pbnMgc2hpcHBlZCB3aXRoIHlvdXIgbWV0aG9kIGxpYnJhcnkgYXJlIHByb3RlY3RlZCBmcm9tIGRpcmVjdCBtb2RpZmljYXRpb24uIENyZWF0aW5nIG5ldyBlbGVtZW50cyBpbiB5b3VyIG93biBwbHVnLWluIGFuZCB0aGVuIHJlbGF0aW5nIHRob3NlIGVsZW1lbnRzIHRvIHRoZSBlbGVtZW50cyBpbiB0aGUgbG9ja2VkIHBsdWctaW4gYWxsb3dzIHlvdSB0byB0YWlsb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBsb2NrZWQgcGx1Zy1pbiBmb3IgeW91ciBvd24gdXNlLiBJZiB5b3UgaGF2ZSBub3QgY3JlYXRlZCB5b3VyIG93biBtZXRob2QgcGx1Zy1pbiwgcGVyZm9ybSB0aGUgIkNyZWF0ZSB5b3VyIG93biBNZXRob2QgUGx1Zy1pbiIgY2hlYXQgc2hlZXQgZmlyc3QuPC9kZXNjcmlwdGlvbj4KLQk8L2ludHJvPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwiCi0JCXRpdGxlPSJTZWxlY3Qgb3IgQ3JlYXRlIGEgQ29udGVudCBQYWNrYWdlIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5Db250ZW50IHBhY2thZ2VzIGFyZSB1c2VkIHRvIGdyb3VwIHJlbGF0ZWQgbWV0aG9kIGNvbnRlbnQgdG9nZXRoZXIuIFNpbmNlIGNvbnRlbnQgcGFja2FnZXMgYXJlIHNlbGVjdGFibGUgYXQgcHVibGljYXRpb24gdGltZSwgaXQgaXMgcmVjb21tZW5kZWQgcHJhY3RpY2UgdG8gZ3JvdXAgY29udGVudCB0aGF0IG5lZWRzIHRvIGJlIHB1Ymxpc2hlZCB0b2dldGhlciBpbnRvIHRoZSBzYW1lIGNvbnRlbnQgcGFja2FnZS48YnIvPjxici8+RmluZCB5b3VyIG1ldGhvZCBwbHVnLWluIGluIHRoZSBMaWJyYXJ5IHZpZXcuIERyaWxsIGludG8gdGhlIHBsdWctaW4ncyBwYWNrYWdlcyB0byBsb2NhdGUgdGhlIHBhY2thZ2UgY2FsbGVkICJDb250ZW50IFBhY2thZ2VzIi4gVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGFsbCBwYWNrYWdlcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGNvbnRhaW4gbWV0aG9kIGVsZW1lbnRzLiBTZWxlY3QgYW5kIGV4cGFuZCBhIHBhY2thZ2UgaW4gdGhlICJDb250ZW50IFBhY2thZ2VzIiBoaWVyYXJjaHkgaW4gd2hpY2ggeW91IHdhbnQgdG8gY3JlYXRlIHlvdXIgZWxlbWVudCwgb3IgdG8gY3JlYXRlIGEgbmV3IGNvbnRlbnQgcGFja2FnZS4gUmlnaHQgY2xpY2sgYSBwYWNrYWdlIGFuZCBzZWxlY3QgTmV3IC0mZ3Q7IENvbnRlbnQgUGFja2FnZS48YnIvPjxici8+QW4gZWRpdG9yIG9wZW5zIHRoYXQgYWxsb3dzIHlvdSB0byBwcm92aWRlIGEgdW5pcXVlIG5hbWUgZm9yIHRoZSBwYWNrYWdlIGFzIHdlbGwgYXMgdG8gYnJpZWZseSBkZXNjcmliZSBpdHMgcHVycG9zZS48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Lmh0bWwiCi0JCXRpdGxlPSJDcmVhdGUgTWV0aG9kIENvbnRlbnQgRWxlbWVudCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+SW4geW91ciBleHBhbmRlZCBjb250ZW50IHBhY2thZ2Ugd2l0aGluIHRoZSBsaWJyYXJ5IHZpZXcsIHJpZ2h0IGNsaWNrIGFueSBvbmUgb2Ygcm9sZXMsIHRhc2tzLCB3b3JrIHByb2R1Y3RzLCBvciBndWlkYW5jZSB0byBjcmVhdGUgYW55IG9mIHRoZXNlIGNvbnRlbnQgZWxlbWVudHMuIEhpZ2hsaWdodCAiTmV3IiBhbmQgdGhlbiBzZWxlY3QgdGhlIGNvbmNyZXRlIHR5cGUgb2YgdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gY3JlYXRlIChlLmcuIGZvciB3b3JrIHByb2R1Y3RzIGNob29zZSBiZXR3ZWVuIGFydGlmYWN0LCBvdXRjb21lLCBvciBkZWxpdmVyYWJsZSkuIFRoZSBuZXcgZWxlbWVudCBpcyBjcmVhdGVkIGFuZCBpdHMgcmVzcGVjdGl2ZSBlZGl0b3IgaXMgb3BlbmVkLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJdGl0bGU9IkRldGFpbCB0aGUgTmV3bHkgQ3JlYXRlZCBNZXRob2QgQ29udGVudCBFbGVtZW50IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhlIGZpZWxkcyBpbiB0aGUgY29udGVudCBlbGVtZW50IGVkaXRvciB0byBzcGVjaWZ5IHRoZSBjb250ZW50IGVsZW1lbnQgZGV0YWlscy4gU3RhcnQgYnkgYXNzaWduaW5nIGEgdW5pcXVlICJOYW1lIiB0byB0aGUgZWxlbWVudCBhcyB3ZWxsIGFzIGdpdmluZyBpdCBhICJQcmVzZW50YXRpb24gTmFtZSIgdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGV4dGVybmFsIHZpc2libGUgbmFtZSB3aGVuIG90aGVyIGVsZW1lbnRzIHJlZmVyIHRvIHRoaXMgZWxlbWVudCBvciB3aGVuIHRoZSBlbGVtZW50IGlzIHB1Ymxpc2hlZC48YnIvPjxici8+RXZlcnkgZWxlbWVudCBvd25zIHNldmVyYWwgc3BlY2lmaWMgY29udGVudCBmaWVsZHMgZGlzdHJpYnV0ZWQgb24gc2V2ZXJhbCBzdGFja2VkIGVkaXRvciB0YWJzIGFuZCBzZWN0aW9ucyB3aXRoaW4gdGhlc2UgdGFicyB0aGF0IHlvdSBjYW4gdXNlIGZvciB5b3VyIGRlc2NyaXB0aW9ucy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UgZGVzY3JpcHRpb24gZmllbGRzIGFzIHdlbGwgYXMgaG93IHRvIHVzZSB0aGUgcmljaCB0ZXh0IGVkaXRvciBzZWUgdGhlIG9ubGluZSBoZWxwLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJEb25lIj48ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj48L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2FwcGx5Y2FwYWJpbGl0eXBhdHRlcm4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvYXBwbHljYXBhYmlsaXR5cGF0dGVybi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ5ODU0MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvYXBwbHljYXBhYmlsaXR5cGF0dGVybi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGNoZWF0c2hlZXQgdGl0bGU9IkFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIj4KLQotCTxpbnRybyAKLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwiPgotCQk8ZGVzY3JpcHRpb24+V2hlbiBkZXZlbG9waW5nIGEgcHJvY2VzcyB5b3UgZG8gbm90IG5lZWQgdG8gd29yayBmcm9tIHNjcmF0Y2ggYnkgY3JlYXRpbmcgYWN0aXZpdGllcyBhbmQgZGVzY3JpcHRvcnMgb25lIGJ5IG9uZS4gIFRoaXMgY2hlYXQgc2hlZXQgd2Fsa3MgeW91IHRocm91Z2ggYXBwbHlpbmcgcHJlLWRlZmluZWQgY2FwYWJpbGl0eSBwYXR0ZXJucyBvciBldmVuIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzIHBhcnRzIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byB5b3VyIHByb2Nlc3MuPGJyLz48YnIvPkEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGEgc3BlY2lhbCBwcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBhY3Rpdml0aWVzIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIHBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBkaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBhIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBkZWxpdmVyeSBwcm9jZXNzZXMgb3IgbGFyZ2VyIGNhcGFiaWxpdHkgcGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLiBZb3UgY2FuIGFwcGx5IHRoZSBzYW1lIHBhdHRlcm4gc2V2ZXJhbCB0aW1lcyB0byB0aGUgc2FtZSBwcm9jZXNzIGFuZCBkZWZpbmUgbG9jYWwgbW9kaWZpY2F0aW9ucyB0byBlYWNoIGluZGl2aWR1YWwgcGF0dGVybiBhcHBsaWNhdGlvbi4gVGhpcyBhbGxvd3MgeW91IHRvIGV4cHJlc3Mgc3BlY2lmaWMgY2hhbmdlcyBlYWNoIHRpbWUgdGhlIHBhdHRlcm4gaXMgYmVpbmcgcGVyZm9ybWVkIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUgYSBwcm9jZXNzIHJlcHJlc2VudHMuPC9kZXNjcmlwdGlvbj4KLQk8L2ludHJvPgotCi0JPGl0ZW0KLQkJdGl0bGU9IkZpbmQgYW4gQWN0aXZpdHkgdG8gd2hpY2ggYSBQYXR0ZXJuIHdpbGwgYmUgQXBwbGllZCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+R2l2ZW4gdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IG9wZW5lZCB5b3VyIHByb2Nlc3MgaW4gdGhlIHByb2Nlc3MgZWRpdG9yLCBzd2l0Y2ggdG8gdGhlIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSB0YWIgYW5kIHJldmlldyB5b3VyIHByb2Nlc3MuIEZpbmQgdGhlIGxvY2F0aW9uIHdoZXJlIHlvdSB3YW50IHRvIGFwcGx5IGEgY2FwYWJpbGl0eSBwYXR0ZXJuLiBBIGNhcGFiaWxpdHkgcGF0dGVybiBoYXMgdG8gYmUgYXBwbGllZCB0byBvbmUgc3BlY2lmaWMgYWN0aXZpdHkgKGluY2x1ZGluZyBpdGVyYXRpb24gb3IgcGhhc2Ugd2hpY2ggYXJlIHNwZWNpYWwgYWN0aXZpdGllcykgaW4gYSBwcm9jZXNzLiBTdWNoIGFuIGFjdGl2aXR5IGNhbiBlaXRoZXIgYmUgZGVmaW5lZCBsb2NhbGx5IGluIHRoZSBwcm9jZXNzIChwcmVzZW50ZWQgYXMgYSBuYW1lIGluIGEgc3RhbmRhcmQgYmxhY2sgZm9udCkgb3IgYW4gYWN0aXZpdHkgd2hpY2ggaGFkIGJlZW4gYWRkZWQgdG8gdGhlIHByb2Nlc3MgYnkgYXBwbHlpbmcgYW5vdGhlciBjYXBhYmlsaXR5IHBhdHRlcm4gKHByZXNlbnRlZCBhcyBhIG5hbWUgaW4gYSBncmVlbi1pdGFsaWMgZm9udCkuPGJyLz48YnIvPklmIHlvdSB3YW50IHRvIGFwcGx5IGEgcGF0dGVybiB0byBhIGxvY2FsIGFjdGl2aXR5IChibGFjayBmb250KSwgZ28gdG8gc3RlcCAiU2VsZWN0IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXciLiBJZiB5b3Ugd2FudCB0byBhcHBseSBhIHBhdHRlcm4gdG8gYW4gYWN0aXZpdHkgZnJvbSBhbm90aGVyIHBhdHRlcm4gKGdyZWVuIGl0YWxpYyBmb250KSwgcGxlYXNlIGdvIHRvIHN0ZXAgIkNvbnRyaWJ1dGUgdG8gYW4gQWN0aXZpdHkgZnJvbSBBbm90aGVyIFBhdHRlcm4iLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJdGl0bGU9IkNvbnRyaWJ1dGUgdG8gYW4gQWN0aXZpdHkgZnJvbSBBbm90aGVyIFBhdHRlcm4iCi0JCXNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+T25seSBpZiB5b3Ugd2FudCB0byBhcHBseSBhIHBhdHRlcm4gdG8gYW4gYWN0aXZpdHkgZnJvbSBhbm90aGVyIHBhdHRlcm4gKHJlY29nbml6YWJsZSBieSB0aGUgZ3JlZW4gaXRhbGljIGZvbnQpIHRoZW4geW91IG5lZWQgdG8gY3JlYXRlIGFuIGFjdGl2aXR5IGNvbnRyaWJ1dGlvbiwgd2hpY2ggYWxsb3dzIHlvdSB0byBtYWtlIGxvY2FsIGNoYW5nZXMgdG8gdGhlIGFjdGl2aXR5Ljxici8+PGJyLz5GaW5kIHRoZSBhY3Rpdml0eSdzIHBhcmVudCBlbGVtZW50LiBJZiB0aGlzIGVsZW1lbnQgaXMgYSBub3QgYSBsb2NhbCBlbGVtZW50IChncmVlbiBpdGFsaWMgZm9udCkgdGhlbiB5b3UgZmlyc3QgbmVlZCBjcmVhdGUgYSBjb250cmlidXRpb24gdG8gdGhpcyBwYXJlbnQgYW5kIHNvIG9uIChpZiB0aGUgcGFyZW50J3MgcGFyZW50IGlzIG5vdCBsb2NhbCB0aGVuIGNyZWF0ZSBhIGNvbnRyaWJ1dGlvbiB0byB0aGUgcGFyZW50J3MgcGFyZW50IGZpcnN0LCBldGMuKSA8YnIvPjxici8+VG8gY3JlYXRlIGEgY29udHJpYnV0aW9uIHRvIGEgbm9uLWxvY2FsIGFjdGl2aXR5LCByaWdodC1jbGljayB0aGUgbm9uLWxvY2FsIGFjdGl2aXR5IGFuZCB0aGVuIGNsaWNrICJDb250cmlidXRlIi4gRG8gdGhpcyB3aXRoIGFsbCBwYXJlbnRzIHRvcC1kb3duIHVudGlsIHlvdSByZWFjaCB0aGUgYWN0aXZpdHkgdG8gd2hpY2ggeW91IHdhbnQgdG8gYXBwbHkgdGhlIHBhdHRlcm4uIE9uY2UgeW91IGNsaWNrZWQgIkNvbnRyaWJ1dGUiLCB0aGUgYWN0aXZpdHkgYmVjb21lIGxvY2FsIGFuZCBpcyBwcmVzZW50ZWQgd2l0aCBhIHN0YW5kYXJkIGJsYWNrIGZvbnQuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZmlndXJhdGlvbnZpZXcuaHRtbCIgCi0JCXRpdGxlPSJTZWxlY3QgYSBDYXBhYmlsaXR5IFBhdHRlcm4gaW4gdGhlIENvbmZpZ3VyYXRpb24gVmlldyIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+RmluZCBhIGNhcGFiaWxpdHkgcGF0dGVybiBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3LiBFeHBhbmQgdGhlIHBhY2thZ2UgIlByb2Nlc3NlcyAtJmd0OyBDYXBhYmlsaXR5IFBhdHRlcm5zIiBhcyB3ZWxsIGFzIGl0cyBzdWItcGFja2FnZXMuIFNlbGVjdCB0aGUgcGF0dGVybiB5b3Ugd2FudCB0byBhcHBseSB0byB5b3VyIHByb2Nlc3MuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iQXBwbHkgdGhlIENhcGFiaWxpdHkgUGF0dGVybiBvciBDYXBhYmlsaXR5IFBhdHRlcm5zIEFjdGl2aXR5IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgY2FuIGFwcGx5IGVpdGhlciB0aGUgd2hvbGUgY2FwYWJpbGl0eSBwYXR0ZXJuIHRvIHlvdXIgcHJvY2VzcyBvciBqdXN0IG9uZSBvciBtb3JlIGFjdGl2aXRpZXMgZnJvbSBpdC4gVG8gYXBwbHkgdGhlIHdob2xlIGNhcGFiaWxpdHkgcGF0dGVybiBkcmFnIHRoZSBwYXR0ZXJuIG92ZXIgdGhlIGFjdGl2aXR5IHNlbGVjdGVkIGVhcmxpZXIgaW4geW91ciBwcm9jZXNzLiBUbyBhcHBseSBvbmUgb3IgbW9yZSBhY3Rpdml0aWVzIG9mIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gc2VsZWN0IHRoZW0gaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldy4gWW91IGNhbiBtdWx0aSBzZWxlY3QgYnkgcHJlc3NpbmcgY3RybCArIHNlbGVjdCwgb3Igc2hpZnQgKyBzZWxlY3QgdG8gY2FwdHVyZSBhbiBhbGwtaW5jbHVzaXZlIHNlY3Rpb24uPGJyLz48YnIvPkRyYWcgdGhlbSB0byB0aGUgYWN0aXZpdHkgc2VsZWN0ZWQgZWFybGllciBpbiB5b3VyIHByb2Nlc3MuIEFmdGVyIGRyYWdnaW5nIHRoZSBwYXR0ZXJuIG9yIGFjdGl2aXRpZXMgeW91IHdpbGwgYmUgcHJvbXB0ZWQgeW91IHRvIGFwcGx5IHRoZSBwYXR0ZXJuL2FjdGl2aXRpZXMgdmlhIEV4dGVuZHMgKGR5bmFtaWMgYmluZGluZykgb3IgQ29weSAoU2VlIHRoZSBvbmxpbmUgaGVscCBzZWN0aW9uICJQcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldyIgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGVzZSB0d28gY2hvaWNlcykuIE1ha2UgeW91ciBjaG9pY2UgYnkgY2xpY2tpbmcuPGJyLz48YnIvPkFzIGFuIGFsdGVybmF0aXZlIHRvIGRyYWdnaW5nIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4geW91IGNhbiBhbHNvIHJpZ2h0LWNsaWNrIHRoZSBhY3Rpdml0eSB0byB3aGljaCB5b3Ugd2FudCB0byBhcHBseSB0aGUgcGF0dGVybiBhbmQgc2VsZWN0IHRoZSBtZW51IG9wdGlvbiAiQXBwbHkgUGF0dGVybiAtJmd0OyBDb3B5Li4uIiBvciAiQXBwbHkgUGF0dGVybiAtJmd0OyBFeHRlbmQuLi4iPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JCi0JPGl0ZW0KLQkJdGl0bGU9Ik1ha2UgTG9jYWwgQ2hhbmdlcyB0byBhIFBhdHRlcm4gQXBwbGljYXRpb24iCi0JCXNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+SWYgeW91IGFwcGxpZWQgdGhlIHBhdHRlcm4gdmlhIGNvcHksIHlvdSBjYW4gZnJlZWx5IG1ha2UgbW9kaWZpY2F0aW9ucyB0byB0aGUgY29waWVkIGVsZW1lbnRzLiBJZiB5b3UgYXBwbGllZCB0aGUgcGF0dGVybiB2aWEgZXh0ZW5kcyAoZHluYW1pYyBiaW5kaW5nKSB5b3UgY2FuIHN0aWxsIHByb3ZpZGUgbG9jYWwgYWRkaXRpb25zIHRvIHRoZSBwYXR0ZXJuIGJ5IGRlZmluaW5nIGEgY29udHJpYnV0aW9uIHRvIHRoZSBwYXR0ZXJuJ3MgYWN0aXZpdGllcy4gRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgb2YgdGhlIHN0ZXAgIkNvbnRyaWJ1dGUgdG8gYW4gQWN0aXZpdHkgZnJvbSBBbm90aGVyIFBhdHRlcm4iIGFib3ZlIHRvIGRlZmluZSBzdWNoIGEgY29udHJpYnV0aW9uLiBBZnRlciB5b3UgY3JlYXRlIHRoZSBsb2NhbCBhY3Rpdml0eSBjb250cmlidXRpb24sIHlvdSBjYW4gYWRkIGFkZGl0aW9uYWwgZGVzY3JpcHRvcnMgb3IgcGF0dGVybnMgdG8gdGhpcyBhY3Rpdml0eS48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQkKLQk8aXRlbQotCQl0aXRsZT0iU3VwcHJlc3MgUGF0dGVybiBFbGVtZW50cyIKLQkJc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgY2FuIHN1cHByZXNzIGVsZW1lbnRzIHN1Y2ggYXMgZGVzY3JpcHRvcnMgb3IgYWN0aXZpdGllcyBvZiBhIGR5bmFtaWNhbGx5IGJvdW5kcyBwYXR0ZXJuICh2aWEgZXh0ZW5kcykgYnkgcmlnaHQgY2xpY2tpbmcgYW5kIHNlbGVjdGluZyAiU3VwcHJlc3MiIGZyb20gdGhlIGNvbnRleHQgbWVudS48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iRG9uZSI+PGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+PC9pdGVtPgotPC9jaGVhdHNoZWV0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvY3JlYXRlYXByb2Nlc3MueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvY3JlYXRlYXByb2Nlc3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNGM3OTUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZWFwcm9jZXNzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08Y2hlYXRzaGVldCB0aXRsZT0iQ3JlYXRlIGEgUHJvY2VzcyAoQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIERlbGl2ZXJ5IFByb2Nlc3MpIj4KLQotCTxpbnRybyAKLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sIj4KLQkJPGRlc2NyaXB0aW9uPlRoaXMgY2hlYXQgc2hlZXQgZ3VpZGVzIHlvdSB0aHJvdWdoIHRoZSBzdGVwcyBvZiBjcmVhdGluZyBhIFByb2Nlc3MuIFRoZXJlIGFyZSB0d28gbWFpbiB0eXBlcyBvZiBwcm9jZXNzZXM6IENhcGFiaWxpdHkgUGF0dGVybnMgYW5kIERlbGl2ZXJ5IFByb2Nlc3Nlcy4gQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIEFjdGl2aXRpZXMgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMsIHdoaWxlIGEgRGVsaXZlcnkgUHJvY2VzcyBkZXNjcmliZXMgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHR5cGUgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdC4gU2VlIHRoZSBvbmxpbmUgaGVscCBzZWN0aW9uICJQcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldyIgZm9yIG1vcmUgZGV0YWlscy48L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24uaHRtbCIKLQkJdGl0bGU9IlNlbGVjdCBvciBDcmVhdGUgYSBEZWZhdWx0IE1ldGhvZCBDb25maWd1cmF0aW9uIGZvciB5b3VyIFByb2Nlc3MiCi0JCXNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+WW91ciBwcm9jZXNzIGNhbiBjb250YWluIGNvbnRlbnQgZnJvbSBtYW55IGRpZmZlcmVudCBtZXRob2QgcGx1Zy1pbnMuIFRoZSBjb250ZW50IGVsZW1lbnRzIGZyb20gdGhlc2UgcGx1Zy1pbnMsIHN1Y2ggYXMgdGFza3Mgb3Igd29yayBwcm9kdWN0cywgYXBwbGllZCB0byB5b3VyIHByb2Nlc3MgdmlhIGRyYWcgYW5kIGRyb3AsIGNhbiBoYXZlIG1hbnkgY29udHJpYnV0aW9ucyBvciByZXBsYWNlbWVudHMuIFN1Y2ggY29udHJpYnV0aW9ucyBvciByZXBsYWNlbWVudHMgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCByZWxhdGlvbnNoaXBzIHRoYXQgbmVlZCB0byBiZSBjb25zaWRlcmVkIGZvciBjcmVhdGluZyB0aGUgcHJvY2VzcyBlbGVtZW50cyB3aXRoIHRoZWlyIG1pcnJvcmVkIHNldCBvZiByZWxhdGlvbnNoaXBzLjxici8+PGJyLz5Gb3IgdGhhdCByZWFzb24geW91IG5lZWQgdG8gZGVmaW5lIGEgY29uZmlndXJhdGlvbiB0aGF0IGRlZmluZXMgdGhlIHZpc2libGUgc2V0IG9mIGVsZW1lbnRzIGFuZCByZWxhdGlvbnNoaXBzIHdoZW4gdGhlIHByb2Nlc3MgaXMgYXV0aG9yZWQuIFRoaXMgcHJvY2VzcyBhdXRob3JpbmcgY29uZmlndXJhdGlvbiBpcyByZWZlcnJlZCB0byBhcyB0aGUgIkRlZmF1bHQgQ29uZmlndXJhdGlvbiIgZm9yIHRoZSBwcm9jZXNzIGFuZCBzaG91bGQgZGVmaW5lIHRoZSBsYXJnZXN0IHJlYXNvbmFibGUgc2V0IG9mIG1ldGhvZCBwbHVnLWlucywgY29udGVudCBwYWNrYWdlcywgYW5kIG90aGVyIHByb2Nlc3NlcyBmcm9tIHRoZSBtZXRob2QgbGlicmFyeSB0aGF0IHdpbGwgYmUgcmVmZXJyZWQgdG8gYnkgdGhlIHByb2Nlc3MgYXQgc29tZSBwb2ludC48YnIvPjxici8+SW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiwgYSBwcm9jZXNzIGNhbiBiZSBsaW5rZWQgdG8gbWFueSBhZGRpdGlvbmFsIG1ldGhvZCBjb25maWd1cmF0aW9ucyB0aGF0IGhhdmUgYmVlbiB2ZXJpZmllZCB0byBhbHNvIHByb2R1Y2UgdmFsaWQgcmVzdWx0cy4gSG93ZXZlciwgYWxsIG90aGVyIHZhbGlkIGNvbmZpZ3VyYXRpb25zIG5lZWQgdG8gZGVmaW5lIHN1Yi1zZXRzIG9mIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uICBJbiBvdGhlciB3b3JkcywgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGxpbmsgYSBtZXRob2QgY29uZmlndXJhdGlvbiB0byBhIHByb2Nlc3MgdGhhdCByZWZlcnMgdG8gZWxlbWVudHMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiwgYmVjYXVzZSBzdWNoIGVsZW1lbnRzIHdlcmUgbm90IGNvbnNpZGVyZWQgd2hlbiB0aGUgcHJvY2VzcyB3YXMgY3JlYXRlZC48YnIvPjxici8+UHJvY2VzcyBlbGVtZW50cyB0aGF0IHJlZmVyIHRvIGNvbnRlbnQgcGFja2FnZXMgdGhhdCBhcmUgZGVmaW5lZCBvdXRzaWRlIHRoZSBzY29wZSBvZiBzdWNoIGEgY29uZmlndXJhdGlvbiB3aWxsIG5vdCBiZSBzaG93biBpbiB0aGUgcHJvY2VzcyB3aGVuIHB1Ymxpc2hlZCBvciB1c2VkIHVuZGVyIHN1Y2ggYSBjb25maWd1cmF0aW9uLiBUaGlzIGFsbG93cyB5b3UgdG8gZWFzaWx5IGhpZGUgY29udGVudCBmcm9tIGEgcHJvY2VzcyBieSBtb3ZpbmcgY29udGVudCBwYWNrYWdlcyBpbiBvciBvdXQgb2YgdGhlIHJlbGF0ZWQgY29uZmlndXJhdGlvbi48YnIvPjxici8+VGhlcmVmb3JlLCBiZWZvcmUgeW91IHN0YXJ0IGNyZWF0aW5nIGEgcHJvY2VzcywgcmV2aWV3IHlvdXIgbGlzdCBvZiBjb25maWd1cmF0aW9ucyBpbiB0aGUgbGlicmFyeSB2aWV3IGFuZCBkZWNpZGUgd2hpY2ggY29uZmlndXJhdGlvbiB5b3UgYXJlIGdvaW5nIHRvIHVzZS4gIElmIG5lY2Vzc2FyeSwgb3BlbiBjb25maWd1cmF0aW9ucyBhbmQgZXhhbWluZSB0aGVpciBzcGVjaWZpY2F0aW9uLiBJZiB5b3UgZG8gbm90IGZpbmQgYSBmaXR0aW5nIGNvbmZpZ3VyYXRpb24gdGhhdCBkZWZpbmVzIHRoZSByaWdodCBzZXQgb2YgZWxlbWVudHMsIGNyZWF0ZSBhIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbi4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHByb2Nlc3MgYW5kIG1ldGhvZCBjb25maWd1cmF0aW9uIHNlZSB0aGUgc2VjdGlvbiAiUHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXciIGluIHRoZSBvbmxpbmUgaGVscC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwiCi0JCXRpdGxlPSJDaG9vc2UgYSBNZXRob2QgUGx1Zy1pbiB0byBIb2xkIHlvdXIgUHJvY2VzcyIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+U2luY2UgeW91IGNhbm5vdCBhZGQgcHJvY2Vzc2VzIHRvIHdyaXRlLWxvY2tlZCB0aGlyZC1wYXJ0eSBtZXRob2QgcGx1Zy1pbnMgeW91ciBwcm9jZXNzIG5lZWRzIHRvIGJlIGNyZWF0ZWQgaW4gb25lIG9mIHlvdXIgb3duIG1ldGhvZCBwbHVnLWlucy4gVGhlcmVmb3JlLCBpdCBpcyBiZXN0IHRvIGNyZWF0ZSB5b3VyIHByb2Nlc3Mgd2l0aGluIHRoZSBwbHVnLWluIGluIHdoaWNoIGl0IGlzIGdvaW5nIHRvIGJlIHVzZWQuIEZvciBpbnN0YW5jZSwgaWYgeW91IHdhbnQgdG8gZGV2ZWxvcCBhIHNldCBvZiBjYXBhYmlsaXR5IHBhdHRlcm5zIHRvIHVzZSB0byBhc3NlbWJsZSBhIGRlbGl2ZXJ5IHByb2Nlc3MsIHRyeSB0byBtYWludGFpbiBhbGwgb2YgdGhlIGNhcGFiaWxpdHkgcGF0dGVybnMgaW4gdGhlIHNhbWUgbWV0aG9kIHBsdWctaW4uPGJyLz48YnIvPklmIHlvdSBoYXZlIG5vdCBjcmVhdGVkIGEgbWV0aG9kIHBsdWctaW4sIGdvIHRvIHRoZSAiQ3JlYXRlIHlvdXIgb3duIE1ldGhvZCBQbHVnLWluIiBjaGVhdCBzaGVldC48YnIvPjxici8+SW4gdGhlIGxpYnJhcnkgdmlldywgc2VsZWN0IGEgcGx1Zy1pbiBmcm9tIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBtZXRob2QgcGx1Zy1pbnMuIEljb25zIHRoYXQgYXBwZWFyIHRvIGJlIGdyYXllZC1vdXQgaGF2ZSBiZWVuIGxvY2tlZCBmb3IgbW9kaWZpY2F0aW9uIGFuZCBjYW5ub3QgYmUgdXNlZC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzLmh0bWwiIAotCQl0aXRsZT0iRmluZCBvciBDcmVhdGUgYSBQcm9jZXNzIFBhY2thZ2UiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPlByb2Nlc3NlcyBjYW4gYmUgb3JnYW5pemVkIHdpdGggcHJvY2VzcyBwYWNrYWdlcyB0byBpbmNyZWFzZSBtYWludGFpbmFiaWxpdHkgYW5kIHRvIG1ha2UgaXQgZWFzaWVyIGZvciB0aGUgcHJvY2VzcyB1c2VyIHRvIGJyb3dzZSBhbmQgZmluZCB0aGVtLiBQbGVhc2UgYmUgYXdhcmUgdGhhdCB5b3UgY2FuIGNyZWF0ZSBjYXBhYmlsaXR5IHBhdHRlcm5zIG9ubHkgaW4gYSBjYXBhYmlsaXR5IHBhdHRlcm5zIHBhY2thZ2Ugb3Igc3ViLXBhY2thZ2UgYW5kIGRlbGl2ZXJ5IHByb2Nlc3NlcyBvbmx5IGluIGEgZGVsaXZlcnkgcHJvY2VzcyBwYWNrYWdlIG9yIHN1Yi1wYWNrYWdlLjxici8+PGJyLz5Vc2luZyB0aGUgbGlicmFyeSB2aWV3LCByZXZpZXcgdGhlIHN0cnVjdHVyZSBvZiBwcm9jZXNzIHBhY2thZ2VzIGF2YWlsYWJsZSBpbiB0aGUgbWV0aG9kIHBsdWctaW4gdGhhdCB5b3Ugc2VsZWN0ZWQgb3IgY3JlYXRlZCBpbiB0aGUgbGFzdCBzdGVwIGFuZCB0aGVuIHNlbGVjdCBvbmUgb2YgdGhlIHBhY2thZ2VzIHByZXNlbnQgYXMgYSBjb250YWluZXIgZm9yIHlvdXIgcHJvY2Vzcy4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBjcmVhdGUgYSBuZXcgUHJvY2VzcyBQYWNrYWdlIGJ5IHJpZ2h0LWNsaWNraW5nIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MgcGFja2FnZSBvciBzdWItcGFja2FnZSBhbmQgdGhlbiBjbGlja2luZyBOZXcgLSZndDsgUHJvY2VzcyBQYWNrYWdlLiBJbiB0aGUgZGlhbG9nIGJveCB0aGF0IGFwcGVhcnMsIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgYW5kIHRoZW4gY2xpY2sgT0suPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCIgCi0JCXRpdGxlPSJDcmVhdGUgdGhlIENhcGFiaWxpdHkgUGF0dGVybiBvciBEZWxpdmVyeSBQcm9jZXNzIgotCQlza2lwPSJmYWxzZSI+CQotCQk8ZGVzY3JpcHRpb24+VG8gY3JlYXRlIGEgbmV3IGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzOiBSaWdodCBjbGljayB0aGUgc2VsZWN0ZWQgb3IgbmV3bHkgY3JlYXRlZCBwcm9jZXNzIHBhY2thZ2UgYW5kIHRoZW4gY2xpY2sgTmV3IC0mZ3Q7IENhcGFiaWxpdHkgUGF0dGVybiBvciBOZXcgLSZndDsgRGVsaXZlcnkgUHJvY2Vzcy4gIEluIHRoZSBkaWFsb2cgYm94IHRoYXQgYXBwZWFycywgc3BlY2lmeSB0aGUgcHJvY2VzcyBuYW1lIGFuZCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gYW5kIHRoZW4gY2xpY2sgT0suIFRoZSBwcm9jZXNzIGlzIGNyZWF0ZWQgYW5kIHRoZSBlZGl0b3IgaXMgb3BlbmVkLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCQotCTxpdGVtCi0JCXRpdGxlPSJEb2N1bWVudCB5b3VyIFByb2Nlc3MiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPldpdGggdGhlIHByb2Nlc3MgZWRpdG9yIG9wZW5lZCBpbiB0aGUgRGVzY3JpcHRpb24gdGFiLCBkb2N1bWVudCB5b3VyIHByb2Nlc3MgdXNpbmcgdGhlIGF2YWlsYWJsZSB0ZXh0IGZpZWxkcy4gIEF0IGEgbWluaW11bSBwcm92aWRlIGEgcHJlc2VudGF0aW9uIG5hbWUgYW5kIGEgYnJpZWYgZGVzY3JpcHRpb24gZm9yIHlvdXIgcHJvY2Vzcy4gIFNlZSB0aGUgb25saW5lIGhlbHAgZm9yIGRlZmluaXRpb25zIG9mIGVhY2ggYXZhaWxhYmxlIGRvY3VtZW50YXRpb24gZmllbGQuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JCi08aXRlbQotCQl0aXRsZT0iRGVjaWRlIG9uIHlvdXIgUHJpbWFyeSBQcm9jZXNzIEF1dGhvcmluZyBWaWV3IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgY2FuIGRldmVsb3AgYSBwcm9jZXNzIGZyb20gdGhyZWUgZGlmZmVyZW50IHZpZXdzOjxici8+PGJyLz5CcmVha2Rvd24gU3RydWN0dXJlOiAgQ3JlYXRlIHlvdXIgcHJvY2VzcyBieSBkZWZpbmluZyBhIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZS4gIENyZWF0ZSBpdGVyYXRpb25zIGFuZCBhY3Rpdml0aWVzIGZpcnN0IGFuZCB0aGVuIHBvcHVsYXRlIHlvdXIgYWN0aXZpdGllcyBieSBlaXRoZXIgYXBwbHlpbmcgdGFza3MgZnJvbSB5b3VyIG1ldGhvZCBjb250ZW50IG9yIGFwcGx5aW5nIGNhcGFiaWxpdHkgcGF0dGVybnMuIEdvIHRvIHN0ZXAgIkRldmVsb3AgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSIgdG8gd29yayB3aXRoIHRoaXMgdmlldy48YnIvPjxici8+VGVhbSBBbGxvY2F0aW9uOiBDcmVhdGUgeW91ciBwcm9jZXNzIGJ5IGRlZmluaW5nIHdoaWNoIHRlYW1zIGFuZCByb2xlcyBzaGFsbCBwYXJ0aWNpcGF0ZSBpbiBhY3Rpdml0aWVzIGFuZCBmaW5kaW5nIHJlc3BvbnNpYmxlIHdvcmsgcHJvZHVjdHMgYW5kIHRhc2tzIGZyb20gdGhlcmUuICBHbyB0byBzdGVwICJEZXZlbG9wIHRoZSBUZWFtIEFsbG9jYXRpb24gU3RydWN0dXJlIiB0byB3b3JrIHdpdGggdGhpcyB2aWV3Ljxici8+PGJyLz5Xb3JrIFByb2R1Y3QgVXNhZ2U6IENyZWF0ZSB5b3VyIHByb2Nlc3MgYnkgZGVmaW5pbmcgd2hpY2ggd29yayBwcm9kdWN0cyBzaG91bGQgYmUgY3JlYXRlZCBpbiBhY3Rpdml0aWVzIGFuZCBmaW5kaW5nIHRhc2tzIGFuZCByb2xlcyBmcm9tIHRoZXJlLiBHbyB0byBzdGVwICJEZXZlbG9wIFdvcmsgUHJvZHVjdCBVc2FnZSBTdHJ1Y3R1cmUiIHRvIHdvcmsgd2l0aCB0aGlzIHZpZXcuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwiIAotCQl0aXRsZT0iRGV2ZWxvcCB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlIgotCQlza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPkJlZm9yZSB5b3Ugc3RhcnQsIGVuc3VyZSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gc2VsZWN0ZWQgaW4gdGhlIHRvb2wgYmFyIGlzIHRoZSBzYW1lIGFzIHRoZSBjb25maWd1cmF0aW9uIHlvdSBzZWxlY3RlZCBhcyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB5b3VyIHByb2Nlc3MuPGJyLz48YnIvPlRvIGFjY2VzcyB0aGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvciwgc2VsZWN0IHRoZSAiV29yayBCcmVha2Rvd24gU3RydWN0dXJlIiB0YWIgaW4gdGhlIHByb2Nlc3MgZWRpdG9yLjxici8+PGJyLz5SaWdodC1jbGljayB0aGUgZWxlbWVudCBpbiB0aGUgZmlyc3Qgcm93IG9mIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCB0aGVuIGNsaWNrIE5ldyBDaGlsZCAtJmd0OyBBY3Rpdml0eSB0byBjcmVhdGUgYSBuZXcgYWN0aXZpdHkuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gY3JlYXRlIGEgcGhhc2Ugb3IgaXRlcmF0aW9uLCBkZXBlbmRpbmcgb24gdGhlIHNjb3BlIG9mIHlvdXIgcHJvY2Vzcy4gSWYgbmVlZGVkLCBjcmVhdGUgbW9yZSBhY3Rpdml0aWVzIHRvIHNldC11cCB5b3VyIGJyZWFrZG93biBzdHJ1Y3R1cmUuIEFjdGl2aXRpZXMgY2FuIGJlIG5lc3RlZCBpbnNpZGUgZWFjaCBvdGhlci48YnIvPjxici8+UmV2aWV3IHRoZSBsaXN0IG9mIHRhc2tzIGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuIEluIHRoaXMgdmlldyB0YXNrcyBhcmUgc29ydGVkIGJ5IGRpc2NpcGxpbmUuIERyaWxsIGludG8gdGhlIGRpc2NpcGxpbmVzIGhpZXJhcmNoeSB0byBzZWUgd2hpY2ggdGFza3MgYXJlIGF2YWlsYWJsZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24uIFNlbGVjdCBhIHRhc2sgdGhhdCB5b3Ugd2FudCB0byBhZGQgdG8geW91ciBicmVha2Rvd24gc3RydWN0dXJlIGFuZCBkcmFnIGl0IG9uIHRvcCBvZiBvbmUgb2YgdGhlIGFjdGl2aXRpZXMgeW91IGp1c3QgY3JlYXRlZC4gVGhlIHRhc2sgaXMgYWRkZWQgYXMgYSBzby1jYWxsZWQgdGFzayBkZXNjcmlwdG9yIChhbiBvY2N1cnJlbmNlIG9mIGEgdGFzayBpbiBvbmUgc3BlY2lmaWMgYWN0aXZpdHkpLjxici8+PGJyLz5SZXZpZXcgdGhlIHRhc2sgZGVzY3JpcHRvcidzIGRldGFpbHMgaW4gaXRzIHByb3BlcnRpZXMgdmlldy4gSWYgdGhlIHByb3BlcnRpZXMgdmlldyBpcyBub3QgZGlzcGxheWVkIHRoZW4gc2VsZWN0IHRoZSB0YXNrIGluIHRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgZWRpdG9yLCByaWdodC1jbGljaywgYW5kIHNlbGVjdCAiUHJvcGVydGllcyIuIFVzZSB0aGUgdGFicyBvbiB0aGUgc2lkZSBvZiB0aGUgcHJvcGVydGllcyB2aWV3IHRvIHJldmlldyBkaWZmZXJlbnQgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdG9yLjxici8+PGJyLz5QZXJmb3JtIGluZGl2aWR1YWwgbW9kaWZpY2F0aW9ucyBvZiB0aGUgdGFzayBkZXNjcmlwdG9yIGluIHRoZSBwcm9wZXJ0aWVzIHZpZXcuICBGb3IgZXhhbXBsZSwgeW91IGNhbiBjaGFuZ2UgdGhlIHByZXNlbnRhdGlvbiBuYW1lLCBhZGQgdGV4dHVhbCBkZXNjcmlwdGlvbnMsIGNoYW5nZSBwZXJmb3JtaW5nIHJvbGVzLCBjaGFuZ2UgdGhlIGlucHV0cyBhbmQgb3V0cHV0cywgZXRjLiBXaGVuIGNoYW5naW5nIHRoZSB0YXNrIGRlc2NyaXB0b3IncyByZWxhdGlvbnNoaXBzIGluIHRoZSBwcm9wZXJ0eSB3aW5kb3cgdGFicyByb2xlcyBvciB3b3JrIHByb2R1Y3RzLCB5b3UgY2FuIGVpdGhlciBhZGQgbmV3IGVsZW1lbnRzIGZyb20geW91ciBtZXRob2QgY29udGVudCBieSB1c2luZyB0aGUgJ0FkZC4uJyBidXR0b24gb3IgY29ubmVjdCB5b3VyIHRhc2sgZGVzY3JpcHRvciB3aXRoIHRhc2tzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIGFjdGl2aXR5Ljxici8+PGJyLz5JbnN0ZWFkIG9mIGRyYWdnaW5nIHRhc2sgb25lIGJ5IG9uZSB5b3UgY2FuIGFsc28gYXBwbHkgd2hvbGUgY2FwYWJpbGl0eSBwYXR0ZXJucyBvciBhY3Rpdml0aWVzIGZyb20gb3RoZXIgcHJvY2Vzc2VzIGF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uICBTZWxlY3QgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgYW55IGFjdGl2aXR5IG9mIHN1Y2ggYSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MgYXZhaWxhYmxlIGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcgYW5kIGRyYWcgaXQgb24gdG9wIG9mIGFuIGFjdGl2aXR5IHdpdGhpbiB5b3VyIHByb2Nlc3MgYnJlYWtkb3duIGluIHRoZSBwcm9jZXNzIGVkaXRvci4gKEZpbmQgYSBkZXRhaWxlZCB3YWxrdGhyb3VnaCB0byBhcHBseWluZyBjYXBhYmlsaXR5IHBhdHRlcm4gaW4gdGhlIGNoZWF0IHNoZWV0ICJBcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybiIuKTxici8+PGJyLz5Db250aW51ZSBhZGRpbmcgbW9yZSB0YXNrcywgYWN0aXZpdGllcyBvciBwYXR0ZXJucyB0byB5b3VyIGFjdGl2aXRpZXMgb3Igc3dpdGNoIHRvIHRoZSB0ZWFtIGFsbG9jYXRpb24gdGFiIHRvIGFkZCByb2xlcyBvciB0byB0aGUgd29yayBwcm9kdWN0IHVzYWdlIHRhYiB0byBhZGQgd29yayBwcm9kdWN0cy48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUuaHRtbCIgCi0JCXRpdGxlPSJEZXZlbG9wIHRoZSBUZWFtIEFsbG9jYXRpb24gU3RydWN0dXJlIgotCQlza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPkJlZm9yZSB5b3Ugc3RhcnQsIGVuc3VyZSB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3RlZCBpbiB0aGUgdG9vbCBiYXIgaXMgdGhlIHNhbWUgYXMgdGhlIGNvbmZpZ3VyYXRpb24geW91IHNlbGVjdGVkIGFzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHlvdXIgcHJvY2Vzcy48YnIvPjxici8+SW4gdGhlIHByb2Nlc3MgZWRpdG9yLCBjbGljayB0aGUgIlRlYW0gQWxsb2NhdGlvbiIgdGFiIHRvIG9wZW4gdGhlIHRlYW0gYWxsb2NhdGlvbiBlZGl0b3IuPGJyLz48YnIvPlJpZ2h0LWNsaWNrIHRoZSBlbGVtZW50IGluIHRoZSBmaXJzdCByb3cgb2YgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIHRoZW4gY2xpY2sgTmV3IENoaWxkIC0mZ3Q7IEFjdGl2aXR5IHRvIGNyZWF0ZSBhIG5ldyBhY3Rpdml0eS4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBjcmVhdGUgYSBwaGFzZSBvciBpdGVyYXRpb24sIGRlcGVuZGluZyBvbiB0aGUgc2NvcGUgb2YgeW91ciBwcm9jZXNzLiBJZiBuZWVkZWQsIGNyZWF0ZSBtb3JlIGFjdGl2aXRpZXMgdG8gc2V0LXVwIHlvdXIgYnJlYWtkb3duIHN0cnVjdHVyZS4gQWN0aXZpdGllcyBjYW4gYmUgbmVzdGVkIGluc2lkZSBlYWNoIG90aGVyLjxici8+PGJyLz5Zb3UgY2FuIGFkZCByb2xlcyBkaXJlY3RseSB0byB5b3VyIGFjdGl2aXRpZXMgbm93LiBJbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3LCByZXZpZXcgdGhlIGxpc3Qgb2Ygcm9sZXMuIEluIHRoaXMgdmlldyByb2xlcyBhcmUgb3JnYW5pemVkIGludG8gcm9sZSBzZXRzLiBEcmlsbCBpbnRvIHRoZSByb2xlIHNldHMgaGllcmFyY2h5IHRvIHNlZSB3aGljaCByb2xlcyBhcmUgYXZhaWxhYmxlIGluIHRoaXMgY29uZmlndXJhdGlvbi4gU2VsZWN0IGEgUm9sZSB0aGF0IHlvdSB3YW50IHRvIGFkZCB0byB5b3VyIGFjdGl2aXR5IGFuZCBkcmFnIGl0IG9uIHRvcCBvZiB0aGUgYWN0aXZpdHkgeW91IGNyZWF0ZWQgZWFybGllci4gVGhlIHJvbGUgaXMgYWRkZWQgYXMgYSByb2xlIGRlc2NyaXB0b3IgKGFuIG9jY3VycmVuY2Ugb2YgYSByb2xlIGluIG9uZSBzcGVjaWZpYyBhY3Rpdml0eSkuPGJyLz48YnIvPklmIHRoZSByb2xlIHRoYXQgeW91IGp1c3QgZHJhZ2dlZCBoYXMgcmVzcG9uc2liaWxpdHkgcmVsYXRpb25zaGlwcyB0byB3b3JrIHByb2R1Y3RzIGRlZmluZWQsIGEgd2l6YXJkIGFwcGVhcnMgcHJvbXB0aW5nIHlvdSB0byBhZGQgYW55IG9mIHRoZSB3b3JrIHByb2R1Y3RzIHRvIHRoZSBwcm9jZXNzLiBTZWxlY3QgemVybyB0byBtYW55IHdvcmsgcHJvZHVjdHMgYW5kIHRoZW4gY2xpY2sgT0suPGJyLz48YnIvPkZvciBlYWNoIHNlbGVjdGVkIHdvcmsgcHJvZHVjdCB0aGUgbmV4dCB3aXphcmQgd2luZG93IHByb21wdHMgeW91IHRvIHNlbGVjdCB0YXNrcyB0aGF0IHByb2R1Y2UgdGhlc2Ugd29yayBwcm9kdWN0cy4gQWdhaW4sIHNlbGVjdCB6ZXJvIHRvIG1hbnkgdGFza3MgYW5kIHRoZW4gY2xpY2sgT0sgdG8gYWRkIHRoZXNlIGVsZW1lbnRzIHRvIHlvdXIgcHJvY2Vzcy48YnIvPjxici8+UmV2aWV3IHRoZSByb2xlIGRlc2NyaXB0b3IncyBkZXRhaWxzIGluIGl0cyBwcm9wZXJ0aWVzIHZpZXcuIElmIHRoZSBwcm9wZXJ0aWVzIHZpZXcgaXMgbm90IGRpc3BsYXllZCB0aGVuIHNlbGVjdCB0aGUgcm9sZSBpbiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3IsIHJpZ2h0LWNsaWNrLCBhbmQgc2VsZWN0ICJQcm9wZXJ0aWVzIi4gVXNlIHRoZSB0YWJzIG9uIHRoZSBzaWRlIG9mIHRoZSBwcm9wZXJ0aWVzIHZpZXcgdG8gcmV2aWV3IGRpZmZlcmVudCBhc3BlY3RzIG9mIHRoZSByb2xlIGRlc2NyaXB0b3IuIFlvdSBjYW4gYWxzbyBwZXJmb3JtIGluZGl2aWR1YWwgbW9kaWZpY2F0aW9ucyBvZiB0aGUgcm9sZSBkZXNjcmlwdG9yLCBzdWNoIGFzIGNoYW5nZSB0aGUgcHJlc2VudGF0aW9uIG5hbWUsIGFkZCB0ZXh0dWFsIGRlc2NyaXB0aW9ucywgY2hhbmdlIHdvcmsgcHJvZHVjdHMgdGhlIHJvbGUgaXMgcmVzcG9uc2libGUgZm9yLCBldGMuPGJyLz48YnIvPldoZW4gY2hhbmdpbmcgdGhlIHJvbGUgZGVzY3JpcHRvcuKAmXMgcmVsYXRpb25zaGlwcyBpbiB0aGUgcHJvcGVydHkgd2luZG93IHRhYuKAmXMgcm9sZXMgb3Igd29yayBwcm9kdWN0cywgeW91IGNhbiBhZGQgbmV3IGVsZW1lbnRzIGZyb20geW91ciBtZXRob2QgY29udGVudCBieSB1c2luZyB0aGUgIkFkZOKApiIgYnV0dG9uLCBvciBjb25uZWN0IHlvdXIgcm9sZSBkZXNjcmlwdG9yIHdpdGggd29yayBwcm9kdWN0cyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBhY3Rpdml0eS48YnIvPjxici8+Q29udGludWUgYWRkaW5nIG1vcmUgcm9sZXMgdG8geW91ciBhY3Rpdml0aWVzLCBvciBzd2l0Y2ggdG8gdGhlIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSB0YWIgdG8gYWRkIHRhc2tzIG9yIHRvIHRoZSB3b3JrIHByb2R1Y3QgdXNhZ2UgdGFiIHRvIGFkZCB3b3JrIHByb2R1Y3RzLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi08aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlLmh0bWwiIAotCQl0aXRsZT0iRGV2ZWxvcCB0aGUgV29yayBQcm9kdWN0IFVzYWdlIFN0cnVjdHVyZSIKLQkJc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5CZWZvcmUgeW91IHN0YXJ0LCBlbnN1cmUgdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0ZWQgaW4gdGhlIHRvb2wgYmFyIGlzIHRoZSBzYW1lIGFzIHRoZSBjb25maWd1cmF0aW9uIHlvdSBzZWxlY3RlZCBhcyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB5b3VyIHByb2Nlc3MuPGJyLz48YnIvPkluIHRoZSBwcm9jZXNzIGVkaXRvciwgY2xpY2sgdGhlICJXb3JrIFByb2R1Y3QgVXNhZ2UiIHRhYiB0byBvcGVuIHRoZSB3b3JrIHByb2R1Y3QgdXNhZ2UgZWRpdG9yLjxici8+PGJyLz5SaWdodC1jbGljayB0aGUgZWxlbWVudCBpbiB0aGUgZmlyc3Qgcm93IG9mIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCB0aGVuIGNsaWNrIE5ldyBDaGlsZCAtJmd0OyBBY3Rpdml0eSB0byBjcmVhdGUgYSBuZXcgYWN0aXZpdHkuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gY3JlYXRlIGEgcGhhc2Ugb3IgaXRlcmF0aW9uLCBkZXBlbmRpbmcgb24gdGhlIHNjb3BlIG9mIHlvdXIgcHJvY2Vzcy4gSWYgbmVlZGVkLCBjcmVhdGUgbW9yZSBhY3Rpdml0aWVzIHRvIHNldC11cCB5b3VyIGJyZWFrZG93biBzdHJ1Y3R1cmUuIEFjdGl2aXRpZXMgY2FuIGJlIG5lc3RlZCBpbnNpZGUgZWFjaCBvdGhlci48YnIvPjxici8+UmV2aWV3IHRoZSBsaXN0IG9mIHdvcmsgcHJvZHVjdHMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldy4gSW4gdGhpcyB2aWV3IHdvcmsgcHJvZHVjdHMgYXJlIHNvcnRlZCBieSBkb21haW4gYXMgd2VsbCBhcyB3b3JrIHByb2R1Y3QgdHlwZXMuICBEcmlsbCBpbnRvIGVpdGhlciBvZiB0aGVzZSBoaWVyYXJjaGllcyB0byBzZWUgd2hpY2ggd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlIGluIHRoaXMgY29uZmlndXJhdGlvbi4gU2VsZWN0IGEgd29yayBwcm9kdWN0IHlvdSB3YW50IHRvIGFkZCB0byBhbiBhY3Rpdml0eSBhbmQgdGhlbiBkcmFnIGl0IG9uIHRvcCBvZiBhbiBBY3Rpdml0eSB0aGF0IHlvdSBjcmVhdGVkIGVhcmxpZXIuIFRoZSB3b3JrIHByb2R1Y3QgaXMgYWRkZWQgYXMgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciAoYW4gb2NjdXJyZW5jZSBvZiBhIHdvcmsgcHJvZHVjdCBpbiBvbmUgc3BlY2lmaWMgYWN0aXZpdHkpLjxici8+PGJyLz5BZnRlciB5b3UgaGF2ZSBhZGRlZCB0aGUgd29yayBwcm9kdWN0IHRvIHRoZSBhY3Rpdml0eSwgYSB3aXphcmQgcHJvbXB0cyB5b3UgdG8gYWRkIHRhc2tzIHRoYXQgcHJvZHVjZSB0aGlzIHdvcmsgcHJvZHVjdCB0byB0aGlzIGFjdGl2aXR5LiBTZWxlY3QgemVybyB0byBtYW55IHRhc2tzIGFuZCB0aGVuIGNsaWNrIE9LLiBUaGUgd2l6YXJkIGFkZHMgdGFzayBkZXNjcmlwdG9ycyBmb3IgZWFjaCBzZWxlY3RlZCB0YXNrIHRvIHRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUuPGJyLz48YnIvPlJldmlldyB0aGUgbmV3IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9y4oCZcyBkZXRhaWxzIGluIGl0cyBwcm9wZXJ0aWVzIHZpZXcuIElmIHRoZSBwcm9wZXJ0aWVzIHZpZXcgaXMgbm90IGRpc3BsYXllZCB0aGVuIHNlbGVjdCB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgaW4gdGhlIHByb2Nlc3MgZWRpdG9yLCByaWdodC1jbGljaywgYW5kIHNlbGVjdCAiUHJvcGVydGllcyIuIFVzZSB0aGUgdGFicyBvbiB0aGUgc2lkZSBvZiB0aGUgcHJvcGVydGllcyB2aWV3IHRvIHJldmlldyBkaWZmZXJlbnQgYXNwZWN0cyBvZiB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IuIFlvdSBjYW4gYWxzbyBwZXJmb3JtIGluZGl2aWR1YWwgbW9kaWZpY2F0aW9ucyBvZiB0aGUgcm9sZSBkZXNjcmlwdG9yLCBzdWNoIGFzIGNoYW5nZSB0aGUgcHJlc2VudGF0aW9uIG5hbWUgYWRkIHRleHR1YWwgZGVzY3JpcHRpb25zLCBhZGQgZW50cnkgYW5kIGV4aXQgc3RhdGVzLCBldGMuPGJyLz48YnIvPldoZW4gY2hhbmdpbmcgdGhlIHJvbGUgZGVzY3JpcHRvcuKAmXMgcmVsYXRpb25zaGlwcyBpbiB0aGUgcHJvcGVydHkgd2luZG93IHRhYuKAmXMgcm9sZXMgb3Igd29yayBwcm9kdWN0cywgeW91IGNhbiBhZGQgbmV3IGVsZW1lbnRzIGZyb20geW91ciBtZXRob2QgY29udGVudCBieSB1c2luZyB0aGUgIkFkZOKApiIgYnV0dG9uLCBvciBjb25uZWN0IHlvdXIgcm9sZSBkZXNjcmlwdG9yIHdpdGggd29yayBwcm9kdWN0cyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBBY3Rpdml0eS48YnIvPjxici8+Q29udGludWUgYnkgYWRkaW5nIG1vcmUgd29yayBwcm9kdWN0cyB0byB5b3VyIGFjdGl2aXRpZXMsIG9yIHN3aXRjaCB0byB0aGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIHRhYiB0byBhZGQgdGFza3Mgb3IgdGhlIHRlYW0gYWxsb2NhdGlvbiB0YWIgdG8gYWRkIHJvbGVzLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi08aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCIgCi0JCXRpdGxlPSJBcHBseSBhIENhcGFiaWxpdHkgUGF0dGVyIG9yIENhcGFiaWxpdHkgUGF0dGVybidzIEFjdGl2aXR5IgotCQlza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPllvdSBkbyBub3QgbmVlZCB0byBkZXZlbG9wIHlvdXIgcHJvY2VzcyBmcm9tIHNjcmF0Y2ggYnkgYWRkaW5nIGRlc2NyaXB0b3JzIG9uZSBieSBvbmUgYXMgZGVzY3JpYmVkIGluIHRoZSBsYXN0IHN0ZXBzLiAgWW91IGNhbiBhbHNvIHJldXNlIGV4aXN0aW5nIGNhcGFiaWxpdHkgcGF0dGVybnMgb3IgZXZlbiBjYXBhYmlsaXR5IHBhdHRlcm4gcGFydHMuIEdvIHRvIHRoZSBjaGVhdCBzaGVldCAiQXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm4iIHRvIHNlZSBob3cuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkRvbmUiPjxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPjwvaXRlbT4KLTwvY2hlYXRzaGVldD4KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvY3JlYXRlbWV0aG9kY29uZmlndXJhdGlvbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9jcmVhdGVtZXRob2Rjb25maWd1cmF0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTBiZDMwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9jcmVhdGVtZXRob2Rjb25maWd1cmF0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08Y2hlYXRzaGVldCB0aXRsZT0iQ3JlYXRlIHlvdXIgb3duIE1ldGhvZCBDb25maWd1cmF0aW9uIj4KLQk8aW50cm8gaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uLmh0bWwiPgotCQk8ZGVzY3JpcHRpb24+VGhpcyBjaGVhdCBzaGVldCBndWlkZXMgeW91IHRob3VnaCB0aGUgc3RlcHMgb2YgY3JlYXRpbmcgeW91ciBvd24gbWV0aG9kIGNvbmZpZ3VyYXRpb24uIEJlY2F1c2UgdGhlIG1ldGhvZCBsaWJyYXJ5IGNhbiBjb250YWluIGxhcmdlIG51bWJlcnMgb2YgZWxlbWVudHMsIHlvdSBtYXkgd2FudCB0byBsaW1pdCB5b3VyIHdvcmsgdG8gYSB1c2VyLWRlZmluZWQgc3Vic2V0IG9mIHRoZSBsaWJyYXJ5IGNhbGxlZCBtZXRob2QgY29uZmlndXJhdGlvbi4gQSBtZXRob2QgY29uZmlndXJhdGlvbiBkZWZpbmVzIGEgd29ya2luZyBzZXQgb2YgcGFja2FnZXMgd2l0aGluIHRoZSBtZXRob2QgbGlicmFyeSB0aGF0IGhlbHBzIHlvdSBsaW1pdCB5b3VyIHZpZXcgdG8gYSBzdWJzZXQgb2YgYWxsIGVsZW1lbnRzLiBNZXRob2QgY29uZmlndXJhdGlvbnMgYXJlIG5vdCBvbmx5IHVzZWQgZm9yIGNyZWF0aW5nIHByb2Nlc3NlcyAoeW91IGRyYWcgYW5kIGRyb3AgZWxlbWVudHMgaW50byBhIHByb2Nlc3MgZnJvbSBoZXJlKSwgYnV0IGFsc28gZm9yIHB1YmxpY2F0aW9uLCBiZWNhdXNlIGEgY29uZmlndXJhdGlvbiBkZWZpbmVzIHdoaWNoIGVsZW1lbnRzIHdpbGwgYmUgcHVibGlzaGVkIGluIEhUTUwgYW5kIHdoaWNoIHdpbGwgbm90Ljxici8+PGJyLz5UaGUgZWxlbWVudHMgdGhhdCBhcmUgcGFydCBvZiBhIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gYXJlIGRpc3BsYXllZCBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3LiBUaGUgY29uZmlndXJhdGlvbiB2aWV3IGFsbG93cyB5b3UgdG8gYnJvd3NlIHRoZSBjb2xsZWN0aW9uIG9mIG1ldGhvZCBlbGVtZW50cyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uLCBhbmQgdG8gcG9wdWxhdGUgcHJvY2Vzc2VzIGJ5IGRyYWdnaW5nIGVsZW1lbnRzIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gdmlldyBpbnRvIHRoZSBwcm9jZXNzIGVkaXRvci48L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCIKLQkJdGl0bGU9IlByZXBhcmUgQ3JlYXRpbmcgYSBNZXRob2QgQ29uZmlndXJhdGlvbiIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+QmVmb3JlIGNyZWF0aW5nIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24geW91IHNob3VsZCBkZXRlcm1pbmUgeW91ciBuZWVkcyBhbmQgZ29hbHMgZm9yIHRoZSBjb25maWd1cmF0aW9uLiBPbmUgc2NlbmFyaW8gZm9yIGNyZWF0aW5nIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQgYSBuZXcgbWV0aG9kIHBsdWctaW4gaW4gd2hpY2ggeW91IHdhbnQgdG8gZGVmaW5lIG1ldGhvZCBlbGVtZW50cyB0aGF0IGV4dGVuZCBhbiBhbHJlYWR5IGV4aXN0aW5nIHBsdWctaW4uIEluIHRoaXMgY2FzZSwgeW91IG5lZWQgdG8gY3JlYXRlIGEgY29uZmlndXJhdGlvbiB0aGF0IGluY2x1ZGVzIHlvdXIgbmV3IHBsdWctaW4gYXMgd2VsbCBhcyB0aGUgZXhpc3RpbmcgcGx1Zy1pbi4gSWYgeW91IHdhbnQgdG8gY3JlYXRlIHlvdXIgb3duIG1ldGhvZCBwbHVnLWluIGZpcnN0IHRoZW4gZ28gdGhlIGNoZWF0ICJDcmVhdGUgeW91ciBvd24gTWV0aG9kIFBsdWctaW4iLjxici8+PGJyLz5Bbm90aGVyIHNjZW5hcmlvIGZvciBjcmVhdGluZyBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGlzIHRoYXQgeW91IHdhbnQgdG8gZGVmaW5lIGEgbmV3IGNvbmZpZ3VyYXRpb24gZm9yIHB1YmxpY2F0aW9uIHB1cnBvc2VzIG9uIGV4aXN0aW5nIHBsdWctaW5zLCBkZWZpbmluZyB3aGljaCBlbGVtZW50cyB0byBwdWJsaXNoLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGN1cnJlbnQgc2V0IG9mIGNvbmZpZ3VyYXRpb25zIGF2YWlsYWJsZSBkb2VzIG5vdCBtZWV0IHlvdXIgbmVlZHMsIHlvdSBjb3VsZCBub3cgZWl0aGVyIGN1c3RvbWl6ZSBhbiBleGlzdGluZyBjb25maWd1cmF0aW9uIG9yIGNyZWF0ZSBhIGNvbXBsZXRlbHkgbmV3IGNvbmZpZ3VyYXRpb24gZnJvbSBzY3JhdGNoLjxici8+PGJyLz5JZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBtZXRob2QgY29uZmlndXJhdGlvbiBieSBjb3B5aW5nIGFuIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24gZ28gdG8gdGhlIG5leHQgc3RlcCAiQ3JlYXRlIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24gYnkgY29weWluZyBhbiBleGlzdGluZyBjb25maWd1cmF0aW9uIi48YnIvPjxici8+SWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgY29tcGxldGVseSBuZXcgbWV0aG9kIGNvbmZpZ3VyYXRpb24sIHNraXAgdG8gc3RlcCAiQ3JlYXRlIGEgbmV3IE1ldGhvZCBDb25maWd1cmF0aW9uIGZyb20gc2NyYXRjaCIuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iQ3JlYXRlIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24gYnkgQ29weWluZyBhbiBFeGlzdGluZyBDb25maWd1cmF0aW9uIgotCQlza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPkV4cGFuZCB0aGUgIkNvbmZpZ3VyYXRpb25zIiBwYWNrYWdlIGF0IHRoZSBlbmQgb2YgdGhlIExpYnJhcnkgdmlldy4gUmlnaHQgY2xpY2sgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIHlvdSB3YW50IHRvIGNvcHksIGFuZCB0aGVuIHNlbGVjdCAiQ29weSIgZnJvbSB0aGUgbWVudS4gUmlnaHQgY2xpY2sgdGhlIGNvbmZpZ3VyYXRpb25zIHBhY2thZ2UgYW5kIHRoZW4gc2VsZWN0ICJQYXN0ZSIgZnJvbSB0aGUgbWVudS48YnIvPjxici8+QSBkaWFsb2cgcHJvbXB0cyB5b3VyIGZvciBhIG5ldyBjb25maWd1cmF0aW9uIG5hbWUuIFByb3ZpZGUgYSBuYW1lIHRoYXQgcmVmbGVjdHMgdGhlIGNoYXJhY3RlciBvciBwdXJwb3NlIG9mIHRoaXMgY29uZmlndXJhdGlvbi4gVG8gY29udGludWUgc3BlY2lmeWluZyB5b3VyIG1ldGhvZCBjb25maWd1cmF0aW9uLCBza2lwIHRvIHN0ZXAgIlNwZWNpZnkgdGhlIE1ldGhvZCBDb25maWd1cmF0aW9uIi48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCXRpdGxlPSJDcmVhdGUgYSBuZXcgTWV0aG9kIENvbmZpZ3VyYXRpb24gZnJvbSBTY3JhdGNoIgotCQlza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPlJpZ2h0IGNsaWNrIHRoZSBjb25maWd1cmF0aW9ucyBwYWNrYWdlIGFuZCBzZWxlY3QgTmV3IC0mZ3Q7IE1ldGhvZCBDb25maWd1cmF0aW9uIGZyb20gdGhlIG1lbnUuIFRoZSBuZXcgY29uZmlndXJhdGlvbiBpcyBhZGRlZCB0byB0aGUgbGlzdCBhbmQgaXRzIGVkaXRvciBpcyBvcGVuZWQuIENoYW5nZSB0aGUgbmFtZSBvZiB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gdG8gcmVmbGVjdCBpdHMgY2hhcmFjdGVyIG9yIHB1cnBvc2UgYW5kIHRoZW4gY29udGludWUgdG8gdGhlIG5leHQgc3RlcCwgIlNwZWNpZnkgdGhlIE1ldGhvZCBDb25maWd1cmF0aW9uIi48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCXRpdGxlPSJTcGVjaWZ5IHRoZSBNZXRob2QgQ29uZmlndXJhdGlvbiIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+Q2xpY2sgdGhlICJQbHVnLWluIGFuZCBQYWNrYWdlIFNlbGVjdGlvbiIgdGFiIGluIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBlZGl0b3IgdG8gZ28gdG8gdGhlIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbiBmb3JtLiBUaGlzIGZvcm0gZGlzcGxheXMgYSBsaXN0IG9mIGFsbCBtZXRob2QgcGx1Zy1pbnMgYW5kIGZvciBldmVyeSBwbHVnLWluIGFsbCBvZiBpdHMgY29udGVudCBwYWNrYWdlcyBhcyB3ZWxsIGFzIGFsbCBwcm9jZXNzZXMuIFVzZSB0aGUgY2hlY2sgYm94ZXMgdG8gYWRkIG9yIHJlbW92ZSBwbHVnLWlucywgcGFja2FnZXMsIGFuZCBwcm9jZXNzZXMgdG8gb3IgZnJvbSB5b3VyIGNvbmZpZ3VyYXRpb24uPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmZpZ3VyYXRpb252aWV3Lmh0bWwiIAotCQl0aXRsZT0iUHJldmlldyB5b3VyIENvbmZpZ3VyYXRpb24gaW4gdGhlIENvbmZpZ3VyYXRpb24gVmlldyIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+WW91IGNhbiBpbW1lZGlhdGVseSBwcmV2aWV3IHlvdXIgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdXNpbmcgdGhlIGNvbmZpZ3VyYXRpb24gdmlldy4gUmVmcmVzaCB5b3VyIGNvbmZpZ3VyYXRpb24gdmlldyBieSBjbGlja2luZyB0aGUgdmlldydzICJSZWZyZXNoIEFsbCIgaWNvbi4gRHJpbGwgaW50byB0aGUgdHJlZSBzdHJ1Y3R1cmVzIGRpc3BsYXllZCBieSB0aGUgY29uZmlndXJhdGlvbiB2aWV3IHRvIHNlZSBlbGVtZW50cyBpbmNsdWRlZCBpbiB0aGUgY29uZmlndXJhdGlvbi48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQkKLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCIgCi0JCXRpdGxlPSJEZWZpbmUgTmF2aWdhdGlvbiBWaWV3cyBmb3IgdGhlIE1ldGhvZCBDb25maWd1cmF0aW9uIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5BIG5hdmlnYXRpb24gdmlldyBpcyBhIG5hdmlnYXRpb24gdHJlZSBicm93c2VyIGZvciBhIGNvbmZpZ3VyYXRpb24gcHVibGlzaGVkIGFzIEhUTUwuIEV2ZXJ5IHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIGNhbiBoYXZlIHNldmVyYWwgdmlld3MgdGhhdCBhcmUgZGlzcGxheWVkIGFzIHN0YWNrZWQgdHJlZSBicm93c2VyIHRhYnMuIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG5hdmlnYXRpb24gdmlldyBpcyBkZWZpbmVkIGFzIGN1c3RvbSBjYXRlZ29yaWVzLiBBIGN1c3RvbSBjYXRlZ29yeSBpcyBhIHVzZXItZGVmaW5lZCBjb2xsZWN0aW9uIG9mIGNhdGVnb3JpemluZyBlbGVtZW50cywgd2hpY2ggbWF5IGl0c2VsZiBjb250YWluIHN1YmNhdGVnb3JpZXMuIFRoaXMgc3RydWN0dXJlIGlzIHdoYXQgZGVmaW5lcyB0aGUgc3RydWN0dXJlIGZvciB0aGUgdHJlZSBicm93c2VyLiAoRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgQ3VzdG9tIENhdGVnb3JpZXMsIHNlZSB0aGUgb25saW5lIGhlbHAuKSBUaGVyZWZvcmUsIHRvIGRlZmluZSBhIG5hdmlnYXRpb24gdmlldyB5b3Ugc2VsZWN0IGEgY3VzdG9tIGNhdGVnb3J5IGFuZCBhbGwgb2YgdGhpcyBjYXRlZ29yaWVzIHN1Yi1lbGVtZW50cyBtYWtlIHVwIHRoZSB0cmVlIGJyb3dzZXIgc3RydWN0dXJlIGRpc3BsYXllZCBieSB0aGUgdmlldy48YnIvPjxici8+VG8gYWRkIG5hdmlnYXRpb24gdmlld3MgdG8geW91ciBjb25maWd1cmF0aW9uIGNsaWNrIHRoZSAiVmlld3MiIHRhYiBpbiB0aGUgY29uZmlndXJhdGlvbiBlZGl0b3IuIFVzZSB0aGUgIkFkZCBWaWV3Li4uIiBhbmQgIlJlbW92ZSBWaWV3IiBidXR0b25zIHRvIHNlbGVjdCB0aGUgY3VzdG9tIGNhdGVnb3JpZXMgeW91IHdhbnQgdG8gYWRkIGFuZCByZW1vdmUgYXMgYSB2aWV3LCByZXNwZWN0aXZlbHkuIENsaWNrIHRoZSB0YWIgb2YgdGhlIHZpZXdzIHlvdSBqdXN0IGFkZGVkIHRvIHByZXZpZXcuPGJyLz48YnIvPlRvIHNlbGVjdCBhIHZpZXcgdG8gZGlzcGxheSBhcyB0aGUgc3RhcnQtdXAgdmlldywgY2xpY2sgdGhlICJNYWtlIERlZmF1bHQiIGJ1dHRvbi4gVGhlIHN0YXJ0LXVwIHZpZXcgaXMgdGhlIGZpcnN0IHZpZXcgc2hvd24gd2hlbiBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIGlzIGRpc3BsYXllZCB3aGVuIHN0YXJ0aW5nIHVwLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJEb25lIj48ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZW1ldGhvZHBsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9jcmVhdGVtZXRob2RwbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNDNhYjBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZW1ldGhvZHBsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLiAtLT4KLTxjaGVhdHNoZWV0IHRpdGxlPSJDcmVhdGUgeW91ciBvd24gTWV0aG9kIFBsdWctaW4iPgotCi0JPGludHJvIAotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sIj4KLQkJPGRlc2NyaXB0aW9uPkJlY2F1c2UgdGhlIHBsdWctaW5zIHNoaXBwZWQgd2l0aCB0aGUgbWV0aG9kIGxpYnJhcnkgYXJlIGxvY2tlZCBhbmQgcmVhZC1vbmx5LCBhbGwgeW91ciBjaGFuZ2VzLCBhZGRpdGlvbnMsIGFuZCBleHRlbnNpb25zIHRvIGV4aXN0aW5nIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaGF2ZSB0byBiZSBwbGFjZWQgaW4geW91ciBvd24gbWV0aG9kIHBsdWctaW5zLiBIb3dldmVyLCB5b3UgY2FuIHVzZSB2YXJpb3VzIGNhcGFiaWxpdGllcyB0byBsb2dpY2FsbHkgbWVyZ2UgeW91ciBwbHVnLWluIGNvbnRlbnRzIGludG8gb3RoZXIgcGx1Zy1pbnMgYWxsb3dpbmcgeW91LCBhcyBhIHJlc3VsdCwgdG8gcHVibGlzaCBleHRlbmRlZCBtZXRob2RzIGFuZCBwcm9jZXNzZXMgdGhhdCBzZWFtbGVzc2x5IGluY29ycG9yYXRlIHlvdXIgbWV0aG9kIGVsZW1lbnRzLiBUbyBjcmVhdGUgeW91ciBvd24gbWV0aG9kIHBsdWctaW5zIGZvbGxvdyB0aGVzZSBzdGVwcy48L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0KLQk8aXRlbQotCQl0aXRsZT0iVXNlIHRoZSBNZXRob2QgUGx1Zy1pbiBXaXphcmQiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkNyZWF0ZSBhIG5ldyBtZXRob2QgcGx1Zy1pbiB1c2luZyB0aGUgIk5ldyBNZXRob2QgUGx1Zy1pbiIgd2l6YXJkLiBUbyBvcGVuIHRoZSB3aXphcmQgc2VsZWN0IEZpbGUgLSZndDsgTmV3IC0mZ3Q7IE1ldGhvZCBQbHVnLWluLiBTcGVjaWZ5IGF0IGxlYXN0IHRoZSBuYW1lIGZvciB5b3VyIG5ldyBtZXRob2QgcGx1Zy1pbiBhbmQgc2VsZWN0IHRoZSBjaGVjayBib3ggZm9yIGFueSBvdGhlciBtZXRob2QgcGx1Zy1pbnMgd2hpY2ggY29udGVudCB5b3Ugd2lzaCB0byBleHRlbmQgb3IgcmV1c2UuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iT3BlbiB0aGUgTWV0aG9kIFBsdWdpbiBFZGl0b3IiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkFmdGVyIHlvdSBoYXZlIGNyZWF0ZWQgdGhlIHBsdWctaW4sIHlvdSBjYW4gbWFrZSBjaGFuZ2VzIHRvIGl0cyBzcGVjaWZpY2F0aW9ucyBpbiB0aGUgbWV0aG9kIHBsdWctaW4gZWRpdG9yLiBJbiB0aGUgbGlicmFyeSB2aWV3LCBkb3VibGUgY2xpY2sgdGhlIG1ldGhvZCBwbHVnLWluIHRoYXQgeW91IGp1c3QgY3JlYXRlZCB0byBvcGVuIHRoZSBlZGl0b3IuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iU3BlY2lmeSBWZXJzaW9uIEluZm9ybWF0aW9uIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5JbiBhZGRpdGlvbiB0byB0aGUgaW5mb3JtYXRpb24gYWxyZWFkeSBzcGVjaWZpZWQgaW4gdGhlIG1ldGhvZCBwbHVnLWluIHdpemFyZCwgeW91IGNhbiBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHBsdWctaW4uPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iU2VsZWN0IHRoZSBEZWZhdWx0IENvcHlyaWdodCBEZWZpbml0aW9uIEZpbGUiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGUgIlNlbGVjdCIgYnV0dG9uIHRvIHNwZWNpZnkgd2hpY2ggcGFnZSBvZiB0aGUgdHlwZSAiU3VwcG9ydGluZyBNYXRlcmlhbCIgY29udGFpbnMgdGhlIGNvcHlyaWdodCBpbmZvcm1hdGlvbiBmb3IgZWxlbWVudHMgb2YgdGhpcyBwbHVnLWluLiAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSB3aWxsIGJlIGFwcGVuZGVkIHRvIGV2ZXJ5IHBhZ2UgdGhhdCBnZXRzIHB1Ymxpc2hlZCBiYXNlZCBvbiBhbiBlbGVtZW50IGZyb20gdGhpcyBwbHVnLWluLiAgTm90ZSwgdGhhdCBpbmRpdmlkdWFsIG1ldGhvZCBlbGVtZW50cyBjYW4gb3ZlcnJpZGUgdGhpcyBzdGFuZGFyZCBzZWxlY3Rpb24gd2l0aCB0aGUgY29weXJpZ2h0IGZpZWxkIGluIHRoZWlyIG93biBlZGl0b3JzLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJEb25lIj48ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj48L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL25hdmlnYXRlbWV0aG9kY29udGVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9uYXZpZ2F0ZW1ldGhvZGNvbnRlbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmN2U2NTEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL25hdmlnYXRlbWV0aG9kY29udGVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxjaGVhdHNoZWV0IHRpdGxlPSJOYXZpZ2F0ZSBNZXRob2QgQ29udGVudCI+Ci0JPGludHJvIGhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCI+Ci0JCTxkZXNjcmlwdGlvbj5UaGVyZSBhcmUgdHdvIHdheXMgdG8gbmF2aWdhdGUgbWV0aG9kIGNvbnRlbnQ6IGJ5IHVzaW5nIHRoZSBwaHlzaWNhbCBsaWJyYXJ5IHN0cnVjdHVyZSBpbiB0aGUgbGlicmFyeSB2aWV3IG9yIGJ5IHVzaW5nIHRoZSBsb2dpY2FsIGNhdGVnb3JpemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuICBUaGlzIGNoZWF0IHNoZWV0IHdhbGtzIHlvdSB0aHJvdWdoIGJvdGggc2NlbmFyaW9zLjwvZGVzY3JpcHRpb24+Ci0JPC9pbnRybz4KLQk8aXRlbSBocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCIgdGl0bGU9IlN3aXRjaCB0byBBdXRob3JpbmcgUGVyc3BlY3RpdmUiIHNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+WW91IGNhbiB3b3JrIHdpdGggdHdvIHBlcnNwZWN0aXZlczogdGhlIGF1dGhvcmluZyBwZXJzcGVjdGl2ZSBhbmQgdGhlIGJyb3dzaW5nIHBlcnNwZWN0aXZlLiBBIHBlcnNwZWN0aXZlIGRlZmluZXMgYSBzZXQgb2Ygdmlld3MgYW5kIGZ1bmN0aW9ucyB0byBiZSBhdmFpbGFibGUgZm9yIHNwZWNpZmljIHRhc2tzLiBUaGUgYXV0aG9yaW5nIHBlcnNwZWN0aXZlIHByb3ZpZGVzIHZpZXdzIGFuZCBmdW5jdGlvbnMgdG8gbmF2aWdhdGUgYW5kIGF1dGhvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLCB3aGlsZSB0aGUgYnJvd3NpbmcgcGVyc3BlY3RpdmUgYWxsb3dzIHlvdSB0byBwcmV2aWV3IGFuZCBicm93c2UgYSBtZXRob2QgY29uZmlndXJhdGlvbi4gVGhpcyBjaGVhdCBzaGVldCByZWZlcnMgdG8gdGhlIGF1dGhvcmluZyBwZXJzcGVjdGl2ZS48YnIvPjxici8+Q2xpY2sgdGhlICJPcGVuIFBlcnNwZWN0aXZlIiBidXR0b24gb3IgdGhlIFdpbmRvdy0mZ3Q7T3BlbiBQZXJzcGVjdGl2ZSBtZW51IGFuZCB0aGVuIHNlbGVjdCAiQXV0aG9yaW5nIiB0byBzd2l0Y2ggdG8gdGhlIGF1dGhvcmluZyBwZXJzcGVjdGl2ZS48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSBocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbGlicmFyeXZpZXcuaHRtbCIgdGl0bGU9Ik9wZW4gdGhlIExpYnJhcnkgVmlldyIgc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5JZiB5b3UgZG8gbm90IHNlZSBhIHRyZWUtYnJvd3NlciB2aWV3IGxhYmVsZWQgIkxpYnJhcnkiIGluIHlvdXIgYXV0aG9yaW5nIHBlcnNwZWN0aXZlIGNsaWNrIHRoZSBXaW5kb3ctJmd0O1Jlc2V0IFBlcnNwZWN0aXZlIG1lbnUuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwiIHRpdGxlPSJEcmlsbCBpbnRvIE1ldGhvZCBDb250ZW50IFBhY2thZ2VzIiBza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5XaXRoaW4gdGhlIGxpYnJhcnkgdmlldyB0cmVlLWJyb3dzZXIsIGV4cGFuZCBhIHBsdWctaW4gYW5kIGRyaWxsIGludG8gdGhlIHBhY2thZ2VzICJNZXRob2QgQ29udGVudCItJmd0OyJDb250ZW50IFBhY2thZ2VzIiBhbmQgaXRzIHN1Yi1wYWNrYWdlcy4gRXhhbWluZSB0aGUgY29udGVudHMuCi0JCTwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJSZXZpZXcgQ29udGVudCBQYWNrYWdlcyIgc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+RXZlcnkgY29udGVudCBwYWNrYWdlIGNvbnRhaW5zIGRpZmZlcmVudCB0eXBlcyBvZiBtZXRob2QgY29udGVudCBlbGVtZW50cyB3aGljaCBhcmUgc29ydGVkIGludG8gZGlmZmVyZW50IGNhdGVnb3JpZXMuIFRoZSBjYXRlZ29yaWVzIGFyZSByb2xlcywgdGFza3MsIHdvcmsgcHJvZHVjdHMsIGFuZCBndWlkYW5jZS48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSBocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudC5odG1sIiB0aXRsZT0iT3BlbiBhIE1ldGhvZCBDb250ZW50IEVsZW1lbnQgRWRpdG9yIiBza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5TZWxlY3QgYSBtZXRob2QgZWxlbWVudCwgc3VjaCBhcyBhIHRhc2ssIGFuZCBkb3VibGUgY2xpY2sgdG8gb3BlbiBpdHMgZWRpdG9yLjxici8+PGJyLz5UaGUgZWRpdG9yIHByb3ZpZGVzIHRhYnMgYW5kIGZvcm1zIHRvIG9yZ2FuaXplIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIHRoZSBlbGVtZW50LiAgU2VsZWN0IHRoZSBkaWZmZXJlbnQgdGFicyBhbmQgdGhlIGJvdHRvbSBvZiBldmVyeSBlZGl0b3IgYW5kIHJldmlldyB0aGUgZGlmZmVyZW50IGZvcm1zIGRpc3BsYXllZC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSBocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCIgdGl0bGU9IkV4YW1pbmUgQ2F0ZWdvcmllcyIgc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+V2l0aGluIHRoZSBsaWJyYXJ5IHZpZXcgdHJlZS1icm93c2VyLCBleHBhbmQgdGhlIHBhY2thZ2VzIHRvIHRoZSBzYW1lIGxldmVsIGFzIGNvbnRlbnQgcGFja2FnZXMgdW50aWwgeW91IGZpbmQgdGhlICJDdXN0b20gQ2F0ZWdvcmllcyIgYW5kICJTdGFuZGFyZCBDYXRlZ29yaWVzIiBwYWNrYWdlcy4gRHJpbGwgaW50byB0aGVzZSBwYWNrYWdlcyBhbmQgdGhlbiBleGFtaW5lIHRoZWlyIGNvbnRlbnRzLjxici8+PGJyLz5FdmVyeSBjYXRlZ29yeSBsaXN0ZWQgaGVyZSBpcyBhIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsLiAgT3BlbiB0aGUgZGVzY3JpcHRpb24gb2YgYSBjYXRlZ29yeSBzdWNoIGFzIGEgZGlzY2lwbGluZSBvciBhIGRvbWFpbiBieSBkb3VibGUgY2xpY2tpbmcgdGhlIGNhdGVnb3J5IHdoaWNoIG9wZW5zIHRoZSBjYXRlZ29yeSBlZGl0b3IuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmZpZ3VyYXRpb252aWV3Lmh0bWwiIHRpdGxlPSJTZWxlY3QgYSBDb25maWd1cmF0aW9uIGZvciB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IiBza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPkJlY2F1c2UgdGhlIG1ldGhvZCBsaWJyYXJ5IGNhbiBjb250YWluIGxhcmdlIG51bWJlcnMgb2YgZWxlbWVudHMsIHlvdSBtYXkgd2FudCB0byBsaW1pdCB5b3VyIHdvcmsgdG8gYSB1c2VyLWRlZmluZWQgc3Vic2V0IG9mIHRoZSBsaWJyYXJ5IGNhbGxlZCBtZXRob2QgY29uZmlndXJhdGlvbi4gQSBjb25maWd1cmF0aW9uIGRlZmluZXMgYSB3b3JraW5nIHNldCBvZiBwYWNrYWdlcyB3aXRoaW4gdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgaGVscHMgeW91IGxpbWl0IHlvdXIgdmlldyB0byBhIHN1YnNldCBvZiBhbGwgZWxlbWVudHMuIFRoZSBlbGVtZW50cyB0aGF0IGFyZSBwYXJ0IG9mIGEgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBhcmUgZGlzcGxheWVkIGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuPGJyLz48YnIvPlRoZSBjb25maWd1cmF0aW9uIHZpZXcgZGlzcGxheXMgY2F0ZWdvcml6ZWQgbWV0aG9kIGVsZW1lbnRzIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY29uZmlndXJhdGlvbi4gIFRoaXMgaXMgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCBoYXMgYmVlbiBzZWxlY3RlZCBpbiB0aGUgdW5sYWJlbGVkIGNvbWJvIGJveCBpbiB0aGUgdG9vbCBiYXIuICBVc2UgdGhpcyBjb21ibyBib3ggdG8gc2VsZWN0IGEgY29uZmlndXJhdGlvbi48YnIvPjxici8+QWZ0ZXIgc2VsZWN0aW5nIGEgY29uZmlndXJhdGlvbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3IGlzIChyZS0pcG9wdWxhdGVkIHdpdGggbmV3IHRyZWVzIHNob3dpbmcgZWxlbWVudHMgZnJvbSB0aGF0IGNvbmZpZ3VyYXRpb24uPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkRyaWxsIGludG8gQ2F0ZWdvcmllcyBpbiBDb25maWd1cmF0aW9uIFZpZXciIHNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkRyaWxsIGludG8gdGhlIGNvbmZpZ3VyYXRpb24gdmlldydzIGNhdGVnb3JpZXMgZm9sZGVycyBhbmQgZXhhbWluZSB0aGUgZWxlbWVudHMgbGlzdGVkIHRoZXJlLjxici8+PGJyLz5BcyBpbiB0aGUgbGlicmFyeSB2aWV3IHlvdSBjYW4gb3BlbiBlbGVtZW50cyBsaXN0ZWQgaGVyZSB2aWEgYSBkb3VibGUtY2xpY2suIEhvd2V2ZXIsIHRoZSBjb25maWd1cmF0aW9uIHZpZXcgY29tcHV0ZXMgc28tY2FsbGVkIGNvbnRyaWJ1dGlvbnMgYW5kIHJlcGxhY2VtZW50cyBvZiBtZXRob2QgY29udGVudCBlbGVtZW50cyAoc2VlICJWYXJpYWJpbGl0eSBPdmVydmlldyIgaW4gdGhlIG9ubGluZSBoZWxwIGZvciBtb3JlIGRldGFpbHMpLiBJZiBhbiBlbGVtZW50IGhhcyBjb250cmlidXRpbmcgZWxlbWVudHMgdGhlbiBhIGRvdWJsZSBjbGljayB3aWxsIHNob3cgeW91IGEgZGlhbG9nIHdpdGggYWxsIHRoZSBlbGVtZW50cyBwYXJ0aWNpcGF0aW5nIGluIHRoZSBjb250cmlidXRpb24uICBTZWxlY3Qgb25lIGVsZW1lbnQgdG8gb3BlbiBpdHMgZWRpdG9yLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJEb25lIj4KLQkJPGRlc2NyaXB0aW9uLz4KLQk8L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9yZXBsYWNlZXhpc3RpbmdtZXRob2RlbGVtZW50cy54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9yZXBsYWNlZXhpc3RpbmdtZXRob2RlbGVtZW50cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI3NWZiNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvcmVwbGFjZWV4aXN0aW5nbWV0aG9kZWxlbWVudHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxjaGVhdHNoZWV0IHRpdGxlPSJSZXBsYWNlIEV4aXN0aW5nIE1ldGhvZCBFbGVtZW50cyAoUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzLCBvciBHdWlkYW5jZSkiPgotCi0JPGludHJvIAotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdmFyaWFiaWxpdHkuaHRtbCI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgY2FuIHRhaWxvciBleGlzdGluZyBtZXRob2QgZWxlbWVudHMsIHN1Y2ggYXMgYW4gZWxlbWVudCB0aGF0IGlzIGRlZmluZWQgaW4gYSBsb2NrZWQgcGx1Zy1pbiwgd2l0aG91dCBkaXJlY3RseSBtb2RpZnlpbmcgaXQsIGJ1dCBieSByZXBsYWNpbmcgaXQgd2l0aCBvbmUgb2YgeW91ciBvd24gZWxlbWVudHMgZGVmaW5lZCBpbiB5b3VyIG93biBtZXRob2QgcGx1Zy1pbi4gVGhpcyBjaGVhdCBzaGVldCB3YWxrcyB5b3UgdGhyb3VnaCB0aGUgc3RlcHMgb2YgY3JlYXRpbmcgc3VjaCBhIHJlcGxhY2VtZW50LiAgU2VlIHRoZSBvbmxpbmUgaGVscCBzZWN0aW9uICJWYXJpYWJpbGl0eSBPdmVydmlldyIgZm9yIGFuIGludHJvZHVjdGlvbiBvbiB2YXJpYWJpbGl0eSBhbmQgcmVwbGFjZW1lbnRzLjxici8+PGJyLz5SZXBsYWNlbWVudHMgY2FuIGFsc28gYmUgYXBwbGllZCB3aXRoaW4gdGhlIHNhbWUgbWV0aG9kIHBsdWctaW4gYmV0d2VlbiBtZXRob2QgY29udGVudCBlbGVtZW50cyBmcm9tIGRpZmZlcmVudCBjb250ZW50IHBhY2thZ2VzLiAgVGhpcyBpcyB1c2VmdWwgaW4gdGhlIGNhc2Ugd2hlcmUgeW91IHdhbnQgdG8gcHJvdmlkZSBhbHRlcm5hdGl2ZSBjb250ZW50IHRoYXQgY2FuIGJlIHNlbGVjdGVkIHVzaW5nIGRpZmZlcmVudCBtZXRob2QgY29uZmlndXJhdGlvbnMuPC9kZXNjcmlwdGlvbj4KLQk8L2ludHJvPgotCi0JPGl0ZW0KLQkJdGl0bGU9IlBsYW4geW91ciBSZXBsYWNlbWVudCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+V2hlbiBkZWZpbmluZyB0aGUgcmVwbGFjZW1lbnQgb2YgYW4gZXhpc3RpbmcgbWV0aG9kIGVsZW1lbnQgeW91IG5lZWQgdG8ga25vdyB3aGVyZSB0aGUgZXhpc3RpbmcgZWxlbWVudCB0aGF0IHlvdSB3YW50IHRvIHJlcGxhY2UgaXMgcGh5c2ljYWxseSBsb2NhdGVkIHdpdGhpbiBpdHMgbWV0aG9kIHBsdWctaW4uIFlvdSBhbHNvIG5lZWQgdG8gZGVjaWRlIHdlcmUgdG8gY3JlYXRlIGFuZCBwbGFjZSB0aGUgcmVwbGFjaW5nIGVsZW1lbnQuIFR5cGljYWxseSB5b3UgY3JlYXRlIHRoZSByZXBsYWNpbmcgZWxlbWVudCB3aXRoaW4gYSBzcGVjaWZpYyBjb250ZW50IHBhY2thZ2UgaW4geW91ciBvd24gbWV0aG9kIHBsdWctaW4uIEZpbmFsbHksIHlvdSBuZWVkIHRvIGtub3cgd2hhdCB0aGUgcmVwbGFjaW5nIGVsZW1lbnQncyBjb250ZW50IGlzLCBiZWNhdXNlIGFsbCBvZiB0aGUgcmVwbGFjZWQgZWxlbWVudOKAmXMgY29udGVudCAoaS5lLiBpdHMgdGV4dCBhdHRyaWJ1dGVzIGFzIHdlbGwgYXMgaXRzIHJlbGF0aW9uc2hpcHMgdGhhdCBwb2ludCB0byBvdGhlciBlbGVtZW50cykgd2lsbCBiZSByZW1vdmVkLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCIKLQkJdGl0bGU9IkNyZWF0ZSBhIFJlcGxhY2luZyBDb250ZW50IEVsZW1lbnQiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkNyZWF0ZSBhIG1ldGhvZCBjb250ZW50IGVsZW1lbnQgaW4geW91ciBtZXRob2QgcGx1Zy1pbiB0aGF0IHlvdSBpbnRlbmQgdG8gYmUgdGhlIHJlcGxhY2luZyBjb250ZW50IGVsZW1lbnQuIFJlbWVtYmVyLCB5b3UgbXVzdCBwcm92aWRlIHRoaXMgZWxlbWVudCB3aXRoIGl0cyBvd24gY29udGVudCBiZWNhdXNlIGFsbCBhdHRyaWJ1dGVzIG9mIHRoZSByZXBsYWNlZCBlbGVtZW50IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBlbXB0eSBmaWVsZHMsIGlmIHlvdSBkbyBub3QgcHJvdmlkZSBuZXcgZGVzY3JpcHRpb25zLjxici8+PGJyLz5HbyB0byBjaGVhdCBzaGVldCAiQWRkIGEgbmV3IE1ldGhvZCBDb250ZW50IHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzLCBvciBHdWlkYW5jZSIgdG8gYmUgZ3VpZGVkIHRocm91Z2ggdGhlc2Ugc3RlcHMuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmVwbGFjZS5odG1sIiAKLQkJdGl0bGU9IlNwZWNpZnkgdGhlIFJlcGxhY2VtZW50IFJlbGF0aW9uc2hpcCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+R28gdG8gdGhlICJDb250ZW50IFZhcmlhYmlsaXR5IiBzZWN0aW9uIG9mIHRoZSBlbGVtZW50cyBkZXNjcmlwdGlvbiB0YWIuIFNlbGVjdCAiUmVwbGFjZXMiIGZyb20gdGhlIGNvbWJvIGJveC4gQ2xpY2sgdGhlICJTZWxlY3QuLi4iIGJ1dHRvbiBvZiB0aGUgYmFzZSByb2xlIGZpZWxkIGFuZCBzZWxlY3QgdGhlIGVsZW1lbnQgdGhhdCB5b3VyIG5ldyBlbGVtZW50IHJlcGxhY2VzLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Jyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Lmh0bWwiIAotCQl0aXRsZT0iUmV2aWV3IHlvdXIgUmVwbGFjZWQgRWxlbWVudCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+VG8gcmV2aWV3IHlvdXIgcmVwbGFjZWQgZWxlbWVudCwgc2VsZWN0IGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBjb21ibyBib3ggaW4gdGhlIHRvb2wgYmFyIHRoYXQgY29udGFpbnMgdGhlIG1ldGhvZCBwbHVnLWlucyBhbmQgY29udGVudCBwYWNrYWdlcyBvZiBib3RoIGVsZW1lbnRzIHBhcnRpY2lwYXRpbmcgaW4geW91ciByZXBsYWNlbWVudC4gSW4gb3RoZXIgd29yZHMsIHRoZSBjb25maWd1cmF0aW9uIG11c3QgY29udGFpbiB0aGUgcmVwbGFjaW5nIGVsZW1lbnQgYXMgd2VsbCBhcyB0aGUgcmVwbGFjZWQgYmFzZSBlbGVtZW50Ljxici8+PGJyLz5Td2l0Y2ggdG8gdGhlIEJyb3dzaW5nIHBlcnNwZWN0aXZlLiBGaW5kIGFuZCBzZWxlY3QgdGhlIHJlcGxhY2luZyBlbGVtZW50IChpLmUuIHlvdXIgbmV3IGVsZW1lbnQpIGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuIFRoZSBjb250ZW50IHdpbmRvdyBkaXNwbGF5cyB0aGUgcmVzdWx0cyBvZiB0aGUgcmVwbGFjZW1lbnQuIFJldmlldyBhbiBlbGVtZW50IHRoYXQgcmVmZXJyZWQgdG8gdGhlIHJlcGxhY2VkIGVsZW1lbnQuIEluIG90aGVyIHdvcmRzLCBpZiB5b3UgcmVwbGFjZWQgYW4gYXJ0aWZhY3QsIGZpbmQgYSB0YXNrIHRoYXQgdXNlZCB0aGlzIGFydGlmYWN0IGFzIGFuIGlucHV0IG9yIG91dHB1dC4gTWFrZSBzdXJlIHRoaXMgZWxlbWVudCBub3cgcmVmZXJzIHRvIHRoZSByZXBsYWNpbmcgZWxlbWVudC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iRG9uZSI+PGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+PC9pdGVtPgotPC9jaGVhdHNoZWV0PgotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy90YWlsb3JleGlzdGluZ21ldGhvZGVsZW1lbnRzLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL3RhaWxvcmV4aXN0aW5nbWV0aG9kZWxlbWVudHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYWY3MjYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL3RhaWxvcmV4aXN0aW5nbWV0aG9kZWxlbWVudHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxjaGVhdHNoZWV0IHRpdGxlPSJUYWlsb3IgRXhpc3RpbmcgTWV0aG9kIEVsZW1lbnRzIChSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMsIG9yIEd1aWRhbmNlKSBVc2luZyBDb250cmlidXRpb24iPgotCi0JPGludHJvIAotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdmFyaWFiaWxpdHkuaHRtbCI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgY2FuIHRhaWxvciBleGlzdGluZyBtZXRob2QgZWxlbWVudHMsIHN1Y2ggYXMgYW4gZWxlbWVudCB0aGF0IGlzIGRlZmluZWQgaW4gYSBsb2NrZWQgbWV0aG9kIHBsdWctaW4sIHdpdGhvdXQgZGlyZWN0bHkgbW9kaWZ5aW5nIGl0LCBidXQgYnkgY29udHJpYnV0aW5nIG5ldyBjb250ZW50IG9yIHJlbGF0aW9uc2hpcHMgdG8gaXQgZnJvbSBhbiBlbGVtZW50IGRlZmluZWQgaW4gb25lIG9mIHlvdXIgb3duIG1ldGhvZCBwbHVnLWlucy4gVGhpcyBjaGVhdCBzaGVldCB3YWxrcyB5b3UgdGhyb3VnaCB0aGUgc3RlcHMgb2YgY3JlYXRpbmcgc3VjaCBhIGNvbnRyaWJ1dGlvbi4gIFNlZSB0aGUgb25saW5lIGhlbHAgc2VjdGlvbiAiVmFyaWFiaWxpdHkgT3ZlcnZpZXciIGZvciBhbiBpbnRyb2R1Y3Rpb24gb24gdmFyaWFiaWxpdHkgYW5kIGNvbnRyaWJ1dGlvbnMuPGJyLz48YnIvPkNvbnRyaWJ1dGlvbnMgY2FuIGFsc28gYmUgYXBwbGllZCB3aXRoaW4gdGhlIHNhbWUgbWV0aG9kIHBsdWctaW4gYmV0d2VlbiBlbGVtZW50cyBmcm9tIGRpZmZlcmVudCBjb250ZW50IHBhY2thZ2VzLiBUaGlzIGlzIHVzZWZ1bCBpbiB0aGUgZXZlbnQgeW91IHdhbnQgdG8gYnVpbGQgdXAgeW91ciBjb250ZW50IGVsZW1lbnRzIGluIGxheWVycyBvZiBjb21wbGV4aXR5IGJ5IGdyYWR1YWxseSBhZGRpbmcgbW9yZSBhbmQgbW9yZSBjb250ZW50IHZpYSBjb250cmlidXRpb24uICBUaGUgcmVzcGVjdGl2ZSBsZXZlbHMgb2YgY29udHJpYnV0aW9uIGNhbiB0aGVuIGJlIHNlbGVjdGVkIHdpdGhpbiBtZXRob2QgY29uZmlndXJhdGlvbnMgdGhhdCBhbGxvdyB5b3UgdG8gaW5jbHVkZSBvciBleGNsdWRlIHRoZSBjb250ZW50IHBhY2thZ2VzIHdpdGggdGhlIGNvbnRyaWJ1dGluZyBlbGVtZW50cy48L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0KLQk8aXRlbQotCQl0aXRsZT0iUGxhbiB5b3VyIENvbnRyaWJ1dGlvbiIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+QmVmb3JlIHlvdSBjYW4gY3JlYXRlIGEgY29udHJpYnV0aW9uIHRvIGFuIGV4aXN0aW5nIG1ldGhvZCBjb250ZW50IGVsZW1lbnQgeW91IG5lZWQgdG8ga25vdyB3aGVyZSB0aGlzIGVsZW1lbnQgaXMgbG9jYXRlZCB3aXRoaW4gaXRzIG1ldGhvZCBwbHVnLWluLiBZb3UgYWxzbyBuZWVkIHRvIGRlY2lkZSB3aGVyZSB0byBjcmVhdGUgYW5kIHBsYWNlIHRoZSBjb250cmlidXRpbmcgZWxlbWVudC4gVHlwaWNhbGx5LCB5b3UgY3JlYXRlIHRoaXMgZWxlbWVudCBpbiB5b3VyIG93biBtZXRob2QgcGx1Zy1pbiwgaW4gYSBzcGVjaWZpYyBjb250ZW50IHBhY2thZ2UuIEZpbmFsbHksIHlvdSBuZWVkIHRvIGtub3cgd2hhdCBpdCBpcyB5b3UgYWN0dWFsbHkgd2FudCB0byBjb250cmlidXRlLiBUaGlzIGNvdWxkIGJlIGFkZGl0aW9uYWwgdGV4dCBmb3IgdGhlIGZvcm0gZmllbGRzLCBuZXcgcmVsYXRpb25zaGlwcyB0byBvdGhlciBlbGVtZW50cywgb3IgbmV3IGNhdGVnb3JpemF0aW9ucy4gKFNlZSB0aGUgb25saW5lIGhlbHAgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGVzZSBmaWVsZHMgYW5kIHJlbGF0aW9uc2hpcHMuKTwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCIKLQkJdGl0bGU9IkNyZWF0ZSBhIENvbnRyaWJ1dGluZyBDb250ZW50IEVsZW1lbnQiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkNyZWF0ZSBhIGNvbnRlbnQgZWxlbWVudCBpbiB5b3VyIG1ldGhvZCBwbHVnLWluIHRoYXQgcHJvdmlkZXMgY29udHJpYnV0aW9ucyB0byB0aGUgY29udGVudCBlbGVtZW50IHRoYXQgeW91IHdpc2ggdG8gdGFpbG9yLiAgR28gdG8gdGhlIGNoZWF0IHNoZWV0ICJBZGQgYSBuZXcgTWV0aG9kIENvbnRlbnQgc3VjaCBhcyBSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMsIG9yIEd1aWRhbmNlIiB0byBiZSBndWlkZWQgdGhyb3VnaCB0aGVzZSBzdGVwcy48YnIvPjxici8+QWRkIHlvdXIgY29udHJpYnV0aW9ucyBzdWNoIGFzIHJldmlzZWQgdGV4dCBmb3IgZm9ybSBmaWVsZHMgb3IgYWRkaXRpb25hbCByZWxhdGlvbnNoaXBzIHRvIHlvdXIgbWV0aG9kIGNvbnRlbnQgZWxlbWVudC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb250cmlidXRlcy5odG1sIiAKLQkJdGl0bGU9IlNwZWNpZnkgdGhlIENvbnRyaWJ1dGlvbiBSZWxhdGlvbnNoaXAiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkdvIHRvIHRoZSAiQ29udGVudCBWYXJpYWJpbGl0eSIgc2VjdGlvbiBvZiB0aGUgZWxlbWVudHMgZGVzY3JpcHRpb24gdGFiLiBTZWxlY3QgIkNvbnRyaWJ1dGVzIiBmcm9tIHRoZSBjb21ibyBib3guIENsaWNrIHRoZSAiU2VsZWN0Li4uIiBidXR0b24gb2YgdGhlIGJhc2Ugcm9sZSBmaWVsZCBhbmQgdGhlbiBzZWxlY3QgdGhlIGVsZW1lbnQgdGhhdCB5b3Ugd2FudCB5b3VyIG5ldyBlbGVtZW50IHRvIGNvbnRyaWJ1dGUgdG8uPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbCIgCi0JCXRpdGxlPSJSZXZpZXcgeW91ciBDb250cmlidXRpb25zIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5UbyByZXZpZXcgeW91ciBjb250cmlidXRpb25zIHNlbGVjdCAob3IgY3JlYXRlIGZpcnN0IGFuZCB0aGVuIHNlbGVjdCkgYSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGNvbWJvIGJveCBpbiB0aGUgdG9vbCBiYXIgdGhhdCBjb250YWlucyB0aGUgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzIG9mIGJvdGggb2YgdGhlIGVsZW1lbnRzIHBhcnRpY2lwYXRpbmcgaW4geW91ciBjb250cmlidXRpb24uICBJbiBvdGhlciB3b3JkcyB0aGUgY29uZmlndXJhdGlvbiBoYXMgdG8gY29udGFpbiB0aGUgY29udHJpYnV0aW5nIGVsZW1lbnQgYXMgd2VsbCBhcyB0aGUgYmFzZSBlbGVtZW50Ljxici8+PGJyLz5Td2l0Y2ggdG8gdGhlICJCcm93c2luZyBQZXJzcGVjdGl2ZSIuIEZpbmQgYW5kIHNlbGVjdCB0aGUgYmFzZSBlbGVtZW50IChpLmUuIHRoZSBlbGVtZW50IHlvdSBjb250cmlidXRlZCB0bykgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldy4gVGhlIGNvbnRlbnQgd2luZG93IGRpc3BsYXlzIHRoZSByZXN1bHRzIG9mIHRoZSBjb250cmlidXRpb24uPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+CQotCTxpdGVtIHRpdGxlPSJEb25lIj48ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj48L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvZGVfbWFuYWdlbWVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb2RlX21hbmFnZW1lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MmIzMmI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvZGVfbWFuYWdlbWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHRvYyBsYWJlbD0iU3VwcG9ydCBmb3IgY29kZSBtYW5hZ2VtZW50IiBsaW5rX3RvPSJtYWluLnhtbCNjb2RlX21hbmFnZW1lbnRfaWQiPgotICAgPHRvcGljIGxhYmVsPSJTdXBwb3J0IGZvciBDVlMiIGhyZWY9Imh0bWwvaGVscC9jbV9jdnMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJTdXBvcnQgZm9yIFJhdGlvbmFsIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC9oZWxwL2NtX3JhdGlvbmFsY2MuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJTdXBwb3J0IGZvciBSYXRpb25hbCBDQ1JDIiBocmVmPSJodG1sL2hlbHAvY21fY2NyYy5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvbmNlcHRzLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvbmNlcHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODE4ODFiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb25jZXB0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkNvbmNlcHRzIiBsaW5rX3RvPSJtYWluLnhtbCNjb25jZXB0c19pZCI+Ci0gICA8dG9waWMgbGFiZWw9Ik92ZXJ2aWV3IG9mIEVQRiBDb21wb3NlciIgaHJlZj0iaHRtbC9vdmVydmlldy9wcm9kdWN0X292ZXJ2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgYXV0aG9yaW5nIG92ZXJ2aWV3IiBocmVmPSJodG1sL292ZXJ2aWV3L21ldGhvZF9jb250ZW50X2F1dGhvcmluZ19vdmVydmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlByb2Nlc3MgYXV0aG9yaW5nIG92ZXJ2aWV3IiBocmVmPSJodG1sL292ZXJ2aWV3L3Byb2Nlc3NfYXV0aG9yaW5nX292ZXJ2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbmZpZ3VyYXRpb25zIG92ZXJ2aWV3IiBocmVmPSJodG1sL292ZXJ2aWV3L21ldGhvZF9jb25maWd1cmF0aW9uc19vdmVydmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlVzZXIgcm9sZXMgYW5kIHJvbGUgc3BlY2lmaWMgdGFza3MiIGhyZWY9Imh0bWwvaGVscC91c2VyX3JvbGVzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9tZXRob2RfY29udGVudC5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvbnRleHRzX1NlYXJjaC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb250ZXh0c19TZWFyY2gueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NDdiODA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvbnRleHRzX1NlYXJjaC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08Y29udGV4dHM+Ci0JPGNvbnRleHQgIGlkPSJvcGVuX3NlYXJjaF9kaWFsb2dfYWN0aW9uX2NvbnRleHQiID4KLSAgICAgIAk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLSAJCTx0b3BpYyBsYWJlbD0iU2VhcmNoIGZvciBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL3NlYXJjaGZvcm1ldGhvZF9jb250ZW50Lmh0bWwiLz4KLSAgIAk8L2NvbnRleHQ+Ci0KLSAgIAk8Y29udGV4dCAgaWQ9ImZpbGVfc2VhcmNoX2FjdGlvbl9jb250ZXh0IiA+Ci0gICAgIAkgPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+Ci0gCQk8dG9waWMgbGFiZWw9IlNlYXJjaCBmb3IgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9zZWFyY2hmb3JtZXRob2RfY29udGVudC5odG1sIi8+Ci0gICAJPC9jb250ZXh0PgotICAgCQotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvbnRleHRzX2F1dGhvcmluZ191aS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb250ZXh0c19hdXRob3JpbmdfdWkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMzlmMTBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvbnRleHRzX2F1dGhvcmluZ191aS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08Y29udGV4dHM+IAotCTxjb250ZXh0ICBpZD0iZmlsZV9uZXdfbGlicmFyeV9jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9saWJyYXJ5X292ZXJ2aWV3Lmh0bWwiICBsYWJlbD0iTWV0aG9kIGxpYnJhcnkgb3ZlcnZpZXciLz4gIAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJmaWxlX25ld19wbHVnaW5fY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY3JlYXRlX21ldGhvZF9wbHVnaW4uaHRtbCIgIGxhYmVsPSJDcmVhdGUgYSBtZXRob2QgcGx1Zy1pbiIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0iZmlsZV9uZXdfY29uZmlndXJhdGlvbl9jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tZXRob2Rjb25maWd1cmF0aW9ucy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb25maWd1cmF0aW9ucyBvdmVydmlldyIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0iZmlsZV9vcGVuX2xpYnJhcnlfY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbGlicmFyeV9vdmVydmlldy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBsaWJyYXJ5IG92ZXJ2aWV3Ii8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJmaWxlX29wZW5fY29uZmlndXJhdGlvbl9jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tZXRob2Rjb25maWd1cmF0aW9ucy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb25maWd1cmF0aW9ucyBvdmVydmlldyIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0ibGlicmFyeV9uYXZpZ2F0b3Jfdmlld19jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj4gPC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbGlicmFyeV92aWV3Lmh0bWwiICBsYWJlbD0iTGlicmFyeSB2aWV3Ii8+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2F1dGhvcmluZ19wZXJzcGVjdGl2ZS5odG1sIiAgbGFiZWw9IkF1dGhvcmluZyBwZXJzcGVjdGl2ZSIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJjb25maWd1cmF0aW9uX3ZpZXdfY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY29uZmlndXJhdGlvbl92aWV3Lmh0bWwiICBsYWJlbD0iQ29uZmlndXJhdGlvbiB2aWV3Ii8+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2Jyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCIgIGxhYmVsPSJCcm93c2luZyBwZXJzcGVjdGl2ZSIvPiAKLQk8L2NvbnRleHQ+IAotCQotCQkJPCEtLSBiZWdpbm5pbmcgb2YgdGhlIGxpYnJhcnkgbmF2aWdhdG9yIG5vZGUgc2Vuc2l0aXZlIEYxIGNvbnRleHQgaGVscHMgLS0+Ci0JCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19tZXRob2RfcGx1Z2luX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgbWV0aG9kIHBsdWctaW4gbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X2NvbnRlbnRfcGFja2FnZV9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IENvbnRlbnRQYWNrYWdlIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld190YXNrX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgbWV0aG9kIFRhc2sgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X3dvcmtfcHJvZHVjdF9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IFdvcmtQcm9kdWN0IG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19ndWlkYW5jZV9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IEd1aWRhbmNlIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19kaXNjaXBsaW5lX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgRGlzY2lwbGluZSBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfZGlzY2lwbGluZV9ncm91cGluZ19jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IERpc2NpcGxpbmVHcm91cGluZyBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfZG9tYWluX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgRG9tYWluIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19yb2xlX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgUm9sZSBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfd29ya19wcm9kdWN0X3R5cGVfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBXb3JrUHJvZHVjdFR5cGUgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfcm9sZV9zZXRfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBSb2xlU2V0IG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQotCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfdG9vbF9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IG1ldGhvZCBUb29sIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X3JvbGVfc2V0X2dyb3VwaW5nX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgUm9sZVNldEdyb3VwaW5nIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X2N1c3RvbV9jYXRlZ29yeV9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IEN1c3RvbUNhdGVnb3J5IG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X3Byb2Nlc3NfY29tcG9uZW50X2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgUHJvY2Vzc0NvbXBvbmVudCBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfcHJvY2Vzc19jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IFByb2Nlc3Mgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X21ldGhvZF9jb25maWd1cmF0aW9uX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgTWV0aG9kQ29uZmlndXJhdGlvbiBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJPCEtLSBlbmQgb2YgdGhlIGxpYnJhcnkgbmF2aWdhdG9yIG5vZGUgc2Vuc2l0aXZlIEYxIGNvbnRleHQgaGVscHMgLS0+Ci0JCi0JCi0JPCEtLSBmb3JtIGVkaXRvciBzZWN0aW9uIGNvbnRleHQgaGVscCAtLT4KLQkKLQk8Y29udGV4dCAgaWQ9InBsdWdpbl9lZGl0b3JfZGVzY3JpcHRpb25fYWxsX2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPiA8L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfbWV0aG9kX3BsdWdpbi5odG1sIiAgbGFiZWw9IkNyZWF0ZSBhIG1ldGhvZCBwbHVnLWluIi8+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21ldGhvZHBsdWdpbi5odG1sIiAgbGFiZWw9Ik1ldGhvZCBwbHVnLWluIi8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJjb25maWd1cmF0aW9uX2VkaXRvcl9hbGxfY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY3JlYXRlX21ldGhvZF9jb25maWd1cmF0aW9uLmh0bWwiICBsYWJlbD0iQ3JlYXRlIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24iLz4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCIgIGxhYmVsPSJNZXRob2QgY29uZmlndXJhdGlvbnMgb3ZlcnZpZXciLz4gCi0JPC9jb250ZXh0PiAKLQkKLQk8Y29udGV4dCAgaWQ9ImNvbnRlbnRfcGFja2FnZV9lZGl0b3JfYWxsX2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9jb250ZW50cGFja2FnZS5odG1sIiAgbGFiZWw9IkNyZWF0aW5nIGEgY29udGVudCBwYWNrYWdlIi8+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgcGFja2FnZSIvPiAKLQk8L2NvbnRleHQ+IAotCQotCQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX3JvbGVfY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfcm9sZS5odG1sIiAgbGFiZWw9IkNyZWF0ZSBhIHJvbGUiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX3Rhc2tfY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfdGFzay5odG1sIiAgbGFiZWw9IkNyZWF0ZSBhIHRhc2siLz4gIAotCTwvY29udGV4dD4gCi0KLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl93b3JrX3Byb2R1Y3RfY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfd29ya3Byb2R1Y3QuaHRtbCIgIGxhYmVsPSJDcmVhdGUgd29yayBwcm9kdWN0Ii8+IAotCTwvY29udGV4dD4gCi0KLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl9ndWlkYW5jZV9jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9ndWlkYW5jZS5odG1sIiAgbGFiZWw9IkNyZWF0aW5nIGd1aWRhbmNlIi8+IAotCTwvY29udGV4dD4gCi0KLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl9kaXNjaXBsaW5lX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJlZGl0b3JfZGlzY2lwbGluZV9ncm91cGluZ19jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NvbnRlbnRfY2F0ZWdvcmllcy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX2RvbWFpbl9jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NvbnRlbnRfY2F0ZWdvcmllcy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX3dvcmtfcHJvZHVjdF90eXBlX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+IDwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NvbnRlbnRfY2F0ZWdvcmllcy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX3JvbGVfc2V0X2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJlZGl0b3Jfcm9sc2Vfc2V0X2dyb3VwaW5nX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJlZGl0b3JfdG9vbF9jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NvbnRlbnRfY2F0ZWdvcmllcy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX2N1c3RvbV9jYXRlZ29yeV9jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NvbnRlbnRfY2F0ZWdvcmllcy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiLz4gCi0JPC9jb250ZXh0PiAKLQkKLQkJCTwhLS0gYmVnaW5uaW5nIG9mIHNlY3Rpb24gYmFzZWQgRjEgY29udGV4dCBoZWxwIC0tPgotCQkJPGNvbnRleHQgIGlkPSJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9nZW5lcmFsX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9nZW5lcmFsX2NvbnRleHQuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2RldGFpbF9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fZGV0YWlsX2NvbnRleHQuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX25vdGF0aW9uX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9ub3RhdGlvbl9jb250ZXh0LjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl90YWlsb3JpbmdfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX3RhaWxvcmluZ19jb250ZXh0LjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl92ZXJzaW9uX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl92ZXJzaW9uX2NvbnRleHQuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCTxjb250ZXh0ICBpZD0iZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fZWxlbWVudF9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fZWxlbWVudF9jb250ZXh0LjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQk8Y29udGV4dCAgaWQ9ImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2ljb25fY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2ljb25fY29udGV4dC48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCTwhLS0gZW5kIG9mIHNlY3Rpb24gYmFzZWQgRjEgY29udGV4dCBoZWxwIC0tPgotCQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX2NwX2Rlc2NyaXB0aW9uX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0JCTx0b3BpYyBocmVmPSJodG1sL2hlbHAvY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCIgIGxhYmVsPSJDYXBhYmlsaXR5IHBhdHRlcm4iLz4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2NhcGFiaWxpdHlfcGF0dGVybi5odG1sIiAgbGFiZWw9IkNyZWF0ZSBhIHJldXNhYmxlIGNhcGFiaWxpdHkgcGF0dGVybiIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX2RwX2Rlc2NyaXB0aW9uX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0JCTx0b3BpYyBocmVmPSJodG1sL2hlbHAvZGVsaXZlcnlfcHJvY2Vzcy5odG1sIiAgbGFiZWw9IkRlbGl2ZXJ5IHByb2Nlc3MiLz4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2RlbGl2ZXJ5X3Byb2Nlc3MuaHRtbCIgIGxhYmVsPSJDcmVhdGUgYSBkZWxpdmVyeSBwcm9jZXNzIi8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJmb3JtX2VkaXRvcl9wcm9jZXNzX3dic19jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9kZXZlbG9wX3dicy5odG1sIiAgbGFiZWw9IkRldmVsb3AgYSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUiLz4gCi0JPC9jb250ZXh0PiAKLQkKLQk8Y29udGV4dCAgaWQ9ImZvcm1fZWRpdG9yX3Byb2Nlc3Nfb2JzX2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3BfdGVhbV9zdHJ1Y3R1cmUuaHRtbCIgIGxhYmVsPSJEZXZlbG9wIGEgdGVhbSBhbGxvY2F0aW9uIHN0cnVjdHVyZSIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0iZm9ybV9lZGl0b3JfcHJvY2Vzc19wYnNfY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvZGV2ZWxvcF93b3JrcHJvZHVjdF9zdHJ1Y3R1cmUuaHRtbCIgIGxhYmVsPSJEZXZlbG9wIGEgd29yayBwcm9kdWN0IHVzYWdlIHN0cnVjdHVyZSIvPiAKLQk8L2NvbnRleHQ+IAotCi0JCi0JPGNvbnRleHQgIGlkPSJjb25maWd1cmF0aW9uX3B1Ymxpc2hfd2l6YXJkX2FsbF9wYWdlc19jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9wdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbCIgIGxhYmVsPSJQdWJsaXNoaW5nIG92ZXJ2aWV3Ii8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJyaWNoX3RleHRfZWRpdG9yX2NvbnRleHRfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3JpY2h0ZXh0ZWRpdG9yLmh0bWwiICBsYWJlbD0iUmljaCB0ZXh0IGVkaXRvciIvPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9hZGRfaHlwZXJsaW5rLmh0bWwiICBsYWJlbD0iQWRkaW5nIGEgcmVmZXJlbmNlIG9yIGh5cGVybGluayIvPiAKLQk8L2NvbnRleHQ+IAotCQotPC9jb250ZXh0cz4gCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGVyZXVzYWJsZW1ldGhvZGNvbnRlbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRlcmV1c2FibGVtZXRob2Rjb250ZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjhlZWZiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGVyZXVzYWJsZW1ldGhvZGNvbnRlbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJDcmVhdGUgUmV1c2FibGUgTWV0aG9kIENvbnRlbnQiIGxpbmtfdG89Im1haW4ueG1sI2NyZWF0ZXJldXNhYmxlbWV0aG9kY29udGVudF9pZCI+Ci0gIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgYXV0aG9yaW5nIG92ZXJ2aWV3IiBocmVmPSJodG1sL2hlbHAvbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL21ldGhvZF9jb250ZW50Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIG1ldGhvZCBjb250ZW50IiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX21ldGhvZF9jb250ZW50Lmh0bWwiPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSByb2xlIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX3JvbGUuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSB0YXNrIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX3Rhc2suaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSB3b3JrIHByb2R1Y3QiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfd29ya3Byb2R1Y3QuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgZ3VpZGFuY2UiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfZ3VpZGFuY2UuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJWYXJpYWJpbGl0eSIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5Lmh0bWwiPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJDb250cmlidXRlcyIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5X2NvbnRyaWJ1dGVzLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iRXh0ZW5kcyIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5X2V4dGVuZHMuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJSZXBsYWNlcyIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5X3JlcGxhY2UuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJWYXJpYWJpbGl0eSBhc3NvY2lhdGlvbnMiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eV9hc3NvY2lhdGlvbnMuaHRtbCIvPgotICAgICAgPC90b3BpYz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IkJyb3dzZSBhbmQgcHJldmlldyBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL2Jyb3dzZV9jb250ZW50Lmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRpbmdfbWV0aG9kX2NvbnRlbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRpbmdfbWV0aG9kX2NvbnRlbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZGRjNDg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NyZWF0aW5nX21ldGhvZF9jb250ZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08dG9jIGxhYmVsPSJDcmVhdGluZyByZXVzYWJsZSBtZXRob2QgY29udGVudCIgbGlua190bz0ibWFpbi54bWwjY3JlYXRpbmdfbWV0aG9kX2NvbnRlbnRfaWQiPiAgCi0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9tZXRob2RfY29udGVudC5odG1sIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgcm9sZSIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9yb2xlLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgdGFzayIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV90YXNrLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgd29yayBwcm9kdWN0IiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX3dvcmtwcm9kdWN0Lmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGd1aWRhbmNlIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2d1aWRhbmNlLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIENvbnRlbnQgVmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eS5odG1sIj4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iQ29udHJpYnV0ZXMiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eV9jb250cmlidXRlcy5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkV4dGVuZHMiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eV9leHRlbmRzLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iUmVwbGFjZXMiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eV9yZXBsYWNlLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iQXNzb2NpYXRpb25zIGltcGFjdGVkIGJ5IHZhcmlhYmlsaXR5IiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfYXNzb2NpYXRpb25zLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iQnJvd3NpbmcgdmFyaWFiaWxpdHkgYXNzb2NpYXRpb25zIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfYnJvd3NpbmcuaHRtbCIvPgotICAgICAgPC90b3BpYz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IkJyb3dzZSBhbmQgcHJldmlldyBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL2Jyb3dzZV9jb250ZW50Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgaW5kZXggZW50cmllcyIgaHJlZj0iaHRtbC9oZWxwL2luZGV4aW5nLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgZ2xvc3NhcnkgZW50cmllcyIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5X2VudHJpZXMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDaGFuZ2luZyBjb3B5cmlnaHQgbm90aWNlcyIgaHJlZj0iaHRtbC9oZWxwL2NoYW5naW5nX2NvcHlyaWdodC5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NyZWF0aW5nX3Byb2Nlc3Nlcy54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGluZ19wcm9jZXNzZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZjBlYTkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NyZWF0aW5nX3Byb2Nlc3Nlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkNyZWF0aW5nIHByb2Nlc3NlcyIgbGlua190bz0ibWFpbi54bWwjY3JlYXRpbmdfcHJvY2Vzc2VzX2lkIj4gIAotICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHJldXNhYmxlIGNhcGFiaWxpdHkgcGF0dGVybiIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9jYXBhYmlsaXR5X3BhdHRlcm4uaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIGRlbGl2ZXJ5IHByb2Nlc3MiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfZGVsaXZlcnlfcHJvY2Vzcy5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSIgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3Bfd2JzLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJEZXZlbG9wIGEgdGVhbSBhbGxvY2F0aW9uIHN0cnVjdHVyZSIgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3BfdGVhbV9zdHJ1Y3R1cmUuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkRldmVsb3AgYSB3b3JrIHByb2R1Y3QgdXNhZ2Ugc3RydWN0dXJlIiBocmVmPSJodG1sL2hlbHAvZGV2ZWxvcF93b3JrcHJvZHVjdF9zdHJ1Y3R1cmUuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkFwcGx5IGEgY2FwYWJpbGl0eSBwYXR0ZXJuIiBocmVmPSJodG1sL2hlbHAvYXBwbHlfY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IlByb2Nlc3MgZWxlbWVudCBwcm9wZXJ0aWVzIHZpZXciIGhyZWY9Imh0bWwvaGVscC9wcm9wZXJ0aWVzX3ZpZXcuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IlVzaW5nIGRlZXAgY29weSIgaHJlZj0iaHRtbC9oZWxwL3VzaW5nX2RlZXBfY29weS5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iVXNpbmcgYWN0aXZpdHkgdmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvaGVscC91c2luZ19hY3Rpdml0eV92YXJpYWJpbGl0eS5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIHByb2Nlc3MgZGlhZ3JhbXMiIGhyZWY9Imh0bWwvaGVscC9wcm9jZXNzX2RpYWdyYW1zLmh0bWwiPgotICA8dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBhY3Rpdml0eSBkaWFncmFtcyIgaHJlZj0iaHRtbC9oZWxwL2FjdGl2aXR5X2RpYWdyYW1zLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIiBocmVmPSJodG1sL2hlbHAvYWN0aXZpdHlfZGV0YWlsX2RpYWdyYW1zLmh0bWwiLz4KLSAgPC90b3BpYz4KLQotPC90b2M+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGluZ3Byb2Nlc3Nlcy54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGluZ3Byb2Nlc3Nlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4ZmM3YjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRpbmdwcm9jZXNzZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJDcmVhdGluZyBQcm9jZXNzZXMiIGxpbmtfdG89Im1haW4ueG1sI2NyZWF0aW5ncHJvY2Vzc2VzX2lkIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iUHJvY2VzcyBhdXRob3Jpbmcgb3ZlcnZpZXciIGhyZWY9Imh0bWwvaGVscC9wcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IlByb2Nlc3MiIGhyZWY9Imh0bWwvaGVscC9wcm9jZXNzLmh0bWwiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHJldXNhYmxlIGNhcGFiaWxpdHkgcGF0dGVybiIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9jYXBhYmlsaXR5X3BhdHRlcm4uaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNhcGFiaWxpdHkgcGF0dGVybiIgaHJlZj0iaHRtbC9oZWxwL2NhcGFiaWxpdHlwYXR0ZXJuLmh0bWwiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIGRlbGl2ZXJ5IHByb2Nlc3MiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfZGVsaXZlcnlfcHJvY2Vzcy5odG1sIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iRGVsaXZlcnkgcHJvY2VzcyIgaHJlZj0iaHRtbC9oZWxwL2RlbGl2ZXJ5X3Byb2Nlc3MuaHRtbCIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSIgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3Bfd2JzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHRlYW0gYWxsb2NhdGlvbiBzdHJ1Y3R1cmUiIGhyZWY9Imh0bWwvaGVscC9kZXZlbG9wX3RlYW1fc3RydWN0dXJlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHdvcmsgcHJvZHVjdCB1c2FnZSBzdHJ1Y3R1cmUiIGhyZWY9Imh0bWwvaGVscC9kZXZlbG9wX3dvcmtwcm9kdWN0X3N0cnVjdHVyZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkFwcGx5IGEgY2FwYWJpbGl0eSBwYXR0ZXJuIiBocmVmPSJodG1sL2hlbHAvYXBwbHlfY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJQcm9jZXNzIGVsZW1lbnQgcHJvcGVydGllcyB2aWV3IiBocmVmPSJodG1sL2hlbHAvcHJvcGVydGllc192aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIHByb2Nlc3MgZGlhZ3JhbXMiIGhyZWY9Imh0bWwvaGVscC9wcm9jZXNzX2RpYWdyYW1zLmh0bWwiPgotICAgICAgPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggYWN0aXZpdHkgZGlhZ3JhbXMiIGhyZWY9Imh0bWwvaGVscC9hY3Rpdml0eV9kaWFncmFtcy5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbXMiIGhyZWY9Imh0bWwvaGVscC9hY3Rpdml0eV9kZXRhaWxfZGlhZ3JhbXMuaHRtbCIvPgotICAgPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvZG9jLnppcCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2RvYy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJjMWVmZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvZG9jLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2dldHRpbmdzdGFydGVkLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2dldHRpbmdzdGFydGVkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODhiMTdlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9nZXR0aW5nc3RhcnRlZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkdldHRpbmcgU3RhcnRlZCIgbGlua190bz0ibWFpbi54bWwjZ2V0dGluZ3N0YXJ0ZWRfaWQiPgotICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBsaWJyYXJ5IG92ZXJ2aWV3IiBocmVmPSJodG1sL2hlbHAvbGlicmFyeV9vdmVydmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlRvb2wgaW50ZXJmYWNlIiBocmVmPSJodG1sL2hlbHAvdXNlcmludGVyZmFjZV9vdmVydmlldy5odG1sIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQXV0aG9yaW5nIHBlcnNwZWN0aXZlIiBocmVmPSJodG1sL2hlbHAvYXV0aG9yaW5nX3BlcnNwZWN0aXZlLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQnJvd3NpbmcgcGVyc3BlY3RpdmUiIGhyZWY9Imh0bWwvaGVscC9icm93c2luZ19wZXJzcGVjdGl2ZS5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNvbmZpZ3VyYXRpb24gVmlldyIgaHJlZj0iaHRtbC9oZWxwL2NvbmZpZ3VyYXRpb25fdmlldy5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkxpYnJhcnkgdmlldyIgaHJlZj0iaHRtbC9oZWxwL2xpYnJhcnlfdmlldy5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkJyb3dzZSBhbmQgcHJldmlldyBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL2Jyb3dzZV9jb250ZW50Lmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iU2VhcmNoIGZvciBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL3NlYXJjaF9jb250ZW50Lmh0bWwiLz4KLSAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIG1ldGhvZCBwbHVnLWluIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX21ldGhvZF9wbHVnaW4uaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBjb250ZW50IHBhY2thZ2UiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfY29udGVudHBhY2thZ2UuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBtZXRob2QgY29uZmlndXJhdGlvbiIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9tZXRob2RfY29uZmlndXJhdGlvbi5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2dsb3NzYXJ5LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2dsb3NzYXJ5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGE1YjQyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9nbG9zc2FyeS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9Ikdsb3NzYXJ5IiBsaW5rX3RvPSJtYWluLnhtbCNnbG9zc2FyeV9pZCI+Ci0gIDx0b3BpYyBsYWJlbD0iQWN0aXZpdHkiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS9hY3Rpdml0eS5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iQWN0aXZpdHkgdmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS9hY3Rpdml0eV92YXJpYWJpbGl0eS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkFydGlmYWN0IiBocmVmPSJodG1sL2hlbHAvZ2xvc3NhcnkvYXJ0aWZhY3QuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDYXBhYmlsaXR5IHBhdHRlcm4iIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS9jYXBhYmlsaXR5cGF0dGVybi5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNoZWNrbGlzdCIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L2NoZWNrbGlzdC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNvbmNlcHQiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS9jb25jZXB0Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ29udHJpYnV0ZXMiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eV9jb250cmlidXRlcy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkRlbGl2ZXJhYmxlIiBocmVmPSJodG1sL2hlbHAvZ2xvc3NhcnkvZGVsaXZlcmFibGUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJEZWVwIGNvcHkiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS9kZWVwX2NvcHkuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJEaXNjaXBsaW5lIiBocmVmPSJodG1sL2hlbHAvZ2xvc3NhcnkvZGlzY2lwbGluZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkRvbWFpbiIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L2RvbWFpbi5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkVzdGltYXRpbmcgZ3VpZGVsaW5lIiBocmVmPSJodG1sL2hlbHAvZ2xvc3NhcnkvZXN0aW1hdGluZ19ndWlkZWxpbmUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJFeGFtcGxlIiBocmVmPSJodG1sL2hlbHAvZ2xvc3NhcnkvZXhhbXBsZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkV4dGVuZHMiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eV9leHRlbmRzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iR3VpZGFuY2UiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS9ndWlkYW5jZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ikd1aWRlbGluZSIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L2d1aWRlbGluZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ikl0ZXJhdGlvbiIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L2l0ZXJhdGlvbi5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb25maWd1cmF0aW9uIiBocmVmPSJodG1sL2hlbHAvZ2xvc3NhcnkvbWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29udGVudCBwYWNrYWdlIiBocmVmPSJodG1sL2hlbHAvZ2xvc3NhcnkvbWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgcGx1Zy1pbiIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L21ldGhvZHBsdWdpbi5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ik1pbGVzdG9uZSIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L21pbGVzdG9uZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ik91dGNvbWUiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS9vdXRjb21lLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUGVyc3BlY3RpdmVzIiBocmVmPSJodG1sL2hlbHAvZ2xvc3NhcnkvcGVyc3BlY3RpdmVzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUGhhc2UiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS9waGFzZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlByYWN0aWNlIiBocmVmPSJodG1sL2hlbHAvZ2xvc3NhcnkvcHJhY3RpY2UuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJQcmV2aWV3IiBocmVmPSJodG1sL2hlbHAvZ2xvc3NhcnkvcHJldmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlByb2Nlc3MiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS9wcm9jZXNzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUmVwbGFjZXMiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eV9yZXBsYWNlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUmVwb3J0IiBocmVmPSJodG1sL2hlbHAvZ2xvc3NhcnkvcmVwb3J0Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUmV1c2FibGUgYXNzZXQiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS9yZXVzYWJsZWFzc2V0Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUm9hZG1hcCIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L3JvYWRtYXAuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJSb2xlIiBocmVmPSJodG1sL2hlbHAvZ2xvc3Nhcnkvcm9sZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlJvbGUgc2V0IiBocmVmPSJodG1sL2hlbHAvZ2xvc3Nhcnkvcm9sZXNldC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlJvbGUgc2V0IGdyb3VwaW5nIiBocmVmPSJodG1sL2hlbHAvZ2xvc3Nhcnkvcm9sZXNldGdyb3VwaW5nLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iU3RlcCIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L3N0ZXAuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJTdXBwb3J0aW5nIG1hdGVyaWFsIiBocmVmPSJodG1sL2hlbHAvZ2xvc3Nhcnkvc3VwcG9ydGluZ21hdGVyaWFsLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iU3luY2hyb25pemF0aW9uIiBocmVmPSJodG1sL2hlbHAvZ2xvc3Nhcnkvc3luY2hyb25pemF0aW9uLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iVGFzayIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L3Rhc2suaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJUZW1wbGF0ZSIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L3RlbXBsYXRlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iVGVybSBkZWZpbml0aW9uIiBocmVmPSJodG1sL2hlbHAvZ2xvc3NhcnkvdGVybWRlZmluaXRpb24uaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJUb29sIG1lbnRvciIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L3Rvb2xtZW50b3IuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJWYXJpYWJpbGl0eSIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iV2hpdGVwYXBlciIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L3doaXRlcGFwZXIuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJXb3JrIHByb2R1Y3QiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeS93b3JrcHJvZHVjdC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IldvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L3dvcmtwcm9kdWN0ZGVzY3JpcHRvcnMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJXb3JrIHByb2R1Y3Qga2luZCIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5L3dvcmtwcm9kdWN0a2luZC5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvQXV0aG9yUGVyc3AuSlBHIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9BdXRob3JQZXJzcC5KUEcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZhNGU3OTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9BdXRob3JQZXJzcC5KUEcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Fib3V0ZXBmY29tcG9zZXIuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWJvdXRlcGZjb21wb3Nlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4Y2E1NjIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWJvdXRlcGZjb21wb3Nlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFib3V0IEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwjbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InByb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sI3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJhYm91dGVwZmNvbXBvc2VyIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkFib3V0IEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXI8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImFib3V0ZXBmY29tcG9zZXIiPjxhIG5hbWU9ImFib3V0ZXBmY29tcG9zZXIiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BYm91dCBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyPC9oMT4KLTxkaXY+PHA+V2VsY29tZSB0byBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIChFUEYgQ29tcG9zZXIpLiBFUEYgQ29tcG9zZXIgaXMgYSB0b29sIHBsYXRmb3JtIHRoYXQKLWVuYWJsZXMgcHJvY2VzcyBlbmdpbmVlcnMgYW5kIG1hbmFnZXJzIHRvIGltcGxlbWVudCwgZGVwbG95LCBhbmQgbWFpbnRhaW4KLXByb2Nlc3NlcyBmb3Igb3JnYW5pemF0aW9ucyBvciBpbmRpdmlkdWFsIHByb2plY3RzLiBUeXBpY2FsbHksIHR3byBrZXkgcHJvYmxlbXMKLW5lZWQgdG8gYmUgYWRkcmVzc2VkIHRvIHN1Y2Nlc3NmdWxseSBkZXBsb3kgbmV3IHByb2Nlc3Nlcy48L3A+Ci08cD5GaXJzdCwgZGV2ZWxvcG1lbnQgdGVhbXMgbmVlZCB0byBiZSBlZHVjYXRlZCBvbiB0aGUgbWV0aG9kcyBhcHBsaWNhYmxlCi10byB0aGUgcm9sZXMgdGhhdCB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuIFNvZnR3YXJlIGRldmVsb3BlcnMgdHlwaWNhbGx5Ci1uZWVkIHRvIGxlYXJuIGhvdyB0byBkbyBhbmFseXNpcyBhbmQgZGVzaWduLCB0ZXN0ZXJzIG5lZWQgdG8gbGVhcm4gaG93IHRvCi10ZXN0IGltcGxlbWVudGF0aW9ucyBhZ2FpbnN0IHJlcXVpcmVtZW50cywgbWFuYWdlcnMgbmVlZCB0byBsZWFybiBob3cgdG8gbWFuYWdlCi10aGUgcHJvamVjdCBzY29wZSBhbmQgY2hhbmdlLCBhbmQgc28gb24uIFNvbWUgb3JnYW5pemF0aW9ucyBhc3N1bWUgdGhhdCBkZXZlbG9wZXJzCi1pbXBsaWNpdGx5IGtub3cgaG93IHRvIGRvIHN1Y2ggd29yayB3aXRob3V0IGRvY3VtZW50aW5nIHRoZWlyIG1ldGhvZHMsIGJ1dAotbWFueSBvcmdhbml6YXRpb25zIHdhbnQgdG8gZXN0YWJsaXNoIGNvbW1vbiBhbmQgcmVndWxhdGVkIHByYWN0aWNlcywgdG8gZHJpdmUKLXNwZWNpZmljIGltcHJvdmVtZW50IG9iamVjdGl2ZXMsIGFuZCB0byBtZWV0IGNvbXBsaWFuY2Ugc3RhbmRhcmRzLiA8L3A+Ci08cD5TZWNvbmQsIGRldmVsb3BtZW50IHRlYW1zIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdG8gYXBwbHkgdGhlc2UgbWV0aG9kcwotdGhyb3VnaG91dCBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gVGhhdCBpcywgdGhleSBuZWVkIHRvIGRlZmluZSBvciBzZWxlY3QKLWEgZGV2ZWxvcG1lbnQgcHJvY2Vzcy4gRm9yIGV4YW1wbGUsIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50IG1ldGhvZHMgaGF2ZSB0bwotYmUgYXBwbGllZCBkaWZmZXJlbnRseSBpbiBlYXJseSBwaGFzZXMgb2YgYSBwcm9qZWN0IHdoZXJlIHRoZSBmb2N1cyBpcyBvbgotZWxpY2l0YXRpb24gb2Ygc3Rha2Vob2xkZXIgbmVlZHMgYW5kIHJlcXVpcmVtZW50cyBhbmQgc2NvcGluZyBhIHZpc2lvbiwgdGhhbgotaW4gbGF0ZXIgcGhhc2VzIHdoZXJlIHRoZSBmb2N1cyBpcyBvbiBtYW5hZ2luZyByZXF1aXJlbWVudHMgdXBkYXRlcyBhbmQgY2hhbmdlcwotYW5kIHBlcmZvcm1pbmcgaW1wYWN0IGFuYWx5c2lzIG9mIHRoZXNlIHJlcXVpcmVtZW50cyBjaGFuZ2VzLiBUZWFtcyBhbHNvIG5lZWQKLWNsZWFyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBkaWZmZXJlbnQgdGFza3Mgb2YgdGhlIG1ldGhvZHMgcmVsYXRlIHRvIGVhY2gKLW90aGVyLCBmb3IgZXhhbXBsZSwgaG93IHRoZSBjaGFuZ2UgbWFuYWdlbWVudCBtZXRob2QgaW1wYWN0cyB0aGUgcmVxdWlyZW1lbnRzCi1tYW5hZ2VtZW50IG1ldGhvZCBhcyB3ZWxsIGFzIHJlZ3Jlc3Npb24gdGVzdGluZyBtZXRob2QgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlLgotRXZlbiBzZWxmLW9yZ2FuaXppbmcgdGVhbXMgbmVlZCB0byBkZWZpbmUgYSBwcm9jZXNzIHRoYXQgZ2l2ZXMgYXQgbWluaW11bQotc29tZSBndWlkYW5jZSBvbiBob3cgdGhlIGRldmVsb3BtZW50IHdpbGwgYmUgc2NvcGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSwKLXdoZW4gbWlsZXN0b25lcyB3aWxsIGJlIGFjaGlldmVkIGFuZCB2ZXJpZmllZCwgYW5kIHNvIG9uLiAgPC9wPgotPGRpdiBjbGFzcz0icCI+VG8gdGhhdCBlbmQsIEVQRiBDb21wb3NlciBoYXMgdHdvIG1haW4gcHVycG9zZXM6PHVsPjxsaT5UbyBwcm92aWRlIGEga25vd2xlZGdlIGJhc2Ugb2YgaW50ZWxsZWN0dWFsIGNhcGl0YWwgd2hpY2ggeW91IGNhbiBicm93c2UsCi1tYW5hZ2UgYW5kIGRlcGxveS4gVGhpcyBjb250ZW50IGNhbiBpbmNsdWRlIGV4dGVybmFsbHkgZGV2ZWxvcGVkIGNvbnRlbnQsCi1hbmQsIG1vcmUgaW1wb3J0YW50bHksIGNhbiBpbmNsdWRlIHlvdXIgb3duIGNvbnRlbnQgaW5jbHVkaW5nIG9mIHdoaXRlcGFwZXJzLAotZ3VpZGVsaW5lcywgdGVtcGxhdGVzLCBwcmluY2lwbGVzLCBiZXN0IHByYWN0aWNlcywgaW50ZXJuYWwgcHJvY2VkdXJlcyBhbmQKLXJlZ3VsYXRpb25zLCB0cmFpbmluZyBtYXRlcmlhbCwgYW5kIGFueSBvdGhlciBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB5b3VyCi1tZXRob2RzLiBUaGlzIGtub3dsZWRnZSBiYXNlIGNhbiB1c2VkIGZvciByZWZlcmVuY2UgYW5kIGVkdWNhdGlvbi4gSXQgYWxzbwotZm9ybXMgdGhlIGJhc2lzIGZvciBkZXZlbG9waW5nIHByb2Nlc3NlcyAodGhlIHNlY29uZCBwdXJwb3NlKS4gRVBGIENvbXBvc2VyIGlzIGRlc2lnbmVkCi10byBiZSBhIGNvbnRlbnQgbWFuYWdlbWVudCBzeXN0ZW0gdGhhdCBwcm92aWRlcyBhIGNvbW1vbiBtYW5hZ2VtZW50IHN0cnVjdHVyZQotYW5kIGxvb2sgYW5kIGZlZWwgZm9yIGFsbCBvZiB5b3VyIGNvbnRlbnQsIHJhdGhlciB0aGFuIGJlaW5nIGEgZG9jdW1lbnQgbWFuYWdlbWVudAotc3lzdGVtIGluIHdoaWNoIHlvdSB3b3VsZCBzdG9yZSBhbmQgYWNjZXNzIGhhcmQgdG8gbWFpbnRhaW4gbGVnYWN5IGRvY3VtZW50cwotYWxsIGluIHRoZWlyIG93biBzaGFwZXMgYW5kIGZvcm1hdHMuIEFsbCBjb250ZW50IG1hbmFnZWQgaW4gRVBGIENvbXBvc2VyIGNhbiBiZSBwdWJsaXNoZWQKLXRvIGh0bWwgYW5kIGRlcGxveWVkIHRvIFdlYiBzZXJ2ZXJzIGZvciBkaXN0cmlidXRlZCB1c2FnZS4gPC9saT4KLTxsaT5UbyBwcm92aWRlIHByb2Nlc3MgZW5naW5lZXJpbmcgY2FwYWJpbGl0aWVzIGJ5IHN1cHBvcnRpbmcgcHJvY2VzcyBlbmdpbmVlcnMKLWFuZCBwcm9qZWN0IG1hbmFnZXJzIGluIHNlbGVjdGluZywgdGFpbG9yaW5nLCBhbmQgcmFwaWRseSBhc3NlbWJsaW5nIHByb2Nlc3NlcwotZm9yIHRoZWlyIGNvbmNyZXRlIGRldmVsb3BtZW50IHByb2plY3RzLiBFUEYgQ29tcG9zZXIgcHJvdmlkZXMgY2F0YWxvZ3Mgb2YgcHJlLWRlZmluZWQKLXByb2Nlc3NlcyBmb3IgdHlwaWNhbCBwcm9qZWN0IHNpdHVhdGlvbnMgdGhhdCBjYW4gYmUgYWRhcHRlZCB0byBpbmRpdmlkdWFsCi1uZWVkcy4gSXQgYWxzbyBwcm92aWRlcyBwcm9jZXNzIGJ1aWxkaW5nIGJsb2NrcywgY2FsbGVkIGNhcGFiaWxpdHkgcGF0dGVybnMsCi10aGF0IHJlcHJlc2VudCBiZXN0IGRldmVsb3BtZW50IHByYWN0aWNlcyBmb3Igc3BlY2lmaWMgZGlzY2lwbGluZXMsIHRlY2hub2xvZ2llcywKLW9yIG1hbmFnZW1lbnQgc3R5bGVzLiBUaGVzZSBidWlsZGluZyBibG9ja3MgZm9ybSBhIHRvb2xraXQgZm9yIHF1aWNrIGFzc2VtYmx5Ci1vZiBwcm9jZXNzZXMgYmFzZWQgb24gcHJvamVjdC1zcGVjaWZpYyBuZWVkcy4gRVBGIENvbXBvc2VyIGFsc28gYWxsb3dzIHlvdSB0byBzZXQgdXAKLXlvdXIgb3duIG9yZ2FuaXphdGlvbi1zcGVjaWZpYyBjYXBhYmlsaXR5IHBhdHRlcm4gbGlicmFyaWVzLiBGaW5hbGx5LCB0aGUKLXByb2Nlc3NlcyBjcmVhdGVkIHdpdGggRVBGIENvbXBvc2VyIGNhbiBiZSBwdWJsaXNoZWQgYW5kIGRlcGxveWVkIGFzIFdlYiBzaXRlcy4gPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InAiPjxzdHJvbmc+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBLZXkgQ29uY2VwdHM8L3N0cm9uZz48dWw+PGxpPlByb3ZpZGVzIGNvbXBsZXRlbHkgcmVkZXNpZ25lZCB0b29scyBmb3IgYXV0aG9yaW5nLCBjb25maWd1cmluZywgdmlld2luZywKLWFuZCBwdWJsaXNoaW5nIGRldmVsb3BtZW50IHByb2Nlc3Nlcy4gPC9saT4KLTxsaT5Qcm92aWRlcyBqdXN0LWluLXRpbWUgZ2VuZXJhdGlvbiBvZiBwdWJsaWNhdGlvbiBwcmV2aWV3cyBpbiBkZWRpY2F0ZWQKLWJyb3dzaW5nIHBlcnNwZWN0aXZlIHRoYXQgYWxsb3dzIHJhcGlkIGNvbmZpZ3VyYXRpb24gc3dpdGNoaW5nLiA8L2xpPgotPGxpPk1hbmFnZXMgbWV0aG9kIGNvbnRlbnQgdXNpbmcgc2ltcGxlIGZvcm0tYmFzZWQgdXNlciBpbnRlcmZhY2VzLiBUaGVyZWZvcmUsCi1VTUwgbW9kZWxpbmcgc2tpbGxzIGFyZSBubyBsb25nZXIgcmVxdWlyZWQuIDwvbGk+Ci08bGk+UHJvdmlkZXMgaW50dWl0aXZlIHJpY2ggdGV4dCBlZGl0b3JzIGZvciBjcmVhdGluZyBpbGx1c3RyYXRpdmUgY29udGVudAotZGVzY3JpcHRpb25zLiBFZGl0b3JzIGFsbG93IHVzZSBvZiBzdHlsZXMsIGltYWdlcywgdGFibGVzLCBoeXBlcmxpbmtzLCBhbmQKLWRpcmVjdCBIVE1MIGVkaXRpbmcuPC9saT4KLTxsaT5BbGxvd3MgY3JlYXRpbmcgcHJvY2Vzc2VzIHdpdGggYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3JzIGFuZCB3b3JrZmxvdwotZGlhZ3JhbXMgdGhyb3VnaCB1c2Ugb2YgbXVsdGktcHJlc2VudGF0aW9uIHByb2Nlc3MgZWRpdG9ycy4gQnJlYWtkb3duIHN0cnVjdHVyZQotZWRpdG9yIHN1cHBvcnRzIGRpZmZlcmVudCBwcm9jZXNzIHZpZXdzOiB3b3JrLWJyZWFrZG93biB2aWV3LCB3b3JrIHByb2R1Y3QKLXVzYWdlIHZpZXcsIGFuZCB0ZWFtIGFsbG9jYXRpb24gdmlldy4gRVBGIENvbXBvc2VyIGF1dG9tYXRpY2FsbHkgc3luY2hyb25pemVzIGFsbCBwcmVzZW50YXRpb25zCi13aXRoIHByb2Nlc3MgY2hhbmdlcy4gPC9saT4KLTxsaT5Qcm92aWRlcyBzdXBwb3J0IGZvciBtYW55IGFsdGVybmF0aXZlIGxpZmVjeWNsZQotbW9kZWxzLiBGb3IgZXhhbXBsZSwgd2F0ZXJmYWxsLCBpbmNyZW1lbnRhbCwgb3IgaXRlcmF0aXZlIG1vZGVscyBjYW4gYmUgY3JlYXRlZAotd2l0aCB0aGUgc2FtZSBvdmVybGFwcGluZyBtZXRob2QgY29udGVudC4gPC9saT4KLTxsaT5JbXByb3ZlZCByZXVzZSBhbmQgZXh0ZW5zaWJpbGl0eSBjYXBhYmlsaXRpZXMuIFRoZSBwbHVnLWluIG1lY2hhbmlzbXMKLWZyb20gcGFzdCB2ZXJzaW9ucyBoYXZlIGJlZW4gZXh0ZW5kZWQgdG8gc3VwcG9ydCBleHRlbnNpb25zIGZvciBicmVha2Rvd24KLXN0cnVjdHVyZXMuPC9saT4KLTxsaT5TdXBwb3J0cyByZXVzYWJsZSBkeW5hbWljYWxseS1saW5rZWQgcHJvY2VzcyBwYXR0ZXJucyBvZiBiZXN0IHByYWN0aWNlcwotZm9yIHJhcGlkIHByb2Nlc3MgYXNzZW1ibHkgdmlhIGRyYWctYW5kLWRyb3AuIDwvbGk+Ci08L3VsPgotPC9kaXY+Ci08cD48c3Ryb25nPktleSBUZXJtaW5vbG9neSBhbmQgQ29uY2VwdHM8L3N0cm9uZz48L3A+Ci08cD5UbyBlZmZlY3RpdmVseSB3b3JrIHdpdGggRVBGIENvbXBvc2VyLCB5b3UgbmVlZCB0byB1bmRlcnN0YW5kIGEgZmV3Ci1jb25jZXB0cyB0aGF0IGFyZSB1c2VkIHRvIG9yZ2FuaXplIHRoZSBjb250ZW50LiBUaGUgcGFnZXMgTWV0aG9kIENvbnRlbnQgQXV0aG9yaW5nCi1PdmVydmlldyBhbmQgUHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXcgY29udGFpbiBtb3JlIGRldGFpbCBhbmQgY29uY3JldGUgZXhhbXBsZXMKLW9mIGhvdyB0byB3b3JrIGluIHRoZSB0b29sLiBUaGlzIHBhZ2UgcHJvdmlkZXMgeW91IHdpdGggYSBnZW5lcmFsIG92ZXJ2aWV3Ci1vZiB0aGVzZSBjb25jZXB0cy4gPC9wPgotPHA+VGhlIG1vc3QgZnVuZGFtZW50YWwgcHJpbmNpcGxlIGluIEVQRiBDb21wb3NlciBpcyB0aGUgc2VwYXJhdGlvbiBvZiByZXVzYWJsZSBjb3JlCi1tZXRob2QgY29udGVudCBmcm9tIGl0cyBhcHBsaWNhdGlvbiBpbiBwcm9jZXNzZXMuIFRoaXMgZGlyZWN0bHkgcmVsYXRlcyBiYWNrCi10byB0aGUgdHdvIHB1cnBvc2VzIG9mIEVQRiBDb21wb3NlciBkZXNjcmliZWQgaW4gdGhlIGZpcnN0IHNlY3Rpb24uIEFsbW9zdCBhbGwgb2YgRVBGIENvbXBvc2VyJ3MKLWNvbmNlcHRzIGFyZSBjYXRlZ29yaXplZCBhbG9uZyB0aGlzIHNlcGFyYXRpb24uIE1ldGhvZCBjb250ZW50IGRlc2NyaWJlcyB3aGF0Ci1pcyB0byBiZSBwcm9kdWNlZCwgdGhlIG5lY2Vzc2FyeSBza2lsbHMgcmVxdWlyZWQgYW5kIHRoZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zCi1kZXNjcmliaW5nIGhvdyBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQuIFRoZXNlIG1ldGhvZCBjb250ZW50Ci1kZXNjcmlwdGlvbnMgYXJlIGluZGVwZW5kZW50IG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiBQcm9jZXNzZXMgZGVzY3JpYmUKLXRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuIFByb2Nlc3NlcyB0YWtlIHRoZSBtZXRob2QgY29udGVudCBlbGVtZW50cyBhbmQKLXJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzCi1vZiBwcm9qZWN0cy4gPC9wPgotPHA+PGltZyBzcmM9InVtYV9odW1wLmdpZiIgYWx0PSIiIC8+PC9wPgotPHA+VGhlIGZpZ3VyZSBhYm92ZSBzaG93cyBob3cgdGhpcyBzZXBhcmF0aW9uIGlzIGRlcGljdGVkIGluIEJhc2ljIFVuaWZpZWQKLVByb2Nlc3MuIE1ldGhvZCBjb250ZW50LCBkZXNjcmliaW5nIGhvdyBkZXZlbG9wbWVudCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCwKLWlzIGNhdGVnb3JpemVkIGJ5IGRpc2NpcGxpbmVzIGFsb25nIHRoZSB5LWF4aXMgb2YgdGhlIGRpYWdyYW0uIFRoZSB3b3JrIGRlc2NyaWJlZAotaW4gYSBwcm9jZXNzIGlzIHNlZW4gYWxvbmcgdGhlIHgtYXhpcyByZXByZXNlbnRpbmcgdGhlIHRpbWVsaW5lLiBUaGlzIGlzIHRoZQotbGlmZWN5Y2xlIG9mIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gSXQgZXhwcmVzc2VzIHdoZW4gd2hhdCB3b3JrIHdpbGwgYmUgcGVyZm9ybWVkLgotVGhlIGdyYXBoIGluIHRoZSBpbGx1c3RyYXRpb24gcmVwcmVzZW50cyBhbiBlc3RpbWF0ZWQgd29ya2xvYWQgZm9yIGVhY2ggZGlzY2lwbGluZS4KLUFzIHlvdSBzZWUsIGZvciBleGFtcGxlLCBvbmUgbmV2ZXIgc3RvcHMgd29ya2luZyBvbiByZXF1aXJlbWVudHMgaW4gT3BlblVQL0Jhc2ljLCBidXQKLXRoZXJlIGFyZSBjZXJ0YWlubHkgcGVhayB0aW1lcyBpbiB3aGljaCBtb3N0IG9mIHRoZSByZXF1aXJlbWVudHMgZWxpY2l0YXRpb24KLWFuZCBkZXNjcmlwdGlvbiB3b3JrIGlzIHBlcmZvcm1lZC4gVGhlcmUgYXJlIGFsc28gdGltZXMgYXQgd2hpY2ggYSBkb3dud2FyZAotdHJlbmQgbmVlZHMgdG8gYmUgb2JzZXJ2ZWQgd2hlcmUgZmV3ZXIgYW5kIGZld2VyIHJlcXVpcmVtZW50cyBjaGFuZ2VzIGhhdmUKLXRvIGJlIHByb2Nlc3NlZCB0byBicmluZyB0aGUgcHJvamVjdCB0byBhIGNsb3NlLiBUaGlzIGF2b2lkcyB3aGF0IGlzIHJlZmVycmVkCi10byBhcyBmZWF0dXJlIGNyZWVwIGluIHdoaWNoIHJlcXVpcmVtZW50cyB3b3JrIHJlbWFpbnMgY29uc3RhbnQgb3IgZXZlbiBpbmNyZWFzZXMuCi1IZW5jZSwgYSBsaWZlY3ljbGUgKHByb2Nlc3MpIGV4cHJlc3NlcyB0aGUgdmFyaWFuY2VzIG9mIHdvcmsgcGVyZm9ybWVkIGluCi10aGUgdmFyaW91cyBkaXNjaXBsaW5lcyAobWV0aG9kIGNvbnRlbnQpLiA8L3A+Ci08cD48aW1nIHNyYz0ibWV0aF92c19wcm9jLmdpZiIgYWx0PSIiIC8+PC9wPgotPHA+VGhlIHBpY3R1cmUgYWJvdmUgcHJvdmlkZXMgYSBzdW1tYXJ5IG9mIHRoZSBrZXkgZWxlbWVudHMgdXNlZCBpbiBFUEYgQ29tcG9zZXIgYW5kCi1ob3cgdGhleSByZWxhdGUgdG8gbWV0aG9kIGNvbnRlbnQgb3IgcHJvY2Vzcy4gQXMgeW91IHNlZSwgbWV0aG9kIGNvbnRlbnQgaXMKLXByaW1hcmlseSBleHByZXNzZWQgdXNpbmcgd29yayBwcm9kdWN0cywgcm9sZXMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UuIEd1aWRhbmNlLAotc3VjaCBhcyBjaGVja2xpc3RzLCBleGFtcGxlcywgb3Igcm9hZG1hcHMsIGNhbiBhbHNvIGJlIGRlZmluZWQgdG8gcHJvdmlkZQotZXhlbXBsYXJ5IHdhbGt0aHJvdWdocyBvZiBhIHByb2Nlc3MuIE9uIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIGRpYWdyYW0sCi15b3Ugc2VlIHRoZSBlbGVtZW50cyB1c2VkIHRvIHJlcHJlc2VudCBwcm9jZXNzZXMgaW4gRVBGIENvbXBvc2VyLiBUaGUgbWFpbiBlbGVtZW50Ci1pcyB0aGUgYWN0aXZpdHkgdGhhdCBjYW4gYmUgbmVzdGVkIHRvIGRlZmluZSBicmVha2Rvd24gc3RydWN0dXJlcyBhcyB3ZWxsCi1hcyByZWxhdGVkIHRvIGVhY2ggb3RoZXIgdG8gZGVmaW5lIGEgZmxvdyBvZiB3b3JrLiBBY3Rpdml0aWVzIGFsc28gY29udGFpbgotZGVzY3JpcHRvcnMgdGhhdCByZWZlcmVuY2UgbWV0aG9kIGNvbnRlbnQuIEFjdGl2aXRpZXMgYXJlIHVzZWQgdG8gZGVmaW5lIHByb2Nlc3Nlcwotb2Ygd2hpY2ggRVBGIENvbXBvc2VyIHN1cHBvcnQgdHdvIG1haW4ga2luZHM6IGRlbGl2ZXJ5IHByb2Nlc3NlcyBhbmQgY2FwYWJpbGl0eSBwYXR0ZXJucy4KLURlbGl2ZXJ5IHByb2Nlc3NlcyByZXByZXNlbnQgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBwcm9jZXNzIHRlbXBsYXRlIGZvcgotcGVyZm9ybWluZyBvbmUgc3BlY2lmaWMgdHlwZSBvZiBwcm9qZWN0LiBUaGV5IGRlc2NyaWJlIGEgY29tcGxldGUgZW5kLXRvLWVuZAotcHJvamVjdCBsaWZlY3ljbGUgYW5kIGFyZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhcgotY2hhcmFjdGVyaXN0aWNzLiBDYXBhYmlsaXR5IHBhdHRlcm5zIGFyZSBwcm9jZXNzZXMgdGhhdCBleHByZXNzIGFuZCBjb21tdW5pY2F0ZQotcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIGRpc2NpcGxpbmUgb3IgYSBiZXN0Ci1wcmFjdGljZS4gVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBkZWxpdmVyeSBwcm9jZXNzZXMKLW9yIGxhcmdlciBjYXBhYmlsaXR5IHBhdHRlcm5zLiBUaGlzIGVuc3VyZXMgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24KLW9mIHRoZWlyIGtleSBiZXN0IHByYWN0aWNlcyBpbiBwcm9jZXNzIGF1dGhvcmluZyBhY3Rpdml0aWVzIGluIEVQRiBDb21wb3Nlci48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2RhdXRob3JpbmdvdmVydmlldy5odG1sI21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Ij5NZXRob2QgQ29udGVudCBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InByb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sI3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldyI+UHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hY3Rpdml0eS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hY3Rpdml0eS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhODUyMTQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWN0aXZpdHkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFjdGl2aXR5IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iYWN0aXZpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+QWN0aXZpdHk8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImFjdGl2aXR5Ij48YSBuYW1lPSJhY3Rpdml0eSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFjdGl2aXR5PC9oMT4KLTxkaXY+PHA+QWN0aXZpdGllcyByZXByZXNlbnQgdGhlIGtleSBidWlsZGluZyBibG9ja3MgZm9yIHByb2Nlc3Nlcy4gQWN0aXZpdGllcwotcmVwcmVzZW50IGEgZ3JvdXBpbmcgb2YgYnJlYWtkb3duIGVsZW1lbnRzIHN1Y2ggYXMgb3RoZXIgYWN0aXZpdGllcywgdGFzawotZGVzY3JpcHRvcnMsIHJvbGUgZGVzY3JpcHRvcnMsIDxhIGhyZWY9Indvcmtwcm9kdWN0ZGVzY3JpcHRvcnMuaHRtbCN3b3JrcHJvZHVjdGRlc2NyaXB0b3JzIj53b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnM8L2E+LCBhbmQgPGEgaHJlZj0ibWlsZXN0b25lLmh0bWwjbWlsZXN0b25lIj5taWxlc3RvbmVzPC9hPi4gSW4gYWRkaXRpb24gdG8gYnJlYWtkb3duIHN0cnVjdHVyZXMsIGFjdGl2aXRpZXMKLWNhbiBhbHNvIGJlIHByZXNlbnRlZCBpbiBhY3Rpdml0eSBkaWFncmFtcyB0aGF0IGdyYXBoaWNhbGx5IHNob3cgdGhlIGZsb3cKLW9mIHdvcmsgYnkgc2hvd2luZyB3aGljaCBhY3Rpdml0aWVzIHByZWNlZGUgb3RoZXIgYWN0aXZpdGllcy4gPGEgaHJlZj0icGhhc2UuaHRtbCNwaGFzZSI+UGhhc2U8L2E+IGFuZCA8YSBocmVmPSJpdGVyYXRpb24uaHRtbCNpdGVyYXRpb24iPml0ZXJhdGlvbjwvYT4gYXJlCi1zcGVjaWFsIHR5cGVzIG9mIGFjdGl2aXRpZXMgdGhhdCBkZWZpbmUgc3BlY2lmaWMgcHJvcGVydGllcy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUiPkRldmVsb3AgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRhcmVmZXJlbmNlb3JoeXBlcmxpbmsuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkYXJlZmVyZW5jZW9yaHlwZXJsaW5rLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFkMTI1MDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRhcmVmZXJlbmNlb3JoeXBlcmxpbmsuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZCBhIFJlZmVyZW5jZSBvciBIeXBlcmxpbmsiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InJpY2h0ZXh0ZWRpdG9yLmh0bWwjcmljaHRleHRlZGl0b3IiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iYWRkYXJlZmVyZW5jZW9yaHlwZXJsaW5rIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkFkZCBhIFJlZmVyZW5jZSBvciBIeXBlcmxpbms8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxkaXYgY2xhc3M9Im5lc3RlZDAiIGlkPSJhZGRhcmVmZXJlbmNlb3JoeXBlcmxpbmsiPjxhIG5hbWU9ImFkZGFyZWZlcmVuY2Vvcmh5cGVybGluayI+PCEtLSAtLT48L2E+PGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkIGEgUmVmZXJlbmNlIG9yIEh5cGVybGluazwvaDE+Ci08ZGl2PjxwPllvdSBjYW4gYWRkIHR3byB0eXBlcyBvZiByZWZlcmVuY2VzIG9yIGh5cGVybGlua3MgdG8geW91ciBjb250ZW50IHRleHQ6Ci1yZWZlcmVuY2VzICB0byBvdGhlciBlbGVtZW50cyBpbiB0aGUgbWV0aG9kIGxpYnJhcnkgb3IgcmVmZXJlbmNlcyB0byBleHRlcm5hbAotdGV4dCB3aXRoIGEgVVJMIHRoYXQgcmVzaWRlcyBvdXRzaWRlIHRoZSBtZXRob2QgbGlicmFyeS48L3A+Ci08cD5UZXh0IGZpZWxkcyB0aGF0IHN1cHBvcnQgaHlwZXJsaW5rcyBoYXZlIGEgdHdpc3R5IHN5bWJvbCA8aW1nIHNyYz0idHdpc3R5IHN5bWJvbDEuSlBHIiBhbHQ9IiIgLz4gbmV4dCB0byB0aGUgdGV4dCBmaWVsZCdzIGxhYmVsLiBDbGljayB0aGUgc3ltYm9sIHRvIGV4cGFuZAotdGhlIGZpZWxkIGludG8gYSBmdWxsIHRleHQgZWRpdG9yLiA8L3A+Ci08cD5UbyBpbnNlcnQgYSBoeXBlcmxpbmsgdG8gYW5vdGhlciBlbGVtZW50IGluIHRoZSBtZXRob2QgbGlicmFyeSBpbnRvIGEgdGV4dAotZmllbGQsIGxvY2F0ZSB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byBjcmVhdGUgYSBsaW5rIHRvIGluIHRoZSBsaWJyYXJ5IG9yIGNvbmZpZ3VyYXRpb24KLXZpZXcgYW5kIHRoZW4gZHJhZyBpdCBpbnRvIHRoZSBhcHByb3ByaWF0ZSB0ZXh0IGZpZWxkLCBUaGUgbGluayB0byB0aGUgZWxlbWVudAotaXMgYWRkZWQgYXMgYSBtZXRob2QgZWxlbWVudCB3aXRoIHR5cGUgcHJlZml4LCBtZWFuaW5nIHRoYXQgdGhlIG1ldGhvZCBlbGVtZW50Ci1uYW1lIGlzIHByZWZpeGVkIHdpdGggdGhlIG1ldGhvZCBlbGVtZW50IHR5cGUuIFlvdSBjYW4gYWxzbyBkcmFnIGEgbWV0aG9kCi1lbGVtZW50IGludG8gYW4gdW5leHBhbmRlZCB0ZXh0IGZpZWxkIHRoYXQgc3VwcG9ydHMgaHlwZXJsaW5rcyB3aXRoIHRoZSBzYW1lCi1yZXN1bHQuPC9wPgotPGRpdiBjbGFzcz0icCI+WW91IGNhbiB1c2UgdGhlIEFkZCBMaW5rIGZ1bmN0aW9uIGluIHRoZSByaWNoIHRleHQgZWRpdG9yIHRvIGFkZCBsaW5rcwotdGhhdCBhcmUgcmVmZXJlbmNlcyB0byBvdGhlciBtZXRob2QgZWxlbWVudHMgb3IgbGlua3MgdG8gZmlsZXMgb3IgV2ViIHBhZ2VzLgotVGhpcyBnaXZlcyB5b3UgZnVydGhlciBvcHRpb25zIGluIGhvdyB5b3VyIGxpbmtzIGFyZSBkaXNwbGF5ZWQuPG9sPjxsaT5JbiB0aGUgdGV4dCBlZGl0b3IsIHBvc2l0aW9uIHRoZSBjdXJzb3Igd2hlcmUgeW91IHdhbnQgdG8gaW5zZXJ0IHRoZSBsaW5rCi1hbmQgdGhlbiBjbGljayB0aGUgPHN0cm9uZz5BZGQgTGluazwvc3Ryb25nPiBidXR0b24gPGltZyBzcmM9ImFkZGxpbmtfY28uZ2lmIiBhbHQ9IiIgLz4gaW4gdGhlIHRvb2wgYmFyLiBUaGUgQWRkIExpbmsgZGlhbG9nIG9wZW5zLjwvbGk+Ci08bGk+Q2xpY2sgdGhlIDxzdHJvbmc+QnJvd3NlPC9zdHJvbmc+IGJ1dHRvbiB0byBsb2NhdGUgYW5kIHNlbGVjdCB0aGUgZWxlbWVudCB5b3Ugd2lzaAotdG8gY3JlYXRlIGEgbGluayB0by4gVGhlcmUgYXJlIHNldmVyYWwgb3B0aW9ucyBmb3IgY3JlYXRpbmcgbGlua3MgdG8gb3RoZXIKLWNvbnRlbnQgZWxlbWVudHMsIHdpdGggZWFjaCBvcHRpb24gb2ZmZXJpbmcgYSBkaWZmZXJlbnQgd2F5IGZvciBkaXNwbGF5aW5nCi10aGUgbGluaydzIG5hbWU6PHVsPjxsaT5NZXRob2QgZWxlbWVudDogdGhlIGxpbmsgZGlzcGxheXMgdGhlIGVsZW1lbnQgbmFtZS48L2xpPgotPGxpPk1ldGhvZCB3aXRoIHR5cGUgcHJlZml4OiB0aGUgbGluayBkaXNwbGF5cyB0aGUgZWxlbWVudCBuYW1lIGFuZCB0eXBlLjwvbGk+Ci08bGk+TWV0aG9kIGVsZW1lbnQgd2l0aCBjdXN0b20gdGV4dDogdGhlIGxpbmsgZGlzcGxheXMgdXNlciBkZWZpbmVkIHRleHQuCi1UbyBkZWZpbmUgdGhpcyB0ZXh0IG1hbmlwdWxhdGUgdGhlIHRleHQgaW4gYmV0d2VlbiB0aGUgJmx0O2EmZ3Q7Jmx0Oy9hJmx0OwotdGFncyBpbiB0aGUgVVJMIHRleHQgZmllbGQgb25lIHlvdSBoYXZlIHNlbGVjdGVkIGFuIGVsZW1lbnQgdXNpbmcgdGhlIDxzdHJvbmc+QnJvd3NlPC9zdHJvbmc+IGJ1dHRvbi48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+VG8gaW5zZXJ0IGEgaHlwZXJsaW5rIHRvIGFuIGV4dGVybmFsIFVSTCwgc2VsZWN0IFVSTCBmcm9tIHRoZSBUeXBlIGRyb3AKLWRvd24gbGlzdCwgdHlwZSB0aGUgVVJMIGRldGFpbHMgaW4gdGhlIFVSTCBmaWVsZCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi48L2xpPgotPGxpPlRvIGluc2VydCBhIGh5cGVybGluayB0byBhIGZpbGUsIGluIHRoZSBUeXBlIGRyb3AgZG93biBsaXN0LCBjbGljayA8c3Ryb25nPkZpbGU8L3N0cm9uZz4sCi1lbnRlciB0aGUgZmlsZSBuYW1lIG9yIGJyb3dzZSB0byBmaW5kIHRoZSBmaWxlLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LgotRWFjaCB0aW1lIHlvdSBhZGQgYSBsaW5rIHlvdSBjYW4gY2hvb3NlIHRvIGhhdmUgdGhlIHRhcmdldCBvcGVuIGluIHRoZSBzYW1lCi1icm93c2VyIHdpbmRvdyBvciBpbiBhIG5ldyB3aW5kb3cuPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InJpY2h0ZXh0ZWRpdG9yLmh0bWwjcmljaHRleHRlZGl0b3IiPlJpY2ggVGV4dCBFZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PjwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZGltZ19jby5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZGltZ19jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVjYmQ3MjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRpbWdfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRsaW5rX2NvLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkbGlua19jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQxYTM4NmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRsaW5rX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkb3JkbGlzdF9jby5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZG9yZGxpc3RfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NzFkNjc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkb3JkbGlzdF9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZHRhYmxlX2NvLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkdGFibGVfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNTM2ZGQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkdGFibGVfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGR1bm9yZGxpc3RfY28uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGR1bm9yZGxpc3RfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MDc0OWU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkdW5vcmRsaXN0X2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2M3MzY4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY2FwYWJpbGl0eXBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InJlcGxhY2UuaHRtbCNyZXBsYWNlcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHJvY2Vzcy5odG1sI3Byb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+QXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm48L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImFwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuIj48YSBuYW1lPSJhcHBseWFjYXBhYmlsaXR5cGF0dGVybiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+V2hlbiBkZXZlbG9waW5nIGEgcHJvY2VzcywgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBkZXZlbG9wIHRoZSBwcm9jZXNzCi1mcm9tIHNjcmF0Y2gsIGFkZGluZyBkZXNjcmlwdG9ycyBvbmUgYnkgb25lLiBZb3UgY2FuIHJldXNlIGV4aXN0aW5nIGNhcGFiaWxpdHkKLXBhdHRlcm5zIG9yIGV2ZW4gY2FwYWJpbGl0eSBwYXR0ZXJuIHBhcnRzIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncwotY29udGVudCB0byB0aGUgcGFydGljdWxhciBzaXR1YXRpb24gZm9yIHdoaWNoIGl0IGlzIGFwcGxpZWQuIEEgY2FwYWJpbGl0eQotcGF0dGVybiBtdXN0IGJlIGFwcGxpZWQgdG8gb25lIHNwZWNpZmljIGFjdGl2aXR5IGluIGEgcHJvY2Vzcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24KLXNlZSA8YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+LjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VGhlcmUgYXJlIHR3byB3YXlzIHRvIGFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuOiBDb3B5IGFuZCBFeHRlbmQuIDxwPjxzdHJvbmc+Q29weQotYSBjYXBhYmlsaXR5IHBhdHRlcm46PC9zdHJvbmc+PC9wPgotPGRpdiBjbGFzcz0icCI+SWYgYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgY29waWVkIGludG8gYSBwcm9jZXNzLAotbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgaW4gdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBhcmUgZGlzY29ubmVjdGVkIGZyb20gdGhlCi1vcmlnaW5hbC4gVGhlIGNhcGFiaWxpdHkgcGF0dGVybiBlbGVtZW50cyBjYW4gYmUgYWx0ZXJlZCwgZGVsZXRlZCBvciBjaGFuZ2VkCi1hcyB5b3Ugd2FudCBpbiB0aGUgcHJvY2VzcyBlZGl0b3Igd2l0aG91dCBhZmZlY3RpbmcgdGhlIG9yaWdpbmFsIG1ldGhvZCBjb250ZW50Ci1lbGVtZW50cy4gTWV0aG9kIGVsZW1lbnRzIGluIGEgY29waWVkIGNhcGFiaWxpdHkgcGF0dGVybiBhcHBlYXIgaW4gcmVndWxhcgotYmxhY2sgZm9udC4gVG8gY29weSBhIGNhcGFiaWxpdHkgcGF0dGVybjo8b2w+PGxpPkluIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+LAotc2VsZWN0IGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGl0cyBwYXJ0cyB0aGF0IHlvdSB3YW50IHRvIGNvcHkgaW50byBhbiBhY3Rpdml0eQotaW4gYSBwcm9jZXNzIGFuZCBkcmFnIHRoZSBwYXR0ZXJuIG9yIHBhcnRzIGludG8gdGhlIGFjdGl2aXR5IHRvIHdoaWNoIHlvdQotd2FudCBpdCB0byBhcHBseS4gVG8gc2VsZWN0IG11bHRpcGxlIGFjdGl2aXRpZXMgaW4gYSBjYXBhYmlsaXR5IHBhdHRlcm4sIHByZXNzCi10aGUgQ1RSTCBvciBTSElGVCBrZXlzIHdoaWxlIHlvdSBzZWxlY3QuIDwvbGk+Ci08bGk+SW4gdGhlIHBvcC11cCBib3ggdGhhdCBhcHBlYXJzLCBjbGljayA8c3Ryb25nPkNvcHk8L3N0cm9uZz4uIFRoZSBjYXBhYmlsaXR5IHBhdHRlcm4KLW5hbWUgaXMgZGlzcGxheWVkIGluIGJsYWNrIGFuZCBpcyBub3cgYXZhaWxhYmxlIGZvciB5b3UgdG8gZWRpdC48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+T3IsPG9sPjxsaT5JbiB0aGUgcHJvY2VzcyB2aWV3LCByaWdodCBjbGljayBhbiBhY3Rpdml0eSwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5BcHBseQotUGF0dGVybiAmZ3Q7IENvcHk8L3N0cm9uZz4uIFRoZSBTZWxlY3QgRGlhbG9nIEZvciBQcm9jZXNzZXMgd2luZG93IGFwcGVhcnMuPC9saT4KLTxsaT5EcmlsbCBkb3duIGludG8gdGhlIHByb2Nlc3MgdHJlZSB1bnRpbCB5b3UgbG9jYXRlIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4KLXlvdSB3YW50IHRvIGNvcHkuPC9saT4KLTxsaT5TZWxlY3QgdGhlIHBhdHRlcm4sIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRoZSBTZWxlY3QgRGlhbG9nIEZvciBQcm9jZXNzZXMKLXdpbmRvdyBjbG9zZXMgYW5kIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYXBwbGllZC48L2xpPgotPC9vbD4KLTwvZGl2PgotPHA+PHN0cm9uZz5FeHRlbmQgYSBjYXBhYmlsaXR5IHBhdHRlcm46PC9zdHJvbmc+PC9wPgotPGRpdiBjbGFzcz0icCI+SWYgYSBjYXBhYmlsaXR5IHBhdHRlcm4KLWlzIGV4dGVuZGVkIGludG8gYSBwcm9jZXNzLCBtZXRob2QgY29udGVudCBlbGVtZW50cyBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuCi1yZXRhaW4gYSBjb25uZWN0aW9uIHRvIHRoZSBvcmlnaW5hbC4gRXh0ZW5kZWQgY2FwYWJpbGl0eSBwYXR0ZXJuIGVsZW1lbnRzCi1jYW5ub3QgYmUgZGVsZXRlZCBvciBtb2RpZmllZCBhbmQgYXBwZWFyIGFzIHJlYWQtb25seSBpbiBhIGdyZWVuLWl0YWxpYyBmb250LgotVG8gZXh0ZW5kIGEgY2FwYWJpbGl0eSBwYXR0ZXJuOiA8b2w+PGxpPkluIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+LAotc2VsZWN0IGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGl0cyBwYXJ0cyB0aGF0IHlvdSB3YW50IHRvIGV4dGVuZCBpbnRvIGFuIGFjdGl2aXR5Ci1pbiBhIHByb2Nlc3MgYW5kIGRyYWcgdGhlIHBhdHRlcm4gb3IgcGFydHMgaW50byB0aGUgYWN0aXZpdHkgdG8gd2hpY2ggeW91Ci13YW50IGl0IHRvIGFwcGx5LiBUbyBzZWxlY3QgbXVsdGlwbGUgYWN0aXZpdGllcyBpbiBhIGNhcGFiaWxpdHkgcGF0dGVybiwgcHJlc3MKLXRoZSBDVFJMIG9yIFNISUZUIGtleXMgd2hpbGUgeW91IHNlbGVjdC48L2xpPgotPGxpPkluIHRoZSBwb3AtdXAgYm94IHRoYXQgYXBwZWFycywgY2xpY2sgPHN0cm9uZz5FeHRlbmQ8L3N0cm9uZz4uIFRoZSBjYXBhYmlsaXR5IHBhdHRlcm4KLW5hbWUgaXMgZGlzcGxheWVkIGluIGdyZWVuLCB3aGljaCBpbmRpY2F0ZXMgaXQgaXMgcGFydCBvZiBhIHByb2Nlc3MgZGVmaW5lZAotZWxzZXdoZXJlLjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJwIj5PciwgPG9sPjxsaT5JbiB0aGUgcHJvY2VzcyB2aWV3LCByaWdodCBjbGljayBhbiBhY3Rpdml0eSBhbmQgdGhlbiBjbGljayA8c3Ryb25nPkFwcGx5Ci1QYXR0ZXJuICZndDsgRXh0ZW5kPC9zdHJvbmc+LiBUaGUgU2VsZWN0IERpYWxvZyBGb3IgUHJvY2Vzc2VzIHdpbmRvdyBhcHBlYXJzLjwvbGk+Ci08bGk+RHJpbGwgZG93biBpbnRvIHRoZSBwcm9jZXNzIHRyZWUgdW50aWwgeW91IGxvY2F0ZSB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuCi15b3Ugd2FudCB0byBleHRlbmQuPC9saT4KLTxsaT5TZWxlY3QgdGhlIHBhdHRlcm4sIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRoZSBTZWxlY3QgRGlhbG9nIEZvciBQcm9jZXNzZXMKLXdpbmRvdyBjbG9zZXMgYW5kIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYXBwbGllZC48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+PGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IElmIHlvdSBkbyBub3Qgd2FudCBhIHNwZWNpZmljIGFjdGl2aXR5IG9yIHRhc2sgaW4gdGhlIGNhcGFiaWxpdHkKLXBhdHRlcm4gdG8gYmUgaW5jbHVkZWQgaW4geW91ciBwcm9jZXNzIHlvdSBjYW4gc3VwcHJlc3MgaXQuIFRoZSBhY3Rpdml0eSBvcgotdGFzayB3aWxsIG5vdCBhcHBlYXIgaW4gdGhlIHB1Ymxpc2hlZCBwcm9jZXNzIG9yIGJlIGV4cG9ydGVkIHRvIGEgcHJvamVjdAotcGxhbm5pbmcgdG9vbC4gVG8gc3VwcHJlc3MgYSBwcm9jZXNzIGVsZW1lbnQsIHJpZ2h0IGNsaWNrIHRoZSBlbGVtZW50IGFuZAotdGhlbiBzZWxlY3QgPHN0cm9uZz5TdXBwcmVzczwvc3Ryb25nPi4gVGhlIGVsZW1lbnQgYXBwZWFycyBncmF5ZWQgb3V0IGluIHRoZSBwcm9jZXNzCi12aWV3LjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxkaXYgY2xhc3M9InAiPlRvIGFkZCBlbGVtZW50cyB0byBhbiBhY3Rpdml0eSBpbiBhbiBleHRlbmRlZCBjYXBhYmlsaXR5IHBhdHRlcm46PG9sPjxsaT5GaW5kIHRoZSBhY3Rpdml0eSdzIHBhcmVudCBlbGVtZW50LiBJZiB0aGlzIGVsZW1lbnQgaXMgYSBub3QgYSBsb2NhbCBlbGVtZW50Ci10aGF0IGFwcGVhcnMgaW4gZ3JlZW4gaXRhbGljIGZvbnQsIHRoZW4geW91IG5lZWQgY3JlYXRlIGEgY29udHJpYnV0aW9uIHRvCi10aGlzIHBhcmVudCBmaXJzdC4gIElmIHRoZSBwYXJlbnQncyBwYXJlbnQgaXMgbm90IGxvY2FsLCBhbHNvIGFwcGVhcmluZyBpbgotZ3JlZW4gaXRhbGljIGZvbnQsIHRoZW4geW91IG5lZWQgdG8gY3JlYXRlIGEgY29udHJpYnV0aW9uIHRvIHRoZSBwYXJlbnQgZmlyc3QsCi1hbmQgc28gb24uIDwvbGk+Ci08bGk+VG8gY3JlYXRlIGEgY29udHJpYnV0aW9uIHRvIGFuIGV4dGVuZGVkIGFjdGl2aXR5LCByaWdodCBjbGljayB0aGUgZXh0ZW5kZWQKLWFjdGl2aXR5IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+Q29udHJpYnV0ZTwvc3Ryb25nPi4gVGhlIGFjdGl2aXR5IGJlY29tZXMgbG9jYWwgYW5kCi1hcHBlYXJzIGluIGEgc3RhbmRhcmQgYmxhY2sgZm9udC4gRG8gdGhpcyB3aXRoIGFsbCBwYXJlbnQgZWxlbWVudHMsIHRvcC1kb3duLAotdW50aWwgeW91IHJlYWNoIHRoZSBhY3Rpdml0eSB0byB3aGljaCB5b3Ugd2FudCB0byBhcHBseSB0aGUgZWxlbWVudC4gT25jZQoteW91IGNsaWNrIENvbnRyaWJ1dGUsIHRoZSBhY3Rpdml0eSBiZWNvbWVzIGxvY2FsIGFuZCBpcyBwcmVzZW50ZWQgaW4gc3RhbmRhcmQKLWJsYWNrIGZvbnQuPC9saT4KLTwvb2w+Ci1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0iY29udHJpYnV0ZXMuaHRtbCNjb250cmlidXRlcyI+Q29udHJpYnV0ZXM8L2E+LjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InJlcGxhY2UuaHRtbCNyZXBsYWNlcyI+UmVwbGFjZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InByb2Nlc3MuaHRtbCNwcm9jZXNzIj5Qcm9jZXNzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4iPkNyZWF0ZSBhIFJldXNhYmxlIENhcGFiaWxpdHkgUGF0dGVybjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FydGlmYWN0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FydGlmYWN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmZTVmYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hcnRpZmFjdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQXJ0aWZhY3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sI2NyZWF0ZWF3b3JrcHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGVsaXZlcmFibGUuaHRtbCNkZWxpdmVyYWJsZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ib3V0Y29tZS5odG1sI291dGNvbWUiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iYXJ0aWZhY3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+QXJ0aWZhY3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImFydGlmYWN0Ij48YSBuYW1lPSJhcnRpZmFjdCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFydGlmYWN0PC9oMT4KLTxkaXY+PHA+QW4gYXJ0aWZhY3QgaXMgYSB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdGhhdCBpcyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkCi1ieSB0YXNrcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsCi1hcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4gPC9wPgotPHA+Um9sZXMgdXNlIGFydGlmYWN0cyB0byBwZXJmb3JtIHRhc2tzIGFuZCB0byBwcm9kdWNlIG90aGVyIGFydGlmYWN0cy4gRWFjaAotYXJ0aWZhY3QgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIHJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5Ci10byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uCi1wcm9kdWNlZCBpbiBhIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25seQotb25lIHJvbGUgaXMgcmVzcG9uc2libGUgZm9yIGFuIGFydGlmYWN0LCBvdGhlciByb2xlcyBtYXkgdXNlIHRoZSBhcnRpZmFjdHMuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJkZWxpdmVyYWJsZS5odG1sI2RlbGl2ZXJhYmxlIj5EZWxpdmVyYWJsZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0ib3V0Y29tZS5odG1sI291dGNvbWUiPk91dGNvbWU8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0Ij5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYzY0YTY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkF1dGhvcmluZyBQZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImF1dGhvcmluZ3BlcnNwZWN0aXZlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iYXV0aG9yaW5ncGVyc3BlY3RpdmUiPjxhIG5hbWU9ImF1dGhvcmluZ3BlcnNwZWN0aXZlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9oMT4KLTxkaXY+PHA+VGhlIEF1dGhvcmluZyBQZXJzcGVjdGl2ZSBwcm92aWRlcyB2aWV3cyBhbmQgZnVuY3Rpb25zIHRvIG5hdmlnYXRlIGFuZAotYXV0aG9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuIFlvdSBtdXN0IGJlIGluIHRoZSBBdXRob3JpbmcgUGVyc3BlY3RpdmUKLXRvIGNyZWF0ZSBvciBtb2RpZnkgYW55IGVsZW1lbnQgdHlwZXMuPC9wPgotPHA+Q2xpY2sgdGhlIE9wZW4gUGVyc3BlY3RpdmUgYnV0dG9uIDxpbWcgc3JjPSJvcGVucGVyc3AuSlBHIiBhbHQ9IiIgLz4gYW5kIHNlbGVjdCBBdXRob3JpbmcgdG8gb3BlbiB0aGUgQXV0aG9yaW5nIFBlcnNwZWN0aXZlLiA8L3A+Ci08cD48aW1nIHNyYz0iQXV0aG9yUGVyc3AuSlBHIiBhbHQ9IiIgLz48L3A+Ci08cD5UaGUgQXV0aG9yaW5nIFBlcnNwZWN0aXZlIGNvbnRhaW5zIHR3byBWaWV3czogdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4gYW5kIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+LiBEb3VibGUgY2xpY2sgYW55IGVsZW1lbnQgaW4gdGhlCi1MaWJyYXJ5IFZpZXcgb3IgQ29uZmlndXJhdGlvbiBWaWV3IHRvIG9wZW4gdGhlIEVkaXRvciB3aW5kb3cgb24gdGhlIHJpZ2h0LgotVGhlIEVkaXRvciB3aW5kb3cgY29udGFpbnMgc2V2ZXJhbCB0YWJzIHRocm91Z2ggd2hpY2ggeW91IGNhbiBlZGl0IGluZm9ybWF0aW9uCi1hYm91dCB0aGUgZWxlbWVudCB5b3UgaGF2ZSBzZWxlY3RlZC48L3A+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPGRpdiBjbGFzcz0ibmV4dGxpbmsiPjxzdHJvbmc+TmV4dCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiB0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6Ij5Ub29sIEludGVyZmFjZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2JvbGQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9ib2xkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjBjNDY4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2JvbGQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9icm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9icm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzM2NjMDE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkJyb3dzZSBhbmQgUHJldmlldyBNZXRob2QgQ29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+QnJvd3NlIGFuZCBQcmV2aWV3IE1ldGhvZCBDb250ZW50PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJicm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudCI+PGEgbmFtZT0iYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Ccm93c2UgYW5kIFByZXZpZXcgTWV0aG9kIENvbnRlbnQ8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj5Zb3UgY2FuIGJyb3dzZSBtZXRob2QgY29udGVudCBpbiBib3RoIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+IGFuZCA8YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT4uIFdoaWxlIGF1dGhvcmluZyBtZXRob2QgY29udGVudCwgeW91IGNhbiBzZWUgYSBwcmV2aWV3Ci1vZiB0aGUgcHVibGlzaGVkIHBhZ2UgZm9yIHRoZSBjb250ZW50IHlvdSBhcmUgZWRpdGluZyBieSBzZWxlY3RpbmcgdGhlIDxzdHJvbmc+UHJldmlldzwvc3Ryb25nPiB0YWIKLWF0IHRoZSBib3R0b20gb2YgdGhlIGNvbnRlbnQgZWRpdG9yLiBDbGljayBhbnkgbGluayBpbiB0aGUgZGlzcGxheWVkIHBhZ2UKLXRvIGdvIHRvIHRoYXQgcGFnZS4gVXNlIHRoZSBidXR0b25zIGluIHRoZSBlZGl0b3IgdG9vbGJhciB0byBwZXJmb3JtIGZhbWlsaWFyCi1icm93c2VyIGFjdGlvbnMgc3VjaCBhcyBiYWNrIG9yIHJlZnJlc2guIFdoaWxlIGJyb3dzaW5nIG1ldGhvZCBjb250ZW50IGluCi10aGUgYnJvd3NpbmcgcGVyc3BlY3RpdmUgeW91IGNhbiBzZWUgYSBwcmV2aWV3IG9mIGFueSBtZXRob2QgYW5kIHByb2Nlc3MgY29udGVudAotaW4gYSBtZXRob2QgY29uZmlndXJhdGlvbiBhcyBpdCBhcHBlYXJzIGluIGEgcHVibGlzaGVkIFdlYiBzaXRlLiA8L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIGJyb3dzZSBhbmQgcHJldmlldyA8YSBocmVmPSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj5NZXRob2QgQ29udGVudDwvYT4gaW4gdGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT46PC9wPgotPC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgT3BlbiBQZXJzcGVjdGl2ZSBidXR0b24gPGltZyBzcmM9Im9wZW5wZXJzcC5KUEciIGFsdD0iIiAvPiBhbmQgc2VsZWN0IDxzdHJvbmc+QXV0aG9yaW5nPC9zdHJvbmc+LiBUaGUgQXV0aG9yaW5nIHBlcnNwZWN0aXZlCi1vcGVucyB3aXRoIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+IGFuZCA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+IG9uCi10aGUgbGVmdCBhbmQgdGhlIGNvbnRlbnQgdmlldyBvbiB0aGUgcmlnaHQuIElmIGEgbWV0aG9kIGVsZW1lbnQgaXMgc2VsZWN0ZWQsCi10aGUgYXBwcm9wcmlhdGUgZWRpdG9yIGlzIG9wZW4gb24gdGhlIHJpZ2h0Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5FeHBsb3JlIHRoZSBjb250ZW50cyBpbiB0aGUgYm90aCB0aGUgTGlicmFyeSBWaWV3IGFuZCBDb25maWd1cmF0aW9uCi1WaWV3IGJ5IGV4cGFuZGluZyB0aGUgZGlmZmVyZW50IGNvbnRlbnQgcGFja2FnZXMgYW5kIG1ldGhvZCBwbHVnLWlucyBkb3duCi10byB0aGVpciBtZXRob2QgZWxlbWVudHMuIERvdWJsZSBjbGljayBhbiBlbGVtZW50IHRvIG9wZW4gaXQgaW4gdGhlIGVkaXRvci48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+UHJldmlldzwvc3Ryb25nPiB0YWIgYXQgdGhlIGJvdHRvbSBvZiB0aGUgY29udGVudCBlZGl0b3IKLXRvIHByZXZpZXcgdGhlIGNvbnRlbnQgb2YgYW55IHNlbGVjdGVkIGVsZW1lbnQuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVGhlIHByZXZpZXcKLXBhZ2UgaW4gdGhlIGNvbnRlbnQgZWRpdG9yIGRvZXMgbm90IHJlc29sdmUgY29udGVudCB2YXJpYWJpbGl0eSByZWxhdGlvbnNoaXBzLgotSWYgeW91IGFyZSBleHRlbmRpbmcsIGNvbnRyaWJ1dGluZyB0bywgb3IgcmVwbGFjaW5nIGEgYmFzZSBjb250ZW50IGl0ZW0sIHlvdQotY2FuIG9ubHkgc2VlIHRoZSByZXN1bHQgb2YgdGhpcyBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IGluIHRoZSBCcm93c2luZwotUGVyc3BlY3RpdmUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5Ij5WYXJpYWJpbGl0eTwvYT4uPC9kaXY+Ci08cD48L3A+Ci08L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIGJyb3dzZSBhbmQgcHJldmlldzxhIGhyZWY9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPk1ldGhvZCBDb250ZW50PC9hPiBpbiB0aGUgPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+OjwvcD4KLTxvbD48bGk+Q2xpY2sgdGhlIE9wZW4gUGVyc3BlY3RpdmUgYnV0dG9uIDxpbWcgc3JjPSJvcGVucGVyc3AuSlBHIiBhbHQ9IiIgLz4gYW5kIHNlbGVjdCA8c3Ryb25nPkJyb3dzaW5nPC9zdHJvbmc+LiBUaGUgPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+IG9wZW5zIHdpdGggdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4gb24gdGhlIGxlZnQgYW5kIHRoZSBDb250ZW50IFZpZXcgb24gdGhlIHJpZ2h0LjxwPjwvcD4KLTwvbGk+Ci08bGk+U2VsZWN0IGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgY29uZmlndXJhdGlvbiBkcm9wLWRvd24gbGlzdCBpbgotdGhlIHRvb2wgYmFyLiBUaGUgY29udGVudCBvZiB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gYXBwZWFycyBpbiB0aGUgY29udGVudAotdmlldywgYXMgaXQgd2lsbCBhcHBlYXIgaW4gYSBwdWJsaXNoZWQgV2ViIHNpdGUuPHA+PC9wPgotPC9saT4KLTxsaT5FeHBsb3JlIGFuZCBwcmV2aWV3IHRoZSBjb250ZW50IGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXcgYnkgZXhwYW5kaW5nCi10aGUgY2F0ZWdvcmllcyBhbmQgb3RoZXIgZm9sZGVycyBkb3duIHRvIG1ldGhvZCBlbGVtZW50cy4gQ2xpY2sgYSBtZXRob2QgZWxlbWVudAotdG8gb3BlbiBpdCBpbiB0aGUgY29udGVudCB2aWV3LjwvbGk+Ci08L29sPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiI+VG9vbCBJbnRlcmZhY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9icm93c2VwZXJzcC5KUEcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Jyb3dzZXBlcnNwLkpQRwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWY2OTFmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Jyb3dzZXBlcnNwLkpQRworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9icm93c2luZ3BlcnNwZWN0aXZlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2MWZlNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9icm93c2luZ3BlcnNwZWN0aXZlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJCcm93c2luZyBQZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJicm93aW5ncGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImJyb3dpbmdwZXJzcGVjdGl2ZSI+PGEgbmFtZT0iYnJvd2luZ3BlcnNwZWN0aXZlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2gxPgotPGRpdj48cD5UaGUgQnJvd3NpbmcgUGVyc3BlY3RpdmUgYWxsb3dzIHlvdSB0byBwcmV2aWV3IGFuZCBuYXZpZ2F0ZSB0aHJvdWdoIGEgTWV0aG9kCi1Db25maWd1cmF0aW9uIHdpdGhvdXQgbWFraW5nIGFueSBjaGFuZ2VzLjwvcD4KLTxwPkNsaWNrIHRoZSBPcGVuIFBlcnNwZWN0aXZlIGJ1dHRvbiA8aW1nIHNyYz0ib3BlbnBlcnNwLkpQRyIgYWx0PSIiIC8+IGFuZCBzZWxlY3QgPHN0cm9uZz5Ccm93c2luZzwvc3Ryb25nPiB0byBvcGVuIHRoZSBCcm93c2luZyBQZXJzcGVjdGl2ZS48L3A+Ci08cD48aW1nIHNyYz0iYnJvd3NlcGVyc3AuSlBHIiBhbHQ9IiIgLz48L3A+Ci08cD5UaGUgQnJvd3NpbmcgcGVyc3BlY3RpdmUgY29udGFpbnMgdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4sIHdoaWNoIHNob3dzIHRoZSBjb250ZW50IGluIHRoZSBjdXJyZW50bHkKLXNlbGVjdGVkIGNvbmZpZ3VyYXRpb24uIENsaWNrIGFueSBlbGVtZW50IGluIHRoZSBDb25maWd1cmF0aW9uCi1WaWV3IHRvIHByZXZpZXcgdGhlIGVsZW1lbnQgaW4gdGhlIENvbnRlbnQgVmlldyBhcyBpdCB3aWxsIGFwcGVhciBpbiBhIHB1Ymxpc2hlZAotV2ViIHNpdGUuIFRoZSBDb250ZW50IFZpZXcgcHJvdmlkZXMgYnJvd3Nlci1saWtlIG5hdmlnYXRpb24gZmVhdHVyZXMuIENsaWNrCi1hbnkgbGluayBpbiB0aGUgZGlzcGxheWVkIHBhZ2UgdG8gZ28gdG8gdGhhdCBwYWdlLiBVc2UgdGhlIGJ1dHRvbnMgaW4gdGhlCi1Db250ZW50IFZpZXcgdG9vbGJhciB0byBwZXJmb3JtIGZhbWlsaWFyIGJyb3dzZXIgYWN0aW9ucyBzdWNoIGFzIGJhY2sgb3IgcmVmcmVzaC48L3A+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPGRpdiBjbGFzcz0icHJldmlvdXNsaW5rIj48c3Ryb25nPlByZXZpb3VzIHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+PC9kaXY+Ci08ZGl2IGNsYXNzPSJuZXh0bGluayI+PHN0cm9uZz5OZXh0IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sIj5Db25maWd1cmF0aW9uIFZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCN1c2VyaW50ZXJmYWNlb3ZlcnZpZXciIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY2FwYWJpbGl0eXBhdHRlcm4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWZlNTZhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NhcGFiaWxpdHlwYXR0ZXJuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDYXBhYmlsaXR5IFBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImFwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImFjdGl2aXR5Lmh0bWwjYWN0aXZpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRpc2NpcGxpbmUuaHRtbCNkaXNjaXBsaW5lIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkZWxpdmVyeXByb2Nlc3MuaHRtbCNkZWxpdmVyeXByb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY2FwYWJpbGl0eXBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q2FwYWJpbGl0eSBQYXR0ZXJuPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjYXBhYmlsaXR5cGF0dGVybiI+PGEgbmFtZT0iY2FwYWJpbGl0eXBhdHRlcm4iPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DYXBhYmlsaXR5IFBhdHRlcm48L2gxPgotPGRpdj48cD5BIENhcGFiaWxpdHkgcGF0dGVybiBpcyBhIHNwZWNpYWwgcHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIKLW9mIGFjdGl2aXRpZXMgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuIENhcGFiaWxpdHkgcGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUKLXByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBkaXNjaXBsaW5lIGFuZCBjYW4KLWJlIGRpcmVjdGx5IHVzZWQgYnkgYSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gQ2FwYWJpbGl0eSBwYXR0ZXJucwotYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgcHJvY2Vzc2VzIG9yIGxhcmdlcgotY2FwYWJpbGl0eSBwYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcwotdGhleSBleHByZXNzLjwvcD4KLTxwPkV4YW1wbGVzIG9mIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGNvdWxkIGJlICJ1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMKLW1hbmFnZW1lbnQiLCAidXNlIGNhc2UgYW5hbHlzaXMiLCBvciAidW5pdCB0ZXN0aW5nIi4gVHlwaWNhbGx5LCBidXQgbm90IG5lY2Vzc2FyaWx5LAotY2FwYWJpbGl0eSBwYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24KLW9mIHJldXNhYmxlIGNvbXBsZXggYWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgcm9sZXMgd2hpY2ggcGVyZm9ybSB0YXNrcwotd2l0aGluIHRoZXNlIGFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQKLXByb2R1Y2VkLiBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljCi1waGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gSW4KLW90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZQotaW4gYSBkZWxpdmVyeSBwcm9jZXNzLiB0aGVyZWJ5IGVuYWJsaW5nIGl0cyBhY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkCi10byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBkZWxpdmVyeSBwcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nCi1hcHBsaWVkLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImFjdGl2aXR5Lmh0bWwjYWN0aXZpdHkiPkFjdGl2aXR5PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJkaXNjaXBsaW5lLmh0bWwjZGlzY2lwbGluZSI+RGlzY2lwbGluZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZGVsaXZlcnlwcm9jZXNzLmh0bWwjZGVsaXZlcnlwcm9jZXNzIj5EZWxpdmVyeSBQcm9jZXNzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImFwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4iPkFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY2hlY2tsaXN0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NoZWNrbGlzdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDc4YWRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY2hlY2tsaXN0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDaGVja2xpc3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY2hlY2tsaXN0IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNoZWNrbGlzdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2hlY2tsaXN0Ij48YSBuYW1lPSJjaGVja2xpc3QiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DaGVja2xpc3Q8L2gxPgotPGRpdj48cD5BIENoZWNrbGlzdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mCi1pdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmlmaWVkLiBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluCi1yZXZpZXdzIHN1Y2ggYXMgYSB3YWxrLXRocm91Z2hzIG9yIGluc3BlY3Rpb25zLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY2xlYXJjb250ZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY2xlYXJjb250ZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWEzNWY0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NsZWFyY29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbGxhcHNlZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbGxhcHNlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRlODc3NTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb2xsYXBzZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25jZXB0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmNlcHQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjE5ODJhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmNlcHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Db25jZXB0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjb25jZXB0Ij48YSBuYW1lPSJjb25jZXB0Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q29uY2VwdDwvaDE+Ci08ZGl2PjxwPkEgQ29uY2VwdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZAotd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcwotbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIGd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldmVyYWwgd29yayBwcm9kdWN0IGFuZC9vcgotdGFza3Mgb3IgYWN0aXZpdGllcy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25mLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGU1ZTZiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25maWd1cmF0aW9uc2FuZHB1Ymxpc2hpbmdvdmVydmlldy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25maWd1cmF0aW9uc2FuZHB1Ymxpc2hpbmdvdmVydmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZmUxMWQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZmlndXJhdGlvbnNhbmRwdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNvbmZpZ3VyYXRpb25zIGFuZCBQdWJsaXNoaW5nIE92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlB1dCB5b3VyIHNob3J0IGRlc2NyaXB0aW9uIGhlcmU7IHVzZWQgZm9yIGZpcnN0IHBhcmFncmFwaCBhbmQgYWJzdHJhY3QuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlB1dCB5b3VyIHNob3J0IGRlc2NyaXB0aW9uIGhlcmU7IHVzZWQgZm9yIGZpcnN0IHBhcmFncmFwaCBhbmQgYWJzdHJhY3QuIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNvbmZpZ3VyYXRpb25zYW5kcHVibGlzaGluZ292ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNvbmZpZ3VyYXRpb25zIGFuZCBQdWJsaXNoaW5nIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjb25maWd1cmF0aW9uc2FuZHB1Ymxpc2hpbmdvdmVydmlldyI+Ci08aDM+TWV0aG9kIENvbmZpZ3VyYXRpb25zIE92ZXJ2aWV3PC9oMz4KLTxwPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgc2hpcHMgd2l0aCBhIGxvdCBvZiBjb250ZW50IG91dCBvZiB0aGUgYm94LiBJdCBpbmNsdWRlcwotICB0aGUgT3BlblVQIGZyYW1ld29yayBhbmQgdmFyaW91cyBwbHVnLWlucyBleHRlbmRpbmcKLSAgT3BlblVQL0Jhc2ljIHdpdGggZG9tYWluLXNwZWNpZmljIGFkZGl0aW9ucy4gTm8gb3JnYW5pemF0aW9uIG9yIHByb2plY3QgcmVxdWlyZXMgYWxsIG9mIHRoaXMKLSAgZG9jdW1lbnRhdGlvbiBhbGwgYXQgb25jZSwgYnV0IHdvdWxkIHdvcmsgd2l0aCBhIHNlbGVjdGlvbiBvZiBzcGVjaWZpYyBzdWJzZXRzLjwvcD4KLTxwPiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIChFUEYgQ29tcG9zZXIpIG1hbmFnZXMgZm9yIHRoYXQgcHVycG9zZSBzby1jYWxsZWQgbWV0aG9kCi0gIGNvbmZpZ3VyYXRpb25zLCB3aGljaCBhbGxvdyB5b3UgdG8gc3BlY2lmeSB3b3JraW5nIHNldHMgb2YgY29udGVudCBhbmQgcHJvY2Vzc2VzCi0gIGZvciBhIHNwZWNpZmljIGNvbnRleHQsIHN1Y2ggYXMgYSBzcGVjaWZpYyB2YXJpYW50IG9mIHRoZSBPcGVuVVAgZnJhbWV3b3JrIHRoYXQKLSAgeW91IHdhbnQgdG8gcHVibGlzaCBhbmQgZGVwbG95IGZvciBhIGdpdmVuIHNvZnR3YXJlIHByb2plY3Qgb3IgYXMgYSBmb3VuZGF0aW9uCi0gIGZvciBhIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbi4gQWxsIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBFUEYgQ29tcG9zZXIgYXJlIG9yZ2FuaXplZAotICBpbiBtZXRob2QgcGx1Zy1pbnMsIHdoaWNoIGFyZSBvcmdhbml6ZWQgaW50byBtZXRob2QgcGFja2FnZXMuIEEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLSAgaXMgc2ltcGx5IGEgc2VsZWN0aW9uIG9mIHRoZSBtZXRob2QgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzLjwvcD4KLTxwPjxpbWcgc3JjPSJjb25mLmdpZiIgd2lkdGg9IjY2NSI+PC9wPgotPHA+WW91IGNyZWF0ZSBhbmQgc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gdXNpbmcgdGhlIGNvbmZpZ3VyYXRpb24gZWRpdG9yIGRlcGljdGVkCi0gIGluIHRoZSBmaWd1cmUgYWJvdmUuIFlvdSBjb3VsZCBzdGFydCBjcmVhdGluZyB5b3VyIG93biBtZXRob2QgY29uZmlndXJhdGlvbgotICBieSBjb3B5aW5nIG9uZSBvZiB0aGUgY29uZmlndXJhdGlvbnMgdGhhdCBzaGlwIHdpdGggRVBGIENvbXBvc2VyIGFuZCBtb2RpZnkgaXQgdG8gZml0Ci0gIHlvdXIgc3BlY2lmaWMgbmVlZHMuIFlvdSBjYW4gYWRkIG9yIHJlbW92ZSB3aG9sZSBtZXRob2QgcGx1Zy1pbnMgYXMgd2VsbCBhcwotICBtYWtlIHNlbGVjdGlvbiB3aXRoIGVhY2ggcGx1Zy1pbiBieSBjaGVja2luZyBvciB1bi1jaGVja2luZyBwYWNrYWdlcy4gPC9wPgotPHA+IFlvdSBjYW4gdXNlIHRoZSByZXN1bHRpbmcgY29uZmlndXJhdGlvbiBhcyB5b3VyIHdvcmtpbmcgc2V0IGZvciB5b3VyIEVQRiBDb21wb3NlcgotICB3b3JrLiBUaGUgYWN0dWFsIGNvbnRlbnQgb2YgdGhlIGNvbmZpZ3VyYXRpb24sIGkuZS4gdGhlIGluY2x1ZGVkIG1ldGhvZCBjb250ZW50Ci0gIGFuZCBwcm9jZXNzIGVsZW1lbnRzIGFyZSBhbHdheXMgYWNjZXNzaWJsZSBpbiB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LiBVc2UgdGhlCi0gIGNvbWJvIGJveCBpbiB0aGUgdG9vbGJhciB0byBzZWxlY3QgdGhlIGN1cnJlbnRseSB1c2VkIG1ldGhvZCBjb25maWd1cmF0aW9uLjwvcD4KLTxoMz5QdWJsaXNoaW5nIE92ZXJ2aWV3PC9oMz4KLTxwPk1ldGhvZCBjb25maWd1cmF0aW9ucyBhcmUgdGhlIGJhc2lzIGZvciBwdWJsaXNoaW5nIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuCi0gIEEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gaXMgYW4gaHRtbCBXZWIgc2l0ZSB0aGF0IHByZXNlbnRzIGFsbCB0aGUgbWV0aG9kCi0gIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBvZiB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gYSBuYXZpZ2FibGUgYW5kIHNlYXJjaGFibGUKLSAgd2F5LiBJdCB1c2VzIHRoZSByZWxhdGlvbnNoaXBzIGVzdGFibGlzaGVkIGR1cmluZyBtZXRob2QgY29udGVudCBhbmQgcHJvY2VzcwotICBhdXRob3JpbmcgdG8gZ2VuZXJhdGUgaHlwZXJsaW5rcyBiZXR3ZWVuIGVsZW1lbnRzIGFzIHdlbGwgYXMgcHJvdmlkZXMgdHJlZQotICBicm93c2VycyBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3IGFuZCB1c2VyLWRlZmluZWQgY2F0ZWdvcml6YXRpb25zIG9mCi0gIHRoZSBjb250ZW50LiBUaGUgZmlndXJlIGJlbG93IHNob3dzIGFuIGV4YW1wbGUgb2YgdGhlIHB1Ymxpc2hlZCAnQ2xhc3NpYyBSVVAnCi0gIG1ldGhvZCBjb25maWd1cmF0aW9uLjwvcD4KLTxwPjxpbWcgc3JjPSJwdWIuZ2lmIiB3aWR0aD0iNTUwIj48L3A+Ci08cD5Gb3IgcHVibGlzaGluZyBzaW1wbHkgY3JlYXRlIGFuZCBzZWxlY3QgYSBjb25maWd1cmF0aW9uLiBUaGUgcHVibGljYXRpb24gd2l6YXJkCi0gIHdpbGwgZG8gdGhlIHJlc3QgZm9yIHlvdSBhbmQgb25seSBwdWJsaXNoIGNvbnRlbnQgdGhhdCBpcyBwYXJ0IG9mIHRoZSBtZXRob2QKLSAgY29uZmlndXJhdGlvbi4gSXQgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgYWRvcHQgY29udGVudCB0byB0aGUgY29uZmlndXJhdGlvbgotICBzdWNoIGFzIHJlbW92aW5nCi0gIHJlZmVyZW5jZXMgb2YgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgdG8gZWxlbWVudHMgb3V0c2lkZSBvZiB0aGUgY29uZmlndXJhdGlvbgotICBvciByZW1vdmluZyBhY3Rpdml0aWVzIGZyb20geW91ciBwcm9jZXNzZXMgdGhhdCBvbmx5IGNvbnRhaW4gd29yayBkZWZpbmVkIG91dHNpZGUKLSAgb2YgdGhlIGNvbmZpZ3VyYXRpb24gc2V0LiBIZW5jZSwgcHVibGlzaGluZyB3aWxsIG9ubHkgaW5jbHVkZSB0aGUgY29udGVudCB0aGF0Ci0gIHlvdSByZWFsbHkgbmVlZC4gWW91IGNhbiBhbHdheXMgcHJldmlldyBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIHVzaW5nIEVQRiBDb21wb3NlcidzCi1icm93c2luZyBwZXJzcGVjdGl2ZS48L3A+Ci08cD4mbmJzcDs8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmZpZ3VyYXRpb252aWV3Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmZpZ3VyYXRpb252aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyNjE5MmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25maWd1cmF0aW9udmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ29uZmlndXJhdGlvbiBWaWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCN1c2VyaW50ZXJmYWNlb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImxpYnJhcnl2aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY29uZmlndXJhdGlvbnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q29uZmlndXJhdGlvbiBWaWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjb25maWd1cmF0aW9udmlldyI+PGEgbmFtZT0iY29uZmlndXJhdGlvbnZpZXciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Db25maWd1cmF0aW9uIFZpZXc8L2gxPgotPGRpdj48cD5UaGUgQ29uZmlndXJhdGlvbiB2aWV3IHNob3dzIHRoZSBjb250ZW50IGVsZW1lbnRzIGluIGEgbGlicmFyeSBmaWx0ZXJlZAotYnkgYSBjb25maWd1cmF0aW9uLiA8L3A+Ci08cD5BIGNvbmZpZ3VyYXRpb24gaXMgYSBzdWJzZXQgb2YgdGhlIDxhIGhyZWY9InN0YW5kYXJkbWV0aG9kbGlicmFyeW92ZXJ2aWV3Lmh0bWwjc3RhbmRhcmRtZXRob2RsaWJyYXJ5b3ZlcnZpZXciPm1ldGhvZCBsaWJyYXJ5PC9hPiBjb250ZW50LiBPbmNlIGEgY29uZmlndXJhdGlvbiBpcyBzZWxlY3RlZAotaW4gdGhlIENvbmZpZ3VyYXRpb24gc2VsZWN0aW9uIGJveCwgdGhlIENvbmZpZ3VyYXRpb24gdmlldyBpcyByZWZyZXNoZWQgd2l0aAotdGhlIGNvbnRlbnQgZnJvbSB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbi4gVGhlIGNvbnRlbnQgaW4gdGhlIENvbmZpZ3VyYXRpb24KLXZpZXcgaXMgYWx3YXlzIHByZXNlbnRlZCBpbiB0aGUgc2FtZSB3YXkgaW4gc3RhbmRhcmQgY2F0ZWdvcmllcywgcHJvY2Vzc2VzLAotY3VzdG9tIGNhdGVnb3JpZXMsIGFuZCBndWlkYW5jZS4gVGhlIENvbmZpZ3VyYXRpb24gdmlldyBkb2VzIG5vdCBzaG93IGFueQotcGh5c2ljYWwgZm9sZGVycy4gRm9sZGVycyBhcmUgb25seSBzaG93biBpbiB0aGUgTGlicmFyeSB2aWV3LjwvcD4KLTxwPjwvcD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiI+VG9vbCBJbnRlcmZhY2U8L2E+PC9kaXY+Ci08ZGl2IGNsYXNzPSJwcmV2aW91c2xpbmsiPjxzdHJvbmc+UHJldmlvdXMgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+PC9kaXY+Ci08ZGl2IGNsYXNzPSJuZXh0bGluayI+PHN0cm9uZz5OZXh0IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sIj5MaWJyYXJ5IFZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiB0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6Ij5Ub29sIEludGVyZmFjZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbnRyaWJ1dGVzLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbnRyaWJ1dGVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjNDFiYjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb250cmlidXRlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ29udHJpYnV0ZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImV4dGVuZHMuaHRtbCNleHRlbmRzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJyZXBsYWNlLmh0bWwjcmVwbGFjZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY29udHJpYnV0ZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q29udHJpYnV0ZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNvbnRyaWJ1dGVzIj48YSBuYW1lPSJjb250cmlidXRlcyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNvbnRyaWJ1dGVzPC9oMT4KLTxkaXY+PHA+QSBjb250cmlidXRpbmcgZWxlbWVudCBhZGRzIHRvIHRoZSBiYXNlIGVsZW1lbnQuIENvbnRyaWJ1dGVzIHByb3ZpZGVzIGEKLXdheSBmb3IgZWxlbWVudHMgdG8gY29udHJpYnV0ZSB0aGVpciBwcm9wZXJ0aWVzIGludG8gdGhlaXIgYmFzZSBlbGVtZW50IHdpdGhvdXQKLWRpcmVjdGx5IGNoYW5naW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcywgc3VjaCBhcyBpbiBhbiBhZGRpdGl2ZSBmYXNoaW9uLgotVGhlIGVmZmVjdCwgYWZ0ZXIgY29udHJpYnV0aW9uLCBpcyB0aGF0IHRoZSBiYXNlIGVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkCi13aXRoIGFuIGVsZW1lbnQgdGhhdCBjb21iaW5lcyB0aGUgYXR0cmlidXRlcyBhbmQgYXNzb2NpYXRpb25zIG9mIHRoZSBjb250cmlidXRpbmcKLWVsZW1lbnQgd2l0aCB0aGUgYmFzZSBlbGVtZW50LjwvcD4KLTxwPlVzZSB0aGUgQ29udGVudCBWYXJpYWJpbGl0eSBzZWN0aW9uIG9uIHRoZSBEZXNjcmlwdGlvbiB0YWIgdG8gbWFrZSBhbiBlbGVtZW50Ci1jb250cmlidXRlIHRvIGFub3RoZXIgZWxlbWVudC4gU2VsZWN0IDxzdHJvbmc+Q29udHJpYnV0ZXM8L3N0cm9uZz4gYXMgdGhlIFZhcmlhYmlsaXR5Ci10eXBlIGFuZCB0aGVuIHNlbGVjdCB0aGUgYmFzZSBlbGVtZW50IHRvIHdoaWNoIHRoaXMgZWxlbWVudCB3aWxsIGNvbnRyaWJ1dGUuCi1UaGUgYmFzZSBlbGVtZW50IG11c3QgYmUgdGhlIHNhbWUgdHlwZSBvZiBlbGVtZW50IGFzIHRoZSBjb250cmlidXRpbmcgZWxlbWVudC48L3A+Ci08cD5BbnkgaW5mb3JtYXRpb24geW91IGVudGVyIGluIHRoZSBjb250cmlidXRpbmcgZWxlbWVudCBpcyBhZGRlZCB0byB0aGUgYmFzZQotZWxlbWVudC4gVGV4dCBmaWVsZHMgaW4gdGhlIGNvbnRyaWJ1dGluZyBlbGVtZW50IGFyZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZQotcmVzcGVjdGl2ZSB0ZXh0IGZpZWxkcyBpbiB0aGUgYmFzZSBlbGVtZW50LjwvcD4KLTxwPkNvbnRyaWJ1dGlvbiBvbmx5IGFkZHMgYXR0cmlidXRlcyBhbmQgYXNzb2NpYXRpb25zIHRvIHRoZSBiYXNlLiBJdCBuZXZlcgotb3ZlcnJpZGVzIG9yIHJlcGxhY2VzIGFueSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYXNlLiBJbiBvdGhlciB3b3JkcywgaWYgdGhlCi1iYXNlIGlzIGFsbG93ZWQgYW4gYXNzb2NpYXRpb24gdG8gZXhhY3RseSBvbmUgb3RoZXIgZWxlbWVudCBhbmQgaGFzIHRoaXMgb25lCi1hbHJlYWR5IGRlZmluZWQsIGl0IGlzIG5vdCBiZWluZyByZXBsYWNlZCBieSBhIGNvbnRyaWJ1dG9yJ3MgYXNzb2NpYXRpb24uPC9wPgotPGRpdiBjbGFzcz0icCI+PHN0cm9uZz5Db250cmlidXRpb24gcnVsZXM6PC9zdHJvbmc+PHVsPjxsaT5BdHRyaWJ1dGVzIGFyZSBhcHBlbmRlZCBleGNlcHQgZm9yIGlkZW50aWZ5aW5nL25hbWluZyBhdHRyaWJ1dGVzIGFuZCBub24tc3RyaW5nCi1hdHRyaWJ1dGVzIHN1Y2ggYXMgYm9vbGVhbiwgZGF0ZSwgZXRjLjwvbGk+Ci08bGk+T3V0Z29pbmcgdG8tb25lIGFzc29jaWF0aW9ucyBvZiB0aGUgY29udHJpYnV0b3IgYXJlIGlnbm9yZWQgaWYgdGhlIGJhc2UKLWFscmVhZHkgaGFzIHN1Y2ggYW4gYXNzb2NpYXRpb24gb3IgaWYgdGhlIGJhc2UgZWxlbWVudCBoYXMgbW9yZSB0aGFuIG9uZSBjb250cmlidXRpbmcKLWVsZW1lbnQgKGkuZS4gaXQgY2Fubm90IGJlIGRlY2lkZWQgd2hpY2ggY29udHJpYnV0aW9uIHNob3VsZCBiZSBjaG9zZSwgdGhlbgotbm9uZSB3aWxsIGJlIGNob3NlbikuPC9saT4KLTxsaT5PdXRnb2luZyB0by1tYW55IGFzc29jaWF0aW9ucyBhcmUgYWRkZWQgdG8gdGhlIGJhc2UgZWxlbWVudHMgb2YgYSBjb250cmlidXRpb24uPC9saT4KLTxsaT5JbmNvbWluZyBhc3NvY2lhdGlvbnMgdG8gdGhlIGNvbnRyaWJ1dGluZyBlbGVtZW50IHdpdGggYSB0by1vbmUgY29uc3RyYWludAotb24gdGhlIG90aGVyIGFzc29jaWF0aW9uIGVuZCBhcmUgaWdub3JlZCBpZiB0aGUgYmFzZSBhbHJlYWR5IGhhcyBzdWNoIGFuIGluY29taW5nCi1hc3NvY2lhdGlvbiBvciBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGNvbnRyaWJ1dGlvbiB0byBjb25zaWRlciBmb3IgdGhlCi1iYXNlIGVsZW1lbnQuPC9saT4KLTxsaT5PdGhlciBpbmNvbWluZyBhc3NvY2lhdGlvbnMgdG8gdGhlIGNvbnRyaWJ1dGluZyBlbGVtZW50IGFyZSBhZGRlZCB0byB0aGUKLWJhc2UgZWxlbWVudHMgb2YgYSBjb250cmlidXRpb24uPC9saT4KLTxsaT5BIGJhc2UgZWxlbWVudCBvZiBhIGNvbnRyaWJ1dGlvbiBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIGNvbnRyaWJ1dG9yPC9saT4KLTxsaT5Db250cmlidXRpb24gd29ya3MgdHJhbnNpdGl2ZWx5LCBpLmUuIGEgY29udHJpYnV0aW9uIGVsZW1lbnQgY29udHJpYnV0ZXMKLWl0cyBvd24gY29udHJpYnV0b3JzLjwvbGk+Ci08L3VsPgotU2VlIDxhIGhyZWY9InZhcmlhYmlsaXR5YXNzb2NpYXRpb25zLmh0bWwjdmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMiPlZhcmlhYmlsaXR5IEFzc29jaWF0aW9uczwvYT4gdG8gZmluZCB0aGUgYXNzb2NpYXRpb25zIGZvciBlYWNoIGVsZW1lbnQKLXR5cGUuPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiB0aXRsZT0iVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlIG9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZyB0aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuIj5WYXJpYWJpbGl0eTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZXh0ZW5kcy5odG1sI2V4dGVuZHMiPkV4dGVuZHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InJlcGxhY2UuaHRtbCNyZXBsYWNlcyI+UmVwbGFjZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb3B5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29weS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJjNmRmZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb3B5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYWNvbnRlbnRwYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFjb250ZW50cGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZjU4YjhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYWNvbnRlbnRwYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBDb250ZW50IFBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwjY3JlYXRlYW1ldGhvZHBsdWdpbiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVjb250ZW50cGFja2FnZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBDb250ZW50IFBhY2thZ2U8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNyZWF0ZWNvbnRlbnRwYWNrYWdlIj48YSBuYW1lPSJjcmVhdGVjb250ZW50cGFja2FnZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0ZSBhIENvbnRlbnQgUGFja2FnZTwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPjxwPk1ldGhvZCBjb250ZW50IGlzIG9yZ2FuaXplZCBpbnRvIGNvbnRlbnQgcGFja2FnZXMgd2hpY2gsIGluIHR1cm4sCi1hcmUgY29udGFpbmVkIGluIG1ldGhvZCBwbHVnLWlucy48L3A+Ci1CZWZvcmUgY3JlYXRpbmcgYSBjb250ZW50IHBhY2thZ2UsIHlvdQotc2hvdWxkIGNyZWF0ZSBhIG1ldGhvZCBwbHVnLWluLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIj5DcmVhdGUgYSBNZXRob2QgUGx1Zy1pbjwvYT4uPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Zb3Ugc2hvdWxkIGFsd2F5cyBjcmVhdGUgYSBuZXcgPGEgaHJlZj0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCNtZXRob2Rjb250ZW50cGFja2FnZSI+TWV0aG9kIENvbnRlbnQgUGFja2FnZTwvYT4gYW5kIDxhIGhyZWY9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPk1ldGhvZCBDb250ZW50PC9hPiBpbiBhIDxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+TWV0aG9kIFBsdWctaW48L2E+IHRoYXQKLXlvdSBwcm9kdWNlLiBUaGlzIHNlcGFyYXRlcyB5b3VyIGNvbnRlbnQgZnJvbSBvcmlnaW5hbCBjb250ZW50IHNoaXBwZWQgd2l0aAotdGhlIHRvb2wgYW5kIGFsbG93cyB5b3UgdG8gdXBkYXRlIHlvdXIgb3duIGxpYnJhcnkgd2l0aCBuZXcgbGlicmFyeSByZWxlYXNlcwotd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNvbnRlbnQgdGhhdCB5b3UgaGF2ZSBjcmVhdGVkIGluIHlvdXIgb3duIHBsdWctaW5zLiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91Ci1jYW5ub3QgY3JlYXRlIGEgbmV3IGNvbnRlbnQgcGFja2FnZSBvciBhbnkgb3RoZXIgZWxlbWVudCBpbiBhIGxvY2tlZCBwbHVnLWluLjwvZGl2PgotPHA+VG8KLWNyZWF0ZSBhIGNvbnRlbnQgcGFja2FnZTo8L3A+Ci08L2Rpdj4KLTxvbD48bGk+PHNwYW4+RmluZCB5b3VyIG1ldGhvZCBwbHVnLWluIGluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+Ljwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPkRyaWxsIGludG8gdGhlIHBsdWctaW4gdG8gbG9jYXRlIHRoZSBwYWNrYWdlIGNhbGxlZCA8c3Ryb25nPkNvbnRlbnQKLVBhY2thZ2VzPC9zdHJvbmc+LiBUaGlzIHBhY2thZ2UgY29udGFpbnMgYWxsIHBhY2thZ2VzIHRoYXQgYXJlIGFsbG93ZWQgdG8gY29udGFpbgotbWV0aG9kIGVsZW1lbnRzLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlJpZ2h0IGNsaWNrIHRoZSBjb250ZW50IHBhY2thZ2UgYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+TmV3ICZndDsgQ29udGVudAotUGFja2FnZTwvc3Ryb25nPi4gVGhlIGNvbnRlbnQgcGFja2FnZSBlZGl0b3IgYXBwZWFycy48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5VbmRlciBHZW5lcmFsIEluZm9ybWF0aW9uLCBnaXZlIHRoZSBuZXcgY29udGVudCBwYWNrYWdlIGEgdW5pcXVlCi1uYW1lIGFuZCBwcm92aWRlIGEgYnJpZWYgZGVzY3JpcHRpb24uPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+U2F2ZSB0aGUgbmV3IGNvbnRlbnQgcGFja2FnZSBpbiBvbmUgb2YgdGhyZWUgd2F5czo8L3NwYW4+PG9sIHR5cGU9ImEiPjxsaT48c3Bhbj5DbGljayB0aGUgZGlzayBpY29uIGluIHRoZSB0b29sYmFyLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlNlbGVjdCA8c3Ryb25nPkZpbGUgJmd0OyBTYXZlPC9zdHJvbmc+Ljwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlNpbXBseSBjbG9zZSB0aGUgY29udGVudCBlZGl0b3IuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVGhlIHRvb2wgYXV0b21hdGljYWxseSBjcmVhdGVzIG5vZGVzIGZvciA8YSBocmVmPSJ0YXNrLmh0bWwjdGFzayI+VGFzazwvYT4sIDxhIGhyZWY9InJvbGUuaHRtbCNyb2xlIj5Sb2xlPC9hPiwgPGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0PC9hPiwgYW5kIDxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPiB1bmRlciB0aGUgbmV3IGNvbnRlbnQgcGFja2FnZS48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwiPk1ldGhvZCBDb250ZW50IFBhY2thZ2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCNtZXRob2Rjb250ZW50cGFja2FnZSI+TWV0aG9kIENvbnRlbnQgUGFja2FnZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRlbWV0aG9kY29udGVudCI+Q3JlYXRlIE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwjY3JlYXRlYW1ldGhvZHBsdWdpbiI+Q3JlYXRlIGEgTWV0aG9kIFBsdWctaW48L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWNkZWYyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBEZWxpdmVyeSBQcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJwcm9jZXNzLmh0bWwjcHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjYXBhYmlsaXR5cGF0dGVybiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGVsaXZlcnlwcm9jZXNzLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBEZWxpdmVyeSBQcm9jZXNzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzIj48YSBuYW1lPSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIGEgRGVsaXZlcnkgUHJvY2VzczwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPjxwPkEgRGVsaXZlcnkgUHJvY2VzcyBkZXNjcmliZXMgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaAotZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyB0eXBlIG9mIHByb2plY3QuIEEgRGVsaXZlcnkgUHJvY2VzcyBkZXNjcmliZXMgd2hhdAotaXMgcHJvZHVjZWQsIGhvdyBpdCBpcyBwcm9kdWNlZCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGZvciB0aGUgZW50aXJlIHByb2plY3QKLWxpZmVjeWNsZS48L3A+Ci1BIERlbGl2ZXJ5IFByb2Nlc3MgaXMgY3JlYXRlZCBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUgb2YgcHJvamVjdAotdG8gcmVmbGVjdCB0aGUgc3BlY2lmaWMgcGxhbm5pbmcgYW5kIHByb2plY3QgbWFuYWdlbWVudCBuZWVkcy4gPHA+QmVmb3JlCi1jcmVhdGluZyBhIGRlbGl2ZXJ5IHByb2Nlc3M6PC9wPgotPHVsPjxsaT5TZWxlY3QgYSBtZXRob2QgcGx1Zy1pbiB0byBob2xkIHlvdXIgcHJvY2Vzcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJtZXRob2RwbHVnaW4uaHRtbCNtZXRob2RwbHVnaW4iPk1ldGhvZCBQbHVnLWluPC9hPi48L2xpPgotPGxpPkZpbmQgb3IgY3JlYXRlIGEgcHJvY2VzcyBwYWNrYWdlLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIHBvcHVsYXRlIGEgcHJvY2VzcyB3aXRoIG1ldGhvZCBlbGVtZW50czo8dWw+PGxpPkJ5IGluY29ycG9yYXRpbmcgaW5kaXZpZHVhbCBtZXRob2QgZWxlbWVudHMgYnkgZHJhZ2dpbmcgdGhlIGVsZW1lbnRzIG9udG8KLWFuIGFjdGl2aXR5IGluIHRoZSBwcm9jZXNzLjwvbGk+Ci08bGk+QnkgaW5jbHVkaW5nIGFscmVhZHkgZGVmaW5lZCBjYXBhYmlsaXR5IHBhdHRlcm5zLjwvbGk+Ci08bGk+QnkgaW5jbHVkaW5nIHBhcnRzIG9mIGFscmVhZHkgZGVmaW5lZCBjYXBhYmlsaXR5IHBhdHRlcm5zLjwvbGk+Ci08bGk+QnkgY3JlYXRpbmcgZGVzY3JpcHRvcnMgZGlyZWN0bHkgaW4gdGhlIHByb2Nlc3MsIHdoaWNoIGFyZSBlaXRoZXIgdW5yZWxhdGVkCi10byBhbnkgbWV0aG9kIGNvbnRlbnQgb3IgcmVsYXRlZCB0byBtZXRob2QgY29udGVudCBhdCBhIGxhdGVyIHBvaW50IGluIHRpbWUuPC9saT4KLTwvdWw+Ci1UbyBjcmVhdGUgYSBEZWxpdmVyeSBQcm9jZXNzOjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T25jZSB5b3UgaGF2ZSBzZWxlY3RlZCBvciBjcmVhdGVkIGEgcHJvY2VzcyBwYWNrYWdlLCByaWdodCBjbGljawotdGhlIHByb2Nlc3MgcGFja2FnZS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5OZXcgJmd0OyBEZWxpdmVyeSBQcm9jZXNzPC9zdHJvbmc+LiBUaGUgTmV3IFByb2Nlc3MgQ29tcG9uZW50Ci1kaWFsb2cgYXBwZWFycy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIG5hbWUgZm9yIHRoZSBkZWxpdmVyeSBwcm9jZXNzIGludG8gdGhlIDxzdHJvbmc+TmFtZTwvc3Ryb25nPiBmaWVsZAotYW5kIHRoZW4gc2VsZWN0IGEgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZyb20gdGhlIGRyb3AgZG93biBsaXN0LiBZb3VyIHByb2Nlc3MKLWNhbiBjb250YWluIGNvbnRlbnQgZnJvbSBtYW55IGRpZmZlcmVudCBtZXRob2QgcGx1Zy1pbnMuIGZvciB0aGlzIHJlYXNvbiB5b3UKLW5lZWQgdG8gZGVmaW5lIGEgY29uZmlndXJhdGlvbiB0aGF0IGRlZmluZXMgdGhlIHZpc2libGUgc2V0IG9mIGVsZW1lbnRzIGFuZAotcmVsYXRpb25zaGlwcyB3aGVuIHRoZSBwcm9jZXNzIGlzIGF1dGhvcmVkLiBUaGlzIHByb2Nlc3MgYXV0aG9yaW5nIGNvbmZpZ3VyYXRpb24KLWlzIHJlZmVycmVkIHRvIGFzIHRoZSBEZWZhdWx0IENvbmZpZ3VyYXRpb24gZm9yIHRoZSBwcm9jZXNzIGFuZCBzaG91bGQgZGVmaW5lCi10aGUgbGFyZ2VzdCByZWFzb25hYmxlIHNldCBvZiBtZXRob2QgcGx1Zy1pbnMsIGNvbnRlbnQgcGFja2FnZXMsIGFuZCBvdGhlcgotcHJvY2Vzc2VzIGZyb20gdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2lsbCBiZSByZWZlcnJlZCB0byBieSB0aGUgcHJvY2VzcwotYXQgc29tZSBwb2ludC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVGhlIHByb2Nlc3MgaXMgY3JlYXRlZCBhbmQgdGhlIHByb2Nlc3MgZWRpdG9yCi1pcyBvcGVuZWQuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gSWYgdGhlIFByb3BlcnRpZXMgd2luZG93IG9wZW5zIHRvIHRoZSByaWdodCBvZgotdGhlIHByb2Nlc3MgZWRpdG9yLCBjbGljayB0aGUgPHN0cm9uZz54PC9zdHJvbmc+IHRvIGNsb3NlIGl0LjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIHByb2Nlc3MgZWRpdG9yLCB1bmRlciB0aGUgRGVzY3JpcHRpb24gdGFiLCBkb2N1bWVudCB5b3VyCi1wcm9jZXNzIHVzaW5nIHRoZSBhdmFpbGFibGUgdGV4dCBmaWVsZHMuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91IGNhbiB1c2UgdGhlCi1SaWNoIFRleHQgRWRpdG9yIHRvIGVkaXQgb3IgZW50ZXIgdGhlIHRleHQgZm9yIGFueSBmaWVsZCB0aGF0IGhhcyBhIHR3aXN0eQotc3ltYm9sIDxpbWcgc3JjPSJjb2xsYXBzZWQuZ2lmIiBhbHQ9IiIgLz4uIFNpbXBseSBjbGljayB0aGUgc3ltYm9sCi10byBhY2Nlc3MgdGhlIFJpY2ggVGV4dCBFZGl0b3IuIENsaWNrIHRoZSBzeW1ib2wgYWdhaW4gdG8gY2xvc2UgdGhlIFJpY2ggVGV4dAotRWRpdG9yLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0icmljaHRleHRlZGl0b3IuaHRtbCNyaWNodGV4dGVkaXRvciI+UmljaCBUZXh0IEVkaXRvcjwvYT48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkRlY2lkZSBvbiB5b3VyIHByaW1hcnkgcHJvY2VzcyBhdXRob3Jpbmcgdmlldy4gWW91IGRldmVsb3AgYSBwcm9jZXNzCi11c2luZyB0aHJlZSBkaWZmZXJlbnQgdmlld3M6PC9zcGFuPjx1bD48bGk+PHN0cm9uZz5Xb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L3N0cm9uZz46IERlZmluZSBhIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZQotaW4geW91ciBwcm9jZXNzLiBDcmVhdGUgaXRlcmF0aW9ucyBhbmQgYWN0aXZpdGllcyBmaXJzdCwgYW5kIHRoZW4gcG9wdWxhdGUKLXlvdXIgYWN0aXZpdGllcyBieSBhcHBseWluZyB0YXNrcyBmcm9tIHlvdXIgTWV0aG9kIENvbnRlbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uCi1zZWUgPGEgaHJlZj0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwiPkRldmVsb3AgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L2E+LjwvbGk+Ci08bGk+PHN0cm9uZz5UZWFtIEFsbG9jYXRpb248L3N0cm9uZz46IERlZmluZSB3aGljaCB0ZWFtcyBhbmQgcm9sZXMgc2hhbGwgcGFydGljaXBhdGUKLWluIGFjdGl2aXRpZXMgYW5kIHRoZW4gZmluZCByZXNwb25zaWJsZSB3b3JrIHByb2R1Y3RzIGFuZCB0YXNrcyBmcm9tIHRoZXJlLgotRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZSI+RGV2ZWxvcCBhIFRlYW0gQWxsb2NhdGlvbiBTdHJ1Y3R1cmU8L2E+LjwvbGk+Ci08bGk+PHN0cm9uZz5Xb3JrIFByb2R1Y3QgVXNhZ2U8L3N0cm9uZz46IERlZmluZSB3aGljaCB3b3JrIHByb2R1Y3RzIHNob3VsZCBiZSBjcmVhdGVkCi1pbiBhY3Rpdml0aWVzIGFuZCBmaW5kIHRhc2tzIGFuZCByb2xlcyBmcm9tIHRoZXJlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0iZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlIj5EZXZlbG9wIGEgV29yayBQcm9kdWN0IFVzYWdlIFN0cnVjdHVyZTwvYT4uPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj48YSBocmVmPSJhcHBseWFjYXBhYmlsaXR5cGF0dGVybi5odG1sI2FwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuIj5BcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybjwvYT4gb3IgY2FwYWJpbGl0eSBwYXR0ZXJuIHBhcnRzIHRvIHRoZSBkZWxpdmVyeSBwcm9jZXNzLjwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj4KLTx1bCBjbGFzcz0idWxsaW5rcyI+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9ImRlbGl2ZXJ5cHJvY2Vzcy5odG1sIj5EZWxpdmVyeSBQcm9jZXNzPC9hPjwvc3Ryb25nPjxiciAvPgotPC9saT4KLTwvdWw+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InByb2Nlc3MuaHRtbCNwcm9jZXNzIj5Qcm9jZXNzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbi5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MmJhNDY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBNZXRob2QgQ29uZmlndXJhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCNtZXRob2Rjb25maWd1cmF0aW9ucyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kcGx1Z2luLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBNZXRob2QgQ29uZmlndXJhdGlvbjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24iPjxhIG5hbWU9ImNyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIGEgTWV0aG9kIENvbmZpZ3VyYXRpb248L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj48cD5BIG1ldGhvZCBjb25maWd1cmF0aW9uIGFsbG93cyB5b3UgdG8gc2VsZWN0IGFuZCBkZXNlbGVjdCBmcm9tIHRoZQotY29udGVudCBwYWNrYWdlcyBhbmQgcHJvY2VzcyBhdmFpbGFibGUgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5J3Mgc2V0IG9mIHBsdWctaW5zLgotVGhlIHNlbGVjdGlvbnMgeW91IG1ha2UgaGVscCB5b3UgbmFycm93IGRvd24gdGhlIGNvbnRlbnQgeW91IGFyZSByZWFsbHkgaW50ZXJlc3RlZAotaW4gd29ya2luZyB3aXRoLCBhcyB3ZWxsIGFzIGRldGVybWluZSB0aGUgY29udGVudCBvZiB0aGUgV2ViIHNpdGUgeW91IHVsdGltYXRlbHkKLXB1Ymxpc2ggdG8gZGVwbG95IHlvdXIgcHJvY2Vzcy4gQSBjb25maWd1cmF0aW9uIGlzIGdpdmVuIGEgbmFtZSBhbmQgdGhlbiBzYXZlZAotc28gaXQgY2FuIGJlIGNoYW5nZWQgYW5kIHRoZW4gcmUtcHVibGlzaGVkIGF0IGEgbGF0ZXIgZGF0ZS48L3A+Ci1CZWZvcmUgY3JlYXRpbmcKLWEgbWV0aG9kIGNvbmZpZ3VyYXRpb24sIGFzc2VzcyB5b3VyIG5lZWRzIGFuZCBnb2FscyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24uPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UaGVyZSBhcmUgdHdvIHdheXMgdG8gY3JlYXRlIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb246PGEgbmFtZT0iY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb25fX2NyZWF0ZSI+PCEtLSAtLT48L2E+PHVsIGlkPSJjcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbl9fY3JlYXRlIj48bGk+Q3JlYXRlIGEgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uIGZyb20gc2NyYXRjaC48L2xpPgotPGxpPkNyZWF0ZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGJ5IGNvcHlpbmcgYW4gZXhpc3RpbmcgY29uZmlndXJhdGlvbi48L2xpPgotPC91bD4KLTxzdHJvbmc+VG8gY3JlYXRlIGEgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uIGZyb20gc2NyYXRjaDo8L3N0cm9uZz48L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk1ha2Ugc3VyZSB5b3UgYXJlIHdvcmtpbmcgaW4gdGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBMaWJyYXJ5IHZpZXcsIHJpZ2h0IGNsaWNrIHRoZSA8c3Ryb25nPkNvbmZpZ3VyYXRpb25zPC9zdHJvbmc+IGZvbGRlcgotYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+TmV3ICZndDsgTWV0aG9kIENvbmZpZ3VyYXRpb248L3N0cm9uZz4uIFlvdXIgbmV3IGNvbmZpZ3VyYXRpb24KLWlzIGNyZWF0ZWQgYW5kIHRoZSBjb25maWd1cmF0aW9uIGVkaXRvciBpcyBvcGVuZWQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBjb25maWd1cmF0aW9uIGVkaXRvciB3aW5kb3csIHR5cGUgYSBuYW1lIGZvciB5b3VyIGNvbmZpZ3VyYXRpb24KLWluIHRoZSA8c3Ryb25nPk5hbWU8L3N0cm9uZz4gZmllbGQuIElmIHlvdSBjbGljayBhbnl3aGVyZSBpbiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPiBvciA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sIj5Db25maWd1cmF0aW9uIFZpZXc8L2E+LCB5b3UKLXdpbGwgYmUgYWJsZSB0byBzZWUgeW91ciBuZXcgY29uZmlndXJhdGlvbiBuYW1lIGluIHRoZSBDb25maWd1cmF0aW9ucyBmb2xkZXIKLWluIHRoZSBMaWJyYXJ5IHZpZXcgdHJlZS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIGRlc2NyaXB0aW9uIGZvciB5b3VyIGNvbmZpZ3VyYXRpb24gaW4gdGhlIERlc2NyaXB0aW9uIGZpZWxkLAotYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+RmlsZSAmZ3Q7IFNhdmUgQWxsPC9zdHJvbmc+IHRvIHNhdmUgeW91ciBuZXcgbWV0aG9kIGNvbmZpZ3VyYXRpb24uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkF0IHRoZSBib3R0b20gb2YgdGhlIGVkaXRvciB3aW5kb3csIGNsaWNrIHRoZSA8c3Ryb25nPlBsdWctaW4gYW5kIFBhY2thZ2UKLVNlbGVjdGlvbjwvc3Ryb25nPiB0YWIuIDwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gc2VsZWN0aW9uIHNlY3Rpb24gZGlzcGxheXMgYSBsaXN0IG9mIGFsbAotbWV0aG9kIHBsdWctaW5zIHRoZWlyIGNvbnRlbnQgcGFja2FnZXMgYW5kIHByb2Nlc3Nlcy4gVXNlIHRoZSBjaGVjayBib3hlcwotdG8gYWRkIG9yIHJlbW92ZSBwbHVnLWlucywgcGFja2FnZXMsIGFuZCBwcm9jZXNzZXMgdG8gb3IgZnJvbSB5b3VyIGNvbmZpZ3VyYXRpb24uCi1FeHBhbmQgZWFjaCBwbHVnLWluIHRvIHNlbGVjdCBhbmQgZGVzZWxlY3QgaW5kaXZpZHVhbCBwYWNrYWdlcyBhbmQgcHJvY2Vzc2VzLjwvc3Bhbj4gPHA+QXMgeW91IG1ha2UgeW91ciBzZWxlY3Rpb25zLCB3YXJuaW5nIHNpZ25zIG1heSBhcHBlYXIgYWdhaW5zdAotc29tZSBvZiB0aGUgcGx1Zy1pbiBhbmQgcGFja2FnZSBuYW1lcywgYW5kIHRoZSBDb25maWd1cmF0aW9uIFdhcm5pbmcgTG9nIHZpZXcKLW1heSBiZSBkaXNwbGF5ZWQuIFRoZXNlIHdhcm5pbmdzIGFyZSBpbnRlbmRlZCB0byBoZWxwIGVuc3VyZSB0aGF0IHlvdSBjcmVhdGUKLWEgY29uZmlndXJhdGlvbiB0aGF0ICJtYWtlcyBzZW5zZSIuPC9wPgotPHA+SWYgeW91IHJlZmVyZW5jZSBhbiBlbGVtZW50IGluIGEKLXBhY2thZ2UgdGhhdCBpcyBmcm9tIGFub3RoZXIgcGFja2FnZSwgeW91IGNhbiBvbmx5IHNlZSB0aGUgZnVsbCBkZXRhaWxzIGZvcgotdGhhdCBlbGVtZW50IGluIGEgcHVibGlzaGVkIFdlYiBzaXRlIGlmIHRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQKLWlzIGluIHRoZSBjb25maWd1cmF0aW9uLiBJZiB0aGUgcGFja2FnZSBjb250YWluaW5nIHRoZSBlbGVtZW50IGlzIG5vdCBpbiB0aGUKLWNvbmZpZ3VyYXRpb24sIHRoZSAib2ZmZW5kaW5nIiBwYWNrYWdlIGlzIG1hcmtlZCB3aXRoIGEgd2FybmluZyBzaWduLiBZb3UKLW1heSBjaG9vc2Ugbm90IHRvIGluY2x1ZGUgdGhlIGZ1bGwgZGV0YWlscyBvZiBhIHJlZmVyZW5jZWQgZWxlbWVudC4gQ2xpY2sKLXRoZSA8c3Ryb25nPkFkZCBNaXNzaW5nIFJlZmVyZW5jZXM8L3N0cm9uZz4gYnV0dG9uIHRvIGF1dG9tYXRpY2FsbHkgYW5kIHJlY3Vyc2l2ZWx5Ci1hZGQgcGFja2FnZXMgY29udGFpbmluZyBhbnkgZWxlbWVudHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBpbiBhbHJlYWR5IHNlbGVjdGVkCi1wYWNrYWdlcy4gU2luY2UgdGhpcyBpcyByZWN1cnNpdmUsIGEgbGFyZ2UgbnVtYmVyIG9mIHBhY2thZ2VzIG1heSBiZSBhZGRlZCwKLXBlcmhhcHMgbWFraW5nIHlvdXIgY29uZmlndXJhdGlvbiBsYXJnZXIgdGhhbiB5b3Ugd2FudCBpdCB0byBiZS48L3A+Ci08cD5JZgoteW91IGhhdmUgZWxlbWVudHMgaW4gYSBwYWNrYWdlIHRoYXQgY29udHJpYnV0ZSB0bywgZXh0ZW5kLCBvciByZXBsYWNlIGVsZW1lbnRzCi1pbiBhbm90aGVyIHBhY2thZ2UsIGl0IGlzIGFuIGVycm9yIGlmIHRoZSBiYXNlIHBhY2thZ2UgaXMgbm90IGluY2x1ZGVkIGluCi10aGUgY29uZmlndXJhdGlvbi4gRXJyb3JzIGFyZSBtYXJrZWQgd2l0aCBhIHJlZCBjcm9zcy4gSWYgeW91IGRyaWxsIGRvd24gaW50bwotYSBwbHVnLWluIG9yIHBhY2thZ2UgbWFya2VkIHdpdGggYSBjcm9zcyB5b3Ugd2lsbCBkaXNjb3ZlciB0aGUgIm9mZmVuZGluZyIKLXBhY2thZ2UgYW5kIHRoZW4geW91IGNhbiBmaW5kIHRoZSBwYWNrYWdlcyB5b3UgbmVlZCB0byBpbmNsdWRlIHRvIHJlc29sdmUKLXRoZSBlcnJvci4gQWx0ZXJuYXRpdmVseSB5b3UgY2FuIGNsaWNrIHRoZSA8c3Ryb25nPk1ha2UgY2xvc3VyZSBieSBmaXhpbmcgZXJyb3JzPC9zdHJvbmc+IGJ1dHRvbgotdG8gYXV0b21hdGljYWxseSBmaXggdGhlIGVycm9ycyBieSBhZGRpbmcgdGhlIG1pc3NpbmcgYmFzZSBwYWNrYWdlcy48L3A+Ci08cD5UaGUKLUNvbmZpZ3VyYXRpb24gV2FybmluZyBMb2cgbGlzdHMgYW5kIGV4cGxhaW5zIGFsbCBlcnJvcnMgYW5kIHdhcm5pbmdzIGluIHRoZQotY29uZmlndXJhdGlvbi48L3A+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgPHN0cm9uZz5GaWxlICZndDsgU2F2ZSBBbGw8L3N0cm9uZz48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RGVmaW5lIHRoZSB2aWV3cyBmb3IgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uLiBBIHZpZXcgaXMgYSBuYXZpZ2F0aW9uCi10cmVlIGJyb3dzZXIgaW4gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4gRXZlcnkgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gY2FuCi1oYXZlIHNldmVyYWwgdmlld3MgdGhhdCBhcmUgZGlzcGxheWVkIGFzIHN0YWNrZWQgdHJlZSBicm93c2VyIHRhYnMuIFRoZSBzdHJ1Y3R1cmUKLW9mIHRoZSB2aWV3IGlzIGRlZmluZWQgYXMgYSBDdXN0b20gQ2F0ZWdvcnkuPC9zcGFuPjxvbCB0eXBlPSJhIj48bGk+PHNwYW4+SW4gdGhlIENvbmZpZ3VyYXRpb24gRWRpdG9yLCBjbGljayB0aGUgPHN0cm9uZz5WaWV3czwvc3Ryb25nPiB0YWIuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+QWRkIFZpZXc8L3N0cm9uZz4gYnV0dG9uLiBUaGUgU2VsZWN0IENhdGVnb3JpZXMgZGlhbG9nCi1hcHBlYXJzLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPklmIG5lZWRlZCwgY2xpY2sgdGhlICgrKSBzaWduIHRvIGV4cGFuZCB0aGUgQ3VzdG9tIENhdGVnb3JpZXMKLWZvbGRlciBhbmQgdGhlbiBzZWxlY3QgdGhlIGNhdGVnb3J5IHlvdSB3YW50IHRvIHVzZSBhcyB5b3VyIHZpZXcuIENsaWNrIHRoZQotKCspIHNpZ24gdG8gZXhwYW5kIHlvdXIgY2hvc2VuIGNhdGVnb3J5IGFuZCB2aWV3IGl0J3MgY29udGVudHMuIFByZXNzIGFuZAotaG9sZCB0aGUgQ1RSTCBrZXkgdG8gc2VsZWN0IG11bHRpcGxlIHZpZXdzLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPkNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRoZSBkaWFsb2cgd2luZG93IGRpc2FwcGVhcnMgYW5kIHRoZSB2aWV3cwoteW91IHNlbGVjdGVkIGFyZSBhZGRlZCB0byB0aGUgQ29uZmlndXJhdGlvbi48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIHZpZXcgeW91IHdhbnQgdG8gZGlzcGxheSBhcyB5b3VyIGNvbmZpZ3VyYXRpb24ncyBzdGFydC11cAotdmlldyBhbmQgdGhlbiBjbGljayB0aGUgPHN0cm9uZz5NYWtlIERlZmF1bHQ8L3N0cm9uZz4gYnV0dG9uLiBUaGUgc3RhcnQtdXAgdmlldyBpcyB0aGUKLWZpcnN0IHZpZXcgc2hvd24gd2hlbiBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIGlzIGRpc3BsYXllZCBmb3IgdGhlIGZpcnN0Ci10aW1lLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3Ryb25nPkZpbGUgJmd0OyBTYXZlIGFsbDwvc3Ryb25nPiB0byBzYXZlIHlvdXIgY29uZmlndXJhdGlvbi48L3NwYW4+PC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48c3Ryb25nPlRvIGNyZWF0ZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGJ5IGNvcHlpbmcgYW4gZXhpc3RpbmcgY29uZmlndXJhdGlvbjwvc3Ryb25nPjo8b2w+PGxpPk1ha2Ugc3VyZSB5b3UgYXJlIHdvcmtpbmcgaW4gdGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT4uPHA+PC9wPgotPC9saT4KLTxsaT5JbiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPiwKLWV4cGFuZCB0aGUgQ29uZmlndXJhdGlvbnMgZm9sZGVyLjxwPjwvcD4KLTwvbGk+Ci08bGk+IFJpZ2h0IGNsaWNrIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiB5b3Ugd2FudCB0byBjb3B5IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+Q29weTwvc3Ryb25nPi48cD48L3A+Ci08L2xpPgotPGxpPlJpZ2h0IGNsaWNrIHRoZSA8c3Ryb25nPkNvbmZpZ3VyYXRpb25zPC9zdHJvbmc+IGZvbGRlciBhbmQgdGhlbiBjbGljayA8c3Ryb25nPlBhc3RlPC9zdHJvbmc+LgotVHlwZSBhIG5hbWUgZm9yIHRoZSBuZXcgY29uZmlndXJhdGlvbiBpbiB0aGUgcG9wLXVwIHdpbmRvdy4gVGhlIGNvcGllZCBtZXRob2QKLWNvbmZpZ3VyYXRpb24gaXMgcGFzdGVkIGludG8gdGhlIENvbmZpZ3VyYXRpb25zIGZvbGRlci48cD48L3A+Ci08L2xpPgotPGxpPkRvdWJsZSBjbGljayB0aGUgbmV3bHkgcGFzdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uIHRvIG9wZW4gaXRzIGNvbmZpZ3VyYXRpb24KLWVkaXRvci48cD48L3A+Ci08L2xpPgotPGxpPkZvbGxvdyBzdGVwcyAzIHRocm91Z2ggMTAgaW4gPHN0cm9uZz5UbyBDcmVhdGUgYSBOZXcgTWV0aG9kIENvbmZpZ3VyYXRpb24gZnJvbQotU2NyYXRjaDwvc3Ryb25nPiBhYm92ZSB0byBjb250aW51ZS48L2xpPgotPC9vbD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Im1ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwjbWV0aG9kY29uZmlndXJhdGlvbnMiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJtZXRob2RwbHVnaW4uaHRtbCI+TWV0aG9kIFBsdWctaW48L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiPk1ldGhvZCBDb250ZW50IFBhY2thZ2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sIj5DcmVhdGUgYSBNZXRob2QgUGx1Zy1pbjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OGQ2MjMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIGEgTWV0aG9kIFBsdWctaW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCNtZXRob2Rjb250ZW50cGFja2FnZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYWNvbnRlbnRwYWNrYWdlLmh0bWwjY3JlYXRlY29udGVudHBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZHBsdWdpbi5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2RwbHVnaW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q3JlYXRlIGEgTWV0aG9kIFBsdWctaW48L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNyZWF0ZWFtZXRob2RwbHVnaW4iPjxhIG5hbWU9ImNyZWF0ZWFtZXRob2RwbHVnaW4iPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgYSBNZXRob2QgUGx1Zy1pbjwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPjxwPk1ldGhvZCBQbHVnLWlucyBhbGxvdyB0aGUgZXh0ZW5zaW9uIG9yIGN1c3RvbWl6YXRpb24gb2YgYmFzZSBsaWJyYXJ5Ci1jb250ZW50IHdpdGhvdXQgZGlyZWN0bHkgY2hhbmdpbmcgdGhhdCBiYXNlIGNvbnRlbnQgYnkgZGVmaW5pbmcgdGhlIGRpZmZlcmVuY2VzCi10byB0aGUgY29udGVudC4gWW91IHNob3VsZCBhbHdheXMgY3JlYXRlIG5ldyBjb250ZW50IGluIGEgbWV0aG9kIHBsdWctaW4gdGhhdAoteW91IHByb2R1Y2UgdG8gc2VwYXJhdGUgeW91ciBjb250ZW50IGZyb20gdGhlIG9yaWdpbmFsIE9wZW5VUC9CYXNpYyBjb250ZW50LiBUaGlzCi1hbHNvIGFsbG93cyB5b3UgdG8gdXBkYXRlIHlvdXIgb3duIGxpYnJhcnkgd2l0aCBuZXcgcmVsZWFzZXMgb2YgdGhlIE9wZW5VUC9CYXNpYyBNZXRob2QKLUxpYnJhcnkgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNvbnRlbnQgdGhhdCB5b3UgaGF2ZSBjcmVhdGVkIGluIHlvdXIgb3duIHBsdWctaW5zLjwvcD4KLTxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBQbHVnLWlucwotdGhhdCBhcmUgc2hpcHBlZCB3aXRoIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgYXJlIGxvY2tlZCBhbmQgcmVhZC1vbmx5LgotVGhlc2UgcGx1Zy1pbnMgYXJlIGdyYXllZCBvdXQgaW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4sIGluZGljYXRpbmcgdGhhdCB0aGV5IGFyZSBsb2NrZWQuPC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIGNyZWF0ZSBhIG5ldyBNZXRob2QgUGx1Zy1pbjo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk1ha2Ugc3VyZSB5b3UgYXJlIGluIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Zb3UgY2FuIGJlZ2luIHRoZSBtZXRob2QgcGx1Zy1pbiBjcmVhdGlvbiBwcm9jZXNzIGluIG9uZSBvZiB0d28KLXdheXM6PC9zcGFuPjx1bD48bGk+Q2xpY2sgPHN0cm9uZz5GaWxlICZndDsgTmV3ICZndDsgTWV0aG9kIFBsdWctaW48L3N0cm9uZz4uIE9yLDwvbGk+Ci08bGk+SW4gdGhlIExpYnJhcnkgdmlldywgcmlnaHQgY2xpY2sgYW4gZXhpc3RpbmcgcGx1Zy1pbiBhbmQgc2VsZWN0IDxzdHJvbmc+TmV3Ci1NZXRob2QgUGx1Zy1pbjwvc3Ryb25nPi48L2xpPgotPC91bD4KLSBUaGUgTmV3IE1ldGhvZCBQbHVnLWluIHdpemFyZCBvcGVucy48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGEgbmFtZSBmb3IgeW91ciBuZXcgcGx1Zy1pbiBpbiB0aGUgPHN0cm9uZz5OYW1lPC9zdHJvbmc+IGZpZWxkIGFuZCB0aGVuCi1zZWxlY3QgYSBwbHVnaW4gaW4gdGhlIDxzdHJvbmc+UmVmZXJlbmNlZCBQbHVnLWluczwvc3Ryb25nPiBmaWVsZC4gVGhlIHBsdWctaW4geW91IGNyZWF0ZQotZXh0ZW5kcyB0aGUgcGx1Zy1pbiB5b3Ugc2VsZWN0IGZyb20gdGhlIGxpc3QgYW5kIGFsbG93cyB5b3UgdG8gdXNlIGNvbnRlbnQKLWZyb20gdGhlIHNlbGVjdGVkIHBsdWctaW4gYXMgeW91IGNyZWF0ZSB5b3VyIG93biBwbHVnLWluIGNvbnRlbnQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlByb3ZpZGUgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgcGx1Zy1pbiBhbmQgbGlzdCBpdHMgYXV0aG9ycwotdG8gaGVscCB5b3UgYW5kIG90aGVycyBrZWVwIHRyYWNrIG9mIHRoZSBwbHVnLWlucyBpbiB0aGUgbGlicmFyeS4gWW91IGNhbgotcmV0dXJuIHRvIGVkaXQgdGhpcyBpbmZvcm1hdGlvbiBhdCBhbnkgdGltZS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5GaW5pc2g8L3N0cm9uZz4uIFlvdXIgbmV3IHBsdWctaW4gbm93IGFwcGVhcnMgaW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4gd2l0aCB0aGUgb3RoZXIKLU1ldGhvZCBQbHVnLWlucy48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0ibWV0aG9kcGx1Z2luLmh0bWwiPk1ldGhvZCBQbHVnLWluPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+TWV0aG9kIFBsdWctaW48L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiPk1ldGhvZCBDb250ZW50IFBhY2thZ2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYWNvbnRlbnRwYWNrYWdlLmh0bWwjY3JlYXRlY29udGVudHBhY2thZ2UiPkNyZWF0ZSBhIENvbnRlbnQgUGFja2FnZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2R2aWV3d2l0aGN1c3RvbWNhdGVnb3JpZXMuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZHZpZXd3aXRoY3VzdG9tY2F0ZWdvcmllcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MGVkYTVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZHZpZXd3aXRoY3VzdG9tY2F0ZWdvcmllcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIGEgTWV0aG9kIFZpZXcgd2l0aCBDdXN0b20gQ2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlYW1ldGhvZHZpZXd3aXRoY3VzdG9tY2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBNZXRob2QgVmlldyB3aXRoIEN1c3RvbSBDYXRlZ29yaWVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVhbWV0aG9kdmlld3dpdGhjdXN0b21jYXRlZ29yaWVzIj48YSBuYW1lPSJjcmVhdGVhbWV0aG9kdmlld3dpdGhjdXN0b21jYXRlZ29yaWVzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIGEgTWV0aG9kIFZpZXcgd2l0aCBDdXN0b20gQ2F0ZWdvcmllczwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24iPkN1c3RvbSBjYXRlZ29yaWVzIGFsbG93IHlvdSB0byBjYXRlZ29yaXplIGNvbnRlbnQgYWNjb3JkaW5nIHRvIGFueQotc2NoZW1lIHlvdSB3YW50LiBDdXN0b20gY2F0ZWdvcmllcyBjYW4gdGhlbiBiZSB1c2VkIHRvIGNvbXBvc2UgcHVibGlzaGFibGUKLXZpZXdzLCBwcm92aWRpbmcgYSBtZWFucyB0byBvcmdhbml6ZSBtZXRob2QgY29udGVudCBwcmlvciB0byBwdWJsaXNoaW5nLjxwPlRvCi1jcmVhdGUgYSBuZXcgY3VzdG9tIGNhdGVnb3J5OjwvcD4KLTwvZGl2PgotPG9sPjxsaT48c3Bhbj5Td2l0Y2ggdG8gdGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT4uPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+T3BlbiB0aGUgPHN0cm9uZz5NZXRob2QgQ29udGVudDwvc3Ryb25nPiBmb2xkZXIgaW4gdGhlIG1ldGhvZCBwbHVnLWluIHdoZXJlCi15b3Ugd2FudCB0byBjcmVhdGUgdGhlIGN1c3RvbSBjYXRlZ29yeS48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5SaWdodCBjbGljayB0aGUgQ3VzdG9tIENhdGVnb3JpZXMgZm9sZGVyIGFuZCBzZWxlY3QgPHN0cm9uZz5OZXcgJmd0OyBDdXN0b20KLUNhdGVnb3J5PC9zdHJvbmc+LiBUaGUgZWRpdG9yIHdpbmRvdyBvcGVucy48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5Qcm92aWRlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXN0b20gY2F0ZWdvcnkgaW4gdGhlCi1maWVsZHMgYXZhaWxhYmxlIHVuZGVyIHRoZSA8c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+IHRhYi48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5VbmRlciB0aGUgPHN0cm9uZz5Bc3NpZ248L3N0cm9uZz4gdGFiLCB5b3UgY2FuIHNlbGVjdCB0aGUgdGhpbmdzIHlvdSB3YW50Ci10byBpbmNsdWRlIGluIHRoZSBjdXN0b20gY2F0ZWdvcnkuIFNlbGVjdCBpbmRpdmlkdWFsIG1ldGhvZCBlbGVtZW50cywgcHJvY2Vzc2VzLAotc3RhbmRhcmQgY2F0ZWdvcmllcyBvciBjdXN0b20gY2F0ZWdvcmllcy4gVGhlIGN1c3RvbSBjYXRlZ29yeQotaXMgYWxzbyBhdmFpbGFibGUgdG8gYWRkIHRvIGluZGl2aWR1YWwgZWxlbWVudHMgb24gdGhlIDxzdHJvbmc+Q2F0ZWdvcmllczwvc3Ryb25nPiB0YWIKLWluIHRoZSBhcHByb3ByaWF0ZSBlZGl0b3IuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+T25jZSB5b3UgYXNzaWduIGNvbnRlbnQgdG8gdGhlIGN1c3RvbSBjYXRlZ29yeSwgeW91IGNhbiBtb2RpZnkKLXRoZSBzZXF1ZW5jZSBvZiB0aGUgaXRlbXMgaW4gdGhlIGNhdGVnb3J5LiBUaGlzIGFmZmVjdHMgdGhlIHNlcXVlbmNlIG9mIHRoZQotaXRlbXMgaW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4gYW5kIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4sIGFzCi13ZWxsIGFzIGluIGEgcHVibGlzaGVkIFdlYiBzaXRlIGlmIHRoZSBjdXN0b20gY2F0ZWdvcnkgaXMgaW5jbHVkZWQgYXMgYSB2aWV3Ci1pbiBhIGNvbmZpZ3VyYXRpb24uPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+VG8gc2F2ZSB5b3VyIG5ldyBjdXN0b20gY2F0ZWdvcnksIGNsaWNrIDxzdHJvbmc+RmlsZSAmZ3Q7IFNhdmU8L3N0cm9uZz4gb3IgY2xvc2UKLXRoZSBlZGl0b3IgYW5kIGNsaWNrIDxzdHJvbmc+WWVzPC9zdHJvbmc+IHdoZW4gcHJvbXB0ZWQgdG8gc2F2ZSB0aGUgY2hhbmdlcy48L3NwYW4+PC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Zb3UgY2FuIG5vdyB1c2UgdGhlIGN1c3RvbSBjYXRlZ29yeSBhcyBhIHZpZXcgaW4gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi48b2w+PGxpPlN3aXRjaCB0byB0aGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPi48L2xpPgotPGxpPkluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+LAotZG91YmxlIGNsaWNrIHRoZSBjb25maWd1cmF0aW9uIHRvIHdoaWNoIHlvdSB3YW50IHRvIGFkZCBhIHZpZXcuIFRoZSBjb25maWd1cmF0aW9uCi1lZGl0b3Igb3BlbnMuPC9saT4KLTxsaT5DbGljayB0aGUgPHN0cm9uZz5WaWV3czwvc3Ryb25nPiB0YWIgYW5kIHRoZW4gY2xpY2sgdGhlIDxzdHJvbmc+QWRkIFZpZXc8L3N0cm9uZz4gYnV0dG9uLgotVGhlIFNlbGVjdCBDYXRlZ29yaWVzIGRpYWxvZyBhcHBlYXJzLiBUaGUgU2VsZWN0IENhdGVnb3JpZXMgZGlhbG9nIGRpc3BsYXlzCi1hbGwgdGhlIHN0YW5kYXJkIGFuZCBjdXN0b20gY2F0ZWdvcmllcyBpbiB0aGUgY29uZmlndXJhdGlvbi48L2xpPgotPGxpPlNlbGVjdCBvbmUgb3IgbW9yZSBjYXRlZ29yaWVzIHRvIGluY2x1ZGUgYXMgYSB2aWV3IGluIHlvdXIgY29uZmlndXJhdGlvbgotYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVGhlIHZpZXcgZGlzcGxheSBwcm92aWRlcyBhIHByZXZpZXcgb2YgaG93IHRoZSB2aWV3Ci13aWxsIGFwcGVhciBuIHRoZSBwdWJsaXNoZWQgdHJlZSBicm93c2VyLjwvbGk+Ci08bGk+U2VsZWN0IGEgdmlldyB0byBkaXNwbGF5IGFzIHRoZSBkZWZhdWx0IHN0YXJ0LXVwIHZpZXcgaW4gdGhlIHB1Ymxpc2hlZAotV2ViIHNpdGUsIGFuZCB0aGVuIGNsaWNrIHRoZSA8c3Ryb25nPk1ha2UgRGVmYXVsdDwvc3Ryb25nPiBidXR0b24uPC9saT4KLTxsaT5UbyBzYXZlIHRoZSBjb25maWd1cmF0aW9uLCBjbGljayA8c3Ryb25nPkZpbGUgJmd0OyBTYXZlPC9zdHJvbmc+IG9yIGNsb3NlIHRoZSBjb25maWd1cmF0aW9uCi1lZGl0b3IgYW5kIGNsaWNrIDxzdHJvbmc+WWVzPC9zdHJvbmc+IHdoZW4gcHJvbXB0ZWQgdG8gc2F2ZSB0aGUgY2hhbmdlcy48L2xpPgotPC9vbD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyI+TWV0aG9kIENvbnRlbnQgQ2F0ZWdvcmllczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0icHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwiPlB1Ymxpc2hpbmcgT3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybi5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MzlkMzY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBSZXVzYWJsZSBDYXBhYmlsaXR5IFBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InByb2Nlc3MuaHRtbCNwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCNwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbCNjcmVhdGVhZGVsaXZlcnlwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjYXBhYmlsaXR5cGF0dGVybi5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNyZWF0ZSBhIFJldXNhYmxlIENhcGFiaWxpdHkgUGF0dGVybjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4iPjxhIG5hbWU9ImNyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIGEgUmV1c2FibGUgQ2FwYWJpbGl0eSBQYXR0ZXJuPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+PHA+QSBDYXBhYmlsaXR5IHBhdHRlcm4gaXMgYSBzcGVjaWFsIHByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZQotY2x1c3RlciBvZiBhY3Rpdml0aWVzIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQKLWRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gQ2FwYWJpbGl0eSBwYXR0ZXJucyBjYW4gYmUgdXNlZCBhcwotYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIGRlbGl2ZXJ5IHByb2Nlc3NlcyBvciBsYXJnZXIgY2FwYWJpbGl0eSBwYXR0ZXJucy4gPC9wPgotQmVmb3JlCi1jcmVhdGluZyBhIGNhcGFiaWxpdHkgcGF0dGVybjo8dWw+PGxpPlNlbGVjdCBhIG1ldGhvZCBwbHVnLWluIHRvIGhvbGQgeW91ciBwcm9jZXNzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+TWV0aG9kIFBsdWctaW48L2E+LjwvbGk+Ci08bGk+RmluZCBvciBjcmVhdGUgYSBwcm9jZXNzIHBhY2thZ2UuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPkEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uCi1vZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiBJbiBvdGhlciB3b3JkcywgYSBjYXBhYmlsaXR5Ci1wYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSBzbyB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYQotZGVsaXZlcnkgcHJvY2Vzcy4gVGhpcyBlbmFibGVzIHRoZSBwYXR0ZXJuJ3MgYWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZAotdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgZGVsaXZlcnkgcHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZwotYXBwbGllZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9ImNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY2FwYWJpbGl0eXBhdHRlcm4iPkNhcGFiaWxpdHkgUGF0dGVybjwvYT4uPGRpdiBjbGFzcz0icCI+WW91IGRvIG5vdCBuZWVkIHRvIGRldmVsb3AgeW91ciBwcm9jZXNzIGZyb20gc2NyYXRjaDsKLXlvdSBjYW4gcmV1c2UgZXhpc3RpbmcgY2FwYWJpbGl0eSBwYXR0ZXJucyBvciBldmVuIGNhcGFiaWxpdHkgcGF0dGVybiBwYXJ0cy4KLVRoZXJlIGFyZSBzZXZlcmFsIHdheXMgdG8gcG9wdWxhdGUgYSBwcm9jZXNzIHdpdGggbWV0aG9kIGVsZW1lbnRzOjx1bD48bGk+QnkgaW5jb3Jwb3JhdGluZyBpbmRpdmlkdWFsIG1ldGhvZCBlbGVtZW50cyBieSBkcmFnZ2luZyB0aGUgZWxlbWVudHMgb250bwotYW4gYWN0aXZpdHkgaW4gdGhlIHByb2Nlc3MuPC9saT4KLTxsaT5CeSBpbmNsdWRpbmcgYWxyZWFkeSBkZWZpbmVkIGNhcGFiaWxpdHkgcGF0dGVybnMuPC9saT4KLTxsaT5CeSBpbmNsdWRpbmcgcGFydHMgb2YgYWxyZWFkeSBkZWZpbmVkIGNhcGFiaWxpdHkgcGF0dGVybnMuPC9saT4KLTxsaT5CeSBjcmVhdGluZyBkZXNjcmlwdG9ycyBkaXJlY3RseSBpbiB0aGUgcHJvY2Vzcywgd2hpY2ggYXJlIGVpdGhlciB1bnJlbGF0ZWQKLXRvIGFueSBtZXRob2QgY29udGVudCBvciByZWxhdGVkIHRvIG1ldGhvZCBjb250ZW50IGF0IGEgbGF0ZXIgcG9pbnQgaW4gdGltZS48L2xpPgotPC91bD4KLTwvZGl2PgotPHA+IFRvIGNyZWF0ZSBhIGNhcGFiaWxpdHkgcGF0dGVybjo8L3A+Ci08L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9uY2UgeW91IGhhdmUgc2VsZWN0ZWQgb3IgY3JlYXRlZCBhIHByb2Nlc3MgcGFja2FnZSwgcmlnaHQgY2xpY2sKLXRoZSA8c3Ryb25nPlByb2Nlc3MgUGFja2FnZTwvc3Ryb25nPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5OZXcg4oCTJmd0OyBDYXBhYmlsaXR5IFBhdHRlcm48L3N0cm9uZz4uIFRoZSBOZXcgUHJvY2VzcyBDb21wb25lbnQKLWRpYWxvZyBib3ggYXBwZWFycy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIG5hbWUgZm9yIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gaW50byB0aGUgPHN0cm9uZz5OYW1lPC9zdHJvbmc+IGZpZWxkCi1hbmQgdGhlbiBzZWxlY3QgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgZHJvcCBkb3duIGxpc3QuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRoZSBwcm9jZXNzIGlzIGNyZWF0ZWQgYW5kIHRoZSBwcm9jZXNzIGVkaXRvcgotaXMgb3BlbmVkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgcHJvY2VzcyBlZGl0b3IsIHVuZGVyIHRoZSBEZXNjcmlwdGlvbiB0YWIsIGRvY3VtZW50IHlvdXIKLXByb2Nlc3MgdXNpbmcgdGhlIGF2YWlsYWJsZSB0ZXh0IGZpZWxkcy48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBZb3UgY2FuIHVzZSB0aGUKLVJpY2ggVGV4dCBFZGl0b3IgdG8gZWRpdCBvciBlbnRlciB0aGUgdGV4dCBmb3IgYW55IGZpZWxkIHRoYXQgaGFzIGEgdHdpc3R5Ci1zeW1ib2wgPGltZyBzcmM9InR3aXN0eSBzeW1ib2wxLkpQRyIgYWx0PSIiIC8+LiBTaW1wbHkgY2xpY2sKLXRoZSBzeW1ib2wgdG8gYWNjZXNzIHRoZSBSaWNoIFRleHQgRWRpdG9yLiBDbGljayB0aGUgc3ltYm9sIGFnYWluIHRvIGNsb3NlCi10aGUgUmljaCBUZXh0IEVkaXRvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9InJpY2h0ZXh0ZWRpdG9yLmh0bWwjcmljaHRleHRlZGl0b3IiPlJpY2ggVGV4dCBFZGl0b3I8L2E+PC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5EZWNpZGUgb24geW91ciBwcmltYXJ5IHByb2Nlc3MgYXV0aG9yaW5nIHZpZXcuIFlvdSBkZXZlbG9wIGEgcHJvY2VzcwotdXNpbmcgdGhyZWUgZGlmZmVyZW50IHZpZXdzOiA8L3NwYW4+PHVsPjxsaT48c3Ryb25nPldvcmsgQnJlYWtkb3duIFN0cnVjdHVyZTwvc3Ryb25nPjogRGVmaW5lIGEgd29yayBicmVha2Rvd24gc3RydWN0dXJlCi1pbiB5b3VyIHByb2Nlc3MuIENyZWF0ZSBpdGVyYXRpb25zIGFuZCBhY3Rpdml0aWVzIGZpcnN0LCBhbmQgdGhlbiBwb3B1bGF0ZQoteW91ciBhY3Rpdml0aWVzIGJ5IGFwcGx5aW5nIHRhc2tzIGZyb20geW91ciBtZXRob2QgY29udGVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24KLXNlZSA8YSBocmVmPSJkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUiPkRldmVsb3AgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L2E+LjwvbGk+Ci08bGk+PHN0cm9uZz5UZWFtIEFsbG9jYXRpb248L3N0cm9uZz46IERlZmluZSB3aGljaCB0ZWFtcyBhbmQgcm9sZXMgc2hhbGwgcGFydGljaXBhdGUKLWluIGFjdGl2aXRpZXMgYW5kIHRoZW4gZmluZCByZXNwb25zaWJsZSB3b3JrIHByb2R1Y3RzIGFuZCB0YXNrcyBmcm9tIHRoZXJlLgotRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlLmh0bWwiPkRldmVsb3AgYSBUZWFtIEFsbG9jYXRpb24gU3RydWN0dXJlPC9hPi48L2xpPgotPGxpPjxzdHJvbmc+V29yayBQcm9kdWN0IFVzYWdlPC9zdHJvbmc+OiBEZWZpbmUgd2hpY2ggd29yayBwcm9kdWN0cyBzaG91bGQgYmUgY3JlYXRlZAotaW4gYWN0aXZpdGllcyBhbmQgZmluZCB0YXNrcyBhbmQgcm9sZXMgZnJvbSB0aGVyZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9ImRldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZSI+RGV2ZWxvcCBhIFdvcmsgUHJvZHVjdCBVc2FnZSBTdHJ1Y3R1cmU8L2E+LjwvbGk+Ci08L3VsPgotIDxwPk9uY2UgeW91IGhhdmUgY3JlYXRlZCB5b3VyIGNhcGFiaWxpdHkgcGF0dGVybiwgeW91IG5lZWQgdG8gYXBwbHkKLWl0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSA8YSBocmVmPSJhcHBseWFjYXBhYmlsaXR5cGF0dGVybi5odG1sI2FwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuIj5BcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybjwvYT4uPC9wPgotPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08dWwgY2xhc3M9InVsbGlua3MiPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+PC9zdHJvbmc+PGJyIC8+Ci08L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0icHJvY2Vzcy5odG1sI3Byb2Nlc3MiPlByb2Nlc3M8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InByb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sI3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldyI+UHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2NyZWF0ZWFkZWxpdmVyeXByb2Nlc3MiPkNyZWF0ZSBhIERlbGl2ZXJ5IFByb2Nlc3M8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhcm9sZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhcm9sZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZWE2OTAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXJvbGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBSb2xlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhdGFzay5odG1sI2NyZWF0ZWF0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWd1aWRhbmNlLmh0bWwjY3JlYXRlZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVhcm9sZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBSb2xlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVhcm9sZSI+PGEgbmFtZT0iY3JlYXRlYXJvbGUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgYSBSb2xlPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+PHA+QSA8c3BhbiBjbGFzcz0ia2V5d29yZCI+Um9sZTwvc3Bhbj4gZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLAotYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBpbmRpdmlkdWFscy48L3A+Ci1Zb3Ugc2hvdWxkIGFsd2F5cwotY3JlYXRlIG5ldyBtZXRob2QgY29udGVudCBpbiBhIDxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+TWV0aG9kIFBsdWctaW48L2E+IHRoYXQgeW91IHByb2R1Y2UuPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBjcmVhdGUgYSByb2xlOjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RXhwYW5kIHRoZSBjb250ZW50IHBhY2thZ2UgaW4gd2hpY2ggeW91IHdhbnQgdG8gY3JlYXRlIHRoZSByb2xlLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayA8c3Ryb25nPlJvbGVzPC9zdHJvbmc+LCBhbmQgdGhlbiBzZWxlY3QgPHN0cm9uZz5OZXcgJmd0OyBSb2xlPC9zdHJvbmc+LiBUaGUKLXJvbGUgZWRpdG9yIGFwcGVhcnMgd2l0aCB0aGUgRGVzY3JpcHRpb24gdGFiIHNldCBhcyB0aGUgZGVmYXVsdC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE5hbWUgZmllbGQsIHR5cGUgYSB1bmlxdWUgbmFtZSBmb3IgeW91ciByb2xlLiBUaGUgcm9sZSBuYW1lCi1pcyB0aGUgZmlsZSBuYW1lIHRoYXQgYXBwZWFycyBpbiB0aGUgTGlicmFyeSB2aWV3Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJlc2VudGF0aW9uIG5hbWUgZmllbGQsIHR5cGUgYSBwcmVzZW50YXRpb24gbmFtZS4gVGhlIHByZXNlbnRhdGlvbgotbmFtZSBpcyB0aGUgbmFtZSB0aGF0IGFwcGVhcnMgaW4geW91ciBwdWJsaXNoZWQgY29udGVudCBhbmQgaW4gdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4uIFlvdSBjYW4gYWxzbyBtYWtlIHRoaXMgbmFtZSBhcHBlYXIgaW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4gYnkgdG9nZ2xpbmcgdGhlIDxzdHJvbmc+U2hvdyBQcmVzZW50YXRpb24gTmFtZXM8L3N0cm9uZz4gYnV0dG9uCi1pbiB0aGUgTGlicmFyeSBWaWV3IHRvb2xiYXIuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBCcmllZiBEZXNjcmlwdGlvbiBmaWVsZCwgdHlwZSBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZQotbmV3IFJvbGUuIDwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgbmV3IFJvbGUgaW4gdGhlIE1haW4gRGVzY3JpcHRpb24KLWZpZWxkLiBUaGUgbWFpbiBkZXNjcmlwdGlvbiBpcyBhIG1vcmUgZGV0YWlsZWQgdmVyc2lvbiBvZiB0aGUgZGVzY3JpcHRpb24KLXlvdSB0eXBlZCBpbnRvIHRoZSBCcmllZiBEZXNjcmlwdGlvbiBmaWVsZC4gVGhlcmUgYXJlIHRocmVlIHdheXMgeW91IGNhbiBjcmVhdGUKLXRleHQgZm9yIHRoZSBkZXNjcmlwdGlvbjo8L3NwYW4+IDx1bD48bGk+RGlyZWN0bHksIGJ5IHR5cGluZyBpdCBtYW51YWxseSBpbiB0aGUgZWRpdG9yLjwvbGk+Ci08bGk+Q29weSBmcm9tIGFub3RoZXIgc2ltaWxhciByb2xlIGFuZCB0aGVuIG1vZGlmeSBieSB1c2luZyB0aGUgZWRpdG9yLjwvbGk+Ci08bGk+Q29weSBmcm9tIGFuIEhUTUwgc291cmNlIHN1Y2ggYXMgYSBwdWJsaXNoZWQgT3BlblVQL0Jhc2ljIFdlYiBzaXRlLjwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFlvdSBjYW4gdXNlIHRoZSBSaWNoIFRleHQgRWRpdG9yIHRvIGVkaXQgb3IgZW50ZXIgdGhlIHRleHQgZm9yCi1hbnkgZmllbGQgdGhhdCBoYXMgYSB0d2lzdHkgc3ltYm9sIDxpbWcgc3JjPSJjb2xsYXBzZWQuZ2lmIiBhbHQ9IiIgLz4uIFNpbXBseSBjbGljayB0aGUgc3ltYm9sIHRvIGFjY2VzcyB0aGUgUmljaCBUZXh0IEVkaXRvci4gQ2xpY2sgdGhlCi1zeW1ib2wgYWdhaW4gdG8gY2xvc2UgdGhlIFJpY2ggVGV4dCBFZGl0b3IuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJyaWNodGV4dGVkaXRvci5odG1sI3JpY2h0ZXh0ZWRpdG9yIj5SaWNoIFRleHQgRWRpdG9yPC9hPi48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlVuZGVyIFZlcnNpb24gSW5mb3JtYXRpb24sIHByb3ZpZGUgYW55IHBlcnRpbmVudCB2ZXJzaW9uIGluZm9ybWF0aW9uCi1hYm91dCB0aGUgcm9sZS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+V29yayBQcm9kdWN0czwvc3Ryb25nPiB0YWIgYW5kIHRoZW4gY2xpY2sgdGhlIDxzdHJvbmc+QWRkPC9zdHJvbmc+IGJ1dHRvbgotdG8gdGhlIHJpZ2h0IG9mIHRoZSAiUm9sZSBpcyByZXNwb25zaWJsZSBmb3I6IiBmaWVsZC4gVGhlIFNlbGVjdCBEaWFsb2cgZm9yCi1Xb3JrIFByb2R1Y3RzIGRpYWxvZyBvcGVucy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgZnJvbSB0aGUgbGlzdC4gQSBkZXNjcmlwdGlvbiBvZgotdGhlIHdvcmsgcHJvZHVjdCB5b3Ugc2VsZWN0IGFwcGVhcnMgaW4gdGhlIEJyaWVmIERlc2NyaXB0aW9uIGZpZWxkIGF0IHRoZQotYm90dG9tIG9mIHRoZSBkaWFsb2cgYm94Ljwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFRoZSBsaXN0IG9mIHdvcmsgcHJvZHVjdHMgaW4gdGhlCi0iV29yayBwcm9kdWN0cyB0aGF0IGFyZSBvdXRwdXQgb2YgdGFza3MgdGhhdCB0aGlzIHJvbGUgcGVyZm9ybXMiIGZpZWxkIGlzCi1jYWxjdWxhdGVkIGFuZCBjYW5ub3QgYmUgY2hhbmdlZCB3aXRoIHRoZSByb2xlIGVkaXRvci4gQSB3b3JrIHByb2R1Y3QgYXBwZWFycwotaGVyZSBpZiBpdCBpcyBhbiBvdXRwdXQgb2YgYSB0YXNrIHRoYXQgdGhlIHJvbGUgcGVyZm9ybXMuPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUaGUgZGlhbG9nIGJveCBjbG9zZXMgYW5kIHRoZSAiUm9sZSBpcyByZXNwb25zaWJsZQotZm9yOiIgZmllbGQgaXMgcG9wdWxhdGVkLjwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFNlbGVjdGVkIGVsZW1lbnRzIGluIGFuIEFkZC9SZW1vdmUKLXNlY3Rpb24gZGlzcGxheSBib3RoIHRoZSBlbGVtZW50IG5hbWUgKHBsdWctaW4gbmFtZSkgYW5kIHRoZSAicGF0aCIgKHBhY2thZ2UKLW5hbWUpIHRvIHRoYXQgZWxlbWVudC48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3Ryb25nPkd1aWRhbmNlPC9zdHJvbmc+IHRhYi4gVGhpcyBwYXJ0IG9mIHRoZSBlZGl0b3IgYWxsb3dzIHlvdQotdG8gYWRkIGFuZCByZW1vdmUgZ3VpZGFuY2UgZm9yIHRoZSByb2xlLiBUbyBhZGQgZ3VpZGFuY2UsIGNsaWNrIHRoZSA8c3Ryb25nPkFkZDwvc3Ryb25nPiBidXR0b24sCi1zZWxlY3QgdGhlIGd1aWRhbmNlIHlvdSB3YW50IHRvIGFkZCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVG8gcmVtb3ZlIGd1aWRhbmNlLAotc2VsZWN0IGl0IGluIHRoZSBHdWlkYW5jZSBmaWVsZCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPi4gV2hlbiB5b3Ugc2VsZWN0Ci1hIGd1aWRhbmNlIGVsZW1lbnQsIHRoZSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgZ3VpZGFuY2UgaXMgZGlzcGxheWVkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5DYXRlZ29yaWVzPC9zdHJvbmc+IHRhYi4gQSByb2xlIGNhbiBiZSBpbmNsdWRlZCBpbiBvbmUKLW9yIG1vcmUgcm9sZXNldHMgYW5kIGFueSBudW1iZXIgb2YgY3VzdG9tIGNhdGVnb3JpZXMuIE9wZW4gdGhlIGFwcHJvcHJpYXRlCi1TZWxlY3QgZGlhbG9nIGJ5IGNsaWNraW5nIHRoZSA8c3Ryb25nPkFkZDwvc3Ryb25nPiBidXR0b24gbmV4dCB0byB0aGUgY2F0ZWdvcnkgbGlzdHMuCi1Zb3UgY2FuIHJlbW92ZSBhIHJvbGUgZnJvbSBhIGNhdGVnb3J5IGJ5IHNlbGVjdGluZyBpdCBhbmQgdGhlbiBjbGlja2luZyB0aGUgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4gYnV0dG9uLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5QcmV2aWV3PC9zdHJvbmc+IHRhYiB0byB2aWV3IHRoZSBuZXdseSBjcmVhdGVkCi1yb2xlIGFuZCB0aGVuIHNhdmUgYnkgY2xvc2luZyB0aGUgdGFiLjwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJsaW5rbGlzdCI+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPk1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhdGFzay5odG1sI2NyZWF0ZWF0YXNrIj5DcmVhdGUgYSBUYXNrPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlZ3VpZGFuY2UuaHRtbCNjcmVhdGVndWlkYW5jZSI+Q3JlYXRlIEd1aWRhbmNlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiB0aXRsZT0iVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlIG9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZyB0aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuIj5WYXJpYWJpbGl0eTwvYT48L2Rpdj48L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhdGFzay5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhdGFzay5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MTJlMjA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXRhc2suaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBUYXNrIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhcm9sZS5odG1sI2NyZWF0ZWFyb2xlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWd1aWRhbmNlLmh0bWwjY3JlYXRlZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVhdGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBUYXNrPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVhdGFzayI+PGEgbmFtZT0iY3JlYXRlYXRhc2siPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgYSBUYXNrPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+PHA+QSB0YXNrIGlzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiBFdmVyeSB0YXNrIGlzIGFzc2lnbmVkIHRvCi1hIHNwZWNpZmljIHJvbGUuIFRoZSBncmFudWxhcml0eSBvZiBhIHRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3Ci1kYXlzIGFuZCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCB1bWJlciBvZiB3b3JrIHByb2R1Y3RzLjwvcD4KLVlvdQotc2hvdWxkIGFsd2F5cyBjcmVhdGUgbmV3IG1ldGhvZCBjb250ZW50IGluIGEgPGEgaHJlZj0ibWV0aG9kcGx1Z2luLmh0bWwjbWV0aG9kcGx1Z2luIj5NZXRob2QgUGx1Zy1pbjwvYT4gdGhhdCB5b3UgcHJvZHVjZS4gPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBjcmVhdGUgYSB0YXNrOjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RXhwYW5kIHRoZSBjb250ZW50IHBhY2thZ2UgaW4gd2hpY2ggeW91IHdhbnQgdG8gY3JlYXRlIHRoZSB0YXNrLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayA8c3Ryb25nPlRhc2tzPC9zdHJvbmc+LCBhbmQgdGhlbiBzZWxlY3QgPHN0cm9uZz5OZXcgJmd0OyBUYXNrPC9zdHJvbmc+LiBUaGUKLXRhc2sgZWRpdG9yIGFwcGVhcnMgd2l0aCB0aGUgPHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPiB0YWIgc2V0IGFzIHRoZSBkZWZhdWx0Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgTmFtZSBmaWVsZCwgdHlwZSBhIHVuaXF1ZSBuYW1lIGZvciB5b3VyIHRhc2suIHRoZSB0YXNrIG5hbWUKLWlzIHRoZSBmaWxlIG5hbWUgdGhhdCBhcHBlYXJzIGluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJlc2VudGF0aW9uIG5hbWUgZmllbGQsIHR5cGUgYSBwcmVzZW50YXRpb24gbmFtZS4gVGhlIHByZXNlbnRhdGlvbgotbmFtZSBpcyB0aGUgbmFtZSB0aGF0IGFwcGVhcnMgaW4geW91ciBwdWJsaXNoZWQgY29udGVudCBhbmQgaW4gdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwiPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4uCi1Zb3UgY2FuIGFsc28gbWFrZSB0aGlzIG5hbWUgYXBwZWFyIGluIHRoZSBMaWJyYXJ5IHZpZXcgYnkgdG9nZ2xpbmcgdGhlIDxzdHJvbmc+U2hvdwotUHJlc2VudGF0aW9uIE5hbWVzPC9zdHJvbmc+IGJ1dHRvbiBpbiB0aGUgTGlicmFyeSB2aWV3IHRvb2xiYXIuPC9zcGFuPiA8L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgQnJpZWYgRGVzY3JpcHRpb24gZmllbGQsIHR5cGUgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUKLW5ldyB0YXNrLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgbmV3IHRhc2sgaW4gdGhlIE1haW4gRGVzY3JpcHRpb24KLWZpZWxkLiBUaGUgbWFpbiBkZXNjcmlwdGlvbiBpcyBhIG1vcmUgZGV0YWlsZWQgdmVyc2lvbiBvZiB0aGUgZGVzY3JpcHRpb24KLXlvdSB0eXBlZCBpbnRvIHRoZSBCcmllZiBEZXNjcmlwdGlvbiBmaWVsZC4gVGhlcmUgYXJlIHRocmVlIHdheXMgeW91IGNhbiBjcmVhdGUKLXRleHQgZm9yIHRoZSBkZXNjcmlwdGlvbjo8L3NwYW4+IDx1bD48bGk+RGlyZWN0bHksIGJ5IHR5cGluZyBpdCBtYW51YWxseSBpbiB0aGUgZWRpdG9yLjwvbGk+Ci08bGk+Q29weSBmcm9tIGFub3RoZXIgc2ltaWxhciByb2xlIGFuZCB0aGVuIG1vZGlmeSBieSB1c2luZyB0aGUgZWRpdG9yLjwvbGk+Ci08bGk+Q29weSBmcm9tIGFuIEhUTUwgc291cmNlIHN1Y2ggYXMgYSBwdWJsaXNoZWQgT3BlblVQL0Jhc2ljIFdlYiBzaXRlLjwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFlvdSBjYW4gdXNlIHRoZSBSaWNoIFRleHQgRWRpdG9yIHRvIGVkaXQgb3IgZW50ZXIgdGhlIHRleHQgZm9yCi1hbnkgZmllbGQgdGhhdCBoYXMgYSB0d2lzdHkgc3ltYm9sIDxpbWcgc3JjPSJjb2xsYXBzZWQuZ2lmIiBhbHQ9IiIgLz4uIFNpbXBseSBjbGljayB0aGUgc3ltYm9sIHRvIGFjY2VzcyB0aGUgUmljaCBUZXh0IEVkaXRvci4gQ2xpY2sgdGhlCi1zeW1ib2wgYWdhaW4gdG8gY2xvc2UgdGhlIFJpY2ggVGV4dCBFZGl0b3IuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJyaWNodGV4dGVkaXRvci5odG1sI3JpY2h0ZXh0ZWRpdG9yIj5SaWNoIFRleHQgRWRpdG9yPC9hPi48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNvbXBsZXRlIHRoZSBvdGhlciB0YXNrIHNwZWNpZmljIGZpZWxkcyBpbiBEZXRhaWwgSW5mb3JtYXRpb24gYXMKLW5lZWRlZC4gU2VlIDxhIGhyZWY9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiPlZhcmlhYmlsaXR5PC9hPiBmb3IKLWluZm9ybWF0aW9uIG9uIGNyZWF0aW5nIHZhcmlhYmlsaXR5LiA8L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gdGFiLiBUaGUgU3RlcHMgRWRpdG9yIGFwcGVhcnMuPC9zcGFuPiA8ZGl2IGNsYXNzPSJwIj5BCi10YXNrIGNhbiBoYXZlIGEgc2VyaWVzIG9mIHN0ZXBzIHRoYXQgZGV0YWlsIGhvdyB0byBwZXJmb3JtIHRoYXQgdGFzay4gVGhlCi1TdGVwIEVkaXRvciBhbGxvd3MgeW91IHRvOjx1bD48bGk+Q3JlYXRlIGEgbmV3IHN0ZXA8dWw+PGxpPkNsaWNrIHRoZSA8c3Ryb25nPk5ldzwvc3Ryb25nPiBidXR0b24uPC9saT4KLTxsaT5HaXZlIHRoZSBUYXNrIGEgbmFtZSBpbiB0aGUgPHN0cm9uZz5OYW1lPC9zdHJvbmc+IGZpZWxkLjwvbGk+Ci08bGk+RGVzY3JpYmUgdGhlIFRhc2sgaW4gdGhlIDxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz4gZmllbGQuPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPlJlbW92ZSBhIHN0ZXA8dWw+PGxpPlNlbGVjdCB0aGUgc3RlcCB0byByZW1vdmUgaW4gdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gZmllbGQuPC9saT4KLTxsaT5DbGljayB0aGUgPHN0cm9uZz5EZWxldGU8L3N0cm9uZz4gYnV0dG9uLjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5Nb3ZlIGEgc3RlcCB1cCB0aGUgbGlzdDx1bD48bGk+U2VsZWN0IHRoZSBzdGVwIHlvdSB3YW50IHRvIG1vdmUgdXAuPC9saT4KLTxsaT5DbGljayB0aGUgPHN0cm9uZz5Nb3ZlIFVwPC9zdHJvbmc+IGJ1dHRvbi48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+TW92ZSBhIHN0ZXAgZG93biB0aGUgbGlzdDx1bD48bGk+U2VsZWN0IHRoZSBzdGVwIHlvdSB3YW50IHRvIG1vdmUgZG93bi48L2xpPgotPGxpPkNsaWNrIHRoZSA8c3Ryb25nPk1vdmUgRG93bjwvc3Ryb25nPiBidXR0b248L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5Sb2xlczwvc3Ryb25nPiB0YWIuIFRoaXMgcGFydCBvZiB0aGUgZWRpdG9yIGFsbG93cyB5b3UKLXRvIGRlZmluZSB0aGUgcm9sZXMgdGhhdCBwZXJmb3JtIHRoZSB0YXNrLiBZb3Ugc2hvdWxkIHNlbGVjdCBhIHJvbGUgYXMgdGhlCi1QZXJmb3JtaW5nIFJvbGUgZm9yIHRoaXMgdGFzay4gWW91IGNhbiBhbHNvIGFkZCBvbmUgb3IgbW9yZSByb2xlcyBhcyBBZGRpdGlvbmFsCi1QZXJmb3JtZXJzLiBUbyBhZGQgYSByb2xlLCBjbGljayB0aGUgPHN0cm9uZz5TZWxlY3Q8L3N0cm9uZz4gb3IgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uIGFzCi1hcHByb3ByaWF0ZSwgc2VsZWN0IHRoZSByb2xlIHlvdSB3YW50IHRvIGFkZCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVG8KLXJlbW92ZSBhIHJvbGUsIHNlbGVjdCBpdCBpbiB0aGUgR3VpZGFuY2UgYm94LCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPkNsZWFyPC9zdHJvbmc+IG9yIDxzdHJvbmc+UmVtb3ZlPC9zdHJvbmc+IGFzCi1hcHByb3ByaWF0ZS4gV2hlbiB5b3Ugc2VsZWN0IGEgcm9sZSB0aGUgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhhdCByb2xlIGlzCi1kaXNwbGF5ZWQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3Ryb25nPldvcmsgUHJvZHVjdHM8L3N0cm9uZz4gdGFiLiBUaGlzIHBhcnQgb2YgdGhlIGVkaXRvciBhbGxvd3MKLXlvdSB0byBkZWZpbmUgdGhlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciB0aGlzIHRhc2suCi1Zb3UgY2FuIHNlbGVjdCBhbnkgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMgYXMgTWFuZGF0b3J5IElucHV0cywgT3B0aW9uYWwgSW5wdXRzLAotYW5kIE91dHB1dHMuIFRvIGFkZCBhIHdvcmsgcHJvZHVjdCwgY2xpY2sgdGhlIGFwcHJvcHJpYXRlIDxzdHJvbmc+QWRkPC9zdHJvbmc+IGJ1dHRvbiwKLXNlbGVjdCB0aGUgd29yayBwcm9kdWN0cyB5b3Ugd2FudCB0byBhZGQsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRvIHJlbW92ZQotYSB3b3JrIHByb2R1Y3QsIHNlbGVjdCBpdCBpbiB0aGUgYXBwcm9wcmlhdGUgYm94IGFuZCB0aGVuIGNsaWNrIHRoZSBjb3JyZXNwb25kaW5nIDxzdHJvbmc+UmVtb3ZlPC9zdHJvbmc+IGJ1dHRvbi4KLVdoZW4geW91IHNlbGVjdCBhIHdvcmsgcHJvZHVjdCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIHdvcmsgcHJvZHVjdCBpcwotZGlzcGxheWVkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5HdWlkYW5jZTwvc3Ryb25nPiB0YWIuIFRoaXMgcGFydCBvZiB0aGUgZWRpdG9yIGFsbG93cyB5b3UKLXRvIGFkZCBhbmQgcmVtb3ZlIGd1aWRhbmNlIGZvciB0aGUgdGFzay4gVG8gYWRkIGd1aWRhbmNlLCBjbGljayB0aGUgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uLAotc2VsZWN0IHRoZSBndWlkYW5jZSB5b3Ugd2FudCB0byBhZGQsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRvIHJlbW92ZSBndWlkYW5jZSwKLXNlbGVjdCBpdCBpbiB0aGUgR3VpZGFuY2UgYm94IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+UmVtb3ZlPC9zdHJvbmc+LiBXaGVuIHlvdSBzZWxlY3QKLWEgZ3VpZGFuY2UgZWxlbWVudCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGd1aWRhbmNlIGlzIGRpc3BsYXllZC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+Q2F0ZWdvcmllczwvc3Ryb25nPiB0YWIuIEEgdGFzayBjYW4gYmUgaW5jbHVkZWQgaW4gb25lCi1kaXNjaXBsaW5lIGFuZCBhbnkgbnVtYmVyIG9mIGN1c3RvbSBjYXRlZ29yaWVzLiBPcGVuIHRoZSBTZWxlY3QgZGlhbG9nIGJ5Ci1jbGlja2luZyB0aGUgYXBwcm9wcmlhdGUgPHN0cm9uZz5TZWxlY3Q8L3N0cm9uZz4gb3IgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uIG5leHQgdG8gdGhlIGNhdGVnb3J5Ci1saXN0cy4gU2VsZWN0IGEgc2luZ2xlIGRpc2NpcGxpbmUgb3IgYW55IG51bWJlciBvZiBjdXN0b20gY2F0ZWdvcmllcywgYW5kCi10aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFlvdSBjYW4gcmVtb3ZlIGEgdGFzayBmcm9tIGEgY2F0ZWdvcnkgYnkgc2VsZWN0aW5nIGl0Ci1hbmQgdGhlbiBjbGlja2luZyB0aGUgYXBwcm9wcmlhdGUgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4gYnV0dG9uLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5QcmV2aWV3PC9zdHJvbmc+IHRhYiB0byB2aWV3IHRoZSBuZXdseSBjcmVhdGVkIHRhc2sgYXMKLWl0IHdpbGwgYXBwZWFyIGluIGEgcHVibGlzaGVkIFdlYiBwYWdlLCBhbmQgdGhlbiBzYXZlIGJ5IGNsb3NpbmcgdGhlIHRhYi48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIj5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+TWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIHRpdGxlPSJWYXJpYWJpbGl0eSBhbGxvd3MgZWxlbWVudHMgaW4gb25lIGNvbnRlbnQgcGFja2FnZSB0byBpbmZsdWVuY2Ugb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQuIFZhcmlhYmlsaXR5IGVuYWJsZXMgY2hhbmdlcyB0byB0aGUgY29udGVudCB3aGlsZSBrZWVwaW5nIHRoZSBjaGFuZ2VzIHNlcGFyYXRlIGFuZCBvcHRpb25hbC4iPlZhcmlhYmlsaXR5PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFyb2xlLmh0bWwjY3JlYXRlYXJvbGUiPkNyZWF0ZSBhIFJvbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sI2NyZWF0ZWF3b3JrcHJvZHVjdCI+Q3JlYXRlIGEgV29yayBQcm9kdWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVndWlkYW5jZS5odG1sI2NyZWF0ZWd1aWRhbmNlIj5DcmVhdGUgR3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVmNzRmOTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhd29ya3Byb2R1Y3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBXb3JrIFByb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhcm9sZS5odG1sI2NyZWF0ZWFyb2xlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhdGFzay5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVndWlkYW5jZS5odG1sI2NyZWF0ZWd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlYXdvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlYXdvcmtwcm9kdWN0Ij48YSBuYW1lPSJjcmVhdGVhd29ya3Byb2R1Y3QiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj48ZGl2IGNsYXNzPSJwIj5Xb3JrIHByb2R1Y3QgaXMgYSBnZW5lcmFsIHRlcm0gZm9yIHRhc2sgaW5wdXRzIGFuZCBvdXRwdXRzLiBUaGVyZQotYXJlIHRocmVlIHR5cGVzIG9mIHdvcmsgcHJvZHVjdDo8dWw+PGxpPjxhIGhyZWY9ImFydGlmYWN0Lmh0bWwjYXJ0aWZhY3QiPkFydGlmYWN0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ib3V0Y29tZS5odG1sI291dGNvbWUiPk91dGNvbWU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJkZWxpdmVyYWJsZS5odG1sI2RlbGl2ZXJhYmxlIj5EZWxpdmVyYWJsZTwvYT48L2xpPgotPC91bD4KLTwvZGl2PgotWW91IHNob3VsZCBhbHdheXMgY3JlYXRlIG5ldyBtZXRob2QgY29udGVudCBpbiBhIDxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+TWV0aG9kIFBsdWctaW48L2E+IHRoYXQgeW91IHByb2R1Y2UuPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBjcmVhdGUgYSB3b3JrIHByb2R1Y3Q6PC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5FeHBhbmQgdGhlIENvbnRlbnQgUGFja2FnZSBpbiB3aGljaCB5b3Ugd2FudCB0byBjcmVhdGUgdGhlIHdvcmsKLXByb2R1Y3QuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIDxzdHJvbmc+V29yayBQcm9kdWN0czwvc3Ryb25nPiwgYW5kIHRoZW4gc2VsZWN0IG9uZSBvZiB0aGUgZm9sbG93aW5nOjwvc3Bhbj4gPHVsPjxsaT48c3Ryb25nPk5ldyAmZ3Q7IEFydGlmYWN0PC9zdHJvbmc+PC9saT4KLTxsaT48c3Ryb25nPk5ldyAmZ3Q7IE91dGNvbWU8L3N0cm9uZz48L2xpPgotPGxpPjxzdHJvbmc+TmV3ICZndDsgRGVsaXZlcmFibGU8L3N0cm9uZz48L2xpPgotPC91bD4KLVRoZSBXb3JrIFByb2R1Y3QgZWRpdG9yIGZvciB0aGUgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgeW91IGFyZQotY3JlYXRpbmcgYXBwZWFycyB3aXRoIHRoZSBEZXNjcmlwdGlvbiB0YWIgc2V0IGFzIHRoZSBkZWZhdWx0LjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBOYW1lIGZpZWxkLCB0eXBlIGEgdW5pcXVlIG5hbWUgZm9yIHlvdXIgd29yayBwcm9kdWN0LiBUaGUKLXdvcmsgcHJvZHVjdCBuYW1lIGlzIHRoZSBmaWxlIG5hbWUgdGhhdCBhcHBlYXJzIGluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+LiA8L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByZXNlbnRhdGlvbiBuYW1lIGZpZWxkLCB0eXBlIGEgcHJlc2VudGF0aW9uIG5hbWUuIHRoZSBwcmVzZW50YXRpb24KLW5hbWUgaXMgdGhlIG5hbWUgdGhhdCBhcHBlYXJzIGluIHlvdXIgcHVibGlzaGVkIGNvbnRlbnQgYW5kIGluIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+LiBZb3UgY2FuIGFsc28gbWFrZSB0aGlzIG5hbWUgYXBwZWFyIGluIHRoZSBsaWJyYXJ5Ci12aWV3IGJ5IHRvZ2dsaW5nIHRoZSA8c3Ryb25nPlNob3cgUHJlc2VudGF0aW9uIE5hbWVzPC9zdHJvbmc+IGJ1dHRvbiBpbiB0aGUgbGlicmFyeQotdmlldyB0b29sYmFyLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgQnJpZWYgRGVzY3JpcHRpb24gZmllbGQsIHR5cGUgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUKLW5ldyB3b3JrIHByb2R1Y3QuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlR5cGUgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBuZXcgd29yayBwcm9kdWN0IGluIHRoZQotTWFpbiBEZXNjcmlwdGlvbiBmaWVsZC4gVGhlIG1haW4gZGVzY3JpcHRpb24gaXMgYSBtb3JlIGRldGFpbGVkIHZlcnNpb24gb2YKLXRoZSBkZXNjcmlwdGlvbiB5b3UgdHlwZWQgaW50byB0aGUgQnJpZWYgRGVzY3JpcHRpb24gZmllbGQuIFRoZXJlIGFyZSB0aHJlZQotd2F5cyB0byBjcmVhdGUgdGV4dCBmb3IgdGhlIGRlc2NyaXB0aW9uOjwvc3Bhbj4gPHVsPjxsaT5EaXJlY3RseSwgYnkgdHlwaW5nIGl0IG1hbnVhbGx5IGluIHRoZSBlZGl0b3IuPC9saT4KLTxsaT5Db3B5IGZyb20gYW5vdGhlciBzaW1pbGFyIHdvcmsgcHJvZHVjdCBhbmQgdGhlbiBtb2RpZnkgdXNpbmcgdGhlIGVkaXRvci48L2xpPgotPGxpPkNvcHkgZnJvbSBhbiBIVE1MIHNvdXJjZSwgc3VjaCBhcyBhIHB1Ymxpc2hlZCBPcGVuVVAvQmFzaWMgV2ViIHNpdGUuPC9saT4KLTwvdWw+Ci08ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91IGNhbiB1c2UgdGhlIFJpY2ggVGV4dCBFZGl0b3IgdG8gZWRpdCBvciBlbnRlciB0aGUgdGV4dCBmb3IKLWFueSBmaWVsZCB0aGF0IGhhcyBhIHR3aXN0eSBzeW1ib2wgPGltZyBzcmM9ImNvbGxhcHNlZC5naWYiIGFsdD0iIiAvPi4gU2ltcGx5IGNsaWNrIHRoZSBzeW1ib2wgdG8gYWNjZXNzIHRoZSBSaWNoIFRleHQgRWRpdG9yLiBDbGljayB0aGUKLXN5bWJvbCBhZ2FpbiB0byBjbG9zZSB0aGUgUmljaCBUZXh0IEVkaXRvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9InJpY2h0ZXh0ZWRpdG9yLmh0bWwjcmljaHRleHRlZGl0b3IiPlJpY2ggVGV4dCBFZGl0b3I8L2E+LjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VW5kZXIgPHN0cm9uZz5Ob3RhdGlvbjwvc3Ryb25nPiwgcHJvdmlkZSBhbnkgbm90YXRpb25zIGFib3V0IHRoZSBXb3JrIFByb2R1Y3QuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gQXJ0aWZhY3RzIGFuZCBEZWxpdmVyYWJsZXMgY29udGFpbiB0aGUgTm90YXRpb24gZmllbGRzLCB3aGlsZQotT3V0Y29tZXMgZG8gbm90LjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VW5kZXIgPHN0cm9uZz5JY29uPC9zdHJvbmc+IHlvdSBjYW4gc2VsZWN0IGEgbm9kZSBpY29uIHRvIGFwcGVhciB3aXRoIHRoZQotd29yayBwcm9kdWN0IGluIHRoZSBMaWJyYXJ5IGFuZCBDb25maWd1cmF0aW9uIHZpZXdzIGFuZCBpbiB0aGUgdHJlZSBicm93c2VyCi1pbiBhIHB1Ymxpc2hlZCBXZWIgc2l0ZS4gVGhlIG5vZGUgaWNvbiBzaG91bGQgYmUgMTYgeCAxNiBwaXhlbHMuIFlvdSBjYW4gYWxzbwotc2VsZWN0IGEgU2hhcGUgaWNvbiB0byBhcHBlYXIgYXQgdGhlIHRvcCBvZiB0aGUgcHVibGlzaGVkIFdlYiBwYWdlIGZvciB0aGUKLXdvcmsgcHJvZHVjdC4gdGhlIFNoYXBlIGljb24gc2hvdWxkIGJlIDMyIHggMzIgcGl4ZWxzLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Db21wbGV0ZSB0aGUgb3RoZXIgd29yayBwcm9kdWN0IHNwZWNpZmljIGZpZWxkcyBhcyBuZWVkZWQuIFNlZSA8YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5Ij5WYXJpYWJpbGl0eTwvYT4gZm9yIGluZm9ybWF0aW9uCi1vbiBhZGRpbmcgdmFyaWFiaWxpdHkgdG8geW91ciB3b3JrIHByb2R1Y3QuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgPHN0cm9uZz5HdWlkYW5jZTwvc3Ryb25nPiB0YWIuIFRoaXMgcGFydCBvZiB0aGUgZWRpdG9yIGFsbG93cwoteW91IHRvIGFkZCBhbmQgcmVtb3ZlIGd1aWRhbmNlIGZvciB0aGUgd29yayBwcm9kdWN0LiBUbyBhZGQgZ3VpZGFuY2UsIGNsaWNrCi10aGUgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uLCBzZWxlY3QgdGhlIGd1aWRhbmNlIHlvdSB3YW50IHRvIGFkZCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4KLVRvIHJlbW92ZSBndWlkYW5jZSwgc2VsZWN0IGl0IGluIHRoZSBHdWlkYW5jZSBmaWVsZCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4uCi1XaGVuIHlvdSBzZWxlY3QgYSBndWlkYW5jZSBlbGVtZW50IHRoZSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgZ3VpZGFuY2UgaXMKLWRpc3BsYXllZC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSA8c3Ryb25nPkNhdGVnb3JpZXM8L3N0cm9uZz4gdGFiLiBBIHdvcmsgcHJvZHVjdCBjYW4gYmUgaW5jbHVkZWQKLWluIG9uZSBkb21haW4sIGFueSBudW1iZXIgb2Ygd29yayBwcm9kdWN0IHR5cGVzLCBhbmQgYW55IG51bWJlciBvZiBjdXN0b20KLWNhdGVnb3JpZXMuIE9wZW4gdGhlIGFwcHJvcHJpYXRlIFNlbGVjdCBkaWFsb2cgYnkgY2xpY2tpbmcgdGhlIDxzdHJvbmc+U2VsZWN0PC9zdHJvbmc+IG9yIDxzdHJvbmc+QWRkPC9zdHJvbmc+IGJ1dHRvbgotbmV4dCB0byB0aGUgY2F0ZWdvcnkgbGlzdHMuIFNlbGVjdCBhIHNpbmdsZSBkb21haW4gb3IgYW55IG51bWJlciBvZiB3b3JrIHByb2R1Y3QKLWtpbmRzIG9yIGN1c3RvbSBjYXRlZ29yaWVzIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFlvdSBjYW4gcmVtb3ZlIGEgd29yawotcHJvZHVjdCBmcm9tIGEgY2F0ZWdvcnkgYnkgc2VsZWN0aW5nIGl0IGFuZCB0aGVuIGNsaWNraW5nIHRoZSBhcHByb3ByaWF0ZSA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPiBidXR0b24uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHRoZSB3b3JrIHByb2R1Y3QgaXMgYSBkZWxpdmVyYWJsZSwgeW91IGNhbiBkZWZpbmUgd2hhdCB0aGUgZGVsaXZlcmFibGUKLWNvbnNpc3RzIG9mIG9uIHRoZSBEZWxpdmVyYWJsZSBQYXJ0cyB0YWIuIENsaWNrIHRoZSA8c3Ryb25nPkRlbGl2ZXJhYmxlIFBhcnRzPC9zdHJvbmc+IHRhYi4KLVRoaXMgcGFydCBvZiB0aGUgZWRpdG9yIG9ubHkgYXBwZWFycyBmb3IgZGVsaXZlcmFibGVzIGFuZCBpdCBhbGxvd3MgeW91IHRvCi1hZGQgb3RoZXIgd29yayBwcm9kdWN0cyBhcyBwYXJ0IG9mIHRoZSBkZWxpdmVyYWJsZS4gVG8gYWRkIHdvcmsgcHJvZHVjdHMsCi1jbGljayB0aGUgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uLCBzZWxlY3QgdGhlIHdvcmsgcHJvZHVjdHMgeW91IHdhbnQgdG8gYWRkLCBhbmQKLXRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVG8gcmVtb3ZlIGEgd29yayBwcm9kdWN0LCBzZWxlY3QgaXQgaW4gdGhlIHdvcmsgcHJvZHVjdHMKLWFzIGRlbGl2ZXJhYmxlIHBhcnRzOiBmaWVsZCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4uIFdoZW4geW91IHNlbGVjdAotYSB3b3JrIHByb2R1Y3QgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSB3b3JrIHByb2R1Y3QgaXMgZGlzcGxheWVkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIDxzdHJvbmc+UHJldmlldzwvc3Ryb25nPiB0YWIgdG8gdmlldyB0aGUgbmV3bHkgY3JlYXRlZCB3b3JrIHByb2R1Y3QsCi1hbmQgdGhlbiBzYXZlIGJ5IGNsb3NpbmcgdGhlIHRhYi48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIj5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgdGl0bGU9IlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZSBvciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcgdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLiI+VmFyaWFiaWxpdHk8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXJvbGUuaHRtbCNjcmVhdGVhcm9sZSI+Q3JlYXRlIGEgUm9sZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXRhc2suaHRtbCI+Q3JlYXRlIGEgVGFzazwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlZ3VpZGFuY2UuaHRtbCNjcmVhdGVndWlkYW5jZSI+Q3JlYXRlIEd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlZ3VpZGFuY2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlZ3VpZGFuY2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTlmMzMwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWd1aWRhbmNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIEd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRlbWV0aG9kY29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXJvbGUuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXRhc2suaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q3JlYXRlIEd1aWRhbmNlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVndWlkYW5jZSI+PGEgbmFtZT0iY3JlYXRlZ3VpZGFuY2UiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgR3VpZGFuY2U8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj48cD5HdWlkYW5jZSBpcyBhIGdlbmVyYWwgdGVybSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIDxhIGhyZWY9InJvbGUuaHRtbCNyb2xlIj5Sb2xlPC9hPiwgPGEgaHJlZj0idGFzay5odG1sI3Rhc2siPlRhc2s8L2E+LCBhbmQgPGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCI+V29yayBQcm9kdWN0PC9hPi4gR3VpZGFuY2UKLXByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIGhvdyB0byBwZXJmb3JtIHlvdXIgcm9sZSwgaG93IHRvIGNyZWF0ZSBhIHdvcmsgcHJvZHVjdCwKLWhvdyB0byBwZXJmb3JtIHlvdXIgdGFzaywgYW5kIHNvIG9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+LjwvcD4KLTxwPllvdSBzaG91bGQgYWx3YXlzIGNyZWF0ZSBuZXcgPGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+TWV0aG9kIENvbnRlbnQ8L2E+IGluIGEgPGEgaHJlZj0ibWV0aG9kcGx1Z2luLmh0bWwjbWV0aG9kcGx1Z2luIj5NZXRob2QgUGx1Zy1pbjwvYT4gdGhhdAoteW91IHByb2R1Y2UuPC9wPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBjcmVhdGU8c3Ryb25nPkd1aWRhbmNlPC9zdHJvbmc+OjwvcD4KLTwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RXhwYW5kIHRoZSBDb250ZW50IFBhY2thZ2UgaW4gd2hpY2ggeW91IHdhbnQgdG8gY3JlYXRlIEd1aWRhbmNlCi11bnRpbCB5b3Ugc2VlIHRoZSBNZXRob2QgRWxlbWVudHMgKFJvbGVzLCBUYXNrcywgV29yayBQcm9kdWN0cywgR3VpZGFuY2UpLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayA8c3Ryb25nPkd1aWRhbmNlPC9zdHJvbmc+IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+TmV3ICZndDsgImd1aWRhbmNlIHR5cGUiPC9zdHJvbmc+LgotVGhlIGd1aWRhbmNlIGVkaXRvciBmb3IgdGhhdCBwYXJ0aWN1bGFyIGd1aWRhbmNlIHR5cGUgb3BlbnMuIDwvc3Bhbj4gPGRpdiBjbGFzcz0icCI+VGhlCi1mb2xsb3dpbmcgZ3VpZGFuY2UgdHlwZXMgaGF2ZSB0aGUgc2FtZSBlZGl0b3Igd2hpY2ggaW5jbHVkZXMgYSBEZXNjcmlwdGlvbgotdGFiIGFuZCBhIFByZXZpZXcgdGFiOjx1bD48bGk+PGEgaHJlZj0iY29uY2VwdC5odG1sI2NvbmNlcHQiPkNvbmNlcHQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSJleGFtcGxlLmh0bWwjZXhhbXBsZSI+RXhhbXBsZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imd1aWRlbGluZS5odG1sI2d1aWRlbGluZSI+R3VpZGVsaW5lPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icmVwb3J0Lmh0bWwjcmVwb3J0Ij5SZXBvcnQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSJyZXVzYWJsZWFzc2V0Lmh0bWwjcmV1c2FibGVhc3NldCI+UmV1c2FibGUgQXNzZXQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSJyb2FkbWFwLmh0bWwjcm9hZG1hcCI+Um9hZG1hcDwvYT48L2xpPgotPGxpPjxhIGhyZWY9InN1cHBvcnRpbmdtYXRlcmlhbC5odG1sIj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idGVybWRlZmluaXRpb24uaHRtbCN0ZXJtZGVmaW5pdGlvbiI+VGVybSBEZWZpbml0aW9uPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idG9vbG1lbnRvci5odG1sI3Rvb2xtZW50b3IiPlRvb2wgTWVudG9yPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0id2hpdGVwYXBlci5odG1sI3doaXRlcGFwZXIiPldoaXRlcGFwZXI8L2E+PC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlVzZSB0aGUgZmllbGRzIGluIHRoZSBjb250ZW50IGVsZW1lbnQgZWRpdG9yIHRvIHNwZWNpZnkgdGhlIGd1aWRhbmNlCi1kZXRhaWxzLiBTdGFydCBieSBhc3NpZ25pbmcgYSB1bmlxdWUgbmFtZSB0byB0aGUgZ3VpZGFuY2UgZWxlbWVudCBhbG9uZyB3aXRoCi1hIHByZXNlbnRhdGlvbiBuYW1lIHRoYXQgaXMgdXNlZCBhcyB0aGUgZXh0ZXJuYWwgdmlzaWJsZSBuYW1lIHdoZW4gb3RoZXIgZWxlbWVudHMKLXJlZmVyIHRvIHRoaXMgZWxlbWVudCwgb3Igd2hlbiB0aGUgZWxlbWVudCBpcyBwdWJsaXNoZWQuIEV2ZXJ5IGd1aWRhbmNlIHR5cGUKLWhhcyBzcGVjaWZpYyBjb250ZW50IGZpZWxkcyBpbiB0aGUgY29udGVudCBlZGl0b3IgdGhhdCBhcmUgZGlzdHJpYnV0ZWQgb3ZlcgotdHdvIG9yIG1vcmUgc3RhY2tlZCB0YWJzLiBVc2UgdGhlIGNvbnRlbnQgZmllbGRzIHRvIGRlc2NyaWJlIHlvdXIgZ3VpZGFuY2UKLXR5cGUuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91IGNhbiB1c2UgdGhlIFJpY2ggVGV4dCBFZGl0b3IgdG8gZWRpdCBvciBlbnRlcgotdGhlIHRleHQgZm9yIGFueSBmaWVsZCB0aGF0IGhhcyBhIHR3aXN0eSBzeW1ib2wgPGltZyBzcmM9ImNvbGxhcHNlZC5naWYiIGFsdD0iIiAvPi4gU2ltcGx5IGNsaWNrIHRoZSBzeW1ib2wgdG8gYWNjZXNzIHRoZSBSaWNoIFRleHQgRWRpdG9yLgotQ2xpY2sgdGhlIHN5bWJvbCBhZ2FpbiB0byBjbG9zZSB0aGUgUmljaCBUZXh0IEVkaXRvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24KLXNlZSA8YSBocmVmPSJyaWNodGV4dGVkaXRvci5odG1sI3JpY2h0ZXh0ZWRpdG9yIj5SaWNoIFRleHQgRWRpdG9yPC9hPi48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBJY29uIHNlY3Rpb24sIHNlbGVjdCBhIE5vZGUgaWNvbiB0byBhcHBlYXIgd2l0aCB0aGUgd29yawotcHJvZHVjdCBpbiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPiBhbmQgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPiBhbmQKLWluIHRoZSB0cmVlIGJyb3dzZXIgaW4gYSBwdWJsaXNoZWQgV2ViIHNpdGUuIFRoZSBub2RlIGljb24gc2hvdWxkIGJlIDE2IHgKLTE2IHBpeGVscy4gWW91IGNhbiBhbHNvIHNlbGVjdCBhIFNoYXBlIGljb24gdG8gYXBwZWFyIGF0IHRoZSB0b3Agb2YgdGhlIHB1Ymxpc2hlZAotcGFnZSBmb3IgdGhlIHdvcmsgcHJvZHVjdC4gVGhlIHNoYXBlIGljb24gc2hvdWxkIGJlIDMyIHggMzIgcGl4ZWxzLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIDxzdHJvbmc+UHJldmlldzwvc3Ryb25nPiB0YWIgdG8gdmlldyB0aGUgbmV3bHkgY3JlYXRlZCB3b3JrIHByb2R1Y3QKLWFuZCB0aGVuIHNhdmUgYnkgY2xvc2luZyB0aGUgdGFiLjwvc3Bhbj48L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPkl0IGlzIHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgdHlwZXMgb2Ygc29tZSB0eXBlcyBvZiBndWlkYW5jZSB0byBhCi1saW1pdGVkIG51bWJlciBvZiBvdGhlciBndWlkYW5jZSB0eXBlcy4gVG8gY2hhbmdlIGEgZ3VpZGFuY2UgdHlwZSwgY2xpY2sgdGhlIDxzdHJvbmc+Q2hhbmdlCi1UeXBlPC9zdHJvbmc+IGJ1dHRvbiBhbmQgc2VsZWN0IGFuIGF2YWlsYWJsZSBuZXcgdHlwZS48cD5JZiB0aGUgdHlwZSBvZiBndWlkYW5jZQotaXMgYSA8YSBocmVmPSJwcmFjdGljZS5odG1sI3ByYWN0aWNlIj5QcmFjdGljZTwvYT4sIHlvdSBjYW4gYWRkCi1yZWZlcmVuY2VzIHRvIG90aGVyIGVsZW1lbnRzLiBJZiB0aGUgZ3VpZGFuY2UgaXMgYSA8YSBocmVmPSJ0ZW1wbGF0ZS5odG1sIj5UZW1wbGF0ZTwvYT4sCi15b3UgY2FuIGF0dGFjaCBhIGZpbGUgdG8gdGhlIGd1aWRhbmNlLjwvcD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCI+Q3JlYXRlIE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50Ij5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFyb2xlLmh0bWwiPkNyZWF0ZSBhIFJvbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF0YXNrLmh0bWwiPkNyZWF0ZSBhIFRhc2s8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sI2NyZWF0ZWF3b3JrcHJvZHVjdCI+Q3JlYXRlIGEgV29yayBQcm9kdWN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlbWV0aG9kY29udGVudC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExZjI2ZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgTWV0aG9kIENvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFyb2xlLmh0bWwjY3JlYXRlYXJvbGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF0YXNrLmh0bWwjY3JlYXRlYXRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVndWlkYW5jZS5odG1sI2NyZWF0ZWd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhcm9sZS5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhdGFzay5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlZ3VpZGFuY2UuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idmFyaWFiaWxpdHkuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlbWV0aG9kY29udGVudCI+PGEgbmFtZT0iY3JlYXRlbWV0aG9kY29udGVudCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPjxwPk1ldGhvZCBjb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsCi1kZXNjcmliaW5nIGhvdyBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlCi1wbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiBQcm9jZXNzZXMgdGFrZSB0aGUKLW1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQKLXRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLjwvcD4KLTxwPk1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGFyZTo8L3A+Ci08dWw+PGxpPjxhIGhyZWY9InRhc2suaHRtbCN0YXNrIj5UYXNrPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icm9sZS5odG1sI3JvbGUiPlJvbGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3Q8L2E+PC9saT4KLTxsaT48YSBocmVmPSJndWlkYW5jZS5odG1sIj5HdWlkYW5jZTwvYT48L2xpPgotPC91bD4KLUNsaWNrIGhlcmUgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgPGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+TWV0aG9kIENvbnRlbnQ8L2E+LjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gY3JlYXRlIG1ldGhvZCBjb250ZW50OjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4sCi1leHBhbmQgdGhlIGNvbnRlbnQgcGFja2FnZSBpbiB3aGljaCB5b3Ugd2FudCB0byBjcmVhdGUgbmV3IG1ldGhvZCBjb250ZW50Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayB0aGUgZm9sZGVyIGNvbnRhaW5pbmcgdGhlIHR5cGUgb2YgbWV0aG9kIGVsZW1lbnQgeW91Ci13YW50IHRvIGNyZWF0ZSwgY2xpY2sgPHN0cm9uZz5OZXc8L3N0cm9uZz4gYW5kIHRoZW4gc2VsZWN0IHRoZSBlbGVtZW50IHRoYXQgYXBwZWFycy4KLVRoZSBuZXcgZWxlbWVudCBpcyBjcmVhdGVkIGFuZCBpdHMgcmVzcGVjdGl2ZSBlZGl0b3Igb3BlbnMuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gRm9yCi1Xb3JrIFByb2R1Y3RzLCBjaG9vc2UgYmV0d2VlbiBBcnRpZmFjdCwgT3V0Y29tZSwgb3IgRGVsaXZlcmFibGUuIEZvciBHdWlkYW5jZSwKLWNob29zZSBmcm9tIHRoZSBsaXN0IG9mIGd1aWRhbmNlIHR5cGVzLjwvZGl2PgotPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08dWwgY2xhc3M9InVsbGlua3MiPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSJjcmVhdGVhcm9sZS5odG1sIj5DcmVhdGUgYSBSb2xlPC9hPjwvc3Ryb25nPjxiciAvPgotPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iY3JlYXRlYXRhc2suaHRtbCI+Q3JlYXRlIGEgVGFzazwvYT48L3N0cm9uZz48YnIgLz4KLTwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sIj5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2E+PC9zdHJvbmc+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSJjcmVhdGVndWlkYW5jZS5odG1sIj5DcmVhdGUgR3VpZGFuY2U8L2E+PC9zdHJvbmc+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sIj5WYXJpYWJpbGl0eTwvYT48L3N0cm9uZz48YnIgLz4KLVZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZQotb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcKLXRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZwotdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLjwvbGk+Ci08L3VsPgotCi08ZGl2IGNsYXNzPSJsaW5rbGlzdCI+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFyb2xlLmh0bWwjY3JlYXRlYXJvbGUiPkNyZWF0ZSBhIFJvbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF0YXNrLmh0bWwjY3JlYXRlYXRhc2siPkNyZWF0ZSBhIFRhc2s8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sIj5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWd1aWRhbmNlLmh0bWwjY3JlYXRlZ3VpZGFuY2UiPkNyZWF0ZSBHdWlkYW5jZTwvYT48L2Rpdj48L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jdXQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jdXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwY2YxMWQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGVsaXZlcmFibGUuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGVsaXZlcmFibGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjNiMjY2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RlbGl2ZXJhYmxlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEZWxpdmVyYWJsZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJhcnRpZmFjdC5odG1sI2FydGlmYWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJvdXRjb21lLmh0bWwjb3V0Y29tZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJkZWxpdmVyYWJsZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5EZWxpdmVyYWJsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iZGVsaXZlcmFibGUiPjxhIG5hbWU9ImRlbGl2ZXJhYmxlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RGVsaXZlcmFibGU8L2gxPgotPGRpdj48cD5BIGRlbGl2ZXJhYmxlIGlzIGEgY29sbGVjdGlvbiBvZiB3b3JrIHByb2R1Y3RzLCB1c3VhbGx5IGFydGlmYWN0cy4gQSBkZWxpdmVyYWJsZQotaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvZiB3b3JrIHByb2R1Y3RzCi1wYWNrYWdlZCBmb3IgZGVsaXZlcnkuIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYQotcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIsIG9yIG90aGVyCi1zdGFrZWhvbGRlci48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImFydGlmYWN0Lmh0bWwjYXJ0aWZhY3QiPkFydGlmYWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJvdXRjb21lLmh0bWwjb3V0Y29tZSI+T3V0Y29tZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RlbGl2ZXJ5cHJvY2Vzcy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZWxpdmVyeXByb2Nlc3MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGQ1ZTliYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RlbGl2ZXJ5cHJvY2Vzcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRGVsaXZlcnkgUHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2NyZWF0ZWFkZWxpdmVyeXByb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJkZWxpdmVyeXByb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+RGVsaXZlcnkgUHJvY2VzczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iZGVsaXZlcnlwcm9jZXNzIj48YSBuYW1lPSJkZWxpdmVyeXByb2Nlc3MiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5EZWxpdmVyeSBQcm9jZXNzPC9oMT4KLTxkaXY+PHA+QSBEZWxpdmVyeSBQcm9jZXNzIGlzIHRoZSBwcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlCi1mcm9tIGJlZ2lubmluZyB0byBlbmQuIEEgRGVsaXZlcnkgUHJvY2VzcyBjYW4gYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZwotYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQKLXBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMuPC9wPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbCI+Q3JlYXRlIGEgRGVsaXZlcnkgUHJvY2VzczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwjY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyI+Q3JlYXRlIGEgRGVsaXZlcnkgUHJvY2VzczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MTIzYTkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRGV2ZWxvcCBhIFRlYW0gQWxsb2NhdGlvbiBTdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImRldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+RGV2ZWxvcCBhIFRlYW0gQWxsb2NhdGlvbiBTdHJ1Y3R1cmU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImRldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUiPjxhIG5hbWU9ImRldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5EZXZlbG9wIGEgVGVhbSBBbGxvY2F0aW9uIFN0cnVjdHVyZTwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPkluIHRoZSBUZWFtIEFsbG9jYXRpb24gdmlldywgeW91IGNhbiBjcmVhdGUgYSBwcm9jZXNzIGJ5IGRlZmluaW5nCi13aGljaCByb2xlcyBwYXJ0aWNpcGF0ZSBpbiBhY3Rpdml0aWVzIGFuZCBmaW5kIHJlc3BvbnNpYmxlIHdvcmsgcHJvZHVjdHMgYW5kCi10YXNrcyBmcm9tIHRoZXJlLiBZb3UgY2FuIGFsc28gcmV2aWV3IHRoZSByb2xlcyBpbiBhIHByb2Nlc3MgdGhhdCBoYXMgYmVlbgotY3JlYXRlZCBieSBhZGRpbmcgdGFza3Mgb3Igd29yayBwcm9kdWN0cyB0byB0aGUgcHJvY2Vzcy4gQmVmb3JlIHlvdSBjcmVhdGUKLWEgdGVhbSBhbGxvY2F0aW9uIHN0cnVjdHVyZSwgZW5zdXJlIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGVkIGluIHRoZSB0b29sCi1iYXIgaXMgdGhlIHNhbWUgYXMgdGhlIGNvbmZpZ3VyYXRpb24geW91IHNlbGVjdGVkIGFzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLWZvciB5b3VyIHByb2Nlc3MuPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBkZXZlbG9wIGEgdGVhbSBhbGxvY2F0aW9uIHN0cnVjdHVyZTo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGFjY2VzcyB0aGUgdGVhbSBhbGxvY2F0aW9uIGVkaXRvciwgc2VsZWN0IHRoZSA8c3Ryb25nPlRlYW0gQWxsb2NhdGlvbjwvc3Ryb25nPiB0YWIKLWluIHRoZSBwcm9jZXNzIGVkaXRvci48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgdG9waWMsIHRoZQotYnJlYWtkb3duIGVsZW1lbnQgZXhhbXBsZSB1c2VkIGlzIDxhIGhyZWY9ImFjdGl2aXR5Lmh0bWwjYWN0aXZpdHkiPkFjdGl2aXR5PC9hPi4KLU90aGVyIGJyZWFrZG93biBlbGVtZW50cyBpbmNsdWRlIChidXQgYXJlIG5vdCBsaW1pdGVkIHRvKSA8YSBocmVmPSJwaGFzZS5odG1sI3BoYXNlIj5QaGFzZTwvYT4gYW5kIDxhIGhyZWY9Iml0ZXJhdGlvbi5odG1sI2l0ZXJhdGlvbiI+SXRlcmF0aW9uPC9hPi4KLVRoZSBlbGVtZW50IHlvdSB1c2UgZGVwZW5kcyBvbiB0aGUgc2NvcGUgb2YgdGhlIHByb2Nlc3MgeW91IGNyZWF0ZS48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIHRoZSBlbGVtZW50IChlaXRoZXIgYSA8YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+IG9yIDxhIGhyZWY9ImRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2RlbGl2ZXJ5cHJvY2VzcyI+RGVsaXZlcnkgUHJvY2VzczwvYT4pIHRvIHdoaWNoIHlvdSB3YW50IHRvIGFkZCBzdHJ1Y3R1cmUsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+TmV3Ci1DaGlsZCAmZ3Q7IEFjdGl2aXR5PC9zdHJvbmc+IHRvIGNyZWF0ZSBhIG5ldyBhY3Rpdml0eS4gSWYgbmVlZGVkLCBjcmVhdGUgbW9yZSBhY3Rpdml0aWVzCi10byBzZXQgdXAgeW91ciBicmVha2Rvd24gc3RydWN0dXJlLiBBY3Rpdml0aWVzIChhcyB3ZWxsIGFzIHBoYXNlcyBhbmQgaXRlcmF0aW9ucykKLWNhbiBiZSBuZXN0ZWQgaW5zaWRlIGVhY2ggb3RoZXIgYWNjb3JkaW5nIHRvIGhvdyBlYWNoIHJlbGF0ZXMgaW4gdGhlIGhpZXJhcmNoeS4KLVlvdSBjYW4gYWRkIHJvbGVzIGRpcmVjdGx5IHRvIHlvdXIgYWN0aXZpdGllcy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldywgcmV2aWV3IHRoZSBsaXN0IG9mIHJvbGVzLiBJbiB0aGlzIHZpZXcsCi10YXNrcyBhcmUgc29ydGVkIGJ5IHJvbGUgc2V0cy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RHJpbGwgaW50byB0aGUgcm9sZSBzZXRzIGhpZXJhcmNoeSB0byBzZWUgd2hpY2ggcm9sZXMgYXJlIGF2YWlsYWJsZQotaW4gdGhpcyBjb25maWd1cmF0aW9uLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgYSByb2xlIGFuZCBkcmFnIGl0IG9uIHRvcCBvZiB0aGUgYXBwcm9wcmlhdGUgYWN0aXZpdHkuIFRoZQotcm9sZSBpcyBhZGRlZCBhcyBhIHJvbGUgZGVzY3JpcHRvci4gSWYgdGhlIHJvbGUgaXMgcmVzcG9uc2libGUgZm9yIHdvcmsgcHJvZHVjdHMKLWluIHRoZSBjb25maWd1cmF0aW9uJ3MgbWV0aG9kIGNvbnRlbnQsIGEgd2l6YXJkIGFwcGVhcnMgcHJvbXB0aW5nIHlvdSB0byBhZGQKLXdvcmsgcHJvZHVjdHMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIEZvcgotZWFjaCBzZWxlY3RlZCB3b3JrIHByb2R1Y3QgdGhlIG5leHQgd2l6YXJkIHdpbmRvdyBwcm9tcHRzIHlvdSB0byBzZWxlY3QgdGFza3MKLXRoYXQgcHJvZHVjZSB0aGVzZSB3b3JrIHByb2R1Y3RzLiBBZ2Fpbiwgc2VsZWN0IG9uZSBvciBtb3JlIHRhc2tzIGFuZCB0aGVuCi1jbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+IHRvIGFkZCB0aGVzZSBlbGVtZW50cyB0byB5b3VyIHByb2Nlc3MuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJldmlldyB0aGUgcm9sZSBkZXNjcmlwdG9yJ3MgZGV0YWlscyBpbiBpdHMgcHJvcGVydGllcyB2aWV3LiBJZgotdGhlIHByb3BlcnRpZXMgdmlldyBpcyBub3QgZGlzcGxheWVkLCBpbiB0aGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvciwKLXJpZ2h0IGNsaWNrIHRoZSByb2xlIGFuZCB0aGVuIHNlbGVjdCA8c3Ryb25nPlByb3BlcnRpZXM8L3N0cm9uZz4uIFVzZSB0aGUgdGFicyBvbiB0aGUKLXNpZGUgb2YgdGhlIHByb3BlcnRpZXMgdmlldyB0byByZXZpZXcgZGlmZmVyZW50IGFzcGVjdHMgb2YgdGhlIHJvbGUgZGVzY3JpcHRvci4KLUluIHRoZSBwcm9wZXJ0aWVzIHZpZXcsIHlvdSBjYW4gYWxzbyBwZXJmb3JtIGluZGl2aWR1YWwgbW9kaWZpY2F0aW9ucyBvZiB0aGUKLXJvbGUgZGVzY3JpcHRvciwgc3VjaCBhcyBjaGFuZ2UgdGhlIHByZXNlbnRhdGlvbiBuYW1lLCBhZGQgdGV4dHVhbCBkZXNjcmlwdGlvbnMsCi1jaGFuZ2Ugd29yayBwcm9kdWN0cyB0aGUgcm9sZSBpcyByZXNwb25zaWJsZSBmb3IsIGFuZCBtb3JlLiBXaGVuIGNoYW5naW5nCi10aGUgdGFzayBkZXNjcmlwdG9yJ3MgcmVsYXRpb25zaGlwcyB1bmRlciB0aGUgcm9sZXMgb3Igd29yayBwcm9kdWN0cyB0YWJzLAoteW91IGNhbiBhZGQgbmV3IGVsZW1lbnRzIGZyb20geW91ciBtZXRob2QgY29udGVudCBieSBjbGlja2luZyB0aGUgPHN0cm9uZz5BZGQuLi48L3N0cm9uZz4gYnV0dG9uLAotb3IgY29ubmVjdCB5b3VyIHRhc2sgZGVzY3JpcHRvciB3aXRoIHRhc2tzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIGFjdGl2aXR5LgotRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJwcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3Lmh0bWwjcHJvY2Vzc2VsZW1lbnRwcm9wZXJ0aWVzdmlldyI+UHJvY2VzcyBFbGVtZW50IFByb3BlcnRpZXMgVmlldzwvYT48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q29udGludWUgYWRkaW5nIHJvbGVzIHRvIHlvdXIgYWN0aXZpdGllcy48L3NwYW4+PC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Zb3UgY2FuIHByZXZpZXcgd2hhdCB5b3VyIHByb2Nlc3Mgd2lsbCBsb29rIGxpa2UgaW4gYSBwdWJsaXNoZWQgV2ViCi1zaXRlIGF0IGFueSB0aW1lIGJ5IHN3aXRjaGluZyB0byB0aGUgPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+IGFuZCB0aGVuIHNlbGVjdGluZyB0aGUgcHJvY2Vzcywgb3IgYW4gYWN0aXZpdHkgaW4gdGhlCi1wcm9jZXNzLCBpbiB0aGUgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPi4gWW91IGNhbiB1c2UgdGhlCi1saW5rcyBvbiB0aGUgcGFnZSB0byBuYXZpZ2F0ZSB0aHJvdWdoIHRoZSBwcm9jZXNzLiBTd2l0Y2ggYmFjayB0byB0aGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPiB0bwotY29udGludWUgZWRpdGluZyB5b3VyIHByb2Nlc3MuPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUiPkRldmVsb3AgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImRldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZSI+RGV2ZWxvcCBhIFdvcmsgUHJvZHVjdCBVc2FnZSBTdHJ1Y3R1cmU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg3NDdlYjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRldmVsb3AgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkRldmVsb3AgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImRldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZSI+PGEgbmFtZT0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RGV2ZWxvcCBhIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZTwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPkEgd29yayBicmVha2Rvd24gc3RydWN0dXJlIGlzIGEgaGllcmFyY2hpY2FsIGJyZWFrZG93biBvZiB3b3JrLCBzdWNoCi1hcyBhY3Rpdml0aWVzLCB0YXNrcywgYW5kIHN0ZXBzLCBkZWZpbmluZyBhIHByb2Nlc3MuIDxwPkJlZm9yZSBjcmVhdGluZyBhCi13b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUsIGJlIHN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3RlZCBpbiB0aGUgdG9vbAotYmFyIGlzIHRoZSBzYW1lIGFzIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGVkIGFzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLWZvciB5b3VyIHByb2Nlc3MuPC9wPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBkZXZlbG9wIGEgd29yayBicmVha2Rvd24gc3RydWN0dXJlOjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gYWNjZXNzIHRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgZWRpdG9yLCBzZWxlY3QgdGhlIDxzdHJvbmc+V29yawotQnJlYWtkb3duIFN0cnVjdHVyZTwvc3Ryb25nPiB0YWIgaW4gYSBwcm9jZXNzIGVkaXRvci48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBBIGJyZWFrZG93bgotc3RydWN0dXJlIGlzIGNyZWF0ZWQgd2l0aCBicmVha2Rvd24gZWxlbWVudHMuIEV4YW1wbGVzIG9mIGJyZWFrZG93biBlbGVtZW50cwotYXJlIDxhIGhyZWY9InBoYXNlLmh0bWwjcGhhc2UiPlBoYXNlPC9hPiwgPGEgaHJlZj0iaXRlcmF0aW9uLmh0bWwjaXRlcmF0aW9uIj5JdGVyYXRpb248L2E+LCA8YSBocmVmPSJhY3Rpdml0eS5odG1sI2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT4sCi1vciB0YXNrIGRlc2NyaXB0b3IuIFR5cGljYWxseSwgYSBwcm9jZXNzIGlzIGNyZWF0ZWQgYnkgZGVmaW5pbmcKLWl0cyBwaGFzZXMgYW5kIGl0ZXJhdGlvbnMgd2l0aGluIG9yIGFjcm9zcyB0aGVzZSBwaGFzZXMuIFBoYXNlcyBhbmQgaXRlcmF0aW9ucwotYXJlIHRoZW4gZnVydGhlciBicm9rZW4gZG93biBpbnRvIGxldmVscyBvZiBhY3Rpdml0aWVzLiBGaW5hbGx5LCB5b3UgY2FuIHBvcHVsYXRlCi1hIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSdzIGFjdGl2aXR5IHdpdGggdGFzayBkZXNjcmlwdG9ycy48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIHRoZSBlbGVtZW50IChlaXRoZXIgYSA8YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+IG9yIDxhIGhyZWY9ImRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2RlbGl2ZXJ5cHJvY2VzcyI+RGVsaXZlcnkgUHJvY2VzczwvYT4pIHRvIHdoaWNoIHlvdSB3YW50IHRvIGFkZCBzdHJ1Y3R1cmUsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+TmV3Ci1DaGlsZCAmZ3Q7IEFjdGl2aXR5PC9zdHJvbmc+IHRvIGNyZWF0ZSB0aGUgbmV3IGFjdGl2aXR5LiBJZiBuZWVkZWQsIGNyZWF0ZSBtb3JlIGFjdGl2aXRpZXMKLXRvIHNldCB1cCB5b3VyIGJyZWFrZG93biBzdHJ1Y3R1cmUuIEFjdGl2aXRpZXMgKGFzIHdlbGwgYXMgcGhhc2VzIGFuZCBpdGVyYXRpb25zKQotY2FuIGJlIG5lc3RlZCBpbnNpZGUgZWFjaCBvdGhlciBhY2NvcmRpbmcgdG8gaG93IGVhY2ggcmVsYXRlcyBpbiB0aGUgaGllcmFyY2h5Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayB0aGUgYWN0aXZpdHkgYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+UHJvcGVydGllczwvc3Ryb25nPiB0byBvcGVuCi10aGUgUHJvcGVydGllcyB2aWV3LiBDb21wbGV0ZSB0aGUgaW5mb3JtYXRpb24gdW5kZXIgdGhlIERvY3VtZW50YXRpb24gdGFiCi1mb3IgdGhlIGFjdGl2aXR5LiBUaGlzIGluZm9ybWF0aW9uIGFwcGVhcnMgaW4gdGhlIHB1Ymxpc2hlZCBXZWIgcGFnZSBmb3IgdGhlCi1hY3Rpdml0eS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmV2aWV3IHRoZSBsaXN0IG9mIHRhc2tzIGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcgdG8gc2VlIHdoaWNoCi10YXNrcyBhcmUgYXZhaWxhYmxlLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgYSB0YXNrIHRvIGFkZCB0byB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgdGhlbiBkcmFnIGl0Ci1vbiB0b3Agb2YgdGhlIGFjdGl2aXR5IHRvIHdoaWNoIHlvdSB3YW50IGl0IHRvIGJlbG9uZy4gVGhlIHRhc2sgaXMgYWRkZWQgYXMKLWEgdGFzayBkZXNjcmlwdG9yIHRvIHRoYXQgYWN0aXZpdHkuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHRoZSBwcm9wZXJ0aWVzIHZpZXcgZm9yIHRoZSBhY3Rpdml0eSBpcyBub3QgZGlzcGxheWVkLCBzZWxlY3QKLXRoZSB0YXNrIGluIHRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgZWRpdG9yLCByaWdodCBjbGljaywgYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+UHJvcGVydGllczwvc3Ryb25nPi4KLUNsaWNrIHRoZSA8c3Ryb25nPkRvY3VtZW50YXRpb248L3N0cm9uZz4gdGFiIGFuZCB0aGVuIGNvbXBsZXRlIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZAotdW5kZXIgdGhpcyB0YWIuIFRoaXMgaW5mb3JtYXRpb24gYXBwZWFycyBpbiB0aGUgcHVibGlzaGVkIFdlYiBwYWdlIGZvciB0aGUKLWFjdGl2aXR5LiBVc2UgdGhlIHRhYnMgb24gdGhlIHNpZGUgb2YgdGhlIHByb3BlcnRpZXMgdmlldyB0byByZXZpZXcgZGlmZmVyZW50Ci1hc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0b3IuIEluIHRoZSBwcm9wZXJ0aWVzIHZpZXcsIHlvdSBjYW4gcGVyZm9ybSBpbmRpdmlkdWFsCi1tb2RpZmljYXRpb25zIG9mIHRoZSB0YXNrIGRlc2NyaXB0b3IsIHN1Y2ggYXMgY2hhbmdlIHRoZSBwcmVzZW50YXRpb24gbmFtZSwKLWFkZCB0ZXh0dWFsIGRlc2NyaXB0aW9ucywgYW5kIGNoYW5nZSBwZXJmb3JtaW5nIHJvbGVzLCBhbW9uZyBvdGhlcnMuIFdoZW4KLWNoYW5naW5nIHRoZSB0YXNrIGRlc2NyaXB0b3IncyByZWxhdGlvbnNoaXBzIHVuZGVyIHRoZSByb2xlcyBvciB3b3JrIHByb2R1Y3RzCi10YWJzLCB5b3UgY2FuIGFkZCBuZXcgZWxlbWVudHMgZnJvbSB5b3VyIG1ldGhvZCBjb250ZW50IGJ5IGNsaWNraW5nIHRoZSA8c3Ryb25nPkFkZC4uLjwvc3Ryb25nPiBidXR0b24sCi1vciBjb25uZWN0IHlvdXIgdGFzayBkZXNjcmlwdG9yIHdpdGggdGFza3MgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgYWN0aXZpdHkuCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9InByb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXcuaHRtbCNwcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3Ij5Qcm9jZXNzIEVsZW1lbnQgUHJvcGVydGllcyBWaWV3PC9hPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q29udGludWUgYWRkaW5nIHRhc2tzIHRvIHRoZSBhY3Rpdml0eSBvciBhY3Rpdml0aWVzLjwvc3Bhbj48L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPllvdSBjYW4gcHJldmlldyB3aGF0IHlvdXIgcHJvY2VzcyB3aWxsIGxvb2sgbGlrZSBpbiBhIHB1Ymxpc2hlZCBXZWIKLXNpdGUgYXQgYW55IHRpbWUgYnkgc3dpdGNoaW5nIHRvIHRoZSA8YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT4gYW5kIHRoZW4gc2VsZWN0aW5nIHRoZSBwcm9jZXNzLCBvciBhbiBhY3Rpdml0eSBpbiB0aGUKLXByb2Nlc3MsIGluIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sIj5Db25maWd1cmF0aW9uIFZpZXc8L2E+LiBZb3UgY2FuIHVzZSB0aGUKLWxpbmtzIG9uIHRoZSBwYWdlIHRvIG5hdmlnYXRlIHRocm91Z2ggdGhlIHByb2Nlc3MuIFN3aXRjaCBiYWNrIHRvIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+IHRvCi1jb250aW51ZSBlZGl0aW5nIHlvdXIgcHJvY2Vzcy48L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImRldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlIj5EZXZlbG9wIGEgVGVhbSBBbGxvY2F0aW9uIFN0cnVjdHVyZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlIj5EZXZlbG9wIGEgV29yayBQcm9kdWN0IFVzYWdlIFN0cnVjdHVyZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzQwYTA2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRGV2ZWxvcCBhIFdvcmsgUHJvZHVjdCBVc2FnZSBTdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZS5odG1sI2RldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkRldmVsb3AgYSBXb3JrIFByb2R1Y3QgVXNhZ2UgU3RydWN0dXJlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUiPjxhIG5hbWU9ImRldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRldmVsb3AgYSBXb3JrIFByb2R1Y3QgVXNhZ2UgU3RydWN0dXJlPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+SW4gdGhlIFdvcmsgUHJvZHVjdCBVc2FnZSB2aWV3LCB5b3UgY2FuIGNyZWF0ZSBhIHByb2Nlc3MgYnkgZGVmaW5pbmcKLXdoaWNoIHdvcmsgcHJvZHVjdHMgd2lsbCBiZSBjcmVhdGVkIGFuZCB1c2VkIGluIHRoZSBwcm9jZXNzLCBhbmQgdGhlbiBmaW5kaW5nCi1yZXNwb25zaWJsZSByb2xlcyBhbmQgdGFza3MgZnJvbSB0aGVyZS4gWW91IGNhbiBhbHNvIHJldmlldyB0aGUgd29yayBwcm9kdWN0cwotaW4gYSBwcm9jZXNzIHRoYXQgaGFzIGJlZW4gY3JlYXRlZCBieSBhZGRpbmcgdGFza3Mgb3Igcm9sZXMgdG8gdGhlIHByb2Nlc3MuPHA+QmVmb3JlCi15b3UgY3JlYXRlIGEgd29yayBwcm9kdWN0IHVzYWdlIHN0cnVjdHVyZSwgZW5zdXJlIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGVkCi1pbiB0aGUgdG9vbCBiYXIgaXMgdGhlIHNhbWUgYXMgdGhlIGNvbmZpZ3VyYXRpb24geW91IHNlbGVjdGVkIGFzIHRoZSBkZWZhdWx0Ci1jb25maWd1cmF0aW9uIGZvciB5b3VyIHByb2Nlc3MuPC9wPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBkZXZlbG9wIGEgd29yayBwcm9kdWN0IHVzYWdlIHN0cnVjdHVyZTo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGFjY2VzcyB0aGUgd29yayBwcm9kdWN0IHVzYWdlIGVkaXRvciwgc2VsZWN0IHRoZSA8c3Ryb25nPldvcmsgUHJvZHVjdAotVXNhZ2U8L3N0cm9uZz4gdGFiIGluIHRoZSBwcm9jZXNzIGVkaXRvci48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBGb3IgdGhlIHB1cnBvc2VzIG9mCi10aGlzIHRvcGljLCB0aGUgYnJlYWtkb3duIGVsZW1lbnQgZXhhbXBsZSB1c2VkIGlzIDxhIGhyZWY9ImFjdGl2aXR5Lmh0bWwjYWN0aXZpdHkiPkFjdGl2aXR5PC9hPi4gT3RoZXIgYnJlYWtkb3duIGVsZW1lbnRzIGluY2x1ZGUgKGJ1dCBhcmUgbm90IGxpbWl0ZWQKLXRvKSA8YSBocmVmPSJwaGFzZS5odG1sI3BoYXNlIj5QaGFzZTwvYT4gYW5kIDxhIGhyZWY9Iml0ZXJhdGlvbi5odG1sI2l0ZXJhdGlvbiI+SXRlcmF0aW9uPC9hPi4gVGhlIGVsZW1lbnQgeW91IHVzZSBkZXBlbmRzIG9uIHRoZSBzY29wZSBvZiB0aGUgcHJvY2VzcwoteW91IGNyZWF0ZS48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIHRoZSBlbGVtZW50IChlaXRoZXIgYSA8YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+IG9yIDxhIGhyZWY9ImRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2RlbGl2ZXJ5cHJvY2VzcyI+RGVsaXZlcnkgUHJvY2VzczwvYT4pIHRvIHdoaWNoIHlvdSB3YW50IHRvIGFkZCBzdHJ1Y3R1cmUsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+TmV3Ci1DaGlsZCAmZ3Q7IEFjdGl2aXR5PC9zdHJvbmc+IHRvIGNyZWF0ZSBhIG5ldyBhY3Rpdml0eS4gSWYgbmVlZGVkLCBjcmVhdGUgbW9yZSBhY3Rpdml0aWVzCi10byBzZXQgdXAgeW91ciBicmVha2Rvd24gc3RydWN0dXJlLiBBY3Rpdml0aWVzIChhcyB3ZWxsIGFzIHBoYXNlcyBhbmQgaXRlcmF0aW9ucykKLWNhbiBiZSBuZXN0ZWQgaW5zaWRlIGVhY2ggb3RoZXIgYWNjb3JkaW5nIHRvIGhvdyBlYWNoIHJlbGF0ZXMgaW4gdGhlIGhpZXJhcmNoeS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmV2aWV3IHRoZSBsaXN0IG9mIHdvcmsgcHJvZHVjdHMgaW4gdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4uIEluIHRoaXMgdmlldywgd29yayBwcm9kdWN0cyBhcmUgc29ydGVkIGJ5IGRvbWFpbiBhcwotd2VsbCBhcyB3b3JrIHByb2R1Y3Qga2luZHMuIERyaWxsIGludG8gZWl0aGVyIG9mIHRoZXNlIGhpZXJhcmNoaWVzIHRvIHNlZQotd2hpY2ggd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlIGluIHRoaXMgY29uZmlndXJhdGlvbi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IGEgd29yayBwcm9kdWN0IHRvIGFkZCB0byBhY3Rpdml0eSBhbmQgdGhlbiBkcmFnIGl0IG9uIHRvcAotb2YgdGhlIGFjdGl2aXR5IHdoaWNoIHlvdSB3YW50IGl0IHRvIGJlbG9uZy4gVGhlIHdvcmsgcHJvZHVjdCBpcyBhZGRlZCBhcwotYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byB0aGF0IGFjdGl2aXR5LiBJZiB0aGUgd29yayBwcm9kdWN0IGlzIGFuIG91dHB1dAotdG8gb25lIG9yIG1vcmUgdGFza3MgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIGEgd2l6YXJkIGFwcGVhcnMgcHJvbXB0aW5nIHlvdQotdG8gYWRkIHRoZSB0YXNrLiA8L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBJdCBpcyBub3QgcmVxdWlyZWQgdG8gYWRkIGEgdGFzay4gQSB2YWxpZAotcHJvY2VzcyBjYW4gY29udGFpbiBqdXN0IHJvbGVzIGFuZCB3b3JrIHByb2R1Y3RzLjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U3BlY2lmeSB0aGUgZW50cnkgYW5kIGV4aXQgc3RhdGVzIG9mIHRoZSB3b3JrIHByb2R1Y3QgZm9yIHRoZSBhY3Rpdml0eQotdG8gd2hpY2ggaXQgd2FzIGFkZGVkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SZXZpZXcgdGhlIG5ldyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBkZXRhaWxzIGluIHRoZSBwcm9wZXJ0aWVzCi12aWV3LiBJZiB0aGUgcHJvcGVydGllcyB2aWV3IGlzIG5vdCBkaXNwbGF5ZWQsIHJpZ2h0IGNsaWNrIHRoZSB3b3JrIHByb2R1Y3QKLWRlc2NyaXB0b3IgaW4gdGhlIHByb2Nlc3MgZWRpdG9yLCBhbmQgdGhlbiBzZWxlY3QgPHN0cm9uZz5Qcm9wZXJ0aWVzPC9zdHJvbmc+LiBVc2UgdGhlCi10YWJzIG9uIHRoZSBzaWRlIG9mIHRoZSBwcm9wZXJ0aWVzIHZpZXcgdG8gcmV2aWV3IGRpZmZlcmVudCBhc3BlY3RzIG9mIHRoZQotd29yayBwcm9kdWN0IGRlc2NyaXB0b3IuIEluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHlvdSBjYW4gYWxzbyBwZXJmb3JtIGluZGl2aWR1YWwKLW1vZGlmaWNhdGlvbnMgb2YgdGhlIHJvbGUgZGVzY3JpcHRvciwgc3VjaCBhcyBjaGFuZ2UgdGhlIHByZXNlbnRhdGlvbiBuYW1lLAotYWRkIHRleHR1YWwgZGVzY3JpcHRpb25zLCBhZGQgZW50cnkgYW5kIGV4aXQgc3RhdGVzLCBhbmQgbW9yZS4gV2hlbiBjaGFuZ2luZwotdGhlIHJvbGUgZGVzY3JpcHRvcidzIHJlbGF0aW9uc2hpcHMgdW5kZXIgdGhlIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMgdGFicywKLXlvdSBjYW4gYWRkIG5ldyBlbGVtZW50cyBmcm9tIHlvdXIgbWV0aG9kIGNvbnRlbnQgYnkgY2xpY2tpbmcgdGhlIDxzdHJvbmc+QWRkLi4uPC9zdHJvbmc+IGJ1dHRvbiwKLW9yIGNvbm5lY3QgeW91ciByb2xlIGRlc2NyaXB0b3Igd2l0aCB0YXNrcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBhY3Rpdml0eS4KLUZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0icHJvY2Vzc2VsZW1lbnRwcm9wZXJ0aWVzdmlldy5odG1sI3Byb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXciPlByb2Nlc3MgRWxlbWVudCBQcm9wZXJ0aWVzIFZpZXc8L2E+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Db250aW51ZSBhZGRpbmcgd29yayBwcm9kdWN0cyB0byB5b3VyIGFjdGl2aXRpZXMuIDwvc3Bhbj48L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlNlZSBhbHNvOjwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlIj5EZXZlbG9wIGEgV29yayBCcmVha2Rvd24gU3RydWN0dXJlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZSI+RGV2ZWxvcCBhIFRlYW0gQWxsb2NhdGlvbiBTdHJ1Y3R1cmU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kaWZmZXJlbmNlc2JldHdlZW5leGlzdGluZ2FuZG1pZ3JhdGVkY29udGVudC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kaWZmZXJlbmNlc2JldHdlZW5leGlzdGluZ2FuZG1pZ3JhdGVkY29udGVudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZTBiMWIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGlmZmVyZW5jZXNiZXR3ZWVuZXhpc3RpbmdhbmRtaWdyYXRlZGNvbnRlbnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEaWZmZXJlbmNlcyBCZXR3ZWVuIElCTSBSVVAgMjAwMyBhbmQgTWlncmF0ZWQgQ29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWlncmF0aW9ub3ZlcnZpZXcuaHRtbCNtaWdyYXRpb25vdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWlncmF0ZWFucnB3MjAwM3BsdWdpbi5odG1sI21pZ3JhdGVhbnJwdzIwMDNwbHVnaW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZGlmZmVyZW5jZXNiZXR3ZWVuZXhpc3RpbmdhbmRtaWdyYXRlZGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+RGlmZmVyZW5jZXMgQmV0d2VlbiBJQk0gUlVQIDIwMDMgYW5kIE1pZ3JhdGVkIENvbnRlbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImRpZmZlcmVuY2VzYmV0d2VlbmV4aXN0aW5nYW5kbWlncmF0ZWRjb250ZW50Ij48YSBuYW1lPSJkaWZmZXJlbmNlc2JldHdlZW5leGlzdGluZ2FuZG1pZ3JhdGVkY29udGVudCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRpZmZlcmVuY2VzIEJldHdlZW4gSUJNIFJVUCAyMDAzIGFuZCBNaWdyYXRlZCBDb250ZW50PC9oMT4KLTxkaXY+PHA+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBjb250ZW50IGlzIGJhc2VkIG9uIElCTSBVbmlmaWVkCi1NZXRob2QgQXJjaGl0ZWN0dXJlLjwvcD4KLTx1bD48bGk+PHN0cm9uZz5BY3Rpdml0aWVzIGhhdmUgYmVlbiByZW5hbWVkIHRvIHRhc2s8L3N0cm9uZz46IFRvIHByb3ZpZGUgYSB0aWdodGVyIGxpbmsKLXRvIHByb2Nlc3MgZW5hY3RtZW50IGFuZCBwcm9qZWN0IG1hbmFnZW1lbnQgd2UgcmVuYW1lZCB0aGUgbG93ZXN0IGFzc2lnbmFibGUKLXVuaXRzIG9mIHdvcmsgdG8gVGFzaywgYmVjYXVzZSB0aGlzIGlzIHRoZSB0ZXJtIG1vc3QgY29tbW9ubHkgdXNlZC48L2xpPgotPGxpPjxzdHJvbmc+V29ya2Zsb3cgZGV0YWlscyByZW5hbWVkIHRvIGFjdGl2aXR5PC9zdHJvbmc+OiBXb3JrZmxvd3MgYXJlIGNvbW1vbmx5IGV4cHJlc3NlZAotaW4gaGllcmFyY2hpZXMgb2YgYWN0aXZpdHkgZGlhZ3JhbXMgKGUuZy4gYWN0aXZpdHkgZGlhZ3JhbXMgZGVmaW5lZCBpbiB0aGUKLVVNTCAyLjApLiAgQWx0aG91Z2ggUlVQIG9ubHkgcHJvdmlkZWQgb25lIGxldmVsIG9mIHdvcmtmbG93IGJyZWFrZG93biwgVU1BCi1pcyBkZXNpZ25lZCB0byBwcm92aWRlIG11bHRpcGxlIGxldmVscyBvZiBzdWNoIGEgYnJlYWtkb3duLiBCZWNhdXNlIHRoZSB3b3JkCi1BY3Rpdml0eSB3YXMgbW9yZSBjb21tb25seSB1c2VkIHRvIGV4cHJlc3MgdGhlIGVsZW1lbnRzIG9mIGFjdGl2aXR5IGRpYWdyYW1zCi1hcyB3ZWxsIGFzIHRoZSBhY3Rpdml0eSBkaWFncmFtIGl0c2VsZiwgd2UgZGVjaWRlZCB0byByZXBsYWNlIHRoZSBuYW1lIFdvcmtmbG93Ci1EZXRhaWwgdXNlZCBpbiBSVVAgd2l0aCB0aGUgbmFtZSBBY3Rpdml0eS4gIFdlIHJlYWxpemUgdGhhdCB0aGUgc2hpZnQgaW4gdGhlCi11c2FnZSBvZiB0aGUgd29yZCBBY3Rpdml0eSBtaWdodCBjYXVzZSBjb25mdXNpb24gd2l0aCBleGlzdGluZyBSVVAgdXNlcnMuCi0gSG93ZXZlciwgb25lIGltcG9ydGFudCBnb2FsIG9mIHRoZSBVTUEgd29yayB3YXMgdG8gdXNlIHRlcm1zIGluIHRoZSB3YXkgdGhleQotYXJlIG1vc3QgY29tbW9ubHkgdXNlZCBpbiBzdGFuZGFyZHMgYW5kIGluZHVzdHJ5LiA8L2xpPgotPGxpPjxzdHJvbmc+VGFza3MgKGZvcm1lciBSVVAgQWN0aXZpdGllcykgY2FuIGJlIHBlcmZvcm1lZCBieSBtYW55IHJvbGVzPC9zdHJvbmc+OiAKLUluIFJVUCAyMDAzIGFuIGFjdGl2aXR5IHdhcyBtb2RlbGVkIGFzIGFuIG9wZXJhdGlvbiBvZiBhIHJvbGUuICBDdXN0b21lciBmZWVkYmFjaywKLWEgbG9vayBhdCBvdGhlciBwcm9jZXNzIG1vZGVsaW5nIGFwcHJvYWNoZXMsIGFzIHdlbGwgYXMgY2hhbmdlcyBpbnRyb2R1Y2VkCi1pbiBVTUwgMi4wIGluZGljYXRlZCB0aGF0IHRoaXMgd2FzIGEgdG9vIHJlc3RyaWN0aXZlIHdheSBvZiBtb2RlbGluZyBodW1hbgotYmVoYXZpb3IuICBUaGlzIGFwcHJvYWNoIGRpZCBub3QgYWxsb3cgZXhwcmVzc2luZyB0aGF0IHNvbWUgd29yayB3YXMgcGVyZm9ybWVkCi1hcyBhIGNvbGxhYm9yYXRpb24gb2YgZGlmZmVyZW50IHJvbGVzLiAgVU1BIGFkZHJlc3NlcyB0aGlzIGlzc3VlIGJ5IG1ha2luZwotVGFzayBhbiBpbmRlcGVuZGVudCBtb2RlbCBlbGVtZW50IHRvIHdoaWNoIHBlcmZvcm1pbmcgcm9sZXMgY2FuIGJlIGFzc2lnbmVkCi1hcyByZXNvdXJjZXMuICBVTUEgdGhlcmVmb3JlIG5vdyBhbGxvd3Mgc2V2ZXJhbCByb2xlcyB0byBiZSBhc3NpZ25lZCB0byBhCi10YXNrLiAgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGl0IHN0aWxsIGFsbG93cyBhIHByaW1hcnkgcGVyZm9ybWluZyByb2xlCi10byBiZSBpZGVudGlmaWVkIChiZWluZyByZXNwb25zaWJsZSBmb3IgdGhlIHRhc2spIGFzIHdlbGwgYXMgc2V2ZXJhbCBhZGRpdGlvbmFsCi1wZXJmb3JtZXJzLjwvbGk+Ci08bGk+PHN0cm9uZz5SZWZpbmVtZW50IG9mIHRoZSBhcnRpZmFjdCBjb25jZXB0PC9zdHJvbmc+OiBSVVAgb25seSB1c2VkIHRoZSBjb25jZXB0IG9mCi1hcnRpZmFjdCB0byBkZWZpbmUgdGhpbmdzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4KLSBVTUEgZGVmaW5lcyBhbiBleHRlbmRlZCB0YXhvbm9teSBmb3IgdGhlc2UgY29uY2VwdHMuICBJdCBkZWZpbmVzIHRoZSBnZW5lcmFsCi1jb25jZXB0IG9mIHdvcmsgcHJvZHVjdCwgd2hpY2ggaGFzIHRocmVlIGRpZmZlcmVudCBzcGVjaWFsaXphdGlvbnMgKHNwZWNpZmljCi13b3JrIHByb2R1Y3QgdHlwZXMpOiBBcnRpZmFjdHMgKG1hbmFnZWQgd29yayBwcm9kdWN0cyksIERlbGl2ZXJhYmxlcyAocGFja2FnZWQKLXdvcmsgcHJvZHVjdHMgdGhhdCB3aWxsIGJlIGRlbGl2ZXJlZCB0byBhIHN0YWtlaG9sZGVyIGZvciByZXZpZXcpLCBhbmQgT3V0Y29tZQotKHVubWFuYWdlZCwgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzKS48L2xpPgotPGxpPjxzdHJvbmc+RGlmZmVyZW50IGNhdGVnb3JpemF0aW9ucyBmb3Igd29yayBwcm9kdWN0cyBhbmQgcm9sZXM8L3N0cm9uZz46IEluIFJVUCwKLWFydGlmYWN0cyBhbmQgcm9sZXMgd2VyZSBhbGwgY2F0ZWdvcml6ZWQgYnkgZGlzY2lwbGluZS4gSG93ZXZlciwgc29tZXRpbWVzCi1hcnRpZmFjdHMgd2VyZSB1c2VkIGFjcm9zcyBkaXNjaXBsaW5lcyBhbmQgYSBjYXRlZ29yaXphdGlvbiB0byBvbmx5IG9uZSBkaXNjaXBsaW5lCi1jYXVzZWQgY29uZnVzaW9uLiAgSW4gVU1BIGRpZmZlcmVudCBjYXRlZ29yaWVzIGhhdmUgYmVlbiBkZWZpbmVkIGZvciB3b3JrCi1kZWZpbml0aW9ucyAoZGlzY2lwbGluZSBmb3IgdGFza3MgYW5kIGFjdGl2aXRpZXMpLCB3b3JrIHByb2R1Y3RzIChkb21haW4gYW5kCi13b3JrIHByb2R1Y3Qga2luZCksIGFuZCByb2xlcyAocm9sZSBzZXRzKS48L2xpPgotPGxpPjxzdHJvbmc+UHJvY2VzcyBDb21wb25lbnRzIHJlbmFtZWQgdG8gTWV0aG9kIFBhY2thZ2U8L3N0cm9uZz46ICBUaGUgY29uY2VwdCBvZiBjb21wb25lbnQKLWlzIGNvbW1vbmx5IHVzZWQgaW4gbWFueSBzdGFuZGFyZHMgYW5kIHRlY2hub2xvZ2llcy4gIE1vc3QgYXBwbGljYXRpb25zIG9mCi1jb21wb25lbnQgbGluayBpdCB0byB0aGUgYWJzdHJhY3Rpb24gb2YgZW5jYXBzdWxhdGlvbiBkZWZpbmluZyBhIGNvbXBvbmVudAotYXMgYSBibGFjayBib3ggd2hpY2ggY2FuIGJlIHVzZWQgdmlhIHdlbGwtZGVmaW5lZCBpbnRlcmZhY2VzLiAgUlVQIGNvbXBvbmVudAotZGlkIG5vdCBmdWxmaWxsIHRoaXMgYmxhY2sgYm94IGNyaXRlcmlvbi4gIEFsc28gdGhlIFNQRU0gc3RhbmRhcmQgZGVmaW5lZAotcGFja2FnZXMgYXMgd2VsbCBhcyBjb21wb25lbnRzLiBUbyBiZSBjb21wbGlhbnQgdG8gU1BFTSBhbmQgdGhlIGluZHVzdHJ5IHVzYWdlCi1vZiB0aGUgd29yZCBjb21wb25lbnQsIHdlIHJlbmFtZWQgUHJvY2VzcyBDb21wb25lbnQgdG8gTWV0aG9kIFBhY2thZ2UgKCdtZXRob2QnCi1iZWNhdXNlIGl0IGNhbiBjb250YWluIG1ldGhvZCBlbGVtZW50cyBvciBwcm9jZXNzIGVsZW1lbnRzKTwvbGk+Ci08bGk+PHN0cm9uZz5TZXBhcmF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGZyb20gcHJvY2VzcyBlbGVtZW50czwvc3Ryb25nPjogSW4KLVJVUCAyMDAzIHlvdSBjcmVhdGVkIGEgbmV3IHByb2Nlc3MgYnkgZGVmaW5pbmcgYSBuZXcgY29uZmlndXJhdGlvbiBhbmQgZG9jdW1lbnRpbmcKLW1hbnVhbGx5IGluIGEgZGV2ZWxvcG1lbnQgY2FzZSBhcnRpZmFjdCBjaGFuZ2VzIHRvIHN0YW5kYXJkIFJVUC4gIFVNQSBwcm92aWRlcwotZXh0ZW5kZWQgY29uY2VwdHMgaW4gYWRkaXRpb24gdG8gdGhlIGNvbmZpZ3VyYXRpb24gY29uY2VwdCBmb3IgdGFpbG9yaW5nIHByb2Nlc3Nlcy4KLSBJdCBhbGxvd3MgeW91IHRvIG1vZGVsIGNvbmNyZXRlbHkgZm9yIGEgcHJvY2VzcyB3aGF0IHdvcmsgZGVmaW5lZCBpbiB0aGUKLW1ldGhvZCBjb250ZW50IHlvdSB3YW50IHRvIGFjdHVhbGx5IGRvIGluIGVhY2ggcGhhc2UsIGJlY2F1c2UgeW91IGNhbiBlYXNpbHkKLWFkZCwgcmVtb3ZlLCBhbmQgcmVvcmRlciBlbGVtZW50cyBpbiB0aGUgcHJvY2VzcyBzdHJ1Y3R1cmUsIHJldXNpbmcgb3Igbm90Ci1yZXVzaW5nIHdoYXRldmVyIHlvdSB3YW50IGZyb20gdGhlIG1ldGhvZCBjb250ZW50LiBJdCBhY2hpZXZlcyB0aGVzZSBmZWF0dXJlcwotYnkgYSBtb3JlIGNsZWFyIHNlcGFyYXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgKGUuZy4gdGFza3MgZGVmaW5lZCBmb3IgZGlzY2lwbGluZXMpCi1hbmQgdGhlIGFwcGxpY2F0aW9uIG9mIG1ldGhvZCBjb250ZW50IGluIHByb2Nlc3MgKGV4cHJlc3NlZCB3aXRoIGFjdGl2aXR5Ci1kaWFncmFtcyBhbmQvb3Igd29yayBicmVha2Rvd24gc3RydWN0dXJlcykgYXMgd2VsbCBhcyB0aGUgbW9kZWxpbmcgb2YgcHJvY2Vzc2VzCi0oaS5lLiBjcmVhdGluZyBuZXcgb3IgYWRhcHRlZCBhY3Rpdml0eSBkaWFncmFtcyBvciBuZXcgb3IgYWRhcHRlZCB3b3JrIGJyZWFrZG93bgotc3RydWN0dXJlcykuICBJdCBpbnRyb2R1Y2VzIGEgZmV3IG5ldyBjb25jZXB0cyBzdWNoIGFzIGRlc2NyaXB0b3IgdGhhdCBzdXBwb3J0Ci10aGlzIHNlcGFyYXRpb24gYW5kIGFjaGlldmUgbmV3IGNhcGFiaWxpdGllcyBmb3IgbWFpbnRhaW5pbmcgYW5kIHJldXNpbmcgbWFueQotZGlmZmVyZW50IGZhbWlsaWVzIG9mIGFsdGVybmF0aXZlIHByb2Nlc3NlcyBhbmQgcHJvY2VzcyBwYXJ0cyBhbGwgd2l0aGluIHRoZQotc2FtZSBjb25maWd1cmF0aW9uLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWlncmF0aW9ub3ZlcnZpZXcuaHRtbCNtaWdyYXRpb25vdmVydmlldyI+TWlncmF0aW9uIE92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1pZ3JhdGVhbnJwdzIwMDNwbHVnaW4uaHRtbCNtaWdyYXRlYW5ycHcyMDAzcGx1Z2luIj5NaWdyYXRlIGFuIElCTSBSVVAgMjAwMy4wNiBQbHVnaW48L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kaXNjaXBsaW5lLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Rpc2NpcGxpbmUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWY1YTI5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Rpc2NpcGxpbmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRpc2NpcGxpbmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZGlzY2lwbGluZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5EaXNjaXBsaW5lPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJkaXNjaXBsaW5lIj48YSBuYW1lPSJkaXNjaXBsaW5lIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RGlzY2lwbGluZTwvaDE+Ci08ZGl2PjxwPkEgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgPGEgaHJlZj0idGFzay5odG1sI3Rhc2siPlRhc2tzPC9hPiB0aGF0Ci1hcmUgcmVsYXRlZCB0byBhIG1ham9yIGFyZWEgb2YgY29uY2VybiB3aXRoaW4gdGhlIG92ZXJhbGwgSVQgZW52aXJvbm1lbnQuCi1Gb3IgZXhhbXBsZSwgb24gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0LCBpdCBpcyBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluCi1yZXF1aXJlbWVudHMgdGFza3MgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiB0YXNrcy4gU2VwYXJhdGluZwotdGhlc2UgdGFza3MgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgdGFza3MgZWFzaWVyIHRvIGNvbXByZWhlbmQuCi1EaXNjaXBsaW5lcyBjYW4gYmUgb3JnYW5pemVkIHVzaW5nIERpc2NpcGxpbmUgR3JvdXBpbmdzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiPk1ldGhvZCBDb250ZW50IENhdGVnb3JpZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kb21haW4uaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZG9tYWluLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhNDIzNTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kb21haW4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRvbWFpbiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJkb21haW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+RG9tYWluPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJkb21haW4iPjxhIG5hbWU9ImRvbWFpbiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRvbWFpbjwvaDE+Ci08ZGl2PjxwPkEgRG9tYWluIGlzIGEgcmVmaW5lYWJsZSwgbG9naWNhbCwgaGllcmFyY2h5IG9mIHJlbGF0ZWQgPGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0czwvYT4gZ3JvdXBlZCB0b2dldGhlciBiYXNlZCBvbiB0aW1pbmcsIHJlc291cmNlcywKLW9yIHJlbGF0aW9uc2hpcC4gV2hpbGUgYSBEb21haW4gY2F0ZWdvcml6ZXMgbWFueSB3b3JrIHByb2R1Y3RzLCBhIHdvcmsgcHJvZHVjdAotYmVsb25ncyB0byBvbmx5IG9uZSBEb21haW4uIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLiA8L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIj5NZXRob2QgQ29udGVudCBDYXRlZ29yaWVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZXhhbXBsZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9leGFtcGxlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFkMWE1MTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9leGFtcGxlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFeGFtcGxlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImV4YW1wbGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+RXhhbXBsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iZXhhbXBsZSI+PGEgbmFtZT0iZXhhbXBsZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkV4YW1wbGU8L2gxPgotPGRpdj48cD5BbiBFeGFtcGxlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFuIGV4YW1wbGUgb2YgYQotY29tcGxldGVkIHdvcmsgcHJvZHVjdC4gPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9leHRlbmRzLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2V4dGVuZHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2UxZmI0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2V4dGVuZHMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkV4dGVuZHMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InJlcGxhY2UuaHRtbCNyZXBsYWNlcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY29udHJpYnV0ZXMuaHRtbCNjb250cmlidXRlcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJleHRlbmRzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkV4dGVuZHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImV4dGVuZHMiPjxhIG5hbWU9ImV4dGVuZHMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FeHRlbmRzPC9oMT4KLTxkaXY+PHA+QW4gZXh0ZW5kaW5nIGVsZW1lbnQgaW5oZXJpdHMgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBiYXNlIGVsZW1lbnQuIEV4dGVuc2lvbgotYWxsb3dzIE1ldGhvZCBQbHVnLWlucyB0byBlYXNpbHkgcmV1c2UgZWxlbWVudHMgZnJvbSBhIGJhc2UgcGx1Zy1pbiBieSBwcm92aWRpbmcKLWEga2luZCBvZiBpbmhlcml0YW5jZSBmb3IgdGhlIGV4dGVuZGluZyBlbGVtZW50LiBBdHRyaWJ1dGUgdmFsdWVzIGFuZCBhc3NvY2lhdGlvbgotaW5zdGFuY2VzIGFyZSBpbmhlcml0ZWQgZnJvbSB0aGUgImJhc2VkLW9uIiBlbGVtZW50IHRvIHRoZSBleHRlbmRpbmcgZWxlbWVudC4KLVRoZSByZXN1bHQgaXMgdGhhdCB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQgaGFzIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMgdGhlICJiYXNlZC1vbiIKLWVsZW1lbnQsIGJ1dCBtaWdodCBkZWZpbmUgaXRzIG93biBhZGRpdGlvbnMuIEV4dGVuZHMgaXMgbm90IHVzZWQgdG8gbW9kaWZ5Ci1jb250ZW50IG9mIHRoZSBiYXNlIHBsdWctaW4sIGJ1dCB0byBwcm92aWRlIHRoZSBhYmlsaXR5IGZvciB0aGUgZXh0ZW5kaW5nCi1wbHVnLWluIHRvIGRlZmluZSBpdHMgb3duIGNvbnRlbnQgd2hpY2ggaXMgYSB2YXJpYW50IG9mIGNvbnRlbnQgYWxyZWFkeSBkZWZpbmVkLgotRm9yIGV4YW1wbGUsIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIGEgZ2VuZXJpYyBSZXZpZXcgUmVjb3JkIGZvciBhIHNwZWNpZmljIHR5cGUKLW9mIHJldmlldy4gVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgdGhlIGJhc2UgZWxlbWVudCBhbmQgYW55IG51bWJlciBvZiBleHRlbmRpbmcKLWVsZW1lbnRzIGNhbiBiZSB1c2VkIHNpZGUgYnkgc2lkZSwgYnV0IHJlZmVyIHRvIGVhY2ggb3RoZXIgdGhyb3VnaCB0aGUgZXh0ZW5kcwotcmVsYXRpb25zaGlwLiBFeHRlbmRzIGFsc28gcHJvdmlkZXMgdGhlIGtleSBtZWNoYW5pc20gZm9yIGJpbmRpbmcgY2FwYWJpbGl0eQotcGF0dGVybnMgdG8gcHJvY2Vzc2VzOiBBIHBhdHRlcm4gaXMgYXBwbGllZCBieSBkZWZpbmluZyBhbiBleHRlbmRzIHJlbGF0aW9uc2hpcAotZnJvbSBhbiBhY3Rpdml0eSBvZiB0aGUgYXBwbHlpbmcgcHJvY2Vzc2VzIHRvIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4uIFRoZQotYWN0aXZpdHkgaW5oZXJpdHMgYXNzb2NpYXRpb24gaW5zdGFuY2VzIGZyb20gdGhlIHBhdHRlcm4gYW5kIHRoZSBwYXR0ZXJuIGFwcGVhcnMKLXRvIGJlIHBhcnQgb2YgdGhlIHJlc3VsdGluZyBwcm9jZXNzIGFmdGVyIGludGVycHJldGF0aW9uLjwvcD4KLTxwPlVzZSB0aGUgQ29udGVudCBWYXJpYWJpbGl0eSBzZWN0aW9uIG9uIHRoZSBEZXNjcmlwdGlvbiB0YWIgdG8gbWFrZSBhbiBlbGVtZW50Ci1leHRlbmQgYW5vdGhlciBlbGVtZW50LiBTZWxlY3QgPHN0cm9uZz5FeHRlbmRzPC9zdHJvbmc+IGFzIHRoZSBWYXJpYWJpbGl0eSBUeXBlLCBhbmQKLXRoZW4gc2VsZWN0IHRoZSBiYXNlIGVsZW1lbnQgd2hpY2ggdGhpcyBlbGVtZW50IGV4dGVuZHMuIFRoZSBiYXNlIGVsZW1lbnQKLW11c3QgYmUgdGhlIHNhbWUgdHlwZSBvZiBlbGVtZW50IGFzIHRoZSBleHRlbmRpbmcgZWxlbWVudC48L3A+Ci08cD5BbnkgaW5mb3JtYXRpb24geW91IGVudGVyIGluIHRoZSBleHRlbmRpbmcgZWxlbWVudCBpcyBhZGRlZCB0byB0aGUgYmFzZQotZWxlbWVudCBpbiBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIGVsZW1lbnQuIFRleHQgZmllbGRzIGluIHRoZSBleHRlbmRpbmcgZWxlbWVudAotYXJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIHJlc3BlY3RpdmUgdGV4dCBmaWVsZHMgaW4gdGhlIGJhc2UgZWxlbWVudC48L3A+Ci08cD5FeHRlbmRzIG9ubHkgZGVmaW5lcyBpbmhlcml0YW5jZSBmb3IgdGhlIGV4dGVuZGluZyBlbGVtZW50LiBUaGUgYmFzZSByZW1haW5zCi11bnRvdWNoZWQuIElmIHRoZSBleHRlbmRpbmcgZWxlbWVudCBpcyBhbGxvd2VkIGFuIGFzc29jaWF0aW9uIHRvIG9ubHkgb25lCi1vdGhlciBlbGVtZW50IGFuZCBoYXMgc3VjaCBhbiBlbGVtZW50IGRlZmluZWQgaXRzZWxmLCBpbmhlcml0YW5jZSB3aWxsIG5vdAotb3ZlcnJpZGUgdGhpcyBhc3NvY2lhdGlvbi48L3A+Ci08ZGl2IGNsYXNzPSJwIj48c3Ryb25nPkV4dGVuZHMgcnVsZXM6PC9zdHJvbmc+PHVsPjxsaT5BdHRyaWJ1dGUgdmFsdWVzIG9mIHRoZSBiYXNlIGVsZW1lbnQgYXJlIGluaGVyaXRlZCB0byB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQKLWlmIHRoZSBleHRlbmRpbmcgZWxlbWVudCBoYXMgbm90IGRlZmluZWQgaXRzIG93biB2YWx1ZXMuPC9saT4KLTxsaT5PdXRnb2luZyB0by1tYW55IGFzc29jaWF0aW9ucyBvZiB0aGUgYmFzZSBlbGVtZW50IGFyZSBpbmhlcml0ZWQgdG8gdGhlCi1leHRlbmRpbmcgZWxlbWVudC48L2xpPgotPGxpPk91dGdvaW5nIHRvLW9uZSBhc3NvY2lhdGlvbnMgYXJlIG9ubHkgaW5oZXJpdGVkIGlmIHRoZSBleHRlbmRpbmcgZWxlbWVudAotZG9lcyBub3QgZGVmaW5lIGl0cyBvd24gdG8tb25lIGFzc29jaWF0aW9uLjwvbGk+Ci08bGk+RXh0ZW5kcyB3b3JrcyB0cmFuc2l0aXZlbHksIGkuZS4gaWYgYW4gZXh0ZW5kaW5nIGVsZW1lbnQgaXMgZXh0ZW5kZWQgaXRzZWxmLAotdGhlIHNlY29uZCBleHRlbnNpb24gaW5oZXJpdHMgZnJvbSBpdHMgZGlyZWN0IGFuZCBpbmRpcmVjdCBiYXNlIGVsZW1lbnRzLjwvbGk+Ci08bGk+Q29udHJpYnV0aW9uIHByZWNlZGVzIEV4dGVuZHMsIGkuZS4gY29udHJpYnV0aW9uIGlzIGV2YWx1YXRlZCBmaXJzdCBhbmQKLXRoZW4gZXh0ZW5kaW5nIGVsZW1lbnRzIGluaGVyaXQgYWZ0ZXJ3YXJkcyBmcm9tIHRoZSBiYXNlIGVsZW1lbnQgKGluY2x1ZGluZwotYWxsIG9mIGl0cyBjb250cmlidXRpb24pLjwvbGk+Ci08bGk+UmVwbGFjZSBwcmVjZWRlcyBFeHRlbmRzLCBpLmUuIGlmIGEgYmFzZSBlbGVtZW50IGhhcyBhIHJlcGxhY2UgYW5kIGV4dGVuZHMKLXJlbGF0aW9uc2hpcCwgdGhlIGV4dGVuZGluZyBlbGVtZW50IGluaGVyaXRzIGZyb20gdGhlIHJlcGxhY2luZyBlbGVtZW50LjwvbGk+Ci08L3VsPgotU2VlIDxhIGhyZWY9InZhcmlhYmlsaXR5YXNzb2NpYXRpb25zLmh0bWwjdmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMiPlZhcmlhYmlsaXR5IEFzc29jaWF0aW9uczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGFzc29jaWF0aW9ucyBmb3IgZWFjaCBlbGVtZW50Ci10eXBlLjwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgdGl0bGU9IlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZSBvciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcgdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLiI+VmFyaWFiaWxpdHk8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InJlcGxhY2UuaHRtbCNyZXBsYWNlcyI+UmVwbGFjZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNvbnRyaWJ1dGVzLmh0bWwjY29udHJpYnV0ZXMiPkNvbnRyaWJ1dGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZmluZHJlcGxhY2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9maW5kcmVwbGFjZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM4Mzk2M2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9maW5kcmVwbGFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2d1aWRhbmNlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2d1aWRhbmNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU3NzJhNGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9ndWlkYW5jZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ikd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVndWlkYW5jZS5odG1sI2NyZWF0ZWd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Imd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkd1aWRhbmNlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJndWlkYW5jZSI+PGEgbmFtZT0iZ3VpZGFuY2UiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5HdWlkYW5jZTwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPkd1aWRhbmNlIGlzIGEgZ2VuZXJhbCB0ZXJtIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gPGEgaHJlZj0icm9sZS5odG1sI3JvbGUiPnJvbGVzPC9hPiwgPGEgaHJlZj0idGFzay5odG1sI3Rhc2siPnRhc2tzPC9hPiwgYW5kIDxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiPndvcmsgcHJvZHVjdHM8L2E+LiBFeGFtcGxlcyBvZiBndWlkYW5jZSBhcmU6PHVsPjxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5HdWlkZWxpbmU8L3NwYW4+PC9zdHJvbmc+IC0gUHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93Ci10byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzLCBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwKLWRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4KLUFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQKLWFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbgotb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUKLXRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQKLWFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBhbmQgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHkuPHA+PC9wPgotPC9saT4KLTxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5UZW1wbGF0ZTwvc3Bhbj48L3N0cm9uZz4gLSBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdAotcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLAotYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMKLWFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkKLWJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhCi1zdG9yZXMuPHA+PC9wPgotPC9saT4KLTxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5DaGVja2xpc3Q8L3NwYW4+PC9zdHJvbmc+IC0gQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQKLWlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpZmllZC4gQ2hlY2tsaXN0cwotYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy48cD48L3A+Ci08L2xpPgotPGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImtleXdvcmQiPlRvb2wgTWVudG9yPC9zcGFuPjwvc3Ryb25nPiAtIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0Ci1zaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yaywgZWl0aGVyCi1pbiB0aGUgY29udGV4dCBvZiwgb3IgaW5kZXBlbmRlbnQgZnJvbSwgYSB0YXNrIG9yIGFjdGl2aXR5LjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+U3VwcG9ydGluZyBNYXRlcmlhbDwvc3Bhbj48L3N0cm9uZz4gLSBVc2VkIGFzIGEgY2F0Y2ggYWxsIGZvcgotb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQKLXRvIGFsbCBraW5kcyBvZiBjb250ZW50IGVsZW1lbnRzLCBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuPHA+PC9wPgotPC9saT4KLTxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5SZXBvcnQ8L3NwYW4+PC9zdHJvbmc+IC0gQSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQKLWlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0KLW9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksCi13aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwKLWFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24KLWludG8gYSByZXBvcnQuPHA+PC9wPgotPC9saT4KLTxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5Db25jZXB0PC9zcGFuPjwvc3Ryb25nPiAtIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzCi1rZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLgotQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gZ3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3MKLXNldmVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcyBvciBhY3Rpdml0aWVzLjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+UHJhY3RpY2U8L3NwYW4+PC9zdHJvbmc+IC0gUmVwcmVzZW50cyBhIHByb3ZlbiB3YXkgb3Igc3RyYXRlZ3kKLW9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0Ci1vciBwcm9jZXNzIHF1YWxpdHkuIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4KLVRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWF5IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1ldGhvZCBvcgotc3BlY2lmaWMgcHJvY2Vzcy4gPHA+PC9wPgotPC9saT4KLTxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5SZXVzYWJsZSBBc3NldDwvc3Bhbj48L3N0cm9uZz4gLSBQcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbQotZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24KLWluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuCi1UaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nIGhvdyB0aGUKLWFzc2V0IHNob3VsZCBiZSB1c2VkLjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+VGVybSBEZWZpbml0aW9uPC9zcGFuPjwvc3Ryb25nPiAtIERlZmluZXMgY29uY2VwdHMgYW5kIGlzIHVzZWQKLXRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gQSB0ZXJtIGRlZmluaXRpb24gaXMgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gY29udGVudAotZWxlbWVudHMsIGJ1dCBpdHMgcmVsYXRpb25zaGlwIGlzIGJlaW5nIGRlcml2ZWQgd2hlbiB0aGUgdGVybSBpcyB1c2VkIGluIHRoZQotY29udGVudCBlbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+V2hpdGUgUGFwZXI8L3NwYW4+PC9zdHJvbmc+IC0gQSBzcGVjaWFsIGNvbmNlcHQgZ3VpZGFuY2UgdGhhdAotaGFzIGJlZW4gZXh0ZXJuYWwgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbgotaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+RXhhbXBsZTwvc3Bhbj48L3N0cm9uZz4gLSBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcwotYW4gZXhhbXBsZSBvZiBhIGNvbXBsZXRlZCB3b3JrIHByb2R1Y3QuPC9saT4KLTwvdWw+Ci1TZWUgYWxzbzo8L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWd1aWRhbmNlLmh0bWwjY3JlYXRlZ3VpZGFuY2UiPkNyZWF0ZSBHdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2d1aWRlbGluZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9ndWlkZWxpbmUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzllNzg4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2d1aWRlbGluZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iR3VpZGVsaW5lIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Imd1aWRlbGluZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5HdWlkZWxpbmU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Imd1aWRlbGluZSI+PGEgbmFtZT0iZ3VpZGVsaW5lIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+R3VpZGVsaW5lPC9oMT4KLTxkaXY+PHA+QSBHdWlkZWxpbmUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwKLW9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzLCBvciB0aGF0IHByb3ZpZGVzCi1hZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4KLUFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQKLWFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbgotb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUKLXRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQKLWFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzLCBhbmQgbWF0dXJpdHkuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pYm1kaXRhLmNzcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaWJtZGl0YS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdkYTI2YzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pYm1kaXRhLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLS51bnJlc29sdmVkIHsgYmFja2dyb3VuZC1jb2xvcjogc2t5Ymx1ZTsgfQotLm5vVGVtcGxhdGUgeyBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7IH0KLQotLnNpZGViYXIge2JhY2tncm91bmQ6IHNpbHZlciB9Ci0udG9jIHtmb250LXNpemU6IHNtYWxsOyB9Ci0KLS5iYXNlIHsgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsgfQotLmJyZWFkY3J1bWIgeyBmb250LXNpemUgOiBzbWFsbGVyO30KLS5wcmVyZXEgeyBtYXJnaW4tbGVmdCA6IDIwcHg7fQotLmhpZXJhcmNoeSB7IGRpc3BsYXk6IGJsb2NrOyBib3JkZXItc3R5bGU6IHNvbGlkOyBwYWRkaW5nLWxlZnQgOiAzcHg7IGJvcmRlci13aWR0aCA6IDJweDsgcGFkZGluZy1yaWdodCA6IDNweDsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLQotLm5lc3RlZDAgeyBtYXJnaW4tdG9wIDogMWVtO30KLS5uZXN0ZWQxIHsgfQotLm5lc3RlZDIgeyB9Ci0KLS5wIHttYXJnaW4tdG9wOiAxZW19Ci0KLS50YWJsZWJvcmRlciB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS50YWJsZW5vYm9yZGVyIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotY2FwdGlvbiB7IHRleHQtYWxpZ246IGxlZnQ7IGZvbnQtc3R5bGU6IGl0YWxpYyB9Ci0uc2ltcGxldGFibGVib3JkZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uc2ltcGxldGFibGVub2JvcmRlciB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5jaG9pY2V0YWJsZWJvcmRlciB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5jaG9pY2V0YWJsZW5vYm9yZGVyIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotCi0uZmlnY2FwIHsgZm9udC1zdHlsZTogaXRhbGljIH0KLS5maWdkZXNjIHsgZm9udC1zdHlsZTogbm9ybWFsIH0KLQotLmZpZ25vbmUge21hcmdpbi10b3A6IDFlbX0KLS5maWdib3JkZXIgeyBib3JkZXItc3R5bGU6IHNvbGlkOyBwYWRkaW5nLWxlZnQgOiAzcHg7IGJvcmRlci13aWR0aCA6IDJweDsgcGFkZGluZy1yaWdodCA6IDNweDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ3NpZGVzIHsgYm9yZGVyLWxlZnQgOiAycHggc29saWQ7IHBhZGRpbmctbGVmdCA6IDNweDsgYm9yZGVyLXJpZ2h0IDogMnB4IHNvbGlkOyBwYWRkaW5nLXJpZ2h0IDogM3B4OyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uZmlndG9wIHsgYm9yZGVyLXRvcCA6IDJweCBzb2xpZDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ2JvdHRvbSB7IGJvcmRlci1ib3R0b20gOiAycHggc29saWQ7IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uZmlndG9wYm90IHsgYm9yZGVyLXRvcCA6IDJweCBzb2xpZDsgYm9yZGVyLWJvdHRvbSA6IDJweCBzb2xpZDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotCi0uc3lubm9uZSB7bWFyZ2luLXRvcDogMWVtfQotLnN5bmJvcmRlciB7IGJvcmRlci1zdHlsZTogc29saWQ7IHBhZGRpbmctbGVmdCA6IDNweDsgYm9yZGVyLXdpZHRoIDogMnB4OyBwYWRkaW5nLXJpZ2h0IDogM3B4OyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uc3luc2lkZXMgeyBib3JkZXItbGVmdCA6IDJweCBzb2xpZDsgcGFkZGluZy1sZWZ0IDogM3B4OyBib3JkZXItcmlnaHQgOiAycHggc29saWQ7IHBhZGRpbmctcmlnaHQgOiAzcHg7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5zeW50b3AgeyBib3JkZXItdG9wIDogMnB4IHNvbGlkOyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uc3luYm90dG9tIHsgYm9yZGVyLWJvdHRvbSA6IDJweCBzb2xpZDsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5zeW50b3Bib3QgeyBib3JkZXItdG9wIDogMnB4IHNvbGlkOyBib3JkZXItYm90dG9tIDogMnB4IHNvbGlkOyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0KLS5za2lwIHsgbWFyZ2luLXRvcDogMWVtIH0KLS5za2lwc3BhY2UgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0udWxsaW5rcyB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZSB9Ci0udWxjaGlsZGxpbmsgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ub2xjaGlsZGxpbmsgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ubGlua2xpc3QgeyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmxpbmtsaXN0d2l0aGNoaWxkIHsgbWFyZ2luLWxlZnQ6IDEuNWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gIH0KLS5zdWJsaW5rbGlzdCB7IG1hcmdpbi1sZWZ0OiAxLjVlbTsgbWFyZ2luLWJvdHRvbTogMWVtICB9Ci0ucmVsY29uY2VwdHMgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ucmVsdGFza3MgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ucmVscmVmIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnJlbGluZm8geyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci1kaXYuYnJlYWRjcnVtYiB7bWFyZ2luLWJvdHRvbTogMWVtIH0KLQotLnRvcGljdGl0bGUxIHsgbWFyZ2luLXRvcDogMHBjOyBtYXJnaW4tYm90dG9tOiAuMWVtOyBmb250LXNpemU6IDEuMzRlbTsgfQotLnRvcGljdGl0bGUyIHsgbWFyZ2luLXRvcDogMXBjOyBtYXJnaW4tYm90dG9tOiAuNDVlbTsgZm9udC1zaXplOiAxLjE3ZW07IH0KLS50b3BpY3RpdGxlMyB7IG1hcmdpbi10b3A6IDFwYzsgbWFyZ2luLWJvdHRvbTogLjE3ZW07IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDsgfQotLnRvcGljdGl0bGU0IHsgbWFyZ2luLXRvcDogLjgzZW07IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDsgfQotLnRvcGljdGl0bGU1IHsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0udG9waWN0aXRsZTYgeyBmb250LXNpemU6IDEuMTdlbTsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci0uc2VjdGlvbnRpdGxlIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAwZW07IGNvbG9yOiBibGFjazsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtd2VpZ2h0OiBib2xkO30KLS5zZWN0aW9uIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmV4YW1wbGUgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0KLS5ub3RlIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5ub3RldGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ubm90ZWxpc3R0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS50aXAgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnRpcHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmZhc3RwYXRoIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5mYXN0cGF0aHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmltcG9ydGFudCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0uaW1wb3J0YW50dGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ucmVtZW1iZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnJlbWVtYmVydGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ucmVzdHJpY3Rpb24geyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnJlc3RyaWN0aW9udGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uYXR0ZW50aW9uIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5hdHRlbnRpb250aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5kYW5nZXJ0aXRsZSB7IG1hcmdpbi10b3A6IDFlbTsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmRhbmdlciB7IHBhZGRpbmc6IDVweCA1cHggNXB4IDVweDsgYm9yZGVyOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiB0aGluOyBmb250LXdlaWdodDogYm9sZDsgbWFyZ2luLXRvcDogMnB4OyBtYXJnaW4tYm90dG9tIDogMWVtOyB9Ci0uY2F1dGlvbnRpdGxlIHsgbWFyZ2luLXRvcDogMWVtOyBmb250LXdlaWdodDogYm9sZCB9Ci0uY2F1dGlvbiB7IGZvbnQtd2VpZ2h0OiBib2xkOyBtYXJnaW4tYm90dG9tIDogMWVtOyB9Ci0KLXVsLnNpbXBsZSB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZSB9Ci0KLS5maXJzdGNvbCB7IGZvbnQtd2VpZ2h0IDogYm9sZDt9Ci0KLS5ib2xkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5ib2xkSXRhbGljIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotLml0YWxpYyB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotLnVuZGVybGluZWQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotLnVpY29udHJvbCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0ucGFybW5hbWUgeyBmb250LXdlaWdodDogYm9sZDsgfQotLmRlZnBhcm1uYW1lIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0ua3dkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5kZWZrd2QgeyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KLS52YXIgeyBmb250LXN0eWxlIDogaXRhbGljO30KLS5zaG9ydGN1dCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0KLS5wdG9jSDEge2ZvbnQtc2l6ZTogeC1zbWFsbDsgfQotLnB0b2NIMiB7Zm9udC1zaXplOiB4LXNtYWxsOyB9Ci0KLS5zbWFsbENhcHMgeyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBmb250LXNpemU6IHNtYWxsZXI7IH0KLS5zdGl0bGUgeyBmb250LXN0eWxlOiBpdGFsaWM7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0ubnRlIHt9Ci0KLS5kbHRlcm0geyBmb250LXdlaWdodDogYm9sZDsgfQotLmRsdGVybWV4cGFuZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyBtYXJnaW4tdG9wOiAxZW07IH0KLS5kZWZMaXN0SGVhZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotLnBhcm1MaXN0S3dkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5wYXJtTGlzdFZhciB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotLnBrIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0KLSpbY29tcGFjdD0ieWVzIl0+bGkgeyBtYXJnaW4tdG9wOiAwZW07fQotKltjb21wYWN0PSJubyJdPmxpIHsgbWFyZ2luLXRvcDogLjUzZW07fQkKLS5saWV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5zbGlleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uZGxleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uZGRleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uc3RlcGV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5zdWJzdGVwZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotCi1kaXYuaW1hZ2VsZWZ0IHsgdGV4dC1hbGlnbjogbGVmdCB9Ci1kaXYuaW1hZ2VjZW50ZXIgeyB0ZXh0LWFsaWduOiBjZW50ZXIgfQotZGl2LmltYWdlcmlnaHQgeyB0ZXh0LWFsaWduOiByaWdodCB9Ci1kaXYuaW1hZ2VqdXN0aWZ5IHsgdGV4dC1hbGlnbjoganVzdGlmeSB9Ci0KLXByZS5zY3JlZW4geyBwYWRkaW5nOiA1cHggNXB4IDVweCA1cHg7IGJvcmRlcjogb3V0c2V0OyBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOyBtYXJnaW4tdG9wOiAycHg7IG1hcmdpbi1ib3R0b20gOiAycHg7IHdoaXRlLXNwYWNlOiBwcmV9Ci0KLUNJVEUgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLUVNIHsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci1TVFJPTkcgeyBmb250LXdlaWdodDogYm9sZDsgfQotVkFSIHsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIFN0eWxlcyBhZGRlZCB0byBzdXBwb3J0IC5ORVQgb3V0cHV0LiBOb3QgdXNlZCBieSBzdGFuZGFyZCBwcm9jZXNzaW5nLiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWJvZHkuZG90bmV0IC8qIFRoaXMgYm9keSB0YWcgcmVxdWlyZXMgdGhlIHVzZSBvZiBvbmUgb2YgdGhlIHNldHMgb2YgYmFubmVyIGFuZC9vciB0ZXh0IGRpdiBpZHMgKi8KLQl7Ci0JbWFyZ2luOiAwcHggMHB4IDBweCAwcHg7Ci0JcGFkZGluZzogMHB4IDBweCAwcHggMHB4OwotCWJhY2tncm91bmQ6ICNmZmZmZmY7IAotCWNvbG9yOiAjMDAwMDAwOwotCXdpZHRoOiAxMDAlOwotCX0KLQotZGl2Lm5zdGV4dCAvKiBDcmVhdGVzIHRoZSBzY3JvbGxpbmcgdGV4dCBhcmVhIGZvciBOb25zY3JvbGxpbmcgcmVnaW9uIHRvcGljICovCi0JewotCXBhZGRpbmc6IDVweCAxMHB4IDBweCAyMnB4OyAKLQl9Ci0KLWRpdi5uc2Jhbm5lciAvKiBDcmVhdGVzIE5vbnNjcm9sbGluZyBiYW5uZXIgcmVnaW9uICovCi0JewotCXBvc2l0aW9uOiByZWxhdGl2ZTsKLQlsZWZ0OiAwcHg7Ci0JcGFkZGluZzogMHB4IDBweCAwcHggMHB4OwotCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjOTk5OTk5OwotCX0KLQotZGl2LmJhbm5lcnJvdzEgLyogcHJvdmlkZXMgZnVsbC13aWR0aCBjb2xvciB0byB0b3Agcm93IGluIHJ1bm5pbmcgaGVhZCAqLwotCXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTljY2ZmOwotCX0KLQotLyogICAgICAgU1RZTEVTIEZPUiBSVU5OSU5HIEhFQURTICAgICAgKi8KLQotdGFibGUuYmFubmVycGFydGhlYWQsIHRhYmxlLmJhbm5lcnRpdGxlIC8qIEdlbmVyYWwgdmFsdWVzIGZvciB0aGUgUnVubmluZyBIZWFkIHRhYmxlcyAqLwotCXsKLQlwb3NpdGlvbjogcmVsYXRpdmU7Ci0JbGVmdDogMHB4OwotCXRvcDogMHB4OwotCXBhZGRpbmc6IDBweCAwcHggMHB4IDBweDsKLQltYXJnaW46IDBweCAwcHggMHB4IDBweDsKLQl3aWR0aDogMTAwJTsKLQloZWlnaHQ6IDIxcHg7IAotCWJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7Ci0JYm9yZGVyLXN0eWxlOiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IDBweDsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTljY2ZmOyAKLQlmb250LXNpemU6IDEwMCU7Ci0JfQotdGFibGUuYmFubmVycGFydGhlYWQgdGQgLyogR2VuZXJhbCBWYWx1ZXMgZm9yIGNlbGxzIGluIHRoZSB0b3Agcm93IG9mIHJ1bm5pbmcgaGVhZCAqLwotCXsKLQltYXJnaW46IDBweCAwcHggMHB4IDBweDsKLQlwYWRkaW5nOiAycHggMHB4IDBweCA0cHg7Ci0JdmVydGljYWwtYWxpZ246IG1pZGRsZTsKLQkvKmJvcmRlci13aWR0aDogMHB4IDBweCAxcHggMHB4OyAqLwotCWJvcmRlci13aWR0aDogMHB4Ci0JYm9yZGVyLXN0eWxlOiBzb2xpZDsKLQlib3JkZXItY29sb3I6ICM5OTk5OTk7Ci0JYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IAotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCX0KLXRhYmxlLmJhbm5lcnBhcnRoZWFkIHRkLnByb2R1Y3QgLyogVmFsdWVzIGZvciB0b3AgcmlnaHQgY2VsbCBpbiBydW5uaW5nIGhlYWQgKi8KLQl7ICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGxvd3MgZm9yIGEgc2Vjb25kIHRleHQgYmxvY2sgaW4gdGhlIHJ1bm5pbmcgaGVhZCAqLwotCXRleHQtYWxpZ246IHJpZ2h0OwotCXBhZGRpbmc6IDJweCA1cHggMHB4IDVweDsKLQl9Ci0KLWgxLmR0SDEgewotCW1hcmdpbi1sZWZ0OiAtMThweDsKLQl9Ci1kaXYudGl0bGVyb3cgLyogcHJvdmlkZXMgbm9uLXNjcm9sbCB0b3BpYyB0aXRsZSBhcmVhIChyZXF1aXJlcyBzY3JpcHQpICovCi0JewotCXdpZHRoOiAxMDAlOyAvKiBGb3JjZXMgdGFibGVzIHRvIGhhdmUgY29ycmVjdCByaWdodCBtYXJnaW4gKi8KLQlwYWRkaW5nOiAwcHggMTBweCAwcHggMjJweDsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzk5Y2NmZjsgICAgICAgIAotCX0KLWRpdi50aXRsZXJvdyBoMQotCXsKLQltYXJnaW4tdG9wOiAwZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogLjJlbQotCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaW5kZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaW5kZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTIxZmI3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2luZGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2l0YWxpYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2l0YWxpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmZTNlMGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pdGFsaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pdGVyYXRpb24uaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaXRlcmF0aW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1NGEzNmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pdGVyYXRpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ikl0ZXJhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJpdGVyYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+SXRlcmF0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJpdGVyYXRpb24iPjxhIG5hbWU9Iml0ZXJhdGlvbiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkl0ZXJhdGlvbjwvaDE+Ci08ZGl2PjxwPkl0ZXJhdGlvbiBpcyBhIGdyb3VwIG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLgotSXRlcmF0aW9uIHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbgotcmVwZXRpdGl2ZSBjeWNsZXMuPC9wPgotPC9kaXY+Ci08ZGl2PjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9saWJyYXJ5dmlldy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9saWJyYXJ5dmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZjI3ZTk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbGlicmFyeXZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkxpYnJhcnkgVmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJsaWJyYXJ5dmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5MaWJyYXJ5IFZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImxpYnJhcnl2aWV3Ij48YSBuYW1lPSJsaWJyYXJ5dmlldyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkxpYnJhcnkgVmlldzwvaDE+Ci08ZGl2PjxwPlRoZSBMaWJyYXJ5IFZpZXcgZGlzcGxheXMgdGhlIE1ldGhvZCBQbHVnLWlucyBhbmQgQ29uZmlndXJhdGlvbnMgY29udGFpbmVkCi1pbiBhIDxhIGhyZWY9InN0YW5kYXJkbWV0aG9kbGlicmFyeW92ZXJ2aWV3Lmh0bWwiPk1ldGhvZCBMaWJyYXJ5PC9hPi48L3A+Ci08cD5UaGUgTGlicmFyeSBWaWV3IGlzIGF2YWlsYWJsZSBvbmx5IGluIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+IGFuZCwKLXdoZW4gb3BlbiwgZW5hYmxlcyB0aGUgY3JlYXRpb24sIG1vZGlmaWNhdGlvbiBhbmQgdmlld2luZyBvZiBhbGwgZWxlbWVudCB0eXBlcy48L3A+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPGRpdiBjbGFzcz0icHJldmlvdXNsaW5rIj48c3Ryb25nPlByZXZpb3VzIHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sIj5Db25maWd1cmF0aW9uIFZpZXc8L2E+PC9kaXY+Ci08ZGl2IGNsYXNzPSJuZXh0bGluayI+PHN0cm9uZz5OZXh0IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJicm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudC5odG1sIj5Ccm93c2UgYW5kIFByZXZpZXcgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiB0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6Ij5Ub29sIEludGVyZmFjZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlMmNlZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhfdnNfcHJvYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhfdnNfcHJvYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIxNDVhYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRoX3ZzX3Byb2MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2RhdXRob3JpbmdvdmVydmlldy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2RhdXRob3JpbmdvdmVydmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOWQ1NjdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ik1ldGhvZCBDb250ZW50IEF1dGhvcmluZyBPdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Im1ldGhvZGF1dGhvcmluZ292ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPk1ldGhvZCBDb250ZW50IEF1dGhvcmluZyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ibWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXciPjxhIG5hbWU9Im1ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TWV0aG9kIENvbnRlbnQgQXV0aG9yaW5nIE92ZXJ2aWV3PC9oMT4KLTxkaXY+PHA+TWV0aG9kIGNvbnRlbnQgaXMgZGVzY3JpYmVkIGJ5IGRlZmluaW5nIHRhc2tzIHRoYXQgaGF2ZSB3b3JrIHByb2R1Y3RzIGFzCi1pbnB1dHMgYW5kIG91dHB1dHMgYW5kIHRoYXQgYXJlIHBlcmZvcm1lZCBieSByb2xlcy4gVGhlIHJvbGVzIGFsc28gZGVmaW5lCi1yZXNwb25zaWJpbGl0eSByZWxhdGlvbnNoaXBzIHRvIHRoZSB3b3JrIHByb2R1Y3RzLjwvcD4KLTxwPjxpbWcgc3JjPSJtYy5naWYiIGFsdD0iIiAvPjwvcD4KLTxwPlRoZSBmaWd1cmUgYWJvdmUgZGVwaWN0cyB0eXBpY2FsIHNvdXJjZXMgZm9yIG1ldGhvZCBjb250ZW50LCBhcyB3ZWxsIGFzCi1ob3cgdGhlIG1ldGhvZCBjb250ZW50IGlzIHJlcHJlc2VudGVkLiBUbyBsZWFybiBhYm91dCBkZXZlbG9wbWVudCBtZXRob2RzLAotcGVvcGxlIHJlc2VhcmNoIGluIGxpYnJhcmllcyBvciByZWNlaXZlIHRyYWluaW5nLiBEZXZlbG9wbWVudCBtZXRob2RzIGFyZQotdHlwaWNhbGx5IGRlc2NyaWJlZCBpbiBwdWJsaWNhdGlvbnMgc3VjaCBhcyBib29rcywgYXJ0aWNsZXMsIHRyYWluaW5nIG1hdGVyaWFsLAotc3RhbmRhcmRzIGFuZCByZWd1bGF0aW9ucywgb3IgYW55IG90aGVyIGZvcm0gb2YgZG9jdW1lbnRhdGlvbi4gVGhlc2Ugc291cmNlcwotdXN1YWxseSBkb2N1bWVudCBtZXRob2RzIGJ5IHByb3ZpZGluZyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIGZvciBhIHBhcnRpY3VsYXIKLXdheSBvZiBhY2hpZXZpbmcgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FsIHVuZGVyIGdlbmVyYWwgY2lyY3Vtc3RhbmNlcy4KLVNvbWUgZXhhbXBsZXMgYXJlOiB0cmFuc2Zvcm1pbmcgYSByZXF1aXJlbWVudHMgZG9jdW1lbnQgaW50byBhbiBhbmFseXNpcyBtb2RlbDsKLWRlZmluaW5nIGFuIGFyY2hpdGVjdHVyYWwgbWVjaGFuaXNtIGJhc2VkIG9uIGZ1bmN0aW9uYWwgYW5kIG5vbi1mdW5jdGlvbmFsCi1yZXF1aXJlbWVudHM7IGNyZWF0aW5nIGEgcHJvamVjdCBwbGFuIGZvciBhIGRldmVsb3BtZW50IGl0ZXJhdGlvbjsgZGVmaW5pbmcKLWEgcXVhbGl0eSBhc3N1cmFuY2UgcGxhbiBmb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHM7IHJlZGVzaWduaW5nIGEgYnVzaW5lc3MKLW9yZ2FuaXphdGlvbiBiYXNlZCBvbiBhIG5ldyBzdHJhdGVnaWMgZGlyZWN0aW9uLCBhbmQgc28gb24uIDwvcD4KLTxwPlRoaXMgdG9vbCB0YWtlcyBjb250ZW50IHN1Y2ggYXMgdGhlIGNvbnRlbnQgZGVzY3JpYmVkIGFib3ZlLCBhbmQgc3RydWN0dXJlcwotaXQgaW4gb25lIHNwZWNpZmljIHdheSB1c2luZyBhIHByZWRlZmluZWQgc2NoZW1hIG9mIGNvbmNlcHRzLiBUaGlzIHNjaGVtYQotc3VwcG9ydHMgdGhlIG9yZ2FuaXphdGlvbiBvZiBsYXJnZSBhbW91bnRzIG9mIGRlc2NyaXB0aW9ucyBmb3IgZGV2ZWxvcG1lbnQKLW1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gU3VjaCBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGRvIG5vdCBoYXZlIHRvIGJlCi1saW1pdGVkIHRvIHNvZnR3YXJlIGVuZ2luZWVyaW5nLCBidXQgY2FuIGFsc28gY292ZXIgb3RoZXIgZGVzaWduIGFuZCBlbmdpbmVlcmluZwotZGlzY2lwbGluZXMgc3VjaCBhcyBtZWNoYW5pY2FsIGVuZ2luZWVyaW5nLCBidXNpbmVzcyB0cmFuc2Zvcm1hdGlvbiwgc2FsZXMKLWN5Y2xlcywgYW5kIHNvIG9uLiA8L3A+Ci08cD5UaGUgc2NoZW1hIGZvciBtZXRob2QgY29udGVudCBpcyByZXByZXNlbnRlZCB0aGlzIHRvb2wgYXMgYSBjb25zdHJ1Y3Qgb2YKLXJvbGVzIGRlZmluaW5nIGRldmVsb3BtZW50IHNraWxscyBhbmQgcmVzcG9uc2liaWxpdGllcyBmb3Igd29yayBwcm9kdWN0cy4KLVRoZXNlIHdvcmsgcHJvZHVjdHMgYXJlIHByb2R1Y2VkIGJ5IHRhc2tzIHRoYXQgYXJlIHBlcmZvcm1lZCBieSB0aGUgcm9sZXMKLWFuZCBoYXZlIHRoZSB3b3JrIHByb2R1Y3RzIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gVGhlIHNjcmVlbiBjYXB0dXJlIGluIHRoZQotZmlndXJlIGFib3ZlIHNob3dzIGhvdyBzdWNoIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gdHJlZQotYnJvd3NlcnMgb24gdGhlIGxlZnQuIFRoZXNlIHRyZWUgYnJvd3NlcnMsIHNpbWlsYXIgdG8gYSBsaWJyYXJ5LCBwcm92aWRlIGRpZmZlcmVudAotaW5kZXhlcyBvZiB0aGUgYXZhaWxhYmxlIGVsZW1lbnRzIGZvciByYXBpZCBhY2Nlc3MuIFRoZSBzY3JlZW4gY2FwdHVyZSBzaG93cwotb24gdGhlIHJpZ2h0IGFuIGV4YW1wbGUgb2YgYSB0YXNrIHByZXNlbnRhdGlvbi4gVGhpcyB0YXNrIHByZXNlbnRhdGlvbiBkZWZpbmVzCi10aGUgdGFzayBpbiB0ZXJtcyBvZiBzdGVwcyB0aGF0IG5lZWQgdG8gYmUgcGVyZm9ybWVkIHRvIGFjaGlldmUgdGhlIHRhc2sncwotcHVycG9zZS4gWW91IGNhbiBzZWUgdGhhdCB0aGUgdGFzayBoYXMgdmFyaW91cyByZWxhdGlvbnNoaXBzLCBzdWNoIGFzIHJlbGF0aW9uc2hpcHMKLXRvIHBlcmZvcm1pbmcgcm9sZXMgYXMgd2VsbCBhcyB3b3JrIHByb2R1Y3RzIHRoYXQgc2VydmUgYXMgaW5wdXRzIGFuZCBvdXRwdXRzCi10byB0aGUgdGFzay4gRmluZCBtb3JlIGRldGFpbHMgb24gdGFza3MsIHJvbGUsIGFuZCB3b3JrIHByb2R1Y3RzIGluIHRoZSBvbmxpbmUKLWhlbHAgaGVyZS4gSW4gYWRkaXRpb24gdG8gcm9sZXMsIHRhc2tzLCBhbmQgd29yayBwcm9kdWN0cywgdGhpcyB0b29sIHN1cHBvcnRzCi10aGUgYWRkaXRpb24gb2YgZ3VpZGFuY2UgZWxlbWVudHMuIEd1aWRhbmNlIGFyZSBzdXBwbGVtZW50YXJ5IGZyZWUtZm9ybSBkb2N1bWVudGF0aW9uCi1zdWNoIGFzIHdoaXRlIHBhcGVycywgY29uY2VwdCBkZXNjcmlwdGlvbnMsIGd1aWRlbGluZXMsIHRlbXBsYXRlcywgZXhhbXBsZXMsCi1hbmQgc28gb24uIDwvcD4KLTxwPlRoaXMgdG9vbCBwcm92aWRlcyB2YXJpb3VzIGZvcm0tYmFzZWQgZWRpdG9ycyB0byBjcmVhdGUgbmV3IG1ldGhvZCBjb250ZW50Ci1lbGVtZW50cy4gRG9jdW1lbnQgeW91ciB0YXNrLCByb2xlcywgd29yayBwcm9kdWN0cywgYW5kIGd1aWRhbmNlIGVsZW1lbnRzCi11c2luZyBpbnR1aXRpdmUgcmljaC10ZXh0IGVkaXRvcnMgdGhhdCBhbGxvdyB5b3UgdG8gY29weSBhbmQgcGFzdGUgdGV4dCBmcm9tCi1vdGhlciBzb3VyY2VzIHN1Y2ggYXMgd2ViIHBhZ2VzIG9yIGRvY3VtZW50cy4gVXNlIHNpbXBsZSBkaWFsb2dzIHRvIGVzdGFibGlzaAotcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGNvbnRlbnQgZWxlbWVudHMuIEZvciBleGFtcGxlLCBtYWtlIGEgd29yayBwcm9kdWN0IHRoZQotaW5wdXQgdG8geW91ciB0YXNrIHNpbXBseSBieSBzZWxlY3RpbmcgaXQgaW4gYSBkaWFsb2cuPC9wPgotPHA+VXNpbmcgdGhpcyB0b29sLCB5b3UgY2FuIG9yZ2FuaXplIGNvbnRlbnQgaW4gcGh5c2ljYWwgY29udGVudCBwYWNrYWdlcwotdGhhdCBhbGxvdyB5b3UgdG8gbWFuYWdlIHlvdXIgY29udGVudCBpbiBjb25maWd1cmFibGUgdW5pdHMuIFlvdSBjYW4gYWxzbwotY2F0ZWdvcml6ZSB5b3VyIGNvbnRlbnQgYmFzZWQgb24gYSBzZXQgb2YgcHJlZGVmaW5lZCBjYXRlZ29yaWVzIChmb3IgZXhhbXBsZSwKLWNhdGVnb3JpemUgeW91ciB0YXNrcyBpbnRvIGRldmVsb3BtZW50IGRpc2NpcGxpbmVzLCBvciB5b3VyIHdvcmsgcHJvZHVjdHMKLWludG8gZG9tYWlucykgb3IgY3JlYXRlIHlvdXIgb3duIGNhdGVnb3JpemF0aW9uIHNjaGVtZXMgZm9yIHlvdXIgY29udGVudCB3aXRoCi15b3VyIG93biB1c2VyLWRlZmluZWQgY2F0ZWdvcmllcyB0aGF0IGFsbG93IHlvdSB0byBpbmRleCBjb250ZW50IGluIGFueSB3YXkKLXlvdSB3YW50LiA8L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj5NZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI3MDBmMmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb25maWd1cmF0aW9ucy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTWV0aG9kIENvbmZpZ3VyYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uLmh0bWwjY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0ibWV0aG9kY29uZmlndXJhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+TWV0aG9kIENvbmZpZ3VyYXRpb248L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Im1ldGhvZGNvbmZpZ3VyYXRpb25zIj48YSBuYW1lPSJtZXRob2Rjb25maWd1cmF0aW9ucyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9oMT4KLTxkaXY+PHA+TWV0aG9kIGNvbmZpZ3VyYXRpb25zIGFyZSB1c2VyLWRlZmluZWQgc3Vic2V0cyBvZiBlbGVtZW50cyBjb250YWluZWQgaW4KLXRoZSBNZXRob2QgTGlicmFyeS48L3A+Ci08cD5BIG1ldGhvZCBjb25maWd1cmF0aW9uIGRlZmluZXMgYSB3b3JraW5nIHNldCBvZiBwYWNrYWdlcyB3aXRoaW4gdGhlIG1ldGhvZAotbGlicmFyeSB0aGF0IGhlbHBzIHlvdSBsaW1pdCB5b3VyIHZpZXcgdG8gYSBzdWJzZXQgb2YgZWxlbWVudHMuIFRoZSBlbGVtZW50cwotdGhhdCBhcmUgcGFydCBvZiBhIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gYXJlIGRpc3BsYXllZCBpbiB0aGUgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPi4gTWV0aG9kIGNvbmZpZ3VyYXRpb25zIGFyZSB1c2VkIGZvciBjcmVhdGluZyBwcm9jZXNzZXMKLWFuZCBmb3IgcHVibGljYXRpb24gYnkgZGVmaW5pbmcgd2hpY2ggZWxlbWVudHMgYXJlIHB1Ymxpc2hlZCBpbiBIVE1MIGFuZCB3aGljaAotYXJlIG5vdC48L3A+Ci08cD5BIG1ldGhvZCBjb25maWd1cmF0aW9uIGNvbnNpc3RzIG9mIHRocmVlIHNwZWNpZnlpbmcgcGFydHM6PC9wPgotPHVsPjxsaT5BIGRlc2NyaXB0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uLjwvbGk+Ci08bGk+QSBzZWxlY3Rpb24gZnJvbSB0aGUgc2V0IG9mIHBsdWctaW5zIGFuZCBwYWNrYWdlcy48L2xpPgotPGxpPkEgc2VsZWN0aW9uIG9mIHZpZXdzIHRvIGJlIHB1Ymxpc2hlZCBpbiB0aGUgV2ViIHNpdGUuPC9saT4KLTwvdWw+Ci08cD5JbiBhIG1ldGhvZCBjb25maWd1cmF0aW9uLCB5b3UgYXJlIGFibGUgdG8gc2VsZWN0IGFuZCBkZXNlbGVjdCBmcm9tIHRoZQotY29udGVudCBwYWNrYWdlcyBhbmQgcHJvY2VzcyBhdmFpbGFibGUgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5J3MKLXNldCBvZiBwbHVnLWlucy4gVGhlIHNlbGVjdGlvbnMgeW91IG1ha2UgaGVscCBkZXRlcm1pbmUgdGhlIGNvbnRlbnQgb2YgeW91cgotcHVibGlzaGVkIFdlYiBzaXRlLiBBIGNvbmZpZ3VyYXRpb24gaXMgZ2l2ZW4gYSBuYW1lIGFuZCB0aGVuIHNhdmVkIHNvIGl0IGNhbgotYmUgY2hhbmdlZCBhbmQgdGhlbiByZS1wdWJsaXNoZWQgYXQgYSBsYXRlciBkYXRlLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uLmh0bWwjY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24iPkNyZWF0ZSBhIE1ldGhvZCBDb25maWd1cmF0aW9uPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQzY2JkZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJNZXRob2QgQ29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5NZXRob2QgQ29udGVudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj48YSBuYW1lPSJjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5NZXRob2QgQ29udGVudDwvaDE+Ci08ZGl2PjxwPk1ldGhvZCBjb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcKLWhvdyBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQsIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQKLW9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kCi1lbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8KLXNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLjwvcD4KLTxwPk1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGFyZTo8L3A+Ci08dWw+PGxpPjxhIGhyZWY9InRhc2suaHRtbCN0YXNrIj5UYXNrPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icm9sZS5odG1sI3JvbGUiPlJvbGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3Q8L2E+PC9saT4KLTxsaT48YSBocmVmPSJndWlkYW5jZS5odG1sIj5HdWlkYW5jZTwvYT48L2xpPgotPC91bD4KLTxwPkEgUHJvY2VzcyBFbmdpbmVlciBhdXRob3JzIHRoZXNlIGVsZW1lbnRzLCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4KLXRoZW0sIGFuZCB0aGVuIGNhdGVnb3JpemVzIHRoZW0uIE1ldGhvZCBjb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsCi1kZXNjcmliaW5nIGhvdyBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlCi1wbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiBQcm9jZXNzZXMgdGFrZSB0aGVzZQotbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZAotdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuPC9wPgotPHA+Rm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRldmVsb3BzIGFuIGFwcGxpY2F0aW9uCi1mcm9tIHNjcmF0Y2ggcGVyZm9ybXMgZGV2ZWxvcG1lbnQgdGFza3Mgc3VjaCBhcyAiRGV2ZWxvcCBWaXNpb24iIG9yICJVc2UgQ2FzZQotRGVzaWduIiBzaW1pbGFyIHRvIGEgcHJvamVjdCB0aGF0IGV4dGVuZHMgYW4gZXhpc3Rpbmcgc29mdHdhcmUgc3lzdGVtLiBIb3dldmVyLAotdGhlIHR3byBwcm9qZWN0cyB3aWxsIHBlcmZvcm0gdGhlIHRhc2tzIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSB3aXRoIGEKLWRpZmZlcmVudCBlbXBoYXNpcywgaS5lLiwgdGhleSBwZXJmb3JtIHRoZSBzdGVwcyBvZiB0aGVzZSB0YXNrcyBhdCBkaWZmZXJlbnQKLXBvaW50cyBvZiB0aW1lIGFuZCBwZXJoYXBzIGFwcGx5IGluZGl2aWR1YWwgdmFyaWF0aW9ucyBhbmQgYWRkaXRpb25zLiA8L3A+Ci08cD5NZXRob2QgY29udGVudCBlbGVtZW50cyBhcmUgY29udGFpbmVkIHdpdGhpbiBtZXRob2QgY29udGVudCBwYWNrYWdlcyB3aGljaCwKLWluIHR1cm4sIGFyZSBjb250YWluZWQgd2l0aGluIGEgTWV0aG9kIHBsdWctaW4uIEluIG9yZGVyIHRvIHNlcGFyYXRlIHlvdXIKLW93biBjb250ZW50IGZyb20gb3JpZ2luYWwgT3BlblVQIGNvbnRlbnQsIHlvdSBzaG91bGQgYWx3YXlzIGNyZWF0ZSBuZXcKLW1ldGhvZCBjb250ZW50IGluIGEgbWV0aG9kIHBsdWctaW4gdGhhdCB5b3UgcHJvZHVjZS4gQ3JlYXRpbmcgbWV0aG9kIGNvbnRlbnQKLWluIGEgbWV0aG9kIHBsdWctaW4gb2YgeW91ciBvd24gYWxzbyBhbGxvd3MgeW91IHRvIHVwZGF0ZSB5b3VyIG93biBsaWJyYXJ5Ci13aXRoIG5ldyByZWxlYXNlcyBvZiB0aGUgT3BlblVQIGxpYnJhcnkgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNvbnRlbnQKLXRoYXQgeW91IGhhdmUgY3JlYXRlZCBpbiB5b3VyIG93biBwbHVnLWlucy48L3A+Ci08cD5TZWUgYWxzbzo8L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIj5NZXRob2QgQ29udGVudCBDYXRlZ29yaWVzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50Ij5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIj5DcmVhdGUgYSBNZXRob2QgUGx1Zy1pbjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUzYTY0OTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTWV0aG9kIENvbnRlbnQgQ2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+TWV0aG9kIENvbnRlbnQgQ2F0ZWdvcmllczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMiPjxhIG5hbWU9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TWV0aG9kIENvbnRlbnQgQ2F0ZWdvcmllczwvaDE+Ci08ZGl2PjxwPk1ldGhvZCBDb250ZW50IGVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW50byBsb2dpY2FsIGNhdGVnb3JpZXMuIFRoZSBjYXRlZ29yaWVzCi1jYW4gYXBwZWFyIGluIHlvdXIgZmluYWwsIHB1Ymxpc2hlZCBXZWIgc2l0ZSBhcyB2aWV3cy48L3A+Ci08cD5UaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGNhdGVnb3J5OiBTdGFuZGFyZCBhbmQgQ3VzdG9tLjwvcD4KLTxwPjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TdGFuZGFyZCBDYXRlZ29yaWVzPC9oND48cD5TdGFuZGFyZCBDYXRlZ29yaWVzIHByb3ZpZGUKLWEgbWVhbnMgdG8gY2F0ZWdvcml6ZSBjb3JlIG1ldGhvZCBjb250ZW50IGluIGxpbmUgd2l0aCB0aGUgYmVzdCBwcmFjdGljZXMKLWZvciBjcmVhdGluZyBzdHJ1Y3R1cmVkIG1ldGhvZHMuIFN0YW5kYXJkIENhdGVnb3JpZXMgYXJlIGxpbmtlZCB3aXRoIGEgc3BlY2lmaWMKLW1ldGhvZCBjb250ZW50IHR5cGUsIGUuZy4gRGlzY2lwbGluZXMgY29udGFpbiBvbmx5IHRhc2tzLiA8L3A+Ci08ZGl2IGNsYXNzPSJwIj5TdGFuZGFyZAotQ2F0ZWdvcnkgdHlwZXMgYXJlOjx1bD48bGk+PHN0cm9uZz5EaXNjaXBsaW5lczwvc3Ryb25nPiAtIEEgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgPGEgaHJlZj0idGFzay5odG1sI3Rhc2siPlRhc2tzPC9hPiB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgYXJlYSBvZiBjb25jZXJuIHdpdGhpbgotdGhlIG92ZXJhbGwgSVQgZW52aXJvbm1lbnQuIEZvciBleGFtcGxlLCBvbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QsCi1pdCBpcyBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyB0YXNrcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aAotYW5hbHlzaXMgYW5kIGRlc2lnbiB0YXNrcy4gU2VwYXJhdGluZyB0aGVzZSB0YXNrcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzCi1tYWtlcyB0aGUgdGFza3MgZWFzaWVyIHRvIGNvbXByZWhlbmQuIERpc2NpcGxpbmVzIGNhbiBiZSBvcmdhbml6ZWQgdXNpbmcgRGlzY2lwbGluZQotR3JvdXBpbmdzLjwvbGk+Ci08bGk+PHN0cm9uZz5Eb21haW5zPC9zdHJvbmc+IC0gQSBEb21haW4gaXMgYSByZWZpbmVhYmxlLCBsb2dpY2FsLCBoaWVyYXJjaHkgb2YgcmVsYXRlZCA8YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3RzPC9hPiBncm91cGVkCi10b2dldGhlciBiYXNlZCBvbiB0aW1pbmcsIHJlc291cmNlcywgb3IgcmVsYXRpb25zaGlwLiBXaGlsZSBhIERvbWFpbiBjYXRlZ29yaXplcwotbWFueSB3b3JrIHByb2R1Y3RzLCBhIHdvcmsgcHJvZHVjdCBiZWxvbmdzIHRvIG9ubHkgb25lIERvbWFpbi4gRG9tYWlucyBjYW4KLWJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLiA8L2xpPgotPGxpPjxzdHJvbmc+V29yayBQcm9kdWN0IEtpbmRzPC9zdHJvbmc+IC0gV29yayBQcm9kdWN0IEtpbmQgaXMgYW5vdGhlciBjYXRlZ29yeSBmb3IKLWdyb3VwaW5nIDxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiPldvcmsgUHJvZHVjdHM8L2E+LgotQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSB3b3JrIHByb2R1Y3Qga2luZHMuIEFzIGFuIGV4YW1wbGUsIHlvdSBtaWdodAotd2FudCB0byBoYXZlIGEgc2VyaWVzIG9mIHdvcmsgcHJvZHVjdCBraW5kcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIG92ZXJhbGwKLWludGVudCBvZiB3b3JrIHByb2R1Y3RzLCBzdWNoIGFzIHNwZWNpZmljYXRpb24sIHBsYW4sIG9yIG1vZGVsLjwvbGk+Ci08bGk+PHN0cm9uZz5Sb2xlIFNldHM8L3N0cm9uZz4gLSBBIFJvbGUgU2V0IGlzIHVzZWQgdG8gZ3JvdXAgPGEgaHJlZj0icm9sZS5odG1sI3JvbGUiPlJvbGVzPC9hPiB3aXRoIGNlcnRhaW4gY29tbW9uYWxpdGllcyB0b2dldGhlci4gRm9yIGV4YW1wbGUsCi1pbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IGVudmlyb25tZW50LCBhbiBBbmFseXN0IHJvbGUgc2V0IGNvdWxkIGJlIHVzZWQgdG8KLWdyb3VwIHRvZ2V0aGVyIHJvbGVzIHN1Y2ggYXMgQnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0LCBTeXN0ZW0gQW5hbHlzdCBhbmQKLVJlcXVpcmVtZW50cyBTcGVjaWZpZXIuIEVhY2ggb2YgdGhlc2Ugcm9sZXMgd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQKLWhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgbWF5IGJlIHJlc3BvbnNpYmxlIGZvciBwZXJmb3JtaW5nIGNlcnRhaW4gdGFza3MKLWFuZCBjcmVhdGluZyBjZXJ0YWluIHdvcmsgcHJvZHVjdHMuIFJvbGUgc2V0cyBjYW4gYmUgb3JnYW5pemVkIHVzaW5nIFJvbGUKLVNldCBHcm91cGluZ3MuPC9saT4KLTxsaT48c3Ryb25nPlRvb2xzPC9zdHJvbmc+IC0gVG9vbHMgaXMgYSBjb250YWluZXIgZm9yIDxhIGhyZWY9InRvb2xtZW50b3IuaHRtbCN0b29sbWVudG9yIj5Ub29sIE1lbnRvcnM8L2E+LiBUb29scyBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zCi1vZiBhIHRvb2wgYW5kIGl0J3MgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkN1c3RvbSBDYXRlZ29yaWVzPC9oND48cD5DdXN0b20gQ2F0ZWdvcmllcyBhcmUgaGlnaGx5IGN1c3RvbWl6YWJsZQotYW5kIGNhbiBjb250YWluIGFueSB0eXBlIG9mIGVsZW1lbnQuIEN1c3RvbSBDYXRlZ29yaWVzIGFsbG93IHlvdSB0byBjYXRlZ29yaXplCi1jb250ZW50IGFjY29yZGluZyB0byBhbnkgc2NoZW1lIHlvdSB3YW50IGFuZCBjYW4gdGhlbiBiZSB1c2VkIHRvIGNvbXBvc2UgcHVibGlzaGFibGUKLVZpZXdzLCBwcm92aWRpbmcgYSBtZWFucyB0byBvcmdhbml6ZSB0aGUgbWV0aG9kIGNvbnRlbnQgcHJpb3IgdG8gcHVibGlzaGluZy4KLUZvciBleGFtcGxlLCB5b3UgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRoYXQgbG9naWNhbGx5IG9yZ2FuaXplcyBjb250ZW50Ci1yZWxldmFudCB0byB5b3VyIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50LCBzdWNoIGFzIGEgVGVzdGluZyBjYXRlZ29yeQotdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnRzCi1yZWxldmFudCB0byB0ZXN0aW5nLjwvcD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+TWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiPk1ldGhvZCBDb250ZW50IFBhY2thZ2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZhODVmOTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50cGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTWV0aG9kIENvbnRlbnQgUGFja2FnZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYWNvbnRlbnRwYWNrYWdlLmh0bWwjY3JlYXRlY29udGVudHBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRlbWV0aG9kY29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJtZXRob2Rjb250ZW50cGFja2FnZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5NZXRob2QgQ29udGVudCBQYWNrYWdlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJtZXRob2Rjb250ZW50cGFja2FnZSI+PGEgbmFtZT0ibWV0aG9kY29udGVudHBhY2thZ2UiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5NZXRob2QgQ29udGVudCBQYWNrYWdlPC9oMT4KLTxkaXY+PHA+QSBNZXRob2QgcGFja2FnZSBpcyBhIGNvbnRhaW5lciBmb3IgbWV0aG9kIGVsZW1lbnRzLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkCi1pbiBtZXRob2QgcGFja2FnZXMgdG8gc3RydWN0dXJlIGEgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcwotYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiBNZXRob2QgZWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZQotY2FuIHJldXNlIGVsZW1lbnRzIGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSBsaW5rIGJldHdlZW4gdGhlbS4gRm9yCi1leGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvcgotdGFza3MgZGVmaW5lZCBpbiBhbm90aGVyIHBhY2thZ2UsIGVuc3VyaW5nIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mCi10aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuIEFsc28sIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkKLWltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS48L3A+Ci08cD48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U3RydWN0dXJlIG9mIGEgTWV0aG9kIFBhY2thZ2U8L2g0PjxwPkFsdGhvdWdoIGEgbWV0aG9kCi1wYWNrYWdlIGlzIGEgY29udGFpbmVyIGZvciBtZXRob2QgZWxlbWVudHMsIGl0cyBzdHJ1Y3R1cmUgaXMgYnJva2VuIGRvd24gaW50bwotc21hbGxlciBwYWNrYWdlcyB0byBiZXR0ZXIgb3JnYW5pemUgdGhlIGNvbnRlbnQsIHN1Y2ggYXMgY29udGVudCBwYWNrYWdlcywKLXN0YW5kYXJkIGNhdGVnb3JpZXMsIGFuZCBjdXN0b20gY2F0ZWdvcmllcy48L3A+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFjb250ZW50cGFja2FnZS5odG1sI2NyZWF0ZWNvbnRlbnRwYWNrYWdlIj5DcmVhdGUgYSBDb250ZW50IFBhY2thZ2U8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIj5DcmVhdGUgYSBNZXRob2QgUGx1Zy1pbjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZHBsdWdpbi5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2RwbHVnaW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTgzOTA0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZHBsdWdpbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTWV0aG9kIFBsdWctaW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sI21ldGhvZGNvbnRlbnRwYWNrYWdlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Im1ldGhvZHBsdWdpbiIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5NZXRob2QgUGx1Zy1pbjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ibWV0aG9kcGx1Z2luIj48YSBuYW1lPSJtZXRob2RwbHVnaW4iPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5NZXRob2QgUGx1Zy1pbjwvaDE+Ci08ZGl2PjxwPkFsbCBjb250ZW50IGlzIG9yZ2FuaXplZCBpbiBtZXRob2QgcGx1Zy1pbnMuIEEgbWV0aG9kIHBsdWctaW4gaXMgYSBjb250YWluZXIKLWZvciBtZXRob2QgcGFja2FnZXMgd2hpY2gsIGluIHR1cm4sIGNvbnRhaW4gdGhlIG1ldGhvZCBhbmQgcHJvY2VzcyBjb250ZW50LgotTWV0aG9kIHBsdWctaW5zIGFuZCBtZXRob2QgcGFja2FnZXMgYWxsb3cgeW91IHRvIG9yZ2FuaXplIHlvdXIgY29udGVudCBhdAotYSBsZXZlbCBvZiBncmFudWxhcml0eSB0aGF0IHN1aXRzIHlvdXIgbmVlZHMgZm9yIGF1dGhvcmluZyBhbmQgcmV1c2luZyB0aGUKLWNvbnRlbnQuIDwvcD4KLTxwPldoZW4geW91IGNyZWF0ZSBhIG1ldGhvZCBwbHVnLWluLCB5b3Ugd2lsbCB1c3VhbGx5IHdhbnQgdG8gcmV1c2UgY29udGVudAotaW4gb3RoZXIgcGx1Zy1pbnMuIFlvdSBtYXkgd2FudCB0byBtb2RpZnkgb3IgZXh0ZW5kIHRoZSBjb250ZW50IGluIHRoZXNlIG90aGVyCi1wbHVnLWlucyBvciBhZGQgeW91ciBvd24gY29udGVudC4gV2hlbiB5b3UgY3JlYXRlIGEgcGx1Zy1pbiB5b3UKLWNhbiByZWZlcmVuY2UgYW55IG51bWJlciBvZiBvdGhlciBwbHVnLWlucyB0aGF0IHdhbnQgdG8gdXNlIGluIHRoaXMgd2F5LiBBCi1tZXRob2QgcGx1Zy1pbiBjYW4gYWxzbyBiZSBzdGFuZC1hbG9uZSBhbmQgbm90IHJlZmVyZW5jZSBvdGhlciBwbHVnLWlucy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sI21ldGhvZGNvbnRlbnRwYWNrYWdlIj5NZXRob2QgQ29udGVudCBQYWNrYWdlPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIj5DcmVhdGUgYSBNZXRob2QgUGx1Zy1pbjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21pbGVzdG9uZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9taWxlc3RvbmUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTljYzc3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21pbGVzdG9uZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTWlsZXN0b25lIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Im1pbGVzdG9uZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5NaWxlc3RvbmU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Im1pbGVzdG9uZSI+PGEgbmFtZT0ibWlsZXN0b25lIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TWlsZXN0b25lPC9oMT4KLTxkaXY+PHA+QSBNaWxlc3RvbmUgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBwcm9qZWN0LCBzdWNoCi1hcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5Ci1zdWNoIGFzIHRoZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZS48L3A+Ci08L2Rpdj4KLTxkaXY+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL29wZW5wZXJzcC5KUEcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL29wZW5wZXJzcC5KUEcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhNGE2MDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vcGVucGVyc3AuSlBHCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vdXRjb21lLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL291dGNvbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmQzZmJlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL291dGNvbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ik91dGNvbWUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJhcnRpZmFjdC5odG1sI2FydGlmYWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkZWxpdmVyYWJsZS5odG1sI2RlbGl2ZXJhYmxlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Im91dGNvbWUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+T3V0Y29tZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ib3V0Y29tZSI+PGEgbmFtZT0ib3V0Y29tZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPk91dGNvbWU8L2gxPgotPGRpdj48cD5BbiBvdXRjb21lIGlzIGFuIGludGFuZ2libGUgd29yayBwcm9kdWN0IHRoYXQgbWF5IGJlIGEgcmVzdWx0IG9yIHN0YXRlLgotT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseQotZGVmaW5lZC4gPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJhcnRpZmFjdC5odG1sI2FydGlmYWN0Ij5BcnRpZmFjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZGVsaXZlcmFibGUuaHRtbCNkZWxpdmVyYWJsZSI+RGVsaXZlcmFibGU8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwiPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL291dGRlbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vdXRkZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWQ2NDY5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL291dGRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wYXN0ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Bhc3RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWQ3ZTY5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Bhc3RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcGVyc3BlY3RpdmVzLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3BlcnNwZWN0aXZlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOGMzZTVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcGVyc3BlY3RpdmVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJQZXJzcGVjdGl2ZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sI3VzZXJpbnRlcmZhY2VvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJwZXJzcGVjdGl2ZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+UGVyc3BlY3RpdmVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJwZXJzcGVjdGl2ZXMiPjxhIG5hbWU9InBlcnNwZWN0aXZlcyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlBlcnNwZWN0aXZlczwvaDE+Ci08ZGl2PjxwPkEgUGVyc3BlY3RpdmUgZGVmaW5lcyBhIHNldCBvZiB2aWV3cyBhbmQgZnVuY3Rpb25zIGF2YWlsYWJsZSBmb3Igc3BlY2lmaWMKLXRhc2tzLiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGNvbnRhaW5zIHR3byB3b3JraW5nIHBlcnNwZWN0aXZlczogYW4KLUF1dGhvcmluZyBQZXJzcGVjdGl2ZSBhbmQgYSBCcm93c2luZyBQZXJzcGVjdGl2ZS48L3A+Ci08cD5UaGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nCi1QZXJzcGVjdGl2ZTwvYT4gcHJvdmlkZXMgdmlld3MgYW5kIGZ1bmN0aW9ucyB0byBuYXZpZ2F0ZSBhbmQgYXV0aG9yIG1ldGhvZAotY29udGVudCBhbmQgcHJvY2Vzc2VzLCB3aGlsZSB0aGUgPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+LCBhcyBpdHMgbmFtZSBpbXBsaWVzLCBhbGxvd3MgeW91Ci10byBwcmV2aWV3IGFuZCBuYXZpZ2F0ZSB0aHJvdWdoIGEgPGEgaHJlZj0ibWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCNtZXRob2Rjb25maWd1cmF0aW9ucyI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2E+IHdpdGhvdXQgbWFraW5nIGFueSBjaGFuZ2VzLjwvcD4KLTxwPlRvIHNlbGVjdCBhIHBlcnNwZWN0aXZlLCBjbGljayB0aGUgT3BlbiBQZXJzcGVjdGl2ZSBidXR0b24gPGltZyBzcmM9Im9wZW5wZXJzcC5KUEciIGFsdD0iIiAvPi48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCN1c2VyaW50ZXJmYWNlb3ZlcnZpZXciIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcGhhc2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcGhhc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTMyZmVhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3BoYXNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJQaGFzZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJwaGFzZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5QaGFzZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icGhhc2UiPjxhIG5hbWU9InBoYXNlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UGhhc2U8L2gxPgotPGRpdj48cD5BIFBoYXNlIGlzIGEgc3BlY2lhbCB0eXBlIG9mIGFjdGl2aXR5IHRoYXQgcmVwcmVzZW50cyBhIHNpZ25pZmljYW50Ci1wZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBhIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lCi1vciBzZXQgb2YgZGVsaXZlcmFibGVzLjwvcD4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJhY3RpY2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJhY3RpY2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2U3NGNhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ByYWN0aWNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJQcmFjdGljZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJwcmFjdGljZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5QcmFjdGljZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icHJhY3RpY2UiPjxhIG5hbWU9InByYWN0aWNlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UHJhY3RpY2U8L2gxPgotPGRpdj48cD5BIHByYWN0aWNlIHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZQotYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuIFByYWN0aWNlcwotYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMKLXRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gRXhhbXBsZXMKLWZvciBwcmFjdGljZXMgd291bGQgYmUgbWFuYWdlIHJpc2tzLCBjb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHksIGFyY2hpdGVjdHVyZQotY2VudHJpYywgYW5kIGNvbXBvbmVudCBiYXNlZCBkZXZlbG9wbWVudCwgdG8gbmFtZSBhIGZldy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ByZXZpZXcuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJldmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzN2E0ZjliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJldmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUHJldmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJwcmV2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlByZXZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InByZXZpZXciPjxhIG5hbWU9InByZXZpZXciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5QcmV2aWV3PC9oMT4KLTxkaXY+PHA+UHJldmlldyBkaXNwbGF5cyB5b3VyIGNvbnRlbnQgaW4gYnJvd3NlciBmb3JtYXQgc2ltaWxhciB0bwotaG93IGl0IHdpbGwgYXBwZWFyIHRvIGFuIGVuZCB1c2VyIGJyb3dzaW5nIGEgcHVibGlzaGVkIFdlYiBzaXRlLjwvcD4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2F1dGguZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jYXV0aC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiZjhlODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jYXV0aC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3MuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMmZjODJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwjcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwjY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybiIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlByb2Nlc3M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InByb2Nlc3MiPjxhIG5hbWU9InByb2Nlc3MiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Qcm9jZXNzPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+QSA8c3BhbiBjbGFzcz0ia2V5d29yZCI+cHJvY2Vzczwvc3Bhbj4gZGVzY3JpYmVzIGhvdyBhIHBhcnRpY3VsYXIgcGllY2UKLW9mIHdvcmsgc2hvdWxkIGJlIGRvbmUuIFRoZSB3b3JrIG1heSBoYXZlIGEgcmVsYXRpdmVseSBzbWFsbCBzY29wZSwgaW4gd2hpY2gKLWNhc2UgaXQgY2FuIGJlIGRlc2NyaWJlZCBhcyBhIGNhcGFiaWxpdHkgcGF0dGVybiwgb3IgbWF5IGFkZHJlc3MgYSBmdWxsIHByb2plY3QKLWxpZmVjeWNsZSwgaW4gd2hpY2ggY2FzZSBpdCBjYW4gYmUgZGVzY3JpYmVkIGFzIGEgZGVsaXZlcnkgcHJvY2Vzcy4gQSBwcm9jZXNzCi1jYW4gcmV1c2UgbWV0aG9kIGVsZW1lbnRzIGFuZCBjb21iaW5lcyB0aGVtIGludG8gYSBzdHJ1Y3R1cmUgYW5kIHNlcXVlbmNlCi1mb3IgY2Fycnlpbmcgb3V0IHdvcmsuPC9wPgotPHA+VGhlcmUgYXJlIHR3byBtYWluIHR5cGVzIG9mIHByb2Nlc3MsIGEgPGEgaHJlZj0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjYXBhYmlsaXR5cGF0dGVybiI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9hPiBhbmQKLWEgPGEgaHJlZj0iZGVsaXZlcnlwcm9jZXNzLmh0bWwjZGVsaXZlcnlwcm9jZXNzIj5EZWxpdmVyeSBQcm9jZXNzPC9hPi4KLUEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGEgc3BlY2lhbCBwcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3Rlcgotb2YgYWN0aXZpdGllcyBpbiBjb21tb24gcHJvY2VzcyBhcmVhcywgd2hpbGUgYSBkZWxpdmVyeSBwcm9jZXNzIGRlc2NyaWJlcwotYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHR5cGUgb2YgcHJvamVjdC48L3A+Ci08cD5FYWNoCi10aW1lIGEgdGFzayBpcyBpbmNsdWRlZCBpbiBhIHByb2Nlc3MsIGEgcmVmZXJlbmNlIG9iamVjdCB0byB0aGF0IHRhc2sgaXMgY3JlYXRlZAotaW4gdGhlIGNvbnRleHQgb2YgdGhlIHByb2Nlc3MuIFRoaXMgaXMgY2FsbGVkIGEgdGFzayBkZXNjcmlwdG9yLiBUaGUgc2FtZQotdGFzayBjYW4gYmUgcmVmZXJlbmNlZCBhbnkgbnVtYmVyIG9mIHRpbWVzIGluIHRoZSBzYW1lIHByb2Nlc3MuIEluIG90aGVyIHdvcmRzLAotb25lIHRhc2sgY2FuIGhhdmUgbWFueSB0YXNrIGRlc2NyaXB0b3JzLiBBIHRhc2sgZGVzY3JpcHRvciBjYW4gYWxzbyBtb2RpZnkKLXRoZSBiYXNlIHRhc2sgd2l0aG91dCBhY3R1YWxseSBjaGFuZ2luZyB0aGUgdGFzay4gRm9yIGV4YW1wbGUsIHJvbGVzIGFuZCB3b3JrCi1wcm9kdWN0cyBjYW4gYmUgYWRkZWQgb3Igc3VwcHJlc3NlZCwgYW5kIHN0ZXBzIGNhbiBiZSBzdXBwcmVzc2VkIG9yIHJlLXNlcXVlbmNlZC48L3A+Ci08cD5Sb2xlcwotYW5kIHdvcmsgcHJvZHVjdHMgY2FuIGFsc28gYmUgaW5jbHVkZWQgaW4gcHJvY2Vzc2VzIGFzIHJvbGUgZGVzY3JpcHRvcnMgYW5kCi13b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMuIFJvbGVzIGFuZCB3b3JrIHByb2R1Y3RzIGNhbiBiZSBjdXN0b21pemVkIHRvIGZpdAotd2l0aCB0aGUgY29udGVudCBvZiB0aGUgcHJvY2VzcyBpbiB3aGljaCB0aGV5IGFyZSB1c2VkLjwvcD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0icHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwjcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Ij5Qcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwjY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyI+Q3JlYXRlIGEgRGVsaXZlcnkgUHJvY2VzczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybiI+Q3JlYXRlIGEgUmV1c2FibGUgQ2FwYWJpbGl0eSBQYXR0ZXJuPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNWNjYjRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InByb2Nlc3MuaHRtbCNwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwjY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHJvY2Vzcy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InByb2Nlc3NhdXRob3JpbmdvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Qcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Ij48YSBuYW1lPSJwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Qcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldzwvaDE+Ci08ZGl2PjxwPkEgZGV2ZWxvcG1lbnQgcHJvY2VzcyBkZWZpbmVzIHNlcXVlbmNlcyBvZiB0YXNrcyBwZXJmb3JtZWQgYnkgcm9sZXMgYW5kCi13b3JrIHByb2R1Y3RzIHByb2R1Y2VkIG92ZXIgdGltZS4gPC9wPgotPHA+PGltZyBzcmM9InByb2NhdXRoLmdpZiIgYWx0PSIiIC8+PC9wPgotPHA+UHJvY2Vzc2VzIGFyZSB0eXBpY2FsbHkgZXhwcmVzc2VkIGFzIHdvcmtmbG93cyBvciBicmVha2Rvd24KLXN0cnVjdHVyZXMuIERlZmluaW5nIGEgc3RyaWN0IHNlcXVlbmNlIGFzIGluIGEgd2F0ZXJmYWxsIG1vZGVsIGlzIGFzIG11Y2gKLWEgcHJvY2VzcyBhcyBkZWZpbmluZyBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIGluIGl0ZXJhdGlvbnMgb2YgcGFyYWxsZWwgd29yay4KLVRoZXkganVzdCByZXByZXNlbnQgZGlmZmVyZW50IGRldmVsb3BtZW50IGFwcHJvYWNoZXMuIEhlbmNlLCBmb3IgZGVmaW5pbmcKLWEgcHJvY2Vzcywgb25lIGNhbiB0YWtlIG1ldGhvZCBjb250ZW50IGFuZCBjb21iaW5lIGl0IGludG8gc3RydWN0dXJlcyB0aGF0Ci1zcGVjaWZ5IGhvdyB0aGUgd29yayBzaGFsbCBiZSBvcmdhbml6ZWQgb3ZlciB0aW1lLCB0byBtZWV0IHRoZSBuZWVkcyBvZiBhCi1wYXJ0aWN1bGFyIHR5cGUgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdCAoc3VjaCBhcyBzb2Z0d2FyZSBmb3IgYSBvbmxpbmUgc3lzdGVtCi12ZXJzdXMgc29mdHdhcmUgYW5kIGhhcmR3YXJlIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0pLiBFUEYgQ29tcG9zZXIgc3VwcG9ydHMgcHJvY2Vzc2VzCi1iYXNlZCBvbiBkaWZmZXJlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2hlcyBhY3Jvc3MgbWFueSBkaWZmZXJlbnQgbGlmZWN5Y2xlCi1tb2RlbHMsIGluY2x1ZGluZyB3YXRlcmZhbGwsIGluY3JlbWVudGFsLCBhbmQgaXRlcmF0aXZlIGxpZmVjeWNsZXMuIEVQRiBDb21wb3NlciBhbHNvCi1zdXBwb3J0cyBkaWZmZXJlbnQgcHJlc2VudGF0aW9ucyBmb3IgcHJvY2Vzcywgc3VjaCBhcyB3b3JrLWJyZWFrZG93biBzdHJ1Y3R1cmUKLW9yIHdvcmtmbG93IHByZXNlbnRhdGlvbnMuIFlvdSBjYW4gYWxzbyBkZWZpbmUgcHJvY2Vzc2VzIGluIEVQRiBDb21wb3NlciB0aGF0IHVzZSBhCi1taW5pbWFsIHNldCBvZiBtZXRob2QgY29udGVudCB0byBkZWZpbmUgcHJvY2Vzc2VzIGZvciBhZ2lsZSwgc2VsZi1vcmdhbml6aW5nCi10ZWFtcy48L3A+Ci08cD5UaGUgRVBGIENvbXBvc2VyIHNjcmVlbiBjYXB0dXJlIGFib3ZlIHNob3dzIGFuIGV4YW1wbGUgb2YgYSBwcm9jZXNzIHByZXNlbnRlZCBhcwotYSBicmVha2Rvd24gc3RydWN0dXJlIG9mIG5lc3RlZCBhY3Rpdml0aWVzIGFzIHdlbGwgYXMgYSB3b3JrZmxvdyBvciBhY3Rpdml0eQotZGlhZ3JhbSBmb3Igb25lIHBhcnRpY3VsYXIgYWN0aXZpdHksIHRoZSBpbmNlcHRpb24gcGhhc2UuIEl0IGFsc28gaW5kaWNhdGVzCi13aXRoIHRoZSB0d28gYmx1ZSBhcnJvd3MgdGhhdCB0aGUgcGFydGljdWxhciBtZXRob2QgY29udGVudCB0YXNrICJEZXRhaWwgYQotVXNlIENhc2UiIGhhcyBiZWVuIGFwcGxpZWQgaW4gdGhlIHByb2Nlc3MgdHdpY2U7IGZpcnN0bHkgaW4gdGhlIGluY2VwdGlvbgotcGhhc2UgdW5kZXIgdGhlIGFjdGl2aXR5ICJEZWZpbmUgdGhlIFN5c3RlbSwiIGFuZCBzZWNvbmRseSwgaW4gdGhlIGVsYWJvcmF0aW9uCi1waGFzZSBpbiB0aGUgYWN0aXZpdHkgIlJlZmluZSB0aGUgc3lzdGVtIGRlZmluaXRpb24iLiBZb3Ugc2VlIGJlbG93IGVhY2ggb2YKLXRoZXNlIHRhc2sgYXBwbGljYXRpb25zLCByZWZlcnJlZCB0byBhcyBhIHRhc2sgZGVzY3JpcHRvcnMgaW4gRVBGIENvbXBvc2VyLCBsaXN0cyBvZgotdGhlIHBlcmZvcm1pbmcgcm9sZXMgYXMgd2VsbCBhcyB0aGUgaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiBJZiB5b3UKLWxvb2sgY2xvc2VseSwgeW91IHNlZSB0aGF0IHRoZXNlIGxpc3RzIGFyZSBkaWZmZXJlbnQgZm9yIGVhY2ggb2YgdGhlc2UgdHdvCi10YXNrIGRlc2NyaXB0b3JzLCBleHByZXNzaW5nIGRpZmZlcmVuY2VzIGluIHBlcmZvcm1pbmcgdGhlICJEZXRhaWwgYSBVc2UgQ2FzZSIKLW1ldGhvZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUuIFlvdSBzZWUgZGlmZmVyZW50IHJvbGVzIGludm9sdmVkIGFuZCBjaGFuZ2VzCi1pbiB0aGUgbGlzdCBvZiBpbnB1dHMgdG8gYmUgY29uc2lkZXJlZCBhbmQgb3V0cHV0cyB0byBiZSBwcm9kdWNlZCBvciB1cGRhdGVkLgotVGhlc2UgY2hhbmdlcyB3ZXJlIGRlZmluZWQgYnkgdGhlIGF1dGhvciB0aGF0IGNyZWF0ZWQgdGhpcyBwcm9jZXNzIHRvIGV4cHJlc3MKLXRoZSBleGFjdCBmb2N1cyBvZiB0aGUgdGFzayBwZXJmb3JtYW5jZSBmb3IgZWFjaCBvY2N1cnJlbmNlLiBJbiBhZGRpdGlvbiB0bwotdXBkYXRpbmcgdGhlIHJvbGVzLCBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMgZm9yIGEgdGFzayBkZXNjcmlwdG9yLAoteW91IGNhbiBhbHNvIHByb3ZpZGUgYWRkaXRpb25hbCB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcyB3ZWxsIGFzIGRlZmluZSB0aGUKLWV4YWN0IHN0ZXBzIG9mIHRoZSB0YXNrIHRoYXQgc2hvdWxkIGFuZCBzaG91bGQgbm90IGJlIHBlcmZvcm1lZCBmb3IgdGhpcyBwYXJ0aWN1bGFyCi1vY2N1cnJlbmNlIG9mIHRoZSB0YXNrLiA8L3A+Ci08cD5FUEYgQ29tcG9zZXIgcHJvdmlkZXMgeW91IHdpdGggYSBwcm9jZXNzIGVkaXRvciB0aGF0IHN1cHBvcnRzIGRpZmZlcmVudCBicmVha2Rvd24KLXN0cnVjdHVyZSB2aWV3cyBhcyB3ZWxsIGFzIGdyYXBoaWNhbCBwcm9jZXNzIHByZXNlbnRhdGlvbnMuIEFzIGEgcHJvY2VzcyBhdXRob3IsCi15b3UgdHlwaWNhbGx5IHN0YXJ0IGJ5IGNyZWF0aW5nIGFuIGFjdGl2aXR5IGJyZWFrZG93biwgZGl2aWRpbmcgYW5kIGJyZWFraW5nCi15b3VyIHByb2Nlc3MgZG93biBpbnRvIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGhpZ2gtbGV2ZWwgYWN0aXZpdGllcy4gSW5zdGVhZAotb2YgY3JlYXRpbmcgeW91ciBhY3Rpdml0aWVzIGluIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvciwgeW91IGNhbiBhbHRlcm5hdGl2ZWx5Ci13b3JrIGluIGEgZ3JhcGhpY2FsIGFjdGl2aXR5IGRpYWdyYW0gZWRpdG9yIHRoYXQgYWxsb3dzIHlvdSB0byBncmFwaGljYWxseQotY3JlYXRlIGEgd29ya2Zsb3cgZm9yIHlvdXIgYWN0aXZpdGllcy4gVG8gYXNzaWduIG1ldGhvZCBjb250ZW50IHRvIHlvdXIgcHJvY2VzcywKLXlvdSB0aGVuIGhhdmUgdGhlIGNob2ljZSBvZiB3b3JraW5nIGluIGRpZmZlcmVudCBwcm9jZXNzIHZpZXdzICh3b3JrIGJyZWFrZG93bgotc3RydWN0dXJlLCB3b3JrIHByb2R1Y3QgdXNhZ2UsIG9yIHRlYW0gYWxsb2NhdGlvbiB2aWV3KS4gRWFjaCB2aWV3IHN1cHBvcnRzCi1hIGRpZmZlcmVudCBhcHByb2FjaCBmb3IgY3JlYXRpbmcgYSBwcm9jZXNzLiBZb3UgY2FuIGRlZmluZSB0aGUgd29yayB0byBiZQotZG9uZSwgZGVmaW5lIHRoZSByZXN1bHRzIHRvIGJlIHByb2R1Y2VkLCBvciBkZWZpbmUgcmVzcG9uc2liaWxpdGllcyBmb3IgeW91cgotcm9sZXMuIElmIHJlcXVlc3RlZCwgdGhlIGVkaXRvciB1cGRhdGVzIHRoZSBvdGhlciBwcm9jZXNzIHZpZXdzIHNlbWktYXV0b21hdGljYWxseQotdXNpbmcgd2l6YXJkcyB0aGF0IHByb21wdCB5b3UgZm9yIGRlY2lzaW9ucyBvbiBzZWxlY3RpbmcgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMuIDwvcD4KLTwvZGl2PgotPGRpdj4KLTx1bCBjbGFzcz0idWxsaW5rcyI+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9InByb2Nlc3MuaHRtbCI+UHJvY2VzczwvYT48L3N0cm9uZz48YnIgLz4KLTwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJwcm9jZXNzLmh0bWwjcHJvY2VzcyI+UHJvY2VzczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuIj5DcmVhdGUgYSBSZXVzYWJsZSBDYXBhYmlsaXR5IFBhdHRlcm48L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbCNjcmVhdGVhZGVsaXZlcnlwcm9jZXNzIj5DcmVhdGUgYSBEZWxpdmVyeSBQcm9jZXNzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzc2VsZW1lbnRwcm9wZXJ0aWVzdmlldy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxMTQyZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUHJvY2VzcyBFbGVtZW50IFByb3BlcnRpZXMgVmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJwcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlByb2Nlc3MgRWxlbWVudCBQcm9wZXJ0aWVzIFZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InByb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXciPjxhIG5hbWU9InByb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Qcm9jZXNzIEVsZW1lbnQgUHJvcGVydGllcyBWaWV3PC9oMT4KLTxkaXY+PHA+V2hlbiB5b3UgYXJlIGVkaXRpbmcgYSBwcm9jZXNzLCB0aGUgcHJvY2VzcyBlbGVtZW50IHByb3BlcnRpZXMgdmlldyBhbGxvd3MKLXlvdSB0byBlZGl0IGFsbCB0aGUgZGV0YWlscyBmb3IgYSBzaW5nbGUgZWxlbWVudCBpbiB0aGUgcHJvY2Vzcy4gSWYgeW91IGNsaWNrCi1pbiBhbnkgcm93IGluIGEgcHJvY2VzcyBkaXNwbGF5LCB5b3Ugd2lsbCBzZWUgdGhlIGZ1bGwgZGV0YWlscyBvZiB0aGUgcHJvY2VzcwotZWxlbWVudCBpbiB0aGUgcm93IGluIHRoZSBwcm9wZXJ0aWVzIHZpZXcuPC9wPgotPHA+SWYgdGhlIHByb3BlcnRpZXMgdmlldyBpcyBub3Qgb3BlbiwgcmlnaHQgY2xpY2sgYW55IHJvdyBpbiBhIHByb2Nlc3MgYW5kCi1zZWxlY3QgPHN0cm9uZz5TaG93IFByb3BlcnRpZXMgVmlldzwvc3Ryb25nPi48L3A+Ci08cD5UaGUgcHJvcGVydGllcyB2aWV3IGlzIHRoZSBlZGl0b3IgZm9yIGFjdGl2aXRpZXMsIHRhc2sgZGVzY3JpcHRvcnMsIHJvbGVzCi1kZXNjcmlwdG9ycywgYW5kIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycy4gVGhlIGluZm9ybWF0aW9uIGZvcgotYSBkZXNjcmlwdG9yIGlzIHNpbWlsYXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIGVsZW1lbnQgZWRpdG9yLCBidXQgaXQKLWFsc28gaGFzIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIGVsZW1lbnQgaW4gdGhlIHByb2Nlc3MuIFRoZSBwcm9jZXNzIGluZm9ybWF0aW9uCi1pcyBhbHNvIGRpc3BsYXllZCBpbiB0aGUgY29ycmVzcG9uZGluZyByb3cgaW4gdGhlIHByb2Nlc3MgZGlzcGxheS48L3A+Ci08cD48c3Ryb25nPkdlbmVyYWwgSW5mb3JtYXRpb24gdGFiOjwvc3Ryb25nPjwvcD4KLTxwPlRoZSBOYW1lIGFuZCBQcmVzZW50YXRpb24gTmFtZSBkZWZhdWx0IHRvIHRoZSBjb3JyZXNwb25kaW5nIG5hbWVzIGluIHRoZQotYmFzZSBtZXRob2QgZWxlbWVudC4gVGhlc2UgbmFtZXMgY2FuIGJlIGNoYW5nZWQgaW4gYSBkZXNjcmlwdG9yLjwvcD4KLTxkaXYgY2xhc3M9InAiPlRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgdXNlZCB0byBzcGVjaWZ5IGNlcnRhaW4gYXNwZWN0cyBvZiB0aGUgZWxlbWVudAotaW4gdGhlIHByb2Nlc3MgYW5kIGNhbiBiZSBzZXQgZm9yIGFsbCB0eXBlcyBvZiBwcm9jZXNzIGVsZW1lbnRzOjx1bD48bGk+PHN0cm9uZz5PcHRpb25hbDwvc3Ryb25nPjogSWYgdGhpcyBpcyBjaGVja2VkICh0cnVlKSwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIGVsZW1lbnQKLWlzIGNvbnNpZGVyZWQgb3B0aW9uYWwgaW4gdGhlIHByb2Nlc3MuIFRoaXMgbWVhbnMgdGhhdCBpdCBpcyBzYWZlIHRvIHJlbW92ZQotdGhlIGVsZW1lbnQuIElmIHRoaXMgaXMgbm90IGNoZWNrZWQgKGZhbHNlKSwgdGhlIGVsZW1lbnQgaXMgY29uc2lkZXJlZCBtYW5kYXRvcnkKLWFuZCBzaG91bGQgbm90IGJlIHJlbW92ZWQgZnJvbSB0aGUgcHJvY2Vzcy48L2xpPgotPGxpPjxzdHJvbmc+TXVsdGlwbGUgT2NjdXJyZW5jZXM8L3N0cm9uZz46IElmIHRoaXMgaXMgY2hlY2tlZCAodHJ1ZSksIGl0IGluZGljYXRlcyB0aGF0Ci13aGVuIHRoZSBwcm9jZXNzIGlzIGluc3RhbnRpYXRlZCBhcyBhIHByb2plY3Qgb3Igb3RoZXIgcHJvY2VzcywgaXQgaXMgZXhwZWN0ZWQKLXRoYXQgdGhlcmUgd2lsbCBiZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiB0aGlzIGVsZW1lbnQuIElmIHRoaXMgaXMgbm90IGNoZWNrZWQKLShmYWxzZSksIGl0IGluZGljYXRlcyB0aGF0IHRoZXJlIHNob3VsZCBvbmx5IGJlIGEgc2luZ2xlIG9jY3VycmVuY2Ugb2YgdGhpcwotZWxlbWVudCB3aGVuIHRoZSBwcm9jZXNzIGlzIGluc3RhbnRpYXRlZC48L2xpPgotPGxpPjxzdHJvbmc+UGxhbm5lZDwvc3Ryb25nPjogSWYgdGhpcyBpcyBjaGVja2VkICh0cnVlKSwgdGhlIGVsZW1lbnQgd2lsbCBiZSBpbmNsdWRlZAotaW4gYW4gZXhwb3J0IHRvIGEgcHJvamVjdCBtYW5hZ2VtZW50IHRvb2wuIElmIHRoaXMgaXMgbm90IGNoZWNrZWQgKGZhbHNlKSwKLWl0IHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIGFuIGV4cG9ydC48L2xpPgotPGxpPjxzdHJvbmc+U3VwcHJlc3NlZDwvc3Ryb25nPjogSWYgdGhpcyBpcyBjaGVja2VkICh0cnVlKSwgdGhlIGVsZW1lbnQgd2lsbCBub3QgYXBwZWFyCi1pbiBhIHB1Ymxpc2hlZCBwcm9jZXNzLiBUaGlzIGlzIHVzdWFsbHkgdXNlZCB0byBtb2RpZnkgYSBjYXBhYmlsaXR5IHBhdHRlcm4KLWluY2x1ZGVkIGluIGEgcHJvY2Vzcy4gVGhpcyBpcyBub3QgY2hlY2tlZCAoZmFsc2UpIGFzIGRlZmF1bHQuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InAiPlRoZSBmb2xsb3dpbmcgZWxlbWVudHMgY2FuIGJlIHNldCBmb3IgdGFzayBkZXNjcmlwdG9ycyBhbmQgYWN0aXZpdGllczo8dWw+PGxpPjxzdHJvbmc+RXZlbnQgRHJpdmVuPC9zdHJvbmc+OiBJZiB0aGlzIGlzIGNoZWNrZWQgKHRydWUpLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUKLXRhc2sgb3IgYWN0aXZpdHkgd2lsbCBiZSBpbml0aWF0ZWQgd2hlbiBhIHBhcnRpY3VsYXIgZXZlbnQgb2NjdXJzLiBJZiB0aGlzCi1pcyBub3QgY2hlY2tlZCAoZmFsc2UpLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFzayBvciBhY3Rpdml0eSB3aWxsIGJlIGluaXRpYXRlZAotYmFzZWQgb24gb3RoZXIgdGFza3MgaW4gdGhlIHByb2Nlc3MuPC9saT4KLTxsaT48c3Ryb25nPk9uZ29pbmc8L3N0cm9uZz46IElmIHRoaXMgaXMgY2hlY2tlZCAodHJ1ZSksIGl0IGluZGljYXRlcyB0aGF0IHRoZSB0YXNrCi1vciBhY3Rpdml0eSBpcyBjb250aW51b3VzLiBJZiB0aGlzIGlzIG5vdCBjaGVja2VkIChmYWxzZSksIGl0IGluZGljYXRlcyB0aGF0Ci10aGUgdGFzayBvciBhY3Rpdml0eSBoYXMgYSBjbGVhciBzdGFydCBhbmQgZmluaXNoIGluIHRoZSBwcm9jZXNzLjwvbGk+Ci08bGk+PHN0cm9uZz5SZXBlYXRhYmxlPC9zdHJvbmc+OiBJZiB0aGlzIGlzIGNoZWNrZWQgKHRydWUpLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFzawotb3IgYWN0aXZpdHkgY2FuIGl0ZXJhdGUgd2hlbiB0aGUgcHJvY2VzcyBpcyBpbnN0YW50aWF0ZWQuIElmIHRoaXMgaXMgbm90IGNoZWNrZWQKLShmYWxzZSksIGl0IGluZGljYXRlcyB0aGF0IHRoZSB0YXNrIG9yIGFjdGl2aXR5IHdpbGwgb25seSBvY2N1ciBvbmNlIGluIHRoZQotcHJvY2Vzcy48L2xpPgotPC91bD4KLTwvZGl2PgotPHA+RGVwZW5kZW5jeSBGaWVsZDogWW91IGNhbiBhZGQgb25lIG9yIG1vcmUgZGVwZW5kZW5jaWVzIGZvciBhIHRhc2sgb3IgYWN0aXZpdHkuCi1DbGljayB0aGUgPHN0cm9uZz5BZGQuLi48L3N0cm9uZz4gYnV0dG9uIGFuZCBlbnRlciB0aGUgaW5kZXggbnVtYmVyIGZvciB0aGUgdGFzayBvcgotYWN0aXZpdHkgb24gd2hpY2ggdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBkZXBlbmRlbnQuIFRoZSBkZXBlbmRlbmN5ICh0eXBlKQotZGVmYXVsdHMgdG8gRmluaXNoLXRvLVN0YXJ0LiBJZiB5b3Ugd2FudCB0byBzZXQgYW5vdGhlciBkZXBlbmRlbmN5IHR5cGUsIGNsaWNrCi10aGUgPHN0cm9uZz5FZGl0PC9zdHJvbmc+IGJ1dHRvbiBhbmQgc2VsZWN0IHRoZSByZXF1aXJlZCBkZXBlbmRlbmN5IHR5cGUgaW4gdGhlIGRlcGVuZGVuY3kKLWRyb3AgZG93biBib3guIFlvdSBjYW4gZW50ZXIgYSBkaWZmZXJlbnQgaW5kZXggbnVtYmVyIG9uIHRoZSBFZGl0IGRpYWxvZy4KLVlvdSBjYW4gYWxzbyByZW1vdmUgYSBkZXBlbmRlbmN5IGJ5IHNlbGVjdGluZyB0aGUgZGVwZW5kZW5jeSBhbmQgY2xpY2tpbmcKLXRoZSA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPiBidXR0b24uPC9wPgotPHA+VGhlIGJhc2UgbWV0aG9kIGVsZW1lbnQgZm9yIHRoZSBkZXNjcmlwdG9yIGlzIGRpc3BsYXllZCBvbiB0aGUgcGFnZS4gWW91Ci1jYW4gc2VsZWN0IGEgZGlmZmVyZW50IGVsZW1lbnQgYnkgY2xpY2tpbmcgdGhlIDxzdHJvbmc+TGluayBNZXRob2QgRWxlbWVudDwvc3Ryb25nPiBidXR0b24KLWFuZCBzZWxlY3RpbmcgdGhlIHJlcXVpcmVkIGVsZW1lbnQuPC9wPgotPHA+PHN0cm9uZz5Eb2N1bWVudGF0aW9uIHRhYjo8L3N0cm9uZz48L3A+Ci08cD5UaGUgZG9jdW1lbnRhdGlvbiB0YWIgY29udGFpbnMgZGVzY3JpcHRpdmUgYXR0cmlidXRlcyBmb3IgdGhlIGRlc2NyaXB0b3IKLW9yIGFjdGl2aXR5LjwvcD4KLTxwPjxzdHJvbmc+Um9sbC1VcCB0YWJzOjwvc3Ryb25nPjwvcD4KLTxwPlRoZSBwcm9wZXJ0aWVzIHZpZXcgZm9yIGFuIGFjdGl2aXR5IGluY2x1ZGVzIHJvbGwtdXAgdGFicyB0aGF0IHByb3ZpZGUKLWxpc3RzIG9mIHRhc2tzLCByb2xlcywgb3Igd29yayBwcm9kdWN0cyAicm9sbGVkIHVwIiwgb3Igc3VtbWFyaXplZCwgZm9yIHRoZQotYWN0aXZpdHkuPC9wPgotPHA+PHN0cm9uZz5Bc3NvY2lhdGlvbiB0YWJzOjwvc3Ryb25nPjwvcD4KLTxwPlRoZSByZW1haW5pbmcgdGFicyBhcmUgdXNlZCB0byBhZGQgb3IgcmVtb3ZlIGFzc29jaWF0aW9ucyBiZXR3ZWVuIHRoZSBhY3Rpdml0eQotb3IgZGVzY3JpcHRvciB0byBtZXRob2QgZWxlbWVudHMuPC9wPgotPC9kaXY+Ci08ZGl2PjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wdWIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wdWIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNzI1NDc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHViLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3B1Ymxpc2hpbmdhbWV0aG9kY29uZmlndXJhdGlvbnRvYW1ldGhvZHdlYi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZjI5YTVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJQdWJsaXNoaW5nIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24gdG8gYSBNZXRob2QgV2ViIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJwdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbCNwdWJsaXNoaW5nb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImV4cG9ydGFwcm9jZXNzb3JtZXRob2Rjb250ZW50dG9hcGxhbm5pbmd0b29sLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwjbWV0aG9kY29uZmlndXJhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlB1Ymxpc2hpbmcgYSBNZXRob2QgQ29uZmlndXJhdGlvbiB0byBhIE1ldGhvZCBXZWI8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InB1Ymxpc2hpbmdhbWV0aG9kY29uZmlndXJhdGlvbnRvYW1ldGhvZHdlYiI+PGEgbmFtZT0icHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UHVibGlzaGluZyBhIE1ldGhvZCBDb25maWd1cmF0aW9uIHRvIGEgTWV0aG9kIFdlYjwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPlVzaW5nIHRoZSBQdWJsaXNoIE1ldGhvZCBDb25maWd1cmF0aW9uIHdpemFyZCwgeW91IGNhbiBzZWxlY3QgZnJvbQotYSBzZXJpZXMgb2YgcHVibGljYXRpb24gb3B0aW9ucyB0byB0dXJuIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW50byBhIHB1Ymxpc2hlZAotbWV0aG9kIFdlYi48L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIHB1Ymxpc2ggYSBtZXRob2QgY29uZmlndXJhdGlvbjo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZyb20gdGhlIHRvb2xiYXIsIHNlbGVjdCA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gJmd0OyBQdWJsaXNoPC9zdHJvbmc+LiBUaGUgUHVibGlzaAotTWV0aG9kIENvbmZpZ3VyYXRpb24gd2l6YXJkIGFwcGVhcnMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9uIHRoZSBTZWxlY3QgQ29uZmlndXJhdGlvbiBwYWdlLCBzZWxlY3QgdGhlIGNvbmZpZ3VyYXRpb24geW91Ci13YW50IHRvIHB1Ymxpc2ggZnJvbSB0aGUgbGlzdCBvZiBtZXRob2QgY29uZmlndXJhdGlvbnMgaW4gdGhlIGxpYnJhcnkgYW5kCi10aGVuIGNsaWNrIDxzdHJvbmc+TmV4dDwvc3Ryb25nPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T24gdGhlIFNwZWNpZnkgUHVibGlzaGluZyBPcHRpb25zIHBhZ2U6PC9zcGFuPjx1bD48bGk+UHJvdmlkZSBhIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBmb3IgdGhlIHB1Ymxpc2hlZCBXZWIgc2l0ZSBpbiB0aGUKLVB1YmxpY2F0aW9uIHBhdGggZmllbGQuPC9saT4KLTxsaT5Qcm92aWRlIGEgdGl0bGUgZm9yIHRoZSBwdWJsaXNoZWQgbWV0aG9kIHdlYi48L2xpPgotPGxpPlNlbGVjdCBhIGJhbm5lciBpbWFnZSB0byB1c2UuPC9saT4KLTxsaT5TZWxlY3QgYSBmaWxlIHRvIHVzZSBmb3IgdGhlICJhYm91dCIgaW5mb3JtYXRpb24uPC9saT4KLTxsaT5Qcm92aWRlIGEgZmVlZGJhY2sgVVJMPC9saT4KLTxsaT5DaG9vc2UgdG8gaW5jbHVkZSBhIGdsb3NzYXJ5LCBpbmRleCwgc2VhcmNoIGNhcGFiaWxpdHkgYW5kL29yIHByb2Nlc3MKLXRyZWUgY3VzdG9taXphdGlvbi48L2xpPgotPGxpPkNob29zZSB0byBjaGVjayB0aGF0IGV4dGVybmFsIGh5cGVybGlua3MgYXJlIHZhbGlkLjwvbGk+Ci08bGk+Q2hvb3NlIHRvIHB1Ymxpc2ggYWN0aXZpdHkgZGlhZ3JhbXMgdGhhdCBoYXZlIG5vdCBiZWVuIGVkaXRlZCwgc3VjaAotYXMgYWN0aXZpdHkgZGlhZ3JhbXMgdGhhdCBoYXZlIGJlZW4gZ2VuZXJhdGVkIGJ5IHRoZSB0b29sLCBidXQgbm90IG1hbnVhbGx5Ci1lZGl0ZWQuPC9saT4KLTwvdWw+Ci0gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IENob29zaW5nIHRvIGluY2x1ZGUgZWl0aGVyIHRoZSBzZWFyY2ggY2FwYWJpbGl0eSBvciB0byBzdXBwb3J0Ci1jdXN0b21pemF0aW9uIG9mIHRoZSBwcm9jZXNzIHZpZXcgd2lsbCBpbmNsdWRlIHRoZSBicm93c2VyIGFwcGxldCBpbiB0aGUgcHVibGlzaGVkCi1XZWIgc2l0ZS4gSWYgeW91IGNob29zZSBub3QgdG8gcHVibGlzaCB3aXRoIHRoZSBsYXN0IHR3byBvcHRpb25zLCB0aGUgYnJvd3NlcgotYXBwbGV0IHdpbGwgbm90IGJlIGluY2x1ZGVkLjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5GaW5pc2g8L3N0cm9uZz4uIFB1Ymxpc2hpbmcgaXMgaW5pdGlhdGVkLjwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InB1Ymxpc2hpbmdvdmVydmlldy5odG1sI3B1Ymxpc2hpbmdvdmVydmlldyI+UHVibGlzaGluZyBPdmVydmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCNtZXRob2Rjb25maWd1cmF0aW9ucyI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzOTgwZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlB1Ymxpc2hpbmcgT3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2R2aWV3d2l0aGN1c3RvbWNhdGVnb3JpZXMuaHRtbCNjcmVhdGVhbWV0aG9kdmlld3dpdGhjdXN0b21jYXRlZ29yaWVzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJwdWJsaXNoaW5nYW1ldGhvZGNvbmZpZ3VyYXRpb250b2FtZXRob2R3ZWIuaHRtbCNwdWJsaXNoaW5nYW1ldGhvZGNvbmZpZ3VyYXRpb250b2FtZXRob2R3ZWIiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImV4cG9ydGFwcm9jZXNzb3JtZXRob2Rjb250ZW50dG9hcGxhbm5pbmd0b29sLmh0bWwjZXhwb3J0YXByb2Nlc3Nvcm1ldGhvZGNvbnRlbnR0b2FwbGFubmluZ3Rvb2wiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icHVibGlzaGluZ292ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlB1Ymxpc2hpbmcgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InB1Ymxpc2hpbmdvdmVydmlldyI+PGEgbmFtZT0icHVibGlzaGluZ292ZXJ2aWV3Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UHVibGlzaGluZyBPdmVydmlldzwvaDE+Ci08ZGl2PjxwPlRoZSB1bHRpbWF0ZSBvdXRwdXQgb2YgRVBGIENvbXBvc2VyIGlzIGEgcHVibGlzaGVkIFdlYiBzaXRlIHdpdGggbWV0aG9kCi1ndWlkYW5jZSBhbmQgcHJvY2Vzc2VzIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBwcm9qZWN0IHRlYW0uIFRoZSBpbmZvcm1hdGlvbgotY29udGFpbmVkIGluIHRoZSBXZWIgc2l0ZSBwcm92aWRlcyBhIHByb2plY3QgdGVhbSB3aXRoIGEgY29uc2lzdGVudCBtZXRob2QKLWZvciB0aGUgZW50aXJlIHRlYW0gdG8gZm9sbG93IGFuZCBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZSBlbmQtdG8tZW5kCi13b3JrIGxpZmVjeWNsZS4gPC9wPgotPHA+SXQgaXMgZWFzeSB0byBjb25maWd1cmUgYSBwcm9jZXNzIGZvciBhIHBhcnRpY3VsYXIgdHlwZSBvciBzaXplIG9mIHByb2plY3QKLWFuZCB0byBwdWJsaXNoIHRoZSBndWlkYW5jZSB0byBhIFdlYiBzaXRlLiBBIE1ldGhvZCBDb25maWd1cmF0aW9uIGlzIGEgc2VsZWN0aW9uCi1vZiBDb250ZW50IFBhY2thZ2VzIGFjcm9zcyBkaWZmZXJlbnQgTWV0aG9kIFBsdWctaW5zIGNvbnRhaW5pbmcgdGhlIG1ldGhvZAotYW5kIHByb2Nlc3MgY29udGVudCB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHB1Ymxpc2hlZCBXZWIgc2l0ZS4gQXQgcHVibGlzaGluZwotdGltZSwgdGhlIGNvbmZpZ3VyYXRpb24gaXMgY29tYmluZWQgd2l0aCBkaWZmZXJlbnQgTWV0aG9kIFZpZXdzIHdoaWNoIGRlZmluZQotdGhlIFdlYiBzaXRlJ3MgbmF2aWdhdGlvbiBzdHJ1Y3R1cmVzIGFuZCBjb250ZW50IG9yZ2FuaXphdGlvbi48L3A+Ci08cD5UaGUgQnJvd3NpbmcgUGVyc3BlY3RpdmUgcmVuZGVycyB0aGUgTWV0aG9kIENvbmZpZ3VyYXRpb24gY29udGVudCBpbiBIVE1MCi1mb3JtYXQgd2l0aGluIHRoZSB0b29sLCBwcm92aWRpbmcgYSBuYXZpZ2FibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1ldGhvZAotb3IgcHJvY2VzcyBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgY29uZmlndXJhdGlvbi48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhbWV0aG9kdmlld3dpdGhjdXN0b21jYXRlZ29yaWVzLmh0bWwjY3JlYXRlYW1ldGhvZHZpZXd3aXRoY3VzdG9tY2F0ZWdvcmllcyI+Q3JlYXRlIGEgTWV0aG9kIFZpZXcgd2l0aCBDdXN0b20gQ2F0ZWdvcmllczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0icHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViLmh0bWwjcHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViIj5QdWJsaXNoaW5nIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24gdG8gYSBNZXRob2QgV2ViPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmVwbGFjZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yZXBsYWNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNjZWUyZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yZXBsYWNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJSZXBsYWNlcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZXh0ZW5kcy5odG1sI2V4dGVuZHMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNvbnRyaWJ1dGVzLmh0bWwjY29udHJpYnV0ZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icmVwbGFjZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+UmVwbGFjZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJlcGxhY2VzIj48YSBuYW1lPSJyZXBsYWNlcyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlJlcGxhY2VzPC9oMT4KLTxkaXY+PHA+QSByZXBsYWNpbmcgZWxlbWVudCByZXBsYWNlcyBwYXJ0cyBvZiB0aGUgYmFzZSBlbGVtZW50LiBSZXBsYWNlcyBwcm92aWRlcwotYSB3YXkgZm9yIGFuIGVsZW1lbnQgdG8gcmVwbGFjZSBhIGJhc2UgZWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGNoYW5naW5nIGFueQotb2YgdGhlIGJhc2UgZWxlbWVudCdzIGV4aXN0aW5nIHByb3BlcnRpZXMuIFRoaXMgaXMsIGluIG1vc3QgY2FzZXMsIHVzZWQgZm9yCi1tZXRob2QgcGx1Zy1pbnMgdGhhdCBhaW0gdG8gcmVwbGFjZSBzcGVjaWZpYyBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgcm9sZXMsCi10YXNrcywgb3IgYWN0aXZpdGllcyB3aXRoIGVpdGhlciBhIGNvbXBsZXRlbHkgbmV3IHZhcmlhbnQgb3IgdG8gY2hhbmdlIHRoZQotZnVuZGFtZW50YWwgcmVsYXRpb25zaGlwcyBvZiB0aGVzZSBlbGVtZW50cy4gVGhlIGVmZmVjdCBvZiB0aGlzLCBpcyB0aGF0IHRoZQotYmFzZSBjb250ZW50IGVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkIHdpdGggdGhlIG5ldyByZXBsYWNpbmcgZWxlbWVudAotdG8gd2hpY2ggYWxsIGluY29taW5nIGFzc29jaWF0aW9ucyBzdGlsbCBwb2ludCBhcyBiZWZvcmUsIGJ1dCB3aGljaCBoYXMgcG90ZW50aWFsbHkKLW5ldyBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBvdXRnb2luZyBhc3NvY2lhdGlvbiBwcm9wZXJ0aWVzLjwvcD4KLTxwPlVzZSB0aGUgQ29udGVudCBWYXJpYWJpbGl0eSBzZWN0aW9uIG9uIHRoZSBEZXNjcmlwdGlvbiB0YWIgdG8gbWFrZSBhbiBlbGVtZW50Ci1yZXBsYWNlIGFub3RoZXIgZWxlbWVudC4gU2VsZWN0IDxzdHJvbmc+UmVwbGFjZXM8L3N0cm9uZz4gYXMgdGhlIHZhcmlhYmlsaXR5IHR5cGUgYW5kCi1zZWxlY3QgdGhlIGJhc2UgZWxlbWVudCB0aGF0IHRoaXMgZWxlbWVudCB3aWxsIHJlcGxhY2UuIFRoZSBiYXNlIGVsZW1lbnQgbXVzdAotYmUgdGhlIHNhbWUgdHlwZSBvZiBlbGVtZW50IGFzIHRoZSByZXBsYWNpbmcgZWxlbWVudC48L3A+Ci08cD5XaGVuIHlvdSByZXBsYWNlIGFuIGVsZW1lbnQsIGFsbCB0aGUgZGVzY3JpcHRpb24gYXR0cmlidXRlcyBhcmUgcmVwbGFjZWQKLWJ5IHRoZSByZXBsYWNpbmcgZWxlbWVudC4gSWYgYSBkZXNjcmlwdGlvbiBhdHRyaWJ1dGUgaW4gdGhlIHJlcGxhY2luZyBlbGVtZW50Ci1pcyBibGFuaywgYnV0IHRoZSBiYXNlIGVsZW1lbnQgaGFzIGNvbnRlbnQsIHRoZSBhdHRyaWJ1dGUgd2lsbCBiZSBibGFuayBpbgotdGhlIHJlc3VsdGluZyBlbGVtZW50LjwvcD4KLTxwPlJlcGxhY2UgYWx3YXlzIHJlcGxhY2VzIGF0dHJpYnV0ZXMgYW5kIGFzc29jaWF0aW9ucyBvZiB0aGUgYmFzZSBlbGVtZW50Ci13aXRoIHRoZSByZXBsYWNpbmcgZWxlbWVudCdzIGF0dHJpYnV0ZXMgYW5kIGFzc29jaWF0aW9ucywgZXhjZXB0IGZvciBpbmNvbWluZwotYXNzb2NpYXRpb25zLCB3aGljaCBhcmUgb25seSBhZGRlZCB0byB0aGUgYmFzZSwgYnV0IGRvIG5vdCByZXBsYWNlIHRoZSBiYXNlJ3MKLWluY29taW5nIGFzc29jaWF0aW9ucy48L3A+Ci08ZGl2IGNsYXNzPSJwIj48c3Ryb25nPlJlcGxhY2VzIHJ1bGVzOjwvc3Ryb25nPjx1bD48bGk+QXR0cmlidXRlcyBvZiB0aGUgYmFzZSBlbGVtZW50IGFyZSByZXBsYWNlZCB3aXRoIGF0dHJpYnV0ZXMgb2YgdGhlIHJlcGxhY2luZwotZWxlbWVudCBpbmNsdWRpbmcgaWRlbnRpZmllciBvZiB0aGUgYmFzZSBlbGVtZW50LjwvbGk+Ci08bGk+T3V0Z29pbmcgdG8tb25lIGFuZCB0by1tYW55IGFzc29jaWF0aW9ucyBvZiB0aGUgcmVwbGFjaW5nIGVsZW1lbnQgcmVwbGFjZQotYW55IG91dGdvaW5nIGFzc29jaWF0aW9ucyBvZiB0aGUgYmFzZSBlbGVtZW50LiBJZiB0aGUgY29udHJpYnV0b3IgZG9lcyBub3QKLWhhdmUgYW55IG91dGdvaW5nIGFzc29jaWF0aW9ucywgdGhlbiBuZWl0aGVyIHdpbGwgdGhlIHJlc3VsdGluZyBlbGVtZW50LjwvbGk+Ci08bGk+SW5jb21pbmcgYXNzb2NpYXRpb25zIHdpdGggYSB0by1tYW55IGNvbnN0cmFpbnQgb24gdGhlIG90aGVyIGFzc29jaWF0aW9uCi1lbmQgdG8gdGhlIHJlcGxhY2VkIGVsZW1lbnQgYXJlIHByZXNlcnZlZCBhbmQgYXVnbWVudGVkIHdpdGggaW5jb21pbmcgYXNzb2NpYXRpb25zCi1vZiB0aGUgcmVwbGFjaW5nIGVsZW1lbnQuPC9saT4KLTxsaT5JbmNvbWluZyBhc3NvY2lhdGlvbnMgd2l0aCBhIHRvLW9uZSBjb25zdHJhaW50IG9uIHRoZSBvdGhlciBhc3NvY2lhdGlvbgotZW5kIHRvIHRoZSByZXBsYWNlZCBlbGVtZW50IGFyZSByZXBsYWNlZCB3aXRoIHRoZSByZXNwZWN0aXZlIGluY29taW5nIGFzc29jaWF0aW9uCi1vZiB0aGUgcmVwbGFjaW5nIGVsZW1lbnQuIElmIHRoZSByZXBsYWNpbmcgZWxlbWVudCBkb2VzIG5vdCBoYXZlIHN1Y2ggYW4gYXNzb2NpYXRpb24KLXRoZW4gdGhlIHJlc3VsdGluZyBlbGVtZW50IGtlZXBzIHRoZSBpbmNvbWluZyBhc3NvY2lhdGlvbiBvZiB0aGUgYmFzZSBlbGVtZW50LjwvbGk+Ci08bGk+QSBiYXNlIGVsZW1lbnQgb2YgYSByZXBsYWNlbWVudCBjYW4gaGF2ZSBvbmx5IG9uZSByZXBsYWNpbmcgZWxlbWVudCBwZXIKLWNvbmZpZ3VyYXRpb24uIElmIG1vcmUgdGhhbiBvbmUgcmVwbGFjaW5nIGVsZW1lbnQgaXMgcHJlc2VudCwgbm8gcmVwbGFjZW1lbnQKLXRha2VzIHBsYWNlLjwvbGk+Ci08bGk+UmVwbGFjZW1lbnQgd29ya3MgdHJhbnNpdGl2ZWx5LCBpLmUuIGlmIGEgcmVwbGFjaW5nIGVsZW1lbnQgaXMgcmVwbGFjZWQKLWl0c2VsZiwgdGhlIGZpbmFsIHJlcGxhY2VyIHByZXZhaWxzLjwvbGk+Ci08bGk+Q29udHJpYnV0aW9uIHByZWNlZGVzIFJlcGxhY2VtZW50LCBpLmUuIGNvbnRyaWJ1dGlvbiBpcyBldmFsdWF0ZWQgZmlyc3QKLWFuZCB0aGVuIHJlcGxhY2VtZW50IHBlcmZvcm1lZCBhZnRlcndhcmQuIFRoZSBldmFsdWF0aW9uIG9mIGNvbnRyaWJ1dGlvbiBhbmQKLXJlcGxhY2VtZW50IGlzIHBlcmZvcm1lZCB0b3AtZG93biBpbiB0aGUgc3BlY2lhbGl6YXRpb24gaGllcmFyY2h5LjwvbGk+Ci08L3VsPgotU2VlIDxhIGhyZWY9InZhcmlhYmlsaXR5YXNzb2NpYXRpb25zLmh0bWwjdmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMiPlZhcmlhYmlsaXR5IEFzc29jaWF0aW9uczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGFzc29jaWF0aW9ucyBmb3IgZWFjaCBlbGVtZW50Ci10eXBlLjwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgdGl0bGU9IlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZSBvciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcgdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLiI+VmFyaWFiaWxpdHk8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImV4dGVuZHMuaHRtbCNleHRlbmRzIj5FeHRlbmRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjb250cmlidXRlcy5odG1sI2NvbnRyaWJ1dGVzIj5Db250cmlidXRlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JlcG9ydC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yZXBvcnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDI1M2EyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JlcG9ydC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUmVwb3J0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InJlcG9ydCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5SZXBvcnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJlcG9ydCI+PGEgbmFtZT0icmVwb3J0Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UmVwb3J0PC9oMT4KLTxkaXY+PHA+QSBSZXBvcnQgaXMgYSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZQotYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLgotRm9yIGV4YW1wbGUsIGEgcmVwb3J0IG1heSBjb21iaW5lIGEgZ3JhcGhpY2FsIG1vZGVsIGZyb20gYSBkZXNpZ24gdG9vbCB3aXRoCi10ZXh0dWFsIGluZm9ybWF0aW9uIGRvY3VtZW50cyBpbnRvIGEgcmVwb3J0LjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmV1c2FibGVhc3NldC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yZXVzYWJsZWFzc2V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlMDExNGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yZXVzYWJsZWFzc2V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJSZXVzYWJsZSBBc3NldCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJyZXVzYWJsZWFzc2V0IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlJldXNhYmxlIEFzc2V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyZXVzYWJsZWFzc2V0Ij48YSBuYW1lPSJyZXVzYWJsZWFzc2V0Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UmV1c2FibGUgQXNzZXQ8L2gxPgotPGRpdj48cD5BIHJldXNhYmxlIGFzc2V0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuCi1UaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nIGhvdyB0aGUKLWFzc2V0IHNob3VsZCBiZSB1c2VkLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmljaHRleHRlZGl0b3IuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmljaHRleHRlZGl0b3IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjVjMWE0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JpY2h0ZXh0ZWRpdG9yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJSaWNoIFRleHQgRWRpdG9yIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InJpY2h0ZXh0ZWRpdG9yIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlJpY2ggVGV4dCBFZGl0b3I8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJpY2h0ZXh0ZWRpdG9yIj48YSBuYW1lPSJyaWNodGV4dGVkaXRvciI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlJpY2ggVGV4dCBFZGl0b3I8L2gxPgotPGRpdj48cD5UaGUgUmljaCBUZXh0IEVkaXRvciBwcm92aWRlcyBzaW1wbGUgdGV4dCBmb3JtYXR0aW5nIGZ1bmN0aW9ucwotdGhhdCBhbGxvdyBhbiBhdXRob3IgdG8gY2hhbmdlIGhvdyBzZWN0aW9ucyBvZiB0ZXh0IGFwcGVhciBpbiBhIHB1Ymxpc2hlZAotV2ViIHNpdGUuIFRoZSBSaWNoIFRleHQgRWRpdG9yIGFsbG93cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMgb2YgdGV4dCB0byBiZQotY2hhbmdlZCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIG92ZXJhbGwgc3R5bGUgc2hlZXQocykgdGhhdCBkZXRlcm1pbmUgdGhlCi1zdHlsZSBhbmQgZm9ybWF0IG9mIGEgcHVibGlzaGVkIFdlYiBzaXRlLjwvcD4KLTxkaXYgY2xhc3M9InAiPlRoZSBSaWNoIFRleHQgRWRpdG9yIGFsbG93cyB5b3UgdG86PHVsPjxsaT5Db3B5LCBjdXQgYW5kIHBhc3RlIHRleHQuIFNpbXBseSBoaWdobGlnaHQgdGhlIHRleHQgeW91IHdhbnQgdG8gY3V0IG9yCi1jb3B5IGFuZCB0aGVuIGNsaWNrIHRoZSBDdXQgPGltZyBzcmM9ImN1dC5naWYiIGFsdD0iIiAvPiBvciBDb3B5IDxpbWcgc3JjPSJjb3B5LmdpZiIgYWx0PSIiIC8+IGJ1dHRvbnMuIFRvIHBhc3RlIHRleHQsIHBsYWNlIHRoZSBjdXJzb3IKLXdoZXJlIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIHRleHQgYW5kIHRoZW4gY2xpY2sgdGhlIFBhc3RlIGJ1dHRvbiA8aW1nIHNyYz0icGFzdGUuZ2lmIiBhbHQ9IiIgLz4uPC9saT4KLTxsaT5SZW1vdmUgYWxsIHRoZSBjb250ZW50cyBpbiB0aGUgdGV4dCBlZGl0b3Igd2luZG93IGF0IG9uY2UgYnkgY2xpY2tpbmcKLXRoZSBDbGVhciBDb250ZW50IGJ1dHRvbiA8aW1nIHNyYz0iY2xlYXJjb250ZW50LmdpZiIgYWx0PSIiIC8+LjwvbGk+Ci08bGk+Q2hhbmdlIHRoZSBhcHBlYXJhbmNlIG9mIHlvdXIgdGV4dCBieSBtYWtpbmcgaXQgYm9sZCwgaXRhbGljaXplZCwgb3IgdW5kZXJsaW5pbmcKLWl0LiBIaWdobGlnaHQgdGhlIHRleHQgeW91IHdhbnQgdG8gY2hhbmdlIGFuZCB0aGVuIGNsaWNrIHRoZSBCb2xkIDxpbWcgc3JjPSJib2xkLmdpZiIgYWx0PSIiIC8+LCBJdGFsaWNzIDxpbWcgc3JjPSJpdGFsaWMuZ2lmIiBhbHQ9IiIgLz4sCi1vciBVbmRlcmxpbmUgPGltZyBzcmM9InVuZGVybGluZS5naWYiIGFsdD0iIiAvPiBidXR0b24uPC9saT4KLTxsaT5DcmVhdGUgU3VwZXIgb3IgU3ViIHNjcmlwdCBieSBjbGlja2luZyB0aGUgU3VwZXJzY3JpcHQgPGltZyBzcmM9InN1cGVyc2NyaXB0LmdpZiIgYWx0PSIiIC8+IG9yIFN1YnNjcmlwdCA8aW1nIHNyYz0ic3Vic2NyaXB0LmdpZiIgYWx0PSIiIC8+IGJ1dHRvbnMuPC9saT4KLTxsaT5BZGQgbnVtYmVyZWQgb3IgYnVsbGV0ZWQgbGlzdHMgdXNpbmcgdGhlIG9yZGVyZWQgPGltZyBzcmM9ImFkZG9yZGxpc3RfY28uZ2lmIiBhbHQ9IiIgLz4gb3IgdW5vcmRlcmVkIGxpc3QgPGltZyBzcmM9ImFkZHVub3JkbGlzdF9jby5naWYiIGFsdD0iIiAvPiBidXR0b25zLjwvbGk+Ci08bGk+SW5kZW50IG9yIE91dGRlbnQgdGV4dCB1c2luZyB0aGUgSW5kZW50IDxpbWcgc3JjPSJpbmRlbnQuZ2lmIiBhbHQ9IiIgLz4gb3IgT3V0ZGVudCA8aW1nIHNyYz0ib3V0ZGVudC5naWYiIGFsdD0iIiAvPiBidXR0b25zLjwvbGk+Ci08bGk+RmluZCBhbmQgcmVwbGFjZSB0ZXh0LiBDbGljayB0aGUgRmluZC9SZXBsYWNlIGJ1dHRvbiA8aW1nIHNyYz0iZmluZHJlcGxhY2UuZ2lmIiBhbHQ9IiIgLz4uIFRoZSBGaW5kL1JlcGxhY2UgZGlhbG9nIGJveCBhcHBlYXJzLiBUeXBlIHRoZSB0ZXh0IHlvdQotd2FudCB0byBmaW5kIGluIHRoZSBGaW5kIGZpZWxkIGFuZCwgaWYgeW91IGFyZSByZXBsYWNpbmcgdGhhdCB0ZXh0LCB0eXBlIHRoZQotcmVwbGFjZW1lbnQgdGV4dCBpbiB0aGUgUmVwbGFjZSB3aXRoIGZpZWxkLiBZb3UgY2FuIHNlYXJjaCBmb3J3YXJkIG9yIGJhY2sKLWFuZCBzcGVjaWZ5IHdoZXRoZXIgeW91IHdhbnQgeW91ciBzZWFyY2ggdG8gYmUgY2FzZSBzZW5zaXRpdmUgb3Igc2VhcmNoIGZvcgotb25seSBwYXJ0cyBvZiB3b3Jkcy48L2xpPgotPGxpPkFkZCBvciBjcmVhdGUgaHlwZXJsaW5rcyB1c2luZyB0aGUgQWRkIGxpbmsgYnV0dG9uIDxpbWcgc3JjPSJhZGRsaW5rX2NvLmdpZiIgYWx0PSIiIC8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0iYWRkYXJlZmVyZW5jZW9yaHlwZXJsaW5rLmh0bWwjYWRkYXJlZmVyZW5jZW9yaHlwZXJsaW5rIj5BZGQgYSBSZWZlcmVuY2Ugb3IgSHlwZXJsaW5rPC9hPi48L2xpPgotPGxpPkFkZCBpbWFnZXMuIENsaWNrIHRoZSBBZGQgSW1hZ2UgYnV0dG9uIDxpbWcgc3JjPSJhZGRpbWdfY28uZ2lmIiBhbHQ9IiIgLz4uIFRoZSBBZGQgSW1hZ2UgZGlhbG9nIGJveCBhcHBlYXJzLiBCcm93c2UgZm9yIHRoZSBpbWFnZSB5b3UnZCBsaWtlCi10byBhZGQgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi48L2xpPgotPGxpPkFkZCB0YWJsZXMuIENsaWNrIHRoZSBBZGQgVGFibGUgYnV0dG9uIDxpbWcgc3JjPSJhZGR0YWJsZV9jby5naWYiIGFsdD0iIiAvPi4gVGhlIEFkZCBUYWJsZSBkaWFsb2cgYm94IGFwcGVhcnMuIFNwZWNpZnkgdGhlIHRhYmxlIHBhcmFtZXRlcnMKLWFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9hZG1hcC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2FkbWFwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFhOTliZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2FkbWFwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJSb2FkbWFwIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InJvYWRtYXAiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Um9hZG1hcDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icm9hZG1hcCI+PGEgbmFtZT0icm9hZG1hcCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlJvYWRtYXA8L2gxPgotPGRpdj48cD5BIFJvYWRtYXAgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgZGVzY3JpYmVzIGhvdyBhIHByb2Nlc3MgaXMKLXR5cGljYWxseSBwZXJmb3JtZWQuIE9mdGVuIHByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nCi1hIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoZSBwcm9jZXNzLgotSW4gYWRkaXRpb24gdG8gbWFraW5nIHRoZSBwcm9jZXNzIHByYWN0aXRpb25lciB1bmRlcnN0YW5kIGhvdyB3b3JrIGluIHRoZQotcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgcm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0Ci1ob3cgYWN0aXZpdGllcyBhbmQgdGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiA8L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JvbGUuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9sZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYWFiZDlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9sZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUm9sZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXJvbGUuaHRtbCNjcmVhdGVhcm9sZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJyb2xlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlJvbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJvbGUiPjxhIG5hbWU9InJvbGUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Sb2xlPC9oMT4KLTxkaXY+PHA+QSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMKLW9mIGFuIGluZGl2aWR1YWwgb3IgaW5kaXZpZHVhbHMuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXJvbGUuaHRtbCNjcmVhdGVhcm9sZSI+Q3JlYXRlIGEgUm9sZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JvbGVzZXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9sZXNldC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OWJiYzFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9sZXNldC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUm9sZSBTZXQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icm9sZXNldCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Sb2xlIFNldDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icm9sZXNldCI+PGEgbmFtZT0icm9sZXNldCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlJvbGUgU2V0PC9oMT4KLTxkaXY+PHA+QSBSb2xlIFNldCBpcyB1c2VkIHRvIGdyb3VwIDxhIGhyZWY9InJvbGUuaHRtbCNyb2xlIj5Sb2xlczwvYT4gd2l0aAotY2VydGFpbiBjb21tb25hbGl0aWVzIHRvZ2V0aGVyLiBGb3IgZXhhbXBsZSwgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwKLWFuIEFuYWx5c3Qgcm9sZSBzZXQgY291bGQgYmUgdXNlZCB0byBncm91cCB0b2dldGhlciByb2xlcyBzdWNoIGFzIEJ1c2luZXNzCi1Qcm9jZXNzIEFuYWx5c3QsIFN5c3RlbSBBbmFseXN0IGFuZCBSZXF1aXJlbWVudHMgU3BlY2lmaWVyLiBFYWNoIG9mIHRoZXNlCi1yb2xlcyB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IG1heSBiZQotcmVzcG9uc2libGUgZm9yIHBlcmZvcm1pbmcgY2VydGFpbiB0YXNrcyBhbmQgY3JlYXRpbmcgY2VydGFpbiB3b3JrIHByb2R1Y3RzLgotUm9sZSBzZXRzIGNhbiBiZSBvcmdhbml6ZWQgdXNpbmcgUm9sZSBTZXQgR3JvdXBpbmdzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiPk1ldGhvZCBDb250ZW50IENhdGVnb3JpZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2xlc2V0Z3JvdXBpbmcuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9sZXNldGdyb3VwaW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjNzVmYjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2xlc2V0Z3JvdXBpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlJvbGUgU2V0IEdyb3VwaW5nIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJyb2xlc2V0Lmh0bWwjcm9sZXNldCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icm9sZS5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhcm9sZS5odG1sI2NyZWF0ZWFyb2xlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InJvbGVzZXRncm91cGluZyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Sb2xlIFNldCBHcm91cGluZzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icm9sZXNldGdyb3VwaW5nIj48YSBuYW1lPSJyb2xlc2V0Z3JvdXBpbmciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Sb2xlIFNldCBHcm91cGluZzwvaDE+Ci08ZGl2PjxwPlJvbGUgc2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byByb2xlIHNldCBncm91cGluZ3MuIEZvciBleGFtcGxlLCBkaWZmZXJlbnQKLW1ldGhvZCBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMgd2hpY2gsIGhvd2V2ZXIsIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZAotZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsCi1mb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIHNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudAotT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InJvbGVzZXQuaHRtbCNyb2xlc2V0Ij5Sb2xlIFNldDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0icm9sZS5odG1sIj5Sb2xlPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFyb2xlLmh0bWwjY3JlYXRlYXJvbGUiPkNyZWF0ZSBhIFJvbGU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zZWFyY2hmb3JtZXRoY29udC5KUEcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3NlYXJjaGZvcm1ldGhjb250LkpQRwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDljNTBkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3NlYXJjaGZvcm1ldGhjb250LkpQRworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc2VhcmNoZm9ybWV0aG9kY29udGVudC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zZWFyY2hmb3JtZXRob2Rjb250ZW50Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU4ZDI1NTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zZWFyY2hmb3JtZXRob2Rjb250ZW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTZWFyY2ggZm9yIE1ldGhvZCBDb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJzZWFyY2hmb3JtZXRob2Rjb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlNlYXJjaCBmb3IgTWV0aG9kIENvbnRlbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InNlYXJjaGZvcm1ldGhvZGNvbnRlbnQiPjxhIG5hbWU9InNlYXJjaGZvcm1ldGhvZGNvbnRlbnQiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TZWFyY2ggZm9yIE1ldGhvZCBDb250ZW50PC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gU2VhcmNoIGZvciBNZXRob2QgQ29udGVudDo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGJlZ2luIHlvdXIgc2VhcmNoIGZvciBtZXRob2QgY29udGVudC48L3NwYW4+PHVsPjxsaT5TZWxlY3QgPHN0cm9uZz5TZWFyY2ggJmd0OyBTZWFyY2g8L3N0cm9uZz48L2xpPgotPGxpPjxzdHJvbmc+U2VhcmNoICZndDsgRmlsZTwvc3Ryb25nPjwvbGk+Ci08bGk+Q2xpY2sgdGhlIFNlYXJjaCBidXR0b24gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+PGltZyBzcmM9InNlYXJjaGZvcm1ldGhjb250LkpQRyIgYWx0PSIiIC8+PC9zcGFuPiBpbiB0aGUgdG9vbCBiYXIuPC9saT4KLTwvdWw+Ci0gVGhlIFNlYXJjaCBkaWFsb2cgd2luZG93IG9wZW5zLjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIGVpdGhlciB0aGUgPHN0cm9uZz5GaWxlIFNlYXJjaDwvc3Ryb25nPiB0YWIgb3IgdGhlIDxzdHJvbmc+TWV0aG9kIFNlYXJjaDwvc3Ryb25nPiB0YWIKLWFuZCB0aGVuIHNldCB5b3VyIGNyaXRlcmlhLiBVc2luZyB0aGUgPHN0cm9uZz5GaWxlIFNlYXJjaDwvc3Ryb25nPiB0YWIsIHlvdSBjYW4gc2VhcmNoCi1mb3IgY29udGVudCBieSB0aGUgZmlsZSBuYW1lIG9mIHRoZSBjb250ZW50LiBVc2luZyB0aGUgPHN0cm9uZz5NZXRob2QgU2VhcmNoPC9zdHJvbmc+IHRhYiwKLXlvdSBjYW4gc2VhcmNoIHRoZSBtZXRob2QgY29udGVudCBpdHNlbGYuPC9zcGFuPjx1bD48bGk+PHN0cm9uZz5Vc2luZyBGaWxlIFNlYXJjaDwvc3Ryb25nPjogVHlwZSBhIHRleHQgc3RyaW5nIHRvIHNlYXJjaCBmb3Igd2l0aGluCi10aGUgZmlsZXMgKG9wdGlvbmFsKSwgb3IgdHlwZSBhIGZpbGUgbmFtZSBwYXR0ZXJuIHRvIHVzZSBmb3IgbWF0Y2hpbmcgZmlsZQotbmFtZXMuIFlvdSBtdXN0IHVzZSBhIHBhdHRlcm4uIFVzZSAqIGlmIHlvdSB3YW50IHRvIHNlYXJjaCBmb3IgdGhlIHRleHQgaW4KLWFsbCBmaWxlcy4gTGVhdmUgYWxsIG90aGVyIG9wdGlvbnMgYXMgZGVmYXVsdC48L2xpPgotPGxpPjxzdHJvbmc+VXNpbmcgTWV0aG9kIFNlYXJjaDwvc3Ryb25nPjogVHlwZSBhIHRleHQgc3RyaW5nIHRvIHNlYXJjaCBmb3Igd2l0aGluCi10aGUgZmlsZXMgKG9wdGlvbmFsKSwgb3IgdHlwZSBhIG5hbWUgcGF0dGVybiBmb3IgbWF0Y2hpbmcgZWxlbWVudCBuYW1lcyBhbmQKLXByZXNlbnRhdGlvbiBuYW1lcy4gWW91IG11c3QgdXNlIGEgcGF0dGVybi4gVXNlICogaWYgeW91IHdhbnQgdG8gc2VhcmNoIGZvcgotdGV4dCBpbiBhbGwgZmlsZXMuIEluIHRoZSBTY29wZSBzZWN0aW9uLCB5b3UgY2FuIHJlc3RyaWN0IHlvdXIgc2VhcmNoIHRvIGEKLXN1YnNldCBvZiBlbGVtZW50IHR5cGVzLjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5TZWFyY2g8L3N0cm9uZz4uIFRoZSBTZWFyY2ggVmlldyBvcGVucyB3aXRoIHlvdXIgc2VhcmNoIHJlc3VsdHMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBTZWFyY2ggVmlldywgeW91IGNhbiBkcmlsbCBkb3duIGludG8gdGhlIHNlYXJjaCByZXN1bHRzCi1hbmQgZG91YmxlLWNsaWNrIGFuIGVsZW1lbnQgdG8gb3BlbiB0aGUgZWRpdG9yIGZvciB0aGUgc2VsZWN0ZWQgZWxlbWVudC4gSWYKLXlvdSBoYXZlIExpbmsgd2l0aCBFZGl0b3Igc2VsZWN0ZWQgaW4gdGhlIGxpYnJhcnkgdmlldywgdGhlIGxpYnJhcnkgdmlldyBkaXNwbGF5Ci1jaGFuZ2VzIHRvIHNob3cgeW91IHdoZXJlIHRoZSBzZWxlY3RlZCBlbGVtZW50IGlzIGluIHRoZSBsaWJyYXJ5Ljwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiI+VG9vbCBJbnRlcmZhY2U8L2E+PC9kaXY+Ci08ZGl2IGNsYXNzPSJwcmV2aW91c2xpbmsiPjxzdHJvbmc+UHJldmlvdXMgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImJyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Lmh0bWwiPkJyb3dzZSBhbmQgUHJldmlldyBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj5NZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N0YW5kYXJkbWV0aG9kbGlicmFyeW92ZXJ2aWV3Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N0YW5kYXJkbWV0aG9kbGlicmFyeW92ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY5YmFlYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU3RhbmRhcmQgTWV0aG9kIExpYnJhcnkgT3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgbWV0aG9kIHBsdWctaW5zIGFuZCBtZXRob2QgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gQWxsIG1ldGhvZCBlbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgbWV0aG9kIGxpYnJhcnkuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIG1ldGhvZCBwbHVnLWlucyBhbmQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuIEFsbCBtZXRob2QgZWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIG1ldGhvZCBsaWJyYXJ5LiIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJzdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5TdGFuZGFyZCBNZXRob2QgTGlicmFyeSBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ic3RhbmRhcmRtZXRob2RsaWJyYXJ5b3ZlcnZpZXciPjxhIG5hbWU9InN0YW5kYXJkbWV0aG9kbGlicmFyeW92ZXJ2aWV3Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U3RhbmRhcmQgTWV0aG9kIExpYnJhcnkgT3ZlcnZpZXc8L2gxPgotPGRpdj48cD5BIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBtZXRob2QgcGx1Zy1pbnMgYW5kCi1tZXRob2QgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gQWxsIG1ldGhvZCBlbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgbWV0aG9kCi1saWJyYXJ5LjwvcD4KLTxwPk11Y2ggbGlrZSBhIGxpYnJhcnkgaGFzIGJvb2tzLCBhIG1ldGhvZCBsaWJyYXJ5IGhhcyBtZXRob2QgcGx1Zy1pbnMuIFdoZXJlCi1hIGxpYnJhcnkgYm9vayBpcyBtYWRlIHVwIG9mIHNlY3Rpb25zIG9yIGNoYXB0ZXJzIGFuZCBjb250ZW50IHdpdGhpbiB0aG9zZQotY2hhcHRlcnMsIDxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+bWV0aG9kCi1wbHVnLWluczwvYT4gYXJlIG1hZGUgdXAgb2YgPGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+bWV0aG9kIGNvbnRlbnQ8L2E+IGFuZCBwcm9jZXNzZXMuIE1ldGhvZCBjb250ZW50IGNvbnRhaW5zCi1jb250ZW50IHBhY2thZ2VzIGFuZCBib3RoIDxhIGhyZWY9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiPnN0YW5kYXJkIGFuZCBjdXN0b20gY2F0ZWdvcmllczwvYT4sIHdoaWxlIHByb2Nlc3NlcyBzdHJ1Y3R1cmUKLXRoaXMgY29udGVudCBpbnRvIHByb2Nlc3MgZnJhZ21lbnRzIGNhbGxlZCA8YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5jYXBhYmlsaXR5IHBhdHRlcm5zPC9hPiBhbmQgZnVsbCBsaWZlY3ljbGUgcHJvY2Vzc2VzIGNhbGxlZCA8YSBocmVmPSJkZWxpdmVyeXByb2Nlc3MuaHRtbCI+ZGVsaXZlcnkgcHJvY2Vzc2VzPC9hPi48L3A+Ci08cD5BIG1ldGhvZCBsaWJyYXJ5IGFsc28gaGFzIG9uZSBvciBtb3JlIDxhIGhyZWY9Im1ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwjbWV0aG9kY29uZmlndXJhdGlvbnMiPm1ldGhvZCBjb25maWd1cmF0aW9uczwvYT4gdGhhdCBmaWx0ZXIgdGhlIGxpYnJhcnkgYW5kIHByb3ZpZGUKLXNtYWxsZXIgd29ya2luZyBzZXRzIG9mIGxpYnJhcnkgY29udGVudCBmb3IgdGhlIGVuZCB1c2VyLjwvcD4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3RlcC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdGVwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExZWQwYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdGVwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTdGVwIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InN0ZXAiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+U3RlcDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ic3RlcCI+PGEgbmFtZT0ic3RlcCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlN0ZXA8L2gxPgotPGRpdj48cD5BIFN0ZXAgaXMgYSBwYXJ0IG9mIHRoZSBvdmVyYWxsIHdvcmsgZGVzY3JpYmVkIGZvciBhIHRhc2suIFRoZSBjb2xsZWN0aW9uCi1vZiBzdGVwcyBkZWZpbmVkIGZvciBhIHRhc2sgcmVwcmVzZW50cyBhbGwgdGhlIHdvcmsgdGhhdCBzaG91bGQgYmUgZG9uZSB0bwotYWNoaWV2ZSB0aGUgb3ZlcmFsbCBnb2FsIG9mIHRoZSB0YXNrLiBOb3QgYWxsIHN0ZXBzIGFyZSBuZWNlc3NhcmlseSBwZXJmb3JtZWQKLWVhY2ggdGltZSBhIHRhc2sgaXMgaW52b2tlZCBpbiBhIHByb2Nlc3MuPC9wPgotPC9kaXY+Ci08ZGl2PjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdWJzY3JpcHQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdWJzY3JpcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDMzYzgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3Vic2NyaXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3VwZXJzY3JpcHQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdXBlcnNjcmlwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzNjc1Y2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdXBlcnNjcmlwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N1cHBvcnRpbmdtYXRlcmlhbC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdXBwb3J0aW5nbWF0ZXJpYWwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzFjNmQxNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N1cHBvcnRpbmdtYXRlcmlhbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU3VwcG9ydGluZyBNYXRlcmlhbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJzdXBwb3J0aW5nbWF0ZXJpYWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+U3VwcG9ydGluZyBNYXRlcmlhbDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ic3VwcG9ydGluZ21hdGVyaWFsIj48YSBuYW1lPSJzdXBwb3J0aW5nbWF0ZXJpYWwiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9oMT4KLTxkaXY+PHA+U3VwcG9ydGluZyBNYXRlcmlhbCBpcyBhIGNhdGNoLWFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2UKLW5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBjb250ZW50Ci1lbGVtZW50cywgaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdGFzay5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90YXNrLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVjNTU3NzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90YXNrLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJUYXNrIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhdGFzay5odG1sI2NyZWF0ZWF0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5UYXNrPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YXNrIj48YSBuYW1lPSJ0YXNrIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VGFzazwvaDE+Ci08ZGl2PjxwPkEgVGFzayBpcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBhIHNwZWNpZmljCi1Sb2xlLiBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzIGFuZAotdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgdW1iZXIgb2YgV29yayBQcm9kdWN0cy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhdGFzay5odG1sI2NyZWF0ZWF0YXNrIj5DcmVhdGUgYSBUYXNrPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3RlbXBsYXRlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3RlbXBsYXRlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1NTcxMTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90ZW1wbGF0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVGVtcGxhdGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0idGVtcGxhdGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+VGVtcGxhdGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRlbXBsYXRlIj48YSBuYW1lPSJ0ZW1wbGF0ZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlRlbXBsYXRlPC9oMT4KLTxkaXY+PHA+QSBUZW1wbGF0ZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhIHdvcmsgcHJvZHVjdAotd2l0aCBhIHByZWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLAotYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBvZiBob3cgdGhlIHNlY3Rpb25zCi1hbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbiBiZSBwcm92aWRlZAotZm9yIGRvY3VtZW50cyBhcyB3ZWxsIGFzIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdGVybWRlZmluaXRpb24uaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdGVybWRlZmluaXRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWQ1YTM1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Rlcm1kZWZpbml0aW9uLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJUZXJtIERlZmluaXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0idGVybWRlZmluaXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+VGVybSBEZWZpbml0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0ZXJtZGVmaW5pdGlvbiI+PGEgbmFtZT0idGVybWRlZmluaXRpb24iPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5UZXJtIERlZmluaXRpb248L2gxPgotPGRpdj48cD5UZXJtIGRlZmluaXRpb25zIGRlZmluZXMgYSBzcGVjaWZpYyB0ZXJtLCBjb25jZXB0LCBvciBvdGhlciBpZGVhIHJlbGV2YW50Ci10byBtZXRob2QgYW5kIHByb2Nlc3MgY29udGVudC4gQSB0ZXJtIGRlZmluaXRpb24gaXMgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8KLWFueSBjb250ZW50IGVsZW1lbnRzLCBidXQgcmVsYXRpb25zaGlwcyBhcmUgZGVyaXZlZCB3aGVuIHRoZSB0ZXJtIGlzIHVzZWQKLWluIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGluIGEgY29udGVudCBlbGVtZW50LjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdG9vbG1lbnRvci5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90b29sbWVudG9yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxM2VmNDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90b29sbWVudG9yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJUb29sIE1lbnRvciIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJ0b29sbWVudG9yIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlRvb2wgTWVudG9yPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0b29sbWVudG9yIj48YSBuYW1lPSJ0b29sbWVudG9yIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VG9vbCBNZW50b3I8L2gxPgotPGRpdj48cD5BIFRvb2wgTWVudG9yIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYwotdG9vbCB0byBhY2NvbXBsaXNoIGEgcGllY2Ugb2Ygd29yay48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzEuaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF8xLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWY5MzBiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDE6IEV4cGxvcmUgdGhlIFVzZXIgSW50ZXJmYWNlIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBiZWNvbWUgZmFtaWxpYXIgd2l0aCB0aGUgbWFqb3IgcGFydHMgb2YgdGhlIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgdXNlciBpbnRlcmZhY2UuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCBwZXJzcGVjdGl2ZS4gVGhlIGN1cnJlbnQgcGVyc3BlY3RpdmUgaXMgZGlzcGxheWVkIG5lYXIgdGhlIHRvcCByaWdodCBvZiB0aGUgc2NyZWVuLiBZb3Ugd2lsbCBzZWUgZWl0aGVyIEF1dGhvcmluZyBvciBCcm93c2luZy4gQ2xpY2sgb24gdGhlIDxzdHJvbmc+T3BlbiBQZXJzcGVjdGl2ZTwvc3Ryb25nPiBpY29uLCBhbmQgc2VsZWN0IHRoZSBvdGhlciBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+RXhwbG9yZSB0aGUgPHN0cm9uZz5MaWJyYXJ5PC9zdHJvbmc+IDxzdHJvbmc+Vmlldzwvc3Ryb25nPi4gVGhlIGxpYnJhcnkgdmlldyBpcyBhdmFpbGFibGUgaW4gYXV0aG9yaW5nIHBlcnNwZWN0aXZlIJYgaXQgaXMgbm90IHNob3duIGluIHRoZSBicm93c2luZyBwZXJzcGVjdGl2ZS4gVGhlIExpYnJhcnkgVmlldyBzaG93cyB5b3UgYWxsIHRoZSBjb250ZW50IGluIHRoZSBjdXJyZW50IGxpYnJhcnkuIFRoZSBoaWdoZXN0IGxldmVsIGNvbnRlbnQgdW5pdCBpcyBhIHBsdWdpbi4gQ2xpY2sgb24gc29tZSA8c3Ryb25nPis8L3N0cm9uZz4gc2lnbnMgYW5kIGV4cGxvcmUgdGhlIGNvbnRlbnQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkRyaWxsIGRvd24gaW50byBhIHBsdWdpbiBhcyBmb2xsb3dzOiA8c3Ryb25nPk1ldGhvZCBDb250ZW50ICZndDsgQ29udGVudCBQYWNrYWdlcyAmZ3Q7IFthbnldICZndDsgVGFza3M8L3N0cm9uZz4uIERvdWJsZSBjbGljayBvbiBhIHRhc2suIFRoZSBUYXNrIEVkaXRvciBpcyBkaXNwbGF5ZWQgb24gdGhlIHJpZ2h0IG9mIHRoZSBzY3JlZW4uIFRoZXJlIGFyZSBzZXBhcmF0ZSBlZGl0b3JzIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGNvbnRlbnQgdGhhdCB5b3UgY2FuIGNyZWF0ZSBpbiBhIGxpYnJhcnkuIEVhY2ggZWRpdG9yIGhhcyBhIHNlcmllcyBvZiB0YWJzIGFuZCBhIG51bWJlciBvZiBmb3JtIGVsZW1lbnRzIG9uIGVhY2ggdGFiLiBZb3UgY2FuIGZpbmQgb3V0IG1vcmUgYWJvdXQgdGhlc2UgaW4gdGhlIDx1PkNyZWF0ZSBNZXRob2QgQ29udGVudCA8L3U+dHV0b3JpYWwuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIHRoZSA8c3Ryb25nPlByZXZpZXcgPC9zdHJvbmc+IHRhYi4gQSBwcmV2aWV3IG9mIGFuIEhUTUwgcGFnZSBpcyBkaXNwbGF5ZWQuIFRoaXMgaXMgd2hhdCB0aGUgc2VsZWN0ZWQgZWxlbWVudCB3aWxsIGxvb2sgbGlrZSBpbiBhIHB1Ymxpc2hlZCB3ZWIgc2l0ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIHRoZSA8c3Ryb25nPmJyb3dzaW5nIHBlcnNwZWN0aXZlPC9zdHJvbmc+LiBUaGUgQ29uZmlndXJhdGlvbiBWaWV3IGlzIG5vdyBkaXNwbGF5ZWQuIFRoZSBjb25maWd1cmF0aW9uIHZpZXcgYWx3YXlzIGhhcyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYnV0IHRoZSBjb250ZW50IGNoYW5nZXMgYmFzZWQgb24gd2hpY2ggY29uZmlndXJhdGlvbiBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuIERyaWxsIGRvd24gaW50byB0aGUgRGlzY2lwbGluZXMgZm9sZGVyIHVudGlsIHlvdSBnZXQgdG8gdGFza3MgYW5kIGNsaWNrIG9uIGEgdGFzay4gVGhlIEhUTUwgcHJldmlldyBvZiB0aGUgc2VsZWN0ZWQgaXRlbSBpcyBzaG93biBvbiB0aGUgcmlnaHQgb2YgdGhlIHNjcmVlbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIGNvbmZpZ3VyYXRpb25zLiBUaGUgY3VycmVudCBjb25maWd1cmF0aW9uIGlzIGRpc3BsYXllZCBpbiB0aGUgc2VsZWN0aW9uIGJveCBiZWxvdyB0aGUgbWFpbiBtZW51IGJhci4gU2VsZWN0IGEgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBkcm9wIGRvd24gbGlzdC4gWW91IHdpbGwgc2VlIHRoZSBDb25maWd1cmF0aW9uIFZpZXcgcmVmcmVzaCB3aGVuIHlvdSBkbyB0aGlzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5Td2l0Y2ggdG8gdGhlIDxzdHJvbmc+YXV0aG9yaW5nPC9zdHJvbmc+IDxzdHJvbmc+cGVyc3BlY3RpdmU8L3N0cm9uZz4uIERyaWxsIGRvd24gaW50byBhIHBsdWdpbiBhcyBmb2xsb3dzOiA8c3Ryb25nPlByb2Nlc3NlcyAmZ3Q7IENhcGFiaWxpdHkgUGF0dGVybnMgJmd0OyBbYW55XSAmZ3Q7IENhcGFiaWxpdHkgUGF0dGVybnM8L3N0cm9uZz4uIE5vdGUgdGhhdCBub3QgYWxsIHBsdWdpbnMgaGF2ZSBjYXBhYmlsaXR5IHBhdHRlcm5zLiBEb3VibGUtY2xpY2sgb24gYSBjYXBhYmlsaXR5IHBhdHRlcm4uIFRoZSByaWdodCBzaWRlIG9mIHRoZSBzY3JlZW4gaXMgbm93IGZpbGxlZCB3aXRoIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gZWRpdG9yIGFuZCB0aGUgUHJvcGVydGllcyBWaWV3LiBZb3UgY2FuIGZpbmQgb3V0IG1vcmUgYWJvdXQgdGhlc2UgaW4gdGhlIDx1Pldvcmtpbmcgd2l0aCBQcm9jZXNzZXM8L3U+IHR1dG9yaWFsLjwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF8yLmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwN2E5MjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF8yLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSAyOiBCcm93c2UgTWV0aG9kIENvbnRlbnQgdmlhIEJyb3dzaW5nIFBlcnNwZWN0aXZlIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBiZWNvbWUgZmFtaWxpYXIgd2l0aCBicm93c2luZyBtZXRob2QgY29udGVudCBpbiBhIGxpYnJhcnkgdXNpbmcgdGhlIGJyb3dzaW5nIHBlcnNwZWN0aXZlLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5TZWxlY3QgPHN0cm9uZz5SVVAgZm9yIFNtYWxsIFByb2plY3RzIDwvc3Ryb25nPiBpbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGRyb3AtZG93biBsaXN0IGxvY2F0ZWQgdW5kZXJuZWF0aCB0aGUgbWFpbiBtZW51IGJhci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+U2VsZWN0IDxzdHJvbmc+QnJvd3NpbmcgcGVyc3BlY3RpdmU8L3N0cm9uZz4uIFRoZSBDb25maWd1cmF0aW9uIFZpZXcgYXBwZWFycyBvbiB0aGUgbGVmdC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+VG8gdmlldyBhIFRhc2ssIGNsaWNrIDxzdHJvbmc+RGlzY2lwbGluZXMgJmd0OyBSVVAgRGlzY2lwbGluZXMgJmd0OyBBbmFseXNpcyAmYW1wOyBEZXNpZ24gJmd0OyBEZXNpZ24gdGhlIFVzZXIgSW50ZXJmYWNlPC9zdHJvbmc+LiBBIHByZXZpZXcgb2YgdGhlIHB1Ymxpc2hlZCBXZWIgcGFnZSBmb3IgdGhlIHNlbGVjdGVkIGVsZW1lbnQgaXMgZGlzcGxheWVkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbGljayB0aGUgPHN0cm9uZz5QcmltYXJ5IFBlcmZvcm1lciA8L3N0cm9uZz5saW5rIGluIHRoZSByZWxhdGlvbnNoaXBzIHNlY3Rpb24uIFRoaXMgd2lsbCBzaG93IHRoZSBwcmV2aWV3IHBhZ2UgZm9yIHRoZSBVc2VyLUludGVyZmFjZSBEZXNpZ25lci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+WW91IGNhbiBjbGljayBvbiBhbnkgbGlua3MgaW4gdGhlIHByZXZpZXcgYW5kIHVzZSB0aGUgYmFjayBpY29uIGluIHRoZSBwcmV2aWV3IHRvb2xiYXIgdG8gcmV0dXJuIHRvIHByZXZpb3VzIHBhZ2VzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5WaWV3IG90aGVyIGVsZW1lbnRzIGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXcgdHJlZSCWIGUuZy4gdW5kZXIgRG9tYWlucywgUm9sZSBTZXRzLCBldGMuIDwvcD4KLSAgPC9saT4KLTwvb2w+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfMy5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZTExYTgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgMzogQnJvd3NlIFByb2Nlc3MgQ29udGVudCB2aWEgQnJvd3NpbmcgUGVyc3BlY3RpdmUgPC9hPjwvaDI+Ci08cD4gVGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBiZWNvbWUgZmFtaWxpYXIgd2l0aCBicm93c2luZyBwcm9jZXNzIGNvbnRlbnQgaW4gYSBsaWJyYXJ5IHVzaW5nIHRoZSBicm93c2luZyBwZXJzcGVjdGl2ZSA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5NYWtlIHN1cmUgeW91IGFyZSBpbiB0aGUgQnJvd3NpbmcgcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlRvIHZpZXcgYSBDYXBhYmlsaXR5IFBhdHRlcm4sIGNsaWNrIDxzdHJvbmc+UHJvY2Vzc2VzICZndDsgQ2FwYWJpbGl0eSBQYXR0ZXJucyAmZ3Q7IENsYXNzaWMgUlVQICZndDsgRGlzY2lwbGluZSBXb3JrZmxvd3MgJmd0OyBBbmFseXNpcyBhbmQgRGVzaWduPC9zdHJvbmc+LiBBIHByZXZpZXcgb2YgdGhlIHB1Ymxpc2hlZCBXZWIgcGFnZSBmb3IgdGhlIHNlbGVjdGVkIENhcGFiaWxpdHkgUGF0dGVybiBpcyBkaXNwbGF5ZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPkEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvbnRhaW5zIGEgbGFyZ2UgYW1vdW50IG9mIGluZm9ybWF0aW9uIGFuZCBpcyBkaXNwbGF5ZWQgb3ZlciBmb3VyIHRhYnMgliBEZXNjcmlwdGlvbiwgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgVXNhZ2UgYW5kIFRlYW0gQWxsb2NhdGlvbi4gRXhwbG9yZSB0aGUgaW5mb3JtYXRpb24gb24gZWFjaCB0YWIuIAotICAgIDxwPk5vdGUgdGhhdCB3aGVuIHlvdSBjbGljayBvbiBhIHRhc2sgaW4gdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSB0YWIgeW91IHByZXZpZXcgYSCRVGFzayBEZXNjcmlwdG9yJy4gQSBUYXNrIERlc2NyaXB0b3IgaXMgYSB0YXNrIHdpdGhpbiBhIHByb2Nlc3MuIFRoZSB0YXNrIGRlc2NyaXB0b3IgcGFnZSBoYXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhc2sgYXMgaXQgaXMgdXNlZCBhdCBhIHNwZWNpZmljIHBvaW50IGluIGEgcHJvY2Vzcy4gVGhlIHRhc2sgZGVzY3JpcHRvciBoYXMgYSBsaW5rIHRvIHRoZSBUYXNrIG9uIHdoaWNoIGl0IGlzIGJhc2VkLiA8L3A+Ci0gICAgPHA+Q2xpY2tpbmcgb24gYSByb2xlIG9yIHdvcmsgcHJvZHVjdCBpbiBhIHRhc2sgZGVzY3JpcHRvciB0YWtlcyB5b3UgdG8gYSBSb2xlIERlc2NyaXB0b3Igb3IgYSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvci4gVGhlc2UgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcm9sZSBvciB3b3JrIHByb2R1Y3QgYXQgdGhlIHNhbWUgcG9pbnQgaW4gdGhlIHByb2Nlc3MgYW5kIGFsc28gcHJvdmlkZSBsaW5rcyBiYWNrIHRvIHRoZSBjb3JlIG1ldGhvZCBlbGVtZW50IG9uIHdoaWNoIHRoZXkgYXJlIGJhc2VkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5UbyB2aWV3IGEgRGVsaXZlcnkgUHJvY2VzcywgY2xpY2sgPHN0cm9uZz5Qcm9jZXNzZXMgJmd0OyBEZWxpdmVyeSBQcm9jZXNzZXMgJmd0OyBDbGFzc2ljIFJVUCBMaWZlY3ljbGU8L3N0cm9uZz4uIFRoZSBkaXNwbGF5IGZvciBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgc2ltaWxhciB0byBhIENhcGFiaWxpdHkgUGF0dGVybi4gPC9saT4KLTwvb2w+Ci08cD4mbmJzcDs8L3A+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfNC5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYjZmNDViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgNDogQnJvd3NlIE1ldGhvZCBDb250ZW50IHZpYSBBdXRob3JpbmcgUGVyc3BlY3RpdmUgPC9hPjwvaDI+Ci08cD4gVGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBiZWNvbWUgZmFtaWxpYXIgd2l0aCBicm93c2luZyBsaWJyYXJ5IGNvbnRlbnQgd2hpbGUgaW4gdGhlIGF1dGhvcmluZyBwZXJzcGVjdGl2ZS4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIEF1dGhvcmluZyBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+SW4gdGhlIExpYnJhcnkgVmlldywgbmF2aWdhdGUgdG8gPHN0cm9uZz5SVVAgJmd0OyBNZXRob2QgQ29udGVudCAmZ3Q7IENvbnRlbnQgUGFja2FnZXMgJmd0OyBEZXNpZ24gJmd0OyBHVUkgRGVzaWduICZndDsgUm9sZTwvc3Ryb25nPnMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlNlbGVjdCBhIHJvbGUgKGRvdWJsZSBjbGljaykgYW5kIHVzZSB0aGUgcHJldmlldyB0YWIgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcm9sZSB3aW5kb3cgdG8gdmlldyB0aGUgaHRtbCByZXByZXNlbnRhdGlvbiBvZiB0aGF0IHJvbGUgYW5kIGl0cyByZWxhdGlvbnNoaXBzIHRvIG90aGVyIG1ldGhvZCBlbGVtZW50cy4gVmlldyB0aGUgb3RoZXIgdGFicyB0byBzZWUgdGhlIGluZm9ybWF0aW9uIHByZXNlbnRlZCB3aGVuIGF1dGhvcmluZyB0aGUgbWV0aG9kIGNvbnRlbnQgYW5kIHJlbGF0aW9uc2hpcHMgZm9yIGEgcm9sZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+UmVwZWF0IHN0ZXAgMyB0byBwcmV2aWV3IGEgPHN0cm9uZz50YXNrPC9zdHJvbmc+ICwgPHN0cm9uZz53b3JrIHByb2R1Y3Q8L3N0cm9uZz4sIGFuZCA8c3Ryb25nPmd1aWRhbmNlIGVsZW1lbnQ8L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLTwvb2w+Ci08cD4mbmJzcDs8L3A+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfNS5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MTQ1MWM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgNTogU2VhcmNoIGZvciBNZXRob2QgQ29udGVudCA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gYmVjb21lIGZhbWlsaWFyIHdpdGggdGhlIHNlYXJjaCBmdW5jdGlvbiBpbiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggdG8gPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+cGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPk9wZW4gdXAgdGhlIFNlYXJjaCBkaWFsb2cgYnkgOiA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgQ2xpY2tpbmcgb24gdGhlIEZsYXNobGlnaHQgaWNvbiBpbiB0aGUgdG9vbGJhciA8L3A+Ci0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8YmxvY2txdW90ZT4KLSAgICAgICAgPHA+PHN0cm9uZz5PciA8L3N0cm9uZz48L3A+Ci0gICAgICA8L2Jsb2NrcXVvdGU+Ci0gICAgPC9ibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBTZWxlY3RpbmcgPHN0cm9uZz5TZWFyY2ggLyBTZWFyY2g8L3N0cm9uZz4gaW4gdGhlIG1haW4gbWVudS4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD5DbGljayBvbiB0aGUgPHN0cm9uZz5NZXRob2QgU2VhcmNoPC9zdHJvbmc+IHRhYi4gRW50ZXIgPHNwYW4gY2xhc3M9InN0eWxlMSI+RGF0YWJhc2U8L3NwYW4+IGluIHRoZSB0ZXh0IGJveCBhbmQgY2xpY2sgb24gPHN0cm9uZz5TZWFyY2g8L3N0cm9uZz4uIEl0IHdpbGwgdGFrZSBhIGZldyBzZWNvbmRzIHRvIGZpbmQgYWxsIHRoZSBoaXRzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5EcmlsbCBkb3duIGluIHRoZSBzZWFyY2ggcmVzdWx0cyBhbmQgZG91YmxlLWNsaWNrIG9uIGFuIGVsZW1lbnQuIFRoZSBlZGl0b3IgZm9yIHRoZSBzZWxlY3RlZCBpdGVtIGlzIG9wZW5lZC4gSWYgeW91IGhhdmUgPHN0cm9uZz5MaW5rIHdpdGggRWRpdG9yPC9zdHJvbmc+IHNlbGVjdGVkIGluIHRoZSBsaWJyYXJ5IHZpZXcsIHRoZSBsaWJyYXJ5IHZpZXcgZGlzcGxheSBjaGFuZ2VzIHRvIHNob3cgeW91IHdoZXJlIHRoZSBzZWxlY3RlZCBpdGVtIGlzIGluIHRoZSBsaWJyYXJ5LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5PcGVuIHRoZSBzZWFyY2ggZGlhbG9nIGFnYWluIGFuZCByZXBlYXQgdGhlIHNhbWUgc2VhcmNoIGJ1dCB0aGlzIHRpbWUgcmVkdWNlIHRoZSBzY29wZSB0byBqdXN0IGxvb2sgZm9yIHRhc2tzLiBVbmNoZWNrIGFsbCB0aGUgb3RoZXIgY29udGVudCB0eXBlcyBpbiB0aGUgc2NvcGUgcGFuZWwuIFRoZSBzZWFyY2ggc2hvdWxkIGJlIHF1aWNrZXIgYW5kIHJlc3VsdCBpbiBmZXdlciBoaXRzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5PcGVuIHRoZSBzZWFyY2ggZGlhbG9nIGFnYWluIGFuZCByZXBlYXQgdGhlIHNhbWUgc2VhcmNoIGJ1dCB0aGlzIHRpbWUgYWRkIDxzdHJvbmc+cnVwXyo8L3N0cm9uZz4gYXMgYSBmaWxlIG5hbWUgcGF0dGVybi4gTWFrZSBzdXJlIHRoZSBzY29wZSBpcyBzdGlsbCBzZXQgdG8gdGFza3MuIFRoZSBzZWFyY2ggc2hvdWxkIGJlIGV2ZW4gcXVpY2tlciBhbmQgcmVzdWx0IGluIGV2ZW4gZmV3ZXIgaGl0cy4gPC9wPgotICA8L2xpPgotICA8bGk+RXhwZXJpbWVudCB3aXRoIG90aGVyIE1ldGhvZCBTZWFyY2hlcy48L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfaW50cm8uaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9pbnRyby5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY1YTJkZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9pbnRyby5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDE+PGE+VHV0b3JpYWw6IAotCi0KLSBOYXZpZ2F0ZSB0aGUgVXNlciBJbnRlcmZhY2UKLQotPC9hPjwvaDE+Ci08aDI+PGE+SW50cm9kdWN0aW9uIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyB0dXRvcmlhbCBpcyB0byBnZXQgZmFtaWxpYXIgd2l0aCB1c2VyIGludGVyZmFjZSBhbmQgdGhlIHdheSBtZXRob2QgYW5kIHByb2Nlc3MgY29udGVudCBpcyBzdG9yZWQgYW5kIHZpZXdlZC4gPC9wPgotPHA+QSBNZXRob2QgTGlicmFyeSBjb25zaXN0cyBvZiBhIHNlcmllcyBvZiA8c3Ryb25nPjxlbT5tZXRob2QgcGx1Zy1pbnMuIDwvZW0+PC9zdHJvbmc+V2l0aGluIGEgcGx1Z2luLCBjb250ZW50IGlzIHNlcGFyYXRlZCBpbnRvIDxzdHJvbmc+PGVtPk1ldGhvZCBDb250ZW50IDwvZW0+PC9zdHJvbmc+ICh0YXNrcywgcm9sZXMsIHdvcmsgcHJvZHVjdHMgYW5kIGd1aWRhbmNlKSBhbmQgPHN0cm9uZz48ZW0+UHJvY2Vzc2VzIDwvZW0+PC9zdHJvbmc+IChjYXBhYmlsaXR5IHBhdHRlcm5zIGFuZCBkZWxpdmVyeSBwcm9jZXNzZXMpLiBUaGlzIGlzIGhvdyB0aGUgTGlicmFyeSBWaWV3LCB3aGljaCBzaG93cyBhbGwgdGhlIGNvbnRlbnQgaW4gdGhlIGxpYnJhcnkgaXMgb3JnYW5pemVkLiA8L3A+Ci08cD5BIGNvbmZpZ3VyYXRpb24gaXMgYSBzdWJzZXQgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQuIFRoZSBDb25maWd1cmF0aW9uIFZpZXcgc2hvd3MgdGhlIGNvbnRlbnQgaW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBjb25maWd1cmF0aW9uLiBPbmNlIGEgY29uZmlndXJhdGlvbiBpcyBzZWxlY3RlZCwgdGhlIGNvbmZpZ3VyYXRpb24gdmlldyBpcyByZWZyZXNoZWQgd2l0aCB0aGUgY29udGVudCBmcm9tIHRoZSBjb25maWd1cmF0aW9uLiBUaGUgY29udGVudCBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3IGlzIGFsd2F5cyBsYWlkIG91dCB1c2luZyB0aGUgc2FtZSBzZXQgb2YgZm9sZGVycyByZWdhcmRsZXNzIG9mIHdoaWNoIGNvbmZpZ3VyYXRpb24gaXMgc2VsZWN0ZWQuIDwvcD4KLTxwPkVQRiBDb21wb3NlciBoYXMgdHdvIJFwZXJzcGVjdGl2ZXMnLiBUaGUgQXV0aG9yaW5nIFBlcnNwZWN0aXZlIHByb3ZpZGVzIGZ1bGwgYnJvd3NpbmcgYW5kIGF1dGhvcmluZyBjYXBhYmlsaXRpZXMuIFRoZSBCcm93c2luZyBQZXJzcGVjdGl2ZSBhbGxvd3MgYnJvd3NpbmcgY29udGVudCBpbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24uIDwvcD4KLTxwPkNvbnRlbnQgaXMgY3JlYXRlZCBhbmQgbWFpbnRhaW5lZCB1c2luZyBhIHNlcmllcyBvZiA8c3Ryb25nPjxlbT5lZGl0b3JzLiA8L2VtPjwvc3Ryb25nPjwvcD4KLTxoMj4mbmJzcDs8L2gyPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8xLmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkNDFjODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8xLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+RXhlcmNpc2UgMTogQ3JlYXRlIG9yIE1vZGlmeSBhIE1ldGhvZCBDb250ZW50IFBhY2thZ2UgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIHRhc2sgaXMgdG8gY3JlYXRlIGEgbmV3IDxzdHJvbmc+Q29udGVudCBQYWNrYWdlIDwvc3Ryb25nPiB3aXRoaW4gYSA8c3Ryb25nPk1ldGhvZCBQbHVnLWluPC9zdHJvbmc+LiA8L3A+Ci08cD5UbyBjcmVhdGUgYSBuZXcgTWV0aG9kIFBsdWctaW46IDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPiBNYWtlIHN1cmUgeW91IGFyZSBpbiB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5DbGljayA8c3Ryb25nPkZpbGUgJmd0OyBOZXcgJmd0OyBNZXRob2QgUGx1Zy1pbjwvc3Ryb25nPi4gCi0gICAgPHA+T3IgPC9wPgotICAgIDxwPlJpZ2h0LWNsaWNrIGFuIGV4aXN0aW5nIFBsdWctaW4gYW5kIHNlbGVjdCA8c3Ryb25nPk5ldyBNZXRob2QgUGx1Zy1pbjwvc3Ryb25nPi4gPGJyPgotICBUaGUgTmV3IE1ldGhvZCBQbHVnLWluIHdpemFyZCBpcyBsYXVuY2hlZC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+SW4gdGhlIE5ldyBNZXRob2QgUGx1Zy1pbiB3aXphcmQsIHByb3ZpZGUgYSBuYW1lIGZvciB0aGUgbmV3IHBsdWctaW4uIEluIHRoaXMgaW5zdGFuY2UsIHdlJ2xsIGNhbGwgaXQgTXkgUGx1Z2luLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5TZWxlY3QgPHN0cm9uZz5SVVAgPC9zdHJvbmc+IGluIHRoZSBSZWZlcmVuY2VkIFBsdWctaW5zIHBhbmVsLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPkZpbmlzaDwvc3Ryb25nPi4gVGhpcyBtZWFucyB0aGF0IHlvdXIgcGx1Zy1pbiB3aWxsIGV4dGVuZCB0aGUgUlVQIHBsdWctaW4gYW5kIHlvdSB3aWxsIGJlIGFibGUgdG8gc2VsZWN0IGNvbnRlbnQgZnJvbSB0aGUgUlVQIHBsdWctaW4gYXMgeW91IGNyZWF0ZSB5b3VyIG93biBwbHVnLWluIGNvbnRlbnQuIDxicj4KLSAgICAgIDxzcGFuIGNsYXNzPSJzdHlsZTEiPk15IFBsdWdpbjwvc3Bhbj4gbm93IGFwcGVhcnMgaW4gdGhlIExpYnJhcnkgVmlldyBvbiB0aGUgbGVmdCBzaWRlIG9mIHlvdXIgc2NyZWVuLiBJdCBpcyBub3QgZ3JheWVkIG91dCBpbmRpY2F0aW5nIHRoYXQgaXQgaXMgbm90IGxvY2tlZCBhbmQgdGhhdCB5b3UgY2FuIGVkaXQgaXQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPkRvdWJsZSBjbGljayBvbiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5NeSBQbHVnaW48L3NwYW4+IHRvIG9wZW4gdGhlIFBsdWdpbiBlZGl0b3IuIEFib3V0IGhhbGZ3YXkgZG93biB0aGUgcGFnZSB5b3Ugd2lsbCBzZWUgdGhlIJFMb2NrIFBsdWdpbicgY2hlY2tib3guIFRoaXMgd2lsbCBiZSB1bmNoZWNrZWQgZm9yIHlvdXIgbmV3IHBsdWdpbi4gSWYgeW91IG9wZW4gdGhlIHBsdWdpbiBlZGl0b3IgZm9yIHRoZSBSVVAgcGx1Z2luIHRoaXMgZmllbGQgd2lsbCBiZSBjaGVja2VkLiA8L2xpPgotPC9vbD4KLTxwPlRvIGNyZWF0ZSBhIE1ldGhvZCBQYWNrYWdlOiA8L3A+Ci08b2wgc3RhcnQ9IjYiPgotICA8bGk+Ci0gICAgPHA+SW4gdGhlIExpYnJhcnkgVmlldywgY2xpY2sgPHN0cm9uZz5NeSBQbHVnaW4gJmd0OyBNZXRob2QgQ29udGVudCAmZ3Q7IENvbnRlbnQgUGFja2FnZXM8L3N0cm9uZz4uICA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5SaWdodC1jbGljayA8c3Ryb25nPkNvbnRlbnQgUGFja2FnZXM8L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBIaWdobGlnaHQgPHN0cm9uZz5OZXc8L3N0cm9uZz4gYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5Db250ZW50IFBhY2thZ2U8L3N0cm9uZz4gdG8gY3JlYXRlIGEgbmV3IENvbnRlbnQgUGFja2FnZS4gPGJyPgotICAgICAgVGhlIENvbnRlbnQgUGFja2FnZSBlZGl0b3IgaXMgZGlzcGxheWVkIGFuZCB5b3UgY2FuIG5hbWUgdGhlIHBhY2thZ2UgYW5kIHByb3ZpZGUgYSBCcmllZiBEZXNjcmlwdGlvbi4gV2UnbGwgY2FsbCBpdCCTTXkgQ29udGVudCBQYWNrYWdllC4gPGJyPgotICAgICAgPHN0cm9uZz5Ob3RlOiA8L3N0cm9uZz4gWW91IGNhbm5vdCBjcmVhdGUgYSBuZXcgQ29udGVudCBQYWNrYWdlIG9yIGFueSBvdGhlciBlbGVtZW50IGluIGEgbG9ja2VkIHBsdWdpbi4gPC9wPgotICA8L2xpPgotICA8bGk+U2F2ZSB5b3VyIG5ldyBjb250ZW50LiA8L2xpPgotPC9vbD4KLTxwPjxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+IFdoZW4geW91IGNyZWF0ZSBhIG5ldyBlbGVtZW50IG9yIG1vZGlmeSBhbiBleGlzdGluZyBlbGVtZW50LCBhIJEqJyBhcHBlYXJzIGluIHRoZSB0YWIgbmV4dCB0byB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCwgaW5kaWNhdGluZyB0aGF0IHRoZSBlbGVtZW50IG5lZWRzIHRvIGJlIHNhdmVkLiBBbiBlbGVtZW50IGNhbiBiZSBzYXZlZCBieSBjbG9zaW5nIHRoZSBlZGl0b3IsIGNsaWNraW5nIHRoZSBkaXNrIGljb24gaW4gdGhlIHRvb2xiYXIsIG9yIGNsaWNraW5nIDxzdHJvbmc+RmlsZSAmZ3Q7IFNhdmUgPC9zdHJvbmc+LiA8L3A+Ci08cD48c3Ryb25nPk5vdGU6IDwvc3Ryb25nPiBFUEYgQ29tcG9zZXIgYXV0b21hdGljYWxseSBjcmVhdGVzIG5vZGVzIGZvciB0YXNrcywgcm9sZXMsIHdvcmsgcHJvZHVjdHMgYW5kIGd1aWRhbmNlIHVuZGVyIHRoZSBuZXcgY29udGVudCBwYWNrYWdlLiA8L3A+Ci08aDE+Jm5ic3A7PC9oMT4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzIuaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8yLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTlmNDU1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT5FeGVyY2lzZSAyOiBDcmVhdGUgV29yayBQcm9kdWN0PC9hPnMgPC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gY3JlYXRlIG5ldyBtZXRob2QgY29udGVudC4gU3BlY2lmaWNhbGx5LCA8c3Ryb25nPldvcmsgUHJvZHVjdHMgPC9zdHJvbmc+b2YgdHlwZSA8c3Ryb25nPiBBcnRpZmFjdCA8L3N0cm9uZz4uIFlvdSBjYW4gY3JlYXRlIGFueSBjb250ZW50IGJ1dCBzb21lIGV4YW1wbGVzIGFyZSBwcm92aWRlZCBpZiB5b3Ugd2FudCB0byB1c2UgdGhlbS4gVGhlc2UgZXhhbXBsZXMgYXJlIHJlZmVycmVkIHRvIGluIG90aGVyIHR1dG9yaWFscy4gPC9wPgotPHA+TWV0aG9kIGFuZCBQcm9jZXNzIGVsZW1lbnRzIGhhdmUgdHdvIG5hbWVzIGluIEVQRiBDb21wb3NlcjogTmFtZSBhbmQgUHJlc2VudGF0aW9uIE5hbWUuIDwvcD4KLTxwPlRoZSBOYW1lIGZpZWxkIGlzIHVzZWQgYXMgdGhlIGZpbGUgbmFtZSBmb3IgdGhlIGl0ZW0uIEluIFJVUCwgd2UgYXJlIGNhcmVmdWwgaG93IHdlIG5hbWUgdGhlIGZpbGVzIGFuZCB1c2UgY29udmVudGlvbnMgc3VjaCBhcyBsb3dlciBjYXNlLCBubyBzcGFjZXMsIGFuZCBubyBzcGVjaWFsIGNoYXJhY3RlcnMuIFdlIGRvIHRoaXMgc28gdGhhdCB0aGUgbmFtZSBpcyBhIHZhbGlkIGZpbGUgbmFtZSBvbiBhbGwgb3BlcmF0aW5nIHN5c3RlbXMgYW5kIGZvciBpbnRlZ3JhdGlvbiB3aXRoIHNvdXJjZSBjb250cm9sIHNvZnR3YXJlIGluIHRoZSBmdXR1cmUuIFRoZSBOYW1lIGlzIHNob3duIGluIHRoZSBMaWJyYXJ5IFZpZXcuIDwvcD4KLTxwPlRoZSBQcmVzZW50YXRpb24gTmFtZSBpcyB0aGUgbmFtZSB0aGF0IGlzIHNob3duIG9uIHB1Ymxpc2hlZCBwYWdlcyBhbmQgaXQgaXMgYWxzbyBzaG93biBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3LiBUaGlzIG5hbWUgY2FuIGNvbnRhaW4gYW55IGNoYXJhY3RlcnMsIGJ1dCBieSBjb252ZW50aW9uIGluIFJVUCwgd2UgdXNlIHRoZSBzYW1lIHRleHQgYXMgdGhlIE5hbWUsIGp1c3QgcHJldHRpZXIuIDwvcD4KLTxwPkluIHRoZSBMaWJyYXJ5IHZpZXcgeW91IGNhbiBjaG9vc2UgdG8gZGlzcGxheSBOYW1lcyBvciBQcmVzZW50YXRpb24gTmFtZXMuIFlvdSBjYW4gc3dpdGNoIHRoZSBuYW1lIGRpc3BsYXkgdXNpbmcgdGhlIJFTaG93IFByZXNlbnRhdGlvbiBOYW1lcycgYnV0dG9uIGluIHRoZSBMaWJyYXJ5IHZpZXcgdG9vbGJhci4gPC9wPgotPHA+SW4gZ2VuZXJhbCwgeW91IGNyZWF0ZSBuZXcgZWxlbWVudHMgYnkgcmlnaHQtY2xpY2tpbmcgdGhlIGZvbGRlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgbmV3IGVsZW1lbnQuIEZvciBleGFtcGxlLCB0byBjcmVhdGUgYSBuZXcgcm9sZSBpbiBhIGNvbnRlbnQgcGFja2FnZSwgcmlnaHQtY2xpY2sgdGhlIDxzdHJvbmc+Um9sZXMgPC9zdHJvbmc+IGZvbGRlciwgaGlnaGxpZ2h0IDxzdHJvbmc+TmV3IDwvc3Ryb25nPiBhbmQgdGhlbiBjbGljayA8c3Ryb25nPlJvbGU8L3N0cm9uZz4uIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPk1ha2Ugc3VyZSB5b3UgYXJlIGluIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBXaXRoaW4gPHNwYW4gY2xhc3M9InN0eWxlMSI+TXkgQ29udGVudCBQYWNrYWdlPC9zcGFuPiByaWdodC1jbGljayBvbiB0aGUgPHN0cm9uZz5Xb3JrIFByb2R1Y3RzPC9zdHJvbmc+IGZvbGRlci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEhpZ2hsaWdodCA8c3Ryb25nPk5ldzwvc3Ryb25nPiBhbmQgdGhlbiBjbGljayA8c3Ryb25nPkFydGlmYWN0PC9zdHJvbmc+LiBUaGUgYXJ0aWZhY3QgZWRpdG9yIGlzIGRpc3BsYXllZC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEluIHRoZSBOYW1lIGZpZWxkLCB0eXBlIHRoZSBuZXcgQXJ0aWZhY3QgbmFtZS4gSW4gdGhpcyBpbnN0YW5jZSwgd2UnbGwgY2FsbCBpdCA8c3Ryb25nPm15X3J1cF9uYXZtYXA8L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPiBJbiB0aGUgPHN0cm9uZz5QcmVzZW50YXRpb24gTmFtZTwvc3Ryb25nPiBmaWVsZCwgdHlwZTogPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+TXkgUlVQIE5hdmlnYXRpb24gTWFwPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT5JbiB0aGUgPHN0cm9uZz5CcmllZiBEZXNjcmlwdGlvbjwvc3Ryb25nPiBmaWVsZCwgdHlwZToKLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwPlRoZSBOYXZpZ2F0aW9uIE1hcCBleHByZXNzZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgdXNlci1pbnRlcmZhY2UgZWxlbWVudHMgaW4gdGhlIHN5c3RlbSwgYWxvbmcgd2l0aCB0aGVpciBwb3RlbnRpYWwgbmF2aWdhdGlvbiBwYXRod2F5cy48L3A+Ci0gICAgPC9ibG9ja3F1b3RlPgotICA8L2xpPgotICA8bGk+IEluIHRoZSA8c3Ryb25nPlB1cnBvc2U8L3N0cm9uZz4gZmllbGQgdHlwZTogCi0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8cD5UaGVyZSBpcyBvbmUgTmF2aWdhdGlvbiBNYXAgcGVyIHN5c3RlbS4gVGhlIHB1cnBvc2Ugb2YgdGhlIE5hdmlnYXRpb24gTWFwIGlzIHRvIGV4cHJlc3MgdGhlIHByaW5jaXBhbCB1c2VyIGludGVyZmFjZSBwYXRocyB0aHJvdWdoIHRoZSBzeXN0ZW0uIFRoZXNlIGFyZSB0aGUgbWFpbiBwYXRod2F5cyB0aHJvdWdoIHRoZSBzY3JlZW5zIG9mIHRoZSBzeXN0ZW0gYW5kIG5vdCBuZWNlc3NhcmlseSBhbGwgb2YgdGhlIHBvc3NpYmxlIHBhdGhzLiBJdCBjYW4gYmUgdGhvdWdodCBvZiBhcyBhIHJvYWQgbWFwIG9mIHRoZSBzeXN0ZW0ncyB1c2VyIGludGVyZmFjZS4gVGhlIE5hdmlnYXRpb24gTWFwIG1ha2VzIGl0IGVhc3kgdG8gc2VlIGhvdyBtYW55ICZxdW90O2NsaWNrcyZxdW90OyBpdCB3aWxsIHRha2UgYSB1c2VyIHRvIGdldCB0byBhIHNwZWNpZmljIHNjcmVlbi4gPC9wPgotICAgIDwvYmxvY2txdW90ZT4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIHRoZSBwcmV2aWV3IHRhYiB0byB2aWV3IHRoZSBuZXcgQXJ0aWZhY3QuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTYXZlIHRoZSBBcnRpZmFjdC4gPC9wPgotICA8L2xpPgotICA8bGk+IFJlcGVhdCBzdGVwcyAyIHRocm91Z2ggOSB1c2luZyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOiAKLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPkFydGlmYWN0IE5hbWU8L3N0cm9uZz46IG15X3J1cF91c2VyX2ludGVyZmFjZV9wcm90b3R5cGUgPC9wPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+UHJlc2VudGF0aW9uIE5hbWU8L3N0cm9uZz46IE15IFJVUCBVSSBQcm90b3R5cGUgPC9wPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+QnJpZWYgRGVzY3JpcHRpb248L3N0cm9uZz46IEEgdXNlci1pbnRlcmZhY2UgcHJvdG90eXBlIGlzIGFuIGV4YW1wbGUgb2YgdGhlIHVzZXIgaW50ZXJmYWNlIHRoYXQgaXMgYnVpbHQgaW4gb3JkZXIgdG8gZXhwbG9yZSBhbmQvb3IgdmFsaWRhdGUgdGhlIHVzZXItaW50ZXJmYWNlIGRlc2lnbi4gPC9wPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+UHVycG9zZTogPC9zdHJvbmc+IFRoZSBmb2xsb3dpbmcgcm9sZXMgdXNlIHRoZSB1c2VyLWludGVyZmFjZSBwcm90b3R5cGU6IDwvcD4KLSAgICAgIDxibG9ja3F1b3RlPgotICAgICAgICA8cD4tIDxzdHJvbmc+dXNlci1pbnRlcmZhY2UgZGVzaWduZXJzPC9zdHJvbmc+ICwgdG8gZXhwbG9yZSBhbmQvb3IgdmFsaWRhdGUgdGhlIHVzZXItaW50ZXJmYWNlIGRlc2lnbiBiZWZvcmUgdG9vIG11Y2ggaXMgaW52ZXN0ZWQgaW4gaXQgPC9wPgotICAgICAgICA8cD4tIDxzdHJvbmc+cmVxdWlyZW1lbnRzIHNwZWNpZmllcnMgPC9zdHJvbmc+LCB0byB1bmRlcnN0YW5kIHRoZSB1c2VyIGludGVyZmFjZSBmb3IgYSBVc2UgQ2FzZSA8L3A+Ci0gICAgICAgIDxwPjxzdHJvbmc+LSBzeXN0ZW0gYW5hbHlzdHMgPC9zdHJvbmc+LCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgdXNlciBpbnRlcmZhY2UgaW1wYWN0cyB0aGUgYW5hbHlzaXMgb2YgdGhlIHN5c3RlbSA8L3A+Ci0gICAgICAgIDxwPi0gPHN0cm9uZz5kZXNpZ25lcnMgPC9zdHJvbmc+LCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgdXNlciBpbnRlcmZhY2UgaW1wYWN0cyBhbmQgd2hhdCBpdCByZXF1aXJlcyBmcm9tIHRoZSAmcXVvdDtpbnNpZGUmcXVvdDsgb2YgdGhlIHN5c3RlbSA8L3A+Ci0gICAgICAgIDxwPiAtIDxzdHJvbmc+bWFuYWdlcnMgPC9zdHJvbmc+LCB0byBwbGFuIGRldmVsb3BtZW50IGFuZCB0ZXN0aW5nIGFjdGl2aXRpZXMgPC9wPgotICAgICAgPC9ibG9ja3F1b3RlPgotICAgIDwvYmxvY2txdW90ZT4KLSAgPC9saT4KLTwvb2w+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8zLmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4ZDZlODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8zLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+RXhlcmNpc2UgMzogQ3JlYXRlIFJvbGVzIDwvYT48L2gyPgotPHA+VG8gY3JlYXRlIGEgUm9sZSBpbiBNeSBDb250ZW50IFBhY2thZ2U6IDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPiBNYWtlIHN1cmUgeW91IGFyZSBpbiB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5XaXRoaW4gTXkgQ29udGVudCBQYWNrYWdlIHJpZ2h0LWNsaWNrIG9uIHRoZSA8c3Ryb25nPlJvbGVzIDwvc3Ryb25nPiBmb2xkZXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkhpZ2hsaWdodCA8c3Ryb25nPk5ldyA8L3N0cm9uZz4gYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5Sb2xlPC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5JbiB0aGUgPHN0cm9uZz5OYW1lIGZpZWxkIDwvc3Ryb25nPiB0eXBlOiBteV9ydXBfdXNlcl9pbnRlcmZhY2VfZGVzaWduZXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkluIHRoZSA8c3Ryb25nPlByZXNlbnRhdGlvbiBOYW1lPC9zdHJvbmc+IGZpZWxkIHR5cGU6IE15IFVJIERlc2lnbmVyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5JbiB0aGUgPHN0cm9uZz5CcmllZiBEZXNjcmlwdGlvbiA8L3N0cm9uZz4gZmllbGQgdHlwZTogPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+VGhlIHVzZXItaW50ZXJmYWNlIGRlc2lnbmVyIGNvb3JkaW5hdGVzIHRoZSBkZXNpZ24gb2YgdGhlIHVzZXIgaW50ZXJmYWNlLiBVc2VyLWludGVyZmFjZSBkZXNpZ25lcnMgYXJlIGFsc28gaW52b2x2ZWQgaW4gZ2F0aGVyaW5nIHVzYWJpbGl0eSByZXF1aXJlbWVudHMgYW5kIHByb3RvdHlwaW5nIGNhbmRpZGF0ZSB1c2VyLWludGVyZmFjZSBkZXNpZ25zIHRvIG1lZXQgdGhvc2UgcmVxdWlyZW1lbnRzLiA8L3A+Ci0gICAgPHA+PHN0cm9uZz5UaXAgPC9zdHJvbmc+IC0gdGhlcmUgYXJlIGRpZmZlcmVudCB3YXlzIHRoYXQgeW91IGNhbiBjcmVhdGUgdGhlIHRleHQgYWJvdmUgZm9yIHRoZSBuZXcgcm9sZTogPC9wPgotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IERpcmVjdGx5LCBieSB0eXBpbmcgaXQgbWFudWFsbHkgaW4gdGhlIEVQRiBDb21wb3NlciBlZGl0b3IuIDwvcD4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyBCeSBjb3B5aW5nIGZyb20gYW5vdGhlciBzaW1pbGFyIHJvbGUgYW5kIHRoZW4gbW9kaWZ5IHVzaW5nIHRoZSBlZGl0b3JzIChlLmcuIHJ1cF91c2VyX2ludGVyZmFjZV9kZXNpZ25lcikuIDwvcD4KLSAgICAmIzE0OTsmbmJzcDtCeSBjb3B5aW5nIGZyb20gYW4gaHRtbCBzb3VyY2Ugc3VjaCBhcyB0aGUgdHV0b3JpYWwgeW91IGFyZSByZWFkaW5nLiA8L2Jsb2NrcXVvdGU+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPiAgICBUcnkgdGhlIDxzdHJvbmc+UmljaCBUZXh0IEVkaXRvciA8L3N0cm9uZz4gZm9yIGVkaXRpbmcgdGhlIDxzdHJvbmc+TWFpbiBEZXNjcmlwdGlvbi4gPC9zdHJvbmc+WW91IGNhbiBvcGVuIHRoZSBSaWNoIFRleHQgRWRpdG9yIGZvciBhbnkgaXRlbSB0aGF0IGhhcyBhIJF0d2lzdHknIDxpbWcgd2lkdGg9IjEzIiBoZWlnaHQ9IjEzIiBzcmM9InR1dG9yaWFsXzJfZXhfM19jbGlwX2ltYWdlMDAyLmdpZiI+c3ltYm9sIAotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IFRoZSB1c2VyLWludGVyZmFjZSBkZXNpZ25lciByb2xlIGlzIG5vdCByZXNwb25zaWJsZSBmb3IgaW1wbGVtZW50aW5nIHRoZSB1c2VyIGludGVyZmFjZS4gSW5zdGVhZCwgdGhpcyByb2xlIGZvY3VzZXMgb24gdGhlIGRlc2lnbiBhbmQgdGhlICZxdW90O3Zpc3VhbCBzaGFwaW5nJnF1b3Q7IG9mIHRoZSB1c2VyIGludGVyZmFjZSwgYnk6IDwvcD4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gIDwvbGk+Ci0gIDxvbD4KLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwPiAtIENhcHR1cmluZyByZXF1aXJlbWVudHMgb24gdGhlIHVzZXIgaW50ZXJmYWNlLCBpbmNsdWRpbmcgdXNhYmlsaXR5IHJlcXVpcmVtZW50cy4gPC9wPgotICAgICAgPHA+LSBCdWlsZGluZyB1c2VyLWludGVyZmFjZSBwcm90b3R5cGVzLjwvcD4KLSAgICAgIDxwPi0gSW52b2x2aW5nIG90aGVyIHN0YWtlaG9sZGVycyBvZiB0aGUgdXNlciBpbnRlcmZhY2UsIHN1Y2ggYXMgZW5kLXVzZXJzLCBpbiB1c2FiaWxpdHkgcmV2aWV3cyBhbmQgdXNlIHRlc3Rpbmcgc2Vzc2lvbnMuIDwvcD4KLSAgICAgIDxwPi0gUmV2aWV3aW5nIGFuZCBwcm92aWRpbmcgdGhlIGFwcHJvcHJpYXRlIGZlZWRiYWNrIG9uIHRoZSBmaW5hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdXNlciBpbnRlcmZhY2UsIGFzIGNyZWF0ZWQgYnkgb3RoZXIgZGV2ZWxvcGVyczsgdGhhdCBpcywgZGVzaWduZXJzIGFuZCBpbXBsZW1lbnRlcnMuIDwvcD4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gIDwvb2w+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPiCWIGlmIHlvdSBjb3B5IHRleHQgZnJvbSBhIE1pY3Jvc29mdCBXb3JkIGRvY3VtZW50IHlvdSB3aWxsIGdldCBhIGxvdCBvZiBmb3JtYXR0aW5nIGluZm9ybWF0aW9uIHRoYXQgaXMgbm90IG5lZWRlZCBpbiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyLiBZb3UgY2FuIHNlZSB0aGlzIGlmIHlvdSBvcGVuIHRoZSBIVE1MIGVkaXRvciBpbiB0aGUgUmljaCBUZXh0IEVkaXRvci4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD5DbGljayB0aGUgPHN0cm9uZz5Xb3JrUHJvZHVjdHMgPC9zdHJvbmc+IHRhYjsgbWFrZSB0aGlzIG5ldyByb2xlIHJlc3BvbnNpYmxlIGZvciB0aGUgbXlfcnVwX25hdm1hcCBhbmQgbXlfcnVwX3VzZXJfaW50ZXJmYWNlX3Byb3RvdHlwZSBhcnRpZmFjdHMgdGhhdCB5b3UgcHJldmlvdXNseSBjcmVhdGVkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbGljayB0aGUgPHN0cm9uZz5BZGQgPC9zdHJvbmc+IGJ1dHRvbi4gVGhpcyBkaXNwbGF5cyBhIHNlbGVjdGlvbiBkaWFsb2cgd2hlcmUgeW91IGNhbiBzZWxlY3QgdGhlIFdvcmsgUHJvZHVjdHMgdG8gYWRkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5PbmNlIHlvdSBoYXZlIHNlbGVjdGVkIHRoZSBhcHByb3ByaWF0ZSBXb3JrIFByb2R1Y3RzLCBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUaGUgd29yayBwcm9kdWN0cyB5b3Ugc2VsZWN0ZWQgYXBwZWFyIGluIHRoZSA8c3Ryb25nPlJlc3BvbnNpYmxlIGZvcjogPC9zdHJvbmc+IHBhbmVsLiAKLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwPk5vdGUgdGhhdCBzZWxlY3RlZCBlbGVtZW50cyBpbiBhbiBBZGQvUmVtb3ZlIHNlY3Rpb24gZGlzcGxheSBib3RoIHRoZSBlbGVtZW50IG5hbWUgYW5kIHRoZSCRcGF0aCcgdG8gdGhhdCBlbGVtZW50IJYgdGhlIFBsdWdpbiBuYW1lIGFuZCBwYWNrYWdlIG5hbWUuIDwvcD4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gIDwvbGk+Ci0gIDxsaT5DbGljayB0aGUgPHN0cm9uZz5QcmV2aWV3IDwvc3Ryb25nPiB0YWIgdG8gdmlldyB0aGUgbmV3bHkgY3JlYXRlZCByb2xlIGFuZCB0aGVuIHNhdmUgYnkgY2xvc2luZyB0aGUgZWRpdG9yLiA8L2xpPgotPC9vbD4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzNfY2xpcF9pbWFnZTAwMi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzNfY2xpcF9pbWFnZTAwMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJiMmZjODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8zX2NsaXBfaW1hZ2UwMDIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF80Lmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1ZjkyMWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF80Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+PC9hPjxhPkV4ZXJjaXNlIDQ6IENyZWF0ZSBUYXNrcyA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gY3JlYXRlIGEgdGFzayBhbmQgdGhlbiByZWxhdGUgdGhhdCB0YXNrIHRvIHRoZSBvdGhlciBlbGVtZW50cyB5b3UgaGF2ZSBjcmVhdGVkLiA8L3A+Ci08cD5UbyBjcmVhdGUgYSBUYXNrIGluIE15IENvbnRlbnQgUGFja2FnZTogPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+TWFrZSBzdXJlIHlvdSBhcmUgaW4gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFdpdGhpbiBNeSBDb250ZW50IFBhY2thZ2UgcmlnaHQtY2xpY2sgb24gdGhlIDxzdHJvbmc+VGFza3MgPC9zdHJvbmc+IGZvbGRlci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEhpZ2hsaWdodCA8c3Ryb25nPk5ldyA8L3N0cm9uZz4gYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5UYXNrPC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5Vc2UgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiB0byBjcmVhdGUgdGhlIHRhc2s6ICA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5UYXNrOiA8L3N0cm9uZz4gbXlfZGVzaWduX3VzZXJfaW50ZXJmYWNlIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5QcmVzZW50YXRpb24gTmFtZSA8L3N0cm9uZz46IE15IERlc2lnbiBVc2VyIEludGVyZmFjZSA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+QnJpZWYgRGVzY3JpcHRpb246IDwvc3Ryb25nPiBUbyBwcm9kdWNlIGEgZGVzaWduIG9mIHRoZSB1c2VyIGludGVyZmFjZSB0aGF0IHN1cHBvcnRzIHRoZSByZWFzb25pbmcgYWJvdXQsIGFuZCB0aGUgZW5oYW5jZW1lbnQgb2YsIGl0cyB1c2FiaWxpdHkuIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5TdGVwcyA8L3N0cm9uZz4oVXNlIHN0ZXBzIHRhYik6PC9wPgotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHA+LSBEZXNjcmliZSB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHJlbGF0ZWQgdXNlcnMgPC9wPgotICAgIC0gSWRlbnRpZnkgdGhlIHByaW1hcnkgdXNlciBpbnRlcmZhY2UgZWxlbWVudHMgPC9ibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPlJvbGVzIChQcmltYXJ5IFBlcmZvcm1lcik6IDwvc3Ryb25nPm15X3J1cF91c2VyX2ludGVyZmFjZV9kZXNpZ25lciA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+V29yayBQcm9kdWN0cyAoTWFuZGF0b3J5IElucHV0KSA8L3N0cm9uZz4gcnVwX3NvZnR3YXJlX3JlcXVpcmVtZW50ICh1bmRlciByZXF1aXJlbWVudHMpIDxzdHJvbmc+PC9zdHJvbmc+PC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPldvcmsgUHJvZHVjdHMgPC9zdHJvbmc+IChPdXRwdXRzKTogbXlfcnVwX25hdm1hcCA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+R3VpZGFuY2U6IDwvc3Ryb25nPnJlcHJlc2VudGluZ19ncmFwaGljYWxfdXNlci1pbnRlcmZhY2VzICh1bmRlciBndWlfZGVzaWduKSA8c3Ryb25nPjwvc3Ryb25nPjwvcD4KLSAgJiMxNDk7Jm5ic3A7IDxzdHJvbmc+Q2F0ZWdvcmllczogPC9zdHJvbmc+cnVwX2FuYWx5c2lzX2Rlc2lnbl9kaXNjaXBsaW5lIDxzdHJvbmc+PC9zdHJvbmc+PC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgdGhlIDxzdHJvbmc+UHJldmlldyA8L3N0cm9uZz4gdGFiIHRvIHZpZXcgdGhlIG5ld2x5IGNyZWF0ZWQgdGFzayBhbmQgc2F2ZSBieSBjbG9zaW5nIHRoZSBlZGl0b3IuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBDcmVhdGUgYW5vdGhlciB0YXNrIHVzaW5nIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246Ci0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5UYXNrOiA8L3N0cm9uZz4gbXlfcHJvdG90eXBlX3VzZXJfaW50ZXJmYWNlIDwvcD4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPlByZXNlbnRhdGlvbiBuYW1lIDwvc3Ryb25nPjogTXkgUHJvdG90eXBlIFVzZXIgSW50ZXJmYWNlIDwvcD4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uOiA8L3N0cm9uZz4gVG8gcHJvdG90eXBlIHRoZSBzeXN0ZW0ncyB1c2VyIGludGVyZmFjZSBpbiBhbiBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoZSB1c2VyLWludGVyZmFjZSBkZXNpZ24gYWdhaW5zdCB0aGUgZnVuY3Rpb25hbCBhbmQgdXNhYmlsaXR5IHJlcXVpcmVtZW50cy4gPC9wPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+U3RlcHM6IDwvc3Ryb25nPjwvcD4KLSAgICAgIDxibG9ja3F1b3RlPgotICAgICAgICA8cD4tJm5ic3A7IERlc2lnbiB0aGUgdXNlciBpbnRlcmZhY2UgcHJvdG90eXBlIDwvcD4KLSAgICAgICAgPHA+LSZuYnNwOyBJbXBsZW1lbnQgdGhlIHVzZXIgaW50ZXJmYWNlIHByb3RvdHlwZSA8L3A+Ci0gICAgICA8L2Jsb2NrcXVvdGU+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5Sb2xlcyAoUHJpbWFyeSBQZXJmb3JtZXIpOiA8L3N0cm9uZz5teV9ydXBfdXNlcl9pbnRlcmZhY2VfZGVzaWduZXIgPC9wPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+V29yayBQcm9kdWN0cyAoTWFuZGF0b3J5IElucHV0KSA8L3N0cm9uZz4gbXlfcnVwX25hdm1hcCA8L3A+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5Xb3JrIFByb2R1Y3RzIChPdXRwdXRzKTogPC9zdHJvbmc+bXlfcnVwX3VzZXJfaW50ZXJmYWNlX3Byb3RvdHlwZSA8L3A+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5DYXRlZ29yaWVzOiA8L3N0cm9uZz5ydXBfYW5hbHlzaXNfZGVzaWduX2Rpc2NpcGxpbmUgPC9wPgotICAgIDwvYmxvY2txdW90ZT4KLSAgPC9saT4KLSAgPC9vbD4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzUuaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF81Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGNhZGVhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT48L2E+PGE+RXhlcmNpc2UgNTogV29ya2luZyB3aXRoIFN0ZXBzIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byB1bmRlcnN0YW5kIHRoZSBTdGVwIEVkaXRvciB0aGF0IGlzIHBhcnQgb2YgdGhlIFRhc2sgRWRpdG9yLiA8L3A+Ci08cD5XaGVuIHlvdSBjcmVhdGUgYSB0YXNrLCB5b3UgY2FuIGRlZmluZSBhIHNlcmllcyBvZiBzdGVwcyB0aGF0IGRldGFpbCBob3cgdG8gcGVyZm9ybSB0aGUgdGFzay4gVGhlIFN0ZXAgRWRpdG9yIGFsbG93cyB5b3UgdG8gYWRkIG5ldyBzdGVwcywgY2hhbmdlIHRoZSBzZXF1ZW5jZSBvZiBzdGVwcyBhbmQgdG8gZGVsZXRlIHN0ZXBzLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5PcGVuIHRoZSBteV9kZXNpZ25fdXNlcl9pbnRlcmZhY2UgdGFzayBvciBjcmVhdGUgYSBuZXcgdGFzay4gQ2xpY2sgb24gdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gdGFiLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5DcmVhdGUgYSBuZXcgc3RlcDogIDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyBFbnRlciBhIG5hbWUgZm9yIHRoZSBzdGVwIGluIHRoZSCRU3RlcHMnIGJveC4gPC9wPgotICAgIDxwPiYjMTQ5OyBFbnRlciBhIDxzdHJvbmc+RGVzY3JpcHRpb24gPC9zdHJvbmc+IJYgeW91IGNhbiB1c2UgdGhlIFJpY2ggVGV4dCBFZGl0b3IgZm9yIHRoaXMuIDwvcD4KLSAgICA8cD4mIzE0OTsgQ2xpY2sgdGhlIDxzdHJvbmc+QWRkIDwvc3Ryb25nPiBidXR0b24uIDwvcD4KLSAgICA8cD4mIzE0OTsgU2VlIHRoZSByZXN1bHRzIG9uIHRoZSA8c3Ryb25nPlByZXZpZXcgPC9zdHJvbmc+IHRhYi4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4gICAgUmVtb3ZlIGEgc3RlcCA6IDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyBSZXR1cm4gdG8gdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gdGFiLiA8L3A+Ci0gICAgPHA+JiMxNDk7IENsaWNrIHRoZSBzdGVwIHRvIHJlbW92ZSBpbiB0aGUgU3RlcHMgcGFuZWwuIDwvcD4KLSAgICA8cD4mIzE0OTsgQ2xpY2sgdGhlIDxzdHJvbmc+RGVsZXRlIDwvc3Ryb25nPiBidXR0b24uIDwvcD4KLSAgICA8cD4mIzE0OTsgU2VlIHRoZSByZXN1bHRzIG9uIHRoZSA8c3Ryb25nPlByZXZpZXcgPC9zdHJvbmc+IHRhYi4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4gICAgTW92ZSBhIHN0ZXAgdXAgdGhlIGxpc3Q6IDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBSZXR1cm4gdG8gdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gdGFiLiA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IENsaWNrIHRoZSBzdGVwIHlvdSB3YW50IHRvIG1vdmUgdXAuPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBDbGljayB0aGUgPHN0cm9uZz5VcCA8L3N0cm9uZz4gYnV0dG9uLjwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgU2VlIHRoZSByZXN1bHRzIG9uIHRoZSA8c3Ryb25nPlByZXZpZXcgPC9zdHJvbmc+IHRhYi4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT5Nb3ZlIGEgc3RlcCBkb3duIHRoZSBsaXN0IDogIDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBSZXR1cm4gdG8gdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gdGFiLiA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IENsaWNrIHRoZSBzdGVwIHlvdSB3YW50IHRvIG1vdmUgZG93bi48L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IENsaWNrIHRoZSA8c3Ryb25nPkRvd24gPC9zdHJvbmc+IGJ1dHRvbi48L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IFNlZSB0aGUgcmVzdWx0cyBvbiB0aGUgPHN0cm9uZz5QcmV2aWV3IDwvc3Ryb25nPiB0YWIuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotPC9vbD4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzYuaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF82Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDkxMmRmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT48L2E+PGE+RXhlcmNpc2UgNjogQ3JlYXRlIEd1aWRhbmNlIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBjcmVhdGUgbWV0aG9kIDxzdHJvbmc+R3VpZGFuY2UgPC9zdHJvbmc+IGVsZW1lbnRzLiBUaGVyZSBpcyBhIHJhbmdlIG9mIGRpZmZlcmVudCB0eXBlcyBvZiBndWlkYW5jZSB0aGF0IGNhbiBiZSBjcmVhdGVkLiBGb3IgdGhpcyB0YXNrIHdlIHdpbGwgc2ltcGx5IGNyZWF0ZSBhIHJlcHJlc2VudGF0aXZlIGd1aWRhbmNlIGVsZW1lbnQsIGEgY2hlY2tsaXN0LiBPbmNlIHlvdSBoYXZlIGRvbmUgdGhpcywgdHJ5IGF1dGhvcmluZyBhZGRpdGlvbmFsIEd1aWRhbmNlIHR5cGVzLiA8L3A+Ci08cD5JbiBhIGNoZWNrbGlzdCwgQ2hlY2sgSXRlbXMgYXJlIGNyZWF0ZWQgaW4gdGhlIHNhbWUgd2F5IGFzIFN0ZXBzIGluIGEgdGFzayBhcmUgY3JlYXRlZCB1c2luZyB0aGUgPHN0cm9uZz5DaGVjayBJdGVtcyA8L3N0cm9uZz4gdGFiIGluIHRoZSA8c3Ryb25nPkNoZWNrbGlzdCBFZGl0b3I8L3N0cm9uZz4uIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPk1ha2Ugc3VyZSB5b3UgYXJlIGluIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPldpdGhpbiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5NeSBDb250ZW50IFBhY2thZ2U8L3NwYW4+IHJpZ2h0LWNsaWNrIG9uIHRoZSA8c3Ryb25nPkd1aWRhbmNlIDwvc3Ryb25nPiBmb2xkZXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkhpZ2hsaWdodCA8c3Ryb25nPk5ldyA8L3N0cm9uZz4gYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5DaGVja2xpc3Q8L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPk5hbWUgdGhlIGd1aWRhbmNlLCBteV9jcmVhdGVfcGh5c2ljYWxfYXBwZWFyYW5jZV9jaGVja2xpc3QsIGFuZCBwcm92aWRlIHRoZSBwcmVzZW50YXRpb24gbmFtZSwgTXkgQ3JlYXRlIFBoeXNpY2FsIEFwcGVhcmFuY2UgQ2hlY2tsaXN0LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQWRkIHRoZSBmb2xsb3dpbmcgY2hlY2sgaXRlbXM6IDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBDcmVhdGUgYnJhbmRpbmcgc3BlY2lmaWNhdGlvbnMgPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBEZWZpbmUgcGh5c2ljYWwgc3BlY2lmaWNhdGlvbnMgPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT5BZGQgdGhlIGNoZWNrbGlzdCB0byB0aGUgPHN0cm9uZz4gbXlfcHJvdG90eXBlX3VzZXJfaW50ZXJmYWNlIDwvc3Ryb25nPnRhc2sgYW5kIHRoZW4gbG9vayBmb3IgaXQgb24gdGhlIHByZXZpZXcgcGFnZS4gPC9saT4KLTwvb2w+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF83Lmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfNy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5ZDQ2MGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF83Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+PC9hPjxhPjwvYT48YT5FeGVyY2lzZSA3OiBNYW5hZ2UgR3VpZGFuY2UgPC9hPjwvaDI+Ci08cD5HdWlkYW5jZSBjYW4gYmUgYXR0YWNoZWQgdG8gYW55IENvcmUgTWV0aG9kIENvbnRlbnQgb3IgUHJvY2VzcyBFbGVtZW50LiBHdWlkYW5jZSBjYW4gZXZlbiBiZSBhdHRhY2hlZCB0byBhIEd1aWRhbmNlIGVsZW1lbnQuIDwvcD4KLTxwPlRoZSBnb2FsIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gY2Fycnkgb3V0IHNvbWUgc2ltcGxlIGd1aWRhbmNlIG1hbmFnZW1lbnQgdGFza3MgKGkuZS4sIGFkZGluZyBhbmQgcmVtb3ZpbmcgZ3VpZGFuY2UuKTwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPk5hdmlnYXRlIHRvIHRoZSBhcnRpZmFjdCA8c3Ryb25nPm15X3J1cF9uYXZtYXAgPC9zdHJvbmc+IHRoYXQgeW91IGNyZWF0ZWQgaW4gZXhlcmNpc2UgMiBpbiB0aGlzIHR1dG9yaWFsLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQWRkIHRoZSBDb25jZXB0IFBhcGVyIDxzdHJvbmc+cHJvY2Vzc192aWV3IDwvc3Ryb25nPiBmcm9tIHRoZSBSVVAgcGx1Zy1pbi4gPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+VGhlIGxpc3Qgb2YgaXRlbXMgaW4gdGhlIFNlbGVjdCBEaWFsb2cgaXMgcmVzdHJpY3RlZCB0byBqdXN0IHRob3NlIGl0ZW1zIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgYWRkZWQuIFRoZSBsaXN0IGNhbiBiZSBsb25nIHRob3VnaC4gWW91IGNhbiBlbnRlciBhIHNlYXJjaCBzdHJpbmcsIHN1Y2ggYXMgkXBybycgaW4gdGhlIJFOYW1lIHBhdHRlcm5zJyBib3ggdG8gZmlsdGVyIHRoZSBpdGVtcyB0aGF0IGFyZSBkaXNwbGF5ZWQuIE5vdGUgdGhhdCB5b3UgY2FuIHVzZSB0aGUgQ29sbGFwc2UgQWxsIGFuZCBFeHBhbmQgQWxsIGJ1dHRvbnMgb24gdGhpcyBkaWFsb2cgdG8gY2hhbmdlIHRoZSB3YXkgdGhlIHRyZWUgaXMgZGlzcGxheWVkLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPgotICAgIDxwPkFkZCA8c3Ryb25nPm15X2NyZWF0ZV9waHlzaWNhbF9hcHBlYXJhbmNlX2NoZWNrbGlzdCA8L3N0cm9uZz4gQ2hlY2tsaXN0LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbGljayB0aGUgPHN0cm9uZz5QcmV2aWV3IDwvc3Ryb25nPiB0YWIgdG8gdmlldyB5b3VyIHdvcmsuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlJlbW92ZSB0aGUgQ29uY2VwdCBQYXBlciBwcm9jZXNzX3ZpZXcuIDwvcD4KLSAgPC9saT4KLSAgPGxpPkNsaWNrIHRoZSA8c3Ryb25nPlByZXZpZXcgPC9zdHJvbmc+IHRhYiB0byB2aWV3IHlvdXIgd29yay4gPC9saT4KLTwvb2w+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF84Lmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfOC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNkMjM2OTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF84Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+PC9hPjxhPjwvYT48YT48L2E+PGE+PC9hPjxhPkV4ZXJjaXNlIDg6IENyZWF0ZSBOZXcgU3RhbmRhcmQgQ2F0ZWdvcnkgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIHVuZGVyc3RhbmQgYW5kIHVzZSA8c3Ryb25nPlN0YW5kYXJkIENhdGVnb3JpZXMuIDwvc3Ryb25nPkluIHByYWN0aWNlLCB0aGlzIHdpbGwgbm90IGJlIGRvbmUgdmVyeSBvZnRlbiwgYXMgU3RhbmRhcmQgQ2F0ZWdvcmllcyB0ZW5kIHRvIGJlIHJlbGF0aXZlbHkgc3RhYmxlLiBBbHNvLCBpZiB5b3UgYXJlIGNyZWF0aW5nIGEgcGx1Zy1pbiB0aGF0IGV4dGVuZHMgUlVQLCB5b3Ugc2hvdWxkIGF0dGVtcHQgdG8gdXNlIHRoZSBSVVAgU3RhbmRhcmQgQ2F0ZWdvcmllcyBiZWZvcmUgY3JlYXRpbmcgbmV3IG9uZXMuIDwvcD4KLTxwPjxzdHJvbmc+U3RhbmRhcmQgQ2F0ZWdvcmllcyA8L3N0cm9uZz4gcHJvdmlkZSBhIG1lYW5zIHRvIGNhdGVnb3JpemUgY29yZSBtZXRob2QgY29udGVudCBpbiBsaW5lIHdpdGggYmVzdCBwcmFjdGljZXMgZm9yIGNyZWF0aW5nIHN0cnVjdHVyZWQgbWV0aG9kcy4gSW4gb3JkZXIgdG8gZW5jb3VyYWdlIGdvb2QgbWV0aG9kIHN0cnVjdHVyZSB3ZSBwcm92aWRlIHN0YW5kYXJkIGNhdGVnb3JpZXMgZm9yIGdyb3VwaW5nIDxzdHJvbmc+VGFza3MgPC9zdHJvbmc+aW50byA8c3Ryb25nPjxlbT5EaXNjaXBsaW5lcyA8L2VtPjwvc3Ryb25nPiwgPHN0cm9uZz5Xb3JrIFByb2R1Y3RzIDwvc3Ryb25nPiBpbnRvIDxzdHJvbmc+PGVtPkRvbWFpbnMgPC9lbT48L3N0cm9uZz4sIDxzdHJvbmc+Um9sZXMgPC9zdHJvbmc+IGludG8gPHN0cm9uZz48ZW0+Um9sZSBTZXRzIDwvZW0+PC9zdHJvbmc+LCBhbmQgPHN0cm9uZz5Ub29sLU1lbnRvcnMgPC9zdHJvbmc+IGludG8gPHN0cm9uZz48ZW0+VG9vbHMgPC9lbT48L3N0cm9uZz4uIFVubGlrZSA8c3Ryb25nPjxlbT5DdXN0b20gPC9lbT4gQ2F0ZWdvcmllcyA8L3N0cm9uZz4sIDxzdHJvbmc+U3RhbmRhcmQgQ2F0ZWdvcmllcyA8L3N0cm9uZz4gYnkgZGVmaW5pdGlvbiBhcmUgbGlua2VkIHdpdGggYSBzcGVjaWZpYyBtZXRob2QgY29udGVudCB0eXBlIJYgZS5nLiBSb2xlIFNldHMgd2l0aCBSb2xlcywgRGlzY2lwbGluZXMgd2l0aCBUYXNrcywgYW5kIERvbWFpbnMgd2l0aCBXb3JrIFByb2R1Y3RzLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5DbGljayA8c3Ryb25nPk15IFBsdWdpbiAmZ3Q7IE1ldGhvZCBDb250ZW50ICZndDsgU3RhbmRhcmQgQ2F0ZWdvcmllczwvc3Ryb25nPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENyZWF0ZSBhIG5ldyA8c3Ryb25nPlJvbGUgU2V0IDwvc3Ryb25nPm5hbWVkIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2Rlc2lnbjwvc3Bhbj4gd2l0aCBhIHByZXNlbnRhdGlvbiBuYW1lIG9mIDxzcGFuIGNsYXNzPSJzdHlsZTEiPk15IERlc2lnbjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBBZGQgdGhlIHJvbGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfcnVwX3VzZXJfaW50ZXJmYWNlX2Rlc2lnbmVyPC9zcGFuPiB0byB0aGU8c3BhbiBjbGFzcz0ic3R5bGUxIj4gbXlfZGVzaWduPC9zcGFuPiA8c3Ryb25nPlJvbGUgU2V0PC9zdHJvbmc+LiA8L2xpPgotPC9vbD4KLTxibG9ja3F1b3RlPgotICA8cD5UaGVyZSBhcmUgdHdvIHdheXMgeW91IGNhbiBkbyB0aGlzOiA8L3A+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBJbiB0aGUgU3RhbmRhcmQgQ2F0ZWdvcnkgZWRpdG9yIGZvciA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9kZXNpZ248L3NwYW4+LCBvcGVuIHRoZSA8c3Ryb25nPlJvbGVzPC9zdHJvbmc+IHRhYiwgYW5kIGFkZCB0aGUgcm9sZSB0byB0aGUgcm9sZXNldC4gPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwO0luIHRoZSBSb2xlIGVkaXRvciBmb3IgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfcnVwX3VzZXJfaW50ZXJmYWNlX2Rlc2lnbmVyPC9zcGFuPiwgb3BlbiB0aGUgPHN0cm9uZz5DYXRlZ29yaWVzPC9zdHJvbmc+IHRhYiBhbmQgYWRkIHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9kZXNpZ248L3NwYW4+IGNhdGVnb3J5IGFzIGEgU2VsZWN0ZWQgUm9sZXNldC4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci08L2Jsb2NrcXVvdGU+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF85Lmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfOS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVlNzg5MzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF85Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+PC9hPjxhPjwvYT48YT48L2E+PGE+PC9hPjxhPkV4ZXJjaXNlIDk6IDwvYT5BZGRpbmcgWW91ciBQbHVnLWluIHRvIHRoZSBDb25maWd1cmF0aW9uIFZpZXcgPC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gbGVhcm4gaG93IHRvIGluY2x1ZGUgeW91ciBwbHVnLWluIGluIGEgY29uZmlndXJhdGlvbi4gPC9wPgotPHA+QmVmb3JlIHlvdXIgbmV3IGVsZW1lbnRzIGNhbiBiZSBzZWVuIGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXcsIHlvdSBuZWVkIHRvIGZpcnN0IGFkZCB5b3VyIG5ldyBwbHVnLWluIHRvIGEgY29uZmlndXJhdGlvbi4gV2UnbGwgYWRkIHRoZSBuZXcgcGx1Zy1pbiB0byB0aGUgQ29uZmlnIGZvciBSVVAgY29uZmlndXJhdGlvbiBhbmQgc2VlIHRoZSByZXN1bHRzIGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXcuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCB0byB0aGUgPHN0cm9uZz5Ccm93c2luZyA8L3N0cm9uZz5wZXJzcGVjdGl2ZSBhbmQgaW4gdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3IDwvc3Ryb25nPnRyeSB0byBmaW5kIHlvdXIgbmV3IGNvbnRlbnQuIEZvciBleGFtcGxlIGxvb2sgZm9yIE15IERlc2lnbiBSb2xlc2V0LiBZb3Ugc2hvdWxkbid0IHNlZSBpdC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFN3aXRjaCB0byB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+cGVyc3BlY3RpdmUgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5Db25maWd1cmF0aW9ucyA8L3N0cm9uZz4gYXQgdGhlIGJvdHRvbSBvZiB0aGUgdHJlZSBkaXNwbGF5LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gTWFrZSBhIGNvcHkgb2YgdGhlIDxzdHJvbmc+UlVQIGZvciBTbWFsbCBQcm9qZWN0cyA8L3N0cm9uZz4gY29uZmlndXJhdGlvbi4gUmlnaHQtY2xpY2sgb24gdGhlIDxzdHJvbmc+UlVQIGZvciBTbWFsbCBQcm9qZWN0cyA8L3N0cm9uZz4gY29uZmlndXJhdGlvbiBhbmQgc2VsZWN0IDxzdHJvbmc+Q29weSA8L3N0cm9uZz4uIFRoZW4gcmlnaHQtY2xpY2sgb24gdGhlIENvbmZpZ3VyYXRpb25zIGZvbGRlciBhbmQgY2xpY2sgPHN0cm9uZz5QYXN0ZSA8L3N0cm9uZz4uIE5hbWUgdGhlIG5ldyBjb25maWd1cmF0aW9uIDxzdHJvbmc+TXkgUlVQIGZvciBTbWFsbCBQcm9qZWN0cy4gPC9zdHJvbmc+PC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IERvdWJsZS1jbGljayBvbiB0aGUgPHN0cm9uZz5NeSBSVVAgZm9yIFNtYWxsIFByb2plY3RzIDwvc3Ryb25nPiBjb25maWd1cmF0aW9uIHRvIG9wZW4gdGhlIENvbmZpZ3VyYXRpb24gRWRpdG9yLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ2xpY2sgb24gdGhlIDxzdHJvbmc+UGx1Zy1pbiBhbmQgUGFja2FnZSBTZWxlY3Rpb248L3N0cm9uZz4gdGFiLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIDxzdHJvbmc+TXkgUGx1Z2luIDwvc3Ryb25nPiB0byB0aGUgY29uZmlndXJhdGlvbiBieSBjaGVja2luZyB0aGUgYm94IG5leHQgdG8gaXQgaW4gdGhlIENvbmZpZ3VyYXRpb24gQ29tcG9uZW50cyBmaWVsZC4gSWYgeW91IGV4cGFuZCA8c3Ryb25nPk15IFBsdWdpbiA8L3N0cm9uZz4geW91IHdpbGwgc2VlIHRoYXQgdGhlIGZ1bGwgY29udGVudHMgb2YgdGhlIHBsdWctaW4gaGF2ZSBiZWVuIHNlbGVjdGVkLiAKLSAgICAgIFlvdSBtYXkgc2VlIHNvbWUgZXJyb3JzIGluIHRoZSBMaWJyYXJ5IEVycm9yIExvZyB2aWV3LiBZb3UgY2FuIGNsaWNrIHRocm91Z2ggdGhlc2UgZXJyb3JzIG9yIGlnbm9yZSB0aGVtIGZvciBub3cuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDbG9zZSB0aGUgZWRpdG9yIGFuZCBzYXZlIHRoZSBjaGFuZ2VzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ2hhbmdlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gdG8gPHN0cm9uZz5NeSBSVVAgZm9yIFNtYWxsIFByb2plY3RzIDwvc3Ryb25nPmluIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGlvbiBib3ggaW4gdGhlIEVQRiBDb21wb3NlciB0b29sYmFyLCBqdXN0IGJlbG93IHRoZSBtYWluIG1lbnUgYmFyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gU3dpdGNoIHRvIHRoZSA8c3Ryb25nPkJyb3dzaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZSBhbmQgbm93IGxvb2sgZm9yIHlvdXIgY29udGVudCBpbiB0aGUgPHN0cm9uZz5Db25maWd1cmF0aW9uIFZpZXc8L3N0cm9uZz4uIFlvdSBzaG91bGQgbm93IHNlZSA8c3Ryb25nPk15IERlc2lnbiBSb2xlc2V0IDwvc3Ryb25nPi4gWW91IHNob3VsZCBhbHNvIHNlZSB5b3VyIG5ldyBXb3JrIFByb2R1Y3RzIGluIHRoZSBVbmNhdGVnb3JpemVkIGZvbGRlciB1bmRlciBEb21haW5zLiA8L2xpPgotPC9vbD4KLTxibG9ja3F1b3RlPiZuYnNwOzwvYmxvY2txdW90ZT4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2ludHJvLmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfaW50cm8uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiM2VjYTg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfaW50cm8uaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgxPjxhPlR1dG9yaWFsOiBDcmVhdGUgTWV0aG9kIENvbnRlbnQgPC9hPjwvaDE+Ci08aDI+PGE+SW50cm9kdWN0aW9uIDwvYT48L2gyPgotPHA+RVBGIENvbXBvc2VyIHNlcGFyYXRlcyByZXVzYWJsZSA8c3Ryb25nPm1ldGhvZCBjb250ZW50IDwvc3Ryb25nPiBmcm9tIGl0cyBhcHBsaWNhdGlvbiBpbiA8c3Ryb25nPnByb2Nlc3NlcyA8L3N0cm9uZz4uIFRoZSBwcmltYXJ5IG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGFyZSA8c3Ryb25nPnRhc2tzIDwvc3Ryb25nPiwgPHN0cm9uZz5yb2xlcyA8L3N0cm9uZz4sIDxzdHJvbmc+d29yayBwcm9kdWN0cyA8L3N0cm9uZz4gYW5kIDxzdHJvbmc+Z3VpZGFuY2UgPC9zdHJvbmc+LiBBIFByb2Nlc3MgRW5naW5lZXIgdXNlcyBFUEYgQ29tcG9zZXIgdG8gYXV0aG9yIHRoZXNlIGVsZW1lbnRzLCBkZWZpbmUgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGVtLCBhbmQgdG8gY2F0ZWdvcml6ZSB0aGVtLiBNZXRob2QgY29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuIDwvcD4KLTxwPkVQRiBDb21wb3NlciBzdXBwb3J0cyB0aGUgY29uY2VwdCBvZiA8c3Ryb25nPk1ldGhvZCBQbHVnLWlucyA8L3N0cm9uZz4gdGhhdCBhbGxvd3MgdGhlIGV4dGVuc2lvbiBvciBjdXN0b21pemF0aW9uIG9mIGJhc2UgbGlicmFyeSBjb250ZW50IHdpdGhvdXQgZGlyZWN0bHkgY2hhbmdpbmcgdGhhdCBiYXNlIGNvbnRlbnQuIFdoZW4gd2Ugc2hpcCBhIGxpYnJhcnkgd2l0aCBFUEYgQ29tcG9zZXIgdGhlIGxpYnJhcnkgaXMgcHJvdGVjdGVkIGZyb20gZGlyZWN0IG1vZGlmaWNhdGlvbi4gVGhlIFJVUCBwbHVnaW5zIGFyZSBncmF5ZWQgb3V0IGluIHRoZSBMaWJyYXJ5IHZpZXcgaW5kaWNhdGluZyB0aGF0IHRoZXkgYXJlIGxvY2tlZC4gPC9wPgotPHA+PHN0cm9uZz5Zb3Ugc2hvdWxkIGFsd2F5cyBjcmVhdGUgbmV3IGNvbnRlbnQgaW4gYSBNZXRob2QgUGx1Zy1pbiB0aGF0IHlvdSBwcm9kdWNlLiA8L3N0cm9uZz5UaGlzIHNlcGFyYXRlcyB5b3VyIGNvbnRlbnQgZnJvbSB0aGUgb3JpZ2luYWwgT3BlblVQIGNvbnRlbnQgYW5kIGFsbG93cyB5b3UgdG8gdXBkYXRlIHlvdXIgb3duIGxpYnJhcnkgd2l0aCBuZXcgcmVsZWFzZXMgb2YgdGhlIE9wZW5VUCBsaWJyYXJ5IHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjb250ZW50IHRoYXQgeW91IGhhdmUgY3JlYXRlZCBpbiB5b3VyIG93biBwbHVnLWlucy4gPC9wPgotPHA+SW4gdGhpcyB0dXRvcmlhbCB5b3Ugd2lsbCB1c2Ugc2V2ZXJhbCCRZWRpdG9ycycuIEVhY2ggZWRpdG9yIG9wZW5zIGluIGl0cyBvd24gdGFiIGluIHRoZSBjb250ZW50IGRpc3BsYXkgc2VjdGlvbiBvZiB0aGUgc2NyZWVuLiBJdCBpcyBnb29kIHByYWN0aWNlIHRvIGNsb3NlIGFuIGVkaXRvciB3aGVuIHlvdSBoYXZlIGZpbmlzaGVkIHdpdGggaXQuIFRoaXMgZW5zdXJlcyB0aGF0IHlvdSBzYXZlIGFueSBjaGFuZ2VzIHlvdSBtYWtlLiA8L3A+Ci08cD5JZiB5b3UgZG8gaGF2ZSBzZXZlcmFsIGVkaXRvcnMgb3BlbiwgeW91IG1heSB3YW50IHRvIHR1cm4gb24gdGhlIJFMaW5rIHdpdGggRWRpdG9yJyBmZWF0dXJlIGJ5IGNsaWNraW5nIG9uIHRoZSBMaW5rIHdpdGggRWRpdG9yIGJ1dHRvbiBpbiB0aGUgTGlicmFyeSB2aWV3IHRvb2xiYXIuIElmIHRoaXMgaXMgc2VsZWN0ZWQsIHdoZW4geW91IHN3aXRjaCBiZXR3ZWVuIGVkaXRvcnMsIHRoZSBlbGVtZW50IGluIHRoZSBjdXJyZW50IGVkaXRvciBpcyBoaWdobGlnaHRlZCBpbiB0aGUgTGlicmFyeSB2aWV3LiA8L3A+Ci08cD5UaGUgZm9sbG93aW5nIGV4ZXJjaXNlcyB0YWtlIHlvdSB0aHJvdWdoIHRoZSBjcmVhdGlvbiBvZiCTY29yZSBtZXRob2QgY29udGVudJQuIDwvcD4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzEuaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF8xLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTI4OWIwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDE6IEFkZGluZyB0byBiYXNlIG1ldGhvZCBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCBhIHJvbGUgdXNpbmcgQ29udHJpYnV0aW9uIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBleHRlbmQgYSByb2xlIGluIFJVUCB1c2luZyCRY29udHJpYnV0aW9uJy4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlRoaXMgZXhlcmNpc2UgYWRkcyBjb250ZW50IHRvIHRoZSBNeSBQbHVnaW4gcGx1Z2luLiBJZiB5b3UgaGF2ZSBub3QgY2FycmllZCBvdXQgdGhlIJFDcmVhdGUgQ29yZSBNZXRob2QgQ29udGVudCB0dXRvcmlhbCwgY3JlYXRlIGl0IG5vdy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q3JlYXRlIGEgQ29udGVudCBQYWNrYWdlIGluIHRoZSBNeSBQbHVnaW4gcGx1Zy1pbiBjYWxsZWQgPHNwYW4gY2xhc3M9InN0eWxlMSI+Q29udHJpYnV0aW9uPC9zcGFuPiBUZXN0LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5JbiB0aGUgbmV3IENvbnRyaWJ1dGlvbiBUZXN0IGNvbnRlbnQgcGFja2FnZSwgY3JlYXRlIGEgbmV3IFJvbGU6IDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2NvbnRyaWJ1dGluZ191aV9kZXNpZ25lcjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlBhZ2UgZG93biB0aGUgRGVzY3JpcHRpb24gdGFiIHRvIHRoZSBDb250ZW50IFZhcmlhYmlsaXR5IHNlY3Rpb24gYW5kIHRoZW4sIGluIHRoZSA8c3Ryb25nPlZhcmlhYmlsaXR5IFR5cGUgPC9zdHJvbmc+LCBzZWxlY3QgPHN0cm9uZz5Db250cmlidXRlcyA8L3N0cm9uZz4gYW5kIGNob29zZSB0aGUgYmFzZSByb2xlOiA8c3Ryb25nPnJ1cF91c2VyX2ludGVyZmFjZV9kZXNpZ25lciA8L3N0cm9uZz4uIFlvdSB3aWxsIGZpbmQgdGhpcyBpbiA8c3Ryb25nPlJVUCAmZ3Q7IERlc2lnbiAmZ3Q7IEdVSSBEZXNpZ248L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBDb21wbGV0ZSB0aGUgZm9sbG93aW5nOiA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgQWRkIEJyaWVmIERlc2NyaXB0aW9uOiBDb250cmlidXRpbmcgYnJpZWYgZGVzY3JpcHRpb24gdGV4dCA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IEFkZCBNYWluIERlc2NyaXB0aW9uIDogQ29udHJpYnV0aW5nIG1haW4gZGVzY3JpcHRpb24gdGV4dCA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IFNhdmUgKGJ5IGNsb3NpbmcgdGhlIHJvbGUgZWRpdG9yKS4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD5DcmVhdGUgYSBuZXcgQ29uZmlndXJhdGlvbiBieSBzZWxlY3RpbmcgdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbnMgPC9zdHJvbmc+IGZvbGRlciBpbiB0aGUgTGlicmFyeSBWaWV3IHRyZWUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlJpZ2h0IGNsaWNrIHRoZSBmb2xkZXIgdG8gY3JlYXRlIG5ldyBjb25maWd1cmF0aW9uIGFuZCB0aGVuIG5hbWUgdGhlIGNvbmZpZ3VyYXRpb24gPHNwYW4gY2xhc3M9InN0eWxlMSI+VmFyaWFiaWxpdHkgQ29uZmlndXJhdGlvbjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgdGhlIFJVUCBiYXNlIGFuZCB5b3VyIHBsdWctaW4gKE15IFBsdWdpbikgYnkgbWFya2luZyB0aGUgY2hlY2tib3hlcy4gU2F2ZSB0aGUgY29uZmlndXJhdGlvbiAoY2xvc2UgdGhlIGNvbmZpZ3VyYXRpb24gdGFiKS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+U2V0IJNjdXJyZW50IGNvbmZpZ3VyYXRpb26UIJYgbG9jYXRlZCB1bmRlciBtYWluIG1lbnUgYmFyIGFzIJNWYXJpYWJpbGl0eSBDb25maWd1cmEgdGlvbpQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCB0byB0aGUgPHN0cm9uZz5Ccm93c2luZzwvc3Ryb25nPiBwZXJzcGVjdGl2ZSBhbmQgdGhlbiBvcGVuIHRoZSBVc2VyLUludGVyZmFjZSBEZXNpZ25lciByb2xlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgWW91IHNob3VsZCBzZWUgdGhlIHRleHQgdGhhdCB5b3UgaW5jbHVkZWQgaW4gdGhlIENvbnRyaWJ1dGluZyByb2xlIGRpc3BsYXllZCBpbiB0aGUgVXNlci1JbnRlcmZhY2UgRGVzaWduZXIuIDwvbGk+Ci08L29sPgotPGJsb2NrcXVvdGU+Ci0gIDxwPjxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+IFRoZSBDb25maWd1cmF0aW9uIFZpZXcgcmVzb2x2ZXMgdGhlIHZhcmlhYmlsaXR5IHJlbGF0aW9uc2hpcHMgYmV0d2VlbiByZWxhdGVkIHBsdWctaW5zIGluIGEgY29uZmlndXJhdGlvbiBhbmQgc2hvd3MgdGhlIHJlc3VsdHMgYXMgdGhleSB3aWxsIGJlIHB1Ymxpc2hlZCBpbiBhIHB1Ymxpc2hlZCB3ZWIgc2l0ZS4gPC9wPgotPC9ibG9ja3F1b3RlPgotPGgyPiZuYnNwOzwvaDI+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfMi5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5Mzc5NzNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgMjogQWRkaW5nIHRvIGJhc2UgbWV0aG9kIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIGEgd29yayBwcm9kdWN0IHVzaW5nIDx1PkNvbnRyaWJ1dGlvbjwvdT4gPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGV4dGVuZCBhIDxzdHJvbmc+V29yayBQcm9kdWN0IDwvc3Ryb25nPiAoPHN0cm9uZz5BcnRpZmFjdDwvc3Ryb25nPikgaW4gUlVQIHVzaW5nIJFjb250cmlidXRpb24nLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggdG8gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFdpdGhpbiB0aGUgQ29udHJpYnV0aW9uIFRlc3QgcGFja2FnZSBjcmVhdGUgYSBuZXcgYXJ0aWZhY3QgY2FsbGVkIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2NvbnRyaWJ1dGluZ19uYXZtYXA8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIGEgPHN0cm9uZz5CcmllZiBEZXNjcmlwdGlvbiwgTWFpbiBEZXNjcmlwdGlvbjwvc3Ryb25nPiwgPHN0cm9uZz5QdXJwb3NlPC9zdHJvbmc+LCBldGMuLCA6IDxzcGFuIGNsYXNzPSJzdHlsZTEiPkNvbnRyaWJ1dGluZyBCcmllZiBEZXNjcmlwdGlvbiwgQ29udHJpYnV0aW5nIE1haW4gRGVzY3JpcHRpb24sIGFuZCBDb250cmlidXRpbmcgUHVycG9zZTwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBJbiA8c3Ryb25nPlZhcmlhYmlsaXR5IFJlbGF0aW9uc2hpcCA8L3N0cm9uZz4gc2VsZWN0IDxzdHJvbmc+Q29udHJpYnV0ZXMgPC9zdHJvbmc+LCBhbmQgZm9yIDxzdHJvbmc+YmFzZSBhcnRpZmFjdCA8L3N0cm9uZz4gc2VsZWN0IDxzcGFuIGNsYXNzPSJzdHlsZTEiPnJ1cF9uYXZtYXA8L3NwYW4+LiBTYXZlIGJ5IGNsb3NpbmcgdGhlIFdvcmsgUHJvZHVjdCBlZGl0b3IuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTd2l0Y2ggdG8gdGhlIEJyb3dzaW5nIHBlcnNwZWN0aXZlIGFuZCB2aWV3IHRoZSBOYXZpZ2F0aW9uIE1hcCBhcnRpZmFjdCBpbiB0aGUgPHN0cm9uZz5BbmFseXNpcyBhbmQgRGVzaWduIERvbWFpbiA8L3N0cm9uZz4gZm9sZGVyIGluIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3LiA8L3N0cm9uZz48L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gWW91IHNob3VsZCBzZWUgdGhlIHRleHQgdGhhdCB5b3UgaW5jbHVkZWQgaW4gdGhlIENvbnRyaWJ1dGluZyByb2xlIGRpc3BsYXllZCBpbiB0aGUgVXNlci1JbnRlcmZhY2UgRGVzaWduZXIuIDwvbGk+Ci08L29sPgotPGJsb2NrcXVvdGU+Jm5ic3A7PC9ibG9ja3F1b3RlPgotPGgyPiZuYnNwOzwvaDI+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfMy5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNDRkOTBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgMzogQWRkaW5nIGJhc2UgbWV0aG9kIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIGEgdGFzayB1c2luZyA8dT5Db250cmlidXRpb248L3U+IDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBleHRlbmQgYSA8c3Ryb25nPlRhc2sgPC9zdHJvbmc+IGluIFJVUCB1c2luZyCRY29udHJpYnV0aW9uJy4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPldpdGhpbiB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+Q29udHJpYnV0aW9uIFRlc3QgPC9zcGFuPnBhY2thZ2UgY3JlYXRlIGEgbmV3IDxzdHJvbmc+VGFzazwvc3Ryb25nPjogPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfY29udHJpYnV0aW5nX2Rlc2lnbl91c2VyX2ludGVyZmFjZTwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgYSA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uLCBNYWluIGRlc2NyaXB0aW9uIDwvc3Ryb25nPiwgPHN0cm9uZz5QdXJwb3NlPC9zdHJvbmc+LCBldGMuLDogPHNwYW4gY2xhc3M9InN0eWxlMSI+Q29udHJpYnV0aW5nIEJyaWVmIERlc2NyaXB0aW9uIHRleHQsIENvbnRyaWJ1dGluZyBNYWluIERlc2NyaXB0aW9uIHRleHQsIGFuZCBDb250cmlidXRpbmcgUHVycG9zZSB0ZXh0LiA8L3NwYW4+PC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCB0d28gbmV3IHN0ZXBzOiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5Db250cmlidXRpbmcgU3RlcCAxIDwvc3Bhbj5hbmQ8c3BhbiBjbGFzcz0ic3R5bGUxIj4gQ29udHJpYnV0aW5nIFN0ZXAgMjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBJbiA8c3Ryb25nPlZhcmlhYmlsaXR5IFJlbGF0aW9uc2hpcCA8L3N0cm9uZz4gc2VsZWN0IDxzdHJvbmc+Q29udHJpYnV0ZXM8L3N0cm9uZz4sIGFuZCBmb3IgYmFzZSA8c3Ryb25nPnRhc2sgPC9zdHJvbmc+IHNlbGVjdCwgPHNwYW4gY2xhc3M9InN0eWxlMSI+ZGVzaWduX3VzZXJfaW50ZXJmYWNlPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEdvIGJhY2sgdG8gdGhlIDxzdHJvbmc+U3RlcHMgPC9zdHJvbmc+IHRhYiBhbmQgY2xpY2sgdGhlIDxzdHJvbmc+T3JkZXIgPC9zdHJvbmc+IGJ1dHRvbi4gWW91IGNhbiBub3cgaW5zZXJ0IHlvdXIgbmV3IHN0ZXBzIGludG8gdGhlIG9yaWdpbmFsIHN0ZXBzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5TYXZlIHRoZSBuZXcgdGFzayBieSBjbG9zaW5nIHRoZSB0YXNrIGVkaXRvci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFN3aXRjaCB0byB0aGUgQnJvd3NpbmcgcGVyc3BlY3RpdmUgYW5kIHZpZXcgdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkRlc2lnbiB0aGUgVXNlciBJbnRlcmZhY2U8L3NwYW4+IHRhc2sgaW4gdGhlIDxzdHJvbmc+RGlzY2lwbGluZXMgPC9zdHJvbmc+IGZvbGRlciBpbiA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gVmlldyA8L3N0cm9uZz4uIFlvdSB3aWxsIGZpbmQgaXQgdW5kZXIgdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkFuYWx5c2lzXyZhbXA7IERlc2lnbjwvc3Bhbj4gZGlzY2lwbGluZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IExvb2sgYXQgdGhlIGRlc2NyaXB0aW9ucyBhbmQgdGhlIHN0ZXBzIHRvIHNlZSBob3cgeW91ciBuZXcgbWF0ZXJpYWwgd2FzIGNvbnRyaWJ1dGVkLiBZb3Ugc2hvdWxkIHNlZSB0aGUgdGV4dCB0aGF0IHlvdSBpbmNsdWRlZCBpbiB0aGUgQ29udHJpYnV0aW5nIHJvbGUgZGlzcGxheWVkIGluIHRoZSBVc2VyIEludGVyZmFjZSB0YXNrLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gWW91IGNhbiBhbHNvIHRyeSBzcGVjaWZ5aW5nIGFkZGl0aW9uYWwgPHN0cm9uZz5hcnRpZmFjdHMgPC9zdHJvbmc+LCA8c3Ryb25nPmd1aWRhbmNlIDwvc3Ryb25nPiwgPHN0cm9uZz5hZGRpdGlvbmFsIHBlcmZvcm1lciByb2xlczwvc3Ryb25nPiwgZXRjLiwgaW4gdGhlIGNvbnRyaWJ1dGluZyB0YXNrIChpbiBBdXRob3JpbmcgcGVyc3BlY3RpdmUpIGFuZCB0aGVuIHZpZXcgdGhlIHJlc3VsdCBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IHRvIHNlZSB0aGUgYmVoYXZpb3IuIDwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF80Lmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0NWNlNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF80Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSA0OiBFeHRlbmRpbmcgYmFzZSBtZXRob2QgY29udGVudCBhc3NvY2lhdGVkIHdpdGggYSByb2xlIHVzaW5nIDx1PkV4dGVuZHM8L3U+IDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBleHRlbmQgYmFzZSBtZXRob2QgY29udGVudCB2aWEgZXh0ZW5kcyB2YXJpYWJpbGl0eS4gRXh0ZW5kcyB2YXJpYWJpbGl0eSB3b3JrcyBkaWZmZXJlbnRseSB0aGFuIENvbnRyaWJ1dGVzIHZhcmlhYmlsaXR5IGluIHRoYXQgdGhlIG1ldGhvZCBjb250ZW50IGVsZW1lbnQgdGhhdCBleHRlbmRzIHRoZSBiYXNlIG1ldGhvZCBlbGVtZW50IGluaGVyaXRzIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBleHRlbmRlZCBiYXNlIGVsZW1lbnQuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPiBTd2l0Y2ggdG8gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENyZWF0ZSBhIG5ldyA8c3Ryb25nPkNvbnRlbnQgUGFja2FnZSA8L3N0cm9uZz4gaW4gdGhlIE15IFBsdWdpbiBQbHVnLWluIGNhbGxlZCBFeHRlbmRzIFRlc3QuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDcmVhdGUgYSBuZXcgPHN0cm9uZz5Sb2xlIDwvc3Ryb25nPjogPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfZXh0ZW5kc191aV9kZXNpZ25lciw8L3NwYW4+IHdpdGggdGhlIHByZXNlbnRhdGlvbiBuYW1lLCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5FeHRlbmRzIFJVUCBVSSBEZXNpZ25lcjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBJbiB0aGUgVmFyaWFiaWxpdHkgVHlwZSBzZWxlY3QgPHN0cm9uZz5FeHRlbmRzIDwvc3Ryb25nPiBhbmQgY2hvb3NlIHRoZSBiYXNlIHJvbGU6IDxzcGFuIGNsYXNzPSJzdHlsZTEiPnJ1cF91c2VyX2ludGVyZmFjZV9kZXNpZ25lcjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgYSA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uPC9zdHJvbmc+OiBFeHRlbmRzIFJvbGUgQnJpZWYgRGVzY3JpcHRpb24uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgYSA8c3Ryb25nPk1haW4gRGVzY3JpcHRpb24gPC9zdHJvbmc+OiBFeHRlbmRzIFJvbGUgTWFpbiBEZXNjcmlwdGlvbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNhdmUgdGhlIG5ldyByb2xlIGJ5IGNsb3NpbmcgdGhlIHJvbGUgZWRpdG9yLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gVXBkYXRlIHRoZSBWYXJpYWJpbGl0eSBDb25maWd1cmF0aW9uIHRvIGluY2x1ZGUgdGhlIG5ldyBjb250ZW50IHBhY2thZ2UuIDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiAmIzE0OTsmbmJzcDtPcGVuIHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5WYXJpYWJpbGl0eSBDb25maWd1cmF0aW9uPC9zcGFuPiBhbmQgZXhwYW5kIDxzdHJvbmc+TXkgUGx1Z2luICZndDsgTWV0aG9kIENvbnRlbnQgJmd0OyBDb250ZW50IFBhY2thZ2VzLiA8L3N0cm9uZz4gPC9wPgotICAgIDxwPiYjMTQ5OyBVbmNoZWNrIENvbnRyaWJ1dGlvbiBUZXN0LiA8L3A+Ci0gICAgPHA+JiMxNDk7IE1ha2Ugc3VyZSA8c3Ryb25nPkV4dGVuZHMgVGVzdCA8L3N0cm9uZz5pcyBjaGVja2VkLiBUaGlzIGlzIGRvbmUgc28gdGhlcmUgdGhhdCBhcmUgbm8gY29uZmxpY3RpbmcgZXh0ZW5zaW9ucyB0byB0aGUgc2FtZSBtZXRob2QgZWxlbWVudC4gPC9wPgotICAgIDxwPiYjMTQ5OyBDbG9zZSBhbmQgc2F2ZSB0aGUgY2hhbmdlcyB0byB0aGUgY29uZmlndXJhdGlvbi4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD4gU3dpdGNoIHRvIDxzdHJvbmc+QnJvd3NpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gSW4gdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3PC9zdHJvbmc+LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkV4dGVuZHMgUlVQIFVJIERlc2lnbmVyIHJvbGU8L3NwYW4+IGluIHRoZSBVbmNhdGVnb3JpemVkIFJvbGVzIGZvbGRlciB1bmRlciB0aGUgkzxzdHJvbmc+Um9sZSBTZXRzPC9zdHJvbmc+lCBmb2xkZXIuIFlvdSB3aWxsIHNlZSBpbiB0aGUgaHRtbCBwYWdlIHRoYXQgY29udGVudCBlbnRlcmVkIGluIHRoZSBleHRlbmRpbmcgcm9sZSBoYXMgYmVlbiByZXBsYWNlZCwgd2hlcmVhcyBjb250ZW50IG5vdCBwcm92aWRlZCBoYXMgYmVlbiBpbmhlcml0ZWQgZnJvbSB0aGUgYmFzZSBhcnRpZmFjdC4gTm90ZSB0aGF0IHRoZSBleHRlbmRlZCByb2xlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPlVzZXItSW50ZXJmYWNlIERlc2lnbmVyPC9zcGFuPiByZW1haW5zIHVuY2hhbmdlZC4gPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzUuaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF81Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDRiODUxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDU6IEV4dGVuZGluZyBiYXNlIG1ldGhvZCBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCBhIFdvcmsgUHJvZHVjdCB1c2luZyA8dT5FeHRlbmRzPC91PiA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gZXh0ZW5kIGEgYmFzZSBtZXRob2Qgd29yayBwcm9kdWN0IHVzaW5nIGV4dGVuZHMgdmFyaWFiaWxpdHkuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPiBTd2l0Y2ggdG8gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENyZWF0ZSBhIG5ldyA8c3Ryb25nPldvcmsgUHJvZHVjdCA8L3N0cm9uZz4gaW4gdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkV4dGVuZHMgVGVzdDwvc3Bhbj4gQ29udGVudCBQYWNrYWdlIGNhbGxlZCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9leHRlbmRzX3J1cF9uYXZtYXA8L3NwYW4+IHdpdGggdGhlIHByZXNlbnRhdGlvbiBuYW1lLCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5FeHRlbmRzIFJVUCBOYXZtYXA8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gSW4gdGhlIDxzdHJvbmc+VmFyaWFiaWxpdHkgVHlwZSA8L3N0cm9uZz4gc2VsZWN0IDxzdHJvbmc+ZXh0ZW5kcyA8L3N0cm9uZz4gYW5kIGNob29zZSB0aGUgYmFzZSA8c3Ryb25nPldvcmsgUHJvZHVjdCA8L3N0cm9uZz48c3BhbiBjbGFzcz0ic3R5bGUxIj5ydXBfbmF2bWFwPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCBhIDxzdHJvbmc+QnJpZWYgRGVzY3JpcHRpb24gPC9zdHJvbmc+OiBFeHRlbmRzIE5hdm1hcCBCcmllZiBEZXNjcmlwdGlvbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNhdmUgYW5kIHRoZW4gc3dpdGNoIHRvIHRoZSA8c3Ryb25nPkJyb3dzaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+SW4gdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3PC9zdHJvbmc+LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkV4dGVuZHMgUlVQIE5hdm1hcDwvc3Bhbj4gd29yayBwcm9kdWN0IGluIHRoZSA8c3Ryb25nPlVuY2F0ZWdvcml6ZWQgRm9sZGVyIDwvc3Ryb25nPiB1bmRlciA8c3Ryb25nPkRvbWFpbnMgPC9zdHJvbmc+LiBZb3Ugd2lsbCBzZWUgaW4gdGhlIGh0bWwgcGFnZSB0aGF0IGNvbnRlbnQgZW50ZXJlZCBpbiB0aGUgZXh0ZW5kaW5nIGFydGlmYWN0IGhhcyBiZWVuIHJlcGxhY2VkLCB3aGVyZWFzIGNvbnRlbnQgbm90IHByb3ZpZGVkIGhhcyBiZWVuIGluaGVyaXRlZCBmcm9tIHRoZSBiYXNlIGFydGlmYWN0LiBOb3RlIHRoYXQgdGhlIGV4dGVuZGVkIGFydGlmYWN0IDxzcGFuIGNsYXNzPSJzdHlsZTEiPk5hdmlnYXRpb24gTWFwPC9zcGFuPiByZW1haW5zIHVuY2hhbmdlZC48L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNi5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzYuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZGI0YzUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgNjogRXh0ZW5kaW5nIGJhc2UgbWV0aG9kIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIGEgVGFzayB1c2luZyA8dT5FeHRlbmRzPC91PiA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gZXh0ZW5kIGEgYmFzZSBtZXRob2QgdGFzayB1c2luZyBleHRlbmRzIHZhcmlhYmlsaXR5LiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD4gQ3JlYXRlIGEgbmV3IDxzdHJvbmc+dGFzayA8L3N0cm9uZz4gaW4gdGhlIEV4dGVuZHMgVGVzdCBjb250ZW50IHBhY2thZ2UgY2FsbGVkIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2V4dGVuZHNfZGVzaWduX3VzZXJfaW50ZXJmYWNlPC9zcGFuPiwgd2l0aCBwcmVzZW50YXRpb24gbmFtZSwgPHNwYW4gY2xhc3M9InN0eWxlMSI+RXh0ZW5kcyBEZXNpZ24gVXNlciBJbnRlcmZhY2UuIDwvc3Bhbj48L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gSW4gdGhlIDxzdHJvbmc+VmFyaWFiaWxpdHkgVHlwZSwgPC9zdHJvbmc+IHNlbGVjdCA8c3Ryb25nPmV4dGVuZHMgPC9zdHJvbmc+IGFuZCBjaG9vc2UgdGhlIGJhc2UgdGFzayBkZXNpZ25fdXNlcl9pbnRlcmZhY2UuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgYSA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uIDwvc3Ryb25nPjogPHNwYW4gY2xhc3M9InN0eWxlMSI+RXh0ZW5kcyBUYXNrIEJyaWVmIERlc2NyaXB0aW9uPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCA8c3Ryb25nPlN0ZXBzIDwvc3Ryb25nPjogPHNwYW4gY2xhc3M9InN0eWxlMSI+RXh0ZW5kIFN0ZXAgMSwgRXh0ZW5kIFN0ZXAgMiA8L3NwYW4+PC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCB0aGUgPHN0cm9uZz5Sb2xlIDwvc3Ryb25nPiBjcmVhdGVkIGluIGV4ZXJjaXNlIDQ6IDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2V4dGVuZHNfdWlfZGVzaWduZXI8L3NwYW4+LCBhcyBQcmltYXJ5IFBlcmZvcm1lci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCB0aGUgV29yayBQcm9kdWN0IGNyZWF0ZWQgaW4gZXhlcmNpc2UgNTogPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfZXh0ZW5kc19ydXBfbmF2bWFwPC9zcGFuPiwgYXMgYW4gT3V0cHV0LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIDxzdHJvbmc+R3VpZGFuY2UgPC9zdHJvbmc+KGNob29zZSBhbnkgZ3VpZGFuY2UpIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgdGhlIDxzdHJvbmc+dGFzayA8L3N0cm9uZz4gdG8gdGhlIGFwcHJvcHJpYXRlIFN0YW5kYXJkIENhdGVnb3J5OiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5ydXBfYW5hbHlzaXNfZGVzaWduX2Rpc2NpcGxpbmU8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2F2ZSBhbmQgdGhlbiBzd2l0Y2ggdG8gdGhlIDxzdHJvbmc+QnJvd3NpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5JbiB0aGUgPHN0cm9uZz5Db25maWd1cmF0aW9uIFZpZXc8L3N0cm9uZz4sIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+RXh0ZW5kcyBEZXNpZ24gVXNlciBJbnRlcmZhY2U8L3NwYW4+IHRhc2sgdW5kZXIgdGhlIDxzdHJvbmc+RGlzY2lwbGluZXMgPC9zdHJvbmc+IGZvbGRlciBpbiB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+QW5hbHlzaXMgJmFtcDsgRGVzaWduPC9zcGFuPiBkaXNjaXBsaW5lLiBZb3Ugd2lsbCBzZWUgaW4gdGhlIGh0bWwgcGFnZSB0aGF0IG1ldGhvZCBjb250ZW50IGFuZCByZWxhdGlvbnNoaXBzIGhhdmUgYmVlbiBpbmhlcml0ZWQgZnJvbSB0aGUgYmFzZSB0YXNrIGFuZCBleHRlbmRlZCBieSB0aGUgcGx1Zy1pbiBleHRlbmRpbmcgY29udGVudCBhbmQgcmVsYXRpb25zaGlwcy4gTm90ZSB0aGF0IHRoZSBleHRlbmRlZCB0YXNrIHJlbWFpbnMgdW5jaGFuZ2VkLjwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF83Lmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExMTVkNDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF83Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSA3OiBFeHRlbmRpbmcgYmFzZSBtZXRob2QgY29udGVudCB1c2luZyA8dT5SZXBsYWNlPC91PiB2YXJpYWJpbGl0eSA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gZXh0ZW5kIGJhc2UgbWV0aG9kIGNvbnRlbnQgdXNpbmcgcmVwbGFjZSB2YXJpYWJpbGl0eS4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDcmVhdGUgYSBuZXcgPHN0cm9uZz5jb250ZW50IHBhY2thZ2UgPC9zdHJvbmc+IG5hbWVkLCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5SZXBsYWNlIFRlc3Q8L3NwYW4+LCBpbiB0aGUgTXkgUGx1Z2luIHBsdWctaW4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDcmVhdGUgYSBuZXcgPHN0cm9uZz5yb2xlIDwvc3Ryb25nPjogPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfcmVwbGFjZV91aV9kZXNpZ25lciByb2xlPC9zcGFuPiB3aXRoIHByZXNlbnRhdGlvbiBuYW1lLCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5NeSBSZXBsYWNlIFVJIERlc2lnbmVyPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEluIHRoZSA8c3Ryb25nPlZhcmlhYmlsaXR5IFR5cGUgPC9zdHJvbmc+IHNlbGVjdCA8c3Ryb25nPnJlcGxhY2VzIDwvc3Ryb25nPiBhbmQgdGhlbiBjaG9vc2UgdGhlIDxzdHJvbmc+YmFzZSByb2xlIDwvc3Ryb25nPjogPHNwYW4gY2xhc3M9InN0eWxlMSI+cnVwX3VzZXJfaW50ZXJmYWNlX2Rlc2lnbmVyPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCBhIDxzdHJvbmc+QnJpZWYgRGVzY3JpcHRpb24gPC9zdHJvbmc+OiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5SZXBsYWNlIEJyaWVmIERlc2NyaXB0aW9uLjwvc3Bhbj4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCBhIDxzdHJvbmc+TWFpbiBEZXNjcmlwdGlvbiA8L3N0cm9uZz46IDxzcGFuIGNsYXNzPSJzdHlsZTEiPlJlcGxhY2UgTWFpbiBEZXNjcmlwdGlvbjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTYXZlIHRoZSByb2xlIGJ5IGNsb3NpbmcgdGhlIHJvbGUgZWRpdG9yLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgVXBkYXRlIHRoZSBWYXJpYWJpbGl0eSBUZXN0IENvbmZpZ3VyYXRpb246IDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiAmIzE0OTsmbmJzcDtPcGVuIHRoZSBWYXJpYWJpbGl0eSBDb25maWd1cmF0aW9uIGFuZCBleHBhbmQgPHN0cm9uZz5NeSBQbHVnaW4gJmd0OyBNZXRob2QgQ29udGVudCAmZ3Q7IENvbnRlbnQgUGFja2FnZXM8L3N0cm9uZz4uIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDtVbmNoZWNrIDxzdHJvbmc+RXh0ZW5kcyBUZXN0PC9zdHJvbmc+LiA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7Q2hlY2sgPHN0cm9uZz5SZXBsYWNlIFRlc3Q8L3N0cm9uZz4uIFRoaXMgaXMgZG9uZSBzbyB0aGVyZSBhcmUgbm8gY29uZmxpY3RpbmcgZXh0ZW5zaW9ucyBpbiB0aGUgc2FtZSBtZXRob2QgZWxlbWVudC4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD4gU3dpdGNoIHRvIHRoZSA8c3Ryb25nPkJyb3dzaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+SW4gdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3PC9zdHJvbmc+LCB5b3Ugd2lsbCBzZWUgdGhhdCB0aGVyZSBpcyBubyBsb25nZXIgYSAoUlVQKSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5Vc2VyLUludGVyZmFjZSBEZXNpZ25lcjwvc3Bhbj4gcm9sZSBpbiB0aGUgPHN0cm9uZz5Sb2xlIFNldHMgPC9zdHJvbmc+IGZvbGRlci4gSXQgd2FzIHJlcGxhY2VkIGJ5IDxzcGFuIGNsYXNzPSJzdHlsZTEiPk15IFJlcGxhY2UgVUkgRGVzaWduZXI8L3NwYW4+IHJvbGUuIE1vcmVvdmVyLCBvdGhlciBjb250ZW50IGVsZW1lbnRzIGluIHRoZSBiYXNlIHBsdWctaW4gdGhhdCByZWZlcmVuY2VkIHRoZSAoUlVQKSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5Vc2VyLUludGVyZmFjZSBEZXNpZ25lcjwvc3Bhbj4gcm9sZSBub3cgcmVmZXJlbmNlIHRoZSByZXBsYWNpbmcgcm9sZSBpbnN0ZWFkIChlLmcuLCBpZiB5b3Ugb3BlbiB0aGUgZGlzY2lwbGluZXMgZm9sZGVyIGFuZCB2aWV3IHRoZSB0YXNrIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkRlc2lnbiBUaGUgVXNlciBJbnRlcmZhY2U8L3NwYW4+IHlvdSB3aWxsIHNlZSB0aGF0IHRoZSA8c3Ryb25nPlBlcmZvcm1pbmcgUm9sZSA8L3N0cm9uZz4gaXMgbm93IDxzcGFuIGNsYXNzPSJzdHlsZTEiPk15IFJlcGxhY2UgVUkgRGVzaWduZXI8L3NwYW4+LikgPHN0cm9uZz5SZXBsYWNlIDwvc3Ryb25nPiB3b3JrcyBpbiBhIHNpbWlsYXIgd2F5IGZvciA8c3Ryb25nPnRhc2tzPC9zdHJvbmc+LCA8c3Ryb25nPmFydGlmYWN0cyA8L3N0cm9uZz4sIDxzdHJvbmc+Z3VpZGFuY2UgPC9zdHJvbmc+IGFuZCA8c3Ryb25nPmNhdGVnb3JpZXMgPC9zdHJvbmc+IChmZWVsIGZyZWUgdG8gdHJ5IGl0IG91dCkuIDwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19pbnRyby5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2ludHJvLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzFhNzhjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2ludHJvLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+PC9hPjxhPjwvYT48YT48L2E+PGE+PC9hPjwvaDI+Ci08aDE+PGE+PC9hPjxhPlR1dG9yaWFsOiBDcmVhdGUgUmV1c2FibGUgTWV0aG9kIENvbnRlbnQgPC9hPjwvaDE+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIHR1dG9yaWFsIGlzIHRvIHVuZGVyc3RhbmQgdGhlIHZhcmlldHkgb2Ygd2F5cyBpbiB3aGljaCB0aGUgY29udGVudCBpbiBhIGJhc2UgcGx1Zy1pbiBjYW4gYmUgZXh0ZW5kZWQgYW5kIG1vZGlmaWVkIGJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIDwvcD4KLTxwPlRoZSCRQ3JlYXRlIENvcmUgTWV0aG9kIENvbnRlbnQnIHR1dG9yaWFsIHNob3dzIGhvdyB0byBjcmVhdGUgbmV3IGNvbnRlbnQgaW4gYSBwbHVnLWluLiBJbiB0aGlzIHR1dG9yaWFsIHdlIHdpbGwgc2VlIGhvdyB0byBleHRlbmQgZXhpc3RpbmcgY29udGVudCBpbiBhIHBsdWctaW4uIDwvcD4KLTxwPjxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+SW4gdGhlIGZvbGxvd2luZyBleGVyY2lzZXMgd2UgY3JlYXRlIHNlcGFyYXRlIENvbnRlbnQgUGFja2FnZXMgdG8gZGVtb25zdHJhdGUgZWFjaCBvZiB0aGUgd2F5cyB0aGF0IGEgbWV0aG9kIHBsdWctaW4gY2FuIG1vZGlmeSBjb250ZW50IGluIGFub3RoZXIgcGx1Zy1pbiAoaS5lLiBleHRlbmRzLCByZXBsYWNlcywgYW5kL29yIGNvbnRyaWJ1dGVzKS4gVGhpcyBpcyBmb3IgZWFzeSBpbGx1c3RyYXRpb24gb2YgdGhlIGVmZmVjdCBvZiBhcHBseWluZyBlYWNoIHR5cGUgb2YgbWV0aG9kIGVsZW1lbnQgdmFyaWFiaWxpdHkuIDwvcD4KLU1hbmFnaW5nIGNvbnRlbnQgdmlhIHRoZSBNZXRob2QgUGx1Zy1pbiBtZWNoYW5pc20gaXMgYSBrZXkgYW5kIHZlcnkgcG93ZXJmdWwgZmVhdHVyZSBvZiBFUEYgQ29tcG9zZXIuIFRoaXMgdHV0b3JpYWwgZXhwbG9yZXMgdGhlIGVmZmVjdHMgb2YgdGhlIGRpZmZlcmVudCB2YXJpYWJpbGl0eSB0eXBlcyBpbiB0aGUgZm9sbG93aW5nIGV4ZXJjaXNlcy4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfZXhfMS5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNDYzMzNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfZXhfMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgMTogUHVibGlzaGluZyBhIHByZS1kZWZpbmVkIGNvbmZpZ3VyYXRpb24gPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIHB1Ymxpc2ggYSA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gPC9zdHJvbmc+dGhhdCBpcyBpbmNsdWRlZCBpbiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD4gU2VsZWN0IHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBJbiB0aGUgPHN0cm9uZz5MaWJyYXJ5IFZpZXc8L3N0cm9uZz4sIG9wZW4gdGhlIENvbmZpZ3VyYXRpb25zIGZvbGRlciBhbmQgc2VsZWN0IHRoZSBjb25maWd1cmF0aW9uOiBNeSBSVVAgZm9yIFNtYWxsIFByb2plY3RzLiBUaGlzIG9wZW5zIHRoZSBDb25maWd1cmF0aW9uIEVkaXRvci4gCi0gICAgPHA+VGhlIFBsdWcgaW4gYW5kIFBhY2thZ2UgU2VsZWN0aW9uIHRhYiBzaG93cyB0aGUgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzIHdpdGhpbiBlYWNoIHBsdWctaW4gdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIENvbmZpZ3VyYXRpb24uIFRoZSBwbHVnLWlucyBhbmQgcGFja2FnZXMgaW4gdGhlIENvbmZpZ3VyYXRpb24gY2FuIGJlIGFkanVzdGVkIGJ5IHNlbGVjdGluZyBhbmQgZGVzZWxlY3RpbmcgdGhlbSBpbiB0aGUgdHJlZSBkaXNwbGF5LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgUmV2aWV3IDxzdHJvbmc+Q29uZmlndXJhdGlvbiA8L3N0cm9uZz48c3Ryb25nPlZpZXdzIDwvc3Ryb25nPjogKGkuZS4gaG93IHRoZSBwdWJsaXNoZWQgc2l0ZSB3aWxsIGJlIGxhaWQgb3V0KS4gCi0gICAgPHA+U2VsZWN0IHRoZSA8c3Ryb25nPlZpZXdzIDwvc3Ryb25nPiB0YWIgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZWRpdG9yLiBBIFZpZXcgaXMgYSBDdXN0b20gQ2F0ZWdvcnkgdGhhdCBpcyBkZXNpZ25lZCBmb3IgcHVibGljYXRpb24uIFJlcXVpcmVkIHBhY2thZ2VzIGFuZCBjb250ZW50IGVsZW1lbnRzIGFyZSBhc3NpZ25lZCB0byBhIEN1c3RvbSBDYXRlZ29yeS4gVGhlIEN1c3RvbSBDYXRlZ29yeSBjYW4gdGhlbiBiZSBhZGRlZCBhcyBhIFZpZXcgdG8gYSBDb25maWd1cmF0aW9uLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgU2VsZWN0IDxzdHJvbmc+RGVmYXVsdDwvc3Ryb25nPiBWaWV3LgotICAgIDxwPk9uZSBvZiB0aGUgdmlld3MgY2FuIGJlIHNlbGVjdGVkIGFzIHRoZSBEZWZhdWx0IFZpZXcgYnkgc2VsZWN0aW5nIHRoZSBWaWV3IGFuZCBjbGlja2luZyB0aGUgkU1ha2UgRGVmYXVsdCcgYnV0dG9uLiBXaGVuIHRoZSBjb25maWd1cmF0aW9uIGlzIHB1Ymxpc2hlZCwgdGhlIERlZmF1bHQgVmlldyB3aWxsIGJlIHNlbGVjdGVkIHdoZW4gdGhlIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIGlzIG9wZW5lZCBpbiB0aGUgRVBGIENvbXBvc2VyIEJyb3dzZXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDbG9zZSB0aGUgY29uZmlndXJhdGlvbiBlZGl0b3IuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgPHN0cm9uZz5NeSBSVVAgZm9yIFNtYWxsIFByb2plY3RzPC9zdHJvbmc+IGluIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGlvbiBib3ggaW4gdGhlIEVQRiBDb21wb3NlciB0b29sYmFyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2VsZWN0IDxzdHJvbmc+Q29uZmlndXJhdGlvbiAmZ3Q7IFB1Ymxpc2ggPC9zdHJvbmc+IGZyb20gdGhlIG1haW4gbWVudSBiYXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBTdGVwIHRocm91Z2ggUHVibGlzaCB3aXphcmQsIGFjY2VwdGluZyB0aGUgZGVmYXVsdHMsIGFuZCBwdWJsaXNoIHRoZSBjb25maWd1cmF0aW9uLiBJdCB3aWxsIHRha2UgYSBmZXcgbWludXRlcyB0byBnZW5lcmF0ZSB0aGUgd2ViIHNpdGUuIEFzc3VtaW5nIHRoYXQgeW91IGhhdmUgdGhlIHJpZ2h0IGphdmEgZW52aXJvbm1lbnQsIHRoZSBFUEYgQ29tcG9zZXIgQnJvd3NlciBhcHBsZXQgc2hvdWxkIGxhdW5jaCBhbGxvd2luZyB5b3UgdG8gdmlldyB0aGUgcmVzdWx0aW5nIHB1Ymxpc2hlZCB3ZWIgc2l0ZSAoYWNjZXB0IHRoZSBzZWN1cml0eSB3YXJuaW5ncyB3aGVuIHRoZSBhcHBsZXQgZmlyZXMgdXApLiA8L2xpPgotPC9vbD4KLTxibG9ja3F1b3RlPgotICA8cD48c3Ryb25nPk5vdGU6IDwvc3Ryb25nPiBUaGUgcHVibGlzaGVkIHdlYiBzaXRlIGhhcyBhIHJpY2hlciBvcmdhbml6YXRpb24gYW5kIGxheS1vdXQgYXMgZGVmaW5lZCBieSB0aGUgQ29uZmlndXJhdGlvbiBWaWV3LCBhcyBjb21wYXJlZCB0byB0aGUgbW9yZSBzaW1wbGUgdmlldyBvZiB0aGUgY29uZmlndXJhdGlvbiBjb250ZW50IGF2YWlsYWJsZSB3aXRoaW4gdGhlIEVQRiBDb21wb3NlciA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gVmlldzwvc3Ryb25nPi4gPC9wPgotPC9ibG9ja3F1b3RlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF8yLmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfZXhfMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFjYzhlMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF8yLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSAyOiBDcmVhdGUgTmV3IEN1c3RvbSBDYXRlZ29yeSA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gdW5kZXJzdGFuZCBhbmQgdXNlIDxzdHJvbmc+Q3VzdG9tIENhdGVnb3JpZXMgPC9zdHJvbmc+LiA8L3A+Ci08cD48c3Ryb25nPkN1c3RvbSBDYXRlZ29yaWVzIDwvc3Ryb25nPiBhbGxvdyB5b3UgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGFjY29yZGluZyB0byBhbnkgc2NoZW1lIHlvdSB3YW50LiBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gdGhlbiBiZSB1c2VkIHRvIGNvbXBvc2UgcHVibGlzaGFibGUgPHN0cm9uZz5WaWV3cyA8L3N0cm9uZz4gcHJvdmlkaW5nIGEgbWVhbnMgdG8gb3JnYW5pemUgbWV0aG9kIGNvbnRlbnQgcHJpb3IgdG8gcHVibGlzaGluZy4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+TWFrZSBzdXJlIHlvdSBhcmUgaW4gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IE5hdmlnYXRlIHRvIDxzdHJvbmc+TXkgUGx1Zy1pbiAmZ3Q7IE1ldGhvZCBDb250ZW50ICZndDsgQ3VzdG9tIENhdGVnb3JpZXM8L3N0cm9uZz4uIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IGNyZWF0ZWQgdGhpcyBwbHVnaW4sIGNyZWF0ZSBpdCBub3csIG9yIGdvIHRocm91Z2ggdGhlIDx1PkNyZWF0ZSBDb3JlIE1ldGhvZCBDb250ZW50PC91PiB0dXRvcmlhbC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENyZWF0ZSBhIG5ldyBjdXN0b20gY2F0ZWdvcnkgbmFtZWQsIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2N1c3RvbV9jYXRlZ29yeTwvc3Bhbj4uIFJpZ2h0LWNsaWNrIG9uIHRoZSA8c3Ryb25nPkN1c3RvbSBDYXRlZ29yaWVzPC9zdHJvbmc+IGZvbGRlciwgaGlnaGxpZ2h0IDxzdHJvbmc+TmV3LCA8L3N0cm9uZz4gYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5DdXN0b20gQ2F0ZWdvcnkgPC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgT3BlbiB0aGUgPHN0cm9uZz5Bc3NpZ24gPC9zdHJvbmc+IHRhYi4gSWYgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2NvbnRlbnRfcGFja2FnPC9zcGFuPmUsIGFkZCB0aGUgPHN0cm9uZz5yb2xlcyA8L3N0cm9uZz4sIDxzdHJvbmc+YXJ0aWZhY3RzPC9zdHJvbmc+LCA8c3Ryb25nPnRhc2tzLCA8L3N0cm9uZz4gYW5kIDxzdHJvbmc+Z3VpZGFuY2UgPC9zdHJvbmc+IGZyb20gaXQgaW50byB0aGUgY3VzdG9tIGNhdGVnb3J5LiBJZiB5b3UgZG8gbm90IGhhdmUgdGhpcyBwYWNrYWdlLCBhZGQgY29udGVudCBmcm9tIGFub3RoZXIgYXJlYSBpbiB0aGUgbGlicmFyeS4gPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+PHN0cm9uZz5Ob3RlOiA8L3N0cm9uZz4gWW91IGNhbiBkbyBtdWx0aXBsZSBzZWxlY3QgdXNpbmcgc2hpZnQgb3IgY29udHJvbCBrZXkgLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPgotICAgIDxwPiBBZGQgdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPnJ1cF9hbmFseXNpc19kZXNpZ25fZGlzY2lwbGluZTwvc3Bhbj4uIFlvdSB3aWxsIGZpbmQgdGhpcyB1bmRlciA8c3Ryb25nPlJVUCAmZ3Q7IERpc2NpcGxpbmVzICZndDsgcnVwX2Rpc2NpcGxpbmVzLiA8L3N0cm9uZz48L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gT3BlbiBvbmUgb2YgdGhlIGVsZW1lbnRzIHlvdSBhc3NpZ25lZCB0byB0aGUgbmV3IGN1c3RvbSBjYXRlZ29yeS4gT2JzZXJ2ZSBob3cgdGhlIGN1c3RvbSBjYXRlZ29yeSBpcyBub3cgcmVmbGVjdGVkIGluIHRoZSA8c3Ryb25nPkNhdGVnb3JpZXMgPC9zdHJvbmc+IHRhYi4gPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzMuaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF8zLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjRkMTM5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDM6IENyZWF0ZSBhIGN1c3RvbWl6ZWQgY29uZmlndXJhdGlvbiA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gY3JlYXRlIHlvdXIgb3duIGN1c3RvbWl6ZWQgY29uZmlndXJhdGlvbi4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+TWFrZSBzdXJlIHlvdSBhcmUgaW4gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgPHN0cm9uZz5GaWxlICZndDsgTmV3ICZndDsgQ29uZmlndXJhdGlvbjwvc3Ryb25nPi4gT3IsIHlvdSBjYW4gcmlnaHQtY2xpY2sgb24gdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbnM8L3N0cm9uZz4gZm9sZGVyIGluIHRoZSBMaWJyYXJ5IFZpZXcgYW5kIHNlbGVjdCA8c3Ryb25nPk5ldyBDb25maWd1cmF0aW9uLiA8L3N0cm9uZz5UaGUgQ29uZmlndXJhdGlvbiBFZGl0b3IgaXMgbGF1bmNoZWQuPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IE5hbWUgdGhlIGNvbmZpZ3VyYXRpb24sIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2NvbmZpZ3VyYXRpb248L3NwYW4+LjwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDbGljayBvbiB0aGUgPHN0cm9uZz5QbHVnLWluIGFuZCBQYWNrYWdlIFNlbGVjdGlvbiA8L3N0cm9uZz4gdGFiLiBJbiB0aGUgbGlzdCBvZiBQbHVnaW5zLCBjaGVjayBNeSBQbHVnaW4gdGhhdCB5b3UgY3JlYXRlZCBpbiB0aGUgPHU+Q3JlYXRlIENvcmUgTWV0aG9kIENvbnRlbnQ8L3U+IHR1dG9yaWFsLiBUaGlzIHBsdWdpbiBoYXMgUlVQIGFzIGEgYmFzZSBhbmQgcmVmZXJlbmNlcyBwYXJ0cyBvZiB0aGUgUlVQIGNvbnRlbnQsIGFuZCBhbHNvIGhhcyBlbGVtZW50cyB0aGF0IGV4dGVuZCwgY29udHJpYnV0ZSB0bywgYW5kIHJlcGxhY2UgYmFzZSBSVVAgY29udGVudC4gPGJyPgotICAgICAgSWYgeW91IGRvIG5vdCBoYXZlIHRoaXMgcGx1Z2luLCBjb25zaWRlciBjb21wbGV0aW5nIHRoZSA8dT5DcmVhdGUgQ29yZSBNZXRob2QgQ29udGVudDwvdT4gdHV0b3JpYWwgYmVmb3JlIGNvbnRpbnVpbmcgd2l0aCB0aGlzIHR1dG9yaWFsLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gVGhlIGRpc3BsYXkgd2lsbCBnaXZlIHlvdSBhIHNlcmllcyBvZiB3YXJuaW5ncyBhbmQgdGhlIExpYnJhcnkgRXJyb3IgTG9nIHZpZXcgd2lsbCBiZSBkaXNwbGF5ZWQuIDxicj4KLSAgICAgIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgZ2l2ZXMgdGhlc2Ugd2FybmluZ3MgdG8gaGVscCBlbnN1cmUgdGhhdCB5b3UgY3JlYXRlIGEgY29uZmlndXJhdGlvbiB0aGF0IJFtYWtlcyBzZW5zZScuIElmIHlvdSByZWZlcmVuY2UgYW4gZWxlbWVudCwgeW91IHdpbGwgb25seSBiZSBhYmxlIHRvIHNlZSB0aGUgZnVsbCBkZXRhaWxzIGZvciB0aGF0IGVsZW1lbnQgaW4gYSBwdWJsaXNoZWQgd2ViIHNpdGUgaWYgdGhlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgZWxlbWVudCBpcyBpbiB0aGUgY29uZmlndXJhdGlvbi4gSWYgdGhlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgZWxlbWVudCBpcyBub3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIHRoZSCRb2ZmZW5kaW5nJyBwYWNrYWdlIGlzIG1hcmtlZCBhcyBhIHdhcm5pbmcgliB5b3UgbWF5IGNob29zZSBub3QgdG8gaW5jbHVkZSB0aGUgZnVsbCBkZXRhaWxzIG9mIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDaGVjayB0aGUgPHN0cm9uZz5BZGQgTWlzc2luZyBSZWZlcmVuY2VzPC9zdHJvbmc+IGJ1dHRvbi4gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgYW5kIHJlY3Vyc2l2ZWx5IGFkZCBwYWNrYWdlcyBjb250YWluaW5nIGFueSBlbGVtZW50cyB0aGF0IGFyZSByZWZlcmVuY2VkIGluIGFscmVhZHkgc2VsZWN0ZWQgcGFja2FnZXMuIEV4cGxvcmUgd2hhdCBwYWNrYWdlcyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGNvbmZpZ3VyYXRpb24uIFlvdSB3aWxsIHByb2JhYmx5IG5vdyBzZWUgYWxsIG9mIFJVUCBzZWxlY3RlZC4gVGhpcyBpcyBiZWNhdXNlIG9mIHRoZSBpbnRlci1jb25uZWN0ZWQgbmF0dXJlIG9mIFJVUC4gVW5jaGVjayBSVVAgdG8gcmVzdG9yZSB0aGUgd2FybmluZ3MuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBEcmlsbCBkb3duIGludG8gdGhlIGNvbnRlbnQgcGFja2FnZXMgaW4gdGhlIE15IFBsdWdpbiwgcGx1Z2luIHBhY2thZ2UgICBieSBjbGlja2luZyBvbiB0aGUgPHN0cm9uZz4rPC9zdHJvbmc+IHNpZ25zLiBVbmNoZWNrIHRoZTxzdHJvbmc+IEV4dGVuZHMgVGVzdCA8L3N0cm9uZz5hbmQgPHN0cm9uZz5SZXBsYWNlIFRlc3QgPC9zdHJvbmc+Y29udGVudCBwYWNrYWdlcy4gVW5jaGVja2luZyB0aGVzZSBhdm9pZHMgY29uZmxpY3RzIHRoYXQgbWF5IG9jY3VyIGJlY2F1c2UgdGhlIHNhbWUgYmFzZSBlbGVtZW50IGlzIGFmZmVjdGVkIGJ5IHRoZSBwbHVnaW5zLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gVGhlcmUgc2hvdWxkIGJlIGEgPHN0cm9uZz4rPC9zdHJvbmc+IGJ5IHRoZSA8c3Ryb25nPkNvbnRyaWJ1dGlvbiBUZXN0PC9zdHJvbmc+IHBhY2thZ2UuIENsaWNrIHRoZSA8c3Ryb25nPk1ha2UgQ2xvc3VyZSBieSBGaXhpbmcgRXJyb3JzPC9zdHJvbmc+IGJ1dHRvbi4gVGhpcyBhdXRvbWF0aWNhbGx5IG1ha2VzIHlvdXIgY29uZmlndXJhdGlvbiBjb21wbGV0ZSBiYXNlZCBvbiB3aGF0IGlzIGN1cnJlbnRseSBzZWxlY3RlZC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IERyaWxsIGRvd24gaW50byB0aGUgUlVQIHBsdWdpbiwgYW5kIHNlZSB3aGF0IHBhY2thZ2VzIGhhdmUgYmVlbiBzZWxlY3RlZC4gVGhlc2Ugd2lsbCBiZSB0aGUgcGFja2FnZXMgdGhhdCBjb250YWluIHRoZSBlbGVtZW50cyB1c2VkIGFzIGJhc2UgZWxlbWVudHMgaW4gdGhlIENvbmZpZ3VyYXRpb24gVGVzdCBjb250ZW50IHBhY2thZ2UuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBDbGljayBvbiB0aGUgPHN0cm9uZz5WaWV3czwvc3Ryb25nPiB0YWIuIAotICAgIDxwPkFueSBjdXN0b20gY2F0ZWdvcnkgY2FuIGJlIGFkZGVkIGFzIGEgdmlldyB0byBhIGNvbmZpZ3VyYXRpb24uIFlvdSBjYW4gY3JlYXRlZCBhbnkgbnVtYmVyIG9mIGN1c3RvbSBjYXRlZ29yaWVzIGFuZCB0aGV5IGFyZSB2ZXJ5IGZsZXhpYmxlIGluIHRlcm1zIG9mIHRoZSBjb250ZW50IHRoYXQgeW91IGNhbiBhZGQgdG8gYSBjdXN0b20gY2F0ZWdvcnkgYW5kIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgY29udGVudCBhcHBlYXJzLiA8L3A+Ci0gICAgPHA+QWRkIHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9jdXN0b21fY2F0ZWdvcnk8L3NwYW4+IGN1c3RvbSBjYXRlZ29yeSBhcyBhIHZpZXcgaW4gdGhlIGNvbmZpZ3VyYXRpb24uIDwvcD4KLSAgICA8cD5FeHBlcmltZW50IHdpdGggYWRkaW5nIG90aGVyIGN1c3RvbSBjYXRlZ29yaWVzIGFzIHZpZXdzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gTWFrZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9jdXN0b21fY2F0ZWdvcnk8L3NwYW4+IHRoZSBkZWZhdWx0IHZpZXcgYnkgc2VsZWN0aW5nIHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9jdXN0b21fY2F0ZWdvcnk8L3NwYW4+IHRhYiBhbmQgY2xpY2tpbmcgdGhlIDxzdHJvbmc+TWFrZSBEZWZhdWx0PC9zdHJvbmc+IGJ1dHRvbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNhdmUgdGhlIGNvbmZpZ3VyYXRpb24gYnkgY2xvc2luZyB0aGUgQ29uZmlndXJhdGlvbiBFZGl0b3IuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfY29uZmlndXJhdGlvbjwvc3Bhbj4gaW4gdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0aW9uIGJveCBhdCB0aGUgdG9wIG9mIHRoZSBzY3JlZW4uIFlvdSB3aWxsIHNlZSB0aGUgaXRlbXMgZGlzcGxheWVkIGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXcgY2hhbmdlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gU3dpdGNoIHRvIHRoZSA8c3Ryb25nPkJyb3dzaW5nPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiBFeHBsb3JlIHRoZSBjb250ZW50IGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuIFlvdSBzaG91bGQgc2VlIHRoZSBjb250ZW50IHlvdSBjcmVhdGVkIGluIHlvdXIgcGx1Z2lucyBhbmQgc29tZSBSVVAgY29udGVudC4gPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzQuaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF80Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2Q4YmUxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDQ6IFB1Ymxpc2hpbmcgYSBjdXN0b20gY29uZmlndXJhdGlvbiA8L2E+PC9oMj4KLTxvbD4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgPHN0cm9uZz5Db25maWd1cmF0aW9uICZndDsgUHVibGlzaCA8L3N0cm9uZz4gZnJvbSB0aGUgbWFpbiBtZW51IGJhci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNlbGVjdCBteS1jb25maWd1cmF0aW9uIGluIHRoZSBsaXN0IG9mIGNvbmZpZ3VyYXRpb25zLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gU3RlcCB0aHJvdWdoIFB1Ymxpc2ggd2l6YXJkLCBhY2NlcHRpbmcgdGhlIGRlZmF1bHRzLCBhbmQgcHVibGlzaCB0aGUgY29uZmlndXJhdGlvbi4gSXQgd2lsbCB0YWtlIGEgZmV3IG1pbnV0ZXMgdG8gZ2VuZXJhdGUgdGhlIHdlYiBzaXRlLiBBc3N1bWluZyB0aGF0IHlvdSBoYXZlIHRoZSByaWdodCBqYXZhIGVudmlyb25tZW50LCB0aGUgRVBGIENvbXBvc2VyIEJyb3dzZXIgYXBwbGV0IHNob3VsZCBsYXVuY2ggYWxsb3dpbmcgeW91IHRvIHZpZXcgdGhlIHJlc3VsdGluZyBwdWJsaXNoZWQgd2ViIHNpdGUgKGFjY2VwdCB0aGUgc2VjdXJpdHkgd2FybmluZ3Mgd2hlbiB0aGUgYXBwbGV0IGZpcmVzIHVwKS4gPC9saT4KLTwvb2w+Ci08YmxvY2txdW90ZT4KLSAgPHA+PHN0cm9uZz5Ob3RlOiA8L3N0cm9uZz4gVGhlIHB1Ymxpc2hlZCB3ZWIgc2l0ZSBoYXMgYSByaWNoZXIgb3JnYW5pemF0aW9uIGFuZCBsYXktb3V0IGFzIGRlZmluZWQgYnkgdGhlIENvbmZpZ3VyYXRpb24gVmlldywgYXMgY29tcGFyZWQgdG8gdGhlIG1vcmUgc2ltcGxlIHZpZXcgb2YgdGhlIGNvbmZpZ3VyYXRpb24gY29udGVudCBhdmFpbGFibGUgd2l0aGluIHRoZSBFUEYgQ29tcG9zZXIgPHN0cm9uZz5Db25maWd1cmF0aW9uIFZpZXcgPC9zdHJvbmc+LiA8L3A+Ci08L2Jsb2NrcXVvdGU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2ludHJvLmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfaW50cm8uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MjFkYjdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfaW50cm8uaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgxPjxhPlR1dG9yaWFsOiBQdWJsaXNoaW5nIGFuZCBFeHBvcnRpbmcgPC9hPjwvaDE+Ci08cD5FUEYgQ29tcG9zZXIgaXMgZXNzZW50aWFsbHkgYSBjb250ZW50IG1hbmFnZW1lbnQgYXBwbGljYXRpb24uIFRoZSB1bHRpbWF0ZSBvdXRwdXQgb2YgRVBGIENvbXBvc2VyIGlzIGEgV2ViIHNpdGUgd2l0aCBwdWJsaXNoZWQgbWV0aG9kIGd1aWRhbmNlIGFuZCBwcm9jZXNzZXMgdGhhdCBjYW4gYmUgdmlld2VkIGJ5IGEgcHJvamVjdCB0ZWFtLiA8L3A+Ci08cD5FUEYgQ29tcG9zZXIgbWFrZXMgaXQgZWFzeSB0byBjb25maWd1cmUgYSBwcm9jZXNzIGZvciBhIHBhcnRpY3VsYXIgdHlwZSBvciBzaXplIG9mIHByb2plY3QgYW5kIHRvIHB1Ymxpc2ggdGhlIGd1aWRhbmNlIHRvIGEgV2ViIHNpdGUuIEEgTWV0aG9kIDxzdHJvbmc+Q29uZmlndXJhdGlvbiA8L3N0cm9uZz4gaXMgYSBzZWxlY3Rpb24gb2YgPHN0cm9uZz5Db250ZW50IFBhY2thZ2VzIDwvc3Ryb25nPiBhY3Jvc3MgZGlmZmVyZW50IDxzdHJvbmc+TWV0aG9kIFBsdWctaW5zIDwvc3Ryb25nPiBjb250YWluaW5nIHRoZSBtZXRob2QgYW5kIHByb2Nlc3MgY29udGVudCB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHB1Ymxpc2hlZCB3ZWIgc2l0ZS4gQXQgcHVibGlzaGluZyB0aW1lLCB0aGUgY29uZmlndXJhdGlvbiBpcyBjb21iaW5lZCB3aXRoIGRpZmZlcmVudCBNZXRob2QgPHN0cm9uZz5WaWV3cyA8L3N0cm9uZz4gd2hpY2ggZGVmaW5lIHRoZSB3ZWJzaXRlJ3MgbmF2aWdhdGlvbiBzdHJ1Y3R1cmVzIGFuZCBjb250ZW50IG9yZ2FuaXphdGlvbi4gPC9wPgotPHA+VGhlIEVQRiBDb21wb3NlciA8c3Ryb25nPkJyb3dzaW5nIFBlcnNwZWN0aXZlIDwvc3Ryb25nPiByZW5kZXJzIHRoZSBNZXRob2QgPHN0cm9uZz5Db25maWd1cmF0aW9uIDwvc3Ryb25nPiBjb250ZW50IGluIGh0bWwgZm9ybWF0IHdpdGhpbiBFUEYgQ29tcG9zZXIsIHByb3ZpZGluZyBhIG5hdmlnYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgY29udGVudCBhc3NvY2lhdGVkIHdpdGggdGhhdCBDb25maWd1cmF0aW9uLiA8L3A+Ci08cD5UaGlzIHR1dG9yaWFsIHVzZXMgY29udGVudCB0aGF0IGlzIGNyZWF0ZWQgaW4gdGhlIJFDcmVhdGUgQ29yZSBNZXRob2QgQ29udGVudCcgYW5kIJFFeHRlbmRpbmcgYmFzZSBtZXRob2QgY29udGVudCB1c2luZyBWYXJpYWJpbGl0eScgdHV0b3JpYWxzLiA8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzEuaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF8xLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGIyYjgxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDE6IEJyb3dzZSBQcm9jZXNzIENvbnRlbnQgdXNpbmcgQnJvd3NpbmcgUGVyc3BlY3RpdmUgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGdldCBhIGJhc2ljIHVuZGVyc3RhbmRpbmcgb2YgcHJvY2Vzc2VzIGluIEVQRiBDb21wb3Nlci4gPC9wPgotPHA+KE5vdGUgdGhhdCB0aGlzIGlzIGEgcmVwZWF0IG9mIGV4ZXJjaXNlIDIgaW4gdGhlIDx1PkJyb3dzZSB0aGUgTGlicmFyeTwvdT4gdHV0b3JpYWwuKSA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5NYWtlIHN1cmUgeW91IGFyZSBpbiB0aGUgPHN0cm9uZz5Ccm93c2luZzwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNlbGVjdCB0aGUgPHN0cm9uZz5NeSBSVVAgZm9yIFNtYWxsIFByb2plY3RzPC9zdHJvbmc+IGNvbmZpZ3VyYXRpb24uIElmIHlvdSBoYXZlIG5vdCBjcmVhdGVkIHRoaXMgY29uZmlndXJhdGlvbiwgc2VsZWN0IHRoZSA8c3Ryb25nPlJVUCBmb3IgU21hbGwgUHJvamVjdHM8L3N0cm9uZz4gY29uZmlndXJhdGlvbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFRvIHZpZXcgYSBDYXBhYmlsaXR5IFBhdHRlcm4sIGNsaWNrIDxzdHJvbmc+UHJvY2Vzc2VzICZndDsgQ2FwYWJpbGl0eSBQYXR0ZXJucyAmZ3Q7IENsYXNzaWMgUlVQICZndDsgRGlzY2lwbGluZSBXb3JrZmxvd3MgJmd0OyBBbmFseXNpcyBhbmQgRGVzaWduPC9zdHJvbmc+LiBBIHByZXZpZXcgb2YgdGhlIHB1Ymxpc2hlZCBXZWIgcGFnZSBmb3IgdGhlIHNlbGVjdGVkIENhcGFiaWxpdHkgUGF0dGVybiBpcyBkaXNwbGF5ZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBIENhcGFiaWxpdHkgUGF0dGVybiBjb250YWlucyBhIGxhcmdlIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBhbmQgaXMgZGlzcGxheWVkIG92ZXIgZm91ciB0YWJzIJYgPHN0cm9uZz5EZXNjcmlwdGlvbiwgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgVXNhZ2UsIDwvc3Ryb25nPmFuZDxzdHJvbmc+IFRlYW0gQWxsb2NhdGlvbjwvc3Ryb25nPi4gRXhwbG9yZSB0aGUgaW5mb3JtYXRpb24gb24gZWFjaCB0YWIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPlRvIHZpZXcgYSBEZWxpdmVyeSBQcm9jZXNzLCBjbGljayA8c3Ryb25nPlByb2Nlc3NlcyAmZ3Q7IERlbGl2ZXJ5IFByb2Nlc3NlcyAmZ3Q7IENsYXNzaWMgUlVQIExpZmVjeWNsZTwvc3Ryb25nPi4gVGhlIGRpc3BsYXkgZm9yIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBzaW1pbGFyIHRvIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuLiA8L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfMi5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MThlZmE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPkV4ZXJjaXNlIDI6IEV4cGxvcmUgYSBQcm9jZXNzIHVzaW5nIEF1dGhvcmluZyBwZXJzcGVjdGl2ZSA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgdHV0b3JpYWwgaXMgdG8gZXhwbG9yZSB0aGUgaW5mb3JtYXRpb24gYW5kIGVkaXRvcnMgZm9yIHByb2Nlc3Nlcy4gQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgdXNlZCBhcyBhbiBleGFtcGxlIGJ1dCB0aGUgc2FtZSBhcHBsaWVzIHRvIERlbGl2ZXJ5IFByb2Nlc3Nlcy4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+SW4gdGhlIExpYnJhcnkgVmlldywgY2xpY2sgPHN0cm9uZz5SVVAgJmd0OyBQcm9jZXNzZXMgJmd0OyBDYXBhYmlsaXR5IFBhdHRlcm5zICZndDsgQ2xhc3NpYyBSVVAgJmd0OyBEaXNjaXBsaW5lIFdvcmtmbG93czwvc3Ryb25nPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+RG91YmxlIGNsaWNrIHRoZSA8c3Ryb25nPkFuYWx5c2lzIGFuZCBEZXNpZ24gQ2FwYWJpbGl0eSBQYXR0ZXJuPC9zdHJvbmc+IGFuZCBleGFtaW5lIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPlRoZSA8c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+IHRhYiBwcm92aWRlcyBhIG51bWJlciBvZiBzZWN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGZ1bGx5IGRlc2NyaWJlIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4uIAotICAgIDxwPkEgQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIERlbGl2ZXJ5IFByb2Nlc3MgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYXQgbGVhc3Qgb25lIGNvbmZpZ3VyYXRpb24gYnV0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggbWFueS4gVGhlIGNvbmZpZ3VyYXRpb24gc2V0cyB0aGUgc2NvcGUgZm9yIGNvcmUgbWV0aG9kIGNvbnRlbnQgYW5kIG90aGVyIHByb2Nlc3MgZWxlbWVudHMgdGhhdCBjYW4gYmUgaW5jbHVkZWQgaW4gYSBwcm9jZXNzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQ2xpY2sgdGhlIDxzdHJvbmc+V29yayBCcmVha2Rvd24gU3RydWN0dXJlPC9zdHJvbmc+IHRhYi4gCi0gICAgPHA+VGhpcyBzaG93cyB0aGUgQWN0aXZpdGllcyBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIGFuZCB0aGUgKGNvcmUgbWV0aG9kIGNvbnRlbnQpIHRhc2tzIHRoYXQgYXJlIGluY2x1ZGVkIGluIGVhY2ggQWN0aXZpdHkuIDwvcD4KLSAgICA8cD5XaGVuIGEgdGFzayBpcyBhZGRlZCB0byBhIHByb2Nlc3MsIHRoZSByb2xlcyBhbmQgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2sgYXJlIGFsc28gcHVsbGVkIGludG8gdGhlIHByb2Nlc3MuIDwvcD4KLSAgICA8cD5FYWNoIHRhc2ssIHJvbGUsIGFuZCB3b3JrIHByb2R1Y3Qgc2hvd24gaW4gdGhlIGFjdGl2aXR5IGlzIGFjdHVhbGx5IGFuIGluc3RhbmNlIG9mIHRoZSBlbGVtZW50IGFzIGl0IGlzIHVzZWQgYXQgdGhlIHBhcnRpY3VsYXIgcG9pbnQgaW4gdGhlIHByb2Nlc3MuIFNvIHdoYXQgeW91IHNlZSBpbiB0aGUgcHJvY2VzcyBhcmUgYWN0dWFsbHkgVGFzayBEZXNjcmlwdG9ycywgUm9sZSBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQ2xpY2sgdGhlIDxzdHJvbmc+VGVhbSBBbGxvY2F0aW9uPC9zdHJvbmc+IHRhYi4gCi0gICAgPHA+VGhpcyBzaG93cyB0aGUgYWN0aXZpdGllcyBpbiB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGFuZCB0aGUgcm9sZXMgdGhhdCBhcmUgdGhlIHBlcmZvcm1lcnMgb2YgdGhlIHRhc2tzIGluIHRoZSBhY3Rpdml0aWVzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQ2xpY2sgdGhlIDxzdHJvbmc+V29yayBQcm9kdWN0IFVzYWdlPC9zdHJvbmc+IHRhYi4gCi0gICAgPHA+VGhpcyBzaG93cyB0aGUgYWN0aXZpdGllcyBpbiB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGFuZCB0aGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBpbnB1dCBhbmQgb3V0cHV0cyBvZiB0aGUgdGFza3MgaW4gdGhlIGFjdGl2aXRpZXMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBDbGljayBvbiB0aGUgPHN0cm9uZz5Db25zb2xpZGF0ZWQgVmlldzwvc3Ryb25nPiB0YWIuIAotICAgIDxwPlRoaXMgc2hvd3MgdGhlIGZ1bGwgc2V0IG9mIGluZm9ybWF0aW9uIGZvciBlYWNoIGFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4uIEl0IHNob3dzIHRoZSB0YXNrcywgd29yayBwcm9kdWN0cyBhbmQgcm9sZXMgd2l0aGluIGVhY2ggYWN0aXZpdHkuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBSaWdodCBjbGljayBhbnkgPHN0cm9uZz50YXNrIDwvc3Ryb25nPiBpbiB0aGUgPHN0cm9uZz5Xb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUgdmlldywgPC9zdHJvbmc+IGFuZCBjbGljayBvbiA8c3Ryb25nPlNob3cgUHJvcGVydGllcyBWaWV3PC9zdHJvbmc+LiAKLSAgICA8cD5UaGlzIGRpc3BsYXlzIGEgbmV3IHZpZXcgdGhhdCBzaG93cyBhbGwgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YXNrICh0YXNrIGRlc2NyaXB0b3IpIGFzIGl0IGlzIHVzZWQgaW4gdGhlIHByb2Nlc3MgYW5kIGFsbG93cyB5b3UgdG8gY3VzdG9taXplIHRoZSB0YXNrIGFzIGl0IGlzIHVzZWQgYXQgdGhpcyBwb2ludCBpbiB0aGUgcHJvY2Vzcy4gPC9wPgotICAgIDxwPlRoZSBQcm9wZXJ0aWVzIFZpZXcgaGFzIGEgbnVtYmVyIG9mIHRhYnMgdGhhdCBvcmdhbml6ZSB0aGUgdGFzayBkZXNjcmlwdG9yIGluZm9ybWF0aW9uLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbGljayBvbiB0aGUgPHN0cm9uZz5Eb2N1bWVudGF0aW9uPC9zdHJvbmc+IHRhYi4gVGhpcyBhbGxvd3MgeW91IHRvIGVudGVyIGluZm9ybWF0aW9uIHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhpcyBUYXNrIERlc2NyaXB0b3IuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIG9uIHRoZSA8c3Ryb25nPlJvbGVzPC9zdHJvbmc+IHRhYi4gVGhpcyBhbGxvd3MgeW91IHRvIHJlcGxhY2UsIHJlbW92ZSBvciBhZGQgdG8gdGhlIHJvbGVzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29yZSBtZXRob2QgdGFzayBmb3IgdGhpcyBzcGVjaWZpYyBpbnN0YW5jZSBvZiB0aGUgdGFzayBpbiB0aGUgcHJvY2Vzcy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgb24gdGhlIDxzdHJvbmc+V29yayBQcm9kdWN0czwvc3Ryb25nPiB0YWIuIFRoaXMgYWxsb3dzIHlvdSB0byByZXBsYWNlLCByZW1vdmUgb3IgYWRkIHRvIHRoZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29yZSBtZXRob2QgdGFzayBmb3IgdGhpcyBzcGVjaWZpYyBpbnN0YW5jZSBvZiB0aGUgdGFzayBpbiB0aGUgcHJvY2Vzcy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgb24gdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gdGFiLiBUaGlzIGFsbG93cyB5b3UgdG8gYWRqdXN0IHRoZSB0YXNrIHN0ZXBzIGFzIHRoZXkgYXJlIGFwcGxpZWQgYXQgdGhpcyBwb2ludCBpbiB0aGUgcHJvY2Vzcy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+V2hlbiBhIHJvbGUgaXMgc2VsZWN0ZWQgaW4gdGhlIFRlYW0gQWxsb2NhdGlvbiB2aWV3LCBvciBhIHdvcmsgcHJvZHVjdCBpcyBzZWxlY3RlZCBpbiB0aGUgV29yayBQcm9kdWN0IFVzYWdlIHZpZXcsIHRoZSBQcm9wZXJ0aWVzIFZpZXcgYWxsb3dzIHlvdSB0byBlZGl0IHRoZXNlIGVsZW1lbnRzIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwcm9jZXNzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5DbGljayBvbiBhbiA8c3Ryb25nPkFjdGl2aXR5PC9zdHJvbmc+IGluIHRoZSBwcm9jZXNzLiA8YnI+Ci0gICAgVGhlIHByb3BlcnRpZXMgdmlldyBhbGxvd3MgeW91IHRvIHNlZSByb2xsLXVwcyBvZiB0aGUgdGFza3MsIHJvbGVzLCBhbmQgd29yayBwcm9kdWN0cyBpbiB0aGUgYWN0aXZpdHkuIFJvbGwtdXBzIGNhbiBhbHNvIGJlIGRpc3BsYXllZCBpbiB0aGUgbWFpbiBjb250ZW50IHdpbmRvdyBieSBzZWxlY3RpbmcgdGhlIDxzdHJvbmc+Um9sbC1VcDwvc3Ryb25nPiBvcHRpb24gaW4gdGhlIGNvbnRleHQgc2Vuc2l0aXZlIG1lbnUuIFRoZSBSb2xsLVVwIHZpZXcgY2FuIGJlIHR1cm5lZCBvZmYgYnkgc2VsZWN0aW5nLCA8c3Ryb25nPlJvbGwtRG93bjwvc3Ryb25nPi4gPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzMuaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF8zLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTQzNWFmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT5FeGVyY2lzZSAzOiBDcmVhdGUgYSBEZWxpdmVyeSBQcm9jZXNzIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBsZWFybiBob3cgdG8gY3JlYXRlIGEgZGVsaXZlcnkgcHJvY2VzcyB1c2luZyBjb3JlIG1ldGhvZCBjb250ZW50IGRpcmVjdGx5LiA8L3A+Ci08cD5JbiA8c3Ryb25nPlByb2Nlc3MgQXV0aG9yaW5nIDwvc3Ryb25nPiB3ZSBkbyBub3QgZGlyZWN0bHkgaW5jbHVkZSB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIGNvcmUgbWV0aG9kIGVsZW1lbnRzIGluIHRoZSBXQlMgYnV0IHJhdGhlciBjcmVhdGUgbG9jYWwgcmVmZXJlbmNlcyB0ZXJtZWQgPHN0cm9uZz5kZXNjcmlwdG9ycyA8L3N0cm9uZz4gdGhhdCByZWZlciBiYWNrIHRvIHRoZSBlbGVtZW50cyBpbiB0aGUgbWV0aG9kIGxpYnJhcnkgYnV0IGFsc28gY29udGFpbiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRoYXQgaXMgb25seSByZWxldmFudCB0byB0aGUgbG9jYWwgcHJvY2Vzcy4gPC9wPgotPHA+RGVzY3JpcHRvcnMgYWxzbyBwcm92aWRlIGEgbWVjaGFuaXNtIHdoZXJlYnkgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGluIGNvcmUgbWV0aG9kIGF1dGhvcmluZyAoZS5nLiByb2xlcyBhc3NvY2lhdGVkIHdpdGggYSB0YXNrLCBpbnB1dCBhbmQgb3V0cHV0LCB3b3JrIHByb2R1Y3RzLCBldGMuKSwgY2FuIGJlIGRlZmluZWQgb3IgY2hhbmdlZCBsb2NhbGx5IHdpdGhpbiB0aGUgcHJvY2Vzcy4gPC9wPgotPG9sPgotICA8bGk+ICAgIENyZWF0ZSBhIG5ldyBEZWxpdmVyeSBQcm9jZXNzIGluIHRoZSBNeSBQbHVnaW4sIHBsdWctaW4gY2FsbGVkLCBNeSBSVVAuIDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPldoZW4geW91IGNyZWF0ZSBhIHByb2Nlc3MgeW91IGFyZSBhc2tlZCB0byBpZGVudGlmeSB0aGUgZGVmYXVsdCBDb25maWd1cmF0aW9uIHRvIGJlIHVzZWQgd2l0aCB0aGUgcHJvY2Vzcy4gU2VsZWN0IHRoZSBNeSBSVVAgZm9yIFNtYWxsIFByb2plY3RzIGNvbmZpZ3VyYXRpb24uIElmIHlvdSBuYXZlIG5vdCBjcmVhdGVkIHRoaXMgY29uZmlndXJhdGlvbiwgc2VsZWN0IFJVUCBmb3IgU21hbGwgUHJvamVjdHMuIDwvcD4KLSAgICA8cD5BIHByb2Nlc3MgaGFzIGEgaGllcmFyY2h5IG9mIGFjdGl2aXRpZXMgYW5kIGNhbiBpbmNsdWRlIHRoZSBzcGVjaWFsIHR5cGVzIG9mIGFjdGl2aXR5IJYgUGhhc2VzIGFuZCBJdGVyYXRpb25zLiBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBhbHNvIGJlIGNyZWF0ZWQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucy4gRmlyc3Qgb2YgYWxsLCB3ZSdsbCBjcmVhdGUgc29tZSBhY3Rpdml0aWVzIGRpcmVjdGx5IGFuZCByZXVzZSBzb21lIGNhcGFiaWxpdHkgcGF0dGVybnMgbGF0ZXIuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+IFRvIGNyZWF0ZSB0aGUgSW5jZXB0aW9uIFBoYXNlLCBpbiB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlIHZpZXcsIHJpZ2h0IGNsaWNrIHRoZSA8c3Ryb25nPk15IFJVUCA8L3N0cm9uZz5Qcm9jZXNzLCBhbmQgdGhlbiBzZWxlY3QsIDxzdHJvbmc+TmV3IENoaWxkICZndDsgUGhhc2UgPC9zdHJvbmc+LiBDYWxsIHRoZSBQaGFzZSwgPHN0cm9uZz5JbmNlcHRpb248L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICAKLSAgICA8cD5UbyBjcmVhdGUgdGhlIFJlcXVpcmVtZW50cyBEaXNjaXBsaW5lIGluIEluY2VwdGlvbiwgaW4gdGhlIDxzdHJvbmc+V29yayBCcmVha2Rvd24gU3RydWN0dXJlIDwvc3Ryb25nPiB2aWV3LCByaWdodCBjbGljayA8c3Ryb25nPkluY2VwdGlvbiwgPC9zdHJvbmc+IGFuZCBzZWxlY3QgPHN0cm9uZz5OZXcgPC9zdHJvbmc+PHN0cm9uZz5DaGlsZCAmZ3Q7IEFjdGl2aXR5IDwvc3Ryb25nPi4gQ2FsbCB0aGlzIDxzdHJvbmc+UmVxdWlyZW1lbnRzPC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5UbyBhZGQgVGFza3MgdG8gdGhlIFJlcXVpcmVtZW50cyBhY3Rpdml0eSwgaW4gdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbiA8L3N0cm9uZz4gdmlldywgb3BlbiB0aGUgUmVxdWlyZW1lbnRzIERpc2NpcGxpbmUgYW5kIHRoZW4gZHJhZyBhbmQgZHJvcCB0aGUgZm9sbG93aW5nIHRhc2tzIG9udG8gdGhlIFJlcXVpcmVtZW50cyBBY3Rpdml0eSB5b3UgaGF2ZSBqdXN0IGNyZWF0ZWQ6ICA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgRGV2ZWxvcCBWaXNpb24gPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBEZXRhaWwgdGhlIFNvZnR3YXJlIFJlcXVpcmVtZW50cyA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IEZpbmQgQWN0b3JzIGFuZCB1c2UgQ2FzZXMgPC9wPgotICAgIDxwPldoZW4geW91IGluY2x1ZGUgdGhlc2UgdGFza3MgaW4geW91ciBwcm9jZXNzLCB0aGUgYXNzb2NpYXRlZCByb2xlcyBhbmQgd29yayBwcm9kdWN0cyBhcmUgYWxzbyBpbmNsdWRlZCBpbiB0aGUgcHJvY2Vzcy4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD4gWW91IGNhbiByZXZpZXcgdGhlIGluZm9ybWF0aW9uIGZvciBlYWNoIG1ldGhvZCBlbGVtZW50IGluIHRoZSA8c3Ryb25nPlByb3BlcnRpZXMgPC9zdHJvbmc+IHZpZXcuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDdXN0b21pemUgdGhlIHN0ZXBzIGZyb20gdGhlIEZpbmQgQWN0b3JzIGFuZCBVc2UgQ2FzZXMgdGFzayBmb3IgdGhlIEluY2VwdGlvbiBwaGFzZS4gQ2xpY2sgb24gdGhlIDxzdHJvbmc+RmluZCBBY3RvcnMgYW5kIFVzZSBDYXNlczwvc3Ryb25nPiB0YXNrIGRlc2NyaXB0b3IsIGFuZCBvcGVuIHRoZSA8c3Ryb25nPlByb3BlcnRpZXM8L3N0cm9uZz4gdmlldy4gQ2xpY2sgb24gdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gdGFiLiBSZW1vdmUgdGhlIGxhc3QgZm91ciBzdGVwcyBhbmQgY2xvc2UgdGhlIHByb3BlcnRpZXMgdmlldy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFN3aXRjaCB0byB0aGUgPHN0cm9uZz5Ccm93c2luZzwvc3Ryb25nPiBwZXJzcGVjdGl2ZSBhbmQgc2VsZWN0IDxzdHJvbmc+UHJvY2Vzc2VzICZndDsgRGVsaXZlcnkgUHJvY2Vzc2VzICZndDsgTXkgUlVQPC9zdHJvbmc+LiBUaGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlIHRhYiBpcyBkaXNwbGF5ZWQuIENsaWNrIG9uIDxzdHJvbmc+RmluZCBBY3RvcnMgYW5kIFVzZSBDYXNlczwvc3Ryb25nPi4gT25seSB0aGUgZmlyc3QgdGhyZWUgc3RlcHMgZnJvbSB0aGUgY29yZSBtZXRob2QgdGFzayBhcmUgaW5jbHVkZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPk1ha2Ugb3RoZXIgY2hhbmdlcyB0byB0aGUgdGFza3MgaW4gdGhlIGRlbGl2ZXJ5IHByb2Nlc3MgeW91IGhhdmUganVzdCBjcmVhdGVkIGFuZCBzZWUgaG93IHRoZXkgYXJlIHJlZmxlY3RlZCB3aGVuIHlvdSB2aWV3IHRoZSBwcm9jZXNzIGluIHRoZSBCcm93c2luZyBwZXJzcGVjdGl2ZS48L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfNC5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MjYwZDJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgNDogQ3JlYXRlIGEgbmV3IGRlbGl2ZXJ5IFByb2Nlc3MgdXNpbmcgY2FwYWJpbGl0eSBwYXR0ZXJucy4gPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGxlYXJuIGhvdyB0byBjcmVhdGUgYSBkZWxpdmVyeSBwcm9jZXNzIHVzaW5nIDxzdHJvbmc+Q2FwYWJpbGl0eSBQYXR0ZXJucyA8L3N0cm9uZz4uIDwvcD4KLTxwPkEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgcHJvY2VzcyCRZnJhZ21lbnQnLiBJdCByZXByZXNlbnRzIGEgcHJvY2VzcyB0aGF0IGNhbiBiZSByZXVzZWQgbWFueSB0aW1lcyBpbiB0aGUgc2FtZSBwcm9jZXNzIGFuZCAvIG9yIGluIGRpZmZlcmVudCBwcm9jZXNzZXMuIE9yZ2FuaXppbmcgY29yZSBtZXRob2QgY29udGVudCBpbnRvIGNhcGFiaWxpdHkgcGF0dGVybnMgYW5kIHRoZW4gdXNpbmcgdGhlIGNhcGFiaWxpdHkgcGF0dGVybnMgdG8gY29uc3RydWN0IGZ1bGwgbGlmZS1jeWNsZSBkZWxpdmVyeSBwcm9jZXNzZXMgaXMgYSBrZXkgZmVhdHVyZSBvZiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyLiA8L3A+Ci08cD5BIGNhcGFiaWxpdHkgcGF0dGVybiBjYW4gYmUgaW5jbHVkZWQgaW4gYW5vdGhlciBwcm9jZXNzIChhbm90aGVyIGNhcGFiaWxpdHkgcGF0dGVybiBvciBhIGRlbGl2ZXJ5IHByb2Nlc3MpIGluIHR3byB3YXlzOiA8L3A+Ci08YmxvY2txdW90ZT4KLSAgPHA+JiMxNDk7Jm5ic3A7IENvcHkgliB0aGlzIGNyZWF0ZXMgYSBmdWxsIGNvcHkgb2YgdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBpbiB0aGUgdGFyZ2V0IHByb2Nlc3MgYnV0IGRvZXMgbm90IHJldGFpbiBhbnkgbGlua3MgYmFjayB0byB0aGUgb3JpZ2luYWwgY2FwYWJpbGl0eSBwYXR0ZXJuLiBUaGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGNhbiBiZSBjdXN0b21pemVkIGluIHRoZSBuZXcgcHJvY2Vzcy4gQW55IGNoYW5nZXMgdGhhdCBhcmUgc3Vic2VxdWVudGx5IG1hZGUgdG8gdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBhcmUgbm90IHJlZmxlY3RlZCBpbiB0aGUgcHJvY2VzcyBpbnRvIHdoaWNoIGl0IHdhcyBjb3BpZWQuIDwvcD4KLSAgPHA+JiMxNDk7Jm5ic3A7IEV4dGVuZHMgliB0aGlzIGV4dGVuZHMgdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBpbnRvIHRoZSBwcm9jZXNzLiBUaGUgcHJvY2VzcyByZXRhaW5zIGxpbmtzIHRvIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gYW5kIGFueSBzdWJzZXF1ZW50IGNoYW5nZXMgdG8gdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBhcmUgcmVmbGVjdGVkIGluIHRoZSBwcm9jZXNzIGludG8gd2hpY2ggaXQgaXMgZXh0ZW5kZWQuIFRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gY2FuIGJlIGN1c3RvbWl6ZWQgYnkgc3VwcHJlc3NpbmcgdGFza3MsIHJvbGVzLCBhbmQgd29yayBwcm9kdWN0cy4gT3RoZXIgY2hhbmdlcyBjYW5ub3QgYmUgbWFkZS4gPC9wPgotPC9ibG9ja3F1b3RlPgotPHA+V2Ugd2lsbCBhZGQgc29tZSBDYXBhYmlsaXR5IFBhdHRlcm5zIHRvIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHlvdSBjcmVhdGVkIGluIEV4ZXJjaXNlIDMuIDwvcD4KLTxwPlRvIGFkZCBhIENhcGFiaWxpdHkgUGF0dGVybiB1c2luZyBDb3B5OiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD4gU3dpdGNoIHRvIHRoZSBhdXRob3JpbmcgcGVyc3BlY3RpdmUgYW5kIG9wZW4gdGhlIE15IFJVUCBkZWxpdmVyeSBwcm9jZXNzIHlvdSBjcmVhdGVkIGluIEV4ZXJjaXNlIDMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBJbiB0aGUgQ29uZmlndXJhdGlvbnMgVmlldyBjbGljayA8c3Ryb25nPlByb2Nlc3NlcyAmZ3Q7IENhcGFiaWxpdHkgUGF0dGVybnMgJmd0OyBDbGFzc2ljIFJVUCAmZ3Q7IERpc2NpcGxpbmUgV29ya2Zsb3dzICZndDsgUHJvamVjdCBNYW5hZ2VtZW50LiA8L3N0cm9uZz48L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gRHJhZyBhbmQgZHJvcCB0aGUgPHN0cm9uZz5Qcm9qZWN0IE1hbmFnZW1lbnQgPC9zdHJvbmc+IENhcGFiaWxpdHkgUGF0dGVybiBvbnRvIHRoZSBJbmNlcHRpb24gcGhhc2UgaW4gTXkgUlVQIGRlbGl2ZXJ5IHByb2Nlc3MuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgPHN0cm9uZz5Db3B5IDwvc3Ryb25nPiBpbiB0aGUgcG9wLXVwIGJveC4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgRXhwYW5kIG9uZSBvZiB0aGUgYWN0aXZpdGllcyBpbiB0aGUgUHJvamVjdCBNYW5hZ2VtZW50IGNhcGFiaWxpdHkgcGF0dGVybiB0byB0aGUgVGFzayBsZXZlbC4gTm90ZSB0aGF0IHRoZSB0YXNrIG5hbWUgaXMgZGlzcGxheWVkIGluIGJsYWNrLiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSB0YXNrIGlzIGF2YWlsYWJsZSBmb3IgeW91IHRvIGVkaXQuIEFueSBjaGFuZ2VzIGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gd2lsbCBub3QgYmUgcmVmbGVjdGVkIGluIHlvdXIgcHJvY2Vzcy4gWW91IGNhbiBlZGl0IHRoZSB0YXNrIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcuIDwvbGk+Ci08L29sPgotPHA+VG8gYWRkIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHVzaW5nIEV4dGVuZHM6ICA8L3A+Ci08b2wgc3RhcnQ9IjYiPgotICA8bGk+Ci0gICAgPHA+IENyZWF0ZSBhIG5ldyBQaGFzZSBpbiB0aGUgTXkgUlVQIGRlbGl2ZXJ5IHByb2Nlc3MuIFJpZ2h0LWNsaWNrIG9uIHRoZSBmaXJzdCByb3cgYW5kIHNlbGVjdCA8c3Ryb25nPk5ldyBDaGlsZCAmZ3Q7IFBoYXNlIDwvc3Ryb25nPi4gQ2FsbCB0aGUgcGhhc2UsIEVsYWJvcmF0aW9uLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ3JlYXRlIGEgbmV3IEl0ZXJhdGlvbiBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2UuIFJpZ2h0LWNsaWNrIG9uIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBhbmQgc2VsZWN0IDxzdHJvbmc+TmV3IENoaWxkICZndDsgSXRlcmF0aW9uIDwvc3Ryb25nPi4gQ2FsbCB0aGUgaXRlcmF0aW9uLCBFbGFib3JhdGlvbiBJdGVyYXRpb24gMS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEluIHRoZSBDb25maWd1cmF0aW9ucyBWaWV3LCBjbGljayA8c3Ryb25nPlByb2Nlc3NlcyAmZ3Q7IENhcGFiaWxpdHkgUGF0dGVybnMgJmd0OyBDbGFzc2ljIFJVUCAmZ3Q7IERpc2NpcGxpbmUgV29ya2Zsb3dzICZndDsgUHJvamVjdCBNYW5hZ2VtZW50LiA8L3N0cm9uZz48L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gRHJhZyBhbmQgZHJvcCB0aGUgPHN0cm9uZz5Qcm9qZWN0IE1hbmFnZW1lbnQgPC9zdHJvbmc+IENhcGFiaWxpdHkgUGF0dGVybiBvbnRvIHRoZSBFbGFib3JhdGlvbiBJdGVyYXRpb24gMSBpdGVyYXRpb24gaW4gTXkgUlVQIFByb2Nlc3MuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgPHN0cm9uZz5FeHRlbmQgPC9zdHJvbmc+IGluIHRoZSBwb3AtdXAgYm94LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gRXhwYW5kIG9uZSBvZiB0aGUgYWN0aXZpdGllcyBpbiB0aGUgUHJvamVjdCBNYW5hZ2VtZW50IGNhcGFiaWxpdHkgcGF0dGVybiB5b3UgaGF2ZSBqdXN0IGFkZGVkIHRvIHRoZSBUYXNrIGxldmVsLiBOb3RlIHRoYXQgdGhlIHRhc2sgbmFtZSBpcyBkaXNwbGF5ZWQgaW4gZ3JlZW4gaXRhbGljcy4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFzayBpcyBpbiBhIHBhcnQgb2YgYSBwcm9jZXNzIGRlZmluZWQgZWxzZXdoZXJlIJYgYSBDYXBhYmlsaXR5IFBhdHRlcm4uIEFueSBjaGFuZ2VzIHRvIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gd2lsbCBiZSByZWZsZWN0ZWQgaW4geW91ciBwcm9jZXNzLiBBbHNvLCB0aGUgUHJvcGVydGllcyB2aWV3IHNob3dzIHRoZSB0YXNrIGRldGFpbHMsIGJ1dCB0aGV5IGNhbm5vdCBiZSBlZGl0ZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPlJpZ2h0IGNsaWNrIG9uIGEgdGFzayBpbiB0aGUgZXh0ZW5kZWQgY2FwYWJpbGl0eSBwYXR0ZXJuIGFuZCBzZWxlY3QgPHN0cm9uZz5TdXBwcmVzcyA8L3N0cm9uZz4uIFRoZSB0YXNrIGlzIGdyYXllZCBvdXQuIFRoZSB0YXNrIHdpbGwgbm90IGFwcGVhciBpbiB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YgdGhlIGRlbGl2ZXJ5IHByb2Nlc3MsIG5vciB3aWxsIGl0IGJlIGluY2x1ZGVkIGluIGFuIGV4cG9ydCBvZiB0aGUgcHJvY2Vzcy48L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfNS5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZGJmODJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPkV4ZXJjaXNlIDU6IENyZWF0ZSBQcm9jZXNzIERpYWdyYW1zIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBleHBsb3JlIHRoZSBkaWFncmFtIGZlYXR1cmVzIG9mIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIuIDwvcD4KLTxwPkVQRiBDb21wb3NlciBzdXBwb3J0cyB0aHJlZSB0eXBlcyBvZiBwcm9jZXNzIGRpYWdyYW0uIFRoZXNlIGFyZTogPC9wPgotPGJsb2NrcXVvdGU+Ci0gICAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPkFjdGl2aXR5IERpYWdyYW08L3N0cm9uZz4gPC9wPgotICAgICAgICA8YmxvY2txdW90ZT4KLSAgICAgICAgICA8cD4gICAgICAgICAgICBUaGlzIHNob3dzIHRoZSAoc3ViKSBhY3Rpdml0aWVzIGluIGEgaGlnaGVyIGxldmVsIGFjdGl2aXR5LiBJdCBzaG93cyB0aGUgc2VxdWVuY2UgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZSBhY3Rpdml0aWVzLiA8L3A+Ci0gICAgICAgIDwvYmxvY2txdW90ZT4KLSAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+QWN0aXZpdHkgRGV0YWlsPC9zdHJvbmc+IJYgc2ltaWxhciB0byBSVVAgV29ya2Zsb3cgRGV0YWlsIDwvcD4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+ICAgICAgVGhpcyBzaG93cyB0aGUgdGFza3MgaW4gYW4gYWN0aXZpdHkgd2l0aCB0aGVpciBwZXJmb3JtaW5nIHJvbGVzIGFuZCBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9zdHJvbmc+IDwvcD4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+VGhpcyBkaWFncmFtIGNhbiBiZSB1c2VkIHRvIHNob3cgaG93IGEgd29yayBwcm9kdWN0IGlzIGRlcGVuZGVudCBvbiBvdGhlciB3b3JrIHByb2R1Y3RzLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLTwvYmxvY2txdW90ZT4KLTxwPlRoZXNlIGRpYWdyYW1zIGNhbiB0aGVuIGJlIGluY2x1ZGVkIGluIHRoZSBwdWJsaXNoZWQgd2ViIHNpdGUuIFRoZSBkaWFncmFtcyBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgKHRvIGEgZGVncmVlKSBhbmQgaW5oZXJlbnRseSBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgV0JTLiBDaGFuZ2VzIHRvIHRoZSBwcm9jZXNzIHN0cnVjdHVyZSB1c2luZyB0aGUgZGlhZ3JhbSBlZGl0b3IgYXJlIGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkIGluIHRoZSBXQlMsIGFuZCB2aWNlIHZlcnNhLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggdG8gPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5TZWxlY3QgdGhlIE15IFJVUCBkZWxpdmVyeSBwcm9jZXNzIHRoYXQgeW91IGhhdmUgYmVlbiB3b3JraW5nIG9uLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5IaWdobGlnaHQgdGhlIGRlbGl2ZXJ5IHByb2Nlc3MgaW4gdGhlIFdCUyBhbmQgdGhlbiByaWdodC1jbGljay4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgPHN0cm9uZz5EaWFncmFtcyAmZ3Q7IE9wZW4gQWN0aXZpdHkgRGlhZ3JhbTwvc3Ryb25nPi4gVGhlIGRpYWdyYW0gZWRpdG9yIHNob3VsZCBvcGVuLCBzaG93aW5nIHRoZSB0b3AgbGV2ZWwgYWN0aXZpdGllcyAtIHBoYXNlcy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+RXhwYW5kIHRoZSA8c3Ryb25nPlBhbGV0dGUgPC9zdHJvbmc+IG9uIHRoZSByaWdodCBvZiB0aGUgZGlhZ3JhbSB2aWV3LiBBbGwgdGhlIGVsZW1lbnRzIHJlcXVpcmVkIHRvIGNyZWF0ZSBhbiA8c3Ryb25nPkFjdGl2aXR5IERpYWdyYW0gPC9zdHJvbmc+IGFyZSBhdmFpbGFibGUgb24gdGhlIHBhbGV0dGUuIEFkZCBhIG5ldyBwaGFzZSB0byB0aGUgZGlhZ3JhbSCWIGNhbGwgaXQsIENvbnN0cnVjdGlvbi4gQ3JlYXRlIGxpbmtzIGJldHdlZW4gdGhlIHBoYXNlcyB0byBzaG93IHRoZSBzZXF1ZW5jZSBvZiB0aGUgcGhhc2VzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggYmFjayB0byB0aGUgPHN0cm9uZz5Xb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUgPC9zdHJvbmc+dmlldyBhbmQgbm90aWNlIHRoZSBuZXcgcGhhc2UuIEFsc28gbm90aWNlIHRoYXQgdGhlIGxpbmtzIHlvdSBhZGRlZCBvbiB0aGUgZGlhZ3JhbSBhcmUgcmVmbGVjdGVkIGluIHRoZSBQcmVkZWNlc3NvcnMgY29sdW1uLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5Eb3VibGUgY2xpY2sgdGhlIDxzdHJvbmc+SW5jZXB0aW9uIFBoYXNlPC9zdHJvbmc+IGluIHRoZSBkaWFncmFtIJYgaXQgd2lsbCBkcmlsbCBkb3duIHRvIHNob3cgdGhlIGNvbnRhaW5lZCBBY3Rpdml0aWVzICh0aGUgcnVsZSBpcyB0aGF0IHRoZSBlZGl0b3Igd2lsbCBkaXNwbGF5IHRoZSBwcm9jZXNzIGVsZW1lbnRzIGF0IHRoZSBsZXZlbCBiZWxvdyB0aGUgY3VycmVudCBzZWxlY3RlZCBlbGVtZW50KS4gU3VjY2Vzc2l2ZSBkcmlsbCBkb3duIHRocm91Z2ggdGhlIGxldmVscyBpcyBwb3NzaWJsZSBieSBjbGlja2luZyBvbiB0aGUgZGlhZ3JhbSBlbGVtZW50cy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xvc2UgdGhlIGRpYWdyYW1zIHlvdSBoYXZlIG9wZW5lZC4gPC9wPgotICA8L2xpPgotICA8bGk+SW4gdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgcmlnaHQtY2xpY2sgb24gdGhlIFJlcXVpcmVtZW50cyBhY3Rpdml0eSBhbmQgc2VsZWN0LCA8c3Ryb25nPkRpYWdyYW1zICZndDsgT3BlbiBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbS4gPC9zdHJvbmc+VGhlIEFjdGl2aXR5IERldGFpbCBEaWFncmFtIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBJdCBzaG93czogIDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBUaGUgUm9sZXMgdGhhdCBwZXJmb3JtIHRhc2tzIGluIHRoZSBhY3Rpdml0eSA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IFRoZSBUYXNrcyB0aGF0IHRoZSByb2xlcyBwZXJmb3JtIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgVGhlIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cyBmb3IgZWFjaCB0YXNrIDwvcD4KLSAgICA8cD5Zb3UgY2FuIGNoYW5nZSB0aGUgbGF5b3V0IG9mIHRoZSBkaWFncmFtIGJ1dCB5b3UgY2Fubm90IGFkZCBvciByZW1vdmUgYW55IGVsZW1lbnRzIGZyb20gdGhlIGRpYWdyYW0uIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+Q2xvc2UgdGhlIGRpYWdyYW1zIHlvdSBoYXZlIG9wZW5lZC4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIEluIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIHJpZ2h0LWNsaWNrIG9uIHRoZSBSZXF1aXJlbWVudHMgYWN0aXZpdHkgYW5kIHNlbGVjdCwgPHN0cm9uZz5EaWFncmFtcyAmZ3Q7IE9wZW4gV29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbS4gPC9zdHJvbmc+VGhlIHdvcmsgcHJvZHVjdHMgdXNlZCBpbiB0aGUgYWN0aXZpdHkgYXJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIGRpYWdyYW0uICA8L2xpPgotPC9vbD4KLTxibG9ja3F1b3RlPgotICA8cD5BZGQgYSAoZGVwZW5kZW5jeSkgbGluayBiZXR3ZWVuIHR3byB3b3JrIHByb2R1Y3RzLiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSB3b3JrIHByb2R1Y3QgYXQgdGhlIGFycm93IGVuZCBvZiB0aGUgbGluayBpcyBkZXBlbmRlbnQgb24gdGhlIG90aGVyIHdvcmsgcHJvZHVjdCwgaS5lLiwgdGhlIG90aGVyIHdvcmsgcHJvZHVjdCBuZWVkcyB0byBiZSBjcmVhdGVkIGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgc2Vjb25kIHdvcmsgcHJvZHVjdC4KLSAgPC9wPgotICA8cD5BZGQgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byB0aGUgZGlhZ3JhbS4gPC9wPgotPC9ibG9ja3F1b3RlPgotPG9sIHN0YXJ0PSIxMiI+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggYmFjayB0byB0aGUgZGVsaXZlcnkgcHJvY2VzcyBhbmQgb3BlbiB0aGUgPHN0cm9uZz5Xb3JrIFByb2R1Y3QgVXNhZ2U8L3N0cm9uZz4gdmlldy4gTm90aWNlIHRoZSBuZXcgd29yayBwcm9kdWN0IGluIHRoZSBSZXF1aXJlbWVudHMgYWN0aXZpdHkuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPk9uY2UgeW91IGhhdmUgZWRpdGVkIGEgZGlhZ3JhbSwgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSBpdCBvciBleGNsdWRlIGl0IHdoZW4gcHVibGlzaGluZyB0aGUgcHJvY2VzcyBpbiBhIGNvbmZpZ3VyYXRpb24uIEluIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIHJpZ2h0LWNsaWNrIG9uIHRoZSA8c3Ryb25nPlJlcXVpcmVtZW50czwvc3Ryb25nPiBhY3Rpdml0eSBhbmQgc2VsZWN0IDxzdHJvbmc+RGlhZ3JhbXMgJmd0OyBQdWJsaXNoaW5nIE9wdGlvbnMuIDwvc3Ryb25nPkNoZWNrIG9yIHVuY2hlY2sgdGhlIHR5cGVzIG9mIGRpYWdyYW0gbGlzdGVkLiBJZiBhIGRpYWdyYW0gdHlwZSBpcyBub3QgbGlzdGVkLCBpdCBtZWFucyB0aGF0IHlvdSBoYXZlIG5vdCBlZGl0ZWQgdGhhdCBkaWFncmFtIHR5cGUgZm9yIHRoZSBhY3Rpdml0eSB5ZXQuIDwvcD4KLSAgPC9saT4KLSAgPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfaW50cm8uaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9pbnRyby5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVlYTM1MTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9pbnRyby5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDE+PGE+PC9hPjxhPlR1dG9yaWFsOiBXb3JraW5nIHdpdGggUHJvY2Vzc2VzIDwvYT48L2gxPgotPHA+PHN0cm9uZz48ZW0+UHJvY2VzcyBBdXRob3JpbmcgPC9lbT48L3N0cm9uZz4gYWxsb3dzIGEgUHJvY2VzcyBFbmdpbmVlciB0byBpbmNvcnBvcmF0ZSA8c3Ryb25nPjxlbT5NZXRob2QgRWxlbWVudHMgPC9lbT48L3N0cm9uZz4gaW50byBwcm9jZXNzIHN0cnVjdHVyZXMuIEZvciBleGFtcGxlLCBhIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSBmb3JtYXQgZmFtaWxpYXIgdG8gUHJvamVjdCBNYW5hZ2Vycy4gVGhlIHByb2Nlc3NlcyBjYW4gYmUgaW5jbHVkZWQgaW4gYSBjb25maWd1cmF0aW9uIHRvIGJlIHB1Ymxpc2hlZCBhcyBwYXJ0IG9mIHRoZSBwdWJsaXNoZWQgd2ViIHNpdGUuIDwvcD4KLTxwPkluIDxzdHJvbmc+PGVtPk1ldGhvZCA8L2VtPiBBdXRob3JpbmcgPC9zdHJvbmc+IHRoZSBQcm9jZXNzIEVuZ2luZWVyIGRlZmluZXMgcm9sZXMsIHRhc2tzLCB3b3JrIHByb2R1Y3RzIGFuZCBndWlkYW5jZSBhbmQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZXNlIGVsZW1lbnRzLiA8L3A+Ci08cD5JbiA8c3Ryb25nPjxlbT5Qcm9jZXNzIDwvZW0+IEF1dGhvcmluZyA8L3N0cm9uZz4gdGhlIHByb2Nlc3MgZW5naW5lZXIgZGVmaW5lcyBhZGRpdGlvbmFsIGxpZmVjeWNsZSBlbGVtZW50cyBzdWNoIGFzIDxzdHJvbmc+QWN0aXZpdGllcyA8L3N0cm9uZz4gKHN1bW1hcnkgdGFza3MpLCA8c3Ryb25nPlBoYXNlcyA8L3N0cm9uZz4sIDxzdHJvbmc+SXRlcmF0aW9ucyA8L3N0cm9uZz4gYW5kIDxzdHJvbmc+TWlsZXN0b25lcyA8L3N0cm9uZz4sIHRoYXQgY2FuIHRoZW4gYmUgdXNlZCB0byBjb21wb3NlIHRoZSBjb3JlIGVsZW1lbnRzIGludG8gcHJvY2Vzc2VzLiBBIGNvbXBsZXRlIHByb2Nlc3MgY29ycmVzcG9uZGluZyB0byBhIHByb2plY3QgcGxhbiBvciBhIHBoYXNlIHdlIGNhbGwgYSA8c3Ryb25nPjxlbT5EZWxpdmVyeSBQcm9jZXNzIDwvZW0+PC9zdHJvbmc+PGVtPihjb3JyZXNwb25kaW5nIHRvIFNtYWxsIFJVUCwgZm9yIGV4YW1wbGUpIDwvZW0+LiBXZSBjYW4gYWxzbyBjcmVhdGUgc21hbGxlciBtb3JlIGdyYW51bGFyIHNlY3Rpb25zIG9mIHByb2Nlc3MsIHRlcm1lZCA8c3Ryb25nPjxlbT5DYXBhYmlsaXR5IFBhdHRlcm5zIDwvZW0+PC9zdHJvbmc+IHRoYXQgY2FuIGJlIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIG1vcmUgZWFzaWx5IGNvbXBvc2UgZGVsaXZlcnkgcHJvY2Vzc2VzLiA8L3A+Ci08cD5FYWNoIHRpbWUgYSB0YXNrIGlzIGluY2x1ZGVkIGluIGEgcHJvY2VzcywgYSBjb3B5IG9mIHRoYXQgdGFzayBpcyBjcmVhdGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwcm9jZXNzLiBXZSBjYWxsIHRoaXMgYSBUYXNrIERlc2NyaXB0b3IuIFRoZSBzYW1lIHRhc2sgY2FuIGJlIGluY2x1ZGVkIGFueSBudW1iZXIgb2YgdGltZXMgaW4gdGhlIHNhbWUgcHJvY2Vzcy4gVGhpcyBhbGxvd3MsIGZvciBleGFtcGxlLCB0aGUgc2FtZSBSVVAgdGFzayB0byBiZSBpbmNsdWRlZCBpbiBlYWNoIEl0ZXJhdGlvbiBpbiBlYWNoIFJVUCBQaGFzZS4gQSBUYXNrIERlc2NyaXB0b3IgY2FuIGFsc28gbW9kaWZ5IHRoZSBiYXNlIHRhc2sgd2l0aG91dCBhY3R1YWxseSBjaGFuZ2luZyB0aGUgdGFzay4gRm9yIGV4YW1wbGUsIHJvbGVzIGFuZCB3b3JrIHByb2R1Y3RzIGNhbiBiZSBhZGRlZCBvciBzdXBwcmVzc2VkLCBzdGVwcyBjYW4gYmUgc3VwcHJlc3NlZCBvciByZS1zZXF1ZW5jZWQuIDwvcD4KLTxwPm9sZXMgYW5kIFdvcmsgUHJvZHVjdHMgYXJlIGFsc28gaW5jbHVkZWQgaW4gcHJvY2Vzc2VzIGFzIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gU28gcm9sZXMgYW5kIHdvcmsgcHJvZHVjdHMgY2FuIGFsc28gYmUgY3VzdG9taXplZCB0byBmaXQgd2l0aCB0aGUgY29udGV4dCBvZiB0aGUgcHJvY2VzcyBpbiB3aGljaCB0aGV5IGFyZSB1c2VkLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHdpc3R5IHN5bWJvbDEuSlBHIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90d2lzdHkgc3ltYm9sMS5KUEcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIzYjExYjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90d2lzdHkgc3ltYm9sMS5KUEcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VtYV9odW1wLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdW1hX2h1bXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NmY0NTQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdW1hX2h1bXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91bmRlcmxpbmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91bmRlcmxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYjc2OGM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdW5kZXJsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdXNlcmludGVyZmFjZS5KUEcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VzZXJpbnRlcmZhY2UuSlBHCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYjM2OGFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdXNlcmludGVyZmFjZS5KUEcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGEyODM5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVG9vbCBJbnRlcmZhY2UiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6IiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjb25maWd1cmF0aW9udmlldy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJsaWJyYXJ5dmlldy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJicm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJzZWFyY2hmb3JtZXRob2Rjb250ZW50Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlRvb2wgSW50ZXJmYWNlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXciPjxhIG5hbWU9InVzZXJpbnRlcmZhY2VvdmVydmlldyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlRvb2wgSW50ZXJmYWNlPC9oMT4KLTxkaXY+PHA+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkCi1EZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOjwvcD4KLTxwPjxpbWcgc3JjPSJ1c2VyaW50ZXJmYWNlLkpQRyIgYWx0PSIiIC8+PC9wPgotPGRpdiBjbGFzcz0icCI+PHVsPjxsaT48c3Ryb25nPkNvbmZpZ3VyYXRpb24gZHJvcC1kb3duIHNlbGVjdGlvbiBib3g8L3N0cm9uZz4gLSBUaGUgY29uZmlndXJhdGlvbiBkcm9wLWRvd24KLXNlbGVjdGlvbiBib3ggYWxsb3dzIHlvdSB0byBzZWxlY3QgYSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5jb25maWd1cmF0aW9uPC9hPiBpbiB3aGljaCB0byB3b3JrLiA8L2xpPgotPGxpPjxzdHJvbmc+T3BlbiBQZXJzcGVjdGl2ZSBidXR0b248L3N0cm9uZz4gLSBDbGljayB0aGUgT3BlbiBQZXJzcGVjdGl2ZSBidXR0b24KLXRvIHNlbGVjdCBhIDxhIGhyZWY9InBlcnNwZWN0aXZlcy5odG1sI3BlcnNwZWN0aXZlcyI+cGVyc3BlY3RpdmU8L2E+LgotVGhlcmUgYXJlIHR3byBwZXJzcGVjdGl2ZXMgdG8gc2VsZWN0IGZyb206IFRoZSA8YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT4gYW5kIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+LiA8L2xpPgotPGxpPjxzdHJvbmc+TGlicmFyeSBWaWV3PC9zdHJvbmc+IC0gVGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkKLVZpZXc8L2E+IGRpc3BsYXlzIHRoZSBNZXRob2QgUGx1Zy1pbnMgYW5kIENvbmZpZ3VyYXRpb25zIGNvbnRhaW5lZCBpbiBhCi1NZXRob2QgTGlicmFyeS48L2xpPgotPGxpPjxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3PC9zdHJvbmc+IC0gVGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4gc2hvd3MgdGhlIGNvbnRlbnQgZWxlbWVudHMgaW4gYSBsaWJyYXJ5Ci1maWx0ZXJlZCBieSBhIGNvbmZpZ3VyYXRpb24uPC9saT4KLTxsaT48c3Ryb25nPkNvbnRlbnQgRWRpdG9ycyBhbmQgUHJldmlldzwvc3Ryb25nPiAtIFdoZW4geW91IGFyZSB3b3JraW5nIGluIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcKLVBlcnNwZWN0aXZlPC9hPiwgdGhlIHdpbmRvdyBvbiB0aGUgcmlnaHQgc2lkZSBvZiB5b3VyIHNjcmVlbiBjb250YWlucyBjb250ZW50Ci1lZGl0b3JzLCB3aGljaCBhbGxvdyB5b3UgdG8gY3JlYXRlIG9yIG1vZGlmeSBlbGVtZW50IHR5cGVzLiBXaGVuIHRoZSA8YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZwotUGVyc3BlY3RpdmU8L2E+IGlzIG9wZW4sIHRoZSB3aW5kb3cgb24gdGhlIHJpZ2h0IGNvbnRhaW5zIGEgcHJldmlldyBvZgoteW91ciBjb250ZW50IGFzIGl0IHdpbGwgYXBwZWFyIGluIGEgcHVibGlzaGVkIFdlYiBzaXRlLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08b2w+Ci08bGkgY2xhc3M9Im9sY2hpbGRsaW5rIj48YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJvbGNoaWxkbGluayI+PGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT48YnIgLz4KLTwvbGk+Ci08bGkgY2xhc3M9Im9sY2hpbGRsaW5rIj48YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sIj5Db25maWd1cmF0aW9uIFZpZXc8L2E+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJvbGNoaWxkbGluayI+PGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCI+TGlicmFyeSBWaWV3PC9hPjxiciAvPgotPC9saT4KLTxsaSBjbGFzcz0ib2xjaGlsZGxpbmsiPjxhIGhyZWY9ImJyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Lmh0bWwiPkJyb3dzZSBhbmQgUHJldmlldyBNZXRob2QgQ29udGVudDwvYT48YnIgLz4KLTwvbGk+Ci08bGkgY2xhc3M9Im9sY2hpbGRsaW5rIj48YSBocmVmPSJzZWFyY2hmb3JtZXRob2Rjb250ZW50Lmh0bWwiPlNlYXJjaCBmb3IgTWV0aG9kIENvbnRlbnQ8L2E+PGJyIC8+Ci08L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VzZXJyb2xlc2FuZHJvbGVzcGVjaWZpY3Rhc2tzLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VzZXJyb2xlc2FuZHJvbGVzcGVjaWZpY3Rhc2tzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkZjE2NDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91c2Vycm9sZXNhbmRyb2xlc3BlY2lmaWN0YXNrcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRvcGljIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlVzZXIgUm9sZXMgYW5kIFJvbGUgU3BlY2lmaWMgVGFza3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0idXNlcnJvbGVzYW5kcm9sZXNwZWNpZmljdGFza3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+VXNlciBSb2xlcyBhbmQgUm9sZSBTcGVjaWZpYyBUYXNrczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idXNlcnJvbGVzYW5kcm9sZXNwZWNpZmljdGFza3MiPjxhIG5hbWU9InVzZXJyb2xlc2FuZHJvbGVzcGVjaWZpY3Rhc2tzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VXNlciBSb2xlcyBhbmQgUm9sZSBTcGVjaWZpYyBUYXNrczwvaDE+Ci08ZGl2PjxwPlRoZXJlIGFyZSBmb3VyIHByaW1hcnkgcm9sZXMgcGxheWVkIGJ5IHRoZSB1c2VycyBvZiB0aGlzIHRvb2w6PC9wPgotPHVsPjxsaT5NZXRob2QgQXV0aG9yPC9saT4KLTxsaT5Qcm9jZXNzIEF1dGhvcjwvbGk+Ci08bGk+UHJvY2VzcyBDb25maWd1cmF0b3I8L2xpPgotPGxpPlByYWN0aXRpb25lcjwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0icCI+PHN0cm9uZz5NZXRob2QgQXV0aG9yPC9zdHJvbmc+IC0gVGhlIE1ldGhvZCBBdXRob3IgdXNlcyB0aGUgdG9vbCBvbiBhIHJlZ3VsYXIgYmFzaXMKLXRvIHByb3ZpZGUgc3RhbmRhcmQgcHJvY2Vzc2VzIGZvciB1c2UgaW4gYW4gb3JnYW5pemF0aW9uLiBUaGUgTWV0aG9kIEF1dGhvcgotdXNlcyB0aGUgZnVsbCBmdW5jdGlvbmFsaXR5IG9mIHRoZSB0b29sIHRvOjx1bD48bGk+Q3JlYXRlIHBsdWctaW5zLjwvbGk+Ci08bGk+Q3JlYXRlIG5ldyBtZXRob2QgZWxlbWVudHMuPC9saT4KLTxsaT5FeHRlbmQgZXhpc3RpbmcgbWV0aG9kIGVsZW1lbnRzLjwvbGk+Ci08bGk+Q3JlYXRlIHJldXNhYmxlIGNhcGFiaWxpdHkgcGF0dGVybnMgYnkgcmV1c2luZyBtZXRob2QgZWxlbWVudHMuPC9saT4KLTxsaT5DcmVhdGUgZGVsaXZlcnkgcHJvY2Vzc2VzIGJ5IHJldXNpbmcgY2FwYWJpbGl0eSBwYXR0ZXJucyBhbmQgbWV0aG9kIGVsZW1lbnRzLjwvbGk+Ci08bGk+Q3JlYXRlIGN1c3RvbSBjYXRlZ29yaWVzIGZvciB1c2UgYXMgdmlld3MgaW4gYSBjb25maWd1cmF0aW9uLjwvbGk+Ci08bGk+Q3JlYXRlIGFuZCBtb2RpZnkgY29uZmlndXJhdGlvbnMuPC9saT4KLTxsaT5QdWJsaXNoIGNvbmZpZ3VyYXRpb25zIG9yIHByb2Nlc3Nlcy48L2xpPgotPC91bD4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+PHN0cm9uZz5Qcm9jZXNzIEF1dGhvcjwvc3Ryb25nPiAtIFRoZSBQcm9jZXNzIEF1dGhvcidzIGdvYWwgaXMgdG8gcHJvZHVjZSBhIGRlbGl2ZXJ5Ci1wcm9jZXNzIGZvciB0aGVpciBwcm9qZWN0KHMpIGJ5IHJldXNpbmcgbWV0aG9kIGVsZW1lbnRzLiBUaGUgUHJvY2VzcyBBdXRob3IKLXVzZXMgdGhlIHRvb2wgb2NjYXNpb25hbGx5LCBhcyBwcm9qZWN0IG5lZWRzIGRpY3RhdGUsIHR5cGljYWxseSBzdXBwb3J0aW5nCi1vbmUgb3IsIG1vcmUgbGlrZWx5LCBzZXZlcmFsIHByb2plY3RzIGJ5IHNwZWNpZnlpbmcgdGhlIHByb2Nlc3NlcyB0byBiZSBmb2xsb3dlZC4KLVRoZSBQcm9jZXNzIEF1dGhvciB1c2VzIHRoZSBwcm9jZXNzIGF1dGhvcmluZyBhbmQgY29uZmlndXJhdGlvbiBwdWJsaXNoaW5nCi1mdW5jdGlvbmFsaXR5IG9mIHRoaXMgdG9vbCB0bzo8dWw+PGxpPkNyZWF0ZSBwbHVnLWlucy48L2xpPgotPGxpPkNyZWF0ZSByZXVzYWJsZSBjYXBhYmlsaXR5IHBhdHRlcm5zIGJ5IHJldXNpbmcgbWV0aG9kIGVsZW1lbnRzLjwvbGk+Ci08bGk+Q3JlYXRlIGRlbGl2ZXJ5IHByb2Nlc3NlcyBieSByZXVzaW5nIGNhcGFiaWxpdHkgcGF0dGVybnMgYW5kIG1ldGhvZCBlbGVtZW50cy48L2xpPgotPGxpPkNyZWF0ZSBjdXN0b20gY2F0ZWdvcmllcyBmb3IgdXNlIGFzIHZpZXdzIGluIGEgY29uZmlndXJhdGlvbi4gPC9saT4KLTxsaT5DcmVhdGUgYW5kIG1vZGlmeSBjb25maWd1cmF0aW9ucy48L2xpPgotPGxpPlB1Ymxpc2ggY29uZmlndXJhdGlvbnMgb3IgcHJvY2Vzc2VzLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJwIj48c3Ryb25nPlByb2Nlc3MgQ29uZmlndXJhdG9yPC9zdHJvbmc+IC0gVGhlIFByb2Nlc3MgQ29uZmlndXJhdG9yJ3MgZ29hbCBpcyB0byBwcm9kdWNlCi1hIGRlbGl2ZXJ5IHByb2Nlc3MgZm9yIHRoZWlyIHByb2plY3QocykgYnkgcmFwaWRseSBsZXZlcmFnaW5nIHJlYWR5LW1hZGUgcGx1Zy1pbnMuCi1UaGUgUHJvY2VzcyBDb25maWd1cmF0b3IgdXNlcyB0aGlzIHRvb2wgb2NjYXNpb25hbCwgYXMgcHJvamVjdCBuZWVkcyBkaWN0YXRlLAotdHlwaWNhbGx5IHN1cHBvcnRpbmcgb25lIG9yIHNldmVyYWwgcHJvamVjdHMgYnkgc3BlY2lmeWluZyB0aGUgcHJvY2VzcyBmb3IKLXRoZSBwcm9qZWN0cy4gVGhlIFByb2Nlc3MgQ29uZmlndXJhdG9yIHVzZXMgdGhlIGNvbmZpZ3VyYXRpb24KLXB1Ymxpc2hpbmcgZnVuY3Rpb25hbGl0eSBpbiB0aGlzIHRvb2wgdG86PHVsPjxsaT5DcmVhdGUgYW5kIG1vZGlmeSBjb25maWd1cmF0aW9ucy48L2xpPgotPGxpPlB1Ymxpc2ggY29uZmlndXJhdGlvbnMgb3IgcHJvY2Vzc2VzLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08cD48c3Ryb25nPlByYWN0aXRpb25lcjwvc3Ryb25nPiAtIEEgUHJhY3RpdGlvbmVyJ3MgZ29hbCBpcyB0byBjb3JyZWN0bHkgdXNlIHRoZSBvcmdhbml6YXRpb24ncwotcHJvY2Vzc2VzIGFuZCBiZXN0IHByYWN0aWNlcyBlZmZlY3RpdmVseS4gQSBQcmFjdGl0aW9uZXIgdXNlcyBhIHB1Ymxpc2hlZAotY29uZmlndXJhdGlvbiBvbiBhIHJlZ3VsYXIgYmFzaXMgZHJpdmVuIGJ5IHRoZSB3b3JrIGJlaW5nIHBlcmZvcm1lZCB0byB2aWV3Ci1wcm9jZXNzZXMgYW5kIG1ldGhvZHMuPC9wPgotPC9kaXY+Ci08ZGl2PjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC92YXJpYWJpbGl0eS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC92YXJpYWJpbGl0eS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNGFhOWI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdmFyaWFiaWxpdHkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJWYXJpYWJpbGl0eSIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJWYXJpYWJpbGl0eSBhbGxvd3MgZWxlbWVudHMgaW4gb25lIGNvbnRlbnQgcGFja2FnZSB0byBpbmZsdWVuY2Ugb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQuIFZhcmlhYmlsaXR5IGVuYWJsZXMgY2hhbmdlcyB0byB0aGUgY29udGVudCB3aGlsZSBrZWVwaW5nIHRoZSBjaGFuZ2VzIHNlcGFyYXRlIGFuZCBvcHRpb25hbC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlIG9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZyB0aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ2YXJpYWJpbGl0eWFzc29jaWF0aW9ucy5odG1sI3ZhcmlhYmlsaXR5YXNzb2NpYXRpb25zIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjb250cmlidXRlcy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJyZXBsYWNlLmh0bWwjcmVwbGFjZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImV4dGVuZHMuaHRtbCNleHRlbmRzIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InZhcmlhYmlsaXR5IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlZhcmlhYmlsaXR5PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ2YXJpYWJpbGl0eSI+PGEgbmFtZT0idmFyaWFiaWxpdHkiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5WYXJpYWJpbGl0eTwvaDE+Ci08ZGl2PjxwPlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZQotb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcKLXRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZwotdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLjwvcD4KLTxwPlZhcmlhYmlsaXR5IGFsbG93cyB5b3UgdG8gZmFjdG9yIHlvdXIgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBpbnRlcnJlbGF0ZWQKLXVuaXRzIGFuZCB0byBhcmNoaXRlY3QgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBsYXllcnMgdGhhdCBleHRlbmQKLWVhY2ggb3RoZXIgd2l0aCBuZXcgY2FwYWJpbGl0aWVzLiBWYXJpYWJpbGl0eSBhbHNvIGFsbG93cyB5b3UgdG8gZXh0ZW5kIGFuZAotdGFpbG9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgeW91IGRvIG5vdCBvd24gYW5kIGNhbm5vdCBkaXJlY3RseSBtb2RpZnksCi1hbmQgdG8gZWFzaWx5IHVwZ3JhZGUgdG8gbmV3ZXIgdmVyc2lvbnMgYnkgc2ltcGx5IHJlYXBwbHlpbmcgeW91ciBwZXJzb25hbAotY2hhbmdlcyB0byB0aGUgdXBncmFkZXMuPC9wPgotPHA+VGhlIHVzZSBvZiB2YXJpYWJpbGl0eSBhZmZlY3RzIHR3byBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBtZXRob2QgZWxlbWVudDoKLWl0cyBhdHRyaWJ1dGVzIGFuZCBpdHMgcmVsYXRpb25zaGlwcyB3aXRoIG90aGVyIGNvbnRlbnQgZWxlbWVudHMuIElmIGFuIGVsZW1lbnQKLWFsbG93cyB2YXJpYWJpbGl0eSwgdGhlIHNwZWNpZmljYXRpb24gaXMgc2hvd24gYXQgdGhlIGJvdHRvbSBvZiB0aGUgZWxlbWVudCdzCi1kZXNjcmlwdGlvbiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9InAiPkZvciB0aGUgcHVycG9zZXMgb2YgdmFyaWFiaWxpdHksIHRoZXJlIGFyZSB0aHJlZSBncm91cHMgb2YgaW5mb3JtYXRpb24KLWZvciBhbnkgZWxlbWVudCB0byBiZSBjb25zaWRlcmVkOjx1bD48bGk+PHN0cm9uZz5BdHRyaWJ1dGVzPC9zdHJvbmc+IC0gcGllY2VzIG9mIGRhdGEgYWJvdXQgYW4gZWxlbWVudCBzdWNoIGFzIE1haW4gRGVzY3JpcHRpb24uPC9saT4KLTxsaT48c3Ryb25nPkluY29taW5nIEFzc29jaWF0aW9uczwvc3Ryb25nPiAtIGFzc29jaWF0aW9ucyB0byBvdGhlciBlbGVtZW50cyB3aGVyZSB0aGUKLWFzc29jaWF0aW9uIHJlZmVyZW5jZSBpcyBoZWxkIGluIHRoZSBvdGhlciBlbGVtZW50LiBJbiBvdGhlciB3b3JkcywgdGhlIG90aGVyCi1lbGVtZW50IGhhcyByZWZlcmVuY2VzIHRvIHRoZSBzdWJqZWN0IGVsZW1lbnQuPC9saT4KLTxsaT48c3Ryb25nPk91dGdvaW5nIEFzc29jaWF0aW9uczwvc3Ryb25nPiAtIGFzc29jaWF0aW9ucyB0byBvdGhlciBlbGVtZW50cyB3aGVyZSB0aGUKLWFzc29jaWF0aW9uIHJlZmVyZW5jZSBpcyBoZWxkIGluIHRoZSBzdWJqZWN0IGVsZW1lbnQuIEluIG90aGVyIHdvcmRzLCB0aGUKLXN1YmplY3QgZWxlbWVudCBoYXMgcmVmZXJlbmNlcyB0byB0aGUgb3RoZXIgZWxlbWVudC48L2xpPgotPC91bD4KLUluIGFkZGl0aW9uLCBhc3NvY2lhdGlvbnMgY2FuIGJlIG9uZS10by1vbmUgb3Igb25lLXRvLW1hbnkuIFNlZSA8YSBocmVmPSJ2YXJpYWJpbGl0eWFzc29jaWF0aW9ucy5odG1sI3ZhcmlhYmlsaXR5YXNzb2NpYXRpb25zIj5WYXJpYWJpbGl0eSBBc3NvY2lhdGlvbnM8L2E+IGZvcgotYSBmdWxsIGxpc3Qgb2YgdGhlIGFzc29jaWF0aW9ucyBmb3IgZWFjaCB0eXBlIG9mIGVsZW1lbnQuPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+VmFyaWFiaWxpdHkgVHlwZTwvaDQ+PGRpdiBjbGFzcz0icCI+VmFyaWFiaWxpdHkKLXR5cGUgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBvbmUgZWxlbWVudCBhZmZlY3RzIGFub3RoZXIgZWxlbWVudCB1c2luZyB2YXJpYWJpbGl0eS4KLVRoZSB2YXJpYWJpbGl0eSB0eXBlcyBhcmU6PHVsPjxsaT48c3Ryb25nPk5vdCBBcHBsaWNhYmxlPC9zdHJvbmc+IC0gVGhlIGVsZW1lbnQgaXMgYSBiYXNlIGVsZW1lbnQgYW5kIGRvZXMgbm90IGFmZmVjdAotYW5vdGhlciBlbGVtZW50IHRocm91Z2ggdmFyaWFiaWxpdHkuIFRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYW4gZWxlbWVudCdzCi12YXJpYWJpbGl0eSB0eXBlLjwvbGk+Ci08L3VsPgotPHVsPjxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5Db250cmlidXRlczwvc3Bhbj48L3N0cm9uZz4gLQotQSBjb250cmlidXRpbmcgZWxlbWVudCBhZGRzIHRvIHRoZSBiYXNlIGVsZW1lbnQuIENvbnRyaWJ1dGVzIHByb3ZpZGVzIGEgd2F5Ci1mb3IgZWxlbWVudHMgdG8gY29udHJpYnV0ZSB0aGVpciBwcm9wZXJ0aWVzIGludG8gdGhlaXIgYmFzZSBlbGVtZW50IHdpdGhvdXQKLWRpcmVjdGx5IGNoYW5naW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcywgc3VjaCBhcyBpbiBhbiBhZGRpdGl2ZSBmYXNoaW9uLgotVGhlIGVmZmVjdCwgYWZ0ZXIgY29udHJpYnV0aW9uLCBpcyB0aGF0IHRoZSBiYXNlIGVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkCi13aXRoIGFuIGVsZW1lbnQgdGhhdCBjb21iaW5lcyB0aGUgYXR0cmlidXRlcyBhbmQgYXNzb2NpYXRpb25zIG9mIHRoZSBjb250cmlidXRpbmcKLWVsZW1lbnQgd2l0aCB0aGUgYmFzZSBlbGVtZW50LjwvbGk+Ci08L3VsPgotPHVsPjxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5SZXBsYWNlczwvc3Bhbj48L3N0cm9uZz4gLQotQSByZXBsYWNpbmcgZWxlbWVudCByZXBsYWNlcyBwYXJ0cyBvZiB0aGUgYmFzZSBlbGVtZW50LiBSZXBsYWNlcyBwcm92aWRlcwotYSB3YXkgZm9yIGFuIGVsZW1lbnQgdG8gcmVwbGFjZSBhIGJhc2UgZWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGNoYW5naW5nIGFueQotb2YgdGhlIGJhc2UgZWxlbWVudCdzIGV4aXN0aW5nIHByb3BlcnRpZXMuIFRoaXMgaXMsIGluIG1vc3QgY2FzZXMsIHVzZWQgZm9yCi1tZXRob2QgcGx1Zy1pbnMgdGhhdCBhaW0gdG8gcmVwbGFjZSBzcGVjaWZpYyBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgcm9sZXMsCi10YXNrcywgb3IgYWN0aXZpdGllcyB3aXRoIGVpdGhlciBhIGNvbXBsZXRlbHkgbmV3IHZhcmlhbnQgb3IgdG8gY2hhbmdlIHRoZQotZnVuZGFtZW50YWwgcmVsYXRpb25zaGlwcyBvZiB0aGVzZSBlbGVtZW50cy4gVGhlIGVmZmVjdCBvZiB0aGlzLCBpcyB0aGF0IHRoZQotYmFzZSBjb250ZW50IGVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkIHdpdGggdGhlIG5ldyByZXBsYWNpbmcgZWxlbWVudAotdG8gd2hpY2ggYWxsIGluY29taW5nIGFzc29jaWF0aW9ucyBzdGlsbCBwb2ludCBhcyBiZWZvcmUsIGJ1dCB3aGljaCBoYXMgcG90ZW50aWFsbHkKLW5ldyBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBvdXRnb2luZyBhc3NvY2lhdGlvbiBwcm9wZXJ0aWVzLjwvbGk+Ci08L3VsPgotPHVsPjxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5FeHRlbmRzPC9zcGFuPjwvc3Ryb25nPiAtCi1BbiBleHRlbmRpbmcgZWxlbWVudCBpbmhlcml0cyBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGJhc2UgZWxlbWVudC4gRXh0ZW5zaW9uCi1hbGxvd3MgTWV0aG9kIFBsdWctaW5zIHRvIGVhc2lseSByZXVzZSBlbGVtZW50cyBmcm9tIGEgYmFzZSBwbHVnLWluIGJ5IHByb3ZpZGluZwotYSBraW5kIG9mIGluaGVyaXRhbmNlIGZvciB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQuIEF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uCi1pbnN0YW5jZXMgYXJlIGluaGVyaXRlZCBmcm9tIHRoZSAiYmFzZWQtb24iIGVsZW1lbnQgdG8gdGhlIGV4dGVuZGluZyBlbGVtZW50LgotVGhlIHJlc3VsdCBpcyB0aGF0IHRoZSBleHRlbmRpbmcgZWxlbWVudCBoYXMgdGhlIHNhbWUgcHJvcGVydGllcyBhcyB0aGUgImJhc2VkLW9uIgotZWxlbWVudCwgYnV0IG1pZ2h0IGRlZmluZSBpdHMgb3duIGFkZGl0aW9ucy4gRXh0ZW5kcyBpcyBub3QgdXNlZCB0byBtb2RpZnkKLWNvbnRlbnQgb2YgdGhlIGJhc2UgcGx1Zy1pbiwgYnV0IHRvIHByb3ZpZGUgdGhlIGFiaWxpdHkgZm9yIHRoZSBleHRlbmRpbmcKLXBsdWctaW4gdG8gZGVmaW5lIGl0cyBvd24gY29udGVudCB3aGljaCBpcyBhIHZhcmlhbnQgb2YgY29udGVudCBhbHJlYWR5IGRlZmluZWQuCi1Gb3IgZXhhbXBsZSwgYSBzcGVjaWFsIHZlcnNpb24gb2YgYSBnZW5lcmljIFJldmlldyBSZWNvcmQgZm9yIGEgc3BlY2lmaWMgdHlwZQotb2YgcmV2aWV3LiBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB0aGUgYmFzZSBlbGVtZW50IGFuZCBhbnkgbnVtYmVyIG9mIGV4dGVuZGluZwotZWxlbWVudHMgY2FuIGJlIHVzZWQgc2lkZSBieSBzaWRlLCBidXQgcmVmZXIgdG8gZWFjaCBvdGhlciB0aHJvdWdoIHRoZSBleHRlbmRzCi1yZWxhdGlvbnNoaXAuIEV4dGVuZHMgYWxzbyBwcm92aWRlcyB0aGUga2V5IG1lY2hhbmlzbSBmb3IgYmluZGluZyBjYXBhYmlsaXR5Ci1wYXR0ZXJucyB0byBwcm9jZXNzZXM6IEEgcGF0dGVybiBpcyBhcHBsaWVkIGJ5IGRlZmluaW5nIGFuIGV4dGVuZHMgcmVsYXRpb25zaGlwCi1mcm9tIGFuIGFjdGl2aXR5IG9mIHRoZSBhcHBseWluZyBwcm9jZXNzZXMgdG8gdGhlIGNhcGFiaWxpdHkgcGF0dGVybi4gVGhlCi1hY3Rpdml0eSBpbmhlcml0cyBhc3NvY2lhdGlvbiBpbnN0YW5jZXMgZnJvbSB0aGUgcGF0dGVybiBhbmQgdGhlIHBhdHRlcm4gYXBwZWFycwotdG8gYmUgcGFydCBvZiB0aGUgcmVzdWx0aW5nIHByb2Nlc3MgYWZ0ZXIgaW50ZXJwcmV0YXRpb24uPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMuaHRtbCN2YXJpYWJpbGl0eWFzc29jaWF0aW9ucyI+VmFyaWFiaWxpdHkgQXNzb2NpYXRpb25zPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjb250cmlidXRlcy5odG1sIj5Db250cmlidXRlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0icmVwbGFjZS5odG1sI3JlcGxhY2VzIj5SZXBsYWNlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZXh0ZW5kcy5odG1sI2V4dGVuZHMiPkV4dGVuZHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC92YXJpYWJpbGl0eWFzc29jaWF0aW9ucy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC92YXJpYWJpbGl0eWFzc29jaWF0aW9ucy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OWEzZDJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJWYXJpYWJpbGl0eSBBc3NvY2lhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0idmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+VmFyaWFiaWxpdHkgQXNzb2NpYXRpb25zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ2YXJpYWJpbGl0eWFzc29jaWF0aW9ucyI+PGEgbmFtZT0idmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5WYXJpYWJpbGl0eSBBc3NvY2lhdGlvbnM8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj5UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSBpbmNvbWluZyBhbmQgb3V0Z29pbmcgYXNzb2NpYXRpb25zIGZvciBlYWNoCi1lbGVtZW50IHR5cGUgZm9yIHdoaWNoIHZhcmlhYmlsaXR5IGNhbiBiZSB1c2VkLiBBc3NvY2lhdGlvbnMgYWxzbyBoYXZlIGEgY2FyZGluYWxpdHkKLW9mIHRvLW1hbnkgb3IgdG8tb25lLgotPGRpdiBjbGFzcz0idGFibGVub2JvcmRlciI+PHRhYmxlIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCIgc3VtbWFyeT0iIiBmcmFtZT0iYm9yZGVyIiBib3JkZXI9IjEiIHJ1bGVzPSJhbGwiPjx0aGVhZCBhbGlnbj0ibGVmdCI+PHRyIHZhbGlnbj0iYm90dG9tIj48dGggdmFsaWduPSJib3R0b20iIGlkPSJkMGUxNiI+RWxlbWVudCBUeXBlPC90aD4KLTx0aCB2YWxpZ249ImJvdHRvbSIgaWQ9ImQwZTE4Ij5Bc3NvY2lhdGVkIEVsZW1lbnQgVHlwZTwvdGg+Ci08dGggdmFsaWduPSJib3R0b20iIGlkPSJkMGUyMCI+QXNzb2NpYXRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+PHRyPjx0ZCByb3dzcGFuPSI4IiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5Xb3JrIFByb2R1Y3Q8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNvbnRhaW5lZCBhcnRpZmFjdHM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmRlbGl2ZXJhYmxlIHBhcnRzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5ndWlkYW5jZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y29udGFpbmVyIGFydGlmYWN0PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1vbmU8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+ZGVsaXZlcmFibGU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW9uZTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5yZXNwb25zaWJsZSByb2xlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1vbmU8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+aW5wdXQgYW5kIG91dHB1dCB0byB0YXNrczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHJvd3NwYW49IjQiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPlJvbGU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPnJlc3BvbnNpYmxlIGZvciB3b3JrIHByb2R1Y3Q8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmd1aWRhbmNlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5wZXJmb3JtZXIgaW4gdGFzazwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHJvd3NwYW49IjciIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPlRhc2s8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPnByaW1hcnkgcGVyZm9ybWVyIHJvbGU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1vbmU8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+YWRkaXRpb25hbCBwZXJmb3JtZXIgcm9sZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0czwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Z3VpZGFuY2U8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPnN0ZXBzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmRpc2NpcGxpbmU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW9uZTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBjb2xzcGFuPSIzIiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgZDBlMTggZDBlMjAgIj5DYXRlZ29yaWVzPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHJvd3NwYW49IjIiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPkN1c3RvbSBDYXRlZ29yeTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y2F0ZWdvcml6ZWQgZWxlbWVudHM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPm90aGVyIGN1c3RvbSBjYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHJvd3NwYW49IjQiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPkRpc2NpcGxpbmU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNhdGVnb3JpemVkIHRhc2tzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5yZWZlcmVuY2VkIHdvcmtmbG93IGFjdGl2aXR5PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtb25lPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmRpc2NpcGxpbmUgZ3JvdXBpbmc8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW9uZTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jdXN0b20gY2F0ZWdvcmllczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCByb3dzcGFuPSIyIiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5EaXNjaXBsaW5lIEdyb3VwaW5nPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaXplZCBkaXNjaXBsaW5lczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y3VzdG9tIGNhdGVnb3JpZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgcm93c3Bhbj0iNCIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+RG9tYWluPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaXplZCB3b3JrIHByb2R1Y3RzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5zdWItZG9tYWluczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+c3VwZXItZG9tYWluczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tb25lPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmN1c3RvbSBjYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHJvd3NwYW49IjIiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPldvcmsgUHJvZHVjdCBUeXBlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaXplZCB3b3JrIHByb2R1Y3RzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jdXN0b20gY2F0ZWdvcmllczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCByb3dzcGFuPSIzIiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5Sb2xlIFNldDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y2F0ZWdvcml6ZWQgcm9sZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPnJvbGUgc2V0IGdyb3VwaW5nPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1vbmU8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y3VzdG9tIGNhdGVnb3JpZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgcm93c3Bhbj0iMiIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+Um9sZSBTZXQgR3JvdXBpbmc8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNhdGVnb3JpemVkIHJvbGUgc2V0czwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y3VzdG9tIGNhdGVnb3JpZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgY29sc3Bhbj0iMyIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2IGQwZTE4IGQwZTIwICI+R3VpZGFuY2U8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+UHJhY3RpY2U8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNvbnRlbnQgZWxlbWVudDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+T3RoZXIgR3VpZGFuY2UgVHlwZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPnNlY3Rpb25zIHZpYSBjb250ZW50IGRlc2NyaXB0aW9uczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sIiB0aXRsZT0iVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlIG9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZyB0aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuIj5WYXJpYWJpbGl0eTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiB0aXRsZT0iVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlIG9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZyB0aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuIj5WYXJpYWJpbGl0eTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvY29uZi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvY29uZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRlNWU2YjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL2NvbmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL21jLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9tYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ0MzQyYzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL21jLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9tY192c19wLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9tY192c19wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2RmMWIwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvbWNfdnNfcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvbWV0aG9kYXV0aG9yaW5nLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvbWV0aG9kYXV0aG9yaW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgzOGRkMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL21ldGhvZGF1dGhvcmluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPGh0bWw+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGhlYWQ+Ci08dGl0bGU+TWV0aG9kIENvbnRlbnQgQXV0aG9yaW5nIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgzPk1ldGhvZCBDb250ZW50IEF1dGhvcmluZyBPdmVydmlldzwvaDM+Ci08cD5NZXRob2QgY29udGVudCBkZXNjcmliZXMgcm9sZXMsIHRoZSB0YXNrcyB0aGF0IHRoZXkgcGVyZm9ybSwgdGhlIHdvcmsgcHJvZHVjdHMKLSAgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQgYnkgdGhvc2UgdGFza3MsIGFuZCBzdXBwb3J0aW5nIGd1aWRhbmNlLjwvcD4KLTxwPjxpbWcgc3JjPSJtYy5naWYiPjwvcD4KLTxwPlRoZSBmaWd1cmUgYWJvdmUgZGVwaWN0cyB0eXBpY2FsIHNvdXJjZXMgZm9yIG1ldGhvZCBjb250ZW50LCBhcyB3ZWxsIGFzIGhvdwotICB0aGUgbWV0aG9kIGNvbnRlbnQgaXMgcmVwcmVzZW50ZWQgaW4gRVBGIENvbXBvc2VyLiBNYW55IGRldmVsb3BtZW50IG1ldGhvZHMgYXJlIGRlc2NyaWJlZAotICBpbiBwdWJsaWNhdGlvbnMgc3VjaCBhcyBib29rcywgYXJ0aWNsZXMsIHRyYWluaW5nIG1hdGVyaWFsLCBzdGFuZGFyZHMgYW5kIHJlZ3VsYXRpb25zLAotICBhbmQgb3RoZXIgZm9ybXMgb2YgZG9jdW1lbnRhdGlvbi4gVGhlc2Ugc291cmNlcyB1c3VhbGx5IGRvY3VtZW50IG1ldGhvZHMgYnkKLSAgcHJvdmlkaW5nIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgZm9yIGEgcGFydGljdWxhciB3YXkgb2YgYWNoaWV2aW5nIGEgc3BlY2lmaWMKLSAgZGV2ZWxvcG1lbnQgZ29hbCB1bmRlciBnZW5lcmFsIGNpcmN1bXN0YW5jZXMuIFNvbWUgZXhhbXBsZXMgYXJlOiB0cmFuc2Zvcm1pbmcKLSAgYSByZXF1aXJlbWVudHMgZG9jdW1lbnQgaW50byBhbiBhbmFseXNpcyBtb2RlbDsgZGVmaW5pbmcgYW4gYXJjaGl0ZWN0dXJhbCBtZWNoYW5pc20KLSAgYmFzZWQgb24gZnVuY3Rpb25hbCBhbmQgbm9uLWZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzOyBjcmVhdGluZyBhIHByb2plY3QgcGxhbgotICBmb3IgYSBkZXZlbG9wbWVudCBpdGVyYXRpb247IGRlZmluaW5nIGEgcXVhbGl0eSBhc3N1cmFuY2UgcGxhbiBmb3IgZnVuY3Rpb25hbAotICByZXF1aXJlbWVudHM7IHJlZGVzaWduaW5nIGEgYnVzaW5lc3Mgb3JnYW5pemF0aW9uIGJhc2VkIG9uIGEgbmV3IHN0cmF0ZWdpYyBkaXJlY3Rpb24sCi0gIGFuZCBzbyBvbi48L3A+Ci08cD5FUEYgQ29tcG9zZXIgdGFrZXMgY29udGVudCBzdWNoIGFzIHRoYXQgZGVzY3JpYmVkIGFib3ZlLCBhbmQgc3RydWN0dXJlcyBpdCBpbiBhIHNwZWNpZmljCi0gIHNjaGVtYSBvZiByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZS4gVGhpcyBzY2hlbWEgc3VwcG9ydHMgdGhlCi0gIG9yZ2FuaXphdGlvbiBvZiBsYXJnZSBhbW91bnRzIG9mIGRlc2NyaXB0aW9ucyBmb3IgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLgotICBTdWNoIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgZG8gbm90IGhhdmUgdG8gYmUgbGltaXRlZCB0byBzb2Z0d2FyZSBlbmdpbmVlcmluZywKLSAgYnV0IGNhbiBhbHNvIGNvdmVyIG90aGVyIGRlc2lnbiBhbmQgZW5naW5lZXJpbmcgZGlzY2lwbGluZXMgc3VjaCBhcyBtZWNoYW5pY2FsCi0gIGVuZ2luZWVyaW5nLCBidXNpbmVzcyB0cmFuc2Zvcm1hdGlvbiwgc2FsZXMgY3ljbGVzLCBhbmQgc28gb24uPC9wPgotPHA+IFRoZSBFUEYgQ29tcG9zZXIgc2NyZWVuIGNhcHR1cmUgaW4gdGhlIGZpZ3VyZSBhYm92ZSBzaG93cyBob3cgc3VjaCBtZXRob2QgY29udGVudCBlbGVtZW50cwotICBhcmUgb3JnYW5pemVkIGluIHRyZWUgYnJvd3NlcnMgb24gdGhlIGxlZnQuIFRoZXNlIHRyZWUgYnJvd3NlcnMsIHNpbWlsYXIgdG8KLSAgYSBsaWJyYXJ5LCBwcm92aWRlIGRpZmZlcmVudCBpbmRleGVzIG9mIHRoZSBhdmFpbGFibGUgZWxlbWVudHMgZm9yIHJhcGlkIGFjY2Vzcy4KLSAgVGhlIHNjcmVlbiBjYXB0dXJlIHNob3dzIG9uIHRoZSByaWdodCBhbiBleGFtcGxlIG9mIGEgdGFzayBwcmVzZW50YXRpb24uIFRoaXMKLSAgdGFzayBwcmVzZW50YXRpb24gZGVmaW5lcyB0aGUgdGFzayBpbiB0ZXJtcyBvZiBzdGVwcyB0aGF0IG5lZWQgdG8gYmUgcGVyZm9ybWVkCi0gIHRvIGFjaGlldmUgdGhlIHRhc2sncyBwdXJwb3NlLiBZb3UgY2FuIHNlZSB0aGF0IHRoZSB0YXNrIGhhcyB2YXJpb3VzIHJlbGF0aW9uc2hpcHMsCi0gIHN1Y2ggYXMgcmVsYXRpb25zaGlwcyB0byBwZXJmb3JtaW5nIHJvbGVzIGFzIHdlbGwgYXMgd29yayBwcm9kdWN0cyB0aGF0IHNlcnZlCi0gIGFzIGlucHV0cyBhbmQgb3V0cHV0cyB0byB0aGUgdGFzay4gRmluZCBvdXQgbW9yZSBkZXRhaWxzIG9uIHRhc2tzLCByb2xlLCBhbmQKLSAgd29yayBwcm9kdWN0cyBpbiB0aGUgb25saW5lIGhlbHAgPGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPmhlcmU8L2E+LgotICBJbiBhZGRpdGlvbiB0byByb2xlcywgdGFza3MsIGFuZCB3b3JrIHByb2R1Y3RzLCBFUEYgQ29tcG9zZXIgc3VwcG9ydHMgdGhlIGFkZGl0aW9uIG9mCi0gIGd1aWRhbmNlIGVsZW1lbnRzLiBHdWlkYW5jZSBhcmUgc3VwcGxlbWVudGFyeSBmcmVlLWZvcm0gZG9jdW1lbnRhdGlvbiBzdWNoIGFzCi0gIHdoaXRlcGFwZXJzLCBjb25jZXB0IGRlc2NyaXB0aW9ucywgZ3VpZGVsaW5lcywgdGVtcGxhdGVzLCBleGFtcGxlcywgYW5kIHNvIG9uLjwvcD4KLTxwPkVQRiBDb21wb3NlciBwcm92aWRlcyB2YXJpb3VzIGZvcm0tYmFzZWQgZWRpdG9ycyB0byBjcmVhdGUgbmV3IG1ldGhvZCBjb250ZW50IGVsZW1lbnRzLgotICBEb2N1bWVudCB5b3VyIHRhc2ssIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudHMgdXNpbmcgaW50dWl0aXZlCi0gIHJpY2gtdGV4dCBlZGl0b3JzIHRoYXQgYWxsb3cgeW91IHRvIGNvcHkgYW5kIHBhc3RlIHRleHQgZnJvbSBvdGhlciBzb3VyY2VzIHN1Y2gKLSAgYXMgd2ViIHBhZ2VzIG9yIGRvY3VtZW50cy4gVXNlIHNpbXBsZSBkaWFsb2dzIHRvIGVzdGFibGlzaCByZWxhdGlvbnNoaXBzIGJldHdlZW4KLSAgY29udGVudCBlbGVtZW50cy48L3A+Ci08cD5FUEYgQ29tcG9zZXIgb3JnYW5pemVzIGNvbnRlbnQgaW4gcGh5c2ljYWwgY29udGVudCBwYWNrYWdlcyB0aGF0IGFsbG93IHlvdSB0byBtYW5hZ2UKLSAgeW91ciBjb250ZW50IGluIGNvbmZpZ3VyYWJsZSB1bml0cy4gRVBGIENvbXBvc2VyIGFsc28gYWxsb3dzIHlvdSB0byBjYXRlZ29yaXplIHlvdXIgY29udGVudAotICBiYXNlZCBvbiBhIHNldCBvZiBwcmVkZWZpbmVkIGNhdGVnb3JpZXMgKGZvciBleGFtcGxlLCBjYXRlZ29yaXplIHlvdXIgdGFza3MKLSAgaW50byBkZXZlbG9wbWVudCBkaXNjaXBsaW5lcywgb3IgeW91ciB3b3JrIHByb2R1Y3RzIGludG8gZG9tYWlucykgb3IgY3JlYXRlCi0gIHlvdXIgb3duIGNhdGVnb3JpemF0aW9uIHNjaGVtZXMgZm9yIHlvdXIgY29udGVudCB3aXRoIHlvdXIgb3duIHVzZXItZGVmaW5lZAotICBjYXRlZ29yaWVzIHRoYXQgYWxsb3cgeW91IHRvIGluZGV4IGNvbnRlbnQgaW4gYW55IHdheSB5b3Ugd2FudC48L3A+Ci08cD5Gb3IgbW9yZSBkZXRhaWxzIG9uIG1ldGhvZCBjb250ZW50IGF1dGhvcmluZyBzZWUgdGhlIG9ubGluZSBoZWxwOjwvcD4KLTxkaXYgYWxpZ249ImxlZnQiPgotPHVsPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPk1ldGhvZAotICAgICAgQXV0aG9yaW5nIE92ZXJ2aWV3PC9hPjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08cD4mbmJzcDs8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvb3ZlcnZpZXcuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9vdmVydmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwM2Y5MTQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9vdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLTxodG1sPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxoZWFkPgotPHRpdGxlPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDM+SW50cm9kdWN0aW9uIHRvIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgKEVQRiBDb21wb3Nlcik8L2gzPgotPHA+V2VsY29tZSB0byBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIChFUEYgQ29tcG9zZXIpLiBFUEYgQ29tcG9zZXIgaXMgYSB0b29sIHBsYXRmb3JtIHRoYXQgZW5hYmxlcwotICBwcm9jZXNzIGVuZ2luZWVycyBhbmQgbWFuYWdlcnMgdG8gaW1wbGVtZW50LCBkZXBsb3ksIGFuZCBtYWludGFpbiBwcm9jZXNzZXMKLSAgZm9yIG9yZ2FuaXphdGlvbnMgb3IgaW5kaXZpZHVhbCBwcm9qZWN0cy4gVHlwaWNhbGx5LCB0d28ga2V5IHByb2JsZW1zIG5lZWQgdG8KLSAgYmUgYWRkcmVzc2VkIHRvIHN1Y2Nlc3NmdWxseSBkZXBsb3kgbmV3IHByb2Nlc3Nlcy48L3A+Ci08cD4gRmlyc3QsIGRldmVsb3BtZW50IHRlYW1zIG5lZWQgdG8gYmUgZWR1Y2F0ZWQgb24gdGhlIG1ldGhvZHMgYXBwbGljYWJsZSB0bwotICB0aGUgcm9sZXMgdGhhdCB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuIFNvZnR3YXJlIGRldmVsb3BlcnMgdHlwaWNhbGx5IG5lZWQKLSAgdG8KLSAgbGVhcm4KLSAgaG93Ci0gIHRvCi0gIGRvIGFuYWx5c2lzIGFuZCBkZXNpZ24sIHRlc3RlcnMgbmVlZCB0byBsZWFybiBob3cgdG8gdGVzdCBpbXBsZW1lbnRhdGlvbnMgYWdhaW5zdAotICAgcmVxdWlyZW1lbnRzLCBtYW5hZ2VycyBuZWVkIHRvIGxlYXJuIGhvdyB0byBtYW5hZ2UgdGhlIHByb2plY3Qgc2NvcGUgYW5kIGNoYW5nZSwKLQotICBhbmQgc28gb24uIFNvbWUgb3JnYW5pemF0aW9ucyBhc3N1bWUgdGhhdCBkZXZlbG9wZXJzIGltcGxpY2l0bHkga25vdyBob3cgdG8KLSAgIGRvIHN1Y2ggd29yayB3aXRob3V0IGRvY3VtZW50aW5nIHRoZWlyIG1ldGhvZHMsIGJ1dCBtYW55IG9yZ2FuaXphdGlvbnMgd2FudAotCi0gIHRvIGVzdGFibGlzaCBjb21tb24gYW5kIHJlZ3VsYXRlZCBwcmFjdGljZXMsIHRvIGRyaXZlIHNwZWNpZmljIGltcHJvdmVtZW50Ci0gIG9iamVjdGl2ZXMsICBhbmQgdG8gbWVldCBjb21wbGlhbmNlIHN0YW5kYXJkcy48L3A+Ci08cD4gU2Vjb25kLCBkZXZlbG9wbWVudCB0ZWFtcyBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRvIGFwcGx5IHRoZXNlIG1ldGhvZHMgdGhyb3VnaG91dAotICBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gVGhhdCBpcywgdGhleSBuZWVkIHRvIGRlZmluZSBvciBzZWxlY3QgYSBkZXZlbG9wbWVudAotICBwcm9jZXNzLiBGb3IKLQotICBleGFtcGxlLCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCBtZXRob2RzIGhhdmUgdG8gYmUgYXBwbGllZCBkaWZmZXJlbnRseSBpbgotICBlYXJseSAgcGhhc2VzIG9mIGEgcHJvamVjdCB3aGVyZSB0aGUgZm9jdXMgaXMgb24gZWxpY2l0YXRpb24gb2Ygc3Rha2Vob2xkZXIKLSAgbmVlZHMgYW5kCi0gIHJlcXVpcmVtZW50cyBhbmQgc2NvcGluZyBhIHZpc2lvbiwgdGhhbiBpbiBsYXRlciBwaGFzZXMgd2hlcmUgdGhlIGZvY3VzIGlzCi0gIG9uICBtYW5hZ2luZyByZXF1aXJlbWVudHMgdXBkYXRlcyBhbmQgY2hhbmdlcyBhbmQgcGVyZm9ybWluZyBpbXBhY3QgYW5hbHlzaXMKLSAgb2YKLSAgdGhlc2UgcmVxdWlyZW1lbnRzIGNoYW5nZXMuIFRlYW1zIGFsc28gbmVlZCBjbGVhciB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGUKLSAgZGlmZmVyZW50ICB0YXNrcyBvZiB0aGUgbWV0aG9kcyByZWxhdGUgdG8gZWFjaCBvdGhlciwgZm9yIGV4YW1wbGUsIGhvdyB0aGUKLSAgY2hhbmdlIG1hbmFnZW1lbnQKLSAgbWV0aG9kIGltcGFjdHMgdGhlIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50IG1ldGhvZCBhcyB3ZWxsIGFzIHJlZ3Jlc3Npb24gdGVzdGluZwotICAgbWV0aG9kIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZS4gRXZlbiBzZWxmLW9yZ2FuaXppbmcgdGVhbXMgbmVlZCB0byBkZWZpbmUKLSAgYQotICBwcm9jZXNzIHRoYXQgZ2l2ZXMgYXQgbWluaW11bSBzb21lIGd1aWRhbmNlIG9uIGhvdyB0aGUgZGV2ZWxvcG1lbnQgd2lsbCBiZQotICBzY29wZWQgIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSwgd2hlbiBtaWxlc3RvbmVzIHdpbGwgYmUgYWNoaWV2ZWQgYW5kIHZlcmlmaWVkLAotICBhbmQKLSAgc28gb24uIDwvcD4KLTxwPlRvIHRoYXQgZW5kLCBFUEYgQ29tcG9zZXIgaGFzIHR3byBtYWluIHB1cnBvc2VzOiA8L3A+Ci08ZGl2IGFsaWduPSJsZWZ0Ij48dWw+Ci0gIDxsaT5UbyBwcm92aWRlIGEga25vd2xlZGdlIGJhc2Ugb2YgaW50ZWxsZWN0dWFsIGNhcGl0YWwgd2hpY2ggeW91IGNhbiBicm93c2UsCi0gICAgbWFuYWdlIGFuZCBkZXBsb3kuIFRoaXMgY29udGVudCBjYW4gaW5jbHVkZSBleHRlcm5hbGx5IGRldmVsb3BlZCBjb250ZW50LAotICAgIGFuZCwgbW9yZSBpbXBvcnRhbnRseSwgY2FuIGluY2x1ZGUgeW91ciBvd24gY29udGVudCBpbmNsdWRpbmcgb2Ygd2hpdGVwYXBlcnMsCi0gICAgZ3VpZGVsaW5lcywgdGVtcGxhdGVzLCBwcmluY2lwbGVzLCBiZXN0IHByYWN0aWNlcywgaW50ZXJuYWwgcHJvY2VkdXJlcyBhbmQKLSAgICByZWd1bGF0aW9ucywgdHJhaW5pbmcgbWF0ZXJpYWwsIGFuZCBhbnkgb3RoZXIgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgeW91cgotICAgIG1ldGhvZHMuIFRoaXMga25vd2xlZGdlIGJhc2UgY2FuIHVzZWQgZm9yIHJlZmVyZW5jZSBhbmQgZWR1Y2F0aW9uLiBJdCBhbHNvCi0gICAgZm9ybXMgdGhlIGJhc2lzIGZvciBkZXZlbG9waW5nIHByb2Nlc3NlcyAodGhlIHNlY29uZCBwdXJwb3NlKS4gRVBGIENvbXBvc2VyIGlzIGRlc2lnbmVkCi0gICAgdG8gYmUgYSBjb250ZW50IG1hbmFnZW1lbnQgc3lzdGVtIHRoYXQgcHJvdmlkZXMgYSBjb21tb24gbWFuYWdlbWVudCBzdHJ1Y3R1cmUKLSAgICBhbmQgbG9vayBhbmQgZmVlbCBmb3IgYWxsIG9mIHlvdXIgY29udGVudCwgcmF0aGVyIHRoYW4gYmVpbmcgYSBkb2N1bWVudCBtYW5hZ2VtZW50Ci0gICAgc3lzdGVtIGluIHdoaWNoIHlvdSB3b3VsZCBzdG9yZSBhbmQgYWNjZXNzIGhhcmQgdG8gbWFpbnRhaW4gbGVnYWN5IGRvY3VtZW50cwotICAgIGFsbCBpbiB0aGVpciBvd24gc2hhcGVzIGFuZCBmb3JtYXRzLiBBbGwgY29udGVudCBtYW5hZ2VkIGluIEVQRiBDb21wb3NlciBjYW4gYmUgcHVibGlzaGVkCi0gICAgdG8gaHRtbCBhbmQgZGVwbG95ZWQgdG8gV2ViIHNlcnZlcnMgZm9yIGRpc3RyaWJ1dGVkIHVzYWdlLjxicj4KLSAgPC9saT4KLSAgPGxpPlRvIHByb3ZpZGUgcHJvY2VzcyBlbmdpbmVlcmluZyBjYXBhYmlsaXRpZXMgYnkgc3VwcG9ydGluZyBwcm9jZXNzIGVuZ2luZWVycwotICAgIGFuZCBwcm9qZWN0IG1hbmFnZXJzIGluIHNlbGVjdGluZywgdGFpbG9yaW5nLCBhbmQgcmFwaWRseSBhc3NlbWJsaW5nIHByb2Nlc3NlcwotICAgIGZvciB0aGVpciBjb25jcmV0ZSBkZXZlbG9wbWVudCBwcm9qZWN0cy4gRVBGIENvbXBvc2VyIHByb3ZpZGVzIGNhdGFsb2dzIG9mIHByZS1kZWZpbmVkCi0gICAgcHJvY2Vzc2VzIGZvciB0eXBpY2FsIHByb2plY3Qgc2l0dWF0aW9ucyB0aGF0IGNhbiBiZSBhZGFwdGVkIHRvIGluZGl2aWR1YWwKLSAgICBuZWVkcy4gSXQgYWxzbyBwcm92aWRlcyBwcm9jZXNzIGJ1aWxkaW5nIGJsb2NrcywgY2FsbGVkIGNhcGFiaWxpdHkgcGF0dGVybnMsCi0gICAgdGhhdCByZXByZXNlbnQgYmVzdCBkZXZlbG9wbWVudCBwcmFjdGljZXMgZm9yIHNwZWNpZmljIGRpc2NpcGxpbmVzLCB0ZWNobm9sb2dpZXMsCi0gICAgb3IgbWFuYWdlbWVudCBzdHlsZXMuIFRoZXNlIGJ1aWxkaW5nIGJsb2NrcyBmb3JtIGEgdG9vbGtpdCBmb3IgcXVpY2sgYXNzZW1ibHkKLSAgICBvZiBwcm9jZXNzZXMgYmFzZWQgb24gcHJvamVjdC1zcGVjaWZpYyBuZWVkcy4gRVBGIENvbXBvc2VyIGFsc28gYWxsb3dzIHlvdSB0byBzZXQgdXAKLSAgICB5b3VyIG93biBvcmdhbml6YXRpb24tc3BlY2lmaWMgY2FwYWJpbGl0eSBwYXR0ZXJuIGxpYnJhcmllcy4gRmluYWxseSwgdGhlCi0gICAgcHJvY2Vzc2VzIGNyZWF0ZWQgd2l0aCBFUEYgQ29tcG9zZXIgY2FuIGJlIHB1Ymxpc2hlZCBhbmQgZGVwbG95ZWQgYXMgV2ViIHNpdGVzLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08aDM+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcidzIEtleSBDYXBhYmlsaXRpZXM8L2gzPgotPHA+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBwcm92aWRlcyB0aGUgZm9sbG93aW5nIG5ldyBrZXkgY2FwYWJpbGl0aWVzOjwvcD4KLSAgPGRpdiBhbGlnbj0ibGVmdCI+Ci08dWw+Ci0gIDxsaT4gUHJvdmlkZXMgY29tcGxldGVseSByZWRlc2lnbmVkIHRvb2xzIGZvciBhdXRob3JpbmcsIGNvbmZpZ3VyaW5nLCB2aWV3aW5nLAotICAgIGFuZCBwdWJsaXNoaW5nIGRldmVsb3BtZW50IHByb2Nlc3Nlcy48L2xpPgotICA8bGk+IFByb3ZpZGVzIGp1c3QtaW4tdGltZSBnZW5lcmF0aW9uIG9mIHB1YmxpY2F0aW9uIHByZXZpZXdzIGluIGRlZGljYXRlZCBicm93c2luZwotICAgIHBlcnNwZWN0aXZlIHRoYXQgYWxsb3dzIHJhcGlkIGNvbmZpZ3VyYXRpb24gc3dpdGNoaW5nLjwvbGk+Ci0gIDxsaT4gTWFuYWdlcyBtZXRob2QgY29udGVudCB1c2luZyBzaW1wbGUgZm9ybS1iYXNlZCB1c2VyIGludGVyZmFjZXMuIFRoZXJlZm9yZSwKLSAgICBVTUwgbW9kZWxpbmcgc2tpbGxzIGFyZSBubyBsb25nZXIgcmVxdWlyZWQuPC9saT4KLSAgPGxpPiBQcm92aWRlcyBpbnR1aXRpdmUgcmljaCB0ZXh0IGVkaXRvcnMgZm9yIGNyZWF0aW5nIGlsbHVzdHJhdGl2ZSBjb250ZW50Ci0gICAgZGVzY3JpcHRpb25zLiBFZGl0b3JzIGFsbG93IHVzZSBvZiBzdHlsZXMsIGltYWdlcywgdGFibGVzLCBoeXBlcmxpbmtzLCBhbmQKLSAgICBkaXJlY3QgaHRtbCBlZGl0aW5nLjwvbGk+Ci0gIDxsaT5BbGxvd3MgY3JlYXRpbmcgcHJvY2Vzc2VzIHdpdGggYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3JzIGFuZCB3b3JrZmxvdwotICAgIGRpYWdyYW1zIHRocm91Z2ggdXNlIG9mIG11bHRpLXByZXNlbnRhdGlvbiBwcm9jZXNzIGVkaXRvcnMuIEJyZWFrZG93biBzdHJ1Y3R1cmUKLSAgICBlZGl0b3Igc3VwcG9ydHMgZGlmZmVyZW50IHByb2Nlc3Mgdmlld3M6IHdvcmstYnJlYWtkb3duIHZpZXcsIHdvcmsgcHJvZHVjdAotICAgIHVzYWdlIHZpZXcsIGFuZCB0ZWFtIGFsbG9jYXRpb24gdmlldy4gRVBGIENvbXBvc2VyIGF1dG9tYXRpY2FsbHkgc3luY2hyb25pemVzIGFsbCBwcmVzZW50YXRpb25zCi0gICAgd2l0aCBwcm9jZXNzIGNoYW5nZXMuIDwvbGk+Ci0gIDxsaT5Qcm92aWRlcyBzdXBwb3J0IGZvciBtYW55IGFsdGVybmF0aXZlIGxpZmVjeWNsZQotICAgIG1vZGVscy4gRm9yIGV4YW1wbGUsIHdhdGVyZmFsbCwgaW5jcmVtZW50YWwsIG9yIGl0ZXJhdGl2ZSBtb2RlbHMgY2FuIGJlIGNyZWF0ZWQKLSAgICB3aXRoIHRoZSBzYW1lIG92ZXJsYXBwaW5nIG1ldGhvZCBjb250ZW50LjwvbGk+Ci0gIDxsaT5JbXByb3ZlZCByZXVzZSBhbmQgZXh0ZW5zaWJpbGl0eSBjYXBhYmlsaXRpZXMuIFRoZSBwbHVnLWluIG1lY2hhbmlzbXMgZnJvbQotICAgIHBhc3QgdmVyc2lvbnMgaGF2ZSBiZWVuIGV4dGVuZGVkIHRvIHN1cHBvcnQgZXh0ZW5zaW9ucyBmb3IgYnJlYWtkb3duIHN0cnVjdHVyZXMuPC9saT4KLSAgPGxpPlN1cHBvcnRzIHJldXNhYmxlIGR5bmFtaWNhbGx5LWxpbmtlZCBwcm9jZXNzIHBhdHRlcm5zIG9mIGJlc3QgcHJhY3RpY2VzCi0gICAgZm9yIHJhcGlkIHByb2Nlc3MgYXNzZW1ibHkgdmlhIGRyYWctYW5kLWRyb3AuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxoMz5LZXkgVGVybWlub2xvZ3kgYW5kIENvbmNlcHRzPC9oMz4KLTxwPlRvIGVmZmVjdGl2ZWx5IHdvcmsgd2l0aCBFUEYgQ29tcG9zZXIsIHlvdSBuZWVkIHRvIHVuZGVyc3RhbmQgYSBmZXcgY29uY2VwdHMKLSAgdGhhdCBhcmUgdXNlZCB0byBvcmdhbml6ZSB0aGUgY29udGVudC4gVGhlIHBhZ2VzIDxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2RhdXRob3JpbmdvdmVydmlldy5odG1sIj5NZXRob2QKLSAgQ29udGVudCBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+IGFuZCA8YSBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPlByb2Nlc3MKLSAgQXV0aG9yaW5nIE92ZXJ2aWV3PC9hPiBjb250YWluIG1vcmUgZGV0YWlsIGFuZCBjb25jcmV0ZSBleGFtcGxlcyBvZiBob3cgdG8gd29yawotICBpbiB0aGUgdG9vbC4gVGhpcyBwYWdlIHByb3ZpZGVzIHlvdSB3aXRoIGEgZ2VuZXJhbCBvdmVydmlldyBvZiB0aGVzZSBjb25jZXB0cy48L3A+Ci08cD5UaGUgbW9zdCBmdW5kYW1lbnRhbCBwcmluY2lwbGUgaW4gRVBGIENvbXBvc2VyIGlzIHRoZSBzZXBhcmF0aW9uIG9mIHJldXNhYmxlIGNvcmUgbWV0aG9kCi0gIGNvbnRlbnQgZnJvbSBpdHMgYXBwbGljYXRpb24gaW4gcHJvY2Vzc2VzLiBUaGlzIGRpcmVjdGx5IHJlbGF0ZXMgYmFjayB0byB0aGUKLSAgdHdvIHB1cnBvc2VzIG9mIEVQRiBDb21wb3NlciBkZXNjcmliZWQgaW4gdGhlIGZpcnN0IHNlY3Rpb24uIEFsbW9zdCBhbGwgb2YgRVBGIENvbXBvc2VyJ3MgY29uY2VwdHMKLSAgYXJlIGNhdGVnb3JpemVkIGFsb25nIHRoaXMgc2VwYXJhdGlvbi4gTWV0aG9kIGNvbnRlbnQgZGVzY3JpYmVzIHdoYXQgaXMgdG8gYmUKLSAgcHJvZHVjZWQsIHRoZSBuZWNlc3Nhcnkgc2tpbGxzIHJlcXVpcmVkIGFuZCB0aGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBkZXNjcmliaW5nCi0gIGhvdyBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQuIFRoZXNlIG1ldGhvZCBjb250ZW50IGRlc2NyaXB0aW9ucwotICBhcmUgaW5kZXBlbmRlbnQgb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuIFByb2Nlc3NlcyBkZXNjcmliZSB0aGUgZGV2ZWxvcG1lbnQKLSAgbGlmZWN5Y2xlLiBQcm9jZXNzZXMgdGFrZSB0aGUgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkCi0gIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLjwvcD4KLTxwPjxpbWcgc3JjPSJ1bWFfaHVtcC5naWYiPjwvcD4KLTxwPlRoZSBmaWd1cmUgYWJvdmUgc2hvd3MgaG93IHRoaXMgc2VwYXJhdGlvbiBpcyBkZXBpY3RlZCBpbiBCYXNpYyBVbmlmaWVkCi0gIFByb2Nlc3MuIE1ldGhvZCBjb250ZW50LCBkZXNjcmliaW5nIGhvdyBkZXZlbG9wbWVudCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCwKLSAgaXMgY2F0ZWdvcml6ZWQgYnkgZGlzY2lwbGluZXMgYWxvbmcgdGhlIHktYXhpcyBvZiB0aGUgZGlhZ3JhbS4gVGhlIHdvcmsgZGVzY3JpYmVkCi0gIGluIGEgcHJvY2VzcyBpcyBzZWVuIGFsb25nIHRoZSB4LWF4aXMgcmVwcmVzZW50aW5nIHRoZSB0aW1lbGluZS4gVGhpcyBpcyB0aGUKLSAgbGlmZWN5Y2xlIG9mIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gSXQgZXhwcmVzc2VzIHdoZW4gd2hhdCB3b3JrIHdpbGwgYmUgcGVyZm9ybWVkLgotICBUaGUgZ3JhcGggaW4gdGhlIGlsbHVzdHJhdGlvbiByZXByZXNlbnRzIGFuIGVzdGltYXRlZCB3b3JrbG9hZCBmb3IgZWFjaCBkaXNjaXBsaW5lLgotICBBcyB5b3Ugc2VlLCBmb3IgZXhhbXBsZSwgb25lIG5ldmVyIHN0b3BzIHdvcmtpbmcgb24gcmVxdWlyZW1lbnRzIGluIFJVUCwgYnV0Ci0gIHRoZXJlIGFyZSBjZXJ0YWlubHkgcGVhayB0aW1lcyBpbiB3aGljaCBtb3N0IG9mIHRoZSByZXF1aXJlbWVudHMgZWxpY2l0YXRpb24KLSAgYW5kIGRlc2NyaXB0aW9uIHdvcmsgaXMgcGVyZm9ybWVkLiBUaGVyZSBhcmUgYWxzbyB0aW1lcyBhdCB3aGljaCBhIGRvd253YXJkCi0gIHRyZW5kIG5lZWRzIHRvIGJlIG9ic2VydmVkIHdoZXJlIGZld2VyIGFuZCBmZXdlciByZXF1aXJlbWVudHMgY2hhbmdlcyBoYXZlIHRvCi0gIGJlIHByb2Nlc3NlZCB0byBicmluZyB0aGUgcHJvamVjdCB0byBhIGNsb3NlLiBUaGlzIGF2b2lkcyB3aGF0IGlzIHJlZmVycmVkIHRvCi0gIGFzIGZlYXR1cmUgY3JlZXAgaW4gd2hpY2ggcmVxdWlyZW1lbnRzIHdvcmsgcmVtYWlucyBjb25zdGFudCBvciBldmVuIGluY3JlYXNlcy4KLSAgSGVuY2UsIGEgbGlmZWN5Y2xlIChwcm9jZXNzKSBleHByZXNzZXMgdGhlIHZhcmlhbmNlcyBvZiB3b3JrIHBlcmZvcm1lZCBpbiB0aGUKLSAgdmFyaW91cyBkaXNjaXBsaW5lcyAobWV0aG9kIGNvbnRlbnQpLjwvcD4KLTxwPjxpbWcgc3JjPSJtY192c19wLmdpZiI+PC9wPgotPHA+VGhlIHBpY3R1cmUgYWJvdmUgcHJvdmlkZXMgYSBzdW1tYXJ5IG9mIHRoZSBrZXkgZWxlbWVudHMgdXNlZCBpbiBFUEYgQ29tcG9zZXIgYW5kIGhvdwotICB0aGV5IHJlbGF0ZSB0byBtZXRob2QgY29udGVudCBvciBwcm9jZXNzLiBBcyB5b3Ugc2VlLCBtZXRob2QgY29udGVudCBpcyBwcmltYXJpbHkKLSAgZXhwcmVzc2VkIHVzaW5nIHdvcmsgcHJvZHVjdHMsIHJvbGVzLCB0YXNrcywgYW5kIGd1aWRhbmNlLiBHdWlkYW5jZSwgc3VjaCBhcwotICBjaGVja2xpc3RzLCBleGFtcGxlcywgb3Igcm9hZG1hcHMsIGNhbiBhbHNvIGJlIGRlZmluZWQgdG8gcHJvdmlkZSBleGVtcGxhcnkKLSAgd2Fsa3Rocm91Z2hzIG9mIGEgcHJvY2Vzcy4gT24gdGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgZGlhZ3JhbSwgeW91IHNlZSB0aGUKLSAgZWxlbWVudHMgdXNlZCB0byByZXByZXNlbnQgcHJvY2Vzc2VzIGluIEVQRiBDb21wb3Nlci4gVGhlIG1haW4gZWxlbWVudCBpcyB0aGUgYWN0aXZpdHkKLSAgdGhhdCBjYW4gYmUgbmVzdGVkIHRvIGRlZmluZSBicmVha2Rvd24gc3RydWN0dXJlcyBhcyB3ZWxsIGFzIHJlbGF0ZWQgdG8gZWFjaAotICBvdGhlciB0byBkZWZpbmUgYSBmbG93IG9mIHdvcmsuIEFjdGl2aXRpZXMgYWxzbyBjb250YWluIGRlc2NyaXB0b3JzIHRoYXQgcmVmZXJlbmNlCi0gIG1ldGhvZCBjb250ZW50LiBBY3Rpdml0aWVzIGFyZSB1c2VkIHRvIGRlZmluZSBwcm9jZXNzZXMgb2Ygd2hpY2ggRVBGIENvbXBvc2VyIHN1cHBvcnQKLSAgdHdvIG1haW4ga2luZHM6IGRlbGl2ZXJ5IHByb2Nlc3NlcyBhbmQgY2FwYWJpbGl0eSBwYXR0ZXJucy4gRGVsaXZlcnkgcHJvY2Vzc2VzCi0gIHJlcHJlc2VudCBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIHByb2Nlc3MgdGVtcGxhdGUgZm9yIHBlcmZvcm1pbmcgb25lIHNwZWNpZmljCi0gIHR5cGUgb2YgcHJvamVjdC4gVGhleSBkZXNjcmliZSBhIGNvbXBsZXRlIGVuZC10by1lbmQgcHJvamVjdCBsaWZlY3ljbGUgYW5kIGFyZQotICB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MuIENhcGFiaWxpdHkKLSAgcGF0dGVybnMgYXJlIHByb2Nlc3NlcyB0aGF0IGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhCi0gIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBkaXNjaXBsaW5lIG9yIGEgYmVzdCBwcmFjdGljZS4gVGhleSBhcmUgYWxzbwotICB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBkZWxpdmVyeSBwcm9jZXNzZXMgb3IgbGFyZ2VyIGNhcGFiaWxpdHkKLSAgcGF0dGVybnMuIFRoaXMgZW5zdXJlcyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGVpciBrZXkgYmVzdCBwcmFjdGljZXMKLSAgaW4gcHJvY2VzcyBhdXRob3JpbmcgYWN0aXZpdGllcyBpbiBFUEYgQ29tcG9zZXIuIDwvcD4KLQotPHA+Rm9yIG1vcmUgZGV0YWlscyBvbiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyLCBzZWUgdGhlIG9ubGluZSBoZWxwOjwvcD4KLTxkaXYgYWxpZ249ImxlZnQiPgotPHVsPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Fib3V0ZXBmY29tcG9zZXIuaHRtbCI+T3ZlcnZpZXc8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldy5odG1sIj5HZXR0aW5nCi0gICAgICBTdGFydGVkPC9hPjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08cD48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvcC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiODY4ODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3Byb2Nlc3NhdXRob3JpbmcuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9wcm9jZXNzYXV0aG9yaW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQzODQyMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3Byb2Nlc3NhdXRob3JpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTxodG1sPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxoZWFkPgotPHRpdGxlPlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgzPlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3PC9oMz4KLTxwPkEgZGV2ZWxvcG1lbnQgcHJvY2VzcyBkZWZpbmVzIHNlcXVlbmNlcyBvZiB0YXNrcyBwZXJmb3JtZWQgYnkgcm9sZXMgYW5kIHdvcmsKLSAgcHJvZHVjdHMgcHJvZHVjZWQgb3ZlciB0aW1lLjwvcD4KLTxwPjxpbWcgc3JjPSJwLmdpZiI+PC9wPgotPHA+VGhlIGZpZ3VyZSBhYm92ZSBzaG93cyB0aGF0IHByb2Nlc3NlcyBhcmUgdHlwaWNhbGx5IGV4cHJlc3NlZCBhcyB3b3JrZmxvd3MKLSAgb3IgYnJlYWtkb3duIHN0cnVjdHVyZXMuIERlZmluaW5nIGEgc3RyaWN0IHNlcXVlbmNlIGFzIGluIGEgd2F0ZXJmYWxsIG1vZGVsCi0gIGlzIGFzIG11Y2ggYSBwcm9jZXNzIGFzIGRlZmluaW5nIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgaW4gaXRlcmF0aW9ucyBvZiBwYXJhbGxlbAotICB3b3JrLiBUaGV5IGp1c3QgcmVwcmVzZW50IGRpZmZlcmVudCBkZXZlbG9wbWVudCBhcHByb2FjaGVzLiBIZW5jZSwgZm9yIGRlZmluaW5nCi0gIGEgcHJvY2Vzcywgb25lIGNhbiB0YWtlIG1ldGhvZCBjb250ZW50IGFuZCBjb21iaW5lIGl0IGludG8gc3RydWN0dXJlcyB0aGF0IHNwZWNpZnkKLSAgaG93IHRoZSB3b3JrIHNoYWxsIGJlIG9yZ2FuaXplZCBvdmVyIHRpbWUsIHRvIG1lZXQgdGhlIG5lZWRzIG9mIGEgcGFydGljdWxhcgotICB0eXBlIG9mIGRldmVsb3BtZW50IHByb2plY3QgKHN1Y2ggYXMgc29mdHdhcmUgZm9yIGEgb25saW5lIHN5c3RlbSB2ZXJzdXMgc29mdHdhcmUKLSAgYW5kIGhhcmR3YXJlIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0pLiBFUEYgQ29tcG9zZXIgc3VwcG9ydHMgcHJvY2Vzc2VzIGJhc2VkIG9uIGRpZmZlcmVudAotICBkZXZlbG9wbWVudCBhcHByb2FjaGVzIGFjcm9zcyBtYW55IGRpZmZlcmVudCBsaWZlY3ljbGUgbW9kZWxzLCBpbmNsdWRpbmcgd2F0ZXJmYWxsLAotICBpbmNyZW1lbnRhbCwgYW5kIGl0ZXJhdGl2ZSBsaWZlY3ljbGVzLiBFUEYgQ29tcG9zZXIgYWxzbyBzdXBwb3J0cyBkaWZmZXJlbnQgcHJlc2VudGF0aW9ucwotICBmb3IgcHJvY2Vzcywgc3VjaCBhcyB3b3JrLWJyZWFrZG93biBzdHJ1Y3R1cmUgb3Igd29ya2Zsb3cgcHJlc2VudGF0aW9ucy4gWW91Ci0gIGNhbiBhbHNvIGRlZmluZSBwcm9jZXNzZXMgaW4gRVBGIENvbXBvc2VyIHRoYXQgdXNlIGEgbWluaW1hbCBzZXQgb2YgbWV0aG9kIGNvbnRlbnQgdG8KLSAgZGVmaW5lIHByb2Nlc3NlcyBmb3IgYWdpbGUsIHNlbGYtb3JnYW5pemluZyB0ZWFtcy48L3A+Ci08cD4gVGhlIEVQRiBDb21wb3NlciBzY3JlZW4gY2FwdHVyZSBhYm92ZSBzaG93cyBhbiBleGFtcGxlIG9mIGEgcHJvY2VzcyBwcmVzZW50ZWQgYXMgYQotICBicmVha2Rvd24gc3RydWN0dXJlIG9mIG5lc3RlZCBhY3Rpdml0aWVzIGFzIHdlbGwgYXMgYSB3b3JrZmxvdyBvciBhY3Rpdml0eSBkaWFncmFtCi0gIGZvciBvbmUgcGFydGljdWxhciBhY3Rpdml0eSwgdGhlIGluY2VwdGlvbiBwaGFzZS4gSXQgYWxzbyBpbmRpY2F0ZXMgd2l0aCB0aGUKLSAgdHdvIGJsdWUgYXJyb3dzIHRoYXQgdGhlIHBhcnRpY3VsYXIgbWV0aG9kIGNvbnRlbnQgdGFzayAmcXVvdDtEZXRhaWwgYSBVc2UgQ2FzZSZxdW90OwotICBoYXMgYmVlbiBhcHBsaWVkIGluIHRoZSBwcm9jZXNzIHR3aWNlOyBmaXJzdGx5IGluIHRoZSBpbmNlcHRpb24gcGhhc2UgdW5kZXIKLSAgdGhlIGFjdGl2aXR5ICZxdW90O0RlZmluZSB0aGUgU3lzdGVtLCZxdW90OyBhbmQgc2Vjb25kbHksIGluIHRoZSBlbGFib3JhdGlvbgotICBwaGFzZSBpbiB0aGUgYWN0aXZpdHkgJnF1b3Q7UmVmaW5lIHRoZSBzeXN0ZW0gZGVmaW5pdGlvbiZxdW90Oy4gWW91IHNlZSBiZWxvdwotICBlYWNoIG9mIHRoZXNlIHRhc2sgYXBwbGljYXRpb25zLCByZWZlcnJlZCB0byBhcyBhIHRhc2sgZGVzY3JpcHRvcnMgaW4gRVBGIENvbXBvc2VyLCBsaXN0cwotICBvZiB0aGUgcGVyZm9ybWluZyByb2xlcyBhcyB3ZWxsIGFzIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuIElmIHlvdQotICBsb29rIGNsb3NlbHksIHlvdSBzZWUgdGhhdCB0aGVzZSBsaXN0cyBhcmUgZGlmZmVyZW50IGZvciBlYWNoIG9mIHRoZXNlIHR3byB0YXNrCi0gIGRlc2NyaXB0b3JzLCBleHByZXNzaW5nIGRpZmZlcmVuY2VzIGluIHBlcmZvcm1pbmcgdGhlICZxdW90O0RldGFpbCBhIFVzZSBDYXNlJnF1b3Q7Ci0gIG1ldGhvZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUuIFlvdSBzZWUgZGlmZmVyZW50IHJvbGVzIGludm9sdmVkIGFuZCBjaGFuZ2VzCi0gIGluIHRoZSBsaXN0IG9mIGlucHV0cyB0byBiZSBjb25zaWRlcmVkIGFuZCBvdXRwdXRzIHRvIGJlIHByb2R1Y2VkIG9yIHVwZGF0ZWQuCi0gIFRoZXNlIGNoYW5nZXMgd2VyZSBkZWZpbmVkIGJ5IHRoZSBhdXRob3IgdGhhdCBjcmVhdGVkIHRoaXMgcHJvY2VzcyB0byBleHByZXNzCi0gIHRoZSBleGFjdCBmb2N1cyBvZiB0aGUgdGFzayBwZXJmb3JtYW5jZSBmb3IgZWFjaCBvY2N1cnJlbmNlLiBJbiBhZGRpdGlvbiB0bwotICB1cGRhdGluZyB0aGUgcm9sZXMsIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cyBmb3IgYSB0YXNrIGRlc2NyaXB0b3IsIHlvdQotICBjYW4gYWxzbyBwcm92aWRlIGFkZGl0aW9uYWwgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXMgd2VsbCBhcyBkZWZpbmUgdGhlIGV4YWN0Ci0gIHN0ZXBzIG9mIHRoZSB0YXNrIHRoYXQgc2hvdWxkIGFuZCBzaG91bGQgbm90IGJlIHBlcmZvcm1lZCBmb3IgdGhpcyBwYXJ0aWN1bGFyCi0gIG9jY3VycmVuY2Ugb2YgdGhlIHRhc2suPC9wPgotPHA+RVBGIENvbXBvc2VyIHByb3ZpZGVzIHlvdSB3aXRoIGEgcHJvY2VzcyBlZGl0b3IgdGhhdCBzdXBwb3J0cyBkaWZmZXJlbnQgYnJlYWtkb3duIHN0cnVjdHVyZQotICB2aWV3cyBhcyB3ZWxsIGFzIGdyYXBoaWNhbCBwcm9jZXNzIHByZXNlbnRhdGlvbnMuIEFzIGEgcHJvY2VzcyBhdXRob3IsIHlvdSB0eXBpY2FsbHkKLSAgc3RhcnQgYnkgY3JlYXRpbmcgYW4gYWN0aXZpdHkgYnJlYWtkb3duLCBkaXZpZGluZyBhbmQgYnJlYWtpbmcgeW91ciBwcm9jZXNzCi0gIGRvd24gaW50byBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBoaWdoLWxldmVsIGFjdGl2aXRpZXMuIEluc3RlYWQgb2YgY3JlYXRpbmcKLSAgeW91ciBhY3Rpdml0aWVzIGluIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvciwgeW91IGNhbiBhbHRlcm5hdGl2ZWx5IHdvcmsKLSAgaW4gYSBncmFwaGljYWwgYWN0aXZpdHkgZGlhZ3JhbSBlZGl0b3IgdGhhdCBhbGxvd3MgeW91IHRvIGdyYXBoaWNhbGx5IGNyZWF0ZQotICBhIHdvcmtmbG93IGZvciB5b3VyIGFjdGl2aXRpZXMuIFRvIGFzc2lnbiBtZXRob2QgY29udGVudCB0byB5b3VyIHByb2Nlc3MsIHlvdQotICB0aGVuIGhhdmUgdGhlIGNob2ljZSBvZiB3b3JraW5nIGluIGRpZmZlcmVudCBwcm9jZXNzIHZpZXdzICh3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUsCi0gIHdvcmsgcHJvZHVjdCB1c2FnZSwgb3IgdGVhbSBhbGxvY2F0aW9uIHZpZXcpLiBFYWNoIHZpZXcgc3VwcG9ydHMgYSBkaWZmZXJlbnQKLSAgYXBwcm9hY2ggZm9yIGNyZWF0aW5nIGEgcHJvY2Vzcy4gWW91IGNhbiBkZWZpbmUgdGhlIHdvcmsgdG8gYmUgZG9uZSwgZGVmaW5lCi0gIHRoZSByZXN1bHRzIHRvIGJlIHByb2R1Y2VkLCBvciBkZWZpbmUgcmVzcG9uc2liaWxpdGllcyBmb3IgeW91ciByb2xlcy4gSWYgcmVxdWVzdGVkLAotICB0aGUgZWRpdG9yIHVwZGF0ZXMgdGhlIG90aGVyIHByb2Nlc3Mgdmlld3Mgc2VtaS1hdXRvbWF0aWNhbGx5IHVzaW5nIHdpemFyZHMKLSAgdGhhdCBwcm9tcHQgeW91IGZvciBkZWNpc2lvbnMgb24gc2VsZWN0aW5nIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzLjwvcD4KLTxwPkZvciBtb3JlIGRldGFpbHMgb24gcHJvY2VzcyBhdXRob3Jpbmcgc2VlIHRoZSBvbmxpbmUgaGVscDo8L3A+Ci08ZGl2IGFsaWduPSJsZWZ0Ij4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCI+UHJvY2VzcwotICBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+PC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxwPiZuYnNwOzwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9wdWIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3B1Yi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3MjU0NzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3B1Yi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvcHVibGlzaGluZy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3B1Ymxpc2hpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODBiOGMxYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvcHVibGlzaGluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPGh0bWw+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGhlYWQ+Ci08dGl0bGU+Q29uZmlndXJhdGlvbiBhbmQgUHVibGlzaGluZzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMz5NZXRob2QgQ29uZmlndXJhdGlvbnMgT3ZlcnZpZXc8L2gzPgotPHA+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBzaGlwcyB3aXRoIGEgbG90IG9mIGNvbnRlbnQgb3V0IG9mIHRoZSBib3guIEl0IGluY2x1ZGVzCi0gIHRoZSBPcGVuIFVuaWZpZWQgUHJvY2VzcyAoT3BlblVQKSBmcmFtZXdvcmsgYW5kIHZhcmlvdXMgcGx1Zy1pbnMgZXh0ZW5kaW5nCi0gIE9wZW5VUC9CYXNpYyB3aXRoIGRvbWFpbi1zcGVjaWZpYyBhZGRpdGlvbnMuIE5vIG9yZ2FuaXphdGlvbiBvciBwcm9qZWN0IHJlcXVpcmVzIGFsbCBvZiB0aGlzCi0gIGRvY3VtZW50YXRpb24gYWxsIGF0IG9uY2UsIGJ1dCB3b3VsZCB3b3JrIHdpdGggYSBzZWxlY3Rpb24gb2Ygc3BlY2lmaWMgc3Vic2V0cy48L3A+Ci08cD4gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciAoRVBGIENvbXBvc2VyKSBtYW5hZ2VzIGZvciB0aGF0IHB1cnBvc2Ugc28tY2FsbGVkIG1ldGhvZAotICBjb25maWd1cmF0aW9ucywgd2hpY2ggYWxsb3cgeW91IHRvIHNwZWNpZnkgd29ya2luZyBzZXRzIG9mIGNvbnRlbnQgYW5kIHByb2Nlc3NlcwotICBmb3IgYSBzcGVjaWZpYyBjb250ZXh0LCBzdWNoIGFzIGEgc3BlY2lmaWMgdmFyaWFudCBvZiB0aGUgUlVQIGZyYW1ld29yayB0aGF0Ci0gIHlvdSB3YW50IHRvIHB1Ymxpc2ggYW5kIGRlcGxveSBmb3IgYSBnaXZlbiBzb2Z0d2FyZSBwcm9qZWN0IG9yIGFzIGEgZm91bmRhdGlvbgotICBmb3IgYSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24uIEFsbCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gRVBGIENvbXBvc2VyIGFyZSBvcmdhbml6ZWQKLSAgaW4gbWV0aG9kIHBsdWctaW5zLCB3aGljaCBhcmUgb3JnYW5pemVkIGludG8gbWV0aG9kIHBhY2thZ2VzLiBBIG1ldGhvZCBjb25maWd1cmF0aW9uCi0gIGlzIHNpbXBseSBhIHNlbGVjdGlvbiBvZiB0aGUgbWV0aG9kIHBsdWctaW5zIGFuZCBwYWNrYWdlcy48L3A+Ci08cD48aW1nIHNyYz0iY29uZi5naWYiPjwvcD4KLTxwPllvdSBjcmVhdGUgYW5kIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBjb25maWd1cmF0aW9uIGVkaXRvciBkZXBpY3RlZAotICBpbiB0aGUgZmlndXJlIGFib3ZlLiBZb3UgY291bGQgc3RhcnQgY3JlYXRpbmcgeW91ciBvd24gbWV0aG9kIGNvbmZpZ3VyYXRpb24KLSAgYnkgY29weWluZyBvbmUgb2YgdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgc2hpcCB3aXRoIEVQRiBDb21wb3NlciBhbmQgbW9kaWZ5IGl0IHRvIGZpdAotICB5b3VyIHNwZWNpZmljIG5lZWRzLiBZb3UgY2FuIGFkZCBvciByZW1vdmUgd2hvbGUgbWV0aG9kIHBsdWctaW5zIGFzIHdlbGwgYXMKLSAgbWFrZSBzZWxlY3Rpb24gd2l0aCBlYWNoIHBsdWctaW4gYnkgY2hlY2tpbmcgb3IgdW4tY2hlY2tpbmcgcGFja2FnZXMuIDwvcD4KLTxwPiBZb3UgY2FuIHVzZSB0aGUgcmVzdWx0aW5nIGNvbmZpZ3VyYXRpb24gYXMgeW91ciB3b3JraW5nIHNldCBmb3IgeW91ciBFUEYgQ29tcG9zZXIKLSAgd29yay4gVGhlIGFjdHVhbCBjb250ZW50IG9mIHRoZSBjb25maWd1cmF0aW9uLCBpLmUuIHRoZSBpbmNsdWRlZCBtZXRob2QgY29udGVudAotICBhbmQgcHJvY2VzcyBlbGVtZW50cyBhcmUgYWx3YXlzIGFjY2Vzc2libGUgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4gVXNlIHRoZQotICBjb21ibyBib3ggaW4gdGhlIHRvb2xiYXIgdG8gc2VsZWN0IHRoZSBjdXJyZW50bHkgdXNlZCBtZXRob2QgY29uZmlndXJhdGlvbi48L3A+Ci08aDM+UHVibGlzaGluZyBPdmVydmlldzwvaDM+Ci08cD5NZXRob2QgY29uZmlndXJhdGlvbnMgYXJlIHRoZSBiYXNpcyBmb3IgcHVibGlzaGluZyBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLgotICBBIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIGlzIGFuIGh0bWwgV2ViIHNpdGUgdGhhdCBwcmVzZW50cyBhbGwgdGhlIG1ldGhvZAotICBjb250ZW50IGFuZCBwcm9jZXNzZXMgb2YgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIGEgbmF2aWdhYmxlIGFuZCBzZWFyY2hhYmxlCi0gIHdheS4gSXQgdXNlcyB0aGUgcmVsYXRpb25zaGlwcyBlc3RhYmxpc2hlZCBkdXJpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3MKLSAgYXV0aG9yaW5nIHRvIGdlbmVyYXRlIGh5cGVybGlua3MgYmV0d2VlbiBlbGVtZW50cyBhcyB3ZWxsIGFzIHByb3ZpZGVzIHRyZWUKLSAgYnJvd3NlcnMgYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb24gdmlldyBhbmQgdXNlci1kZWZpbmVkIGNhdGVnb3JpemF0aW9ucyBvZgotICB0aGUgY29udGVudC4gVGhlIGZpZ3VyZSBiZWxvdyBzaG93cyBhbiBleGFtcGxlIG9mIHRoZSBwdWJsaXNoZWQgJ0NsYXNzaWMgUlVQJwotICBtZXRob2QgY29uZmlndXJhdGlvbi48L3A+Ci08cD48aW1nIHNyYz0icHViLmdpZiI+PC9wPgotPHA+Rm9yIHB1Ymxpc2hpbmcgc2ltcGx5IGNyZWF0ZSBhbmQgc2VsZWN0IGEgY29uZmlndXJhdGlvbi4gVGhlIHB1YmxpY2F0aW9uIHdpemFyZAotICB3aWxsIGRvIHRoZSByZXN0IGZvciB5b3UgYW5kIG9ubHkgcHVibGlzaCBjb250ZW50IHRoYXQgaXMgcGFydCBvZiB0aGUgbWV0aG9kCi0gIGNvbmZpZ3VyYXRpb24uIEl0IHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IGFkb3B0IGNvbnRlbnQgdG8gdGhlIGNvbmZpZ3VyYXRpb24KLSAgc3VjaCBhcyByZW1vdmluZwotICByZWZlcmVuY2VzIG9mIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIHRvIGVsZW1lbnRzIG91dHNpZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24KLSAgb3IgcmVtb3ZpbmcgYWN0aXZpdGllcyBmcm9tIHlvdXIgcHJvY2Vzc2VzIHRoYXQgb25seSBjb250YWluIHdvcmsgZGVmaW5lZCBvdXRzaWRlCi0gIG9mIHRoZSBjb25maWd1cmF0aW9uIHNldC4gSGVuY2UsIHB1Ymxpc2hpbmcgd2lsbCBvbmx5IGluY2x1ZGUgdGhlIGNvbnRlbnQgdGhhdAotICB5b3UgcmVhbGx5IG5lZWQuIFlvdSBjYW4gYWx3YXlzIHByZXZpZXcgYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiB1c2luZyBFUEYgQ29tcG9zZXIncwotYnJvd3NpbmcgcGVyc3BlY3RpdmUuPC9wPgotPHA+Jm5ic3A7PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3VtYV9odW1wLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS91bWFfaHVtcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRlOThmMjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3VtYV9odW1wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2hpdGVwYXBlci5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93aGl0ZXBhcGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRlY2UzM2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93aGl0ZXBhcGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXaGl0ZXBhcGVyIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9IndoaXRlcGFwZXIiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+V2hpdGVwYXBlcjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0id2hpdGVwYXBlciI+PGEgbmFtZT0id2hpdGVwYXBlciI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldoaXRlcGFwZXI8L2gxPgotPGRpdj48cD5BIFdoaXRlcGFwZXIgaXMgYSBzcGVjaWFsIHR5cGUgb2YgY29uY2VwdCBndWlkYW5jZSB0aGF0IGlzIGV4dGVybmFsbHkgcmV2aWV3ZWQKLW9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQKLWVsZW1lbnRzIGFuZCBndWlkYW5jZS48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dvcmtwcm9kdWN0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dvcmtwcm9kdWN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4YTJjMTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93b3JrcHJvZHVjdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV29yayBQcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0id29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+V29yayBQcm9kdWN0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ3b3JrcHJvZHVjdCI+PGEgbmFtZT0id29ya3Byb2R1Y3QiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Xb3JrIFByb2R1Y3Q8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj5Xb3JrIHByb2R1Y3QgaXMgYSBnZW5lcmFsIHRlcm0gZm9yIHRhc2sgaW5wdXRzIGFuZCBvdXRwdXRzLAotZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsCi1vciBtb2RpZmllZCBieSBhIHRhc2suIFRoZSB0aHJlZSB0eXBlcyBvZiB3b3JrIHByb2R1Y3QgYXJlOjx1bD48bGk+PGEgaHJlZj0iYXJ0aWZhY3QuaHRtbCNhcnRpZmFjdCI+QXJ0aWZhY3Q8L2E+PC9saT4KLTxsaT48YSBocmVmPSJvdXRjb21lLmh0bWwjb3V0Y29tZSI+T3V0Y29tZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImRlbGl2ZXJhYmxlLmh0bWwjZGVsaXZlcmFibGUiPkRlbGl2ZXJhYmxlPC9hPjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dvcmtwcm9kdWN0ZGVzY3JpcHRvcnMuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd29ya3Byb2R1Y3RkZXNjcmlwdG9ycy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNGZjYTk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd29ya3Byb2R1Y3RkZXNjcmlwdG9ycy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJ3b3JrcHJvZHVjdGRlc2NyaXB0b3JzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0id29ya3Byb2R1Y3RkZXNjcmlwdG9ycyI+PGEgbmFtZT0id29ya3Byb2R1Y3RkZXNjcmlwdG9ycyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yczwvaDE+Ci08ZGl2PjxwPkEgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgaXMgYSB3b3JrIHByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljCi1hY3Rpdml0eS4gRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mCi13b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgb2YgdGFzayBkZXNjcmlwdG9ycyBhbmQgcm9sZSBkZXNjcmlwdG9ycy4gT25lIHdvcmsKLXByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzLCBlYWNoIHdpdGhpbiB0aGUKLWNvbnRleHQgb2YgYW4gYWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiPldvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCI+Q3JlYXRlIGEgV29yayBQcm9kdWN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd29ya3Byb2R1Y3RraW5kLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dvcmtwcm9kdWN0a2luZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4N2RkYjI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd29ya3Byb2R1Y3RraW5kLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXb3JrIFByb2R1Y3QgS2luZCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJ3b3JrcHJvZHVjdGtpbmQiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+V29yayBQcm9kdWN0IEtpbmQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Indvcmtwcm9kdWN0a2luZCI+PGEgbmFtZT0id29ya3Byb2R1Y3RraW5kIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V29yayBQcm9kdWN0IEtpbmQ8L2gxPgotPGRpdj48cD5Xb3JrIFByb2R1Y3QgS2luZCBpcyBhbm90aGVyIGNhdGVnb3J5IGZvciBncm91cGluZyA8YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3RzPC9hPi4gQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSB3b3JrIHByb2R1Y3QKLWtpbmRzLiBBcyBhbiBleGFtcGxlLCB5b3UgbWlnaHQgd2FudCB0byBoYXZlIGEgc2VyaWVzIG9mIHdvcmsgcHJvZHVjdCBraW5kcwotdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBvdmVyYWxsIGludGVudCBvZiB3b3JrIHByb2R1Y3RzLCBzdWNoIGFzIHNwZWNpZmljYXRpb24sCi1wbGFuLCBvciBtb2RlbC48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIj5NZXRob2QgQ29udGVudCBDYXRlZ29yaWVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL21haW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvbWFpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUwZDQ4YWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvbWFpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkFib3V0IEVQRiBDb21wb3NlciIgPgotICAKLTwhLS0gR2V0dGluZyBTdGFydGVkIC0tPgotPHRvcGljIGxhYmVsPSJHZXR0aW5nIHN0YXJ0ZWQiPgotCTxhbmNob3IgaWQ9ImdldHRpbmdzdGFydGVkX2lkIi8+Ci08L3RvcGljPgotCi08IS0tIENvbmNlcHRzIC0tPgotPHRvcGljIGxhYmVsPSJDb25jZXB0cyI+Ci0JPGFuY2hvciBpZD0iY29uY2VwdHNfaWQiLz4KLTwvdG9waWM+Ci0KLTwhLS0gQ3JlYXRpbmcgUmV1c2FibGUgTWV0aG9kIENvbnRlbnQgLS0+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIHJldXNhYmxlIG1ldGhvZCBjb250ZW50Ij4KLQk8YW5jaG9yIGlkPSJjcmVhdGluZ19tZXRob2RfY29udGVudF9pZCIvPgotPC90b3BpYz4KLQotPCEtLSBDYXRlZ29yaXppbmcgTWV0aG9kIENvbnRlbnQgLS0+Ci08dG9waWMgbGFiZWw9IkNhdGVnb3JpemluZyByZXVzYWJsZSBtZXRob2QgY29udGVudCI+Ci0JPGFuY2hvciBpZD0iY2F0ZWdvcml6aW5nX21ldGhvZF9jb250ZW50X2lkIi8+Ci08L3RvcGljPgotCi08IS0tIENyZWF0aW5nIFByb2Nlc3NlcyAtLT4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgcHJvY2Vzc2VzIj4KLQk8YW5jaG9yIGlkPSJjcmVhdGluZ19wcm9jZXNzZXNfaWQiLz4KLTwvdG9waWM+Ci0KLTwhLS0gUHVibGlzaGluZyBhbmQgRXhwb3J0aW5nIE1ldGhvZCBDb250ZW50IC0tPgotPHRvcGljIGxhYmVsPSJQdWJsaXNoaW5nIGFuZCBleHBvcnRpbmcgbWV0aG9kIGNvbnRlbnQiPgotCTxhbmNob3IgaWQ9InB1Ymxpc2hpbmdfZXhwb3J0aW5nX2lkIi8+Ci08L3RvcGljPgotCi08IS0tIFN1cHBvcnQgZm9yIENvZGUgTWFuYWdlbWVudCBTeXN0ZW1zIC0tPgotPHRvcGljIGxhYmVsPSJTdXBwb3J0IGZvciBDb2RlIE1hbmFnZW1lbnQgU3lzdGVtcyIgaHJlZj0iaHRtbC9oZWxwL2NtX292ZXJ2aWV3Lmh0bWwiPgotCTxhbmNob3IgaWQ9ImNvZGVfbWFuYWdlbWVudF9pZCIvPgotPC90b3BpYz4KLQotPCEtLSBBY2Nlc3NpYmlsaXR5IC0tPgotPHRvcGljIGxhYmVsPSJBY2Nlc3NpYmlsaXR5IiBocmVmPSJodG1sL2hlbHAvYWNfbWFpbi5odG1sIj4KLQk8YW5jaG9yIGlkPSJhY2Nlc3NpYmlsaXR5X2lkIi8+Ci08L3RvcGljPgotCi0KLTwhLS1HbG9zc2FyeSAtLT4KLTx0b3BpYyBsYWJlbD0iR2xvc3NhcnkiPgotCTxhbmNob3IgaWQ9Imdsb3NzYXJ5X2lkIi8+Ci08L3RvcGljPgotICAKLQotPCEtLVR1dG9yaWFscyAtLT4KLTx0b3BpYyBsYWJlbD0iVHV0b3JpYWxzIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXRvcmlhbHNfc3RhcnRwYWdlLmh0bSI+Ci0JPGFuY2hvciBpZD0idHV0b3JpYWxzX2lkIi8+Ci08L3RvcGljPgotCi08L3RvYz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL292ZXJ2aWV3LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL292ZXJ2aWV3LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODcwOGVmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9vdmVydmlldy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9Ik92ZXJ2aWV3IiBsaW5rX3RvPSJtYWluLnhtbCNvdmVydmlld19pZCI+Ci0gICA8dG9waWMgbGFiZWw9IkFib3V0IEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIiIGhyZWY9Imh0bWwvaGVscC9hYm91dGNvbXBvc2VyLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgYXV0aG9yaW5nIG92ZXJ2aWV3IiBocmVmPSJodG1sL2hlbHAvbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJQcm9jZXNzIGF1dGhvcmluZyBvdmVydmlldyIgaHJlZj0iaHRtbC9oZWxwL3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb25maWd1cmF0aW9ucyBvdmVydmlldyIgaHJlZj0iaHRtbC9oZWxwL2NvbmZpZ3VyYXRpb25zYW5kcHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iVXNlciByb2xlcyBhbmQgcm9sZSBzcGVjaWZpYyB0YXNrcyIgaHJlZj0iaHRtbC9oZWxwL3VzZXJyb2xlc2FuZHJvbGVzcGVjaWZpY3Rhc2tzLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2VjODAyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgRG9jdW1lbnRhdGlvbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLQotIyBDaGVhdCBTaGVldHMKLW1ldGhvZEF1dGhvcmluZ0NoZWF0U2hlZXRzTmFtZT1NZXRob2QgQXV0aG9yaW5nIENoZWF0IFNoZWV0cwotQ2hlYXRzaGVldEdldHN0YXJ0ZWRDYXRlZ29yeVRleHQ9R2V0dGluZyBTdGFydGVkCi1DaGVhdHNoZWV0UmV1c2FibGVDb250ZW50Q2F0ZWdvcnlUZXh0PUNyZWF0ZSBSZXVzYWJsZSBNZXRob2QgQ29udGVudAotQ2hlYXRzaGVldFdyaXRlQ29udGVudENhdGVnb3J5VGV4dD1Xcml0ZSBNZXRob2QgQ29udGVudAotQ2hlYXRzaGVldFByb2Nlc3Nlc0NhdGVnb3J5VGV4dD1Xb3JrIHdpdGggUHJvY2Vzc2VzCi1DaGVhdHNoZWV0TmF2aWdhdGVNZXRob2RDb250ZW50PU5hdmlnYXRlIE1ldGhvZCBDb250ZW50Ci1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbj1DcmVhdGUgeW91ciBvd24gTWV0aG9kIENvbmZpZ3VyYXRpb24KLUNoZWF0c2hlZXRDcmVhdGVNZXRob2RQbHVnaW49Q3JlYXRlIHlvdXIgb3duIE1ldGhvZCBQbHVnLWluCi1DaGVhdHNoZWV0QWRkTWV0aG9kQ29udGVudD1BZGQgbmV3IE1ldGhvZCBDb250ZW50IHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzLCBvciBHdWlkYW5jZQotQ2hlYXRzaGVldFRhaWxvck1ldGhvZEVsZW1lbnRzPVRhaWxvciBleGlzdGluZyBNZXRob2QgRWxlbWVudHMgKFJvbGVzLCBUYXNrcywgV29yayBQcm9kdWN0cyBvciBHdWlkYW5jZSkgVXNpbmcgQ29udHJpYnV0aW9uCi1DaGVhdHNoZWV0UmVwbGFjZU1laHRvZEVsZW1lbnRzPVJlcGxhY2UgZXhpc3RpbmcgTWV0aG9kIEVsZW1lbnRzIChSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMgb3IgR3VpZGFuY2UpCi1DaGVhdHNoZWV0QWRkTWV0aG9kUmVmT3JIeXBlcmxpbms9QWRkIGEgTWV0aG9kIFJlZmVyZW5jZSBvciBIeXBlcmxpbmsgKFVSTCkKLUNoZWF0c2hlZXRBcHBseUNhcGFiaWxpdHlQYXR0ZXJuPUFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuCi1DaGVhdHNoZWV0Q3JlYXRlUHJvY2Vzcz1DcmVhdGUgYSBQcm9jZXNzIChDYXBhYmlsaXR5IFBhdHRlcm4gb3IgRGVsaXZlcnkgUHJvY2VzcykKLQotCi0KLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNWMxMzg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgICAgCTx0b2MKLSAgICAgICAgICAgIGZpbGU9Im1haW4ueG1sIgotICAgICAgICAgICAgcHJpbWFyeT0idHJ1ZSI+Ci0gICAgICAJPC90b2M+Ci0gICAgICAJPHRvYwotCQlmaWxlPSJnZXR0aW5nc3RhcnRlZC54bWwiPgotICAgICAgCTwvdG9jPgotICAgICAgCTx0b2MKLQkJZmlsZT0iY29uY2VwdHMueG1sIj4KLSAgICAgIAk8L3RvYz4KLQotICAgICAgCTx0b2MKLQkJZmlsZT0iY3JlYXRpbmdfbWV0aG9kX2NvbnRlbnQueG1sIj4KLSAgICAgIAk8L3RvYz4KLQotICAgICAgCTx0b2MKLQkJZmlsZT0iY2F0ZWdvcml6aW5nX21ldGhvZF9jb250ZW50LnhtbCI+Ci0gICAgICAJPC90b2M+Ci0KLSAgICAgIAk8dG9jCi0JCWZpbGU9ImNyZWF0aW5nX3Byb2Nlc3Nlcy54bWwiPgotICAgICAgCTwvdG9jPgotCi0gICAgICAJPHRvYwotCQlmaWxlPSJwdWJsaXNoaW5nX2V4cG9ydGluZy54bWwiPgotICAgICAgCTwvdG9jPgotCi0JPHRvYwotCQlmaWxlPSJjb2RlX21hbmFnZW1lbnQueG1sIj4KLQk8L3RvYz4KLQk8dG9jCi0JCWZpbGU9ImFjY2Vzc2liaWxpdHkueG1sIj4KLQk8L3RvYz4KLQk8dG9jCi0JCWZpbGU9Imdsb3NzYXJ5LnhtbCI+Ci0JPC90b2M+Ci0JPHRvYwotCQlmaWxlPSJ0dXRvcmlhbHMueG1sIj4KLQk8L3RvYz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBGMSBjb250ZXh0IGZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4gCi0JCTxjb250ZXh0cyBmaWxlPSIkbmwkL2NvbnRleHRzX2F1dGhvcmluZ191aS54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIvPiAKLQk8L2V4dGVuc2lvbj4KLQotIAk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4gCi0gICAgICA8Y29udGV4dHMgZmlsZT0iJG5sJC9jb250ZXh0c19TZWFyY2gueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLnNlYXJjaCIvPiAKLSAgIAk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIAotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLmNoZWF0U2hlZXRDb250ZW50IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cyIKLSAgICAgICAgIG5hbWU9IiVtZXRob2RBdXRob3JpbmdDaGVhdFNoZWV0c05hbWUiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLmdldHN0YXJ0ZWQiIAotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRHZXRzdGFydGVkQ2F0ZWdvcnlUZXh0Ii8+Ci0gICAgICA8Y2hlYXRzaGVldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5uYXZpZ2F0ZW1ldGhvZGNvbnRlbnQiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLmdldHN0YXJ0ZWQiCi0gICAgICAgICAgICBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9uYXZpZ2F0ZW1ldGhvZGNvbnRlbnQueG1sIgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXROYXZpZ2F0ZU1ldGhvZENvbnRlbnQiLz4KLSAgICAgIDxjaGVhdHNoZWV0Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLmNyZWF0ZW1ldGhvZGNvbmZpZ3VyYXRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLmdldHN0YXJ0ZWQiCi0gICAgICAgICAgICBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9jcmVhdGVtZXRob2Rjb25maWd1cmF0aW9uLnhtbCIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0Q3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICAgICAgPGNoZWF0c2hlZXQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMuY3JlYXRlbWV0aG9kcGx1Z2luIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5nZXRzdGFydGVkIgotICAgICAgICAgICAgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvY3JlYXRlbWV0aG9kcGx1Z2luLnhtbCIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0Q3JlYXRlTWV0aG9kUGx1Z2luIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLmNoZWF0U2hlZXRDb250ZW50IiAKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMiIAotICAgICAgICAgbmFtZT0iJW1ldGhvZEF1dGhvcmluZ0NoZWF0U2hlZXRzTmFtZSI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMucmVzdWFibGUuY29udGVudCIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0UmV1c2FibGVDb250ZW50Q2F0ZWdvcnlUZXh0Ii8+Ci0gICAgICA8Y2hlYXRzaGVldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5hZGRuZXdtZXRob2Rjb250ZW50IgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5yZXN1YWJsZS5jb250ZW50IgotICAgICAgICAgICAgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvYWRkbmV3bWV0aG9kY29udGVudC54bWwiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldEFkZE1ldGhvZENvbnRlbnQiLz4KLSAgICAgIDxjaGVhdHNoZWV0Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLnRhaWxvcmV4aXN0aW5nbWV0aG9kZWxlbWVudHMiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLnJlc3VhYmxlLmNvbnRlbnQiCi0gICAgICAgICAgICBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy90YWlsb3JleGlzdGluZ21ldGhvZGVsZW1lbnRzLnhtbCIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0VGFpbG9yTWV0aG9kRWxlbWVudHMiLz4KLSAgICAgIDxjaGVhdHNoZWV0Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLnJlcGxhY2VleGlzdGluZ21ldGhvZGVsZW1lbnRzIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5yZXN1YWJsZS5jb250ZW50IgotICAgICAgICAgICAgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvcmVwbGFjZWV4aXN0aW5nbWV0aG9kZWxlbWVudHMueG1sIgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRSZXBsYWNlTWVodG9kRWxlbWVudHMiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuY2hlYXRTaGVldENvbnRlbnQiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzIgotICAgICAgICAgbmFtZT0iJW1ldGhvZEF1dGhvcmluZ0NoZWF0U2hlZXRzTmFtZSI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMud3JpdGUuY29udGVudCIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0V3JpdGVDb250ZW50Q2F0ZWdvcnlUZXh0Ii8+Ci0gICAgICA8Y2hlYXRzaGVldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5hZGRtZXRob2RyZWZfb3JfaHlwZXJsaW5rIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy53cml0ZS5jb250ZW50IgotICAgICAgICAgICAgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvYWRkbWV0aG9kcmVmX29yX2h5cGVybGluay54bWwiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldEFkZE1ldGhvZFJlZk9ySHlwZXJsaW5rIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLmNoZWF0U2hlZXRDb250ZW50IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cyIKLSAgICAgICAgIG5hbWU9IiVtZXRob2RBdXRob3JpbmdDaGVhdFNoZWV0c05hbWUiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLnByb2Nlc3NlcyIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0UHJvY2Vzc2VzQ2F0ZWdvcnlUZXh0Ii8+Ci0gICAgICA8Y2hlYXRzaGVldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5hcHBseWNhcGFiaWxpdHlwYXR0ZXJuIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5wcm9jZXNzZXMiCi0gICAgICAgICAgICBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9hcHBseWNhcGFiaWxpdHlwYXR0ZXJuLnhtbCIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0QXBwbHlDYXBhYmlsaXR5UGF0dGVybiIvPgotICAgICAgPGNoZWF0c2hlZXQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMuY3JlYXRlYXByb2Nlc3MiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLnByb2Nlc3NlcyIKLSAgICAgICAgICAgIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL2NyZWF0ZWFwcm9jZXNzLnhtbCIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0Q3JlYXRlUHJvY2VzcyIvPgotICAgPC9leHRlbnNpb24+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3B1Ymxpc2hhbmRleHBvcnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcHVibGlzaGFuZGV4cG9ydC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUxMmVjMzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcHVibGlzaGFuZGV4cG9ydC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IlB1Ymxpc2hpbmcgYW5kIGV4cG9ydGluZyIgbGlua190bz0ibWFpbi54bWwjcHVibGlzaGFuZGV4cG9ydF9pZCI+Ci0gICA8dG9waWMgbGFiZWw9IlB1Ymxpc2hpbmcgb3ZlcnZpZXciIGhyZWY9Imh0bWwvaGVscC9wdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJQdWJsaXNoaW5nIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdG8gYSBtZXRob2Qgd2ViIiBocmVmPSJodG1sL2hlbHAvcHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcHVibGlzaGluZ19leHBvcnRpbmcueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcHVibGlzaGluZ19leHBvcnRpbmcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNDcwZjAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3B1Ymxpc2hpbmdfZXhwb3J0aW5nLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08dG9jIGxhYmVsPSJQdWJsaXNoaW5nIGFuZCBleHBvcnRpbmcgbWV0aG9kIGNvbnRlbnQiIGxpbmtfdG89Im1haW4ueG1sI3B1Ymxpc2hpbmdfZXhwb3J0aW5nX2lkIj4gIAotCTx0b3BpYyBsYWJlbD0iUHVibGlzaGluZyBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHRvIGEgbWV0aG9kIHdlYiIgaHJlZj0iaHRtbC9oZWxwL3B1Ymxpc2hpbmcuaHRtbCIvPgotCTx0b3BpYyBsYWJlbD0iRXhwb3J0aW5nIHRvIE1pY3Jvc29mdCBQcm9qZWN0IiBocmVmPSJodG1sL2hlbHAvZXhwb3J0X3RvX21zcHJvamVjdC5odG1sIi8+Ci0JPHRvcGljIGxhYmVsPSJYTUwgSW1wb3J0L0V4cG9ydCIgaHJlZj0iaHRtbC9oZWxwL2V4cG9ydF90b194bWwuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9yZWZlcmVuY2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcmVmZXJlbmNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTdhNmJiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9yZWZlcmVuY2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJSZWZlcmVuY2UiIGxpbmtfdG89Im1haW4ueG1sI3JlZmVyZW5jZV9pZCI+Ci0gICA8dG9waWMgbGFiZWw9IlN1cG9ydCBmb3IgY29kZSBtYW5hZ2VtZW50IHN5c3RlbXMiIGhyZWY9Imh0bWwvaGVscC9jbV9vdmVydmlldy5odG1sIj4KLSAgIDx0b3BpYyBsYWJlbD0iU3VwcG9ydCBmb3IgQ1ZTIiBocmVmPSJodG1sL2hlbHAvY21fY3ZzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iU3Vwb3J0IGZvciBSYXRpb25hbCBDbGVhckNhc2UiIGhyZWY9Imh0bWwvaGVscC9jbV9yYXRpb25hbGNjLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iU3VwcG9ydCBmb3IgUmF0aW9uYWwgQ0NSQyIgaHJlZj0iaHRtbC9oZWxwL2NtX2NjcmMuaHRtbCIvPgotPC90b3BpYz4KLQotICAgPHRvcGljIGxhYmVsPSJBY2Nlc3NpYmlsaXR5IiBocmVmPSJodG1sL2hlbHAvYWNfbWFpbi5odG1sIj4KLSAgIDx0b3BpYyBsYWJlbD0iS2V5Ym9hcmQgbmF2aWdhdGlvbiIgaHJlZj0iaHRtbC9oZWxwL2FjX25hdmlnYXRpb24uaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJGb250cyBhbmQgY29sb3JzIiBocmVmPSJodG1sL2hlbHAvYWNfZm9udHNhbmRjb2xvcnMuaHRtbCIvPgotPC90b3BpYz4KLSAgIAotPC90b2M+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9zcmMvb3JnL2VjbGlwc2UvZXBmL2hlbHAvZG9jL0RvY1BsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvc3JjL29yZy9lY2xpcHNlL2VwZi9oZWxwL2RvYy9Eb2NQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjNkYTkzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9zcmMvb3JnL2VjbGlwc2UvZXBmL2hlbHAvZG9jL0RvY1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2NQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgRG9jUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgRG9jUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRG9jUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0vLwkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gRG9jUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotLy8JCXRyeSB7Ci0vLwkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotLy8JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0vLwkJCXJldHVybiBrZXk7Ci0vLwkJfQotLy8JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotLy8JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotLy8JCXRyeSB7Ci0vLwkJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotLy8JCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5Eb2NQbHVnaW5SZXNvdXJjZXMiKTsKLS8vCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotLy8JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0vLwkJfQotLy8JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLS8vCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuCi0JICogcGx1Zy1pbiByZWxhdGl2ZSBwYXRoLgotCSAqCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0vLwlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLS8vCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKCJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MiLCBwYXRoKTsKLS8vCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3NyYy9vcmcvZWNsaXBzZS9lcGYvaGVscC9kb2MvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvc3JjL29yZy9lY2xpcHNlL2VwZi9oZWxwL2RvYy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiZGI4NmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvc3JjL29yZy9lY2xpcHNlL2VwZi9oZWxwL2RvYy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgYWN0aXZhdG9yIGZvciBtYW5hZ2luZyB0aGUgRG9jdW1lbnRhdGlvbiBwbHVnLWluJ3MgbGlmZSBjeWNsZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90YXNrcy54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90YXNrcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFkNDYxNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdGFza3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJUYXNrcyIgbGlua190bz0ibWFpbi54bWwjdGFza3NfaWQiPiAgCi0KLSAgPCEtLSBDcmVhdGluZyByZXVzYWJsZSBtZXRob2QgY29udGVudCAtLT4KLSAgPHRvcGljIGxhYmVsPSJDcmVhdGluZyByZXVzYWJsZSBtZXRob2QgY29udGVudCI+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiIGhyZWY9Imh0bWwvaGVscC9jb250ZW50X2NhdGVnb3JpZXMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBtZXRob2QgdmlldyB3aXRoIGN1c3RvbSBjYXRlZ29yaWVzIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2N1c3RvbV9jYXRlZ29yaWVzLmh0bWwiLz4gCi0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9tZXRob2RfY29udGVudC5odG1sIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgcm9sZSIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9yb2xlLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgdGFzayIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV90YXNrLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgd29yayBwcm9kdWN0IiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX3dvcmtwcm9kdWN0Lmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGd1aWRhbmNlIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2d1aWRhbmNlLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIENvbnRlbnQgVmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eS5odG1sIj4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iQ29udHJpYnV0ZXMiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eV9jb250cmlidXRlcy5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkV4dGVuZHMiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eV9leHRlbmRzLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iUmVwbGFjZXMiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eV9yZXBsYWNlLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iQXNzb2NpYXRpb25zIGltcGFjdGVkIGJ5IHZhcmlhYmlsaXR5IiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfYXNzb2NpYXRpb25zLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iQnJvd3NpbmcgdmFyaWFiaWxpdHkgYXNzb2NpYXRpb25zIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfYnJvd3NpbmcuaHRtbCIvPgotICAgICAgPC90b3BpYz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IkJyb3dzZSBhbmQgcHJldmlldyBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL2Jyb3dzZV9jb250ZW50Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgaW5kZXggZW50cmllcyIgaHJlZj0iaHRtbC9oZWxwL2luZGV4aW5nLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgZ2xvc3NhcnkgZW50cmllcyIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5X2VudHJpZXMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDaGFuZ2luZyBjb3B5cmlnaHQgbm90aWNlcyIgaHJlZj0iaHRtbC9oZWxwL2NoYW5naW5nX2NvcHlyaWdodC5odG1sIi8+Ci08L3RvcGljPgotCi0gIDwhLS0gQ2F0ZWdvcml6aW5nIG1ldGhvZCBjb250ZW50IC0tPgotICA8dG9waWMgbGFiZWw9IkNhdGVnb3JpemluZyBtZXRob2QgY29udGVudCI+Ci0gIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIgaHJlZj0iaHRtbC9oZWxwL2NvbnRlbnRfY2F0ZWdvcmllcy5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgbWV0aG9kIHZpZXcgd2l0aCBjdXN0b20gY2F0ZWdvcmllcyIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9jdXN0b21fY2F0ZWdvcmllcy5odG1sIi8+PC90b3BpYz4KLQotICA8IS0tIENyZWF0aW5nIHByb2Nlc3NlcyAtLT4KLSAgPHRvcGljIGxhYmVsPSJDcmVhdGluZyBwcm9jZXNzZXMiPgotICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHJldXNhYmxlIGNhcGFiaWxpdHkgcGF0dGVybiIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9jYXBhYmlsaXR5X3BhdHRlcm4uaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIGRlbGl2ZXJ5IHByb2Nlc3MiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfZGVsaXZlcnlfcHJvY2Vzcy5odG1sIj4KLSAgPHRvcGljIGxhYmVsPSJEZXZlbG9wIGEgd29yayBicmVha2Rvd24gc3RydWN0dXJlIiBocmVmPSJodG1sL2hlbHAvZGV2ZWxvcF93YnMuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkRldmVsb3AgYSB0ZWFtIGFsbG9jYXRpb24gc3RydWN0dXJlIiBocmVmPSJodG1sL2hlbHAvZGV2ZWxvcF90ZWFtX3N0cnVjdHVyZS5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHdvcmsgcHJvZHVjdCB1c2FnZSBzdHJ1Y3R1cmUiIGhyZWY9Imh0bWwvaGVscC9kZXZlbG9wX3dvcmtwcm9kdWN0X3N0cnVjdHVyZS5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iQXBwbHkgYSBjYXBhYmlsaXR5IHBhdHRlcm4iIGhyZWY9Imh0bWwvaGVscC9hcHBseV9jYXBhYmlsaXR5cGF0dGVybi5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iUHJvY2VzcyBlbGVtZW50IHByb3BlcnRpZXMgVmlldyIgaHJlZj0iaHRtbC9oZWxwL3Byb3BlcnRpZXNfdmlldy5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iVXNpbmcgZGVlcCBjb3B5IiBocmVmPSJodG1sL2hlbHAvdXNpbmdfZGVlcF9jb3B5Lmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJVc2luZyBhY3Rpdml0eSB2YXJpYWJpbGl0eSIgaHJlZj0iaHRtbC9oZWxwL3VzaW5nX2FjdGl2aXR5X3ZhcmlhYmlsaXR5Lmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggcHJvY2VzcyBkaWFncmFtcyIgaHJlZj0iaHRtbC9oZWxwL3Byb2Nlc3NfZGlhZ3JhbXMuaHRtbCI+Ci0gIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIGFjdGl2aXR5IGRpYWdyYW1zIiBocmVmPSJodG1sL2hlbHAvYWN0aXZpdHlfZGlhZ3JhbXMuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbXMiIGhyZWY9Imh0bWwvaGVscC9hY3Rpdml0eV9kZXRhaWxfZGlhZ3JhbXMuaHRtbCIvPgotCi0gIDwvdG9waWM+Ci0KLSAgPCEtLSBQdWJsaXNoaW5nIE1ldGhvZCBDb250ZW50IC0tPgotICA8dG9waWMgbGFiZWw9IlB1Ymxpc2hpbmcgYW5kIGV4cG9ydGluZyBtZXRob2QgY29udGVudCI+Ci0gICA8dG9waWMgbGFiZWw9IlB1Ymxpc2hpbmcgYSBtZXRob2QgY29uZmlndXJhdGlvbiB0byBhIG1ldGhvZCB3ZWIiIGhyZWY9Imh0bWwvaGVscC9wdWJsaXNoaW5nLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRXhwb3J0aW5nIHRvIE1pY3Jvc29mdCBQcm9qZWN0IiBocmVmPSJodG1sL2hlbHAvZXhwb3J0X3RvX21zcHJvamVjdC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlhNTCBJbXBvcnQvRXhwb3J0IiBocmVmPSJodG1sL2hlbHAvZXhwb3J0X3RvX3htbC5odG1sIi8+Ci0gPC90b3BpYz4KLQotICA8IS0tIFdvcmtpbmcgd2l0aCBUZXh0dWFsIERlc2NyaXB0aW9ucyAtLT4KLSA8dG9waWMgbGFiZWw9IlJpY2ggdGV4dCBlZGl0b3IiIGhyZWY9Imh0bWwvaGVscC9yaWNodGV4dGVkaXRvci5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkFkZCBhIHJlZmVyZW5jZSBvciBoeXBlcmxpbmsiIGhyZWY9Imh0bWwvaGVscC9hZGRfaHlwZXJsaW5rLmh0bWwiLz4KLSAgPC90b3BpYz4KLSAgPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4NTk2YzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIiB0b3BpYz0iaHRtbC90b2MuaHRtbCI+Ci0gICA8dG9waWMgbGFiZWw9IkdldHRpbmcgU3RhcnRlZCI+Ci0gICAgICA8YW5jaG9yIGlkPSJnZXR0aW5nc3RhcnRlZCIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iQ29uY2VwdHMiPgotICAgICAgPGFuY2hvciBpZD0iY29uY2VwdHMiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IlRhc2tzIj4KLSAgICAgIDxhbmNob3IgaWQ9InRhc2tzIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJSZWZlcmVuY2UiPgotICAgICAgPGFuY2hvciBpZD0icmVmZXJlbmNlIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJTYW1wbGVzIj4KLSAgICAgIDxhbmNob3IgaWQ9InNhbXBsZXMiLz4KLSAgIDwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY2NvbmNlcHRzLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY2NvbmNlcHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDYwOWUxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2Njb25jZXB0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iQ29uY2VwdHMiIGxpbmtfdG89InRvYy54bWwjY29uY2VwdHMiPiAKLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMiICBocmVmPSJodG1sL2NvbmNlcHRzL21haW50b3BpYy5odG1sIj4gCi0JCTx0b3BpYyBsYWJlbD0iU3ViIFRvcGljIiBocmVmPSJodG1sL2NvbmNlcHRzL3N1YnRvcGljLmh0bWwiIC8+IAotCTwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIDIiPgotCQk8dG9waWMgbGFiZWw9IlN1YiBUb3BpYyAyIiBocmVmPSJodG1sL2NvbmNlcHRzL3N1YnRvcGljMi5odG1sIiAvPiAKLQk8L3RvcGljPiAKLTwvdG9jPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jZ2V0dGluZ3N0YXJ0ZWQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jZ2V0dGluZ3N0YXJ0ZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZmFiMzE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY2dldHRpbmdzdGFydGVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJHZXR0aW5nIFN0YXJ0ZWQiIGxpbmtfdG89InRvYy54bWwjZ2V0dGluZ3N0YXJ0ZWQiPiAKLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMiICBocmVmPSJodG1sL2dldHRpbmdzdGFydGVkL21haW50b3BpYy5odG1sIj4gCi0JCTx0b3BpYyBsYWJlbD0iU3ViIFRvcGljIiBocmVmPSJodG1sL2dldHRpbmdzdGFydGVkL3N1YnRvcGljLmh0bWwiIC8+IAotCTwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIDIiPgotCQk8dG9waWMgbGFiZWw9IlN1YiBUb3BpYyAyIiBocmVmPSJodG1sL2dldHRpbmdzdGFydGVkL3N1YnRvcGljMi5odG1sIiAvPgotCTwvdG9waWM+IAotPC90b2M+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2NyZWZlcmVuY2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jcmVmZXJlbmNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTU1YzVhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2NyZWZlcmVuY2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IlJlZmVyZW5jZSIgbGlua190bz0idG9jLnhtbCNyZWZlcmVuY2UiPiAKLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMiICBocmVmPSJodG1sL3JlZmVyZW5jZS9tYWludG9waWMuaHRtbCI+IAotCQk8dG9waWMgbGFiZWw9IlN1YiBUb3BpYyIgaHJlZj0iaHRtbC9yZWZlcmVuY2Uvc3VidG9waWMuaHRtbCIgLz4gCi0JPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMgMiI+Ci0JCTx0b3BpYyBsYWJlbD0iU3ViIFRvcGljIDIiIGhyZWY9Imh0bWwvcmVmZXJlbmNlL3N1YnRvcGljMi5odG1sIiAvPiAKLQk8L3RvcGljPiAKLTwvdG9jPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jc2FtcGxlcy54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2NzYW1wbGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODk3ZWZiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2NzYW1wbGVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJTYW1wbGVzIiBsaW5rX3RvPSJ0b2MueG1sI3NhbXBsZXMiPiAKLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMiICBocmVmPSJodG1sL3NhbXBsZXMvbWFpbnRvcGljLmh0bWwiPiAKLQkJPHRvcGljIGxhYmVsPSJTdWIgVG9waWMiIGhyZWY9Imh0bWwvc2FtcGxlcy9zdWJ0b3BpYy5odG1sIiAvPiAKLQk8L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iTWFpbiBUb3BpYyAyIj4KLQkJPHRvcGljIGxhYmVsPSJTdWIgVG9waWMgMiIgaHJlZj0iaHRtbC9zYW1wbGVzL3N1YnRvcGljMi5odG1sIiAvPiAKLQk8L3RvcGljPiAKLTwvdG9jPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jdGFza3MueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jdGFza3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MjE0NTQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY3Rhc2tzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJUYXNrcyIgbGlua190bz0idG9jLnhtbCN0YXNrcyI+IAotCTx0b3BpYyBsYWJlbD0iTWFpbiBUb3BpYyIgIGhyZWY9Imh0bWwvdGFza3MvbWFpbnRvcGljLmh0bWwiPiAKLQkJPHRvcGljIGxhYmVsPSJTdWIgVG9waWMiIGhyZWY9Imh0bWwvdGFza3Mvc3VidG9waWMuaHRtbCIgLz4gCi0JPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMgMiI+Ci0JCTx0b3BpYyBsYWJlbD0iU3ViIFRvcGljIDIiIGhyZWY9Imh0bWwvdGFza3Mvc3VidG9waWMyLmh0bWwiIC8+IAotCTwvdG9waWM+IAotPC90b2M+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90dXRvcmlhbHMueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdHV0b3JpYWxzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGNhODY4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90dXRvcmlhbHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJUdXRvcmlhbHMiIGxpbmtfdG89Im1haW4ueG1sI3R1dG9yaWFsc19pZCI+Ci0gICA8dG9waWMgbGFiZWw9IkV4cGxvcmUgdGhlIHVzZXIgaW50ZXJmYWNlIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQxX2ludHJvLmh0bSI+Ci0JPHRvcGljIGxhYmVsPSJDb25jZXB0cyIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0MV9jb25jZXB0cy5odG0iIC8+IAotICAgCTx0b3BpYyBsYWJlbD0iQmFzaWMgbmF2aWdhdGlvbiIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0MV9leDEuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQnJvd3NlIG1ldGhvZCBjb250ZW50IiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQxX2V4Mi5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJCcm93c2UgcHJvY2VzcyBjb250ZW50IiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQxX2V4My5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJCcm93c2Ugd2hpbGUgYXV0aG9yaW5nIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQxX2V4NC5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJTZWFyY2giIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDFfZXg1Lmh0bSIgLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9pbnRyby5odG0iPgotCTx0b3BpYyBsYWJlbD0iQ29uY2VwdHMiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDJfY29uY2VwdHMuaHRtIiAvPiAKLQk8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIGNvbnRlbnQgcGFja2FnZSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9leDEuaHRtIiAvPgotCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgd29yayBwcm9kdWN0IiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2V4Mi5odG0iIC8+Ci0JPHRvcGljIGxhYmVsPSJDcmVhdGUgYSByb2xlIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2V4My5odG0iIC8+Ci0JPHRvcGljIGxhYmVsPSJDcmVhdGUgYSB0YXNrIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2V4NC5odG0iIC8+Ci0JPHRvcGljIGxhYmVsPSJXb3JrIHdpdGggc3RlcHMiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDJfZXg1Lmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIGd1aWRhbmNlIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2V4Ni5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJNYW5hZ2UgZ3VpZGFuY2UiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDJfZXg3Lmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHN0YW5kYXJkIGNhdGVnb3J5IiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2V4OC5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJBZGQgYSBwbHVnLWluIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2V4OS5odG0iIC8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJSZXVzZSBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0M19pbnRyby5odG0iPgotICAgCTx0b3BpYyBsYWJlbD0iQ29uY2VwdHMiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDNfY29uY2VwdHMuaHRtIiAvPiAKLSAgIAk8dG9waWMgbGFiZWw9IkNvbnRyaWJ1dGUgdG8gYSByb2xlIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQzX2V4MS5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJDb250cmlidXRlIHRvIGEgd29yayBwcm9kdWN0IiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQzX2V4Mi5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJDb250cmlidXRlIHRvIGEgdGFzayIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0M19leDMuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iRXh0ZW5kIGEgcm9sZSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0M19leDQuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iRXh0ZW5kIGEgd29yayBwcm9kdWN0IiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQzX2V4NS5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJFeHRlbmQgYSB0YXNrIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQzX2V4Ni5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJSZXBsYWNlIGEgcm9sZSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0M19leDcuaHRtIiAvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIHByb2Nlc3NlcyIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NV9pbnRyby5odG0iPgotICAgICAgIAk8dG9waWMgbGFiZWw9IkNvbmNlcHRzIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQ1X2NvbmNlcHRzLmh0bSIgLz4gCi0gICAJPHRvcGljIGxhYmVsPSJCcm93c2UgcHJvY2VzcyBjb250ZW50IiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQ1X2V4MS5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJFeHBsb3JlIHByb2Nlc3MgY29udGVudCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NV9leDIuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgZGVsaXZlcnkgcHJvY2VzcyIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NV9leDMuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iVXNlIGNhcGFiaWxpdHkgcGF0dGVybnMiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDVfZXg0Lmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHByb2Nlc3MgZGlhZ3JhbSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NV9leDUuaHRtIiAvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iUHVibGlzaGluZyBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NF9pbnRyby5odG0iPgotICAgICAgIAk8dG9waWMgbGFiZWw9IkNvbmNlcHRzIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQ0X2NvbmNlcHRzLmh0bSIgLz4gCi0gICAJPHRvcGljIGxhYmVsPSJQdWJsaXNoIGEgY29uZmlndXJhdGlvbiIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NF9leDEuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQ0X2V4Mi5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBjdXN0b20gY29uZmlndXJhdGlvbiIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NF9leDMuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iUHVibGlzaCBhIGN1c3RvbSBjb25maWd1cmF0aW9uIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQ0X2V4NC5odG0iIC8+Ci0gICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy93b3Jrd2l0aHRleHRkZXNjLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3dvcmt3aXRodGV4dGRlc2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMjg3NmZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3dvcmt3aXRodGV4dGRlc2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJXb3JraW5nIHdpdGggVGV4dHVhbCBEZXNjcmlwdGlvbnMiIGxpbmtfdG89Im1haW4ueG1sI3dvcmt3aXRodGV4dGRlc2NfaWQiPgotICAgPHRvcGljIGxhYmVsPSJSaWNoIFRleHQgRWRpdG9yIiBocmVmPSJodG1sL2hlbHAvcmljaHRleHRlZGl0b3IuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJBZGQgYSBSZWZlcmVuY2Ugb3IgSHlwZXJsaW5rIiBocmVmPSJodG1sL2hlbHAvYWRkX2h5cGVybGluay5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTM5ZDFkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSB4bWwgaW1wb3J0IHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMjc1OTlhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjQ5NjNjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuSW1wb3J0WE1MUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuZXBmLmltcG9ydAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbCwKLSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5wcmVmZXJlbmNlcywKLSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5zZXJ2aWNlcywKLSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC53aXphcmRzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY4YmNjMmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvaWNvbnMvZnVsbC9vYmoxNi9YTUxGaWxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvaWNvbnMvZnVsbC9vYmoxNi9YTUxGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODNiNDRiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL2ljb25zL2Z1bGwvb2JqMTYvWE1MRmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL2ljb25zL2Z1bGwvd2l6YmFuL0ltcG9ydFhNTC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL2ljb25zL2Z1bGwvd2l6YmFuL0ltcG9ydFhNTC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyNDk4MzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9pY29ucy9mdWxsL3dpemJhbi9JbXBvcnRYTUwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU0MTA1ODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBJbXBvcnQgWE1MIFBsdWctaW4KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIEltcG9ydCBYTUwgV2l6YXJkCi1pbXBvcnRYTUxXaXphcmROYW1lPVhNTAotaW1wb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249SW1wb3J0IG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgc3RvcmVkIGluIGEgWE1MIGZpbGUuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmYmFhZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pbXBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkuaW1wb3J0V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC53aXphcmRzLkltcG9ydFhNTFdpemFyZCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvWE1MRmlsZS5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwud2l6YXJkcy5JbXBvcnRYTUxXaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlaW1wb3J0WE1MV2l6YXJkTmFtZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAlaW1wb3J0WE1MV2l6YXJkRGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLnVpLmltcG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwud2l6YXJkcy5JbXBvcnRYTUxXaXphcmQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL0ltcG9ydFhNTFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvSW1wb3J0WE1MUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc5NGM0YzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvSW1wb3J0WE1MUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFhNTFBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBJbXBvcnRYTUxQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgSW1wb3J0WE1MUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQkKLQkJLy8gc2V0IHRoaXMgdG8gYWxsb3cgcGFyc2UgbGFyZ2UgeG1sIGZpbGUKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJlbnRpdHlFeHBhbnNpb25MaW1pdCIsICIxMDAwMDAwMDAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbXBvcnRYTUxQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL0ltcG9ydFhNTFJlc291cmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvSW1wb3J0WE1MUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJhZGM4YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvSW1wb3J0WE1MUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBYTUwgbWVzc2FnZSByZXNvdXJjZSBidW5kbGUgYWNjZXNzb3IgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSW1wb3J0WE1MUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IEltcG9ydFhNTFJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEltcG9ydFhNTFJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0WE1MV2l6YXJkX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RYTUxGaWxlUGFnZV9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2VCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wdGlvbkdyb3VwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdmVyd3JpdGVSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWVyZ2VSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0aW5nWE1MX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXZpZXdfbG9nX2ZpbGVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0WE1MRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0WE1MRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFhNTEZpbGVfZXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfbm90X2hhbmRsZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfd2l0aG91dF9pZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFhNTFNlcnZpY2VfaW1wb3J0X2ZhaWxlZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFhNTFNlcnZpY2VfbWlzc2luZ19wbHVnaW47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRYTUxTZXJ2aWNlX2Vycm9yX21pc3NpbmdfcGx1Z2luczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlfZXJyb3Jfbm9fZWNsYXNzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeV9ub19wYWNrYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlfb2JqZWN0X3N0cmluZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2VfMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaF9vbGREYXRhOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaF9vbGRUb29sOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd247Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBJbXBvcnRYTUxSZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OGIwNWY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMKLSMgTWVzc2FnZSBJRCBSYW5nZToKLSMKLQotIyBJbXBvcnQgWE1MIFdpemFyZAotaW1wb3J0WE1MV2l6YXJkX3RpdGxlPUltcG9ydCBYTUwKLQotIyBTZWxlY3QgSW1wb3J0IFhNTCBGaWxlIFdpemFyZCBQYWdlCi1zZWxlY3RYTUxGaWxlUGFnZV90aXRsZT1TcGVjaWZ5IGltcG9ydCBmaWxlCi1zZWxlY3RYTUxGaWxlUGFnZV9kZXNjPVNwZWNpZnkgdGhlIFhNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgdG8gaW1wb3J0LCBhbmQgc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBpbXBvcnQgb3BlcmF0aW9uIHRvIHBlcmZvcm0uCi1maWxlTGFiZWxfdGV4dD1YTUwgRmlsZToKLWJyb3dzZUJ1dHRvbl90ZXh0PUJyb3dzZS4uLgotb3B0aW9uR3JvdXBfdGV4dD1JbXBvcnQgb3B0aW9uCi1vdmVyd3JpdGVSYWRpb0J1dHRvbl90ZXh0PU92ZXJyaWRlIGV4aXN0aW5nIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgd2l0aCB0aGUgaW1wb3J0ZWQgY29udGVudAotbWVyZ2VSYWRpb0J1dHRvbl90ZXh0PU1lcmdlIGltcG9ydGVkIGNvbnRlbnQgaW50byB0aGUgZXhpc3RpbmcgbWV0aG9kIGxpYnJhcnkKLQotIyBQcm9ncmVzcyBNZXNzYWdlcwotaW1wb3J0aW5nWE1MX3RleHQ9SW1wb3J0aW5nIFhNTCBsaWJyYXJ5IGNvbnRlbnQgaW50byB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4uLgotCi0jIEltcG9ydCBYTUwgRXJyb3IgRGlhbG9nCi1yZXZpZXdfbG9nX2ZpbGVzPVRoZSBpbXBvcnQgb3BlcmF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gUmV2aWV3IHRoZSBsb2cgZmlsZXMgaW4gdGhlIFxuJyd7MH0nJyBmb2xkZXIgZm9yIGFueSBlcnJvcnMuCi1pbXBvcnRYTUxFcnJvcl9tc2c9SVVQTTAwMDBFOiBUaGUgaW1wb3J0IG9wZXJhdGlvbiBjYW5ub3QgcHJvY2VlZC4KLWltcG9ydFhNTEVycm9yX3JlYXNvbj1JVVBNMDAwOUU6IFRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IGlzIHJlYWQtb25seS5cblxuTWFrZSBzdXJlIHRoYXQgJyd7MH0nJyBpcyB3cml0YWJsZSBvciBjcmVhdGUgYSBuZXcgbWV0aG9kIGxpYnJhcnkgYW5kIHRyeSBhZ2Fpbi4KLQotIyBFcnJvciBNZXNzYWdlcwotaW52YWxpZFhNTEZpbGVfZXJyb3I9VGhlIHNwZWNpZmllZCBYTUwgZmlsZSBpcyBub3QgdmFsaWQuCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YT1JVVBNMDAxMEU6IFRoZSBzcGVjaWZpZWQgWE1MIGZpbGUgd2FzIGV4cG9ydGVkIGJ5IGEgcHJldmlvdXMgdmVyc2lvbiAoezB9KSBvZiB7MX0uIFRoZSBmaWxlcyBtdXN0IGJlIGV4cG9ydGVkIHVzaW5nIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgezF9LgotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBNMDAxMUU6IFRoZSBzcGVjaWZpZWQgWE1MIGZpbGUgd2FzIGV4cG9ydGVkIGJ5IGEgcHJldmlvdXMgdmVyc2lvbiBvZiB7MH0uIFRoZSBmaWxlcyBtdXN0IGJlIGV4cG9ydGVkIHVzaW5nIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgezB9LgotdmVyc2lvbk1pc21hdGNoX29sZFRvb2w9SVVQTTAwMTJFOiBUaGUgc3BlY2lmaWVkIFhNTCBmaWxlIHdhcyBleHBvcnRlZCBieSBhIG5ld2VyIHZlcnNpb24gKHswfSkgb2YgezF9LiBZb3UgbXVzdCB1cGdyYWRlIHsxfSBpbiBvcmRlciB0byBpbXBvcnQgdGhlIGZpbGUuICAKLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQTTAwMTNFOiBUaGUgc3BlY2lmaWVkIFhNTCBmaWxlIGNhbm5vdCBiZSBvcGVuZWQuIFlvdSBtdXN0IHVwZ3JhZGUgezB9IGluIG9yZGVyIHRvIGltcG9ydCB0aGUgZmlsZS4gIAotCi1pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfbm90X2hhbmRsZWQ9RWxlbWVudCBub3QgaGFuZGxlZDogezB9Ci1pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfd2l0aG91dF9pZD1FbGVtZW50IHdpdGhvdXQgSUQ6IHswfQotaW1wb3J0WE1MU2VydmljZV9pbXBvcnRfZmFpbGVkPUltcG9ydCBmYWlsZWQ6IHswfQotaW1wb3J0WE1MU2VydmljZV9taXNzaW5nX3BsdWdpbj1NaXNzaW5nIHJlcXVpcmVkIHBsdWdpbiB7MH0KLWltcG9ydFhNTFNlcnZpY2VfZXJyb3JfbWlzc2luZ19wbHVnaW5zPU1pc3NpbmcgcmVxdWlyZWQgcGx1Z2luKHMpLiBQbGVhc2UgY2hlY2sgdGhlIGxvZyBmaWxlcyBmb3IgZGV0YWlsCi0KLWxpYnJhcnlfZXJyb3Jfbm9fZWNsYXNzPUVycm9yIGNyZWF0aW5nIENvbnRlbnRDYXRlZ29yeTogVW5hYmxlIHRvIGdldCBFQ2xhc3MgZm9yIHswfQotbGlicmFyeV9ub19wYWNrYWdlPVVuYWJsZSB0byBmaW5kIG93bmluZyBwYWNrYWdlIGZvciBvYmplY3QgezB9Ci1saWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50PUVycm9yIGNyZWF0aW5nIGVsZW1lbnQ6IHswfQotbGlicmFyeV9vYmplY3Rfc3RyaW5nPW9iamVjdCB7MH0sIGZlYXR1cmUgezF9Ci1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMj1FcnJvciBzZXR0aW5nIGF0dHJpYnV0ZTogSW52YWxpZCBhdHRyaWJ1dGUgZmVhdHVyZSB2YWx1ZSB7MH0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZT1FcnJvciBzZXR0aW5nIGF0dHJpYnV0ZSBmb3Igb2JqZWN0IHswfSwgZmVhdHVyZSB7MX0sIGFuZCB2YWx1ZSB7Mn0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8zPURvbicndCBrbm93IGhvdyB0byBzZXR0aW5nIGF0dHJpYnV0ZSBmb3Igb2JqZWN0IHswfSwgZmVhdHVyZSB7MX0sIGFuZCB2YWx1ZSB7Mn0KLWxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZT1FcnJvciBzZXR0aW5nIHJlZmVyZW5jZSBmb3IgZmVhdHVyZSB7MH06IG5vIGVsZW1lbnQgd2l0aCBpZCB7MX0KLWxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZV8yPUVycm9yIHNldHRpbmcgcmVmZXJlbmNlIGZvciBvYmplY3QgezB9LCBmZWF0dXJlIHsxfSwgYW5kIHZhbHVlIHsyfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQxYTcyMzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGFjdGl2YXRvciBmb3IgbWFuYWdpbmcgdGhlIEltcG9ydCBYTUwgcGx1Zy1pbidzIGxpZmUgY3ljbGUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvcHJlZmVyZW5jZXMvSW1wb3J0WE1MUHJlZmVyZW5jZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3ByZWZlcmVuY2VzL0ltcG9ydFhNTFByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ4NTU3OTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvcHJlZmVyZW5jZXMvSW1wb3J0WE1MUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuSW1wb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IFhNTCBwcmVmZXJlbmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRYTUxQcmVmZXJlbmNlcyB7Ci0KLQkvKioKLQkgKiBUaGUgaW1wb3J0IFhNTCBmaWxlIHByZWZlcmVuY2Uga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9GSUxFID0gInhtbEZpbGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgbWVyZ2Ugb3B0aW9uIHByZWZlcmVuY2Uga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FUkdFX09QVElPTiA9ICJtZXJnZU9wdGlvbiI7IC8vJE5PTi1OTFMtMSQJCi0KLQlzdGF0aWMgewotCQkvLyBJbml0aWFsaXplIHRoZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzLgotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChYTUxfRklMRSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXN0b3JlLnNldERlZmF1bHQoTUVSR0VfT1BUSU9OLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltcG9ydCBYTUwgZmlsZSBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGltcG9ydCBYTUwgZmlsZSBwcmVmZXJlbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0WE1MRmlsZSgpIHsKLQkJcmV0dXJuIEltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCVhNTF9GSUxFKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbXBvcnQgWE1MIGZpbGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIGFic29sdXRlIHBhdGggdG8gYSBYTUwgZmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRYTUxGaWxlKFN0cmluZyBwYXRoKSB7Ci0JCUltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoWE1MX0ZJTEUsCi0JCQkJcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVyZ2Ugb3B0aW9uIGZpbGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXJnZSBvcHRpb24gZmlsZSBwcmVmZXJlbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldE1lcmdlT3B0aW9uKCkgewotCQlyZXR1cm4gSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotCQkJCU1FUkdFX09QVElPTik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWVyZ2Ugb3B0aW9uIGZpbGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWVyZ2VPcHRpb24KLQkgKiAgICAgICAgICAgIHRoZSB1c2VyIHNwZWNpZmllZCBtZXJnZSBvcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TWVyZ2VPcHRpb24oYm9vbGVhbiBtZXJnZU9wdGlvbikgewotCQlJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKAotCQkJCU1FUkdFX09QVElPTiwgbWVyZ2VPcHRpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YjE2NGZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHByZWZlcmVuY2Ugc3VwcG9ydCBmb3IgdGhlIEltcG9ydCBYTUwgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9JbXBvcnRSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL0ltcG9ydFJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OTIxMDgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL0ltcG9ydFJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLkJhc2VSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLlVybEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiByZXNvdXJjZSBoYW5kbGVyIGZvciBjb250ZW50IGluIHRoZSBpbXBvcnRlZCBsaWJyYXJ5Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0UmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgQmFzZVJlc291cmNlSGFuZGxlciB7Ci0KLQkJCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICogQHBhcmFtIHNvdXJjZUxpYlJvb3QKLQkgKiBAcGFyYW0gdGFyZ2V0TGliUm9vdAotCSAqLwotCXB1YmxpYyBJbXBvcnRSZXNvdXJjZUhhbmRsZXIoRmlsZSBzb3VyY2VMaWJSb290LCBGaWxlIHRhcmdldExpYlJvb3QpIHsKLQkJc3VwZXIoc291cmNlTGliUm9vdCwgdGFyZ2V0TGliUm9vdCk7Ci0JfQotCQotCS8qKgotCSAqIHJlc29sdmUgdGhlIHVybC4gcHV0IHRoZSByZXNvdXJjZXMgaW50byB0aGUgbG9jYXRpb24gYmFzZWQgb24gdGhlIGxpYnJhcnkgcmVzb3VyY2Ugc3RydWN0dXJlIGRlZmluaXRpb24uCi0JICovCi0JcHVibGljIFVybEluZm8gcmVzb2x2ZUZpbGVVcmwoT2JqZWN0IG93bmVyLCBTdHJpbmcgc3JjVXJsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlVcmxJbmZvIGluZm8gPSBuZXcgVXJsSW5mbygpOwotCi0JCWluZm8uc291cmNlVXJsID0gc3JjVXJsOwotCQlpbmZvLnNvdXJjZUZpbGUgPSBuZXcgRmlsZShzb3VyY2VMaWJSb290LCBzcmNVcmwpLmdldENhbm9uaWNhbEZpbGUoKTsKLQkJaW5mby50YXJnZXRVcmwgPSBzcmNVcmw7IAotCQlpbmZvLnRhcmdldEZpbGUgPSBudWxsOwotCi0JCWlmIChpbmZvLnNvdXJjZUZpbGUgPT0gbnVsbCB8fCAhaW5mby5zb3VyY2VGaWxlLmV4aXN0cygpICkgewotCQkJcmV0dXJuIGluZm87Ci0JCX0KLQkJCi0JCWlmICggb3duZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICkgewotCQkJLy8gZml4IHRoZSB0YXJnZXQgdXJsIGFuZCAKLQkJCWluZm8udGFyZ2V0VXJsID0gZml4VXJsKHNyY1VybCk7Ci0JCQkKLQkJCS8vU3RyaW5nIGVsZW1lbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFJlc291cmNlUGF0aChvd25lcik7Ci0JCQlTdHJpbmcgZWxlbWVudFBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aCggKE1ldGhvZEVsZW1lbnQpb3duZXIpOwkKLQkJCWluZm8udGFyZ2V0RmlsZSA9IG5ldyBGaWxlKG5ldyBGaWxlKHRhcmdldExpYlJvb3QsIGVsZW1lbnRQYXRoKSwgaW5mby50YXJnZXRVcmwpOwkKLQkJfSBlbHNlIHsKLQkJCWluZm8udGFyZ2V0VXJsID0gc3JjVXJsOyAKLQkJCWluZm8uc291cmNlRmlsZSA9IG5ldyBGaWxlKHNvdXJjZUxpYlJvb3QsIHNyY1VybCk7Ci0JCX0KLQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBmaXhVcmwoU3RyaW5nIHVybCkgewotCQl1cmwgPSB1cmwucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7ICAvLyROT04tTkxTLTEkCi0JCWludCBpbmR4ID0gdXJsLmxhc3RJbmRleE9mKFJlc291cmNlSGVscGVyLlJFU09VUkNFX0ZPTERFUiArICIvIik7ICAvLyROT04tTkxTLTEkCi0JCWlmICggaW5keCA+PTAgKSB7Ci0JCQlyZXR1cm4gdXJsLnN1YnN0cmluZyhpbmR4KTsKLQkJfQotCQkKLQkJLy8gcHV0IHRoZSByZXNvdXJjZSBpbnRvIHRoZSByZXNvdXJjZXMgZm9sZGVyCi0JCXJldHVybiBuZXcgRmlsZShSZXNvdXJjZUhlbHBlci5SRVNPVVJDRV9GT0xERVIsIHVybCkKLQkJCS50b1N0cmluZygpLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOyAvLyROT04tTkxTLTEkCi0JfQotCQotLy8JLyoqCi0vLwkgKiB0aGUgcmVzb3VyY2UgcGF0aCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBsaWJhcnkgcm9vdC4gdXJscyBuZWVkcyB0byBiZSBmaXhlZAotLy8JICogCi0vLwkgKiBAcGFyYW0gb3duZXIgdGhlIG93bmVyIG9iamVjdCBpbiB0aGUgdGFyZ2V0IGxpYnJhcnkKLS8vCSAqIEBwYXJhbSBzcmNVcmwgdGhlIHVybCByZWZlcmVuY2VkIGluIHRoZSBzb3VyY2UgY29udGVudAotLy8JICogQHJldHVybgotLy8JICovCi0vLwlwcml2YXRlIFVybEluZm8gbG9hZFVybEluZm9XaXRoRml4ZWRQYXRoKE9iamVjdCBvd25lciwgU3RyaW5nIHNyY1VybCkgewotLy8JCVVybEluZm8gaW5mbyA9IG5ldyBVcmxJbmZvKCk7Ci0vLwkJaW5mby5zb3VyY2VVcmwgPSBzcmNVcmw7Ci0vLwkJaW5mby50YXJnZXRVcmwgPSBzcmNVcmw7Ci0vLwkJaW5mby5zb3VyY2VGaWxlID0gbmV3IEZpbGUoc291cmNlTGliUm9vdCwgc3JjVXJsKTsKLS8vCQlpbmZvLnRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXRMaWJSb290LCBzcmNVcmwpOwotLy8KLS8vCQlpZiAoIG93bmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgIHsKLS8vCQkJU3RyaW5nIGJhY2tQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0QmFja1BhdGgoIChNZXRob2RFbGVtZW50KW93bmVyKTsKLS8vCQkJaW5mby50YXJnZXRVcmwgPSBiYWNrUGF0aCArIHNyY1VybDsKLS8vCQl9Ci0vLwkJcmV0dXJuIGluZm87CQotLy8JfQotLy8JCi0vLwkvKioKLS8vCSAqIHRoZSByZXNvdXJjZSBwYXRoIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIG93bmVyIGVsZW1lbnQuIAotLy8JICogdXJscyB3aWxsIG5vdCBiZSBjaGFuZ2VkIGJ1dCByZXNvdXJjZSBmaWxlcyBpcyByZWxpY2F0ZWQuCi0vLwkgKiBAcGFyYW0gb3duZXIgb3duZXIgdGhlIG93bmVyIG9iamVjdCBpbiB0aGUgdGFyZ2V0IGxpYnJhcnkKLS8vCSAqIEBwYXJhbSBzcmNVcmwKLS8vCSAqIEByZXR1cm4KLS8vCSAqLwotLy8JcHJpdmF0ZSBVcmxJbmZvIGxvYWRVcmxJbmZvV2l0aFJlbGF0aXZlUGF0aChPYmplY3Qgb3duZXIsIFN0cmluZyBzcmNVcmwpIHsKLS8vCQlVcmxJbmZvIGluZm8gPSBuZXcgVXJsSW5mbygpOwotLy8JCWluZm8uc291cmNlVXJsID0gc3JjVXJsOwotLy8JCWluZm8udGFyZ2V0VXJsID0gaW5mby5zb3VyY2VVcmw7IC8vIG5vIHVybCBjaGFuZ2UKLS8vCQlpbmZvLnNvdXJjZUZpbGUgPSBuZXcgRmlsZShzb3VyY2VMaWJSb290LCBzcmNVcmwpOwotLy8JCQotLy8JCWlmICggb3duZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSAgewotLy8JCQkvL1N0cmluZyBlbGVtZW50UGF0aCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRSZXNvdXJjZVBhdGgob3duZXIpOwotLy8JCQlTdHJpbmcgZWxlbWVudFBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UmVzb3VyY2VQYXRoKChNZXRob2RFbGVtZW50KW93bmVyKTsKLS8vCQkJaW5mby50YXJnZXRGaWxlID0gbmV3IEZpbGUobmV3IEZpbGUodGFyZ2V0TGliUm9vdCwgZWxlbWVudFBhdGgpLCBzcmNVcmwpOwkJCQotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIGluZm87Ci0vLwl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9JbXBvcnRYTUxTZXJ2aWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9JbXBvcnRYTUxTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFlYmIxZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvSW1wb3J0WE1MU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLkNvbnRlbnRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLklSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5EaWFncmFtSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcy5GZWF0dXJlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcy5YTUxMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5GaWxlTW9kaWZ5Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkxpYnJhcnlJbXBvcnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkcy5QbHVnaW5Nb2RpZnlJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLkltcG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5JbXBvcnRYTUxSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFhtbCBpbXBvcnQgc2VydmljZSBjbGFzcyB0byBwcm9jZXNzIHRoZSBpbXBvcnRpbmcgdGFzawotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0WE1MU2VydmljZSB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZXJyb3IgPSBmYWxzZTsKLQkKLQlwcml2YXRlIE1hcCByZW5hbWVFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gb3ZlcndyaXRlID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBJU3RhdHVzIGZpbGVDaGVja2VkT3V0U3RhdHVzID0gbnVsbDsKLQkKLQlwcml2YXRlIFN0cmluZyB4bWxQYXRoOwotCi0JcHJpdmF0ZSBYTUxMaWJyYXJ5IHhtbExpYjsKLQotCXByaXZhdGUgVW1hTGlicmFyeSB1bWFMaWI7Ci0KLQlwcml2YXRlIEltcG9ydFhNTG9nZ2VyIGxvZ2dlciA9IG5ldyBJbXBvcnRYTUxvZ2dlcigpOwotCi0JcHJpdmF0ZSBMaXN0IGRpc2NhcmRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBEaWFncmFtSGFuZGxlciBkaWFncmFtSGFuZGxlcjsKLQkKLQkvLyBtYXAgeG1sIFdvcmtPcmRlciB0byB1bWEgV29ya09yZGVyCi0JTWFwIHdvcmtPcmRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSW1wb3J0WE1MU2VydmljZSgpIHsKLQotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSB4bWwgZmlsZS4KLQkgKiBAcGFyYW0geG1sUGF0aAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZWVkcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBsb2FkWG1sKGZpbmFsIFN0cmluZyB4bWxQYXRoKSB7Ci0JCVN0cmluZyB2ZXJzaW9uRXJyb3IgPSB2ZXJzaW9uQ2hlY2soeG1sUGF0aCwJSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFdpemFyZF90aXRsZSk7CQkKLQkJaWYgKHZlcnNpb25FcnJvciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCQkKLQkJdGhpcy54bWxQYXRoID0geG1sUGF0aDsKLQotCQlsb2dnZXIubG9nTWVzc2FnZSgiTG9hZGluZyB4bWwgbGlicmFyeSAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLnhtbExpYiA9IG5ldyBYTUxMaWJyYXJ5KG51bGwsIGxvZ2dlciwgeG1sUGF0aCk7Ci0JCXRoaXMueG1sTGliLmxvYWQoKTsKLQkJCi0JCXJldHVybiBjaGVja09sZFBsdWdpbnMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrT2xkUGx1Z2lucygpIHsKLQkJTGlzdCBwbHVnaW5zID0gKChNZXRob2RMaWJyYXJ5KSB4bWxMaWIuZ2V0Um9vdCgpKS5nZXRNZXRob2RQbHVnaW4oKTsKLQkJTGlzdCBndWlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IChNZXRob2RFbGVtZW50KSBwbHVnaW5zLmdldChpKTsKLQkJCWd1aWRzLmFkZChlbGVtLmdldElkKCkpOwotCQl9CQkJCQotCQkKLQkJZmluYWwgUGx1Z2luTW9kaWZ5SW5mbyBtb2RpZnlJbmZvID0gU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZQotCQkJCQkJCQkJCS5jaGVja01vZGlmeShndWlkcywgTXNnQm94LmdldERlZmF1bHRTaGVsbCgpLCBmYWxzZSk7CQkKLQotCQkvLyBhbGxvdyB1c2VyIHRvIHByb2NlZWQgd2l0aCBsb2NrZWQgcGx1Z2lucwotCQlpZiAoIG1vZGlmeUluZm8ubG9ja2VkUGx1Z2lucy5zaXplKCkgPiAwICkgewotCQkJZmluYWwgYm9vbGVhbiByZXRbXSA9IG5ldyBib29sZWFuWzFdOwotCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJU3RyaW5nIFdJWkFSRF9USVRMRSA9IEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxXaXphcmRfdGl0bGU7IAotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IG1vZGlmeUluZm8uZ2V0TG9ja2VkTWVzc2FnZSgpLnRvU3RyaW5nKCkgKwotCQkJCQkJSW1wb3J0UmVzb3VyY2VzLkltcG9ydFBsdWdpbldpemFyZF9jb25maXJtX2NvbnRpbnVlOyAKLQkJCQkJcmV0WzBdID0gSW1wb3J0WE1MUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5Q29uZmlybWF0aW9uKFdJWkFSRF9USVRMRSwgbWVzc2FnZSk7Ci0JCQkJfQotCQkJfSk7CQkKLQkJCXJldHVybiByZXRbMF07Ci0JCX0gCQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBsb2cgZmlsZS4KLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRMb2dQYXRoKCkgewotCQlyZXR1cm4gbG9nZ2VyLmdldExvZ1BhdGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQotCQlkaXNjYXJkZWRFbGVtZW50cy5jbGVhcigpOwotCQl3b3JrT3JkZXJNYXAuY2xlYXIoKTsKLQkJbG9nZ2VyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBEb2VzIFhNTCBleHBvcnQuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGRvSW1wb3J0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gcmVmcmVzaCA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5pc0VuYWJsZWQoKTsKLQkJdHJ5IHsKLQkJCWlmIChyZWZyZXNoKSB7Ci0JCQkJLy8gZGlzYWJsZSByZXNvdXJjZSByZWZyZXNoaW5nIGR1cmluZyBpbXBvcnQKLQkJCQkvLwotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCQotCQkJaGFuZGxlVHlwZUNoYW5nZXMoKTsKLQkJCQotCQkJSVJlc291cmNlSGFuZGxlciBoYW5kbGVyID0gbmV3IEltcG9ydFJlc291cmNlSGFuZGxlcihuZXcgRmlsZSgKLQkJCQkJeG1sUGF0aCkuZ2V0UGFyZW50RmlsZSgpLCBuZXcgRmlsZShMaWJyYXJ5U2VydmljZQotCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSkpOwotCi0JCQlDb250ZW50UHJvY2Vzc29yIGNvbnRlbnRQcm9jID0gbmV3IENvbnRlbnRQcm9jZXNzb3IoaGFuZGxlciwKLQkJCQkJdGhpcy5sb2dnZXIpOwotCQkJCi0JCQlkaWFncmFtSGFuZGxlciA9IG5ldyBEaWFncmFtSGFuZGxlcihuZXcgRmlsZSgKLQkJCQkJeG1sUGF0aCkuZ2V0UGFyZW50RmlsZSgpLCBuZXcgRmlsZShMaWJyYXJ5U2VydmljZQotCQkJCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpKSk7Ci0KLQkJCXRoaXMueG1sTGliLmZpeExpYnJhcnlGb3JJbXBvcnQoKTsKLQotCQkJLy8gbWFrZSBzdXJlIGFsbCB0aGUgZGVwZW5kZW50IHBsdWdpbnMgYXJlIHRoZXJlCi0JCQlMaXN0IHJlZmVyZW5jZWRQbHVnaW5zID0geG1sTGliLmdldFJlZmVyZW5jZWRQbHVnaW5zKCk7Ci0JCQlpZiAocmVmZXJlbmNlZFBsdWdpbnMuc2l6ZSgpID4gMCkgewotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UKLQkJCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJCQlMaXN0IHBsdWdpbnMgPSBsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQkJU3RyaW5nIGlkID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbikgaXQKLQkJCQkJCQkJLm5leHQoKSkuZ2V0R3VpZCgpOwotCQkJCQkJcmVmZXJlbmNlZFBsdWdpbnMucmVtb3ZlKGlkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHJlZmVyZW5jZWRQbHVnaW5zLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVmZXJlbmNlZFBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQkJCWxvZ2dlci5sb2dFcnJvcihOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MU2VydmljZV9taXNzaW5nX3BsdWdpbiwgaWQpLAotCQkJCQkJCW51bGwpOwotCQkJCX0KLQotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oCi0JCQkJCQlJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MU2VydmljZV9lcnJvcl9taXNzaW5nX3BsdWdpbnMpOwotCQkJfQotCi0JCQl0aGlzLnVtYUxpYiA9IG5ldyBVbWFMaWJyYXJ5KGNvbnRlbnRQcm9jLCBsb2dnZXIsIG92ZXJ3cml0ZSk7Ci0KLQkJCUVEYXRhT2JqZWN0IHhtbFJvb3QgPSB0aGlzLnhtbExpYi5nZXRSb290KCk7Ci0JCQlFRGF0YU9iamVjdCB1bWFSb290ID0gdGhpcy51bWFMaWIuZ2V0Um9vdCgpOwotCQkJCi0JCQlsb2dnZXIubG9nTWVzc2FnZSgiY3JlYXRlIHRhcmdldCBsaWJyYXJ5IGVsZW1lbnRzIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdEVEYXRhT2JqZWN0VHJlZSh4bWxSb290LCB1bWFSb290KTsKLQotCQkJbG9nZ2VyCi0JCQkJCS5sb2dNZXNzYWdlKCJjb3B5aW5nIGFsbCBmZWF0dXJlIHZhbHVlcyBmb3IgdGFyZ2V0IGxpYnJhcnkgZWxlbWVudHMgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCWl0ZXJhdEVEYXRhT2JqZWN0KChNZXRob2RFbGVtZW50KSB4bWxSb290KTsKLQotCQkJbG9nZ2VyLmxvZ01lc3NhZ2UoImZpeCB0aGUgdGFyZ2V0IGxpYnJhcnkgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCXVtYUxpYi5maXhMaWJyYXJ5KCk7Ci0KLQkJCUxpYnJhcnlJbXBvcnRNYW5hZ2VyLmhhbmRsZU5hbWVSZXBsYWNlKHJlbmFtZUVsZW1lbnRNYXApOwotCQkJCi0JCQlkaWFncmFtSGFuZGxlci5wb3N0UmVnaXN0ZXJFbGVtZW50cygpOwotCQkJCi0JCQkvLyBkZWxldGUgdGhlIHVuLW5lZWRlZCBlbGVtZW50cwotCQkJbG9nZ2VyLmxvZ01lc3NhZ2UoImRlbGV0ZSB1bm5lZWRlZCBlbGVtZW50cyAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJdW1hTGliLmRlbGV0ZUVsZW1lbnRzKCk7Ci0JCQkKLQkJCWZpbmFsIExpc3QgbW9kaWZpZWRGaWxlcyA9IEZpbGVNb2RpZnlDaGVja2VyLmdldE1vZGlmaWVkRmlsZXMoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS4KLQkJCQkJCQkJCQlnZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpOwotCQkJbW9kaWZpZWRGaWxlcy5hZGRBbGwoZGlhZ3JhbUhhbmRsZXIuZ2V0TW9kaWZpZWRGaWxlcygpKTsKLQkJCWZpbmFsIElTdGF0dXMgZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBGaWxlTW9kaWZ5Q2hlY2tlci5zeW5jRXhlY0NoZWNrTW9kaWZ5KG1vZGlmaWVkRmlsZXMpOwotCQkJCi0JCQlpZiAoZmlsZUNoZWNrZWRPdXRTdGF0dXMuaXNPSygpKSB7Ci0JCQkKLQkJCQlsb2dnZXIubG9nTWVzc2FnZSgic2F2aW5nIHRhcmdldCBsaWJyYXJ5IC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCi0JCQkJTGlzdCBjb25maWdzID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQkJCWludCBjb25maWdTeiA9IGNvbmZpZ3MgPT0gbnVsbCA/IDAgOiBjb25maWdzLnNpemUoKTsKLQkJCQlmb3IgKGludCBpPTA7IGk8Y29uZmlnU3o7IGkrKykgewotCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gCi0JCQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uICkgY29uZmlncy5nZXQoaSk7Ci0JCQkJCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBkb24ndCByZWZyZXNoIHRoZSB3b3Jrc3BhY2UKLQkJCQlMaWJyYXJ5VXRpbC5zYXZlTGlicmFyeShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwgZmFsc2UsIGZhbHNlKTsKLQkJCQlkaWFncmFtSGFuZGxlci5leGVjdXRlKCk7CQkJCQotCQotCQkJCWxvZ2dlci5sb2dNZXNzYWdlKCJyZS1vcGVuIHRhcmdldCBsaWJyYXJ5IC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQotCQkJCWxvZ2dlci5sb2dNZXNzYWdlKCJpbXBvcnQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCVN0cmluZyB0aXRsZSA9IEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxXaXphcmRfdGl0bGU7IAotCQkJCQkJU3RyaW5nIG1zZyA9IEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxTZXJ2aWNlX2ltcG9ydF9mYWlsZWQ7IAotCQkJCQkJbmV3IE1zZ0RpYWxvZyhJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpKQotCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZywgZmlsZUNoZWNrZWRPdXRTdGF0dXMpOwotCQkJCQkJfQotCQkJCX0pOwotCQkJfQkKLQkJCQkJCQotCQkJLy9SZXNvdXJjZVV0aWwucmVmcmVzaFJlc291cmNlcyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkvLwkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIG1vbml0b3IpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFNlcnZpY2VfaW1wb3J0X2ZhaWxlZCwgZS5nZXRNZXNzYWdlKCkpLCBlKTsKLQotCQkJdGhyb3cgZTsKLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHJlZnJlc2gpIHsKLQkJCQkvLyByZS1lbmFibGUgcmVzb3VyY2UgcmVmcmVzaGluZwotCQkJCS8vCi0JCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRFRGF0YU9iamVjdFRyZWUoRURhdGFPYmplY3QgeG1sT2JqLCBFRGF0YU9iamVjdCB1bWFPYmopIHsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0geG1sT2JqLmVDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVEYXRhT2JqZWN0IGNoaWxkID0gKEVEYXRhT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQljcmVhdGVSbWNPYmplY3QoY2hpbGQsIHVtYU9iaik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlUm1jT2JqZWN0KEVEYXRhT2JqZWN0IHhtbEVsZW1lbnQsCi0JCQlFRGF0YU9iamVjdCB0YXJnZXRDb250YWluZXIpIHsKLQotCQkvLyBnZXQgdGhlIHRhcmdldENvbnRhaW5lcidzIGNvbnRhaW5pbmcgZmVhdHVyZQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IHhtbEVsZW1lbnQuZUNvbnRhaW5tZW50RmVhdHVyZSgpOwotCQljcmVhdGVSbWNPYmplY3QoeG1sRWxlbWVudCwgdGFyZ2V0Q29udGFpbmVyLCBmZWF0dXJlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJtY09iamVjdChFRGF0YU9iamVjdCB4bWxFbGVtZW50LAotCQkJRURhdGFPYmplY3QgdGFyZ2V0Q29udGFpbmVyLCBTdHJpbmcgY29udGFpbm1lbnRYbWxGZWF0dXJlKSB7Ci0KLQkJdHJ5IHsKLQkJCWlmICh4bWxFbGVtZW50ID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCUVEYXRhT2JqZWN0IHVtYUVsZW1lbnQgPSBudWxsOwotCi0JCQkvLyBkb24ndCBjcmVhdGUgY29udGVudCBjYXRlZ29yeSBwYWNrYWdlIHNpbmNlIGluIHVtYSwgaXQncwotCQkJLy8gc2VwZXJhdGVkIGJhc2VkIG9uIHR5cGUKLQkJCWlmICh4bWxFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHhtbEVsZW1lbnQ7Ci0JCQkJdW1hRWxlbWVudCA9IHVtYUxpYi5jcmVhdGVNZXRob2RQbHVnaW4ocGx1Z2luLmdldElkKCksIHBsdWdpbgotCQkJCQkJLmdldE5hbWUoKSk7Ci0JCQl9IGVsc2UgaWYgKHhtbEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKSB7Ci0JCQkJLy8gZG9uJ3QgY3JlYXRlLCBkbyBub3RoaW5nCi0JCQkJLy8gbWFyayBhcyBkaXNjYXJkZWQgc28gd2UgZG9uJ3QgbmVlZCB0byBjb3B5IGl0J3MgYXR0cmlidXRlcwotCQkJCXNldERpc2NhcmRlZCgoKENvbnRlbnRDYXRlZ29yeVBhY2thZ2UpIHhtbEVsZW1lbnQpLmdldElkKCkpOwotCi0JCQl9IGVsc2UgaWYgKCh4bWxFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KQotCQkJCQkmJiAhKHhtbEVsZW1lbnQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgRG9tYWluIAotCQkJCQkJCXx8IHhtbEVsZW1lbnQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgRGlzY2lwbGluZSkKLQkJCQkJfHwgKHhtbEVsZW1lbnQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5UGFja2FnZSkpIHsKLQkJCQkvLyBjcmVhdGUgdGhlIGNvbnRlbnQgY2F0ZWdvcmllcyBmb3Igcm9vdCBjb250ZW50IGNhdGVnb3JpZXMsCi0JCQkJLy8gbm90IGZvciBzdWItZG9tYWluIGFuZCBzdWItZGlzY2lwbGluZQotCQkJCS8vIDE1NDE0MyAtIGltcG9ydCB4bWwgZGlkIG5vdCByZXNlcnZlIHRoZSBzdWItZGlzY2lwbGluZSBzdHJ1Y3R1cmUKLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBnZXRQbHVnaW4oeG1sRWxlbWVudCkuZ2V0SWQoKTsKLQkJCQl1bWFFbGVtZW50ID0gdW1hTGliLmNyZWF0ZUNvbnRlbnRDYXRlZ29yeShwbHVnaW5JZCwgeG1sRWxlbWVudAotCQkJCQkJLmVDbGFzcygpLmdldE5hbWUoKSwgeG1sRWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpLAotCQkJCQkJeG1sTGliLmdldEVsZW1lbnRJZCh4bWxFbGVtZW50KSk7Ci0JCQl9IGVsc2UgewotCi0JCQkJLy8gaWYgdGhpcyBpcyByb290IGxldmVsIHBhY2thZ2UsIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcKLQkJCQkvLyBjb250YWluZXIgZm9yIHRoZSBVTUEgb2JqZWN0Ci0JCQkJaWYgKHhtbEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlCi0JCQkJCQkmJiB4bWxFbGVtZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlpZiAoeG1sRWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJCQl0YXJnZXRDb250YWluZXIgPSB1bWFMaWIKLQkJCQkJCQkJLmdldENvbnRlbnRSb290UGFja2FnZSh0YXJnZXRDb250YWluZXIpOwotCQkJCQl9IGVsc2UgaWYgKHhtbEVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQlPYmplY3QgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgeG1sRWxlbWVudCkKLQkJCQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCQkJCWlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQkJCQl0YXJnZXRDb250YWluZXIgPSB1bWFMaWIKLQkJCQkJCQkJCS5nZXRDYXBhYmlsaXR5UGF0dGVyblJvb3RQYWNrYWdlKHRhcmdldENvbnRhaW5lcik7Ci0JCQkJCQl9IGVsc2UgaWYgKHByb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJCQl0YXJnZXRDb250YWluZXIgPSB1bWFMaWIKLQkJCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NSb290UGFja2FnZSh0YXJnZXRDb250YWluZXIpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKHhtbEVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQkJTGlzdCBwcm9jcyA9IHhtbExpYgotCQkJCQkJCQkuZ2V0QWxsUHJvY2Vzc2VzKChNZXRob2RQYWNrYWdlKSB4bWxFbGVtZW50KTsKLQkJCQkJCWlmIChwcm9jcyAhPSBudWxsICYmIHByb2NzLnNpemUoKSA+IDApIHsKLQkJCQkJCQlPYmplY3QgcHJvYyA9IHByb2NzLmdldCgwKTsKLQkJCQkJCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJCQkJCXRhcmdldENvbnRhaW5lciA9IHVtYUxpYgotCQkJCQkJCQkJCS5nZXRDYXBhYmlsaXR5UGF0dGVyblJvb3RQYWNrYWdlKHRhcmdldENvbnRhaW5lcik7Ci0JCQkJCQkJfSBlbHNlIGlmIChwcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCQkJCXRhcmdldENvbnRhaW5lciA9IHVtYUxpYgotCQkJCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NSb290UGFja2FnZSh0YXJnZXRDb250YWluZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBnZXQgdGhlIGNvbnRhaW5tZW50IGZlYXR1cmUgc28gd2UgY2FuIGNyZWF0ZSB0aGUgb2JqZWN0IG9mCi0JCQkJLy8gdGhlIHNhbWUgdHlwZQotCQkJCXVtYUVsZW1lbnQgPSB1bWFMaWIuY3JlYXRlRWxlbWVudCh0YXJnZXRDb250YWluZXIsCi0JCQkJCQljb250YWlubWVudFhtbEZlYXR1cmUsIHhtbEVsZW1lbnQuZUNsYXNzKCkuZ2V0TmFtZSgpLAotCQkJCQkJeG1sRWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpLCB4bWxMaWIKLQkJCQkJCQkJLmdldEVsZW1lbnRJZCh4bWxFbGVtZW50KSk7Ci0KLQkJCQkvLyB4bWwgV29ya09yZGVyIGRvZXMgbm90IGhhdmUgYW4gaWQsIG5lZWQgdG8gbWFwIHRoZSB1bWEgT2JqZWN0Ci0JCQkJaWYgKHhtbEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkJCQkJd29ya09yZGVyTWFwLnB1dCh4bWxFbGVtZW50LCB1bWFFbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHJlY3Vyc2l2ZSwKLQkJCS8vIG5vdGUsIHVtYSBlbGVtZW50IG1pZ2h0IGJlIG51bGwgc2luY2Ugd2UgY2FuJ3QgZGV0ZXJtaW5lIHRoZQotCQkJLy8gb3duZXIgb2YgdGhlIGVsZW1lbnQgeWV0Ci0JCQljcmVhdEVEYXRhT2JqZWN0VHJlZSh4bWxFbGVtZW50LCB1bWFFbGVtZW50KTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIHRoZSBlcnJvciBhbmQgY29udGludWU/Pz8KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE1ldGhvZFBsdWdpbiBnZXRQbHVnaW4oRU9iamVjdCBlbGVtZW50KSB7Ci0JCXdoaWxlICgoZWxlbWVudCAhPSBudWxsKSAmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQllbGVtZW50ID0gZWxlbWVudC5lQ29udGFpbmVyKCk7Ci0JCX0KLQotCQlyZXR1cm4gKE1ldGhvZFBsdWdpbikgZWxlbWVudDsKLQl9Ci0KLQlwcml2YXRlIEVEYXRhT2JqZWN0IGdldFJtY09iamVjdChNZXRob2RFbGVtZW50IHhtbE9iaikgewotCQlpZiAoeG1sT2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJcmV0dXJuIHVtYUxpYi5nZXRSb290KCk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgaWQgPSB4bWxPYmouZ2V0SWQoKTsKLQkJCXJldHVybiB0aGlzLnVtYUxpYi5nZXRFbGVtZW50KGlkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpdGVyYXRFRGF0YU9iamVjdChNZXRob2RFbGVtZW50IHNyY09iaikgewotCQlpdGVyYXRFRGF0YU9iamVjdF8oc3JjT2JqKTsKLQkJRURhdGFPYmplY3QgdGFyZ2V0T2JqID0gZ2V0Um1jT2JqZWN0KHNyY09iaik7Ci0JCWlmICh0YXJnZXRPYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpIHsKLQkJCWRpYWdyYW1IYW5kbGVyLnJlZ2lzdGVyRWxlbWVudCgob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KSB0YXJnZXRPYmopOyAKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaXRlcmF0RURhdGFPYmplY3RfKE1ldGhvZEVsZW1lbnQgc3JjT2JqKSB7Ci0KLQkJbG9nZ2VyCi0JCQkJLmxvZ01lc3NhZ2UoIiA9PT0gcHJvY2Vzc2luZyBlbGVtZW50ICIgKyBzcmNPYmouZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6ICIgKyBzcmNPYmouZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaWYgKGlzUHJvY2Vzc2VkKHNyY09iai5nZXRJZCgpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXNldFByb2Nlc3NlZChzcmNPYmouZ2V0SWQoKSk7Ci0KLQkJLy8gaWYgb2JqZWN0IGlzIG5vdCBjcmVhdGVkLCBpdCdzIHhtbCB3cmFwcGVyIHBhY2thZ2UKLQkJaWYgKHNyY09iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UpIHsKLQotCQkJLy8gaXRlcmF0ZSB0aGUgY2hpbGQgcGFja2FnZXMKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSAoKENvbnRlbnRDYXRlZ29yeVBhY2thZ2UpIHNyY09iaikKLQkJCQkJLmdldENvbnRlbnRDYXRlZ29yeSgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlpdGVyYXRFRGF0YU9iamVjdCgoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCUVEYXRhT2JqZWN0IHRhcmdldE9iaiA9IGdldFJtY09iamVjdChzcmNPYmopOwotCQlFQ2xhc3MgZUNsYXNzID0gc3JjT2JqLmVDbGFzcygpOwotCi0JCUVMaXN0IGZlYXR1cmVzID0gZUNsYXNzLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJYm9vbGVhbiBpc05ld0VsZW1lbnQgPSB1bWFMaWIuaXNOZXdFbGVtZW50KHNyY09iai5nZXRJZCgpKSB8fCBzcmNPYmogaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5OwotCQlib29sZWFuIGlzT2xkUGx1Z2luID0gIWlzTmV3RWxlbWVudCAmJiAoc3JjT2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKTsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0Lm5leHQoKTsKLQkJCQkJCQotCQkJaWYgKEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmlzVW5uZWVkZWRYbWxGZWF0dXJlKGZlYXR1cmUuZ2V0TmFtZSgpKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGlzT2xkUGx1Z2luICYmIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpID09IGZlYXR1cmUpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJT2JqZWN0IHZhbHVlID0gc3JjT2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQl0cnkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdHYgPSAoKExpc3QpIHZhbHVlKS5pdGVyYXRvcigpOyBpdHYKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IHNyY192YWx1ZSA9IGl0di5uZXh0KCk7Ci0KLQkJCQkJCWlmIChzcmNfdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQotCQkJCQkJCS8vIGl0J3MgYW4gaWQgcmVmZXJlbmNlCi0JCQkJCQkJdW1hTGliLnNldFJlZmVyZW5jZVZhbHVlKHRhcmdldE9iaiwgZmVhdHVyZQotCQkJCQkJCQkJLmdldE5hbWUoKSwgKFN0cmluZykgc3JjX3ZhbHVlKTsKLQkJCQkJCX0gZWxzZSBpZiAoc3JjX3ZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJCS8vIHNldCB0aGUgcmVmZXJlbmNlCi0JCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIHNyY192YWx1ZTsKLQkJCQkJCQlTdHJpbmcgZ3VpZCA9IGUuZ2V0SWQoKTsKLQotCQkJCQkJCS8vIGRvbid0IHNldCB0aGUgY29udGFpbm1lbnQgZmVhdHVyZSB2YWx1ZSBzaW5jZQotCQkJCQkJCS8vIGl0J3MgYWxyZWFkeSBoYW5kbGVkCi0JCQkJCQkJLy8gd2hlbiBjcmVhdGluZyB0aGUgbGlicmFyeSBzdHJ1Y3R1cmUKLQkJCQkJCQlpZiAoIWlzRGlzY2FyZGVkKGd1aWQpICYmIGUuZUNvbnRhaW5lcigpICE9IHNyY09iaikgewotCQkJCQkJCQl1bWFMaWIuc2V0UmVmZXJlbmNlVmFsdWUodGFyZ2V0T2JqLCBmZWF0dXJlCi0JCQkJCQkJCQkJLmdldE5hbWUoKSwgZ3VpZCk7Ci0JCQkJCQkJfQotCi0JCQkJCQkJaXRlcmF0RURhdGFPYmplY3QoKE1ldGhvZEVsZW1lbnQpIHNyY192YWx1ZSk7Ci0JCQkJCQl9IGVsc2UgaWYgKHNyY192YWx1ZSBpbnN0YW5jZW9mIFdvcmtPcmRlcikgewotCQkJCQkJCS8vIFdvcmtPcmRlciBpcyBub3QgbWV0aG9kIGVsZW1lbnQgYW5kIGRvZXMgbm90IGhhdmUKLQkJCQkJCQkvLyBhbiBpZCwgbmVlZCBzcGVjaWFsIGhhbmRsaW5nCi0JCQkJCQkJLy8gc2V0IHRoZSBwcmVkZQotCQkJCQkJCVdvcmtPcmRlciB3ciA9IChXb3JrT3JkZXIpIHNyY192YWx1ZTsKLQkJCQkJCQlPYmplY3QgdW1hV3IgPSB3b3JrT3JkZXJNYXAuZ2V0KHdyKTsKLQkJCQkJCQl1bWFMaWIuc2V0V29ya09yZGVyKHVtYVdyLCB3ci5nZXRWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJbG9nZ2VyCi0JCQkJCQkJCQkubG9nTWVzc2FnZShOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X25vdF9oYW5kbGVkLCBzcmNfdmFsdWUpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKLQotCQkJCQkvLyBnZXQgdGhlIHhtbCBvYmplY3QgYW5kIGl0ZXJhdGUgYWdhaW4KLQkJCQkJT2JqZWN0IHNyY192YWx1ZSA9IHZhbHVlOwotCi0JCQkJCWlmIChzcmNfdmFsdWUgaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkJCQkJCWxvZ2dlci5sb2dNZXNzYWdlKCJ3b3Jrb3JkZXIgdmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgaWYgKHNyY192YWx1ZSBpbnN0YW5jZW9mIFN0cmluZwotCQkJCQkJCSYmICFpc0Rpc2NhcmRlZCgoU3RyaW5nKSBzcmNfdmFsdWUpKSB7Ci0JCQkJCQkvLyBpdCdzIGFuIGlkIHJlZmVyZW5jZQotCQkJCQkJdW1hTGliLnNldFJlZmVyZW5jZVZhbHVlKHRhcmdldE9iaiwgZmVhdHVyZS5nZXROYW1lKCksCi0JCQkJCQkJCShTdHJpbmcpIHNyY192YWx1ZSk7Ci0JCQkJCX0gZWxzZSBpZiAoc3JjX3ZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJLy8gc2V0IHRoZSByZWZlcmVuY2UKLQkJCQkJCVN0cmluZyBndWlkID0gKChNZXRob2RFbGVtZW50KSBzcmNfdmFsdWUpLmdldElkKCk7Ci0JCQkJCQlpZiAoZ3VpZCA9PSBudWxsKSB7Ci0JCQkJCQkJbG9nZ2VyCi0JCQkJCQkJCQkubG9nV2FybmluZyhOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X3dpdGhvdXRfaWQsICgoTWV0aG9kRWxlbWVudCkgc3JjX3ZhbHVlKQotCQkJCQkJCQkJLmdldE5hbWUoKSkpOwotCQkJCQkJfQotCQkJCQkJaWYgKCFpc0Rpc2NhcmRlZChndWlkKSkgewotCQkJCQkJCXVtYUxpYi5zZXRSZWZlcmVuY2VWYWx1ZSh0YXJnZXRPYmosIGZlYXR1cmUKLQkJCQkJCQkJCS5nZXROYW1lKCksIGd1aWQpOwotCQkJCQkJfQotCQkJCQkJaXRlcmF0RURhdGFPYmplY3QoKE1ldGhvZEVsZW1lbnQpIHNyY192YWx1ZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlsb2dnZXIKLQkJCQkJCQkJLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF9ub3RfaGFuZGxlZCwgc3JjX3ZhbHVlKSk7Ci0JCQkJCX0KLQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICh0YXJnZXRPYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKSB7Ci0JCQkJCQlsb2dnZXIubG9nTWVzc2FnZSgiaHJyZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQotCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBXb3JrT3JkZXJUeXBlKSB7Ci0JCQkJCQl2YWx1ZSA9ICgoV29ya09yZGVyVHlwZSkgdmFsdWUpLmdldE5hbWUoKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJYm9vbGVhbiByZW5hbWUgPSBmYWxzZTsKLQkJCQkJaWYgKCFpc05ld0VsZW1lbnQgJiYgZmVhdHVyZSA9PSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKSB7Ci0JCQkJCQlTdHJpbmcgb2xkTmFtZSA9IChTdHJpbmcpdGFyZ2V0T2JqLmVHZXQob3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJCQkJCVN0cmluZyBuZXdOYW1lID0gKFN0cmluZylzcmNPYmouZUdldChmZWF0dXJlKTsJCQkJCi0JCQkJCQlpZiAoIW5ld05hbWUuZXF1YWxzKG9sZE5hbWUpKSB7Ci0JCQkJCQkJTGlicmFyeUltcG9ydE1hbmFnZXIuZW5zdXJlVW5pcXVlTmFtZUZvckV4aXN0aW5nRWxlbWVudAotCQkJCQkJCQkoKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkgdGFyZ2V0T2JqLCBvbGROYW1lLCBuZXdOYW1lLCByZW5hbWVFbGVtZW50TWFwKTsKLQkJCQkJCQlyZW5hbWUgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghcmVuYW1lKSB7Ci0JCQkJCQl1bWFMaWIuc2V0QXRyaWJ1dGVGZWF0dXJlVmFsdWUodGFyZ2V0T2JqLAotCQkJCQkJCQlmZWF0dXJlLmdldE5hbWUoKSwgdmFsdWUpOwotCQkJCQl9Ci0JCQkJCWlmIChpc05ld0VsZW1lbnQgJiYgZmVhdHVyZSA9PSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKSB7Ci0JCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQgZWxlbSA9IChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpIHRhcmdldE9iajsKLQkJCQkJCUVPYmplY3QgY2VvYmogPSBlbGVtLmVDb250YWluZXIoKTsJCQkJCQkKLQkJCQkJCWlmIChjZW9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCAmJiAKLQkJCQkJCQkJISB1bWFMaWIuaXNOZXdFbGVtZW50KCgob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KSBjZW9iaikuZ2V0R3VpZCgpKSkgewotCQkJCQkJCUxpYnJhcnlJbXBvcnRNYW5hZ2VyLmVuc3VyZVVuaXF1ZU5hbWUoY2VvYmosIGVsZW0sIHJlbmFtZUVsZW1lbnRNYXApOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGxvZyB0aGUgZXJyb3IgYW5kIGNvbnRpbnVlPz8/Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQl9Ci0KLQl9Ci0KLQkvLyBnb2lkIG9mIHByb2Nlc3NlZCBlbGVtZW50Ci0JcHJpdmF0ZSBMaXN0IHByb2Nlc3NlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzUHJvY2Vzc2VkKFN0cmluZyBndWlkKSB7Ci0JCXJldHVybiBwcm9jZXNzZWRFbGVtZW50cy5jb250YWlucyhndWlkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UHJvY2Vzc2VkKFN0cmluZyBndWlkKSB7Ci0JCWlmICghcHJvY2Vzc2VkRWxlbWVudHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCXByb2Nlc3NlZEVsZW1lbnRzLmFkZChndWlkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0Rpc2NhcmRlZChTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGRpc2NhcmRlZEVsZW1lbnRzLmNvbnRhaW5zKGlkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlzY2FyZGVkKFN0cmluZyBpZCkgewotCQlkaXNjYXJkZWRFbGVtZW50cy5hZGQoaWQpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIG92ZXJ3cml0ZSBhdHRyaWJ1dGUuCi0JICogQHBhcmFtIGIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVyd3JpdGUoYm9vbGVhbiBiKSB7Ci0JCW92ZXJ3cml0ZSA9IGI7Ci0JfQkKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdmVyc2lvbkNoZWNrKGZpbmFsIFN0cmluZyB4bWxQYXRoLCBmaW5hbCBTdHJpbmcgdGl0bGUpIHsKLQkJZmluYWwgU3RyaW5nW10gcmV0ID0gbmV3IFN0cmluZ1sxXTsKLQkJcmV0WzBdID0gbnVsbDsKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewkKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsJCQkJCi0JCQkJVmVyc2lvblV0aWwuVmVyc2lvbkNoZWNrSW5mbyBpbmZvID0gVmVyc2lvblV0aWwuY2hlY2tYTUxWZXJzaW9uKG5ldyBGaWxlKHhtbFBhdGgpKTsKLQkJCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJCXJldFswXSA9IE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duLCBuZXcgT2JqZWN0W10gewotCQkJCQkJCVBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsJCQkJCQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChpbmZvLnJlc3VsdCA8IDApIHsKLQkJCQkJCWlmIChpbmZvLnRvb2xJRC5lcXVhbHMoVmVyc2lvblV0aWwuZ2V0UHJpbWFyeVRvb2xJRCgpKSkgewotCQkJCQkJCXJldFswXSA9IE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YSwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCWluZm8udG9vbFZlcnNpb24sIFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmV0WzBdID0gTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd24sIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQlQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpfSk7CQkJCQkKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChpbmZvLnJlc3VsdCA+IDApIHsKLQkJCQkJCWlmIChpbmZvLnRvb2xJRC5lcXVhbHMoVmVyc2lvblV0aWwuZ2V0UHJpbWFyeVRvb2xJRCgpKSkgewotCQkJCQkJCXJldFswXSA9IE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbCwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJaW5mby50b29sVmVyc2lvbiwgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKX0pOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZFRvb2xfdW5rbm93biwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCVBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsKLQkJCQkJCX0KLQkJCQkJfSAKLQkJCQl9Ci0JCQkJaWYgKHJldFswXSAhPSBudWxsKSB7Ci0JCQkJCUltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLCByZXRbMF0pOwkJCQkJCi0JCQkJfQotCQkJfQotCQl9KTsJCQotCQlyZXR1cm4gcmV0WzBdOwotCX0KLQkKLQkgcHVibGljIHZvaWQgaGFuZGxlVHlwZUNoYW5nZXMoKSB7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSBiYXNlTGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCUhhc2hNYXAgYmFzZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlLmNvbGxlY3RQb3RlbnRpYWxUeXBlQ2hhbmdlZChiYXNlTGliLCBiYXNlTWFwKTsKLQkJCi0JCUhhc2hNYXAgZUNsYXNzT2JqTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJSGFzaE1hcCBpbXBvcnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0geG1sTGliLmdldFJvb3QoKS5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSB8fAotCQkJCW9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCB4bWxFbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCQlTdHJpbmcgZUNsYXNzTmFtZSA9IHhtbEVsZW1lbnQuZUNsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCU9iamVjdCBlQ2xhc3NPYmogPSBlQ2xhc3NPYmpNYXAuZ2V0KGVDbGFzc05hbWUpOwotCQkJCWlmIChlQ2xhc3NPYmogPT0gbnVsbCkgewotCQkJCQlFQ2xhc3Mgb2JqRUNsYXNzID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuZ2V0Um1jRUNsYXNzKGVDbGFzc05hbWUpOwotCQkJCQlpZiAob2JqRUNsYXNzICE9IG51bGwpIHsKLQkJCQkJCWVDbGFzc09iaiA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZShvYmpFQ2xhc3MpOwotCQkJCQkJZUNsYXNzT2JqTWFwLnB1dChlQ2xhc3NOYW1lLCBlQ2xhc3NPYmopOwkKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZUNsYXNzT2JqICE9IG51bGwpIHsKLQkJCQkJaW1wb3J0TWFwLnB1dCh4bWxFbGVtZW50LmdldElkKCksIGVDbGFzc09iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5oYW5kbGVUeXBlQ2hhbmdlcyhiYXNlTWFwLCBpbXBvcnRNYXApOwkKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9JbXBvcnRYTUxvZ2dlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvSW1wb3J0WE1Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2VjZTJjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9JbXBvcnRYTUxvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuRmlsZUxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLQotLyoqCi0gKiBMb2dnZXIgY2xhc3MgZm9yIHhtbCBpbXBvcnQKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFhNTG9nZ2VyIGV4dGVuZHMgRmlsZUxvZ2dlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dTX0ZPTERFUiA9ICJsb2dzL2ltcG9ydC94bWwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSW1wb3J0WE1Mb2dnZXIoKSB7Ci0JCXN1cGVyKG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCksIExPR1NfRk9MREVSKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9VbWFMaWJyYXJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9VbWFMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlYTA4ZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvVW1hTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudGV4dC5QYXJzZVBvc2l0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5FRGF0YU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5Db250ZW50UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5JTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzLkZlYXR1cmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLkltcG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5JbXBvcnRYTUxSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotCi0vKioKLSAqIFVtYUxpYnJhcnkgcmVwcmVzZW50cyBhIG1ldGhvZCBsaWJyYXJ5IGFuZCBwcm92aWRlIG1ldGhvZHMgdG8gY3JlYXRlIGVsZW1lbnRzCi0gKiBhbmQgc2V0IGF0dHJpYnV0ZXMgYW5kIGZlYXR1cmUgdmFsdWVzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFMaWJyYXJ5IHsKLQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZyA9IEltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBvdmVyd3JpdGUgPSBmYWxzZTsJCi0JCi0JcHJpdmF0ZSBJTG9nZ2VyIGxvZ2dlcjsKLQotCXByaXZhdGUgQ29udGVudFByb2Nlc3NvciBjb250ZW50UHJvYyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBNYXAgbmV3RWxlbWVudHNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gbWFwIG9mIGNyZWF0ZWQgZWxlbWVudHMsIGd1aWQgLSBFRGF0YU9iamVjdAotCU1hcCBlbGVtZW50c01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBrZWVwIHRoZSBzb3VyY2UgZWxlbWVudCBpZHMgc28gd2UgY2FuIGRldGVybWluZSB0aGUgZWxlbWVudHMgdGhhdCBhcmUgbm90IGluIHRoZSB4bWwgc291cmNlIGxpYnJhcnkKLQkvLyB0aGlzIGlzIG5lZWRlZCBmb3IgZGVsZXRpbmcgdW4tbmVlZGVkIGVsZW1lbnRzCi0JLy8gMTU0MTQ5IC0gYWxsb3cgcGFja2FnZSBsZXZlbCBtZXJnaW5nIGZvciB4bWwgaW1wb3J0Ci0JSGFzaFNldCBzb3VyY2VFbGVtZW50SURzID0gbmV3IEhhc2hTZXQoKTsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICogQHBhcmFtIGNvbnRlbnRQcm9jCi0JICogQHBhcmFtIGxvZ2dlcgotCSAqIEBwYXJhbSBvdmVyd3JpdGUKLQkgKi8KLQlwdWJsaWMgVW1hTGlicmFyeShDb250ZW50UHJvY2Vzc29yIGNvbnRlbnRQcm9jLCBJTG9nZ2VyIGxvZ2dlciwgYm9vbGVhbiBvdmVyd3JpdGUpIHsKLQkJdGhpcy5sb2dnZXIgPSBsb2dnZXI7Ci0JCXRoaXMuY29udGVudFByb2MgPSBjb250ZW50UHJvYzsKLQkJdGhpcy5vdmVyd3JpdGUgPSBvdmVyd3JpdGU7Ci0KLQkJYnVpbGRFbGVtZW50c01hcCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgbGlicmFyeSBhcyB0aGUgcm9vdCBvYmplY3QuCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0Um9vdCgpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRFbGVtZW50c01hcCgpIHsKLQkJLy8gYnVpbGQgdGhlIGVsZW1lbnRzIG1hcCBmb3IgZWFzeSBvcGVyYXRpb24KLQotCQllbGVtZW50c01hcC5jbGVhcigpOwotCQllbGVtZW50c01hcC5wdXQoZ2V0Um9vdCgpLmdldEd1aWQoKSwgZ2V0Um9vdCgpKTsKLQkJVHJlZUl0ZXJhdG9yIGl0ID0gZ2V0Um9vdCgpLmVBbGxDb250ZW50cygpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgZSA9IGl0Lm5leHQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCWVsZW1lbnRzTWFwLnB1dCgoKE1ldGhvZEVsZW1lbnQpIGUpLmdldEd1aWQoKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29udGVudCBjYXRlcmdvcnkuCi0JICogQHBhcmFtIHBsdWdpbklkCi0JICogQHBhcmFtIHhtbEVDbGFzc05hbWUKLQkgKiBAcGFyYW0geG1sRWxlbWVudFR5cGUKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGNyZWF0ZUNvbnRlbnRDYXRlZ29yeShTdHJpbmcgcGx1Z2luSWQsCi0JCQlTdHJpbmcgeG1sRUNsYXNzTmFtZSwgU3RyaW5nIHhtbEVsZW1lbnRUeXBlLCBTdHJpbmcgaWQpIHsKLQotCQlzZXRTb3VyY2VJZChpZCk7Ci0JCQotCQkvLyBtYWtlIHN1cmUgdGhlIHNhbWUgb2JqZWN0IGNyZWF0ZWQgb25seSBvbmNlCi0JCUVEYXRhT2JqZWN0IG9iaiA9IGdldEVsZW1lbnQoaWQpOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCXJldHVybiBvYmo7Ci0JCX0KLQotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgZ2V0RWxlbWVudChwbHVnaW5JZCk7Ci0KLQkJRUNsYXNzIG9iakNsYXNzID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuZ2V0Um1jRUNsYXNzKHhtbEVDbGFzc05hbWUpOwotCQlpZiAob2JqQ2xhc3MgPT0gbnVsbCkgewotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfZXJyb3Jfbm9fZWNsYXNzLCB4bWxFQ2xhc3NOYW1lKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCW9iaiA9IChFRGF0YU9iamVjdCkgRWNvcmVVdGlsLmNyZWF0ZShvYmpDbGFzcyk7Ci0JCXNldEVsZW1lbnQoaWQsIG9iaik7Ci0KLQkJQ29udGVudFBhY2thZ2Ugcm9vdFBrZyA9IChDb250ZW50UGFja2FnZSkgZ2V0Um9vdFBhY2thZ2UocGx1Z2luLCBvYmopOwotCQlyb290UGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChvYmopOwotCQlyZXR1cm4gb2JqOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJvb3QgcGFja2FnZQotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcGFyYW0gb2JqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBNZXRob2RQYWNrYWdlIGdldFJvb3RQYWNrYWdlKE1ldGhvZFBsdWdpbiBwbHVnaW4sIE9iamVjdCBvYmopIHsKLQotCQlTdHJpbmdbXSBwYXRoID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlwYXRoID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGg7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZQotCQkJCXx8IG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykgewotCQkJcGF0aCA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJcGF0aCA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aDsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0IHx8IG9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykgewotCQkJcGF0aCA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGg7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVG9vbCkgewotCQkJcGF0aCA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGg7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKSB7Ci0JCQlwYXRoID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoOwotCQl9Ci0KLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJcmV0dXJuIFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLCBwYXRoKTsKLQkJfSBlbHNlIHsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X25vX3BhY2thZ2UsIG9iaikpOyAKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBtZXRob2QgcGx1Z2luLgotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGNyZWF0ZU1ldGhvZFBsdWdpbihTdHJpbmcgaWQsIFN0cmluZyBuYW1lKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQkvLyBtYWtlIHN1cmUgdGhlIHNhbWUgb2JqZWN0IGNyZWF0ZWQgb25seSBvbmNlCi0JCUVEYXRhT2JqZWN0IG9iaiA9IGdldEVsZW1lbnQoaWQpOwotCQlib29sZWFuIGlzT2xkID0gb2JqICE9IG51bGw7Ci0JCWlmIChvYmogPT0gbnVsbCkgewotCQkJb2JqID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUGx1Z2luKG5hbWUsIGlkKTsKLQotCQkJc2V0RWxlbWVudChpZCwgb2JqKTsKLQkJfQotCi0JCS8vIG1ha2Ugc3VyZSB0aGUgc3lzdGVtIHBhY2thZ2VzIGFyZSBpbmNsdWRlZAotCQlzZXRTb3VyY2VJZChpZCk7Ci0JCUxpc3QgcGtncyA9IFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMoKE1ldGhvZFBsdWdpbilvYmopOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGtncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kUGFja2FnZSBwa2cgPSAoTWV0aG9kUGFja2FnZSlpdC5uZXh0KCk7Ci0JCQlzZXRTb3VyY2VJZChwa2cuZ2V0R3VpZCgpKTsKLQkJCWlmICghaXNPbGQpIHsKLQkJCQluZXdFbGVtZW50c01hcC5wdXQocGtnLmdldEd1aWQoKSwgcGtnKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG9iajsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGNvbnRlbnQncyByb290IHBhY2thZ2UuCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgZ2V0Q29udGVudFJvb3RQYWNrYWdlKEVEYXRhT2JqZWN0IHBsdWdpbikgewotCQlpZiAoIShwbHVnaW4gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZSgoTWV0aG9kUGx1Z2luKSBwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgY2FwYWJpbGl0eSBwYXR0ZXJuJyByb290IHBhY2thZ2UuCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgZ2V0Q2FwYWJpbGl0eVBhdHRlcm5Sb290UGFja2FnZShFRGF0YU9iamVjdCBwbHVnaW4pIHsKLQkJaWYgKCEocGx1Z2luIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoKE1ldGhvZFBsdWdpbikgcGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGRlbGl2ZXJ5IHByb2Nlc3MnIHJvb3QgcGFja2FnZS4KLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBnZXREZWxpdmVyeVByb2Nlc3NSb290UGFja2FnZShFRGF0YU9iamVjdCBwbHVnaW4pIHsKLQkJaWYgKCEocGx1Z2luIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoKE1ldGhvZFBsdWdpbikgcGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aCk7Ci0JfQotCi0vLwlwdWJsaWMgRURhdGFPYmplY3QgZ2V0UHJvY2Vzc0NvbnRyaWJ1dGlvblJvb3RQYWNrYWdlKEVEYXRhT2JqZWN0IHBsdWdpbikgewotLy8JCWlmICghKHBsdWdpbiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJfQotLy8JCXJldHVybiBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKChNZXRob2RQbHVnaW4pIHBsdWdpbiwKLS8vCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGgpOwotLy8JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlbGVtZW50LgotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiBAcGFyYW0geG1sRmVhdHVyZU5hbWUKLQkgKiBAcGFyYW0geG1sRUNsYXNzTmFtZQotCSAqIEBwYXJhbSB4bWxFbGVtZW50VHlwZQotCSAqIEBwYXJhbSBpZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgY3JlYXRlRWxlbWVudChFRGF0YU9iamVjdCBjb250YWluZXIsCi0JCQlTdHJpbmcgeG1sRmVhdHVyZU5hbWUsIFN0cmluZyB4bWxFQ2xhc3NOYW1lLCBTdHJpbmcgeG1sRWxlbWVudFR5cGUsCi0JCQlTdHJpbmcgaWQpIHsKLQotCQlzZXRTb3VyY2VJZChpZCk7Ci0KLQkJLy8gbWFrZSBzdXJlIHRoZSBzYW1lIG9iamVjdCBjcmVhdGVkIG9ubHkgb25jZQotCQlFRGF0YU9iamVjdCBvYmogPSBnZXRFbGVtZW50KGlkKTsKLQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlFT2JqZWN0IGVvYmogPSBvYmouZUNvbnRhaW5lcigpOwotCQkJCWlmIChlb2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJUHJvY2Vzc1BhY2thZ2UgcCA9IChQcm9jZXNzUGFja2FnZSkgZW9iajsKLQkJCQkJc2V0U291cmNlSWQocC5nZXRHdWlkKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBvYmo7Ci0JCX0KLQotCQkvLyBpZiAoIG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiApIHsKLQkJLy8gcmV0dXJuIGdldEVsZW1lbnQoaWQpOwotCQkvLyB9Ci0KLQkJLy8gLy8gdGhpcyBpcyBhbiBlYXNpZXIgd2F5LCB0ZXN0IGl0LAotCQkvLyAvLyBkb2VzIG5vdCB3b3JrIHNpbmNlIGZlYXR1cmUuZ2V0RVR5cGUoKSByZXR1cm5zIHRoZSBiYXNlIGVsZW1lbnQKLQkJLy8gdHlwZSwgbm90IHRoZSBleHRlbmRlZCBvbmUKLQkJLy8gLy8gZm9yIGV4YW1wbGUsIGl0IHJldHVybnMgTWV0aG9kUGFja2FnZSBpbnN0ZWFkIG9mIFByb2Nlc3NQYWNrYWdlIG9yCi0JCS8vIENvbnRlbnRQYWNrYWdlCi0JCS8vIC8vIHNvIHdlIG5lZWQgdG8gbWFrZSBvdXIgb3duIG1hcAotCQkvLyBFQ2xhc3NpZmllciBjID0gZmVhdHVyZS5nZXRFVHlwZSgpOwotCi0JCUVDbGFzcyBvYmpDbGFzcyA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFJtY0VDbGFzcyh4bWxFQ2xhc3NOYW1lKTsKLQkJaWYgKG9iakNsYXNzID09IG51bGwpIHsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X2Vycm9yX25vX2VjbGFzcywgeG1sRUNsYXNzTmFtZSkpOyAKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJb2JqID0gKEVEYXRhT2JqZWN0KSBFY29yZVV0aWwuY3JlYXRlKG9iakNsYXNzKTsJCi0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtPcmRlcikgewotCQkJLy8gV29ya09yZGVyIGlzIG5vdCBhIG1ldGhvZCBlbGVtZW50IGluIHhtbCB1bWEsIG5lZWQgdG8gY3JlYXRlIGl0Ci0JCQkvLyB3aXRoIGEgZ3VpZAotCQkJLy9pZCA9IEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKTsKLQotCQkJLy8gYWxzbyBuZWVkIHRvIGFkZCB0aGUgZWxlbWVudCBpbnRvIHRoZSBjb250YWluZXIgb2YgdGhlIG93bmVyCi0JCQkoKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXIuZUNvbnRhaW5lcigpKS5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoCi0JCQkJCW9iaik7Ci0JCX0KLQotCQlzZXRFbGVtZW50KGlkLCBvYmopOwotCi0JCXRyeSB7Ci0JCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGNvbnRhaW5lcjsKLQkJCQkvLyBuZWVkIHNwZWNpYWwgaGFuZGxpbmcgZm9yIG5ldyBwbHVnaW4KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJLy8gY29udGVudCBwYWNrYWdlIGFuZCBvd25lciBpcyBQbHVnaW4sIGdvdG8gdGhlIHJvb3QKLQkJCQkJLy8gY29udGVudCBwYWNrYWdlCi0JCQkJCU1ldGhvZFBhY2thZ2UgcGtnX2NvcmVfY29udGVudCA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoCi0JCQkJCQkJcGx1Z2luLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0JCQkJCXBrZ19jb3JlX2NvbnRlbnQuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChvYmopOwotCQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlNZXRob2RQYWNrYWdlIHBrZ19jcCA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoKTsKLQkJCQkJcGtnX2NwLmdldENoaWxkUGFja2FnZXMoKS5hZGQob2JqKTsKLQotCQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJLy8gdGhpcyBpcyBhIHJvb3QgcHJvY2VzcyBwYWNrYWdlCi0JCQkJCS8vIHB1dCBpbnRvIHRoZSByb290IGRlbGl2ZXJ5IHByb2Nlc3NlcyBwYWNrYWdlCi0JCQkJCU1ldGhvZFBhY2thZ2UgcGtnX2RwID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoKTsKLQkJCQkJcGtnX2RwLmdldENoaWxkUGFja2FnZXMoKS5hZGQob2JqKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCi0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRQotCQkJCQkJLmdldFJtY0ZlYXR1cmUoY29udGFpbmVyLmVDbGFzcygpLCB4bWxGZWF0dXJlTmFtZSk7Ci0JCQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlpZiAoKGNvbnRhaW5lciBpbnN0YW5jZW9mIEFjdGl2aXR5KQotCQkJCQkJJiYgZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKQotCQkJCQkJJiYgb2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCi0JCQkJCS8vIHRoZSBjb250YWluZXIgbmVlZHMgdG8gYmUgYSBwcm9jZXNzIHBhY2thZ2UKLQkJCQkJRU9iamVjdCBwa2cgPSBjb250YWluZXI7Ci0JCQkJCXdoaWxlICgocGtnICE9IG51bGwpICYmICEocGtnIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpKSB7Ci0JCQkJCQlwa2cgPSBwa2cuZUNvbnRhaW5lcigpOwotCQkJCQl9Ci0KLQkJCQkJLy8gaWYgdGhlIG9iamVjdCBpcyBhbiBhY3Rpdml0eSwgY3JlYXRlIGEgcGFja2FnZSBmb3IgaXQgYW5kCi0JCQkJCS8vIGFsbCBpdCdzIGJyZWFrZG93biBlbGVtZW50cwotCQkJCQlpZiAoKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJCQkJTGlzdCBjaGlsZFBrZ3MgPSAoKFByb2Nlc3NQYWNrYWdlKSBwa2cpCi0JCQkJCQkJCS5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCQkJCQlQcm9jZXNzUGFja2FnZSBwcCA9IG51bGw7Ci0JCQkJCQlpZiAodHJ1ZSB8fCBjaGlsZFBrZ3Muc2l6ZSgpID09IDApIHsJLy8xNTgzNjM6IGFsd2F5cyBjcmVhdGUgYSBwYWNrYWdlIGZvciBhY3QKLQkJCQkJCQlwcCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQkJCQkJcHAuc2V0TmFtZSgoKE1ldGhvZEVsZW1lbnQpIGNvbnRhaW5lcikuZ2V0TmFtZSgpKTsKLQkJCQkJCQlzZXRFbGVtZW50KEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSwgcHApOwotCQkJCQkJCXNldFNvdXJjZUlkKHBwLmdldEd1aWQoKSk7Ci0JCQkJCQkJY2hpbGRQa2dzLmFkZChwcCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBwID0gKFByb2Nlc3NQYWNrYWdlKSBjaGlsZFBrZ3MuZ2V0KDApOwotCQkJCQkJfQotCi0JCQkJCQlwa2cgPSBwcDsKLQkJCQkJfQotCi0JCQkJCSgoUHJvY2Vzc1BhY2thZ2UpIHBrZykuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKG9iaik7Ci0JCQkJfQotCi0JCQkJLy8gbm90ZTogYWxsIGVsZW1lbnQgcmVmZXJlbmNlcyBhcmUgc3RyaW5nIHR5cGUgKGlkKQotCQkJCS8vIHBhY2thZ2UgcmVmZXJlbmNlcyBhcmUgb2JqZWN0IHJlZmVyZW5jZXMKLQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlMaXN0IHZhbHVlcyA9IChMaXN0KSBjb250YWluZXIuZUdldChmZWF0dXJlKTsKLQkJCQkJdmFsdWVzLmFkZChvYmopOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvbnRhaW5lci5lU2V0KGZlYXR1cmUsIG9iaik7Ci0JCQkJfQotCQkJfQkJCQkKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudCwgZS5nZXRNZXNzYWdlKCkpKTsKLQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gb2JqOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRFbGVtZW50KFN0cmluZyBndWlkLCBFRGF0YU9iamVjdCBvYmopIHsKLQkJLy8gYWRkRWxlbWVudFRvQ29udGFpbmVyKGNvbnRhaW5lciwgb2JqKTsKLQkJCQkKLQkJaWYgKCFlbGVtZW50c01hcC5jb250YWluc0tleShndWlkKSkgewotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCSgoTWV0aG9kRWxlbWVudCkgb2JqKS5zZXRHdWlkKGd1aWQpOwotCQkJfQotCi0JCQllbGVtZW50c01hcC5wdXQoZ3VpZCwgb2JqKTsKLQkJCQkJCi0JCQlzZXREaXJ0eShvYmopOwotCQkJbmV3RWxlbWVudHNNYXAucHV0KGd1aWQsIG9iaik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U291cmNlSWQoU3RyaW5nIGlkKSB7Ci0JCS8vIDE1NDE0OSAtIGFsbG93IHBhY2thZ2UgbGV2ZWwgbWVyZ2luZyBmb3IgeG1sIGltcG9ydAotCQlpZiAoICFzb3VyY2VFbGVtZW50SURzLmNvbnRhaW5zKGlkKSApIHsKLQkJCXNvdXJjZUVsZW1lbnRJRHMuYWRkKGlkKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0RGlydHkoRU9iamVjdCBvYmopIHsKLQkJLy8gbWFyayB0aGUgcmVzb3VyY2UgYXMgZGlydHkKLQkJUmVzb3VyY2UgcmVzID0gb2JqLmVSZXNvdXJjZSgpOwotCQlpZiAoIHJlcyAhPSBudWxsICYmICFyZXMuaXNNb2RpZmllZCgpICkgewotCQkJcmVzLnNldE1vZGlmaWVkKHRydWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldHMgZWxlbWVudCBnaXZlbiB0aGUgZ3VpZC4KLQkgKiBAcGFyYW0gZ3VpZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgZ2V0RWxlbWVudChTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gKEVEYXRhT2JqZWN0KSBlbGVtZW50c01hcC5nZXQoZ3VpZCk7Ci0JfQotCi0JcHJpdmF0ZSBEYXRlIGNyZWF0ZURhdGUoU3RyaW5nIGRhdGVTdHIpIHsKLQkJZGF0ZVN0ciA9IGRhdGVTdHIucmVwbGFjZSgnVCcsICcgJyk7Ci0JCVNpbXBsZURhdGVGb3JtYXQgZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIGhoOm1tOnNzIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGYucGFyc2UoZGF0ZVN0ciwgbmV3IFBhcnNlUG9zaXRpb24oMCkpOwotCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIHN0ciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlzdHIgPSBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZSgoTWV0aG9kRWxlbWVudCkgb2JqKTsKLQkJfSBlbHNlIGlmIChvYmogIT0gbnVsbCkgewotCQkJc3RyID0gb2JqLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlyZXR1cm4gc3RyOwotCX0KLQotCS8qKgotCSAqIFNldHMgYXR0cmlidXRlIGZlYXR1cmUgdmFsdWUuCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBmZWF0dXJlTmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXRyaWJ1dGVGZWF0dXJlVmFsdWUoRURhdGFPYmplY3Qgb2JqLCBTdHJpbmcgZmVhdHVyZU5hbWUsCi0JCQlPYmplY3QgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAob2JqID09IG51bGwgfHwgZmVhdHVyZU5hbWUgPT0gbnVsbCB8fCB2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QgfHwgdmFsdWUgaW5zdGFuY2VvZiBFRGF0YU9iamVjdCkgewotCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzIsIHZhbHVlKSk7IAotCQl9Ci0KLQkJLy8gZmluZCB0aGUgZmVhdHVyZSBhbmQgc2V0IHRoZSB2YWx1ZQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFJtY0ZlYXR1cmUob2JqCi0JCQkJLmVDbGFzcygpLCBmZWF0dXJlTmFtZSk7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCU9iamVjdFtdIHBhcmFzID0gbmV3IE9iamVjdFtdIHsgZ2V0U3RyaW5nKG9iaiksIGZlYXR1cmVOYW1lLCB2YWx1ZSB9OwotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZSwgcGFyYXMpICsgb2JqKTsgCi0JCQlyZXR1cm47Ci0JCX0gCi0JCQotCQlzZXREaXJ0eShvYmopOwotCi0JCS8vIDE1ODY4OCAtIE1pc3NpbmcgdGVtcGxhdGUgZmlsZXMgaW4gZXhwb3J0ZWQgeG1sIGxpYnJhcnkKLQkJLy8gcHJvY2VzcyB0aGUgYXR0YWNobWVudCB1cmwKLQkJaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKSApIHsKLQkJCWlmICggdmFsdWUgIT0gbnVsbCApIHsKLQkJCQl2YWx1ZSA9IGNvbnRlbnRQcm9jLnJlc29sdmVBdHRhY2htZW50UmVzb3VyY2VzKG9iaiwgdmFsdWUudG9TdHJpbmcoKS50cmltKCkpOwotCQkJfQotCQkJb2JqLmVTZXQoZmVhdHVyZSwgdmFsdWUpOwotCQl9Ci0JCQotCQllbHNlIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJLy8gaWYgdGhlIHVtYSBmZWF0dXJlIGlzIGEgcmVmZXJlbmNlIGZlYXR1cmUKLQkJCS8vIGJ1dCB0aGUgeG1sIGZlYXR1cmUgaXMgYW4gYXR0cmlidXRlCi0JCQkvLyB0aGUgYXR0cmlidXRlIHZhbHVlIG11c3QgYmUgYSBndWlkCi0JCQlPYmplY3QgZSA9IGdldEVsZW1lbnQoKFN0cmluZykgdmFsdWUpOwotCQkJaWYgKGUgIT0gbnVsbCkgewotCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCSgoTGlzdCkgb2JqLmVHZXQoZmVhdHVyZSkpLmFkZChlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvYmouZVNldChmZWF0dXJlLCBlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCU9iamVjdFtdIHBhcmFzID0gbmV3IE9iamVjdFtdIHsgZ2V0U3RyaW5nKG9iaiksCi0JCQkJCQlmZWF0dXJlLmdldE5hbWUoKSwgdmFsdWUgfTsKLQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZSwgcGFyYXMpOyAKLQkJCQlsb2dnZXIubG9nV2FybmluZyhtc2cpOwotCQkJfQotCQl9IGVsc2UgaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSB7Ci0JCQl0cnkgewotCQkJCWlmIChmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoInZhcmlhYmlsaXR5VHlwZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsdWUgPSBWYXJpYWJpbGl0eVR5cGUuZ2V0KHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJCX0gZWxzZSBpZiAoZmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJsaW5rVHlwZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsdWUgPSBXb3JrT3JkZXJUeXBlLmdldCh2YWx1ZS50b1N0cmluZygpKTsKLQkJCQl9IGVsc2UgaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKSkgewotCQkJCQkvLyBjb252ZXJ0IGphdmEudXRpbC5EYXRlIHRvIHhtbCBEYXRlCi0JCQkJCXZhbHVlID0gY3JlYXRlRGF0ZSh2YWx1ZS50b1N0cmluZygpKTsKLQkJCQl9IGVsc2UgaWYgKGZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygibm9kZWljb24iKSAvLyROT04tTkxTLTEkCi0JCQkJCQl8fCBmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoInNoYXBlaWNvbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsdWUgPSBuZXcgamF2YS5uZXQuVVJJKHZhbHVlLnRvU3RyaW5nKCkpOwotCi0JCQkJCS8vIG5lZWQgdG8gY29weSB0aGUgcmVzb3VyY2UgZmlsZSB0byB0aGUgdGFyZ2V0IGxpYnJhcnkKLQkJCQkJY29udGVudFByb2MuY29weVJlc291cmNlKCgoamF2YS5uZXQuVVJJKSB2YWx1ZSkuZ2V0UGF0aCgpKTsKLQkJCQl9IGVsc2UgaWYgKChjb250ZW50UHJvYyAhPSBudWxsKQotCQkJCQkJJiYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpCi0JCQkJCQkmJiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0JCQkJCXZhbHVlID0gY29udGVudFByb2MucmVzb2x2ZVJlc291cmNlRmlsZXMoCi0JCQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwgKFN0cmluZykgdmFsdWUpOwotCQkJCX0KLQkJCQlvYmouZVNldChmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlPYmplY3RbXSBwYXJhcyA9IG5ldyBPYmplY3RbXSB7IGdldFN0cmluZyhvYmopLCBmZWF0dXJlTmFtZSwKLQkJCQkJCXZhbHVlIH07Ci0JCQkJbG9nZ2VyLmxvZ0Vycm9yKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGUsIHBhcmFzKSwgZSk7IAotCQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlPYmplY3RbXSBwYXJhcyA9IG5ldyBPYmplY3RbXSB7IGdldFN0cmluZyhvYmopLCBmZWF0dXJlTmFtZSwgdmFsdWUgfTsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMywgcGFyYXMpKTsgCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIFNldHMgcmVmZXJlbmNlIHZhbHVlLgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gZmVhdHVyZU5hbWUKLQkgKiBAcGFyYW0gaWQKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZVZhbHVlKEVEYXRhT2JqZWN0IG9iaiwgU3RyaW5nIGZlYXR1cmVOYW1lLCBTdHJpbmcgaWQpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG9iaiA9PSBudWxsIHx8IGZlYXR1cmVOYW1lID09IG51bGwgfHwgaWQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlFT2JqZWN0IHZhbHVlID0gZ2V0RWxlbWVudChpZCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlLCBmZWF0dXJlTmFtZSwgaWQpKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZmluZCB0aGUgZmVhdHVyZSBhbmQgc2V0IHRoZSB2YWx1ZQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFJtY0ZlYXR1cmUob2JqCi0JCQkJLmVDbGFzcygpLCBmZWF0dXJlTmFtZSk7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCU9iamVjdFtdIHBhcmFzID0gbmV3IE9iamVjdFtdIHsgZ2V0U3RyaW5nKG9iaiksIGZlYXR1cmVOYW1lLCBpZCB9OwotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZV8yLCBwYXJhcykpOyAKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGRvbid0IGl0ZXJhdGUgdGhlIGNvbnRhaW5tZW50IGZlYXR1cmUKLQkJaWYgKHZhbHVlLmVDb250YWluZXIoKSA9PSBvYmopIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFN0cmluZyBzdHIgPSBmZWF0dXJlLmdldEVUeXBlKCkuZ2V0TmFtZSgpOwotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJdHJ5IHsKLQkJCQlMaXN0IGl0ZW1zID0gKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpOwotCQkJCWlmICghaXRlbXMuY29udGFpbnModmFsdWUpKSB7Ci0JCQkJCWl0ZW1zLmFkZCh2YWx1ZSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJT2JqZWN0W10gcGFyYXMgPSBuZXcgT2JqZWN0W10geyBnZXRTdHJpbmcob2JqKSwgZmVhdHVyZU5hbWUsIGlkIH07Ci0JCQkJbG9nZ2VyCi0JCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCU5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2VfMiwgcGFyYXMpLCBlKTsgCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlvYmouZVNldChmZWF0dXJlLCB2YWx1ZSk7Ci0JCX0KLQkJCi0JCXNldERpcnR5KG9iaik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB3b3JrIG9yZGVyLgotCSAqIEBwYXJhbSB1bWFXb3JrT3JkZXIKLQkgKiBAcGFyYW0gcHJlZElkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya09yZGVyKE9iamVjdCB1bWFXb3JrT3JkZXIsIFN0cmluZyBwcmVkSWQpIHsKLQkJaWYgKHVtYVdvcmtPcmRlciBpbnN0YW5jZW9mIFdvcmtPcmRlcikgewotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudChwcmVkSWQpOwotCQkJKChXb3JrT3JkZXIpIHVtYVdvcmtPcmRlcikuc2V0UHJlZChlKTsKLQkJCQotCQkJc2V0RGlydHkoKEVPYmplY3QpdW1hV29ya09yZGVyKTsKLQotCQl9Ci0JfQotCi0JLyoqCi0JICogRml4ZXMgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXhMaWJyYXJ5KCkgewotCQlNZXRob2RMaWJyYXJ5IHJvb3RPYmplY3QgPSBnZXRSb290KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSAoKE1ldGhvZExpYnJhcnkpIHJvb3RPYmplY3QpLmdldE1ldGhvZFBsdWdpbnMoKQotCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlmaXhQbHVnaW4oKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTWV0aG9kUGFja2FnZSBjcFJvb3QgPSBudWxsOwotCi0JcHJpdmF0ZSBNZXRob2RQYWNrYWdlIGRwUm9vdCA9IG51bGw7Ci0KLS8vCXByaXZhdGUgTWV0aG9kUGFja2FnZSBwY1Jvb3QgPSBudWxsOwotCi0JcHJpdmF0ZSB2b2lkIGZpeFBsdWdpbihNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0KLQkJLy8gZml4IHRoZSByb290IGN1c3RvbSBjYXRlZ29yaWVzCi0JCWZpeEN1c3RvbUNhdGVnb3JpZXMocGx1Z2luKTsKLQotCQlMaXN0IGNwUGtncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBkcFBrZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJTGlzdCBwY1BrZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJY3BSb290ID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGgpOwotCQlkcFJvb3QgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGgpOwotLy8JCXBjUm9vdCA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotLy8JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5wcm9jZXNzQ29udHJpYnV0aW9uUGF0aCk7Ci0JCWdldEFsbFBhY2thZ2VzKGNwUm9vdCwgY3BQa2dzKTsKLQkJZ2V0QWxsUGFja2FnZXMoZHBSb290LCBkcFBrZ3MpOwotCQkKLS8vCQlpZiAoIHBjUGtncyAhPSBudWxsICkgewotLy8JCQlnZXRBbGxQYWNrYWdlcyhwY1Jvb3QsIHBjUGtncyk7Ci0vLwkJfQotCQkJCi0JCUxpc3QgcHJvY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW4uZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KWl0Lm5leHQoKTsKLQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gby5lRGVsaXZlcigpOwotCQkJdHJ5CXsKLQkJCQkvLyB0dXJuIG9mZiBub3RpZmljYXRpb25zIHRvIGF2b2lkIHBvc3NpYmxlIGRlYWRsb2NrIG9yIHRocmVhZCBpc3N1ZQotCQkJCS8vIDE1NDE0MiAtIGltcG9ydCB4bWwgY2F1c2VkIHRocmVhZCBhY2Nlc3MgZXJyb3IKLQkJCQlvLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQkKLQkJCQlpZiAobyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJcHJvY3MuYWRkKG8pOwotCQkJCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJCQlTdHJpbmcgcE5hbWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgbykuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJCQlpZiAocE5hbWUgPT0gbnVsbCB8fCBwTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkoKERlc2NyaWJhYmxlRWxlbWVudCkgbykKLQkJCQkJCQkJLnNldFByZXNlbnRhdGlvbk5hbWUoKChEZXNjcmliYWJsZUVsZW1lbnQpIG8pCi0JCQkJCQkJCQkJLmdldE5hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCi0JCQkJLy8gZml4IHRoZSBuYW1lIHN0cmluZwotCQkJCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiAhKG8gaW5zdGFuY2VvZiBTZWN0aW9uKSkgewotCQkJCQlTdHJpbmcgbmFtZSA9ICgoTWV0aG9kRWxlbWVudCkgbykuZ2V0TmFtZSgpOwotCQkJCQlTdHJpbmcgbmV3X25hbWUgPSBTdHJVdGlsLm1ha2VWYWxpZEZpbGVOYW1lKG5hbWUpOwotCQkJCQlpZiAoICFuZXdfbmFtZS5lcXVhbHMobmFtZSkgKSB7Ci0JCQkJCQkoKE1ldGhvZEVsZW1lbnQpIG8pLnNldE5hbWUobmV3X25hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlvLmVTZXREZWxpdmVyKG9sZE5vdGlmeSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvY3Muc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHByb2NzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlQcm9jZXNzQ29tcG9uZW50IHBjID0gKFByb2Nlc3NDb21wb25lbnQpIGl0Lm5leHQoKTsKLQkJCQlPYmplY3QgcHJvYyA9IHBjLmdldFByb2Nlc3MoKTsKLQkJCQlpZiAocHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQlpZiAoIWRwUGtncy5jb250YWlucyhwYykpIHsKLQkJCQkJCW1vdmVQcm9jZXNzQ29tcG9uZW50KHBjLCBkcFJvb3QpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQkJaWYgKCFjcFBrZ3MuY29udGFpbnMocGMpKSB7Ci0JCQkJCQltb3ZlUHJvY2Vzc0NvbXBvbmVudChwYywgY3BSb290KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRBbGxQYWNrYWdlcyhNZXRob2RQYWNrYWdlIHBrZywgTGlzdCBwa2dzKSB7Ci0JCXBrZ3MuYWRkKHBrZyk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWdldEFsbFBhY2thZ2VzKChNZXRob2RQYWNrYWdlKSBpdC5uZXh0KCksIHBrZ3MpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbW92ZSB0aGUgcHJvY2VzcyBwYWNrYWdlIHRvIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyLCBpZiB0aGUgcGFja2FnZSBpcwotCSAqIHRoZSBvbmx5IGNoaWxkIG9mIGl0J3MgcGFyZW50LCBtb3ZlIGl0J3MgcGFyZW50Ci0JICogCi0JICogQHBhcmFtIHBrZwotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgbW92ZVByb2Nlc3NDb21wb25lbnQoUHJvY2Vzc1BhY2thZ2UgcGtnLAotCQkJTWV0aG9kUGFja2FnZSBjb250YWluZXIpIHsKLQkJLy8gbWFrZSBzdXJlIENhcGFiaWxpdHkgcGF0dGVybnMgYXJlIGluIHRoZSBDYXBhYmlsaXR5IHBhY2thZ2VzCi0JCU9iamVjdCBvID0gcGtnLmVDb250YWluZXIoKTsKLQkJaWYgKChvIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpCi0JCQkJJiYgKCgoUHJvY2Vzc1BhY2thZ2UpIG8pLmdldENoaWxkUGFja2FnZXMoKS5zaXplKCkgPT0gMSkKLQkJCQkmJiBvICE9IGNwUm9vdCAmJiBvICE9IGRwUm9vdCApIHsKLQkJCW1vdmVQcm9jZXNzQ29tcG9uZW50KChQcm9jZXNzUGFja2FnZSkgbywgY29udGFpbmVyKTsKLQkJfSBlbHNlIHsKLQkJCWNvbnRhaW5lci5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKHBrZyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBmaW5kIHRoZSByb290IGN1c3RvbSBjYWdlZ29yeSBhbmQgcHV0IHRvIHRoZSByb290IHBhY2thZ2UKLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBNZXRob2RQbHVnaW4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZml4Q3VzdG9tQ2F0ZWdvcmllcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KHBrZy5nZXRDb250ZW50RWxlbWVudHMoKSk7Ci0KLQkJTGlzdCByb290SXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlDdXN0b21DYXRlZ29yeSBjYyA9IChDdXN0b21DYXRlZ29yeSkgaXRlbXMucmVtb3ZlKDApOwotCQkJcm9vdEl0ZW1zLmFkZChjYyk7Ci0JCQkKLQkJCS8vIDE1ODY5MUN1c3RvbSBDYXRlZ29yeSBpcyBkaWZmZXJlbnQgaW4gZXhwb3J0ZWQgbGlicmFyeQotCQkJLy8gbmVlZCB0byByZW1vdmUgc3ViLWNhdGVnb3JpZXMgcmVjdXJzaXZlbHkKLQkJCWZpeEN1c3RvbUNhdGVnb3JpZXMoY2MsIGl0ZW1zLCByb290SXRlbXMpOwotCQl9Ci0KLQkJVG5nVXRpbC5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkocGx1Z2luKS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuYWRkQWxsKAotCQkJCXJvb3RJdGVtcyk7Ci0KLQl9Ci0JCi0JLyoqCi0JICogZmluZCB0aGUgcm9vdCBjdXN0b20gY2F0ZWdvcmllcyBieSByZW1vdmluZyB0aGUgc3ViLWNhdGVnb3JpZXMgcmVjdXJzaXZlbHkKLQkgKiAKLQkgKiBAcGFyYW0gY2MKLQkgKiBAcGFyYW0gaXRlbXMKLQkgKiBAcGFyYW0gcm9vdEl0ZW1zCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpeEN1c3RvbUNhdGVnb3JpZXMoQ3VzdG9tQ2F0ZWdvcnkgY2MsIExpc3QgaXRlbXMsIExpc3Qgcm9vdEl0ZW1zKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBjYy5nZXRTdWJDYXRlZ29yaWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0ZW0gPSBpdC5uZXh0KCk7Ci0JCQlpdGVtcy5yZW1vdmUoaXRlbSk7Ci0JCQlyb290SXRlbXMucmVtb3ZlKGl0ZW0pOwotCQkJZml4Q3VzdG9tQ2F0ZWdvcmllcygoQ3VzdG9tQ2F0ZWdvcnkpaXRlbSwgaXRlbXMsIHJvb3RJdGVtcyk7Ci0JCX0KLQkJCi0JCS8vIGFsc28gaXRlcmF0ZSB0aGUgY29udGFpbmVkIGVsZW1lbnRzCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBjYy5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0ZW0gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJaXRlbXMucmVtb3ZlKGl0ZW0pOwotCQkJCXJvb3RJdGVtcy5yZW1vdmUoaXRlbSk7Ci0JCQkJZml4Q3VzdG9tQ2F0ZWdvcmllcygoQ3VzdG9tQ2F0ZWdvcnkpaXRlbSwgaXRlbXMsIHJvb3RJdGVtcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogZGVsZXRlIHRoZSB1bi1uZWVkZWQgZWxlbWVudHMgYXJlIGNsZWFyIHJlc291cmNlcyAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVFbGVtZW50cygpIHsKLQkJCi0JCUlGaWxlTWFuYWdlciBmaWxlTWdyID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKTsKLQotCQlMaXN0IGRlbGV0ZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50c01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWl0Lm5leHQoKTsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpZW50cnkuZ2V0S2V5KCk7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCllbnRyeS5nZXRWYWx1ZSgpOwotCQkJaWYgKCBzb3VyY2VFbGVtZW50SURzLmNvbnRhaW5zKGlkKSApIHsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSBpZiAob3ZlcndyaXRlKSB7Ci0JCQkJYm9vbGVhbiB0b0RlbGV0ZSA9ICEoZSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkgfHwgZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbgotCQkJCQkJCQkJfHwgZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJCWlmICh0b0RlbGV0ZSkgewotCQkJCQlNZXRob2RFbGVtZW50IHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpOwotCQkJCQl0b0RlbGV0ZSA9IHBsdWdpbiAhPSBudWxsICYmICFpc05ld0VsZW1lbnQocGx1Z2luLmdldEd1aWQoKSkKLQkJCQkJJiYgc291cmNlRWxlbWVudElEcy5jb250YWlucyhwbHVnaW4uZ2V0R3VpZCgpKTsKLQkJCQl9Ci0JCQkJaWYgKHRvRGVsZXRlKSB7Ci0JCQkJCWRlbGV0ZWRFbGVtZW50cy5hZGQoZSk7Ci0JCQkJCWhhbmRsZUFjdGl2aXR5UmVtb3ZhbChlKTsKLQkJCQkJLy9FY29yZVV0aWwucmVtb3ZlKGUpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmICggKGUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgJiYgVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSggKEN1c3RvbUNhdGVnb3J5KWUgKSApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWhhbmRsZUFjdGl2aXR5UmVtb3ZhbChlKTsJCi0JCQkKLQkJCS8vIGRlbGV0ZSB0aGUgZWxlbWVudCBpZiB0aGUgY29udGFpbmcgcGFja2FnZSBpcyBpbiB0aGUgc291cmNlIGxpYnJhcnkKLQkJCS8vIGRvbid0IGRlbGV0ZSBpZiB0aGUgcGFja2FnZSBpcyBub3QgaW4gdGhlIHhtbCBsaWJyYXJ5Ci0JCQlNZXRob2RQYWNrYWdlIHBrZyA9IFRuZ1V0aWwuZ2V0TWV0aG9kUGFja2FnZShlKTsKLQkJCQotCQkJaWYgKCBwa2cgIT0gbnVsbCApIHsgCi0JCQkJU3RyaW5nIHBpZCA9IHBrZy5nZXRHdWlkKCk7Ci0JCQkJaWYgKCBzb3VyY2VFbGVtZW50SURzLmNvbnRhaW5zKHBpZCkgKSB7Ci0JCQkJCWRlbGV0ZWRFbGVtZW50cy5hZGQoZSk7Ci0JCQkJCQotCQkJCQkvLyBkZWxldGUgdGhlIGVsZW1lbnQgZnJvbSB0aGUgbGlicmFyeQotCQkJCQkvL0Vjb3JlVXRpbC5yZW1vdmUoZSk7CQkJCQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gZGVsZXRlIHRoZSByZXNvdXJjZXMKLQkJZGVsZXRlUmVzb3J1Y2VzKGRlbGV0ZWRFbGVtZW50cyk7Ci0JfQotCi0JLy8JMTY0NTgxCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUFjdGl2aXR5UmVtb3ZhbChNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKCEoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUFjdGl2aXR5IGVhY3QgPSAoQWN0aXZpdHkpIGU7Ci0JCUFjdGl2aXR5IHNhY3QgPSBlYWN0LmdldFN1cGVyQWN0aXZpdGllcygpOwotCQlpZiAoc2FjdCAhPSBudWxsKSB7Ci0JCQlzYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlKGVhY3QpOwotCQl9Ci0JfQotCQotCS8vIGNsZWFyIHJlc291cmNlcyBmb3IgZGVsZXRlZCBlbGVtZW50cwotCXByaXZhdGUgdm9pZCBkZWxldGVSZXNvcnVjZXMoTGlzdCBkZWxldGVkRWxlbWVudHMpIHsKLQkJaWYgKCBkZWxldGVkRWxlbWVudHMuc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlGaWxlTWFuYWdlciBmaWxlTWdyID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGVsZXRlZEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0JCQkKLQkJCUVPYmplY3Qgb2JqID0gbnVsbDsKLQkJCWlmICggZSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCApIHsKLQkJCQlvYmogPSAoKERlc2NyaWJhYmxlRWxlbWVudCllKS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCX0gZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gfHwKLQkJCQkJb3ZlcndyaXRlICYmIGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJb2JqID0gZTsKLQkJCX0KLQkJCWlmICggb2JqICE9IG51bGwgKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJCQlSZXNvdXJjZSBwbHVnaW5SZXMgPSBwbHVnaW4gPT0gbnVsbCA/IG51bGwgOiBwbHVnaW4uZVJlc291cmNlKCk7Ci0JCQkJCi0JCQkJUmVzb3VyY2UgcmVzID0gb2JqLmVSZXNvdXJjZSgpOwotCQkJCWlmICggcmVzICE9IG51bGwgJiYgcmVzICE9IHBsdWdpblJlcykgewkJLy9Qcm90ZWN0ZWQgZnJvbSBidWdzIGxpa2UgMTc3MDQyCi0JCQkJCVN0cmluZyBmaWxlID0gcmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJkZWxldGluZyByZXNvdXJjZTogIiArIGZpbGUpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoICFmaWxlTWdyLmRlbGV0ZShmaWxlKSApIHsKLQkJCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmFibGUgdG8gZGVsZXRlIGZpbGU6ICIgKyBmaWxlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJRU9iamVjdCByZXNNZ3IgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZU1hbmFnZXIocmVzKTsKLQkJCQkJaWYgKHJlc01nciAhPSBudWxsKSB7Ci0JCQkJCQlFY29yZVV0aWwucmVtb3ZlKHJlc01ncik7Ci0JCQkJCX0KLQkJCQkJRU9iamVjdCByZXNEZXMgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZURlc2NyaXB0b3IocmVzKTsKLQkJCQkJaWYgKHJlc0RlcyAhPSBudWxsKSB7Ci0JCQkJCQlFY29yZVV0aWwucmVtb3ZlKHJlc0Rlcyk7Ci0JCQkJCX0KLQkJCQkJaWYgKG92ZXJ3cml0ZSkgewkJCQkJCQotCQkJCQkJRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShmaWxlKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCQlGaWxlIGZpbGVzW10gPSBmb2xkZXIubGlzdEZpbGVzKCk7Ci0JCQkJCQlpZiAoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5sZW5ndGggPT0gMCApIHsKLQkJCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImRlbGV0aW5nIGZvbGRlciByZXNvdXJjZTogIiArIGZvbGRlcik7Ci0JCQkJCQkJfQotCQkJCQkJCWlmICggIWZpbGVNZ3IuZGVsZXRlKGZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSkgKSB7Ci0JCQkJCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuYWJsZSB0byBkZWxldGUgZm9sZGVyIGZpbGU6ICIgKyBmb2xkZXIpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQkJCQkJCQkJCi0JCQl9Ci0JCQkKLQkJCUVjb3JlVXRpbC5yZW1vdmUoZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGd1aWQKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnQgZ2l2ZW4gYnkgZ3VpZCBpcyBuZXcuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXdFbGVtZW50KFN0cmluZyBndWlkKSB7Ci0JCXJldHVybiBuZXdFbGVtZW50c01hcC5jb250YWluc0tleShndWlkKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NzliMTY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGFuZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEltcG9ydCBYTUwgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC93aXphcmRzL0ltcG9ydFhNTFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvd2l6YXJkcy9JbXBvcnRYTUxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjQ0YjUzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC93aXphcmRzL0ltcG9ydFhNTFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TYXZlQWxsRWRpdG9yc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLkltcG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5JbXBvcnRYTUxSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwucHJlZmVyZW5jZXMuSW1wb3J0WE1MUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuc2VydmljZXMuSW1wb3J0WE1MU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLkxpYnJhcnlCYWNrdXBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIFRoZSBJbXBvcnQgWE1MIHdpemFyZC4KLSAqIDxwPgotICogVGhpcyB3aXphcmQgaXMgdXNlZCB0byBpbXBvcnQgbWV0aG9kIGxpYnJhcnkgY29udGVudCBzdG9yZWQgaW4gYSBYTUwgZmlsZS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0WE1MV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7Ci0KLQlJbXBvcnRYTUxTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgSW1wb3J0WE1MU2VydmljZSgpOwotCi0JcHJpdmF0ZSBib29sZWFuIHN1Y2NlZWQgPSB0cnVlOwotCQotCXByaXZhdGUgU2VsZWN0WE1MRmlsZVBhZ2UgZmlsZVBhZ2UgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSW1wb3J0WE1MV2l6YXJkKCkgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZShJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MV2l6YXJkX3RpdGxlKTsKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCS8vIGNoZWNrIG91dCB0aGUgbGlicmFyeSBmaXJzdAotCQlJRmlsZU1hbmFnZXIgZmlsZU1nciA9IFNlcnZpY2VzLmdldEZpbGVNYW5hZ2VyKCk7Ci0JCWZpbGVNZ3IuY2hlY2tNb2RpZnkoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpLAotCQkJCU1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSk7Ci0KLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsICYmIG1hbmFnZXIuaXNNZXRob2RMaWJyYXJ5UmVhZE9ubHkoKSkgewotCQkJRmlsZSBsaWJyYXJ5RmlsZSA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpLAotCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0xJQlJBUllfTU9ERUxfRklMRU5BTUUpOwotCQkJSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxXaXphcmRfdGl0bGUsCi0JCQkJCUltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxFcnJvcl9tc2csCi0JCQkJCU5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxFcnJvcl9yZWFzb24sCi0JCQkJCQkJbGlicmFyeUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVNhdmVBbGxFZGl0b3JzUGFnZS5hZGRQYWdlSWZOZWVkZWQodGhpcywgdHJ1ZSwgbnVsbCwgbnVsbCwgSW1wb3J0WE1MUGx1Z2luCi0JCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC93aXpiYW4vSW1wb3J0WE1MLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJZmlsZVBhZ2UgPSBuZXcgU2VsZWN0WE1MRmlsZVBhZ2UoKTsKLQkJYWRkUGFnZShmaWxlUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkiZnVsbC9vYmoxNi9YTUxGaWxlLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJYm9vbGVhbiByZWZyZXNoID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmlzRW5hYmxlZCgpOwotCQlpZiAocmVmcmVzaCkgewotCQkJLy9OZWVkZWQ6IGJlY2F1c2UgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgYWRkcyBldmVudHMgdG8gUmVmcmVzaEpvYiBhdCB0aGUKLQkJCS8vZW5kIG9mICJydW4iIGNhbGwhCi0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0JCQotCQlmaW5hbCBib29sZWFuIHJldFtdID0gbmV3IGJvb2xlYW5bMV07CQkKLQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJcmV0WzBdID0gcGVyZm9ybUZpbmlzaF8oKTsKLQkJCX0JCQkKLQkJfSk7Ci0JCWlmIChyZWZyZXNoKSB7CQkKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0JCQotCQkKLQkJcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5yZXZpZXdfbG9nX2ZpbGVzLAotCQkJCQkJc2VydmljZS5nZXRMb2dQYXRoKCkpOwotCQkJCQlNc2dCb3gucHJvbXB0KG1zZywgU1dULk9LKTsKLQkJCX0JCQkKLQkJfSk7CQkKLQkJCi0JCVJlc291cmNlVXRpbC5yZWZyZXNoUmVzb3VyY2VzKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQlyZXR1cm4gcmV0WzBdOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBwZXJmb3JtRmluaXNoXygpIHsKLQkJTGlicmFyeUJhY2t1cFV0aWwucHJvbXB0QmFja3VwTGlicmFyeShudWxsLCBuZXcgRmlsZShMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpKSk7Ci0KLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLmJlZ2luVGFzayhJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0aW5nWE1MX3RleHQsCi0JCQkJCQkJSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQotCQkJCQlTdHJpbmcgeG1sRmlsZSA9IGZpbGVQYWdlLmdldFBhdGgoKTsKLQkJCQkJYm9vbGVhbiBtZXJnZU9wdGlvbiA9IGZpbGVQYWdlLmdldE1lcmdlT3B0aW9uKCk7Ci0JCQkJCXNlcnZpY2Uuc2V0T3ZlcndyaXRlKCFtZXJnZU9wdGlvbik7Ci0JCQkJCXN1Y2NlZWQgPSBzZXJ2aWNlLmxvYWRYbWwoeG1sRmlsZSk7Ci0JCQkJCWlmICghIHN1Y2NlZWQpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQkJCQkJCi0JCQkJCXNlcnZpY2UuZG9JbXBvcnQobW9uaXRvcik7Ci0JCQkJCUltcG9ydFhNTFByZWZlcmVuY2VzLnNldFhNTEZpbGUoeG1sRmlsZSk7Ci0JCQkJCUltcG9ydFhNTFByZWZlcmVuY2VzLnNldE1lcmdlT3B0aW9uKG1lcmdlT3B0aW9uKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCBmYWxzZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxXaXphcmRfdGl0bGUsCi0JCQkJCXJlYWxFeGNlcHRpb24uZ2V0TWVzc2FnZSgpLCByZWFsRXhjZXB0aW9uKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICghc3VjY2VlZCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vU3RyaW5nIG1zZyA9IE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5yZXZpZXdfbG9nX2ZpbGVzLAotCQkvLwlzZXJ2aWNlLmdldExvZ1BhdGgoKSk7Ci0JCS8vTXNnQm94LnByb21wdChtc2csIFNXVC5PSyk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgdGhpcyB3aXphcmQgYW5kIGZyZWVzIGFsbCBTV1QgcmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXNlcnZpY2UuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3dpemFyZHMvU2VsZWN0WE1MRmlsZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3dpemFyZHMvU2VsZWN0WE1MRmlsZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDgwZDc0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC93aXphcmRzL1NlbGVjdFhNTEZpbGVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLkltcG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5JbXBvcnRYTUxSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwucHJlZmVyZW5jZXMuSW1wb3J0WE1MUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBYTUwgZmlsZSB0byBpbXBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdFhNTEZpbGVQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0WE1MRmlsZVBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBUZXh0IHBhdGhUZXh0OwotCi0JcHJpdmF0ZSBTdHJpbmcgcGF0aDsKLQotCXByaXZhdGUgYm9vbGVhbiBtZXJnZU9wdGlvbiA9IHRydWU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RYTUxGaWxlUGFnZSgpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoSW1wb3J0WE1MUmVzb3VyY2VzLnNlbGVjdFhNTEZpbGVQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oSW1wb3J0WE1MUmVzb3VyY2VzLnNlbGVjdFhNTEZpbGVQYWdlX2Rlc2MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL0ltcG9ydFhNTC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBmaWxlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWZpbGVMYWJlbC5zZXRUZXh0KEltcG9ydFhNTFJlc291cmNlcy5maWxlTGFiZWxfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQotCQlwYXRoVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXBhdGhUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlwYXRoVGV4dC5zZXRUZXh0KEltcG9ydFhNTFByZWZlcmVuY2VzLmdldFhNTEZpbGUoKSk7CQkKLQkJcGF0aFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKGlzVmFsaWRQYXRoKHBhdGhUZXh0LmdldFRleHQoKS50cmltKCkpKSB7Ci0JCQkJCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShJbXBvcnRYTUxSZXNvdXJjZXMuaW52YWxpZFhNTEZpbGVfZXJyb3IpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQpKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoSW1wb3J0WE1MUmVzb3VyY2VzLmJyb3dzZUJ1dHRvbl90ZXh0KTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUZpbGVEaWFsb2cgZmQgPSBuZXcgRmlsZURpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJLmdldEFjdGl2ZVNoZWxsKCksIFNXVC5PUEVOKTsKLQkJCQlmZC5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqLnhtbCIsICIqLioiIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTdHJpbmcgcGF0aCA9IGZkLm9wZW4oKTsKLQkJCQlib29sZWFuIG9rID0gZmFsc2U7Ci0JCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCQlwYXRoVGV4dC5zZXRUZXh0KHBhdGgpOwotCQkJCQlvayA9IGlzVmFsaWRQYXRoKHBhdGgpOwotCQkJCX0KLQkJCQlzZXRQYWdlQ29tcGxldGUob2spOwotCQkJfQotCQl9KTsKLQotCQlHcm91cCBvcHRpb25Hcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJb3B0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJb3B0aW9uR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCW9wdGlvbkdyb3VwLnNldFRleHQoSW1wb3J0WE1MUmVzb3VyY2VzLm9wdGlvbkdyb3VwX3RleHQpOwotCi0JCW1lcmdlT3B0aW9uID0gSW1wb3J0WE1MUHJlZmVyZW5jZXMuZ2V0TWVyZ2VPcHRpb24oKTsKLQkJCQotCQlCdXR0b24gb3ZlcndyaXRlUmFkaW9CdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihvcHRpb25Hcm91cCwKLQkJCQlJbXBvcnRYTUxSZXNvdXJjZXMub3ZlcndyaXRlUmFkaW9CdXR0b25fdGV4dCwgMSwgIW1lcmdlT3B0aW9uKTsKLQkJb3ZlcndyaXRlUmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbWVyZ2VPcHRpb24gPSBmYWxzZTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlCdXR0b24gbWVyZ2VSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKG9wdGlvbkdyb3VwLAotCQkJCUltcG9ydFhNTFJlc291cmNlcy5tZXJnZVJhZGlvQnV0dG9uX3RleHQsIDEsIG1lcmdlT3B0aW9uKTsKLQkJbWVyZ2VSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQltZXJnZU9wdGlvbiA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQlzZXRQYWdlQ29tcGxldGUoaXNWYWxpZFBhdGgocGF0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKSkpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSB1c2VyIHNwZWNpZmljIHBhdGggaXMgdmFsaWQuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRoZSB1c2VyIHNwZWNpZmljIHBhdGgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIHNwZWNpZmllZCBwYXRoIGlzIHZhbGlkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUGF0aChTdHJpbmcgcGF0aCkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJaWYgKGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5pc0ZpbGUoKSkgewotCQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBYTUwgZmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIFhNTCBmaWxlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBpbXBvcnQgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgc2VsZWN0ZWQgdGhlIG1lcmdlIG9wdGlvbiwKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgdXNlciBzZWxlY3RlZCB0aGUgb3ZlcndyaXRlIG9wdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldE1lcmdlT3B0aW9uKCkgewotCQlyZXR1cm4gbWVyZ2VPcHRpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC93aXphcmRzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3dpemFyZHMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiOGVlNjIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3dpemFyZHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgd2l6YXJkcyBmb3IgaW1wb3J0aW5nIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgc3RvcmVkIGluIFhNTC4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Ly5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Ly5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Ly5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiM2VjZDk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgSW1wb3J0IHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5pbXBvcnQvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Ly5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZjQ0MTUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5pbXBvcnQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNTEyN2IzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0OyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZywKLSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkcwotUmVxdWlyZS1CdW5kbGU6IG9yZy5hcGFjaGUuYW50LAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2Yzc4MGNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9BdXRob3JpbmcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL0F1dGhvcmluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUzMWJhZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL0F1dGhvcmluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvSW1wb3J0aW5nLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9JbXBvcnRpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOTYzOTRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9JbXBvcnRpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL01ldGhvZFBsdWdpbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvTWV0aG9kUGx1Z2luLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmI4MmMzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvTWV0aG9kUGx1Z2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9jb25maWd1cmF0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9jb25maWd1cmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU4OTYwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvY29uZmlndXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvZnVsbC93aXpiYW4vSW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL2Z1bGwvd2l6YmFuL0ltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI0OTgzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvZnVsbC93aXpiYW4vSW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL2Z1bGwvd2l6YmFuL0ltcG9ydE1ldGhvZFBsdWdpbnMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL2Z1bGwvd2l6YmFuL0ltcG9ydE1ldGhvZFBsdWdpbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjQ5ODMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9mdWxsL3dpemJhbi9JbXBvcnRNZXRob2RQbHVnaW5zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA0ZWVlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIEltcG9ydAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgSW1wb3J0IFdpemFyZCBDYXRlZ29yeQotaW1wb3J0Q2F0ZWdvcnlOYW1lPU1ldGhvZAotCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkCi1pbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZE5hbWU9TGlicmFyeSBDb25maWd1cmF0aW9uCi1pbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZFRleHQ9SW1wb3J0IGEgbGlicmFyeSBjb25maWd1cmF0aW9uLgotCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkTmFtZT1NZXRob2QgUGx1Zy1pbnMKLWltcG9ydE1ldGhvZFBsdWdpbnNXaXphcmRUZXh0PUltcG9ydCBvbmUgb3IgbW9yZSBtZXRob2QgcGx1Zy1pbnMuCi0KLQotCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwODYxZWJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pbXBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkuaW1wb3J0V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHMuSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCIKLSAgICAgICAgICAgIGljb249Ii9pY29ucy9jb25maWd1cmF0aW9uLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHMuSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVpbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPiAKLSAgICAgICAgICAgICAgICVpbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZFRleHQKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkuaW1wb3J0V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHMuSW1wb3J0UGx1Z2luV2l6YXJkIgotICAgICAgICAgICAgaWNvbj0iL2ljb25zL01ldGhvZFBsdWdpbi5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzLkltcG9ydFBsdWdpbldpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVpbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkTmFtZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAlaW1wb3J0TWV0aG9kUGx1Z2luc1dpemFyZFRleHQKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLnVpLmltcG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzLkltcG9ydFBsdWdpbldpemFyZCIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYudWkuaW1wb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkIGlkPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHMuSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCIvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL0ltcG9ydFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL0ltcG9ydFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOWIyYjUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9JbXBvcnRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi0vKioKLSAqIFRoZSBJbXBvcnQgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgSW1wb3J0UGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEltcG9ydFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbXBvcnRQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9JbXBvcnRSZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9JbXBvcnRSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmE4NmZhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvSW1wb3J0UmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSW1wb3J0UmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLlJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbXBvcnRSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFBsdWdpbnNXaXphcmRfRVJSX0ltcG9ydF9wbHVnaW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfRVJSX0ltcG9ydF9jb25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydENvbmZpZ1JlcG9ydFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0UGx1Z2luV2l6YXJkX3JlYWRvbmx5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydFBsdWdpbldpemFyZF9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydFBsdWdpbldpemFyZF9lcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9leGlzdGluZ19wbHVnaW5zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydFBsdWdpbldpemFyZF9jb25maXJtX2NvbnRpbnVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydFBsdWdpbldpemFyZF93YXJuX2NpcmN1bGFyX3BsdWdpbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0Q29uZmlnc1RvSW1wb3J0X2xhYmVsMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfTVNHMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV90aXRsZTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vdF91c2VkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19wYXRoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19kaXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3BsdWdpbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfdmVyc2lvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX3JlYWRvbmx5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0czOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlmZlJlcG9ydFZpZXdlcl9jb250ZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpZmZSZXBvcnRWaWV3ZXJfaW5faW1wb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFBsdWdpbnNUb0ltcG9ydF9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpZmZSZXBvcnRMYWJlbFByb3ZpZGVyX3llczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RQbHVnaW5zVG9JbXBvcnRfZXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlmZlJlcG9ydFZpZXdlcl9pbl9saWI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlmZlJlcG9ydFZpZXdlcl9zdGF0dXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5FeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5Ob3RFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY05vU2VsZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNEYXRhTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGFiZWxfY29uZmlnczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19wYXRoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5Ob1NlbGVjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX2RpcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9yZWFkb25seTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9sb2NrZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9lcnJvcl9ub3RfdXBkYXRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5EYXRhTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlmZlJlcG9ydFZpZXdlcl90eXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaF9vbGREYXRhOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbk1pc21hdGNoX29sZFRvb2w7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbk1pc21hdGNoX29sZFRvb2xfdW5rbm93bjsKLQkKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEltcG9ydFJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWU3ODIxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIwotIyBNZXNzYWdlIElEIFJhbmdlOiBJVVBFMDIwMEUgLSBJVVBFMDI5OUUKLSMKLQotIyBJbXBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZAotaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlPUltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24KLXNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGl0bGU9U3BlY2lmeSBpbXBvcnQgZGlyZWN0b3J5Ci1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RleHQ9U3BlY2lmeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGxpYnJhcnkgY29uZmlndXJhdGlvbiB0byBpbXBvcnQuCi1yZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90aXRsZT1SZXZpZXcgbGlicmFyeSBjaGFuZ2VzCi1yZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90ZXh0PVJldmlldyB0aGUgY2hhbmdlcyB0aGF0IHdpbGwgYmUgbWFkZSB0byB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLXNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90aXRsZT1TZWxlY3QgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucwotc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RleHQ9U2VsZWN0IG9uZSBvciBtb3JlIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbnMgdG8gaW1wb3J0LgotCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkCi1pbXBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlPUltcG9ydCBNZXRob2QgUGx1Zy1pbnMKLXNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RpdGxlPVNwZWNpZnkgaW1wb3J0IGRpcmVjdG9yeQotc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGV4dD1TcGVjaWZ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgbWV0aG9kIHBsdWctaW5zIHRvIGltcG9ydC4KLXNlbGVjdFBsdWdpbnNXaXphcmRQYWdlX3RpdGxlPVNlbGVjdCBtZXRob2QgcGx1Zy1pbnMKLXNlbGVjdFBsdWdpbnNXaXphcmRQYWdlX3RleHQ9U2VsZWN0IG9uZSBvciBtb3JlIG1ldGhvZCBwbHVnLWlucyB0byBpbXBvcnQuIElmIGEgc2VsZWN0ZWQgcGx1Zy1uIGFscmVhZHkgZXhpc3RzIGluIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LCB2ZXJpZnkgdGhlIHZlcnNpb24gZGlmZmVyZW5jZXMuCi1pbXBvcnRQbHVnaW5zV2l6YXJkX0VSUl9JbXBvcnRfcGx1Z2luPUltcG9ydCBwbHVnaW4gZmFpbGVkCi0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzA9VmFsaWRhdGluZyBzZWxlY3RlZCBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uLi4KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzE9VGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGNvbmZpZ3VyYXRpb24uCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0czPUltcG9ydGluZyBtZXRob2QgY29uZmlndXJhdGlvbi4uLgotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMj1DYW5ub3QgaW1wb3J0IHRoZSBjdXJyZW50bHkgb3BlbmVkIGxpYnJhcnkgaW50byBpdHNlbGYuCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX01TRzE9SW1wb3J0aW5nIG1ldGhvZCBjb25maWd1cmF0aW9uLi4uCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX0VSUl9JbXBvcnRfY29uZmlndXJhdGlvbj1JbXBvcnQgY29uZmlndXJhdGlvbiBmYWlsZWQKLQotRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX3RpdGxlPUNoZWNrb3V0IGZhaWxlZAotRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX21zZz1Tb21lIGZpbGVzIGFyZSBub3QgY2hlY2tlZCBvdXQsIGRvIHlvdSB3YW50IHRvIHRyeSBhZ2Fpbj8KLQotSW1wb3J0Q29uZmlnUmVwb3J0UGFnZV90aXRsZT1JbXBvcnRpbmcgQ29uZmlndXJhdGlvbiBSZXBvcnQKLUltcG9ydFBsdWdpbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUU6IExpYnJhcnkgaXMgcmVhZC1vbmx5LgotSW1wb3J0UGx1Z2luV2l6YXJkX01TRzE9SW1wb3J0aW5nIG1ldGhvZCBwbHVnLWluLi4uCi1JbXBvcnRQbHVnaW5XaXphcmRfZXJyb3I9RXJyb3IKLUltcG9ydFBsdWdpbldpemFyZF93YXJuX2V4aXN0aW5nX3BsdWdpbnM9SVVQRTAyMDBFOiBUaGUgZm9sbG93aW5nIHNlbGVjdGVkIHBsdWdpbihzKSBhbHJlYWR5IGV4aXN0IGFuZCByZS1pbXBvcnRpbmcgdGhlIHNhbWUgcGx1Z2luKHMpIHdpbGwgb3ZlcndyaXRlIHRoZSBleGlzdGluZyBvbmUocyk6XG5cbiB7MH0gXG5cbkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjb250aW51ZT8KLUltcG9ydFBsdWdpbldpemFyZF9jb25maXJtX2NvbnRpbnVlPVxuXG5BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/Ci1JbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9jaXJjdWxhcl9wbHVnaW5zPUNpcmN1bGFyIHJlZmVyZW5jZXMgZGV0ZWN0ZWQgYW1vbmcgdGhlIGZvbGxvd2luZyBwbHVnaW5zCi0KLVNlbGVjdENvbmZpZ3NUb0ltcG9ydF9sYWJlbDE9VGhlIGZvbGxvd2luZyBlbGVtZW50cyB3aWxsIGJlIGltcG9ydGVkOgotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9lcnJvcj1FcnJvcgotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9NU0cxPUFuYWx5emluZwotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfdGl0bGUyPVNlbGVjdCBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb25zIHRvIGltcG9ydAotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vdF91c2VkPW5vdF91c2VkCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fcGF0aD1UaGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4KLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19kaXI9Tm8gZGlyZWN0b3J5IHNwZWNpZmllZAotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3BsdWdpbnM9QXZhaWxhYmxlIHBsdWctaW5zIGluIHRoZSBpbXBvcnQgZGlyZWN0b3J5OgotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvcj1BdXRob3I6Ci1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfdmVyc2lvbj1WZXJzaW9uOgotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2Rlc2M9QnJpZWYgZGVzY3JpcHRpb246Ci1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX3JlYWRvbmx5PUlVUEUwMjAxRTogTGlicmFyeSBpcyByZWFkLW9ubHkuCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzA9VmFsaWRhdGluZyBzZWxlY3RlZCBwbHVnLWlucy4uLgotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cxPVRoZSBzcGVjaWZpZWQgcGF0aCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgbWV0aG9kIHBsdWctaW4uCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzM9SW1wb3J0aW5nIG1ldGhvZCBwbHVnLWluLi4uCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzU9VGhlIHNlbGVjdGVkIG1ldGhvZCBwbHVnLWluIGNhbm5vdCBiZSBpbXBvcnRlZC4gSXRzIGRlcGVuZGVudCBwbHVnLWluICcnezB9JycgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c2PVRoZSBzZWxlY3RlZCBtZXRob2QgcGx1Zy1pbiBjYW5ub3QgYmUgaW1wb3J0ZWQuIEEgZGVwZW5kZW50IHBsdWctaW4gY2Fubm90IGJlIGZvdW5kIGluIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotRGlmZlJlcG9ydFZpZXdlcl9jb250ZW50PUNvbnRlbnQKLURpZmZSZXBvcnRWaWV3ZXJfaW5faW1wb3J0PUluIEltcG9ydAotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X01TRzE9QW5hbHl6aW5nIGZpbGVzLi4uCi1EaWZmUmVwb3J0TGFiZWxQcm92aWRlcl95ZXM9WWVzCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfZXJyb3I9RXJyb3IKLURpZmZSZXBvcnRWaWV3ZXJfaW5fbGliPUluIExpYnJhcnkKLURpZmZSZXBvcnRWaWV3ZXJfc3RhdHVzPVN0YXR1cwotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5FeGlzdHM9U2VsZWN0ZWQgcGx1Zy1pbiBmb3VuZCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5Ci1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGlicmFyeVBsdWdpbk5vdEV4aXN0cz1TZWxlY3RlZCBwbHVnLWluIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5Ci1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9saWJyYXJ5Q29uZmlnU3BlY0V4aXN0cz1Db25maWd1cmF0aW9uIGZvdW5kIGluIHRoZSBjdXJyZW50IGxpYnJhcnkKLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNOb1NlbGVjdGlvbj1ObyBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb24gc2VsZWN0ZWQuCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjRGF0YUxhYmVsPVNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGltcG9ydCBkaXJlY3RvcnkKLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2NvbmZpZ3M9QXZhaWxhYmxlIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbnMgaW4gdGhlIGltcG9ydCBkaXJlY3Rvcnk6Ci1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkPW5vdF91c2VkCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9kZXNjPUJyaWVmIGRlc2NyaXB0aW9uOgotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19wYXRoPVRoZSBzcGVjaWZpZWQgcGF0aCBkb2VzIG5vdCBleGlzdC4KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5Ob1NlbGVjdGlvbj1ObyBwbHVnLWluIHNlbGVjdGVkLgotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19kaXI9Tm8gZGlyZWN0b3J5IHNwZWNpZmllZAotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fcmVhZG9ubHk9UGx1Z2luIHswfSBpcyByZWFkb25seVxuCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9sb2NrZWQ9SVVQRTAyMDNFOiBQbHVnaW4gezB9IGlzIGxvY2tlZFxuCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX2Vycm9yX25vdF91cGRhdGFibGU9U29tZSBvZiB0aGUgcGx1Z2luKHMpIGluIHRoZSBsaWJyYXJ5IGFyZSBlaXRoZXIgbG9ja2VkIG9yIHJlYWRvbmx5LlxuIFBsZWFzZSB1bmxvY2sgdGhlIHBsdWdpbnMgYW5kIG1ha2Ugc3VyZSB0aGUgZmlsZXMgYXJlIHVwZGF0YWJsZS4KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5EYXRhTGFiZWw9U2VsZWN0ZWQgcGx1Zy1pbiBpbiB0aGUgaW1wb3J0IGRpcmVjdG9yeQotRGlmZlJlcG9ydFZpZXdlcl90eXBlPUNvbnRlbnQgVHlwZQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNOb3RFeGlzdHM9U2VsZWN0ZWQgY29uZmlndXJhdGlvbiBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgbGlicmFyeS4KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUEUwMjA0RTogVGhlIHNwZWNpZmllZCBmaWxlcyB3ZXJlIGV4cG9ydGVkIGJ5IGEgcHJldmlvdXMgdmVyc2lvbiAoezB9KSBvZiB7MX0uIFRoZSBmaWxlcyBtdXN0IGJlIGV4cG9ydGVkIHVzaW5nIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgezF9LgotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBFMDIwNUU6IFRoZSBzcGVjaWZpZWQgZmlsZXMgd2VyZSBleHBvcnRlZCBieSBhIHByZXZpb3VzIHZlcnNpb24gb2YgezB9LiBUaGUgZmlsZXMgbXVzdCBiZSBleHBvcnRlZCB1c2luZyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHswfS4KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUEUwMjA2RTogVGhlIHNwZWNpZmllZCBmaWxlcyB3ZXJlIGV4cG9ydGVkIGJ5IGEgbmV3ZXIgdmVyc2lvbiAoezB9KSBvZiB7MX0uIFlvdSBtdXN0IHVwZ3JhZGUgezF9IGluIG9yZGVyIHRvIGltcG9ydCB0aGUgZmlsZXMuICAKLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQRTAyMDdFOiBUaGUgc3BlY2lmaWVkIGZpbGVzIGNhbm5vdCBiZSBvcGVuZWQuIFlvdSBtdXN0IHVwZ3JhZGUgezB9IGluIG9yZGVyIHRvIGltcG9ydCB0aGUgZmlsZXMuICAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNmI5MDMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgYWN0aXZhdG9yIGZvciBtYW5hZ2luZyB0aGUgSW1wb3J0IHBsdWctaW4ncyBsaWZlIGN5Y2xlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWdTcGVjcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ1NwZWNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4OTY5NzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ1NwZWNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25TcGVjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotCi0vKioKLSAqIE1vZGVscyBhIGxpc3Qgb2YgbGlicmFyeSBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb25zLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnU3BlY3MgewotCi0JLy8gQSBsaXN0IG9mIGNvbmZpZ3VyYXRpb24gZW50cmllcy4KLQlwdWJsaWMgTGlzdCBjb25maWdzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlnU3BlY3MoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBlbnRyeS4KLQkgKi8KLQlwdWJsaWMgRW50cnkgbmV3RW50cnkoKSB7Ci0JCUVudHJ5IGUgPSBuZXcgRW50cnkoKTsKLQkJY29uZmlncy5hZGQoZSk7Ci0KLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGl0ZXJhdG9yIGZvciB0aGUgY29uZmlnIHNwZWNzLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIGNvbmZpZ3MuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgRW50cnkgewotCi0JCXB1YmxpYyBDb25maWd1cmF0aW9uU3BlYyBjb25maWdTcGVjID0gbnVsbDsKLQotCQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBleGlzdGluZ0NvbmZpZyA9IG51bGw7Ci0KLQkJcHVibGljIGJvb2xlYW4gc2VsZWN0ZWQgPSB0cnVlOwotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlpZiAoY29uZmlnU3BlYyAhPSBudWxsKQotCQkJCWlmIChjb25maWdTcGVjLm5hbWUgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGNvbmZpZ1NwZWMubmFtZTsKLQkJCXJldHVybiAidW5rbm93biBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb24iOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ1NwZWNzSW1wb3J0TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ1NwZWNzSW1wb3J0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDA2OWIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWdTcGVjc0ltcG9ydE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvblNwZWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5MaWJyYXJ5RG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGltcG9ydCBvZiBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdTcGVjc0ltcG9ydE1hbmFnZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlDb25maWdTcGVjc0ltcG9ydE1hbmFnZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29uZmlnIHNwZWNzIGluIHRoZSBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgQ29uZmlnU3BlY3MgZ2V0Q29uZmlnU3BlY3MoZmluYWwgTGlicmFyeURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZpbmFsIENvbmZpZ1NwZWNzIGNvbmZpZ1NwZWNzID0gbmV3IENvbmZpZ1NwZWNzKCk7Ci0KLQkJLy8gUmVtb3ZlIHRoZSB1bm5lZWRlZCBjb25maWd1cmF0aW9ucy4KLQkJRmlsZSBjb25maWdEaXIgPSBuZXcgRmlsZShkb2N1bWVudC5nZXRGaWxlKCkuZ2V0UGFyZW50KCksIE11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FKTsJCQkKLQkJTGlicmFyeURvY3VtZW50LkNvbmZpZ0RvY1Zpc2l0b3IgdmlzaXRvciA9IG5ldyBMaWJyYXJ5RG9jdW1lbnQuQ29uZmlnRG9jVmlzaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZpc2l0KEZpbGUgZmlsZSwgRWxlbWVudCBub2RlKSB7Ci0JCQkJQ29uZmlnU3BlY3MuRW50cnkgZW50cnkgPSBjb25maWdTcGVjcy5uZXdFbnRyeSgpOwotCQkJCWVudHJ5LmNvbmZpZ1NwZWMgPSBkb2N1bWVudC5nZXRDb25maWd1cmF0aW9uU3BlYyhub2RlKTsKLQkJCQllbnRyeS5leGlzdGluZ0NvbmZpZyA9IGdldEV4aXN0aW5nQ29uZmlnKGVudHJ5LmNvbmZpZ1NwZWMuZ3VpZCk7Ci0JCQl9Ci0JCX07CQkJCi0JCUxpYnJhcnlEb2N1bWVudC52aXNpdENvbmZpZ0ZpbGVzKGNvbmZpZ0RpciwgdmlzaXRvcik7CQkJCi0JCXJldHVybiBjb25maWdTcGVjczsKLQl9Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0RXhpc3RpbmdDb25maWcoU3RyaW5nIGd1aWQpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbnMoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQlpZiAoY29uZmlncyA9PSBudWxsIHx8IGNvbmZpZ3MubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGNvbmZpZ3NbaV07Ci0JCQlpZiAoY29uZmlnLmdldEd1aWQoKS5lcXVhbHMoZ3VpZCkpIHsKLQkJCQlyZXR1cm4gY29uZmlnOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW1wb3J0cyB0aGUgc2VsZWN0ZWQgbGlicmFyeSBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBzcGVjcwotCSAqICAgICAgICAgICAgQSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGRvSW1wb3J0KENvbmZpZ1NwZWNzIHNwZWNzKSB7Ci0JCXRyeSB7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkJCUxpYnJhcnlVdGlsLmxvYWRBbGwobGliKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHNwZWNzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlDb25maWdTcGVjcy5FbnRyeSBlbnRyeSA9IChDb25maWdTcGVjcy5FbnRyeSkgaXQubmV4dCgpOwotCQkJCWlmIChlbnRyeS5zZWxlY3RlZCkgewotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGNyZWF0ZUNvbmZpZyhlbnRyeS5jb25maWdTcGVjKTsKLQotCQkJCQlpZiAoZW50cnkuZXhpc3RpbmdDb25maWcgIT0gbnVsbCkgewotCQkJCQkJLy8gTWVyZ2UgdGhlIG5ldyBwbHVnLWlucyBhbmQgcGFja2FnZXMgaW50byB0aGUgZXhpc3RpbmcKLQkJCQkJCS8vIG9uZSwKLQkJCQkJCS8vIGFueXRoaW5nIGluIHRoZSBjdXJyZW50IGNvbmZpZ3VhdGlvbiBzaG91bGQgYmUga2VwdC4KLQkJCQkJCS8vIEVjb3JlVXRpbC5yZXBsYWNlKGVudHJ5LmV4aXN0aW5nQ29uZmlnLCBjb25maWcpOwotCQkJCQkJTGlzdCBwbHVnaW5zID0gZW50cnkuZXhpc3RpbmdDb25maWcKLQkJCQkJCQkJLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCQkJCQkJTGlzdCBwa2dzID0gZW50cnkuZXhpc3RpbmdDb25maWcKLQkJCQkJCQkJLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJCQkJCUxpc3Qgdmlld3MgPSBlbnRyeS5leGlzdGluZ0NvbmZpZy5nZXRQcm9jZXNzVmlld3MoKTsKLQotCQkJCQkJZm9yIChJdGVyYXRvciBpdHAgPSBjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0cC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGUgPSBpdHAubmV4dCgpOwotCQkJCQkJCWlmICghcGx1Z2lucy5jb250YWlucyhlKSkgewotCQkJCQkJCQlwbHVnaW5zLmFkZChlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRwID0gY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRwLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgZSA9IGl0cC5uZXh0KCk7Ci0JCQkJCQkJaWYgKCFwa2dzLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCQkJCXBrZ3MuYWRkKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJZm9yIChJdGVyYXRvciBpdHAgPSBjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCkuaXRlcmF0b3IoKTsgaXRwCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGUgPSBpdHAubmV4dCgpOwotCQkJCQkJCWlmICghcGtncy5jb250YWlucyhlKSkgewotCQkJCQkJCQl2aWV3cy5hZGQoZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gQWRkIHRoZSBjb25maWd1cmF0aW9uLgotCQkJCQkJbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLmFkZChjb25maWcpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlMaWJyYXJ5VXRpbC5zYXZlTGlicmFyeShsaWIsIGZhbHNlLCBmYWxzZSk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVDb25maWcoQ29uZmlndXJhdGlvblNwZWMgc3BlYykgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCQkvLyBTZXQgdGhlIGF0dHJpYnV0ZXMuCi0JCWNvbmZpZy5zZXROYW1lKHNwZWMubmFtZSk7Ci0JCWNvbmZpZy5zZXRCcmllZkRlc2NyaXB0aW9uKHNwZWMuYnJpZWZfZGVzYyk7Ci0JCWNvbmZpZy5zZXRHdWlkKHNwZWMuZ3VpZCk7Ci0KLQkJTGlzdCBwbHVnaW5zID0gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCQlMaXN0IHBrZ3MgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQlMaXN0IHZpZXdzID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpOwotCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHNwZWMucGx1Z2luSWRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQlPYmplY3QgZWxlbWVudCA9IG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsICYmICFwbHVnaW5zLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJCXBsdWdpbnMuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHNwZWMucGFja2FnZUlkcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiAhcGtncy5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQlwa2dzLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBzcGVjLnZpZXdJZHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgIXZpZXdzLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJCXZpZXdzLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25JbXBvcnREYXRhLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlndXJhdGlvbkltcG9ydERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTU0Y2U2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlndXJhdGlvbkltcG9ydERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5TG9jYXRpb25EYXRhOwotCi0KLS8qKgotICogRW5jYXBzdWxhdGVzIHRoZSBpbnB1dCBkYXRhIHJlcXVpcmVkIHRvIGltcG9ydCBhIGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25JbXBvcnREYXRhIHsKLQotCXB1YmxpYyBMaWJyYXJ5TG9jYXRpb25EYXRhIGxsRGF0YSA9IG5ldyBMaWJyYXJ5TG9jYXRpb25EYXRhKCk7Ci0KLQlwcml2YXRlIEVycm9ySW5mbyBlcnJvciA9IG5ldyBFcnJvckluZm8oKTsKLQotCS8vIElmIHNwZWNzICE9IG51bGwsIGl0J3MgYSBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb24gb25seS4KLQlwdWJsaWMgQ29uZmlnU3BlY3Mgc3BlY3MgPSBudWxsOwotCi0JcHVibGljIExpc3QgaW1wb3J0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIEluZGljYXRlIGlmIHlvdSB3YW50IHRvIHJlcGxhY2UgZXhpc3RpbmcgbWV0aG9kIHBhY2thZ2VzLgotCXB1YmxpYyBib29sZWFuIHJlcGxhY2VFeGlzdGluZyA9IHRydWU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uSW1wb3J0RGF0YSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGlmIGFueS4KLQkgKi8KLQlwdWJsaWMgRXJyb3JJbmZvIGdldEVycm9ySW5mbygpIHsKLQkJcmV0dXJuIGVycm9yOwotCX0KLQotCXB1YmxpYyBjbGFzcyBFcnJvckluZm8gewotCi0JCXByaXZhdGUgU3RyaW5nQnVmZmVyIGVycm9yTWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlwdWJsaWMgRXJyb3JJbmZvKCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJCWVycm9yTWVzc2FnZS5hcHBlbmQobWVzc2FnZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEVycm9yKCkgewotCQkJcmV0dXJuIGVycm9yTWVzc2FnZS50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCQllcnJvck1lc3NhZ2Uuc2V0TGVuZ3RoKDApOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOTg2NTc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5MaWJyYXJ5RG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5PcGVuTGlicmFyeVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkNvbnZlcnRHdWlkYW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuQ2FsZW5kYXI7Ci0KLQotLyoqCi0gKiBJbXBvcnRzIGEgbGlicmFyeSBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UgewotCi0JcHJpdmF0ZSBVcGdyYWRlQ2FsbGVySW5mbyB1cEdyYWRlSW5mbzsKLQkKLQlwcml2YXRlIENvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGRhdGE7Ci0KLQlMaWJyYXJ5RG9jdW1lbnQgaW1wb3J0aW5nTGliRG9jID0gbnVsbDsKLQotCUxpYnJhcnlEaWZmTWFuYWdlciBkaWZmTWdyID0gbnVsbDsKLQotCUNvbmZpZ1NwZWNzSW1wb3J0TWFuYWdlciBzcGVjc01nciA9IG51bGw7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UoQ29uZmlndXJhdGlvbkltcG9ydERhdGEgZGF0YSkgewotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEFuYWx5emVzIHRoZSBpbXBvcnRlZCBsaWJyYXJ5IHdpdGggcmVzcGVjdCB0byB0aGUgYmFzZSBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyB2b2lkIGFuYWx5emUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci5zZXRUYXNrTmFtZShJbXBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMCk7Ci0JCQl9Ci0KLQkJCWRhdGEuZ2V0RXJyb3JJbmZvKCkuY2xlYXIoKTsKLQotCQkJLy8gUHJlcGFyZSB0aGUgbGlicmFyeSBmaWxlcy4KLQkJCVN0cmluZyBwYXRoID0gZGF0YS5sbERhdGEuZ2V0UGFyZW50Rm9sZGVyKCk7Ci0JCQlpZiAocGF0aC5pbmRleE9mKEZpbGUuc2VwYXJhdG9yICsgTGlicmFyeURvY3VtZW50LmxpYnJhcnlGaWxlKSA8IDApIHsKLQkJCQlwYXRoICs9IEZpbGUuc2VwYXJhdG9yICsgTGlicmFyeURvY3VtZW50LmxpYnJhcnlGaWxlOwotCQkJfQotCQkJRmlsZSBpbXBvcnRpbmdMaWJQYXRoID0gbmV3IEZpbGUocGF0aCk7Ci0JCQkKLQkJCWJvb2xlYW4gaXNMaWJyYXJ5RmlsZSA9IHRydWU7Ci0JCQlpZiAoIWltcG9ydGluZ0xpYlBhdGguZXhpc3RzKCkpIHsKLQkJCQlpbXBvcnRpbmdMaWJQYXRoID0gbmV3IEZpbGUoaW1wb3J0aW5nTGliUGF0aC5nZXRQYXJlbnRGaWxlKCksCi0JCQkJCQlMaWJyYXJ5RG9jdW1lbnQuZXhwb3J0RmlsZSk7Ci0JCQkJaXNMaWJyYXJ5RmlsZSA9IGZhbHNlOwotCQkJfQotCi0JCQlpZiAoIWltcG9ydGluZ0xpYlBhdGguZXhpc3RzKCkpIHsKLQkJCQlkYXRhCi0JCQkJCQkuZ2V0RXJyb3JJbmZvKCkKLQkJCQkJCS5hZGRFcnJvcigKLQkJCQkJCQkJTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzEsIGltcG9ydGluZ0xpYlBhdGguZ2V0UGFyZW50KCkpKTsgCi0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlib29sZWFuIGhhbmRsZVZlcnNpb24gPSBpc0xpYnJhcnlGaWxlOwotCQkJaWYgKGhhbmRsZVZlcnNpb24pIHsKLQkJCQl1cEdyYWRlSW5mbyA9IG5ldyBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5VcGdyYWRlSW5mbyhVcGdyYWRlQ2FsbGVySW5mby51cGdyYWRlSW1wb3J0Q29uZmlnLCBpbXBvcnRpbmdMaWJQYXRoKTsKLQkJCQlpZiAoISBoYW5kbGVUb29sVmVyc2lvbihpbXBvcnRpbmdMaWJQYXRoLCB1cEdyYWRlSW5mbykpIHsKLQkJCQkJZGF0YQotCQkJCQkuZ2V0RXJyb3JJbmZvKCkKLQkJCQkJLmFkZEVycm9yKAotCQkJCQkJCU5MUy5iaW5kKEltcG9ydFJlc291cmNlcy5JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX0VSUl9JbXBvcnRfY29uZmlndXJhdGlvbiwgaW1wb3J0aW5nTGliUGF0aC5nZXRQYXJlbnQoKSkpOyAKLQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICh1cEdyYWRlSW5mby5nZXRDb3BpZWRMaWJGaWxlKCkgIT0gbnVsbCkgewotCQkJCQlpbXBvcnRpbmdMaWJQYXRoID0gdXBHcmFkZUluZm8uZ2V0Q29waWVkTGliRmlsZSgpOwotCQkJCX0KLQkJCX0KLQkJCQkJCQotCQkJaW1wb3J0aW5nTGliRG9jID0gbmV3IExpYnJhcnlEb2N1bWVudChpbXBvcnRpbmdMaWJQYXRoKTsKLQkJCQotCQkJaWYgKCEgaGFuZGxlVmVyc2lvbikgewotCQkJCVN0cmluZyB2ZXJzaW9uRXJyb3IgPSB2ZXJzaW9uQ2hlY2soaW1wb3J0aW5nTGliUGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSwgCi0JCQkJCQkJCQkJSW1wb3J0UmVzb3VyY2VzLmltcG9ydENvbmZpZ1dpemFyZF90aXRsZSk7Ci0JCQkJaWYgKHZlcnNpb25FcnJvciAhPSBudWxsKSB7Ci0JCQkJCWRhdGEuZ2V0RXJyb3JJbmZvKCkuYWRkRXJyb3IodmVyc2lvbkVycm9yKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQotCQkJYm9vbGVhbiBpc0NvbmZpZ1NwZWNzID0gaW1wb3J0aW5nTGliRG9jLmlzQ29uZmlnU3BlY3NPbmx5KCk7Ci0KLQkJCWlmIChpc0NvbmZpZ1NwZWNzKSB7Ci0KLQkJCQlzcGVjc01nciA9IG5ldyBDb25maWdTcGVjc0ltcG9ydE1hbmFnZXIoKTsKLQotCQkJCS8vIFNjYW4gdGhlIGxpYnJhcnkgZmlsZSBmb3IgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KLQkJCQlkYXRhLnNwZWNzID0gc3BlY3NNZ3IuZ2V0Q29uZmlnU3BlY3MoaW1wb3J0aW5nTGliRG9jKTsKLQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIWlzTGlicmFyeUZpbGUpIHsKLQkJCQkJZGF0YQotCQkJCQkuZ2V0RXJyb3JJbmZvKCkKLQkJCQkJLmFkZEVycm9yKAotCQkJCQkJCU5MUy5iaW5kKEltcG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cxLCBpbXBvcnRpbmdMaWJQYXRoLmdldFBhcmVudCgpKSk7IAotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWRhdGEuc3BlY3MgPSBudWxsOwotCi0JCQkJLy8gT3BlbiB0aGUgbGlicmFyeSBhbmQgY29tcGFyZSB0aGUgZGlmZmVyZW5jZS4KLQkJCQkKLQkJCQkvLyBuZWVkIHRvIG9wZW4gYW5kIGNsb3NlIHRoZSBsaWJyYXJ5IHRvIGhhdmUgdGhlIHByb2plY3QgcmVzb3VyY2VzIGluaXRpYWxpemVkIHByb3Blcmx5Ci0JCQkJU3RyaW5nIGxpYkRpciA9IGltcG9ydGluZ0xpYlBhdGguZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCi0JCQkJU3RyaW5nIHByb2plY3ROYW1lID0gIkNvbmZpZ3VyYXRpb24gSW1wb3J0IFByb2plY3QgKCIgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGxpYkRpci5oYXNoQ29kZSgpKSArICIpIjsgLy8kTk9OLU5MUy0xJAotCQkJCQotCQkJCU1ldGhvZExpYnJhcnlQcm9qZWN0Lm9wZW5Qcm9qZWN0KGxpYkRpciwgcHJvamVjdE5hbWUsIG1vbml0b3IpOwotCQkJCXRyeSB7Ci0JCQkJCU1ldGhvZExpYnJhcnkgaW1wb3J0TGlicmF0eSA9IExpYnJhcnlVdGlsCi0JCQkJCQkJLmxvYWRMaWJyYXJ5KGltcG9ydGluZ0xpYlBhdGguZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQlNZXRob2RMaWJyYXJ5IGJhc2VMaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCQkKLQkJCQkJaGFuZGxlVHlwZUNoYW5nZXMoYmFzZUxpYnJhcnksIGltcG9ydExpYnJhdHkpOwotCQkJCQkKLQkJCQkJU3RyaW5nIGJhc2VMaWJEaXIgPSBudWxsOwotCQkJCQl0cnkgewkvL05vdCBuZWNjZXNzYXJ5LCBidXQgcHJldmVudCBpbnRyb2R1Y2luZyBhbnkgcG90ZW50aWFsIHJlZ3Jlc3Npb24gZHVlIHRvIHRoaXMgY2hhbmdlCi0JCQkJCQlGaWxlIGJGaWxlID0gbmV3IEZpbGUoYmFzZUxpYnJhcnkuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudEZpbGUoKTs7Ci0JCQkJCQliYXNlTGliRGlyID0gYkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CQkJCQkJCi0JCQkJCX0KLQkJCQkJaWYgKGxpYkRpci5lcXVhbHNJZ25vcmVDYXNlKGJhc2VMaWJEaXIpKSB7Ci0JCQkJCQlkYXRhCi0JCQkJCQkJCS5nZXRFcnJvckluZm8oKQotCQkJCQkJCQkuYWRkRXJyb3IoCi0JCQkJCQkJCQkJTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzIsIGltcG9ydGluZ0xpYlBhdGguZ2V0UGFyZW50KCkpKTsgCi0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWZpeEltcG9ydExpYnJhcnlTeXN0ZW1QYWNrYWdlR1VJRHMoYmFzZUxpYnJhcnksIGltcG9ydExpYnJhdHkpOwotCQkJCQkKLQkJCQkJZGlmZk1nciA9IG5ldyBMaWJyYXJ5RGlmZk1hbmFnZXIoYmFzZUxpYnJhcnksIGltcG9ydExpYnJhdHkpOwotCQkJCQlkaWZmTWdyLmJ1aWxkRGlmZlRyZWUoKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCQlNZXRob2RMaWJyYXJ5UHJvamVjdC5jbG9zZVByb2plY3QobGliRGlyLCBtb25pdG9yKTsKLQkJCQkKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1wb3J0IGRhdGEuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGdldEltcG9ydERhdGEoKSB7Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgc3BlYyBvbmx5IGF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNzT25seSgpIHsKLQkJcmV0dXJuIChkYXRhLnNwZWNzICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpZmYgdHJlZS4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudERpZmZUcmVlIGdldERpZmZUcmVlKCkgewotCQlyZXR1cm4gZGlmZk1nci5nZXREaWZmVHJlZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltcG9ydCBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldEltcG9ydGluZ0xpYnJhcnkoKSB7Ci0JCXJldHVybiBkaWZmTWdyLmdldEltcG9ydGluZ0xpYnJhcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgaW1wb3J0LgotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1JbXBvcnQoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQotCQkvLyBuZWVkIHRvIGRpc2FibGUgdGhlIHdvcmtzcGFjZSByZWZyZXNoaW5nCi0JCWJvb2xlYW4gcmVmcmVzaCA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5pc0VuYWJsZWQoKTsKLQkJaWYocmVmcmVzaCkgewotCQkJLy8gZGlzYWJsZSByZXNvdXJjZSByZWZyZXNoaW5nIGR1cmluZyBpbXBvcnQKLQkJCS8vCi0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci5zZXRUYXNrTmFtZShJbXBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMyk7Ci0JCQl9Ci0KLQkJCWlmIChpc1NwZWNzT25seSgpKSB7Ci0JCQkJc3BlY3NNZ3IuZG9JbXBvcnQoZGF0YS5zcGVjcyk7Ci0JCQl9IGVsc2UgewotCQkJCUxpYnJhcnlJbXBvcnRNYW5hZ2VyIGltcG9ydGluZ01nciA9IG5ldyBMaWJyYXJ5SW1wb3J0TWFuYWdlcihkaWZmTWdyLCBkYXRhLmltcG9ydExpc3QpOwkJCQotCQkJCWltcG9ydGluZ01nci5kb01lcmdlKGRhdGEucmVwbGFjZUV4aXN0aW5nLCBtb25pdG9yKTsKLQkJCX0KLQkJCQotCQkJLy8gcmVmcmVzaCBsaWJyYXJ5IGZpbGVzIGluIHdvcmtzcGFjZQotCQkJLy8KLQkJCU1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJUmVzb3VyY2VVdGlsLnJlZnJlc2hSZXNvdXJjZXMobGliLCBtb25pdG9yKTsKLQkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmKHJlZnJlc2gpIHsKLQkJCQkvLyByZS1lbmFibGUgcmVzb3VyY2UgcmVmcmVzaGluZyAKLQkJCQkvLwotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQkJaWYgKHVwR3JhZGVJbmZvICE9IG51bGwpIHsKLQkJCQl1cEdyYWRlSW5mby5yZW1vdmVDb3BpZWRMaWJyYXJ5KCk7Ci0JCQkJdXBHcmFkZUluZm8gPSBudWxsOwotCQkJfQotCQl9CQotCQkKLQkJdHJ5IHsKLQkJCS8vIFJlb3BlbiB0aGUgbGlicmFyeS4KLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVvcGVuQ3VycmVudE1ldGhvZExpYnJhcnkoKTsJCQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0aGUgdG9vbCB2ZXJzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25DaGVjayhmaW5hbCBTdHJpbmcgeG1sUGF0aCwgZmluYWwgU3RyaW5nIHRpdGxlKSB7Ci0JCWZpbmFsIFN0cmluZ1tdIHJldCA9IG5ldyBTdHJpbmdbMV07Ci0JCXJldFswXSA9IG51bGw7Ci0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsJCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7CQkJCQotCQkJCVZlcnNpb25VdGlsLlZlcnNpb25DaGVja0luZm8gaW5mbyA9IFZlcnNpb25VdGlsLmNoZWNrTGlicmFyeVZlcnNpb24obmV3IEZpbGUoeG1sUGF0aCkpOwotCQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQkJcmV0WzBdID0gTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd24sIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKX0pOwkJCQkJCi0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGluZm8ucmVzdWx0IDwgMCkgewotCQkJCQkJaWYgKGluZm8udG9vbElELmVxdWFscyhWZXJzaW9uVXRpbC5nZXRQcmltYXJ5VG9vbElEKCkpKSB7Ci0JCQkJCQkJcmV0WzBdID0gTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaF9vbGREYXRhLCBuZXcgT2JqZWN0W10gewotCQkJCQkJCQkJaW5mby50b29sVmVyc2lvbiwgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKX0pOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93biwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCVBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsJCQkJCQotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKGluZm8ucmVzdWx0ID4gMCkgewotCQkJCQkJaWYgKGluZm8udG9vbElELmVxdWFscyhWZXJzaW9uVXRpbC5nZXRQcmltYXJ5VG9vbElEKCkpKSB7Ci0JCQkJCQkJcmV0WzBdID0gTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaF9vbGRUb29sLCBuZXcgT2JqZWN0W10gewotCQkJCQkJCQkJaW5mby50b29sVmVyc2lvbiwgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKX0pOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZFRvb2xfdW5rbm93biwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCVBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsKLQkJCQkJCX0KLQkJCQkJfSAKLQkJCQl9Ci0JCQkJaWYgKHJldFswXSAhPSBudWxsKSB7Ci0JCQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLCByZXRbMF0pOwkJCQkJCi0JCQkJfQotCQkJfQotCQl9KTsJCQotCQlyZXR1cm4gcmV0WzBdOwotCX0KLQkKLQkvKioKLQkgKiBGaXhlcyB0aGUgaW1wb3J0ZWQgbGlicmFyeSdzIHN5c3RlbSBwYWNrYWdlIGd1aWRzIHdpdGggdGhvc2UgYmFzZSdzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaXhJbXBvcnRMaWJyYXJ5U3lzdGVtUGFja2FnZUdVSURzKE1ldGhvZExpYnJhcnkgYmFzZUxpYnJhcnksIE1ldGhvZExpYnJhcnkgaW1wb3J0TGlicmF0eSkgewotCQlIYXNoTWFwIHBsdWdpbnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlMaXN0IHBsdWdpbnMgPSBiYXNlTGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoaW50IGk9MDsgaSA8IHBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBwbHVnaW5zLmdldChpKTsKLQkJCXBsdWdpbnNNYXAucHV0KHBsdWdpbi5nZXRHdWlkKCksIHBsdWdpbik7Ci0JCX0KLQkJaWYgKHBsdWdpbnNNYXAuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUxpc3QgaW1wb3J0UGx1Z2luc1RvRml4ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGltcG9ydFBsdWdpbnMgPSBpbXBvcnRMaWJyYXR5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgaW1wb3J0UGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGltcG9ydFBsdWdpbnMuZ2V0KGkpOwotCQkJaWYgKHBsdWdpbnNNYXAuY29udGFpbnNLZXkocGx1Z2luLmdldEd1aWQoKSkpIHsKLQkJCQlpbXBvcnRQbHVnaW5zVG9GaXguYWRkKHBsdWdpbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoaW50IGk9MDsgaSA8IGltcG9ydFBsdWdpbnNUb0ZpeC5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIGltcG9ydFBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGltcG9ydFBsdWdpbnNUb0ZpeC5nZXQoaSk7Ci0JCQlNZXRob2RQbHVnaW4gYmFzZVBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHBsdWdpbnNNYXAuZ2V0KGltcG9ydFBsdWdpbi5nZXRHdWlkKCkpOwotCQkJaWYgKGJhc2VQbHVnaW4gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJTGlzdCBpbXBvcnRQYWNrYWdlcyA9IFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMoaW1wb3J0UGx1Z2luKTsKLQkJCUhhc2hNYXAgaW1wb3J0UGFja2FnZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKGludCBqPTA7IGogPCBpbXBvcnRQYWNrYWdlcy5zaXplKCk7IGorKykgewotCQkJCU1ldGhvZEVsZW1lbnQgaW1wb3J0UGFja2FnZSA9IChNZXRob2RFbGVtZW50KSBpbXBvcnRQYWNrYWdlcy5nZXQoaik7Ci0JCQkJaW1wb3J0UGFja2FnZU1hcC5wdXQoaW1wb3J0UGFja2FnZS5nZXROYW1lKCksIGltcG9ydFBhY2thZ2UpOwotCQkJfQotCQkJCi0JCQlMaXN0IGJhc2VQYWNrYWdlcyA9IFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMoYmFzZVBsdWdpbik7CQkJCi0JCQlmb3IgKGludCBqPTA7IGogPCBiYXNlUGFja2FnZXMuc2l6ZSgpOyBqKyspIHsKLQkJCQlNZXRob2RFbGVtZW50IGJhc2VQYWNrYWdlID0gKE1ldGhvZEVsZW1lbnQpIGJhc2VQYWNrYWdlcy5nZXQoaik7Ci0JCQkJTWV0aG9kRWxlbWVudCBpbXBvcnRQYWNrYWdlID0gKE1ldGhvZEVsZW1lbnQpIGltcG9ydFBhY2thZ2VNYXAuZ2V0KGJhc2VQYWNrYWdlLmdldE5hbWUoKSk7Ci0JCQkJaWYgKGltcG9ydFBhY2thZ2UgPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJU3RyaW5nIGd1aWQgPSBiYXNlUGFja2FnZS5nZXRHdWlkKCk7Ci0JCQkJaWYgKCEgaW1wb3J0UGFja2FnZS5nZXRHdWlkKCkuZXF1YWxzKGd1aWQpKSB7Ci0JCQkJCWltcG9ydFBhY2thZ2Uuc2V0R3VpZChndWlkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVR5cGVDaGFuZ2VzKE1ldGhvZExpYnJhcnkgYmFzZUxpYiwgTWV0aG9kTGlicmFyeSBpbXBvcnRMaWIpIHsKLQkJSGFzaE1hcCBiYXNlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJY29sbGVjdFBvdGVudGlhbFR5cGVDaGFuZ2VkKGJhc2VMaWIsIGJhc2VNYXApOwotCQlIYXNoTWFwIGltcG9ydE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWNvbGxlY3RQb3RlbnRpYWxUeXBlQ2hhbmdlZChpbXBvcnRMaWIsIGltcG9ydE1hcCk7Ci0JCWhhbmRsZVR5cGVDaGFuZ2VzKGJhc2VNYXAsIGltcG9ydE1hcCk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBNZXRob2RFbGVtZW50IHR5cGUgY2hhbmdlcy4gTm90ZTogZm9yIE1ldGhvZEVsZW1lbnQgb2JqZWN0cyBpbiBpbXBvcnRNYXAKLQkgKiBvbmx5IGVDbGFzcyB0eXBlIGlzIHVzZWQgaW4gdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZVR5cGVDaGFuZ2VzKEhhc2hNYXAgYmFzZU1hcCwgSGFzaE1hcCBpbXBvcnRNYXApIHsKLQkJQXJyYXlMaXN0IHRvQ2hhbmdlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGltcG9ydE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCBndWlkID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlNZXRob2RFbGVtZW50IGJhc2VFbGVtID0gKE1ldGhvZEVsZW1lbnQpIGJhc2VNYXAuZ2V0KGd1aWQpOwotCQkJaWYgKGJhc2VFbGVtICE9IG51bGwpIHsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW0gPSAoTWV0aG9kRWxlbWVudCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoISBlbGVtLmVDbGFzcygpLmVxdWFscyhiYXNlRWxlbS5lQ2xhc3MoKSkpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtUGFpcltdID0gbmV3IE1ldGhvZEVsZW1lbnRbXSB7YmFzZUVsZW0sIGVsZW19OwotCQkJCQl0b0NoYW5nZUxpc3QuYWRkKGVsZW1QYWlyKTsKLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQkJZm9yIChpbnQgaT0wOyBpPHRvQ2hhbmdlTGlzdC5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtUGFpcltdID0gKE1ldGhvZEVsZW1lbnRbXSkgdG9DaGFuZ2VMaXN0LmdldChpKTsKLQkJCWZpbmFsIE1ldGhvZEVsZW1lbnQgYmFzZUVsZW0gPSBlbGVtUGFpclswXTsKLQkJCWZpbmFsIE1ldGhvZEVsZW1lbnQgaW1wb3J0RWxlbSA9IGVsZW1QYWlyWzFdOwotCQkJaWYgKGJhc2VFbGVtIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUNvbnZlcnRHdWlkYW5jZVR5cGUuY29udmVydEd1aWRhbmNlKChHdWlkYW5jZSkgYmFzZUVsZW0sIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSwgbnVsbCwgaW1wb3J0RWxlbS5lQ2xhc3MoKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0gZWxzZSBpZiAoYmFzZUVsZW0gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCVR5cGVDb252ZXJ0ZXIuY29udmVydEFjdGl2aXR5KChBY3Rpdml0eSkgYmFzZUVsZW0sIGltcG9ydEVsZW0uZUNsYXNzKCkpOyAKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbGxlY3RzIGVsZW1lbnRzIGluIGxpYiB0aGF0IG1heSBoYXZlIHR5cGUgY2hhbmdlcyAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29sbGVjdFBvdGVudGlhbFR5cGVDaGFuZ2VkKE1ldGhvZExpYnJhcnkgbGliLCBIYXNoTWFwIG1hcCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGliLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlIHx8Ci0JCQkJb2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW0gPSAoTWV0aG9kRWxlbWVudCkgb2JqOwotCQkJCW1hcC5wdXQoZWxlbS5nZXRHdWlkKCksIGVsZW0pOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYW5kbGVUb29sVmVyc2lvbihGaWxlIGxpYkZpbGUsIGZpbmFsIFVwZ3JhZGVDYWxsZXJJbmZvIGluZm8pIHsKLQkJZmluYWwgU3RyaW5nIGxpYkZvbGRlclBhdGggPSBsaWJGaWxlLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJZmluYWwgYm9vbGVhbiByZXRbXSA9IG5ldyBib29sZWFuWzFdOwotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJldFswXSA9IE9wZW5MaWJyYXJ5V2l6YXJkLmhhbmRsZVRvb2xWZXJzaW9uKGxpYkZvbGRlclBhdGgsIGluZm8pOwotCQkJfQotCQl9KTsJCQkJCQkJCQotCQlyZXR1cm4gcmV0WzBdOwotCX0JCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFVwZ3JhZGVJbmZvIGV4dGVuZHMgVXBncmFkZUNhbGxlckluZm8gewotCQkKLQkJcHVibGljIFVwZ3JhZGVJbmZvKGludCBjYWxsZXJUeXBlLCBGaWxlIGxpYkZpbGUpIHsKLQkJCXN1cGVyKGNhbGxlclR5cGUsIGxpYkZpbGUpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBjb3B5TGlicmFyeSgpIHsKLQkJCVN0cmluZyB1c2VySG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBkZXNMaWJGb2xkZXJQYXRoID0gdXNlckhvbWUgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrICJFUEYiICsgRmlsZS5zZXBhcmF0b3IgKyAiRXhwb3J0IiArIEZpbGUuc2VwYXJhdG9yIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkrIExvbmcudG9IZXhTdHJpbmcoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lSW5NaWxsaXMoKSkgKyBGaWxlLnNlcGFyYXRvcjsJCQotCQkJRmlsZSBkZXNMaWJGb2xkZXIgPSBuZXcgRmlsZShkZXNMaWJGb2xkZXJQYXRoKTsKLQkJCWlmICghZGVzTGliRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJZGVzTGliRm9sZGVyLm1rZGlycygpOwotCQkJfSBlbHNlIHsKLQkJCQlGaWxlVXRpbC5kZWxldGVBbGxGaWxlcyhkZXNMaWJGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJfQotCQkJCi0JCQlQbHVnaW5FeHBvcnRTZXJ2aWNlLmNvcHlEaXIoZ2V0TGliRmlsZSgpLmdldFBhcmVudEZpbGUoKSwgZGVzTGliRm9sZGVyKTsKLQkJCXNldENvcGllZExpYkZpbGUobmV3IEZpbGUoZGVzTGliRm9sZGVyUGF0aCArIGdldExpYkZpbGUoKS5nZXROYW1lKCkpKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlQ29waWVkTGlicmFyeSgpIHsKLQkJCWlmIChnZXRDb3BpZWRMaWJGaWxlKCkgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCUZpbGVVdGlsLmRlbGV0ZUFsbEZpbGVzKGdldENvcGllZExpYkZpbGUoKS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJZ2V0Q29waWVkTGliRmlsZSgpLmdldFBhcmVudEZpbGUoKS5kZWxldGUoKTsKLQkJCXNldENvcGllZExpYkZpbGUobnVsbCk7Ci0JCX0KLQl9OwkKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRGlyQ29weS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0RpckNvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTQ3ZTIzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRGlyQ29weS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLQotCi0vKioKLSAqIHV0aWxpdHkgY2xhc3MgdG8gY29weSBmaWxlcyBmcm9tIG9uZSBkaXIgdG8gYW5vdGhlciwgYW5kIGRlbGV0ZSB0aGUgdW4tbmVlZGVkIGZpbGVzIGZyb20gc291cmNlIGRpci4KLSAqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlyQ29weSB7Ci0KLQkvL3ByaXZhdGUgSVN0YXR1cyBmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IG51bGw7Ci0JCi0JRmlsZSBzcmNEaXI7Ci0JRmlsZSB0YXJnZXREaXI7Ci0JCi0JLy8gbmV3IGZpbGVzIHRvIGJlIGFkZGVkIHRvIHRoZSB0YXJnZXQKLQlMaXN0IG5ld0ZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCS8vIGZpbGVzIGV4aXN0cyBpbiBib3RoIHNyYyBhbmQgdGFyZ2V0IGRpcgotCUxpc3Qgb2xkRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JLy8gZmlsZXMgb25seSBpbiB0YXJnZXQgZGlyLCB0aGVzZSBmaWxlcyBhcmUgdHJlYXRlZCBhcyBkZWxldGVkIGluIHRoZSBzcmMgZm9sZGVyLgotCUxpc3QgZGVsZXRlZEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpckNvcHkoRmlsZSBzcmNEaXIsIEZpbGUgdGFyZ2V0RGlyKSB7Ci0JCXRoaXMuc3JjRGlyID0gc3JjRGlyOwotCQl0aGlzLnRhcmdldERpciA9IHRhcmdldERpcjsKLQkJCi0JCXByZXBhcmUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENQX0ZPRExFUiA9IE11bHRpRmlsZVNhdmVVdGlsLkNBUEFCSUxJVFlfUEFUVEVSTl9QQVRIICsgIi8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERQX0ZPRExFUiA9IE11bHRpRmlsZVNhdmVVdGlsLkRFTElWRVJZX1BST0NFU1NfUEFUSCArICIvIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIGNoZWNrIG91dCB0aGUgZXhpc3RpbmcgZmlsZXMsIGRlbGV0ZSB0aGUgZmlsZXMgZnJvbSBjbSwgYW5kIGFkZCBuZXcgZmlsZXMsIGNvcHkgdGhlIGZpbGVzIG92ZXIKLQkgKgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoKSB7Ci0JCQkKLQkJLy8gY2hlY2sgb3V0IGZpbGVzCi0JCUxpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gb2xkRmlsZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBwYXRoID0gKFN0cmluZylpdC5uZXh0KCk7CQkJCQkJCi0JCQlpZiAobmVlZENvcHkobmV3IEZpbGUoc3JjRGlyLCBwYXRoKSwgbmV3IEZpbGUodGFyZ2V0RGlyLCBwYXRoKSkpIHsJLy8xNTQzMjEKLQkJCQlmaWxlcy5hZGQobmV3IEZpbGUodGFyZ2V0RGlyLCBwYXRoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUlTdGF0dXMgZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBGaWxlTW9kaWZ5Q2hlY2tlci5jaGVja01vZGlmeShmaWxlcyk7Ci0JCQotCQlpZiAoICFmaWxlQ2hlY2tlZE91dFN0YXR1cy5pc09LKCkgKSB7Ci0JCQlyZXR1cm4gZmlsZUNoZWNrZWRPdXRTdGF0dXM7Ci0JCX0KLQkJCQotCQkvLyBkZWxldGUgZmlsZXMKLQkJSUZpbGVNYW5hZ2VyIGZpbGVNZ3IgPSBTZXJ2aWNlcy5nZXRGaWxlTWFuYWdlcigpOwotCQlmb3IgKCBJdGVyYXRvciBpdCA9IGRlbGV0ZWRGaWxlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKWl0Lm5leHQoKTsKLQkJCUZpbGUgZiA9IG5ldyBGaWxlKHRhcmdldERpciwgcGF0aCk7Ci0JCQlmaWxlTWdyLmRlbGV0ZShmLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQotCQkJLy8gZGVsZXRlIHRoZSBlbXB0eSBDUCBhbmQgRFAgZm9sZGVyCi0JCQlwYXRoID0gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCBwYXRoLnN0YXJ0c1dpdGgoQ1BfRk9ETEVSKSB8fCBwYXRoLnN0YXJ0c1dpdGgoRFBfRk9ETEVSKSApIHsKLQkJCQlGaWxlIGZvbGRlciA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQkJCVN0cmluZ1tdIGl0ZW1zID0gZm9sZGVyLmxpc3QoKTsKLQkJCQlpZiAoIGl0ZW1zID09IG51bGwgfHwgaXRlbXMubGVuZ3RoID09IDAgKSB7Ci0JCQkJCWZpbGVNZ3IuZGVsZXRlKGZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSk7CQkJCQotCQkJCX0KLQkJCX0KLQkJfQkKLQkJCi0JCS8vIGNvcHkgb2xkIGZpbGVzCi0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gb2xkRmlsZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBwYXRoID0gKFN0cmluZylpdC5uZXh0KCk7Ci0JCQlSZXNvdXJjZUhlbHBlci5jb3B5RmlsZShuZXcgRmlsZShzcmNEaXIsIHBhdGgpLCBuZXcgRmlsZSh0YXJnZXREaXIsIHBhdGgpKTsKLQkJfQotCQkKLQkJLy8gY29weSBuZXcgZmlsZXMKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBuZXdGaWxlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKWl0Lm5leHQoKTsKLQkJCVJlc291cmNlSGVscGVyLmNvcHlGaWxlKG5ldyBGaWxlKHNyY0RpciwgcGF0aCksIG5ldyBGaWxlKHRhcmdldERpciwgcGF0aCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gZmlsZUNoZWNrZWRPdXRTdGF0dXM7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBwcmVwYXJlKCkgewotCQlMaXN0IGFsbFNyY0ZpbGVzID0gZ2V0QWxsRmlsZXMoc3JjRGlyKTsKLQkJTGlzdCBhbGxUYXJnZXRGaWxlcyA9IGdldEFsbEZpbGVzKHRhcmdldERpcik7Ci0KLQkJd2hpbGUgKCBhbGxUYXJnZXRGaWxlcy5zaXplKCkgPiAwICkgewotCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKWFsbFRhcmdldEZpbGVzLnJlbW92ZSgwKTsKLQkJCWlmICggYWxsU3JjRmlsZXMuY29udGFpbnMocGF0aCkgKSB7Ci0JCQkJb2xkRmlsZXMuYWRkKHBhdGgpOwotCQkJCWFsbFNyY0ZpbGVzLnJlbW92ZShwYXRoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVsZXRlZEZpbGVzLmFkZChwYXRoKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gdGhlIHJlbWFpbmluZyBmaWxlcyBpbiB0aGUgdGFyZ2V0IGxpc3QgaXMgdGhlIG5ldyBmaWxlcwotCQluZXdGaWxlcy5hZGRBbGwoYWxsU3JjRmlsZXMpOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgYWxsIHRoZSBmaWxlcyB3aXRoIHJlbGF0aXZlIHBhdGggdG8gdGhlIHJvb3QKLQkgKiBAcGFyYW0gZGlyIHRoZSByb290IGRpcgotCSAqIEByZXR1cm4gTGlzdCBhbGwgZmlsZXMgaW4gdGhlIGRpciwgd2l0aCByZWxhdGl2ZSBwYXRoIHRvIHRoZSByb290Ci0JICovCi0JcHJpdmF0ZSBMaXN0IGdldEFsbEZpbGVzKEZpbGUgZGlyKSB7Ci0JCUxpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUZpbGVVdGlsLmdldEFsbEZpbGVzKGRpciwgZmlsZXMsIHRydWUpOwotCi0JCS8vIGNvbnZlcnQgdG8gbGlzdCBvZiBwYXRoLCBub3QgRmlsZQotCQlVUkkgYmFzZVVybCA9IGRpci50b1VSSSgpOwotCQkKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoIGkgPCBmaWxlcy5zaXplKCkgKSB7Ci0JCQlGaWxlIGYgPSAoRmlsZSlmaWxlcy5nZXQoaSk7Ci0JCQlpZiAoIGNhbklnbm9yZShmLmdldEFic29sdXRlUGF0aCgpKSB8fCBjYW5JZ25vcmUoZikpIHsKLQkJCQlmaWxlcy5yZW1vdmUoaSk7Ci0JCQl9IGVsc2UgewotCQkJCVVSSSByZWwgPSBiYXNlVXJsLnJlbGF0aXZpemUoZi50b1VSSSgpKTsKLQkJCQlmaWxlcy5zZXQoaSwgcmVsLmdldFBhdGgoKSk7CQotCQkJCWkrKzsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmaWxlczsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENWU19GT0xERVIgPSBGaWxlLnNlcGFyYXRvciArICJDVlMiICsgRmlsZS5zZXBhcmF0b3I7Ci0JcHJpdmF0ZSBib29sZWFuIGNhbklnbm9yZShTdHJpbmcgcGF0aCkgewotCQlpZiAoIHBhdGguaW5kZXhPZihDVlNfRk9MREVSKSA+PTAgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpZ25vcmVGaWxlcyA9IHsKLQkJCQkJCQkJCSIuY29weWFyZWEuZGF0IiwKLQkJCQkJCQkJCSIuY29weWFyZWEuZGIiCi0JCQkJCQkJCQl9OwkJCS8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAotCXByaXZhdGUgYm9vbGVhbiBjYW5JZ25vcmUoRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxpZ25vcmVGaWxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG5hbWUuZXF1YWxzKGlnbm9yZUZpbGVzW2ldKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgY29weSBhY3Rpb24gaXMgbmVlZGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBuZWVkQ29weShGaWxlIHNvdXJjZSwgRmlsZSBkZXN0KSB7Ci0JCWJvb2xlYW4gcmV0ID0gdHJ1ZTsKLQkJaWYgKGRlc3QuZXhpc3RzKCkpIHsKLQkJCXJldCA9IChkZXN0Lmxhc3RNb2RpZmllZCgpICE9IHNvdXJjZS5sYXN0TW9kaWZpZWQoKSkKLQkJCQkJfHwgKGRlc3QubGVuZ3RoKCkgIT0gc291cmNlLmxlbmd0aCgpKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRWxlbWVudERpZmZUcmVlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRWxlbWVudERpZmZUcmVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMzYzc1MDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0VsZW1lbnREaWZmVHJlZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotCi0vKioKLSAqIERpc3BsYXlzIHRoZSBlbGVtZW50IGRpZmZlcmVuY2VzIGluIGEgdHJlZS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnREaWZmVHJlZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUZGX1NUQVRFX1NBTUUgPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElGRl9TVEFURV9ORVcgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElGRl9TVEFURV9DSEFOR0VEID0gNDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJRkZfU1RBVEVfT0xEX09OTFkgPSA1OwotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGUxOwotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGUyOwotCi0JLy8gVGhlIHBhcmVudCBpbiB0aGUgYmFzZSBsaWJyYXJ5IGlmIGUyIGlzIGEgbmV3IGVsZW1lbnQuCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGUxX3BhcmVudDsKLQotCXByaXZhdGUgRWxlbWVudERpZmZUcmVlIHBhcmVudCA9IG51bGw7Ci0KLQkvLyBEZWZpbmUgdGhlIGRpZmYgc3RhdGUgb2YgdGhlIHNlY29uZCBlbGVtZW50IGNvbXBhcmVkIHRvIHRoZSBmaXJzdCBvbmUuCi0JcHJpdmF0ZSBpbnQgZGlmZlN0YXRlID0gRElGRl9TVEFURV9TQU1FOwotCi0JcHJpdmF0ZSBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0RpcnR5Q2hpbGQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEVsZW1lbnREaWZmVHJlZShNZXRob2RFbGVtZW50IGUxLCBNZXRob2RFbGVtZW50IGUyKSB7Ci0JCXRoaXMoZTEsIGUyLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFbGVtZW50RGlmZlRyZWUoTWV0aG9kRWxlbWVudCBlMSwgTWV0aG9kRWxlbWVudCBlMiwKLQkJCU1ldGhvZEVsZW1lbnQgZTFfcGFyZW50KSB7Ci0JCXRoaXMuZTFfcGFyZW50ID0gZTFfcGFyZW50OwotCQl0aGlzLmUxID0gZTE7Ci0JCXRoaXMuZTIgPSBlMjsKLQotCQlyZXNvbHZlRGlmZlN0YXRlKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJhc2UgbWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0QmFzZUVsZW1lbnQoKSB7Ci0JCXJldHVybiBlMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBiYXNlIG1ldGhvZCBlbGVtZW50J3MgcGFyZW50LgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEJhc2VQYXJlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gZTFfcGFyZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltcG9ydCBtZXRob2QgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRJbXBvcnRFbGVtZW50KCkgewotCQlyZXR1cm4gZTI7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgbmV3IHRvIHRoZSBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmV3KCkgewotCQlyZXR1cm4gKGUxID09IG51bGwpICYmIChlMiAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZWxlbWVudCBleGlzdHMgb25seSBpbiB0aGUgbGlicmFyeSBhbmQgbm90IGluIHRoZQotCSAqIGNvbmZpZ3VyYXRpb24gdG8gYmUgaW1wb3J0ZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPbGRPbmx5KCkgewotCQlyZXR1cm4gKGUxICE9IG51bGwpICYmIChlMiA9PSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgYm90aCBiYXNlIGFuZCBpbXBvcnQgZWxlbWVudHMgYXJlIG5vdCBudWxsLCAKLQkgKiBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0JvdGgoKSB7Ci0JCXJldHVybiAoZTEgIT0gbnVsbCkgJiYgKGUyICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBjaGlsZCBub2RlLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoaWxkKEVsZW1lbnREaWZmVHJlZSBjaGlsZCkgewotCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogaGFzRGlydHlDaGlsZCBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRGlydHlDaGlsZCgpIHsKLQkJcmV0dXJuIHRoaXMuaGFzRGlydHlDaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGhhc0RpcnR5Q2hpbGQgYXR0cmlidXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpcnR5Q2hpbGQoYm9vbGVhbiBmbGFnKSB7Ci0JCWhhc0RpcnR5Q2hpbGQgPSBoYXNEaXJ0eUNoaWxkIHx8IGZsYWc7Ci0JCWlmIChoYXNEaXJ0eUNoaWxkICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuc2V0RGlydHlDaGlsZChoYXNEaXJ0eUNoaWxkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRQYXJlbnQoRWxlbWVudERpZmZUcmVlIHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJaWYgKGRpZmZTdGF0ZSAhPSBESUZGX1NUQVRFX1NBTUUgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5zZXREaXJ0eUNoaWxkKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFyZW50LgotCSAqLwotCXB1YmxpYyBFbGVtZW50RGlmZlRyZWUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogaGFzQ2hpbGRyZW4gYXR0cmlidXRlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQlyZXR1cm4gKGNoaWxkcmVuICE9IG51bGwpICYmIChjaGlsZHJlbi5zaXplKCkgPiAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGlsZCBsaXN0LgotCSAqLwotCXB1YmxpYyBMaXN0IGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlmZiBzdGF0ZSBvZiB0aGUgc2Vjb25kIGVsZW1lbnQgY29tcGFyaW5nIHRvIHRoZSBmaXJzdCBvbmUuCi0JICovCi0JcHVibGljIGludCBnZXREaWZmU3RhdGUoKSB7Ci0JCXJldHVybiBkaWZmU3RhdGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG1lc3NhZ2Ugc3RyaW5nLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlmZk1lc3NhZ2UoKSB7Ci0JCXJldHVybiAiWyIgKyBnZXRWZXJzaW9uKGUxKSArICJdIDogWyIgKyBnZXRWZXJzaW9uKGUyKSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzb2x2ZURpZmZTdGF0ZSgpIHsKLQkJLy8gaG93IHRvIGZpZGQgdHdvIGVsZW1lbnRzPwotCQkvLyAxLiBhdHRyaWJ1dGVzCi0JCS8vIDIuIHZlcnNpb24gbnVtYmVyCi0JCS8vIDMuIGNoaWxkcmVuCi0JCS8vIDQuIHJlZmVyZW5jZXMKLQkJLy8gNS4gLi4uCi0JCWlmIChlMSA9PSBudWxsKSB7Ci0JCQlkaWZmU3RhdGUgPSBESUZGX1NUQVRFX05FVzsKLQkJfSBlbHNlIGlmIChlMiA9PSBudWxsKSB7Ci0JCQlkaWZmU3RhdGUgPSBESUZGX1NUQVRFX09MRF9PTkxZOwotCQl9IGVsc2UgewotCQkJaWYgKGUxIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCWRpZmZTdGF0ZSA9IERJRkZfU1RBVEVfU0FNRTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGlmZlN0YXRlID0gRElGRl9TVEFURV9DSEFOR0VEOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmVyc2lvbihNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gZ2V0UGFja2FnZShlbGVtZW50KS5nZXRWZXJzaW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQgZ2V0UGFja2FnZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQpIHsKLQkJCXJldHVybiAob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0KSBlbGVtZW50OwotCQl9Ci0KLQkJcmV0dXJuIGdldFBhY2thZ2UoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQuZUNvbnRhaW5lcigpKTsKLQl9Ci0KLQkvLyBVdGlsaXR5IG1ldGhvZCB0byBnZXQgdGhlIGVsZW1lbnQgaW5mb3JtYXRpb24uCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmIChlMSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZTEuZ2V0TmFtZSgpOwotCQl9Ci0JCWlmIChlMiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZTIuZ2V0TmFtZSgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHR5cGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLQkJTWV0aG9kRWxlbWVudCBlID0gZTE7Ci0JCWlmIChlID09IG51bGwpIHsKLQkJCWUgPSBlMjsKLQkJfQotCi0JCWlmIChlICE9IG51bGwpIHsKLQkJCXJldHVybiBlLmdldFR5cGUoKS5nZXROYW1lKCk7Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9GaWxlTW9kaWZ5Q2hlY2tlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0ZpbGVNb2RpZnlDaGVja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRlZTQwYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0ZpbGVNb2RpZnlDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLQotCi0vKioKLSAqIHV0aWxpdHkgY2xhc3MgdG8gY2hlY2sgZmlsZXMgZm9yIG1vZGlmaWNhdGlvbnMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlTW9kaWZ5Q2hlY2tlciB7Ci0KLQkvKioKLQkgKiBDaGVja3MgbW9kaWZpY2F0aW9uIHN0YXR1cyBvZiB0aGUgZ2l2ZW4gbGlzdCBvZiBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tNb2RpZnkoTGlzdCBtb2RpZmllZEZpbGVzKSB7Ci0JCQotCQl0cnkgewotCQkJU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW21vZGlmaWVkRmlsZXMuc2l6ZSgpXTsKLQkJCW1vZGlmaWVkRmlsZXMudG9BcnJheShwYXRocyk7Ci0JCQkKLQkJCUlGaWxlTWFuYWdlciBmaWxlTWdyID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gZmlsZU1nci5jaGVja01vZGlmeShwYXRocywgTXNnQm94LmdldERlZmF1bHRTaGVsbCgpKTsKLQotCQkJLy8gbWFrZSBzdXJlIGFsbCB0aGUgZmlsZXMgYXJlIHVwZGF0YWJsZQkJCQotCQkJTGlzdCByZWFkb25seUZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKyApIHsKLQkJCQlGaWxlIGYgPSBuZXcgRmlsZShwYXRoc1tpXSk7Ci0JCQkJaWYgKCBmLmV4aXN0cygpICYmICFmLmNhbldyaXRlKCkgKSB7Ci0JCQkJCXJlYWRvbmx5RmlsZXMuYWRkKHBhdGhzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmICggcmVhZG9ubHlGaWxlcy5zaXplKCkgPiAwICkgewotCQkJCVN0cmluZyB0aXRsZSA9IEltcG9ydFJlc291cmNlcy5GaWxlTW9kaWZ5Q2hlY2tlcl9DaGVja291dF9mYWlsZWRfdGl0bGU7IAotCQkJCVN0cmluZyBtc2cgPSBJbXBvcnRSZXNvdXJjZXMuRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX21zZzsgCi0JCQkJaWYgKCBuZXcgTXNnRGlhbG9nKEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkpLmRpc3BsYXlQcm9tcHQodGl0bGUsIG1zZykgKSB7Ci0JCQkJCXJldHVybiBjaGVja01vZGlmeShyZWFkb25seUZpbGVzKTsKLQkJCQl9Ci0JCQl9CQkKLQkJCXJldHVybiBzdGF0dXM7Ci0JCQkKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRJZCgpLCAwLCBlLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gIiIgOiBlLmdldE1lc3NhZ2UoKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgbW9kaWZpY2F0aW9uIHN0YXR1cyBvZiB0aGUgZ2l2ZW4gbGlzdCBvZiBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgc3luY0V4ZWNDaGVja01vZGlmeShmaW5hbCBMaXN0IG1vZGlmaWVkRmlsZXMpIHsKLQkJZmluYWwgSVN0YXR1c1tdIHJldCA9IG5ldyBJU3RhdHVzWzFdOwotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmV0WzBdID0gRmlsZU1vZGlmeUNoZWNrZXIuY2hlY2tNb2RpZnkobW9kaWZpZWRGaWxlcyk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gcmV0WzBdOwotCX0KLQkKLQkvKioKLQkgKiBSZXRydW5zIHRoZSBtb2RpZmllZCBmaWxlIGxpc3Qgb2YgdGhlIGdpdmVuIHJlc291cmNlIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TW9kaWZpZWRGaWxlcyhSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQlMaXN0IHJldCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHJlc291cmNlU2V0LmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5pc01vZGlmaWVkKCkpIHsKLQkJCQlyZXQuYWRkKHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0xpYnJhcnlEaWZmTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0xpYnJhcnlEaWZmTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzODljZDdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9MaWJyYXJ5RGlmZk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLQotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gbWV0aG9kIGVsZW1lbnRzIGluIHRoZSBjdXJyZW50IGxpYnJhcnkgYW5kCi0gKiB0aG9zZSB0aGF0IHdpbGwgYmUgaW1wb3J0ZWQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5RGlmZk1hbmFnZXIgewotCi0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGJhc2VMaWJyYXJ5OwotCi0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGltcG9ydExpYnJhdHk7Ci0KLQkvLyBNYXAgb2YgdWlkIHRvIEVsZW1lbnREaWZmVHJlZSwgdGhlIHJvb3Qgb2YgdGhlIEVsZW1lbnREaWZmVHJlZSBpcyB0aGUKLQkvLyBsaWJyYXJ5LgotCXByaXZhdGUgTWFwIGRpZmZFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIE1hcCBvZiB1aWQgdG8gZWxlbWVudCBmb3IgaW1wb3J0IGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLQlwcml2YXRlIE1hcCBpbXBvcnRFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIGlkIHRvIGVsZW1lbnQgbWFwIG9mIHRoZSBjdXJyZW50IGxpYnJhcnkuCi0JcHJpdmF0ZSBNYXAgY3VycmVudEVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gVGhlIGRpZmYgdHJlZS4KLQlFbGVtZW50RGlmZlRyZWUgcm9vdERpZmZUcmVlID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZyA9IEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExpYnJhcnlEaWZmTWFuYWdlcihNZXRob2RMaWJyYXJ5IGJhc2VMaWJyYXJ5LAotCQkJTWV0aG9kTGlicmFyeSBpbXBvcnRMaWJyYXR5KSB7Ci0JCXRoaXMuYmFzZUxpYnJhcnkgPSBiYXNlTGlicmFyeTsKLQkJdGhpcy5pbXBvcnRMaWJyYXR5ID0gaW1wb3J0TGlicmF0eTsKLQotCQlyb290RGlmZlRyZWUgPSBuZXcgRWxlbWVudERpZmZUcmVlKGJhc2VMaWJyYXJ5LCBpbXBvcnRMaWJyYXR5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbXBvcnQgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRJbXBvcnRpbmdMaWJyYXJ5KCkgewotCQlyZXR1cm4gdGhpcy5pbXBvcnRMaWJyYXR5OwotCX0KLQotCS8qKgotCSAqIEJ1aWxkcyB0aGUgZGlmZmVyZW5jZSB0cmVlLgotCSAqLwotCXB1YmxpYyBFbGVtZW50RGlmZlRyZWUgYnVpbGREaWZmVHJlZSgpIHsKLQkJLy8gQnVpbGQgdGhlIHVpZCB0byBlbGVtZW50IG1hcCBmb3IgdGhlIGltcG9ydCBsaWJyYXJ5LgotCQlidWlsZFVJRE1hcChpbXBvcnRMaWJyYXR5LmVDb250ZW50cygpLCBpbXBvcnRFbGVtZW50TWFwLCB0cnVlLCBmYWxzZSk7Ci0KLQkJYnVpbGRVSURNYXAoYmFzZUxpYnJhcnkuZUNvbnRlbnRzKCksIGN1cnJlbnRFbGVtZW50TWFwLCB0cnVlLCB0cnVlKTsKLQotCQkvLyBHZXQgYWxsIHRoZSBzeXN0ZW0gcGFja2FnZXMgaW4gZWFjaCBwbHVnLWluIHNvIHdlIGNhbiBmaWx0ZXIgb3V0Ci0JCS8vIHRob3NlIHBhY2thZ2VzIHdoZW4gY29tcGFyaW5nIHRoZSBsaWJyYXJpZXMuCi0KLQkJLy8gSXRlcmF0ZSB0aGUgZWxlbWVudCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5LCBhbmQgYnVpbGQgYSBkaWZmIHRyZWUgYnkKLQkJLy8gY29tcGFyaW5nIHRvIHRoZSBpbXBvcnQgbGlicmFyeS4KLQkJTGlzdCBwbHVnaW5zID0gYmFzZUxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJTGlzdCBzeXN0ZW1QYWNrYWdlcyA9IFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMocGx1Z2luKTsKLQkJCQotCQkJLy8gY29udGVudCBjYXRlZ29yeSBwYWNrYWdlcyBzaG91bGQgYmUgaW5jbHVkZWQgaW50byB0aGUgZGlmZiB0cmVlIAotCQkJLy8gb3RoZXJ3aXNlIHRoZSBjYXRlZ29yeSBpbmZvcm1hdGlvbiB3aWxsIGJlIGxvc3QKLQkJCUxpc3QgY2F0ZWdvcnlMaXN0ID0gVG5nVXRpbC5nZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlcyhwbHVnaW4pOwotCQkJZm9yICggSXRlcmF0b3IgaXRjID0gY2F0ZWdvcnlMaXN0Lml0ZXJhdG9yKCk7IGl0Yy5oYXNOZXh0KCk7ICkgewotCQkJCU9iamVjdCBvID0gaXRjLm5leHQoKTsKLQkJCQlpZiAoIHN5c3RlbVBhY2thZ2VzLmNvbnRhaW5zKG8pICkgewotCQkJCQlzeXN0ZW1QYWNrYWdlcy5yZW1vdmUobyk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyB0aGUgcm9vdCBjdXN0b21jYXRlZ290eSBwYWNrYWdlIG5lZWRzIHRvIGJlIGluY2x1ZGVkIGludG8gdGhlIGRpZmYgdHJlZQotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCBzeXN0ZW1QYWNrYWdlcy5zaXplKCkgKSB7Ci0JCQkJTWV0aG9kUGFja2FnZSBwa2cgPSAoTWV0aG9kUGFja2FnZSlzeXN0ZW1QYWNrYWdlcy5nZXQoaSk7Ci0JCQkJaWYgKCBUbmdVdGlsLmlzUm9vdEN1dG9tQ2F0ZWdvcnlQYWNrYWdlKHBrZykgKSB7Ci0JCQkJCXN5c3RlbVBhY2thZ2VzLnJlbW92ZShwa2cpOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgewotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBCdWlsZCB0aGUgZGlmZiB0cmVlIGJ5IGl0ZXJhdGluZyB0aGUgY3VycmVudCBsaWJyYXJ5LgotCQkJaXRlcmF0ZUVsZW1lbnQocGx1Z2luLCByb290RGlmZlRyZWUsIHN5c3RlbVBhY2thZ2VzKTsKLQkJfQotCi0JCUxpc3QgY29uZmlncyA9IGJhc2VMaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29uZmlncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0KLQkJCS8vIEJ1aWxkIHRoZSBkaWZmIHRyZWUgYnkgaXRlcmF0aW5nIHRoZSBjdXJyZW50IGxpYnJhcnkuCi0JCQlpdGVyYXRlRWxlbWVudChjb25maWcsIHJvb3REaWZmVHJlZSwgbmV3IEFycmF5TGlzdCgpKTsKLQkJfQotCi0JCS8vIFByb2Nlc3MgdGhlIG5ldyBlbGVtZW50cyBpbiB0aGUgaW1wb3J0IGxpYnJhcnkgYW5kIGFkZCB0aGVtIHRvIHRoZQotCQkvLyBkaWZmIHRyZWUuCi0JCWhhbmRsZU5ld0VsZW1lbnRzKGltcG9ydExpYnJhdHkpOwotCi0JCXJldHVybiByb290RGlmZlRyZWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlmZmVybmVjZSB0cmVlLgotCSAqLwotCXB1YmxpYyBFbGVtZW50RGlmZlRyZWUgZ2V0RGlmZlRyZWUoKSB7Ci0JCXJldHVybiByb290RGlmZlRyZWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlmZmVybmVjZSBtYXAuCi0JICovCi0JcHVibGljIE1hcCBnZXREaWZmVHJlZU1hcCgpIHsKLQkJcmV0dXJuIGRpZmZFbGVtZW50TWFwOwotCX0KLQotCS8qKgotCSAqIEl0ZXJhdGVzIHRoZSBlbGVtZW50IGluIHRoZSBjdXJyZW50IGxpYnJhcnkgYW5kIGJ1aWxkIGEgZGlmZiB0cmVlIGJ5Ci0JICogY29tcGFyaW5nIHRvIHRoZSBpbXBvcnQgbGlicmFyeS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaXRlcmF0ZUVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJRWxlbWVudERpZmZUcmVlIGRpZmZUcmVlLCBMaXN0IHN5c3RlbVBhY2thZ2VzKSB7Ci0JCWlmICghc2VsZWN0YWJsZShlbGVtZW50KSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gVXBkYXRlIHRoZSBkaWZmZWxlbWVudCBVSUQgbWFwLgotCQlpZiAoIXN5c3RlbVBhY2thZ2VzLmNvbnRhaW5zKGVsZW1lbnQpCi0JCQkJJiYgIShlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkpIHsKLQkJCVN0cmluZyB1aWQgPSBlbGVtZW50LmdldEd1aWQoKTsKLQkJCUVsZW1lbnREaWZmVHJlZSBkaWZmQ2hpbGQgPSBuZXcgRWxlbWVudERpZmZUcmVlKGVsZW1lbnQsCi0JCQkJCShNZXRob2RFbGVtZW50KSBpbXBvcnRFbGVtZW50TWFwLmdldCh1aWQpKTsKLQkJCWRpZmZFbGVtZW50TWFwLnB1dCh1aWQsIGRpZmZDaGlsZCk7Ci0JCQlkaWZmVHJlZS5hZGRDaGlsZChkaWZmQ2hpbGQpOwotCQkJZGlmZlRyZWUgPSBkaWZmQ2hpbGQ7Ci0JCX0KLQotCQkvLyBDaGVjayB3aXRoIHRoZSBpbXBvcnRpbmcgZWxlbWVudCBhbmQgY3JlYXRlIGFuIEVsZW1lbnREaWZmSW5mbyBvYmplY3QKLQkJRUxpc3QgY2hpbGRyZW4gPSBlbGVtZW50LmVDb250ZW50cygpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZSA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBjaGlsZCA9IChNZXRob2RFbGVtZW50KSBlOwotCQkJCQlpZiAoc2VsZWN0YWJsZShjaGlsZCkpIHsKLQkJCQkJCWl0ZXJhdGVFbGVtZW50KGNoaWxkLCBkaWZmVHJlZSwgc3lzdGVtUGFja2FnZXMpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGRlYnVnICkgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiRXJyb3IhICIgKyBlICsgIiBpcyBub3QgYSBNZXRob2RFbGVtZW50IG9iamVjdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIElmIHRoZXJlIGFyZSBuZXdseSBhZGRlZCBlbGVtZW50cyBpbiB0aGUgaW1wb3J0aW5nIGxpYnJhcnksIGFkZCB0aGUgbmV3Ci0JICogZWxlbWVudHMgaW50byB0aGUgcGFyZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZU5ld0VsZW1lbnRzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoIXNlbGVjdGFibGUoZWxlbWVudCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChpc05ld0VsZW1lbnQoZWxlbWVudCkpIHsKLQkJCS8vIFRoaXMgaXMgYSBuZXcgZWxlbWVudCwgZmluZCB0aGUgcGFyZW50IGluIHRoZSBiYXNlIGxpYnJhcnkuCi0JCQlNZXRob2RFbGVtZW50IHBhcmVudCA9IChNZXRob2RFbGVtZW50KSBlbGVtZW50LmVDb250YWluZXIoKTsKLQkJCXdoaWxlIChpc05ld0VsZW1lbnQocGFyZW50KSkgewotCQkJCWVsZW1lbnQgPSBwYXJlbnQ7Ci0JCQkJcGFyZW50ID0gKE1ldGhvZEVsZW1lbnQpIHBhcmVudC5lQ29udGFpbmVyKCk7Ci0JCQl9Ci0KLQkJCS8vIEFsd2F5cyBtZXJnZSBsaWJyYXkgcGx1Z2lucyBldmVuIGl0J3MgZnJvbSBhIGRpZmZlcmVudCBsaWJyYXJ5LgotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQlwYXJlbnQgPSBiYXNlTGlicmFyeTsKLQkJCX0KLQotCQkJLy8gTmVlZCB0byBmaW5kIHRoZSBwYXJlbnQgZWxlbWVudCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5IHNvIHRoYXQgd2UKLQkJCS8vIGtub3cgd2hlcmUgdG8gYWRkIHRoZSBuZXcgZWxlbWVudC4KLQkJCU1ldGhvZEVsZW1lbnQgbGliX3BhcmVudCA9IChNZXRob2RFbGVtZW50KSBjdXJyZW50RWxlbWVudE1hcAotCQkJCQkuZ2V0KHBhcmVudC5nZXRHdWlkKCkpOwotCQkJaWYgKGxpYl9wYXJlbnQgPT0gbnVsbCkgewotCQkJCWxpYl9wYXJlbnQgPSBiYXNlTGlicmFyeTsKLQkJCX0KLQkJCUVsZW1lbnREaWZmVHJlZSBlbGVtZW50RGlmZlRyZWUgPSBuZXcgRWxlbWVudERpZmZUcmVlKG51bGwsCi0JCQkJCWVsZW1lbnQsIGxpYl9wYXJlbnQpOwotCi0JCQkvLyBGaW5kIHRoZSBwYXJlbnQgZGlmZiB0cmVlLgotCQkJRWxlbWVudERpZmZUcmVlIHBhcmVudERpZmZUcmVlID0gbnVsbDsKLQkJCXdoaWxlICgocGFyZW50RGlmZlRyZWUgPT0gbnVsbCkgJiYgKHBhcmVudCAhPSBudWxsKSkgewotCQkJCXBhcmVudERpZmZUcmVlID0gKEVsZW1lbnREaWZmVHJlZSkgZGlmZkVsZW1lbnRNYXAuZ2V0KHBhcmVudAotCQkJCQkJLmdldEd1aWQoKSk7Ci0JCQkJcGFyZW50ID0gKE1ldGhvZEVsZW1lbnQpIHBhcmVudC5lQ29udGFpbmVyKCk7Ci0JCQl9Ci0KLQkJCWlmIChwYXJlbnREaWZmVHJlZSA9PSBudWxsKSB7Ci0JCQkJcGFyZW50RGlmZlRyZWUgPSByb290RGlmZlRyZWU7Ci0JCQl9Ci0KLQkJCXBhcmVudERpZmZUcmVlLmFkZENoaWxkKGVsZW1lbnREaWZmVHJlZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBJdGVyYXRlIHRoZSBjaGlsZHJlbi4KLQkJCUxpc3QgY2hpbGRyZW4gPSBlbGVtZW50LmVDb250ZW50cygpOwotCQkJZm9yIChJdGVyYXRvciBpdGMgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGMuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdGMubmV4dCgpOwotCQkJCWhhbmRsZU5ld0VsZW1lbnRzKGUpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXdFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuICFjdXJyZW50RWxlbWVudE1hcC5jb250YWluc0tleShlbGVtZW50LmdldEd1aWQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVUlETWFwKExpc3QgZWxlbWVudHMsIE1hcCBlbGVtZW50VUlETWFwLCBib29sZWFuIHJlY3Vyc2l2ZSwgYm9vbGVhbiBmdWxsKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gaXQubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBlOwotCQkJCWlmIChzZWxlY3RhYmxlKGVsZW1lbnQpIHx8IGZ1bGwpIHsKLQkJCQkJU3RyaW5nIHVpZCA9IGVsZW1lbnQuZ2V0R3VpZCgpOwotCQkJCQllbGVtZW50VUlETWFwLnB1dCh1aWQsIGVsZW1lbnQpOwotCi0JCQkJCWlmIChyZWN1cnNpdmUpIHsKLQkJCQkJCWJ1aWxkVUlETWFwKGVsZW1lbnQuZUNvbnRlbnRzKCksIGVsZW1lbnRVSURNYXAsCi0JCQkJCQkJCXJlY3Vyc2l2ZSwgZnVsbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKCAhKGUgaW5zdGFuY2VvZiBQb2ludCB8fCBlIGluc3RhbmNlb2YgRGltZW5zaW9uKSApewotCQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkJIkltcG9ydCBlcnJvci4gIiArIGUgKyAiIGlzIG5vdCBhIE1ldGhvZEVsZW1lbnQgb2JqZWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIG1ldGhvZCBlbGVtZW50IGlzIHNlbGVjdGFibGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2VsZWN0YWJsZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeQotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4KLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZQotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBleGlzdGluZyBtZXRob2QgZWxlbWVudCBnaXZlbiBieSB0aGUgZ3VpZC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRFeGlzdGluZ0VsZW1lbnQoU3RyaW5nIGd1aWQpIHsKLQkJcmV0dXJuIChNZXRob2RFbGVtZW50KWN1cnJlbnRFbGVtZW50TWFwLmdldChndWlkKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9MaWJyYXJ5SW1wb3J0TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0xpYnJhcnlJbXBvcnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIwYTg2YTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0xpYnJhcnlJbXBvcnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuRGlhZ3JhbUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGltcG9ydGluZyBvZiBhIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5SW1wb3J0TWFuYWdlciB7Ci0KLQlwcml2YXRlIE1hcCByZW5hbWVFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIE1hcCBzZXRFbGVtZW50TWFwID0gbnVsbDsKLQotCXByaXZhdGUgTGlicmFyeURpZmZNYW5hZ2VyIGRpZmZNZ3I7Ci0JcHJpdmF0ZSBFbGVtZW50RGlmZlRyZWUgcm9vdFRyZWU7Ci0KLQkvL3Byb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IG51bGw7Ci0KLQkvL3Byb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBhZmNwID0gbnVsbDsKLQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBiYXNlTGlicmFyeSA9IG51bGw7Ci0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGltcG9ydGluZ0xpYnJhcnkgPSBudWxsOwotCi0JLy8gZ3VpZCBvZiByZXBsYWNlZCBlbGVtZW50IGlkIHRvIHRoZSBlbGVtZW50IGluIHRoZSBiYXNlIGxpYnJhcnkKLQkvLyB3ZSBuZWVkIHRoaXMgdG8gcmVkaXJlY3QgdGhlIHJlZmVyZW5jZSBvZiBuZXcgZWxlbWVudHMgZnJvbSB0aGUgaW1wb3J0aW5nCi0JLy8gbGlicmF0eSB0byB0aGUgYmFzZSBsaWJyYXJ5Ci0JcHJpdmF0ZSBNYXAgcmVwbGFjZWRFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIGtlZXAgdGhlIG5ldyBlbGVtZW50cywgd2UgbmVlZCB0byBpdGVyYXRlIHRoZWlyIGZlYXR1cmUgdmFsdWUgYW5kCi0JLy8gcmVkaXJlY3QgdGhlIHZhbGV1IGVsZW1lbnQKLQkvLyBmcm9tIHRoZSBpbXBvcnRpbmcgbGlicmFyeSB0byB0aGUgYmFzZSBsaWJyYXJ5Ci0JcHJpdmF0ZSBMaXN0IG5ld0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkvLyBkZWxldGVkIGVsZW1lbnRzLAotCXByaXZhdGUgTGlzdCBkZWxldGVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGRlYnVnID0gSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQotCS8vIGxpc3Qgb2YgdXNlciBzZWxlY3RlZCBpdGVtcyB0byBiZSBpbXBvcnRlZAotCUxpc3QgY2hlY2tlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JLy8gZmxhZyB0byBpbmRpY2F0ZSB0aGUgZmlsZSBjaGVvdXQgc3RhdHVzCi0JSVN0YXR1cyBmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IG51bGw7Ci0JCi0JLy8gcmVzb3VyY2UgZmlsZSBwYXRoIGZvciBuZXcgcmVzb3J1Y2VzCi0JTGlzdCBuZXdSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JUmVzb3VyY2VTY2FubmVyIHJlc1NjYW5uZXI7Ci0JCi0JcHJpdmF0ZSBEaWFncmFtSGFuZGxlciBkaWFncmFtSGFuZGxlcjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5SW1wb3J0TWFuYWdlcihMaWJyYXJ5RGlmZk1hbmFnZXIgZGlmZk1nciwKLQkJCUxpc3QgY2hlY2tlZEl0ZW1zKSB7Ci0JCXRoaXMuZGlmZk1nciA9IGRpZmZNZ3I7Ci0JCXRoaXMucm9vdFRyZWUgPSBkaWZmTWdyLmdldERpZmZUcmVlKCk7Ci0JCQotCQlpZiAoIGNoZWNrZWRJdGVtcyAhPSBudWxsICkgewotCQkJLy8gY2hlY2tlZExpc3QgY29udGFpbnMgYSBsaXN0IG9mIEVsZW1lbnREaWZmVHJlZSBvYmplY3RzCi0JCQkvLyBnZXQgdGhlIHBhY2thZ2VzIGFzIHdlbGwKLQkJCXRoaXMuY2hlY2tlZExpc3QuYWRkQWxsKGNoZWNrZWRJdGVtcyk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hlY2tlZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJRWxlbWVudERpZmZUcmVlIGRpZmZUcmVlID0gKEVsZW1lbnREaWZmVHJlZSkgaXQubmV4dCgpOwotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IGRpZmZUcmVlLmdldEJhc2VFbGVtZW50KCk7Ci0JCQkJaWYgKCBlICE9IG51bGwgKSB7Ci0JCQkJCWNoZWNrZWRMaXN0LmFkZChlKTsKLQkJCQl9Ci0JCQkJCQkJCQotCQkJCWlmICggZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgKSB7Ci0JCQkJCUxpYnJhcnlVdGlsLmdldEFsbENoaWxkUGFja2FnZXMoKE1ldGhvZFBhY2thZ2UpZSwgY2hlY2tlZExpc3QpOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBhbHNvIGluY2xkdWUgdGhlIGhpZGRlbiByb290IGN1c3RvbSBwYWNrYWdlIGlmIHRoZSBwYWNrYWdlIGlzIHRoZSBDdXN0b21DYXRlZ29yaWVzIHBhY2thZ2UKLQkJCQkvLyAxNTA4OTUgLSBJbXBvcnQgQ29uZmlnOiBDdXN0b21DYXRlZ29yeSBkaWQgbm90IHN5bmMgdXAgYnkgaW1wb3J0Ci0JCQkJaWYgKCBlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSApIHsKLQkJCQkJTGlzdCBjaGlsZHJlbiA9ICgoTWV0aG9kUGFja2FnZSllKS5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCQkJCWlmICggY2hpbGRyZW4uc2l6ZSgpID09IDEgKSB7Ci0JCQkJCQlNZXRob2RQYWNrYWdlIHBrZyAgPSAoTWV0aG9kUGFja2FnZSljaGlsZHJlbi5nZXQoMCk7Ci0JCQkJCQlpZiAoIFRuZ1V0aWwuaXNSb290Q3V0b21DYXRlZ29yeVBhY2thZ2UocGtnKSApIHsKLQkJCQkJCQljaGVja2VkTGlzdC5hZGQocGtnKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQllID0gZGlmZlRyZWUuZ2V0SW1wb3J0RWxlbWVudCgpOwotCQkJCWlmICggZSAhPSBudWxsICkgewotCQkJCQljaGVja2VkTGlzdC5hZGQoZSk7Ci0JCQkJfQotCQkJCQotCQkJCWlmICggZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgKSB7Ci0JCQkJCUxpYnJhcnlVdGlsLmdldEFsbENoaWxkUGFja2FnZXMoKE1ldGhvZFBhY2thZ2UpZSwgY2hlY2tlZExpc3QpOwotCQkJCX0KLQotCQkJCQotCQkJCS8vIGZvciBuZXcgaXRlbSwgYWRkIGFsbCB0aGUgc3ViIHBhY2thZ2VzCi0JCQkJaWYgKCBkaWZmVHJlZS5pc05ldygpICkgewotCQkJCQlpZiAoIGUgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gKSB7Ci0JCQkJCQljaGVja2VkTGlzdC5hZGRBbGwoTGlicmFyeVV0aWwuZ2V0QWxsUGFja2FnZXMoKE1ldGhvZFBsdWdpbillKSk7Ci0JCQkJCX0gZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlICkgewotCQkJCQkJTGlicmFyeVV0aWwuZ2V0QWxsQ2hpbGRQYWNrYWdlcygoTWV0aG9kUGFja2FnZSllLCBjaGVja2VkTGlzdCk7Ci0JCQkJCX0gCi0JCQkJfQotCQkJfQotCQkJCi0JCX0gZWxzZSB7Ci0JCQljaGVja2VkTGlzdCA9IG51bGw7Ci0JCX0KLQkJCi0JCQotCQlpbml0KCk7Ci0KLQkJLy8gR2V0IHRoZSBjdXJyZW50IGxpYnJhcnkuCi0JCWJhc2VMaWJyYXJ5ID0gKE1ldGhvZExpYnJhcnkpIHRoaXMucm9vdFRyZWUuZ2V0QmFzZUVsZW1lbnQoKTsKLQkJaW1wb3J0aW5nTGlicmFyeSA9IChNZXRob2RMaWJyYXJ5KSB0aGlzLnJvb3RUcmVlCi0JCQkJLmdldEltcG9ydEVsZW1lbnQoKTsKLQotCQkvLyBjcmVhdGUgdGhlIHJlc291cmNlIHNjYW5uZXIKLQkJcmVzU2Nhbm5lciA9IG5ldyBSZXNvdXJjZVNjYW5uZXIoCi0JCQkJTGlicmFyeVV0aWwuZ2V0TGlicmFyeVJvb3RQYXRoKGltcG9ydGluZ0xpYnJhcnkpLCAKLQkJCQlMaWJyYXJ5VXRpbC5nZXRMaWJyYXJ5Um9vdFBhdGgoYmFzZUxpYnJhcnkpKTsKLQkJCQotCQlkaWFncmFtSGFuZGxlciA9IG5ldyBEaWFncmFtSGFuZGxlcigKLQkJCQlMaWJyYXJ5VXRpbC5nZXRMaWJyYXJ5Um9vdFBhdGgoaW1wb3J0aW5nTGlicmFyeSksIAotCQkJCUxpYnJhcnlVdGlsLmdldExpYnJhcnlSb290UGF0aChiYXNlTGlicmFyeSkpOwotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0vLwkJLy8gU2V0IHRoZSB0cmVlIGNvbnRlbnQuCi0vLwkJTGlzdCBmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJZmFjdG9yaWVzLmFkZChuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLS8vCQlmYWN0b3JpZXMuYWRkKG5ldyBVbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLS8vCQlmYWN0b3JpZXMuYWRkKG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0vLwotLy8JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgKLS8vCQkJCWZhY3Rvcmllcyk7Ci0vLwkJYWZjcCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSk7Ci0vLwotLy8JCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOwotLy8KLS8vCQkvLyBDcmVhdGUgdGhlIGVkaXRpbmcgZG9tYWluIHdpdGggYSBzcGVjaWFsIGNvbW1hbmQgc3RhY2suCi0vLwkJZWRpdGluZ0RvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oYWRhcHRlckZhY3RvcnksCi0vLwkJCQljb21tYW5kU3RhY2ssIG5ldyBIYXNoTWFwKCkpOwotLy8KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTZWxlY3RlZChFbGVtZW50RGlmZlRyZWUgZGlmZlRyZWUpIHsKLQkJaWYgKCBjaGVja2VkTGlzdCA9PSBudWxsIHx8IGNoZWNrZWRMaXN0LmNvbnRhaW5zKGRpZmZUcmVlKSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlNZXRob2RFbGVtZW50IGUgPSBkaWZmVHJlZS5nZXRCYXNlRWxlbWVudCgpOwkJCi0JCWlmICggZSA9PSBudWxsICkgewotCQkJZSA9IGRpZmZUcmVlLmdldEltcG9ydEVsZW1lbnQoKTsKLQkJfQotCQkKLQkJcmV0dXJuIGlzU2VsZWN0ZWQoZSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1NlbGVjdGVkKE1ldGhvZEVsZW1lbnQgZSkgewotCQkKLQkJaWYgKCBjaGVja2VkTGlzdCA9PSBudWxsIHx8IAotCQkJCWUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gfHwgCi0JCQkJZS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gfHwgCi0JCQkJZSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKCBjaGVja2VkTGlzdC5zaXplKCkgPT0gMCApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKCBlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbiApIHsKLQkJCXJldHVybiBjaGVja2VkTGlzdC5jb250YWlucyhlKTsKLQkJfQotCQkKLQkJTWV0aG9kRWxlbWVudCBvID0gKE1ldGhvZEVsZW1lbnQpTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlKTsKLQkJaWYgKCBvID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gCi0JCQotCQlpZiAoIG8gaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5ICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBjaGVja2VkTGlzdC5jb250YWlucyhvKTsKLQl9Ci0JCi0JLyoqCi0JICogRG9lcyBtZXJnZSBmcm9tIHRoZSBpbXBvcnQgbGlicmFyeSBpbnRvIHRoZSBiYXNlIGxpYnJhcnkuCi0JICovCi0JcHVibGljIHZvaWQgZG9NZXJnZShib29sZWFuIHJlcGxhY2VFeGlzdGluZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJNZXJnaW5nIGNvbmZpZ3VyYXRpb24gLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkJCi0JCS8vIFNhdmUgdGhlIGxpYnJhcnkgcGF0aCBiZWZvcmUgZGV0YWNoaW5nIHRoZSByZXNvdXJjZS4KLQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJsb2FkaW5nIGxpYnJhcnkgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUxpYnJhcnlVdGlsLmxvYWRBbGwoYmFzZUxpYnJhcnkpOwotCQlMaWJyYXJ5VXRpbC5sb2FkQWxsKGltcG9ydGluZ0xpYnJhcnkpOwotCi0JCS8vIERldGFjaCB0aGUgbmV3IGxpYnJhcnkgZnJvbSB0aGUgY3VycmVudCByZXNvdXJjZSBzbyBpdCBjYW4gYmUKLQkJLy8gYWRkZWQgdG8gYSBuZXcgTGlicmFyeSBQcm9jZXNzb3IgaW5zdGFuY2UuCi0JCUxpYnJhcnlVdGlsLmRldGFjaEZyb21SZXNvdXJjZShpbXBvcnRpbmdMaWJyYXJ5KTsKLQotCQkvLyBmb3IgdGVzdAotCQlpbXBvcnRpbmdMaWJyYXJ5LnNldE5hbWUoIkltcG9ydGluZ0xpYjogIiArIGltcG9ydGluZ0xpYnJhcnkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvY2VzcyBjb25maWd1cmF0aW9uIGRpZmYgdHJlZSAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gYmVmb3JlIHByb2Nlc3NpbmcsIHNhdmUgdGhlIG9yaWdpbmFsIHJlc291cmNlcyAKLQkJLy8gc28gdGhhdCB3ZSBjYW4gZmluZCB0aGUgbmV3bHkgYWRkZWQgcmVzb3VyY2VzCi0JCUxpc3Qgb2xkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgKLQkJCQliYXNlTGlicmFyeS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKTsKLQkJCi0JCS8vIEl0ZXJhdGUgZWFjaCBlbGVtZW50IGFuZCB0aGUgbmVjZXNzYXJ5IG1lcmdlcy4KLQkJcHJvY2Vzc0RpZmZUcmVlKHJvb3RUcmVlLCByZXBsYWNlRXhpc3RpbmcpOwotCi0JCWhhbmRsZVNldEVsZW1lbnRzKCk7Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJwZXJmb3JtIGludGVncml0eSBjaGVja2luZyAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gcGVyZm9ybSBhbiBpbnRlZ3JpdHkgY2hlY2sgb2YgdGhlIGxpYnJhcnkKLQkJLy8gZml4IGFueSBkYW5mbGluZyBlbGVtZW50cyBkdWUgdG8gcGFja2FnZS9lbGVtZW50IHJlcGxhY2VtZW50Ci0JCWRvSW50ZWdyaXR5Q2hlY2soKTsKLQotCQkvLyBub3cgcHJvY2VzcyB0aGUgbmV3IHJlc291cmNlcyBhbmQgbWFyayB0aGVtIGRpcnN0IHNvIHRoYXQgCi0JCS8vIHRoZSBkYXRhIHdpbGwgYmUgc2F2ZWQgYWdhaW4uIAotCQkvLyBUaGlzIHN0ZXAgaXMgY3JpdGljYWwgc2luY2UgdGhlIGZpcnN0IHJvdW5kIG9ubHkgY3JlYXRlZCB0aGUgZGF0YSBzdHJ1Y3R1cmUKLQkJLy8gc29tZSBvZiB0aGUgY3Jvc3MtcmVmZXJlbmNlZCBlbGVtZW50cyBtaWdodCBiZSBsb3N0IG9uIHRoZSBmaXJzdCBzYXZpbmcKLQkJLy8gZm9yIGV4YW1wbGUsIHdoZW4gY3JlYXRlIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gd2l0aCByZWZlcmVuY2VzIHRvIGEgbmV3IHBsdWdpbiwKLQkJLy8gd2hpY2ggYXJlIG5vdCBzYXZlZCB5ZXQsIHRob3NlIHJlZmVyZW5jZXMgd2lsbCBiZSBsb3N0LgotCQkvLyAxNDU4OTEgLSBJbXBvcnQgQ29uZmlndXJhdGlvbjogZGVmYXVsdCBjb25maWcgaXMgbG9zcyBhZnRlciBpbXBvcnQKLQkJaGFuZGxlTmV3UmVzb3VyY2VzKG9sZFJlc291cmNlcyk7Ci0JCQotCQloYW5kbGVOYW1lUmVwbGFjZShyZW5hbWVFbGVtZW50TWFwKTsKLQkJCi0JCWRpYWdyYW1IYW5kbGVyLnBvc3RSZWdpc3RlckVsZW1lbnRzKCk7Ci0JCQotCQkvLyBnZXQgYWxsIHRoZSBtb2RpZmllZCByZXNvdXJjZXMgYW5kIHJlc291cmNlIGZpbGVzCi0JCS8vIGNoZWNrIENNIGZvciBmaWxlIGNoZWNrLW91dAotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJjaGVjayBvdXQgZmlsZXMgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJLy8gY2xlYXIgcmVzb3VyY2VzIGZvciBkZWxldGVkIGVsZW1lbnRzCi0JCWRlbGV0ZVJlc29ydWNlcygpOwotCQotCQljaGVja01vZGlmaWVkRmlsZXMoKTsKLQkJCQkKLQkJaWYgKCBmaWxlQ2hlY2tlZE91dFN0YXR1cy5pc09LKCkgKSB7Ci0JCSAKLQkJCWlmICggZGVidWcgKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJjb3B5aW5nIHJlc291cmNlIGZpbGVzIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXNTY2FubmVyLmV4ZWN1dGUoKTsKLQkJCWRpYWdyYW1IYW5kbGVyLmV4ZWN1dGUoKTsKLQotCQkJaWYgKCBkZWJ1ZyApIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNhdmluZyBsaWJyYXJ5IC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCUxpYnJhcnlVdGlsLnNhdmVMaWJyYXJ5KGJhc2VMaWJyYXJ5LCBmYWxzZSwgZmFsc2UpOwotCQl9IAotCQllbHNlIHsKLQkJCWZpbGVDaGVja091dEVycm9yKCk7Ci0JCX0JCi0vLyBpZiAoIGRlYnVnICkgewotLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb3B5aW5nIHJlc291cmNlIGZpbGVzIC4uLiIpOyAvLyROT04tTkxTLTEkCi0vLyB9Ci0vLwotLy8gLy8gQ29weSB0aGUgcmVzb3VyY2UgZmlsZXMgaW4gdGhlIGN1cnJlbnQgbGlicmFyeSB0byB0aGUgbmV3IGxpYnJhcnkuCi0vLyAvLyBGb3Igc2ltcGxpY2l0eSBzYWtlLCBjb3B5IGFsbCByZXNvdXJjZSBmaWxlcyBpZiB0aGUgZmlsZXMgZG8gbm90Ci0vLyAvLyBleGlzdCBpbiB0aGUgdGFyZ2V0IGxpYnJhcnkgb3IgaWYgdGhlIGZpbGVzIGFyZSBuZXdlci4KLS8vIFN0cmluZyBpbmNsdWRlcyA9ICJyZXNvdXJjZXMvKiosICoqL3Jlc291cmNlcy8qKiI7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLyBMYXlvdXRSZXNvdXJjZXMuY29weURpcihzcmNEaXIsIGRlc3REaXIsIGluY2x1ZGVzLCBudWxsKTsKLQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJNZXJnaW5nIGNvbmZpZ3VyYXRpb24gZG9uZS4uLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZmlsZUNoZWNrT3V0RXJyb3IoKSB7Ci0JCS8vIGxvZyBlcnJvcgotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gSW1wb3J0UmVzb3VyY2VzLmltcG9ydENvbmZpZ1dpemFyZF90aXRsZTsgCi0JCQkJU3RyaW5nIG1zZyA9IEltcG9ydFJlc291cmNlcy5JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX0VSUl9JbXBvcnRfY29uZmlndXJhdGlvbjsgCi0JCQkJbmV3IE1zZ0RpYWxvZyhJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpKQotCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIGZpbGVDaGVja2VkT3V0U3RhdHVzKTsKLQkJCQl9Ci0JCX0pOwotCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNoZWNrb3V0IGZpbGVzIGZhaWxlZCAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlTmV3UmVzb3VyY2VzKExpc3Qgb2xkUmVzb3VyY2VzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBiYXNlTGlicmFyeS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpCi0JCQkJLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpaXQubmV4dCgpOwotCQkJaWYgKCAhb2xkUmVzb3VyY2VzLmNvbnRhaW5zKHJlcykgKSB7Ci0JCQkJbG9nTmV3UmVzb3VyY2UocmVzKTsKLQkJCX0KLQkJfQkKLQl9Ci0JCi0JCi0JLyoqCi0JICogUHJvY2Vzc2VzIHRoZSBkaWZmIHRyZWUuIE9ubHkgbmVlZCB0byBkbyB0aGUgZmlyc3QgbGV2ZWwgc2luY2UgdGhlCi0JICogcmVwbGFjZSBvciBhZGQgaXMgZG9uZSBhdCB0aGUgbWV0aG9kIHBhY2thZ2UgbGV2ZWwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NEaWZmVHJlZShFbGVtZW50RGlmZlRyZWUgZGlmZlRyZWUsCi0JCQlib29sZWFuIHJlcGxhY2VFeGlzdGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChkaWZmVHJlZSA9PSBudWxsIHx8ICFpc1NlbGVjdGVkKGRpZmZUcmVlKSApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFRoZXJlIGlzIGEgY2hhbmdlLgotCQlpbnQgc3RhdGUgPSBkaWZmVHJlZS5nZXREaWZmU3RhdGUoKTsKLQkJTWV0aG9kRWxlbWVudCBiYXNlID0gZGlmZlRyZWUuZ2V0QmFzZUVsZW1lbnQoKTsKLQkJTWV0aG9kRWxlbWVudCBpbXAgPSBkaWZmVHJlZS5nZXRJbXBvcnRFbGVtZW50KCk7Ci0JCWlmIChyZXBsYWNlRXhpc3RpbmcgJiYgKHN0YXRlID09IEVsZW1lbnREaWZmVHJlZS5ESUZGX1NUQVRFX0NIQU5HRUQpICkgewotCi0JCQlpZiAoIChiYXNlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikpIHsKLQkJCQkvLyByZXBsYWNlIHRoZSBjb25maWd1cmF0aW9uIGJ5IGFkZGluZyB0aGUgbmV3IHBhY2thZ2VzIGludG8gdGhlCi0JCQkJLy8gY29uZmlndXJhdGlvbgotCQkJCWRvUmVwbGFjZUNvbmZpZ3VyYXRpb24oKE1ldGhvZENvbmZpZ3VyYXRpb24pIGJhc2UsIChNZXRob2RDb25maWd1cmF0aW9uKSBpbXApOwotCQkJfQotCQkJZWxzZSBpZiAoIChiYXNlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJCS8vIFJlcGxhY2UgdGhlIHBsdWdpbiB3aXRoIHRoZSBub24tcGFja2FnZSBmZWF0dXJlcy4KLQkJCQlkb1JlcGxhY2VQbHVnaW4oKE1ldGhvZFBsdWdpbikgYmFzZSwgKE1ldGhvZFBsdWdpbikgaW1wKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCAoYmFzZSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpKSB7Ci0JCQkJLy8gUmVwbGFjZSB0aGUgcGFja2FnZS4KLQkJCQlkb1JlcGxhY2VQYWNrYWdlKChNZXRob2RQYWNrYWdlKSBiYXNlLCAoTWV0aG9kUGFja2FnZSkgaW1wKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoZGVidWcgKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2hhdCBpcyB0aGlzOiAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoYmFzZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKHN0YXRlID09IEVsZW1lbnREaWZmVHJlZS5ESUZGX1NUQVRFX05FVykgewotCQkJLy8gQWRkIHRoZSBuZXcgcGFja2FnZSBmcm9tIGltcG9ydCBsaWJyYXJ5LgotCQkJZG9BZGQoZGlmZlRyZWUuZ2V0QmFzZVBhcmVudEVsZW1lbnQoKSwgZGlmZlRyZWUuZ2V0SW1wb3J0RWxlbWVudCgpKTsgCi0JCX0KLQotCQkvLyBQcm9jZXNzIHRoZSBjaGlsZHJlbiByZWN1cnNpdmVseSBpZiBpdCdzIG5vdCBhIG5ldyBvbmUuCi0JCWlmIChzdGF0ZSAhPSBFbGVtZW50RGlmZlRyZWUuRElGRl9TVEFURV9ORVcpIHsKLQkJCUxpc3QgY2hpbGRyZW4gPSBkaWZmVHJlZS5nZXRDaGlsZHJlbigpOwotCQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4uc2l6ZSgpID4gMCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCXByb2Nlc3NEaWZmVHJlZSgoRWxlbWVudERpZmZUcmVlKSBpdC5uZXh0KCksCi0JCQkJCQkJcmVwbGFjZUV4aXN0aW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gYnkgcmVwbGFjaW5nIHRoZSBub24tcGFja2FnZSBmZWF0dXJlcywgYW5kCi0JICogYWRkaW5nIHRoZSBuZXcgcGFja2FnZXMgaW50byB0aGUgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBvbGRPYmoKLQkgKiAgICAgICAgICAgIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gbmV3T2JqCi0JICogICAgICAgICAgICBNZXRob2RDb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvUmVwbGFjZUNvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBvbGRPYmosIE1ldGhvZENvbmZpZ3VyYXRpb24gbmV3T2JqKQotCXsKLQkJaWYgKCBpc1JlcGxhY2VkKG9sZE9iaikgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0UmVwbGFjZWQob2xkT2JqKTsKLQkJCi0JCUxpc3QgcHJvcGVydGllcyA9IG9sZE9iai5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwcm9wZXJ0aWVzLmdldChpKTsKLQkJCQkvLyBkb24ndCBkZWxldGUgb2xkIGZlYXR1cmUgdmFsdWVzCi0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gbmV3T2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQkJc2V0RmVhdHVyZVZhbHVlKG9sZE9iaiwgZmVhdHVyZSwgbmV3VmFsdWUsIGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotLy8gcHJpdmF0ZSB2b2lkIG1lcmdlRWxlbWVudExpc3QoTGlzdCBzb3VyY2UsIExpc3QgdGFyZ2V0KQotLy8gewotLy8gTGlzdCBpZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLyBmb3IgKCBJdGVyYXRvciBpdCA9IHRhcmdldC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLS8vIHsKLS8vIE1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0Lm5leHQoKTsKLS8vIGlkcy5hZGQoZS5nZXRHdWlkKCkpOwotLy8gfQotLy8KLS8vIGZvciAoIEl0ZXJhdG9yIGl0ID0gc291cmNlLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotLy8gewotLy8gTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotLy8gaWYgKCAhaWRzLmNvbnRhaW5zKGUuZ2V0R3VpZCgpKSApCi0vLyB7Ci0vLyB0YXJnZXQuYWRkKGUpOwotLy8gfQotLy8gfQotLy8gfQotCi0JLyoqCi0JICogcmVwbGFjZSB0aGUgcGx1Z2luIGZlYXR1cmVzLCBidXQgbm90IHRoZSBwbHVnaW4gb2JqZWN0IGFuZCBpdCdzIHBhY2thZ2VzCi0JICogCi0JICogQHBhcmFtIG9sZE9iagotCSAqICAgICAgICAgICAgTWV0aG9kUGx1Z2luCi0JICogQHBhcmFtIG5ld09iagotCSAqICAgICAgICAgICAgTWV0aG9kUGx1Z2luCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvUmVwbGFjZVBsdWdpbihNZXRob2RQbHVnaW4gb2xkT2JqLCBNZXRob2RQbHVnaW4gbmV3T2JqKSB7Ci0JCWlmICggaXNSZXBsYWNlZChvbGRPYmopICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXNldFJlcGxhY2VkKG9sZE9iaik7Ci0JCQotCQlMaXN0IHByb3BlcnRpZXMgPSBvbGRPYmouZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcHJvcGVydGllcy5nZXQoaSk7Ci0JCQkJaWYgKCBmZWF0dXJlICE9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlcygpICkKLQkJCQl7Ci0JCQkJCU9iamVjdCBuZXdWYWx1ZSA9IG5ld09iai5lR2V0KGZlYXR1cmUpOwotCQkJCQlzZXRGZWF0dXJlVmFsdWUob2xkT2JqLCBmZWF0dXJlLCBuZXdWYWx1ZSwgdHJ1ZSk7Ci0JCQkJfQotCQkJCS8qIE5vLCBkb24ndCBkbyB0aGlzLCBmaXggdGhlIGRpZmYgbWFuYWdlciB0byBpbmNsdWRlIHRoZSByb290IHBhY2thZ2UgaW5zdGVhZAotCQkJCSAqIDE1MDg5NSAtIEltcG9ydCBDb25maWc6IEN1c3RvbUNhdGVnb3J5IGRpZCBub3Qgc3luYyB1cCBieSBpbXBvcnQKLQkJCQllbHNlIHsKLQkJCQkJLy8gY3VzdG9tIGNhdGVnb3JpZXMgcGFja2FnZSBuZWVkcyBzcGVjaWFsIGhhbmRpbmcKLQkJCQkJLy8gd2UgbmVlZCB0byBzdGFydCB3aXRoIHRoZSByb290IGN1c3RvbSBjYXRlZ29yeSBvdGhlcndpc2UKLQkJCQkJLy8gYWxsIGNoaWxkIGNhdGVnb3JpZXMgd2lsbCBiZSBsb3N0Ci0JCQkJCU1ldGhvZFBhY2thZ2Ugb2xkUGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2Uob2xkT2JqLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxUX0NVU1RPTV9DQVRFR09SWV9QQVRIKTsKLS8vIENvbnRlbnRQYWNrYWdlIG5ld1BrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKG5ld09iaiwKLS8vIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuREVGQVVMVF9DVVNUT01fQ0FURUdPUllfUEFUSCk7Ci0JCQkJCXNldFJlcGxhY2VkKG9sZFBrZyk7Ci0JCQkJCQotCQkJCQkvLyBmaW5kIHRoZSByb290IGN1c3RvbSBjYXRlZ29yeSBhbmQgc3RhcnQgZnJvbSB0aGVyZQotCQkJCQlDdXN0b21DYXRlZ29yeSBvbGRDQyA9IFRuZ1V0aWwuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KG9sZE9iaik7Ci0JCQkJCUN1c3RvbUNhdGVnb3J5IG5ld0NDID0gVG5nVXRpbC5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkobmV3T2JqKTsKLQkJCQkJb2xkUGtnID0gKE1ldGhvZFBhY2thZ2Upb2xkQ0MuZUNvbnRhaW5lcigpOwotCQkJCQlzZXRSZXBsYWNlZChvbGRQa2cpOwotCQkJCQlkb1JlcGxhY2VFbGVtZW50KG9sZENDLCBuZXdDQyk7Ci0JCQkJfQotCQkJCSovCi0JCQl9Ci0JCX0KLQotCX0KLQotCi0KLQkvKioKLQkgKiBSZXBsYWNlcyB0aGUgYXRycmlidXRlcyBhbmQgY29udGFpbmVkIGVsZW1lbnRzLCBidXQgbm90IHRoZSBjaGlsZAotCSAqIHBhY2thZ2VzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvUmVwbGFjZVBhY2thZ2UoTWV0aG9kUGFja2FnZSBvbGRPYmosIE1ldGhvZFBhY2thZ2UgbmV3T2JqKSB7Ci0JCWlmICggaXNSZXBsYWNlZChvbGRPYmopICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXNldFJlcGxhY2VkKG9sZE9iaik7Ci0KLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVwbGFjaW5nIHBhY2thZ2UgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG9sZE9iaikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCUxpc3QgcHJvcGVydGllcyA9IG9sZE9iai5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwcm9wZXJ0aWVzLmdldChpKTsKLQkJCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkgKQotCQkJCXsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gbmV3T2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQkJc2V0RmVhdHVyZVZhbHVlKG9sZE9iaiwgZmVhdHVyZSwgbmV3VmFsdWUsIHRydWUpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLS8vIHByaXZhdGUgTWV0aG9kRWxlbWVudCBvYmpPbGQgPSBudWxsOwotLy8gcHJpdmF0ZSBNZXRob2RFbGVtZW50IG9iak5ldyA9IG51bGw7Ci0vLyBwcml2YXRlIHZvaWQgdGVzdEl0KCkgewotLy8gaWYgKCBvYmpPbGQgIT0gbnVsbCApIHsKLS8vIFN5c3RlbS5vdXQucHJpbnRsbigiT2xkIGNvbnRhaW5lciA9IiArIG9iak9sZC5lQ29udGFpbmVyKCkpOwotLy8gU3lzdGVtLm91dC5wcmludGxuKCJOZXcgY29udGFpbmVyID0iICsgb2JqTmV3LmVDb250YWluZXIoKSk7Ci0vLyBpZiAoIG9iak9sZC5lQ29udGFpbmVyKCkgPT0gbnVsbCApIHsKLS8vIFN5c3RlbS5vdXQucHJpbnRsbigib2xkIGlzIGdvbmUhIik7Ci0vLyB9Ci0vLyBpZiAoIG9iak5ldy5lQ29udGFpbmVyKCkgPT0gbnVsbCApIHsKLS8vIFN5c3RlbS5vdXQucHJpbnRsbigibmV3IGlzIGdvbmUhIik7Ci0vLyB9Ci0vLyB9Ci0vLyB9Ci0JCi0JLyoqCi0JICogcmVwbGFjZSB0aGUgZWxlbWVudCBieSByZXBsYWNpbmcgdGhlIGZlYXR1cmUgdmFsdWVzLCBidXQgZG9uJ3QgcmVwbGFjZQotCSAqIHRoZSBvYmplY3QgaWYgaXQgaXMgbWFya2VkIGFzIG5vdCByZXBsYWNlYWJsZS4gcmVjdXJzaXZlIHRoZSBmZWF0dXJlCi0JICogdmFsdWUgYW5kIHJlcGxhY2UgaXQKLQkgKiAKLQkgKiBAcGFyYW0gb2xkT2JqCi0JICogICAgICAgICAgICBNZXRob2RQbHVnaW4KLQkgKiBAcGFyYW0gbmV3T2JqCi0JICogICAgICAgICAgICBNZXRob2RQbHVnaW4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZG9SZXBsYWNlRWxlbWVudChNZXRob2RFbGVtZW50IG9sZE9iaiwgTWV0aG9kRWxlbWVudCBuZXdPYmopIHsKLQkJCi0JCS8vIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgcmVwbGFjZWQgb3Igbm90Ci0JCWlmICggaXNSZXBsYWNlZChvbGRPYmopICkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCBkaWZmTWdyLnNlbGVjdGFibGUob2xkT2JqKSApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICggIWlzU2VsZWN0ZWQob2xkT2JqKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gaWYgY29udGVudCBkZXNjcmlwdGlvbiwgY2hlY2sgaWYgaXQncyBjaGFuZ2VkIG9yIG5vdAotCQlpZiAoIChvbGRPYmogaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pICYmIChuZXdPYmogaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pICkgewotCQkJaWYgKCBMaWJyYXJ5VXRpbC5pc0lkZW50aWNhbCgoQ29udGVudERlc2NyaXB0aW9uKW9sZE9iaiwgKENvbnRlbnREZXNjcmlwdGlvbiluZXdPYmopICkgewotCQkJCWlmIChkZWJ1ZyApIHsKLQkJCQkJUmVzb3VyY2UgcmVzID0gb2xkT2JqLmVSZXNvdXJjZSgpOwotCQkJCQlpZiAoIHJlcyAhPSBudWxsICkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJJZGVudGljYWwgZWxlbWVudCBub3QgcmVwbGFjZWQ6ICIgKyByZXMuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkgKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvLyBldmVuIHRob3VnaCB0aGUgY29udGVudCBpcyB0aGUgc2FtZSwgd2Ugc3RpbGwgbmVlZCB0byBjb3B5IHRoZSByZXNvdXJjZXMKLQkJCQlzY2FuUmVzb3VyY2VzKG9sZE9iaiwgdHJ1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJfSAKLQkJfQotCQkKLQkJLy8gc2V0IHJlcGFsY2VkIGZpcnN0IHRvIGF2b2lkIGNhbGxpbmcgaW50byB0aGUgc2FtZSBvYmplY3QgcmVjdXJzaXZlbHkKLQkJc2V0UmVwbGFjZWQob2xkT2JqKTsKLQkJCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlcGxhY2luZyBlbGVtZW50ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShvbGRPYmopKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJTGlzdCBwcm9wZXJ0aWVzID0gb2xkT2JqLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHByb3BlcnRpZXMuZ2V0KGkpOwotCi0JCQkJLy8gcGFja2FnZSBzdHJ1Y3R1cmUgaXMgaGFuZGxlZCBieSB0aGUgZGlmZiB0cmVlCi0JCQkJLy8gc28gd2UgZG9uJ3QgcHJvY2VzcyB0aGUgcmVsYXRlZCBmZWF0dXJlCi0JCQkJaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlcygpCi0JCQkJCQl8fCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpIAotCQkJCQkJfHwgZmVhdHVyZS5pc0Rlcml2ZWQoKSApCi0JCQkJewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlPYmplY3QgbmV3VmFsdWUgPSBuZXdPYmouZUdldChmZWF0dXJlKTsKLQkJCQlzZXRGZWF0dXJlVmFsdWUob2xkT2JqLCBmZWF0dXJlLCBuZXdWYWx1ZSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgbmV3IHZhbHVlIGZyb20gdGhlIGltcG9ydGluZyBsaWJyYXJ5IHRvIHRoZSBvbGQgb2JqZWN0IGluIHRoZQotCSAqIGJhc2UgbGlicmFyeS4gaWYgdGhlIHZhbHVlIG9yIG9ubGUgb2YgdmFsdWVzIGFyZSBub3QgcmVwbGFjZWFibGUsIHN1YWNoCi0JICogYXMgTWV0aG9kTGlicmFyeSwgTWV0aG9kUGx1Z2luLCBNZXRob2RQYWNrYWdlLCBldGMsIHRob3NlIHZhbHVlcyBzaG91bGQKLQkgKiBiZSBzdWJzdGl0dWVkIHdpdGggdGhlIG9uZSBpbiB0aGUgb2xkIGxpYnJhcnkKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JCi0KLQlzdGF0aWMgTWV0aG9kRWxlbWVudCBuZXdDb250ID0gbnVsbDsKLQlzdGF0aWMgTWV0aG9kRWxlbWVudCBuZXdFbGVtID0gbnVsbDsKLQlwcml2YXRlIHZvaWQgc2V0RmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSwgYm9vbGVhbiBkb0RlbGV0ZSkKLQl7CQkKLQkJaWYgKCBjYW5JZ25vcmUoZmVhdHVyZSkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWJvb2xlYW4gb2xkTm90aWZ5ID0gZWxlbWVudC5lRGVsaXZlcigpOwotCQl0cnkKLQkJewotCQkJLy8gdHVybiBvZmYgbm90aWZpY2F0aW9ucyB0byBhdm9pZCBwb3NzaWJsZSBkZWFkbG9jayBvciB0aHJlYWQgaXNzdWUKLQkJCWVsZW1lbnQuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCi0JCQlpZiAoIGNhblJlc2V0KGZlYXR1cmUpICkgewotCQkJCWVsZW1lbnQuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JCQl9Ci0JCQllbHNlIGlmICggZmVhdHVyZS5pc01hbnkoKSAmJiBuZXdWYWx1ZSBpbnN0YW5jZW9mIExpc3QpCi0JCQl7Ci0JCQkJTGlzdCBvbGRWYWx1ZSA9IChMaXN0KWVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJCQlFbGVtZW50TGlzdERpZmYgZGlmZiA9IG5ldyBFbGVtZW50TGlzdERpZmYob2xkVmFsdWUsIChMaXN0KW5ld1ZhbHVlKTsKLQkJCQlpZiAoIGRvRGVsZXRlICYmIGRpZmYuZGVsZXRlZEl0ZW1zLnNpemUoKSA+IDAgKSB7Ci0JCQkJCW9sZFZhbHVlLnJlbW92ZUFsbChkaWZmLmRlbGV0ZWRJdGVtcyk7Ci0JCQkJCWxvZ1JlbW92ZWRFbGVtZW50cyhkaWZmLmRlbGV0ZWRJdGVtcyk7Ci0JCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgRGVsZXRpbmcgZmVhdHVyZSB2YWx1ZSwgZmVhdHVyZTogIiArIGZlYXR1cmUuZ2V0TmFtZSgpICsgIiwgIGVsZW1lbnQ6ICIgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkrIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICsgIiwgdmFsdWVzOiAiICsgIGRpZmYuZGVsZXRlZEl0ZW1zKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKCBkaWZmLm5ld0l0ZW1zLnNpemUoKSA+IDAgKSB7CQkJCQkKLQkJCQkJLy8gc2F2ZSB0aGUgbmV3IGVsZW1lbnRzIGFuZCBmaXggdGhlIHJlZmVyZW5jZXMgbGF0ZXIKLQkJCQkJLy8gbm90ZTogdGhlIG5ld2x5IGFkZGVkIGZlYXR1cmUgdmFsdWVzIG1pZ2h0IG5vdCBiZSBSRUFMTFkKLQkJCQkJLy8gbmV3IGVsZW1lbnQgdG8gdGhlIGJhc2UgbGlicmFyeQotCQkJCQkvLyBpdCBtaWdodCBiZSBqdXN0IGEgbmV3bHkgYWRkZWQgcmVmZXJlbmNlLCBzbyBjaGVjayBhbmQKLQkJCQkJLy8gbWFrZSBzdXJlCi0JCQkJCS8vIGlmIGl0J3Mgb2xkIGVsZW1lbnQsIGRvIHJlcGxhY2UgYWdhaW4KLQkJCQkJZm9yICggSXRlcmF0b3IgaXRuID0gZGlmZi5uZXdJdGVtcy5pdGVyYXRvcigpOyBpdG4uaGFzTmV4dCgpOyApIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgbmV3T2JqID0gKE1ldGhvZEVsZW1lbnQpaXRuLm5leHQoKTsKLQkJCQkJCQotCQkJCQkJLy8gb25seSBwcm9jZXNzIHRoZSBuZXcgb2JqZWN0IGlmIGl0J3Mgc2VsZWN0ZWQKLQkJCQkJCWlmICggaXNTZWxlY3RlZChuZXdPYmopICkgewotCQkJCQkJCU1ldGhvZEVsZW1lbnQgb2xkT2JqID0gZGlmZk1nci5nZXRFeGlzdGluZ0VsZW1lbnQobmV3T2JqLmdldEd1aWQoKSk7Ci0JCQkJCQkJaWYgKCBvbGRPYmogPT0gbnVsbCApIHsKLQkJCQkJCQkJb2xkVmFsdWUuYWRkKG5ld09iaik7Ci0JCQkJCQkJCWxvZ05ld0VsZW1lbnQobmV3T2JqKTsJCQkJCQkJCi0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJb2xkVmFsdWUuYWRkKG9sZE9iaik7Ci0JCQkJCQkJCWRvUmVwbGFjZUVsZW1lbnQob2xkT2JqLCBuZXdPYmopOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKCBkZWJ1ZyApIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICBBZGRpbmcgZmVhdHVyZSB2YWx1ZSwgZmVhdHVyZTogIiArIGZlYXR1cmUuZ2V0TmFtZSgpICsgIiwgIGVsZW1lbnQ6ICIgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkrIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICsgIiwgdmFsdWVzOiAiICsgIGRpZmYubmV3SXRlbXMpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCi0JCQkJaWYgKCBkaWZmLm9sZE5ld01hcC5zaXplKCkgPiAwICkgewotCQkJCQlmb3IgKCBJdGVyYXRvciBpdCA9IGRpZmYub2xkTmV3TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgb2xkT2JqID0gKE1ldGhvZEVsZW1lbnQpZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCQkKLQkJCQkJCS8vIG9ubHkgcHJvY2VzcyB0aGUgbmV3IG9iamVjdCBpZiBpdCdzIHNlbGVjdGVkCi0JCQkJCQlpZiAoICFpc1NlbGVjdGVkKG9sZE9iaikgKSB7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCU1ldGhvZEVsZW1lbnQgbmV3T2JqID0gKE1ldGhvZEVsZW1lbnQpZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkJCWlmICggY2FuUmVzZXQob2xkT2JqKSApIHsKLQkJCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgUmVzZXR0aW5nIGZlYXR1cmUgdmFsdWUsIGZlYXR1cmU6ICIgKyBmZWF0dXJlLmdldE5hbWUoKSArICIsICBlbGVtZW50OiAiICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkrIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICsgIiwgdmFsdWU6ICIgKyAgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUob2xkT2JqKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0KLQkJCQkJCQlFY29yZVV0aWwucmVwbGFjZShlbGVtZW50LCBmZWF0dXJlLCBvbGRPYmosIG5ld09iaik7Ci0JCQkJCQkJbG9nUmVzZXRFbGVtZW50KG5ld09iaik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWRvUmVwbGFjZUVsZW1lbnQob2xkT2JqLCBuZXdPYmopOyAKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkKLQkJCXsKLQkJCQkvLyBpZiB0aGUgb2xkIGFuZCBuZXcgZWxlbWVudCBhcmUgdGhlIHNhbWUsCi0JCQkJLy8gb25seSByZXBsYWNlIHRoZSBmZWF0dXJlIHZhbHVlCi0JCQkJTWV0aG9kRWxlbWVudCBvID0gKE1ldGhvZEVsZW1lbnQpZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQkJCU1ldGhvZEVsZW1lbnQgbiA9IChNZXRob2RFbGVtZW50KW5ld1ZhbHVlOwotCQkJCQotCQkJCS8vIG9ubHkgcHJvY2VzcyB0aGUgbmV3IG9iamVjdCBpZiBpdCdzIHNlbGVjdGVkCi0JCQkJaWYgKCAobyA9PSBudWxsIHx8IGlzU2VsZWN0ZWQobykpICYmIGlzU2VsZWN0ZWQobikgKSB7Ci0KLQkJCQkJaWYgKCBkZWJ1ZyApIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICBSZXBsYWNpbmdpbmcgZmVhdHVyZSB2YWx1ZSwgZmVhdHVyZTogIiArIGZlYXR1cmUuZ2V0TmFtZSgpICsgIiwgIGVsZW1lbnQ6ICIgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkrIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICsgIiwgdmFsdWU6ICIgKyAgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUobykpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkKLQkJCQkJaWYgKCBuZXdWYWx1ZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbiApIHsKLQkJCQkJCS8vIGFsd2F5cyByZXBsYWNlIGNvbnRlbnQgZGVzY3JpcHRpb24gKG5vdCByZXNldCkgdG8KLQkJCQkJCS8vIHJlc2VydmUgdGhlIGV4aXN0aW5nIHJlc291cmNlICh4bWkgZmlsZSkKLQkJCQkJCS8vIHNpbmNlIHRoZSBjb250ZW50RGVzY3JpcHRpb24gaXMgdW5pcXVlIHRoZSBhIG1ldGhvZAotCQkJCQkJLy8gZWxlbWVudCwgc28gd2UgZG9uJ3QgbmVlZCB0byBjb21wYXJlIHRoZSBndWlkCi0JCQkJCQkJCQkJCQkKLQkJCQkJCS8vIGlmIGJvdGggb2JqZWN0IGhhcyBubyBjb250YWluZXIsIHRoZXJlIGlzIG5vIHN1Y2gKLQkJCQkJCS8vIGRlc2NyaXB0aW9uLCBpZ25vcmUgaXQKLQkJCQkJCWlmICggby5lQ29udGFpbmVyKCkgIT0gbnVsbCB8fCBuLmVDb250YWluZXIoKSAhPSBudWxsICkgewotCQkJCQkJCWlmICggby5lQ29udGFpbmVyKCkgPT0gbnVsbCApIHsKLQkJCQkJCQkJZWxlbWVudC5lU2V0KGZlYXR1cmUsIG8pOwotCQkJCQkJCX0KLQkJCQkJCQlkb1JlcGxhY2VFbGVtZW50KG8sIG4pOwkJCQkJCQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIGlmIHRoZSBlbGVtZW50IGNhbiBiZSByZXBsYWNlZCwgc3VjaCBhcyBmb3IKLQkJCQkJLy8gQ29udGVudERlc2NyaXB0aW9uIGVsZW1lbnQKLQkJCQkJLy8gc2V0IHRoZSB2YWx1ZSBkaXJlY3RseQotCQkJCQllbHNlIGlmICggY2FuUmVzZXQobikgKSB7Ci0JCQkJCQllbGVtZW50LmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotCQkJCQkJbG9nTmV3RWxlbWVudChuKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCWlmICggbyAhPSBudWxsICYmIG4gIT0gbnVsbCAmJiBvLmdldEd1aWQoKS5lcXVhbHMobi5nZXRHdWlkKCkpICkgewotCQkJCQkJCSBkb1JlcGxhY2VFbGVtZW50KG8sIG4pOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7CQkJCQkJCQkJCQkJCQotCQkJCQkJCXJlZ2lzdGVyU2V0RWxlbWVudChlbGVtZW50LCBmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JCQkJCQkJCi0JCQkJCQkJZWxlbWVudC5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLQkJCQkJCQlsb2dOZXdFbGVtZW50KG4pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSApIHsKLQkJCQkvLyBjaGVjayBkaWZmZXJlbmNlIG5hbWUsIGlmIHJlcGxhY2UsIG5lZWQgdG8gcmVuYW1lIHJlc291cmNlcyBpZiBpZiBoYXMgaXQncyBvd24gcmVzb3VyY2UKLQkJCQkvLyBsaWtlIGNvbnRlbnQgZWxlbWVudHMsIHBsdWdpbnMsIGNvbmZpZ3VpcmF0aW9ucywgYW5kIHByb2Nlc3MgY29tcG9uZW50cwkJCQkJCi0JCQkJaWYgKCEgKG5ld1ZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZE5hbWUgPSAoU3RyaW5nKWVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGROYW1lKSkgewkJCQkJCi0JCQkJCWVuc3VyZVVuaXF1ZU5hbWVGb3JFeGlzdGluZ0VsZW1lbnQoZWxlbWVudCwgb2xkTmFtZSwgKFN0cmluZykgbmV3VmFsdWUsIHJlbmFtZUVsZW1lbnRNYXApOwkJCQkJCQkJCQkKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWVsZW1lbnQuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JCQkJCi0JCQkJLy8gc2NhbiBhbmQgY29weSB0aGUgcmVzb3VyY2VzCi0JCQkJc2NhblJlc291cmNlcyhlbGVtZW50LCBmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlmaW5hbGx5Ci0JCXsKLQkJCWVsZW1lbnQuZVNldERlbGl2ZXIob2xkTm90aWZ5KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzY2FuUmVzb3VyY2VzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiByZWN1cnNpdmUpIHsKLQotCQlpZiAoIGVsZW1lbnQgPT0gbnVsbCApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwcm9wZXJ0aWVzLmdldChpKTsKLQkJCQlpZiAoICEoZmVhdHVyZSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpICkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQkJc2NhblJlc291cmNlcyhlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmICggIXJlY3Vyc2l2ZSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnQuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KWl0Lm5leHQoKTsKLQkJCQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIAotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlIAotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCWlmICggb2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApIHsKLQkJCQlzY2FuUmVzb3VyY2VzKChNZXRob2RFbGVtZW50KW9iaiwgZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzY2FuUmVzb3VyY2VzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlkaWFncmFtSGFuZGxlci5yZWdpc3RlckVsZW1lbnQoZWxlbWVudCk7Ci0JCQotCQkvLyBzY2FuIHRoZSByZXNvdXJjZXMKLQkJaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKSApIHsKLQkJCS8vIHByb2Nlc3MgdGhlIGF0dGFjaG1lbnRzCi0JCQlTdHJpbmcgdXJscyA9IChTdHJpbmcpbmV3VmFsdWU7Ci0JCQlpZiAoICh1cmxzICE9IG51bGwpICYmIHVybHMubGVuZ3RoKCkgIT0gMCApIHsKLQkJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHVybHMsICJ8Iik7IC8vIHRoaXMgaXMgaGFyZGNvZGVkIHNvbWVob3cKLQkJCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpICkgewotCQkJCQlTdHJpbmcgdXJsID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJCXJlc1NjYW5uZXIuY29weVJlc291cmNlIChlbGVtZW50LCB1cmwpOwotCQkJCX0JCQkJCQkKLQkJCX0KLQkJfSBlbHNlIGlmICggbmV3VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgKSB7Ci0JCQlyZXNTY2FubmVyLnNjYW4oZWxlbWVudCwgbmV3VmFsdWUudG9TdHJpbmcoKSk7Ci0JCX0gZWxzZSBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBVUkkgKSB7Ci0JCQlyZXNTY2FubmVyLmNvcHlSZXNvdXJjZSAoICgoVVJJKW5ld1ZhbHVlKS5nZXRQYXRoKCkpOwotCQl9Ci0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRvQWRkKEVPYmplY3Qgb3duZXIsIE1ldGhvZEVsZW1lbnQgbmV3T2JqKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWRkaW5nIGVsZW1lbnQgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKChNZXRob2RFbGVtZW50KW5ld09iaikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyB0aGUgb3duZXIgY2FuIG9ubHkgYmUgbGlicmFyeSBhbmQgcGFja2FnZQotCQlpZiAob3duZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQllbnN1cmVVbmlxdWVOYW1lKG93bmVyLCBuZXdPYmosIHJlbmFtZUVsZW1lbnRNYXApOwotCQkKLQkJYm9vbGVhbiBlcnJvciA9IGZhbHNlOwotCQkKLQkJaWYgKG93bmVyIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewkJCQotCQkJLy8gY2FuIGJlIGNvbmZpZ3VyYXRpb24gb3IgcGx1Z2luCi0JCQlpZiAobmV3T2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pbmV3T2JqOwkJCQkKLQkJCQkKLQkJCQljaGVja01vZGlmaWVkRmlsZXMoKTsJCQkJCi0JCQkJZXJyb3IgPSAhIGZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKTsJCQkJCi0JCQkJCQkJCQotCQkJCS8vIGRvbid0IGludGl0aWFsaXplIHRoZSBzdG9yYWdlIHNpbmNlIHRoaXMgd2lsbCByZWNyZWF0ZSB0aGUgZ2xvYmFsIHBhY2thZ2VzCi0JCQkJLy8gYW5kIHN1Y2ggY2F1c2luZyB0d28gc2V0IG9mIGdsb2JhbCBwYWNrYWdlcwotCQkJCS8vIDE0NTg1MCAtIEltcG9ydCBDb25maWd1cmF0aW9uOiBDUC9EUHMgZGlkIG5vdCBzaG93biBpbiBhdXRoZXJpbmcKLQkJCQkvLyBNb2RlbFN0b3JhZ2UuaW5pdGlhbGl6ZShwbHVnaW4pOwotCQkJCS8vIE5PLCBzaW5jZSB0aGUgZ2xvYmFsIHBhY2thZ2VzIGFyZSBhbHJlYWR5IGNyZWF0ZWQKLQkJCQlpZiAoIWVycm9yKSB7Ci0JCQkJCSgoTWV0aG9kTGlicmFyeSlvd25lcikuZ2V0TWV0aG9kUGx1Z2lucygpLmFkZChwbHVnaW4pOwotCQkJCQlMaWJyYXJ5VXRpbC5zYXZlTGlicmFyeSgoTWV0aG9kTGlicmFyeSlvd25lciwgZmFsc2UsIGZhbHNlKTsKLQkJCQl9Ci0JCQkJCQkJCQotCQkJfSBlbHNlIGlmIChuZXdPYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uICkgewotCQkJCWNoZWNrTW9kaWZpZWRGaWxlcygpOwkJCQkKLQkJCQllcnJvciA9ICEgZmlsZUNoZWNrZWRPdXRTdGF0dXMuaXNPSygpOwotCQkJCWlmICghZXJyb3IpIHsKLQkJCQkJKChNZXRob2RMaWJyYXJ5KW93bmVyKS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5hZGQobmV3T2JqKTsKLQkJCQkJTGlicmFyeVV0aWwuc2F2ZUxpYnJhcnkoKE1ldGhvZExpYnJhcnkpb3duZXIsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQllcnJvciA9IHRydWU7CQkJCi0JCQl9Ci0JCX0gZWxzZSBpZiAoIChvd25lciBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIAotCQkJCSYmIChvd25lci5lQ29udGFpbmVyKCkgIT0gbnVsbCkgCi0JCQkJJiYgKG5ld09iaiBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpICkgewotCQkJKChNZXRob2RQYWNrYWdlKW93bmVyKS5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKG5ld09iaik7Ci0JCX0gZWxzZSB7Ci0JCQllcnJvciA9IHRydWU7Ci0JCX0KLQkJCQotCQlpZiAoIGVycm9yICkgewotCQkJU3RyaW5nIG1zZyA9ICJjYW4ndCBhZGQgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG5ld09iaikgLy8kTk9OLU5MUy0xJAotCQkJKyAiIHRvICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZSgoTWV0aG9kUGFja2FnZSlvd25lcik7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihtc2cpOyAKLQkJCWlmICggZGVidWcgKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlsb2dOZXdFbGVtZW50KG5ld09iaik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tNb2RpZmllZENvbmZpZ3MoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlMaXN0IGNvbmZpZ0xpc3QgPSBMaWJyYXJ5VXRpbC5nZXRBc3NvY2lhdGVkQ29uZmlndXJhdGlvbnMocGx1Z2luKTsKLQkJTGlzdCBiYXNlQ29uZmlncyA9IGJhc2VMaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQlNYXAgYmFzZUNvbmZpZ01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxiYXNlQ29uZmlncy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgYmFzZUNvbmZpZ3MuZ2V0KGkpOwotCQkJYmFzZUNvbmZpZ01hcC5wdXQoY29uZmlnLmdldEd1aWQoKSwgY29uZmlnKTsKLQkJfQotCQlmaW5hbCBMaXN0IG1vZGlmaWVkRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGk9MDsgaTxjb25maWdMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBjb25maWdMaXN0LmdldChpKTsKLQkJCWNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBiYXNlQ29uZmlnTWFwLmdldChjb25maWcuZ2V0R3VpZCgpKTsKLQkJCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJCVJlc291cmNlIHJlcyA9IGNvbmZpZy5lUmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQkJbW9kaWZpZWRGaWxlcy5hZGQocmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWZpbGVDaGVja2VkT3V0U3RhdHVzID0gRmlsZU1vZGlmeUNoZWNrZXIuY2hlY2tNb2RpZnkobW9kaWZpZWRGaWxlcyk7Ci0JCQl9Ci0JCX0pOwotCQlmaWxlQ2hlY2tPdXRFcnJvcigpOwotCQkKLQkJcmV0dXJuIGZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9JbnRlZ3JpdHlDaGVjaygpCi0JewkJCi0JCS8vIG5vdyB0aGUgbmV3bHkgYWRkZWQgZWxlbWVudHMgbWF5IGhhdmUgZmVhdHVyZSB2YWx1ZSBlbGVtZW50IHRoYXQKLQkJLy8gc3RpbGwgcG9pbnRpbmcgdG8gdGhlIGltcG9ydGluZyBsaWJyYXJ5Ci0JCS8vIHdlIG5lZWQgdG8gcmVwbGFjZSB0aG9zZSB3aXRoIHRoZSBvbmUgaW4gdGhlIGJhc2UgbGlicmFyeQotCQl3aGlsZSAobmV3RWxlbWVudHMuc2l6ZSgpID4gMCkgewotCQkJTWV0aG9kRWxlbWVudCBuZXdPYmogPSAoTWV0aG9kRWxlbWVudCluZXdFbGVtZW50cy5yZW1vdmUoMCk7Ci0JCQl0cnkgewotCQkJCWlmICggbmV3T2JqIGluc3RhbmNlb2YgRGlhZ3JhbUVsZW1lbnQgKSB7Ci0JCQkJCWZpeERpYWdyYW0oKERpYWdyYW1FbGVtZW50KW5ld09iaik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZml4TmV3RWxlbWVudFJlZmVyZW5jZXMobmV3T2JqKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiB3aGlsZSBmaXhpbmcgbmV3IGVsZW1lbnQgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG5ld09iaikpOwotCQkJCX0KLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCQotCQkvLyB0aGUgY29uZmlndXJhdGlvbnMgbmVlZHMgdG8gYmUgZml4ZWQKLQkJTGlzdCBjb25maWdzID0gYmFzZUxpYnJhcnkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gY29uZmlncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLQkJewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbilpdC5uZXh0KCk7Ci0JCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdCBwcm9jZXNzZWROZXdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkKLQkKLQkvKioKLQkgKiBpdGVyYXRlIGFsbCBmZWF0dXJlcywgaWYgdGhlIGZlYXR1cmUgdmFsdWUgcmVmZXJlbmNlcyBhbiBlbGVtZW50IHdoaWNoIGlzCi0JICogYW4gb2xkIGVsZW1lbnQsIHJlcGxhY2UgaXQgd2l0aCB0aGUgb2xkIGVsZW1lbnQuIGlmIHRoZSBlbGVtZW50IGlzIG5ldywKLQkgKiBpdGVyYXRlIGl0J3MgY29udGFpbm1lbnQgZWxlbWVudHMKLQkgKiAKLQkgKiBAcGFyYW0gbmV3T2JqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpeE5ld0VsZW1lbnRSZWZlcmVuY2VzKE1ldGhvZEVsZW1lbnQgbmV3T2JqKSB7Ci0JCWlmICggcHJvY2Vzc2VkTmV3RWxlbWVudHMuY29udGFpbnMobmV3T2JqKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJcHJvY2Vzc2VkTmV3RWxlbWVudHMuYWRkKG5ld09iaik7Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaXhpbmcgZWxlbWVudCAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUobmV3T2JqKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJTGlzdCBwcm9wZXJ0aWVzID0gbmV3T2JqLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHByb3BlcnRpZXMuZ2V0KGkpOwotCQkJCU9iamVjdCB2YWx1ZSA9IG5ld09iai5lR2V0KGZlYXR1cmUpOwotCi0JCQkJaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJCi0JCQkJCS8vIGZpeGluZyB0aGUgZmVhdHVyZSB2YWx1ZSBtYXkgY2F1c2UgdGhlIGxpc3QgdG8gY2hhbmdlCi0JCQkJCS8vIGl0ZXJhdGUgb24gYSBuZXcgY29weSB0byBhdm9pZAotCQkJCQkvLyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uCi0JCQkJCWZvciAoSXRlcmF0b3IgaXQ9IG5ldyBBcnJheUxpc3QoKChMaXN0KXZhbHVlKSkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJCQkJZml4TmV3RWxlbWVudEZlYXR1cmVWYWx1ZShuZXdPYmosIGZlYXR1cmUsIG8pOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZml4TmV3RWxlbWVudEZlYXR1cmVWYWx1ZShuZXdPYmosIGZlYXR1cmUsIHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCi0JfQotCQotCQotCXByaXZhdGUgdm9pZCBmaXhEaWFncmFtKERpYWdyYW1FbGVtZW50IG5ld09iaikgewkJCi0KLQkJaWYgKCBwcm9jZXNzZWROZXdFbGVtZW50cy5jb250YWlucyhuZXdPYmopICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlwcm9jZXNzZWROZXdFbGVtZW50cy5hZGQobmV3T2JqKTsKLQkJCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpeGluZyBkaWFncmFtIGVsZW1lbnQgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG5ld09iaikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCUxpc3QgcHJvcGVydGllcyA9IG5ld09iai5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwcm9wZXJ0aWVzLmdldChpKTsKLQkJCQlPYmplY3QgdmFsdWUgPSBuZXdPYmouZUdldChmZWF0dXJlKTsKLQotCQkJCWlmICggdmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJCQotCQkJCQkvLyBmaXhpbmcgdGhlIGZlYXR1cmUgdmFsdWUgbWF5IGNhdXNlIHRoZSBsaXN0IHRvIGNoYW5nZQotCQkJCQkvLyBpdGVyYXRlIG9uIGEgbmV3IGNvcHkgdG8gYXZvaWQKLQkJCQkJLy8gQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0PSBuZXcgQXJyYXlMaXN0KCgoTGlzdCl2YWx1ZSkpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCQkJCWlmICggbyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgKSB7Ci0JCQkJCQkJaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpICkgewotCQkJCQkJCQlmaXhOZXdFbGVtZW50RmVhdHVyZVZhbHVlKG5ld09iaiwgZmVhdHVyZSwgbyk7Ci0JCQkJCQkJfSBlbHNlIGlmICggKG8gaW5zdGFuY2VvZiBEaWFncmFtRWxlbWVudCkgKSB7Ci0JCQkJCQkJCWZpeERpYWdyYW0oKERpYWdyYW1FbGVtZW50KW8pOwotCQkJCQkJCX0gCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgKSB7Ci0JCQkJCWlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKSApIHsKLQkJCQkJCWZpeE5ld0VsZW1lbnRGZWF0dXJlVmFsdWUobmV3T2JqLCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCQkJCX0gZWxzZSBpZiAoICh2YWx1ZSBpbnN0YW5jZW9mIERpYWdyYW1FbGVtZW50KSApIHsKLQkJCQkJCWZpeERpYWdyYW0oKERpYWdyYW1FbGVtZW50KXZhbHVlKTsKLQkJCQkJfSAKLQkJCQl9Ci0JCQl9Ci0JCX0JCi0JfQotCQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhbiBvbGQgZWxlbWVudCBpbiB0aGUgYmFzZSwgaWYgeWVzLCByZXBsYWNlIGl0IHdpdGgKLQkgKiB0aGUgb2xkIG9uZSBpZiBpdCdzIG5ldywgaXRlcmF0ZSBpdCdzIGZlYXR1cmUgdmFsdWUKLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBvYmoKLQkgKi8KLQlwcml2YXRlIHZvaWQgZml4TmV3RWxlbWVudEZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3Qgb2JqKSB7Ci0JCWlmICggIShvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZml4aW5nIGVsZW1lbnQgZmVhdHVyZSB2YWx1ZSAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkgKyAiLCBmZWF0dXJlPSIgKyBmZWF0dXJlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWJvb2xlYW4gb2xkTm90aWZ5ID0gZWxlbWVudC5lRGVsaXZlcigpOwotCQl0cnkKLQkJewotCQkJZWxlbWVudC5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkKLQkJCU1ldGhvZEVsZW1lbnQgbmV3T2JqID0gKE1ldGhvZEVsZW1lbnQpb2JqOwotCQkJTWV0aG9kRWxlbWVudCBvbGRPYmogPSBnZXRSZXBsYWNlZChuZXdPYmouZ2V0R3VpZCgpKTsKLQkJCWlmICggb2xkT2JqID09IG51bGwgKSB7Ci0JCQkJLy8gZ2V0IGV4aXN0aW5nIGVsZW1lbnQsIGZvciBleGFtcGxlLCB0aGUgZ2xvYmFsIHBhY2thZ2VzIGluIHRoZQotCQkJCS8vIGNvbmZpZ3VyYXRpb24gZmVhdHVyZQotCQkJCW9sZE9iaiA9IGRpZmZNZ3IuZ2V0RXhpc3RpbmdFbGVtZW50KG5ld09iai5nZXRHdWlkKCkpOwotCQkJfQotCQkJCi0JCQlpZiAoIG9sZE9iaiA9PSBudWxsICkgewotCQkJCS8vIGl0J3MgYSBuZXcgb25lCi0JCQkJZml4TmV3RWxlbWVudFJlZmVyZW5jZXMobmV3T2JqKTsKLQkJCX0gZWxzZSB7Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJLy8gcmVwbGFjZSB0aGUgbmV3T2JqIHdpdGggdGhlIG9sZE9iagotCQkJCQlFY29yZVV0aWwucmVwbGFjZShlbGVtZW50LCBmZWF0dXJlLCBuZXdPYmosIG9sZE9iaik7IAotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIGlmIHJlcGxhY2UgZmFpbGVkLCByZW1vdmUgdGhlIGZlYXR1cmUKLQkJCQkJRWNvcmVVdGlsLnJlbW92ZShlbGVtZW50LCBmZWF0dXJlLCBuZXdPYmopOyAKLQkJCQkJaWYgKGRlYnVnICkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXBsYWNlaW5nIGZlYXR1cmUgdmFsdWUgZmFpbGVkIGZvciBlbGVtZW50IFsiIAotCQkJCQkJCQkrIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICsgIl0sIGZlYXR1cmUgWyIgCi0JCQkJCQkJCSsgZmVhdHVyZS5nZXROYW1lKCkgKyAiXSwgdmFsdWU9IiAKLQkJCQkJCQkJKyBuZXdPYmogKyAiLiBUaGUgZmVhdHVyZSB2YWx1ZSBpcyByZW1vdmVkLiAiKTsKLQkJCQkJCQotCQkJCQl9Ci0JCQkJfQotCQkJfQkKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlmaW5hbGx5Ci0JCXsKLQkJCWVsZW1lbnQuZVNldERlbGl2ZXIob2xkTm90aWZ5KTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY2FuUmVzZXQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWJvb2xlYW4gcmVzZXQgPSBmYWxzZTsKLQkJCi0JCS8vIGFuIGVsZW1lbnQgY2FuIGJlIHJlc2V0IGlmIHlvdSBhcmUgc3VyZSB0aGF0IG5vIG90aGVyIGVsZW1lbnQocykKLQkJLy8gcmVmZXJlbmNlIHRvIGl0Ci0JCS8vIHJlc2V0IGVsZW1lbnRzIG1heSBoYXZlIHJlZmVyZW5jZXMgdG8gb3RoZXIgZWxlbWVudHMgaW4gdGhlIGltcG9ydGluZwotCQkvLyBsaWJyYXJ5LCB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkIGxhdGVyCi0JCQotCQkvLyBmb3IgYW55dGhpbmcgY29udGFpbmVkIGJ5IENvbnRlbnREZXNjcmlwdGlvbiwgcmVzZXQgaXQKLQkJaWYgKCBlID09IG51bGwgLyogfHwgZS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gKi8KLQkJCQl8fCBlIGluc3RhbmNlb2YgRGlhZ3JhbUVsZW1lbnQpIHsKLQkJCXJlc2V0ID0gdHJ1ZTsKLQkJfQotCQkJCQotCQlyZXR1cm4gcmVzZXQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNhblJlc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCS8vIGZvciBhbnl0aGluZyBjb250YWluZWQgYnkgQ29udGVudERlc2NyaXB0aW9uLCByZXNldCBpdAotCQkvLyBubyBkb24ndCByZXNldCB0aGUgc2VjdGlvbnMgc2luY2UgaXQgd2lsbCBjYXVzZSB0aGUgb25lIGluIHRoZQotCQkvLyBpbXBvcnRpbmcgbGlicmFyeSByZW1vdmVkCi0JCS8vIHdoaWNoIGNhdXNlZCBwcm9ibGVtIGZvciBUYXNrRGVzY3JpcHRpb24gd2hlcmUgdGhlIHNhbWUgZmVhdHVyZQotCQkvLyAoU3RlcHMpIGNhbid0IGZpbmQgdGhlIHN0ZXBzIGZyb20gdGhlIGltcG9ydGluZyBsaWJyYXJ5Ci0JCS8vIHdoaWNoIHRoZW4gd2lsbCB0cmVhdCB0aGUgc3RlcHMgaW4gdGhlIGJhc2UgbGlicmFyeSBiZWluZyBkZXRldGVkCi0vLyBpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCkpIHsKLS8vIHJldHVybiB0cnVlOwotLy8gfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNhbklnbm9yZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQkvLyBkb24ndCByZXNldCB0aGUgcGx1Z2luIGxvY2sgc3RhdHVzCi0JCWlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvLyAxNDYxNDQgLSBJbXBvcnQgQ29uZmlndXJhdGlvbjogc29tZSB1bmNoYW5nZSBlbGVtZW50cyBkaXNhcHBlYXIgaW4gYXV0aG9yaW5nIGFmdGVyIGltcG9ydAotCQkvLyB0aGlzIGlzIGNhdXNlZCBieSBhIGJ1ZyBpbiBBcnRpZmFjdEltcGwsIHdoZW4gc2V0Q29udGFpbmVyQXJ0aWZhY3QgdG8gbnVsbCwgCi0JCS8vICBpdCBzZXQgdGhlIGVDb250YWluZXIgdG8gbnVsbCwgaWYgdGhlIGVDb250YWluZXIgaXMgYSBjb250ZW50IHBhY2thZ2UsIAotCQkvLyB0aGUgYXJ0aWZhY3QgaXMgcmVtb3ZlZCBmcm9tIHRoZSBwYWNrYWdlCi0JCS8vICB0aGlzIGJ1ZyB3aWxsIGJlIGZpeGVkIGluIE00LiAKLQkJLy8gZm9yIG5vdywgaWdub3JlIHRoaXMgZmVhdHVyZSBzaW5jZSB0aGlzIGlzIGFuIG9wcG9zaXRlIGZlYXR1cmUsIHdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIGl0CQotCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVyQXJ0aWZhY3QoKSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVwbGFjZWQoTWV0aG9kRWxlbWVudCBvbGRPYmopIHsKLQkJcmV0dXJuIHJlcGxhY2VkRWxlbWVudE1hcC5jb250YWluc0tleShvbGRPYmouZ2V0R3VpZCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UmVwbGFjZWQoTWV0aG9kRWxlbWVudCBvbGRPYmopIHsKLQkJU3RyaW5nIGd1aWQgPSBvbGRPYmouZ2V0R3VpZCgpOwotCQlpZiAoICFyZXBsYWNlZEVsZW1lbnRNYXAuY29udGFpbnNLZXkoZ3VpZCkgKSB7Ci0JCQlyZXBsYWNlZEVsZW1lbnRNYXAucHV0KGd1aWQsIG9sZE9iaik7Ci0JCQlzZXRNb2RpZmllZChvbGRPYmopOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgb2xkIGVsZW1lbnQgYmVlbiByZXBsYWNlZAotCSAqIAotCSAqIEBwYXJhbSBvbGRPYmoKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGdldFJlcGxhY2VkKFN0cmluZyBndWlkKSB7Ci0JCXJldHVybiAoTWV0aG9kRWxlbWVudClyZXBsYWNlZEVsZW1lbnRNYXAuZ2V0KGd1aWQpOwotCX0KLQkKLQkvKioKLQkgKiB3aGVuIG5ldyBlbGVtZW50cyBhcmUgYWRkZWQgaW50byB0aGUgbGlicmFyeSwgdGhlIGFzc29jaWF0ZWQgcmVzb3VyY2UKLQkgKiBmaWxlcyBtdXN0IGJlIGNvcGllZCBvdmVyIGFzIHdlbGwKLQkgKiAKLQkgKiBAcGFyYW0gbmV3T2JqCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNvcHlOZXdFbGVtZW50UmVzb3VyY2VzKE1ldGhvZEVsZW1lbnQgbmV3T2JqKSB7Ci0JCQotLy8JCUxpc3QgcHJvcGVydGllcyA9IG5ld09iai5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLS8vCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7Ci0vLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5zaXplKCk7IGkrKykgewotLy8JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwcm9wZXJ0aWVzLmdldChpKTsKLS8vCQkJCU9iamVjdCB2YWx1ZSA9IG5ld09iai5lR2V0KGZlYXR1cmUpOwotLy8JCQkJaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIFVSSSApIHsKLS8vCQkJCQlyZXNTY2FubmVyLmNvcHlSZXNvdXJjZSgoKFVSSSl2YWx1ZSkuZ2V0UGF0aCgpKTsKLS8vCQkJCX0gZWxzZSBpZiAoIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nICkgewotLy8JCQkJCXJlc1NjYW5uZXIuc2NhbihuZXdPYmosIChTdHJpbmcpdmFsdWUpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8JCQotLy8JCWZvciAoIEl0ZXJhdG9yIGl0ID0gbmV3T2JqLmVDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0vLwkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotLy8JCQlpZiAoIG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICkgewotLy8JCQkJY29weU5ld0VsZW1lbnRSZXNvdXJjZXMoKE1ldGhvZEVsZW1lbnQpbyk7Ci0vLwkJCX0KLS8vCQl9Ci0JCQotCQlzY2FuUmVzb3VyY2VzKG5ld09iaiwgdHJ1ZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2dOZXdFbGVtZW50KE1ldGhvZEVsZW1lbnQgbmV3T2JqKSB7Ci0JCQotCQkvLyBtYWtlIHN1cmUgdGhlIGVsZW1lbnQgaXMgbm90IGluIHRoZSBvcmlnaW5hbCBsaWJyYXJ5Ci0JCS8vIHNpbmNlIHdlIGhhdmUgdGhlIGd1aWQtZWxlbWVudCBtYXAgYnVpbGQgdXAgaW4gdGhlIGRpZmYgbWFuYWdlciwKLQkJLy8gY2hlY2sgdGhlcmUKLQkJaWYgKCAhbmV3RWxlbWVudHMuY29udGFpbnMobmV3T2JqKSAmJiBkaWZmTWdyLmdldEV4aXN0aW5nRWxlbWVudChuZXdPYmouZ2V0R3VpZCgpKSA9PSBudWxsKSB7Ci0JCQluZXdFbGVtZW50cy5hZGQobmV3T2JqKTsKLQkJCWNvcHlOZXdFbGVtZW50UmVzb3VyY2VzKG5ld09iaik7Ci0JCQlzZXRNb2RpZmllZChuZXdPYmopOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2dSZXNldEVsZW1lbnQoTWV0aG9kRWxlbWVudCBuZXdPYmopIHsKLQkJaWYgKCAhbmV3RWxlbWVudHMuY29udGFpbnMobmV3T2JqKSApIHsKLQkJCW5ld0VsZW1lbnRzLmFkZChuZXdPYmopOwotCQkJc2V0TW9kaWZpZWQobmV3T2JqKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsb2dOZXdSZXNvdXJjZShSZXNvdXJjZSByZXMgKSB7Ci0JCWlmICggcmVzICE9IG51bGwgKSB7Ci0JCQkKLQkJCS8vIG1hcmsgdGhlIHJlc291cmNlIGFzIGRpcnR5IHNvIHRoYXQgd2UgY2FuIHNhdmUgaXQgYWdhaW4KLQkJCS8vIHRoZSBmaXJzdCBzYXZlIG1heSBsb3NlIGNyb3NzIHJlZmVyZW5jZXMgCi0JCQlyZXMuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQlTdHJpbmcgZmlsZSA9IHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCWlmICggIW5ld1Jlc291cmNlcy5jb250YWlucyhmaWxlKSApIHsKLQkJCQluZXdSZXNvdXJjZXMuYWRkKGZpbGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2dSZW1vdmVkRWxlbWVudHMoTGlzdCBpdGVtcykgewotCQkKLQkJaWYgKCBpdGVtcyA9PSBudWxsIHx8IGl0ZW1zLnNpemUoKSA9PSAwICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyByZW1vdmVkIGVsZW1lbnRzIGNhbiBiZSByZW1vdmVkIGZyb20gYW55IGZlYXR1cmUKLQkJLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQncyBjb250YWluZXIgaXMgbnVsbAotCQkvLyBpZiBpcywgdGhlbiB0aGUgZWxlbWVudCBpcyBkZWxldGVkIGFuZCB0aGUgcmVzb3VyY2Ugc2hvdWxkIGJlIGRlbGV0ZWQKLQkJLy8gYXMgd2VsbAotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0Lm5leHQoKTsKLQkJCWlmICggKGUuZUNvbnRhaW5lcigpID09IG51bGwpICYmICFkZWxldGVkRWxlbWVudHMuY29udGFpbnMoZSkgKSB7CQkJCi0JCQkJZGVsZXRlZEVsZW1lbnRzLmFkZChlKTsKLQkJCX0JCQkKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0TW9kaWZpZWQoRU9iamVjdCBvYmopIHsKLQkJaWYgKCBvYmogIT0gbnVsbCApIHsKLQkJCVJlc291cmNlIHJlcyA9IG9iai5lUmVzb3VyY2UoKTsKLQkJCWlmICggcmVzICE9IG51bGwgKSB7Ci0JCQkJaWYgKCAhcmVzLmlzTW9kaWZpZWQoKSApIHsKLQkJCQkJcmVzLnNldE1vZGlmaWVkKHRydWUpOwkJCQkKLQkJCQl9Ci0vLyB9IGVsc2UgewotLy8gU3lzdGVtLm91dC5wcmludGxuKCJObyByZXNvdXJjZSBmb3IgIiArIG9iaik7Ci0JCQkJCi0JCQkJaWYgKGRlYnVnICYmIHJlcy5pc01vZGlmaWVkKCkgKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTW9kaWZpZWQ6ICIgKyByZXMuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldE1vZGlmaWVkUmVzb3VyY2VzKE1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCQotCQkvLyBhdm9pZCB0aGUgbmV3bHkgYWRkZWQgZWxlbWVudCByZXNvdXJjZXMKLQkJTGlzdCBtb2RpZmllZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVJlc291cmNlIHJlcyA9IGxpYi5lUmVzb3VyY2UoKTsKLQkJaWYgKCByZXMgIT0gbnVsbCApIHsKLQkJCVJlc291cmNlU2V0IHJlc1NldCA9IHJlcy5nZXRSZXNvdXJjZVNldCgpOwotCQkJZm9yICggSXRlcmF0b3IgaXQgPSByZXNTZXQuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQlyZXMgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlpZiAoIHJlcyAhPSBudWxsICYmIHJlcy5pc01vZGlmaWVkKCkgKSB7Ci0JCQkJCVN0cmluZyBmaWxlID0gcmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCQlpZiAoIG5ld1Jlc291cmNlcy5jb250YWlucyhmaWxlKSApIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBtb2RpZmllZDogIiArIGZpbGUpOwotCQkJCQl9CQkKLQkJCQkJbW9kaWZpZWRMaXN0LmFkZChmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkTGlzdDsKLQl9Ci0KLQkvLyBjbGVhciByZXNvdXJjZXMgZm9yIGRlbGV0ZWQgZWxlbWVudHMKLQlwcml2YXRlIHZvaWQgZGVsZXRlUmVzb3J1Y2VzKCkgewotCQlpZiAoIGRlbGV0ZWRFbGVtZW50cy5zaXplKCkgPT0gMCApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSUZpbGVNYW5hZ2VyIGZpbGVNZ3IgPSBTZXJ2aWNlcy5nZXRGaWxlTWFuYWdlcigpOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBkZWxldGVkRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0Lm5leHQoKTsKLQkJCQotCQkJRU9iamVjdCBvYmogPSBudWxsOwotCQkJaWYgKCBlIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50ICkgewotCQkJCW9iaiA9ICgoRGVzY3JpYmFibGVFbGVtZW50KWUpLmdldFByZXNlbnRhdGlvbigpOwotCQkJfSBlbHNlIGlmICggZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbiApIHsKLQkJCQlvYmogPSBlOwotCQkJfQotCQkJaWYgKCBvYmogIT0gbnVsbCApIHsKLQkJCQlSZXNvdXJjZSByZXMgPSBvYmouZVJlc291cmNlKCk7Ci0JCQkJaWYgKCByZXMgIT0gbnVsbCApIHsKLQkJCQkJU3RyaW5nIGZpbGUgPSByZXMuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImRlbGV0aW5nIHJlc291cmNlOiAiICsgZmlsZSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmICggIWZpbGVNZ3IuZGVsZXRlKGZpbGUpICkgewotCQkJCQkJaWYgKCBkZWJ1ZyApIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuYWJsZSB0byBkZWxldGUgZmlsZTogIiArIGZpbGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQkJCQkJCQkJCi0JCQl9Ci0JCX0KLQl9Ci0KLQkKLQlwdWJsaWMgY2xhc3MgRWxlbWVudExpc3REaWZmIHsKLQotCQlMaXN0IG5ld0l0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGRlbGV0ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCS8vIHVzZSBMaW5rZWRIYXNoTWFwIHRvIHJlc2VydmUgdGhlIG9yZGVyIG9mIHRoZSB2YWx1ZXMKLQkJTWFwIG9sZE5ld01hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0KLQkJLy8gd2l0aCB0aGUgb2xkIGFuZCBuZXcgbGlzdCBvZiBNZXRob2RFbGVtZW50cywKLQkJLy8gZmluZCB0aGUgY29tbW9uIG9uZXMsIHRoZSBkZWxldGVkIG9uZXMsIGFuZCB0aGUgbmV3IG9uZXMKLQkJcHVibGljIEVsZW1lbnRMaXN0RGlmZihMaXN0IG9sZExpc3QsIExpc3QgbmV3TGlzdCkgewotCQkJLy8gTWFwIG9sZExpc3RHdWlkTWFwID0gZ2V0R3VpZE1hcChvbGRMaXN0KTsKLQkJCU1hcCBuZXdMaXN0R3VpZE1hcCA9IGdldEd1aWRNYXAobmV3TGlzdCk7Ci0KLQkJCW5ld0l0ZW1zLmFkZEFsbChuZXdMaXN0KTsKLQotCQkJZm9yIChJdGVyYXRvciBpdCA9IG9sZExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQlNZXRob2RFbGVtZW50IG9sZE9iaiA9IChNZXRob2RFbGVtZW50KWl0Lm5leHQoKTsKLQkJCQlTdHJpbmcgZ3VpZCA9IG9sZE9iai5nZXRHdWlkKCk7Ci0JCQkJT2JqZWN0IG5ld09iaiA9IG5ld0xpc3RHdWlkTWFwLmdldChndWlkKTsKLQkJCQlpZiAoIG5ld09iaiAhPSBudWxsICkgewotCQkJCQlvbGROZXdNYXAucHV0KG9sZE9iaiwgbmV3T2JqKTsKLQkJCQkJbmV3SXRlbXMucmVtb3ZlKG5ld09iaik7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8vIGl0J3MgYmVlbiBkZWxldGVkCi0JCQkJCWRlbGV0ZWRJdGVtcy5hZGQob2xkT2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIE1hcCBnZXRHdWlkTWFwKExpc3QgaXRlbXMpIHsKLQkJCU1hcCBtID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQ9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotCQkJCW0ucHV0KGUuZ2V0R3VpZCgpLCBlKTsKLQkJCX0KLQotCQkJcmV0dXJuIG07Ci0JCX0KLQl9CQotCQotCS8qKgotCSAqIEhhbmRsZXMgbmFtZSByZXBsYWNlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlTmFtZVJlcGxhY2UoTWFwIHJlbmFtZUVsZW1lbnRNYXApIHsKLQkJSXRlcmF0b3IgaXQgPSByZW5hbWVFbGVtZW50TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJT2JqZWN0W10gdmFsID0gKE9iamVjdFtdKWVudHJ5LmdldFZhbHVlKCk7Ci0JCQkKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSB2YWxbMF07Ci0JCQlTdHJpbmcgbmV3TmFtZSA9IHZhbC5sZW5ndGggPT0gNCA/IGVsZW1lbnQuZ2V0R3VpZCgpIDogKFN0cmluZykgdmFsWzFdOwotCQkJcmVuYW1lKGVsZW1lbnQsIG5ld05hbWUpOwotCQkJaWYgKHZhbC5sZW5ndGggPT0gNCkgewotCQkJCWVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgdmFsWzJdOwotCQkJCW5ld05hbWUgPSAoU3RyaW5nKSB2YWxbM107Ci0JCQkJcmVuYW1lKGVsZW1lbnQsIG5ld05hbWUpOwotCQkJCQotCQkJCWVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgdmFsWzBdOwotCQkJCW5ld05hbWUgPSAoU3RyaW5nKSB2YWxbMV07Ci0JCQkJcmVuYW1lKGVsZW1lbnQsIG5ld05hbWUpOwotCQkJfQotCQl9Ci0JCQotCQkvL01ha2UgcmVzb3VjZXMgZGlydHkgYWdhaW4sIGFzIHJlbmFtZSBwcm9jZXNzIHdvdWxkIG1hcmsgcmVzb3VjZSB1bi1tb2RpZmllZAotCQlpdCA9IHJlbmFtZUVsZW1lbnRNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3RbXSB2YWwgPSAoT2JqZWN0W10pZW50cnkuZ2V0VmFsdWUoKTsJCQkKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSB2YWxbMF07Ci0JCQllbGVtZW50LmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVuYW1lKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKG5ld05hbWUuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uIHx8IGVsZW1lbnQuZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJZWxlbWVudC5zZXROYW1lKG5ld05hbWUpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBlbGVtZW50KQotCQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCQlwcm9jLnNldE5hbWUobmV3TmFtZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlMaWJyYXJ5Vmlldy5ydW5SZW5hbWUoZWxlbWVudCwgbmV3TmFtZSk7Ci0JCX0KLQl9Ci0JCQotCXByaXZhdGUgdm9pZCByZWdpc3RlclNldEVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBndWlkMCA9ICgoTWV0aG9kRWxlbWVudCluZXdWYWx1ZSkuZ2V0R3VpZCgpOwotCQlTdHJpbmcgZ3VpZDEgPSBlbGVtZW50LmdldEd1aWQoKTsKLQkJT2JqZWN0W10gdmFsID0gbmV3IE9iamVjdFszXTsKLQkJdmFsWzBdID0gZmVhdHVyZTsKLQkJdmFsWzFdID0gbmV3VmFsdWU7Ci0JCXZhbFsyXSA9IGVsZW1lbnQ7Ci0JCWlmIChzZXRFbGVtZW50TWFwID09IG51bGwpIHsKLQkJCXNldEVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXNldEVsZW1lbnRNYXAucHV0KGVsZW1lbnQuZ2V0TmFtZSgpICsgZ3VpZDAgKyBndWlkMSwgdmFsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNldEVsZW1lbnRzKCkgewotCQlpZiAoc2V0RWxlbWVudE1hcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHNldEVsZW1lbnRNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3RbXSB2YWwgPSAoT2JqZWN0W10pZW50cnkuZ2V0VmFsdWUoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgdmFsWzBdOwotCQkJTWV0aG9kRWxlbWVudCBuZXdWYWx1ZSA9IChNZXRob2RFbGVtZW50KSB2YWxbMV07Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgdmFsWzJdOwotCQkJU3RyaW5nIGd1aWQgPSBuZXdWYWx1ZS5nZXRHdWlkKCk7Ci0JCQlNZXRob2RFbGVtZW50IG1lcmdlZFZhbHVlID0gKE1ldGhvZEVsZW1lbnQpIHJlcGxhY2VkRWxlbWVudE1hcC5nZXQoZ3VpZCk7Ci0JCQlpZiAobWVyZ2VkVmFsdWUgIT0gbnVsbCAmJiBtZXJnZWRWYWx1ZSAhPSBuZXdWYWx1ZSkgewotCQkJCWVsZW1lbnQuZVNldChmZWF0dXJlLCBtZXJnZWRWYWx1ZSk7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmVzIHVuaXF1ZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBlbnN1cmVVbmlxdWVOYW1lKEVPYmplY3Qgb3duZXIsIE1ldGhvZEVsZW1lbnQgbmV3T2JqLCBNYXAgcmVuYW1lRWxlbWVudE1hcCkgewotCQlpZiAob3duZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUNsYXNzIGNscyA9IG5ld09iai5nZXRDbGFzcygpOwotCQlNYXAgbmFtZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGk9MDsgaSA8IG93bmVyLmVDb250ZW50cygpLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2xkT2JqID0gb3duZXIuZUNvbnRlbnRzKCkuZ2V0KGkpOwotCQkJaWYgKG9sZE9iai5nZXRDbGFzcygpID09IGNscyAmJiBvbGRPYmogIT0gbmV3T2JqKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBvbGRFbGVtID0gKE1ldGhvZEVsZW1lbnQpIG9sZE9iajsKLQkJCQluYW1lTWFwLnB1dChvbGRFbGVtLmdldE5hbWUoKSwgb2xkRWxlbSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIG5hbWUgPSBuZXdPYmouZ2V0TmFtZSgpOwotCQlTdHJpbmcgcmVuYW1lZCA9IG5hbWU7Ci0JCXdoaWxlIChuYW1lTWFwLmNvbnRhaW5zS2V5KHJlbmFtZWQpKSB7Ci0JCQlyZW5hbWVkICs9ICJfcmVuYW1lZCI7Ci0JCX0KLQkJaWYgKHJlbmFtZWQgIT0gbmFtZSkgewotCQkJbmV3T2JqLnNldE5hbWUocmVuYW1lZCk7Ci0JCQkKLQkJCU9iamVjdFtdIGVudHJ5VmFsID0gbmV3IE9iamVjdFs0XTsKLQkJCWVudHJ5VmFsWzBdID0gbmV3T2JqOwotCQkJZW50cnlWYWxbMV0gPSBuYW1lOwotCQkJZW50cnlWYWxbMl0gPSBuYW1lTWFwLmdldChuYW1lKTsKLQkJCWVudHJ5VmFsWzNdID0gcmVuYW1lZDsKLQkJCXJlbmFtZUVsZW1lbnRNYXAucHV0KG5ld09iai5nZXRHdWlkKCksIGVudHJ5VmFsKTsJCQkKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFbnN1cmVzIHVuaXF1ZSBuYW1lIGZvciBleGlzdGluZyBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBlbnN1cmVVbmlxdWVOYW1lRm9yRXhpc3RpbmdFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG9sZE5hbWUsIFN0cmluZyBuZXdOYW1lLCBNYXAgcmVuYW1lRWxlbWVudE1hcCkgewotCQlFT2JqZWN0IGVsZW1lbnRPd25lciA9IGVsZW1lbnQuZUNvbnRhaW5lcigpOwkJCQkJCi0JCWlmIChlbGVtZW50T3duZXIgIT0gbnVsbCkgewotCQkJZWxlbWVudC5zZXROYW1lKG5ld05hbWUpOwotCQkJZW5zdXJlVW5pcXVlTmFtZShlbGVtZW50T3duZXIsIGVsZW1lbnQsIHJlbmFtZUVsZW1lbnRNYXApOwotCQkJaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMobmV3TmFtZSkpIHsJLy9pZiBoYW5kbGVkIHRoZW4gcmV0dXJuCi0JCQkJcmV0dXJuOwotCQkJfQkJCQotCQkJZWxlbWVudC5zZXROYW1lKG9sZE5hbWUpOwotCQl9CQkJCi0JCU9iamVjdFtdIGVudHJ5VmFsID0gbmV3IE9iamVjdFsyXTsKLQkJZW50cnlWYWxbMF0gPSBlbGVtZW50OwotCQllbnRyeVZhbFsxXSA9IG5ld05hbWU7Ci0JCXJlbmFtZUVsZW1lbnRNYXAucHV0KGVsZW1lbnQuZ2V0R3VpZCgpLCBlbnRyeVZhbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTW9kaWZpZWRGaWxlcygpIHsKLQkJZmluYWwgTGlzdCBtb2RpZmllZEZpbGVzID0gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoYmFzZUxpYnJhcnkpOwotCQltb2RpZmllZEZpbGVzLmFkZEFsbChyZXNTY2FubmVyLmdldEZpbGVzVG9iZVJlcGxhY2VkKCkpOwotCQltb2RpZmllZEZpbGVzLmFkZEFsbChkaWFncmFtSGFuZGxlci5nZXRNb2RpZmllZEZpbGVzKCkpOwotCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IEZpbGVNb2RpZnlDaGVja2VyLmNoZWNrTW9kaWZ5KG1vZGlmaWVkRmlsZXMpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvUGx1Z2luSW1wb3J0RGF0YS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL1BsdWdpbkltcG9ydERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzQ5ZTJiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvUGx1Z2luSW1wb3J0RGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5TG9jYXRpb25EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyB0aGUgaW5wdXQgZGF0YSByZXF1aXJlZCB0byBpbXBvcnQgYSBtZXRob2QgcGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkltcG9ydERhdGEgewotCi0JLy8gdGhlc2UgYXJlIHNldCBieSB0aGUgd2l6YXJkCi0JcHVibGljIExpYnJhcnlMb2NhdGlvbkRhdGEgbGxEYXRhID0gbmV3IExpYnJhcnlMb2NhdGlvbkRhdGEoKTsKLQotCXB1YmxpYyBib29sZWFuIGRlbGV0ZUV4aXN0aW5nUGx1Z2luczsKLQotCS8vIHRoZXNlIGFyZSBmaWxsZWQgaW4gYnkgdGhlIGltcG9ydGluZyBzZXJ2aWNlCi0JcHVibGljIFN0cmluZyBsaWJyYXJ5VmVyc2lvbjsKLQotCXByaXZhdGUgTGlzdCBwbHVnaW5zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBMaXN0IGNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIEVycm9ySW5mbyBlcnJvciA9IG5ldyBFcnJvckluZm8oKTsKLQotCS8vIGFwIHRoZSBndWlkIHRvIHVybCBmb3IgYmFzZSBwbHVnaW4sIHRoaXMgaXMgdGhlIG9ubHkgZm9ybWF0aW9uIGF2YWlsYWJsZQotCXB1YmxpYyBNYXAgYmFzZVBsdWdpblVybE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQbHVnaW5JbXBvcnREYXRhKCkgewotCX0KLQotCS8qKgotCSAqIENsZWFycyB0aGUgY29udGVudHMuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXBsdWdpbnMuY2xlYXIoKTsKLQkJY29uZmlncy5jbGVhcigpOwotCQllcnJvci5lcnJvck1lc3NhZ2Uuc2V0TGVuZ3RoKDApOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgcGx1Z2lucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVBsdWdpbnMoKSB7Ci0JCVBsdWdpbkluZm8gaW5mbzsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IHBsdWdpbnMuc2l6ZSgpKSB7Ci0JCQlpbmZvID0gKFBsdWdpbkluZm8pIHBsdWdpbnMuZ2V0KGkpOwotCQkJaWYgKGluZm8udXJsID09IG51bGwpIHsKLQkJCQlwbHVnaW5zLnJlbW92ZShpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIFBsdWdpbkluZm8gb2JqZWN0IGdpdmVuIHRoZSBndWlkLgotCSAqLwotCXB1YmxpYyBQbHVnaW5JbmZvIGdldFBsdWdpbkluZm8oU3RyaW5nIGd1aWQpIHsKLQkJUGx1Z2luSW5mbyBpbmZvOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlpbmZvID0gKFBsdWdpbkluZm8pIGl0Lm5leHQoKTsKLQkJCWlmIChpbmZvLmd1aWQuZXF1YWxzKGd1aWQpKSB7Ci0JCQkJcmV0dXJuIGluZm87Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgUGx1Z2luSW5mbyBvYmplY3QgZ2l2ZW4gdGhlIGd1aWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUGx1Z2luSW5mbyhTdHJpbmcgZ3VpZCkgewotCQlQbHVnaW5JbmZvIGluZm87Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWluZm8gPSAoUGx1Z2luSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGluZm8uZ3VpZC5lcXVhbHMoZ3VpZCkpIHsKLQkJCQlwbHVnaW5zLnJlbW92ZShpbmZvKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIENvbmZpZ3VhcmF0aW9uSW5mbyBvYmplY3QgZ2l2ZW4gdGhlIGd1aWQuCi0JICovCi0JcHVibGljIENvbmZpZ3VhcmF0aW9uSW5mbyBnZXRDb25maWdJbmZvKFN0cmluZyBndWlkKSB7Ci0KLQkJaWYgKCBndWlkID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbyBjaW5mbzsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGdldENvbmZpZ3MoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQljaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGd1aWQuZXF1YWxzKGNpbmZvLmd1aWQpICkgewotCQkJCXJldHVybiBjaW5mbzsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCS8qKgotCSAqIHJldHVybiBhIGxpc3Qgb2YgUGx1Z2luSW5mbyBvYmplY3QKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIFBsdWdpbkluZm8gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFBsdWdpbnMoKSB7Ci0JCXJldHVybiBwbHVnaW5zOwotCX0KLQotCS8qKgotCSAqIHJldHVybiBhIGxpc3Qgb2YgQ29uZmlnSW5mbyBvYmplY3RzCi0JICogCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0Q29uZmlncygpIHsKLQkJcmV0dXJuIGNvbmZpZ3M7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlIGlmIGFueQotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIEVycm9ySW5mbyBnZXRFcnJvckluZm8oKSB7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgUGx1Z2luSW5mbyB7Ci0KLQkJLy8gSWYgbm90IG51bGwsIHRoaXMgaXMgYSB2YWxpZCBwbHVnLWluLgotCQlwdWJsaWMgU3RyaW5nIHVybCA9IG51bGw7Ci0KLQkJcHVibGljIFN0cmluZyBuYW1lOwotCi0JCXB1YmxpYyBTdHJpbmcgZ3VpZDsKLQotCQlwdWJsaWMgU3RyaW5nIHZlcnNpb247Ci0KLQkJcHVibGljIFN0cmluZyBicmllZl9kZXNjOwotCi0JCXB1YmxpYyBTdHJpbmcgYXV0aG9yczsKLQotCQlwdWJsaWMgU3RyaW5nIGNoYW5nZURhdGU7Ci0KLQkJcHVibGljIExpc3QgdXNlZFBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gSWYgbnVsbCwgdGhpcyBwbHVnLWluIGRvZXMgbm90IGV4aXN0cyBpbiB0aGUgY3VycmVudCBsaWJyYXJ5LgotCQlwdWJsaWMgTWV0aG9kUGx1Z2luIGV4aXN0aW5nUGx1Z2luID0gbnVsbDsKLQotCQkvLyBJZiB0cnVlLCByZXBsYWNlIHRoZSBjdXJyZW50IHBsdWctaW4gd2l0aCB0aGUgb25lIGluIHRoZSBpbXBvcnQKLQkJLy8gbGlicmFyeS4gSWYgZmFsc2UsIGRvbid0IGltcG9ydCB0aGUgcGx1Zy1pbi4KLQkJcHVibGljIGJvb2xlYW4gc2VsZWN0ZWQgPSBmYWxzZTsKLQotCQlwdWJsaWMgUGx1Z2luSW5mbygpIHsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBDb25maWd1YXJhdGlvbkluZm8gewotCi0JCXB1YmxpYyBTdHJpbmcgbmFtZTsKLQotCQlwdWJsaWMgU3RyaW5nIGd1aWQ7Ci0KLQkJcHVibGljIFN0cmluZyB2ZXJzaW9uOwotCi0JCS8vIFRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGV4aXN0aW5nQ29uZmlnID0gbnVsbDsKLQotCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3RlZCA9IHRydWU7Ci0KLQkJcHVibGljIENvbmZpZ3VhcmF0aW9uSW5mbygpIHsKLQkJfQotCi0JfQotCi0JcHVibGljIGNsYXNzIEVycm9ySW5mbyB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZXJyb3JNZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCXB1YmxpYyBFcnJvckluZm8oKSB7Ci0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCQllcnJvck1lc3NhZ2UuYXBwZW5kKG1lc3NhZ2UpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRFcnJvcigpIHsKLQkJCXJldHVybiBlcnJvck1lc3NhZ2UudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkJZXJyb3JNZXNzYWdlLnNldExlbmd0aCgwKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL1BsdWdpbkltcG9ydGluZ1NlcnZpY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwZjhjMWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL1BsdWdpbkltcG9ydGluZ1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29weTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5MaWJyYXJ5RG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uVXBncmFkZUNhbGxlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBJbXBvcnRzIGEgbWV0aG9kIHBsdWctaW4gaW50byB0aGUgY3VycmVudCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkltcG9ydGluZ1NlcnZpY2UgewotCi0JcHJpdmF0ZSBVcGdyYWRlQ2FsbGVySW5mbyB1cEdyYWRlSW5mbzsKLQkKLQkvL1RlbXAgZmxhZyBpbmRpY2F0aW5nIHVzZSBvZiB0aGUgbmV3IG1lcmdlIHNjaGVtZQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbmV3TWVyZ2VTY2hlbWUgPSB0cnVlOyAKLQkKLQlwcml2YXRlIFBsdWdpbkltcG9ydERhdGEgZGF0YTsKLQotCUxpYnJhcnlEb2N1bWVudCBpbXBvcnRpbmdMaWJEb2M7Ci0JTGlicmFyeURvY3VtZW50IHRhcmdldExpYkRvYzsKLQotCS8vIEZsYWcgdG8gaW5kaWNhdGUgdGhlIGZpbGUgY2hlY2tvdXQgc3RhdHVzLgotCUlTdGF0dXMgZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUGx1Z2luSW1wb3J0aW5nU2VydmljZShQbHVnaW5JbXBvcnREYXRhIGRhdGEpIHsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIHBsdWctaW4gYWdhaW5zdCB0aGUgY3VycmVudCBsaWJyYXJ5LCBjb2xsZWN0cyBhbGwgdGhlCi0JICogaW5mb3JtYXRpb25zIGluY2x1ZGluZyBwbHVnLWluIGluZm8sIGNvbmZpZ3VhdGlvbiBpbmZvIGFuZCBlcnJvciBpbmZvLgotCSAqIENhbGwgdGhpcyBtZXRob2QsIHRoZW4gY2FsbCBnZXRFcnJvcigpLCBnZXRQbHVnaW5zKCksIGdldENvbmZpZ3MoKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLnNldFRhc2tOYW1lKEltcG9ydFJlc291cmNlcy5QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzApOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmICh0aGlzLmRhdGEgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJdGhpcy5kYXRhLmNsZWFyKCk7Ci0KLQkJCS8vIFByZXBhcmUgdGhlIGxpYiBmaWxlcy4KLQkJCUZpbGUgaW1wb3J0aW5nTGliUGF0aCA9IG5ldyBGaWxlKGRhdGEubGxEYXRhLmdldFBhcmVudEZvbGRlcigpCi0JCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyBMaWJyYXJ5RG9jdW1lbnQuZXhwb3J0RmlsZSk7Ci0JCQlpZiAoIWltcG9ydGluZ0xpYlBhdGguZXhpc3RzKCkpIHsKLQkJCQlkYXRhCi0JCQkJCQkuZ2V0RXJyb3JJbmZvKCkKLQkJCQkJCS5hZGRFcnJvcigKLQkJCQkJCQkJTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLlBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMSwgaW1wb3J0aW5nTGliUGF0aC50b1N0cmluZygpKSk7IAotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJYm9vbGVhbiBoYW5kbGVWZXJzaW9uID0gdHJ1ZTsKLQkJCWlmIChoYW5kbGVWZXJzaW9uKSB7Ci0JCQkJdXBHcmFkZUluZm8gPSBuZXcgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UuVXBncmFkZUluZm8oVXBncmFkZUNhbGxlckluZm8udXBncmFkZUltcG9ydFBsdWdpbiwgaW1wb3J0aW5nTGliUGF0aCk7Ci0JCQkJaWYgKCEgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UuaGFuZGxlVG9vbFZlcnNpb24oaW1wb3J0aW5nTGliUGF0aCwgdXBHcmFkZUluZm8pKSB7Ci0JCQkJCWRhdGEKLQkJCQkJLmdldEVycm9ySW5mbygpCi0JCQkJCS5hZGRFcnJvcigKLQkJCQkJCQlOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMuaW1wb3J0UGx1Z2luc1dpemFyZF9FUlJfSW1wb3J0X3BsdWdpbiwgaW1wb3J0aW5nTGliUGF0aC50b1N0cmluZygpKSk7IAotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICh1cEdyYWRlSW5mby5nZXRDb3BpZWRMaWJGaWxlKCkgIT0gbnVsbCkgewotCQkJCQlpbXBvcnRpbmdMaWJQYXRoID0gdXBHcmFkZUluZm8uZ2V0Q29waWVkTGliRmlsZSgpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIHZlcnNpb25FcnJvciA9IENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlLnZlcnNpb25DaGVjayhpbXBvcnRpbmdMaWJQYXRoLmdldEFic29sdXRlUGF0aCgpLCAKLQkJCQkJCUltcG9ydFJlc291cmNlcy5pbXBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlKTsKLQkJCQlpZiAodmVyc2lvbkVycm9yICE9IG51bGwpIHsKLQkJCQkJZGF0YS5nZXRFcnJvckluZm8oKS5hZGRFcnJvcih2ZXJzaW9uRXJyb3IpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQlpbXBvcnRpbmdMaWJEb2MgPSBuZXcgTGlicmFyeURvY3VtZW50KGltcG9ydGluZ0xpYlBhdGgpOwotCQkJCi0JCQlGaWxlIGxpYkZpbGUgPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLmVSZXNvdXJjZSgpLmdldFVSSSgpCi0JCQkJCS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQl0YXJnZXRMaWJEb2MgPSBuZXcgTGlicmFyeURvY3VtZW50KGxpYkZpbGUpOwotCi0JCQlzY2FuTGlicmFyeUZpbGUoaW1wb3J0aW5nTGliRG9jKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgaW1wb3J0LgotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1JbXBvcnQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQkvLyBuZWVkIHRvIGRpc2FibGUgdGhlIHdvcmtzcGFjZSByZWZyZXNoaW5nCi0JCWJvb2xlYW4gcmVmcmVzaCA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5pc0VuYWJsZWQoKTsKLQkJdHJ5IHsKLQkJCWlmIChyZWZyZXNoKSB7Ci0JCQkJLy8gZGlzYWJsZSByZXNvdXJjZSByZWZyZXNoaW5nIGR1cmluZyBpbXBvcnQKLQkJCQkvLwotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQotCQkJX19kb0ltcG9ydChtb25pdG9yKTsKLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHJlZnJlc2gpIHsKLQkJCQkvLyByZS1lbmFibGUgcmVzb3VyY2UgcmVmcmVzaGluZwotCQkJCS8vCi0JCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCQlpZiAodXBHcmFkZUluZm8gIT0gbnVsbCkgewotCQkJCXVwR3JhZGVJbmZvLnJlbW92ZUNvcGllZExpYnJhcnkoKTsKLQkJCQl1cEdyYWRlSW5mbyA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgX19kb0ltcG9ydChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLnNldFRhc2tOYW1lKEltcG9ydFJlc291cmNlcy5QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCUxpc3QgdW5sb2NrZWRQbHVnaW5zID0gdW5sb2NrUGx1Z2lucygpOwotCi0JCQkvLyBUbyBpbXBvcnQgdGhlIHBsdWctaW5zLCB3ZSBuZWVkIHRvIGRvIHRoZSBmb2xsb3dpbmc6Ci0JCQkvLyAxLiBEZWxldGUgdGhlIHBsdWctaW5zIGluIHRoZSBjdXJyZW50IGxpYnJhcnkgaWYgdXNlciBzcGVjaWZ5Ci0JCQkvLyByZW1vdmUKLQkJCS8vIDIuIENvcHkgdGhlIHNlbGVjdGVkIHBsdWdpbiBmaWxlcyB0byB0aGUgZGVzdGluYXRpb24KLQkJCS8vIDMuIFVwZGF0ZSB0aGUgbGlicmFyeS54bWkKLQkJCS8vIDQuIFJlbG9hZCB0aGUgbGlicmFyeQotCQkJCi0JCQlGaWxlIGxpYkZpbGUgPSB0YXJnZXRMaWJEb2MuZ2V0RmlsZSgpOwotCQkJCi0JCQlpZiAobmV3TWVyZ2VTY2hlbWUpIHsJCQkKLQkJCQltZXJnZSh0YXJnZXRMaWJEb2MpOwotCQkJCWlmICh1bmxvY2tlZFBsdWdpbnMuc2l6ZSgpID4gMCkgewotCQkJCQlsb2NrVW5sb2NrZWRQbHVnaW5zKHVubG9ja2VkUGx1Z2lucyk7Ci0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVvcGVuQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQl9Ci0JCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJUmVzb3VyY2VVdGlsLnJlZnJlc2hSZXNvdXJjZXMobGliLCBtb25pdG9yKTsKLQkJCQlyZXR1cm47Ci0JCQl9CQkJCi0KLQkJCS8vIC8vIFJlbW92ZSBleGlzdGluZyBlbnRyaWVzLgotCQkJLy8gcmVtb3ZlRXhpc3RpbmdFbnRyaWVzKHRhcmdldExpYkRvYyk7Ci0KLQkJCS8vIEltcG9ydCBlbnRyaWVzIGFuZCBjb3B5IGZpbGVzLgotCQkJaWYgKGltcG9ydEVudHJpZXModGFyZ2V0TGliRG9jKSkgewotCQkJCS8vIFNhdmUgdGhlIHVwZGF0ZWQgbGlicmFyeSBmaWxlLgotCQkJCXRhcmdldExpYkRvYy5zYXZlKCk7Ci0KLQkJCQkvLyBSZXBsYWNlIHRoZSBndWlkIG9mIHRoZSBvbGQgTWV0aG9kTGlicmFyeSB3aXRoIHRoZSBuZXcgb25lLgotCQkJCWZpeExpYnJhcnlHdWlkKGxpYkZpbGUuZ2V0UGFyZW50RmlsZSgpLCBpbXBvcnRpbmdMaWJEb2MKLQkJCQkJCS5nZXRMaWJyYXJ5R3VpZCgpLCB0YXJnZXRMaWJEb2MuZ2V0TGlicmFyeUd1aWQoKSk7Ci0KLQkJCQkvLyBSZW9wZW4gdGhlIGxpYnJhcnkuCi0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCi0JCQkJLy8gRmluYWxseSwgcmUtbG9jayB0aGUgdW5sb2NrZWQgcGx1Z2lucyBhbmQgc2F2ZSB0aGUgbGlicmFyeQotCQkJCS8vIGFnYWluLgotCQkJCWlmICh1bmxvY2tlZFBsdWdpbnMuc2l6ZSgpID4gMCkgewotCQkJCQlsb2NrVW5sb2NrZWRQbHVnaW5zKHVubG9ja2VkUGx1Z2lucyk7Ci0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBSZS1vcGVuIGxpYnJhcnkgYW5kIGZyZXNoIHRoZSB3b3Jrc3BhY2UuCi0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlb3BlbkN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkJCS8vIHJlZnJlc2ggbGlicmFyeSBmaWxlcyBpbiB3b3Jrc3BhY2UKLQkJCS8vCi0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCVJlc291cmNlVXRpbC5yZWZyZXNoUmVzb3VyY2VzKGxpYiwgbW9uaXRvcik7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgdW5sb2NrUGx1Z2lucygpIHsKLQotCQlMaXN0IHBsdWdpbklkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbzsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpdC5uZXh0KCk7Ci0JCQlpZiAoKGluZm8uZXhpc3RpbmdQbHVnaW4gIT0gbnVsbCkgJiYgaW5mby5zZWxlY3RlZCkgewotCQkJCWlmIChpbmZvLmV4aXN0aW5nUGx1Z2luLmdldFVzZXJDaGFuZ2VhYmxlKCkuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpIHsKLQkJCQkJaW5mby5leGlzdGluZ1BsdWdpbi5zZXRVc2VyQ2hhbmdlYWJsZShuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQkJCXBsdWdpbklkcy5hZGQoaW5mby5leGlzdGluZ1BsdWdpbi5nZXRHdWlkKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBwbHVnaW5JZHM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvY2tVbmxvY2tlZFBsdWdpbnMoTGlzdCB1bmxvY2tlZFBsdWdpbnMpIHsKLQkJTGlzdCBwbHVnaW5zID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCWlmICh1bmxvY2tlZFBsdWdpbnMuY29udGFpbnMocGx1Z2luLmdldEd1aWQoKSkpIHsKLQkJCQlwbHVnaW4uc2V0VXNlckNoYW5nZWFibGUobmV3IEJvb2xlYW4oZmFsc2UpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpbXBvcnRFbnRyaWVzKExpYnJhcnlEb2N1bWVudCB0YXJnZXRMaWJEb2MpIHsKLQkJLy8gMS4gRmluZCB0aGUgZW50cmllcyB0byBiZSByZW1vdmVkLgotCQlMaXN0IGltcG9ydExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm87Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGluZm8uc2VsZWN0ZWQpIHsKLQkJCQlpZiAoaW5mby5leGlzdGluZ1BsdWdpbiA9PSBudWxsKSB7Ci0JCQkJCW5ld0xpc3QuYWRkKGluZm8uZ3VpZCk7Ci0JCQkJfQotCi0JCQkJaW1wb3J0TGlzdC5hZGQoaW5mby5ndWlkKTsKLQkJCX0KLQkJfQotCi0JCVBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvIGNpbmZvOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRDb25maWdzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJY2luZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8pIGl0Lm5leHQoKTsKLQkJCWlmIChjaW5mby5zZWxlY3RlZCkgewotCQkJCWlmIChjaW5mby5leGlzdGluZ0NvbmZpZyA9PSBudWxsKSB7Ci0JCQkJCW5ld0xpc3QuYWRkKGNpbmZvLmd1aWQpOwotCQkJCX0KLQotCQkJCWltcG9ydExpc3QuYWRkKGNpbmZvLmd1aWQpOwotCi0JCQl9Ci0JCX0KLQotCQkvLyAyLiBJdGVyYXRlIHRoZSBkb2N1ZW1udCBhbmQgYWRkIHRoZSBuZXcgZW50cmllcy4KLQkJaWYgKCFuZXdNZXJnZVNjaGVtZSkgewotCQkJaW1wb3J0TGliRW50cmllcyh0YXJnZXRMaWJEb2MsIG5ld0xpc3QpOwotCQl9IGVsc2UgewotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQllbnN1cmVVbmlxdWVOYW1lcyhsaWIuZ2V0TWV0aG9kUGx1Z2lucygpKTsKLQkJCWVuc3VyZVVuaXF1ZU5hbWVzKGxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNvcHlGaWxlcyh0YXJnZXRMaWJEb2MsIGltcG9ydExpc3QsIG5ld0xpc3QpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbXBvcnRMaWJFbnRyaWVzKExpYnJhcnlEb2N1bWVudCB0YXJnZXRMaWJEb2MsIExpc3QgbmV3TGlzdCkgewotCi0JCWlmIChuZXdMaXN0ID09IG51bGwgfHwgbmV3TGlzdC5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gQWRkIHBsdWctaW5zLgotCQlOb2RlTGlzdCBub2RlcyA9IGltcG9ydGluZ0xpYkRvYy5nZXRQbHVnaW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgZ3VpZCA9IExpYnJhcnlEb2N1bWVudC5nZXRHdWlkKG5vZGUpOwotCQkJaWYgKG5ld0xpc3QuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQl0YXJnZXRMaWJEb2MuYWRkUGx1Z2luKG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gQWRkIGNvbmZpZ3VyYXRpb25zLgotCQlub2RlcyA9IGltcG9ydGluZ0xpYkRvYy5nZXRDb25maWd1cmF0aW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIGd1aWQgPSBMaWJyYXJ5RG9jdW1lbnQuZ2V0R3VpZChub2RlKTsKLQkJCWlmIChuZXdMaXN0LmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJdGFyZ2V0TGliRG9jLmFkZENvbmZpZ3VyYXRpb24obm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgcmVzb3VyY2UgZW50cmllcwotCQlub2RlcyA9IGltcG9ydGluZ0xpYkRvYy5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgZ3VpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX2lkKTsKLQkJCWlmIChuZXdMaXN0LmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJdGFyZ2V0TGliRG9jLmFkZFJlc291cmNlKG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gQWRkIHRoZSByZXNvdXJjZSBzdWIgbWFuYWdlcnMuCi0JCW5vZGVzID0gaW1wb3J0aW5nTGliRG9jLmdldFJlc291cmNlU3ViTWFuYWdlcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gTGlicmFyeURvY3VtZW50LmdldFN1Yk1hbmFnZXJCYXNlR3VpZChub2RlCi0JCQkJCS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfaHJlZikpOwotCQkJaWYgKG5ld0xpc3QuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQl0YXJnZXRMaWJEb2MuYWRkUmVzb3VyY2Uobm9kZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb3B5RmlsZXMoTGlicmFyeURvY3VtZW50IHRhcmdldExpYkRvYywgTGlzdCBpbXBvcnRMaXN0LAotCQkJTGlzdCBuZXdMaXN0KSB7Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGltcG9ydExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgc3JjX3VyaSA9IGltcG9ydGluZ0xpYkRvYy5nZXRSZXNvdXJjZVVyaShndWlkKTsKLQkJCVN0cmluZyB0YXJnZXRfdXJpOwotCQkJaWYgKHNyY191cmkgPT0gbnVsbCB8fCBzcmNfdXJpLmxlbmd0aCgpID09IDApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJdGFyZ2V0X3VyaSA9IHNyY191cmk7Ci0JCQkvKgotCQkJaWYgKG5ld0xpc3QuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQl0YXJnZXRfdXJpID0gc3JjX3VyaTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGFyZ2V0X3VyaSA9IHRhcmdldExpYkRvYy5nZXRSZXNvdXJjZVVyaShndWlkKTsgLy8gdGhlIHJlc291cmNlCi0JCQkJLy8gbWlnaHQgYmUKLQkJCQkvLyByZW5hbWVkCi0JCQl9Ci0JCQkqLwotCi0JCQkvLyBDaGVjayB0aGUgcGx1Z2luLnhtaSBmaWxlLiBJZiBpdCBleGlzdHMsIGNvcHkgdGhlIGZvbGRlciB0bwotCQkJLy8gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KLQkJCWZpbmFsIEZpbGUgc3JjX2ZpbGUgPSBpbXBvcnRpbmdMaWJEb2MuZ2V0RmlsZUZyb21Vcmkoc3JjX3VyaSk7Ci0JCQlpZiAoc3JjX2ZpbGUuZXhpc3RzKCkpIHsKLQkJCQlmaW5hbCBGaWxlIHRhcmdldF9maWxlID0gdGFyZ2V0TGliRG9jCi0JCQkJCQkuZ2V0RmlsZUZyb21VcmkodGFyZ2V0X3VyaSk7Ci0KLQkJCQkvLyBpZiBpdCdzIGEgY29uZmlndXJhdGlvbiwgb25seSBjb3B5IHRoZSBmaWxlLAotCQkJCS8vIGlmIGl0J3MgYSBwbHVnaW4sIGNvcHkgdGhlIHdob2xlIGRpcmVjdG9yeQotCi0JCQkJaWYgKGRhdGEuZ2V0UGx1Z2luSW5mbyhndWlkKSAhPSBudWxsKSB7Ci0JCQkJCWlmICh0YXJnZXRfZmlsZS5leGlzdHMoKSkgewotCQkJCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJRGlyQ29weSBjb3B5ID0gbmV3IERpckNvcHkoc3JjX2ZpbGUKLQkJCQkJCQkJCQkuZ2V0UGFyZW50RmlsZSgpLCB0YXJnZXRfZmlsZQotCQkJCQkJCQkJCS5nZXRQYXJlbnRGaWxlKCkpOwotCQkJCQkJCQlmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IGNvcHkuZXhlY3V0ZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY29weURpcihzcmNfZmlsZS5nZXRQYXJlbnRGaWxlKCksIHRhcmdldF9maWxlCi0JCQkJCQkJCS5nZXRQYXJlbnRGaWxlKCkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChkYXRhLmdldENvbmZpZ0luZm8oZ3VpZCkgIT0gbnVsbCAmJiBEaXJDb3B5Lm5lZWRDb3B5KHNyY19maWxlLCB0YXJnZXRfZmlsZSkpIHsKLQkJCQkJZmluYWwgTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaWYgKHRhcmdldF9maWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlmaWxlcy5hZGQodGFyZ2V0X2ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBGaWxlTW9kaWZ5Q2hlY2tlcgotCQkJCQkJCQkJCS5jaGVja01vZGlmeShmaWxlcyk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0KLQotCQkJCQlpZiAoZmlsZUNoZWNrZWRPdXRTdGF0dXMgPT0gbnVsbAotCQkJCQkJCXx8IGZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKSkgewotCQkJCQkJUmVzb3VyY2VIZWxwZXIuY29weUZpbGUoc3JjX2ZpbGUsIHRhcmdldF9maWxlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICgoZmlsZUNoZWNrZWRPdXRTdGF0dXMgIT0gbnVsbCkKLQkJCQkJCSYmICFmaWxlQ2hlY2tlZE91dFN0YXR1cy5pc09LKCkpIHsKLQkJCQkJLy8gbG9nIGVycm9yCi0JCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBJbXBvcnRSZXNvdXJjZXMuaW1wb3J0UGx1Z2luc1dpemFyZF90aXRsZTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBtc2cgPSBJbXBvcnRSZXNvdXJjZXMuaW1wb3J0UGx1Z2luc1dpemFyZF9FUlJfSW1wb3J0X3BsdWdpbjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW5ldyBNc2dEaWFsb2coSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKSkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZywKLQkJCQkJCQkJCQkJZmlsZUNoZWNrZWRPdXRTdGF0dXMpOwotCQkJCQkJfQotCQkJCQl9KTsKLQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIGRpcmVjdG9yaWVzIGZyb20gImZyb21EaXIiIHRvICJ0b0RpciIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlEaXIoRmlsZSBmcm9tRGlyLCBGaWxlIHRvRGlyKSB7Ci0JCUNvcHkgY3AgPSBuZXcgQ29weSgpOwotCQljcC5zZXRPdmVyd3JpdGUodHJ1ZSk7Ci0JCUZpbGVTZXQgc2V0ID0gbmV3IEZpbGVTZXQoKTsKLQkJc2V0LnNldEV4Y2x1ZGVzKENvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlLmV4Y2x1ZGVzKTsKLQkJc2V0LnNldERpcihmcm9tRGlyKTsKLQkJY3AuYWRkRmlsZXNldChzZXQpOwotCQljcC5zZXRUb2Rpcih0b0Rpcik7Ci0JCWNwLnNldFByb2plY3QobmV3IFByb2plY3QoKSk7Ci0JCWNwLmV4ZWN1dGUoKTsKLQotCX0KLQotCS8vIC8qKgotCS8vICogcmVtb3ZlIHRoZSBwbHVnaW4gZW50cnkgZnJvbSB0aGUgbGlicmFyeSBkb2N1bWVudAotCS8vICoKLQkvLyAqIEBwYXJhbSBkb2N1bWVudAotCS8vICogTGlicmFyeURvY3VtZW50Ci0JLy8gKiBAcGFyYW0gZ3VpZAotCS8vICogU3RyaW5nIGd1aWQgb2YgdGhlIHBsdWdpbgotCS8vICovCi0JLy8gcHJpdmF0ZSB2b2lkIHJlbW92ZUV4aXN0aW5nRW50cmllcyhMaWJyYXJ5RG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkvLyAvLyAxLiBGaW5kIHRoZSBlbnRyaWVzIHRvIGJlIHJlbW92ZWQuCi0JLy8gTGlzdCByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvOwotCS8vIGZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JLy8gaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Lm5leHQoKTsKLQkvLyBpZiAoKGluZm8uZXhpc3RpbmdQbHVnaW4gIT0gbnVsbCkgJiYgaW5mby5zZWxlY3RlZCkgewotCS8vIHJlbW92ZUxpc3QuYWRkKGluZm8uZ3VpZCk7Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vIFBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvIGNpbmZvOwotCS8vIGZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldENvbmZpZ3MoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JLy8gY2luZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8pIGl0Lm5leHQoKTsKLQkvLyBpZiAoKGNpbmZvLmV4aXN0aW5nQ29uZmlnICE9IG51bGwpICYmIGNpbmZvLnNlbGVjdGVkKSB7Ci0JLy8gcmVtb3ZlTGlzdC5hZGQoY2luZm8uZ3VpZCk7Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vIC8vIDIuIEl0ZXJhdGUgdGhlIGRvY3VlbW50IGFuZCByZW1vdmUgdGhlIGVudHJpZXMuCi0JLy8gZG9jdW1lbnQucmVtb3ZlUGx1Z2lucyhyZW1vdmVMaXN0KTsKLQkvLyBkb2N1bWVudC5yZW1vdmVDb25maWd1cmF0aW9ucyhyZW1vdmVMaXN0KTsKLQkvLyBkb2N1bWVudC5yZW1vdmVSZXNvdXJjZUVudHJpZXMocmVtb3ZlTGlzdCk7Ci0JLy8gfQotCi0JIC8qKiAKLQkgICogVmFsaWRhdGVzIHNlbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHZhbGlkYXRlU2VsZWN0aW9uKCkgewotCQlkYXRhLmdldEVycm9ySW5mbygpLmNsZWFyKCk7Ci0KLQkJLy8gSXRlcmF0ZSB0aGUgbmV3IHBsdWdpbnMsIG1ha2Ugc3VyZSB0aGUgYmFzZSBpcyBpbmNsdWRlZAotCQkvLyBlaXRoZXIgYXMgYW4gaW1wb3J0aW5nIHBsdWdpbiwgb3IgaXMgaW4gdGhlIGN1cnJlbnQgbGlicmFyeQotCQkvLyBnZXQgdGhlIG1ldGhvZCBwbHVnaW5zIGluIHRoZSBjdXJyZW50IGxpYnJhcnkuCi0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJTGlzdCBwbHVnaW5zID0gKGxpYnJhcnkgPT0gbnVsbCkgPyBuZXcgQXJyYXlMaXN0KCkgOiBsaWJyYXJ5Ci0JCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJTWFwIHBsdWdpbmlkcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQlwbHVnaW5pZHMucHV0KHBsdWdpbi5nZXRHdWlkKCksIHBsdWdpbik7Ci0JCX0KLQotCQkvLyBUaGUgYmFzZSBwbHVnLWlucyBNVVNUIGJlIGVpdGhlciBhIHNlbGVjdGVkIG9uZSBvciBhbiBleGlzdGluZyBvbmUKLQkJLy8gb3RoZXJ3aXNlLCBjYW4ndCBpbXBvcnQKLQkJU2V0IGJhc2VQbHVnaW5zID0gbmV3IEhhc2hTZXQoKTsKLQotCQlTZXQgbmV3UGx1Z2lucyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Ci0JCQkJCS5uZXh0KCk7Ci0JCQlpZiAoaW5mby5zZWxlY3RlZCAmJiAoaW5mby5leGlzdGluZ1BsdWdpbiA9PSBudWxsKSkgewotCQkJCW5ld1BsdWdpbnMuYWRkKGluZm8uZ3VpZCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGIgPSBpbmZvLnVzZWRQbHVnaW5zLml0ZXJhdG9yKCk7IGl0Yi5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBiYXNlID0gaXRiLm5leHQoKTsKLQkJCQkJaWYgKCFiYXNlUGx1Z2lucy5jb250YWlucyhiYXNlKSkgewotCQkJCQkJYmFzZVBsdWdpbnMuYWRkKGJhc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKG5ld1BsdWdpbnMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGJhc2VQbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQlTdHJpbmcgdXJpID0gKFN0cmluZykgZGF0YS5iYXNlUGx1Z2luVXJsTWFwLmdldChndWlkKTsKLQkJCQlpZiAoIW5ld1BsdWdpbnMuY29udGFpbnMoZ3VpZCkgJiYgIXBsdWdpbmlkcy5jb250YWluc0tleShndWlkKSkgewotCQkJCQlTdHJpbmcgbWVzc2FnZTsKLQkJCQkJaWYgKHVyaSAhPSBudWxsICYmIHVyaS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCW1lc3NhZ2UgPSBOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMuUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c1LCB1cmkpOyAKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCU1hcDxTdHJpbmcsIFN0cmluZz4gZ3VpZFRvUGx1Z05hbWVNYXAgPSBpbXBvcnRpbmdMaWJEb2MuZ2V0R3VpZFRvUGx1Z05hbWVNYXAoKTsKLQkJCQkJCVN0cmluZyBwbHVnaW5OYW1lID0gZ3VpZFRvUGx1Z05hbWVNYXAgPT0gbnVsbCA/IG51bGwgOiBndWlkVG9QbHVnTmFtZU1hcC5nZXQoZ3VpZCk7Ci0JCQkJCQlpZiAocGx1Z2luTmFtZSA9PSBudWxsIHx8IHBsdWdpbk5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCW1lc3NhZ2UgPSBJbXBvcnRSZXNvdXJjZXMuUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c2OyAKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJbWVzc2FnZSA9IE5MUy5iaW5kKEltcG9ydFJlc291cmNlcy5QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzUsIAotCQkJCQkJCQkJcGx1Z2luTmFtZSArICIsICIgKyBndWlkKTsgCQkvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZGF0YS5nZXRFcnJvckluZm8oKS5hZGRFcnJvcihtZXNzYWdlKTsKLQotCQkJCQlpZiAodXJpID09IG51bGwgfHwgdXJpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGRhdGEuZ2V0RXJyb3JJbmZvKCkuZ2V0RXJyb3IoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2NhbkxpYnJhcnlGaWxlKExpYnJhcnlEb2N1bWVudCBkb2N1bWVudCkgewotCQl2aXNpdExpYlRhZyhkb2N1bWVudCk7Ci0JCXZpc2l0UmVzb3VyY2VUYWcoZG9jdW1lbnQpOwotCQlkYXRhLnZhbGlkYXRlUGx1Z2lucygpOwotCi0JCS8vIENoZWNrIGJhc2UgcGx1Zy1pbiBkZXBlbmRlbmNpZXMuCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Ci0JCQkJCS5uZXh0KCk7Ci0JCQlpZiAoaW5mby5leGlzdGluZ1BsdWdpbiA9PSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGJhc2UgPSBpbmZvLnVzZWRQbHVnaW5zLml0ZXJhdG9yKCk7IGl0YmFzZQotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBpdGJhc2UubmV4dCgpOwotCQkJCQlpZiAoIWRhdGEuYmFzZVBsdWdpblVybE1hcC5jb250YWluc0tleShndWlkKSkgewotCQkJCQkJZGF0YS5iYXNlUGx1Z2luVXJsTWFwLnB1dChndWlkLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2aXNpdExpYlRhZyhMaWJyYXJ5RG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gUmVsb2FkIHRoZSBlbGVtZW50IG1hcHBpbmcuCi0JCU5vZGVMaXN0IG5vZGVzID0gZG9jdW1lbnQuZ2V0UGx1Z2lucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIHBpID0gZGF0YS5uZXcgUGx1Z2luSW5mbygpOwotCQkJcGkuZ3VpZCA9IExpYnJhcnlEb2N1bWVudC5nZXRHdWlkKG5vZGUpOwotCQkJZGF0YS5nZXRQbHVnaW5zKCkuYWRkKHBpKTsKLQotCQkJLy8gQ2hlY2sgd2l0aCB0aGUgY3VycmVudCBsaWJyYXJ5LCBnZXQgdGhlIHJlbGF0ZWQgaW5mb3JtYXRpb24uCi0JCQlsb2FkRXhpc3RpbmdQbHVnaW5JbmZvKHBpKTsKLQkJfQotCi0JCS8vIFJlbW92ZSB0aGUgdW5uZWVkZWQgY29uZmlndXJhdGlvbnMuCi0JCWJ1aWxkQ29uZmlnSW5mb0Zyb21GaWxlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2aXNpdFJlc291cmNlVGFnKExpYnJhcnlEb2N1bWVudCBkb2N1bWVudCkgewotCQlOb2RlTGlzdCBub2RlcyA9IGRvY3VtZW50LmdldFJlc291cmNlRGVzY3JpcHRvcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfaWQpOwotCQkJU3RyaW5nIHVyaSA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX3VyaSk7Ci0KLQkJCS8vIExvYWQgdGhlIHBsdWdpbi54bWkgZmlsZSBmb3IgZGV0YWlsIGluZm9ybWF0aW9uLgotCQkJRmlsZSBmaWxlID0gZG9jdW1lbnQuZ2V0RmlsZUZyb21VcmkodXJpKTsKLQotCQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIHBpID0gZGF0YS5nZXRQbHVnaW5JbmZvKGd1aWQpOwotCQkJaWYgKHBpICE9IG51bGwpIHsKLQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQlsb2FkUGx1Z2luSW5mbyhmaWxlLCBwaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gUmVtb3ZlIHRoZSBwbHVnLWluIGluZm8gZW50cnkgc2luY2UgdGhpYXMgaXMgbm90Ci0JCQkJCS8vIGEgdmFsaWQgcGx1Zy1pbiB0byBpbXBvcnQuCi0JCQkJCWRhdGEucmVtb3ZlUGx1Z2luSW5mbyhndWlkKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIGlmIG5vdCBwbHVnaW4sIG1pZ2h0IGJlIGEgY29uZmlndXJhdGlvbgotCQkJCVBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvIGNpID0gZGF0YQotCQkJCQkJLmdldENvbmZpZ0luZm8oZ3VpZCk7Ci0JCQkJaWYgKGNpICE9IG51bGwpIHsKLQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCWxvYWRDb25maWdJbmZvKGZpbGUsIGNpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRDb25maWdJbmZvKEZpbGUgc291cmNlLAotCQkJUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8gaW5mbykgewotCQl0cnkgewotCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBYTUxVdGlsLmxvYWRYbWwoc291cmNlKTsKLQkJCUVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCi0JCQlFbGVtZW50IGNvbmZpZ1RhZyA9IG51bGw7Ci0JCQlpZiAocm9vdC5nZXRUYWdOYW1lKCkuZXF1YWxzKAotCQkJCQkib3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQljb25maWdUYWcgPSByb290OwotCQkJfSBlbHNlIHsKLQkJCQlOb2RlTGlzdCBub2RlcyA9IHJvb3QKLQkJCQkJCS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWNvbmZpZ1RhZyA9IChFbGVtZW50KSBub2Rlcy5pdGVtKDApOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGNvbmZpZ1RhZyAhPSBudWxsKSB7Ci0JCQkJaW5mby5uYW1lID0gY29uZmlnVGFnLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZFBsdWdpbkluZm8oRmlsZSBzb3VyY2UsIFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvKSB7Ci0JCXRyeSB7Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IFhNTFV0aWwubG9hZFhtbChzb3VyY2UpOwotCQkJRWxlbWVudCByb290ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLQkJCUVsZW1lbnQgcGx1Z2luVGFnID0gbnVsbDsKLQkJCWlmIChyb290LmdldFRhZ05hbWUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlwbHVnaW5UYWcgPSByb290OwotCQkJfSBlbHNlIHsKLQkJCQlOb2RlTGlzdCBub2RlcyA9IHJvb3QKLQkJCQkJCS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChub2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQkJcGx1Z2luVGFnID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oMCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocGx1Z2luVGFnICE9IG51bGwpIHsKLQkJCQlpbmZvLm5hbWUgPSBwbHVnaW5UYWcuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmZvLnZlcnNpb24gPSBMaWJyYXJ5RG9jdW1lbnQuZ2V0Q2hpbGRWYWx1ZShwbHVnaW5UYWcsCi0JCQkJCQkidmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW5mby5icmllZl9kZXNjID0gTGlicmFyeURvY3VtZW50LmdldENoaWxkVmFsdWUocGx1Z2luVGFnLAotCQkJCQkJImJyaWVmRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWluZm8uYXV0aG9ycyA9IExpYnJhcnlEb2N1bWVudC5nZXRDaGlsZFZhbHVlKHBsdWdpblRhZywKLQkJCQkJCSJhdXRob3JzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmZvLmNoYW5nZURhdGUgPSBMaWJyYXJ5RG9jdW1lbnQuZ2V0Q2hpbGRWYWx1ZShwbHVnaW5UYWcsCi0JCQkJCQkiY2hhbmdlRGF0ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW5mby51cmwgPSBzb3VyY2UudG9TdHJpbmcoKTsKLQotCQkJCS8vIEdldCB0aGUgYmFzZSBwbHVnLWlucy4KLQkJCQlOb2RlTGlzdCBub2RlcyA9IHBsdWdpblRhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYmFzZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCQkJU3RyaW5nIGd1aWQgPSBub2RlLmdldEF0dHJpYnV0ZShMaWJyYXJ5RG9jdW1lbnQuQVRUUl9ocmVmKTsKLQotCQkJCQlpbnQgaW5keCA9IGd1aWQuaW5kZXhPZigiIyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChpbmR4ID4gMCkgewotCQkJCQkJZ3VpZCA9IGd1aWQuc3Vic3RyaW5nKGluZHggKyAxKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWluZHggPSBndWlkLmluZGV4T2YoInVtYTovLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAoaW5keCA+PSAwKSB7Ci0JCQkJCQkJZ3VpZCA9IGd1aWQuc3Vic3RyaW5nKGluZHggKyA2KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpbmZvLnVzZWRQbHVnaW5zLmFkZChndWlkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRFeGlzdGluZ1BsdWdpbkluZm8oUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm8pIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlMaXN0IHBsdWdpbnMgPSAobGlicmFyeSA9PSBudWxsKSA/IG5ldyBBcnJheUxpc3QoKSA6IGxpYnJhcnkKLQkJCQkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJaWYgKHBsdWdpbi5nZXRHdWlkKCkuZXF1YWxzKGluZm8uZ3VpZCkpIHsKLQkJCQlpbmZvLmV4aXN0aW5nUGx1Z2luID0gcGx1Z2luOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRFeGlzdGluZ0NvbmZpZ0luZm8oUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8gaW5mbykgewotCQlNZXRob2RDb25maWd1cmF0aW9uW10gY29uZmlncyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9ucyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCWlmIChjb25maWdzID09IG51bGwgfHwgY29uZmlncy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGNvbmZpZ3NbaV07Ci0JCQlpZiAoY29uZmlnLmdldEd1aWQoKS5lcXVhbHMoaW5mby5ndWlkKSkgewotCQkJCWluZm8uZXhpc3RpbmdDb25maWcgPSBjb25maWc7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyB0aGUgZ3VpZCBvZiB0aGUgb2xkIG1ldGhvZCBsaWJyYXJ5IHdpdGggdGhlIG5ldyBvbmUuCi0JICogPHA+Ci0JICogU2VhcmNoIGZvciB0aGUgZm9sbG93aW5nIGZpbGVzOiBsaWJyYXJ5LnhtaSwgcGx1Z2luLnhtaSwgbW9kZWwueG1pLgotCSAqLwotCXByaXZhdGUgdm9pZCBmaXhMaWJyYXJ5R3VpZChGaWxlIHBhdGgsIFN0cmluZyBvbGRHdWlkLCBTdHJpbmcgbmV3R3VpZCkgewotCQlpZiAoIXBhdGguaXNEaXJlY3RvcnkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRmlsZVtdIGZpbGVzID0gcGF0aC5saXN0RmlsZXMobmV3IEZpbGVGaWx0ZXIoKSB7Ci0KLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKLQotCQkJCWlmIChmLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQkJU3RyaW5nIG5hbWUgPSBmLmdldE5hbWUoKTsKLQkJCQlyZXR1cm4gbmFtZS5lcXVhbHMoImxpYnJhcnkueG1pIikgfHwgbmFtZS5lcXVhbHMoInBsdWdpbi54bWkiKSB8fCBuYW1lLmVxdWFscygibW9kZWwueG1pIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCX0pOwotCi0JCWlmIChmaWxlcyA9PSBudWxsIHx8IGZpbGVzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCWZpeExpYnJhcnlHdWlkKGZpbGVzW2ldLCBvbGRHdWlkLCBuZXdHdWlkKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gUmVhZCBpbiB0aGUgZmlsZSwgdXBkYXRlIGl0IGFuZCBzYXZlIHRoZSBmaWxlLgotCQkJCXRyeSB7Ci0JCQkJCVN0cmluZyBzb3VyY2UgPSBGaWxlVXRpbC5yZWFkRmlsZShmaWxlc1tpXSwKLQkJCQkJCQlGaWxlVXRpbC5FTkNPRElOR19VVEZfOCkudG9TdHJpbmcoKTsKLQkJCQkJaWYgKHNvdXJjZS5pbmRleE9mKG9sZEd1aWQpID49IDApIHsKLQkJCQkJCS8vIFRPRE86IFRoaXMgaXMgYSByZWdleHAgcmVwYWxjZW1lbnQsIGlzIGl0IHNhZmU/Ci0JCQkJCQlzb3VyY2UgPSBzb3VyY2UucmVwbGFjZUFsbChvbGRHdWlkLCBuZXdHdWlkKTsKLQotCQkJCQkJRmlsZVV0aWwud3JpdGVVVEY4RmlsZShmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSwKLQkJCQkJCQkJc291cmNlKTsKLQkJCQkJfQotCi0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbWVyZ2UoTGlicmFyeURvY3VtZW50IHRhcmdldExpYkRvYykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vQ29weSBmaWxlcyBvbmx5IGFzIG5ld01lcmdlU2NoZW1lID0gdHJ1ZQotCQlpbXBvcnRFbnRyaWVzKHRhcmdldExpYkRvYyk7Ci0JCQotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJUmVzb3VyY2UgcmVzMCA9IGxpYi5lUmVzb3VyY2UoKTsKLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01ncjAgPSAoUmVzb3VyY2VNYW5hZ2VyKSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZU1hbmFnZXIocmVzMCk7Ci0JCVJlc291cmNlU2V0IHJlc1NldCA9IHJlczAuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCi0JCW1lcmdlUGx1Z2lucyh0YXJnZXRMaWJEb2MsIGxpYiwgcmVzTWdyMCwgcmVzU2V0KTsJCQotCQltZXJnZUNvbmZpZ3ModGFyZ2V0TGliRG9jLCBsaWIsIHJlc01ncjAsIHJlc1NldCk7Ci0JCQotCQlsaWIuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQotCQkvL0xpYnJhcnlVdGlsLnNhdmVMaWJyYXJ5KGxpYiwgZmFsc2UsIGZhbHNlKTsKLQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJdHJ5IHsKLQkJCXBlcnNpc3Rlci5zYXZlKGxpYi5lUmVzb3VyY2UoKSk7Ci0JCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0JCi0JCQotCQkvL2ZpeExpYnJhcnlHdWlkKHRhcmdldExpYkRvYy5nZXRGaWxlKCkuZ2V0UGFyZW50RmlsZSgpLCBpbXBvcnRpbmdMaWJEb2MKLQkJLy8JCS5nZXRMaWJyYXJ5R3VpZCgpLCB0YXJnZXRMaWJEb2MuZ2V0TGlicmFyeUd1aWQoKSk7Ci0JCQotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlb3BlbkN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1lcmdlUGx1Z2lucyhMaWJyYXJ5RG9jdW1lbnQgdGFyZ2V0TGliRG9jLCBNZXRob2RMaWJyYXJ5IGxpYiwgUmVzb3VyY2VNYW5hZ2VyIHJlc01ncjAsIFJlc291cmNlU2V0IHJlc1NldCkgewotCQlMaXN0IGV4aXN0aW5nUGx1Z2luR3VpZHMgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpdC5uZXh0KCk7Ci0JCQlpZiAoaW5mby5zZWxlY3RlZCAmJiBpbmZvLmV4aXN0aW5nUGx1Z2luICE9IG51bGwpIHsKLQkJCQlpZiAoZXhpc3RpbmdQbHVnaW5HdWlkcyA9PSBudWxsKSB7Ci0JCQkJCWV4aXN0aW5nUGx1Z2luR3VpZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJfQotCQkJCWV4aXN0aW5nUGx1Z2luR3VpZHMuYWRkKGluZm8uZ3VpZCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCU1hcCBwZ1RvUmdNYXAgPSBpbXBvcnRpbmdMaWJEb2MuYnVpbGRQbHVnaW5HdWlkVG9SZXNNZ3JHdWlkTWFwKGV4aXN0aW5nUGx1Z2luR3VpZHMpOwkJCQkKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Lm5leHQoKTsKLQkJCWlmIChpbmZvLnNlbGVjdGVkICYmIGluZm8uZXhpc3RpbmdQbHVnaW4gPT0gbnVsbCkgewotCQkJCW1lcmdlRWxlbWVudChpbmZvLmd1aWQsIHRhcmdldExpYkRvYywgbGliLCByZXNNZ3IwLCByZXNTZXQsIGxpYi5nZXRNZXRob2RQbHVnaW5zKCkpOwotCQkJfSBlbHNlIGlmIChpbmZvLnNlbGVjdGVkICYmIHBnVG9SZ01hcCAhPSBudWxsKSB7CS8vMTUxNzg2Ci0JCQkJUmVzb3VyY2UgcmVzID0gaW5mby5leGlzdGluZ1BsdWdpbi5lUmVzb3VyY2UoKTsKLQkJCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gKFJlc291cmNlTWFuYWdlcikgTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlcyk7Ci0JCQkJU3RyaW5nIGV4aXN0aW5nR3VpZCA9IHJlc01nci5nZXRHdWlkKCk7Ci0JCQkJU3RyaW5nIGltcG9ydGVkR3VpZCA9IChTdHJpbmcpIHBnVG9SZ01hcC5nZXQoaW5mby5ndWlkKTsKLQkJCQlpZiAoaW1wb3J0ZWRHdWlkICE9IG51bGwgJiYgIWltcG9ydGVkR3VpZC5lcXVhbHMoZXhpc3RpbmdHdWlkKSkgewotCQkJCQlyZXNNZ3Iuc2V0R3VpZChpbXBvcnRlZEd1aWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbWVyZ2VDb25maWdzKExpYnJhcnlEb2N1bWVudCB0YXJnZXRMaWJEb2MsIE1ldGhvZExpYnJhcnkgbGliLCBSZXNvdXJjZU1hbmFnZXIgcmVzTWdyMCwgUmVzb3VyY2VTZXQgcmVzU2V0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldENvbmZpZ3MoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbyBpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvKSBpdC5uZXh0KCk7Ci0JCQlpZiAoaW5mby5zZWxlY3RlZCAmJiBpbmZvLmV4aXN0aW5nQ29uZmlnID09IG51bGwpIHsKLQkJCQltZXJnZUVsZW1lbnQoaW5mby5ndWlkLCB0YXJnZXRMaWJEb2MsIGxpYiwgcmVzTWdyMCwgcmVzU2V0LCBsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkpOwotCQkJfQkJCQkJCi0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG1lcmdlRWxlbWVudChTdHJpbmcgZ3VpZCwgTGlicmFyeURvY3VtZW50IHRhcmdldExpYkRvYywgCi0JCQlNZXRob2RMaWJyYXJ5IGxpYiwgUmVzb3VyY2VNYW5hZ2VyIHJlc01ncjAsIFJlc291cmNlU2V0IHJlc1NldCwgTGlzdCBlbGVtZW50cyl7Ci0JCVN0cmluZyBzcmNfdXJpID0gaW1wb3J0aW5nTGliRG9jLmdldFJlc291cmNlVXJpKGd1aWQpOwotCQlpZiAoc3JjX3VyaSA9PSBudWxsIHx8IHNyY191cmkubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUZpbGUgdGFyZ2V0X2ZpbGUgPSB0YXJnZXRMaWJEb2MuZ2V0RmlsZUZyb21Vcmkoc3JjX3VyaSk7Ci0JCVN0cmluZyBwYXRoID0gdGFyZ2V0X2ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkocGF0aCk7Ci0JCVJlc291cmNlIHJlcyA9IHJlc1NldC5nZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXMpOwotCQllbGVtZW50cy5hZGQoZWxlbWVudCk7CQkKLQkJCi0JCU11bHRpRmlsZVNhdmVVdGlsLnJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcihyZXNNZ3IwLCBlbGVtZW50LCB1cmkpOwotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gKFJlc291cmNlTWFuYWdlcikgTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlcyk7Ci0JCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJcmVzTWdyMC5nZXRTdWJNYW5hZ2VycygpLmFkZChyZXNNZ3IpOwotCQl9Ci0JfQkJCi0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29uZmlnSW5mb0Zyb21GaWxlcygpIHsJCi0JCUZpbGUgY29waWVkTGliUGF0aCA9IHVwR3JhZGVJbmZvID09IG51bGwgPyBudWxsIDogdXBHcmFkZUluZm8uZ2V0Q29waWVkTGliRmlsZSgpOwotCQlGaWxlIGltcG9ydGluZ0xpYlBhdGggPSBjb3BpZWRMaWJQYXRoID09IG51bGwgPyBuZXcgRmlsZShkYXRhLmxsRGF0YS5nZXRQYXJlbnRGb2xkZXIoKQotCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyBMaWJyYXJ5RG9jdW1lbnQuZXhwb3J0RmlsZSkgOiBjb3BpZWRMaWJQYXRoOwotCQlGaWxlIGNvbmZpZ0RpciA9IG5ldyBGaWxlKGltcG9ydGluZ0xpYlBhdGguZ2V0UGFyZW50KCksIE11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FKTsKLQkJCi0JCUxpYnJhcnlEb2N1bWVudC5Db25maWdEb2NWaXNpdG9yIHZpc2l0b3IgPSBuZXcgTGlicmFyeURvY3VtZW50LkNvbmZpZ0RvY1Zpc2l0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2aXNpdChGaWxlIGZpbGUsIEVsZW1lbnQgbm9kZSkgewotCQkJCVBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvIGNpID0gZGF0YS5uZXcgQ29uZmlndWFyYXRpb25JbmZvKCk7Ci0JCQkJY2kuZ3VpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX2d1aWQpOwotCQkJCWNpLm5hbWUgPSBub2RlLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlLmdldE5hbWUoKTsKLQkJCQlpbXBvcnRpbmdMaWJEb2MuYWRkVG9HdWlkVG9VcmlNYXAoY2kuZ3VpZCwgdXJpKTsKLQkJCQlkYXRhLmdldENvbmZpZ3MoKS5hZGQoY2kpOwotCQkJCS8vIENoZWNrIHdpdGggdGhlIGN1cnJlbnQgbGlicmFyeSwgZ2V0IHRoZSByZWxhdGVkIGluZm9ybWF0aW9uLgotCQkJCWxvYWRFeGlzdGluZ0NvbmZpZ0luZm8oY2kpOwotCQkJCWlmIChjaS5leGlzdGluZ0NvbmZpZyAhPSBudWxsKSB7Ci0JCQkJCVVSSSByZXNVcmkgPSBjaS5leGlzdGluZ0NvbmZpZy5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKLQkJCQkJdXJpID0gTXVsdGlGaWxlU2F2ZVV0aWwuTUVUSE9EX0NPTkZJR1VSQVRJT05fRk9MREVSX05BTUUgKyBGaWxlLnNlcGFyYXRvciArIHJlc1VyaS5sYXN0U2VnbWVudCgpOwotCQkJCQl1cmkgPSB0YXJnZXRMaWJEb2MuZGVjb2RlVXJpKHVyaSk7Ci0JCQkJCXRhcmdldExpYkRvYy5hZGRUb0d1aWRUb1VyaU1hcChjaS5ndWlkLCB1cmkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCUxpYnJhcnlEb2N1bWVudC52aXNpdENvbmZpZ0ZpbGVzKGNvbmZpZ0RpciwgdmlzaXRvcik7CQkJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZW5zdXJlVW5pcXVlTmFtZXMoTGlzdCBlbGVtZW50cykgewotCQlpZiAoZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJTWFwIG5hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpPTA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnRzLmdldChpKTsKLQkJCW5hbWVNYXAucHV0KGVsZW0uZ2V0TmFtZSgpLnRvVXBwZXJDYXNlKCksIGVsZW0pOwotCQl9Ci0JCQotCQlMaXN0IGltcG9ydGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBpbXBvcnRlZEV4aXN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGVsZW1lbnRzLmdldCgwKSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Lm5leHQoKTsKLQkJCQlpZiAoaW5mby5zZWxlY3RlZCkgewotCQkJCQlpZiAoaW5mby5leGlzdGluZ1BsdWdpbiA9PSBudWxsIHx8IAotCQkJCQkJCSFpbmZvLmV4aXN0aW5nUGx1Z2luLmdldE5hbWUoKS5lcXVhbHMoaW5mby5uYW1lKSkgewotCQkJCQkJaW1wb3J0ZWRMaXN0LmFkZChpbmZvLm5hbWUpOwotCQkJCQkJaWYgKGluZm8uZXhpc3RpbmdQbHVnaW4gIT0gbnVsbCkgewotCQkJCQkJCWltcG9ydGVkRXhpc3RMaXN0LmFkZChpbmZvKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldENvbmZpZ3MoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8gaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbykgaXQubmV4dCgpOwotCQkJCWlmIChpbmZvLnNlbGVjdGVkKSB7Ci0JCQkJCWlmIChpbmZvLmV4aXN0aW5nQ29uZmlnID09IG51bGwgfHwgCi0JCQkJCQkJIWluZm8uZXhpc3RpbmdDb25maWcuZ2V0TmFtZSgpLmVxdWFscyhpbmZvLm5hbWUpKSB7Ci0JCQkJCQlpbXBvcnRlZExpc3QuYWRkKGluZm8ubmFtZSk7Ci0JCQkJCQlpZiAoaW5mby5leGlzdGluZ0NvbmZpZyAhPSBudWxsKSB7Ci0JCQkJCQkJaW1wb3J0ZWRFeGlzdExpc3QuYWRkKGluZm8pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQkJCQkKLQkJCX0KLQkJfQotCQlmb3IgKGludCBpPTA7IGk8aW1wb3J0ZWRMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGltcG9ydGVkTGlzdC5nZXQoaSk7Ci0JCQlTdHJpbmcgcmVuYW1lZCA9IG5hbWU7Ci0JCQl3aGlsZSAobmFtZU1hcC5jb250YWluc0tleShyZW5hbWVkLnRvVXBwZXJDYXNlKCkpKSB7Ci0JCQkJcmVuYW1lZCArPSAiX3JlbmFtZWQiOwotCQkJfQotCQkJaWYgKHJlbmFtZWQgIT0gbmFtZSkgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IChNZXRob2RFbGVtZW50KSBuYW1lTWFwLmdldChuYW1lLnRvVXBwZXJDYXNlKCkpOwotCQkJCUxpYnJhcnlWaWV3LnJ1blJlbmFtZShlbGVtLCByZW5hbWVkKTsKLQkJCX0JCQkKLQkJfQkJCQkKLQkJZm9yIChpbnQgaT0wOyBpPGltcG9ydGVkRXhpc3RMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3QgaW5mbyA9IGltcG9ydGVkRXhpc3RMaXN0LmdldChpKTsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IGluZm8gaW5zdGFuY2VvZiBQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gPyAKLQkJCQkJKE1ldGhvZEVsZW1lbnQpKChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGluZm8pLmV4aXN0aW5nUGx1Z2luIDoKLQkJCQkJKE1ldGhvZEVsZW1lbnQpKChQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbykgaW5mbykuZXhpc3RpbmdDb25maWc7Ci0JCQlTdHJpbmcgbmV3TmFtZSA9IGluZm8gaW5zdGFuY2VvZiBQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gPyAKLQkJCQkJKFN0cmluZykoKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaW5mbykubmFtZSA6Ci0JCQkJCShTdHJpbmcpKChQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbykgaW5mbykubmFtZTsJCQkJCQkJCQotCQkJTGlicmFyeVZpZXcucnVuUmVuYW1lKGVsZW0sIG5ld05hbWUpOwkJCi0JCX0JCi0JCQotCQkKLQkJCi0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9SZXNvdXJjZVNjYW5uZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9SZXNvdXJjZVNjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTQ5YmU0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvUmVzb3VyY2VTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSAqIHV0aWxpdHkgY2xhc3MgdG8gc2NhbiBhbmQgY29weSByZXNvdXJjZXMgZnJvbSB0aGUgc291cmNlIGxpYnJhcnkgdG8gdGhlIHRhcmdldCBsaWJyYXJ5Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlU2Nhbm5lciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9zcmNfcmVmID0gUGF0dGVybi5jb21waWxlKCJzcmNcXHMqPVxccypcIiguKj8pXCIiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLS8vCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2xpbmtfcmVmID0gUGF0dGVybi5jb21waWxlKCI8YVxccys/KFtePl0qKT4oLio/KTwvYT4iLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9ocmVmX3JlZiA9IFBhdHRlcm4uY29tcGlsZSgiaHJlZlxccyo9XFxzKlwiKC4qPylcIiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JRmlsZSBzcmNMaWJSb290OwotCUZpbGUgdGFyZ2V0TGliUm9vdDsKLQkKLQlwcml2YXRlIE1hcCBuZXdGaWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIE1hcCBleGlzdGluZ0ZpbGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCQotCXB1YmxpYyBSZXNvdXJjZVNjYW5uZXIoRmlsZSBzcmNMaWJSb290LCBGaWxlIHRhcmdldExpYlJvb3QpIHsKLQkJdGhpcy5zcmNMaWJSb290ID0gc3JjTGliUm9vdDsKLQkJdGhpcy50YXJnZXRMaWJSb290ID0gdGFyZ2V0TGliUm9vdDsKLQl9Ci0JCi0JLyoqCi0JICogc2NhbiB0aCBldGV4dCBhbmQgY29weSB0aGUgcmVzb3VyY2VzCi0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gc291cmNlIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNjYW4oTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIHNvdXJjZSkgewotCQkKLQkJdHJ5Ci0JCXsKLQkJCS8vIHByb2Nlc3MgaW1hZ2VzIGFuZCBvdGhlciBzcmMgcmVzb3VyY2VzCi0JCQlNYXRjaGVyIG0gPSBwX3NyY19yZWYubWF0Y2hlcihzb3VyY2UpOwotCQkJd2hpbGUgKCBtLmZpbmQoKSApCi0JCQl7Ci0JCQkJU3RyaW5nIHVybCA9IG0uZ3JvdXAoMSk7Ci0JCQkJcHJvY2Vzc1VybChvd25lciwgdXJsKTsKLQkJCX0KLQotCQkJLy8gcHJvY2VzcyBocmVmcwotCQkJbSA9IHBfaHJlZl9yZWYubWF0Y2hlcihzb3VyY2UpOwotCQkJCi0JCQl3aGlsZSAoIG0uZmluZCgpICkKLQkJCXsKLQkJCQlTdHJpbmcgdXJsID0gbS5ncm91cCgxKTsKLQkJCQlwcm9jZXNzVXJsKG93bmVyLCB1cmwpOwotCQkJfQkJCQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpCi0JCXsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIHByb2Nlc3MgdGhlIHVybCBhbmQgY29weSB0aGUgcmVzb3VyY2UKLQkgKiBpZiB0aGUgb3duZXIgZWxlbWVudCBpcyBzcGVjaWZpZWQsIHRoZSB1cmwgaXMgcmVsYXRpdmUgdG8gdGhlIG93bmVyIGVsZW1lbnQsIAotCSAqb3RoZXJ3aXNlIGl0J3MgcmVsYXRpdmUgdG8gdGhlIGxpYnJhcnkKLQkgKgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSB1cmwKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1VybChNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgdXJsKSB7Ci0JCQotCQlpZiAoIHVybCA9PSBudWxsICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpbnQgaW5kZXggPSB1cmwuaW5kZXhPZigiIyIpOyAvLyROT04tTkxTLTEkCi0JCWlmICggaW5kZXggPj0gMCApCi0JCXsKLQkJCXVybCA9IHVybC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQl9Ci0JCQotCQlpbmRleCA9IHVybC5pbmRleE9mKCI/Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCBpbmRleCA+PSAwICkKLQkJewotCQkJdXJsID0gdXJsLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCX0KLQkJCi0JCWlmICh1cmwudHJpbSgpLmxlbmd0aCgpID09IDAgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIHRoZSB1cmwgaXMgcmVsYXRpdmUgdG8gdGhlIG93bmVyIGVsZW1lbnQKLQkJLy8gbmVlZCB0byBjb252ZXJ0IHRvIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5IHJvb3QKLQkJRmlsZSBzcmNGaWxlID0gbnVsbDsKLQkJRmlsZSB0YXJnZXRGaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmICggb3duZXIgIT0gbnVsbCApIHsKLQkJCQlTdHJpbmcgZWxlbWVudFBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChvd25lcik7Ci0JCQkJc3JjRmlsZSA9IG5ldyBGaWxlKG5ldyBGaWxlKHNyY0xpYlJvb3QsIGVsZW1lbnRQYXRoKSwgdXJsKTsJCQotCQkJCXRhcmdldEZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZSh0YXJnZXRMaWJSb290LCBlbGVtZW50UGF0aCksIHVybCk7CQotCQkJfSBlbHNlIHsKLQkJCQlzcmNGaWxlID0gbmV3IEZpbGUoc3JjTGliUm9vdCwgdXJsKTsJCQotCQkJCXRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXRMaWJSb290LCB1cmwpOwkJCQkKLQkJCX0KLQkJCQotCQkJaWYgKCBzcmNGaWxlLmlzRmlsZSgpICYmIHNyY0ZpbGUuZXhpc3RzKCkgKSB7Ci0KLQkJCQlzcmNGaWxlID0gc3JjRmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7Ci0JCQkJdGFyZ2V0RmlsZSA9IHRhcmdldEZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCQkJCQotCQkJCWlmICggdGFyZ2V0RmlsZS5leGlzdHMoKSApIHsKLQkJCQkJaWYgKCAhZXhpc3RpbmdGaWxlTWFwLmNvbnRhaW5zS2V5KHNyY0ZpbGUpICkgewotCQkJCQkJaWYgKCBzcmNGaWxlLmxlbmd0aCgpICE9IHRhcmdldEZpbGUubGVuZ3RoKCkgCi0JCQkJCQkJCXx8IHNyY0ZpbGUubGFzdE1vZGlmaWVkKCkgIT0gdGFyZ2V0RmlsZS5sYXN0TW9kaWZpZWQoKSApCi0JCQkJCQl7Ci0JCQkJCQkJZXhpc3RpbmdGaWxlTWFwLnB1dChzcmNGaWxlLCB0YXJnZXRGaWxlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICggIW5ld0ZpbGVNYXAuY29udGFpbnNLZXkoc3JjRmlsZSkgKSB7Ci0JCQkJCQluZXdGaWxlTWFwLnB1dChzcmNGaWxlLCB0YXJnZXRGaWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gTG9nIHRoZSBlcnJvciBhbmQgcHJvY2VlZC4gVE9ETwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotCQotCS8qKgotCSAqIENvcGllcyByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmVzb3VyY2UoU3RyaW5nIHVybCkgewotCQlwcm9jZXNzVXJsKG51bGwsIHVybCk7Ci0JfQotCQotCS8qKgotCSAqIENvcGllcyByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmVzb3VyY2UoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIHVybCkgewotCQlwcm9jZXNzVXJsKG93bmVyLCB1cmwpOwotCX0KLQkKLQkvKioKLQkgKiByZXR1cm4gYSBsaXN0IG9mIGFsbCB0aGUgZmlsZXMgdG8gYmUgcmVwbGFjZWQKLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIGZpbGUgcGF0aCBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRGaWxlc1RvYmVSZXBsYWNlZCgpIHsKLQkJTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKCBleGlzdGluZ0ZpbGVNYXAuc2l6ZSgpID4gMCApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBleGlzdGluZ0ZpbGVNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQlGaWxlIGYgPSAoRmlsZSlpdC5uZXh0KCk7Ci0JCQkJaWYgKGYgIT0gbnVsbCApIHsKLQkJCQkJU3RyaW5nIHBhdGggPSBmLmdldEFic29sdXRlUGF0aCgpOwotCQkJCQlpZiAoICFmaWxlcy5jb250YWlucyhwYXRoKSApIHsKLQkJCQkJCWZpbGVzLmFkZChwYXRoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZpbGVzOwotCX0KLQkKLQkvKioKLQkgKiBjb3B5IGFsbCB0aGUgZmlsZXMgdG8gdGhlIGRlc3RpbmF0aW9uCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkKLQkJZm9yIChJdGVyYXRvciBpdCA9IG5ld0ZpbGVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSlpdC5uZXh0KCk7Ci0JCQlGaWxlIHNyY0ZpbGUgPSAoRmlsZSkgZW50cnkuZ2V0S2V5KCk7Ci0JCQlGaWxlIHRhcmdldEZpbGUgPSAoRmlsZSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCVJlc291cmNlSGVscGVyLmNvcHlGaWxlKHNyY0ZpbGUsIHRhcmdldEZpbGUpOwotCQkJCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgY29waWVkOiAiICsgc3JjRmlsZSk7Ci0JCX0JCi0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZXhpc3RpbmdGaWxlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpaXQubmV4dCgpOwotCQkJRmlsZSBzcmNGaWxlID0gKEZpbGUpIGVudHJ5LmdldEtleSgpOwotCQkJRmlsZSB0YXJnZXRGaWxlID0gKEZpbGUpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlSZXNvdXJjZUhlbHBlci5jb3B5RmlsZShzcmNGaWxlLCB0YXJnZXRGaWxlKTsKLQkJCQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIGNvcGllZDogIiArIHNyY0ZpbGUpOwotCQl9CQotCX0KLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZmIxMTE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBhbmQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBtZXRob2QgcGx1Zy1pbiBhbmQgY29uZmlndXJhdGlvbiBpbXBvcnQgc2VydmljZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvRGlmZlJlcG9ydENvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvRGlmZlJlcG9ydENvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMWY3NjQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0RpZmZSZXBvcnRDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuRWxlbWVudERpZmZUcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBkaWZmIHJlcG9ydC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpZmZSZXBvcnRDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaWZmUmVwb3J0Q29udGVudFByb3ZpZGVyKCkgewotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnREaWZmVHJlZSkgewotCQkJCi0JCQlNZXRob2RFbGVtZW50IGUgPSAoKEVsZW1lbnREaWZmVHJlZSlpbnB1dEVsZW1lbnQpLmdldEJhc2VFbGVtZW50KCk7Ci0JCQkKLQkJCS8vIGRvbid0IHNob3cgc3ViLXBhY2thZ2VzIHVuZGVyIHByb2Nlc3MgY29tcG9uZW50LCBoaWRlIHRoZSBwcm9jZXNzIGRldGlhbAotCQkJaWYgKCAoZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpICkgewotCQkJCXJldHVybiBuZXcgT2JqZWN0W10ge307Ci0JCQl9Ci0KLQkJCUxpc3QgaXRlbXMgPSAoKEVsZW1lbnREaWZmVHJlZSkgaW5wdXRFbGVtZW50KS5nZXRDaGlsZHJlbigpOwotCQkJaWYgKGl0ZW1zICE9IG51bGwpIHsKLQkJCQlMaXN0IGRpcnR5SXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJRWxlbWVudERpZmZUcmVlIGl0ZW0gPSAoRWxlbWVudERpZmZUcmVlKSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChpdGVtLmlzT2xkT25seSgpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gMTUwODk1SW1wb3J0IENvbmZpZzogQ3VzdG9tQ2F0ZWdvcnkgZGlkIG5vdCBzeW5jIHVwIGJ5IGltcG9ydAotCQkJCQkvLyB0byBmaXggdGhpcyBwcm9ibGVtLCB3ZSBuZWVkIHRvIGluY2x1ZGUgdGhlIEhpZGRlbiByb290IGN1c3RvbUNhdGVnb3J5IHBhY2thZ2UgCi0JCQkJCS8vIGJ1dCBuZWVkIHRvIGhpZGUgaGVyZQotCQkJCQlNZXRob2RFbGVtZW50IGJhc2UgPSBpdGVtLmdldEJhc2VFbGVtZW50KCk7Ci0JCQkJCWlmICggKGJhc2UgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSAKLQkJCQkJCQkmJiBUbmdVdGlsLmlzUm9vdEN1dG9tQ2F0ZWdvcnlQYWNrYWdlKChNZXRob2RQYWNrYWdlKWJhc2UpICkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWRpcnR5SXRlbXMuYWRkKGl0ZW0pOwotCQkJCX0KLQotCQkJCXJldHVybiBkaXJ0eUl0ZW1zLnRvQXJyYXkoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHt9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudHMocGFyZW50RWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudERpZmZUcmVlKSB7Ci0JCQlyZXR1cm4gKChFbGVtZW50RGlmZlRyZWUpIGVsZW1lbnQpLmdldFBhcmVudCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudERpZmZUcmVlKSB7Ci0JCQlyZXR1cm4gKChFbGVtZW50RGlmZlRyZWUpIGVsZW1lbnQpLmhhc0NoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvRGlmZlJlcG9ydExhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0RpZmZSZXBvcnRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhYzZjZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvRGlmZlJlcG9ydExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5FbGVtZW50RGlmZlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0vKioKLSAqIFRoZSBsYWJlbCBwcm92aWRlciBmb3IgdGhlIGRpZmYgcmVwb3J0LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlmZlJlcG9ydExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciwKLQkJSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaWZmUmVwb3J0TGFiZWxQcm92aWRlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2VGcm9tT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCXJldHVybiB0aGlzLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFbGVtZW50RGlmZlRyZWUpIHsKLQkJCUVsZW1lbnREaWZmVHJlZSBkaWZmVHJlZSA9IChFbGVtZW50RGlmZlRyZWUpIG9iamVjdDsKLQkJCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQkJcmV0dXJuIGRpZmZUcmVlLmdldE5hbWUoKTsKLQotCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKSB7Ci0JCQkJcmV0dXJuIGRpZmZUcmVlLmdldENvbnRlbnRUeXBlKCk7Ci0JCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDIpIHsKLQkJCQlyZXR1cm4gKGRpZmZUcmVlLmdldEltcG9ydEVsZW1lbnQoKSA9PSBudWxsKSA/ICIiIDogSW1wb3J0UmVzb3VyY2VzLkRpZmZSZXBvcnRMYWJlbFByb3ZpZGVyX3llczsgCi0JCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDMpIHsKLQkJCQlyZXR1cm4gKGRpZmZUcmVlLmdldEJhc2VFbGVtZW50KCkgPT0gbnVsbCkgPyAiIiA6IEltcG9ydFJlc291cmNlcy5EaWZmUmVwb3J0TGFiZWxQcm92aWRlcl95ZXM7IAotCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSA0KSB7Ci0JCQkJcmV0dXJuIGRpZmZUcmVlLmdldERpZmZNZXNzYWdlKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtblRleHQob2JqZWN0LCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBTaW5jZSB3ZSB3b24ndCBldmVyIGdlbmVyYXRlIHRoZXNlIG5vdGlmaWNhdGlvbnMsIHdlIGNhbiBqdXN0IGlnbm9yZQotCSAqIHRoaXMuCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KLQotCS8qKgotCSAqIFNpbmNlIHdlIHdvbid0IGV2ZXIgYWRkIGxpc3RlbmVycywgd2UgY2FuIGp1c3QgaWdub3JlIHRoaXMuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KLQotCS8qKgotCSAqIEFsd2F5cyByZXR1cm5zIHRydWUgZm9yIG5vdy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGlkKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9EaWZmUmVwb3J0Vmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9EaWZmUmVwb3J0Vmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0NmYyMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvRGlmZlJlcG9ydFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlndXJhdGlvbkltcG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOwotCi0vKioKLSAqIERpc3BsYXlzIHRoZSBiZWZvcmUgYW5kIGFmdGVyIG1ldGhvZCBsaWJyYXJ5IGRpZmZlcmVuY2VzIGZvciBhbiBpbXBvcnQKLSAqIG9wZXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlmZlJlcG9ydFZpZXdlciB7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHBhcmVudDsKLQotCXByb3RlY3RlZCBDaGVja2JveFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotCUNvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGRhdGE7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlEaWZmUmVwb3J0Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIENvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGRhdGEpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JCQotCQl0cmVlVmlld2VyID0gbmV3IENoZWNrYm94VHJlZVZpZXdlcihwYXJlbnQpOwotCQl0cmVlVmlld2VyLmdldENvbnRyb2woKQotCQkJCS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IERpZmZSZXBvcnRDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgRGlmZlJlcG9ydExhYmVsUHJvdmlkZXIoKSk7Ci0JCWNyZWF0ZVRhYmxlQ29sdW1ucygpOwotCQkKLQkJYWRkTGlzdGVuZXJzKCk7Ci0JCQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRhYmxlIGNvbHVtbnMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYmxlQ29sdW1ucygpIHsKLQkJVHJlZSB0cmVlID0gdHJlZVZpZXdlci5nZXRUcmVlKCk7Ci0JCXRyZWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdHJlZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLQkJVHJlZUNvbHVtbiBjb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSwgMCk7Ci0JCWNvbHVtbi5zZXRUZXh0KEltcG9ydFJlc291cmNlcy5EaWZmUmVwb3J0Vmlld2VyX2NvbnRlbnQpOyAvLyROT04tTkxTLTEkCi0JCWNvbHVtbi5zZXRXaWR0aCgyMDApOwotCi0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FLCAxKTsKLQkJY29sdW1uLnNldFRleHQoSW1wb3J0UmVzb3VyY2VzLkRpZmZSZXBvcnRWaWV3ZXJfdHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJY29sdW1uLnNldFdpZHRoKDE1MCk7Ci0KLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUsIDIpOwotCQljb2x1bW4uc2V0VGV4dChJbXBvcnRSZXNvdXJjZXMuRGlmZlJlcG9ydFZpZXdlcl9pbl9pbXBvcnQpOyAvLyROT04tTkxTLTEkCi0JCWNvbHVtbi5zZXRXaWR0aCg3NSk7Ci0KLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUsIDMpOwotCQljb2x1bW4uc2V0VGV4dChJbXBvcnRSZXNvdXJjZXMuRGlmZlJlcG9ydFZpZXdlcl9pbl9saWIpOyAvLyROT04tTkxTLTEkCi0JCWNvbHVtbi5zZXRXaWR0aCg3NSk7Ci0KLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUsIDQpOwotCQljb2x1bW4uc2V0VGV4dChJbXBvcnRSZXNvdXJjZXMuRGlmZlJlcG9ydFZpZXdlcl9zdGF0dXMpOyAvLyROT04tTkxTLTEkCi0JCWNvbHVtbi5zZXRXaWR0aCgxMDApOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSByZXZpdy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93UmVwb3J0KE9iamVjdCBpbnB1dCkgewotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJdHJlZVZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0JCXNldENoZWNrU3RhdGVzKCk7Ci0JCXRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJLy8gYWRkIGEgY2hlY2sgc3RhdGUgY2hhbmdlIGxpc3RlbmVyCi0JCXRyZWVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWJvb2xlYW4gY2hlY2tlZCA9IGV2ZW50LmdldENoZWNrZWQoKTsKLQkJCQl1cGRhdGVDaGVja1N0YXRlcyhldmVudC5nZXRFbGVtZW50KCksIGNoZWNrZWQpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNoZWNrU3RhdGVzKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGNoZWNrZWQpIHsKLQotCQkvLyBPYmplY3QgZWxlbWVudCA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQotCQlpZiAoY2hlY2tlZCA9PSB0cnVlKSB7Ci0JCQlJVHJlZUNvbnRlbnRQcm92aWRlciBjcCA9IChJVHJlZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlcgotCQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCQljaGVja1BhcmVudChjcCwgZWxlbWVudCk7Ci0JCQkvLyB0cmVlVmlld2VyLnNldENoZWNrZWQoZWxlbWVudCwgdHJ1ZSk7Ci0JCX0KLQkJZWxzZQotCQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKGVsZW1lbnQsIGZhbHNlKTsKLQkJCQotCQlzZWxlY3Rpb25DaGlsZHJlbihlbGVtZW50LCBjaGVja2VkKTsKLQotCQlzZXREYXRhKHRyZWVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpOwotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY2hlY2tlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoaWxkcmVuKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGNoZWNrZWQpIHsKLQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY3AgPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpIHRyZWVWaWV3ZXIKLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCU9iamVjdFtdIGNoaWxkcyA9IGNwLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcy5sZW5ndGg7IGkrKykgewotCQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKGNoaWxkc1tpXSwgY2hlY2tlZCk7Ci0JCQlzZWxlY3Rpb25DaGlsZHJlbihjaGlsZHNbaV0sIGNoZWNrZWQpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgY2hlY2tQYXJlbnQoSVRyZWVDb250ZW50UHJvdmlkZXIgY3AsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkgLyoKLQkJCQkJCQkJCQkJCQkJCQkgKiB8fCBlbGVtZW50ID09Ci0JCQkJCQkJCQkJCQkJCQkJICogY3VycmVudFJvb3ROb2RlCi0JCQkJCQkJCQkJCQkJCQkJICovKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJT2JqZWN0IHBhcmVudCA9IExpYnJhcnlVdGlsLnVud3JhcChjcC5nZXRQYXJlbnQoZWxlbWVudCkpOwotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChwYXJlbnQsIHRydWUpOwotCQkJLy8gY29uZmlnRmFjdG9yeS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmFkZCgoRU9iamVjdClwYXJlbnQsCi0JCQkvLyBmYWxzZSk7Ci0JCQljaGVja1BhcmVudChjcCwgcGFyZW50KTsKLQkJfQotCi0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRDaGVja1N0YXRlcygpIHsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCXRyeSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKTsKLQkJCXNlbGVjdGlvbkNoaWxkcmVuKGVsZW1lbnQsIHRydWUpOwotCQl9IGZpbmFsbHkgewotCQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCi0JCXNldERhdGEodHJlZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXREYXRhKE9iamVjdFtdIHNlbHMpIHsKLQkJaWYgKCBzZWxzID09IG51bGwgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWRhdGEuaW1wb3J0TGlzdC5jbGVhcigpOwotCQlmb3IgKCBpbnQgaSA9IDA7IGkgPCBzZWxzLmxlbmd0aDsgaSsrICkgewotCQkJZGF0YS5pbXBvcnRMaXN0LmFkZChzZWxzW2ldKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydENvbmZpZ1JlcG9ydFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydENvbmZpZ1JlcG9ydFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODZjYWQ2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRDb25maWdSZXBvcnRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IGRpc3BsYXlzIHRoZSByZXN1bHQgb2YgYW4gaW1wb3J0IG9wZXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydENvbmZpZ1JlcG9ydFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlIGltcG9ydGluZ1NlcnZpY2U7Ci0KLQlEaWZmUmVwb3J0Vmlld2VyIHZpZXdlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEltcG9ydENvbmZpZ1JlcG9ydFBhZ2UoQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UgaW1wb3J0aW5nU2VydmljZSkgewotCQlzdXBlcihJbXBvcnRSZXNvdXJjZXMuSW1wb3J0Q29uZmlnUmVwb3J0UGFnZV90aXRsZSk7IAotCQl0aGlzLmltcG9ydGluZ1NlcnZpY2UgPSBpbXBvcnRpbmdTZXJ2aWNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RICi0JCQkJfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgKLQkJCQl8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpKTsKLQotCQl2aWV3ZXIgPSBuZXcgRGlmZlJlcG9ydFZpZXdlcihjb250YWluZXIsIGltcG9ydGluZ1NlcnZpY2UuZ2V0SW1wb3J0RGF0YSgpKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBTaG93IHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93UmVzdWx0KCkgewotCQkvLyBBbmFsaXplIHRoZSBpbXBvcnRpbmcgY29uZmlndXJhdGlvbiBhbmQgcmVwb3J0IHJlc3VsdC4KLQkJaW1wb3J0aW5nU2VydmljZS5hbmFseXplKG51bGwpOwotCi0JCXZpZXdlci5zaG93UmVwb3J0KGltcG9ydGluZ1NlcnZpY2UuZ2V0RGlmZlRyZWUoKSk7Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MjM0MzJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TYXZlQWxsRWRpdG9yc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5MaWJyYXJ5QmFja3VwVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEEgd2l6YXJkIHRoYXQgaW1wb3J0cyBleHBvcnRlZCBsaWJyYXJ5IGNvbmZpZ3VyYXRpb25zIGludG8gdGhlIGN1cnJlbnQgbWV0aG9kCi0gKiBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElJbXBvcnRXaXphcmQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9USVRMRSA9IEltcG9ydFJlc291cmNlcy5pbXBvcnRDb25maWdXaXphcmRfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBib29sZWFuIG9rVG9Db21wbGV0ZSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2UgcGFnZTE7Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0Q29uZmlnc1RvSW1wb3J0IGNvbmZpZ1BhZ2U7Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2Ugc3BlY3NQYWdlOwotCi0JcHJvdGVjdGVkIENvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGRhdGEgPSBuZXcgQ29uZmlndXJhdGlvbkltcG9ydERhdGEoKTsKLQotCXByb3RlY3RlZCBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZSBzZXJ2aWNlID0gbmV3IENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlKAotCQkJZGF0YSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkKCkgewotCQlzZXRXaW5kb3dUaXRsZShXSVpBUkRfVElUTEUpOwotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJSUZpbGVNYW5hZ2VyIGZpbGVNZ3IgPSBTZXJ2aWNlcy5nZXRGaWxlTWFuYWdlcigpOwotCQlmaWxlTWdyLmNoZWNrTW9kaWZ5KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSwKLQkJCQlNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkpOwotCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCAmJiBtYW5hZ2VyLmlzTWV0aG9kTGlicmFyeVJlYWRPbmx5KCkpIHsKLQkJCUltcG9ydFBsdWdpbgotCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCVdJWkFSRF9USVRMRSwKLQkJCQkJCQlJbXBvcnRSZXNvdXJjZXMuSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9yZWFkb25seSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCVNhdmVBbGxFZGl0b3JzUGFnZS5hZGRQYWdlSWZOZWVkZWQodGhpcywgdHJ1ZSwgbnVsbCwgbnVsbCwgSW1wb3J0UGx1Z2luCi0JCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC93aXpiYW4vSW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0KLQkJcGFnZTEgPSBuZXcgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZShkYXRhLCBzZXJ2aWNlKTsKLQkJYWRkUGFnZShwYWdlMSk7Ci0KLQkJY29uZmlnUGFnZSA9IG5ldyBTZWxlY3RDb25maWdzVG9JbXBvcnQoc2VydmljZSk7Ci0JCWFkZFBhZ2UoY29uZmlnUGFnZSk7Ci0KLQkJc3BlY3NQYWdlID0gbmV3IFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlKGRhdGEpOwotCQlhZGRQYWdlKHNwZWNzUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUxpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX0NPTkZJR1VSQVRPTik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJcmV0dXJuIG9rVG9Db21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCS8vIFByb21wdCB0aGUgdXNlciB0byBiYWNrIHVwIGxpYnJhcnkuCi0JCUxpYnJhcnlCYWNrdXBVdGlsLnByb21wdEJhY2t1cExpYnJhcnkobnVsbCwgbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSkpOwotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCS8vIFN0YXJ0IHRoZSBpbXBvcnQuCi0JCQkJCW1vbml0b3IKLQkJCQkJCQkuYmVnaW5UYXNrKAotCQkJCQkJCQkJSW1wb3J0UmVzb3VyY2VzLkltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfTVNHMSwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgLy8kTk9OLU5MUy0xJAkJCQkJCi0JCQkJCXNlcnZpY2UucGVyZm9ybUltcG9ydChtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCBmYWxzZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJSW1wb3J0UGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJSW1wb3J0UmVzb3VyY2VzLkltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfZXJyb3IsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlyZWFsRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCS8vcmVjb3JkIHRoZSBvcGVuZWQgZGlyIGludG8gcHJlZmVyZW5jZSBzdG9yZQotCQlJbXBvcnRVSVByZWZlcmVuY2VzLmFkZFJlY2VudGx5SW1wb3J0Q29uZmlnRGlyKGRhdGEubGxEYXRhCi0JCQkJLmdldFBhcmVudEZvbGRlcigpKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydFBsdWdpbldpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0UGx1Z2luV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQzN2I4NjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0UGx1Z2luV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLlNhdmVBbGxFZGl0b3JzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLlBsdWdpbkltcG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uUGx1Z2luRGVwSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTGlicmFyeUJhY2t1cFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEEgd2l6YXJkIHRoYXQgaW1wb3J0cyBhbiBleHBvcnRlZCBtZXRob2QgcGx1Zy1pbnMgaW50byB0aGUgY3VycnJlbnQgbWV0aG9kCi0gKiBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0UGx1Z2luV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX1RJVExFID0gSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBTZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2UgcGFnZTE7Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0UGx1Z2luc1RvSW1wb3J0IHBhZ2UyOwotCi0JcHJvdGVjdGVkIFBsdWdpbkltcG9ydERhdGEgZGF0YSA9IG5ldyBQbHVnaW5JbXBvcnREYXRhKCk7Ci0KLQlwcm90ZWN0ZWQgUGx1Z2luSW1wb3J0aW5nU2VydmljZSBzZXJ2aWNlID0gbmV3IFBsdWdpbkltcG9ydGluZ1NlcnZpY2UoZGF0YSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBJbXBvcnRQbHVnaW5XaXphcmQoKSB7Ci0JCXNldFdpbmRvd1RpdGxlKFdJWkFSRF9USVRMRSk7Ci0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQkvLyBjaGVjayBvdXQgdGhlIGxpYnJhcnkgZmlyc3QKLQkJSUZpbGVNYW5hZ2VyIGZpbGVNZ3IgPSBTZXJ2aWNlcy5nZXRGaWxlTWFuYWdlcigpOwotCQlmaWxlTWdyLmNoZWNrTW9kaWZ5KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSwKLQkJCQlNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkpOwotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwgJiYgbWFuYWdlci5pc01ldGhvZExpYnJhcnlSZWFkT25seSgpKSB7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJV0laQVJEX1RJVExFLAotCQkJCQlJbXBvcnRSZXNvdXJjZXMuSW1wb3J0UGx1Z2luV2l6YXJkX3JlYWRvbmx5KTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU2F2ZUFsbEVkaXRvcnNQYWdlLmFkZFBhZ2VJZk5lZWRlZCh0aGlzLCB0cnVlLCBudWxsLCBudWxsLCBJbXBvcnRQbHVnaW4KLQkJCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmdWxsL3dpemJhbi9JbXBvcnRNZXRob2RQbHVnaW5zLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXBhZ2UxID0gbmV3IFNlbGVjdEltcG9ydFBsdWdpblNvdXJjZShkYXRhLCBzZXJ2aWNlKTsKLQkJYWRkUGFnZShwYWdlMSk7Ci0KLQkJcGFnZTIgPSBuZXcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0KGRhdGEsIHNlcnZpY2UpOwotCQlhZGRQYWdlKHBhZ2UyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJc3VwZXIuY3JlYXRlUGFnZUNvbnRyb2xzKHBhZ2VDb250YWluZXIpOwotCQlwYWdlQ29udGFpbmVyLmdldFNoZWxsKCkuc2V0SW1hZ2UoTGlicmFyeVVJSW1hZ2VzLklNR19NRVRIT0RfUExVR0lOKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2NhbkZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlpZiAodGhpcy5nZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpICE9IHBhZ2UyKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gcGFnZTIuaXNQYWdlQ29tcGxldGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCS8vIENoZWNrIGlmIHRoZSBzZWxlY3RlZCBwbHVnLWlucyBhcmUgdXBkYXRhYmxlIG9yIG5vdC4KLQkJUGx1Z2luTW9kaWZ5SW5mbyBtb2RpZnlJbmZvID0gY2hlY2tNb2RpZnkoKTsKLQotCQkvLyBpZiBvbmx5IGxvY2tlZCwgd2UgY2FuIGF1dG8tdW5sb2NrIGFuZCByZWxvY2sgdGhlIHBsdWdpbnMKLQkJLy8gaWYgdGhlIHBsdWluIGlzIHJlYWRvbmx5LCB1c2VyIG5lZWQgdG8gbWFudWFsbHkgbWFrZSBpdCB1cGRhdGFibGUKLQkJLy8gY3VzdG9tZXJzIG5lZWQgdG8gbWFudWFsbHkgdW5sb2NrIGFuZCBsb2NrIHBsdWdpbnMKLQkJLy8gZHVyaW5nIGNvbnRlbnQgbGlicmFyeSB1cGdyYWRlCi0KLQkJaWYgKG1vZGlmeUluZm8ucmVhZG9ubHlQbHVnaW5zLnNpemUoKSA+IDApIHsKLQkJCS8vIERpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZS4KLQkJCVN0cmluZyBlcnJvciA9IG1vZGlmeUluZm8uZ2V0UmVhZG9ubHlNZXNzYWdlKCkudG9TdHJpbmcoKTsKLQkJCUltcG9ydFBsdWdpbgotCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yLCBlcnJvcik7IC8vJE5PTi1OTFMtMSQKLQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm87Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKChpbmZvLmV4aXN0aW5nUGx1Z2luICE9IG51bGwpICYmIGluZm8uc2VsZWN0ZWQpIHsKLQkJCQlpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgewotCQkJCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWJ1ZmZlci5hcHBlbmQoIlx0IikuYXBwZW5kKGluZm8ubmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCWlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0JCQlib29sZWFuIHllcyA9IEltcG9ydFBsdWdpbgotCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQlXSVpBUkRfVElUTEUsCi0JCQkJCQkJTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLkltcG9ydFBsdWdpbldpemFyZF93YXJuX2V4aXN0aW5nX3BsdWdpbnMsIGJ1ZmZlci50b1N0cmluZygpKSk7Ci0KLQkJCWlmICgheWVzKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJLy8gYWxsb3cgdXNlciB0byBwcm9jZWVkIHdpdGggbG9ja2VkIHBsdWdpbnMKLQkJaWYgKG1vZGlmeUluZm8ubG9ja2VkUGx1Z2lucy5zaXplKCkgPiAwKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IG1vZGlmeUluZm8uZ2V0TG9ja2VkTWVzc2FnZSgpLnRvU3RyaW5nKCkKLQkJCQkJKyBJbXBvcnRSZXNvdXJjZXMuSW1wb3J0UGx1Z2luV2l6YXJkX2NvbmZpcm1fY29udGludWU7IC8vJE5PTi1OTFMtMSQKLQkJCWJvb2xlYW4geWVzID0gSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbihXSVpBUkRfVElUTEUsIG1lc3NhZ2UpOwotCQkJaWYgKCF5ZXMpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQkvLyBQcm9tcHQgdXNlciB0byBiYWNrIHVwIGxpYnJhcnkuCi0JCUxpYnJhcnlCYWNrdXBVdGlsLnByb21wdEJhY2t1cExpYnJhcnkobnVsbCwgbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSkpOwotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3IKLQkJCQkJCQkuYmVnaW5UYXNrKAotCQkJCQkJCQkJSW1wb3J0UmVzb3VyY2VzLkltcG9ydFBsdWdpbldpemFyZF9NU0cxLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJLy8gU3RhcnQgdGhlIGltcG9ydC4KLQkJCQkJc2VydmljZS5wZXJmb3JtSW1wb3J0KG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIGZhbHNlLCBvcCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgcmVhbEV4Y2VwdGlvbiA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJSW1wb3J0UmVzb3VyY2VzLkltcG9ydFBsdWdpbldpemFyZF9lcnJvciwgLy8kTk9OLU5MUy0xJAotCQkJCQlyZWFsRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJY2hlY2tQbHVnaW5DaXJjdWxhckRlcGVuZGVuY3koKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0vLwkJcmVjb3JkIHRoZSBvcGVuZWQgZGlyIGludG8gcHJlZmVyZW5jZSBzdG9yZQotCQlJbXBvcnRVSVByZWZlcmVuY2VzLmFkZFJlY2VudGx5SW1wb3J0UGx1Z2luRGlyKGRhdGEubGxEYXRhCi0JCQkJLmdldFBhcmVudEZvbGRlcigpKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIFBsdWdpbk1vZGlmeUluZm8gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBQbHVnaW5Nb2RpZnlJbmZvIGNoZWNrTW9kaWZ5KCkgewotCQkvLyBTdHJpbmdCdWZmZXIgZXJyb3IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVBsdWdpbk1vZGlmeUluZm8gbW9kaWZ5SW5mbyA9IG5ldyBQbHVnaW5Nb2RpZnlJbmZvKCk7Ci0KLQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm87Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaXQubmV4dCgpOwotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IGluZm8uZXhpc3RpbmdQbHVnaW47Ci0JCQlpZiAoKHBsdWdpbiAhPSBudWxsKSAmJiBpbmZvLnNlbGVjdGVkKSB7Ci0JCQkJaWYgKHBsdWdpbi5nZXRVc2VyQ2hhbmdlYWJsZSgpLmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSB7Ci0JCQkJCS8vIFRoZSBwbHVnLWluIGlzIGxvY2tlZAotCQkJCQkvLyBTdHJpbmcgbXNnID0gSW1wb3J0UmVzb3VyY2VzCi0JCQkJCS8vIC5nZXRTdHJpbmcoCi0JCQkJCS8vICJJbXBvcnQuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZS5wbHVnaW5fbG9ja2VkIiwKLQkJCQkJLy8gcGx1Z2luLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gZXJyb3IuYXBwZW5kKG1zZyk7Ci0JCQkJCW1vZGlmeUluZm8ubG9ja2VkUGx1Z2lucy5hZGQocGx1Z2luKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBUaGUgcGx1Zy1pbiBleGlzdHMgaW4gdGhlIGN1cnJlbnQgbGlicmFyeSwgbWFrZSBzdXJlIHRoZQotCQkJCQkvLyBwbHVnLWluIGlzIHVwZGF0YWJsZS4KLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChwbHVnaW4sIGdldFNoZWxsKCkpOwotCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCS8vIFN0cmluZyBtc2cgPSBJbXBvcnRSZXNvdXJjZXMKLQkJCQkJCS8vIC5nZXRTdHJpbmcoCi0JCQkJCQkvLyAiSW1wb3J0LlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2UucGx1Z2luX3JlYWRvbmx5IiwKLQkJCQkJCS8vIHBsdWdpbi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBlcnJvci5hcHBlbmQobXNnKTsKLQkJCQkJCW1vZGlmeUluZm8ucmVhZG9ubHlQbHVnaW5zLmFkZChwbHVnaW4pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gbW9kaWZ5SW5mby5tZXNzYWdlID0gZXJyb3IudG9TdHJpbmcoKTsKLQotCQlyZXR1cm4gbW9kaWZ5SW5mbzsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNoZWNrUGx1Z2luQ2lyY3VsYXJEZXBlbmRlbmN5KCkgewotCQlQbHVnaW5EZXBlbmRlbmN5SW5mb01nciBtZ3IgPSBuZXcgUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IuQ2hlY2tSZXN1bHQgcmVzdWx0ID0gbWdyLmNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KG51bGwsIGZhbHNlKTsKLQkJaWYgKHJlc3VsdC5jaXJjdWxhckxpc3QgIT0gbnVsbCAmJiAhcmVzdWx0LmNpcmN1bGFyTGlzdC5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgY2lyUGx1Z2lucyA9IChMaXN0KSByZXN1bHQuY2lyY3VsYXJMaXN0LmdldCgwKTsKLQkJCVN0cmluZyBtc2cgPSAiIjsJLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaT0wOyBpPGNpclBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlQbHVnaW5EZXBJbmZvIHBpbmZvID0gKFBsdWdpbkRlcEluZm8pIGNpclBsdWdpbnMuZ2V0KGkpOwotCQkJCWlmIChpICE9IDApIHsKLQkJCQkJbXNnICs9ICIsICI7IAkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJbXNnICs9IHBpbmZvLmdldFBsdWdpbigpLmdldE5hbWUoKTsKLQkJCX0KLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9jaXJjdWxhcl9wbHVnaW5zLCAKLQkJCQkJbXNnKTsJCi0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRVSVByZWZlcmVuY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRVSVByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ3ZmI4MjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0VUlQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5FeHBvcnRVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLQotLyoqCi0qIE1hbmFnZXMgdGhlIFB1Ymxpc2hpbmcgVUkgcHJlZmVyZW5jZXMuCi0qIAotKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSogQHNpbmNlIDEuMAotKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRVSVByZWZlcmVuY2VzIHsKLQotCS8qKgotCSAqIFRoZSBQdWJsaXNoaW5nIFVJIHByZWZlcmVuY2Uga2V5cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX0lNUE9SVF9QTFVHSU5fUEFUSCA9ICJsYXN0SW1wb3J0UGx1Z2luUGF0aCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBsYXN0IGltcG9ydCBjb25maWcgcHJlZmVyZW5jZSBrZXkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX0lNUE9SVF9DT05GSUdfUEFUSCA9ICJsYXN0SW1wb3J0Q29uZmlnUGF0aCI7IAotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXN0IGltcG9ydCBwbHVnaW4gcGF0aCB0aGF0IHdhcyBzYXZlZCBpbiBhIHByZXZpb3VzIHNlc3Npb24uCi0JICogCi0JICogQHJldHVybiBUaGUgc2F2ZWQgbGFzdCBpbXBvcnQgcGx1Z2luIHBhdGggYXMgPGNvZGU+TGlzdDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldExhc3RJbXBvcnRQbHVnaW5QYXRocygpIHsKLQkJTGlzdCBkaXJzID0gZ2V0UHJvcGVydHlMaXN0KExBU1RfSU1QT1JUX1BMVUdJTl9QQVRIKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChkaXJzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBkaXJzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgZGlyID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCXJlc3VsdC5hZGQoZGlyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXN0IGltcG9ydCBwbHVnaW4gcGF0aCB0aGF0IHdhcyBzYXZlZCBpbiBhIHByZXZpb3VzIHNlc3Npb24uCi0JICogCi0JICogQHJldHVybiBUaGUgc2F2ZWQgbGFzdCBpbXBvcnQgcGx1Z2luIHBhdGggYXMgPGNvZGU+TGlzdDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldExhc3RJbXBvcnRDb25maWdQYXRocygpIHsKLQkJTGlzdCBkaXJzID0gZ2V0UHJvcGVydHlMaXN0KExBU1RfSU1QT1JUX0NPTkZJR19QQVRIKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChkaXJzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBkaXJzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgZGlyID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCXJlc3VsdC5hZGQoZGlyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgcmVjZW50bHkgb3BlbmVkIG1ldGhvZCBwbHVnaW4gcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyICAgaW1wb3J0IHBsdWdpbiBkaXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkUmVjZW50bHlJbXBvcnRQbHVnaW5EaXIoU3RyaW5nIGRpcikgewotCQlpZiAoZGlyID09IG51bGwgfHwgZGlyLmxlbmd0aCgpPT0wKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IGRpcnMgPSBnZXRMYXN0SW1wb3J0UGx1Z2luUGF0aHMoKTsKLQotCQlhZGRQcm9wZXJ0eShkaXJzLCBkaXIsIExBU1RfSU1QT1JUX1BMVUdJTl9QQVRIKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIHRoZSByZWNlbnRseSBvcGVuZWQgaW1wb3J0IGNvbmZpZyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBkaXIgICBpbXBvcnQgY29uZmlnIGRpcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRSZWNlbnRseUltcG9ydENvbmZpZ0RpcihTdHJpbmcgZGlyKSB7Ci0JCWlmIChkaXIgPT0gbnVsbCB8fCBkaXIubGVuZ3RoKCk9PTApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3QgZGlycyA9IGdldExhc3RJbXBvcnRDb25maWdQYXRocygpOwotCi0JCWFkZFByb3BlcnR5KGRpcnMsIGRpciwgTEFTVF9JTVBPUlRfQ09ORklHX1BBVEgpOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgdGhlIHByb3BlcnR5IHRvIHRoZSBmaXJzdCBwb3NpdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkUHJvcGVydHlMaXN0ICAgb2xkIHByb3BlcnR5IGxpc3QKLQkgKiBAcGFyYW0gbmV3UHJvcGVydHkgICAgICAgbmV3IHByb3BlcnR5IHZhbHVlIAotCSAqIEBwYXJhbSBwcm9wZXJ0eUtleSAgICAgICB0YXJnZXQgcHJvcGVydHkga2V5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRQcm9wZXJ0eShMaXN0IG9sZFByb3BlcnR5TGlzdCwgU3RyaW5nIG5ld1Byb3BlcnR5LCBTdHJpbmcgcHJvcGVydHlLZXkpewotCQlMaXN0IGRpcnNSZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlpZihvbGRQcm9wZXJ0eUxpc3QuY29udGFpbnMobmV3UHJvcGVydHkpKQotCQkJb2xkUHJvcGVydHlMaXN0LnJlbW92ZShuZXdQcm9wZXJ0eSk7Ci0JCQotCQlkaXJzUmVzdWx0LmFkZCgwLCBuZXdQcm9wZXJ0eSk7Ci0JCQotCQlmb3IgKGludCBpPTA7IGk8b2xkUHJvcGVydHlMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIG9sZFByb3BlcnR5TGlzdC5nZXQoaSk7Ci0JCQlkaXJzUmVzdWx0LmFkZChpKzEsIHBhdGgpOwotCQl9Ci0JCQkKLQkJaWYoZGlyc1Jlc3VsdC5zaXplKCk+RXhwb3J0VUlQcmVmZXJlbmNlcy5nZXRMaXN0TGVuZ3RoKCkpCi0JCQlkaXJzUmVzdWx0ID0gZGlyc1Jlc3VsdC5zdWJMaXN0KDAsIEV4cG9ydFVJUHJlZmVyZW5jZXMuZ2V0TGlzdExlbmd0aCgpKTsKLQkJCQotCQlzZXRQcm9wZXJ0eUxpc3QocHJvcGVydHlLZXksIFN0clV0aWwuY29udmVydExpc3RUb1N0ckFycmF5KGRpcnNSZXN1bHQpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWVkIHByZWZlcmVuY2UgYXMgYQotCSAqIDxvY2RlPkxpc3Q8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0UHJvcGVydHlMaXN0KFN0cmluZyBuYW1lKSB7Ci0JCUxpc3QgbGlzdCA9IGNvbnZlcnRUb0xpc3QoSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCS5nZXRTdHJpbmcobmFtZSkpOwotCQlpbnQgbGVuZ3RoID0gRXhwb3J0VUlQcmVmZXJlbmNlcy5nZXRMaXN0TGVuZ3RoKCk7Ci0JCWlmKGxpc3Quc2l6ZSgpPmxlbmd0aCl7Ci0JCQlsaXN0ID0gbGlzdC5zdWJMaXN0KDAsIGxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIFNhdmVzIHRoZSBnaXZlbiBzdHJpbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZWQgcHJlZmVyZW5jZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNldFByb3BlcnR5TGlzdChTdHJpbmcgbmFtZSwgU3RyaW5nW10gaXRlbXMpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZChpdGVtc1tpXSk7Ci0JCQlidWZmZXIuYXBwZW5kKEV4cG9ydFVJUHJlZmVyZW5jZXMuUFJFRkVSRU5DRV9ERUxJTUlURVIpOwotCQl9Ci0JCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUobmFtZSwKLQkJCQlidWZmZXIudG9TdHJpbmcoKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnRzIHRoZSBzdXBwbGllZCBQUkVGRVJFTkNFX0RFTElNSVRFUiBkZWxpbWl0ZWQgc3RyaW5nIGludG8gYQotCSAqIDxjb2RlPkxpc3Q8L2NvZGU+IG9iamVjdC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgY29udmVydFRvTGlzdChTdHJpbmcgcHJlZmVyZW5jZVZhbHVlKSB7Ci0JCUFycmF5TGlzdCB0b3BpY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHByZWZlcmVuY2VWYWx1ZSwKLQkJCQlFeHBvcnRVSVByZWZlcmVuY2VzLlBSRUZFUkVOQ0VfREVMSU1JVEVSKTsKLQkJaW50IHRva2VuQ291bnQgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbkNvdW50OyBpKyspIHsKLQkJCXRvcGljcy5hZGQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJfQotCQlyZXR1cm4gdG9waWNzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvUGx1Z2luTW9kaWZ5SW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvUGx1Z2luTW9kaWZ5SW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMGYwNDFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1BsdWdpbk1vZGlmeUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi1wdWJsaWMgY2xhc3MgUGx1Z2luTW9kaWZ5SW5mbyB7Ci0KLQlwdWJsaWMgTGlzdCBsb2NrZWRQbHVnaW5zID0gbmV3IEFycmF5TGlzdCgpOwotCXB1YmxpYyBMaXN0IHJlYWRvbmx5UGx1Z2lucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlQbHVnaW5Nb2RpZnlJbmZvKCkgewotCQkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgU3RyaW5nQnVmZmVyIG9iamVjdCBmb3IgbG9ja2VkIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBnZXRMb2NrZWRNZXNzYWdlKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbG9ja2VkUGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4paXQubmV4dCgpOwotCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKEltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9sb2NrZWQsIHBsdWdpbi5nZXROYW1lKCkpOyAKLQkJCWJ1ZmZlci5hcHBlbmQobXNnKTsKLQkJfQotCQkKLQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIFN0cmluZ0J1ZmZlciBvYmplY3QgZm9yIHJlYWRvbmx5IG1lc3NhZ2UuCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBnZXRSZWFkb25seU1lc3NhZ2UoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSByZWFkb25seVBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKWl0Lm5leHQoKTsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fcmVhZG9ubHksIHBsdWdpbi5nZXROYW1lKCkpOyAKLQkJCWJ1ZmZlci5hcHBlbmQobXNnKTsKLQkJfQotCQkKLQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjFmZjAwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlnU3BlY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IHRoZSBjb25maWd1cmF0aW9uCi0gKiBzcGVjaWZpY2FpdG9ucyB0byBpbXBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSUNoZWNrU3RhdGVMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBsaWJyYXJ5Q29uZmlnU3BlY0V4aXN0cyA9IEltcG9ydFJlc291cmNlcy5TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9saWJyYXJ5Q29uZmlnU3BlY0V4aXN0czsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGxpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzID0gSW1wb3J0UmVzb3VyY2VzLlNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29uZmlnU3BlY05vU2VsZWN0aW9uID0gSW1wb3J0UmVzb3VyY2VzLlNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNOb1NlbGVjdGlvbjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGNvbmZpZ1NwZWNEYXRhTGFiZWwgPSBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY0RhdGFMYWJlbDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIGN0cmxfY2hrYm94VGFibGVWaWV3ZXI7Ci0KLQkvLyAyIGNvbnRyb2xzIGZvciBkaXNwbGF5aW5nIGNvbmZpZ3NwZWMgaW5mbyBmb3IgcGx1Z2lucyBpbiBpbXBvcnQgZGlyZWN0b3J5Ci0JcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZEZXNjSW1wb3J0OwotCi0JcHJpdmF0ZSBMYWJlbCBpbXBvcnRDb25maWdTcGVjTGFiZWw7Ci0KLQkvLyAyIGNvbnRyb2xzIGZvciBkaXNwbGF5aW5nIGNvbmZpZ3NwZWMgaW5mbyBmb3IgcGx1Z2lucyBpbiB0aGUgbGlicmFyeQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmRGVzY0xpYnJhcnk7Ci0KLQlwcml2YXRlIExhYmVsIGxpYnJhcnlDb25maWdTcGVjTGFiZWw7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb250YWluZXI7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGRhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZShDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEltcG9ydFJlc291cmNlcy5zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGl0bGUpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKEltcG9ydFJlc291cmNlcy5zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9JbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCi0JCUNvbXBvc2l0ZSB0YWJsZUNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCXRhYmxlQ29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZUNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQljcmVhdGVMYWJlbCgKLQkJCQl0YWJsZUNvbnRhaW5lciwKLQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGFiZWxfY29uZmlncywgMik7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlciA9IGNyZWF0ZUNoZWNrYm94VGFibGVWaWV3ZXIodGFibGVDb250YWluZXIsIDEpOwotCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBMaWJyYXJ5VUlJbWFnZXMuSU1HX01FVEhPRF9DT05GSUdVUkFUT047Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCQl9OwotCi0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCi0JCUNvbXBvc2l0ZSBpbXBvcnRDb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlpbXBvcnRDb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlpbXBvcnRDb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3JlYXRlSW1wb3J0Q29uZmlnU3BlY0luZm8oaW1wb3J0Q29udGFpbmVyKTsKLQotCQlDb21wb3NpdGUgbGlicmFyeUNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWxpYnJhcnlDb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlsaWJyYXJ5Q29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWNyZWF0ZUxpYnJhcnlDb25maWdTcGVjSW5mbyhsaWJyYXJ5Q29udGFpbmVyKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUltcG9ydENvbmZpZ1NwZWNJbmZvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJaW1wb3J0Q29uZmlnU3BlY0xhYmVsID0gY3JlYXRlTGFiZWwoY29udGFpbmVyLCBjb25maWdTcGVjTm9TZWxlY3Rpb24sIDEpOwotCQljcmVhdGVMaW5lKGNvbnRhaW5lciwgMSk7Ci0KLQkJY3JlYXRlTGFiZWwoCi0JCQkJY29udGFpbmVyLAotCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9kZXNjLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2JyaWVmRGVzY0ltcG9ydCA9IGNyZWF0ZVRleHRNdWx0aShjb250YWluZXIsICIiLCAyNzUsIDEwMCwgMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTGlicmFyeUNvbmZpZ1NwZWNJbmZvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbGlicmFyeUNvbmZpZ1NwZWNMYWJlbCA9IGNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgY29uZmlnU3BlY05vU2VsZWN0aW9uLAotCQkJCTEpOwotCQljcmVhdGVMaW5lKGNvbnRhaW5lciwgMSk7Ci0KLQkJY3JlYXRlTGFiZWwoCi0JCQkJY29udGFpbmVyLAotCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9kZXNjLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2JyaWVmRGVzY0xpYnJhcnkgPSBjcmVhdGVUZXh0TXVsdGkoY29udGFpbmVyLCAiIiwgMjc1LCAxMDAsIDEpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyI2NoZWNrU3RhdGVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gY29uZmlncyA9IHNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCQlzZXREaXNwbGF5QXR0cmlidXRlcygoQ29uZmlnU3BlY3MuRW50cnkpIGNvbmZpZ3NbMF0pOwotCQl9IGVsc2UgewotCQkJY2xlYXJEaXNwbGF5QXR0cmlidXRlcygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERpc3BsYXlBdHRyaWJ1dGVzKENvbmZpZ1NwZWNzLkVudHJ5IHNwZWMpIHsKLQkJY3RybF9icmllZkRlc2NJbXBvcnQKLQkJCQkuc2V0VGV4dChzcGVjLmNvbmZpZ1NwZWMuYnJpZWZfZGVzYyA9PSBudWxsID8gIiIgOiBzcGVjLmNvbmZpZ1NwZWMuYnJpZWZfZGVzYyk7IC8vJE5PTi1OTFMtMSQKLQkJaW1wb3J0Q29uZmlnU3BlY0xhYmVsLnNldFRleHQoY29uZmlnU3BlY0RhdGFMYWJlbCk7Ci0KLQkJaWYgKHNwZWMuZXhpc3RpbmdDb25maWcgIT0gbnVsbCkgewotCQkJY3RybF9icmllZkRlc2NMaWJyYXJ5LnNldFRleHQoc3BlYy5leGlzdGluZ0NvbmZpZwotCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJCWxpYnJhcnlDb25maWdTcGVjTGFiZWwuc2V0VGV4dChsaWJyYXJ5Q29uZmlnU3BlY0V4aXN0cyk7Ci0JCX0gZWxzZSB7Ci0JCQlsaWJyYXJ5Q29uZmlnU3BlY0xhYmVsLnNldFRleHQobGlicmFyeUNvbmZpZ1NwZWNOb3RFeGlzdHMpOwotCQkJY3RybF9icmllZkRlc2NMaWJyYXJ5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJEaXNwbGF5QXR0cmlidXRlcygpIHsKLQkJY3RybF9icmllZkRlc2NJbXBvcnQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9icmllZkRlc2NMaWJyYXJ5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWxpYnJhcnlDb25maWdTcGVjTGFiZWwuc2V0VGV4dChjb25maWdTcGVjTm9TZWxlY3Rpb24pOwotCQlpbXBvcnRDb25maWdTcGVjTGFiZWwuc2V0VGV4dChjb25maWdTcGVjTm9TZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKS5sZW5ndGggPiAwKSB7Ci0JCQkvLyBTZXQgZGF0YS5zcGVjcy5jb25maWdzIGxpc3QsIGZpeCB0aGUgc2VsZWN0ZWQgZmllbGQgb2YgZWFjaAotCQkJLy8gZW50cnkuCi0JCQlJdGVyYXRvciBpdGVyID0gZGF0YS5zcGVjcy5jb25maWdzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlDb25maWdTcGVjcy5FbnRyeSBlID0gKENvbmZpZ1NwZWNzLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRDaGVja2VkKGUpKQotCQkJCQllLnNlbGVjdGVkID0gdHJ1ZTsKLQkJCQllbHNlCi0JCQkJCWUuc2VsZWN0ZWQgPSBmYWxzZTsKLQkJCX0KLQkJCSgoSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLm9rVG9Db21wbGV0ZSA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQkoKEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQpIGdldFdpemFyZCgpKS5va1RvQ29tcGxldGUgPSBmYWxzZTsKLQkJfQotCi0JCS8vIEFsd2F5cyByZXR1cm4gZmFsc2Ugc28gdGhhdCB0aGUgIk5leHQiIGJ1dHRvbiBpcyBuZXZlciBlbmFibGVkLgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNjYW5GbGlwVG9OZXh0UGFnZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmxpcFRvTmV4dFBhZ2UoKSB7Ci0JCXJldHVybiBpc1BhZ2VDb21wbGV0ZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2Ujb25FbnRlclBhZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRJbnB1dChkYXRhLnNwZWNzLmNvbmZpZ3MpOwotCQlpZiAoZGF0YS5zcGVjcy5jb25maWdzLnNpemUoKSA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQlkYXRhLnNwZWNzLmNvbmZpZ3MuZ2V0KDApKTsKLQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdENvbmZpZ3NUb0ltcG9ydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0Q29uZmlnc1RvSW1wb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNkMGQxZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0Q29uZmlnc1RvSW1wb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBkaXNwbGF5cyB0aGUgbGlicmFyeSBjb25maWd1cmF0aW9uIGVsZW1lbnRzIHRoYXQgd2lsbCBiZQotICogaW1wb3J0ZWQuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RDb25maWdzVG9JbXBvcnQgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RDb25maWdzVG9JbXBvcnQuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlIHNlcnZpY2U7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb250YWluZXI7Ci0KLQlwcml2YXRlIERpZmZSZXBvcnRWaWV3ZXIgZGlmZjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdENvbmZpZ3NUb0ltcG9ydChDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZSBzZXJ2aWNlKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEltcG9ydFJlc291cmNlcy5yZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90aXRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oSW1wb3J0UmVzb3VyY2VzLnJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RleHQpOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vSW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCQkKLQkJdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgSW1wb3J0UmVzb3VyY2VzLlNlbGVjdENvbmZpZ3NUb0ltcG9ydF9sYWJlbDEsIDEpOyAvLyROT04tTkxTLTEkCi0JCWRpZmYgPSBuZXcgRGlmZlJlcG9ydFZpZXdlcihjb250YWluZXIsIHNlcnZpY2UuZ2V0SW1wb3J0RGF0YSgpKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCSgoSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLm9rVG9Db21wbGV0ZSA9IHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWRpZmYuc2hvd1JlcG9ydChzZXJ2aWNlLmdldERpZmZUcmVlKCkpOwotCQkoKEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQpIGdldFdpemFyZCgpKS5va1RvQ29tcGxldGUgPSB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YTU1Nzc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5EZXN0aW5hdGlvbkNvbW1vblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlCi0gKiBjb25maWd1cmF0aW9ucyB0byBpbXBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlIGV4dGVuZHMgRGVzdGluYXRpb25Db21tb25QYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdGF0dXMgb2tTdGF0dXMgPSBuZXcgU3RhdHVzKAotCQkJSVN0YXR1cy5PSywKLQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkLCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBkYXRhOwotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZSBzZXJ2aWNlOwotCi0JcHJpdmF0ZSBTdGF0dXMgc3RhdHVzID0gb2tTdGF0dXM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlKENvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGRhdGEsCi0JCQlDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZSBzZXJ2aWNlKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSwgZGF0YS5sbERhdGEpOwotCQlzZXRUaXRsZShJbXBvcnRSZXNvdXJjZXMuc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90aXRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oSW1wb3J0UmVzb3VyY2VzLnNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9JbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQotCQl0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRGVzdGluYXRpb25Db21tb25QYWdlI2luaXRDb21ib0l0ZW1zKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29tYm9JdGVtcygpIHsKLQkJTGlzdCBkaXJMaXN0ID0gSW1wb3J0VUlQcmVmZXJlbmNlcy5nZXRMYXN0SW1wb3J0Q29uZmlnUGF0aHMoKTsKLQkJCi0JCWlmKGRpckxpc3QhPW51bGwgJiYgIWRpckxpc3QuaXNFbXB0eSgpKXsKLQkJCVN0cmluZ1tdIGRpcnMgPSBuZXcgU3RyaW5nW2Rpckxpc3Quc2l6ZSgpXTsKLQkJCWZvcihpbnQgaT0wOyBpPGRpckxpc3Quc2l6ZSgpOyBpKyspewotCQkJCWRpcnNbaV0gPSBkaXJMaXN0LmdldChpKS50b1N0cmluZygpOwotCQkJfQotCQkJY3RybF9leHBvcnRQYXRoLnNldEl0ZW1zKGRpcnMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWJvb2xlYW4gcmV0dXJuVmFsdWUgPSBmYWxzZTsKLQkJc3RhdHVzID0gb2tTdGF0dXM7Ci0JCWlmIChjdHJsX2V4cG9ydFBhdGguZ2V0VGV4dCgpLmxlbmd0aCgpPjApIHsKLQkJCXNhdmVUb0RhdGFNb2RlbCgpOwotCQkJRmlsZSBsaWJEaXIgPSBuZXcgRmlsZShjdHJsX2V4cG9ydFBhdGguZ2V0VGV4dCgpKTsKLQkJCWlmICghbGliRGlyLmV4aXN0cygpKSB7Ci0JCQkJc3RhdHVzID0gbmV3IFN0YXR1cygKLQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZCwgMCwgSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm9fcGF0aCwgbnVsbCk7IAotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm5WYWx1ZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXBwbHlUb1N0YXR1c0xpbmUoKTsKLQkJcmV0dXJuIHJldHVyblZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJc2F2ZVRvRGF0YU1vZGVsKCk7Ci0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcGVyYXRpb24gPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQltb25pdG9yCi0JCQkJCQkuYmVnaW5UYXNrKAotCQkJCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9NU0cxLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCQkJc2VydmljZS5hbmFseXplKG1vbml0b3IpOwotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9OwotCQl0cnkgewotCQkJLy8gVGhpcyBydW5zIHRoZSBvcHRpb25zLCBhbmQgc2hvd3MgcHJvZ3Jlc3MuCi0JCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vIFNvbWV0aGluZyB3ZW50IHdyb25nIHRoYXQgc2hvdWxkbid0LgotCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJU3RyaW5nIGVycm9yID0gZGF0YS5nZXRFcnJvckluZm8oKS5nZXRFcnJvcigpOwotCQlpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5sZW5ndGgoKSA+IDApIHsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkLCAwLCBlcnJvciwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgCi0JCQlhcHBseVRvU3RhdHVzTGluZSgpOwotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJQmFzZVdpemFyZFBhZ2UgcGFnZSA9IG51bGw7Ci0JCWlmIChkYXRhLnNwZWNzICE9IG51bGwpCi0JCQlwYWdlID0gKChJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkuc3BlY3NQYWdlOwotCQllbHNlIHsKLQkJCVBsdWdpbk1vZGlmeUluZm8gbW9kaWZ5SW5mbyA9IGNoZWNrTW9kaWZ5KCk7Ci0JCQkKLQkJCS8vIGlmIG9ubHkgbG9ja2VkLCB3ZSBjYW4gYXV0by11bmxvY2sgYW5kIHJlbG9jayB0aGUgcGx1Z2lucwotCQkJLy8gaWYgdGhlIHBsdWluIGlzIHJlYWRvbmx5LCB1c2VyIG5lZWQgdG8gbWFudWFsbHkgbWFrZSBpdCB1cGRhdGFibGUKLQkJCS8vIGN1c3RvbWVycyBuZWVkIHRvIG1hbnVhbGx5IHVubG9jayBhbmQgbG9jayBwbHVnaW5zIGR1cmluZyBjb250ZW50IGxpYnJhcnkgdXBncmFkZQotCQkJCi0JCQlpZiAoIG1vZGlmeUluZm8ucmVhZG9ubHlQbHVnaW5zLnNpemUoKSA+IDAgKSB7Ci0KLQkJCQllcnJvciA9IG1vZGlmeUluZm8uZ2V0UmVhZG9ubHlNZXNzYWdlKCkudG9TdHJpbmcoKTsKLQkJCQkKLQkJCQkvLyBzaG93IGVycm9yIG1lc3NhZ2UgYm94Ci0JCQkJSW1wb3J0UGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yLCBlcnJvcik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoCi0JCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm90X3VzZWQsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCTAsCi0JCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9lcnJvcl9ub3RfdXBkYXRhYmxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQludWxsKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQlhcHBseVRvU3RhdHVzTGluZSgpOwotCQkJCXJldHVybiB0aGlzOwotCQkJfQotCi0JCQkvLyBhbGxvdyB1c2VyIHRvIHByb2NlZWQgd2l0aCBsb2NrZWQgcGx1Z2lucwotCQkJaWYgKCBtb2RpZnlJbmZvLmxvY2tlZFBsdWdpbnMuc2l6ZSgpID4gMCApIHsKLQkJCQlTdHJpbmcgV0laQVJEX1RJVExFID0gSW1wb3J0UmVzb3VyY2VzLmltcG9ydENvbmZpZ1dpemFyZF90aXRsZTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBtZXNzYWdlID0gbW9kaWZ5SW5mby5nZXRMb2NrZWRNZXNzYWdlKCkudG9TdHJpbmcoKSArIAotCQkJCQlJbXBvcnRSZXNvdXJjZXMuSW1wb3J0UGx1Z2luV2l6YXJkX2NvbmZpcm1fY29udGludWU7IAotCQkJCWJvb2xlYW4geWVzID0gSW1wb3J0UGx1Z2luCi0JCQkJLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5Q29uZmlybWF0aW9uKFdJWkFSRF9USVRMRSwgbWVzc2FnZSk7Ci0JCQkJaWYgKCF5ZXMpIHsKLQkJCQkJc3RhdHVzID0gbmV3IFN0YXR1cygKLQkJCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJMCwKLQkJCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9lcnJvcl9ub3RfdXBkYXRhYmxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJbnVsbCk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCWFwcGx5VG9TdGF0dXNMaW5lKCk7Ci0JCQkJCXJldHVybiB0aGlzOwotCQkJCX0KLQkJCX0gCQkJCi0JCQlwYWdlID0gKChJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkuY29uZmlnUGFnZTsKLQkJfQotCQlwYWdlLm9uRW50ZXJQYWdlKG51bGwpOwotCQlyZXR1cm4gcGFnZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIFBsdWdpbk1vZGlmeUluZm8gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBQbHVnaW5Nb2RpZnlJbmZvIGNoZWNrTW9kaWZ5KCkgewotCQlyZXR1cm4gY2hlY2tNb2RpZnkoTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luR3VpZHMoc2VydmljZS5nZXRJbXBvcnRpbmdMaWJyYXJ5KCkpLCAKLQkJCQlnZXRTaGVsbCgpLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgUGx1Z2luTW9kaWZ5SW5mbyBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBQbHVnaW5Nb2RpZnlJbmZvIGNoZWNrTW9kaWZ5KExpc3QgZ3VpZHMsIFNoZWxsIHNoZWxsLCBib29sZWFuIGNoZWNrRWRpdCkgewotCQlQbHVnaW5Nb2RpZnlJbmZvIG1vZGlmeUluZm8gPSBuZXcgUGx1Z2luTW9kaWZ5SW5mbygpOwotCQkvL1N0cmluZ0J1ZmZlciBlcnJvciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJLy9MaXN0IGd1aWRzID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luR3VpZHMoc2VydmljZQotCQkvLwkJLmdldEltcG9ydGluZ0xpYnJhcnkoKSk7Ci0KLQkJTGlzdCBwbHVnaW5zID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCWlmIChndWlkcy5jb250YWlucyhwbHVnaW4uZ2V0R3VpZCgpKSkgewotCQkJCWlmIChwbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKS5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZSkgewotCQkJCQkvLyBwbHVnaW4gaXMgbG9ja2VkCi0vLwkJCQkJU3RyaW5nIG1zZyA9IEltcG9ydFJlc291cmNlcwotLy8JCQkJCQkJLmdldFN0cmluZygKLS8vCQkJCQkJCQkJIkltcG9ydC5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlLnBsdWdpbl9sb2NrZWQiLCBwbHVnaW4uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJCWVycm9yLmFwcGVuZChtc2cpOwotCQkJCQltb2RpZnlJbmZvLmxvY2tlZFBsdWdpbnMuYWRkKHBsdWdpbik7Ci0JCQkJfSBlbHNlIGlmIChjaGVja0VkaXQpewotCQkJCQkvLyBwbHVnaW4gZXhpc3RzIGluIHRoZSBjdXJyZW50IGxpYnJhcnksIG1ha2Ugc3VyZSB0aGUKLQkJCQkJLy8gcGx1Z2luIGlzIHVwZGF0YWJsZQotCQkJCQkvL0lTdGF0dXMgc3RhdHVzID0gVG5nVXRpbC5jaGVja0VkaXQocGx1Z2luLCBnZXRTaGVsbCgpKTsKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChwbHVnaW4sIHNoZWxsKTsKLQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0vLwkJCQkJCVN0cmluZyBtc2cgPSBJbXBvcnRSZXNvdXJjZXMKLS8vCQkJCQkJCQkuZ2V0U3RyaW5nKAotLy8JCQkJCQkJCQkJIkltcG9ydC5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlLnBsdWdpbl9yZWFkb25seSIsIHBsdWdpbi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJCWVycm9yLmFwcGVuZChtc2cpOwotCQkJCQkJbW9kaWZ5SW5mby5yZWFkb25seVBsdWdpbnMuYWRkKHBsdWdpbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbW9kaWZ5SW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2NhbkZsaXBUb05leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLQkJcmV0dXJuIGlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFwcGx5VG9TdGF0dXNMaW5lKCkgewotCQlpZiAoc3RhdHVzICE9IG9rU3RhdHVzKQotCQkJc2V0RXJyb3JNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQllbHNlIHsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzk2NGIyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5EZXN0aW5hdGlvbkNvbW1vblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0aW5nU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlCi0gKiBtZXRob2QgcGx1Zy1pbnMgdG8gaW1wb3J0LgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlIGV4dGVuZHMgRGVzdGluYXRpb25Db21tb25QYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdEltcG9ydFBsdWdpblNvdXJjZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0YXR1cyBPS19TVEFUVVMgPSBuZXcgU3RhdHVzKAotCQkJSVN0YXR1cy5PSywKLQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm90X3VzZWQsIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIFBsdWdpbkltcG9ydERhdGEgZGF0YTsKLQotCXByaXZhdGUgUGx1Z2luSW1wb3J0aW5nU2VydmljZSBzZXJ2aWNlOwotCi0JcHJpdmF0ZSBTdGF0dXMgc3RhdHVzID0gT0tfU1RBVFVTOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlKFBsdWdpbkltcG9ydERhdGEgZGF0YSwKLQkJCVBsdWdpbkltcG9ydGluZ1NlcnZpY2Ugc2VydmljZSkgewotCQlzdXBlcihQQUdFX05BTUUsIGRhdGEubGxEYXRhKTsKLQkJc2V0VGl0bGUoSW1wb3J0UmVzb3VyY2VzLnNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihJbXBvcnRSZXNvdXJjZXMuc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9JbXBvcnRNZXRob2RQbHVnaW5zLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRGVzdGluYXRpb25Db21tb25QYWdlI2luaXRDb21ib0l0ZW1zKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29tYm9JdGVtcygpIHsKLQkJTGlzdCBkaXJMaXN0ID0gSW1wb3J0VUlQcmVmZXJlbmNlcy5nZXRMYXN0SW1wb3J0UGx1Z2luUGF0aHMoKTsKLQkJCi0JCWlmKGRpckxpc3QhPW51bGwgJiYgIWRpckxpc3QuaXNFbXB0eSgpKXsKLQkJCVN0cmluZ1tdIGRpcnMgPSBuZXcgU3RyaW5nW2Rpckxpc3Quc2l6ZSgpXTsKLQkJCWZvcihpbnQgaT0wOyBpPGRpckxpc3Quc2l6ZSgpOyBpKyspewotCQkJCWRpcnNbaV0gPSBkaXJMaXN0LmdldChpKS50b1N0cmluZygpOwotCQkJfQotCQkJY3RybF9leHBvcnRQYXRoLnNldEl0ZW1zKGRpcnMpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlib29sZWFuIHJldHVyblZhbHVlID0gZmFsc2U7Ci0JCXN0YXR1cyA9IE9LX1NUQVRVUzsKLQkJaWYgKGN0cmxfZXhwb3J0UGF0aC5nZXRUZXh0KCkubGVuZ3RoKCk+MCkgewotCQkJc2F2ZVRvRGF0YU1vZGVsKCk7Ci0JCQlGaWxlIGxpYkRpciA9IG5ldyBGaWxlKGN0cmxfZXhwb3J0UGF0aC5nZXRUZXh0KCkpOwotCQkJaWYgKCFsaWJEaXIuZXhpc3RzKCkpIHsKLQkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzKAotCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm90X3VzZWQsIDAsIEltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fcGF0aCwgbnVsbCk7IAotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm5WYWx1ZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXBwbHlUb1N0YXR1c0xpbmUoKTsKLQkJcmV0dXJuIHJldHVyblZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJc2F2ZVRvRGF0YU1vZGVsKCk7Ci0KLQkJLy8gVmFsaWRhdGUgZmlyc3QgYmVmb3JlIGdvaW5nIHRvIHRoZSBuZXh0IHBhZ2UuCi0JCXNlcnZpY2UudmFsaWRhdGUobnVsbCk7Ci0JCVN0cmluZyBlcnJvciA9IGRhdGEuZ2V0RXJyb3JJbmZvKCkuZ2V0RXJyb3IoKTsKLQkJaWYgKGVycm9yICE9IG51bGwgJiYgZXJyb3IubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzdXBlci5zZXRFcnJvck1lc3NhZ2UoZXJyb3IpOwotCQkJcmV0dXJuIHRoaXM7Ci0JCX0gZWxzZSB7Ci0JCQlTZWxlY3RQbHVnaW5zVG9JbXBvcnQgcGFnZSA9ICgoSW1wb3J0UGx1Z2luV2l6YXJkKSBnZXRXaXphcmQoKSkucGFnZTI7Ci0JCQlwYWdlLm9uRW50ZXJQYWdlKG51bGwpOwotCQkJcmV0dXJuIHBhZ2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2NhbkZsaXBUb05leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLQkJcmV0dXJuIGlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFwcGx5VG9TdGF0dXNMaW5lKCkgewotCQlpZiAoc3RhdHVzICE9IE9LX1NUQVRVUykKLQkJCXNldEVycm9yTWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdFBsdWdpbnNUb0ltcG9ydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0UGx1Z2luc1RvSW1wb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlNGQxYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0UGx1Z2luc1RvSW1wb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLlBsdWdpbkltcG9ydGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byB0aGUgbWV0aG9kIHBsdWctaW5zIHRvIGltcG9ydC4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdFBsdWdpbnNUb0ltcG9ydCBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSUNoZWNrU3RhdGVMaXN0ZW5lciwgTGlzdGVuZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0UGx1Z2luc1RvSW1wb3J0LmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGxpYnJhcnlQbHVnaW5FeGlzdHMgPSBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5FeGlzdHM7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBsaWJyYXJ5UGx1Z2luTm90RXhpc3RzID0gSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luTm90RXhpc3RzOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcGx1Z2luTm9TZWxlY3Rpb24gPSBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0UGx1Z2luc1RvSW1wb3J0X3BsdWdpbk5vU2VsZWN0aW9uOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcGx1Z2luRGF0YUxhYmVsID0gSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5EYXRhTGFiZWw7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBjdHJsX2Noa2JveFRhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYXV0aG9ySW1wb3J0OwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfdmVyc2lvbkltcG9ydDsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmRGVzY0ltcG9ydDsKLQotCXByaXZhdGUgTGFiZWwgaW1wb3J0UGx1Z2luTGFiZWw7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9hdXRob3JMaWJyYXJ5OwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfdmVyc2lvbkxpYnJhcnk7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9icmllZkRlc2NMaWJyYXJ5OwotCi0JcHJpdmF0ZSBMYWJlbCBsaWJyYXJ5UGx1Z2luTGFiZWw7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb250YWluZXI7Ci0KLQlwcml2YXRlIGludCBjaGVja2VkQ291bnQgPSAwOwotCi0JcHJpdmF0ZSBMaXN0IGNoZWNrZWRQbHVnaW5MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBQbHVnaW5JbXBvcnREYXRhIGRhdGE7Ci0KLQlwcml2YXRlIFBsdWdpbkltcG9ydGluZ1NlcnZpY2Ugc2VydmljZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdFBsdWdpbnNUb0ltcG9ydChQbHVnaW5JbXBvcnREYXRhIGRhdGEsCi0JCQlQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoSW1wb3J0UmVzb3VyY2VzLnNlbGVjdFBsdWdpbnNXaXphcmRQYWdlX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihJbXBvcnRSZXNvdXJjZXMuc2VsZWN0UGx1Z2luc1dpemFyZFBhZ2VfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9JbXBvcnRNZXRob2RQbHVnaW5zLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAkJCi0JCXRoaXMuc2VydmljZSA9IHNlcnZpY2U7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQljb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQotCQlDb21wb3NpdGUgdGFibGVDb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQl0YWJsZUNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGFibGVDb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJY3JlYXRlTGFiZWwodGFibGVDb250YWluZXIsIEltcG9ydFJlc291cmNlcy5TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfcGx1Z2lucywgMik7IC8vJE5PTi1OTFMtMSQKLQotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyID0gY3JlYXRlQ2hlY2tib3hUYWJsZVZpZXdlcih0YWJsZUNvbnRhaW5lciwgMik7Ci0KLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX1BMVUdJTjsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJcmV0dXJuICgoTWV0aG9kUGx1Z2luKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCi0JCUNvbXBvc2l0ZSBpbXBvcnRDb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlpbXBvcnRDb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWNyZWF0ZUltcG9ydFBsdWdpbkluZm8oaW1wb3J0Q29udGFpbmVyKTsKLQotCQlDb21wb3NpdGUgbGlicmFyeUNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWxpYnJhcnlDb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWNyZWF0ZUxpYnJhcnlQbHVnaW5JbmZvKGxpYnJhcnlDb250YWluZXIpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlSW1wb3J0UGx1Z2luSW5mbyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWltcG9ydFBsdWdpbkxhYmVsID0gY3JlYXRlTGFiZWwoY29udGFpbmVyLCBwbHVnaW5Ob1NlbGVjdGlvbiwgMSk7Ci0JCWNyZWF0ZUxpbmUoY29udGFpbmVyLCAxKTsKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsIEltcG9ydFJlc291cmNlcy5TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfYXV0aG9yLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2F1dGhvckltcG9ydCA9IGNyZWF0ZVRleHRNdWx0aShjb250YWluZXIsICIiLCAyNzUsIDQwLCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF92ZXJzaW9uLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3ZlcnNpb25JbXBvcnQgPSBjcmVhdGVUZXh0KGNvbnRhaW5lciwgIiIsIDI3NSwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsIEltcG9ydFJlc291cmNlcy5TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfZGVzYywgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9icmllZkRlc2NJbXBvcnQgPSBjcmVhdGVUZXh0TXVsdGkoY29udGFpbmVyLCAiIiwgMjc1LCAxMDAsIDEpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUxpYnJhcnlQbHVnaW5JbmZvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbGlicmFyeVBsdWdpbkxhYmVsID0gY3JlYXRlTGFiZWwoY29udGFpbmVyLCBwbHVnaW5Ob1NlbGVjdGlvbiwgMSk7Ci0JCWNyZWF0ZUxpbmUoY29udGFpbmVyLCAxKTsKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsIEltcG9ydFJlc291cmNlcy5TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfYXV0aG9yLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2F1dGhvckxpYnJhcnkgPSBjcmVhdGVUZXh0TXVsdGkoY29udGFpbmVyLCAiIiwgMjc1LCA0MCwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsIEltcG9ydFJlc291cmNlcy5TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfdmVyc2lvbiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF92ZXJzaW9uTGlicmFyeSA9IGNyZWF0ZVRleHQoY29udGFpbmVyLCAiIiwgMjc1LCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9kZXNjLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2JyaWVmRGVzY0xpYnJhcnkgPSBjcmVhdGVUZXh0TXVsdGkoY29udGFpbmVyLCAiIiwgMjc1LCAxMDAsIDEpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyI2NoZWNrU3RhdGVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdCBvYmogPSBldmVudC5nZXRFbGVtZW50KCk7Ci0KLQkJLy8gU2V0IHRoZSBmbGFnIHRvIGltcG9ydCB0aGUgc2VsZWN0ZWQgcGx1Zy1pbnMuCi0JCWlmIChvYmogaW5zdGFuY2VvZiBQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIHsKLQkJCSgoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBvYmopLnNlbGVjdGVkID0gZXZlbnQuZ2V0Q2hlY2tlZCgpOwotCQl9Ci0JCVN0cmluZyBtZXNzYWdlID0gc2VydmljZS52YWxpZGF0ZVNlbGVjdGlvbigpOwotCQlpZiAobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzdXBlci5zZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCX0KLQotCQlpZiAoZXZlbnQuZ2V0Q2hlY2tlZCgpKSB7Ci0JCQljaGVja2VkQ291bnQrKzsKLQkJCWNoZWNrZWRQbHVnaW5MaXN0LmFkZChvYmopOwotCQl9IGVsc2UgewotCQkJY2hlY2tlZENvdW50LS07Ci0JCQljaGVja2VkUGx1Z2luTGlzdC5yZW1vdmUob2JqKTsKLQkJfQotCi0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gcGx1Z2luID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCXNldERpc3BsYXlBdHRyaWJ1dGVzKChQbHVnaW5JbmZvKSBwbHVnaW5bMF0pOwotCQl9IGVsc2UgewotCQkJY2xlYXJEaXNwbGF5QXR0cmlidXRlcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlzcGxheUF0dHJpYnV0ZXMoUGx1Z2luSW5mbyBwbHVnaW4pIHsKLQkJY3RybF9hdXRob3JJbXBvcnQuc2V0VGV4dChwbHVnaW4uYXV0aG9ycyA9PSBudWxsID8gIiIgOiBwbHVnaW4uYXV0aG9ycyk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF92ZXJzaW9uSW1wb3J0Ci0JCQkJLnNldFRleHQocGx1Z2luLnZlcnNpb24gPT0gbnVsbCA/ICIiIDogcGx1Z2luLnZlcnNpb24pOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfYnJpZWZEZXNjSW1wb3J0Ci0JCQkJLnNldFRleHQocGx1Z2luLmJyaWVmX2Rlc2MgPT0gbnVsbCA/ICIiIDogcGx1Z2luLmJyaWVmX2Rlc2MpOyAvLyROT04tTkxTLTEkCi0JCWltcG9ydFBsdWdpbkxhYmVsLnNldFRleHQocGx1Z2luRGF0YUxhYmVsKTsKLQotCQlpZiAocGx1Z2luLmV4aXN0aW5nUGx1Z2luICE9IG51bGwpIHsKLQkJCWxpYnJhcnlQbHVnaW5MYWJlbC5zZXRUZXh0KGxpYnJhcnlQbHVnaW5FeGlzdHMpOwotCQkJY3RybF9hdXRob3JMaWJyYXJ5LnNldFRleHQocGx1Z2luLmV4aXN0aW5nUGx1Z2luLmdldEF1dGhvcnMoKSk7Ci0JCQljdHJsX3ZlcnNpb25MaWJyYXJ5LnNldFRleHQocGx1Z2luLmV4aXN0aW5nUGx1Z2luLmdldFZlcnNpb24oKSk7Ci0JCQljdHJsX2JyaWVmRGVzY0xpYnJhcnkuc2V0VGV4dChwbHVnaW4uZXhpc3RpbmdQbHVnaW4KLQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCX0gZWxzZSB7Ci0JCQlsaWJyYXJ5UGx1Z2luTGFiZWwuc2V0VGV4dChsaWJyYXJ5UGx1Z2luTm90RXhpc3RzKTsKLQkJCWN0cmxfYXV0aG9yTGlicmFyeS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJY3RybF92ZXJzaW9uTGlicmFyeS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJY3RybF9icmllZkRlc2NMaWJyYXJ5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJEaXNwbGF5QXR0cmlidXRlcygpIHsKLQkJaW1wb3J0UGx1Z2luTGFiZWwuc2V0VGV4dChwbHVnaW5Ob1NlbGVjdGlvbik7Ci0JCWN0cmxfYXV0aG9ySW1wb3J0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfdmVyc2lvbkltcG9ydC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2JyaWVmRGVzY0ltcG9ydC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWxpYnJhcnlQbHVnaW5MYWJlbC5zZXRUZXh0KHBsdWdpbk5vU2VsZWN0aW9uKTsKLQkJY3RybF9hdXRob3JMaWJyYXJ5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfdmVyc2lvbkxpYnJhcnkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9icmllZkRlc2NMaWJyYXJ5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKGNoZWNrZWRDb3VudCA+IDApOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2Ujb25FbnRlclBhZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJTGlzdCBwbHVnaW5zID0gZGF0YS5nZXRQbHVnaW5zKCk7Ci0JCWlmIChwbHVnaW5zICE9IG51bGwpIHsKLQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0SW5wdXQocGx1Z2lucy50b0FycmF5KCkpOwotCQkJaWYgKCFwbHVnaW5zLmlzRW1wdHkoKSkgewotCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocGx1Z2lucwotCQkJCQkJLmdldCgwKSk7Ci0JCQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZTYxMDdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHdpemFyZHMgZm9yIGltcG9ydGluZyBtZXRob2QgcGx1Zy1pbnMgYW5kIGNvbmZpZ3VyYXRpb25zLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0YWIxMTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ly5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UKLW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ly5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYzcwZmI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZGIxMzBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IGxpYmVkaXQuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSwKLSBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXM7dmlzaWJpbGl0eTo9cmVleHBvcnQKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24sCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlciwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvciwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5pbXBsLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC51dGlsLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbiwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk2ZWY5NTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1zb3VyY2UubGliZWRpdC5qYXIgPSBzcmMvCi1vdXRwdXQubGliZWRpdC5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBsaWJlZGl0LmphcixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLwotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvY2hlY2tlZF9ib3guZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2NoZWNrZWRfYm94LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWNhY2I5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvY2hlY2tlZF9ib3guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBY3Rpdml0eV9icmVha2Rvd25FbGVtZW50c19BY3Rpdml0eS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUFjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX0FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUFjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX0FjdGl2aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfY29uY2VwdHNBbmRQYXBlcnNfQ29uY2VwdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X2NvbmNlcHRzQW5kUGFwZXJzX0NvbmNlcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZGY4NGRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfY29uY2VwdHNBbmRQYXBlcnNfQ29uY2VwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUN1c3RvbUNhdGVnb3J5X2NhdGVnb3JpemVkRWxlbWVudHNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDdXN0b21DYXRlZ29yeV9jYXRlZ29yaXplZEVsZW1lbnRzX0N1c3RvbUNhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGY0Nzk4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUN1c3RvbUNhdGVnb3J5X2NhdGVnb3JpemVkRWxlbWVudHNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX0N1c3RvbUNhdGVnb3J5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19DdXN0b21DYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmNDc5ODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX0N1c3RvbUNhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nX2Rpc2NpcGxpbmVzX0Rpc2NpcGxpbmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfRGlzY2lwbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1YmQ0NzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfRGlzY2lwbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByYWN0aWNlX3N1YlByYWN0aWNlX1ByYWN0aWNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJhY3RpY2Vfc3ViUHJhY3RpY2VfUHJhY3RpY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NzIwOWNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJhY3RpY2Vfc3ViUHJhY3RpY2VfUHJhY3RpY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSb2xlU2V0R3JvdXBpbmdfcm9sZVNldHNfUm9sZVNldC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJvbGVTZXRHcm91cGluZ19yb2xlU2V0c19Sb2xlU2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA5OWZlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJvbGVTZXRHcm91cGluZ19yb2xlU2V0c19Sb2xlU2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya1Byb2R1Y3RfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrUHJvZHVjdF9lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIzNjQzZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrUHJvZHVjdF9lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BcnRpZmFjdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BcnRpZmFjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXJ0aWZhY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm5zLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3MTQ3NjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm5zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NoZWNrbGlzdHMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2hlY2tsaXN0cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4ZjZkOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2hlY2tsaXN0cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25jZXB0cy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25jZXB0cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFkZjg0ZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uY2VwdHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uZmlndXJhdGlvbnMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uZmlndXJhdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYTI0ZmRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbmZpZ3VyYXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yaWVzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0N1c3RvbUNhdGVnb3JpZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2M2E1ZDdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0N1c3RvbUNhdGVnb3JpZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcmFibGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcmFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTEwNTYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc2VzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc2VzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWYyNGE5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3Nlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaXNjaXBsaW5lcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaXNjaXBsaW5lcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1NTNjMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlzY2lwbGluZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRG9tYWlucy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Eb21haW5zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2YyODkyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Eb21haW5zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZmM4NGU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FeGFtcGxlcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FeGFtcGxlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFiOTQ0ZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXhhbXBsZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRm9sZGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0ZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NDE5ZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRhbmNlRm9sZGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRhbmNlRm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2NiMTQxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HdWlkYW5jZUZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjMzhjZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGFja2FnZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvT3V0Y29tZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9PdXRjb21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTcwMzUxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9PdXRjb21lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1BsYW5uaW5nVGVtcGxhdGVzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1BsYW5uaW5nVGVtcGxhdGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmViNmVkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QbGFubmluZ1RlbXBsYXRlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QcmFjdGljZXMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJhY3RpY2VzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QcmFjdGljZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb250cmlidXRpb25zLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb250cmlidXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDhkOGMyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29udHJpYnV0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRmFtaWxpZXMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlsaWVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGYxYmE2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRmFtaWxpZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc2VzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3Nlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4ZDhjMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc2VzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlcG9ydHMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVwb3J0cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk1ZjNlMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVwb3J0cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXVzYWJsZUFzc2V0cy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXVzYWJsZUFzc2V0cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI1MmNmZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmV1c2FibGVBc3NldHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9hZG1hcHMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9hZG1hcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMTFiYzVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvYWRtYXBzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTRhM2Y2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGFuZGFyZENhdGVnb3JpZXMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RhbmRhcmRDYXRlZ29yaWVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTY5ODM4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGFuZGFyZENhdGVnb3JpZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3VwcG9ydGluZ01hdGVyaWFscy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdXBwb3J0aW5nTWF0ZXJpYWxzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDVhMjFlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdXBwb3J0aW5nTWF0ZXJpYWxzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjM4YmQ4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrc19jZnYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza3NfY2Z2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTU1M2MxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrc19jZnYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVjaG5pcXVlcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWNobmlxdWVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzY4NjZkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWNobmlxdWVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlbXBsYXRlcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZW1wbGF0ZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNzYzMjUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlbXBsYXRlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZXJtRGVmaW5pdGlvbnMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVybURlZmluaXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTIxYmZlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZXJtRGVmaW5pdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbE1lbnRvcnMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbE1lbnRvcnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZjFiODVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2xNZW50b3JzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2xzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2xzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTI0ZjhlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29scy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9XaGl0ZXBhcGVycy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9XaGl0ZXBhcGVycy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1YjQ4MDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV2hpdGVwYXBlcnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RHdWlkZWxpbmVzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0R3VpZGVsaW5lcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk1N2ZhNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RHdWlkZWxpbmVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZXMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RUeXBlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmMjg5MjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RUeXBlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdHMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2YyODkyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvZW1wdHlfcGFja19vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvZW1wdHlfcGFja19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjODgyODRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L2VtcHR5X3BhY2tfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L3BhY2thZ2Vfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L3BhY2thZ2Vfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTMxYzI4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9wYWNrYWdlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9wcm9jZm9sZF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvcHJvY2ZvbGRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDQ4ZTI3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9wcm9jZm9sZF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvdG9vbHNldC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi90b29sc2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTI0ZjhlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi90b29sc2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy91bmNoZWNrZWRfYm94LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy91bmNoZWNrZWRfYm94LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjZiOWY4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvdW5jaGVja2VkX2JveC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAyNzNlZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBMaWJyYXJ5IEVkaXQKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi1fVUlfQ29udGVudF9ncm91cD1NZXRob2QgQ29udGVudAotCi1fVUlfRGlzY2lwbGluZXNfZ3JvdXA9RGlzY2lwbGluZXMKLV9VSV9Eb21haW5zX2dyb3VwPURvbWFpbnMKLV9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwPVdvcmsgUHJvZHVjdCBLaW5kcwotX1VJX1JvbGVfU2V0c19ncm91cD1Sb2xlIFNldHMKLV9VSV9Ub29sc19ncm91cD1Ub29scwotX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXA9U3RhbmRhcmQgQ2F0ZWdvcmllcwotX1VJX0N1c3RvbV9DYXRlZ29yaWVzX2dyb3VwPUN1c3RvbSBDYXRlZ29yaWVzCi1fVUlfTWV0aG9kQ29udGVudF9ncm91cD1Db250ZW50IFBhY2thZ2VzCi0KLV9VSV9Qcm9jZXNzZXNfZ3JvdXA9UHJvY2Vzc2VzCi1fVUlfUGxhbm5pbmdUZW1wbGF0ZXNfZ3JvdXA9UGxhbm5pbmcgVGVtcGxhdGVzCi0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybnNfdGV4dD1DYXBhYmlsaXR5IFBhdHRlcm5zCi1fVUlfRGVsaXZlcnlQcm9jZXNzZXNfdGV4dD1EZWxpdmVyeSBQcm9jZXNzZXMKLV9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uc190ZXh0PURpZmZlcmVudGlhbCBQcm9jZXNzZXMKLV9VSV9QbGFubmluZ1RlbXBsYXRlc190ZXh0PVBsYW5uaW5nIFRlbXBsYXRlcwotCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1DYXBhYmlsaXR5IFBhdHRlcm4KLV9VSV9EZWxpdmVyeVByb2Nlc3NfdGV4dD1EZWxpdmVyeSBQcm9jZXNzCi1fVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0PURpZmZlcmVudGlhbCBQcm9jZXNzCi0KLV9VSV9Db25maWd1cmF0aW9uc190ZXh0PUNvbmZpZ3VyYXRpb25zCi0KLV9VSV9Qcm9jZXNzRmFtaWxpZXNfdGV4dD1Qcm9jZXNzIEZhbWlsaWVzCi0KLV9VSV9VbmNhdGVnb3JpemVkX3RleHQ9VW5jYXRlZ29yaXplZAotX1VJX1VuY2F0ZWdvcml6ZWRfVGFza3NfdGV4dD1VbmNhdGVnb3JpemVkIFRhc2tzCi1fVUlfVW5jYXRlZ29yaXplZF9Sb2xlc190ZXh0PVVuY2F0ZWdvcml6ZWQgUm9sZXMKLQotX1VJX0d1aWRhbmNlc19ncm91cD1HdWlkYW5jZQotX1VJX0d1aWRhbmNlc19DaGVja2xpc3RzPUNoZWNrbGlzdHMKLV9VSV9HdWlkYW5jZXNfQ29uY2VwdHM9Q29uY2VwdHMKLV9VSV9HdWlkYW5jZXNfRXhhbXBsZXM9RXhhbXBsZXMKLV9VSV9HdWlkYW5jZXNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPUVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMKLV9VSV9HdWlkYW5jZXNfUHJhY3RpY2VzPVByYWN0aWNlcwotX1VJX0d1aWRhbmNlc19SZXBvcnRzPVJlcG9ydHMKLV9VSV9HdWlkYW5jZXNfUmV1c2FibGVBc3NldHM9UmV1c2FibGUgQXNzZXRzCi1fVUlfR3VpZGFuY2VzX1JvYWRtYXA9Um9hZG1hcAotX1VJX0d1aWRhbmNlc19TdXBwb3J0aW5nTWF0ZXJpYWxzPVN1cHBvcnRpbmcgTWF0ZXJpYWxzCi1fVUlfR3VpZGFuY2VzX1RlY2huaXF1ZXM9VGVjaG5pcXVlcwotX1VJX0d1aWRhbmNlc19UZW1wbGF0ZXM9VGVtcGxhdGVzCi1fVUlfR3VpZGFuY2VzX1Rlcm1EZWZpbml0aW9ucz1UZXJtIERlZmluaXRpb25zCi1fVUlfR3VpZGFuY2VzX1Rvb2xNZW50b3JzPVRvb2wgTWVudG9ycwotX1VJX0d1aWRhbmNlc19XaGl0ZXBhcGVycz1XaGl0ZXBhcGVycwotX1VJX0d1aWRhbmNlc19Xb3JrUHJvZHVjdEd1aWRlbGluZXM9R3VpZGVsaW5lcwotCi0KLV9VSV9Sb2xlc19ncm91cD1Sb2xlcwotX1VJX1Rhc2tzX2dyb3VwPVRhc2tzCi1fVUlfV29ya1Byb2R1Y3RzX2dyb3VwPVdvcmsgUHJvZHVjdHMKLQotIyBCcmVha2Rvd24gc3RydWN0dXJlIGNvbHVtbiBkaXNwbGF5IG5hbWVzCi1CU19Db2x1bW5fbmFtZT1OYW1lCi1CU19Db2x1bW5fcHJlZml4PVByZWZpeAotQlNfQ29sdW1uX2lkPUluZGV4Ci1CU19Db2x1bW5fcHJlZGVjZXNzb3JzPVByZWRlY2Vzc29ycwotQlNfQ29sdW1uX2lzX3JlcGVhdGFibGU9UmVwZWF0YWJsZQotQlNfQ29sdW1uX2lzX29uZ29pbmc9T25nb2luZwotQlNfQ29sdW1uX2lzX2V2ZW50X2RyaXZlbj1FdmVudC1Ecml2ZW4KLUJTX0NvbHVtbl9lbnRyeV9zdGF0ZT1FbnRyeSBTdGF0ZQotQlNfQ29sdW1uX2V4aXRfc3RhdGU9RXhpdCBTdGF0ZQotQlNfQ29sdW1uX3RlYW1zPVRlYW0KLUJTX0NvbHVtbl90eXBlPVR5cGUKLUJTX0NvbHVtbl9tb2RlbF9pbmZvPU1vZGVsIEluZm8KLUJTX0NvbHVtbl9wcmVzZW50YXRpb25fbmFtZT1QcmVzZW50YXRpb24gTmFtZQotQlNfQ29sdW1uX2RlbGl2ZXJhYmxlPURlbGl2ZXJhYmxlCi1CU19Db2x1bW5faXNfb3B0aW9uYWw9T3B0aW9uYWwKLUJTX0NvbHVtbl9pc19wbGFubmVkPVBsYW5uZWQKLUJTX0NvbHVtbl9oYXNfbXVsdGlwbGVfb2NjdXJyZW5jZXM9TXVsdGlwbGUgT2NjdXJyZW5jZXMKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODEwNDYzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idGV4dFJlZmVyZW5jZVJlcGxhY2VyIiBuYW1lPSJUZXh0IFJlZmVyZW5jZSBSZXBsYWNlciIgc2NoZW1hPSJzY2hlbWEvdGV4dFJlZmVyZW5jZVJlcGxhY2VyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImRpYWdyYW1NYW5hZ2VyIiBuYW1lPSJEaWFncmFtIE1hbmFnZXIiIHNjaGVtYT0ic2NoZW1hL2RpYWdyYW1NYW5hZ2VyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImNvbW1hbmRMaXN0ZW5lcnMiIG5hbWU9IkNvbW1hbmQgTGlzdGVuZXJzIiBzY2hlbWE9InNjaGVtYS9jb21tYW5kTGlzdGVuZXJzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImxpYnJhcnlJbnNwZWN0b3IiIG5hbWU9IkxpYnJhcnkgSW5zcGVjdG9yIiBzY2hlbWE9InNjaGVtYS9saWJyYXJ5SW5zcGVjdG9yLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im5lc3RlZENvbW1hbmRQcm92aWRlcnMiIG5hbWU9Ik5lc3RlZCBDb21tYW5kIFByb3ZpZGVycyIgc2NoZW1hPSJzY2hlbWEvbmVzdGVkQ29tbWFuZFByb3ZpZGVycy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJvcHBvc2l0ZUZlYXR1cmVMb2FkZXJzIiBuYW1lPSJPcHBvc2l0ZUZlYXR1cmUgTG9hZGVycyIgc2NoZW1hPSJzY2hlbWEvb3Bwb3NpdGVGZWF0dXJlTG9hZGVycy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ1c2VySW50ZXJhY3Rpb25IYW5kbGVyIiBuYW1lPSJVc2VyIEludGVyYWN0aW9uIEhhbmRsZXIiIHNjaGVtYT0ic2NoZW1hL3VzZXJJbnRlcmFjdGlvbkhhbmRsZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idmFsaWRhdGlvblN1cHBvcnQiIG5hbWU9IlZhbGlkYXRpb24gU3VwcG9ydCIgc2NoZW1hPSJzY2hlbWEvdmFsaWRhdGlvblN1cHBvcnQuZXhzZCIvPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgPHBhY2thZ2UgCi0gICAgICAgdXJpID0gImh0dHA6Ly8vY29tL2libS91bWEvZWRpdC90bmcvdXRpbC9tb2RlbC5lY29yZSIgCi0gICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZSIgLz4KLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9jb21tYW5kTGlzdGVuZXJzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2NvbW1hbmRMaXN0ZW5lcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGEzYTcwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2NvbW1hbmRMaXN0ZW5lcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ij4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0IiBpZD0iY29tbWFuZExpc3RlbmVycyIgbmFtZT0iQ29tbWFuZCBMaXN0ZW5lcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbW1hbmRMaXN0ZW5lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb21tYW5kTGlzdGVuZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSBtaWdyYXRvci4gVGhpcyBjbGFzcyBtdXN0IGJlIGEgcHVibGljIGltcGxlbWVudGF0aW9uIG9mICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbW1hbmRMaXN0ZW5lciZsdDsvY29kZSZndDsgd2l0aCBhIHB1YmxpYyAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvZGlhZ3JhbU1hbmFnZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvZGlhZ3JhbU1hbmFnZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDM3NTdhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2RpYWdyYW1NYW5hZ2VyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIgaWQ9ImRpYWdyYW1NYW5hZ2VyIiBuYW1lPSJEaWFncmFtIE1hbmFnZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRpYWdyYW1NYW5hZ2VyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGlhZ3JhbU1hbmFnZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvbGlicmFyeUluc3BlY3Rvci5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9saWJyYXJ5SW5zcGVjdG9yLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVkMjExYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9saWJyYXJ5SW5zcGVjdG9yLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIgaWQ9ImxpYnJhcnlJbnNwZWN0b3IiIG5hbWU9IkxpYnJhcnkgSW5zcGVjdG9yIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEluc3BlY3QgY29udGVudHMgb2YgbGliYXJ5IGZvciBkZWJ1ZyBvciB0ZXN0aW5nIHB1cnBvc2UuIFRoZSBpbnRlbnRpb24gaXMgdG8gcHJvdmlkZSBhIGNvbnZlaWVudCBwbGFjZSB0byBob29rIGFueSBleHRlcm5hbCBkZWJ1ZyBvciB0ZXN0aW5nIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgbm90IHBhcnQgb2YgRVBGLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibGlicmFyeUluc3BlY3RvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImxpYnJhcnlJbnNwZWN0b3IiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JTGlicmFyeUluc3BlY3RvcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9uZXN0ZWRDb21tYW5kUHJvdmlkZXJzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL25lc3RlZENvbW1hbmRQcm92aWRlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDlkOTM3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL25lc3RlZENvbW1hbmRQcm92aWRlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ij4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0IiBpZD0ibmVzdGVkQ29tbWFuZFByb3ZpZGVycyIgbmFtZT0iTmVzdGVkIENvbW1hbmQgUHJvdmlkZXJzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFByb3ZpZGVycyBvZiBuZXN0ZWQgY29tbWFuZHMgdG8gZXhlY3V0ZSByaWdodCBhZnRlciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtYWluIGNvbW1hbmQuIFRoZSBleHRlbnNpb24gbXVzdCBpbXBsZW1lbnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklOZXN0ZWRDb21tYW5kUHJvdmlkZXIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibmVzdGVkQ29tbWFuZFByb3ZpZGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im5lc3RlZENvbW1hbmRQcm92aWRlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklOZXN0ZWRDb21tYW5kUHJvdmlkZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvb3Bwb3NpdGVGZWF0dXJlTG9hZGVycy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9vcHBvc2l0ZUZlYXR1cmVMb2FkZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA1Y2E5ZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9vcHBvc2l0ZUZlYXR1cmVMb2FkZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIgaWQ9Im9wcG9zaXRlRmVhdHVyZUxvYWRlcnMiIG5hbWU9Ik9wcG9zaXRlRmVhdHVyZSBMb2FkZXJzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9wcG9zaXRlRmVhdHVyZUxvYWRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJvcHBvc2l0ZUZlYXR1cmVMb2FkZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvdGV4dFJlZmVyZW5jZVJlcGxhY2VyLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL3RleHRSZWZlcmVuY2VSZXBsYWNlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzA5ZDNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvdGV4dFJlZmVyZW5jZVJlcGxhY2VyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIgaWQ9InRleHRSZWZlcmVuY2VSZXBsYWNlciIgbmFtZT0iVGV4dCBSZWZlcmVuY2UgUmVwbGFjZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgUmVwbGFjZXMgdGV4dHVhbCByZWZlcmVuY2VzIHRvIHRoZSBvbGQgb2JqZWN0cyB3aXRoIHJlZmVyZW5jZXMgdG8gbmV3IG9iamVjdHMKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InRleHRSZWZlcmVuY2VSZXBsYWNlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InRleHRSZWZlcmVuY2VSZXBsYWNlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIG1pZ3JhdG9yLiBUaGlzIGNsYXNzIG11c3QgYmUgYSBwdWJsaWMgaW1wbGVtZW50YXRpb24gb2YgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklUZXh0UmVmZXJlbmNlUmVwbGFjZXImbHQ7L2NvZGUmZ3Q7IHdpdGggYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JVGV4dFJlZmVyZW5jZVJlcGxhY2VyCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL3VzZXJJbnRlcmFjdGlvbkhhbmRsZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvdXNlckludGVyYWN0aW9uSGFuZGxlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZTMxNjgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvdXNlckludGVyYWN0aW9uSGFuZGxlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiIGlkPSJ1c2VySW50ZXJhY3Rpb25IYW5kbGVyIiBuYW1lPSJVc2VyIEludGVyYWN0aW9uIEhhbmRsZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRXh0ZW5zaW9uIHBvaW50IHRvIGludGVyYWN0IHdpdGggdXNlcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idXNlckludGVyYWN0aW9uSGFuZGxlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InVzZXJJbnRlcmFjdGlvbkhhbmRsZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBwdWJsaWMgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci4gVGhpcyBjbGFzcyBtdXN0IGhhdmUgYSBwdWJsaWMgZGVmYXVsdCBub24tYXJndW1lbnQgY29uc3RydWN0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL3ZhbGlkYXRpb25TdXBwb3J0LmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL3ZhbGlkYXRpb25TdXBwb3J0LmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUzOWRkYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS92YWxpZGF0aW9uU3VwcG9ydC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiIGlkPSJ2YWxpZGF0aW9uU3VwcG9ydCIgbmFtZT0iVmFsaWRhdGlvbiBTdXBwb3J0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFN1cHBvcnRzIGNvbnRyaWJ1dGlvbi9yZXBsYWNlbWVudCBvZiB2YWxpZGF0b3JzCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InZhbGlkYXRpb25GYWN0b3J5Ii8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InZhbGlkYXRpb25GYWN0b3J5Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJjbGFzcyIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3RvcnkKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJlcGxhY2UiIHR5cGU9ImJvb2xlYW4iIHVzZT0iZGVmYXVsdCIgdmFsdWU9ImZhbHNlIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBpZiBzZXQgdG8gJmx0O2NvZGUmZ3Q7dHJ1ZSZsdDsvY29kZSZndDsgd2lsbCByZXBsYWNlIGFueSBvdGhlciBleGlzdGluZyB2YWxpZGF0aW9uIGZhY3RvcnkgaW4gdGhlIHN5c3RlbS4gSXQgaXMgJmx0O2NvZGUmZ3Q7ZmFsc2UmbHQ7L2NvZGUmZ3Q7IGJ5IGRlZmF1bHQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0ZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzM2ZmM2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIEEgc3ViY2xhc3Mgb2YgRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIgdGhhdCBrZWVwcyBhIHJlZmVyZW5jZSB0byB0aGUKLSAqIGNvbnRhaW5pbmcgZmVhdHVyZSBvZiB0aGUgd3JhcHBlZCB2YWx1ZSBhbmQgaW1wbGVtZW50cyBDb21wYXJhYmxlIHRvIHN1cHBvcnQKLSAqIHNvcnRpbmcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKLQotCXB1YmxpYyBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgZmVhdHVyZSwgQ29tbWFuZFBhcmFtZXRlci5OT19JTkRFWCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQkJCi0KLQlwdWJsaWMgTGlzdCBnZXROb3RpZnlDaGFuZ2VkTGlzdGVuZXJzKCkgewotCQlpZihjaGFuZ2VOb3RpZmllciBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KChDb2xsZWN0aW9uKSBjaGFuZ2VOb3RpZmllcik7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyI2NyZWF0ZVdyYXBwZXIoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkpCi0JICovCi0JcHJvdGVjdGVkIElXcmFwcGVySXRlbVByb3ZpZGVyIGNyZWF0ZVdyYXBwZXIoT2JqZWN0IHZhbHVlLCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcihudWxsLCB2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBGaWxscyB0aGUgZ2l2ZW4gd3JhcHBlcnMgYnkga2VlcGluZyBleGlzdGluZywgcmVtb3ZpbmcvZGlzcG9zZSBvbGQsIGFuZAotCSAqIGFkZGluZyBuZXcgb25lcy4KLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcnMKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSB2YWx1ZXMKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZmlsbChDb2xsZWN0aW9uIHdyYXBwZXJzLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCUNvbGxlY3Rpb24gdmFsdWVzLCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHdyYXBwZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIGl0ZXIKLQkJCQkJLm5leHQoKTsKLQkJCWlmICghdmFsdWVzLnJlbW92ZSh3cmFwcGVyLmdldFZhbHVlKCkpKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl3cmFwcGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQl3cmFwcGVycy5hZGQobmV3IEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIoZmVhdHVyZSwgaXRlcgotCQkJCQkubmV4dCgpLCBvd25lciwgYWRhcHRlckZhY3RvcnkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7Ci0JCU9iamVjdCBvdGhlclZhbHVlID0gKChJV3JhcHBlckl0ZW1Qcm92aWRlcikgbykuZ2V0VmFsdWUoKTsKLQkJaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KQotCQkJCXx8ICEob3RoZXJWYWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiAoKE1ldGhvZEVsZW1lbnQpIHZhbHVlKS5nZXROYW1lKCkuY29tcGFyZVRvKAotCQkJCSgoTWV0aG9kRWxlbWVudCkgb3RoZXJWYWx1ZSkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQWRhcHRlckZhY3RvcnlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYTM1M2Y3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQWRhcHRlckZhY3RvcnlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLQkvKioKLQkgKiBHZXRzIGFkYXB0ZXIgZmFjdG9yeSBmb3Igd29yayBicmVha2Rvd24gc3RydWN0dXJlLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlBZGFwdGVyRmFjdG9yeSBnZXRXQlNBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyBhZGFwdGVyIGZhY3RvcnkgZm9yIHRlYW0gdXNhZ2UKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JQWRhcHRlckZhY3RvcnkgZ2V0VEJTQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgYWRhcHRlciBmYWN0b3J5IGZvciB3b3JrIHByb2R1Y3QgdXNhZ2UKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JQWRhcHRlckZhY3RvcnkgZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIGFkYXB0ZXIgZmFjdG9yeSBmb3IgY29uc29saWRhdGVkIHZpZXcgb2YgdGhlIHByb2Nlc3MuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUFkYXB0ZXJGYWN0b3J5IGdldENCU0FkYXB0ZXJGYWN0b3J5KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExZWVlZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGJyZWFrIGRvd24gZWxlbWVudCBpdGVtIHByb3ZpZGVycyB0aGF0IHdhbnQKLSAqIHRvIG1hbnRhaW4gYSBsaXN0IGNhY2hlZCBjaGlsZHJlbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogR2V0cyB0aGUgY2FjaGVkIGNoaWxkcmVuLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGNhY2hlZCBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21DYWNoZSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgY2FjaGVkIHJvbGx1cCBjaGlsZGVuLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGNhY2hlZCByb2xsdXAgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb21tYW5kTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29tbWFuZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI0NzZhMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb21tYW5kTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IGNvbW1hbmRzIHRoYXQgd2FudCB0byBub3RpZnkgdGhlaXIgbGlzdGVuZXJzIG9mCi0gKiBjZXJ0YWluIGV2ZW50cy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29tbWFuZExpc3RlbmVyIHsKLQkvKioKLQkgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gcHJpb3IgdG8gdGhlIGV4ZWN1dGlvbiB0aGUgZ2l2ZW4gY29tbWFuZAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICovCi0JcHVibGljIHZvaWQgcHJlRXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpOwotCi0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIHRoYXQgYSBjb21tYW5kIGhhcyBiZWVuIGV4ZWN1dGVkLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICBhIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlFeGVjdXRlZChDb21tYW5kIGNvbW1hbmQpOwotCi0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIHByaW9yIHRvIHRoZSB1bmRvIG9mIHRoZSBnaXZlbiBjb21tYW5kCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIGFuIHVuZG8gY29tbWFuZAotCSAqLwotCXB1YmxpYyB2b2lkIHByZVVuZG8oQ29tbWFuZCBjb21tYW5kKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbW1hbmQgY2xhc3MuCi0JICogCi0JICogQHJldHVybiBhIGNvbW1hbmQgY2xhc3MuCi0JICovCi0JcHVibGljIENsYXNzIGdldENvbW1hbmRUeXBlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjhiNmRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgaXRlbSBwcm92aWRlcnMgdGhhdCBjYW4gYmUgY29uZmlndXJlZCB0byBkaXNwbGF5IGEKLSAqIGZpbHRlcmVkIGxpc3Qgb2YgY2hpbGRyZW4gYW5kIGhhdmUgdGhlaXIgZGVmYXVsdCBsYWJlbCBvdmVyd3JpdHRlbiBhdAotICogcnVudGltZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJhYmxlIHsKLQotCS8qKgotCSAqIFNldHMgdGhlIGZpbHRlciB0aGF0IGlzIHVzZWQgdG8gZmlsdGVyIHRoaXMgb2JqZWN0J3MgY2hpbGRyZW4uCi0JICogCi0JICogQHBhcmFtIGZpbHRlcgotCSAqICAgICAgICAgICAgYW4gPGNvZGU+SUZpbHRlcjwvY29kZT4gb2JqZWN0Ci0JICogQHNlZSBJRmlsdGVyCi0JICovCi0Jdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFiZWwgZm9yIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhCi0JICogICAgICAgICAgICBzdHJpbmcgbGFiZWwKLQkgKi8KLQl2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQxOTY4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IHRvIG9idGFpbiBhbmQgcmVzb2x2ZSBtZXRob2QgZWxlbWVudCBhdHRyaWJ1dGVzIGFuZAotICogcmVmZXJlbmNlcyBpbiBhIG1ldGhvZCBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgewotCi0JLyoqCi0JICogR2V0cyB0aGUgYXR0cmlidXRlIHZhbHVlIG9mIGEgdmFyaWFiaWxpdHkgZWxlbWVudCBpbiBhIG1ldGhvZAotCSAqIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHZlCi0JICogICAgICAgICAgICBhIHZhcmlhYmlsaXR5IGVsZW1lbnQKLQkgKiBAcGFyYW0gYXR0cgotCSAqICAgICAgICAgICAgYW4gYXR0cmlidXRlIHJlcHJlc2VudGF0aW9uCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgZGVyaXZlZCBmcm9tIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqICAgICAgICAgY2xvc3VyZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwgRUF0dHJpYnV0ZSBhdHRyLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVmZXJlbmNlIHZhbHVlIG9mIGEgdmFyaWFiaWxpdHkgZWxlbWVudCBpbiBhIG1ldGhvZAotCSAqIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHZlCi0JICogICAgICAgICAgICBhIHZhcmlhYmlsaXR5IGVsZW1lbnQKLQkgKiBAcGFyYW0gcmVmCi0JICogICAgICAgICAgICBhIHJlZmVyZW5jZSByZXByZXNlbnRhdGlvbgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIGRlcml2ZWQgZnJvbSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiAgICAgICAgIGNsb3N1cmUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmVyZW5jZShWYXJpYWJpbGl0eUVsZW1lbnQgdmUsIEVSZWZlcmVuY2UgcmVmLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVmZXJlbmNlIHZhbHVlIG9mIGEgY29udGVudCBkZXNjcmlwdGlvbiBpbiBhIG1ldGhvZAotCSAqIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGRlc2MKLQkgKiAgICAgICAgICAgIGEgY29udGVudCBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSByZWYKLQkgKiAgICAgICAgICAgIGEgcmVmZXJlbmNlIHJlcHJlc2VudGF0aW9uCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2UgZGVyaXZlZCBmcm9tIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqICAgICAgICAgY2xvc3VyZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVmZXJlbmNlKENvbnRlbnREZXNjcmlwdGlvbiBkZXNjLCBNZXRob2RFbGVtZW50IG93bmVyLAotCQkJRVJlZmVyZW5jZSByZWYsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHJlZmVyZW5jZSB2YWx1ZSBvZiBhIG1ldGhvZCBlbGVtZW50IG9wcG9zaXRlIGZlYXR1cmUgaW4gYSBtZXRob2QKLQkgKiBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIGFuIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBkZXJpdmVkIGZyb20gdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogICAgICAgICBjbG9zdXJlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotCS8qKgotCSAqIFJlc29sdmVzIHRoZSBnaXZlbiBvYmplY3QgdXNpbmcgdGhlIGdpdmVuIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgcmVzb2x2ZWQgbWV0aG9kIGVsZW1lbnQgZGVyaXZlZCBmcm9tIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqICAgICAgICAgY2xvc3VyZQotCSAqLwotCU9iamVjdCByZXNvbHZlKE9iamVjdCBvYmplY3QsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFkMjZjOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgaXRlbSBwcm92aWRlcnMgYW5kIGNvbW1hbmRzIHRoYXQgd2FudCB0byBmaWx0ZXIKLSAqIGRvd24gcmVsYXRlZCBtZXRob2QgZWxlbWVudHMgaW4gYSBtZXRob2QgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRvciBleHRlbmRzIElGaWx0ZXIsIEFkYXB0ZXIgewotCi0JTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQl2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi0JLyoqCi0JICogSWYgdGhpcyBtZXRob2QgcmV0dXJuIGEgbm9uLU5VTEwsIHRoZSBpdGVtIHByb3ZpZGVyIHdpbGwgdXNlIHRoZSByZXR1cm5lZAotCSAqIGNvbGxlY3Rpb24gYXMgY2hpbGRyZW4gaW4gcGxhY2Ugb2YgaXRzIGRlZmF1bHQgY2hpbHJlbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIGNoaWxkRmVhdHVyZQotCSAqIEByZXR1cm4KLQkgKi8KLQlDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUpOwotCi0JLyoqCi0JICogUmVzb2x2ZXMgdGhpcyBvYmplY3QgYWNjb3JkaW5nIHRvIHZhcmlhYmlsaXR5IHJ1bGVzLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuIHJlc29sdmVkIG9iamVjdCB0aGF0IGlzIGVpdGhlciB0aGUgb2JqZWN0IGl0c2VsZiwgb3IgaXRzIHJlcGxhY2VyCi0JICogICAgICAgICBkZXBlbmRpbmcgb24gdGhlIHZhcmlhYmlsaXR5IG9mIHRoaXMgb2JqZWN0IGluIHRoZSBjb25maWd1cmF0aW9uLgotCSAqLwotCU9iamVjdCByZXNvbHZlKE9iamVjdCBvYmplY3QpOwotCi0JLyoqCi0JICogR2V0cyB2YXJpYWJpbGl0eSBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIFZhcmlhYmlsaXR5RWxlbWVudCBjYWxjdWxhdGVkCi0JICogYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhpcyBjb25maWd1cmF0b3IgYW5kIGFjY29yZGluZyB0byB0aGUKLQkgKiB2YXJpYWJpbGl0eSBydWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gdmUKLQkgKiBAcmV0dXJuCi0JICogQHNlZSBWYXJpYWJpbGl0eUluZm8KLQkgKi8KLQlWYXJpYWJpbGl0eUluZm8gZ2V0VmFyaWFiaWxpdHlJbmZvKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSk7Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3IgdW5jYXRlZ29yaXplZCB0YXNrcwotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFVuY2F0ZWdvcml6ZWRUYXNrRmlsdGVyKCk7Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3Igd29ya3Byb2R1Y3RzIHdpdGhvdXQgYSBkb21haW4KLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXREb21haW5VbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIoKTsKLQkKLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciB3b3JrcHJvZHVjdHMgd2l0aG91dCBhIFdQIFR5cGUKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRXcFR5cGVVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIoKTsKLQkKLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciB1bmNhdGVnb3JpemVkIHJvbGVzCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0VW5jYXRlZ29yaXplZFJvbGVGaWx0ZXIoKTsKLQotCS8qKgotCSAqIGdldCBmaWx0ZXIgZm9yIHVuY2F0ZWdvcml6ZWQgdG9vbCBtZW50b3JzCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0VW5jYXRlZ29yaXplZFRvb2xNZW50b3JGaWx0ZXIoKTsKLQkKLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciBkaXNjaXBsaW5lcyBhbmQgZGlzcGxpbmUgZ3JvdXBpbmdzCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0RGlzY2lwbGluZXNGaWx0ZXIoKTsKLQkKLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciByb2xlc2V0cyBhbmQgcm9sZXNldCBncm91cGluZ3MKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRSb2xlU2V0c0ZpbHRlcigpOwotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhdG9yRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmF0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViY2I5OGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmF0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgY29uZmlndXJhdGlvbiBmaWx0ZXIgZmFjdG9yeS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJhdG9yRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29uZmlndXJhdGlvbiBmaWx0ZXIuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSBjb25maWd1cmF0aW9uIGZpbHRlci4KLQkgKi8KLQlJQ29uZmlndXJhdG9yIGNyZWF0ZUNvbmZpZ3VyYXRvcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JRGVmYXVsdE5hbWVTZXR0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JRGVmYXVsdE5hbWVTZXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWVmMGE3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSURlZmF1bHROYW1lU2V0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgaXRlbSBwcm92aWRlcnMgdGhhdCB3YW50IHRvIGFzc2lnbiBhIGRlZmF1bHQgbmFtZQotICogZm9yIGVhY2ggbmV3bHkgY3JlYXRlZCBtZXRob2QgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGVmYXVsdE5hbWVTZXR0ZXIgewotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVmYXVsdCBuYW1lIGZvciB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopOwotCi0JLyoqCi0JICogR2V0cyB0aGUgSUQgb2YgdGhlIGZlYXR1cmUgdGhhdCBjb250YWlucyBtZXRob2QgZWxlbWVudHMgd2hvc2UgZGVmYXVsdAotCSAqIG5hbWUgc2V0IHRocm91Z2ggdGhpcyBpbnRlcmZhY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgSUQgb2YgYSBmZWF0dXJlCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvd25lciBjbGFzcyBvZiB0aGUgZmVhdHVyZSB0aGF0IGNvbnRhaW5zIG1ldGhvZCBlbGVtZW50cyB3aG9zZQotCSAqIGRlZmF1bHQgbmFtZSBzZXQgdGhyb3VnaCB0aGlzIGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvd25lciBjbGFzcyBvZiBhIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZjkyYTA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi0vKioKLSAqIEEgZ2VuZXJpYyBmaWx0ZXIgdGhhdCB1c2VzIHRoZSB2aXNpdG9yIGRlc2lnbiBwYXR0ZXJuLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWx0ZXIgewotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBvYmplY3QgY2FuIGJlIGFjY2VwdGVkIGJ5IHRoaXMgZmlsdGVyLgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIHRoZSB2aXNpdGluZyBvYmplY3QKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgYWNjZXB0ZWQsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgb3RoZXJ3aXNlCi0JICovCi0JYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaik7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JR3JvdXBDb250YWluZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JR3JvdXBDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDAyMDU0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUdyb3VwQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgaXRlbSBwcm92aWRlcnMgdGhhdCB3YW50IHRvIGxldCBjbGllbnRzIGFjY2VzcyBpdHMKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyIDxlbT5ncm91cCBpdGVtIHByb3ZpZGVyczwvZW0+fQotICogYnkgbmFtZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJR3JvdXBDb250YWluZXIgewotCi0JLyoqCi0JICogR2V0cyB0aGUgZ3JvdXAgaXRlbSBwcm92aWRlciB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZ3JvdXAgaXRlbSBwcm92aWRlcgotCSAqIEByZXR1cm4gYSA8Y29kZT5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcjxjb2RlPiBvYmplY3QKLQkgKi8KLQlPYmplY3QgZ2V0R3JvdXBJdGVtUHJvdmlkZXIoU3RyaW5nIG5hbWUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUxpYnJhcnlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZTJhNTNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgaXRlbSBwcm92aWRlcnMgdGhhdCB3YW50IHRvIGluY2x1ZGUgVUkgZm9sZGVycwotICogYW5kIGZlYXR1cmUgZGVyaXZlZCBjaGlsZHJlbi4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxpYnJhcnlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogU2V0cyB0aGUgcGFyZW50IG9mIHRoaXMgaXRlbSBwcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBhIHBhcmVudCBvYmplY3QsIHR5cGljYWxseSBhIG1ldGhvZCBlbGVtZW50Ci0JICovCi0Jdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjaGlsZHJlbiBmZWF0dXJlcy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgZmVhdHVyZXMgZm9yIHJldHJpZXZpbmcgdGhlIGNoaWxkIGVsZW1lbnRzCi0JICovCi0JQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVJlZmVyZW5jZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JUmVmZXJlbmNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMmU5NDJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JUmVmZXJlbmNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IGFkYXB0ZXIgZmFjdG9yaWVzIGZvciBjbGVhbmluZyB1cCByZWZlcmVuY2VzIHRvCi0gKiB1bnVzZWQgaXRlbSBwcm92aWRlcnMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZmVyZW5jZXIgewotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcmVmZXJlbmNlIHRvIGFuIGl0ZW0gcHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIHJlZgotCSAqICAgICAgICAgICAgYSByZWZlcmVuY2UgdG8gYW4gaXRlbSBwcm92aWRlcgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlZmVyZW5jZSBpcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgcmVmKTsKLQotCS8qKgotCSAqIENsZWFucyB1cCBhbGwgdW51c2VkIHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW5VcCgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVN0YXRlZnVsSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVN0YXRlZnVsSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUyMzJjZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lTdGF0ZWZ1bEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IHN0YXRlZnVsdCBpdGVtIHByb3ZpZGVycyB0aGF0IG5lZWQgdG8gYmUKLSAqIGRpc3Bvc2VkIGFmdGVyIHRoZXkgYXJlIG5vIGxvbmdlciB1c2VkLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciBleHRlbmRzIElEaXNwb3NhYmxlIHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTZkNjU5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdyYXBwZXIgewotCi0JT2JqZWN0IHdyYXAoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsCi0JCQlpbnQgaW5kZXgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjM2ZmMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogRmFjdG9yeSB0byBjcmVhdGUge0BsaW5rIElXcmFwcGVySXRlbVByb3ZpZGVyfQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEF1ZyAyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyB3cmFwcGVyIG9mIGdpdmVuIHZhbHVlIGZvciB0aGUgZ2l2ZW4gb3duZXIKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcmV0dXJuCi0JICovCi0JSVdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0aGUgdmFsdWUgaXMgbG9jYXRlZC4gSWYgZmVhdHVyZSBpcyBub24tbnVsbCwgdGhpcyBpbmRleCBpcyB3aXRoaW4gdGhhdCBmZWF0dXJlLgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEByZXR1cm4KLQkgKi8KLQlJV3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTYzZGE2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnlQcm92aWRlciB7Ci0JSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5IGdldFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvTGlicmFyeUVkaXRQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9MaWJyYXJ5RWRpdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMDdiYjA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9MaWJyYXJ5RWRpdFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIExpYnJhcnkgRWRpdCBwbHVnLWluIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlFZGl0UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgTGlicmFyeUVkaXRQbHVnaW4gcGx1Z2luOwotCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5RWRpdFBsdWdpbiBJTlNUQU5DRTsKLQotCS8vIFRoZSBzaGFyZWQgaW1hZ2UgaGFzaCBtYXAuCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIHNoYXJlZEltYWdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5RWRpdFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5jb3JlLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5jb3JlLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpYnJhcnlFZGl0UGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5RWRpdFBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3ltYm9saWMgbmFtZSBvZiB0aGlzIHBsdWctaW4uCi0JICogCi0JICogQHJldHVybiBUaGUgc3ltYm9saWMgbmFtZSBvZiB0aGlzIHBsdWctaW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeW1ib2xpY05hbWUoKSB7Ci0JCXJldHVybiBnZXRJZCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jZ2V0SW1hZ2UoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRTaGFyZWRJbWFnZShyZWxhdGl2ZVBhdGggKyAiLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNnZXRTaGFyZWRJbWFnZShTdHJpbmcpCi0JICovCi0JcHVibGljIEltYWdlIGdldFNoYXJlZEltYWdlKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFNoYXJlZEltYWdlKHJlbGF0aXZlUGF0aCArICIuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGdpdmVuIHRoZSBVUkkuCi0JICogCi0JICogQHBhcmFtIGltYWdlVVJJCi0JICogICAgICAgICAgICBUaGUgaW1hZ2UncyBVUkkuCi0JICogQHJldHVybiBUaGUgaW1hZ2UgZGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihVUkkgaW1hZ2VVUkkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSSS50b1VSTCgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGltYWdlIGdpdmVuIHRoZSBVUkkuCi0JICogCi0JICogQHBhcmFtIGltYWdlVVJJCi0JICogICAgICAgICAgICBUaGUgaW1hZ2UncyBVUkkuCi0JICogQHJldHVybiBUaGUgaW1hZ2UuCi0JICovCi0JcHVibGljIEltYWdlIGdldFNoYXJlZEltYWdlKFVSSSBpbWFnZVVSSSkgewotCQlpZiAoaW1hZ2VVUkkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIHNoYXJlZEltYWdlcy5nZXQoaW1hZ2VVUkkpOwotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIGltYWdlOwotCQl9Ci0KLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihpbWFnZVVSSSk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoZmFsc2UpOwotCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQlzaGFyZWRJbWFnZXMucHV0KGltYWdlVVJJLCBpbWFnZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gb2JqZWN0IG9yIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgbG9nKE9iamVjdCBsb2dFbnRyeSkgewotCQlpZiAobG9nRW50cnkgaW5zdGFuY2VvZiBUaHJvd2FibGUpIHsKLQkJCSgoVGhyb3dhYmxlKSBsb2dFbnRyeSkucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGxvZ0VudHJ5KTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9MaWJyYXJ5RWRpdFJlc291cmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0xpYnJhcnlFZGl0UmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViMzZkMTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0xpYnJhcnlFZGl0UmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIExpYnJhcnkgRWRpdCBtZXNzYWdlIHJlc291cmNlIGJ1bmRsZSBhY2Nlc3NvciBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMaWJyYXJ5RWRpdFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cxOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbm5vdF9jb3B5X29yX2V4dGVuZF9kZWxpdmVyeV9wcm9jZXNzOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhcmlhYmlsaXR5X2Vycm9yX21zZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaXJjdWxhcl9kZXBlbmRlbmN5X2Vycm9yX21zZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YXJpYWJpbGl0eV9lbGVtZW50X2NpcmN1bGFyX2xvb3BfZXJyb3JfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nICByZXBsYWNpbmdfYW5jZXN0b3JfZXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwbHlfcGF0dGVybl9lcnJvcl9tc2cxOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHVwbGljYXRlRmVhdHVyZVZhbHVlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZV9tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weWluZ0FjdGl2aXRpZXNfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWVwQ29weV9wcm9tcHRNc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWVwQ29weV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX2Nhbm5vdFJlbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZVJlZmVyZW5jZXNEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdQcm9jZXNzQ29tcG9uZW50RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0Q29uZmlnTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VQcm9jZXNzTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VkT25Qcm9jZXNzZXNMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0QXNzb2NpYXRpb25MYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlQXNzb2NpYXRpb25EaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFRlYW1zRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0VGVhbXNEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tTZWxlY3Rpb25EaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0aXRsZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW1wdHlFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZzI7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZEVsZW1lbnROYW1lRXJyb3IxX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRFbGVtZW50TmFtZUVycm9yMl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkRWxlbWVudE5hbWVFcnJvcjNfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm9Db25maWdFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub0RlbGl2ZXJ5UHJvY2Vzc0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vRGVmYXVsdENvbmZpZ0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vQmFzZVByb2Nlc3NFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVQcm9jZXNzRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlRWxlbWVudEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZUVsZW1lbnRFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3Jfc2ltcGxlX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZG9Db21tYW5kRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFByZWRlY2Vzc29yRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBkYXRlX291dG9mc3luY2hfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBkYXRlX291dG9mc3luY2hfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JfbXNnV2l0aERldGFpbHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdXBwcmVzc2lvbl9uYW1lRHVwbGljYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdXBwcmVzc2lvbl9wcmVzZW50YXRpb25OYW1lRHVwbGljYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlUHJvY2Vzc0Vycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZVJlZmVyZW5jZXNFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlRmlsZUVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRSZWZlcmVuY2VzRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5yZXNvbHZlZE9iamVjdEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURyb3BDb21tYW5kX2RlZXBDb3B5X3Byb21wdENvbmZpZ3VyYXRpb25Nc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGluZ1Byb2Nlc3NDb21wb25lbnRUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzaW5nUmVmZXJlbmNlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0aW5nRWxlbWVudHNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja2luZ1JlZmVyZW5jZXNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmluZ1JlZmVyZW5jZXN0YXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tBZmZlY3RlZFJlc291cmNlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmluZ1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmluZ0ZpbGVzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weWluZ1Jlc291cmNlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmluZ0ZpbGVUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVFbGVtZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVQcm9jZXNzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250cmlidXRlc1RvX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhbENvbnRyaWJ1dGVzVG9fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVuZHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhbFJlcGxhY2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50VHlwZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250cmlidXRlVG9BY3Rpdml0eV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEcm9wQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VBY3Rpdml0eV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlyZWN0b3J5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bnJlc29sdmVkX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhc3Npc3RzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmtub3duX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21tYW5kX2RvbmU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eXdpdGhwbHVnaW5faW5mbzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5X2luZm87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV9yZWZfZGVsZXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfcmVmX2RlbGV0ZTI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV9yZWZlcmVuY2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfd29ya3Byb2R1Y3RfZGVzY3JpcHRvcl9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vcHRpb25zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX291dHB1dGxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX2RlbGV0ZV90YXNrOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfVXNlckludGVyYWN0aW9uSGVscGVyX2RlZmF1bHRjb25maWdjaGVjazsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9nZW5lcmljRXJyX21lc3NhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fbm9EZXNjcmlwdG9yVG9TeW5jaDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3JlZmVyc2hpbmd2aWV3ZXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maXJtX3JlbW92ZV9yZWZlcmVuY2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl91bmhhbmRsZWRfZXhjZXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9icmVha2Rvd25fZWxlbWVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93cGxpc3RkbGdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3JvbGVsaXN0ZGxnX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX2ZhdGFsZXJyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dvcmtwcm9kdWN0czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfc3ViX2VsZW1lbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX1Byb2Nlc3NVdGlsX2Vycl93cm9uZ19lbGVtZW50OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF9Qcm9jZXNzVXRpbF9lcnJfY2hpbGRfZWxlbWVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl90YXNrczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX2Fzc29jaWF0aW9uX3Rhc2tfc2VsZWN0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF9Qcm9jZXNzVXRpbF9jaGlsZGFkYXB0ZXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX1Byb2Nlc3NVdGlsX2Vycl9zZXRwYXJlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX3RuZ3V0aWxfY2Fubm90X2VkaXRfcmVzb3VyY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX1Byb2Nlc3NVdGlsX2NvbnRyaWJ1dGVzdG87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX1Byb2Nlc3NVdGlsX2xvY2FsQ29udHJpYnV0ZXN0bzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NfZXh0ZW5kczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NfcmVwbGFjZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzX2xvY2FsUmVwbGFjZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lZ3JvdXBpbmdzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfd2hpdGVwYXBlcnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c190b29sbWVudG9yc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3Rvb2xzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfcm9sZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c190YXNrc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3JldXNhYmxlYXNzZXRzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfYWxsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfcHJvY2Vzc2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfcHJhY3RpY2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfdGVtcGxhdGVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfY2hlY2tsaXN0c190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2d1aWRlbGluZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19yb2xlc2V0c190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2d1aWRhbmNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfY29uY2VwdHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19leGFtcGxlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRwYWNrYWdlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3JvbGVkZXNjcmlwdG9yc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRncm9wdWluZ3NfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c190YXNrZGVzY3JpcHRvcnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19jb250ZW50ZWxlbWVudHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fcHJlcGFyZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdGRlc2NyaXB0b3JzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfYWxsY29udGVudGVsZW1lbnRzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfc3VwcG9ydGluZ21hdGVyaWFsc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfZXJyb3JTYXZpbmdGaWxlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19jdXN0b21jYXRlZ29yaWVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3R0eXBlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRfd2FybmluZ01zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19tZXRob2RwbHVnaW5zX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VySW50ZXJhY3Rpb25IZWxwZXJfbG9ja2VkUGx1Z2luOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2RvbWFpbnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19yb2FkbWFwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfcmVwb3J0c190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b1N5bmNocm9uaXplQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbnVhbFN5bmNocm9uaXplQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfc3VjZXNzZnVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bmNocm9uaXplQ29tcGxldGVEaWFsb2dfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VySW50ZXJhY3Rpb25IZWxwZXJfUHJvY2Vzc1BhY2thZ2VfTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0VsZW1lbnRfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZF9NZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU29ydFR5cGVfTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0VHlwZV9NYW51YWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0VHlwZV9BbHBoYWJldGljOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvcnRUeXBlX1JldmVyc2VBbHBoYWJldGljOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvcnRUeXBlX01ldGhvZFR5cGU7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9QbHVnaW5VSVBhY2thZ2VDb250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YzcyZWE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9QbHVnaW5VSVBhY2thZ2VDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi0vKioKLSAqIFN0b3JlcyAoaW4gbWVtb3J5IG9ubHkpIHRoZSBGbGF0L0hpZXJhcmNoaWNhbCBwbHVnaW4tcGFja2FnZSBsYXlvdXQKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpblVJUGFja2FnZUNvbnRleHQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGx1Z2luVUlQYWNrYWdlQ29udGV4dCBJTlNUQU5DRSA9IG5ldyBQbHVnaW5VSVBhY2thZ2VDb250ZXh0KCk7IAotCi0JcHJpdmF0ZSBib29sZWFuIGlzRmxhdExheW91dCA9IGZhbHNlOwotCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSElFUkFSQ0hJQ0FMX0xBWU9VVD0gMHgxOwotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQVRfTEFZT1VUPSAweDI7Ci0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZsYXRMYXlvdXQoKSB7Ci0JCXJldHVybiBpc0ZsYXRMYXlvdXQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRvZ2dsZUxheW91dCgpIHsKLQkJaXNGbGF0TGF5b3V0ID0gIWlzRmxhdExheW91dDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUHJlc2VudGF0aW9uQ29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1ByZXNlbnRhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODIzZjliMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUHJlc2VudGF0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnMuVHlwZUNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgNywgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByZXNlbnRhdGlvbkNvbnRleHQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlc2VudGF0aW9uQ29udGV4dCBJTlNUQU5DRSA9IG5ldyBQcmVzZW50YXRpb25Db250ZXh0KCk7IAotCi0JcHJpdmF0ZSBib29sZWFuIHNob3dQcmVzZW50YXRpb25OYW1lcyA9IGZhbHNlOwotCXByaXZhdGUgQ29tcGFyYXRvciBjb21wYXJhdG9yID0gQ29tcGFyYXRvcnMuREVGQVVMVF9DT01QQVJBVE9SOwotCXByaXZhdGUgQ29tcGFyYXRvciByZXZlcnNlQ29tcGFyYXRvciA9IENvbXBhcmF0b3JzLlJFVkVSU0VfREVGQVVMVF9DT01QQVJBVE9SOwotCXByaXZhdGUgQ29tcGFyYXRvciBtZXRob2RFbGVtZW50VHlwZUNvbXBhcmF0b3IgPSBDb21wYXJhdG9ycy5NRVRIT0RfVFlQRV9DT01QQVJBVE9SOwotCQotCQotCXByaXZhdGUgQ29tcGFyYXRvciBndWlkYW5jZVR5cGVDb21wYXJhdG9yID0gbmV3IFR5cGVDb21wYXJhdG9yKCkgewotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzLlR5cGVDb21wYXJhdG9yI2dldERlZmF1bHRDb21wYXJhdG9yKCkKLQkJICovCi0JCXByb3RlY3RlZCBDb21wYXJhdG9yIGdldERlZmF1bHRDb21wYXJhdG9yKCkgewotCQkJcmV0dXJuIGNvbXBhcmF0b3I7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgaW50IGdldE9yZGVySWQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJaW50IGlkID0gKChHdWlkYW5jZSkgb2JqKS5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKTsKLQkJCQlpZiAoaWQgPT0gVW1hUGFja2FnZS5URVJNX0RFRklOSVRJT04pIHsKLQkJCQkJaWQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGlkOwotCQkJfQotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgQ29tcGFyYXRvciBwcm9jZXNzUGFja2FnZUNvbXBhcmF0b3IgPSBuZXcgVHlwZUNvbXBhcmF0b3IoKSB7Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnMuVHlwZUNvbXBhcmF0b3IjZ2V0RGVmYXVsdENvbXBhcmF0b3IoKQotCQkgKi8KLQkJcHJvdGVjdGVkIENvbXBhcmF0b3IgZ2V0RGVmYXVsdENvbXBhcmF0b3IoKSB7Ci0JCQlyZXR1cm4gY29tcGFyYXRvcjsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIGludCBnZXRPcmRlcklkKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfTsKLQotCi0JCi0JcHJpdmF0ZSBQcmVzZW50YXRpb25Db250ZXh0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2hvd1ByZXNlbnRhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gc2hvd1ByZXNlbnRhdGlvbk5hbWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNob3dQcmVzZW50YXRpb25OYW1lcyhib29sZWFuIHNob3dQcmVzZW50YXRpb25OYW1lcykgewotCQl0aGlzLnNob3dQcmVzZW50YXRpb25OYW1lcyA9IHNob3dQcmVzZW50YXRpb25OYW1lczsKLQkJY29tcGFyYXRvciA9IHNob3dQcmVzZW50YXRpb25OYW1lcyA/IENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IgOiBDb21wYXJhdG9ycy5ERUZBVUxUX0NPTVBBUkFUT1I7Ci0JCXJldmVyc2VDb21wYXJhdG9yID0gc2hvd1ByZXNlbnRhdGlvbk5hbWVzID8gQ29tcGFyYXRvcnMuUkVWRVJTRV9QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SIDogQ29tcGFyYXRvcnMuUkVWRVJTRV9ERUZBVUxUX0NPTVBBUkFUT1I7Ci0JCW1ldGhvZEVsZW1lbnRUeXBlQ29tcGFyYXRvciA9IHNob3dQcmVzZW50YXRpb25OYW1lcyA/IENvbXBhcmF0b3JzLk1FVEhPRF9UWVBFX1BSRVNfTkFNRV9DT01QQVJBVE9SIDogQ29tcGFyYXRvcnMuTUVUSE9EX1RZUEVfQ09NUEFSQVRPUjsKLQl9Ci0KLQlwdWJsaWMgQ29tcGFyYXRvciBnZXRDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gY29tcGFyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgQ29tcGFyYXRvciBnZXRSZXZlcnNlQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIHJldmVyc2VDb21wYXJhdG9yOwotCX0KLQotCXB1YmxpYyBDb21wYXJhdG9yIGdldEd1aWRhbmNlVHlwZUNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBndWlkYW5jZVR5cGVDb21wYXJhdG9yOwotCX0KLQotCXB1YmxpYyBDb21wYXJhdG9yIGdldFByb2Nlc3NQYWNrYWdlQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIHByb2Nlc3NQYWNrYWdlQ29tcGFyYXRvcjsKLQl9Ci0JCi0JcHVibGljIENvbXBhcmF0b3IgZ2V0TWV0aG9kRWxlbWVudFR5cGVDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudFR5cGVDb21wYXJhdG9yOwotCX0KLQkKLQlwdWJsaWMgQ29tcGFyYXRvciBnZXRQcmVzTmFtZUNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SOwotCX0KLQotCXB1YmxpYyBDb21wYXJhdG9yIGdldFByZXNOYW1lUmV2ZXJzZUNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBDb21wYXJhdG9ycy5SRVZFUlNFX1BSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1I7Ci0JfQotCQotCXB1YmxpYyBDb21wYXJhdG9yIGdldFByZXNOYW1lTWV0aG9kRWxlbWVudFR5cGVDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gQ29tcGFyYXRvcnMuTUVUSE9EX1RZUEVfUFJFU19OQU1FX0NPTVBBUkFUT1I7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUHJvdmlkZXJzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUHJvdmlkZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY5MzAwNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Byb3ZpZGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvdmlkZXJzIHsKLQotCXByaXZhdGUgc3RhdGljIElDb25maWd1cmF0b3JGYWN0b3J5IGNvbmZpZ3VyYXRvckZhY3Rvcnk7Ci0KLQlwcml2YXRlIHN0YXRpYyBJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlndXJhdGlvbkFwcGxpY2F0b3I7Ci0KLQlwcml2YXRlIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlIHByZWZlcmVuY2VTdG9yZTsKLQotCXByaXZhdGUgc3RhdGljIEFic3RyYWN0UGx1Z2luIGF1dGhvcmluZ1BsdWdpbjsKLQotCXByaXZhdGUgc3RhdGljIE1hcCBjb21tYW5kVHlwZVRvTGlzdGVuZXJzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgUHJvdmlkZXJzKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUNvbmZpZ3VyYXRvckZhY3RvcnkgZ2V0Q29uZmlndXJhdG9yRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyYXRvckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENvbmZpZ3VyYXRvckZhY3RvcnkoCi0JCQlJQ29uZmlndXJhdG9yRmFjdG9yeSBjb25maWd1cmF0b3JGYWN0b3J5KSB7Ci0JCVByb3ZpZGVycy5jb25maWd1cmF0b3JGYWN0b3J5ID0gY29uZmlndXJhdG9yRmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElDb25maWd1cmF0aW9uQXBwbGljYXRvciBnZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigKLQkJCUlDb25maWd1cmF0aW9uQXBwbGljYXRvciBjb25maWd1cmF0aW9uQXBwbGljYXRvcikgewotCQlQcm92aWRlcnMuY29uZmlndXJhdGlvbkFwcGxpY2F0b3IgPSBjb25maWd1cmF0aW9uQXBwbGljYXRvcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gcHJlZmVyZW5jZVN0b3JlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcmVmZXJlbmNlU3RvcmUoSVByZWZlcmVuY2VTdG9yZSBwcmVmZXJlbmNlU3RvcmUpIHsKLQkJUHJvdmlkZXJzLnByZWZlcmVuY2VTdG9yZSA9IHByZWZlcmVuY2VTdG9yZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFic3RyYWN0UGx1Z2luIGdldEF1dGhvcmluZ1BsdWdpbigpIHsKLQkJcmV0dXJuIGF1dGhvcmluZ1BsdWdpbjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QXV0aG9yaW5nUGx1Z2luKEFic3RyYWN0UGx1Z2luIHBsdWdpbikgewotCQlhdXRob3JpbmdQbHVnaW4gPSBwbHVnaW47Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyQ29tbWFuZExpc3RlbmVyKElDb21tYW5kTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJTGlzdCBsaXN0ZW5lcnMgPSAoTGlzdCkgY29tbWFuZFR5cGVUb0xpc3RlbmVyc01hcC5nZXQobGlzdGVuZXIKLQkJCQkuZ2V0Q29tbWFuZFR5cGUoKSk7Ci0JCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY29tbWFuZFR5cGVUb0xpc3RlbmVyc01hcC5wdXQobGlzdGVuZXIuZ2V0Q29tbWFuZFR5cGUoKSwgbGlzdGVuZXJzKTsKLQkJfSBlbHNlIGlmIChsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUNvbW1hbmRMaXN0ZW5lcihJQ29tbWFuZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCUxpc3QgbGlzdGVuZXJzID0gKExpc3QpIGNvbW1hbmRUeXBlVG9MaXN0ZW5lcnNNYXAuZ2V0KGxpc3RlbmVyCi0JCQkJLmdldENvbW1hbmRUeXBlKCkpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQkJaWYgKGxpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCQljb21tYW5kVHlwZVRvTGlzdGVuZXJzTWFwLnJlbW92ZShsaXN0ZW5lci5nZXRDb21tYW5kVHlwZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDb21tYW5kTGlzdGVuZXJzKENsYXNzIGNvbW1hbmRUeXBlKSB7Ci0JCXJldHVybiAoTGlzdCkgY29tbWFuZFR5cGVUb0xpc3RlbmVyc01hcC5nZXQoY29tbWFuZFR5cGUpOwotCX0KLQotCXN0YXRpYyB7Ci0JCS8vIHJlZ2lzdGVyIGNvbW1hbmQgbGlzdGVuZXJzIHRoYXQgaGF2ZSBiZWVuIGNvbnRyaWJ1dGVkIHZpYSBleHRlbnNpb24gcG9pbnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kTGlzdGVuZXJzCi0JCS8vCi0JCXRyeSB7Ci0JCQlTdHJpbmcgbmFtZXNwYWNlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCk7Ci0JCQlTdHJpbmcgZXh0ZW5zaW9uUG9pbnROYW1lID0gImNvbW1hbmRMaXN0ZW5lcnMiOyAvLyROT04tTkxTLTEkCi0JCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQobmFtZXNwYWNlLCBleHRlbnNpb25Qb2ludE5hbWUpOwotCQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZihjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCQkJCQlPYmplY3QgZXh0ID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQkJCQkJCWlmKGV4dCBpbnN0YW5jZW9mIElDb21tYW5kTGlzdGVuZXIpIHsKLQkJCQkJCQkJCXJlZ2lzdGVyQ29tbWFuZExpc3RlbmVyKChJQ29tbWFuZExpc3RlbmVyKSBleHQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMGNhNzM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIEdlbmVyaWMgRGlhbG9nIFRpdGxlcwotbW92ZURpYWxvZ190aXRsZT1Nb3ZlCi1kZWxldGVEaWFsb2dfdGl0bGU9RGVsZXRlIEVsZW1lbnQKLWVycm9yRGlhbG9nX3RpdGxlPUVycm9yCi1lcnJvckRpYWxvZ19jYW5ub3RSZW5hbWU9Q2Fubm90IHJlbmFtZSB7MH0gJyd7MX0nJyB0byAnJ3syfScnLiBSZXNvbHZlIHRoZSBpc3N1ZSBzaG93biBpbiBEZXRhaWxzIGFuZCBjbGljayBPSyB0byBjb250aW51ZSBvciBDYW5jZWwgdG8gYWJvcnQgdGhpcyBvcGVyYXRpb24uCi0KLSMgQ29uZmlybSBSZWZlcmVuY2VzIFJlbW92YWwgRGlhbG9nCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RpdGxlPUNvbmZpcm0gUmVmZXJlbmNlcyBSZW1vdmFsCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RleHQ9VGhlIGVsZW1lbnQocykgeW91IGFyZSBhYm91dCB0byBkZWxldGUgYXJlIHN0aWxsIGJlaW5nIHJlZmVyZW5jZWQgYnkgb3RoZXIgZWxlbWVudHMgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5LiBEZWxldGluZyB0aGVzZSBlbGVtZW50cyB3aWxsIHJlbW92ZSByZWZlcmVuY2VzIHRvIHRoZW0sIHRoZXJlZm9yZSwgd2lsbCB1cGRhdGUgdGhlIHJlZmVycmluZyBlbGVtZW50cyBhcyB3ZWxsLiAgTWFrZSBzdXJlIHlvdSBoYXZlIHBlcm1pc3Npb24gdG8gdXBkYXRlIHRoZSByZWZlcnJpbmcgZWxlbWVudHMgYmVmb3JlIGNsaWNraW5nIE9LLiAgQ2xpY2sgRGV0YWlscyB0byByZXZpZXcgdGhlIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCByZWZlcmVuY2UgdGhlIGVsZW1lbnQocykgdGhhdCB5b3UgYXJlIGFib3V0IHRvIGRlbGV0ZS4KLQotIyBSZXNvbHZlIE5hbWUgQ29uZmxpY3QgRGlhbG9nCi1yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RpdGxlPVJlc29sdmUgRWxlbWVudCBOYW1lIENvbmZsaWN0Ci1yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RleHQ9RW50ZXIgYSBuZXcgezB9IGZvciAnJ3sxfScnOgotCi0jIFNlbGVjdCBEZWxpdmVyYWJsZXMgRGlhbG9nCi1zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGl0bGU9U2VsZWN0IERlbGl2ZXJhYmxlcwotc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RleHQ9U2VsZWN0IGEgZGVsaXZlcmFibGUgd2hlcmUgeW91IHdhbnQgd29yayBwcm9kdWN0ICcnezB9JycgdG8gYmUgYXNzaWduZWQuCi0KLSMgTmV3IFByb2Nlc3MgQ29tcG9uZW50IERpYWxvZwotbmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZ190aXRsZT1OZXcgUHJvY2VzcyBDb21wb25lbnQKLW5hbWVMYWJlbF90ZXh0PU5hbWU6Ci1kZWZhdWx0Q29uZmlnTGFiZWxfdGV4dD1EZWZhdWx0IENvbmZpZ3VyYXRpb246Ci1iYXNlUHJvY2Vzc0xhYmVsX3RleHQ9QmFzZSBQcm9jZXNzOgotYmFzZWRPblByb2Nlc3Nlc0xhYmVsX3RleHQ9QmFzZWQgb24gUHJvY2Vzc2VzOgotCi0jIFJvbGUgQXNzb2NpYXRpb24gRGlhbG9nCi1zZWxlY3RBc3NvY2lhdGlvbkxhYmVsX3RleHQ9U2VsZWN0IGFzc29jaWF0aW9uIGZvciB0aGUgdGFzayAnJ3swfScnCi0KLSMgUmVtb3ZlIEFzc29jaWF0aW9uIGRpYWxvZwotcmVtb3ZlQXNzb2NpYXRpb25EaWFsb2dfdGV4dD1SZW1vdmUgQXNzb2NpYXRpb24KLQotIyBTZWxlY3QgVGVhbXMgRGlhbG9nCi1zZWxlY3RUZWFtc0RpYWxvZ190aXRsZT1TZWxlY3QgVGVhbXMKLXNlbGVjdFRlYW1zRGlhbG9nX3RleHQ9U2VsZWN0IGEgdGVhbSB3aGVyZSB5b3Ugd2FudCBhIHJvbGUgJyd7MH0nJyB0byBiZSBhc3NpZ25lZC4KLQotIyBUYXNsIFNlbGVjdGlvbiBEaWFsb2cKLXRhc2tTZWxlY3Rpb25EaWFsb2dfdGl0bGU9VGFzayBTZWxlY3Rpb24KLXRpdGxlTGFiZWxfdGV4dD1TZWxlY3QgdGFza3MuLgotCi0jIEVycm9yIE1lc3NhZ2VzCi1lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEwwMTAwRTogVGhlIHswfSBuYW1lIGlzIG1pc3NpbmcuXG5cbkFsbCBtZXRob2QgYW5kIHByb2Nlc3MgZWxlbWVudHMgbXVzdCBoYXZlIGEgbmFtZS5cblxuRW50ZXIgYSB2YWxpZCBuYW1lIGFuZCB0cnkgYWdhaW4uCi1lbXB0eUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZz1UaGUgbmFtZSBjYW5ub3QgYmUgZW1wdHkuIFBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgbmFtZS4KLWR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEwwMTAxRTogVGhlIG5hbWUgJyd7MH0nJyBhbHJlYWR5IGV4aXN0cy4gXG5cbkEgbWV0aG9kIGVsZW1lbnQgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUuXG5cbkVudGVyIGEgZGlmZmVyZW50IG5hbWUgYW5kIHRyeSBhZ2Fpbi4KLWR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnMj1FbnRlciBhIGRpZmZlcmVudCBuYW1lIGFuZCB0cnkgYWdhaW4uCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c9VGhlIHNhbWUgZWxlbWVudCBuYW1lIGFscmVhZHkgZXhpdHMuIFBsZWFzZSBzcGVjaWZ5IGFub3RoZXIgbmFtZS4KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMV9tc2c9SVVQTDAxMDJFOiBUaGUgbmFtZSAnJ3swfScnIGlzIGludmFsaWQuXG5cbkEgbWV0aG9kIGVsZW1lbnQgbmFtZSBjYW5ub3Qgc3RhcnQgd2l0aCBhIHNwYWNlLlxuXG5FbnRlciBhIHZhbGlkIG5hbWUgYW5kIHRyeSBhZ2Fpbi4KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMl9tc2c9SVVQTDAxMDNFOiBUaGUgbmFtZSAnJ3swfScnIGlzIGludmFsaWQuXG5cbkEgbWV0aG9kIGVsZW1lbnQgbmFtZSBjYW5ub3QgZW5kIHdpdGggYSBwZXJpb2QuXG5cbkVudGVyIGEgdmFsaWQgbmFtZSBhbmQgdHJ5IGFnYWluLgotaW52YWxpZEVsZW1lbnROYW1lRXJyb3IzX21zZz1JVVBMMDEwNEU6IFRoZSBuYW1lICcnezB9JycgaXMgaW52YWxpZC5cblxuQSBtZXRob2QgZWxlbWVudCBuYW1lIGNhbm5vdCBjb250YWluIHRoZXNlIGNoYXJhY3RlcnM6IFxcIC8gOiAqID8gJiAiIDwgPiA7IHxcblxuRW50ZXIgYSB2YWxpZCBuYW1lIGFuZCB0cnkgYWdhaW4uCi1ub0NvbmZpZ0Vycm9yX21zZz1JVVBMMDEwNUU6IFRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IGRvZXMgbm90IGNvbnRhaW4gYW55IG1ldGhvZCBjb25maWd1cmF0aW9uLlxuXG5BIG1ldGhvZCBjb25maWd1cmF0aW9uIGlzIG5lZWRlZCB0byBjcmVhdGUgYSBuZXcgcHJvY2Vzcy5cblxuQ3JlYXRlIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gYW5kIHRyeSBhZ2Fpbi4KLW5vRGVsaXZlcnlQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA2RTogVGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgZG9lcyBub3QgY29udGFpbiBhbnkgZGVsaXZlcnkgcHJvY2Vzcy5cblxuQSBiYXNlIGRlbGl2ZXJ5IHByb2Nlc3MgaXMgbmVlZGVkIHRvIGNyZWF0ZSBhIG5ldyBwcm9jZXNzIGNvbnRyaWJ1dGlvbi5cblxuQ3JlYXRlIGEgZGVsaXZlcnkgcHJvY2VzcyBhbmQgdHJ5IGFnYWluLgotbm9EZWZhdWx0Q29uZmlnRXJyb3JfbXNnPUlVUEwwMTA3RTogTm8gbWV0aG9kIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gc2VsZWN0ZWQuXG5cbkEgZGVmYXVsdCBtZXRob2QgY29uZmlndXJhdGlvbiBtdXN0IGJlIGFzc2lnbmVkIHRvIHRoZSBuZXcgcHJvY2Vzcy5cblxuU2VsZWN0IGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gYW5kIHRyeSBhZ2Fpbi4KLW5vQmFzZVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDhFOiBObyBkZWxpdmVyeSBwcm9jZXNzIGhhcyBiZWVuIHNlbGVjdGVkLlxuXG5BIHByb2Nlc3MgY29udHJpYnV0aW9uIHJlcXVpcmVzIGEgYmFzZSBkZWxpdmVyeSBwcm9jZXNzLlxuXG5TZWxlY3QgYSBkZWxpdmVyeSBwcm9jZXNzIGFuZCB0cnkgYWdhaW4uCi1jcmVhdGVQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA5RTogVGhlIHByb2Nlc3MgY2Fubm90IGJlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgotY3JlYXRlRWxlbWVudEVycm9yX21zZz1JVVBMMDExMEU6IFRoZSBlbGVtZW50IGNhbm5vdCBiZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KLWRlbGV0ZUVsZW1lbnRFcnJvcl9tc2c9SVVQTDAxMTFFOiBUaGUgZWxlbWVudCBjYW5ub3QgYmUgZGVsZXRlZCBzdWNjZXNzZnVsbHkuCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX21zZz1JVVBMMDExMkU6IFRoZSBjb250ZW50IGZpbGUgZm9yIHRoZSBlbGVtZW50IGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlbmFtZWQgdG8gbWF0Y2ggdGhlIGVsZW1lbnQgbmFtZS5cblxuQSBmaWxlICcnezB9JycgYWxyZWFkeSBleGlzdHMuXG5cbkVudGVyIGEgZGlmZmVyZW50IG5hbWUgYW5kIHRyeSBhZ2Fpbi4KLWR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3Jfc2ltcGxlX21zZz1BIGNvbnRlbnQgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgZXhpdHMuIFBsZWFzZSBzcGVjaWZ5IGFub3RoZXIgbmFtZS4KLXVuZG9Db21tYW5kRXJyb3JfbXNnPUlVUEwwMTEzRTogVGhlIHVuZG8gY29tbWFuZCAnJ3swfScnIGNhbm5vdCBiZSBjb21wbGV0ZWQuXG5cbkFuIGVycm9yIGhhcyBvY2N1cnJlZDogezF9Ci1pbnZhbGlkUHJlZGVjZXNzb3JFcnJvcl9tc2c9SVVQTDAxMTRFOiBUaGUgc3BlY2lmaWVkIHByZWRlY2Vzc29yIGluZGV4IGlzIGludmFsaWQuXG5cbkEgcHJlZGVjZXNzb3IgaW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyIHZhbHVlIGZyb20gdGhlICdJbmRleCcgY29sdW1uLlxuXG5TcGVjaWZ5IGEgdmFsaWQgdmFsdWUgYW5kIHRyeSBhZ2Fpbi4KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHM9SVVQTDAxMDBXOiAnJ3swfScnIGlzIGFscmVhZHkgYXNzb2NpYXRlZCB0byAnJ3sxfScnLiAgT25seSBvbmUgYXNzb2NpYXRpb24gb2YgdGhpcyBraW5kIGlzIGFsbG93ZWQuICBUbyBhc3NpZ24gJyd7MH0nJyB0byAnJ3syfScnIHlvdSBuZWVkIHRvIGZpcnN0IHJlbW92ZSBpdCBmcm9tICcnezF9JycuCi1lcnJvcl9tc2dXaXRoRGV0YWlscz1JVVBMMDExNkU6IEFuIGVycm9yIGhhcyBvY2N1cnJlZC4gQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLWVycm9yX21zZz1JVVBMMDExN0U6IEFuIGVycm9yIGhhcyBvY2N1cnJlZC4gU2VlIGVycm9yIGxvZyBmb3IgbW9yZSBkZXRhaWxzLgotU3VwcHJlc3Npb25fbmFtZUR1cGxpY2F0aW9uPUlVUEwwMTE4RTogTmFtZSBjb25mbGljdCB3aWxsIG9jY3VyIGFmdGVyIHRoaXMgb3BlcmF0aW9uLiBDaGVjayBlbGVtZW50J3MgbmFtZSBmb3IgZHVwbGljYXRpb24gYW5kIHRyeSBhZ2FpbgotU3VwcHJlc3Npb25fcHJlc2VudGF0aW9uTmFtZUR1cGxpY2F0aW9uPUlVUEwwMTE5RTogTmFtZSBjb25mbGljdCB3aWxsIG9jY3VyIGFmdGVyIHRoaXMgb3BlcmF0aW9uLiBDaGVjayBlbGVtZW50J3MgcHJlc2VudGF0aW9uIG5hbWUgZm9yIGR1cGxpY2F0aW9uIGFuZCB0cnkgYWdhaW4KLQotIyBFcnJvciBSZWFzb25zCi1lcnJvcl9yZWFzb249QW4gZXJyb3IgaGFzIG9jY3VycmVkLiBDbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotc2F2ZVByb2Nlc3NFcnJvcl9yZWFzb249QW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIHNhdmluZyB0aGUgcHJvY2VzcyAnJ3swfScnLiBDbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotZGVsZXRlUmVmZXJlbmNlc0Vycm9yX3JlYXNvbj1BbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hpbGUgcmVtb3ZpbmcgcmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbGVtZW50LiBDbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotc2F2ZUZpbGVFcnJvcl9yZWFzb249QW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIHNhdmluZyB0aGUgZmlsZSAnJ3swfScnLiBDbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotaW52YWxpZFJlZmVyZW5jZXNFcnJvcl9yZWFzb249RGV0ZWN0ZWQgbWV0aG9kIGVsZW1lbnRzIHdpdGggaW52YWxpZCByZWZlcmVuY2VzIGFzIGEgcmVzdWx0IG9mIGNyb3NzLXBsdWdpbiBjb3B5LlxuVGhlc2UgcmVmZXJlbmNlcyB3aWxsIGJlIHJlbW92ZWQuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotdW5yZXNvbHZlZE9iamVjdEVycm9yX3JlYXNvbj1DYW5ub3QgbW9kaWZ5IGFuIHVucmVzb2x2ZWQgb2JqZWN0OiB7MH0oVVJJID0gezF9KXsyfQotCi0jIFdhcm5pbmcgbWVzc2FnZXMKLU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZz1JVVBMMDExOFc6IENvdWxkIG5vdCBmaW5kIG9uZSBvciBtb3JlIHNvdXJjZSBlbGVtZW50cy4gQXNzb2NpYXRlZCBmaWxlcyBpbiB0aGUgcmVzb3VyY2VzIGZvbGRlciB3aWxsIG5vdCBiZSBjb3BpZWQuCi1BY3Rpdml0eUFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE5VzogQ291bGQgbm90IGZpbmQgb25lIG9yIG1vcmUgc291cmNlIGVsZW1lbnRzLiBBc3NvY2lhdGVkIFByb2Nlc3MgUGFja2FnZXMgd2lsbCBub3QgYmUgY29waWVkLgotQWN0aXZpdHlEcm9wQ29tbWFuZF9kZWVwQ29weV9wcm9tcHRDb25maWd1cmF0aW9uTXNnPURvIHlvdSB3YW50IHRvIGNvcHkgYWxsIGRlc2NyaXB0b3JzP1xuXG5DbGlja2luZyBvbiBObyB3aWxsIGNvcHkgb25seSB0aGUgZGVzY3JpcHRvcnMgdGhhdCBhcmUgcGFydCBvZiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotZGVlcENvcHlfcHJvbXB0TXNnPVlvdSB3aWxsIGdldCBhIGNvcHkgb2YgYWxsIGR5bmFtaWNhbGx5IGxpbmtlZCBlbGVtZW50cyB0aGF0IHlvdSBuZWVkIHRvIG1haW50YWluIHNlcGFyYXRlbHkgZnJvbSBub3cgb24uIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotZGVlcENvcHlfdGl0bGU9RGVlcCBDb3B5Ci0KLSMgUHJvZ3Jlc3MgbWVzc2FnZXMKLWNyZWF0aW5nUHJvY2Vzc0NvbXBvbmVudFRhc2tfbmFtZT1DcmVhdGluZyBwcm9jZXNzIGNvbXBvbmVudCAnJ3swfScnLi4uCi1wcm9jZXNzaW5nUmVmZXJlbmNlc1Rhc2tfbmFtZT1Qcm9jZXNzaW5nIHJlZmVyZW5jZXMuLi4KLWRlbGV0aW5nRWxlbWVudHNUYXNrX25hbWU9RGVsZXRpbmcgZWxlbWVudHMgYW5kIGFzc29jaWF0ZWQgZmlsZXMuLi4KLWNoZWNraW5nUmVmZXJlbmNlc1Rhc2tfbmFtZT1DaGVja2luZyBmb3IgcmVmZXJlbmNlcy4uLgotcmVtb3ZpbmdSZWZlcmVuY2VzdGFza19uYW1lPVJlbW92aW5nIHJlZmVyZW5jZXMuLi4KLXNhdmluZ01vZGlmaWVkRmlsZXNUYXNrX25hbWU9U2F2aW5nIG1vZGlmaWVkIGZpbGUocykuLi4KLWNoZWNrQWZmZWN0ZWRSZXNvdXJjZXNUYXNrX25hbWU9Q2hlY2tpbmcgYWZmZWN0ZWQgcmVzb3VyY2VzLi4uCi1tb3ZpbmdUYXNrX25hbWU9TW92aW5nLi4uCi1tb3ZpbmdGaWxlc1Rhc2tfbmFtZT1Nb3ZpbmcgZmlsZXMuLi4KLWNvcHlpbmdSZXNvdXJjZXNUYXNrX25hbWU9Q29weWluZyByZXNvdXJjZXMuLi4KLWNvcHlpbmdBY3Rpdml0aWVzX21zZz1Db3B5aW5nIGFjdGl2aXR5ICcnezB9JycKLXNhdmluZ0ZpbGVUYXNrX25hbWU9U2F2aW5nIGZpbGUgJyd7MH0nJy4uLgotCi0jIFVJIFRleHQKLWVsZW1lbnRfdGV4dD1lbGVtZW50Ci1jcmVhdGVFbGVtZW50X3RleHQ9Q3JlYXRlIEVsZW1lbnQKLWNyZWF0ZVByb2Nlc3NfdGV4dD1DcmVhdGUgUHJvY2VzcwotY29udHJpYnV0ZXNUb190ZXh0PUNvbnRyaWJ1dGVzIHRvCi1sb2NhbENvbnRyaWJ1dGVzVG9fdGV4dD1Mb2NhbGx5IENvbnRyaWJ1dGVzIHRvCi1leHRlbmRzX3RleHQ9RXh0ZW5kcwotcmVwbGFjZXNfdGV4dD1SZXBsYWNlcwotbG9jYWxSZXBsYWNlc190ZXh0PUxvY2FsbHkgUmVwbGFjZXMKLWxvY2FsUmVwbGFjZW1lbnRBbmREZWVwQ29weV90ZXh0PUxvY2FsIFJlcGxhY2VtZW50IGFuZCBEZWVwIENvcCZ5Ci1lbGVtZW50VHlwZV90ZXh0PXswfTogezF9Ci1kZWxpdmVyYWJsZXNfdGV4dD1EZWxpdmVyYWJsZXMKLWNvbnRyaWJ1dGVUb0FjdGl2aXR5X3RleHQ9Q29udHJpYnV0ZSBUbyBBY3Rpdml0eQotQWN0aXZpdHlEcm9wQ29tbWFuZF9sYWJlbD1Ecm9wIEFjdGl2aXR5Ci1yZXBsYWNlQWN0aXZpdHlfdGV4dD1SZXBsYWNlIEFjdGl2aXR5Ci1maWxlX3RleHQ9ZmlsZQotZGlyZWN0b3J5X3RleHQ9ZGlyZWN0b3J5Ci11bnJlc29sdmVkX3RleHQ9KHVucmVzb2x2ZWQgJyd7MH0nJykKLWFzc2lzdHNfdGV4dD1Bc3Npc3RzCi11bmtub3duX3RleHQ9VW5rbm93bgotY29tbWFuZF9kb25lPURvbmUKLQotIyBUaGUgZm9sbG93aW5nIFVJIHRleHQgc2hvdWxkIGJlIHJldmlld2VkLgotVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHl3aXRocGx1Z2luX2luZm89ezB9ICh7MX0gJyd7Mn0nJyBpbiAnJ3szfScnKQotVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHlfaW5mbz17MH0gKHsxfSAnJ3syfScnKQotdWlfcmVmX2RlbGV0ZT1UaGUgZGVzY3JpcHRvciAnJ3swfScnIGhhcyB0aGUgZm9sbG93aW5nIHJlZmVyZW5jZXMgd2hpY2ggYXJlIG5vdCB1c2VkIGFueXdoZXJlLlxuU2VsZWN0IHRoZSBvbmVzIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRvIGRlbGV0ZToKLXVpX3JlZl9kZWxldGUyPVRoZXNlIGZvbGxvd2luZyByZWZlcmVuY2VzIGFyZSBub3QgYmVpbmcgdXNlZCBhbnl3aGVyZS5cblNlbGVjdCB0aGUgb25lcyB3aGljaCB5b3Ugd291bGQgbGlrZSB0byBkZWxldGU6Ci11aV9yZWZlcmVuY2VzPVJlZmVyZW5jZXMKLXVpX3dvcmtwcm9kdWN0X2Rlc2NyaXB0b3JfZGVzY3JpcHRpb249V29yayBwcm9kdWN0IGRlc2NyaXB0b3IgJyd7MH0nJyBpcyBhc3NvY2lhdGVkIChPdXRwdXQgRnJvbSkgd2l0aCB0YXNrIGRlc2NyaXB0b3IgJyd7MX0nJwotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX29wdGlvbnM9T3B0aW9ucwotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX291dHB1dGxhYmVsPVJlbW92ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBhcyBvdXRwdXQgb2YgdGhlIHRhc2sgZGVzY3JpcHRvcgotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX2RlbGV0ZV90YXNrPURlbGV0ZSB0YXNrIGRlc2NyaXB0b3IgZnJvbSB0aGUgYWN0aXZpdHkKLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9kZWZhdWx0Y29uZmlnY2hlY2s9VGhlIHNlbGVjdGVkIGVsZW1lbnQgJyd7MH0nJyBpcyBub3QgaW4gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB5b3VyIHByb2Nlc3MuXG5EbyB5b3Ugd2FudCB0byBhZGQgaXQgYW5kIGl0cyBkZXBlbmRlbmNpZXMgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbj8KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9nZW5lcmljRXJyX21lc3NhZ2VfdGV4dD1FcnJvcnMgb2NjdXJlZCBpbiB0aGUgb3BlcmF0aW9uLiBDbGljayBvbiBkZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uCi1Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uX25vRGVzY3JpcHRvclRvU3luY2g9Tm8gZGVzY3JpcHRvciB3aXRoIGxpbmtlZCBtZXRob2QgZWxlbWVudCBmb3VuZCB0byBzeW5jaHJvbml6ZQotdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfcmVmZXJzaGluZ3ZpZXdlcj1FcnJvciByZWZyZXNoaW5nIHZpZXdlcgotY29uZmlybV9yZW1vdmVfcmVmZXJlbmNlc190ZXh0PUVsZW1lbnQocykgbGlzdGVkIGluIERldGFpbHMgbWlnaHQgaGF2ZSBpbGxlZ2FsIHJlZmVyZW5jZSB0byB0aGlzIGd1aWRhbmNlIGFmdGVyIGNvbnZlcnNpb24uIENsaWNrIE9LIHRvIHJlbW92ZSB0aGVtIGFuZCBjb250aW51ZS4KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3VuaGFuZGxlZF9leGNlcHRpb249VW5oYW5kbGVkIGV4Y2VwdGlvbgotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9icmVha2Rvd25fZWxlbWVudD1DYW5ub3QgaGF2ZSB0aGUgc2FtZSBicmVha2Rvd24gZWxlbWVudCBhcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd3BsaXN0ZGxnX21zZz1UaGUgd29yayBwcm9kdWN0ICcnezB9JycgaXMgYW4gb3V0cHV0IHRvIHRoZSBmb2xsb3dpbmcgdGFza3MuXG5TZWxlY3QgdGhlIHRhc2tzIGZvciB3aGljaCB5b3Ugd291bGQgbGlrZSB0byBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgZGVzY3JpcHRvcnMuCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfcm9sZWxpc3RkbGdfbXNnPVRoZSByb2xlICcnezB9JycgaGFzIHRoZSBmb2xsb3dpbmcgcmVzcG9uc2libGUgd29yayBwcm9kdWN0cy5cblNlbGVjdCB0aGUgd29yayBwcm9kdWN0cyBmb3Igd2hpY2ggeW91IHdvdWxkIGxpa2UgdG8gY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIGRlc2NyaXB0b3JzLgotdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfZmF0YWxlcnI9RmF0YWwgZXJyb3IKLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93b3JrcHJvZHVjdHM9V29yayBQcm9kdWN0cwotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9zdWJfZWxlbWVudD1DYW5ub3QgbGluayBhIGJyZWFrZG93biBlbGVtZW50IHRvIG9uZSBvZiBpdHMgc3ViZWxlbWVudAotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfd3JvbmdfZWxlbWVudD1DYW5ub3QgbGluayB0byBlbGVtZW50IG90aGVyIHRoYW4gd29yayBicmVha2Rvd24gZWxlbWVudC4KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX2NoaWxkX2VsZW1lbnQ9Q2Fubm90IGxpbmsgYSBicmVha2Rvd24gZWxlbWVudCB0byBvbmUgb2YgaXRzIGNoaWxkcmVuLgotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3Rhc2tzPVRhc2tzCi11aV9hc3NvY2lhdGlvbl90YXNrX3NlbGVjdGlvbj1UYXNrIFNlbGVjdGlvbi4uLgotdXRpbF9Qcm9jZXNzVXRpbF9jaGlsZGFkYXB0ZXI9XCBcIGNoaWxkJ3MgYWRhcHRlcjoKLQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2V0cGFyZW50PUNvdWxkIG5vdCBzZXQgcGFyZW50IGZvciBjaGlsZAotdXRpbF90bmd1dGlsX2Nhbm5vdF9lZGl0X3Jlc291cmNlPUNhbm5vdCBlZGl0IHJlc291cmNlLgotdXRpbF9Qcm9jZXNzVXRpbF9jb250cmlidXRlc3RvPWNvbnRyaWJ1dGVzIHRvICcnezB9JycKLXV0aWxfUHJvY2Vzc1V0aWxfbG9jYWxDb250cmlidXRlc3RvPWxvY2FsbHkgY29udHJpYnV0ZXMgdG8gJyd7MH0nJwotcHJvY2Vzc19leHRlbmRzPWV4dGVuZHMgJyd7MH0nJwotcHJvY2Vzc19yZXBsYWNlcz1yZXBsYWNlcyAnJ3swfScnCi1wcm9jZXNzX2xvY2FsUmVwbGFjZXM9bG9jYWxseSByZXBsYWNlcyAnJ3swfScnCi0jIEZpbHRlciBjb25zdGFudHMgZXh0ZXJuYWxpemVkIHN0cmluZ3MuCi1GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZXNfdGV4dD1EaXNjaXBsaW5lcwotRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVncm91cGluZ3NfdGV4dD1EaXNjaXBsaW5lIEdyb3VwaW5ncwotRmlsdGVyQ29uc3RhbnRzX3doaXRlcGFwZXJzX3RleHQ9V2hpdGVwYXBlcnMKLUZpbHRlckNvbnN0YW50c190b29sbWVudG9yc190ZXh0PVRvb2wgTWVudG9ycwotRmlsdGVyQ29uc3RhbnRzX3Rvb2xzX3RleHQ9VG9vbHMKLUZpbHRlckNvbnN0YW50c19yb2xlc190ZXh0PVJvbGVzCi1GaWx0ZXJDb25zdGFudHNfdGFza3NfdGV4dD1UYXNrcwotRmlsdGVyQ29uc3RhbnRzX3JldXNhYmxlYXNzZXRzX3RleHQ9UmV1c2FibGUgQXNzZXRzCi1GaWx0ZXJDb25zdGFudHNfYWxsX3RleHQ9QWxsCi1GaWx0ZXJDb25zdGFudHNfcHJvY2Vzc2VzX3RleHQ9UHJvY2Vzc2VzCi1GaWx0ZXJDb25zdGFudHNfcHJhY3RpY2VzX3RleHQ9UHJhY3RpY2VzCi1GaWx0ZXJDb25zdGFudHNfdGVtcGxhdGVzX3RleHQ9VGVtcGxhdGVzCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RzX3RleHQ9V29yayBQcm9kdWN0cwotRmlsdGVyQ29uc3RhbnRzX2NoZWNrbGlzdHNfdGV4dD1DaGVja2xpc3RzCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGVsaW5lc190ZXh0PUd1aWRlbGluZXMKLUZpbHRlckNvbnN0YW50c19yb2xlc2V0c190ZXh0PVJvbGUgU2V0cwotRmlsdGVyQ29uc3RhbnRzX2d1aWRhbmNlX3RleHQ9R3VpZGFuY2UKLUZpbHRlckNvbnN0YW50c19jb25jZXB0c190ZXh0PUNvbmNlcHRzCi1GaWx0ZXJDb25zdGFudHNfZXhhbXBsZXNfdGV4dD1FeGFtcGxlcwotRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRwYWNrYWdlc190ZXh0PUNvbnRlbnQgUGFja2FnZXMKLUZpbHRlckNvbnN0YW50c19yb2xlZGVzY3JpcHRvcnNfdGV4dD1Sb2xlIERlc2NyaXB0b3JzCi1GaWx0ZXJDb25zdGFudHNfcm9sZXNldGdyb3B1aW5nc190ZXh0PVJvbGUgU2V0IEdyb3VwaW5ncwotRmlsdGVyQ29uc3RhbnRzX3Rhc2tkZXNjcmlwdG9yc190ZXh0PVRhc2sgRGVzY3JpcHRvcnMKLUZpbHRlckNvbnN0YW50c19jb250ZW50ZWxlbWVudHNfdGV4dD1Db250ZW50IEVsZW1lbnRzCi1Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uX3ByZXBhcmU9UHJlcGFyaW5nIHN5bmNocm9uaXphdGlvbi4uLgotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcnNfdGV4dD1Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMKLUZpbHRlckNvbnN0YW50c19hbGxjb250ZW50ZWxlbWVudHNfdGV4dD1BbGwgQ29udGVudCBFbGVtZW50cwotRmlsdGVyQ29uc3RhbnRzX3N1cHBvcnRpbmdtYXRlcmlhbHNfdGV4dD1TdXBwb3J0aW5nIE1hdGVyaWFscwotTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfZXJyb3JTYXZpbmdGaWxlcz1FcnJvciBzYXZpbmcgZmlsZShzKQotRmlsdGVyQ29uc3RhbnRzX2N1c3RvbWNhdGVnb3JpZXNfdGV4dD1DdXN0b20gQ2F0ZWdvcmllcwotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0dHlwZXNfdGV4dD1Xb3JrIFByb2R1Y3QgS2luZHMKLURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kX3dhcm5pbmdNc2c9RGVsZXRpb24gY29tcGxldGVkIHdpdGggd2FybmluZwotRmlsdGVyQ29uc3RhbnRzX21ldGhvZHBsdWdpbnNfdGV4dD1NZXRob2QgUGx1Zy1pbnMKLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9sb2NrZWRQbHVnaW49SVVQTDAxMjBFOiBUaGUgcGx1Z2luICcnezB9JycgaXMgbG9ja2VkLgotRmlsdGVyQ29uc3RhbnRzX2RvbWFpbnNfdGV4dD1Eb21haW5zCi1GaWx0ZXJDb25zdGFudHNfcm9hZG1hcF90ZXh0PVJvYWRtYXBzCi1GaWx0ZXJDb25zdGFudHNfcmVwb3J0c190ZXh0PVJlcG9ydHMKLUF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWw9RGVmYXVsdCBTJnluY2hyb25pemF0aW9uIGZyb20gTWV0aG9kIENvbnRlbnQKLU1hbnVhbFN5bmNocm9uaXplQ29tbWFuZF9sYWJlbD1DdXN0b20gU3luY2hyb25pJnphdGlvbi4uLgotU3luY2hyb25pemVDb21wbGV0ZURpYWxvZ19UaXRsZT1TeW5jaHJvbml6YXRpb24gQ29tcGxldGUKLUF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfc3VjZXNzZnVsPVN5bmNocm9uaXphdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Lgotc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZV9tc2c9VGhlIGZvbGxvd2luZyBkZXNjcmlwdG9ycyBhcmUgbm90IHVzZWQgYW55d2hlcmUgYWZ0ZXIgZGVsZXRpb24gb2YgdGhlIHNlbGVjdGVkIGVsZW1lbnRzLlxuU2VsZWN0IGRlc2NyaXB0b3JzIHlvdSB3YW50IHRvIGRlbGV0ZS4KLQotQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmRfTWVzc2FnZT1TcGVjaWZ5IG5hbWUgYW5kIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgdGhlIHswfSB0byBiZSBjcmVhdGVkLgotIyBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9Qcm9jZXNzUGFja2FnZV9OYW1lPU5hbWU6Ci0KLSMgTWV0aG9kQ3JlYXRlQ2hpbGRDb21tYW5kCi1uZXdFbGVtZW50X3RleHQ9TmV3IHswfQotdXBkYXRlX291dG9mc3luY2hfdGl0bGU9VXBkYXRlIGNvbmZsaWN0Ci11cGRhdGVfb3V0b2ZzeW5jaF9tc2c9VGhlIGZpbGUocykgaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUgZmlsZSBzeXN0ZW0uIERvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgY2hhbmdlcz8KLWR1cGxpY2F0ZUZlYXR1cmVWYWx1ZT1DYW5ub3QgaGF2ZSAyIGVsZW1lbnRzIHVuZGVyICcnezB9Jycgd2l0aCB0aGUgc2FtZSB2YWx1ZSBmb3IgJyd7MX0nJwotYXBwbHlfcGF0dGVybl9lcnJvcl9tc2c9Q2Fubm90IGFwcGx5IGFjdGl2aXR5ICcnezB9JycgdG8gdGhlIHByb2Nlc3MgJyd7MX0nJyBzaW5jZSBpdCB3aWxsIHJlc3VsdCBpbiBjaXJjdWxhciBkZXBlbmRlbmN5LgotYXBwbHlfcGF0dGVybl9lcnJvcl9tc2cxPUNhbm5vdCBhcHBseSBhY3Rpdml0eSAnJ3swfScnIHRvIHRoZSBwcm9jZXNzICcnezF9Jycgc2luY2UgJyd7MH0nJyBhbHJlYWR5IGhhcyBvbmUgb3IgbW9yZSBjb250cmlidXRlZC9yZXBsYWNlZCBhY3Rpdml0aWVzIGFzIGl0cyBjaGlsZHJlbi4KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzE9QWN0aXZpdHkgJyd7MH0nJyBjYW5ub3Qgc2V0IHZhcmlhYmlsaXR5IHdpdGggb25lIG9mIGl0cyBkaXJlY3QgcGFyZW50LgotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMj1BY3Rpdml0eSAnJ3swfScnIGNhbm5vdCBzZXQgdmFyaWFiaWxpdHkgd2l0aCAnJ3sxfScnIHNpbmNlIGl0IHdpbGwgcmVzdWx0IGluIGNpcmN1bGFyIGRlcGVuZGVuY3kuCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2czPUNhbm5vdCByZXBsYWNlcyBhIHRvcCBwcm9jZXNzIHdpdGggYW4gYWN0aXZpdHkuCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2c9QWN0aXZpdHkgJyd7MH0nJyBjYW5ub3Qgc2V0IHZhcmlhYmlsaXR5IHdpdGggJyd7MX0nJyBzaW5jZSAnJ3sxfScnIGFscmVhZHkgaGFzIG9uZSBvciBtb3JlIGNvbnRyaWJ1dGVkL3JlcGxhY2VkIGFjdGl2aXRpZXMgYXMgaXRzIGNoaWxkcmVuLgotdmFyaWFiaWxpdHlfZXJyb3JfbXNnPVZhcmlhYmlsaXR5IGVsZW1lbnQgJyd7MH0nJyBjYW5ub3Qgc2V0IHZhcmlhYmlsaXR5IHdpdGggJyd7MX0nJyBzaW5jZSBpdCB3aWxsIHJlc3VsdCBpbiBjaXJjdWxhciBkZXBlbmRlbmN5LgotY2lyY3VsYXJfZGVwZW5kZW5jeV9lcnJvcl9tc2c9Q2Fubm90IHBlcmZvcm0gdGhlIG9wZXJhdGlvbiBzaW5jZSBpdCB3aWxsIHJlc3VsdCBpbiBjaXJjdWxhciBkZXBlbmRlbmN5LgotCi0jIFZhbGlkYXRpb24gbWVzc2FnZXMKLXZhcmlhYmlsaXR5X2VsZW1lbnRfY2lyY3VsYXJfbG9vcF9lcnJvcl9tc2c9Q2lyY3VsYXIgZGVwZW5kZW5jeSBsb29wIGRldGVjdGVkIC4uLiAKLXJlcGxhY2luZ19hbmNlc3Rvcl9lcnJvcl9tc2c9UmVwbGFjaW5nIGFuIGFuY2VzdG9yIGVycm9yIGlzIGRldGVjdGVkLgotY2Fubm90X2NvcHlfb3JfZXh0ZW5kX2RlbGl2ZXJ5X3Byb2Nlc3M9Q2Fubm90IGNvcHkgb3IgZXh0ZW5kIGEgZGVsaXZlcnkgcHJvY2VzcyBvciBhbnkgb2YgaXRzIGFjdGl2aXRpZXMuCi0KLSMgU29ydCBvcHRpb25zCi1Tb3J0VHlwZV9MYWJlbD1Tb3J0IFR5cGU6Ci1Tb3J0VHlwZV9NYW51YWw9TWFudWFsCi1Tb3J0VHlwZV9BbHBoYWJldGljPUFscGhhYmV0aWMKLVNvcnRUeXBlX1JldmVyc2VBbHBoYWJldGljPVJldmVyc2UgQWxwaGFiZXRpYwotU29ydFR5cGVfTWV0aG9kVHlwZT1NZXRob2QgVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1N0cnVjdHVyZWRNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9TdHJ1Y3R1cmVkTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlhMmYwMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1N0cnVjdHVyZWRNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHN0cnVjdHVyZWQgbWV0aG9kIHBsdWctaW4uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUdyb3VwQ29udGFpbmVyLAotCQlJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIE1hcCBncm91cEl0ZW1Qcm92aWRlck1hcDsKLQotCXByaXZhdGUgTW9kZWxTdHJ1Y3R1cmUgbW9kZWxTdHJ1Y3Q7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbFN0cnVjdHVyZShNb2RlbFN0cnVjdHVyZSBtb2RlbFN0cnVjdCkgewotCQl0aGlzLm1vZGVsU3RydWN0ID0gbW9kZWxTdHJ1Y3Q7Ci0JfQotCi0JcHVibGljIE1vZGVsU3RydWN0dXJlIGdldE1vZGVsU3RydWN0dXJlKCkgewotCQlyZXR1cm4gbW9kZWxTdHJ1Y3Q7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRHcm91cEl0ZW1Qcm92aWRlcihTdHJpbmcgbmFtZSkgewotCQlpZiAoZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ3JvdXBJdGVtUHJvdmlkZXJNYXAuZ2V0KG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9NZXRob2RQbHVnaW5fdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZ3JvdXBJdGVtUHJvdmlkZXJNYXAgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ3JvdXBJdGVtUHJvdmlkZXJNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBhZGFwdGVyID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJRGlzcG9zYWJsZSkgewotCQkJCQkoKElEaXNwb3NhYmxlKSBhZGFwdGVyKS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAuY2xlYXIoKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwID0gbnVsbDsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9UbmdBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1RuZ0FkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1MmZmYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1RuZ0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pbnRlcm5hbC5UbmdBZGFwdGVyRmFjdG9yeUltcGw7Ci0KLS8qKgotICogVGhlIGZhY3RvcnkgZm9yIGFsbCB0aGUgYWRhcHRlciBmYWN0b3JpZXMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVG5nQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUbmdBZGFwdGVyRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBUbmdBZGFwdGVyRmFjdG9yeUltcGwoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIExpYnJhcnkgdmlldy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBMaWJyYXJ5IHZpZXcKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50IGZpbHRlcgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIENvbmZpZ3VyYXRpb24gdmlldwotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRDb25maWd1cmF0aW9uVmlld19BZGFwdGVyRmFjdG9yeShJRmlsdGVyIGZpbHRlcik7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZS4gQ2xpZW50IGlzCi0JICogcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdCBhZnRlciB1c2UgYnkgY2FsbGluZwotCSAqIHtAbGlua3BsYWluIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpfQotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlV0JTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUuIENsaWVudCBpcwotCSAqIHJlc3BvbnNpYmxlIGZvciBkaXNwb3NpbmcgaXQgYWZ0ZXIgdXNlIGJ5IGNhbGxpbmcKLQkgKiB7QGxpbmtwbGFpbiBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5I2Rpc3Bvc2UoKX0KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVRCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmYWN0b3J5IGZvciBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZS4KLQkgKiBDbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdCBhZnRlciB1c2UgYnkgY2FsbGluZwotCSAqIHtAbGlua3BsYWluIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpfQotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVXUEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBDb25zb2xpZGF0ZWQgQnJlYWtkb3duIFN0cnVjdHVyZS4KLQkgKiBDbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdCBhZnRlciB1c2UgYnkgY2FsbGluZwotCSAqIHtAbGlua3BsYWluIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpfQotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgQ29uc29saWRhdGVkIEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBwdWJsaXNoZWQgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLgotCSAqIENsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nIGl0IGFmdGVyIHVzZSBieSBjYWxsaW5nCi0JICoge0BsaW5rcGxhaW4gQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSNkaXNwb3NlKCl9Ci0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBwdWJsaXNoZWQgV29yayBCcmVha2Rvd24gU3RydWN0dXJlCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHVibGlzaGluZ1dCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZmFjdG9yeSBmb3IgcHVibGlzaGVkIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZS4KLQkgKiBDbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdCBhZnRlciB1c2UgYnkgY2FsbGluZwotCSAqIHtAbGlua3BsYWluIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpfQotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgcHVibGlzaGVkIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVB1Ymxpc2hpbmdUQlNBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZhY3RvcnkgZm9yIHB1Ymxpc2hlZCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duCi0JICogU3RydWN0dXJlLiBDbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdCBhZnRlciB1c2UgYnkgY2FsbGluZwotCSAqIHtAbGlua3BsYWluIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpfQotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgcHVibGlzaGVkIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24KLQkgKiAgICAgICAgIFN0cnVjdHVyZQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVB1Ymxpc2hpbmdXUEJTQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgcHVibGlzaGVkIENvbnNvbGlkYXRlZCBCcmVha2Rvd24KLQkgKiBTdHJ1Y3R1cmUuIENsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nIGl0IGFmdGVyIHVzZSBieSBjYWxsaW5nCi0JICoge0BsaW5rcGxhaW4gQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSNkaXNwb3NlKCl9Ci0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBwdWJsaXNoZWQgQ29uc29saWRhdGVkIEJyZWFrZG93bgotCSAqICAgICAgICAgU3RydWN0dXJlCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHVibGlzaGluZ0NCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaW5nbGV0b24gY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBQcm9kdWN0Ci0JICogQnJlYWtkb3duIFN0cnVjdHVyZSBlZGl0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKiAgICAgICAgIGVkaXRvcgotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaW5nbGV0b24gY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgVGVhbSBCcmVha2Rvd24KLQkgKiBTdHJ1Y3R1cmUgZWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc2luZ2xldG9uIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgV29yayBQcm9kdWN0IEJyZWFrZG93bgotCSAqIFN0cnVjdHVyZSBlZGl0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKiAgICAgICAgIGVkaXRvcgotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaW5nbGV0b24gY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgQ29uc29saWRhdGVkCi0JICogQnJlYWtkb3duIFN0cnVjdHVyZSBlZGl0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgQ29uc29saWRhdGVkIEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKiAgICAgICAgIGVkaXRvcgotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaW5nbGV0b24gY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIENvbmZpZ3VyYXRpb24gdmlldwotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldENvbmZpZ3VyYXRpb25WaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgYWRhcHRlciBmYWN0b3J5IGZvciBJdGVtc0ZpbHRlciBwYWNrYWdlLiBFaXRoZXIKLQkgKiBnZXRGaWx0ZXJWaWV3X0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKSBvcgotCSAqIGdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKSBzaG91bGQgYmUgdXNlZC4gQm90aCBjYW4gYmUKLQkgKiB1c2VkIGF0IHRoZSBzYW1lIHRpbWUgZGVwZW5kcyBvbiBwdXJwb3NlLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShJRmlsdGVyIGZpbHRlcik7Ci0KLQkvKioKLQkgKiBHZXRzIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBmaWx0ZXIuCi0JICogCi0JICogQHBhcmFtIGZpbHRlcgotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudCBmaWx0ZXIKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0T0JTRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKTsKLQotCS8qKgotCSAqIEdldHMgYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUgZmlsdGVyLgotCSAqIAotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQgZmlsdGVyCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZQotCSAqICAgICAgICAgZmlsdGVyCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFBCU0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShJRmlsdGVyIGZpbHRlcik7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaW5nbGV0b24gY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgVGVhbSBCcmVha2Rvd24KLQkgKiBTdHJ1Y3R1cmUgZmlsdGVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRPQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc2luZ2xldG9uIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFdvcmsgUHJvZHVjdAotCSAqIEJyZWFrZG93biBTdHJ1Y3R1cmUgZmlsdGVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlCi0JICogICAgICAgICBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRQQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc2luZ2xldG9uIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIGl0ZW0gZmlsdGVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIGl0ZW0gZmlsdGVyCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0SXRlbXNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogUmVzZXRzIHRoZSBhZGFwdGVyIGZhY3Rvcmllcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldCgpOwotCi0JLyoqCi0JICogUmVsZWFzZXMgdW51c2VkIG9iamVjdHMuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW5VcCgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5M2FlMTE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuSUVsZW1lbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luOwotCi0vKioKLSAqIEl0ZW0gcHJvdmlkZXIgZm9yIFVJIHRyYW5zaWVudCBvYmplY3RzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ3JvdXAvb3JnYW5pemUKLSAqIG1vZGVsIG9iamVjdHMgaW4gYSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsCi0JCUlFbGVtZW50SXRlbVByb3ZpZGVyLCBJQ29uZmlndXJhYmxlLCBJRGVmYXVsdE5hbWVTZXR0ZXIsCi0JCUlMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQlwcml2YXRlIElGaWx0ZXIgY2hpbGRGaWx0ZXI7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQlwYXJlbnQuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU5vdGlmaWVyIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQlwYXJlbnQuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoY2hpbGRGaWx0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNoaWxkRmlsdGVyLmFjY2VwdChvYmopOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE5ld0NoaWxkRGVzY3JpcHRvcnModGFyZ2V0LCBlZGl0aW5nRG9tYWluLCBzaWJsaW5nKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UmVzb3VyY2VMb2NhdG9yKCkKLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCwgaW50LAotCSAqICAgICAgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCUNvbW1hbmQgY21kID0gc3VwZXIuY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKGRvbWFpbiwgKEVPYmplY3QpIHRhcmdldCwKLQkJCQlmZWF0dXJlLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZDoKLQkJLy8gY2FuIGV4ZWN1dGU6ICIgKyBjbWQuY2FuRXhlY3V0ZSgpKTsKLQkJcmV0dXJuIGNtZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlQWRkQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS51dGlsLkNvbGxlY3Rpb24sIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCUNvbGxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChhY2NlcHRBc0NoaWxkKGVsZW1lbnQpKSB7Ci0JCQkJc2VsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZChzdXBlci5jcmVhdGVBZGRDb21tYW5kKGRvbWFpbiwKLQkJCQkoRU9iamVjdCkgdGFyZ2V0LCBmZWF0dXJlLCBzZWxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZVJlbW92ZUNvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZVJlbW92ZUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCUNvbW1hbmQgY21kID0gc3VwZXIuY3JlYXRlUmVtb3ZlQ29tbWFuZChkb21haW4sIChFT2JqZWN0KSB0YXJnZXQsCi0JCQkJZmVhdHVyZSwgY29sbGVjdGlvbik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY3JlYXRlUmVtb3ZlQ29tbWFuZDogY2FuCi0JCS8vIGV4ZWN1dGU6ICIgKyBjbWQuY2FuRXhlY3V0ZSgpKTsKLQkJcmV0dXJuIGNtZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlTW92ZUNvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVNb3ZlQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlDb21tYW5kIGNtZCA9IHN1cGVyLmNyZWF0ZU1vdmVDb21tYW5kKGRvbWFpbiwgKEVPYmplY3QpIHRhcmdldCwKLQkJCQlmZWF0dXJlLCB2YWx1ZSwgaW5kZXgpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NyZWF0ZU1vdmVDb21tYW5kOiBjYW4KLQkJLy8gZXhlY3V0ZTogIiArIGNtZC5jYW5FeGVjdXRlKCkpOwotCQlyZXR1cm4gY21kOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUNvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuQ2xhc3MsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3Qgb2JqZWN0LCBFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUNsYXNzIGNvbW1hbmRDbGFzcywgQ29tbWFuZFBhcmFtZXRlciBjb21tYW5kUGFyYW1ldGVyKSB7Ci0JCWlmIChjb21tYW5kQ2xhc3MgPT0gUmVtb3ZlQ29tbWFuZC5jbGFzcykgewotCQkJY29tbWFuZFBhcmFtZXRlci5zZXRPd25lcih0YXJnZXQpOwotCQl9Ci0JCUNvbW1hbmQgY21kID0gc3VwZXIuY3JlYXRlQ29tbWFuZChvYmplY3QsIGRvbWFpbiwgY29tbWFuZENsYXNzLAotCQkJCWNvbW1hbmRQYXJhbWV0ZXIpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NyZWF0ZUNvbW1hbmQ6ICIgKwotCQkvLyBjb21tYW5kQ2xhc3MgKyAiLCBjYW4gZXhlY3V0ZTogIiArIGNtZC5jYW5FeGVjdXRlKCkgKyAiLCBvd25lcjogIiArCi0JCS8vIGNvbW1hbmRQYXJhbWV0ZXIuZ2V0T3duZXIoKSArICIsIGNvbGxlY3Rpb246ICIgKwotCQkvLyBjb21tYW5kUGFyYW1ldGVyLmdldENvbGxlY3Rpb24oKSk7Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDaGlsZHJlblN0b3JlIHN0b3JlID0gZ2V0Q2hpbGRyZW5TdG9yZSh0YXJnZXQpOwotCQlpZiAoc3RvcmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIHN0b3JlLmdldENoaWxkcmVuKCk7Ci0JCX0KLQotCQlzdG9yZSA9IGNyZWF0ZUNoaWxkcmVuU3RvcmUodGFyZ2V0KTsKLQkJTGlzdCByZXN1bHQgPSBzdG9yZSAhPSBudWxsID8gbnVsbCA6IG5ldyBBcnJheUxpc3QoKTsKLQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIHRhcmdldDsKLQotCQlpZiAodGFyZ2V0ID09IG51bGwpIHJldHVybiByZXN1bHQ7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDaGlsZHJlbkZlYXR1cmVzKHRhcmdldCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGkubmV4dCgpOwotCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCWZvciAoSXRlcmF0b3IgY2kgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBjaS5oYXNOZXh0KCk7IGluZGV4KyspIHsKLQkJCQkJT2JqZWN0IGNoaWxkID0gY2kubmV4dCgpOwotCQkJCQlpZiAoYWNjZXB0QXNDaGlsZChjaGlsZCkpIHsKLQkJCQkJCWNoaWxkID0gd3JhcChlT2JqZWN0LCBmZWF0dXJlLCBjaGlsZCwgaW5kZXgpOwotCQkJCQkJaWYgKHN0b3JlICE9IG51bGwpIHsKLQkJCQkJCQlzdG9yZS5nZXRMaXN0KGZlYXR1cmUpLmFkZChjaGlsZCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJlc3VsdC5hZGQoY2hpbGQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlPYmplY3QgY2hpbGQgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKGFjY2VwdEFzQ2hpbGQoY2hpbGQpKSB7Ci0JCQkJCWNoaWxkID0gd3JhcChlT2JqZWN0LCBmZWF0dXJlLCBjaGlsZCwKLQkJCQkJCQlDb21tYW5kUGFyYW1ldGVyLk5PX0lOREVYKTsKLQkJCQkJaWYgKHN0b3JlICE9IG51bGwpIHsKLQkJCQkJCXN0b3JlLnNldFZhbHVlKGZlYXR1cmUsIGNoaWxkKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlc3VsdC5hZGQoY2hpbGQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUxpc3QgY2hpbGRyZW4gPSBzdG9yZSAhPSBudWxsID8gc3RvcmUuZ2V0Q2hpbGRyZW4oKSA6IHJlc3VsdDsKLQkJQ29sbGVjdGlvbnMuc29ydChjaGlsZHJlbiwgUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRDb21wYXJhdG9yKCkpOwotCQkKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBmbG9hdCwgaW50LCBpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCU9iamVjdCBvd25lciwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWJvb2xlYW4gY2FuRXhlYyA9IHRydWU7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoIWFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCQkJY2FuRXhlYyA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCUNvbW1hbmQgY21kOwotCQlpZiAoY2FuRXhlYykgewotCQkJY21kID0gc3VwZXIuY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKGRvbWFpbiwgb3duZXIsIGxvY2F0aW9uLAotCQkJCQlvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pOwotCQl9IGVsc2UgewotCQkJY21kID0gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NyZWF0ZU1vdmVDb21tYW5kOiBjYW4KLQkJLy8gZXhlY3V0ZTogIiArIGNtZC5jYW5FeGVjdXRlKCkpOwotCQlyZXR1cm4gY21kOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKHRoaXMsIG1zZyk7Ci0KLQkJLy8gaWYobXNnLmdldE5vdGlmaWVyKCkgPT0gdGFyZ2V0KSB7Ci0JCS8vIGlmKGZlYXR1cmVJZCA9PSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUykgewotCQkvLyBib29sZWFuIG5vdGlmeSA9IGZhbHNlOwotCQkvLyBzd2l0Y2gobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJLy8gY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLQkJLy8gT2JqZWN0IG9iaiA9IG1zZy5nZXROZXdWYWx1ZSgpOwotCQkvLyBub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCS8vIG9iaiA9IG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkvLyBub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJLy8gQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkvLyBmb3JfY2hlY2s6Ci0JCS8vIGZvcihJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gaWYoYWNjZXB0QXNDaGlsZChpdGVyLm5leHQoKSkpIHsKLQkJLy8gbm90aWZ5ID0gdHJ1ZTsKLQkJLy8gYnJlYWsgZm9yX2NoZWNrOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkvLyBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkvLyBmb3JfY2hlY2s6Ci0JCS8vIGZvcihJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gaWYoYWNjZXB0QXNDaGlsZChpdGVyLm5leHQoKSkpIHsKLQkJLy8gbm90aWZ5ID0gdHJ1ZTsKLQkJLy8gYnJlYWsgZm9yX2NoZWNrOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vCi0JCS8vIH0KLQkJLy8gaWYobm90aWZ5KSB7Ci0JCS8vIGZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obXNnLCB0aGlzLCB0cnVlLCBmYWxzZSkpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldENvbmZpZ3VyYXRpb24ob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmNoaWxkRmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRm9sZGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvVmFyaWFiaWxpdHlJbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvVmFyaWFiaWxpdHlJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYwMGU3NDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1ZhcmlhYmlsaXR5SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3Igc3RvcmluZyB2YXJpYWJpbGl0eSBpbmZvcm1hdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZhcmlhYmlsaXR5SW5mbyB7Ci0KLQlwcml2YXRlIFZhcmlhYmlsaXR5RWxlbWVudCBvd25lcjsKLQotCXByaXZhdGUgTGlzdCBpbmhlcml0YW5jZUxpc3Q7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBjb250cmlidXRvcnM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqICAgICAgICAgICAgYSB2YXJpYWJpbGl0eSBlbGVtZW50Ci0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5SW5mbyhWYXJpYWJpbGl0eUVsZW1lbnQgb3duZXIpIHsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG93bmVyIG9mIHRoaXMgVmFyaWFiaWxpdHlJbmZvIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvd25lciBvZiB0aGlzIFZhcmlhYmlsaXR5SW5mbyBvYmplY3QuCi0JICovCi0JcHVibGljIGZpbmFsIFZhcmlhYmlsaXR5RWxlbWVudCBnZXRPd25lcigpIHsKLQkJcmV0dXJuIG93bmVyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJlYWxpemVkIGluaGVyaXRhbmNlIGxpc3QgaW4gdGhlIG9yZGVyIGZyb20gdGhlIHJlc29sdmVkIG9iamVjdAotCSAqIG9mIHRoZSBvd25lciB0byB0aGUgaXRzIHRvcCBiYXNlLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbmhlcml0YW5jZUxpc3QoKSB7Ci0JCWlmIChpbmhlcml0YW5jZUxpc3QgPT0gbnVsbCkgewotCQkJaW5oZXJpdGFuY2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBpbmhlcml0YW5jZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlzdCBvZiBhbGwgY29udHJpYnV0b3IgdG8KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q29udHJpYnV0b3JzKCkgewotCQlpZiAoY29udHJpYnV0b3JzID09IG51bGwpIHsKLQkJCWNvbnRyaWJ1dG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gY29udHJpYnV0b3JzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2JyZWFrZG93bmVsZW1lbnQvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9icmVha2Rvd25lbGVtZW50L0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNjZDU5YjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2JyZWFrZG93bmVsZW1lbnQvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5icmVha2Rvd25lbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBza2Fubm9vcgotICoKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwdWJsaWMgQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJT2JqZWN0IGltZyA9IFRuZ1V0aWwuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJcmV0dXJuIGltZyAhPSBudWxsID8gaW1nIDogc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvYnJlYWtkb3duZWxlbWVudC9NaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9icmVha2Rvd25lbGVtZW50L01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMDdlNWM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9icmVha2Rvd25lbGVtZW50L01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmJyZWFrZG93bmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWlsZXN0b25lSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NaWxlc3RvbmVJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIE1pbGVzdG9uZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9NaWxlc3RvbmVfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9DdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvQ3VzdG9tQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MzRiNzVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9DdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiQ3VzdG9tIENhdGVnb3JpZXMiIGZvbGRlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQ29udGVudFBhY2thZ2UgdGFyZ2V0LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgdGFyZ2V0LCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUN1c3RvbUNhdGVnb3J5KCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBhY2NlcHQob2JqKTsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCUxpc3QgbXlDYXRlZ29yaWVzID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJLmdldEN1c3RvbUNhdGVnb3JpZXMoKEN1c3RvbUNhdGVnb3J5KSBvYmopOwotCQkJaWYgKG15Q2F0ZWdvcmllcy5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKG15Q2F0ZWdvcmllcy5zaXplKCkgPT0gMSkgewotCQkJCS8vIHJvb3QgY3VzdG9tIGNhdGVnb3J5IGlzIHVuZGUgdGhlIGhpZGRlbiBwYWNrYWdlIGFuZCB3aWxsIG5vdAotCQkJCS8vIGJlIHByb2Nlc3NlZC4KLQkJCQkvLyBuZWVkIHRvIHNob3cgc3ViIGNhdGVnb3JpZXMgdW5kZXIgaXQKLQkJCQlDdXN0b21DYXRlZ29yeSBjID0gKEN1c3RvbUNhdGVnb3J5KSBteUNhdGVnb3JpZXMuZ2V0KDApOwotCQkJCWlmIChUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KGMpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0N1c3RvbUNhdGVnb3JpZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShUbmdVdGlsLmV4dHJhY3QoKChDb250ZW50UGFja2FnZSkgdGFyZ2V0KQotCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRzKCksIEN1c3RvbUNhdGVnb3J5LmNsYXNzKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0NVU1RPTV9DQVRFR09SWSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0N1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDViZDM3OTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0N1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LkVNRkVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5DYXRlZ29yeVNvcnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGN1c3RvbSBjYXRlZ29yeS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSURlZmF1bHROYW1lU2V0dGVyLCBJTGlicmFyeUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJLy8gdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQotCQkvLyBDdXN0b21DYXRlZ29yeSBjYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgb2JqZWN0OwotCQkvLyBpZihjYXRlZ29yeS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkvLyByZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCS8vIH0KLQkJLy8JCQotCQkvLyBpZihwYXJlbnQgIT0gbnVsbCkgewotCQkvLyByZXR1cm4gcGFyZW50OwotCQkvLyB9Ci0JCS8vCQkKLQkJLy8gaWYob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkvLyBNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIG9iamVjdCk7Ci0JCS8vIC8vaWYocGx1Z2luID09IG51bGwpIHJldHVybiBudWxsOwotCQkvLwkJCQotCQkvLyBpZihwbHVnaW4gIT0gbnVsbCkgewotCQkvLyBTdHJpbmdbXSBwYXRoID0gewotCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikKLQkJLy8gLExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0N1c3RvbV9DYXRlZ29yaWVzX2dyb3VwIikKLQkJLy8gfTsKLQkJLy8gcmV0dXJuIFRuZ1V0aWwuZ2V0QWRhcHRlcihwbHVnaW4sIHBhdGgpOwotCQkvLyB9Ci0JCS8vCQkJCi0JCS8vIH0KLQotCQlpZiAoVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVDdXN0b21DYXRlZ29yeSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCS8vIGNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3JpZXMoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpKTsKLQkJCS8vIGNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X1Byb2Nlc3NFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kLkhlbHBlciNnZXRDcmVhdGVDaGlsZEltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZUNoaWxkSW1hZ2UoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlICYmIGNoaWxkIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRVJlZmVyZW5jZSByZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgZmVhdHVyZTsKLQkJCUVDbGFzcyBwYXJlbnRDbGFzcyA9IHJlZmVyZW5jZS5nZXRFQ29udGFpbmluZ0NsYXNzKCk7Ci0JCQlFQ2xhc3MgY2hpbGRDbGFzcyA9ICgoRU9iamVjdCkgY2hpbGQpLmVDbGFzcygpOwotCQkJU3RyaW5nIG5hbWUgPSAiZnVsbC9jdG9vbDE2L0NyZWF0ZSIgKyBwYXJlbnRDbGFzcy5nZXROYW1lKCkgKyAiXyIgKyByZWZlcmVuY2UuZ2V0TmFtZSgpICsgIl8iICsgY2hpbGRDbGFzcy5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl0cnkgewotCQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZShuYW1lKTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBFTUZFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL2N0b29sMTYvQ3JlYXRlQ2hpbGQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlUmVtb3ZlZChDdXN0b21DYXRlZ29yeSBjYXRlZ29yeSkgewotCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhjYXRlZ29yeSkuaXNFbXB0eSgpKSB7Ci0JCQkvLyByZW1vdmUgYWxsIHN1YmNhdGVnb3JpZXMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjYXRlZ29yeS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQotCQkJRWNvcmVVdGlsLnJlbW92ZShjYXRlZ29yeSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXNldERlZmF1bHROYW1lKG5vdGlmaWNhdGlvbik7Ci0KLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlDb250ZW50UGFja2FnZSBwa2c7Ci0JCS8vIGJvb2xlYW4gcmVmcmVzaEN1c3RvbUNhdGVnb3J5Um9vdCA9IGZhbHNlOwotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTkFNRToKLQkJCVRuZ1V0aWwucmVmcmVzaENvbnRyaWJ1dG9ycyh0aGlzLCBub3RpZmljYXRpb24sIGZhbHNlLCB0cnVlKTsKLQkJCS8vZm9yIGVwZiBkZWZlY3Q6MTc0MDQzCi0JCQlpZighVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpKXsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTWV0aG9kRWxlbWVudFV0aWwuZ2V0TWV0aG9kTW9kZWwobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpOwotCQkJCWlmKHBsdWdpbiAhPW51bGwpewotCQkJCQlDdXN0b21DYXRlZ29yeSByb290ID0gVG5nVXRpbC5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkocGx1Z2luKTsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIHJvb3QsIHRydWUsIGZhbHNlKSk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlicmVhazsKLQkJLy8gY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JJRVM6Ci0JCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlRTOgotCQkJcGtnID0gKENvbnRlbnRQYWNrYWdlKSAoKEVPYmplY3QpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKQotCQkJCQkuZUNvbnRhaW5lcigpOwotCQkJaWYgKChwa2cgIT0gbnVsbCkKLQkJCQkJJiYgKE1vZGVsU3RydWN0dXJlLkhJRERFTl9QQUNLQUdFX05BTUUKLQkJCQkJCQkuZXF1YWxzKHBrZy5nZXROYW1lKCkpKSkgewotCQkJCS8vIG5vdGlmaWVyIGlzIHRoZSByb290IGN1c3RvbSBjYXRlZ29yeQotCQkJCS8vCi0JCQkJcGtnID0gKENvbnRlbnRQYWNrYWdlKSBwa2cuZUNvbnRhaW5lcigpOwotCQkJfQotCQkJT2JqZWN0IG9iajsKLQkJCUN1c3RvbUNhdGVnb3J5IGNhdGVnb3J5OwotCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQlvYmogPSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJY2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIG9iajsKLQkJCQkJaWYgKGNhdGVnb3J5LmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQlwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGNhdGVnb3J5KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIHJlZnJlc2hDdXN0b21DYXRlZ29yeVJvb3QgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCQkJY2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIG9iajsKLQkJCQkJCWlmIChjYXRlZ29yeS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkJCXBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoY2F0ZWdvcnkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyByZWZyZXNoQ3VzdG9tQ2F0ZWdvcnlSb290ID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCQkKLQkJCQkvLyByZW1vdmluZyBzdWJjYXRlZ29yaWVzIGlzIGhhbmRsZWQgYnkgdGhlIHJlbW92ZSBjb21tYW5kCi0JCQkJLy8KLS8vCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotLy8JCQkJb2JqID0gbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCk7Ci0vLwkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLS8vCQkJCQloYW5kbGVSZW1vdmVkKChDdXN0b21DYXRlZ29yeSkgb2JqKTsKLS8vCQkJCX0KLS8vCQkJCWJyZWFrOwotLy8JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLS8vCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpCi0vLwkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCQlvYmogPSBpdGVyLm5leHQoKTsKLS8vCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLS8vCQkJCQkJaGFuZGxlUmVtb3ZlZCgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaik7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0KLQkJCS8vIC8vIHJlZnJlc2ggd3JhcHBlcnMKLQkJCS8vIC8vCi0JCQkvLyBpZih3cmFwcGVycyAhPSBudWxsKSB7Ci0JCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KHdyYXBwZXJzKS5pdGVyYXRvcigpOwotCQkJLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkvLyBmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCS8vIGl0ZXIubmV4dCgpLCB0cnVlLCBmYWxzZSkpOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8JCQkKLQkJCS8vIGlmKHJlZnJlc2hDdXN0b21DYXRlZ29yeVJvb3QpIHsKLQkJCS8vIC8vIHN1YiBjYXRlZ29yeSBoYXMgYmVlbiBhZGRlZCBvciByZW1vdmVkIGZyb20gdGhlIGN1c3RvbQotCQkJLy8gY2F0ZWdvcnkKLQkJCS8vIC8vIG5lZWQgdG8gcmVmcmVzaCB0aGUgZm9sZGVyIGZvciBhbGwgY3VzdG9tIGNhdGVnb3JpZXMKLQkJCS8vIC8vCi0JCQkvLyBNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIHRhcmdldCk7Ci0JCQkvLwkJCQkKLQkJCS8vIGlmKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkvLyBTdHJpbmdbXSBwYXRoID0gewotCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpCi0JCQkvLyAsTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXAiKQotCQkJLy8gfTsKLQkJCS8vIGZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJLy8gVG5nVXRpbC5nZXRBZGFwdGVyKHBsdWdpbiwgcGF0aCksIHRydWUsIGZhbHNlKSk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0KLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2lzV3JhcHBpbmdOZWVkZWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCWlmICghaXNXcmFwcGluZ05lZWRlZChvYmplY3QpKQotCQkJcmV0dXJuIHZhbHVlOwotCQlyZXR1cm4gVG5nVXRpbC5jcmVhdGVXcmFwcGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlLAotCQkJCWluZGV4KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9DdXN0b21DYXRlZ29yeV90eXBlIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDdXN0b21DYXRlZ29yeSBjYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgb2JqZWN0OwotCQlyZXR1cm4gIWNhdGVnb3J5LmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5pc0VtcHR5KCkKLQkJLy8gfHwgIWNhdGVnb3J5LmdldFN1YkNhdGVnb3JpZXMoKS5pc0VtcHR5KCkKLQkJOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJSURlZmF1bHROYW1lU2V0dGVyIGRlZmF1bHROYW1lU2V0dGVyID0gdGhpczsKLQkJaWYgKGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpICE9IG51bGwpIHsKLQkJCWludCBmZWF0dXJlSWQgPSBtc2cuZ2V0RmVhdHVyZUlEKGRlZmF1bHROYW1lU2V0dGVyCi0JCQkJCS5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSk7Ci0JCQlpZiAoZmVhdHVyZUlkID09IGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSkgewotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlzZXREZWZhdWx0TmFtZShtc2cuZ2V0TmV3VmFsdWUoKSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlzZXREZWZhdWx0TmFtZShpdGVyLm5leHQoKSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqLCBPYmplY3QgcGFyZW50KSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfQ1VTVE9NX0NBVEVHT1JZOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoQ3VzdG9tQ2F0ZWdvcnkpIHBhcmVudCkKLQkJCQkJLmdldENhdGVnb3JpemVkRWxlbWVudHMoKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwgYmFzZU5hbWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlRTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIEN1c3RvbUNhdGVnb3J5LmNsYXNzOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlDb2xsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJLy8gY2hlY2sgY3VzdG9tIGNhdGVnb3J5IGZvciBjaXJjdWxhciBkZXBlbmRlbmN5Ci0JCQkJLy8KLQkJCQlpZiAoIShvd25lciBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCAmJiBUbmdVdGlsCi0JCQkJCQkuaXNBbmNlc3Nvck9mKChDdXN0b21DYXRlZ29yeSkgZWxlbWVudCwKLQkJCQkJCQkJKERlc2NyaWJhYmxlRWxlbWVudCkgb3duZXIpKSkgewotCQkJCQlzZWxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKChBZGRDb21tYW5kKSBzdXBlci5jcmVhdGVBZGRDb21tYW5kKAotCQkJCWRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZVJlbW92ZUNvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZVJlbW92ZUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVSZW1vdmVDb21tYW5kKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdCkpCi0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0N1c3RvbUNhdGVnb3JpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlIHsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQlpZiAoKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSAhPSBudWxsKSB7Ci0JCQkJCVVSSSBpbWdVcmkgPSBUbmdVdGlsLmdldEZ1bGxQYXRob2ZOb2Rlb3JTaGFwZUljb25VUkkoCi0JCQkJCQkJKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0LAotCQkJCQkJCSgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkpOwotCQkJCQlPYmplY3QgaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTaGFyZWRJbWFnZShpbWdVcmkpOwotCQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCQkJCXJldHVybiBpbWFnZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJLy8gZG8gbm90aGluZywgYWxyZWFkeSBoYW5kbGVkIGJ5IHNldERlZmF1bHROYW1lKE5vdGlmaWNhdGlvbikKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXROb3RpZnlDaGFuZ2VkTGlzdGVuZXJzKCkgewotCQlpZihjaGFuZ2VOb3RpZmllciBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KChDb2xsZWN0aW9uKSBjaGFuZ2VOb3RpZmllcik7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQotCQlDb2xsZWN0aW9uIGNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWlmKFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KW9iamVjdCkpewotCQkJTGlzdCBzb3J0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXNvcnRMaXN0LmFkZEFsbChjb2wpOwotCQkJQ29sbGVjdGlvbnMuc29ydChzb3J0TGlzdCwgUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRDb21wYXJhdG9yKCkpOwotCQkJcmV0dXJuIHNvcnRMaXN0OwotCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCUxpc3Qgc29ydExpc3QgPSBDYXRlZ29yeVNvcnRIZWxwZXIuc29ydENhdGVnb3J5RWxlbWVudHMoKE1ldGhvZEVsZW1lbnQpb2JqZWN0LCBjb2wudG9BcnJheSgpKTsKLQkJCXJldHVybiBzb3J0TGlzdDsKLQkJfQotCQlyZXR1cm4gY29sOwotCX0KLQkKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWRjYjdlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiRGlzY2lwbGluZXMiIGZvbGRlci4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgRGlzY2lwbGluZXNJdGVtUHJvdmlkZXIgaW4gRVBGIE01LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIHRhcmdldCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRhcmdldCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5UcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIjaXNJbmhlcml0ZWQob3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnkpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmhlcml0ZWQoQ29udGVudENhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCXJldHVybiAoY2F0ZWdvcnkgaW5zdGFuY2VvZiBEaXNjaXBsaW5lIHx8IGNhdGVnb3J5IGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKQotCQkJCSYmIGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRGlzY2lwbGluZSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKQotCQkJCXx8IChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lICYmIEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkuZ2V0RGlzY2lwbGluZUdyb3VwcygoRGlzY2lwbGluZSkgb2JqKS5pc0VtcHR5KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGFjY2VwdChvYmopOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGlzY2lwbGluZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJCURpc2NpcGxpbmUgY2hpbGQgPSAoRGlzY2lwbGluZSkgZWxlbWVudDsKLQkJCQlEaXNjaXBsaW5lSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChEaXNjaXBsaW5lSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJCQkuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KS5hZGFwdChjaGlsZCwKLQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpdGVtUHJvdmlkZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShUbmdVdGlsLmV4dHJhY3QoKChDb250ZW50UGFja2FnZSkgdGFyZ2V0KQotCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRzKCksIERpc2NpcGxpbmUuY2xhc3MpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLCBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRElTQ0lQTElORSk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKFRuZ1V0aWwuZXh0cmFjdCgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0RJU0NJUExJTkVfR1JPVVBJTkcpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0Nzc2OGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuRU1GRWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGRpc2NpcGxpbmUgZ3JvdXBpbmcuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW5hbWVkIGFzIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciBpbiBFUEYgTTUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSURlZmF1bHROYW1lU2V0dGVyLCBJTGlicmFyeUl0ZW1Qcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVEaXNjaXBsaW5lKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgb2JqZWN0KTsKLQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCVN0cmluZ1tdIHBhdGggPSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSwKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCX07Ci0KLQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRBZGFwdGVyKHBsdWdpbiwgcGF0aCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBNZXRob2RQbHVnaW4gbW9kZWwgPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoTWV0aG9kRWxlbWVudCkgb2JqZWN0KTsKLQkJLy8gaWYobW9kZWwgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCS8vIElHcm91cENvbnRhaW5lciBncm91cENvbnRhaW5lciA9IChJR3JvdXBDb250YWluZXIpCi0JCS8vIFRuZ1V0aWwuZ2V0QWRhcHRlcigoRU9iamVjdCltb2RlbCwgSUdyb3VwQ29udGFpbmVyLmNsYXNzKTsKLQkJLy8gaWYoZ3JvdXBDb250YWluZXIgIT0gbnVsbCkgewotCQkvLyBncm91cENvbnRhaW5lciA9IChJR3JvdXBDb250YWluZXIpCi0JCS8vIGdyb3VwQ29udGFpbmVyLmdldEdyb3VwSXRlbVByb3ZpZGVyKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSk7Ci0JCS8vIHJldHVybgotCQkvLyBncm91cENvbnRhaW5lci5nZXRHcm91cEl0ZW1Qcm92aWRlcihMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpKTsKLQkJLy8gfQotCQkvLyAvLyBNZXRob2RNb2RlbEl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoTWV0aG9kTW9kZWxJdGVtUHJvdmlkZXIpCi0JCS8vIFRuZ1V0aWwuZ2V0QWRhcHRlcigoRU9iamVjdCltb2RlbCwgTWV0aG9kTW9kZWxJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQkvLyAvLyBpZihpdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkvLyAvLyByZXR1cm4gaXRlbVByb3ZpZGVyLmdldERpc2NpcGxpbmVDYXRlZ29yaWVzKCk7Ci0JCS8vIC8vIH0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJaWYgKGNoaWxkcmVuIGluc3RhbmNlb2YgTGlzdCkKLQkJCUNvbGxlY3Rpb25zLnNvcnQoKExpc3QpIGNoaWxkcmVuLCBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFCi0JCQkJCS5nZXRDb21wYXJhdG9yKCkpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZC5IZWxwZXIjZ2V0Q3JlYXRlQ2hpbGRJbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSAmJiBjaGlsZCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVSZWZlcmVuY2UgcmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIGZlYXR1cmU7Ci0JCQlFQ2xhc3MgcGFyZW50Q2xhc3MgPSByZWZlcmVuY2UuZ2V0RUNvbnRhaW5pbmdDbGFzcygpOwotCQkJRUNsYXNzIGNoaWxkQ2xhc3MgPSAoKEVPYmplY3QpIGNoaWxkKS5lQ2xhc3MoKTsKLQkJCVN0cmluZyBuYW1lID0gImZ1bGwvY3Rvb2wxNi9DcmVhdGUiICsgcGFyZW50Q2xhc3MuZ2V0TmFtZSgpICsgIl8iICsgcmVmZXJlbmNlLmdldE5hbWUoKSArICJfIiArIGNoaWxkQ2xhc3MuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UobmFtZSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gRU1GRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9jdG9vbDE2L0NyZWF0ZUNoaWxkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIFN0cmluZyBsYWJlbCA9IFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LAotCQkvLyBnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfdHlwZSIpKTsKLQkJLy8gQ29udGVudENhdGVnb3J5IGNhdGVnb3J5ID0gKENvbnRlbnRDYXRlZ29yeSkgb2JqZWN0OwotCQkvLyBpZihjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkvLyBNZXRob2RQbHVnaW4gYmFzZVBsdWdpbiA9Ci0JCS8vIFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSk7Ci0JCS8vIGlmKGJhc2VQbHVnaW4gIT0gbnVsbCkgewotCQkvLyBsYWJlbCA9IGxhYmVsICsgIiAoaW5oZXJpdGVkIGZyb20gIiArIGJhc2VQbHVnaW4uZ2V0TmFtZSgpICsgJyknOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIGxhYmVsOwotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbCgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QsCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZUdyb3VwaW5nX3R5cGUiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkvLyBjb21tZW50aW5nIGJlbG93LCB1c2VmdWwgZm9yIHN0YXRlZnVsIGl0ZW1wcm92aWRlci4KLQkJLy9UbmdVdGlsLnNldERlZmF1bHROYW1lKHRoaXMsIG5vdGlmaWNhdGlvbik7Ci0JCQotCQkvLyBGb3Igc3RhdGVsZXNzIGl0ZW1wcm92aWRlciwgbmVlZCB0aGlzLgotCQlzZXREZWZhdWx0TmFtZShub3RpZmljYXRpb24pOwotCQkKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnOwotCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmU7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaXNjaXBsaW5lR3JvdXBpbmcuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0KLQkJCWJvb2xlYW4gcmVmcmVzaFBhcmVudCA9IGZhbHNlOwotCQkJcGtnID0gKENvbnRlbnRQYWNrYWdlKSAoKEVPYmplY3QpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKQotCQkJCQkuZUNvbnRhaW5lcigpOwotCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQlkaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJCWlmIChkaXNjaXBsaW5lLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCXBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZGlzY2lwbGluZSk7Ci0JCQkJfSBlbHNlIGlmIChkaXNjaXBsaW5lLmVDb250YWluZXIoKSA9PSBwa2cpIHsKLQkJCQkJcmVmcmVzaFBhcmVudCA9IHRydWU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJZGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGRpc2NpcGxpbmUuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJCXBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZGlzY2lwbGluZSk7Ci0JCQkJCX0gZWxzZSBpZiAoZGlzY2lwbGluZS5lQ29udGFpbmVyKCkgPT0gcGtnKSB7Ci0JCQkJCQlyZWZyZXNoUGFyZW50ID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCXJlZnJlc2hQYXJlbnQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHJlZnJlc2hQYXJlbnQpIHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCWdldFBhcmVudCh0YXJnZXQpLCB0cnVlLCBmYWxzZSkpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1dyYXBwaW5nTmVlZGVkKG9iamVjdCkpCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCXJldHVybiBUbmdVdGlsLmNyZWF0ZVdyYXBwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJaW5kZXgpOwotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JLy8gKi8KLQkvLyBwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gRGlzY2lwbGluZSBjaGlsZCA9IChEaXNjaXBsaW5lKSBpdGVyLm5leHQoKTsKLQkvLyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChEaXNjaXBsaW5lSXRlbVByb3ZpZGVyKQotCS8vIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGNoaWxkLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCS8vIGl0ZW1Qcm92aWRlci5zZXRQYXJlbnQob2JqZWN0KTsKLQkvLyB9Ci0JLy8gcmV0dXJuIGNoaWxkcmVuOwotCS8vIH0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJSURlZmF1bHROYW1lU2V0dGVyIGRlZmF1bHROYW1lU2V0dGVyID0gdGhpczsKLQkJaWYgKGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpICE9IG51bGwpIHsKLQkJCWludCBmZWF0dXJlSWQgPSBtc2cuZ2V0RmVhdHVyZUlEKGRlZmF1bHROYW1lU2V0dGVyCi0JCQkJCS5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSk7Ci0JCQlpZiAoZmVhdHVyZUlkID09IGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSkgewotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlzZXREZWZhdWx0TmFtZShtc2cuZ2V0TmV3VmFsdWUoKSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlzZXREZWZhdWx0TmFtZShpdGVyLm5leHQoKSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqLCBPYmplY3QgcGFyZW50KSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ESVNDSVBMSU5FOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQkvLyBNYWtpbmcgcGx1Z2luIGxldmVsIHVuaXF1ZW5lc3Mgb2YgZGlzY2lwbGluZSwgb24gcmVtb3ZpbmcgZGlzY2lwbGluZSByZWZlcmVuY2UgCi0JCQkvLyBmcm9tIGRpc2NpcGxpbmUgZ3JvdXBpbmcsIGRpc2NpcGxpbmUgZ29lcyBiYWNrIHRvIHRvcGxldmVsIGNhdXNpbmcgZHVwbGljYXRlLiAKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoVG5nVXRpbC5leHRyYWN0KAotCQkJCQkoKENvbnRlbnRQYWNrYWdlKSAoKChEaXNjaXBsaW5lR3JvdXBpbmcpIHBhcmVudCkKLQkJCQkJCQkuZUNvbnRhaW5lcigpKSkuZ2V0Q29udGVudEVsZW1lbnRzKCksCi0JCQkJCURpc2NpcGxpbmUuY2xhc3MpLCAoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRElTQ0lQTElORSk7Ci0JCX0KLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ESVNDSVBMSU5FOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoRGlzY2lwbGluZUdyb3VwaW5nKSB0YXJnZXQpCi0JCQkJCS5nZXREaXNjaXBsaW5lcygpLCAoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkVTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIERpc2NpcGxpbmVHcm91cGluZy5jbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSU1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDc2NDU4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBkaXNjaXBsaW5lLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5EaXNjaXBsaW5lSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUxpYnJhcnlJdGVtUHJvdmlkZXIsIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciwgSURlZmF1bHROYW1lU2V0dGVyIHsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0vLwkJaWYgKHBhcmVudCAhPSBudWxsKQotLy8JCQlyZXR1cm4gcGFyZW50OwotLy8JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJRGlzY2lwbGluZSBkaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpb2JqZWN0OwotCQlpZihkaXNjaXBsaW5lLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIERpc2NpcGxpbmUpewotCQkJcGFyZW50ID0gIHN1cGVyLmdldFBhcmVudChkaXNjaXBsaW5lKTsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQkJCi0JCU1ldGhvZFBsdWdpbiBtb2RlbCA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGRpc2NpcGxpbmUpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZ1tdIHBhdGggPSB7Ci0JCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQksCi0JCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCSwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCX07Ci0KLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0QWRhcHRlcihtb2RlbCwgcGF0aCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldERpc2NpcGxpbmVfU3ViZGlzY2lwbGluZSgpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNjaXBsaW5lKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQkvL3JldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlpZihjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfU3ViZGlzY2lwbGluZSgpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUodGhpcywgbm90aWZpY2F0aW9uKTsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGlzY2lwbGluZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX05BTUU6Ci0JCQlUbmdVdGlsLnJlZnJlc2hDb250cmlidXRvcnModGhpcywgbm90aWZpY2F0aW9uLCBmYWxzZSwgdHJ1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0tTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQkvLyByZWZyZXNoIHVuY2F0ZWdvcml6ZWQgdGFza3MgZm9sZGVyCi0JCQkvLyBUbmdVdGlsLnJlZnJlc2hBZGFwdGVyKExpYnJhcnlFZGl0Q29uc3RhbnRzLlVOQ0FURUdPUklaRURfVEFTS1NfUEFUSCwKLQkJCS8vIG5vdGlmaWNhdGlvbik7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsJCQotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJCQotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVfdHlwZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1dyYXBwaW5nTmVlZGVkKG9iamVjdCkpCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCXJldHVybiBUbmdVdGlsLmNyZWF0ZVdyYXBwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJaW5kZXgpOwotCX0KLQkKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gQ2hhbmdlIENhdGVnb3JpZXMgZGlzcGxheSBpbiBMaWJyYXJ5IE5hdmlnYXRvcgotCQkvLyAoY29tbWVudGVkIGZvciB0aGlzIGRlZmVjdCkKLQkJLy8gcmV0dXJuICEoKERpc2NpcGxpbmUpIG9iamVjdCkuZ2V0VGFza3MoKS5pc0VtcHR5KCk7Ci0JCS8vcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gc3VwZXIuaGFzQ2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJLy8gcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkKLQkJLy8gc3VwZXIuY3JlYXRlQWRkQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCQkvL3JldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQlDb2xsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCQlzZWxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCi0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoCi0JCQkJZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwgaW5kZXgpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCRElTQ0lQTElORTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBEaXNjaXBsaW5lLmNsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRElTQ0lQTElORTsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKERpc2NpcGxpbmUpIHRhcmdldCkuZ2V0U3ViZGlzY2lwbGluZSgpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCS8vcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZiAoY2hpbGRyZW4gaW5zdGFuY2VvZiBMaXN0KQotCQkJQ29sbGVjdGlvbnMuc29ydCgoTGlzdCkgY2hpbGRyZW4sIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0Q29tcGFyYXRvcigpKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Eb21haW5JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Eb21haW5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmU3OTkxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRG9tYWluSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZG9tYWluLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21haW5JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkRvbWFpbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlEZWZhdWx0TmFtZVNldHRlciwgSUxpYnJhcnlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRG9tYWluSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0RG9tYWluX1N1YmRvbWFpbnMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRG9tYWluKCkpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW5fU3ViZG9tYWlucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlEb21haW4gZG9tYWluID0gKERvbWFpbikgb2JqZWN0OwotCQlpZiAoZG9tYWluLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQl9Ci0JCU1ldGhvZFBsdWdpbiBtb2RlbCA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGRvbWFpbik7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nW10gcGF0aCA9IHsKLQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCSwKLQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Eb21haW5zX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQl9OwotCi0JCXJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIobW9kZWwsIHBhdGgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX0RvbWFpbl90eXBlIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCS8vVG5nVXRpbC5zZXREZWZhdWx0TmFtZSh0aGlzLCBub3RpZmljYXRpb24pOwotCQlzZXREZWZhdWx0TmFtZShub3RpZmljYXRpb24pOwotCi0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRG9tYWluLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCQlUbmdVdGlsLnJlZnJlc2hDb250cmlidXRvcnModGhpcywgbm90aWZpY2F0aW9uLCBmYWxzZSwgdHJ1ZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU5TOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZiAoY2hpbGRyZW4gaW5zdGFuY2VvZiBMaXN0KQotCQkJQ29sbGVjdGlvbnMuc29ydCgoTGlzdCkgY2hpbGRyZW4sIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UKLQkJCQkJLmdldENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCWlmICghaXNXcmFwcGluZ05lZWRlZChvYmplY3QpKQotCQkJcmV0dXJuIHZhbHVlOwotCQlyZXR1cm4gVG5nVXRpbC5jcmVhdGVXcmFwcGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlLAotCQkJCWluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjcmVhdGVXcmFwcGVycyhDb2xsZWN0aW9uIG9iamVjdHMpIHsKLQkJaWYgKHdyYXBwZXJzID09IG51bGwpIHsKLQkJCXdyYXBwZXJzID0gbmV3IERpc3Bvc2FibGUoKTsKLQkJfQotCQlGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyLmZpbGwod3JhcHBlcnMsIG51bGwsIG9iamVjdHMsIHRoaXMsCi0JCQkJYWRhcHRlckZhY3RvcnkpOwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3Qod3JhcHBlcnMpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShOb3RpZmljYXRpb24gbXNnKSB7Ci0JCUlEZWZhdWx0TmFtZVNldHRlciBkZWZhdWx0TmFtZVNldHRlciA9IHRoaXM7Ci0JCWlmIChkZWZhdWx0TmFtZVNldHRlci5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSAhPSBudWxsKSB7Ci0JCQlpbnQgZmVhdHVyZUlkID0gbXNnLmdldEZlYXR1cmVJRChkZWZhdWx0TmFtZVNldHRlcgotCQkJCQkuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkpOwotCQkJaWYgKGZlYXR1cmVJZCA9PSBkZWZhdWx0TmFtZVNldHRlci5nZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkpIHsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJc2V0RGVmYXVsdE5hbWUobXNnLmdldE5ld1ZhbHVlKCksIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJc2V0RGVmYXVsdE5hbWUoaXRlci5uZXh0KCksIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaiwgT2JqZWN0IHBhcmVudCkgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ET01BSU47Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChEb21haW4pIHBhcmVudCkKLQkJCQkJLmdldFN1YmRvbWFpbnMoKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwgYmFzZU5hbWUpOwotCQl9Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ET01BSU47Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChEb21haW4pIHRhcmdldCkuZ2V0U3ViZG9tYWlucygpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBEb21haW4uY2xhc3M7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCUNvbGxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQkJc2VsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKChBZGRDb21tYW5kKSBzdXBlci5jcmVhdGVBZGRDb21tYW5kKAotCQkJCWRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlciNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0RvbWFpbnNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Eb21haW5zSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQzOTgzZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0RvbWFpbnNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJEb21haW5zIiBmb2xkZXIuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERvbWFpbnNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBUcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRG9tYWluc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIHRhcmdldCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRhcmdldCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVEb21haW4oKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIERvbWFpbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRG9tYWlucyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRG9tYWluc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShUbmdVdGlsLmV4dHJhY3QoKChDb250ZW50UGFja2FnZSkgdGFyZ2V0KQotCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRzKCksIERvbWFpbi5jbGFzcyksIChNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ET01BSU4pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvUm9sZVNldENhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvUm9sZVNldENhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk5MzA2MjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1JvbGVTZXRDYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuRU1GRWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHJvbGUgc2V0IGdyb3VwaW5nLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVuYW1lZCBhcyBSb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIgaW4gRVBGIE01LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0Q2F0ZWdvcnlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlEZWZhdWx0TmFtZVNldHRlciwgSUxpYnJhcnlJdGVtUHJvdmlkZXIsIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIERpc3Bvc2FibGUgY2hpbGRyZW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlU2V0Q2F0ZWdvcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUm9sZVNldCgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgb2JqZWN0KTsKLQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCVN0cmluZ1tdIHBhdGggPSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSwKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQl9OwotCi0JCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0QWRhcHRlcihwbHVnaW4sIHBhdGgpOwotCQkJfQotCQl9Ci0KLQkJLy8gTWV0aG9kTW9kZWxJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKE1ldGhvZE1vZGVsSXRlbVByb3ZpZGVyKQotCQkvLyBUbmdVdGlsLmdldEFkYXB0ZXIoKEVPYmplY3QpbW9kZWwsIE1ldGhvZE1vZGVsSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gaWYoaXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJLy8gcmV0dXJuIGl0ZW1Qcm92aWRlci5nZXRSb2xlU2V0cygpOwotCQkvLyB9Ci0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kLkhlbHBlciNnZXRDcmVhdGVDaGlsZEltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZUNoaWxkSW1hZ2UoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlICYmIGNoaWxkIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRVJlZmVyZW5jZSByZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgZmVhdHVyZTsKLQkJCUVDbGFzcyBwYXJlbnRDbGFzcyA9IHJlZmVyZW5jZS5nZXRFQ29udGFpbmluZ0NsYXNzKCk7Ci0JCQlFQ2xhc3MgY2hpbGRDbGFzcyA9ICgoRU9iamVjdCkgY2hpbGQpLmVDbGFzcygpOwotCQkJU3RyaW5nIG5hbWUgPSAiZnVsbC9jdG9vbDE2L0NyZWF0ZSIgKyBwYXJlbnRDbGFzcy5nZXROYW1lKCkgKyAiXyIgKyByZWZlcmVuY2UuZ2V0TmFtZSgpICsgIl8iICsgY2hpbGRDbGFzcy5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl0cnkgewotCQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZShuYW1lKTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBFTUZFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL2N0b29sMTYvQ3JlYXRlQ2hpbGQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQotCQkvLyBTdHJpbmcgbGFiZWwgPSBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwKLQkJLy8gZ2V0U3RyaW5nKCJfVUlfUm9sZVNldEdyb3VwaW5nX3R5cGUiKSk7Ci0JCS8vIENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSA9IChDb250ZW50Q2F0ZWdvcnkpIG9iamVjdDsKLQkJLy8gaWYoY2F0ZWdvcnkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJLy8gTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPQotCQkvLyBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQkvLyBpZihiYXNlUGx1Z2luICE9IG51bGwpIHsKLQkJLy8gbGFiZWwgPSBsYWJlbCArICIgKGluaGVyaXRlZCBmcm9tICIgKyBiYXNlUGx1Z2luLmdldE5hbWUoKSArICcpJzsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIHJldHVybiBsYWJlbDsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX1JvbGVTZXRHcm91cGluZ190eXBlIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQkvLyBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDaGlsZHJlbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JLy8gRU9iamVjdCBvYmplY3QgPSAoRU9iamVjdClub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkvLyBDaGlsZHJlblN0b3JlIGNoaWxkcmVuU3RvcmUgPSBnZXRDaGlsZHJlblN0b3JlKG9iamVjdCk7Ci0JLy8JCQotCS8vIGlmIChjaGlsZHJlblN0b3JlICE9IG51bGwpCi0JLy8gewotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0KLQkvLyAoRVN0cnVjdHVyYWxGZWF0dXJlKW5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7Ci0JLy8gRUxpc3QgY2hpbGRyZW4gPSBjaGlsZHJlblN0b3JlLmdldExpc3QoZmVhdHVyZSk7Ci0JLy8gaWYgKGNoaWxkcmVuICE9IG51bGwpCi0JLy8gewotCS8vIGludCBpbmRleCA9IG5vdGlmaWNhdGlvbi5nZXRQb3NpdGlvbigpOwotCS8vCQkJCQotCS8vIHN3aXRjaCAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKQotCS8vIHsKLQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JLy8gewotCS8vIEVMaXN0IHZhbHVlcyA9IChFTGlzdClvYmplY3QuZUdldChmZWF0dXJlKTsKLQkvLwkJCQkJCQotCS8vIGlmICh2YWx1ZXMuc2l6ZSgpID09IDApCi0JLy8gewotCS8vIGRpc3Bvc2VXcmFwcGVycyhjaGlsZHJlbik7Ci0JLy8gcmV0dXJuOwotCS8vIH0KLQkvLyBicmVhazsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8JCQotCS8vIHN1cGVyLnVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJLy9UbmdVdGlsLnNldERlZmF1bHROYW1lKHRoaXMsIG5vdGlmaWNhdGlvbik7Ci0JCXNldERlZmF1bHROYW1lKG5vdGlmaWNhdGlvbik7Ci0JCQotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCUNvbnRlbnRQYWNrYWdlIHBrZzsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJvbGVTZXRHcm91cGluZy5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFM6Ci0KLQkJCXBrZyA9IChDb250ZW50UGFja2FnZSkgKChFT2JqZWN0KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkKLQkJCQkJLmVDb250YWluZXIoKTsKLQkJCVJvbGVTZXQgcm9sZVNldDsKLQkJCWJvb2xlYW4gcmVmcmVzaFBhcmVudCA9IGZhbHNlOwotCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQlyb2xlU2V0ID0gKFJvbGVTZXQpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJCWlmIChyb2xlU2V0LmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCXBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQocm9sZVNldCk7Ci0JCQkJfSBlbHNlIGlmIChyb2xlU2V0LmVDb250YWluZXIoKSA9PSBwa2cpIHsKLQkJCQkJcmVmcmVzaFBhcmVudCA9IHRydWU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJcm9sZVNldCA9IChSb2xlU2V0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKHJvbGVTZXQuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJCXBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQocm9sZVNldCk7Ci0JCQkJCX0gZWxzZSBpZiAocm9sZVNldC5lQ29udGFpbmVyKCkgPT0gcGtnKSB7Ci0JCQkJCQlyZWZyZXNoUGFyZW50ID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCXJlZnJlc2hQYXJlbnQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCWlmIChyZWZyZXNoUGFyZW50KSB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCQlnZXRQYXJlbnQodGFyZ2V0KSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gUm9sZVNldCBjaGlsZCA9IChSb2xlU2V0KSBpdGVyLm5leHQoKTsKLQkJLy8gUm9sZVNldEl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoUm9sZVNldEl0ZW1Qcm92aWRlcikKLQkJLy8gYWRhcHRlckZhY3RvcnkuYWRhcHQoY2hpbGQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCS8vIGl0ZW1Qcm92aWRlci5zZXRQYXJlbnQob2JqZWN0KTsKLQkJLy8gfQotCQlpZiAoY2hpbGRyZW4gaW5zdGFuY2VvZiBMaXN0KQotCQkJQ29sbGVjdGlvbnMuc29ydCgoTGlzdCkgY2hpbGRyZW4sIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0Q29tcGFyYXRvcigpKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCi0JCS8vIHJldHVybiBjcmVhdGVXcmFwcGVycyhjaGlsZHJlbik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlpZiAoIWlzV3JhcHBpbmdOZWVkZWQob2JqZWN0KSkKLQkJCXJldHVybiB2YWx1ZTsKLQkJcmV0dXJuIFRuZ1V0aWwuY3JlYXRlV3JhcHBlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQlpbmRleCk7Ci0JfQotCi0JLy8gcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKE9iamVjdCBvYmplY3QpIHsKLQkvLyBPYmplY3Qgd3JhcHBlciA9IFRuZ1V0aWwuY3JlYXRlV3JhcHBlcihhZGFwdGVyRmFjdG9yeSwgKEVPYmplY3QpIHRhcmdldCwKLQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKSwgb2JqZWN0LCAtMSk7Ci0JLy8gaWYod3JhcHBlcnMgPT0gbnVsbCkgewotCS8vIHdyYXBwZXJzID0gbmV3IERpc3Bvc2FibGUoKTsKLQkvLyB9Ci0JLy8gd3JhcHBlcnMuYWRkKHdyYXBwZXIpOwotCS8vIHJldHVybiB3cmFwcGVyOwotCS8vIH0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGNyZWF0ZVdyYXBwZXJzKENvbGxlY3Rpb24gb2JqZWN0cykgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgRGlzcG9zYWJsZSgpOwotCQl9Ci0JCUZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIuZmlsbChjaGlsZHJlbiwgbnVsbCwgb2JqZWN0cywgdGFyZ2V0LAotCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGNoaWxkcmVuKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoTm90aWZpY2F0aW9uIG1zZykgewotCQlJRGVmYXVsdE5hbWVTZXR0ZXIgZGVmYXVsdE5hbWVTZXR0ZXIgPSB0aGlzOwotCQlpZiAoZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgIT0gbnVsbCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoZGVmYXVsdE5hbWVTZXR0ZXIKLQkJCQkJLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpKTsKLQkJCWlmIChmZWF0dXJlSWQgPT0gZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpKSB7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCXNldERlZmF1bHROYW1lKG1zZy5nZXROZXdWYWx1ZSgpLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCXNldERlZmF1bHROYW1lKGl0ZXIubmV4dCgpLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmosIE9iamVjdCBwYXJlbnQpIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1JPTEVfU0VUOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQkvLyBNYWtpbmcgcGx1Z2luIGxldmVsIHVuaXF1ZW5lc3Mgb2Ygcm9sZXNldCwgb24gcmVtb3Zpbmcgcm9sZXNldCByZWZlcmVuY2UgCi0JCQkvLyBmcm9tIHJvbGVzZXQgZ3JvdXBpbmcsIHJvbGVzZXQgZ29lcyBiYWNrIHRvIHRvcGxldmVsIGNhdXNpbmcgZHVwbGljYXRlLiAKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoVG5nVXRpbC5leHRyYWN0KAotCQkJCQkoKENvbnRlbnRQYWNrYWdlKSAoKChSb2xlU2V0R3JvdXBpbmcpIHBhcmVudCkKLQkJCQkJCQkuZUNvbnRhaW5lcigpKSkuZ2V0Q29udGVudEVsZW1lbnRzKCksCi0JCQkJCQkJUm9sZVNldC5jbGFzcyksIChNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ST0xFX1NFVCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1JPTEVfU0VUOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoUm9sZVNldEdyb3VwaW5nKSB0YXJnZXQpLmdldFJvbGVTZXRzKCksCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmosIGJhc2VOYW1lKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBSb2xlU2V0R3JvdXBpbmcuY2xhc3M7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoCi0JCQkJZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwgaW5kZXgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1JvbGVTZXRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjFjY2JlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSByb2xlIHNldC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUm9sZVNldEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVNldEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlJvbGVTZXRJdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgb2JqZWN0KTsKLQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCVN0cmluZ1tdIHBhdGggPSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSwKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQl9OwotCi0JCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0QWRhcHRlcihwbHVnaW4sIHBhdGgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIGlmKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkvLyBjaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGVzKCkpOwotCQkvLyB9Ci0JCS8vIHJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCi0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUm9sZVNldC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19OQU1FOgotCQkJVG5nVXRpbC5yZWZyZXNoQ29udHJpYnV0b3JzKHRoaXMsIG5vdGlmaWNhdGlvbiwgZmFsc2UsIHRydWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fUk9MRVM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCi0JCQkvLyByZWZyZXNoIHdyYXBwZXJzCi0JCQkvLwotCQkJaWYgKHdyYXBwZXJzICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KHdyYXBwZXJzKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgaXRlcgotCQkJCQkJCS5uZXh0KCksIHRydWUsIGZhbHNlKSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyByZWZyZXNoIHVuY2F0ZWdvcml6ZWQgcm9sZXMKLQkJCS8vCi0JCQkvLyBUbmdVdGlsLnJlZnJlc2hBZGFwdGVyKExpYnJhcnlFZGl0Q29uc3RhbnRzLlVOQ0FURUdPUklaRURfUk9MRVNfUEFUSCwKLQkJCS8vIG5vdGlmaWNhdGlvbik7Ci0KLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlU2V0X3R5cGUiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCWlmICghaXNXcmFwcGluZ05lZWRlZChvYmplY3QpKQotCQkJcmV0dXJuIHZhbHVlOwotCQlyZXR1cm4gVG5nVXRpbC5jcmVhdGVXcmFwcGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlLAotCQkJCWluZGV4KTsKLQl9Ci0KLQkvLyBDaGFuZ2UgQ2F0ZWdvcmllcyBkaXNwbGF5IGluIExpYnJhcnkgTmF2aWdhdG9yCi0JLy8gQWRkIGJlbG93IG1ldGhvZCB0byBhdm9pZCBjaGlsZHJlbiBmb3IgdGhpcyBJdGVtUHJvdmlkZXIuICsKLQkvLyBzaWduIHRvby4KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCS8vICovCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCS8vIExpc3QgbmV3Q2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gUm9sZVNldCByb2xlU2V0ID0gKFJvbGVTZXQpIG9iamVjdDsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlU2V0LmdldFJvbGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gUm9sZSByb2xlID0gKFJvbGUpIGl0ZXIubmV4dCgpOwotCS8vIC8vIGxvb2sgaWYgdGhlcmUgaXMgYW4gZXhpc3RpbmcgT2JqZWN0TGlua0l0ZW1Qcm92aWRlciBmb3IgdGhpcyB0YXNrIGluCi0JLy8gdGhlIGN1cnJlbnQgY2hpbGRyZW4gbGlzdCBmaXJzdAotCS8vIC8vCi0JLy8gT2JqZWN0TGlua0l0ZW1Qcm92aWRlciBjaGlsZCA9IGZpbmRFeGlzdGluZ09iamVjdExpbmtJdGVtUHJvdmlkZXIocm9sZSk7Ci0JLy8gaWYoY2hpbGQgPT0gbnVsbCkgewotCS8vIGNoaWxkID0gbmV3IE9iamVjdExpbmtJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgcm9sZSk7Ci0JLy8gfQotCS8vIGVsc2UgewotCS8vIGNoaWxkcmVuLnJlbW92ZShjaGlsZCk7Ci0JLy8gfQotCS8vIG5ld0NoaWxkcmVuLmFkZChjaGlsZCk7Ci0JLy8gfQotCS8vIC8vIGRpc3Bvc2UgdGhlIG9sZCBjaGlsZHJlbgotCS8vIC8vCi0JLy8gaWYoY2hpbGRyZW4gIT0gbnVsbCkgewotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIE9iamVjdExpbmtJdGVtUHJvdmlkZXIgY2hpbGQgPSAoT2JqZWN0TGlua0l0ZW1Qcm92aWRlcikgaXRlci5uZXh0KCk7Ci0JLy8gY2hpbGQuZGlzcG9zZSgpOwotCS8vIH0KLQkvLyB9Ci0JLy8gY2hpbGRyZW4gPSBuZXdDaGlsZHJlbjsKLQkvLyByZXR1cm4gY2hpbGRyZW47Ci0JLy8gfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCS8vIHJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpCi0JCS8vIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwgaW5kZXgpKTsKLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvUm9sZVNldHNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Sb2xlU2V0c0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MWVkMmRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Sb2xlU2V0c0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiUm9sZSBTZXRzIiBmb2xkZXIuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRzSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJvbGVTZXRzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQ29udGVudFBhY2thZ2UgdGFyZ2V0LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgdGFyZ2V0LCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNhdGVnb3J5LlRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlciNpc0luaGVyaXRlZChvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeSkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luaGVyaXRlZChDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQkJcmV0dXJuIChjYXRlZ29yeSBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZyB8fCBjYXRlZ29yeSBpbnN0YW5jZW9mIFJvbGVTZXQpCi0JCQkJJiYgY2F0ZWdvcnkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVSb2xlU2V0R3JvdXBpbmcoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVSb2xlU2V0KCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBhY2NlcHQob2JqKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZwotCQkJCXx8IChvYmogaW5zdGFuY2VvZiBSb2xlU2V0ICYmIEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkuZ2V0Um9sZVNldEdyb3VwcygoUm9sZVNldCkgb2JqKS5pc0VtcHR5KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUm9sZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoVG5nVXRpbC5leHRyYWN0KCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCBSb2xlU2V0R3JvdXBpbmcuY2xhc3MpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUk9MRV9TRVRfR1JPVVBJTkcpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoVG5nVXRpbC5leHRyYWN0KCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCBSb2xlU2V0LmNsYXNzKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1JPTEVfU0VUKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1N0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1N0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZWZmNTMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9TdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiU3RhbmRhcmQgQ2F0ZWdvcmllcyIgZm9sZGVyLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElHcm91cENvbnRhaW5lciB7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBjaGlsZHJlbjsKLQotCXByaXZhdGUgTWFwIGdyb3VwSXRlbVByb3ZpZGVyTWFwOwotCi0JcHVibGljIFN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU5vdGlmaWVyIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCS8vIChjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkvLyAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCksCi0JCS8vIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvU3RhbmRhcmRDYXRlZ29yaWVzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmIChtc2cuZ2V0Tm90aWZpZXIoKSA9PSB0YXJnZXQpIHsKLQkJCWludCBmZWF0dXJlSWQgPSBtc2cuZ2V0RmVhdHVyZUlEKENvbnRlbnRQYWNrYWdlLmNsYXNzKTsKLQkJCWlmIChmZWF0dXJlSWQgPT0gVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTKSB7Ci0JCQkJYm9vbGVhbiBub3RpZnkgPSBmYWxzZTsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5NT1ZFOgotCQkJCQlPYmplY3Qgb2JqID0gbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCW5vdGlmeSA9IGFjY2VwdEFzQ2hpbGQob2JqKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlvYmogPSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJbm90aWZ5ID0gYWNjZXB0QXNDaGlsZChvYmopOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlmb3JfY2hlY2s6IGZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlpZiAoYWNjZXB0QXNDaGlsZChpdGVyLm5leHQoKSkpIHsKLQkJCQkJCQlub3RpZnkgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGZvcl9jaGVjazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJZm9yX2NoZWNrOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJaWYgKGFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCQkJCQkJbm90aWZ5ID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmb3JfY2hlY2s7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0KLQkJCQl9Ci0JCQkJaWYgKG5vdGlmeSkgewotCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG1zZywgdGhpcywgdHJ1ZSwKLQkJCQkJCQlmYWxzZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJLy8gaWYob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJLy8gVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKENvbnRlbnRQYWNrYWdlKXRhcmdldCkuZ2V0Q2hpbGRQYWNrYWdlcygpLAotCQkvLyAoTWV0aG9kRWxlbWVudCkgb2JqLCAiTmV3IENvbnRlbnQgUGFja2FnZSIpOwotCQkvLyB9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBDb250ZW50UGFja2FnZS5jbGFzczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlTdHJpbmcgbmFtZTsKLQkJCUlMaWJyYXJ5SXRlbVByb3ZpZGVyIGNoaWxkOwotCi0JCQkvLyBjcmVhdGUgdGhlIGRpc2NpcGxpbmVzIGNhdGVnb3JpZXMgZm9sZGVyCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbAotCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChFbGVtZW50KSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIG9iamVjdCkKLQkJCQkJCQkuZ2V0VGFyZ2V0KCkpOwotCQkJQ29udGVudFBhY2thZ2UgY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCQkJaWYgKGNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljaGlsZCA9IG5ldyBEaXNjaXBsaW5lQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkJCWNvbnRlbnRQa2csIG5hbWUpOwotCQkJCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCX0KLQotCQkJLy8gY3JlYXRlIGRvbWFpbiBjYXRlZ29yaWVzIGZvbGRlcgotCQkJY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kb21haW5QYXRoKTsKLQkJCWlmIChjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Eb21haW5zX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljaGlsZCA9IG5ldyBEb21haW5zSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnLAotCQkJCQkJbmFtZSk7Ci0JCQkJY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJCX0KLQotCQkJLy8gY3JlYXRlIHdvcmsgcHJvZHVjdCB0eXBlcyBmb2xkZXIKLQkJCWNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCk7Ci0JCQlpZiAoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQkJY2hpbGQgPSBuZXcgV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkJCWNvbnRlbnRQa2csIG5hbWUpOwotCQkJCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCQl9Ci0KLQkJCS8vIGNyZWF0ZSByb2xlIHNldCBmb2xkZXIKLQkJCWNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCQkJaWYgKGNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQkJY2hpbGQgPSBuZXcgUm9sZVNldHNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2csCi0JCQkJCQluYW1lKTsKLQkJCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJfQotCi0JCQkvLyBjcmVhdGUgdG9vbCBmb2xkZXIKLQkJCWNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGgpOwotCQkJaWYgKGNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Ub29sc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQkJY2hpbGQgPSBuZXcgVG9vbHNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2csIG5hbWUpOwotCQkJCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXIjZ2V0R3JvdXBJdGVtUHJvdmlkZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEdyb3VwSXRlbVByb3ZpZGVyKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBncm91cEl0ZW1Qcm92aWRlck1hcC5nZXQobmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvVG9vbEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1Rvb2xJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGE1OTZiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvVG9vbEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBhIHRvb2wuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRvb2xJdGVtUHJvdmlkZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlRvb2xJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJTGlicmFyeUl0ZW1Qcm92aWRlciwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRvb2xJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIG9iamVjdCk7Ci0JCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCQlTdHJpbmdbXSBwYXRoID0gewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQksCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSwKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Rvb2xzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCX07Ci0KLQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRBZGFwdGVyKHBsdWdpbiwgcGF0aCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2xfVG9vbE1lbnRvcnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGlzY2lwbGluZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19OQU1FOgotCQkJVG5nVXRpbC5yZWZyZXNoQ29udHJpYnV0b3JzKHRoaXMsIG5vdGlmaWNhdGlvbiwgZmFsc2UsIHRydWUpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbCgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QsCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVG9vbF90eXBlIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlpZiAoIWlzV3JhcHBpbmdOZWVkZWQob2JqZWN0KSkKLQkJCXJldHVybiB2YWx1ZTsKLQkJcmV0dXJuIFRuZ1V0aWwuY3JlYXRlV3JhcHBlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQlpbmRleCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1Rvb2xzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvVG9vbHNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDI2MzQ4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvVG9vbHNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiVG9vbHMiIGZvbGRlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVG9vbHNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBUcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVG9vbHNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSB0YXJnZXQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0YXJnZXQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVG9vbCgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgVG9vbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1Rvb2xzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIFRvb2wgY2hpbGQgPSAoVG9vbCkgaXRlci5uZXh0KCk7Ci0JCS8vIFRvb2xJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKFRvb2xJdGVtUHJvdmlkZXIpCi0JCS8vIFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KS5hZGFwdChjaGlsZCwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gaXRlbVByb3ZpZGVyLnNldFBhcmVudChvYmplY3QpOwotCQkvLyB9Ci0KLQkJLy8gQ2hhbmdlIENhdGVnb3JpZXMgZGlzcGxheSBpbiBMaWJyYXJ5IE5hdmlnYXRvcgotCQkvLyAoY29tbWVudGVkIGZvciB0aGlzIGRlZmVjdCkKLQkJLy8gTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFbGVtZW50KQotCQkvLyAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpb2JqZWN0KS5nZXRUYXJnZXQoKSk7Ci0JCS8vIENvbnRlbnRQYWNrYWdlIGNvcmVDb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkvLyBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0JCS8vIFVuY2F0ZWdvcml6ZWRUb29sTWVudG9yc0l0ZW1Qcm92aWRlciB1bmNhdGVnb3JpemVkID0gbmV3Ci0JCS8vIFVuY2F0ZWdvcml6ZWRUb29sTWVudG9yc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29yZUNvbnRlbnRQa2cpOwotCQkvLyBjaGlsZHJlbi5hZGQodW5jYXRlZ29yaXplZCk7Ci0JCS8vIGlmKGdyb3VwSXRlbVByb3ZpZGVyTWFwID09IG51bGwpIHsKLQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkvLyB9Ci0JCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dCh1bmNhdGVnb3JpemVkLmdldFRleHQobnVsbCksIHVuY2F0ZWdvcml6ZWQpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRvb2wpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoVG5nVXRpbC5leHRyYWN0KCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCBUb29sLmNsYXNzKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1RPT0wpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU3NzI4OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1RyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgY2F0ZWdvcnkgZm9sZGVycy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciBpbiBFUEYgTTUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUdyb3VwQ29udGFpbmVyIHsKLQotCXByb3RlY3RlZCBNYXAgZ3JvdXBJdGVtUHJvdmlkZXJNYXA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJT2JqZWN0IHVuY2F0ZWdvcml6ZWQgPSBjcmVhdGVVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKCk7Ci0JCWlmICh1bmNhdGVnb3JpemVkICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuLmFkZCh1bmNhdGVnb3JpemVkKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmIChtc2cuZ2V0Tm90aWZpZXIoKSA9PSB0YXJnZXQpIHsKLQkJCWludCBmZWF0dXJlSWQgPSBtc2cuZ2V0RmVhdHVyZUlEKENvbnRlbnRQYWNrYWdlLmNsYXNzKTsKLQkJCWlmIChmZWF0dXJlSWQgPT0gVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMpIHsKLQkJCQlib29sZWFuIG5vdGlmeSA9IGZhbHNlOwotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLk1PVkU6Ci0JCQkJCU9iamVjdCBvYmogPSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJbm90aWZ5ID0gYWNjZXB0QXNDaGlsZChvYmopOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCW9iaiA9IG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWZvcl9jaGVjazogZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCWlmIChhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZm9yX2NoZWNrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQljb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlmb3JfY2hlY2s6IGZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlpZiAoYWNjZXB0QXNDaGlsZChpdGVyLm5leHQoKSkpIHsKLQkJCQkJCQlub3RpZnkgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGZvcl9jaGVjazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKG5vdGlmeSkgewotCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG1zZywgdGhpcywgdHJ1ZSwKLQkJCQkJCQlmYWxzZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmhlcml0ZWQoQ29udGVudENhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCXJldHVybiBhY2NlcHRBc0NoaWxkKGNhdGVnb3J5KQotCQkJCSYmIGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gQ29udGVudFBhY2thZ2UuY2xhc3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXIjZ2V0R3JvdXBJdGVtUHJvdmlkZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEdyb3VwSXRlbVByb3ZpZGVyKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChncm91cEl0ZW1Qcm92aWRlck1hcCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBncm91cEl0ZW1Qcm92aWRlck1hcC5nZXQobmFtZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1dvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1dvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjBlY2E3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Xb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZWl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB3b3JrIHByb2R1Y3Qga2luZC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgV29ya1Byb2R1Y3RLaW5kSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Xb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJTGlicmFyeUl0ZW1Qcm92aWRlciwgSVdyYXBwZXIsIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIG9iamVjdCk7Ci0JCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCQlTdHJpbmdbXSBwYXRoID0gewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQksCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSwKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCX07Ci0KLQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRBZGFwdGVyKHBsdWdpbiwgcGF0aCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERpc2NpcGxpbmUuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTkFNRToKLQkJCVRuZ1V0aWwucmVmcmVzaENvbnRyaWJ1dG9ycyh0aGlzLCBub3RpZmljYXRpb24sIGZhbHNlLCB0cnVlKTsKLQkJCWJyZWFrOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlpZiAoIWlzV3JhcHBpbmdOZWVkZWQob2JqZWN0KSkKLQkJCXJldHVybiB2YWx1ZTsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCXJldHVybiBuZXcgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcihmZWF0dXJlLCB2YWx1ZSwgb2JqZWN0LAotCQkJCQlhZGFwdGVyRmFjdG9yeSkgewotCQkJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIFRuZ1V0aWwuY3JlYXRlV3JhcHBlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQlpbmRleCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyBDaGFuZ2UgQ2F0ZWdvcmllcyBkaXNwbGF5IGluIExpYnJhcnkgTmF2aWdhdG9yCi0JCS8vIHJldHVybiAhKChXb3JrUHJvZHVjdFR5cGUpIG9iamVjdCkuZ2V0V29ya1Byb2R1Y3RzKCkuaXNFbXB0eSgpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciN3cmFwKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBPYmplY3Qgd3JhcChFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlyZXR1cm4gc3VwZXIud3JhcChvYmplY3QsIGZlYXR1cmUsIHZhbHVlLCBpbmRleCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1dvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWMwZGUyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIldvcmsgUHJvZHVjdCBLaW5kcyIgZm9sZGVyLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVuYW1lZCBhcyBXb3JrUHJvZHVjdEtpbmRzSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQ29udGVudFBhY2thZ2UgdGFyZ2V0LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgdGFyZ2V0LCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gV29ya1Byb2R1Y3RUeXBlIGNoaWxkID0gKFdvcmtQcm9kdWN0VHlwZSkgaXRlci5uZXh0KCk7Ci0JCS8vIFdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPQotCQkvLyAoV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyKQotCQkvLyBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSkuYWRhcHQoY2hpbGQsCi0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCS8vIGl0ZW1Qcm92aWRlci5zZXRQYXJlbnQob2JqZWN0KTsKLQkJLy8gfQotCi0JCS8vIENoYW5nZSBDYXRlZ29yaWVzIGRpc3BsYXkgaW4gTGlicmFyeSBOYXZpZ2F0b3IKLQkJLy8gKGNvbW1lbnRlZCBmb3IgdGhpcyBkZWZlY3QpCi0JCS8vIE1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRWxlbWVudCkKLQkJLy8gKChJdGVtUHJvdmlkZXJBZGFwdGVyKW9iamVjdCkuZ2V0VGFyZ2V0KCkpOwotCQkvLyBDb250ZW50UGFja2FnZSBjb3JlQ29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJLy8gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCQkvLyBXb3JrUHJvZHVjdFR5cGVVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgdW5jYXRlZ29yaXplZCA9Ci0JCS8vIG5ldwotCQkvLyBXb3JrUHJvZHVjdFR5cGVVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCS8vIGNvcmVDb250ZW50UGtnKTsKLQkJLy8gY2hpbGRyZW4uYWRkKHVuY2F0ZWdvcml6ZWQpOwotCQkvLyBpZihncm91cEl0ZW1Qcm92aWRlck1hcCA9PSBudWxsKSB7Ci0JCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJLy8gfQotCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQodW5jYXRlZ29yaXplZC5nZXRUZXh0KG51bGwpLCB1bmNhdGVnb3JpemVkKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoVG5nVXRpbC5leHRyYWN0KCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCBXb3JrUHJvZHVjdFR5cGUuY2xhc3MpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfV09SS19QUk9EVUNUX1RZUEUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDM3NmIyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZGlzcGxheSBhbmQgZWRpdGluZyBzdXBwb3J0IGZvciBzdGFuZGFyZCBhbmQgY3VzdG9tIGNhdGVnb3JpZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQWN0aW9uTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MGEzNzk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0FjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuU2V0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgZXhlY3V0aW9uIG9mIGVkaXRpbmcgY29tbWFuZHMgd2l0aCBmdWxsIHN1cHBvcnQgZm9yIGRpcnR5IGZsYWcsCi0gKiB1bmRvIGFuZCByZWRvLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uTWFuYWdlciBpbXBsZW1lbnRzIElBY3Rpb25NYW5hZ2VyIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgTWFwIFJFU09VUkNFX1RPX01PRElGSUVSU19NQVAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0KLQlwcml2YXRlIEZ1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjayBjb21tYW5kU3RhY2s7Ci0KLQlwdWJsaWMgQWN0aW9uTWFuYWdlcigpIHsKLQkJY29tbWFuZFN0YWNrID0gY3JlYXRlQ29tbWFuZFN0YWNrKCk7Ci0JCWVkaXRpbmdEb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJY29tbWFuZFN0YWNrKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrIGNyZWF0ZUNvbW1hbmRTdGFjaygpIHsKLQkJcmV0dXJuIG5ldyBGdWxseVJldmVydGlibGVDb21tYW5kU3RhY2sodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJBc01vZGlmaWVyT2YoRU9iamVjdCBvYmplY3QpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBvYmplY3QuZVJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlyZWdpc3RlckFzTW9kaWZpZXJPZihyZXNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJBc01vZGlmaWVyT2YoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJc3luY2hyb25pemVkIChSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQKSB7Ci0JCQlTZXQgbW9kcyA9IChTZXQpIFJFU09VUkNFX1RPX01PRElGSUVSU19NQVAuZ2V0KHJlc291cmNlKTsKLQkJCWlmIChtb2RzID09IG51bGwpIHsKLQkJCQltb2RzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQLnB1dChyZXNvdXJjZSwgbW9kcyk7Ci0JCQl9Ci0JCQltb2RzLmFkZCh0aGlzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVucmVnaXN0ZXJBc01vZGlmaWVyKCkgewotCQlzeW5jaHJvbml6ZWQgKFJFU09VUkNFX1RPX01PRElGSUVSU19NQVApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE1vZGlmaWVkUmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQlTZXQgbW9kcyA9IChTZXQpIFJFU09VUkNFX1RPX01PRElGSUVSU19NQVAuZ2V0KHJlc291cmNlKTsKLQkJCQlpZiAobW9kcyAhPSBudWxsKSB7Ci0JCQkJCW1vZHMucmVtb3ZlKHRoaXMpOwotCQkJCQlpZiAobW9kcy5pc0VtcHR5KCkpIHsKLQkJCQkJCS8vIHNhdmUgdGhlIHJlc291cmNlIGJlZm9yZSBpdCByZW1vdmVkIGZyb20KLQkJCQkJCS8vIFJFU09VUkNFX1RPX01PRElGSUVSU19NQVAKLQkJCQkJCS8vIAotCQkJCQkJc2F2ZShyZXNvdXJjZSk7Ci0JCQkJCQlSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQLnJlbW92ZShyZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBkb0FjdGlvbihpbnQgYWN0aW9uVHlwZSwgRU9iamVjdCBvYmplY3QsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJQ29tbWFuZCBjbWQgPSBudWxsOwotCQlPYmplY3Qgb2xkVmFsdWUgPSBudWxsOwotCQlzd2l0Y2ggKGFjdGlvblR5cGUpIHsKLQkJY2FzZSBBREQ6IHsKLQkJCWlmIChpbmRleCA+PSAwKSB7Ci0JCQkJY21kID0gbmV3IEFkZENvbW1hbmQoZWRpdGluZ0RvbWFpbiwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQkJCWluZGV4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJY21kID0gbmV3IEFkZENvbW1hbmQoZWRpdGluZ0RvbWFpbiwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIEFERF9NQU5ZOiB7Ci0JCQlpZiAoaW5kZXggPj0gMCkgewotCQkJCWNtZCA9IG5ldyBBZGRDb21tYW5kKGVkaXRpbmdEb21haW4sIG9iamVjdCwgZmVhdHVyZSwKLQkJCQkJCShDb2xsZWN0aW9uKSB2YWx1ZSwgaW5kZXgpOwotCQkJfSBlbHNlIHsKLQkJCQljbWQgPSBuZXcgQWRkQ29tbWFuZChlZGl0aW5nRG9tYWluLCBvYmplY3QsIGZlYXR1cmUsCi0JCQkJCQkoQ29sbGVjdGlvbikgdmFsdWUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBSRU1PVkU6IHsKLQkJCWNtZCA9IG5ldyBSZW1vdmVDb21tYW5kKGVkaXRpbmdEb21haW4sIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBSRU1PVkVfTUFOWTogewotCQkJY21kID0gbmV3IFJlbW92ZUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwgb2JqZWN0LCBmZWF0dXJlLAotCQkJCQkoQ29sbGVjdGlvbikgdmFsdWUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBTRVQ6IHsKLQkJCW9sZFZhbHVlID0gb2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAoKG9sZFZhbHVlICE9IG51bGwgJiYgIW9sZFZhbHVlLmVxdWFscyh2YWx1ZSkpCi0JCQkJCXx8IChvbGRWYWx1ZSA9PSBudWxsICYmIHZhbHVlICE9IG51bGwpKSB7Ci0JCQkJY21kID0gbmV3IFNldENvbW1hbmQoZWRpdGluZ0RvbWFpbiwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQl9Ci0JCWlmIChjbWQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbW1hbmRTdGFjay5kb0V4ZWN1dGUoY21kKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJY29tbWFuZFN0YWNrLnVuZG8oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQljb21tYW5kU3RhY2sucmVkbygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVuZG9BbGwoKSB7Ci0JCWJvb2xlYW4gYiA9IGNvbW1hbmRTdGFjay51bmRvQWxsKCk7Ci0JCXVucmVnaXN0ZXJBc01vZGlmaWVyKCk7Ci0JCS8vIGZpcmVOb3RpZnlDaGFuZ2VkKG51bGwpOwotCQlyZXR1cm4gYjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlSXNEb25lKCkgewotCQljb21tYW5kU3RhY2suc2F2ZUlzRG9uZSgpOwotCQl1bnJlZ2lzdGVyQXNNb2RpZmllcigpOwotCQkvLyBmaXJlTm90aWZ5Q2hhbmdlZChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVOZWVkZWQoKSB7Ci0JCWJvb2xlYW4gcmV0ID0gY29tbWFuZFN0YWNrLmlzU2F2ZU5lZWRlZCgpOwotCQlpZiAoIXJldCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGdldE1vZGlmaWVkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWNvbW1hbmRTdGFjay5mbHVzaCgpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlzeW5jaHJvbml6ZWQgKFJFU09VUkNFX1RPX01PRElGSUVSU19NQVApIHsKLQkJCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gUkVTT1VSQ0VfVE9fTU9ESUZJRVJTX01BUC5lbnRyeVNldCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlTZXQgbW9kcyA9IChTZXQpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJaWYgKG1vZHMuY29udGFpbnModGhpcykpIHsKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGVudHJ5LmdldEtleSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JCX0KLQl9Ci0KLQkvLyBwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JLy8gY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkvLyB9Ci0JLy8KLQkvLyBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCS8vIGNoYW5nZU5vdGlmaWVyLmFkZChub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCS8vIH0KLQkvLwotCS8vIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKQotCS8vIHsKLQkvLyBjaGFuZ2VOb3RpZmllci5yZW1vdmUobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQkvLyB9Ci0KLQkvKioKLQkgKiBEb2VzIG5vdGhpbmcgaGVyZSwgc3ViY2xhc3Mgc2hvdWxkIGltcGxlbWVudCB0byBwcm92aWRlIHNhdmluZyB0aGUKLQkgKiByZXNvdXJjZSBiZWZvcmUgaXQgZ290IHJlbW92ZWQgZnJvbSBSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZShSZXNvdXJjZSByZXNvdXJjZSkgewotCX0KLQotCXB1YmxpYyBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlyZXR1cm4gY29tbWFuZFN0YWNrOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVJlc291cmNlQXdhcmVDb21tYW5kIGNtZCkgewotCQlpZiAoY21kICE9IG51bGwpIHsKLQkJCXJldHVybiBjb21tYW5kU3RhY2suZG9FeGVjdXRlKGNtZCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQWRkVG9DYXRlZ29yeUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0FkZFRvQ2F0ZWdvcnlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3NWZkMjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQWRkVG9DYXRlZ29yeUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NaXNjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGFzc2lnbiBhIG1ldGhvZCBlbGVtZW50IHRvIGEgY2F0ZWdvcnkuIElmIHRoZSBjYXRlZ29yeQotICogaXMgaW4gYSBiYXNlIG1ldGhvZCBwbHVnLWluIG9mIHRoZSBlbGVtZW50LCB0aGlzIGNvbW1hbmQgd2lsbCBhdXRvbWF0aWNhbGx5Ci0gKiBjcmVhdGUgYSBjb250cmlidXRvciB0byB0aGUgYmFzZSBjYXRlZ29yeSBhbmQgYXNzaWduIHRoZSBlbGVtZW50IHRvIHRoZQotICogY29udHJpYnV0aW5nIGNhdGVnb3J5LiBUaGlzIGlzIGF2b2lkcyBtb2RpZnlpbmcgdGhlIGJhc2UgbWV0aG9kIHBsdWctaW4uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRUb0NhdGVnb3J5Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeTsKLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQotCXByaXZhdGUgU3RyaW5nW10gY2F0ZWdvcnlQa2dQYXRoOwotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrRm9yRXhpc3RpbmdDb250cmlidXRvcjsKLQotCXByaXZhdGUgQ29udGVudENhdGVnb3J5IHVzZWRDYXRlZ29yeSA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY3JlYXRlTmV3Q29udHJpYnV0b3IgPSBmYWxzZTsKLQotCXByaXZhdGUgQ29udGVudFBhY2thZ2UgY2F0ZWdvcnlQa2c7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIE9iamVjdCBvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZTsKLQotCXB1YmxpYyBBZGRUb0NhdGVnb3J5Q29tbWFuZChDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnksCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJU3RyaW5nW10gY2F0ZWdvcnlQa2dQYXRoLCBib29sZWFuIGNoZWNrRm9yRXhpc3RpbmdDb250cmlidXRvcikgewotCQl0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMuY2F0ZWdvcnlQa2dQYXRoID0gY2F0ZWdvcnlQa2dQYXRoOwotCQl0aGlzLmNoZWNrRm9yRXhpc3RpbmdDb250cmlidXRvciA9IGNoZWNrRm9yRXhpc3RpbmdDb250cmlidXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQkvLyBjaGVjayBpZiB0aGlzIG9wZXJhdGlvbiB3aWxsIG1vZGlmeSB0aGUgZWxlbWVudCBpbiBvcHBvc2l0ZSBmZWF0dXJlCi0JCS8vIHZhbHVlCi0JCS8vCi0JCXJldHVybiBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnlPcHBvc2l0ZShjYXRlZ29yeSwgZmVhdHVyZSwKLQkJCQllbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0TGFiZWwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiAiQWRkIFRvIENhdGVnb3J5IjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkvLyBjcmVhdGUgY29udHJpYnV0b3IgZm9yIGNhdGVnb3J5IGlmIGl0IGlzIG5vdCBpbiB0aGUgc2FtZSBwbHVnaW4gd2l0aAotCQkvLyB0aGUgZWxlbWVudAotCQkvLwotCQlNZXRob2RQbHVnaW4gZWxlbWVudFBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQlNZXRob2RQbHVnaW4gY2F0ZWdvcnlQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjYXRlZ29yeSk7Ci0JCWlmIChjYXRlZ29yeVBsdWdpbiAhPSBlbGVtZW50UGx1Z2luCi0JCQkJJiYgTWlzYy5pc0Jhc2VPZihjYXRlZ29yeVBsdWdpbiwgZWxlbWVudFBsdWdpbikpIHsKLQkJCWlmIChjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkiQ291bGQgbm90IGFkZCBlbGVtZW50IHRvIGFuIGV4dGVuZGVkIGNhdGVnb3J5IHRoYXQgaXMgaW4gYSBkaWZmZXJlbnQgcGx1Zy1pbjogIiArIGNhdGVnb3J5KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKCFmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQljYXRlZ29yeVBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGVsZW1lbnRQbHVnaW4sCi0JCQkJCWNhdGVnb3J5UGtnUGF0aCk7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY29udHJpYiA9IG51bGw7Ci0JCQlpZiAoY2hlY2tGb3JFeGlzdGluZ0NvbnRyaWJ1dG9yKSB7Ci0JCQkJLy8gbG9vayBmb3IgdGhlIGV4aXN0aW5nIGNvbnRyaWJ1dG9yIGZvciB0aGUgY2F0ZWdvcnkKLQkJCQkvLwotCQkJCWNvbnRyaWIgPSBUbmdVdGlsLmZpbmRDb250cmlidXRvcihjYXRlZ29yeVBrZywgY2F0ZWdvcnkpOwotCQkJfQotCi0JCQlpZiAoY29udHJpYiA9PSBudWxsKSB7Ci0JCQkJY3JlYXRlTmV3Q29udHJpYnV0b3IgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQl1c2VkQ2F0ZWdvcnkgPSBjb250cmliOwotCQkJfQotCQl9IGVsc2UgewotCQkJdXNlZENhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JCX0KLQotCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJcmVkbygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWlmIChjcmVhdGVOZXdDb250cmlidXRvcikgewotCQkJQ29udGVudENhdGVnb3J5IGNvbnRyaWIgPSAoQ29udGVudENhdGVnb3J5KSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlKGNhdGVnb3J5LmVDbGFzcygpKTsKLQkJCWNvbnRyaWIuc2V0TmFtZShjYXRlZ29yeS5nZXROYW1lKCkpOwotCQkJY29udHJpYi5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KGNhdGVnb3J5KTsKLQkJCWNvbnRyaWIuc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFU19MSVRFUkFMKTsKLQkJCWNhdGVnb3J5UGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChjb250cmliKTsKLQkJCXVzZWRDYXRlZ29yeSA9IGNvbnRyaWI7Ci0JCQlpZiAodXNlZENhdGVnb3J5IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlDdXN0b21DYXRlZ29yeSByb290ID0gVG5nVXRpbC5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkoVW1hVXRpbAotCQkJCQkJLmdldE1ldGhvZFBsdWdpbih1c2VkQ2F0ZWdvcnkpKTsKLQkJCQlMaXN0IGxpc3QgPSByb290LmdldENhdGVnb3JpemVkRWxlbWVudHMoKTsKLQkJCQlsaXN0LmFkZCh1c2VkQ2F0ZWdvcnkpOwotCQkJfQotCQl9Ci0JCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSBPcHBvc2l0ZUZlYXR1cmUKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlKGZlYXR1cmUpOwotCQlNdWx0aVJlc291cmNlRU9iamVjdCBtckVPYmogPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGVsZW1lbnQ7Ci0JCW9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlID0gbXJFT2JqLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmdldCgKLQkJCQlvcHBvc2l0ZUZlYXR1cmUpOwotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHVzZWRDYXRlZ29yeS5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlICE9IG51bGwgJiYgIW9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCWlmIChvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSAhPSB1c2VkQ2F0ZWdvcnkpIHsKLQkJCQkJRU9iamVjdCBvbGRPcHBWYWwgPSAoRU9iamVjdCkgb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWU7Ci0JCQkJCSgoQ29sbGVjdGlvbikgb2xkT3BwVmFsLmVHZXQoZmVhdHVyZSkpLnJlbW92ZShlbGVtZW50KTsKLQkJCQkJaWYgKG9sZE9wcFZhbC5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQob2xkT3BwVmFsLmVSZXNvdXJjZSgpKTsKLQkJCQkJfQotCi0JCQkJCWNvbGxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJCWlmICghY29sbGVjdGlvbi5jb250YWlucyhlbGVtZW50KSkgewotCQkJCWNvbGxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlICE9IG51bGwgJiYgIW9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCWlmIChvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSAhPSB1c2VkQ2F0ZWdvcnkpIHsKLQkJCQkJRU9iamVjdCBvbGRPcHBWYWwgPSAoRU9iamVjdCkgb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWU7Ci0JCQkJCW9sZE9wcFZhbC5lU2V0KGZlYXR1cmUsIG51bGwpOwotCQkJCQlpZiAob2xkT3BwVmFsLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChvbGRPcHBWYWwuZVJlc291cmNlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHVzZWRDYXRlZ29yeSAhPSBvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSkgewotCQkJCXVzZWRDYXRlZ29yeS5lU2V0KGZlYXR1cmUsIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHVzZWRDYXRlZ29yeS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQodXNlZENhdGVnb3J5LmVSZXNvdXJjZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSBPcHBvc2l0ZUZlYXR1cmUKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlKGZlYXR1cmUpOwotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHVzZWRDYXRlZ29yeS5lR2V0KGZlYXR1cmUpOwotCQkJY29sbGVjdGlvbi5yZW1vdmUoZWxlbWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl1c2VkQ2F0ZWdvcnkuZVNldChmZWF0dXJlLCBudWxsKTsKLQkJfQotCi0JCS8vIHJlc3RvcmUgb2xkIHZhbHVlIG9mIHRoZSBzaW5nbGUtdmFsdWUgb3Bwb3NpdGUgZmVhdHVyZQotCQkvLwotCQlpZiAoIW9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSAmJiBvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSAhPSBudWxsCi0JCQkJJiYgb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUgIT0gdXNlZENhdGVnb3J5KSB7Ci0JCQlFT2JqZWN0IG9sZE9wcFZhbCA9IChFT2JqZWN0KSBvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZTsKLQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJKChDb2xsZWN0aW9uKSBvbGRPcHBWYWwuZUdldChmZWF0dXJlKSkuYWRkKGVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQlvbGRPcHBWYWwuZVNldChmZWF0dXJlLCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCWlmIChjcmVhdGVOZXdDb250cmlidXRvcikgewotCQkJaWYgKFRuZ1V0aWwuaXNFbXB0eSh1c2VkQ2F0ZWdvcnkpKSB7Ci0JCQkJRWNvcmVVdGlsLnJlbW92ZSh1c2VkQ2F0ZWdvcnkpOwotCQkJCXVzZWRDYXRlZ29yeSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodXNlZENhdGVnb3J5KTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDY2NjIKLQkJLy8gQmVsb3cgYWRkaW5nIGNhdGVnb3J5J3MgcmVzb3VyY2UgdG8gbW9kaWZpZWRSZXNvdXJjZXMgaXMgbmVlZGVkLCAKLQkJLy8gYmVjYXVzZSBiZWZvcmUgZXhlY3V0aW5nIGNvbW1hbmQsIG5lZWQgdG8gdmVyaWZ5IGlmIHJlc291cmNlIGlzIG11dGFibGUgb3Igbm90Ci0JCS8vIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgY2FsbGVkIGJlZm9yZSBleGVjdXRpbmcgYWN0dWFsIGV4ZWN1dGUoKSBpbiBmZXcgY2FzZXMuCi0JCS8vIFVzZWZ1bCBpbiBzcGVjaWFsIGNhc2VzIGxpa2UgaWYgcmVzb3VyY2UgaXMgaW4gdmVyc2lvbiBjb250cm9sLgotCQkvLwotCQlpZihjYXRlZ29yeSAhPSBudWxsICYmIGNhdGVnb3J5LmVSZXNvdXJjZSgpICE9IG51bGwKLQkJCQkmJiBtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKXsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChjYXRlZ29yeS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJCi0JCWlmIChtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9BZGRUb1NlY3Rpb25MaXN0Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTA1ZTUyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9BZGRUb1NlY3Rpb25MaXN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlNlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGFkZCBhIG5ldyBzZWN0aW9uIHRvIHRoZSBzZWN0aW9uIGxpc3QuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRUb1NlY3Rpb25MaXN0Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50OwotCi0JcHJpdmF0ZSBTZWN0aW9uTGlzdCBzZWN0aW9uTGlzdDsKLQotCXByaXZhdGUgU2VjdGlvbiBzZWN0aW9uOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBib29sZWFuIGFkZGVkOwotCi0JcHVibGljIEFkZFRvU2VjdGlvbkxpc3RDb21tYW5kKENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50LAotCQkJU2VjdGlvbiBzZWN0aW9uLCBTZWN0aW9uTGlzdCBzZWN0aW9uTGlzdCkgewotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCXRoaXMuc2VjdGlvbkxpc3QgPSBzZWN0aW9uTGlzdDsKLQkJdGhpcy5zZWN0aW9uID0gc2VjdGlvbjsKLQotCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCkpOwotCQl9ZWxzZXsKLQkJCS8vIFRoaXMgY2hlY2sgaXMgZG9uZSB0byBieXBhc3MgYWRkaXRpb24gb2Ygc2VjdGlvbiB0byBtZXRob2QgZWxlbWVudAotCQkJLy8gZm9yIGZpcnN0IHRpbWUsIGlmIHBsdWdpbi54bWkgZmlsZSBjaGVja2VkLW91dCB3aXRoIHZlcnNpb24gY29udHJvbC4gCi0JCQlpZihjb250ZW50RWxlbWVudC5lUmVzb3VyY2UoKSAhPSBudWxsKXsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoY29udGVudEVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQlpZiAoY29udGVudEVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJc2VjdGlvbkxpc3QuYWRkKHNlY3Rpb24pOwotCQlhZGRlZCA9IHRydWU7Ci0JCXNlY3Rpb25MaXN0LmFwcGx5KCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoYWRkZWQpIHsKLQkJCXNlY3Rpb25MaXN0LnJlbW92ZShzZWN0aW9uKTsKLQkJCXNlY3Rpb25MaXN0LmFwcGx5KCk7Ci0JCQlhZGRlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChjb250ZW50RWxlbWVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9CYXRjaENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0JhdGNoQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MWYxNjhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0JhdGNoQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBmZWF0dXJlcyBvZiBtdWx0aXBsZSBvYmplY3RzIGluCi0gKiBhIHNpbmdsZSBiYXRjaC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXRjaENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCXByaXZhdGUgTWFwIG9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcDsKLQlwcml2YXRlIE1hcCBvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXA7Ci0JcHJpdmF0ZSBib29sZWFuIGNsZWFyOwotCQotCS8qKgotCSAqIEBwYXJhbSBjbGVhciBpZiB0cnVlIHdpbGwgY2xlYXIgdGhlIG1hbnktdmFsdWVkIGZlYXR1cmUgYmVmb3JlIGFkZGluZyBuZXcgdmFsdWVzIAotCSAqLwotCXB1YmxpYyBCYXRjaENvbW1hbmQoYm9vbGVhbiBjbGVhcikgewotCQlzdXBlcigpOwotCQl0aGlzLmNsZWFyID0gY2xlYXI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNjYW5FeGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwICE9IG51bGwgJiYgIW9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcC5pc0VtcHR5KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJaWYob2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwID09IG51bGwgfHwgb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZihvYmplY3RUb09sZEZlYXR1cmVWYWx1ZXNNYXAgPT0gbnVsbCkgewotCQkJb2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcC5lbnRyeVNldCgpCi0JCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgZW50cnkuZ2V0S2V5KCk7Ci0JCQlNYXAgZmVhdHVyZU1hcCA9IChNYXApIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZmVhdHVyZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBlbnRyeQotCQkJCQkJLmdldEtleSgpOwotCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCWlmKGNsZWFyKSB7Ci0JCQkJCQllT2JqLmVTZXQoZmVhdHVyZSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkoKExpc3QpIGVPYmouZUdldChmZWF0dXJlKSkuYWRkQWxsKChDb2xsZWN0aW9uKSBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCU9iamVjdCBvbGRWYWx1ZSA9IGVPYmouZUdldChmZWF0dXJlKTsKLQkJCQkJaWYgKG9sZFZhbHVlICE9IGVudHJ5LmdldFZhbHVlKCkpIHsKLQkJCQkJCXNhdmVPbGRGZWF0dXJlVmFsdWUoZU9iaiwgZmVhdHVyZSk7Ci0JCQkJCQllT2JqLmVTZXQoZmVhdHVyZSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKG9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCAhPSBudWxsICYmICFvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAuZW50cnlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIGVudHJ5LmdldEtleSgpOwotCQkJCU1hcCBmZWF0dXJlTWFwID0gKE1hcCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZmVhdHVyZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQllbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBlbnRyeQotCQkJCQkJCS5nZXRLZXkoKTsKLQkJCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCSgoTGlzdCkgZU9iai5lR2V0KGZlYXR1cmUpKQotCQkJCQkJCQkucmVtb3ZlQWxsKChDb2xsZWN0aW9uKSBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0JCQkKLQkJfQotCi0JCS8vIHJlc3RvcmUgb2xkIHZhbHVlCi0JCS8vCi0JCWlmIChvYmplY3RUb09sZEZlYXR1cmVWYWx1ZXNNYXAgIT0gbnVsbCAmJiAhb2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwLmVudHJ5U2V0KCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlNYXAgZmVhdHVyZU1hcCA9IChNYXApIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGZlYXR1cmVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZW50cnkKLQkJCQkJCQkuZ2V0S2V5KCk7Ci0JCQkJCWVPYmouZVNldChmZWF0dXJlLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlvYmplY3RUb09sZEZlYXR1cmVWYWx1ZXNNYXAuY2xlYXIoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRGZWF0dXJlVmFsdWUoRU9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJYWRkRmVhdHVyZVZhbHVlKGdldE9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCgpLCBvYmosIGZlYXR1cmUsIHZhbHVlKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB2YWx1ZXMgdG8gYSAnbWFueScgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIGZlYXR1cmUgdGhlIGZlYXR1cmUgd2l0aCBtYW55IHZhbHVlcwotCSAqIEBwYXJhbSB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRGZWF0dXJlVmFsdWVzKEVPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiB2YWx1ZXMpIHsKLQkJYWRkRmVhdHVyZVZhbHVlcyhnZXRPYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAoKSwgb2JqLCBmZWF0dXJlLCB2YWx1ZXMpOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCkgewotCQlpZihvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAgPT0gbnVsbCkgewotCQkJb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlyZXR1cm4gb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzYXZlT2xkRmVhdHVyZVZhbHVlKEVPYmplY3QgZU9iaiwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGVPYmouZUdldChmZWF0dXJlKTsKLQkJaWYoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJdmFsdWUgPSBuZXcgQXJyYXlMaXN0KChMaXN0KXZhbHVlKTsKLQkJfQotCQlNYXAgZmVhdHVyZU1hcCA9IChNYXApIG9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcC5nZXQoZU9iaik7Ci0JCWlmIChmZWF0dXJlTWFwID09IG51bGwpIHsKLQkJCWZlYXR1cmVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJb2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwLnB1dChlT2JqLCBmZWF0dXJlTWFwKTsKLQkJfQotCQlmZWF0dXJlTWFwLnB1dChmZWF0dXJlLCB2YWx1ZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAgIT0gbnVsbCkgewotCQkJb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwLmNsZWFyKCk7Ci0JCQlvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAgPSBudWxsOwotCQl9Ci0JCQotCQlpZihvYmplY3RUb09sZEZlYXR1cmVWYWx1ZXNNYXAgIT0gbnVsbCkgewotCQkJb2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwLmNsZWFyKCk7Ci0JCQlvYmplY3RUb09sZEZlYXR1cmVWYWx1ZXNNYXAgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEZlYXR1cmVWYWx1ZShNYXAgZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCwKLQkJCUVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCU1hcCBmZWF0dXJlTWFwID0gKE1hcCkgZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcC5nZXQob2JqZWN0KTsKLQkJaWYgKGZlYXR1cmVNYXAgPT0gbnVsbCkgewotCQkJZmVhdHVyZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLnB1dChvYmplY3QsIGZlYXR1cmVNYXApOwotCQl9Ci0JCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgZmVhdHVyZU1hcC5nZXQoZmVhdHVyZSk7Ci0JCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmZWF0dXJlTWFwLnB1dChmZWF0dXJlLCBsaXN0KTsKLQkJCX0KLQkJCWxpc3QuYWRkKHZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCWZlYXR1cmVNYXAucHV0KGZlYXR1cmUsIHZhbHVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGZWF0dXJlVmFsdWVzKE1hcCBkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLAotCQkJRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIHZhbHVlcykgewotCQlNYXAgZmVhdHVyZU1hcCA9IChNYXApIGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAuZ2V0KG9iamVjdCk7Ci0JCWlmIChmZWF0dXJlTWFwID09IG51bGwpIHsKLQkJCWZlYXR1cmVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcC5wdXQob2JqZWN0LCBmZWF0dXJlTWFwKTsKLQkJfQotCQlMaXN0IGxpc3QgPSAoTGlzdCkgZmVhdHVyZU1hcC5nZXQoZmVhdHVyZSk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmZWF0dXJlTWFwLnB1dChmZWF0dXJlLCBsaXN0KTsKLQkJfQotCQlsaXN0LmFkZEFsbCh2YWx1ZXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0NvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNlMjE3NzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLS8qKgotICogTGlzdGVucyB0byBjaGFuZ2VzIHRvIGEgY29tbWVuZCBzdGFjay4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRTdGFja0NoYW5nZWRFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQVZFRCA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWEVDVVRFRCA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRPID0gNDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVORE9fQUxMID0gODsKLQotCXByaXZhdGUgaW50IHR5cGU7Ci0KLQlwdWJsaWMgQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50KE9iamVjdCBzb3VyY2UsIGludCB0eXBlKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU2NzI3Mjk0NjA0MjkyOTE2TDsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0NvbW1hbmRTdGF0dXNDaGVja2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Db21tYW5kU3RhdHVzQ2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YjRlZjYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0NvbW1hbmRTdGF0dXNDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBDaGVja3MgdGhlIHN0YXR1cyBvZiBhbiBleGVjdXRlZCBjb21tYW5kLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAyMSwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29tbWFuZFN0YXR1c0NoZWNrZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGhhc1JvbGxiYWNrRXJyb3IoSVN0YXR1cyBzdGF0dXMpIHsKLQkJcmV0dXJuIGhhc0Vycm9yKHN0YXR1cywgU2F2ZVN0YXR1cy5ST0xMQkFDS19FUlJPUik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGhhc1NhdmVFcnJvcihJU3RhdHVzIHN0YXR1cykgewotCQlyZXR1cm4gaGFzRXJyb3Ioc3RhdHVzLCBTYXZlU3RhdHVzLlNBVkVfRVJST1IpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBoYXNFcnJvcihJU3RhdHVzIHN0YXR1cywgaW50IGVyckNvZGUpIHsKLQkJaWYgKHN0YXR1cyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlTdGF0dXNbXSBzdGF0dXNlcyA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotCQlib29sZWFuIHJldCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXR1c2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJU3RhdHVzIGNoaWxkU3RhdHVzID0gc3RhdHVzZXNbaV07Ci0JCQlpZiAoY2hpbGRTdGF0dXMgaW5zdGFuY2VvZiBTYXZlU3RhdHVzCi0JCQkJCSYmIChjaGlsZFN0YXR1cy5nZXRDb2RlKCkgJiBlcnJDb2RlKSA9PSBlcnJDb2RlKSB7Ci0JCQkJcmV0ID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0RlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OGU4YzA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0RlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50c0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb21tYW5kTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JUmVmZXJlbmNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1lc3NlbmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGRlbGV0ZSBhIG1ldGhvZCBlbGVtZW50IHBlcm1hbmVudGx5LiBUaGlzIGludm9sdmVzCi0gKiBkZWxldGluZyB0aGUgc3RvcmFnZSBjb250ZW50IGFuZCByZW1vdmluZyBhbGwgcmVmZXJlbmNlcyB0byB0aGlzIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCBleHRlbmRzIENvbW1hbmRXcmFwcGVyIHsKLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGVsZW1lbnRzOwotCi0JcHJpdmF0ZSBib29sZWFuIHJlZlJlbW92ZWQ7Ci0KLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGNvbW1hbmRMaXN0ZW5lcnM7Ci0KLQlwcml2YXRlIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXI7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGVsZW1lbnRzVG9EZWxldGVDb250ZW50OwotCi0JcHJvdGVjdGVkIFNldDxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkvLyBNYXAgb2YgZWxlbWVudCB0byBNYXAgb2YgaXRzIHJlZmVyZW5jZXIgdG8gZmVhdHVyZXMgbGlzdAotCS8vCi0JcHJvdGVjdGVkIEhhc2hNYXAgZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXA7Ci0KLQlwcml2YXRlIEJhdGNoQ29tbWFuZCBiYXRjaENvbW1hbmQgPSBuZXcgQmF0Y2hDb21tYW5kKHRydWUpOwotCi0JLyoqCi0JICogTGlzdCBvZiBSZWZlcmVuY2Ugb2JqZWN0cwotCSAqIAotCSAqIEBzZWUgUmVmZXJlbmNlCi0JICovCi0JcHJvdGVjdGVkIEFycmF5TGlzdCByZW1vdmVkUmVmZXJlbmNlczsKLQotCXB1YmxpYyBib29sZWFuIGZhaWxlZDsKLQotCXByaXZhdGUgYm9vbGVhbiBjb25maXJtUmVtb3ZlUmVmZXJlbmNlczsKLQkKLQlwcml2YXRlIEFycmF5TGlzdCBuZXN0ZWRDb21tYW5kczsKLQotCS8qKgotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50IG9iamVjdHMgdG8gYmUgcGVybWFuZW50bHkgZGVsZXRlZC4KLQkgKi8KLQlwdWJsaWMgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQoQ29tbWFuZCBjb21tYW5kLCBDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCXRoaXMoY29tbWFuZCwgZWxlbWVudHMsIHRydWUpOwotCX0KLQotCXB1YmxpYyBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZChDb21tYW5kIGNvbW1hbmQsIENvbGxlY3Rpb24gZWxlbWVudHMsCi0JCQlib29sZWFuIGNvbmZpcm1SZW1vdmVSZWZzKSB7Ci0JCXN1cGVyKGNvbW1hbmQpOwotCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHMgPT0gbnVsbCA/IG51bGwgOiBuZXcgQXJyYXlMaXN0KGVsZW1lbnRzKTsKLQkJY29tbWFuZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJY29uZmlybVJlbW92ZVJlZmVyZW5jZXMgPSBjb25maXJtUmVtb3ZlUmVmczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQliYXRjaENvbW1hbmQuZGlzcG9zZSgpOwotCQlpZiAoY29tbWFuZExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQljb21tYW5kTGlzdGVuZXJzLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWVsZW1lbnRzLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnRzVG9EZWxldGVDb250ZW50ICE9IG51bGwpIHsKLQkJCWVsZW1lbnRzVG9EZWxldGVDb250ZW50LmNsZWFyKCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwICE9IG51bGwpIHsKLQkJCWVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHJlbW92ZWRSZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCXJlbW92ZWRSZWZlcmVuY2VzLmNsZWFyKCk7Ci0JCX0KLQkJLy8gRGlzcG9zZSBuZXN0ZWQgY29tbWFuZHMuCi0JCWlmKG5lc3RlZENvbW1hbmRzICE9IG51bGwpewotCQkJaWYoIW5lc3RlZENvbW1hbmRzLmlzRW1wdHkoKSl7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmVzdGVkQ29tbWFuZHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUNvbW1hbmQgY29tbWFuZCA9IChDb21tYW5kKSBpdGVyLm5leHQoKTsKLQkJCQkJY29tbWFuZC5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3VwZXJFeGVjdXRlKCkgewotCQlzdXBlci5leGVjdXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeVByZUV4ZWN1dGUoKSB7Ci0JCUxpc3QgY29tbWFuZExpc3RlbmVycyA9IFByb3ZpZGVycwotCQkJCS5nZXRDb21tYW5kTGlzdGVuZXJzKERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLmNsYXNzKTsKLQkJaWYgKGNvbW1hbmRMaXN0ZW5lcnMgIT0gbnVsbCAmJiAhY29tbWFuZExpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbW1hbmRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUNvbW1hbmRMaXN0ZW5lciBjbWRMaXN0ZW5lciA9IChJQ29tbWFuZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQljbWRMaXN0ZW5lci5wcmVFeGVjdXRlKHRoaXMpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbm90aWZ5UHJlVW5kbygpIHsKLQkJTGlzdCBjb21tYW5kTGlzdGVuZXJzID0gUHJvdmlkZXJzCi0JCQkJLmdldENvbW1hbmRMaXN0ZW5lcnMoRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQuY2xhc3MpOwotCQlpZiAoY29tbWFuZExpc3RlbmVycyAhPSBudWxsICYmICFjb21tYW5kTGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29tbWFuZExpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJQ29tbWFuZExpc3RlbmVyIGNtZExpc3RlbmVyID0gKElDb21tYW5kTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJCXRyeSB7Ci0JCQkJCWNtZExpc3RlbmVyLnByZVVuZG8odGhpcyk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZXBhcmVFbGVtZW50cygpIHsKLQkJQXJyYXlMaXN0IG5ld0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJUmVtb3ZlQ29tbWFuZCBjbWQgPSBnZXRSZW1vdmVDb21tYW5kKGVsZW1lbnQpOwotCQkJCWlmIChjbWQuZ2V0RmVhdHVyZSgpIGluc3RhbmNlb2YgRVJlZmVyZW5jZQotCQkJCQkJJiYgKChFUmVmZXJlbmNlKSBjbWQuZ2V0RmVhdHVyZSgpKS5pc0NvbnRhaW5tZW50KCkKLQkJCQkJCSYmIGNtZC5nZXRPd25lckxpc3QoKS5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQkvLyBjdXN0b20gY2F0ZWdvcnkgd2lsbCBiZSBkZWxldGVkIHBlcm1hbmVudGx5Ci0JCQkJCS8vIGZpbmQgYWxsIHN1YmNhdGVnb3J5IHRoYXQgYXJlIG5vdCByZWZlcmVuY2VkIGJ5IGFueSBvdGhlcgotCQkJCQkvLyBjdXN0b20gY2F0ZWdvcnkKLQkJCQkJLy8gaW4gdGhlIHNhbWUgcGx1Z2luIHRvIGRlbGV0ZSB0aGVtIGFzIHdlbGwKLQkJCQkJLy8KLQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gVG5nVXRpbAotCQkJCQkJCS5nZXRFeGNsdXNpdmVTdWJDdXN0b21DYXRlZ29yaWVzKChDdXN0b21DYXRlZ29yeSkgZWxlbWVudCk7Ci0JCQkJCWlmICghY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IHN1YkNhdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlpZiAoIWVsZW1lbnRzLmNvbnRhaW5zKHN1YkNhdCkKLQkJCQkJCQkJCSYmICFuZXdFbGVtZW50cy5jb250YWlucyhzdWJDYXQpKSB7Ci0JCQkJCQkJCWNtZC5nZXRDb2xsZWN0aW9uKCkuYWRkKHN1YkNhdCk7Ci0JCQkJCQkJCW5ld0VsZW1lbnRzLmFkZChzdWJDYXQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbGVtZW50cy5hZGRBbGwobmV3RWxlbWVudHMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIFJlbW92ZUNvbW1hbmQgZm9yIHRoZSBnaXZlbiBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFJlbW92ZUNvbW1hbmQgZ2V0UmVtb3ZlQ29tbWFuZChPYmplY3QgZSkgewotCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFJlbW92ZUNvbW1hbmQpIHsKLQkJCWlmICgoKFJlbW92ZUNvbW1hbmQpIGNvbW1hbmQpLmdldENvbGxlY3Rpb24oKS5jb250YWlucyhlKSkgewotCQkJCXJldHVybiAoUmVtb3ZlQ29tbWFuZCkgY29tbWFuZDsKLQkJCX0KLQkJfSBlbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgQ29tcG91bmRDb21tYW5kKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbXBvdW5kQ29tbWFuZCkgY29tbWFuZCkuZ2V0Q29tbWFuZExpc3QoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNtZCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChjbWQgaW5zdGFuY2VvZiBSZW1vdmVDb21tYW5kKSB7Ci0JCQkJCVJlbW92ZUNvbW1hbmQgcmVtb3ZlQ29tbWFuZCA9IChSZW1vdmVDb21tYW5kKSBjbWQ7Ci0JCQkJCWlmIChyZW1vdmVDb21tYW5kLmdldENvbGxlY3Rpb24oKS5jb250YWlucyhlKSkgewotCQkJCQkJcmV0dXJuIHJlbW92ZUNvbW1hbmQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJcHJlcGFyZUVsZW1lbnRzKCk7Ci0KLQkJbm90aWZ5UHJlRXhlY3V0ZSgpOwotCi0JCWVsZW1lbnRzVG9EZWxldGVDb250ZW50ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQljb2xsZWN0T2JqZWN0c1RvRGVsZXRlQ29udGVudChlbGVtZW50c1RvRGVsZXRlQ29udGVudCwKLQkJCQkJCShNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJcHJlcGFyZVJlbW92aW5nUmVmZXJlbmNlcygpOwotCQkJfQotCi0JCX07Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsCi0JCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMucHJvY2Vzc2luZ1JlZmVyZW5jZXNUYXNrX25hbWUpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKCFlbGVtZW50VG9SZW1vdmVkUmVmc01hcC5pc0VtcHR5KCkpIHsKLQkJCS8vIGNvbGxlY3Qgc2V0IG9mIHJlZmVyZW5jZXJzCi0JCQlIYXNoU2V0IHJlZmVyZW5jZXJzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlNYXAgcmVmZXJlbmNlclRvRmVhdHVyZXNNYXAgPSAoTWFwKSBpdGVyLm5leHQoKTsKLQkJCQkvLyBjb2xsZWN0IG9ubHkgcmVmZXJlbmNlciB3aXRoIGFuIHVuaWRpcmVjdGlvbmFsIG9yIGNvbnRhaW5tZW50Ci0JCQkJLy8gcmVsYXRpb25zaGlwCi0JCQkJLy8KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVmZXJlbmNlclRvRmVhdHVyZXNNYXAuZW50cnlTZXQoKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlDb2xsZWN0aW9uIGZlYXR1cmVzID0gKENvbGxlY3Rpb24pIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJCWJvb2xlYW4gY2FuQ29sbGVjdCA9IGZhbHNlOwotCQkJCQljaGVja19yZWY6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IxID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IxCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBmID0gaXRlcmF0b3IxLm5leHQoKTsKLQkJCQkJCWlmIChmIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgewotCQkJCQkJCUVSZWZlcmVuY2UgcmVmID0gKEVSZWZlcmVuY2UpIGY7Ci0JCQkJCQkJaWYgKHJlZi5pc0NvbnRhaW5tZW50KCkKLQkJCQkJCQkJCXx8IHJlZi5nZXRFT3Bwb3NpdGUoKSA9PSBudWxsKSB7Ci0JCQkJCQkJCWNhbkNvbGxlY3QgPSB0cnVlOwotCQkJCQkJCQlicmVhayBjaGVja19yZWY7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChjYW5Db2xsZWN0KSB7Ci0JCQkJCQlyZWZlcmVuY2Vycy5hZGQoZW50cnkuZ2V0S2V5KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBjb25maXJtIHdpdGggdXNlciBiZWZvcmUgcmVtb3ZpbmcgaWxsZWdhbCByZWZlcmVuY2VzCi0JCQkvLwotCQkJaWYgKGNvbmZpcm1SZW1vdmVSZWZlcmVuY2VzKSB7Ci0JCQkJTXVsdGlTdGF0dXMgbXVsdGlTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwgMCwKLQkJCQkJCSIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJCS8vIGRvbid0IHNob3cgcHJlZGVmaW5lZCBlbGVtZW50Ci0JCQkJCS8vCi0JCQkJCWlmICghVG5nVXRpbC5pc1ByZWRlZmluZWQoZSkpIHsKLQkJCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZCgKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZWxlbWVudFR5cGVfdGV4dCwgZQotCQkJCQkJCQkJCS5lQ2xhc3MoKS5nZXROYW1lKCksIFRuZ1V0aWwKLQkJCQkJCQkJCQkuZ2V0TGFiZWxXaXRoUGF0aChlKSk7Ci0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLAotCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkJMCwgbXNnLCBudWxsKTsKLQkJCQkJCW11bHRpU3RhdHVzLmFkZChzdGF0dXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChtdWx0aVN0YXR1cy5nZXRDaGlsZHJlbigpLmxlbmd0aCA+IDApIHsKLQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlcgotCQkJCQkJCS5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQkJCQlpZiAodWlIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJCWlmICh1aUhhbmRsZXIKLQkJCQkJCQkJLnNlbGVjdE9uZSgKLQkJCQkJCQkJCQluZXcgaW50W10gewotCQkJCQkJCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX09LLAotCQkJCQkJCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTCB9LAotCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZVJlZmVyZW5jZXNEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190ZXh0LCBudWxsKSA9PSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBjaGVjayBpZiB0aGUgcmVmZXJlbmNlcnMgY2FuIGJlIGNoYW5nZWQKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2Vycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeSgKLQkJCQkJCShFT2JqZWN0KSBpdGVyLm5leHQoKSwgTXNnQm94LmdldERlZmF1bHRTaGVsbCgpKTsKLQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFCi0JCQkJCQkJLnNob3dFcnJvcigKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZURpYWxvZ190aXRsZSwKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZUVsZW1lbnRFcnJvcl9tc2csCi0JCQkJCQkJCQlzdGF0dXMpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJU2V0IHVubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCi0JCS8vIGdldCB0aGUgb3duZXIgcmVzb3VyY2VzIGJlZm9yZSB0aGUgZWxlbWVudHMgZ290IHJlbW92ZWQgZnJvbQotCQkvLyBjb250YWluZXIgaW4gc3VwZXJFeGVjdXRlKCkKLQkJLy8KLQkJY29sbGVjdE93bmVyUmVzb3VyY2VzKG1vZGlmaWVkUmVzb3VyY2VzLCB1bm1vZGlmaWVkUmVzb3VyY2VzKTsKLQotCQlzdXBlckV4ZWN1dGUoKTsKLQkJCi0JCWV4ZWN1dGVOZXN0ZWRDb21tYW5kcygpOwotCQkKLQkJLy8gQ29sbGVjdCB0aGUgbmVzdGVkIGNvbW1hbmQgbW9kaWZpZWQgcmVzb3VyY2VzIGZvciBzYXZpbmcuIAotCQljb2xsZWN0TmVzdGVkQ29tbWFuZFJlc291cmNlcyhtb2RpZmllZFJlc291cmNlcyk7Ci0KLQkJLy8gZ2V0IHJlc291cmNlcyBvZiB0aGUgb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiBhZmZlY3RlZCBieSB0aGlzIGNvbW1hbmQKLQkJLy8gdW50aWwgbm93Ci0JCS8vCi0JCWNvbGxlY3RSZXNvdXJjZXMobW9kaWZpZWRSZXNvdXJjZXMsIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpKTsKLQotCQltb2RpZmllZFJlc291cmNlcy5yZW1vdmVBbGwodW5tb2RpZmllZFJlc291cmNlcyk7Ci0KLQkJZmluYWwgRXhjZXB0aW9uW10gZXhjZXB0aW9ucyA9IG5ldyBFeGNlcHRpb25bMV07Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlyZW1vdmVSZWZlcmVuY2VzKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZXhjZXB0aW9uc1swXSA9IGU7Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCi0JCWlmIChleGNlcHRpb25zWzBdICE9IG51bGwpIHsKLQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZURpYWxvZ190aXRsZSwKLQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRlRWxlbWVudEVycm9yX21zZywKLQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRlUmVmZXJlbmNlc0Vycm9yX3JlYXNvbiwKLQkJCQkJZXhjZXB0aW9uc1swXSk7Ci0JCQkJCi0JCQl1bmRvKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwoZ2V0UmVmZXJlbmNpbmdSZXNvdXJjZXMoKSk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQotCQllbGVtZW50c1RvRGVsZXRlQ29udGVudC5hZGRBbGwoZWxlbWVudHMpOwotCQkKLQkJSGFzaFNldDxSZXNvdXJjZT4gZGVsZXRlZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvRGVsZXRlQ29udGVudC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCVVtYVV0aWwuZ2V0UmVzb3VyY2VzKGUsIGRlbGV0ZWRSZXNvdXJjZXMpOwotCQl9Ci0JCQotCQkvLyBleGNsdWRlIGRlbGV0ZWQgcmVzb3VyY2VzIGZyb20gdGhlIHNldCBvZiBtb2RpZmllZCByZXNvdXJjZXMKLQkJLy8KLQkJbW9kaWZpZWRSZXNvdXJjZXMucmVtb3ZlQWxsKGRlbGV0ZWRSZXNvdXJjZXMpOwotCQkKLQkJLy8gY2hlY2sgYWZmZWN0ZWQgcmVzb3VyY2VzIGZvciB1bm1vZGlmaWFibGUKLQkJLy8KLQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkobW9kaWZpZWRSZXNvdXJjZXMsCi0JCQkJTXNnQm94LmdldERlZmF1bHRTaGVsbCgpKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd0Vycm9yKAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGVEaWFsb2dfdGl0bGUsCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZUVsZW1lbnRFcnJvcl9tc2csIHN0YXR1cyk7Ci0KLQkJCXVuZG8oKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAzKTsKLQkJCQlnZXRQZXJzaXN0ZXIoKTsKLQotCQkJCS8vIHNhdmUgcmVzb3VyY2VzIHRoYXQgaGFkIGJlZW4gY2hhbmdlZCBhZnRlciByZWZlcmVuY2VzIHRvIHRoZQotCQkJCS8vIGRlbGV0ZWQgZWxlbWVudHMKLQkJCQkvLyBoYWQgYmVlbiByZW1vdmVkCi0JCQkJLy8KLQkJCQl0cnkgewotCQkJCQltb25pdG9yCi0JCQkJCQkJLnN1YlRhc2soTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRpbmdFbGVtZW50c1Rhc2tfbmFtZSk7Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQlkZWxldGVDb250ZW50KCk7Ci0KLQkJCQkJLy8gc2F2ZSBtb2RpZmllZCByZXNvdXJjZXMKLQkJCQkJLy8KLQkJCQkJbW9uaXRvci5zdWJUYXNrKCJTYXZpbmcgcmVzb3VyY2VzIik7Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2RpZmllZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCi0JCQkJCWV4ZWN1dGVkID0gdHJ1ZTsKLQotCQkJCQlyZW1vdmVBZGFwdGVycygpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCWZhaWxlZCA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0JCQkJCQl0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0KLQkJLy8gaWYgKCFVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLAotCQkvLyBMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGluZ0VsZW1lbnRzVGFza19uYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCS8vIGlmIChmYWlsZWQpIHsKLQkJLy8gbm90aWZ5RmFpbHVyZSgpOwotCQkvLyB9IGVsc2UgewotCQkvLyB1bmRvKCk7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuOwotCQkvLyB9Ci0KLS8vCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuSW5VSShydW5uYWJsZSwgKFNoZWxsKSBudWxsKTsKLQkJCi0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIExpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0aW5nRWxlbWVudHNUYXNrX25hbWUpOwotCi0JCWlmIChleGVjdXRlZCkgewotCQkJbm90aWZ5RXhlY3V0ZWQoKTsKLQkJCUxpc3Qgd2FybmluZ3MgPSBwZXJzaXN0ZXIuZ2V0V2FybmluZ3MoKTsKLQkJCWlmICghd2FybmluZ3MuaXNFbXB0eSgpKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRlRGlhbG9nX3RpdGxlOwotCQkJCVN0cmluZyBtc2cgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZF93YXJuaW5nTXNnOwotCQkJCVN0cmluZ0J1ZmZlciByZWFzb24gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd2FybmluZ3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUV4Y2VwdGlvbiBlID0gKEV4Y2VwdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJCVN0cmluZyBzdHIgPSBlLmdldE1lc3NhZ2UoKTsKLQkJCQkJaWYgKCFTdHJVdGlsLmlzQmxhbmsoc3RyKSkgewotCQkJCQkJcmVhc29uLmFwcGVuZChzdHIpLmFwcGVuZCgnXG4nKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93V2FybmluZyh0aXRsZSwgbXNnLCByZWFzb24udG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZmFpbGVkKSB7Ci0JCQkJbm90aWZ5RmFpbHVyZSgpOwotCQkJfSBlbHNlIHsKLQkJCQl1bmRvKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBhbGwgc3RhdGVmdWwgYWRhcHRlcnMsIHRoZW4gcmVtb3ZlcyBhbGwgYWRhcHRlcnMgdGhhdCBhcmUKLQkgKiBhdHRhY2hlZCB0byB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWRhcHRlcnMoRU9iamVjdCBlbGVtZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnQuZUFkYXB0ZXJzKCkpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3RhdGVmdWxJdGVtUHJvdmlkZXIpIHsKLQkJCQkoKElTdGF0ZWZ1bEl0ZW1Qcm92aWRlcikgYWRhcHRlcikuZGlzcG9zZSgpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlcikKLQkJCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSVJlZmVyZW5jZXIpIHsKLQkJCQkJCSgoSVJlZmVyZW5jZXIpIGFkYXB0ZXJGYWN0b3J5KS5yZW1vdmUoYWRhcHRlcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxlbWVudC5lQWRhcHRlcnMoKS5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIGFsbCBzdGF0ZWZ1bCBhZGFwdGVycywgdGhlbiByZW1vdmVzIGFsbCBhZGFwdGVycyB0aGF0IGFyZQotCSAqIGF0dGFjaGVkIHRvIHRoZSBkZWxldGVkIGVsZW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWRhcHRlcnMoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIG9iajsKLQkJCQlpZiAoZWxlbWVudC5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5lQWxsQ29udGVudHMoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCXJlbW92ZUFkYXB0ZXJzKGUpOwotCQkJCQl9Ci0JCQkJCXJlbW92ZUFkYXB0ZXJzKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBub3RpZnlGYWlsdXJlKCkgewotCQlFdmVudE9iamVjdCBldmVudE9iamVjdCA9IG5ldyBFdmVudE9iamVjdCh0aGlzKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21tYW5kTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ29tbWFuZExpc3RlbmVyIGxpc3RlbmVyID0gKENvbW1hbmRMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5ub3RpZnlGYWlsdXJlKGV2ZW50T2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGdldFBlcnNpc3RlcigpIHsKLQkJaWYgKHBlcnNpc3RlciA9PSBudWxsKSB7Ci0JCQlwZXJzaXN0ZXIgPSBTZXJ2aWNlcy5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlcigpCi0JCQkJCS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQl9Ci0JCXJldHVybiBwZXJzaXN0ZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeUV4ZWN1dGVkKCkgewotCQlFdmVudE9iamVjdCBldmVudE9iamVjdCA9IG5ldyBFdmVudE9iamVjdCh0aGlzKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmNvbW1hbmRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb21tYW5kTGlzdGVuZXIgbGlzdGVuZXIgPSAoQ29tbWFuZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCWxpc3RlbmVyLm5vdGlmeUV4ZWN1dGVkKGV2ZW50T2JqZWN0KTsKLQkJfQotCi0JCUxpc3QgY29tbWFuZExpc3RlbmVycyA9IFByb3ZpZGVycwotCQkJCS5nZXRDb21tYW5kTGlzdGVuZXJzKERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLmNsYXNzKTsKLQkJaWYgKGNvbW1hbmRMaXN0ZW5lcnMgIT0gbnVsbCAmJiAhY29tbWFuZExpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbW1hbmRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUNvbW1hbmRMaXN0ZW5lciBjbWRMaXN0ZW5lciA9IChJQ29tbWFuZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQljbWRMaXN0ZW5lci5ub3RpZnlFeGVjdXRlZCh0aGlzKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldFJlZmVyZW5jaW5nUmVzb3VyY2VzKCkgewotCQlIYXNoU2V0IHJlZmVycmVycyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gcmVtb3ZlZFJlZmVyZW5jZXNNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIE1hcCByZWZlcnJlclRvRmVhdHVyZXNNYXAgPSAoTWFwKSBpdGVyLm5leHQoKTsKLQkJLy8gcmVmZXJyZXJzLmFkZEFsbChyZWZlcnJlclRvRmVhdHVyZXNNYXAua2V5U2V0KCkpOwotCQkvLyB9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVtb3ZlZFJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQlyZWZlcnJlcnMuYWRkKHJlZi5vd25lcik7Ci0JCX0KLQotCQlIYXNoU2V0IHJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVycmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZXMuYWRkKGVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogQ29sbGVjdHMgb3duZXIgcmVzb3VyY2VzIG9mIHRoZSBlbGVtZW50cyB0byBiZSBkZWxldGVkIHRvIHNhdmUgbGF0ZXIuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcwotCSAqLwotCXByaXZhdGUgdm9pZCBjb2xsZWN0T3duZXJSZXNvdXJjZXMoU2V0IHJlc291cmNlcywgU2V0IHVubW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJSUxpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gU2VydmljZXMuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZXIoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCUVPYmplY3QgY29udGFpbmVyID0gKChNZXRob2RFbGVtZW50KSBlbGVtZW50KS5lQ29udGFpbmVyKCk7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjb250YWluZXIuZVJlc291cmNlKCk7Ci0JCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJaWYgKHBlcnNpc3Rlci5oYXNPd25SZXNvdXJjZVdpdGhvdXRSZWZlcnJlcihlbGVtZW50KSkgewotCQkJCQkJdW5tb2RpZmllZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb2xsZWN0UmVzb3VyY2VzKFNldCByZXNvdXJjZXMsIENvbGxlY3Rpb24gb2JqZWN0cykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlFT2JqZWN0IGVPYmogPSAoTWV0aG9kRWxlbWVudCkgZWxlbWVudDsKLQkJCQlpZiAoZU9iai5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCXJlc291cmNlcy5hZGQoZU9iai5lUmVzb3VyY2UoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQlzdXBlci5yZWRvKCk7Ci0JCXJlbW92ZVJlZmVyZW5jZXMoKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUNvbnRlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBlbGVtZW50OwotCQkJCWlmIChlLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCXBlcnNpc3Rlci5kZWxldGUoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMoKSB7Ci0JCUNvbGxlY3Rpb24gbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdAotCQkJCQkmJiB3aWxsUmVtb3ZlRWxlbWVudEZyb21Db250YWluZXIoKEVPYmplY3QpIGVsZW1lbnQpKSB7Ci0JCQkJbGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuUmVtb3ZlUmVmZXJlbmNlcyhNZXRob2RFbGVtZW50IGUpIHsKLQkJLy8gaWYgZSBpcyBvbmUgb2YgdGhlIGRlbGV0ZWQgZWxlbWVudHMsIG1ha2Ugc3VyZSB0aGF0IGl0IGFjdHVhbGx5IGdvdAotCQkvLyBkZWxldGVkIGJ5IGNoZWNraW5nIGl0cyBjb250YWluZXIKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGUgPT0gb2JqKSB7Ci0JCQkJcmV0dXJuIGUuZUNvbnRhaW5lcigpID09IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgYWxsIG9wcG9zaXRlIGZlYXR1cmVzIG9mIHRoZSBlbGVtZW50cyB0byBiZSBkZWxldGVkCi0JICogCi0JICogQHJldHVybiBsaXN0IG9mIGVsZW1lbnRzIHdob3NlIG9wcG9zaXRlIGZlYXR1cmVzIGFyZSBsb2FkZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBsb2FkT3Bwb3NpdGVGZWF0dXJlcygpIHsKLQkJSGFzaFNldCBvcHBvc2l0ZUZlYXR1cmVzID0gbmV3IEhhc2hTZXQoKTsKLQkJSGFzaFNldCBkZWxldGVkR1VJRHMgPSBuZXcgSGFzaFNldCgpOwotCQlBcnJheUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0RWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZS5lQWxsQ29udGVudHMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJCQlNYXAgb3Bwb3NpdGVGZWF0dXJlTWFwID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudCkKLQkJCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpOwotCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZU1hcCAhPSBudWxsCi0JCQkJCQkJCSYmICFvcHBvc2l0ZUZlYXR1cmVNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJb3Bwb3NpdGVGZWF0dXJlcwotCQkJCQkJCQkJLmFkZEFsbChvcHBvc2l0ZUZlYXR1cmVNYXAua2V5U2V0KCkpOwotCQkJCQkJCWRlbGV0ZWRHVUlEcy5hZGQoKChNZXRob2RFbGVtZW50KSBlbGVtZW50KQotCQkJCQkJCQkJLmdldEd1aWQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxlbWVudHMuYWRkKGUpOwotCQkJCU1hcCBvcHBvc2l0ZUZlYXR1cmVNYXAgPSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlKQotCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpOwotCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmVNYXAgIT0gbnVsbCAmJiAhb3Bwb3NpdGVGZWF0dXJlTWFwLmlzRW1wdHkoKSkgewotCQkJCQlvcHBvc2l0ZUZlYXR1cmVzLmFkZEFsbChvcHBvc2l0ZUZlYXR1cmVNYXAua2V5U2V0KCkpOwotCQkJCQlkZWxldGVkR1VJRHMuYWRkKCgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0R3VpZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlsb2FkT3Bwb3NpdGVGZWF0dXJlcyhuZXcgQXJyYXlMaXN0KG9wcG9zaXRlRmVhdHVyZXMpLCBkZWxldGVkR1VJRHMpOwotCi0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNDb250YWluZWRCeURlbGV0ZWRFbGVtZW50KEVPYmplY3QgZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBkZWxldGVkID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGRlbGV0ZWQgaW5zdGFuY2VvZiBFT2JqZWN0ICYmIFVtYVV0aWwuaXNDb250YWluZWRCeShlLCBkZWxldGVkKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDb2xsZWN0cyBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWQgaWYgPGNvZGU+ZWxlbWVudFRvRGVsZXRlPC9jb2RlPgotCSAqIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIDxjb2RlPnJlZmVyZW5jZXM8L2NvZGU+IG9mIDxjb2RlPnJlZmVyZW5jZXI8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3RzVG9SZW1vdmUKLQkgKiAgICAgICAgICAgIG91dHB1dAotCSAqIEBwYXJhbSByZWZlcmVuY2VyCi0JICogICAgICAgICAgICBlbGVtZW50IHRoYXQgcmVmZXJlbmNlcyB0byBlbGVtZW50VG9EZWxldGUKLQkgKiBAcGFyYW0gcmVmZXJlbmNlcwotCSAqICAgICAgICAgICAgY29sbGVjdGlvbiBvZiB7QGxpbmsgRVJlZmVyZW5jZX0gdGhhdCBjb250YWlucyBlbGVtZW50VG9EZWxldGUKLQkgKiBAcmV0dXJuIHRydWUgaWYgb25lIG9mIHRoZSBjb2xsZWN0ZWQgb2JqZWN0cyBpcyB0aGUKLQkgKiAgICAgICAgIDxjb2RlPnJlZmVyZW5jZXI8L2NvZGU+IG9yIHRoZSBjb250YWluZXIgb2YKLQkgKiAgICAgICAgIDxjb2RlPnJlZmVyZW5jZXI8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29sbGVjdE9iamVjdHNUb1JlbW92ZShDb2xsZWN0aW9uIG9iamVjdHNUb1JlbW92ZSwKLQkJCUVPYmplY3QgZWxlbWVudFRvRGVsZXRlLCBFT2JqZWN0IHJlZmVyZW5jZXIsIENvbGxlY3Rpb24gcmVmZXJlbmNlcykgewotCQlib29sZWFuIHJldCA9IGZhbHNlOwotCQlMaXN0IGNvbW1hbmRMaXN0ZW5lcnMgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29tbWFuZExpc3RlbmVycyhEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5jbGFzcyk7Ci0JCWlmIChjb21tYW5kTGlzdGVuZXJzICE9IG51bGwgJiYgIWNvbW1hbmRMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21tYW5kTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjbWRMaXN0ZW5lciA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChjbWRMaXN0ZW5lciBpbnN0YW5jZW9mIElEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZExpc3RlbmVyKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlib29sZWFuIGIgPSAoKElEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZExpc3RlbmVyKSBjbWRMaXN0ZW5lcikKLQkJCQkJCQkJLmNvbGxlY3RPYmplY3RzVG9SZW1vdmUob2JqZWN0c1RvUmVtb3ZlLAotCQkJCQkJCQkJCWVsZW1lbnRUb0RlbGV0ZSwgcmVmZXJlbmNlciwgcmVmZXJlbmNlcyk7Ci0JCQkJCQlpZiAoYikgewotCQkJCQkJCXJldCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmV0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHdpbGxSZW1vdmVFbGVtZW50RnJvbUNvbnRhaW5lcihFT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKHdpbGxSZW1vdmVFbGVtZW50RnJvbUNvbnRhaW5lcihjb21tYW5kLCBlbGVtZW50KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIENvbXBvdW5kQ29tbWFuZCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb21wb3VuZENvbW1hbmQpIGNvbW1hbmQpLmdldENvbW1hbmRMaXN0KCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUNvbW1hbmQgY21kID0gKENvbW1hbmQpIGl0ZXIubmV4dCgpOwotCQkJCWlmICh3aWxsUmVtb3ZlRWxlbWVudEZyb21Db250YWluZXIoY21kLCBlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gd2lsbFJlbW92ZUVsZW1lbnRGcm9tQ29udGFpbmVyKENvbW1hbmQgY21kLAotCQkJRU9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChjbWQgaW5zdGFuY2VvZiBSZW1vdmVDb21tYW5kKSB7Ci0JCQlSZW1vdmVDb21tYW5kIHJlbW92ZUNvbW1hbmQgPSAoKFJlbW92ZUNvbW1hbmQpIGNtZCk7Ci0JCQlyZXR1cm4gcmVtb3ZlQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkuY29udGFpbnMoZWxlbWVudCkKLQkJCQkJJiYgcmVtb3ZlQ29tbWFuZC5nZXRPd25lcigpID09IGVsZW1lbnQuZUNvbnRhaW5lcigpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlUmVtb3ZpbmdSZWZlcmVuY2VzKCkgewotCQlMaXN0IGVsZW1lbnRzID0gbG9hZE9wcG9zaXRlRmVhdHVyZXMoKTsKLQotCQllbGVtZW50VG9SZW1vdmVkUmVmc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUhhc2hTZXQgb2JqZWN0c1RvUmVtb3ZlID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlNYXAgcmVmTWFwID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVmZXJlbmNlTWFwKGVsZW1lbnQpOwotCQkJaWYgKCFyZWZNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlZk1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJRU9iamVjdCByZWZlcmVuY2VyID0gKEVPYmplY3QpIGVudHJ5LmdldEtleSgpOwotCQkJCQlDb2xsZWN0aW9uIHJlZmVyZW5jZXMgPSAoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkJYm9vbGVhbiBiID0gY29sbGVjdE9iamVjdHNUb1JlbW92ZShvYmplY3RzVG9SZW1vdmUsCi0JCQkJCQkJZWxlbWVudCwgcmVmZXJlbmNlciwgcmVmZXJlbmNlcyk7Ci0JCQkJCWlmIChiIHx8IGVsZW1lbnRzLmNvbnRhaW5zKHJlZmVyZW5jZXIpCi0JCQkJCQkJfHwgaXNDb250YWluZWRCeURlbGV0ZWRFbGVtZW50KHJlZmVyZW5jZXIpKSB7Ci0JCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIXJlZk1hcC5pc0VtcHR5KCkpCi0JCQkJCWVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwLnB1dChlbGVtZW50LCByZWZNYXApOwotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIGVudHJpZXMgZm9yIG9iamVjdHNUb1JlbW92ZSB0byBlbGVtZW50VG9SZW1vdmVkUmVmc01hcAotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCU1hcCBtYXAgPSAoTWFwKSBlbGVtZW50VG9SZW1vdmVkUmVmc01hcC5nZXQob2JqKTsKLQkJCWlmIChtYXAgPT0gbnVsbCkgewotCQkJCW1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXAucHV0KG9iaiwgbWFwKTsKLQkJCX0KLQkJCUVPYmplY3QgY29udGFpbmVyID0gb2JqLmVDb250YWluZXIoKTsKLQkJCUVSZWZlcmVuY2UgY29udGFpbm1lbnRGZWF0dXJlID0gb2JqLmVDb250YWlubWVudEZlYXR1cmUoKTsKLQkJCUNvbGxlY3Rpb24gcmVmcyA9IChDb2xsZWN0aW9uKSBtYXAuZ2V0KGNvbnRhaW5lcik7Ci0JCQlpZiAocmVmcyA9PSBudWxsKSB7Ci0JCQkJcmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlyZWZzLmFkZChjb250YWlubWVudEZlYXR1cmUpOwotCQkJCW1hcC5wdXQoY29udGFpbmVyLCByZWZzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFyZWZzLmNvbnRhaW5zKGNvbnRhaW5tZW50RmVhdHVyZSkpIHsKLQkJCQkJcmVmcy5hZGQoY29udGFpbm1lbnRGZWF0dXJlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyByZW1vdmUgYWxsIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGVsZW1lbnQ7Ci0JCQkJTWFwIG9ialRvUmVmc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJZm9yIChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IgZmVhdHVyZUl0ZXJhdG9yID0gKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcikgZU9iamVjdAotCQkJCQkJLmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBmZWF0dXJlSXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBmZWF0dXJlSXRlcmF0b3IubmV4dCgpOwotCQkJCQlFUmVmZXJlbmNlIGVSZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgZmVhdHVyZUl0ZXJhdG9yCi0JCQkJCQkJLmZlYXR1cmUoKTsKLQkJCQkJaWYgKGVSZWZlcmVuY2UuZ2V0RU9wcG9zaXRlKCkgIT0gbnVsbCkgewotCQkJCQkJTGlzdCByZWZzID0gKExpc3QpIG9ialRvUmVmc01hcC5nZXQoZU9iaik7Ci0JCQkJCQlpZiAocmVmcyA9PSBudWxsKSB7Ci0JCQkJCQkJcmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlvYmpUb1JlZnNNYXAucHV0KGVPYmosIHJlZnMpOwotCQkJCQkJfQotCQkJCQkJcmVmcy5hZGQoZVJlZmVyZW5jZS5nZXRFT3Bwb3NpdGUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJTWFwIG1hcCA9IChNYXApIGVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwLmdldChlT2JqZWN0KTsKLQkJCQlpZiAobWFwID09IG51bGwpIHsKLQkJCQkJZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXAucHV0KGVPYmplY3QsIG9ialRvUmVmc01hcCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gbWVyZ2Ugb2JqVG9SZWZzTWFwIHRvIG1hcAotCQkJCQkvLwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gb2JqVG9SZWZzTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJT2JqZWN0IG9iaiA9IGVudHJ5LmdldEtleSgpOwotCQkJCQkJQ29sbGVjdGlvbiByZWZzID0gKENvbGxlY3Rpb24pIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJCQlDb2xsZWN0aW9uIGV4aXN0aW5nUmVmcyA9IChDb2xsZWN0aW9uKSBtYXAuZ2V0KG9iaik7Ci0JCQkJCQlpZiAoZXhpc3RpbmdSZWZzICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSByZWZzLml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCU9iamVjdCByZWYgPSAoT2JqZWN0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYgKCFleGlzdGluZ1JlZnMuY29udGFpbnMocmVmKSkgewotCQkJCQkJCQkJZXhpc3RpbmdSZWZzLmFkZChyZWYpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQltYXAucHV0KG9iaiwgcmVmcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb2xsZWN0ZWRPYmplY3RzCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IHRoYXQgd2lsbCBiZSBkZWxldGVkIGJ5IHRoaXMgY29tbWFuZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3RPYmplY3RzVG9EZWxldGVDb250ZW50KENvbGxlY3Rpb24gY29sbGVjdGVkT2JqZWN0cywKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQkvLyB0aGlzIHNwZWNpYWwgaGFuZGxpbmcgaXMgbm8gbG9uZ2VyIG5lZWRlZCBzaW5jZSBhZmZlY3RlZAotCQkvLyBzdWJjYXRlZ29yaWVzIGFyZSBhZGRlZAotCQkvLyB0byB0aGUgbGlzdCBvZiBlbGVtZW50cyB0byBiZSBkZWxldGVkCi0JCS8vCi0JCS8vIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJLy8gLy8gaGF2ZSB0byBoYW5kbGUgQ3VzdG9tQ2F0ZWdvcnkgc3BlY2lhbGx5IHNpbmNlIGRlbGV0aW5nIGEKLQkJLy8gLy8gQ3VzdG9tQ2F0ZWdvcnkgbWlnaHQgdHJpZ2VyIGRlbGV0aW5nCi0JCS8vIC8vIGl0cyBzdWJjYXRlZ29yaWVzIGV2ZW4gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGEgQ3VzdG9tQ2F0ZWdvcnkKLQkJLy8gYW5kCi0JCS8vIC8vIGl0cyBzdWJjYXRlZ29yaWVzIGlzCi0JCS8vIC8vIG5vbi1jb250YWlubWVudCByZWZlcmVuY2UKLQkJLy8gLy8KLQkJLy8gSXRlcmF0b3IgaXRlcjEgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZWxlbWVudCwgZmFsc2UpIHsKLQkJLy8KLQkJLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTYyODU5Njk5MjMxMzg3ODE0MzdMOwotCQkvLyBwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyBBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIENvbGxlY3Rpb24gY2F0RWxlbWVudHMgPSAoKEN1c3RvbUNhdGVnb3J5KSBvYmplY3QpCi0JCS8vIC5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjYXRFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkvLyAuaGFzTmV4dCgpOykgewotCQkvLyBPYmplY3QgZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJLy8gaWYgKGUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkvLyBjaGlsZHJlbi5hZGQoZSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyByZXR1cm4gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJLy8gfQotCQkvLwotCQkvLyB9OwotCQkvLyB3aGlsZSAoaXRlcjEuaGFzTmV4dCgpKSB7Ci0JCS8vIGNvbGxlY3RlZE9iamVjdHMuYWRkKGl0ZXIxLm5leHQoKSk7Ci0JCS8vIH0KLQkJLy8gfQotCi0JCUxpc3QgY29tbWFuZExpc3RlbmVycyA9IFByb3ZpZGVycwotCQkJCS5nZXRDb21tYW5kTGlzdGVuZXJzKERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLmNsYXNzKTsKLQkJaWYgKGNvbW1hbmRMaXN0ZW5lcnMgIT0gbnVsbCAmJiAhY29tbWFuZExpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbW1hbmRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNtZExpc3RlbmVyID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGNtZExpc3RlbmVyIGluc3RhbmNlb2YgSURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kTGlzdGVuZXIpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCSgoSURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kTGlzdGVuZXIpIGNtZExpc3RlbmVyKQotCQkJCQkJCQkuY29sbGVjdE9iamVjdHNUb0RlbGV0ZUNvbnRlbnQoCi0JCQkJCQkJCQkJY29sbGVjdGVkT2JqZWN0cywgZWxlbWVudCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZWZlcmVuY2VzKCkgewotCQlpZiAocmVmUmVtb3ZlZCkKLQkJCXJldHVybjsKLQotCQlpZiAocmVtb3ZlZFJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJcmVtb3ZlZFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVkUmVmZXJlbmNlcy5jbGVhcigpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCU1ldGhvZEVsZW1lbnQgcmVmZXJlbmNlZCA9IChNZXRob2RFbGVtZW50KSBlbnRyeS5nZXRLZXkoKTsKLQkJCWlmIChjYW5SZW1vdmVSZWZlcmVuY2VzKHJlZmVyZW5jZWQpKSB7Ci0JCQkJTWFwIHJlbW92ZWRSZWZNYXAgPSAoTWFwKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZW1vdmVkUmVmTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnQgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCUVPYmplY3QgcmVmZXJlbmNlciA9IChFT2JqZWN0KSBlbnQuZ2V0S2V5KCk7Ci0JCQkJCUNvbGxlY3Rpb24gZmVhdHVyZXMgPSAoQ29sbGVjdGlvbikgZW50LmdldFZhbHVlKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIxCi0JCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCUxpc3QgbGlzdCA9ICgoTGlzdCkgcmVmZXJlbmNlci5lR2V0KGZlYXR1cmUpKTsKLQotCQkJCQkJCWludCBpbmRleCA9IGxpc3QuaW5kZXhPZihyZWZlcmVuY2VkKTsKLQkJCQkJCQkvLyBsaXN0LnJlbW92ZShpbmRleCk7Ci0JCQkJCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJCQkJCWxpc3QucmVtb3ZlKGluZGV4KTsKLQkJCQkJCQkJcmVtb3ZlZFJlZmVyZW5jZXMuYWRkKG5ldyBSZWZlcmVuY2UocmVmZXJlbmNlciwKLQkJCQkJCQkJCQlmZWF0dXJlLCByZWZlcmVuY2VkLCBpbmRleCkpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmIChUbmdVdGlsLkRFQlVHKSB7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJCS5wcmludGxuKCJEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5yZW1vdmVSZWZlcmVuY2VzKCk6IGluZGV4PSIgKyBpbmRleCArICIsIHNpemU9IiArIGxpc3Quc2l6ZSgpICsgIiwgcmVmZXJlbmNlcj0iICsgcmVmZXJlbmNlciArICIsIHJlZmVyZW5jZWQ9IiArIHJlZmVyZW5jZWQgKyAiLCBmZWF0dXJlPSIgKyBmZWF0dXJlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQkJCQkJCX0KLQkJCQkJCQkJLy8gd29yay1hcm91bmQ6IHRyeSB0byBmaW5kIHRoZSBwcm94eSBhbmQgcmVtb3ZlCi0JCQkJCQkJCS8vIGl0LgotCQkJCQkJCQkvLyBUT0RPOiBraW5kIG9mIGhhY2ssIG5lZWRzIHJldmlzaXQKLQkJCQkJCQkJLy8KLQkJCQkJCQkJU3RyaW5nIGd1aWQgPSAoKE1ldGhvZEVsZW1lbnQpIHJlZmVyZW5jZWQpCi0JCQkJCQkJCQkJLmdldEd1aWQoKTsKLQkJCQkJCQkJZmluZF9wcm94eTogZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJCQlJbnRlcm5hbEVPYmplY3QgcmVmID0gKEludGVybmFsRU9iamVjdCkgbGlzdAotCQkJCQkJCQkJCQkuZ2V0KGkpOwotCQkJCQkJCQkJVVJJIHVyaSA9IHJlZi5lUHJveHlVUkkoKTsKLQkJCQkJCQkJCWlmICh1cmkgIT0gbnVsbAotCQkJCQkJCQkJCQkmJiBndWlkLmVxdWFscyh1cmkuZnJhZ21lbnQoKSkpIHsKLQkJCQkJCQkJCQlsaXN0LnJlbW92ZShpKTsKLQkJCQkJCQkJCQlyZW1vdmVkUmVmZXJlbmNlcy5hZGQobmV3IFJlZmVyZW5jZSgKLQkJCQkJCQkJCQkJCXJlZmVyZW5jZXIsIGZlYXR1cmUsCi0JCQkJCQkJCQkJCQlyZWZlcmVuY2VkLCBpKSk7Ci0JCQkJCQkJCQkJYnJlYWsgZmluZF9wcm94eTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmVmZXJlbmNlci5lU2V0KGZlYXR1cmUsIG51bGwpOwotCQkJCQkJCXJlbW92ZWRSZWZlcmVuY2VzLmFkZChuZXcgUmVmZXJlbmNlKHJlZmVyZW5jZXIsCi0JCQkJCQkJCQlmZWF0dXJlLCByZWZlcmVuY2VkLCAtMSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKFRuZ1V0aWwuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oInJlbW92ZWRSZWZlcmVuY2VzOiBzaXplPSIgKyByZW1vdmVkUmVmZXJlbmNlcy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQliYXRjaENvbW1hbmQuZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCkuY2xlYXIoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVtb3ZlZFJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVmLmdldEZlYXR1cmUoKSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQpIHsKLQkJCQliYXRjaENvbW1hbmQKLQkJCQkJCS5hZGRGZWF0dXJlVmFsdWUoCi0JCQkJCQkJCXJlZi5nZXRPd25lcigpLAotCQkJCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsCi0JCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRQotCQkJCQkJCQkJCS5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCQkJaWYgKHJlZi5nZXRPd25lcigpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJLy8gRmlsbCBibGFuayBwcmVzZW50YXRpb24gbmFtZSBvZiBleHRlbmRlZC9sb2NhbGx5Ci0JCQkJCS8vIGNvbnRyaWJ1dGluZyBhY3Rpdml0eSB3aXRoIHByZXNlbnRhdGlvbiBuYW1lCi0JCQkJCS8vIGZyb20gYmFzZSBhY3Rpdml0eSB3aGVuIGJhc2UgaXMgZGVsZXRlZAotCQkJCQkvLwotCQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIHJlZi5nZXRPd25lcigpOwotCQkJCQlWYXJpYWJpbGl0eVR5cGUgdlR5cGUgPSBhY3QuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQkJCWlmICgodlR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCB8fCB2VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OX0xJVEVSQUwpCi0JCQkJCQkJJiYgU3RyVXRpbC5pc051bGwoYWN0LmdldFByZXNlbnRhdGlvbk5hbWUoKSkpIHsKLQkJCQkJCUFjdGl2aXR5IGJhc2UgPSAoQWN0aXZpdHkpIHJlZi5nZXRWYWx1ZSgpOwotCQkJCQkJYmF0Y2hDb21tYW5kCi0JCQkJCQkJCS5hZGRGZWF0dXJlVmFsdWUoCi0JCQkJCQkJCQkJYWN0LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUsCi0JCQkJCQkJCQkJUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShiYXNlKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhdGNoQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsKLQkJCWJhdGNoQ29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQotCQlyZWZSZW1vdmVkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcmVzb2x2ZSBhbGwgdGFyZ2V0IGZlYXR1cmVzIHNvCi0JICogb3Bwb3NpdGUgZmVhdHVyZXMgb2YgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgYXJlIGZ1bGx5IGxvYWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsZXRlZEdVSURzCi0JICogCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkT3Bwb3NpdGVGZWF0dXJlcyhMaXN0IG9wcG9zaXRlRmVhdHVyZXMsIFNldCBkZWxldGVkR1VJRHMpIHsKLQkJLy8KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVzdG9yZVJlZmVyZW5jZXMoTGlzdCByZW1vdmVkUmVmZXJlbmNlcykgewotCQlmb3IgKGludCBpID0gcmVtb3ZlZFJlZmVyZW5jZXMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCVJlZmVyZW5jZSByZWYgPSAoUmVmZXJlbmNlKSByZW1vdmVkUmVmZXJlbmNlcy5nZXQoaSk7Ci0JCQlpZiAocmVmLmZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgcmVmLm93bmVyLmVHZXQocmVmLmZlYXR1cmUpOwotCQkJCWlmIChyZWYuaW5kZXggIT0gLTEpIHsKLQkJCQkJLy8gVE9ETzogbmVlZCByZXZpc2l0cwotCQkJCQkvLwotCQkJCQlpZiAoIWxpc3QuY29udGFpbnMocmVmLnZhbHVlKSkgewotCQkJCQkJaWYgKHJlZi5pbmRleCA8IGxpc3Quc2l6ZSgpKSB7Ci0JCQkJCQkJbGlzdC5hZGQocmVmLmluZGV4LCByZWYudmFsdWUpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpZiAoVG5nVXRpbC5ERUJVRykgewotCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJLnByaW50bG4oIkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLnJlbW92ZVJlZmVyZW5jZXMoKTogaW5kZXg9IiArIHJlZi5pbmRleCArICIsIHNpemU9IiArIGxpc3Quc2l6ZSgpICsgIiwgcmVmZXJlbmNlcj0iICsgcmVmLm93bmVyICsgIiwgcmVmZXJlbmNlZD0iICsgcmVmLnZhbHVlICsgIiwgZmVhdHVyZT0iICsgcmVmLmZlYXR1cmUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCQkJCQl9Ci0JCQkJCQkJbGlzdC5hZGQocmVmLnZhbHVlKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChUbmdVdGlsLkRFQlVHKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLnJlbW92ZVJlZmVyZW5jZXMoKTogcmVmZXJlbmNlIGFscmVhZHkgZXhpc3RzOiByZWZlcmVuY2VyPSIgKyByZWYub3duZXIgKyAiLCByZWZlcmVuY2VkPSIgKyByZWYudmFsdWUgKyAiLCBmZWF0dXJlPSIgKyByZWYuZmVhdHVyZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWxpc3QuYWRkKHJlZi52YWx1ZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZWYub3duZXIuZVNldChyZWYuZmVhdHVyZSwgcmVmLnZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVSZWZlcmVuY2VzKCkgewotCQlpZiAoIXJlZlJlbW92ZWQpCi0JCQlyZXR1cm47Ci0KLQkJYmF0Y2hDb21tYW5kLnVuZG8oKTsKLQkJcmVzdG9yZVJlZmVyZW5jZXMocmVtb3ZlZFJlZmVyZW5jZXMpOwotCi0JCXJlZlJlbW92ZWQgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlub3RpZnlQcmVVbmRvKCk7Ci0JCXRyeSB7Ci0JCQlzdXBlci51bmRvKCk7Ci0JCQlyZXN0b3JlUmVmZXJlbmNlcygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJbm90aWZ5RmFpbHVyZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlpZiAoZXhlY3V0ZWQpIHsKLQkJCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ29tbWFuZExpc3RlbmVyKENvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoIWNvbW1hbmRMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQljb21tYW5kTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb21tYW5kTGlzdGVuZXIoQ29tbWFuZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWNvbW1hbmRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBDb21tYW5kTGlzdGVuZXIgewotCQl2b2lkIG5vdGlmeUV4ZWN1dGVkKEV2ZW50T2JqZWN0IGV2ZW50T2JqZWN0KTsKLQotCQl2b2lkIG5vdGlmeUZhaWx1cmUoRXZlbnRPYmplY3QgZXZlbnRPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVOZXN0ZWRDb21tYW5kcygpIHsKLQkJTGlzdCBuZXN0ZWRDb21tYW5kUHJvdmlkZXJzID0gRXh0ZW5zaW9uTWFuYWdlcgotCQkJCS5nZXROZXN0ZWRDb21tYW5kUHJvdmlkZXJzKCk7Ci0JCWlmICghbmVzdGVkQ29tbWFuZFByb3ZpZGVycy5pc0VtcHR5KCkpIHsKLQkJCWlmICghZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkJbmVzdGVkQ29tbWFuZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmVzdGVkQ29tbWFuZFByb3ZpZGVycy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlJTmVzdGVkQ29tbWFuZFByb3ZpZGVyIGNtZFByb3ZpZGVyID0gKElOZXN0ZWRDb21tYW5kUHJvdmlkZXIpIGl0ZXIKLQkJCQkJCQkubmV4dCgpOwotCQkJCQl0cnkgewotCQkJCQkJQ29tbWFuZCBjbWQgPSBjbWRQcm92aWRlci5yZW1vdmVSZWxhdGVkT2JqZWN0cyhlbGVtZW50cywKLQkJCQkJCQkJdGhpcyk7Ci0JCQkJCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgewotCQkJCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQkJCQkJbmVzdGVkQ29tbWFuZHMuYWRkKGNtZCk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG1vZGlmaWVkUmVzb3VyY2VzMgotCSAqLwotCXByaXZhdGUgdm9pZCBjb2xsZWN0TmVzdGVkQ29tbWFuZFJlc291cmNlcyhTZXQ8UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCQotCQlpZiAobmVzdGVkQ29tbWFuZHMgIT0gbnVsbCAmJiAhbmVzdGVkQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gbmVzdGVkQ29tbWFuZHMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlDb21tYW5kIGNtZCA9IChDb21tYW5kKSBuZXN0ZWRDb21tYW5kcy5nZXQoaSk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGNtZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCQkJQ29sbGVjdGlvbiByZXNvdXJjZXMgPSAoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgY21kKQotCQkJCQkJCQkuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQkJCQkJCWlmIChyZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbChyZXNvdXJjZXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9GdWxseVJldmVydGlibGVDb21tYW5kU3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzY4ZDM1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9GdWxseVJldmVydGlibGVDb21tYW5kU3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0RyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEEgY29tbWFuZCBzdGFjayB0aGF0IHRyaWVzIGl0cyBiZXN0IHRvIGZ1bGx5IHJldmVydCB0byBpdHMgaW5pdGlhbCBzdGF0ZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZ1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjayBleHRlbmRzIEJhc2ljQ29tbWFuZFN0YWNrIHsKLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIElFcnJvclJlcG9ydGVyIHsKLQkJdm9pZCBzaG93RXJyb3IoU3RyaW5nIG1zZyk7Ci0JfQotCi0JcHJpdmF0ZSBJRXJyb3JSZXBvcnRlciBlcnJSZXBvcnRlcjsKLQotCXByaXZhdGUgQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwdWJsaWMgRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrKEFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCXRoaXMuYWN0aW9uTWdyID0gYWN0aW9uTWdyOwotCX0KLQotCXB1YmxpYyBGdWxseVJldmVydGlibGVDb21tYW5kU3RhY2soQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsCi0JCQlJRXJyb3JSZXBvcnRlciBlcnJSZXBvcnRlcikgewotCQl0aGlzKGFjdGlvbk1ncik7Ci0JCXRoaXMuZXJyUmVwb3J0ZXIgPSBlcnJSZXBvcnRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvclJlcG9ydGVyKElFcnJvclJlcG9ydGVyIGVyclJlcG9ydGVyKSB7Ci0JCXRoaXMuZXJyUmVwb3J0ZXIgPSBlcnJSZXBvcnRlcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBkb0V4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWlmICghY29tbWFuZC5jYW5VbmRvKCkpCi0JCQlyZXR1cm4gZmFsc2U7IC8vIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdAotCQkvLyBleGVjdXRlIGNvbW1hbmQgdGhhdCBjYW5ub3QgZGUgdW5kb25lIik7Ci0JCXN1cGVyLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCQotCQkvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciBBY3Rpdml0eURyb3BDb21tYW5kCi0JCS8vCi0JCS8vIFRPRE86IGFsbCBjb21tYW5kcyBtdXN0IHJldHVybiBhIGNvcnJlY3QgdmFsdWUgaW4gZ2V0QWZmZWN0ZWRPYmplY3QoKQotCQkvLyBpZiBnZXRBZmZlY3RlZE9iamVjdCgpIHJldHVybiBhbiBlbXB0eSBjb2xsZWN0aW9uLCB0aGUgYWN0aW9uIG1hbmFnZXIKLQkJLy8gd2lsbCBub3QgcmVnaXN0ZXIgaXQgYXMgYSBtb2RpZmllciBvZiB0aGUgcmVzb3VyY2VzIHJldHVybmVkIGJ5IGdldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkJLy8gYW5kIHRoZSBlZGl0b3IgbWlnaHQgbm90IGJlIG1hcmtlZCBkaXJ0eSBhcyB0aGUgcmVzdWx0LgotCQkvLwotCQlpZihjb21tYW5kIGluc3RhbmNlb2YgQlNEcmFnQW5kRHJvcENvbW1hbmQgJiYgY29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKS5pc0VtcHR5KCkpIHsKLQkJCWlmKHRvcCAhPSAtMSkgewotCQkJCWNvbW1hbmRMaXN0LnJlbW92ZSh0b3AtLSk7Ci0JCQkJaWYodG9wICE9IC0xKSB7Ci0JCQkJCW1vc3RSZWNlbnRDb21tYW5kID0gKENvbW1hbmQpIGNvbW1hbmRMaXN0LmdldCh0b3ApOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbW9zdFJlY2VudENvbW1hbmQgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJYm9vbGVhbiByZXQgPSBnZXRNb3N0UmVjZW50Q29tbWFuZCgpICE9IG51bGw7Ci0JCWlmIChyZXQgJiYgYWN0aW9uTWdyICE9IG51bGwpIHsKLQkJCWlmIChjb21tYW5kIGluc3RhbmNlb2YgSVJlc291cmNlQXdhcmVDb21tYW5kKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIGNvbW1hbmQpCi0JCQkJCQkuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQlhY3Rpb25NZ3IucmVnaXN0ZXJBc01vZGlmaWVyT2YocmVzb3VyY2UpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJRU9iamVjdCBtb2RpZmllZCA9IFRuZ1V0aWwuZ2V0T3duZXIoY29tbWFuZCk7Ci0JCQkJaWYgKG1vZGlmaWVkICE9IG51bGwpIHsKLQkJCQkJYWN0aW9uTWdyLnJlZ2lzdGVyQXNNb2RpZmllck9mKG1vZGlmaWVkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJbm90aWZ5TGlzdGVuZXJzKG5ldyBDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQodGhpcywKLQkJCQlDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQuRVhFQ1VURUQpKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQlkb0V4ZWN1dGUoY29tbWFuZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJc3VwZXIucmVkbygpOwotCQlub3RpZnlMaXN0ZW5lcnMobmV3IENvbW1hbmRTdGFja0NoYW5nZWRFdmVudCh0aGlzLAotCQkJCUNvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5FWEVDVVRFRCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChjYW5VbmRvKCkpIHsKLQkJCUNvbW1hbmQgY29tbWFuZCA9IChDb21tYW5kKSBjb21tYW5kTGlzdC5nZXQodG9wLS0pOwotCQkJdHJ5IHsKLQkJCQljb21tYW5kLnVuZG8oKTsKLQkJCQltb3N0UmVjZW50Q29tbWFuZCA9IGNvbW1hbmQ7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmxvZyhuZXcgV3JhcHBlZEV4Y2VwdGlvbigKLQkJCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0lnbm9yZUV4Y2VwdGlvbl9leGNlcHRpb24iKSwgZXhjZXB0aW9uKS5maWxsSW5TdGFja1RyYWNlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQltb3N0UmVjZW50Q29tbWFuZCA9IG51bGw7Ci0JCQkJdG9wKys7Ci0KLQkJCQlpZiAoZXJyUmVwb3J0ZXIgIT0gbnVsbCkgewotCQkJCQlPYmplY3RbXSBvYmplY3QgPSBuZXcgT2JqZWN0WzFdOwotCQkJCQlvYmplY3RbMF0gPSBjb21tYW5kOwotCQkJCQlvYmplY3RbMV0gPSBleGNlcHRpb247Ci0JCQkJCWVyclJlcG9ydGVyLnNob3dFcnJvcihOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy51bmRvQ29tbWFuZEVycm9yX21zZywgb2JqZWN0KSk7IAotCQkJCX0KLQkJCX0KLQkJCW5vdGlmeUxpc3RlbmVycyhuZXcgQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50KHRoaXMsCi0JCQkJCUNvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5VTkRPKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1bmRvQWxsKCkgewotCQl0cnkgewotCQkJd2hpbGUgKGNhblVuZG8oKSkgewotCQkJCUNvbW1hbmQgY29tbWFuZCA9IChDb21tYW5kKSBjb21tYW5kTGlzdC5nZXQodG9wLS0pOwotCQkJCXRyeSB7Ci0JCQkJCWNvbW1hbmQudW5kbygpOwotCQkJCQltb3N0UmVjZW50Q29tbWFuZCA9IGNvbW1hbmQ7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmxvZyhuZXcgV3JhcHBlZEV4Y2VwdGlvbigKLQkJCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfSWdub3JlRXhjZXB0aW9uX2V4Y2VwdGlvbiIpLCBleGNlcHRpb24pLmZpbGxJblN0YWNrVHJhY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQltb3N0UmVjZW50Q29tbWFuZCA9IG51bGw7Ci0JCQkJCXRvcCsrOwotCi0JCQkJCWlmIChlcnJSZXBvcnRlciAhPSBudWxsKSB7Ci0JCQkJCQkvLyBlcnJSZXBvcnRlci5zaG93RXJyb3IoIkNhbm5vdCB1bmRvIGNvbW1hbmQ6ICciICsKLQkJCQkJCS8vIGNvbW1hbmQgKyAiJywgZXhjZXB0aW9uOiAiICsgZXhjZXB0aW9uKTsKLQkJCQkJCU9iamVjdFtdIG9iamVjdCA9IG5ldyBPYmplY3RbMV07Ci0JCQkJCQlvYmplY3RbMF0gPSBjb21tYW5kOwotCQkJCQkJb2JqZWN0WzFdID0gZXhjZXB0aW9uOwotCQkJCQkJZXJyUmVwb3J0ZXIKLQkJCQkJCQkJLnNob3dFcnJvcihOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy51bmRvQ29tbWFuZEVycm9yX21zZywgb2JqZWN0KSk7IAotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW5vdGlmeUxpc3RlbmVycyhuZXcgQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50KHRoaXMsCi0JCQkJCUNvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5VTkRPX0FMTCkpOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCSgoQ29tbWFuZFN0YWNrTGlzdGVuZXIpIGkubmV4dCgpKS5jb21tYW5kU3RhY2tDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVycygpIHsKLQkJLy8KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlSXNEb25lKCkgewotCQlzdXBlci5zYXZlSXNEb25lKCk7Ci0JCW5vdGlmeUxpc3RlbmVycyhuZXcgQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50KHRoaXMsCi0JCQkJQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50LlNBVkVEKSk7Ci0JCWNvbW1hbmRMaXN0LmNsZWFyKCk7Ci0JCXRvcCA9IC0xOwotCQlzYXZlSW5kZXggPSAtMTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjayNpc1NhdmVOZWVkZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZU5lZWRlZCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzU2F2ZU5lZWRlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSUFjdGlvbk1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lBY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE5ZjA3ZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSUFjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgY2xhc3MgaXMgdXNlZCB0byBzdXBwb3J0IHVuZG8gb3BlcmF0aW9ucyBpbiB0aGUKLSAqIGZvcm0gZWRpdG9ycy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWN0aW9uTWFuYWdlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVQgPSBOb3RpZmljYXRpb24uU0VUOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREID0gTm90aWZpY2F0aW9uLkFERDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRSA9IE5vdGlmaWNhdGlvbi5SRU1PVkU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfTUFOWSA9IE5vdGlmaWNhdGlvbi5BRERfTUFOWTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9NQU5ZID0gTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOwotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGFjdGlvbiBhcyBkZXNjcmliZWQgaW4gcGFyYW1ldGVycwotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25UeXBlCi0JICogICAgICAgICAgICBvbmUgb2YgdGhlIGFib3ZlIGRlZmluZWQgYWN0aW9uIGNvbnN0YW50cwotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gcGVyZm9ybSBhY3Rpb24gdXBvbgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICB0aGUgZmVhdHVyZSB0byBiZSBtb2RpZmllZAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIGZlYXR1cmUgdmFsdWUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIHNwZWNpZnkgLTEgaWYgbm8gaW5kZXgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN1Y2Nlc3NmdWxsLCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZQotCSAqLwotCWJvb2xlYW4gZG9BY3Rpb24oaW50IGFjdGlvblR5cGUsIEVPYmplY3Qgb2JqZWN0LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBjb21tYW5kCi0JICogCi0JICogQHBhcmFtIGNtZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc3VjY2Vzc2Z1bGwsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgb3RoZXJ3aXNlCi0JICovCi0JYm9vbGVhbiBleGVjdXRlKElSZXNvdXJjZUF3YXJlQ29tbWFuZCBjbWQpOwotCi0Jdm9pZCB1bmRvKCk7Ci0KLQl2b2lkIHJlZG8oKTsKLQotCWJvb2xlYW4gdW5kb0FsbCgpOwotCi0Jdm9pZCBzYXZlSXNEb25lKCk7Ci0KLQlib29sZWFuIGlzU2F2ZU5lZWRlZCgpOwotCi0JLyoqCi0JICogR2V0cyByZXNvdXJjZXMgZmlyc3QgbW9kaWZpZWQgYnkgdGhpcyBhY3Rpb24gbWFuYWdlcgotCSAqLwotCUNvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQotCXZvaWQgZGlzcG9zZSgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmMDcxMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEF1ZyAxNywgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRMaXN0ZW5lciBleHRlbmRzIElDb21tYW5kTGlzdGVuZXIgewotCS8qKgotCSAqIENvbGxlY3RzIG9iamVjdHMgd2hvc2UgY29udGVudCBtdXN0IGJlIGRlbGV0ZWQgaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgZGVsZXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29sbGVjdGVkT2JqZWN0cwotCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRoYXQgd2lsbCBiZSBkZWxldGVkLgotCSAqLwotCXZvaWQgY29sbGVjdE9iamVjdHNUb0RlbGV0ZUNvbnRlbnQoQ29sbGVjdGlvbiBjb2xsZWN0ZWRPYmplY3RzLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpOwkKLQotCS8qKgotCSAqIENvbGxlY3RzIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZCBpZiA8Y29kZT5lbGVtZW50VG9EZWxldGU8L2NvZGU+IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIAotCSAqIDxjb2RlPnJlZmVyZW5jZXM8L2NvZGU+IG9mIDxjb2RlPnJlZmVyZW5jZXI8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3RzVG9SZW1vdmUgb3V0cHV0IAotCSAqIEBwYXJhbSByZWZlcmVuY2VyIGVsZW1lbnQgdGhhdCByZWZlcmVuY2VzIHRvIGVsZW1lbnRUb0RlbGV0ZQotCSAqIEBwYXJhbSByZWZlcmVuY2VzIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEVSZWZlcmVuY2V9IHRoYXQgY29udGFpbnMgZWxlbWVudFRvRGVsZXRlCi0JICogQHJldHVybiB0cnVlIGlmIG9uZSBvZiB0aGUgY29sbGVjdGVkIG9iamVjdHMgaXMgdGhlIDxjb2RlPnJlZmVyZW5jZXI8L2NvZGU+IG9yIGNvbnRhaW5lciBvZiA8Y29kZT5yZWZlcmVuY2VyPC9jb2RlPgotCSAqLwotCWJvb2xlYW4gY29sbGVjdE9iamVjdHNUb1JlbW92ZShDb2xsZWN0aW9uIG9iamVjdHNUb1JlbW92ZSwgRU9iamVjdCBlbGVtZW50VG9EZWxldGUsIEVPYmplY3QgcmVmZXJlbmNlciwgQ29sbGVjdGlvbiByZWZlcmVuY2VzKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSUludGVyYWN0aXZlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JSW50ZXJhY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWNiMWMwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JSW50ZXJhY3RpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAzLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJbnRlcmFjdGl2ZSB7Ci0Jdm9pZCBzZXRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKElVc2VySW50ZXJhY3Rpb25IYW5kbGVyIGhhbmRsZXIpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSU1vZGlmeUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lNb2RpZnlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg2YjQ0OTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSU1vZGlmeUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RpZnlDb21tYW5kIHsKLQkKLQlDb2xsZWN0aW9uIGdldE1vZGlmaWVkT2JqZWN0cygpOwotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSU5lc3RlZENvbW1hbmRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSU5lc3RlZENvbW1hbmRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NDU4ZTFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lOZXN0ZWRDb21tYW5kUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci0KLS8qKgotICogUHJvdmlkZXMgbmVzdGVkIGNvbW1hbmRzIHRvIGV4ZWN1dGUgcmlnaHQgYWZ0ZXIgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWFpbiBjb21tYW5kCi0gKiAgCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEF1ZyAxNywgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTmVzdGVkQ29tbWFuZFByb3ZpZGVyIHsKLQlDb21tYW5kIGNyZWF0ZVJlbGF0ZWRPYmplY3RzKENvbGxlY3Rpb24gY3JlYXRlZEVsZW1lbnRzLCBDb21tYW5kIGNyZWF0ZUNvbW1hbmQpOwotCUNvbW1hbmQgcmVtb3ZlUmVsYXRlZE9iamVjdHMoQ29sbGVjdGlvbiBkZWxldGVkRWxlbWVudHMsIENvbW1hbmQgZGVsZXRlQ29tbWFuZCk7Ci0JQ29tbWFuZCBjcmVhdGVOZXN0ZWRDb21tYW5kKENvbW1hbmQgY29tbWFuZCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JUmVzb3VyY2VBd2FyZUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lSZXNvdXJjZUF3YXJlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MWU1MTEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lSZXNvdXJjZUF3YXJlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIHJlc291cmNlIGF3YXJlIGNvbW1hbmQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlc291cmNlQXdhcmVDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lVc2VySW50ZXJhY3Rpb25IYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JVXNlckludGVyYWN0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZWM5NTA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lVc2VySW50ZXJhY3Rpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotCi0vKioKLSAqIEludGVyZmFjZSB0byBoYW5kbGUgdXNlciBpbnRlcmFjdGlvbnMgZHVyaW5nIGNvbW1hbmQgZXhlY3V0aW9uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDMsIDIwMDYKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVXNlckludGVyYWN0aW9uSGFuZGxlciB7Ci0JLyoqCi0JICogRGVsaXZlcnMgbWVzc2FnZXMgdG8gdXNlcnMKLQkgKiAKLQkgKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAyNiwgMjAwNgotCSAqIEBzaW5jZSAxLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBJTWVzc2VuZ2VyIHsKLQkJLyoqCi0JCSAqIFNob3dzIGluZm9ybWF0aW9uIG1lc3NhZ2UKLQkJICogCi0JCSAqIEBwYXJhbSB0aXRsZQotCQkgKiBAcGFyYW0gbXNnCi0JCSAqLwotCQl2b2lkIHNob3dJbmZvKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZyk7Ci0KLQkJLyoqCi0JCSAqIFNob3dzIHdhcm5pbmcgbWVzc2FnZQotCQkgKiAKLQkJICogQHBhcmFtIHRpdGxlCi0JCSAqIEBwYXJhbSBtc2cKLQkJICovCi0JCXZvaWQgc2hvd1dhcm5pbmcoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKTsKLQotCQkvKioKLQkJICogU2hvd3Mgd2FybmluZyBtZXNzYWdlIHdpdGggcmVhc29uCi0JCSAqIAotCQkgKiBAcGFyYW0gdGl0bGUKLQkJICogQHBhcmFtIG1zZwotCQkgKiBAcGFyYW0gc3RyaW5nCi0JCSAqLwotCQl2b2lkIHNob3dXYXJuaW5nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbik7Ci0KLQkJLyoqCi0JCSAqIFNob3dzIGVycm9yIG1lc3NhZ2UKLQkJICogCi0JCSAqIEBwYXJhbSB0aXRsZQotCQkgKiBAcGFyYW0gbXNnCi0JCSAqLwotCQl2b2lkIHNob3dFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpOwotCi0JCS8qKgotCQkgKiBTaG93cyBlcnJvciBtZXNzYWdlIHdpdGggc3RhdHVzCi0JCSAqIAotCQkgKiBAcGFyYW0gdGl0bGUKLQkJICogQHBhcmFtIG1zZwotCQkgKiBAcGFyYW0gc3RhdHVzCi0JCSAqLwotCQl2b2lkIHNob3dFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIElTdGF0dXMgc3RhdHVzKTsKLQotCQkvKioKLQkJICogU2hvd3MgZXJyb3IgbWVzc2FnZSB3aXRoIHJlYXNvbiBhbmQgZXhjZXB0aW9uCi0JCSAqIAotCQkgKiBAcGFyYW0gdGl0bGUKLQkJICogQHBhcmFtIG1zZwotCQkgKiBAcGFyYW0gcmVhc29uCi0JCSAqIEBwYXJhbSBleGNlcHRpb24KLQkJICovCi0JCXZvaWQgc2hvd0Vycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwKLQkJCQlFeGNlcHRpb24gZXhjZXB0aW9uKTsKLQotCQl2b2lkIHNob3dFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sIFN0cmluZyBkZXRhaWxzLAotCQkJCUV4Y2VwdGlvbiBleGNlcHRpb24pOwotCX0KLQotCS8qKgotCSAqIEFjdGlvbiBjb25zdGFudCBmb3IgdXNlciBhY2NlcHRhbmNlCi0JICovCi0Jc3RhdGljIGZpbmFsIGludCBBQ1RJT05fT0sgPSAwOwotCi0JLyoqCi0JICogQWN0aW9uIGNvbnN0YW50IGZvciB1c2VyIGNhbmNlbGxhdGlvbgotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX0NBTkNFTCA9IDE7Ci0KLQkvKioKLQkgKiBBY3Rpb24gY29uc3RhbnQgZm9yIHJldHJ5Ci0JICovCi0Jc3RhdGljIGZpbmFsIGludCBBQ1RJT05fUkVUUlkgPSAyOwotCi0JLyoqCi0JICogQWN0aW9uIGNvbnN0YW50IGZvciBhYm9ydAotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX0FCT1JUID0gMzsKLQkKLQlzdGF0aWMgZmluYWwgaW50IEFDVElPTl9ZRVMgPSA0OwotCQotCXN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX05PID0gNTsKLQotCS8qKgotCSAqIFNlbGVjdHMgb2JqZWN0cyBmcm9tIHRoZSBzcGVjaWZpZWQgbGlzdCA8Y29kZT5vYmplY3RzVG9TZWxlY3Q8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3RzVG9TZWxlY3QKLQkgKiAgICAgICAgICAgIG9iamVjdHMgZm9yIHVzZXIgdG8gc2VsZWN0Ci0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIKLQkgKiAgICAgICAgICAgIGxhYmVsIHByb3ZpZGVyIHVzZWQgdG8gZGlzcGxheSB0aGUgZ2l2ZW4gb2JqZWN0cyB0byB1c2VyCi0JICogQHBhcmFtIG11bHRpcGxlCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiB3aWxsIGFsbG93IG11bHRpcGxlIHNlbGVjdGlvbiwgc2luZ2xlCi0JICogICAgICAgICAgICBzZWxlY3Rpb24gaWYgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICB0aGUgdGl0bGUgb2YgdGhpcyBzZWxlY3Rpb24gYWN0aW9uIHRvIGRpc3BsYXkgdG8gdXNlcgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgdG8gdXNlcgotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgZWxlbWVudHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogICAgICAgICB0aGUgc2VsZWN0aW9uIHdhcyBjYW5jZWxlZC4KLQkgKi8KLQlMaXN0IHNlbGVjdChMaXN0IG9iamVjdHNUb1NlbGVjdCwgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkJCWJvb2xlYW4gbXVsdGlwbGUsIExpc3QgaW50aXRpYWxTZWxlY3Rpb24sIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZyk7Ci0KLQkvKioKLQkgKiBTZWxlY3RzIG9ubHkgb25lIGFjdGlvbiBmcm9tIHRoZSBnaXZlbiBhcnJheSBvZiBhY3Rpb25zLiBUaGUgYWN0aW9ucyBtdXN0Ci0JICogYmUgdGhlIGNvbnN0YW50cyB7QGxpbmsgI0FDVElPTl9BQk9SVH0sIHtAbGluayAjQUNUSU9OX0NBTkNFTH0sCi0JICoge0BsaW5rICNBQ1RJT05fT0t9LCB7QGxpbmsgI0FDVElPTl9SRVRSWX0sIEFDVElPTl9YWFgKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9ucwotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogQHJldHVybgotCSAqLwotCWludCBzZWxlY3RPbmUoaW50W10gYWN0aW9ucywgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBJU3RhdHVzIHN0YXR1cyk7Ci0KLQkvKioKLQkgKiBSZXF1ZXN0cyB1c2VyIGlucHV0cy4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiBAcGFyYW0gbXNnCi0JICogQHBhcmFtIHVzZXJJbnB1dHMKLQkgKiAgICAgICAgICAgIGxpc3Qgb2Yge0BsaW5rIFVzZXJJbnB1dCB1c2VyIGlucHV0c30gdGhhdCBoYXZlIGluZm9ybWF0aW9uCi0JICogICAgICAgICAgICBhYm91dCBpbnB1dCByZXF1ZXN0cyBhbmQgcmVmZXJlbmNlIHRvIHRoZSBpbnB1dC4gVGhlIGlucHV0Ci0JICogICAgICAgICAgICByZWZlcmVuY2Ugc2hvdWxkIGJlIHNldCB0byB0aGUgb2JqZWN0IHRoYXQgdXNlciBzcGVjaWZpZWQgb3IKLQkgKiAgICAgICAgICAgIHNlbGVjdGVkLgotCSAqIEByZXR1cm4gZmFsc2UgaWYgdXNlciBjYW5jZWxsZWQgdGhpcyByZXF1ZXN0Ci0JICovCi0JYm9vbGVhbiByZXF1ZXN0SW5wdXQoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBMaXN0IHVzZXJJbnB1dHMpOwotCi0JLyoqCi0JICogR2V0cyBVSSBjb250ZXh0Ci0JICogCi0JICogQHJldHVybiB0aGUgVUkgY29udGV4dAotCSAqLwotCU9iamVjdCBnZXRVSUNvbnRleHQoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHJ1bm5hYmxlIGNvbnRleHQuCi0JICogCi0JICogQHJldHVybiB0aGUgcnVubmFibGUgY29udGV4dAotCSAqLwotCUlSdW5uYWJsZUNvbnRleHQgZ2V0UnVubmFibGVDb250ZXh0KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXNzZW5nZXIKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JSU1lc3NlbmdlciBnZXRNZXNzZW5nZXIoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRBZGRDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50QWRkQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMzk5MDQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRBZGRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudHNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklUZXh0UmVmZXJlbmNlUmVwbGFjZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1lc3NlbmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsLkNvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWwuVW5pcXVlbmVzc1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuZG9tYWluLlRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLk1lc3NhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JSW5wdXRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JbnB1dERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5Nb2RhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBhZGQgYSBtZXRob2QgZWxlbWVudCB0byBhIGNvbnRhaW5pbmcgbWV0aG9kIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kV3JhcHBlciBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5VbmRvID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBBZGRDb21tYW5kIGFkZENvbW1hbmQ7Ci0KLQkvLyBwcm90ZWN0ZWQgTWFwIGVsZW1lbnRUb05ld05hbWVNYXA7Ci0JcHJvdGVjdGVkIE1hcCBlbGVtZW50VG9PbGRQbHVnaW5NYXA7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVYUmVmUmVxdWlyZWQ7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kUGx1Z2luIG93bmVyUGx1Z2luOwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBhZGRMaXN0OwotCi0JcHJvdGVjdGVkIE11bHRpU3RhdHVzIHN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLk9LLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBib29sZWFuIHJ1bldpdGhQcm9ncmVzczsKLQotCXByb3RlY3RlZCBBcnJheUxpc3QgZmVhdHVyZXNUb0NoZWNrOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgbmVzdGVkQ29tbWFuZHM7Ci0KLQlwcml2YXRlIEhhc2hTZXQgbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXRoaXMoY29tbWFuZCwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKENvbW1hbmQgY29tbWFuZCwgYm9vbGVhbiBydW5XaXRoUHJvZ3Jlc3MpIHsKLQkJc3VwZXIoY29tbWFuZCk7Ci0JCWFkZENvbW1hbmQgPSAoQWRkQ29tbWFuZCkgVG5nVXRpbC51bndyYXAoY29tbWFuZCk7Ci0JCXNldFJ1bldpdGhQcm9ncmVzcyhydW5XaXRoUHJvZ3Jlc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJ1bldpdGhQcm9ncmVzcyhib29sZWFuIHJ1bldpdGhQcm9ncmVzcykgewotCQl0aGlzLnJ1bldpdGhQcm9ncmVzcyA9IHJ1bldpdGhQcm9ncmVzczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gY2FuVW5kbzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlciNnZXRSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRXJyb3IoSVN0YXR1cyBlcnJvclN0YXR1cykgewotCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd0Vycm9yKGdldExhYmVsKCksIExpYnJhcnlFZGl0UmVzb3VyY2VzLmNyZWF0ZUVsZW1lbnRFcnJvcl9tc2csIGVycm9yU3RhdHVzKTsKLQkJc3RhdHVzLmFkZChlcnJvclN0YXR1cyk7Ci0JCXN0YXR1cy5hZGRBbGwoZXJyb3JTdGF0dXMpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CQotCQkvLyBkaXNwb3NlIHRoZSBuZXN0ZWQgY29tbWFuZHMKLQkJaWYgKG5lc3RlZENvbW1hbmRzICE9IG51bGwgJiYgIW5lc3RlZENvbW1hbmRzLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IG5lc3RlZENvbW1hbmRzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSAoQ29tbWFuZCkgbmVzdGVkQ29tbWFuZHMuZ2V0KGkpOwotCQkJCXRyeSB7Ci0JCQkJCWNtZC5kaXNwb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlTaGVsbCBzaGVsbCA9IE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKTsKLQkJLy8gQ2hlY2sgd2hldGhlciB0aGUgb3duZXIgcmVzb3VyY2UgY2FuIGJlIG1vZGlmaWVkLgotCQkvLwotCQlDb2xsZWN0aW9uIHJlc291cmNlc1RvQ2hhbmdlID0gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQkJSVN0YXR1cyBleGVjU3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KAotCQkJCXJlc291cmNlc1RvQ2hhbmdlLCBzaGVsbCk7Ci0JCWlmICghZXhlY1N0YXR1cy5pc09LKCkpIHsKLQkJCWhhbmRsZUVycm9yKGV4ZWNTdGF0dXMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWV4ZWNTdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tDb25maWd1cmF0aW9uc1RvVXBkYXRlKAotCQkJCWFkZENvbW1hbmQsIHNoZWxsKTsKLQkJaWYgKCFleGVjU3RhdHVzLmlzT0soKSkgewotCQkJaGFuZGxlRXJyb3IoZXhlY1N0YXR1cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHdpbGxTYXZlTW9kaWZpZWRSZXNvdXJjZXMoKQotCQkJCSYmICFVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tPdXRPZlN5bmNoKHJlc291cmNlc1RvQ2hhbmdlKSkgewotCQkJc3RhdHVzLmFkZChTdGF0dXMuQ0FOQ0VMX1NUQVRVUyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBpZighY2hlY2tGb2xkZXIoc2hlbGwpKSB7Ci0JCS8vIHJldHVybjsKLQkJLy8gfQotCi0JCWRvQWRkKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXIjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJdW5kb05lc3RlZENvbW1hbmRzKCk7Ci0JCXN1cGVyLnVuZG8oKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgdW5kb05lc3RlZENvbW1hbmRzKCkgewotCQlpZiAobmVzdGVkQ29tbWFuZHMgIT0gbnVsbCAmJiAhbmVzdGVkQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gbmVzdGVkQ29tbWFuZHMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlDb21tYW5kIGNtZCA9IChDb21tYW5kKSBuZXN0ZWRDb21tYW5kcy5nZXQoaSk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGNtZC5jYW5VbmRvKCkpIHsKLQkJCQkJCWNtZC51bmRvKCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNtZC5kaXNwb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrRm9sZGVyKFNoZWxsIHNoZWxsKSB7Ci0JCS8vIGlmIGFueSBvZiB0aGUgZWxlbWVudHMgdG8gYmUgYWRkZWQgd2lsbCBiZSBzYXZlZCBpbiBpdHMgb3duIGZpbGUKLQkJLy8gY2hlY2sgaWYgdGhlIGZvbGRlciB0byBzYXZlIHRoZSBmaWxlIHRvIGNhbiBiZSBtb2RpZmllZAotCQkvLwotCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSAoSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpIFNlcnZpY2VzLmdldExpYnJhcnlQZXJzaXN0ZXIoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpOwotCQlBcnJheUxpc3QgZm9sZGVyc1RvQ2hlY2sgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJJiYgcGVyc2lzdGVyLmhhc093blJlc291cmNlKGVsZW1lbnQpKSB7Ci0JCQkJU3RyaW5nIGZvbGRlciA9IHBlcnNpc3Rlci5nZXRGb2xkZXJSZWxhdGl2ZVBhdGgoCi0JCQkJCQkJCShNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oYWRkQ29tbWFuZAotCQkJCQkJLmdldE93bmVyKCkpOwotCQkJCVN0cmluZyBiYXNlRm9sZGVyID0gbnVsbDsKLQkJCQlpZiAocGx1Z2luID09IG51bGwpIHsKLQkJCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoYWRkQ29tbWFuZAotCQkJCQkJCS5nZXRPd25lcigpKTsKLQkJCQkJYmFzZUZvbGRlciA9IG5ldyBGaWxlKGxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkJCS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYmFzZUZvbGRlciA9IG5ldyBGaWxlKHBsdWdpbi5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkJCS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCk7Ci0JCQkJfQotCQkJCWZvbGRlcnNUb0NoZWNrLmFkZChiYXNlRm9sZGVyICsgRmlsZS5zZXBhcmF0b3IgKyBmb2xkZXIpOwotCQkJfQotCQl9Ci0JCWlmICghZm9sZGVyc1RvQ2hlY2suaXNFbXB0eSgpKSB7Ci0JCQlTdHJpbmdbXSBmb2xkZXJzID0gbmV3IFN0cmluZ1tmb2xkZXJzVG9DaGVjay5zaXplKCldOwotCQkJZm9sZGVyc1RvQ2hlY2sudG9BcnJheShmb2xkZXJzKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKQotCQkJCQkuY2hlY2tNb2RpZnkoZm9sZGVycywgc2hlbGwpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJaGFuZGxlRXJyb3Ioc3RhdHVzKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc01vdmUoKSB7Ci0JCUNvbW1hbmQgY21kID0gVG5nVXRpbC51bndyYXAoY29tbWFuZCk7Ci0JCWlmIChjbWQgaW5zdGFuY2VvZiBBZGRDb21tYW5kKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKEFkZENvbW1hbmQpIGNtZCkuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG93bmVyUGx1Z2luCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIExpc3Qgb2YgUmVmZXJlbmNlIG9iamVjdHMgdGhhdCBrZWVwcyB0aGUgaW5mbyBvZiBpbGxlZ2FsIG91dGdvaW5nCi0JICogICAgICAgICByZWZlcmVuY2VzCi0JICogQHNlZSBSZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0SWxsZWdhbE91dGdvaW5nUmVmZXJlbmNlcygKLQkJCU1ldGhvZFBsdWdpbiBvd25lclBsdWdpbiwgRU9iamVjdCBlLCBDb2xsZWN0aW9uIGlsbGVnYWxSZWZlcmVuY2VzKSB7Ci0JCWlmIChpbGxlZ2FsUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlpbGxlZ2FsUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlmb3IgKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvciBmZWF0dXJlSXRlcmF0b3IgPSAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yKSBlCi0JCQkJLmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBmZWF0dXJlSXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGZlYXR1cmVJdGVyYXRvci5uZXh0KCk7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZU9iamVjdCk7Ci0JCQlpZiAocGx1Z2luICE9IG51bGwgJiYgcGx1Z2luICE9IG93bmVyUGx1Z2luCi0JCQkJCSYmICFNaXNjLmlzQmFzZU9mKHBsdWdpbiwgb3duZXJQbHVnaW4pKSB7Ci0JCQkJLy8gaWxsZWdhbCByZWZlcmVuY2UgdG8gYmUgcmVtb3ZlZAotCQkJCS8vCi0JCQkJaWxsZWdhbFJlZmVyZW5jZXMuYWRkKG5ldyBSZWZlcmVuY2UoZSwgZmVhdHVyZUl0ZXJhdG9yCi0JCQkJCQkuZmVhdHVyZSgpLCBlT2JqZWN0LCAtMSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbGxlZ2FsUmVmZXJlbmNlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZVJlZmVyZW5jZXMoQ29sbGVjdGlvbiByZWZlcmVuY2VzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVmLmZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlMaXN0IGxpc3QgPSAoKExpc3QpIHJlZi5vd25lci5lR2V0KHJlZi5mZWF0dXJlKSk7Ci0JCQkJbGlzdC5yZW1vdmUocmVmLnZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVmLm93bmVyLmVTZXQocmVmLmZlYXR1cmUsIG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIExpc3Qgb2YgUmVmZXJlbmNlIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gcmVtb3ZlSWxsZWdhbFJlZmVyZW5jZXMoTWV0aG9kUGx1Z2luIG93bmVyUGx1Z2luLAotCQkJRU9iamVjdCBlKSB7Ci0JCUNvbGxlY3Rpb24gcmVtb3ZlUmVmcyA9IGdldElsbGVnYWxPdXRnb2luZ1JlZmVyZW5jZXMob3duZXJQbHVnaW4sIGUsCi0JCQkJbnVsbCk7Ci0KLQkJLy8gcmVtb3ZlIGlsbGVnYWwgcmVmZXJlbmNlcwotCQkvLwotCQlyZW1vdmVSZWZlcmVuY2VzKHJlbW92ZVJlZnMpOwotCi0JCXJldHVybiByZW1vdmVSZWZzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVJbGxlZ2FsUmVmZXJlbmNlc1JlY3Vyc2l2ZWx5KAotCQkJTWV0aG9kUGx1Z2luIG93bmVyUGx1Z2luLCBFT2JqZWN0IGUpIHsKLQkJcmVtb3ZlSWxsZWdhbFJlZmVyZW5jZXMob3duZXJQbHVnaW4sIGUpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZS5lQWxsQ29udGVudHMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJcmVtb3ZlSWxsZWdhbFJlZmVyZW5jZXMob3duZXJQbHVnaW4sIGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNOZXh0KEl0ZXJhdG9yIGl0ZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBpdGVyLmhhc05leHQoKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgZXg7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzSWxsZWdhbFJlZmVyZW5jZShNZXRob2RQbHVnaW4gb3duZXJQbHVnaW4sCi0JCQlFT2JqZWN0IGUsIENvbGxlY3Rpb24gbW92ZUxpc3QpIHsKLQkJZm9yIChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IgZmVhdHVyZUl0ZXJhdG9yID0gKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcikgZQotCQkJCS5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgaGFzTmV4dChmZWF0dXJlSXRlcmF0b3IpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGZlYXR1cmVJdGVyYXRvci5uZXh0KCk7Ci0KLQkJCS8vIGNoZWNrIGlmIHRoZSB4LXJlZiBvYmplY3QgaXMgaW4gdGhlIG1vdmUgbGlzdAotCQkJLy8KLQkJCWlmICghbW92ZUxpc3QuY29udGFpbnMoZU9iamVjdCkpIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZU9iamVjdCk7Ci0JCQkJaWYgKHBsdWdpbiAhPSBudWxsICYmIHBsdWdpbiAhPSBvd25lclBsdWdpbgotCQkJCQkJJiYgIU1pc2MuaXNCYXNlT2YocGx1Z2luLCBvd25lclBsdWdpbikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgaXMgcmVmZXJlbmNlZCBpbGxlZ2FsbHkgYWZ0ZXIgdGhlIG1vdmUuCi0JICogCi0JICogQHBhcmFtIG93bmVyUGx1Z2luCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gbW92ZUxpc3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVmZXJlbmNlZElsbGVnYWxseShNZXRob2RQbHVnaW4gb3duZXJQbHVnaW4sCi0JCQlNZXRob2RFbGVtZW50IGUsIENvbGxlY3Rpb24gbW92ZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZWZlcmVuY2VzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVmZXJlbmNlcyhlKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQotCQkJaWYgKGlzRXhjbHVkZWRGcm9tT3V0Z29pbmdSZWZlcmVuY2VDaGVjayhlbGVtZW50KSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoIW1vdmVMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQkJCWlmIChwbHVnaW4gIT0gbnVsbCAmJiBwbHVnaW4gIT0gb3duZXJQbHVnaW4KLQkJCQkJCSYmICFNaXNjLmlzQmFzZU9mKG93bmVyUGx1Z2luLCBwbHVnaW4pKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja01vZGlmeShFT2JqZWN0IGVsZW1lbnQpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChlbGVtZW50LCBudWxsKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQl0aHJvdyBuZXcgTWVzc2FnZUV4Y2VwdGlvbihUbmdVdGlsLmdldE1lc3NhZ2Uoc3RhdHVzKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gcmVtb3ZlSWxsZWdhbFJlZmVyZW5jZXNUbygKLQkJCU1ldGhvZFBsdWdpbiBvd25lclBsdWdpbiwgTWV0aG9kRWxlbWVudCBlLCBDb2xsZWN0aW9uIG1vdmVMaXN0KSB7Ci0JCUFycmF5TGlzdCBhZmZlY3RlZFJlZmVyZW5jZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlDb2xsZWN0aW9uIHJlZmVyZW5jZXMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRSZWZlcmVuY2VzKGUpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKCFtb3ZlTGlzdC5jb250YWlucyhlbGVtZW50KSkgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkJCQlpZiAocGx1Z2luICE9IG51bGwgJiYgcGx1Z2luICE9IG93bmVyUGx1Z2luCi0JCQkJCQkmJiAhTWlzYy5pc0Jhc2VPZihvd25lclBsdWdpbiwgcGx1Z2luKSkgewotCQkJCQljaGVja01vZGlmeShlbGVtZW50KTsKLQkJCQkJcmVtb3ZlUmVmZXJlbmNlcyhlbGVtZW50LCBlKTsKLQkJCQkJYWZmZWN0ZWRSZWZlcmVuY2Vycy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhZmZlY3RlZFJlZmVyZW5jZXJzOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIGNyb3NzIHJlZmVyZW5jZXMgb2YgPGNvZGU+cmVmZXJlbmNlcjwvY29kZT4gdG8KLQkgKiA8Y29kZT5yZWZlcmVuY2VkPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSByZWZlcmVuY2VyCi0JICogQHBhcmFtIHJlZmVyZW5jZWQKLQkgKiBAcGFyYW0geFJlZmVyZW5jZXMKLQkgKiAgICAgICAgICAgIG91dHB1dCBjb2xsZWN0aW9uIG9mIEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3RzCi0JICogQHJldHVybiBjb2xsZWN0aW9uIG9mIEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3RzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBnZXRYUmVmZXJlbmNlcyhFT2JqZWN0IHJlZmVyZW5jZXIsCi0JCQlFT2JqZWN0IHJlZmVyZW5jZWQsIENvbGxlY3Rpb24geFJlZmVyZW5jZXMpIHsKLQkJaWYgKHhSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXhSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWZvciAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yIGZlYXR1cmVJdGVyYXRvciA9IChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IpIHJlZmVyZW5jZXIKLQkJCQkuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGZlYXR1cmVJdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgZmVhdHVyZUl0ZXJhdG9yLm5leHQoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZmVhdHVyZUl0ZXJhdG9yLmZlYXR1cmUoKTsKLQkJCS8vIGlmKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCS8vIGlmKCgoTGlzdClyZWZlcmVuY2VyLmVHZXQoZmVhdHVyZSkpLmNvbnRhaW5zKHJlZmVyZW5jZWQpKSB7Ci0JCQkvLyB4UmVmZXJlbmNlcy5hZGQoZmVhdHVyZSk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyBlbHNlCi0JCQlpZiAoZU9iamVjdCA9PSByZWZlcmVuY2VkKSB7Ci0JCQkJeFJlZmVyZW5jZXMuYWRkKGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB4UmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gPGNvZGU+cmVmZXJlbmNlZDwvY29kZT4gZnJvbQotCSAqIDxjb2RlPnJlZmVyZW5jZXI8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHJlZmVyZW5jZXIKLQkgKiBAcGFyYW0gcmVmZXJlbmNlZAotCSAqIEByZXR1cm4gQ29sbGVjdGlvbiBvZiByZWZlcmVuY2VzIHRvIHRoZSA8Y29kZT5yZWZlcmVuY2VkPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiByZW1vdmVSZWZlcmVuY2VzKEVPYmplY3QgcmVmZXJlbmNlciwKLQkJCUVPYmplY3QgcmVmZXJlbmNlZCkgewotCQlDb2xsZWN0aW9uIHJlbW92ZVJlZnMgPSBnZXRYUmVmZXJlbmNlcyhyZWZlcmVuY2VyLCByZWZlcmVuY2VkLCBudWxsKTsKLQotCQkvLyByZW1vdmUgaWxsZWdhbCByZWZlcmVuY2VzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlbW92ZVJlZnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGYuaXNNYW55KCkpIHsKLQkJCQkoKENvbGxlY3Rpb24pIHJlZmVyZW5jZXIuZUdldChmKSkucmVtb3ZlKHJlZmVyZW5jZWQpOwotCQkJfSBlbHNlIHsKLQkJCQlyZWZlcmVuY2VyLmVTZXQoZiwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVtb3ZlUmVmczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzSWxsZWdhbFJlZmVyZW5jZUluY2x1ZGluZ0FsbENoaWxkcmVuKAotCQkJTWV0aG9kUGx1Z2luIG93bmVyUGx1Z2luLCBNZXRob2RFbGVtZW50IGUsIENvbGxlY3Rpb24gbW92ZUxpc3QpIHsKLQkJaWYgKG93bmVyUGx1Z2luID09IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpKSB7Ci0JCQkvLyBtb3ZlIHdpdGhpbiB0aGUgc2FtZSBwbHVnaW4sIG5vIGZ1cnRoZXIgY2hlY2sKLQkJCS8vCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGhhc0lsbGVnYWxSZWZlcmVuY2Uob3duZXJQbHVnaW4sIGUsIG1vdmVMaXN0KSkKLQkJCXJldHVybiB0cnVlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZS5lQWxsQ29udGVudHMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJaWYgKGhhc0lsbGVnYWxSZWZlcmVuY2Uob3duZXJQbHVnaW4sIChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCksCi0JCQkJCW1vdmVMaXN0KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3VwZXJFeGVjdXRlKCkgewotCQlzdXBlci5leGVjdXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0RmVhdHVyZXNUb0NoZWNrKCkgewotCQlpZiAoZmVhdHVyZXNUb0NoZWNrID09IG51bGwpIHsKLQkJCWZlYXR1cmVzVG9DaGVjayA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZlYXR1cmVzVG9DaGVjay5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIGZlYXR1cmVzVG9DaGVjazsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoRU9iamVjdCBlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IG51bGw7Ci0KLQkJaWYoYWRkQ29tbWFuZC5nZXRGZWF0dXJlKCkgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKXsKLQkJCXZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVZhbGlkYXRvcihhZGRDb21tYW5kLmdldE93bmVyKCksIChFUmVmZXJlbmNlKSBhZGRDb21tYW5kLmdldEZlYXR1cmUoKSwgKEVDbGFzcyludWxsLCBlLCBmZWF0dXJlKTsKLQkJfQotCi0JCXJldHVybiB2YWxpZGF0b3I7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gb2JqZWN0c1RvQ2hlY2tOYW1lCi0JICovCi0JcHJpdmF0ZSB2b2lkIGdldE9mZlN0cmluZ1RvQ2hlY2tOYW1lKE9iamVjdCBlLCBDb2xsZWN0aW9uIG9iamVjdHNUb0NoZWNrTmFtZSkgewotCQkvLyBpZihhZGRDb21tYW5kLmdldE93bmVyKCkgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSAmJgotCQkvLyBhZGRDb21tYW5kLmdldEZlYXR1cmUoKSA9PQotCQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKQotCQkvLyAmJiBlIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gKChDb250ZW50UGFja2FnZSllKS5lQWxsQ29udGVudHMoKTsKLQkJLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIE9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkvLyBvYmplY3RzVG9DaGVja05hbWUuYWRkKGVsZW1lbnQpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBlbHNlCi0JCWlmIChhZGRDb21tYW5kLmdldE93bmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZQotCQkJCSYmIGFkZENvbW1hbmQuZ2V0RmVhdHVyZSgpID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkKLQkJCQkmJiBlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UKLQkJCQkmJiAhKGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSkgewotCQkJZ2V0UHJvY2Vzc0NvbXBvbmVudHMoKFByb2Nlc3NQYWNrYWdlKSBlLCBvYmplY3RzVG9DaGVja05hbWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gb2JqZWN0c1RvQ2hlY2tOYW1lCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRQcm9jZXNzQ29tcG9uZW50cyhQcm9jZXNzUGFja2FnZSBwa2csCi0JCQlDb2xsZWN0aW9uIG9iamVjdHNUb0NoZWNrTmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkUGtnID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGRQa2cgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJb2JqZWN0c1RvQ2hlY2tOYW1lLmFkZChjaGlsZFBrZyk7Ci0JCQl9IGVsc2UgaWYgKGNoaWxkUGtnIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXRQcm9jZXNzQ29tcG9uZW50cygoUHJvY2Vzc1BhY2thZ2UpIGNoaWxkUGtnLAotCQkJCQkJb2JqZWN0c1RvQ2hlY2tOYW1lKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja1N0cmluZ1ZhbHVlKE5hbWVkRWxlbWVudCBlLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gb2JqZWN0c1RvQWRkKSB7Ci0JCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gY3JlYXRlVmFsaWRhdG9yKGUsIGZlYXR1cmUpOwotCQlpZiAodmFsaWRhdG9yICE9IG51bGwpIHsKLQkJCVN0cmluZyBuZXdOYW1lID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJbmV3TmFtZSA9IGNoZWNrU3RyaW5nVmFsdWUoZSwgZmVhdHVyZSwgdmFsaWRhdG9yLCBvYmplY3RzVG9BZGQpOwotCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZXgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAobmV3TmFtZSAhPSBudWxsKSB7Ci0JCQkJbmV3TmFtZSA9IG5ld05hbWUudHJpbSgpOwotCQkJCWUuZVNldChmZWF0dXJlLCBuZXdOYW1lKTsKLQkJCQlmZWF0dXJlQ2hhbmdlZChlLCBmZWF0dXJlLCBuZXdOYW1lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja1N0cmluZ1ZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUFycmF5TGlzdCBvYmplY3RzVG9DaGVja05hbWUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNvbGxlY3Rpb24gb2JqZWN0c1RvQWRkID0gYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCk7Ci0KLQkJLy8gZmVhdHVyZSB2YWx1ZSBjaGVjawotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RzVG9BZGQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOYW1lZEVsZW1lbnQgZSA9IChOYW1lZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKCFjaGVja1N0cmluZ1ZhbHVlKGUsIGZlYXR1cmUsIG9iamVjdHNUb0FkZCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCWdldE9mZlN0cmluZ1RvQ2hlY2tOYW1lKGUsIG9iamVjdHNUb0NoZWNrTmFtZSk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RzVG9DaGVja05hbWUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOYW1lZEVsZW1lbnQgZSA9IChOYW1lZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKCFjaGVja1N0cmluZ1ZhbHVlKGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCBvYmplY3RzVG9DaGVja05hbWUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGRlYWwgd2l0aCBlbGVtZW50IGNoYW5nZSBkdXJpbmcgYWRkCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmZWF0dXJlQ2hhbmdlZChFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgbmV3VmFsdWUpIHsKLQotCX0KLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb24gZ2V0RWxlbWVudHNUb0NoZWNrTmFtZShBZGRDb21tYW5kIGFkZENvbW1hbmQpIHsKLQkJQXJyYXlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkvLyBuZWVkIHRvIGdldCBhbGwgcHJvY2VzcyBjb21wb25lbnRzIGluIHRoaXMgcGFja2FnZSB0byBjaGVjawotCQkJCS8vIG5hbWUKLQkJCQkvLwotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGVsZW1lbnQsIGZhbHNlKSB7Ci0KLQkJCQkJLyoqCi0JCQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkJCSAqLwotCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQkJCXJldHVybiAoKFByb2Nlc3NQYWNrYWdlKSBvYmplY3QpLmdldENoaWxkUGFja2FnZXMoKQotCQkJCQkJCQkJLml0ZXJhdG9yKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX07Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlPYmplY3QgcGtnID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAocGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJZWxlbWVudHMuYWRkKHBrZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB0aGUgbmFtZSBvZiBhbGwgZWxlbWVudHMgdG8gYmUgYWRkZWQuCi0JICogCi0JICogQHBhcmFtIGFkZENvbW1hbmQKLQkgKiBAcmV0dXJuIGEgZWxlbWVudCB0byBuZXcgZmVhdHVyZSBuYW1lIG1hcCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB1c2VyCi0JICogICAgICAgICBjYW5jZWxlZCB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTWFwIGNoZWNrTmFtZShBZGRDb21tYW5kIGFkZENvbW1hbmQpIHsKLQkJQ29sbGVjdGlvbiBlbGVtZW50c1RvQ2hlY2sgPSBnZXRFbGVtZW50c1RvQ2hlY2tOYW1lKGFkZENvbW1hbmQpOwotCQlIYXNoTWFwIGVsZW1lbnRUb05ld05hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCS8vIGZlYXR1cmUgdmFsdWUgY2hlY2sKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb0NoZWNrLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTmFtZWRFbGVtZW50IGUgPSAoTmFtZWRFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCUlWYWxpZGF0b3IgdmFsaWRhdG9yOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCXZhbGlkYXRvciA9IG5ldyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IoYWRkQ29tbWFuZAotCQkJCQkJLmdldE93bmVyKCksIGFkZENvbW1hbmQuZ2V0RmVhdHVyZSgpLAotCQkJCQkJKENvbnRlbnRFbGVtZW50KSBlLCBuZXcgVmFsaWRhdG9yRmFjdG9yeS5UeXBlRmlsdGVyKGUpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlTmFtZVZhbGlkYXRvcigKLQkJCQkJCWFkZENvbW1hbmQuZ2V0T3duZXIoKSwgZSk7Ci0JCQl9Ci0KLQkJCVN0cmluZyBuZXdOYW1lID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJbmV3TmFtZSA9IGNoZWNrU3RyaW5nVmFsdWUoZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCB2YWxpZGF0b3IsIGVsZW1lbnRzVG9DaGVjayk7Ci0JCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJaWYgKG5ld05hbWUgIT0gbnVsbCkgewotCQkJCS8vIG5ldyBuYW1lIHJlcXVpcmVkLCBjaGVjayBpZiB0aGUgZWxlbWVudCBjYW4gYmUgbW9kaWZpZWQKLQkJCQkvLwotCQkJCUlTdGF0dXMgc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KGUsIE1zZ0JveAotCQkJCQkJLmdldERlZmF1bHRTaGVsbCgpKTsKLQkJCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yRGlhbG9nX2Nhbm5vdFJlbmFtZSwKLQkJCQkJCW5ldyBPYmplY3RbXSB7IFRuZ1V0aWwuZ2V0VHlwZVRleHQoZSksIGUuZ2V0TmFtZSgpLAotCQkJCQkJCQluZXdOYW1lIH0pOwotCQkJCXdoaWxlICghc3RhdHVzLmlzT0soKSkgewotCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCQkJCWlmICh1aUhhbmRsZXIgIT0gbnVsbCkgewotCQkJCQkJaWYgKHVpSGFuZGxlci5zZWxlY3RPbmUobmV3IGludFtdIHsKLQkJCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX09LLAotCQkJCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMIH0sIHRpdGxlLAotCQkJCQkJCQltc2csIG51bGwpID09IElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUwpIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGNhbmNlbCB0aGUgb3BlcmF0aW9uIGlmIHRoZXJlIGlzIG5vIHVzZXIgaW50ZXJhY3Rpb24gaGFuZGxlcgotCQkJCQkJLy8KLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsZW1lbnRUb05ld05hbWVNYXAucHV0KGUsIG5ld05hbWUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRUb05ld05hbWVNYXA7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGZlYXR1cmUgdmFsdWUKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqIEBwYXJhbSBvYmplY3RzVG9BZGQKLQkgKiBAcmV0dXJuIG5ldyBmZWF0dXJlIHZhbHVlIHRoYXQgdXNlciBoYXMgY2hvb3NlbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICAgICAgICAgdGhlIGZlYXR1cmUgdmFsdWUgaXMgdmFsaWQKLQkgKiBAdGhyb3dzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tTdHJpbmdWYWx1ZShOYW1lZEVsZW1lbnQgZSwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBJVmFsaWRhdG9yIHZhbGlkYXRvciwKLQkJCUNvbGxlY3Rpb24gb2JqZWN0c1RvQWRkKSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQkvLyBUT0RPOiBUaGUgdmFsaWRhdG9yIGlzIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSB0aGF0IGlzIHRvbyBsb25nIGZvcgotCQkvLyB0aGUgZGlhbG9nLgotCQkvLyBmZWF0dXJlIHZhbHVlIGNoZWNrCi0JCWZpbmFsIFN0cmluZ1ZhbGlkYXRvciBzdHJWYWxpZGF0b3IgPSBnZXRTdHJpbmdWYWxpZGF0b3IoKTsKLQkJc3RyVmFsaWRhdG9yLnNldEVsZW1lbnRzKG9iamVjdHNUb0FkZCk7Ci0JCXN0clZhbGlkYXRvci5zZXRGZWF0dXJlKGZlYXR1cmUpOwotCQlzdHJWYWxpZGF0b3Iuc2V0VmFsaWRhdG9yKHZhbGlkYXRvcik7Ci0KLQkJU3RyaW5nIHN0ciA9IChTdHJpbmcpIGUuZUdldChmZWF0dXJlKTsKLQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5sZW5ndGgoKSA+IDApIHsKLQkJCVN0cmluZyBtc2cgPSBzdHJWYWxpZGF0b3IuaXNWYWxpZChzdHIpOwotCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGZlYXR1cmVUeHQgPSBUbmdVdGlsLmdldEZlYXR1cmVUZXh0KGZlYXR1cmUpOwotCQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGl0bGU7IC8vJE5PTi1OTFMtMSQJCQkKLQkJCQlTdHJpbmcgZGxnTXNnID0gTkxTLmJpbmQoCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RleHQsCi0JCQkJCQlTdHJVdGlsLnRvTG93ZXIoZmVhdHVyZVR4dCksIGUuZ2V0TmFtZSgpKTsKLQkJCQlTdHJpbmcgY3VycmVudFZhbHVlID0gKFN0cmluZykgZS5lR2V0KGZlYXR1cmUpOwotCi0JCQkJSUlucHV0VmFsaWRhdG9yIGlucHV0VmFsaWRhdG9yID0gbmV3IElJbnB1dFZhbGlkYXRvcigpIHsKLQkJCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJCQlpZiAoc3RyVmFsaWRhdG9yICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCQkJCQkuZ2V0U2ltcGxlRXJyb3JNZXNzYWdlKHN0clZhbGlkYXRvcgotCQkJCQkJCQkJCQkuaXNWYWxpZChuZXdUZXh0KSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCX07Ci0JCQkJLy8gVE9ETzogcmVwbGFjZSB3aXRoIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5yZXF1ZXN0SW5wdXQoU3RyaW5nLCBTdHJpbmcsIExpc3QpCi0JCQkJSW5wdXREaWFsb2cgaW5wdXREbGcgPSBuZXcgSW5wdXREaWFsb2coCi0JCQkJCQlNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCksIHRpdGxlLCBkbGdNc2csIGN1cnJlbnRWYWx1ZSwKLQkJCQkJCWlucHV0VmFsaWRhdG9yKTsKLQkJCQlpZiAoaW5wdXREbGcub3BlbigpID09IFdpbmRvdy5DQU5DRUwpIHsKLQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCXJldHVybiBpbnB1dERsZy5nZXRWYWx1ZSgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXIjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCUNvbGxlY3Rpb24gYWZmZWN0ZWRPYmplY3RzID0gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JCWlmIChhZmZlY3RlZE9iamVjdHMgPT0gbnVsbCkgewotCQkJRU9iamVjdCBvd25lciA9IGFkZENvbW1hbmQuZ2V0T3duZXIoKTsKLQkJCWFmZmVjdGVkT2JqZWN0cyA9IG93bmVyID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQKLQkJCQkJOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ob3duZXIpOwotCQl9Ci0JCXJldHVybiBhZmZlY3RlZE9iamVjdHM7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0RWxlbWVudHNUb0NoZWNrRm9ySWxsZWdhbFJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRXhjbHVkZWRGcm9tT3V0Z29pbmdSZWZlcmVuY2VDaGVjayhPYmplY3QgZSkgewotCQkvLyBkb24ndCBjaGVjayBvbiBQcm9jZXNzUGFja2FnZSwgUHJvY2Vzc0VsZW1lbnQgZm9yIGlsbGVnYWwgcmVmZXJlbmNlcwotCQkvLyBiL2MgcHJvY2VzcyB2YWxpZGF0aW9uIGlzIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb24sIG5vdCBwbHVnaW4KLQkJLy8gdmlzaWJpbGl0eQotCQkvLwotCQlyZXR1cm4gZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlIHx8IGUgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNoZWNrRm9ySWxsZWdhbFJlZmVyZW5jZXMoKSB7Ci0JCUNvbGxlY3Rpb24gZWxlbWVudHMgPSBnZXRFbGVtZW50c1RvQ2hlY2tGb3JJbGxlZ2FsUmVmZXJlbmNlcygpOwotCQlhZGRMaXN0ID0gbmV3IEFycmF5TGlzdChlbGVtZW50cyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJLy8gU3RyaW5nIG5ld05hbWUgPSAoU3RyaW5nKSBlbGVtZW50VG9OZXdOYW1lTWFwLmdldChlbGVtZW50KTsKLQkJCS8vIGlmKG5ld05hbWUgIT0gbnVsbCkgewotCQkJLy8gZWxlbWVudC5zZXROYW1lKG5ld05hbWUpOwotCQkJLy8gfQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUFsbENvbnRlbnRzKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlhZGRMaXN0LmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgdGhlcmUgaXMgYW55IGlsbGVnYWwgcmVmZXJlbmNlIGluIHRoZSBtb3ZlZCBvYmplY3RzCi0JCS8vCQkKLQkJb3duZXJQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihhZGRDb21tYW5kLmdldE93bmVyKCkpOwotCQlyZW1vdmVYUmVmUmVxdWlyZWQgPSBmYWxzZTsKLQkJZmluZF94UGx1Z2luUmVmOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKQotCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0KLQkJCWlmIChpc0V4Y2x1ZGVkRnJvbU91dGdvaW5nUmVmZXJlbmNlQ2hlY2soZWxlbWVudCkpIHsKLQkJCQljb250aW51ZSBmaW5kX3hQbHVnaW5SZWY7Ci0JCQl9Ci0KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCWlmIChoYXNJbGxlZ2FsUmVmZXJlbmNlSW5jbHVkaW5nQWxsQ2hpbGRyZW4ob3duZXJQbHVnaW4sCi0JCQkJCQkoTWV0aG9kRWxlbWVudCkgZWxlbWVudCwgYWRkTGlzdCkpIHsKLQkJCQkJcmVtb3ZlWFJlZlJlcXVpcmVkID0gdHJ1ZTsKLQkJCQkJYnJlYWsgZmluZF94UGx1Z2luUmVmOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChyZW1vdmVYUmVmUmVxdWlyZWQpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkUmVmZXJlbmNlc0Vycm9yX3JlYXNvbjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQl9Ci0JCWlmIChhZGRGZWF0dXJlSXNDb250YWlubWVudCgpKSB7Ci0JCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBTZXJ2aWNlcy5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlcigpOwotCQkJYm9vbGVhbiBzYXZlT3duZXJSZXNvdXJjZSA9IGZhbHNlOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKCFwZXJzaXN0ZXIuaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoZSkpIHsKLQkJCQkJc2F2ZU93bmVyUmVzb3VyY2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChzYXZlT3duZXJSZXNvdXJjZSkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhZGRDb21tYW5kLmdldE93bmVyKCkuZVJlc291cmNlKCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFkZENvbW1hbmQuZ2V0T3duZXIoKS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQotCQlpZiAobmVzdGVkQ29tbWFuZHMgIT0gbnVsbCAmJiAhbmVzdGVkQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gbmVzdGVkQ29tbWFuZHMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlDb21tYW5kIGNtZCA9IChDb21tYW5kKSBuZXN0ZWRDb21tYW5kcy5nZXQoaSk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGNtZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCQkJQ29sbGVjdGlvbiByZXNvdXJjZXMgPSAoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgY21kKQotCQkJCQkJCQkuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQkJCQkJCWlmIChyZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbChyZXNvdXJjZXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB3aWxsU2F2ZU1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlTW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBTZXJ2aWNlcwotCQkJCS5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCXRyeSB7Ci0KLQkJCS8vIHNhdmUgdGhlIG1vZGlmaWVkIHJlc291cmNlcwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE1vZGlmaWVkUmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJCWNhblVuZG8gPSBmYWxzZTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZCgKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5zYXZlRmlsZUVycm9yX3JlYXNvbiwgCi0JCQkJCQkJcmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkgPyByZXNvdXJjZQotCQkJCQkJCQkJLmdldFVSSSgpLnRvRmlsZVN0cmluZygpIDogcmVzb3VyY2UudG9TdHJpbmcoKSk7Ci0JCQkJCXN0YXR1cy5hZGQobmV3IFNhdmVTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQlTYXZlU3RhdHVzLlNBVkVfRVJST1IsIG1zZywgZSkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCQlDb2xsZWN0aW9uIGVsZW1lbnRzVG9Db3B5UmVmQ29udGVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0QWZmZWN0ZWRPYmplY3RzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cy5hZGQoVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpKTsKLQkJCQl9Ci0KLQkJCQlDb2xsZWN0aW9uIG1vZGlmaWVkID0gcmVzTWdyLmNvcHlSZWZlcmVuY2VkQ29udGVudHMoCi0JCQkJCQllbGVtZW50c1RvQ29weVJlZkNvbnRlbnRzLCBlbGVtZW50VG9PbGRQbHVnaW5NYXApOwotCQkJCW1vZGlmaWVkCi0JCQkJCQkuYWRkQWxsKHJlcGxhY2VUZXh0UmVmZXJlbmNlcyhlbGVtZW50c1RvQ29weVJlZkNvbnRlbnRzKSk7Ci0JCQkJaWYgKG1vZGlmaWVkICE9IG51bGwgJiYgIW1vZGlmaWVkLmlzRW1wdHkoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2RpZmllZC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5zYXZlRmlsZUVycm9yX3JlYXNvbiwKLQkJCQkJCQkJCXJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQkJCQlzdGF0dXMuYWRkKG5ldyBTYXZlU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJCQlTYXZlU3RhdHVzLlNBVkVfRVJST1IsIG1zZywgZSkpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZ1dyaXRlciBtc2cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQllLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIobXNnKSk7Ci0JCQlJU3RhdHVzIG5ld1N0YXR1cyA9IG5ldyBTYXZlU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQlTYXZlU3RhdHVzLlNBVkVfRVJST1IsIG1zZy50b1N0cmluZygpLCBlKTsKLQkJCXN0YXR1cy5hZGQobmV3U3RhdHVzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQlTdHJpbmdXcml0ZXIgbXNnID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJCQllLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIobXNnKSk7Ci0JCQkJCUlTdGF0dXMgbmV3U3RhdHVzID0gbmV3IFNhdmVTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQlTYXZlU3RhdHVzLlJPTExCQUNLX0VSUk9SLCBtc2cudG9TdHJpbmcoKSwgZSk7Ci0JCQkJCXN0YXR1cy5hZGQobmV3U3RhdHVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBpbiB0aGUgY29waWVkIGVsZW1lbnRzIGNvbnRhaW4gcmVmZXJlbmNlcyAoVVJMcykKLQkgKiB0byBvdGhlciBlbGVtZW50cyB3aXRoaW4gdGhlIHNhbWUgY29waWVkIHByb2Nlc3MgdGhlbiByZXBsYWNlIHRoZXNlCi0JICogcmVmZXJlbmNlcyB3aXRoIHJlZmVyZW5jZXMgdGhhdCBwb2ludCB0byB0aGUgbmV3IGVsZW1lbnRzIGluIHRoZSBjb3BpZWQKLQkgKiBzdHJ1Y3R1cmVzLgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiByZXBsYWNlVGV4dFJlZmVyZW5jZXMoCi0JCQlDb2xsZWN0aW9uIGVsZW1lbnRzVG9Db3B5UmVmQ29udGVudHMpIHsKLQkJQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUlUZXh0UmVmZXJlbmNlUmVwbGFjZXIgdHh0UmVmUmVwbGFjZXIgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCQkJLmdldFRleHRSZWZlcmVuY2VSZXBsYWNlcigpOwotCQlpZiAodHh0UmVmUmVwbGFjZXIgPT0gbnVsbCkKLQkJCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQotCQkvLyBnZXQgbWFwCi0JCUVkaXRpbmdEb21haW4gZWQgPSBhZGRDb21tYW5kLmdldERvbWFpbigpOwotCQlpZiAoZWQgaW5zdGFuY2VvZiBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCU1hcCBjb3B5VG9PcmlnaW5hbE1hcCA9ICgoVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBlZCkKLQkJCQkJLmdldENvcHlUb09yaWdpbmFsTWFwKCk7Ci0JCQkvLyB0aGUgVGV4dFJlZmVyZW5jZVJlcGxhY2VyIGV4cGVjdHMgYSBtYXAgb2Ygb2xkLXRvLW5ldy4gd2UKLQkJCS8vIGhhdmUgYSBtYXAgb2YgbmV3LXRvLW9sZCwgc28gY29udmVydCBpdAotCQkJTWFwIG9sZFRvTmV3T2JqZWN0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvcHlUb09yaWdpbmFsTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlPYmplY3QgdmFsID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoa2V5ICE9IG51bGwgJiYgdmFsICE9IG51bGwpCi0JCQkJCW9sZFRvTmV3T2JqZWN0TWFwLnB1dCh2YWwsIGtleSk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvQ29weVJlZkNvbnRlbnRzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBjaGlsZEl0ZXIgPSBlbGVtZW50LmVBbGxDb250ZW50cygpOyBjaGlsZEl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgY2hpbGQgPSAoRU9iamVjdCkgY2hpbGRJdGVyLm5leHQoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBhdHRyaWJ1dGVzID0gY2hpbGQuZUNsYXNzKCkKLQkJCQkJCQkuZ2V0RUFsbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOyBhdHRyaWJ1dGVzCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCUVBdHRyaWJ1dGUgYXR0cmlidXRlID0gKEVBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMubmV4dCgpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZS5pc0NoYW5nZWFibGUoKQotCQkJCQkJCQkmJiAhYXR0cmlidXRlLmlzRGVyaXZlZCgpCi0JCQkJCQkJCSYmIChhdHRyaWJ1dGUuaXNNYW55KCkgfHwgY2hpbGQKLQkJCQkJCQkJCQkuZUlzU2V0KGF0dHJpYnV0ZSkpCi0JCQkJCQkJCSYmIGF0dHJpYnV0ZS5nZXRFQXR0cmlidXRlVHlwZSgpCi0JCQkJCQkJCQkJLmdldEluc3RhbmNlQ2xhc3MoKSA9PSBMaXRlcmFscy5TVFJJTkcKLQkJCQkJCQkJCQkuZ2V0SW5zdGFuY2VDbGFzcygpKSB7Ci0JCQkJCQkJU3RyaW5nIHRleHQgPSAoU3RyaW5nKSBjaGlsZC5lR2V0KGF0dHJpYnV0ZSk7Ci0JCQkJCQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJCQkJCQlTdHJpbmcgbmV3dGV4dCA9IHR4dFJlZlJlcGxhY2VyLnJlcGxhY2UodGV4dCwKLQkJCQkJCQkJCQljaGlsZCwgb2xkVG9OZXdPYmplY3RNYXApOwotCQkJCQkJCQlpZiAoIW5ld3RleHQuZXF1YWxzKHRleHQpKSB7Ci0JCQkJCQkJCQljaGlsZC5lU2V0KGF0dHJpYnV0ZSwgbmV3dGV4dCk7Ci0JCQkJCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoY2hpbGQuZVJlc291cmNlKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb0FkZCgpIHsKLQkJdHJ5IHsKLQkJCS8vIGVsZW1lbnRUb05ld05hbWVNYXAgPSBjaGVja05hbWUoYWRkQ29tbWFuZCk7Ci0JCQkvLyBpZihlbGVtZW50VG9OZXdOYW1lTWFwID09IG51bGwpIHsKLQkJCS8vIC8vIHVzZXIgY2FuY2VsZWQgdGhlIG9wZXJhaW9uCi0JCQkvLyAvLwotCQkJLy8gcmV0dXJuOwotCQkJLy8gfQotCi0JCQkvLyBjaGVjayBmZWF0dXJlIHZhbHVlcwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldEZlYXR1cmVzVG9DaGVjaygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJCWlmICghY2hlY2tTdHJpbmdWYWx1ZShmZWF0dXJlKSkgewotCQkJCQkvLyB1c2VyIGNhbmNlbGVkIHRoZSBvcGVyYWlvbgotCQkJCQkvLwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQlib29sZWFuIHNob3dXYXJuaW5nID0gZmFsc2U7Ci0JCQlFZGl0aW5nRG9tYWluIGVkID0gYWRkQ29tbWFuZC5nZXREb21haW4oKTsKLQkJCWlmIChlZCBpbnN0YW5jZW9mIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJCU1hcCBjb3B5VG9PcmlnaW5hbE1hcCA9ICgoVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBlZCkKLQkJCQkJCS5nZXRDb3B5VG9PcmlnaW5hbE1hcCgpOwotCi0JCQkJLy8gY2hlY2sgZmlyc3QgZWxlbWVudCBvZiBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKQotCQkJCS8vIGlmIGl0J3MgYSBrZXkgaW4gdGhlIENvcHlUb09yaWdpbmFsTWFwLCB3ZSBhcmUgcGFzdGluZyBhbmQKLQkJCQkvLyBtYXkgbmVlZCB0byB3YXJuIHRoZSB1c2VyCi0JCQkJLy8gaWYgaXQncyBub3QgYSBrZXkgaW4gdGhlIENvcHlUb09yaWdpbmFsTWFwLCB0aGVuIHdlIGFyZQotCQkJCS8vIHByb2JhYmx5IGFkZGluZyBhIG5ldyBlbGVtZW50Ci0JCQkJaWYgKGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpICE9IG51bGwKLQkJCQkJCSYmIGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLnNpemUoKSA+IDAKLQkJCQkJCSYmIGNvcHlUb09yaWdpbmFsTWFwLmNvbnRhaW5zS2V5KGFkZENvbW1hbmQKLQkJCQkJCQkJLmdldENvbGxlY3Rpb24oKS50b0FycmF5KClbMF0pKSB7Ci0JCQkJCWVsZW1lbnRUb09sZFBsdWdpbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXIgPSBjb3B5VG9PcmlnaW5hbE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJCQkmJiAhKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSkgewotCQkJCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsCi0JCQkJCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChNZXRob2RFbGVtZW50KSBlbnRyeQotCQkJCQkJCQkJCQkuZ2V0VmFsdWUoKSk7Ci0JCQkJCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJCQkJCWVsZW1lbnRUb09sZFBsdWdpbk1hcC5wdXQoZW50cnkuZ2V0S2V5KCksCi0JCQkJCQkJCQkJcGx1Z2luKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBwbHVnaW4gPT0gbnVsbCwgb3JpZ2luYWwgZWxlbWVudCB3YXMgcHJvYmFibHkKLQkJCQkJCQkJLy8gZGVsZXRlZAotCQkJCQkJCQlzaG93V2FybmluZyA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoc2hvd1dhcm5pbmcpIHsKLQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFCi0JCQkJCQkuc2hvd1dhcm5pbmcoCi0JCQkJCQkJCWdldExhYmVsKCksCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZyk7Ci0JCQl9Ci0KLQkJCWZpbmFsIFN0cmluZ0J1ZmZlciBtc2dCdWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCVN0cmluZyBtc2cgPSBjaGVja0ZvcklsbGVnYWxSZWZlcmVuY2VzKCk7Ci0JCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQkJbXNnQnVmZi5hcHBlbmQobXNnKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfTsKLQotCQkJSVByb2dyZXNzTW9uaXRvciBkZWZhdWx0TW9uaXRvciA9IG51bGw7Ci0JCQlpZiAoIXJ1bldpdGhQcm9ncmVzcykgewotCQkJCWRlZmF1bHRNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCX0KLQotCQkJaWYgKHJ1bldpdGhQcm9ncmVzcykgewotCQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3Mob3BlcmF0aW9uLAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuY2hlY2tpbmdSZWZlcmVuY2VzVGFza19uYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQl0cnkgewotCQkJCQlvcGVyYXRpb24ucnVuKGRlZmF1bHRNb25pdG9yKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl0aHJvdyBlOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobXNnQnVmZi5sZW5ndGgoKSA+IDAKLQkJCQkJJiYgTXNnQm94LnByb21wdChEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJCW1zZ0J1ZmYudG9TdHJpbmcoKSwgU1dULllFUyB8IFNXVC5OTykgPT0gU1dULk5PKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQlJU3RhdHVzLk9LLAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9lcnJvclNhdmluZ0ZpbGVzLAotCQkJCQludWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJb3BlcmF0aW9uID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJaWYgKHJlbW92ZVhSZWZSZXF1aXJlZCkgewotCQkJCQkJbW9uaXRvci5zdWJUYXNrKCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCQkJcmVtb3ZlSWxsZWdhbFJlZmVyZW5jZXMob3duZXJQbHVnaW4sIGVsZW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIGFkZCB0aGUgZWxlbWVudHMKLQkJCQkJLy8KLQkJCQkJc3VwZXJFeGVjdXRlKCk7Ci0KLQkJCQkJZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCk7Ci0KLQkJCQkJaWYgKHdpbGxTYXZlTW9kaWZpZWRSZXNvdXJjZXMoKSkgewotCQkJCQkJSVN0YXR1cyByZXN1bHQgPSBzYXZlTmV3RWxlbWVudHNXaXRoT3duUmVzb3VyY2UoKTsKLQkJCQkJCWlmIChyZXN1bHQuaXNPSygpKSB7Ci0JCQkJCQkJbW9uaXRvcgotCQkJCQkJCQkJLnN1YlRhc2soTGlicmFyeUVkaXRSZXNvdXJjZXMuc2F2aW5nTW9kaWZpZWRGaWxlc1Rhc2tfbmFtZSk7IC8vJE5PTi1OTFMtMSQJCQkJCQotCQkJCQkJCXNhdmVNb2RpZmllZFJlc291cmNlcygpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlzdGF0dXMuYWRkKHJlc3VsdCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCS8vIEZJWE1FOiB0aGlzIGNhdXNlcyBkZWFkLWxvY2sgYXQKLQkJCQkJCS8vIExpYnJhcnlQcm9jZXNzb3Iubm90aWZ5TGlzdGVuZXJzKCkuIFRoZSBtZXRob2QKLQkJCQkJCS8vIGlzIHN5bmNocm9uaXplZCwgdGhpcyBtaWdodCBiZSB0aGUgY2F1c2Ugb2YgdGhlCi0JCQkJCQkvLyBkZWFkLWxvY2sKLQkJCQkJCS8vCi0JCQkJCQl1bmRvKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX07Ci0JCQlpZiAocnVuV2l0aFByb2dyZXNzKSB7Ci0JCQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhvcGVyYXRpb24sICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQl0cnkgewotCQkJCQlvcGVyYXRpb24ucnVuKGRlZmF1bHRNb25pdG9yKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl0aHJvdyBlOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoZ2V0TGFiZWwoKSwgTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JfbXNnV2l0aERldGFpbHMsIHN0YXR1cyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoZ2V0TGFiZWwoKSwgTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JfbXNnLCBudWxsLCBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhZGRGZWF0dXJlSXNDb250YWlubWVudCgpIHsKLQkJcmV0dXJuIGFkZENvbW1hbmQuZ2V0RmVhdHVyZSgpIGluc3RhbmNlb2YgRVJlZmVyZW5jZQotCQkJCSYmICgoRVJlZmVyZW5jZSkgYWRkQ29tbWFuZC5nZXRGZWF0dXJlKCkpLmlzQ29udGFpbm1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyBhZGRlZCBlbGVtZW50cyB0aGF0IGFyZSBuZXcgdG8gdGhlIGxpYnJhcnkgYW5kIGNhbiBoYXZlIG93bgotCSAqIHJlc291cmNlIHRoYXQgbm8gb3RoZXIgcmVzb3VyY2UgcmVmZXJzIHRvIChsaWtlIE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICogCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBzYXZlTmV3RWxlbWVudHNXaXRoT3duUmVzb3VyY2UoKSB7Ci0JCWlmIChhZGRGZWF0dXJlSXNDb250YWlubWVudCgpKSB7Ci0JCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBTZXJ2aWNlcy5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlcigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IG1lID0gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQkJCWlmIChwZXJzaXN0ZXIuaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIobWUpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXBlcnNpc3Rlci5zYXZlKG1lKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCQkJCWlmIChTdHJVdGlsLmlzQmxhbmsobXNnKSkgewotCQkJCQkJCQltc2cgPSBlLnRvU3RyaW5nKCk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBuZXcgU2F2ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQkJCQkJU2F2ZVN0YXR1cy5TQVZFX0VSUk9SLCBtc2csIGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCkgewotCQlMaXN0IG5lc3RlZENvbW1hbmRQcm92aWRlcnMgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCQkJLmdldE5lc3RlZENvbW1hbmRQcm92aWRlcnMoKTsKLQkJaWYgKCFuZXN0ZWRDb21tYW5kUHJvdmlkZXJzLmlzRW1wdHkoKSkgewotCQkJaWYgKCFhZGRMaXN0LmlzRW1wdHkoKSkgewotCQkJCW5lc3RlZENvbW1hbmRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5lc3RlZENvbW1hbmRQcm92aWRlcnMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJSU5lc3RlZENvbW1hbmRQcm92aWRlciBjbWRQcm92aWRlciA9IChJTmVzdGVkQ29tbWFuZFByb3ZpZGVyKSBpdGVyCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUNvbW1hbmQgY21kID0gY21kUHJvdmlkZXIuY3JlYXRlUmVsYXRlZE9iamVjdHMoYWRkTGlzdCwKLQkJCQkJCQkJdGhpcyk7Ci0JCQkJCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgewotCQkJCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQkJCQkJbmVzdGVkQ29tbWFuZHMuYWRkKGNtZCk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbnRhaW5tZW50SW5mbyB7Ci0JCUVPYmplY3QgY29udGFpbmVyOwotCi0JCWludCBpbmRleDsKLQotCQlDb250YWlubWVudEluZm8oRU9iamVjdCBjb250YWluZXIsIGludCBpbmRleCkgewotCQkJdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJbGxlZ2FsUmVmZXJlbmNlUmVtb3ZlciB7Ci0JCXByaXZhdGUgTWV0aG9kUGx1Z2luIHRhcmdldFBsdWdpbjsKLQotCQlwcml2YXRlIENvbGxlY3Rpb24gZWxlbWVudHNUb01vdmU7Ci0KLQkJLyoqCi0JCSAqIGxpc3Qgb2YgUmVmZXJlbmNlIG9iamVjdHMKLQkJICogCi0JCSAqIEBzZWUgUmVmZXJlbmNlCi0JCSAqLwotCQlwcml2YXRlIExpc3QgaWxsZWdhbFJlZmVyZW5jZXM7Ci0KLQkJcHJpdmF0ZSBTZXQgYWZmZWN0ZWRSZXNvdXJjZXM7Ci0KLQkJcHJpdmF0ZSBBcnJheUxpc3QgcmVtb3ZlZFJlZmVyZW5jZXM7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHNlYXJjaE91dGdvaW5nUmVmczsKLQotCQlwcml2YXRlIGJvb2xlYW4gc2VhcmNoSW5jb21pbmdSZWZzOwotCi0JCXB1YmxpYyBJbGxlZ2FsUmVmZXJlbmNlUmVtb3ZlcihNZXRob2RQbHVnaW4gdGFyZ2V0UGx1Z2luLAotCQkJCUNvbGxlY3Rpb24gZWxlbWVudHNUb01vdmUsIGJvb2xlYW4gc2VhcmNoT3V0Z29pbmdSZWZzLAotCQkJCWJvb2xlYW4gc2VhcmNoSW5jb21pbmdSZWZzKSB7Ci0JCQl0aGlzLnRhcmdldFBsdWdpbiA9IHRhcmdldFBsdWdpbjsKLQkJCXRoaXMuZWxlbWVudHNUb01vdmUgPSBlbGVtZW50c1RvTW92ZTsKLQkJCXRoaXMuc2VhcmNoT3V0Z29pbmdSZWZzID0gc2VhcmNoT3V0Z29pbmdSZWZzOwotCQkJdGhpcy5zZWFyY2hJbmNvbWluZ1JlZnMgPSBzZWFyY2hJbmNvbWluZ1JlZnM7Ci0JCX0KLQotCQlwdWJsaWMgU2V0IGdldEFmZmVjdGVkUmVzb3VyY2VzKCkgewotCQkJaWYgKGFmZmVjdGVkUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCQlpbGxlZ2FsUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudHNUb01vdmUuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0KLQkJCQkJCS8vIGdldCBvdXRnb2luZyByZWZlcmVuY2VzCi0JCQkJCQkvLwotCQkJCQkJaWYgKHNlYXJjaE91dGdvaW5nUmVmcwotCQkJCQkJCQkmJiAhaXNFeGNsdWRlZEZyb21PdXRnb2luZ1JlZmVyZW5jZUNoZWNrKG9iaikpIHsKLQkJCQkJCQlnZXRJbGxlZ2FsT3V0Z29pbmdSZWZlcmVuY2VzKHRhcmdldFBsdWdpbiwgZSwKLQkJCQkJCQkJCWlsbGVnYWxSZWZlcmVuY2VzKTsKLQkJCQkJCX0KLQotCQkJCQkJLy8gZ2V0IGluY29taW5nIHJlZmVyZW5jZXMKLQkJCQkJCS8vCi0JCQkJCQlpZiAoc2VhcmNoSW5jb21pbmdSZWZzKSB7Ci0JCQkJCQkJQ29sbGVjdGlvbiByZWZlcmVuY2VzID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkJCS5nZXRSZWZlcmVuY2VzKGUpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIKLQkJCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCQlpZiAoIWVsZW1lbnRzVG9Nb3ZlLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJCQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbAotCQkJCQkJCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQkJCQkJCQkJaWYgKHBsdWdpbiAhPSBudWxsCi0JCQkJCQkJCQkJCSYmIHBsdWdpbiAhPSB0YXJnZXRQbHVnaW4KLQkJCQkJCQkJCQkJJiYgIU1pc2MuaXNCYXNlT2YodGFyZ2V0UGx1Z2luLAotCQkJCQkJCQkJCQkJCXBsdWdpbikpIHsKLQkJCQkJCQkJCQlDb2xsZWN0aW9uIHhSZWZzID0gZ2V0WFJlZmVyZW5jZXMoCi0JCQkJCQkJCQkJCQllbGVtZW50LCBlLCBudWxsKTsKLQkJCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0geFJlZnMuaXRlcmF0b3IoKTsgaXRlcjEKLQkJCQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlcjEKLQkJCQkJCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCQkJCQlpbGxlZ2FsUmVmZXJlbmNlcwotCQkJCQkJCQkJCQkJCS5hZGQobmV3IFJlZmVyZW5jZShlbGVtZW50LAotCQkJCQkJCQkJCQkJCQkJZiwgZSkpOwotCQkJCQkJCQkJCX0KLQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJYWZmZWN0ZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGlsbGVnYWxSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJlZmVyZW5jZSByZWYgPSAoUmVmZXJlbmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKHJlZi5vd25lci5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZmZlY3RlZFJlc291cmNlcy5hZGQocmVmLm93bmVyLmVSZXNvdXJjZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBhZmZlY3RlZFJlc291cmNlczsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUlsbGVnYWxSZWZlcmVuY2VzKCkgewotCQkJcmVtb3ZlZFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbGxlZ2FsUmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHJlZi5mZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCUxpc3QgbGlzdCA9ICgoTGlzdCkgcmVmLm93bmVyLmVHZXQocmVmLmZlYXR1cmUpKTsKLQkJCQkJLy8gVE9ETzogbmVlZHMgcmV2aXNpdAotCQkJCQkvLyBUaGlzIGNvZGUgdGhyb3dzCi0JCQkJCS8vIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0JEJhc2ljSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotCQkJCQkvLyBzb21ldGltZXMKLQkJCQkJLy8KLQkJCQkJLy8gaWYocmVmLmluZGV4ICE9IC0xKSB7Ci0JCQkJCS8vIGxpc3QucmVtb3ZlKHJlZi5pbmRleCk7Ci0JCQkJCS8vIH0KLQkJCQkJLy8gZWxzZSB7Ci0JCQkJCS8vIGxpc3QucmVtb3ZlKHJlZi52YWx1ZSk7Ci0JCQkJCS8vIH0KLQotCQkJCQlsaXN0LnJlbW92ZShyZWYudmFsdWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlZi5vd25lci5lU2V0KHJlZi5mZWF0dXJlLCBudWxsKTsKLQkJCQl9Ci0JCQkJcmVtb3ZlZFJlZmVyZW5jZXMuYWRkKHJlZik7Ci0JCQl9Ci0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlc3RvcmVSZW1vdmVkUmVmZXJlbmNlcygpIHsKLQkJCWlmIChyZW1vdmVkUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IHJlbW92ZWRSZWZlcmVuY2VzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJUmVmZXJlbmNlIHJlZiA9IChSZWZlcmVuY2UpIHJlbW92ZWRSZWZlcmVuY2VzLmdldChpKTsKLQkJCQlpZiAocmVmLmZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJTGlzdCBsaXN0ID0gKChMaXN0KSByZWYub3duZXIuZUdldChyZWYuZmVhdHVyZSkpOwotCQkJCQlpZiAocmVmLmluZGV4ICE9IC0xKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIFRPRE86IG5lZWQgcmV2aXNpdHMKLQkJCQkJCQkvLwotCQkJCQkJCWlmICghbGlzdC5jb250YWlucyhyZWYudmFsdWUpKSB7Ci0JCQkJCQkJCWlmIChyZWYuaW5kZXggPCBsaXN0LnNpemUoKSkgewotCQkJCQkJCQkJbGlzdC5hZGQocmVmLmluZGV4LCByZWYudmFsdWUpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJbGlzdC5hZGQocmVmLnZhbHVlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJCXRocm93IGU7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlsaXN0LmFkZChyZWYudmFsdWUpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVmLm93bmVyLmVTZXQocmVmLmZlYXR1cmUsIHJlZi52YWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBNb3ZlT3BlcmF0aW9uIHsKLQkJLyoqIENvbnN0YW50cyBmb3Igc3RhdGUgb2YgdGhlIG1vdmUgb3BlcmF0aW9uICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9TVEFSVCA9IDA7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NBVkVEX0ZJTEVTID0gODA7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX01PVkVEX0ZJTEVTID0gNzA7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPUElFRF9SRVNPVVJDRVMgPSA5MDsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRU5EID0gMTAwOwotCi0JCS8vIHByaXZhdGUgQ29tbWFuZCBjb21tYW5kOwotCQlwcml2YXRlIEFkZENvbW1hbmQgYWRkQ29tbWFuZDsKLQotCQlwcml2YXRlIENvbGxlY3Rpb24gbW92ZUxpc3Q7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHJlbW92ZVhSZWZSZXF1aXJlZCA9IGZhbHNlOwotCi0JCXByaXZhdGUgYm9vbGVhbiBpc1JlZmVucmVjZWRJbGxlZ2FsbHkgPSBmYWxzZTsKLQotCQlwcml2YXRlIE1ldGhvZFBsdWdpbiBvd25lclBsdWdpbjsKLQotCQlwcml2YXRlIE1hcCBlbGVtZW50VG9PbGRQbHVnaW5NYXA7Ci0KLQkJcHJpdmF0ZSBNYXAgZWxlbWVudFRvTmV3TmFtZU1hcDsKLQotCQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLQotCQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCi0JCXByaXZhdGUgSGFzaFNldCBtb3ZlZFJlc291cmNlczsKLQotCQlwcml2YXRlIE11bHRpU3RhdHVzIHN0YXR1czsKLQotCQkvKioKLQkJICogQ3VycmVudCBzdGF0ZSBvZiB0aGUgbW92ZSBvcGVyYXRpb24sIGl0IGNhbiBiZSBvbmUgb2YgdGhlIHN0YXRlCi0JCSAqIGNvbnN0YW50cwotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgc3RhdGU7Ci0KLQkJcHJvdGVjdGVkIFNldCBtb2RpZmllZFJlc291cmNlczsKLQotCQlwcml2YXRlIElsbGVnYWxSZWZlcmVuY2VSZW1vdmVyIGlsbGVnYWxSZWZlcmVuY2VSZW1vdmVyOwotCi0JCXByaXZhdGUgSGFzaE1hcCBlbGVtZW50VG9PbGRDb250YWluZXJNYXA7Ci0KLQkJcHVibGljIE1vdmVPcGVyYXRpb24oQ29tbWFuZCBjb21tYW5kLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQkJU2hlbGwgc2hlbGwpIHsKLQkJCS8vIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0JCQlhZGRDb21tYW5kID0gKEFkZENvbW1hbmQpIFRuZ1V0aWwudW53cmFwKGNvbW1hbmQpOwotCQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQkJCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0YXR1cy4KLQkJICovCi0JCXB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQotCQkvKioKLQkJICogQ2hlY2tzIGlmIHJlbG9hZGluZyBsaWJyYXJ5IGlzIG5lZWRlZCBpbiBjYXNlIG9mIG1vdmUgZmFpbHVyZQotCQkgKiAKLQkJICogQHJldHVybgotCQkgKiBAc2VlICNnZXRTdGF0dXMoKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gcmVsb2FkTmVlZGVkKCkgewotCQkJcmV0dXJuIHN0YXR1cyAhPSBudWxsCi0JCQkJCSYmIENvbW1hbmRTdGF0dXNDaGVja2VyLmhhc1JvbGxiYWNrRXJyb3Ioc3RhdHVzKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB1bmRvKCkgewotCQkJLy8gdW5kbyBuYW1lIGNoYW5nZQotCQkJLy8KLQkJCWlmIChlbGVtZW50VG9OZXdOYW1lTWFwICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50VG9OZXdOYW1lTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJCU5hbWVkRWxlbWVudCBlID0gKE5hbWVkRWxlbWVudCkgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCWUuc2V0TmFtZSgoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChlbGVtZW50VG9PbGRDb250YWluZXJNYXAgIT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRUb09sZENvbnRhaW5lck1hcC5lbnRyeVNldCgpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQlFT2JqZWN0IGUgPSAoRU9iamVjdCkgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCUNvbnRhaW5tZW50SW5mbyBjb250YWlubWVudEluZm8gPSAoQ29udGFpbm1lbnRJbmZvKSBlbnRyeQotCQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IGFkZENvbW1hbmQuZ2V0RmVhdHVyZSgpOwotCQkJCQlpZiAoZi5pc01hbnkoKSkgewotCQkJCQkJKChMaXN0KSBjb250YWlubWVudEluZm8uY29udGFpbmVyLmVHZXQoZikpLmFkZCgKLQkJCQkJCQkJY29udGFpbm1lbnRJbmZvLmluZGV4LCBlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvbnRhaW5tZW50SW5mby5jb250YWluZXIuZVNldChmLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGlsbGVnYWxSZWZlcmVuY2VSZW1vdmVyICE9IG51bGwpIHsKLQkJCQlpbGxlZ2FsUmVmZXJlbmNlUmVtb3Zlci5yZXN0b3JlUmVtb3ZlZFJlZmVyZW5jZXMoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXN0YXRlID0gU1RBVEVfU1RBUlQ7Ci0KLQkJCXN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuT0ssCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yX3JlYXNvbiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKGNoZWNrTmFtZSgpKSB7Ci0JCQkJLy8gY2hlY2sgaWYgdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIHRoaXMKLQkJCQkvLyBjb21tYW5kIGNhbiBiZSBtb2RpZmllZAotCQkJCS8vCi0JCQkJSVN0YXR1cyBleGVjU3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCQkuY2hlY2tDb25maWd1cmF0aW9uc1RvVXBkYXRlKGFkZENvbW1hbmQsIHNoZWxsKTsKLQkJCQlpZiAoIWV4ZWNTdGF0dXMuaXNPSygpKSB7Ci0JCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoTGlicmFyeUVkaXRSZXNvdXJjZXMubW92ZURpYWxvZ190aXRsZSwgbnVsbCwgZXhlY1N0YXR1cyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlmaW5hbCBTdHJpbmdCdWZmZXIgbXNnQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQltb25pdG9yCi0JCQkJCQkJCS5zdWJUYXNrKExpYnJhcnlFZGl0UmVzb3VyY2VzLmNoZWNraW5nUmVmZXJlbmNlc1Rhc2tfbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyBtc2cgPSBjaGVja0ZvcklsbGVnYWxSZWZlcmVuY2VzKCk7Ci0JCQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJCQltc2dCdWZmZXIuYXBwZW5kKG1zZyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX07Ci0KLQkJCQl0cnkgewotCQkJCQlNb2RhbENvbnRleHQucnVuKHJ1bm5hYmxlLCB0cnVlLCBtb25pdG9yLCBzaGVsbAotCQkJCQkJCS5nZXREaXNwbGF5KCkpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJVGhyb3dhYmxlIGV4OwotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLQkJCQkJCWV4ID0gKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBlKQotCQkJCQkJCQkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlleCA9IGU7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG1zZyA9IFRuZ1V0aWwudG9TdGFja1RyYWNlU3RyaW5nKGV4KTsKLQkJCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksIDAsCi0JCQkJCQkJbXNnLCBleCkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKG1zZ0J1ZmZlci5sZW5ndGgoKSA+IDAKLQkJCQkJCSYmIE1zZ0JveC5wcm9tcHQoc2hlbGwsIG1zZ0J1ZmZlci50b1N0cmluZygpLCBTV1QuWUVTCi0JCQkJCQkJCXwgU1dULk5PKSA9PSBTV1QuTk8pIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIHNhdmUgcmVmZXJlbmNlIHRvIG9sZCByZXNvdXJjZSBvZiBhbGwgZWxlbWVudHMgaW4gdGhlCi0JCQkJLy8gbW92ZUxpc3QKLQkJCQkvLwotCQkJCWZpbmFsIE1hcCBlbGVtZW50VG9PbGRSZXNvdXJjZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW92ZUxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQkvLyBzYXZlIHRoZSByZWZlcmVuY2UgdG8gb2xkIHJlc291cmNlCi0JCQkJCQkvLwotCQkJCQkJZWxlbWVudFRvT2xkUmVzb3VyY2VNYXAucHV0KGVsZW1lbnQsIGVsZW1lbnQKLQkJCQkJCQkJLmVSZXNvdXJjZSgpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChyZW1vdmVYUmVmUmVxdWlyZWQgfHwgaXNSZWZlbnJlY2VkSWxsZWdhbGx5KSB7Ci0JCQkJCS8vIGdldCBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgd2lsbCBiZSBtb2RpZmllZCBkdXJpbmcgdGhpcwotCQkJCQkvLyBtb3ZlCi0JCQkJCS8vCi0JCQkJCWlsbGVnYWxSZWZlcmVuY2VSZW1vdmVyID0gbmV3IElsbGVnYWxSZWZlcmVuY2VSZW1vdmVyKAotCQkJCQkJCW93bmVyUGx1Z2luLCBtb3ZlTGlzdCwgcmVtb3ZlWFJlZlJlcXVpcmVkLAotCQkJCQkJCWlzUmVmZW5yZWNlZElsbGVnYWxseSk7Ci0JCQkJCXJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCQltb25pdG9yCi0JCQkJCQkJCQkuc3ViVGFzayhMaWJyYXJ5RWRpdFJlc291cmNlcy5jaGVja0FmZmVjdGVkUmVzb3VyY2VzVGFza19uYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gaWxsZWdhbFJlZmVyZW5jZVJlbW92ZXIKLQkJCQkJCQkJCS5nZXRBZmZlY3RlZFJlc291cmNlcygpOwotCQkJCQkJfQotCi0JCQkJCX07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlNb2RhbENvbnRleHQucnVuKHJ1bm5hYmxlLCB0cnVlLCBtb25pdG9yLCBzaGVsbAotCQkJCQkJCQkuZ2V0RGlzcGxheSgpKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCVRocm93YWJsZSBleDsKLQkJCQkJCWlmIChlIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotCQkJCQkJCWV4ID0gKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBlKQotCQkJCQkJCQkJLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlleCA9IGU7Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgbXNnID0gVG5nVXRpbC50b1N0YWNrVHJhY2VTdHJpbmcoZXgpOwotCQkJCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQkJCQkwLCBtc2csIGV4KSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQkvLyBjaGVjayBhZmZlY3RlZCByZXNvdXJjZXMgZm9yIHVubW9kaWZpYWJsZQotCQkJCQlleGVjU3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KAotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLCBzaGVsbCk7Ci0JCQkJCWlmICghZXhlY1N0YXR1cy5pc09LKCkpIHsKLQkJCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoTGlicmFyeUVkaXRSZXNvdXJjZXMubW92ZURpYWxvZ190aXRsZSwgbnVsbCwgZXhlY1N0YXR1cyk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQl0cnkgewotCQkJCQkJbW9uaXRvcgotCQkJCQkJCQkuc3ViVGFzayhMaWJyYXJ5RWRpdFJlc291cmNlcy5yZW1vdmluZ1JlZmVyZW5jZXN0YXNrX25hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpbGxlZ2FsUmVmZXJlbmNlUmVtb3Zlci5yZW1vdmVJbGxlZ2FsUmVmZXJlbmNlcygpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJdW5kbygpOwotCQkJCQkJU3RyaW5nIG1zZyA9IFRuZ1V0aWwudG9TdGFja1RyYWNlU3RyaW5nKGUpOwotCQkJCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQkJCQkwLCBtc2csIGUpKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQkJbW9uaXRvci5zdWJUYXNrKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJCS8vIHNldCBuZXcgbmFtZSBpZiB0aGVyZSBpcyBhbnkKLQkJCQkvLwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRUb05ld05hbWVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJTmFtZWRFbGVtZW50IGVsZW1lbnQgPSAoTmFtZWRFbGVtZW50KSBlbnRyeS5nZXRLZXkoKTsKLQkJCQkJZWxlbWVudC5zZXROYW1lKChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoZWxlbWVudC5lUmVzb3VyY2UoKSk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kVW5pdCkgewotCQkJCQkJbW92ZWRSZXNvdXJjZXMuYWRkKGVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQkJCUNvbnRlbnRFbGVtZW50IGUgPSAoQ29udGVudEVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQkJCQkJaWYgKENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKGUpKSB7Ci0JCQkJCQkJCW1vdmVkUmVzb3VyY2VzLmFkZChlLmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBtb3ZlIGVsZW1lbnRzCi0JCQkJLy8KLQkJCQlydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQltb25pdG9yCi0JCQkJCQkJCS5zZXRUYXNrTmFtZShMaWJyYXJ5RWRpdFJlc291cmNlcy5tb3ZpbmdUYXNrX25hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlkb01vdmUobW9uaXRvciwgZWxlbWVudFRvT2xkUmVzb3VyY2VNYXAsCi0JCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCQkJfQotCi0JCQkJfTsKLQkJCQl0cnkgewotCQkJCQlNb2RhbENvbnRleHQucnVuKHJ1bm5hYmxlLCB0cnVlLCBtb25pdG9yLCBzaGVsbAotCQkJCQkJCS5nZXREaXNwbGF5KCkpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXVuZG8oKTsKLQkJCQkJVGhyb3dhYmxlIGV4OwotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLQkJCQkJCWV4ID0gKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBlKQotCQkJCQkJCQkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlleCA9IGU7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG1zZyA9IFRuZ1V0aWwudG9TdGFja1RyYWNlU3RyaW5nKGV4KTsKLQkJCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksIDAsCi0JCQkJCQkJbXNnLCBleCkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gY2hlY2sgbW92ZWQgcmVzb3VyY2VzIHRoYXQgYXJlIG5vdCBpbiBtb2RpZmlhYmxlIHJlc291cmNlcwotCQkJCS8vIGZvciB1bm1vZGlmaWFibGUKLQkJCQkvLwotCQkJCUxpc3QgcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdChtb3ZlZFJlc291cmNlcyk7Ci0JCQkJcmVzb3VyY2VzLnJlbW92ZUFsbChtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJZXhlY1N0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkJLmNoZWNrTW9kaWZ5KHJlc291cmNlcywgc2hlbGwpOwotCQkJCWlmICghZXhlY1N0YXR1cy5pc09LKCkpIHsKLQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dFcnJvcihMaWJyYXJ5RWRpdFJlc291cmNlcy5tb3ZlRGlhbG9nX3RpdGxlLCBudWxsLCBleGVjU3RhdHVzKTsKLQotCQkJCQl1bmRvKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQkvLyBzYXZlIHJlc291cmNlcwotCQkJCS8vCi0JCQkJcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlJU3RhdHVzIHNhdmVTdGF0dXMgPSBzYXZlKG1vbml0b3IpOwotCQkJCQkJCWlmICghc2F2ZVN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQkJc3RhdHVzLmFkZChzYXZlU3RhdHVzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQkJdGhyb3cgZTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfTsKLQkJCQl0cnkgewotCQkJCQlNb2RhbENvbnRleHQucnVuKHJ1bm5hYmxlLCB0cnVlLCBtb25pdG9yLCBzaGVsbAotCQkJCQkJCS5nZXREaXNwbGF5KCkpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRocm93YWJsZSBleDsKLQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQkJCQlleCA9ICgoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgZSkKLQkJCQkJCQkJLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZXggPSBlOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBtc2cgPSBUbmdVdGlsLnRvU3RhY2tUcmFjZVN0cmluZyhleCk7Ci0JCQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLCAwLAotCQkJCQkJCW1zZywgZXgpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJfQotCi0JCQlzdGF0ZSA9IFNUQVRFX0VORDsKLQkJfQotCi0JCS8qKgotCQkgKiBpbnRlcmFjdHMgd2l0aCB1c2VyCi0JCSAqIAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gY2hlY2tOYW1lKCkgewotCQkJZWxlbWVudFRvTmV3TmFtZU1hcCA9IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kLmNoZWNrTmFtZShhZGRDb21tYW5kKTsKLQkJCXJldHVybiBlbGVtZW50VG9OZXdOYW1lTWFwICE9IG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogTG9uZyBydW5uaW5nIG1ldGhvZAotCQkgKiAKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgY2hlY2tGb3JJbGxlZ2FsUmVmZXJlbmNlcygpIHsKLQkJCWVsZW1lbnRUb09sZFBsdWdpbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJCW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdChhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKSk7Ci0JCQltb3ZlZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0KLQkJCQkvLyAvLyBzZXQgbmV3IG5hbWUgaWYgdGhlcmUgaXMgYW55Ci0JCQkJLy8gLy8KLQkJCQkvLyBTdHJpbmcgbmV3TmFtZSA9IChTdHJpbmcpIGVsZW1lbnRUb05ld05hbWVNYXAuZ2V0KGVsZW1lbnQpOwotCQkJCS8vIGlmKG5ld05hbWUgIT0gbnVsbCkgewotCQkJCS8vICgoTmFtZWRFbGVtZW50KWVsZW1lbnQpLnNldE5hbWUobmV3TmFtZSk7Ci0JCQkJLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFVuaXQpIHsKLQkJCQkvLyBtb3ZlZFJlc291cmNlcy5hZGQoZWxlbWVudC5lUmVzb3VyY2UoKSk7Ci0JCQkJLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJLy8gQ29udGVudEVsZW1lbnQgZSA9IChDb250ZW50RWxlbWVudCkgZWxlbWVudDsKLQkJCQkvLyBpZihDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihlKSkgewotCQkJCS8vIG1vdmVkUmVzb3VyY2VzLmFkZChlLmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyB9Ci0KLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJZWxlbWVudFRvT2xkUGx1Z2luTWFwLnB1dChlbGVtZW50LCBVbWFVdGlsCi0JCQkJCQkJLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KSk7Ci0JCQkJfQotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVBbGxDb250ZW50cygpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJbW92ZUxpc3QuYWRkKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBjaGVjayBpZiB0aGVyZSBpcyBhbnkgaWxsZWdhbCByZWZlcmVuY2UgaW4gdGhlIG1vdmVkIG9iamVjdHMKLQkJCS8vCQkJCi0JCQlvd25lclBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGFkZENvbW1hbmQuZ2V0T3duZXIoKSk7Ci0JCQlmaW5kX3hQbHVnaW5SZWY6IGZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCi0JCQkJaWYgKGlzRXhjbHVkZWRGcm9tT3V0Z29pbmdSZWZlcmVuY2VDaGVjayhlbGVtZW50KSkgewotCQkJCQljb250aW51ZSBmaW5kX3hQbHVnaW5SZWY7Ci0JCQkJfQotCi0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWlmIChoYXNJbGxlZ2FsUmVmZXJlbmNlSW5jbHVkaW5nQWxsQ2hpbGRyZW4ob3duZXJQbHVnaW4sCi0JCQkJCQkJKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQsIG1vdmVMaXN0KSkgewotCQkJCQkJcmVtb3ZlWFJlZlJlcXVpcmVkID0gdHJ1ZTsKLQkJCQkJCWJyZWFrIGZpbmRfeFBsdWdpblJlZjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJZmluZF9pbGxlZ2FsUmVmZXJlbmNlcjogZm9yIChJdGVyYXRvciBpdGVyID0gbW92ZUxpc3QuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWlmIChpc1JlZmVyZW5jZWRJbGxlZ2FsbHkob3duZXJQbHVnaW4sCi0JCQkJCQkJKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQsIG1vdmVMaXN0KSkgewotCQkJCQkJaXNSZWZlbnJlY2VkSWxsZWdhbGx5ID0gdHJ1ZTsKLQkJCQkJCWJyZWFrIGZpbmRfaWxsZWdhbFJlZmVyZW5jZXI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocmVtb3ZlWFJlZlJlcXVpcmVkIHx8IGlzUmVmZW5yZWNlZElsbGVnYWxseSkgewotCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkUmVmZXJlbmNlc0Vycm9yX3JlYXNvbjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogTG9uZyBydW5uaW5nIG1ldGhvZAotCQkgKiAKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGRvTW92ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQkJTWFwIGVsZW1lbnRUb09sZFJlc291cmNlTWFwLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJCW1vbml0b3Iuc3ViVGFzaygiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJZWxlbWVudFRvT2xkQ29udGFpbmVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCUVPYmplY3QgY29udGFpbmVyID0gZWxlbWVudC5lQ29udGFpbmVyKCk7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZWxlbWVudC5lQ29udGFpbmluZ0ZlYXR1cmUoKTsKLQkJCQkJaW50IGluZGV4OwotCQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJaW5kZXggPSAoKExpc3QpIGNvbnRhaW5lci5lR2V0KGZlYXR1cmUpKQotCQkJCQkJCQkuaW5kZXhPZihlbGVtZW50KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWluZGV4ID0gLTE7Ci0JCQkJCX0KLQkJCQkJZWxlbWVudFRvT2xkQ29udGFpbmVyTWFwLnB1dChlbGVtZW50LCBuZXcgQ29udGFpbm1lbnRJbmZvKAotCQkJCQkJCWNvbnRhaW5lciwgaW5kZXgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG1vdmUgdGhlIGVsZW1lbnRzCi0JCQkvLwotCQkJYWRkQ29tbWFuZC5leGVjdXRlKCk7Ci0KLQkJCS8vIGNvbGxlY3QgcmVzb3VyY2VzIHRoYXQgaGFkIGJlZW4gbW9kaWZlZCBhcyByZXN1bHQgb2YgdGhpcyBtb3ZlCi0JCQkvLwotCQkJUmVzb3VyY2UgbmV3UmVzb3VyY2UgPSBhZGRDb21tYW5kLmdldE93bmVyKCkuZVJlc291cmNlKCk7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQobmV3UmVzb3VyY2UpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkQ29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJRU9iamVjdCBvbGRDb250YWluZXIgPSAoKENvbnRhaW5tZW50SW5mbykgZWxlbWVudFRvT2xkQ29udGFpbmVyTWFwCi0JCQkJCQkJLmdldChlbGVtZW50KSkuY29udGFpbmVyOwotCQkJCQlpZiAob2xkQ29udGFpbmVyLmVSZXNvdXJjZSgpICE9IG5ld1Jlc291cmNlCi0JCQkJCQkJJiYgIW9sZENvbnRhaW5lci5lUmVzb3VyY2UoKS5nZXRDb250ZW50cygpCi0JCQkJCQkJCQkuaXNFbXB0eSgpKSB7Ci0JCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQob2xkQ29udGFpbmVyLmVSZXNvdXJjZSgpKTsKLQkJCQkJCVJlc291cmNlIG9sZFJlc291cmNlID0gKFJlc291cmNlKSBlbGVtZW50VG9PbGRSZXNvdXJjZU1hcAotCQkJCQkJCQkuZ2V0KGVsZW1lbnQpOwotCQkJCQkJaWYgKG9sZENvbnRhaW5lci5lUmVzb3VyY2UoKSAhPSBvbGRSZXNvdXJjZSkgewotCQkJCQkJCW1vdmVkUmVzb3VyY2VzLmFkZChvbGRSZXNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlPYmplY3QgcGx1Z2luID0gZWxlbWVudFRvT2xkUGx1Z2luTWFwLmdldChlbGVtZW50KTsKLQkJCQkJaWYgKG93bmVyUGx1Z2luICE9IHBsdWdpbikgewotCQkJCQkJLy8gaXQncyBhIGNyb3NzLXBsdWdpbiBtb3ZlLCBhZGQgdGhlIHJlc291cmNlcyBvZiB0aG9zZQotCQkJCQkJLy8gY2hpbGRyZW4gdGhhdCBoYXZlIGRpcmVjdCByZXNvdXJjZQotCQkJCQkJLy8gdG8gdGhlIG1vdmVSZXNvdXJjZXMgbGlzdAotCQkJCQkJLy8JCQkJCQkKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVBbGxDb250ZW50cygpOyBpdGVyYXRvcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYgKFVtYVV0aWwuaGFzRGlyZWN0UmVzb3VyY2UoZSkpIHsKLQkJCQkJCQkJbW92ZWRSZXNvdXJjZXMuYWRkKGUuZVJlc291cmNlKCkpOwotCQkJCQkJCQllbGVtZW50VG9PbGRQbHVnaW5NYXAucHV0KGUsIHBsdWdpbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50ICYmCi0JCQkJCQkvLyBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbigoRGVzY3JpYmFibGVFbGVtZW50KQotCQkJCQkJLy8gZWxlbWVudCkpIHsKLQkJCQkJCS8vIG1vdmVkUmVzb3VyY2VzLmFkZCgoKERlc2NyaWJhYmxlRWxlbWVudCllbGVtZW50KS5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkvLyBlbGVtZW50VG9PbGRQbHVnaW5NYXAucHV0KCgoRGVzY3JpYmFibGVFbGVtZW50KWVsZW1lbnQpLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJLy8gcGx1Z2luKTsKLQkJCQkJCS8vIH0KLQkJCQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVBbGxDb250ZW50cygpOwotCQkJCQkJLy8gaXRlcmF0b3IKLQkJCQkJCS8vIC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkvLyBPYmplY3QgZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCS8vIGlmKGUgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQgJiYKLQkJCQkJCS8vIENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKChEZXNjcmliYWJsZUVsZW1lbnQpCi0JCQkJCQkvLyBlKSkgewotCQkJCQkJLy8gbW92ZWRSZXNvdXJjZXMuYWRkKCgoRGVzY3JpYmFibGVFbGVtZW50KWUpLmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpKTsKLQkJCQkJCS8vIGVsZW1lbnRUb09sZFBsdWdpbk1hcC5wdXQoKChEZXNjcmliYWJsZUVsZW1lbnQpZSkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkvLyBwbHVnaW4pOwotCQkJCQkJLy8gfQotCQkJCQkJLy8gfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBJU3RhdHVzIHNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQlJU3RhdHVzLk9LLAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9lcnJvclNhdmluZ0ZpbGVzLAotCQkJCQludWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCQltb25pdG9yLnN1YlRhc2soTGlicmFyeUVkaXRSZXNvdXJjZXMuc2F2aW5nTW9kaWZpZWRGaWxlc1Rhc2tfbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBTZXJ2aWNlcwotCQkJCQkuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJc2F2ZTogZG8gewotCQkJCXRyeSB7Ci0KLQkJCQkJaWYgKCFtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCW1vbml0b3IKLQkJCQkJCQkJLnN1YlRhc2soTGlicmFyeUVkaXRSZXNvdXJjZXMubW92aW5nRmlsZXNUYXNrX25hbWUpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCS8vIG1vdmUgdGhlIG1vdmVkIHJlc291cmNlcwotCQkJCQkJLy8KLQkJCQkJCXBlcnNpc3Rlci5hZGp1c3RMb2NhdGlvbihtb3ZlZFJlc291cmNlcyk7Ci0JCQkJCX0KLQkJCQkJc3RhdGUgPSBTVEFURV9NT1ZFRF9GSUxFUzsKLQotCQkJCQkvLyBzYXZlIHRoZSBtb2RpZmllZCByZXNvdXJjZXMKLQkJCQkJLy8KLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIG1vbml0b3Iuc3ViVGFzayhNZXNzYWdlRm9ybWF0LmZvcm1hdCgiU2F2aW5nCi0JCQkJCQkJLy8gJyd7MH0nJyIsIHBhdGhBcmdzKSk7Ci0JCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCi0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZCgKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnNhdmVGaWxlRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJcmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkgPyByZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSA6IHJlc291cmNlLnRvU3RyaW5nKCkpOwotCQkJCQkJCXN0YXR1cy5hZGQobmV3IFNhdmVTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkJCVNhdmVTdGF0dXMuU0FWRV9FUlJPUiwgbXNnLCBlKSk7Ci0JCQkJCQkJYnJlYWsgc2F2ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCXN0YXRlID0gU1RBVEVfU0FWRURfRklMRVM7Ci0KLQkJCQkJaWYgKHJlc01nciAhPSBudWxsKSB7Ci0JCQkJCQltb25pdG9yCi0JCQkJCQkJCS5zdWJUYXNrKExpYnJhcnlFZGl0UmVzb3VyY2VzLmNvcHlpbmdSZXNvdXJjZXNUYXNrX25hbWUpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCUNvbGxlY3Rpb24gZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vdmVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cy5hZGRBbGwocmVzb3VyY2UKLQkJCQkJCQkJCS5nZXRDb250ZW50cygpKTsKLQkJCQkJCX0KLQotCQkJCQkJZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cy5hZGRBbGwoYWRkQ29tbWFuZAotCQkJCQkJCQkuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOwotCi0JCQkJCQlDb2xsZWN0aW9uIG1vZGlmaWVkID0gcmVzTWdyLmNvcHlSZWZlcmVuY2VkQ29udGVudHMoCi0JCQkJCQkJCWVsZW1lbnRzVG9Db3B5UmVmQ29udGVudHMsCi0JCQkJCQkJCWVsZW1lbnRUb09sZFBsdWdpbk1hcCk7Ci0JCQkJCQlpZiAobW9kaWZpZWQgIT0gbnVsbCAmJiAhbW9kaWZpZWQuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWQuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJCQlPYmplY3RbXSBwYXRoQXJncyA9IHsgcmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkgPyByZXNvdXJjZS5nZXRVUkkoKQotCQkJCQkJCQkJCS50b0ZpbGVTdHJpbmcoKSA6IHJlc291cmNlLnRvU3RyaW5nKCl9OwotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJbW9uaXRvcgotCQkJCQkJCQkJCQkuc3ViVGFzayhNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnNhdmluZ0ZpbGVUYXNrX25hbWUsCi0JCQkJCQkJCQkJCQkJCQlwYXRoQXJncykpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdAotCQkJCQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnNhdmVGaWxlRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJCQkJCXBhdGhBcmdzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJc3RhdHVzLmFkZChuZXcgU2F2ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkJCQkJU2F2ZVN0YXR1cy5TQVZFX0VSUk9SLCBtc2csIGUpKTsKLQkJCQkJCQkJCWJyZWFrIHNhdmU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCQlzdGF0ZSA9IFNUQVRFX0NPUElFRF9SRVNPVVJDRVM7Ci0KLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3RyaW5nV3JpdGVyIG1zZyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKG1zZykpOwotCQkJCQlJU3RhdHVzIG5ld1N0YXR1cyA9IG5ldyBTYXZlU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJU2F2ZVN0YXR1cy5TQVZFX0VSUk9SLCBtc2cudG9TdHJpbmcoKSwgZSk7Ci0JCQkJCXN0YXR1cy5hZGQobmV3U3RhdHVzKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJCVN0cmluZ1dyaXRlciBtc2cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKG1zZykpOwotCQkJCQkJCUlTdGF0dXMgbmV3U3RhdHVzID0gbmV3IFNhdmVTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkJCVNhdmVTdGF0dXMuUk9MTEJBQ0tfRVJST1IsIG1zZy50b1N0cmluZygpLAotCQkJCQkJCQkJZSk7Ci0JCQkJCQkJc3RhdHVzLmFkZChuZXdTdGF0dXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSB3aGlsZSAoZmFsc2UpOwotCi0JCQltb25pdG9yLnN1YlRhc2soTGlicmFyeUVkaXRSZXNvdXJjZXMuY29tbWFuZF9kb25lKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFJlc291cmNlTWFuYWdlciB7Ci0KLQkJLyoqCi0JCSAqIENvcGllcyB0aGUgY29udGVudCByZXNvdXJjZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBieSB0aGUgY29udGVudCBvZgotCQkgKiB0aGUgZ2l2ZW4gZWxlbWVudHMgdGhhdCBoYXZlIGJlZW4gbW92ZWQvY29waWVkIHRvIG5ldyBsb2NhdGlvbi4KLQkJICogCi0JCSAqIEBwYXJhbSBlbGVtZW50cwotCQkgKiAgICAgICAgICAgIEVsZW1lbnRzIHRoYXQgYXJlIG1vdmVkIG9yIGNvcGllZC4KLQkJICogQHJldHVybiBjb2xsZWN0aW9uIG9mIG1vZGlmaWVkIHJlc291cmNlcyBhcyB0aGUgcmVzdWx0IG9mIHRoaXMgY2FsbC4KLQkJICovCi0JCUNvbGxlY3Rpb24gY29weVJlZmVyZW5jZWRDb250ZW50cyhDb2xsZWN0aW9uIGVsZW1lbnRzLAotCQkJCU1hcCBlbGVtZW50VG9PbGRQbHVnaW5NYXApOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQmFzaWNSZXNvdXJjZU1hbmFnZXIgaW1wbGVtZW50cyBSZXNvdXJjZU1hbmFnZXIgewotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZC5SZXNvdXJjZU1hbmFnZXIjY29weVJlZmVyZW5jZWRDb250ZW50cyhqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGNvcHlSZWZlcmVuY2VkQ29udGVudHMoQ29sbGVjdGlvbiBlbGVtZW50cywKLQkJCQlNYXAgZWxlbWVudFRvT2xkUGx1Z2luTWFwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFJlc291cmNlTWFuYWdlcihSZXNvdXJjZU1hbmFnZXIgcmVzTWdyKSB7Ci0JCU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kLnJlc01nciA9IHJlc01ncjsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdWYWxpZGF0b3IgZ2V0U3RyaW5nVmFsaWRhdG9yKCkgewotCQlpZiAoc3RyaW5nVmFsaWRhdG9yID09IG51bGwpIHsKLQkJCXN0cmluZ1ZhbGlkYXRvciA9IG5ldyBTdHJpbmdWYWxpZGF0b3IoKTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nVmFsaWRhdG9yOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nVmFsaWRhdG9yIHN0cmluZ1ZhbGlkYXRvciA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHJpbmdWYWxpZGF0b3IgaW1wbGVtZW50cyBJSW5wdXRWYWxpZGF0b3IgewotCi0JCXByaXZhdGUgQ29sbGVjdGlvbiBlbGVtZW50czsKLQotCQlwcml2YXRlIElWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0JCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmdWYWxpZGF0b3IoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGVsZW1lbnRzCi0JCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnRzIHRvIGluY2x1ZGUgaW4gdGhlIGNoZWNrLgotCQkgKi8KLQkJcHVibGljIFN0cmluZ1ZhbGlkYXRvcihDb2xsZWN0aW9uIGVsZW1lbnRzLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQkJdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOwotCQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBTZXRzIHRoZSBlbGVtZW50cyB0byBpbmNsdWRlIGluIHRoZSBjaGVjay4KLQkJICogCi0JCSAqIEBwYXJhbSBlbGVtZW50cwotCQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50cyB0byBpbmNsdWRlIGluIHRoZSBjaGVjay4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRzKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklJbnB1dFZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJCWlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBVbmlxdWVuZXNzVmFsaWRhdG9yKSB7Ci0JCQkJRU9iamVjdCBvYmogPSAoKFVuaXF1ZW5lc3NWYWxpZGF0b3IpIHZhbGlkYXRvcikuZ2V0RU9iamVjdCgpOwotCQkJCWludCBjbGFzc0lEID0gb2JqLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpOwotCQkJCW5ld1RleHQgPSBuZXdUZXh0LnRyaW0oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlTdHJpbmcgc3RyID0gKFN0cmluZykgZS5lR2V0KGZlYXR1cmUpOwotCQkJCQlpZiAob2JqICE9IGUgJiYgY2xhc3NJRCA9PSBlLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpCi0JCQkJCQkJJiYgbmV3VGV4dC5lcXVhbHNJZ25vcmVDYXNlKHN0cikpIHsKLQkJCQkJCS8vIHJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksCi0JCQkJCQkvLyBkYXRhKTsKLQkJCQkJCXJldHVybiBOTFMKLQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csCi0JCQkJCQkJCQkJbmV3VGV4dCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsaWRhdG9yLmlzVmFsaWQobmV3VGV4dCk7Ci0JCX0KLQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2FlZTk5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gY3JlYXRlIGEgY2hpbGQgbWV0aG9kIGVsZW1lbnQgYW5kIGFkZCBpdCB0byB0aGUKLSAqIGNvbnRhaW5pbmcgbWV0aG9kIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kIGV4dGVuZHMgQ3JlYXRlQ2hpbGRDb21tYW5kIHsKLQotCXByaXZhdGUgYm9vbGVhbiBleGVjdXRlZCA9IGZhbHNlOwotCXByb3RlY3RlZCBJVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IGNoaWxkLCBpbnQgaW5kZXgsCi0JCQlDb2xsZWN0aW9uIHNlbGVjdGlvbiwgSGVscGVyIGhlbHBlcikgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgaW5kZXgsIHNlbGVjdGlvbiwgaGVscGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3VwZXJFeGVjdXRlKCkgewotCQlzdXBlci5leGVjdXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJaWYodmFsaWRhdG9yID09IG51bGwpIHsKLQkJCXZhbGlkYXRvciA9IG5ldyBBYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJCQkJaWYgKG5ld1RleHQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCVN0cmluZyBlbGVtZW50VGV4dCA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmVsZW1lbnRfdGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8JCXJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2csIGVsZW1lbnRUZXh0KTsgCi0JCQkJCX0KLQkJCQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBvd25lci5lR2V0KGZlYXR1cmUpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU5hbWVkRWxlbWVudCBjaGlsZCA9IChOYW1lZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGNoaWxkLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5ld1RleHQpKSB7Ci0JCQkJCQkJLy8JCXJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJCQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZywgbmV3VGV4dCk7IAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlciNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlTdHJpbmcgdGl0bGUgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5uZXdFbGVtZW50X3RleHQsIGhlbHBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pKTsgCi0JCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gZ2V0VmFsaWRhdG9yKCk7Ci0JCWZpbmFsIFN0cmluZyBuYW1lID0gVXNlckludGVyYWN0aW9uSGVscGVyLnJlcXVlc3ROYW1lKGNoaWxkLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIHRpdGxlLCB2YWxpZGF0b3IpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkoKE5hbWVkRWxlbWVudCkgY2hpbGQpLnNldE5hbWUobmFtZSk7Ci0JCQlzdXBlckV4ZWN1dGUoKTsKLQkJCWV4ZWN1dGVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCWlmIChleGVjdXRlZCkgewotCQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG93bmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kI2dldFJlc3VsdCgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlpZiAoZXhlY3V0ZWQpIHsKLQkJCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01vdmVJbkNhdGVnb3J5Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTW92ZUluQ2F0ZWdvcnlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxNjUwYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTW92ZUluQ2F0ZWdvcnlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db250ZW50RWxlbWVudE9yZGVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byByZW9yZGVyIGEgbWV0aG9kIGVsZW1lbnQgd2l0aGluIGEgY2F0ZWdvcnkuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTW92ZUluQ2F0ZWdvcnlDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgQ29udGVudENhdGVnb3J5IGNhdGVnb3J5OwotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCXByaXZhdGUgTGlzdCBlbGVtZW50c0xpc3Q7Ci0JCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBvcmRlckxpc3Q7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGNhdGVnb3J5UGtnUGF0aDsKLQotCXByaXZhdGUgQ29udGVudENhdGVnb3J5IHVzZWRDYXRlZ29yeSA9IG51bGw7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgVVAgPSAxOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IERvd24gPSAwOwotCi0JcHJpdmF0ZSBpbnQgZGlyZWN0aW9uID0gLTE7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbW92ZWQ7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBNb3ZlSW5DYXRlZ29yeUNvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE1vdmVJbkNhdGVnb3J5Q29tbWFuZChDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnksIExpc3QgZWxlbWVudHNMaXN0LAotCQkJQ29udGVudEVsZW1lbnRPcmRlckxpc3Qgb3JkZXJMaXN0LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFN0cmluZ1tdIGNhdGVnb3J5UGtnUGF0aCwKLQkJCWludCBkaXJlY3Rpb24pIHsKLQkJdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLmVsZW1lbnRzTGlzdCA9IGVsZW1lbnRzTGlzdDsKLQkJdGhpcy5vcmRlckxpc3QgPSBvcmRlckxpc3Q7Ci0JCXRoaXMuY2F0ZWdvcnlQa2dQYXRoID0gY2F0ZWdvcnlQa2dQYXRoOwotCQl0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqLwotCXB1YmxpYyBNb3ZlSW5DYXRlZ29yeUNvbW1hbmQoU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgTW92ZUluQ2F0ZWdvcnlDb21tYW5kKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChjYXRlZ29yeS5lUmVzb3VyY2UoKSk7Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCU1ldGhvZFBsdWdpbiBjYXRlZ29yeVBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNhdGVnb3J5KTsKLQkJTWV0aG9kUGx1Z2luIGVsZW1lbnRQbHVnaW4gPSBVbWFVdGlsCi0JCQkJLmdldE1ldGhvZFBsdWdpbigoTWV0aG9kRWxlbWVudCkgZWxlbWVudHNMaXN0LmdldCgwKSk7Ci0KLQkJaWYgKGNhdGVnb3J5UGx1Z2luICE9IGVsZW1lbnRQbHVnaW4KLQkJCQkmJiBNaXNjLmlzQmFzZU9mKGNhdGVnb3J5UGx1Z2luLCBlbGVtZW50UGx1Z2luKSkgewotCQkJdXNlZENhdGVnb3J5ID0gVG5nVXRpbC5maW5kQ29udHJpYnV0b3IoVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoCi0JCQkJCWVsZW1lbnRQbHVnaW4sIGNhdGVnb3J5UGtnUGF0aCksIGNhdGVnb3J5KTsKLQkJfSBlbHNlIHsKLQkJCXVzZWRDYXRlZ29yeSA9IGNhdGVnb3J5OwotCQl9Ci0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWlmICh1c2VkQ2F0ZWdvcnkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlpbnQgaW5kZXggPSBvcmRlckxpc3QuaW5kZXhPZihvYmplY3QpOwotCQkJCWlmIChkaXJlY3Rpb24gPT0gVVApIHsKLQkJCQkJaWYgKGluZGV4ID4gMCkKLQkJCQkJCW9yZGVyTGlzdC5tb3ZlKGluZGV4IC0gMSwgb2JqZWN0KTsKLQkJCQl9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBEb3duKSB7Ci0JCQkJCWlmIChpbmRleCA8IG9yZGVyTGlzdC5zaXplKCkpCi0JCQkJCQlvcmRlckxpc3QubW92ZShpbmRleCArIGVsZW1lbnRzTGlzdC5zaXplKCksIG9iamVjdCk7Ci0JCQkJfQotCQkJCW1vdmVkID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdXNlZENhdGVnb3J5LmVTZXQoZmVhdHVyZSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJb3JkZXJMaXN0LmFwcGx5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKG1vdmVkKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHNMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCWludCBpbmRleCA9IG9yZGVyTGlzdC5pbmRleE9mKG9iamVjdCk7Ci0JCQkJCWlmIChkaXJlY3Rpb24gPT0gVVApIHsKLQkJCQkJaWYgKGluZGV4IDwgb3JkZXJMaXN0LnNpemUoKSkKLQkJCQkJCW9yZGVyTGlzdC5tb3ZlKGluZGV4ICsgZWxlbWVudHNMaXN0LnNpemUoKSwgb2JqZWN0KTsKLQkJCQkJfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRG93bikgewotCQkJCQkJaWYgKGluZGV4ID4gMCkKLQkJCQkJCQlvcmRlckxpc3QubW92ZShpbmRleCAtIDEsIG9iamVjdCk7Ci0JCQkJCX0KLQkJCQkJbW92ZWQgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXVzZWRDYXRlZ29yeS5lU2V0KGZlYXR1cmUsIG9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQkJb3JkZXJMaXN0LmFwcGx5KCk7Ci0JCQltb3ZlZCA9IGZhbHNlOwotCQl9Ci0JCWlmIChUbmdVdGlsLmlzRW1wdHkodXNlZENhdGVnb3J5KSkgewotCQkJRWNvcmVVdGlsLnJlbW92ZSh1c2VkQ2F0ZWdvcnkpOwotCQkJdXNlZENhdGVnb3J5ID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodXNlZENhdGVnb3J5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyOWE4NDQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIG1vdmUgYSB2aWV3IGluIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLSAqIEBhdXRob3IgWGlhbmcgRG9uZyBIdQotICogQHNpbmNlIDEuMgotICogZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTczODI3Ci0gKi8KLXB1YmxpYyBjbGFzcyBNb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0JCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQlwcml2YXRlIExpc3QgZWxlbWVudHNMaXN0OwotCQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgc3RhdGljIGludCBVUCA9IDE7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgRG93biA9IDA7Ci0KLQlwcml2YXRlIGludCBkaXJlY3Rpb24gPSAtMTsKLQotCXByaXZhdGUgYm9vbGVhbiBtb3ZlZDsKLQkKLQlwdWJsaWMgTW92ZUluQ29uZmlndXJhdGlvbkNvbW1hbmQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIExpc3QgZWxlbWVudHNMaXN0LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBkaXJlY3Rpb24pIHsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCXRoaXMuZWxlbWVudHNMaXN0ID0gZWxlbWVudHNMaXN0OwotCQl0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXJlZG8oKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWlmIChjb25maWcgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlFTGlzdCBsaXN0ID0gKEVMaXN0KSBjb25maWcuZUdldChmZWF0dXJlKTsKLQkJCQlpbnQgaW5kZXggPSBsaXN0LmluZGV4T2Yob2JqZWN0KTsKLQkJCQlpZiAoZGlyZWN0aW9uID09IFVQKSB7Ci0JCQkJCWlmIChpbmRleCA+IDApCi0JCQkJCQlsaXN0Lm1vdmUoaW5kZXggLSAxLCBvYmplY3QpOwotCQkJCX0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERvd24pIHsKLQkJCQkJaWYgKGluZGV4IDwgbGlzdC5zaXplKCkpCi0JCQkJCQlsaXN0Lm1vdmUoaW5kZXggKyBlbGVtZW50c0xpc3Quc2l6ZSgpLCBvYmplY3QpOwotCQkJCX0KLQkJCQltb3ZlZCA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWNvbmZpZy5lU2V0KGZlYXR1cmUsIG51bGwpOwotCQkJfQotCQl9Ci0JCWlmIChjb25maWcuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNvbmZpZy5lUmVzb3VyY2UoKSk7Ci0JCX0KLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAobW92ZWQpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50c0xpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJRUxpc3QgbGlzdCA9IChFTGlzdCkgY29uZmlnLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCWludCBpbmRleCA9IGxpc3QuaW5kZXhPZihvYmplY3QpOwotCQkJCQlpZiAoZGlyZWN0aW9uID09IFVQKSB7Ci0JCQkJCQlpZiAoaW5kZXggPCBsaXN0LnNpemUoKSkKLQkJCQkJCQlsaXN0Lm1vdmUoaW5kZXggKyBlbGVtZW50c0xpc3Quc2l6ZSgpLCBvYmplY3QpOwotCQkJCQl9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBEb3duKSB7Ci0JCQkJCQlpZiAoaW5kZXggPiAwKQotCQkJCQkJCWxpc3QubW92ZShpbmRleCAtIDEsIG9iamVjdCk7Ci0JCQkJCX0KLQkJCQkJbW92ZWQgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvbmZpZy5lU2V0KGZlYXR1cmUsIG9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQkJbW92ZWQgPSBmYWxzZTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGNvbmZpZyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01vdmVJblNlY3Rpb25MaXN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYjA4NGU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01vdmVJblNlY3Rpb25MaXN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NaXNjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byByZW9yZGVyIGEgc2VjdGlvbiB3aXRoaW4gYSBzZWN0aW9uIGxpc3QuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQ7Ci0KLQlwcml2YXRlIFNlY3Rpb25MaXN0IHNlY3Rpb25MaXN0OwotCi0JcHJpdmF0ZSBMaXN0IGVsZW1lbnRzTGlzdDsKLQotCXByaXZhdGUgQ29udGVudEVsZW1lbnQgdXNlZENvbnRlbnRFbGVtZW50ID0gbnVsbDsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgc3RhdGljIGludCBVUCA9IDE7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgRG93biA9IDA7Ci0KLQlwcml2YXRlIGludCBkaXJlY3Rpb24gPSAtMTsKLQotCXByaXZhdGUgYm9vbGVhbiBtb3ZlZDsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kKENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50LAotCQkJTGlzdCBlbGVtZW50c0xpc3QsIFNlY3Rpb25MaXN0IHNlY3Rpb25MaXN0LCBpbnQgZGlyZWN0aW9uKSB7Ci0JCXRoaXMuY29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQkJdGhpcy5zZWN0aW9uTGlzdCA9IHNlY3Rpb25MaXN0OwotCQl0aGlzLmVsZW1lbnRzTGlzdCA9IGVsZW1lbnRzTGlzdDsKLQkJdGhpcy5kaXJlY3Rpb24gPSBkaXJlY3Rpb247Ci0KLQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqLwotCXB1YmxpYyBNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQoU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChjb250ZW50RWxlbWVudC5lUmVzb3VyY2UoKSk7Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCU1ldGhvZFBsdWdpbiB0YXNrUGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY29udGVudEVsZW1lbnQpOwotCQlNZXRob2RQbHVnaW4gZWxlbWVudFBsdWdpbiA9IFVtYVV0aWwKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChNZXRob2RFbGVtZW50KSBlbGVtZW50c0xpc3QuZ2V0KDApKTsKLQotCQlpZiAodGFza1BsdWdpbiAhPSBlbGVtZW50UGx1Z2luCi0JCQkJJiYgTWlzYy5pc0Jhc2VPZih0YXNrUGx1Z2luLCBlbGVtZW50UGx1Z2luKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gVG5nVXRpbC5nZXRDb250cmlidXRvcnMoY29udGVudEVsZW1lbnQpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHZlIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQKLQkJCQkJCSYmIFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHZlKSA9PSBlbGVtZW50UGx1Z2luKSB7Ci0JCQkJCXVzZWRDb250ZW50RWxlbWVudCA9IChDb250ZW50RWxlbWVudCkgdmU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAodXNlZENvbnRlbnRFbGVtZW50ID09IG51bGwpIHsKLQkJCXVzZWRDb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYgKHVzZWRDb250ZW50RWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHNMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0JCQlpbnQgaW5kZXggPSBzZWN0aW9uTGlzdC5pbmRleE9mKG9iamVjdCk7Ci0JCQlpZiAoZGlyZWN0aW9uID09IFVQKSB7Ci0JCQkJaWYgKGluZGV4ID4gMCkKLQkJCQkJc2VjdGlvbkxpc3QubW92ZShpbmRleCAtIDEsIG9iamVjdCk7Ci0JCQl9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBEb3duKSB7Ci0JCQkJaWYgKGluZGV4IDwgc2VjdGlvbkxpc3Quc2l6ZSgpKQotCQkJCQlzZWN0aW9uTGlzdC5tb3ZlKGluZGV4ICsgZWxlbWVudHNMaXN0LnNpemUoKSwgb2JqZWN0KTsKLQkJCX0KLQkJCW1vdmVkID0gdHJ1ZTsKLQkJfQotCQlzZWN0aW9uTGlzdC5hcHBseSgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKG1vdmVkKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHNMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotCQkJCWludCBpbmRleCA9IHNlY3Rpb25MaXN0LmluZGV4T2Yob2JqZWN0KTsKLQkJCQlpZiAoZGlyZWN0aW9uID09IFVQKSB7Ci0JCQkJCWlmIChpbmRleCA8IHNlY3Rpb25MaXN0LnNpemUoKSkKLQkJCQkJCXNlY3Rpb25MaXN0Lm1vdmUoaW5kZXggKyBlbGVtZW50c0xpc3Quc2l6ZSgpLCBvYmplY3QpOwotCQkJCX0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERvd24pIHsKLQkJCQkJaWYgKGluZGV4ID4gMCkKLQkJCQkJCXNlY3Rpb25MaXN0Lm1vdmUoaW5kZXggLSAxLCBvYmplY3QpOwotCQkJCX0KLQkJCQltb3ZlZCA9IHRydWU7Ci0JCQl9Ci0JCQlzZWN0aW9uTGlzdC5hcHBseSgpOwotCQkJbW92ZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodXNlZENvbnRlbnRFbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlZmVyZW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0ZjhkOGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZmVyZW5jZSB7Ci0JCi0JRU9iamVjdCBvd25lcjsKLQotCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JT2JqZWN0IHZhbHVlOwotCi0JaW50IGluZGV4ID0gLTE7Ci0KLQlwdWJsaWMgUmVmZXJlbmNlKEVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgb3duZXIuZUdldChmZWF0dXJlKTsKLQkJCWluZGV4ID0gbGlzdC5pbmRleE9mKHZhbHVlKTsKLQkJfQotCX0KLQotCVJlZmVyZW5jZShFT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuaW5kZXggPSBpbmRleDsKLQl9Ci0KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRPd25lcigpIHsKLQkJcmV0dXJuIG93bmVyOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVtb3ZlRnJvbUNhdGVnb3J5Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVtb3ZlRnJvbUNhdGVnb3J5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMTRjODhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZUZyb21DYXRlZ29yeUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NaXNjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byByZW1vdmUgYSBtZXRob2QgZWxlbWVudCBmcm9tIGEgY2F0ZWdvcnkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVGcm9tQ2F0ZWdvcnlDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgQ29udGVudENhdGVnb3J5IGNhdGVnb3J5OwotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JcHJpdmF0ZSBTdHJpbmdbXSBjb250ZW50UGtnUGF0aDsKLQotCXByaXZhdGUgQ29udGVudENhdGVnb3J5IHVzZWRDYXRlZ29yeTsKLQotCXByaXZhdGUgaW50IHJlbW92ZWRFbGVtZW50SW5kZXggPSAtMTsKLQotCXByaXZhdGUgYm9vbGVhbiByZW1vdmVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgUmVtb3ZlRnJvbUNhdGVnb3J5Q29tbWFuZChDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnksCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJU3RyaW5nW10gY29udGVudFBrZ1BhdGgpIHsKLQkJdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLmNvbnRlbnRQa2dQYXRoID0gY29udGVudFBrZ1BhdGg7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmICh1c2VkQ2F0ZWdvcnkgIT0gbnVsbCAmJiB1c2VkQ2F0ZWdvcnkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodXNlZENhdGVnb3J5LmVSZXNvdXJjZSgpKTsKLQkJfQotCi0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCU1ldGhvZFBsdWdpbiBjYXRlZ29yeVBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNhdGVnb3J5KTsKLQkJTWV0aG9kUGx1Z2luIGVsZW1lbnRQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQotCQlpZiAoY2F0ZWdvcnlQbHVnaW4gIT0gZWxlbWVudFBsdWdpbgotCQkJCSYmIE1pc2MuaXNCYXNlT2YoY2F0ZWdvcnlQbHVnaW4sIGVsZW1lbnRQbHVnaW4pKSB7Ci0JCQl1c2VkQ2F0ZWdvcnkgPSBUbmdVdGlsLmZpbmRDb250cmlidXRvcihVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgKLQkJCQkJZWxlbWVudFBsdWdpbiwgY29udGVudFBrZ1BhdGgpLCBjYXRlZ29yeSk7Ci0JCX0gZWxzZSB7Ci0JCQl1c2VkQ2F0ZWdvcnkgPSBjYXRlZ29yeTsKLQkJfQotCi0JCXJlZG8oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlpZiAodXNlZENhdGVnb3J5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSB1c2VkQ2F0ZWdvcnkuZUdldChmZWF0dXJlKTsKLQkJCWlmIChjb2xsZWN0aW9uIGluc3RhbmNlb2YgRUxpc3QpIHsKLQkJCQlyZW1vdmVkRWxlbWVudEluZGV4ID0gKChFTGlzdCkgY29sbGVjdGlvbikuaW5kZXhPZihlbGVtZW50KTsKLQkJCX0KLQkJCXJlbW92ZWQgPSBjb2xsZWN0aW9uLnJlbW92ZShlbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCXVzZWRDYXRlZ29yeS5lU2V0KGZlYXR1cmUsIG51bGwpOwotCQkJcmVtb3ZlZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKHJlbW92ZWQpIHsKLQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHVzZWRDYXRlZ29yeS5lR2V0KGZlYXR1cmUpOwotCQkJCWlmIChjb2xsZWN0aW9uIGluc3RhbmNlb2YgRUxpc3QgJiYgcmVtb3ZlZEVsZW1lbnRJbmRleCAhPSAtMSkgewotCQkJCQkoKEVMaXN0KSBjb2xsZWN0aW9uKS5hZGQocmVtb3ZlZEVsZW1lbnRJbmRleCwgZWxlbWVudCk7Ci0JCQkJfSBlbHNlCi0JCQkJCWNvbGxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQl1c2VkQ2F0ZWdvcnkuZVNldChmZWF0dXJlLCBlbGVtZW50KTsKLQkJCX0KLQkJCXJlbW92ZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNnZXRSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJaWYgKHJlbW92ZWQpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVtb3ZlRnJvbVNlY3Rpb25MaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZW1vdmVGcm9tU2VjdGlvbkxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTI0YWRlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZW1vdmVGcm9tU2VjdGlvbkxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byByZW1vdmUgYSBzZWN0aW9uIGZyb20gYSBzZWN0aW9uIGxpc3QuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVGcm9tU2VjdGlvbkxpc3QgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudDsKLQotCXByaXZhdGUgU2VjdGlvbkxpc3Qgc2VjdGlvbkxpc3Q7Ci0KLQlwcml2YXRlIFNlY3Rpb24gc2VjdGlvbjsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgYm9vbGVhbiByZW1vdmVkOwotCi0JcHJpdmF0ZSBpbnQgcmVtb3ZlZE9iamVjdEluZGV4ID0gLTE7Ci0KLQlwdWJsaWMgUmVtb3ZlRnJvbVNlY3Rpb25MaXN0KENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50LAotCQkJU2VjdGlvbiBzZWN0aW9uLCBTZWN0aW9uTGlzdCBzZWN0aW9uTGlzdCkgewotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCXRoaXMuc2VjdGlvbkxpc3QgPSBzZWN0aW9uTGlzdDsKLQkJdGhpcy5zZWN0aW9uID0gc2VjdGlvbjsKLQotCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCkpOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYgKGNvbnRlbnRFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXJlbW92ZWRPYmplY3RJbmRleCA9IHNlY3Rpb25MaXN0LmluZGV4T2Yoc2VjdGlvbik7Ci0JCXNlY3Rpb25MaXN0LnJlbW92ZShzZWN0aW9uKTsKLQkJcmVtb3ZlZCA9IHRydWU7Ci0JCXNlY3Rpb25MaXN0LmFwcGx5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKHJlbW92ZWQpIHsKLQkJCWlmIChyZW1vdmVkT2JqZWN0SW5kZXggIT0gLTEpIHsKLQkJCQlzZWN0aW9uTGlzdC5hZGQocmVtb3ZlZE9iamVjdEluZGV4LCBzZWN0aW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VjdGlvbkxpc3QuYWRkKHNlY3Rpb24pOwotCQkJfQotCQkJc2VjdGlvbkxpc3QuYXBwbHkoKTsKLQkJCXJlbW92ZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY29udGVudEVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVtb3ZlUmVmZXJlbmNlc0NvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZVJlZmVyZW5jZXNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI3ZWJlNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVtb3ZlUmVmZXJlbmNlc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudHNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byByZW1vdmUgbWV0aG9kIGVsZW1lbnQgcmVmZXJlbmNlcy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZVJlZmVyZW5jZXNDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgTWV0aG9kUGx1Z2luIHBsdWdpbjsKLQotCXByaXZhdGUgTWV0aG9kUGx1Z2luIGJhc2U7Ci0KLQlwcml2YXRlIE1hcCBmZWF0dXJlVmFsdWVQYWlyVG9PYmplY3RNYXA7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgY29tbWFuZCB0byByZW1vdmUgYWxsIHJlZmVyZW5jZXMgaW4gPGNvZGU+cGx1Z2luPC9jb2RlPgotCSAqIHRoYXQgYXJlIGVsZW1lbnRzIG9mIDxjb2RlPmJhc2U8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEBwYXJhbSBiYXNlCi0JICovCi0JcHVibGljIFJlbW92ZVJlZmVyZW5jZXNDb21tYW5kKE1ldGhvZFBsdWdpbiBwbHVnaW4sIE1ldGhvZFBsdWdpbiBiYXNlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucGx1Z2luID0gcGx1Z2luOwotCQl0aGlzLmJhc2UgPSBiYXNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNwcmVwYXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJZmVhdHVyZVZhbHVlUGFpclRvT2JqZWN0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCi0JCWZvciAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yIGZlYXR1cmVJdGVyYXRvciA9IChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IpIHBsdWdpbgotCQkJCS5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgZmVhdHVyZUl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgcmVmID0gKEVPYmplY3QpIGZlYXR1cmVJdGVyYXRvci5uZXh0KCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IGZlYXR1cmVJdGVyYXRvci5mZWF0dXJlKCk7Ci0JCQlpZiAoZiAhPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fQmFzZXMoKQotCQkJCQkmJiBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihyZWYpID09IGJhc2UpIHsKLQkJCQlmZWF0dXJlVmFsdWVQYWlyVG9PYmplY3RNYXAucHV0KG5ldyBGZWF0dXJlVmFsdWVQYWlyKGYsIHJlZiksCi0JCQkJCQlwbHVnaW4pOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGx1Z2luLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQotCQkJLy8gaWdub3JlIFByb2Nlc3NFbGVtZW50IGIvYyBpdCBjYW4gcmVmZXJlbmNlcyBhbnl0aGluZwotCQkJLy8KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJZm9yIChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IgZmVhdHVyZUl0ZXJhdG9yID0gKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcikgZWxlbWVudAotCQkJCQkuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGZlYXR1cmVJdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCByZWYgPSAoRU9iamVjdCkgZmVhdHVyZUl0ZXJhdG9yLm5leHQoKTsKLQotCQkJCWlmIChVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihyZWYpID09IGJhc2UpIHsKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSBmZWF0dXJlSXRlcmF0b3IuZmVhdHVyZSgpOwotCQkJCQlmZWF0dXJlVmFsdWVQYWlyVG9PYmplY3RNYXAucHV0KAotCQkJCQkJCW5ldyBGZWF0dXJlVmFsdWVQYWlyKGYsIHJlZiksIGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZlYXR1cmVWYWx1ZVBhaXJUb09iamVjdE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlGZWF0dXJlVmFsdWVQYWlyIGZ2UGFpciA9IChGZWF0dXJlVmFsdWVQYWlyKSBlbnRyeS5nZXRLZXkoKTsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJaWYgKGZ2UGFpci5mZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJKChDb2xsZWN0aW9uKSBlbGVtZW50LmVHZXQoZnZQYWlyLmZlYXR1cmUpKQotCQkJCQkJLnJlbW92ZShmdlBhaXIudmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQllbGVtZW50LmVTZXQoZnZQYWlyLmZlYXR1cmUsIG51bGwpOwotCQkJfQotCQkJaWYgKGVsZW1lbnQuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChlbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlVmFsdWVQYWlyVG9PYmplY3RNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJRmVhdHVyZVZhbHVlUGFpciBmdlBhaXIgPSAoRmVhdHVyZVZhbHVlUGFpcikgZW50cnkuZ2V0S2V5KCk7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWlmIChmdlBhaXIuZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCSgoQ29sbGVjdGlvbikgZWxlbWVudC5lR2V0KGZ2UGFpci5mZWF0dXJlKSkuYWRkKGZ2UGFpci52YWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWVsZW1lbnQuZVNldChmdlBhaXIuZmVhdHVyZSwgZnZQYWlyLnZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEZlYXR1cmVWYWx1ZVBhaXIgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCQlPYmplY3QgdmFsdWU7Ci0KLQkJRmVhdHVyZVZhbHVlUGFpcihFU3RydWN0dXJhbEZlYXR1cmUgZiwgT2JqZWN0IHYpIHsKLQkJCWZlYXR1cmUgPSBmOwotCQkJdmFsdWUgPSB2OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNGRhM2VlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1Jlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotCi0vKioKLSAqIEEgY29tcG91bmQgY29tbWFuZCB0aGF0IGlzIHJlc291cmNlIGF3YXJlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZCBleHRlbmRzIENvbXBvdW5kQ29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobGFiZWwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoU3RyaW5nIGxhYmVsLCBMaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKGxhYmVsLCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sCi0JCQlMaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbiwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKGludCByZXN1bHRJbmRleCkgewotCQlzdXBlcihyZXN1bHRJbmRleCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogQHBhcmFtIGxhYmVsCi0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoaW50IHJlc3VsdEluZGV4LCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgsIGxhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChpbnQgcmVzdWx0SW5kZXgsIFN0cmluZyBsYWJlbCwKLQkJCVN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihyZXN1bHRJbmRleCwgbGFiZWwsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChpbnQgcmVzdWx0SW5kZXgsIExpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgsIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChpbnQgcmVzdWx0SW5kZXgsIFN0cmluZyBsYWJlbCwKLQkJCUxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgsIGxhYmVsLCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoaW50IHJlc3VsdEluZGV4LCBTdHJpbmcgbGFiZWwsCi0JCQlTdHJpbmcgZGVzY3JpcHRpb24sIExpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgsIGxhYmVsLCBkZXNjcmlwdGlvbiwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29tbWFuZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY21kID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY21kIGluc3RhbmNlb2YgSVJlc291cmNlQXdhcmVDb21tYW5kKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkQWxsKCgoSVJlc291cmNlQXdhcmVDb21tYW5kKSBjbWQpCi0JCQkJCQkuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1Jlc291cmNlQXdhcmVQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIzOWQzMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5QYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VBd2FyZVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQgZXh0ZW5kcwotCQlQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kIGltcGxlbWVudHMgSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCS8qKgotCSAqIEBwYXJhbSBkb21haW4KLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBvcHRpbWl6ZQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwgaW50IGluZGV4LCBib29sZWFuIG9wdGltaXplKSB7Ci0JCXN1cGVyKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBvcHRpbWl6ZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGluZGV4Ci0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLCBpbnQgaW5kZXgpIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgaW5kZXgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJaWYob3duZXIgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9ICgoRU9iamVjdClvd25lcikuZVJlc291cmNlKCk7Ci0JCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21tYW5kLmdldENvbW1hbmRMaXN0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY21kID0gaXRlci5uZXh0KCk7Ci0JCQl3aGlsZSghKGNtZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgJiYgY21kIGluc3RhbmNlb2YgQ29tbWFuZFdyYXBwZXIpIHsKLQkJCQljbWQgPSAoKENvbW1hbmRXcmFwcGVyKWNtZCkuZ2V0Q29tbWFuZCgpOwotCQkJfQotCQkJaWYgKGNtZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbCgoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgY21kKQotCQkJCQkJLmdldE1vZGlmaWVkUmVzb3VyY2VzKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1NhdmVTdGF0dXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1NhdmVTdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzdmNTA5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9TYXZlU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi0vKioKLSAqIFRoZSBzdGF0dXMgb2YgYSBzYXZlIG9wZXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNhdmVTdGF0dXMgZXh0ZW5kcyBTdGF0dXMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0FWRV9FUlJPUiA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST0xMQkFDS19FUlJPUiA9IDI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqIEBwYXJhbSBwbHVnaW5JZAotCSAqIEBwYXJhbSBjb2RlCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICovCi0JcHVibGljIFNhdmVTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgcGx1Z2luSWQsIGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSwKLQkJCVRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJc3VwZXIoc2V2ZXJpdHksIHBsdWdpbklkLCBjb2RlLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvU2V0T3Bwb3NpdGVGZWF0dXJlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvU2V0T3Bwb3NpdGVGZWF0dXJlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNjRjNjhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1NldE9wcG9zaXRlRmVhdHVyZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBzZXQgYW4gb3Bwb3NpdGUgZmVhdHVyZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNldE9wcG9zaXRlRmVhdHVyZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0KLQlwcml2YXRlIE9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmU7Ci0KLQlwcml2YXRlIEVPYmplY3QgdmFsdWU7Ci0KLQlwcml2YXRlIEVPYmplY3Qgb2xkVmFsdWU7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZXRPcHBvc2l0ZUZlYXR1cmVDb21tYW5kKE1ldGhvZEVsZW1lbnQgZSwKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUsIEVPYmplY3QgdmFsdWUpIHsKLQkJdGhpcy5lbGVtZW50ID0gZTsKLQkJdGhpcy5vcHBvc2l0ZUZlYXR1cmUgPSBvcHBvc2l0ZUZlYXR1cmU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuIFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeU9wcG9zaXRlKAotCQkJCQkoTWV0aG9kRWxlbWVudCkgdmFsdWUsIG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCksCi0JCQkJCWVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZFZhbHVlID0gKEVPYmplY3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGVsZW1lbnQpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKG9wcG9zaXRlRmVhdHVyZSk7Ci0JCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQotCQlyZWRvKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYgKG9sZFZhbHVlICE9IG51bGwgJiYgdmFsdWUgPT0gbnVsbCkgewotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCkuaXNNYW55KCkpIHsKLQkJCQkoKENvbGxlY3Rpb24pIG9sZFZhbHVlLmVHZXQob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSkpCi0JCQkJCQkucmVtb3ZlKGVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQlvbGRWYWx1ZS5lU2V0KG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCksIG51bGwpOwotCQkJfQotCQkJaWYgKG9sZFZhbHVlLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQob2xkVmFsdWUuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpLmlzTWFueSgpKSB7Ci0JCQkJKChDb2xsZWN0aW9uKSB2YWx1ZS5lR2V0KG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCkpKQotCQkJCQkJLmFkZChlbGVtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmFsdWUuZVNldChvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpLCBlbGVtZW50KTsKLQkJCX0KLQkJCWlmICh2YWx1ZS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHZhbHVlLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCkuaXNNYW55KCkpIHsKLQkJCQkoKENvbGxlY3Rpb24pIHZhbHVlLmVHZXQob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSkpCi0JCQkJCQkucmVtb3ZlKGVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQl2YWx1ZS5lU2V0KG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCksIG51bGwpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKLQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpLmlzTWFueSgpKSB7Ci0JCQkJKChDb2xsZWN0aW9uKSBvbGRWYWx1ZS5lR2V0KG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCkpKQotCQkJCQkJLmFkZChlbGVtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJb2xkVmFsdWUuZVNldChvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpLCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvVXNlcklucHV0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Vc2VySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmRmMTEzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Vc2VySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci0KLS8qKgotICogQ2xhc3MgdGhhdCBrZWVwcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGlucHV0IHJlcXVlc3QgYW5kIHJlZmVyZW5jZSB0byB0aGUKLSAqIGlucHV0IHVzZXIgc3BlY2lmaWVkIG9yIHNlbGVjdGVkCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VySW5wdXQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFWFQgPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUSU9OID0gMTsKLQotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCi0JcHJpdmF0ZSBpbnQgdHlwZTsKLQotCXByaXZhdGUgYm9vbGVhbiBtdWx0aXBsZTsKLQotCXByaXZhdGUgTGlzdCBjaG9pY2VzOwotCi0JcHJpdmF0ZSBPYmplY3QgaW5wdXQ7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0KLQlwcml2YXRlIE9iamVjdCBjb250ZXh0OwotCi0JcHJpdmF0ZSBJVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotCXB1YmxpYyBVc2VySW5wdXQoU3RyaW5nIGxhYmVsLCBpbnQgdHlwZSwgYm9vbGVhbiBtdWx0aXBsZSwgTGlzdCBjaG9pY2VzLAotCQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwgT2JqZWN0IGNvbnRleHQpIHsKLQkJdGhpcyhsYWJlbCwgdHlwZSwgbXVsdGlwbGUsIGNob2ljZXMsIGxhYmVsUHJvdmlkZXIsIG51bGwsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIG11bHRpcGxlCi0JICogQHBhcmFtIGNob2ljZXMKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlcgotCSAqICAgICAgICAgICAgdGhlIGxhYmVsIHByb3ZpZGVyIHRvIHJlcHJlc2VudCB0aGUgZWxlbWVudCBpbiB0aGUKLQkgKiAgICAgICAgICAgIDxjb2RlPmNob2ljZXM8L2NvZGU+IGxpc3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgICAgICAgICAgIDxjb2RlPmNob2ljZXM8L2NvZGU+IGxpc3QgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gdmFsaWRhdG9yCi0JICogICAgICAgICAgICB0aGUgdmFsaWRhdG9yIHRvIHZhbGlkYXRlIHRoZSBpbnB1dAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICB0aGUgY29udGV4dCBvZiB0aGUgdXNlciBpbnB1dCB0aGF0IGlzIGNvbW1hbmQtc3BlY2lmaWMgYW5kIGNhbgotCSAqICAgICAgICAgICAgY29udGFpbiBhZGRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlciBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgVXNlcklucHV0KFN0cmluZyBsYWJlbCwgaW50IHR5cGUsIGJvb2xlYW4gbXVsdGlwbGUsIExpc3QgY2hvaWNlcywKLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsIElWYWxpZGF0b3IgdmFsaWRhdG9yLCBPYmplY3QgY29udGV4dCkgewotCQlzdXBlcigpOwotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMubXVsdGlwbGUgPSBtdWx0aXBsZTsKLQkJdGhpcy5jaG9pY2VzID0gY2hvaWNlczsKLQkJdGhpcy5sYWJlbFByb3ZpZGVyID0gbGFiZWxQcm92aWRlcjsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbnB1dCgpIHsKLQkJcmV0dXJuIGlucHV0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBpbnB1dCkgewotCQl0aGlzLmlucHV0ID0gaW5wdXQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Q2hvaWNlcygpIHsKLQkJcmV0dXJuIGNob2ljZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTXVsdGlwbGUoKSB7Ci0JCXJldHVybiBtdWx0aXBsZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxhYmVsIHByb3ZpZGVyCi0JICogCi0JICogQHJldHVybiB0aGUgbGFiZWwgcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIGxhYmVsUHJvdmlkZXI7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHZhbGlkYXRvcgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbGlkYXRvcgotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb250ZXh0IG9mIHRoaXMgdXNlciBpbnB1dAotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbnRleHQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjVkN2NlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBjb21tYW5kcyBmb3IgZWRpdGluZyBtZXRob2QgbGlicmFyeSBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODNiMmI5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhbiBhY3Rpdml0eSBpbiB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIFByb2Nlc3MgcHJvY2VzczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJaWYgKHByb2Nlc3MgPT0gbnVsbCkgewotCQkJT2JqZWN0IHRvcCA9IGdldFRvcEl0ZW0oKTsKLQkJCWlmICh0b3AgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJcHJvY2VzcyA9IChQcm9jZXNzKSB0b3A7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCXJldHVybiBjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJJiYgIVRuZ1V0aWwuaXNDb250cmlidXRvck9yUmVwbGFjZXIoKFZhcmlhYmlsaXR5RWxlbWVudCkgY2hpbGQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCi0JCS8vIHJlbW92ZSBhbnkgc3VwcHJlc3NlZCBjaGlsZAotCQkvLwotCQlQcm9jZXNzIHByb2MgPSBnZXRQcm9jZXNzKCk7Ci0JCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCS8vIGdldFByb2Nlc3MoKSBtaWdodCByZXR1cm4gbnVsbCBpZiBnZXRDaGlsZHJlbihPYmplY3QpIGlzIGNhbGxlZAotCQkJLy8gb24gYmFzZSBhY3Rpdml0eSB0bwotCQkJLy8gcmV0cmlldmUgaXRzIGNoaWxkcmVuCi0JCQkvLwotCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChzdXBwcmVzc2lvbi5pc1N1cHByZXNzZWQoY2hpbGQpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSA9PSBVbWFQYWNrYWdlLkFDVElWSVRZX19TVVBQUkVTU0VEKSB7Ci0JCQkvLyByZWZyZXNoIHBhcmVudCBjb250ZW50Ci0JCQkvLwotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCWdldFBhcmVudChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiOTdmZDY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0NhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgYmFzZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgY2xhc3MgZm9yIHRoZSBzdGFuZGFyZCBjYXRlZ29yaWVzIGluCi0gKiBhIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsCi0JCUlDb25maWd1cmFibGUsIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBMaXN0IGNoaWxkcmVuOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gY2F0ZWdvcnlQa2dQYXRoOwotCi0JcHJvdGVjdGVkIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBPYmplY3QgaW1hZ2U7Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciB1bmNhdGVnb3JpemVkRmlsdGVyOwotCi0JcHJvdGVjdGVkIFN0cmluZyB1bmNhdGVnb3JpemVkTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBjYXRlZ29yaXplZEZpbHRlcjsKLQotCXByb3RlY3RlZCBPYmplY3QgdW5jYXRlZ29yaXplZEltYWdlOwotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnOwotCi0JcHJpdmF0ZSBVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyIHVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIFN0cmluZyBuYW1lLCBPYmplY3QgaW1hZ2UsCi0JCQlTdHJpbmdbXSBjYXRlZ29yeVBrZ1BhdGgpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQkvLyBtZXRob2RDb25maWcuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQl0aGlzLm1ldGhvZENvbmZpZyA9IG1ldGhvZENvbmZpZzsKLQkJbGFiZWwgPSBuYW1lOwotCQl0aGlzLmNhdGVnb3J5UGtnUGF0aCA9IGNhdGVnb3J5UGtnUGF0aDsKLQkJdGhpcy5pbWFnZSA9IGltYWdlOwotCX0KLQotCXByb3RlY3RlZCBVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyIGNyZWF0ZVVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIoKSB7Ci0JCWlmICh1bmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIgPSBuZXcgVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcigKLQkJCQkJYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywgdW5jYXRlZ29yaXplZEZpbHRlciwKLQkJCQkJdW5jYXRlZ29yaXplZExhYmVsLCB1bmNhdGVnb3JpemVkSW1hZ2UpOwotCQl9Ci0JCXJldHVybiB1bmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQl9IGVsc2UgewotCQkJY2hpbGRyZW4uY2xlYXIoKTsKLQkJfQotCQkvLyBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSB0YXJnZXQ7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1ldGhvZENvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJY2F0ZWdvcnlQa2dQYXRoKTsKLQkJCWlmIChwa2cgIT0gbnVsbCAvKgotCQkJCQkJCSAqICYmCi0JCQkJCQkJICogbWV0aG9kQ29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jb250YWlucyhwa2cpCi0JCQkJCQkJICovKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJQ29udGVudENhdGVnb3J5IGVsZW1lbnQgPSAoQ29udGVudENhdGVnb3J5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChjYXRlZ29yaXplZEZpbHRlci5hY2NlcHQoZWxlbWVudCkKLQkJCQkJCQkmJiAoZmlsdGVyICE9IG51bGwgPyBmaWx0ZXIuYWNjZXB0KGVsZW1lbnQpIDogdHJ1ZSkpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHNldCBwYXJlbnQKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IChUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRSkKLQkJCQkJLmdldENvbmZpZ3VyYXRpb25WaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdCgKLQkJCQkJCQlpdGVyLm5leHQoKSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCS8vIE9iamVjdCBhZGFwdGVyID0KLQkJCS8vIChUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRSkuZ2V0SXRlbXNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKS5hZGFwdChpdGVyLm5leHQoKSwKLQkJCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgYWRhcHRlcikuc2V0UGFyZW50KHRoaXMpOwotCQkJfQotCQkJLy8gVGhpcyBpcyBuZWVkIGZvcmNpbmcgdG8gc2V0IHRoZSBJQ29uZmlndXJhdG9yIHRvIENoaWxkcmVucwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhYmxlKSB7Ci0JCQkJKChJQ29uZmlndXJhYmxlKSBhZGFwdGVyKS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCX0KLQkJfQotCi0JCWlmICh1bmNhdGVnb3JpemVkRmlsdGVyICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuLmFkZChjcmVhdGVVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKCkpOwotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCS8vIHJldHVybiBzdXBlci5nZXROZXdDaGlsZERlc2NyaXB0b3JzKHRhcmdldCwgZWRpdGluZ0RvbWFpbiwgc2libGluZyk7Ci0JCXJldHVybiBzdXBlci5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG1ldGhvZENvbmZpZywgZWRpdGluZ0RvbWFpbiwKLQkJCQlzaWJsaW5nKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gcGFyZW50OwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCXJldHVybiBsYWJlbDsKLQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhdGVnb3JpemVkRmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCWNhdGVnb3JpemVkRmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVuY2F0ZWdvcml6ZWRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdW5jYXRlZ29yaXplZEZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVbmNhdGVnb3JpemVkTGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXVuY2F0ZWdvcml6ZWRMYWJlbCA9IGxhYmVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVuY2F0ZWdvcml6ZWRJbWFnZShPYmplY3QgaW1nKSB7Ci0JCXVuY2F0ZWdvcml6ZWRJbWFnZSA9IGltZzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAodW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQl1bmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0NhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiN2E2ZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJDYXBhYmlsaXR5IFBhdHRlcm5zIiBhbmQgIkRlbGl2ZXJ5Ci0gKiBQcm9jZXNzZXMiIGZvbGRlcnMgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsCi0JCUlDb25maWd1cmFibGUsIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCUxpc3QgY2hpbGRyZW47Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCXByaXZhdGUgU3RyaW5nW10gcGtnUGF0aDsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIE9iamVjdCBpbWFnZTsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWc7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBTdHJpbmcgbmFtZSwgT2JqZWN0IGltYWdlLAotCQkJU3RyaW5nW10gcGtnUGF0aCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMubWV0aG9kQ29uZmlnID0gbWV0aG9kQ29uZmlnOwotCQlsYWJlbCA9IG5hbWU7Ci0JCXRoaXMucGtnUGF0aCA9IHBrZ1BhdGg7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfSBlbHNlIHsKLQkJCWNoaWxkcmVuLmNsZWFyKCk7Ci0JCX0KLQkJQXJyYXlMaXN0IHByb2NQa2dzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlNZXRob2RQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLCBwa2dQYXRoKTsKLQkJCWlmIChwa2cgIT0gbnVsbAotCQkJCQkmJiBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKHBrZykpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCVByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmNvbGxlY3RDaGlsZHJlbihjaGlsZHJlbiwKLQkJCQkJCQllbGVtZW50LCBmaWx0ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghcHJvY1BrZ3MuaXNFbXB0eSgpKSB7Ci0JCQljaGlsZHJlbi5hZGRBbGwoMCwgcHJvY1BrZ3MpOwotCi0JCQkvLyBUT0RPOiBzb3J0IGFscGhhYmV0aWNhbGx5LCBwcm9jZXNzIHBhY2thZ2VzIGJlZm9yZSBwcm9jZXNzZXMKLQkJfQotCi0JCS8vIHNldCBwYXJlbnQKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCVByb2Nlc3NVdGlsLnNldFBhcmVudChjaGlsZCwgb2JqZWN0LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMobWV0aG9kQ29uZmlnLCBlZGl0aW5nRG9tYWluLAotCQkJCXNpYmxpbmcpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChsYWJlbCAhPSBudWxsKQotCQkJcmV0dXJuIGxhYmVsOwotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0N1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0N1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTk2YWYyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9DdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkN1c3RvbSBDYXRlZ29yaWVzIiBmb2xkZXIgaW4gdGhlCi0gKiBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIHsKLQotCXB1YmxpYyBDdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIFN0cmluZyBuYW1lLCBPYmplY3QgaW1hZ2UsCi0JCQlTdHJpbmdbXSBjYXRlZ29yeVBrZ1BhdGgpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywgbmFtZSwgaW1hZ2UsIGNhdGVnb3J5UGtnUGF0aCk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0gZWxzZSB7Ci0JCQljaGlsZHJlbi5jbGVhcigpOwotCQl9Ci0JCS8vIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIHRhcmdldDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbWV0aG9kQ29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQljYXRlZ29yeVBrZ1BhdGgpOwotCQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdCA9IFRuZ1V0aWwuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KHBsdWdpbik7Ci0JCQlpZiAocm9vdCAhPSBudWxsICYmIHBrZyAhPSBudWxsCi0JCQkJCSYmIG1ldGhvZENvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuY29udGFpbnMocGtnKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByb290LmdldENhdGVnb3JpemVkRWxlbWVudHMoKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChmaWx0ZXIgIT0gbnVsbCA/IGZpbHRlci5hY2NlcHQoZWxlbWVudCkgOiB0cnVlKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBzZXQgcGFyZW50Ci0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSAoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UpCi0JCQkJCS5nZXRDb25maWd1cmF0aW9uVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoCi0JCQkJCQkJaXRlci5uZXh0KCksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgYWRhcHRlcikuc2V0UGFyZW50KHRoaXMpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTE5N2QyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZGlzY2lwbGluZSBncm91cGluZyBpbiB0aGUgQ29uZmlndXJhdGlvbgotICogdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUNvbmZpZ3VyYWJsZSB7Ci0KLQlwcml2YXRlIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5EaXNjaXBsaW5lQ2F0ZWdvcnlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW47Ci0KLQkJLy8gVE9ETzogY29tbWVudGVkIG91dCB1bnRpbCBKaW5odWEgZml4ZWQgYnVncyBpbiBDb25maWd1cmF0aW9uRmlsdGVyCi0JCWlmIChjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBjb25maWd1cmF0b3IuZ2V0Q2hpbGRyZW4ob2JqZWN0LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCkpOwotCQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKCk6IHJldHVybmVkIGZyb20gY29uZmlndXJhdG9yOiAiICsgY2hpbGRyZW4pOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGNoaWxkcmVuOwotCQkJfQotCQl9Ci0KLQkJY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlEaXNjaXBsaW5lR3JvdXBpbmcgZ3JvdXBpbmcgPSAoRGlzY2lwbGluZUdyb3VwaW5nKSBvYmplY3Q7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZiA9IChNZXRob2RDb25maWd1cmF0aW9uKSAoKENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIGdldFBhcmVudChvYmplY3QpKQotCQkJCS5nZXRUYXJnZXQoKTsKLQkJVG5nVXRpbC5hZGRFeHRlbmRlZENoaWxkcmVuKGdyb3VwaW5nLCBtZXRob2RDb25mLCBjaGlsZHJlbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0KLQkJLy8gc2V0IHBhcmVudAotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFKQotCQkJCQkuZ2V0Q29uZmlndXJhdGlvblZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KAotCQkJCQkJCWl0ZXIubmV4dCgpLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudCh0aGlzKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yKSB7Ci0JCQljb25maWd1cmF0b3IgPSAoSUNvbmZpZ3VyYXRvcikgZmlsdGVyOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9EaXNjaXBsaW5lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9EaXNjaXBsaW5lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM5ZjA5OGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGRpc2NpcGxpbmUgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRGlzY2lwbGluZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRpc2NpcGxpbmVJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9UYXNrcygpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXREaXNjaXBsaW5lX1N1YmRpc2NpcGxpbmUoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vRG9tYWluSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ2ZjI2YmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vRG9tYWluSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZG9tYWluIGluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERvbWFpbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRG9tYWluSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERvbWFpbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW5fU3ViZG9tYWlucygpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MjNlZDBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0d1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LklFbGVtZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgZ3VpZGFuY2UgZm9sZGVycy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwKLQkJSUVsZW1lbnRJdGVtUHJvdmlkZXIsIElHcm91cENvbnRhaW5lciwgSUNvbmZpZ3VyYWJsZSB7Ci0KLQlwcml2YXRlIE1hcCBncm91cEl0ZW1Qcm92aWRlck1hcDsKLQotCXByb3RlY3RlZCBBcnJheUxpc3QgY2hpbGRyZW47Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIEEgbWFwIG9mIEVDbGFzcyAvIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZm9yIGVhY2ggdHlwZSBvZiBndWlkYW5jZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgY2hlY2tMaXN0RmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgQ2hlY2tsaXN0OwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgY29uY2VwdEZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuICgob2JqIGluc3RhbmNlb2YgQ29uY2VwdCkgJiYgKCEob2JqIGluc3RhbmNlb2YgV2hpdGVwYXBlcikpKTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIGV4YW1wbGVGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBFeGFtcGxlOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgcHJhY3RpY2VGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBQcmFjdGljZTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHJlcG9ydEZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFJlcG9ydDsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHJldXNhYmxlQXNzZXRGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0OwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgcm9hZG1hcEZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFJvYWRtYXA7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciBzdXBwb3J0aW5nTWF0ZXJpYWxGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWw7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciBndWlkZWxpbmVGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBHdWlkZWxpbmU7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciB0ZW1wbGF0ZUZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFRlbXBsYXRlOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgdGVybURlZmluaXRpb25GaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbjsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHRvb2xNZW50b3JGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgd2hpdGVQYXBlckZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFdoaXRlcGFwZXI7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5tZXRob2RDb25maWcgPSBtZXRob2RDb25maWc7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQkJLy8gY2hlY2tsaXN0Ci0JCQlPYmplY3QgaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvQ2hlY2tsaXN0cyIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfQ2hlY2tsaXN0cyIpOyAvLyROT04tTkxTLTEkCi0JCQlHdWlkYW5jZUl0ZW1Qcm92aWRlciBjaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcigKLQkJCQkJYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywgbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIoY2hlY2tMaXN0RmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBjb25jZXB0Ci0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9Db25jZXB0cyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19Db25jZXB0cyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcihjb25jZXB0RmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBlc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKGVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gZXhhbXBsZQotCQkJaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvRXhhbXBsZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfRXhhbXBsZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIoZXhhbXBsZUZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gcHJhY3RpY2UKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L1ByYWN0aWNlcyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19QcmFjdGljZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIocHJhY3RpY2VGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIFJlcG9ydAotCQkJaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUmVwb3J0cyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19SZXBvcnRzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKHJlcG9ydEZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gUmV1c2FibGUgQXNzZXQKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L1JldXNhYmxlQXNzZXRzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKHJldXNhYmxlQXNzZXRGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIFJldXNhYmxlIEFzc2V0Ci0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9Sb2FkbWFwcyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19Sb2FkbWFwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKHJvYWRtYXBGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIFN1cHBvcnRpbmcgTWF0ZXJpYWwKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfU3VwcG9ydGluZ01hdGVyaWFscyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcihzdXBwb3J0aW5nTWF0ZXJpYWxGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIC8vIFRlY2huaXF1ZQotCQkJLy8gaW1hZ2UgPQotCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVGVjaG5pcXVlcyIpOwotCQkJLy8gbmFtZSA9Ci0JCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfVGVjaG5pcXVlcyIpOwotCQkJLy8gY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCS8vIG5hbWUsIGltYWdlKTsKLQkJCS8vIGNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKHRlY2huaXF1ZUZpbHRlcik7Ci0JCQkvLyBjaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gVGVtcGxhdGUKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L1RlbXBsYXRlcyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19UZW1wbGF0ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIodGVtcGxhdGVGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIFRlcm0gRGVmaW5pdGlvbgotCQkJaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvVGVybURlZmluaXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1Rlcm1EZWZpbml0aW9ucyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcih0ZXJtRGVmaW5pdGlvbkZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gVG9vbCBNZW50b3IKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L1Rvb2xNZW50b3JzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1Rvb2xNZW50b3JzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKHRvb2xNZW50b3JGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIFdoaXRlcGFwZXIKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L1doaXRlcGFwZXJzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1doaXRlcGFwZXJzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKHdoaXRlUGFwZXJGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIEd1aWRlbGluZXMKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L1dvcmtQcm9kdWN0R3VpZGVsaW5lcyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19Xb3JrUHJvZHVjdEd1aWRlbGluZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIoZ3VpZGVsaW5lRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQl9Ci0JCQotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCS8vIFNob3VsZCBmaWx0ZXIgb25seSBjb3B5IG9ubHksIG5vdCBvcmdpbmFsIGNhY2hlZCBjaGlsZHJlbiBsaXN0LgotCQkJTGlzdCBjb3B5ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY29weS5hZGRBbGwoY2hpbGRyZW4pOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvcHkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUd1aWRhbmNlSXRlbVByb3ZpZGVyIG9iaiA9IChHdWlkYW5jZUl0ZW1Qcm92aWRlcikgaXRlcmF0b3IKLQkJCQkJCS5uZXh0KCk7Ci0JCQkJb2JqLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJCWlmIChvYmouZ2V0Q2hpbGRyZW4ob2JqKS5pc0VtcHR5KCkpIHsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNvcHk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCQkKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0d1aWRhbmNlRm9sZGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lciNnZXRHcm91cEl0ZW1Qcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0R3JvdXBJdGVtUHJvdmlkZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdyb3VwSXRlbVByb3ZpZGVyTWFwLmdldChuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBtZXRob2RDb25maWc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0d1aWRhbmNlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9HdWlkYW5jZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOGM5OGY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0d1aWRhbmNlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBndWlkYW5jZSBzcGVjaWZpYyBmb2xkZXIuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLAotCQlJQ29uZmlndXJhYmxlLCBJTGlicmFyeUl0ZW1Qcm92aWRlciB7Ci0JTGlzdCBjaGlsZHJlbjsKLQotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCXByaXZhdGUgT2JqZWN0IGltYWdlOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGd1aWRhbmNlRmlsdGVyOwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZzsKLQotCXB1YmxpYyBjbGFzcyBDb21wYXJlQnlOYW1lIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvYmoxLCBPYmplY3Qgb2JqMikgewotCQkJU3RyaW5nIG5hbWUxID0gKChNZXRob2RFbGVtZW50KSBvYmoxKS5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgbmFtZTIgPSAoKE1ldGhvZEVsZW1lbnQpIG9iajIpLmdldE5hbWUoKTsKLQkJCXJldHVybiBuYW1lMS5jb21wYXJlVG9JZ25vcmVDYXNlKG5hbWUyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEd1aWRhbmNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIFN0cmluZyBuYW1lLCBPYmplY3QgaW1hZ2UpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQkvLyBtZXRob2RDb25maWcuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQlsYWJlbCA9IG5hbWU7Ci0JCXRoaXMubWV0aG9kQ29uZmlnID0gbWV0aG9kQ29uZmlnOwotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSB0YXJnZXQ7Ci0KLQkJQXJyYXlMaXN0IGZpbHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChndWlkYW5jZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlmaWx0ZXJMaXN0LmFkZChndWlkYW5jZUZpbHRlcik7Ci0JCX0KLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQlmaWx0ZXJMaXN0LmFkZChmaWx0ZXIpOwotCQl9Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QoCi0JCQkJbWV0aG9kQ29uZmlnLCBmaWx0ZXJMaXN0KTsKLQkJTGlzdCBlbGVtZW50cyA9IGVsZW1lbnRMaXN0LmdldExpc3QoKTsKLQotCQkvLyBzb3J0IGJ5IG5hbWUKLQkJQ29sbGVjdGlvbnMuc29ydChlbGVtZW50cywgbmV3IENvbXBhcmVCeU5hbWUoKSk7Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQlyZXR1cm4gc3VwZXIuZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhtZXRob2RDb25maWcsIGVkaXRpbmdEb21haW4sCi0JCQkJc2libGluZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJcmV0dXJuIHBhcmVudDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGxhYmVsICE9IG51bGwpCi0JCQlyZXR1cm4gbGFiZWw7Ci0JCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRHdWlkYW5jZUZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQlndWlkYW5jZUZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NDVhZWI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmJyZWFrZG93bmVsZW1lbnQuTWlsZXN0b25lSXRlbVByb3ZpZGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uQWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRBZGFwdGVyKCkgewotCQlpZiAocHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyID0gbmV3IFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuTWV0aG9kcGx1Z2luSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlTWV0aG9kUGx1Z2luQWRhcHRlcigpCi0JICovCi0JLyoKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RQbHVnaW5BZGFwdGVyKCkgewotCQlNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgYWRhcHRlciA9IG5ldyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCWFkYXB0ZXIuc2V0TW9kZWxTdHJ1Y3R1cmUoTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVCk7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQkqLwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuTWV0aG9kcGx1Z2luSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJvY2Vzc1BhY2thZ2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVBoYXNlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGhhc2VBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZURpc2NpcGxpbmVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNjaXBsaW5lQWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IERpc2NpcGxpbmVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURvbWFpbkFkYXB0ZXIoKSB7Ci0JCWlmIChkb21haW5JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZG9tYWluSXRlbVByb3ZpZGVyID0gbmV3IERvbWFpbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkb21haW5JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUm9sZVNldEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTZXRBZGFwdGVyKCkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgUm9sZVNldEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTWlsZXN0b25lSXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL01ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY4OTM0ZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBLZWVwcyB0cmFjayBvZiBhIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzIGluIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCB7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnOwotCi0JcHJpdmF0ZSBMaXN0IGZpbHRlckxpc3Q7Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRWxlbWVudEl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgewotCi0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTIyOTE0Mzg5NzAxMjM5ODU5MDZMOwotCi0JCXByb3RlY3RlZCBFbGVtZW50SXRlcmF0b3IoQ29udGVudFBhY2thZ2UgY29udGVudFBrZykgewotCQkJc3VwZXIoY29udGVudFBrZywgZmFsc2UpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbkxpc3QoT2JqZWN0IG9iamVjdCkgewotCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlDb250ZW50UGFja2FnZSBwa2cgPSAoQ29udGVudFBhY2thZ2UpIG9iamVjdDsKLQkJCQlMaXN0IHBhY2thZ2VzID0gcGtnLmdldENoaWxkUGFja2FnZXMoKTsKLQkJCQlpbnQgc2l6ZSA9IHBhY2thZ2VzLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlPYmplY3Qgb2JqID0gcGFja2FnZXMuZ2V0KGkpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UKLQkJCQkJCQkmJiBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKG9iaikpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChvYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKGNoZWNrQWNjZXB0YW5jZSgpKSB7Ci0JCQkJCUxpc3QgZWxlbWVudHMgPSBwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCk7Ci0JCQkJCXNpemUgPSBlbGVtZW50cy5zaXplKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gZWxlbWVudHMuZ2V0KGkpOwotCQkJCQkJaWYgKGFjY2VwdChvYmopKSB7Ci0JCQkJCQkJY2hpbGRyZW4uYWRkKG9iaik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNoaWxkcmVuLmFkZEFsbChwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5MaXN0KG9iamVjdCkuaXRlcmF0b3IoKTsKLQkJfQotCQkKLQl9OwotCQotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsCi0JCQlMaXN0IGZpbHRlckxpc3QpIHsKLQkJdGhpcy5tZXRob2RDb25maWcgPSBtZXRob2RDb25maWc7Ci0JCXRoaXMuZmlsdGVyTGlzdCA9IGZpbHRlckxpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tBY2NlcHRhbmNlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmplY3QpIHsKLQkJaW50IHNpemUgPSBmaWx0ZXJMaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlGaWx0ZXIgZmlsdGVyID0gKElGaWx0ZXIpIGZpbHRlckxpc3QuZ2V0KGkpOwotCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KG9iamVjdCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmF0b3IgbmV3SXRlcmF0b3IoQ29udGVudFBhY2thZ2UgcGtnKSB7Ci0JCXJldHVybiBuZXcgRWxlbWVudEl0ZXJhdG9yKHBrZyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldEFsbEVsZW1lbnRzKENvbnRlbnRQYWNrYWdlIHBrZywgTGlzdCBsaXN0KSB7Ci0JCWZvcihJdGVyYXRvciBpdGVyID0gbmV3SXRlcmF0b3IocGtnKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYoIShlIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKSB7Ci0JCQkJbGlzdC5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRMaXN0KCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1ldGhvZENvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJZ2V0QWxsRWxlbWVudHMocGtnLCBsaXN0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBsaXN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOWY4ZTQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Sb2xlU2V0c0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiB0aGUgQ29uZmlndXJhdGlvbgotICogdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUdyb3VwQ29udGFpbmVyLCBJQ29uZmlndXJhYmxlLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBNYXAgZ3JvdXBJdGVtUHJvdmlkZXJNYXA7Ci0KLQkvLyBjaGFuZ2VkIHRvIHByb3RlY3RlZCwgZXh0ZW5kZWQgY2xhc3MgY2FuIHBsYXkgd2l0aCBjaGlsZHJlbiB2YXJpYWJsZS4KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGNoaWxkcmVuOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGRpc2NpcGxpbmVzRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBlbGVtZW50ID0gKENvbnRlbnRDYXRlZ29yeSkgb2JqOwotCQkJLy8gQnJvd3Npbmc6IFdpdGggY2F0ZWdvcmllcywgcmVwbGFjZSBnZW5lcmFsaXphdGlvbgotCQkJLy8gY2F1c2VzIGJvdGggcmVwbGFjZW1lbnQgYW5kIGJhc2UgdG8gYmVjb21lIGludmlzaWJsZSB0byBicm93c2luZwotCQkJcmV0dXJuIERpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmFjY2VwdChlbGVtZW50KSAvKgotCQkJCQkJCQkJCQkJCQkJCQkgKiAmJgotCQkJCQkJCQkJCQkJCQkJCQkgKiBlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PQotCQkJCQkJCQkJCQkJCQkJCQkgKiBudWxsCi0JCQkJCQkJCQkJCQkJCQkJCSAqLzsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIGRvbWFpbkZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkvLyBCcm93c2luZzogV2l0aCBjYXRlZ29yaWVzLCByZXBsYWNlIGdlbmVyYWxpemF0aW9uCi0JCQkvLyBjYXVzZXMgYm90aCByZXBsYWNlbWVudCBhbmQgYmFzZSB0byBiZWNvbWUgaW52aXNpYmxlIHRvIGJyb3dzaW5nCi0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgRG9tYWluIC8qCi0JCQkJCQkJCQkJCSAqICYmCi0JCQkJCQkJCQkJCSAqICgoRG9tYWluKW9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09Ci0JCQkJCQkJCQkJCSAqIG51bGwKLQkJCQkJCQkJCQkJICovOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciB3b3JrUHJvZHVjdFR5cGVzRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCS8vIEJyb3dzaW5nOiBXaXRoIGNhdGVnb3JpZXMsIHJlcGxhY2UgZ2VuZXJhbGl6YXRpb24KLQkJCS8vIGNhdXNlcyBib3RoIHJlcGxhY2VtZW50IGFuZCBiYXNlIHRvIGJlY29tZSBpbnZpc2libGUgdG8gYnJvd3NpbmcKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUgLyoKLQkJCQkJCQkJCQkJCQkgKiAmJgotCQkJCQkJCQkJCQkJCSAqICgoV29ya1Byb2R1Y3RUeXBlKW9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09Ci0JCQkJCQkJCQkJCQkJICogbnVsbAotCQkJCQkJCQkJCQkJCSAqLzsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgSUZpbHRlciByb2xlU2V0c0ZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkvLyBCcm93c2luZzogV2l0aCBjYXRlZ29yaWVzLCByZXBsYWNlIGdlbmVyYWxpemF0aW9uCi0JCQkvLyBjYXVzZXMgYm90aCByZXBsYWNlbWVudCBhbmQgYmFzZSB0byBiZWNvbWUgaW52aXNpYmxlIHRvIGJyb3dzaW5nCi0JCQlyZXR1cm4gUm9sZVNldHNJdGVtUHJvdmlkZXIuYWNjZXB0KG9iaikgLyoKLQkJCQkJCQkJCQkJCQkgKiAmJgotCQkJCQkJCQkJCQkJCSAqICgoVmFyaWFiaWxpdHlFbGVtZW50KW9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09Ci0JCQkJCQkJCQkJCQkJICogbnVsbAotCQkJCQkJCQkJCQkJCSAqLzsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHRvb2xzRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCS8vIEJyb3dzaW5nOiBXaXRoIGNhdGVnb3JpZXMsIHJlcGxhY2UgZ2VuZXJhbGl6YXRpb24KLQkJCS8vIGNhdXNlcyBib3RoIHJlcGxhY2VtZW50IGFuZCBiYXNlIHRvIGJlY29tZSBpbnZpc2libGUgdG8gYnJvd3NpbmcKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBUb29sIC8qCi0JCQkJCQkJCQkJICogJiYKLQkJCQkJCQkJCQkgKiAoKFRvb2wpb2JqKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0KLQkJCQkJCQkJCQkgKiBudWxsCi0JCQkJCQkJCQkJICovOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciBjdXN0b21DYXRlZ29yaWVzRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCS8vIEJyb3dzaW5nOiBXaXRoIGNhdGVnb3JpZXMsIHJlcGxhY2UgZ2VuZXJhbGl6YXRpb24KLQkJCS8vIGNhdXNlcyBib3RoIHJlcGxhY2VtZW50IGFuZCBiYXNlIHRvIGJlY29tZSBpbnZpc2libGUgdG8gYnJvd3NpbmcKLQkJCXJldHVybiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkN1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIKLQkJCQkJLmFjY2VwdChvYmopIC8qCi0JCQkJCQkJCQkgKiAmJgotCQkJCQkJCQkJICogKChWYXJpYWJpbGl0eUVsZW1lbnQpb2JqKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0KLQkJCQkJCQkJCSAqIG51bGwKLQkJCQkJCQkJCSAqLzsKLQkJfQotCi0JfTsKLQkKLQkvLyB1cGNhdGVnb3JpemVkIGZpbHRlcnMgY2FuIGJlIHJlc2V0IGJhc2VkIG9uIGNvbmZpZ3VyYXRvci4KLQlwcml2YXRlIElGaWx0ZXIgdW5jYXRlZ29yaXplZFRhc2tGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFRhc2sKLQkJCQkJJiYgQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZXMoKFRhc2spIG9iaikuaXNFbXB0eSgpOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBJRmlsdGVyIGRvbWFpblVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QKLQkJCQkJJiYgIUFzc29jaWF0aW9uSGVscGVyLmdldERvbWFpbnMoKFdvcmtQcm9kdWN0KSBvYmopLmlzRW1wdHkoKTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgSUZpbHRlciB3cFR5cGVVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Ci0JCQkJCSYmIEFzc29jaWF0aW9uSGVscGVyLmdldFdvcmtQcm9kdWN0VHlwZXMoKFdvcmtQcm9kdWN0KSBvYmopCi0JCQkJCQkJLmlzRW1wdHkoKTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgSUZpbHRlciB1bmNhdGVnb3JpemVkUm9sZUZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgUm9sZQotCQkJCQkmJiBBc3NvY2lhdGlvbkhlbHBlci5nZXRSb2xlU2V0cygoUm9sZSkgb2JqKS5pc0VtcHR5KCk7Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIElGaWx0ZXIgdW5jYXRlZ29yaXplZFRvb2xNZW50b3JGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yCi0JCQkJCSYmIEFzc29jaWF0aW9uSGVscGVyLmdldFRvb2woKFRvb2xNZW50b3IpIG9iaikgPT0gbnVsbDsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChncm91cEl0ZW1Qcm92aWRlck1hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBncm91cEl0ZW1Qcm92aWRlck1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGFkYXB0ZXIgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElEaXNwb3NhYmxlKSB7Ci0JCQkJCSgoSURpc3Bvc2FibGUpIGFkYXB0ZXIpLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5jbGVhcigpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBudWxsOwotCQl9Ci0KLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuLmNsZWFyKCk7Ci0JCQljaGlsZHJlbiA9IG51bGw7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyBpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCS8vIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24obmV3Ci0JCS8vIE9iamVjdExpbmtJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgKE5vdGlmaWVyKSBvYmplY3QpKTsKLQkJLy8gfQotCQkvLyBNZXRob2RDb25maWd1cmF0aW9uIGNvbmYgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikKLQkJLy8gKChPYmplY3RMaW5rSXRlbVByb3ZpZGVyKSBvYmplY3QpLmdldExpbmtlZE9iamVjdCgpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmYgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgb2JqZWN0OwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlTdHJpbmcgbmFtZTsKLQkJCU9iamVjdCB1bmNhdGVnb3JpemVkSW1hZ2U7Ci0JCQlDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGNoaWxkOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LAotCQkJCQljb25mLAotCQkJCQluYW1lLAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9UYXNrc19jZnYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQoY29uZik7Ci0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkRmlsdGVyKHVuY2F0ZWdvcml6ZWRUYXNrRmlsdGVyKTsKLQkJCWNoaWxkLnNldENhdGVnb3JpemVkRmlsdGVyKGRpc2NpcGxpbmVzRmlsdGVyKTsKLQkJCWNoaWxkLnNldFVuY2F0ZWdvcml6ZWRMYWJlbChMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCQl1bmNhdGVnb3JpemVkSW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVGFza3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQuc2V0VW5jYXRlZ29yaXplZEltYWdlKHVuY2F0ZWdvcml6ZWRJbWFnZSk7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29uZiwgbmFtZSwKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRG9tYWlucyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQoY29uZik7Ci0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkRmlsdGVyKGRvbWFpblVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlcik7Ci0JCQl1bmNhdGVnb3JpemVkSW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkLnNldFVuY2F0ZWdvcml6ZWRJbWFnZSh1bmNhdGVnb3JpemVkSW1hZ2UpOwotCQkJY2hpbGQuc2V0Q2F0ZWdvcml6ZWRGaWx0ZXIoZG9tYWluRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29uZiwKLQkJCQkJbmFtZSwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RzIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoKTsKLQkJCWNoaWxkLnNldFBhcmVudChjb25mKTsKLQkJCWNoaWxkLnNldFVuY2F0ZWdvcml6ZWRGaWx0ZXIod3BUeXBlVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0RmlsdGVyKTsKLQkJCXVuY2F0ZWdvcml6ZWRJbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQuc2V0VW5jYXRlZ29yaXplZEltYWdlKHVuY2F0ZWdvcml6ZWRJbWFnZSk7Ci0JCQljaGlsZC5zZXRDYXRlZ29yaXplZEZpbHRlcih3b3JrUHJvZHVjdFR5cGVzRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbmYsIG5hbWUsCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1JvbGVzIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQoY29uZik7Ci0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkRmlsdGVyKHVuY2F0ZWdvcml6ZWRSb2xlRmlsdGVyKTsKLQkJCWNoaWxkLnNldENhdGVnb3JpemVkRmlsdGVyKHJvbGVTZXRzRmlsdGVyKTsKLQkJCWNoaWxkLnNldFVuY2F0ZWdvcml6ZWRMYWJlbChMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVW5jYXRlZ29yaXplZF9Sb2xlc190ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCQl1bmNhdGVnb3JpemVkSW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUm9sZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQuc2V0VW5jYXRlZ29yaXplZEltYWdlKHVuY2F0ZWdvcml6ZWRJbWFnZSk7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Rvb2xzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbmYsIG5hbWUsCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1Rvb2xzIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQoY29uZik7Ci0JCQljaGlsZC5zZXRDYXRlZ29yaXplZEZpbHRlcih0b29sc0ZpbHRlcik7Ci0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkRmlsdGVyKHVuY2F0ZWdvcml6ZWRUb29sTWVudG9yRmlsdGVyKTsKLQkJCXVuY2F0ZWdvcml6ZWRJbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Ub29scyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkSW1hZ2UodW5jYXRlZ29yaXplZEltYWdlKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc2VzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCU9iamVjdCBvdGhlckNoaWxkID0gbmV3IFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29uZiwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVCk7Ci0JCQljaGlsZHJlbi5hZGQob3RoZXJDaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgb3RoZXJDaGlsZCk7Ci0KLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29uZiwgbmFtZSwKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGFja2FnZXMiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQoY29uZik7Ci0JCQljaGlsZC5zZXRDYXRlZ29yaXplZEZpbHRlcihjdXN0b21DYXRlZ29yaWVzRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCUd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIgY2hpbGQxID0gbmV3IEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LCBjb25mKTsKLQkJCWNoaWxkMS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZDEpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkMSk7Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkvLyByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKG9iamVjdCk7Ci0JLy8gfQotCS8vICAgIAotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmhhc0NoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyI2dldEdyb3VwSXRlbVByb3ZpZGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRHcm91cEl0ZW1Qcm92aWRlcihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ3JvdXBJdGVtUHJvdmlkZXJNYXAuZ2V0KG5hbWUpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQkKLQkJaWYgKCAoZmlsdGVyICE9IGNvbmZpZ3VyYXRvcikgJiYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpICkgewotCQkJY29uZmlndXJhdG9yID0gKElDb25maWd1cmF0b3IpIGZpbHRlcjsKLQkJCWlmICggY29uZmlndXJhdG9yICE9IG51bGwgKSB7CQkJCi0JCQkJLy8gY3JlYXRlIHRoZSB1bmNhdGVnb3JpemVkIGZpbHRlcnMuIElmIElDb25maWd1cmF0b3IgaXMgc2V0LCBnZXQgdGhlIGZpbGRlcnMgZnJvbSB0aGVyZS4KLQkJCQkvLyBvdGhlcndpemUsIHVzZSB0aGUgZGVmYXVsdCBvbmUuCi0JCQkJLy8gVGhpcyBpcyBuZWVkZWQgdG8gYWxsb3cgZXh0cmEgdW5jYXRlZ29yaXplZCBlbGVtZW50cyBkdWUgdG8gcmVhbGl6YXRpb24gCi0JCQkJLy8gdG8gc2hvdyB1cCBpbiB0aGUgdW4tY2F0ZWdvcml6ZWQgZm9sZGVyLgotCQkJCS8vIEZvciBleGFtcGxlLCBpZiBhIGRpc2NpcGxlIGlzIHJlcGxhY2VkIGJ5IGFub3RoZXIsIHRoZSB0YXNrcyBpbiB0aGUgcmVwbGFjZWQgZGlzY2lwbGllCi0JCQkJLy8gc2hvdWxkIHNob3cgdXAgaW4gdGhlIHVuLWNhdGVnb3JpemVkIHRhc2tzIGZvbGRlcgotCQkJCS8vIDE1NjQzOCAtIFZhcmlhYmlsaXR5IG9mIGRpc2NpcGxpbmVzIGlzIG5vdCB3b3JraW5nIGNvcnJlY3RseQotCQkJCQotCQkJCXVuY2F0ZWdvcml6ZWRUYXNrRmlsdGVyID0gY29uZmlndXJhdG9yLmdldFVuY2F0ZWdvcml6ZWRUYXNrRmlsdGVyKCk7Ci0JCQkJZG9tYWluVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0RmlsdGVyID0gY29uZmlndXJhdG9yLmdldERvbWFpblVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlcigpOwotCQkJCXdwVHlwZVVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlciA9IGNvbmZpZ3VyYXRvci5nZXRXcFR5cGVVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIoKTsKLQkJCQl1bmNhdGVnb3JpemVkUm9sZUZpbHRlciA9IGNvbmZpZ3VyYXRvci5nZXRVbmNhdGVnb3JpemVkUm9sZUZpbHRlcigpOwotCQkJCXVuY2F0ZWdvcml6ZWRUb29sTWVudG9yRmlsdGVyID0gY29uZmlndXJhdG9yLmdldFVuY2F0ZWdvcml6ZWRUb29sTWVudG9yRmlsdGVyKCk7Ci0JCQkJCi0JCQkJLy8gW0J1ZyAxNjI2MDNdIE5ldzogUmVwbGFjaW5nIGRpc2NpcGxpbmVzIGRvIGFwcGVhciBpbnNpZGUgdGhlaXIgcmVwbGFjZWQgZWxlbWVudHMgZGlzY2lwbGluZSBncm91cGluZ3MgYXMgd2VsbCBhcyBvdXRzaWRlIG9mIHRoZSBkaXNjaXBsaW5lIGdyb3VwaW5nCi0JCQkJLy8gbmVlZCB0byBjdXN0b21pemUgdGhlIGZpbHRlcnMgZm9yIGRpc2NpcGxpbmVzIGFuZCByb2xlc2V0cwotCQkJCWRpc2NpcGxpbmVzRmlsdGVyID0gY29uZmlndXJhdG9yLmdldERpc2NpcGxpbmVzRmlsdGVyKCk7Ci0JCQkJcm9sZVNldHNGaWx0ZXIgPSBjb25maWd1cmF0b3IuZ2V0Um9sZVNldHNGaWx0ZXIoKTsKLQkJCQkKLQkJCX0KLQkJfQotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi0JLy8gcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCS8vIHJldHVybiBwbHVnaW47Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQotCQlpZiAoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJCWNvbmZpZ3VyYXRvci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjNjYzYwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudCBpbiB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJvY2Vzc0NvbXBvbmVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19OQU1FOgotCQkJUHJvY2Vzc0NvbXBvbmVudCBwYyA9IChQcm9jZXNzQ29tcG9uZW50KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChwYy5nZXRQcm9jZXNzKCkgIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gb2xkID0gcGMuZ2V0UHJvY2VzcygpLmVEZWxpdmVyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcGMuZ2V0UHJvY2VzcygpLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQkJcGMuZ2V0UHJvY2VzcygpLnNldE5hbWUocGMuZ2V0TmFtZSgpKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlwYy5nZXRQcm9jZXNzKCkuZVNldERlbGl2ZXIob2xkKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIyNDgwNzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBwcm9jZXNzIHBhY2thZ2UgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKFByb2Nlc3MgcHJvY2VzcykgewotCQlyZXR1cm4gIVRuZ1V0aWwuaXNDb250cmlidXRvck9yUmVwbGFjZXIocHJvY2VzcykKLQkJCQkmJiAhcHJvY2Vzcy5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbGxlY3RDaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBPYmplY3QgZWxlbWVudCwKLQkJCUlGaWx0ZXIgZmlsdGVyKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJUHJvY2VzcyBwcm9jZXNzID0gKChQcm9jZXNzQ29tcG9uZW50KSBlbGVtZW50KS5nZXRQcm9jZXNzKCk7Ci0JCQlpZiAocHJvY2VzcyAhPSBudWxsKSB7Ci0JCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLQkJCQkJT2JqZWN0IGNoaWxkID0gKChJQ29uZmlndXJhdG9yKSBmaWx0ZXIpLnJlc29sdmUocHJvY2Vzcyk7Ci0JCQkJCWlmICghY2hpbGRyZW4uY29udGFpbnMoY2hpbGQpICYmIGZpbHRlci5hY2NlcHQoY2hpbGQpKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQocHJvY2VzcykpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKHByb2Nlc3MpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChlbGVtZW50KSkgewotCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbGxlY3RDaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gY29sbGVjdENoaWxkcmVuKGNoaWxkcmVuLCBlbGVtZW50LCBmaWx0ZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJY29sbGVjdENoaWxkcmVuKGNoaWxkcmVuLCBpdGVyLm5leHQoKSk7Ci0JCX0KLQotCQkvLyBzZXQgcGFyZW50IGZvciB0aGUgY29sbGVjdGVkIGNoaWxkcmVuCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlQcm9jZXNzVXRpbC5zZXRQYXJlbnQoY2hpbGQsIG9iamVjdCwgYWRhcHRlckZhY3RvcnkpOwotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJaWYgKGNvbGxlY3RDaGlsZHJlbihjaGlsZHJlbiwgaXRlci5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotCQkJKChJQ29uZmlndXJhdG9yKSBmaWx0ZXIpLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Qcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzMzY2E5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Qcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5BYnN0cmFjdFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIlByb2Nlc3NlcyIgZm9sZGVyIGluIHRoZSBDb25maWd1cmF0aW9uCi0gKiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBNb2RlbFN0cnVjdHVyZSBtb2RlbFN0cnVjdCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgbW9kZWxTdHJ1Y3QpOwotCQl0aGlzLm1ldGhvZENvbmZpZyA9IG1ldGhvZENvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJaWYgKGdyb3VwSXRlbVByb3ZpZGVyTWFwID09IG51bGwpIHsKLQkJCQlncm91cEl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQl9Ci0KLQkJCWZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQ7Ci0JCQkJfQotCi0JCQl9OwotCi0JCQlPYmplY3QgaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm5zIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBuYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0NhcGFiaWxpdHlQYXR0ZXJuc190ZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCUNhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGNoaWxkID0gbmV3IENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKAotCQkJCQlhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLCBuYW1lLCBpbWFnZSwKLQkJCQkJbW9kZWxTdHJ1Y3QuY2FwYWJpbGl0eVBhdHRlcm5QYXRoKTsKLQkJCWNoaWxkLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzZXNfdGV4dCIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkJbWV0aG9kQ29uZmlnLCBuYW1lLCBpbWFnZSwgbW9kZWxTdHJ1Y3QuZGVsaXZlcnlQcm9jZXNzUGF0aCk7Ci0JCQljaGlsZC5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBtZXRob2RDb25maWc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1JvbGVTZXRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1JvbGVTZXRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2NkYmQ3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcm9sZSBzZXQgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuUm9sZVNldEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlU2V0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNhdGVnb3J5LlJvbGVTZXRJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1VuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1VuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTA5ZjliNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9VbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgdW5jYXRlZ29yaXplZCBmb2xkZXJzIGFuZCBlbGVtZW50cyBpbiB0aGUKLSAqIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwKLQkJSUNvbmZpZ3VyYWJsZSB7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjaGlsZHJlbjsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZzsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCXByaXZhdGUgSUZpbHRlciB1bmNhdGVnb3JpemVkRmlsdGVyOwotCi0JcHJpdmF0ZSBPYmplY3QgaW1hZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIElGaWx0ZXIgZmlsdGVyLCBTdHJpbmcgbGFiZWwsCi0JCQlPYmplY3QgaW1hZ2UpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLm1ldGhvZENvbmZpZyA9IG1ldGhvZENvbmZpZzsKLQkJdGhpcy51bmNhdGVnb3JpemVkRmlsdGVyID0gZmlsdGVyOwotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0IGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCgKLQkJCUxpc3QgZmlsdGVyTGlzdCkgewotCQlyZXR1cm4gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdChtZXRob2RDb25maWcsIGZpbHRlckxpc3QpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZUZpbHRlckxpc3QoKSB7Ci0JCUFycmF5TGlzdCBmaWx0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAodW5jYXRlZ29yaXplZEZpbHRlciAhPSBudWxsKSB7Ci0JCQlmaWx0ZXJMaXN0LmFkZCh1bmNhdGVnb3JpemVkRmlsdGVyKTsKLQkJfQotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCWZpbHRlckxpc3QuYWRkKGZpbHRlcik7Ci0JCX0KLQkJcmV0dXJuIGZpbHRlckxpc3Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0KGNyZWF0ZUZpbHRlckxpc3QoKSkKLQkJCQkuZ2V0TGlzdCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gQWx3YXlzIHJldHVybiB0cnVlIHRvIGF2b2lkIGV4cGVuc2l2ZSBjYWxsIHRvIGdldENoaWxkcmVuKCkgdGhhdCB3YWxrCi0JCS8vIHRocnUgdGhlCi0JCS8vIHdob2xlIGxpYnJhcnkgdG8gZmluZCBhbGwgdGhlIHRhc2tzIHRoYXQgaXMgbm90IGFzc2lnbmVkIHRvIGFueQotCQkvLyBkaXNjaXBsaW5lLgotCQkvLwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChsYWJlbCAhPSBudWxsKQotCQkJcmV0dXJuIGxhYmVsOwotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVW5jYXRlZ29yaXplZF90ZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGltYWdlICE9IG51bGwpCi0JCQlyZXR1cm4gaW1hZ2U7Ci0JCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Xb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Xb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjYzAyNDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuV3JhcHBlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIldvcmsgUHJvZHVjdCBLaW5kcyIgZm9sZGVyIGluIHRoZQotICogQ29uZmlndXJhdGlvbiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIFN0cmluZyBuYW1lLCBPYmplY3QgaW1hZ2UsCi0JCQlTdHJpbmdbXSBjYXRlZ29yeVBrZ1BhdGgpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywgbmFtZSwgaW1hZ2UsIGNhdGVnb3J5UGtnUGF0aCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciNjcmVhdGVVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlciBjcmVhdGVVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQl0aGlzLnVuY2F0ZWdvcml6ZWRGaWx0ZXIsIHRoaXMudW5jYXRlZ29yaXplZExhYmVsLAotCQkJCXRoaXMudW5jYXRlZ29yaXplZEltYWdlKSB7Ci0JCQlmaW5hbCBjbGFzcyBFbGVtZW50TGlzdCBleHRlbmRzIE1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCB7Ci0KLQkJCQkvKioKLQkJCQkgKiBAcGFyYW0gbWV0aG9kQ29uZmlnCi0JCQkJICogQHBhcmFtIGZpbHRlckxpc3QKLQkJCQkgKi8KLQkJCQlwdWJsaWMgRWxlbWVudExpc3QoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsCi0JCQkJCQlMaXN0IGZpbHRlckxpc3QpIHsKLQkJCQkJc3VwZXIobWV0aG9kQ29uZmlnLCBmaWx0ZXJMaXN0KTsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5NZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QjbmV3SXRlcmF0b3Iob3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZSkKLQkJCQkgKi8KLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgbmV3SXRlcmF0b3IoQ29udGVudFBhY2thZ2UgcGtnKSB7Ci0JCQkJCXJldHVybiBuZXcgRWxlbWVudEl0ZXJhdG9yKHBrZykgewotCQkJCQkJLyoqCi0JCQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCQkJICovCi0JCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMzA3MTM2MzA3NjU3MzU5MjgyTDsKLQotCQkJCQkJLyoKLQkJCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJCSAqIAotCQkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0LkVsZW1lbnRJdGVyYXRvciNnZXRDaGlsZHJlbkxpc3QoamF2YS5sYW5nLk9iamVjdCkKLQkJCQkJCSAqLwotCQkJCQkJcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW5MaXN0KE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCQlMaXN0IGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW5MaXN0KG9iamVjdCk7Ci0JCQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCQkJCWNoaWxkcmVuLmFkZEFsbCgoKEFydGlmYWN0KSBvYmplY3QpCi0JCQkJCQkJCQkJLmdldENvbnRhaW5lZEFydGlmYWN0cygpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIGNoaWxkcmVuOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLk1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCNjaGVja0FjY2VwdGFuY2UoKQotCQkJCSAqLwotCQkJCXByb3RlY3RlZCBib29sZWFuIGNoZWNrQWNjZXB0YW5jZSgpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIHN1cGVyQWNjZXB0KE9iamVjdCBvYmplY3QpIHsKLQkJCQkJcmV0dXJuIHN1cGVyLmFjY2VwdChvYmplY3QpOwotCQkJCX0KLQkJCX07Ci0KLQkJCS8vIGtlZXBzIHdyYXBwZXJzIG9mIGFydGlmYWN0cyB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHdvcmsKLQkJCS8vIHByb2R1Y3QgdHlwZQotCQkJLy8KLQkJCXByaXZhdGUgV3JhcHBlck1hbmFnZXIgd3JhcHBlck1hbmFnZXIgPSBuZXcgV3JhcHBlck1hbmFnZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJLyoKLQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJICogCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuV3JhcHBlck1hbmFnZXIjY3JlYXRlV3JhcHBlcihqYXZhLmxhbmcuT2JqZWN0LAotCQkJCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwKLQkJCQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5KQotCQkJCSAqLwotCQkJCXByb3RlY3RlZCBJV3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwKLQkJCQkJCU9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJcmV0dXJuIG5ldyBEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcih2YWx1ZSwgb3duZXIsCi0JCQkJCQkJbnVsbCwgQ29tbWFuZFBhcmFtZXRlci5OT19JTkRFWCwgYWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJCS8qCi0JCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCQkgKiAKLQkJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJCQkJCSAqLwotCQkJCQkJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJCS8vIFN1Yi1hcnRpZmFjdCBjYW4gaGF2ZSBhIGRpZmZlcmVudCBzZXQgb2Ygd29yawotCQkJCQkJCS8vIHByb2R1Y3QgdHlwZXMgdGhhbiB0aGUgY29udGFpbmluZyBhcnRpZmFjdC4KLQkJCQkJCQkvLyBEbyBub3Qgc2hvdyB0aGUgY29tcG9zaXRpb24gaGllcmFyY2hpZXMgaW4gdGhlCi0JCQkJCQkJLy8gV29yayBQcm9kdWN0IFR5cGUgdHJlZSBicm93c2VycyBpbiBMaWIuIE5hdi4KLQkJCQkJCQkvLyBhbmQgQ29uZmlnLiBFeHBsb3Jlci4gU2hvdyB0aGVtIGluIGZsYXQgbGlzdHMKLQkJCQkJCQkvLyBhY2NvcmRpbmcgdG8gdGhlaXIgY2F0ZWdvcml6YXRpb25zIGluc3RlYWQuCi0JCQkJCQkJLy8KLQkJCQkJCQkvLyBUaGlzIGlzIG5vdCB0cnVlIGZvciBEb21haW5zLCB3aGljaCBzaG91bGQgc2hvdwotCQkJCQkJCS8vIHRoZSBhcnRpZmFjdCBuZXN0aW5nIQotCQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJCQkJfQotCi0JCQkJCQkvKgotCQkJCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCQkJICogCi0JCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCQkJCQkgKi8KLQkJCQkJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJfQotCQkJfTsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlciNjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QoamF2YS51dGlsLkxpc3QpCi0JCQkgKi8KLQkJCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QgY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0KAotCQkJCQlMaXN0IGZpbHRlckxpc3QpIHsKLQkJCQlyZXR1cm4gbmV3IEVsZW1lbnRMaXN0KG1ldGhvZENvbmZpZywgZmlsdGVyTGlzdCk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCUVsZW1lbnRMaXN0IGVsZW1lbnRMaXN0ID0gKEVsZW1lbnRMaXN0KSBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QoY3JlYXRlRmlsdGVyTGlzdCgpKTsKLQkJCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gZWxlbWVudExpc3QuZ2V0TGlzdCgpOwotCQkJCUFycmF5TGlzdCBhcnRpZmFjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50TGlzdC5zdXBlckFjY2VwdChlbGVtZW50KSkgewotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQkJCWFydGlmYWN0cy5hZGQoZWxlbWVudCk7Ci0JCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJd3JhcHBlck1hbmFnZXIudXBkYXRlKGFydGlmYWN0cyk7Ci0JCQkJY2hpbGRyZW4uYWRkQWxsKHdyYXBwZXJNYW5hZ2VyLmdldFdyYXBwZXJzKCkpOwotCQkJCXJldHVybiBjaGlsZHJlbjsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCXdyYXBwZXJNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3N2RmYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZGlzcGxheSBhbmQgZWRpdGluZyBzdXBwb3J0IGZvciBtZXRob2QgY29uZmlndXJhdGlvbnMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvQXJ0aWZhY3RJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0FydGlmYWN0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmOTNmN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvQXJ0aWZhY3RJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYW4gYXJ0aWZhY3QuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFydGlmYWN0SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BcnRpZmFjdEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlEZWZhdWx0TmFtZVNldHRlciwgSUxpYnJhcnlJdGVtUHJvdmlkZXIsIElDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFydGlmYWN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBvYmplY3Q7Ci0JCWlmIChhcnRpZmFjdCAhPSBudWxsICYmIGFydGlmYWN0LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TmF2aWdhdG9yUGFyZW50SXRlbVByb3ZpZGVyKGFydGlmYWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFydGlmYWN0KCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0KLQkJLy9UbmdVdGlsLnNldERlZmF1bHROYW1lKHRoaXMsIG5vdGlmaWNhdGlvbik7Ci0JCXNldERlZmF1bHROYW1lKG5vdGlmaWNhdGlvbik7Ci0JCQotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQkKLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCQkKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERpc2NpcGxpbmUuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTkFNRToKLQkJCVRuZ1V0aWwucmVmcmVzaENvbnRyaWJ1dG9ycyh0aGlzLCBub3RpZmljYXRpb24sIGZhbHNlLCB0cnVlKTsKLQkJCWJyZWFrOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJVG5nVXRpbC5yZWZyZXNoV29ya1Byb2R1Y3RUeXBlVW5jYXRlZ29yaXplZChVbWFVdGlsCi0JCQkJCS5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIHRhcmdldCksIG5vdGlmaWNhdGlvbik7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCQotCS8qKgotCSAqIE1ldGhvZCB0byBzZXREZWZhdWx0TmFtZS4gSURlZmF1bHROYW1lU2V0dGVyIGNhbm5vdCBiZSB1c2VkIAotCSAqIGluIGNhc2Ugb2YgU3RhdGVsZXNzIEl0ZW1Qcm92aWRlci4KLQkgKiBUaGlzIGlzIHdvcmstYXJvdW5kIGZvciBub3cuIElEZWZhdWx0TmFtZVNldHRlciB3aWxsIGJlIG1vZGlmaWVkIGxhdGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJSURlZmF1bHROYW1lU2V0dGVyIGRlZmF1bHROYW1lU2V0dGVyID0gdGhpczsKLQkJaWYgKGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpICE9IG51bGwpIHsKLQkJCWludCBmZWF0dXJlSWQgPSBtc2cuZ2V0RmVhdHVyZUlEKGRlZmF1bHROYW1lU2V0dGVyCi0JCQkJCS5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSk7Ci0JCQlpZiAoZmVhdHVyZUlkID09IGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSkgewotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlzZXREZWZhdWx0TmFtZShtc2cuZ2V0TmV3VmFsdWUoKSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlzZXREZWZhdWx0TmFtZShpdGVyLm5leHQoKSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqLCBPYmplY3QgcGFyZW50KSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfQVJUSUZBQ1Q7Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChBcnRpZmFjdCkgcGFyZW50KQotCQkJCQkuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCksIChNZXRob2RFbGVtZW50KSBvYmosIGJhc2VOYW1lKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqIG5vdCBpbiB1c2UgKGZvciBzdGF0ZWxlc3MgaXRlbXByb3ZpZGVyKSBzZWUgYWJvdmUgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaiwgT2JqZWN0IHBhcmVudCkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0FSVElGQUNUOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoQXJ0aWZhY3QpIHRhcmdldCkuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCksCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmosIGJhc2VOYW1lKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gQXJ0aWZhY3QuY2xhc3M7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9BcnRpZmFjdF90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCWlmICgoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXROb2RlaWNvbigpICE9IG51bGwpIHsKLQkJCQlVUkkgaW1nVXJpID0gVG5nVXRpbC5nZXRGdWxsUGF0aG9mTm9kZW9yU2hhcGVJY29uVVJJKAotCQkJCQkJKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0LAotCQkJCQkJKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSk7Ci0JCQkJT2JqZWN0IGltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTaGFyZWRJbWFnZShpbWdVcmkpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKQotCQkJCQlyZXR1cm4gaW1hZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoCi0JCQkJZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwgaW5kZXgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCUNvbGxlY3Rpb24gY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjb2wuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkgewotCQkJCQlpdG9yLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sOwotCX0KLQotCS8vIHByaXZhdGUgYm9vbGVhbiBpc1BhcmVudHNBY2NlcHRlZChPYmplY3QgY2hpbGQpIHsKLQkvLyBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gZ2V0SGllcmFyY2h5TGlzdChsaXN0LCBjaGlsZCk7Ci0JLy8gZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkvLyBPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JLy8gaWYgKG9iaiBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JLy8gaWYgKGZpbHRlci5hY2NlcHQob2JqKSkKLQkvLyByZXR1cm4gdHJ1ZTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0JLy8KLQkvLyBwcml2YXRlIGJvb2xlYW4gY2hlY2tDaGlsZHJlbnNBY2NlcHRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gQXJ0aWZhY3QgcGFyZW50YXJ0aWZhY3QgPSAoKEFydGlmYWN0KSBvYmplY3QpLmdldENvbnRhaW5lckFydGlmYWN0KCk7Ci0JLy8gaWYgKHBhcmVudGFydGlmYWN0ICE9IG51bGwpIHsKLQkvLyBpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkvLyBpZiAoZmlsdGVyLmFjY2VwdChwYXJlbnRhcnRpZmFjdCkpCi0JLy8gcmV0dXJuIHRydWU7Ci0JLy8gZWxzZSB7Ci0JLy8gcmV0dXJuIGNoZWNrQ2hpbGRyZW5zQWNjZXB0ZWQocGFyZW50YXJ0aWZhY3QpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0JLy8KLQkvLyBwcml2YXRlIHZvaWQgZ2V0SGllcmFyY2h5TGlzdChMaXN0IGxpc3QsIE9iamVjdCBvYmplY3QpIHsKLQkvLyBBcnRpZmFjdCBwYXJlbnQgPSAoKEFydGlmYWN0KSBvYmplY3QpLmdldENvbnRhaW5lckFydGlmYWN0KCk7Ci0JLy8gaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JLy8gbGlzdC5hZGQocGFyZW50KTsKLQkvLyBnZXRIaWVyYXJjaHlMaXN0KGxpc3QsIHBhcmVudCk7Ci0JLy8gfQotCS8vIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Db250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjEwMGE4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Db250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgY29udGVudCBkZXNjcmlwdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Db250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQSBtYXAgb2YgRUNsYXNzIC8gSXRlbVByb3ZpZGVyQWRhcHRlciBmb3IgZWFjaCB0eXBlIG9mIENvbnRlbnREZXNjcmlwdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBpdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8JCi0JcHVibGljIENvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWl0ZW1Qcm92aWRlck1hcC5jbGVhcigpOwotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiBnZXRBZGFwdGVyKChFT2JqZWN0KSBvYmplY3QpLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQcm9wZXJ0eURlc2NyaXB0b3IoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0LAotCQkJT2JqZWN0IHByb3BlcnR5SWQpIHsKLQkJcmV0dXJuIGdldEFkYXB0ZXIoKEVPYmplY3QpIG9iamVjdCkuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwKLQkJCQlwcm9wZXJ0eUlkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0RWRpdGFibGVWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRBZGFwdGVyKChFT2JqZWN0KSBvYmplY3QpLmdldEVkaXRhYmxlVmFsdWUob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuR3VpZGFuY2VJdGVtUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiBnZXRBZGFwdGVyKChFT2JqZWN0KSBvYmplY3QpLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkd1aWRhbmNlSXRlbVByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSXRlbVByb3ZpZGVyQWRhcHRlciBnZXRBZGFwdGVyKEVPYmplY3QgZU9iaikgewotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgaXRlbVByb3ZpZGVyTWFwCi0JCQkJLmdldChlT2JqLmVDbGFzcygpKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5jcmVhdGVBZGFwdGVyKGVPYmopOwotCQkJaXRlbVByb3ZpZGVyTWFwLnB1dChlT2JqLmVDbGFzcygpLCBhZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0NvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ3MDI3NmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkNvbnRlbnQgUGFja2FnZXMiIGZvbGRlciBpbiB0aGUgTGlicmFyeQotICogdmlldy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgQ29udGVudFBhY2thZ2VzSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVsZW1lbnRJdGVtUHJvdmlkZXIsIElMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBSb2xlc0l0ZW1Qcm92aWRlciByb2xlczsKLQotCXByaXZhdGUgVGFza3NJdGVtUHJvdmlkZXIgdGFza3M7Ci0KLQlwcml2YXRlIFdvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlciB3b3JrUHJvZHVjdHM7Ci0KLQlwcml2YXRlIEd1aWRhbmNlc0l0ZW1Qcm92aWRlciBndWlkYW5jZXM7Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJvbGVzLgotCSAqLwotCXB1YmxpYyBSb2xlc0l0ZW1Qcm92aWRlciBnZXRSb2xlcygpIHsKLQkJcmV0dXJuIHJvbGVzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGFza3MuCi0JICovCi0JcHVibGljIFRhc2tzSXRlbVByb3ZpZGVyIGdldFRhc2tzKCkgewotCQlyZXR1cm4gdGFza3M7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB3b3JrUHJvZHVjdHMuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlciBnZXRXb3JrUHJvZHVjdHMoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdHM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQkvLyBwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkvLyBpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JLy8gY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSk7Ci0JLy8gfQotCS8vIHJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCS8vIH0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgYWxsQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNoaWxkcmVuU3RvcmUgc3RvcmUgPSBnZXRDaGlsZHJlblN0b3JlKG9iamVjdCk7Ci0JCUxpc3QgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHN0b3JlID09IG51bGwpIHsKLQkJCXN0b3JlID0gY3JlYXRlQ2hpbGRyZW5TdG9yZShvYmplY3QpOwotCQkJcmVzdWx0ID0gc3RvcmUgIT0gbnVsbCA/IG51bGwgOiBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCi0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCkuaXRlcmF0b3IoKTsgaQotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaS5uZXh0KCk7Ci0JCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQkJCUxpc3QgY29udGVudFBrZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCWZvciAoSXRlcmF0b3IgY2kgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBjaS5oYXNOZXh0KCk7IGluZGV4KyspIHsKLQkJCQkJCU9iamVjdCBjaGlsZCA9IGNpLm5leHQoKTsKLQkJCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJCQkJY2hpbGQgPSB3cmFwKGVPYmplY3QsIGZlYXR1cmUsIGNoaWxkLCBpbmRleCk7Ci0JCQkJCQkJLy8gaWYgKHN0b3JlICE9IG51bGwpCi0JCQkJCQkJLy8gewotCQkJCQkJCS8vIHN0b3JlLmdldExpc3QoZmVhdHVyZSkuYWRkKGNoaWxkKTsKLQkJCQkJCQkvLyB9Ci0JCQkJCQkJLy8gZWxzZQotCQkJCQkJCS8vIHsKLQkJCQkJCQkvLyByZXN1bHQuYWRkKGNoaWxkKTsKLQkJCQkJCQkvLyB9Ci0JCQkJCQkJY29udGVudFBrZ3MuYWRkKGNoaWxkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gY2xlYXIgcGFyZW50IGZvciBjaGlsZHJlbgotCQkJCQkvLwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBjaGlsZCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChjaGlsZCwKLQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRQYXJlbnQobnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyBzb3J0aW5nIHRoZSBjb250ZW50IHBhY2thZ2VzCi0JCQkJCS8vCi0JCQkJCUNvbGxlY3Rpb25zLnNvcnQoY29udGVudFBrZ3MsIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0Q29tcGFyYXRvcigpKTsKLQotCQkJCQlpZiAoc3RvcmUgIT0gbnVsbCkgewotCQkJCQkJc3RvcmUuZ2V0TGlzdChmZWF0dXJlKS5hZGRBbGwoY29udGVudFBrZ3MpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVzdWx0LmFkZEFsbChjb250ZW50UGtncyk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlPYmplY3QgY2hpbGQgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJCQljaGlsZCA9IHdyYXAoZU9iamVjdCwgZmVhdHVyZSwgY2hpbGQsCi0JCQkJCQkJCUNvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgpOwotCQkJCQkJaWYgKHN0b3JlICE9IG51bGwpIHsKLQkJCQkJCQlzdG9yZS5zZXRWYWx1ZShmZWF0dXJlLCBjaGlsZCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJlc3VsdC5hZGQoY2hpbGQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFsbENoaWxkcmVuLmFkZEFsbChzdG9yZSAhPSBudWxsID8gc3RvcmUuZ2V0Q2hpbGRyZW4oKSA6IHJlc3VsdCk7Ci0JCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cgPSAoQ29udGVudFBhY2thZ2UpIG9iamVjdDsKLQotCQkvLyByZW1vdmUgb2xkIGFkYXB0ZXJzIChyb2xlcywgdGFza3MsIHdvcmtwcm9kdWN0cykgZnJvbSB0aGUgdGhlCi0JCS8vIGNvbnRlbnRQa2cKLQkJLy8KLQkJLy8gRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIG9iamVjdDsKLQkJaWYgKHJvbGVzID09IG51bGwpIHsKLQkJCS8vIGVPYmouZUFkYXB0ZXJzKCkucmVtb3ZlKHJvbGVzKTsKLQkJCXJvbGVzID0gbmV3IFJvbGVzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnKTsKLQkJfQotCQlpZiAodGFza3MgPT0gbnVsbCkgewotCQkJLy8gZU9iai5lQWRhcHRlcnMoKS5yZW1vdmUodGFza3MpOwotCQkJdGFza3MgPSBuZXcgVGFza3NJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2cpOwotCQl9Ci0JCWlmICh3b3JrUHJvZHVjdHMgPT0gbnVsbCkgewotCQkJLy8gZU9iai5lQWRhcHRlcnMoKS5yZW1vdmUod29ya1Byb2R1Y3RzKTsKLQkJCXdvcmtQcm9kdWN0cyA9IG5ldyBXb3JrUHJvZHVjdHNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJCWNvbnRlbnRQa2cpOwotCQl9Ci0JCWlmIChndWlkYW5jZXMgPT0gbnVsbCkgewotCQkJLy8gZU9iai5lQWRhcHRlcnMoKS5yZW1vdmUoZ3VpZGFuY2VzKTsKLQkJCWd1aWRhbmNlcyA9IG5ldyBHdWlkYW5jZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2cpOwotCQl9Ci0KLQkJYWxsQ2hpbGRyZW4uYWRkKHJvbGVzKTsKLQkJYWxsQ2hpbGRyZW4uYWRkKHRhc2tzKTsKLQkJYWxsQ2hpbGRyZW4uYWRkKHdvcmtQcm9kdWN0cyk7Ci0JCWFsbENoaWxkcmVuLmFkZChndWlkYW5jZXMpOwotCQlyZXR1cm4gYWxsQ2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVDb250ZW50UGFja2FnZSgpKSk7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuQ2xhc3MsCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyKQotCS8vICovCi0JLy8gcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3Qgb2JqZWN0LCBFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkvLyBDbGFzcyBjb21tYW5kQ2xhc3MsIENvbW1hbmRQYXJhbWV0ZXIgY29tbWFuZFBhcmFtZXRlcikgewotCS8vIC8vIGNvbW1hbmRQYXJhbWV0ZXIuc2V0T3duZXIoKChFT2JqZWN0KW9iamVjdCkuZUNvbnRhaW5lcigpKTsKLQkvLyBDb21tYW5kIGNtZCA9IHN1cGVyLmNyZWF0ZUNvbW1hbmQob2JqZWN0LCBkb21haW4sIGNvbW1hbmRDbGFzcywKLQkvLyBjb21tYW5kUGFyYW1ldGVyKTsKLQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NyZWF0ZUNvbW1hbmQ6ICIgKwotCS8vIGNvbW1hbmRDbGFzcyArICIsIGNhbiBleGVjdXRlOiAiICsgY21kLmNhbkV4ZWN1dGUoKSArICIsIG93bmVyOiAiICsKLQkvLyBjb21tYW5kUGFyYW1ldGVyLmdldE93bmVyKCkgKyAiLCBjb2xsZWN0aW9uOiAiICsKLQkvLyBjb21tYW5kUGFyYW1ldGVyLmdldENvbGxlY3Rpb24oKSk7Ci0JLy8gcmV0dXJuIGNtZDsKLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyB0eHQ7Ci0JCWlmIChsYWJlbCAhPSBudWxsKSB7Ci0JCQl0eHQgPSBsYWJlbDsKLQkJfSBlbHNlIHsKLQkJCXR4dCA9IFRuZ1V0aWwKLQkJCQkJLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfQ29udGVudFBhY2thZ2VfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIGNoZWNrIGlmIHRoZSBvYmplY3QgaGFzIGl0cyBvd24gcmVzb3VyY2UgYW5kIGl0IGlzIG1vZGlmaWVkIHRvIGFkZAotCQkvLyB0aGUgZGlydHkgZmxhZwotCQkvLwotCQlSZXNvdXJjZSByZXMgPSAoKEVPYmplY3QpIG9iamVjdCkuZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuZ2V0Q29udGVudHMoKS5nZXQoMCkgPT0gb2JqZWN0Ci0JCQkJJiYgcmVzLmlzTW9kaWZpZWQoKSkgewotCQkJdHh0ID0gdHh0ICsgIioiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHR4dDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlDb250ZW50UGFja2FnZSBjb250ZW50UGFja2FnZSA9IChDb250ZW50UGFja2FnZSkgdGFyZ2V0OwotCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoY29udGVudFBhY2thZ2UuZ2V0Q2hpbGRQYWNrYWdlcygpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLCAiY29udGVudF9wYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoY29udGVudFBhY2thZ2UuZ2V0Q2hpbGRQYWNrYWdlcygpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLCAibWV0aG9kX3BhY2thZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlUbmdVdGlsLnJlZnJlc2hQYXJlbnRJZk5hbWVDaGFuZ2VkKG1zZywgdGhpcyk7Ci0KLQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKENvbnRlbnRQYWNrYWdlLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTOgotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzoKLQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJc2V0RGVmYXVsdE5hbWUobXNnLmdldE5ld1ZhbHVlKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJc2V0RGVmYXVsdE5hbWUoaXRlci5uZXh0KCkpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEd1aWRhbmNlc0l0ZW1Qcm92aWRlciBnZXRHdWlkYW5jZXMoKSB7Ci0JCXJldHVybiBndWlkYW5jZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0KLQkvLyBwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkvLyByZXR1cm4gVG5nRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlcyIpOwotCS8vIH0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlBcnJheUxpc3Qgc2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQotCQkJLy8gbWFrZSBzdXJlIHRoYXQgeW91IGNhbm5vdCBhZGQgTWV0aG9kUGFja2FnZSB0aGF0IGlzIG5vdCBhCi0JCQkvLyBDb250ZW50UGFja2FnZQotCQkJLy8KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZQotCQkJCQkmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJc2VsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoCi0JCQkJZG9tYWluLCBvd25lciwgZmVhdHVyZSwgc2VsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZ3VpZGFuY2VzICE9IG51bGwpIHsKLQkJCWd1aWRhbmNlcy5kaXNwb3NlKCk7Ci0JCQlndWlkYW5jZXMgPSBudWxsOwotCQl9Ci0JCWlmIChyb2xlcyAhPSBudWxsKSB7Ci0JCQlyb2xlcy5kaXNwb3NlKCk7Ci0JCQlyb2xlcyA9IG51bGw7Ci0JCX0KLQkJaWYgKHRhc2tzICE9IG51bGwpIHsKLQkJCXRhc2tzLmRpc3Bvc2UoKTsKLQkJCXRhc2tzID0gbnVsbDsKLQkJfQotCQlpZiAod29ya1Byb2R1Y3RzICE9IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0cy5kaXNwb3NlKCk7Ci0JCQl3b3JrUHJvZHVjdHMgPSBudWxsOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0d1aWRhbmNlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9HdWlkYW5jZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjNhZTliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0d1aWRhbmNlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZ3VpZGFuY2UgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGFuY2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkd1aWRhbmNlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEEgbWFwIG9mIEVDbGFzcyAvIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZm9yIGVhY2ggdHlwZSBvZiBndWlkYW5jZQotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBpdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpdGVtUHJvdmlkZXJNYXAuY2xlYXIoKTsKLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkd1aWRhbmNlSXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuRGVzY3JpYmFibGVFbGVtZW50SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuR3VpZGFuY2VJdGVtUHJvdmlkZXIjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuIGdldEFkYXB0ZXIoKEVPYmplY3QpIG9iamVjdCkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFByb3BlcnR5RGVzY3JpcHRvcihqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QsCi0JCQlPYmplY3QgcHJvcGVydHlJZCkgewotCQlyZXR1cm4gZ2V0QWRhcHRlcigoRU9iamVjdCkgb2JqZWN0KS5nZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LAotCQkJCXByb3BlcnR5SWQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRFZGl0YWJsZVZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldEFkYXB0ZXIoKEVPYmplY3QpIG9iamVjdCkuZ2V0RWRpdGFibGVWYWx1ZShvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5HdWlkYW5jZUl0ZW1Qcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlpZiAoKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSAhPSBudWxsKSB7Ci0JCQkJVVJJIGltZ1VyaSA9IFRuZ1V0aWwuZ2V0RnVsbFBhdGhvZk5vZGVvclNoYXBlSWNvblVSSSgKLQkJCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCwKLQkJCQkJCSgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkpOwotCQkJCU9iamVjdCBpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U2hhcmVkSW1hZ2UoaW1nVXJpKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGltYWdlOwotCQkJfQotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gZ2V0QWRhcHRlcigoRU9iamVjdCkgb2JqZWN0KS5nZXRJbWFnZShvYmplY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSXRlbVByb3ZpZGVyQWRhcHRlciBnZXRBZGFwdGVyKEVPYmplY3QgZU9iaikgewotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgaXRlbVByb3ZpZGVyTWFwCi0JCQkJLmdldChlT2JqLmVDbGFzcygpKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5jcmVhdGVBZGFwdGVyKGVPYmopOwotCQkJaXRlbVByb3ZpZGVyTWFwLnB1dChlT2JqLmVDbGFzcygpLCBhZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuR3VpZGFuY2VJdGVtUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQlpZiAoZU9iaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCS5nZXRBZGFwdGVyKGVPYmosIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXRlbVByb3ZpZGVyLmdldEd1aWRhbmNlcygpOwotCQl9Ci0JCXJldHVybiBlT2JqOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKChBZGRDb21tYW5kKSBzdXBlci5jcmVhdGVBZGRDb21tYW5kKAotCQkJCWRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5HdWlkYW5jZUl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlUbmdVdGlsLnJlZnJlc2hQYXJlbnRJZk5hbWVDaGFuZ2VkKG5vdGlmaWNhdGlvbiwgdGhpcyk7Ci0JCQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvR3VpZGFuY2VzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9HdWlkYW5jZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGEwZDgzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9HdWlkYW5jZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkd1aWRhbmNlIiBmb2xkZXIgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgR3VpZGFuY2VGb2xkZXJJdGVtUHJvdmlkZXIgaW4gRVBGIE01LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBHdWlkYW5jZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSBjb250ZW50UGtnKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmVsZW1lbnQuVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0d1aWRhbmNlRm9sZGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXR0YWNobWVudCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUNoZWNrbGlzdCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUNvbmNlcHQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVFeGFtcGxlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlR3VpZGVsaW5lKCkpKTsKLQotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkvLyAuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCS8vIC5jcmVhdGVFc3RpbWF0ZSgpKSk7Ci0JCS8vCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSkpOwotCi0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCS8vIC5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJLy8gLmNyZWF0ZUVzdGltYXRpbmdNZXRyaWMoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVQcmFjdGljZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVJlcG9ydCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVJldXNhYmxlQXNzZXQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVSb2FkbWFwKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCkpKTsKLQotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkvLyAuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCS8vIC5jcmVhdGVUZWNobmlxdWUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVUZW1wbGF0ZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVRlcm1EZWZpbml0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVG9vbE1lbnRvcigpKSk7Ci0KLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHJhaW5pbmdDbGFzcygpKSk7Ci0JCS8vCi0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCS8vIChjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkvLyAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksCi0JCS8vIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRyYWluaW5nTW9kdWxlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV2hpdGVwYXBlcigpKSk7Ci0KLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJLy8gLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkvLyAuY3JlYXRlV29ya1Byb2R1Y3RHdWlkZWxpbmUoKSkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCS8vIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkvLyBFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JLy8gaWYoZU9iaiA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkvLyBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpCi0JLy8gVG5nVXRpbC5nZXRBZGFwdGVyKGVPYmosIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkvLyBpZihpdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCS8vIHJldHVybiBpdGVtUHJvdmlkZXIuZ2V0R3VpZGFuY2VzKCk7Ci0JLy8gfQotCS8vIHJldHVybiBlT2JqOwotCS8vIH0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19DSEVDS0xJU1Q7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgV2hpdGVwYXBlcikgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfV0hJVEVQQVBFUjsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19DT05DRVBUOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucykgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRVNUSU1BVElPTl9DT05TSURFUkFUSU9OOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0VYQU1QTEU7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1BSQUNUSUNFOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJlcG9ydCkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUkVQT1JUOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvYWRtYXApIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1JPQURNQVA7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUkVVU0FCTEVfQVNTRVQ7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19TVVBQT1JUSU5HX01BVEVSSUFMOwotCQkJLy8gfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUZWNobmlxdWUpIHsKLQkJCS8vIGJhc2VOYW1lID0gIm5ld19UZWNobmlxdWUiOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRlbXBsYXRlKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19URU1QTEFURTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbikgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfVEVSTV9ERUZJTklUSU9OOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1RPT0xfTUVOVE9SOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfR1VJREVMSU5FOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19HVUlEQU5DRTsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwgYmFzZU5hbWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5lbGVtZW50LlRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyI25ld0NoaWxkQWRkZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoaWxkcmVuQ2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWJvb2xlYW4gcmVmcmVzaCA9IGZhbHNlOwotCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQlpZiAobXNnLmdldE5ld1ZhbHVlKCkgaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJcmVmcmVzaCA9IHRydWU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJaWYgKG1zZy5nZXRPbGRWYWx1ZSgpIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCXJlZnJlc2ggPSB0cnVlOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJY2hlY2tfYWRkOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJaWYgKGl0ZXIubmV4dCgpIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCQlyZWZyZXNoID0gdHJ1ZTsKLQkJCQkJYnJlYWsgY2hlY2tfYWRkOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCWNoZWNrX3JlbW92ZTogZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWlmIChpdGVyLm5leHQoKSBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQkJcmVmcmVzaCA9IHRydWU7Ci0JCQkJCWJyZWFrIGNoZWNrX3JlbW92ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlpZiAocmVmcmVzaCkKLQkJCVRuZ1V0aWwucmVmcmVzaFVuY2F0ZWdvcml6ZWRUb29sTWVudG9yc0l0ZW1Qcm92aWRlcihVbWFVdGlsCi0JCQkJCS5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIHRhcmdldCksIG1zZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IG51bGw7Ci0JCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWlmIChjb2xsZWN0aW9uIGluc3RhbmNlb2YgTGlzdCkgewotCQkJY2hpbGRyZW4gPSAoTGlzdCkgY29sbGVjdGlvbjsKLQkJfSBlbHNlIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdChjb2xsZWN0aW9uKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5zb3J0KGNoaWxkcmVuLCBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldEd1aWRhbmNlVHlwZUNvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0lFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9JRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyM2Y3NzcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0lFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLS8qKgotICogVGhlIGJhc2UgaW50ZXJmYWNlIGZvciBhIG1ldGhvZCBlbGVtZW50IGl0ZW0gcHJvdmlkZXIuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRWxlbWVudEl0ZW1Qcm92aWRlciB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1JvbGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1JvbGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGRhM2FjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Sb2xlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHJvbGUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlJvbGVJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCBjb250ZW50UGtnID0gKEVPYmplY3QpIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQlpZiAoY29udGVudFBrZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCS5nZXRBZGFwdGVyKGNvbnRlbnRQa2csIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJcmV0dXJuIGl0ZW1Qcm92aWRlciAhPSBudWxsID8gaXRlbVByb3ZpZGVyLmdldFJvbGVzKCkgOiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX1JvbGVfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Sb2xlSXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQkJCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Sb2xlc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvUm9sZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTRmNTNmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Sb2xlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIlJvbGVzIiBmb2xkZXIgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUm9sZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUm9sZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUm9sZSgpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgUm9sZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUk9MRTsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwgYmFzZU5hbWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5lbGVtZW50LlRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyI25ld0NoaWxkQWRkZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoaWxkcmVuQ2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCVRuZ1V0aWwucmVmcmVzaFVuY2F0ZWdvcml6ZWRSb2xlc0l0ZW1Qcm92aWRlcihVbWFVdGlsCi0JCQkJLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgdGFyZ2V0KSwgbXNnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXN1cGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvU2VjdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvU2VjdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZmE0ZmRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1NlY3Rpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgc2VjdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VjdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuU2VjdGlvbkl0ZW1Qcm92aWRlciB7Ci0KLQlwdWJsaWMgU2VjdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9TZWN0aW9uX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1Rhc2tJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1Rhc2tJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTJkYjI3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UYXNrSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHRhc2suCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tJdGVtUHJvdmlkZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlRhc2tJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGFza0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCBjb250ZW50UGtnID0gKEVPYmplY3QpIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQlpZiAoY29udGVudFBrZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCS5nZXRBZGFwdGVyKGNvbnRlbnRQa2csIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJcmV0dXJuIGl0ZW1Qcm92aWRlciAhPSBudWxsID8gaXRlbVByb3ZpZGVyLmdldFRhc2tzKCkgOiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUNvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuQ2xhc3MsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXIpCi0JICovCi0JLy8gcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3Qgb2JqZWN0LCBFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkvLyBDbGFzcyBjb21tYW5kQ2xhc3MsIENvbW1hbmRQYXJhbWV0ZXIgY29tbWFuZFBhcmFtZXRlcikgewotCS8vIC8vIGlmKGNvbW1hbmRDbGFzcyA9PSBSZW1vdmVDb21tYW5kLmNsYXNzKSB7Ci0JLy8gLy8gY29tbWFuZFBhcmFtZXRlci5zZXRPd25lcigoKEVPYmplY3Qpb2JqZWN0KS5lQ29udGFpbmVyKCkpOwotCS8vIC8vIH0KLQkvLyBDb21tYW5kIGNtZCA9IHN1cGVyLmNyZWF0ZUNvbW1hbmQob2JqZWN0LCBkb21haW4sIGNvbW1hbmRDbGFzcywKLQkvLyBjb21tYW5kUGFyYW1ldGVyKTsKLQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NyZWF0ZUNvbW1hbmQ6ICIgKwotCS8vIGNvbW1hbmRDbGFzcyArICIsIGNhbiBleGVjdXRlOiAiICsgY21kLmNhbkV4ZWN1dGUoKSArICIsIG93bmVyOiAiICsKLQkvLyBjb21tYW5kUGFyYW1ldGVyLmdldE93bmVyKCkgKyAiLCBjb2xsZWN0aW9uOiAiICsKLQkvLyBjb21tYW5kUGFyYW1ldGVyLmdldENvbGxlY3Rpb24oKSk7Ci0JLy8gcmV0dXJuIGNtZDsKLQkvLyB9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX1Rhc2tfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlRhc2tJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLS8vCQlzd2l0Y2gobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0vLwkJY2FzZSBFdmVudFR5cGVzLk1BS0VfUFJPWFk6Ci0vLwkJCS8vIHJlZnJlc2ggcGFyZW50Ci0vLwkJCS8vCi0vLwkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBnZXRQYXJlbnQobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpLCB0cnVlLCBmYWxzZSkpOwotLy8JCQkKLS8vCQkJLy8gcmVmcmVzaCBpdHNlbGYKLS8vCQkJLy8KLS8vCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCB0cnVlKSk7Ci0vLwkJCQotLy8JCQlyZXR1cm47Ci0vLwkJfQotCQkKLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCQkKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1Rhc2tzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UYXNrc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NTIxMDc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1Rhc2tzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJUYXNrcyIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tzSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGFza3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSBjb250ZW50UGtnKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Rhc2tzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1Rhc2tzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVGFzaygpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5lbGVtZW50LlRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBUYXNrOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19UQVNLOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCAoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmVsZW1lbnQuVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIjbmV3Q2hpbGRBZGRlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hpbGRyZW5DaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJLy8gcmVmcmVzaCB0aGUgdW5jYXRlZ29yaXplZCB0YXNrcyBncm91cAotCQkvLwotCQlUbmdVdGlsLnJlZnJlc2hVbmNhdGVnb3JpemVkVGFza3NJdGVtUHJvdmlkZXIoVW1hVXRpbAotCQkJCS5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIHRhcmdldCksIG1zZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1RyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOWRkY2VhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1RyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiQ29udGVudCBQYWNrYWdlcyIgc3ViIGZvbGRlcnMgaW4gdGhlCi0gKiBMaWJyYXJ5IHZpZXcuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW5hbWVkIGFzIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKG1zZy5nZXROb3RpZmllcigpID09IHRhcmdldCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoQ29udGVudFBhY2thZ2UuY2xhc3MpOwotCQkJaWYgKGZlYXR1cmVJZCA9PSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUykgewotCQkJCWJvb2xlYW4gbm90aWZ5ID0gZmFsc2U7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLQkJCQkJT2JqZWN0IG9iaiA9IG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJb2JqID0gbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCW5vdGlmeSA9IGFjY2VwdEFzQ2hpbGQob2JqKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJZm9yX2NoZWNrOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJaWYgKGFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCQkJCQkJbm90aWZ5ID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmb3JfY2hlY2s7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWZvcl9jaGVjazogZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCWlmIChhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZm9yX2NoZWNrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLQkJCQkJaWYobXNnLmdldE5ld1ZhbHVlKCkgIT0gbXNnLmdldE9sZFZhbHVlKCkpIHsKLQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChub3RpZnkpIHsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihtc2csIHRoaXMsIHRydWUsCi0JCQkJCQkJZmFsc2UpKTsKLQkJCQkJY2hpbGRyZW5DaGFuZ2VkKG1zZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjaGlsZHJlbkNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gQ29udGVudFBhY2thZ2UuY2xhc3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Xb3JrUHJvZHVjdEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTNhZGFiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Xb3JrUHJvZHVjdEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHdvcmsgcHJvZHVjdC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLldvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5kZWxlZ2F0ZUl0ZW1Qcm92aWRlciA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoZGVsZWdhdGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRlbGVnYXRlSXRlbVByb3ZpZGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJaWYgKGVPYmogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkuZ2V0QWRhcHRlcihlT2JqLCBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCWlmIChpdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGl0ZW1Qcm92aWRlci5nZXRXb3JrUHJvZHVjdHMoKTsKLQkJfQotCQlyZXR1cm4gZU9iajsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX0FydGlmYWN0X3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9EZWxpdmVyYWJsZV90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgT3V0Y29tZSkgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9PdXRjb21lX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlpZiAoKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSAhPSBudWxsKSB7Ci0JCQkJVVJJIGltZ1VyaSA9IFRuZ1V0aWwuZ2V0RnVsbFBhdGhvZk5vZGVvclNoYXBlSWNvblVSSSgKLQkJCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCwKLQkJCQkJCSgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkpOwotCQkJCU9iamVjdCBpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U2hhcmVkSW1hZ2UoaW1nVXJpKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGltYWdlOwotCQkJfQotCQl9Ci0JCWlmIChkZWxlZ2F0ZUl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGVJdGVtUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0FydGlmYWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGVsaXZlcmFibGUiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE91dGNvbWUpIHsKLQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L091dGNvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCQkKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1dvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0YTkzNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJXb3JrIFByb2R1Y3RzIiBmb2xkZXIgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQ29udGVudFBhY2thZ2UgY29udGVudFBrZykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdHNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFydGlmYWN0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRGVsaXZlcmFibGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVPdXRjb21lKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLmVsZW1lbnQuVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfQVJUSUZBQ1Q7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0RFTElWRVJBQkxFOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE91dGNvbWUpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX09VVENPTUU7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1dPUktQUk9EVUNUOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCAoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmVsZW1lbnQuVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIjbmV3Q2hpbGRBZGRlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hpbGRyZW5DaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJVG5nVXRpbC5yZWZyZXNoVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlcnMoVW1hVXRpbAotCQkJCS5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIHRhcmdldCksIG1zZyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyZmJmOTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZGlzcGxheSBhbmQgZWRpdGluZyBzdXBwb3J0IGZvciBjb3JlIG1ldGhvZCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2ludGVybmFsL1RuZ0FkYXB0ZXJGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2ludGVybmFsL1RuZ0FkYXB0ZXJGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMDI2YThiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pbnRlcm5hbC9UbmdBZGFwdGVyRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5PQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXhwb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBtZXRob2QgbGlicmFyeSBhZGFwdGVyIGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUbmdBZGFwdGVyRmFjdG9yeUltcGwgaW1wbGVtZW50cyBUbmdBZGFwdGVyRmFjdG9yeSB7Ci0JCi0JcHJpdmF0ZSBFeHBvc2VkQWRhcHRlckZhY3Rvcnkgd2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCi0JcHJpdmF0ZSBFeHBvc2VkQWRhcHRlckZhY3Rvcnkgb2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCi0JcHJpdmF0ZSBFeHBvc2VkQWRhcHRlckZhY3RvcnkgcGJzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeVtdIHdic0FkYXB0ZXJGYWN0b3JpZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeVtdIG9ic0FkYXB0ZXJGYWN0b3JpZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeVtdIHBic0FkYXB0ZXJGYWN0b3JpZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeVtdIHByb2NBZGFwdGVyRmFjdG9yaWVzID0gbnVsbDsKLQotCXByaXZhdGUgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IG5hdmlnYXRvckFkYXB0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBFeHBvc2VkQWRhcHRlckZhY3RvcnkgY29uZmlndXJhdGlvbkFkYXB0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBFeHBvc2VkQWRhcHRlckZhY3RvcnkgY29uZmlnUHJvY2Vzc1ZpZXdBZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IGl0ZW1zRmlsdGVyQWRhcHRlckZhY3Rvcnk7Ci0KLQlwcml2YXRlIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBwYnNGaWx0ZXJBZGFwYXRlckZhY3Rvcnk7Ci0KLQlwcml2YXRlIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBvYnNGaWx0ZXJBZGFwYXRlckZhY3Rvcnk7Ci0KLQlwcml2YXRlIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBwcm9jQWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgVG5nQWRhcHRlckZhY3RvcnlJbXBsKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcuVG5nQWRhcHRlckZhY3RvcnkjZ2V0V0JTX0FkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKHdic0FkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmICh3YnNBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCXdic0FkYXB0ZXJGYWN0b3J5ID0gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQkJCQlnZXRXQlNfQWRhcHRlckZhY3RvcmllcygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcuVG5nQWRhcHRlckZhY3RvcnkjZ2V0T0JTX0FkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG9ic0FkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChvYnNBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCW9ic0FkYXB0ZXJGYWN0b3J5ID0gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQkJCQlnZXRPQlNfQWRhcHRlckZhY3RvcmllcygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9ic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcuVG5nQWRhcHRlckZhY3RvcnkjZ2V0UEJTX0FkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKHBic0FkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChwYnNBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCXBic0FkYXB0ZXJGYWN0b3J5ID0gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQkJCQlnZXRQQlNfQWRhcHRlckZhY3RvcmllcygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlbXSBnZXRXQlNfQWRhcHRlckZhY3RvcmllcygpIHsKLQkJaWYgKHdic0FkYXB0ZXJGYWN0b3JpZXMgPT0gbnVsbCkgewotCQkJV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG5ldyBXQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOwotCQkJd2JzQWRhcHRlckZhY3RvcmllcyA9IG5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCWZhY3RvcnksCi0JCQkJCS8vIG5ldyBCU1Byb2Nlc3N0eXBlc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KGZhY3RvcnkpLAotCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfTsKLQkJfQotCQlyZXR1cm4gd2JzQWRhcHRlckZhY3RvcmllczsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5W10gZ2V0T0JTX0FkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCWlmIChvYnNBZGFwdGVyRmFjdG9yaWVzID09IG51bGwpIHsKLQkJCU9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQkJCW9ic0FkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQlmYWN0b3J5LAotCQkJCQkvLyBuZXcgQlNQcm9jZXNzdHlwZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeShmYWN0b3J5KSwKLQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH07Ci0JCX0KLQkJcmV0dXJuIG9ic0FkYXB0ZXJGYWN0b3JpZXM7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeVtdIGdldFBCU19BZGFwdGVyRmFjdG9yaWVzKCkgewotCQlpZiAocGJzQWRhcHRlckZhY3RvcmllcyA9PSBudWxsKSB7Ci0JCQlQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFBCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlwYnNBZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJLy8gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJZmFjdG9yeSwKLQkJCQkJLy8gbmV3IEJTUHJvY2Vzc3R5cGVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoZmFjdG9yeSksCi0JCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9OwotCQl9Ci0JCXJldHVybiBwYnNBZGFwdGVyRmFjdG9yaWVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChuYXZpZ2F0b3JBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAobmF2aWdhdG9yQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQluYXZpZ2F0b3JBZGFwdGVyRmFjdG9yeSA9IG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJCQkJbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQkJCQkJLy8gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCW5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmF2aWdhdG9yQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNnZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCS8vIHB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldEZpbHRlclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkvLyBpZihmaWx0ZXJBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JLy8gc3luY2hyb25pemVkKHRoaXMpIHsKLQkvLyBpZihmaWx0ZXJBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JLy8gZmlsdGVyQWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkvLyBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JLy8gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkvLyBuZXcgY29tLmlibS5saWJyYXJ5LmVkaXQuZmlsdGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JLy8gbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpCi0JLy8gfSk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGZpbHRlckFkYXB0ZXJGYWN0b3J5OwotCS8vIH0KLQkvLyAgICAKLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRDb25maWd1cmF0aW9uVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAoY29uZmlndXJhdGlvbkFkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChjb25maWd1cmF0aW9uQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQljb25maWd1cmF0aW9uQWRhcHRlckZhY3RvcnkgPSBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCQkJCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb25maWd1cmF0aW9uQWRhcHRlckZhY3Rvcnk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2dldE5hdmlnYXRvclZpZXdfRmlsdGVyQWRhcHRlckZhY3RvcnkoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0Q29uZmlndXJhdGlvblZpZXdfQWRhcHRlckZhY3RvcnkoSUZpbHRlciBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJBZGFwdGVyRmFjdG9yeSgKLQkJCQlnZXRDb25maWd1cmF0aW9uVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGZpbHRlcik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmlsdGVySXRlbVByb3ZpZGVyIGltcGxlbWVudHMgQWRhcHRlciwKLQkJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldCBDTEFTU0VTX0VYQ0xVREVEX0ZST01fU09SVElORyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJc3RhdGljIHsKLQkJCUNMQVNTRVNfRVhDTFVERURfRlJPTV9TT1JUSU5HLmFkZChBY3Rpdml0eS5jbGFzcyk7Ci0JCQlDTEFTU0VTX0VYQ0xVREVEX0ZST01fU09SVElORy5hZGQoQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MpOwotCQl9Ci0KLQkJcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXI7Ci0KLQkJcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCQlwcml2YXRlIGJvb2xlYW4gaXNBZGFwdGVyQ29uZmlndXJhYmxlOwotCi0JCUZpbHRlckl0ZW1Qcm92aWRlcihJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIsIElGaWx0ZXIgZmlsdGVyKSB7Ci0JCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotCQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDb25maWd1cmFibGUpIHsKLQkJCQlpc0FkYXB0ZXJDb25maWd1cmFibGUgPSB0cnVlOwotCQkJCSgoSUNvbmZpZ3VyYWJsZSkgYWRhcHRlcikuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQl9Ci0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJYWRhcHRlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjZ2V0VGFyZ2V0KCkKLQkJICovCi0JCXB1YmxpYyBOb3RpZmllciBnZXRUYXJnZXQoKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRUYXJnZXQoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNzZXRUYXJnZXQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSB7Ci0JCQlhZGFwdGVyLnNldFRhcmdldChuZXdUYXJnZXQpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiBhZGFwdGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlMaXN0IGNoaWxkcmVuID0gbnVsbDsKLQkJCWZha2VfbG9vcDogZG8gewotCQkJCQotCQkJCS8vIE9yZGVyIGlzIG5vdCBpbXBvcnRhbnQsIElmIGFkYXB0ZXIgaXMgSUxpYnJhcnlJdGVtUHJvdmlkZXIKLQkJCQkvLyBhbmQgcmVwbGFjZUNoaWxkcmVuIGlzIGZhbHNlIGFuZCBJQ29uZmlndXJhYmxlLCBpdCBzaG91bGQgIAotCQkJCS8vIGdvIHRvIGlzQWRhcHRlckNvbmZpZ3VyYWJsZSwgbm90IHRvIHJlZ3VsYXIgaXRlcmF0aW9uLgotCi0JCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IKLQkJCQkJCSYmIGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCQlJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IChJQ29uZmlndXJhdG9yKSBmaWx0ZXI7Ci0JCQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlib29sZWFuIHJlcGxhY2VDaGlsZHJlbiA9IGZhbHNlOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKQotCQkJCQkJCS5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIKLQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCUNvbGxlY3Rpb24gb3RoZXJDaGlsZHJlbiA9IGNvbmZpZ3VyYXRvci5nZXRDaGlsZHJlbigKLQkJCQkJCQkJb2JqZWN0LCBmZWF0dXJlKTsKLQkJCQkJCWlmIChvdGhlckNoaWxkcmVuICE9IG51bGwpIHsKLQkJCQkJCQlyZXBsYWNlQ2hpbGRyZW4gPSB0cnVlOwotCQkJCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSVdyYXBwZXIpIHsKLQkJCQkJCQkJSVdyYXBwZXIgd3JhcHBlciA9IChJV3JhcHBlcikgYWRhcHRlcjsKLQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG90aGVyQ2hpbGRyZW4KLQkJCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJT2JqZWN0IGNoaWxkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQkJY2hpbGRyZW4uYWRkKHdyYXBwZXIud3JhcCgoRU9iamVjdCkgb2JqZWN0LAotCQkJCQkJCQkJCQlmZWF0dXJlLCBjaGlsZCwKLQkJCQkJCQkJCQkJQ29tbWFuZFBhcmFtZXRlci5OT19JTkRFWCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJY2hpbGRyZW4uYWRkQWxsKG90aGVyQ2hpbGRyZW4pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocmVwbGFjZUNoaWxkcmVuKSB7Ci0JCQkJCQlicmVhayBmYWtlX2xvb3A7Ci0JCQkJCX0KLQkJCQl9IAotCQkJCWlmIChpc0FkYXB0ZXJDb25maWd1cmFibGUpIHsKLQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJCQlpZiAoY29sbGVjdGlvbiBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJCWNoaWxkcmVuID0gKExpc3QpIGNvbGxlY3Rpb247Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoY29sbGVjdGlvbik7Ci0JCQkJCX0KLQkJCQkJYnJlYWsgZmFrZV9sb29wOwotCQkJCX0KLQkJCQkKLQkJCQkvLyByZWd1bGFyIGFkYXB0ZXIKLQkJCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGVsZW1lbnQpKSB7Ci0JCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSB3aGlsZSAoZmFsc2UpOwotCi0JCQkvLyBhbHBoYWJldGljYWxseSBzb3J0IHRoZSBjaGlsZHJlbgotCQkJLy8KLQkJCWlmICghVG5nVXRpbC5pc0luc3RhbmNlT2YoQ0xBU1NFU19FWENMVURFRF9GUk9NX1NPUlRJTkcsIFRuZ1V0aWwKLQkJCQkJLnVud3JhcChvYmplY3QpKSkgewotCQkJCUNvbGxlY3Rpb25zLnNvcnQoY2hpbGRyZW4sCi0JCQkJCQlDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJCX0KLQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJGaWx0ZXJJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oKSByZXR1cm5lZCAiICsKLQkJCS8vIGNoaWxkcmVuKTsKLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIjZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMob2JqZWN0LCBlZGl0aW5nRG9tYWluLAotCQkJCQlzaWJsaW5nKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIjY3JlYXRlQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuQ2xhc3MsCi0JCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyKQotCQkgKi8KLQkJcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3Qgb2JqZWN0LAotCQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgQ2xhc3MgY29tbWFuZENsYXNzLAotCQkJCUNvbW1hbmRQYXJhbWV0ZXIgY29tbWFuZFBhcmFtZXRlcikgewotCQkJcmV0dXJuIGFkYXB0ZXIuY3JlYXRlQ29tbWFuZChvYmplY3QsIGVkaXRpbmdEb21haW4sIGNvbW1hbmRDbGFzcywKLQkJCQkJY29tbWFuZFBhcmFtZXRlcik7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb24gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0RWxlbWVudHMob2JqZWN0KTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcgotCQkJCQkmJiBhZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkvLyBhbHdheXMgcmV0dXJuIHRydWUgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZQotCQkJCS8vCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZihvYmplY3QgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCl7Ci0JCQkJcmV0dXJuIGFkYXB0ZXIuaGFzQ2hpbGRyZW4ob2JqZWN0KTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldFRleHQob2JqZWN0KTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlEZXNjcmlwdG9yKGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCwKLQkJCQlPYmplY3QgcHJvcGVydHlJRCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHlJRCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UjZ2V0RWRpdGFibGVWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldEVkaXRhYmxlVmFsdWUob2JqZWN0KTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmlsdGVyQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeSwKLQkJCUlDaGFuZ2VOb3RpZmllciwgSURpc3Bvc2FibGUgewotCi0JCXByaXZhdGUgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBGaWx0ZXJBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJCUlGaWx0ZXIgZmlsdGVyKSB7Ci0JCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JCQlpZihhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJfQotCQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5I2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiBhZGFwdGVyRmFjdG9yeS5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSNhZGFwdChqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iamVjdCwgdHlwZSk7Ci0JCQlpZiAoYWRhcHRlciA9PSBudWxsIHx8IGFkYXB0ZXIgaW5zdGFuY2VvZiBGaWx0ZXJJdGVtUHJvdmlkZXIKLQkJCQkJfHwgIShhZGFwdGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJCXJldHVybiBuZXcgRmlsdGVySXRlbVByb3ZpZGVyKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyLCBmaWx0ZXIpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSNhZGFwdChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllciwKLQkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCQkJQWRhcHRlciBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQodGFyZ2V0LCB0eXBlKTsKLQkJCWlmIChhZGFwdGVyID09IG51bGwgfHwgYWRhcHRlciBpbnN0YW5jZW9mIEZpbHRlckl0ZW1Qcm92aWRlcgotCQkJCQl8fCAhKGFkYXB0ZXIgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQkJcmV0dXJuIG5ldyBGaWx0ZXJJdGVtUHJvdmlkZXIoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXIsIGZpbHRlcik7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5I2FkYXB0TmV3KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyLAotCQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gYWRhcHRlckZhY3RvcnkuYWRhcHROZXcodGFyZ2V0LCB0eXBlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkjYWRhcHRBbGxOZXcob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGFwdEFsbE5ldyhOb3RpZmllciBub3RpZmllcikgewotCQkJYWRhcHRlckZhY3RvcnkuYWRhcHRBbGxOZXcobm90aWZpZXIpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXIjZmlyZU5vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJYWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQkJYWRhcHRlckZhY3RvcnkuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQkJYWRhcHRlckZhY3RvcnkucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGUjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJZmlsdGVyID0gbnVsbDsKLQkJfQotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNjcmVhdGVXQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVXQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJbmV3IFdCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH07Ci0JCXJldHVybiBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3JpZXMpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVB1Ymxpc2hpbmdXQlNBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHVibGlzaGluZ1dCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQluZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmcuV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKQotCQkJCX0KLQkJKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNjcmVhdGVUQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVUQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJbmV3IE9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH07Ci0JCXJldHVybiBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3JpZXMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjY3JlYXRlUHVibGlzaGluZ1RCU0FkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVQdWJsaXNoaW5nVEJTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCW5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZy5UQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpCi0JCQkJfQotCQkpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVdQQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVXUEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCW5ldyBQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9OwotCQlyZXR1cm4gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yaWVzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUFic3RyYWN0UGx1Z2luIGF1dGhvcmluZ1BsdWdpbiA9IFByb3ZpZGVycy5nZXRBdXRob3JpbmdQbHVnaW4oKTsKLQkJaWYgKGF1dGhvcmluZ1BsdWdpbiAhPSBudWxsKSB7Ci0JCQlJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IGF1dGhvcmluZ1BsdWdpbi5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCWFkYXB0ZXJGYWN0b3J5LnNldENvbHVtbkluZGV4VG9OYW1lTWFwKFByb2Nlc3NVdGlsCi0JCQkJCS50b0NvbHVtbkluZGV4VG9OYW1lTWFwKHByZWZTdG9yZQotCQkJCQkJCS5nZXRTdHJpbmcoTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUykpKTsKLQkJfQotCQlBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJYWRhcHRlckZhY3RvcnksIG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9OwotCi0JCXJldHVybiBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3JpZXMpOwotCX0KLQotCS8vIFNlY3Rpb24gZm9yIFRORyBGaWx0ZXIgbW9kaWZpY2F0aW9uIHByb2Nlc3MuCi0JLy8gZmlsdGVyIG1vZGlmaWNhdGlvbiBjb2RlLiBTaW1pbGFyIHRvIGdldEZpbHRlclZpZXdfQWRhcHRlckZhY3RvcnkoSUZpbHRlcgotCS8vIGZpbHRlcikKLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0SXRlbXNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoSUZpbHRlciBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJBZGFwdGVyRmFjdG9yeSgKLQkJCQlnZXRJdGVtc0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGZpbHRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNnZXRJdGVtc0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRJdGVtc0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAoaXRlbXNGaWx0ZXJBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAoaXRlbXNGaWx0ZXJBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCWl0ZW1zRmlsdGVyQWRhcHRlckZhY3RvcnkgPSBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCQkJCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaXRlbXNGaWx0ZXJBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0UEJTRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyQWRhcHRlckZhY3RvcnkoZ2V0UEJTRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQlmaWx0ZXIpOwotCX0KLQotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldFBCU0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAocGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChwYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQlwYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgPSBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCQkJCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5QQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRPQlNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoSUZpbHRlciBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJBZGFwdGVyRmFjdG9yeShnZXRPQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCWZpbHRlcik7Ci0JfQotCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0T0JTRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChvYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKG9ic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCW9ic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSA9IG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJCQkJbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQkJCQkJLy8gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCW5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLk9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBvYnNGaWx0ZXJBZGFwYXRlckZhY3Rvcnk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNnZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChwcm9jQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKHByb2NBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOwotCQkJCQlBYnN0cmFjdFBsdWdpbiBhdXRob3JpbmdQbHVnaW4gPSBQcm92aWRlcnMuZ2V0QXV0aG9yaW5nUGx1Z2luKCk7Ci0JCQkJCWlmIChhdXRob3JpbmdQbHVnaW4gIT0gbnVsbCkgewotCQkJCQkJSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSBhdXRob3JpbmdQbHVnaW4KLQkJCQkJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkJCQkJYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkJLnNldENvbHVtbkluZGV4VG9OYW1lTWFwKFByb2Nlc3NVdGlsCi0JCQkJCQkJCQkJLnRvQ29sdW1uSW5kZXhUb05hbWVNYXAocHJlZlN0b3JlCi0JCQkJCQkJCQkJCQkuZ2V0U3RyaW5nKExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpKSk7Ci0JCQkJCQlwcmVmU3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIEluaXRpYWxpemUgImF1dG8gaW5oZXJpdCBzdXBwcmVzc2lvbiBzdGF0ZXMiIGZsYWcgZm9yIGNhbGN1bGF0aW5nIHN1cHByZXNzaW9uCi0JCQkJCS8vIGFuZCBhZGQgbGlzdGVuZXIgdG8gaXRzIGNoYW5nZQotCQkJCQkvLwotCQkJCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IGF1dGhvcmluZ1BsdWdpbi5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCQkJU3VwcHJlc3Npb24uc2V0QXV0b0luaGVyaXRTdXBwcmVzc2lvblN0YXRlcyhwcmVmU3RvcmUuZ2V0Qm9vbGVhbihMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEUpKTsKLQkJCQkJcHJlZlN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJaWYoTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9JTkhFUklUX1NVUFBSRVNTSU9OX1NUQVRFLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eSgpKSkgewotCQkJCQkJCQlTdXBwcmVzc2lvbi5zZXRBdXRvSW5oZXJpdFN1cHByZXNzaW9uU3RhdGVzKHByZWZTdG9yZS5nZXRCb29sZWFuKExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfSU5IRVJJVF9TVVBQUkVTU0lPTl9TVEFURSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQl9KTsKLQkJCQkKLQkJCQkJcHJvY0FkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJYWRhcHRlckZhY3RvcnksCi0JCQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH07Ci0KLQkJCQkJcHJvY0FkYXB0ZXJGYWN0b3J5ID0gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQkJCQlwcm9jQWRhcHRlckZhY3Rvcmllcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHByb2NBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJU3VwcHJlc3Npb24uY2xlYXJDYWNoZWRTdXBwcmVzc2lvbnMoKTsKLQotCQlUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQotCQlpZiAobmF2aWdhdG9yQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJbmF2aWdhdG9yQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYgKGl0ZW1zRmlsdGVyQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJaXRlbXNGaWx0ZXJBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQlpdGVtc0ZpbHRlckFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKG9ic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlvYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJb2JzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKHBic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlwYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJcGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJfQotCQkKLQkJCi0JCWlmIChjb25maWdQcm9jZXNzVmlld0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCWNvbmZpZ1Byb2Nlc3NWaWV3QWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYgKGNvbmZpZ3VyYXRpb25BZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQljb25maWd1cmF0aW9uQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYgKHdic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXdic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCXdic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJfQotCi0JCWlmIChvYnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlvYnNBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQlvYnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCX0KLQotCQlpZiAocGJzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGJzQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJcGJzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQl9Ci0KLQkJaWYgKHByb2NBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkvLyByZW1vdmUgYWRhcHRlciBmYWN0b3J5IGFzIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmcm9tCi0JCQkvLyBwcmVmZXJlbmNlIHN0b3JlCi0JCQkvLwotCQkJQWJzdHJhY3RQbHVnaW4gYXV0aG9yaW5nUGx1Z2luID0gUHJvdmlkZXJzLmdldEF1dGhvcmluZ1BsdWdpbigpOwotCQkJaWYgKGF1dGhvcmluZ1BsdWdpbiAhPSBudWxsKSB7Ci0JCQkJSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSBhdXRob3JpbmdQbHVnaW4KLQkJCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2NBZGFwdGVyRmFjdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCU9iamVjdCBhZGFwdGVyRmFjdG9yeSA9IHByb2NBZGFwdGVyRmFjdG9yaWVzW2ldOwotCQkJCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikgewotCQkJCQkJcHJlZlN0b3JlCi0JCQkJCQkJCS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKChJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikgYWRhcHRlckZhY3RvcnkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcHJvY0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCXByb2NBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVB1Ymxpc2hpbmdDQlNBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHVibGlzaGluZ0NCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQluZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmcuQ0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKQotCQkJCX0KLQkJKTsKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjY3JlYXRlUHVibGlzaGluZ1dQQlNBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHVibGlzaGluZ1dQQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQkJbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nLldQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpCi0JCQkJfQotCQkpOwotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNjbGVhblVwKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhblVwKCkgewotCQlTdXBwcmVzc2lvbi5jbGVhblVwKCk7Ci0KLQkJaWYgKG5hdmlnYXRvckFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCW5hdmlnYXRvckFkYXB0ZXJGYWN0b3J5LmNsZWFuVXAoKTsKLQkJfQotCi0JCWlmIChpdGVtc0ZpbHRlckFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCWl0ZW1zRmlsdGVyQWRhcHRlckZhY3RvcnkuY2xlYW5VcCgpOwotCQl9Ci0JCQotCQlpZiAob2JzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCW9ic0ZpbHRlckFkYXBhdGVyRmFjdG9yeS5jbGVhblVwKCk7Ci0JCX0KLQkJCi0JCWlmIChwYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5LmNsZWFuVXAoKTsKLQkJfQotCQkKLQkJCi0JCWlmIChjb25maWdQcm9jZXNzVmlld0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCWNvbmZpZ1Byb2Nlc3NWaWV3QWRhcHRlckZhY3RvcnkuY2xlYW5VcCgpOwotCQl9Ci0KLQkJaWYgKGNvbmZpZ3VyYXRpb25BZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQljb25maWd1cmF0aW9uQWRhcHRlckZhY3RvcnkuY2xlYW5VcCgpOwotCQl9Ci0KLQkJaWYgKHdic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXdic0FkYXB0ZXJGYWN0b3J5LmNsZWFuVXAoKTsKLQkJfQotCi0JCWlmIChvYnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlvYnNBZGFwdGVyRmFjdG9yeS5jbGVhblVwKCk7Ci0JCX0KLQotCQlpZiAocGJzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGJzQWRhcHRlckZhY3RvcnkuY2xlYW5VcCgpOwotCQl9Ci0KLQkJaWYgKHByb2NBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlwcm9jQWRhcHRlckZhY3RvcnkuY2xlYW5VcCgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaW50ZXJuYWwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2ludGVybmFsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODI0ZmU2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaW50ZXJuYWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZGlzcGxheSBhbmQgZWRpdGluZyBzdXBwb3J0IGZvciBtZXRob2QgbGlicmFyeSBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMjBhNGI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYW4gYWN0aXZpdHkgaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbgotICogZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3QgY2hpbGQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlpZihjaGlsZCBpbnN0YW5jZW9mIE1pbGVzdG9uZSlyZXR1cm4gdHJ1ZTsKLQkJCi0JCXJldHVybiBzdXBlci5hY2NlcHRBc0NoaWxkKGNoaWxkKTsKLQl9Ci0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCUNvbGxlY3Rpb24gY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJRmlsdGVyVXRpbAotCQkJCS5pdGVyYXRlQ29sbGVjdGlvbihjb2wsIFByb2Nlc3NVdGlsLmdldEZpbHRlcihhZGFwdGVyRmFjdG9yeSkpOwotCQlyZXR1cm4gY29sOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgwNDYxZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBicmVha2Rvd24gc3RydWN0dXJlIGFjdGl2aXR5IGluIHRoZQotICogbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBhZGRJbmhlcml0ZWQoT2JqZWN0IG9iamVjdCwgTGlzdCBteUNoaWxkcmVuKSB7Ci0JCUNvbGxlY3Rpb24gY29sID0gc3VwZXIuYWRkSW5oZXJpdGVkKG9iamVjdCwgbXlDaGlsZHJlbik7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQlzdXBlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZDE3NTFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJDYXBhYmlsaXR5IFBhdHRlcm5zIiBhbmQgIkRlbGl2ZXJ5Ci0gKiBQcm9jZXNzZXMiIGZvbGRlcnMgaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLAotCQlJQ29uZmlndXJhYmxlIHsKLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCS8vIHByaXZhdGUgU3RyaW5nW10gcGtnUGF0aDsKLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBPYmplY3QgaW1hZ2U7Ci0KLQkvLyBwcml2YXRlIE1ldGhvZFBsdWdpbiBwbHVnaW47Ci0JcHJpdmF0ZSBNZXRob2RQYWNrYWdlIHBrZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kUGFja2FnZSBwa2csIFN0cmluZyBuYW1lLCBPYmplY3QgaW1hZ2UpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQlsYWJlbCA9IG5hbWU7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQkJdGhpcy5wa2cgPSBwa2c7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCU9iamVjdCBjaGlsZCA9IGVsZW1lbnQ7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQljaGlsZCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZWxlbWVudCkuZ2V0UHJvY2VzcygpOwotCQkJfQotCQkJaWYgKGZpbHRlci5hY2NlcHQoY2hpbGQpKSB7Ci0JCQkJaWYgKCFpc0VtcHR5UGFja2FnZShjaGlsZCkpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBjaGlsZFBhY2thZ2VzKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9ICgoUHJvY2Vzc1BhY2thZ2UpIG9iamVjdCkuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCW5ld0xpc3QuYWRkQWxsKGNoaWxkcmVuKTsKLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXdMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWlmICghZmlsdGVyLmFjY2VwdChpdGVyLm5leHQoKSkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eVBhY2thZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCB8fCBvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzKQotCQkJcmV0dXJuIGZhbHNlOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gdGhpcy5jaGlsZFBhY2thZ2VzKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJaWYgKCFpc0VtcHR5UGFja2FnZShpdGVyLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE5ld0NoaWxkRGVzY3JpcHRvcnModGFyZ2V0LCBlZGl0aW5nRG9tYWluLCBzaWJsaW5nKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGxhYmVsICE9IG51bGwpCi0JCQlyZXR1cm4gbGFiZWw7Ci0JCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiZWRjZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5UcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSBjb250ZW50IGNhdGVnb3J5IGZvbGRlcnMgaW4gdGhlIG1ldGhvZAotICogZWxlbWVudCBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUNvbmZpZ3VyYWJsZSB7Ci0KLQlJRmlsdGVyIGZpbHRlcjsKLQotCU9iamVjdCBpbWFnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCS8vIHJldHVybiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSB8fCAob2JqIGluc3RhbmNlb2YKLQkJLy8gRGlzY2lwbGluZSAmJgotCQkvLyBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKW9iaikuaXNFbXB0eSgpKTsKLQkJaWYgKCF0aGlzLmZpbHRlci5hY2NlcHQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUKLQkJCQkmJiAhQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZUdyb3VwcygoRGlzY2lwbGluZSkgb2JqKQotCQkJCQkJLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQKLQkJCQkmJiAhQXNzb2NpYXRpb25IZWxwZXIuZ2V0Um9sZVNldEdyb3VwcygoUm9sZVNldCkgb2JqKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYWNjZXB0KG9iaik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGNvbnRlbnRBZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoY29udGVudEFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGNvbnRlbnRBZGFwdGVyKS5zZXRQYXJlbnQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQl0aGlzLmltYWdlID0gb2JqZWN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNjg5ZTRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBjb250ZW50IGNhdGVnb3J5IGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElDb25maWd1cmFibGUgewotCi0JSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZXMoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gZmlsdGVyLmFjY2VwdChvYmopOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgY29udGVudEFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KG9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChjb250ZW50QWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgY29udGVudEFkYXB0ZXIpLnNldFBhcmVudChvYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ29udGVudEVsZW1lbnRzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ29udGVudEVsZW1lbnRzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzN2UwOTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBmb2xkZXJzIGluIHRoZSBtZXRob2QKLSAqIGVsZW1lbnQgc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudEVsZW1lbnRzSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJQ29uZmlndXJhYmxlIHsKLQotCUlGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIENvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU5vdGlmaWVyIHBhcmVudCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBDb250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW5Db2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gY2hpbGRyZW5Db2wuaXRlcmF0b3IoKTsgaXRlcjEuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlcjEubmV4dCgpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSUNvbmZpZ3VyYWJsZSkKLQkJCQkoKElDb25maWd1cmFibGUpIGNoaWxkKS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpCi0JCQkJaXRlcjEucmVtb3ZlKCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuQ29sOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDE3ZTYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBjb250ZW50IHBhY2thZ2UgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IGdldENoaWxkcmVuSW5jbHVkaW5nRW1wdHlPbmVzKG9iamVjdCk7Ci0KLQkJLy8gcmVtb3ZlIHRoZSBlbXB0eSBwYWNrYWdlcyBmcm9tIHRoZSBjaGlsZHJlbiBsaXN0Ci0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJaWYgKGlzRW1wdHlQYWNrYWdlKGl0ZXIubmV4dCgpKSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldENoaWxkcmVuSW5jbHVkaW5nRW1wdHlPbmVzKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGl0ZXIubmV4dCgpKSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0VtcHR5UGFja2FnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW5JbmNsdWRpbmdFbXB0eU9uZXMob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoIWlzRW1wdHlQYWNrYWdlKGl0ZXIubmV4dCgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0N1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjNjOTI2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGN1c3RvbSBjYXRlZ29yeSBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlIHsKLQotCUlGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyBTZXQgdGhlIGNoaWxkcmVuU3RvcmVNYXAgdG8gbnVsbCwgdG8gZ2V0IHRoZSB1cGRhdGVkIGN1c3RvbWNhdGVnb3JpZXMKLQkJY2hpbGRyZW5TdG9yZU1hcCA9IG51bGw7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZiAodGhpcy5maWx0ZXIgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlciBvYmogPSAoRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgaXRlcgotCQkJCQkJLm5leHQoKTsKLQkJCQlpZiAoIXRoaXMuZmlsdGVyLmFjY2VwdChvYmouZ2V0VmFsdWUoKSkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2ZjU4MzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0Rpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZGlzY2lwbGluZSBncm91cGluZyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSwgSUxpYnJhcnlJdGVtUHJvdmlkZXIsIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZXMoKSk7Ci0JCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbjsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChvYmplY3QpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCi0JCQkvLyBUT0RPOiBjb21tZW50ZWQgb3V0IHVudGlsIEppbmh1YSBmaXhlZCBidWdzIGluCi0JCQkvLyBDb25maWd1cmF0aW9uRmlsdGVyCi0JCQlpZiAoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCQljaGlsZHJlbiA9IGNvbmZpZ3VyYXRvci5nZXRDaGlsZHJlbihvYmplY3QsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCkpOwotCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKCk6IHJldHVybmVkIGZyb20gY29uZmlndXJhdG9yOiAiICsgY2hpbGRyZW4pOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBjaGlsZHJlbjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCURpc2NpcGxpbmVHcm91cGluZyBncm91cGluZyA9IChEaXNjaXBsaW5lR3JvdXBpbmcpIG9iamVjdDsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZiA9IChNZXRob2RDb25maWd1cmF0aW9uKSAoKENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIGdldFBhcmVudChvYmplY3QpKQotCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCQlUbmdVdGlsLmFkZEV4dGVuZGVkQ2hpbGRyZW4oZ3JvdXBpbmcsIG1ldGhvZENvbmYsIGNoaWxkcmVuLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0KLQkJCS8vIHNldCBwYXJlbnQKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGl0ZXIubmV4dCgpLAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudCh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfSBlbHNlIHsKLQkJCUNvbGxlY3Rpb24gY2hpbGRyZW5Db2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW5Db2wuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGZpbHRlciAhPSBudWxsKQotCQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKQotCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbkNvbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5sbGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5sbGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQkJLy8gaWYob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkvLyBNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIG9iamVjdCk7Ci0JCS8vIGlmKHBsdWdpbiAhPSBudWxsKSB7Ci0JCS8vIFN0cmluZ1tdIHBhdGggPSB7Ci0JCS8vIFRuZ0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJLy8gLFRuZ0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpCi0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJLy8gLFRuZ0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKQotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vIH07Ci0JCS8vIE9iamVjdCBhZGFwdGVyID0KLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0SXRlbXNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKS5hZGFwdChwbHVnaW4sCi0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCS8vIC8vIElHcm91cENvbnRhaW5lciBncm91cHMgPSAoSUdyb3VwQ29udGFpbmVyKQotCQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpLmFkYXB0KHBsdWdpbiwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gLy8gaW50IGk7Ci0JCS8vIC8vIGZvcihpID0gMDsgaSA8IHBhdGgubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCS8vIC8vIGdyb3VwcyA9IChJR3JvdXBDb250YWluZXIpIGdyb3Vwcy5nZXRHcm91cEl0ZW1Qcm92aWRlcihwYXRoW2ldKTsKLQkJLy8gLy8gaWYoZ3JvdXBzID09IG51bGwpIHJldHVybiBudWxsOwotCQkvLyAvLyB9Ci0JCS8vIC8vIHJldHVybiAoSXRlbVByb3ZpZGVyQWRhcHRlcikgZ3JvdXBzLmdldEdyb3VwSXRlbVByb3ZpZGVyKHBhdGhbaV0pOwotCQkvLyByZXR1cm4gVG5nVXRpbC5nZXRBZGFwdGVyKHBsdWdpbiwgcGF0aCk7Ci0JCS8vIC8vcmV0dXJuIGFkYXB0ZXI7Ci0JCS8vIH0KLQkJLy8gfQotCi0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9EaXNjaXBsaW5lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NmIyOWQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9EaXNjaXBsaW5lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZGlzY2lwbGluZSBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uRGlzY2lwbGluZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQlPYmplY3QgcGFyZW50OwotCi0JcHVibGljIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY29sOwotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG9iamVjdCk7Ci0JCQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCQkJY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCQotCQl9IGVsc2UgewotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIChUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRSkKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KG9iamVjdCwKLQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJY29sID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJRmlsdGVyVXRpbC5pdGVyYXRlQ29sbGVjdGlvbihjb2wsIGZpbHRlcik7Ci0JCX0KLQotCQlyZXR1cm4gY29sOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCURpc2NpcGxpbmUgZGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKSBvYmplY3Q7Ci0JCWlmIChkaXNjaXBsaW5lLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCQlNZXRob2RQbHVnaW4gbW9kZWwgPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihkaXNjaXBsaW5lKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQlzdXBlci5zZXRQYXJlbnQocGFyZW50KTsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRG9tYWluSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRG9tYWluSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyYmY4ZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZG9tYWluIGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkRvbWFpbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmFibGUgewotCU9iamVjdCBwYXJlbnQ7Ci0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBEb21haW5JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJRG9tYWluIGRvbWFpbiA9IChEb21haW4pIG9iamVjdDsKLQkJaWYgKGRvbWFpbi5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCQlNZXRob2RQbHVnaW4gbW9kZWwgPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihkb21haW4pOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXN1cGVyLnNldFBhcmVudChwYXJlbnQpOwotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY29sOwotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG9iamVjdCk7Ci0JCQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCQkJY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCQotCQl9IGVsc2UgewotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIChUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRSkKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KG9iamVjdCwKLQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJY29sID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0JCS8vIElmIGZpbHRlciBub3QgbnVsbCBpdGVyYXRlIGNvbGxlY3Rpb24uCi0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJRmlsdGVyVXRpbC5pdGVyYXRlQ29sbGVjdGlvbihjb2wsIGZpbHRlcik7Ci0JCX0KLQotCQlyZXR1cm4gY29sOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2YyYzJkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVyQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgZ2xvYmFsIGNvbnN0YW50cyB1c2VkIGluIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJDb25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NBVEVHT1JJRVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfY3VzdG9tY2F0ZWdvcmllc190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT19QTFVHSU5TID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX21ldGhvZHBsdWdpbnNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9QQUNLQUdFUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19jb250ZW50cGFja2FnZXNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRVNFVFMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfcm9sZXNldHNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ0lQTElORVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZXNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS1BST0RVQ1RUWVBFUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHR5cGVzX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPTUFJTlMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfZG9tYWluc190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c190b29sc190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfRUxFTUVOVFMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfYWxsX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3JvbGVzX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3Rhc2tzX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktQUk9EVUNUUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJREFOQ0UgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfZ3VpZGFuY2VfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU0VTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3Byb2Nlc3Nlc190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUlMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RkZXNjcmlwdG9yc190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX0RFU0NSSVBUT1JTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3JvbGVkZXNjcmlwdG9yc190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0RFU0NSSVBUT1JTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3Rhc2tkZXNjcmlwdG9yc190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkxZX0NPTlRFTlRfRUxFTUVOVFMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfY29udGVudGVsZW1lbnRzX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19DT05URU5UX0VMRU1FTlQgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfYWxsY29udGVudGVsZW1lbnRzX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPQURNQVAgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfcm9hZG1hcF90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS0xJU1RTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2NoZWNrbGlzdHNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OQ0VQVFMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfY29uY2VwdHNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJBQ1RJQ0VTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3ByYWN0aWNlc190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlRTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3JlcG9ydHNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVVU0FCTEVfQVNTRVRTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3JldXNhYmxlYXNzZXRzX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdISVRFX1BBUEVSUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c193aGl0ZXBhcGVyc190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfdGVtcGxhdGVzX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURFTElORVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfZ3VpZGVsaW5lc190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBQT1JUSU5HX01BVEVSSUFMUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19zdXBwb3J0aW5nbWF0ZXJpYWxzX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xfTUVOVE9SUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c190b29sbWVudG9yc190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWEFNUExFUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19leGFtcGxlc190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX1NFVF9HUk9VUElOR1MgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfcm9sZXNldGdyb3B1aW5nc190ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDSVBMSU5FX0dST1VQSU5HUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lZ3JvdXBpbmdzX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nCi0KLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBHVUlEQU5DRV9UWVBFUyA9IG5ldyBTdHJpbmdbXXsKLQkvLyBDSEVDS0xJU1RTLCBDT05DRVBUUywgRVhBTVBMRVMsIFBSQUNUSUNFUywgUkVQT1JUUywgUkVVU0FCTEVfQVNTRVRTLAotCS8vIFNVUFBPUlRJTkdfTUFURVJJQUxTLCBURU1QTEFURVMsIFRPT0xfTUVOVE9SUywgV0hJVEVfUEFQRVJTLAotCS8vIEdVSURFTElORVMsUk9BRE1BUH07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTlRFTlRfRUxFTUVOVFMgPSBuZXcgU3RyaW5nW10geyBST0xFUywKLQkJCVRBU0tTLCBXT1JLUFJPRFVDVFMsIEdVSURBTkNFLCBTVVBQT1JUSU5HX01BVEVSSUFMUywKLQkJCU9OTFlfQ09OVEVOVF9FTEVNRU5UUywgVE9PTF9NRU5UT1JTIH07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTlRFTlRfQ0FURUdPUklFUyA9IG5ldyBTdHJpbmdbXSB7IFJPTEVTRVRTLAotCQkJV09SS1BST0RVQ1RUWVBFUywgRElTQ0lQTElORVMsIFRPT0xTLCBET01BSU5TIH07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEJSRUFLRE9XTl9FTEVNRU5UUyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQlXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUlMsIFRBU0tfREVTQ1JJUFRPUlMsIFJPTEVfREVTQ1JJUFRPUlMgfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBjb250ZW50RWxlbWVudFN0cnMgPSBBcnJheXMKLQkJCS5hc0xpc3QoQ09OVEVOVF9FTEVNRU5UUyk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgY2F0ZWdvcnlTdHJzID0gQXJyYXlzLmFzTGlzdChDT05URU5UX0NBVEVHT1JJRVMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gQXJyYXlzCi0JCQkuYXNMaXN0KEJSRUFLRE9XTl9FTEVNRU5UUyk7Ci0KLQlwdWJsaWMgc3RhdGljIEhhc2hNYXAgaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3BhY2UgPSAiLSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFU1RJTUFURV9DT05TSURFUkFUSU9OUyA9IExpYnJhcnlFZGl0UGx1Z2luCi0JCQkuZ2V0UGx1Z2luKCkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVSTV9ERUZJTklUSU9OUyA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpCi0JCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1Rlcm1EZWZpbml0aW9ucyIpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOWV9TVFJJTkcgPSAiKiI7ICAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOWV9DSEFSQUNURVIgPSAiPyI7ICAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVySGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlkMzEzNGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciBtYW5hZ2luZyBlbGVtZW50IGZpbHRlcmluZyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uCi0gKiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZpbHRlckhlbHBlciB7Ci0KLQlwcml2YXRlIFN0cmluZyBwYXR0ZXJuOwotCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLQotCXByaXZhdGUgUGF0dGVybiByZWdleDsKLQotCXByaXZhdGUgU3RyaW5nIHRhYlN0cjsKLQotCXByaXZhdGUgT2JqZWN0IGNvbnRlbnRFbGVtZW50OwotCi0JcHJpdmF0ZSBMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvd1ByZXNlbnRhdGlvbk5hbWUgPSBmYWxzZTsKLQkKLQkvLyBUaGlzIGlzIHNlcGFyYXRlIGhhbmRsaW5nIGZvciBDb250ZW50Q29udGVnb3J5IAotCXByaXZhdGUgU3RyaW5nIGNvbnRlbnRDYXRlZ29yeVRhYlN0cjsKLQotCXB1YmxpYyBGaWx0ZXJIZWxwZXIoT2JqZWN0IGNvbnRlbnRFbGVtZW50LCBTdHJpbmcgdGFiU3RyLCBTdHJpbmcgcGF0dGVybiwKLQotCVN0cmluZyBmaWx0ZXJUeXBlU3RyLCBMaXN0IGFscmVhZHlTZWxlY3RlZExpc3QpIHsKLQotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0KLQkJdGhpcy50YWJTdHIgPSB0YWJTdHI7Ci0KLQkJdGhpcy50eXBlID0gZmlsdGVyVHlwZVN0cjsKLQotCQl0aGlzLmV4aXN0aW5nRWxlbWVudHMgPSBhbHJlYWR5U2VsZWN0ZWRMaXN0OwotCi0JCXRoaXMucGF0dGVybiA9IHBhdHRlcm47Ci0KLQkJc2hvd1ByZXNlbnRhdGlvbk5hbWUgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFCi0JCS5pc1Nob3dQcmVzZW50YXRpb25OYW1lcygpOwotCi0KLQl9Ci0JLyoKLQkgKiBtZXRob2QgdG8gc2V0IGNvbnRlbnRDYXRlZ29yeVRhYlN0ciwgdGhpcyAKLQkgKiBzcGVjaWFsIGhhbmRsZSBmb3IgY29udGVudCBjYXRlZ29yeSwgdGFiU3RyIGltcGxlbWVudGF0aW9uIAotCSAqIGRvbm90IHdvcmsgZm9yIHRoaXMuIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRDYXRlZ29yeVRhYlN0cihTdHJpbmcgY29udGVudENhdGVnb3J5VGFiU3RyKXsKLQkJdGhpcy5jb250ZW50Q2F0ZWdvcnlUYWJTdHIgPSBjb250ZW50Q2F0ZWdvcnlUYWJTdHI7Ci0JfQotCS8qCi0JICogbWV0aG9kIHRvIHNldCBjb250ZW50Q2F0ZWdvcnlUYWJTdHIsIHRoaXMgCi0JICogc3BlY2lhbCBoYW5kbGUgZm9yIGNvbnRlbnQgY2F0ZWdvcnksIHRhYlN0ciBpbXBsZW1lbnRhdGlvbiAKLQkgKiBkb25vdCB3b3JrIGZvciB0aGlzLiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRDYXRlZ29yeVRhYlN0cigpewotCQlyZXR1cm4gdGhpcy5jb250ZW50Q2F0ZWdvcnlUYWJTdHI7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpIHsKLQotCQlyZXR1cm4gZXhpc3RpbmdFbGVtZW50czsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFscmVhZHlTZWxlY3RlZExpc3QoTGlzdCBhbHJlYWR5U2VsZWN0ZWRMaXN0KSB7Ci0KLQkJdGhpcy5leGlzdGluZ0VsZW1lbnRzID0gYWxyZWFkeVNlbGVjdGVkTGlzdDsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hdGNoUGF0dGVybihPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBtYXRjaChvYmopOwotCX0KLQotCS8qCi0JICogQ29udmVuaWVudCBtZXRob2QgdG8gY2hlY2sgYW55IENhdGVnb3JpemVkRWxlbWVudHMgKHRyZWUgdHJhdmVyc2FsKSBvZgotCSAqIEN1c3RvbUNhdGVnb3J5IGhhcyBhbnkgbWF0Y2ggd2l0aCBtYXRjaGVyLiBAcGFyYW0gQ3VzdG9tQ2F0ZWdvcnkKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWF0Y2hlZENoaWxkQ3VzdG9tQ2F0ZWdvcnkoQ3VzdG9tQ2F0ZWdvcnkgdG9wQ2F0ZWdvcnkpIHsKLQkJTGlzdCBsaXN0ID0gdG9wQ2F0ZWdvcnkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlDdXN0b21DYXRlZ29yeSBjYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgb2JqZWN0OwotCQkJCWlmIChtYXRjaGVyKGNhdGVnb3J5KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKGhhc01hdGNoZWRDaGlsZEN1c3RvbUNhdGVnb3J5KGNhdGVnb3J5KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQ29udmVuaWVudCBtZXRob2QgdG8gY2hlY2sgYW55IHN1YkFydGlmYWN0cyAodHJlZSB0cmF2ZXJzYWwpIG9mIEFydGlmYWN0Ci0JICogaGFzIGFueSBtYXRjaCB3aXRoIG1hdGNoZXIuIEBwYXJhbSBDdXN0b21DYXRlZ29yeQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNNYXRjaGVkQXJ0aWZhY3QoQXJ0aWZhY3QgYXJ0aWZhY3QpIHsKLQotCQlMaXN0IGxpc3QgPSBhcnRpZmFjdC5nZXRDb250YWluZWRBcnRpZmFjdHMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCUFydGlmYWN0IHN1YmFydGlmYWN0ID0gKEFydGlmYWN0KSBvYmplY3Q7Ci0JCQkJaWYgKG1hdGNoZXIoc3ViYXJ0aWZhY3QpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZWxzZSBpZiAoaGFzTWF0Y2hlZEFydGlmYWN0KHN1YmFydGlmYWN0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIHRvIGNoZWNrIGFueSBzdWJBcnRpZmFjdHMgKHRyZWUgdHJhdmVyc2FsKSBvZiBBcnRpZmFjdAotCSAqIGhhcyBhbnkgbWF0Y2ggd2l0aCAgYWxyZWFkeWV4aXN0aW5nIGVsZW1lbnRzLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNNYXRjaGVkQXJ0aWZhY3QoQXJ0aWZhY3QgYXJ0aWZhY3QsIExpc3QgZXhpc3RpbmdMaXN0KSB7Ci0KLQkJTGlzdCBsaXN0ID0gYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQlBcnRpZmFjdCBzdWJhcnRpZmFjdCA9IChBcnRpZmFjdCkgb2JqZWN0OwotCQkJCWlmKCFleGlzdGluZ0xpc3QuY29udGFpbnMoc3ViYXJ0aWZhY3QpKXsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW50IG1ldGhvZCB0byBjaGVjayBhbnkgQ2hpbGRQYWNrYWdlcyAodHJlZSB0cmF2ZXJzYWwpIG9mIENvbnRlbnQKLQkgKiBQYWNrYWdlIGhhcyBhbnkgbWF0Y2ggd2l0aCBtYXRjaGVyLgotCSAqIAotCSAqIEBwYXJhbSBDdXN0b21DYXRlZ29yeQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNNYXRjaGVkQ2hpbGQoQ29udGVudFBhY2thZ2UgcGtnKSB7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZFBrZyA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkUGtnIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlDb250ZW50UGFja2FnZSBjb250ZW50UGtnID0gKENvbnRlbnRQYWNrYWdlKSBjaGlsZFBrZzsKLQkJCQlpZiAobWF0Y2hlcihjb250ZW50UGtnKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKGhhc01hdGNoZWRDaGlsZChjb250ZW50UGtnKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCi0JfQotCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2QgdG8gY2hlY2sgYW55IHN1YkRvbWFpbiAodHJlZSB0cmF2ZXJzYWwpIG9mIERvbWFpbiBoYXMKLQkgKiBhbnkgbWF0Y2ggd2l0aCBtYXRjaGVyIDxsaW5rPm1hdGNoZXIoT2JqZWN0IG9iaik8L2xpbms+Ci0JICogCi0JICogQHBhcmFtIEN1c3RvbUNhdGVnb3J5Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc01hdGNoZWRTdWJEb21haW5zKERvbWFpbiBkb21haW4pIHsKLQkJTGlzdCBsaXN0ID0gZG9tYWluLmdldFN1YmRvbWFpbnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHN1YmRvbWFpbiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChtYXRjaGVyKHN1YmRvbWFpbikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoaGFzTWF0Y2hlZFN1YkRvbWFpbnMoKERvbWFpbikgc3ViZG9tYWluKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc01hdGNoZWRTdWJEaXNjaXBsaW5lKERpc2NpcGxpbmUgZGlzY2lwbGluZSl7Ci0JCUxpc3QgbGlzdCA9IGRpc2NpcGxpbmUuZ2V0U3ViZGlzY2lwbGluZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgc3ViZGlzY2lwbGluZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChtYXRjaGVyKHN1YmRpc2NpcGxpbmUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGhhc01hdGNoZWRTdWJEaXNjaXBsaW5lKChEaXNjaXBsaW5lKSBzdWJkaXNjaXBsaW5lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc01hdGNoZWREaXNjaXBsaW5lcyhEaXNjaXBsaW5lR3JvdXBpbmcgZ3JvdXBpbmcpewotCQlMaXN0IGxpc3QgPSBncm91cGluZy5nZXREaXNjaXBsaW5lcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgc3ViZGlzY2lwbGluZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChtYXRjaGVyKHN1YmRpc2NpcGxpbmUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGhhc01hdGNoZWRTdWJEaXNjaXBsaW5lKChEaXNjaXBsaW5lKSBzdWJkaXNjaXBsaW5lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbHRlclR5cGVTdHIoKSB7Ci0KLQkJLy8gVHJpbSAiLSIoaHlwaGVuKSBmcm9tIHRoZSBzdHJpbmdzICh0eXBlcykuICBPbmx5IGluIGNhc2UgbWV0aG9kcGx1Z2luCi0JCS8vIGRvbid0IHRyaW0gIi0iIGJlY2F1c2UgbWV0aG9kcGx1Zy1pbiBjb250YWluICItIiAoaHlwaGVuKWFuZCB1c2VmdWwuCi0JCXdoaWxlICh0eXBlICE9IG51bGwgJiYgdHlwZS5pbmRleE9mKEZpbHRlckNvbnN0YW50cy5zcGFjZSkgPiAtMQotCQkJCSYmICF0eXBlLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuTUVUSE9fUExVR0lOUykpIHsKLQkJCXR5cGUgPSB0eXBlLnN1YnN0cmluZyh0eXBlLmluZGV4T2YoRmlsdGVyQ29uc3RhbnRzLnNwYWNlKSArIDEsIHR5cGUKLQkJCQkJLmxlbmd0aCgpKTsKLQkJfQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdHRlcm4oKSB7Ci0KLQkJcmV0dXJuIHBhdHRlcm47Ci0KLQl9Ci0KLQlwdWJsaWMgUGF0dGVybiBnZXRSZWdleFBhdHRlcm4oKSB7Ci0KLQkJcmV0dXJuIHJlZ2V4OwotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYWJTdHIoKSB7Ci0KLQkJcmV0dXJuIHRhYlN0cjsKLQotCX0KLQotCS8qCi0JICogCi0JICogTWV0aG9kIGNoZWNrcyB3aGV0aGVyIGFyYml0cmFyeSBvYmplY3QgcGFzc2VkIGlzCi0JICogCi0JICogZXF1YWwgdG8gY3VycmVudCBjb250ZW50IGVsZW1lbnQncyB2YXJpYWJpbGl0eSBvciBub3QuCi0JICogCi0JICogSWYgdmFyaWFiaWxpdHkgb2YgQ29udGVudEVsZW1lbnQgbWF0Y2hlcyBhcmJpdHJhcnkgb2JqZWN0LAotCSAqIAotCSAqIHJldHVybnMgdHJ1ZS4KLQkgKiAKLQkgKiBAcmV0dW4gYm9vbGVhbi4KLQkgKiAKLQkgKi8KLQotCXB1YmxpYyBib29sZWFuIGNoZWNrVmFyaWFiaWxpdHkoT2JqZWN0IG9iaikgewotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCi0JCQlPYmplY3QgdmFyaWFiaWxpdHlPYmplY3QgPSAoKENvbnRlbnRFbGVtZW50KSBjb250ZW50RWxlbWVudCkKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmICh2YXJpYWJpbGl0eU9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iai5lcXVhbHModmFyaWFiaWxpdHlPYmplY3QpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQotCQlyZXR1cm4gY29udGVudEVsZW1lbnQ7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50RWxlbWVudChPYmplY3QgY29udGVudEVsZW1lbnQpIHsKLQotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXJUeXBlU3RyKFN0cmluZyBmaWx0ZXJUeXBlU3RyKSB7Ci0KLQkJdGhpcy50eXBlID0gZmlsdGVyVHlwZVN0cjsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhdHRlcm4oU3RyaW5nIHBhdHRlcm4pIHsKLQotCQl0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVnZXhQYXR0ZXJuKFBhdHRlcm4gcmVnZXhQYXR0ZXJuKSB7Ci0KLQkJdGhpcy5yZWdleCA9IHJlZ2V4UGF0dGVybjsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhYlN0cihTdHJpbmcgdGFiU3RyKSB7Ci0KLQkJdGhpcy50YWJTdHIgPSB0YWJTdHI7Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UGF0aEJhc2VkT25UYWJTdHJpbmcoU3RyaW5nIHRhYlN0cikgewotCi0JCWlmIChGaWx0ZXJDb25zdGFudHMuY29udGVudEVsZW1lbnRTdHJzLmNvbnRhaW5zKHRhYlN0cikpIHsKLQkJCXJldHVybiBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aDsKLQkJfSBlbHNlIGlmICh0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ST0xFU0VUUykKLQkJCQl8fCB0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ST0xFX1NFVF9HUk9VUElOR1MpKSB7Ci0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aDsKLQkJfSBlbHNlIGlmICh0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUykKLQkJCQl8fCB0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FX0dST1VQSU5HUykpIHsKLQkJCXJldHVybiBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aDsKLQkJfSBlbHNlIGlmICh0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5UT09MUykpIHsKLQkJCXJldHVybiBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoOwotCQl9IGVsc2UgaWYgKHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVMpKSB7Ci0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoOwotCQl9IGVsc2UgaWYgKHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlMpKSB7Ci0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kb21haW5QYXRoOwotCQl9IGVsc2UgaWYgKHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTKSkgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoOwotCQl9IGVsc2UKLQkJCXJldHVybiBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aDsKLQotCX0KLQotCS8qKgotCSAqIAotCSAqIFRoaXMgaXMgY29udmVuaWVudCBtZXRob2QgdG8gY2hlY2sgYWxsIHRoZSBjb25kaXRpb24sIGxpa2UgbWF0Y2hQYXR0ZXJuLAotCSAqIGlmIG9iamVjdCBleGlzdHMgaW4gYWxyZWFkeSBzZWxlY3RlZCBsaXN0LCBjaGVjayB2YXJpYWJpbGl0eSBtYXRjaCwgYW5kCi0JICogaXMgb2JqZWN0IGl0c2VsZiBkb25vdCBkaXNwbGF5LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQotCXB1YmxpYyBib29sZWFuIGNoZWNrT2JqZWN0QWNjZXB0ZWQoT2JqZWN0IG9iaikgewotCi0JCWlmICghbWF0Y2gob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gQ2hlY2sgaWYgYWxyZWFkeSBleGlzdGluZyAoYXNzb2NpYXRlZCBlbGVtZW50cykgZG9uJ3QgZGlzcGxheS4KLQkJaWYgKGdldEFscmVhZHlTZWxlY3RlZExpc3QoKSAhPSBudWxsCi0JCQkJJiYgZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKG9iaikpewotCQkJLy8gc3BlY2lhbCBjYXNlIGhhbmRsaW5nIGZvciBBcnRpZmFjdCBhbmQgc3ViLWFydGlmYWN0LgotCQkJaWYob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QpewotCQkJCWlmKCFoYXNNYXRjaGVkQXJ0aWZhY3QoKEFydGlmYWN0KW9iaixnZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9ZWxzZXsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY2hlY2tWYXJpYWJpbGl0eShvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIGlmIG9iamVjdCBpdHNlbGYgZG9uJ3QgZGlzcGxheQotCQkvLyBEbyBlcXVhbCBjaGVjayBvbmx5IG9uIGVsZW1lbnRzIG90aGVydGhhbiBtZXRob2QgcGx1Z2luLCBJbiBjYXNlIG9mCi0JCS8vIENvcHlyaWdodChzdXBwb3J0aW5nIG1hdGVyaWFsKSBhc3NvY2lhdGluZyB0byBtZXRob2RwbHVnaW4sIGlmCi0JCS8vIG1ldGhvZHBsdWdpbiAoY29udGVudEVsZW10bikgZXF1YWxzCi0JCS8vIG9iaiwgdGhlbiByZXN1bHRzIGZhbHNlLlBsdWdpbiB3aWxsIGxvc3QgZnJvbSB0cmVlIGluIHRoZSBmaWx0ZXIuIEluCi0JCS8vIHR1cm4gc3VwcG9ydGluZyBtYXRlcmlhbCBmb3IgdGhhdCBwYXJ0aWN1bGFyIHBsdWdpbiB3aWxsIG5vdCBiZQotCQkvLyBkaXNwbGF5ZWQuCi0JCWlmICghKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsICYmIG9iai5lcXVhbHMoY29udGVudEVsZW1lbnQpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQotCS8qKgotCSAqIAotCSAqIENvbnZlbmllbnQgbWV0aG9kIGZvciBjaGVja2luZyBNZXRob2RQbHVnaW4gYWNjZXB0ZWQgb3Igbm90LiBNZXRob2QgbmVlZHMKLQkgKiB0byBpbnZva2VkIG9ubHkgZm9yIE1ldGhvZFBsdWdpbiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0TWV0aG9kUGx1Z2luKE9iamVjdCBvYmopIHsKLQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmIChNZXRob2RFbGVtZW50VXRpbC5nZXRBbGxNb2RlbHMoY29udGVudEVsZW1lbnQpLmNvbnRhaW5zKG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW50IG1ldGhvZCBmb3IgY2hlY2tpbmcgQ29udGVudCBQYWNrYWdlIGFjY2VwdGVkIG9yIG5vdC4gTWV0aG9kCi0JICogbmVlZHMgdG8gaW52b2tlZCBvbmx5IGZvciBDb250ZW50IFBhY2thZ2Ugb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRDb250ZW50UGFja2FnZShPYmplY3Qgb2JqKSB7Ci0KLQkJaWYgKCgoQ29udGVudFBhY2thZ2UpIG9iaikuZ2V0Q2hpbGRQYWNrYWdlcygpLmlzRW1wdHkoKQotCQkJCSYmICgoQ29udGVudFBhY2thZ2UpIG9iaikuZ2V0Q29udGVudEVsZW1lbnRzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbHNlCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc09iamVjdEluU2VsZWN0ZWRJdGVtcyhPYmplY3Qgb2JqKSB7Ci0KLQkJaWYgKGdldEFscmVhZHlTZWxlY3RlZExpc3QoKSAhPSBudWxsCi0JCQkJJiYgZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UKLQkJCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29udHJpYnV0b3IoQ29udGVudEVsZW1lbnQgZWxlbWVudCkgewotCQkvLyBKdXN0IHJldHVybmluZyB0cnVlLCBiZWNhdXNlIGNvbnRyaWJ1dGlvbiBjaGVja2VkIGluIG90aGVyIHBsYWNlLgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gbWF0Y2gob2JqKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaFBhdHRlcm5PblByZXNlbnRhdGlvbk5hbWUoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gbWF0Y2gob2JqKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3dQcmVzZW50YXRpb25OYW1lKCkgewotCQlyZXR1cm4gc2hvd1ByZXNlbnRhdGlvbk5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2hvd1ByZXNlbnRhdGlvbk5hbWUoYm9vbGVhbiBzaG93UHJlc2VudGF0aW9uTmFtZSkgewotCQl0aGlzLnNob3dQcmVzZW50YXRpb25OYW1lID0gc2hvd1ByZXNlbnRhdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJpYyBtZXRob2QgdG8gY2hlY2sgbWF0Y2ggb2YgYW4gb2JqZWN0IGJhc2VkIG9uIHJlZ3VsYXIgZXhwcmVzc2lvbgotCSAqIGFsc28gYmFzZWQgb24gdHlwZSB0aGF0IHNlbGVjdGVkIGluIHRoZSBkaWFsb2cuCi0JICovCi0KLQlwcml2YXRlIGJvb2xlYW4gbWF0Y2goT2JqZWN0IG9iaikgewotCi0JCS8vIERvIG5vdCBkbyBQYXR0ZXJuIG1hdGNoIGlmIHR5cGUgb3IgcGF0dGVybiBzdHJpbmcgaXMgbnVsbC4KLQkJaWYgKHR5cGUgPT0gbnVsbCB8fCBwYXR0ZXJuID09IG51bGwgfHwgcGF0dGVybi5lcXVhbHNJZ25vcmVDYXNlKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0KLQkJLy8gQ2hlY2sgaWYgdHlwZSBpcyBvZiBDb250ZW50IFBhY2thZ2UKLQkJaWYgKHR5cGUuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5DT05URU5UX1BBQ0tBR0VTKSkgewotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQotCQkJCWlmIChtYXRjaGVyKG9iaikgfHwgaGFzTWF0Y2hlZENoaWxkKChDb250ZW50UGFja2FnZSkgb2JqKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQl9IGVsc2UgewotCi0JCQkJLy8gZWxzZSBmb3IgYWxsIGNvbnRlbnQgZWxlbWVudHMsIGlmIHRoZWlyIGNvbnRlbnQgcGFrY2FnZQotCQkJCS8vIG1hdGNoZXMgLCByZXR1cm4gdHJ1ZS4KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkJT2JqZWN0IGNvbnRhaW5lciA9ICgoQ29udGVudEVsZW1lbnQpIG9iaikuZ2V0Q29udGFpbmVyKCk7Ci0JCQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCQkJaWYgKCFtYXRjaGVyKGNvbnRhaW5lcikpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLk1FVEhPX1BMVUdJTlMpKSB7Ci0JCQkvLyBDaGVjayBpZiB0eXBlIGlzIG9mIE1ldGhvZCBQbHVnaW5zCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJLy8gaWYgaXMgYSBNZXRob2RQbHVnaW4sIHJldHVybiB0cnVlIGlmIG1hdGNoZXMgdGhlIHBhdHRlcm4KLQkJCQlyZXR1cm4gbWF0Y2hlcihvYmopOwotCi0JCQl9IGVsc2UgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCX0gZWxzZSBpZiAodHlwZSAhPSBudWxsKSB7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudAotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQotCQkJCWlmICh0eXBlLmluZGV4T2YoRmlsdGVyQ29uc3RhbnRzLnNwYWNlKSA+IC0xKSB7Ci0JCQkJCXR5cGUgPSB0eXBlLnN1YnN0cmluZyh0eXBlLmluZGV4T2YoRmlsdGVyQ29uc3RhbnRzLnNwYWNlKSwgdHlwZS5sZW5ndGgoKSk7Ci0JCQkJfQotCi0JCQkJQ2xhc3MgY2xzID0gRmlsdGVySW5pdGlhbGl6ZXIuZ2V0SW5zdGFuY2UoKS5nZXRDbGFzc0ZvclR5cGUoCi0JCQkJCQl0eXBlKTsKLQkJCQlpZiAoY2xzICE9IG51bGwgJiYgIWNscy5pc0luc3RhbmNlKG9iaikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQkJaWYgKG1hdGNoZXIob2JqKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCi0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCQkJCXJldHVybiBoYXNNYXRjaGVkQ2hpbGRDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaik7Ci0KLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCQlyZXR1cm4gaGFzTWF0Y2hlZEFydGlmYWN0KChBcnRpZmFjdCkgb2JqKTsKLQkJCQkJfQotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQkJCQlyZXR1cm4gaGFzTWF0Y2hlZFN1YkRvbWFpbnMoKERvbWFpbikgb2JqKTsKLQkJCQkJfQotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSl7Ci0JCQkJCQlyZXR1cm4gaGFzTWF0Y2hlZFN1YkRpc2NpcGxpbmUoKERpc2NpcGxpbmUpb2JqKTsKLQkJCQkJfQotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKXsKLQkJCQkJCXJldHVybiBoYXNNYXRjaGVkRGlzY2lwbGluZXMoKERpc2NpcGxpbmVHcm91cGluZylvYmopOwotCQkJCQl9Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9IGVsc2UgeyAvLyBlbHNlIGZvciBhbGwgb3RoZXIgdHlwZXMgb2YgZWxlbWVudHMKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQl9IGVsc2UKLQkJCS8vIHRoZSBBbGwgY2FzZQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2Qgd2hpY2ggZG9lcyBhY3R1YWwgbWF0Y2hpbmcgb2YgZ2l2ZW4gb2JqZWN0IHdpdGggcmVndWxhcgotCSAqIGV4cHJlc3Npb24uIENoZWNrcyB0byBkbyBwcmVzZW50YXRpb25uYW1lIG9yIG5hbWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcihPYmplY3Qgb2JqKSB7Ci0JCWlmKHJlZ2V4ICE9IG51bGwpewotCQkJTWF0Y2hlciBtID0gcmVnZXgubWF0Y2hlcigoKE1ldGhvZEVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpKTsKLQkJCWlmIChzaG93UHJlc2VudGF0aW9uTmFtZSkgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQKLQkJCQkJCSYmICgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmopLmdldFByZXNlbnRhdGlvbk5hbWUoKSAhPSBudWxsKQotCQkJCQltID0gcmVnZXgubWF0Y2hlcigoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqKQotCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCQkJfQotCQkJcmV0dXJuIG0ubWF0Y2hlcygpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJJbml0aWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlckluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkNmVlMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlckluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciBzZXR0aW5nIHVwIHRoZSBuZWNlc3NhcnkgbWFwcyB1c2VkIGZvciBlbGVtZW50IGZpbHRlcmluZwotICogaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZpbHRlckluaXRpYWxpemVyIHsKLQotCXByaXZhdGUgc3RhdGljIEZpbHRlckluaXRpYWxpemVyIGluaXRpYWxpemVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIG1hcDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEZpbHRlckluaXRpYWxpemVyKCkgewotCQlzdXBlcigpOwotCQlsb2FkVHlwZUNsYXNzKCk7Ci0JfQotCi0JLyoKLQkgKiBTaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWx0ZXJJbml0aWFsaXplciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluaXRpYWxpemVyID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoRmlsdGVySW5pdGlhbGl6ZXIuY2xhc3MpIHsKLQkJCQlpZiAoaW5pdGlhbGl6ZXIgPT0gbnVsbCkgewotCQkJCQlpbml0aWFsaXplciA9IG5ldyBGaWx0ZXJJbml0aWFsaXplcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5pdGlhbGl6ZXI7Ci0JfQotCi0JLyoKLQkgKiBMb2FkIHRoZSBGaWx0ZXIgVHlwZXMgYW5kIHJlc3BlY3RpdmUgY2xhc3Nlcy4gVGhpcyBuZWVkIGluIGNhc2Ugb2YgaTExOG4gLQotCSAqIENvbnN0YW50cyB2YWx1ZXMgYXJlIGRpZmZlcmVudC4KLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFR5cGVDbGFzcygpIHsKLQkJbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RUWVBFUywgV29ya1Byb2R1Y3RUeXBlLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuRE9NQUlOUywgRG9tYWluLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTLCBXb3JrUHJvZHVjdC5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVMsIFdvcmtQcm9kdWN0VHlwZS5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlMsIERvbWFpbi5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUywgV29ya1Byb2R1Y3QuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FX0dST1VQSU5HUywgRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVMsIERpc2NpcGxpbmUuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5UQVNLUywgVGFzay5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLlJPTEVfU0VUX0dST1VQSU5HUywgUm9sZVNldEdyb3VwaW5nLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFMsIFJvbGVTZXQuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5ST0xFUywgUm9sZS5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLkNIRUNLTElTVFMsIENoZWNrbGlzdC5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLkNPTkNFUFRTLCBDb25jZXB0LmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuRVNUSU1BVEVfQ09OU0lERVJBVElPTlMsCi0JCQkJRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuRVhBTVBMRVMsIEV4YW1wbGUuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5HVUlERUxJTkVTLCBHdWlkZWxpbmUuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5QUkFDVElDRVMsIFByYWN0aWNlLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuUkVQT1JUUywgUmVwb3J0LmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuUkVVU0FCTEVfQVNTRVRTLCBSZXVzYWJsZUFzc2V0LmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuUk9BRE1BUCwgUm9hZG1hcC5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTLCBTdXBwb3J0aW5nTWF0ZXJpYWwuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5URU1QTEFURVMsIFRlbXBsYXRlLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuVEVSTV9ERUZJTklUSU9OUywgVGVybURlZmluaXRpb24uY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5UT09MX01FTlRPUlMsIFRvb2xNZW50b3IuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5XSElURV9QQVBFUlMsIFdoaXRlcGFwZXIuY2xhc3MpOwotCQkvLyBtYXAucHV0KEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRSwgR3VpZGFuY2UuY2xhc3MpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgQ2xhc3MgZm9yIGEgdHlwZSBmcm9tIHRoZSBtYXAuCi0JICovCi0JcHVibGljIENsYXNzIGdldENsYXNzRm9yVHlwZShTdHJpbmcgdHlwZSkgewotCQlPYmplY3Qgb2JqID0gbWFwLmdldCh0eXBlKTsKLQkJcmV0dXJuIChDbGFzcykgb2JqOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZDc2MGM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiBBIHV0aWxpdHkgY2xhc3MgZm9yIG1hbmFnaW5nIGVsZW1lbnQgZmlsdGVyaW5nIGluIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24KLSAqIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyVXRpbCB7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGl0ZXJhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb24gY2hpbGRyZW4sIElGaWx0ZXIgZmlsdGVyKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKQotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGZvciBjb2xsZWN0aW5nIHRoZSBwYXJlbnRzIGNoYWluICh1cHdhcmQpIG9mIGFuIGJyZWFrZG93bmVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIEFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIEJyZWFrZG93bkVsZW1lbnQKLQkgKiBAcGFyYW0gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRQYXJlbnRzSW5TY29wZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCwgamF2YS51dGlsLkxpc3QgYWN0aXZpdHlMaXN0KSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChlbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJYWN0aXZpdHlMaXN0LmFkZChwYXJlbnQpOwotCQkJZ2V0UGFyZW50c0luU2NvcGUoYWRhcHRlckZhY3RvcnksIChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQsCi0JCQkJCWFjdGl2aXR5TGlzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWxsIGNoaWxkcmVuIG9mIHRoZSBhY3Rpdml0eSByZWN1cnNpdmVseSBkb3dud2FyZHMuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBhY3Rpdml0eUxpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0Q2hpbGRBY3Rpdml0aWVzSW5TY29wZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUFjdGl2aXR5IHBhcmVudCwgTGlzdCBhY3Rpdml0eUxpc3QpIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQotCQlPYmplY3QgbyA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJaWYgKG8gaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIG87Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWFjdGl2aXR5TGlzdC5hZGQob2JqKTsKLQkJCQkJZ2V0Q2hpbGRBY3Rpdml0aWVzSW5TY29wZShhZGFwdGVyRmFjdG9yeSwgKEFjdGl2aXR5KSBvYmosCi0JCQkJCQkJYWN0aXZpdHlMaXN0KTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlPYmplY3QgbzEgPSAoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VmFsdWUoKTsKLQkJCQkJYWN0aXZpdHlMaXN0LmFkZChvMSk7Ci0JCQkJCWdldENoaWxkQWN0aXZpdGllc0luU2NvcGUoYWRhcHRlckZhY3RvcnksIChBY3Rpdml0eSkgbzEsCi0JCQkJCQkJYWN0aXZpdHlMaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW50IG1ldGhvZCBmb3IgcmV0cml2aW5nIGFsbCB0aGUgY29udHJpYnV0b3JzIG9mCi0JICogdmFyaWFiaWxpdHllbGVtZW50IGluIGEgbGlzdC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0Q29udHJpYnV0b3JzKExpc3QgbGlzdCwgTGlzdCBnZW5lcmFsaXplcnMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBUbmdVdGlsLmdldENvbnRyaWJ1dG9ycygoVmFyaWFiaWxpdHlFbGVtZW50KSBlKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJZ2VuZXJhbGl6ZXJzLmFkZChpdGVyLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2QgZm9yIHJldHJpdmluZyBhbGwgdGhlIGNvbnRyaWJ1dG9ycyBvZgotCSAqIHZhcmlhYmlsaXR5ZWxlbWVudCBpbiBhIGxpc3QuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldEdlbmVyYWxpemVycyhMaXN0IGxpc3QsIExpc3QgZ2VuZXJhbGl6ZXJzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlJdGVyYXRvciBpdGVyID0gVG5nVXRpbC5nZXRHZW5lcmFsaXplcnMoKFZhcmlhYmlsaXR5RWxlbWVudCkgZSk7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCWdlbmVyYWxpemVycy5hZGQoaXRlci5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIGZvciByZXRyaXZpbmcgYWxsIHRoZSB2YXJpYWJpbGl0eSBiYXNlcyBvZgotCSAqIHZhcmlhYmlsaXR5ZWxlbWVudCBpbiBhIGxpc3QuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFZhcmlhYmlsaXR5QmFzZShMaXN0IGxpc3QsIExpc3QgdmFyaWFiaWxpdHliYXNlcykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqOwotCQkJCWZvciAoOyBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsOyB2YXJpYWJpbGl0eWJhc2VzCi0JCQkJCQkuYWRkKGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlCi0JCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpKQotCQkJCQk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgcGFyZW50IGFjdGl2aXR5IGZvciBicmVha2Rvd25lbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGJyRWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRQYXJlbnRBY3Rpdml0eShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50KSB7Ci0JCWlmIChickVsZW1lbnQgIT0gbnVsbCkgewotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChickVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJCWJyRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQ7Ci0JCQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChickVsZW1lbnQsCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFN1YlRyZWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlciwgQWN0aXZpdHkgYWN0aXZpdHksCi0JCQlMaXN0IHRyZWVMaXN0KSB7Ci0JCUZpbHRlclV0aWwuZ2V0UGFyZW50c0luU2NvcGUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgYWN0aXZpdHksIHRyZWVMaXN0KTsKLQkJRmlsdGVyVXRpbC5nZXRDaGlsZEFjdGl2aXRpZXNJblNjb3BlKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGFjdGl2aXR5LCB0cmVlTGlzdCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFN1YlRyZWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlciwgTGlzdCBsaXN0LAotCQkJTGlzdCB0cmVlTGlzdCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJZ2V0U3ViVHJlZShhZGFwdGVyLCAoQWN0aXZpdHkpIG9iaiwgdHJlZUxpc3QpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0d1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTMxZDgyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSBndWlkYW5jZSBmb2xkZXJzIGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5HdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUNvbmZpZ3VyYWJsZSB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gbWV0aG9kQ29uZmlnCi0JICovCi0JcHVibGljIEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjb2wuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAoIWZpbHRlci5hY2NlcHQob2JqKSkKLQkJCQlpdG9yLnJlbW92ZSgpOwotCQl9Ci0JCXJldHVybiBjb2w7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUFsbEZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lBbGxGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzhlNmU1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUFsbEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotLyoqCi0gKiBBIGZpbHRlciB0aGF0IGRpc3BsYXlzIGFsbCBtZXRob2QgZWxlbWVudHMgaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbgotICogZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFsbEZpbHRlciBleHRlbmRzIElGaWx0ZXIgewotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lDYXRlZ29yeUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lDYXRlZ29yeUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZTVkMjIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQ2F0ZWdvcnlGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLS8qKgotICogQSBmaWx0ZXIgdGhhdCBkaXNwbGF5cyBvbmx5IGNhdGVnb3J5IGVsZW1lbnRzIGluIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24KLSAqIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYXRlZ29yeUZpbHRlciBleHRlbmRzIElGaWx0ZXIgewotCi0JU3RyaW5nW10gZ2V0Q2F0ZWdvcnlQYWNrYWdlUGF0aCgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUNvbnRlbnRGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQ29udGVudEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOWFkZWMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQ29udGVudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotLyoqCi0gKiBBIGZpbHRlciB0aGF0IGRpc3BsYXlzIG9ubHkgY29udGVudCBlbGVtZW50cyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uCi0gKiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udGVudEZpbHRlciBleHRlbmRzIElGaWx0ZXIgewotCi0JU3RyaW5nW10gZ2V0Q29udGVudFBhY2thZ2VQYXRoKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQ3VzdG9tRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUN1c3RvbUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYjU3MTEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQ3VzdG9tRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi0vKioKLSAqIEEgZmlsdGVyIHRoYXQgZGlzcGxheXMgb25seSBjdXN0b20gY2F0ZWdvcmllcyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uCi0gKiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ3VzdG9tRmlsdGVyIGV4dGVuZHMgSUZpbHRlciB7Ci0KLQlTdHJpbmdbXSBnZXRDb250ZW50UGFja2FnZVBhdGgoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVhOGQ2OWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLS8qKgotICogQSBnZW5lcmljIGZpbHRlciBmb3IgZmlsdGVyaW5nIG91dCBtZXRob2QgZWxlbWVudHMgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWx0ZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXIgewotCi0JLyoKLQkgKiBnZXRPYmplY3QoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCk7Ci0KLQkvKgotCSAqIHNldEhlbHBlcigpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGVscGVyKEZpbHRlckhlbHBlciBoZWxwZXIpOwotCi0JLyoqCi0JICogQWRkZWQgZm9yIGZ1dGhlciBmaWx0ZXJpbmcuIEZvciBleGFtcGxlLCB3ZSBtYXkgc2V0IGEgZmlsZXIgdG8gcHJldmVudAotCSAqIGdlbmVyYWxpemVycyBhcyBiYXNlIGVsZW1lbnQgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeQotCSAqIAotCSAqIEBwYXJhbSBhZGRpdGlvbmFsRmlsdGVycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkZGl0aW9uYWxGaWx0ZXJzKAotCQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyW10gYWRkaXRpb25hbEZpbHRlcnMpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSVByb2Nlc3NGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JUHJvY2Vzc0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYWM2ZDMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JUHJvY2Vzc0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotLyoqCi0gKiBBIGZpbHRlciB0aGF0IGRpc3BsYXlzIG9ubHkgcHJvY2VzcyBlbGVtZW50cyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uCi0gKiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJvY2Vzc0ZpbHRlciBleHRlbmRzIElGaWx0ZXIgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MWIyMWM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVDdXN0b21DYXRlZ29yeUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUN1c3RvbUNhdGVnb3J5QWRhcHRlcigpIHsKLQkJaWYgKGN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyID0gbmV3IEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZU1ldGhvZExpYnJhcnlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RMaWJyYXJ5QWRhcHRlcigpIHsKLQkJaWYgKG1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciA9IG5ldyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBtZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFBsdWdpbkFkYXB0ZXIoKSB7Ci0JCWlmIChtZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyID0gbmV3IE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRQYWNrYWdlQWRhcHRlcigpIHsKLQkJaWYgKGNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyID0gbmV3IENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBjb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50Y2F0ZWdvcmllc0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCS8vIGlmKGRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKXsKLQkJLy8gZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyID0gbmV3Ci0JCS8vIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gfQotCQkvLyByZXR1cm4gZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyOwotCQlyZXR1cm4gbmV3IERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0R3JvdXBpbmdBZGFwdGVyKCkgewotCQkvLyBpZihyb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCl7Ci0JCS8vIHJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBSb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIHJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlcjsKLQkJcmV0dXJuIG5ldyBSb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZVNldEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUm9sZVNldEl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0vLwkJaWYgKGRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0vLwkJCWRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlciA9IG5ldyBEZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIodGhpcyk7Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyOwotCQkKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUGhhc2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaGFzZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRG9tYWluQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBEb21haW5JdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzY2lwbGluZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMzM0OGMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXN1cGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotCQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWNoaWxkcmVuID0gbnVsbDsKLQkJQ29sbGVjdGlvbiBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCi0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJRmlsdGVyVXRpbC5pdGVyYXRlQ29sbGVjdGlvbihjb2wsIGZpbHRlcik7Ci0JCX0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOWQ1MjkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgbWV0aG9kIGxpYnJhcnkgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUNvbmZpZ3VyYWJsZSB7Ci0KLQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCUNvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50OwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8vIHByaXZhdGUgYm9vbGVhbiBpc0FkYXB0ZXJDb25maWd1cmFibGU7Ci0JLy8gcHJpdmF0ZSBBcnJheUxpc3QgY2hpbGRyZW47Ci0JLy8gcHJpdmF0ZSBNZXRob2RQbHVnaW4gcGx1Z2luOwotCS8vIHByaXZhdGUgTW9kZWxTdHJ1Y3R1cmUgbW9kZWxTdHJ1Y3Q7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBjb250ZW50RWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUlGaWx0ZXIgZmlsdGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSUNvbmZpZ3VyYWJsZSkgewotCQkJLy8gaXNBZGFwdGVyQ29uZmlndXJhYmxlID0gdHJ1ZTsKLQkJCSgoSUNvbmZpZ3VyYWJsZSkgYWRhcHRlckZhY3RvcnkpLnNldEZpbHRlcihmaWx0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0bwotCSAqIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluCi0JICoge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQkvLyBzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2lucygpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlcjEuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlcjEubmV4dCgpOwotCQkJaWYgKGZpbHRlci5hY2NlcHQoY2hpbGQpICYmIGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIHAgPSBuZXcgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKAotCQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCQkJCXAuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQkJQ29sbGVjdGlvbiBjaGlsZHMgPSBwLmdldENoaWxkcmVuKGNoaWxkKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGNoaWxkSXRlciA9IGNoaWxkcy5pdGVyYXRvcigpOyBjaGlsZEl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBjaGlsZE9iaiA9IGNoaWxkSXRlci5uZXh0KCk7Ci0JCQkJCWlmIChjaGlsZE9iaiBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCQkJaWYgKCFjaGVja0NoaWxkcmVucyhjaGlsZE9iaikpCi0JCQkJCQkJY2hpbGRJdGVyLnJlbW92ZSgpOwotCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGRPYmopKSB7Ci0JCQkJCQkJY2hpbGRJdGVyLnJlbW92ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChjaGlsZHMuaXNFbXB0eSgpKQotCQkJCQlpdGVyMS5yZW1vdmUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkKLQkJCQkJaXRlcjEucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0NoaWxkcmVucyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlvYmplY3QgPSAoKElXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3QpLmdldFZhbHVlKCk7Ci0JCQlpZiAoIWZpbHRlci5hY2NlcHQob2JqZWN0KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUNvbGxlY3Rpb24gY2hpbGRPYmpDaGlsZHMgPSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgb2JqZWN0KQotCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCWZvciAoSXRlcmF0b3IgY2hpbGRPYmpJdGVyID0gY2hpbGRPYmpDaGlsZHMuaXRlcmF0b3IoKTsgY2hpbGRPYmpJdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkT2JqQ2hpbGQgPSBjaGlsZE9iakl0ZXIubmV4dCgpOwotCQkJCWlmIChjaGlsZE9iakNoaWxkIGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJCXJldHVybiBjaGVja0NoaWxkcmVucyhjaGlsZE9iakNoaWxkKTsKLQkJCQl9Ci0JCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkT2JqQ2hpbGQpKSB7Ci0JCQkJCWNoaWxkT2JqSXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY2hpbGRPYmpDaGlsZHMuaXNFbXB0eSgpKQotCQkJCS8vIGNoaWxkSXRlci5yZW1vdmUoKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjg1Mjg0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBtZXRob2QgcGx1Zy1pbiBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSB7Ci0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IGNvbCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUNhdGVnb3J5RmlsdGVyKSB7Ci0JCQljb2wuYWRkQWxsKGdldENhdGVnb3J5SXRlbVByb3ZpZGVyKG9iamVjdCkuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQlyZXR1cm4gY29sOwotCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb250ZW50RmlsdGVyKSB7Ci0JCQlyZXR1cm4gZ2V0Q29udGVudChvYmplY3QpOwotCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIElBbGxGaWx0ZXIpIHsKLQkJCXJldHVybiBnZXRBbGxDb250ZW50RWxlbWVudHMob2JqZWN0KTsKLQkJfSBlbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQ3VzdG9tRmlsdGVyKSB7Ci0JCQlyZXR1cm4gZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhvYmplY3QpOwotCQl9IGVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkvLyBUT0RPOiBmaWx0ZXIKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCUN1c3RvbUNhdGVnb3J5IHJvb3RDdXN0b21DYXRlZ29yeSA9IFRuZ1V0aWwKLQkJCQkuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KChNZXRob2RQbHVnaW4pIG9iamVjdCk7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQocm9vdEN1c3RvbUNhdGVnb3J5LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkoKElDb25maWd1cmFibGUpIGFkYXB0ZXIpLnNldEZpbHRlcihmaWx0ZXIpOwotCQlyZXR1cm4gYWRhcHRlci5nZXRDaGlsZHJlbihyb290Q3VzdG9tQ2F0ZWdvcnkpOwotCX0KLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBnZXRDYXRlZ29yeUl0ZW1Qcm92aWRlcihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKChNZXRob2RQbHVnaW4pIG9iamVjdCwKLQkJCQkoKElDYXRlZ29yeUZpbHRlcikgZmlsdGVyKS5nZXRDYXRlZ29yeVBhY2thZ2VQYXRoKCkpOwotCQlDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIgY29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyID0gbmV3IENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcigKLQkJCQlhZGFwdGVyRmFjdG9yeSwgcGtnLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJY29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCQljb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JCXJldHVybiBjb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldENvbnRlbnQoT2JqZWN0IG9iamVjdCkgewotCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgoTWV0aG9kUGx1Z2luKSBvYmplY3QsCi0JCQkJKChJQ29udGVudEZpbHRlcikgZmlsdGVyKS5nZXRDb250ZW50UGFja2FnZVBhdGgoKSk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChwa2csIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCSgoSUNvbmZpZ3VyYWJsZSkgYWRhcHRlcikuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCXJldHVybiBhZGFwdGVyLmdldENoaWxkcmVuKHBrZyk7Ci0JfQotCi0JLy8gcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGdldENvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlcihPYmplY3Qgb2JqZWN0KQotCS8vIHsKLQkvLyBDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgoTWV0aG9kUGx1Z2luKW9iamVjdCwKLQkvLyBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0JLy8gQ29udGVudEVsZW1lbnRzSXRlbVByb3ZpZGVyIGNvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlciA9IG5ldwotCS8vIENvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgcGtnKTsKLQkvLyBjb250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JLy8gcmV0dXJuIGNvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlcjsKLQkvLyB9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0QWxsQ29udGVudEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVN0cmluZ1tdIGNvcmVDb250ZW50UGF0aCA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoOwotCQlDb250ZW50UGFja2FnZSBjb3JlUGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoCi0JCQkJKE1ldGhvZFBsdWdpbikgb2JqZWN0LCBjb3JlQ29udGVudFBhdGgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGNvbnRlbnRBZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGNvcmVQa2csIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCSgoSUNvbmZpZ3VyYWJsZSkgY29udGVudEFkYXB0ZXIpLnNldEZpbHRlcihmaWx0ZXIpOwotCQlsaXN0LmFkZEFsbChjb250ZW50QWRhcHRlci5nZXRDaGlsZHJlbihjb3JlUGtnKSk7Ci0KLQkJU3RyaW5nW11bXSBjYXRlZ29yeVBhdGhzID0gbmV3IFN0cmluZ1tdW10gewotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoIH07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yeVBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmdbXSBwYXRoID0gY2F0ZWdvcnlQYXRoc1tpXTsKLQkJCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKAotCQkJCQkoTWV0aG9kUGx1Z2luKSBvYmplY3QsIHBhdGgpOwotCQkJQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlciBjb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyID0gbmV3IENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LCBwa2csIGdldE5hbWUocGF0aCkpOwotCQkJY29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCWNvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIuc2V0SW1hZ2UoZ2V0SW1hZ2UocGF0aCkpOwotCQkJY29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlci5zZXRQYXJlbnQob2JqZWN0KTsKLQkJCWxpc3QuYWRkKGNvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpOwotCQl9Ci0KLQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdEN1c3RvbUNhdGVnb3J5ID0gVG5nVXRpbAotCQkJCS5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkoKE1ldGhvZFBsdWdpbikgb2JqZWN0KTsKLQkJaWYgKHJvb3RDdXN0b21DYXRlZ29yeSAhPSBudWxsKSB7Ci0JCQlsaXN0LmFkZChyb290Q3VzdG9tQ2F0ZWdvcnkpOwotCQl9Ci0KLQkJLy8gU3RyaW5nIG5hbWUgPQotCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Qcm9jZXNzZXNfZ3JvdXAiKTsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQlQcm9jZXNzZXNJdGVtUHJvdmlkZXIgcHJvY2Vzc0l0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIoCi0JCQkJYWRhcHRlckZhY3RvcnksIChNZXRob2RQbHVnaW4pIG9iamVjdCk7Ci0JCXByb2Nlc3NJdGVtUHJvdmlkZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCXByb2Nlc3NJdGVtUHJvdmlkZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JCWxpc3QuYWRkKHByb2Nlc3NJdGVtUHJvdmlkZXIpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIxLm5leHQoKTsKLQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpCi0JCQkJaXRlcjEucmVtb3ZlKCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLy8gcHJpdmF0ZSBDb2xsZWN0aW9uIGdldFByb2Nlc3NlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIC8vIFN0cmluZyBuYW1lID0KLQkvLyAvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Qcm9jZXNzZXNfZ3JvdXAiKTsKLQkvLyAvLyAvLyROT04tTkxTLTEkCi0JLy8gUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIHByb2Nlc3NJdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKAotCS8vIGFkYXB0ZXJGYWN0b3J5LCAoTWV0aG9kUGx1Z2luKSBvYmplY3QpOwotCS8vIHByb2Nlc3NJdGVtUHJvdmlkZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JLy8gbGlzdC5hZGQocHJvY2Vzc0l0ZW1Qcm92aWRlcik7Ci0JLy8gcmV0dXJuIGxpc3Q7Ci0JLy8gfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0SW1hZ2UoU3RyaW5nW10gcGF0aCkgewotCQlpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EaXNjaXBsaW5lcyIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGgpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Eb21haW5zIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwYXRoID09IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwYXRoID09IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Sb2xlcyIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVG9vbHMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZShTdHJpbmdbXSBwYXRoKSB7Ci0JCWlmIChwYXRoID09IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwYXRoID09IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0gZWxzZSBpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwYXRoID09IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGgpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Ub29sc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9PQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1Y2ZlYzNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9PQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGFjdGl2aXRpZXMgaW4gdGhlIFRlYW0gQWxsb2NhdGlvbiBwYWdlIG9mIGEKLSAqIFByb2Nlc3MgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBPQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0T2JqZWN0KG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE9iamVjdChEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRFQ2xhc3NlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL09CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDcyNDA0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYnJlYWsgZG93biBlbGVtZW50cyBpbiB0aGUgVGVhbSBBbGxvY2F0aW9uIHBhZ2UKLSAqIG9mIGEgUHJvY2VzcyBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IE9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBPQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBzdXBlcgotCQkJCS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBPQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBzdXBlcgotCQkJCS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL09CU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9PQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3MDY5YzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL09CU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBwcm9jZXNzZXMgaW4gdGhlIFRlYW0gQWxsb2NhdGlvbiBwYWdlCi0gKiBvZiBhIFByb2Nlc3MgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9CU1Byb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBPQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHVibGljIE9CU1Byb2Nlc3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5kZWxlZ2F0ZUl0ZW1Qcm92aWRlciA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JCQkJCS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2wuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpCi0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJc3VwZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGI2NDYyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGFjdGl2aXRpZXMgaW4gdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZQotICogcGFnZSBvZiBhIFByb2Nlc3MgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLy8gSUZpbHRlciBmaXRsZXI7Ci0JcHVibGljIFBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCQlDb2xsZWN0aW9uIGNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCS8vIFRoaXMgY2FsbCB0byBQQlNBY3RpaXZpdHlJdGVtUHJvdmlkZXIocHJvY2VzcyBwYWNrYWdlKSBpcyBkb25lCi0JCS8vIC0gaW4gb3JkZXIgcmVtb3ZlIGR1cGxpY2F0ZSBzdWJhcnRpZmFjdC4KLQkJY29sID0gUHJvY2Vzc1V0aWwucmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGNvbCwgZmFsc2UpOwotCQlyZXR1cm4gY29sOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE9iamVjdChEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRQQlNFY2xhc3NlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1BCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjhhMTkxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYnJlYWsgZG93biBlbGVtZW50cyBpbiB0aGUgV29yayBQcm9kdWN0IFVzYWdlCi0gKiBwYWdlIG9mIGEgUHJvY2VzcyBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBzdXBlcgotCQkJCS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBzdXBlcgotCQkJCS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9QQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFjYmNjMGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgcHJvY2Vzc2VzIGluIHRoZSBXb3JrIFByb2R1Y3QgVXNhZ2UgcGFnZQotICogb2YgYSBQcm9jZXNzIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQQlNQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlIHsKLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwdWJsaWMgUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmRlbGVnYXRlSXRlbVByb3ZpZGVyID0gZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkFjdGl2aXR5SXRlbVByb3ZpZGVyI2dldFByb3BlcnR5RGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkJCQkJLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQlzdXBlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyOGM5NmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRlYjJiMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHByb2Nlc3MgcGFja2FnZSBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvL3ByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbkluY2x1ZGluZ0VtcHR5T2JqZWN0cyhvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWlmIChpc0VtcHR5UGFja2FnZShpdGVyLm5leHQoKSkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5JbmNsdWRpbmdFbXB0eU9iamVjdHMoT2JqZWN0IG9iamVjdCkgewotCQlBcnJheUxpc3QgY29sID0gbmV3IEFycmF5TGlzdCgpOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBjaGlsZCA9IGVsZW1lbnQ7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCWNoaWxkID0gKChQcm9jZXNzQ29tcG9uZW50KSBlbGVtZW50KS5nZXRQcm9jZXNzKCk7Ci0JCQkJfQotCQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQljb2wuYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0VtcHR5UGFja2FnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJfHwgIShvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuSW5jbHVkaW5nRW1wdHlPYmplY3RzKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJaWYgKCFpc0VtcHR5UGFja2FnZShpdGVyLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gcHJpdmF0ZSBib29sZWFuIGFueVByb2Nlc3NDb21wb25lbnQoT2JqZWN0IHBhcmVudFByb2Nlc1BhY2thZ2UpIHsKLQkvLyBMaXN0IGxpc3QgPSAoKFByb2Nlc3NQYWNrYWdlKSBwYXJlbnRQcm9jZXNQYWNrYWdlKS5nZXRQcm9jZXNzRWxlbWVudHMoKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCS8vIE9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkvLyBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCS8vIGlmIChmaWx0ZXIuYWNjZXB0KG9iaikpCi0JLy8gcmV0dXJuIHRydWU7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCS8vdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY3MzI0ZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1Byb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuSUVsZW1lbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiUHJvY2Vzc2VzIiBmb2xkZXIgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElFbGVtZW50SXRlbVByb3ZpZGVyLCBJR3JvdXBDb250YWluZXIsCi0JCUlDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBNYXAgZ3JvdXBJdGVtUHJvdmlkZXJNYXA7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGNoaWxkcmVuOwotCi0JcHJvdGVjdGVkIE1ldGhvZFBsdWdpbiBwbHVnaW47Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIE1ldGhvZFBsdWdpbgotCSAqIEBwYXJhbSBNb2RlbFN0cnVjdHVyZQotCSAqIAotCSAqIFBsdWdpbiBpcyByZXF1aXJlZCB0byBwYXNzLCB1c2VkIGluIGZpbmRpbmcgTWV0aG9kUGFja2FnZSBmb3IgcGFydGljdWxhcgotCSAqIE1vZGVsU3RydWN0dXJlLCBNb2RlbFN0cnVjdHVyZSBpcyBvcHRpb25hbC4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMucGx1Z2luID0gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW10gewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9DYXBhYmlsaXR5UGF0dGVybnNfdGV4dCIpLCAvLyROT04tTkxTLTEkCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uc190ZXh0IikgfTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW11bXSBwcm9jZXNzUGF0aHMgPSBuZXcgU3RyaW5nW11bXSB7Ci0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGgsCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGggfTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvY2Vzc1BhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2UgcGtnMSA9IChQcm9jZXNzUGFja2FnZSkgVW1hVXRpbAotCQkJCQkJLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwgcHJvY2Vzc1BhdGhzW2ldKTsKLQkJCQlpZiAocGtnMSAhPSBudWxsKSB7Ci0JCQkJCU9iamVjdCBpbWFnZSA9IFVtYUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCQkJImZ1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCUNhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IG5ldyBDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcigKLQkJCQkJCQlhZGFwdGVyRmFjdG9yeSwgcGtnMSwgbmFtZXNbaV0sIGltYWdlKTsKLQkJCQkJaXRlbVByb3ZpZGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJCQljaGlsZHJlbi5hZGQoaXRlbVByb3ZpZGVyKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3NlcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Byb2Nlc3Nlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lciNnZXRHcm91cEl0ZW1Qcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0R3JvdXBJdGVtUHJvdmlkZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdyb3VwSXRlbVByb3ZpZGVyTWFwLmdldChuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1JvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1JvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOTM5YzBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiUm9sZSBTZXRzIiBmb2xkZXJzIGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlLCBJTGlicmFyeUl0ZW1Qcm92aWRlciwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuOwotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG9iamVjdCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSB7Ci0KLQkJCS8vIFRPRE86IGNvbW1lbnRlZCBvdXQgdW50aWwgSmluaHVhIGZpeGVkIGJ1Z3MgaW4KLQkJCS8vIENvbmZpZ3VyYXRpb25GaWx0ZXIKLQkJCWlmIChjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJCWNoaWxkcmVuID0gY29uZmlndXJhdG9yLmdldENoaWxkcmVuKG9iamVjdCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0cygpKTsKLQkJCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIlJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbigpOiByZXR1cm5lZCBmcm9tIGNvbmZpZ3VyYXRvcjogIiArIGNoaWxkcmVuKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gY2hpbGRyZW47Ci0JCQkJfQotCQkJfQotCi0JCQljaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQlSb2xlU2V0R3JvdXBpbmcgZ3JvdXBpbmcgPSAoUm9sZVNldEdyb3VwaW5nKSBvYmplY3Q7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmYgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgKChDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSBnZXRQYXJlbnQob2JqZWN0KSkKLQkJCQkJLmdldFRhcmdldCgpOwotCQkJVG5nVXRpbC5hZGRFeHRlbmRlZENoaWxkcmVuKGdyb3VwaW5nLCBtZXRob2RDb25mLCBjaGlsZHJlbiwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aCk7Ci0KLQkJCS8vIHNldCBwYXJlbnQKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGl0ZXIubmV4dCgpLAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudCh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfSBlbHNlIHsKLQkJCUNvbGxlY3Rpb24gY2hpbGRyZW5Db2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW5Db2wuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBjb250ZW50QWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJLmFkYXB0KGNoaWxkLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChjb250ZW50QWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGNvbnRlbnRBZGFwdGVyKS5zZXRQYXJlbnQob2JqZWN0KTsKLQkJCQl9Ci0JCQkJaWYgKGZpbHRlciAhPSBudWxsKQotCQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKQotCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbkNvbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JCS8vIGlmKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJLy8gTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBvYmplY3QpOwotCQkvLyBpZihwbHVnaW4gIT0gbnVsbCkgewotCQkvLyBTdHJpbmdbXSBwYXRoID0gewotCQkvLyBUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCS8vICxUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKQotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vICxUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpCi0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJLy8gfTsKLQkJLy8gT2JqZWN0IGFkYXB0ZXIgPQotCQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpLmFkYXB0KHBsdWdpbiwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gLy8gSUdyb3VwQ29udGFpbmVyIGdyb3VwcyA9IChJR3JvdXBDb250YWluZXIpCi0JCS8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcikuYWRhcHQocGx1Z2luLAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyAvLyBpbnQgaTsKLQkJLy8gLy8gZm9yKGkgPSAwOyBpIDwgcGF0aC5sZW5ndGggLSAxOyBpKyspIHsKLQkJLy8gLy8gZ3JvdXBzID0gKElHcm91cENvbnRhaW5lcikgZ3JvdXBzLmdldEdyb3VwSXRlbVByb3ZpZGVyKHBhdGhbaV0pOwotCQkvLyAvLyBpZihncm91cHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCS8vIC8vIH0KLQkJLy8gLy8gcmV0dXJuIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBncm91cHMuZ2V0R3JvdXBJdGVtUHJvdmlkZXIocGF0aFtpXSk7Ci0JCS8vIHJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJLy8gLy9yZXR1cm4gYWRhcHRlcjsKLQkJLy8gfQotCQkvLyB9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1JvbGVTZXRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiMWUzOGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1JvbGVTZXRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSByb2xlIHNldCBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uUm9sZVNldEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmFibGUsIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBSb2xlU2V0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY29sID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChnZXRQYXJlbnQob2JqZWN0KSk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSB7Ci0JCQljb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQkJRmlsdGVyVXRpbC5pdGVyYXRlQ29sbGVjdGlvbihjb2wsIGZpbHRlcik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElBbGxGaWx0ZXIKLQkJCQkJfHwgZmlsdGVyIGluc3RhbmNlb2YgSUNhdGVnb3J5RmlsdGVyKSB7Ci0JCQkJcmV0dXJuIGNvbDsKLQkJCX0KLQkJCS8vIEl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9Ci0JCQkvLyAoSXRlbVByb3ZpZGVyQWRhcHRlcikoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UpLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JCQkvLyAuYWRhcHQob2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJLy8gY29sID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBjb2w7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQlzdXBlci5zZXRQYXJlbnQocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JCS8vIHJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1ZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGI3MjI5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIFRoaXMgaXMgYSBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBzZWxlY3Rpb24uIFRoZSBmaWx0ZXIgd2lsbAotICogY2hlY2sgaWYgb2JqZWN0IGNhbiBiZSBhY2NlcHRlZCBhcyB0aGUgYmFzZSBlbGVtZW50IG9mIHRoZSBmaWx0ZXIgb3duZXIuCi0gKiAKLSAqIEZpbHRlciBydWxlczoKLSAqIAotICogMS4gVGhlIGVsZW1lbnQgaXRzZWxmIGFuZCBpdCdzIGdlbmVyYWxpemVycyAoY29udHJpYnV0b3IsIHJlcGxhY2VyLCBvcgotICogZXh0ZW5kZXIpIHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQKLSAqIDIuIEFueSBlbGVtZW50cyBpbiB0aGUgY29udGFpbm1lbnQgY2hhaW4gb2YgdGhlIGFib3ZlLCBzaG91bGQgYmUgZmlsdGVyZWQKLSAqIG91dAotICogMy4gaWYgYW55IG9mIHRoZSBiYXNlIGVsZW1lbnRzIGNhbid0IGJlIHNlbGVjdGVkLCB0aGVuIHRoaXMgZWxlbWVudCBjYW4ndAotICogYmUgc2VsZWN0ZWQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyIGltcGxlbWVudHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyIHsKLQotCXByaXZhdGUgVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQ7Ci0KLQlwcml2YXRlIExpc3QgYmFkZ3V5cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0KLQkJLy8gZmlyc3Qgb2YgYWxsLCB5b3UgY2FuJ3QgdmFyeSB5b3Vyc2VsZgotCQliYWRndXlzLmFkZChlbGVtZW50KTsKLQotCQkvLyBnZXQgYWxsIG15IGdlbmVyYWxpemVycwotCQlJdGVyYXRvciBpdCA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKGVsZW1lbnQpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQliYWRndXlzLmFkZCh2ZSk7Ci0KLQkJCS8vIHRoZSBjb250YWlubWVudCBjaGFpbiBvbiBteSBnZW5lcmFsaXplcnMgY2FuJ3QgYmUgbXkgYmFzZQotCQkJaGFuZGxlQ29udGFpbm1lbnRDaGFpbih2ZSk7Ci0JCX0KLQotCQkvLyBlbGVtZW50J3MgaW4gbXkgY2hhaW4gY2FuJ3QgYmUgbXkgYmFzZQotCQloYW5kbGVDb250YWlubWVudENoYWluKGVsZW1lbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVDb250YWlubWVudENoYWluKFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JCWlmICghaGFzQ29udGFpbm1lbnRGZWF0dXJlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChlIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCUxpc3Qgcm9vdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlsb2FkUm9vdEN1c3RvbUNhdGVnb3JpZXMoKEN1c3RvbUNhdGVnb3J5KSBlLCByb290cyk7Ci0JCQliYWRndXlzLmFkZEFsbChyb290cyk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQlMaXN0IHJvb3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZGVsaXZlcmFibGVQYXJ0cygoRGVsaXZlcmFibGUpIGUsIHJvb3RzKTsKLQkJCWJhZGd1eXMuYWRkQWxsKHJvb3RzKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGlmIHRoZSBlbGVtZW50IGhhcyBjb250YWlubWVudCBmZWF0dXJlLAotCQkJLy8geW91IGNhbid0IHNlbGVjdCB0aGUgZWxlbWVudCBpbiB0aGUgY29udGFpbm1lbnQgY2hhaW4KLQkJCUVPYmplY3Qgcm9vdCA9IGdldENoYWluUm9vdChlKTsKLQkJCWlmICghYmFkZ3V5cy5jb250YWlucyhyb290KSkgewotCQkJCWJhZGd1eXMuYWRkKHJvb3QpOwotCQkJfQotCi0JCQkvKgotCQkJICogaG9sZCBvZmYgZm9yIG5vdyAvLyBhbHNvIG9ubHkgb25lIGVsZW1lbnQgaW4gYSBjaGFpbiBjYW4gYmUKLQkJCSAqIHNlbGVjdGVkIGFzIGJhc2UgLy8gc28gZ2V0IGFsbCB0aGUgYmFzZSBlbGVtZW50cyBpbiB0aGUgZWxlbWVudAotCQkJICogY2hhaW4sIGFuZCBibG9jayB0aGUgZWxlbWVudCBjaGFpbiBvZiB0aGUgYmFzZSBlbGVtZW50cwotCQkJICogZmlsdGVyVXNlZEJhc2VDaGFpbigoVmFyaWFiaWxpdHlFbGVtZW50KXJvb3QpOyBmb3IgKEl0ZXJhdG9yIGl0ID0KLQkJCSAqIHJvb3QuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTsgKSB7IE9iamVjdCBvID0gaXQubmV4dCgpOyBpZiAoCi0JCQkgKiBvLmdldENsYXNzKCkuaXNJbnN0YW5jZShlbGVtZW50KSApIHsKLQkJCSAqIGZpbHRlclVzZWRCYXNlQ2hhaW4oKFZhcmlhYmlsaXR5RWxlbWVudClvKTsgfSB9Ci0JCQkgKi8KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbGl2ZXJhYmxlUGFydHMoRGVsaXZlcmFibGUgZSwgTGlzdCByb290cykgewotCQlMaXN0IGxpc3QgPSAoKERlbGl2ZXJhYmxlKSBlKS5nZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQlyb290cy5hZGQob2JqKTsKLQkJCQkJZGVsaXZlcmFibGVQYXJ0cygoRGVsaXZlcmFibGUpIG9iaiwgcm9vdHMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkUm9vdEN1c3RvbUNhdGVnb3JpZXMoQ3VzdG9tQ2F0ZWdvcnkgZSwgTGlzdCByb290cykgewotCQlMaXN0IGNzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhlKTsKLQkJaWYgKGNzICE9IG51bGwgJiYgY3Muc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlDdXN0b21DYXRlZ29yeSBjYyA9IChDdXN0b21DYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJCWlmICghVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeShjYykpIHsKLQkJCQkJbG9hZFJvb3RDdXN0b21DYXRlZ29yaWVzKGNjLCByb290cyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKCFyb290cy5jb250YWlucyhlKSkgewotCQkJCQkJcm9vdHMuYWRkKGUpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmICghcm9vdHMuY29udGFpbnMoZSkpIHsKLQkJCXJvb3RzLmFkZChlKTsKLQkJfQotCX0KLQotCS8vIHByaXZhdGUgdm9pZCBmaWx0ZXJVc2VkQmFzZUNoYWluKFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JLy8gVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkvLyBpZiAoYmFzZSAhPSBudWxsKSB7Ci0JLy8gLy8gaWYgdGhlIGVsZW1lbnQgY2hhaW4gaXMgc2VsZWN0ZWQgYXMgYmFzZSBpbiB0aGUgY3VycmVudCBjaGFpbiwKLQkvLyAvLyBubyBlbGVtZW50IGluIHRoYXQgY2hhaW4gY2FuIGJlIGZ1dGhlciBzZWxlY3RlZAotCS8vIE9iamVjdCByb290ID0gZ2V0Q2hhaW5Sb290KGJhc2UpOwotCS8vIGlmICghYmFkZ3V5cy5jb250YWlucyhyb290KSkgewotCS8vIGJhZGd1eXMuYWRkKHJvb3QpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0NvbnRhaW5tZW50RmVhdHVyZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBEb21haW4gfHwgZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5Ci0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIEFydGlmYWN0IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBQcmFjdGljZQotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgZ2V0Q2hhaW5Sb290KE1ldGhvZEVsZW1lbnQgZSkgewotCQlFT2JqZWN0IHJvb3QgPSBlOwotCQlPYmplY3QgdHlwZSA9IGVsZW1lbnQuZ2V0VHlwZSgpOwotCQlFT2JqZWN0IHBhcmVudCA9IGU7Ci0JCXdoaWxlICgocGFyZW50ID0gcGFyZW50LmVDb250YWluZXIoKSkgIT0gbnVsbAotCQkJCSYmICgoTWV0aG9kRWxlbWVudCkgcGFyZW50KS5nZXRUeXBlKCkgPT0gdHlwZSkgewotCQkJcm9vdCA9IHBhcmVudDsKLQkJfQotCi0JCXJldHVybiByb290OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0KLQkJLy8gYWx3YXlzIGFjY2VwdCBwYWNrYWdlcwotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSB8fCBvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4KLQkJCQl8fCBvYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlCi0JCQkJfHwgb2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvLyBtdXN0IGJlIHZhcmlhYmlsaXR5IGVsZW1lbnQgYW5kIGNhbid0IGJlIGl0c2VsZgotCQlpZiAob2JqID09IGVsZW1lbnQgfHwgIShvYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBtdXN0IGJlIHRoZSBzYW1lIHR5cGUKLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqOwotCQlpZiAodmUuZ2V0VHlwZSgpICE9IGVsZW1lbnQuZ2V0VHlwZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBjYW4ndCBiZSBteSBhbnkgb2YgbXkgZ2VuZXJhbGl6ZXJzCi0JCWlmIChiYWRndXlzLmNvbnRhaW5zKG9iaikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGlmIHRoaXMgZWxlbWVudCdzIGJhc2UgY2hhaW4gaXMgYSBiYWRndXksIGNhbid0IGFjY2VwdCwgb3RoZXJ3aXNlLCBhCi0JCS8vIGNpcmN1bGFyIGxvY2sKLQkJd2hpbGUgKCh2ZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgIT0gbnVsbCkgewotCQkJaWYgKGJhZGd1eXMuY29udGFpbnModmUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCS8vIGFueXRoaW5nIGVsc2UgPwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MzMwNGMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpdGVtIHByb3ZpZGVycyBmb3IgZGlzcGxheWluZyBhbmQgZmlsdGVyaW5nIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQWJzdHJhY3RQcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQWJzdHJhY3RQcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmIxOTdlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0Fic3RyYWN0UHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LklFbGVtZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgY2xhc3MgZm9yIHRoZSAiUHJvY2Vzc2VzIiBmb2xkZXIgaW4KLSAqIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLAotCQlJRWxlbWVudEl0ZW1Qcm92aWRlciwgSUdyb3VwQ29udGFpbmVyIHsKLQlwcm90ZWN0ZWQgTWFwIGdyb3VwSXRlbVByb3ZpZGVyTWFwOwotCi0JcHJvdGVjdGVkIE1vZGVsU3RydWN0dXJlIG1vZGVsU3RydWN0OwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBjaGlsZHJlbjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBwcm9jZXNzQ29udHJpYnV0aW9uRW5hYmxlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcmVmU3RvcmVMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1vZGVsU3RydWN0dXJlIG1vZGVsU3RydWN0KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5tb2RlbFN0cnVjdCA9IG1vZGVsU3RydWN0OwotCi0JCS8vIGZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gUHJvdmlkZXJzLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkvLyBpZiAocHJlZlN0b3JlICE9IG51bGwpIHsKLQkJLy8gcHJvY2Vzc0NvbnRyaWJ1dGlvbkVuYWJsZWQgPSBwcmVmU3RvcmUKLQkJLy8gLmdldEJvb2xlYW4oTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9FTkFCTEVfUFJPQ0VTU19DT05UUklCVVRJT04pOwotCQkvLyBwcmVmU3RvcmVMaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJLy8KLQkJLy8gcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKSA9PQotCQkvLyBMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX0VOQUJMRV9QUk9DRVNTX0NPTlRSSUJVVElPTikgewotCQkvLyBib29sZWFuIG5ld1ZhbHVlID0gcHJlZlN0b3JlLmdldEJvb2xlYW4oZXZlbnQKLQkJLy8gLmdldFByb3BlcnR5KCkpOwotCQkvLyBpZiAocHJvY2Vzc0NvbnRyaWJ1dGlvbkVuYWJsZWQgIT0gbmV3VmFsdWUpIHsKLQkJLy8gcHJvY2Vzc0NvbnRyaWJ1dGlvbkVuYWJsZWQgPSBuZXdWYWx1ZTsKLQkJLy8gZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbigKLQkJLy8gbmV3IE5vdGlmaWNhdGlvbkltcGwoLTEsIC0xLCAtMSksCi0JCS8vIEFic3RyYWN0UHJvY2Vzc2VzSXRlbVByb3ZpZGVyLnRoaXMsIHRydWUsCi0JCS8vIGZhbHNlKSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCS8vCi0JCS8vIH07Ci0JCS8vIHByZWZTdG9yZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByZWZTdG9yZUxpc3RlbmVyKTsKLQkJLy8gfQotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gUHJvdmlkZXJzLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlpZiAocHJlZlN0b3JlICE9IG51bGwgJiYgcHJlZlN0b3JlTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJcHJlZlN0b3JlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJlZlN0b3JlTGlzdGVuZXIpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lciNnZXRHcm91cEl0ZW1Qcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0R3JvdXBJdGVtUHJvdmlkZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdyb3VwSXRlbVByb3ZpZGVyTWFwLmdldChuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3NlcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Byb2Nlc3Nlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0NhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0NhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRhZGNiNjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9DYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGNhcGFiaWxpdHkgcGF0dGVybiBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbAotCQkJCS5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX0NhcGFiaWxpdHlQYXR0ZXJuX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Db25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Db25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMzk5ZWRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiQ29uZmlndXJhdGlvbnMiIGZvbGRlciBpbiB0aGUgTGlicmFyeQotICogdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciB7Ci0KLQkvLyBwcml2YXRlIE1ldGhvZExpYnJhcnkgbWV0aG9kTGlicmFyeTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kTGlicmFyeSBsaWIsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBsaWIsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiAhKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NGYW1pbHkpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ29uZmlndXJhdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKE1ldGhvZExpYnJhcnkpIHRhcmdldCkKLQkJCQkJLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLCAoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfQ09ORklHVVJBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVDbGFzcygpCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnkuY2xhc3M7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNjcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kKGRvbWFpbiwgKEVPYmplY3QpIHRhcmdldCwKLQkJCQlmZWF0dXJlLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24sIHRoaXMpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQjZ2V0VmFsaWRhdG9yKCkKLQkJCSAqLwotCQkJcHJvdGVjdGVkIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlTmFtZVZhbGlkYXRvcihvd25lciwgKE1ldGhvZENvbmZpZ3VyYXRpb24pY2hpbGQpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VmFsaWRhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Db250ZW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0NvbnRlbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmY4Y2YyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0NvbnRlbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuSUVsZW1lbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIk1ldGhvZCBDb250ZW50IiBmb2xkZXIgaW4gdGhlIExpYnJhcnkKLSAqIHZpZXcuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW5hbWVkIGFzICJNZXRob2RDb250ZW50SXRlbVByb3ZpZGVyIiBpbiBFUEYgTTUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsCi0JCUlFbGVtZW50SXRlbVByb3ZpZGVyLCBJR3JvdXBDb250YWluZXIgewotCi0JcHJpdmF0ZSBNZXRob2RQbHVnaW4gcGx1Z2luOwotCi0JcHJpdmF0ZSBNb2RlbFN0cnVjdHVyZSBtb2RlbFN0cnVjdDsKLQotCXByaXZhdGUgTWFwIGdyb3VwSXRlbVByb3ZpZGVyTWFwOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgY2hpbGRyZW47Ci0KLQlwcml2YXRlIENvbnRlbnRQYWNrYWdlIGNvcmVDb250ZW50UGtnOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29udGVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4sIE1vZGVsU3RydWN0dXJlIG1vZGVsU3RydWN0KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5wbHVnaW4gPSBwbHVnaW47Ci0JCXRoaXMubW9kZWxTdHJ1Y3QgPSBtb2RlbFN0cnVjdDsKLQl9Ci0JCi0JcHVibGljIE5vdGlmaWVyIGdldFRhcmdldCgpIHsKLQkJcmV0dXJuIGNvcmVDb250ZW50UGtnOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJU3RyaW5nIG5hbWU7Ci0JCQlJTGlicmFyeUl0ZW1Qcm92aWRlciBjaGlsZDsKLQotCQkJLy8gZmluZCBjb3JlIGNvbnRlbnQgcGFja2FnZQotCQkJQ29udGVudFBhY2thZ2UgY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJbW9kZWxTdHJ1Y3QuY29yZUNvbnRlbnRQYXRoKTsKLQkJCWNvcmVDb250ZW50UGtnID0gY29udGVudFBrZzsKLQkJCWlmIChjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9NZXRob2RDb250ZW50X2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljaGlsZCA9IG5ldyBNZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkJCWNvbnRlbnRQa2csIG5hbWUpOwotCQkJCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCQkvLyBjb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCS8vIG1vZGVsU3RydWN0LmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0JCQkJLy8gaWYoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJLy8gbmFtZSA9Ci0JCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKTsKLQkJCQkvLyBjaGlsZCA9IG5ldyBEaXNjaXBsaW5lQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkvLyBjb250ZW50UGtnLCBuYW1lKTsKLQkJCQkvLyBjaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJLy8gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJCS8vIH0KLQkJCQkvLwkgICAgICAgIAotCQkJCS8vIGNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJLy8gbW9kZWxTdHJ1Y3QuZG9tYWluUGF0aCk7Ci0JCQkJLy8gaWYoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJLy8gbmFtZSA9Ci0JCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRG9tYWluc19ncm91cCIpOwotCQkJCS8vIGNoaWxkID0gbmV3IERvbWFpbnNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2csCi0JCQkJLy8gbmFtZSk7Ci0JCQkJLy8gY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCS8vIGNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJCQkvLyB9Ci0JCQkJLy8JCi0JCQkJLy8gY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkvLyBtb2RlbFN0cnVjdC53b3JrUHJvZHVjdFR5cGVQYXRoKTsKLQkJCQkvLyBpZihjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQkvLyBuYW1lID0KLQkJCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwIik7Ci0JCQkJLy8gY2hpbGQgPSBuZXcgV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkvLyBjb250ZW50UGtnLCBuYW1lKTsKLQkJCQkvLyBjaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJLy8gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJCS8vIH0KLQkJCQkvLwkgICAgICAgIAotCQkJCS8vIGNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJLy8gbW9kZWxTdHJ1Y3Qucm9sZVNldFBhdGgpOwotCQkJCS8vIGlmKGNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCS8vIG5hbWUgPQotCQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpOwotCQkJCS8vIGNoaWxkID0gbmV3IFJvbGVTZXRzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnLAotCQkJCS8vIG5hbWUpOwotCQkJCS8vIGNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQkvLyBjaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCQkJLy8gfQotCQkJCS8vCSAgICAgICAgCi0JCQkJLy8gY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkvLyBtb2RlbFN0cnVjdC50b29sUGF0aCk7Ci0JCQkJLy8gaWYoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJLy8gbmFtZSA9Ci0JCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVG9vbHNfZ3JvdXAiKTsKLQkJCQkvLyBjaGlsZCA9IG5ldyBUb29sc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZywKLQkJCQkvLyBuYW1lKTsKLQkJCQkvLyBjaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJLy8gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJCS8vIH0KLQotCQkJCS8vIGNyZWF0ZSB0aGUgc3RhbmRhcmQgY2F0ZWdvcmllcyBmb2xkZXIKLQkJCQljb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQkJbW9kZWxTdHJ1Y3Quc3RhbmRhcmRDYXRlZ29yeVBhdGgpOwotCQkJCWlmIChjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQljaGlsZCA9IG5ldyBTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJCQkJY29udGVudFBrZywgbmFtZSk7Ci0JCQkJCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJCQl9Ci0KLQkJCQkvLyBjcmVhdGUgdGhlIGN1c3RvbWUgY2F0ZWdvcmllcyBmb2xkZXIKLQkJCQkvLyBjb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCS8vIG1vZGVsU3RydWN0LmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCQkJLy8gaWYoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJLy8gbmFtZSA9Ci0JCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXAiKTsKLQkJCQkvLyBjaGlsZCA9IG5ldyBDdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LAotCQkJCS8vIGNvbnRlbnRQa2csIG5hbWUpOwotCQkJCS8vIGNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQkvLyBjaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCQkJLy8gfQotCi0JCQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdEN1c3RvbUNhdGVnb3J5ID0gVG5nVXRpbAotCQkJCQkJLmdldFJvb3RDdXN0b21DYXRlZ29yeShwbHVnaW4pOwotCQkJCWlmIChyb290Q3VzdG9tQ2F0ZWdvcnkgIT0gbnVsbCkgewotCQkJCQlib29sZWFuIG5vdGlmeSA9IHJvb3RDdXN0b21DYXRlZ29yeS5lRGVsaXZlcigpOwotCQkJCQl0cnkgewotCQkJCQkJcm9vdEN1c3RvbUNhdGVnb3J5LmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQkJCXJvb3RDdXN0b21DYXRlZ29yeS5zZXROYW1lKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9DdXN0b21fQ2F0ZWdvcmllc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJcm9vdEN1c3RvbUNhdGVnb3J5LmVTZXREZWxpdmVyKG5vdGlmeSk7Ci0JCQkJCX0KLQkJCQkJY2hpbGRyZW4uYWRkKHJvb3RDdXN0b21DYXRlZ29yeSk7Ci0JCQkJfQotCi0JCQkJLy8gSUNvbmZpZ3VyYWJsZSBhZGFwdGVyID0gKElDb25maWd1cmFibGUpCi0JCQkJLy8gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLmFkYXB0KGNvbnRlbnRQa2csCi0JCQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkvLyBhZGFwdGVyLnNldExhYmVsKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX01ldGhvZENvbnRlbnRfZ3JvdXAiKSk7Ci0JCQkJLy8gY2hpbGRyZW4uYWRkKGNvbnRlbnRQa2cpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ29udGVudCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyI2dldEdyb3VwSXRlbVByb3ZpZGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRHcm91cEl0ZW1Qcm92aWRlcihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ3JvdXBJdGVtUHJvdmlkZXJNYXAgIT0gbnVsbCA/IGdyb3VwSXRlbVByb3ZpZGVyTWFwLmdldChuYW1lKQotCQkJCTogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGdyb3VwSXRlbVByb3ZpZGVyTWFwICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdyb3VwSXRlbVByb3ZpZGVyTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgYWRhcHRlciA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJCQkJKChJRGlzcG9zYWJsZSkgYWRhcHRlcikuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLmNsZWFyKCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcCA9IG51bGw7Ci0JCX0KLQkJaWYoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJY2hpbGRyZW4uY2xlYXIoKTsKLQkJfQotCQlwbHVnaW4gPSBudWxsOwotCQljb3JlQ29udGVudFBrZyA9IG51bGw7Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9EZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcyOWNmYTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9EZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBkZWxpdmVyeSBwcm9jZXNzIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCi0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNDQ0ZTgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JUmVmZXJlbmNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmJyZWFrZG93bmVsZW1lbnQuQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5icmVha2Rvd25lbGVtZW50Lk1pbGVzdG9uZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRGlzY2lwbGluZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlJvbGVTZXRDYXRlZ29yeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlJvbGVTZXRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Ub29sSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5BcnRpZmFjdEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuR3VpZGFuY2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LlJvbGVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LlNlY3Rpb25JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LlRhc2tJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LldvcmtQcm9kdWN0SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBVbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQlpbXBsZW1lbnRzIElSZWZlcmVuY2VyIHsKLQotCXByaXZhdGUgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgd29ya1Byb2R1Y3RJdGVtUHJvdmlkZXI7Ci0KLQlwcml2YXRlIEFydGlmYWN0SXRlbVByb3ZpZGVyIG15QXJ0aWZhY3RJdGVtUHJvdmlkZXI7Ci0KLQlwcml2YXRlIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGd1aWRhbmNlSXRlbVByb3ZpZGVyOwotCi0JcHJpdmF0ZSBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlciBteU91dGNvbWVJdGVtUHJvdmlkZXI7Ci0KLQlwcml2YXRlIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIG15RGVsaXZlcmFibGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBSZWZlcmVuY2VzIHRvIHN0YXRlZnVsIGFkYXB0ZXJzIGNyZWF0ZWQgYnkgdGhpcyBhZGFwdGVyIGZhY3RvcnkKLQkgKi8KLQlwcml2YXRlIFNldCBkaXNwb3NhYmxlQWRhcHRlcnMgPSBuZXcgSGFzaFNldCgpOwotCi0JLy8gcHJvdGVjdGVkIENvbGxlY3Rpb24gYWRhcHRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjYWRhcHQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBzdXBlci5hZGFwdChub3RpZmllciwgdHlwZSk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSVN0YXRlZnVsSXRlbVByb3ZpZGVyCi0JCQkJJiYgbm90aWZpZXIgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJJiYgKChFT2JqZWN0KSBub3RpZmllcikuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCWRpc3Bvc2FibGVBZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29yZWNvbnRlbnRBZGFwdGVyRmFjdG9yeSNjcmVhdGVSb2xlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZUFkYXB0ZXIoKSB7Ci0JCWlmIChyb2xlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJvbGVJdGVtUHJvdmlkZXIgPSBuZXcgUm9sZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gcm9sZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db3JlY29udGVudEFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRhc2tBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrQWRhcHRlcigpIHsKLQkJaWYgKHRhc2tJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGFza0l0ZW1Qcm92aWRlciA9IG5ldyBUYXNrSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHRhc2tJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuV29ya3Byb2R1Y3RzQWRhcHRlckZhY3RvcnkjY3JlYXRlQXJ0aWZhY3RBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcnRpZmFjdEFkYXB0ZXIoKSB7Ci0JCWlmIChteUFydGlmYWN0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW15QXJ0aWZhY3RJdGVtUHJvdmlkZXIgPSBuZXcgQXJ0aWZhY3RJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbXlBcnRpZmFjdEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdEFkYXB0ZXIoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdEl0ZW1Qcm92aWRlciA9IG5ldyBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gd29ya1Byb2R1Y3RJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuV29ya3Byb2R1Y3RzQWRhcHRlckZhY3RvcnkjY3JlYXRlRGVsaXZlcmFibGVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyYWJsZUFkYXB0ZXIoKSB7Ci0JCWlmIChteURlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW15RGVsaXZlcmFibGVJdGVtUHJvdmlkZXIgPSBuZXcgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHN1cGVyLmNyZWF0ZURlbGl2ZXJhYmxlQWRhcHRlcigpKTsKLQkJfQotCi0JCXJldHVybiBteURlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLldvcmtwcm9kdWN0c0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZU91dGNvbWVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRjb21lQWRhcHRlcigpIHsKLQkJaWYgKG15T3V0Y29tZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlteU91dGNvbWVJdGVtUHJvdmlkZXIgPSBuZXcgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHN1cGVyLmNyZWF0ZU91dGNvbWVBZGFwdGVyKCkpOwotCQl9Ci0KLQkJcmV0dXJuIG15T3V0Y29tZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25BZGFwdGVyKCkgewotCQlpZiAobWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQltZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyID0gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZU1ldGhvZExpYnJhcnlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RMaWJyYXJ5QWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIGFkYXB0ZXJzLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb2Nlc3NGYW1pbHlBZGFwdGVyKCkKLQkgKi8KLQkvKgotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NGYW1pbHlBZGFwdGVyKCkgewotCQlpZiAocHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyID0gbmV3IFByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlcjsKLQl9Ci0JKi8KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRQYWNrYWdlQWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyBhZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFBsdWdpbkFkYXB0ZXIoKSB7Ci0JCU1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBhZGFwdGVyID0gbmV3IE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJYWRhcHRlci5zZXRNb2RlbFN0cnVjdHVyZShNb2RlbFN0cnVjdHVyZS5ERUZBVUxUKTsKLQkJLy8gYWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5NZXRob2Rtb2RlbHNBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzQ29tcG9uZW50QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5NZXRob2Rtb2RlbHNBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NQYWNrYWdlQWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyBhZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnRjYXRlZ29yaWVzQWRhcHRlckZhY3RvcnkjY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nQWRhcHRlcigpIHsKLQkJaWYgKGRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCQlyZXR1cm4gZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnRjYXRlZ29yaWVzQWRhcHRlckZhY3RvcnkjY3JlYXRlRG9tYWluQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRG9tYWluQWRhcHRlcigpIHsKLQkJaWYgKGRvbWFpbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkb21haW5JdGVtUHJvdmlkZXIgPSBuZXcgRG9tYWluSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRvbWFpbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0R3JvdXBpbmdBZGFwdGVyKCkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgUm9sZVNldENhdGVnb3J5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyBhZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnRjYXRlZ29yaWVzQWRhcHRlckZhY3RvcnkjY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVBZGFwdGVyKCkgewotCQkvLyBpZiAoZGlzY2lwbGluZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCS8vIGRpc2NpcGxpbmVJdGVtUHJvdmlkZXIgPSBuZXcgRGlzY2lwbGluZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gfQotCQkvLwotCQkvLyByZXR1cm4gZGlzY2lwbGluZUl0ZW1Qcm92aWRlcjsKLQotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgRGlzY2lwbGluZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gYWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50Y2F0ZWdvcmllc0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVJvbGVTZXRBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0QWRhcHRlcigpIHsKLQkJLy8gaWYgKHJvbGVTZXRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkvLyByb2xlU2V0SXRlbVByb3ZpZGVyID0gbmV3IFJvbGVTZXRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gcmV0dXJuIHJvbGVTZXRJdGVtUHJvdmlkZXI7Ci0KLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IFJvbGVTZXRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIGFkYXB0ZXJzLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkNvbnRlbnRjYXRlZ29yaWVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlVG9vbEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRvb2xBZGFwdGVyKCkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgVG9vbEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gYWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQ29udGVudGNhdGVnb3JpZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVXb3JrUHJvZHVjdFR5cGVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdFR5cGVBZGFwdGVyKCkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyBhZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYUFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUd1aWRhbmNlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCkgewotCQlpZiAoZ3VpZGFuY2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZ3VpZGFuY2VJdGVtUHJvdmlkZXIgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGd1aWRhbmNlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVDaGVja2xpc3RBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDaGVja2xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUNvbmNlcHRBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25jZXB0QWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVFc3RpbWF0ZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVzdGltYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMKLQkgKiAgICAgIEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9uc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlRXN0aW1hdGluZ01ldHJpY0FkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVzdGltYXRpbmdNZXRyaWNBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUV4YW1wbGVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeGFtcGxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcmFjdGljZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByYWN0aWNlQWRhcHRlcigpIHsKLQkJaWYgKHByYWN0aWNlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByYWN0aWNlSXRlbVByb3ZpZGVyID0gbmV3IFByYWN0aWNlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBwcmFjdGljZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUmVwb3J0QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVwb3J0QWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVSb2FkbWFwQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9hZG1hcEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUmV1c2FibGVBc3NldEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJldXNhYmxlQXNzZXRBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlVGVjaG5pcXVlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVjaG5pcXVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVUZW1wbGF0ZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlbXBsYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVUZXJtRGVmaW5pdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlcm1EZWZpbml0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVUb29sTWVudG9yQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVG9vbE1lbnRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlV29ya1Byb2R1Y3RHdWlkZWxpbmVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdEd1aWRlbGluZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN0aW9uQWRhcHRlcigpIHsKLQkJaWYgKHNlY3Rpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc2VjdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBTZWN0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNlY3Rpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUN1c3RvbUNhdGVnb3J5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ3VzdG9tQ2F0ZWdvcnlBZGFwdGVyKCkgewotCQlpZiAoY3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgPSBuZXcgQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2hpdGVwYXBlckFkYXB0ZXIoKSB7Ci0JCS8vIGlmICh3aGl0ZXBhcGVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJLy8gd2hpdGVwYXBlckl0ZW1Qcm92aWRlciA9IG5ldyBXaGl0ZXBhcGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyB9Ci0JCS8vCi0JCS8vIHJldHVybiB3aGl0ZXBhcGVySXRlbVByb3ZpZGVyOwotCi0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCWlmIChjYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciA9IG5ldyBDYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJaWYgKGRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgPSBuZXcgRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlR3VpZGVsaW5lQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGVsaW5lQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChjb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID0gbmV3IENvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVJvbGVEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRhc2tEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSB7Ci0JCWlmIChtaWxlc3RvbmVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWlsZXN0b25lSXRlbVByb3ZpZGVyID0gbmV3IE1pbGVzdG9uZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gbWlsZXN0b25lSXRlbVByb3ZpZGVyOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBoYXNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGd1aWRhbmNlSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWd1aWRhbmNlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCWd1aWRhbmNlSXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJfQotCQlpZiAobXlBcnRpZmFjdEl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlteUFydGlmYWN0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCW15QXJ0aWZhY3RJdGVtUHJvdmlkZXIgPSBudWxsOwotCQl9Ci0JCWlmIChteURlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCW15RGVsaXZlcmFibGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJbXlEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCX0KLQkJaWYgKG15T3V0Y29tZUl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlteU91dGNvbWVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJbXlPdXRjb21lSXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJfQotCQlpZiAod29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJd29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJd29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgPSBudWxsOwotCQl9Ci0KLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChhZGFwdGVycykuaXRlcmF0b3IoKTsKLQkJLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIE9iamVjdCBhZGFwdGVyID0gaXRlci5uZXh0KCk7Ci0JCS8vIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJRGlzcG9zYWJsZSkgewotCQkvLyAoKElEaXNwb3NhYmxlKWFkYXB0ZXIpLmRpc3Bvc2UoKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIGFkYXB0ZXJzLmNsZWFyKCk7Ci0KLQkJaWYgKCFkaXNwb3NhYmxlQWRhcHRlcnMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaXNwb3NhYmxlQWRhcHRlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSURpc3Bvc2FibGUgYWRhcHRlciA9IChJRGlzcG9zYWJsZSkgaXRlci5uZXh0KCk7Ci0JCQkJYWRhcHRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlkaXNwb3NhYmxlQWRhcHRlcnMuY2xlYXIoKTsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklSZWZlcmVuY2VyI3JlbW92ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgcmVmKSB7Ci0JCXJldHVybiBkaXNwb3NhYmxlQWRhcHRlcnMucmVtb3ZlKHJlZik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklSZWZlcmVuY2VyI2NsZWFuVXAoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFuVXAoKSB7Ci0JCUFycmF5TGlzdCBhZGFwdGVyc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KGRpc3Bvc2FibGVBZGFwdGVycykuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlcgotCQkJCQkmJiBhZGFwdGVyLmdldFRhcmdldCgpID09IG51bGwpIHsKLQkJCQlhZGFwdGVyc1RvUmVtb3ZlLmFkZChhZGFwdGVyKTsKLQkJCX0KLQkJfQotCQlpZiAoVG5nVXRpbC5ERUJVRykgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuY2xlYW5VcCgpOiBudW1iZXIgb2YgYWRhcHRlcnMgdG8gcmVtb3ZlOiAiCi0JCQkJCQkJKyBhZGFwdGVyc1RvUmVtb3ZlLnNpemUoKSk7Ci0JCX0KLQkJZGlzcG9zYWJsZUFkYXB0ZXJzLnJlbW92ZUFsbChhZGFwdGVyc1RvUmVtb3ZlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBhZDk3OGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBsaWIgPSAoRU9iamVjdCkgcGFyZW50OwotCQkJaWYgKGxpYiA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCQkuZ2V0QWRhcHRlcihsaWIsIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQkJcmV0dXJuIGl0ZW1Qcm92aWRlciAhPSBudWxsID8gaXRlbVByb3ZpZGVyLmdldENvbmZpZ3VyYXRpb25zKCkKLQkJCQkJOiBudWxsOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiODQ0M2QyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QbHVnaW5VSVBhY2thZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5QbHVnaW5VSVBhY2thZ2VzTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgbWV0aG9kIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlciBjb25maWd1cmF0aW9uczsKLQkKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXI+IHBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcj4oKTsKLQkKLQotCS8vcHJpdmF0ZSBQcm9jZXNzRmFtaWxpZXNJdGVtUHJvdmlkZXIgcHJvY0ZhbWlsaWVzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2lucygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVNZXRob2RQbHVnaW4oKSkpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBjaGlsZHJlbjsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkgJiYgIVBsdWdpblVJUGFja2FnZUNvbnRleHQuSU5TVEFOQ0UuaXNGbGF0TGF5b3V0KCkpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJTGlzdDxNZXRob2RQbHVnaW4+IHBsdWdpbnMgPSBnZXRNZXRob2RQbHVnaW5zKChNZXRob2RMaWJyYXJ5KW9iamVjdCk7Ci0JCQlhZGRDaGlsZHJlbihjaGlsZHJlbiwgcGx1Z2lucywgb2JqZWN0KTsKLQkJCUNvbGxlY3Rpb25zLnNvcnQoY2hpbGRyZW4sIENvbXBhcmF0b3JzLlBMVUdJTlBBQ0tBR0VfQ09NUEFSQVRPUik7Ci0JCX0gZWxzZSB7IAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCWlmIChjb2xsZWN0aW9uIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCWNoaWxkcmVuID0gKExpc3QpIGNvbGxlY3Rpb247Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdChjb2xsZWN0aW9uKTsKLQkJCX0KLQkJCS8vIHNldCBwYXJlbnRzCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGl0ZXIubmV4dCgpLAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudCh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUNvbGxlY3Rpb25zLnNvcnQoY2hpbGRyZW4sIENvbXBhcmF0b3JzLlBMVUdJTlBBQ0tBR0VfQ09NUEFSQVRPUik7Ci0JCX0KLQkJaWYgKGNvbmZpZ3VyYXRpb25zID09IG51bGwpIHsKLQkJCWNvbmZpZ3VyYXRpb25zID0gbmV3IENvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQkoTWV0aG9kTGlicmFyeSkgb2JqZWN0LCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Db25maWd1cmF0aW9uc190ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2hpbGRyZW4uYWRkKGNvbmZpZ3VyYXRpb25zKTsKLQotCQkvLyBSZW1vdmUgJ1Byb2Nlc3MgRmFtaWxpZXMnIHVudGlsIGl0IGlzIGZ1bGx5IGltcGxlbWVudGVkCi0JCS8vCi0JCS8vIGlmKHByb2NGYW1pbGllcyA9PSBudWxsKSB7Ci0JCS8vIHByb2NGYW1pbGllcyA9IG5ldyBQcm9jZXNzRmFtaWxpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCS8vIChNZXRob2RMaWJyYXJ5KSBvYmplY3QsCi0JCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Byb2Nlc3NGYW1pbGllc190ZXh0IikpOwotCQkvLyB9Ci0JCS8vIGNoaWxkcmVuLmFkZChwcm9jRmFtaWxpZXMpOwotCQkKLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRDaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBMaXN0PE1ldGhvZFBsdWdpbj4gcGx1Z2lucywgT2JqZWN0IHBhcmVudCkgewotCQlQbHVnaW5VSVBhY2thZ2VzTWFwIG1hcCA9IG5ldyBQbHVnaW5VSVBhY2thZ2VzTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3I8TWV0aG9kUGx1Z2luPiBpdGVyID0gcGx1Z2lucy5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBwbHVnaW4uZ2V0TmFtZSgpOwotCQkJaW50IGRvdElkeCA9IHBsdWdpbk5hbWUuaW5kZXhPZihQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyLlBBQ0tBR0VfU0VQQVJBVE9SKTsKLQkJCWlmIChkb3RJZHggIT0gLTEpIHsKLQkJCQltYXAuYWRkKHBsdWdpbk5hbWUuc3Vic3RyaW5nKDAsIGRvdElkeCksIHBsdWdpbik7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkcmVuLmFkZChwbHVnaW4pOwotCQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQocGx1Z2luLAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudCh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGV4aXN0aW5nTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgU2V0PE1ldGhvZFBsdWdpbj4+PiBpdGVyID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeTxTdHJpbmcsIFNldDxNZXRob2RQbHVnaW4+PiBlbnRyeSA9IGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCVNldDxNZXRob2RQbHVnaW4+IHBsdWdTZXQgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlciBwcm92aWRlciA9IHBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5nZXQobmFtZSk7Ci0JCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotCQkJCXByb3ZpZGVyID0gbmV3IFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG5hbWUsIHBsdWdTZXQpOwotCQkJCXBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5wdXQobmFtZSwgcHJvdmlkZXIpOwotCQkJfSBlbHNlIHsKLQkJCQlwcm92aWRlci5zZXRQbHVnaW5zKHBsdWdTZXQpOwotCQkJfQotCQkJZXhpc3RpbmdOYW1lcy5hZGQobmFtZSk7Ci0JCQlwcm92aWRlci5zZXRQYXJlbnQocGFyZW50KTsKLQkJCWNoaWxkcmVuLmFkZChwcm92aWRlcik7Ci0JCX0KLQkJcmV0YWluUGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzKGV4aXN0aW5nTmFtZXMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmV0YWluUGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzKENvbGxlY3Rpb248U3RyaW5nPiBuYW1lcykgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IHBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5rZXlTZXQoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGtleU5hbWUgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghbmFtZXMuY29udGFpbnMoa2V5TmFtZSkpIHsKLQkJCQlQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLmdldChrZXlOYW1lKTsKLQkJCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQlwcm92aWRlci5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0PE1ldGhvZFBsdWdpbj4gZ2V0TWV0aG9kUGx1Z2lucyhNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJTGlzdDxNZXRob2RQbHVnaW4+IGl0ZW1zID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0JCUVMaXN0IGVsZW1lbnRzID0gbGlicmFyeS5lQ29udGVudHMoKTsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlpdGVtcy5hZGQoKE1ldGhvZFBsdWdpbillbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCi0JcHVibGljIE9iamVjdCBnZXRDb25maWd1cmF0aW9ucygpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb25zOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UHJvY2Vzc0ZhbWlsaWVzKCkgewotCQkvL3JldHVybiBwcm9jRmFtaWxpZXM7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlQWRkQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEudXRpbC5Db2xsZWN0aW9uLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoc3VwZXIuY3JlYXRlQWRkQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGNvbmZpZ3VyYXRpb25zICE9IG51bGwpIHsKLQkJCWNvbmZpZ3VyYXRpb25zLmRpc3Bvc2UoKTsKLQkJCWNvbmZpZ3VyYXRpb25zID0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKHBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcCAhPSBudWxsKSB7Ci0JCQlwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAuY2xlYXIoKTsKLQkJCXBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcCA9IG51bGw7Ci0JCX0KLQkJCi0JCS8qCi0JCWlmIChwcm9jRmFtaWxpZXMgIT0gbnVsbCkgewotCQkJcHJvY0ZhbWlsaWVzLmRpc3Bvc2UoKTsKLQkJCXByb2NGYW1pbGllcyA9IG51bGw7Ci0JCX0KLQkJKi8KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMThiMWMwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJDb250ZW50IFBhY2thZ2VzIiBmb2xkZXIgaW4gdGhlIExpYnJhcnkKLSAqIHZpZXcuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW5hbWVkIGFzICJDb250ZW50UGFja2FnZXNJdGVtUHJvdmlkZXIiIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU5vdGlmaWVyIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVDb250ZW50UGFja2FnZSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L01ldGhvZFBhY2thZ2VzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmIChtc2cuZ2V0Tm90aWZpZXIoKSA9PSB0YXJnZXQpIHsKLQkJCWludCBmZWF0dXJlSWQgPSBtc2cuZ2V0RmVhdHVyZUlEKENvbnRlbnRQYWNrYWdlLmNsYXNzKTsKLQkJCWlmIChmZWF0dXJlSWQgPT0gVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTKSB7Ci0JCQkJYm9vbGVhbiBub3RpZnkgPSBmYWxzZTsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5NT1ZFOgotCQkJCQlPYmplY3Qgb2JqID0gbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCW5vdGlmeSA9IGFjY2VwdEFzQ2hpbGQob2JqKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlvYmogPSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJbm90aWZ5ID0gYWNjZXB0QXNDaGlsZChvYmopOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlmb3JfY2hlY2s6IGZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlpZiAoYWNjZXB0QXNDaGlsZChpdGVyLm5leHQoKSkpIHsKLQkJCQkJCQlub3RpZnkgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGZvcl9jaGVjazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJZm9yX2NoZWNrOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJaWYgKGFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCQkJCQkJbm90aWZ5ID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmb3JfY2hlY2s7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0KLQkJCQl9Ci0JCQkJaWYgKG5vdGlmeSkgewotCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG1zZywgdGhpcywgdHJ1ZSwKLQkJCQkJCQlmYWxzZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKAotCQkJCQkoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpLmdldENoaWxkUGFja2FnZXMoKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0NPTlRFTlRfUEFDS0FHRSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gQ29udGVudFBhY2thZ2UuY2xhc3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCi0JCS8vIHNvcnRpbmcgdGhlIGNvbnRlbnQgcGFja2FnZXMKLQkJLy8KLQkJQ29sbGVjdGlvbnMuc29ydChjaGlsZHJlbiwgQ29tcGFyYXRvcnMuREVGQVVMVF9DT01QQVJBVE9SKTsKLQotCQkvLyBzZXQgcGFyZW50IGZvciBjaGlsZHJlbgotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChjaGlsZCwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRQYXJlbnQob2JqZWN0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ODZiMDY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUGx1Z2luVUlQYWNrYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlN0cnVjdHVyZWRNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIG1ldGhvZCBwbHVnLWluIGluIHRoZSBMaWJyYXJ5Ci0gKiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgZXh0ZW5kcyBTdHJ1Y3R1cmVkTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSVN0YXRlZnVsSXRlbVByb3ZpZGVyLCBJTGlicmFyeUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gY2hpbGRyZW47Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgcGFyZW50IG9mIHRoaXMgSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBvYmplY3Q7Ci0KLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCQlTdHJpbmcgbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCU9iamVjdCBjaGlsZCA9IG5ldyBDb250ZW50SXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBwbHVnaW4sCi0JCQkJCWdldE1vZGVsU3RydWN0dXJlKCkpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Qcm9jZXNzZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBwbHVnaW4sCi0JCQkJCWdldE1vZGVsU3RydWN0dXJlKCkpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJY2hpbGRyZW4uY2xlYXIoKTsKLQkJCWNoaWxkcmVuID0gbnVsbDsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKCgoTWV0aG9kUGx1Z2luKSBvYmplY3QpLmdldFVzZXJDaGFuZ2VhYmxlKCkuYm9vbGVhblZhbHVlKCkpID8gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9NZXRob2RQbHVnaW4iKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlVbWFFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L01ldGhvZFBsdWdpbl9ncmV5Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXRob2RQbHVnaW4uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX05BTUU6Ci0JCQlUbmdVdGlsLnJlZnJlc2hQYXJlbnRJZk5hbWVDaGFuZ2VkKG5vdGlmaWNhdGlvbiwgdGhpcyk7Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCB0cnVlKSk7Ci0JCQlUbmdVdGlsLnJlZnJlc2hQbHVnaW5FeHRlbmRlcnModGhpcywgbm90aWZpY2F0aW9uLCB0cnVlLCB0cnVlKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbmFtZSA9IHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQkJCi0JCWlmICgoZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKSAmJiAhUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5JTlNUQU5DRS5pc0ZsYXRMYXlvdXQoKSkgewotCQkJU3RyaW5nIGRlbHRhTmFtZSA9IFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIuZ2V0TmFtZURlbHRhKChQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKWdldFBhcmVudCgpLCBvYmplY3QpOwotCQkJcmV0dXJuIGRlbHRhTmFtZTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQl9Ci0KLQkKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9QbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3YzNiMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9QbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5QbHVnaW5VSVBhY2thZ2VzTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBJdGVtIFByb3ZpZGVyIEFkYXB0ZXIgdGhhdCByZXByZXNlbnRzIGEgcGx1Z2luLXBhY2thZ2UuICBUaGlzIGlzIGEgVUkgZm9sZGVyIG9ubHkKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJTGlicmFyeUl0ZW1Qcm92aWRlciwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfU0VQQVJBVE9SID0gIi4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb248TWV0aG9kUGx1Z2luPiBwbHVnaW5zOwotCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyPiBwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXI+KCk7Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFN0cmluZyBwYWNrYWdlTmFtZSwgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnMpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLm5hbWUgPSBwYWNrYWdlTmFtZTsKLQkJdGhpcy5wbHVnaW5zID0gcGx1Z2luczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgcGFyZW50IG9mIHRoaXMgSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG5hbWU7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L3BhY2thZ2Vfb2JqIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lRGVsdGEoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlciB0b3BPYmplY3QsIE9iamVjdCBib3R0b21PYmplY3QpIHsKLQkJCi0JCVN0cmluZyB0b3BOYW1lPSB0b3BPYmplY3QuZ2V0RnVsbE5hbWUoKTsKLQkJU3RyaW5nIGJvdHRvbU5hbWUgPSBudWxsOwotCQlpZiAoYm90dG9tT2JqZWN0IGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgewotCQkJYm90dG9tTmFtZSA9ICgoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcilib3R0b21PYmplY3QpLmdldEZ1bGxOYW1lKCk7Ci0JCQkKLQkJfSBlbHNlIGlmIChib3R0b21PYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCWJvdHRvbU5hbWUgPSAoKE1ldGhvZFBsdWdpbilib3R0b21PYmplY3QpLmdldE5hbWUoKTsKLQkJfQotCQkKLQkJaWYoYm90dG9tTmFtZSA9PSBudWxsIHx8IHRvcE5hbWUuZXF1YWxzKGJvdHRvbU5hbWUpKQotCQkJcmV0dXJuIHRvcE5hbWU7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgZGVsdGFuYW1lPSBib3R0b21OYW1lLnN1YnN0cmluZyh0b3BOYW1lLmxlbmd0aCgpKzEpOwotCQkJcmV0dXJuIGRlbHRhbmFtZTsKLQkJfSBjYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gYm90dG9tTmFtZTsKLQkJfQotCX0KLQotCQotCXB1YmxpYyBDb2xsZWN0aW9uPE9iamVjdD4gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJcmV0dXJuIGFkZENoaWxkcmVuKHBsdWdpbnMpOwotCX0KLQkKLQlwcml2YXRlIENvbGxlY3Rpb248T2JqZWN0PiBhZGRDaGlsZHJlbihDb2xsZWN0aW9uPE1ldGhvZFBsdWdpbj4gcGx1Z2lucykgewotCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlQbHVnaW5VSVBhY2thZ2VzTWFwIG1hcCA9IG5ldyBQbHVnaW5VSVBhY2thZ2VzTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3I8TWV0aG9kUGx1Z2luPiBpdGVyID0gcGx1Z2lucy5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIGRlbHRhTmFtZSA9IGdldE5hbWVEZWx0YSh0aGlzLCBwbHVnaW4pOwotCQkJaW50IGRvdElkeCA9IGRlbHRhTmFtZS5pbmRleE9mKFBBQ0tBR0VfU0VQQVJBVE9SKTsKLQkJCWlmIChkb3RJZHggIT0gLTEpIHsKLQkJCQltYXAuYWRkKGRlbHRhTmFtZS5zdWJzdHJpbmcoMCwgZG90SWR4KSwgcGx1Z2luKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hpbGRyZW4uYWRkKHBsdWdpbik7Ci0JCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChwbHVnaW4sCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgYWRhcHRlcikuc2V0UGFyZW50KHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlDb2xsZWN0aW9uPFN0cmluZz4gZXhpc3RpbmdOYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJZm9yIChJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBTZXQ8TWV0aG9kUGx1Z2luPj4+IGl0ZXIgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5PFN0cmluZywgU2V0PE1ldGhvZFBsdWdpbj4+IGVudHJ5ID0gaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IGVudHJ5LmdldEtleSgpOwotCQkJU2V0PE1ldGhvZFBsdWdpbj4gcGx1Z1NldCA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLmdldChnZXRGdWxsTmFtZSgpICsgUEFDS0FHRV9TRVBBUkFUT1IgKyBuYW1lKTsKLQkJCWlmIChwcm92aWRlciA9PSBudWxsKSB7Ci0JCQkJcHJvdmlkZXIgPSBuZXcgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbmFtZSwgcGx1Z1NldCk7Ci0JCQkJcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLnB1dChnZXRGdWxsTmFtZSgpICsgUEFDS0FHRV9TRVBBUkFUT1IgKyBuYW1lLCBwcm92aWRlcik7Ci0JCQl9IGVsc2UgewotCQkJCXByb3ZpZGVyLnNldFBsdWdpbnMocGx1Z1NldCk7Ci0JCQl9Ci0JCQlleGlzdGluZ05hbWVzLmFkZChnZXRGdWxsTmFtZSgpICsgUEFDS0FHRV9TRVBBUkFUT1IgKyBuYW1lKTsKLQkJCXByb3ZpZGVyLnNldFBhcmVudCh0aGlzKTsKLQkJCWNoaWxkcmVuLmFkZChwcm92aWRlcik7Ci0JCX0KLQkJcmV0YWluUGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzKGV4aXN0aW5nTmFtZXMpOwotCQlDb2xsZWN0aW9ucy5zb3J0KGNoaWxkcmVuLCBDb21wYXJhdG9ycy5QTFVHSU5QQUNLQUdFX0NPTVBBUkFUT1IpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7Ci0JCVN0cmluZyBmdWxsTmFtZSA9IGdldE5hbWUoKTsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudCgpOwotCQl3aGlsZSAocGFyZW50IGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgewotCQkJZnVsbE5hbWUgPSAoKFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpcGFyZW50KS5nZXROYW1lKCkgKyBQQUNLQUdFX1NFUEFSQVRPUiArIGZ1bGxOYW1lOwotCQkJcGFyZW50ID0gKChQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKXBhcmVudCkuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGZ1bGxOYW1lOwotCQkKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXRob2RQbHVnaW4uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19OQU1FOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgdHJ1ZSkpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gcmVtb3ZlIHRoaXMgZnJvbSB0aGUgcGx1Z2lucycgYWRhcHRlciBsaXN0Ci0JCWlmIChwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAgIT0gbnVsbCkgewotCQkJcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLmNsZWFyKCk7Ci0JCQlwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAgPSBudWxsOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJldGFpblBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVycyhDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXMpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBrZXlOYW1lID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIW5hbWVzLmNvbnRhaW5zKGtleU5hbWUpKSB7Ci0JCQkJUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlciBwcm92aWRlciA9IHBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5nZXQoa2V5TmFtZSk7Ci0JCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJcHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uPE1ldGhvZFBsdWdpbj4gZ2V0UGx1Z2lucygpIHsKLQkJcmV0dXJuIHBsdWdpbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGx1Z2lucyhDb2xsZWN0aW9uPE1ldGhvZFBsdWdpbj4gcGx1Z2lucykgewotCQl0aGlzLnBsdWdpbnMgPSBwbHVnaW5zOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9QcmFjdGljZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9QcmFjdGljZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YTBlMjJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJhY3RpY2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBwcmFjdGljZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJhY3RpY2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByYWN0aWNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSURlZmF1bHROYW1lU2V0dGVyIHsKLQotCXB1YmxpYyBQcmFjdGljZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByYWN0aWNlSXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlX1N1YlByYWN0aWNlcygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVQcmFjdGljZSgpKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJhY3RpY2VJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFByYWN0aWNlX1N1YlByYWN0aWNlcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlPYmplY3QgcGFyZW50ID0gVG5nVXRpbAotCQkJCS5nZXROYXZpZ2F0b3JQYXJlbnRJdGVtUHJvdmlkZXIoKEd1aWRhbmNlKSBvYmplY3QpOwotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9QcmFjdGljZV90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCWlmICgoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXROb2RlaWNvbigpICE9IG51bGwpIHsKLQkJCQlVUkkgaW1nVXJpID0gVG5nVXRpbC5nZXRGdWxsUGF0aG9mTm9kZW9yU2hhcGVJY29uVVJJKAotCQkJCQkJKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0LAotCQkJCQkJKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSk7Ci0JCQkJT2JqZWN0IGltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTaGFyZWRJbWFnZShpbWdVcmkpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKQotCQkJCQlyZXR1cm4gaW1hZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKHRoaXMsIG1zZyk7Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJUHJhY3RpY2UgcHJhY3RpY2UgPSAoUHJhY3RpY2UpIGdldFBhcmVudChvYmopOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUocHJhY3RpY2UuZ2V0U3ViUHJhY3RpY2VzKCksCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmosIExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19QUkFDVElDRSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM7Ci0JfQotCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIFByYWN0aWNlLmNsYXNzOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKChBZGRDb21tYW5kKSBzdXBlci5jcmVhdGVBZGRDb21tYW5kKAotCQkJCWRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTIzZjQ1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHByb2Nlc3MgY29tcG9uZW50IGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gaWYoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCS8vIGNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIGNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRfUHJvY2VzcygpKTsKLQkJLy8gLy8KLQkJLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2VfQnJlYWtkb3duRWxlbWVudHMoKSk7Ci0JCS8vIC8vCi0JCS8vIGNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlX1dCUygpKTsKLQkJLy8gLy8KLQkJLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2VfT0JTKCkpOwotCQkvLyAvLwotCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzUGFja2FnZV9QQlMoKSk7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqZWN0KS5nZXRQcm9jZXNzKCk7Ci0JCWlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybiIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2VzcyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0NvbXBvbmVudF90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFByb2Nlc3NDb21wb25lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fTkFNRToKLQkJCVByb2Nlc3NDb21wb25lbnQgcGMgPSAoUHJvY2Vzc0NvbXBvbmVudCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQlpZiAocGMuZ2V0UHJvY2VzcygpICE9IG51bGwpIHsKLQkJCQlib29sZWFuIG9sZCA9IHBjLmdldFByb2Nlc3MoKS5lRGVsaXZlcigpOwotCQkJCXRyeSB7Ci0JCQkJCXBjLmdldFByb2Nlc3MoKS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkJCXBjLmdldFByb2Nlc3MoKS5zZXROYW1lKHBjLmdldE5hbWUoKSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJcGMuZ2V0UHJvY2VzcygpLmVTZXREZWxpdmVyKG9sZCk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQlUbmdVdGlsLnJlZnJlc2hQYXJlbnRJZk5hbWVDaGFuZ2VkKG5vdGlmaWNhdGlvbiwgdGhpcyk7Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3NGYW1pbGllc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzRmFtaWxpZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTNiZGM2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3NGYW1pbGllc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJQcm9jZXNzIEZhbWlsaWVzIiBmb2xkZXIgaW4gdGhlIExpYnJhcnkKLSAqIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRmFtaWxpZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzRmFtaWxpZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RMaWJyYXJ5IHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZExpYnJhcnlfUHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCksCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0ZhbWlseSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NGYW1pbHk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Qcm9jZXNzRmFtaWxpZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0ZhbWlseSkKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChNZXRob2RMaWJyYXJ5KSB0YXJnZXQpCi0JCQkJCS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1BST0NFU1NfRkFNSUxZKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoTWV0aG9kTGlicmFyeSkgdGFyZ2V0KQotCQkJCQkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCksIChNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19DT05GSUdVUkFUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeS5jbGFzczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkYmQzMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlIHByb2Nlc3MgZmFtaWx5IGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Qcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCUVPYmplY3QgbGliID0gKEVPYmplY3QpIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQlpZiAobGliID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCS5nZXRBZGFwdGVyKGxpYiwgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXJldHVybiBpdGVtUHJvdmlkZXIgIT0gbnVsbCA/IGl0ZW1Qcm92aWRlci5nZXRQcm9jZXNzRmFtaWxpZXMoKSA6IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX1Byb2Nlc3NGYW1pbHlfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVlNGQxOWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSVByb2Nlc3NJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHByb2Nlc3MgcGFja2FnZSBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJUHJvY2Vzc0l0ZW1Qcm92aWRlciwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBFQ2xhc3MgcHJvY2Vzc1R5cGU7Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NUeXBlKCkgewotCQlyZXR1cm4gcHJvY2Vzc1R5cGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVByb2Nlc3NDb21wb25lbnQoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIShjaGlsZCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpCi0JCQkJCSYmIChjaGlsZCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSkgewotCQkJCVByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJCS5hZGFwdChjaGlsZCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAocHJvY2Vzc1R5cGUgIT0gbnVsbCkKLQkJCQkJaXRlbVByb3ZpZGVyLnNldFByb2Nlc3NUeXBlKHByb2Nlc3NUeXBlKTsKLQkJCX0KLQkJfQotCi0JCUNvbGxlY3Rpb25zLnNvcnQoKExpc3QpIGNoaWxkcmVuLCBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NQYWNrYWdlQ29tcGFyYXRvcigpKTsKLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCXJldHVybiBsYWJlbDsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJRUNsYXNzIHByb2NUeXBlID0gZ2V0UHJvY2Vzc1R5cGUoKTsKLQkJaWYgKHByb2NUeXBlICE9IG51bGwpIHsKLQkJCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQob2JqZWN0KTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbAotCQkJCQkmJiBwYXJlbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Qcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlpZiAocHJvY1R5cGUKLQkJCQkJCS5lcXVhbHMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKSkpCi0JCQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybnMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVsc2UgaWYgKHByb2NUeXBlLmVxdWFscyhVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2VzcygpKSkKLQkJCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Qcm9jZXNzUGFja2FnZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzVHlwZShFQ2xhc3MgcHJvY2Vzc1R5cGUpIHsKLQkJdGhpcy5wcm9jZXNzVHlwZSA9IHByb2Nlc3NUeXBlOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCwKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmNyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZCgpIik7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXJldHVybiBuZXcgQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQoZG9tYWluLCBvd25lciwgZmVhdHVyZSwKLQkJCQkJdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uLCB0aGlzKTsKLQkJfQotCQkvLyByZXR1cm4gc3VwZXIuY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIHZhbHVlLAotCQkvLyBpbmRleCwgY29sbGVjdGlvbik7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLAotCQkJCXZhbHVlLCBpbmRleCwgY29sbGVjdGlvbiwgdGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJRUNsYXNzIHByb2Nlc3NUeXBlID0gZ2V0UHJvY2Vzc1R5cGUoKTsKLQkJCWlmIChwcm9jZXNzVHlwZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHByb2Nlc3NUeXBlLmVxdWFscyhVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENhcGFiaWxpdHlQYXR0ZXJuKCkpKSB7Ci0JCQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgaWYgKHByb2Nlc3NUeXBlLmVxdWFscyhVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2VzcygpKSkgewotCQkJCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzX3RleHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSBpZiAocHJvY2Vzc1R5cGUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpKSB7Ci0JCQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV90eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZUNoaWxkSW1hZ2UoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJRUNsYXNzIHByb2Nlc3NUeXBlID0gZ2V0UHJvY2Vzc1R5cGUoKTsKLQkJCWlmIChwcm9jZXNzVHlwZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHByb2Nlc3NUeXBlLmVxdWFscyhVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENhcGFiaWxpdHlQYXR0ZXJuKCkpKSB7Ci0JCQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgaWYgKHByb2Nlc3NUeXBlLmVxdWFscyhVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2VzcygpKSkgewotCQkJCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSBpZiAocHJvY2Vzc1R5cGUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpKSB7Ci0JCQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRJbWFnZShvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUFkZENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEudXRpbC5Db2xsZWN0aW9uLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlDb2xsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJLy8gY2hlY2sgdG8gZXhjbHVkZSBhbnkgcGFzdGVkLWluIHBhY2thZ2UgdGhhdCBjb250YWlucwotCQkJCS8vIHByb2Nlc3Mgb2YgZGlmZmVyZW50IHR5cGUgdGhhbiB0aGF0IG9mIHRoaXMgcGFja2FnZQotCQkJCS8vCi0JCQkJaWYgKCFQcm9jZXNzVXRpbC5oYXNQcm9jZXNzTm90T2ZUeXBlKChQcm9jZXNzUGFja2FnZSkgZWxlbWVudCwKLQkJCQkJCXByb2Nlc3NUeXBlKSkgewotCQkJCQlzZWxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQotCQkvLyByZXR1cm4gc3VwZXIuY3JlYXRlQWRkQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLAotCQkvLyBpbmRleCk7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoCi0JCQkJZG9tYWluLCBvd25lciwgZmVhdHVyZSwgc2VsZWN0aW9uLCBpbmRleCkpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGZlYXR1cmVDaGFuZ2VkKEVPYmplY3Qgb2JqZWN0LAotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQKLQkJCQkJCSYmIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpIHsKLQkJCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBvYmplY3QpLmdldFByb2Nlc3MoKTsKLQkJCQkJaWYgKHByb2MgIT0gbnVsbCkgewotCQkJCQkJcHJvYy5zZXROYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGVhZDgxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIlByb2Nlc3NlcyIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0UHJvY2Vzc2VzSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTX0NPTlRSSUJVVElPTlNfTEFCRUwgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJLmdldFN0cmluZygiX1VJX1Byb2Nlc3NDb250cmlidXRpb25zX3RleHQiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNZXRob2RQbHVnaW4gcGx1Z2luOwotCi0JcHJpdmF0ZSBQcm9jZXNzUGFja2FnZSBwcm9jZXNzQ29udHJpYnV0aW9uc1BhY2thZ2U7Ci0JcHJpdmF0ZSBQcm9jZXNzUGFja2FnZSBjYXBhYmlsaXR5UGF0dGVyblBhY2thZ2U7Ci0JcHJpdmF0ZSBQcm9jZXNzUGFja2FnZSBkZWxpdmVyeVByb2Nlc3NQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiwgTW9kZWxTdHJ1Y3R1cmUgbW9kZWxTdHJ1Y3QpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIG1vZGVsU3RydWN0KTsKLQkJdGhpcy5wbHVnaW4gPSBwbHVnaW47Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlIHBrZyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlKSBVbWFVdGlsCi0JCQkJCS5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJCQkJbW9kZWxTdHJ1Y3QuY2FwYWJpbGl0eVBhdHRlcm5QYXRoKTsKLQkJCWNhcGFiaWxpdHlQYXR0ZXJuUGFja2FnZSA9IHBrZzsKLQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCVByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkJCS5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLmFkYXB0KHBrZywKLQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlhZGFwdGVyLnNldFByb2Nlc3NUeXBlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKSk7Ci0JCQkJYWRhcHRlci5zZXRMYWJlbChMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX0NhcGFiaWxpdHlQYXR0ZXJuc190ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCQkJYWRhcHRlci5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJY2hpbGRyZW4uYWRkKHBrZyk7Ci0JCQl9Ci0JCQlwa2cgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSkgVW1hVXRpbAotCQkJCQkuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLCBtb2RlbFN0cnVjdC5kZWxpdmVyeVByb2Nlc3NQYXRoKTsKLQkJCWRlbGl2ZXJ5UHJvY2Vzc1BhY2thZ2UgPSBkZWxpdmVyeVByb2Nlc3NQYWNrYWdlOwotCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCQkJLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSkuYWRhcHQocGtnLAotCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWFkYXB0ZXIuc2V0UHJvY2Vzc1R5cGUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3MoKSk7Ci0JCQkJYWRhcHRlci5zZXRMYWJlbChMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlhZGFwdGVyLnNldFBhcmVudCh0aGlzKTsKLQkJCQljaGlsZHJlbi5hZGQocGtnKTsKLQkJCX0KLQotCQkJaWYgKHByb2Nlc3NDb250cmlidXRpb25FbmFibGVkKSB7Ci0JCQkJY2hpbGRyZW4uYWRkKGdldFByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSgpKTsKLQkJCX0KLQotCQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJLy8gU3RyaW5nIG5hbWUgPQotCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUGxhbm5pbmdUZW1wbGF0ZXNfZ3JvdXAiKTsKLQkJCS8vIE9iamVjdCBjaGlsZCA9IG5ldyBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCS8vIHBsdWdpbiwgbmFtZSk7Ci0JCQkvLyBjaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gY29tbWVudCBvdXQgdGhlIHBsYW5uaW5nIHRlbXBsYXRlcyBmb3IgVE5HIHJlbGVhc2Ugb25lIGF0Ci0JCQkvLyAyMDA1LTA1LTA5Ci0JCQkvLyBwa2cgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSkKLQkJCS8vIFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJLy8gbW9kZWxTdHJ1Y3QucHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVQYXRoKTsKLQkJCS8vIGlmKHBrZyA9PSBudWxsKSB7Ci0JCQkvLyBwa2cgPQotCQkJLy8gTW9kZWxTdHJ1Y3R1cmUuY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVQYWNrYWdlKHBsdWdpbik7Ci0JCQkvLyB9Ci0JCQkvLyBhZGFwdGVyID0gKFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKQotCQkJLy8gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLmFkYXB0KHBrZywKLQkJCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkvLyBhZGFwdGVyLnNldFByb2Nlc3NUeXBlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkpOwotCQkJLy8gYWRhcHRlci5zZXRMYWJlbChMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9QbGFubmluZ1RlbXBsYXRlc190ZXh0IikpOwotCQkJLy8gY2hpbGRyZW4uYWRkKHBrZyk7Ci0KLQkJfSBlbHNlIHsKLQkJCWlmIChwcm9jZXNzQ29udHJpYnV0aW9uRW5hYmxlZCkgewotCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IGdldFByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSgpOwotCQkJCWlmICghY2hpbGRyZW4uY29udGFpbnMocGtnKSkgewotCQkJCQljaGlsZHJlbi5hZGQocGtnKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IGdldFByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSgpOwotCQkJCWNoaWxkcmVuLnJlbW92ZShwa2cpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXByaXZhdGUgUHJvY2Vzc1BhY2thZ2UgZ2V0UHJvY2Vzc0NvbnRyaWJ1dGlvbnNQYWNrYWdlKCkgewotCQlpZiAocHJvY2Vzc0NvbnRyaWJ1dGlvbnNQYWNrYWdlID09IG51bGwpIHsKLQkJCXByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlKSBVbWFVdGlsCi0JCQkJCS5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJCQkJbW9kZWxTdHJ1Y3QucHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGgpOwotCQkJaWYgKHByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSA9PSBudWxsKSB7Ci0JCQkJcHJvY2Vzc0NvbnRyaWJ1dGlvbnNQYWNrYWdlID0gTW9kZWxTdHJ1Y3R1cmUKLQkJCQkJCS5jcmVhdGVQcm9jZXNzQ29udHJpYnV0aW9uUGFja2FnZShwbHVnaW4pOwotCQkJfQotCQkJUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJLmFkYXB0KHByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSwKLQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJYWRhcHRlci5zZXRMYWJlbChQUk9DRVNTX0NPTlRSSUJVVElPTlNfTEFCRUwpOwotCQkJYWRhcHRlci5zZXRQYXJlbnQodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlIGdldENhcGFiaWxpdHlQYXR0ZXJuUGFja2FnZSgpIHsKLQkJcmV0dXJuIGNhcGFiaWxpdHlQYXR0ZXJuUGFja2FnZTsKLQl9Ci0JCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlIGdldERlbGl2ZXJ5UHJvY2Vzc1BhY2thZ2UoKSB7Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NQYWNrYWdlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI0YWUzNTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpdGVtIHByb3ZpZGVycyBmb3IgZGlzcGxheWluZyBhbmQgZWRpdGluZyBtZXRob2QgbGlicmFyeSBlbGVtZW50cyBpbiB0aGUgTGlicmFyeSB2aWV3LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMjQ2OGJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgZGlzcGxheWluZyBhbmQgZWRpdGluZyBtZXRob2QgbGlicmFyeSBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjI3ZTQxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBJdGVtIHByb3ZpZGVyIGZvciBhY3Rpdml0eSB1c2VkIGJ5IGNvbmZpZ3VyYXRpb24gdmlldyBhbmQgZmlsdGVyIGRpYWxvZy4gVGhpcyBpdGVtIHByb3ZpZGVyIHJldHVybgotICogY2hpbGRyZW4gbGlzdCB0aGF0IGNvbnRhaW4gb25seSBpdHMgb3duIGFjdGl2aXRpZXMgYWZ0ZXIgcmVhbGl6YXRpb24gYWdhaW5zdCBzZWxlY3RlZCBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1biAzMCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldE9iamVjdChvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3QoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0RUNsYXNzZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3QgY2hpbGQpIHsKLQkJcmV0dXJuIGNoaWxkIGluc3RhbmNlb2YgQWN0aXZpdHk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2lzUm9sbGVkVXAoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUm9sbGVkVXAoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjYmFzaWNTZXRSb2xsZWRVcChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIGJhc2ljU2V0Um9sbGVkVXAoYm9vbGVhbiBiKSB7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI3NldFJvbGxlZFVwKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sbGVkVXAoYm9vbGVhbiBiKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWFiMWY1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcihBY3Rpdml0eSB2YWx1ZSwgT2JqZWN0IG93bmVyLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKEFjdGl2aXR5IGFjdGl2aXR5LCBPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhY3Rpdml0eSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkRlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChnZXRSZWZyZXNoRWxlbWVudChub3RpZmljYXRpb24pID09IGdldERlbGVnYXRlVmFsdWUoKSkgewotCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCQlQcm9jZXNzIHByb2MgPSAoUHJvY2VzcykgZ2V0VG9wSXRlbSgpOwotCQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuYWRhcHQocHJvYywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJaXRlbVByb3ZpZGVyLnNldFJlZnJlc2hBbGxJRHNSZXF1aXJlZCh0cnVlKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCWJvb2xlYW4gb2xkUm9sbGVkVXAgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlmIChkZWxlZ2F0ZUl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCWl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCQkJCW9sZFJvbGxlZFVwID0gaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCQlpZihpc1JvbGxlZFVwKCkgIT0gb2xkUm9sbGVkVXApIHsKLQkJCQkJaWYoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJCQkJKChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKWl0ZW1Qcm92aWRlcikuYmFzaWNTZXRSb2xsZWRVcChpc1JvbGxlZFVwKCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaXRlbVByb3ZpZGVyLnNldFJvbGxlZFVwKGlzUm9sbGVkVXAoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWl0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZihpdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCS8vIHJlc3RvcmUgcm9sbGVkLXVwIGZsYWcKLQkJCQkvLwotCQkJCWlmKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJKChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKWl0ZW1Qcm92aWRlcikuYmFzaWNTZXRSb2xsZWRVcChvbGRSb2xsZWRVcCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpdGVtUHJvdmlkZXIuc2V0Um9sbGVkVXAob2xkUm9sbGVkVXApOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldERlbGVnYXRpbmdJdGVtUHJvdmlkZXIoKXsKLQkJcmV0dXJuIGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWE1OGMzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JV3JhcHBlckl0ZW1Qcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlZhcmlhYmlsaXR5SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5BY3Rpdml0eUFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkdyYXBoaWNhbERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByZWRlY2Vzc29yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkFjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWN0aXZpdHkncyBpdGVtIHByb3ZpZGVycyB1c2VkIGJ5IHRoZSBQcm9jZXNzIEVkaXRvci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBY3Rpdml0eUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElQcm9jZXNzSXRlbVByb3ZpZGVyLCBJQlNJdGVtUHJvdmlkZXIsCi0JCUlUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyLCBJQ29uZmlndXJhYmxlLCBJQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JcHJpdmF0ZSBpbnQgaWQ7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHRvcEl0ZW0gPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIHJvbGxlZFVwOwotCi0JcHJpdmF0ZSBHcmFwaGljYWxEYXRhIGdyYXBoaWNhbERhdGE7Ci0KLQlwcml2YXRlIFByZWRlY2Vzc29yTGlzdCBwcmVkZWNlc3NvcnM7Ci0KLQlwcml2YXRlIEJvb2xlYW4gZXhwYW5kZWQ7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlciBiYXNlTGlzdGVuZXI7Ci0KLQlwcml2YXRlIElGaWx0ZXIgY2hpbGRGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIGFjY2VwdEFzQ2hpbGQob2JqKTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgYm9vbGVhbiByZWZyZXNoQWxsSURzUmVxdWlyZWQ7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJvdGVjdGVkIExpc3QgY2FjaGVkQ2hpbGRyZW47Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLQlwcml2YXRlIERpc3Bvc2FibGUgY29udHJpYnV0ZWRXcmFwcGVyczsKLQotCXByaXZhdGUgVmFyaWFiaWxpdHlJbmZvIHZhcmlhYmlsaXR5SW5mbzsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlVmFyaWFiaWxpdHlJbmZvID0gdHJ1ZTsKLQotCXByaXZhdGUgRGlzcG9zYWJsZSByb2xsZWRVcFdyYXBwZXJzOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihiYXNlTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJRU9iamVjdCBjdXJyZW50QmFzZSA9IChFT2JqZWN0KSBiYXNlTGlzdGVuZXIuZ2V0VGFyZ2V0KCk7Ci0JCQlpZihjdXJyZW50QmFzZSAhPSBudWxsKSB7Ci0JCQkJY3VycmVudEJhc2UuZUFkYXB0ZXJzKCkucmVtb3ZlKGJhc2VMaXN0ZW5lcik7Ci0JCQl9Ci0JCQlpZiAoZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0VGFyZ2V0KCk7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQkJYmFzZS5lQWRhcHRlcnMoKS5yZW1vdmUoYmFzZUxpc3RlbmVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJlZGVjZXNzb3JzICE9IG51bGwpIHsKLQkJCXByZWRlY2Vzc29ycy5kaXNwb3NlKCk7Ci0JCX0KLQotCQlpZihjYWNoZWRDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQljYWNoZWRDaGlsZHJlbi5jbGVhcigpOwotCQkJY2FjaGVkQ2hpbGRyZW4gPSBudWxsOwotCQl9Ci0JCQotCQlpZihjYWNoZWRSb2xsdXBDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQljYWNoZWRSb2xsdXBDaGlsZHJlbi5jbGVhcigpOwotCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPSBudWxsOwotCQl9Ci0JCQotCQlpZihjb250cmlidXRlZFdyYXBwZXJzICE9IG51bGwpIHsKLQkJCWNvbnRyaWJ1dGVkV3JhcHBlcnMuZGlzcG9zZSgpOwotCQkJY29udHJpYnV0ZWRXcmFwcGVycyA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmKHJvbGxlZFVwV3JhcHBlcnMgIT0gbnVsbCkgewotCQkJcm9sbGVkVXBXcmFwcGVycy5kaXNwb3NlKCk7Ci0JCQlyb2xsZWRVcFdyYXBwZXJzID0gbnVsbDsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGNhbiBiZSBhY2NlcHRlZCBhcyBhIGNoaWxkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZpbHRlci5hY2NlcHQoY2hpbGQpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGNhbiBiZSBhY2NlcHRlZCBhcyBhIHJvbGxlZC11cCBjaGlsZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc1JvbGxlZFVwQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCWNoaWxkID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQlpZiAoZmlsdGVyICE9IG51bGwgJiYgIShjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5KQotCQkJCSYmICEoY2hpbGQgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkpIHsKLQkJCXJldHVybiBmaWx0ZXIuYWNjZXB0KGNoaWxkKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBkZXNjcmlwdG9yIChlLmc6IGEKLQkgKiBUYXNrRGVzY3JpcHRvciBpcyBhc3NvY2lhdGVkIHdpdGggYSBUYXNrKS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGdldE9iamVjdChEZXNjcmlwdG9yIGRlc2NyaXB0b3IpOwotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LCBFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCS8vIGRpc2FsbG93IGNyZWF0aW5nIG5ldyBjaGlsZCBpZiB0aGlzIGl0ZW0gcHJvdmlkZXIgaXMgcm9sbGVkIHVwCi0JCS8vCi0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG9iamVjdCwgZWRpdGluZ0RvbWFpbiwgc2libGluZyk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQkvLyBpZihpc1RvcEFjdGl2aXR5KG9iamVjdCkpIHsKLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLAotCQkvLyBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQaGFzZSgpKSk7Ci0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCS8vIChjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkvLyAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSXRlcmF0aW9uKCkpKTsKLQkJLy8gfQotCQkvLyBlbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCS8vIChjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkvLyAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSXRlcmF0aW9uKCkpKTsKLQkJLy8gfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjaXNFeHBhbmRlZCgpCi0JICovCi0JcHVibGljIEJvb2xlYW4gaXNFeHBhbmRlZCgpIHsKLQkJcmV0dXJuIGV4cGFuZGVkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0RXhwYW5kZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBhbmRlZChCb29sZWFuIGIpIHsKLQkJZXhwYW5kZWQgPSBiOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldFRvcEl0ZW0oKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VG9wSXRlbSgpIHsKLQkJaWYgKHRvcEl0ZW0gPT0gbnVsbCkgewotCQkJaWYoUHJvY2Vzc1V0aWwuaXNUb3BQcm9jZXNzKHRhcmdldCkpIHsKLQkJCQlyZXR1cm4gdGFyZ2V0OwotCQkJfQotCQkJaWYocGFyZW50ICE9IG51bGwpIHsKLQkJCQlPYmplY3QgaXAgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYoaXAgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBpcDsKLQkJCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJT2JqZWN0IHRvcCA9IGFkYXB0ZXIuZ2V0VG9wSXRlbSgpOwotCQkJCQkJaWYgKHRvcCA9PSBudWxsICYmIHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3MKLQkJCQkJCQkJJiYgKChQcm9jZXNzKSBwYXJlbnQpLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCQkJCQl0b3AgPSBwYXJlbnQ7Ci0JCQkJCQkJYWRhcHRlci5zZXRUb3BJdGVtKHRvcCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gdG9wOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0b3BJdGVtOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0SWQoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKGludCBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RvcEFjdGl2aXR5KE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIG9iamVjdDsKLQkJT2JqZWN0IHBhcmVudCA9IGVPYmouZUNvbnRhaW5lcigpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJUHJvY2Vzc0NvbXBvbmVudCBwYyA9IChQcm9jZXNzQ29tcG9uZW50KSBwYXJlbnQ7Ci0JCQlyZXR1cm4gb2JqZWN0ID09IHBjLmdldFByb2Nlc3MoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaGFzQ2hpbGREZXNjcmlwdG9yKEFjdGl2aXR5IGFjdCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQYXJlbnRGb3IoT2JqZWN0IGNoaWxkLCBPYmplY3QgcGFyZW50KSB7Ci0JCVByb2Nlc3NVdGlsLnNldFBhcmVudChjaGlsZCwgcGFyZW50LCBnZXRSb290QWRhcHRlckZhY3RvcnkoKSk7Ci0JfQotCi0vLwlwcml2YXRlIENvbGxlY3Rpb24gZ2V0RGlyZWN0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotLy8JCUxpc3QgbXlDaGlsZHJlbjsKLS8vCQlDaGlsZHJlblN0b3JlIHN0b3JlID0gZ2V0Q2hpbGRyZW5TdG9yZShvYmplY3QpOwotLy8JCWlmIChzdG9yZSAhPSBudWxsKSB7Ci0vLwkJCW15Q2hpbGRyZW4gPSBzdG9yZS5nZXRDaGlsZHJlbigpOwotLy8JCX0gZWxzZSB7Ci0vLwkJCS8vIHN0b3JlID0gY3JlYXRlQ2hpbGRyZW5TdG9yZShvYmplY3QpOwotLy8JCQlMaXN0IHJlc3VsdCA9IHN0b3JlICE9IG51bGwgPyBudWxsIDogbmV3IEFycmF5TGlzdCgpOwotLy8JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotLy8KLS8vCQkJZm9yIChJdGVyYXRvciBpID0gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpLml0ZXJhdG9yKCk7IGkKLS8vCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpLm5leHQoKTsKLS8vCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7CQkJCQkKLS8vCQkJCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIGVPYmplY3QuZUdldChmZWF0dXJlKTsKLS8vCQkJCQkKLS8vLy8JCQkJCS8vQ2hhbmdlIGZvciBBY3Rpdml0eSBWYXJpYWJpbGl0eS4gVG8gZG8gcmVhbGl6YXRpb24gZm9yCi0vLy8vCQkJCQkvL0Jyb3dzaW5nIGFuZCBQdWJsaXNoaW5nLgotLy8vLwkJCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLS8vLy8JCQkJCWlmKGZpbHRlciAhPSBudWxsICYmIGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpewotLy8vLwkJCQkJCWNoaWxkcmVuLmFkZEFsbCgoKElDb25maWd1cmF0b3IpZmlsdGVyKS5nZXRDaGlsZHJlbihvYmplY3QsIGZlYXR1cmUpKTsKLS8vLy8JCQkJCX0KLS8vLy8JCQkJCWVsc2V7Ci0vLy8vCQkJCQkJY2hpbGRyZW4gPSAoTGlzdCkgZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotLy8vLwkJCQkJfQotLy8JCQkJCQotLy8JCQkJCWludCBpbmRleCA9IDA7Ci0vLwkJCQkJZm9yIChJdGVyYXRvciBjaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGNpLmhhc05leHQoKTsgaW5kZXgrKykgewotLy8JCQkJCQlPYmplY3QgY2hpbGQgPSBjaS5uZXh0KCk7Ci0vLwkJCQkJCWlmIChhY2NlcHRBc0NoaWxkKGNoaWxkKSkgewotLy8JCQkJCQkJY2hpbGQgPSB3cmFwKGVPYmplY3QsIGZlYXR1cmUsIGNoaWxkLCBpbmRleCk7Ci0vLwkJCQkJCQlzZXRQYXJlbnRGb3IoY2hpbGQsIG9iamVjdCk7Ci0vLwkJCQkJCQkvLyBJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpCi0vLwkJCQkJCQkvLyBnZXRCZXN0QWRhcHRlckZhY3RvcnkoKS5hZGFwdChjaGlsZCwKLS8vCQkJCQkJCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0vLwkJCQkJCQkvLyBhZGFwdGVyLnNldFJvbGxlZFVwKGZhbHNlKTsKLS8vCQkJCQkJCWlmIChzdG9yZSAhPSBudWxsKSB7Ci0vLwkJCQkJCQkJc3RvcmUuZ2V0TGlzdChmZWF0dXJlKS5hZGQoY2hpbGQpOwotLy8JCQkJCQkJfSBlbHNlIHsKLS8vCQkJCQkJCQlyZXN1bHQuYWRkKGNoaWxkKTsKLS8vCQkJCQkJCX0KLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0gZWxzZSB7Ci0vLwkJCQkJT2JqZWN0IGNoaWxkID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotLy8JCQkJCWlmIChhY2NlcHRBc0NoaWxkKGNoaWxkKSkgewotLy8JCQkJCQljaGlsZCA9IHdyYXAoZU9iamVjdCwgZmVhdHVyZSwgY2hpbGQsCi0vLwkJCQkJCQkJQ29tbWFuZFBhcmFtZXRlci5OT19JTkRFWCk7Ci0vLwkJCQkJCXNldFBhcmVudEZvcihjaGlsZCwgb2JqZWN0KTsKLS8vCQkJCQkJLy8gSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKQotLy8JCQkJCQkvLyBnZXRCZXN0QWRhcHRlckZhY3RvcnkoKS5hZGFwdChjaGlsZCwKLS8vCQkJCQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLS8vCQkJCQkJLy8gYWRhcHRlci5zZXRSb2xsZWRVcChmYWxzZSk7Ci0vLwotLy8JCQkJCQlpZiAoc3RvcmUgIT0gbnVsbCkgewotLy8JCQkJCQkJc3RvcmUuc2V0VmFsdWUoZmVhdHVyZSwgY2hpbGQpOwotLy8JCQkJCQl9IGVsc2UgewotLy8JCQkJCQkJcmVzdWx0LmFkZChjaGlsZCk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJbXlDaGlsZHJlbiA9IHN0b3JlICE9IG51bGwgPyBzdG9yZS5nZXRDaGlsZHJlbigpIDogcmVzdWx0OwotLy8JCX0KLS8vCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gYWRkSW5oZXJpdGVkKG9iamVjdCwgbXlDaGlsZHJlbik7Ci0vLwkJcmV0dXJuIGNoaWxkcmVuOwotLy8JfQotCQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRJbW1lZGlhdGVDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKGFjY2VwdEFzQ2hpbGQoY2hpbGQpKSB7Ci0JCQkJaWYoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCQkJY2hpbGQgPSBjb25maWd1cmF0b3IucmVzb2x2ZShjaGlsZCk7Ci0JCQkJfQotCQkJCWlmKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJc2V0UGFyZW50Rm9yKGNoaWxkLCBvYmplY3QpOwotCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljaGlsZHJlbiA9IGFkZEluaGVyaXRlZChvYmplY3QsIChMaXN0KSBjaGlsZHJlbik7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldFJvbGxlZFVwQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAocm9sbGVkVXBXcmFwcGVycyAhPSBudWxsKSB7Ci0JCQlyb2xsZWRVcFdyYXBwZXJzLmRpc3Bvc2UoKTsKLQkJfQotCi0JCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFic3RyYWN0VHJlZUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3Iob2JqZWN0LCBmYWxzZSkgewotCi0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zMTU5NTM3NjI5NjE5NzM3MzY4TDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJSXRlcmF0b3IgaXRlcmF0b3I7Ci0JCQkJCWJvb2xlYW4gYiA9IGFkYXB0ZXIuaXNSb2xsZWRVcCgpOwotCQkJCQl0cnkgewotCQkJCQkJYWRhcHRlci5iYXNpY1NldFJvbGxlZFVwKGZhbHNlKTsKLQkJCQkJCWl0ZXJhdG9yID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQlhZGFwdGVyLmJhc2ljU2V0Um9sbGVkVXAoYik7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGl0ZXJhdG9yOwotCQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIKLQkJCQkJCSYmICEob2JqZWN0IGluc3RhbmNlb2YgVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyKSkgewotCQkJCQlyZXR1cm4gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0KQotCQkJCQkJCS5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgb25seSBvbmUgZGVzY3JpcHRvciBmb3IgZWFjaCBjb250ZW50IGVsZW1lbnQgaW4gdGhlIHJvbGwtdXAgbGlzdAotCQkvLwotCQlMaXN0IGRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGFjY2VwdEFzUm9sbGVkVXBDaGlsZChjaGlsZCkpIHsKLQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCQlpZihlIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCQlPYmplY3QgZGVzYyA9IGZpbmREZXNjcmlwdG9yKGRlc2NyaXB0b3JzLCBlKTsKLQkJCQkJaWYoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQlpZihpc1dyYXBwaW5nUm9sbHVwTmVlZGVkKGNoaWxkKSkgewotCQkJCQkJCWNoaWxkID0gY3JlYXRlUm9sbHVwV3JhcHBlcihjaGlsZCwgb2JqZWN0LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCQl9Ci0JCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCQkJZGVzY3JpcHRvcnMuYWRkKGNoaWxkKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmKGlzV3JhcHBpbmdSb2xsdXBOZWVkZWQoY2hpbGQpKSB7Ci0JCQkJCQkJQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBjb21wb3NlZFdyYXBwZXIgPSBQcm9jZXNzVXRpbC5nZXRDb21wb3NlZFdyYXBwZXIoZGVzYyk7Ci0JCQkJCQkJaWYoY29tcG9zZWRXcmFwcGVyICE9IG51bGwpIHsKLQkJCQkJCQkJY29tcG9zZWRXcmFwcGVyLmFkZEVsZW1lbnQoY2hpbGQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZGVzY3JpcHRvcnMuY2xlYXIoKTsKLQkJZGVzY3JpcHRvcnMgPSBudWxsOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB3cmFwcGluZyBvZiB0aGUgc3BlY2lmaWVkIHJvbGx1cCBlbGVtZW50IGlzIG5lZWRlZC4gSWYgaXQncwotCSAqIG5lZWRlZCwgdGhlIGNhbGxlciB3aWxsIHVzZQotCSAqIHtAbGluayAjY3JlYXRlUm9sbHVwV3JhcHBlcihPYmplY3QsIE9iamVjdCwgQWRhcHRlckZhY3RvcnkpfSB0byBjcmVhdGUKLQkgKiB3cmFwcGVyIGZvciB0aGUgcm9sbHVwIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nUm9sbHVwTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVDb21wb3NlZFdyYXBwZXIoT2JqZWN0IG9iamVjdCwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIob2JqZWN0LCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVJvbGx1cFdyYXBwZXIoT2JqZWN0IG9iamVjdCwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewkJCi0JCUNvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IGNyZWF0ZUNvbXBvc2VkV3JhcHBlcihvYmplY3QsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCXdyYXBwZXIucmVhZE9ubHkgPSB0cnVlOwotCQl3cmFwcGVyLmlzUm9sbHVwQ2hpbGQgPSB0cnVlOwotCQkKLQkJaWYocm9sbGVkVXBXcmFwcGVycyA9PSBudWxsKSB7Ci0JCQlyb2xsZWRVcFdyYXBwZXJzID0gbmV3IERpc3Bvc2FibGUoKTsKLQkJfQotCQlyb2xsZWRVcFdyYXBwZXJzLmFkZCh3cmFwcGVyKTsKLQotCQlyZXR1cm4gd3JhcHBlcjsgCQkKLQl9CQkKLQkKLQlwcml2YXRlIENvbGxlY3Rpb24gZG9HZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJcmV0dXJuIGdldFJvbGxlZFVwQ2hpbGRyZW4ob2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBnZXRJbW1lZGlhdGVDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgb2JqZWN0OwotCQlpZihjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJCi0JCQkvL1RPRE86IHJlbW92ZSB0aGUgZW5hYmxlVmFyaWFiaWxpdHlJbmZvRmxhZyBhbmQgIAotCQkJLy8gY3JlYXRlIGFuIGludGVyZmFjZSBvciBkbyBkaWZmZXJlbnRseQotCQkJaWYoZW5hYmxlVmFyaWFiaWxpdHlJbmZvKQotCQkJCXZhcmlhYmlsaXR5SW5mbyA9IGNvbmZpZ3VyYXRvci5nZXRWYXJpYWJpbGl0eUluZm8oYWN0aXZpdHkpOwotCQkJZWxzZSAKLQkJCQl2YXJpYWJpbGl0eUluZm8gPSBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJdmFyaWFiaWxpdHlJbmZvID0gbnVsbDsKLQkJfQotCQlpZih2YXJpYWJpbGl0eUluZm8gIT0gbnVsbCkgewotCQkJT2JqZWN0IHJlc29sdmVkID0gdmFyaWFiaWxpdHlJbmZvLmdldEluaGVyaXRhbmNlTGlzdCgpLmdldCgwKTsKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaXAgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQocmVzb2x2ZWQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7CQkJCi0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuOwotCQkJYm9vbGVhbiBiID0gaXAuaXNSb2xsZWRVcCgpOwotCQkJdHJ5IHsKLQkJCQlpcC5iYXNpY1NldFJvbGxlZFVwKGlzUm9sbGVkVXAoKSk7Ci0JCQkJY2hpbGRyZW4gPSBpcC5kb0dldENoaWxkcmVuKHJlc29sdmVkKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlwLmJhc2ljU2V0Um9sbGVkVXAoYik7Ci0JCQl9Ci0JCQlpZighdmFyaWFiaWxpdHlJbmZvLmdldENvbnRyaWJ1dG9ycygpLmlzRW1wdHkoKSkgewotCQkJCUFycmF5TGlzdCBjb250cmlidXRlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHZhcmlhYmlsaXR5SW5mby5nZXRDb250cmlidXRvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJCQkJaXAgPSAoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpYWRhcHRlcik7Ci0JCQkJCQliID0gaXAuaXNSb2xsZWRVcCgpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpcC5iYXNpY1NldFJvbGxlZFVwKGlzUm9sbGVkVXAoKSk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGlwLmdldEltbWVkaWF0ZUNoaWxkcmVuKGUpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJZSA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLnJlc29sdmUoZSwgY29uZmlndXJhdG9yLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJCQkJCWlmKGUgIT0gbnVsbCAmJiAhVG5nVXRpbC5jb250YWlucyhjaGlsZHJlbiwgZSkpIHsKLQkJCQkJCQkJCWNvbnRyaWJ1dGVkQ2hpbGRyZW4uYWRkKGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJaXAuYmFzaWNTZXRSb2xsZWRVcChiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZighY29udHJpYnV0ZWRDaGlsZHJlbi5pc0VtcHR5KCkpIHsKLQkJCQkJY2hpbGRyZW4uYWRkQWxsKHdyYXBDb250cmlidXRlZChhY3Rpdml0eSwgY29udHJpYnV0ZWRDaGlsZHJlbikpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfQotCQlyZXR1cm4gZG9HZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWNoZWRDaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0vLwkJaWYoaXNSb2xsZWRVcCgpKSB7Ci0vLwkJCWlmKGNhY2hlZFJvbGx1cENoaWxkcmVuID09IG51bGwpIHsKLS8vCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChjaGlsZHJlbik7Ci0vLwkJCX0KLS8vCQkJZWxzZSB7Ci0vLwkJCQljYWNoZWRSb2xsdXBDaGlsZHJlbi5jbGVhcigpOwotLy8JCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuKTsKLS8vCQkJfQotLy8JCX0KLS8vCQllbHNlIHsKLS8vCQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotLy8JCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KGNoaWxkcmVuKTsKLS8vCQkJfQotLy8JCQllbHNlIHsKLS8vCQkJCWNhY2hlZENoaWxkcmVuLmNsZWFyKCk7Ci0vLwkJCQljYWNoZWRDaGlsZHJlbi5hZGRBbGwoY2hpbGRyZW4pOwotLy8JCQl9Ci0vLwkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZyb21DYWNoZSgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQ2FjaGUoKSB7Ci0JCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCWdldENoaWxkcmVuKHRhcmdldCk7Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlciNnZXRSb2xsdXBDaGlsZHJlbkZyb21DYWNoZSgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKSB7Ci0JCWlmKGNhY2hlZFJvbGx1cENoaWxkcmVuID09IG51bGwpIHsKLQkJCWJvb2xlYW4gb2xkUm9sbGVkVXAgPSByb2xsZWRVcDsKLQkJCXRyeSB7Ci0JCQkJcm9sbGVkVXAgPSB0cnVlOwotCQkJCWdldENoaWxkcmVuKHRhcmdldCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlyb2xsZWRVcCA9IG9sZFJvbGxlZFVwOwotCQkJfQkJCQotCQl9Ci0JCXJldHVybiBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQl9Ci0JCi0JcHJpdmF0ZSBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBmaW5kV3JhcHBlcihPYmplY3Qgb3duZXIsIE9iamVjdCB2YWx1ZSkgewotCQkvLyBmaW5kIGlmIGEgd3JhcHBlciBhbHJlYWR5IGV4aXN0IGZvciB0aGUgZ2l2ZW4gdmFsdWUgYW5kIG93bmVyCi0JCS8vCi0JCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQodmFsdWUsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IG51bGw7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQlMaXN0IGxpc3RlbmVycyA9ICgoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5nZXRMaXN0ZW5lcnMoKTsKLQkJCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCWZpbmRfd3JhcHBlcl9sb29wOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudDsKLQkJCQkJCWlmICh3cmFwcGVyLmdldFZhbHVlKCkgPT0gdmFsdWUKLQkJCQkJCQkJJiYgd3JhcHBlci5nZXRQYXJlbnQodmFsdWUpID09IG93bmVyKSB7Ci0JCQkJCQkJYnJlYWsgZmluZF93cmFwcGVyX2xvb3A7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXdyYXBwZXIgPSBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB3cmFwcGVyOwotCX0KLQotCXByaXZhdGUgTGlzdCB3cmFwSW5oZXJpdGVkKEFjdGl2aXR5IG93bmVyLCBDb2xsZWN0aW9uIGJyZWFrZG93bkVsZW1lbnRzKSB7Ci0JCWlmICh3cmFwcGVycyA9PSBudWxsKSB7Ci0JCQl3cmFwcGVycyA9IG5ldyBEaXNwb3NhYmxlKCk7Ci0JCX0JCi0JCXJldHVybiB3cmFwKG93bmVyLCBicmVha2Rvd25FbGVtZW50cywgdHJ1ZSwgZmFsc2UsIHdyYXBwZXJzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IHdyYXBDb250cmlidXRlZChBY3Rpdml0eSBvd25lciwgQ29sbGVjdGlvbiBicmVha2Rvd25FbGVtZW50cykgewotCQlpZihjb250cmlidXRlZFdyYXBwZXJzID09IG51bGwpIHsKLQkJCWNvbnRyaWJ1dGVkV3JhcHBlcnMgPSBuZXcgRGlzcG9zYWJsZSgpOwotCQl9Ci0JCXJldHVybiB3cmFwKG93bmVyLCBicmVha2Rvd25FbGVtZW50cywgZmFsc2UsIHRydWUsIGNvbnRyaWJ1dGVkV3JhcHBlcnMpOwotCX0KLQkKLQlwcml2YXRlIElXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSBnZXRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlpZihhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyKSB7Ci0JCQlmYWN0b3J5ID0gKChJV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnlQcm92aWRlcilhZGFwdGVyRmFjdG9yeSkuZ2V0V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkoKTsKLQkJfQotCQlpZihmYWN0b3J5ID09IG51bGwpIHsKLQkJCWZhY3RvcnkgPSBJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQkKLQlwcml2YXRlIExpc3Qgd3JhcChBY3Rpdml0eSBvd25lciwgQ29sbGVjdGlvbiBicmVha2Rvd25FbGVtZW50cywgYm9vbGVhbiBpbmhlcml0ZWQsIGJvb2xlYW4gY29udHJpYnV0ZWQsIERpc3Bvc2FibGUgd3JhcHBlcnMpIHsKLQkJQXJyYXlMaXN0IHdyYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJV3JhcHBlckl0ZW1Qcm92aWRlckZhY3Rvcnkgd3JhcHBlckZhY3RvcnkgPSBnZXRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBicmVha2Rvd25FbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCB1bldyYXBwZWQgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQkJaWYgKHVuV3JhcHBlZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgdW5XcmFwcGVkOwotCQkJCWlmICghVG5nVXRpbC5pc0Jhc2Uob3duZXIuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSwgZSkpIHsKLQkJCQkJT2JqZWN0IGNoaWxkID0gZ2V0V3JhcHBlcihvd25lciwgZSwgd3JhcHBlcnMpOwotCQkJCQlpZihjaGlsZCA9PSBudWxsKSB7Ci0JCQkJCQljaGlsZCA9IHdyYXBwZXJGYWN0b3J5LmNyZWF0ZVdyYXBwZXIoZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBiZVdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGNoaWxkOwotCQkJCQkJCWlmKGluaGVyaXRlZCkgewotCQkJCQkJCQliZVdyYXBwZXIuaXNJbmhlcml0ZWQgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmKGNvbnRyaWJ1dGVkKSB7Ci0JCQkJCQkJCWJlV3JhcHBlci5jb250cmlidXRlZCA9IHRydWU7Ci0JCQkJCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyCi0JCQkJCQkJCQkJJiYgKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilvYmplY3QpLmlzSW5oZXJpdGVkKCkpIHsKLQkJCQkJCQkJCWJlV3JhcHBlci5pc0luaGVyaXRlZCA9IHRydWU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl3cmFwcGVycy5yZW1vdmUoY2hpbGQpOwotCQkJCQl9Ci0JCQkJCXdyYXBwZXJMaXN0LmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXdyYXBwZXJzLmRpc3Bvc2UoKTsKLQkJd3JhcHBlcnMuYWRkQWxsKHdyYXBwZXJMaXN0KTsKLQkJcmV0dXJuIHdyYXBwZXJMaXN0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgZ2V0V3JhcHBlcihBY3Rpdml0eSBvd25lciwgQnJlYWtkb3duRWxlbWVudCBlLCBDb2xsZWN0aW9uIHdyYXBwZXJzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHdyYXBwZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSVdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChJV3JhcHBlckl0ZW1Qcm92aWRlcikgaXRlci5uZXh0KCk7Ci0JCQlpZih3cmFwcGVyLmdldE93bmVyKCkgPT0gb3duZXIgJiYgd3JhcHBlci5nZXRWYWx1ZSgpID09IGUpIHsKLQkJCQlyZXR1cm4gd3JhcHBlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFkYXB0ZXIgY3JlYXRlQmFzZUxpc3RlbmVyKCkgewotCQlpZiAoYmFzZUxpc3RlbmVyID09IG51bGwpIHsKLQkJCWJhc2VMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQWN0aXZpdHlJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCQkJICovCi0JCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci50aGlzCi0JCQkJCQkJLmdldFRhcmdldCgpOwotCQkJCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQWN0aXZpdHkuY2xhc3MpKSB7Ci0JCQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkJCQlpZiAoUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoYWN0KSkgewotCQkJCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24oCi0JCQkJCQkJCQlub3RpZmljYXRpb24sIGFjdCwgZmFsc2UsIHRydWUpKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCi0JCQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fTkFNRToKLQkJCQkJCWlmIChhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKAotCQkJCQkJCQkJbm90aWZpY2F0aW9uLCBhY3QsIGZhbHNlLCB0cnVlKSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQotCQkJCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1NVUFBSRVNTRUQ6Ci0JCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCQkJYWN0LCB0cnVlLCBmYWxzZSkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJCQlhY3QsIHRydWUsIHRydWUpKTsKLQkJCQkJCXJlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKTsKLQkJCQkJCWJyZWFrOwotCi0JCQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTOiB7Ci0JCQkJCQlpZihoYW5kbGVSZXBsYWNlQnJlYWtkb3duRWxlbWVudChub3RpZmljYXRpb24pKSB7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlMaXN0IGxpc3QgPSBnZXRBZmZlY3RlZENoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCQkJCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJYm9vbGVhbiB1cGRhdGVMYWJlbCA9IHJlZnJlc2hDaGlsZHJlbkRhdGEoCi0JCQkJCQkJCQlub3RpZmljYXRpb24sIGxpc3QpOwotCi0JCQkJCQkJLy8gZm9yd2FyZCBub3RpZmljYXRpb24KLQkJCQkJCQkvLwotCQkJCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24oCi0JCQkJCQkJCQlub3RpZmljYXRpb24sIGFjdCwgdHJ1ZSwgdXBkYXRlTGFiZWwpKTsKLQotCQkJCQkJCS8vIFByb2Nlc3NVdGlsLnJlZnJlc2hWaWV3ZXIoZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJLy8gKFByb2Nlc3MpIGdldFRvcEl0ZW0oKSk7Ci0JCQkJCQkJcmVmcmVzaEFmZmVjdGVkVmlld2VycygpOwotCQkJCQkJfQotCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXJldHVybiBiYXNlTGlzdGVuZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEFjdGl2aXR5IGxpc3RlblRvQmFzZUFjdGl2aXR5KCkgewotCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIHRhcmdldDsKLQkJaWYgKCFQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhhY3QpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlBY3Rpdml0eSBiYXNlQWN0OwotCQlpZih2YXJpYWJpbGl0eUluZm8gIT0gbnVsbCkgewotCQkJaWYodmFyaWFiaWxpdHlJbmZvLmdldEluaGVyaXRhbmNlTGlzdCgpLnNpemUoKSA+IDEpIHsKLQkJCQliYXNlQWN0ID0gKEFjdGl2aXR5KSB2YXJpYWJpbGl0eUluZm8uZ2V0SW5oZXJpdGFuY2VMaXN0KCkuZ2V0KDEpOwotCQkJfQkJCQotCQkJZWxzZSB7Ci0JCQkJYmFzZUFjdCA9IChBY3Rpdml0eSkgY29uZmlndXJhdG9yLnJlc29sdmUoYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQliYXNlQWN0ID0gKEFjdGl2aXR5KSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQl9Ci0JCWlmIChiYXNlQWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQljcmVhdGVCYXNlTGlzdGVuZXIoKTsKLQkJCi0JCS8vIHJlbW92ZSBiYXNlTGlzdGVuZXIgZnJvbSBvbGQgYmFzZSwgaWYgdGhlcmUgaXMgYW55Ci0JCS8vCi0JCUVPYmplY3Qgb2xkQmFzZSA9IChFT2JqZWN0KSBiYXNlTGlzdGVuZXIuZ2V0VGFyZ2V0KCk7Ci0JCWlmKG9sZEJhc2UgIT0gbnVsbCkgewotCQkJb2xkQmFzZS5lQWRhcHRlcnMoKS5yZW1vdmUoYmFzZUxpc3RlbmVyKTsKLQkJfQotCQkKLQkJaWYgKCFiYXNlQWN0LmVBZGFwdGVycygpLmNvbnRhaW5zKGJhc2VMaXN0ZW5lcikpIHsKLQkJCWJhc2VBY3QuZUFkYXB0ZXJzKCkuYWRkKGJhc2VMaXN0ZW5lcik7Ci0JCX0KLQotCQlPYmplY3QgaXAgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChiYXNlQWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZihpcCBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBpcDsKLQkJCWFkYXB0ZXIubGlzdGVuVG9CYXNlQWN0aXZpdHkoKTsKLQkJfQotCQllbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQl9Ci0JCXJldHVybiBiYXNlQWN0OwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGFkZEluaGVyaXRlZChPYmplY3Qgb2JqZWN0LCBMaXN0IG15Q2hpbGRyZW4pIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG9iamVjdDsKLQkJCUFjdGl2aXR5IGJhc2VBY3QgPSBsaXN0ZW5Ub0Jhc2VBY3Rpdml0eSgpOwotCQkJaWYgKGJhc2VBY3QgIT0gbnVsbCkgewotCQkJCVZhcmlhYmlsaXR5VHlwZSBleHRlbmRUeXBlID0gYWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCWlmIChleHRlbmRUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVF9MSVRFUkFMKSB7Ci0JCQkJCXJldHVybiBteUNoaWxkcmVuOwotCQkJCX0gZWxzZSBpZiAoZXh0ZW5kVHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OX0xJVEVSQUwKLQkJCQkJCXx8IGV4dGVuZFR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCkgewotCQkJCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJCS5hZGFwdChiYXNlQWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQlMaXN0IGFsbENoaWxkcmVuOwkJCQkJCi0JCQkJCWJvb2xlYW4gb2xkUm9sbGVkVXAgPSBhZGFwdGVyLmlzUm9sbGVkVXAoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmKG9sZFJvbGxlZFVwKSB7Ci0JCQkJCQkJYWRhcHRlci5iYXNpY1NldFJvbGxlZFVwKGZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJCWFsbENoaWxkcmVuID0gd3JhcEluaGVyaXRlZChhY3QsIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oYmFzZUFjdCkpOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJaWYob2xkUm9sbGVkVXApIHsKLQkJCQkJCQlhZGFwdGVyLmJhc2ljU2V0Um9sbGVkVXAodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLS8vCQkJCQkvLyBnbyB0aHJ1IG93biBjaGlsZHJlbiBsaXN0IGFuZCBpbnNlcnQgaXQgdG8gdGhlIGNvbWJpbmVkCi0vLwkJCQkJLy8gY2hpbGQgbGlzdCBhdCB0aGUgcmlnaHQgcGxhY2UuCi0vLwkJCQkJLy8KLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBteUNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlcgotLy8JCQkJCQkJCS5uZXh0KCk7Ci0vLwkJCQkJCVRuZ1V0aWwuYWRkVG8oYWxsQ2hpbGRyZW4sIGVsZW1lbnQsIG9iamVjdCwgVG5nVXRpbAotLy8JCQkJCQkJCS5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpKTsKLS8vCQkJCQl9Ci0JCQkJCWlmKGFsbENoaWxkcmVuLmlzRW1wdHkoKSkgewotCQkJCQkJcmV0dXJuIG15Q2hpbGRyZW47Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlUbmdVdGlsLmFkZEFsbFRvKGFsbENoaWxkcmVuLCBteUNoaWxkcmVuKTsKLQkJCQkJCXJldHVybiBhbGxDaGlsZHJlbjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbXlDaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlcmUgaXMgbm8gZGVzY3JpcHRvciBpbiA8Y29kZT5jaGlsZHJlbjwvY29kZT4gcmVmZXJyaW5nIHRvCi0JICogdGhlIHNhbWUgb2JqZWN0IGFzIHRoZSBzcGVjaWZpZWQgZGVzY3JpcHRvciA8Y29kZT5jaGlsZDwvY29kZT4gZG9lcy4KLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGRyZW4KLQkgKiBAcGFyYW0gY2hpbGQKLQkgKiBAcmV0dXJuIHRydWUgaWYgbm8gZGVzY3JpcHRvciBpcyBmb3VuZCBpbiB0aGUgY2hpbGRyZW4gbGlzdCB0aGF0IHJlZmVycwotCSAqICAgICAgICAgdG8gdGhlIHNhbWUgb2JqZWN0IGFzIHRoZSBzcGVjaWZpZWQgY2hpbGQgZG9lcywgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTmV3RGVzY3JpcHRvcihMaXN0IGNoaWxkcmVuLCBPYmplY3QgY2hpbGQpIHsKLQkJcmV0dXJuIGZpbmREZXNjcmlwdG9yKGNoaWxkcmVuLCBjaGlsZCkgPT0gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdCBmaW5kRGVzY3JpcHRvcihMaXN0IGNoaWxkcmVuLCBPYmplY3QgY2hpbGQpIHsKLQkJT2JqZWN0IG9iaiA9IGdldE9iamVjdCgoRGVzY3JpcHRvcikgVG5nVXRpbC51bndyYXAoY2hpbGQpKTsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWZvciAoaW50IGkgPSBjaGlsZHJlbi5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJT2JqZWN0IG8gPSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQlpZiAob2JqID09IGdldE9iamVjdCgoRGVzY3JpcHRvcikgVG5nVXRpbC51bndyYXAobykpKQotCQkJCXJldHVybiBvOwotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZC5IZWxwZXIjZ2V0Q3JlYXRlQ2hpbGRJbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIHJldHVybgotCQkvLyBUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL2N0b29sMTYvQ3JlYXRlQWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfQWN0aXZpdHkiKTsKLQkJcmV0dXJuIGdldEltYWdlKGNoaWxkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlUmVtb3ZlQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlUmVtb3ZlQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVJlbW92ZUNvbW1hbmQoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRJdGVtUHJvdmlkZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIElCU0l0ZW1Qcm92aWRlciBnZXRJdGVtUHJvdmlkZXIoRU9iamVjdCBlT2JqKSB7Ci0JCXJldHVybiAoSUJTSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJLmdldEFkYXB0ZXIoZU9iaiwgSUJTSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlwYXJlbnQgPSBvYmplY3Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaXN0IG9mIGNoaWxkcmVuIHRoYXQgaGFkIGJlZW4gYWZmZWN0ZWQgYWZ0ZXIgYSBhbiBBREQsIFJFTU9WRSwKLQkgKiBvciBNT1ZFIG9wZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRBZmZlY3RlZENoaWxkcmVuKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldEFmZmVjdGVkRWxlbWVudHMobm90aWZpY2F0aW9uLCBjaGlsZEZpbHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVmcmVzaENoaWxkcmVuRGF0YShOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLAotCQkJTGlzdCBhZmZlY3RlZENoaWxkcmVuKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1JlZnJlc2hDaGlsZHJlbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLAotCQkJTGlzdCBhZmZlY3RlZENoaWxkcmVuKSB7Ci0JCXJlZnJlc2hDaGlsZHJlbkRhdGEobm90aWZpY2F0aW9uLCBhZmZlY3RlZENoaWxkcmVuKTsKLQotCQlQcm9jZXNzIHRvcEFjdCA9IChQcm9jZXNzKSBnZXRUb3BJdGVtKCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IHJvb3RBZGFwdGVyRmFjdG9yeSA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCQlQcm9jZXNzVXRpbC5yZWZyZXNoVmlld2VyKHJvb3RBZGFwdGVyRmFjdG9yeSwgdG9wQWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ2hpbGRyZW4oZmluYWwgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwKLQkJCWZpbmFsIExpc3QgbmV3T3JPbGRDaGlsZHJlbikgewotCQlpZiAoIW5ld09yT2xkQ2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0KLQkJCURpc3BsYXkgZGlzcGxheSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8KLQkJCX0KLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlkb1JlZnJlc2hDaGlsZHJlbihub3RpZmljYXRpb24sIG5ld09yT2xkQ2hpbGRyZW4pOwotCQkJCX0KLQotCQkJfTsKLQkJCWlmIChkaXNwbGF5ICE9IG51bGwpIHsKLQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCQl9IGVsc2UgewotCQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEFmZmVjdGVkVmlld2VycygpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vCi0JCX0KLQkJaWYoZGlzcGxheSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0KLQkJCX0KLQkJfQotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRvUmVmcmVzaEFmZmVjdGVkVmlld2VycygpOwotCQkJfQotCi0JCX07Ci0JCWlmIChkaXNwbGF5ICE9IG51bGwpIHsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkJfSBlbHNlIHsKLQkJCXJ1bm5hYmxlLnJ1bigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9SZWZyZXNoQWZmZWN0ZWRWaWV3ZXJzKCkgewotCi0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZVByZWRlY2Vzc29yTGlzdENoYW5nZShOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXJldHVybiBUbmdVdGlsLmhhbmRsZVByZWRlY2Vzc29yTGlzdENoYW5nZSh0aGlzLCBub3RpZmljYXRpb24pOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVSZXBsYWNlQnJlYWtkb3duRWxlbWVudChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUICYmIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpICE9IG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKSB7Ci0JCQlpZihub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQkJaWYoIUFzc29jaWF0aW9uSGVscGVyLmdldExpbmtUb1N1Y2Nlc3NvcihlKS5pc0VtcHR5KCkpIHsKLQkJCQkJUHJvY2Vzc1V0aWwucmVmcmVzaFByZWRlY2Nlc3Nvckxpc3RzKGFkYXB0ZXJGYWN0b3J5LCAoUHJvY2VzcykgZ2V0VG9wSXRlbSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJZ2V0VGFyZ2V0KCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZWZyZXNoQWZmZWN0ZWRWaWV3ZXJzKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlpZiAoaGFuZGxlUHJlZGVjZXNzb3JMaXN0Q2hhbmdlKG5vdGlmaWNhdGlvbikpCi0JCQlyZXR1cm47Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCWlmKGhhbmRsZVJlcGxhY2VCcmVha2Rvd25FbGVtZW50KG5vdGlmaWNhdGlvbikpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlMaXN0IG5ld09yT2xkQ2hpbGRyZW4gPSBnZXRBZmZlY3RlZENoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCQlpZiAoIW5ld09yT2xkQ2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0JCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWNyZWF0ZU9yTW92ZVBhY2thZ2VGb3IobmV3T3JPbGRDaGlsZHJlbik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0KLQkJCQkvLyByZWZyZXNoQ2hpbGRyZW4obm90aWZpY2F0aW9uLCBuZXdPck9sZENoaWxkcmVuKTsKLQotCQkJCXJlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19TVVBQUkVTU0VEOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgdHJ1ZSkpOwotCi0JCQkvLyBQcm9jZXNzVXRpbC5yZWZyZXNoVmlld2VyKGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAoUHJvY2VzcykKLQkJCS8vIGdldFRvcEl0ZW0oKSk7Ci0KLQkJCXJlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdPck9sZENoaWxkcmVuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3JNb3ZlUGFja2FnZUZvcihMaXN0IG5ld0NoaWxkcmVuKSB7Ci0JCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgKChFT2JqZWN0KSB0YXJnZXQpLmVDb250YWluZXIoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3Q2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZWxlbWVudDsKLQkJCQlpZiAoYWN0LmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCS8vIGNyZWF0ZSBuZXcgUHJvY2Vzc1BhY2thZ2UgZm9yIHRoZSBhY3Rpdml0eQotCQkJCQkvLwotCQkJCQlQcm9jZXNzUGFja2FnZSBuZXdQa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJCQluZXdQa2cuc2V0TmFtZShhY3QuZ2V0TmFtZSgpKTsKLQkJCQkJcGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQobmV3UGtnKTsKLQkJCQkJbmV3UGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChlbGVtZW50KTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBDaGVjayBpZiB0aGUgYWN0aXZpdHkncyBQcm9jZXNzUGFja2FnZSBpcyBhdCB0aGUgcmlnaHQKLQkJCQkJLy8gcGxhY2UuCi0JCQkJCS8vIElmIG5vdCwgbW92ZSBpdCB0byB0aGUgcmlnaHQgUHJvY2Vzc0NvbXBvbmVudC4KLQkJCQkJLy8KLQkJCQkJUHJvY2Vzc1BhY2thZ2Ugb2xkUGtnID0gKFByb2Nlc3NQYWNrYWdlKSBhY3QuZUNvbnRhaW5lcigpOwotCQkJCQlpZiAob2xkUGtnLmVDb250YWluZXIoKSAhPSBwa2cpIHsKLQkJCQkJCXBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKG9sZFBrZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldEFsbEJyZWFrZG93bkVsZW1lbnRzKFNldCBzZXQsIEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlib29sZWFuIHJldCA9IHNldC5hZGQoZSk7Ci0JCWlmIChyZXQgJiYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQWN0aXZpdHkpIGUpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlnZXRBbGxCcmVha2Rvd25FbGVtZW50cyhzZXQsIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaCB0aGUgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcHJlZGVjZXNzb3IgSURzIGluIHRoZSB2aWV3ZXIKLQkgKiAKLQkgKiBAcGFyYW0gYWZmZWN0ZWRCcmVha2Rvd25FbGVtZW50cwotCSAqLwotCXByaXZhdGUgdm9pZCByZWZyZXNoUHJlZGVjZXNzb3JzKE5vdGlmaWNhdGlvbiBtc2csCi0JCQlMaXN0IGFmZmVjdGVkQnJlYWtkb3duRWxlbWVudHMpIHsKLQotCQlTZXQgcmVmcmVzaExpc3QgPSBuZXcgSGFzaFNldCgpOwotCQlTZXQgYWxsQnJlYWtkb3duRWxlbWVudHMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZmZlY3RlZEJyZWFrZG93bkVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFCi0JCQkJCXx8IG1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkpIHsKLQkJCQlzZXRQYXJlbnRGb3IoZSwgbnVsbCk7Ci0JCQl9Ci0JCQlnZXRBbGxCcmVha2Rvd25FbGVtZW50cyhhbGxCcmVha2Rvd25FbGVtZW50cywgZSk7Ci0JCX0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLnJlZnJlc2hQcmVkZWNlc3NvcnMoKToKLQkJLy8gYWxsQnJlYWtkb3duRWxlbWVudHM9IithbGxCcmVha2Rvd25FbGVtZW50cyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhbGxCcmVha2Rvd25FbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRMaW5rVG9TdWNjZXNzb3IoCi0JCQkJCWVsZW1lbnQpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMS5oYXNOZXh0KCk7KSB7Ci0JCQkJV29ya09yZGVyIHdvcmtPcmRlciA9IChXb3JrT3JkZXIpIGl0ZXJhdG9yMS5uZXh0KCk7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBzdWNjID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRTdWNjZXNzb3Iod29ya09yZGVyKTsKLQkJCQlpZiAoIWFsbEJyZWFrZG93bkVsZW1lbnRzLmNvbnRhaW5zKHN1Y2MpKSB7Ci0JCQkJCXJlZnJlc2hMaXN0LmFkZChzdWNjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIucmVmcmVzaFByZWRlY2Vzc29ycygpOgotCQkvLyByZWZyZXNoTGlzdD0iICsgcmVmcmVzaExpc3QpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZnJlc2hMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG1zZywgY2hpbGQsIGZhbHNlLCB0cnVlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlUGFja2FnZUZvcihBY3Rpdml0eSBhY3Rpdml0eSwgRU9iamVjdCBwYXJlbnRBY3Rpdml0eSkgewotCQlQcm9jZXNzUGFja2FnZSBwYXJlbnQgPSAoUHJvY2Vzc1BhY2thZ2UpIHBhcmVudEFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJUHJvY2Vzc1BhY2thZ2UgbmV3UGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJbmV3UGtnLnNldE5hbWUoYWN0aXZpdHkuZ2V0TmFtZSgpKTsKLQkJcGFyZW50LmdldENoaWxkUGFja2FnZXMoKS5hZGQobmV3UGtnKTsKLQkJQXJyYXlMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlicmVha2Rvd25FbGVtZW50cy5hZGQoYWN0aXZpdHkpOwotCQlicmVha2Rvd25FbGVtZW50cy5hZGRBbGwoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSk7Ci0JCW5ld1BrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwoYnJlYWtkb3duRWxlbWVudHMpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgY29sdW1uSW5kZXgpIHsKLQkJQWRhcHRlckZhY3Rvcnkgcm9vdEFkYXB0ZXJGYWN0b3J5ID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWlmIChyb290QWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJQ29sdW1uQXdhcmUpIHsKLQkJCU1hcCBjb2x1bW5JbmRleFRvTmFtZU1hcCA9ICgoSUNvbHVtbkF3YXJlKSByb290QWRhcHRlckZhY3RvcnkpCi0JCQkJCS5nZXRDb2x1bW5JbmRleFRvTmFtZU1hcCgpOwotCQkJaWYgKGNvbHVtbkluZGV4VG9OYW1lTWFwICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gKFN0cmluZykgY29sdW1uSW5kZXhUb05hbWVNYXAuZ2V0KG5ldyBJbnRlZ2VyKAotCQkJCQkJY29sdW1uSW5kZXgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJU3RyaW5nIGNvbE5hbWUgPSBnZXRDb2x1bW5OYW1lKGNvbHVtbkluZGV4KTsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0Q29sdW1uSW1hZ2Uob2JqZWN0LCBjb2xOYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVN0cmluZyBjb2xOYW1lID0gZ2V0Q29sdW1uTmFtZShjb2x1bW5JbmRleCk7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUob2JqZWN0LCBjb2xOYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRUb3BJdGVtKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9wSXRlbShPYmplY3QgdG9wKSB7Ci0JCXRvcEl0ZW0gPSB0b3A7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNpc1JvbGxlZFVwKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JvbGxlZFVwKCkgewotCQlyZXR1cm4gcm9sbGVkVXA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRSb2xsZWRVcChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGxlZFVwKGJvb2xlYW4gYikgewotCQlyb2xsZWRVcCA9IGI7Ci0JCWlmICghcm9sbGVkVXApIHsKLQkJCS8vIHVzZXIgcm9sbCBkb3duIHRoaXMgYWN0aXZpdHksIHNldCByb2xsZWRVcCBmbGFnIG9mIGFsbCBpdHMKLQkJCS8vIG9mZnN0cmluZyB0byBmYWxzZQotCQkJLy8KLQkJCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IodGFyZ2V0LCBmYWxzZSkgewotCi0JCQkJLyoqCi0JCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkgKi8KLQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzg0MDY4NzI2NDc1MzY0MDI1MEw7Ci0KLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJLmFkYXB0KG9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pdGVyYXRvcigpOwotCQkJCX0KLQotCQkJfTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBjaGlsZCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoY2hpbGQsCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCSgoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRSb2xsZWRVcChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIEdyYXBoaWNhbERhdGEgZ2V0R3JhcGhpY2FsRGF0YSgpIHsKLQkJcmV0dXJuIGdyYXBoaWNhbERhdGE7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0R3JhcGhpY2FsRGF0YShHcmFwaGljYWxEYXRhIGRhdGEpIHsKLQkJZ3JhcGhpY2FsRGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSwgdGhpcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wLCBTdHJpbmcgdHh0KSB7Ci0JCUFjdGl2aXR5IGUgPSAoQWN0aXZpdHkpIG9iamVjdDsKLQkJUHJvY2Vzc1V0aWwuc2V0QXR0cmlidXRlKGUsIHByb3AsIHR4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCwgaW50LAotCSAqICAgICAgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJKChJdGVyYXRpb24pIHZhbHVlKS5zZXRJc1JlcGVhdGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIHZhbHVlLAotCQkJCWluZGV4LCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldExpc3RlbmVycygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0TGlzdGVuZXJzKCkgewotCQlpZiAoY2hhbmdlTm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgoTGlzdCkgY2hhbmdlTm90aWZpZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0UHJlZGVjZXNzb3JzKCkKLQkgKi8KLQlwdWJsaWMgUHJlZGVjZXNzb3JMaXN0IGdldFByZWRlY2Vzc29ycygpIHsKLQkJaWYgKHByZWRlY2Vzc29ycyA9PSBudWxsKSB7Ci0JCQlwcmVkZWNlc3NvcnMgPSBuZXcgUHJlZGVjZXNzb3JMaXN0KFRuZ1V0aWwKLQkJCQkJLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSksIHRhcmdldCk7Ci0JCX0KLQkJcmV0dXJuIHByZWRlY2Vzc29yczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpcnN0RWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5pc0ZpcnN0RWxlbWVudChnZXRSb290QWRhcHRlckZhY3RvcnkoKSwgdGhpcywgb2JqKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhc3RFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmlzTGFzdEVsZW1lbnQoZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIHRoaXMsIG9iaik7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVVwKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlPYmplY3QgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJVG5nVXRpbC5tb3ZlVXAoKEFjdGl2aXR5KSBwYXJlbnQsIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVEb3duKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlPYmplY3QgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJVG5nVXRpbC5tb3ZlRG93bigoQWN0aXZpdHkpIHBhcmVudCwgb2JqLCBnZXRFQ2xhc3NlcygpLCBhY3Rpb25NZ3IpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgQWN0aXZpdHlBZGRDb21tYW5kKChBZGRDb21tYW5kKSBzdXBlci5jcmVhdGVBZGRDb21tYW5kKAotCQkJCWRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkFjdGl2aXR5SXRlbVByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCU9iamVjdCBpbWcgPSBUbmdVdGlsLmdldEltYWdlKG9iamVjdCk7Ci0JCXJldHVybiBpbWcgIT0gbnVsbCA/IGltZyA6IHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIElGaWx0ZXIgZ2V0Q2hpbGRGaWx0ZXIoKSB7Ci0JCXJldHVybiBjaGlsZEZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZyZXNoQWxsSURzUmVxdWlyZWQoYm9vbGVhbiBiKSB7Ci0JCXJlZnJlc2hBbGxJRHNSZXF1aXJlZCA9IGI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWZyZXNoQWxsSURzUmVxdWlyZWQoKSB7Ci0JCXJldHVybiByZWZyZXNoQWxsSURzUmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gdGhpcy5maWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJaWYoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotCQkJY29uZmlndXJhdG9yID0gKElDb25maWd1cmF0b3IpZmlsdGVyOwotCQl9Ci0JCWVsc2UgewotCQkJY29uZmlndXJhdG9yID0gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjY3JlYXRlRHJvcENvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY3JlYXRlRHJvcENvbW1hbmQoT2JqZWN0IG93bmVyLAotCQkJTGlzdCBkcm9wRWxlbWVudHMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGJhc2ljU2V0Um9sbGVkVXAoYm9vbGVhbiBiKSB7Ci0JCXJvbGxlZFVwID0gYjsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgZW5hYmxlVmFyaWFiaWxpdHlJbmZvCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVWYXJpYWJpbGl0eUluZm8oKSB7Ci0JCXJldHVybiBlbmFibGVWYXJpYWJpbGl0eUluZm87Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVuYWJsZVZhcmlhYmlsaXR5SW5mbyB0aGUgZW5hYmxlVmFyaWFiaWxpdHlJbmZvIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZVZhcmlhYmlsaXR5SW5mbyhib29sZWFuIGVuYWJsZVZhcmlhYmlsaXR5SW5mbykgewotCQl0aGlzLmVuYWJsZVZhcmlhYmlsaXR5SW5mbyA9IGVuYWJsZVZhcmlhYmlsaXR5SW5mbzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkODJiYzUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuR2VuZXJpY0Ryb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5QcmVkZWNlc3Nvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotCi0KLS8qKgotICogQmFzZSBpdGVtIHByb3ZpZGVyIGZvciBhbGwgYnJlYWtkb3duIGVsZW1lbnRzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSVByb2Nlc3NJdGVtUHJvdmlkZXIsIElCU0l0ZW1Qcm92aWRlciwgSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIsIElDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQlwcml2YXRlIGludCBpZDsKLQotCXByaXZhdGUgT2JqZWN0IHRvcEl0ZW07Ci0KLQlwcml2YXRlIGJvb2xlYW4gcm9sbGVkVXA7Ci0KLQlwcml2YXRlIEJvb2xlYW4gZXhwYW5kZWQ7Ci0KLQlwcml2YXRlIFByZWRlY2Vzc29yTGlzdCBwcmVkZWNlc3NvcnM7Ci0KLQlwcm90ZWN0ZWQgSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQkKLQlwcm90ZWN0ZWQgTGlzdCBjYWNoZWRDaGlsZHJlbjsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuZGVsZWdhdGVJdGVtUHJvdmlkZXIgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHByZWRlY2Vzc29ycyAhPSBudWxsKSB7Ci0JCQlwcmVkZWNlc3NvcnMuZGlzcG9zZSgpOwotCQl9Ci0JCWlmKGNhY2hlZENoaWxkcmVuICE9IG51bGwpIHsKLQkJCWNhY2hlZENoaWxkcmVuLmNsZWFyKCk7Ci0JCQljYWNoZWRDaGlsZHJlbiA9IG51bGw7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoZGVsZWdhdGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRlbGVnYXRlSXRlbVByb3ZpZGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNpc0V4cGFuZGVkKCkKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBpc0V4cGFuZGVkKCkgewotCQlyZXR1cm4gZXhwYW5kZWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRFeHBhbmRlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cGFuZGVkKEJvb2xlYW4gYikgewotCQlleHBhbmRlZCA9IGI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IG9iaikgewotCQlwYXJlbnQgPSBvYmo7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCXJldHVybiAoKEJyZWFrZG93bkVsZW1lbnQpb2JqZWN0KS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldElkKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRJZChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoaW50IGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldFRvcEl0ZW0oKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VG9wSXRlbSgpIHsKLQkJaWYgKHRvcEl0ZW0gPT0gbnVsbCAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXRSb290QWRhcHRlckZhY3RvcnkoKQotCQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCU9iamVjdCB0b3AgPSBhZGFwdGVyLmdldFRvcEl0ZW0oKTsKLQkJCQlpZiAodG9wID09IG51bGwgJiYgcGFyZW50IGluc3RhbmNlb2YgUHJvY2VzcwotCQkJCQkJJiYgKChQcm9jZXNzKSBwYXJlbnQpLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCQkJdG9wID0gcGFyZW50OwotCQkJCQlhZGFwdGVyLnNldFRvcEl0ZW0odG9wKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRvcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdG9wSXRlbTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbHVtbk5hbWUoaW50IGNvbHVtbkluZGV4KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IHJvb3RBZGFwdGVyRmFjdG9yeSA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCQlpZiAocm9vdEFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSUNvbHVtbkF3YXJlKSB7Ci0JCQlNYXAgY29sdW1uSW5kZXhUb05hbWVNYXAgPSAoKElDb2x1bW5Bd2FyZSkgcm9vdEFkYXB0ZXJGYWN0b3J5KQotCQkJCQkuZ2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoKTsKLQkJCWlmIChjb2x1bW5JbmRleFRvTmFtZU1hcCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIChTdHJpbmcpIGNvbHVtbkluZGV4VG9OYW1lTWFwLmdldChuZXcgSW50ZWdlcigKLQkJCQkJCWNvbHVtbkluZGV4KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCS8vIFN0cmluZyBjb2xOYW1lID0gKFN0cmluZykgY29sdW1uSW5kZXhUb05hbWVNYXAuZ2V0KG5ldwotCQkvLyBJbnRlZ2VyKGNvbHVtbkluZGV4KSk7Ci0JCVN0cmluZyBjb2xOYW1lID0gZ2V0Q29sdW1uTmFtZShjb2x1bW5JbmRleCk7Ci0JCXJldHVybiBUbmdVdGlsLmdldENvbHVtbkltYWdlKG9iamVjdCwgY29sTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkvLyBTdHJpbmcgY29sTmFtZSA9IChTdHJpbmcpIGNvbHVtbkluZGV4VG9OYW1lTWFwLmdldChuZXcKLQkJLy8gSW50ZWdlcihjb2x1bW5JbmRleCkpOwotCQlTdHJpbmcgY29sTmFtZSA9IGdldENvbHVtbk5hbWUoY29sdW1uSW5kZXgpOwotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKG9iamVjdCwgY29sTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0VG9wSXRlbShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvcEl0ZW0oT2JqZWN0IHRvcCkgewotCQl0b3BJdGVtID0gdG9wOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjaXNSb2xsZWRVcCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSb2xsZWRVcCgpIHsKLQkJcmV0dXJuIHJvbGxlZFVwOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0Um9sbGVkVXAoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xsZWRVcChib29sZWFuIGIpIHsKLQkJcm9sbGVkVXAgPSBiOwotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChqYXZhLnV0aWwuTWFwKQotCS8vICovCi0JLy8gcHVibGljIHZvaWQgc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoTWFwIG1hcCkgewotCS8vIGlmIChtYXAgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gY29sdW1uSW5kZXhUb05hbWVNYXAgPSBtYXA7Ci0JLy8gfQotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHksIHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcCwgU3RyaW5nIHR4dCkgewotCQlXb3JrQnJlYWtkb3duRWxlbWVudCBlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBvYmplY3Q7Ci0JCWlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRSkgewotCQkJZS5zZXROYW1lKHR4dCk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUykgewotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4pIHsKLQkJCWUuc2V0SXNFdmVudERyaXZlbihCb29sZWFuLnZhbHVlT2YodHh0KSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcpIHsKLQkJCWUuc2V0SXNPbmdvaW5nKEJvb2xlYW4udmFsdWVPZih0eHQpKTsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSkgewotCQkJZS5zZXRJc1JlcGVhdGFibGUoQm9vbGVhbi52YWx1ZU9mKHR4dCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRMaXN0ZW5lcnMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldExpc3RlbmVycygpIHsKLQkJaWYgKGNoYW5nZU5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoKExpc3QpIGNoYW5nZU5vdGlmaWVyKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0UHJlZGVjZXNzb3JzKCkKLQkgKi8KLQlwdWJsaWMgUHJlZGVjZXNzb3JMaXN0IGdldFByZWRlY2Vzc29ycygpIHsKLQkJaWYgKHByZWRlY2Vzc29ycyA9PSBudWxsKSB7Ci0JCQlwcmVkZWNlc3NvcnMgPSBuZXcgUHJlZGVjZXNzb3JMaXN0KFRuZ1V0aWwKLQkJCQkJLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSksIHRhcmdldCk7Ci0JCX0KLQkJcmV0dXJuIHByZWRlY2Vzc29yczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpcnN0RWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5pc0ZpcnN0RWxlbWVudChnZXRSb290QWRhcHRlckZhY3RvcnkoKSwgdGhpcywgb2JqKTsKLQotCQkvLyBPYmplY3QgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJLy8gaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkKLQkJLy8gewotCQkvLyBBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJLy8gTGlzdCBlbGVtZW50cyA9IGdldEZpbHRlcmVkQnJlYWtkb3duRWxlbWVudHMoYWN0aXZpdHksIG9iaik7Ci0JCS8vCQkJCi0JCS8vIC8vIGlmIGl0J3MgZmlyc3QgZWxlbWVudCwgcmV0dXJuIHRydWUKLQkJLy8gaWYgKGVsZW1lbnRzLmdldCgwKS5lcXVhbHMob2JqKSkKLQkJLy8gewotCQkvLyByZXR1cm4gdHJ1ZTsKLQkJLy8gfQotCQkvLyBlbHNlIHJldHVybiBmYWxzZTsKLQkJLy8gfQotCQkvLwkJCi0JCS8vIHJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGFzdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuaXNMYXN0RWxlbWVudChnZXRSb290QWRhcHRlckZhY3RvcnkoKSwgdGhpcywgb2JqKTsKLQotCQkvLyBPYmplY3QgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJLy8gaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkKLQkJLy8gewotCQkvLyBBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJLy8gTGlzdCBlbGVtZW50cyA9IGdldEZpbHRlcmVkQnJlYWtkb3duRWxlbWVudHMoYWN0aXZpdHksIG9iaik7Ci0JCS8vCQkJCi0JCS8vIC8vIGlmIGl0J3MgbGFzdCBlbGVtZW50LCByZXR1cm4gdHJ1ZQotCQkvLyBpZiAoZWxlbWVudHMuZ2V0KGVsZW1lbnRzLnNpemUoKSAtIDEpLmVxdWFscyhvYmopKQotCQkvLyB7Ci0JCS8vIHJldHVybiB0cnVlOwotCQkvLyB9Ci0JCS8vIGVsc2UgcmV0dXJuIGZhbHNlOwotCQkvLyB9Ci0JCS8vCQkKLQkJLy8gcmV0dXJuIHRydWU7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlVXAoT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudChvYmopOwotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlUbmdVdGlsLm1vdmVVcCgoQWN0aXZpdHkpIHBhcmVudCwgb2JqLCBnZXRFQ2xhc3NlcygpLCBhY3Rpb25NZ3IpOwotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlRG93bihPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCVRuZ1V0aWwubW92ZURvd24oKEFjdGl2aXR5KSBwYXJlbnQsIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQkvLyBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkRlc2NyaXB0b3JJdGVtUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGRlbGVnYXRlSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZUl0ZW1Qcm92aWRlci5nZXRJbWFnZShvYmplY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5EZXNjcmlwdG9ySXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAoVG5nVXRpbC5oYW5kbGVQcmVkZWNlc3Nvckxpc3RDaGFuZ2UodGhpcywgbm90aWZpY2F0aW9uKSkKLQkJCXJldHVybjsKLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENoaWxkcmVuKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sCi0JCQlDb2xsZWN0aW9uIG5ld09yT2xkQ2hpbGRyZW4pIHsKLQkJaWYgKCFuZXdPck9sZENoaWxkcmVuLmlzRW1wdHkoKSkgewotCQkJLy8gLy8gcmVjYWxjdWxhdGUgdGhlIElEcyBvZiBicmVha2Rvd24gZWxlbWVudHMgYW5kIHJlZnJlc2ggdGhlbQotCQkJLy8gLy8KLQkJCS8vIEFjdGl2aXR5IHRvcEFjdCA9IChBY3Rpdml0eSkgZ2V0VG9wSXRlbSgpOwotCQkJLy8gQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQkJCS8vIFByb2Nlc3NVdGlsLnVwZGF0ZUlEcyhhZGFwdGVyRmFjdG9yeSwgbmV3Ci0JCQkvLyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihhZGFwdGVyRmFjdG9yeSwgdG9wQWN0KSwgdG9wQWN0KTsKLQotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCXB1YmxpYyBHZW5lcmljRHJvcENvbW1hbmQuRWxlbWVudEFkYXB0ZXIgY3JlYXRlRHJvcEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjY3JlYXRlRHJvcENvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY3JlYXRlRHJvcENvbW1hbmQoT2JqZWN0IG93bmVyLAotCQkJTGlzdCBkcm9wRWxlbWVudHMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5Gcm9tQ2FjaGUoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUNhY2hlKCkgewotCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQlnZXRDaGlsZHJlbih0YXJnZXQpOwotCQl9Ci0JCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIjZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJvbGx1cENoaWxkcmVuRnJvbUNhY2hlKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0JyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ODRhYjY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0JyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5QcmVkZWNlc3Nvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNSb2xsZWRVcDsKLQotCXByaXZhdGUgUHJlZGVjZXNzb3JMaXN0IHByZWRlY2Vzc29yczsKLQotCXByaXZhdGUgQm9vbGVhbiBleHBhbmRlZDsKLQkKLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIoT2JqZWN0IHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIG51bGwsIENvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYodmFsdWUgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgdmFsdWU7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCWZlYXR1cmUgPSAoKERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyKSB2YWx1ZSkuZ2V0RmVhdHVyZSgpOwotCQkJfQotCQkJc2V0UmVhZE9ubHkod3JhcHBlci5pc1JlYWRPbmx5KCkpOwotCQkJc2V0Um9sbGVkVXAod3JhcHBlci5pc1JvbGx1cENoaWxkKCkpOwotCQkJaXNJbmhlcml0ZWQgPSB3cmFwcGVyLmlzSW5oZXJpdGVkOwotCQkJY29udHJpYnV0ZWQgPSB3cmFwcGVyLmNvbnRyaWJ1dGVkOwotCQl9CQkKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIoQnJlYWtkb3duRWxlbWVudCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKEJyZWFrZG93bkVsZW1lbnQgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNpc0V4cGFuZGVkKCkKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBpc0V4cGFuZGVkKCkgewotCQlyZXR1cm4gZXhwYW5kZWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRFeHBhbmRlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cGFuZGVkKEJvb2xlYW4gYikgewotCQlleHBhbmRlZCA9IGI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNpc1JvbGxlZFVwKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JvbGxlZFVwKCkgewotCQlyZXR1cm4gaXNSb2xsZWRVcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldFJvbGxlZFVwKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sbGVkVXAoYm9vbGVhbiBiKSB7Ci0JCWlzUm9sbGVkVXAgPSBiOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHksIHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHksIFN0cmluZyB0ZXh0VmFsdWUpIHsKLQkJUHJvY2Vzc1V0aWwuc2V0QXR0cmlidXRlKChXb3JrQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAob2JqZWN0KSwKLQkJCQlwcm9wZXJ0eSwgdGV4dFZhbHVlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciNkb0NyZWF0ZVdyYXBwZXIoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkpCi0JICovCi0JcHJvdGVjdGVkIElXcmFwcGVySXRlbVByb3ZpZGVyIGRvQ3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJcmV0dXJuIElCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV3JhcHBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYgKGRlbGVnYXRlSXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIpIHsKLQkJCXJldHVybiAoKElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyKSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikKLQkJCQkJLmdldENvbHVtbkltYWdlKG9iamVjdCwgY29sdW1uSW5kZXgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRQcmVkZWNlc3NvcnMoKQotCSAqLwotCXB1YmxpYyBQcmVkZWNlc3Nvckxpc3QgZ2V0UHJlZGVjZXNzb3JzKCkgewotCQlpZiAocHJlZGVjZXNzb3JzID09IG51bGwpIHsKLQkJCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcCh0aGlzKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXByZWRlY2Vzc29ycyA9IG5ldyBQcmVkZWNlc3Nvckxpc3QoVG5nVXRpbAotCQkJCQkJLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSksIHRoaXMpOwotCQkJfSBlbHNlIHsKLQkJCQlwcmVkZWNlc3NvcnMgPSBQcmVkZWNlc3Nvckxpc3QuRU1QVFlfTElTVDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlZGVjZXNzb3JzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIjY3JlYXRlQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5DbGFzcywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKE9iamVjdCBvYmplY3QsIEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJQ2xhc3MgY29tbWFuZENsYXNzLCBDb21tYW5kUGFyYW1ldGVyIGNvbW1hbmRQYXJhbWV0ZXIpIHsKLQkJLy8gU3lzdGVtLm91dAotCQkvLyAucHJpbnRsbigiQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIuY3JlYXRlQ29tbWFuZCgpOiIpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBvYmplY3Q6ICIgKyBvYmplY3QpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBjb21tYW5kQ2xhc3M6ICIgKyBjb21tYW5kQ2xhc3MpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBjb21tYW5kUGFyYW1ldGVyOiAiICsgY29tbWFuZFBhcmFtZXRlcik7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVDb21tYW5kKG9iamVjdCwgZG9tYWluLCBjb21tYW5kQ2xhc3MsCi0JCQkJY29tbWFuZFBhcmFtZXRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciNnZXROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRmlyc3RFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMYXN0RWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEZpbHRlcmVkQnJlYWtkb3duRWxlbWVudHMoT2JqZWN0IGFjdGl2aXR5LCBPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVVcChPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVEb3duKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCi0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHByZWRlY2Vzc29ycyAhPSBudWxsKSB7Ci0JCQlwcmVkZWNlc3NvcnMuZGlzcG9zZSgpOwotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjAzOTZjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB7Ci0JcHJpdmF0ZSBMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcihPYmplY3QgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCQlhZGRFbGVtZW50KHZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0VmFsdWVzKCkgewotCQlyZXR1cm4gdmFsdWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVsZW1lbnQoT2JqZWN0IGUpIHsKLQkJZ2V0VmFsdWVzKCkuYWRkKGUpOwotCX0KLQkKLQkvKioKLQkgKiBEZWNpZGVzIGlmIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIHByb3BlcnR5IG9mIGFsbCBlbGVtZW50cyBpbiB0aGlzIGNvbXBvc2VkIHdyYXBwZXIgY2FuIGJlIG1lcmdlZC4KLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuTWVyZ2UoU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk87Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlpZighdmFsdWVzLmlzRW1wdHkoKSkgewotCQkJaWYoY2FuTWVyZ2UocHJvcGVydHkpKSB7Ci0JCQkJVW5pcXVlRUxpc3QgbW9kZWxJbmZvcyA9IG5ldyBVbmlxdWVFTGlzdCgpOwkJCQkKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQkJCVN0cmluZyBpbmZvOwotCQkJCQlpZihvIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlpbmZvID0gKChJQlNJdGVtUHJvdmlkZXIpbykuZ2V0QXR0cmlidXRlKG8sIHByb3BlcnR5KTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUlCU0l0ZW1Qcm92aWRlciBpcCA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG8sIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlpbmZvID0gaXAuZ2V0QXR0cmlidXRlKG8sIHByb3BlcnR5KTsKLQkJCQkJfQotCQkJCQlpZighU3RyVXRpbC5pc0JsYW5rKGluZm8pKSB7Ci0JCQkJCQltb2RlbEluZm9zLmFkZChpbmZvKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZighbW9kZWxJbmZvcy5pc0VtcHR5KCkpIHsKLQkJCQkJU3RyaW5nQnVmZmVyIG1vZGVsSW5mbyA9IG5ldyBTdHJpbmdCdWZmZXIoKFN0cmluZyltb2RlbEluZm9zLmdldCgwKSk7Ci0JCQkJCWludCBtYXggPSBtb2RlbEluZm9zLnNpemUoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBtYXg7IGkrKykgewotCQkJCQkJbW9kZWxJbmZvLmFwcGVuZCgnLCcpLmFwcGVuZChtb2RlbEluZm9zLmdldChpKSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG1vZGVsSW5mby50b1N0cmluZygpOwotCQkJCX0KLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0luaGVyaXRlZCgpIHsKLQkJZm9yKGludCBpID0gdmFsdWVzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlPYmplY3QgbyA9IHZhbHVlcy5nZXQoaSk7Ci0JCQlpZighKG8gaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSAKLQkJCQkJfHwgISgoRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilvKS5pc0luaGVyaXRlZCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2VkV1BEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQ29tcG9zZWRXUERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMxMzkzNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQ29tcG9zZWRXUERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gRmViIDIzLCAyMDA2Ci0gKiBAc2luY2UgIDcuMC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NlZFdQRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgTGlzdCBub3RpZmllcnM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRXUERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKE9iamVjdCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmKHZhbHVlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXZhbHVlKTsKLQkJCXJlYWRPbmx5ID0gd3JhcHBlci5pc1JlYWRPbmx5KCk7Ci0JCQlpc0luaGVyaXRlZCA9IHdyYXBwZXIuaXNJbmhlcml0ZWQ7Ci0JCX0KLQkJaXNSb2xsdXBDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byB0aGUgbm90aWZpZXIgbGlzdCBvZiB0aGlzIHdyYXBwZXIuIFRoZSBnaXZlbiB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcgotCSAqIG11c3QgYmUgbGlua2VkIHRvIHRoZSBzYW1lIHdvcmsgcHJvZHVjdCBhcyB0aGUgZGVsZWdhdGUgdmFsdWUgaXMgCi0JICogCi0JICogQHBhcmFtIG9iamVjdCB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3Igb3IgaXRzIHdyYXBwZXIKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRXb3JrUHJvZHVjdERlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcilUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlPYmplY3QgZGVsZWdhdGVWYWx1ZSA9IGdldERlbGVnYXRlVmFsdWUoKTsKLQkJaWYoZGVsZWdhdGVWYWx1ZSA9PSB3cGQpIHsKLQkJCXJldHVybjsKLQkJfQotCQlPYmplY3Qgd3AgPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcilkZWxlZ2F0ZVZhbHVlKTsKLQkJaWYod3AgPT0gbnVsbCB8fCB3cCA9PSB3cGQuZ2V0V29ya1Byb2R1Y3QoKSkgewotCQkJT2JqZWN0IGl0ZW1Qcm92aWRlciA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KHdwZCwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChpdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBJQ2hhbmdlTm90aWZpZXIpCi0JCQl7Ci0JCQkJKChJQ2hhbmdlTm90aWZpZXIpaXRlbVByb3ZpZGVyKS5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJCQlpZihub3RpZmllcnMgPT0gbnVsbCkgewotCQkJCQlub3RpZmllcnMgPSBuZXcgVW5pcXVlRUxpc3QoKTsKLQkJCQl9Ci0JCQkJbm90aWZpZXJzLmFkZChpdGVtUHJvdmlkZXIpOwotCQkJfQotCQl9CQotCQkKLQkJaWYoaXNJbmhlcml0ZWQgJiYgb2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgJiYKLQkJCQkhKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilvYmplY3QpLmlzSW5oZXJpdGVkKSB7Ci0JCQl0aGlzLmlzSW5oZXJpdGVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKG5vdGlmaWVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub3RpZmllcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUNoYW5nZU5vdGlmaWVyIG5vdGlmaWVyID0gKElDaGFuZ2VOb3RpZmllcikgaXRlci5uZXh0KCk7Ci0JCQkJbm90aWZpZXIucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQl9Ci0JCQlub3RpZmllcnMuY2xlYXIoKTsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZihub3RpZmllcnMgIT0gbnVsbCAmJiBub3RpZmllcnMuY29udGFpbnMobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpKSB7Ci0JCQlzd2l0Y2gobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVklOR19BREFQVEVSOgotCQkJCWlmKG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpID09IHRoaXMpIHsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIHRoaXMsIGZhbHNlLCB0cnVlKSk7CQkJCQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotCQkJCXN3aXRjaChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcykpIHsKLQkJCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURToKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQod3JhcE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJaWYocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPICYmIGdldFZhbHVlKCkgaW5zdGFuY2VvZiBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlTdHJpbmcgaW5mbyA9ICgoQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilnZXRWYWx1ZSgpKS5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKGluZm8pKSB7Ci0JCQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW5mbywgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCUhhc2hTZXQgaW5mb1NldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJU3RyaW5nQnVmZmVyIGluZm9zID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJU3RyaW5nIHRva2VuID0gdG9rZW5zLm5leHRUb2tlbigpOwotCQkJCQlpZihpbmZvU2V0LmFkZCh0b2tlbikpIHsKLQkJCQkJCWluZm9zLmFwcGVuZCh0b2tlbikuYXBwZW5kKCcsJyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaW5mb3MuZGVsZXRlQ2hhckF0KGluZm9zLmxlbmd0aCgpIC0gMSk7Ci0JCQkJaW5mbyA9IGluZm9zLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gaW5mbzsKLQkJfQotCQlpZihub3RpZmllcnMgIT0gbnVsbCAmJiAhbm90aWZpZXJzLmlzRW1wdHkoKQotCQkJCSYmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0VOVFJZX1NUQVRFIHx8IHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfRVhJVF9TVEFURSkpIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHJidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlTdHJpbmcgc3RyID0gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCQkJaWYoIVN0clV0aWwuaXNCbGFuayhzdHIpKSB7Ci0JCQkJc3RyYnVmLmFwcGVuZChzdHIpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm90aWZpZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKSBpdGVyLm5leHQoKTsKLQkJCQlzdHIgPSBpdGVtUHJvdmlkZXIuZ2V0QXR0cmlidXRlKGl0ZW1Qcm92aWRlci5nZXRUYXJnZXQoKSwgcHJvcGVydHkpOwotCQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsoc3RyKSkgewotCQkJCQlpZihzdHJidWYubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlzdHJidWYuYXBwZW5kKCcsJyk7Ci0JCQkJCX0KLQkJCQkJc3RyYnVmLmFwcGVuZChzdHIpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdHJidWYudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGJhZmE5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkdlbmVyaWNEcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5PQlNEcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuR2VuZXJpY0Ryb3BDb21tYW5kLkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIEVsZW1lbnRBZGFwdGVyIGRyb3BBZGFwdGVyOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIENvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGVzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5EZXNjcmlwdG9ySXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDb21wb3NpdGVSb2xlLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRVM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNpc1dyYXBwaW5nTmVlZGVkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVXcmFwcGVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSBuZXcgRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcigKLQkJCQkoRGVzY3JpYmFibGVFbGVtZW50KSB2YWx1ZSwgb2JqZWN0LCBnZXRSb290QWRhcHRlckZhY3RvcnkoKSk7Ci0JCS8vIHdyYXBwZXIuc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoY29sdW1uSW5kZXhUb05hbWVNYXApOwotCQlyZXR1cm4gd3JhcHBlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQkvLyBwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gQ29tcG9zaXRlUm9sZSBjb21wb3NpdGVSb2xlID0gKENvbXBvc2l0ZVJvbGUpIG9iamVjdDsKLQkvLyBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCS8vIENvbGxlY3Rpb24gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gY29tcG9zaXRlUm9sZS5nZXRBZ2dyZWdhdGVkUm9sZXMoKS5pdGVyYXRvcigpOwotCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIGNoaWxkcmVuLmFkZChuZXcKLQkvLyBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKChEZXNjcmliYWJsZUVsZW1lbnQpIGl0ZXIubmV4dCgpLAotCS8vIHRoaXMsIGFkYXB0ZXJGYWN0b3J5KSk7Ci0JLy8gfQotCS8vIHJldHVybiBjaGlsZHJlbjsKLQkvLyB9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGZsb2F0LCBpbnQsIGludCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJT2JqZWN0IG93bmVyLCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sCi0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBPQlNEcmFnQW5kRHJvcENvbW1hbmQoZG9tYWluLCBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsCi0JCQkJb3BlcmF0aW9uLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJpY0Ryb3BDb21tYW5kLkVsZW1lbnRBZGFwdGVyIGNyZWF0ZURyb3BBZGFwdGVyKCkgewotCQlpZiAoZHJvcEFkYXB0ZXIgPT0gbnVsbCkgewotCQkJZHJvcEFkYXB0ZXIgPSBuZXcgR2VuZXJpY0Ryb3BDb21tYW5kLkVsZW1lbnRBZGFwdGVyKCkgewotCi0JCQkJcHVibGljIE9iamVjdCBhZGFwdChPYmplY3QgZHJvcEVsZW1lbnQpIHsKLQkJCQkJaWYgKGRyb3BFbGVtZW50IGluc3RhbmNlb2YgUm9sZQotCQkJCQkJCSYmICEoKENvbXBvc2l0ZVJvbGUpIGdldFRhcmdldCgpKQotCQkJCQkJCQkJLmdldEFnZ3JlZ2F0ZWRSb2xlcygpLmNvbnRhaW5zKGRyb3BFbGVtZW50KSkgewotCQkJCQkJcmV0dXJuIGRyb3BFbGVtZW50OwotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJfTsKLQkJfQotCQlyZXR1cm4gZHJvcEFkYXB0ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NpdGVSb2xlV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQ29tcG9zaXRlUm9sZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzUwNjJiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NpdGVSb2xlV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlUm9sZVdyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHJvbGUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVSb2xlV3JhcHBlckl0ZW1Qcm92aWRlcihDb21wb3NpdGVSb2xlIHJvbGUsIE9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHJvbGUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvRGVsaXZlcmFibGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvRGVsaXZlcmFibGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjJiMTJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0RlbGl2ZXJhYmxlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJhYmxlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIERlbGl2ZXJhYmxlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgdmFsdWUsIE9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0Rlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0Rlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWI5MTJhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9EZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJlZGVjZXNzb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLQotCi0vKioKLSAqIFdyYXBwZXIgaXRlbSBwcm92aWRlciBmb3IgRGVzY3JpYmxlRWxlbWVudAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCURlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUJTSXRlbVByb3ZpZGVyLAotCQlJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0KLQlwcml2YXRlIGludCBpZDsKLQotCXByaXZhdGUgT2JqZWN0IHRvcEl0ZW07Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkT25seSA9IHRydWU7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmhlcml0ZWQgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250cmlidXRlZCA9IGZhbHNlOwotCQotCXByb3RlY3RlZCBib29sZWFuIGlzUm9sbHVwQ2hpbGQgPSBmYWxzZTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcihEZXNjcmliYWJsZUVsZW1lbnQgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXModmFsdWUsIG93bmVyLCBudWxsLCBDb21tYW5kUGFyYW1ldGVyLk5PX0lOREVYLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcihEZXNjcmliYWJsZUVsZW1lbnQgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCXByb3RlY3RlZCBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKE9iamVjdCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9CQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoaXMgd3JhcHBlciBpcyByZWFkLW9ubHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gcmVhZE9ubHk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSByZWFkT25seQotCSAqICAgICAgICAgICAgVGhlIHJlYWRPbmx5IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KSB7Ci0JCXRoaXMucmVhZE9ubHkgPSByZWFkT25seTsKLQl9CQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgY29udHJpYnV0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRyaWJ1dGVkKCkgewotCQlyZXR1cm4gY29udHJpYnV0ZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJbmhlcml0ZWQoKSB7Ci0JCXJldHVybiBpc0luaGVyaXRlZDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNSb2xsdXBDaGlsZCgpIHsKLQkJcmV0dXJuIGlzUm9sbHVwQ2hpbGQ7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldElkKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChpbnQgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBvYmopIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldFRvcEl0ZW0oKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VG9wSXRlbSgpIHsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChudWxsKTsKLQkJaWYgKHRvcEl0ZW0gPT0gbnVsbCAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXRSb290QWRhcHRlckZhY3RvcnkoKQotCQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCU9iamVjdCB0b3AgPSBhZGFwdGVyLmdldFRvcEl0ZW0oKTsKLQkJCQlpZiAodG9wID09IG51bGwgJiYgcGFyZW50IGluc3RhbmNlb2YgUHJvY2VzcwotCQkJCQkJJiYgKChQcm9jZXNzKSBwYXJlbnQpLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCQkJdG9wID0gcGFyZW50OwotCQkJCQlhZGFwdGVyLnNldFRvcEl0ZW0odG9wKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRvcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdG9wSXRlbTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldFRvcEl0ZW0oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb3BJdGVtKE9iamVjdCB0b3ApIHsKLQkJdG9wSXRlbSA9IHRvcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2lzUm9sbGVkVXAoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUm9sbGVkVXAoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldFJvbGxlZFVwKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sbGVkVXAoYm9vbGVhbiBiKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNpc0ZpcnN0RWxlbWVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmlyc3RFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjaXNMYXN0RWxlbWVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFzdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRGaWx0ZXJlZEJyZWFrZG93bkVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEZpbHRlcmVkQnJlYWtkb3duRWxlbWVudHMoT2JqZWN0IGFjdGl2aXR5T2JqLCBPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjbW92ZVVwKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdmVVcChPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI21vdmVEb3duKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdmVEb3duKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0RUNsYXNzZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJRGVzY3JpYmFibGVFbGVtZW50IGUgPSAoRGVzY3JpYmFibGVFbGVtZW50KSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FKSB7Ci0JCQlyZXR1cm4gZS5nZXROYW1lKCk7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCkgewotCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGlkKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJaWYgKFN0clV0aWwuaXNCbGFuayhuYW1lKSkgewotCQkJCW5hbWUgPSBlLmdldE5hbWUoKTsKLQkJCX0KLQkJCXJldHVybiBuYW1lOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHksIFN0cmluZyB0ZXh0VmFsdWUpIHsKLQotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklDb2x1bW5Bd2FyZSNzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChqYXZhLnV0aWwuTWFwKQotCS8vICovCi0JLy8gcHVibGljIHZvaWQgc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoTWFwIG1hcCkgewotCS8vIGlmIChtYXAgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gY29sdW1uSW5kZXhUb05hbWVNYXAgPSBtYXA7Ci0JLy8gY29sdW1uSW5kZXhUb05hbWVNYXBDaGFuZ2VkID0gdHJ1ZTsKLQkvLyB9Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRQcmVkZWNlc3NvcnMoKQotCSAqLwotCXB1YmxpYyBQcmVkZWNlc3Nvckxpc3QgZ2V0UHJlZGVjZXNzb3JzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2lzRXhwYW5kZWQoKQotCSAqLwotCXB1YmxpYyBCb29sZWFuIGlzRXhwYW5kZWQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0RXhwYW5kZWQoamF2YS5sYW5nLkJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwYW5kZWQoQm9vbGVhbiBiKSB7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIjY3JlYXRlV3JhcHBlcihqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkpCi0JICovCi0JcHJvdGVjdGVkIElXcmFwcGVySXRlbVByb3ZpZGVyIGNyZWF0ZVdyYXBwZXIoT2JqZWN0IHZhbHVlLCBPYmplY3Qgb3duZXIsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlJV3JhcHBlckl0ZW1Qcm92aWRlciB3aXAgPSBkb0NyZWF0ZVdyYXBwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmKHdpcCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB3aXA7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCXdyYXBwZXIuZmVhdHVyZSA9ICgoRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIpIHZhbHVlKQotCQkJCS5nZXRGZWF0dXJlKCk7Ci0JCQl9Ci0JCQl3cmFwcGVyLnNldFJlYWRPbmx5KHJlYWRPbmx5KTsKLQkJCXdyYXBwZXIuaXNSb2xsdXBDaGlsZCA9IGlzUm9sbHVwQ2hpbGQ7Ci0JCQl3cmFwcGVyLmlzSW5oZXJpdGVkID0gaXNJbmhlcml0ZWQ7Ci0JCQl3cmFwcGVyLmNvbnRyaWJ1dGVkID0gaXNDb250cmlidXRlZCgpOwotCQl9CQkKLQkJcmV0dXJuIHdpcDsKLQl9Ci0JCi0JcHJvdGVjdGVkIElXcmFwcGVySXRlbVByb3ZpZGVyIGRvQ3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsIE9iamVjdCBvd25lciwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAodmFsdWUpOwotCQlpZiAoZSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gbmV3IERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIoCi0JCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIGUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQlyZXR1cm4gd3JhcHBlcjsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlV3JhcHBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYgKGRlbGVnYXRlSXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIpIHsKLQkJCXJldHVybiAoKElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyKSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikKLQkJCQkJLmdldENvbHVtbkltYWdlKG9iamVjdCwgY29sdW1uSW5kZXgpOwotCQl9Ci0JCWlmIChjb2x1bW5JbmRleCA9PSAwCi0JCQkJJiYgZGVsZWdhdGVJdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBJSXRlbUxhYmVsUHJvdmlkZXIpIHsKLQkJCXJldHVybiAoKElJdGVtTGFiZWxQcm92aWRlcikgZGVsZWdhdGVJdGVtUHJvdmlkZXIpLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbHVtbk5hbWUoaW50IGNvbHVtbkluZGV4KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IHJvb3RBZGFwdGVyRmFjdG9yeSA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCQlpZiAocm9vdEFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSUNvbHVtbkF3YXJlKSB7Ci0JCQlNYXAgY29sdW1uSW5kZXhUb05hbWVNYXAgPSAoKElDb2x1bW5Bd2FyZSkgcm9vdEFkYXB0ZXJGYWN0b3J5KQotCQkJCQkuZ2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoKTsKLQkJCWlmIChjb2x1bW5JbmRleFRvTmFtZU1hcCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIChTdHJpbmcpIGNvbHVtbkluZGV4VG9OYW1lTWFwLmdldChuZXcgSW50ZWdlcigKLQkJCQkJCWNvbHVtbkluZGV4KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkvLyBTdHJpbmcgY29sTmFtZSA9IChTdHJpbmcpIGNvbHVtbkluZGV4VG9OYW1lTWFwLmdldChuZXcKLQkJLy8gSW50ZWdlcihjb2x1bW5JbmRleCkpOwotCQlTdHJpbmcgY29sTmFtZSA9IGdldENvbHVtbk5hbWUoY29sdW1uSW5kZXgpOwotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKG9iamVjdCwgY29sTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRMaXN0ZW5lcnMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldExpc3RlbmVycygpIHsKLQkJaWYgKGNoYW5nZU5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoKExpc3QpIGNoYW5nZU5vdGlmaWVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNjcmVhdGVEcm9wQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZUF3YXJlQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsCi0JCQlMaXN0IGRyb3BFbGVtZW50cykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWU5YWExYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9EZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPKSB7Ci0JCQlTdHJpbmdCdWZmZXIgbW9kZWxJbmZvID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJT2JqZWN0IGUgPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcikgb2JqZWN0KTsKLQkJCWlmIChlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZTsKLQkJCQlPYmplY3QgYmFzZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJCS8vIGxvb2sgZm9yIGV4aXN0aW5nIGRlc2NyaXB0b3IgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlCi0JCQkJCS8vIGJhc2UgaW4gdGhlIGFjdGl2aXR5Ci0JCQkJCS8vCi0JCQkJCU9iamVjdCBwYXJlbnQgPSBudWxsOwotCQkJCQlmb3IgKHBhcmVudCA9IGdldFBhcmVudChvYmplY3QpOyBwYXJlbnQgIT0gbnVsbAotCQkJCQkJCSYmICEocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpOykgewotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBnZXRSb290QWRhcHRlckZhY3RvcnkoKQotCQkJCQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KTsKLQkJCQkJfQotCQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCU9iamVjdCBkZXNjID0gbnVsbDsKLQkJCQkJCWZpbmRfZGVzY3JpcHRvcl9sb29wOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGFwdGVyCi0JCQkJCQkJCS5nZXRDaGlsZHJlbihwYXJlbnQpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBjaGlsZCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yCi0JCQkJCQkJCQkmJiBQcm9jZXNzVXRpbAotCQkJCQkJCQkJCQkuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIGNoaWxkKSA9PSBiYXNlKSB7Ci0JCQkJCQkJCWRlc2MgPSBjaGlsZDsKLQkJCQkJCQkJYnJlYWsgZmluZF9kZXNjcmlwdG9yX2xvb3A7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQkJCVN0cmluZyBzdHIgPSBudWxsOwotCQkJCQkJCWlmICh2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKSB7Ci0JCQkJCQkJCXN0ciA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnByb2Nlc3NfZXh0ZW5kczsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0gZWxzZSBpZiAodmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUwpIHsKLQkJCQkJCQkJc3RyID0gTGlicmFyeUVkaXRSZXNvdXJjZXMucHJvY2Vzc19yZXBsYWNlczsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQlTdHJpbmcgbmFtZSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBkZXNjKQotCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQkJCQlpZiAoc3RyICE9IG51bGwpCi0JCQkJCQkJCW1vZGVsSW5mby5hcHBlbmQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoc3RyLAotCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IG5hbWUgfSkpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJbW9kZWxJbmZvLmFwcGVuZCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLS8vCQkJCQlQcm9jZXNzVXRpbC5nZXRNb2RlbEluZm9Gb3JXb3JrUHJvZHVjdERlc2NyaXB0b3IobW9kZWxJbmZvLAotLy8JCQkJCQkJKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqZWN0KTsKLQkJCQkJUHJvY2Vzc1V0aWwuZ2V0V1BETW9kZWxJbmZvKG1vZGVsSW5mbywgb2JqZWN0LCB0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbW9kZWxJbmZvLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lCU0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSUJTSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlkNmExZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSUJTSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJlZGVjZXNzb3JMaXN0OwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgYmFzZSBpbnRlcmZhY2Ugb2YgYWxsIGl0ZW0gcHJvdmlkZXJzIGZvciBicmVha2Rvd24gZWxlbWVudCB1c2VkCi0gKiBieSB0aGUgUHJvY2VzcyBFZGl0b3IuIEl0IGRlZmluZXMgdGhlIGNvbnN0YW50cyBmb3IgY29sdW1uIG5hbWVzIGFuZCBtZXRob2RzCi0gKiB0byBzdXBwb3J0IHJvdyBpbmRleCwgcm9sbC11cCB2aWV3LCBnZXR0aW5nL3NldHRpbmcgYnJlYWtkb3duIGVsZW1lbnQncwotICogYXR0cmlidXRlcywgcHJlZGVjZXNzb3IgbGlzdC4uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCU0l0ZW1Qcm92aWRlciBleHRlbmRzIC8vSUxpYnJhcnlJdGVtUHJvdmlkZXIsCi0JCUlTdGF0ZWZ1bEl0ZW1Qcm92aWRlciB7Ci0KLQkvKiogQ29sdW1uIElEIGNvbnN0YW50cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfUFJFRklYID0gInByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9QUkVERUNFU1NPUlMgPSAicHJlZGVjZXNzb3JzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0lTX1JFUEVBVEFCTEUgPSAiaXNfcmVwZWF0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9JU19PTkdPSU5HID0gImlzX29uZ29pbmciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfSVNfRVZFTlRfRFJJVkVOID0gImlzX2V2ZW50X2RyaXZlbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9FTlRSWV9TVEFURSA9ICJlbnRyeV9zdGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9FWElUX1NUQVRFID0gImV4aXRfc3RhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfVEVBTVMgPSAidGVhbXMiOyAvLyROT04tTkxTLTEkICAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfTU9ERUxfSU5GTyA9ICJtb2RlbF9pbmZvIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX1BSRVNFTlRBVElPTl9OQU1FID0gInByZXNlbnRhdGlvbl9uYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0RFTElWRVJBQkxFID0gImRlbGl2ZXJhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0lTX09QVElPTkFMID0gImlzX29wdGlvbmFsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0lTX1BMQU5ORUQgPSAiaXNfcGxhbm5lZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSAiaGFzX211bHRpcGxlX29jY3VycmVuY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT0xVTU5TID0geyBDT0xfTkFNRSwgQ09MX1BSRUZJWCwgQ09MX0lELAotCQkJQ09MX1BSRURFQ0VTU09SUywgQ09MX0lTX1JFUEVBVEFCTEUsIENPTF9JU19PTkdPSU5HLAotCQkJQ09MX0lTX0VWRU5UX0RSSVZFTiwgQ09MX0VOVFJZX1NUQVRFLCBDT0xfRVhJVF9TVEFURSwgQ09MX1RFQU1TLAotCQkJQ09MX1RZUEUsIENPTF9NT0RFTF9JTkZPLCBDT0xfUFJFU0VOVEFUSU9OX05BTUUsIENPTF9ERUxJVkVSQUJMRSB9OwotCQotCWludCBnZXRJZCgpOwotCi0Jdm9pZCBzZXRJZChpbnQgaWQpOwotCi0JLy8gSUJTSXRlbVByb3ZpZGVyIGdldEl0ZW1Qcm92aWRlcihFT2JqZWN0IGVPYmopOwotCi0Jdm9pZCBzZXRQYXJlbnQoT2JqZWN0IG9iaik7Ci0KLQlPYmplY3QgZ2V0VG9wSXRlbSgpOwotCi0Jdm9pZCBzZXRUb3BJdGVtKE9iamVjdCB0b3ApOwotCi0JYm9vbGVhbiBpc1JvbGxlZFVwKCk7Ci0KLQl2b2lkIHNldFJvbGxlZFVwKGJvb2xlYW4gYik7Ci0KLQlib29sZWFuIGlzRmlyc3RFbGVtZW50KE9iamVjdCBvYmopOwotCi0JYm9vbGVhbiBpc0xhc3RFbGVtZW50KE9iamVjdCBvYmopOwotCi0JLy8gTGlzdCBnZXRGaWx0ZXJlZEJyZWFrZG93bkVsZW1lbnRzKE9iamVjdCBhY3Rpdml0eU9iaiwgT2JqZWN0IG9iaik7Ci0KLQl2b2lkIG1vdmVVcChPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpOwotCi0Jdm9pZCBtb3ZlRG93bihPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpOwotCi0JQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpOwotCi0JLy8gR3JhcGhpY2FsRGF0YSBnZXRHcmFwaGljYWxEYXRhKCk7Ci0KLQkvLyB2b2lkIHNldEdyYXBoaWNhbERhdGEoR3JhcGhpY2FsRGF0YSBkYXRhKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0IGFzIGEgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgY29sdW1uIElEIGNvbnN0YW50cyBDT0xfWFhYCi0JICogQHJldHVybiBTdHJpbmcgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqICAgICAgICAgICAgb25lIG9mIHRoZSBjb2x1bW4gSUQgY29uc3RhbnRzIENPTF9YWFgKLQkgKiBAcGFyYW0gdGV4dFZhbHVlCi0JICovCi0Jdm9pZCBzZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBTdHJpbmcgdGV4dFZhbHVlKTsKLQotCUxpc3QgZ2V0TGlzdGVuZXJzKCk7Ci0KLQlQcmVkZWNlc3Nvckxpc3QgZ2V0UHJlZGVjZXNzb3JzKCk7Ci0KLQlCb29sZWFuIGlzRXhwYW5kZWQoKTsKLQotCXZvaWQgc2V0RXhwYW5kZWQoQm9vbGVhbiBiKTsKLQotCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsIExpc3QgZHJvcEVsZW1lbnRzKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNjE2MmQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5pbnRlcm5hbC5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkgZXh0ZW5kcyBJV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lDb2x1bW5Bd2FyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSUNvbHVtbkF3YXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNiMzgyMGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSUNvbHVtbkF3YXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIHRvIHBhc3MgdGhlIGNvbHVtbiBpbmRleCAvIG5hbWUgbWFwIGZyb20gdGhlIHVzZXIgaW50ZXJmYWNlIHRvCi0gKiB0aGUgYWRhcHRlciB0aGF0IGltcGxlbWVudHMgaXQgc28gdGhlIGFkYXB0ZXIgY2FuIHByb3ZpZGUgdGhlIGNvcnJlY3QgZGF0YQotICogZm9yIHRoZSBjb2x1bW5zIGV2ZW4gdGhlaXIgaW5kZXggaGF2ZSBjaGFuZ2VkLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb2x1bW5Bd2FyZSB7Ci0KLQlNYXAgZ2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoKTsKLQotCXZvaWQgc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoTWFwIG1hcCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNGM4NDY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJvY2Vzc0l0ZW1Qcm92aWRlciB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MDA1MjUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJaW1wbGVtZW50cyBJQ29sdW1uQXdhcmUgewotCi0JcHJpdmF0ZSBNYXAgY29sdW1uSW5kZXhUb05hbWVNYXA7Ci0KLQkvKioKLQkgKiBSZWZlcmVuY2VzIHRvIHN0YXRlZnVsIGFkYXB0ZXJzIGNyZWF0ZWQgYnkgdGhpcyBhZGFwdGVyIGZhY3RvcnkKLQkgKi8KLQlwcml2YXRlIFNldCBkaXNwb3NhYmxlQWRhcHRlcnMgPSBuZXcgSGFzaFNldCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCQkvLyBjcmVhdGVkQWRhcHRlcnMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFjdGl2aXR5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVQaGFzZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBoYXNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUJyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHN1cGVyLmNyZWF0ZUJyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkRlc2NyaXB0b3JzQWRhcHRlckZhY3RvcnkjY3JlYXRlRGVzY3JpcHRvckFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IERlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlRGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuRGVzY3JpcHRvcnNBZGFwdGVyRmFjdG9yeSNjcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuRGVzY3JpcHRvcnNBZGFwdGVyRmFjdG9yeSNjcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuRGVzY3JpcHRvcnNBZGFwdGVyRmFjdG9yeSNjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUNvbHVtbkF3YXJlI3NldENvbHVtbkluZGV4VG9OYW1lTWFwKGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoTWFwIG1hcCkgewotCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCWNvbHVtbkluZGV4VG9OYW1lTWFwID0gbWFwOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUNvbHVtbkF3YXJlKSB7Ci0JCQkoKElDb2x1bW5Bd2FyZSkgYWRhcHRlcikKLQkJCQkJLnNldENvbHVtbkluZGV4VG9OYW1lTWFwKGNvbHVtbkluZGV4VG9OYW1lTWFwKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gc3VwZXIuYWRhcHQobm90aWZpZXIsIHR5cGUpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDb2x1bW5Bd2FyZSkgewotCQkJKChJQ29sdW1uQXdhcmUpIGFkYXB0ZXIpCi0JCQkJCS5zZXRDb2x1bW5JbmRleFRvTmFtZU1hcChjb2x1bW5JbmRleFRvTmFtZU1hcCk7Ci0JCX0KLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3RhdGVmdWxJdGVtUHJvdmlkZXIKLQkJCQkmJiBub3RpZmllciBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkmJiAoKEVPYmplY3QpIG5vdGlmaWVyKS5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJZGlzcG9zYWJsZUFkYXB0ZXJzLmFkZChhZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Qcm9jZXNzdHlwZXNBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzQWRhcHRlcigpCi0JICovCi0JLy8gcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JLy8gcmV0dXJuIG5ldyBQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMpOwotCS8vIH0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJvY2Vzc3R5cGVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpCi0JICovCi0JLy8gcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkvLyByZXR1cm4gY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKTsKLQkvLyB9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByb2Nlc3N0eXBlc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpCi0JICovCi0JLy8gcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCS8vIHJldHVybiBjcmVhdGVQcm9jZXNzQWRhcHRlcigpOwotCS8vIH0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50QWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NQYWNrYWdlQWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyID0gbmV3IFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVDb21wb3NpdGVSb2xlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcG9zaXRlUm9sZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVDb21wb3NpdGVSb2xlQWRhcHRlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUm9sZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVBZGFwdGVyKCkgewotCQlpZiAocm9sZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyb2xlSXRlbVByb3ZpZGVyID0gbmV3IFJvbGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHJvbGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya09yZGVyQWRhcHRlcigpIHsKLQkJaWYgKHdvcmtPcmRlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3b3JrT3JkZXJJdGVtUHJvdmlkZXIgPSBuZXcgV29ya09yZGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiB3b3JrT3JkZXJJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklDb2x1bW5Bd2FyZSNnZXRDb2x1bW5JbmRleFRvTmFtZU1hcCgpCi0JICovCi0JcHVibGljIE1hcCBnZXRDb2x1bW5JbmRleFRvTmFtZU1hcCgpIHsKLQkJcmV0dXJuIGNvbHVtbkluZGV4VG9OYW1lTWFwOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoIWRpc3Bvc2FibGVBZGFwdGVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpc3Bvc2FibGVBZGFwdGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJRGlzcG9zYWJsZSBhZGFwdGVyID0gKElEaXNwb3NhYmxlKSBpdGVyLm5leHQoKTsKLQkJCQlhZGFwdGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWRpc3Bvc2FibGVBZGFwdGVycy5jbGVhcigpOwotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvTWlsZXN0b25lV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvTWlsZXN0b25lV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxN2NlMWZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL01pbGVzdG9uZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWlsZXN0b25lV3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBNaWxlc3RvbmVXcmFwcGVySXRlbVByb3ZpZGVyKE1pbGVzdG9uZSB2YWx1ZSwgT2JqZWN0IG93bmVyLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1pbGVzdG9uZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIE1pbGVzdG9uZVdyYXBwZXJJdGVtUHJvdmlkZXIoTWlsZXN0b25lIG1pbGVzdG9uZSwgT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIobWlsZXN0b25lLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL09CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiODNlNDljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL09CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5PQlNEcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuT0JTRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogSXRlbSBwcm92aWRlciBmb3IgVGVhbSBBbGxvY2F0aW9uIGFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBEaXNwb3NhYmxlIHJvbGxlZFVwV3JhcHBlcnM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIEFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgb2JqZWN0OwotCQkvLyBpZihoYXNDaGlsZERlc2NyaXB0b3IoYWN0KSkgewotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkvLyAoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJLy8gKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksCi0JCS8vIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkpKTsKLQkJLy8gICAgCQkKLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLAotCQkvLyBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZWFtUHJvZmlsZSgpKSk7Ci0JCS8vCi0JCS8vIH0KLQkJLy8gZWxzZSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVBoYXNlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVJdGVyYXRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFjdGl2aXR5KCkpKTsKLQotCQkvLyBpZihhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pc0VtcHR5KCkpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUm9sZURlc2NyaXB0b3IoKSkpOwotCi0JCS8vIENPTVBPU0lURSBST0xFIEZFQVRVUkUgSVMgTk9UIEFWQUlMQUJMRSBGT1IgRklSU1QgUkVMRUFTRS4KLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLAotCQkvLyBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb21wb3NpdGVSb2xlKCkpKTsKLQkJLy8JCQkJCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVRlYW1Qcm9maWxlKCkpKTsKLQotCQkvLyB9Ci0JCS8vIH0KLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVNaWxlc3RvbmUoKSkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCWNoaWxkID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCi0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IGNoaWxkIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IKLQkJCQl8fCBjaGlsZCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlIHx8IGNoaWxkIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQlyZXR1cm4gc3VwZXIuYWNjZXB0QXNDaGlsZChjaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldE9iamVjdChvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3QoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKChSb2xlRGVzY3JpcHRvcikgZGVzY3JpcHRvcikuZ2V0Um9sZSgpOwotCQl9Ci0JCWNhdGNoKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY3JlYXRlRHJvcENvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY3JlYXRlRHJvcENvbW1hbmQoT2JqZWN0IG93bmVyLAotCQkJTGlzdCBkcm9wRWxlbWVudHMpIHsKLQkJcmV0dXJuIG5ldyBPQlNEcm9wQ29tbWFuZCgoQWN0aXZpdHkpIG93bmVyLCBkcm9wRWxlbWVudHMpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCU9iamVjdCBvd25lciwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCS8vIFN5c3RlbS5vdXQKLQkJLy8gLnByaW50bG4oIkVOVEVSOgotCQkvLyBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChkb21haW4sCi0JCS8vIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKSIpOwotCQlDb21tYW5kIGNtZCA9IG5ldyBPQlNEcmFnQW5kRHJvcENvbW1hbmQoZG9tYWluLCBvd25lciwgbG9jYXRpb24sCi0JCQkJb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBjYW4gZXhlY3V0ZTogIiArIGNtZC5jYW5FeGVjdXRlKCkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBvd25lcjogIiArIG93bmVyKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgY29sbGVjdGlvbjogIiArIGNvbGxlY3Rpb24pOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBsb2NhdGlvbjogIiArIGxvY2F0aW9uKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgb3BlcmF0aW9uczogIiArIG9wZXJhdGlvbnMpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBvcGVyYXRpb246ICIgKyBvcGVyYXRpb24pOwotCQkvLyAgICAgICAgCi0JCS8vIFN5c3RlbS5vdXQKLQkJLy8gLnByaW50bG4oIkVYSVQ6Ci0JCS8vIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKGRvbWFpbiwKLQkJLy8gb3duZXIsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pIik7Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNyZWZyZXNoQ2hpbGRyZW4ob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLAotCS8vIGphdmEudXRpbC5MaXN0KQotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENoaWxkcmVuKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sIExpc3QKLQkvLyBuZXdPck9sZENoaWxkcmVuKSB7Ci0JLy8gaWYoIW5ld09yT2xkQ2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0JLy8gUHJvY2VzcyB0b3BBY3QgPSAoUHJvY2VzcykgZ2V0VG9wSXRlbSgpOwotCS8vIEFkYXB0ZXJGYWN0b3J5IHJvb3RBZGFwdGVyRmFjdG9yeSA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCS8vCQkJCQkJCi0JLy8gUHJvY2Vzc1V0aWwucmVmcmVzaFZpZXdlcihyb290QWRhcHRlckZhY3RvcnksIHRvcEFjdCk7Ci0JLy8JCQkKLQkvLyByZXR1cm47Ci0JLy8KLQkvLyB9Ci0JLy8gfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2lzTmV3RGVzY3JpcHRvcihqYXZhLnV0aWwuTGlzdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05ld0Rlc2NyaXB0b3IoTGlzdCBjaGlsZHJlbiwgT2JqZWN0IGNoaWxkKSB7Ci0JCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCS8vIGNvbGxlY3QgYWxsIHJvbGUgZGVzY3JpcHRvcnMgb3IgdGhlaXIgd3JhcHBlcnMgZmlyc3QgZm9yIG1hdGNoaW5nIHdpdGggdGVhbSBwcm9maWxlcwotCQkvLyBhbmQgZWxpbWluYXRlIHRoZSBkdXBsaWNhdGVzIGxhdGVyIGluIGdldENoaWxkcmVuKCkKLQkJLy8KLQkJaWYob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc05ld0Rlc2NyaXB0b3IoY2hpbGRyZW4sIG9iaik7Ci0JfQkJCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHJvbGxlZFVwV3JhcHBlcnMgIT0gbnVsbCkgewotCQkJcm9sbGVkVXBXcmFwcGVycy5kaXNwb3NlKCk7Ci0JCX0KLQotCQlpZiAoaXNSb2xsZWRVcCgpKSB7Ci0JCQlMaXN0IHRlYW1Qcm9maWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUxpc3Qgcm9sZURlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSGFzaFNldCByb2xlVGVhbVBhaXJzID0gbmV3IEhhc2hTZXQoKTsKLQkJCUhhc2hTZXQgcm9sZURlc2NyaXB0b3JzV2l0aG91dExpbmtlZEVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJCi0JCQkvLyBjb2xsZWN0IGFsbCB0ZWFtIHByb2ZpbGVzIHVuZGVyIHRoaXMgYWN0aXZpdHkKLQkJCS8vCi0JCQlIYXNoU2V0IHZhbGlkVGVhbVByb2ZpbGVzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChvKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJCWlmKHZhbGlkVGVhbVByb2ZpbGVzLmFkZChlKSkgewotCQkJCQkJdGVhbVByb2ZpbGVzLmFkZChvKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQlSb2xlRGVzY3JpcHRvciBkZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBlOwotCQkJCQlMaXN0IGxpc3Q7Ci0JCQkJCUxpc3QgZGVzY3JpcHRvcnMgPSBudWxsOwotCQkJCQlDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGNvbXBvc2VkV3JhcHBlciA9IG51bGw7CQkJCQkKLQkJCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCU9iamVjdCB2YWx1ZSA9ICgoUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKWNoaWxkKS5nZXRWYWx1ZSgpOwotCQkJCQkJaWYodmFsdWUgaW5zdGFuY2VvZiBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJY29tcG9zZWRXcmFwcGVyID0gKENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHZhbHVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmKGNvbXBvc2VkV3JhcHBlciAhPSBudWxsKSB7Ci0JCQkJCQlsaXN0ID0gbmV3IFVuaXF1ZUVMaXN0KCk7Ci0JCQkJCQlkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb21wb3NlZFdyYXBwZXIuZ2V0VmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgbyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKG8pOwotCQkJCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQkJCQlMaXN0IHRlYW1zID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0VGVhbVByb2ZpbGVzKChSb2xlRGVzY3JpcHRvcikgZWxlbWVudCk7Ci0JCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHRlYW1zLml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJT2JqZWN0IHRlYW0gPSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJCWlmKGxpc3QuYWRkKHRlYW0pKSB7Ci0JCQkJCQkJCQkJZGVzY3JpcHRvcnMuYWRkKG8pOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlsaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0VGVhbVByb2ZpbGVzKGRlc2MpOwotCQkJCQl9Ci0JCQkJCWludCBzaXplID0gbGlzdC5zaXplKCk7IAotCQkJCQlpZihzaXplID4gMSkgewotCQkJCQkJaWYgKHJvbGxlZFVwV3JhcHBlcnMgPT0gbnVsbCkgewotCQkJCQkJCXJvbGxlZFVwV3JhcHBlcnMgPSBuZXcgRGlzcG9zYWJsZSgpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlib29sZWFuIHJlYWRPbmx5ID0gZmFsc2U7Ci0JCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJCXJlYWRPbmx5ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgY2hpbGQpCi0JCQkJCQkJLmlzUmVhZE9ubHkoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJLy8gc2hvdyBvbmUgZGVzY3JpcHRvciBwZXIgdGVhbQotCQkJCQkJLy8KLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQkJVGVhbVJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IG5ldyBUZWFtUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIoCi0JCQkJCQkJCQlkZXNjcmlwdG9ycy5nZXQoaSksIG9iamVjdCwgYWRhcHRlckZhY3RvcnkpOwotCQkJCQkJCWl0ZW1Qcm92aWRlci5yZWFkT25seSA9IHJlYWRPbmx5OwotCQkJCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIGxpc3QuZ2V0KGkpOwotCQkJCQkJCQotLy8JCQkJCQkJLy8gYWRkIHRlYW0gdG8gdGhlIHRlYW0gbGlzdCBvbmx5IGlmIHRoZSB0ZWFtIGlzIHVuZGVyIHRoaXMgYWN0aXZpdHkKLS8vCQkJCQkJCS8vCi0vLwkJCQkJCQlpZih2YWxpZFRlYW1Qcm9maWxlcy5jb250YWlucyh0ZWFtKSkgewotLy8JCQkJCQkJCWFkZFRlYW1Qcm9maWxlcyhvYmplY3QsIHRlYW1Qcm9maWxlcywgdGVhbSk7Ci0vLwkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJaXRlbVByb3ZpZGVyLnRlYW0gPSB0ZWFtOwotCQkJCQkJCXJvbGxlZFVwV3JhcHBlcnMuYWRkKGl0ZW1Qcm92aWRlcik7Ci0JCQkJCQkJcm9sZURlc2NyaXB0b3JzLmFkZChpdGVtUHJvdmlkZXIpOwotCQkJCQkJCXJvbGVUZWFtUGFpcnMuYWRkKG5ldyBSb2xlVGVhbVBhaXIoKFJvbGUpIGdldE9iamVjdChkZXNjKSwgdGVhbSkpOwotCQkJCQkJfQkJCQkJCQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJUm9sZSByb2xlID0gKFJvbGUpIGdldE9iamVjdChkZXNjKTsKLQkJCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIChzaXplID09IDEgPyBsaXN0LmdldCgwKSA6IG51bGwpOwotCQkJCQkJaWYocm9sZSA9PSBudWxsKSB7Ci0JCQkJCQkJaWYoIXJvbGVEZXNjcmlwdG9yc1dpdGhvdXRMaW5rZWRFbGVtZW50cy5jb250YWlucyhlKSkgewotCQkJCQkJCQlyb2xlRGVzY3JpcHRvcnMuYWRkKGNoaWxkKTsKLQkJCQkJCQkJCi0vLwkJCQkJCQkJLy8gYWRkIHRlYW0gdG8gdGhlIHRlYW0gbGlzdCBvbmx5IGlmIHRoZSB0ZWFtIGlzIHVuZGVyIHRoaXMgYWN0aXZpdHkKLS8vCQkJCQkJCQkvLwotLy8JCQkJCQkJCWlmKHRlYW0gIT0gbnVsbCAmJiB2YWxpZFRlYW1Qcm9maWxlcy5jb250YWlucyh0ZWFtKSkgewotLy8JCQkJCQkJCQlhZGRUZWFtUHJvZmlsZXMob2JqZWN0LCB0ZWFtUHJvZmlsZXMsIHRlYW0pOwotLy8JCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJCXJvbGVEZXNjcmlwdG9yc1dpdGhvdXRMaW5rZWRFbGVtZW50cy5hZGQoZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJUm9sZVRlYW1QYWlyIHJvbGVUZWFtUGFpciA9IG5ldyBSb2xlVGVhbVBhaXIocm9sZSwgdGVhbSk7Ci0JCQkJCQkJaWYoIXJvbGVUZWFtUGFpcnMuY29udGFpbnMocm9sZVRlYW1QYWlyKSkgewotCQkJCQkJCQlyb2xlRGVzY3JpcHRvcnMuYWRkKGNoaWxkKTsKLQkJCQkJCQkJCi0vLwkJCQkJCQkJLy8gYWRkIHRlYW0gdG8gdGhlIHRlYW0gbGlzdCBvbmx5IGlmIHRoZSB0ZWFtIGlzIHVuZGVyIHRoaXMgYWN0aXZpdHkKLS8vCQkJCQkJCQkvLwotLy8JCQkJCQkJCWlmKHRlYW0gIT0gbnVsbCAmJiB2YWxpZFRlYW1Qcm9maWxlcy5jb250YWlucyh0ZWFtKSkgewotLy8JCQkJCQkJCQlhZGRUZWFtUHJvZmlsZXMob2JqZWN0LCB0ZWFtUHJvZmlsZXMsIHRlYW0pOwotLy8JCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJCXJvbGVUZWFtUGFpcnMuYWRkKHJvbGVUZWFtUGFpcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcm9sZVRlYW1QYWlycy5jbGVhcigpOwotCQkJcm9sZVRlYW1QYWlycyA9IG51bGw7Ci0JCQlDb2xsZWN0aW9ucy5zb3J0KHRlYW1Qcm9maWxlcywgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCQlDb2xsZWN0aW9ucy5zb3J0KHJvbGVEZXNjcmlwdG9ycywgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QodGVhbVByb2ZpbGVzKTsKLQkJCWNoaWxkcmVuLmFkZEFsbChyb2xlRGVzY3JpcHRvcnMpOwotCQkJCi0JCQl1cGRhdGVDYWNoZWRDaGlsZHJlbihjaGlsZHJlbik7Ci0JCQkKLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfQotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJdXBkYXRlQ2FjaGVkQ2hpbGRyZW4oY2hpbGRyZW4pOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0T0JTRWNsYXNzZXMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFRlYW1Qcm9maWxlcyhPYmplY3Qgb3duZXIsIENvbGxlY3Rpb24gdGVhbVByb2ZpbGVzLCBUZWFtUHJvZmlsZSB0ZWFtUHJvZmlsZSkgewotCQlpZiAoIVRuZ1V0aWwuY2hlY2tFeGlzdCh0ZWFtUHJvZmlsZXMsIHRlYW1Qcm9maWxlKSkgewotCQkJVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSBuZXcgVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyKAotCQkJCQl0ZWFtUHJvZmlsZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJCQkKLS8vCQkJCQkvLyBkb24ndCBzaG93IHJvbGUgZGVzY3JpcHRvcnMKLS8vCQkJCQkvLwotLy8JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJCQlPYmplY3QgY2hpbGQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0vLwkJCQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLS8vCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9CQotCQkJCQkKLQkJCQkJcmV0dXJuIGNoaWxkcmVuOwotCQkJCX0KLQkJCQkKLQkJCX07Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdCh0ZWFtUHJvZmlsZSwKLQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJd3JhcHBlci5yZWFkT25seSA9IChnZXRUb3BJdGVtKCkgIT0gYWRhcHRlci5nZXRUb3BJdGVtKCkpOwotCQkJdGVhbVByb2ZpbGVzLmFkZCh3cmFwcGVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFRlYW1Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCQlSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgewotCQkKLQkJCi0JCXB1YmxpYyBUZWFtUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIoT2JqZWN0IHZhbHVlLCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gdmFsdWUKLQkJICogQHBhcmFtIG93bmVyCi0JCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCQkgKi8KLQkJcHVibGljIFRlYW1Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcihSb2xlRGVzY3JpcHRvciB2YWx1ZSwKLQkJCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCXJlYWRPbmx5ID0gZmFsc2U7Ci0JCX0KLQotCQlwcml2YXRlIFRlYW1Qcm9maWxlIHRlYW07Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TICYmIHRlYW0gIT0gbnVsbCkgewotCQkJCXJldHVybiBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUodGVhbSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyI2NyZWF0ZVdyYXBwZXIoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSkKLQkJICovCi0JCXByb3RlY3RlZCBJV3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwKLQkJCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBzdXBlcgotCQkJCQkuY3JlYXRlV3JhcHBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCXdyYXBwZXIucmVhZE9ubHkgPSByZWFkT25seTsKLQkJCXJldHVybiB3cmFwcGVyOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUm9sZVRlYW1QYWlyIHsKLQkJcHJpdmF0ZSBSb2xlIHJvbGU7Ci0JCXByaXZhdGUgVGVhbVByb2ZpbGUgdGVhbTsKLQotCQlSb2xlVGVhbVBhaXIoUm9sZSByb2xlLCBUZWFtUHJvZmlsZSB0ZWFtKSB7Ci0JCQl0aGlzLnJvbGUgPSByb2xlOwotCQkJdGhpcy50ZWFtID0gdGVhbTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmKG9iaiA9PSB0aGlzKSByZXR1cm4gdHJ1ZTsKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIFJvbGVUZWFtUGFpcikgewotCQkJCVJvbGVUZWFtUGFpciBvdGhlciA9IChSb2xlVGVhbVBhaXIpIG9iajsKLQkJCQlyZXR1cm4gcm9sZSA9PSBvdGhlci5yb2xlICYmICh0ZWFtID09IG90aGVyLnRlYW0gfHwgKHRlYW0gPT0gbnVsbCAmJiBvdGhlci50ZWFtID09IG51bGwpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCVN0cmluZyBzdHIgPSByb2xlLmdldEd1aWQoKTsKLQkJCWlmKHRlYW0gIT0gbnVsbCkgewotCQkJCXN0ciA9IHN0ciArIHRlYW0uZ2V0R3VpZCgpOwotCQkJfQotCQkJcmV0dXJuIHN0ci5oYXNoQ29kZSgpOwkJCQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdSb2xsdXBOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlpZihUbmdVdGlsLnVud3JhcChvYmplY3QpIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc1dyYXBwaW5nUm9sbHVwTmVlZGVkKG9iamVjdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVSb2xsdXBXcmFwcGVyKE9iamVjdCBvYmplY3QsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJT2JqZWN0IHdyYXBwZXIgPSBzdXBlci5jcmVhdGVSb2xsdXBXcmFwcGVyKG9iamVjdCwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJcmV0dXJuIG5ldyBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIod3JhcHBlciwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjk0MDBkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFjdGl2aXR5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IE9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVQaGFzZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBoYXNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRlYW1Qcm9maWxlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFRlYW1Qcm9maWxlSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmNyZWF0ZVRlYW1Qcm9maWxlQWRhcHRlcigpKTsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRlYW1Qcm9maWxlQWRhcHRlcigpCi0JLy8gKi8KLQkvLyBwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wb3NpdGVSb2xlQWRhcHRlcigpIHsKLQkvLyByZXR1cm4gbmV3IE9CU0NvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlUGhhc2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IE9CU01pbGVzdG9uZUl0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzQWRhcHRlcigpCi0JICovCi0JLy8gcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JLy8gcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCS8vIH0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBPQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL09CU01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MWFhMWZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL09CU01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIHsKLQotCS8vIHByaXZhdGUgQ29sbGVjdGlvbiBlQ2xhc3NlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIE9CU01pbGVzdG9uZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCS8vICovCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCS8vIHJldHVybiBUbmdVdGlsLmdldEFsbENoaWxkcmVuKChQcm9jZXNzQ29udHJpYnV0aW9uKSBvYmplY3QsCi0JLy8gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSwKLQkvLyBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSkpOwotCS8vIH0KLQkvLyAgICAKLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCS8vICovCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCS8vIENvbGxlY3Rpb24gZWxlbWVudHMgPSBzdXBlci5nZXRFbGVtZW50cyhvYmplY3QpOwotCS8vIHJldHVybiBlbGVtZW50czsKLQkvLyB9Ci0KLQkvLyBwdWJsaWMgTGlzdCBnZXRGaWx0ZXJlZEJyZWFrZG93bkVsZW1lbnRzKE9iamVjdCBhY3Rpdml0eSwgT2JqZWN0IG9iaikKLQkvLyB7Ci0JLy8gTGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gKChBY3Rpdml0eSlhY3Rpdml0eSkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ID0gYnJlYWtkb3duRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkvLyB7Ci0JLy8gT2JqZWN0IGVsZW1lbnRPYmogPSBpdC5uZXh0KCk7Ci0JLy8gaWYgKChlbGVtZW50T2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHx8IChlbGVtZW50T2JqIGluc3RhbmNlb2YKLQkvLyBUZWFtUHJvZmlsZSkgfHwgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB8fCAoZWxlbWVudE9iagotCS8vIGluc3RhbmNlb2YgTWlsZXN0b25lKSB8fCAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSkKLQkvLyB7Ci0JLy8gZWxlbWVudHMuYWRkKGVsZW1lbnRPYmopOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGVsZW1lbnRzOwotCS8vIH0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0T0JTRWNsYXNzZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL09CU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL09CU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzMzMWU1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9CU1Byb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBPQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0KLQlwdWJsaWMgT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmRlbGVnYXRlSXRlbVByb3ZpZGVyID0gZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkFjdGl2aXR5SXRlbVByb3ZpZGVyI2dldFByb3BlcnR5RGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkJCQkJLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDkzNzczZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlBCU0RyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5QQlNEcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciAKLWltcGxlbWVudHMgSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyCi17Ci0KLQlwcml2YXRlIERpc3Bvc2FibGUgcm9sbGVkVXBXcmFwcGVyczsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJLy8gQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvYmplY3Q7Ci0JCS8vIGlmKGhhc0NoaWxkRGVzY3JpcHRvcihhY3QpKSB7Ci0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCS8vIChjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkvLyAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpKTsKLQkJLy8gfQotCQkvLyBlbHNlIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUGhhc2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUl0ZXJhdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQWN0aXZpdHkoKSkpOwotCi0JCS8vIGlmKGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmlzRW1wdHkoKSkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSkpOwotCQkvLyB9Ci0KLQkJLy8gfQotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZU1pbGVzdG9uZSgpKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3QgY2hpbGQpIHsKLQkJY2hpbGQgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0KLQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQl8fCBjaGlsZCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCQkJCXx8IGNoaWxkIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQlyZXR1cm4gc3VwZXIuYWNjZXB0QXNDaGlsZChjaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChyb2xsZWRVcFdyYXBwZXJzICE9IG51bGwpIHsKLQkJCXJvbGxlZFVwV3JhcHBlcnMuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYgKGlzUm9sbGVkVXAoKSkgewotCQkJTWFwIHdvcmtQcm9kdWN0VG9XcmFwcGVyc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZTsKLQkJCQkJTGlzdCBsaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdG9ycyhkZXNjKTsKLQkJCQkJT2JqZWN0IHdyYXBwZXJLZXkgPSBkZXNjLmdldFdvcmtQcm9kdWN0KCkgPT0gbnVsbCA/IChPYmplY3QpZGVzYyA6IGRlc2MuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQkJTGlzdCB3cmFwcGVycyA9IChMaXN0KSB3b3JrUHJvZHVjdFRvV3JhcHBlcnNNYXAuZ2V0KHdyYXBwZXJLZXkpOwotCQkJCQlpZiAobGlzdC5zaXplKCkgPCAxKSB7Ci0JCQkJCQkvLyBjaGVjayBpZiB0aGUgZGVzY3JpcHRvciBhbHJlYWR5IGV4aXN0cyBpbiB0aGUKLQkJCQkJCS8vIHJvbGx1cCBsaXN0Ci0JCQkJCQkvLwotCQkJCQkJaWYod3JhcHBlcnMgPT0gbnVsbCkgewotCQkJCQkJCXdyYXBwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCXdvcmtQcm9kdWN0VG9XcmFwcGVyc01hcC5wdXQod3JhcHBlcktleSwgd3JhcHBlcnMpOwotCQkJCQkJCXdyYXBwZXJzLmFkZChuZXcgQ29tcG9zZWRXUERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKGNoaWxkLCBvYmplY3QsIGFkYXB0ZXJGYWN0b3J5KSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlmb3IgKGludCBpID0gd3JhcHBlcnMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJCQkJKChDb21wb3NlZFdQRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpd3JhcHBlcnMuZ2V0KGkpKS5hZGRXb3JrUHJvZHVjdERlc2NyaXB0b3IoY2hpbGQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlib29sZWFuIGNoZWNrRXhpc3QgPSB0cnVlOwkJCQkJCQkKLQkJCQkJCQlpZih3cmFwcGVycyA9PSBudWxsKSB7Ci0JCQkJCQkJCXdyYXBwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQl3b3JrUHJvZHVjdFRvV3JhcHBlcnNNYXAucHV0KHdyYXBwZXJLZXksIHdyYXBwZXJzKTsKLQkJCQkJCQkJY2hlY2tFeGlzdCA9IGZhbHNlOwotCQkJCQkJCX0KLQkJCQkJCQlpZihjaGVja0V4aXN0KSB7Ci0JCQkJCQkJCS8vIHJlbW92ZSBhbnkgd3JhcHBlciB0aGF0IGlzIG5vdCBvZiB0eXBlIERlbGl2ZXJhYmxlV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGZyb20gdGhlIHdyYXBwZXIgbGlzdAotCQkJCQkJCQkvLwotCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gd3JhcHBlcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJT2JqZWN0IHdyYXBwZXIgPSAoT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCQlpZighKHdyYXBwZXIgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZVdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcikpIHsKLQkJCQkJCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCQotCQkJCQkJCQljaGVja0V4aXN0ID0gd3JhcHBlcnMuc2l6ZSgpID4gMDsKLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJLy8gc2hvdyBvbmUgZGVzY3JpcHRvciBwZXIgZGVsaXZlcmFibGUKLQkJCQkJCQkvLwotCQkJCQkJCWFkZF9kZXNjcmlwdG9yczoKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCU9iamVjdCBkZWxpdmVyYWJsZURlc2NyaXB0b3IgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmKGNoZWNrRXhpc3QpIHsKLQkJCQkJCQkJCWZvciAoaW50IGkgPSB3cmFwcGVycy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCQkJCQkJCURlbGl2ZXJhYmxlV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoRGVsaXZlcmFibGVXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIpIHdyYXBwZXJzLmdldChpKTsKLQkJCQkJCQkJCQlpZih3cmFwcGVyLmRlbGl2ZXJhYmxlRGVzY3JpcHRvciA9PSBkZWxpdmVyYWJsZURlc2NyaXB0b3IpIHsKLQkJCQkJCQkJCQkJd3JhcHBlci5hZGRXb3JrUHJvZHVjdERlc2NyaXB0b3IoY2hpbGQpOwotCQkJCQkJCQkJCQljb250aW51ZSBhZGRfZGVzY3JpcHRvcnM7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJRGVsaXZlcmFibGVXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gbmV3IERlbGl2ZXJhYmxlV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKAotCQkJCQkJCQkJCWRlc2MsIG9iamVjdCwgYWRhcHRlckZhY3RvcnkpOwotCQkJCQkJCQlpdGVtUHJvdmlkZXIuZGVsaXZlcmFibGVEZXNjcmlwdG9yID0gZGVsaXZlcmFibGVEZXNjcmlwdG9yOwotCQkJCQkJCQl3cmFwcGVycy5hZGQoaXRlbVByb3ZpZGVyKTsKLQkJCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCUxpc3Qgcm9sbGVkVXBDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdvcmtQcm9kdWN0VG9XcmFwcGVyc01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlyb2xsZWRVcENoaWxkcmVuLmFkZEFsbCgoQ29sbGVjdGlvbikgaXRlci5uZXh0KCkpOwotCQkJCQotCQkJfQotCQkJTGlzdCByZXN1bHQgPSByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4ocm9sbGVkVXBDaGlsZHJlbiwgdHJ1ZSk7Ci0JCQlpZihyb2xsZWRVcFdyYXBwZXJzID09IG51bGwpIHsKLQkJCQlyb2xsZWRVcFdyYXBwZXJzID0gbmV3IERpc3Bvc2FibGUoKTsKLQkJCX0KLQkJCXJvbGxlZFVwV3JhcHBlcnMuYWRkQWxsKHJlc3VsdCk7Ci0JCQkKLQkJCS8vIGRpc3Bvc2Ugd3JhcHBlcnMgb2Ygc3ViYXJ0aWZhY3QKLQkJCS8vCi0JCQlmb3IoaW50IGkgPSByb2xsZWRVcENoaWxkcmVuLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJSVdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChJV3JhcHBlckl0ZW1Qcm92aWRlcikgcm9sbGVkVXBDaGlsZHJlbi5nZXQoaSk7Ci0JCQkJaWYoIXJvbGxlZFVwV3JhcHBlcnMuY29udGFpbnMod3JhcHBlcikpIHsKLQkJCQkJd3JhcHBlci5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdCwgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCQkKLQkJCXVwZGF0ZUNhY2hlZENoaWxkcmVuKHJlc3VsdCk7Ci0JCQkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCksIGZhbHNlKTsKLQkJCi0JCXVwZGF0ZUNhY2hlZENoaWxkcmVuKGNoaWxkcmVuKTsKLQkJCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9CQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKHJvbGxlZFVwV3JhcHBlcnMgIT0gbnVsbCkgewotCQkJcm9sbGVkVXBXcmFwcGVycy5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjaXNOZXdEZXNjcmlwdG9yKGphdmEudXRpbC5MaXN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTmV3RGVzY3JpcHRvcihMaXN0IGNoaWxkcmVuLCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gcmV0dXJuIHRydWUgdG8gbGV0IG92ZXJyaWRlbiBnZXRDaGlsZHJlbigpIHRvIGhhbmRsZSB0aGUgdW5pcXVlbmVzcyBvZiB0aGUgcm9sbHVwIGxpc3QKLQkJLy8KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY3JlYXRlT3JNb3ZlUGFja2FnZUZvcihqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVPck1vdmVQYWNrYWdlRm9yKExpc3QgbmV3Q2hpbGRyZW4pIHsKLQkJc3VwZXIuY3JlYXRlT3JNb3ZlUGFja2FnZUZvcihuZXdDaGlsZHJlbik7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3Q2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkvLyBhZGQgZGVsaXZlcmFibGUgcGFydHMgdG8gdGhlIGFjdGl2aXR5J3MgcGFja2FnZQotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB3cGQuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgcGFydCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0ZXJhdG9yCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJUHJvY2Vzc1V0aWwuYWRkVG9Db250YWluZXIocGFydCwgdGhpcywgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldE9iamVjdChvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3QoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXJldHVybiAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZGVzY3JpcHRvcikuZ2V0V29ya1Byb2R1Y3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlPYmplY3Qgb3duZXIsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IFBCU0RyYWdBbmREcm9wQ29tbWFuZChkb21haW4sIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywKLQkJCQlvcGVyYXRpb24sIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NyZWF0ZURyb3BDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlQXdhcmVDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwKLQkJCUxpc3QgZHJvcEVsZW1lbnRzKSB7Ci0JCXJldHVybiBuZXcgUEJTRHJvcENvbW1hbmQoKEFjdGl2aXR5KSBvd25lciwgZHJvcEVsZW1lbnRzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNhY2NlcHRBc1JvbGxlZFVwQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc1JvbGxlZFVwQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvciAmJiAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcilvYmopLmdldFN1cGVyQWN0aXZpdGllcygpICE9IG51bGwpIHsKLQkJCXJldHVybiBzdXBlci5hY2NlcHRBc1JvbGxlZFVwQ2hpbGQob2JqKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRQQlNFY2xhc3NlcygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIERlbGl2ZXJhYmxlV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJCUNvbXBvc2VkV1BEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciB7Ci0KLQkJcHJpdmF0ZSBPYmplY3QgZGVsaXZlcmFibGVEZXNjcmlwdG9yOwotCi0JCS8qKgotCQkgKiBAcGFyYW0gdmFsdWUKLQkJICogQHBhcmFtIG93bmVyCi0JCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCQkgKi8KLQkJcHVibGljIERlbGl2ZXJhYmxlV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKAotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB2YWx1ZSwgT2JqZWN0IG93bmVyLAotCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCXJlYWRPbmx5ID0gZmFsc2U7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfREVMSVZFUkFCTEUpIHsKLQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKGRlbGl2ZXJhYmxlRGVzY3JpcHRvcik7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgYm9vbGVhbiB1bndyYXApIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLnJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihjaGlsZHJlbiwgdW53cmFwKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nUm9sbHVwTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoVG5nVXRpbC51bndyYXAob2JqZWN0KSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzV3JhcHBpbmdSb2xsdXBOZWVkZWQob2JqZWN0KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWFiZmQxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFjdGl2aXR5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVBoYXNlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlUGhhc2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaGFzZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFBCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGMxODg4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUEJTTWlsZXN0b25lSXRlbVByb3ZpZGVyIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciB7Ci0KLQkvLyBwcml2YXRlIENvbGxlY3Rpb24gZUNsYXNzZXMgPSBuZXcgSGFzaFNldCgpOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFBCU01pbGVzdG9uZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCS8vICovCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCS8vIHJldHVybiBUbmdVdGlsLmdldEFsbENoaWxkcmVuKChQcm9jZXNzQ29udHJpYnV0aW9uKSBvYmplY3QsCi0JLy8gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSwKLQkvLyBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSkpOwotCS8vIH0KLQkvLyAgICAKLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCS8vICovCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCS8vIENvbGxlY3Rpb24gZWxlbWVudHMgPSBzdXBlci5nZXRFbGVtZW50cyhvYmplY3QpOwotCS8vIHJldHVybiBlbGVtZW50czsKLQkvLyB9Ci0KLQkvLyBwdWJsaWMgTGlzdCBnZXRGaWx0ZXJlZEJyZWFrZG93bkVsZW1lbnRzKE9iamVjdCBhY3Rpdml0eSwgT2JqZWN0IG9iaikKLQkvLyB7Ci0JLy8gTGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gKChBY3Rpdml0eSlhY3Rpdml0eSkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ID0gYnJlYWtkb3duRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkvLyB7Ci0JLy8gT2JqZWN0IGVsZW1lbnRPYmogPSBpdC5uZXh0KCk7Ci0JLy8gaWYgKChlbGVtZW50T2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB8fCAoZWxlbWVudE9iagotCS8vIGluc3RhbmNlb2YgTWlsZXN0b25lKSB8fCAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSkKLQkvLyB7Ci0JLy8gZWxlbWVudHMuYWRkKGVsZW1lbnRPYmopOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGVsZW1lbnRzOwotCS8vIH0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0UEJTRWNsYXNzZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2NmMWIwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBQQlNQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCi0JcHVibGljIFBCU1Byb2Nlc3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5kZWxlZ2F0ZUl0ZW1Qcm92aWRlciA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JCQkJCS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlM2YzYmU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlQcm9jZXNzSXRlbVByb3ZpZGVyIHsKLQotCS8vIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb2Nlc3NMaXN0ZW5lciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkvLyBwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaXRlbVByb3ZpZGVyOwotCS8vIHByaXZhdGUgT2JqZWN0IHJlZnJlc2hPYmo7Ci0JLy8KLQkvLyAvKioKLQkvLyAqCi0JLy8gKi8KLQkvLyBwdWJsaWMgUHJvY2Vzc0xpc3RlbmVyKEl0ZW1Qcm92aWRlckFkYXB0ZXIgaXRlbVByb3ZpZGVyLCBPYmplY3QKLQkvLyByZWZyZXNoT2JqKSB7Ci0JLy8gdGhpcy5pdGVtUHJvdmlkZXIgPSBpdGVtUHJvdmlkZXI7Ci0JLy8gdGhpcy5yZWZyZXNoT2JqID0gcmVmcmVzaE9iajsKLQkvLyB9Ci0JLy8gICAgICAgIAotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCS8vICovCi0JLy8gcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JLy8gc3dpdGNoKG1zZy5nZXRGZWF0dXJlSUQoUHJvY2Vzcy5jbGFzcykpIHsKLQkvLyBjYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fQlJFQUtET1dOX0VMRU1FTlRTOgotCS8vIGl0ZW1Qcm92aWRlci5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG1zZywgcmVmcmVzaE9iaiwKLQkvLyB0cnVlLCBmYWxzZSkpOwotCS8vIHJldHVybjsKLQkvLyB9Ci0JLy8gfQotCS8vIH07Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQcm9jZXNzQ29tcG9uZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX05BTUU6Ci0JCQlQcm9jZXNzQ29tcG9uZW50IHBjID0gKFByb2Nlc3NDb21wb25lbnQpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJaWYgKHBjLmdldFByb2Nlc3MoKSAhPSBudWxsKSB7Ci0JCQkJYm9vbGVhbiBvbGQgPSBwYy5nZXRQcm9jZXNzKCkuZURlbGl2ZXIoKTsKLQkJCQl0cnkgewotCQkJCQlwYy5nZXRQcm9jZXNzKCkuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCQlwYy5nZXRQcm9jZXNzKCkuc2V0TmFtZShwYy5nZXROYW1lKCkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXBjLmdldFByb2Nlc3MoKS5lU2V0RGVsaXZlcihvbGQpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQkJCi0JCS8vIGF2b2lkIHJlZnJlc2hpbmcgdmlld2VycyB3aGVuIG5ldyBwcm9jZXNzIGVsZW1lbnQgb3IgZGlhZ3JhbSBpcyBhZGRlZCB0byB0aGUgcHJvY2VzcyBjb21wb25lbnQKLQkJLy8KLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTX0VMRU1FTlRTOgotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0RJQUdSQU1TOgotCQkJcmV0dXJuOwotCQkJCi0JCX0JCQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCS8vIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KW9iamVjdCkuZ2V0UHJvY2VzcygpOwotCS8vIGlmKHByb2MgIT0gbnVsbCkgewotCS8vIGlmKFRuZ1V0aWwuZ2V0QWRhcHRlcihwcm9jLCBQcm9jZXNzTGlzdGVuZXIuY2xhc3MpID09IG51bGwpIHsKLQkvLyBwcm9jLmVBZGFwdGVycygpLmFkZChuZXcgUHJvY2Vzc0xpc3RlbmVyKHRoaXMsIG9iamVjdCkpOwotCS8vIH0KLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9jLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCS8vIGNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gY2hpbGRyZW47Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JLy8gcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JLy8gfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzQ29tcG9uZW50X3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JLy8gcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkvLyAvLyByZW1vdmUgYWxsIHByb2Nlc3MgbGlzdGVuZXJzIGZyb20gYWxsIHRhcmdldHMKLQkvLyAvLwotCS8vIGlmICh0YXJnZXQgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gdGFyZ2V0LmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkvLyBpZiAodGFyZ2V0cyAhPSBudWxsKQotCS8vIHsKLQkvLyBmb3IgKEl0ZXJhdG9yIGkgPSB0YXJnZXRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0JLy8gewotCS8vIE5vdGlmaWVyIG90aGVyVGFyZ2V0ID0gKE5vdGlmaWVyKWkubmV4dCgpOwotCS8vIG90aGVyVGFyZ2V0LmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vIHN1cGVyLmRpc3Bvc2UoKTsKLQkvLyB9Ci0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDRmMzhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gU2VwIDMwLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNTY2YWEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotCi0KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzIERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0T0JTRWNsYXNzZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1JvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyOTgzODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgewotCQotCXByb3RlY3RlZCBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoT2JqZWN0IHZhbHVlLCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoUm9sZURlc2NyaXB0b3IgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcihSb2xlRGVzY3JpcHRvciB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0luaGVyaXRlZCgpIHsKLQkJaWYoZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiAoKENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpZ2V0VmFsdWUoKSkuaXNJbmhlcml0ZWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNJbmhlcml0ZWQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Sb2xlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Sb2xlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ3NDU5ZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUm9sZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZUl0ZW1Qcm92aWRlciBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUm9sZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUm9sZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXIpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuRGVzY3JpYmFibGVFbGVtZW50SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9UYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDhlYWIxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9UYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzIERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU6Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldFdCU0VjbGFzc2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Rhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MDg0ZmQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Rhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHsJCi0KLQlwcm90ZWN0ZWQgVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKE9iamVjdCB2YWx1ZSwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBUYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoVGFza0Rlc2NyaXB0b3IgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWlmKGdldFZhbHVlKCkgaW5zdGFuY2VvZiBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gKChDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWdldFZhbHVlKCkpLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0luaGVyaXRlZCgpIHsKLQkJaWYoZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiAoKENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpZ2V0VmFsdWUoKSkuaXNJbmhlcml0ZWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNJbmhlcml0ZWQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9UZWFtUHJvZmlsZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjJiNjRlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9UZWFtUHJvZmlsZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkdlbmVyaWNEcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5PQlNEcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZWFtUHJvZmlsZUl0ZW1Qcm92aWRlciBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgewotCi0JLy8gcHJpdmF0ZSBDb2xsZWN0aW9uIGVDbGFzc2VzOwotCS8vIHByaXZhdGUgQ29sbGVjdGlvbiB0ZWFtUm9sZVdyYXBwZXJzOwotCXByaXZhdGUgR2VuZXJpY0Ryb3BDb21tYW5kLkVsZW1lbnRBZGFwdGVyIGRyb3BBZGFwdGVyOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFRlYW1Qcm9maWxlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVGVhbVByb2ZpbGUoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpKTsKLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NyZWF0ZURyb3BDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlQXdhcmVDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwKLQkJCUxpc3QgZHJvcEVsZW1lbnRzKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0Ryb3BDb21tYW5kKChUZWFtUHJvZmlsZSkgb3duZXIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLCBkcm9wRWxlbWVudHMsCi0JCQkJZ2V0RHJvcEFkYXB0ZXIob3duZXIpKTsKLQl9Ci0KLQlwcml2YXRlIEdlbmVyaWNEcm9wQ29tbWFuZC5FbGVtZW50QWRhcHRlciBnZXREcm9wQWRhcHRlcihPYmplY3Qgb3duZXIpIHsKLQkJQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KG93bmVyLCBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXJldHVybiBhZGFwdGVyLmNyZWF0ZURyb3BBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQotCQkvLyBhZGQgdGVhbSByb2xlcwotCQkvLwotCQlJRmlsdGVyIGZpbHRlciA9IFByb2Nlc3NVdGlsLmdldEZpbHRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCWJvb2xlYW4gbnVsbEZpbHRlciA9IGZpbHRlciA9PSBudWxsOwotCQlUZWFtUHJvZmlsZSB0ZWFtUHJvZmlsZSA9IChUZWFtUHJvZmlsZSkgb2JqZWN0OwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0ZWFtUHJvZmlsZS5nZXRUZWFtUm9sZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVJvbGVEZXNjcmlwdG9yIGRlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGRlc2MuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCAmJiAobnVsbEZpbHRlciB8fCBmaWx0ZXIuYWNjZXB0KGRlc2MpKSkgewotCQkJCWNoaWxkcmVuLmFkZChkZXNjKTsKLQkJCX0KLQkJfQotCi0JCS8vIHNldCBwYXJlbnQgZm9yIHRoZSBjaGlsZHJlbidzIGl0ZW0gcHJvdmlkZXJzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUHJvY2Vzc1V0aWwuc2V0UGFyZW50KGl0ZXIubmV4dCgpLCBvYmplY3QsIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpKTsKLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JLy8gcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0ZWFtUm9sZVdyYXBwZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIElXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIGl0ZXIubmV4dCgpOwotCS8vIHdyYXBwZXIuZGlzcG9zZSgpOwotCS8vIH0KLQkvLyB0ZWFtUm9sZVdyYXBwZXJzLmNsZWFyKCk7Ci0JLy8JCQotCS8vIHN1cGVyLmRpc3Bvc2UoKTsKLQkvLyB9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFRlYW1Qcm9maWxlLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTToKLQkJCWludCBldmVudFR5cGUgPSBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCk7Ci0JCQlpZiAoZXZlbnRUeXBlID09IE5vdGlmaWNhdGlvbi5BREQKLQkJCQkJfHwgZXZlbnRUeXBlID09IE5vdGlmaWNhdGlvbi5BRERfTUFOWSkgewotCQkJCUxpc3Qgc3ViVGVhbXMgPSBQcm9jZXNzVXRpbC5nZXRBZmZlY3RlZEVsZW1lbnRzKG5vdGlmaWNhdGlvbiwKLQkJCQkJCW51bGwpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHN1YlRlYW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlUZWFtUHJvZmlsZSBzdWJUZWFtID0gKFRlYW1Qcm9maWxlKSBpdGVyLm5leHQoKTsKLQkJCQkJUHJvY2Vzc1V0aWwuYWRkVG9Db250YWluZXIoc3ViVGVhbSwgdGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fVEVBTV9ST0xFUzoKLQkJCUxpc3QgZWxlbWVudHMgPSBQcm9jZXNzVXRpbC5nZXRBZmZlY3RlZEVsZW1lbnRzKG5vdGlmaWNhdGlvbiwgbnVsbCk7Ci0JCQlldmVudFR5cGUgPSBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCk7Ci0JCQlib29sZWFuIHJlZnJlc2hUZWFtID0gZmFsc2U7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGV2ZW50VHlwZSA9PSBOb3RpZmljYXRpb24uQURECi0JCQkJCQl8fCBldmVudFR5cGUgPT0gTm90aWZpY2F0aW9uLkFERF9NQU5ZKSB7Ci0JCQkJCVByb2Nlc3NVdGlsLmFkZFRvQ29udGFpbmVyKGUsIHRoaXMsIGZhbHNlKTsKLQkJCQl9Ci0JCQkJaWYgKGUuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkgewotCQkJCQlyZWZyZXNoVGVhbSA9IHRydWU7CQkJCQkKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBlLAotCQkJCQkJZmFsc2UsIHRydWUpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChyZWZyZXNoVGVhbSkgewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQl9Ci0KLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQlUZWFtUHJvZmlsZSB0ZWFtUHJvZmlsZSA9IChUZWFtUHJvZmlsZSkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgdGVhbVByb2ZpbGUsCi0JCQkJCWZhbHNlLCB0cnVlKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0ZWFtUHJvZmlsZS5nZXRUZWFtUm9sZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJcm9sZURlc2NyaXB0b3IsIGZhbHNlLCB0cnVlKSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fU1VQUFJFU1NFRDoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0T0JTRWNsYXNzZXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgZmxvYXQsIGludCwgaW50LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlPYmplY3Qgb3duZXIsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IE9CU0RyYWdBbmREcm9wQ29tbWFuZChkb21haW4sIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywKLQkJCQlvcGVyYXRpb24sIGNvbGxlY3Rpb24pCi0JCS8vIHsKLQkJLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQkvLyBDb2xsZWN0aW9uIHdyYXBwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKS5pdGVyYXRvcigpOwotCQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gUm9sZURlc2NyaXB0b3IgZGVzYyA9IChSb2xlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCS8vIHdyYXBwZXJzLmFkZChUbmdVdGlsLmdldFdyYXBwZXIodGVhbVJvbGVXcmFwcGVycywgZGVzYy5nZXRSb2xlKCkpKTsKLQkJLy8gfQotCQkvLyByZXR1cm4gd3JhcHBlcnM7Ci0JCS8vIH0KLQkJLy8gfQotCQk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGRlc2NyaXB0b3JFeGlzdHMoT2JqZWN0IHJvbGUpIHsKLQkJVGVhbVByb2ZpbGUgdGVhbVByb2ZpbGUgPSAoVGVhbVByb2ZpbGUpIGdldFRhcmdldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0ZWFtUHJvZmlsZS5nZXRUZWFtUm9sZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVJvbGVEZXNjcmlwdG9yIGRlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGRlc2MuZ2V0Um9sZSgpID09IHJvbGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBHZW5lcmljRHJvcENvbW1hbmQuRWxlbWVudEFkYXB0ZXIgY3JlYXRlRHJvcEFkYXB0ZXIoKSB7Ci0JCWlmIChkcm9wQWRhcHRlciA9PSBudWxsKSB7Ci0JCQlkcm9wQWRhcHRlciA9IG5ldyBHZW5lcmljRHJvcENvbW1hbmQuRWxlbWVudEFkYXB0ZXIoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBkcm9wRWxlbWVudCkgewotCQkJCQlpZiAoZHJvcEVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlCi0JCQkJCQkJJiYgIWRlc2NyaXB0b3JFeGlzdHMoZHJvcEVsZW1lbnQpCi0JCQkJCS8vICYmIFRuZ1V0aWwuZ2V0V3JhcHBlcih0ZWFtUm9sZVdyYXBwZXJzLCBkcm9wRWxlbWVudCkgPT0KLQkJCQkJLy8gbnVsbAotCQkJCQkpIHsKLQkJCQkJCXJldHVybiBQcm9jZXNzVXRpbAotCQkJCQkJCQkuY3JlYXRlUm9sZURlc2NyaXB0b3IoKFJvbGUpIGRyb3BFbGVtZW50KTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGRyb3BBZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMpIHsKLQkJCXJldHVybiBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoKChUZWFtUHJvZmlsZSkgb2JqZWN0KQotCQkJCQkuZ2V0U3VwZXJUZWFtKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVVwKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlPYmplY3QgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJVG5nVXRpbC5tb3ZlVXAoKEFjdGl2aXR5KSBwYXJlbnQsIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQkJfQotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpKSB7Ci0JCQlUZWFtUHJvZmlsZSB0ZWFtID0gKChUZWFtUHJvZmlsZSkgcGFyZW50KTsKLQkJCUxpc3QgbGlzdCA9IHRlYW0uZ2V0U3ViVGVhbSgpOwotCQkJaW50IGxvY2F0aW9uID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCWlmIChvYmouZXF1YWxzKGxpc3QuZ2V0KGkpKSkgewotCQkJCQlsb2NhdGlvbiA9IGk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJKChFTGlzdCkgdGVhbS5nZXRTdWJUZWFtKCkpLm1vdmUobG9jYXRpb24sIGxvY2F0aW9uIC0gMSk7Ci0KLQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gdGhpcy5nZXRBY3Rpdml0eShvYmopOwotCQkJVG5nVXRpbC5tb3ZlVXAoYWN0aXZpdHksIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVEb3duKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlPYmplY3QgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJVG5nVXRpbC5tb3ZlRG93bigoQWN0aXZpdHkpIHBhcmVudCwgb2JqLCBnZXRFQ2xhc3NlcygpLCBhY3Rpb25NZ3IpOwotCQl9Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkpIHsKLQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIHBhcmVudDsKLQkJCUxpc3QgbGlzdCA9IHRlYW0uZ2V0U3ViVGVhbSgpOwotCQkJaW50IGxvY2F0aW9uID0gMDsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJaWYgKG9iai5lcXVhbHMobGlzdC5nZXQoaSkpKSB7Ci0JCQkJCWxvY2F0aW9uID0gaTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQkoKEVMaXN0KSB0ZWFtLmdldFN1YlRlYW0oKSkubW92ZShsb2NhdGlvbiwgbG9jYXRpb24gKyAxKTsKLQotCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSB0aGlzLmdldEFjdGl2aXR5KG9iaik7Ci0JCQlUbmdVdGlsLm1vdmVEb3duKGFjdGl2aXR5LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQWN0aXZpdHkgZ2V0QWN0aXZpdHkoT2JqZWN0IG9iamVjdCkgewotCQlmb3IgKE9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQob2JqZWN0KTsgcGFyZW50ICE9IG51bGw7KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpCi0JCQkJcmV0dXJuIChBY3Rpdml0eSkgcGFyZW50OwotCQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdVdGlsCi0JCQkJCS5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCQlwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChwYXJlbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1RlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRkN2I3YmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlcihUZWFtUHJvZmlsZSB2YWx1ZSwgT2JqZWN0IG93bmVyLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyKFRlYW1Qcm9maWxlIHZhbHVlLCBPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMpIHsKLQkJCXJldHVybiBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoKChUZWFtUHJvZmlsZSkgVG5nVXRpbAotCQkJCQkudW53cmFwKG9iamVjdCkpLmdldFN1cGVyVGVhbSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0ZGNhODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5XQlNEcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuV0JTRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4cG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVQaGFzZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlSXRlcmF0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVBY3Rpdml0eSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVGFza0Rlc2NyaXB0b3IoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZU1pbGVzdG9uZSgpKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3QgY2hpbGQpIHsKLQkJY2hpbGQgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCWlmKGNoaWxkIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgY2hpbGQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcgotCQkJCXx8IGNoaWxkIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQlyZXR1cm4gc3VwZXIuYWNjZXB0QXNDaGlsZChjaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldE9iamVjdChvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3QoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRUYXNrKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJT2JqZWN0IG93bmVyLCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sCi0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJFTlRFUjoKLQkJLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQoZG9tYWluLAotCQkvLyBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbikiKTsKLQkJQ29tbWFuZCBjbWQgPSBuZXcgV0JTRHJhZ0FuZERyb3BDb21tYW5kKGRvbWFpbiwgb3duZXIsIGxvY2F0aW9uLAotCQkJCW9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgY2FuIGV4ZWN1dGU6ICIgKyBjbWQuY2FuRXhlY3V0ZSgpKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgb3duZXI6ICIgKyBvd25lcik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGNvbGxlY3Rpb246ICIgKyBjb2xsZWN0aW9uKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgbG9jYXRpb246ICIgKyBsb2NhdGlvbik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIG9wZXJhdGlvbnM6ICIgKyBvcGVyYXRpb25zKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgb3BlcmF0aW9uOiAiICsgb3BlcmF0aW9uKTsKLQkJLy8gICAgICAgIAotCQkvLyBTeXN0ZW0ub3V0Ci0JCS8vIC5wcmludGxuKCJFWElUOgotCQkvLyBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChkb21haW4sCi0JCS8vIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKSIpOwotCQlyZXR1cm4gY21kOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NyZWF0ZURyb3BDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlQXdhcmVDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwKLQkJCUxpc3QgZHJvcEVsZW1lbnRzKSB7Ci0JCXJldHVybiBuZXcgV0JTRHJvcENvbW1hbmQoKEFjdGl2aXR5KSBvd25lciwgZHJvcEVsZW1lbnRzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNhY2NlcHRBc1JvbGxlZFVwQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc1JvbGxlZFVwQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCWlmKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gc3VwZXIuYWNjZXB0QXNSb2xsZWRVcENoaWxkKG9iaik7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkvLyBpbnQpCi0JLy8gKi8KLQkvLyBwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCS8vIEJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KW9iamVjdDsKLQkvLyBTdHJpbmcgcHJvcGVydHkgPSAoU3RyaW5nKSBjb2x1bW5JbmRleFRvTmFtZU1hcC5nZXQobmV3Ci0JLy8gSW50ZWdlcihjb2x1bW5JbmRleCkpOwotCS8vIEJvb2xlYW4gYiA9IG51bGw7Ci0JLy8gaWYocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4pIHsKLQkvLyBiID0gZS5nZXRJc0V2ZW50RHJpdmVuKCk7Ci0JLy8gfQotCS8vIGVsc2UgaWYocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HKSB7Ci0JLy8gYiA9IGUuZ2V0SXNPbmdvaW5nKCk7Ci0JLy8gfQotCS8vIGVsc2UgaWYocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFKSB7Ci0JLy8gYiA9IGUuZ2V0SXNSZXBlYXRhYmxlKCk7Ci0JLy8gfQotCS8vIGlmKGIgIT0gbnVsbCkgewotCS8vIGlmKGIuYm9vbGVhblZhbHVlKCkpIHsKLQkvLyByZXR1cm4gVG5nRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiY2hlY2tlZF9ib3giKTsKLQkvLyB9Ci0JLy8gZWxzZSB7Ci0JLy8gcmV0dXJuIFRuZ0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoInVuY2hlY2tlZF9ib3giKTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBzdXBlci5nZXRDb2x1bW5JbWFnZShvYmplY3QsIGNvbHVtbkluZGV4KTsKLQkvLyB9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldFdCU0VjbGFzc2VzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjcmVmcmVzaENoaWxkcmVuRGF0YShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24sCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWZyZXNoQ2hpbGRyZW5EYXRhKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sCi0JCQlMaXN0IGFmZmVjdGVkQ2hpbGRyZW4pIHsKLQkJLy8gcmVjYWxjdWxhdGUgdGhlIElEcyBvZiBicmVha2Rvd24gZWxlbWVudHMgYW5kIHJlZnJlc2ggdGhlbQotCQkvLwotCQlQcm9jZXNzIHRvcEFjdCA9IChQcm9jZXNzKSBnZXRUb3BJdGVtKCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IHJvb3RBZGFwdGVyRmFjdG9yeSA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCi0JCVByb2Nlc3NVdGlsLnVwZGF0ZUlEcyhyb290QWRhcHRlckZhY3RvcnksIHRvcEFjdCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZG9SZWZyZXNoQWZmZWN0ZWRWaWV3ZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1JlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKSB7Ci0JCU9iamVjdCBwcm9jID0gZ2V0VG9wSXRlbSgpOwotCQlPYmplY3QgaXRlbVByb3ZpZGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQocHJvYywKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJKChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBpdGVtUHJvdmlkZXIpCi0JCQkJCS5zZXRSZWZyZXNoQWxsSURzUmVxdWlyZWQodHJ1ZSk7Ci0JCX0KLQotCQlQcm9jZXNzVXRpbAotCQkJCS5yZWZyZXNoSURzSW5WaWV3ZXJzKChFeHBvc2VkQWRhcHRlckZhY3RvcnkpIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCXVwZGF0ZUNhY2hlZENoaWxkcmVuKGNoaWxkcmVuKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nUm9sbHVwTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoVG5nVXRpbC51bndyYXAob2JqZWN0KSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNXcmFwcGluZ1JvbGx1cE5lZWRlZChvYmplY3QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlUm9sbHVwV3JhcHBlcihPYmplY3Qgb2JqZWN0LCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCU9iamVjdCB3cmFwcGVyID0gc3VwZXIuY3JlYXRlUm9sbHVwV3JhcHBlcihvYmplY3QsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCXJldHVybiBuZXcgVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKHdyYXBwZXIsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGNyZWF0ZUNvbXBvc2VkV3JhcHBlcihPYmplY3Qgb2JqZWN0LCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcihvYmplY3QsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5NZXJnZShTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQlyZXR1cm4gcHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCB8fCBwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUwotCQkJCQl8fCBwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk87Ci0JCQl9Ci0JCX07Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg2NTIzMzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCWltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCi0JcHVibGljIFdCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFjdGl2aXR5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVQaGFzZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBoYXNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVBoYXNlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUykpIHsKLQkJCXNldENvbHVtbkluZGV4VG9OYW1lTWFwKFByb2Nlc3NVdGlsCi0JCQkJCS50b0NvbHVtbkluZGV4VG9OYW1lTWFwKChTdHJpbmcpIGV2ZW50LmdldE5ld1ZhbHVlKCkpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9XQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDlmMDlhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9XQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdCU01pbGVzdG9uZUl0ZW1Qcm92aWRlciBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgewotCi0JLy8gcHJpdmF0ZSBDb2xsZWN0aW9uIGVDbGFzc2VzID0gbmV3IEhhc2hTZXQoKTsKLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU6Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkKLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCS8vICovCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCS8vIHJldHVybiBUbmdVdGlsLmdldEFsbENoaWxkcmVuKChQcm9jZXNzQ29udHJpYnV0aW9uKSBvYmplY3QsCi0JLy8gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSwKLQkvLyBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSkpOwotCS8vIH0KLQkvLyAgICAKLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCS8vICovCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCS8vIENvbGxlY3Rpb24gZWxlbWVudHMgPSBzdXBlci5nZXRFbGVtZW50cyhvYmplY3QpOwotCS8vIHJldHVybiBlbGVtZW50czsKLQkvLyB9Ci0KLQkvLyBwdWJsaWMgTGlzdCBnZXRGaWx0ZXJlZEJyZWFrZG93bkVsZW1lbnRzKE9iamVjdCBhY3Rpdml0eSwgT2JqZWN0IG9iaikKLQkvLyB7Ci0JLy8gTGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gKChBY3Rpdml0eSlhY3Rpdml0eSkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ID0gYnJlYWtkb3duRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkvLyB7Ci0JLy8gT2JqZWN0IGVsZW1lbnRPYmogPSBpdC5uZXh0KCk7Ci0JLy8gaWYgKChlbGVtZW50T2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHx8IChlbGVtZW50T2JqIGluc3RhbmNlb2YKLQkvLyBNaWxlc3RvbmUpIHx8IChlbGVtZW50T2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpKQotCS8vIHsKLQkvLyBlbGVtZW50cy5hZGQoZWxlbWVudE9iaik7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gZWxlbWVudHM7Ci0JLy8gfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRXQlNFY2xhc3NlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MmY1N2RiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzIFdCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQotCXB1YmxpYyBXQlNQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuZGVsZWdhdGVJdGVtUHJvdmlkZXIgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCQkJCQkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dvcmtPcmRlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV29ya09yZGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFkMzkyNzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV29ya09yZGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya09yZGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Xb3JrT3JkZXJJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdvcmtPcmRlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCS8vIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyKQotCS8vICovCi0JLy8gcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCS8vIEVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkvLyByZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuRGVzY3JpYmFibGVFbGVtZW50SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NWFiNzhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzIERlc2NyaXB0b3JJdGVtUHJvdmlkZXIKLWltcGxlbWVudHMgSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyCi17Ci0JcHJvdGVjdGVkIENvbGxlY3Rpb24gY2FjaGVkQ2hpbGRyZW47Ci0JCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgQWN0aXZpdHkgZ2V0QWN0aXZpdHkoT2JqZWN0IG9iamVjdCkgewotCQlmb3IgKE9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQob2JqZWN0KTsgcGFyZW50ICE9IG51bGw7KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpCi0JCQkJcmV0dXJuIChBY3Rpdml0eSkgcGFyZW50OwotCQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQkJcGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBnZXREZXNjcmlwdG9yKEFjdGl2aXR5IGFjdGl2aXR5LCBBcnRpZmFjdCBhcnRpZmFjdCkgewotCQlpZiAoYWN0aXZpdHkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlMaXN0IGxpc3QgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGxpc3QuZ2V0KGkpOwotCQkJaWYgKChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpCi0JCQkJCSYmIChhcnRpZmFjdCA9PSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqKQotCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpKSkgewotCQkJCXJldHVybiBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIGlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpCi0JCS8vIHsKLQkJLy8gY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSk7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVDYWNoZWRDaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0vLwkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotLy8JCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoY2hpbGRyZW4pOwotLy8JCX0KLS8vCQllbHNlIHsKLS8vCQkJY2FjaGVkQ2hpbGRyZW4uY2xlYXIoKTsKLS8vCQkJY2FjaGVkQ2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuKTsKLS8vCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRhaW5lZEFydGlmYWN0RGVzY3JpcHRvcnMoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYywgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlBY3Rpdml0eSBhY3Rpdml0eSA9IFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkod3BEZXNjKTsKLQkJaWYoYWN0aXZpdHkgIT0gbnVsbCkgewotCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpOwotCQkJTGlzdCBsaXN0ID0gYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3QgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IoYWN0aXZpdHksIChBcnRpZmFjdCkgbGlzdAotCQkJCQkJLmdldChpKSk7Ci0JCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQljaGlsZHJlbi5hZGQoZGVzY3JpcHRvcik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmplY3Q7Ci0JCQotCQkvLyBkb24ndCBzaG93IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9uLWRlbGl2ZXJhYmxlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yCi0JCS8vIHRoYXQgaXMgZGVsaXZlcmFibGUgcGFydCBvZiBhIGRlbGl2ZXJhYmxlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yCi0JCS8vCi0JCWlmKCEod3BEZXNjLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkpIHsKLQkJCU9iamVjdCBwYXJlbnQgPSBUbmdVdGlsLnVud3JhcChnZXRQYXJlbnQob2JqZWN0KSk7Ci0JCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkJCQkJJiYgKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpcGFyZW50KS5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsJCQkJCi0JCQkJdXBkYXRlQ2FjaGVkQ2hpbGRyZW4oQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCQl9Ci0JCX0KLQkJCi0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCi0JCS8vIGFkZCBkZWxpdmVyYWJsZSBwYXJ0cwotCQkvLwotCQlpZighd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJLmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChkZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGRlc2MpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gZ2V0IGRlc2NyaXB0b3JzIG9mIGNvbnRhaW5lZCBhcnRpZmFjdHMKLQkJLy8JCQotCQlpZiAod3BEZXNjLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJYWRkQ29udGFpbmVkQXJ0aWZhY3REZXNjcmlwdG9ycyh3cERlc2MsIGNoaWxkcmVuKTsKLQkJfQotCi0JCS8vIHNldCBwYXJlbnQKLQkJLy8KLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYUZhY3RvcnkuYWRhcHQoaXRlcgotCQkJCQkubmV4dCgpLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJYWRhcHRlci5zZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCQkKLQkJdXBkYXRlQ2FjaGVkQ2hpbGRyZW4oY2hpbGRyZW4pOwotCQkKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGNoaWxkcmVuIGZyb20gY2FjaGUsIGZpbGwgdGhlIGNoaWxkcmVuIGNhY2hlIGlmIGl0IGlzIG5vdCBpbml0aWFsaXplZCB5ZXQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQ2FjaGUoKSB7Ci0JCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCWdldENoaWxkcmVuKHRhcmdldCk7Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlciNnZXRSb2xsdXBDaGlsZHJlbkZyb21DYWNoZSgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihjYWNoZWRDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQljYWNoZWRDaGlsZHJlbi5jbGVhcigpOwotCQkJY2FjaGVkQ2hpbGRyZW4gPSBudWxsOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MpKSB7Ci0vLwkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVRfVE86Ci0vLwkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVF9UTzoKLS8vCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUX1RPOgotLy8JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1VUUFVUX0ZST006Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEU6Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFM6Ci0JCQlMaXN0IGVsZW1lbnRzID0gUHJvY2Vzc1V0aWwuZ2V0QWZmZWN0ZWRFbGVtZW50cyhub3RpZmljYXRpb24sIG51bGwpOwotCQkJaW50IGV2ZW50VHlwZSA9IG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKTsKLQkJCWJvb2xlYW4gcmVmcmVzaCA9IGZhbHNlOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChldmVudFR5cGUgPT0gTm90aWZpY2F0aW9uLkFERAotCQkJCQkJfHwgZXZlbnRUeXBlID09IE5vdGlmaWNhdGlvbi5BRERfTUFOWSkgewotCQkJCQlQcm9jZXNzVXRpbC5hZGRUb0NvbnRhaW5lcihlLCB0aGlzLCBmYWxzZSk7Ci0JCQkJfQotCQkJCWlmIChlLmdldFN1cGVyQWN0aXZpdGllcygpICE9IG51bGwpIHsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIGUsCi0JCQkJCQkJZmFsc2UsIHRydWUpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZWZyZXNoID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChyZWZyZXNoKSB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCQlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCX0KLQotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpOwotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIHdwZCwgZmFsc2UsCi0JCQkJCXRydWUpKTsKLQkJCWlmICh3cGQuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BkLmdldERlbGl2ZXJhYmxlUGFydHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZGVzY3JpcHRvciA9IGl0ZXIubmV4dCgpOwotCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCQlkZXNjcmlwdG9yLCBmYWxzZSwgdHJ1ZSkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19TVVBQUkVTU0VEOgotCQkJT2JqZWN0IG5vdGlmaWVyID0gbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQlXb3JrUHJvZHVjdCB3cDsKLQkJCWJvb2xlYW4gY29udGVudFJlZnJlc2ggPSBub3RpZmllciBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCQkJCSYmICgod3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcilub3RpZmllcikuZ2V0V29ya1Byb2R1Y3QoKSkgaW5zdGFuY2VvZiBBcnRpZmFjdAotCQkJCQkJfHwgd3AgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSk7Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBjb250ZW50UmVmcmVzaCwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcCwgU3RyaW5nIHR4dCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqZWN0OwotCi0JCWlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfRU5UUllfU1RBVEUpIHsKLQkJCXdwZC5zZXRBY3Rpdml0eUVudHJ5U3RhdGUodHh0KTsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfRVhJVF9TVEFURSkgewotCQkJd3BkLnNldEFjdGl2aXR5RXhpdFN0YXRlKHR4dCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5zZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wLCB0eHQpOwotCQl9Ci0JfQotCi0JLy8gcHJpdmF0ZSBib29sZWFuIGlzVG9wTGV2ZWxBcnRpZmFjdEluQWN0aXZpdHkoQWN0aXZpdHkgYWN0aXZpdHksIE9iamVjdAotCS8vIG9iaikKLQkvLyB7Ci0JLy8gQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0JLy8gICAgICAgIAotCS8vIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKQotCS8vIGFGYWN0b3J5LmFkYXB0KGFjdGl2aXR5LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCS8vIENvbGxlY3Rpb24gY2hpbGRyZW4gPSBhZGFwdGVyLmdldENoaWxkcmVuKGFjdGl2aXR5KTsKLQkvLyBpZiAoY2hpbGRyZW4uY29udGFpbnMob2JqKSkKLQkvLyB7Ci0JLy8gLy9TeXN0ZW0ub3V0LnByaW50bG4oImNoaWxkIC0gIiArIG9iaik7Ci0JLy8gcmV0dXJuIHRydWU7Ci0JLy8gfQotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldFBCU0VjbGFzc2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVVwKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlPYmplY3QgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJVG5nVXRpbC5tb3ZlVXAoKEFjdGl2aXR5KSBwYXJlbnQsIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQkJfQotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSkgewotCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgcGFyZW50KS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJaWYgKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgd3A7Ci0JCQkJTGlzdCBsaXN0ID0gYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0JCQkJV29ya1Byb2R1Y3Qgb2JqV1AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqKQotCQkJCQkJLmdldFdvcmtQcm9kdWN0KCk7Ci0KLQkJCQlpbnQgbG9jYXRpb24gPSAwOwotCQkJCS8vIExpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJaWYgKG9ialdQLmVxdWFscyhsaXN0LmdldChpKSkpIHsKLQkJCQkJCWxvY2F0aW9uID0gaTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJKChFTGlzdCkgYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkpLm1vdmUobG9jYXRpb24sCi0JCQkJCQlsb2NhdGlvbiAtIDEpOwotCQkJfQotCi0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IHRoaXMuZ2V0QWN0aXZpdHkob2JqKTsKLQkJCVRuZ1V0aWwubW92ZVVwKGFjdGl2aXR5LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlRG93bihPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCVRuZ1V0aWwubW92ZURvd24oKEFjdGl2aXR5KSBwYXJlbnQsIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQkJfQotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSkgewotCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgcGFyZW50KS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJaWYgKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgd3A7Ci0JCQkJTGlzdCBsaXN0ID0gYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0JCQkJV29ya1Byb2R1Y3Qgb2JqV1AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqKQotCQkJCQkJLmdldFdvcmtQcm9kdWN0KCk7Ci0KLQkJCQlpbnQgbG9jYXRpb24gPSAwOwotCQkJCS8vIExpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJaWYgKG9ialdQLmVxdWFscyhsaXN0LmdldChpKSkpIHsKLQkJCQkJCWxvY2F0aW9uID0gaTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJKChFTGlzdCkgYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkpLm1vdmUobG9jYXRpb24sCi0JCQkJCQlsb2NhdGlvbiArIDEpOwotCQkJfQotCi0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IHRoaXMuZ2V0QWN0aXZpdHkob2JqKTsKLQkJCVRuZ1V0aWwubW92ZURvd24oYWN0aXZpdHksIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2NyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZmFjdG9yUmVtb3ZlQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGZhY3RvclJlbW92ZUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIENvbW1hbmRQYXJhbWV0ZXIgY29tbWFuZFBhcmFtZXRlcikgewotCQlpZighKGNvbW1hbmRQYXJhbWV0ZXIuZ2V0T3duZXIoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJQWN0aXZpdHkgYWN0ID0gZ2V0QWN0aXZpdHkodGFyZ2V0KTsKLQkJCWlmKGFjdCAhPSBudWxsKSB7Ci0JCQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYWN0LCBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCQkJY29tbWFuZFBhcmFtZXRlci5zZXRPd25lcihhY3QpOwotCQkJCXJldHVybiBhZGFwdGVyLmNyZWF0ZUNvbW1hbmQoYWN0LCBkb21haW4sIFJlbW92ZUNvbW1hbmQuY2xhc3MsIGNvbW1hbmRQYXJhbWV0ZXIpOwkJCQkKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZmFjdG9yUmVtb3ZlQ29tbWFuZChkb21haW4sIGNvbW1hbmRQYXJhbWV0ZXIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJLy8gRVBGIGJ1ZyM6IDE0NDgyMCBTb21lIG5lc3RlZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgc2hvdyB3cm9uZyBtb2RlbCBpbmZvIGluIHdvcmsgcHJvZHVjdCB1c2FnZSB2aWV3Ci0JCS8vIGZvciBkZWZlY3QsIG92ZXJyaWRlIHRoZSBtZXRob2QsIHByZXZpb3VzbHkgRGVzY3JpcHRvckl0ZW1Qcm92aWRlLmdldEF0dHJpYnV0ZSB1c2UgdG8gaGF2ZSB0aGlzIGNvZGUsIG1vdmVkIHRvIGhlcmUuIAotCQlpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPKSB7Ci0JCQlTdHJpbmdCdWZmZXIgbW9kZWxJbmZvID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLS8vCQkJCQlQcm9jZXNzVXRpbC5nZXRNb2RlbEluZm9Gb3JXb3JrUHJvZHVjdERlc2NyaXB0b3IobW9kZWxJbmZvLAotLy8JCQkJCQkJKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqZWN0KTsKLQkJCQkJUHJvY2Vzc1V0aWwuZ2V0V1BETW9kZWxJbmZvKG1vZGVsSW5mbywgb2JqZWN0LCB0aGlzKTsKLQkJCQl9Ci0vLwkJCX0KLQkJCXJldHVybiBtb2RlbEluZm8udG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUxMTAzZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgewotCQotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKE9iamVjdCB2YWx1ZSwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcihXb3JrUHJvZHVjdERlc2NyaXB0b3IgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgdmFsdWUsIE9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlBZGRDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5QWRkQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5Y2MwNjJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlBZGRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXNzZW5nZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbi5UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci0KLS8qKgotICogQWRkQ29tbWFuZCBmb3IgYWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBTZXAgMTYsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqIEBzZWUgCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUFkZENvbW1hbmQgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEFkZENvbW1hbmQgewotCXByaXZhdGUgTGlzdCBwcm9jUGFja2FnZXM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUFkZENvbW1hbmQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXN1cGVyKGNvbW1hbmQpOwotCX0KLQotCXByaXZhdGUgTWFwIGdldENvcHlUb09yaWdpbmFsTWFwKCkgewotCQlFZGl0aW5nRG9tYWluIGVkID0gYWRkQ29tbWFuZC5nZXREb21haW4oKTsKLQkJaWYgKGVkIGluc3RhbmNlb2YgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQlyZXR1cm4gKChUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGVkKQotCQkJCQkuZ2V0Q29weVRvT3JpZ2luYWxNYXAoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29weVByb2Nlc3NQYWNrYWdlcygpIHsKLQkJaWYgKHByb2NQYWNrYWdlcyA9PSBudWxsKSB7Ci0JCQlNYXAgY29weVRvT3JpZ2luYWxNYXAgPSBnZXRDb3B5VG9PcmlnaW5hbE1hcCgpOwotCQkJaWYgKGNvcHlUb09yaWdpbmFsTWFwICE9IG51bGwpIHsKLQkJCQlib29sZWFuIHNob3dXYXJuaW5nID0gZmFsc2U7Ci0JCQkJcHJvY1BhY2thZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQkJLy8gY2hlY2sgZmlyc3QgZWxlbWVudCBvZiBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKQotCQkJCS8vIGlmIGl0J3MgYSBrZXkgaW4gdGhlIENvcHlUb09yaWdpbmFsTWFwLCB3ZSBhcmUgcGFzdGluZyBhbmQKLQkJCQkvLyBtYXkgbmVlZCB0byB3YXJuIHRoZSB1c2VyCi0JCQkJLy8gaWYgaXQncyBub3QgYSBrZXkgaW4gdGhlIENvcHlUb09yaWdpbmFsTWFwLCB0aGVuIHdlIGFyZQotCQkJCS8vIHByb2JhYmx5IGFkZGluZyBhIG5ldyBlbGVtZW50Ci0JCQkJaWYgKGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpICE9IG51bGwKLQkJCQkJCSYmIGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLnNpemUoKSA+IDAKLQkJCQkJCSYmIGNvcHlUb09yaWdpbmFsTWFwLmNvbnRhaW5zS2V5KGFkZENvbW1hbmQKLQkJCQkJCQkJLmdldENvbGxlY3Rpb24oKS50b0FycmF5KClbMF0pKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQlBY3Rpdml0eSBvcmlnID0gKEFjdGl2aXR5KSBjb3B5VG9PcmlnaW5hbE1hcAotCQkJCQkJCQkJLmdldChlbGVtZW50KTsKLQkJCQkJCQlpZiAob3JpZyAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmIChvcmlnLmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlwcm9jUGFja2FnZXMuYWRkKG9yaWcuZUNvbnRhaW5lcigpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXNob3dXYXJuaW5nID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoc2hvd1dhcm5pbmcpIHsKLQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFCi0JCQkJCQkJLnNob3dXYXJuaW5nKAotCQkJCQkJCQkJZ2V0TGFiZWwoKSwKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLkFjdGl2aXR5QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2cpOwotCQkJCX0KLQotCQkJCWlmICghcHJvY1BhY2thZ2VzLmlzRW1wdHkoKSkgewotCQkJCQkvLyBjb3B5IHRoZSBQcm9jZXNzUGFja2FnZSBvZiB0aGUgb3JpZ2luYWwgQWN0aXZpdHkgdG8gYWRkCi0JCQkJCS8vIGl0IHRvIHRoZSBQcm9jZXNzUGFja2FnZQotCQkJCQkvLyBvZiB0aGUgdGFyZ2V0IEFjdGl2aXR5LgotCQkJCQkvLwotCQkJCQkvLyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IG5ldwotCQkJCQkvLyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCQkJCQkvLyAsIG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJCQkJQ29tbWFuZCBjb21tYW5kID0gQ29weUNvbW1hbmQuY3JlYXRlKAotCQkJCQkJCWFkZENvbW1hbmQuZ2V0RG9tYWluKCksIHByb2NQYWNrYWdlcyk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljb21tYW5kLmV4ZWN1dGUoKTsKLQotCQkJCQkJLy8gUmVmcmVzaCB0aGUgQWRkQ29tbWFuZC5jb2xsZWN0aW9uIHdpdGggbmV3IGNvcGllcy4KLQkJCQkJCS8vCi0JCQkJCQlDb2xsZWN0aW9uIGFjdGl2aXRpZXMgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKTsKLQkJCQkJCWFjdGl2aXRpZXMuY2xlYXIoKTsKLQotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29tbWFuZC5nZXRSZXN1bHQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJUHJvY2Vzc1BhY2thZ2UgY29weSA9IChQcm9jZXNzUGFja2FnZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGNvcHkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQkJCUFjdGl2aXR5IGFjdENvcHkgPSAoKFByb2Nlc3NDb21wb25lbnQpIGNvcHkpCi0JCQkJCQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCQkJCQkJLy8gY29weSBkYXRhIGZyb20gUHJvY2Vzc0NvbXBvbmVudCB0byBhIG5ldwotCQkJCQkJCQkvLyBQcm9jZXNzUGFja2FnZQotCQkJCQkJCQlQcm9jZXNzUGFja2FnZSBwa2dDb3B5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJCQkJCQkJcGtnQ29weS5zZXROYW1lKGFjdENvcHkuZ2V0TmFtZSgpKTsKLQkJCQkJCQkJcGtnQ29weS5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoYWN0Q29weSk7Ci0JCQkJCQkJCXBrZ0NvcHkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKAotCQkJCQkJCQkJCWNvcHkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkpOwotCQkJCQkJCQlwa2dDb3B5LmdldERpYWdyYW1zKCkKLQkJCQkJCQkJCQkuYWRkQWxsKGNvcHkuZ2V0RGlhZ3JhbXMoKSk7Ci0JCQkJCQkJCXBrZ0NvcHkuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZEFsbCgKLQkJCQkJCQkJCQljb3B5LmdldENoaWxkUGFja2FnZXMoKSk7Ci0KLQkJCQkJCQkJYWN0aXZpdGllcy5hZGQoYWN0Q29weSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJZmluZF9hY3Rpdml0eTogZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvcHkKLQkJCQkJCQkJCQkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJCQkJYWN0aXZpdGllcy5hZGQoKEFjdGl2aXR5KSBlbGVtZW50KTsKLQkJCQkJCQkJCQlicmVhayBmaW5kX2FjdGl2aXR5OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotCQkJCQkJCWNvbW1hbmQuZGlzcG9zZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXByZXBhcmVBZGRMaXN0KCk7Ci0JCWNvcHlQcm9jZXNzUGFja2FnZXMoKTsKLQkJc3VwZXIuZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBlIGlzIGEgY2hpbGQsIGRpcmVjdCBvciBvZiBhY3QKLQkgKiAKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NoaWxkT2YoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGUpIHsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZSA9PSBjaGlsZCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKGlzQ2hpbGRPZihjaGlsZCwgZSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCS8vIFdvcmtQcm9kdWN0IHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpcGFyZW50KS5nZXRXb3JrUHJvZHVjdCgpOwotCQkvLyBpZih3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCS8vIGlmKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJLy8gaWYoVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKWUpLmdldFdvcmtQcm9kdWN0KCksCi0JCS8vIHdwKSkgewotCQkvLyByZXR1cm4gdHJ1ZTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NoaWxkT2YoQ29sbGVjdGlvbiBlbGVtZW50cywgT2JqZWN0IGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoaXNDaGlsZE9mKGl0ZXIubmV4dCgpLCBlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJlcGFyZUFkZExpc3QoKSB7Ci0JCS8vIGNsZWFudXAgZWxlbWVudCBsaXN0IGJlZm9yZSBhZGRpbmcgaXQgdG8gdGhlIGFjdGl2aXR5IHRvIGF2b2lkIGFkZGluZwotCQkvLyBlbGVtZW50cyBtdWx0aXBsZSB0aW1lcwotCQkvLwotCQlNYXAgY29weVRvT3JpZ2luYWxNYXAgPSBnZXRDb3B5VG9PcmlnaW5hbE1hcCgpOwotCQlpZiAoY29weVRvT3JpZ2luYWxNYXAgIT0gbnVsbCkgewotCQkJQXJyYXlMaXN0IG9yaWdpbmFscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCU1hcCBvcmlnaW5hbFRvQ29weU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3Qgb3JpZ2luYWwgPSBjb3B5VG9PcmlnaW5hbE1hcC5nZXQoZWxlbWVudCk7Ci0JCQkJaWYgKG9yaWdpbmFsICE9IG51bGwpIHsKLQkJCQkJb3JpZ2luYWxzLmFkZChvcmlnaW5hbCk7Ci0JCQkJCW9yaWdpbmFsVG9Db3B5TWFwLnB1dChvcmlnaW5hbCwgZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCi0JCQlBcnJheUxpc3QgcmVtb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCS8vIEFycmF5TGlzdCBhZGRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb3JpZ2luYWxzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGlzQ2hpbGRPZihvcmlnaW5hbHMsIGVsZW1lbnQpKSB7Ci0JCQkJCXJlbW92ZUxpc3QuYWRkKG9yaWdpbmFsVG9Db3B5TWFwLmdldChlbGVtZW50KSk7Ci0JCQkJfQotCQkJfQotCQkJYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkucmVtb3ZlQWxsKHJlbW92ZUxpc3QpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eURlZXBDb3B5Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eURlZXBDb3B5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNDI5ZTg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Jbml0aWFsaXplQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uc3RyYWludE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVRleHRSZWZlcmVuY2VSZXBsYWNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFBoeXNpY2FsbHkgY29waWVzIGFuIGFjdGl2aXR5IHdpdGggYWxsIG9mIGl0cyBkaXJlY3Qgb3IgaW5oZXJpdGVkIHN0cnVjdHVyYWwgZmVhdHVyZXMgYW5kIHJlZmVyZW5jZXMuCi0gKiAgIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdW4gMjEsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURlZXBDb3B5Q29tbWFuZCBleHRlbmRzIENvcHlDb21tYW5kIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMgPSB7Ci0JCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQl9OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIGRpYWdyYW1UeXBlcyA9IHsKLQkJSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNLAotCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSwKLQkJSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0KLQl9OwotCQotCXByaXZhdGUgY2xhc3MgRWRpdGluZ0RvbWFpbiBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiB7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCQkgKiBAcGFyYW0gY29tbWFuZFN0YWNrCi0JCSAqLwotCQlwdWJsaWMgRWRpdGluZ0RvbWFpbigpIHsKLQkJCXN1cGVyKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsgCi0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluI2NyZWF0ZUNvbW1hbmQoamF2YS5sYW5nLkNsYXNzLCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXIpCi0JCSAqLwotCQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKENsYXNzIGNvbW1hbmRDbGFzcywgQ29tbWFuZFBhcmFtZXRlciBjb21tYW5kUGFyYW1ldGVyKSB7Ci0JCQlpZihjb21tYW5kQ2xhc3MgPT0gQ3JlYXRlQ29weUNvbW1hbmQuY2xhc3MpIHsKLQkJCQlyZXR1cm4gbmV3IENyZWF0ZURlZXBDb3B5Q29tbWFuZCh0aGlzLCBjb21tYW5kUGFyYW1ldGVyLmdldEVPd25lcigpLCAoSGVscGVyKSBjb21tYW5kUGFyYW1ldGVyLmdldFZhbHVlKCkpOwotCQkJfQotCQkJaWYoY29tbWFuZENsYXNzID09IEluaXRpYWxpemVDb3B5Q29tbWFuZC5jbGFzcykgewotCQkJCXJldHVybiBuZXcgSW5pdGlhbGl6ZURlZXBDb3B5Q29tbWFuZCh0aGlzLCBjb21tYW5kUGFyYW1ldGVyLmdldEVPd25lcigpLCAoSGVscGVyKSBjb21tYW5kUGFyYW1ldGVyLmdldFZhbHVlKCkpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbW1hbmQoY29tbWFuZENsYXNzLCBjb21tYW5kUGFyYW1ldGVyKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDcmVhdGVEZWVwQ29weUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVDb3B5Q29tbWFuZCB7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBkb21haW4KLQkJICogQHBhcmFtIG93bmVyCi0JCSAqIEBwYXJhbSBjb3B5SGVscGVyCi0JCSAqLwotCQlwdWJsaWMgQ3JlYXRlRGVlcENvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLCBIZWxwZXIgY29weUhlbHBlcikgewotCQkJc3VwZXIoZG9tYWluLCBvd25lciwgY29weUhlbHBlcik7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNvcHlDb21tYW5kI2RvR2V0Q2hpbGRyZW5Ub0NvcHkoKQotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb24gZG9HZXRDaGlsZHJlblRvQ29weSgpIHsKLQkJCS8vIENyZWF0ZSBjb21tYW5kcyB0byBjcmVhdGUgY29waWVzIG9mIHRoZSBjaGlsZHJlbi4KLQkJCS8vCi0JCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IG93bmVyLmVDb250ZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0JCQl7Ci0JCQkJT2JqZWN0IG8gPSBpLm5leHQoKTsKLQkJCQlpZihvIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJLy8gbWFrZSBzdXJlIHRoYXQgQWN0aXZpdHkgd2lsbCBiZSBjb3BpZWQgZmlyc3QKLQkJCQkJLy8gc28gcmVmZXJlbmNlcyB0byBpdHMgaW5oZXJpdGVkIGVsZW1lbnRzIGNhbiBiZSByZXNvbHZlZCBwcm9wZXJseQotCQkJCQkvLwotCQkJCQlyZXN1bHQuYWRkKDAsIG8pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0LmFkZChvKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCi0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgY2xhc3MgSW5pdGlhbGl6ZURlZXBDb3B5Q29tbWFuZCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAcGFyYW0gZG9tYWluCi0JCSAqIEBwYXJhbSBvd25lcgotCQkgKiBAcGFyYW0gY29weUhlbHBlcgotCQkgKi8KLQkJcHVibGljIEluaXRpYWxpemVEZWVwQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsIEhlbHBlciBjb3B5SGVscGVyKSB7Ci0JCQlzdXBlcihkb21haW4sIG93bmVyLCBjb3B5SGVscGVyKTsKLQkJCWNvcHkgPSAoRU9iamVjdCkgY29weUhlbHBlci5nZXQob3duZXIpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZCNjb3B5UmVmZXJlbmNlcygpCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBjb3B5UmVmZXJlbmNlcygpIHsKLQkJCUFjdGl2aXR5IGJhc2UgPSBudWxsOwotCQkJQWN0aXZpdHkgYmFzZUNvcHkgPSBudWxsOwotCQkJQ29sbGVjdGlvbiBjaGlsZEJhc2VDb3BpZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJaWYob3duZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBvd25lcjsKLQkJCQlpZihQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhhY3Rpdml0eSkpIHsKLQkJCQkJLy8gY29weSBpbmhlcml0ZWQgZWxlbWVudHMgYnkgZGVlcC1jb3B5aW5nIGJhc2UgYWN0aXZpdHkKLQkJCQkJLy8KLQkJCQkJLy8gZGVlcCBjb3B5IG9mIGJhc2UgYWN0aXZpdHkgYXQgdGhpcyBwb2ludCBpcyBlc3NlbnRpYWwgc28gcmVmZXJlbmNlcyB0byBwcmVkZWNlc3NvcnMKLQkJCQkJLy8gd2lsbCBiZSBjb3BpZWQgY29ycmVjdGx5Ci0JCQkJCS8vCi0JCQkJCWJhc2UgPSAoQWN0aXZpdHkpIGFjdGl2aXR5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJQ29weUhlbHBlciBoZWxwZXIgPSAoQ29weUhlbHBlciljb3B5SGVscGVyOwotCQkJCQlBY3Rpdml0eSBvbGRCYXNlQ29weSA9IChBY3Rpdml0eSkgaGVscGVyLmdldChiYXNlKTsKLQkJCQkJLy8gdGhpcyB3aWxsIHJlZGlyZWN0IGFueSByZWZlcmVuY2UgdG8gY29weSBvZiBiYXNlIGluIGRpYWdyYW0gdG8gdGhlIGNvcHkgb2YgdGhlIGFjdGl2aXR5Ci0JCQkJCS8vCi0JCQkJCWhlbHBlci5wdXRWYXJpYWJpbGl0eUVsZW1lbnQoYmFzZSwgYWN0aXZpdHkpOwotCQkJCQlBcnJheUxpc3QgY2hpbGRCYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZihlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZTsKLQkJCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZUVsZW1lbnQgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCQkJaWYoYmFzZUVsZW1lbnQgIT0gbnVsbCAmJgotCQkJCQkJCQkJKHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT05fTElURVJBTCB8fCB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlRfTElURVJBTCkpCi0JCQkJCQkJewotCQkJCQkJCQloZWxwZXIucHV0VmFyaWFiaWxpdHlFbGVtZW50KGJhc2VFbGVtZW50LCB2ZSk7Ci0JCQkJCQkJCWNoaWxkQmFzZXMuYWRkKGJhc2VFbGVtZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCUFjdGl2aXR5RGVlcENvcHlDb21tYW5kIGNtZCA9IG5ldyBBY3Rpdml0eURlZXBDb3B5Q29tbWFuZChiYXNlLCBoZWxwZXIsIGNvbmZpZywgdGFyZ2V0UHJvY2VzcywgbW9uaXRvcik7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljbWQuZXhlY3V0ZSgpOwotCQkJCQkJCi0JCQkJCQliYXNlQ29weSA9IChBY3Rpdml0eSkgaGVscGVyLmdldChiYXNlKTsKLQkJCQkJCWlmKGFjdGl2aXR5LmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpIHsKLQkJCQkJCQkvLyBrZWVwIGFjdGl2aXR5IG9ubHkgYXMgYmFja3VwIGNvcHkgb2YgYmFzZQotCQkJCQkJCS8vCi0JCQkJCQkJaGVscGVyLnJlbW92ZVZhcmlhYmlsaXR5RWxlbWVudChiYXNlKTsKLQkJCQkJCQloZWxwZXIucHV0QmFja3VwQ29weShiYXNlLCBhY3Rpdml0eSk7Ci0JCQkJCQkJCi0JCQkJCQkJLy8gcHV0IGJhY2sgb2xkQmFzZUNvcHkKLQkJCQkJCQlpZihvbGRCYXNlQ29weSAhPSBudWxsKSB7Ci0JCQkJCQkJCWhlbHBlci5iYXNpY1B1dChiYXNlLCBvbGRCYXNlQ29weSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQkvLyByZW1vdmUgdGhlIGNvcGllcyBvZiBhbGwgYmFzZSBzaW5jZSBiYXNlIGNvcGllcyBhcmUgbm90IGFkZGVkIHRvIHRoZSBwcm9jZXNzCi0JCQkJCQkvLwotCQkJCQkJaGVscGVyLnJlbW92ZShiYXNlKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkQmFzZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJRU9iamVjdCBjaGlsZEJhc2VDb3B5ID0gKEVPYmplY3QpIGhlbHBlci5yZW1vdmUoaXRlci5uZXh0KCkpOwotCQkJCQkJCWNoaWxkQmFzZUNvcGllcy5hZGQoY2hpbGRCYXNlQ29weSk7Ci0JCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShjaGlsZEJhc2VDb3B5LmVDb250YWluZXIoKSk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCUFjdGl2aXR5IGFjdGl2aXR5Q29weSA9IChBY3Rpdml0eSkgY29weTsKLQkJCQkJCQotCQkJCQkJLy8gcmVtb3ZlIHRoZSBjb3BpZXMgb2YgYmFzZSBkaWFncmFtIGlmIHRoZSBhY3Rpdml0eSBhbHJlYWR5IGhhdmUgZGlhZ3JhbSBvZiB0aGUgc2FtZSB0eXBlCi0JCQkJCQkvLwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaWFncmFtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlpbnQgdHlwZSA9IGRpYWdyYW1UeXBlc1tpXTsKLQkJCQkJCQlpZihkaWFncmFtTWdyLmdldERpYWdyYW0oYWN0aXZpdHksIHR5cGUpICE9IG51bGwpIHsKLQkJCQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gZGlhZ3JhbU1nci5nZXREaWFncmFtKGFjdGl2aXR5Q29weSwgdHlwZSk7Ci0JCQkJCQkJCWlmKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShkaWFncmFtKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJLy8gbW92ZSBjb250ZW50IG9mIGJhc2UgcGFja2FnZSBvdmVyIHRvIHRoZSBhY3Rpdml0eSdzIHBhY2thZ2UKLQkJCQkJCS8vCi0JCQkJCQltb3ZlQ29udGVudChjbWQucGtnQ29weSwgYWN0aXZpdHlDb3B5KTsJCQkJCQkJCi0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQljbWQuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlzdXBlci5jb3B5UmVmZXJlbmNlcygpOwotCQkJCi0JCQlpZihiYXNlICE9IG51bGwpIHsKLQkJCQkvLyBjb3B5IGluaGVyaXRlZCBicmVha2Rvd24gZWxlbWVudHMgZnJvbSB0aGUgYmFzZSBhY3Rpdml0eSBpbiB0aGUgcmlnaHQgb3JkZXIKLQkJCQkvLwotCQkJCUlDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbnVsbDsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBudWxsOwotCQkJCUlGaWx0ZXIgZmlsdGVyID0gUHJvY2Vzc1V0aWwuZ2V0RmlsdGVyKCgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKWRvbWFpbikuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJaWYoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotCQkJCQljb25maWd1cmF0b3IgPSAoSUNvbmZpZ3VyYXRvcikgZmlsdGVyOwotCQkJCQljdXJyZW50Q29uZmlnID0gY29uZmlndXJhdG9yLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJY29uZmlndXJhdG9yLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIG93bmVyOwotCQkJCQlBY3Rpdml0eSBhY3Rpdml0eUNvcHkgPSAoKEFjdGl2aXR5KSBjb3B5KTsJCQkJCQotCQkJCQkKLQkJCQkJLy8gQWRkIGJyZWFrZG93biBlbGVtZW50cyBmcm9tIGJhc2UgY29weSB0byB0aGUgYWN0aXZpdHkgY29weS4gCi0JCQkJCS8vIERvbid0IGFkZCBjb3B5IG9mIGJhc2UgZWxlbWVudCBvZiB0aGUgZXhpc3RpbmcgY2hpbGRyZW4KLQkJCQkJLy8KLQkJCQkJTGlzdCBicmVha2Rvd25FbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYmFzZUNvcHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZighY2hpbGRCYXNlQ29waWVzLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCQkJYnJlYWtkb3duRWxlbWVudHMuYWRkKGUpOwotCQkJCQkJfQkJCQkJCQotCQkJCQl9Ci0JCQkJCWFjdGl2aXR5Q29weS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbCgwLCBicmVha2Rvd25FbGVtZW50cyk7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUoYmFzZUNvcHkpOwotCQkJCQkKLQkJCQkJLy8gY29weSBvdGhlciBzdHJpbmcgYXR0cmlidXRlcyBhcyB3ZWxsIGFmdGVyIHJlYWxpemUgdGhlbQotCQkJCQkvLwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRBdHRyaWJ1dGVzVG9Db3B5KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChFQXR0cmlidXRlKSBpdGVyLm5leHQoKTsKLQkJCQkJCU9iamVjdCB2YWx1ZSA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldEF0dHJpYnV0ZShhY3Rpdml0eSwgYXR0cmlidXRlLCBjb25maWcpOwotCQkJCQkJYWN0aXZpdHlDb3B5LmVTZXQoYXR0cmlidXRlLCB2YWx1ZSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIGNvcHkgcHJlc2VudGF0aW9uIG5hbWUKLQkJCQkJLy8KLQkJCQkJYWN0aXZpdHlDb3B5LnNldFByZXNlbnRhdGlvbk5hbWUoUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShhY3Rpdml0eSkpOwkJCQkJCi0KLQkJCQkJLy8gY2xlYXIgdGhlIHZhcmlhYmlsaXR5IGRhdGEKLQkJCQkJLy8KLQkJCQkJYWN0aXZpdHlDb3B5LnNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQobnVsbCk7Ci0JCQkJCWFjdGl2aXR5Q29weS5zZXRWYXJpYWJpbGl0eVR5cGUobnVsbCk7Ci0KLQkJCQkJLy8gY2xlYXIgc3VwcHJlc3Npb24gZGF0YQotCQkJCQkvLwotCQkJCQlDb25zdHJhaW50IHJ1bGUgPSBDb25zdHJhaW50TWFuYWdlci5nZXRDb25zdHJhaW50KGFjdGl2aXR5Q29weSwgQ29uc3RyYWludE1hbmFnZXIuUFJPQ0VTU19TVVBQUkVTU0lPTiwgZmFsc2UpOwotCQkJCQlpZihydWxlICE9IG51bGwpIHsKLQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUocnVsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmKGNvbmZpZ3VyYXRvciAhPSBudWxsKSB7Ci0JCQkJCQkvLyByZXN0b3JlIGN1cnJlbnQgY29uZmlncnVhdGlvbgotCQkJCQkJLy8KLQkJCQkJCWNvbmZpZ3VyYXRvci5zZXRNZXRob2RDb25maWd1cmF0aW9uKGN1cnJlbnRDb25maWcpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CQkKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvY2Vzc1BhY2thZ2UgcGtnQ29weTsKLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JcHJvdGVjdGVkIElEaWFncmFtTWFuYWdlciBkaWFncmFtTWdyOwotCi0JcHJvdGVjdGVkIFByb2Nlc3MgdGFyZ2V0UHJvY2VzczsKLQotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0KLQlwcm90ZWN0ZWQgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwdWJsaWMgQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIENvcHlIZWxwZXIgY29weUhlbHBlciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFByb2Nlc3MgdGFyZ2V0UHJvY2VzcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXN1cGVyKG51bGwsIGFjdGl2aXR5LmVDb250YWluZXIoKSwgY29weUhlbHBlcik7Ci0JCUFzc2VydC5pc1RydWUoYWN0aXZpdHkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UsICJBY3Rpdml0eSdzIGNvbnRhaW5lciBtdXN0IGJlIGEgUHJvY2Vzc1BhY2thZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQlkb21haW4gPSBuZXcgRWRpdGluZ0RvbWFpbigpOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJdGhpcy50YXJnZXRQcm9jZXNzID0gdGFyZ2V0UHJvY2VzczsKLQkJZGlhZ3JhbU1nciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGlhZ3JhbU1hbmFnZXIoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChkaWFncmFtTWdyLCAiQ291bGQgbm90IGxvYWQgZGlhZ3JhbSBtYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW1vbml0b3Iuc3ViVGFzayhOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5jb3B5aW5nQWN0aXZpdGllc19tc2csIFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoYWN0aXZpdHkpKSk7Ci0JCXN1cGVyLmV4ZWN1dGUoKTsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBzdXBlci5nZXRSZXN1bHQoKTsKLQkJaWYoIXJlc3VsdC5pc0VtcHR5KCkpIHsKLQkJCXBrZ0NvcHkgPSAoUHJvY2Vzc1BhY2thZ2UpIHJlc3VsdC5pdGVyYXRvcigpLm5leHQoKTsKLQkJCWZpeFByb2Nlc3NDb21wb25lbnQoKTsKLQkJCXJlcGxhY2VUZXh0UmVmZXJlbmNlcygpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIGZpeCB0aGUgcHJvY2VzcyBjb21wb25lbnQgdG8gbWFrZSBpdCBhIHByb2Nlc3MgcGFja2FnZS4KLQkgKiBUaGlzIG1ldGhvZCBtaWdodCBiZSBvdmVycmlkZW4gYnkgc3ViY2xhc3MgdG8gYWNoaXZlIGRpZmZlcmVuY2UgcmVzdWx0LgotCSAqIEZvciBleGFtcGxlLCAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUHJvY2Vzc0RlZXBDb3B5Q29tbWFuZCNmaXhQcm9jZXNzQ29tcG9uZW50KCkKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpeFByb2Nlc3NDb21wb25lbnQoKSB7Ci0JCWlmKHBrZ0NvcHkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkvLyByZXBsYWNlIHRoZSBQcm9jZXNzQ29tcG9uZW50IHdpdGggYSBlcXVpdmFsZW50IFByb2Nlc3NQYWNrYWdlCi0JCQkvLwotCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJCUNvbGxlY3Rpb24gZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KHBrZ0NvcHkuZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpKTsKLQkJCWZlYXR1cmVzLnJldGFpbkFsbChwa2cuZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IHZhbHVlID0gcGtnQ29weS5lR2V0KGZlYXR1cmUpOwotCQkJCXBrZy5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJCX0KLQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudClwa2dDb3B5KS5nZXRQcm9jZXNzKCk7Ci0JCQlpZihwcm9jICE9IG51bGwpIHsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKDAsIHByb2MpOwotCQkJfQotCQkJcGtnQ29weSA9IHBrZzsKLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIElmIHRleHR1YWwgZGVzY3JpcHRpb25zIGluIHRoZSBjb3BpZWQgZWxlbWVudHMgY29udGFpbiByZWZlcmVuY2VzIChVUkxzKSB0byBvdGhlciBlbGVtZW50cyAKLQkgKiB3aXRoaW4gdGhlIHNhbWUgY29waWVkIHByb2Nlc3MgdGhlbiByZXBsYWNlIHRoZXNlIHJlZmVyZW5jZXMgd2l0aCByZWZlcmVuY2VzIHRoYXQgcG9pbnQgdG8gCi0JICogdGhlIG5ldyBlbGVtZW50cyBpbiB0aGUgY29waWVkIHN0cnVjdHVyZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVwbGFjZVRleHRSZWZlcmVuY2VzKCkgewotCQlJVGV4dFJlZmVyZW5jZVJlcGxhY2VyIHR4dFJlZlJlcGxhY2VyID0gRXh0ZW5zaW9uTWFuYWdlci5nZXRUZXh0UmVmZXJlbmNlUmVwbGFjZXIoKTsKLQkJaWYodHh0UmVmUmVwbGFjZXIgPT0gbnVsbCkgcmV0dXJuOwotCi0JCU1hcCBvbGRUb05ld09iamVjdE1hcCA9ICgoQ29weUhlbHBlcikgY29weUhlbHBlcikuZ2V0T2JqZWN0VG9Db3B5TWFwKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBrZ0NvcHkuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJZm9yIChJdGVyYXRvciBhdHRyaWJ1dGVzID0gZWxlbWVudC5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpLml0ZXJhdG9yKCk7IGF0dHJpYnV0ZXMuaGFzTmV4dCgpOyApCi0JCQl7Ci0JCQkJRUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoRUF0dHJpYnV0ZSkgYXR0cmlidXRlcy5uZXh0KCk7Ci0JCQkJaWYgKGF0dHJpYnV0ZS5pc0NoYW5nZWFibGUoKSAmJiAhYXR0cmlidXRlLmlzRGVyaXZlZCgpICYmIChhdHRyaWJ1dGUuaXNNYW55KCkgfHwgZWxlbWVudC5lSXNTZXQoYXR0cmlidXRlKSkKLQkJCQkJCSYmIGF0dHJpYnV0ZS5nZXRFQXR0cmlidXRlVHlwZSgpLmdldEluc3RhbmNlQ2xhc3MoKSA9PSBMaXRlcmFscy5TVFJJTkcuZ2V0SW5zdGFuY2VDbGFzcygpKQotCQkJCXsKLQkJCQkJU3RyaW5nIHRleHQgPSAoU3RyaW5nKSBlbGVtZW50LmVHZXQoYXR0cmlidXRlKTsKLQkJCQkJaWYodGV4dCAhPSBudWxsKSB7Ci0JCQkJCQl0ZXh0ID0gdHh0UmVmUmVwbGFjZXIucmVwbGFjZSh0ZXh0LCB0YXJnZXRQcm9jZXNzLCBvbGRUb05ld09iamVjdE1hcCk7Ci0JCQkJCQllbGVtZW50LmVTZXQoYXR0cmlidXRlLCB0ZXh0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI2dldFJlc3VsdCgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlpZihwa2dDb3B5ICE9IG51bGwpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IFByb2Nlc3NVdGlsLmZpbmRBY3Rpdml0eShwa2dDb3B5KTsKLQkJCWlmKGFjdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCi0JLyoqCi0JICogTW92ZXMgY29udGVudCBvZiBzb3VyY2Ugb2JqZWN0IDxjb2RlPnNyYzwvY29kZT4gb3ZlciB0byB0aGUgdGFyZ2V0IG9iamVjIDxjb2RlPnRhcmdldDwvY29kZT4KLQkgKiBAcGFyYW0gc3JjCi0JICogQHBhcmFtIHRhcmdldAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgbW92ZUNvbnRlbnQoUHJvY2Vzc1BhY2thZ2Ugc3JjLCBBY3Rpdml0eSBhY3QpIHsKLQkJUHJvY2Vzc1BhY2thZ2UgdGFyZ2V0ID0gKFByb2Nlc3NQYWNrYWdlKSBhY3QuZUNvbnRhaW5lcigpOwotCQkvLyBtb3ZlIGNvbnRlbnQgb2YgYmFzZSBwYWNrYWdlIG92ZXIgdG8gdGhlIGFjdGl2aXR5J3MgcGFja2FnZQkJCQkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3Qoc3JjLmVDb250ZW50cygpKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gZS5lQ29udGFpbmluZ0ZlYXR1cmUoKTsJCQkJCQkKLQkJCWlmKGYuaXNNYW55KCkpIHsKLQkJCQkoKExpc3QpdGFyZ2V0LmVHZXQoZikpLmFkZChlKTsKLQkJCX0KLQkJfQotCQlpZihzcmMgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlQcm9jZXNzIGJhc2VDb3B5ID0gKChQcm9jZXNzQ29tcG9uZW50KXNyYykuZ2V0UHJvY2VzcygpOwotCQkJdGFyZ2V0LmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChiYXNlQ29weSk7Ci0JCX0KLQotCX0KLQkKLQlwdWJsaWMgdm9pZCBjb3B5U3VwcHJlc3Npb25TdGF0ZXMoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRlckZhY3Rvcmllcy5sZW5ndGg7IGkrKykgewotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yaWVzW2ldOwotCQkJQWN0aXZpdHkgYWN0ID0gUHJvY2Vzc1V0aWwuZmluZEFjdGl2aXR5KChQcm9jZXNzUGFja2FnZSkgb3duZXIpOwotCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGlwID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJSUJTSXRlbVByb3ZpZGVyIGJzSXAgPSAoSUJTSXRlbVByb3ZpZGVyKSBpcDsKLQkJCU9iamVjdCB0b3AgPSBic0lwLmdldFRvcEl0ZW0oKTsKLQkJCWlmKCEodG9wIGluc3RhbmNlb2YgUHJvY2VzcykgfHwgISgoKEVPYmplY3QpdG9wKS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSkgewotCQkJCS8vIGl0ZW0gcHJvdmlkZXIgdHJlZSBvZiB0aGUgb3duZXIncyBwcm9jZXNzIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQKLQkJCQkvLwotCQkJCVByb2Nlc3NVdGlsLmluaXRpYWxpemVJdGVtUHJvdmlkZXJQYXRoKGFjdCwgYWRhcHRlckZhY3RvcnkpOwotCQkJfQotCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdCk7Ci0JCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHByb2MpOwotCQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihhZGFwdGVyRmFjdG9yeSwgcHJvYyk7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGlwLmdldENoaWxkcmVuKG93bmVyKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQkJTWV0aG9kRWxlbWVudCBjb3B5ID0gKE1ldGhvZEVsZW1lbnQpIGNvcHlIZWxwZXIuZ2V0KGUpOwotCi0JCQkJLy8gY29weSBzdXBwcmVzc2lvbiBzdGF0ZSwgY29uc2lkZXIgY3VycmVudCBwcm9jZXNzIHRoYXQgaW5oZXJpdHMgdGhpcyBlbGVtZW50Ci0JCQkJLy8KLQkJCQlpZihjb3B5ICE9IG51bGwgJiYgc3VwcHJlc3Npb24uaXNTdXBwcmVzc2VkKGNoaWxkKSkgewotCQkJCQljb3B5LnNldFN1cHByZXNzZWQoQm9vbGVhbi5UUlVFKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eURyb3BDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5RHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTQ5OTU5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5RHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklBY3Rpb25UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkFjdGl2aXR5SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLQotLyoqCi0gKiBEcm9wIGNvbW1hbmQgZm9yIGFjdGl2aXR5IHRoYXQgc3VwcG9ydHMgZXh0ZW5kLCBjb3B5LCBhbmQgZGVlcCBjb3B5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEcm9wQ29tbWFuZCBleHRlbmRzIEJTRHJvcENvbW1hbmQgewotCi0JcHJpdmF0ZSBWaWV3ZXIgdmlld2VyOwotCi0JcHJpdmF0ZSBMaXN0IG9sZFBhdHRlcm5zOwotCi0JcHJpdmF0ZSBMaXN0IHBhdHRlcm5zOwotCi0JcHJpdmF0ZSBQcm9jZXNzIHRhcmdldFByb2Nlc3M7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEZWxpdmVyeVByb2Nlc3M7Ci0KLQlwcml2YXRlIGludCB0eXBlOwotCQotCXByaXZhdGUgQ29sbGVjdGlvbiBhcHBsaWVkQWN0aXZpdGllczsKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQlwcml2YXRlIEFjdGl2aXR5SGFuZGxlciBhY3Rpdml0eUhhbmRsZXI7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVFeGVjdXRlZDsKLQotCXByb3RlY3RlZCBIYXNoU2V0IGFkZGVkT2JqZWN0czsKLQotCXB1YmxpYyBBY3Rpdml0eURyb3BDb21tYW5kKEFjdGl2aXR5IHRhcmdldCwgTGlzdCBhY3Rpdml0aWVzLCBWaWV3ZXIgdmlld2VyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih0YXJnZXQsIGFjdGl2aXRpZXMpOwotCQlzZXRMYWJlbChMaWJyYXJ5RWRpdFJlc291cmNlcy5BY3Rpdml0eURyb3BDb21tYW5kX2xhYmVsKTsgCi0JCXRoaXMudmlld2VyID0gdmlld2VyOwotCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JCXRhcmdldFByb2Nlc3MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3ModGFyZ2V0KTsKLQkJCi0JCWlzRGVsaXZlcnlQcm9jZXNzID0gdGFyZ2V0UHJvY2VzcyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzczsKLQkJaWYgKGlzRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQlvbGRQYXR0ZXJucyA9IG5ldyBBcnJheUxpc3QoKChEZWxpdmVyeVByb2Nlc3MpIHRhcmdldFByb2Nlc3MpCi0JCQkJCS5nZXRJbmNsdWRlc1BhdHRlcm5zKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShpbnQgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQlpZih0eXBlID09IElBY3Rpb25UeXBlUHJvdmlkZXIuREVFUF9DT1BZKSB7Ci0JCQlydW5Bc0pvYiA9IHRydWU7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgY2hlY2tDb3B5KCkgewotCQkvL1RPRE86IG11c3QgcmVmaW5lIG1vcmUgdGhhbiBqdXN0IGNoZWNrRXh0ZW5kKCkKLQkJLy8gRS5nLjogc3RpbGwgYWxsb3cgY29weWluZyBkZWxpdmVyeSBwcm9jZXNzIHRoYXQgZG9lcyBub3QgaGF2ZSBhbnkgYWN0aXZpdHkgdmFyaWFiaWxpdHkuIAotCQlyZXR1cm4gY2hlY2tFeHRlbmQoKTsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgY2hlY2tFeHRlbmQoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRyb3BFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXIubmV4dCgpOwotLy8JCQkKLS8vCQkJaWYgKChQcm9jZXNzVXRpbC5oYXNDb250cmlidXRvck9yUmVwbGFjZXIoKEFjdGl2aXR5KSBlbGVtZW50KSkpewotLy8JCQkJY2FuRXh0ZW5kID0gZmFsc2U7Ci0vLwkJCQlicmVhazsKLS8vCQkJfQotLy8JCQkKLS8vCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGVsZW1lbnQpOwotLy8JCQlpZiAodGFyZ2V0UHJvY2Vzcy5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gcHJvYykgewotLy8JCQkJY2FuRXh0ZW5kID0gZmFsc2U7Ci0vLwkJCQlicmVhazsKLS8vCQkJfQotLy8JCQkKLS8vCQkJaWYgKHByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybiAmJiBwcm9jICE9IHRhcmdldFByb2Nlc3MpIHsKLS8vCQkJCWNhbkV4dGVuZCA9IHRydWU7Ci0vLwkJCQlicmVhazsKLS8vCQkJfQotCQkJCi0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGl0ZXIubmV4dCgpOwotCQkJUHJvY2VzcyBzcmNQcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdCk7Ci0JCQlpZihzcmNQcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJLy8gY2Fubm90IGV4dGVuZCBhIGRlbGl2ZXJ5IHByb2Nlc3Mgb3IgYW55IG9mIGl0cyBhY3Rpdml0aWVzCi0JCQkJLy8KLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5jYW5ub3RfY29weV9vcl9leHRlbmRfZGVsaXZlcnlfcHJvY2VzcywKLQkJCQkJCW51bGwpOwotCQkJfQotCQkJYm9vbGVhbiBjYW5FeHRlbmQ7Ci0JCQlpZiAoRGVwZW5kZW5jeUNoZWNrZXIubmV3Q2hlY2tBY3QpIHsKLQkJCQljYW5FeHRlbmQgPSBEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRm9yTW92aW5nVmFyaWFiaWxpdHlFbGVtZW50Ci0JCQkJCQkJCShhY3Rpdml0eSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChhY3QpLCB0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuRXh0ZW5kID0gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koYWN0LCBhY3Rpdml0eSkuaXNPSygpOwotCQkJfQotCQkJaWYoIWNhbkV4dGVuZCkgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLlBMVUdJTl9JRCwgMCwKLQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmNpcmN1bGFyX2RlcGVuZGVuY3lfZXJyb3JfbXNnLAotCQkJCQkJbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlJQWN0aW9uVHlwZVByb3ZpZGVyIGFjdGlvblR5cGVQcm92aWRlciA9IChJQWN0aW9uVHlwZVByb3ZpZGVyKSB2aWV3ZXI7Ci0JCWlmICggdmlld2VyICE9IG51bGwpIHsKLQkJCXZpZXdlciA9IG51bGw7Ci0JCQkvLyBkZWxlZ2F0ZSB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY29tbWFuZAotCQkJLy8KLQkJCWFjdGlvblR5cGVQcm92aWRlci5leGVjdXRlKHRoaXMsIGNoZWNrRXh0ZW5kKCkuaXNPSygpKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYWN0aXZpdHlIYW5kbGVyID0gbmV3IEFjdGl2aXR5SGFuZGxlcigpOwotCQkKLQkJaWYodHlwZSA9PSBJQWN0aW9uVHlwZVByb3ZpZGVyLkRFRVBfQ09QWSkgewotCQkJZG9EZWVwQ29weSgpOwotCQl9Ci0JCWVsc2UgewotCQkJc3VwZXIuZXhlY3V0ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvRGVlcENvcHkoKSB7Ci0JCWlmKCFVc2VySW50ZXJhY3Rpb25IZWxwZXIuY29uZmlybURlZXBDb3B5KGRyb3BFbGVtZW50cykpIHsKLQkJCXJldHVybjsKLQkJfQotCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZXBDb3B5Q29uZmlnID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRlZXBDb3B5Q29uZmlnID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNob29zZURlZXBDb3B5Q29uZmlndXJhdGlvbih0YXJnZXRQcm9jZXNzLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCX0KLQkJY2F0Y2goT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWFjdGl2aXR5SGFuZGxlci5zZXREZWVwQ29weUNvbmZpZyhkZWVwQ29weUNvbmZpZyk7Ci0JCWFjdGl2aXR5SGFuZGxlci5zZXRUYXJnZXRQcm9jZXNzKHRhcmdldFByb2Nlc3MpOwotCQkKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlhY3Rpdml0eUhhbmRsZXIuc2V0TW9uaXRvcihtb25pdG9yKTsKLQkJCQlwcmVFeGVjdXRlZCA9IHByZUV4ZWN1dGUoKTsKLQkJCX0KLQkJCQotCQl9OwotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBnZXRMYWJlbCgpKTsJCQkKLQkJaWYgKHByZUV4ZWN1dGVkKSB7Ci0JCQlyZWRvKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI3ByZUV4ZWN1dGUoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZUV4ZWN1dGUoKSB7Ci0JCWlmICghc3VwZXIucHJlRXhlY3V0ZSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIHByb2Nlc3MgdGhlIHNlbGVjdGVkIGFjdGl2aXRpZXMgYW5kIGRlZXAtY29weSB0aGUgdmFsaWQgb25lcwotCQkvLwotCQlpZiAoaXNEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCXBhdHRlcm5zID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkcm9wRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpCi0JCQkvLyAmJiBlbGVtZW50ICE9IHRhcmdldAotCQkJKSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBlbGVtZW50OwotCQkJCQotLy8JCQkJaWYodHlwZSA9PSBJQWN0aW9uVHlwZVByb3ZpZGVyLkRFRVBfQ09QWSkgewotLy8JCQkJCWFjdGl2aXR5SGFuZGxlci5kZWVwQ29weShhY3QpOwotLy8JCQkJfQotLy8JCQkJZWxzZSB7Ci0vLwkJCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdCk7Ci0vLwkJCQkJaWYgKHByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybiAmJiBwcm9jICE9IHRhcmdldFByb2Nlc3MpIHsKLS8vCQkJCQkJaWYgKHR5cGUgPT0gSUFjdGlvblR5cGVQcm92aWRlci5FWFRFTkQpIHsKLS8vCQkJCQkJCWFjdGl2aXR5SGFuZGxlci5leHRlbmQoYWN0KTsKLS8vCQkJCQkJCWlmIChwYXR0ZXJucyAhPSBudWxsKQotLy8JCQkJCQkJCXBhdHRlcm5zLmFkZChwcm9jKTsKLS8vCQkJCQkJfSBlbHNlIHsKLS8vCQkJCQkJCWFjdGl2aXR5SGFuZGxlci5jb3B5KGFjdCk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9IGVsc2UgewotLy8JCQkJCQlhY3Rpdml0eUhhbmRsZXIuY29weShhY3QpOwotLy8JCQkJCX0KLS8vCQkJCX0KLQkJCQkKLQkJCQlzd2l0Y2godHlwZSkgewotCQkJCWNhc2UgSUFjdGlvblR5cGVQcm92aWRlci5ERUVQX0NPUFk6Ci0JCQkJCWFjdGl2aXR5SGFuZGxlci5kZWVwQ29weShhY3QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElBY3Rpb25UeXBlUHJvdmlkZXIuRVhURU5EOgotCQkJCQlhY3Rpdml0eUhhbmRsZXIuZXh0ZW5kKGFjdCk7Ci0JCQkJCWlmIChwYXR0ZXJucyAhPSBudWxsKSB7Ci0JCQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KTsKLQkJCQkJCWlmKHByb2MgIT0gbnVsbCkgewotCQkJCQkJCXBhdHRlcm5zLmFkZChwcm9jKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIElBY3Rpb25UeXBlUHJvdmlkZXIuQ09QWToKLQkJCQkJYWN0aXZpdHlIYW5kbGVyLmNvcHkoYWN0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJYXBwbGllZEFjdGl2aXRpZXMgPSBhY3Rpdml0eUhhbmRsZXIuZ2V0QWN0aXZpdGllcygpOwotCi0JCXJldHVybiAhYXBwbGllZEFjdGl2aXRpZXMuaXNFbXB0eSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZG9FeGVjdXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCUl0ZXJhdG9yIGl0b3IgPSBhcHBsaWVkQWN0aXZpdGllcy5pdGVyYXRvcigpOwotCi0JCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgYWN0aXZpdHkuZUNvbnRhaW5lcigpOwotCQl3aGlsZSAoaXRvci5oYXNOZXh0KCkpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgaXRvci5uZXh0KCk7Ci0KLQkJCWlmIChhY3QuZUNvbnRhaW5lcigpICE9IG51bGwKLQkJCQkJJiYgYWN0LmVDb250YWluZXIoKS5lQ29udGFpbmVyKCkgIT0gcGtnKSB7Ci0JCQkJcGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQoYWN0LmVDb250YWluZXIoKSk7Ci0JCQl9Ci0KLQkJCWlmIChwYXR0ZXJucyAhPSBudWxsICYmICFwYXR0ZXJucy5pc0VtcHR5KCkpIHsKLQkJCQlEZWxpdmVyeVByb2Nlc3MgcHJvYyA9IChEZWxpdmVyeVByb2Nlc3MpIHRhcmdldFByb2Nlc3M7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGF0dGVybnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBwYXR0ZXJuID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmICghcHJvYy5nZXRJbmNsdWRlc1BhdHRlcm5zKCkuY29udGFpbnMocGF0dGVybikpIHsKLQkJCQkJCXByb2MuZ2V0SW5jbHVkZXNQYXR0ZXJucygpLmFkZChwYXR0ZXJuKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKGFwcGxpZWRBY3Rpdml0aWVzKTsKLQkJCi0JCWlmKCFhY3Rpdml0eUhhbmRsZXIuZ2V0RGVlcENvcGllcygpLmlzRW1wdHkoKSkgewotCQkJcG9zdERlZXBDb3B5KCk7Ci0JCX0KLQotCQkvLyBIYWNrIHRvIHJlZnJlc2ggcHJvdmlkZXJzIGZvcmNlZnVsbHkgYmVmb3JlIGNhbGxpbmcgZml4RHVwbGljYXRlTmFtZXMKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChhY3Rpdml0eSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJYWRhcHRlci5nZXRDaGlsZHJlbihhY3Rpdml0eSk7Ci0JCQotCQkvLyBmaXggZHVwbGljYXRlIG5hbWVzIG9mIG5ld2x5IGFkZGVkIGVsZW1lbnRzCi0JCWZpeER1cGxpY2F0ZU5hbWVzKCk7Ci0JCQotCQlnZXRNb2RpZmllZFJlc291cmNlcygpLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvc3REZWVwQ29weSgpIHsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvLyBhZGQgdG8gZGVmYXVsdCBjb25maWd1cmF0YXRpb24gb2YgdGhlIHRhcmdldCBwcm9jZXNzIGFueSBtaXNzaW5nIGNvbnRlbnQKLQkJCQkvLwotCQkJCWlmKGFkZGVkT2JqZWN0cyA9PSBudWxsKSB7Ci0JCQkJCWFkZGVkT2JqZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlhZGRlZE9iamVjdHMuY2xlYXIoKTsKLQkJCQl9Ci0JCQkJYm9vbGVhbiBkZWZhdWx0Q29uZmlnQ2hhbmdlZCA9IGZhbHNlOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXR5SGFuZGxlci5nZXREZWVwQ29waWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGl0ZXIubmV4dCgpKSB7Ci0KLQkJCQkJCS8qKgotCQkJCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkJCSAqLwotCQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQkJcmV0dXJuICgoQWN0aXZpdHkpb2JqZWN0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJfTsKLQkJCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQlPYmplY3QgZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IFByb2Nlc3NVdGlsLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBlKTsKLQkJCQkJCQlpbnQgc2l6ZSA9IGFkZGVkT2JqZWN0cy5zaXplKCk7Ci0JCQkJCQkJUHJvY2Vzc1V0aWwuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbih0YXJnZXRQcm9jZXNzLCBtZSwgYWRkZWRPYmplY3RzKTsKLQkJCQkJCQlpZighZGVmYXVsdENvbmZpZ0NoYW5nZWQgJiYgKHNpemUgIT0gYWRkZWRPYmplY3RzLnNpemUoKSkpIHsKLQkJCQkJCQkJZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5hZGQodGFyZ2V0UHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJZGVmYXVsdENvbmZpZ0NoYW5nZWQgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQl9OwotCQkKLQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bkluVUkocnVubmFibGUsIGdldExhYmVsKCkpOwotCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWVwQ29weUNvbmZpZyA9IGFjdGl2aXR5SGFuZGxlci5nZXREZWVwQ29weUNvbmZpZygpOwkJCQotCi0JCWlmKGRlZXBDb3B5Q29uZmlnICE9IG51bGwpIHsKLQkJCS8vIHN5bmNocm9uaXplIHRoZSBkZWVwIGNvcGllcyB3aXRoIGRlZXAgY29weSBjb25maWd1cmF0aW9uCQkJCQotCQkJLy8KLQkJCWZpbmFsIFN5bmNocm9uaXplQ29tbWFuZCBzeW5jaENtZCA9IG5ldyBTeW5jaHJvbml6ZUNvbW1hbmQoYWN0aXZpdHlIYW5kbGVyLmdldERlZXBDb3BpZXMoKSwgZGVlcENvcHlDb25maWcsIG51bGwsIGZhbHNlKTsKLQkJCXRyeSB7Ci0JCQkJcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJc3luY2hDbWQuaW5pdGlsaXplKCk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfTsKLQkJCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uX3ByZXBhcmUpOwotCQkJCWlmKHN5bmNoQ21kLmlzSW50aWFsaXplZCgpKSB7Ci0JCQkJCXN5bmNoQ21kLmV4ZWN1dGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzeW5jaENtZC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaXhlcyBkdXBsaWNhdGUgbmFtZXMgb2YgbmV3bHkgYWRkZWQgZWxlbWVudHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZml4RHVwbGljYXRlTmFtZXMoKSB7Ci0JCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24odGFyZ2V0UHJvY2Vzcyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFwcGxpZWRBY3Rpdml0aWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBpdGVyLm5leHQoKTsKLQkJCWZpeER1cGxpY2F0ZU5hbWVzKGFjdCwgc3VwcHJlc3Npb24pOwotCQkJZml4VGVhbVByb2ZpbGVEdXBsaWNhdGVOYW1lcyhhY3QsIHN1cHByZXNzaW9uKTsKLQkJfQkJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZml4RHVwbGljYXRlTmFtZXMoQnJlYWtkb3duRWxlbWVudCBlLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQlmaXhEdXBsaWNhdGVOYW1lcyhlLCBzdXBwcmVzc2lvbiwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpeER1cGxpY2F0ZU5hbWVzKEJyZWFrZG93bkVsZW1lbnQgZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IGUuZ2V0TmFtZSgpOwotCQlpZiAoUHJvY2Vzc1V0aWwuY2hlY2tCcmVha2Rvd25FbGVtZW50TmFtZShhZGFwdGVyRmFjdG9yeSwgZSwgYmFzZU5hbWUsIHN1cHByZXNzaW9uKSAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMTsgdHJ1ZTsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBiYXNlTmFtZSArICdfJyArIGk7Ci0JCQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQnJlYWtkb3duRWxlbWVudE5hbWUoYWRhcHRlckZhY3RvcnksIGUsIG5hbWUsIHN1cHByZXNzaW9uKSA9PSBudWxsKSB7Ci0JCQkJCWUuc2V0TmFtZShuYW1lKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWJhc2VOYW1lID0gUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShlKTsKLQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQnJlYWtkb3duRWxlbWVudFByZXNlbnRhdGlvbk5hbWUoYWRhcHRlckZhY3RvcnksIGUsIGJhc2VOYW1lLCBzdXBwcmVzc2lvbikgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDE7IHRydWU7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gYmFzZU5hbWUgKyAnXycgKyBpOwotCQkJCWlmIChQcm9jZXNzVXRpbC5jaGVja0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKGFkYXB0ZXJGYWN0b3J5LCBlLCBuYW1lLCBzdXBwcmVzc2lvbikgPT0gbnVsbCkgewotCQkJCQllLnNldFByZXNlbnRhdGlvbk5hbWUobmFtZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0JCQotCQotCXByaXZhdGUgdm9pZCBmaXhUZWFtUHJvZmlsZUR1cGxpY2F0ZU5hbWVzKEFjdGl2aXR5IGFjdCwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJZm9yIChpbnQgaSA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmdldChpKTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCWZpeER1cGxpY2F0ZU5hbWVzKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50LCBzdXBwcmVzc2lvbiwgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWZpeFRlYW1Qcm9maWxlRHVwbGljYXRlTmFtZXMoKEFjdGl2aXR5KSBlbGVtZW50LCBzdXBwcmVzc2lvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNkb1VuZG8oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVW5kbygpIHsKLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwoYXBwbGllZEFjdGl2aXRpZXMpOwotCQlpZiAoaXNEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCURlbGl2ZXJ5UHJvY2VzcyBwcm9jID0gKERlbGl2ZXJ5UHJvY2VzcykgdGFyZ2V0UHJvY2VzczsKLQkJCXByb2MuZ2V0SW5jbHVkZXNQYXR0ZXJucygpLmNsZWFyKCk7Ci0JCQlwcm9jLmdldEluY2x1ZGVzUGF0dGVybnMoKS5hZGRBbGwob2xkUGF0dGVybnMpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldE5hbWUoTGlzdCBzaWJsaW5ncywgQWN0aXZpdHkgZSkgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBlLmdldE5hbWUoKTsKLQkJaWYgKCFpc05hbWVUYWtlbihzaWJsaW5ncywgZSwgYmFzZU5hbWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDE7IHRydWU7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSBiYXNlTmFtZSArICdfJyArIGk7Ci0JCQlpZiAoIWlzTmFtZVRha2VuKHNpYmxpbmdzLCBlLCBuYW1lKSkgewotCQkJCWUuc2V0TmFtZShuYW1lKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdFByZXNlbnRhdGlvbk5hbWUoTGlzdCBzaWJsaW5ncywgQWN0aXZpdHkgZSkgewotCQkvLyBpZihlLmdldFByZXNlbnRhdGlvbk5hbWUoKSAhPSBudWxsICYmCi0JCS8vIGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHJldHVybjsKLQotCQlTdHJpbmcgYmFzZVByZXNlbnRhdGlvbk5hbWUgPSBQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKGUpOwotCQlpZiAoIWlzUHJlc2VudGF0aW9uTmFtZVRha2VuKHNpYmxpbmdzLCBlLCBiYXNlUHJlc2VudGF0aW9uTmFtZSkpIHsKLQkJCS8vIGUuc2V0UHJlc2VudGF0aW9uTmFtZShiYXNlUHJlc2VudGF0aW9uTmFtZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDE7IHRydWU7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSBiYXNlUHJlc2VudGF0aW9uTmFtZSArICdfJyArIGk7Ci0JCQlpZiAoIWlzUHJlc2VudGF0aW9uTmFtZVRha2VuKHNpYmxpbmdzLCBlLCBuYW1lKSkgewotCQkJCWUuc2V0UHJlc2VudGF0aW9uTmFtZShuYW1lKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTmFtZVRha2VuKExpc3Qgc2libGluZ3MsIERlc2NyaWJhYmxlRWxlbWVudCBlLAotCQkJU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IHNpYmxpbmdzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50IHNpYmxpbmcgPSAoQnJlYWtkb3duRWxlbWVudCkgc2libGluZ3MuZ2V0KGkpOwotCQkJLy8gaWYoc2libGluZyAhPSBlICYmIG5hbWUuZXF1YWxzKHNpYmxpbmcuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKSkgewotCQkJaWYgKHNpYmxpbmcgIT0gZSAmJiBuYW1lLmVxdWFscyhzaWJsaW5nLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ByZXNlbnRhdGlvbk5hbWVUYWtlbihMaXN0IHNpYmxpbmdzLAotCQkJRGVzY3JpYmFibGVFbGVtZW50IGUsIFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSBzaWJsaW5ncy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJQnJlYWtkb3duRWxlbWVudCBzaWJsaW5nID0gKEJyZWFrZG93bkVsZW1lbnQpIHNpYmxpbmdzLmdldChpKTsKLQkJCS8vIGlmKHNpYmxpbmcgIT0gZSAmJiBuYW1lLmVxdWFscyhzaWJsaW5nLmdldFByZXNlbnRhdGlvbk5hbWUoKSkpIHsKLQkJCWlmIChzaWJsaW5nICE9IGUKLQkJCQkJJiYgbmFtZS5lcXVhbHMoUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShzaWJsaW5nKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNnZXRBZmZlY3RlZE9iamVjdHMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJaWYoZXhlY3V0ZWQpIHsKLQkJCXJldHVybiBhcHBsaWVkQWN0aXZpdGllczsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0UmVzdWx0KCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBnZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci0KLQlwdWJsaWMgQWN0aXZpdHlIYW5kbGVyIGdldEFjdGl2aXR5SGFuZGxlcigpIHsKLQkJcmV0dXJuIGFjdGl2aXR5SGFuZGxlcjsKLQl9Ci0JcHVibGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KCl7Ci0JCXJldHVybiBhY3Rpdml0eTsKLQl9Ci0JcHVibGljIGludCBnZXRUeXBlKCl7Ci0JCXJldHVybiB0eXBlOwotCX0KLQkKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlWYXJpYWJpbGl0eUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlWYXJpYWJpbGl0eUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjQ0ODYxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5VmFyaWFiaWxpdHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci0KLS8qKgotICogQ29tbWFuZCB0byBzZXQgdmFyaWFiaWxpdHkgb24gdGhlIGFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVZhcmlhYmlsaXR5Q29tbWFuZCBleHRlbmRzIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFZhcmlhYmlsaXR5RWxlbWVudCB2ZTsKLQotCXByaXZhdGUgVmFyaWFiaWxpdHlUeXBlIHR5cGU7Ci0KLQlwcml2YXRlIExpc3QgZWxlbWVudHM7Ci0KLQlwcml2YXRlIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHVibGljIEFjdGl2aXR5VmFyaWFiaWxpdHlDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBWYXJpYWJpbGl0eUVsZW1lbnQgdmUsCi0JCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSwgSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IpIHsKLQotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0aXZpdHkpKTsKLQotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JCXRoaXMudmUgPSB2ZTsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy5jb25maWd1cmF0b3IgPSBjb25maWd1cmF0b3I7Ci0KLQkJZWxlbWVudHMgPSBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IHZlIH0pOwotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQotCQkvLyBhZGQgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIG5vdCB0aGVyZSBhbHJlYWR5Ci0JCWlmICghc3VwZXIuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihlbGVtZW50cywgY29uZmlndXJhdG9yKSkKLQkJCXJldHVybjsKLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JCWFjdGl2aXR5LnNldFZhcmlhYmlsaXR5VHlwZSh0eXBlKTsKLQkJYWN0aXZpdHkuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCh2ZSk7Ci0KLQkJCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJLy8gYmFzaWNhbGx5IHJlbW92ZSBmcm9tIGNvbmZpZ3VyYXRpb24gaWYgYW55dGhpbmcgd2FzIGFkZGVkCi0JCQlzdXBlci51bmRvKCk7Ci0JCQlhY3Rpdml0eS5zZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlLk5BX0xJVEVSQUwpOwotCQkJYWN0aXZpdHkuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BZGRHdWlkYW5jZVRvQWN0aXZpdHlDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FkZEd1aWRhbmNlVG9BY3Rpdml0eUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjIwMDU5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FkZEd1aWRhbmNlVG9BY3Rpdml0eUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotCi0KLS8qKgotICogQ29tbWFuZCB0byBhZGQgZ3VpZGFuY2UgdG8gYWN0aXZpdHkKLSAqICAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRHdWlkYW5jZVRvQWN0aXZpdHlDb21tYW5kIGV4dGVuZHMgQWRkTWV0aG9kRWxlbWVudENvbW1hbmQgewotCi0JcHJpdmF0ZSBMaXN0IGd1aWRhbmNlczsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwdWJsaWMgQWRkR3VpZGFuY2VUb0FjdGl2aXR5Q29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCBndWlkYW5jZXMpIHsKLQotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0aXZpdHkpKTsKLQotCQl0aGlzLmd1aWRhbmNlcyA9IGd1aWRhbmNlczsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQotCQkvLyBhZGQgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIG5vdCB0aGVyZSBhbHJlYWR5Ci0JCWlmICghc3VwZXIuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihndWlkYW5jZXMpKQotCQkJcmV0dXJuOwotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJaWYgKCFndWlkYW5jZXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ3VpZGFuY2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBvYmo7Ci0KLQkJCQkJLy8gZ3VpZGFuY2VzIGZvciBjb250ZW50IGVsZW1lbnQKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJCWFjdGl2aXR5LmdldENoZWNrbGlzdHMoKS5hZGQoaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJCWFjdGl2aXR5LmdldENvbmNlcHRzKCkuYWRkKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRFeGFtcGxlcygpLmFkZChpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkuYWRkKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJCWFjdGl2aXR5LmdldEd1aWRlbGluZXMoKS5hZGQoaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJCWFjdGl2aXR5LmdldFJldXNhYmxlQXNzZXRzKCkuYWRkKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSb2FkbWFwKSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRSb2FkbWFwcygpLmFkZChpdGVtKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkubG9nRXJyb3IoIkNhbnQgc2V0IGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoIWd1aWRhbmNlcy5pc0VtcHR5KCkpIHsKLQkJCS8vIGJhc2ljYWxseSByZW1vdmUgZnJvbSBjb25maWd1cmF0aW9uIGlmIGFueXRoaW5nIHdhcyBhZGRlZAotCQkJc3VwZXIudW5kbygpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ3VpZGFuY2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBvYmo7Ci0KLQkJCQkJLy8gZ3VpZGFuY2VzIGZvciBjb250ZW50IGVsZW1lbnQKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJCWFjdGl2aXR5LmdldENoZWNrbGlzdHMoKS5yZW1vdmUoaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJCWFjdGl2aXR5LmdldENvbmNlcHRzKCkucmVtb3ZlKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRFeGFtcGxlcygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkucmVtb3ZlKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJCWFjdGl2aXR5LmdldEd1aWRlbGluZXMoKS5yZW1vdmUoaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJCWFjdGl2aXR5LmdldFJldXNhYmxlQXNzZXRzKCkucmVtb3ZlKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSb2FkbWFwKSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRSb2FkbWFwcygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkubG9nRXJyb3IoIkNhbnQgc2V0IGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmICghZ3VpZGFuY2VzLmlzRW1wdHkoKSApIHsKLQkJCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlpZiAoYWN0aXZpdHkgIT0gbnVsbCkgewotCQkJcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsgYWN0aXZpdHkgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWJjNmFjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FkZE1ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLQotCi0vKioKLSAqIEJhc2UgQ29tbWFuZCBmb3IgYWRkIG1ldGhvZCBlbGVtZW50cyB0byBkZXNjcmlwdG9yLiAKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByb3RlY3RlZCBMaXN0IGVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWc7Ci0KLQlwcml2YXRlIEhhc2hTZXQgYWRkZWRPYmplY3RzOwotCi0JcHJpdmF0ZSBQcm9jZXNzIHByb2Nlc3M7Ci0KLQlwdWJsaWMgQWRkTWV0aG9kRWxlbWVudENvbW1hbmQoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5wcm9jZXNzID0gcHJvY2VzczsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgYW5kIGFkZHMgZWxlbWVudHMgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gZmFsc2UgaWYgdXNlciBjYW5jZWxlZCB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihMaXN0IGVsZW1lbnRzKQotCXsKLQkJcmV0dXJuIGFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oZWxlbWVudHMsIG51bGwpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBDaGVja3MgYW5kIGFkZHMgZWxlbWVudHMgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gZmFsc2UgaWYgdXNlciBjYW5jZWxlZCB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihMaXN0IGVsZW1lbnRzLCBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcikgewotCQlpZiAoZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZyA9PSBudWxsKSB7Ci0JCQllbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkKLQkJCQlzd2l0Y2ggKFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja0FnYWluc3REZWZhdWx0Q29uZmlndXJhdGlvbigKLQkJCQkJCXByb2Nlc3MsIGVsZW1lbnQsIGNvbmZpZ3VyYXRvcikpIHsKLQkJCQljYXNlIDA6Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjoKLQkJCQkJZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZy5hZGQoZWxlbWVudCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgLTE6Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcuaXNFbXB0eSgpKSB7Ci0JCQkJYWRkZWRPYmplY3RzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJUHJvY2Vzc1V0aWwuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jZXNzLCBlbGVtZW50LAotCQkJCQkJCWFkZGVkT2JqZWN0cyk7Ci0JCQkJfQotCQkJCWlmICghYWRkZWRPYmplY3RzLmlzRW1wdHkoKSkgewotCQkJCQlnZXRNb2RpZmllZFJlc291cmNlcygpLmFkZCgKLQkJCQkJCQlwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkuZVJlc291cmNlKCkpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKGFkZGVkT2JqZWN0cyAhPSBudWxsICYmICFhZGRlZE9iamVjdHMuaXNFbXB0eSgpKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcgPSBwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRlZE9iamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlkZWZhdWx0Q29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLnJlbW92ZShlbGVtZW50KTsKLQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCWRlZmF1bHRDb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLnJlbW92ZShlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BZGRSb2xlVG9UZWFtQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BZGRSb2xlVG9UZWFtQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZTRkNmI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkUm9sZVRvVGVhbUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotCi0KLS8qKgotICogQ29tbWFuZCB0byBhZGQgcm9sZSB0byB0ZWFtIHByb2ZpbGUKLSAqICAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRSb2xlVG9UZWFtQ29tbWFuZCBleHRlbmRzIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQotCXByaXZhdGUgTGlzdCByb2xlczsKLQotCXByaXZhdGUgTGlzdCByb2xlRGVzY0xpc3Q7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBUZWFtUHJvZmlsZSB0ZWFtOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBMaXN0IGV4aXN0aW5nUm9sZURlc2NMaXN0OwotCi0JcHVibGljIEFkZFJvbGVUb1RlYW1Db21tYW5kKFRlYW1Qcm9maWxlIHRlYW0sIExpc3Qgcm9sZXMpIHsKLQotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3ModGVhbSkpOwotCi0JCXRoaXMucm9sZXMgPSByb2xlczsKLQkJdGhpcy50ZWFtID0gdGVhbTsKLQotCQl0aGlzLmFjdGl2aXR5ID0gKEFjdGl2aXR5KSBQcm9jZXNzVXRpbC5nZXRQYXJlbnRBY3Rpdml0eU9mVGVhbSh0ZWFtKTsKLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocm9sZXMpKQotCQkJcmV0dXJuOwotCi0JCXJvbGVEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gcm9sZXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IFByb2Nlc3NVdGlsCi0JCQkJCS5jcmVhdGVSb2xlRGVzY3JpcHRvcigoUm9sZSkgaXRvci5uZXh0KCkpOwotCQkJcm9sZURlc2NMaXN0LmFkZChyb2xlRGVzYyk7Ci0JCX0KLQotCQkvLyBhdXRvbWF0aWMgYXNzaWdubWVudAotCQlleGlzdGluZ1JvbGVEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJUHJvY2Vzc1V0aWwuZ2V0Um9sZURlc2NyaXB0b3IoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgYWN0aXZpdHksCi0JCQkJZXhpc3RpbmdSb2xlRGVzY0xpc3QsIHJvbGVzKTsKLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JCWlmICghcm9sZURlc2NMaXN0LmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gcm9sZURlc2NMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkuYWRkKChSb2xlRGVzY3JpcHRvcikgaXRvci5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFleGlzdGluZ1JvbGVEZXNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGV4aXN0aW5nUm9sZURlc2NMaXN0Lml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQl0ZWFtLmdldFRlYW1Sb2xlcygpLmFkZCgoUm9sZURlc2NyaXB0b3IpIGl0b3IubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoIXJvbGVEZXNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCS8vIGJhc2ljYWxseSByZW1vdmUgZnJvbSBjb25maWd1cmF0aW9uIGlmIGFueXRoaW5nIHdhcyBhZGRlZAotCQkJc3VwZXIudW5kbygpOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gcm9sZURlc2NMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkucmVtb3ZlKChSb2xlRGVzY3JpcHRvcikgaXRvci5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCWlmICghZXhpc3RpbmdSb2xlRGVzY0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBleGlzdGluZ1JvbGVEZXNjTGlzdC5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5yZW1vdmUoKFJvbGVEZXNjcmlwdG9yKSBpdG9yLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQotCQlpZiAocm9sZXMgIT0gbnVsbCAmJiAhcm9sZXMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCQlpZiAodGVhbS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHRlYW0uZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCWlmIChyb2xlRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJvbGVEZXNjTGlzdDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25QcmltYXJ5UGVyZm9ybWVyVG9UYXNrRGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25QcmltYXJ5UGVyZm9ybWVyVG9UYXNrRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZDdmNDg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduUHJpbWFyeVBlcmZvcm1lclRvVGFza0Rlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci0KLQotLyoqCi0gKiAKLSAqIENvbW1hbmQgdG8gYXNzaWduIHByaW1hcnkgcGVyZm9ybWVyIHRvIHRhc2sgZGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXNzaWduUHJpbWFyeVBlcmZvcm1lclRvVGFza0Rlc2NyaXB0b3IgZXh0ZW5kcwotCQlBZGRNZXRob2RFbGVtZW50Q29tbWFuZCB7Ci0JcHJpdmF0ZSBSb2xlRGVzY3JpcHRvciBuZXdSb2xlRGVzYyA9IG51bGw7Ci0KLQlwcml2YXRlIFJvbGVEZXNjcmlwdG9yIG9sZFJvbGVEZXNjID0gbnVsbDsKLQotCXByaXZhdGUgUm9sZSByb2xlOwotCi0JcHJpdmF0ZSBMaXN0IHJvbGVzOwotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2M7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkvLyBwcml2YXRlIGJvb2xlYW4gZGVzY0V4aXN0cyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBUZWFtUHJvZmlsZSB0ZWFtOwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXByaXZhdGUgYm9vbGVhbiBpc05ld1JvbGVEZXNjcmlwdG9yID0gZmFsc2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQXNzaWduUHJpbWFyeVBlcmZvcm1lclRvVGFza0Rlc2NyaXB0b3IoVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MsCi0JCQlSb2xlIHJvbGUsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyh0YXNrRGVzYykpOwotCi0JCXRoaXMucm9sZSA9IHJvbGU7Ci0JCXRoaXMudGFza0Rlc2MgPSB0YXNrRGVzYzsKLQkJdGhpcy5vbGRSb2xlRGVzYyA9IHRhc2tEZXNjLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCi0JCXJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyb2xlcy5hZGQocm9sZSk7Ci0KLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJdGFza0Rlc2MsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudCh0YXNrRGVzYyk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJdGhpcy5hY3Rpdml0eSA9IChBY3Rpdml0eSkgcGFyZW50OwotCQl9Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7IAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocm9sZXMpKQotCQkJcmV0dXJuOwotCi0JCWlmICghcm9sZXMuaXNFbXB0eSgpKSB7Ci0JCQlpc05ld1JvbGVEZXNjcmlwdG9yID0gZmFsc2U7Ci0JCQkvLyBjaGVjayBmb3IgbG9jYWwgZGVzY3JpcHRvcgotCQkJbmV3Um9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKAotCQkJCQlyb2xlLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCWlmIChuZXdSb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJLy8gY2hlY2sgZm9yIGluaGVyaXRlZCBkZXNjcmlwdG9yCi0JCQkJbmV3Um9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbAotCQkJCQkJLmdldEluaGVyaXRlZERlc2NyaXB0b3Iocm9sZSwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJaWYgKG5ld1JvbGVEZXNjID09IG51bGwpIHsKLQotCQkJCQluZXdSb2xlRGVzYyA9IFByb2Nlc3NVdGlsLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKHJvbGUpOwotCQkJCQlpc05ld1JvbGVEZXNjcmlwdG9yID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGdldCB0ZWFtCi0JCQl0ZWFtID0gVXNlckludGVyYWN0aW9uSGVscGVyLmdldFRlYW0oYWN0aXZpdHksIHJvbGUpOwotCi0JCQlyZWRvKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJdGFza0Rlc2Muc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkobmV3Um9sZURlc2MpOwotCi0JCWlmIChpc05ld1JvbGVEZXNjcmlwdG9yKSB7Ci0JCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChuZXdSb2xlRGVzYyk7Ci0JCX0KLQotCQlpZiAodGVhbSAhPSBudWxsKSB7Ci0JCQl0ZWFtLmdldFRlYW1Sb2xlcygpLmFkZChuZXdSb2xlRGVzYyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCi0JCWlmICghcm9sZXMuaXNFbXB0eSgpKSB7Ci0JCQkvLyByZW1vdmUgZnJvbSBjb25maWd1cmF0aW9uIGlmIGFkZGVkCi0JCQlzdXBlci51bmRvKCk7Ci0KLQkJCXRhc2tEZXNjLnNldFBlcmZvcm1lZFByaW1hcmlseUJ5KG9sZFJvbGVEZXNjKTsKLQotCQkJaWYgKGlzTmV3Um9sZURlc2NyaXB0b3IpIHsKLQkJCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZShuZXdSb2xlRGVzYyk7Ci0JCQl9Ci0JCQlpZiAodGVhbSAhPSBudWxsKSB7Ci0JCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5yZW1vdmUobmV3Um9sZURlc2MpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0KLQkJaWYgKHJvbGUgIT0gbnVsbCkgewotCQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQkJfQotCQkJaWYgKHRhc2tEZXNjLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQodGFza0Rlc2MuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0ZDZiNWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25Sb2xlVG9UYXNrRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLQotCi0vKioKLSAqIENvbW1hbmQgZm9yIGFzc2lnbiByb2xlcyB0byB0YXNrIGRlc2NyaXB0b3IuIEl0IHdpbGwgYXNzaWduIGFkZGl0aW9uYWwKLSAqIHBlcmZvcm1lcnMgYW5kIGFzc2lzdGVkIGJ5IHRvIGEgdGFzayBkZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NpZ25Sb2xlVG9UYXNrRGVzY3JpcHRvciBleHRlbmRzIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQotCXByaXZhdGUgTGlzdCByb2xlczsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBpbnQgYWN0aW9uOwotCi0JTGlzdCBleGlzdGluZ1JvbGVEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCUxpc3QgbmV3Um9sZURlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzTmV3Um9sZURlc2NyaXB0b3IgPSBmYWxzZTsKLQotCS8qKgotCSAqIEFzc2lnbiByb2xlIHRvIHRhc2sgZGVzY3JpcHRvciBVc2VkIGZvciBib3RoIGFkZGl0aW9uYWxseSBwZXJmb3JtZWQgYnkKLQkgKiBhbmQgYXNzaXN0ZWQgYnkKLQkgKi8KLQlwdWJsaWMgQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IoVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MsIExpc3Qgcm9sZXMsCi0JCQlpbnQgYWN0aW9uLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCi0JCXN1cGVyKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyh0YXNrRGVzYykpOwotCi0JCXRoaXMucm9sZXMgPSByb2xlczsKLQkJdGhpcy50YXNrRGVzYyA9IHRhc2tEZXNjOwotCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0KLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJdGFza0Rlc2MsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudCh0YXNrRGVzYyk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJdGhpcy5hY3Rpdml0eSA9IChBY3Rpdml0eSkgcGFyZW50OwotCQl9Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkKLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocm9sZXMpKQotCQkJcmV0dXJuOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSByb2xlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkvLyBib29sZWFuIGRlc2NFeGlzdHMgPSBmYWxzZTsKLQkJCVJvbGUgcm9sZSA9IChSb2xlKSBpdC5uZXh0KCk7Ci0KLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gbnVsbDsKLQkJCWlzTmV3Um9sZURlc2NyaXB0b3IgPSBmYWxzZTsKLQkJCS8vIGNoZWNrIGZvciBsb2NhbCBkZXNjcmlwdG9yCi0JCQlyb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsLmdldERlc2NyaXB0b3Iocm9sZSwKLQkJCQkJYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQlpZiAocm9sZURlc2MgPT0gbnVsbCkgewotCQkJCS8vIGNoZWNrIGZvciBpbmhlcml0ZWQgZGVzY3JpcHRvcgotCQkJCXJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJCS5nZXRJbmhlcml0ZWREZXNjcmlwdG9yKHJvbGUsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCWlmIChyb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJCXJvbGVEZXNjID0gUHJvY2Vzc1V0aWwuY3JlYXRlUm9sZURlc2NyaXB0b3Iocm9sZSk7Ci0JCQkJCWlzTmV3Um9sZURlc2NyaXB0b3IgPSB0cnVlOwotCi0JCQkJfQotCQkJfQotCQkJaWYgKGlzTmV3Um9sZURlc2NyaXB0b3IpCi0JCQkJbmV3Um9sZURlc2NMaXN0LmFkZChyb2xlRGVzYyk7Ci0JCQllbHNlCi0JCQkJZXhpc3RpbmdSb2xlRGVzY0xpc3QuYWRkKHJvbGVEZXNjKTsKLQotCQkJLy8gZ2V0IHRlYW0KLQkJCVRlYW1Qcm9maWxlIHRlYW0gPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VGVhbShhY3Rpdml0eSwgcm9sZSk7Ci0JCQlpZiAodGVhbSAhPSBudWxsKSB7Ci0JCQkJbWFwLnB1dChyb2xlRGVzYywgdGVhbSk7Ci0JCQl9Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JCWlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0FERElUSU9OQUxfUEVSRk9STUVSKSB7Ci0JCQl0YXNrRGVzYy5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmFkZEFsbChleGlzdGluZ1JvbGVEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmFkZEFsbChuZXdSb2xlRGVzY0xpc3QpOwotCQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfQVNTSVNURURfQlkpIHsKLQkJCXRhc2tEZXNjLmdldEFzc2lzdGVkQnkoKS5hZGRBbGwoZXhpc3RpbmdSb2xlRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0QXNzaXN0ZWRCeSgpLmFkZEFsbChuZXdSb2xlRGVzY0xpc3QpOwotCQl9Ci0KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwobmV3Um9sZURlc2NMaXN0KTsKLQotCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCVNldCBrZXlzZXQgPSBtYXAua2V5U2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBrZXlzZXQuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGtleSA9IGl0b3IubmV4dCgpOwotCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIG1hcC5nZXQoa2V5KTsKLQotCQkJCS8vIGFkZCB0byB0ZWFtCi0JCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5hZGQoKFJvbGVEZXNjcmlwdG9yKSBrZXkpOwotCQkJfQotCQl9Ci0KLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQotCQkvLyBiYXNpY2FsbHkgcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhbnl0aGluZyB3YXMgYWRkZWQKLQkJc3VwZXIudW5kbygpOwotCi0JCWlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0FERElUSU9OQUxfUEVSRk9STUVSKSB7Ci0JCQl0YXNrRGVzYy5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLnJlbW92ZUFsbCgKLQkJCQkJZXhpc3RpbmdSb2xlRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5yZW1vdmVBbGwobmV3Um9sZURlc2NMaXN0KTsKLQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0FTU0lTVEVEX0JZKSB7Ci0JCQl0YXNrRGVzYy5nZXRBc3Npc3RlZEJ5KCkucmVtb3ZlQWxsKGV4aXN0aW5nUm9sZURlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldEFzc2lzdGVkQnkoKS5yZW1vdmVBbGwobmV3Um9sZURlc2NMaXN0KTsKLQkJfQotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbChuZXdSb2xlRGVzY0xpc3QpOwotCi0JCWlmIChtYXAgIT0gbnVsbCkgewotCQkJU2V0IGtleXNldCA9IG1hcC5rZXlTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGtleXNldC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qga2V5ID0gaXRvci5uZXh0KCk7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgbWFwLmdldChrZXkpOwotCi0JCQkJLy8gcmVtb3ZlIGl0IGZyb20gdGVhbQotCQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkucmVtb3ZlKChSb2xlRGVzY3JpcHRvcikga2V5KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCi0JCWlmIChyb2xlcyAhPSBudWxsICYmICFyb2xlcy5pc0VtcHR5KCkpIHsKLQkJCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJCWlmICh0YXNrRGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHRhc2tEZXNjLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnbldQVG9EZWxpdmVyYWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25XUFRvRGVsaXZlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjZlNjQ1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnbldQVG9EZWxpdmVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogCi0gKiBDb21tYW5kIHRvIGFzc2lnbiBkZWxpdmVyYWJsZSBwYXJ0cyB0byB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXNzaWduV1BUb0RlbGl2ZXJhYmxlIGV4dGVuZHMgQWRkTWV0aG9kRWxlbWVudENvbW1hbmQgewotCi0JcHJpdmF0ZSBMaXN0IHdvcmtQcm9kdWN0czsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2M7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCUxpc3QgZXhpc3RpbmdXUERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JTGlzdCBuZXdXUERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFzc2lnbldQVG9EZWxpdmVyYWJsZShXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjLCBMaXN0IHdvcmtQcm9kdWN0cykgewotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Mod3BEZXNjKSk7Ci0KLQkJdGhpcy53b3JrUHJvZHVjdHMgPSB3b3JrUHJvZHVjdHM7Ci0JCXRoaXMud3BEZXNjID0gd3BEZXNjOwotCi0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnRBY3Rpdml0eSh3cERlc2MpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXRoaXMuYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJfQotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCi0JfQotCi0JLyoqCi0JICogR2V0IHBhcmVudCBhY3Rpdml0eSBmb3IgYnJlYWtkb3duZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBickVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0UGFyZW50QWN0aXZpdHkoQnJlYWtkb3duRWxlbWVudCBickVsZW1lbnQpIHsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoYnJFbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlickVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50OwotCQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChickVsZW1lbnQsCi0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLQkJTGlzdCBicmVha2Rvd25FbGVtZW50cyA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0KLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24od29ya1Byb2R1Y3RzKSkKLQkJCXJldHVybjsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gd29ya1Byb2R1Y3RzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWJvb2xlYW4gZGVzY0V4aXN0cyA9IGZhbHNlOwotCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIGl0Lm5leHQoKTsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBuZXdXcERlc2MgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBicmVha2Rvd25FbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBicmVha2Rvd25FbGVtZW50cwotCQkJCQkJLmdldChpKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQluZXdXcERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJCQlXb3JrUHJvZHVjdCBlbGVtZW50V1AgPSBuZXdXcERlc2MuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQkJaWYgKHdwLmVxdWFscyhlbGVtZW50V1ApKSB7Ci0JCQkJCQkvLyBpZiBmb3VuZCB1bmRlciB0aGUgcGFyZW50IGFjdGl2aXR5LCByZXR1cm4gdGhhdAotCQkJCQkJLy8gd3BkZXNjcmlwdG9yCi0JCQkJCQlkZXNjRXhpc3RzID0gdHJ1ZTsKLQotCQkJCQkJZXhpc3RpbmdXUERlc2NMaXN0LmFkZChlbGVtZW50KTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0KLQkJCWlmICghZGVzY0V4aXN0cykgewotCQkJCW5ld1dQRGVzY0xpc3QuYWRkKFByb2Nlc3NVdGlsLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3cCkpOwotCQkJfQotCi0JCQkvLyBnZXQgZGVsaXZlcmFibGUKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkuZ2V0RGVsaXZlcmFibGUoYWN0aXZpdHksIHdwKTsKLQkJCWlmIChkZWxpdmVyYWJsZSAhPSBudWxsKSB7Ci0JCQkJbWFwLnB1dChuZXdXcERlc2MsIGRlbGl2ZXJhYmxlKTsKLQkJCX0KLQkJfQotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGRBbGwoZXhpc3RpbmdXUERlc2NMaXN0KTsKLQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGRBbGwobmV3V1BEZXNjTGlzdCk7Ci0KLQkJLy8gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwobmV3V1BEZXNjTGlzdCk7Ci0KLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQotCQkvLyBiYXNpY2FsbHkgcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhbnl0aGluZyB3YXMgYWRkZWQKLQkJc3VwZXIudW5kbygpOwotCi0JCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkucmVtb3ZlQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkucmVtb3ZlQWxsKG5ld1dQRGVzY0xpc3QpOwotCi0JCS8vIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKG5ld1dQRGVzY0xpc3QpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAod29ya1Byb2R1Y3RzICE9IG51bGwgJiYgICF3b3JrUHJvZHVjdHMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCQlpZiAod3BEZXNjLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQod3BEZXNjLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25XUFRvUm9sZURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduV1BUb1JvbGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU0ZDU2NDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25XUFRvUm9sZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBDb21tYW5kIHRvIGFzc2lnbiB3b3JrIHByb2R1Y3RzIHRvIHJvbGUgZGVzY3JpcHRvcnMuIEl0IHdpbGwgc2V0IHJlcG9uc2libGUKLSAqIHJvbGUgZmVhdHVyZS4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFzc2lnbldQVG9Sb2xlRGVzY3JpcHRvciBleHRlbmRzIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQotCXByaXZhdGUgTGlzdCB3b3JrUHJvZHVjdHM7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBSb2xlRGVzY3JpcHRvciByb2xlRGVzYzsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBpbnQgYWN0aW9uOwotCi0JTGlzdCBleGlzdGluZ1dQRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlMaXN0IG5ld1dQRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFzc2lnbldQVG9Sb2xlRGVzY3JpcHRvcihSb2xlRGVzY3JpcHRvciByb2xlRGVzYywgTGlzdCB3b3JrUHJvZHVjdHMsCi0JCQlpbnQgYWN0aW9uLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCi0JCXN1cGVyKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyhyb2xlRGVzYykpOwotCi0JCXRoaXMud29ya1Byb2R1Y3RzID0gd29ya1Byb2R1Y3RzOwotCQl0aGlzLnJvbGVEZXNjID0gcm9sZURlc2M7Ci0JCXRoaXMuYWN0aW9uID0gYWN0aW9uOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQlyb2xlRGVzYywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHJvbGVEZXNjKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQl0aGlzLmFjdGl2aXR5ID0gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCX0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkvLyBhZGQgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIG5vdCB0aGVyZSBhbHJlYWR5Ci0JCWlmICghc3VwZXIuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbih3b3JrUHJvZHVjdHMpKQotCQkJcmV0dXJuOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSB3b3JrUHJvZHVjdHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIGl0Lm5leHQoKTsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBuZXdXcERlc2MgPSBudWxsOwotCi0JCQlib29sZWFuIGlzTmV3RGVzY3JpcHRvciA9IGZhbHNlOwotCQkJLy8gY2hlY2sgZm9yIGxvY2FsIGRlc2NyaXB0b3IKLQkJCW5ld1dwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbAotCQkJCQkuZ2V0RGVzY3JpcHRvcih3cCwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQlpZiAobmV3V3BEZXNjID09IG51bGwpIHsKLQkJCQkvLyBjaGVjayBmb3IgaW5oZXJpdGVkIGRlc2NyaXB0b3IKLQkJCQluZXdXcERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJCS5nZXRJbmhlcml0ZWREZXNjcmlwdG9yKHdwLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQlpZiAobmV3V3BEZXNjID09IG51bGwpIHsKLQkJCQkJbmV3V3BEZXNjID0gUHJvY2Vzc1V0aWwuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKHdwKTsKLQkJCQkJaXNOZXdEZXNjcmlwdG9yID0gdHJ1ZTsKLQotCQkJCX0KLQkJCX0KLQkJCWlmIChpc05ld0Rlc2NyaXB0b3IpCi0JCQkJbmV3V1BEZXNjTGlzdC5hZGQobmV3V3BEZXNjKTsKLQkJCWVsc2UKLQkJCQlleGlzdGluZ1dQRGVzY0xpc3QuYWRkKG5ld1dwRGVzYyk7Ci0KLQkJCS8vIGdldCBkZWxpdmVyYWJsZQotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlbGl2ZXJhYmxlID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCS5nZXREZWxpdmVyYWJsZShhY3Rpdml0eSwgd3ApOwotCQkJaWYgKGRlbGl2ZXJhYmxlICE9IG51bGwpIHsKLQkJCQltYXAucHV0KG5ld1dwRGVzYywgZGVsaXZlcmFibGUpOwotCQkJfQotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQlpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9SRVNQT05TSUJMRV9GT1IpIHsKLQkJCXJvbGVEZXNjLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQlyb2xlRGVzYy5nZXRSZXNwb25zaWJsZUZvcigpLmFkZEFsbChuZXdXUERlc2NMaXN0KTsKLQkJfQotCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKG5ld1dQRGVzY0xpc3QpOwotCi0JCWlmIChtYXAgIT0gbnVsbCkgewotCQkJU2V0IGtleXNldCA9IG1hcC5rZXlTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGtleXNldC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qga2V5ID0gaXRvci5uZXh0KCk7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG1hcAotCQkJCQkJLmdldChrZXkpOwotCi0JCQkJLy8gYWRkIHRvIGRlbGl2ZXJhYmxlCi0JCQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGQoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikga2V5KTsKLQkJCX0KLQkJfQotCi0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQkJLy8gcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhbnl0aGluZyB3YXMgYWRkZWQKLQkJc3VwZXIudW5kbygpOwotCi0JCWlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX1JFU1BPTlNJQkxFX0ZPUikgewotCQkJcm9sZURlc2MuZ2V0UmVzcG9uc2libGVGb3IoKS5yZW1vdmVBbGwoZXhpc3RpbmdXUERlc2NMaXN0KTsKLQkJCXJvbGVEZXNjLmdldFJlc3BvbnNpYmxlRm9yKCkucmVtb3ZlQWxsKG5ld1dQRGVzY0xpc3QpOwotCQl9Ci0KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwobmV3V1BEZXNjTGlzdCk7Ci0KLQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQlTZXQga2V5c2V0ID0gbWFwLmtleVNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0ga2V5c2V0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBrZXkgPSBpdG9yLm5leHQoKTsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgbWFwCi0JCQkJCQkuZ2V0KGtleSk7Ci0KLQkJCQkvLyByZW1vdmUgaXQgZnJvbSBkZWxpdmVyYWJsZQotCQkJCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkKLQkJCQkJCS5yZW1vdmUoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikga2V5KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAod29ya1Byb2R1Y3RzICE9IG51bGwgJiYgICF3b3JrUHJvZHVjdHMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCQlpZiAocm9sZURlc2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyb2xlRGVzYy5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnbldQVG9UYXNrRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZjM4OWRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQ29tbWFuZCB0byBhc3NpZ24gd29yayBwcm9kdWN0cyB0byB0YXNrIGRlc2NyaXB0b3IuIEl0IHdpbGwgc2V0IGV4dGVybmFsCi0gKiBpbnB1dHMsIG1hbmRhdG9yeSBpbnB1dHMsIG9wdGlvbmFsIGlucHV0cyBhbmQgb3V0cHV0cy4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFzc2lnbldQVG9UYXNrRGVzY3JpcHRvciBleHRlbmRzIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQotCXByaXZhdGUgTGlzdCB3b3JrUHJvZHVjdHM7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBUYXNrRGVzY3JpcHRvciB0YXNrRGVzYzsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgaW50IGFjdGlvbjsKLQotCXByaXZhdGUgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JTGlzdCBleGlzdGluZ1dQRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlMaXN0IG5ld1dQRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFzc2lnbldQVG9UYXNrRGVzY3JpcHRvcihUYXNrRGVzY3JpcHRvciB0YXNrRGVzYywgTGlzdCB3b3JrUHJvZHVjdHMsCi0JCQlpbnQgYWN0aW9uLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3ModGFza0Rlc2MpKTsKLQotCQl0aGlzLndvcmtQcm9kdWN0cyA9IHdvcmtQcm9kdWN0czsKLQkJdGhpcy50YXNrRGVzYyA9IHRhc2tEZXNjOwotCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0KLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJdGFza0Rlc2MsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudCh0YXNrRGVzYyk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJdGhpcy5hY3Rpdml0eSA9IChBY3Rpdml0eSkgcGFyZW50OwotCQl9Ci0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24od29ya1Byb2R1Y3RzKSkKLQkJCXJldHVybjsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gd29ya1Byb2R1Y3RzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBpdC5uZXh0KCk7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmV3V3BEZXNjID0gbnVsbDsKLQotCQkJYm9vbGVhbiBpc05ld0Rlc2NyaXB0b3IgPSBmYWxzZTsKLQkJCS8vIGNoZWNrIGZvciBsb2NhbCBkZXNjcmlwdG9yCi0JCQluZXdXcERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJLmdldERlc2NyaXB0b3Iod3AsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJaWYgKG5ld1dwRGVzYyA9PSBudWxsKSB7Ci0JCQkJLy8gY2hlY2sgZm9yIGluaGVyaXRlZCBkZXNjcmlwdG9yCi0JCQkJbmV3V3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsCi0JCQkJCQkuZ2V0SW5oZXJpdGVkRGVzY3JpcHRvcih3cCwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJaWYgKG5ld1dwRGVzYyA9PSBudWxsKSB7Ci0JCQkJCW5ld1dwRGVzYyA9IFByb2Nlc3NVdGlsLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3cCk7Ci0JCQkJCWlzTmV3RGVzY3JpcHRvciA9IHRydWU7Ci0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXNOZXdEZXNjcmlwdG9yKQotCQkJCW5ld1dQRGVzY0xpc3QuYWRkKG5ld1dwRGVzYyk7Ci0JCQllbHNlCi0JCQkJZXhpc3RpbmdXUERlc2NMaXN0LmFkZChuZXdXcERlc2MpOwotCi0JCQkvLyBnZXQgZGVsaXZlcmFibGUKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkuZ2V0RGVsaXZlcmFibGUoYWN0aXZpdHksIHdwKTsKLQkJCWlmIChkZWxpdmVyYWJsZSAhPSBudWxsKSB7Ci0JCQkJbWFwLnB1dChuZXdXcERlc2MsIGRlbGl2ZXJhYmxlKTsKLQkJCX0KLQkJfQotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfRVhURVJOQUxfSU5QVVQpIHsKLQkJCXRhc2tEZXNjLmdldEV4dGVybmFsSW5wdXQoKS5hZGRBbGwoZXhpc3RpbmdXUERlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldEV4dGVybmFsSW5wdXQoKS5hZGRBbGwobmV3V1BEZXNjTGlzdCk7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9NQU5EQVRPUllfSU5QVVQpIHsKLQkJCXRhc2tEZXNjLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZEFsbChuZXdXUERlc2NMaXN0KTsKLQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX09QVElPTkFMX0lOUFVUKSB7Ci0JCQl0YXNrRGVzYy5nZXRPcHRpb25hbElucHV0KCkuYWRkQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRPcHRpb25hbElucHV0KCkuYWRkQWxsKG5ld1dQRGVzY0xpc3QpOwotCQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfT1VUUFVUKSB7Ci0JCQl0YXNrRGVzYy5nZXRPdXRwdXQoKS5hZGRBbGwoZXhpc3RpbmdXUERlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldE91dHB1dCgpLmFkZEFsbChuZXdXUERlc2NMaXN0KTsKLQkJfQotCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKG5ld1dQRGVzY0xpc3QpOwotCi0JCWlmIChtYXAgIT0gbnVsbCkgewotCQkJU2V0IGtleXNldCA9IG1hcC5rZXlTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGtleXNldC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qga2V5ID0gaXRvci5uZXh0KCk7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG1hcAotCQkJCQkJLmdldChrZXkpOwotCi0JCQkJLy8gYWRkIHRvIGRlbGl2ZXJhYmxlCi0JCQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGQoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikga2V5KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQkJLy8gcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhbnl0aGluZyB3YXMgYWRkZWQKLQkJc3VwZXIudW5kbygpOwotCi0JCWlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0VYVEVSTkFMX0lOUFVUKSB7Ci0JCQl0YXNrRGVzYy5nZXRFeHRlcm5hbElucHV0KCkucmVtb3ZlQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRFeHRlcm5hbElucHV0KCkucmVtb3ZlQWxsKG5ld1dQRGVzY0xpc3QpOwotCQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfTUFOREFUT1JZX0lOUFVUKSB7Ci0JCQl0YXNrRGVzYy5nZXRNYW5kYXRvcnlJbnB1dCgpLnJlbW92ZUFsbChleGlzdGluZ1dQRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0TWFuZGF0b3J5SW5wdXQoKS5yZW1vdmVBbGwobmV3V1BEZXNjTGlzdCk7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9PUFRJT05BTF9JTlBVVCkgewotCQkJdGFza0Rlc2MuZ2V0T3B0aW9uYWxJbnB1dCgpLnJlbW92ZUFsbChleGlzdGluZ1dQRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0T3B0aW9uYWxJbnB1dCgpLnJlbW92ZUFsbChuZXdXUERlc2NMaXN0KTsKLQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX09VVFBVVCkgewotCQkJdGFza0Rlc2MuZ2V0T3V0cHV0KCkucmVtb3ZlQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRPdXRwdXQoKS5yZW1vdmVBbGwobmV3V1BEZXNjTGlzdCk7Ci0JCX0KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwobmV3V1BEZXNjTGlzdCk7Ci0KLQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQlTZXQga2V5c2V0ID0gbWFwLmtleVNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0ga2V5c2V0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBrZXkgPSBpdG9yLm5leHQoKTsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgbWFwCi0JCQkJCQkuZ2V0KGtleSk7Ci0KLQkJCQkvLyByZW1vdmUgaXQgZnJvbSBkZWxpdmVyYWJsZQotCQkJCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkKLQkJCQkJCS5yZW1vdmUoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikga2V5KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAod29ya1Byb2R1Y3RzICE9IG51bGwgJiYgICF3b3JrUHJvZHVjdHMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCQlpZiAodGFza0Rlc2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZCh0YXNrRGVzYy5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTllOGMwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0JTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5JZGVudGl0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXhwb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0KLS8qKgotICogQWJzdHJhY3QgZHJhZyBhbmQgZHJvcCBjb21tYW5kIGZvciBwcm9jZXNzIGF1dGhvcmluZwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJTRHJhZ0FuZERyb3BDb21tYW5kIGV4dGVuZHMgRHJhZ0FuZERyb3BDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCS8qKgotCSAqIEBwYXJhbSBkb21haW4KLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiBAcGFyYW0gb3BlcmF0aW9ucwotCSAqIEBwYXJhbSBvcGVyYXRpb24KLQkgKiBAcGFyYW0gY29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBCU0RyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgT2JqZWN0IG93bmVyLAotCQkJZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZURyb3BDb3B5T24oKSB7Ci0JCXJldHVybiBwcmVwYXJlRHJvcExpbmtPbigpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmVEcm9wTGlua09uKCkgewotCQlkcmFnQ29tbWFuZCA9IElkZW50aXR5Q29tbWFuZC5JTlNUQU5DRTsKLQkJZHJvcENvbW1hbmQgPSBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCi0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlBcnJheUxpc3QgYWN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCW9iaiA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0JCQlpZiAoVG5nVXRpbC5pc0xvY2tlZCgoRU9iamVjdCkgb3duZXIpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChhY2NlcHQob2JqKSkgewotCQkJCWxpc3QuYWRkKG9iaik7Ci0JCQl9Ci0JCQkvLyBlbHNlIGlmKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCS8vIC8vIGRpc2FsbG93IGRyb3AgYSBwcm9jZXNzIGFzIGFuIGFjdGl2aXR5Ci0JCQkvLyB9Ci0JCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSAmJiBvd25lciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgdGFyZ2V0ID0gKEFjdGl2aXR5KSBvd25lcjsKLQkJCQlpZiAoRGVwZW5kZW5jeUNoZWNrZXIubmV3Q2hlY2tBY3QpIHsKLQkJCQkJaWYgKCEgRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckZvck1vdmluZ1ZhcmlhYmlsaXR5RWxlbWVudAotCQkJCQkJCSh0YXJnZXQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qob2JqKSwgdHJ1ZSkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQkJCQkJCi0JCQkJfSBlbHNlIGlmICghRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koKEFjdGl2aXR5KSBvYmosIHRhcmdldCkuaXNPSygpKXsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLS8vCQkJCVByb2Nlc3Mgc3JjUHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgb2JqKTsKLS8vCQkJCVByb2Nlc3MgdGFyZ2V0UHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyh0YXJnZXQpOwotLy8KLS8vCQkJCWlmICghKHNyY1Byb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MgJiYgdGFyZ2V0UHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSkgewotLy8JCQkJCWFjdExpc3QuYWRkKG9iaik7Ci0vLwkJCQl9Ci0JCQkJCi0JCQkJLy8gbm8gbW9yZSBjaGVjayB0byBwcmV2ZW50IGFwcGx5aW5nIGFuIGFjdGl2aXR5IG9mIGEgZGVsaXZlcnkgcHJvY2VzcyBvbnRvIGEgY2FwYWJpbGl0eSBwYXR0ZXIKLQkJCQkvLyBzaW5jZSBpbnRyb2R1Y3Rpb24gb2YgZGVlcC1jb3B5LiBEZWVwIGNvcHkgY2FuIGFsd2F5cyBiZSBhcHBsaWVkIHJlZ2FyZGxlc3Mgb2Ygc291cmNlIGFuZCB0YXJnZXQKLQkJCQkvLyBwcm9jZXNzZXMuCi0JCQkJLy8KLQkJCQlhY3RMaXN0LmFkZChvYmopOwotCQkJfQotCQl9Ci0KLQkJYm9vbGVhbiByZXN1bHQ7Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSAmJiBhY3RMaXN0LmlzRW1wdHkoKSkgewotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlDb21wb3VuZENvbW1hbmQgY21kID0gbmV3IFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoKTsKLQkJCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQljbWQuYXBwZW5kKGNyZWF0ZURyb3BDb21tYW5kKG93bmVyLCBsaXN0KSk7Ci0JCQl9Ci0JCQlpZiAoIWFjdExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJaWYgKG93bmVyIGluc3RhbmNlb2YgQWN0aXZpdHkpCi0JCQkJCWNtZC5hcHBlbmQobmV3IEFjdGl2aXR5RHJvcENvbW1hbmQoKEFjdGl2aXR5KSBvd25lciwgYWN0TGlzdCwKLQkJCQkJCWdldFRhcmdldFZpZXdlcigpLCAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkpKTsKLQkJCX0KLQkJCWRyb3BDb21tYW5kID0gY21kOwotCQkJcmVzdWx0ID0gZHJvcENvbW1hbmQuY2FuRXhlY3V0ZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBWaWV3ZXIgZ2V0VGFyZ2V0Vmlld2VyKCkgewotCQlpZiAoZG9tYWluIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIG93bmVyKTsKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGRvbWFpbikKLQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBFeHBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KAotCQkJCQkJKChFeHBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBsaXN0ZW5lciA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBJQ29udGVudFByb3ZpZGVyICYmIGxpc3RlbmVyIGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKSB7CQkJCQkKLQkJCQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcikgbGlzdGVuZXIpLmdldFZpZXdlcigpOwotCQkJCQkJaWYgKHZpZXdlci5nZXRJbnB1dCgpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudAotCQkJCQkJCQkmJiAoKFByb2Nlc3NDb21wb25lbnQpIHZpZXdlci5nZXRJbnB1dCgpKQotCQkJCQkJCQkJCS5nZXRQcm9jZXNzKCkgPT0gcHJvYykKLQkJCQkJCQlyZXR1cm4gdmlld2VyOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAoZHJvcENvbW1hbmQgaW5zdGFuY2VvZiBJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIHsKLQkJCXJldHVybiAoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgZHJvcENvbW1hbmQpLmdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuRHJhZ0FuZERyb3BDb21tYW5kI2dldEFmZmVjdGVkT2JqZWN0cygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gZHJvcENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7CQkKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaik7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsIExpc3QgZHJvcFNyYyk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQlNEcm9wQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9CU0Ryb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU0ZmNkMTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9CU0Ryb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0aW9uQXBwbGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5CYXRjaENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklOZXN0ZWRDb21tYW5kUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBBYnN0cmFjdCBiYXNlIERyb3BDb21tYW5kIGNsYXNzIGZvciBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQlNEcm9wQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTZXQgREVGQVVMVF9TWU5DSF9GRUFUVVJFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KAotCQkJbmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIHsKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCksCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCksCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCksCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfU3RlcHMoKSwJCQkJCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKQotCQkJfQotCSkpKTsKLQkKLQkvKioKLQkgKiBNYXAgb2YgbGlua2VkIGVsZW1lbnQncyBmZWF0dXJlIHRvIGRlc2NyaXB0b3IncyBmZWF0dXJlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNYXAgRkVBVFVSRV9NQVAgPSBuZXcgSGFzaE1hcCgpOwotCXN0YXRpYyB7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCkpOwotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpKTsKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpKTsKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1N0ZXBzKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSk7Ci0vLwkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVzdGltYXRlZE1ldGhvZEVsZW1lbnRfRXN0aW1hdGUoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXN0aW1hdGVkTWV0aG9kRWxlbWVudF9Fc3RpbWF0ZSgpKTsKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJvdGVjdGVkIExpc3QgZHJvcEVsZW1lbnRzOwotCi0JcHJpdmF0ZSBTZXQgbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBlbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnOwotCi0JcHJvdGVjdGVkIFNldCBhZGRlZE9iamVjdHM7Ci0KLQlwcml2YXRlIFByb2Nlc3MgcHJvY2VzczsKLQotCXByaXZhdGUgYm9vbGVhbiBhZGRlZFRvRGVmYXVsdENvbmZpZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3luY2hyb25pemUgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBBcnJheUxpc3QgdGFza0Rlc2NMaXN0OwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdCB0YXNrRGVzY3JpcHRvcnNUb1VwZGF0ZTsKLQotLy8JcHJvdGVjdGVkIFNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaDsKLQotCS8qKgotCSAqIE1hcCBvZiBkZXNjcmlwdG9yIHRvIG9sZCByZWZyZXNoYWJsZSBmZWF0dXJlIG1hcAotCSAqLwotCXByaXZhdGUgTWFwIGRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXA7Ci0KLQkvKioKLQkgKiBNYXAgb2YgZGVzY3JpcHRvciB0byBtYXAgb2YgZmVhdHVyZSB0byBuZXcgdmFsdWVzCi0JICovCi0vLwlwcm90ZWN0ZWQgTWFwIGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXA7Ci0vLwlwcml2YXRlIEhhc2hNYXAgZGVzY3JpcHRvclRvT2xkRmVhdHVyZVZhbHVlc01hcDsJCi0JcHJvdGVjdGVkIERlc2NyaXB0b3JVcGRhdGVCYXRjaENvbW1hbmQgYmF0Y2hDb21tYW5kOwotCi0vLwlwcml2YXRlIEhhc2hNYXAgd3BkVG9PbGRSZXNwb25zaWJsZVJvbGVNYXA7Ci0KLQkvKioKLQkgKiBNYXAgb2YgVGFza0Rlc2NyaXB0b3IgdG8gbGlzdCBvZiBuZXdseSBhZGRlZCBzdGVwcwotCSAqLwotCXByaXZhdGUgTWFwIHRhc2tEZXNjVG9OZXdTdGVwc01hcDsKLQotCXByaXZhdGUgTWFwIHRhc2tEZXNjVG9PbGRFc3RpbWF0ZU1hcDsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5jZWxlZDsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwcm90ZWN0ZWQgU2V0IHN5bmNoRmVhdHVyZXMgPSBERUZBVUxUX1NZTkNIX0ZFQVRVUkVTOwotCi0JcHJpdmF0ZSBCYXRjaENvbW1hbmQgcmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZDsKLQotCXByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVkOwotCi0vLwlwcm90ZWN0ZWQgT2JqZWN0IFVJQ29udGV4dDsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBydW5Bc0pvYjsKLQkKLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLQotCXByaXZhdGUgaW50IHdvcmtlZFVuaXRzOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgbmVzdGVkQ29tbWFuZHM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiAgICAgICAgICAgIHRoZSBhY3Rpdml0eSB0aGF0IHRoZSBnaXZlbiBlbGVtZW50cyBhcmUgZHJvcHBlZCBvbgotCSAqIEBwYXJhbSBkcm9wRWxlbWVudHMKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50cyB0byBkcm9wIG9uIHRoZSBnaXZlbiBhY3Rpdml0eQotCSAqLwotCXB1YmxpYyBCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IGRyb3BFbGVtZW50cykgewotCQl0aGlzKGFjdGl2aXR5LCBkcm9wRWxlbWVudHMsIG51bGwsIG51bGwsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3luY2gKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIHRoZSBjb21tYW5kIHdpbGwgY2xlYW4gdGhlIGNvbnRlbnQgYW5kIHJlbGF0aW9uc2hpcHMKLQkgKiAgICAgICAgICAgIG9mIGV4aXN0aW5nIGRlc2NyaXB0b3JzIGFuZCByZWZyZXNoIHRoZW0gd2l0aCB0aGUgbGlua2VkCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIEJTRHJvcENvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIExpc3QgZHJvcEVsZW1lbnRzLCBib29sZWFuIHN5bmNoKSB7Ci0JCXRoaXMoYWN0aXZpdHksIGRyb3BFbGVtZW50cywgbnVsbCwgbnVsbCwgc3luY2gpOwotCX0KLQotCS8qKgotCSAqIFN5bmNocm9uaXplIHRoZSBnaXZlbiBjb250ZW50IGVsZW1lbnRzIHRvIGl0cyBUYXNrRGVzY3JpcHRvcnMgaW4gdGhlCi0JICogZ2l2ZW4gYWN0aXZpdHkgdXNpbmcgdGhlIGdpdmVuIE1ldGhvZENvbmZpZ3VyYXRpb24gYW5kIGxpc3Qgb2YKLQkgKiBzeW5jaHJvbml6YWJsZSBmZWF0dXJlcy4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gZHJvcEVsZW1lbnRzCi0JICogICAgICAgICAgICB0aGUgZWxlbWVudHMgdG8gc3luY2hyb25pemUKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHN5bmNoRmVhdHVyZXMKLQkgKiAgICAgICAgICAgIHRoZSBzeW5jaHJvbml6YWJsZSBmZWF0dXJlcywgaWYgPGNvZGU+bnVsbDwvY29kZT4gdGhlIERFRkFVTFRfU1lOQ0hfRkVBVFVSRVMgd2lsbCBiZSB1c2VkLgotCSAqLwotCXB1YmxpYyBCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IGRyb3BFbGVtZW50cywKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTZXQgc3luY2hGZWF0dXJlcykgewotCQl0aGlzKGFjdGl2aXR5LCBkcm9wRWxlbWVudHMsIGNvbmZpZywgc3luY2hGZWF0dXJlcywgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IGRyb3BFbGVtZW50cywKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTZXQgc3luY2hGZWF0dXJlcywgYm9vbGVhbiBzeW5jaCkgewotCQlzdXBlcigpOwotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JCXByb2Nlc3MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0aXZpdHkpOwotCQl0aGlzLnN5bmNocm9uaXplID0gc3luY2g7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQlpZiAoc3luY2hGZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQl0aGlzLnN5bmNoRmVhdHVyZXMgPSBERUZBVUxUX1NZTkNIX0ZFQVRVUkVTOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zeW5jaEZlYXR1cmVzID0gc3luY2hGZWF0dXJlczsKLQkJfQotCQkKLQkJdGhpcy5kcm9wRWxlbWVudHMgPSBkcm9wRWxlbWVudHM7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJaWYobW9uaXRvciA9PSBudWxsKSB7Ci0JCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQlyZXR1cm4gbW9uaXRvcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcHJlcGFyZURyb3BFbGVtZW50cygpIHsKLQkJCi0JCUFycmF5TGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkcm9wRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWVsZW1lbnQgPSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5yZXNvbHZlKGVsZW1lbnQsIGNvbmZpZyk7Ci0JCQlpZiAoIWVsZW1lbnRzLmNvbnRhaW5zKGVsZW1lbnQpCi0JCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QgJiYgKChFT2JqZWN0KSBlbGVtZW50KQotCQkJCQkJCS5lSXNQcm94eSgpKSkgewkJCQkKLQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJZHJvcEVsZW1lbnRzID0gZWxlbWVudHM7Ci0JfQotCQotLy8JLyoqCi0vLwkgKiBTZXRzIFVJIGNvbnRleHQgZm9yIHRoaXMgY29tbWFuZCwgdGhpcyBjYW4gYmUgYSBTaGVsbCBvYmplY3QKLS8vCSAqIEBwYXJhbSBVSUNvbnRleHQKLS8vCSAqLwotLy8JcHVibGljIHZvaWQgc2V0VUlDb250ZXh0KE9iamVjdCBVSUNvbnRleHQpIHsKLS8vCQl0aGlzLlVJQ29udGV4dCA9IFVJQ29udGV4dDsKLS8vCX0KLQotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQljb25maWcgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0aXZpdHkpLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGRyb3BFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlkcm9wRWxlbWVudHMuY2xlYXIoKTsKLQkJfQotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJfQotCQlpZiAoZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZyAhPSBudWxsKSB7Ci0JCQllbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKGFkZGVkT2JqZWN0cyAhPSBudWxsKSB7Ci0JCQlhZGRlZE9iamVjdHMuY2xlYXIoKTsKLQkJfQotCQlpZiAoZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHRhc2tEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQl0YXNrRGVzY0xpc3QuY2xlYXIoKTsKLQkJfQotCQlpZiAodGFza0Rlc2NUb05ld1N0ZXBzTWFwICE9IG51bGwpIHsKLQkJCXRhc2tEZXNjVG9OZXdTdGVwc01hcC5jbGVhcigpOwotCQl9Ci0JCWlmICh0YXNrRGVzY1RvT2xkRXN0aW1hdGVNYXAgIT0gbnVsbCkgewotCQkJdGFza0Rlc2NUb09sZEVzdGltYXRlTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHJlZnJlc2hSZXNwb25zaWJsZUZvckNvbW1hbmQgIT0gbnVsbCkgewotCQkJcmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZC5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKHRhc2tEZXNjcmlwdG9yc1RvVXBkYXRlICE9IG51bGwpIHsKLQkJCXRhc2tEZXNjcmlwdG9yc1RvVXBkYXRlLmNsZWFyKCk7Ci0JCX0KLQkJaWYoYmF0Y2hDb21tYW5kICE9IG51bGwpIHsKLQkJCWJhdGNoQ29tbWFuZC5kaXNwb3NlKCk7Ci0JCX0KLQkJYWN0aXZpdHkgPSBwcm9jZXNzID0gbnVsbDsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JCQotCQlpZihuZXN0ZWRDb21tYW5kcyAhPSBudWxsICYmICFuZXN0ZWRDb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCWZvcihpbnQgaSA9IG5lc3RlZENvbW1hbmRzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSAoQ29tbWFuZCkgbmVzdGVkQ29tbWFuZHMuZ2V0KGkpOwotCQkJCWlmKGNtZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCQl0cnkgewotCQkJCQkJQ29sbGVjdGlvbiByZXNvdXJjZXMgPSAoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCljbWQpLmdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCQkJCQlpZihyZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbChyZXNvdXJjZXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgYWxsIHRoZSByZWZyZXNoYWJsZSBmZWF0dXJlcyBvZiB0aGUgZ2l2ZW4gZGVzY3JpcHRvcgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNsZWFyRGVzY3JpcHRvcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJU2V0IGV4Y2x1ZGVTeW5jaEZlYXR1cmVzID0gbmV3IEhhc2hTZXQoREVGQVVMVF9TWU5DSF9GRUFUVVJFUyk7Ci0JCWV4Y2x1ZGVTeW5jaEZlYXR1cmVzLnJlbW92ZUFsbChzeW5jaEZlYXR1cmVzKTsKLQkJU2V0IGV4Y2x1ZGVGZWF0dXJlczsKLQkJaWYgKGV4Y2x1ZGVTeW5jaEZlYXR1cmVzLmlzRW1wdHkoKSkgewotCQkJZXhjbHVkZUZlYXR1cmVzID0gZXhjbHVkZVN5bmNoRmVhdHVyZXM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlleGNsdWRlRmVhdHVyZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZXhjbHVkZVN5bmNoRmVhdHVyZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXREZXNjcmlwdG9yRmVhdHVyZSgoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyLm5leHQoKSk7Ci0JCQkJaWYoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQkJCWV4Y2x1ZGVGZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWJvb2xlYW4gcmV0ID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmNsZWFyRGVzY3JpcHRvcihkZXNjcmlwdG9yLAotCQkJCWRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAsIGV4Y2x1ZGVGZWF0dXJlcyk7Ci0JCWlmIChyZXQgJiYgZGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlpZiAodGFza0Rlc2NyaXB0b3JzVG9VcGRhdGUgPT0gbnVsbCkgewotCQkJCXRhc2tEZXNjcmlwdG9yc1RvVXBkYXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJfQotCQkJdGFza0Rlc2NyaXB0b3JzVG9VcGRhdGUuYWRkKGRlc2NyaXB0b3IpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldERlc2NyaXB0b3JGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBsaW5rZWRFbGVtZW50RmVhdHVyZSkgewotCQlyZXR1cm4gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgRkVBVFVSRV9NQVAuZ2V0KGxpbmtlZEVsZW1lbnRGZWF0dXJlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlRXhlY3V0ZSgpIHsKLQkJcHJlcGFyZURyb3BFbGVtZW50cygpOwotCQkKLQkJYm9vbGVhbiBiID0gIWRyb3BFbGVtZW50cy5pc0VtcHR5KCk7Ci0JCWlmIChiKSB7Ci0vLwkJCWRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJYmF0Y2hDb21tYW5kID0gbmV3IERlc2NyaXB0b3JVcGRhdGVCYXRjaENvbW1hbmQoZmFsc2UsIHN5bmNoRmVhdHVyZXMsIGNvbmZpZyk7IC8vVE9ETzogd2h5IGNsZWFyIG11c3QgYmUgZmFsc2UgPz8/Ci0KLS8vCQkJaWYgKHN5bmNocm9uaXplKSB7Ci0vLwkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaCA9IG5ldyBIYXNoU2V0KCk7Ci0vLwkJCX0KLQkJfQotCQlyZXR1cm4gYjsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29sbGVjdEVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcoKSB7Ci0JCWlmIChlbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnID09IG51bGwpIHsKLQkJCWVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkcm9wRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlzd2l0Y2ggKFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja0FnYWluc3REZWZhdWx0Q29uZmlndXJhdGlvbigKLQkJCQkJCXByb2Nlc3MsIGVsZW1lbnQpKSB7Ci0JCQkJY2FzZSAwOgotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDI6Ci0JCQkJCWVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcuYWRkKGVsZW1lbnQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIC0xOgotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZWxlbWVudHMgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gbW9kaWZpZWQsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBhZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKCkgewotCQlpZiAoIWFkZGVkVG9EZWZhdWx0Q29uZmlnICYmIGVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcgIT0gbnVsbCAmJiAhZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZy5pc0VtcHR5KCkpIHsKLQkJCWlmKGFkZGVkT2JqZWN0cyA9PSBudWxsKSB7Ci0JCQkJYWRkZWRPYmplY3RzID0gbmV3IEhhc2hTZXQoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWFkZGVkT2JqZWN0cy5jbGVhcigpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZy5pdGVyYXRvcigpOyBpdGVyCi0JCQkuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlQcm9jZXNzVXRpbC5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2Nlc3MsIGVsZW1lbnQsCi0JCQkJCQlhZGRlZE9iamVjdHMpOwotCQkJfQotCQkJaWYgKCFhZGRlZE9iamVjdHMuaXNFbXB0eSgpKSB7Ci0JCQkJZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5hZGQoCi0JCQkJCQlwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkuZVJlc291cmNlKCkpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJYWRkZWRUb0RlZmF1bHRDb25maWcgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBnZXRUb3RhbFdvcmsoKSB7Ci0JCXJldHVybiAyMDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgd29ya2VkKGludCB1bml0c09mV29yaykgewotCQltb25pdG9yLndvcmtlZCh1bml0c09mV29yayk7Ci0JCXdvcmtlZFVuaXRzID0gd29ya2VkVW5pdHMgKyB1bml0c09mV29yazsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBnZXRSZW1haW5pbmdXb3JrKCkgewotCQlpbnQgcmVtYWluaW5nID0gZ2V0VG90YWxXb3JrKCkgLSB3b3JrZWRVbml0czsKLQkJaWYocmVtYWluaW5nIDwgMCkgewotCQkJcmVtYWluaW5nID0gMDsKLQkJfQotCQlyZXR1cm4gcmVtYWluaW5nOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZURlZmF1bHRDb25maWd1cmF0aW9uTmVlZGVkKCkgewotCQlyZXR1cm4gIXN5bmNocm9uaXplOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CQkKLQkJLy8gQnVzeUluZGljYXRvci5zaG93V2hpbGUoRGlzcGxheS5nZXRDdXJyZW50KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJLy8JCQkKLQkJLy8gcHVibGljIHZvaWQgcnVuKCkgewotCQkvLyBjYW5jZWxlZCA9ICFhZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKCk7Ci0JCS8vIH0KLQkJLy8JCQkKLQkJLy8gfSk7Ci0JCS8vCQkKLQkJLy8gLy9UT0RPOiBUaGlzIGNhdXNlZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBvciBUaHJlYWRBY2Nlc3NFcnJvciB3aGVuCi0JCS8vIHNob3dpbmcgc2VsZWN0aW9uIGRpYWxvZyBpcyBuZWVkZWQKLQkJLy8gLy8KLQkJLy8gSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJLy8KLQkJLy8gcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzCi0JCS8vIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJLy8gY2FuY2VsZWQgPSAhcHJlRXhlY3V0ZSgpOwotCQkvLyB9Ci0JCS8vCQkJCi0JCS8vIH07Ci0JCS8vIFVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIG51bGwpOwotCQkvLwkJCi0JCS8vIGlmKCFjYW5jZWxlZCkgewotCQkvLyBCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkvLwkJCQkKLQkJLy8gcHVibGljIHZvaWQgcnVuKCkgewotCQkvLyByZWRvKCk7Ci0JCS8vIH0KLQkJLy8JCQkJCi0JCS8vIH0pOwotCQkvLyB9Ci0KLS8vCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgbmV3IFJ1bm5hYmxlKCkgewotLy8KLS8vCQkJcHVibGljIHZvaWQgcnVuKCkgewotLy8JCQkJaWYgKCghc3luY2hyb25pemUgJiYgYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbigpKSAmJiBwcmVFeGVjdXRlKCkpIHsKLS8vCQkJCQlyZWRvKCk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCi0vLwkJfSk7Ci0JCQotCQlpZih1cGRhdGVEZWZhdWx0Q29uZmlndXJhdGlvbk5lZWRlZCgpKSB7Ci0JCQlpZighY29sbGVjdEVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJZmluYWwgU3RyaW5nIHRhc2tOYW1lID0gKGxhYmVsID09IG51bGwgPyAiIiA6IGxhYmVsKTsgLy8kTk9OLU5MUy0xJAotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKHRhc2tOYW1lLCBnZXRUb3RhbFdvcmsoKSk7Ci0JCQkJCUJTRHJvcENvbW1hbmQudGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQkJCQkJd29ya2VkKGdldFJlbWFpbmluZ1dvcmsoKSAvIDMpOwotCQkJCQkKLQkJCQkJLy8gdGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgcHJlRXhlY3V0ZSgpIHRvIGFkZCByZXF1aXJlZCBlbGVtZW50cyB0byBjb25maWd1cmF0aW9uCi0JCQkJCS8vIHNvIHRoZSBjb21tYW5kIGNhbiByZWFsaXplIGRhdGEgY29ycmVjdGx5Ci0JCQkJCS8vCi0JCQkJCWFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJd29ya2VkKGdldFJlbWFpbmluZ1dvcmsoKSAvIDMpOwotCQkJCQkKLQkJCQkJaWYgKHByZUV4ZWN1dGUoKSkgewotCQkJCQkJd29ya2VkKGdldFJlbWFpbmluZ1dvcmsoKSAvIDMpOwotCQkJCQkJcmVkbygpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJaWYocnVuQXNKb2IpIHsKLQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5Bc0pvYihydW5uYWJsZSwgdGFza05hbWUpOwotCQl9Ci0JCWVsc2UgewotLy8JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuSW5VSShydW5uYWJsZSwgKFNoZWxsKW51bGwpOwotCQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgbnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgZ2V0TmVzdGVkQ29tbWFuZHMoKSB7Ci0JCWlmKG5lc3RlZENvbW1hbmRzID09IG51bGwpIHsKLQkJCW5lc3RlZENvbW1hbmRzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBuZXN0ZWRDb21tYW5kczsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCkgewotCQlMaXN0IG5lc3RlZENvbW1hbmRQcm92aWRlcnMgPSBFeHRlbnNpb25NYW5hZ2VyLmdldE5lc3RlZENvbW1hbmRQcm92aWRlcnMoKTsKLQkJaWYoIW5lc3RlZENvbW1hbmRQcm92aWRlcnMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXN0ZWRDb21tYW5kUHJvdmlkZXJzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJSU5lc3RlZENvbW1hbmRQcm92aWRlciBjbWRQcm92aWRlciA9IChJTmVzdGVkQ29tbWFuZFByb3ZpZGVyKSBpdGVyLm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQlDb21tYW5kIGNtZCA9IGNtZFByb3ZpZGVyLmNyZWF0ZU5lc3RlZENvbW1hbmQodGhpcyk7Ci0JCQkJCWlmKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsJCQkJCQkJCi0JCQkJCQljbWQuZXhlY3V0ZSgpOwotCQkJCQkJZ2V0TmVzdGVkQ29tbWFuZHMoKS5hZGQoY21kKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9CQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1bmRvTmVzdGVkQ29tbWFuZHMoKSB7Ci0JCWlmKG5lc3RlZENvbW1hbmRzICE9IG51bGwgJiYgIW5lc3RlZENvbW1hbmRzLmlzRW1wdHkoKSkgewotCQkJZm9yKGludCBpID0gbmVzdGVkQ29tbWFuZHMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlDb21tYW5kIGNtZCA9IChDb21tYW5kKSBuZXN0ZWRDb21tYW5kcy5nZXQoaSk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYoY21kLmNhblVuZG8oKSkgewotCQkJCQkJY21kLnVuZG8oKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQl0cnkgeyBjbWQuZGlzcG9zZSgpOyB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7fQotCQkJCX0KLQkJCX0KLQkJCW5lc3RlZENvbW1hbmRzLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCXRyeSB7Ci0JCQkvLyBhZGQgZWxlbWVudHMgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBuZWVkZWQKLQkJCS8vCi0JCQlhZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKCk7Ci0JCQkKLQkJCWRvRXhlY3V0ZSgpOwotCQkJdXBkYXRlRGVzY3JpcHRvcnMoKTsKLQkJCQotCQkJZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCk7Ci0JCQkKLQkJCWV4ZWN1dGVkID0gdHJ1ZTsKLQkJfQotCQljYXRjaChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBkZXNjcmlwdG9ycwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlc2NyaXB0b3JzKCkgewotCQlpZiAoc3luY2hyb25pemUpIHsKLQkJCWNsZWFyRGVzY3JpcHRvcnMoKTsKLQkJfQotCi0JCS8vIHVwZGF0ZSBuZXcgdmFsdWVzOwotCQkvLwotCQliYXRjaENvbW1hbmQuZXhlY3V0ZSgpOwotCQkKLQkJdXBkYXRlVGFza0Rlc2NyaXB0b3JzKCk7Ci0KLQkJc2V0UmVzcG9uc2libGVSb2xlcygpOwotCX0KLQotLy8JLyoqCi0vLwkgKiBAcGFyYW0gZGVzYwotLy8JICogQHBhcmFtIGZlYXR1cmUKLS8vCSAqIEBwYXJhbSB2YWx1ZQotLy8JICovCi0vLwlwcm90ZWN0ZWQgdm9pZCBzYXZlT2xkRmVhdHVyZVZhbHVlKERlc2NyaXB0b3IgZGVzYywKLS8vCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vCQlpZiAoZGVzY3JpcHRvclRvT2xkRmVhdHVyZVZhbHVlc01hcCA9PSBudWxsKSB7Ci0vLwkJCWRlc2NyaXB0b3JUb09sZEZlYXR1cmVWYWx1ZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotLy8JCX0KLS8vCQlPYmplY3QgdmFsdWUgPSBkZXNjLmVHZXQoZmVhdHVyZSk7Ci0vLwkJaWYoZmVhdHVyZS5pc01hbnkoKSkgewotLy8JCQl2YWx1ZSA9IG5ldyBBcnJheUxpc3QoKExpc3QpdmFsdWUpOwotLy8JCX0KLS8vCQlNYXAgZmVhdHVyZU1hcCA9IChNYXApIGRlc2NyaXB0b3JUb09sZEZlYXR1cmVWYWx1ZXNNYXAuZ2V0KGRlc2MpOwotLy8JCWlmIChmZWF0dXJlTWFwID09IG51bGwpIHsKLS8vCQkJZmVhdHVyZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0vLwkJCWRlc2NyaXB0b3JUb09sZEZlYXR1cmVWYWx1ZXNNYXAucHV0KGRlc2MsIGZlYXR1cmVNYXApOwotLy8JCX0KLS8vCQlmZWF0dXJlTWFwLnB1dChmZWF0dXJlLCB2YWx1ZSk7Ci0vLwl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1bmRvVXBkYXRlRGVzY3JpcHRvcnMoKSB7Ci0JCXVuZG9TZXRSZXNwb25zaWJsZVJvbGUoKTsKLQotCQl1bmRvVXBkYXRlVGFza0Rlc2NyaXB0b3JzKCk7Ci0KLQkJLy8gcmVzdG9yZSBvbGQgdmFsdWVzCi0JCS8vCi0JCWJhdGNoQ29tbWFuZC51bmRvKCk7Ci0KLQkJLy8gcmVzdG9yZSB2YWx1ZSBmb3IgcmVmcmVzaGFibGUgZmVhdHVyZXMgdGhhdCBoYWQgYmVlbiBjbGVhcmVkCi0JCS8vCi0JCWlmIChzeW5jaHJvbml6ZSkgewotCQkJdW5kb0NsZWFyRGVzY3JpcHRvcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjbGVhckRlc2NyaXB0b3JzKCkgewotCQlpZiAoZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcCA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWlmICghYmF0Y2hDb21tYW5kLmdldERlc2NyaXB0b3JzVG9SZWZyZXNoKCkuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYmF0Y2hDb21tYW5kLmdldERlc2NyaXB0b3JzVG9SZWZyZXNoKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJY2xlYXJEZXNjcmlwdG9yKChEZXNjcmlwdG9yKSBpdGVyLm5leHQoKSk7Ci0JCQkJfQotCQkJCS8vIGRlc2NyaXB0b3JzVG9SZWZyZXNoLmNsZWFyKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIGFmZmVjdGVkIHRhc2sgZGVzY3JpcHRvcnMgd2l0aCBuZXcgZGF0YSBmcm9tIG1ldGhvZCBjb250ZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVRhc2tEZXNjcmlwdG9ycygpIHsKLQkJaWYgKHRhc2tEZXNjcmlwdG9yc1RvVXBkYXRlICE9IG51bGwpIHsKLQkJCS8vIHJlZnJlc2ggc3RlcHMgZnJvbSB0aGUgYXNzb2NpYXRlZCB0YXNrCi0JCQkvLwotCQkJaWYoc3luY2hGZWF0dXJlcy5jb250YWlucyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1N0ZXBzKCkpKSB7Ci0JCQkJaWYgKHRhc2tEZXNjVG9OZXdTdGVwc01hcCA9PSBudWxsKSB7Ci0JCQkJCXRhc2tEZXNjVG9OZXdTdGVwc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJfQotCQkJCUlDb25maWd1cmF0aW9uQXBwbGljYXRvciBjb25maWdBcHBsaWNhdG9yID0gUHJvdmlkZXJzCi0JCQkJLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFza0Rlc2NyaXB0b3JzVG9VcGRhdGUuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJVGFzayB0YXNrID0gdGFza0Rlc2MuZ2V0VGFzaygpOwotCQkJCQlpZiAodGFzayAhPSBudWxsICYmICEoKEVPYmplY3QpIHRhc2spLmVJc1Byb3h5KCkpIHsKLQkJCQkJCUxpc3Qgc3RlcHMgPSAoTGlzdCkgY29uZmlnQXBwbGljYXRvci5nZXRSZWZlcmVuY2UodGFzawotCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIHRhc2ssIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKSwgY29uZmlnKTsKLQkJCQkJCQotCQkJCQkJLy8gYWRkIHRob3NlIHN0ZXBzIHRvIFRhc2tEZXNjcmlwdG9yIGlmIHRoZXkgYXJlIG5vdCB0aGVyZQotCQkJCQkJLy8geWV0LgotCQkJCQkJLy8KLQkJCQkJCUFycmF5TGlzdCBuZXdTdGVwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCXRhc2tEZXNjLmdldFNlbGVjdGVkU3RlcHMoKS5yZXRhaW5BbGwoc3RlcHMpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IHN0ZXBzLml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3Qgc3RlcCA9IGl0ZXIxLm5leHQoKTsKLQkJCQkJCQlpZiAoIXRhc2tEZXNjLmdldFNlbGVjdGVkU3RlcHMoKS5jb250YWlucyhzdGVwKSkgewotCQkJCQkJCQluZXdTdGVwcy5hZGQoc3RlcCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKCFuZXdTdGVwcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQl0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkuYWRkQWxsKG5ld1N0ZXBzKTsKLQkJCQkJCQl0YXNrRGVzY1RvTmV3U3RlcHNNYXAucHV0KHRhc2tEZXNjLCBuZXdTdGVwcyk7Ci0vLwkJCQkJCQlTeXN0ZW0ub3V0Ci0vLwkJCQkJCQkucHJpbnRsbigiQlNEcm9wQ29tbWFuZC51cGRhdGVUYXNrRGVzY3JpcHRvcnMoKTogY2hhbmdlZCIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5kb1VwZGF0ZVRhc2tEZXNjcmlwdG9ycygpIHsKLQkJaWYgKHRhc2tEZXNjVG9OZXdTdGVwc01hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXNrRGVzY1RvTmV3U3RlcHNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIGVudHJ5LmdldEtleSgpOwotCQkJCXRhc2tEZXNjLmdldFNlbGVjdGVkU3RlcHMoKS5yZW1vdmVBbGwoCi0JCQkJCQkoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHbyB0aHJ1IGFsbCB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIG9mIHRoaXMgYWN0aXZpdHkgYW5kIHNldCB0aGUKLQkgKiByZXNwb25zaWJsZSByb2xlIGZvciB0aGVtIGlmIHRoZXJlIGlzIGFueQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRSZXNwb25zaWJsZVJvbGVzKCkgewotCQlpZighc3luY2hGZWF0dXJlcy5jb250YWlucyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmKHJlZnJlc2hSZXNwb25zaWJsZUZvckNvbW1hbmQgIT0gbnVsbCkgewotCQkJcmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZC5kaXNwb3NlKCk7Ci0JCX0KLQkJcmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZCA9IG5ldyBCYXRjaENvbW1hbmQodHJ1ZSk7Ci0gCi0JCUxpc3QgYnJFbGVtZW50cyA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCUxpc3Qgd3BEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCByb2xlRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGJyRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJd3BEZXNjTGlzdC5hZGQob2JqKTsKLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQlyb2xlRGVzY3JpcHRvcnMuYWRkKG9iaik7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSByb2xlRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgaXRvci5uZXh0KCk7Ci0JCQlSb2xlIHJvbGUgPSByb2xlRGVzYy5nZXRSb2xlKCk7Ci0JCQlpZiAocm9sZSAhPSBudWxsKSB7CQkJCQotCQkJCUxpc3QgcmVzcG9uc2libGVXb3JrUHJvZHVjdHMgPSAoTGlzdCkgUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkuZ2V0UmVmZXJlbmNlKHJvbGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwgY29uZmlnKTsKLQkJCQlMaXN0IHJlc3BvbnNpYmxlV1BETGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKGludCBqID0gd3BEZXNjTGlzdC5zaXplKCkgLSAxOyBqID4gLTE7IGotLSkgewotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgd3BEZXNjTGlzdAotCQkJCQkJCS5nZXQoaik7Ci0vLwkJCQkJUm9sZURlc2NyaXB0b3IgcmVzcG9uc2libGVSb2xlRGVzYyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFJlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3Iod3BEZXNjKTsKLS8vCQkJCQlpZiAocmVzcG9uc2libGVXb3JrUHJvZHVjdHMuY29udGFpbnMod3BEZXNjCi0vLwkJCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKSkKLS8vCQkJCQkJCSYmICByZXNwb25zaWJsZVJvbGVEZXNjICE9IHJvbGVEZXNjKSB7Ci0vLwkJCQkJCXdwZFRvT2xkUmVzcG9uc2libGVSb2xlTWFwLnB1dCh3cERlc2MsIHJlc3BvbnNpYmxlUm9sZURlc2MpOwotLy8vLwkJCQkJCXdwRGVzYy5zZXRSZXNwb25zaWJsZVJvbGUocm9sZURlc2MpOwotLy8JCQkJCQlyb2xlRGVzYy5nZXRSZXNwb25zaWJsZUZvcigpLmFkZCh3cERlc2MpOwotLy8JCQkJCX0KLQkJCQkJCi0JCQkJCWlmKHJlc3BvbnNpYmxlV29ya1Byb2R1Y3RzLmNvbnRhaW5zKHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpKSkgewotCQkJCQkJcmVzcG9uc2libGVXUERMaXN0LmFkZCh3cERlc2MpOwotCQkJCQl9Ci0JCQkJfQkJCQkKLQkJCQlpZighcm9sZURlc2MuZ2V0UmVzcG9uc2libGVGb3IoKS5lcXVhbHMocmVzcG9uc2libGVXUERMaXN0KSkgewotCQkJCQlyZWZyZXNoUmVzcG9uc2libGVGb3JDb21tYW5kLmFkZEZlYXR1cmVWYWx1ZXMocm9sZURlc2MsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCksIHJlc3BvbnNpYmxlV1BETGlzdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZWZyZXNoUmVzcG9uc2libGVGb3JDb21tYW5kLmV4ZWN1dGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJdW5kb05lc3RlZENvbW1hbmRzKCk7Ci0JCQotCQkvLyByZW1vdmUgYW55IG9iamVjdCB0aGF0IGhhZCBiZWVuIGFkZGVkIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkJLy8KLQkJaWYgKGFkZGVkT2JqZWN0cyAhPSBudWxsICYmICFhZGRlZE9iamVjdHMuaXNFbXB0eSgpKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZGVkT2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLnJlbW92ZShlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQlhZGRlZFRvRGVmYXVsdENvbmZpZyA9IGZhbHNlOwotCQl9Ci0KLQkJdW5kb1VwZGF0ZURlc2NyaXB0b3JzKCk7Ci0KLQkJZG9VbmRvKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVuZG9DbGVhckRlc2NyaXB0b3JzKCkgewotCQlpZihkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAuZW50cnlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJRGVzY3JpcHRvciBkZXNjID0gKERlc2NyaXB0b3IpIGVudHJ5LmdldEtleSgpOwotCQkJCU1hcCBmZWF0dXJlTWFwID0gKE1hcCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZmVhdHVyZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWRlc2MKLQkJCQkJLmVTZXQoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZW50cnkuZ2V0S2V5KCksIGVudHJ5Ci0JCQkJCQkJLmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFVuZG9lcyB0aGUgY2hhbmdlIG1hZGUgYnkKLQkgKiB7QGxpbmsgI3NldFJlc3BvbnNpYmxlUm9sZXMoKSBzZXRSZXNwb25zaWJsZVJvbGVzKCkgfQotCSAqLwotCXByaXZhdGUgdm9pZCB1bmRvU2V0UmVzcG9uc2libGVSb2xlKCkgewotLy8JCWlmKHdwZFRvT2xkUmVzcG9uc2libGVSb2xlTWFwICE9IG51bGwgJiYgIXdwZFRvT2xkUmVzcG9uc2libGVSb2xlTWFwLmlzRW1wdHkoKSkgewotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cGRUb09sZFJlc3BvbnNpYmxlUm9sZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotLy8JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5LmdldEtleSgpOwotLy8JCQkJKChSb2xlRGVzY3JpcHRvcikgZW50cnkuZ2V0VmFsdWUoKSkuZ2V0UmVzcG9uc2libGVGb3IoKS5yZW1vdmUod3BkKTsKLS8vCQkJfQotLy8JCX0KLQkJaWYocmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQlyZWZyZXNoUmVzcG9uc2libGVGb3JDb21tYW5kLnVuZG8oKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb0V4ZWN1dGUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvVW5kbygpOwotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSUV4ZWN1dG9yIHsKLQkJYm9vbGVhbiBwcmVFeGVjdXRlKCk7Ci0KLQkJdm9pZCBkb0V4Y2VjdXRlKCk7Ci0KLQkJdm9pZCBkb1VuZG8oKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Jhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9CYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmFiNWJlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Jhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSA3LjAKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZAotCQlpbXBsZW1lbnRzIElSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTZXQgTk9ORU1QVFlfQVRUUklCVVRFUyA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QoCi0JCQluZXcgRVN0cnVjdHVyYWxGZWF0dXJlW10gewotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpCi0JCQl9Ci0JKSk7Ci0JCi0KLQlwcm90ZWN0ZWQgRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCXByb3RlY3RlZCBTZXQgc3luY2hGZWF0dXJlczsKLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZlYXR1cmVNYXA7Ci0KLQlwdWJsaWMgQmFzaWNTeW5jaHJvbml6ZURlc2NyaXB0b3JDb21tYW5kKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgU2V0IHN5bmNoRmVhdHVyZXMsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0JCWlmIChzeW5jaEZlYXR1cmVzID09IG51bGwpIHsKLQkJCXRoaXMuc3luY2hGZWF0dXJlcyA9IEJTRHJvcENvbW1hbmQuREVGQVVMVF9TWU5DSF9GRUFUVVJFUzsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuc3luY2hGZWF0dXJlcyA9IHN5bmNoRmVhdHVyZXM7Ci0JCX0KLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZihkZXNjcmlwdG9yLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGRlc2NyaXB0b3IuZVJlc291cmNlKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2F2ZU9sZEZlYXR1cmVWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoZmVhdHVyZU1hcCA9PSBudWxsKSB7Ci0JCQlmZWF0dXJlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlmZWF0dXJlTWFwLnB1dChmZWF0dXJlLCBkZXNjcmlwdG9yLmVHZXQoZmVhdHVyZSkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gdXBkYXRlIHRoZSBsaW5rZWQgZWxlbWVudCBpZiByZXF1aXJlZAotCQkvLwotCQlNZXRob2RFbGVtZW50IGUgPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJT2JqZWN0IHJlc29sdmVkID0gUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkucmVzb2x2ZShlLCBjb25maWcpOwotCQlpZihyZXNvbHZlZCAhPSBlKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQkJCWlmKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCWZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCk7CQkJCQkKLQkJCX0KLQkJCWVsc2UgaWYoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCWZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKTsJCQkJCQotCQkJfQotCQkJZWxzZSBpZihkZXNjcmlwdG9yIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQlmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpOwkJCQkJCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmZWF0dXJlID0gbnVsbDsKLQkJCX0KLQkJCXNhdmVPbGRGZWF0dXJlVmFsdWUoZmVhdHVyZSk7Ci0JCQllID0gKE1ldGhvZEVsZW1lbnQpIHJlc29sdmVkOwotCQkJZGVzY3JpcHRvci5lU2V0KGZlYXR1cmUsIGUpOwotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzeW5jaEZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGYgPSBpdGVyLm5leHQoKTsKLQkJCWlmKGYgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSB7Ci0JCQkJRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSkgZjsgCi0JCQkJRUF0dHJpYnV0ZSBkZXNjQXR0cmliID0gKEVBdHRyaWJ1dGUpIEJTRHJvcENvbW1hbmQuRkVBVFVSRV9NQVAuZ2V0KGF0dHJpYik7Ci0JCQkJaWYoZGVzY0F0dHJpYiAhPSBudWxsKSB7Ci0JCQkJCWlmKE5PTkVNUFRZX0FUVFJJQlVURVMuY29udGFpbnMoYXR0cmliKSkgewotCQkJCQkJLy8gcmVmcmVzaCBhdHRyaWJ1dGUgdGhhdCBjYW4gbm90IGJlIGVtcHR5Ci0JCQkJCQkvLwotCQkJCQkJT2JqZWN0IHZhbHVlID0gIGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgPyAKLQkJCQkJCQkJKFN0cmluZykgUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkuZ2V0QXR0cmlidXRlKChWYXJpYWJpbGl0eUVsZW1lbnQpIGUsIGF0dHJpYiwgY29uZmlnKSAKLQkJCQkJCQkJOiBlLmVHZXQoYXR0cmliKTsKLQkJCQkJCS8vIGlmIGF0dHJpdWJ1dGUgaXMgcHJlc2VudGF0aW9uIG5hbWUgYW5kIG5ldyB2YWx1ZSBpcyBibGFuaywgY29weSBuYW1lIG92ZXIKLQkJCQkJCWlmICgoZGVzY0F0dHJpYi5lcXVhbHMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSkpICYmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmVxdWFscygiIikpKQotCQkJCQkJCXZhbHVlID0gZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCA/IAotCQkJCQkJCQkJKFN0cmluZykgUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkuZ2V0QXR0cmlidXRlKChWYXJpYWJpbGl0eUVsZW1lbnQpIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIGNvbmZpZykgCi0JCQkJCQkJCQk6IGUuZUdldChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJCQkJCU9iamVjdCBkZXNjVmFsdWUgPSBkZXNjcmlwdG9yLmVHZXQoZGVzY0F0dHJpYik7Ci0JCQkJCQotCQkJCQkJaWYoKHZhbHVlID09IG51bGwgJiYgZGVzY1ZhbHVlICE9IG51bGwpIHx8ICh2YWx1ZSAhPSBudWxsICYmICF2YWx1ZS5lcXVhbHMoZGVzY1ZhbHVlKSkpIHsKLQkJCQkJCQlzYXZlT2xkRmVhdHVyZVZhbHVlKGRlc2NBdHRyaWIpOwotCQkJCQkJCWRlc2NyaXB0b3IuZVNldChkZXNjQXR0cmliLCB2YWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyByZXNldCBhdHRyaWJ1dGUgdG8gaXRzIGRlZmF1bHQgdmFsdWUKLQkJCQkJCS8vCi0JCQkJCQlzYXZlT2xkRmVhdHVyZVZhbHVlKGRlc2NBdHRyaWIpOwotCQkJCQkJZGVzY3JpcHRvci5lU2V0KGRlc2NBdHRyaWIsIGRlc2NBdHRyaWIuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYoZmVhdHVyZU1hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZmVhdHVyZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGVudHJ5Ci0JCQkJLmdldEtleSgpOwotCQkJCXRyeSB7Ci0JCQkJCWRlc2NyaXB0b3IuZVNldChmZWF0dXJlLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQkJY2F0Y2goUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJfQkKLQkJCWZlYXR1cmVNYXAuY2xlYXIoKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKGZlYXR1cmVNYXAgIT0gbnVsbCkgewotCQkJZmVhdHVyZU1hcC5jbGVhcigpOwotCQkJZmVhdHVyZU1hcCA9IG51bGw7Ci0JCX0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Db250cmlidXRlVG9BY3Rpdml0eUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQ29udHJpYnV0ZVRvQWN0aXZpdHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiODUyYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Db250cmlidXRlVG9BY3Rpdml0eUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMTAsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRyaWJ1dGVUb0FjdGl2aXR5Q29tbWFuZCBleHRlbmRzIFZhcnlBY3Rpdml0eUNvbW1hbmQgewotCi0JLyoqCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKi8KLQlwdWJsaWMgQ29udHJpYnV0ZVRvQWN0aXZpdHlDb21tYW5kKAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQlzdXBlcih3cmFwcGVyKTsKLQkJc2V0TGFiZWwoTGlicmFyeUVkaXRSZXNvdXJjZXMuY29udHJpYnV0ZVRvQWN0aXZpdHlfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5WYXJ5QWN0aXZpdHlDb21tYW5kI2RvVmFyeSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9WYXJ5KCkgewotCQlQcm9jZXNzVXRpbC5jb250cmlidXRlVG9BY3Rpdml0eSh3cmFwcGVyLCBjcmVhdGVkQWN0aXZpdGllcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0NvcHlIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQ29weUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NzY2ZWZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQ29weUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQ29weUhlbHBlciBleHRlbmRzIENvcHlDb21tYW5kLkhlbHBlciB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1MjY0Mzg5MzkzOTU1NjM5MDA0TDsKLQotCXByaXZhdGUgTWFwIGNvcHlUb09yaWdpbmFsTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwcml2YXRlIE1hcCBiYXNlVG9WYXJpYWJpbGl0eUVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgTWFwIGJhc2VUb0JhY2t1cFZhcmlhYmlsaXR5RWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS51dGlsLkhhc2hNYXAjY2xlYXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewkJCi0JCXN1cGVyLmNsZWFyKCk7Ci0JCWNvcHlUb09yaWdpbmFsTWFwLmNsZWFyKCk7Ci0JCWJhc2VUb0JhY2t1cFZhcmlhYmlsaXR5RWxlbWVudE1hcC5jbGVhcigpOwotCQliYXNlVG9WYXJpYWJpbGl0eUVsZW1lbnRNYXAuY2xlYXIoKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRPcmlnaW5hbChPYmplY3QgY29weSkgewotCQlyZXR1cm4gY29weVRvT3JpZ2luYWxNYXAuZ2V0KGNvcHkpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IHB1dFZhcmlhYmlsaXR5RWxlbWVudChWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSwgVmFyaWFiaWxpdHlFbGVtZW50IHZlKSB7Ci0JCXJldHVybiBiYXNlVG9WYXJpYWJpbGl0eUVsZW1lbnRNYXAucHV0KGJhc2UsIHZlKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCByZW1vdmVWYXJpYWJpbGl0eUVsZW1lbnQoVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UpIHsKLQkJcmV0dXJuIGJhc2VUb1ZhcmlhYmlsaXR5RWxlbWVudE1hcC5yZW1vdmUoYmFzZSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgcHV0QmFja3VwQ29weShWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSwgVmFyaWFiaWxpdHlFbGVtZW50IGJhY2t1cCkgewotCQlyZXR1cm4gYmFzZVRvQmFja3VwVmFyaWFiaWxpdHlFbGVtZW50TWFwLnB1dChiYXNlLCBiYWNrdXApOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyI3B1dChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotCQljb3B5VG9PcmlnaW5hbE1hcC5wdXQodmFsdWUsIGtleSk7Ci0JCXJldHVybiBzdXBlci5wdXQoa2V5LCB2YWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgYmFzaWNQdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCU9iamVjdCBvbGQgPSBzdXBlci5wdXQoa2V5LCB2YWx1ZSk7Ci0JCWluaXRpYWxpemF0aW9uTGlzdC5yZW1vdmUoa2V5KTsKLQkJcmV0dXJuIG9sZDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXIjZ2V0Q29weShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRDb3B5KEVPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJT2JqZWN0IHZlID0gZ2V0VmFyaWFiaWxpdHlFbGVtZW50KGJhc2VUb1ZhcmlhYmlsaXR5RWxlbWVudE1hcCwgb2JqZWN0KTsKLQkJCWlmKHZlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0Q29weSgoRU9iamVjdCkgdmUpOwotCQkJfQotCQl9Ci0JCUVPYmplY3QgY29weSA9IHN1cGVyLmdldENvcHkob2JqZWN0KTsKLQkJaWYoY29weSA9PSBudWxsKSB7Ci0JCQkvLyBnZXQgYmFja3VwIGNvcHkKLQkJCS8vCi0JCQlPYmplY3QgdmUgPSBnZXRWYXJpYWJpbGl0eUVsZW1lbnQoYmFzZVRvQmFja3VwVmFyaWFiaWxpdHlFbGVtZW50TWFwLCBvYmplY3QpOwotCQkJaWYodmUgIT0gbnVsbCkgewotCQkJCXJldHVybiBzdXBlci5nZXRDb3B5KChFT2JqZWN0KSB2ZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvcHk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIE9iamVjdCBnZXRWYXJpYWJpbGl0eUVsZW1lbnQoTWFwIGJhc2VUb1ZhcmlhYmlsaXR5RWxlbWVudE1hcCwgT2JqZWN0IGJhc2UpIHsKLQkJT2JqZWN0IHZlID0gbnVsbDsJCQotCQlkbyB7Ci0JCQliYXNlID0gYmFzZVRvVmFyaWFiaWxpdHlFbGVtZW50TWFwLmdldChiYXNlKTsKLQkJCWlmKGJhc2UgIT0gbnVsbCkgewotCQkJCXZlID0gYmFzZTsKLQkJCX0KLQkJfSB3aGlsZSAoYmFzZSAhPSBudWxsKTsKLQkJcmV0dXJuIHZlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlciNnZXRDb3B5VGFyZ2V0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldENvcHlUYXJnZXQoRU9iamVjdCB0YXJnZXQsIGJvb2xlYW4gY29weVJlcXVpcmVkKSB7Ci0JCWlmKGNvcHlSZXF1aXJlZCkgewotCQkJcmV0dXJuIHN1cGVyLmdldENvcHkodGFyZ2V0KTsKLQkJfQotCQllbHNlIHsKLQkJCUVPYmplY3QgY29waWVkID0gZ2V0Q29weSh0YXJnZXQpOwotCQkJaWYgKGNvcGllZCA9PSBudWxsKQotCQkJewotCQkJCXJldHVybiB0YXJnZXQ7Ci0JCQl9Ci0JCQlyZXR1cm4gY29waWVkOwotCQl9Ci0JfQotCQotCXB1YmxpYyBNYXAgZ2V0T2JqZWN0VG9Db3B5TWFwKCkgewotCQlIYXNoU2V0IG9iamVjdHMgPSBuZXcgSGFzaFNldChiYXNlVG9CYWNrdXBWYXJpYWJpbGl0eUVsZW1lbnRNYXAua2V5U2V0KCkpOwotCQlvYmplY3RzLmFkZEFsbChiYXNlVG9WYXJpYWJpbGl0eUVsZW1lbnRNYXAua2V5U2V0KCkpOwotCQlvYmplY3RzLmFkZEFsbChrZXlTZXQoKSk7CQkKLQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlci5uZXh0KCk7Ci0JCQltYXAucHV0KG9iamVjdCwgZ2V0Q29weSgoRU9iamVjdCkgb2JqZWN0KSk7Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9DcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9DcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZGFmMmZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuVXNlcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLlByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXNzZW5nZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuTWVzc2FnZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi0vKioKLSAqIEV4ZWN1dGVzIHRoZSBDcmVhdGUgUHJvY2VzcyBDb21wb25lbnQgY29tbWFuZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kIGV4dGVuZHMgQ3JlYXRlQ2hpbGRDb21tYW5kIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gRUNMQVNTRVMgPSBuZXcgSGFzaFNldCgpOwotCi0JcHJpdmF0ZSBQcm9jZXNzIHByb2Nlc3M7Ci0KLQlwcml2YXRlIElTdGF0dXMgc3RhdHVzOwotCi0Jc3RhdGljIHsKLQkJRUNMQVNTRVMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2UoKSk7Ci0JfQotCi0JcHVibGljIGNsYXNzIENvbXBhcmVCeU5hbWUgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG9iajEsIE9iamVjdCBvYmoyKSB7Ci0JCQlTdHJpbmcgbmFtZTEgPSAoKE1ldGhvZEVsZW1lbnQpIG9iajEpLmdldE5hbWUoKTsKLQkJCVN0cmluZyBuYW1lMiA9ICgoTWV0aG9kRWxlbWVudCkgb2JqMikuZ2V0TmFtZSgpOwotCQkJcmV0dXJuIG5hbWUxLmNvbXBhcmVUb0lnbm9yZUNhc2UobmFtZTIpOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIENvbmZpZ1ZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IgewotCi0JCXB1YmxpYyBJU3RhdHVzIGlzVmFsaWQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLm5vRGVmYXVsdENvbmZpZ0Vycm9yX21zZzsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRJZCgpLCAwLCBtc2csIG51bGwpOwotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5hbWUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBjaGlsZCwgaW50IGluZGV4LAotCQkJQ29sbGVjdGlvbiBzZWxlY3Rpb24sIEhlbHBlciBoZWxwZXIpIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY2hpbGQsIGluZGV4LCBzZWxlY3Rpb24sIGhlbHBlcik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KG93bmVyKTsKLQkJCi0JCVNoZWxsIHNoZWxsID0gTXNnQm94LmdldERlZmF1bHRTaGVsbCgpOwotCQkKLQkJLy8gVGhlIG93bmVyIG11c3QgYmUgdXBkYXRhYmxlLgotCQkvLwotCQlzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkob3duZXIsIHNoZWxsKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IGNvbmZpZ3MgPSBsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0JCUxpc3QgbWV0aG9kQ29uZmlncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29uZmlncy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0ZhbWlseSkpIHsKLQkJCQltZXRob2RDb25maWdzLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCWlmIChtZXRob2RDb25maWdzLmlzRW1wdHkoKSkgewotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwKLQkJCQkJCQkJMCwgTGlicmFyeUVkaXRSZXNvdXJjZXMubm9Db25maWdFcnJvcl9tc2csIG51bGwpOwotCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dFcnJvcigKLQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuY3JlYXRlUHJvY2Vzc190ZXh0LAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5ub0NvbmZpZ0Vycm9yX21zZyk7CQkJCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKSBoZWxwZXI7Ci0KLQkJTGlzdCBwcm9jQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGFkYXB0ZXIuZ2V0UHJvY2Vzc1R5cGUoKSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpKSB7Ci0JCQlwcm9jQ2xhc3Nlcy5hZGQoRGVsaXZlcnlQcm9jZXNzLmNsYXNzKTsKLQkJCXByb2NDbGFzc2VzLmFkZChDYXBhYmlsaXR5UGF0dGVybi5jbGFzcyk7Ci0JCX0KLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFbGVtZW50KSBvd25lcik7CQkKLQkJTGlzdCBiYXNlUHJvY0xpc3QgPSBUbmdVdGlsLmdldEF2YWlsYWJsZUJhc2VQcm9jZXNzZXMocGx1Z2luLAotCQkJCXByb2NDbGFzc2VzKTsKLQotCQkvLyBzb3J0IGJ5IG5hbWUKLQkJQ29sbGVjdGlvbnMuc29ydChtZXRob2RDb25maWdzLCBuZXcgQ29tcGFyZUJ5TmFtZSgpKTsKLQotCQlNZXRob2RDb25maWd1cmF0aW9uW10gcHJvY0N0eHMgPSBuZXcgTWV0aG9kQ29uZmlndXJhdGlvblttZXRob2RDb25maWdzCi0JCQkJLnNpemUoKV07Ci0JCW1ldGhvZENvbmZpZ3MudG9BcnJheShwcm9jQ3R4cyk7Ci0KLQkJUHJvY2Vzc1tdIGJhc2VQcm9jZXNzZXMgPSBuZXcgUHJvY2Vzc1tiYXNlUHJvY0xpc3Quc2l6ZSgpXTsKLQkJYmFzZVByb2NMaXN0LnRvQXJyYXkoYmFzZVByb2Nlc3Nlcyk7Ci0KLQkJZmluYWwgUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcCA9IChQcm9jZXNzQ29tcG9uZW50KSBjaGlsZDsKLQkJRUNsYXNzIHByb2NUeXBlID0gYWRhcHRlci5nZXRQcm9jZXNzVHlwZSgpOwotCQlwcm9jQ29tcC5zZXRQcm9jZXNzKChQcm9jZXNzKSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUocHJvY1R5cGUpKTsKLQkJCi0JCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJTGlzdCB1c2VySW5wdXRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVmFsaWRhdG9yIG5hbWVWYWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVOYW1lVmFsaWRhdG9yKAotCQkJCW93bmVyLCBwcm9jQ29tcCk7Ci0JCS8vIG5hbWUKLQkJVXNlcklucHV0IG5hbWVJbnB1dCA9IG5ldyBVc2VySW5wdXQoTGlicmFyeUVkaXRSZXNvdXJjZXMubmFtZUxhYmVsX3RleHQsIFVzZXJJbnB1dC5URVhULAotCQkJCWZhbHNlLCBudWxsLCBudWxsLCBuYW1lVmFsaWRhdG9yLCBudWxsKTsKLQkJdXNlcklucHV0cy5hZGQobmFtZUlucHV0KTsKLQkJCi0JCS8vIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCQkvLwotCQlVc2VySW5wdXQgZGVmYXVsdENvbmZpZ0lucHV0ID0gbmV3IFVzZXJJbnB1dChMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWZhdWx0Q29uZmlnTGFiZWxfdGV4dCwgVXNlcklucHV0LlNFTEVDVElPTiwKLQkJCQlmYWxzZSwgbWV0aG9kQ29uZmlncywgbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9LCBuZXcgQ29uZmlnVmFsaWRhdG9yKCksIG51bGwpOwotCQl1c2VySW5wdXRzLmFkZChkZWZhdWx0Q29uZmlnSW5wdXQpOwotCQkvLyBiYXNlIHByb2Nlc3MKLQkJVXNlcklucHV0IGJhc2VQcm9jSW5wdXQgPSBudWxsOwotCQkKLQkJaWYocHJvY0NvbXAuZ2V0UHJvY2VzcygpIGluc3RhbmNlb2YgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpIHsKLQkJCWJhc2VQcm9jSW5wdXQgPSBuZXcgVXNlcklucHV0KExpYnJhcnlFZGl0UmVzb3VyY2VzLmJhc2VkT25Qcm9jZXNzZXNMYWJlbF90ZXh0LCBVc2VySW5wdXQuU0VMRUNUSU9OLAotCQkJCQl0cnVlLCBiYXNlUHJvY0xpc3QsIG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpLCAgbnVsbCk7Ci0JCQl1c2VySW5wdXRzLmFkZChiYXNlUHJvY0lucHV0KTsKLQkJfQotCQkKLQkJYm9vbGVhbiBjYW5FeGVjdXRlID0gZmFsc2U7Ci0JCVN0cmluZyBtc2cgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5DcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZF9NZXNzYWdlLCAKLQkJCQlUbmdVdGlsLmdldFR5cGVUZXh0KHByb2NUeXBlLmdldE5hbWUoKSkudG9Mb3dlckNhc2UoKSk7Ci0JCQotCQkvLyByZXF1ZXN0IGlucHV0Ci0JCWlmICh1aUhhbmRsZXIucmVxdWVzdElucHV0KExpYnJhcnlFZGl0UmVzb3VyY2VzLm5ld1Byb2Nlc3NDb21wb25lbnREaWFsb2dfdGl0bGUsIAotCQkJCW1zZywgdXNlcklucHV0cykpIHsKLQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZUlucHV0LmdldElucHV0KCk7Ci0JCQlwcm9jQ29tcC5zZXROYW1lKG5hbWUpOwotCQkJcHJvY2VzcyA9IHByb2NDb21wLmdldFByb2Nlc3MoKTsKLQkJCXByb2Nlc3Muc2V0TmFtZShuYW1lKTsKLQkJCXByb2Nlc3Muc2V0UHJlc2VudGF0aW9uTmFtZShuYW1lKTsKLQkJCXByb2Nlc3Muc2V0RGVmYXVsdENvbnRleHQoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGRlZmF1bHRDb25maWdJbnB1dC5nZXRJbnB1dCgpKTsKLQkJCWlmKGJhc2VQcm9jSW5wdXQgIT0gbnVsbCkgewotCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBiYXNlUHJvY0lucHV0LmdldElucHV0KCk7Ci0JCQkJaWYoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCSgoUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpcHJvY0NvbXApLmdldEJhc2VkT25Qcm9jZXNzZXMoKS5hZGRBbGwobGlzdCk7Ci0JCQkJfQotCQkJfQotCQkJY2FuRXhlY3V0ZSA9IHRydWU7Ci0JCX0KLQotLy8JCWJvb2xlYW4gY2FuRXhlY3V0ZSA9IHRydWU7Ci0vLwkJTmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZyBkaWFsb2cgPSBuZXcgTmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZygKLS8vCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHByb2NDdHhzLCBwcm9jQ29tcCwKLS8vCQkJCWJhc2VQcm9jZXNzZXMsIHBsdWdpbiwgKFByb2Nlc3NQYWNrYWdlKSBvd25lcik7CQkJCQkJCi0vLwkJd2hpbGUgKHRydWUpIHsKLS8vCQkJaW50IHJldCA9IGRpYWxvZy5vcGVuKCk7Ci0vLwkJCWlmIChyZXQgPT0gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpIHsKLS8vCQkJCWNhbkV4ZWN1dGUgPSBmYWxzZTsKLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0vLwotLy8JCQlpZiAocHJvY0NvbXAuZ2V0UHJvY2VzcygpLmdldERlZmF1bHRDb250ZXh0KCkgPT0gbnVsbCkgewotLy8JCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dFcnJvcigKLS8vCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuY3JlYXRlUHJvY2Vzc190ZXh0LAotLy8JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5ub0RlZmF1bHRDb25maWdFcnJvcl9tc2cpOwotLy8JCQl9IGVsc2UgewotLy8JCQkJU3RyaW5nIG1zZyA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZU5hbWVWYWxpZGF0b3IoCi0vLwkJCQkJCW93bmVyLCBwcm9jQ29tcCkuaXNWYWxpZChwcm9jQ29tcC5nZXROYW1lKCkpOwotLy8JCQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0vLwkJCQkJcHJvY2VzcyA9IHByb2NDb21wLmdldFByb2Nlc3MoKTsKLS8vCQkJCQlicmVhazsKLS8vCQkJCX0gZWxzZSB7Ci0vLwkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dFcnJvcigKLS8vCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmNyZWF0ZVByb2Nlc3NfdGV4dCwKLS8vCQkJCQkJCW1zZyk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0KLQkJaWYgKGNhbkV4ZWN1dGUpIHsKLQkJCS8vIGNyZWF0ZSBwcm9jZXNzIGNvbXBvbmVudCBuZWVkIHRvIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiB0aGF0Ci0JCQkvLyBoYXMgYmVlbiBzZWxlY3RlZCBhcwotCQkJLy8gZGVmYXVsdCBjb250ZXh0IG9mIGl0cyBwcm9jZXNzLiBDaGVjayBpZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlCi0JCQkvLyBpcyB1cGRhdGFibGUKLQkJCS8vCi0JCQlzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkocHJvY0NvbXAuZ2V0UHJvY2VzcygpCi0JCQkJCS5nZXREZWZhdWx0Q29udGV4dCgpLCBzaGVsbCk7Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXN1cGVyLmV4ZWN1dGUoKTsKLQotCQkJQ29tbWFuZCBjbWQgPSBnZXRDb21tYW5kKCk7Ci0JCQlpZiAoY21kIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQpIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9ICgoTWV0aG9kRWxlbWVudEFkZENvbW1hbmQpIGNtZCkuZ2V0U3RhdHVzKCk7Ci0JCQkJaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCXRoaXMuc3RhdHVzID0gc3RhdHVzOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQlmaW5hbCBNZXRob2RDb25maWd1cmF0aW9uIHByb2NDdHggPSBwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQkKLQkJCS8vIG5lZWQgdG8gYWRkIHRoZSBwYXJlbnQgcGFja2FnZXMgYW5kIHBsdWdpbiBpbnRvIHRoZSBjb25maWd1cmF0aW9uCi0JCQkvLyBhcyB3ZWxsCi0JCQkvLyBOZXcgcHJvY2VzcyBpbiBuZXcgcGx1Zy1pbiBub3QgYXV0b21hdGljYWxseSB2aXNpYmxlIGluCi0JCQkvLyBjb25maWd1cmF0aW9uIHZpZXcKLQkJCUxpc3QgcGtncyA9IHByb2NDdHguZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQkJZm9yIChFT2JqZWN0IG9iaiA9IHByb2NDb21wOyBvYmogIT0gbnVsbDsgb2JqID0gb2JqLmVDb250YWluZXIoKSkgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCXBrZ3MuYWRkKG9iaik7Ci0JCQkJfQotCQkJfQotCQkJcHJvY0N0eC5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJCQotCQkJcHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKS5hZGQocHJvY0N0eCk7Ci0JCQlwcm9jZXNzLnNldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Ci0JCQkJCS5jcmVhdGVDb250ZW50RGVzY3JpcHRpb24ocHJvY2VzcykpOwotCi0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCS8vIHNhdmUgdGhlIHJlc291cmNlIG9mIHBhcmVudCBQcm9jZXNzUGFja2FnZQotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9ICgoRU9iamVjdCkgb3duZXIpLmVSZXNvdXJjZSgpOwotCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IFNlcnZpY2VzLmdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVyKCkKLQkJCQkJCQkJLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIHNhdmUgdGhlIHJlc291cmNlIG9mIG5ld2x5IGNyZWF0ZWQKLQkJCQkJCQkvLyBQcm9jZXNzQ29tcG9uZW50IGFnYWluIGFmdGVyIGNyZWF0aW5nIHByb2Nlc3MncwotCQkJCQkJCS8vIHByZXNlbnRhdGlvbgotCQkJCQkJCXBlcnNpc3Rlci5zYXZlKHByb2NDb21wLmVSZXNvdXJjZSgpKTsKLQotCQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQotCQkJCQkJCS8vIHNhdmUgdGhlIHJlc291cmNlIG9mIHRoZSBwcm9jZXNzJ3MgZGVmYXVsdAotCQkJCQkJCS8vIGNvbnRleHQKLQkJCQkJCQlwZXJzaXN0ZXIuc2F2ZShwcm9jQ3R4LmVSZXNvdXJjZSgpKTsKLQotCQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJCQkKLQkJCQkJCQkvLyBjcmVhdGUgbmV3IGRpYWdyYW0gZmlsZQotCQkJCQkJCS8vCi0JCQkJCQkJCi0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZXgpOwotCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCXN0YXR1cyA9IFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCQkJCXRocm93IG5ldyBNZXNzYWdlRXhjZXB0aW9uKAotCQkJCQkJCQkJTkxTCi0JCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnNhdmVQcm9jZXNzRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJCQkJCXByb2NDb21wLmdldE5hbWUoKSksIGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQotCQkJVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCS5ydW5XaXRoUHJvZ3Jlc3MoCi0JCQkJCQkJcnVubmFibGUsCi0JCQkJCQkJTWVzc2FnZUZvcm1hdAotCQkJCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuY3JlYXRpbmdQcm9jZXNzQ29tcG9uZW50VGFza19uYW1lLAotCQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyBwcm9jQ29tcC5nZXROYW1lKCkgfSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlzdXBlci5yZWRvKCk7Ci0JCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSAoUHJvY2Vzc0NvbXBvbmVudCkgY2hpbGQ7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gcHJvY0N0eCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJaWYgKHByb2NDdHggaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkoKE1ldGhvZENvbmZpZ3VyYXRpb24pIHByb2NDdHgpLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQoCi0JCQkJCXByb2NDb21wKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBwcm9jQ3R4ID0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlpZiAocHJvY0N0eCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCSgoTWV0aG9kQ29uZmlndXJhdGlvbikgcHJvY0N0eCkuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLnJlbW92ZSgKLQkJCQkJY2hpbGQpOwotCQl9Ci0JCXN1cGVyLnVuZG8oKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVSb2xlRGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVSb2xlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YjBjODczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlUm9sZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlJlZmVyZW5jZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLTsKLQotLyoqCi0gKiBEZWxldGUgcm9sZSBkZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZVJvbGVEZXNjcmlwdG9yIGV4dGVuZHMgUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kIHsKLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBSb2xlRGVzY3JpcHRvciByb2xlRGVzYzsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgTGlzdCBub3RVc2VkUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBmb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXM7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGVsZXRlUm9sZURlc2NyaXB0b3IoUm9sZURlc2NyaXB0b3Igcm9sZURlc2MpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLnJvbGVEZXNjID0gcm9sZURlc2M7Ci0KLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJcm9sZURlc2MsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChyb2xlRGVzYyk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJdGhpcy5hY3Rpdml0eSA9IChBY3Rpdml0eSkgcGFyZW50OwotCQl9Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQl9Ci0JCWlmIChyb2xlRGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQocm9sZURlc2MuZVJlc291cmNlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIERlbGV0ZVJvbGVEZXNjcmlwdG9yKFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjLAotCQkJYm9vbGVhbiBmb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXMpIHsKLQkJdGhpcyhyb2xlRGVzYyk7Ci0JCXRoaXMuZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzID0gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJU2V0IHJlZkxpc3QgPSBuZXcgSGFzaFNldCgpOwotCi0JCS8vIGdldCBSb2xlRGVzY3JpcHRvciByZWxhdGlvbnNoaXBzIHJlZmVyZW5jZXMKLQkJTGlzdCBhc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyA9IEFzc29jaWF0aW9uSGVscGVyLmdldEFzc2lzdGVkVGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKTsKLQkJTGlzdCBhZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0QWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYyk7Ci0JCUxpc3QgcHJpbWFyeVRhc2tEZXNjcmlwdG9ycyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpOwotCQlyZWZMaXN0LmFkZEFsbChhc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyk7Ci0JCXJlZkxpc3QuYWRkQWxsKGFkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMpOwotCQlyZWZMaXN0LmFkZEFsbChwcmltYXJ5VGFza0Rlc2NyaXB0b3JzKTsKLQkJcmVmTGlzdC5hZGRBbGwocm9sZURlc2MuZ2V0UmVzcG9uc2libGVGb3IoKSk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdG9yID0gcmVmTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdG9yLm5leHQoKTsKLQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQlpZiAoIVByb2Nlc3NVdGlsLmNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMocm9sZURlc2MsCi0JCQkJCQkoRGVzY3JpcHRvcikgb2JqZWN0KSkgewotCQkJCQlpZiAoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhvYmplY3QpKSAvLyBjaGVjawotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZvcgotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGxvY2FsCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gZGVzY3JpcHRvcgotCQkJCQkJbm90VXNlZFJlZmVyZW5jZXMuYWRkKG9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCEobm90VXNlZFJlZmVyZW5jZXMuaXNFbXB0eSgpKSkgewotCQkJdHJ5IHsKLQkJCQlPYmplY3RbXSByZWZUb0JlRGVsZXRlZCA9IGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlcyA/IG5vdFVzZWRSZWZlcmVuY2VzCi0JCQkJCQkudG9BcnJheSgpCi0JCQkJCQk6IFJlZmVyZW5jZVNlbGVjdGlvbi5nZXRSZWZlcmVuY2VzKG5vdFVzZWRSZWZlcmVuY2VzLAotCQkJCQkJCQlyb2xlRGVzYyk7Ci0JCQkJCQkKLQkJCQkJCWRlbGV0ZShyZWZUb0JlRGVsZXRlZCk7Ci0JCQl9Ci0JCQljYXRjaChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJYWJvcnRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjbGVhciByZWxhdGlvbnNoaXBzCi0vLwkJY2xlYXIocm9sZURlc2MuZ2V0QXNzaXN0c0luKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhc3Npc3RlZFRhc2tEZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCXRkLmdldEFzc2lzdGVkQnkoKS5yZW1vdmUocm9sZURlc2MpOwotCQl9Ci0vLwkJY2xlYXIocm9sZURlc2MuZ2V0UGVyZm9ybXNBZGRpdGlvbmFsbHkoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQl0ZC5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLnJlbW92ZShyb2xlRGVzYyk7Ci0JCX0KLS8vCQljbGVhcihyb2xlRGVzYy5nZXRQZXJmb3Jtc0FzT3duZXIoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHByaW1hcnlUYXNrRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQl0ZC5zZXRQZXJmb3JtZWRQcmltYXJpbHlCeShudWxsKTsKLQkJfQotCQljbGVhcihyb2xlRGVzYy5nZXRSZXNwb25zaWJsZUZvcigpKTsKLQotCQkvLyBpZiByb2xlIGlzIHBhcnQgb2YgYW55IHRlYW0sIHBsZWFzZSByZW1vdmUgaXQgZnJvbSB0ZWFtIGFzIHdlbGwKLQkJTGlzdCB0ZWFtcyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFRlYW1Qcm9maWxlcyhyb2xlRGVzYyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHRlYW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgaXRvci5uZXh0KCk7Ci0JCQl0ZWFtLmdldFRlYW1Sb2xlcygpLnJlbW92ZShyb2xlRGVzYyk7Ci0KLQkJCS8vIGZpbmQgbWF0Y2hpbmcgcm9sZURlc2NyaXB0b3IgaW4gdGVhbSByb2xlcwotCQkJT2JqZWN0IHRlYW1Sb2xlRGVzYyA9IFByb2Nlc3NVdGlsCi0JCQkJCS5maW5kUm9sZURlc2NyaXB0b3IodGVhbSwgcm9sZURlc2MpOwotCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5yZW1vdmUodGVhbVJvbGVEZXNjKTsKLQkJfQotCi0JCXJlZG8oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXIoTGlzdCBsaXN0KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoKGxpc3QgIT0gbnVsbCkgJiYgKGxpc3Quc2l6ZSgpID4gMCkpIHsKLQotCQkJCWxpc3QuY2xlYXIoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlVGFza0Rlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlVGFza0Rlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODAzY2U1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVRhc2tEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5SZWZlcmVuY2VTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBEZWxldGUgVGFzayBkZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVUYXNrRGVzY3JpcHRvciBleHRlbmRzIFJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCB7Ci0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2M7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIExpc3Qgbm90VXNlZFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERlbGV0ZVRhc2tEZXNjcmlwdG9yKFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy50YXNrRGVzYyA9IHRhc2tEZXNjOwotCi0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCXRhc2tEZXNjLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQodGFza0Rlc2MpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXRoaXMuYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJfQotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJfQotCQlpZiAodGFza0Rlc2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHRhc2tEZXNjLmVSZXNvdXJjZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBEZWxldGVUYXNrRGVzY3JpcHRvcihUYXNrRGVzY3JpcHRvciB0YXNrRGVzYywKLQkJCWJvb2xlYW4gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzKSB7Ci0JCXRoaXModGFza0Rlc2MpOwotCQl0aGlzLmZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlcyA9IGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCVNldCByZWZMaXN0ID0gbmV3IEhhc2hTZXQoKTsKLQotCQkvLyBnZXQgVGFza0Rlc2NyaXB0b3IgcmVsYXRpb25zaGlwcyByZWZlcmVuY2VzCi0JCXJlZkxpc3QuYWRkQWxsKHRhc2tEZXNjLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpOwotCQlyZWZMaXN0LmFkZEFsbCh0YXNrRGVzYy5nZXRBc3Npc3RlZEJ5KCkpOwotCQlyZWZMaXN0LmFkZCh0YXNrRGVzYy5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpKTsKLQkJcmVmTGlzdC5hZGRBbGwodGFza0Rlc2MuZ2V0TWFuZGF0b3J5SW5wdXQoKSk7Ci0JCXJlZkxpc3QuYWRkQWxsKHRhc2tEZXNjLmdldEV4dGVybmFsSW5wdXQoKSk7Ci0JCXJlZkxpc3QuYWRkQWxsKHRhc2tEZXNjLmdldE9wdGlvbmFsSW5wdXQoKSk7Ci0JCXJlZkxpc3QuYWRkQWxsKHRhc2tEZXNjLmdldE91dHB1dCgpKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSByZWZMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0b3IubmV4dCgpOwotCi0JCQkvLyBjaGVjayBhbGwgaXQncyByZWZlcmVuY2VzCi0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCWlmICghUHJvY2Vzc1V0aWwuY2hlY2tEZXNjcmlwdG9yUmVmZXJlbmNlcyh0YXNrRGVzYywKLQkJCQkJCShEZXNjcmlwdG9yKSBvYmplY3QpKSB7Ci0JCQkJCWlmIChhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmNvbnRhaW5zKG9iamVjdCkpIC8vIGNoZWNrCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gZm9yCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gbG9jYWwKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBkZXNjcmlwdG9yCi0JCQkJCQlub3RVc2VkUmVmZXJlbmNlcy5hZGQob2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIShub3RVc2VkUmVmZXJlbmNlcy5pc0VtcHR5KCkpKSB7Ci0JCQl0cnkgewotCQkJCU9iamVjdFtdIHJlZlRvQmVEZWxldGVkID0gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzID8gbm90VXNlZFJlZmVyZW5jZXMKLQkJCQkJCS50b0FycmF5KCkKLQkJCQkJCTogUmVmZXJlbmNlU2VsZWN0aW9uLmdldFJlZmVyZW5jZXMobm90VXNlZFJlZmVyZW5jZXMsCi0JCQkJCQkJCXRhc2tEZXNjKTsKLQkJCQkJCQotCQkJCQkJZGVsZXRlKHJlZlRvQmVEZWxldGVkKTsKLQkJCX0KLQkJCWNhdGNoKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlhYm9ydGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCS8vIGNsZWFyIG91dCBhbGwgdGFza2Rlc2NyaXB0b3IgcmVsYXRpb25zaGlwCi0JCWNsZWFyKHRhc2tEZXNjLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpOwotCQljbGVhcih0YXNrRGVzYy5nZXRBc3Npc3RlZEJ5KCkpOwotCQljbGVhcih0YXNrRGVzYy5nZXRNYW5kYXRvcnlJbnB1dCgpKTsKLQkJY2xlYXIodGFza0Rlc2MuZ2V0RXh0ZXJuYWxJbnB1dCgpKTsKLQkJY2xlYXIodGFza0Rlc2MuZ2V0T3B0aW9uYWxJbnB1dCgpKTsKLQkJY2xlYXIodGFza0Rlc2MuZ2V0T3V0cHV0KCkpOwotCi0JCXRhc2tEZXNjLnNldFBlcmZvcm1lZFByaW1hcmlseUJ5KG51bGwpOwotCi0JCXJlZG8oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXIoTGlzdCBsaXN0KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoKGxpc3QgIT0gbnVsbCkgJiYgKGxpc3Quc2l6ZSgpID4gMCkpIHsKLQkJCQlsaXN0LmNsZWFyKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCi0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVRlYW1Qcm9maWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVRlYW1Qcm9maWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ3MzhhMTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVUZWFtUHJvZmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotCi0KLS8qKgotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZVRlYW1Qcm9maWxlIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBUZWFtUHJvZmlsZSB0ZWFtOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERlbGV0ZVRlYW1Qcm9maWxlKFRlYW1Qcm9maWxlIHRlYW0pIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLnRlYW0gPSB0ZWFtOwotCi0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnRBY3Rpdml0eSh0ZWFtKTsKLQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXRoaXMuYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJfQotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJfQotCQlpZiAodGVhbS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQodGVhbS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIGdldCBhbGwgc3VidGVhbSByZWN1cnNpdmVseQotCQlMaXN0IHRlYW1MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRTdWJUZWFtcyh0ZWFtLCB0ZWFtTGlzdCk7Ci0KLQkJdGVhbUxpc3QuYWRkKHRlYW0pOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGVhbUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCVRlYW1Qcm9maWxlIHR0ID0gKFRlYW1Qcm9maWxlKSB0ZWFtTGlzdC5nZXQoaSk7Ci0JCQkvLyBjbGVhciB0ZWFtJ3Mgcm9sZWRlc2NyaXB0b3IKLQkJCXR0LmdldFRlYW1Sb2xlcygpLmNsZWFyKCk7Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFN1YlRlYW1zKFRlYW1Qcm9maWxlIHRlYW0sIExpc3QgdGVhbUxpc3QpIHsKLQkJTGlzdCBsaXN0ID0gdGVhbS5nZXRTdWJUZWFtKCk7Ci0JCWlmIChsaXN0ICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJVGVhbVByb2ZpbGUgdHQgPSAoVGVhbVByb2ZpbGUpIGl0b3IubmV4dCgpOwotCQkJCXRlYW1MaXN0LmFkZCh0dCk7Ci0JCQkJZ2V0U3ViVGVhbXModHQsIHRlYW1MaXN0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQgYWN0aXZpdHkgZm9yIGJyZWFrZG93bmVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gYnJFbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldFBhcmVudEFjdGl2aXR5KEJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGJyRWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJYnJFbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudDsKLQkJCWFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYnJFbGVtZW50LAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCi0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjUxMzNkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklJbnRlcmFjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLQotCi0vKioKLSAqIENvbW1hbmQgZm9yIGNsZWFuLXVwIHVudXNlZCBkZXNjcmlwdG9ycwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kIGV4dGVuZHMgQ29tcG91bmRDb21tYW5kIAotaW1wbGVtZW50cyBJSW50ZXJhY3RpdmUKLXsKLQlwcml2YXRlIENvbGxlY3Rpb24gZWxlbWVudHM7Ci0JcHJpdmF0ZSBMaXN0IGRlc2NyaXB0b3JzVG9EZWxldGU7Ci0JcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVDaGlsZHJlbjsKLQlwcml2YXRlIENvbGxlY3Rpb24gZGVsZXRlZERlc2NyaXB0b3JzOwotCXByaXZhdGUgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdXNlckludGVyYWN0aW9uSGFuZGxlcjsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50cyBsaXN0IG9mIGVsZW1lbnRzIHRvIGNoZWNrIGZvciB1bnVzZWQgZGVzY3JpcHRvcnMgdG8gZGVsZXRlIAotCSAqIEBwYXJhbSBpbmNsdWRlQ2hpbGRyZW4gaWYgPGNvZGU+dHJ1ZTwvY29kZT4gd2lsbCBjaGVjayB0aGUgb2Zmc3RyaW5nIG9mIGFjdGl2aXRpZXMgaW4gdGhlIGdpdmVuIGVsZW1lbnRzCi0JICovCi0JcHVibGljIERlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZChDb2xsZWN0aW9uIGVsZW1lbnRzLCBib29sZWFuIGluY2x1ZGVDaGlsZHJlbiwgQ29sbGVjdGlvbiBkZWxldGVkRGVzY3JpcHRvcnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOwotCQl0aGlzLmluY2x1ZGVDaGlsZHJlbiA9IGluY2x1ZGVDaGlsZHJlbjsKLQkJdGhpcy5kZWxldGVkRGVzY3JpcHRvcnMgPSBkZWxldGVkRGVzY3JpcHRvcnM7Ci0JfQotCQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIHNwZWNpZmllZCBlbGVtZW50cy4gU3ViY2xhc3NzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHJldHVybiB0aGUgZXhlY3V0ZWQgY29tbWFuZCB0aGF0IGRlbGV0ZWQgdGhlIGdpdmVuIGVsZW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbW1hbmQgZGVsZXRlKExpc3QgZWxlbWVudHMpOwotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIGZpbmQgYWxsIHJvbGUgYW5kIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyB0aGF0IGFyZSBub3QgdXNlZAotCQkvLyBpbiBhbnkgcmVsYXRpb25zaGlwCi0JCS8vIGFuZCBkZWxldGUgdGhlbQotCQkvLwotCQlpZiAoZGVzY3JpcHRvcnNUb0RlbGV0ZSA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9yc1RvRGVsZXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSXRlcmF0b3IgaXRlcjsKLQkJCWlmKGluY2x1ZGVDaGlsZHJlbikgewotCQkJCWl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZWxlbWVudHMsIGZhbHNlKSB7Ci0JCQkJCQotCQkJCQkKLQkJCQkJLyoqCi0JCQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkJCSAqLwotCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0NzE4ODg5NDA5NDAzMTQxNzA3TDsKLQkJCQkJCi0JCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQlpZiAob2JqZWN0ID09IGVsZW1lbnRzKSB7Ci0JCQkJCQkJcmV0dXJuIGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCQkJCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJcmV0dXJuICgoQWN0aXZpdHkpIG9iamVjdCkKLQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCX07Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsKLQkJCX0KLQkJCUFycmF5TGlzdCBjdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmKGRlbGV0ZWREZXNjcmlwdG9ycyAhPSBudWxsKSB7Ci0JCQkJLy8gYWRkIGRlbGV0ZWQgZGVzY3JpcHRvcnMgdG8gdGhlIGxpc3QgYmVmb3JlIGNoZWNraW5nIGZvciB1bnVzZWQgZGVzY3JpcHRvcnMKLQkJCQkvLyB0aG9zZSBkZWxldGVkIGRlc2NyaXB0b3JzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IGFmdGVyIHRoZSBjaGVjawotCQkJCS8vCi0JCQkJY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUuYWRkQWxsKGRlbGV0ZWREZXNjcmlwdG9ycyk7Ci0JCQl9Ci0JCQlmb3IgKDsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCWlmICghUHJvY2Vzc1V0aWwuY2hlY2tEZXNjcmlwdG9yUmVmZXJlbmNlcygKLQkJCQkJCQljdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZSwgKERlc2NyaXB0b3IpIGVsZW1lbnQpKSB7Ci0JCQkJCQljdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZS5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZS5yZW1vdmVBbGwoZGVsZXRlZERlc2NyaXB0b3JzKTsKLQkJCWlmICghY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUuaXNFbXB0eSgpKSB7Ci0JCQkJc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZShjdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZSk7Ci0JCQkJaWYoIWN1cnJlbnREZXNjcmlwdG9yc1RvRGVsZXRlLmlzRW1wdHkoKSkgewotCQkJCQlDb21tYW5kIGNtZCA9IGRlbGV0ZShjdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZSk7Ci0JCQkJCWlmIChjbWQgIT0gbnVsbCkgewotCQkJCQkJY29tbWFuZExpc3QuYWRkKGNtZCk7Ci0JCQkJCQlkZXNjcmlwdG9yc1RvRGVsZXRlLmFkZEFsbChjdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZighZGVzY3JpcHRvcnNUb0RlbGV0ZS5pc0VtcHR5KCkpIHsKLQkJCQljb21tYW5kTGlzdC5jbGVhcigpOwotCQkJCWFwcGVuZChkZWxldGUoZGVzY3JpcHRvcnNUb0RlbGV0ZSkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlKExpc3QgZGVzY3JpcHRvcnNUb0RlbGV0ZSkgewotCQlpZih1c2VySW50ZXJhY3Rpb25IYW5kbGVyICE9IG51bGwpIHsKLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudWlfcmVmZXJlbmNlczsKLQkJCVN0cmluZyBtc2cgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5zZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlX21zZzsJCQkKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoZGVzY3JpcHRvcnNUb0RlbGV0ZSk7Ci0JCQl0cnkgewotCQkJCUNvbGxlY3Rpb24gc2VsZWN0ZWQgPSB1c2VySW50ZXJhY3Rpb25IYW5kbGVyLnNlbGVjdChsaXN0LCBsYWJlbFByb3ZpZGVyLCB0cnVlLCBsaXN0LCB0aXRsZSwgbXNnKTsKLQkJCQlpZihzZWxlY3RlZCA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlkZXNjcmlwdG9yc1RvRGVsZXRlLnJldGFpbkFsbChzZWxlY3RlZCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JSW50ZXJhY3RpdmUjc2V0VXNlckludGVyYWN0aW9uSGFuZGxlcihvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlckludGVyYWN0aW9uSGFuZGxlcihJVXNlckludGVyYWN0aW9uSGFuZGxlciBoYW5kbGVyKSB7Ci0JCXVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgPSBoYW5kbGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YTMyYTMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlJlZmVyZW5jZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogRGVsZXRlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVXb3JrUHJvZHVjdERlc2NyaXB0b3IgZXh0ZW5kcyBSZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgewotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2M7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIExpc3Qgbm90VXNlZFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERlbGV0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcihXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy53cERlc2MgPSB3cERlc2M7Ci0KLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJd3BEZXNjLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQod3BEZXNjKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQl0aGlzLmFjdGl2aXR5ID0gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCX0KLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJaWYgKHdwRGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQod3BEZXNjLmVSZXNvdXJjZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBEZWxldGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYywKLQkJCWJvb2xlYW4gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzKSB7Ci0JCXRoaXMod3BEZXNjKTsKLQkJdGhpcy5mb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXMgPSBmb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlTZXQgcmVmTGlzdCA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJTGlzdCBtYW5kYXRvcnlJbnB1dFRvID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0TWFuZGF0b3J5SW5wdXRUbyh3cERlc2MpOwotCQlMaXN0IGV4dGVybmFsSW5wdXRUbyA9IEFzc29jaWF0aW9uSGVscGVyLmdldEV4dGVybmFsSW5wdXRUbyh3cERlc2MpOwotCQlMaXN0IG9wdGlvbmFsSW5wdXRUbyA9IEFzc29jaWF0aW9uSGVscGVyLmdldE9wdGlvbmFsSW5wdXRUbyh3cERlc2MpOwotCQlMaXN0IG91dHB1dEZyb20gPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRPdXRwdXRGcm9tKHdwRGVzYyk7Ci0JCUxpc3QgcmVzcG9uc2libGVSb2xlRGVzY0xpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRSZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycyh3cERlc2MpOwotCQkvLyBnZXQgV29ya1Byb2R1Y3REZXNjcmlwdG9yIHJlbGF0aW9uc2hpcHMgcmVmZXJlbmNlcwotCQlyZWZMaXN0LmFkZEFsbCh3cERlc2MuZ2V0SW1wYWN0ZWRCeSgpKTsKLQkJcmVmTGlzdC5hZGRBbGwod3BEZXNjLmdldEltcGFjdHMoKSk7Ci0JCXJlZkxpc3QuYWRkQWxsKG1hbmRhdG9yeUlucHV0VG8pOwotCQlyZWZMaXN0LmFkZEFsbChleHRlcm5hbElucHV0VG8pOwotCQlyZWZMaXN0LmFkZEFsbChvcHRpb25hbElucHV0VG8pOwotCQlyZWZMaXN0LmFkZEFsbChvdXRwdXRGcm9tKTsKLQkJcmVmTGlzdC5hZGQocmVzcG9uc2libGVSb2xlRGVzY0xpc3QpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHJlZkxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0KLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKCFQcm9jZXNzVXRpbC5jaGVja0Rlc2NyaXB0b3JSZWZlcmVuY2VzKHdwRGVzYywKLQkJCQkJCShEZXNjcmlwdG9yKSBvYmplY3QpKSB7Ci0JCQkJCWlmIChhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmNvbnRhaW5zKG9iamVjdCkpIC8vIGNoZWNrCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gZm9yCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gbG9jYWwKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBkZXNjcmlwdG9yCi0JCQkJCQlub3RVc2VkUmVmZXJlbmNlcy5hZGQob2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIShub3RVc2VkUmVmZXJlbmNlcy5pc0VtcHR5KCkpKSB7Ci0JCQl0cnkgewotCQkJCU9iamVjdFtdIHJlZlRvQmVEZWxldGVkID0gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzID8gbm90VXNlZFJlZmVyZW5jZXMKLQkJCQkJCS50b0FycmF5KCkKLQkJCQkJCTogUmVmZXJlbmNlU2VsZWN0aW9uLmdldFJlZmVyZW5jZXMobm90VXNlZFJlZmVyZW5jZXMsCi0JCQkJCQkJCXdwRGVzYyk7Ci0JCQkJCQlkZWxldGUocmVmVG9CZURlbGV0ZWQpOwotCQkJfQotCQkJY2F0Y2goT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCWFib3J0ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgd2hldGhlciB3cGRlc2MgYXJ0aWZhY3QgaGFzIGFueSBzdWItYXJ0aWZhY3RzCi0JCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICh3cERlc2MuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgd3BEZXNjLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQlMaXN0IGxpc3QgPSBhcnRpZmFjdC5nZXRDb250YWluZWRBcnRpZmFjdHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCU9iamVjdCBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcih3cERlc2MsIChBcnRpZmFjdCkgbGlzdAotCQkJCQkJLmdldChpKSk7Ci0JCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQljaGlsZHJlbi5hZGQoZGVzY3JpcHRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJTGlzdCBvYmplY3RzVG9DbGVhcmVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlvYmplY3RzVG9DbGVhcmVkLmFkZCh3cERlc2MpOwotCQlvYmplY3RzVG9DbGVhcmVkLmFkZEFsbChjaGlsZHJlbik7Ci0KLQkJZm9yIChJdGVyYXRvciBpdG9yID0gb2JqZWN0c1RvQ2xlYXJlZC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjT2JqID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqOwotCi0JCQkJLy8gd3BEZXNjT2JqLmdldEltcGFjdGVkQnkoKS5jbGVhcigpOwotCQkJCS8vIHdwRGVzY09iai5nZXRJbXBhY3RzKCkuY2xlYXIoKTsKLQkJCQkvLyB3cERlc2NPYmouZ2V0TWFuZGF0b3J5SW5wdXRUbygpLmNsZWFyKCk7Ci0JCQkJLy8gd3BEZXNjT2JqLmdldEV4dGVybmFsSW5wdXRUbygpLmNsZWFyKCk7Ci0JCQkJLy8gd3BEZXNjT2JqLmdldE9wdGlvbmFsSW5wdXRUbygpLmNsZWFyKCk7Ci0JCQkJLy8gd3BEZXNjT2JqLmdldE91dHB1dEZyb20oKS5jbGVhcigpOwotCQkJCS8vIHdwRGVzY09iai5nZXRXb3JrZWRPbkJ5KCkuY2xlYXIoKTsKLQkJCQljbGVhcih3cERlc2NPYmouZ2V0SW1wYWN0ZWRCeSgpKTsKLQkJCQljbGVhcih3cERlc2NPYmouZ2V0SW1wYWN0cygpKTsKLS8vCQkJCWNsZWFyKHdwRGVzY09iai5nZXRFeHRlcm5hbElucHV0VG8oKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZXh0ZXJuYWxJbnB1dFRvLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJdGQuZ2V0RXh0ZXJuYWxJbnB1dCgpLnJlbW92ZSh3cERlc2NPYmopOwotCQkJCX0KLS8vCQkJCWNsZWFyKHdwRGVzY09iai5nZXRNYW5kYXRvcnlJbnB1dFRvKCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1hbmRhdG9yeUlucHV0VG8uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCQl0ZC5nZXRNYW5kYXRvcnlJbnB1dCgpLnJlbW92ZSh3cERlc2NPYmopOwotCQkJCX0KLS8vCQkJCWNsZWFyKHdwRGVzY09iai5nZXRPcHRpb25hbElucHV0VG8oKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb3B0aW9uYWxJbnB1dFRvLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJdGQuZ2V0T3B0aW9uYWxJbnB1dCgpLnJlbW92ZSh3cERlc2NPYmopOwotCQkJCX0KLS8vCQkJCWNsZWFyKHdwRGVzY09iai5nZXRPdXRwdXRGcm9tKCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG91dHB1dEZyb20uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCQl0ZC5nZXRPdXRwdXQoKS5yZW1vdmUod3BEZXNjT2JqKTsKLQkJCQl9Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzcG9uc2libGVSb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCQlyb2xlRGVzYy5nZXRSZXNwb25zaWJsZUZvcigpLnJlbW92ZSh3cERlc2NPYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHRoaXMuYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmUod3BEZXNjKTsKLQotCQlyZWRvKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyKExpc3QgbGlzdCkgewotCQl0cnkgewotCQkJaWYgKChsaXN0ICE9IG51bGwpICYmIChsaXN0LnNpemUoKSA+IDApKQotCQkJCWxpc3QuY2xlYXIoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0RGVzY3JpcHRvcihPYmplY3QgcGFyZW50RGVzY3JpcHRvciwgQXJ0aWZhY3QgYXJ0aWZhY3QpIHsKLQkJLy8gQWN0aXZpdHkgYWN0aXZpdHkgPSBnZXRBY3Rpdml0eShwYXJlbnREZXNjcmlwdG9yKTsKLQkJaWYgKGFjdGl2aXR5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTGlzdCBsaXN0ID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBsaXN0LmdldChpKTsKLQkJCWlmICgob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKQotCQkJCQkmJiAoYXJ0aWZhY3QgPT0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaikKLQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKSkpIHsKLQkJCQlyZXR1cm4gb2JqOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZXNjcmlwdG9yU3luY2hyb25pemVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Rlc2NyaXB0b3JTeW5jaHJvbml6ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjg1MDk0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Rlc2NyaXB0b3JTeW5jaHJvbml6ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLQotLyoqCi0gKiBDb21tYW5kIHRvIHN5bmNocm9uaXplIGRlc2NyaXB0b3IncyBhdHRyaWJ1dGVzIGFuZCBvd24gcmVmZXJlbmNlcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEZlYiAxLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvclN5bmNocm9uaXplQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRvclN5bmNocm9uaXplQ29tbWFuZCgpIHsKLQkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JTeW5jaHJvbml6ZUNvbW1hbmQoU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JTeW5jaHJvbml6ZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Rlc2NyaXB0b3JVcGRhdGVCYXRjaENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVzY3JpcHRvclVwZGF0ZUJhdGNoQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkODRlY2MzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVzY3JpcHRvclVwZGF0ZUJhdGNoQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5CYXRjaENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gRmViIDksIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yVXBkYXRlQmF0Y2hDb21tYW5kIGV4dGVuZHMgQmF0Y2hDb21tYW5kIHsKLQlwcml2YXRlIFNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaDsKLQlwcml2YXRlIENvbXBvdW5kQ29tbWFuZCByZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kOwotCXByaXZhdGUgU2V0IHN5bmNoRmVhdHVyZXM7Ci0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkKLQkvKioKLQkgKiBAcGFyYW0gY2xlYXIKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRvclVwZGF0ZUJhdGNoQ29tbWFuZChib29sZWFuIGNsZWFyLCBTZXQgc3luY2hGZWF0dXJlcywgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJc3VwZXIoY2xlYXIpOwotCQl0aGlzLnN5bmNoRmVhdHVyZXMgPSBzeW5jaEZlYXR1cmVzOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldERlc2NyaXB0b3JzVG9SZWZyZXNoKCkgewotCQlpZihkZXNjcmlwdG9yc1RvUmVmcmVzaCA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9yc1RvUmVmcmVzaCA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3JzVG9SZWZyZXNoOwotCX0KLQkKLQl2b2lkIHNldERlc2NyaXB0b3JzVG9SZWZyZXNoKFNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaCkgewotCQl0aGlzLmRlc2NyaXB0b3JzVG9SZWZyZXNoID0gZGVzY3JpcHRvcnNUb1JlZnJlc2g7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkJhdGNoQ29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5jbGVhcigpOwotCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2ggPSBudWxsOwotCQl9Ci0JCQotCQlpZihyZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kICE9IG51bGwpIHsKLQkJCXJlZnJlc2hEZXNjcmlwdG9yc0NvbW1hbmQuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5CYXRjaENvbW1hbmQjY2FuRXhlY3V0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKSB8fCAoZGVzY3JpcHRvcnNUb1JlZnJlc2ggIT0gbnVsbCAmJiAhZGVzY3JpcHRvcnNUb1JlZnJlc2guaXNFbXB0eSgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkJhdGNoQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlzdXBlci5leGVjdXRlKCk7Ci0JCQotCQkvLyBjcmVhdGUgcmVmcmVzaERlc2NyaXB0b3JzQ29tbWFuZAotCQkvLwotCQlpZihkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsICYmICFkZXNjcmlwdG9yc1RvUmVmcmVzaC5pc0VtcHR5KCkKLQkJCQkmJiByZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kID09IG51bGwpIHsKLQkJCXJlZnJlc2hEZXNjcmlwdG9yc0NvbW1hbmQgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZXNjcmlwdG9yc1RvUmVmcmVzaC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlEZXNjcmlwdG9yIGRlc2MgPSAoRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJcmVmcmVzaERlc2NyaXB0b3JzQ29tbWFuZC5hcHBlbmQobmV3IEJhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZChkZXNjLCBzeW5jaEZlYXR1cmVzLCBjb25maWcpKTsJCQkJCi0JCQl9Ci0JCX0KLQotCQkvLyByZWZyZXNoIGRlc2NyaXB0b3JzCi0JCS8vCi0JCWlmKHJlZnJlc2hEZXNjcmlwdG9yc0NvbW1hbmQgIT0gbnVsbCkgewotCQkJcmVmcmVzaERlc2NyaXB0b3JzQ29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkJhdGNoQ29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZihyZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kICE9IG51bGwpIHsKLQkJCXJlZnJlc2hEZXNjcmlwdG9yc0NvbW1hbmQudW5kbygpOwotCQl9Ci0JCQotCQlzdXBlci51bmRvKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9HZW5lcmljRHJvcENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvR2VuZXJpY0Ryb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgxNjk4ZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9HZW5lcmljRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLQotLyoqCi0gKiBEcm9wIGNvbW1hbmQgdG8gZHJvcCBhbnkgb2JqZWN0IG9uIGEgdGFyZ2V0IHRoYXQgc3VwcG9ydHMgYWRhcHRpbmcgZHJvcAotICogb2JqZWN0IHRvIGl0cyBvd24gb2JqZWN0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0Ryb3BDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBkcm9wRWxlbWVudHM7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBmZWF0dXJlRWxlbWVudHM7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIEVPYmplY3QgdGFyZ2V0OwotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCXByaXZhdGUgRWxlbWVudEFkYXB0ZXIgZHJvcEFkYXB0ZXI7Ci0KLQlwdWJsaWMgR2VuZXJpY0Ryb3BDb21tYW5kKEVPYmplY3QgdGFyZ2V0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCUNvbGxlY3Rpb24gZHJvcEVsZW1lbnRzLCBFbGVtZW50QWRhcHRlciBkcm9wQWRhcHRlcikgewotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJdGhpcy5kcm9wRWxlbWVudHMgPSBkcm9wRWxlbWVudHM7Ci0JCXRoaXMuZHJvcEFkYXB0ZXIgPSBkcm9wQWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gY29tcGlsZSB0aGUgZmVhdHVyZUVsZW1lbnRzIGxpc3QKLQkJLy8KLQkJZmVhdHVyZUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkcm9wRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWVsZW1lbnQgPSBkcm9wQWRhcHRlci5hZGFwdChlbGVtZW50KTsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQlmZWF0dXJlRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJfQotCQkJLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCS8vIGlmKGNyZWF0ZURlc2NyaXB0b3IpIHsKLQkJCS8vIGZlYXR1cmVFbGVtZW50cy5hZGQoUHJvY2Vzc1V0aWwuY3JlYXRlUm9sZURlc2NyaXB0b3IoKFJvbGUpCi0JCQkvLyBlbGVtZW50KSk7Ci0JCQkvLyB9Ci0JCQkvLyBlbHNlIHsKLQkJCS8vIGZlYXR1cmVFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlpZiAoIWZlYXR1cmVFbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCSgoTGlzdCkgdGFyZ2V0LmVHZXQoZmVhdHVyZSkpLmFkZEFsbChmZWF0dXJlRWxlbWVudHMpOwotCQkJaWYgKHRhcmdldC5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5hZGQodGFyZ2V0LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkoKExpc3QpIHRhcmdldC5lR2V0KGZlYXR1cmUpKS5yZW1vdmVBbGwoZmVhdHVyZUVsZW1lbnRzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBmZWF0dXJlRWxlbWVudHM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRWxlbWVudEFkYXB0ZXIgewotCQkvKioKLQkJICogQWRhcHRzIHRoZSBkcm9wIGVsZW1lbnQgdG8gdGhlIHJpZ2h0IGVsZW1lbnQgZm9yIHRoZSBkcm9wIHRhcmdldC4KLQkJICogCi0JCSAqIEBwYXJhbSBkcm9wRWxlbWVudAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlPYmplY3QgYWRhcHQoT2JqZWN0IGRyb3BFbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvSUFjdGlvblR5cGVDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvSUFjdGlvblR5cGVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU1OGExYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0lBY3Rpb25UeXBlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotcHVibGljIGNsYXNzIElBY3Rpb25UeXBlQ29uc3RhbnRzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERF9QUklNQVJZX1BFUkZPUk1FUiA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfQURESVRJT05BTF9QRVJGT1JNRVIgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREX0FTU0lTVEVEX0JZID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERF9FWFRFUk5BTF9JTlBVVCA9IDM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfTUFOREFUT1JZX0lOUFVUID0gNDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERF9PUFRJT05BTF9JTlBVVCA9IDU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfT1VUUFVUID0gNjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERF9SRVNQT05TSUJMRV9GT1IgPSA3OwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9MaW5rTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTGlua01ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY0NDRkZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9MaW5rTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBDb21tYW5kIGZvciBsaW5raW5nIG1ldGhvZCBlbGVtZW50IHRvIGRlc2NyaXB0b3IKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgTGlua01ldGhvZEVsZW1lbnRDb21tYW5kIGV4dGVuZHMgQWRkTWV0aG9kRWxlbWVudENvbW1hbmQgewotCi0JcHJpdmF0ZSBEZXNjcmlwdG9yIGRlc2M7Ci0KLQlwcml2YXRlIE9iamVjdCBvYmo7Ci0KLQlwcml2YXRlIExpc3Qgb2JqZWN0czsKLQotCXByaXZhdGUgaW50IGZlYXR1cmVJRDsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCS8qKgotCSAqIEFzc2lnbiByb2xlIHRvIHRhc2sgZGVzY3JpcHRvciBVc2VkIGZvciBib3RoIGFkZGl0aW9uYWxseSBwZXJmb3JtZWQgYnkKLQkgKiBhbmQgYXNzaXN0ZWQgYnkKLQkgKi8KLQlwdWJsaWMgTGlua01ldGhvZEVsZW1lbnRDb21tYW5kKERlc2NyaXB0b3IgZGVzYywgT2JqZWN0IG9iaiwgaW50IGZlYXR1cmVJRCkgewotCi0JCXN1cGVyKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhkZXNjKSk7Ci0KLQkJdGhpcy5kZXNjID0gZGVzYzsKLQkJdGhpcy5vYmogPSBvYmo7Ci0JCXRoaXMuZmVhdHVyZUlEID0gZmVhdHVyZUlEOwotCi0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJb2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCW9iamVjdHMuYWRkKG9iaik7Ci0JCX0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCi0JCWlmIChkZXNjID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24ob2JqZWN0cykpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFvYmplY3RzLmlzRW1wdHkoKSkKLQkJCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0s6Ci0JCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5zZXRUYXNrKChUYXNrKSBvYmopOwotCQkJYnJlYWs7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEU6Ci0JCQkoKFJvbGVEZXNjcmlwdG9yKSBkZXNjKS5zZXRSb2xlKChSb2xlKSBvYmopOwotCQkJYnJlYWs7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUOgotCQkJKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlc2MpLnNldFdvcmtQcm9kdWN0KChXb3JrUHJvZHVjdCkgb2JqKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKCFvYmplY3RzLmlzRW1wdHkoKSkgewotCQkJLy8gYmFzaWNhbGx5IHJlbW92ZSBmcm9tIGNvbmZpZ3VyYXRpb24gaWYgYW55dGhpbmcgd2FzIGFkZGVkCi0JCQlzdXBlci51bmRvKCk7Ci0KLQkJCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLnNldFRhc2sobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJCSgoUm9sZURlc2NyaXB0b3IpIGRlc2MpLnNldFJvbGUobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVDoKLQkJCQkoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZGVzYykuc2V0V29ya1Byb2R1Y3QobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKGRlc2MuZVJlc291cmNlKCkgIT0gbnVsbCAmJiAhb2JqZWN0cy5pc0VtcHR5KCkpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChkZXNjLmVSZXNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Mb2NhbGx5UmVwbGFjZUFuZERlZXBDb3B5Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Mb2NhbGx5UmVwbGFjZUFuZERlZXBDb3B5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYWUwZTE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTG9jYWxseVJlcGxhY2VBbmREZWVwQ29weUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5BY3Rpdml0eUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1bCA2LCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxseVJlcGxhY2VBbmREZWVwQ29weUNvbW1hbmQgZXh0ZW5kcyBSZXBsYWNlQWN0aXZpdHlDb21tYW5kIHsKLQotCS8qKgotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICovCi0JcHVibGljIExvY2FsbHlSZXBsYWNlQW5kRGVlcENvcHlDb21tYW5kKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJc3VwZXIod3JhcHBlcik7CQkKLQkJc2V0TGFiZWwoTGlicmFyeUVkaXRSZXNvdXJjZXMubG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5X3RleHQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5SZXBsYWNlQWN0aXZpdHlDb21tYW5kI2RvVmFyeSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9WYXJ5KCkgewotCQkvLyBkZWVwIGNvcHkgdGhlIGFjdGl2aXR5Ci0JCS8vCi0JCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJaWYoIVVzZXJJbnRlcmFjdGlvbkhlbHBlci5jb25maXJtRGVlcENvcHkoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChhY3Rpdml0eSkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0JCQotCQlQcm9jZXNzIHRhcmdldFByb2Nlc3MgPSAoUHJvY2Vzcykgd3JhcHBlci5nZXRUb3BJdGVtKCk7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gZGVlcENvcHlDb25maWcgPSBudWxsOwotCQl0cnkgewotCQkJZGVlcENvcHlDb25maWcgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hvb3NlRGVlcENvcHlDb25maWd1cmF0aW9uKHRhcmdldFByb2Nlc3MsIHdyYXBwZXIuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCX0KLQkJY2F0Y2goT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUFjdGl2aXR5SGFuZGxlciBhY3Rpdml0eUhhbmRsZXIgPSBuZXcgQWN0aXZpdHlIYW5kbGVyKCk7Ci0JCWFjdGl2aXR5SGFuZGxlci5zZXREZWVwQ29weUNvbmZpZyhkZWVwQ29weUNvbmZpZyk7Ci0JCWFjdGl2aXR5SGFuZGxlci5zZXRUYXJnZXRQcm9jZXNzKHRhcmdldFByb2Nlc3MpOwotCQlhY3Rpdml0eUhhbmRsZXIuZGVlcENvcHkoYWN0aXZpdHkpOwotCQlBY3Rpdml0eSBjb3B5ID0gKEFjdGl2aXR5KSBhY3Rpdml0eUhhbmRsZXIuZ2V0QWN0aXZpdGllcygpLmdldCgwKTsKLQkJCi0JCXN1cGVyLmRvVmFyeSgpOwotCQkKLQkJLy8gcmVwbGFjZSB0aGUgbG9jYWwgcmVwbGFjZW1lbnQgd2l0aCBkZWVwIGNvcHkKLQkJLy8KLQkJaW50IHBvcyA9IGNyZWF0ZWRBY3Rpdml0aWVzLnNpemUoKSAtIDE7Ci0JCUFjdGl2aXR5IGxvY2FsUmVwbGFjZW1lbnQgPSAoQWN0aXZpdHkpIGNyZWF0ZWRBY3Rpdml0aWVzLmdldChwb3MpOwkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxvY2FsUmVwbGFjZW1lbnQuZ2V0T3Bwb3NpdGVGZWF0dXJlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9IChPcHBvc2l0ZUZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IHZhbHVlID0gbG9jYWxSZXBsYWNlbWVudC5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShvcHBvc2l0ZUZlYXR1cmUpOwotCQkJaWYodmFsdWUgIT0gbnVsbCkgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gb3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKTsKLQkJCQlpZihvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBBcnJheUxpc3QoKChDb2xsZWN0aW9uKXZhbHVlKSkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsJCQotCQkJCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgby5lR2V0KGZlYXR1cmUpOwotCQkJCQkJCWxpc3QucmVtb3ZlKGxvY2FsUmVwbGFjZW1lbnQpOwotCQkJCQkJCWxpc3QuYWRkKGNvcHkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJby5lU2V0KGZlYXR1cmUsIGNvcHkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgdmFsdWU7Ci0JCQkJCWlmKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBvLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCQlsaXN0LnJlbW92ZShsb2NhbFJlcGxhY2VtZW50KTsKLQkJCQkJCWxpc3QuYWRkKGNvcHkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJby5lU2V0KGZlYXR1cmUsIGNvcHkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNyZWF0ZWRBY3Rpdml0aWVzLnNldChwb3MsIGNvcHkpOwotCQljb3B5LnNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQobG9jYWxSZXBsYWNlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQljb3B5LnNldFZhcmlhYmlsaXR5VHlwZShsb2NhbFJlcGxhY2VtZW50LmdldFZhcmlhYmlsaXR5VHlwZSgpKTsKLQkJY29weS5zZXRQcmVzZW50ZWRBZnRlcihsb2NhbFJlcGxhY2VtZW50LmdldFByZXNlbnRlZEFmdGVyKCkpOwotCQljb3B5LnNldFByZXNlbnRlZEJlZm9yZShsb2NhbFJlcGxhY2VtZW50LmdldFByZXNlbnRlZEJlZm9yZSgpKTsKLQkJQWN0aXZpdHkgc3VwZXJBY3QgPSBsb2NhbFJlcGxhY2VtZW50LmdldFN1cGVyQWN0aXZpdGllcygpOwotCQlpbnQgaWQgPSBzdXBlckFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmluZGV4T2YobG9jYWxSZXBsYWNlbWVudCk7Ci0JCXN1cGVyQWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuc2V0KGlkLCBjb3B5KTsKLQkJCi0JCS8vIGFkZCBjb3B5IHBhY2thZ2UgdG8gdGhlIHBhY2thZ2Ugb2Ygc3VwZXIgYWN0aXZpdHkKLQkJLy8KLQkJKChQcm9jZXNzUGFja2FnZSlzdXBlckFjdC5lQ29udGFpbmVyKCkpLmdldENoaWxkUGFja2FnZXMoKS5hZGQoY29weS5lQ29udGFpbmVyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTW92ZURvd25Db21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL01vdmVEb3duQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NDhkMmE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTW92ZURvd25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBDb21tYW5kIHRvIG1vdmUgZG93biBlbGVtZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmUKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1vdmVEb3duQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgaW50IGVsZW1lbnRMb2NhdGlvbiA9IDA7Ci0KLQlwcml2YXRlIGludCB0cmFuc2ZlckxvY2F0aW9uID0gMDsKLQotCXByaXZhdGUgT2JqZWN0IGVsZW1lbnRPYmo7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZUNsYXNzZXM7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFkamFjZW50ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTW92ZURvd25Db21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBPYmplY3QgZWxlbWVudE9iaiwKLQkJCUNvbGxlY3Rpb24gZUNsYXNzZXMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQl0aGlzLmVsZW1lbnRPYmogPSBlbGVtZW50T2JqOwotCQl0aGlzLmVDbGFzc2VzID0gZUNsYXNzZXM7Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCUxpc3QgYWxsRWxlbWVudHMgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBhbGxFbGVtZW50cy5nZXQoaSk7Ci0JCQlpZiAob2JqLmVxdWFscyhlbGVtZW50T2JqKSkgewotCQkJCWVsZW1lbnRMb2NhdGlvbiA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKGludCBpID0gZWxlbWVudExvY2F0aW9uICsgMTsgaSA8PSBhbGxFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGFsbEVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChUbmdVdGlsLmlzRUNsYXNzSW5zdGFuY2VPZihlQ2xhc3Nlcywgb2JqKSkgewotCQkJCXRyYW5zZmVyTG9jYXRpb24gPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJQnJlYWtkb3duRWxlbWVudCBuZXh0ID0gIChCcmVha2Rvd25FbGVtZW50KSBhbGxFbGVtZW50cy5nZXQodHJhbnNmZXJMb2NhdGlvbik7Ci0JCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50T2JqOwotCQlpZihlLmdldFByZXNlbnRlZEFmdGVyKCkgPT0gbmV4dCkgewotCQkJYWRqYWNlbnQgPSB0cnVlOwotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYoYWRqYWNlbnQpIHsKLQkJCS8vIHN3YXAgInByZW5zZW50ZWQtYWZ0ZXIiIGVsZW1lbnQKLQkJCS8vCi0JCQlCcmVha2Rvd25FbGVtZW50IG5leHQgPSAgKEJyZWFrZG93bkVsZW1lbnQpIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuZ2V0KHRyYW5zZmVyTG9jYXRpb24pOwotCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnRPYmo7Ci0JCQllLnNldFByZXNlbnRlZEFmdGVyKG5leHQuZ2V0UHJlc2VudGVkQWZ0ZXIoKSk7Ci0JCQluZXh0LnNldFByZXNlbnRlZEFmdGVyKGUpOwotCQl9Ci0JCSgoRUxpc3QpIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpLm1vdmUodHJhbnNmZXJMb2NhdGlvbiwKLQkJCQllbGVtZW50TG9jYXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCSgoRUxpc3QpIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpLm1vdmUoZWxlbWVudExvY2F0aW9uLAotCQkJCXRyYW5zZmVyTG9jYXRpb24pOwotCQlpZihhZGphY2VudCkgewotCQkJLy8gcmVzdG9yZSAicHJlbnNlbnRlZC1hZnRlciIgZWxlbWVudAotCQkJLy8KLQkJCUJyZWFrZG93bkVsZW1lbnQgbmV4dCA9ICAoQnJlYWtkb3duRWxlbWVudCkgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5nZXQodHJhbnNmZXJMb2NhdGlvbik7Ci0JCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudE9iajsKLQkJCW5leHQuc2V0UHJlc2VudGVkQWZ0ZXIoZS5nZXRQcmVzZW50ZWRBZnRlcigpKTsKLQkJCWUuc2V0UHJlc2VudGVkQWZ0ZXIobmV4dCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTW92ZVVwQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Nb3ZlVXBDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk1MjlkZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Nb3ZlVXBDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBDb21tYW5kIHRvIG1vdmUgdXAgdGhlIGVsZW1lbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTW92ZVVwQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgaW50IGVsZW1lbnRMb2NhdGlvbiA9IDA7Ci0KLQlwcml2YXRlIGludCB0cmFuc2ZlckxvY2F0aW9uID0gMDsKLQotCXByaXZhdGUgT2JqZWN0IGVsZW1lbnRPYmo7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZUNsYXNzZXM7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFkamFjZW50ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTW92ZVVwQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgT2JqZWN0IGVsZW1lbnRPYmosCi0JCQlDb2xsZWN0aW9uIGVDbGFzc2VzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQkJdGhpcy5lbGVtZW50T2JqID0gZWxlbWVudE9iajsKLQkJdGhpcy5lQ2xhc3NlcyA9IGVDbGFzc2VzOwotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJfQotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlMaXN0IGFsbEVsZW1lbnRzID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gYWxsRWxlbWVudHMuZ2V0KGkpOwotCQkJaWYgKG9iai5lcXVhbHMoZWxlbWVudE9iaikpIHsKLQkJCQllbGVtZW50TG9jYXRpb24gPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWZvciAoaW50IGkgPSBlbGVtZW50TG9jYXRpb24gLSAxOyBpID49IDA7IGktLSkgewotCQkJT2JqZWN0IG9iaiA9IGFsbEVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChUbmdVdGlsLmlzRUNsYXNzSW5zdGFuY2VPZihlQ2xhc3Nlcywgb2JqKSkgewotCQkJCXRyYW5zZmVyTG9jYXRpb24gPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlCcmVha2Rvd25FbGVtZW50IHByZXYgPSAgKEJyZWFrZG93bkVsZW1lbnQpIGFsbEVsZW1lbnRzLmdldCh0cmFuc2ZlckxvY2F0aW9uKTsJCQotCQlpZihwcmV2LmdldFByZXNlbnRlZEFmdGVyKCkgPT0gZWxlbWVudE9iaikgewotCQkJYWRqYWNlbnQgPSB0cnVlOwotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYoYWRqYWNlbnQpIHsKLQkJCS8vIHN3YXAgInByZXNlbnRlZC1hZnRlciIgZWxlbWVudAotCQkJLy8KLQkJCUJyZWFrZG93bkVsZW1lbnQgcHJldiA9ICAoQnJlYWtkb3duRWxlbWVudCkgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5nZXQodHJhbnNmZXJMb2NhdGlvbik7CQkKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50T2JqOwotCQkJcHJldi5zZXRQcmVzZW50ZWRBZnRlcihlLmdldFByZXNlbnRlZEFmdGVyKCkpOwotCQkJZS5zZXRQcmVzZW50ZWRBZnRlcihwcmV2KTsKLQkJfQotCQkoKEVMaXN0KSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKS5tb3ZlKHRyYW5zZmVyTG9jYXRpb24sCi0JCQkJZWxlbWVudExvY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkoKEVMaXN0KSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKS5tb3ZlKGVsZW1lbnRMb2NhdGlvbiwKLQkJCQl0cmFuc2ZlckxvY2F0aW9uKTsKLQkJaWYoYWRqYWNlbnQpIHsKLQkJCS8vIHJlc3RvcmUgInByZXNlbnRlZC1hZnRlciIgZWxlbWVudAotCQkJLy8KLQkJCUJyZWFrZG93bkVsZW1lbnQgcHJldiA9ICAoQnJlYWtkb3duRWxlbWVudCkgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5nZXQodHJhbnNmZXJMb2NhdGlvbik7CQkKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50T2JqOwotCQkJZS5zZXRQcmVzZW50ZWRBZnRlcihwcmV2LmdldFByZXNlbnRlZEFmdGVyKCkpOwotCQkJcHJldi5zZXRQcmVzZW50ZWRBZnRlcihlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9PQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvT0JTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlYzg0MDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9PQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogRHJhZyBhbmQgZHJvcCBjb21tYW5kIGZvciBkcmFnZ2luZyByb2xlIGludG8gVGVhbSBBbGxvY2F0aW9uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT0JTRHJhZ0FuZERyb3BDb21tYW5kIGV4dGVuZHMgQlNEcmFnQW5kRHJvcENvbW1hbmQgewotCi0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEBwYXJhbSBvcGVyYXRpb25zCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uCi0JICovCi0JcHVibGljIE9CU0RyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgT2JqZWN0IG93bmVyLAotCQkJZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCWlmIChvd25lciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJcmV0dXJuIFByb2Nlc3NDb21tYW5kVXRpbC5nZXRWYWxpZERlc2NyaXB0b3Iob2JqLAotCQkJCQkJKEFjdGl2aXR5KSBvd25lciwKLQkJCQkJCSgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBkb21haW4pCi0JCQkJCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpKSA9PSBudWxsOwotCQkJfSBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJaWYgKFByb2Nlc3NVdGlsLmdldEFzc29jaWF0ZWRFbGVtZW50TGlzdCgKLQkJCQkJCSgoVGVhbVByb2ZpbGUpIG93bmVyKS5nZXRUZWFtUm9sZXMoKSkuY29udGFpbnMob2JqKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRHJvcENvbW1hbmQoT2JqZWN0IG93bmVyLCBMaXN0IGRyb3BTcmMpIHsKLQkJaWYgKG93bmVyIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXJldHVybiBuZXcgT0JTRHJvcENvbW1hbmQoKEFjdGl2aXR5KSBvd25lciwgZHJvcFNyYyk7Ci0JCX0gZWxzZSBpZiAob3duZXIgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJLy8gcmV0dXJuIG5ldyBHZW5lcmljRHJvcENvbW1hbmQoKFRlYW1Qcm9maWxlKSBvd25lciwKLQkJCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLCBkcm9wU3JjLAotCQkJLy8gZ2V0RHJvcEFkYXB0ZXIob3duZXIpKTsKLQkJCXJldHVybiBuZXcgQWRkUm9sZVRvVGVhbUNvbW1hbmQoKFRlYW1Qcm9maWxlKSBvd25lciwgZHJvcFNyYyk7Ci0JCX0gZWxzZSBpZiAob3duZXIgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQlyZXR1cm4gbmV3IEdlbmVyaWNEcm9wQ29tbWFuZCgoQ29tcG9zaXRlUm9sZSkgb3duZXIsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGVzKCksCi0JCQkJCWRyb3BTcmMsIGdldERyb3BBZGFwdGVyKG93bmVyKSk7Ci0JCX0KLQotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0KLQlwcml2YXRlIEdlbmVyaWNEcm9wQ29tbWFuZC5FbGVtZW50QWRhcHRlciBnZXREcm9wQWRhcHRlcihPYmplY3Qgb3duZXIpIHsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZG9tYWluKQotCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQlCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQob3duZXIsIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJcmV0dXJuIGFkYXB0ZXIuY3JlYXRlRHJvcEFkYXB0ZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL09CU0Ryb3BDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL09CU0Ryb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwYjM5MTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9PQlNEcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklOZXN0ZWRDb21tYW5kUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5VbmlxdWVOYW1lUE5hbWVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBDb21tYW5kIHRvIGRyYXAgYW5kIGRyb3Agcm9sZXMgdG8gVGVhbSBBbGxvY2F0aW9uIGJyZWFrZG93biBzdHJ1Y3R1cmUKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNEcm9wQ29tbWFuZCBleHRlbmRzIEJTRHJvcENvbW1hbmQgewotCXByaXZhdGUgQXJyYXlMaXN0IHdwRGVzY0xpc3Q7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCByb2xlRGVzY0xpc3Q7Ci0KLQlwcml2YXRlIE1hcCByb2xlRGVzY1RlYW1Qcm9maWxlTWFwOwotCi0JcHJpdmF0ZSBNYXAgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHdwZFRvVGFza0ZlYXR1cmVzTWFwOyAvLyBtYXAgb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yIHRvCi0KLQkvLyBtYXAgb2YgdGFzayBvdCBmZWF0dXJlIGxpc3QKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRvciBjb25maWdyYXRvcjsKLQotCXByaXZhdGUgYm9vbGVhbiBuZXdEdXBsaWNhdGVzUmVtb3ZlZDsKLQotCXB1YmxpYyBPQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3QsIExpc3Qgcm9sZXMpIHsKLQkJc3VwZXIoYWN0LCByb2xlcyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRyb3BFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgUm9sZSkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGRyb3BFbGVtZW50cwotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gc3luY2hGZWF0dXJlcwotCSAqLwotCXB1YmxpYyBPQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCBkcm9wRWxlbWVudHMsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU2V0IHN5bmNoRmVhdHVyZXMsCi0JCQlJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcikgewotCQlzdXBlcihhY3Rpdml0eSwgZHJvcEVsZW1lbnRzLCBjb25maWcsIHN5bmNoRmVhdHVyZXMpOwotCQl0aGlzLmNvbmZpZ3JhdG9yID0gY29uZmlndXJhdG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjcHJlRXhlY3V0ZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlRXhlY3V0ZSgpIHsKLQkJaWYgKCFzdXBlci5wcmVFeGVjdXRlKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcm9sZURlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0YXNrRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdwRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJU2V0IGRlc2NyaXB0b3JzVG9SZWZyZXNoID0gc3luY2hyb25pemUgPyBiYXRjaENvbW1hbmQKLQkJCQkuZ2V0RGVzY3JpcHRvcnNUb1JlZnJlc2goKSA6IG51bGw7Ci0KLQkJTGlzdCBiZXMgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQlVbmlxdWVOYW1lUE5hbWVIYW5kbGVyIHVuaXF1ZU5hbWVzSGFuZGxlciA9IG5ldyBVbmlxdWVOYW1lUE5hbWVIYW5kbGVyKGJlcywgYmVzKTsKLQkJCQkKLQkJaW50IHNpemUgPSBkcm9wRWxlbWVudHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJUm9sZSByb2xlID0gKFJvbGUpIGRyb3BFbGVtZW50cy5nZXQoaSk7Ci0JCQlpZiAoVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKHJvbGUpKSB7Ci0JCQkJcm9sZSA9IChSb2xlKSBUbmdVdGlsLmdldEJhc2Uocm9sZSk7Ci0JCQl9Ci0KLQkJCS8vIGNoZWNrIGlmIHRoZSByb2xlIGRlc2NyaXB0b3Igb2YgdGhlIHJvbGUgZXhpc3RzIHVuZGVyIHRoaXMKLQkJCS8vIGFjdGl2aXR5Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsCi0JCQkJCS5nZXREZXNjcmlwdG9yKHJvbGUsIGFjdGl2aXR5LCBjb25maWcpOwotCi0JCQlpZiAocm9sZURlc2MgPT0gbnVsbCkgewotCQkJCS8vIGNyZWF0ZSByb2xlIGRlc2NyaXB0b3Igb2JqZWN0Ci0JCQkJcm9sZURlc2MgPSBQcm9jZXNzVXRpbC5jcmVhdGVSb2xlRGVzY3JpcHRvcihyb2xlKTsKLQkJCQl1bmlxdWVOYW1lc0hhbmRsZXIuZW5zdXJlVW5pcXVlKHJvbGVEZXNjKTsKLQkJCQlyb2xlRGVzY0xpc3QuYWRkKHJvbGVEZXNjKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gbmVlZCB0byBjbGVhciBhbGwgdGhlIHJlZnJlc2hhYmxlIGZlYXR1cmVzIG9mIHRoZSBleGlzdGluZwotCQkJCS8vIGRlc2NyaXB0b3IKLQkJCQkvLwotCQkJCWlmIChzeW5jaHJvbml6ZQotCQkJCQkJJiYgcm9sZURlc2MuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkJCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCWJhdGNoQ29tbWFuZC5nZXREZXNjcmlwdG9yc1RvUmVmcmVzaCgpLmFkZChyb2xlRGVzYyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gaWYgbm90IGEgc3luY2hyb25pemF0aW9uLCBnZXQgYWxsIHdvcmtwcm9kdWN0cyB3aGljaCBoYXZlIHJvbGUgYXMKLQkJLy8gcmVzcG9uc2libGUgcm9sZSBmb3IKLQkJLy8gd2hpY2ggd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgbmVlZHMgdG8gYmUgY3JlYXRlZAotCQkvLwotCQlpZiAoIXN5bmNocm9uaXplKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVJvbGUgcm9sZSA9IChSb2xlKSBkcm9wRWxlbWVudHMuZ2V0KGkpOwotCQkJCUxpc3Qgd29ya1Byb2R1Y3RzID0gUHJvY2Vzc1V0aWwuZ2V0V29ya1Byb2R1Y3RzRm9yUm9sZShyb2xlLAotCQkJCQkJY29uZmlnKTsKLQkJCQlpZiAoKHdvcmtQcm9kdWN0cyAhPSBudWxsKSAmJiAoISh3b3JrUHJvZHVjdHMuaXNFbXB0eSgpKSkpIHsKLQkJCQkJSGFzaE1hcCB3cFRvRXhpc3RpbmdEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkJTGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoYWN0aXZpdHkKLQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSk7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbCh3cERlc2NMaXN0KTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd29ya1Byb2R1Y3RzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIGl0ZXIubmV4dCgpOwkJCQkJCQotCQkJCQkJT2JqZWN0IHdwZCA9IFByb2Nlc3NVdGlsLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcih3cERlc2NMaXN0LCB3cCk7Ci0JCQkJCQlpZih3cGQgPT0gbnVsbCkgewotCQkJCQkJCXdwZCA9IFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKHdwLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQkJCX0KLQkJCQkJCWlmICh3cGQgIT0gbnVsbCkgewotCQkJCQkJCXdwVG9FeGlzdGluZ0Rlc2NyaXB0b3JNYXAucHV0KHdwLCB3cGQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCUxpc3Qgc2VsZWN0ZWRXb3JrUHJvZHVjdHMgPSBuZXcgQXJyYXlMaXN0KAotCQkJCQkJCXdwVG9FeGlzdGluZ0Rlc2NyaXB0b3JNYXAua2V5U2V0KCkpOwotCQkJCQl3b3JrUHJvZHVjdHMucmVtb3ZlQWxsKHNlbGVjdGVkV29ya1Byb2R1Y3RzKTsKLQkJCQkJaWYgKCF3b3JrUHJvZHVjdHMuaXNFbXB0eSgpKSB7Ci0JCQkJCQlMaXN0IHNlbGVjdGVkID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCQkJCS5zZWxlY3RXb3JrUHJvZHVjdHMod29ya1Byb2R1Y3RzLCByb2xlKTsKLQkJCQkJCWlmIChzZWxlY3RlZCAhPSBudWxsKSB7Ci0JCQkJCQkJc2VsZWN0ZWRXb3JrUHJvZHVjdHMuYWRkQWxsKHNlbGVjdGVkKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWlmICghc2VsZWN0ZWRXb3JrUHJvZHVjdHMuaXNFbXB0eSgpKSB7Ci0JCQkJCQlIYXNoU2V0IGFsbFNlbGVjdGVkVGFza3MgPSBuZXcgSGFzaFNldCgpOwotCi0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNlbGVjdGVkV29ya1Byb2R1Y3RzLnNpemUoKTsgaisrKSB7Ci0JCQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIHNlbGVjdGVkV29ya1Byb2R1Y3RzCi0JCQkJCQkJCQkuZ2V0KGopOwotCi0JCQkJCQkJaWYgKFRuZ1V0aWwuaXNDb250cmlidXRvcih3cCkpIHsKLQkJCQkJCQkJd3AgPSAoV29ya1Byb2R1Y3QpIFRuZ1V0aWwuZ2V0QmFzZSh3cCk7Ci0JCQkJCQkJfQotCQkJCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB3cFRvRXhpc3RpbmdEZXNjcmlwdG9yTWFwLmdldCh3cCk7Ci0JCQkJCQkJaWYgKHdwRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCXdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbAotCQkJCQkJCQkJCS5nZXREZXNjcmlwdG9yKHdwLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHdwRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCXdwRGVzYyA9IFByb2Nlc3NDb21tYW5kVXRpbAotCQkJCQkJCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3Iod3AsCi0JCQkJCQkJCQkJCQljb25maWcsCi0JCQkJCQkJCQkJCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMpOwotCQkJCQkJCQl3cERlc2NMaXN0LmFkZCh3cERlc2MpOwotCi0JCQkJCQkJCS8vIGF1dG9tYXRpYyBhZGRpbmcgdG8gdGhlIGV4aXN0aW5nIGRlbGl2ZXJhYmxlCi0JCQkJCQkJCS8vIGRlc2NyaXB0b3IgaW4gdGhlIGFjdGl2aXR5J3Mgc2NvcGUgaWYgdGhlcmUKLQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJLy8gYW55Ci0JCQkJCQkJCS8vIHZhbGlkIG9uZS4KLQkJCQkJCQkJLy8KLQkJCQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJCQkJCQkuZ2V0RGVsaXZlcmFibGUoYWN0aXZpdHksIHdwKTsKLQkJCQkJCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQkJCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAucHV0KHdwRGVzYywKLQkJCQkJCQkJCQkJZGVzY3JpcHRvcik7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmIChkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsCi0JCQkJCQkJCQkJJiYgd3BEZXNjLmdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JCQkJCQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLmFkZCh3cERlc2MpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmICh3cCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlCi0JCQkJCQkJCQkJJiYgc3luY2hGZWF0dXJlcwotCQkJCQkJCQkJCQkJLmNvbnRhaW5zKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSkpIHsKLQkJCQkJCQkJCVByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVEZWxpdmVyYWJsZVBhcnRzKAotCQkJCQkJCQkJCQl3cERlc2MsIChEZWxpdmVyYWJsZSkgd3AsIGNvbmZpZywKLQkJCQkJCQkJCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLAotCQkJCQkJCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0KLQkJCQkJCQkvLyBnZXQgYWxsIHBvc3NpYmxlIHRhc2tzIGZvciB0aGlzIHdvcmtwcm9kdWN0IGZvcgotCQkJCQkJCS8vIHdoaWNoIHRhc2sgZGVzY3JpcHRvciBuZWVkcyB0byBiZSBjcmVhdGVkCi0JCQkJCQkJTGlzdCB0YXNrcyA9IFByb2Nlc3NVdGlsLmdldFRhc2tzRm9yV29ya1Byb2R1Y3Qod3AsCi0JCQkJCQkJCQljb25maWcpOwotCi0JCQkJCQkJaWYgKCh0YXNrcyAhPSBudWxsKSAmJiAodGFza3Muc2l6ZSgpID4gMCkpIHsKLQkJCQkJCQkJLy8gZXhjbHVkZSBhbnkgdGFzayB0aGF0IGlzIGFscmVhZHkgc2VsZWN0ZWQgb3IgYWxyZWFkeSBleGlzdHMgaW4gYWN0aXZpdHkKLQkJCQkJCQkJLy8KLQkJCQkJCQkJdGFza3MucmVtb3ZlQWxsKGFsbFNlbGVjdGVkVGFza3MpOwotCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXNrcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdGVyLm5leHQoKTsKLQkJCQkJCQkJCU9iamVjdCB0ZCA9IFByb2Nlc3NVdGlsLmdldFRhc2tEZXNjcmlwdG9yKHRhc2tEZXNjTGlzdCwgdGFzayk7IAotCQkJCQkJCQkJaWYodGQgPT0gbnVsbCkgewotCQkJCQkJCQkJCXRkID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldERlc2NyaXB0b3IodGFzaywgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZih0ZCAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCi0JCQkJCQkJCWlmICghdGFza3MuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCQkvLyBzaG93IHRhc2sgc2VsZWN0aW9ucyBkaWFsb2cKLQkJCQkJCQkJCUxpc3Qgc2VsZWN0ZWRUYXNrcyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkJCQkJCQkuc2VsZWN0VGFza3ModGFza3MsIHdwKTsKLQotCQkJCQkJCQkJaWYgKChzZWxlY3RlZFRhc2tzICE9IG51bGwpCi0JCQkJCQkJCQkJCSYmICgoIXNlbGVjdGVkVGFza3MuaXNFbXB0eSgpKSkpIHsKLQkJCQkJCQkJCQlhbGxTZWxlY3RlZFRhc2tzLmFkZEFsbChzZWxlY3RlZFRhc2tzKTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJLy8gSWYgbm8gdGFza3MgYXJlIHNlbGVjdGVkLCBhZGQKLQkJCQkJCQkJCQkvLyBSZXNwb25zaWJsZSByb2xlIHRvIHdwCi0JCQkJCQkJCQkJUEJTRHJvcENvbW1hbmQuYWRkUmVzcG9uc2libGVSb2xlKAotCQkJCQkJCQkJCQkJd3BEZXNjLCBhY3Rpdml0eSwgcm9sZURlc2NMaXN0LAotCQkJCQkJCQkJCQkJbnVsbCwgY29uZmlnKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCS8vIElmIHRoZXJlIGFyZSBubyB0YXNrcyB0byBzaG93LCBhZGQKLQkJCQkJCQkJLy8gUmVzcG9uc2libGUgcm9sZSB0byB3cAotCQkJCQkJCQlQQlNEcm9wQ29tbWFuZC5hZGRSZXNwb25zaWJsZVJvbGUod3BEZXNjLAotCQkJCQkJCQkJCWFjdGl2aXR5LCByb2xlRGVzY0xpc3QsIG51bGwsIGNvbmZpZyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQkvLyBjcmVhdGUgdGFzayBkZXNjcmlwdG9ycyBmb3IgdGhpcyB3b3JrcHJvZHVjdAotCQkJCQkJaWYgKChhbGxTZWxlY3RlZFRhc2tzICE9IG51bGwpCi0JCQkJCQkJCSYmICghKGFsbFNlbGVjdGVkVGFza3MuaXNFbXB0eSgpKSkpIHsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBhbGxTZWxlY3RlZFRhc2tzLml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0KLQkJCQkJCQkJVGFzayB0YXNrID0gKFRhc2spIGl0b3IubmV4dCgpOwotCi0JCQkJCQkJCS8vIGNhbGwgdGhpcyBtZXRob2QgZXZlbiB0aGUgZGVzY3JpcHRvciBmb3IgdGhlCi0JCQkJCQkJCS8vIGdpdmVuIHRhc2sgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBhY3Rpdml0eQotCQkJCQkJCQkvLyB0byBhZGQgYW55IGFkZGl0aW9uYWwgcmVsYXRpb25zaGlwcyBpbiBjYXNlCi0JCQkJCQkJCS8vIG9mCi0JCQkJCQkJCS8vIHJlY2VudCBjaGFuZ2UgaW4gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCQkJCQkJCQkvLyBvZiB0aGUgcHJvY2Vzcy4KLQkJCQkJCQkJUEJTRHJvcENvbW1hbmQKLQkJCQkJCQkJCQkuYWRkVG9EZXNjcmlwdG9yTGlzdHMoCi0JCQkJCQkJCQkJCQl0YXNrLAotCQkJCQkJCQkJCQkJYWN0aXZpdHksCi0JCQkJCQkJCQkJCQl0YXNrRGVzY0xpc3QsCi0JCQkJCQkJCQkJCQlyb2xlRGVzY0xpc3QsCi0JCQkJCQkJCQkJCQl3cERlc2NMaXN0LAotCQkJCQkJCQkJCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLAotCQkJCQkJCQkJCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2gsCi0JCQkJCQkJCQkJCQliYXRjaENvbW1hbmQKLQkJCQkJCQkJCQkJCQkJLmdldE9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCgpLAotCQkJCQkJCQkJCQkJY29uZmlnLCBzeW5jaEZlYXR1cmVzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKCFyb2xlRGVzY0xpc3QuaXNFbXB0eSgpIC8vIHx8ICFyb2xlQXNzb2NpYXRpb25MaXN0LmlzRW1wdHkoKQotCQkJCXx8ICF0YXNrRGVzY0xpc3QuaXNFbXB0eSgpCi0JCQkJfHwgIXdwRGVzY0xpc3QuaXNFbXB0eSgpCi0JCQkJfHwgKHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyAhPSBudWxsICYmICF3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMKLQkJCQkJCS5pc0VtcHR5KCkpIHx8ICF3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5pc0VtcHR5KCkpCi0JCQkJfHwgKGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwgJiYgIWRlc2NyaXB0b3JzVG9SZWZyZXNoCi0JCQkJCQkuaXNFbXB0eSgpKSB8fCBiYXRjaENvbW1hbmQuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZG9FeGVjdXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCXJlbW92ZU5ld0R1cGxpY2F0ZXMoKTsKLQotCQkvLyBhZGQgcm9sZSBkZXNjcmlwdG9ycyB0byBhY3Rpdml0eQotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbChyb2xlRGVzY0xpc3QpOwotCi0JCWlmIChyb2xlRGVzY1RlYW1Qcm9maWxlTWFwID09IG51bGwpIHsKLQkJCS8vIHByZXBhcmUgZm9yIGF1dG9tYXRpYyBhc3NpZ25tZW50IG9mIHJvbGUgZGVzY3JpcHRvciB0byB0ZWFtCi0JCQkvLyBwcm9maWxlCi0JCQkvLwotCQkJcm9sZURlc2NUZWFtUHJvZmlsZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCVRlYW1Qcm9maWxlIHRlYW1Qcm9maWxlID0gVXNlckludGVyYWN0aW9uSGVscGVyLmdldFRlYW0oCi0JCQkJCQlhY3Rpdml0eSwgcm9sZURlc2MuZ2V0Um9sZSgpKTsKLQkJCQlpZiAodGVhbVByb2ZpbGUgIT0gbnVsbCkgewotCQkJCQlyb2xlRGVzY1RlYW1Qcm9maWxlTWFwLnB1dChyb2xlRGVzYywgdGVhbVByb2ZpbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGFkZCByb2xlIGRlc2NyaXB0b3JzIHRvIHRlYW0gcHJvZmlsZXMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcm9sZURlc2NUZWFtUHJvZmlsZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5hZGQoZW50cnkuZ2V0S2V5KCkpOwotCQl9Ci0KLQkJLy8gYXV0b21hdGljYWxseSBhZGQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8gZGVsaXZlcmFibGUgcGFydAotCQkvLwotCQlpZiAoIXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuZW50cnlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlbGl2ZXJhYmxlID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZW50cnkKLQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCWRlbGl2ZXJhYmxlLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGQoZW50cnkuZ2V0S2V5KCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbCh3cERlc2NMaXN0KTsKLQotCQkvLyBhZGQgdGFzayBkZXNjcmlwdG9ycwotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbCh0YXNrRGVzY0xpc3QpOwotCi0JCS8vIGFkZCBkZWxpdmVyYWJsZSBwYXJ0cyB0byB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCS8vCi0JCWlmICghd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbnRyeQotCQkJCQkJLmdldEtleSgpOwotCQkJCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkQWxsKAotCQkJCQkJKENvbGxlY3Rpb24pIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIG5ldyBkZXNjcmlwdG9ycyB0byBhY3Rpdml0eSdzIHBhY2thZ2UKLQkJLy8KLQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBhY3Rpdml0eS5lQ29udGFpbmVyKCk7Ci0JCWlmIChwa2cgIT0gbnVsbCkgewotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbCh0YXNrRGVzY0xpc3QpOwotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbChyb2xlRGVzY0xpc3QpOwotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbCh3cERlc2NMaXN0KTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBnZXRNb2RpZmllZFJlc291cmNlcygpLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIG5ldyBlbGVtZW50cyB0aGF0IGFyZSBkdXBsaWNhdGUgYi9jIHRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlCi0JICogcHJldmlvdXMgV0JTRHJvcENvbW1hbmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTmV3RHVwbGljYXRlcygpIHsKLQkJaWYgKHN5bmNocm9uaXplKSB7Ci0JCQlpZiAoIW5ld0R1cGxpY2F0ZXNSZW1vdmVkKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0ZXIKLQkJCQkJCQkubmV4dCgpOwotCQkJCQlPYmplY3QgZGVzYyA9IFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKHdwZAotCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpLCBhY3Rpdml0eSwKLQkJCQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQkJCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQkJaWYgKHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyAhPSBudWxsKSB7Ci0JCQkJCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLnJlbW92ZSh3cGQpOwotCQkJCQkJfQotCQkJCQkJaWYgKHdwZFRvVGFza0ZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJCQkJCQl3cGRUb1Rhc2tGZWF0dXJlc01hcC5yZW1vdmUod3BkKTsKLQkJCQkJCX0KLQkJCQkJCWlmICh3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCAhPSBudWxsKSB7Ci0JCQkJCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAucmVtb3ZlKHdwZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbmV3RHVwbGljYXRlc1JlbW92ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNkb1VuZG8oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVW5kbygpIHsKLQkJLy8gcmVtb3ZlIHJvbGUgZGVzY3JpcHRvcnMgZnJvbSBhY3Rpdml0eQotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbChyb2xlRGVzY0xpc3QpOwotCi0JCS8vIHJlbW92ZSByb2xlIGRlc2NyaXB0b3JzIGZyb20gdGVhbSBwcm9maWxlcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlRGVzY1RlYW1Qcm9maWxlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQl0ZWFtLmdldFRlYW1Sb2xlcygpLnJlbW92ZShlbnRyeS5nZXRLZXkoKSk7Ci0JCX0KLQotCQkvLyByZW1vdmUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCS8vCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKHdwRGVzY0xpc3QpOwotCi0JCS8vIHJlbW92ZSB0YXNrIGRlc2NyaXB0b3JzCi0JCS8vCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKHRhc2tEZXNjTGlzdCk7Ci0KLQkJLy8gLy8gZGlzYXNzb2NpYXRlIG5ldyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgd2l0aCB0YXNrIGRlc2NyaXB0b3JzCi0JCS8vIC8vCi0JCS8vIGlmKHdwZFRvVGFza0ZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gd3BkVG9UYXNrRmVhdHVyZXNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCS8vIE1hcCB0YXNrRmVhdHVyZXMgPSAoTWFwKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdGFza0ZlYXR1cmVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJLy8gLmhhc05leHQoKTspIHsKLQkJLy8gTWFwLkVudHJ5IGVudCA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJLy8gVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpCi0JCS8vIFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKGVudC5nZXRLZXkoKSwgYWN0aXZpdHksCi0JCS8vIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IxID0gKChDb2xsZWN0aW9uKWVudC5nZXRWYWx1ZSgpKS5pdGVyYXRvcigpOwotCQkvLyBpdGVyYXRvcjEKLQkJLy8gLmhhc05leHQoKTspIHsKLQkJLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyYXRvcjEubmV4dCgpOwotCQkvLyBFU3RydWN0dXJhbEZlYXR1cmUgZGVzY0ZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKQotCQkvLyBGRUFUVVJFX01BUC5nZXQoZik7Ci0JCS8vIGlmKGRlc2NGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCS8vICgoTGlzdCl0YXNrRGVzYy5lR2V0KGRlc2NGZWF0dXJlKSkucmVtb3ZlKGVudHJ5LmdldEtleSgpKTsKLQkJLy8gfQotCQkvLyBlbHNlIHsKLQkJLy8gdGFza0Rlc2MuZVNldChkZXNjRmVhdHVyZSwgbnVsbCk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCi0JCS8vIHJlbW92ZSBkZWxpdmVyYWJsZSBwYXJ0cyB0byB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCS8vCi0JCWlmICghd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbnRyeQotCQkJCQkJLmdldEtleSgpOwotCQkJCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkucmVtb3ZlQWxsKAotCQkJCQkJKENvbGxlY3Rpb24pIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gcmVtb3ZlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGZyb20gZGVsaXZlcmFibGUgcGFydAotCQkvLwotCQlpZiAoIXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuZW50cnlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlbGl2ZXJhYmxlID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZW50cnkKLQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCWRlbGl2ZXJhYmxlLmdldERlbGl2ZXJhYmxlUGFydHMoKS5yZW1vdmUoZW50cnkuZ2V0S2V5KCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gcmVtb3ZlIHJvbGUgZGVzY3JpcHRvcnMgZnJvbSBhY3Rpdml0eSdzIHBhY2thZ2UKLQkJLy8KLQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBhY3Rpdml0eS5lQ29udGFpbmVyKCk7Ci0JCWlmIChwa2cgIT0gbnVsbCkgewotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZUFsbCh0YXNrRGVzY0xpc3QpOwotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZUFsbChyb2xlRGVzY0xpc3QpOwotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZUFsbCh3cERlc2NMaXN0KTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZUFsbCgoQ29sbGVjdGlvbikgaXRlci5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gLyoqCi0JLy8gKiBHZXQgdGFzayBkZXNjcmlwdG9ycyBtYXAgZm9yIGFuIGFjdGl2aXR5Ci0JLy8gKiBAcGFyYW0gYWN0aXZpdHkKLQkvLyAqIEByZXR1cm4KLQkvLyAqLwotCS8vIHByaXZhdGUgc3RhdGljIEhhc2hNYXAgZ2V0VGFza3NNYXBGb3JBY3Rpdml0eShBY3Rpdml0eSBhY3Rpdml0eSkKLQkvLyB7Ci0JLy8gTGlzdCBlbGVtZW50cyA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JLy8gSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCS8vIGZvciAoaW50IGk9MDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKQotCS8vIHsKLQkvLyBPYmplY3Qgb2JqID0gZWxlbWVudHMuZ2V0KGkpOwotCS8vIGlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikKLQkvLyB7Ci0JLy8gVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIG9iajsKLQkvLyBUYXNrIHRhc2sgPSB0YXNrRGVzYy5nZXRUYXNrKCk7Ci0JLy8gaWYgKHRhc2sgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gbWFwLnB1dCh0YXNrLCB0YXNrRGVzYyk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIG1hcDsKLQkvLyB9Ci0JLy8JCi0JLy8JCi0JLy8gLyoqCi0JLy8gKiBTaG93IFJvbGVBc3NvY2lhdGlvbiBEaWFsb2cKLQkvLyAqIEBwYXJhbSB0YXNrcwotCS8vICovCi0JLy8gcHJpdmF0ZSBzdGF0aWMgaW50IHNob3dSb2xlQXNzb2NpYXRpb25EaWFsb2coVGFzayB0YXNrKQotCS8vIHsKLQkvLwkJCi0JLy8gUm9sZUFzc29jaWF0aW9uRGlhbG9nIHJvbGVBc3NvYyA9IG5ldwotCS8vIFJvbGVBc3NvY2lhdGlvbkRpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCB0YXNrKTsKLQkvLyByb2xlQXNzb2Mub3BlbigpOwotCS8vCQkKLQkvLyAvLyBzZWxlY3RlZCB0YXNrczsKLQkvLyByZXR1cm4gcm9sZUFzc29jLmdldFJvbGVBc3NvY2lhdGlvbigpOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNnZXRBZmZlY3RlZE9iamVjdHMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJaWYgKHJvbGVEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcm9sZURlc2NMaXN0OwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAocm9sZURlc2NMaXN0ICE9IG51bGwpIHsKLQkJCXJvbGVEZXNjTGlzdC5jbGVhcigpOwotCQl9Ci0JCWlmIChyb2xlRGVzY1RlYW1Qcm9maWxlTWFwICE9IG51bGwpIHsKLQkJCXJvbGVEZXNjVGVhbVByb2ZpbGVNYXAuY2xlYXIoKTsKLQkJfQotCQlpZiAod3BEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQl3cERlc2NMaXN0LmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyAhPSBudWxsKSB7Ci0JCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuY2xlYXIoKTsKLQkJfQotCQlpZiAod3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAgIT0gbnVsbCkgewotCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuY2xlYXIoKTsKLQkJfQotCQlpZiAod3BkVG9UYXNrRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJd3BkVG9UYXNrRmVhdHVyZXNNYXAuY2xlYXIoKTsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlTmVzdGVkQ29tbWFuZHMoKSB7Ci0JCUxpc3QgbmVzdGVkQ29tbWFuZFByb3ZpZGVycyA9IEV4dGVuc2lvbk1hbmFnZXIKLQkJCQkuZ2V0TmVzdGVkQ29tbWFuZFByb3ZpZGVycygpOwotCQlpZiAoIW5lc3RlZENvbW1hbmRQcm92aWRlcnMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoIXRhc2tEZXNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXN0ZWRDb21tYW5kUHJvdmlkZXJzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlOZXN0ZWRDb21tYW5kUHJvdmlkZXIgY21kUHJvdmlkZXIgPSAoSU5lc3RlZENvbW1hbmRQcm92aWRlcikgaXRlcgotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlDb21tYW5kIGNtZCA9IGNtZFByb3ZpZGVyLmNyZWF0ZVJlbGF0ZWRPYmplY3RzKAotCQkJCQkJCQl0YXNrRGVzY0xpc3QsIE9CU0Ryb3BDb21tYW5kLnRoaXMpOwotCQkJCQkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQkJCQljbWQuZXhlY3V0ZSgpOwotCQkJCQkJCWdldE5lc3RlZENvbW1hbmRzKCkuYWRkKGNtZCk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5leGVjdXRlTmVzdGVkQ29tbWFuZHMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1BCU0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9QQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWZmMmVjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1BCU0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotCi0vKioKLSAqIERyYWcgYW5kIGRyb3AgY29tbWFuZCBmb3IgZHJvcHBpbmcgd29yayBwcm9kdWN0cyBpbnRvIFdQIFVzYWdlIHN0cnVjdHVyZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBCU0RyYWdBbmREcm9wQ29tbWFuZCBleHRlbmRzIEJTRHJhZ0FuZERyb3BDb21tYW5kIHsKLQotCS8qKgotCSAqIEBwYXJhbSBkb21haW4KLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiBAcGFyYW0gb3BlcmF0aW9ucwotCSAqIEBwYXJhbSBvcGVyYXRpb24KLQkgKiBAcGFyYW0gY29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBQQlNEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIE9iamVjdCBvd25lciwKLQkJCWZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGRvbWFpbiwgb3duZXIsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJhZ0FuZERyb3BDb21tYW5kI2FjY2VwdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCW9iaiA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0KLQkJaWYob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCWlmKG93bmVyIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlyZXR1cm4gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldFZhbGlkRGVzY3JpcHRvcihvYmosIChBY3Rpdml0eSkgb3duZXIsCi0JCQkJCQkoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkpID09IG51bGw7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJhZ0FuZERyb3BDb21tYW5kI2NyZWF0ZURyb3BDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsIExpc3QgZHJvcFNyYykgewotCQlyZXR1cm4gbmV3IFBCU0Ryb3BDb21tYW5kKChBY3Rpdml0eSkgb3duZXIsIGRyb3BTcmMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9QQlNEcm9wQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9QQlNEcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYzk1MWVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUEJTRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQmF0Y2hDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JTmVzdGVkQ29tbWFuZFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uVW5pcXVlTmFtZVBOYW1lSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQ29tbWFuZCB0byBkcmFnIGFuZCBkcm9wIHdvcmsgcHJvZHVjdHMgdG8gV29yayBQcm9kdWN0IFVzYWdlIGJyZWFrZG93bgotICogc3RydWN0dXJlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUEJTRHJvcENvbW1hbmQgZXh0ZW5kcyBCU0Ryb3BDb21tYW5kIHsKLQlwcml2YXRlIEFycmF5TGlzdCB3cERlc2NMaXN0OwotCi0JcHJpdmF0ZSBBcnJheUxpc3Qgcm9sZURlc2NMaXN0OwotCi0JcHJpdmF0ZSBNYXAgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwOwotCi0JcHJpdmF0ZSBCYXRjaENvbW1hbmQgdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZDsKLQotCXByaXZhdGUgYm9vbGVhbiBuZXdEdXBsaWNhdGVzUmVtb3ZlZDsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBsaW5rZWRUYXNrczsKLQotCXByaXZhdGUgSGFzaE1hcCB3cGRUb1Rhc2tGZWF0dXJlc01hcDsKLQotCXB1YmxpYyBQQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCB3b3JrUHJvZHVjdHMpIHsKLQkJc3VwZXIoYWN0aXZpdHksIHdvcmtQcm9kdWN0cyk7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZHJvcEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGRyb3BFbGVtZW50cwotCSAqIEBwYXJhbSBzeW5jaAotCSAqLwotCXB1YmxpYyBQQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCBkcm9wRWxlbWVudHMsIGJvb2xlYW4gc3luY2gpIHsKLQkJc3VwZXIoYWN0aXZpdHksIGRyb3BFbGVtZW50cywgc3luY2gpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBkcm9wRWxlbWVudHMKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHN5bmNoRmVhdHVyZXMKLQkgKi8KLQlwdWJsaWMgUEJTRHJvcENvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIExpc3QgZHJvcEVsZW1lbnRzLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFNldCBzeW5jaEZlYXR1cmVzLCBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcikgewotCQlzdXBlcihhY3Rpdml0eSwgZHJvcEVsZW1lbnRzLCBjb25maWcsIHN5bmNoRmVhdHVyZXMpOwotCQl0aGlzLmNvbmZpZ3VyYXRvciA9IGNvbmZpZ3VyYXRvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI3ByZUV4ZWN1dGUoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZUV4ZWN1dGUoKSB7Ci0JCWlmICghc3VwZXIucHJlRXhlY3V0ZSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXdwRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRhc2tEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcm9sZURlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMgPSBuZXcgSGFzaE1hcCgpOwotCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJaWYoIXN5bmNocm9uaXplIHx8IChzeW5jaHJvbml6ZSAmJiBzeW5jaEZlYXR1cmVzLmNvbnRhaW5zKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpKSkpIHsKLQkJCS8vIGFkZCBzdWJhcnRpZmFjdHMgdG8gZHJvcEVsZW1lbnRzIGxpc3QgaWYgdGhlcmUgaXMgYW55Ci0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChkcm9wRWxlbWVudHMpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGVsZW1lbnQsIGZhbHNlKSB7Ci0JCQkJCQkKLQkJCQkJCS8qKgotCQkJCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkJCSAqLwotCQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ4MjA0Nzc4ODc0MjYwODcyNjJMOwotCQkJCQkJCi0JCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJCU9iamVjdCBzdWJBcnRpZmFjdHMgPSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5nZXRSZWZlcmVuY2UoCi0JCQkJCQkJCQkoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKSwKLQkJCQkJCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJCQkJcmV0dXJuICgoQ29sbGVjdGlvbilzdWJBcnRpZmFjdHMpLml0ZXJhdG9yKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJfTsKLQkJCQkJCi0JCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCUFydGlmYWN0IHN1YkFydGlmYWN0ID0gKEFydGlmYWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAoIWRyb3BFbGVtZW50cy5jb250YWlucyhzdWJBcnRpZmFjdCkgJiYgcHJlcGFyZUFkZCgoV29ya1Byb2R1Y3QpIHN1YkFydGlmYWN0KSkgCi0JCQkJCQl7Ci0JCQkJCQkJZHJvcEVsZW1lbnRzLmFkZChzdWJBcnRpZmFjdCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJU2V0IGRlc2NyaXB0b3JzVG9SZWZyZXNoID0gc3luY2hyb25pemUgPyBiYXRjaENvbW1hbmQuZ2V0RGVzY3JpcHRvcnNUb1JlZnJlc2goKSA6IG51bGw7Ci0JCQotCQlMaXN0IGJlcyA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCVVuaXF1ZU5hbWVQTmFtZUhhbmRsZXIgdW5pcXVlTmFtZXNIYW5kbGVyID0gbmV3IFVuaXF1ZU5hbWVQTmFtZUhhbmRsZXIoYmVzLCBiZXMpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkcm9wRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBkcm9wRWxlbWVudHMuZ2V0KGkpOwkJCQotCQkJaWYgKFRuZ1V0aWwuaXNDb250cmlidXRvcih3cCkpIHsKLQkJCQl3cCA9IChXb3JrUHJvZHVjdCkgVG5nVXRpbC5nZXRCYXNlKHdwKTsKLQkJCX0KLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJLmdldERlc2NyaXB0b3Iod3AsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJaWYgKHdwRGVzYyA9PSBudWxsKSB7Ci0JCQkJd3BEZXNjID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3cCwgY29uZmlnLAotCQkJCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzKTsKLQkJCQl1bmlxdWVOYW1lc0hhbmRsZXIuZW5zdXJlVW5pcXVlKHdwRGVzYyk7Ci0JCQkJd3BEZXNjTGlzdC5hZGQod3BEZXNjKTsKLQotCQkJCS8vIGF1dG9tYXRpYyBhZGRpbmcgdG8gdGhlIGV4aXN0aW5nIGRlbGl2ZXJhYmxlIGRlc2NyaXB0b3IgaW4KLQkJCQkvLyB0aGUgYWN0aXZpdHkncyBzY29wZSBpZiB0aGVyZSBpcyBhbnkKLQkJCQkvLyB2YWxpZCBvbmUuCi0JCQkJLy8KLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkJLmdldERlbGl2ZXJhYmxlKGFjdGl2aXR5LCB3cCk7Ci0JCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5wdXQod3BEZXNjLCBkZXNjcmlwdG9yKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYod3BkVG9UYXNrRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJCQkvLyByZXBsYWNlIHdvcmsgcHJvZHVjdCB3aXRoIGl0cyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBpbiB3cGRUb1Rhc2tGZWF0dXJlc01hcAotCQkJCQkvLwotCQkJCQlNYXAgZmVhdHVyZXNNYXAgPSAoTWFwKSB3cGRUb1Rhc2tGZWF0dXJlc01hcC5nZXQod3ApOwotCQkJCQlpZihmZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCQkJCQl3cGRUb1Rhc2tGZWF0dXJlc01hcC5yZW1vdmUod3ApOwotCQkJCQkJd3BkVG9UYXNrRmVhdHVyZXNNYXAucHV0KHdwRGVzYywgZmVhdHVyZXNNYXApOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9IGVsc2UgewotCQkJCWlmIChkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsICYmIHdwRGVzYy5nZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5hZGQod3BEZXNjKTsKLQkJCQl9Ci0JCQkJaWYgKHdwIGluc3RhbmNlb2YgRGVsaXZlcmFibGUgJiYgc3luY2hGZWF0dXJlcy5jb250YWlucyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSkpIHsKLQkJCQkJUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZURlbGl2ZXJhYmxlUGFydHMod3BEZXNjLAotCQkJCQkJCShEZWxpdmVyYWJsZSkgd3AsIGNvbmZpZywgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLCBkZXNjcmlwdG9yc1RvUmVmcmVzaCk7Ci0JCQkJfQotCQkJCQotCQkJCWlmKHdwZFRvVGFza0ZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJCQkJd3BkVG9UYXNrRmVhdHVyZXNNYXAucmVtb3ZlKHdwKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCi0JCQlpZiAoIXN5bmNocm9uaXplKSB7Ci0JCQkJLy8gZ2V0IGFsbCBwb3NzaWJsZSB0YXNrcyBmb3IgdGhpcyB3b3JrcHJvZHVjdCBmb3IKLQkJCQkvLyB3aGljaCB0YXNrIGRlc2NyaXB0b3IgbmVlZHMgdG8gYmUgY3JlYXRlZAotCQkJCUxpc3QgdGFza3MgPSBQcm9jZXNzVXRpbC5nZXRUYXNrc0ZvcldvcmtQcm9kdWN0KHdwLCBjb25maWcpOwotCi0JCQkJaWYgKCh0YXNrcyAhPSBudWxsKSAmJiAodGFza3Muc2l6ZSgpID4gMCkpIHsKLQkJCQkJLy8gc2hvdyB0YXNrIHNlbGVjdGlvbnMgZGlhbG9nCi0JCQkJCUxpc3Qgc2VsZWN0ZWRUYXNrcyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5zZWxlY3RUYXNrcygKLQkJCQkJCQl0YXNrcywgd3ApOwotCi0JCQkJCS8vIGNyZWF0ZSB0YXNrIGRlc2NyaXB0b3JzIGZvciB0aGlzIHdvcmtwcm9kdWN0Ci0JCQkJCWlmICgoc2VsZWN0ZWRUYXNrcyAhPSBudWxsKSAmJiAoIShzZWxlY3RlZFRhc2tzLmlzRW1wdHkoKSkpKSB7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNlbGVjdGVkVGFza3Muc2l6ZSgpOyBqKyspIHsKLQkJCQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgc2VsZWN0ZWRUYXNrcy5nZXQoaik7Ci0KLQkJCQkJCQkvLyBjYWxsIHRoaXMgbWV0aG9kIGV2ZW4gdGhlIGRlc2NyaXB0b3IgZm9yIHRoZQotCQkJCQkJCS8vIGdpdmVuIHRhc2sgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBhY3Rpdml0eQotCQkJCQkJCS8vIHRvIGFkZCBhbnkgYWRkaXRpb25hbCByZWxhdGlvbnNoaXBzIGluIGNhc2Ugb2YKLQkJCQkJCQkvLyByZWNlbnQgY2hhbmdlIGluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkJCQkJCQkvLyBvZiB0aGUgcHJvY2Vzcy4KLQkJCQkJCQlQQlNEcm9wQ29tbWFuZC5hZGRUb0Rlc2NyaXB0b3JMaXN0cyh0YXNrLCBhY3Rpdml0eSwKLQkJCQkJCQkJCXRhc2tEZXNjTGlzdCwgcm9sZURlc2NMaXN0LCB3cERlc2NMaXN0LAotCQkJCQkJCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLAotCQkJCQkJCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2gsCi0JCQkJCQkJCQliYXRjaENvbW1hbmQuZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCksIAotCQkJCQkJCQkJY29uZmlnLCBzeW5jaEZlYXR1cmVzKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIElmIG5vIHRhc2tzIGFyZSBzZWxlY3RlZCwgYWRkIFJlc3BvbnNpYmxlIHJvbGUgdG8gd3AKLQkJCQkJCVBCU0Ryb3BDb21tYW5kLmFkZFJlc3BvbnNpYmxlUm9sZSh3cERlc2MsIGFjdGl2aXR5LAotCQkJCQkJCQlyb2xlRGVzY0xpc3QsIGRlc2NyaXB0b3JzVG9SZWZyZXNoLCBjb25maWcpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLwlJZiB0aGVyZSBhcmUgbm8gdGFza3MgdG8gc2hvdywgYWRkIFJlc3BvbnNpYmxlIHJvbGUgdG8gd3AKLQkJCQkJUEJTRHJvcENvbW1hbmQuYWRkUmVzcG9uc2libGVSb2xlKHdwRGVzYywgYWN0aXZpdHksCXJvbGVEZXNjTGlzdCwgZGVzY3JpcHRvcnNUb1JlZnJlc2gsIGNvbmZpZyk7Ci0JCQkJfQotCQkJfQotLy8JCQllbHNlIHsKLS8vCQkJCS8vCWluIGNhc2Ugb2Ygc3luY2hyb25pemF0aW9uLCBhZGQgUmVzcG9uc2libGUgcm9sZSB0byB3cAotLy8JCQkJaWYgKHN5bmNoRmVhdHVyZXMuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpKSkKLS8vCQkJCQlQQlNEcm9wQ29tbWFuZC5hZGRSZXNwb25zaWJsZVJvbGUod3BEZXNjLCBhY3Rpdml0eSwJcm9sZURlc2NMaXN0LCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwgY29uZmlnKTsKLS8vCQkJfQkJCQkKLQkJfQotCi0JCWlmKCF3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuaXNFbXB0eSgpKSB7Ci0JCQl1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kID0gbmV3IEJhdGNoQ29tbWFuZCh0cnVlKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IHdwRGVzYyA9IGVudHJ5LmdldEtleSgpOwotCQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQuZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCkucHV0KHdwRGVzYywgCi0JCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwgZW50cnkuZ2V0VmFsdWUoKSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiAhdGFza0Rlc2NMaXN0LmlzRW1wdHkoKQotCQkJCXx8ICFyb2xlRGVzY0xpc3QuaXNFbXB0eSgpCi0JCQkJfHwgIXdwRGVzY0xpc3QuaXNFbXB0eSgpCi0JCQkJfHwgKHVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQgIT0gbnVsbCAmJiB1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kLmNhbkV4ZWN1dGUoKSkKLQkJCQl8fCAhd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuaXNFbXB0eSgpCi0JCQkJfHwgKGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwgJiYgIWRlc2NyaXB0b3JzVG9SZWZyZXNoCi0JCQkJCQkuaXNFbXB0eSgpKQotCQkJCXx8IGJhdGNoQ29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzdWJBcnRpZmFjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcHJlcGFyZUFkZChXb3JrUHJvZHVjdCB3cCkgewotCQlpZiAoc3luY2hyb25pemUpIHsJCi0JCQkvLyBnZXQgbGlua2VkIHRhc2tzIG9mIHRoZSB0YXNrIGRlc2NyaXB0b3JzIGluIHRoZSBhY3Rpdml0eSBmb3IgdGhlIGNvbmZpZ3VyYXRpb24KLQkJCS8vCi0JCQlMaXN0IHRhc2tzID0gZ2V0TGlua2VkVGFza3MoKTsKLQkJCQotCQkJaWYoIXRhc2tzLmlzRW1wdHkoKSkgewotCQkJCS8vIHNlbGVjdCBvbmx5IHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgaW5wdXQgb3Igb3V0cHV0IG9mIGFuIGV4aXN0aW5nIHRhc2sgaW4gdGhlIGFjdGl2aXR5Ci0JCQkJLy8JCi0JCQkJTWFwIGZlYXR1cmVzTWFwID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldEZlYXR1cmVzTWFwKHRhc2tzLCB3cCwgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJCQlpZighZmVhdHVyZXNNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJCS8vIHVzZSB0aGUgd3AgdG8gdGhlIGtleSBpbiB0aGUgbWFwIHJpZ2h0IG5vdyBhbmQgcmVwbGFjZSBpdCB3aXRoCi0JCQkJCS8vIGl0cyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBsYXRlcgotCQkJCQkvLwotCQkJCQlpZih3cGRUb1Rhc2tGZWF0dXJlc01hcCA9PSBudWxsKSB7Ci0JCQkJCQl3cGRUb1Rhc2tGZWF0dXJlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCX0KLQkJCQkJd3BkVG9UYXNrRmVhdHVyZXNNYXAucHV0KHdwLCBmZWF0dXJlc01hcCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldExpbmtlZFRhc2tzKCkgewotCQlpZihsaW5rZWRUYXNrcyA9PSBudWxsKSB7Ci0JCQlsaW5rZWRUYXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJVGFzayB0YXNrID0gKChUYXNrRGVzY3JpcHRvcillbGVtZW50KS5nZXRUYXNrKCk7Ci0JCQkJCWlmKHRhc2sgIT0gbnVsbCAmJiBjb25maWd1cmF0b3IuYWNjZXB0KGVsZW1lbnQpKSB7Ci0JCQkJCQlsaW5rZWRUYXNrcy5hZGQodGFzayk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpbmtlZFRhc2tzOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgbmV3IGVsZW1lbnRzIHRoYXQgYXJlIGR1cGxpY2F0ZSBiL2MgdGhleSBhcmUgY3JlYXRlZCBieSB0aGUgcHJldmlvdXMgV0JTRHJvcENvbW1hbmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTmV3RHVwbGljYXRlcygpIHsKLQkJaWYoc3luY2hyb25pemUpIHsKLQkJCWlmKCFuZXdEdXBsaWNhdGVzUmVtb3ZlZCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJvbGVEZXNjTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCQlPYmplY3QgZGVzYyA9IFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKHJvbGVEZXNjLmdldFJvbGUoKSwgYWN0aXZpdHksIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJCWlmKGRlc2MgIT0gbnVsbCkgewotCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQluZXdEdXBsaWNhdGVzUmVtb3ZlZCA9IHRydWU7CQkJCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2RvRXhlY3V0ZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQlyZW1vdmVOZXdEdXBsaWNhdGVzKCk7Ci0JCQotCQkvLyBhdXRvbWF0aWNhbGx5IGFkZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byBkZWxpdmVyYWJsZSBwYXJ0Ci0JCS8vCi0JCWlmICghd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5lbnRyeVNldCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVsaXZlcmFibGUgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbnRyeQotCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQkJZGVsaXZlcmFibGUuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmFkZChlbnRyeS5nZXRLZXkoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCS8vCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKHdwRGVzY0xpc3QpOwotCi0JCS8vIGFkZCB0YXNrIGRlc2NyaXB0b3JzCi0JCS8vCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKHRhc2tEZXNjTGlzdCk7Ci0KLQkJLy8gYWRkIHJvbGUgZGVzY3JpcHRvcnMKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwocm9sZURlc2NMaXN0KTsKLQkJCi0JCS8vIGFzc29jaWF0ZSBuZXcgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIHdpdGggdGFzayBkZXNjcmlwdG9ycwotCQkvLwotCQlpZih3cGRUb1Rhc2tGZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cGRUb1Rhc2tGZWF0dXJlc01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCU1hcCB0YXNrRmVhdHVyZXMgPSAoTWFwKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB0YXNrRmVhdHVyZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnQgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0RGVzY3JpcHRvcihlbnQuZ2V0S2V5KCksIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCksIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSwgZmFsc2UpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMSA9ICgoQ29sbGVjdGlvbillbnQuZ2V0VmFsdWUoKSkuaXRlcmF0b3IoKTsgaXRlcmF0b3IxCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXJhdG9yMS5uZXh0KCk7Ci0JCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZGVzY0ZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBGRUFUVVJFX01BUC5nZXQoZik7Ci0JCQkJCQlpZihkZXNjRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCSgoTGlzdCl0YXNrRGVzYy5lR2V0KGRlc2NGZWF0dXJlKSkuYWRkKGVudHJ5LmdldEtleSgpKTsJCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBUT0RPOiBuZWVkIHRvIGJhY2sgdXAgb2xkIHZhbHVlIGhlcmUKLQkJCQkJCQkvLwotCQkJCQkJCXRhc2tEZXNjLmVTZXQoZGVzY0ZlYXR1cmUsIGVudHJ5LmdldEtleSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGFkZCBuZXcgZGVzY3JpcHRvcnMgdG8gYWN0aXZpdHkncyBwYWNrYWdlCi0JCS8vCi0JCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgYWN0aXZpdHkuZUNvbnRhaW5lcigpOwotCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwodGFza0Rlc2NMaXN0KTsKLQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwocm9sZURlc2NMaXN0KTsKLQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwod3BEZXNjTGlzdCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbikgaXRlci5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLS8vCQlnZXRNb2RpZmllZFJlc291cmNlcygpLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjdXBkYXRlRGVzY3JpcHRvcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlc2NyaXB0b3JzKCkgewotCQlzdXBlci51cGRhdGVEZXNjcmlwdG9ycygpOwotCQkKLQkJLy8gYWRkIGRlbGl2ZXJhYmxlIHBhcnRzIHRvIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJLy8KLQkJaWYodXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZCAhPSBudWxsKSB7Ci0JCQl1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kLmV4ZWN1dGUoKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI3VuZG9VcGRhdGVEZXNjcmlwdG9ycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdW5kb1VwZGF0ZURlc2NyaXB0b3JzKCkgewotCQkvLyByZW1vdmUgZGVsaXZlcmFibGUgcGFydHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCQkvLwotCQlpZih1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kICE9IG51bGwpIHsKLQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQudW5kbygpOwotCQl9Ci0KLQkJc3VwZXIudW5kb1VwZGF0ZURlc2NyaXB0b3JzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNkb1VuZG8oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVW5kbygpIHsKLQkJLy8gcmVtb3ZlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbCh3cERlc2NMaXN0KTsKLQotCQkvLyByZW1vdmUgcm9sZSBkZXNjcmlwdG9ycwotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbChyb2xlRGVzY0xpc3QpOwotCi0JCS8vIHJlbW92ZSB0YXNrIGRlc2NyaXB0b3JzCi0JCS8vCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKHRhc2tEZXNjTGlzdCk7Ci0KLQkJLy8gcmVtb3ZlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGZyb20gZGVsaXZlcmFibGUgcGFydAotCQkvLwotCQlpZiAoIXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuZW50cnlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlbGl2ZXJhYmxlID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZW50cnkKLQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCWRlbGl2ZXJhYmxlLmdldERlbGl2ZXJhYmxlUGFydHMoKS5yZW1vdmUoZW50cnkuZ2V0S2V5KCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gcmVtb3ZlIGRlc2NyaXB0b3JzIGZyb20gYWN0aXZpdHkncyBwYWNrYWdlCi0JCS8vCi0JCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgYWN0aXZpdHkuZUNvbnRhaW5lcigpOwotCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5yZW1vdmVBbGwodGFza0Rlc2NMaXN0KTsKLQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5yZW1vdmVBbGwocm9sZURlc2NMaXN0KTsKLQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5yZW1vdmVBbGwod3BEZXNjTGlzdCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5yZW1vdmVBbGwoKENvbGxlY3Rpb24pIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gZGlzYXNzb2NpYXRlIG5ldyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgd2l0aCB0YXNrIGRlc2NyaXB0b3JzCi0JCS8vCi0JCWlmKHdwZFRvVGFza0ZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwZFRvVGFza0ZlYXR1cmVzTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJTWFwIHRhc2tGZWF0dXJlcyA9IChNYXApIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHRhc2tGZWF0dXJlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsLmdldERlc2NyaXB0b3IoZW50LmdldEtleSgpLCBhY3Rpdml0eSwgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSAoKENvbGxlY3Rpb24pZW50LmdldFZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMQotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXJhdG9yMS5uZXh0KCk7Ci0JCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZGVzY0ZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBGRUFUVVJFX01BUC5nZXQoZik7Ci0JCQkJCQlpZihkZXNjRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCSgoTGlzdCl0YXNrRGVzYy5lR2V0KGRlc2NGZWF0dXJlKSkucmVtb3ZlKGVudHJ5LmdldEtleSgpKTsJCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQl0YXNrRGVzYy5lU2V0KGRlc2NGZWF0dXJlLCBudWxsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNnZXRBZmZlY3RlZE9iamVjdHMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJaWYgKHdwRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJcmV0dXJuIHdwRGVzY0xpc3Q7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHRhc2sKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gdGFza0Rlc2NMaXN0Ci0JICogQHBhcmFtIHJvbGVEZXNjTGlzdAotCSAqIEBwYXJhbSB3cERlc2NMaXN0Ci0JICogQHBhcmFtIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cwotCSAqIEBwYXJhbSBkZXNjcmlwdG9yc1RvUmVmcmVzaAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBuZXcgVGFza0Rlc2NyaXB0b3IgaXMgY3JlYXRlZCBmb3IgdGhlCi0JICogICAgICAgICBnaXZlbiB0YXNrLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gYWRkVG9EZXNjcmlwdG9yTGlzdHMoVGFzayB0YXNrLCBBY3Rpdml0eSBhY3Rpdml0eSwKLQkJCUxpc3QgdGFza0Rlc2NMaXN0LCBMaXN0IHJvbGVEZXNjTGlzdCwgTGlzdCB3cERlc2NMaXN0LAotCQkJTWFwIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cywgU2V0IGRlc2NyaXB0b3JzVG9SZWZyZXNoLAotCQkJTWFwIGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTZXQgc3luY2hGZWF0dXJlcykgewotCQlUYXNrRGVzY3JpcHRvciBkZXNjID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKHRhc2ssIGFjdGl2aXR5LAotCQkJCXJvbGVEZXNjTGlzdCwgd3BEZXNjTGlzdCwgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLCBudWxsLAotCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLCBkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLCAKLQkJCQljb25maWcsIHN5bmNoRmVhdHVyZXMpOwotCQlpZiAoKGRlc2MgIT0gbnVsbCkgJiYgKHRhc2tEZXNjTGlzdCAhPSBudWxsKQotCQkJCSYmICF0YXNrRGVzY0xpc3QuY29udGFpbnMoZGVzYykpIHsKLQkJCXRhc2tEZXNjTGlzdC5hZGQoZGVzYyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2MgIT0gbnVsbDsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBhZGRSZXNwb25zaWJsZVJvbGUoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYywKLQkJCUFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IHJvbGVEZXNjTGlzdCwgU2V0IGRlc2NyaXB0b3JzVG9SZWZyZXNoLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IFByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVSb2xlRGVzY3JpcHRvcih3cERlc2MsCi0JCQkJYWN0aXZpdHksIHJvbGVEZXNjTGlzdCwgZGVzY3JpcHRvcnNUb1JlZnJlc2gsIGNvbmZpZyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihyb2xlRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJcm9sZURlc2NMaXN0LmNsZWFyKCk7Ci0JCX0KLQkJaWYod3BEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQl3cERlc2NMaXN0LmNsZWFyKCk7Ci0JCX0KLQkJaWYod3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzICE9IG51bGwpIHsKLQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5jbGVhcigpOwotCQl9Ci0JCWlmKHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwICE9IG51bGwpIHsKLQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYod3BkVG9UYXNrRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJd3BkVG9UYXNrRmVhdHVyZXNNYXAuY2xlYXIoKTsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2V4ZWN1dGVOZXN0ZWRDb21tYW5kcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCkgewotCQlMaXN0IG5lc3RlZENvbW1hbmRQcm92aWRlcnMgPSBFeHRlbnNpb25NYW5hZ2VyLmdldE5lc3RlZENvbW1hbmRQcm92aWRlcnMoKTsKLQkJaWYoIW5lc3RlZENvbW1hbmRQcm92aWRlcnMuaXNFbXB0eSgpKSB7Ci0JCQlpZighdGFza0Rlc2NMaXN0LmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5lc3RlZENvbW1hbmRQcm92aWRlcnMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJSU5lc3RlZENvbW1hbmRQcm92aWRlciBjbWRQcm92aWRlciA9IChJTmVzdGVkQ29tbWFuZFByb3ZpZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUNvbW1hbmQgY21kID0gY21kUHJvdmlkZXIuY3JlYXRlUmVsYXRlZE9iamVjdHModGFza0Rlc2NMaXN0LCBQQlNEcm9wQ29tbWFuZC50aGlzKTsKLQkJCQkJCWlmKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsJCQkJCQkJCi0JCQkJCQkJY21kLmV4ZWN1dGUoKTsKLQkJCQkJCQlnZXROZXN0ZWRDb21tYW5kcygpLmFkZChjbWQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5leGVjdXRlTmVzdGVkQ29tbWFuZHMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NDb21tYW5kVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzQ29tbWFuZFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2ZiN2FlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NDb21tYW5kVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5CYXRjaENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE5vdiAyMywgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvY2Vzc0NvbW1hbmRVdGlsIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIERFU0NSSVBUT1JfUkVGUkVTSEFCTEVfRkVBVFVSRVMgPSB7Ci0JCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpIAotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIFRBU0tfREVTQ1JJUFRPUl9SRUZSRVNIQUJMRV9GRUFUVVJFUyA9IHsKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpIAotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIFJPTEVfREVTQ1JJUFRPUl9SRUZSRVNIQUJMRV9GRUFUVVJFUyA9IHsgCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCkgCi0JfTsKLQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmVbXSBXT1JLX1BST0RVQ1RfUkVGUkVTSEFCTEVfRkVBVFVSRVMgPSB7Ci0vLwotLy8JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSByZWZyZXNoYWJsZSBmZWF0dXJlIG1hcCBmb3IgdGhlIGdpdmVuIGRlc2NyaXB0b3IuIEEgZGVzY3JpcHRvcgotCSAqIGZlYXR1cmUgaXMgY29uc2lkZXJlZCByZWZyZXNoYWJsZSBpZiB0aGVyZSBpcyBhIHNpbWlsaWFyIGZlYXR1cmUgaW4gaXRzCi0JICogbGlua2VkIE1ldGhvZEVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gdGhlIHJlZnJlc2hhYmxlIGZlYXR1cmUgbWFwIGZvciB0aGUgZ2l2ZW4gZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGNyZWF0ZVJlZnJlc2hhYmxlRmVhdHVyZU1hcChEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFNldCBleGNsdWRlRmVhdHVyZXMpIHsKLQkJTWFwIGZlYXR1cmVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlhZGRUb0ZlYXR1cmVNYXAoZGVzY3JpcHRvciwgREVTQ1JJUFRPUl9SRUZSRVNIQUJMRV9GRUFUVVJFUywgZmVhdHVyZU1hcCwgZXhjbHVkZUZlYXR1cmVzKTsKLQkJaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJYWRkVG9GZWF0dXJlTWFwKGRlc2NyaXB0b3IsIFRBU0tfREVTQ1JJUFRPUl9SRUZSRVNIQUJMRV9GRUFUVVJFUywKLQkJCQkJZmVhdHVyZU1hcCwgZXhjbHVkZUZlYXR1cmVzKTsKLQkJfSBlbHNlIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCWFkZFRvRmVhdHVyZU1hcChkZXNjcmlwdG9yLCBST0xFX0RFU0NSSVBUT1JfUkVGUkVTSEFCTEVfRkVBVFVSRVMsCi0JCQkJCWZlYXR1cmVNYXAsIGV4Y2x1ZGVGZWF0dXJlcyk7Ci0JCX0gZWxzZSBpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlc2NyaXB0b3I7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKTsKLQkJCWlmICh3cGQuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlICYmICFleGNsdWRlRmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCQlmZWF0dXJlTWFwLnB1dChmZWF0dXJlLCB3cGQuZ2V0RGVsaXZlcmFibGVQYXJ0cygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmVhdHVyZU1hcDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFRvRmVhdHVyZU1hcChFT2JqZWN0IGVPYmplY3QsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmVbXSBmZWF0dXJlcywgTWFwIGZlYXR1cmVNYXAsIFNldCBleGNsdWRlRmVhdHVyZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlc1tpXTsKLQkJCWlmICghZXhjbHVkZUZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpKSB7Ci0JCQkJT2JqZWN0IHZhbHVlID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCXZhbHVlID0gbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgdmFsdWUpOwotCQkJCX0KLQkJCQlmZWF0dXJlTWFwLnB1dChmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRSZWZlcmVuY2UoRU9iamVjdCBlKSB7Ci0JLy8gaWYgKGUuZUlzUHJveHkoKSkgewotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0JLy8gaWYgKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JLy8gTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gUHJvY2Vzc1V0aWwKLQkvLyAuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIGUpOwotCS8vIGlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudC5lSXNQcm94eSgpKSB7Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIHRydWU7Ci0JLy8gfQotCi0JLyoqCi0JICogQ2xlYXJzIGFsbCBhdHRyaWJ1dGVzLiBGb3IgcmVmZXJlbmNlcywgcmVtb3ZlIG9ubHkgdGhvc2UgdGhhdCBhcmUKLQkgKiBkZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBhbnkgY29udGVudCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGNsZWFyUmVmcmVzaGFibGVGZWF0dXJlcyhEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFNldCBleGNsdWRlRmVhdHVyZXMpIHsKLQkJTWFwIGZlYXR1cmVNYXAgPSBjcmVhdGVSZWZyZXNoYWJsZUZlYXR1cmVNYXAoZGVzY3JpcHRvciwgZXhjbHVkZUZlYXR1cmVzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpIHsKLQkJCQlkZXNjcmlwdG9yLmVTZXQoZmVhdHVyZSwgZmVhdHVyZS5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCS8vIHdvcmsgYXJvdW5kIHRvIGF2b2lkIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotCQkJCQkvLwotCQkJCQlMaXN0IGxpc3QgPSAoKExpc3QpIGRlc2NyaXB0b3IuZUdldChmZWF0dXJlKSk7Ci0JCQkJCXN3aXRjaCAobGlzdC5zaXplKCkpIHsKLQkJCQkJY2FzZSAwOgotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCWxpc3QucmVtb3ZlKDApOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlsaXN0LmNsZWFyKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlkZXNjcmlwdG9yLmVTZXQoZmVhdHVyZSwgZmVhdHVyZS5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCQkJfQotCQkJCS8vIGlmKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkvLyBMaXN0IGxpc3QgPSAoKExpc3QpZGVzY3JpcHRvci5lR2V0KGZlYXR1cmUpKTsKLQkJCQkvLyBMaXN0IGVsZW1lbnRzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJLy8gZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkvLyAuaGFzTmV4dCgpOykgewotCQkJCS8vIEVPYmplY3QgZSA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJLy8gaWYoIWlzVmFsaWRSZWZlcmVuY2UoZSkpIHsKLQkJCQkvLyBlbGVtZW50c1RvUmVtb3ZlLmFkZChlKTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIGlmKCFlbGVtZW50c1RvUmVtb3ZlLmlzRW1wdHkoKSkgewotCQkJCS8vIGxpc3QucmVtb3ZlQWxsKGVsZW1lbnRzVG9SZW1vdmUpOwotCQkJCS8vIFN5c3RlbS5vdXQKLQkJCQkvLyAucHJpbnRsbigiUHJvY2Vzc0NvbW1hbmRVdGlsLmNsZWFyUmVmcmVzaGFibGVGZWF0dXJlcygpOgotCQkJCS8vIGNoYW5nZWQiKTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIGVsc2UgewotCQkJCS8vIEVPYmplY3Qgb2JqID0gKEVPYmplY3QpIGRlc2NyaXB0b3IuZUdldChmZWF0dXJlKTsKLQkJCQkvLyBpZihvYmogIT0gbnVsbCAmJiBvYmogIT0gZmVhdHVyZS5nZXREZWZhdWx0VmFsdWUoKSAmJgotCQkJCS8vICFpc1ZhbGlkUmVmZXJlbmNlKG9iaikpIHsKLQkJCQkvLyBkZXNjcmlwdG9yLmVTZXQoZmVhdHVyZSwgZmVhdHVyZS5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCQkJLy8gU3lzdGVtLm91dAotCQkJCS8vIC5wcmludGxuKCJQcm9jZXNzQ29tbWFuZFV0aWwuY2xlYXJSZWZyZXNoYWJsZUZlYXR1cmVzKCk6Ci0JCQkJLy8gY2hhbmdlZCIpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmVhdHVyZU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgYWxsIHRoZSByZWZyZXNoYWJsZSBmZWF0dXJlcyBvZiB0aGUgZ2l2ZW4gZGVzY3JpcHRvcgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICogQHBhcmFtIGRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAKLQkgKiBAcGFyYW0gZXhjbHVkZUZlYXR1cmVzIGZlYXR1cmVzIHRvIGV4Y2x1ZGUgZnJvbSByZWZyZXNoaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsZWFyRGVzY3JpcHRvcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0JCQlNYXAgZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcCwKLQkJCVNldCBleGNsdWRlRmVhdHVyZXMpIHsKLQkJaWYgKGRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJLy8gbmVlZCB0byBjbGVhciBhbGwgdGhlIHJlZnJlc2hhYmxlIGZlYXR1cmVzIG9mIHRoZSBleGlzdGluZwotCQkJLy8gZGVzY3JpcHRvcgotCQkJLy8KLQkJCWlmICghZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcC5jb250YWluc0tleShkZXNjcmlwdG9yKSkgewotCQkJCWRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAKLQkJCQkJCS5wdXQoZGVzY3JpcHRvciwgY2xlYXJSZWZyZXNoYWJsZUZlYXR1cmVzKGRlc2NyaXB0b3IsIGV4Y2x1ZGVGZWF0dXJlcykpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRGVzY3JpcHRvck9mKE9iamVjdCBlbGVtZW50LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgT2JqZWN0IGRlc2NyaXB0b3IsIGJvb2xlYW4gZXhjbHVkZVN1cHByZXNzZWQpIHsJCQotCQlpZihkZXNjcmlwdG9yIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJRGVzY3JpcHRvciBkZXNjID0gICgoRGVzY3JpcHRvcilkZXNjcmlwdG9yKTsKLQkJCWlmKGV4Y2x1ZGVTdXBwcmVzc2VkICYmIGRlc2MuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJT2JqZWN0IGVsZW1lbnRPYmogPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudChkZXNjKTsKLQkJCWVsZW1lbnRPYmogPSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5yZXNvbHZlKGVsZW1lbnRPYmosIGNvbmZpZyk7Ci0JCQlyZXR1cm4gZWxlbWVudCA9PSBlbGVtZW50T2JqOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+IGlzIGEgdmFsaWQgZGVzY3JpcHRvciBvciBkZXNjcmlwdG9yIHdyYXBwZXIgb2YgdGhlIGdpdmVuIDxjb2RlPmVsZW1lbnQ8L2NvZGU+Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIG9iamVjdAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWREZXNjcmlwdG9yT3JEZXNjcmlwdG9yV3JhcHBlck9mKE9iamVjdCBlbGVtZW50LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIE9iamVjdCBvYmplY3QpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCWlmKHN1cHByZXNzaW9uLmlzSW5TdXBwcmVzc2VkTGlzdCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iamVjdCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gaXNWYWxpZERlc2NyaXB0b3JPZihlbGVtZW50LCBjb25maWcsIFRuZ1V0aWwudW53cmFwKG9iamVjdCksIGZhbHNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNWYWxpZERlc2NyaXB0b3JPZihlbGVtZW50LCBjb25maWcsIG9iamVjdCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdW5zdXBwcmVzc2VkIGRlc2NyaXB0b3IgZnJvbSBhIGRlc2NyaXB0b3IgbGlzdC4gVGhlIGRlc2NyaXB0b3IgbGlzdCBpcyB1c3VhbGx5Ci0JICogdGhlIGJyZWFrZG93biBlbGVtZW50cyBvZiBhbiBhY3Rpdml0eS4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIGRlc2NyaXB0b3JMaXN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldERlc2NyaXB0b3IoT2JqZWN0IG9iaiwgTGlzdCBkZXNjcmlwdG9yTGlzdCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIGdldERlc2NyaXB0b3Iob2JqLCBkZXNjcmlwdG9yTGlzdCwgY29uZmlnLCB0cnVlKTsKLQl9Ci0JCi0Jc3RhdGljIE9iamVjdCBnZXREZXNjcmlwdG9yKE9iamVjdCBvYmosIExpc3QgZGVzY3JpcHRvckxpc3QsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBib29sZWFuIGV4Y2x1ZGVTdXBwcmVzc2VkKSB7Ci0JCWludCBzaXplID0gZGVzY3JpcHRvckxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykgewotCQkJLy8gaXRlcmF0ZSB0aHJ1IGxpc3QgdG8gc2VlIHdoZXRoZXIgYSB2YWxpZCBkZXNjcmlwdG9yIGxpbmtlZCB3aXRoIHRoZSBnaXZlbiBvYmplY3QKLQkJCS8vIGFscmVhZHkgZXhpc3RzCi0JCQkvLwotCQkJT2JqZWN0IG9iamVjdCA9IGRlc2NyaXB0b3JMaXN0LmdldChqKTsKLQkJCWlmKGlzVmFsaWREZXNjcmlwdG9yT2Yob2JqLCBjb25maWcsIG9iamVjdCwgZXhjbHVkZVN1cHByZXNzZWQpKSB7Ci0JCQkJcmV0dXJuIG9iamVjdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdmFsaWQgZGVzY3JpcHRvciwgZWl0aGVyIGxvY2FsIG9yIGluaGVyaXRlZCwgb2YgdGhlIGdpdmVuIG9iamVjdCB1bmRlciB0aGUgZ2l2ZW4gYWN0aXZpdHkKLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVzY3JpcHRvciBnZXRWYWxpZERlc2NyaXB0b3IoT2JqZWN0IG9iaiwgQWN0aXZpdHkgYWN0aXZpdHksIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3Rpdml0eSk7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gcHJvYy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGFjdGl2aXR5LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGFwdGVyLmdldENoaWxkcmVuKGFjdGl2aXR5KS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYoaXNWYWxpZERlc2NyaXB0b3JPckRlc2NyaXB0b3JXcmFwcGVyT2Yob2JqLCBjb25maWcsIFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHByb2MpLCBjaGlsZCkpIHsKLQkJCQlyZXR1cm4gKERlc2NyaXB0b3IpIFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBsb2NhbCB1bnN1cHByZXNzZWQgZGVzY3JpcHRvciBvZiB0aGUgZ2l2ZW4gcm9sZSwgdGFzaywgb3Igd29ya1Byb2R1Y3QuCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEByZXR1cm4gVGhlIGRlc2NyaXB0b3Igb2YgdGhlIG9iamVjdCwgb3IgbnVsbCBpZiBub3QgZXhpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RGVzY3JpcHRvcihPYmplY3Qgb2JqLCBBY3Rpdml0eSBhY3Rpdml0eSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIGdldERlc2NyaXB0b3Iob2JqLCBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLCBjb25maWcpOwotCX0KLQotLy8JLyoqCi0vLwkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZGVzY3JpcHRvciBvZiB0aGUgZ2l2ZW4gb2JqZWN0IGFscmVhZHkgZXhpc3RzIGluIHRoZQotLy8JICogYnJlYWtkb3duIGVsZW1lbnQgbGlzdCBvZiB0aGUgZ2l2ZW4gYWN0aXZpdHkKLS8vCSAqIAotLy8JICogQHBhcmFtIG9iagotLy8JICogQHBhcmFtIGFjdGl2aXR5Ci0vLwkgKiBAcmV0dXJuCi0vLwkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZXNjcmlwdG9yRXhpc3RzKE9iamVjdCBvYmosIEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0vLwkJcmV0dXJuIChnZXREZXNjcmlwdG9yKG9iaiwgYWN0aXZpdHkpICE9IG51bGwpOwotLy8JfQotCi0JLyoqCi0JICogQ3JlYXRlIFJvbGUgZGVzY3JpcHRvciBmb3IgdGhlIHJlc3BvbnNpYmxlIHJvbGUgb2YgdGhlIGdpdmVuIHdvcmsgcHJvZHVjdAotCSAqIGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAcGFyYW0gd3BEZXNjCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIHJvbGVEZXNjcmlwdG9ycwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJvbGVEZXNjcmlwdG9yIGNyZWF0ZVJvbGVEZXNjcmlwdG9yKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYywgQWN0aXZpdHkgYWN0aXZpdHksCi0JCQlMaXN0IHJvbGVEZXNjcmlwdG9ycywgU2V0IGRlc2NyaXB0b3JzVG9SZWZyZXNoLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlpZiAod3BEZXNjICE9IG51bGwpIHsKLQkJCVdvcmtQcm9kdWN0IHdwID0gd3BEZXNjLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQlpZiAod3AgIT0gbnVsbCkgewotCQkJCWlmIChUbmdVdGlsLmlzQ29udHJpYnV0b3Iod3ApKSB7Ci0JCQkJCXdwID0gKFdvcmtQcm9kdWN0KSBUbmdVdGlsLmdldEJhc2Uod3ApOwotCQkJCX0KLQkJCQkvLyBnZXQgcmVzcG9uc2libGUgcm9sZSBmb3Igd29yayBwcm9kdWN0Ci0JCQkJUm9sZSByb2xlID0gbnVsbDsgLy9Bc3NvY2lhdGlvbkhlbHBlci5nZXRSZXNwb25zaWJsZVJvbGUod3ApOwotCQkJCUxpc3Qgcm9sZXMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRSZXNwb25zaWJsZVJvbGVzKHdwKTsKLQkJCQkvL0ZJWE1FOiB3aGF0IGlmIHRoZSB3b3JrIHByb2R1Y3QgaGF2ZSBtYW55IHJlc3BvbnNpYmxlIHJvbGVzID8/PwotCQkJCWlmKCFyb2xlcy5pc0VtcHR5KCkpIHsKLQkJCQkJcm9sZSA9IChSb2xlKSByb2xlcy5nZXQoMCk7Ci0JCQkJfQotCQkJCWlmIChyb2xlICE9IG51bGwpIHsKLQkJCQkJaWYgKFRuZ1V0aWwuaXNDb250cmlidXRvcihyb2xlKSkgewotCQkJCQkJcm9sZSA9IChSb2xlKSBUbmdVdGlsLmdldEJhc2Uocm9sZSk7Ci0JCQkJCX0KLQkJCQkJYm9vbGVhbiBpc05ld0Rlc2NyaXB0b3IgPSBmYWxzZTsKLQkJCQkJLy8gY2hlY2sgZm9yIHJvbGVkZXNjcmlwdG9yIHdoZXRoZXIgaXQncyBwcmVzZW50IGluIGFjdGl2aXR5Ci0JCQkJCS8vIGJyZWFrZG93biBlbGVtZW50cwotCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcigKLQkJCQkJCQlyb2xlLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQkJaWYgKHJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkJCS8vIGNoZWNrIGZvciByb2xlZGVzY3JpcHRvciB3aGV0aGVyIGl0J3MgcHJlc2VudCBpbiBiYXNlCi0JCQkJCQkvLyBhY3Rpdml0eS4KLQkJCQkJCXJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0SW5oZXJpdGVkRGVzY3JpcHRvcigKLQkJCQkJCQkJcm9sZSwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJCQlpZiAocm9sZURlc2MgPT0gbnVsbCkgewotCQkJCQkJCS8vIGNoZWNrIGZvciByb2xlZGVzY3JpcHRvciB3aGV0aGVyIGl0J3MgcHJlc2VudCBpbgotCQkJCQkJCS8vIGxpc3Qgb2Ygcm9sZWRlc2NyaXB0b3JzIHBhc3NlZCBpbgotCQkJCQkJCXJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKHJvbGUsCi0JCQkJCQkJCQlyb2xlRGVzY3JpcHRvcnMsIGNvbmZpZyk7Ci0JCQkJCQkJaWYgKHJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkJCQkJcm9sZURlc2MgPSBQcm9jZXNzVXRpbC5jcmVhdGVSb2xlRGVzY3JpcHRvcihyb2xlKTsKLQkJCQkJCQkJcm9sZURlc2NyaXB0b3JzLmFkZChyb2xlRGVzYyk7Ci0JCQkJCQkJCWlzTmV3RGVzY3JpcHRvciA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghaXNOZXdEZXNjcmlwdG9yICYmIGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwgCi0JCQkJCQkJJiYgcm9sZURlc2MuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLmFkZChyb2xlRGVzYyk7Ci0JCQkJCX0KLQkKLQkJCQkJLy8gdGhpcyBpcyB0YWtlbiBjYXJlZCBvZiBieQotCQkJCQkvLyBCU0Ryb3BDb21tYW5kI3NldFJlc3BvbnNpYmxlUm9sZSgpCi0JCQkJCS8vCi0JCQkJCS8vIHdwRGVzYy5zZXRSZXNwb25zaWJsZVJvbGUocm9sZURlc2MpOwotCQotCQkJCQlpZihpc05ld0Rlc2NyaXB0b3IpIHsKLQkJCQkJCXJldHVybiByb2xlRGVzYzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb2xsZWN0cyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgZm9yIHRoZSBnaXZlbgotCSAqIDxjb2RlPnRhc2tEZXNjcmlwdG9yRmVhdHVyZTwvY29kZT4gYmFzZWQgb24gdGhlIGNvcnJlc3BvbmRpbmcgZmVhdHVyZQotCSAqIGluIHRoZSBsaW5rZWQgdGFzayBvZiB0aGUgZ2l2ZW4gPGNvZGU+dGFza0Rlc2NyaXB0b3I8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHRhc2sgdGhlIHRhc2sgdGhhdCB0aGUgdGFzayBkZXNjcmlwdG9yIGlzIGxpbmtlZCB0bwotCSAqIEBwYXJhbSB0YXNrRGVzY3JpcHRvciB0aGUgdGFzayBkZXNjcmlwdG9yIHdob3NlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyBpbiB0aGUgZ2l2ZW4gPGNvZGU+dGFza0Rlc2NyaXB0b3JGZWF0dXJlPC9jb2RlPgotCSAqICAgICAgICB3aWxsIGJlIGNvbGxlY3RlZAotCSAqIEBwYXJhbSB0YXNrRmVhdHVyZSB0aGUgdGFzayBmZWF0dXJlIHRoYXQgaXMgY29ycmVzcG9uZGluZyB0byB0aGUgdGFzayBkZXNjcmlwdG9yIGZlYXR1cmUKLQkgKiBAcGFyYW0gdGFza0Rlc2NyaXB0b3JGZWF0dXJlIHRoZSBmZWF0dXJlIG9mIHRhc2sgZGVzY3JpcHRvciB0aGF0IGhvbGRzIHJlZmVyZW5jZXMgdG8gCi0JICogICAgICAgIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byBjb2xsZWN0Ci0JICogQHBhcmFtIGFjdGl2aXR5IHRoZSBhY3Rpdml0eSBvZiBkZXNjcmlwdG9ycwotCSAqIEBwYXJhbSBjb25maWcgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gd3BEZXNjcmlwdG9ycwotCSAqIEBwYXJhbSB3cGRUb0RlbGl2ZXJhYmxlUGFydHNNYXAKLQkgKiBAcGFyYW0gd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcnNUb1JlZnJlc2gKLQkgKiAgICAgICAgICAgIG91cHV0IHRoYXQga2VlcHMgdGhlIGRlc2NyaXB0b3IgZmVhdHVyZXMgdGhhdCBuZWVkIHRvIGJlCi0JICogICAgICAgICAgICByZWZyZXNoZWQKLQkgKiBAcGFyYW0gZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcAotCSAqICAgICAgICAgICAgb3V0cHV0IHRoYXQga2VlcHMgdGhlIGNvbGxlY3RlZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbGxlY3RXb3JrUHJvZHVjdERlc2NydGlwdG9ycygKLQkJCVRhc2sgdGFzaywKLQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yLCBFUmVmZXJlbmNlIHRhc2tGZWF0dXJlLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHRhc2tEZXNjcmlwdG9yRmVhdHVyZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCB3cERlc2NyaXB0b3JzLAotCQkJTWFwIHdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCwgTWFwIHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLAotCQkJU2V0IGRlc2NyaXB0b3JzVG9SZWZyZXNoLCBNYXAgZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCkgewotCQlMaXN0IHdvcmtQcm9kdWN0cyA9IChMaXN0KSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKQotCQkJCS5nZXRSZWZlcmVuY2UodGFzaywgdGFza0ZlYXR1cmUsIGNvbmZpZyk7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcnMod29ya1Byb2R1Y3RzLCBsaXN0LCBhY3Rpdml0eSwKLQkJCQl3cERlc2NyaXB0b3JzLCB3cGRUb0RlbGl2ZXJhYmxlUGFydHNNYXAsCi0JCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAsIGRlc2NyaXB0b3JzVG9SZWZyZXNoLCBjb25maWcpOwotCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlCYXRjaENvbW1hbmQuYWRkRmVhdHVyZVZhbHVlcyhkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLCB0YXNrRGVzY3JpcHRvciwKLQkJCQkJdGFza0Rlc2NyaXB0b3JGZWF0dXJlLCBsaXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIGZyb20gdGhlIGdpdmVuIHdvcmsgcHJvZHVjdHMgZm9yIHRoZQotCSAqIGdpdmVuIGFjdGl2aXR5IGlmIGl0IGRvZXMgbm90IGhhdmUgdGhlbSBhbHJlYWR5Ci0JICogCi0JICogQHBhcmFtIHdvcmtQcm9kdWN0cwotCSAqICAgICAgICAgICAgV29ya1Byb2R1Y3QgbGlzdAotCSAqIEBwYXJhbSBmZWF0dXJlVmFsdWUKLQkgKiAgICAgICAgICAgIHRhcmdldCBXb3JrUHJvZHVjdERlc2NyaXB0b3IgbGlzdCBmb3IgdGhlIGdpdmVuIFdvcmtQcm9kdWN0Ci0JICogICAgICAgICAgICBsaXN0Ci0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIHdwRGVzY3JpcHRvcnMKLQkgKiAgICAgICAgICAgIG5ld2x5IGNyZWF0ZWQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgKG91dHB1dCkKLQkgKi8KLQlzdGF0aWMgdm9pZCBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JzKExpc3Qgd29ya1Byb2R1Y3RzLAotCQkJTGlzdCBmZWF0dXJlVmFsdWUsIEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IHdwRGVzY3JpcHRvcnMsCi0JCQlNYXAgd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwLCBNYXAgd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAsCi0JCQlTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2gsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmICh3b3JrUHJvZHVjdHMgIT0gbnVsbCkgewotCQkJYm9vbGVhbiB3YXNFbXB0eSA9IGZlYXR1cmVWYWx1ZS5pc0VtcHR5KCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHdvcmtQcm9kdWN0cy5zaXplKCk7IGorKykgewotCQkJCVdvcmtQcm9kdWN0IHdwT2JqID0gKFdvcmtQcm9kdWN0KSB3b3JrUHJvZHVjdHMuZ2V0KGopOwotCQkJCWlmICh3cE9iaiAhPSBudWxsKSB7Ci0JCQkJCWlmIChUbmdVdGlsLmlzQ29udHJpYnV0b3Iod3BPYmopKSB7Ci0JCQkJCQl3cE9iaiA9IChXb3JrUHJvZHVjdCkgVG5nVXRpbC5nZXRCYXNlKHdwT2JqKTsKLQkJCQkJfQotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcih3cE9iaiwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJCWlmICh3cERlc2MgPT0gbnVsbCkgewotCQotCQkJCQkJLy8gZ2V0IGluaGVyaXRlZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJCQkJCXdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbAotCQkJCQkJCQkuZ2V0SW5oZXJpdGVkRGVzY3JpcHRvcih3cE9iaiwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJCQlpZiAod3BEZXNjID09IG51bGwpIHsKLQkJCQkJCQl3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKHdwT2JqLCB3cERlc2NyaXB0b3JzLCBjb25maWcpOwotCQkJCQkJCWlmICh3cERlc2MgPT0gbnVsbCkgewotCQkJCQkJCQl3cERlc2MgPSBQcm9jZXNzQ29tbWFuZFV0aWwuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKHdwT2JqLAotCQkJCQkJCQkJCWNvbmZpZywgd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwKTsKLQkJCQkJCQkJd3BEZXNjcmlwdG9ycy5hZGQod3BEZXNjKTsKLQkKLQkJCQkJCQkJLy8gYXV0b21hdGljIGFkZGluZyB0byB0aGUgZXhpc3RpbmcgZGVsaXZlcmFibGUKLQkJCQkJCQkJLy8gZGVzY3JpcHRvciBpbiB0aGUgYWN0aXZpdHkncyBzY29wZSBpZiB0aGVyZQotCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkvLyBhbnkKLQkJCQkJCQkJLy8gdmFsaWQgb25lLgotCQkJCQkJCQkvLwotCQkJCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkJCQkJCS5nZXREZWxpdmVyYWJsZShhY3Rpdml0eSwgd3BPYmopOwotCQkJCQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCQkJCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5wdXQod3BEZXNjLAotCQkJCQkJCQkJCQlkZXNjcmlwdG9yKTsKLQkJCQkJCQkJfQotCQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmIChkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5hZGQod3BEZXNjKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAod3BPYmogaW5zdGFuY2VvZiBEZWxpdmVyYWJsZQotCQkJCQkJCQkJCSYmIHdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlQcm9jZXNzQ29tbWFuZFV0aWwuY3JlYXRlRGVsaXZlcmFibGVQYXJ0cyh3cERlc2MsCi0JCQkJCQkJCQkJCShEZWxpdmVyYWJsZSkgd3BPYmosIGNvbmZpZywKLQkJCQkJCQkJCQkJd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwLCBkZXNjcmlwdG9yc1RvUmVmcmVzaCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHdhc0VtcHR5IHx8ICFmZWF0dXJlVmFsdWUuY29udGFpbnMod3BEZXNjKSkgewotCQkJCQkJZmVhdHVyZVZhbHVlLmFkZCh3cERlc2MpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRhc2sgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHRhc2sgd2l0aGluIHRoZSBhY3Rpdml0eSBpZiBpdAotCSAqIGRvZXMgbm90IGV4aXN0IGFscmVhZHksIGFuZCB1cGRhdGUgdGhlIHJvbGVEZXNjcmlwdG9ycyBhbmQgd3BEZXNjcmlwdG9ycyBsaXN0cwotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFRhc2sgZGVzY3JpcHRvci4gQ2FsbGVyIHNob3VsZCBhZGQgdGhlIG5ldyB0YXNrCi0JICogZGVzY3JpcHRvciBhbmQgdGhlIG90aGVyRGVzY3JpcHRvcnMgaW50byB0aGUgYWN0aXZpdHkncyBicmVha2Rvd24gZWxlbWVudAotCSAqIGxpc3QuCi0JICogCi0JICogQHBhcmFtIHRhc2sKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gcm9sZURlc2NyaXB0b3JzCi0JICogICAgICAgICAgICBMaXN0IHRvIGhvbGQgdGhlIGNyZWF0ZWQgcm9sZSBkZXNjcmlwdG9ycyBhc3NvY2lhdGVkIHdpdGggdGhpcwotCSAqICAgICAgICAgICAgbmV3IHRhc2sgZGVzY3JpcHRvciwgbm8gcm9sZSBkZXNjcmlwdG9yIHdpbGwgYmUgY3JlYXRlZCBpZgotCSAqICAgICAgICAgICAgcm9sZURlc2NyaXB0b3JzIGlzIG51bGwKLQkgKiAKLQkgKiBAcGFyYW0gd3BEZXNjcmlwdG9ycwotCSAqICAgICAgICAgICAgTGlzdCB0byBob2xkIHRoZSBjcmVhdGVkIHdvcmtwcm9kdWN0IGRlc2NyaXB0b3JzIGFzc29jaWF0ZWQKLQkgKiAgICAgICAgICAgIHdpdGggdGhpcyBuZXcgdGFzayBkZXNjcmlwdG9yLCBubyB3b3JrcHJvZHVjdCBkZXNjcmlwdG9yIHdpbGwKLQkgKiAgICAgICAgICAgIGJlIGNyZWF0ZWQgaWYgd3BEZXNjcmlwdG9ycyBpcyBudWxsCi0JICogCi0JICogQHBhcmFtIHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwIAotCSAqICAgICAgICAgICAgTWFwIHRvIGhvbGQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgYW5kIGRlbGl2ZXJhYmxlIGRlc2NyaXB0b3IgdG8gYXNzaWduCi0JICogICAgICAgICAgICB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8KLQkgKiAgICAgICAgICAgICAKLQkgKiBAcmV0dXJuIFRhc2tEZXNjcmlwdG9yIG9yIG51bGwgaWYgdGhlIHRhc2sgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHRhc2sKLQkgKiAgICAgICAgIGFscmVhZHkgZXhpc3RzLCBhbmQgdXBkYXRlZCB0aGUgcm9sZURlc2NyaXB0b3JzIGFuZCB3cERlc2NyaXB0b3JzCi0JICogICAgICAgICBsaXN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGFza0Rlc2NyaXB0b3IgY3JlYXRlVGFza0Rlc2NyaXB0b3IoVGFzayB0YXNrLAotCQkJQWN0aXZpdHkgYWN0aXZpdHksIExpc3Qgcm9sZURlc2NyaXB0b3JzLCBMaXN0IHdwRGVzY3JpcHRvcnMsCi0JCQlNYXAgd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwLCBNYXAgd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAsCi0JCQlTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2gsIE1hcCBkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFNldCBzeW5jaEZlYXR1cmVzKSB7Ci0JCWlmIChUbmdVdGlsLmlzQ29udHJpYnV0b3IodGFzaykpIHsKLQkJCXRhc2sgPSAoVGFzaykgVG5nVXRpbC5nZXRCYXNlKHRhc2spOwotCQl9Ci0JCi0JCS8vIGNyZWF0ZSB0YXNrIGRlc2NyaXB0b3Igb2JqZWN0Ci0JCS8vCi0JCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKAotCQkJCXRhc2ssIGFjdGl2aXR5LCBjb25maWcpOwotCQlib29sZWFuIGlzTmV3VGFza0Rlc2NyaXB0b3IgPSBmYWxzZTsKLQkKLQkJLy8gaWYgKCB0YXNrRGVzYyAhPSBudWxsICkKLQkJLy8gewotCQkvLyByZXR1cm4gdGFza0Rlc2M7Ci0JCS8vIH0KLQkJLy8gdGFza0Rlc2MgPSBjcmVhdGVUYXNrRGVzY3JpcHRvcih0YXNrKTsKLQkKLQkJaWYgKHRhc2tEZXNjID09IG51bGwpIHsKLQkJCXRhc2tEZXNjID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKHRhc2spOwotCQkJaXNOZXdUYXNrRGVzY3JpcHRvciA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZGVzY3JpcHRvcnNUb1JlZnJlc2ggIT0gbnVsbCAmJiB0YXNrRGVzYy5nZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLmFkZCh0YXNrRGVzYyk7Ci0JCQl9Ci0JCX0KLQkKLQkJSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIGNvbmZpZ0FwcGxpY2F0b3IgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKTsKLQkKLQkJaWYgKGlzTmV3VGFza0Rlc2NyaXB0b3IpIHsKLQkJCS8vIGFkZCBhbGwgdGFzayBzdGVwcyB0byBUYXNrRGVzY3JpcHRvciBzdGVwIHNlbGVjdGlvbgotCQkJLy8KLQkJCUxpc3Qgc3RlcHMgPSAoTGlzdCkgY29uZmlnQXBwbGljYXRvci5nZXRSZWZlcmVuY2UodGFzawotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIHRhc2ssIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKSwgY29uZmlnKTsKLQkJCXRhc2tEZXNjLmdldFNlbGVjdGVkU3RlcHMoKS5hZGRBbGwoc3RlcHMpOwotCQkJCi0JCX0KLQkKLQkJLy8gbW92ZWQgdGhpcyBjb2RlIHRvIEJTRHJvcENvbW1hbmQjZXhlY3V0ZSgpIHRvIHN1cHBvcnQgdW5kbyBhbmQKLQkJLy8gcHJvZ3Jlc3MgbW9uaXRvcgotCQkvLwotCQkvLyBlbHNlIHsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gc3RlcHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIE9iamVjdCBzdGVwID0gaXRlci5uZXh0KCk7Ci0JCS8vIGlmICghdGFza0Rlc2MuZ2V0U2VsZWN0ZWRTdGVwcygpLmNvbnRhaW5zKHN0ZXApKSB7Ci0JCS8vIHRhc2tEZXNjLmdldFNlbGVjdGVkU3RlcHMoKS5hZGQoc3RlcCk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCi0JCWlmIChyb2xlRGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJLy8gZ2V0L2NyZWF0ZSByb2xlIGRlc2NyaXB0b3IgZm9yIHByaW1hcnkgcGVyZm9ybWVyCi0JCQkvLwotCQkJRVJlZmVyZW5jZSByZWYgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0JCQlSb2xlIHJvbGUgPSBzeW5jaEZlYXR1cmVzLmNvbnRhaW5zKHJlZikgPyAoUm9sZSkgY29uZmlnQXBwbGljYXRvci5nZXRSZWZlcmVuY2UodGFzaywKLQkJCQkJcmVmLCBjb25maWcpIDogbnVsbDsKLQkJCWlmIChyb2xlICE9IG51bGwpIHsKLQkJCQkvLyBpZiAoVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKHJvbGUpKSB7Ci0JCQkJLy8gcm9sZSA9IChSb2xlKSBUbmdVdGlsLmdldEJhc2Uocm9sZSk7Ci0JCQkJLy8gfQotCQotCQkJCS8vIGNoZWNrIGZvciBsb2NhbCBkZXNjcmlwdG9yCi0JCQkJUm9sZURlc2NyaXB0b3IgcHJpbWFyeVJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKAotCQkJCQkJcm9sZSwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJYm9vbGVhbiBpc05ld1JvbGVEZXNjcmlwdG9yID0gZmFsc2U7Ci0JCQkJaWYgKHByaW1hcnlSb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJCS8vIGNoZWNrIGZvciBpbmhlcml0ZWQgZGVzY3JpcHRvcgotCQkJCQlwcmltYXJ5Um9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbC5nZXRJbmhlcml0ZWREZXNjcmlwdG9yKAotCQkJCQkJCXJvbGUsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCQlpZiAocHJpbWFyeVJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkJCS8vIGNoZWNrIGZvciBkZXNjcmlwdG9yIGluIHBhc3NlZCBpbiBkZXNjcmlwdG9yIGxpc3QKLQkJCQkJCXByaW1hcnlSb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcihyb2xlLAotCQkJCQkJCQlyb2xlRGVzY3JpcHRvcnMsIGNvbmZpZyk7Ci0JCQkJCQlpZiAocHJpbWFyeVJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkJCQlwcmltYXJ5Um9sZURlc2MgPSBQcm9jZXNzVXRpbC5jcmVhdGVSb2xlRGVzY3JpcHRvcihyb2xlKTsKLQkJCQkJCQlpc05ld1JvbGVEZXNjcmlwdG9yID0gdHJ1ZTsKLQkJCQkJCQlyb2xlRGVzY3JpcHRvcnMuYWRkKHByaW1hcnlSb2xlRGVzYyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwgJiYgIWlzTmV3Um9sZURlc2NyaXB0b3IKLQkJCQkJCSYmIHByaW1hcnlSb2xlRGVzYy5nZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5hZGQocHJpbWFyeVJvbGVEZXNjKTsKLQkJCQl9Ci0JCQkJaWYgKGlzTmV3VGFza0Rlc2NyaXB0b3IgJiYgaXNOZXdSb2xlRGVzY3JpcHRvcikgewotCQkJCQl0YXNrRGVzYy5zZXRQZXJmb3JtZWRQcmltYXJpbHlCeShwcmltYXJ5Um9sZURlc2MpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUJhdGNoQ29tbWFuZC5hZGRGZWF0dXJlVmFsdWUoZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCwgdGFza0Rlc2MsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLAotCQkJCQkJCXByaW1hcnlSb2xlRGVzYyk7Ci0JCQkJfQotCQkJfQotCQotCQkJLy8gZ2V0L2NyZWF0ZSByb2xlIGRlc2NyaXB0b3JzIGZvciBhZGRpdGlvbmFsIHBlcmZvcm1pbmcgcm9sZXMKLQkJCS8vCi0JCQlyZWYgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7CQkJCi0JCQlMaXN0IGFkZGl0aW9uYWxQZXJmb3JtZXJzID0gc3luY2hGZWF0dXJlcy5jb250YWlucyhyZWYpID8gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKAotCQkJCQl0YXNrLCByZWYsIGNvbmZpZykgOiBudWxsOwotCQkJaWYgKGFkZGl0aW9uYWxQZXJmb3JtZXJzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGFkZGl0aW9uYWxQZXJmb3JtZXJzLnNpemUoKTsgaisrKSB7Ci0JCQkJCVJvbGUgcm9sZU9iaiA9IChSb2xlKSBhZGRpdGlvbmFsUGVyZm9ybWVycy5nZXQoaik7Ci0JCQkJCS8vIGNoZWNrIGZvciBsb2NhbCBkZXNjcmlwdG9yCi0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKAotCQkJCQkJCXJvbGVPYmosIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCQlib29sZWFuIGlzTmV3Um9sZURlc2NyaXB0b3IgPSBmYWxzZTsKLQkJCQkJaWYgKHJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkJCS8vIGNoZWNrIGZvciBpbmhlcml0ZWQgZGVzY3JpcHRvcgotCQkJCQkJcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbC5nZXRJbmhlcml0ZWREZXNjcmlwdG9yKAotCQkJCQkJCQlyb2xlT2JqLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQkJCWlmIChyb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGdldERlc2NyaXB0b3Iocm9sZU9iaiwKLQkJCQkJCQkJCXJvbGVEZXNjcmlwdG9ycywgY29uZmlnKTsKLQkJCQkJCQlpZiAocm9sZURlc2MgPT0gbnVsbCkgewotCQkJCQkJCQlyb2xlRGVzYyA9IFByb2Nlc3NVdGlsLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKHJvbGVPYmopOwotCQkJCQkJCQlpc05ld1JvbGVEZXNjcmlwdG9yID0gdHJ1ZTsKLQkJCQkJCQkJcm9sZURlc2NyaXB0b3JzLmFkZChyb2xlRGVzYyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsICYmICFpc05ld1JvbGVEZXNjcmlwdG9yCi0JCQkJCQkJJiYgcm9sZURlc2MuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLmFkZChyb2xlRGVzYyk7Ci0JCQkJCX0KLQkJCQkJaWYgKGlzTmV3VGFza0Rlc2NyaXB0b3IgJiYgaXNOZXdSb2xlRGVzY3JpcHRvcikgewotCQkJCQkJdGFza0Rlc2MuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5hZGQocm9sZURlc2MpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJQmF0Y2hDb21tYW5kLmFkZEZlYXR1cmVWYWx1ZSgKLQkJCQkJCQkJZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCwKLQkJCQkJCQkJdGFza0Rlc2MsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksCi0JCQkJCQkJCXJvbGVEZXNjKTsKLQkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQotCQlpZiAod3BEZXNjcmlwdG9ycyAhPSBudWxsKSB7Ci0JCQlpZiAoIWlzTmV3VGFza0Rlc2NyaXB0b3IgJiYgIXN5bmNoRmVhdHVyZXMuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCkpKSB7Ci0JCQkJd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwID0gbnVsbDsKLQkJCX0KLQkJCQotCQkJLy8gY3JlYXRlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGZvciBpbnB1dCB3b3JrcHJvZHVjdHMKLQkJCS8vCi0JCQlpZiAoaXNOZXdUYXNrRGVzY3JpcHRvciB8fCBzeW5jaEZlYXR1cmVzLmNvbnRhaW5zKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSkpIHsKLQkJCQljb2xsZWN0V29ya1Byb2R1Y3REZXNjcnRpcHRvcnModGFzaywgdGFza0Rlc2MsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCksIGNvbmZpZywgYWN0aXZpdHksCi0JCQkJCQl3cERlc2NyaXB0b3JzLCB3cGRUb0RlbGl2ZXJhYmxlUGFydHNNYXAsCi0JCQkJCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCwgZGVzY3JpcHRvcnNUb1JlZnJlc2gsCi0JCQkJCQlkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwKTsKLQkJCX0KLQkJCWlmIChpc05ld1Rhc2tEZXNjcmlwdG9yIHx8IHN5bmNoRmVhdHVyZXMuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCkpKSB7Ci0JCQkJY29sbGVjdFdvcmtQcm9kdWN0RGVzY3J0aXB0b3JzKHRhc2ssIHRhc2tEZXNjLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwgY29uZmlnLCBhY3Rpdml0eSwKLQkJCQkJCXdwRGVzY3JpcHRvcnMsIHdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCwKLQkJCQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwKLQkJCQkJCWRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXApOwotCQkJfQotCQotCQkJLy8gY3JlYXRlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGZvciBvdXRwdXQgd29ya3Byb2R1Y3RzCi0JCQkvLwotCQkJaWYgKGlzTmV3VGFza0Rlc2NyaXB0b3IgfHwgc3luY2hGZWF0dXJlcy5jb250YWlucyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpKSkgewotCQkJCWNvbGxlY3RXb3JrUHJvZHVjdERlc2NydGlwdG9ycyh0YXNrLCB0YXNrRGVzYywgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRUYXNrX091dHB1dCgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpLCBjb25maWcsIGFjdGl2aXR5LAotCQkJCQkJd3BEZXNjcmlwdG9ycywgd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwLAotCQkJCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAsIGRlc2NyaXB0b3JzVG9SZWZyZXNoLAotCQkJCQkJZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCk7Ci0JCQl9Ci0JCX0KLQkKLQkJaWYgKGlzTmV3VGFza0Rlc2NyaXB0b3IpIHsKLQkJCXJldHVybiB0YXNrRGVzYzsKLQkJfQotCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUYXNrRGVzY3JpcHRvciBjcmVhdGVUYXNrRGVzY3JpcHRvcihUYXNrIHRhc2spIHsKLQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrRGVzY3JpcHRvcigpOwotCQl0YXNrRGVzYy5zZXRUYXNrKHRhc2spOwotCQl0YXNrRGVzYy5zZXROYW1lKHRhc2suZ2V0TmFtZSgpKTsKLQkJdGFza0Rlc2Muc2V0UHJlc2VudGF0aW9uTmFtZShTdHJVdGlsCi0JCQkJLmlzQmxhbmsodGFzay5nZXRQcmVzZW50YXRpb25OYW1lKCkpID8gdGFzay5nZXROYW1lKCkgOiB0YXNrCi0JCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCS8vIHRhc2tEZXNjLnNldEJyaWVmRGVzY3JpcHRpb24odGFzay5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCQlyZXR1cm4gdGFza0Rlc2M7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBkZWxpdmVyYWJsZSBwYXJ0cyBmb3IgdGhlIGdpdmVuIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGZyb20gdGhlCi0JICogZGVsaXZlcmFibGUgd29yayBwcm9kdWN0cyBvZiB0aGUgZ2l2ZW4gZGVsaXZlcmFibGUgYWRkIHB1dCB0aGVtIGluCi0JICogPGNvZGU+d3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSB3cGQKLQkgKiBAcGFyYW0gZGVsaXZlcmFibGUKLQkgKiBAcGFyYW0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzCi0JICogICAgICAgICAgICAob3V0cHV0KSBtYXAgb2Ygd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8gaXRzIG5ld2x5IGNyZWF0ZWQKLQkgKiAgICAgICAgICAgIGRlbGl2ZXJhYmxlIHBhcnRzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZURlbGl2ZXJhYmxlUGFydHMoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCwKLQkJCURlbGl2ZXJhYmxlIGRlbGl2ZXJhYmxlLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCU1hcCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsIFNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaCkgewotCQlJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlnQXBwbGljYXRvciA9IFByb3ZpZGVycwotCQkJCS5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpOwotCQotCQlMaXN0IGRlbGl2ZXJlZFdQcyA9IChMaXN0KSBjb25maWdBcHBsaWNhdG9yLmdldFJlZmVyZW5jZShkZWxpdmVyYWJsZSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSwKLQkJCQljb25maWcpOwotCQlMaXN0IHBhcnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAod3BkLmdldERlbGl2ZXJhYmxlUGFydHMoKS5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlbGl2ZXJlZFdQcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlwYXJ0cy5hZGQoUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigKLQkJCQkJCShXb3JrUHJvZHVjdCkgaXRlci5uZXh0KCksIGNvbmZpZywKLQkJCQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cykpOwotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVsaXZlcmVkV1BzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0ID0gKFdvcmtQcm9kdWN0KSBpdGVyLm5leHQoKTsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGdldERlc2NyaXB0b3Iod29ya1Byb2R1Y3QsIHdwZC5nZXREZWxpdmVyYWJsZVBhcnRzKCksIGNvbmZpZyk7Ci0JCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQlkZXNjID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigKLQkJCQkJCQl3b3JrUHJvZHVjdCwgY29uZmlnLCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmKGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwpIHsKLQkJCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLmFkZChkZXNjKTsKLQkJCQkJfQotCQkJCQlpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQkJY3JlYXRlRGVsaXZlcmFibGVQYXJ0cyhkZXNjLCAoRGVsaXZlcmFibGUpIHdvcmtQcm9kdWN0LAotCQkJCQkJCQljb25maWcsIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cywgZGVzY3JpcHRvcnNUb1JlZnJlc2gpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXBhcnRzLmFkZChkZXNjKTsKLQkJCX0KLQkJfQotCQlpZiAoIXBhcnRzLmlzRW1wdHkoKSkgewotCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLnB1dCh3cGQsIHBhcnRzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiB3b3JrIHByb2R1Y3QKLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cwotCSAqICAgICAgICAgICAgKG91dHB1dCkgbWFwIG9mIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIHRvIGl0cyBuZXdseSBjcmVhdGVkCi0JICogICAgICAgICAgICBkZWxpdmVyYWJsZSBwYXJ0cwotCSAqIEByZXR1cm4gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRvciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiAgICAgICAgIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiB3b3JrIHByb2R1Y3QgYWxyZWFkeSBleGlzdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoCi0JCQlXb3JrUHJvZHVjdCB3cCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlNYXAgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzKSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSBQcm9jZXNzVXRpbC5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3Iod3ApOwotCQlpZiAod3AgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSAmJiB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMgIT0gbnVsbCkgewotCQkJY3JlYXRlRGVsaXZlcmFibGVQYXJ0cyh3cGQsIChEZWxpdmVyYWJsZSkgd3AsIGNvbmZpZywKLQkJCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gd3BkOwotCX0KLQotCS8qKgotCSAqIEdldCBpbmhlcnRpZWQgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHJvbGUsIHRhc2sgb3Igd29ya1Byb2R1Y3QuIFVubGlrZSBsb2NhbCBkZXNjcmlwdG9yLCBhbiBpbmhlcml0ZWQgCi0JICogZGVzY3JpcHRvciB0aGF0IGlzIGV4dGVybmFsbHkgc3VwcHJlc3NlZCBpcyBjb25zaWRlcmVkIHZhbGlkLgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcmV0dXJuIGRlc2NyaXB0b3Igb2YgdGhlIG9iamVjdCwgbnVsbCBpZiBub3QgZXhpc3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0SW5oZXJpdGVkRGVzY3JpcHRvcihPYmplY3Qgb2JqLCBBY3Rpdml0eSBhY3Rpdml0eSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJZm9yIChWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQl2YXJpYWJpbGl0eVR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCB8fCB2YXJpYWJpbGl0eVR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTl9MSVRFUkFMOwotCQkJdmFyaWFiaWxpdHlUeXBlID0gYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50ID0gYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IGJhc2VBY3Rpdml0eSA9IChBY3Rpdml0eSkgZWxlbWVudDsKLQkJCQlPYmplY3QgZGVzYyA9IGdldERlc2NyaXB0b3Iob2JqLCBiYXNlQWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSwgY29uZmlnLCBmYWxzZSk7Ci0JCQkJaWYoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBkZXNjOwotCQkJCX0KLQkJCQlhY3Rpdml0eSA9IGJhc2VBY3Rpdml0eTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIG1hcCBvZiB0YXNrIHRvIGZlYXR1cmVzIHRoYXQgY29udGFpbiB0aGUgd29yayBwcm9kdWN0IAotCSAqIChpbnB1dCBvciBvdXRwdXQgb2YgdGhlIHRhc2spCi0JICogCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIHdwCi0JICogQHJldHVybiBNYXAgb2YgdGFzayB0byBmZWF0dXJlcyB0aGF0IGNvbnRhaW4gdGhlIHdvcmsgcHJvZHVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldEZlYXR1cmVzTWFwKExpc3QgdGFza3MsIFdvcmtQcm9kdWN0IHdwLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlNYXAgZmVhdHVyZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlFUmVmZXJlbmNlW10gdGFza0ZlYXR1cmVzID0gewotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpCi0JCX07Ci0JCWZvciAoaW50IGkgPSB0YXNrcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJVGFzayB0YXNrID0gKFRhc2spIHRhc2tzLmdldChpKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgdGFza0ZlYXR1cmVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJRVJlZmVyZW5jZSBmZWF0dXJlID0gdGFza0ZlYXR1cmVzW2pdOwotCQkJCU9iamVjdCB2YWx1ZSA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldFJlZmVyZW5jZSh0YXNrLCBmZWF0dXJlLCBjb25maWcpOwotCQkJCWlmKChmZWF0dXJlLmlzTWFueSgpICYmICgoTGlzdCl2YWx1ZSkuY29udGFpbnMod3ApKSB8fAotCQkJCQkJdmFsdWUgPT0gd3ApIAotCQkJCXsKLQkJCQkJQ29sbGVjdGlvbiBmZWF0dXJlcyA9IChDb2xsZWN0aW9uKSBmZWF0dXJlc01hcC5nZXQodGFzayk7Ci0JCQkJCWlmKGZlYXR1cmVzID09IG51bGwpIHsKLQkJCQkJCWZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwkKLQkJCQkJCWZlYXR1cmVzTWFwLnB1dCh0YXNrLCBmZWF0dXJlcyk7Ci0JCQkJCX0KLQkJCQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmVhdHVyZXNNYXA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzRGVlcENvcHlDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NEZWVwQ29weUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTJhNmJmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NEZWVwQ29weUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci0KLS8qKgotICogUGh5c2ljYWxseSBjb3BpZXMgYSBwcm9jZXNzIHdpdGggYWxsIG9mIGl0cyBkaXJlY3Qgb3IgaW5oZXJpdGVkIHN0cnVjdHVyYWwgZmVhdHVyZXMgYW5kIHJlZmVyZW5jZXMuCi0gKiBBZGQgdGhlIG5ld2x5IGNyZWF0ZWQgcHJvY2VzcyB0byB0aGUgc3BlY2lmaWVkIHByb2Nlc3MgcGFja2FnZS4KLSAqICAgIAotICogVGhpcyBjbGFzcyBleHRlbmRzIHRoZSBBY3Rpdml0eURlZXBDb3B5Q29tbWFuZCB0byByZXVzZSBtb3N0IG9mIGl0J3MgZnVuY3Rpb25hbGl0eS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRGVlcENvcHlDb21tYW5kIGV4dGVuZHMgQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQgewotCi0JcHJpdmF0ZSBQcm9jZXNzUGFja2FnZSB0YXJnZXRQYWNrYWdlOwotCXByaXZhdGUgUHJvY2Vzc0NvbXBvbmVudCB0ZW1wUGM7Ci0JcHJpdmF0ZSBTdHJpbmcgbmV3UHJvY2Vzc05hbWU7Ci0JCi0JcHVibGljIFByb2Nlc3NEZWVwQ29weUNvbW1hbmQob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2Nlc3MsIFN0cmluZyBuZXdQcm9jZXNzTmFtZSwgQ29weUhlbHBlciBjb3B5SGVscGVyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgUHJvY2Vzc1BhY2thZ2UgdGFyZ2V0UGFja2FnZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJc3VwZXIocHJvY2VzcywgY29weUhlbHBlciwgY29uZmlnLCBudWxsLCBtb25pdG9yKTsKLQotCQl0aGlzLm5ld1Byb2Nlc3NOYW1lID0gbmV3UHJvY2Vzc05hbWU7CQkKLQkJdGhpcy50YXJnZXRQYWNrYWdlID0gdGFyZ2V0UGFja2FnZTsKLQkJY3JlYXRldGFyZ2V0UHJvY2VzcygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRldGFyZ2V0UHJvY2VzcygpIHsKLQkJLy8gY3JlYXRlIGEgcGxhY2Vob2xkZXIgZm9yIHRoZSBuZXcgcHJvY2VzcwotCQkvLyBzaW5jZSB0aGUgY29udGVudCBwcm9jZXNzb3IgbmVlZHMgdG8ga25vdyB0aGUgdGFyZXQgcHJvY2VzcyBpbiBvcmRlciB0byBmaXggdGhlIHVybHMKLQkJCi0JCXRlbXBQYyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NDb21wb25lbnQoKTsKLQkJdGFyZ2V0UGFja2FnZS5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKHRlbXBQYyk7Ci0JCQotCQlpZiAoIHN1cGVyLmFjdGl2aXR5IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzICkgewotCQkJdGFyZ2V0UHJvY2VzcyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJ5UHJvY2VzcygpOwotCQl9IGVsc2UgewotCQkJdGFyZ2V0UHJvY2VzcyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKCk7CQkJCi0JCX0KLQkJdGFyZ2V0UHJvY2Vzcy5zZXROYW1lKG5ld1Byb2Nlc3NOYW1lKTsKLQkJdGFyZ2V0UHJvY2Vzcy5zZXRQcmVzZW50YXRpb25OYW1lKG5ld1Byb2Nlc3NOYW1lKTsKLQkJdGVtcFBjLnNldE5hbWUobmV3UHJvY2Vzc05hbWUpOwotCi0JCXRlbXBQYy5zZXRQcm9jZXNzKHRhcmdldFByb2Nlc3MpOwkJCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsJCQkJCi0JCXN1cGVyLmV4ZWN1dGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZml4UHJvY2Vzc0NvbXBvbmVudCgpIHsKLQkJLy8gcmVwbGFjZSB0aGUgcGxhY2UgaG9sZGVyIHdpdGggdGhlIGFjdHVhbCBjb3BpZWQgcHJvY2VzcwotCQlpZiAocGtnQ29weSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgKSB7Ci0JCQlwa2dDb3B5LnNldE5hbWUobmV3UHJvY2Vzc05hbWUpOwotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpcGtnQ29weSkuZ2V0UHJvY2VzcygpOwotCQkJcHJvYy5zZXROYW1lKG5ld1Byb2Nlc3NOYW1lKTsKLQkJCXByb2Muc2V0UHJlc2VudGF0aW9uTmFtZShuZXdQcm9jZXNzTmFtZSk7Ci0JCQkKLQkJCUVjb3JlVXRpbC5yZXBsYWNlKHRlbXBQYywgcGtnQ29weSk7Ci0JCX0KLQl9Ci0JCi0JLyogCi0JICogcmV0dXJucyBhIENvbGxlY3Rpb24gY29udGFpbmluZyB0aGUgbmV3IHByb2Nlc3MKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjZ2V0UmVzdWx0KCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCWlmKHBrZ0NvcHkgIT0gbnVsbCAmJiBwa2dDb3B5IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoICgoUHJvY2Vzc0NvbXBvbmVudClwa2dDb3B5KS5nZXRQcm9jZXNzKCkpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NFbGVtZW50QWRkQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzRWxlbWVudEFkZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmM5OGVmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NFbGVtZW50QWRkQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gU2VwIDE2LCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRWxlbWVudEFkZENvbW1hbmQgZXh0ZW5kcyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCAKLWltcGxlbWVudHMgSVJlc291cmNlQXdhcmVDb21tYW5kCi17Ci0KLQlwdWJsaWMgUHJvY2Vzc0VsZW1lbnRBZGRDb21tYW5kKENvbW1hbmQgY29tbWFuZCkgewotCQkvLyBkaXNhYmxlIHJ1biB3aXRoIHByb2dyZXNzIGJhciB3aGVuIGFkZGluZyBpbiBwcm9jZXNzIGVkaXRvcgotCQkvLwotCQlzdXBlcihjb21tYW5kLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIFByb2Nlc3NFbGVtZW50QWRkQ29tbWFuZChDb21tYW5kIGNvbW1hbmQsIGJvb2xlYW4gcnVuV2l0aFByb2dyZXNzKSB7Ci0JCXN1cGVyKGNvbW1hbmQsIHJ1bldpdGhQcm9ncmVzcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kI2dldEZlYXR1cmVzVG9DaGVjaygpCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0RmVhdHVyZXNUb0NoZWNrKCkgewotCQlpZiAoZmVhdHVyZXNUb0NoZWNrID09IG51bGwpIHsKLQkJCXN1cGVyLmdldEZlYXR1cmVzVG9DaGVjaygpLmFkZCgKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIGZlYXR1cmVzVG9DaGVjazsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kI3dpbGxTYXZlTW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHdpbGxTYXZlTW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCS8vIGRvbid0IHNhdmUgdGhlIHJlc291cmNlcyBhZnRlciBlYWNoIGFkZAotCQkvLwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kI3NhdmVNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZU1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQkvLyBkb24ndCBzYXZlIHRoZSByZXNvdXJjZXMgYWZ0ZXIgZWFjaCBhZGQKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQjY3JlYXRlVmFsaWRhdG9yKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKQotCSAqLwotCXByb3RlY3RlZCBJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcihFT2JqZWN0IGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUVkaXRpbmdEb21haW4gZG9tYWluID0gYWRkQ29tbWFuZC5nZXREb21haW4oKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50Ci0JCQkJJiYgYWRkQ29tbWFuZC5nZXRGZWF0dXJlKCkgaW5zdGFuY2VvZiBFUmVmZXJlbmNlCi0JCQkJJiYgZG9tYWluIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQlyZXR1cm4gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlVmFsaWRhdG9yKGFkZENvbW1hbmQuZ2V0T3duZXIoKSwgbnVsbCwgZSwKLQkJCQkJZmVhdHVyZSwgKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGRvbWFpbikuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVZhbGlkYXRvcihlLCBmZWF0dXJlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NFbGVtZW50RGVsZXRlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzRWxlbWVudERlbGV0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmY2ODY2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NFbGVtZW50RGVsZXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEphbiAyNiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NFbGVtZW50RGVsZXRlQ29tbWFuZCBleHRlbmRzCi0JCURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQlwcml2YXRlIFNldCBjb250ZW50c1RvUmVtb3ZlOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gb3duZWRFbGVtZW50c0luY2x1ZGVkOwotCi0JLyoqCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0VsZW1lbnREZWxldGVDb21tYW5kKENvbW1hbmQgY29tbWFuZCwgQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQlzdXBlcihjb21tYW5kLCBlbGVtZW50cyk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHBhcmFtIGNvbmZpcm1SZW1vdmVSZWZzCi0JICovCi0JcHVibGljIFByb2Nlc3NFbGVtZW50RGVsZXRlQ29tbWFuZChDb21tYW5kIGNvbW1hbmQsIENvbGxlY3Rpb24gZWxlbWVudHMsIGJvb2xlYW4gY29uZmlybVJlbW92ZVJlZnMpIHsKLQkJc3VwZXIoY29tbWFuZCwgZWxlbWVudHMsIGNvbmZpcm1SZW1vdmVSZWZzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJaWYoIW93bmVkRWxlbWVudHNJbmNsdWRlZCkgewotCQkJQ29sbGVjdGlvbiBvd25lZEVsZW1lbnRzID0gZ2V0T3duZWRFbGVtZW50cyhlbGVtZW50cyk7Ci0JCQlpZighb3duZWRFbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCQlpbmNsdWRlRWxlbWVudHMob3duZWRFbGVtZW50cyk7Ci0JCQl9Ci0JCQlvd25lZEVsZW1lbnRzSW5jbHVkZWQgPSB0cnVlOwotCQl9Ci0JCQotCQlzdXBlci5leGVjdXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldE93bmVkRWxlbWVudHMoQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQlBcnJheUxpc3Qgb3duZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcillbGVtZW50KTsKLQkJCQlXb3JrUHJvZHVjdCB3cCA9IHdwZC5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCWlmKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJSXRlcmF0b3IgaXRlcjEgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3Iod3AsIGZhbHNlKSB7Ci0KLQkJCQkJCS8qKgotCQkJCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkJCSAqLwotCQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDIyMTgxNzgyMjY4ODc4Mjg5TDsKLQotCQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCQlyZXR1cm4gKChBcnRpZmFjdClvYmplY3QpLmdldENvbnRhaW5lZEFydGlmYWN0cygpLml0ZXJhdG9yKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJfTsKLQkJCQkJSGFzaFNldCB3b3JrUHJvZHVjdHMgPSBuZXcgSGFzaFNldCgpOwotCQkJCQl3aGlsZShpdGVyMS5oYXNOZXh0KCkpIHsKLQkJCQkJCXdvcmtQcm9kdWN0cy5hZGQoaXRlcjEubmV4dCgpKTsKLQkJCQkJfQotCQkJCQlBY3Rpdml0eSBhY3Rpdml0eSA9IFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkod3BkKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGJlID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKGJlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yCi0JCQkJCQkJCSYmIHdvcmtQcm9kdWN0cy5jb250YWlucygoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgYmUpCi0JCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0KCkpKSB7Ci0JCQkJCQkJb3duZWRFbGVtZW50cy5hZGQoYmUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gb3duZWRFbGVtZW50czsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGNsdWRlRWxlbWVudHMoQ29sbGVjdGlvbiBleGNsdWRlZEVsZW1lbnRzKSB7Ci0JCWVsZW1lbnRzLnJlbW92ZUFsbChleGNsdWRlZEVsZW1lbnRzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZXhjbHVkZWRFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlSZW1vdmVDb21tYW5kIGNtZCA9IGdldFJlbW92ZUNvbW1hbmQoZWxlbWVudCk7Ci0JCQlpZihjbWQgIT0gbnVsbCkgewotCQkJCWNtZC5nZXRDb2xsZWN0aW9uKCkucmVtb3ZlKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluY2x1ZGVFbGVtZW50cyhDb2xsZWN0aW9uIGluY2x1ZGVkRWxlbWVudHMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gaW5jbHVkZWRFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZighZWxlbWVudHMuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJUmVtb3ZlQ29tbWFuZCBjbWQgPSBnZXRSZW1vdmVDb21tYW5kKGVsZW1lbnQpOwotCQkJCWlmKGNtZCAhPSBudWxsKSB7Ci0JCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IGNtZC5nZXRDb2xsZWN0aW9uKCk7Ci0JCQkJCWlmKCFjb2xsZWN0aW9uLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJCQljb2xsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzKCkgewotCQlpZiAoZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJRU9iamVjdCBwa2cgPSAoKEFjdGl2aXR5KSBlbGVtZW50KS5lQ29udGFpbmVyKCk7Ci0JCQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCQkJZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMuYWRkKHBrZyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllbGVtZW50c1RvUmVtb3ZlUmVmZXJlbmNlcy5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQllbGVtZW50c1RvUmVtb3ZlUmVmZXJlbmNlcy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50c1RvUmVtb3ZlUmVmZXJlbmNlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZW1vdmVSZWZlcmVuY2VzKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlZmVyZW5jZXMoKSB7Ci0JCWNvbnRlbnRzVG9SZW1vdmUgPSBuZXcgSGFzaFNldCgpOwotCQkvLyBoYXZlIHRvIHJlbW92ZSB0aGUgZGVsZXRlZCBwcm9jZXNzIGVsZW1lbnRzIGZyb20gaXRzIGNvbnRhaW5lcgotCQkvLyBhbmQvb3IgcmVzb3VyY2UKLQkJLy8gc28gc3VwZXIucmVtb3ZlUmVmZXJlbmNlcygpIGNhbiByZW1vdmUgdGhlaXIgcmVmZXJlbmNlcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIG9iajsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvYmo7Ci0KLQkJCQkJLy8gcmVtb3ZlIGNvbnRlbnQgb2YgdGhlIGFjdGl2aXR5IGZyb20gaXRzIHJlc291cmNlCi0JCQkJCS8vCi0JCQkJCS8vIHJlbW92ZUNvbnRlbnRGcm9tUmVzb3VyY2UoYWN0LCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJCWlmIChDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihhY3QpKSB7Ci0JCQkJCQljb250ZW50c1RvUmVtb3ZlLmFkZChhY3QuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCQl9Ci0KLQkJCQkJLy8gcmVtb3ZlIHRoZSBwcm9jZXNzIHBhY2thZ2Ugb2YgdGhpcyBhY3Rpdml0eQotCQkJCQkvLwotCQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9IGVPYmouZUNvbnRhaW5lcigpOwotCQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoY29udGFpbmVyKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb250YWluZXIuZUFsbENvbnRlbnRzKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCQlhY3QgPSAoQWN0aXZpdHkpIGVsZW1lbnQ7Ci0KLQkJCQkJCQkJLy8gcmVtb3ZlIGNvbnRlbnQgb2YgdGhlIGFjdGl2aXR5IGZyb20gaXRzCi0JCQkJCQkJCS8vIHJlc291cmNlCi0JCQkJCQkJCS8vCi0JCQkJCQkJCS8vIHJlbW92ZUNvbnRlbnRGcm9tUmVzb3VyY2UoYWN0LAotCQkJCQkJCQkvLyBtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJCQkJCWlmIChDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Ci0JCQkJCQkJCQkJLmhhc1ByZXNlbnRhdGlvbihhY3QpKSB7Ci0JCQkJCQkJCQljb250ZW50c1RvUmVtb3ZlLmFkZChhY3QKLQkJCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUoKEVPYmplY3QpIG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3VwZXIucmVtb3ZlUmVmZXJlbmNlcygpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kI2RlbGV0ZUNvbnRlbnQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUNvbnRlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29udGVudHNUb1JlbW92ZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVjb3JlVXRpbC5yZW1vdmUoKEVPYmplY3QpIGl0ZXIubmV4dCgpKTsKLQkJfQotCQllbGVtZW50c1RvRGVsZXRlQ29udGVudC5hZGRBbGwoY29udGVudHNUb1JlbW92ZSk7Ci0JCXN1cGVyLmRlbGV0ZUNvbnRlbnQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQjY29sbGVjdE9iamVjdHNUb1JlbW92ZShqYXZhLnV0aWwuQ29sbGVjdGlvbiwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb2xsZWN0T2JqZWN0c1RvUmVtb3ZlKENvbGxlY3Rpb24gb2JqZWN0c1RvUmVtb3ZlLCBFT2JqZWN0IGVsZW1lbnRUb0RlbGV0ZSwgRU9iamVjdCByZWZlcmVuY2VyLCBDb2xsZWN0aW9uIHJlZmVyZW5jZXMpIHsKLQkJYm9vbGVhbiByZXQgPSBzdXBlci5jb2xsZWN0T2JqZWN0c1RvUmVtb3ZlKG9iamVjdHNUb1JlbW92ZSwgZWxlbWVudFRvRGVsZXRlLAotCQkJCXJlZmVyZW5jZXIsIHJlZmVyZW5jZXMpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihyZWYgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCkpIHsKLQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9IHJlZmVyZW5jZXIuZUNvbnRhaW5lcigpOwotCQkJCWlmKGNvbnRhaW5lciAhPSBudWxsICYmIGNvbnRhaW5lci5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJCQlvYmplY3RzVG9SZW1vdmUuYWRkKGNvbnRhaW5lcik7Ci0JCQkJCXJldCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihjb250ZW50c1RvUmVtb3ZlICE9IG51bGwpIHsKLQkJCWNvbnRlbnRzVG9SZW1vdmUuY2xlYXIoKTsKLQkJfQotCQlpZihlbGVtZW50c1RvUmVtb3ZlUmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQllbGVtZW50c1RvUmVtb3ZlUmVmZXJlbmNlcy5jbGVhcigpOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9SZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmZDZjNzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9SZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE5vdiAzMCwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0W10gVEFTS19ERVNDUklQVE9SX19SRUxBVElPTlNISVBTID0gewotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAkJCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpCi0JfTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdFtdIFJPTEVfREVTQ1JJUFRPUl9fUkVMQVRJT05TSElQUyA9IHsKLQkJQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfQXNzaXN0c0luX1Rhc2tEZXNjcmlwdG9ycywKLQkJQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfQWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycywKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKQotCX07Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUkVMQVRJT05TSElQUyA9IHsKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKSwKLQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0VG9fVGFza0Rlc2NyaXB0b3JzLAotCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycywKLQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX09wdGlvbmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMsCi0JCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9PdXRwdXRGcm9tX1Rhc2tEZXNjcmlwdG9ycywKLQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX1Jlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzCi0JfTsKLQkKLQlwcml2YXRlIEhhc2hTZXQgcmVtb3ZlZERlc2NyaXB0b3JzOwotCXByb3RlY3RlZCBib29sZWFuIGFib3J0ZWQ7IAotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKi8KLQlwdWJsaWMgUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIFJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0Fib3J0ZWQoKSB7Ci0JCXJldHVybiBhYm9ydGVkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCX0KLQotCXByaXZhdGUgT2JqZWN0IGdldFBhcmVudChEZXNjcmlwdG9yIG9iaikgewotCQkvLyBBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJLy8gaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCS8vIGZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkvLyAuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJLy8gfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkvLyBmYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJLy8gLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCS8vIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCS8vIGZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkvLyAuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJLy8gfQotCQkvLwotCQkvLyBJdGVtUHJvdmlkZXJBZGFwdGVyIHByb3ZpZGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpCi0JCS8vIGZhY3RvcnkuYWRhcHQob2JqLAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyBPYmplY3QgYWN0ID0gcHJvdmlkZXIuZ2V0UGFyZW50KG9iaik7Ci0JCS8vCi0JCS8vIHJldHVybiBhY3Q7Ci0KLQkJcmV0dXJuIFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkob2JqKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGUoT2JqZWN0W10gcmVmVG9iZURlbGV0ZWQpIHsKLQkJaWYgKHJlZlRvYmVEZWxldGVkICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmVG9iZURlbGV0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCQlEZXNjcmlwdG9yIG9iaiA9IChEZXNjcmlwdG9yKSByZWZUb2JlRGVsZXRlZFtpXTsKLQkJCQkvLyBnZXQgcGFyZW50IGFuZCByZW1vdmUgcmVmIG9iamVjdAotCQkJCU9iamVjdCBhY3QgPSBnZXRQYXJlbnQob2JqKTsKLQkJCQlpZiAoYWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJaWYgKCgoQWN0aXZpdHkpIGFjdCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmUob2JqKSkgewotCQkJCQkJZ2V0UmVtb3ZlZERlc2NyaXB0b3JzKCkuYWRkKG9iaik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZW1vdmVkRGVzY3JpcHRvcnMoKSB7Ci0JCWlmIChyZW1vdmVkRGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJcmVtb3ZlZERlc2NyaXB0b3JzID0gbmV3IEhhc2hTZXQoKTsKLQkJfQotCQlyZXR1cm4gcmVtb3ZlZERlc2NyaXB0b3JzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9SZXBsYWNlQWN0aXZpdHlDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JlcGxhY2VBY3Rpdml0eUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTczNDBiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JlcGxhY2VBY3Rpdml0eUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMTAsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlcGxhY2VBY3Rpdml0eUNvbW1hbmQgZXh0ZW5kcyBWYXJ5QWN0aXZpdHlDb21tYW5kIHsKLQotCS8qKgotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICovCi0JcHVibGljIFJlcGxhY2VBY3Rpdml0eUNvbW1hbmQoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQlzdXBlcih3cmFwcGVyKTsKLQkJc2V0TGFiZWwoTGlicmFyeUVkaXRSZXNvdXJjZXMubG9jYWxSZXBsYWNlc190ZXh0KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlZhcnlBY3Rpdml0eUNvbW1hbmQjZG9WYXJ5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1ZhcnkoKSB7Ci0JCVByb2Nlc3NVdGlsLnJlcGxhY2VBY3Rpdml0eUxvY2FsbHkod3JhcHBlciwgY3JlYXRlZEFjdGl2aXRpZXMpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUm9sZUFzc29jaWF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JvbGVBc3NvY2lhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZDg2YTc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUm9sZUFzc29jaWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZUFzc29jaWF0aW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU1BUlkgPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQURESVRJT05BTCA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU1NJU1RFRCA9IDI7Ci0KLQlwcml2YXRlIGludCB0eXBlOwotCi0JcHJpdmF0ZSBSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvcjsKLQotCXByaXZhdGUgVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3I7Ci0KLQlwcml2YXRlIFJvbGVEZXNjcmlwdG9yIG9sZFJvbGVEZXNjcmlwdG9yOwotCi0JcHVibGljIFJvbGVBc3NvY2lhdGlvbihpbnQgdHlwZSwgUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IsCi0JCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvcikgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLnJvbGVEZXNjcmlwdG9yID0gcm9sZURlc2NyaXB0b3I7Ci0JCXRoaXMudGFza0Rlc2NyaXB0b3IgPSB0YXNrRGVzY3JpcHRvcjsKLQl9Ci0KLQlwdWJsaWMgUm9sZURlc2NyaXB0b3IgZ2V0T2xkUm9sZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBvbGRSb2xlRGVzY3JpcHRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPbGRSb2xlRGVzY3JpcHRvcihSb2xlRGVzY3JpcHRvciBvbGRSb2xlRGVzY3JpcHRvcikgewotCQl0aGlzLm9sZFJvbGVEZXNjcmlwdG9yID0gb2xkUm9sZURlc2NyaXB0b3I7Ci0JfQotCi0JcHVibGljIFJvbGVEZXNjcmlwdG9yIGdldFJvbGVEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gcm9sZURlc2NyaXB0b3I7Ci0JfQotCi0JcHVibGljIFRhc2tEZXNjcmlwdG9yIGdldFRhc2tEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gdGFza0Rlc2NyaXB0b3I7Ci0JfQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUm9sZVRlYW1Qcm9maWxlQXNzb2NpYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUm9sZVRlYW1Qcm9maWxlQXNzb2NpYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDk5MjhmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JvbGVUZWFtUHJvZmlsZUFzc29jaWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1bCAyOSwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRlYW1Qcm9maWxlQXNzb2NpYXRpb24gewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1N5bmNocm9uaXplQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9TeW5jaHJvbml6ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTgyNzUyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1N5bmNocm9uaXplQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0KLS8qKgotICogQ29tbWFuZCBmb3Igb25lLXdheSBzeW5jaHJvbml6YXRpb24gZnJvbSBtZXRob2QgdG8gcHJvY2Vzcy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBOb3YgMjIsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplQ29tbWFuZCBleHRlbmRzIENvbXBvdW5kQ29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZWxlbWVudHM7Ci0KLQlwcml2YXRlIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWJvcnRlZDsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGRlbGV0ZUxpc3Q7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVFeGVjU3VjY2Vzc2Z1bDsKLQotCXByb3RlY3RlZCBMaXN0IGRlbGV0ZUNvbW1hbmRMaXN0OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VjY2Vzc2Z1bDsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwcml2YXRlIFNldCBzeW5jaEZlYXR1cmVzOwotCi0JcHJpdmF0ZSBEZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kOwotCQotCXByaXZhdGUgQ29sbGVjdGlvbiBhY3Rpdml0aWVzOwotCi0JcHJpdmF0ZSBib29sZWFuIHNob3dTdWNjZXNzZnVsTXNnID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBpbnRpYWxpemVkOwotCi0vLwlwcml2YXRlIE9iamVjdCBVSUNvbnRleHQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgU3luY2hyb25pemVDb21tYW5kIHRoYXQgdXNlIHRoZSBwcm9jZXNzIGRlZmF1bHQKLQkgKiBjb25maWd1cmF0aW9uIHRvIHN5bmNocm9uaXplIGFsbCB0aGUgc3luY2hyb25pemFibGUgZmVhdHVyZXMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBCcmVha2Rvd25FbGVtZW50IG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVDb21tYW5kKFN0cmluZyBsYWJlbCwgQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQlzdXBlcihsYWJlbCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFN5bmNocm9uaXplQ29tbWFuZCB0aGF0IHVzZSB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiAKLQkgKiBhbmQgbGlzdCBvZiBzeW5jaHJvbml6YWJsZSBmZWF0dXJlcyB0byBzeW5jaHJvbml6ZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEBwYXJhbSBjb25maWcgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gc3luY2hGZWF0dXJlcyB0aGUgc3luY2hyb25pemFibGUgZmVhdHVyZXMKLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVDb21tYW5kKENvbGxlY3Rpb24gZWxlbWVudHMsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTZXQgc3luY2hGZWF0dXJlcywgYm9vbGVhbiBzaG93U3VjY2Vzc2Z1bE1zZykgewotCQlzdXBlcihMaWJyYXJ5RWRpdFJlc291cmNlcy5BdXRvU3luY2hyb25pemVDb21tYW5kX2xhYmVsKTsgCi0JCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCXRoaXMuc3luY2hGZWF0dXJlcyA9IHN5bmNoRmVhdHVyZXM7Ci0JCXRoaXMuc2hvd1N1Y2Nlc3NmdWxNc2cgPSBzaG93U3VjY2Vzc2Z1bE1zZzsgCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCWlmKGNvbmZpZ3VyYXRvciAhPSBudWxsKSB7Ci0JCQljb25maWd1cmF0b3Iuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFN5bmNocm9uaXphdGlvbkZlYXR1cmVzKFNldCBzeW5jaEZlYXR1cmVzKSB7Ci0JCXRoaXMuc3luY2hGZWF0dXJlcyA9IHN5bmNoRmVhdHVyZXM7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBkb0luaXRpYWxpemUoKSB7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZGVsZXRlQ29tbWFuZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWRlbGV0ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWFjdGl2aXRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWFkZFRvRGVsZXRlTGlzdChlbGVtZW50LCBkZWxldGVMaXN0KTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWFjdGl2aXRpZXMuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWVsZW1lbnRzLnJlbW92ZUFsbChkZWxldGVMaXN0KTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKERlc2NyaXB0b3IpIG9iamVjdDsKLQkJCQlpZiAoZGVzY3JpcHRvci5nZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKS5ib29sZWFuVmFsdWUoKQotCQkJCQkJJiYgIWRlbGV0ZUxpc3QuY29udGFpbnMoZGVzY3JpcHRvcikpIHsKLQkJCQkJaWYoZGVzY3JpcHRvci5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7CQkJCQkJCi0JCQkJCQkvLyBkZXNjcmlwdG9yIGlzIHVzZWQgYnkgVGVhbVByb2ZpbGUgdG8gcmVwcmVzZW50IGEgcm9sZSBvciB1c2VkIGJ5IGEgZGVsaXZlcmFibGUgZGVzY3JpcHRvciB0bwotCQkJCQkJLy8gcmVwcmVzZW50IGEgZGVsaXZlcmFibGUgcGFydAotCQkJCQkJLy8KLQkJCQkJCWlmKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IgJiYgKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpZGVzY3JpcHRvcikuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJCQkJYXBwZW5kKG5ldyBTeW5jaHJvbml6ZURlbGl2ZXJhYmxlRGVzY3JpcHRvckNvbW1hbmQoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZGVzY3JpcHRvciwgc3luY2hGZWF0dXJlcywgY29uZmlnKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlhcHBlbmQobmV3IEJhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZChkZXNjcmlwdG9yLCBzeW5jaEZlYXR1cmVzLCBjb25maWcpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUFjdGl2aXR5IGFjdCA9IGRlc2NyaXB0b3IuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCQlUYXNrIHRhc2sgPSAoKFRhc2tEZXNjcmlwdG9yKSBvYmplY3QpLmdldFRhc2soKTsKLQkJCQkJCQlpZiAodGFzayAhPSBudWxsKSB7Ci0JCQkJCQkJCWFwcGVuZChuZXcgV0JTRHJvcENvbW1hbmQoYWN0LCBDb2xsZWN0aW9ucwotCQkJCQkJCQkJCS5zaW5nbGV0b25MaXN0KHRhc2spLCBjb25maWcsIHN5bmNoRmVhdHVyZXMpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJUm9sZSByb2xlID0gKChSb2xlRGVzY3JpcHRvcikgb2JqZWN0KS5nZXRSb2xlKCk7Ci0JCQkJCQkJaWYgKHJvbGUgIT0gbnVsbCkgewotCQkJCQkJCQlhcHBlbmQobmV3IE9CU0Ryb3BDb21tYW5kKGFjdCwgQ29sbGVjdGlvbnMKLQkJCQkJCQkJCQkuc2luZ2xldG9uTGlzdChyb2xlKSwgY29uZmlnLCBzeW5jaEZlYXR1cmVzLCBjb25maWd1cmF0b3IpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQkJCVdvcmtQcm9kdWN0IHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iamVjdCkKLQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQkJCQlpZiAod3AgIT0gbnVsbCkgewotCQkJCQkJCQlhcHBlbmQobmV3IFBCU0Ryb3BDb21tYW5kKGFjdCwgQ29sbGVjdGlvbnMKLQkJCQkJCQkJCQkuc2luZ2xldG9uTGlzdCh3cCksIGNvbmZpZywgc3luY2hGZWF0dXJlcywgY29uZmlndXJhdG9yKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWFwcGVuZENvbW1hbmRzKChBY3Rpdml0eSkgb2JqZWN0KTsKLQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQlhcHBlbmRDb21tYW5kcygoVGVhbVByb2ZpbGUpb2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIWRlbGV0ZUxpc3QuaXNFbXB0eSgpIHx8ICFjb21tYW5kTGlzdC5pc0VtcHR5KCkgfHwgIWFjdGl2aXRpZXMuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGluaXRpbGl6ZSgpIHsKLQkJcmV0dXJuIGludGlhbGl6ZWQgPSBkb0luaXRpYWxpemUoKTsJCQotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbnRpYWxpemVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnRpYWxpemVkKCkgewotCQlyZXR1cm4gaW50aWFsaXplZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kQ29tbWFuZHMoQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJTGlzdCB0YXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCByb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB3b3JrUHJvZHVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgYWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQlpZiAoKChEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCQkJCQkJLmJvb2xlYW5WYWx1ZSgpCi0JCQkJCQkmJiAhZGVsZXRlTGlzdC5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCQlUYXNrIHRhc2sgPSAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRUYXNrKCk7Ci0JCQkJCQlpZiAodGFzayAhPSBudWxsKSB7Ci0JCQkJCQkJdGFza3MuYWRkKHRhc2spOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQkJUm9sZSByb2xlID0gKChSb2xlRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0Um9sZSgpOwotCQkJCQkJaWYgKHJvbGUgIT0gbnVsbCkgewotCQkJCQkJCXJvbGVzLmFkZChyb2xlKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCQlXb3JrUHJvZHVjdCB3cCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQkJCWlmICh3cCAhPSBudWxsKSB7Ci0JCQkJCQkJd29ya1Byb2R1Y3RzLmFkZCh3cCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWFjdGl2aXRpZXMuYWRkKGVsZW1lbnQpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQlhcHBlbmRDb21tYW5kcygoVGVhbVByb2ZpbGUpZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCF0YXNrcy5pc0VtcHR5KCkpIHsKLQkJCWFwcGVuZChuZXcgV0JTRHJvcENvbW1hbmQoYWN0aXZpdHksIHRhc2tzLCBjb25maWcsIHN5bmNoRmVhdHVyZXMpKTsKLQkJfQotCQlpZiAoIXJvbGVzLmlzRW1wdHkoKSkgewotCQkJYXBwZW5kKG5ldyBPQlNEcm9wQ29tbWFuZChhY3Rpdml0eSwgcm9sZXMsIGNvbmZpZywgc3luY2hGZWF0dXJlcywgY29uZmlndXJhdG9yKSk7Ci0JCX0KLQkJaWYgKCF3b3JrUHJvZHVjdHMuaXNFbXB0eSgpKSB7Ci0JCQlhcHBlbmQobmV3IFBCU0Ryb3BDb21tYW5kKGFjdGl2aXR5LCB3b3JrUHJvZHVjdHMsIGNvbmZpZywKLQkJCQkJc3luY2hGZWF0dXJlcywgY29uZmlndXJhdG9yKSk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aXZpdGllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWFwcGVuZENvbW1hbmRzKChBY3Rpdml0eSkgaXRlci5uZXh0KCkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhcHBlbmRDb21tYW5kcyhUZWFtUHJvZmlsZSB0ZWFtKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IodGVhbSwgZmFsc2UpIHsKLQotCQkJLyoqCi0JCQkgKiAKLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQkJVGVhbVByb2ZpbGUgdGVhbSA9ICgoVGVhbVByb2ZpbGUpb2JqZWN0KTsKLQkJCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QodGVhbS5nZXRTdWJUZWFtKCkpOwotCQkJCQljaGlsZHJlbi5hZGRBbGwodGVhbS5nZXRUZWFtUm9sZXMoKSk7Ci0JCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQotCQkJLy8gc3luY2ggb25seSBvd24gcm9sZSBkZXNjcmlwdG9yIG9mIHRlYW0gcHJvZmlsZQotCQkJLy8KLQkJCWlmKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yICYmICgoUm9sZURlc2NyaXB0b3Ipb2JqKS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJYXBwZW5kKG5ldyBCYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQoKERlc2NyaXB0b3IpIG9iaiwgc3luY2hGZWF0dXJlcywgY29uZmlnKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCUhhc2hTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21tYW5kTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCBjbWQgPSAoSVJlc291cmNlQXdhcmVDb21tYW5kKSBpdGVyLm5leHQoKTsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbChjbWQuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQkKLS8vCXB1YmxpYyB2b2lkIHNldFVJQ29udGV4dChPYmplY3QgVUlDb250ZXh0KSB7Ci0vLwkJdGhpcy5VSUNvbnRleHQgPSBVSUNvbnRleHQ7Ci0vLwl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gZGVsZXRlIGFsbCBkZXNjcmlwdG9ycyB3aG9zZSBsaW5rZWQgZWxlbWVudCBhcmUgbm8gbG9uZ2VyIGluIHRoZQotCQkvLyBjb25maWd1cmF0aW9uCi0JCS8vCi0JCWlmICghZGVsZXRlTGlzdC5pc0VtcHR5KCkpIHsKLQkJCUNvbW1hbmQgY21kID0gZGVsZXRlKGRlbGV0ZUxpc3QpOwotCQkJaWYgKGNtZCAhPSBudWxsKSB7Ci0JCQkJZGVsZXRlQ29tbWFuZExpc3QuYWRkKGNtZCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWFib3J0ZWQpIHsKLS8vCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLS8vCi0vLwkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotLy8JCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotLy8JCQkJCXByZUV4ZWNTdWNjZXNzZnVsID0gcHJlRXhlY3V0ZSgpOwotLy8JCQkJfQotLy8KLS8vCQkJfTsKLS8vCQkJCQkJCi0vLwkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIGZhbHNlLCBudWxsKTsKLS8vCi0vLwkJCWlmIChwcmVFeGVjU3VjY2Vzc2Z1bCkgewotLy8JCQkJdHJ5IHsKLS8vCQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgbmV3IFJ1bm5hYmxlKCkgewotLy8JCQkJCQkKLS8vCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotLy8JCQkJCQkJc3VwZXJSZWRvKCk7Ci0vLwkJCQkJCQlzdWNjZXNzZnVsID0gdHJ1ZTsKLS8vCQkJCQkJfQotLy8JCQkJCQkKLS8vCQkJCQl9KTsKLS8vCQkJCX0KLS8vCQkJCWNhdGNoKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotLy8JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoZ2V0TGFiZWwoKSwgZS50b1N0cmluZygpKTsKLS8vCQkJCX0KLS8vCQkJfQotCQkJCi0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJcHJlRXhlY1N1Y2Nlc3NmdWwgPSBwcmVFeGVjdXRlKCk7Ci0JCQkJCWlmKHByZUV4ZWN1dGUoKSkgewotCQkJCQkJc3VwZXJSZWRvKCk7Ci0JCQkJCQlzdWNjZXNzZnVsID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfTsKLQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5JblVJKHJ1bm5hYmxlLCBnZXRMYWJlbCgpKTsKLQkJCQotCQkJaWYgKHN1Y2Nlc3NmdWwpIHsJCQkJCi0JCQkJaWYoIWFjdGl2aXRpZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCWlmKGRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCA9PSBudWxsKSB7Ci0JCQkJCQlkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgPSBuZXcgRGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKGVsZW1lbnRzLCB0cnVlLCBkZWxldGVMaXN0KSB7Ci0JCQkJCQkJCi0JCQkJCQkJcHJvdGVjdGVkIENvbW1hbmQgZGVsZXRlKExpc3QgZWxlbWVudHMpIHsKLQkJCQkJCQkJcmV0dXJuIFN5bmNocm9uaXplQ29tbWFuZC50aGlzLmRlbGV0ZShlbGVtZW50cyk7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJfTsKLQkJCQkJCWRlbGV0ZUNvbW1hbmRMaXN0LmFkZChkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQpOwotCQkJCQl9Ci0JCQkJCWRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5leGVjdXRlKCk7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChzaG93U3VjY2Vzc2Z1bE1zZykgewotCQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd0luZm8oCi0JCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5TeW5jaHJvbml6ZUNvbXBsZXRlRGlhbG9nX1RpdGxlLAotCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuQXV0b1N5bmNocm9uaXplQ29tbWFuZF9zdWNlc3NmdWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdXBlclJlZG8oKSB7Ci0JCXN1cGVyLnJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3VjZXNzZnVsKCkgewotCQlyZXR1cm4gc3VjY2Vzc2Z1bDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVFeGVjdXRlKCkgewotCQlmb3IgKExpc3RJdGVyYXRvciBjb21tYW5kcyA9IGNvbW1hbmRMaXN0Lmxpc3RJdGVyYXRvcigpOyBjb21tYW5kcwotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY29tbWFuZCA9IGNvbW1hbmRzLm5leHQoKTsKLQkJCWlmKGNvbW1hbmQgaW5zdGFuY2VvZiBCU0Ryb3BDb21tYW5kICYmICEoKEJTRHJvcENvbW1hbmQpY29tbWFuZCkucHJlRXhlY3V0ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQkvLyBiZSBwb2xpdGUgdG8gb3RoZXIgdGhyZWFkcyAobm8gZWZmZWN0IG9uIHNvbWUgcGxhdGZvcm1zKQotCQkJLy8KLQkJCVRocmVhZC55aWVsZCgpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIHNwZWNpZmllZCBlbGVtZW50cwotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEByZXR1cm4gdGhlIGV4ZWN1dGVkIGNvbW1hbmQgdGhhdCBkZWxldGVkIHRoZSBnaXZlbiBlbGVtZW50cwotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGRlbGV0ZShMaXN0IGVsZW1lbnRzKSB7Ci0JCUVkaXRpbmdEb21haW4gZG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCW5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJQ29tbWFuZCBjbWQgPSBuZXcgUHJvY2Vzc0VsZW1lbnREZWxldGVDb21tYW5kKFJlbW92ZUNvbW1hbmQuY3JlYXRlKGRvbWFpbiwKLQkJCQllbGVtZW50cyksIGVsZW1lbnRzKTsKLQkJY21kLmV4ZWN1dGUoKTsKLQkJcmV0dXJuIGNtZDsKLQl9Ci0KLQlwcml2YXRlIElDb25maWd1cmF0b3IgZ2V0Q29uZmlndXJhdG9yKCkgewotCQlpZiAoY29uZmlndXJhdG9yID09IG51bGwpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gdGhpcy5jb25maWc7Ci0JCQlpZihjb25maWcgPT0gbnVsbCkgewotCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudHMKLQkJCQkJCS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQkJY29uZmlnID0gcHJvYy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJfQotCQkJY29uZmlndXJhdG9yID0gUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRvckZhY3RvcnkoKQotCQkJCQkuY3JlYXRlQ29uZmlndXJhdG9yKGNvbmZpZyk7Ci0JCX0KLQkJcmV0dXJuIGNvbmZpZ3VyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBkZWxldGVMaXN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRvRGVsZXRlTGlzdChPYmplY3QgZWxlbWVudCwgTGlzdCBkZWxldGVMaXN0KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJaWYgKCFnZXRDb25maWd1cmF0b3IoKS5hY2NlcHQoZWxlbWVudCkpIHsKLQkJCQlkZWxldGVMaXN0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQWN0aXZpdHkpIGVsZW1lbnQpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWFkZFRvRGVsZXRlTGlzdChpdGVyLm5leHQoKSwgZGVsZXRlTGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3VwZXJVbmRvKCkgewotCQlzdXBlci51bmRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoIWRlbGV0ZUNvbW1hbmRMaXN0LmlzRW1wdHkoKSkgewotCQkJCQlmb3IgKExpc3RJdGVyYXRvciBjb21tYW5kcyA9IGRlbGV0ZUNvbW1hbmRMaXN0Ci0JCQkJCQkJLmxpc3RJdGVyYXRvcihkZWxldGVDb21tYW5kTGlzdC5zaXplKCkpOyBjb21tYW5kcwotCQkJCQkJCS5oYXNQcmV2aW91cygpOykgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlDb21tYW5kIGNvbW1hbmQgPSAoQ29tbWFuZCkgY29tbWFuZHMucHJldmlvdXMoKTsKLQkJCQkJCQljb21tYW5kLnVuZG8oKTsKLQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCQkJLy8gU2tpcCBvdmVyIHRoZSBjb21tYW5kIHRoYXQgdGhyZXcgdGhlIGV4Y2VwdGlvbi4KLQkJCQkJCQkvLwotCQkJCQkJCWNvbW1hbmRzLm5leHQoKTsKLQotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCS8vIEl0ZXJhdGUgZm9yd2FyZCBvdmVyIHRoZSB1bmRvbmUgY29tbWFuZHMgdG8KLQkJCQkJCQkJLy8gcmVkbyB0aGVtLgotCQkJCQkJCQkvLwotCQkJCQkJCQl3aGlsZSAoY29tbWFuZHMuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJCQlDb21tYW5kIGNvbW1hbmQgPSAoQ29tbWFuZCkgY29tbWFuZHMubmV4dCgpOwotCQkJCQkJCQkJY29tbWFuZC5yZWRvKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIG5lc3RlZEV4Y2VwdGlvbikgewotCQkJCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkubG9nKG5ldyBXcmFwcGVkRXhjZXB0aW9uKAotCQkJCQkJCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9JZ25vcmVFeGNlcHRpb25fZXhjZXB0aW9uIiksIG5lc3RlZEV4Y2VwdGlvbikuZmlsbEluU3RhY2tUcmFjZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQotCQkJCQkJCXRocm93IGV4Y2VwdGlvbjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCXN1cGVyVW5kbygpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCNwcmVwYXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihhY3Rpdml0aWVzICE9IG51bGwpIHsKLQkJCWFjdGl2aXRpZXMuY2xlYXIoKTsKLQkJfQotCQlpZihkZWxldGVDb21tYW5kTGlzdCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZWxldGVDb21tYW5kTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlDb21tYW5kIGNtZCA9IChDb21tYW5kKSBpdGVyLm5leHQoKTsKLQkJCQljbWQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCWlmKGRlbGV0ZUxpc3QgIT0gbnVsbCkgewotCQkJZGVsZXRlTGlzdC5jbGVhcigpOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9TeW5jaHJvbml6ZURlbGl2ZXJhYmxlRGVzY3JpcHRvckNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvU3luY2hyb25pemVEZWxpdmVyYWJsZURlc2NyaXB0b3JDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3NzVlN2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9TeW5jaHJvbml6ZURlbGl2ZXJhYmxlRGVzY3JpcHRvckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQ29tbWFuZCB0byBzeW5jaHJvbml6ZSBhdHRyaWJ1dGVzIGFuZCBkZWxpdmVyYWJsZSBwYXJ0cyBvZiBhIGRlbGl2ZXJhYmxlIGRlc2NyaXB0b3IKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBGZWIgOSwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplRGVsaXZlcmFibGVEZXNjcmlwdG9yQ29tbWFuZCBleHRlbmRzCi0JCUJhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZCB7Ci0JCi0JcHJpdmF0ZSBTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2g7Ci0JcHJpdmF0ZSBNYXAgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzOwotCXByaXZhdGUgRGVzY3JpcHRvclVwZGF0ZUJhdGNoQ29tbWFuZCAgdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZDsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqIEBwYXJhbSBzeW5jaEZlYXR1cmVzCi0JICogQHBhcmFtIGNvbmZpZwotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZURlbGl2ZXJhYmxlRGVzY3JpcHRvckNvbW1hbmQoV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0JCQlTZXQgc3luY2hGZWF0dXJlcywgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJc3VwZXIoZGVzY3JpcHRvciwgc3luY2hGZWF0dXJlcywgY29uZmlnKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gdXBkYXRlIGxpbmtlZCBlbGVtZW50IGlmIG5lZWRlZAotCQkvLyBzeW5jaHJvbml6ZSBhdHRyaWJ1dGVzCi0JCS8vCi0JCXN1cGVyLmV4ZWN1dGUoKTsKLQkJCi0JCWlmKGRlc2NyaXB0b3JzVG9SZWZyZXNoID09IG51bGwpIHsKLQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoID0gbmV3IEhhc2hTZXQoKTsKLQkJfQotCQllbHNlIHsKLQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLmNsZWFyKCk7Ci0JCX0KLQkJaWYod3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzID09IG51bGwpIHsKLQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuY2xlYXIoKTsKLQkJfQotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZGVzY3JpcHRvcjsKLQkJUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZURlbGl2ZXJhYmxlUGFydHMod3BkLCAoRGVsaXZlcmFibGUpd3BkLmdldFdvcmtQcm9kdWN0KCksIGNvbmZpZywKLQkJCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsIGRlc2NyaXB0b3JzVG9SZWZyZXNoKTsKLQkJCi0JCWlmKCF3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuaXNFbXB0eSgpIHx8ICFkZXNjcmlwdG9yc1RvUmVmcmVzaC5pc0VtcHR5KCkpIHsKLQkJCWlmKHVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQgPT0gbnVsbCkgewotCQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQgPSBuZXcgRGVzY3JpcHRvclVwZGF0ZUJhdGNoQ29tbWFuZCh0cnVlLCBzeW5jaEZlYXR1cmVzLCBjb25maWcpOwotCQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQuc2V0RGVzY3JpcHRvcnNUb1JlZnJlc2goZGVzY3JpcHRvcnNUb1JlZnJlc2gpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZC5nZXRPYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAoKS5jbGVhcigpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3Qgd3BEZXNjID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZC5nZXRPYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAoKS5wdXQod3BEZXNjLCAKLQkJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpLCBlbnRyeS5nZXRWYWx1ZSgpKSk7Ci0JCQl9Ci0JCQkKLQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQuZXhlY3V0ZSgpOwotCQl9CQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQmFzaWNTeW5jaHJvbml6ZURlc2NyaXB0b3JDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmKHVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQgIT0gbnVsbCkgewotCQkJdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZC51bmRvKCk7Ci0JCX0KLQkJCi0JCXN1cGVyLnVuZG8oKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJCi0JCWlmKHVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQgIT0gbnVsbCkgewotCQkJdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllNzgzNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9VcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gRmViIDEwLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbjsKLQlwcml2YXRlIENvbGxlY3Rpb24gZWxlbWVudHM7Ci0JcHJpdmF0ZSBIYXNoU2V0IGluaGVyaXRlZEVsZW1lbnRzOwotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGFmZmVjdGVkT2JqZWN0czsKLQlwcml2YXRlIEhhc2hNYXAgb2JqZWN0VG9TdXBwcmVzc2lvblN0YXRlTWFwOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VDb21tYW5kKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqLwotCXB1YmxpYyBVcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQ29tbWFuZChTdHJpbmcgbGFiZWwsIENvbGxlY3Rpb24gZWxlbWVudHMsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQlzdXBlcihsYWJlbCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCQl0aGlzLnN1cHByZXNzaW9uID0gc3VwcHJlc3Npb247Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoYWZmZWN0ZWRPYmplY3RzICE9IG51bGwpIHsKLQkJCWFmZmVjdGVkT2JqZWN0cy5jbGVhcigpOwotCQkJYWZmZWN0ZWRPYmplY3RzID0gbnVsbDsKLQkJfQotCQkKLQkJaWYoaW5oZXJpdGVkRWxlbWVudHMgIT0gbnVsbCkgewotCQkJaW5oZXJpdGVkRWxlbWVudHMuY2xlYXIoKTsKLQkJCWluaGVyaXRlZEVsZW1lbnRzID0gbnVsbDsKLQkJfQotCQkKLQkJaWYob2JqZWN0VG9TdXBwcmVzc2lvblN0YXRlTWFwICE9IG51bGwpIHsKLQkJCW9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcC5jbGVhcigpOwotCQkJb2JqZWN0VG9TdXBwcmVzc2lvblN0YXRlTWFwID0gbnVsbDsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IHN1cHByZXNzaW9uLmdldFByb2Nlc3MoKS5lUmVzb3VyY2UoKTsKLQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocmVzb3VyY2UpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNnZXRBZmZlY3RlZE9iamVjdHMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJaWYoYWZmZWN0ZWRPYmplY3RzID09IG51bGwpIHsKLQkJCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBhZmZlY3RlZE9iamVjdHM7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlpZihhZmZlY3RlZE9iamVjdHMgPT0gbnVsbCkgewotCQkJYWZmZWN0ZWRPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWVsc2UgewotCQkJYWZmZWN0ZWRPYmplY3RzLmNsZWFyKCk7Ci0JCX0KLQkJCi0JCWlmKG9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcCA9PSBudWxsKSB7Ci0JCQlvYmplY3RUb1N1cHByZXNzaW9uU3RhdGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCWVsc2UgewotCQkJb2JqZWN0VG9TdXBwcmVzc2lvblN0YXRlTWFwLmNsZWFyKCk7Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldEluaGVyaXRlZEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBpdGVyLm5leHQoKTsKLQkJCWJvb2xlYW4gd2FzU3VwcHJlc3NlZCA9IHN1cHByZXNzaW9uLmlzSW5TdXBwcmVzc2VkTGlzdCh3cmFwcGVyKTsKLQkJCWlmKHN1cHByZXNzaW9uLnVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2Uod3JhcHBlcikpIHsKLQkJCQlhZmZlY3RlZE9iamVjdHMuYWRkKHdyYXBwZXIpOwotCQkJCW9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcC5wdXQod3JhcHBlciwgQm9vbGVhbi52YWx1ZU9mKHdhc1N1cHByZXNzZWQpKTsKLQkJCX0JCQkJCQkJCQkJCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewkJCi0JCWV4ZWN1dGUoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZihvYmplY3RUb1N1cHByZXNzaW9uU3RhdGVNYXAgIT0gbnVsbCAmJiAhb2JqZWN0VG9TdXBwcmVzc2lvblN0YXRlTWFwLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0VG9TdXBwcmVzc2lvblN0YXRlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJQm9vbGVhbiBzdXBwcmVzc2VkID0gKEJvb2xlYW4pIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJaWYoc3VwcHJlc3NlZC5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlzdXBwcmVzc2lvbi5zdXBwcmVzcyhDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGVudHJ5LmdldEtleSgpKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzdXBwcmVzc2lvbi5yZXZlYWwoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChlbnRyeS5nZXRLZXkoKSkpOwotCQkJCX0KLQkJCX0KLQkJCWFmZmVjdGVkT2JqZWN0cy5jbGVhcigpOwotCQkJYWZmZWN0ZWRPYmplY3RzLmFkZEFsbChlbGVtZW50cyk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNwcmVwYXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0SW5oZXJpdGVkRWxlbWVudHMoKSB7Ci0JCWlmKGluaGVyaXRlZEVsZW1lbnRzID09IG51bGwpIHsKLQkJCWluaGVyaXRlZEVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciB0cmVlSXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihhZGFwdGVyRmFjdG9yeSwgZWxlbWVudCk7IHRyZWVJdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGUgPSB0cmVlSXRlci5uZXh0KCk7Ci0JCQkJCWlmKFByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKGUpKSB7Ci0JCQkJCQlpbmhlcml0ZWRFbGVtZW50cy5hZGQoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluaGVyaXRlZEVsZW1lbnRzOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1ZhcnlBY3Rpdml0eUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvVmFyeUFjdGl2aXR5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZTQ1OWQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvVmFyeUFjdGl2aXR5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDEwLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYXJ5QWN0aXZpdHlDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyOwotCi0JcHJpdmF0ZSBQcm9jZXNzIHByb2M7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVkQWN0aXZpdGllczsKLQotCXB1YmxpYyBWYXJ5QWN0aXZpdHlDb21tYW5kKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKLQkJcHJvYyA9IChQcm9jZXNzKSB3cmFwcGVyLmdldFRvcEl0ZW0oKTsKLQl9Ci0KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgZ2V0V3JhcHBlcigpIHsKLQkJcmV0dXJuIHdyYXBwZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChwcm9jLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHByb2MuZVJlc291cmNlKCkpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNwcmVwYXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmIChjcmVhdGVkQWN0aXZpdGllcyA9PSBudWxsKSB7Ci0JCQljcmVhdGVkQWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfSBlbHNlIHsKLQkJCWNyZWF0ZWRBY3Rpdml0aWVzLmNsZWFyKCk7Ci0JCX0KLQotCQlkb1ZhcnkoKTsKLQotCQlMaXN0IGxpc3RlbmVycyA9IFByb3ZpZGVycwotCQkJCS5nZXRDb21tYW5kTGlzdGVuZXJzKFZhcnlBY3Rpdml0eUNvbW1hbmQuY2xhc3MpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJQ29tbWFuZExpc3RlbmVyIGxpc3RlbmVyID0gKElDb21tYW5kTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJCWxpc3RlbmVyLm5vdGlmeUV4ZWN1dGVkKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9WYXJ5KCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCS8vIGZpbmQgdGhlIG5ldyB3cmFwcGVyCi0JCS8vCi0JCU9iamVjdCBvd25lciA9IHdyYXBwZXIuZ2V0T3duZXIoKTsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGlwID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgd3JhcHBlci5nZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KG93bmVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpcC5nZXRDaGlsZHJlbihvd25lcikuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsJCQotCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciAmJgotCQkJCQkoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWNoaWxkKS5nZXRWYWx1ZSgpID09IHdyYXBwZXIuZ2V0VmFsdWUoKSkgewotCQkJCXdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGNoaWxkOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlleGVjdXRlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCUxpc3QgbGlzdGVuZXJzID0gUHJvdmlkZXJzCi0JCQkJLmdldENvbW1hbmRMaXN0ZW5lcnMoVmFyeUFjdGl2aXR5Q29tbWFuZC5jbGFzcyk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlDb21tYW5kTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUNvbW1hbmRMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQkJbGlzdGVuZXIucHJlVW5kbyh0aGlzKTsKLQkJCX0KLQkJfQotCi0JCWlmICghY3JlYXRlZEFjdGl2aXRpZXMuaXNFbXB0eSgpKSB7Ci0JCQlyZXN0b3JlT3JkZXIoKTsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgY3JlYXRlZEFjdGl2aXRpZXMuZ2V0KDApOwotCQkJYWN0LnNldFN1cGVyQWN0aXZpdGllcyhudWxsKTsKLQkJCWNyZWF0ZWRBY3Rpdml0aWVzLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlcyB0aGUgb3JkZXIgb2YgdGhlIHNpYmxpbmdzIG9mIHRoZSB3cmFwcGVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZU9yZGVyKCkgewotCQlBY3Rpdml0eSB2YXJpZWRBY3QgPSAoQWN0aXZpdHkpIGNyZWF0ZWRBY3Rpdml0aWVzLmdldChjcmVhdGVkQWN0aXZpdGllcy5zaXplKCkgLSAxKTsKLQkJQnJlYWtkb3duRWxlbWVudCBiZSA9IChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJQnJlYWtkb3duRWxlbWVudCBwcmV2ID0gdmFyaWVkQWN0LmdldFByZXNlbnRlZEJlZm9yZSgpOwotCQlpZihwcmV2ICE9IG51bGwgJiYgcHJvYyA9PSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MocHJldikpIHsKLQkJCXByZXYuc2V0UHJlc2VudGVkQWZ0ZXIoYmUpOwotCQl9Ci0JCUJyZWFrZG93bkVsZW1lbnQgbmV4dCA9IHZhcmllZEFjdC5nZXRQcmVzZW50ZWRBZnRlcigpOwotCQlpZihuZXh0ICE9IG51bGwgJiYgcHJvYyA9PSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MobmV4dCkpIHsKLQkJCW5leHQuc2V0UHJlc2VudGVkQmVmb3JlKGJlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNnZXRSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIGNyZWF0ZWRBY3Rpdml0aWVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvV0JTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1dCU0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMWMxZDU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvV0JTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLQotLyoqCi0gKiBEcmFnIGFuZCBkcm9wIGNvbW1hbmQgdG8gZHJvcCB0YXNrcyBpbiBXQlMgc3RydWN0dXJlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBXQlNEcmFnQW5kRHJvcENvbW1hbmQgZXh0ZW5kcyBCU0RyYWdBbmREcm9wQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIG9wZXJhdGlvbnMKLQkgKiBAcGFyYW0gb3BlcmF0aW9uCi0JICogQHBhcmFtIGNvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgV0JTRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBPYmplY3Qgb3duZXIsCi0JCQlmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0RyYWdBbmREcm9wQ29tbWFuZCNhY2NlcHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIldCU0RyYWdBbmREcm9wQ29tbWFuZC5hY2NlcHQoKTogb2JqPSIrb2JqKTsKLQotCQlpZihvYmogaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQlpZihvd25lciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJcmV0dXJuIFByb2Nlc3NDb21tYW5kVXRpbC5nZXRWYWxpZERlc2NyaXB0b3Iob2JqLCAoQWN0aXZpdHkpIG93bmVyLAotCQkJCQkJKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pZG9tYWluKS5nZXRBZGFwdGVyRmFjdG9yeSgpKSA9PSBudWxsOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0RyYWdBbmREcm9wQ29tbWFuZCNjcmVhdGVEcm9wQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRHJvcENvbW1hbmQoT2JqZWN0IG93bmVyLCBMaXN0IGRyb3BTcmMpIHsKLQkJcmV0dXJuIG5ldyBXQlNEcm9wQ29tbWFuZCgoQWN0aXZpdHkpIG93bmVyLCBkcm9wU3JjKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvV0JTRHJvcENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvV0JTRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTZmMDYzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1dCU0Ryb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JTmVzdGVkQ29tbWFuZFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5VbmlxdWVOYW1lUE5hbWVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQ29tbWFuZCB0byBkcmFwIGFuZCBkcm9wIHRhc2tzIG9udG8gYW4gYWN0aXZpdHkgaW4gd29yayBicmVha2Rvd24gc3RydWN0dXJlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdCU0Ryb3BDb21tYW5kIGV4dGVuZHMgQlNEcm9wQ29tbWFuZCB7Ci0JcHJpdmF0ZSBBcnJheUxpc3Qgcm9sZURlc2NMaXN0OwotCi0JcHJpdmF0ZSBBcnJheUxpc3Qgd3BEZXNjTGlzdDsKLQotCXByaXZhdGUgSGFzaE1hcCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHM7Ci0KLQlwcml2YXRlIEhhc2hNYXAgd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXA7Ci0KLQlwcml2YXRlIEhhc2hNYXAgcm9sZURlc2NUZWFtUHJvZmlsZU1hcDsKLQkKLQlwcml2YXRlIElFeGVjdXRvciBleGVjdXRvcjsKLQotCXByaXZhdGUgY2xhc3MgRXhlY3V0b3IgaW1wbGVtZW50cyBJRXhlY3V0b3IgewotCi0JCXB1YmxpYyBib29sZWFuIHByZUV4ZWN1dGUoKSB7Ci0JCQl0YXNrRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlyb2xlRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl3cERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzID0gbmV3IEhhc2hNYXAoKTsKLQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCVNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaCA9IHN5bmNocm9uaXplID8gYmF0Y2hDb21tYW5kLmdldERlc2NyaXB0b3JzVG9SZWZyZXNoKCkgOiBudWxsOwotCi0JCQlMaXN0IGJlcyA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQlVbmlxdWVOYW1lUE5hbWVIYW5kbGVyIHVuaXF1ZU5hbWVzSGFuZGxlciA9IG5ldyBVbmlxdWVOYW1lUE5hbWVIYW5kbGVyKGJlcywgYmVzKTsKLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkcm9wRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgZHJvcEVsZW1lbnRzLmdldChpKTsKLQkJCQlUYXNrRGVzY3JpcHRvciBkZXNjID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKHRhc2ssCi0JCQkJCQlhY3Rpdml0eSwgcm9sZURlc2NMaXN0LCB3cERlc2NMaXN0LAotCQkJCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLAotCQkJCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAsIGRlc2NyaXB0b3JzVG9SZWZyZXNoLAotCQkJCQkJYmF0Y2hDb21tYW5kLmdldE9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCgpLCAKLQkJCQkJCVdCU0Ryb3BDb21tYW5kLnRoaXMuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLAotCQkJCQkJc3luY2hGZWF0dXJlcyk7Ci0JCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQl1bmlxdWVOYW1lc0hhbmRsZXIuZW5zdXJlVW5pcXVlKGRlc2MpOwotCQkJCQl0YXNrRGVzY0xpc3QuYWRkKGRlc2MpOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuICF0YXNrRGVzY0xpc3QuaXNFbXB0eSgpCi0JCQkJCXx8ICFyb2xlRGVzY0xpc3QuaXNFbXB0eSgpCi0JCQkJCXx8ICF3cERlc2NMaXN0LmlzRW1wdHkoKQotCQkJCQl8fCAhd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmlzRW1wdHkoKQotCQkJCQl8fCAhd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuaXNFbXB0eSgpCi0JCQkJCXx8IGJhdGNoQ29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkb0V4Y2VjdXRlKCkgewotCQkJLy8gYXV0b21hdGljYWxseSBhZGQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8gZGVsaXZlcmFibGUgcGFydAotCQkJLy8KLQkJCWlmICghd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuZW50cnlTZXQoKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlbGl2ZXJhYmxlID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZW50cnkKLQkJCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKCFkZWxpdmVyYWJsZS5nZXREZWxpdmVyYWJsZVBhcnRzKCkuY29udGFpbnMoCi0JCQkJCQkJZW50cnkuZ2V0S2V5KCkpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWRlbGl2ZXJhYmxlLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGQoCi0JCQkJCQkJCQllbnRyeS5nZXRLZXkoKSk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkubG9nKCJXQlNEcm9wQ29tbWFuZDo6ZG9FeGVjdXRlIC0gQWRkaW5nIGRlbGl2ZXJhYmxlIHBhcnQgdG8gZGVsaXZlcmFibGUiICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gYWRkIHRhc2sgZGVzY3JpcHRvcnMKLQkJCS8vCi0JCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbCh0YXNrRGVzY0xpc3QpOwotCi0JCQkvLyBhZGQgcm9sZSBkZXNjcmlwdG9ycwotCQkJLy8KLQkJCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKHJvbGVEZXNjTGlzdCk7Ci0KLQkJCS8vIGFkZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJCS8vCi0JCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbCh3cERlc2NMaXN0KTsKLQotCQkJLy8gYWRkIGRlbGl2ZXJhYmxlIHBhcnRzIHRvIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJCS8vCi0JCQlpZiAoIXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuZW50cnlTZXQoKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5Ci0JCQkJCQkJLmdldEtleSgpOwotCQkJCQl3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmFkZEFsbCgKLQkJCQkJCQkoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZihyb2xlRGVzY1RlYW1Qcm9maWxlTWFwID09IG51bGwpIHsKLQkJCQlyb2xlRGVzY1RlYW1Qcm9maWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJVGVhbVByb2ZpbGUgdGVhbVByb2ZpbGUgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VGVhbSgKLQkJCQkJCQlhY3Rpdml0eSwgcm9sZURlc2MuZ2V0Um9sZSgpKTsKLQkJCQkJaWYgKHRlYW1Qcm9maWxlICE9IG51bGwpIHsKLQkJCQkJCXJvbGVEZXNjVGVhbVByb2ZpbGVNYXAucHV0KHJvbGVEZXNjLCB0ZWFtUHJvZmlsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyBhZGQgcm9sZSBkZXNjcmlwdG9ycyB0byB0ZWFtIHByb2ZpbGVzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcm9sZURlc2NUZWFtUHJvZmlsZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkuYWRkKGVudHJ5LmdldEtleSgpKTsKLQkJCX0KLQotCQkJLy8gYWRkIG5ldyBkZXNjcmlwdG9ycyB0byBhY3Rpdml0eSdzIHBhY2thZ2UKLQkJCS8vCi0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwodGFza0Rlc2NMaXN0KTsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKHJvbGVEZXNjTGlzdCk7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbCh3cERlc2NMaXN0KTsKLQkJCX0KLQkJCQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9VbmRvKCkgewotCQkJCi0JCQkvLyByZW1vdmUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCQkvLwotCQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwod3BEZXNjTGlzdCk7Ci0KLQkJCS8vIHJlbW92ZSByb2xlIGRlc2NyaXB0b3JzCi0JCQkvLwotCQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwocm9sZURlc2NMaXN0KTsKLQotCQkJLy8gcmVtb3ZlIHRhc2sgZGVzY3JpcHRvcnMKLQkJCS8vCi0JCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbCh0YXNrRGVzY0xpc3QpOwotCi0JCQkvLyByZW1vdmUgZGVsaXZlcmFibGUgcGFydHMgdG8gdGhlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCQkJLy8KLQkJCWlmICghd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5lbnRyeVNldCgpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZW50cnkKLQkJCQkJCQkuZ2V0S2V5KCk7Ci0JCQkJCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkucmVtb3ZlQWxsKAotCQkJCQkJCShDb2xsZWN0aW9uKSBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHJlbW92ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBmcm9tIGRlbGl2ZXJhYmxlIHBhcnQKLQkJCS8vCi0JCQlpZiAoIXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmVudHJ5U2V0KCkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5Ci0JCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQkJCWRlbGl2ZXJhYmxlLmdldERlbGl2ZXJhYmxlUGFydHMoKS5yZW1vdmUoZW50cnkuZ2V0S2V5KCkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gcmVtb3ZlIHJvbGUgZGVzY3JpcHRvcnMgZnJvbSB0ZWFtIHByb2ZpbGVzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcm9sZURlc2NUZWFtUHJvZmlsZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkucmVtb3ZlKGVudHJ5LmdldEtleSgpKTsKLQkJCX0KLQotCQkJLy8gcmVtb3ZlIGRlc2NyaXB0b3JzIGZyb20gYWN0aXZpdHkncyBwYWNrYWdlCi0JCQkvLwotCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBhY3Rpdml0eS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKHRhc2tEZXNjTGlzdCk7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZUFsbChyb2xlRGVzY0xpc3QpOwotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5yZW1vdmVBbGwod3BEZXNjTGlzdCk7Ci0JCQl9Ci0JCX0KLQotCX07Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0Ci0JICogICAgICAgICAgICB0aGUgYWN0aXZpdHkgdGhhdCB0aGUgZ2l2ZW4gdGFza3MgYXJlIGRyb3BwZWQgb24KLQkgKiBAcGFyYW0gdGFza3MKLQkgKiAgICAgICAgICAgIHRoZSB0YXNrcyB0byBkcm9wIG9uIHRoZSBnaXZlbiBhY3Rpdml0eQotCSAqLwotCXB1YmxpYyBXQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3QsIExpc3QgdGFza3MpIHsKLQkJc3VwZXIoYWN0LCB0YXNrcyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRyb3BFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgVGFzaykpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGRyb3BFbGVtZW50cwotCSAqIEBwYXJhbSBzeW5jaAotCSAqLwotCXB1YmxpYyBXQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCBkcm9wRWxlbWVudHMsIGJvb2xlYW4gc3luY2gpIHsKLQkJc3VwZXIoYWN0aXZpdHksIGRyb3BFbGVtZW50cywgc3luY2gpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBkcm9wRWxlbWVudHMKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHN5bmNoRmVhdHVyZXMKLQkgKi8KLQlwdWJsaWMgV0JTRHJvcENvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIExpc3QgZHJvcEVsZW1lbnRzLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFNldCBzeW5jaEZlYXR1cmVzKSB7Ci0JCXN1cGVyKGFjdGl2aXR5LCBkcm9wRWxlbWVudHMsIGNvbmZpZywgc3luY2hGZWF0dXJlcyk7Ci0JfQotCi0JcHVibGljIElFeGVjdXRvciBnZXRFeGVjdXRvcigpIHsKLQkJaWYgKGV4ZWN1dG9yID09IG51bGwpIHsKLQkJCWV4ZWN1dG9yID0gbmV3IEV4ZWN1dG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGV4ZWN1dG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjcHJlRXhlY3V0ZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlRXhlY3V0ZSgpIHsKLQkJaWYgKCFzdXBlci5wcmVFeGVjdXRlKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIGdldEV4ZWN1dG9yKCkucHJlRXhlY3V0ZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2V4ZWN1dGVOZXN0ZWRDb21tYW5kcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCkgewotCQlMaXN0IG5lc3RlZENvbW1hbmRQcm92aWRlcnMgPSBFeHRlbnNpb25NYW5hZ2VyLmdldE5lc3RlZENvbW1hbmRQcm92aWRlcnMoKTsKLQkJaWYoIW5lc3RlZENvbW1hbmRQcm92aWRlcnMuaXNFbXB0eSgpKSB7Ci0JCQlpZighdGFza0Rlc2NMaXN0LmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5lc3RlZENvbW1hbmRQcm92aWRlcnMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJSU5lc3RlZENvbW1hbmRQcm92aWRlciBjbWRQcm92aWRlciA9IChJTmVzdGVkQ29tbWFuZFByb3ZpZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUNvbW1hbmQgY21kID0gY21kUHJvdmlkZXIuY3JlYXRlUmVsYXRlZE9iamVjdHModGFza0Rlc2NMaXN0LCBXQlNEcm9wQ29tbWFuZC50aGlzKTsKLQkJCQkJCWlmKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsJCQkJCQkJCi0JCQkJCQkJY21kLmV4ZWN1dGUoKTsKLQkJCQkJCQlnZXROZXN0ZWRDb21tYW5kcygpLmFkZChjbWQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5leGVjdXRlTmVzdGVkQ29tbWFuZHMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2RvRXhlY3V0ZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQlleGVjdXRvci5kb0V4Y2VjdXRlKCk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNnZXRBZmZlY3RlZE9iamVjdHMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJaWYgKHRhc2tEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGFza0Rlc2NMaXN0OwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZG9VbmRvKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VuZG8oKSB7Ci0JCWV4ZWN1dG9yLmRvVW5kbygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHJvbGVEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQlyb2xlRGVzY0xpc3QuY2xlYXIoKTsKLQkJfQotCQlpZiAocm9sZURlc2NUZWFtUHJvZmlsZU1hcCAhPSBudWxsKSB7Ci0JCQlyb2xlRGVzY1RlYW1Qcm9maWxlTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHdwRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJd3BEZXNjTGlzdC5jbGVhcigpOwotCQl9Ci0JCWlmICh3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMgIT0gbnVsbCkgewotCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwICE9IG51bGwpIHsKLQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmNsZWFyKCk7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JDcmVhdGVDb3B5Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JDcmVhdGVDb3B5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjNjZmJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvV29ya1Byb2R1Y3REZXNjcmlwdG9yQ3JlYXRlQ29weUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5kb21haW4uVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMTIsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvckNyZWF0ZUNvcHlDb21tYW5kIGV4dGVuZHMKLQkJTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kIHsKLQotCS8qKgotCSAqIEBwYXJhbSBkb21haW4KLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gY29weUhlbHBlcgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3JDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBjb3B5SGVscGVyKSB7Ci0JCXN1cGVyKGRvbWFpbiwgb3duZXIsIGNvcHlIZWxwZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kI2RvRXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZG9FeGVjdXRlKCkgewotCQlzdXBlci5kb0V4ZWN1dGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ29weUNvbW1hbmQjZG9HZXRDaGlsZHJlblRvQ29weSgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZG9HZXRDaGlsZHJlblRvQ29weSgpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmRvR2V0Q2hpbGRyZW5Ub0NvcHkoKTsKLQotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb3duZXI7Ci0JCVdvcmtQcm9kdWN0IHdwID0gd3BkLmdldFdvcmtQcm9kdWN0KCk7Ci0JCWlmICh3cCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cGQuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgcGFydCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0ZXIKLQkJCQkJCS5uZXh0KCk7Ci0JCQkJaWYgKHBhcnQuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCAmJiBwYXJ0ICE9IHdwZCkgewotCQkJCQljaGlsZHJlbi5hZGQocGFydCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWlmIChkb21haW4gaW5zdGFuY2VvZiBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9ICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBkb21haW4pCi0JCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCS5hZGFwdChvd25lciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4ob3duZXIpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZCNkb0dldFJlc3VsdCgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZG9HZXRSZXN1bHQoKSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGQoY29weSk7Ci0KLQkJLy8gQ2hpbGRyZW4gdGhhdCBhcmUgc2hvd24gaW4gQlMgZHVlIHRvIGNoaWxkIHJlbGF0aW9uc2hpcCBvZiBpdHMgbGlua2VkCi0JCS8vIENvbnRlbnRFbGVtZW50Ci0JCS8vIGJ1dCB0aGV5IGFyZSBub3QgZGlyZWN0bHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBvd25lci4gV2UgbmVlZCB0byBhZGQKLQkJLy8gdGhlaXIgY29waWVzIHRvIHRoZSByZXN1bHQKLQkJLy8gc28gdGhleSB3aWxsIGJlIGFkZGVkIHRvIGNsaXBib2FyZCBmb3IgbGF0ZXIgcGFzdGUKLQkJLy8KLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG93bmVyOwotCQlXb3JrUHJvZHVjdCB3cCA9IHdwZC5nZXRXb3JrUHJvZHVjdCgpOwotCQlpZiAod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJaWYgKGRvbWFpbiBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGRvbWFpbikKLQkJCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcigKLQkJCQkJCWFkYXB0ZXJGYWN0b3J5LCB3cGQsIGZhbHNlKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBjaGlsZENvcHkgPSBjb3B5SGVscGVyLmdldChUbmdVdGlsLnVud3JhcChpdGVyCi0JCQkJCQkJLm5leHQoKSkpOwotCQkJCQlpZiAoY2hpbGRDb3B5ICE9IG51bGwpIHsKLQkJCQkJCXJlc3VsdC5hZGQoY2hpbGRDb3B5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChkb21haW4gaW5zdGFuY2VvZiBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pCi0JCQkoKFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZG9tYWluKS5hZGRDb3B5SW5mbyhyZXN1bHQsCi0JCQkJCWNvcHlIZWxwZXIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWE0OTg3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGNvbW1hbmRzIGZvciBlZGl0aW5nIGJyZWFrZG93biBlbGVtZW50cyBpbiBhIFByb2Nlc3MgZWRpdG9yLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyNjY5ZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4cG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBBY3Rpdml0eSBpdGVtIHByb3ZpZGVyIGZvciBjb25zb2xpZGF0ZWQgdmlldwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldE9iamVjdChvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3QoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRUYXNrKCk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2RvUmVmcmVzaEFmZmVjdGVkVmlld2VycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9SZWZyZXNoQWZmZWN0ZWRWaWV3ZXJzKCkgewotCQlPYmplY3QgcHJvYyA9IGdldFRvcEl0ZW0oKTsKLQkJT2JqZWN0IGl0ZW1Qcm92aWRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHByb2MsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCSgoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgaXRlbVByb3ZpZGVyKQotCQkJCQkuc2V0UmVmcmVzaEFsbElEc1JlcXVpcmVkKHRydWUpOwotCQl9Ci0KLQkJUHJvY2Vzc1V0aWwKLQkJCQkucmVmcmVzaElEc0luVmlld2VycygoRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBib29sZWFuIHVud3JhcCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwucmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGNoaWxkcmVuLCB1bndyYXApOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmopIHsKLQkJTGlzdCBuZXdDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iaik7Ci0JCWNoaWxkcmVuID0gcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGNoaWxkcmVuLCBmYWxzZSk7Ci0JCUxpc3Qgcm9sZURlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHdwRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0b3IubmV4dCgpOwotCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQkJCi0JCQkvLyBkb24ndCByZXR1cm4gcm9sZWRlc2NyaXB0b3Igd2hpY2ggYXJlIGxpbmtlZCB0byB0YXNrZGVzY3JpcHRvcgotCQkJLy8gCi0JCQlpZiAoZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGU7Ci0JCQkJaWYoQXNzb2NpYXRpb25IZWxwZXIuZ2V0UHJpbWFyeVRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYykuaXNFbXB0eSgpICYmCi0JCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5nZXRBZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKS5pc0VtcHR5KCkgJiYKLQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLmdldEFzc2lzdGVkVGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKS5pc0VtcHR5KCkpIAotCQkJCXsKLQkJCQkJcm9sZURlc2NyaXB0b3JzLmFkZChvYmplY3QpOwotCQkJCX0KLQkJCX0KLQkJCS8vIGRvbid0IHJldHVybiB3cGRlc2NyaXB0b3Igd2hpY2ggYXJlIGxpbmtlZCB0byBlaXRoZXIKLQkJCS8vIHRhc2tkZXNjcmlwdG9yIG9yIHJvbGVkZXNjcmlwdG9yCi0JCQllbHNlIGlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGU7Ci0JCQkJaWYoQXNzb2NpYXRpb25IZWxwZXIuZ2V0RXh0ZXJuYWxJbnB1dFRvKHdwRGVzYykuaXNFbXB0eSgpICYmCi0JCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5nZXRNYW5kYXRvcnlJbnB1dFRvKHdwRGVzYykuaXNFbXB0eSgpICYmCi0JCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5nZXRPcHRpb25hbElucHV0VG8od3BEZXNjKS5pc0VtcHR5KCkgJiYKLQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLmdldE91dHB1dEZyb20od3BEZXNjKS5pc0VtcHR5KCkgJiYKLQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLmdldFJlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzKHdwRGVzYykuaXNFbXB0eSgpKQotCQkJCXsKLQkJCQkJd3BEZXNjcmlwdG9ycy5hZGQob2JqZWN0KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCW5ld0NoaWxkcmVuLmFkZChvYmplY3QpOwotCQkJfQotCQl9Ci0JCi0JCW5ld0NoaWxkcmVuLmFkZEFsbChyb2xlRGVzY3JpcHRvcnMpOwotCQluZXdDaGlsZHJlbi5hZGRBbGwod3BEZXNjcmlwdG9ycyk7Ci0JCQotCQl1cGRhdGVDYWNoZWRDaGlsZHJlbihuZXdDaGlsZHJlbik7Ci0JCQotCQlyZXR1cm4gbmV3Q2hpbGRyZW47Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldFJvbGx1cENoaWxkcmVuRnJvbUNhY2hlKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSb2xsdXBDaGlsZHJlbkZyb21DYWNoZSgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2lzUm9sbGVkVXAoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUm9sbGVkVXAoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmNDI5OGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UZWFtUHJvZmlsZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlYW1Qcm9maWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBUZWFtUHJvZmlsZUl0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5jcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9Qcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRhMGE5ZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBQcm9jZXNzIGl0ZW0gcHJvdmlkZXIgZm9yIGNvbnNvbGlkYXRlZCB2aWV3Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCi0JcHVibGljIFByb2Nlc3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5kZWxlZ2F0ZUl0ZW1Qcm92aWRlciA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JCQkJCS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFByb2Nlc3NDb21wb25lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCS8vIG5lZWQgdG8gdXBkYXRlIHRoZSBsaWJyYXJ5IHZpZXcKLQkJCS8vIGJ1dCBQcm9jZXNzQ29tcG9uZW50cyBkb24ndCBoYXZlIGEgUHJlc2VudGF0aW9uIE5hbWUsIHNvCi0JCQkvLyBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHByb2NDb21wIHRvIGl0c2VsZgotCQkJLy8gdGhpcyB3aWxsIGNhdXNlIGEgcmVmcmVzaAotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChwcm9jLmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQkJYm9vbGVhbiBvbGQgPSBwcm9jLmVDb250YWluZXIoKS5lRGVsaXZlcigpOwotCQkJCXRyeSB7Ci0JCQkJCXByb2MuZUNvbnRhaW5lcigpLmVTZXREZWxpdmVyKHRydWUpOwotCQkJCQlpZiAocHJvYy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KQotCQkJCQkJKChQcm9jZXNzQ29tcG9uZW50KXByb2MuZUNvbnRhaW5lcigpKS5zZXROYW1lKCgoUHJvY2Vzc0NvbXBvbmVudClwcm9jLmVDb250YWluZXIoKSkuZ2V0TmFtZSgpKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlwcm9jLmVDb250YWluZXIoKS5lU2V0RGVsaXZlcihvbGQpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NjdkYTZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFJvbGVEZXNjcmlwdG9yIEl0ZW0gcHJvdmlkZXIgZm9yIGNvbnNvbGlkYXRlZCB2aWV3Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQobmV3IENvbW1hbmRQYXJhbWV0ZXIodGFyZ2V0LAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCksCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaXNXcmFwcGluZ05lZWRlZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q3JlYXRlQ2hpbGRUZXh0KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gZ2V0RmVhdHVyZVRleHQoZmVhdHVyZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENyZWF0ZUNoaWxkSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRlQ2hpbGRJbWFnZShPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3QgaW1nID0gVG5nVXRpbC5nZXRJbWFnZShjaGlsZCk7Ci0JCXJldHVybiBpbWcgIT0gbnVsbCA/IGltZyA6IHN1cGVyLmdldENyZWF0ZUNoaWxkSW1hZ2Uob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVXcmFwcGVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVdyYXBwZXIodmFsdWUsIG9iamVjdCwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJd3JhcHBlci5zZXRSZWFkT25seShmYWxzZSk7Ci0JCXJldHVybiB3cmFwcGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSb2xlRGVzY3JpcHRvci5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJcmVmcmVzaENoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5vdGlmaWNhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCByZWZyZXNoQ2hpbGRyZW4oTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAoUHJvY2Vzc1V0aWwuaXNSZWZyZXNoUmVxdWlyZWQobm90aWZpY2F0aW9uLCBudWxsKSkgewotCQkJUHJvY2VzcyB0b3BBY3QgPSAoUHJvY2VzcykgZ2V0VG9wSXRlbSgpOwotCQkJQWRhcHRlckZhY3Rvcnkgcm9vdEFkYXB0ZXJGYWN0b3J5ID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJCVByb2Nlc3NVdGlsLnJlZnJlc2hWaWV3ZXIocm9vdEFkYXB0ZXJGYWN0b3J5LCB0b3BBY3QpOwotCQl9Ci0JCQotCQkvLyByZWZyZXNoIGNoaWxkcmVuIG9mIHRoaXMgaXRlbSBwcm92aWRlciwgaXRzIHBhcmVudCBhY3Rpdml0eSBhbmQKLQkJLy8gYWxsIGV4dGVuZGVycywgbG9jYWwgY29udHJpYnV0b3JzIG9mIHRoZSBwYXJlbnQgYWN0aXZpdHkKLQkJLy8KLQkJVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIucmVmcmVzaENoaWxkcmVuKHRoaXMsIG5vdGlmaWNhdGlvbik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVDYWNoZWRDaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0vLwkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotLy8JCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoY2hpbGRyZW4pOwotLy8JCX0KLS8vCQllbHNlIHsKLS8vCQkJY2FjaGVkQ2hpbGRyZW4uY2xlYXIoKTsKLS8vCQkJY2FjaGVkQ2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuKTsKLS8vCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iaikgewotCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgb2JqOwotCQlMaXN0IG5ld0NoaWxkcmVuOwotCQotCQkvLyBJZiByb2xlcyBoYXMgYW55IG9mIHRhc2tkZXNjcmlwdG9yIGxpbmtlZCB0aGVuIGRvbid0IHNob3cgYW55Ci0JCS8vIGNoaWxkcmVuIG90aGVyd2lzZSBzaG93IGl0J3MgbGlua2VkIHdvcmtwcm9kdWN0IGRlc2NyaXB0b3IKLQkJaWYoIUFzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpLmlzRW1wdHkoKSB8fAotCQkJCSFBc3NvY2lhdGlvbkhlbHBlci5nZXRBZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKS5pc0VtcHR5KCkgfHwKLQkJCQkhQXNzb2NpYXRpb25IZWxwZXIuZ2V0QXNzaXN0ZWRUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpLmlzRW1wdHkoKSkKLQkJewotCQkJbmV3Q2hpbGRyZW4gPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gZ2V0IGNoaWxkcmVuCi0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCW5ld0NoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRGaWx0ZXIob2JqKTsKLQkJCQotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG8gPSBpdG9yLm5leHQoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJT2JqZWN0IGNoaWxkID0gKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvKS5nZXRWYWx1ZSgpOwotCQkJCQlpZiAoKGZpbHRlciAhPSBudWxsKSAmJiAoZmlsdGVyLmFjY2VwdChjaGlsZCkpKSB7Ci0JCQkJCQluZXdDaGlsZHJlbi5hZGQobyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vCQkgc29ydCB0aGUgY2hpbGRyZW4KLQkJQ29sbGVjdGlvbnMuc29ydChuZXdDaGlsZHJlbiwgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCQotCQl1cGRhdGVDYWNoZWRDaGlsZHJlbihuZXdDaGlsZHJlbik7Ci0JCXJldHVybiBuZXdDaGlsZHJlbjsKLQl9Ci0KLQlwcml2YXRlIElGaWx0ZXIgZ2V0RmlsdGVyKE9iamVjdCBvYmopIHsKLQkJSUZpbHRlciBmaWx0ZXIgPSBudWxsOwotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG9iaik7Ci0JCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIEFjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQlmaWx0ZXIgPSAoKEFjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5nZXRGaWx0ZXIoKTsKLQkJfQotCi0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9UYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YzFiNjE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9UYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5HdWlkYW5jZUl0ZW1Qcm92aWRlci5Db21wYXJlQnlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3MgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjYWNoZWRDaGlsZHJlbjsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChuZXcgQ29tbWFuZFBhcmFtZXRlcih0YXJnZXQsCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVSb2xlRGVzY3JpcHRvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKSk7Ci0JCQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKSk7Ci0JCQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCkpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCkpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2lzV3JhcHBpbmdOZWVkZWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENyZWF0ZUNoaWxkVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIGdldEZlYXR1cmVUZXh0KGZlYXR1cmUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDcmVhdGVDaGlsZEltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZUNoaWxkSW1hZ2UoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGltZyA9IFRuZ1V0aWwuZ2V0SW1hZ2UoY2hpbGQpOwotCQlyZXR1cm4gaW1nICE9IG51bGwgPyBpbWcgOiBzdXBlci5nZXRDcmVhdGVDaGlsZEltYWdlKG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlV3JhcHBlcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVXcmFwcGVyKHZhbHVlLCBvYmplY3QsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCXdyYXBwZXIuc2V0UmVhZE9ubHkoZmFsc2UpOwotCQlyZXR1cm4gd3JhcHBlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoVGFza0Rlc2NyaXB0b3IuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZOgotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotCQkJcmVmcmVzaENoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCQotCXN0YXRpYyB2b2lkIHJlZnJlc2hDaGlsZHJlbihJdGVtUHJvdmlkZXJBZGFwdGVyIGlwYSwgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewkJCi0JCWlmIChQcm9jZXNzVXRpbC5pc1JlZnJlc2hSZXF1aXJlZChub3RpZmljYXRpb24sIG51bGwpKSB7Ci0JCQlpcGEuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBpcGEuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQotCQkJaWYobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJLy8gbmVlZCB0byByZWZyZXNoIGNoaWxkcmVuIG9mIHBhcmVudCBhY3Rpdml0eQotCQkJCS8vCi0JCQkJQWN0aXZpdHkgcGFyZW50ID0gKChCcmVha2Rvd25FbGVtZW50KW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHBhcmVudCwKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJCSgoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlcikKLQkJCQkJLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJCXBhcmVudCwgdHJ1ZSwgZmFsc2UpKTsKLQkJCQl9Ci0KLQkJCQkvLyByZWZyZXNoIGV4dGVuZGVycyBhbmQgbG9jYWwgY29udHJpYnV0b3JzIG9mIHRoZSBwYXJlbnQKLQkJCQkvLwotCQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBUbmdVdGlsLmdldEdlbmVyYWxpemVycyhwYXJlbnQpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYodmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTAotCQkJCQkJCQl8fCB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OX0xJVEVSQUwpIHsKLQkJCQkJCQlhZGFwdGVyID0gVG5nVXRpbC5nZXRBZGFwdGVyQnlUeXBlKHZlLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJCQkJCSgoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlcikKLQkJCQkJCQkJLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJCQkJCXZlLCB0cnVlLCBmYWxzZSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub3RpZmljYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVmcmVzaENoaWxkcmVuKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJcmVmcmVzaENoaWxkcmVuKHRoaXMsIG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNhY2hlZENoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLS8vCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0vLwkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChjaGlsZHJlbik7Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQljYWNoZWRDaGlsZHJlbi5jbGVhcigpOwotLy8JCQljYWNoZWRDaGlsZHJlbi5hZGRBbGwoY2hpbGRyZW4pOwotLy8JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqKSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmopOwotCQlMaXN0IG5ld0NoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHByaW1hcnlQZXJmb3JtZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGFkZGl0aW9uYWxQZXJmb3JtZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGFzc2l0ZWRCeSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBtYW5kYXRvcnlJbnB1dCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBleHRlcm5hbElucHV0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IG9wdGlvbmFsSW5wdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgb3V0cHV0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUlGaWx0ZXIgZmlsdGVyID0gZ2V0RmlsdGVyKG9iaik7Ci0KLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IGl0b3IubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvKS5nZXRWYWx1ZSgpOwotCQkJCQotCQkJCQotCQkJCWlmICgoZmlsdGVyICE9IG51bGwpICYmIChmaWx0ZXIuYWNjZXB0KGNoaWxkKSkpIHsKLQkJCQkJaWYgKCgoV3JhcHBlckl0ZW1Qcm92aWRlcikgbykuZ2V0RmVhdHVyZSgpLmVxdWFscygKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCkpKSB7Ci0JCQkJCQlwcmltYXJ5UGVyZm9ybWVycy5hZGQobyk7Ci0JCQkJCX0gZWxzZSBpZiAoKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvKQotCQkJCQkJCS5nZXRGZWF0dXJlKCkKLQkJCQkJCQkuZXF1YWxzKAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpKSB7Ci0JCQkJCQlhZGRpdGlvbmFsUGVyZm9ybWVycy5hZGQobyk7Ci0JCQkJCX0gZWxzZSBpZiAoKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvKS5nZXRGZWF0dXJlKCkKLQkJCQkJCQkuZXF1YWxzKAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSkpIHsKLQkJCQkJCWFzc2l0ZWRCeS5hZGQobyk7Ci0JCQkJCX0gZWxzZSBpZiAoKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvKS5nZXRGZWF0dXJlKCkuZXF1YWxzKAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSkpIHsKLQkJCQkJCW1hbmRhdG9yeUlucHV0LmFkZChvKTsKLQkJCQkJfSBlbHNlIGlmICgoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIG8pLmdldEZlYXR1cmUoKS5lcXVhbHMoCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCkpKSB7Ci0JCQkJCQlleHRlcm5hbElucHV0LmFkZChvKTsKLQkJCQkJfSBlbHNlIGlmICgoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIG8pLmdldEZlYXR1cmUoKS5lcXVhbHMoCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCkpKSB7Ci0JCQkJCQlvcHRpb25hbElucHV0LmFkZChvKTsKLQkJCQkJfSBlbHNlIGlmICgoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIG8pLmdldEZlYXR1cmUoKS5lcXVhbHMoCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCkpKSB7Ci0JCQkJCQlvdXRwdXQuYWRkKG8pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gc29ydCBmb3IgYWxsIGNoaWxkcmVuCi0JCUNvbGxlY3Rpb25zLnNvcnQocHJpbWFyeVBlcmZvcm1lcnMsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQlDb2xsZWN0aW9ucy5zb3J0KGFkZGl0aW9uYWxQZXJmb3JtZXJzLCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJQ29sbGVjdGlvbnMuc29ydChhc3NpdGVkQnksIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQlDb2xsZWN0aW9ucy5zb3J0KGV4dGVybmFsSW5wdXQsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQlDb2xsZWN0aW9ucy5zb3J0KG1hbmRhdG9yeUlucHV0LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJQ29sbGVjdGlvbnMuc29ydChvcHRpb25hbElucHV0LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJQ29sbGVjdGlvbnMuc29ydChvdXRwdXQsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQkKLQkJbmV3Q2hpbGRyZW4uYWRkQWxsKHByaW1hcnlQZXJmb3JtZXJzKTsKLQkJbmV3Q2hpbGRyZW4uYWRkQWxsKGFkZGl0aW9uYWxQZXJmb3JtZXJzKTsKLQkJbmV3Q2hpbGRyZW4uYWRkQWxsKGFzc2l0ZWRCeSk7Ci0JCW5ld0NoaWxkcmVuLmFkZEFsbChleHRlcm5hbElucHV0KTsKLQkJbmV3Q2hpbGRyZW4uYWRkQWxsKG1hbmRhdG9yeUlucHV0KTsKLQkJbmV3Q2hpbGRyZW4uYWRkQWxsKG9wdGlvbmFsSW5wdXQpOwotCQluZXdDaGlsZHJlbi5hZGRBbGwob3V0cHV0KTsKLQkJCi0JCW5ld0NoaWxkcmVuID0gcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKG5ld0NoaWxkcmVuLCB0cnVlKTsKLQkJdXBkYXRlQ2FjaGVkQ2hpbGRyZW4obmV3Q2hpbGRyZW4pOwotCQlyZXR1cm4gbmV3Q2hpbGRyZW47Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBib29sZWFuIHVud3JhcCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwucmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGNoaWxkcmVuLCB1bndyYXApOwotCX0KLQotCXByaXZhdGUgSUZpbHRlciBnZXRGaWx0ZXIoT2JqZWN0IG9iaikgewotCQlJRmlsdGVyIGZpbHRlciA9IG51bGw7Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQob2JqKTsKLQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXRSb290QWRhcHRlckZhY3RvcnkoKQotCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCWZpbHRlciA9ICgoQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLmdldEZpbHRlcigpOwotCQl9Ci0KLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZyb21DYWNoZSgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQ2FjaGUoKSB7Ci0JCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCWdldENoaWxkcmVuKHRhcmdldCk7Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyI2dldFJvbGx1cENoaWxkcmVuRnJvbUNhY2hlKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSb2xsdXBDaGlsZHJlbkZyb21DYWNoZSgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsgCi0JCWlmKGNhY2hlZENoaWxkcmVuICE9IG51bGwpIHsKLQkJCWNhY2hlZENoaWxkcmVuLmNsZWFyKCk7Ci0JCQljYWNoZWRDaGlsZHJlbiA9IG51bGw7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWNmZTVkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0KLS8qKgotICogV29ya1Byb2R1Y3REZXNjcmlwdG9yIEl0ZW0gcHJvdmlkZXIgZm9yIGNvbnNvbGlkYXRlZCB2aWV3Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2lzV3JhcHBpbmdOZWVkZWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENyZWF0ZUNoaWxkVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIGdldEZlYXR1cmVUZXh0KGZlYXR1cmUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDcmVhdGVDaGlsZEltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZUNoaWxkSW1hZ2UoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGltZyA9IFRuZ1V0aWwuZ2V0SW1hZ2UoY2hpbGQpOwotCQlyZXR1cm4gaW1nICE9IG51bGwgPyBpbWcgOiBzdXBlci5nZXRDcmVhdGVDaGlsZEltYWdlKG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlV3JhcHBlcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVXcmFwcGVyKHZhbHVlLCBvYmplY3QsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCXdyYXBwZXIuc2V0UmVhZE9ubHkoZmFsc2UpOwotCQlyZXR1cm4gd3JhcHBlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQkvLyBzd2l0Y2gobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSb2xlRGVzY3JpcHRvci5jbGFzcykpIHsKLQkJLy8gY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkvLyByZWZyZXNoQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJLy8gfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuRGVzY3JpcHRvckl0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLS8vCQlpZihwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8pIHsKLS8vCQkJCi0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZjJhNzdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpdGVtIHByb3ZpZGVycyBmb3IgZGlzcGxheWluZyBhbmQgZWRpdGluZyBicmVha2Rvd24gZWxlbWVudHMgaW4gYSBQcm9jZXNzIGVkaXRvcidzIENvbnNvbGlkYXRlZCBWaWV3IHBhZ2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvaW50ZXJuYWwvQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9pbnRlcm5hbC9CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjlkMDVhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9pbnRlcm5hbC9CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQ29tcG9zaXRlUm9sZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkRlbGl2ZXJhYmxlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLk1pbGVzdG9uZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UZWFtUHJvZmlsZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5IGltcGxlbWVudHMKLQkJSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSNjcmVhdGVXcmFwcGVyKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgSVdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXJldHVybiBjcmVhdGVXcmFwcGVyKHZhbHVlLCBvd25lciwgbnVsbCwgQ29tbWFuZFBhcmFtZXRlci5OT19JTkRFWCwKLQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkjY3JlYXRlV3JhcHBlcihqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgaW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkpCi0JICovCi0JcHVibGljIElXcmFwcGVySXRlbVByb3ZpZGVyIGNyZWF0ZVdyYXBwZXIoT2JqZWN0IHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJdmFsdWUgPSBUbmdVdGlsLnVud3JhcCh2YWx1ZSk7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlyZXR1cm4gbmV3IEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcigoQWN0aXZpdHkpIHZhbHVlLCBvd25lciwKLQkJCQkJZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJcmV0dXJuIG5ldyBNaWxlc3RvbmVXcmFwcGVySXRlbVByb3ZpZGVyKChNaWxlc3RvbmUpIHZhbHVlLCBvd25lciwKLQkJCQkJZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCXJldHVybiBuZXcgQ29tcG9zaXRlUm9sZVdyYXBwZXJJdGVtUHJvdmlkZXIoKENvbXBvc2l0ZVJvbGUpIHZhbHVlLAotCQkJCQlvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gbmV3IFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcigKLQkJCQkJKFJvbGVEZXNjcmlwdG9yKSB2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LAotCQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIG5ldyBUYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoCi0JCQkJCShUYXNrRGVzY3JpcHRvcikgdmFsdWUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwKLQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCXJldHVybiBuZXcgVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyKChUZWFtUHJvZmlsZSkgdmFsdWUsCi0JCQkJCW93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgdmFsdWU7Ci0JCQlpZiAod3BkLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCXJldHVybiBuZXcgRGVsaXZlcmFibGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcih3cGQsIG93bmVyLAotCQkJCQkJZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCX0KLQkJCXJldHVybiBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcih3cGQsIG93bmVyLAotCQkJCQlmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJcmV0dXJuIG5ldyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcigKLQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIHZhbHVlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsCi0JCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2ludGVybmFsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2ludGVybmFsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTk4ZWE4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBkaXNwbGF5aW5nIGFuZCBlZGl0aW5nIGEgcHJvY2Vzcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmZmM1NmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaXRlbSBwcm92aWRlcnMgZm9yIGRpc3BsYXlpbmcgYW5kIGVkaXRpbmcgYnJlYWtkb3duIGVsZW1lbnRzIGluIGEgUHJvY2VzcyBlZGl0b3IuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZDkwOWYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQ0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLkFjdGl2aXR5SXRlbVByb3ZpZGVyI3JlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihqYXZhLnV0aWwuQ29sbGVjdGlvbiwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgYm9vbGVhbiB1bndyYXApIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLnJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihjaGlsZHJlbiwgdW53cmFwLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihpc1JvbGxlZFVwKCkpIHsKLQkJCWlmKGNhY2hlZFJvbGx1cENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRSb2xsdXBDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkUm9sbHVwQ2hpbGRyZW47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY3MjQ0YTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIENCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIENCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDQlNUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDQlNSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ0JTV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkpOwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYTUwYWE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLlByb2Nlc3NJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ0JTUHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzIFByb2Nlc3NJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIENCU1Byb2Nlc3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihpc1JvbGxlZFVwKCkpIHsKLQkJCWlmKGNhY2hlZFJvbGx1cENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRSb2xsdXBDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkUm9sbHVwQ2hpbGRyZW47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuQWN0aXZpdHlJdGVtUHJvdmlkZXIjcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGphdmEudXRpbC5Db2xsZWN0aW9uLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBib29sZWFuIHVud3JhcCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwucmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGNoaWxkcmVuLCB1bndyYXAsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzFjYWJhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDQlNSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzIFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBDQlNSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJfQotCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ2YmE4YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLlRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIENCU1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMgVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIENCU1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQl9Ci0JCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgYm9vbGVhbiB1bndyYXApIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLnJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihjaGlsZHJlbiwgdW53cmFwLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhlNDA0MjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIENCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJfQotCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1RCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1RCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdhZjQ3NjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9UQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLk9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBPQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgVEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQkJfQotCQllbHNlIHsKLQkJCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1RCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1RCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZjZmRmMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9UQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLk9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcwotCQlPQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgVEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLk9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFjdGl2aXR5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFRCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBUQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9UQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1RCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTBiZDEzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1RCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLk9CU1Byb2Nlc3NJdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUQlNQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgVEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lk9CU1Byb2Nlc3NJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQkJfQotCQllbHNlIHsKLQkJCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA1YzI3NzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoaXNSb2xsZWRVcCgpKSB7Ci0JCQlpZihjYWNoZWRSb2xsdXBDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZFJvbGx1cENoaWxkcmVuOwotCQl9Ci0JCWVsc2UgewotCQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzM3Yjc3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBXQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiODgwMDkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdCU1Byb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQkJfQotCQllbHNlIHsKLQkJCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZTYzYTA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihpc1JvbGxlZFVwKCkpIHsKLQkJCWlmKGNhY2hlZFJvbGx1cENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRSb2xsdXBDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkUm9sbHVwQ2hpbGRyZW47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBib29sZWFuIHVud3JhcCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwucmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGNoaWxkcmVuLCB1bndyYXAsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNTc2ZDQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcwotCQlQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgV1BCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5QQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdQQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2IyZjNlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dQQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5QQlNQcm9jZXNzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdQQlNQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgV1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihpc1JvbGxlZFVwKCkpIHsKLQkJCWlmKGNhY2hlZFJvbGx1cENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRSb2xsdXBDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkUm9sbHVwQ2hpbGRyZW47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4sIGJvb2xlYW4gdW53cmFwKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5yZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4sIHVud3JhcCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dQQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTQzNzE3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dQQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXUEJTV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgV1BCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyI2FkZENvbnRhaW5lZEFydGlmYWN0RGVzY3JpcHRvcnMob3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRhaW5lZEFydGlmYWN0RGVzY3JpcHRvcnMoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYywgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlBY3Rpdml0eSBhY3Rpdml0eSA9IFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkod3BEZXNjKTsKLQkJaWYoYWN0aXZpdHkgIT0gbnVsbCkgewotCQkJLy8gY29sbGVjdCBhbGwgYXJ0aWZhY3QgZGVzY3JpcHRvcnMgb3IgdGhlaXIgd3JhcHBlcnMgdW5kZXIgdGhlIHNhbWUgYWN0aXZpdHkKLQkJCS8vCi0JCQlMaXN0IGFydGlmYWN0RGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlDb2xsZWN0aW9uIHNpYmxpbmdzID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCUlGaWx0ZXIgZmlsdGVyID0gUHJvY2Vzc1V0aWwuZ2V0RmlsdGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNpYmxpbmdzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvciAKLQkJCQkJCSYmICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKWUpLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBBcnRpZmFjdAotCQkJCQkJJiYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQoZSkpKSB7Ci0JCQkJCWFydGlmYWN0RGVzY0xpc3QuYWRkKGUpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJY2hpbGRyZW4uYWRkQWxsKFByb2Nlc3NVdGlsLmdldENvbnRhaW5lZEFydGlmYWN0c0Rlc2NyaXB0b3JzKHdwRGVzYywgYXJ0aWZhY3REZXNjTGlzdCkpOwkJCQotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NWQ4YzgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaXRlbSBwcm92aWRlcnMgZm9yIGRpc3BsYXlpbmcgYSBwcm9jZXNzIGluIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL0RlbGl2ZXJhYmxlU2VsZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvRGVsaXZlcmFibGVTZWxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWViMjgzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvRGVsaXZlcmFibGVTZWxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nOwotCi0KLS8qKgotICogVUkgRGlhbG9nIGNsYXNzIHdoaWNoIHdpbGwgYXNrIHVzZXIgdG8gYXNzaWduIGEgd3AgdG8gZGVsaXZlcmFibGUKLSAqIGF1dG9tYXRpY2FsbHkKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJhYmxlU2VsZWN0aW9uIHsKLQotCS8qKgotCSAqIEl0IHNob3dzIGRpYWxvZyBib3ggYWxsIGRlbGl2ZXJhYmxlLiBSZXR1cm5zIGRlbGl2ZXJhYmxlIHVzZXIgc2VsZWN0ZWQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGdldFNlbGVjdGVkRGVsaXZlcmFibGUoCi0vLwkJCUxpc3QgZGVsaXZlcmFibGVMaXN0LCBXb3JrUHJvZHVjdCB3cCkgewotLy8JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotLy8JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotLy8JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotLy8JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotLy8JCQkJCXJldHVybiAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqKS5nZXROYW1lKCk7Ci0vLwkJCQl9Ci0vLwkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLS8vCQkJfQotLy8JCX07Ci0vLwotLy8JCUVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyhudWxsLAotLy8JCQkJbGFiZWxQcm92aWRlcik7Ci0vLwotLy8JCWRsZy5zZXRUaXRsZShMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxpdmVyYWJsZXNfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLS8vCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0vLwkJZGxnLnNldEVsZW1lbnRzKGRlbGl2ZXJhYmxlTGlzdC50b0FycmF5KCkpOwotLy8JCWRsZy5zZXRNdWx0aXBsZVNlbGVjdGlvbihmYWxzZSk7Ci0vLwkJZGxnLnNldE1lc3NhZ2UoTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RleHQsIHdwLmdldE5hbWUoKSkpOyAKLS8vCQlkbGcuc2V0VGl0bGUoTGlicmFyeUVkaXRSZXNvdXJjZXMuc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotLy8JCWRsZy5zZXRGaWx0ZXIobnVsbCk7Ci0vLwkJZGxnLm9wZW4oKTsKLS8vCi0vLwkJT2JqZWN0IG9iaiA9IGRsZy5nZXRGaXJzdFJlc3VsdCgpOwotLy8KLS8vCQkvLyBkaXNwb3NlCi0vLwkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0vLwkJcmV0dXJuIChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iajsKLS8vCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL0lBY3Rpb25UeXBlUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9JQWN0aW9uVHlwZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY0NzQ0NzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL0lBY3Rpb25UeXBlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBY3Rpb25UeXBlUHJvdmlkZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09QWSA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFRFTkQgPSAyOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRVBfQ09QWSA9IDM7Ci0KLQl2b2lkIHNldElucHV0RGF0YShPYmplY3Qgb2JqZWN0KTsKLQotCXZvaWQgc2V0QWN0aW9uTWFuYWdlcihJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpOwotCi0Jdm9pZCBleGVjdXRlKENvbW1hbmQgY21kLCBib29sZWFuIGNhbkV4dGVuZCk7Ci0KLS8vCWludCBnZXRBY3Rpb25UeXBlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9OZXdQcm9jZXNzQ29tcG9uZW50RGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvTmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOTFjOGE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9OZXdQcm9jZXNzQ29tcG9uZW50RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0KLS8qKgotICogRGlzcGxheXMgdGhlIE5ldyBQcm9jZXNzIGRpYWxvZy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBhcmVhOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfbmFtZTsKLQotCXByaXZhdGUgQ29tYm9WaWV3ZXIgY29uZmlnQ29tYm9WaWV3ZXI7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb25bXSBhdmFpbGFibGVDb25maWd1cmF0aW9uczsKLQotCXByaXZhdGUgUHJvY2Vzc0NvbXBvbmVudCBuZXdQcm9jQ29tcDsKLQotCXByaXZhdGUgUHJvY2Vzc1tdIGF2YWlsYWJsZUJhc2VQcm9jZXNzZXM7Ci0KLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgcHJvY2Vzc1RhYmxlVmlld2VyOwotCi0JLy8gcHJpdmF0ZSBQcm9jZXNzUGFja2FnZSBvd25lcjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gRUNMQVNTID0gbmV3IEhhc2hTZXQoKTsKLQotCXByaXZhdGUgSVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLQlzdGF0aWMgewotCQlFQ0xBU1MuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnQoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZyhTaGVsbCBwYXJlbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uW10gYXZhaWxhYmxlQ29uZmlndXJhdGlvbnMsCi0JCQlQcm9jZXNzQ29tcG9uZW50IG5ld0NvbXAsIFByb2Nlc3NbXSBhdmFpbGFibGVCYXNlUHJvY2Vzc2VzLAotCQkJTWV0aG9kUGx1Z2luIGN1cnJlbnRQbHVnaW4sIFByb2Nlc3NQYWNrYWdlIG93bmVyKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuYXZhaWxhYmxlQ29uZmlndXJhdGlvbnMgPSBhdmFpbGFibGVDb25maWd1cmF0aW9uczsKLQkJdGhpcy5uZXdQcm9jQ29tcCA9IG5ld0NvbXA7Ci0JCXRoaXMuYXZhaWxhYmxlQmFzZVByb2Nlc3NlcyA9IGF2YWlsYWJsZUJhc2VQcm9jZXNzZXM7Ci0JCS8vIHRoaXMub3duZXIgPSBvd25lcjsKLQkJdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlTmFtZVZhbGlkYXRvcihvd25lciwKLQkJCQluZXdQcm9jQ29tcCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWFyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWZpbmFsIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWFyZWEuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlHcmlkRGF0YSBhcmVhR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLS8vCQlhcmVhR3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQlhcmVhLnNldExheW91dERhdGEoYXJlYUdyaWREYXRhKTsJCQotCQkKLQkJLy8gTmFtZQotCQlMYWJlbCBuYW1lTGFiZWwgPSBuZXcgTGFiZWwoYXJlYSwgU1dULk5PTkUpOwotCQluYW1lTGFiZWwuc2V0VGV4dChMaWJyYXJ5RWRpdFJlc291cmNlcy5uYW1lTGFiZWxfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCW5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfbmFtZSA9IG5ldyBUZXh0KGFyZWEsIFNXVC5CT1JERVIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcKLQkJCQkJfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMjAwOwotCQkJY3RybF9uYW1lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJLy8gUmVmLiBNb2RlbHMKLQkJTGFiZWwgcmVmTW9kZWxMYWJlbCA9IG5ldyBMYWJlbChhcmVhLCBTV1QuTk9ORSk7Ci0JCXJlZk1vZGVsTGFiZWwuc2V0VGV4dChMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWZhdWx0Q29uZmlnTGFiZWxfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCXJlZk1vZGVsTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUoYXJlYSwgU1dULk5PTkUpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcKLQkJCQkJfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJY29tcC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCX0KLQotCQljb25maWdDb21ib1ZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihjb21wLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0JCQljb25maWdDb21ib1ZpZXdlci5nZXRDb21ibygpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCQotCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gY29uZmlnTGlzdFZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKGNvbXAsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFKTsKLQkJLy8gY29uZmlnTGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQkvLyBjb25maWdMaXN0Vmlld2VyLmFkZChhdmFpbGFibGVDb25maWd1cmF0aW9ucyk7Ci0JCS8vIGlmKG5ld1Byb2NDb21wLmdldFByb2Nlc3MoKS5nZXREZWZhdWx0Q29udGV4dCgpICE9IG51bGwpIHsKLQkJLy8gY29uZmlnTGlzdFZpZXdlci5zZXRTZWxlY3Rpb24obmV3Ci0JCS8vIFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3UHJvY0NvbXAuZ2V0UHJvY2VzcygpLmdldERlZmF1bHRDb250ZXh0KCkpKTsKLQkJLy8gfQotCi0JCWNvbmZpZ0NvbWJvVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCWNvbmZpZ0NvbWJvVmlld2VyLmFkZChhdmFpbGFibGVDb25maWd1cmF0aW9ucyk7Ci0JCWlmIChuZXdQcm9jQ29tcC5nZXRQcm9jZXNzKCkuZ2V0RGVmYXVsdENvbnRleHQoKSAhPSBudWxsKSB7Ci0JCQljb25maWdDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3UHJvY0NvbXAKLQkJCQkJLmdldFByb2Nlc3MoKS5nZXREZWZhdWx0Q29udGV4dCgpKSk7Ci0JCX0KLQkJLy8gY29uZmlnQ29tYm9WaWV3ZXIuZ2V0Q29udHJvbCgpLnNldFNpemUoMTAwLAotCQkvLyBjb25maWdDb21ib1ZpZXdlci5nZXRDb250cm9sKCkuZ2V0U2l6ZSgpLnkpOwotCi0JCWlmIChuZXdQcm9jQ29tcC5nZXRQcm9jZXNzKCkgaW5zdGFuY2VvZiBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSkgewotCQkJLy8gYmFzZWQgb24gcHJvY2Vzc2VzCi0JCQkvLwotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoYXJlYSwgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dChMaWJyYXJ5RWRpdFJlc291cmNlcy5iYXNlZE9uUHJvY2Vzc2VzTGFiZWxfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJfQotCi0JCQljb21wID0gbmV3IENvbXBvc2l0ZShhcmVhLCBTV1QuTk9ORSk7Ci0JCQl7Ci0JCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HCi0JCQkJCQl8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJCWNvbXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCX0KLQotCQkJcHJvY2Vzc1RhYmxlVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QoY29tcCwKLQkJCQkJU1dULkJPUkRFUik7Ci0JCQlwcm9jZXNzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKQotCQkJCQkuc2V0TGF5b3V0RGF0YSgKLQkJCQkJCQluZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HCi0JCQkJCQkJCQl8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlwcm9jZXNzVGFibGVWaWV3ZXIKLQkJCQkJLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJCXByb2Nlc3NUYWJsZVZpZXdlcgotCQkJCQkuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQkJCWFkYXB0ZXJGYWN0b3J5KSk7Ci0JCQlwcm9jZXNzVGFibGVWaWV3ZXIuYWRkKGF2YWlsYWJsZUJhc2VQcm9jZXNzZXMpOwotCQl9Ci0KLQkJaWYgKG5ld1Byb2NDb21wLmdldE5hbWUoKSAhPSBudWxsKQotCQkJY3RybF9uYW1lLnNldFRleHQobmV3UHJvY0NvbXAuZ2V0TmFtZSgpKTsKLQotCQlzdXBlcgotCQkJCS5nZXRTaGVsbCgpCi0JCQkJLnNldFRleHQoCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5uZXdQcm9jZXNzQ29tcG9uZW50RGlhbG9nX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGFkZExpc3RlbmVycygpOwotCi0JCXJldHVybiBhcmVhOwotCX0KLQotCS8vIHByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkvLyAvLyBET04nVCB1c2UgRm9jdXNMb3N0IGxpc3RlbmVyIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IGdvZXMgaW5maW5pdGUgbG9vcAotCS8vIC8vIGFuZCB1c2VyIGNhbm5vdCBjYW5jZWwgb3V0IG9mIGl0LgotCS8vIGN0cmxfbmFtZS5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCS8vIHB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkvLyBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9ORVhUIHx8IGUuZGV0YWlsID09Ci0JLy8gU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUykgewotCS8vIFN0cmluZyBuYW1lID0gY3RybF9uYW1lLmdldFRleHQoKTsKLQkvLyBTdHJpbmcgbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQobmFtZSk7Ci0JLy8gaWYgKG1zZyAhPSBudWxsKSB7Ci0JLy8gTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkvLyBMaWJyYXJ5RWRpdFJlc291cmNlcy5nZXRTdHJpbmcoIkxpYnJhcnlFZGl0LmNyZWF0ZVByb2Nlc3MudGV4dCIpLAotCS8vIC8vJE5PTi1OTFMtMSQKLQkvLyBtc2cpOwotCS8vCQkJCQkJCi0JLy8gY3RybF9uYW1lLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCS8vIHB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JLy8gY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JLy8gfQotCS8vIH0pOwotCS8vIGN0cmxfbmFtZS5zZWxlY3RBbGwoKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyB9KTsKLQkvLyB9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkaWFsb2cgYnV0dG9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBPSyBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0JCQkJdHJ1ZSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBDYW5jZWwgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCi0JCS8vIFNldCBoZWxwIGNvbnRleHQgZm9yIHRoZSBPSyBidXR0b24uCi0JCXN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJLy8gTmVlZCB0byBkbyB2YWxpZGF0aW9uIGFnYWluIHNpbmNlIFRyYXZlcnNlTGlzdGVuZXIgb25seSBsaXN0ZW5zIHRvCi0JCS8vIHRhYiBvdXQgb2YgZmllbGQKLQkJLy8gYW5kIGRvZXNuJ3QgdGFrZSBjYXJlIG9mIG1vdXNlIGNsaWNrcwotCQlTdHJpbmcgbmFtZSA9IGN0cmxfbmFtZS5nZXRUZXh0KCkudHJpbSgpOwotCQluYW1lID0gU3RyVXRpbC5tYWtlVmFsaWRGaWxlTmFtZShuYW1lKTsKLQkJU3RyaW5nIG1zZyA9IHZhbGlkYXRvci5pc1ZhbGlkKG5hbWUpOwotCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmNyZWF0ZVByb2Nlc3NfdGV4dCwgLy8kTk9OLU5MUy0xJAotCQkJCQltc2cpOwotCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQljdHJsX25hbWUuc2VsZWN0QWxsKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29uZmlnQ29tYm9WaWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3RlZC5pc0VtcHR5KCkpIHsKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmNyZWF0ZVByb2Nlc3NfdGV4dCwgLy8kTk9OLU5MUy0xJAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5ub0RlZmF1bHRDb25maWdFcnJvcl9tc2cpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQluZXdQcm9jQ29tcC5zZXROYW1lKG5hbWUpOwotCQluZXdQcm9jQ29tcC5nZXRQcm9jZXNzKCkuc2V0TmFtZShuYW1lKTsKLQkJbmV3UHJvY0NvbXAuZ2V0UHJvY2VzcygpLnNldFByZXNlbnRhdGlvbk5hbWUobmFtZSk7Ci0JCW5ld1Byb2NDb21wLmdldFByb2Nlc3MoKS5zZXREZWZhdWx0Q29udGV4dCgKLQkJCQkoTWV0aG9kQ29uZmlndXJhdGlvbikgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29uZmlnQ29tYm9WaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQlpZiAobmV3UHJvY0NvbXAuZ2V0UHJvY2VzcygpIGluc3RhbmNlb2YgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpIHsKLQkJCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIHByb2NQbGFubmluZ1RlbXBsID0gKFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKSBuZXdQcm9jQ29tcAotCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJcHJvY1BsYW5uaW5nVGVtcGwuZ2V0QmFzZWRPblByb2Nlc3NlcygpLmFkZEFsbCgKLQkJCQkJQXJyYXlzLmFzTGlzdChwcm9jZXNzVGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpKTsKLQkJfQotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9Qcm9jZXNzTGlzdFNlbGVjdGlvbkRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1Byb2Nlc3NMaXN0U2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI3OWUwZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1Byb2Nlc3NMaXN0U2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0U2VsZWN0aW9uRGlhbG9nOwotCi0vKioKLSAqIFRoaXMgamF2YSBmaWxlIGV4dGVuZHMgamZhY2UgTGlzdFNlbGVjdGlvbkRpYWxvZyBhbmQgcmVtb3ZlIGNhbmNlbCBidXR0b24KLSAqIGZyb20gZGlhbG9nCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4xCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBMaXN0U2VsZWN0aW9uRGlhbG9nIHsKLQotCXB1YmxpYyBQcm9jZXNzTGlzdFNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgT2JqZWN0IGlucHV0LAotICAgICAgICAgICAgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyLAotICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwgU3RyaW5nIG1lc3NhZ2UpCi0JewotCQlzdXBlcihwYXJlbnRTaGVsbCwgaW5wdXQsIGNvbnRlbnRQcm92aWRlciwgbGFiZWxQcm92aWRlciwgbWVzc2FnZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9SZWZlcmVuY2VTZWxlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9SZWZlcmVuY2VTZWxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTgyZTZiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvUmVmZXJlbmNlU2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVUkgRGlhbG9nIGNsYXNzIHdoaWNoIHdpbGwgZ2l2ZSB1c2VyIHRvIHNlbGVjdCByZWZlcmVuY2VzIHRvIGJlIGRlbGV0ZWQKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZmVyZW5jZVNlbGVjdGlvbiB7Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGdldFJlZmVyZW5jZXMoTGlzdCByZWYsIERlc2NyaXB0b3IgZGVzYykgewotCQlyZXR1cm4gZ2V0UmVmZXJlbmNlcyhyZWYsIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLnVpX3JlZl9kZWxldGUsCi0JCQkJZGVzYy5nZXROYW1lKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBTaG93cyBkaWFsb2cgYm94IGZvciBhbGwgcmVmZXJlbmNlcyB0byBiZSBkZWxldGVkIGZvciB0aGUgZ2l2ZW4KLQkgKiBkZXNjcmlwdG9yLiBUaGVzZSByZWZlcmVuY2VzIGFyZSBub3QgYmVpbmcgdXNlZCBhbnl3aGVyZSBlbHNlLgotCSAqIAotCSAqIEBwYXJhbSByZWYKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBnZXRSZWZlcmVuY2VzKExpc3QgcmVmKSB7Ci0KLQkJU3RyaW5nIG1lc3NhZ2UgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy51aV9yZWZfZGVsZXRlMjsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRSZWZlcmVuY2VzKHJlZiwgbWVzc2FnZSk7Ci0JCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSXQgc2hvd3Mgc2VsZWN0aW9uIGRpYWxvZyBib3ggd2l0aCBsaXN0IG9mIHJlZmVyZW5jZSAoPGNvZGU+cmVmPC9jb2RlPikKLQkgKiBmb3IgdXNlciB0byBzZWxlY3QuCi0JICogCi0JICogQHBhcmFtIHJlZgotCSAqIEByZXR1cm4KLQkgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdXNlciBjYW5jZWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gZ2V0UmVmZXJlbmNlcyhMaXN0IHJlZiwgU3RyaW5nIG1zZykKLQkJCXRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCS8vIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldwotCQkvLyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJLy8gLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCS8vIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIHJldHVybiAoKExpc3QpIG9iamVjdCkudG9BcnJheSgpOwotCQkvLyB9Ci0JCS8vIH07Ci0JCS8vIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkvLyAuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkvLwotCQkvLyB0cnkgewotCQkvLyBQcm9jZXNzTGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcKLQkJLy8gUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2coUGxhdGZvcm1VSQotCQkvLyAuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgcmVmLAotCQkvLyBjb250ZW50UHJvdmlkZXIsIGxhYmVsUHJvdmlkZXIsIG1zZyk7Ci0JCS8vCi0JCS8vIGRsZy5zZXRUaXRsZShMaWJyYXJ5RWRpdFJlc291cmNlcy51aV9yZWZlcmVuY2VzKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCS8vIGlmIChkbGcub3BlbigpID09IERpYWxvZy5DQU5DRUwpIHsKLQkJLy8gdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCS8vIH0KLQkJLy8gT2JqZWN0IG9ianNbXSA9IGRsZy5nZXRSZXN1bHQoKTsKLQkJLy8gcmV0dXJuIG9ianM7Ci0JCS8vIH0gZmluYWxseSB7Ci0JCS8vIGNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCS8vIGxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkvLyB9Ci0KLQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlcgotCQkJCS5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQlpZiAodWlIYW5kbGVyICE9IG51bGwpIHsKLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy51aV9yZWZlcmVuY2VzOwotCQkJdHJ5IHsKLQkJCQlMaXN0IHNlbGVjdGVkID0gdWlIYW5kbGVyLnNlbGVjdChyZWYsIGxhYmVsUHJvdmlkZXIsIHRydWUsIHJlZiwKLQkJCQkJCXRpdGxlLCBtc2cpOwotCQkJCWlmIChzZWxlY3RlZCA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlyZXR1cm4gc2VsZWN0ZWQudG9BcnJheSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCi0JCS8vIG5vIHVzZXIgaW50ZXJhY3Rpb24gaGFuZGxlciBhdmFpbGFibGUKLQkJLy8gcmV0dXJuIHRoZSBlbnRpcmUgcmVmZXJlbmNlIGxpc3QKLQkJLy8KLQkJcmV0dXJuIHJlZi50b0FycmF5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1RlYW1TZWxlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9UZWFtU2VsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIyYjkwMzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1RlYW1TZWxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogVUkgRGlhbG9nIGNsYXNzIHdoaWNoIHdpbGwgYXNrIHVzZXIgdG8gYXNzaWduIGEgcm9sZSB0byB0ZWFtIGF1dG9tYXRpY2FsbHkuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZWFtU2VsZWN0aW9uIHsKLQotCS8qKgotCSAqIEl0IHNob3dzIGRpYWxvZyBib3ggYWxsIHRlYW1zLiBSZXR1cm5zIHRlYW0gdXNlciBzZWxlY3RlZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVhbVByb2ZpbGUgZ2V0U2VsZWN0ZWRUZWFtKExpc3QgdGVhbUxpc3QsIFJvbGUgcm9sZSwgU2hlbGwgc2hlbGwpIHsKLS8vCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLS8vCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLS8vCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmopIHsKLS8vCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotLy8JCQkJCXJldHVybiAoKFRlYW1Qcm9maWxlKSBvYmopLmdldE5hbWUoKTsKLS8vCQkJCX0KLS8vCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotLy8JCQl9Ci0vLwkJfTsKLS8vCQlpZihzaGVsbCA9PSBudWxsKSB7Ci0vLwkJCXRyeSB7Ci0vLwkJCQlzaGVsbCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsgLy9Nc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCk7Ci0vLwkJCX0KLS8vCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLS8vCQkJCQotLy8JCQl9Ci0vLwkJfQotLy8JCUVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyhzaGVsbCwgbGFiZWxQcm92aWRlcik7Ci0vLwotLy8JCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLS8vCQlkbGcuc2V0RWxlbWVudHModGVhbUxpc3QudG9BcnJheSgpKTsKLS8vCQlkbGcuc2V0TXVsdGlwbGVTZWxlY3Rpb24oZmFsc2UpOwotLy8JCWRsZwotLy8JCQkJLnNldE1lc3NhZ2UoTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuc2VsZWN0VGVhbXNEaWFsb2dfdGV4dCwgKG5ldyBPYmplY3RbXSB7IHJvbGUuZ2V0TmFtZSgpIH0pKSk7IAotLy8JCWRsZy5zZXRUaXRsZShMaWJyYXJ5RWRpdFJlc291cmNlcy5zZWxlY3RUZWFtc0RpYWxvZ190aXRsZSk7IC8vJE5PTi1OTFMtMSQKLS8vCQlkbGcuc2V0RmlsdGVyKG51bGwpOwotLy8JCWRsZy5vcGVuKCk7Ci0vLwkJT2JqZWN0IG9iaiA9IGRsZy5nZXRGaXJzdFJlc3VsdCgpOwotLy8JCS8vIGRpc3Bvc2UKLS8vCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLS8vCQlyZXR1cm4gKFRlYW1Qcm9maWxlKSBvYmo7Ci0JCQotCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCQkJLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCWlmICh1aUhhbmRsZXIgIT0gbnVsbCkgewotCQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuc2VsZWN0VGVhbXNEaWFsb2dfdGl0bGU7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuc2VsZWN0VGVhbXNEaWFsb2dfdGV4dCwgKG5ldyBPYmplY3RbXSB7IHJvbGUuZ2V0TmFtZSgpIH0pKTsKLQkJCXRyeSB7Ci0JCQkJTGlzdCBzZWxlY3RlZCA9IHVpSGFuZGxlci5zZWxlY3QodGVhbUxpc3QsIGxhYmVsUHJvdmlkZXIsIGZhbHNlLAotCQkJCQkJdGVhbUxpc3QsIHRpdGxlLCBtc2cpOwotCQkJCWlmIChzZWxlY3RlZCA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlpZihzZWxlY3RlZC5pc0VtcHR5KCkpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiAoVGVhbVByb2ZpbGUpIHNlbGVjdGVkLmdldCgwKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0KLQkJLy8gbm8gdXNlciBpbnRlcmFjdGlvbiBoYW5kbGVyIGF2YWlsYWJsZQotCQkvLyByZXR1cm4gbnVsbAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9Vc2VySW50ZXJhY3Rpb25IZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9Vc2VySW50ZXJhY3Rpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjA0ZjQzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvVXNlckludGVyYWN0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWk7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1lc3NlbmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklBY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuTWVzc2FnZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklJbnB1dFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklucHV0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5Xb3JrYmVuY2hKb2I7Ci0KLS8qKgotICogRGVmaW5lcyBzdGF0aWMgbWV0aG9kcyB0aGF0IGludGVyYWN0IHdpdGggdXNlciB2aWEgZGlhbG9nIGJveGVzIHRvIHJldHJpZXZlCi0gKiBtb3JlIGluZm9ybWF0aW9uIG9yIGNvbmZpcm1hdGlvbiBmcm9tIHRoZSB1c2Vycy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVc2VySW50ZXJhY3Rpb25IZWxwZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gY2FuSW50ZXJhY3QgPSB0cnVlOwotCi0JcHJpdmF0ZSBVc2VySW50ZXJhY3Rpb25IZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhbkludGVyYWN0KCkgewotCQlyZXR1cm4gY2FuSW50ZXJhY3Q7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGFnYWluc3QgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIHRoZSBnaXZlbiBwcm9jZXNzIHdoZXRoZXIgdGhlCi0JICogZ2l2ZW4gKG1ldGhvZCkgb2JqZWN0IGNhbiBiZSB1c2VkIGluIHRoZSBwcm9jZXNzLiBUaGlzIG1ldGhvZCB3aWxsIHByb21wdAotCSAqIHVzZXIgdG8gYWRkIHRoZSBvYmplY3QgYW5kIHRob3NlIGVsZW1lbnRzIHRoYXQgaXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRvCi0JICogdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGRvZXMgbm90IGhhdmUgdGhlbQotCSAqIHlldC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvYwotCSAqICAgICAgICAgICAgdGhlIHByb2Nlc3MKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgbWV0aG9kIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKiAgICAgICAgICAgIDxsaT4xIGlmIHRoZSBwcm9jZXNzJ2VzIGRlZmF1bHQgY29uZmlndXJhdGlvbiBhbHJlYWR5IGhhcyB0aGUKLQkgKiAgICAgICAgICAgIG9iamVjdAotCSAqICAgICAgICAgICAgPGxpPjIgaWYgdGhlIG9iamVjdCBpcyBub3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIGJ1dCB1c2VyCi0JICogICAgICAgICAgICB3YW50cyB0byBhZGQgaXQgbm93Ci0JICogICAgICAgICAgICA8bGk+MCBpZiB0aGUgb2JqZWN0IGlzIG5vdCBpbiB0aGUgY29uZmlndXJhdGlvbiBhbmQgdXNlcgotCSAqICAgICAgICAgICAgZG9uJ3Qgd2FudCB0byBhZGQgaXQKLQkgKiAgICAgICAgICAgIDxsaT4tMSBpZiB1c2VyIGNhbmNlbCB0aGUgcHJvbXB0IHRvIGFkZCB0aGUgb2JqZWN0cyBhbmQKLQkgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgZGVwZW5kZW5jaWVzIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjaGVja0FnYWluc3REZWZhdWx0Q29uZmlndXJhdGlvbihQcm9jZXNzIHByb2MsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBjaGVja0FnYWluc3REZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jLCBvYmplY3QsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBhZ2FpbnN0IGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgZ2l2ZW4gcHJvY2VzcyB3aGV0aGVyIHRoZQotCSAqIGdpdmVuIChtZXRob2QpIG9iamVjdCBjYW4gYmUgdXNlZCBpbiB0aGUgcHJvY2Vzcy4gVGhpcyBtZXRob2Qgd2lsbCBwcm9tcHQKLQkgKiB1c2VyIHRvIGFkZCB0aGUgb2JqZWN0IGFuZCB0aG9zZSBlbGVtZW50cyB0aGF0IGl0IGlzIGFzc29jaWF0ZWQgd2l0aCB0bwotCSAqIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBoYXZlIHRoZW0KLQkgKiB5ZXQuCi0JICogCi0JICogQHBhcmFtIHByb2MKLQkgKiAgICAgICAgICAgIHRoZSBwcm9jZXNzCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICogICAgICAgICAgICA8bGk+MSBpZiB0aGUgcHJvY2VzcydlcyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gYWxyZWFkeSBoYXMgdGhlCi0JICogICAgICAgICAgICBvYmplY3QKLQkgKiAgICAgICAgICAgIDxsaT4yIGlmIHRoZSBvYmplY3QgaXMgbm90IGluIHRoZSBjb25maWd1cmF0aW9uLCBidXQgdXNlcgotCSAqICAgICAgICAgICAgd2FudHMgdG8gYWRkIGl0IG5vdwotCSAqICAgICAgICAgICAgPGxpPjAgaWYgdGhlIG9iamVjdCBpcyBub3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHVzZXIKLQkgKiAgICAgICAgICAgIGRvbid0IHdhbnQgdG8gYWRkIGl0Ci0JICogICAgICAgICAgICA8bGk+LTEgaWYgdXNlciBjYW5jZWwgdGhlIHByb21wdCB0byBhZGQgdGhlIG9iamVjdHMgYW5kCi0JICogICAgICAgICAgICBhc3NvY2lhdGVkIGRlcGVuZGVuY2llcyB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY2hlY2tBZ2FpbnN0RGVmYXVsdENvbmZpZ3VyYXRpb24oUHJvY2VzcyBwcm9jLAotCQkJT2JqZWN0IG9iamVjdCwgSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IpIHsKLQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlpZiAoIShlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkpCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAoY29uZmlndXJhdG9yID09IG51bGwpCi0JCQljb25maWd1cmF0b3IgPSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdG9yRmFjdG9yeSgpCi0JCQkJCS5jcmVhdGVDb25maWd1cmF0b3IocHJvYy5nZXREZWZhdWx0Q29udGV4dCgpKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCS8vIGNoZWNrIGFsbCB0aGUgYmFzZSBlbGVtZW50cyBpZiB0aGVyZSBpcyBhbnkKLQkJCS8vCi0JCQlib29sZWFuIGFsbEluID0gdHJ1ZTsKLQkJCWZvciAoVmFyaWFiaWxpdHlFbGVtZW50IGMgPSAoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0KTsgYyAhPSBudWxsOyBjID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgYwotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSB7Ci0JCQkJaWYgKCFjb25maWd1cmF0b3IuYWNjZXB0KGMpKSB7Ci0JCQkJCWFsbEluID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChhbGxJbikgewotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0JCWlmIChjb25maWd1cmF0b3IuYWNjZXB0KGUpKQotCQkJcmV0dXJuIDE7Ci0KLQkJLy8gb2JqZWN0IGlzIG5vdCBpbiB0aGUgY29uZmlndXJhdGlvbgotCQkvLyBhc2sgdXNlciBpZiBoZS9zaGUgd2FudCB0byBhZGQgaXQgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCQkvLwotCQlTdHJpbmcgbXNnID0gTkxTCi0JCQkJLmJpbmQoCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy51aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZGVmYXVsdGNvbmZpZ2NoZWNrLAotCQkJCQkJKChNZXRob2RFbGVtZW50KSBlKS5nZXROYW1lKCkpOwotCi0JCWludCByZXQgPSBNc2dCb3gucHJvbXB0KG1zZyk7Ci0JCWlmIChUbmdVdGlsLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tBZ2FpbnN0RGVmYXVsdENvbmZpZ3VyYXRpb24oKTogZWxlbWVudD0iIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIGUgKyAiLCBwYXRoPSIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc3dpdGNoIChyZXQpIHsKLQkJY2FzZSBTV1QuWUVTOgotCQkJSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChwcm9jLmdldERlZmF1bHRDb250ZXh0KCksIG51bGwpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlyZXR1cm4gMjsKLQkJY2FzZSBTV1QuTk86Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBTV1QuQ0FOQ0VMOgotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJLy8gV3JhcHBlZE1lc3NhZ2VEaWFsb2cgbXNnQm94ID0gbmV3Ci0JCS8vIFdyYXBwZWRNZXNzYWdlRGlhbG9nKE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSwgbnVsbCwgbnVsbCwgbXNnLAotCQkvLyBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLAotCQkvLyBuZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwKLQkJLy8gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwgfSwKLQkJLy8gMCk7Ci0JCS8vIHN3aXRjaCAobXNnQm94Lm9wZW4oKSkgewotCQkvLyBjYXNlIElEaWFsb2dDb25zdGFudHMuT0tfSUQ6Ci0JCS8vIElTdGF0dXMgc3RhdHVzID0gVG5nVXRpbC5jaGVja0VkaXQocHJvYy5nZXREZWZhdWx0Q29udGV4dCgpLCBudWxsKTsKLQkJLy8gaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCS8vIHJldHVybiAwOwotCQkvLyB9Ci0JCS8vIHJldHVybiAyOwotCQkvLyBjYXNlIElEaWFsb2dDb25zdGFudHMuTk9fSUQ6Ci0JCS8vIHJldHVybiAwOwotCQkvLyBjYXNlIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEOgotCQkvLyByZXR1cm4gLTE7Ci0JCS8vIH07Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IHRhc2tzIHdoaWNoIGhhcyBnaXZlbiB3b3JrcHJvZHVjdCBhcyBvdXRwdXQuCi0JICogCi0JICogQHBhcmFtIHRhc2tMaXN0Ci0JICogQHBhcmFtIHdwCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBzZWxlY3RUYXNrcyhMaXN0IHRhc2tMaXN0LCBXb3JrUHJvZHVjdCB3cCkgewotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iaiwgaW50IGNvbHVtbikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCXJldHVybiBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUob2JqKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqKTsKLQkJCX0KLQkJfTsKLQotCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gKChMaXN0KSBvYmplY3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IFByb2Nlc3NMaXN0U2VsZWN0aW9uRGlhbG9nKAotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJLmdldFNoZWxsKCksCi0JCQkJCXRhc2tMaXN0LAotCQkJCQljb250ZW50UHJvdmlkZXIsCi0JCQkJCWxhYmVsUHJvdmlkZXIsCi0JCQkJCU5MUwotCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMudWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dwbGlzdGRsZ19tc2csCi0JCQkJCQkJCQl3cC5nZXROYW1lKCkpKTsKLQotCQkJZGxnLnNldFRpdGxlKExpYnJhcnlFZGl0UmVzb3VyY2VzLnVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl90YXNrcyk7Ci0JCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlkbGcub3BlbigpOwotCQkJT2JqZWN0W10gb2JqcyA9IGRsZy5nZXRSZXN1bHQoKTsKLQotCQkJTGlzdCBzZWxlY3RlZFRhc2tzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKChvYmpzICE9IG51bGwpICYmIChvYmpzLmxlbmd0aCA+IDApKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXNlbGVjdGVkVGFza3MuYWRkKG9ianNbaV0pOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzZWxlY3RlZFRhc2tzOwotCQl9IGZpbmFsbHkgewotCQkJLy8gZGlzcG9zZQotCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQljb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IHJlc3BvbnNpYmxlIHdvcmsgcHJvZHVjdHMgZm9yIHRoZSBnaXZlbiByb2xlCi0JICogCi0JICogQHBhcmFtIHdwTGlzdAotCSAqIEBwYXJhbSByb2xlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBzZWxlY3RXb3JrUHJvZHVjdHMoTGlzdCB3cExpc3QsIFJvbGUgcm9sZSkgewotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iaiwgaW50IGNvbHVtbikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCXJldHVybiBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUob2JqKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqKTsKLQkJCX0KLQkJfTsKLQotCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gKChMaXN0KSBvYmplY3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IFByb2Nlc3NMaXN0U2VsZWN0aW9uRGlhbG9nKAotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJLmdldFNoZWxsKCksCi0JCQkJCS8vIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSwKLQkJCQkJd3BMaXN0LAotCQkJCQljb250ZW50UHJvdmlkZXIsCi0JCQkJCWxhYmVsUHJvdmlkZXIsCi0JCQkJCU5MUwotCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMudWlfVXNlckludGVyYWN0aW9uSGVscGVyX3JvbGVsaXN0ZGxnX21zZywKLQkJCQkJCQkJCXJvbGUuZ2V0TmFtZSgpKSk7Ci0KLQkJCWRsZwotCQkJCQkuc2V0VGl0bGUoTGlicmFyeUVkaXRSZXNvdXJjZXMudWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dvcmtwcm9kdWN0cyk7IC8vJE5PTi1OTFMtMSQKLQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWRsZy5vcGVuKCk7Ci0JCQlPYmplY3RbXSBvYmpzID0gZGxnLmdldFJlc3VsdCgpOwotCi0JCQlMaXN0IHNlbGVjdGVkV3BzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKChvYmpzICE9IG51bGwpICYmIChvYmpzLmxlbmd0aCA+IDApKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXNlbGVjdGVkV3BzLmFkZChvYmpzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc2VsZWN0ZWRXcHM7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBkaXNwb3NlCi0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCWNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXF1ZXN0cyBuYW1lIGZyb20gdXNlcgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gbmFtZUZlYXR1cmUKLQkgKiBAcmV0dXJuIHRoZSByZXF1ZXN0ZWQgbmFtZSBvZiBudWxsIGlmIHVzZXIgY2FuY2VsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXF1ZXN0TmFtZShPYmplY3QgY2hpbGQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgbmFtZUZlYXR1cmUsIFN0cmluZyB0aXRsZSwKLQkJCWZpbmFsIElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCUlJbnB1dFZhbGlkYXRvciBpbnB1dFZhbGlkYXRvciA9IG5ldyBJSW5wdXRWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQkJCWlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZ2V0U2ltcGxlRXJyb3JNZXNzYWdlKHZhbGlkYXRvci5pc1ZhbGlkKG5ld1RleHQpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJfTsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IGUgPSAoRU9iamVjdCkgY2hpbGQ7Ci0JCQlTdHJpbmcgc3RyID0gKFN0cmluZykgZS5lR2V0KG5hbWVGZWF0dXJlKTsKLQkJCWlmIChzdHIgIT0gbnVsbCkgewotCQkJCW5hbWUgPSBzdHI7Ci0JCQl9Ci0JCX0KLQkJSW5wdXREaWFsb2cgaW5wdXREaWFsb2cgPSBuZXcgSW5wdXREaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgdGl0bGUsCi0JCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuVXNlckludGVyYWN0aW9uSGVscGVyX1Byb2Nlc3NQYWNrYWdlX05hbWUsCi0JCQkJbmFtZSwgaW5wdXRWYWxpZGF0b3IpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbnB1dERpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm4gaW5wdXREaWFsb2cuZ2V0VmFsdWUoKS50cmltKCk7CQkKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTaW1wbGVFcnJvck1lc3NhZ2UoU3RyaW5nIG1zZykgewotCQlpZiAobXNnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgcyA9IG1zZy5pbmRleE9mKCc6Jyk7Ci0KLQkJU3RyaW5nIHByZWZpeCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChzID49IDApIHsKLQkJCXByZWZpeCA9IG1zZy5zdWJzdHJpbmcoMCwgcyk7Ci0KLQkJCVN0cmluZyBlbXB0eUVsZW1lbnROYW1lRXJyb3JNc2cgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZHVwQ29udGVudEZpbGVFcnJvck1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3JfbXNnOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZHVwRWxlbWVudE5hbWVFcnJvck1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnOyAvLyROT04tTkxTLTEkCi0KLQkJCWlmIChlbXB0eUVsZW1lbnROYW1lRXJyb3JNc2cgIT0gbnVsbAotCQkJCQkmJiBlbXB0eUVsZW1lbnROYW1lRXJyb3JNc2cuc3RhcnRzV2l0aChwcmVmaXgpKQotCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5lbXB0eUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZzsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZSBpZiAoZHVwQ29udGVudEZpbGVFcnJvck1zZyAhPSBudWxsCi0JCQkJCSYmIGR1cENvbnRlbnRGaWxlRXJyb3JNc2cuc3RhcnRzV2l0aChwcmVmaXgpKQotCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX3NpbXBsZV9tc2c7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UgaWYgKGR1cEVsZW1lbnROYW1lRXJyb3JNc2cgIT0gbnVsbAotCQkJCQkmJiBkdXBFbGVtZW50TmFtZUVycm9yTXNnLnN0YXJ0c1dpdGgocHJlZml4KSkKLQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAocyA8IDApCi0JCQlzID0gMDsKLQkJZWxzZQotCQkJcysrOwotCQlpbnQgdCA9IG1zZy5pbmRleE9mKCdcbicpOwotCQlpZiAodCA8IDApCi0JCQl0ID0gbXNnLmxlbmd0aCgpOwotCi0JCXJldHVybiBtc2cuc3Vic3RyaW5nKHMsIHQpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGVhbSBpbiB3aGljaCB1c2VyIHdvdWxkIGF1dG9tYXRpY2FsbHkgYXNzaWduIGEgcm9sZSBpbnRvCi0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIHJvbGUKLQkgKiBAcmV0dXJuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBUZWFtUHJvZmlsZSBnZXRUZWFtKEFjdGl2aXR5IGFjdGl2aXR5LCBSb2xlIHJvbGUpIHsKLQkJcmV0dXJuIGdldFRlYW0oYWN0aXZpdHksIHJvbGUsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVhbVByb2ZpbGUgZ2V0VGVhbShBY3Rpdml0eSBhY3Rpdml0eSwgUm9sZSByb2xlLAotCQkJT2JqZWN0IFVJQ29udGV4dCkgewotCQlMaXN0IHRlYW1MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCS8vIGZpbmQgb3V0IGFsbCB0ZWFtIGluIHZpc2libGUgc2NvcGUKLQkJZ2V0VGVhbXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCBhY3Rpdml0eSwgcm9sZSwgdGVhbUxpc3QpOwotCQlpZiAodGVhbUxpc3Quc2l6ZSgpID09IDEpIHsKLQkJCXJldHVybiAoVGVhbVByb2ZpbGUpIHRlYW1MaXN0LmdldCgwKTsKLQkJfQotCQlpZiAodGVhbUxpc3Quc2l6ZSgpID4gMSkgewotCQkJcmV0dXJuIFRlYW1TZWxlY3Rpb24uZ2V0U2VsZWN0ZWRUZWFtKHRlYW1MaXN0LCByb2xlLAotCQkJCQlVSUNvbnRleHQgaW5zdGFuY2VvZiBTaGVsbCA/IChTaGVsbCkgVUlDb250ZXh0IDogbnVsbCk7Ci0JCX0KLQkJLy8gdGhlcmUgYXJlIG5vIHRlYW1zIHRvIGFzc2lnbgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGVhbXMgaW4gc2NvcGUKLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSByb2xlCi0JICogQHBhcmFtIHRlYW1MaXN0Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRUZWFtc0luU2NvcGUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlCcmVha2Rvd25FbGVtZW50IGUsIFJvbGUgcm9sZSwgTGlzdCB0ZWFtTGlzdCkgewotCQkvLyBnZXQgY2hpbGRyZW4gZm9yIGFjdGl2aXR5Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gaXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKGUpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIG9iajsKLQkJCQlMaXN0IGFsbFRlYW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCS8vIGdldCBhbGwgc3ViIHRlYW1zIGFzIHdlbGwKLQkJCQlQcm9jZXNzVXRpbC5nZXRBbGxTdWJUZWFtcyh0ZWFtLCBhbGxUZWFtcyk7Ci0KLQkJCQlmb3IgKEl0ZXJhdG9yIHRlYW1JdG9yID0gYWxsVGVhbXMuaXRlcmF0b3IoKTsgdGVhbUl0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvID0gdGVhbUl0b3IubmV4dCgpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJCQkvLyBnZXQgcm9sZXMgZnJvbSB0ZWFtcwotCQkJCQkJTGlzdCByb2xlcyA9IFByb2Nlc3NVdGlsLmdldFJvbGVzKCgoVGVhbVByb2ZpbGUpIG8pCi0JCQkJCQkJCS5nZXRUZWFtUm9sZXMoKSk7Ci0JCQkJCQlpZiAocm9sZXMuY29udGFpbnMocm9sZSkpIHsKLQkJCQkJCQl0ZWFtTGlzdC5hZGQobyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBnZXQgcGFyZW50Ci0JCU9iamVjdCBjdXJyZW50UGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChlKTsKLQkJaWYgKGN1cnJlbnRQYXJlbnQgIT0gbnVsbCkgewotCQkJLy8gZ28gdXAKLQkJCWdldFRlYW1zSW5TY29wZShhZGFwdGVyRmFjdG9yeSwgKEJyZWFrZG93bkVsZW1lbnQpIGN1cnJlbnRQYXJlbnQsCi0JCQkJCXJvbGUsIHRlYW1MaXN0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIElSdW5uYWJsZUNvbnRleHQgZ2V0UnVubmFibGVDb250ZXh0KCkgewotCQlyZXR1cm4gRXh0ZW5zaW9uTWFuYWdlci5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpCi0JCQkJLmdldFJ1bm5hYmxlQ29udGV4dCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBydW5XaXRoUHJvZ3Jlc3MoZmluYWwgUnVubmFibGUgcnVubmFibGUsCi0JCQlmaW5hbCBTdHJpbmcgbXNnKSB7Ci0JCWZpbmFsIE11bHRpU3RhdHVzIHN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5PSywKLQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvcl9yZWFzb24sIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2sobXNnLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOwotCQkJCW1vbml0b3Iuc3ViVGFzaygiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cnkgewotCQkJCQlydW5uYWJsZS5ydW4oKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3RyaW5nIG1zZzsKLQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXNzYWdlRXhjZXB0aW9uKSB7Ci0JCQkJCQltc2cgPSBlLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZ1dyaXRlciBzdHJXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIoc3RyV3JpdGVyKSk7Ci0JCQkJCQltc2cgPSBzdHJXcml0ZXIudG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCQlzdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwgMCwKLQkJCQkJCQltc2csIGUpKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQotCQl0cnkgewotCQkJLy8gVGhpcyBydW5zIHRoZSBvcGVyYXRpb24sIGFuZCBzaG93cyBwcm9ncmVzcy4KLQkJCS8vCi0JCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkgewotCQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJCS8vCi0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZ2V0UnVubmFibGVDb250ZXh0KCkucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX0pOwotCQkJfSBlbHNlIHsKLQkJCQlnZXRSdW5uYWJsZUNvbnRleHQoKS5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7Ci0JCQl9Ci0KLQkJCQotCi0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd0Vycm9yKAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yX21zZ1dpdGhEZXRhaWxzLCAvLyROT04tTkxTLTEkCi0JCQkJCQlzdGF0dXMpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcgdGhhdCBzaG91bGRuJ3QuCi0JCQkvLwotCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4Y2VwdGlvbik7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHJ1bldpdGhQcm9ncmVzcygKLQkJCWZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwgZmluYWwgU3RyaW5nIG1zZykgewotCQlyZXR1cm4gcnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBmYWxzZSwgbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcnVuV2l0aFByb2dyZXNzKAotCQkJZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLCBmaW5hbCBib29sZWFuIGNhbkNhbmNlbCwKLQkJCWZpbmFsIFN0cmluZyBtc2cpIHsKLQkJcmV0dXJuIHJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgZ2V0UnVubmFibGVDb250ZXh0KCksIGNhbkNhbmNlbCwgbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTdGF0dXMgcnVuQXNKb2IoSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLAotCQkJU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCVNoZWxsIHNoZWxsID0gTXNnQm94LmdldERlZmF1bHRTaGVsbCgpOwotCQlpZiAoc2hlbGwgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlydW5uYWJsZS5ydW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpCi0JCQkJCQkuZ2V0SWQoKSwgMCwgZS50b1N0cmluZygpLCBlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiBydW5Bc0pvYihydW5uYWJsZSwgdGFza05hbWUsIHNoZWxsKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVN0YXR1cyBydW5Bc0pvYihmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsCi0JCQlmaW5hbCBTdHJpbmcgdGFza05hbWUsIFNoZWxsIHNoZWxsKSB7Ci0JCUpvYiBqb2IgPSBuZXcgV29ya3NwYWNlSm9iKHRhc2tOYW1lKSB7Ci0KLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCS8vIG1vbml0b3IuYmVnaW5UYXNrKHRhc2tOYW1lLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOwotCQkJCQlydW5uYWJsZS5ydW4obW9uaXRvcik7Ci0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQlUaHJvd2FibGUgZXg7Ci0JCQkJCWlmIChlLmdldENhdXNlKCkgIT0gbnVsbCkgewotCQkJCQkJZXggPSBlLmdldENhdXNlKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlleCA9IGU7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4KLQkJCQkJCQkuZ2V0UGx1Z2luKCkuZ2V0SWQoKSwgMCwgZXgudG9TdHJpbmcoKSwgZXgpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4KLQkJCQkJCQkuZ2V0UGx1Z2luKCkuZ2V0SWQoKSwgMCwgZS50b1N0cmluZygpLCBlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5zaG93SW5EaWFsb2coc2hlbGwsIGpvYik7Ci0JCWpvYi5zY2hlZHVsZSgpOwotCQlyZXR1cm4gam9iLmdldFJlc3VsdCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5JblVJKGZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwKLQkJCWZpbmFsIFN0cmluZyB0YXNrTmFtZSkgewotCQlTaGVsbCBzaGVsbCA9IE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKTsKLQkJaWYgKHNoZWxsID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcnVubmFibGUucnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCXJldHVybjsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCUpvYiBqb2IgPSBuZXcgV29ya2JlbmNoSm9iKHRhc2tOYW1lKSB7Ci0KLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cnkgewotCQkJCQlydW5uYWJsZS5ydW4obW9uaXRvcik7Ci0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQlUaHJvd2FibGUgZXg7Ci0JCQkJCWlmIChlLmdldENhdXNlKCkgIT0gbnVsbCkgewotCQkJCQkJZXggPSBlLmdldENhdXNlKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlleCA9IGU7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4KLQkJCQkJCQkuZ2V0UGx1Z2luKCkuZ2V0SWQoKSwgMCwgZXgudG9TdHJpbmcoKSwgZXgpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4KLQkJCQkJCQkuZ2V0UGx1Z2luKCkuZ2V0SWQoKSwgMCwgZS50b1N0cmluZygpLCBlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5zaG93SW5EaWFsb2coc2hlbGwsIGpvYik7Ci0JCWpvYi5zY2hlZHVsZSgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcnVuSW5VSVRocmVhZChSdW5uYWJsZSBydW5uYWJsZSkgewotCQlydW5JblVJVGhyZWFkKHJ1bm5hYmxlLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBydW5JblVJVGhyZWFkKFJ1bm5hYmxlIHJ1bm5hYmxlLCBib29sZWFuIGFzeW5jKSB7Ci0JCWlmKERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpIHsKLQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJLy8KLQkJCURpc3BsYXkgZGlzcGxheSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCi0JCQl9Ci0JCQlpZihkaXNwbGF5ICE9IG51bGwpIHsKLQkJCQlpZihhc3luYykgewotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlkaXNwbGF5LnN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlydW5uYWJsZS5ydW4oKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXJ1bm5hYmxlLnJ1bigpOwotCQl9Ci0JCQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBydW5JblVJKGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlLAotCQkJZmluYWwgU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCXJldHVybiBydW5JblVJKHJ1bm5hYmxlLCB0YXNrTmFtZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHJ1bkluVUkoZmluYWwgUnVubmFibGUgcnVubmFibGUsCi0JCQlmaW5hbCBTdHJpbmcgdGFza05hbWUsIElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0JCVNoZWxsIHNoZWxsID0gTXNnQm94LmdldERlZmF1bHRTaGVsbCgpOwotCQlpZiAoc2hlbGwgPT0gbnVsbCkgewotCQkJcnVubmFibGUucnVuKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uZXIgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltb25pdG9yLmJlZ2luVGFzayh0YXNrTmFtZSwgMik7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX07Ci0JCQlyZXR1cm4gcnVuSW5VSShydW5uZXIsIHJ1bGUsIHNoZWxsKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBydW5JblVJKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwKLQkJCVNoZWxsIHNoZWxsKSB7Ci0JCXJldHVybiBydW5JblVJKHJ1bm5hYmxlLCBudWxsLCBzaGVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHJ1bkluVUkoSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLAotCQkJSVNjaGVkdWxpbmdSdWxlIHJ1bGUsIFNoZWxsIHNoZWxsKSB7Ci0JCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQlzaGVsbCA9IE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKTsKLQkJfQotCQlJUnVubmFibGVDb250ZXh0IGNvbnRleHQgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHNoZWxsKTsKLQkJdHJ5IHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkucnVuSW5VSShjb250ZXh0LAotCQkJCQlydW5uYWJsZSwgcnVsZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlOwotCQkJRXh0ZW5zaW9uTWFuYWdlci5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpLmdldE1lc3NlbmdlcigpCi0JCQkJLnNob3dFcnJvcih0aXRsZSwgZS50b1N0cmluZygpLCBudWxsLCBlKTsKLS8vCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwKLS8vCQkJCQllLnRvU3RyaW5nKCksIGUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcnVuV2l0aFByb2dyZXNzKAotCQkJZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLAotCQkJZmluYWwgSVJ1bm5hYmxlQ29udGV4dCBydW5uYWJsZUNvbnRleHQsIGZpbmFsIGJvb2xlYW4gY2FuQ2FuY2VsLAotCQkJZmluYWwgU3RyaW5nIG1zZykgewotCQlmaW5hbCBNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuT0ssCi0JCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JfcmVhc29uLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcGVyYXRpb24gPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKG1zZywgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQkJCQltb25pdG9yLnN1YlRhc2soIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJdHJ5IHsKLQkJCQkJcnVubmFibGUucnVuKG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQlTdHJpbmcgbXNnOwotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1lc3NhZ2VFeGNlcHRpb24pIHsKLQkJCQkJCW1zZyA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU3RyaW5nV3JpdGVyIHN0cldyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzdHJXcml0ZXIpKTsKLQkJCQkJCW1zZyA9IHN0cldyaXRlci50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLCAwLAotCQkJCQkJCW1zZywgZSkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCi0JCXRyeSB7Ci0JCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkgewotCQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJCS8vCi0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcnVubmFibGVDb250ZXh0LnJ1bih0cnVlLCBjYW5DYW5jZWwsIG9wZXJhdGlvbik7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfSk7Ci0JCQl9IGVsc2UgewotCQkJCXJ1bm5hYmxlQ29udGV4dC5ydW4odHJ1ZSwgY2FuQ2FuY2VsLCBvcGVyYXRpb24pOwotCQkJfQotCi0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCkKLQkJCQkJCS5nZXRNZXNzZW5nZXIoKS5zaG93RXJyb3IoCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvcl9tc2dXaXRoRGV0YWlscywKLQkJCQkJCQkJc3RhdHVzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vIFNvbWV0aGluZyB3ZW50IHdyb25nIHRoYXQgc2hvdWxkbid0LgotCQkJLy8KLQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleGNlcHRpb24pOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBEZWxpdmVyYWJsZSBpbiB3aGljaCB1c2VyIHdvdWxkIGF1dG9tYXRpY2FsbHkgYXNzaWduIGEgd3AgaW50bwotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSB3cAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBnZXREZWxpdmVyYWJsZShBY3Rpdml0eSBhY3Rpdml0eSwKLQkJCVdvcmtQcm9kdWN0IHdwKSB7Ci0KLQkJLy8gUExFQUUgRE9OJ1QgQ0xFQU4gVVAKLQkJLy8gY29tbWVudGVkIG91dCBmb3Igbm93IHNpbmNlIHdlIHNodXQtb2ZmIGF1dG9tYXRpYyBhc3NpZ25tZW50Ci0JCS8vIG9mIGRlbGl2ZXJhYmxlIGZvciBub3cKLQkJLy8gTGlzdCBkZWxpdmVyYWJsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJLy8gLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCS8vIC8vIGZpbmQgb3V0IGFsbCBkZWxpdmVyYWJsZXMgaW4gdmlzaWJsZSBzY29wZQotCQkvLyBnZXREZWxpdmVyYWJsZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCBhY3Rpdml0eSwgd3AsCi0JCS8vIGRlbGl2ZXJhYmxlTGlzdCk7Ci0JCS8vIGlmIChkZWxpdmVyYWJsZUxpc3Quc2l6ZSgpID09IDEpIHsKLQkJLy8gcmV0dXJuIChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlbGl2ZXJhYmxlTGlzdC5nZXQoMCk7Ci0JCS8vIH0KLQkJLy8gaWYgKGRlbGl2ZXJhYmxlTGlzdC5zaXplKCkgPiAxKSB7Ci0JCS8vIHJldHVybiBEZWxpdmVyYWJsZVNlbGVjdGlvbi5nZXRTZWxlY3RlZERlbGl2ZXJhYmxlKGRlbGl2ZXJhYmxlTGlzdCwKLQkJLy8gd3ApOwotCQkvLyB9Ci0JCS8vIHRoZXJlIGFyZSBubyBkZWxpdmVyYWJsZSB0byBhc3NpZ24KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUExFQVNFIERPTidUIENMRUFOIFVQLiBUaGlzIG1ldGhvZCBpcyBjdXJyZW50bHkgbm90IHVzZWQgc2luY2Ugd2UKLQkgKiBzaHV0LW9mZiBhdXRvbWF0aWMgYXNzaWdubWVudCBvZiBkZWxpdmVyYWJsZS4gR2V0IGRlbGl2ZXJhYmxlIGluIHNjb3BlCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gV29ya1Byb2R1Y3REZXNjcmlwdG9yCi0JICogQHBhcmFtIGRlbGl2ZXJhYmxlTGlzdAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0RGVsaXZlcmFibGVzSW5TY29wZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSwgV29ya1Byb2R1Y3Qgd3AsIExpc3QgZGVsaXZlcmFibGVMaXN0KSB7Ci0JCS8vIGdldCBjaGlsZHJlbiBmb3IgYWN0aXZpdHkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGUsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBpdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oZSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJaWYgKChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpCi0JCQkJCSYmIChQcm9jZXNzVXRpbAotCQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmopIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iajsKLQotCQkJCS8vIGdldCBkZWxpdmVyYWJsZSBwYXJ0cyBmcm9tIGRlbGl2ZXJhYmxlCi0JCQkJTGlzdCBwYXJ0cyA9IFByb2Nlc3NVdGlsLmdldEFzc29jaWF0ZWRFbGVtZW50TGlzdCh3cERlc2MKLQkJCQkJCS5nZXREZWxpdmVyYWJsZVBhcnRzKCkpOwotCQkJCWlmIChwYXJ0cy5jb250YWlucyh3cCkpIHsKLQkJCQkJZGVsaXZlcmFibGVMaXN0LmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGdldCBwYXJlbnQKLQkJT2JqZWN0IGN1cnJlbnRQYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KGUpOwotCQlpZiAoY3VycmVudFBhcmVudCAhPSBudWxsKSB7Ci0JCQkvLyBnbyB1cAotCQkJZ2V0RGVsaXZlcmFibGVzSW5TY29wZShhZGFwdGVyRmFjdG9yeSwKLQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIGN1cnJlbnRQYXJlbnQsIHdwLCBkZWxpdmVyYWJsZUxpc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBlbGVtZW50IGNhbiBiZSBtb2RpZmllZC4gVGhpcyBpbmNsdWRlcyBsb2NrIGNoZWNrIGFuZAotCSAqIGVkaXQgY2hlY2suCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KEVPYmplY3QgZWxlbWVudCwgU2hlbGwgc2hlbGwpIHsKLQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoZWxlbWVudCkpIHsKLQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0Ci0JCQkJCS5mb3JtYXQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuVXNlckludGVyYWN0aW9uSGVscGVyX2xvY2tlZFBsdWdpbiwKLQkJCQkJCQluZXcgT2JqZWN0W10geyBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KQotCQkJCQkJCQkJLmdldE5hbWUoKSB9KTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SWQoKSwgMCwgbXNnLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gVG5nVXRpbC5jaGVja0VkaXQoKEVPYmplY3QpIGVsZW1lbnQsIHNoZWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgZm9yIHVubW9kaWZpYWJsZSByZXNvdXJjZXMuCi0JICogCi0JICogQHBhcmFtIG1vZGlmaWVkUmVzb3VyY2VzCi0JICogICAgICAgICAgICBBIGNvbGxlY3Rpb24gb2YgcmVzb3VyY2VzLgotCSAqIEBwYXJhbSBzaGVsbAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBzaGVsbC4KLQkgKiBAcmV0dXJuIEFuIDxjb2RlPklTdGF0dXM8L2NvZGU+IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tNb2RpZnkoQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlcywgU2hlbGwgc2hlbGwpIHsKLQkJSUFjY2Vzc0NvbnRyb2xsZXIgYWMgPSBTZXJ2aWNlcy5nZXRBY2Nlc3NDb250cm9sbGVyKCk7Ci0JCWlmIChhYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlSZXNvdXJjZVtdIHJlc291cmNlcyA9IG5ldyBSZXNvdXJjZVttb2RpZmllZFJlc291cmNlcy5zaXplKCldOwotCQltb2RpZmllZFJlc291cmNlcy50b0FycmF5KHJlc291cmNlcyk7Ci0JCXJldHVybiBhYy5jaGVja01vZGlmeShyZXNvdXJjZXMsIHNoZWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElSZXNvdXJjZSBnZXRXb3Jrc3BhY2VSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAoIXJlc291cmNlLmdldFVSSSgpLmlzRmlsZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJcmV0dXJuIHdvcmtzcGFjZVJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja091dE9mU3luY2goQ29sbGVjdGlvbiByZXNvdXJjZXMpIHsKLQkJQXJyYXlMaXN0IG91dE9mU3luY2hSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCUlSZXNvdXJjZSB3c1Jlc291cmNlID0gZ2V0V29ya3NwYWNlUmVzb3VyY2UocmVzb3VyY2UpOwotCQkJaWYgKHdzUmVzb3VyY2UgIT0gbnVsbAotCQkJCQkmJiAhd3NSZXNvdXJjZS5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTykpIHsKLQkJCQlvdXRPZlN5bmNoUmVzb3VyY2VzLmFkZCh3c1Jlc291cmNlKTsKLQkJCX0KLQkJfQotCQlpZiAob3V0T2ZTeW5jaFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJTXVsdGlTdGF0dXMgbXVsdGlTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLk9LLAotCQkJCQkiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG91dE9mU3luY2hSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSVJlc291cmNlIHdzUmVzb3VyY2UgPSAoSVJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQlJU3RhdHVzLk9LLCB3c1Jlc291cmNlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpLCBudWxsKTsKLQkJCQltdWx0aVN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJCX0KLQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnVwZGF0ZV9vdXRvZnN5bmNoX3RpdGxlOwotCQkJU3RyaW5nIG1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnVwZGF0ZV9vdXRvZnN5bmNoX21zZzsKLQotCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlci5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQkJcmV0dXJuIHVpSGFuZGxlci5zZWxlY3RPbmUobmV3IGludFtdIHtJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fT0ssCi0JCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUx9LCB0aXRsZSwgbXNnLCBtdWx0aVN0YXR1cykgIT0gSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIGNoYW5nZSB0byB0aGUgZ2l2ZW4gZmVhdHVyZSBvZiB0aGUgZ2l2ZW4gZmVhdHVyZU93bmVyIHdpbGwKLQkgKiBtb2RpZnkgdGhlIGVsZW1lbnQgaW4gb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZQotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlT3duZXIKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja01vZGlmeU9wcG9zaXRlKE1ldGhvZEVsZW1lbnQgZmVhdHVyZU93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gT3Bwb3NpdGVGZWF0dXJlCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZShmZWF0dXJlKTsKLQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXJFT2JqID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlbGVtZW50OwotCQlpZiAob3Bwb3NpdGVGZWF0dXJlICE9IG51bGwgJiYgIW9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJTmFtZWRFbGVtZW50IG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlID0gKE5hbWVkRWxlbWVudCkgbXJFT2JqCi0JCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5nZXQob3Bwb3NpdGVGZWF0dXJlKTsKLQkJCWlmIChvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSAhPSBudWxsCi0JCQkJCS8vIG1ha2Ugc3VyZSB0aGUgZWxlbWVudCBpcyBzdGlsbCBpbiB0aGUgbGlicmFyeSBhbmQgbm90Ci0JCQkJCS8vIGRlbGV0ZWQgeWV0LgotCQkJCQkvLwotCQkJCQkmJiAob2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5IHx8IG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlCi0JCQkJCQkJLmVDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQkmJiBvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJLy8gc2ltcGxlIHJlamVjdCBmb3IgNy4wLjAgcmVsZWFzZQotCQkJCS8vCi0JCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQKLQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLlVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHMsCi0JCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJZWxlbWVudC5nZXROYW1lKCksCi0JCQkJCQkJCQkJVG5nVXRpbAotCQkJCQkJCQkJCQkJLmdldExhYmVsV2l0aFBhdGgob2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUpLAotCQkJCQkJCQkJCWZlYXR1cmVPd25lci5nZXROYW1lKCkgfSk7Ci0JCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dXYXJuaW5nKAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsIG1zZyk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkJLy8gVE9ETzogdW5jb21tZW50IHRvIHVzZSB0aGlzIGNvZGUgZm9yIDcuMC4xIHJlbGVhc2UKLQkJCQkvLwotCQkJCS8vIFN0cmluZyB0aXRsZSA9ICJVcGRhdGUgUmVsYXRpb25zaGlwIjsKLQkJCQkvLyBTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoIkFkZGluZyAnJ3swfScnIHRvICcnezF9JycKLQkJCQkvLyB3aWxsIHJlbW92ZSAnJ3swfScnIGZyb20gJyd7Mn0nJy4gRG8geW91IHdhbnQgdG8gY29udGludWU/IgotCQkJCS8vICwgbmV3IE9iamVjdFtdIHsgZWxlbWVudC5nZXROYW1lKCksIGZlYXR1cmVPd25lci5nZXROYW1lKCksCi0JCQkJLy8gb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUuZ2V0TmFtZSgpIH0pOwotCQkJCS8vIGlmKCFMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5Q29uZmlybWF0aW9uKHRpdGxlLAotCQkJCS8vIG1zZykpIHsKLQkJCQkvLyByZXR1cm4gZmFsc2U7Ci0JCQkJLy8gfQotCQkJCS8vCQkJCQotCQkJCS8vIElTdGF0dXMgc3RhdHVzID0KLQkJCQkvLyBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkob2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUsCi0JCQkJLy8gbnVsbCk7Ci0JCQkJLy8gaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsCi0JCQkJLy8gIkNhbm5vdCB1cGRhdGUgcmVsYXRpb25zaGlwIiwgc3RhdHVzKTsKLQkJCQkvLyByZXR1cm4gZmFsc2U7Ci0JCQkJLy8gfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjaGVja0NvbmZpZ3VyYXRpb25zVG9VcGRhdGUoQWRkQ29tbWFuZCBhZGRDb21tYW5kLAotCQkJU2hlbGwgc2hlbGwpIHsKLQkJRU9iamVjdCBwYXJlbnQgPSBhZGRDb21tYW5kLmdldE93bmVyKCk7Ci0JCWlmICghKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGFkZENvbW1hbmQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoIShmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkKLQkJCQl8fCAhKChFUmVmZXJlbmNlKSBmZWF0dXJlKS5pc0NvbnRhaW5tZW50KCkpIHsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIHRoaXMgY29tbWFuZAotCQkvLyBjYW4gYmUgbW9kaWZpZWQKLQkJLy8KLQkJQXJyYXlMaXN0IGNvbmZpZ3NUb1VwZGF0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTWV0aG9kUGFja2FnZSBwYXJlbnRQa2cgPSAoTWV0aG9kUGFja2FnZSkgcGFyZW50OwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQlUbmdVdGlsLmdldENvbmZpZ3VyYXRpb25zVG9VcGRhdGUocGFyZW50UGtnLAotCQkJCQkJKE1ldGhvZFBhY2thZ2UpIGVsZW1lbnQsIGNvbmZpZ3NUb1VwZGF0ZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFjb25maWdzVG9VcGRhdGUuaXNFbXB0eSgpKSB7Ci0JCQlDb2xsZWN0aW9uIHJlc291cmNlc1RvQ2hlY2sgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29uZmlnc1RvVXBkYXRlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgY29uZmlnID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCVJlc291cmNlIHJlc291cmNlID0gY29uZmlnLmVSZXNvdXJjZSgpOwotCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXJlc291cmNlc1RvQ2hlY2suYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBjaGVjayBhZmZlY3RlZCByZXNvdXJjZXMgZm9yIHVubW9kaWZpYWJsZQotCQkJcmV0dXJuIFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShyZXNvdXJjZXNUb0NoZWNrLCBzaGVsbCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbmZpcm1EZWVwQ29weShDb2xsZWN0aW9uIGFjdGl2aXRpZXMpIHsKLQkJaWYgKFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jYW5JbnRlcmFjdCgpKSB7Ci0JCQkvLyBjaGVja3MgaWYgdGhlIHBhdHRlcm4gb3IgYWN0aXZpdHkgY29udGFpbnMgYW55IGV4dGVuZGluZyBlbGVtZW50cwotCQkJLy8gYW5kIHByb21wdHMgdGhlIHVzZXIgaWYgaGUgcmVhbGx5Ci0JCQkvLyB3YW50cyB0byBkZWVwIGNvcHkgZHluYW1pY2FsbHkgbGlua2VkIGFjdGl2aXRpZXMgd2FybmluZyB0aGUKLQkJCS8vIHByb2Nlc3MgYXV0aG9yIHRoYXQgaGUgd2lsbCBnZXQgYSBjb3B5Ci0JCQkvLyBvZiBhbGwgZHluYW1pY2FsbHkgbGlua2VkIGVsZW1lbnRzIHRoYXQgaGUgbmVlZHMgdG8gbWFpbnRhaW4KLQkJCS8vIHNlcGFyYXRlbHkgZnJvbSBub3cgb24KLQkJCWJvb2xlYW4gcHJvbXB0TmVlZGVkID0gZmFsc2U7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpdml0aWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJJiYgUHJvY2Vzc1V0aWwuaGFzSW5oZXJpdGVkKChBY3Rpdml0eSkgZSkpIHsKLQkJCQkJcHJvbXB0TmVlZGVkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHByb21wdE5lZWRlZCkgewotCQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmRlZXBDb3B5X3RpdGxlOwotCQkJCVN0cmluZyBtc2cgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWVwQ29weV9wcm9tcHRNc2c7Ci0JCQkJaW50IHJldCA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKQotCQkJCQkuc2VsZWN0T25lKG5ldyBpbnRbXSB7Ci0JCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX1lFUywKLQkJCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fTk8KLQkJCQkJfSwgdGl0bGUsIG1zZywgbnVsbCk7Ci0JCQkJaWYgKHJldCA9PSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fTk8pIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9tcHRzIHVzZXIgdG8gY2hvb3NlIGNvbmZpZ3VyYXRpb24gZm9yIGRlZXAgY29weQotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXRQcm9jZXNzCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHJldHVybgotCSAqIEBleGNlcHRpb24gT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB1c2VyIGNhbmNlbGxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kQ29uZmlndXJhdGlvbiBjaG9vc2VEZWVwQ29weUNvbmZpZ3VyYXRpb24oCi0JCQlQcm9jZXNzIHRhcmdldFByb2Nlc3MsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUlGaWx0ZXIgZmlsdGVyID0gUHJvY2Vzc1V0aWwuZ2V0RmlsdGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWVwQ29weUNvbmZpZyA9IG51bGw7Ci0JCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSAoKElDb25maWd1cmF0b3IpIGZpbHRlcikKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjdXJyZW50Q29uZmlnICE9IG51bGwKLQkJCQkJJiYgY3VycmVudENvbmZpZyAhPSB0YXJnZXRQcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkpIHsKLQkJCQlpZiAoVXNlckludGVyYWN0aW9uSGVscGVyLmNhbkludGVyYWN0KCkpIHsKLQkJCQkJU3RyaW5nIG1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkFjdGl2aXR5RHJvcENvbW1hbmRfZGVlcENvcHlfcHJvbXB0Q29uZmlndXJhdGlvbk1zZzsKLQkJCQkJc3dpdGNoIChNc2dCb3gucHJvbXB0KG1zZykpIHsKLQkJCQkJY2FzZSBTV1QuWUVTOgotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgU1dULk5POgotCQkJCQkJZGVlcENvcHlDb25maWcgPSBjdXJyZW50Q29uZmlnOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgU1dULkNBTkNFTDoKLQkJCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBkZWVwQ29weUNvbmZpZzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjMzczZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHN1cHBvcnRpbmcgZGlhbG9ncyBmb3Igc2VsZWN0aW5nIGFuZCBlZGl0aW5nIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0FjdGl2aXR5SGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQWN0aXZpdHlIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhMWYwNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQWN0aXZpdHlIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5BY3Rpdml0eURlZXBDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Db3B5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuZG9tYWluLlRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIFVzZWQgdG8gZXh0ZW5kL2NvcHkgYWN0aXZpdGllcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlIYW5kbGVyIHsKLQotCXByaXZhdGUgQXJyYXlMaXN0IHByb2NQYWNrYWdlczsKLQkKLQlwcml2YXRlIEFycmF5TGlzdCBhY3Rpdml0aWVzVG9EZWVwQ29weTsJCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGRlZXBDb3B5Q29uZmlnOwkKLQlwcml2YXRlIExpc3QgZGVlcENvcGllczsKLQlwcml2YXRlIE1hcCBkZWVwQ29weVRvT3JpZ2luYWxNYXA7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgYWN0aXZpdGllczsKLQotCXByaXZhdGUgTWFwIGNvcHlUb09yaWdpbmFsOwotCQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0JCi0JcHJpdmF0ZSBIZWxwZXIgY29weUhlbHBlcjsKLQotCXByaXZhdGUgUHJvY2VzcyB0YXJnZXRQcm9jZXNzOwotCQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBBY3Rpdml0eUhhbmRsZXIKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlIYW5kbGVyKCkgewotCQlhY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlhY3Rpdml0aWVzVG9EZWVwQ29weSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZGVlcENvcGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZGVlcENvcHlUb09yaWdpbmFsTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJY29weVRvT3JpZ2luYWwgPSBuZXcgSGFzaE1hcCgpOwotCQlwcm9jUGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7CQotCQljb3B5SGVscGVyID0gbmV3IEhlbHBlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlhY3Rpdml0aWVzLmNsZWFyKCk7Ci0JCWFjdGl2aXRpZXNUb0RlZXBDb3B5LmNsZWFyKCk7Ci0JCWRlZXBDb3BpZXMuY2xlYXIoKTsKLQkJY29weVRvT3JpZ2luYWwuY2xlYXIoKTsKLQkJcHJvY1BhY2thZ2VzLmNsZWFyKCk7Ci0JCWNvcHlIZWxwZXIuY2xlYXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY29weShBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlwcm9jUGFja2FnZXMuYWRkKGFjdGl2aXR5LmVDb250YWluZXIoKSk7Ci0JfQotCQotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldERlZXBDb3B5Q29uZmlnKCkgewotCQlyZXR1cm4gZGVlcENvcHlDb25maWc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVlcENvcHlDb25maWcoTWV0aG9kQ29uZmlndXJhdGlvbiBkZWVwQ29weUNvbmZpZykgewotCQl0aGlzLmRlZXBDb3B5Q29uZmlnID0gZGVlcENvcHlDb25maWc7Ci0JfQotCQotCXB1YmxpYyBQcm9jZXNzIGdldFRhcmdldFByb2Nlc3MoKSB7Ci0JCXJldHVybiB0YXJnZXRQcm9jZXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldFByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MpIHsKLQkJdGFyZ2V0UHJvY2VzcyA9IHByb2M7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RGVlcENvcGllcygpIHsKLQkJcmV0dXJuIGRlZXBDb3BpZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVlcENvcHkoQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJaWYoYWN0aXZpdHkuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCWFjdGl2aXRpZXNUb0RlZXBDb3B5LmFkZChhY3Rpdml0eSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZXh0ZW5kKEFjdGl2aXR5IGFjdCkgewotCQlBY3Rpdml0eSBleHRlbmRlZEFjdCA9IFByb2Nlc3NVdGlsLmdlbmVyYWxpemUoYWN0LAotCQkJCVZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpOwotCQlhY3Rpdml0aWVzLmFkZChleHRlbmRlZEFjdCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QWN0aXZpdGllcygpIHsKLQkJaWYgKCFwcm9jUGFja2FnZXMuaXNFbXB0eSgpIHx8ICFhY3Rpdml0aWVzVG9EZWVwQ29weS5pc0VtcHR5KCkpIHsKLQkJCWVkaXRpbmdEb21haW4gPSBuZXcgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQluZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JCQlpZighcHJvY1BhY2thZ2VzLmlzRW1wdHkoKSkgewotCQkJCWFjdGl2aXRpZXMuYWRkQWxsKGNvcHkocHJvY1BhY2thZ2VzKSk7Ci0JCQl9Ci0JCQlpZighYWN0aXZpdGllc1RvRGVlcENvcHkuaXNFbXB0eSgpKSB7Ci0JCQkJQ29weUhlbHBlciBoZWxwZXIgPSBuZXcgQ29weUhlbHBlcigpOwkKLQkJCQl0cnkgewotCQkJCQlpZihtb25pdG9yID09IG51bGwpIHsKLQkJCQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJCQl9Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXRpZXNUb0RlZXBDb3B5Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBpdGVyLm5leHQoKTsKLQkJCQkJCUFjdGl2aXR5RGVlcENvcHlDb21tYW5kIGNtZCA9IG5ldyBBY3Rpdml0eURlZXBDb3B5Q29tbWFuZChhY3QsIGhlbHBlciwgZGVlcENvcHlDb25maWcsIHRhcmdldFByb2Nlc3MsIG1vbml0b3IpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQljbWQuZXhlY3V0ZSgpOwotCQkJCQkJCUNvbGxlY3Rpb24gcmVzdWx0ID0gY21kLmdldFJlc3VsdCgpOwotCQkJCQkJCWlmKCFyZXN1bHQuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCWNtZC5jb3B5U3VwcHJlc3Npb25TdGF0ZXMoKTsKLQkJCQkJCQkJZGVlcENvcGllcy5hZGRBbGwocmVzdWx0KTsKLQkJCQkJCQkJZGVlcENvcHlUb09yaWdpbmFsTWFwLnB1dChyZXN1bHQuaXRlcmF0b3IoKS5uZXh0KCksIGFjdCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJY21kLmRpc3Bvc2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaGVscGVyLmNsZWFyKCk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIGZpeCBicmVha2Rvd24gZWxlbWVudCBvcmRlciBvZiBhbGwgYWN0aXZpdGllcwotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVlcENvcGllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJUHJvY2Vzc1V0aWwuZml4QnJlYWtkb253RWxlbWVudE9yZGVyUmVjdXJzaXZlbHkoKEFjdGl2aXR5KSBpdGVyLm5leHQoKSk7CQkJCQkKLQkJCQl9Ci0JCQkJCi0JCQkJYWN0aXZpdGllcy5hZGRBbGwoZGVlcENvcGllcyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYWN0aXZpdGllczsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVByZWRlY2Vzc29ycyhMaXN0IHdvcmtCcmVha2Rvd25FbGVtZW50cykgewotCQkvLyBnZXQgdGhlIHByZWRlc3NvciBsaXN0cyBvZiBvcmlnaW5hbCB3b3JrIGJyZWFrZG93biBlbGVtZW50cwotCQkvLwotCQlMaXN0IHByZWRlY2Vzc29yTGlzdHMgPSBuZXcgQXJyYXlMaXN0KCk7CQkKLQkJT2JqZWN0IG9yaWdpbmFsID0gY29weVRvT3JpZ2luYWwuZ2V0KHdvcmtCcmVha2Rvd25FbGVtZW50cy5nZXQoMCkpOwotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGVkaXRpbmdEb21haW4uZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQob3JpZ2luYWwsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWludCBmaXJzdElEID0gYnNJdGVtUHJvdmlkZXIuZ2V0SWQoKTsgCi0JCXByZWRlY2Vzc29yTGlzdHMuYWRkKGJzSXRlbVByb3ZpZGVyLmdldFByZWRlY2Vzc29ycygpKTsKLQkJLy8gSXRlbSBwcm92aWRlciBvZiBsYXN0IHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4gdGhlIHN1YnRyZWUgd2hvc2Ugcm9vdCBpcyBvcmlnaW5hbCBhY3Rpdml0eQotCQlJQlNJdGVtUHJvdmlkZXIgbGFzdFdCSXAgPSBudWxsOwotCQlmb3IoSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihhZGFwdGVyRmFjdG9yeSwgb3JpZ2luYWwsIGZhbHNlKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0JCQlpZihlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlJQlNJdGVtUHJvdmlkZXIgYnNJcCA9IG51bGw7Ci0JCQkJaWYob2JqIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWJzSXAgPSAoKElCU0l0ZW1Qcm92aWRlcilvYmopOwotCQkJCQlwcmVkZWNlc3Nvckxpc3RzLmFkZChic0lwLmdldFByZWRlY2Vzc29ycygpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCU9iamVjdCBpcCA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJaWYoaXAgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCWJzSXAgPSAoKElCU0l0ZW1Qcm92aWRlcilpcCk7Ci0JCQkJCQlwcmVkZWNlc3Nvckxpc3RzLmFkZChic0lwLmdldFByZWRlY2Vzc29ycygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihic0lwICE9IG51bGwpIHsKLQkJCQkJbGFzdFdCSXAgPSBic0lwOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpbnQgbGFzdElEID0gbGFzdFdCSXAgIT0gbnVsbCA/IGxhc3RXQklwLmdldElkKCkgOiBmaXJzdElEOwotCQkKLQkJLy8gdXBkYXRlIHByZWRlY2Vzc29ycwotCQkvLwotCQlpbnQgc2l6ZSA9IHdvcmtCcmVha2Rvd25FbGVtZW50cy5zaXplKCk7Ci0JCUFzc2VydC5pc1RydWUoc2l6ZSA9PSBwcmVkZWNlc3Nvckxpc3RzLnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSB3b3JrQnJlYWtkb3duRWxlbWVudHMuZ2V0KGkpOwotCQkJZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLmNsZWFyKCk7Ci0JCQlQcmVkZWNlc3Nvckxpc3QgcHJlZExpc3QgPSAoUHJlZGVjZXNzb3JMaXN0KSBwcmVkZWNlc3Nvckxpc3RzLmdldChpKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwcmVkTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaW50IGlkID0gYnNJdGVtUHJvdmlkZXIuZ2V0SWQoKTsKLQkJCQlpZihpZCA+PSBmaXJzdElEICYmIGlkIDw9IGxhc3RJRCkgewotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSB3b3JrQnJlYWtkb3duRWxlbWVudHMuZ2V0KGlkIC0gZmlyc3RJRCk7Ci0JCQkJCWUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5hZGQoVW1hVXRpbC5jcmVhdGVEZWZhdWx0V29ya09yZGVyKGUsIHByZWQpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHByZWRlY2Vzc29yIGlzIG91dHNpZGUgb2YgdGhlIHN1YnRyZWUsIGRvbid0IHNlbGVjdCBpdCBmb3Igbm93Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgQ29sbGVjdGlvbiBjb3B5UHJvY2Vzc1BhY2thZ2VzKENvbGxlY3Rpb24gcHJvY1BhY2thZ2VzKSB7Ci0JCUNvbW1hbmQgY29tbWFuZCA9IGNyZWF0ZUNvcHlDb21tYW5kKGVkaXRpbmdEb21haW4sIHByb2NQYWNrYWdlcyk7Ci0JCWlmKGNvbW1hbmQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJCQlyZXR1cm4gY29tbWFuZC5nZXRSZXN1bHQoKTsKLQkJCX0gZmluYWxseSB7CQkJCi0JCQkJY29tbWFuZC5kaXNwb3NlKCk7CQkJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCQkKLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYSBjb21tYW5kIHRoYXQgY29waWVzIHRoZSBnaXZlbiBjb2xsZWN0aW9uIG9mIG9iamVjdHMuIElmIHRoZSBjb2xsZWN0aW9uIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgb2JqZWN0LAotCSAqIHRoZW4gYSBjb21wb3VuZCBjb21tYW5kIHdpbGwgYmUgY3JlYXRlZCBjb250YWluaW5nIGluZGl2aWR1YWwgY29weSBjb21tYW5kcyBmb3IgZWFjaCBvYmplY3QuCi0JICovCi0JcHJpdmF0ZSBDb21tYW5kIGNyZWF0ZUNvcHlDb21tYW5kKGZpbmFsIEVkaXRpbmdEb21haW4gZG9tYWluLCBmaW5hbCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pCi0JewotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsIHx8IGNvbGxlY3Rpb24uaXNFbXB0eSgpKSAKLQkJewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQotCQlDb21wb3VuZENvbW1hbmQgY29weUNvbW1hbmQgPSBuZXcgQ29tcG91bmRDb21tYW5kKENvbXBvdW5kQ29tbWFuZC5NRVJHRV9DT01NQU5EX0FMTCk7Ci0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7ICkKLQkJewotCQkJY29weUNvbW1hbmQuYXBwZW5kKGRvbWFpbi5jcmVhdGVDb21tYW5kKENvcHlDb21tYW5kLmNsYXNzLCBuZXcgQ29tbWFuZFBhcmFtZXRlcihvYmplY3RzLm5leHQoKSwgbnVsbCwgY29weUhlbHBlcikpKTsKLQkJfQotCi0JCXJldHVybiBjb3B5Q29tbWFuZC51bndyYXAoKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBDb3BpZXMgdGhlIGdpdmVuIHByb2Nlc3MgcGFja2FnZXMKLQkgKiAKLQkgKiBAcGFyYW0gZWRpdGluZ0RvbWFpbgotCSAqIEBwYXJhbSBwcm9jUGFja2FnZXMKLQkgKiBAcmV0dXJuIGFjdGl2aXRpZXMgb2YgdGhlIGNvcGllcwotCSAqLwotCXByaXZhdGUgTGlzdCBjb3B5KExpc3QgcHJvY1BhY2thZ2VzKSB7Ci0JCUNvbGxlY3Rpb24gY29weVBhY2thZ2VzID0gY29weVByb2Nlc3NQYWNrYWdlcyhwcm9jUGFja2FnZXMpOwotCQlBcnJheUxpc3QgYWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29weVBhY2thZ2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUHJvY2Vzc1BhY2thZ2UgY29weSA9IChQcm9jZXNzUGFja2FnZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoY29weSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlBY3Rpdml0eSBhY3RDb3B5ID0gKChQcm9jZXNzQ29tcG9uZW50KSBjb3B5KQotCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkJLy8gY29weSBkYXRhIGZyb20gUHJvY2Vzc0NvbXBvbmVudCB0byBhIG5ldwotCQkJCS8vIFByb2Nlc3NQYWNrYWdlCi0JCQkJUHJvY2Vzc1BhY2thZ2UgcGtnQ29weSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQkJcGtnQ29weS5zZXROYW1lKGFjdENvcHkuZ2V0TmFtZSgpKTsKLQkJCQlwa2dDb3B5LmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChhY3RDb3B5KTsKLQkJCQlwa2dDb3B5LmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbCgKLQkJCQkJCWNvcHkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkpOwotCQkJCXBrZ0NvcHkuZ2V0RGlhZ3JhbXMoKS5hZGRBbGwoY29weS5nZXREaWFncmFtcygpKTsKLQkJCQlwa2dDb3B5LmdldENoaWxkUGFja2FnZXMoKS5hZGRBbGwoCi0JCQkJCQljb3B5LmdldENoaWxkUGFja2FnZXMoKSk7Ci0JCQkJCi0JCQkJYWN0aXZpdGllcy5hZGQoYWN0Q29weSk7Ci0JCQl9IGVsc2UgewotCQkJCWFjdGl2aXRpZXMuYWRkKFByb2Nlc3NVdGlsLmZpbmRBY3Rpdml0eShjb3B5KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFjdGl2aXRpZXM7Ci0JfQotCi0JcHVibGljIE1hcCBnZXREZWVwQ29weVRvT3JpZ2luYWxNYXAoKSB7Ci0JCXJldHVybiBkZWVwQ29weVRvT3JpZ2luYWxNYXA7Ci0JfQotCQotCXB1YmxpYyBIZWxwZXIgZ2V0Q29weUhlbHBlcigpewotCQlyZXR1cm4gY29weUhlbHBlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9BY3Rpdml0eVRyZWVJdGVyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQWN0aXZpdHlUcmVlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDNkOTFjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9BY3Rpdml0eVRyZWVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotCi0vKioKLSAqIEludGVyYXRvciB1c2VkIHRvIGl0ZXJhdGUgdGhlIGJyZWFrZG93biBlbGVtZW50IHRyZWUgb2YgYW4gYWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5VHJlZUl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjQwMjAxNzc2ODIwNTY0MjA2OEw7Ci0KLQlwdWJsaWMgQWN0aXZpdHlUcmVlSXRlcmF0b3IoQWN0aXZpdHkgYWN0KSB7Ci0JCXN1cGVyKGFjdCwgZmFsc2UpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlyZXR1cm4gKChBY3Rpdml0eSkgb2JqZWN0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NhdGVnb3J5U29ydEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ2F0ZWdvcnlTb3J0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBjM2VmMmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ2F0ZWdvcnlTb3J0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBoYW5kbGUgc29ydGluZyBvZiBDYXRlZ29yeSBlbGVtZW50cwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcnlTb3J0SGVscGVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRSA9ICJDYXRlZ29yeUVsZW1lbnRzU29ydFR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX0FMUEhBID0gIkFscGhhYmV0aWMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX1JFVkVSU0VfQUxQSEEgPSAiUmV2ZXJzZUFscGhhYmV0aWMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01FVEhPRF9UWVBFID0gIk1ldGhvZFR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01BTlVBTCA9ICJNYW51YWwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSB0byBzdG9yZSB0aGUgQ2F0ZWdvcnkgc29ydCB0eXBlCi0JICogQHBhcmFtIHNvcnRUeXBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudFByb3BlcnR5IGNyZWF0ZU5ld1NvcnRQcm9wZXJ0eShTdHJpbmcgc29ydFR5cGUpIHsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJcHJvcC5zZXROYW1lKEtFWV9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFKTsKLQkJaWYgKHNvcnRUeXBlICE9IG51bGwpIHsKLQkJCXByb3Auc2V0VmFsdWUoc29ydFR5cGUpOwotCQl9Ci0JCXJldHVybiBwcm9wOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gY2F0ZWdvcnkgc29ydCBwcm9wZXJ0eSBmb3IgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKiAJCSBwcm9wZXJ0eSBpZiBmb3VuZCwgZWxzZSBudWxsCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50UHJvcGVydHkgZ2V0Q2F0ZWdvcnlTb3J0UHJvcGVydHkoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCUxpc3QgcHJvcHMgPSBlbGVtZW50LmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvcHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSAoTWV0aG9kRWxlbWVudFByb3BlcnR5KSBpdC5uZXh0KCk7Ci0JCQlpZiAoS0VZX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEUuZXF1YWxzKHByb3AuZ2V0TmFtZSgpKSkgewotCQkJCXJldHVybiBwcm9wOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiByZXR1cm4gdHJ1ZSBpZmYgdGhlIGNhdGVnb3J5IHNvcnQtdHlwZSBpcyBzZXQgdG8gbWFudWFsCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICogCQkgcHJvcGVydHkgaWYgZm91bmQsIGVsc2UgbnVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01hbnVhbENhdGVnb3J5U29ydChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHNvcnRUeXBlID0gZ2V0Q2F0ZWdvcnlTb3J0VmFsdWUoZWxlbWVudCk7Ci0JCWlmIChWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfTUFOVUFMLmVxdWFscyhzb3J0VHlwZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNvcnQtdHlwZSBmb3IgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQuCi0JICogSWYgbm9uZSBpcyBzZXQsIHdpbGwgcmV0dXJuIEFscGhhYmV0aWMgc29ydCAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX0FMUEhBKSBhcyBhIGRlZmF1bHQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDYXRlZ29yeVNvcnRWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBnZXRDYXRlZ29yeVNvcnRQcm9wZXJ0eShlbGVtZW50KTsKLQkJaWYgKHByb3AgPT0gbnVsbCkKLQkJCXJldHVybiBWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfQUxQSEE7Ci0JCXJldHVybiBwcm9wLmdldFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0Q2F0ZWdvcnlTb3J0VHlwZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXR1cm5MaXN0ID0gQXJyYXlzLjxTdHJpbmc+YXNMaXN0KAotCQkJCVZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9NQU5VQUwsCi0JCQkJVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX0FMUEhBLAotCQkJCVZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9SRVZFUlNFX0FMUEhBLAotCQkJCVZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9NRVRIT0RfVFlQRSk7Ci0JCXJldHVybiByZXR1cm5MaXN0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNvcnRUeXBlRGlzcGxheU5hbWUoU3RyaW5nIHNvcnRUeXBlKSB7Ci0JCWlmIChWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfQUxQSEEuZXF1YWxzKHNvcnRUeXBlKSkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLlNvcnRUeXBlX0FscGhhYmV0aWM7Ci0JCX0KLQkJaWYgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9SRVZFUlNFX0FMUEhBLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5Tb3J0VHlwZV9SZXZlcnNlQWxwaGFiZXRpYzsKLQkJfQotCQlpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01FVEhPRF9UWVBFLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5Tb3J0VHlwZV9NZXRob2RUeXBlOwotCQl9Ci0JCWlmIChWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfTUFOVUFMLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5Tb3J0VHlwZV9NYW51YWw7Ci0JCX0KLQkJcmV0dXJuICIiOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgc29ydGVkIGNhdGVnb3J5IGVsZW1lbnQgbGlzdCBiYXNlZCBvbiB0aGUgY2F0ZWdvcnkncyBzb3J0IHR5cGUKLQkgKiBSZXNwZWN0cyB0aGUgTmFtZS9QcmVzTmFtZSB0b2dnbGUKLQkgKiBAcGFyYW0gZWxlbWVudCAKLQkgKiBAcGFyYW0gZWxlbWVudHMgYXJyYXkgdG8gc29ydAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0PiBzb3J0Q2F0ZWdvcnlFbGVtZW50cyhNZXRob2RFbGVtZW50IGVsZW1lbnQsIE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0JCXJldHVybiBzb3J0Q2F0ZWdvcnlFbGVtZW50cyhlbGVtZW50LCBlbGVtZW50cywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzb3J0ZWQgY2F0ZWdvcnkgZWxlbWVudCBsaXN0IGJhc2VkIG9uIHRoZSBjYXRlZ29yeSdzIHNvcnQgdHlwZQotCSAqIEBwYXJhbSBlbGVtZW50IAotCSAqIEBwYXJhbSBlbGVtZW50cyBhcnJheSB0byBzb3J0Ci0JICogQHBhcmFtIGZvcmNlUHJlc05hbWVTb3J0IHRydWUgdG8gYWx3YXlzIHNvcnQgYnkgcHJlc05hbWUuIGZhbHNlIHdpbGwgcmVzcGVjdCB0aGUgdG9nZ2xlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3Q+IHNvcnRDYXRlZ29yeUVsZW1lbnRzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgT2JqZWN0W10gZWxlbWVudHMsIGJvb2xlYW4gZm9yY2VQcmVzTmFtZVNvcnQpIHsKLQkJLyoKLQkJICogVE9ETzogY2FuJ3QgdXNlIGdlbmVyaWNzIGhlcmUgYmVjYXVzZSBFTUYgZG9lc24ndCB1c2UgdGhlbSB5ZXQgLSB0aGUgZWxlbWVudHMgcGFyYW0KLQkJICogdXN1YWxseSBjb21lcyBmcm9tIENvbnRlbnRFbGVtZW50c09yZGVyTGlzdCBjbGFzcyB3aGljaCBleHRlbmRzIEVNRidzIEJhc2ljRUxpc3QgYW5kIHNvCi0JCSAqIHRoZSB0b0FycmF5KCkgbWV0aG9kIHdpbGwgb25seSByZXR1cm4gT2JqZWN0W10KLQkJICovCi0JCUxpc3Q8T2JqZWN0PiByZXR1cm5MaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KEFycmF5cy48T2JqZWN0PmFzTGlzdChlbGVtZW50cykpOwotCQlTdHJpbmcgc29ydFR5cGUgPSBnZXRDYXRlZ29yeVNvcnRWYWx1ZShlbGVtZW50KTsKLQkJaWYgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9NQU5VQUwuZXF1YWxzKHNvcnRUeXBlKSkgewotCQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JCX0gZWxzZSBpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX0FMUEhBLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0Q29tcGFyYXRvcigpOwotCQkJaWYgKGZvcmNlUHJlc05hbWVTb3J0KQotCQkJCWNvbXBhcmF0b3IgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldFByZXNOYW1lQ29tcGFyYXRvcigpOwotCQkJQ29sbGVjdGlvbnMuPE9iamVjdD5zb3J0KHJldHVybkxpc3QsIGNvbXBhcmF0b3IpOwotCQl9IGVsc2UgaWYgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9SRVZFUlNFX0FMUEhBLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0UmV2ZXJzZUNvbXBhcmF0b3IoKTsKLQkJCWlmIChmb3JjZVByZXNOYW1lU29ydCkKLQkJCQljb21wYXJhdG9yID0gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRQcmVzTmFtZVJldmVyc2VDb21wYXJhdG9yKCk7Ci0JCQlDb2xsZWN0aW9ucy48T2JqZWN0PnNvcnQocmV0dXJuTGlzdCwgY29tcGFyYXRvcik7Ci0JCX0gZWxzZSBpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01FVEhPRF9UWVBFLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudFR5cGVDb21wYXJhdG9yKCk7Ci0JCQlpZiAoZm9yY2VQcmVzTmFtZVNvcnQpCi0JCQkJY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0UHJlc05hbWVNZXRob2RFbGVtZW50VHlwZUNvbXBhcmF0b3IoKTsKLQkJCUNvbGxlY3Rpb25zLjxPYmplY3Q+c29ydChyZXR1cm5MaXN0LCBjb21wYXJhdG9yKTsKLQkJfQotCQlyZXR1cm4gcmV0dXJuTGlzdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db21wYXJhdG9ycy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29tcGFyYXRvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWZhMGQ5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db21wYXJhdG9ycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLlBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0KLS8qKgotICogQ29sbGVjdGlvbiBvZiBjb21wYXJhdG9ycwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29tcGFyYXRvcnMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPE9iamVjdD4gREVGQVVMVF9DT01QQVJBVE9SID0gbmV3IENvbXBhcmF0b3I8T2JqZWN0PigpIHsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCWlmIChvMSA9PSBvMikKLQkJCQlyZXR1cm4gMDsKLQkJCUNvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkJCWlmIChvMSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgbzIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGNvbGxhdG9yLmNvbXBhcmUoKChNZXRob2RFbGVtZW50KSBvMSkuZ2V0TmFtZSgpLCAoKE1ldGhvZEVsZW1lbnQpIG8yKS5nZXROYW1lKCkpOwotCQkJfQotCQkJT2JqZWN0IG8xdW53cmFwID0gVG5nVXRpbC51bndyYXAobzEpOwotCQkJT2JqZWN0IG8ydW53cmFwID0gVG5nVXRpbC51bndyYXAobzIpOwotCQkJaWYgKG8xdW53cmFwIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkmJiBvMnVud3JhcCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gY29sbGF0b3IuY29tcGFyZSgoKE1ldGhvZEVsZW1lbnQpIG8xdW53cmFwKS5nZXROYW1lKCksICgoTWV0aG9kRWxlbWVudCkgbzJ1bndyYXApLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JfTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8T2JqZWN0PiBSRVZFUlNFX0RFRkFVTFRfQ09NUEFSQVRPUiA9IG5ldyBDb21wYXJhdG9yPE9iamVjdD4oKSB7Ci0KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlpZiAobzEgPT0gbzIpCi0JCQkJcmV0dXJuIDA7Ci0JCQlDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7Ci0JCQlpZiAobzEgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIG8yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXJldHVybiBvcHBvc2l0ZVZhbHVlKGNvbGxhdG9yLmNvbXBhcmUoKChNZXRob2RFbGVtZW50KSBvMSkuZ2V0TmFtZSgpLCAoKE1ldGhvZEVsZW1lbnQpIG8yKS5nZXROYW1lKCkpKTsKLQkJCX0KLQkJCU9iamVjdCBvMXVud3JhcCA9IFRuZ1V0aWwudW53cmFwKG8xKTsKLQkJCU9iamVjdCBvMnVud3JhcCA9IFRuZ1V0aWwudW53cmFwKG8yKTsKLQkJCWlmIChvMXVud3JhcCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJJiYgbzJ1bndyYXAgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIG9wcG9zaXRlVmFsdWUoY29sbGF0b3IuY29tcGFyZSgoKE1ldGhvZEVsZW1lbnQpIG8xdW53cmFwKS5nZXROYW1lKCksICgoTWV0aG9kRWxlbWVudCkgbzJ1bndyYXApLmdldE5hbWUoKSkpOwotCQkJfQotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCX07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgaW50IG9wcG9zaXRlVmFsdWUoaW50IHZhbCkgewotCQlpZiAodmFsICE9IDApIHsKLQkJCXZhbCA9IDAgLSB2YWw7Ci0JCX0KLQkJcmV0dXJuIHZhbDsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgVHlwZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQkJcHJvdGVjdGVkIENvbXBhcmF0b3I8T2JqZWN0PiBnZXREZWZhdWx0Q29tcGFyYXRvcigpIHsKLQkJCXJldHVybiBERUZBVUxUX0NPTVBBUkFUT1I7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0T3JkZXJJZChPYmplY3Qgb2JqKTsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCW8xID0gVG5nVXRpbC51bndyYXAobzEpOwotCQkJbzIgPSBUbmdVdGlsLnVud3JhcChvMik7Ci0JCQlpZiAobzEgPT0gbzIpCi0JCQkJcmV0dXJuIDA7Ci0JCQlpbnQgcmV0ID0gMDsKLQkJCXJldCA9IGdldE9yZGVySWQoKEVPYmplY3QpIG8xKSAtIGdldE9yZGVySWQoKEVPYmplY3QpIG8yKTsKLQkJCWlmIChyZXQgPT0gMCkgewotCQkJCXJldHVybiBnZXREZWZhdWx0Q29tcGFyYXRvcigpLmNvbXBhcmUobzEsIG8yKTsKLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBjb21wYXJlUHJlc2VudGF0aW9uTmFtZShEZXNjcmliYWJsZUVsZW1lbnQgZTEsIERlc2NyaWJhYmxlRWxlbWVudCBlMikgewotCQlDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7Ci0JCVN0cmluZyBuYW1lMSA9IGUxIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCA/IFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoKEJyZWFrZG93bkVsZW1lbnQpZTEpCi0JCQkJOiBlMS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCWlmIChuYW1lMS5sZW5ndGgoKSA8IDEpIG5hbWUxID0gZTEuZ2V0TmFtZSgpOwotCQlTdHJpbmcgbmFtZTIgPSBlMiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQgPyBQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KWUyKQotCQkJCTogZTIuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQlpZiAobmFtZTIubGVuZ3RoKCkgPCAxKSBuYW1lMiA9IGUyLmdldE5hbWUoKTsKLQkJcmV0dXJuIGNvbGxhdG9yLmNvbXBhcmUobmFtZTEsIG5hbWUyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUiA9IG5ldyBDb21wYXJhdG9yKCkgewotCQkKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlpZiAobzEgPT0gbzIpCi0JCQkJcmV0dXJuIDA7Ci0JCQlpZighKG8xIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSkgewotCQkJCW8xID0gVG5nVXRpbC51bndyYXAobzEpOwotCQkJCWlmKCEobzEgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCX0KLQkJCWlmKCEobzIgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpKSB7Ci0JCQkJbzIgPSBUbmdVdGlsLnVud3JhcChvMik7Ci0JCQkJaWYoIShvMiBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNvbXBhcmVQcmVzZW50YXRpb25OYW1lKChEZXNjcmliYWJsZUVsZW1lbnQpIG8xLCAoRGVzY3JpYmFibGVFbGVtZW50KSBvMik7Ci0JCX0KLQotCX07Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIFJFVkVSU0VfUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUiA9IG5ldyBDb21wYXJhdG9yKCkgewotCQkKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlpZiAobzEgPT0gbzIpCi0JCQkJcmV0dXJuIDA7Ci0JCQlpZighKG8xIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSkgewotCQkJCW8xID0gVG5nVXRpbC51bndyYXAobzEpOwotCQkJCWlmKCEobzEgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCX0KLQkJCWlmKCEobzIgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpKSB7Ci0JCQkJbzIgPSBUbmdVdGlsLnVud3JhcChvMik7Ci0JCQkJaWYoIShvMiBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG9wcG9zaXRlVmFsdWUoY29tcGFyZVByZXNlbnRhdGlvbk5hbWUoKERlc2NyaWJhYmxlRWxlbWVudCkgbzEsIChEZXNjcmliYWJsZUVsZW1lbnQpIG8yKSk7Ci0JCX0KLQotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgTUVUSE9EX1RZUEVfQ09NUEFSQVRPUiA9IG5ldyBUeXBlQ29tcGFyYXRvcigpIHsKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9ycy5UeXBlQ29tcGFyYXRvciNnZXREZWZhdWx0Q29tcGFyYXRvcigpCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ29tcGFyYXRvciBnZXREZWZhdWx0Q29tcGFyYXRvcigpIHsKLQkJCXJldHVybiBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldENvbXBhcmF0b3IoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBpbnQgZ2V0T3JkZXJJZChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCWludCBpZCA9ICgoTWV0aG9kRWxlbWVudCkgb2JqKS5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKTsKLQkJCQlpZiAoaWQgPT0gVW1hUGFja2FnZS5URVJNX0RFRklOSVRJT04pIHsKLQkJCQkJaWQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGlkOwotCQkJfQotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfTsKLQkKLQkvKioKLQkgKiBBbHdheXMgc29ydCBieSBwcmVzZW50YXRpb24gbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBNRVRIT0RfVFlQRV9QUkVTX05BTUVfQ09NUEFSQVRPUiA9IG5ldyBUeXBlQ29tcGFyYXRvcigpIHsKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9ycy5UeXBlQ29tcGFyYXRvciNnZXREZWZhdWx0Q29tcGFyYXRvcigpCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ29tcGFyYXRvciBnZXREZWZhdWx0Q29tcGFyYXRvcigpIHsKLQkJCXJldHVybiBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldFByZXNOYW1lQ29tcGFyYXRvcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIGludCBnZXRPcmRlcklkKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJaW50IGlkID0gKChNZXRob2RFbGVtZW50KSBvYmopLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpOwotCQkJCWlmIChpZCA9PSBVbWFQYWNrYWdlLlRFUk1fREVGSU5JVElPTikgewotCQkJCQlpZCA9IEludGVnZXIuTUFYX1ZBTFVFOwotCQkJCX0KLQkJCQlyZXR1cm4gaWQ7Ci0JCQl9Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIFBMVUdJTlBBQ0tBR0VfQ09NUEFSQVRPUiA9IG5ldyBDb21wYXJhdG9yKCkgewotCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCWlmIChvMSA9PSBvMikKLQkJCQlyZXR1cm4gMDsKLQkJCW8xID0gVG5nVXRpbC51bndyYXAobzEpOwotCQkJbzIgPSBUbmdVdGlsLnVud3JhcChvMik7Ci0JCQkKLQkJCQotCQkJaWYgKG8xIGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlciAmJiBvMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWlmIChvMSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiAmJiBvMiBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkKLQkJCWJvb2xlYW4gdXNlUHJlc05hbWUgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmlzU2hvd1ByZXNlbnRhdGlvbk5hbWVzKCk7Ci0JCQlTdHJpbmcgczEgPSBudWxsOwotCQkJU3RyaW5nIHMyID0gbnVsbDsKLQkJCWlmICh1c2VQcmVzTmFtZSAmJiBvMSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJCXMxID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIG8xKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQl9IGVsc2UgaWYgKG8xIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXMxID0gKChNZXRob2RFbGVtZW50KSBvMSkuZ2V0TmFtZSgpOwotCQkJfSBlbHNlIGlmIChvMSBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlzMSA9ICgoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgbzEpLmdldEZ1bGxOYW1lKCk7Ci0JCQl9IGVsc2UgaWYgKG8xIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJczEgPSAoU3RyaW5nKSBvMTsKLQkJCX0gCi0JCQkKLQkJCWlmICh1c2VQcmVzTmFtZSAmJiBvMiBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJCXMyID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIG8yKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQl9IGVsc2UgaWYgKG8yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXMyID0gKChNZXRob2RFbGVtZW50KSBvMikuZ2V0TmFtZSgpOwotCQkJfSBlbHNlIGlmIChvMiBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlzMiA9ICgoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgbzIpLmdldEZ1bGxOYW1lKCk7Ci0JCQl9IGVsc2UgaWYgKG8yIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJczIgPSAoU3RyaW5nKSBvMjsKLQkJCX0KLQkJCQotCQkJaWYgKHMxID09IG51bGwgfHwgczIgPT0gbnVsbCkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gczEuY29tcGFyZVRvSWdub3JlQ2FzZShzMik7Ci0JCX0KLQl9OwotCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFmNGFlYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLQotCi0vKioKLSAqIEluc3RhbmNlIG9mIHRoaXMgY2xhc3MgY2FuIGJlIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWx0ZXIKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdWwgMjcsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvLyBwcml2YXRlIFNldCBkaXNwb3NhYmxlQWRhcHRlcnM7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3Rvcmllcyk7Ci0JfQotCi0JLy8gcHJpdmF0ZSBTZXQgZ2V0RGlzcG9zYWJsZUFkYXB0ZXJzKCkgewotCS8vIGlmKGRpc3Bvc2FibGVBZGFwdGVycyA9PSBudWxsKSB7Ci0JLy8gZGlzcG9zYWJsZUFkYXB0ZXJzID0gbmV3IEhhc2hTZXQoKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIGRpc3Bvc2FibGVBZGFwdGVyczsKLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5I2FkYXB0KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDb25maWd1cmFibGUpIHsKLQkJCSgoSUNvbmZpZ3VyYWJsZSkgYWRhcHRlcikuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCX0KLQkJLy8gaWYoYWRhcHRlciBpbnN0YW5jZW9mIElEaXNwb3NhYmxlKSB7Ci0JCS8vIGdldERpc3Bvc2FibGVBZGFwdGVycygpLmFkZChhZGFwdGVyKTsKLQkJLy8gfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5I2FkYXB0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IHN1cGVyLmFkYXB0KHRhcmdldCwgdHlwZSk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYWJsZSkgewotCQkJKChJQ29uZmlndXJhYmxlKSBhZGFwdGVyKS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJfQotCQkvLyBpZihhZGFwdGVyIGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJLy8gZ2V0RGlzcG9zYWJsZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOwotCQkvLyB9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSNkaXNwb3NlKCkKLQkvLyAqLwotCS8vIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JLy8gaWYoZGlzcG9zYWJsZUFkYXB0ZXJzICE9IG51bGwgJiYgIWRpc3Bvc2FibGVBZGFwdGVycy5pc0VtcHR5KCkpIHsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaXNwb3NhYmxlQWRhcHRlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gSURpc3Bvc2FibGUgYWRhcHRlciA9IChJRGlzcG9zYWJsZSkgaXRlci5uZXh0KCk7Ci0JLy8gYWRhcHRlci5kaXNwb3NlKCk7Ci0JLy8gfQotCS8vIH0KLQkvLyBzdXBlci5kaXNwb3NlKCk7Ci0JLy8gfQotCi0JcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3RvcnkjZmlyZU5vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdHJ5IHsKLQkJCXN1cGVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJaWYgKG5vdGlmaWNhdGlvbiBpbnN0YW5jZW9mIFZpZXdlck5vdGlmaWNhdGlvbikgewotCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQotCQkJCVN0cmluZ1dyaXRlciBzdHJXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHN0cldyaXRlcikpOwotCQkJCU1lc3Nlbmdlci5JTlNUQU5DRQotCQkJCQkJLnNob3dFcnJvcigKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfZmF0YWxlcnIsCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3JlZmVyc2hpbmd2aWV3ZXIsCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3VuaGFuZGxlZF9leGNlcHRpb24sCi0JCQkJCQkJCXN0cldyaXRlci50b1N0cmluZygpLCBlKTsgCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJdGhyb3cgZTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25zdHJhaW50TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29uc3RyYWludE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmZjNjIwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25zdHJhaW50TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdGhhdCBtYW5hZ2VzIHRoZSB1c2Ugb2YgQ29udHJhaW50IGluIGxpYnJhcnkgdG8gc3RvcmUKLSAqIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGRhdGEKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBEZWMgMSwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29uc3RyYWludE1hbmFnZXIgewotCS8qKiBDb25zdGFudHMgZm9yIGNvbnRyYWluIG5hbWUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0lUSVZZX0RJQUdSQU0gPSAiZGlhZ3JhbSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NfU1VQUFJFU1NJT04gPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdHJhaW50IGdldENvbnN0cmFpbnQoTWV0aG9kRWxlbWVudCBlLAotCQkJU3RyaW5nIGNvbnN0cmFpbnROYW1lLCBib29sZWFuIGNyZWF0ZSkgewotCQlpZiAoY29uc3RyYWludE5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQ29uc3RyYWludCBjb25zdHJhaW50ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZS5nZXRPd25lZFJ1bGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb25zdHJhaW50IGMgPSAoQ29uc3RyYWludCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoYy5nZXROYW1lKCkuZXF1YWxzKGNvbnN0cmFpbnROYW1lKSkgewotCQkJCWNvbnN0cmFpbnQgPSBjOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChjb25zdHJhaW50ID09IG51bGwgJiYgY3JlYXRlKSB7Ci0JCQljb25zdHJhaW50ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpOwotCQkJY29uc3RyYWludC5zZXROYW1lKGNvbnN0cmFpbnROYW1lKTsKLQkJCWUuZ2V0T3duZWRSdWxlcygpLmFkZChjb25zdHJhaW50KTsKLQkJfQotCQlyZXR1cm4gY29uc3RyYWludDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db250ZW50RWxlbWVudEluaGVyaXRhbmNlSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db250ZW50RWxlbWVudEluaGVyaXRhbmNlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg3NGQzOWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29udGVudEVsZW1lbnRJbmhlcml0YW5jZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGRlZmluZXMgc3RhdGljIGhlbHBlciBtZXRob2RzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50Ci0gKiBpbmhlcml0YW5jZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbnRlbnRFbGVtZW50SW5oZXJpdGFuY2VIZWxwZXIgewotCQotCXByaXZhdGUgc3RhdGljIExpc3QgZGVzY2VuZGluZ1NvcnRCeUNyZWF0aW9uVGltZShMaXN0IHRhc2tzKSB7Ci0JCXJldHVybiB0YXNrczsKLQl9Ci0KLQkvLyBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFN0ZXBzKExpc3Qgc3RlcHMsIFRhc2sgYmFzZSkgewotCS8vIE9iamVjdCBmaXJzdCA9IG51bGw7Ci0JLy8gaWYoIXN0ZXBzLmlzRW1wdHkoKSkgewotCS8vIGZpcnN0ID0gc3RlcHMuZ2V0KDApOwotCS8vIH0KLQkvLyBMaXN0IHRhc2tzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKGJhc2UpOwotCS8vIGludCBzaXplID0gdGFza3Muc2l6ZSgpOwotCS8vIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkvLyBUYXNrIHRhc2sgPSAoVGFzaykgdGFza3MuZ2V0KGkpOwotCS8vIExpc3Qgc2VjdGlvbnMgPSB0YXNrLmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCk7Ci0JLy8gaW50IG51bU9mU2VjdGlvbnMgPSBzZWN0aW9ucy5zaXplKCk7Ci0JLy8gU2VjdGlvbiBwcmV2ID0gbnVsbDsKLQkvLyBmb3IgKGludCBqID0gMDsgaiA8IG51bU9mU2VjdGlvbnM7IGorKykgewotCS8vIFNlY3Rpb24gc2VjdGlvbiA9IChTZWN0aW9uKSBzZWN0aW9ucy5nZXQoaik7Ci0JLy8gU2VjdGlvbiBwcmVkID0gc2VjdGlvbi5nZXRQcmVkZWNlc3NvcigpOwotCS8vIGlmKHByZWQgPT0gbnVsbCkgewotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQotCS8qKgotCSAqIEdldHMgYWxsIHN0ZXBzIGluIHRoZSB0YXNrIHRyZWUgdGhhdCB0aGUgZ2l2ZW4gdGFzayBiZWxvbmdzIHRvCi0JICogCi0JICogQHBhcmFtIHRhc2sKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbFRhc2tTdGVwcyhUYXNrIHRhc2spIHsKLQkJVGFzayBiYXNlID0gKFRhc2spIFRuZ1V0aWwuZ2V0QmFzZSh0YXNrKTsKLQkJTGlzdCBzdGVwcyA9IG5ldyBBcnJheUxpc3QoYmFzZS5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpKTsKLQkJSXRlcmF0b3IgdGFza3MgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoYmFzZSwgZmFsc2UpIHsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKAotCQkJCQkJKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0KS5pdGVyYXRvcigpOwotCQkJfQotCi0JCX07Ci0JCVRhc2sgY3VycmVudEJhc2UgPSBiYXNlOwotCQl3aGlsZSAodGFza3MuaGFzTmV4dCgpKSB7Ci0JCQlUYXNrIHQgPSAoVGFzaykgdGFza3MubmV4dCgpOwotCQkJaWYgKGN1cnJlbnRCYXNlICE9IHQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSB7Ci0JCQkJLy8gbmV3IGluaGVyaXRhbmNlIGxldmVsCi0JCQkJLy8KLQkJCQljdXJyZW50QmFzZSA9IChUYXNrKSB0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlTZWN0aW9uIHMgPSAoU2VjdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJU2VjdGlvbiBwcmVkID0gcy5nZXRQcmVkZWNlc3NvcigpOwotCQkJCWlmIChwcmVkICE9IG51bGwpIHsKLQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RlcHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db250ZW50RWxlbWVudExpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnRlbnRFbGVtZW50TGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNGY0MDhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnRlbnRFbGVtZW50TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudEVsZW1lbnRMaXN0IHsKLQotCXByaXZhdGUgQ29udGVudFBhY2thZ2UgY29udGVudFBrZzsKLQotCXByb3RlY3RlZCBjbGFzcyBFbGVtZW50SXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVyYXRvciB7Ci0KLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjI5MTQzODk3MDEyMzk4NTkwNkw7Ci0KLQkJcHJvdGVjdGVkIEVsZW1lbnRJdGVyYXRvcigpIHsKLQkJCXN1cGVyKGNvbnRlbnRQa2csIGZhbHNlKTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW5MaXN0KE9iamVjdCBvYmplY3QpIHsKLQkJCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJQ29udGVudFBhY2thZ2UgcGtnID0gKENvbnRlbnRQYWNrYWdlKSBvYmplY3Q7Ci0JCQkJY2hpbGRyZW4uYWRkQWxsKHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkpOwotCQkJCUxpc3QgZWxlbWVudHMgPSBwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCQlPYmplY3Qgb2JqID0gZWxlbWVudHMuZ2V0KGkpOwotCQkJCQlpZiAoYWNjZXB0KG9iaikpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChvYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNoaWxkcmVuOwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBnZXRDaGlsZHJlbkxpc3Qob2JqZWN0KS5pdGVyYXRvcigpOwotCQl9Ci0JCQotCX07Ci0JCi0JcHVibGljIENvbnRlbnRFbGVtZW50TGlzdChDb250ZW50UGFja2FnZSBjb250ZW50UGtnKSB7Ci0JCXRoaXMuY29udGVudFBrZyA9IGNvbnRlbnRQa2c7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopOwotCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGVsZW1lbnRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbGVtZW50SXRlcmF0b3IoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGdldEFsbEVsZW1lbnRzKENvbnRlbnRQYWNrYWdlIHBrZywgTGlzdCBsaXN0KSB7Ci0vLwkJTGlzdCBlbGVtZW50cyA9IHBrZy5nZXRDb250ZW50RWxlbWVudHMoKTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0vLwkJCU9iamVjdCBvYmogPSBlbGVtZW50cy5nZXQoaSk7Ci0vLwkJCWlmIChhY2NlcHQob2JqKSkgewotLy8JCQkJbGlzdC5hZGQob2JqKTsKLS8vCQkJfQotLy8JCX0KLS8vCQlMaXN0IHBhY2thZ2VzID0gcGtnLmdldENoaWxkUGFja2FnZXMoKTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VzLnNpemUoKTsgaSsrKSB7Ci0vLwkJCU9iamVjdCBvYmogPSBwYWNrYWdlcy5nZXQoaSk7Ci0vLwkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotLy8JCQkJZ2V0QWxsRWxlbWVudHMoKENvbnRlbnRQYWNrYWdlKSBvYmosIGxpc3QpOwotLy8JCQl9Ci0vLwkJfQotCQkKLQkJZm9yKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50SXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYoIShlIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKSB7Ci0JCQkJbGlzdC5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRMaXN0KCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldEFsbEVsZW1lbnRzKGNvbnRlbnRQa2csIGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnRlbnRFbGVtZW50T3JkZXJMaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db250ZW50RWxlbWVudE9yZGVyTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMTBiMTI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnRlbnRFbGVtZW50T3JkZXJMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm9Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC51dGlsLlN0cmluZ1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiAKLSAqIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIGFsbCB0aGUgbG9naWNzIHVzZWQgdG8gcmV0cmlldmUgdGhlIGxpc3Qgb2YgYWxsCi0gKiBjb250cmlidXRlZC9pbmhlcml0ZWQgc2VjdGlvbnMgb2YgdGhlIGdpdmVuIGVsZW1lbnQgYXMgd2VsbCBhcyBhbGxvd3MKLSAqIG1hbmlwdWxhdGUgdGhpcyBsaXN0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgZXh0ZW5kcyBCYXNpY0VMaXN0IHsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTc1NzI3OTc0ODcwNjkyMzNMOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9SREVSX0lORk9fTkFNRSA9ICJjb250ZW50IGVsZW1lbnRzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIERFRkFVTFRfU0FWRV9PUFRJT05TID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfRUxFTUVOVFNfX0ZPUl9FTEVNRU5UX09OTFkgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9FTEVNRU5UU19fRk9SX0VMRU1FTlRfQU5EX1BBUkVOVFMgPSAyOwotCi0Jc3RhdGljIHsKLQkJREVGQVVMVF9TQVZFX09QVElPTlMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgIkFTQ0lJIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIENvbnRlbnRFbGVtZW50IGVkaXRFbGVtZW50OwotCi0JcHJpdmF0ZSBib29sZWFuIG1peGVkID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ29udHJpYnV0b3IoVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuaXNDb250cmlidXRvcihlKTsKLQl9Ci0KLQlwdWJsaWMgQ29udGVudEVsZW1lbnRPcmRlckxpc3QoQ29udGVudEVsZW1lbnQgZSwgaW50IHNjb3BlKSB7Ci0JCWVkaXRFbGVtZW50ID0gZTsKLQkJaWYgKHNjb3BlID09IENPTlRFTlRfRUxFTUVOVFNfX0ZPUl9FTEVNRU5UX09OTFkpIHsKLQkJCW1peGVkID0gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoc2NvcGUgPT0gQ09OVEVOVF9FTEVNRU5UU19fRk9SX0VMRU1FTlRfQU5EX1BBUkVOVFMpIHsKLQkJCWNhbGN1bGF0ZVBhcmVudHNPbmx5KGUpOwotCQl9IGVsc2UgewotCQkJbWl4ZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVQYXJlbnRzT25seShDb250ZW50RWxlbWVudCBlKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBudWxsOwotCQlpZiAoaXNDb250cmlidXRvcihlKSB8fCBpc0V4dGVuZGVkKGUpKSB7Ci0JCQlMaXN0IHN1cGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCVVtYVV0aWwuZ2V0QWxsU3VwZXJzQm90aChzdXBlcnMsIGUsCi0JCQkJCVZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFU19MSVRFUkFMLAotCQkJCQlWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKTsKLQkJCXN1cGVycy5hZGQoZSk7Ci0JCQlpdGVyID0gc3VwZXJzLml0ZXJhdG9yKCk7Ci0JCX0gZWxzZSB7Ci0JCQltaXhlZCA9IGZhbHNlOwotCQl9Ci0KLQkJaWYgKG1peGVkKSB7Ci0JCQkvLyBjcmVhdGUgYSBtYXAgb2YgR1VJRCAvIGNvbnRyaWJ1dG9yCi0JCQkvLwotCQkJT3JkZXJJbmZvIGxhdGVzdEluZm8gPSBudWxsOwotCQkJTWFwIGd1aWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJU2V0IGVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUNvbnRlbnRFbGVtZW50IGVsZW1lbnQgPSAoQ29udGVudEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoQ3VzdG9tQ2F0ZWdvcnkpZWxlbWVudCkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCURlc2NyaWJhYmxlRWxlbWVudCBjYXRlZ29yaXplZEVsZW1lbnQgPSAoRGVzY3JpYmFibGVFbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlndWlkTWFwLnB1dChjYXRlZ29yaXplZEVsZW1lbnQuZ2V0R3VpZCgpLCBjYXRlZ29yaXplZEVsZW1lbnQpOwotCQkJCQkJZWxlbWVudHMuYWRkKGNhdGVnb3JpemVkRWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlPcmRlckluZm8gb3JkZXJJbmZvID0gVG5nVXRpbC5nZXRPcmRlckluZm8oZWxlbWVudCwKLQkJCQkJCU9SREVSX0lORk9fTkFNRSk7Ci0JCQkJaWYgKG9yZGVySW5mbyAhPSBudWxsKSB7Ci0JCQkJCWlmIChsYXRlc3RJbmZvID09IG51bGwKLQkJCQkJCQl8fCBvcmRlckluZm8uZ2V0VGltZXN0YW1wKCkgPiBsYXRlc3RJbmZvCi0JCQkJCQkJCQkuZ2V0VGltZXN0YW1wKCkpIHsKLQkJCQkJCWxhdGVzdEluZm8gPSBvcmRlckluZm87Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChsYXRlc3RJbmZvICE9IG51bGwpIHsKLQkJCQkvLyByZW9yZGVyIHRoZSBzZWN0aW9ucyBiYXNlZCBvbiB0aGUgbGF0ZXN0IG9yZGVyIGluZm8KLQkJCQkvLwotCQkJCWludCBzaXplID0gbGF0ZXN0SW5mby5nZXRHVUlEcygpLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlPYmplY3QgZ3VpZCA9IGxhdGVzdEluZm8uZ2V0R1VJRHMoKS5nZXQoaSk7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gZ3VpZE1hcC5nZXQoZ3VpZCk7Ci0JCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCXN1cGVyLmFkZChlbGVtZW50KTsKLQkJCQkJCWVsZW1lbnRzLnJlbW92ZShlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXN1cGVyLmFkZEFsbChlbGVtZW50cyk7Ci0JCX0KLQl9Ci0KLQkvLyBkZXByZWNhdGUgdGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RvcgotCXB1YmxpYyBDb250ZW50RWxlbWVudE9yZGVyTGlzdChDb250ZW50RWxlbWVudCBlKSB7Ci0JCWVkaXRFbGVtZW50ID0gZTsKLQkJSXRlcmF0b3IgaXRlciA9IG51bGw7Ci0JCWlmIChpc0NvbnRyaWJ1dG9yKGUpIHx8IFRuZ1V0aWwuaGFzQ29udHJpYnV0b3IoZSkpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gVG5nVXRpbC5nZXRCYXNlKGUpOwotCQkJaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihiYXNlKSB7Ci0KLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyYXRvcgotCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJaWYgKGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwpIHsKLQkJCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQkJfQotCi0JCQl9OwotCQl9IGVsc2UgaWYgKGlzRXh0ZW5kZWQoZSkpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIiQkJCBmb3IgIiArIGUuZ2V0TmFtZSgpICsgIiA9IGV4dGVuZGVkIGlzIHRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlMaXN0IHN1cGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCVVtYVV0aWwuZ2V0QWxsU3VwZXJzKHN1cGVycywgZSwgVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCk7Ci0JCQlzdXBlcnMuYWRkKGUpOwotCQkJaXRlciA9IHN1cGVycy5pdGVyYXRvcigpOwotCQl9IGVsc2UgewotCQkJbWl4ZWQgPSBmYWxzZTsKLQkJfQotCi0JCWlmIChtaXhlZCkgewotCQkJLy8gY3JlYXRlIGEgbWFwIG9mIEdVSUQgLyBjb250cmlidXRvcgotCQkJLy8KLQkJCU9yZGVySW5mbyBsYXRlc3RJbmZvID0gbnVsbDsKLQkJCU1hcCBndWlkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCUxpc3QgZWxlbWVudHMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJQ29udGVudEVsZW1lbnQgZWxlbWVudCA9IChDb250ZW50RWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJZ3VpZE1hcC5wdXQoZWxlbWVudC5nZXRHdWlkKCksIGVsZW1lbnQpOwotCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQotCQkJCU9yZGVySW5mbyBvcmRlckluZm8gPSBUbmdVdGlsLmdldE9yZGVySW5mbyhlbGVtZW50LAotCQkJCQkJT1JERVJfSU5GT19OQU1FKTsKLQkJCQlpZiAob3JkZXJJbmZvICE9IG51bGwpIHsKLQkJCQkJaWYgKGxhdGVzdEluZm8gPT0gbnVsbAotCQkJCQkJCXx8IG9yZGVySW5mby5nZXRUaW1lc3RhbXAoKSA+IGxhdGVzdEluZm8KLQkJCQkJCQkJCS5nZXRUaW1lc3RhbXAoKSkgewotCQkJCQkJbGF0ZXN0SW5mbyA9IG9yZGVySW5mbzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGxhdGVzdEluZm8gIT0gbnVsbCkgewotCQkJCS8vIHJlb3JkZXIgdGhlIHNlY3Rpb25zIGJhc2VkIG9uIHRoZSBsYXRlc3Qgb3JkZXIgaW5mbwotCQkJCS8vCi0JCQkJaW50IHNpemUgPSBsYXRlc3RJbmZvLmdldEdVSURzKCkuc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCU9iamVjdCBndWlkID0gbGF0ZXN0SW5mby5nZXRHVUlEcygpLmdldChpKTsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBndWlkTWFwLmdldChndWlkKTsKLQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJc3VwZXIuYWRkKGVsZW1lbnQpOwotCQkJCQkJZWxlbWVudHMucmVtb3ZlKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc3VwZXIuYWRkQWxsKGVsZW1lbnRzKTsKLQkJfQotCQkvLyBlbHNlIHsKLQkJLy8gLy8gYWRkQWxsKGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkpOwotCQkvLyBtaXhlZCA9IGZhbHNlOwotCQkvLyB9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0V4dGVuZGVkKENvbnRlbnRFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiBlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUw7Ci0JfQotCi0JLyoqCi0JICogQXBwbGllcyByZWNlbnQgY2hhbmdlcyBpbiB0aGUgbGlzdAotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KCkgewotCQlpZiAoIW1peGVkIHx8ICFjaGFuZ2VkKQotCQkJcmV0dXJuOwotCi0JCS8vIHNhdmUgdGhlIG9yZGVyIGluZm8gdG8gdGhlIG9yZGVyaW5nR3VpZGUgb2YgdGhlIGVkaXRFbGVtZW50Ci0JCS8vCi0JCVN0cmluZyBzdHIgPSBlZGl0RWxlbWVudC5nZXRPcmRlcmluZ0d1aWRlKCk7Ci0JCU9yZGVySW5mb0NvbGxlY3Rpb24gb3JkZXJJbmZvcyA9IG51bGw7Ci0JCVN0cmluZ1Jlc291cmNlIHJlcyA9IG51bGw7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkgewotCQkJb3JkZXJJbmZvcyA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3JkZXJJbmZvQ29sbGVjdGlvbigpOwotCQl9IGVsc2UgewotCQkJcmVzID0gbmV3IFN0cmluZ1Jlc291cmNlKHN0cik7Ci0JCQl0cnkgewotCQkJCXJlcy5sb2FkKG51bGwpOwotCQkJCWlmIChyZXMuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCQkJb3JkZXJJbmZvcyA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlT3JkZXJJbmZvQ29sbGVjdGlvbigpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW9yZGVySW5mb3MgPSAoT3JkZXJJbmZvQ29sbGVjdGlvbikgcmVzLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQkJLy8gZmluZCB0aGUgb3JkZXIgaW5mb3IgZm9yIHNlY3Rpb25zCi0JCS8vCi0JCU9yZGVySW5mbyBzZWN0T3JkZXJJbmZvID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb3JkZXJJbmZvcy5nZXRPcmRlckluZm9zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPcmRlckluZm8gb3JkZXJJbmZvID0gKE9yZGVySW5mbykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoT1JERVJfSU5GT19OQU1FLmVxdWFsc0lnbm9yZUNhc2Uob3JkZXJJbmZvLmdldE5hbWUoKSkpIHsKLQkJCQlzZWN0T3JkZXJJbmZvID0gb3JkZXJJbmZvOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKHNlY3RPcmRlckluZm8gPT0gbnVsbCkgewotCQkJc2VjdE9yZGVySW5mbyA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3JkZXJJbmZvKCk7Ci0JCQlzZWN0T3JkZXJJbmZvLnNldE5hbWUoT1JERVJfSU5GT19OQU1FKTsKLQkJCW9yZGVySW5mb3MuZ2V0T3JkZXJJbmZvcygpLmFkZChzZWN0T3JkZXJJbmZvKTsKLQkJfSBlbHNlIHsKLQkJCXNlY3RPcmRlckluZm8uZ2V0R1VJRHMoKS5jbGVhcigpOwotCQl9Ci0KLQkJaW50IHNpemUgPSBzaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnQgc2VjdCA9IChEZXNjcmliYWJsZUVsZW1lbnQpIGdldChpKTsKLQkJCXNlY3RPcmRlckluZm8uZ2V0R1VJRHMoKS5hZGQoc2VjdC5nZXRHdWlkKCkpOwotCQl9Ci0JCXNlY3RPcmRlckluZm8uc2V0VGltZXN0YW1wKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJaWYgKHJlcyA9PSBudWxsKSB7Ci0JCQlyZXMgPSBuZXcgU3RyaW5nUmVzb3VyY2UobnVsbCk7Ci0JCQlyZXMuZ2V0Q29udGVudHMoKS5hZGQob3JkZXJJbmZvcyk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJlcy5zYXZlKERFRkFVTFRfU0FWRV9PUFRJT05TKTsKLQkJCXN0ciA9IHJlcy5nZXRTdHJpbmcoKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2VjdGlvbkxpc3QuYXBwbHkoKTogbmV3IG9yZGVyaW5nIGd1aWRlIik7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLSBvcmRlcmluZ0d1aWRlIHN0YXJ0IC0tLS0tLSIpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHN0cik7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLSBvcmRlcmluZ0d1aWRlIGVuZCAtLS0tLS0iKTsKLQkJCWVkaXRFbGVtZW50LnNldE9yZGVyaW5nR3VpZGUoc3RyKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuUmVtb3ZlKENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50KSB7Ci0JCWlmICgoKEN1c3RvbUNhdGVnb3J5KSBlZGl0RWxlbWVudCkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLmNvbnRhaW5zKAotCQkJCWNvbnRlbnRFbGVtZW50KSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJaWYgKCFjYW5SZW1vdmUoKENvbnRlbnRFbGVtZW50KSBnZXQoaW5kZXgpKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCU9iamVjdCByZW1vdmVkID0gc3VwZXIucmVtb3ZlKGluZGV4KTsKLQkJCSgoQ3VzdG9tQ2F0ZWdvcnkpIGVkaXRFbGVtZW50KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkucmVtb3ZlKAotCQkJCQlyZW1vdmVkKTsKLQkJCXJldHVybiByZW1vdmVkOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoQ3VzdG9tQ2F0ZWdvcnkpIGVkaXRFbGVtZW50KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkJCQkJLnJlbW92ZShpbmRleCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQkJaWYgKCFjYW5SZW1vdmUoKENvbnRlbnRFbGVtZW50KSBvKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG1peGVkKSB7Ci0JCQlpZiAoc3VwZXIucmVtb3ZlKG8pKSB7Ci0JCQkJKChDdXN0b21DYXRlZ29yeSkgZWRpdEVsZW1lbnQpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5yZW1vdmUoCi0JCQkJCQlvKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gKChDdXN0b21DYXRlZ29yeSkgZWRpdEVsZW1lbnQpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKQotCQkJCS5yZW1vdmUobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gYykgewotCQlpZiAobWl4ZWQpIHsKLQkJCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJCUl0ZXJhdG9yIGUgPSBpdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG8gPSBlLm5leHQoKTsKLQkJCQlpZiAoYy5jb250YWlucyhvKSAmJiBjYW5SZW1vdmUoKENvbnRlbnRFbGVtZW50KSBvKSkgewotCQkJCQllLnJlbW92ZSgpOwotCQkJCQkoKEN1c3RvbUNhdGVnb3J5KSBlZGl0RWxlbWVudCkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJCQkJLnJlbW92ZShvKTsKLQkJCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBtb2RpZmllZDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKEN1c3RvbUNhdGVnb3J5KSBlZGl0RWxlbWVudCkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJCS5yZW1vdmVBbGwoYyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXN1cGVyLmFkZChpbmRleCwgZWxlbWVudCk7Ci0JCQkoKEN1c3RvbUNhdGVnb3J5KSBlZGl0RWxlbWVudCkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJCS5hZGQoZWxlbWVudCk7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCSgoQ3VzdG9tQ2F0ZWdvcnkpIGVkaXRFbGVtZW50KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuYWRkKGluZGV4LAotCQkJCQllbGVtZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykgewotCQlib29sZWFuIGIgPSAoKEN1c3RvbUNhdGVnb3J5KSBlZGl0RWxlbWVudCkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJLmFkZChvKTsKLQkJaWYgKG1peGVkKSB7Ci0JCQliID0gc3VwZXIuYWRkKG8pOwotCQkJaWYgKGIpCi0JCQkJY2hhbmdlZCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gYykgewotCQlib29sZWFuIGIgPSAoKEN1c3RvbUNhdGVnb3J5KSBlZGl0RWxlbWVudCkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJLmFkZEFsbChjKTsKLQkJOwotCQlpZiAobWl4ZWQpIHsKLQkJCWIgPSBzdXBlci5hZGRBbGwoYyk7Ci0JCQlpZiAoYikKLQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gYjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uIGMpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQkoKEN1c3RvbUNhdGVnb3J5KSBlZGl0RWxlbWVudCkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLmFkZEFsbChjKTsKLQkJCTsKLQkJCWJvb2xlYW4gYiA9IHN1cGVyLmFkZEFsbChpbmRleCwgYyk7Ci0JCQlpZiAoYikKLQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gKChDdXN0b21DYXRlZ29yeSkgZWRpdEVsZW1lbnQpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKQotCQkJCS5hZGRBbGwoYyk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBzZXQoaW50IGluZGV4LCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAobWl4ZWQpCi0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJcmV0dXJuICgoQ3VzdG9tQ2F0ZWdvcnkpIGVkaXRFbGVtZW50KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuc2V0KAotCQkJCWluZGV4LCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKG1peGVkKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCSgoQ3VzdG9tQ2F0ZWdvcnkpIGVkaXRFbGVtZW50KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlKGludCBpbmRleCwgT2JqZWN0IG9iamVjdCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXN1cGVyLm1vdmUoaW5kZXgsIG9iamVjdCk7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCSgoRUxpc3QpICgoQ3VzdG9tQ2F0ZWdvcnkpIGVkaXRFbGVtZW50KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkpCi0JCQkJCS5tb3ZlKGluZGV4LCBvYmplY3QpOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBtb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJT2JqZWN0IG1vdmVkID0gc3VwZXIubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQlyZXR1cm4gbW92ZWQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChFTGlzdCkgKChDdXN0b21DYXRlZ29yeSkgZWRpdEVsZW1lbnQpCi0JCQkJCS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0KGludCBpbmRleCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXJldHVybiBzdXBlci5nZXQoaW5kZXgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoQ3VzdG9tQ2F0ZWdvcnkpIGVkaXRFbGVtZW50KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuZ2V0KAotCQkJCQlpbmRleCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGludCBzaXplKCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXJldHVybiBzdXBlci5zaXplKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChDdXN0b21DYXRlZ29yeSkgZWRpdEVsZW1lbnQpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5zaXplKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCWlmIChtaXhlZCkgewotCQkJcmV0dXJuIHN1cGVyLml0ZXJhdG9yKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChDdXN0b21DYXRlZ29yeSkgZWRpdEVsZW1lbnQpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKQotCQkJCQkuaXRlcmF0b3IoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuY29udGFpbnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gKChDdXN0b21DYXRlZ29yeSkgZWRpdEVsZW1lbnQpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKQotCQkJCS5jb250YWlucyhvYmplY3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlpZiAobWl4ZWQpCi0JCQlyZXR1cm4gc3VwZXIuY29udGFpbnNBbGwoY29sbGVjdGlvbik7Ci0JCXJldHVybiAoKEN1c3RvbUNhdGVnb3J5KSBlZGl0RWxlbWVudCkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJLmNvbnRhaW5zQWxsKGNvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXJldHVybiBzdXBlci50b0FycmF5KCk7Ci0JCX0KLQkJcmV0dXJuICgoQ3VzdG9tQ2F0ZWdvcnkpIGVkaXRFbGVtZW50KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkJCQkudG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KE9iamVjdFtdIGFycmF5KSB7Ci0JCWlmIChtaXhlZCkKLQkJCXJldHVybiBzdXBlci50b0FycmF5KGFycmF5KTsKLQkJcmV0dXJuICgoQ3VzdG9tQ2F0ZWdvcnkpIGVkaXRFbGVtZW50KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkudG9BcnJheSgKLQkJCQlhcnJheSk7Ci0JfQotCi0JcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG1peGVkKQotCQkJcmV0dXJuIHN1cGVyLmluZGV4T2Yob2JqZWN0KTsKLQkJcmV0dXJuICgoQ3VzdG9tQ2F0ZWdvcnkpIGVkaXRFbGVtZW50KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuaW5kZXhPZigKLQkJCQlvYmplY3QpOwotCX0KLQotCXB1YmxpYyBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobWl4ZWQpCi0JCQlyZXR1cm4gc3VwZXIubGFzdEluZGV4T2Yob2JqZWN0KTsKLQkJcmV0dXJuICgoQ3VzdG9tQ2F0ZWdvcnkpIGVkaXRFbGVtZW50KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkJCQkubGFzdEluZGV4T2Yob2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01peGVkKCkgewotCQlyZXR1cm4gbWl4ZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRGlhZ3JhbU9wdGlvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0RpYWdyYW1PcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQzMDJiYTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRGlhZ3JhbU9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtT3B0aW9ucyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRElBR1JBTV9QVUJMSVNIX05PTkUgPSAiZGlhZ3JhbV9wdWJsaXNoX25vbmUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0RJQUdSQU1fUFVCTElTSF9BTEwgPSAiZGlhZ3JhbV9wdWJsaXNoX2FsbCI7Ci0JCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1B1Ymxpc2hOb25lKFByb2Nlc3MgcHJvY2VzcykgewotCQlQcm9wZXJ0eSBwcm9wID0gTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5KHByb2Nlc3MsIFBST1BfRElBR1JBTV9QVUJMSVNIX05PTkUpOwotCQlyZXR1cm4gcHJvcCAhPSBudWxsID8gQm9vbGVhbi5wYXJzZUJvb2xlYW4ocHJvcC5nZXRWYWx1ZSgpKSA6IGZhbHNlOyAKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNldFB1Ymxpc2hOb25lKFByb2Nlc3MgcHJvY2VzcywgYm9vbGVhbiBiKSB7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5zZXRQcm9wZXJ0eShwcm9jZXNzLCBQUk9QX0RJQUdSQU1fUFVCTElTSF9OT05FLCBiKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzUHVibGlzaEFsbChQcm9jZXNzIHByb2Nlc3MpIHsKLQkJUHJvcGVydHkgcHJvcCA9IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eShwcm9jZXNzLCBQUk9QX0RJQUdSQU1fUFVCTElTSF9BTEwpOwotCQlyZXR1cm4gcHJvcCAhPSBudWxsID8gQm9vbGVhbi5wYXJzZUJvb2xlYW4ocHJvcC5nZXRWYWx1ZSgpKSA6IGZhbHNlOyAJCQotCX0JCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNldFB1Ymxpc2hBbGwoUHJvY2VzcyBwcm9jZXNzLCBib29sZWFuIGIpIHsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLnNldFByb3BlcnR5KHByb2Nlc3MsIFBST1BfRElBR1JBTV9QVUJMSVNIX0FMTCwgYik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRWRpdGluZ0RvbWFpbkNvbXBvc2VkQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0VkaXRpbmdEb21haW5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyMmE5ZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRWRpdGluZ0RvbWFpbkNvbXBvc2VkQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci0KLS8qKgotICogQSBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHRoYXQgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpblByb3ZpZGVyCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0aW5nRG9tYWluQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBleHRlbmRzCi0JCUNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpblByb3ZpZGVyIHsKLQotCXByaXZhdGUgRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOwotCi0JcHVibGljIEVkaXRpbmdEb21haW5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5W10gYWRhcHRlckZhY3RvcmllcykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yaWVzKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFZGl0aW5nRG9tYWluKEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbikgewotCQl0aGlzLmVkaXRpbmdEb21haW4gPSBlZGl0aW5nRG9tYWluOwotCQlpZiAoZWRpdGluZ0RvbWFpbiBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGVkaXRpbmdEb21haW4pCi0JCQkJCS5zZXRBZGFwdGVyRmFjdG9yeSh0aGlzKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRXhwb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9FeHBvc2VkQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTU2MzhmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9FeHBvc2VkQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JUmVmZXJlbmNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUNvbHVtbkF3YXJlOwotCi0KLS8qKgotICogQW4gRWRpdGluZ0RvbWFpbkNvbXBvc2VkQWRhcHRlckZhY3RvcnkgdGhhdCBleHBvc2VzIGludGVybmFsIGRhdGEKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEVkaXRpbmdEb21haW5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5Ci0JCWltcGxlbWVudHMgSUNvbHVtbkF3YXJlLCBJUmVmZXJlbmNlciB7Ci0KLQlwcml2YXRlIE1hcCBjb2x1bW5JbmRleFRvTmFtZU1hcDsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yaWVzCi0JICovCi0JcHVibGljIEV4cG9zZWRBZGFwdGVyRmFjdG9yeShBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3Rvcmllcyk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Q2hhbmdlTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gY2hhbmdlTm90aWZpZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklDb2x1bW5Bd2FyZSNzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbkluZGV4VG9OYW1lTWFwKE1hcCBtYXApIHsKLQkJY29sdW1uSW5kZXhUb05hbWVNYXAgPSBtYXA7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlckZhY3Rvcmllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBhZGFwdGVyRmFjdG9yeSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSUNvbHVtbkF3YXJlKSB7Ci0JCQkJKChJQ29sdW1uQXdhcmUpIGFkYXB0ZXJGYWN0b3J5KS5zZXRDb2x1bW5JbmRleFRvTmFtZU1hcChtYXApOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklDb2x1bW5Bd2FyZSNnZXRDb2x1bW5JbmRleFRvTmFtZU1hcCgpCi0JICovCi0JcHVibGljIE1hcCBnZXRDb2x1bW5JbmRleFRvTmFtZU1hcCgpIHsKLQkJcmV0dXJuIGNvbHVtbkluZGV4VG9OYW1lTWFwOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVJlZmVyZW5jZXIjY2xlYW5VcCgpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW5VcCgpIHsKLQkJaW50IHNpemUgPSBhZGFwdGVyRmFjdG9yaWVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBhZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3JpZXMuZ2V0KGkpOwotCQkJaWYoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJUmVmZXJlbmNlcikgewotCQkJCSgoSVJlZmVyZW5jZXIpYWRhcHRlckZhY3RvcnkpLmNsZWFuVXAoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVJlZmVyZW5jZXIjcmVtb3ZlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCByZWYpIHsKLQkJYm9vbGVhbiByZW1vdmVkID0gZmFsc2U7Ci0JCWludCBzaXplID0gYWRhcHRlckZhY3Rvcmllcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3QgYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yaWVzLmdldChpKTsKLQkJCWlmKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSVJlZmVyZW5jZXIpIHsKLQkJCQkoKElSZWZlcmVuY2VyKWFkYXB0ZXJGYWN0b3J5KS5yZW1vdmUocmVmKTsKLQkJCQlyZW1vdmVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVtb3ZlZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0V4dGVuc2lvbk1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0V4dGVuc2lvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjMzMDlhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9FeHRlbnNpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JTmVzdGVkQ29tbWFuZFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB3aXRoIG1ldGhvZHMgdG8gcmV0cmlldmUgZXh0ZW5zaW9ucwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1biAyNywgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEV4dGVuc2lvbk1hbmFnZXIgewotCXByaXZhdGUgc3RhdGljIE1hcCBJRFRvRXh0ZW5zaW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIHN0YXRpYyBMaXN0IG5lc3RlZENvbW1hbmRQcm92aWRlcnM7Ci0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBvcHBvc2l0ZUZlYXR1cmVMb2FkZXJzOwotCQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRFeHRlbnNpb25zKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBleHRlbnNpb25Qb2ludE5hbWUsIENsYXNzIHR5cGUpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KG5hbWVzcGFjZSwgZXh0ZW5zaW9uUG9pbnROYW1lKTsKLQkJCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQkJCQkJT2JqZWN0IGV4dCA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCQkJCQkJCQlpZih0eXBlLmlzSW5zdGFuY2UoZXh0KSkgewotCQkJCQkJCQkJbGlzdC5hZGQoZXh0KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJaWYobGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRFeHRlbnNpb24oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGV4dGVuc2lvblBvaW50TmFtZSkgewotCQlTdHJpbmcgSUQgPSBuYW1lc3BhY2UgKyAnLicgKyBleHRlbnNpb25Qb2ludE5hbWU7Ci0JCU9iamVjdCBleHQgPSBJRFRvRXh0ZW5zaW9uTWFwLmdldChJRCk7Ci0JCWlmKGV4dCA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKElEVG9FeHRlbnNpb25NYXApIHsKLQkJCQlleHQgPSBJRFRvRXh0ZW5zaW9uTWFwLmdldChJRCk7Ci0JCQkJaWYoZXh0ID09IG51bGwpIHsKLQkJCQkJLy8gUHJvY2VzcyB0aGUgY29udHJpYnV0b3JzLgotCQkJCQkvLwotCQkJCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChuYW1lc3BhY2UsIGV4dGVuc2lvblBvaW50TmFtZSk7Ci0JCQkJCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQkJCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCQkJCWV4dF93YWxrOgotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCWlmKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJZXh0ID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQkJCQkJCQkJYnJlYWsgZXh0X3dhbGs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYoZXh0ICE9IG51bGwpIHsKLQkJCQkJCUlEVG9FeHRlbnNpb25NYXAucHV0KElELCBleHQpOwotCQkJCQl9Ci0JCQkJfSAKLQkJCX0KLQotCQl9Ci0JCXJldHVybiBleHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVGV4dFJlZmVyZW5jZVJlcGxhY2VyIGdldFRleHRSZWZlcmVuY2VSZXBsYWNlcigpIHsKLQkJcmV0dXJuIChJVGV4dFJlZmVyZW5jZVJlcGxhY2VyKSBnZXRFeHRlbnNpb24oTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksICJ0ZXh0UmVmZXJlbmNlUmVwbGFjZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE5lc3RlZENvbW1hbmRQcm92aWRlcnMoKSB7Ci0JCWlmKG5lc3RlZENvbW1hbmRQcm92aWRlcnMgPT0gbnVsbCkgewotCQkJbmVzdGVkQ29tbWFuZFByb3ZpZGVycyA9IGdldEV4dGVuc2lvbnMoTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksIAotCQkJCQkibmVzdGVkQ29tbWFuZFByb3ZpZGVycyIsIElOZXN0ZWRDb21tYW5kUHJvdmlkZXIuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG5lc3RlZENvbW1hbmRQcm92aWRlcnM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRGlhZ3JhbU1hbmFnZXIgZ2V0RGlhZ3JhbU1hbmFnZXIoKSB7Ci0JCXJldHVybiAoSURpYWdyYW1NYW5hZ2VyKSBnZXRFeHRlbnNpb24oTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksICJkaWFncmFtTWFuYWdlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE9wcG9zaXRlRmVhdHVyZUxvYWRlcnMoKSB7Ci0JCWlmKG9wcG9zaXRlRmVhdHVyZUxvYWRlcnMgPT0gbnVsbCkgewotCQkJb3Bwb3NpdGVGZWF0dXJlTG9hZGVycyA9IGdldEV4dGVuc2lvbnMoTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksIAotCQkJCQkib3Bwb3NpdGVGZWF0dXJlTG9hZGVycyIsIElOZXN0ZWRDb21tYW5kUHJvdmlkZXIuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG9wcG9zaXRlRmVhdHVyZUxvYWRlcnM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKSB7Ci0JCXJldHVybiAoSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIpIGdldEV4dGVuc2lvbihMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgInVzZXJJbnRlcmFjdGlvbkhhbmRsZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9HcmFwaGljYWxEYXRhLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9HcmFwaGljYWxEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmOGQzMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvR3JhcGhpY2FsRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOwotaW1wb3J0IGphdmEuYXd0LlBvaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoaWNhbERhdGEgewotCXByaXZhdGUgUG9pbnQgbG9jYXRpb24gPSBuZXcgUG9pbnQoMCwgMCk7Ci0KLQlwcml2YXRlIERpbWVuc2lvbiBzaXplID0gbmV3IERpbWVuc2lvbigtMSwgLTEpOwotCi0JcHJpdmF0ZSBHcmFwaE5vZGUgZ3JhcGhOb2RlOwotCi0JcHJpdmF0ZSBEaWFncmFtIGRpYWdyYW07Ci0KLQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaWFncmFtKERpYWdyYW0gZGlhZ3JhbSkgewotCQl0aGlzLmRpYWdyYW0gPSBkaWFncmFtOwotCX0KLQotCXB1YmxpYyBHcmFwaE5vZGUgZ2V0R3JhcGhOb2RlKCkgewotCQlyZXR1cm4gZ3JhcGhOb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdyYXBoTm9kZShHcmFwaE5vZGUgZ3JhcGhOb2RlKSB7Ci0JCXRoaXMuZ3JhcGhOb2RlID0gZ3JhcGhOb2RlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbG9jYXRpb24uCi0JICovCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogICAgICAgICAgICBUaGUgbG9jYXRpb24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFBvaW50IGxvY2F0aW9uKSB7Ci0JCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNpemUuCi0JICovCi0JcHVibGljIERpbWVuc2lvbiBnZXRTaXplKCkgewotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2l6ZQotCSAqICAgICAgICAgICAgVGhlIHNpemUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpemUoRGltZW5zaW9uIHNpemUpIHsKLQkJdGhpcy5zaXplID0gc2l6ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JQnJlYWtkb3duU3RydWN0dXJlQWRhcHRlckZhY3Rvcmllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSUJyZWFrZG93blN0cnVjdHVyZUFkYXB0ZXJGYWN0b3JpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTk2NjFiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JQnJlYWtkb3duU3RydWN0dXJlQWRhcHRlckZhY3Rvcmllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIHByb3ZpZGVzIGEgcmVsYXRlZCBzZXQgb2YgYWRhcHRlciBmYWN0b3JpZXMgZm9yIGJyZWFrZG93bgotICogc3RydWN0dXJlIHZpZXdzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIwLCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJyZWFrZG93blN0cnVjdHVyZUFkYXB0ZXJGYWN0b3JpZXMgewotCUFkYXB0ZXJGYWN0b3J5IGdldFdCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQlBZGFwdGVyRmFjdG9yeSBnZXRUQlNBZGFwdGVyRmFjdG9yeSgpOwotCi0JQWRhcHRlckZhY3RvcnkgZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQlBZGFwdGVyRmFjdG9yeSBnZXRDQlNBZGFwdGVyRmFjdG9yeSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSURpYWdyYW1NYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JRGlhZ3JhbU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDI4NjljNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JRGlhZ3JhbU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotCi0vKioKLSAqIE1hbmFnZXMgZGlhZ3JhbXMgb2YgYWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdW4gMjcsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURpYWdyYW1NYW5hZ2VyIHsKLQkvKiogRGlhZ3JhbSB0eXBlIGNvbnN0YW50cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElWSVRZX0RJQUdSQU0gPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTSA9IDI7Ci0KLQkvKioKLQkgKiBHZXRzIGRpYWdyYW0gb2YgZ2l2ZW4gdHlwZSBmb3IgdGhlIGdpdmVuIGFjdGl2aXR5Ci0JICogCi0JICogQHBhcmFtIGFjdAotCSAqIEBwYXJhbSB0eXBlIGNhbiBiZSBvbmUgb2YgdGhlIGNvbnN0YW50cyB7QGxpbmsgI0FDVElWSVRZX0RJQUdSQU19LCB7QGxpbmsgI0FDVElWSVRZX0RFVEFJTF9ESUFHUkFNfSwgb3Ige0BsaW5rICNXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNfQotCSAqIEByZXR1cm4KLQkgKi8KLQlEaWFncmFtIGdldERpYWdyYW0oQWN0aXZpdHkgYWN0LCBpbnQgdHlwZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JTGlicmFyeUluc3BlY3Rvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSUxpYnJhcnlJbnNwZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjQ1ZDkyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JTGlicmFyeUluc3BlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgZGVidWcgcHVycG9zZQotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUgLSBBdWd1c3QgMTEsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxpYnJhcnlJbnNwZWN0b3IgewotCS8qKgotCSAqIFNob3cgYWxsIGNvbnRlbnRzIG9mIHRoZSBsaWJyYXJ5Ci0JICovCi0Jdm9pZCBzaG93QWxsQ29udGVudHMoKTsKLQkKLQkvKioKLQkgKiBTaG93IGFsbCBjb250ZW50cyBvZiB0aGUgbGlicmFyeQotCSAqLwotCXZvaWQgc2hvd0FsbENvbnRlbnRzKE1ldGhvZExpYnJhcnkgbGliKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyNzg5ZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSU9wcG9zaXRlRmVhdHVyZUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKgotICogT3Bwb3NpdGUgZmVhdHVyZSBsb2FkZXIKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBTZXAgMTQsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU9wcG9zaXRlRmVhdHVyZUxvYWRlciB7Ci0JLyoqCi0JICogTG9hZHMgb3Bwb3NpdGUgZmVhdHVyZXMgZm9yIHRoZSBnaXZlbiBlbGVtZW50cwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqLwotCXZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoQ29sbGVjdGlvbiBlbGVtZW50cyk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JVGV4dFJlZmVyZW5jZVJlcGxhY2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JVGV4dFJlZmVyZW5jZVJlcGxhY2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkZGY1MTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSVRleHRSZWZlcmVuY2VSZXBsYWNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIEluc3RhbmNlIG9mIHRoaXMgY2xhc3MgY2FuIHNjYW4gdGV4dCBhbmQgcmVwbGFjZXMgdGV4dHVhbCByZWZlcmVuY2VzIHRvIHRoZQotICogb2xkIG9iamVjdHMgd2l0aCByZWZlcmVuY2VzIHRvIG5ldyBvYmplY3RzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gSnVuIDIyLCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRleHRSZWZlcmVuY2VSZXBsYWNlciB7Ci0JLyoqCi0JICogUmVwbGFjZXMgdGV4dHVhbCByZWZlcmVuY2VzIHRvIHRoZSBvbGQgb2JqZWN0cyB3aXRoIHJlZmVyZW5jZXMgdG8gbmV3Ci0JICogb2JqZWN0cyBwcm92aWRlZCBpbiB0aGUgPGNvZGU+b2xkVG9OZXdPYmplY3RNYXA8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIHRoZSBvd25lciBvZiB0aGUgdGV4dAotCSAqIEBwYXJhbSBvbGRUb05ld09iamVjdE1hcAotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgcmVwbGFjZShTdHJpbmcgdGV4dCwgRU9iamVjdCBvd25lciwgTWFwIG9sZFRvTmV3T2JqZWN0TWFwKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0xpYnJhcnlFZGl0Q29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9MaWJyYXJ5RWRpdENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNTJhMDYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0xpYnJhcnlFZGl0Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLQotLyoqCi0gKiBDb25zdGFudHMgZm9yIGxpYnJhcnkgZWRpdCBwbHVnaW4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgSnVuIDMwLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMaWJyYXJ5RWRpdENvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBVTkNBVEVHT1JJWkVEX1RBU0tTX1BBVEggPSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9VbmNhdGVnb3JpemVkX1Rhc2tzX3RleHQiKSAvLyROT04tTkxTLTEkCi0JfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVU5DQVRFR09SSVpFRF9ET01BSU5fV09SS1BST0RVQ1RTX1BBVEggPSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1VuY2F0ZWdvcml6ZWRfdGV4dCIpIC8vJE5PTi1OTFMtMSQJCQkJCi0JfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVU5DQVRFR09SSVpFRF9XT1JLUFJPRFVDVFRZUEVfV09SS1BST0RVQ1RTX1BBVEggPSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9VbmNhdGVnb3JpemVkX3RleHQiKSAvLyROT04tTkxTLTEkCQkJCQotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFVOQ0FURUdPUklaRURfUk9MRVNfUEFUSCA9IHsKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9VbmNhdGVnb3JpemVkX1JvbGVzX3RleHQiKSAvLyROT04tTkxTLTEkCQkKLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBVTkNBVEVHT1JJWkVEX1RPT0xNRU5UT1JTX1BBVEggPSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Rvb2xzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9VbmNhdGVnb3JpemVkX3RleHQiKSAvLyROT04tTkxTLTEkCQkJCQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9QUkVGSVggPSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0VOQUJMRV9QUk9DRVNTX0NPTlRSSUJVVElPTiA9IFBSRUZfUFJFRklYCi0JCQkrICJlbmFibGVfcHJvY2Vzc19jb250cmlidXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0VOQUJMRV9IRUFMVEhfQ0hFQ0sgPSBQUkVGX1BSRUZJWAotCQkJKyAiZW5hYmxlX2hlYWx0aF9jaGVjayI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfSU5IRVJJVF9TVVBQUkVTU0lPTl9TVEFURSA9IFBSRUZfUFJFRklYCi0JCQkrICJpbmhlcml0X3N1cHByZXNzaW9uX3N0YXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9XQlNfQ09MVU1OUyA9IFBSRUZfUFJFRklYICsgIndic19jb2x1bW5zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9UQlNfQ09MVU1OUyA9IFBSRUZfUFJFRklYICsgInRic19jb2x1bW5zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9XUEJTX0NPTFVNTlMgPSBQUkVGX1BSRUZJWCArICJ3cGJzX2NvbHVtbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfQ1VTVE9NX0NBVEVHT1JZID0gIm5ld19jdXN0b21fY2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRElTQ0lQTElORSA9ICJuZXdfZGlzY2lwbGluZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19ESVNDSVBMSU5FX0dST1VQSU5HID0gIm5ld19kaXNjaXBsaW5lX2dyb3VwaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0RPTUFJTiA9ICJuZXdfZG9tYWluIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1JPTEVfU0VUID0gIm5ld19yb2xlX3NldCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19ST0xFX1NFVF9HUk9VUElORyA9ICJuZXdfcm9sZV9zZXRfZ3JvdXBpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfVE9PTCA9ICJuZXdfdG9vbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19XT1JLX1BST0RVQ1RfVFlQRSA9ICJuZXdfd29ya19wcm9kdWN0X2tpbmQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUk9MRSA9ICJuZXdfcm9sZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19UQVNLID0gIm5ld190YXNrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1dPUktQUk9EVUNUID0gIm5ld193b3JrcHJvZHVjdCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19BUlRJRkFDVCA9ICJuZXdfYXJ0aWZhY3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfREVMSVZFUkFCTEUgPSAibmV3X2RlbGl2ZXJhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX09VVENPTUUgPSAibmV3X291dGNvbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfQ0hFQ0tMSVNUID0gIm5ld19jaGVja2xpc3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfV0hJVEVQQVBFUiA9ICJuZXdfd2hpdGVwYXBlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19DT05DRVBUID0gIm5ld19jb25jZXB0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0VTVElNQVRFID0gIm5ld19lc3RpbWF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT04gPSAibmV3X2VzdGltYXRpb25fY29uc2lkZXJhdGlvbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRVNUSU1BVEFUSU5HX01FVFJJQyA9ICJuZXdfZXN0aW1hdGluZ19tZXRyaWMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRVhBTVBMRSA9ICJuZXdfZXhhbXBsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19QUkFDVElDRSA9ICJuZXdfcHJhY3RpY2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUkVQT1JUID0gIm5ld19yZXBvcnQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUk9BRE1BUCA9ICJuZXdfcm9hZG1hcCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19SRVVTQUJMRV9BU1NFVCA9ICJuZXdfcmV1c2FibGVfYXNzZXQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfU1VQUE9SVElOR19NQVRFUklBTCA9ICJuZXdfc3VwcG9ydGluZ19tYXRlcmlhbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19URU1QTEFURSA9ICJuZXdfdGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfVEVSTV9ERUZJTklUSU9OID0gIm5ld190ZXJtX2RlZmluaXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfVE9PTF9NRU5UT1IgPSAibmV3X3Rvb2xtZW50b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfR1VJREVMSU5FID0gIm5ld19ndWlkZWxpbmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfR1VJREFOQ0UgPSAibmV3X2d1aWRhbmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0NPTlRFTlRfUEFDS0FHRSA9ICJuZXdfY29udGVudF9wYWNrYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0NPTkZJR1VSQVRJT04gPSAibmV3X2NvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUFJPQ0VTU19GQU1JTFkgPSAibmV3X3Byb2Nlc3NfZmFtaWx5IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWVzc2VuZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXNzZW5nZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDEwNWZlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXNzZW5nZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXI7Ci0KLS8qKgotICogRGVmYXVsdCBtZXNzZW5nZXIgdGhhdCB3aWxsIGRlbGl2ZXIgbWVzc2FnZXMgdXNpbmcgdGhlIG1lc3NlbmdlciBvZgotICoge0BsaW5rIEV4dGVuc2lvbk1hbmFnZXIjZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKSBkZWZhdWx0IHVzZXIKLSAqIGludGVyYWN0aW9uIGhhbmRsZXJ9IGlmIG9uZSBleGlzdHMuIE90aGVyd2lzZSwgaXQgd2lsbCBsb2cgdGhlIG1lc3NhZ2VzIHVzaW5nCi0gKiBwbHVnaW4ncyBsb2dnZXIuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDI1LCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzZW5nZXIgaW1wbGVtZW50cyBJVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1lc3NlbmdlciBJTlNUQU5DRSA9IG5ldyBNZXNzZW5nZXIoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfTElORSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgKLQkJCSJsaW5lLnNlcGFyYXRvciIsICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgSU1lc3NlbmdlciBkZWxlZ2F0ZTsKLQotCXByaXZhdGUgTG9nZ2VyIGxvZ2dlciA9IExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKTsKLQotCXByaXZhdGUgTWVzc2VuZ2VyKCkgewotCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCQkJLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCWlmICh1aUhhbmRsZXIgIT0gbnVsbCkgewotCQkJZGVsZWdhdGUgPSB1aUhhbmRsZXIuZ2V0TWVzc2VuZ2VyKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dFcnJvcihqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5zaG93RXJyb3IodGl0bGUsIG1zZyk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcih0aXRsZSk7Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKG1zZykpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKE5FV19MSU5FKS5hcHBlbmQobXNnKTsKLQkJCX0KLQkJCWxvZ2dlci5sb2dFcnJvcihzdHJCdWYudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dFcnJvcihqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpCi0JICovCi0JcHVibGljIHZvaWQgc2hvd0Vycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlLnNob3dFcnJvcih0aXRsZSwgbXNnLCBzdGF0dXMpOwotCQl9IGVsc2UgewotCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93RXJyb3IoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5FeGNlcHRpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2hvd0Vycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwKLQkJCUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlLnNob3dFcnJvcih0aXRsZSwgbXNnLCByZWFzb24sIGV4Y2VwdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcih0aXRsZSk7Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKG1zZykpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKE5FV19MSU5FKS5hcHBlbmQobXNnKTsKLQkJCX0KLQkJCWxvZ2dlci5sb2dFcnJvcihzdHJCdWYudG9TdHJpbmcoKSwgZXhjZXB0aW9uKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd1dhcm5pbmcoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2hvd1dhcm5pbmcoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5zaG93V2FybmluZyh0aXRsZSwgbXNnKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKHRpdGxlKTsKLQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsobXNnKSkgewotCQkJCXN0ckJ1Zi5hcHBlbmQoTkVXX0xJTkUpLmFwcGVuZChtc2cpOwotCQkJfQotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoc3RyQnVmLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93V2FybmluZyhqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93V2FybmluZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24pIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlLnNob3dXYXJuaW5nKHRpdGxlLCBtc2csIHJlYXNvbik7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcih0aXRsZSk7Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKG1zZykpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKE5FV19MSU5FKS5hcHBlbmQobXNnKTsKLQkJCX0KLQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsocmVhc29uKSkgewotCQkJCXN0ckJ1Zi5hcHBlbmQoTkVXX0xJTkUpLmFwcGVuZChyZWFzb24pOwotCQkJfQotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoc3RyQnVmLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0luZm8oamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93SW5mbyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlLnNob3dJbmZvKHRpdGxlLCBtc2cpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIodGl0bGUpOwotCQkJaWYoIVN0clV0aWwuaXNCbGFuayhtc2cpKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZChORVdfTElORSkuYXBwZW5kKG1zZyk7Ci0JCQl9Ci0JCQlsb2dnZXIubG9nSW5mbyhzdHJCdWYudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93RXJyb3IoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkV4Y2VwdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZGV0YWlscywgRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJZGVsZWdhdGUuc2hvd0luZm8odGl0bGUsIG1zZyk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcih0aXRsZSk7Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKG1zZykpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKE5FV19MSU5FKS5hcHBlbmQobXNnKTsKLQkJCX0KLQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsocmVhc29uKSkgewotCQkJCXN0ckJ1Zi5hcHBlbmQoTkVXX0xJTkUpLmFwcGVuZChyZWFzb24pOwotCQkJfQotCQkJaWYoIVN0clV0aWwuaXNCbGFuayhkZXRhaWxzKSkgewotCQkJCXN0ckJ1Zi5hcHBlbmQoTkVXX0xJTkUpLmFwcGVuZChkZXRhaWxzKTsKLQkJCX0KLQkJCWxvZ2dlci5sb2dFcnJvcihzdHJCdWYudG9TdHJpbmcoKSwgZXhjZXB0aW9uKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2MzZDRjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByb3BlcnR5IGdldFByb3BlcnR5KE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUHJvcGVydHkgcHJvcCA9IChQcm9wZXJ0eSkgaXRlci5uZXh0KCk7Ci0JCQlpZihwcm9wLmdldE5hbWUoKS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJCXJldHVybiBwcm9wOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2V0UHJvcGVydHkoTWV0aG9kRWxlbWVudCBlLCBTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUpIHsKLQkJUHJvcGVydHkgcHJvcCA9IGdldFByb3BlcnR5KGUsIHByb3BOYW1lKTsKLQkJaWYocHJvcCA9PSBudWxsKSB7Ci0JCQlwcm9wID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHkoKTsKLQkJCXByb3Auc2V0TmFtZShwcm9wTmFtZSk7Ci0JCX0KLQkJcHJvcC5zZXRWYWx1ZShwcm9wVmFsdWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZXRQcm9wZXJ0eShNZXRob2RFbGVtZW50IGUsIFN0cmluZyBwcm9wTmFtZSwgYm9vbGVhbiBiKSB7Ci0JCXNldFByb3BlcnR5KGUsIHByb3BOYW1lLCBTdHJpbmcudmFsdWVPZihiKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXRob2RFbGVtZW50VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWV0aG9kRWxlbWVudFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzdmNzYzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXRob2RFbGVtZW50VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBDbGFzcyB3aXRoIHN0YXRpYyB1dGlsaXR5IG1ldGhvZHMgZm9yIHF1ZXJ5aW5nIG1ldGhvZCBlbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudFV0aWwgewotCi0JLyoqCi0JICogUmV0dXJuIG1ldGhvZCBtb2RlbCBvZiB0aGUgb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBsdWdpbiBnZXRNZXRob2RNb2RlbChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoTWV0aG9kRWxlbWVudCkgb2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGxpc3Qgb2YgbW9kZWxzIGFzIHNwZWNpZmllZC4uIDEuIE1ldGhvZCBtb2RlbCBvZiB0aGUgb2JqZWN0IDIuCi0JICogUmVmZXJlbmNlZCBtb2RlbHMgb2YgdGhlIG1ldGhvZCBtb2RlbCBvZiB0aGUgb2JqZWN0IChlLmcuIHJlZmVyZW5jZQotCSAqIHJlbGF0aW9uc2hpcCkKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxNb2RlbHMoT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IGFsbE1vZGVscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBnZXQgbWV0aG9kIG1vZGVsIG9mIHRoZSBvYmplY3QKLQkJTWV0aG9kUGx1Z2luIG1vZGVsID0gZ2V0TWV0aG9kTW9kZWwob2JqZWN0KTsKLQotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCi0JCQkvLyBnZXQgYWxsIGJhc2UgbW9kZWxzCi0JCQkvLwotCQkJTWlzYy5nZXRBbGxCYXNlKG1vZGVsLCBhbGxNb2RlbHMpOwotCi0JCQlhbGxNb2RlbHMuYWRkKG1vZGVsKTsKLQotCQl9Ci0KLQkJcmV0dXJuIGFsbE1vZGVsczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHJlZmVyZW5jZXMgZ3VpZGFuY2VzIGZvciB0aGUgZ2l2ZW4gb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoRU9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBpdGVtTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlMaXN0IHJlZmVyZW5jZXMgPSAoKEVPYmplY3QpIG9iamVjdCkuZUNyb3NzUmVmZXJlbmNlcygpOwotCQlpZiAocmVmZXJlbmNlcyAhPSBudWxsICYmIHJlZmVyZW5jZXMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSAoT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJCWl0ZW1MaXN0LmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWl0ZW1MaXN0Ci0JCQkJLmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmFjdGljZXMoKENvbnRlbnRFbGVtZW50KSBvYmplY3QpKTsKLQotCQlyZXR1cm4gaXRlbUxpc3Q7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWlzYy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWlzYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMmRhMTc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01pc2MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBNYW55IG1ldGhvZHMgb2YgdGhpcyBjbGFzcyBoYWQgYmVlbiBtb3ZlZCB0byBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWlzYyB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0QWxsV29ya1Byb2R1Y3RzKENvbnRlbnRQYWNrYWdlIHBrZywgTGlzdCBsaXN0KSB7Ci0JCUxpc3QgZWxlbWVudHMgPSBwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBlbGVtZW50cy5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQlsaXN0LmFkZChvYmopOwotCQkJfQotCQl9Ci0JCUxpc3QgcGFja2FnZXMgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gcGFja2FnZXMuZ2V0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJZ2V0QWxsV29ya1Byb2R1Y3RzKChDb250ZW50UGFja2FnZSkgb2JqLCBsaXN0KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxXb3JrUHJvZHVjdHMoQ29udGVudFBhY2thZ2UgcGtnKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0QWxsV29ya1Byb2R1Y3RzKHBrZywgbGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0QWxsVGFza3MoQ29udGVudFBhY2thZ2UgcGtnLCBMaXN0IGxpc3QpIHsKLQkJTGlzdCBlbGVtZW50cyA9IHBrZy5nZXRDb250ZW50RWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQkJbGlzdC5hZGQob2JqKTsKLQkJCX0KLQkJfQotCQlMaXN0IHBhY2thZ2VzID0gcGtnLmdldENoaWxkUGFja2FnZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrYWdlcy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IHBhY2thZ2VzLmdldChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCWdldEFsbFRhc2tzKChDb250ZW50UGFja2FnZSkgb2JqLCBsaXN0KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxUYXNrcyhDb250ZW50UGFja2FnZSBwa2cpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRBbGxUYXNrcyhwa2csIGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsVW5jYXRlZ29yaXplZFRhc2tzKENvbnRlbnRQYWNrYWdlIHBrZykgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldEFsbFVuY2F0ZWdvcml6ZWRUYXNrcyhwa2csIGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldEFsbFVuY2F0ZWdvcml6ZWRUYXNrcyhDb250ZW50UGFja2FnZSBwa2csIExpc3QgbGlzdCkgewotCQlMaXN0IGVsZW1lbnRzID0gcGtnLmdldENvbnRlbnRFbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gZWxlbWVudHMuZ2V0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2sKLQkJCQkJJiYgQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZXMoKFRhc2spIG9iaikuaXNFbXB0eSgpKSB7Ci0JCQkJbGlzdC5hZGQob2JqKTsKLQkJCX0KLQkJfQotCQlMaXN0IHBhY2thZ2VzID0gcGtnLmdldENoaWxkUGFja2FnZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrYWdlcy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IHBhY2thZ2VzLmdldChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCWdldEFsbFVuY2F0ZWdvcml6ZWRUYXNrcygoQ29udGVudFBhY2thZ2UpIG9iaiwgbGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFBhdGhSZWxhdGl2ZVRvUGx1Z2luKE5hbWVkRWxlbWVudCBlKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWxpc3QuYWRkKFN0cmluZy52YWx1ZU9mKGUuZ2V0TmFtZSgpKSk7Ci0JCWZvciAoZSA9IChOYW1lZEVsZW1lbnQpICgoRU9iamVjdCkgZSkuZUNvbnRhaW5lcigpOyBlICE9IG51bGwKLQkJCQkmJiBlICE9IHBsdWdpbjsgZSA9IChOYW1lZEVsZW1lbnQpICgoRU9iamVjdCkgZSkuZUNvbnRhaW5lcigpKSB7Ci0JCQlsaXN0LmFkZCgwLCBTdHJpbmcudmFsdWVPZihlLmdldE5hbWUoKSkpOwotCQl9Ci0JCVN0cmluZ1tdIHBhdGggPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHBhdGgpOwotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXRoUmVsYXRpdmVUb0xpYnJhcnkoTmFtZWRFbGVtZW50IGUpIHsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkKLQkJCXJldHVybiBlLmdldE5hbWUoKTsKLQkJU3RyaW5nQnVmZmVyIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKGUuZ2V0TmFtZSgpKTsKLQkJU3RyaW5nW10gYXJyID0gZ2V0UGF0aFJlbGF0aXZlVG9QbHVnaW4oZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYXRoLmFwcGVuZCgnLycpLmFwcGVuZChhcnJbaV0pOwotCQl9Ci0JCXJldHVybiBwYXRoLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgYmFzZSBwbHVnaW5zIG9mIHRoZSBnaXZlbiBwbHVnaW4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxCYXNlKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRBbGxCYXNlKHBsdWdpbiwgbGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRBbGxCYXNlKE1ldGhvZFBsdWdpbiBwbHVnaW4sIExpc3QgbGlzdCkgewotCQlMaXN0IGJhc2UgPSBwbHVnaW4uZ2V0QmFzZXMoKTsKLQotCQkvLyBDaGVjayBpZiB0aGUgYmFzZXMgaW4gdGhlIGxpc3QgYWxyZWFkeS4KLQkJaWYgKCFsaXN0LmNvbnRhaW5zQWxsKGJhc2UpKSB7Ci0JCQlsaXN0LmFkZEFsbChiYXNlKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGJhc2Uuc2l6ZSgpOyBpKyspIHsKLQkJCXBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGJhc2UuZ2V0KGkpOwotCQkJZ2V0QWxsQmFzZShwbHVnaW4sIGxpc3QpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmFzZU9mKE1ldGhvZFBsdWdpbiBiYXNlLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCX0KLQkJTGlzdCBiYXNlcyA9IHBsdWdpbi5nZXRCYXNlcygpOwotCQlpbnQgc2l6ZSA9IGJhc2VzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChiYXNlID09IGJhc2VzLmdldChpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGlzQmFzZU9mKGJhc2UsIChNZXRob2RQbHVnaW4pIGJhc2VzLmdldChpKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTW9kZWxTdHJ1Y3R1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01vZGVsU3RydWN0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzYTM1OTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTW9kZWxTdHJ1Y3R1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotCi0KLS8qKgotICogRGVmaW5lcyBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgYSBtZXRob2QgcGx1Z2luIHdpdGggcHJlZGVmaW5lZCBwYWNrYWdlcwotICogIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsU3RydWN0dXJlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTW9kZWxTdHJ1Y3R1cmUgREVGQVVMVCA9IG5ldyBNb2RlbFN0cnVjdHVyZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElEREVOX1BBQ0tBR0VfTkFNRSA9ICJIaWRkZW4iOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9QQUNLQUdFX05BTUUgPSAiQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1JFX0NPTlRFTlRfUEFDQUtHRV9OQU1FID0gIkNvcmVDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SSUVTID0gIkNhdGVnb3JpZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9TRVRfUEFDS0FHRV9OQU1FID0gIlJvbGVTZXRzIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NJUExJTkVfUEFDS0FHRV9OQU1FID0gIkRpc2NpcGxpbmVzIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DQVRFR09SWV9QQUNLQUdFX05BTUUgPSAiQ3VzdG9tQ2F0ZWdvcmllcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfQ09SRV9DT05URU5UX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCBDT1JFX0NPTlRFTlRfUEFDQUtHRV9OQU1FIH07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1JPTEVfU0VUX1BBQ0tBR0VfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsICBST0xFX1NFVF9QQUNLQUdFX05BTUV9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX0RJU0NJUExJTkVfREVGX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCBDQVRFR09SSUVTLCBESVNDSVBMSU5FX1BBQ0tBR0VfTkFNRSB9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9UT09MX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCBDQVRFR09SSUVTLCAiVG9vbHMiIH07IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfU1RBTkRBUkRfQ0FURUdPUllfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsICJTdGFuZGFyZENhdGVnb3JpZXMiIH07IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfREVMSVZFUllfUFJPQ0VTU19QQVRIID0geyAiRGVsaXZlcnlQcm9jZXNzZXMiIH07IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfQ0FQQUJJTElUWV9QQVRURVJOX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCAiQ2FwYWJpbGl0eVBhdHRlcm5zIiB9OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfRE9NQUlOX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCBDQVRFR09SSUVTLCAiRG9tYWlucyIgfTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1dPUktfUFJPRFVDVF9UWVBFX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCBDQVRFR09SSUVTLCAiV1AgVHlwZXMiIH07IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9DVVNUT01fQ0FURUdPUllfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsICBDVVNUT01fQ0FURUdPUllfUEFDS0FHRV9OQU1FfTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfRVNUSU1BVElOR19NT0RFTFNfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsICJFc3RpbWF0aW5nTW9kZWxzIiB9OyAvLyROT04tTkxTLTEkCi0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfUFJPQ0VTU19DT05UUklCVVRJT05fUEFUSCA9IHsgIlByb2Nlc3NDb250cmlidXRpb25zIiB9OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1BST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfUEFUSCA9IHsgIlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlcyIgfTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEFMTF9QUkVERUZJTkVEX1BBVEhTID0gbmV3IEhhc2hTZXQoKTsKLQotCXB1YmxpYyBTdHJpbmdbXSBjb3JlQ29udGVudFBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gcm9sZVNldFBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gZGlzY2lwbGluZURlZmluaXRpb25QYXRoOwotCi0JcHVibGljIFN0cmluZ1tdIGRvbWFpblBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gdG9vbFBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gY2FwYWJpbGl0eVBhdHRlcm5QYXRoOwotCi0JcHVibGljIFN0cmluZ1tdIGRlbGl2ZXJ5UHJvY2Vzc1BhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gd29ya1Byb2R1Y3RUeXBlUGF0aDsKLQotCXB1YmxpYyBTdHJpbmdbXSBwcm9jZXNzQ29udHJpYnV0aW9uUGF0aDsKLQotCXB1YmxpYyBTdHJpbmdbXSBjdXN0b21DYXRlZ29yeVBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gZXN0aW1hdGluZ01vZGVsUGF0aDsKLQkKLQlwdWJsaWMgU3RyaW5nW10gc3RhbmRhcmRDYXRlZ29yeVBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVQYXRoOwotCi0JLyoqCi0JICogdGhpcyBpcyB0aGUgbWV0aG9kIHRvIHJldHVybiBhbGwgdGhlIHN5c3RlbSBkZWZpbmVkIHBhY2thZ2UgcGF0aCBQbGVhc2UKLQkgKiBhZGQgdGhpcyB0aGlzIGFycmF5IHdoZW4gZXZlciB5b3UgaGF2ZSBuZXcgc3lzdGVtIHBhY2thZ2VzIGRlZmluZWQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZ1tdW10gZ2V0QWxsU3lzdGVtUGF0aHMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW11bXSB7IGNvcmVDb250ZW50UGF0aCwgcm9sZVNldFBhdGgsCi0JCQkJZGlzY2lwbGluZURlZmluaXRpb25QYXRoLCBkb21haW5QYXRoLCB0b29sUGF0aCwKLQkJCQljYXBhYmlsaXR5UGF0dGVyblBhdGgsIGRlbGl2ZXJ5UHJvY2Vzc1BhdGgsCi0JCQkJd29ya1Byb2R1Y3RUeXBlUGF0aCwgcHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGgsCi0JCQkJY3VzdG9tQ2F0ZWdvcnlQYXRoLCBzdGFuZGFyZENhdGVnb3J5UGF0aCwKLQkJCQlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZVBhdGgsIH07Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdW10gZ2V0Q2F0ZWdvcnlQYXRocygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXVtdIHsgcm9sZVNldFBhdGgsIGRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCwKLQkJCQlkb21haW5QYXRoLCB0b29sUGF0aCwgd29ya1Byb2R1Y3RUeXBlUGF0aCwKLQkJCQlzdGFuZGFyZENhdGVnb3J5UGF0aCwgY3VzdG9tQ2F0ZWdvcnlQYXRoLCB9OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvTGluZXMoU3RyaW5nW10gcGF0aCkgewotCQlTdHJpbmdCdWZmZXIgbGluZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBtYXggPSBwYXRoLmxlbmd0aCAtIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCWxpbmVzLmFwcGVuZChwYXRoW2ldKS5hcHBlbmQoJ1xuJyk7Ci0JCX0KLQkJbGluZXMuYXBwZW5kKHBhdGhbbWF4XSk7Ci0JCXJldHVybiBsaW5lcy50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvRmlsZVBhdGgoU3RyaW5nW10gcGF0aCkgewotCQlTdHJpbmdCdWZmZXIgbGluZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBtYXggPSBwYXRoLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJbGluZXMuYXBwZW5kKHBhdGhbaV0pLmFwcGVuZCgnLycpOwotCQl9Ci0JCXJldHVybiBsaW5lcy50b1N0cmluZygpOwotCX0KLQotCXN0YXRpYyB7Ci0JCURFRkFVTFQuY29yZUNvbnRlbnRQYXRoID0gREVGQVVMVF9DT1JFX0NPTlRFTlRfUEFUSDsKLQkJREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGggPSBERUZBVUxUX0RJU0NJUExJTkVfREVGX1BBVEg7Ci0JCURFRkFVTFQucm9sZVNldFBhdGggPSBERUZBVUxUX1JPTEVfU0VUX1BBQ0tBR0VfUEFUSDsKLQkJREVGQVVMVC5kb21haW5QYXRoID0gREVGQVVMVF9ET01BSU5fUEFUSDsKLQkJREVGQVVMVC50b29sUGF0aCA9IERFRkFVTFRfVE9PTF9QQVRIOwotCQlERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCA9IERFRkFVTFRfQ0FQQUJJTElUWV9QQVRURVJOX1BBVEg7Ci0JCURFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aCA9IERFRkFVTFRfREVMSVZFUllfUFJPQ0VTU19QQVRIOwotCQlERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGggPSBERUZBVUxUX1dPUktfUFJPRFVDVF9UWVBFX1BBVEg7Ci0JCURFRkFVTFQucHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGggPSBERUZBVUxUX1BST0NFU1NfQ09OVFJJQlVUSU9OX1BBVEg7Ci0JCURFRkFVTFQuc3RhbmRhcmRDYXRlZ29yeVBhdGggPSBERUZBVUxUX1NUQU5EQVJEX0NBVEVHT1JZX1BBVEg7Ci0JCURFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoID0gREVGQVVMVF9DVVNUT01fQ0FURUdPUllfUEFUSDsKLQkJREVGQVVMVC5lc3RpbWF0aW5nTW9kZWxQYXRoID0gREVGQVVMVF9FU1RJTUFUSU5HX01PREVMU19QQVRIOwotCQlERUZBVUxULnByb2Nlc3NQbGFubmluZ1RlbXBsYXRlUGF0aCA9IERFRkFVTFRfUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9QQVRIOwotCi0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQuY29yZUNvbnRlbnRQYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQucm9sZVNldFBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5kb21haW5QYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQudG9vbFBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCkpOwotCQlBTExfUFJFREVGSU5FRF9QQVRIUy5hZGQodG9GaWxlUGF0aChERUZBVUxULnByb2Nlc3NDb250cmlidXRpb25QYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQuc3RhbmRhcmRDYXRlZ29yeVBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5lc3RpbWF0aW5nTW9kZWxQYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTCi0JCQkJLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQucHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVQYXRoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzUGFja2FnZSBjcmVhdGVQcm9jZXNzQ29udHJpYnV0aW9uUGFja2FnZSgKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJLy8gYm9vbGVhbiBvbGQgPSBwbHVnaW4uZURlbGl2ZXIoKTsKLQkJdHJ5IHsKLQkJCS8vIGNyZWF0ZSBQcm9jZXNzQ29udHJpYnV0aW9ucyBwcm9jZXNzIHBhY2thZ2UKLQkJCS8vCi0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJcGtnLnNldE5hbWUoTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5wcm9jZXNzQ29udHJpYnV0aW9uUGF0aFswXSk7Ci0KLQkJCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uCi0JCQkvLwotCQkJcGx1Z2luLmVTZXREZWxpdmVyKGZhbHNlKTsKLQotCQkJcGx1Z2luLmdldE1ldGhvZFBhY2thZ2VzKCkuYWRkKHBrZyk7Ci0JCQlyZXR1cm4gcGtnOwotCQl9IGZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSBvcmlnaW5hbCBub3RpZmFjdGlvbiBzZXR0aW5nCi0JCQkvLwotCQkJcGx1Z2luLmVTZXREZWxpdmVyKHRydWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzUGFja2FnZSBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZVBhY2thZ2UoCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCS8vIGJvb2xlYW4gb2xkID0gcGx1Z2luLmVEZWxpdmVyKCk7Ci0JCXRyeSB7Ci0JCQkvLyBjcmVhdGUgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVzIHByb2Nlc3MgcGFja2FnZQotCQkJLy8KLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQlwa2cuc2V0TmFtZShNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnByb2Nlc3NQbGFubmluZ1RlbXBsYXRlUGF0aFswXSk7Ci0KLQkJCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uCi0JCQkvLwotCQkJcGx1Z2luLmVTZXREZWxpdmVyKGZhbHNlKTsKLQotCQkJcGx1Z2luLmdldE1ldGhvZFBhY2thZ2VzKCkuYWRkKHBrZyk7Ci0JCQlyZXR1cm4gcGtnOwotCQl9IGZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSBvcmlnaW5hbCBub3RpZmFjdGlvbiBzZXR0aW5nCi0JCQkvLwotCQkJcGx1Z2luLmVTZXREZWxpdmVyKHRydWUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9QbHVnaW5VSVBhY2thZ2VzTWFwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9QbHVnaW5VSVBhY2thZ2VzTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkMzg2YWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvUGx1Z2luVUlQYWNrYWdlc01hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0vKioKLSAqIEhvbGRzIGEgbWFwIG9mIFBsdWdpbiBQYWNrYWdlIG5hbWVzIHRvIHRoZSBsaXN0IG9mIHBsdWdpbnMgY29udGFpbmVkIGJ5IHRoZW0KLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpblVJUGFja2FnZXNNYXAgZXh0ZW5kcyBIYXNoTWFwPFN0cmluZywgU2V0PE1ldGhvZFBsdWdpbj4+IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04MzIxMzc5MDE1ODcwMDkwMjU2TDsKLQotCXB1YmxpYyBQbHVnaW5VSVBhY2thZ2VzTWFwKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIHBhY2thZ2VOYW1lLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCVNldDxNZXRob2RQbHVnaW4+IHBsdWdpbnMgPSBnZXQocGFja2FnZU5hbWUpOwotCQlpZiAocGx1Z2lucyA9PSBudWxsKSB7Ci0JCQlwbHVnaW5zID0gbmV3IEhhc2hTZXQ8TWV0aG9kUGx1Z2luPigpOwotCQl9Ci0JCXBsdWdpbnMuYWRkKHBsdWdpbik7Ci0JCXB1dChwYWNrYWdlTmFtZSwgcGx1Z2lucyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvUHJlZGVjZXNzb3JMaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9QcmVkZWNlc3Nvckxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzViZGQ3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9QcmVkZWNlc3Nvckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgcHJlZGVjZXNzb3IgbGlzdCBvZiBhbiBpdGVtIHByb3ZpZGVyIGZvciBhIHdvcmsKLSAqIGJyZWFrZG93biBlbGVtZW50LiBJdCBjYWxjdWxhdGVzIHRoZSBwcmVkZWNlc3NvcnMgYmFzZWQgb24gdGhlIGN1cnJlbnRseQotICogc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBhbmQgYWNjb3JkaW5nIHRvIHZhcmlhYmlsaXR5IHJ1bGVzLiBJdCBjYW4gcmVmcmVzaAotICogaXRzZWxmIHVwb24gY2hhbmdlIGluIHByZWRlY2Vzc29yIGxpc3Qgb2Ygd29yayBicmVha2Rvd24gZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByZWRlY2Vzc29yTGlzdCBleHRlbmRzIEFycmF5TGlzdCB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzNjE3ODUzMDkyNTcwNDEyMDgyTDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZGVjZXNzb3JMaXN0IEVNUFRZX0xJU1QgPSBuZXcgUHJlZGVjZXNzb3JMaXN0KCkgewotCi0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzkwNDY3NjA5ODIxNzA5NzAxNkw7Ci0KLQkJcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IGVsZW1lbnQpIHsKLQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbiBjKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIGphdmEudXRpbC5Db2xsZWN0aW9uIGMpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgT2JqZWN0IG9iamVjdDsKLQotCXByaXZhdGUgQWRhcHRlciBsaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24gbXNnKSB7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoQnJlYWtkb3duRWxlbWVudC5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SOgotCQkJCXJlZnJlc2goKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBQcmVkZWNlc3Nvckxpc3QoKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgUHJlZGVjZXNzb3JMaXN0KEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQllLmVBZGFwdGVycygpLmFkZCgwLCBsaXN0ZW5lcik7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCWlmIChlIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJKChFT2JqZWN0KSBlKS5lQWRhcHRlcnMoKS5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0JCWNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmlnaHQgdG9wIGl0ZW0gaW4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdHJlZSB0byBzZWFyY2ggZm9yCi0JICogaXRlbSBwcm92aWRlcnMgb2YgcHJlZGVjZXNzb3JzCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldFRvcEl0ZW0oKSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3Q7Ci0JCQlpZiAoaXRlbVByb3ZpZGVyLmlzUmVhZE9ubHkoKSkgewotCQkJCS8vIHRoaXMgcmVwcmVzZW50cyBhbiBpbmhlcml0ZWQgYnJlYWtkb3duIGVsZW1lbnQKLQkJCQkvLwotCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlKTsKLQotCQkJCU9iamVjdCB0b3AgPSBpdGVtUHJvdmlkZXI7Ci0JCQkJZm9yIChPYmplY3QgcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChvYmplY3QpOyBwYXJlbnQgIT0gbnVsbDspIHsKLQkJCQkJdG9wID0gcGFyZW50OwotCQkJCQlCcmVha2Rvd25FbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbAotCQkJCQkJCS51bndyYXAocGFyZW50KTsKLQkJCQkJUHJvY2VzcyBwYXJlbnRQcm9jID0gVG5nVXRpbAotCQkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKHBhcmVudEVsZW1lbnQpOwotCQkJCQlpZiAocGFyZW50UHJvYyAhPSBwcm9jKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJCQlwYXJlbnQgPSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgcGFyZW50KQotCQkJCQkJCQkuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChwYXJlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0b3A7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBpdGVtUHJvdmlkZXIuZ2V0VG9wSXRlbSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQkJb2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0VG9wSXRlbSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0KLQkJaWYgKFRuZ1V0aWwudW53cmFwKG9iamVjdCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbAotCQkJCQkudW53cmFwKG9iamVjdCk7Ci0JCQlMaXN0IHdvcmtPcmRlcnMgPSBlLmdldExpbmtUb1ByZWRlY2Vzc29yKCk7Ci0JCQlpZiAod29ya09yZGVycy5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuOwotCQkJT2JqZWN0IHRvcCA9IGdldFRvcEl0ZW0oKTsKLQkJCUFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LCB0b3ApOwotCi0JCQkvLyBjb3B5IHRoZSB0cmVlIHRvIGEgbWFwIG9mIGJyZWFrZG93biBlbGVtZW50IC8gaXRlbSBwcm92aWRlciBmb3IKLQkJCS8vIHJldXNlCi0JCQkvLwotCQkJSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBiZSA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0JCQkJT2JqZWN0IGlwID0gYWRhcHRlckZhY3RvcnkuYWRhcHQob2JqLAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQltYXAucHV0KGJlLCBpcCk7Ci0JCQkJaWYgKGJlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGJlOwotCQkJCQlpZiAodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCW1hcC5wdXQodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCBpcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIXdvcmtPcmRlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJaW50IG4gPSB3b3JrT3JkZXJzLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJCQlXb3JrT3JkZXIgd29ya09yZGVyID0gKFdvcmtPcmRlcikgd29ya09yZGVycy5nZXQoaSk7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnQgcHJlZCA9IHdvcmtPcmRlci5nZXRQcmVkKCk7Ci0KLQkJCQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgbWFwCi0JCQkJCQkJLmdldChwcmVkKTsKLQkJCQkJaWYgKGJzSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJCWFkZChic0l0ZW1Qcm92aWRlcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKCkgewotCQljbGVhcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uI3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdG9VblN1cHByZXNzZWRTdHJpbmcobnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1VuU3VwcHJlc3NlZFN0cmluZyhTdXBwcmVzc2lvbiBzdXApIHsKLQkJLy8gcmVtb3ZlIHRoZSBpdGVtIHByb3ZpZGVycyBvZiB0aGUgZGVsZXRlZCBlbGVtZW50cwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJZSA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgZSkuZ2V0VGFyZ2V0KCk7Ci0JCQkJaWYgKGUgPT0gbnVsbCkgewotCQkJCQkvLyBvYmplY3QgZGVsZXRlZAotCQkJCQkvLwotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCUJyZWFrZG93bkVsZW1lbnQgYmUgPSAoQnJlYWtkb3duRWxlbWVudCkgZTsKLQkJCQlBY3Rpdml0eSBzdXBlckFjdCA9IGJlLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCWlmIChzdXBlckFjdCA9PSBudWxsICYmIFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhiZSkgIT0gYmUpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaXNFbXB0eSgpKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IG4gPSBzaXplKCkgLSAxOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0KGkpOwotCQkJaWYgKChzdXAgPT0gbnVsbCkgfHwgIXN1cC5pc1N1cHByZXNzZWQoYnNJdGVtUHJvdmlkZXIpKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZChic0l0ZW1Qcm92aWRlci5nZXRJZCgpKS5hcHBlbmQoJywnKTsKLQkJCX0KLQkJfQotCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXQobik7Ci0JCWlmICgoc3VwID09IG51bGwpIHx8ICFzdXAuaXNTdXBwcmVzc2VkKGJzSXRlbVByb3ZpZGVyKSkgewotCQkJc3RyQnVmLmFwcGVuZChic0l0ZW1Qcm92aWRlci5nZXRJZCgpKTsKLQkJfQotCi0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1Byb2Nlc3NVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Qcm9jZXNzVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZWRiNDAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1Byb2Nlc3NVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Db21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5EZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUHJvY2Vzc0NvbW1hbmRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLldCU0Ryb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5OYW1lQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdGhhdCBkZWZpbmVzIHN0YXRpYyBtZXRob2RzIGZvciBwcm9jZXNzIGF1dGhvcmluZwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFByb2Nlc3NVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIE9CU0VjbGFzc2VzID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb24gV0JTRWNsYXNzZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBQQlNFY2xhc3NlcyA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGV4dGVuZEFuZExvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHlUeXBlcyA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGdldEV4dGVuZEFuZExvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHlUeXBlcygpIHsKLQkJaWYgKGV4dGVuZEFuZExvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHlUeXBlcyA9PSBudWxsKSB7Ci0JCQlleHRlbmRBbmRMb2NhbENvbnRyaWJ1dGlvblZhcmlhYmlsaXR5VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlleHRlbmRBbmRMb2NhbENvbnRyaWJ1dGlvblZhcmlhYmlsaXR5VHlwZXMKLQkJCQkJLmFkZChWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKTsKLQkJCWV4dGVuZEFuZExvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHlUeXBlcwotCQkJCQkuYWRkKFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT05fTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuZEFuZExvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHlUeXBlczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0JyZWFrZG93bkVsZW1lbnROYW1lKAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIEJyZWFrZG93bkVsZW1lbnQgZSwgU3RyaW5nIG5hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCXJldHVybiBOYW1lQ2hlY2tlci5jaGVja05hbWUoYWRhcHRlckZhY3RvcnksIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIG5hbWUsIHN1cHByZXNzaW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tCcmVha2Rvd25FbGVtZW50TmFtZSgKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBCcmVha2Rvd25FbGVtZW50IGUsIFN0cmluZyBuYW1lLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgYm9vbGVhbiBpZ25vcmVTdXBwcmVzc2VkKSB7Ci0JCXJldHVybiBOYW1lQ2hlY2tlci5jaGVja05hbWUoYWRhcHRlckZhY3RvcnksIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIG5hbWUsIHN1cHByZXNzaW9uLCBpZ25vcmVTdXBwcmVzc2VkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIEJyZWFrZG93bkVsZW1lbnQgZSwgU3RyaW5nIG5hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCS8vIG1pZ2h0IGFsbG93IGVtcHR5IHByZXNlbnRhdGlvbiBuYW1lIGZvciBleHRlbmRlciBvciBjb250cmlidXRvci4gVGhlIGVsZW1lbnQgd2lsbCBpbmhlcml0Ci0JCS8vIHRoZSBwcmVzZW50YXRpb24gbmFtZSBmcm9tIHRoZSBiYXNlIGVsZW1lbnQuIENoZWNrIHdpbGwgYmUgcGVyZm9ybWVkIG9uIHRoZSBpbmhlcml0ZWQgbmFtZQotCQkvLwotCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJaWYgKGlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKGUpKSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBiYXNlID0gKEJyZWFrZG93bkVsZW1lbnQpICgoVmFyaWFiaWxpdHlFbGVtZW50KSBlKQotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQluYW1lID0gZ2V0UHJlc2VudGF0aW9uTmFtZShiYXNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gTmFtZUNoZWNrZXIuY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLCBuYW1lLCBzdXBwcmVzc2lvbik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrQnJlYWtkb3duRWxlbWVudFByZXNlbnRhdGlvbk5hbWUoCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgQnJlYWtkb3duRWxlbWVudCBlLCBTdHJpbmcgbmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIGJvb2xlYW4gaWdub3JlU3VwcHJlc3NlZCkgewotCi0JCXJldHVybiBOYW1lQ2hlY2tlci5jaGVja05hbWUoYWRhcHRlckZhY3RvcnksIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksIG5hbWUsIHN1cHByZXNzaW9uLCBpZ25vcmVTdXBwcmVzc2VkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRSb290UHJvY2VzcyhBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciwgT2JqZWN0IG9iaikgewotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQob2JqKTsKLQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChwYXJlbnQsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gb2JqOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGdldFJvb3RQcm9jZXNzKGFkYXB0ZXJGYWN0b3J5LCBhZGFwdGVyLCBwYXJlbnQpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldFdCU0VjbGFzc2VzKCkgewotCQlpZiAoV0JTRWNsYXNzZXMgPT0gbnVsbCkgewotCQkJV0JTRWNsYXNzZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJV0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yKCkpOwotCQkJV0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCkpOwotCQkJV0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1pbGVzdG9uZSgpKTsKLQkJfQotCQlyZXR1cm4gV0JTRWNsYXNzZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldE9CU0VjbGFzc2VzKCkgewotCQlpZiAoT0JTRWNsYXNzZXMgPT0gbnVsbCkgewotCQkJT0JTRWNsYXNzZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJT0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yKCkpOwotCQkJT0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCkpOwotCQkJT0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1pbGVzdG9uZSgpKTsKLQkJCU9CU0VjbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZSgpKTsKLQkJCU9CU0VjbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb3NpdGVSb2xlKCkpOwotCQl9Ci0KLQkJcmV0dXJuIE9CU0VjbGFzc2VzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXRQQlNFY2xhc3NlcygpIHsKLQkJaWYgKFBCU0VjbGFzc2VzID09IG51bGwpIHsKLQkJCVBCU0VjbGFzc2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCVBCU0VjbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSk7Ci0JCQlQQlNFY2xhc3Nlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKSk7Ci0JCQlQQlNFY2xhc3Nlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWlsZXN0b25lKCkpOwotCQl9Ci0JCXJldHVybiBQQlNFY2xhc3NlczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGaXJzdEVsZW1lbnQoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGl0ZW1Qcm92aWRlciwgT2JqZWN0IG9iaikgewotCQlPYmplY3QgcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChvYmopOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJTGlua2VkTGlzdCBzaWJsaW5ncyA9IGdldFNpYmxpbmdzKGFkYXB0ZXJGYWN0b3J5LCBpdGVtUHJvdmlkZXIsIG9iaik7Ci0JCWlmIChzaWJsaW5ncyAhPSBudWxsICYmICFzaWJsaW5ncy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBzaWJsaW5ncy5nZXRGaXJzdCgpID09IG9iajsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpbmtlZExpc3QgZ2V0U2libGluZ3MoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGl0ZW1Qcm92aWRlciwgT2JqZWN0IG9iaikgewotCQlPYmplY3QgcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChvYmopOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHBhcmVudEl0ZW1Qcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKHBhcmVudEl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IExpbmtlZExpc3QocGFyZW50SXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKHBhcmVudCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xhc3RFbGVtZW50KEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBpdGVtUHJvdmlkZXIsIE9iamVjdCBvYmopIHsKLQkJT2JqZWN0IHBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQob2JqKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKQotCQkJcmV0dXJuIHRydWU7Ci0JCUxpbmtlZExpc3Qgc2libGluZ3MgPSBnZXRTaWJsaW5ncyhhZGFwdGVyRmFjdG9yeSwgaXRlbVByb3ZpZGVyLCBvYmopOwotCQlpZiAoc2libGluZ3MgIT0gbnVsbCAmJiAhc2libGluZ3MuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gc2libGluZ3MuZ2V0TGFzdCgpID09IG9iajsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGFmZmVjdGVkIGFmdGVyIHRoZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUKLQkgKiBnaXZlbiBub3RpZmljYXRpb24uCi0JICogCi0JICogQHBhcmFtIG5vdGlmaWNhdGlvbgotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFmZmVjdGVkRWxlbWVudHMoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwKLQkJCUlGaWx0ZXIgZmlsdGVyKSB7Ci0JCUxpc3QgYWZmZWN0ZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJT2JqZWN0IG9iaiA9IG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQob2JqKSkgewotCQkJCWFmZmVjdGVkRWxlbWVudHMuYWRkKG9iaik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChlbGVtZW50KSkgewotCQkJCQlhZmZlY3RlZEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJb2JqID0gbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCk7Ci0JCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChvYmopKSB7Ci0JCQkJYWZmZWN0ZWRFbGVtZW50cy5hZGQob2JqKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KGVsZW1lbnQpKSB7Ci0JCQkJCWFmZmVjdGVkRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgTm90aWZpY2F0aW9uLk1PVkU6Ci0JCQlvYmogPSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBvYmopLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KGVsZW1lbnQpKSB7Ci0JCQkJCQlhZmZlY3RlZEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQob2JqKSkgewotCQkJCQlhZmZlY3RlZEVsZW1lbnRzLmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBhZmZlY3RlZEVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlZnJlc2hSZXF1aXJlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLAotCQkJSUZpbHRlciBmaWx0ZXIpIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQlPYmplY3Qgb2JqID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChvYmopKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJb2JqID0gbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCk7Ci0JCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChvYmopKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIE5vdGlmaWNhdGlvbi5NT1ZFOgotCQkJb2JqID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgb2JqKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChlbGVtZW50KSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KG9iaikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFRvQ29udGFpbmVyKEJyZWFrZG93bkVsZW1lbnQgZSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgaXRlbVByb3ZpZGVyKSB7Ci0JCWFkZFRvQ29udGFpbmVyKGUsIGl0ZW1Qcm92aWRlciwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gQnJlYWtkb3duRWxlbWVudCB0byBhIG5ldyBjb250YWluZXIgaWYgaXQgZG9lcyBub3QgaGF2ZQotCSAqIG9uZSBvciBtb3ZlcyBpdCB0byB0aGUgcmlnaHQgY29udGFpbmVyIGlmIHJlcXVlc3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBpdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkVG9Db250YWluZXIoQnJlYWtkb3duRWxlbWVudCBlLAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBpdGVtUHJvdmlkZXIsIGJvb2xlYW4gbW92ZSkgewotCQlQcm9jZXNzUGFja2FnZSBwa2cgPSBudWxsOwotCQlPYmplY3QgcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChlKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVPYmplY3QgY29udGFpbmVyID0gKChFT2JqZWN0KSBwYXJlbnQpLmVDb250YWluZXIoKTsKLQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCXBrZyA9IChQcm9jZXNzUGFja2FnZSkgY29udGFpbmVyOwotCQkJfQotCQl9Ci0KLQkJaWYgKHBrZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGU7Ci0JCQlpZiAoYWN0LmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJLy8gY3JlYXRlIG5ldyBQcm9jZXNzUGFja2FnZSBmb3IgdGhlIGFjdGl2aXR5Ci0JCQkJLy8KLQkJCQlQcm9jZXNzUGFja2FnZSBuZXdQa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQkJbmV3UGtnLnNldE5hbWUoYWN0LmdldE5hbWUoKSk7Ci0JCQkJcGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQobmV3UGtnKTsKLQkJCQluZXdQa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKGUpOwotCQkJfSBlbHNlIGlmIChtb3ZlKSB7Ci0JCQkJLy8gQ2hlY2sgaWYgdGhlIGFjdGl2aXR5J3MgUHJvY2Vzc1BhY2thZ2UgaXMgYXQgdGhlIHJpZ2h0IHBsYWNlLgotCQkJCS8vIElmIG5vdCwgbW92ZSBpdCB0byB0aGUgcmlnaHQgUHJvY2Vzc0NvbXBvbmVudC4KLQkJCQkvLwotCQkJCVByb2Nlc3NQYWNrYWdlIG9sZFBrZyA9IChQcm9jZXNzUGFja2FnZSkgYWN0LmVDb250YWluZXIoKTsKLQkJCQlpZiAob2xkUGtnLmVDb250YWluZXIoKSAhPSBwa2cpIHsKLQkJCQkJcGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQob2xkUGtnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoZSk7Ci0JCQl9IGVsc2UgaWYgKG1vdmUgJiYgZS5lQ29udGFpbmVyKCkgIT0gcGtnKSB7Ci0JCQkJLy8gbW92ZSB0byBuZXcgUHJvY2Vzc1BhY2thZ2UKLQkJCQkvLwotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBjaGlsZCwgT2JqZWN0IHBhcmVudCwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoY2hpbGQsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCSgoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRQYXJlbnQocGFyZW50KTsKLQkJfSAKLS8vCQllbHNlIHsKLS8vCQkJU3lzdGVtLm91dAotLy8JCQkJCS5wcmludGxuKExpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NldHBhcmVudCArIGNoaWxkKTsgLy8kTk9OLU5MUy0xJAotLy8JCQlTeXN0ZW0ub3V0Ci0vLwkJCQkJLnByaW50bG4oTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9Qcm9jZXNzVXRpbF9jaGlsZGFkYXB0ZXIgKyBhZGFwdGVyKTsgLy8kTk9OLU5MUy0xJAotLy8JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IFJvbGVEZXNjcmlwdG9yIGZyb20gdGhlIGdpdmVuIHJvbGUuCi0JICogCi0JICogQHBhcmFtIHJvbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBSb2xlRGVzY3JpcHRvciBjcmVhdGVSb2xlRGVzY3JpcHRvcihSb2xlIHJvbGUpIHsKLQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRvcigpOwotCQlyb2xlRGVzYy5zZXRSb2xlKHJvbGUpOwotCQlTdHJpbmcgcHJlc2VudGF0aW9uTmFtZSA9IHJvbGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQlyb2xlRGVzYy5zZXROYW1lKHJvbGUuZ2V0TmFtZSgpKTsKLQkJcm9sZURlc2Muc2V0UHJlc2VudGF0aW9uTmFtZShTdHJVdGlsLmlzQmxhbmsocHJlc2VudGF0aW9uTmFtZSkgPyByb2xlCi0JCQkJLmdldE5hbWUoKSA6IHByZXNlbnRhdGlvbk5hbWUpOwotCQkvLyByb2xlRGVzYy5zZXRCcmllZkRlc2NyaXB0aW9uKHJvbGUuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJcmV0dXJuIHJvbGVEZXNjOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigKLQkJCVdvcmtQcm9kdWN0IHdwKSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKTsKLQkJd3BEZXNjLnNldFdvcmtQcm9kdWN0KHdwKTsKLQkJd3BEZXNjLnNldE5hbWUod3AuZ2V0TmFtZSgpKTsKLQkJd3BEZXNjCi0JCQkJLnNldFByZXNlbnRhdGlvbk5hbWUoU3RyVXRpbC5pc0JsYW5rKHdwLmdldFByZXNlbnRhdGlvbk5hbWUoKSkgPyB3cAotCQkJCQkJLmdldE5hbWUoKQotCQkJCQkJOiB3cC5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCQkvLyB3cERlc2Muc2V0QnJpZWZEZXNjcmlwdGlvbih3cC5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCQlyZXR1cm4gd3BEZXNjOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVmlld2VyIGdldFZpZXdlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgUHJvY2VzcyBwcm9jKSB7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgKLQkJCQkJKChFeHBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGxpc3RlbmVyID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSUNvbnRlbnRQcm92aWRlciAmJiBsaXN0ZW5lciBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgewkJCQkJCi0JCQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcikgbGlzdGVuZXIpLmdldFZpZXdlcigpOwotCQkJCQlpZiAodmlld2VyLmdldElucHV0KCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJCQkJJiYgKChQcm9jZXNzQ29tcG9uZW50KSB2aWV3ZXIuZ2V0SW5wdXQoKSkKLQkJCQkJCQkJCS5nZXRQcm9jZXNzKCkgPT0gcHJvYykKLQkJCQkJCXJldHVybiB2aWV3ZXI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZWZyZXNoTmVlZGVkKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIpIHsKLQkJUHJvY2VzcyBwcm9jZXNzID0gKFByb2Nlc3MpIGl0ZW1Qcm92aWRlci5nZXRUb3BJdGVtKCk7Ci0JCWlmIChwcm9jZXNzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gY2hlY2sgaWYgdGhlIGdpdmVuIHByb2Nlc3MgaXMgY3VycmVudGx5IG9wZW5lZCBpbiBlZGl0b3IKLQkJLy8KLQkJVmlld2VyIHZpZXdlciA9IGdldFZpZXdlcihhZGFwdGVyRmFjdG9yeSwgcHJvY2Vzcyk7Ci0JCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiB2aWV3ZXIuZ2V0Q29udHJvbCgpICE9IG51bGwKLQkJCQkmJiAhdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gVG5nVXRpbC5nZXRDb250cmlidXRvcnMocHJvY2Vzcyk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQoZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChyZWZyZXNoTmVlZGVkKGFkYXB0ZXJGYWN0b3J5LCBhZGFwdGVyKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKHByb2Nlc3MsCi0JCQkJVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQoZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChyZWZyZXNoTmVlZGVkKGFkYXB0ZXJGYWN0b3J5LCBhZGFwdGVyKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hQcmVkZWNjZXNzb3JMaXN0cyhBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBQcm9jZXNzIHByb2MpIHsKLQkJT2JqZWN0IG9iajsKLQkJT2JqZWN0IGVsZW1lbnQ7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihmYWN0b3J5LCBwcm9jKTsgaXRlcgotCQkuaGFzTmV4dCgpOykgewotCQkJb2JqID0gaXRlci5uZXh0KCk7Ci0JCQllbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqKTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCU9iamVjdCBhZGFwdGVyID0gZmFjdG9yeS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsJCQkJCi0JCQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJCQlQcmVkZWNlc3Nvckxpc3QgcHJlZExpc3QgPSBpdGVtUHJvdmlkZXIuZ2V0UHJlZGVjZXNzb3JzKCk7Ci0JCQkJCWlmKHByZWRMaXN0ICE9IG51bGwpIHsKLQkJCQkJCXByZWRMaXN0LnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGVzIElEcyBvZiB3b3JrIGJyZWFrZG93biBlbGVtZW50cyBvZiB0aGUgdmlldyBvZiB0aGUgZ2l2ZW4gcHJvY2VzcwotCSAqIAotCSAqIEBwYXJhbSBmYWN0b3J5Ci0JICogICAgICAgICAgICBhZGFwdGVyIGZhY3Rvcnkgb2YgdGhlIGN1cnJlbnQgcHJvY2VzcyB2aWV3IChXQlMsIFRCUywgV1BCUywKLQkgKiAgICAgICAgICAgIENCUykKLQkgKiBAcGFyYW0gcHJvYwotCSAqICAgICAgICAgICAgbXVzdCBiZSByZWZyZXNoZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUlEcyhBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBQcm9jZXNzIHByb2MpIHsKLQkJaW50IGlkID0gMDsKLQkJT2JqZWN0IG9iajsKLQkJLy8gTWFwIGNoYW5nZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihmYWN0b3J5LCBwcm9jKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlvYmogPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBhZGFwdGVyID0gZmFjdG9yeS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJCWlmIChpdGVtUHJvdmlkZXIgIT0gbnVsbAotCQkJCQkJJiYgVG5nVXRpbC51bndyYXAob2JqKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCWl0ZW1Qcm92aWRlci5zZXRJZChpZCsrKTsKLQkJCQkJLy8gY2hhbmdlTWFwLnB1dChvYmosIGl0ZW1Qcm92aWRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gcmVmcmVzaCB0aGUgbGFiZWwKLQkJLy8KLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNoYW5nZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCS8vIGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJLy8gTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkvLyBJQ2hhbmdlTm90aWZpZXIgYWRhcHRlciA9IChJQ2hhbmdlTm90aWZpZXIpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCS8vIG9iaiA9IGVudHJ5LmdldEtleSgpOwotCQkvLyBhZGFwdGVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obmV3Ci0JCS8vIE5vdGlmaWNhdGlvbkltcGwoTm90aWZpY2F0aW9uLlNFVCwgb2JqLCBvYmopLCBvYmosIGZhbHNlLCB0cnVlKSk7Ci0JCS8vIH0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFZpZXdlcihBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBQcm9jZXNzIHByb2MpIHsKLQkJZmluYWwgVmlld2VyIHZpZXdlciA9IGdldFZpZXdlcihmYWN0b3J5LCBwcm9jKTsKLQkJaWYgKHZpZXdlciAhPSBudWxsICYmIHZpZXdlci5nZXRDb250cm9sKCkgIT0gbnVsbAotCQkJCSYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bkluVUlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCQkKLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSBlbGVtZW50IElEcyBpbiB0aG9zZSB2aWV3ZXJzIHRoYXQgcmVxdWlyZSB0aGlzLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoSURzSW5WaWV3ZXJzKGZpbmFsIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuSW5VSVRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KAotCQkJCQkJYWRhcHRlckZhY3RvcnkuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbGlzdGVuZXIgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSUNvbnRlbnRQcm92aWRlciAmJiBsaXN0ZW5lciBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgewkJCQkJCi0JCQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpIGxpc3RlbmVyKS5nZXRWaWV3ZXIoKTsKLQkJCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiB2aWV3ZXIuZ2V0Q29udHJvbCgpICE9IG51bGwKLQkJCQkJCQkJJiYgIXZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpCi0JCQkJCQkJCSYmIHZpZXdlci5nZXRJbnB1dCgpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgdmlld2VyLmdldElucHV0KCkpCi0JCQkJCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJCQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJCQkuYWRhcHQocHJvYywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCQlpZiAoaXRlbVByb3ZpZGVyLmlzUmVmcmVzaEFsbElEc1JlcXVpcmVkKCkpIHsKLQkJCQkJCQkJdXBkYXRlSURzKGFkYXB0ZXJGYWN0b3J5LCBwcm9jKTsKLQkJCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCQkJaXRlbVByb3ZpZGVyLnNldFJlZnJlc2hBbGxJRHNSZXF1aXJlZChmYWxzZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoQWxsVmlld2VycyhmaW5hbCBFeHBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bkluVUlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgKLQkJCQkJCWFkYXB0ZXJGYWN0b3J5LmdldENoYW5nZUxpc3RlbmVycygpKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGxpc3RlbmVyID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIElDb250ZW50UHJvdmlkZXIgJiYgbGlzdGVuZXIgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsJCQkJCQotCQkJCQkJVmlld2VyIHZpZXdlciA9ICgoSVZpZXdlclByb3ZpZGVyKSBsaXN0ZW5lcikuZ2V0Vmlld2VyKCk7Ci0JCQkJCQlpZiAodmlld2VyICE9IG51bGwgJiYgdmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsCi0JCQkJCQkJCSYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKQotCQkJCQkJCQkmJiB2aWV3ZXIuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgdGhlIGJyZWFrZG93biBlbGVtZW50IHdob3NlIHByZWRlY2Vzc29yIGxpc3QgdG8gYmUgY2hlY2tlZC4KLQkgKiBAcGFyYW0gcHJlZElkTGlzdAotCSAqICAgICAgICAgICAgYSBsaXN0IG9mIHByZWRlY2Vzc29yIElEcyAoSW50ZWdlcikgYXMgc2hvd24gaW4gdGhlIElEIGNvbHVtbgotCSAqICAgICAgICAgICAgb2YgdGhlIGVkaXRvcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICogQHBhcmFtIHByZWRlY2Vzc29ycwotCSAqICAgICAgICAgICAgb3V0cHV0LCB0aGUgcHJlZGVjZXNzb3IgbGlzdAotCSAqIEByZXR1cm4gbnVsbCBpZiBwcmVkTGlzdCBpcyB2YWxpZCwgYW4gZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1ByZWRlY2Vzc29yTGlzdChXb3JrQnJlYWtkb3duRWxlbWVudCBlLAotCQkJTGlzdCBwcmVkSWRMaXN0LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgT2JqZWN0IHByb2Nlc3MsCi0JCQlMaXN0IHByZWRlY2Vzc29ycykgewotCQkvLyBnZXQgQnJlYWtkb3duRWxlbWVudCBsaXN0IGZyb20gSUQgbGlzdAotCQkvLwotCQlMaXN0IGJlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBhbGxFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGFkYXB0ZXJGYWN0b3J5LAotCQkJCXByb2Nlc3MpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQob2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJSW50ZWdlciBpZCA9IG5ldyBJbnRlZ2VyKGl0ZW1Qcm92aWRlci5nZXRJZCgpKTsKLQkJCW9iaiA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0JCQlhbGxFbGVtZW50cy5hZGQob2JqKTsKLQkJCWlmIChwcmVkSWRMaXN0LmNvbnRhaW5zKGlkKSkgewotCQkJCWJlTGlzdC5hZGQob2JqKTsKLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIGZvciBjaXJjdWxhciBkZXBlbmRlbmN5Ci0JCS8vCi0JCWludCBzaXplID0gYmVMaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBiZUxpc3QuZ2V0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgb2JqOwotCQkJCWlmIChQcm9jZXNzVXRpbC5jaGVja0NpcmN1bGFyKGUsIHByZWQsIGFsbEVsZW1lbnRzKSkgewotCQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9icmVha2Rvd25fZWxlbWVudDsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAoVG5nVXRpbC5pc1N1YmVsZW1lbnRPZihwcmVkLCBlLCBhZGFwdGVyRmFjdG9yeSkpIHsKLQkJCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfc3ViX2VsZW1lbnQ7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKFRuZ1V0aWwuaXNTdXBlckVsZW1lbnRPZihwcmVkLCBlLCBhZGFwdGVyRmFjdG9yeSkpIHsKLQkJCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfUHJvY2Vzc1V0aWxfZXJyX2NoaWxkX2VsZW1lbnQ7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9Qcm9jZXNzVXRpbF9lcnJfd3JvbmdfZWxlbWVudDsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKHByZWRlY2Vzc29ycyAhPSBudWxsKQotCQkJcHJlZGVjZXNzb3JzLmFkZEFsbChiZUxpc3QpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgZm9yIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkgKiAKLQkgKiBAcGFyYW0gc3VjY2Vzc29yCi0JICogQHBhcmFtIHByZWRlY2Vzc29yCi0JICogQHBhcmFtIGxpc3QKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIGFsbCBicmVha2Rvd24gZWxlbWVudHMgaW4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUKLQkgKi8KLQkvLyBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tDaXJjdWxhcihXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjZXNzb3IsCi0JLy8gV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZGVjZXNzb3IsIExpc3QgbGlzdCkgewotCS8vIGlmKHN1Y2Nlc3NvciA9PSBwcmVkZWNlc3NvcikgewotCS8vIGlmKHByZWRlY2Vzc29yLmdldElzUmVwZWF0YWJsZSgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQkvLyByZXR1cm4gdHJ1ZTsKLQkvLyB9Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gcHJlZGVjZXNzb3IuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5pdGVyYXRvcigpOwotCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIFdvcmtPcmRlciBlbGVtZW50ID0gKFdvcmtPcmRlcikgaXRlci5uZXh0KCk7Ci0JLy8gV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IGVsZW1lbnQuZ2V0UHJlZCgpOwotCS8vIGlmKHByZWQgIT0gcHJlZGVjZXNzb3IgJiYgbGlzdC5jb250YWlucyhwcmVkKSkgewotCS8vIGlmKGNoZWNrQ2lyY3VsYXIoc3VjY2Vzc29yLCBwcmVkLCBsaXN0KSkgcmV0dXJuIHRydWU7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0NpcmN1bGFyKFdvcmtCcmVha2Rvd25FbGVtZW50IHN1Y2Nlc3NvciwKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWRlY2Vzc29yLCBMaXN0IGxpc3QpIHsKLQkJLy8gaWYoc3VjY2Vzc29yID09IHByZWRlY2Vzc29yKSB7Ci0JCS8vIGlmKHByZWRlY2Vzc29yLmdldElzUmVwZWF0YWJsZSgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCS8vIHJldHVybiBmYWxzZTsgLy8gaWYgb2sgcmV0dXJuIGZhbHNlIG1lYW5zIGFsbG93ZWQuCi0JCS8vIH0KLQkJLy8gcmV0dXJuIHRydWU7Ci0JCS8vIH0KLQkJLy8gTGlzdCBwcmVkZWNlc3NvcnNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBnZXRBbGxQcmVkZWNlc3Nvckxpc3QocHJlZGVjZXNzb3IsIGxpc3QsIHByZWRlY2Vzc29yc0xpc3QpOwotCQkvLyBpZighcHJlZGVjZXNzb3JzTGlzdC5pc0VtcHR5KCkpewotCQkvLyBmb3IoSXRlcmF0b3IgaXRvciA9IHByZWRlY2Vzc29yc0xpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KXsKLQkJLy8gT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkvLyBpZihzdWNjZXNzb3IgPT0gb2JqKXsKLQkJLy8gaWYoKChXb3JrQnJlYWtkb3duRWxlbWVudClvYmopLmdldElzUmVwZWF0YWJsZSgpLmJvb2xlYW5WYWx1ZSgpKQotCQkvLyB7Ci0JCS8vIHJldHVybiBmYWxzZTsKLQkJLy8gfQotCQkvLyByZXR1cm4gdHJ1ZTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRBbGxQcmVkZWNlc3Nvckxpc3QoV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZGVjZXNzb3IsCi0JCQlMaXN0IGxpc3QsIExpc3QgcHJlZExpc3QpIHsKLQkJaWYgKCFwcmVkTGlzdC5jb250YWlucyhwcmVkZWNlc3NvcikpCi0JCQlwcmVkTGlzdC5hZGQocHJlZGVjZXNzb3IpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcmVkZWNlc3Nvci5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJV29ya09yZGVyIGVsZW1lbnQgPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQKLQkJCQkJLmdldFByZWQoKTsKLQkJCWlmIChwcmVkICE9IHByZWRlY2Vzc29yICYmIGxpc3QuY29udGFpbnMocHJlZCkpIHsKLQkJCQlpZiAoIXByZWRMaXN0LmNvbnRhaW5zKHByZWQpKSB7Ci0JCQkJCXByZWRMaXN0LmFkZChwcmVkKTsKLQkJCQkJZ2V0QWxsUHJlZGVjZXNzb3JMaXN0KHByZWQsIGxpc3QsIHByZWRMaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgdGhlIGJyZWFrZG93biBlbGVtZW50IHdob3NlIHByZWRlY2Vzc29yIGxpc3QgdG8gYmUgY2hlY2tlZC4KLQkgKiBAcGFyYW0gcHJlZExpc3QKLQkgKiAgICAgICAgICAgIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcHJlZGVjZXNzb3IgSURzCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHRvcEFjdAotCSAqIEBwYXJhbSBwcmVkZWNlc3NvcnMKLQkgKiAgICAgICAgICAgIG91dHB1dCwgdGhlIHByZWRlY2Vzc29yIGxpc3QKLQkgKiBAcGFyYW0gYWxsRWxlbWVudHMKLQkgKiAgICAgICAgICAgIG91dHB1dCwgdGhlIHdob2xlIGJyZWFrZG93biBlbGVtZW50IGxpc3QgaXMgY29waWVkIGludG8gdGhpcwotCSAqICAgICAgICAgICAgbGlzdC4KLQkgKiBAcmV0dXJuIG51bGwgaWYgcHJlZExpc3QgaXMgdmFsaWQuIFRoZSBwcmVkZWNlc3NvciBsaXN0IGlzIHNhdmVkIGluCi0JICogICAgICAgICBwcmVkZWNlc3NvcnMgYW5kIHRoZSB3aG9sZSBicmVha2Rvd24gZWxlbWVudCBsaXN0IGlzIHNhdmVkIGluCi0JICogICAgICAgICBhbGxFbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1ByZWRlY2Vzc29yTGlzdChXb3JrQnJlYWtkb3duRWxlbWVudCBlLAotCQkJU3RyaW5nIHByZWRMaXN0LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgT2JqZWN0IHRvcEFjdCwKLQkJCUxpc3QgcHJlZGVjZXNzb3JzKSB7Ci0JCUxpc3QgaWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKFN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHByZWRMaXN0LCAiLCIpOyB0b2tlbnMuaGFzTW9yZVRva2VucygpOykgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCkudHJpbSgpOwotCQkJSW50ZWdlciBpZDsKLQkJCXRyeSB7Ci0JCQkJaWQgPSBuZXcgSW50ZWdlcih0b2tlbik7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKLQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZFByZWRlY2Vzc29yRXJyb3JfbXNnOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZExpc3QuYWRkKGlkKTsKLQkJfQotCi0JCXJldHVybiBjaGVja1ByZWRlY2Vzc29yTGlzdChlLCBpZExpc3QsIGFkYXB0ZXJGYWN0b3J5LCB0b3BBY3QsCi0JCQkJcHJlZGVjZXNzb3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBvYmplY3QncyBtZXRob2QgcGFja2FnZSBhbmQgcGx1Z2luIHRvIHRoZSBkZWZhdWx0Ci0JICogY29uZmlndXJhdGlvbiBvZiB0aGUgZ2l2ZW4gcHJvY2VzcyBpZiB0aGV5IGFyZSBub3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiB5ZXQuCi0JICogCi0JICogQHBhcmFtIHByb2MKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIGFkZGVkT2JqZWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKFByb2Nlc3MgcHJvYywgRU9iamVjdCBlLAotCQkJU2V0IGFkZGVkT2JqZWN0cykgewotCQkvLyBhZGQgdGhlIGVsZW1lbnQncyBtZXRob2QgcGFja2FnZSB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0JCS8vCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gcHJvYy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlpZiAoZSBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCWFkZFRhc2tUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIChUYXNrKSBlLCBhZGRlZE9iamVjdHMsIHRydWUpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIGU7Ci0JCQlhZGRXUFRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvYywgd3AsIGFkZGVkT2JqZWN0cyk7Ci0JCQlMaXN0IHRhc2tzID0gZ2V0VGFza3NGb3JXb3JrUHJvZHVjdCh3cCwgY29uZmlnKTsKLQkJCWlmICh0YXNrcyAhPSBudWxsKQotCQkJewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhc2tzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlhZGRUYXNrVG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jLCAoVGFzaykgaXRlci5uZXh0KCksCi0JCQkJCQkJYWRkZWRPYmplY3RzLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQlSb2xlIHJvbGUgPSAoUm9sZSkgZTsKLQkJCWFkZFJvbGVUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIHJvbGUsIGFkZGVkT2JqZWN0cyk7Ci0KLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCWFkZEFjdGl2aXR5VG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jLCAoQWN0aXZpdHkpIGUsIGFkZGVkT2JqZWN0cyk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQlUbmdVdGlsLmFkZFRvQ29uZmlndXJhdGlvbihjb25maWcsIChHdWlkYW5jZSkgZSwgYWRkZWRPYmplY3RzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEFjdGl2aXR5VG9EZWZhdWx0Q29uZmlndXJhdGlvbihQcm9jZXNzIHByb2MsIEFjdGl2aXR5IGFjdGl2aXR5LCBTZXQgYWRkZWRPYmplY3RzKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gcHJvYy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlUbmdVdGlsLmFkZFRvKGNvbmZpZywgVW1hVXRpbC5nZXRQcm9jZXNzQ29tcG9uZW50KGFjdGl2aXR5KSwgYWRkZWRPYmplY3RzKTsKLQkJLy8gYWRkIGxpbmtlZCBlbGVtZW50IG9mIGRlc2NyaXB0b3JzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYoZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQlNZXRob2RFbGVtZW50IG8gPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcikgZSk7Ci0JCQkJaWYobyAhPSBudWxsKSB7Ci0JCQkJCWFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvYywgbywgYWRkZWRPYmplY3RzKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCS8vIHRoaXMgaXMgbmVlZGVkIGZvciBhZGRpbmcgc3ViLWFjdGl2aXRpZXMgZGVzY3JpcHRvcnMgCi0JCQkJYWRkQWN0aXZpdHlUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIChBY3Rpdml0eSkgZSwgYWRkZWRPYmplY3RzKTsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCBhbGwgdGhlIGJhc2UgZWxlbWVudHMgaWYgdGhlcmUgaXMgYW55Ci0JCWZvciAoQWN0aXZpdHkgYmFzZSA9IChBY3Rpdml0eSkgYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOyBiYXNlICE9IG51bGw7IGJhc2UgPSAoQWN0aXZpdHkpIGJhc2UKLQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJYWRkQWN0aXZpdHlUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIGJhc2UsIGFkZGVkT2JqZWN0cyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFRhc2tUb0RlZmF1bHRDb25maWd1cmF0aW9uKFByb2Nlc3MgcHJvYywgVGFzayB0YXNrLAotCQkJU2V0IGFkZGVkT2JqZWN0cywgYm9vbGVhbiBpbmNsdWRlV29ya1Byb2R1Y3RzKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gcHJvYy5nZXREZWZhdWx0Q29udGV4dCgpOwotCi0JCVRuZ1V0aWwuYWRkVG9Db25maWd1cmF0aW9uKGNvbmZpZywgdGFzaywgYWRkZWRPYmplY3RzKTsKLQotCQkvLyBhZGQgYWxsIG90aGVyIGRlcGVuZGVuY2llcwotCQkvLwotCi0JCS8vIGFkZCByb2xlcwotCQlBcnJheUxpc3QgZGVwZW5kZW5jaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlkZXBlbmRlbmNpZXMuYWRkQWxsKHRhc2suZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCWRlcGVuZGVuY2llcy5hZGQodGFzay5nZXRQZXJmb3JtZWRCeSgpKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVwZW5kZW5jaWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVG5nVXRpbC5hZGRUb0NvbmZpZ3VyYXRpb24oY29uZmlnLCAoRU9iamVjdCkgaXRlci5uZXh0KCksCi0JCQkJCWFkZGVkT2JqZWN0cyk7Ci0JCX0KLQotCQkvLyBhZGQgd29yayBwcm9kdWN0cwotCQlpZiAoaW5jbHVkZVdvcmtQcm9kdWN0cykgewotCQkJZGVwZW5kZW5jaWVzLmNsZWFyKCk7Ci0JCQlkZXBlbmRlbmNpZXMuYWRkQWxsKHRhc2suZ2V0T3B0aW9uYWxJbnB1dCgpKTsKLQkJCWRlcGVuZGVuY2llcy5hZGRBbGwodGFzay5nZXRPdXRwdXQoKSk7Ci0JCQlkZXBlbmRlbmNpZXMuYWRkQWxsKHRhc2suZ2V0TWFuZGF0b3J5SW5wdXQoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZXBlbmRlbmNpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJYWRkV1BUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIChXb3JrUHJvZHVjdCkgaXRlci5uZXh0KCksCi0JCQkJCQlhZGRlZE9iamVjdHMpOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFzay5nZXRTdGVwcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHN0ZXAgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCUVPYmplY3QgYmFzZSA9IHN0ZXAuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCVRuZ1V0aWwuYWRkVG9Db25maWd1cmF0aW9uKGNvbmZpZywgYmFzZSwgYWRkZWRPYmplY3RzKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRSb2xlVG9EZWZhdWx0Q29uZmlndXJhdGlvbihQcm9jZXNzIHByb2MsCi0JCQlSb2xlIHJvbGUsIFNldCBhZGRlZE9iamVjdHMpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBwcm9jLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCVRuZ1V0aWwuYWRkVG9Db25maWd1cmF0aW9uKGNvbmZpZywgcm9sZSwgYWRkZWRPYmplY3RzKTsKLQkJCi0JCS8vIGFkZCB3b3JrIHByb2R1Y3RzCi0JCUFycmF5TGlzdCBkZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCWRlcGVuZGVuY2llcy5hZGRBbGwocm9sZS5nZXRNb2RpZmllcygpKTsKLQkJZGVwZW5kZW5jaWVzLmFkZEFsbChyb2xlLmdldFJlc3BvbnNpYmxlRm9yKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZXBlbmRlbmNpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlhZGRXUFRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvYywgKFdvcmtQcm9kdWN0KSBpdGVyLm5leHQoKSwKLQkJCQkJYWRkZWRPYmplY3RzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFdQVG9EZWZhdWx0Q29uZmlndXJhdGlvbihQcm9jZXNzIHByb2MsCi0JCQlXb3JrUHJvZHVjdCB3cCwgU2V0IGFkZGVkT2JqZWN0cykgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHByb2MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJVG5nVXRpbC5hZGRUb0NvbmZpZ3VyYXRpb24oY29uZmlnLCB3cCwgYWRkZWRPYmplY3RzKTsKLQkJaWYgKHdwIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoRGVsaXZlcmFibGUpIHdwKS5nZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJVG5nVXRpbC5hZGRUb0NvbmZpZ3VyYXRpb24oY29uZmlnLCAoRU9iamVjdCkgaXRlci5uZXh0KCksCi0JCQkJCQlhZGRlZE9iamVjdHMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZVRhc2tEZXNjcmlwdG9yU3RlcHMoQWN0aXZpdHkgYWN0aXZpdHksCi0JCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYykgewotCQlpZiAodGFza0Rlc2MgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJVGFzayB0YXNrID0gdGFza0Rlc2MuZ2V0VGFzaygpOwotCi0JCUlDb25maWd1cmF0aW9uQXBwbGljYXRvciBjb25maWdBcHBsaWNhdG9yID0gUHJvdmlkZXJzCi0JCQkJLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCk7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdGl2aXR5KQotCQkJCS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlMaXN0IHN0ZXBzID0gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKHRhc2ssCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19TdGVwcygpLCBjb25maWcpOwotCi0JCS8vIGFkZCB0aG9zZSBzdGVwcyB0byBUYXNrRGVzY3JpcHRvciBpZiB0aGV5IGFyZSBub3QgdGhlcmUgeWV0LgotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdGVwcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBzdGVwID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIXRhc2tEZXNjLmdldFNlbGVjdGVkU3RlcHMoKS5jb250YWlucyhzdGVwKSkgewotCQkJCXRhc2tEZXNjLmdldFNlbGVjdGVkU3RlcHMoKS5hZGQoc3RlcCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBNZXRob2RFbGVtZW50IHRoYXQgdGhlIGdpdmVuIGRlc2NyaXB0b3IgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRBc3NvY2lhdGVkRWxlbWVudChEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJcmV0dXJuICgoUm9sZURlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFJvbGUoKTsKLQkJfSBlbHNlIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRUYXNrKCk7Ci0JCX0gZWxzZSBpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJcmV0dXJuICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRXb3JrUHJvZHVjdCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkaXNwb3NlV3JhcHBlcnMoQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCSgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBhbGwgdGFza3MgdGhhdCBoYXZlIHRoZSBnaXZlbiB3b3JrcHJvZHVjdCBpbiB0aGVpciBvdXRwdXQKLQkgKiBpbiB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFRhc2tzRm9yV29ya1Byb2R1Y3QoV29ya1Byb2R1Y3Qgd3AsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlnQXBwbGljYXRvciA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpOwotCi0JCUxpc3QgdGFza3MgPSAoTGlzdCkgY29uZmlnQXBwbGljYXRvci5nZXRSZWZlcmVuY2Uod3AsIEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X091dHB1dEZyb21fVGFza3MsIGNvbmZpZyk7Ci0KLQkJcmV0dXJuIHRhc2tzOwotCX0KLQotCS8qKgotCSAqIEdldCBhbGwgd29ya3Byb2R1Y3RzIHRoYXQgaGF2ZSB0aGUgcm9sZSBhcyByZXNwb25zaWJsZSByb2xlIGluIHRoZQotCSAqIGdpdmVuIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRXb3JrUHJvZHVjdHNGb3JSb2xlKFJvbGUgcm9sZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUlDb25maWd1cmF0aW9uQXBwbGljYXRvciBjb25maWdBcHBsaWNhdG9yID0gUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCk7Ci0JCUxpc3Qgd3BzID0gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKHJvbGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwgY29uZmlnKTsKLQkJcmV0dXJuIHdwczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB3b3JrcHJvZHVjdHMgd2hpY2ggYXJlLCBleGNlcHQgdGhlIGNvbnRyaWJ1dG9yLCBpbiB0aGUgZ2l2ZW4KLQkgKiBwbHVnaW4uCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsV29ya1Byb2R1Y3RzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQotCQlDb250ZW50UGFja2FnZSBjb3JlQ29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoY29yZUNvbnRlbnRQa2csIGZhbHNlKSB7Ci0KLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzgzMzc1MjA2NjMyNDgzNzkzN0w7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKQotCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCUNvbnRlbnRQYWNrYWdlIHBrZyA9IChDb250ZW50UGFja2FnZSkgb2JqZWN0OwotCQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpCi0JCQkJCQkJJiYgIVRuZ1V0aWwKLQkJCQkJCQkJCS5pc0NvbnRyaWJ1dG9yKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQpKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJTGlzdCBtZXRob2RFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCW1ldGhvZEVsZW1lbnRzLmFkZChlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWV0aG9kRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGFzaywgZXhjZXB0IHRoZSBjb250cmlidXRvciwgaW4gdGhlIGdpdmVuIHBsdWdpbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxUYXNrcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUNvbnRlbnRQYWNrYWdlIGNvcmVDb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihjb3JlQ29udGVudFBrZywgZmFsc2UpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzODMzNzUyMDY2MzI0ODM3OTM3TDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkpCi0JCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJQ29udGVudFBhY2thZ2UgcGtnID0gKENvbnRlbnRQYWNrYWdlKSBvYmplY3Q7Ci0JCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGtnLmdldENvbnRlbnRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrCi0JCQkJCQkJJiYgIVRuZ1V0aWwKLQkJCQkJCQkJCS5pc0NvbnRyaWJ1dG9yKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQpKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJTGlzdCB0YXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQkJdGFza3MuYWRkKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0YXNrczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCXJldHVybiBUbmdVdGlsLmlzR2VuZXJhbGl6ZXIoZSwKLQkJCQlnZXRFeHRlbmRBbmRMb2NhbENvbnRyaWJ1dGlvblZhcmlhYmlsaXR5VHlwZXMoKSk7Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlc2VudGF0aW9uTmFtZShCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJaWYgKGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpID09IG51bGwKLQkJCQl8fCBlLmdldFByZXNlbnRhdGlvbk5hbWUoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpZiAoaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoZSkpIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGJhc2UgPSAoQnJlYWtkb3duRWxlbWVudCkgKChWYXJpYWJpbGl0eUVsZW1lbnQpIGUpCi0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCXJldHVybiBnZXRQcmVzZW50YXRpb25OYW1lKGJhc2UpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExhYmVsV2l0aFBhdGgoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCVN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcihlLmdldE5hbWUoKSk7Ci0JCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlKTsKLQkJaWYgKHByb2MgIT0gbnVsbCkgewotCQkJcGF0aC5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwcm9jKTsKLQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCXBhdGguYXBwZW5kKHBsdWdpbi5nZXROYW1lKCkpOwotCQkJfQotCQkJaWYgKGUgIT0gcHJvYykgewotCQkJCXBhdGguYXBwZW5kKCcvJykuYXBwZW5kKHByb2MuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGF0aC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1vZGVsIGluZm8gb2YgdGhlIGdpdmVuIEJyZWFrZG93bkVsZW1lbnQgaW4gdGhlIGdpdmVuCi0JICogU3RyaW5nQnVmZmVyCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIEBwYXJhbSBtb2RlbEluZm8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0TW9kZWxJbmZvKEJyZWFrZG93bkVsZW1lbnQgZSwgT2JqZWN0IGFkYXB0ZXIsCi0JCQlTdHJpbmdCdWZmZXIgbW9kZWxJbmZvKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlOwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQlpZiAobW9kZWxJbmZvLmxlbmd0aCgpID4gMCkgewotCQkJCQltb2RlbEluZm8uYXBwZW5kKCI7ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCVN0cmluZyBwYXR0ZXJuID0gbnVsbDsKLQkJCQlpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCkgewotCQkJCQlwYXR0ZXJuID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9Qcm9jZXNzVXRpbF9jb250cmlidXRlc3RvOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT05fTElURVJBTCkgewotCQkJCQlwYXR0ZXJuID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9Qcm9jZXNzVXRpbF9sb2NhbENvbnRyaWJ1dGVzdG87IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCkgewotCQkJCQlwYXR0ZXJuID0gTGlicmFyeUVkaXRSZXNvdXJjZXMucHJvY2Vzc19leHRlbmRzOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFU19MSVRFUkFMKSB7Ci0JCQkJCXBhdHRlcm4gPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5wcm9jZXNzX3JlcGxhY2VzOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVF9MSVRFUkFMKSB7Ci0JCQkJCXBhdHRlcm4gPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5wcm9jZXNzX2xvY2FsUmVwbGFjZXM7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCQkvLyBpZihhZGFwdGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCS8vIEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPQotCQkJCS8vICgoSXRlbVByb3ZpZGVyQWRhcHRlcilhZGFwdGVyKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCS8vIE9iamVjdCBpdGVtUHJvdmlkZXIgPSBmYWN0b3J5LmFkYXB0KGJhc2UsCi0JCQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkvLyBpZihpdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkvLyBJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKQotCQkJCS8vIGl0ZW1Qcm92aWRlcjsKLQkJCQkvLyBQcm9jZXNzIHByb2MgPSAoUHJvY2VzcykgYnNJdGVtUHJvdmlkZXIuZ2V0VG9wSXRlbSgpOwotCQkJCS8vIGlmKHByb2MgIT0gbnVsbCkgewotCQkJCS8vIHN0cmJ1Zi5hcHBlbmQoVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ocHJvYykuZ2V0TmFtZSgpKS5hcHBlbmQoJzonKQotCQkJCS8vIC5hcHBlbmQocHJvYy5nZXROYW1lKCkpLmFwcGVuZCgnOicpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gfQotCi0JCQkJLy8gUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KQotCQkJCS8vIGJhc2UpOwotCQkJCS8vIGlmKHByb2MgIT0gbnVsbCkgewotCQkJCS8vIE1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwcm9jKTsKLQkJCQkvLyBpZihwbHVnaW4gIT0gbnVsbCkgewotCQkJCS8vIG1vZGVsSW5mby5hcHBlbmQoVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ocHJvYykuZ2V0TmFtZSgpKS5hcHBlbmQoJzonKTsKLQkJCQkvLyB9Ci0JCQkJLy8gbW9kZWxJbmZvLmFwcGVuZChwcm9jLmdldE5hbWUoKSk7Ci0JCQkJLy8gfQotCQkJCS8vCQkJCQotCQkJCS8vIGlmKGJhc2UgIT0gcHJvYykgewotCQkJCS8vIG1vZGVsSW5mby5hcHBlbmQoJzonKS5hcHBlbmQoYmFzZS5nZXROYW1lKCkpOwotCQkJCS8vIH0KLQkJCQkvLyBtb2RlbEluZm8uYXBwZW5kKCInIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGF0dGVybiAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gZ2V0TGFiZWxXaXRoUGF0aCgoQnJlYWtkb3duRWxlbWVudCkgYmFzZSk7Ci0JCQkJCW1vZGVsSW5mby5hcHBlbmQoTWVzc2FnZUZvcm1hdC5mb3JtYXQocGF0dGVybiwKLQkJCQkJCQluZXcgT2JqZWN0W10geyBwYXRoIH0pKTsKLQotCQkJCQlnZXRNb2RlbEluZm8oKEJyZWFrZG93bkVsZW1lbnQpIGJhc2UsIGFkYXB0ZXIsIG1vZGVsSW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJCXdyYXBwZXIuZ2V0T3duZXIoKTsKLQkJCWlmICh3cmFwcGVyLmdldEZlYXR1cmUoKSAhPSBudWxsKSB7Ci0JCQkJbW9kZWxJbmZvLmFwcGVuZChUbmdVdGlsLmdldEZlYXR1cmVUZXh0KHdyYXBwZXIuZ2V0RmVhdHVyZSgpKSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh3cmFwcGVyIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcikgewotLy8JCQkJCWdldE1vZGVsSW5mb0ZvcldvcmtQcm9kdWN0RGVzY3JpcHRvcihtb2RlbEluZm8sCi0vLwkJCQkJCQkoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKSk7Ci0JCQkJCWdldFdQRE1vZGVsSW5mbyhtb2RlbEluZm8sIHdyYXBwZXIsIHdyYXBwZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKFN0cmluZyBwcm9wZXJ0eSkgewotCQlpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9JRC5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRDsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRTsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUzsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTi5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU47Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkc7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEU7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVguZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTy5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfVFlQRS5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVM7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURS5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURTsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX0VYSVRfU1RBVEUuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfRVhJVF9TVEFURTsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUwuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUw7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19QTEFOTkVELmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQ7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHksCi0JCQlPYmplY3QgYWRhcHRlcikgewotCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSUQpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQKLQkJCQkJJiYgYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZigoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcikuZ2V0SWQoKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FKSB7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElJdGVtTGFiZWxQcm92aWRlcikgewotCQkJCXJldHVybiAoKElJdGVtTGFiZWxQcm92aWRlcikgYWRhcHRlcikuZ2V0VGV4dChlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FKSB7Ci0JCQlyZXR1cm4gZ2V0UHJlc2VudGF0aW9uTmFtZShlKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUykgewotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gKChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLmdldFByZWRlY2Vzc29ycygpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4pIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoKChXb3JrQnJlYWtkb3duRWxlbWVudCkgZSkKLQkJCQkJCS5nZXRJc0V2ZW50RHJpdmVuKCkpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORykgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXJldHVybiBTdHJpbmcKLQkJCQkJCS52YWx1ZU9mKCgoV29ya0JyZWFrZG93bkVsZW1lbnQpIGUpLmdldElzT25nb2luZygpKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoKChXb3JrQnJlYWtkb3duRWxlbWVudCkgZSkKLQkJCQkJCS5nZXRJc1JlcGVhdGFibGUoKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVgpIHsKLQkJCXJldHVybiBlLmdldFByZWZpeCgpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTykgewotCQkJU3RyaW5nQnVmZmVyIG1vZGVsSW5mbyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWdldE1vZGVsSW5mbyhlLCBhZGFwdGVyLCBtb2RlbEluZm8pOwotCQkJcmV0dXJuIG1vZGVsSW5mby50b1N0cmluZygpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfVFlQRSkgewotCQkJU3RyaW5nIHR5cGVOYW1lID0gbnVsbDsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZSkKLQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCWlmICh3cCAhPSBudWxsKSB7Ci0JCQkJCXR5cGVOYW1lID0gd3AuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIkRlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkICAKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodHlwZU5hbWUgPT0gbnVsbCAmJiBlIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCXR5cGVOYW1lID0gKChFT2JqZWN0KSBlKS5lQ2xhc3MoKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlpZiAodHlwZU5hbWUgIT0gbnVsbCkgewotCQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfIiArIHR5cGVOYW1lICsgIl90eXBlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKCgoVGVhbVByb2ZpbGUpIGUpCi0JCQkJCQkuZ2V0U3VwZXJUZWFtKCkpOwotCQkJfQotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yICYmIGFkYXB0ZXIgaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWFkYXB0ZXJGYWN0b3J5ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilhZGFwdGVyKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCX0KLQkJCQllbHNlIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJCWFkYXB0ZXJGYWN0b3J5ID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKWFkYXB0ZXIpLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJfQotCQkJCXJldHVybiBnZXRUZWFtTGlzdFN0cmluZyhnZXRUZWFtUHJvZmlsZXMob2JqZWN0LCAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKWFkYXB0ZXIsIGFkYXB0ZXJGYWN0b3J5KSk7Ci0gCQkJfQotCQl9Ci0JCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0VOVFJZX1NUQVRFKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlOwotCQkJCXJldHVybiBUbmdVdGlsLmNoZWNrTnVsbCh3cGQuZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfRVhJVF9TVEFURSkgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZTsKLQkJCQlyZXR1cm4gVG5nVXRpbC5jaGVja051bGwod3BkLmdldEFjdGl2aXR5RXhpdFN0YXRlKCkpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfREVMSVZFUkFCTEUpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJTGlzdCBkZWxpdmVyYWJsZXMgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRvcnMoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZSk7Ci0JCQkJaWYgKGRlbGl2ZXJhYmxlcy5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJaW50IG1heCA9IGRlbGl2ZXJhYmxlcy5zaXplKCkgLSAxOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCQkJc3RyQnVmLmFwcGVuZCgKLQkJCQkJCQlUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZGVsaXZlcmFibGVzLmdldChpKSkpCi0JCQkJCQkJLmFwcGVuZCgnLCcpOwotCQkJCX0KLQkJCQlzdHJCdWYuYXBwZW5kKFRuZ1V0aWwKLQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKGRlbGl2ZXJhYmxlcy5nZXQobWF4KSkpOwotCQkJCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMKSB7Ci0JCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZS5nZXRJc09wdGlvbmFsKCkpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUExBTk5FRCkgewotCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGUuZ2V0SXNQbGFubmVkKCkpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTKSB7Ci0JCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZS5nZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQgYWN0aXZpdHkgZm9yIHRlYW0gcHJvZmlsZSBicmVha2Rvd24gZWxlbWVudAotCSAqIFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkgZG9lc24ndCB3b3JrIGNvcnJlY3RseSBmb3Igc3ViLXRlYW1zCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgYnJlYWtkb3duIGVsZW1lbnRzIHVuZGVyIHRlYW1hbGxvY2F0aW9uCi0JICogQHBhcmFtIHRlYW0KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0UGFyZW50QWN0aXZpdHlPZlRlYW0oQnJlYWtkb3duRWxlbWVudCBickVsZW1lbnQpCi0JewotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChickVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCWJyRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQ7Ci0JCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGJyRWxlbWVudCwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gcGFyZW50OwkKLQl9Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHJvbGVkZXNjcmlwdG9ycyB1bmRlciBhY3Rpdml0eSB3aGljaCBjb3VsZCBwb3NzaWJsZSBtYXRjaCBmb3IKLQkgKiByb2xlcyB1bmRlciB0aGUgdGVhbXMuIEl0IHdpbGwgcmVjdXJzZSB0aHJ1IGFsbCBjaGlsZCBhY3Rpdml0aWVzIHRvIGZpbmQgCi0JICogcm9sZSBkZXNjcmlwdG9ycwotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gcm9sZURlc2NMaXN0Ci0JICogQHBhcmFtIHJvbGVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFJvbGVEZXNjcmlwdG9yKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQWN0aXZpdHkgcGFyZW50LCAgTGlzdCByb2xlRGVzY0xpc3QsIExpc3Qgcm9sZXMpIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQotCQlPYmplY3QgbyA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJaWYgKG8gaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIG87Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWdldFJvbGVEZXNjcmlwdG9yKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIG9iaiwKLQkJCQkJCQlyb2xlRGVzY0xpc3QsIHJvbGVzKTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKQotCQkJCXsKLQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIG9iajsKLQkJCQkJaWYgKChyb2xlRGVzYy5nZXRSb2xlKCkhPSBudWxsKSAmJiAKLQkJCQkJCQkocm9sZXMuY29udGFpbnMocm9sZURlc2MuZ2V0Um9sZSgpKSkpCi0JCQkJCQlyb2xlRGVzY0xpc3QuYWRkKG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUZWFtTGlzdFN0cmluZyhMaXN0IHRlYW1Qcm9maWxlcykgewotCQlpZiAodGVhbVByb2ZpbGVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbWF4ID0gdGVhbVByb2ZpbGVzLnNpemUoKSAtIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCXN0ckJ1Zi5hcHBlbmQoVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKHRlYW1Qcm9maWxlcy5nZXQoaSkpKQotCQkJCQkuYXBwZW5kKCcsJyk7Ci0JCX0KLQkJc3RyQnVmLmFwcGVuZChUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUodGVhbVByb2ZpbGVzLmdldChtYXgpKSk7Ci0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QXR0cmlidXRlKFdvcmtCcmVha2Rvd25FbGVtZW50IGUsIFN0cmluZyBwcm9wLAotCQkJU3RyaW5nIHR4dCkgewotCQlpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUpIHsKLQkJCWUuc2V0TmFtZSh0eHQpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVgpIHsKLQkJCWUuc2V0UHJlZml4KHR4dCk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTikgewotCQkJZS5zZXRJc0V2ZW50RHJpdmVuKEJvb2xlYW4udmFsdWVPZih0eHQpKTsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORykgewotCQkJZS5zZXRJc09uZ29pbmcoQm9vbGVhbi52YWx1ZU9mKHR4dCkpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFKSB7Ci0JCQllLnNldElzUmVwZWF0YWJsZShCb29sZWFuLnZhbHVlT2YodHh0KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QXR0cmlidXRlKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSwgU3RyaW5nIHByb3AsIFN0cmluZyB0eHQpIHsKLQkJaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgdHh0LCAtMSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlZml4KCksIHR4dCwgLTEpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4pIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCksIEJvb2xlYW4KLQkJCQkJLnZhbHVlT2YodHh0KSwgLTEpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCksIEJvb2xlYW4udmFsdWVPZih0eHQpLAotCQkJCQktMSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKSwgQm9vbGVhbgotCQkJCQkudmFsdWVPZih0eHQpLCAtMSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwgdHh0LCAtMSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMKSB7Ci0JCQlhY3Rpb25NZ3IKLQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCksIEJvb2xlYW4KLQkJCQkJCQkudmFsdWVPZih0eHQpLCAtMSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpLCBCb29sZWFuLnZhbHVlT2YodHh0KSwgLTEpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSwgQm9vbGVhbgotCQkJCQkudmFsdWVPZih0eHQpLCAtMSk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURSkgewotCQkJCWFjdGlvbk1ncgotCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKSwKLQkJCQkJCQkJdHh0LCAtMSk7Ci0JCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKSwgdHh0LCAtMSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHkgZ2VuZXJhbGl6ZShBY3Rpdml0eSBiYXNlLCBWYXJpYWJpbGl0eVR5cGUgdHlwZSkgewotCQlBY3Rpdml0eSBhY3QgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eSgpOwotCQlhY3Quc2V0TmFtZShiYXNlLmdldE5hbWUoKSk7Ci0JCWlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVF9MSVRFUkFMKSB7Ci0JCQlTdHJpbmcgcHJlc2VudGF0aW9uTmFtZSA9IGdldFByZXNlbnRhdGlvbk5hbWUoYmFzZSk7Ci0JCQlhY3Quc2V0UHJlc2VudGF0aW9uTmFtZShTdHJVdGlsLmlzQmxhbmsocHJlc2VudGF0aW9uTmFtZSkgPyBiYXNlCi0JCQkJCS5nZXROYW1lKCkgOiBwcmVzZW50YXRpb25OYW1lKTsKLQkJfQotCQlhY3Quc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChiYXNlKTsKLQkJYWN0LnNldFZhcmlhYmlsaXR5VHlwZSh0eXBlKTsKLQotCQlpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKSB7Ci0JCQkvLyBpbmhlcml0IGJvb2xlYW4gYXR0cmlidXRlcyBmcm9tIGJhc2UKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBiYXNlLmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUVBdHRyaWJ1dGUgYXR0cmlidXRlID0gKEVBdHRyaWJ1dGUpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChhdHRyaWJ1dGUuZ2V0RUF0dHJpYnV0ZVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkgPT0gQm9vbGVhbi5jbGFzcykgewotCQkJCQlhY3QuZVNldChhdHRyaWJ1dGUsIGJhc2UuZUdldChhdHRyaWJ1dGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBjb3B5IHByZWRlY2Vzc29ycyBsaXN0Ci0JCS8vIFRPRE86IG5lZWQgdG8gY2hlY2sgd2l0aCB2YXJpYWJpbGl0eSBydWxlcy4KLQkJLy8KLQkJQXJyYXlMaXN0IHdvcmtPcmRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3QoYmFzZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpKQotCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCXdvcmtPcmRlcnMuYWRkKFRuZ1V0aWwuY29weSgoV29ya09yZGVyKSBpdGVyLm5leHQoKSkpOwotCQl9Ci0KLQkJYWN0LmdldExpbmtUb1ByZWRlY2Vzc29yKCkuYWRkQWxsKHdvcmtPcmRlcnMpOwotCQlyZXR1cm4gYWN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgbGlzdCBvZiBlbGVtZW50cyBzcGVjaWZpZWQgaW4gY2xhc3MgInR5cGUiIGVnLihSb2xlRGVzY3JpcHRvciwKLQkgKiBXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHVudGlsIHRoZSByb290IGxldmVsLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gaXRlbXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEVsZW1lbnRzSW5TY29wZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCwgQ2xhc3MgdHlwZSwgTGlzdCBpdGVtcykgewotCQkvLyBnZXQgY2hpbGRyZW4gZm9yIGFjdGl2aXR5Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChlbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gKChBY3Rpdml0eSkgZWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQlpZiAodHlwZS5pc0luc3RhbmNlKG9iaikpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJPYmogLSIgKyBvYmopOwotCQkJCQlpZiAoIShpdGVtcy5jb250YWlucyhvYmopKSkgewotCQkJCQkJaXRlbXMuYWRkKG9iaik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBnZXQgcGFyZW50Ci0JCU9iamVjdCBjdXJyZW50UGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChlbGVtZW50KTsKLQkJaWYgKGN1cnJlbnRQYXJlbnQgIT0gbnVsbCkgewotCQkJLy8gZ28gdXAKLQkJCWdldEVsZW1lbnRzSW5TY29wZShhZGFwdGVyRmFjdG9yeSwKLQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIGN1cnJlbnRQYXJlbnQsIHR5cGUsIGl0ZW1zKTsKLQkJfQotCQlyZXR1cm4gaXRlbXM7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgcm9sZXMgZnJvbSByb2xlZGVzY3JpcHRvciBsaXN0Ci0JICogCi0JICogQHBhcmFtIHJvbGVEZXNjTGlzdAotCSAqIEByZXR1cm4KLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSb2xlcyhMaXN0IHJvbGVEZXNjTGlzdCkgewotCQlMaXN0IHJvbGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocm9sZURlc2NMaXN0ICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHJvbGVEZXNjTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCVJvbGUgcm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIG9iaikuZ2V0Um9sZSgpOwotCQkJCQlyb2xlTGlzdC5hZGQocm9sZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByb2xlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYXNzb2NpYXRlZCBtZXRob2QgZWxlbWVudCBsaXN0Ci0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0b3JMaXN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoTGlzdCBkZXNjcmlwdG9yTGlzdCkgewotCQlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGVzY3JpcHRvckxpc3QgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gZGVzY3JpcHRvckxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IGdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBvYmopOwotCQkJCQllbGVtZW50TGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50TGlzdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEJyZWFrZG93bkVsZW1lbnQgZ2V0VG9wQnJlYWtkb3duRWxlbWVudChQcm9jZXNzQ29tcG9uZW50IHBjKSB7Ci0JCUJyZWFrZG93bkVsZW1lbnQgYmUgPSBwYy5nZXRQcm9jZXNzKCk7Ci0JCWlmIChiZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU9iamVjdCBhZGFwdGVyID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChiZSwKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpKQotCQkJcmV0dXJuIGJlOwotCQlJQlNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJaWYgKGl0ZW1Qcm92aWRlci5nZXRUb3BJdGVtKCkgPT0gbnVsbCkgewotCQkJaXRlbVByb3ZpZGVyLnNldFRvcEl0ZW0oYmUpOwotCQkJaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoYmUsCi0JCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWl0ZW1Qcm92aWRlci5zZXRUb3BJdGVtKGJlKTsKLQkJCWl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGJlLAotCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpdGVtUHJvdmlkZXIuc2V0VG9wSXRlbShiZSk7Ci0JCQlpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChiZSwKLQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaXRlbVByb3ZpZGVyLnNldFRvcEl0ZW0oYmUpOwotCQl9Ci0JCVByb2Nlc3NVdGlsLnVwZGF0ZUlEcyhiZSwgYmUpOwotCQlyZXR1cm4gYmU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVJRHMoRU9iamVjdCB0b3BBY3QsIE9iamVjdCBuZXdPYmopIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQodG9wQWN0LAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXIKLQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCWJvb2xlYW4gdXBkYXRlV2hvbGVQcm9jZXNzID0gdG9wQWN0ID09IG5ld09iagotCQkJCSYmIHRvcEFjdCBpbnN0YW5jZW9mIFByb2Nlc3M7Ci0JCWlmICh1cGRhdGVXaG9sZVByb2Nlc3MpIHsKLQkJCVByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSB0b3BBY3Q7Ci0JCQl1cGRhdGVJRHMoZmFjdG9yeSwgcHJvYyk7Ci0JCQlyZWZyZXNoVmlld2VyKGZhY3RvcnksIHByb2MpOwotCQl9IGVsc2UgewotCQkJQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcigKLQkJCQkJZmFjdG9yeSwgdG9wQWN0KTsKLQkJCXVwZGF0ZUlEcyhmYWN0b3J5LCBpdGVyLCBuZXdPYmopOwotCQl9Ci0KLQkJLy8gTm8gbW9yZSBJRCBjb2x1bW4gaW4gVEJTIGFuZCBXUEJTCi0JCS8vCi0JCS8vIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikKLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdCh0b3BBY3QsCi0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCS8vIGZhY3RvcnkgPSBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkvLyBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGZhY3RvcnksIHRvcEFjdCk7Ci0JCS8vIFByb2Nlc3NVdGlsLnVwZGF0ZUlEcyhmYWN0b3J5LCBpdGVyLCBuZXdPYmopOwotCQkvLyBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpCi0JCS8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQodG9wQWN0LAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyBmYWN0b3J5ID0gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlci5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJLy8gaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihmYWN0b3J5LCB0b3BBY3QpOwotCQkvLyBQcm9jZXNzVXRpbC51cGRhdGVJRHMoZmFjdG9yeSwgaXRlciwgbmV3T2JqKTsKLQotCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQodG9wQWN0LAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJZmFjdG9yeSA9IFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXIuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCWlmICh1cGRhdGVXaG9sZVByb2Nlc3MpIHsKLQkJCVByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSB0b3BBY3Q7Ci0JCQl1cGRhdGVJRHMoZmFjdG9yeSwgcHJvYyk7Ci0JCQlyZWZyZXNoVmlld2VyKGZhY3RvcnksIHByb2MpOwotCQl9IGVsc2UgewotCQkJQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcigKLQkJCQkJZmFjdG9yeSwgdG9wQWN0KTsKLQkJCXVwZGF0ZUlEcyhmYWN0b3J5LCBpdGVyLCBuZXdPYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGl0ZXIKLQkgKiBAcGFyYW0gbmV3T2JqCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUlEcyhBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LAotCQkJQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IgaXRlciwgT2JqZWN0IG5ld09iaikgewotCQlpbnQgaWQgPSAwOwotCQlPYmplY3Qgb2JqOwotCQlNYXAgY2hhbmdlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlvYmogPSBpdGVyLm5leHQoKTsKLQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBmYWN0b3J5LmFkYXB0KG9iaiwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWl0ZW1Qcm92aWRlci5zZXRJZChpZCsrKTsKLQkJCWNoYW5nZU1hcC5wdXQob2JqLCBpdGVtUHJvdmlkZXIpOwotCQl9Ci0KLQkJLy8gcmVmcmVzaCB0aGUgbGFiZWwKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNoYW5nZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUlDaGFuZ2VOb3RpZmllciBhZGFwdGVyID0gKElDaGFuZ2VOb3RpZmllcikgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCW9iaiA9IGVudHJ5LmdldEtleSgpOwotCQkJYWRhcHRlci5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKAotCQkJCQluZXcgTm90aWZpY2F0aW9uSW1wbChOb3RpZmljYXRpb24uU0VULCBvYmosIG9iaiksIG9iaiwKLQkJCQkJZmFsc2UsIHRydWUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4KLQkgKiBAc2VlICNjaGVja0Rlc2NyaXB0b3JSZWZlcmVuY2VzKENvbGxlY3Rpb24sIERlc2NyaXB0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotCQkJRGVzY3JpcHRvciBvYmopIHsKLQkJQ29sbGVjdGlvbiBkZXNjcmlwdG9ycyA9IGRlc2NyaXB0b3IgIT0gbnVsbCA/IENvbGxlY3Rpb25zCi0JCQkJLnNpbmdsZXRvbihkZXNjcmlwdG9yKSA6IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJcmV0dXJuIGNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoZGVzY3JpcHRvcnMsIG9iaik7Ci0JfQotCi0JCi0JLyoqCi0JICogQ2hlY2sgd2hldGhlciB0aGVyZSBhcmUgYW55IHJlZmVyZW5jZXMgb2YgdGhlIG9iamVjdCAib2JqIi4gSWYgcmVmZXJlbmNlcwotCSAqIGV4aXN0IGluIGFueSBkZXNjcmlwdG9yIGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwgaWdub3JlIGl0LgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9ycwotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoQ29sbGVjdGlvbiBkZXNjcmlwdG9ycywKLQkJCURlc2NyaXB0b3Igb2JqKSB7Ci0JCWJvb2xlYW4gcmVmZXJlbmNlc0V4aXN0cyA9IGZhbHNlOwotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJUm9sZURlc2NyaXB0b3IgcmVmT2JqZWN0ID0gKFJvbGVEZXNjcmlwdG9yKSBvYmo7Ci0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlsaXN0LmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRBc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyhyZWZPYmplY3QpKTsKLQkJCWxpc3QuYWRkQWxsKHJlZk9iamVjdC5nZXRSZXNwb25zaWJsZUZvcigpKTsKLQkJCWxpc3QuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldEFkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMocmVmT2JqZWN0KSk7Ci0JCQlsaXN0LmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHJlZk9iamVjdCkpOwotCQkJbGlzdC5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIuZ2V0VGVhbVByb2ZpbGVzKHJlZk9iamVjdCkpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIHJlZkl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IHJlZkl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCByZWZJdG9yT2JqZWN0ID0gKE9iamVjdCkgcmVmSXRvci5uZXh0KCk7Ci0JCQkJaWYgKCgocmVmSXRvck9iamVjdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpICYmICFkZXNjcmlwdG9ycwotCQkJCQkJLmNvbnRhaW5zKHJlZkl0b3JPYmplY3QpKQotCQkJCQkJfHwgKHJlZkl0b3JPYmplY3QgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkpIHsKLQkJCQkJcmVmZXJlbmNlc0V4aXN0cyA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJfQotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewkJCi0JCQlyZXR1cm4gY2hlY2tXb3JrUHJvZHVjdERlc2NyaXB0b3JSZWZlcmVuY2VzKGRlc2NyaXB0b3JzLCAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmosIGZhbHNlLCAtMSk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCVRhc2tEZXNjcmlwdG9yIHJlZk9iamVjdCA9IChUYXNrRGVzY3JpcHRvcikgb2JqOwotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJbGlzdC5hZGRBbGwocmVmT2JqZWN0LmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpOwotCQkJbGlzdC5hZGRBbGwocmVmT2JqZWN0LmdldEFzc2lzdGVkQnkoKSk7Ci0JCQlsaXN0LmFkZEFsbChyZWZPYmplY3QuZ2V0RXh0ZXJuYWxJbnB1dCgpKTsKLQkJCWxpc3QuYWRkQWxsKHJlZk9iamVjdC5nZXRNYW5kYXRvcnlJbnB1dCgpKTsKLQkJCWxpc3QuYWRkQWxsKHJlZk9iamVjdC5nZXRPcHRpb25hbElucHV0KCkpOwotCQkJbGlzdC5hZGRBbGwocmVmT2JqZWN0LmdldE91dHB1dCgpKTsKLQkJCWxpc3QuYWRkKHJlZk9iamVjdC5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpKTsKLQotCQkJZm9yIChJdGVyYXRvciByZWZJdG9yID0gbGlzdC5pdGVyYXRvcigpOyByZWZJdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgcmVmSXRvck9iamVjdCA9IChPYmplY3QpIHJlZkl0b3IubmV4dCgpOwotCQkJCWlmICgocmVmSXRvck9iamVjdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpCi0JCQkJCQkmJiAhZGVzY3JpcHRvcnMuY29udGFpbnMocmVmSXRvck9iamVjdCkpIHsKLQkJCQkJcmVmZXJlbmNlc0V4aXN0cyA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZWZlcmVuY2VzRXhpc3RzOwotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVmZXJlbmNlcyBvZiB0aGUgd29ya1Byb2R1Y3RkZXNjcmlwdG9yIG9iamVjdCAicmVmT2JqZWN0LiAKLQkgKiBJZiByZWZlcmVuY2VzIGV4aXN0IGluIGFueSBkZXNjcmlwdG9yIGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwgaWdub3JlIGl0LgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9ycwotCSAqIEBwYXJhbSByZWZPYmplY3QKLQkgKiBAcGFyYW0gcmVtb3ZlUmVsYXRpb24gLSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgd2UncmUgcmVtb3ZpbmcgcmVsYXRpb24KLQkgKiAgICAgQnkgZGVmYXVsdCB0aGlzIHNob3VsZCBiZSBmYWxzZS4gCi0JICogICAgIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGlmIHlvdSBhcmUgY29taW5nIGZyb20gcHJvcGVydGllcyB2aWV3LiAKLQkgKiAgICAgZWcuIHJlbW92aW5nIHJlbGF0aW9uc2hpcCBvZiB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byB0YXNrIGRlc2NyaXB0b3IgCi0JICogQHBhcmFtIGZlYXR1cmVJRAotCSAqIAkJVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgaWYgInJlbW92ZVJlbGF0aW9uIiBpcyB0cnVlLiBZb3UgbmVlZCB0byBnaXZlIGZlYXR1cmVJRAotCSAqIAkJZm9yIHdoaWNoIHJlbGF0aW9uIHlvdSBhcmUgcmVtb3ZpbmcuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja1dvcmtQcm9kdWN0RGVzY3JpcHRvclJlZmVyZW5jZXMoCi0JCQlDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IgcmVmT2JqZWN0LCBib29sZWFuIHJlbW92ZVJlbGF0aW9uLCBpbnQgZmVhdHVyZUlEKSB7Ci0JCQotCQlMaXN0IGFsbE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWFsbE9iamVjdHMuYWRkKHJlZk9iamVjdCk7Ci0KLQkJQWN0aXZpdHkgcGFyZW50QWN0aXZpdHkgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KHJlZk9iamVjdCk7Ci0JCS8vIGNoZWNrIHdoZXRoZXIgcmVmZXJlbmNlIG9iamVjdCBpbnN0YW5jZSBvZiBhcnRpZmFjdAotCQlpZiAocmVmT2JqZWN0LmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJTGlzdCBjb250YWluZWRBcnRpZmFjdHMgPSAoKEFydGlmYWN0KSByZWZPYmplY3QuZ2V0V29ya1Byb2R1Y3QoKSkKLQkJCQkJLmdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCi0JCQlMaXN0IGNvbnRhaW5lZFdwRGVzY0xpc3QgPSBnZXRXcERlc2NGb3JBcnRpZmFjdHMoCi0JCQkJCWNvbnRhaW5lZEFydGlmYWN0cywgcGFyZW50QWN0aXZpdHkpOwotCi0JCQlMaXN0IGNvbnRhaW5lckFydGlmYWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKChBcnRpZmFjdCkgcmVmT2JqZWN0LmdldFdvcmtQcm9kdWN0KCkpCi0JCQkJCS5nZXRDb250YWluZXJBcnRpZmFjdCgpOwotCQkJd2hpbGUgKGFydGlmYWN0ICE9IG51bGwpIHsKLQkJCQljb250YWluZXJBcnRpZmFjdHMuYWRkKGFydGlmYWN0KTsKLQkJCQlhcnRpZmFjdCA9ICgoQXJ0aWZhY3QpIGFydGlmYWN0KS5nZXRDb250YWluZXJBcnRpZmFjdCgpOwotCQkJfQotCQkJTGlzdCBjb250YWluZXJXcERlc2NMaXN0ID0gZ2V0V3BEZXNjRm9yQXJ0aWZhY3RzKAotCQkJCQljb250YWluZXJBcnRpZmFjdHMsIHBhcmVudEFjdGl2aXR5KTsKLQotCQkJYWxsT2JqZWN0cy5hZGRBbGwoY29udGFpbmVkV3BEZXNjTGlzdCk7Ci0JCQlhbGxPYmplY3RzLmFkZEFsbChjb250YWluZXJXcERlc2NMaXN0KTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsT2JqZWN0cy5zaXplKCk7IGkrKykgewotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwT2JqID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgYWxsT2JqZWN0cwotCQkJCQkuZ2V0KGkpOwotCi0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlsaXN0LmFkZEFsbCh3cE9iai5nZXRJbXBhY3RlZEJ5KCkpOwotCQkJbGlzdC5hZGRBbGwod3BPYmouZ2V0SW1wYWN0cygpKTsKLQkJCWxpc3QuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldFJlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzKHdwT2JqKSk7Ci0JCQlsaXN0LmFkZEFsbCh3cE9iai5nZXREZWxpdmVyYWJsZVBhcnRzKCkpOwotCi0JCQlMaXN0IGlucHV0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlucHV0TGlzdC5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIuZ2V0RXh0ZXJuYWxJbnB1dFRvKHdwT2JqKSk7Ci0JCQlpbnB1dExpc3QuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldE1hbmRhdG9yeUlucHV0VG8od3BPYmopKTsKLQkJCWlucHV0TGlzdC5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3B0aW9uYWxJbnB1dFRvKHdwT2JqKSk7Ci0KLQkJCUxpc3Qgb3V0cHV0TGlzdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldE91dHB1dEZyb20od3BPYmopOwotCQkJaWYgKHJlbW92ZVJlbGF0aW9uKQotCQkJewotCQkJCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJCQlpZiAob3V0cHV0TGlzdC5jb250YWluc0FsbChkZXNjcmlwdG9ycykpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUIDoJCQkJCi0JCQkJCWlmIChpbnB1dExpc3QuY29udGFpbnNBbGwoZGVzY3JpcHRvcnMpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlsaXN0LmFkZEFsbChpbnB1dExpc3QpOwotCQkJbGlzdC5hZGRBbGwob3V0cHV0TGlzdCk7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgcmVmSXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgcmVmSXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IHJlZkl0b3JPYmplY3QgPSAoT2JqZWN0KSByZWZJdG9yLm5leHQoKTsKLQkJCQlpZiAoKHJlZkl0b3JPYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKQotCQkJCQkJJiYgIWRlc2NyaXB0b3JzLmNvbnRhaW5zKHJlZkl0b3JPYmplY3QpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JCi0JLyoqCi0JICogUmV0dXJuIGxpc3Qgb2YgY29ycmVzcG9uZGluZyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgZm9yIGFydGlmYWN0cwotCSAqIEBwYXJhbSBhcnRpZmFjdHMKLQkgKiBAcGFyYW0gcGFyZW50QWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFdwRGVzY0ZvckFydGlmYWN0cyhMaXN0IGFydGlmYWN0cywgQWN0aXZpdHkgcGFyZW50QWN0aXZpdHkpCi0JewotCQlMaXN0IHdwRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGk9MDsgaSA8IGFydGlmYWN0cy5zaXplKCk7IGkrKykKLQkJewotCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGFydGlmYWN0cy5nZXQoaSk7Ci0JCQlMaXN0IGJyRWxlbWVudHMgPSBwYXJlbnRBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gYnJFbGVtZW50cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspCi0JCQl7Ci0JCQkJT2JqZWN0IGJyT2JqID0gKE9iamVjdCkgaXRvci5uZXh0KCk7Ci0JCQkJaWYgKGJyT2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSAKLQkJCQl7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBick9iajsKLQkJCQkJaWYgKHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgQXJ0aWZhY3QpCi0JCQkJCXsKLQkJCQkJCWlmICh3cERlc2MuZ2V0V29ya1Byb2R1Y3QoKS5lcXVhbHMoYXJ0aWZhY3QpKQotCQkJCQkJCXdwRGVzY0xpc3QuYWRkKHdwRGVzYyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdwRGVzY0xpc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGVSb2xlIGNyZWF0ZUNvbXBvc2l0ZVJvbGUoQ29tcG9zaXRlUm9sZSBvYmopIHsKLQkJQ29tcG9zaXRlUm9sZSBjb21wUm9sZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbXBvc2l0ZVJvbGUoKTsKLQkJY29tcFJvbGUuZ2V0QWdncmVnYXRlZFJvbGVzKCkuYWRkQWxsKG9iai5nZXRBZ2dyZWdhdGVkUm9sZXMoKSk7Ci0KLQkJU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUgPSBvYmouZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQljb21wUm9sZS5zZXROYW1lKG9iai5nZXROYW1lKCkpOwotCQljb21wUm9sZS5zZXRQcmVzZW50YXRpb25OYW1lKFN0clV0aWwuaXNCbGFuayhwcmVzZW50YXRpb25OYW1lKSA/IG9iagotCQkJCS5nZXROYW1lKCkgOiBwcmVzZW50YXRpb25OYW1lKTsKLQkJcmV0dXJuIGNvbXBSb2xlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUYXNrVG9BY3Rpdml0eShUYXNrIHRhc2ssIEFjdGl2aXR5IGFjdCkgewotCQlXQlNEcm9wQ29tbWFuZCBjbWQgPSBuZXcgV0JTRHJvcENvbW1hbmQoYWN0LCBDb2xsZWN0aW9ucwotCQkJCS5zaW5nbGV0b25MaXN0KHRhc2spKTsKLQkJQlNEcm9wQ29tbWFuZC5JRXhlY3V0b3IgZXhlY3V0b3IgPSBjbWQuZ2V0RXhlY3V0b3IoKTsKLQkJaWYgKGV4ZWN1dG9yLnByZUV4ZWN1dGUoKSkgewotCQkJZXhlY3V0b3IuZG9FeGNlY3V0ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1Byb2Nlc3NOb3RPZlR5cGUoUHJvY2Vzc1BhY2thZ2UgcGtnLAotCQkJRUNsYXNzIHByb2Nlc3NUeXBlKSB7Ci0JCWlmIChwa2cgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIHBrZykuZ2V0UHJvY2VzcygpOwotCQkJaWYgKHByb2MgIT0gbnVsbCAmJiAhcHJvY2Vzc1R5cGUuaXNJbnN0YW5jZShwcm9jKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZFBrZyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChjaGlsZFBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIGNoaWxkUGtnKS5nZXRQcm9jZXNzKCk7Ci0JCQkJaWYgKHByb2MgIT0gbnVsbCAmJiAhcHJvY2Vzc1R5cGUuaXNJbnN0YW5jZShwcm9jKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGNoaWxkUGtnIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlpZiAoaGFzUHJvY2Vzc05vdE9mVHlwZSgoUHJvY2Vzc1BhY2thZ2UpIGNoaWxkUGtnLCBwcm9jZXNzVHlwZSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIGNvcnJlc3BvZGluZyByb2xlRGVzY3JpcHRvciBpbiB0ZWFtIHNpbmNlIHdlIG1haW50YWluIHR3byByb2xlCi0JICogZGVzY3JpcHRvciBmb3IgdGhlIHNhbWUgcm9sZQotCSAqIAotCSAqIEBwYXJhbSB0ZWFtCi0JICogQHBhcmFtIHJvbGVEZXNjCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGZpbmRSb2xlRGVzY3JpcHRvcihUZWFtUHJvZmlsZSB0ZWFtLAotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MpIHsKLQkJTGlzdCB0ZWFtUm9sZXMgPSB0ZWFtLmdldFRlYW1Sb2xlcygpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHRlYW1Sb2xlcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBpdG9yT2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAocm9sZURlc2MgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJaWYgKGl0b3JPYmplY3QgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJCUxpc3QgZmlyc3RPYmplY3RBZ2dSb2xlcyA9ICgoQ29tcG9zaXRlUm9sZSkgcm9sZURlc2MpCi0JCQkJCQkJLmdldEFnZ3JlZ2F0ZWRSb2xlcygpOwotCQkJCQlMaXN0IHNlY29uZE9iamVjdEFnZ1JvbGVzID0gKChDb21wb3NpdGVSb2xlKSBpdG9yT2JqZWN0KQotCQkJCQkJCS5nZXRBZ2dyZWdhdGVkUm9sZXMoKTsKLQkJCQkJaWYgKGZpcnN0T2JqZWN0QWdnUm9sZXMuZXF1YWxzKHNlY29uZE9iamVjdEFnZ1JvbGVzKSkgewotCQkJCQkJcmV0dXJuIGl0b3JPYmplY3Q7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHJvbGVEZXNjIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQlpZiAoKGl0b3JPYmplY3QgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikKLQkJCQkJCSYmICghKGl0b3JPYmplY3QgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSkpIHsKLQkJCQkJT2JqZWN0IG9ialJvbGUgPSAoKFJvbGVEZXNjcmlwdG9yKSByb2xlRGVzYykuZ2V0Um9sZSgpOwotCQkJCQlPYmplY3QgaXRvck9ialJvbGUgPSAoKFJvbGVEZXNjcmlwdG9yKSBpdG9yT2JqZWN0KQotCQkJCQkJCS5nZXRSb2xlKCk7Ci0JCQkJCWlmIChvYmpSb2xlLmVxdWFscyhpdG9yT2JqUm9sZSkpIHsKLQkJCQkJCXJldHVybiBpdG9yT2JqZWN0OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbHVtbkluZGV4VG9OYW1lTWFwIGZyb20gdGhlIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNvbHVtbgotCSAqIG5hbWVzCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIHRvQ29sdW1uSW5kZXhUb05hbWVNYXAoU3RyaW5nIGNvbE5hbWVzKSB7Ci0JCU1hcCBjb2x1bW5JbmRleFRvTmFtZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbE5hbWVzLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCWludCBpZCA9IDA7Ci0JCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCk7Ci0JCQljb2x1bW5JbmRleFRvTmFtZU1hcC5wdXQobmV3IEludGVnZXIoaWQpLCBnZXRDb2x1bW5JRCh0b2tlbikpOwotCQkJaWQrKzsKLQkJfQotCQlyZXR1cm4gY29sdW1uSW5kZXhUb05hbWVNYXA7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDb2x1bW5JRChTdHJpbmcgY29sTmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IElCU0l0ZW1Qcm92aWRlci5DT0xVTU5TLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgY29sID0gSUJTSXRlbVByb3ZpZGVyLkNPTFVNTlNbaV07Ci0JCQlpZiAoY29sLmVxdWFscyhjb2xOYW1lKSkgewotCQkJCXJldHVybiBjb2w7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIGFuIG5ldyBkZXNjcmlwdG9yIGNhbiBiZSBjcmVhdGVkIGZvciBhIGdpdmVuIG1ldGhvZCBlbGVtZW50Ci0JLy8gdW5kZXIgdGhlIGdpdmVuIGFjdGl2aXR5LCBjb25zaWRlcmluZyBhbGwgaW5oZXJpdGVkIGRlc2NyaXB0b3JzIG9mIHRoZSBhY3Rpdml0eS4KLQkvLyBJdCBpcyBOT1QgRUZGSUNJRU5UIHRvIGNvbGxlY3QgYWxsIGxpbmtlZCBlbGVtZW50cyBvZiB0aGUgaW5oZXJpdGVkIGRlc2NyaXB0b3JzIGludG8gYSBsaXN0IGFuZCB0aGVuIGNoZWNrIGlmCi0JLy8gd2hldGhlciB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgaXMgaW4gdGhlIGxpc3QuCi0JLy8KLQkvLyBVc2UgUHJvY2Vzc0NvbW1hbmRVdGlsI2dldFZhbGlkRGVzY3JpcHRvcihPYmplY3Qgb2JqLCBBY3Rpdml0eSBhY3Rpdml0eSkgaW5zdGVhZAotCS8vCi0vLwlwdWJsaWMgc3RhdGljIExpc3QgZ2V0VmFyaWFiaWxpdHlFbGVtZW50KE9iamVjdCBvd25lcikgewotLy8JCUxpc3QgYmFzZUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCWlmIChvd25lciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0vLwkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBvd25lcjsKLS8vCQkJd2hpbGUgKCFhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKS5lcXVhbHMoCi0vLwkJCQkJVmFyaWFiaWxpdHlUeXBlLk5BX0xJVEVSQUwpKSB7Ci0vLwkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IGFjdGl2aXR5Ci0vLwkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0vLwotLy8JCQkJaWYgKChlbGVtZW50ICE9IG51bGwpICYmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0vLwkJCQkJQWN0aXZpdHkgYmFzZUFjdGl2aXR5ID0gKEFjdGl2aXR5KSBlbGVtZW50OwotLy8KLS8vCQkJCQlMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gYmFzZUFjdGl2aXR5Ci0vLwkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBicmVha2Rvd25FbGVtZW50cy5pdGVyYXRvcigpOyBpdG9yCi0vLwkJCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJCQlPYmplY3Qgb2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0vLwkJCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0vLwkJCQkJCQlPYmplY3QgYmFzZU9iaiA9IGdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBvYmplY3QpOwotLy8JCQkJCQkJaWYgKGJhc2VPYmogIT0gbnVsbCkgewotLy8JCQkJCQkJCWJhc2VFbGVtZW50cy5hZGQoYmFzZU9iaik7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwotLy8JCQkJCWFjdGl2aXR5ID0gYmFzZUFjdGl2aXR5OwotLy8JCQkJfQotLy8JCQkJZWxzZSB7Ci0vLwkJCQkJYnJlYWs7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCXJldHVybiBiYXNlRWxlbWVudHM7Ci0vLwl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgcHJlZGVjZXNzb3IgbGlzdCBvZiBhbGwgaXRlbSBwcm92aWRlcnMgb2YgdGhlIGdpdmVuIHByb2Nlc3MKLQkgKiAKLQkgKiBAcGFyYW0gZmFjdG9yeQotCSAqIEBwYXJhbSBwcm9jCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVByZWRlY2Vzc29ycyhBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBQcm9jZXNzIHByb2MsCi0JCQlMaXN0IHJlbW92ZWRFbGVtZW50cykgewotCQlIYXNoU2V0IGVsZW1lbnRzID0gbmV3IEhhc2hTZXQocmVtb3ZlZEVsZW1lbnRzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGZhY3RvcnksIHByb2MpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBmYWN0b3J5LmFkYXB0KG9iaiwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChpdGVtUHJvdmlkZXIgIT0gbnVsbAotCQkJCQkmJiBUbmdVdGlsLnVud3JhcChvYmopIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gaXRlbVByb3ZpZGVyLmdldFByZWRlY2Vzc29ycygpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQkJZSA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgZSkuZ2V0VGFyZ2V0KCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGVsZW1lbnRzLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRUb0FjdGl2aXR5KEFjdGl2aXR5IGFjdCwgQnJlYWtkb3duRWxlbWVudCBiZSwgT2JqZWN0W10gcHJldkFuZE5leHQpIHsKLQkJT2JqZWN0IG5leHQgPSBwcmV2QW5kTmV4dFsxXTsKLQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwotCQlpZihuZXh0ICE9IG51bGwpIHsKLQkJCWludCBpZCA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmluZGV4T2YobmV4dCk7Ci0JCQlpZihpZCAhPSAtMSkgeyAKLQkJCQlhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoaWQsIGJlKTsKLQkJCQlhZGRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYoIWFkZGVkKSB7Ci0JCQlPYmplY3QgcHJldiA9IHByZXZBbmROZXh0WzBdOwotCQkJaWYocHJldiAhPSBudWxsKSB7CQkJCQotCQkJCWludCBpZCA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmluZGV4T2YocHJldik7Ci0JCQkJaWYoaWQgIT0gLTEpIHsKLQkJCQkJYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGlkICsgMSwgYmUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGJlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoYmUpOwotCQkJfQotCQl9Ci0KLQl9Ci0JCi0JLyoqCi0JICogTG9jYWxseSBjb250cmlidXRlcyB0byB0aGUgaW5oZXJpdGVkIGFjdGl2aXR5IHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBhZGFwdGVyCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiBAcGFyYW0gY3JlYXRlZEFjdGl2aXRpZXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBjb250cmlidXRlVG9BY3Rpdml0eSgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGFkYXB0ZXIsIExpc3QgY3JlYXRlZEFjdGl2aXRpZXMpIHsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KG51bGwpOwotCQlPYmplY3RbXSBwcmV2QW5kTmV4dCA9IFByb2Nlc3NVdGlsCi0JCQkJLmdldFByZXZpb3VzQW5kTmV4dChhZGFwdGVyKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlwYXJlbnQgPSBjb250cmlidXRlVG9BY3Rpdml0eSgKLQkJCQkJKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBwYXJlbnQsCi0JCQkJCWNyZWF0ZWRBY3Rpdml0aWVzKTsKLQkJfQotCQlBY3Rpdml0eSBhY3QgPSBQcm9jZXNzVXRpbC5nZW5lcmlhbGl6ZShhZGFwdGVyLAotCQkJCVZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT05fTElURVJBTCwgcHJldkFuZE5leHQpOwotCQlBY3Rpdml0eSBwYXJlbnRBY3QgPSAoKEFjdGl2aXR5KSBwYXJlbnQpOwotCQlhZGRUb0FjdGl2aXR5KHBhcmVudEFjdCwgYWN0LCBwcmV2QW5kTmV4dCk7Ci0JCWNyZWF0ZWRBY3Rpdml0aWVzLmFkZChhY3QpOwotCQlyZXR1cm4gYWN0OwotCX0KLQotCS8qKgotCSAqIExvY2FsbHkgcmVwbGFjZXMgdGhlIGluaGVyaXRlZCBhY3Rpdml0eSByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gYWRhcHRlcgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogQHBhcmFtIGNyZWF0ZWRBY3Rpdml0aWVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VBY3Rpdml0eUxvY2FsbHkoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBhZGFwdGVyLCBMaXN0IGNyZWF0ZWRBY3Rpdml0aWVzKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChudWxsKTsKLQkJT2JqZWN0W10gcHJldkFuZE5leHQgPSBQcm9jZXNzVXRpbAotCQkJCS5nZXRQcmV2aW91c0FuZE5leHQoYWRhcHRlcik7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJcGFyZW50ID0gY29udHJpYnV0ZVRvQWN0aXZpdHkoCi0JCQkJCShCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgcGFyZW50LAotCQkJCQljcmVhdGVkQWN0aXZpdGllcyk7Ci0JCX0KLQkJQWN0aXZpdHkgYWN0ID0gUHJvY2Vzc1V0aWwuZ2VuZXJpYWxpemUoYWRhcHRlciwKLQkJCQlWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlRfTElURVJBTCwgcHJldkFuZE5leHQpOwotCQlBY3Rpdml0eSBwYXJlbnRBY3QgPSAoKEFjdGl2aXR5KSBwYXJlbnQpOwotCQlhZGRUb0FjdGl2aXR5KHBhcmVudEFjdCwgYWN0LCBwcmV2QW5kTmV4dCk7Ci0JCWNyZWF0ZWRBY3Rpdml0aWVzLmFkZChhY3QpOwotCX0KLQotCXN0YXRpYyBPYmplY3RbXSBnZXRQcmV2aW91c0FuZE5leHQoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBhZGFwdGVyKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChudWxsKTsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyCi0JCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIGl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihwYXJlbnQpOwotCQlpbnQgaWQgPSBjaGlsZHJlbi5pbmRleE9mKGFkYXB0ZXIpICsgMTsKLQkJT2JqZWN0IG5leHQgPSBudWxsOwotCQlpZiAoaWQgPCBjaGlsZHJlbi5zaXplKCkpIHsKLQkJCW5leHQgPSBjaGlsZHJlbi5nZXQoaWQpOwotCQl9Ci0JCU9iamVjdCBwcmV2ID0gbnVsbDsKLQkJaWQgLT0gMjsKLQkJaWYgKGlkID4gLTEpIHsKLQkJCXByZXYgPSBjaGlsZHJlbi5nZXQoaWQpOwotCQl9Ci0KLQkJT2JqZWN0W10gcHJldkFuZE5leHQgPSB7IHByZXYsIG5leHQgfTsKLQkJcmV0dXJuIHByZXZBbmROZXh0OwotCX0KLQotCXN0YXRpYyBBY3Rpdml0eSBnZW5lcmlhbGl6ZShCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBhZGFwdGVyLAotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUsIE9iamVjdFtdIHByZXZBbmROZXh0KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlcgotCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQotCQlBY3Rpdml0eSBhY3QgPSBnZW5lcmFsaXplKChBY3Rpdml0eSkgYWRhcHRlci5nZXRWYWx1ZSgpLCB0eXBlKTsKLQkJT2JqZWN0IG5leHQgPSBwcmV2QW5kTmV4dFsxXTsKLQkJaWYobmV4dCAhPSBudWxsKSB7Ci0JCQlhY3Quc2V0UHJlc2VudGVkQWZ0ZXIoKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKG5leHQpKTsKLQkJCWlmKG5leHQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJKChCcmVha2Rvd25FbGVtZW50KW5leHQpLnNldFByZXNlbnRlZEJlZm9yZShhY3QpOwotCQkJfQotCQl9Ci0JCU9iamVjdCBwcmV2ID0gcHJldkFuZE5leHRbMF07Ci0JCWlmKHByZXYgIT0gbnVsbCkgewotCQkJYWN0LnNldFByZXNlbnRlZEJlZm9yZSgoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAocHJldikpOwotCQkJaWYgKHByZXYgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJKChCcmVha2Rvd25FbGVtZW50KXByZXYpLnNldFByZXNlbnRlZEFmdGVyKGFjdCk7Ci0JCQl9Ci0JCX0KLQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoYWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlic0l0ZW1Qcm92aWRlci5zZXRFeHBhbmRlZChhZGFwdGVyLmlzRXhwYW5kZWQoKSk7Ci0JCXJldHVybiBhY3Q7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW1tZWRpYXRlIGJhc2UgcHJvY2VzcyBvZiB0aGUgZ2l2ZW4KLQkgKiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB0aGF0IHJlcHJlc2VudHMgYW4gaW5oZXJpdGVkCi0JICogYnJlYWtkb3duIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGl0ZW1Qcm92aWRlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb2Nlc3MgZ2V0SW1tZWRpYXRlQmFzZVByb2Nlc3MoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIpIHsKLQkJQWN0aXZpdHkgaW5oZXJpdG9yID0gZ2V0SW5oZXJpdG9yKGl0ZW1Qcm92aWRlcik7Ci0JCWlmIChpbmhlcml0b3IgIT0gbnVsbCkgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgaW5oZXJpdG9yCi0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFjdGl2aXR5IGluIHRoZSBwcm9jZXNzIG9mIHRoZSBnaXZlbiBpdGVtIHByb3ZpZGVyIHRoYXQgaW5oZXJpdHMKLQkgKiB0aGUgZWxlbWVudCByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gaXRlbSBwcm92aWRlcgotCSAqIAotCSAqIEBwYXJhbSBpdGVtUHJvdmlkZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBnZXRJbmhlcml0b3IoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIpIHsKLQkJaWYgKGl0ZW1Qcm92aWRlci5pc1JlYWRPbmx5KCkpIHsKLQkJCS8vIHRoaXMgcmVwcmVzZW50cyBhbiBpbmhlcml0ZWQgYnJlYWtkb3duIGVsZW1lbnQKLQkJCS8vCi0JCQlmb3IgKE9iamVjdCBwYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KGl0ZW1Qcm92aWRlcik7IHBhcmVudCAhPSBudWxsOykgewotCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlwYXJlbnQgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBwYXJlbnQpCi0JCQkJCQkJLmdldFBhcmVudChwYXJlbnQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiAoQWN0aXZpdHkpIHBhcmVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBwYXJlbnQgbGlzdCBvZiA8Y29kZT53cmFwcGVyPC9jb2RlPiBmcm9tIDxjb2RlPmZyb208L2NvZGU+LAotCSAqIGV4Y2x1ZGVkIDxjb2RlPmZyb208L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIGZyb20KLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEByZXR1cm4gbGlzdCBvZiB1bndyYXBwZWQgcGFyZW50IG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0UGFyZW50TGlzdChPYmplY3QgZnJvbSwKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJcmV0dXJuIGdldFBhcmVudExpc3Qod3JhcHBlciwgZnJvbSwgd3JhcHBlci5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBwYXJlbnQgbGlzdCBvZiA8Y29kZT5vYmplY3Q8L2NvZGU+IGZyb20gPGNvZGU+ZnJvbTwvY29kZT4sCi0JICogZXhjbHVkZWQgPGNvZGU+ZnJvbTwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIGZyb20KLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgdW53cmFwcGVkIHBhcmVudCBvYmplY3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFBhcmVudExpc3QoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGZyb20sIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUFycmF5TGlzdCBwYXJlbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQob2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlmb3IgKE9iamVjdCBwYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KG9iamVjdCk7IHBhcmVudCAhPSBmcm9tCi0JCQkJJiYgcGFyZW50ICE9IG51bGw7KSB7Ci0JCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAocGFyZW50KTsKLQkJCU1ldGhvZEVsZW1lbnQgZTsJCQkKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJZSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXI7Ci0JCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgcGFyZW50OwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQkJCQlwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJfQotCQkJCWlmKFByb2Nlc3NVdGlsLmlzVG9wUHJvY2VzcyhlKSkgewotCQkJCQlwYXJlbnQgPSBudWxsOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIG11c3QgYmUgYSBJdGVtUHJvdmlkZXJBZGFwdGVyCi0JCQkJLy8KLQkJCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIG9iaik7Ci0JCQkJZSA9IChNZXRob2RFbGVtZW50KSBhZGFwdGVyLmdldFRhcmdldCgpOwotCQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCQl9Ci0JCQlwYXJlbnRMaXN0LmFkZCgwLCBlKTsKLQkJfQotCQlyZXR1cm4gcGFyZW50TGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3cmFwcGVycyBvZiBhbGwgYnJlYWtkb3duIHN0cnVjdHVyZSAoQlMpIHZpZXdzIGluIHRoZSBmb2xsb3dpbmcKLQkgKiBvcmRlcjogV0JTLCBUQlMsIFdQQlMKLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqICAgICAgICAgICAgdGhlIHdyYXBwZXIgb2YgYSBCUyB2aWV3Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRXcmFwcGVycyhCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyLCBBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMpIHsKLQkJQXJyYXlMaXN0IHJvbGxlZFVwSXRlbVByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCUFkYXB0ZXJGYWN0b3J5IHJvb3RBZGFwdGVyRmFjdG9yeSA9IFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KHdyYXBwZXIuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCQlPYmplY3QgcHJvYyA9IHdyYXBwZXIuZ2V0VG9wSXRlbSgpOwkJCQkJCQotCQkJQXJyYXlMaXN0IG9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KFByb2Nlc3NVdGlsLmdldFBhcmVudExpc3QocHJvYywKLQkJCQkJd3JhcHBlcikpOwotCQkJQXJyYXlMaXN0IHdyYXBwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVyRmFjdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yaWVzW2ldOwotCQkJCWlmIChhZGFwdGVyRmFjdG9yeSA9PSByb290QWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJd3JhcHBlcnMuYWRkKHdyYXBwZXIpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJCQlvYmplY3RzLmFkZChlKTsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gcHJvYzsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gb2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcjEubmV4dCgpOwotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChvYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQotCQkJCQkvLyBtYWtlIHN1cmUgdGhlIGFjdGl2aXR5IGlzIHJvbGxlZCBkb3duIGJlZm9yZSBsb29raW5nIGludG8gaXRzIGNoaWxkcmVuCi0JCQkJCS8vCi0JCQkJCU9iamVjdCBiZSA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7CQkJCQkJCQkKLQkJCQkJaWYoYmUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJCQkJCWlmKGl0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCkpIHsKLQkJCQkJCQkJaXRlbVByb3ZpZGVyLmJhc2ljU2V0Um9sbGVkVXAoZmFsc2UpOwotCQkJCQkJCQlyb2xsZWRVcEl0ZW1Qcm92aWRlcnMuYWRkKGl0ZW1Qcm92aWRlcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSBpZihhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXI7Ci0JCQkJCQkJaWYoaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKSkgewotCQkJCQkJCQlpdGVtUHJvdmlkZXIuc2V0Um9sbGVkVXAoZmFsc2UpOwotCQkJCQkJCQlyb2xsZWRVcEl0ZW1Qcm92aWRlcnMuYWRkKGl0ZW1Qcm92aWRlcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlmaW5kX2NoaWxkOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWRhcHRlcgotCQkJCQkJCS5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmIChlbGVtZW50ID09IFRuZ1V0aWwudW53cmFwKGNoaWxkKSkgewotCQkJCQkJCW9iamVjdCA9IGNoaWxkOwotCQkJCQkJCWJyZWFrIGZpbmRfY2hpbGQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCXdyYXBwZXJzLmFkZChvYmplY3QpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotCQkJCQkJCSJDb3VsZCBub3QgZmluZCB3cmFwcGVyIGZvciAiICsgZSArICIgdXNpbmcgYWRhcHRlciBmYWN0b3J5ICIgKyBhZGFwdGVyRmFjdG9yeSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB3cmFwcGVyczsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmKCFyb2xsZWRVcEl0ZW1Qcm92aWRlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJLy8gcmVzdG9yZSB0aGUgcm9sbGVkVXAgZmxhZwotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcm9sbGVkVXBJdGVtUHJvdmlkZXJzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGl0ZXIubmV4dCgpKS5iYXNpY1NldFJvbGxlZFVwKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXRzIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBzcGVjaWZpYyBtb2RlbCBpbmZvIAotCSAqIEBwYXJhbSBtb2RlbEluZm8KLQkgKiBAcGFyYW0gb2JqZWN0IFdvcmtQcm9kdWN0RGVzY3JpcHRvciBvciBpdHMgd3JhcHBlcgotCSAqIEBwYXJhbSBpdGVtUHJvdmlkZXIgaXRlbSBwcm92aWRlciBvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3Igb3IgaXRzIHdyYXBwZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0V1BETW9kZWxJbmZvKFN0cmluZ0J1ZmZlciBtb2RlbEluZm8sIE9iamVjdCBvYmplY3QsIE9iamVjdCBpdGVtUHJvdmlkZXIpIHsKLQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7CQotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpZWxlbWVudDsKLQkJCWlmKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCS8vIGNoZWNrIGlmIHRoaXMgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgaXMgc2hvd24gdW5kZXIgYSB0YXNrIGRlc2NyaXB0b3Igb3Igcm9sZSBkZXNjcmlwdG9yCi0JCQkJLy8KLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQkJaWYoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQlhZGFwdGVyRmFjdG9yeSA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcilpdGVtUHJvdmlkZXIpLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJYWRhcHRlckZhY3RvcnkgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWl0ZW1Qcm92aWRlcikuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQl9Ci0JCQkJaWYoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQlPYmplY3QgcGFyZW50RGVzY3JpcHRvciA9IG51bGw7Ci0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcilpdGVtUHJvdmlkZXI7Ci0JCQkJCWZpbmRQYXJlbnREZXNjcmlwdG9yOgotCQkJCQkJZm9yKE9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChvYmplY3QpOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KSkgewotCQkJCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAocGFyZW50KTsKLQkJCQkJCQlpZihlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCQkJcGFyZW50RGVzY3JpcHRvciA9IGU7Ci0JCQkJCQkJCWJyZWFrIGZpbmRQYXJlbnREZXNjcmlwdG9yOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCQlicmVhayBmaW5kUGFyZW50RGVzY3JpcHRvcjsKLQkJCQkJCQl9Ci0JCQkJCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCX0KLQkJCQkJaWYocGFyZW50RGVzY3JpcHRvciAhPSBudWxsKSB7CQotCQkJCQkJLy8gd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgaXMgc2hvd24gdW5kZXIgYSB0YXNrIGRlc2NyaXB0b3IKLQkJCQkJCS8vIHNob3cgb25seSBtb2RlbCBpbmZvIHJlbGF0ZWQgdG8gdGhpcyB0YXNrIGRlc2NyaXB0b3IKLQkJCQkJCS8vCi0JCQkJCQlBcnJheUxpc3QgZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlpZihBc3NvY2lhdGlvbkhlbHBlci5nZXRNYW5kYXRvcnlJbnB1dFRvKHdwZCkuY29udGFpbnMocGFyZW50RGVzY3JpcHRvcikpIHsKLQkJCQkJCQlmZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZihBc3NvY2lhdGlvbkhlbHBlci5nZXRPcHRpb25hbElucHV0VG8od3BkKS5jb250YWlucyhwYXJlbnREZXNjcmlwdG9yKSkgewotCQkJCQkJCWZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCkpOwkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWlmKEFzc29jaWF0aW9uSGVscGVyLmdldE91dHB1dEZyb20od3BkKS5jb250YWlucyhwYXJlbnREZXNjcmlwdG9yKSkgewotCQkJCQkJCWZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZighZmVhdHVyZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJaWYgKG1vZGVsSW5mby50b1N0cmluZygpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQltb2RlbEluZm8uYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCQkJCQkJbW9kZWxJbmZvLmFwcGVuZChUbmdVdGlsLmdldEZlYXR1cmVUZXh0KGZlYXR1cmUpKTsKLQkJCQkJCQkJaWYoaSA8IGZlYXR1cmVzLnNpemUoKSAtMSl7Ci0JCQkJCQkJCQltb2RlbEluZm8uYXBwZW5kKCIsIik7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlnZXRNb2RlbEluZm9Gb3JXb3JrUHJvZHVjdERlc2NyaXB0b3IobW9kZWxJbmZvLCB3cGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBNb2RlbEluZm9ybWF0aW9uIHNwZWNpZmljIHRvIFdvcmtQcm9kdWN0RGVzY3JpcHRvci4gTW9kZWwKLQkgKiBJbmZvcm1hdGlvbiBpcyBmb3IgUEJTIChXb3JrUHJvZHVjdERlc2NyaXB0b3JzLCBpbmNsdWRpbmcgRXh0ZW5kZWQKLQkgKiBBY3Rpdml0eSdzIFdvcmtQcm9kdWN0RGVzY3JpcHRvcnMpLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0TW9kZWxJbmZvRm9yV29ya1Byb2R1Y3REZXNjcmlwdG9yKAotCQkJU3RyaW5nQnVmZmVyIG1vZGVsSW5mbywgV29ya1Byb2R1Y3REZXNjcmlwdG9yIG9iamVjdCkgewotCQlTdHJpbmcgY29tbWEgPSAiLCI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFBc3NvY2lhdGlvbkhlbHBlci5nZXRNYW5kYXRvcnlJbnB1dFRvKG9iamVjdCkuaXNFbXB0eSgpKSB7Ci0JCQlpZiAobW9kZWxJbmZvLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJbW9kZWxJbmZvLmFwcGVuZChjb21tYSk7Ci0JCQl9Ci0JCQltb2RlbEluZm8uYXBwZW5kKFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoIUFzc29jaWF0aW9uSGVscGVyLmdldE9wdGlvbmFsSW5wdXRUbyhvYmplY3QpLmlzRW1wdHkoKSkgewotCQkJaWYgKG1vZGVsSW5mby50b1N0cmluZygpLmxlbmd0aCgpID4gMCkgewotCQkJCW1vZGVsSW5mby5hcHBlbmQoY29tbWEpOwotCQkJfQotCQkJbW9kZWxJbmZvLmFwcGVuZChVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl9vcHRpb25hbElucHV0X2ZlYXR1cmUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoIUFzc29jaWF0aW9uSGVscGVyLmdldE91dHB1dEZyb20ob2JqZWN0KS5pc0VtcHR5KCkpIHsKLQkJCWlmIChtb2RlbEluZm8udG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQltb2RlbEluZm8uYXBwZW5kKGNvbW1hKTsKLQkJCX0KLQkJCW1vZGVsSW5mby5hcHBlbmQoVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3Jfb3V0cHV0X2ZlYXR1cmUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXREdXBsaWNhdGVEZXNjcmlwdG9yc0FmdGVyUmV2ZWFsKENvbGxlY3Rpb24gZWxlbWVudHNUb1JldmVhbCkgewotCQlDb2xsZWN0aW9uIGR1cGxpY2F0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9SZXZlYWwuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQlEZXNjcmlwdG9yIGRlc2MgPSAoRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudChkZXNjKTsKLQkJCQlpZihlICE9IG51bGwpIHsKLQkJCQkJQWN0aXZpdHkgYWN0ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eShkZXNjKTsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJCQllID0gKE1ldGhvZEVsZW1lbnQpIFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLnJlc29sdmUoZSwgY29uZmlnKTsKLQkJCQkJT2JqZWN0IGR1cGxpY2F0ZSA9IFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKGUsIGFjdCwgY29uZmlnKTsKLQkJCQkJaWYoZHVwbGljYXRlICE9IG51bGwpIHsKLQkJCQkJCWR1cGxpY2F0ZXMuYWRkKGR1cGxpY2F0ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBkdXBsaWNhdGVzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0RHVwbGljYXRlRGVzY3JpcHRvcnNBZnRlclN1cHByZXNzKENvbGxlY3Rpb24gZWxlbWVudHNUb1N1cHByZXNzKSB7Ci0JCUNvbGxlY3Rpb24gZHVwbGljYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb1N1cHByZXNzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0ZW0gPSBpdGVyLm5leHQoKTsKLQkJCWlmKGl0ZW0gaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJRGVzY3JpcHRvciBkZXNjID0gKERlc2NyaXB0b3IpIGl0ZW07Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoZGVzYyk7Ci0JCQkJaWYoZSAhPSBudWxsKSB7Ci0JCQkJCUFjdGl2aXR5IGFjdCA9IFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkoZGVzYyk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYoZWxlbWVudCAhPSBlICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yICYmIGVsZW1lbnQuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJTWV0aG9kRWxlbWVudCBsaW5rZWRFbGVtZW50ID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIGVsZW1lbnQpOwotCQkJCQkJCWlmKGxpbmtlZEVsZW1lbnQgPT0gZSkgewotCQkJCQkJCQlkdXBsaWNhdGVzLmFkZChlbGVtZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBkdXBsaWNhdGVzOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG9iamVjdCBpcyByZXByZXNlbnRpbmcgYSBpbmhlcml0ZWQgZWxlbWVudCBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgdHJlZSBvZiBwcm9jZXNzIGVkaXRvcgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5oZXJpdGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIKLQkJJiYgKChEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKW9iamVjdCkuaXNJbmhlcml0ZWQoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhY3Rpdml0eSBoYXMgaW5oZXJpdGVkIGFueSBicmVha2Rvd24gZWxlbWVudCB2aWEgZXh0ZW5zaW9uIG9mIGxvY2FsIGNvbnRyaWJ1dGlvbgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzSW5oZXJpdGVkKEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoYWN0aXZpdHkpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwTDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlyZXR1cm4gKChBY3Rpdml0eSlvYmplY3QpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCX0KLQkJCQotCQl9OwotCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCWlmKG8gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgbzsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmKHZlICE9IG51bGwpIHsKLQkJCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBhY3QuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQkJCWlmKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCB8fCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT05fTElURVJBTCkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250cmlidXRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcgotCQkmJiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKW9iamVjdCkuaXNDb250cmlidXRlZCgpOwotCX0JCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldEFsbFN1YlRlYW1zKFRlYW1Qcm9maWxlIHRlYW0sIExpc3QgdGVhbXMpIHsKLQkJdGVhbXMuYWRkKHRlYW0pOwotCQlMaXN0IHN1YlRlYW1zID0gdGVhbS5nZXRTdWJUZWFtKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHN1YlRlYW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJVGVhbVByb2ZpbGUgc3ViVGVhbSA9IChUZWFtUHJvZmlsZSkgaXRvci5uZXh0KCk7Ci0KLQkJCWdldEFsbFN1YlRlYW1zKHN1YlRlYW0sIHRlYW1zKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBMaXN0IGdldFRlYW1Qcm9maWxlcyhPYmplY3Qgb2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCUxpc3QgdGVhbXMgPSBuZXcgQXJyYXlMaXN0KEFzc29jaWF0aW9uSGVscGVyLmdldFRlYW1Qcm9maWxlcyhyb2xlRGVzYykpOwotCQkKLQkJLy8gZ2V0IGFsbCB0aGUgdGVhbSBwcm9maWxlcyB0aGF0IGFyZSBpbiBzY29wZSBvZiB0aGUgd3JhcHBlcgotCQkvLwotCQlIYXNoU2V0IHZpc2libGVUZWFtcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KG9iamVjdCk7IHBhcmVudCAhPSBudWxsOykgewotCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsJCQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlci5nZXRDaGlsZHJlbihwYXJlbnQpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQkJTGlzdCBhY3Rpdml0eVRlYW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlnZXRBbGxTdWJUZWFtcygoVGVhbVByb2ZpbGUpIGUsIGFjdGl2aXR5VGVhbXMpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBhY3Rpdml0eVRlYW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykJewotCQkJCQkJT2JqZWN0IG8gPSBpdG9yLm5leHQoKTsKLQkJCQkJCWlmKG8gaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSAmJiAoKFRlYW1Qcm9maWxlKW8pLmdldFRlYW1Sb2xlcygpLmNvbnRhaW5zKHJvbGVEZXNjKSkgewotCQkJCQkJCXZpc2libGVUZWFtcy5hZGQobyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlPYmplY3QgbmV3UGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KTsKLQkJCWlmKG5ld1BhcmVudCA9PSBudWxsICYmIHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJbmV3UGFyZW50ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eSgoQWN0aXZpdHkpcGFyZW50KTsKLQkJCX0KLQkJCXBhcmVudCA9IG5ld1BhcmVudDsKLQkJfQotCQkKLQkJLy8gcmVtb3ZlIGFueSB0ZWFtIHByb2ZpbGUgdGhhdCBpcyBub3QgaW4gdGhlIHNjb3BlIG9mIHRoZSB3cmFwcGVyCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRlYW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHRlYW0gPSBpdGVyLm5leHQoKTsKLQkJCWlmKCF2aXNpYmxlVGVhbXMuY29udGFpbnModGVhbSkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdGVhbXM7Ci0KLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgbGlzdCBvZiB2aXNpYmxlIHRlYW0gcHJvZmlsZXMgZm9yIHRoZSByb2xlIGRlc2NyaXB0b3IgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIHdyYXBwZXIKLQkgKiAKLQkgKiBAcGFyYW0gcm9sZURlc2NXcmFwcGVyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRUZWFtUHJvZmlsZXMoUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIHJvbGVEZXNjV3JhcHBlcikgewotCQlyZXR1cm4gZ2V0VGVhbVByb2ZpbGVzKHJvbGVEZXNjV3JhcHBlciwgcm9sZURlc2NXcmFwcGVyLCByb2xlRGVzY1dyYXBwZXIuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRUZWFtUHJvZmlsZXMoUm9sZURlc2NyaXB0b3Igcm9sZURlc2MsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQocm9sZURlc2MsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXJldHVybiBnZXRUZWFtUHJvZmlsZXMocm9sZURlc2MsIGFkYXB0ZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldENoaWxkRWxlbWVudHMoQWN0aXZpdHkgYWN0LCBDbGFzcyB0eXBlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJZm9yIChpbnQgaSA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmdldChpKTsKLQkJCWlmKHR5cGUuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCWNvbGxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJfQotCQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlnZXRDaGlsZEVsZW1lbnRzKChBY3Rpdml0eSkgZWxlbWVudCwgdHlwZSwgY29sbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJRmlsdGVyIGdldEZpbHRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlBZGFwdGVyRmFjdG9yeSByb290QWRhcHRlckZhY3RvcnkgPSBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmKHJvb3RBZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCXJldHVybiAoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnkpcm9vdEFkYXB0ZXJGYWN0b3J5KS5nZXRGaWx0ZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgY2FsY3VsYXRlZCBsaXN0IG9mIGFydGlmYWN0IGNvbnRhaW5lZCBieSB0aGUgZ2l2ZW4gYXJ0aWZhY3QgYmFzZWQgb24gdGhlCi0JICogY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gYXJ0aWZhY3QKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldENvbnRhaW5lZEFydGlmYWN0cyhBcnRpZmFjdCBhcnRpZmFjdCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCQlJRmlsdGVyIGZpbHRlciA9IFByb2Nlc3NVdGlsLmdldEZpbHRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLQkJCWNvbmZpZyA9ICgoSUNvbmZpZ3VyYXRvcilmaWx0ZXIpLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJfQotCQkKLQkJaWYoY29uZmlnID09IG51bGwpIHsKLQkJCXJldHVybiBhcnRpZmFjdC5nZXRDb250YWluZWRBcnRpZmFjdHMoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAoTGlzdCkgUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkuZ2V0UmVmZXJlbmNlKAotCQkJCQlhcnRpZmFjdCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCksCi0JCQkJCWNvbmZpZyk7Ci0JCX0JCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q29udGFpbmVkQXJ0aWZhY3RzRGVzY3JpcHRvcnMoV29ya1Byb2R1Y3REZXNjcmlwdG9yIGFydGlmYWN0RGVzYywgTGlzdCBhcnRpZmFjdERlc2NyaXB0b3JzKSB7Ci0JCWlmKGFydGlmYWN0RGVzY3JpcHRvcnMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgYXJ0aWZhY3REZXNjLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQotCQkvLyBjb2xsZWN0IG93biBhbmQgY29udHJpYnV0aW5nIHN1YmFydGlmYWN0IGRlc2NyaXB0b3JzCi0JCS8vCi0JCUFycmF5TGlzdCBjb250YWluZWREZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yKGludCBpID0gYXJ0aWZhY3REZXNjcmlwdG9ycy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKWFydGlmYWN0RGVzY3JpcHRvcnMuZ2V0KGkpKTsKLQkJCVdvcmtQcm9kdWN0IGEgPSB3cGQuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCWlmKGEgIT0gbnVsbCkgewotCQkJCUVPYmplY3QgY29udGFpbmVyID0gYS5lQ29udGFpbmVyKCk7Ci0JCQkJaWYoY29udGFpbmVyID09IGFydGlmYWN0IHx8IAotCQkJCQkJKGNvbnRhaW5lciBpbnN0YW5jZW9mIEFydGlmYWN0ICYmIFRuZ1V0aWwuaXNDb250cmlidXRvck9mKGFydGlmYWN0LCAoQXJ0aWZhY3QpIGNvbnRhaW5lcikpKSB7Ci0JCQkJCWNvbnRhaW5lZERlc2NyaXB0b3JzLmFkZCh3cGQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGFpbmVkRGVzY3JpcHRvcnM7Ci0JfQotCQotLy8JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udGFpbmVkQnkoQXJ0aWZhY3QgcGFyZW50LCBBcnRpZmFjdCBjaGlsZCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLS8vCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0vLwkJSUZpbHRlciBmaWx0ZXIgPSBQcm9jZXNzVXRpbC5nZXRGaWx0ZXIoYWRhcHRlckZhY3RvcnkpOwotLy8JCWlmKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLS8vCQkJY29uZmlnID0gKChJQ29uZmlndXJhdG9yKWZpbHRlcikuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotLy8JCX0KLS8vCQkKLS8vCQlpZihjb25maWcgPT0gbnVsbCkgewotLy8JCQlyZXR1cm4gVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KGNoaWxkLCBwYXJlbnQpOwotLy8JCX0KLS8vCQkKLS8vCQlmaW5hbCBNZXRob2RDb25maWd1cmF0aW9uIGNmZyA9IGNvbmZpZzsJCQotLy8JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IocGFyZW50LCBmYWxzZSkgewotLy8KLS8vCQkJLyoqCi0vLwkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0vLwkJCSAqLwotLy8JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLS8vCi0vLwkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0vLwkJCQlyZXR1cm4gKChDb2xsZWN0aW9uKSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5nZXRSZWZlcmVuY2UoCi0vLwkJCQkJCShWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLS8vCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCksCi0vLwkJCQkJCWNmZykpLml0ZXJhdG9yKCk7Ci0vLwkJCX0KLS8vCQkJCi0vLwkJfTsKLS8vCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotLy8JCQlpZihjaGlsZCA9PSBpdGVyLm5leHQoKSkgewotLy8JCQkJcmV0dXJuIHRydWU7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJCi0vLwkJcmV0dXJuIGZhbHNlOwotLy8JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gV29ya1Byb2R1Y3REZXNjcmlwdG9yIDxjb2RlPnBhcmVudDwvY29kZT4gY2FuIHJlcHJlc2VudCB0aGUgcGFyZW50IG9mIHRoZSBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkgKiA8Y29kZT5jaGlsZDwvY29kZT4gYmFzZWQgb24gdGhlIHJlbGF0aW9uc2hpcCBvZiB0aGVpciBsaW5rZWQgYXJ0aWZhY3QgYW5kIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBhcnRpZmFjdCBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRhaW5lZEJ5KFdvcmtQcm9kdWN0RGVzY3JpcHRvciBwYXJlbnQsIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBjaGlsZCwgZmluYWwgTGlzdCBhcnRpZmFjdERlc2NMaXN0KSB7Ci0vLwkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihwYXJlbnQsIGZhbHNlKSB7Ci0vLwkJCQotLy8JCQkvKioKLS8vCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLS8vCQkJICovCi0vLwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotLy8JCQkKLS8vCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLS8vCQkJCXJldHVybiBnZXRDb250YWluZWRBcnRpZmFjdHNEZXNjcmlwdG9ycygoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmplY3QsIGFydGlmYWN0RGVzY0xpc3QpLml0ZXJhdG9yKCk7Ci0vLwkJCX0KLS8vCQkJCi0vLwkJfTsKLS8vCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotLy8JCQlpZihjaGlsZCA9PSBpdGVyLm5leHQoKSkgewotLy8JCQkJcmV0dXJuIHRydWU7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJCi0vLwkJcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIFVtYVV0aWwuaXNDb250YWluZWRCeShjaGlsZC5nZXRXb3JrUHJvZHVjdCgpLCBwYXJlbnQuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihmaW5hbCBDb2xsZWN0aW9uIGNoaWxkcmVuLCBib29sZWFuIHVud3JhcCkgewotCQlMaXN0IGFydGlmYWN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkJLy8gZ2V0IHRoZSBhcnRpZmFjdCBsaXN0Ci0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZih1bndyYXApIHsKLQkJCQljaGlsZCA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCX0KLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0IHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGNoaWxkKQotCQkJCQkJLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJaWYgKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJYXJ0aWZhY3RMaXN0LmFkZCh3cCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCi0JCS8vIHByb2Nlc3MgdGhlIGFydGlmYWN0IGxpc3QgdG8gZ2V0IHRoZSB0b3AtbW9zdCBvbmVzCi0JCS8vCi0JCVNldCB0b3BNb3N0QXJ0aWZhY3RzID0gbmV3IEhhc2hTZXQoKTsKLQkJQXJ0aWZhY3QgY2FuZGlkYXRlID0gbnVsbDsKLQkKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQl3aGlsZSAoIWFydGlmYWN0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCQotCQkJaWYgKCFmb3VuZCkKLQkJCXsKLQkJCQljYW5kaWRhdGUgPSAoQXJ0aWZhY3QpIGFydGlmYWN0TGlzdC5nZXQoMCk7Ci0JCQkJYXJ0aWZhY3RMaXN0LnJlbW92ZSgwKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFydGlmYWN0TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgaXRlci5uZXh0KCk7Ci0JCQkJZm91bmQgPSBmYWxzZTsKLQkJCQkvLyBpZihjYW5kaWRhdGUuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkuY29udGFpbnMoYXJ0aWZhY3QpKSB7Ci0JCQkJaWYgKFVtYVV0aWwuaXNDb250YWluZWRCeShhcnRpZmFjdCwgY2FuZGlkYXRlKSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCQllbHNlIGlmIChVbWFVdGlsLmlzQ29udGFpbmVkQnkoY2FuZGlkYXRlLCBhcnRpZmFjdCkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJY2FuZGlkYXRlID0gYXJ0aWZhY3Q7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmb3VuZCB8fCBhcnRpZmFjdExpc3QuaXNFbXB0eSgpKQotCQkJCXRvcE1vc3RBcnRpZmFjdHMuYWRkKGNhbmRpZGF0ZSk7Ci0JCQllbHNlIGlmIChhcnRpZmFjdExpc3QuaXNFbXB0eSgpKQotCQkJCQl0b3BNb3N0QXJ0aWZhY3RzLmFkZChjYW5kaWRhdGUpOwkJCi0JCX0KLQkKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgY2kgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBjaS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBjaS5uZXh0KCk7Ci0JCQlPYmplY3QgZSA9IHVud3JhcCA/IFRuZ1V0aWwudW53cmFwKGNoaWxkKSA6IGNoaWxkOwotCQkJYm9vbGVhbiBzZWxlY3RlZCA9IGZhbHNlOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGUpOwotCQkJCVdvcmtQcm9kdWN0IHdwID0gd3BkLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJaWYgKCEod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkpIHsKLQkJCQkJc2VsZWN0ZWQgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAodG9wTW9zdEFydGlmYWN0cy5jb250YWlucyh3cCkpIHsKLQkJCQkJc2VsZWN0ZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0ZWQgPSB0cnVlOwotCQkJfQotCQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQkJcmVzdWx0LmFkZChjaGlsZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBoZWxwcyBidWlsZCB0aGUgYXJ0aWZhY3QgZGVzY3JpcHRvciB0cmVlIGNvcnJlY3RseQotCSAqIAotCSAqIEBwYXJhbSBjaGlsZHJlbgotCSAqIEBwYXJhbSB1bndyYXAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihmaW5hbCBDb2xsZWN0aW9uIGNoaWxkcmVuLCBib29sZWFuIHVud3JhcCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJTGlzdCBhcnRpZmFjdERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIGdldCB0aGUgYXJ0aWZhY3QgbGlzdAotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYodW53cmFwKSB7Ci0JCQkJY2hpbGQgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQl9Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdCB3cCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBjaGlsZCkKLQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCWlmICh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCWFydGlmYWN0RGVzY0xpc3QuYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZihhcnRpZmFjdERlc2NMaXN0LmlzRW1wdHkoKSkgewotCQkJaWYoY2hpbGRyZW4gaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJcmV0dXJuIChMaXN0KSBjaGlsZHJlbjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KGNoaWxkcmVuKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gcHJvY2VzcyB0aGUgYXJ0aWZhY3QgbGlzdCB0byBnZXQgdGhlIHRvcC1tb3N0IG9uZXMKLQkJLy8KLQkJU2V0IHRvcE1vc3RBcnRpZmFjdERlc2NMaXN0ID0gbmV3IEhhc2hTZXQoKTsKLQkJTGlzdCBhcnRpZmFjdERlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdChhcnRpZmFjdERlc2NMaXN0KTsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGNhbmRpZGF0ZSA9IG51bGw7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJd2hpbGUgKCFhcnRpZmFjdERlc2NMaXN0LmlzRW1wdHkoKSkgewotCQkJCi0JCQlpZiAoIWZvdW5kKQotCQkJewotCQkJCWNhbmRpZGF0ZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGFydGlmYWN0RGVzY0xpc3QuZ2V0KDApOwotCQkJCWFydGlmYWN0RGVzY0xpc3QucmVtb3ZlKDApOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXJ0aWZhY3REZXNjTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgYXJ0aWZhY3REZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJZm91bmQgPSBmYWxzZTsKLQkJCQlpZiAoUHJvY2Vzc1V0aWwuaXNDb250YWluZWRCeShjYW5kaWRhdGUsIGFydGlmYWN0RGVzYywgYXJ0aWZhY3REZXNjcmlwdG9ycykpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoUHJvY2Vzc1V0aWwuaXNDb250YWluZWRCeShhcnRpZmFjdERlc2MsIGNhbmRpZGF0ZSwgYXJ0aWZhY3REZXNjcmlwdG9ycykpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJY2FuZGlkYXRlID0gYXJ0aWZhY3REZXNjOwotCi0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmb3VuZCB8fCBhcnRpZmFjdERlc2NMaXN0LmlzRW1wdHkoKSkKLQkJCQl0b3BNb3N0QXJ0aWZhY3REZXNjTGlzdC5hZGQoY2FuZGlkYXRlKTsKLQkJCWVsc2UgaWYgKGFydGlmYWN0RGVzY0xpc3QuaXNFbXB0eSgpKQotCQkJCQl0b3BNb3N0QXJ0aWZhY3REZXNjTGlzdC5hZGQoY2FuZGlkYXRlKTsJCQotCQl9Ci0KLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgY2kgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBjaS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBjaS5uZXh0KCk7Ci0JCQlPYmplY3QgZSA9IHVud3JhcCA/IFRuZ1V0aWwudW53cmFwKGNoaWxkKSA6IGNoaWxkOwotCQkJYm9vbGVhbiBzZWxlY3RlZCA9IGZhbHNlOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGUpOwotCQkJCVdvcmtQcm9kdWN0IHdwID0gd3BkLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJaWYgKCEod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkpIHsKLQkJCQkJc2VsZWN0ZWQgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAodG9wTW9zdEFydGlmYWN0RGVzY0xpc3QuY29udGFpbnMod3BkKSkgewotCQkJCQlzZWxlY3RlZCA9IHRydWU7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3RlZCA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCQlyZXN1bHQuYWRkKGNoaWxkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHkgZmluZEFjdGl2aXR5KFByb2Nlc3NQYWNrYWdlIHByb2NQYWNrYWdlKSB7Ci0JCWlmKHByb2NQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0NvbXBvbmVudClwcm9jUGFja2FnZSkuZ2V0UHJvY2VzcygpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9jUGFja2FnZQotCQkJCS5nZXRQcm9jZXNzRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlyZXR1cm4gKChBY3Rpdml0eSkgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZml4QnJlYWtkb253RWxlbWVudE9yZGVyUmVjdXJzaXZlbHkoQWN0aXZpdHkgYWN0KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoYWN0KSB7Ci0KLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzM2ODI2MTY4NTY2MzM1NDQ3OEw7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJQXJyYXlMaXN0IGFjdGl2aXRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoQWN0aXZpdHkpb2JqZWN0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlhY3Rpdml0aWVzLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gYWN0aXZpdGllcy5pdGVyYXRvcigpOwotCQkJfQotCQkJCi0JCX07Ci0JCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlmaXhCcmVha2Rvd25FbGVtZW50T3JkZXIoKEFjdGl2aXR5KWl0ZXIubmV4dCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaXhCcmVha2Rvd25FbGVtZW50T3JkZXIoQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJRUxpc3QgbGlzdCA9IChFTGlzdCkgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChsaXN0KS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCUJyZWFrZG93bkVsZW1lbnQgc3VjYyA9IGUuZ2V0UHJlc2VudGVkQWZ0ZXIoKTsKLQkJCWlmKHN1Y2MgIT0gbnVsbCAmJiBzdWNjICE9IGUpIHsKLQkJCQlpbnQgc3VjY0lkID0gbGlzdC5pbmRleE9mKHN1Y2MpOwotCQkJCWlmKHN1Y2NJZCAhPSAtMSkgewotCQkJCQlpbnQgaWQgPSBsaXN0LmluZGV4T2YoZSk7Ci0JCQkJCWlmKGlkICE9IHN1Y2NJZCAtIDEpIHsKLQkJCQkJCWlmKGlkIDwgc3VjY0lkKSB7Ci0JCQkJCQkJbGlzdC5tb3ZlKHN1Y2NJZCAtIDEsIGlkKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWxpc3QubW92ZShzdWNjSWQsIGlkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllLnNldFByZXNlbnRlZEFmdGVyKG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGl0ZW0gcHJvdmlkZXIgcGF0aCBvZiB0aGUgZ2l2ZW4gYWN0aXZpdHksIHRoZSBwYXRoIGZyb20gdG9wIHByb2Nlc3MgdG8gdGhlIGFjdGl2aXR5Ci0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVJdGVtUHJvdmlkZXJQYXRoKEFjdGl2aXR5IGFjdGl2aXR5LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQkvLyBnZXQgdGhlIGFjdGl2aXR5IHBhdGgKLQkJLy8KLQkJQXJyYXlMaXN0IGFjdFBhdGggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvcihhY3Rpdml0eSA9IGFjdGl2aXR5LmdldFN1cGVyQWN0aXZpdGllcygpOyBhY3Rpdml0eSAhPSBudWxsOyBhY3Rpdml0eSA9IGFjdGl2aXR5LmdldFN1cGVyQWN0aXZpdGllcygpKSB7Ci0JCQlhY3RQYXRoLmFkZCgwLCBhY3Rpdml0eSk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0UGF0aC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBhY3QgPSBpdGVyLm5leHQoKTsKLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpcCA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGFjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlwLmdldENoaWxkcmVuKGFjdCk7Ci0JCX0KLQl9CQkKLQotCS8qKgotCSAqIENoZWNrIGlmIHRoZSBnaXZlbiBhY3Rpdml0eSBvciBhbnkgb2YgaXRzIHN1YmFjdGl2aXRpZXMgaXMgYSBjb250cmlidXRvciBvciByZXBsYWNlcgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ29udHJpYnV0b3JPclJlcGxhY2VyKEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoYWN0aXZpdHkpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwTDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAoKEFjdGl2aXR5KW9iamVjdCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJCi0JCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJVmFyaWFiaWxpdHlUeXBlIHZUeXBlID0gdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQlpZihiYXNlICE9IG51bGwgJiYgKHZUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFU19MSVRFUkFMIHx8IHZUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFU19MSVRFUkFMKSkgewotLy8JCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBiYXNlKTsKLS8vCQkJCWlmKHByb2MgIT0gcHJvY2VzcykgewotLy8JCQkJCXJldHVybiB0cnVlOwotLy8JCQkJfQotCQkJCQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQkKLQkKLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RvcFByb2Nlc3MoT2JqZWN0IHRhcmdldCkgewotCQlyZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgUHJvY2VzcyAmJiAoKFByb2Nlc3MpdGFyZ2V0KS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB3cERlc2NMaXN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcihDb2xsZWN0aW9uIGVsZW1lbnRzLCBXb3JrUHJvZHVjdCB3cCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZihlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKWUpOwotCQkJCWlmKHdwZC5nZXRXb3JrUHJvZHVjdCgpID09IHdwKSB7Ci0JCQkJCXJldHVybiB3cGQ7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhc2tEZXNjTGlzdAotCSAqIEBwYXJhbSB0YXNrCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGFza0Rlc2NyaXB0b3IgZ2V0VGFza0Rlc2NyaXB0b3IoQ29sbGVjdGlvbiBlbGVtZW50cywgVGFzayB0YXNrKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBlOwotCQkJCWlmKHRkLmdldFRhc2soKSA9PSB0YXNrKSB7Ci0JCQkJCXJldHVybiB0ZDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgb3duaW5nIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgb2YgYSB3b3JrIG9yZGVyLgotCSAqIAotCSAqIEBwYXJhbSB3b3JrT3JkZXIKLQkgKiAgICAgICAgICAgIGEgd29yayBvcmRlcgotCSAqIEByZXR1cm4gYSB3b3JrIGJyZWFrZG93biBlbGVtZW50IHRoYXQgb3ducyB0aGUgd29yayBvcmRlciBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtCcmVha2Rvd25FbGVtZW50IGdldE93bmVyKFdvcmtPcmRlciB3b3JrT3JkZXIpIHsKLQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldFN1Y2Nlc3Nvcih3b3JrT3JkZXIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBnZXRDb21wb3NlZFdyYXBwZXIoT2JqZWN0IG9iamVjdCkgewotCQl3aGlsZSghKG9iamVjdCBpbnN0YW5jZW9mIENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpCi0JCQkJJiYgb2JqZWN0IGluc3RhbmNlb2YgSVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCW9iamVjdCA9ICgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpb2JqZWN0KS5nZXRWYWx1ZSgpOwotCQl9Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiAoQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoZSBnaXZlbiBicmVha2Rvd24gc3RydWN0dXJlIGNvbHVtbiBJRC4gVGhlCi0JICogYnJlYWtkb3duIHN0cnVjdHVyZSBjb2x1bW4gSURzIGFyZSBkZWZpbmVkIGFzIGNvbnN0YW50cyBpbgotCSAqIHtAbGluayBJQlNJdGVtUHJvdmlkZXJ9IHRoYXQgc3RhcnQgd2l0aCBDT0xfCi0JICogCi0JICogQHBhcmFtIGNvbHVtbk5hbWUKLQkgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgY29sdW1ucyBJRCBjb25zdGFudHMgKENPTF9YWFgpIGRlZmluZWQgaW4KLQkgKiAgICAgICAgICAgIHtAbGluayBJQlNJdGVtUHJvdmlkZXJ9Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldENvbHVtbkRpc3BsYXlOYW1lKFN0cmluZyBjb2x1bW5JZCkgewotCQl0cnkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiQlNfQ29sdW1uXyIgKyBjb2x1bW5JZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBjb2x1bW5JZDsKLQl9Ci0JCi0JCi0JLyoqCi0JICogR2V0IGxpc3Qgb2YgdGFzayBkZXNjcmlwdG9ycyB1bmRlciBzZWxlY3RlZCBhY3Rpdml0aWVzCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0VGFza0Rlc2NyaXB0b3JzKExpc3Qgc2VsZWN0aW9uKSB7Ci0JCUxpc3QgdGFza0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlFeHBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSAoRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgaXRvck9iaiA9IGl0b3IubmV4dCgpOwotCQkJaWYgKGl0b3JPYmogaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQl8fCBpdG9yT2JqIGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJZ2V0VGFza0Rlc2NyaXB0b3JzKGFkYXB0ZXJGYWN0b3J5LCBpdG9yT2JqLCB0YXNrRGVzY3JpcHRvcnMpOwotCQkJfQotCQkJaWYgKGl0b3JPYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcgotCQkJCQl8fCBpdG9yT2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJaWYgKCF0YXNrRGVzY3JpcHRvcnMuY29udGFpbnMoaXRvck9iaikpCi0JCQkJCXRhc2tEZXNjcmlwdG9ycy5hZGQoaXRvck9iaik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRhc2tEZXNjcmlwdG9yczsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRUYXNrRGVzY3JpcHRvcnMoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIE9iamVjdCBhY3QsCi0JCQlMaXN0IHRhc2tEZXNjcmlwdG9ycykgewotCQlPYmplY3QgbGlzdCA9IG51bGw7Ci0JCWlmIChhY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChhY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkvLyBnZXQgY2hpbGRyZW4KLQkJCWxpc3QgPSBhZGFwdGVyLmdldENoaWxkcmVuKGFjdCk7Ci0JCX0gZWxzZSBpZiAoYWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlsaXN0ID0gKChXcmFwcGVySXRlbVByb3ZpZGVyKSBhY3QpLmdldENoaWxkcmVuKGFjdCk7Ci0JCX0KLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0IGluc3RhbmNlb2YgTGlzdCkgewotCQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBsaXN0OwotCQkJZm9yIChJdGVyYXRvciBjaGlsZEl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBjaGlsZEl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBjaGlsZEl0ZXIubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBvYmogaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJZ2V0VGFza0Rlc2NyaXB0b3JzKGFkYXB0ZXJGYWN0b3J5LCBvYmosIHRhc2tEZXNjcmlwdG9ycyk7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcgotCQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWlmICghdGFza0Rlc2NyaXB0b3JzLmNvbnRhaW5zKG9iaikpCi0JCQkJCQl0YXNrRGVzY3JpcHRvcnMuYWRkKG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1NlY3Rpb25MaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9TZWN0aW9uTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMzVlOWNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1NlY3Rpb25MaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm9Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC51dGlsLlN0cmluZ1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIAotICogVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgYWxsIHRoZSBsb2dpY3MgdXNlZCB0byByZXRyaWV2ZSB0aGUgbGlzdCBvZiBhbGwKLSAqIGNvbnRyaWJ1dGVkL2luaGVyaXRlZCBzZWN0aW9ucyBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBhcyB3ZWxsIGFzIGFsbG93cwotICogbWFuaXB1bGF0ZSB0aGlzIGxpc3QuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN0aW9uTGlzdCBleHRlbmRzIEJhc2ljRUxpc3QgewotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1NzU3Mjc5NzQ4NzA2OTIzM0w7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JERVJfSU5GT19OQU1FID0gInNlY3Rpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIERFRkFVTFRfU0FWRV9PUFRJT05TID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNURVBTX0ZPUl9FTEVNRU5UX09OTFkgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RFUFNfRk9SX0VMRU1FTlRfQU5EX1BBUkVOVFMgPSAyOwotCi0Jc3RhdGljIHsKLQkJREVGQVVMVF9TQVZFX09QVElPTlMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgIkFTQ0lJIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIENvbnRlbnRFbGVtZW50IGVkaXRFbGVtZW50OwotCi0JcHJpdmF0ZSBib29sZWFuIG1peGVkID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ29udHJpYnV0b3IoVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuaXNDb250cmlidXRvcihlKTsKLQl9Ci0KLQlwdWJsaWMgU2VjdGlvbkxpc3QoQ29udGVudEVsZW1lbnQgZSwgaW50IHNjb3BlKSB7Ci0JCWVkaXRFbGVtZW50ID0gZTsKLQkJaWYgKHNjb3BlID09IFNURVBTX0ZPUl9FTEVNRU5UX09OTFkpIHsKLQkJCW1peGVkID0gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoc2NvcGUgPT0gU1RFUFNfRk9SX0VMRU1FTlRfQU5EX1BBUkVOVFMpIHsKLQkJCWNhbGN1bGF0ZVBhcmVudHNPbmx5KGUpOwotCQl9IGVsc2UgewotCQkJbWl4ZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVQYXJlbnRzT25seShDb250ZW50RWxlbWVudCBlKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBudWxsOwotCQkvLyBpZihpc0NvbnRyaWJ1dG9yKGUpKSB7Ci0JCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGZvciAiICsgZS5nZXROYW1lKCkgKyAiID0gY29udHJpYnV0aW5nIGlzCi0JCS8vIHRydWUiKTsKLQkJLy8gTGlzdCBzdXBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIFVtYVV0aWwuZ2V0QWxsU3VwZXJzKHN1cGVycywgZSwgVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwpOwotCQkvLyBzdXBlcnMuYWRkKGUpOwotCQkvLyBpdGVyID0gc3VwZXJzLml0ZXJhdG9yKCk7Ci0JCS8vIH0gZWxzZSBpZihpc0V4dGVuZGVkKGUpKSB7Ci0JCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGZvciAiICsgZS5nZXROYW1lKCkgKyAiID0gZXh0ZW5kaW5nIGlzCi0JCS8vIHRydWUiKTsKLQkJLy8gTGlzdCBzdXBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIFVtYVV0aWwuZ2V0QWxsU3VwZXJzKHN1cGVycywgZSwgVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCk7Ci0JCS8vIHN1cGVycy5hZGQoZSk7Ci0JCS8vIGl0ZXIgPSBzdXBlcnMuaXRlcmF0b3IoKTsKLQkJLy8gfQotCQlpZiAoaXNDb250cmlidXRvcihlKSB8fCBpc0V4dGVuZGVkKGUpKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBmb3IgIiArIGUuZ2V0TmFtZSgpICsgIiA9IGNvbnRyaWJ1dGluZyBpcwotCQkJLy8gdHJ1ZSIpOwotCQkJTGlzdCBzdXBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlVbWFVdGlsLmdldEFsbFN1cGVyc0JvdGgoc3VwZXJzLCBlLAotCQkJCQlWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCwKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCk7Ci0JCQlzdXBlcnMuYWRkKGUpOwotCQkJaXRlciA9IHN1cGVycy5pdGVyYXRvcigpOwotCQl9IGVsc2UgewotCQkJbWl4ZWQgPSBmYWxzZTsKLQkJfQotCi0JCWlmIChtaXhlZCkgewotCQkJLy8gY3JlYXRlIGEgbWFwIG9mIEdVSUQgLyBjb250cmlidXRvcgotCQkJLy8KLQkJCU9yZGVySW5mbyBsYXRlc3RJbmZvID0gbnVsbDsKLQkJCU1hcCBndWlkU2VjdGlvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlTZXQgc2VjdHMgPSBuZXcgSGFzaFNldCgpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJQ29udGVudEVsZW1lbnQgZWxlbWVudCA9IChDb250ZW50RWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKGVsZW1lbnQpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmdldFByZXNlbnRhdGlvbigpCi0JCQkJCQkJLmdldFNlY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJU2VjdGlvbiBzZWN0ID0gKFNlY3Rpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWd1aWRTZWN0aW9uTWFwLnB1dChzZWN0LmdldEd1aWQoKSwgc2VjdCk7Ci0JCQkJCQlzZWN0cy5hZGQoc2VjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJT3JkZXJJbmZvIG9yZGVySW5mbyA9IFRuZ1V0aWwuZ2V0T3JkZXJJbmZvKGVsZW1lbnQsCi0JCQkJCQlPUkRFUl9JTkZPX05BTUUpOwotCQkJCWlmIChvcmRlckluZm8gIT0gbnVsbCkgewotCQkJCQlpZiAobGF0ZXN0SW5mbyA9PSBudWxsCi0JCQkJCQkJfHwgb3JkZXJJbmZvLmdldFRpbWVzdGFtcCgpID4gbGF0ZXN0SW5mbwotCQkJCQkJCQkJLmdldFRpbWVzdGFtcCgpKSB7Ci0JCQkJCQlsYXRlc3RJbmZvID0gb3JkZXJJbmZvOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobGF0ZXN0SW5mbyAhPSBudWxsKSB7Ci0JCQkJLy8gcmVvcmRlciB0aGUgc2VjdGlvbnMgYmFzZWQgb24gdGhlIGxhdGVzdCBvcmRlciBpbmZvCi0JCQkJLy8KLQkJCQlpbnQgc2l6ZSA9IGxhdGVzdEluZm8uZ2V0R1VJRHMoKS5zaXplKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJT2JqZWN0IGd1aWQgPSBsYXRlc3RJbmZvLmdldEdVSURzKCkuZ2V0KGkpOwotCQkJCQlPYmplY3Qgc2VjdCA9IGd1aWRTZWN0aW9uTWFwLmdldChndWlkKTsKLQkJCQkJaWYgKHNlY3QgIT0gbnVsbCkgewotCQkJCQkJc3VwZXIuYWRkKHNlY3QpOwotCQkJCQkJc2VjdHMucmVtb3ZlKHNlY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc3VwZXIuYWRkQWxsKHNlY3RzKTsKLQkJfQotCX0KLQotCS8vIGRlcHJlY2F0ZSB0aGUgZm9sbG93aW5nIGNvbnN0cnVjdG9yCi0JcHVibGljIFNlY3Rpb25MaXN0KENvbnRlbnRFbGVtZW50IGUpIHsKLQkJZWRpdEVsZW1lbnQgPSBlOwotCQlJdGVyYXRvciBpdGVyID0gbnVsbDsKLQkJaWYgKGlzQ29udHJpYnV0b3IoZSkgfHwgVG5nVXRpbC5oYXNDb250cmlidXRvcihlKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBUbmdVdGlsLmdldEJhc2UoZSk7Ci0JCQlpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGJhc2UpIHsKLQotCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0KQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXJhdG9yCi0JCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQlpZiAoZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCkgewotCQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCX0gZWxzZSBpZiAoaXNFeHRlbmRlZChlKSkgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiJCQkIGZvciAiICsgZS5nZXROYW1lKCkgKyAiID0gZXh0ZW5kZWQgaXMgdHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUxpc3Qgc3VwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJVW1hVXRpbC5nZXRBbGxTdXBlcnMoc3VwZXJzLCBlLCBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKTsKLQkJCXN1cGVycy5hZGQoZSk7Ci0JCQlpdGVyID0gc3VwZXJzLml0ZXJhdG9yKCk7Ci0JCX0gZWxzZSB7Ci0JCQltaXhlZCA9IGZhbHNlOwotCQl9Ci0KLQkJaWYgKG1peGVkKSB7Ci0JCQkvLyBjcmVhdGUgYSBtYXAgb2YgR1VJRCAvIGNvbnRyaWJ1dG9yCi0JCQkvLwotCQkJT3JkZXJJbmZvIGxhdGVzdEluZm8gPSBudWxsOwotCQkJTWFwIGd1aWRTZWN0aW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCUxpc3Qgc2VjdHMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJQ29udGVudEVsZW1lbnQgZWxlbWVudCA9IChDb250ZW50RWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKGVsZW1lbnQpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmdldFByZXNlbnRhdGlvbigpCi0JCQkJCQkJLmdldFNlY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJU2VjdGlvbiBzZWN0ID0gKFNlY3Rpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWd1aWRTZWN0aW9uTWFwLnB1dChzZWN0LmdldEd1aWQoKSwgc2VjdCk7Ci0JCQkJCQlzZWN0cy5hZGQoc2VjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJT3JkZXJJbmZvIG9yZGVySW5mbyA9IFRuZ1V0aWwuZ2V0T3JkZXJJbmZvKGVsZW1lbnQsCi0JCQkJCQlPUkRFUl9JTkZPX05BTUUpOwotCQkJCWlmIChvcmRlckluZm8gIT0gbnVsbCkgewotCQkJCQlpZiAobGF0ZXN0SW5mbyA9PSBudWxsCi0JCQkJCQkJfHwgb3JkZXJJbmZvLmdldFRpbWVzdGFtcCgpID4gbGF0ZXN0SW5mbwotCQkJCQkJCQkJLmdldFRpbWVzdGFtcCgpKSB7Ci0JCQkJCQlsYXRlc3RJbmZvID0gb3JkZXJJbmZvOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobGF0ZXN0SW5mbyAhPSBudWxsKSB7Ci0JCQkJLy8gcmVvcmRlciB0aGUgc2VjdGlvbnMgYmFzZWQgb24gdGhlIGxhdGVzdCBvcmRlciBpbmZvCi0JCQkJLy8KLQkJCQlpbnQgc2l6ZSA9IGxhdGVzdEluZm8uZ2V0R1VJRHMoKS5zaXplKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJT2JqZWN0IGd1aWQgPSBsYXRlc3RJbmZvLmdldEdVSURzKCkuZ2V0KGkpOwotCQkJCQlPYmplY3Qgc2VjdCA9IGd1aWRTZWN0aW9uTWFwLmdldChndWlkKTsKLQkJCQkJaWYgKHNlY3QgIT0gbnVsbCkgewotCQkJCQkJc3VwZXIuYWRkKHNlY3QpOwotCQkJCQkJc2VjdHMucmVtb3ZlKHNlY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc3VwZXIuYWRkQWxsKHNlY3RzKTsKLQkJfQotCQkvLyBlbHNlIHsKLQkJLy8gLy8gYWRkQWxsKGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkpOwotCQkvLyBtaXhlZCA9IGZhbHNlOwotCQkvLyB9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0V4dGVuZGVkKENvbnRlbnRFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiBlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUw7Ci0JfQotCi0JLyoqCi0JICogQXBwbGllcyByZWNlbnQgY2hhbmdlcyBpbiB0aGUgbGlzdAotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KCkgewotCQlpZiAoIW1peGVkIHx8ICFjaGFuZ2VkKQotCQkJcmV0dXJuOwotCi0JCS8vIHNhdmUgdGhlIG9yZGVyIGluZm8gdG8gdGhlIG9yZGVyaW5nR3VpZGUgb2YgdGhlIGVkaXRFbGVtZW50Ci0JCS8vCi0JCVN0cmluZyBzdHIgPSBlZGl0RWxlbWVudC5nZXRPcmRlcmluZ0d1aWRlKCk7Ci0JCU9yZGVySW5mb0NvbGxlY3Rpb24gb3JkZXJJbmZvcyA9IG51bGw7Ci0JCVN0cmluZ1Jlc291cmNlIHJlcyA9IG51bGw7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkgewotCQkJb3JkZXJJbmZvcyA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3JkZXJJbmZvQ29sbGVjdGlvbigpOwotCQl9IGVsc2UgewotCQkJcmVzID0gbmV3IFN0cmluZ1Jlc291cmNlKHN0cik7Ci0JCQl0cnkgewotCQkJCXJlcy5sb2FkKG51bGwpOwotCQkJCWlmIChyZXMuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCQkJb3JkZXJJbmZvcyA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlT3JkZXJJbmZvQ29sbGVjdGlvbigpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW9yZGVySW5mb3MgPSAoT3JkZXJJbmZvQ29sbGVjdGlvbikgcmVzLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQkJLy8gZmluZCB0aGUgb3JkZXIgaW5mb3IgZm9yIHNlY3Rpb25zCi0JCS8vCi0JCU9yZGVySW5mbyBzZWN0T3JkZXJJbmZvID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb3JkZXJJbmZvcy5nZXRPcmRlckluZm9zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPcmRlckluZm8gb3JkZXJJbmZvID0gKE9yZGVySW5mbykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoT1JERVJfSU5GT19OQU1FLmVxdWFsc0lnbm9yZUNhc2Uob3JkZXJJbmZvLmdldE5hbWUoKSkpIHsKLQkJCQlzZWN0T3JkZXJJbmZvID0gb3JkZXJJbmZvOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKHNlY3RPcmRlckluZm8gPT0gbnVsbCkgewotCQkJc2VjdE9yZGVySW5mbyA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3JkZXJJbmZvKCk7Ci0JCQlzZWN0T3JkZXJJbmZvLnNldE5hbWUoT1JERVJfSU5GT19OQU1FKTsKLQkJCW9yZGVySW5mb3MuZ2V0T3JkZXJJbmZvcygpLmFkZChzZWN0T3JkZXJJbmZvKTsKLQkJfSBlbHNlIHsKLQkJCXNlY3RPcmRlckluZm8uZ2V0R1VJRHMoKS5jbGVhcigpOwotCQl9Ci0KLQkJaW50IHNpemUgPSBzaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlTZWN0aW9uIHNlY3QgPSAoU2VjdGlvbikgZ2V0KGkpOwotCQkJc2VjdE9yZGVySW5mby5nZXRHVUlEcygpLmFkZChzZWN0LmdldEd1aWQoKSk7Ci0JCX0KLQkJc2VjdE9yZGVySW5mby5zZXRUaW1lc3RhbXAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQlpZiAocmVzID09IG51bGwpIHsKLQkJCXJlcyA9IG5ldyBTdHJpbmdSZXNvdXJjZShudWxsKTsKLQkJCXJlcy5nZXRDb250ZW50cygpLmFkZChvcmRlckluZm9zKTsKLQkJfQotCQl0cnkgewotCQkJcmVzLnNhdmUoREVGQVVMVF9TQVZFX09QVElPTlMpOwotCQkJc3RyID0gcmVzLmdldFN0cmluZygpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTZWN0aW9uTGlzdC5hcHBseSgpOiBuZXcgb3JkZXJpbmcgZ3VpZGUiKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tIG9yZGVyaW5nR3VpZGUgc3RhcnQgLS0tLS0tIik7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oc3RyKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tIG9yZGVyaW5nR3VpZGUgZW5kIC0tLS0tLSIpOwotCQkJZWRpdEVsZW1lbnQuc2V0T3JkZXJpbmdHdWlkZShzdHIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZW1vdmUoU2VjdGlvbiBzZWN0aW9uKSB7Ci0JCWlmIChDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihlZGl0RWxlbWVudCkpIHsKLQkJCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSA9PSBzZWN0aW9uLmVDb250YWluZXIoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJaWYgKCFjYW5SZW1vdmUoKFNlY3Rpb24pIGdldChpbmRleCkpKQotCQkJCXJldHVybiBudWxsOwotCQkJT2JqZWN0IHJlbW92ZWQgPSBzdXBlci5yZW1vdmUoaW5kZXgpOwotCQkJZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5yZW1vdmUocmVtb3ZlZCk7Ci0JCQlyZXR1cm4gcmVtb3ZlZDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLnJlbW92ZShpbmRleCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQkJaWYgKCFjYW5SZW1vdmUoKFNlY3Rpb24pIG8pKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobWl4ZWQpIHsKLQkJCWlmIChzdXBlci5yZW1vdmUobykpIHsKLQkJCQllZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLnJlbW92ZShvKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5yZW1vdmUobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gYykgewotCQlpZiAobWl4ZWQpIHsKLQkJCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJCUl0ZXJhdG9yIGUgPSBpdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG8gPSBlLm5leHQoKTsKLQkJCQlpZiAoYy5jb250YWlucyhvKSAmJiBjYW5SZW1vdmUoKFNlY3Rpb24pIG8pKSB7Ci0JCQkJCWUucmVtb3ZlKCk7Ci0JCQkJCWVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkucmVtb3ZlKG8pOwotCQkJCQltb2RpZmllZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG1vZGlmaWVkOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkucmVtb3ZlQWxsKGMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlzdXBlci5hZGQoaW5kZXgsIGVsZW1lbnQpOwotCQkJZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5hZGQoZWxlbWVudCk7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCWVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuYWRkKGluZGV4LCBlbGVtZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykgewotCQlib29sZWFuIGIgPSBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmFkZChvKTsKLQkJaWYgKG1peGVkKSB7Ci0JCQliID0gc3VwZXIuYWRkKG8pOwotCQkJaWYgKGIpCi0JCQkJY2hhbmdlZCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gYykgewotCQlib29sZWFuIGIgPSBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmFkZEFsbChjKTsKLQkJaWYgKG1peGVkKSB7Ci0JCQliID0gc3VwZXIuYWRkQWxsKGMpOwotCQkJaWYgKGIpCi0JCQkJY2hhbmdlZCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbiBjKSB7Ci0JCWlmIChtaXhlZCkgewotCQkJZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5hZGRBbGwoYyk7Ci0JCQlib29sZWFuIGIgPSBzdXBlci5hZGRBbGwoaW5kZXgsIGMpOwotCQkJaWYgKGIpCi0JCQkJY2hhbmdlZCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuYWRkQWxsKGluZGV4LCBjKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHNldChpbnQgaW5kZXgsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChtaXhlZCkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5zZXQoaW5kZXgsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpZiAobWl4ZWQpCi0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5jbGVhcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmUoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJc3VwZXIubW92ZShpbmRleCwgb2JqZWN0KTsKLQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJKChFTGlzdCkgZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKSkubW92ZShpbmRleCwKLQkJCQkJb2JqZWN0KTsKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgbW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCU9iamVjdCBtb3ZlZCA9IHN1cGVyLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJcmV0dXJuIG1vdmVkOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoRUxpc3QpIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkpLm1vdmUoCi0JCQkJCXRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldChpbnQgaW5kZXgpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0KGluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmdldChpbmRleCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCWlmIChtaXhlZCkgewotCQkJcmV0dXJuIHN1cGVyLnNpemUoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLnNpemUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuaXRlcmF0b3IoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLml0ZXJhdG9yKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJcmV0dXJuIHN1cGVyLmNvbnRhaW5zKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuY29udGFpbnMob2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJaWYgKG1peGVkKQotCQkJcmV0dXJuIHN1cGVyLmNvbnRhaW5zQWxsKGNvbGxlY3Rpb24pOwotCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5jb250YWluc0FsbCgKLQkJCQljb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIudG9BcnJheSgpOwotCQl9Ci0JCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3RbXSBhcnJheSkgewotCQlpZiAobWl4ZWQpCi0JCQlyZXR1cm4gc3VwZXIudG9BcnJheShhcnJheSk7Ci0JCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLnRvQXJyYXkoYXJyYXkpOwotCX0KLQotCXB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChtaXhlZCkKLQkJCXJldHVybiBzdXBlci5pbmRleE9mKG9iamVjdCk7Ci0JCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmluZGV4T2Yob2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG1peGVkKQotCQkJcmV0dXJuIHN1cGVyLmxhc3RJbmRleE9mKG9iamVjdCk7Ci0JCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmxhc3RJbmRleE9mKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNaXhlZCgpIHsKLQkJcmV0dXJuIG1peGVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1N0ZXBMaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9TdGVwTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNTUwZWFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1N0ZXBMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogUmVvcmRlciBzdGVwcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RlcExpc3QgewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU3NTY3MzI1ODQ5ODU4ODcxTDsKLQotCXByaXZhdGUgc3RhdGljIERlc2NyaWJhYmxlRWxlbWVudCBnZXREZXNjcmliYWJsZUVsZW1lbnQoU2VjdGlvbiBzdGVwKSB7Ci0JCXJldHVybiAoRGVzY3JpYmFibGVFbGVtZW50KSBzdGVwLmVDb250YWluZXIoKS5lQ29udGFpbmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBUYXNrIGN1cnJlbnRUYXNrOwotCi0JcHJpdmF0ZSBMaW5rZWRMaXN0IHN0ZXBMaXN0czsKLQotCXB1YmxpYyBTdGVwTGlzdChUYXNrIGN1cnJlbnRUYXNrLCBMaXN0IHN0ZXBMaXN0cykgewotCQl0aGlzLmN1cnJlbnRUYXNrID0gY3VycmVudFRhc2s7Ci0JCXRoaXMuc3RlcExpc3RzID0gbmV3IExpbmtlZExpc3Qoc3RlcExpc3RzKTsKLQkJcmVvcmRlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZW9yZGVyKCkgewotCQlNYXAgb3duZXJTZWN0aW9uc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWludCBzaXplID0gc3RlcExpc3RzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUVjb3JlRUxpc3QgZUxpc3QgPSAoRWNvcmVFTGlzdCkgc3RlcExpc3RzLmdldChpKTsKLQkJCW93bmVyU2VjdGlvbnNNYXAucHV0KGVMaXN0LmdldE5vdGlmaWVyKCksIGVMaXN0KTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KHN0ZXBMaXN0cykuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaXN0IHN0ZXBMaXN0ID0gKExpc3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKCFzdGVwTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlTZWN0aW9uIHN0ZXAgPSAoU2VjdGlvbikgc3RlcExpc3QuZ2V0KDApOwotCQkJCVNlY3Rpb24gcHJlZCA9IHN0ZXAuZ2V0UHJlZGVjZXNzb3IoKTsKLQkJCQlpZiAocHJlZCA9PSBudWxsKSB7Ci0JCQkJCUxpc3Qgb2xkRmlyc3RMaXN0ID0gKExpc3QpIHN0ZXBMaXN0cy5nZXQoMCk7Ci0KLQkJCQkJLy8gcHV0IHRoaXMgc3RlcCBsaXN0IGF0IGJlZ2lubmluZwotCQkJCQkvLwotCQkJCQlzdGVwTGlzdHMucmVtb3ZlKHN0ZXBMaXN0KTsKLQkJCQkJc3RlcExpc3RzLmFkZCgwLCBzdGVwTGlzdCk7Ci0KLQkJCQkJLy8gc2V0IHRoaXMgc3RlcCBsaXN0IHRvIGJlIHRoZSBwcmVkZWNlc3NvciBvZiB0aGUgcHJldmlvdXMKLQkJCQkJLy8gZmlyc3QgbGlzdAotCQkJCQkvLwotCQkJCQlpZiAoIW9sZEZpcnN0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCVNlY3Rpb24gb2xkRmlyc3RTdGVwID0gKFNlY3Rpb24pIG9sZEZpcnN0TGlzdC5nZXQoMCk7Ci0JCQkJCQlpZiAoVG5nVXRpbC5jYW5SZWZlcmVuY2UoCi0JCQkJCQkJCWdldERlc2NyaWJhYmxlRWxlbWVudChvbGRGaXJzdFN0ZXApLAotCQkJCQkJCQlnZXREZXNjcmliYWJsZUVsZW1lbnQoc3RlcCkpKSB7Ci0JCQkJCQkJb2xkRmlyc3RTdGVwLnNldFByZWRlY2Vzc29yKHN0ZXApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTGlzdCBwcmVkTGlzdCA9IChMaXN0KSBvd25lclNlY3Rpb25zTWFwLmdldChwcmVkCi0JCQkJCQkJLmVDb250YWluZXIoKSk7Ci0JCQkJCXN0ZXBMaXN0cy5yZW1vdmUocHJlZExpc3QpOwotCQkJCQlpbnQgaWQgPSBzdGVwTGlzdHMuaW5kZXhPZihzdGVwTGlzdCk7Ci0JCQkJCXN0ZXBMaXN0cy5hZGQoaWQsIHByZWRMaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBwcml2YXRlIHZvaWQgcmVhc3NpZ25QcmVkZWNlc3NvcnMoKSB7Ci0JLy8KLQkvLyB9Ci0KLQlwdWJsaWMgTGlzdCBnZXRTdGVwcygpIHsKLQkJTGlzdCBhbGxTdGVwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW50IHNpemUgPSBzdGVwTGlzdHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTGlzdCBzdGVwcyA9IChMaXN0KSBzdGVwTGlzdHMuZ2V0KGkpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3RlcHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJYWxsU3RlcHMuYWRkKGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWxsU3RlcHM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbW92ZVVwKFNlY3Rpb24gc3RlcCkgewotCQlMaXN0IHN0ZXBzID0gY3VycmVudFRhc2suZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKTsKLQkJaW50IGlkID0gc3RlcHMuaW5kZXhPZihzdGVwKTsKLQkJaWYgKGlkID09IC0xKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoaWQgPiAwKSB7Ci0JCQlpZiAoaWQgPT0gMSkgewotCi0JCQl9Ci0JCQkvLyBtb3ZlIHRoZSBzdGVwIHdpdGhpbiBpdHMgbGlzdAotCQkJLy8KLQkJCUNvbGxlY3Rpb25zLnN3YXAoc3RlcHMsIGlkIC0gMSwgaWQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gbW92ZSB0aGUgd2hvbGUgc3RlcCBsaXN0IHVwCi0JCS8vCi0JCWlkID0gc3RlcExpc3RzLmluZGV4T2Yoc3RlcHMpOwotCQlpZiAoaWQgPT0gLTEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUxpc3QgcHJlZExpc3QgPSBudWxsOwotCQlpbnQgcHJlZExpc3RJZCA9IGlkIC0gMTsKLQkJLy8gbG9vayBmb3Igbm9uLWVtcHR5IHByZWRlY2Vzc29yIGxpc3QKLQkJLy8KLQkJZmluZF9wcmVkTGlzdDogZm9yICg7IHByZWRMaXN0SWQgPiAtMTsgcHJlZExpc3RJZC0tKSB7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgc3RlcExpc3RzLmdldChwcmVkTGlzdElkKTsKLQkJCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlwcmVkTGlzdCA9IGxpc3Q7Ci0JCQkJYnJlYWsgZmluZF9wcmVkTGlzdDsKLQkJCX0KLQkJfQotCQlTZWN0aW9uIG9sZFByZWQgPSAoKFNlY3Rpb24pIHN0ZXBzLmdldCgwKSkuZ2V0UHJlZGVjZXNzb3IoKTsKLQkJTGlzdCBvbGRTdWNjZXNzb3JzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0U3VjY2Vzc29ycygoU2VjdGlvbikgc3RlcHMKLQkJCQkuZ2V0KHN0ZXBzLnNpemUoKSAtIDEpKTsKLQkJaWYgKHByZWRMaXN0ICE9IG51bGwpIHsKLQkJCXN0ZXBMaXN0cy5yZW1vdmUoc3RlcHMpOwotCQkJc3RlcExpc3RzLmFkZChwcmVkTGlzdElkLCBzdGVwcyk7Ci0JCQlTZWN0aW9uIGxhc3QgPSAoU2VjdGlvbikgcHJlZExpc3QuZ2V0KHByZWRMaXN0LnNpemUoKSAtIDEpOwotCQkJTGlzdCBvbGRQcmVkU3VjY2Vzc29ycyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFN1Y2Nlc3NvcnMobGFzdCk7Ci0JCQlpZiAoVG5nVXRpbC5jYW5SZWZlcmVuY2UoY3VycmVudFRhc2ssIGdldERlc2NyaWJhYmxlRWxlbWVudChsYXN0KSkpIHsKLQkJCQlzdGVwLnNldFByZWRlY2Vzc29yKGxhc3QpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9sZFByZWRTdWNjZXNzb3JzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVNlY3Rpb24gc2VjdCA9IChTZWN0aW9uKSBpdGVyLm5leHQoKTsKLQkJCQkJc2VjdC5zZXRQcmVkZWNlc3NvcihzdGVwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdGVwTGlzdHMuYWRkKDAsIHN0ZXBzKTsKLQkJfQotCQlEZXNjcmliYWJsZUVsZW1lbnQgb2xkUHJlZFRhc2sgPSBnZXREZXNjcmliYWJsZUVsZW1lbnQob2xkUHJlZCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9sZFN1Y2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTZWN0aW9uIHNlY3QgPSAoU2VjdGlvbikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoVG5nVXRpbC5jYW5SZWZlcmVuY2UoZ2V0RGVzY3JpYmFibGVFbGVtZW50KHNlY3QpLCBvbGRQcmVkVGFzaykpIHsKLQkJCQlzZWN0LnNldFByZWRlY2Vzc29yKG9sZFByZWQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbW92ZURvd24oU2VjdGlvbiBzdGVwKSB7Ci0JCUxpc3Qgc3RlcHMgPSBjdXJyZW50VGFzay5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpOwotCQlpbnQgaWQgPSBzdGVwcy5pbmRleE9mKHN0ZXApOwotCQlpZiAoaWQgPT0gLTEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChpZCA8IHN0ZXBzLnNpemUoKSAtIDEpIHsKLQkJCS8vIG1vdmUgdGhlIHN0ZXAgd2l0aGluIGl0cyBsaXN0Ci0JCQkvLwotCQkJQ29sbGVjdGlvbnMuc3dhcChzdGVwcywgaWQgKyAxLCBpZCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBtb3ZlIHRoZSB3aG9sZSBzdGVwIGxpc3QgdXAKLQkJLy8KLQkJaWQgPSBzdGVwTGlzdHMuaW5kZXhPZihzdGVwcyk7Ci0JCWlmIChpZCA9PSAtMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJTGlzdCBzdWNjTGlzdCA9IG51bGw7Ci0JCWludCBzdWNjTGlzdElkID0gaWQgKyAxOwotCQlpbnQgc2l6ZSA9IHN0ZXBMaXN0cy5zaXplKCk7Ci0KLQkJLy8gbG9vayBmb3Igbm9uLWVtcHR5IHN1Y2Nlc3NvciBsaXN0Ci0JCS8vCi0JCWZpbmRfTGlzdDogZm9yICg7IHN1Y2NMaXN0SWQgPCBzaXplOyBzdWNjTGlzdElkKyspIHsKLQkJCUxpc3QgbGlzdCA9IChMaXN0KSBzdGVwTGlzdHMuZ2V0KHN1Y2NMaXN0SWQpOwotCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCXN1Y2NMaXN0ID0gbGlzdDsKLQkJCQlicmVhayBmaW5kX0xpc3Q7Ci0JCQl9Ci0JCX0KLQkJaWYgKHN1Y2NMaXN0ICE9IG51bGwpIHsKLQkJCXN0ZXBMaXN0cy5yZW1vdmUoc3VjY0xpc3QpOwotCQkJc3RlcExpc3RzLmFkZChpZCwgc3VjY0xpc3QpOwotCQl9IGVsc2UgewotCQkJc3RlcExpc3RzLmFkZChzdGVwcyk7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvU3VwcHJlc3Npb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1N1cHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0NGM1MjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvU3VwcHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkNvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5SZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNhbGN1bGF0ZXMgdGhlIHN1cHByZXNzaW9uIHN0YXRlLCBib3RoIGRpcmVjdCBhbmQgaW5kaXJlY3QsIG9mIGFueQotICogYnJlYWtkb3duIGVsZW1lbnQgb3IgaXRzIHdyYXBwZXIgaW4gdGhlIHNwZWNpZmllZCBwcm9jZXNzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEF1ZyA5LCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdXBwcmVzc2lvbiB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQlMgPSAid2JzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRCUyA9ICJ0YnMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1BCUyA9ICJ3cGJzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENCUyA9ICJjYnMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgcHJvY1RvU3VwcHJlc3Npb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhdXRvSW5oZXJpdEludGVybWVkaWF0ZVN1cHByZXNzaW9uU3RhdGUgPSB0cnVlOwotCi0JcHJpdmF0ZSBQcm9jZXNzIHByb2Nlc3M7Ci0KLQlwcml2YXRlIFNldCBzdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbW9kaWZpZWQ7Ci0KLQlwcml2YXRlIFNldCBpbnRlcm5hbFVuc3VwcHJlc3NlZEVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBjbGVhckNhY2hlZFN1cHByZXNzaW9ucygpIHsKLQkJcHJvY1RvU3VwcHJlc3Npb25NYXAuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHN1cHByZXNzaW9ucyBvZiBpbnZhbGlkIHByb2Nlc3NlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBjbGVhblVwKCkgewotCQlBcnJheUxpc3QgbGlzdFRvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KHByb2NUb1N1cHByZXNzaW9uTWFwLmtleVNldCgpKQotCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSBpdGVyLm5leHQoKTsKLQkJCWlmIChwcm9jLmVJc1Byb3h5KCkpIHsKLQkJCQlsaXN0VG9SZW1vdmUuYWRkKHByb2MpOwotCQkJfQotCQl9Ci0JCWludCBzaXplID0gbGlzdFRvUmVtb3ZlLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXByb2NUb1N1cHByZXNzaW9uTWFwLnJlbW92ZShsaXN0VG9SZW1vdmUuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZXRBdXRvSW5oZXJpdFN1cHByZXNzaW9uU3RhdGVzKGJvb2xlYW4gYikgewotCQlhdXRvSW5oZXJpdEludGVybWVkaWF0ZVN1cHByZXNzaW9uU3RhdGUgPSBiOwotCX0KLQotCXB1YmxpYyBTdXBwcmVzc2lvbihQcm9jZXNzIHByb2Nlc3MpIHsKLQkJdGhpcy5wcm9jZXNzID0gcHJvY2VzczsKLQkJc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzID0gbG9hZFN1cHByZXNzZWRFbGVtZW50UGF0aHMoKTsKLQl9Ci0KLQlwdWJsaWMgUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlyZXR1cm4gcHJvY2VzczsKLQl9Ci0KLQlwcml2YXRlIFNldCBsb2FkU3VwcHJlc3NlZEVsZW1lbnRQYXRocygpIHsKLQkJQ29uc3RyYWludCBydWxlID0gQ29uc3RyYWludE1hbmFnZXIuZ2V0Q29uc3RyYWludChwcm9jZXNzLAotCQkJCUNvbnN0cmFpbnRNYW5hZ2VyLlBST0NFU1NfU1VQUFJFU1NJT04sIGZhbHNlKTsgLy8gKENvbnN0cmFpbnQpCi0JCS8vIHByb2Nlc3MuZ2V0T3duZWRSdWxlcygpLmdldCgwKTsKLQkJaWYgKHJ1bGUgIT0gbnVsbCAmJiBydWxlLmdldEJvZHkoKS5sZW5ndGgoKSA+IDApIHsKLQkJCVNldCBwYXRocyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKFN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHJ1bGUuZ2V0Qm9keSgpKTsgdG9rZW5zCi0JCQkJCS5oYXNNb3JlVG9rZW5zKCk7KSB7Ci0JCQkJcGF0aHMuYWRkKHRva2Vucy5uZXh0VG9rZW4oKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcGF0aHM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBTZXQgZ2V0U3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzKCkgewotCQlpZiAoc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzID09IG51bGwpIHsKLQkJCXN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocyA9IGxvYWRTdXBwcmVzc2VkRWxlbWVudFBhdGhzKCk7Ci0JCQlpZiAoc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzID09IG51bGwpIHsKLQkJCQlzdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMgPSBuZXcgSGFzaFNldCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1N1cHByZXNzZWQoQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlpZiAoaXNTdXBwcmVzc2VkKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCWlmIChpc1N1cHByZXNzZWQoKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBzZWxlY3Rpb24gaGFzIGFueSBlbGVtZW50IHRoYXQgaXMgbm90IHN1cHByZXNzZWQgeWV0Ci0JICogaW4gdGhpcyBzdXBwcmVzc2lvbidzIHByb2Nlc3MKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblN1cHByZXNzKENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBjYW5EbyhzZWxlY3Rpb24sIHRydWUpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGhhcyBhbnkgZWxlbWVudCB0aGF0IGlzIHN1cHByZXNzZWQgaW4gdGhpcwotCSAqIHN1cHByZXNzaW9uJ3MgcHJvY2VzcwotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUmV2ZWFsKENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBjYW5EbyhzZWxlY3Rpb24sIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRyYWN0cyBpdGVtcyBmcm9tIHRoZSBnaXZlbiBzZWxlY3Rpb24gdGhhdCBjYW4gYmUgc3VwcHJlc3NlZC9yZXZlYWxlZAotCSAqIChkZXBlbmRpbmcgb24gdGhlIDxjb2RlPnN1cHByZXNzZWQ8L2NvZGU+IHBhcmFtZXRlcikKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHBhcmFtIHN1cHByZXNzZWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldEFwcGxpY2FibGVJdGVtcyhDb2xsZWN0aW9uIHNlbGVjdGlvbiwKLQkJCWJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQlBcnJheUxpc3QgYXBwbGljYWJsZUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQ7Ci0JCQkJaWYgKHdyYXBwZXIuaXNSZWFkT25seSgpKSB7Ci0JCQkJCWlmIChpc0luU3VwcHJlc3NlZExpc3Qod3JhcHBlcikgIT0gc3VwcHJlc3NlZCkgewotCQkJCQkJYXBwbGljYWJsZUl0ZW1zLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJCSYmICgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0U3VwcHJlc3NlZCgpCi0JCQkJCQkJCQkuYm9vbGVhblZhbHVlKCkgIT0gc3VwcHJlc3NlZCkgewotCQkJCQkJYXBwbGljYWJsZUl0ZW1zLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50KSBlbGVtZW50KS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkgIT0gc3VwcHJlc3NlZCkgewotCQkJCQlhcHBsaWNhYmxlSXRlbXMuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYXBwbGljYWJsZUl0ZW1zOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZWxlbWVudCBpcyB2YWxpZCB0byBzdXBwcmVzcy9yZXZlYWwgdXBvbgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKE9iamVjdCBlbGVtZW50KSB7Ci0JCS8vIGRvbid0IHNob3cgc3VwcHJlc3MvcmV2ZWFsIGZvciByb2xlZGVzY3JpcHRvciB1bmRlciB0ZWFtLCB3b3JrCi0JCS8vIHByb2R1Y3QgZGVzY3JpcHRvciB1bmRlciBkZWxpdmVyYWJsZSB3b3JrIHByb2R1Y3QsCi0JCS8vIGFuZCByb2xsZWQtdXAgaXRlbQotCQkvLwotCQlCcmVha2Rvd25FbGVtZW50IG9iaiA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQ7Ci0JCQlpZiAod3JhcHBlci5pc1JvbGx1cENoaWxkKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlvYmogPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpCi0JCQlvYmogPSAoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yCi0JCQkJfHwgb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlpZiAob2JqLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwKLQkJCQkJfHwgb2JqLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHNlbGVjdGlvbiBoYXMgYW55IGl0ZW0gdGhhdCBjYW4gYmUKLQkgKiBzdXBwcmVzc2VkL3JldmVhbGVkIChkZXBlbmRpbmcgb24gdGhlIDxjb2RlPnN1cHByZXNzZWQ8L2NvZGU+Ci0JICogcGFyYW1ldGVyKQotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gc3VwcHJlc3NlZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2FuRG8oQ29sbGVjdGlvbiBzZWxlY3Rpb24sIGJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGlzVmFsaWQoZWxlbWVudCkpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQ7Ci0JCQkJCWlmICh3cmFwcGVyLmlzUmVhZE9ubHkoKSkgewotCQkJCQkJaWYgKGlzSW5TdXBwcmVzc2VkTGlzdCh3cmFwcGVyKSAhPSBzdXBwcmVzc2VkKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCQkJCSYmICgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0U3VwcHJlc3NlZCgpCi0JCQkJCQkJCQkJLmJvb2xlYW5WYWx1ZSgpICE9IHN1cHByZXNzZWQpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkuZ2V0U3VwcHJlc3NlZCgpCi0JCQkJCQkJLmJvb2xlYW5WYWx1ZSgpICE9IHN1cHByZXNzZWQpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBIGJyZWFrZG93biBlbGVtZW50IGlzIHN1cHByZXNzZWQgaWYgaXRzZWxmIG9yIGFueSBvZiBpdHMgcGFyZW50IGFjdGl2aXR5Ci0JICogaXMgc3VwcHJlc3NlZAotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBfX2lzU3VwcHJlc3NlZChCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJcmV0dXJuIGdldFN1cHByZXNzZWQoZSwgdHJ1ZSwgbnVsbCkgIT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGlyZWN0bHlTdXBwcmVzc2VkKE1ldGhvZEVsZW1lbnQgZSkgewotCQlCb29sZWFuIGIgPSBlLmdldFN1cHByZXNzZWQoKTsKLQkJaWYgKGIgIT0gbnVsbCAmJiBiLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZTsKLQkJCVZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCWlmICh2YXJpYWJpbGl0eVR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTAotCQkJCQl8fCB2YXJpYWJpbGl0eVR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwpIHsKLQkJCQlpZiAodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGlzRGlyZWN0bHlTdXBwcmVzc2VkKHZlCi0JCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHN1cHByZXNzZWQgYnJlYWtkb3duIGVsZW1lbnQgdGhhdCBtYWRlIHRoZSBnaXZlbiBicmVha2Rvd24KLQkgKiBlbGVtZW50IGJlY29tZSBzdXBwcmVzc2VkLiBUaGlzIG1ldGhvZCB3aWxsIGNoZWNrIHRoZSBzdXBwcmVzc2lvbiBzdGF0ZQotCSAqIG9mIHRoZSBwYXJlbnQgdXB0byB0aGUgc3BlY2lmaWVkIDxjb2RlPnRvcDwvY29kZT4gb25seSBpZgotCSAqIDxjb2RlPmNoZWNrUGFyZW50PC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPi4gSXQgd2lsbCBub3QgY2hlY2sgdGhlCi0JICogc3VwcHJlc3Npb24gc3RhdGUgb2YgPGNvZGU+dG9wPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIEJyZWFrZG93bkVsZW1lbnQgZ2V0U3VwcHJlc3NlZChCcmVha2Rvd25FbGVtZW50IGUsCi0JCQlib29sZWFuIGNoZWNrUGFyZW50LCBPYmplY3QgdG9wKSB7Ci0JCWlmIChlLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJcmV0dXJuIGU7Ci0JCX0KLQotCQlpZiAoY2hlY2tQYXJlbnQpIHsKLQkJCWZvciAoQnJlYWtkb3duRWxlbWVudCBiZSA9IGU7IGJlICE9IHRvcAotCQkJCQkmJiBiZS5nZXRTdXBlckFjdGl2aXRpZXMoKSAhPSBudWxsOykgewotCQkJCWJlID0gYmUuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQkJaWYgKGJlLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlyZXR1cm4gYmU7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciBuZXN0ZWQgYXJ0aWZhY3QgZGVzY3JpcHRvcnMgYW5kIGRlbGl2ZXJhYmxlCi0JCQkvLyBwYXJ0cwotCQkJLy8KLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlKTsKLQkJCQlXb3JrUHJvZHVjdCB3cCA9IHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCWlmICh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCS8vIGxvb2sgZm9yIHBhcmVudCBhcnRpZmFjdCBkZXNjcmlwdG9yIGluIHRoZSBzYW1lIGFjdGl2aXR5Ci0JCQkJCS8vIGFuZCBjaGVjayB0aGVpciBzdXBwcmVzc2lvbiBzdGF0ZQotCQkJCQkvLwotCQkJCQlBY3Rpdml0eSBhY3QgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KGUpOwotCQkJCQlpZiAoYWN0ICE9IG51bGwpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmIChlbGVtZW50ICE9IGUKLQkJCQkJCQkJCSYmIGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KTsKLQkJCQkJCQkJV29ya1Byb2R1Y3Qgb3RoZXJXcCA9IHdwZC5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQkJCQlpZiAob3RoZXJXcCBpbnN0YW5jZW9mIEFydGlmYWN0Ci0JCQkJCQkJCQkJJiYgVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KHdwLCBvdGhlcldwKQotCQkJCQkJCQkJCSYmIHdwZC5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCQkJCXJldHVybiB3cGQ7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHdwRGVzYyAhPSB0b3AgJiYgd3BEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCQkJTGlzdCBsaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdG9ycyh3cERlc2MpOwotCQkJCQlpZiAobGlzdC5zaXplKCkgPT0gMSkgewotCQkJCQkJLy8gdGhpcyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBpcyBhIGRlbGl2ZXJhYmxlIHBhcnQgb2YKLQkJCQkJCS8vIGEgZGVsaXZlcmFibGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IKLQkJCQkJCS8vIGNoZWNrIHRoZSBzdXBwcmVzc2lvbiBzdGF0ZSBvZiB0aGUgZGVsaXZlcmFibGUgd29yawotCQkJCQkJLy8gcHJvZHVjdCBkZXNjcmlwdG9yCi0JCQkJCQkvLwotCQkJCQkJcmV0dXJuIGdldFN1cHByZXNzZWQoKEJyZWFrZG93bkVsZW1lbnQpIGxpc3QuZ2V0KDApLAotCQkJCQkJCQljaGVja1BhcmVudCwgdG9wKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHRlYW0gcHJvZmlsZSBvd24gcm9sZSBkZXNjcmlwdG9yCi0JCQkvLwotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKGUuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkgewotCQkJCQlMaXN0IGxpc3QgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXRUZWFtUHJvZmlsZXMoKFJvbGVEZXNjcmlwdG9yKSBlKTsKLQkJCQkJaWYgKGxpc3Quc2l6ZSgpID09IDEpIHsKLQkJCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIGxpc3QuZ2V0KDApOwotCQkJCQkJaWYgKHRlYW0gIT0gdG9wICYmIHRlYW0gIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiBnZXRTdXBwcmVzc2VkKHRlYW0sIGNoZWNrUGFyZW50LCB0b3ApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3Igc3ViIHRlYW0gcHJvZmlsZQotCQkJLy8KLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCWlmIChlLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCQkJVGVhbVByb2ZpbGUgc3VwZXJUZWFtID0gKChUZWFtUHJvZmlsZSkgZSkuZ2V0U3VwZXJUZWFtKCk7Ci0JCQkJCWlmIChzdXBlclRlYW0gIT0gdG9wICYmIHN1cGVyVGVhbSAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gZ2V0U3VwcHJlc3NlZChzdXBlclRlYW0sIGNoZWNrUGFyZW50LCB0b3ApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJblN1cHByZXNzZWRMaXN0KAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQlpZiAoc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGNoZWNrIGlmIHdyYXBwZXIncyBwYXRoIGlzIGluIHN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocyBzZXQKLQkJLy8KLQkJU3RyaW5nIHBhdGggPSBnZXRQYXRoKHdyYXBwZXIpOwotCQlyZXR1cm4gc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzLmNvbnRhaW5zKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHN1cHByZXNzZWQgYnJlYWtkb3duIGVsZW1lbnQgdGhhdCBtYWRlIHRoZSBnaXZlbiB3cmFwcGVyIGJlY29tZQotCSAqIHN1cHByZXNzZWQKLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnQgZ2V0U3VwcHJlc3NlZCgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJcmV0dXJuIGdldFN1cHByZXNzZWQod3JhcHBlciwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc3VwcHJlc3NlZCBicmVha2Rvd24gZWxlbWVudCB0aGF0IG1hZGUgdGhlIGdpdmVuIHdyYXBwZXIgYmVjb21lCi0JICogc3VwcHJlc3NlZAotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudCBnZXRTdXBwcmVzc2VkKAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciwgYm9vbGVhbiBjaGVja0Jhc2UpIHsKLQkJcmV0dXJuIGdldFN1cHByZXNzZWQod3JhcHBlciwgY2hlY2tCYXNlLCB0cnVlLAotCQkJCWF1dG9Jbmhlcml0SW50ZXJtZWRpYXRlU3VwcHJlc3Npb25TdGF0ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc3VwcHJlc3NlZCBicmVha2Rvd24gZWxlbWVudCB0aGF0IG1hZGUgdGhlIGdpdmVuIHdyYXBwZXIgYmVjb21lCi0JICogc3VwcHJlc3NlZAotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudCBnZXRTdXBwcmVzc2VkKAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciwgYm9vbGVhbiBjaGVja0Jhc2UsCi0JCQlib29sZWFuIGNoZWNrTG9jYWwsIGJvb2xlYW4gaW5oZXJpdFN1cHByZXNzaW9uU3RhdGUpIHsKLQkJcmV0dXJuIGdldFN1cHByZXNzZWQod3JhcHBlciwgY2hlY2tCYXNlLCBjaGVja0xvY2FsLAotCQkJCWluaGVyaXRTdXBwcmVzc2lvblN0YXRlLCB0cnVlLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnQgZ2V0U3VwcHJlc3NlZCgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIsIGJvb2xlYW4gY2hlY2tCYXNlLAotCQkJYm9vbGVhbiBjaGVja0xvY2FsLCBib29sZWFuIGluaGVyaXRTdXBwcmVzc2lvblN0YXRlLAotCQkJYm9vbGVhbiBjaGVja1BhcmVudCwgT2JqZWN0IHRvcCkgewotCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCWlmICghd3JhcHBlci5pc1JlYWRPbmx5KCkpIHsKLQkJCS8vIHRoaXMgaXMgYSB3cmFwcGVyIG9mIGxvY2FsIGVsZW1lbnQKLQkJCS8vCi0JCQlyZXR1cm4gZ2V0U3VwcHJlc3NlZChlLCBjaGVja1BhcmVudCwgdG9wKTsKLQkJfQotCi0JCS8vIGNoZWNrIGlmIHRoZSBiYXNlIGJyZWFrZG93biBlbGVtZW50IGlzIHN1cHByZXNzZWQsIGRpcmVjdGx5IG9yCi0JCS8vIGluZGlyZWN0bHksIGluIGl0cyBvd24gcHJvY2VzcwotCQkvLwotCQlpZiAoY2hlY2tCYXNlKSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50IHN1cHByZXNzZWQgPSBnZXRTdXBwcmVzc2VkKGUsIGNoZWNrUGFyZW50LCB0b3ApOwotCQkJaWYgKHN1cHByZXNzZWQgIT0gbnVsbCkgewotCQkJCXJldHVybiBzdXBwcmVzc2VkOwotCQkJfQotCQl9Ci0KLQkJT2JqZWN0IHBhcmVudCA9IG51bGw7Ci0JCWlmIChjaGVja0xvY2FsKSB7Ci0JCQkvLyBjaGVjayBpZiB0aGUgd3JhcHBlciBpcyBzdXBwcmVzc2VkIGluIHRoaXMgcHJvY2VzcwotCQkJLy8KLQkJCWlmIChpc0luU3VwcHJlc3NlZExpc3Qod3JhcHBlcikpIHsKLQkJCQlyZXR1cm4gZTsKLQkJCX0KLQotCQkJLy8gY2hlY2sgaWYgdGhlIGFueSBsb2NhbCBwYXJlbnQgaXMgc3VwcHJlc3NlZAotCQkJLy8KLQkJCWlmIChjaGVja1BhcmVudCkgewotCQkJCXBhcmVudCA9IHdyYXBwZXIuZ2V0UGFyZW50KHdyYXBwZXIpOwotCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50ICYmIHBhcmVudCAhPSB0b3ApIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudCBzdXBwcmVzc2VkID0gZ2V0U3VwcHJlc3NlZCgKLQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50LCBjaGVja1BhcmVudCwgdG9wKTsKLQkJCQkJaWYgKHN1cHByZXNzZWQgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIHN1cHByZXNzZWQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBpZiB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgc3VwcHJlc3NlZCBpbiBvbmUgb2YgdGhlIGltbWVkaWF0ZQotCQkvLyBiYXNlIHByb2Nlc3MKLQkJLy8KLQkJaWYgKGluaGVyaXRTdXBwcmVzc2lvblN0YXRlKSB7Ci0JCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZSk7Ci0JCQlBY3Rpdml0eSBpbmhlcml0b3IgPSBQcm9jZXNzVXRpbC5nZXRJbmhlcml0b3Iod3JhcHBlcik7Ci0JCQlCcmVha2Rvd25FbGVtZW50IGJhc2UgPSAoQnJlYWtkb3duRWxlbWVudCkgaW5oZXJpdG9yCi0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJUHJvY2VzcyBpbW1lZGlhdGVCYXNlUHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhiYXNlKTsKLQkJCQlpZiAocHJvYyAhPSBpbW1lZGlhdGVCYXNlUHJvYykgewotCQkJCQkvLyBmaW5kIHRoZSBvYmplY3QgaW4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgb2YgdGhlCi0JCQkJCS8vIGltbWVkaWF0ZQotCQkJCQkvLyBiYXNlIHByb2Nlc3MgdGhhdCByZXByZXNlbnRzIHRoZSBzYW1lIGJyZWFrZG93biBlbGVtZW50Ci0JCQkJCS8vCi0JCQkJCU9iamVjdCBvYmplY3QgPSBpbmhlcml0b3IuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQlBcnJheUxpc3Qgb2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoUHJvY2Vzc1V0aWwKLQkJCQkJCQkuZ2V0UGFyZW50TGlzdChpbmhlcml0b3IsIHdyYXBwZXIpKTsKLQkJCQkJb2JqZWN0cy5hZGQoZSk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB3cmFwcGVyCi0JCQkJCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KG9iamVjdCwKLQkJCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJZmluZF9jaGlsZDogZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFkYXB0ZXIKLQkJCQkJCQkJLmdldENoaWxkcmVuKG9iamVjdCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGVsZW1lbnQgPT0gVG5nVXRpbC51bndyYXAoY2hpbGQpKSB7Ci0JCQkJCQkJCW9iamVjdCA9IGNoaWxkOwotCQkJCQkJCQlicmVhayBmaW5kX2NoaWxkOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gZ2V0U3VwcHJlc3Npb24oaW1tZWRpYXRlQmFzZVByb2MpOwotCQkJCQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gc3VwcHJlc3Npb24uZ2V0U3VwcHJlc3NlZCgKLQkJCQkJCQkJKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3QsCi0JCQkJCQkJCWZhbHNlLCB0cnVlLCBpbmhlcml0U3VwcHJlc3Npb25TdGF0ZSwKLQkJCQkJCQkJY2hlY2tQYXJlbnQsIFRuZ1V0aWwudW53cmFwKG9iamVjdCkpOwotCQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiBlbGVtZW50OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgdGhlIGFueSBpbmhlcml0ZWQgcGFyZW50IGlzIHN1cHByZXNzZWQKLQkJLy8KLQkJaWYgKGNoZWNrUGFyZW50KSB7Ci0JCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCQlwYXJlbnQgPSB3cmFwcGVyLmdldFBhcmVudCh3cmFwcGVyKTsKLQkJCX0KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCQkmJiBUbmdVdGlsLnVud3JhcChwYXJlbnQpICE9IHRvcCkgewotCQkJCXJldHVybiBnZXRTdXBwcmVzc2VkKAotCQkJCQkJKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBwYXJlbnQsCi0JCQkJCQljaGVja0Jhc2UsIHRydWUsIGluaGVyaXRTdXBwcmVzc2lvblN0YXRlLCBjaGVja1BhcmVudCwKLQkJCQkJCXRvcCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjYWNoZWQgc3VwcHJlc3Npb24gZm9yIHRoZSBnaXZlbiBwcm9jZXNzIGlmIG9uZSBleGlzdHMgb3IKLQkgKiBjcmVhdGVzIG5ldyBvbmUKLQkgKiAKLQkgKiBAcGFyYW0gaW1tZWRpYXRlQmFzZVByb2MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbihQcm9jZXNzIHByb2MpIHsKLQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSAoU3VwcHJlc3Npb24pIHByb2NUb1N1cHByZXNzaW9uTWFwLmdldChwcm9jKTsKLQkJaWYgKHN1cHByZXNzaW9uID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAocHJvY1RvU3VwcHJlc3Npb25NYXApIHsKLQkJCQlzdXBwcmVzc2lvbiA9IChTdXBwcmVzc2lvbikgcHJvY1RvU3VwcHJlc3Npb25NYXAuZ2V0KHByb2MpOwotCQkJCWlmIChzdXBwcmVzc2lvbiA9PSBudWxsKSB7Ci0JCQkJCXN1cHByZXNzaW9uID0gbmV3IFN1cHByZXNzaW9uKHByb2MpOwotCQkJCQlwcm9jVG9TdXBwcmVzc2lvbk1hcC5wdXQocHJvYywgc3VwcHJlc3Npb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwcHJlc3Npb247Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIF9faXNTdXBwcmVzc2VkKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJcmV0dXJuIGdldFN1cHByZXNzZWQod3JhcHBlcikgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlVG9Nb2RlbCgpIHsKLQkJaWYgKHN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgcGF0aHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBwYXRoID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoaXNWYWxpZChwYXRoKSkgewotCQkJCXBhdGhzLmFwcGVuZChwYXRoKS5hcHBlbmQoJyAnKTsKLQkJCX0KLQkJfQotCi0JCUNvbnN0cmFpbnQgcnVsZSA9IENvbnN0cmFpbnRNYW5hZ2VyLmdldENvbnN0cmFpbnQocHJvY2VzcywKLQkJCQlDb25zdHJhaW50TWFuYWdlci5QUk9DRVNTX1NVUFBSRVNTSU9OLCB0cnVlKTsKLQkJLy8gaWYocHJvY2Vzcy5nZXRPd25lZFJ1bGVzKCkuaXNFbXB0eSgpKSB7Ci0JCS8vIHJ1bGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCk7Ci0JCS8vIHByb2Nlc3MuZ2V0T3duZWRSdWxlcygpLmFkZChydWxlKTsKLQkJLy8gfQotCQkvLyBlbHNlIHsKLQkJLy8gcnVsZSA9IChDb25zdHJhaW50KSBwcm9jZXNzLmdldE93bmVkUnVsZXMoKS5nZXQoMCk7Ci0JCS8vIH0KLQkJLy8JCQotCQlydWxlLnNldEJvZHkocGF0aHMudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBwYXRoIGlzIHZhbGlkIGluIHByb2Nlc3MKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgcGF0aCkgewotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShwYXRoKTsKLQkJU3RyaW5nIHR5cGUgPSB1cmkuc2NoZW1lKCk7Ci0JCUNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQlpZiAoV0JTLmVxdWFscyh0eXBlKSkgewotCQkJYWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0gZWxzZSBpZiAoVEJTLmVxdWFscyh0eXBlKSkgewotCQkJYWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0gZWxzZSBpZiAoV1BCUy5lcXVhbHModHlwZSkpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9IGVsc2UgaWYgKENCUy5lcXVhbHModHlwZSkpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gdXNlIHByb2Nlc3MncyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gdG8gdmFsaWRhdGUKLQkJLy8KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gbnVsbDsKLQkJSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSBudWxsOwotCQlJRmlsdGVyIGZpbHRlciA9IGFkYXB0ZXJGYWN0b3J5LmdldEZpbHRlcigpOwotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotCQkJY29uZmlndXJhdG9yID0gKElDb25maWd1cmF0b3IpIGFkYXB0ZXJGYWN0b3J5LmdldEZpbHRlcigpOwotCQkJY3VycmVudENvbmZpZyA9IGNvbmZpZ3VyYXRvci5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQljb25maWd1cmF0b3Iuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkpOwotCQl9Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgZ3VpZCA9IHVyaS5hdXRob3JpdHkoKTsKLQkJCWlmICghcHJvY2Vzcy5nZXRHdWlkKCkuZXF1YWxzKGd1aWQpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJT2JqZWN0IG9iamVjdCA9IHByb2Nlc3M7Ci0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChvYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHVyaS5zZWdtZW50Q291bnQoKTsgaSsrKSB7Ci0JCQkJZ3VpZCA9IHVyaS5zZWdtZW50KGkpOwotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBhZGFwdGVyLmdldENoaWxkcmVuKG9iamVjdCkuaXRlcmF0b3IoKTsKLQkJCQlhZGFwdGVyID0gbnVsbDsKLQkJCQlmaW5kX2FkYXB0ZXI6IHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCQkJb2JqZWN0ID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJaWYgKGd1aWQuZXF1YWxzKCgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KS5nZXRHdWlkKCkpKSB7Ci0JCQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJCQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBjaGlsZDsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkJCQkuYWRhcHQoY2hpbGQsCi0JCQkJCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJCX0KLQkJCQkJCQlicmVhayBmaW5kX2FkYXB0ZXI7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBtdXN0IGJlIGFuIEl0ZW1Qcm92aWRlckFkYXB0ZXIKLQkJCQkJCS8vCi0JCQkJCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGl0ZW1Qcm92aWRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBvYmplY3Q7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXRlbVByb3ZpZGVyCi0JCQkJCQkJCS5nZXRUYXJnZXQoKTsKLQkJCQkJCWlmIChndWlkLmVxdWFscyhlLmdldEd1aWQoKSkpIHsKLQkJCQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgaXRlbVByb3ZpZGVyOwotCQkJCQkJCWJyZWFrIGZpbmRfYWRhcHRlcjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIHJlc3RvcmUgY29uZmlndXJhdGlvbgotCQkJLy8KLQkJCWlmIChjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJCWNvbmZpZ3VyYXRvci5zZXRNZXRob2RDb25maWd1cmF0aW9uKGN1cnJlbnRDb25maWcpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gcHJpdmF0ZSBib29sZWFuIHJldmVhbChMaXN0IHNlbGVjdGlvbiwgQ29sbGVjdGlvbiByZXZlYWxlZERlc2NyaXB0b3JzKSB7Ci0JLy8gYm9vbGVhbiByZWFkT25seUVsZW1lbnRBZmZlY3RlZCA9IGZhbHNlOwotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCS8vIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkvLyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0KLQkvLyAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQ7Ci0JLy8gTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCS8vIGlmICghd3JhcHBlci5pc1JlYWRPbmx5KCkpIHsgLy8gd3JhcHBlciBvZiBsb2NhbCBlbGVtZW50Ci0JLy8gZS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4uRkFMU0UpOwotCS8vIGlmKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JLy8gcmV2ZWFsZWREZXNjcmlwdG9ycy5hZGQoZSk7Ci0JLy8gfQotCS8vIH0gZWxzZSB7IC8vIHdhcyBzdXBwcmVzc2VkIGJ5IHRoaXMgcHJvY2VzcwotCS8vCi0JLy8gLy8gcmVtb3ZlIHRoZSBwYXRoIG9mIHN1cHByZXNzZWQgZWxlbWVudCBmcm9tIHRoZSBsaXN0Ci0JLy8gLy8KLQkvLyBTdHJpbmcgcGF0aCA9IGdldFBhdGgod3JhcHBlcik7Ci0JLy8gZ2V0U3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzKCkucmVtb3ZlKHBhdGgpOwotCS8vIHJlYWRPbmx5RWxlbWVudEFmZmVjdGVkID0gdHJ1ZTsKLQkvLyB9Ci0JLy8gfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCS8vICgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkuc2V0U3VwcHJlc3NlZChCb29sZWFuLkZBTFNFKTsKLQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCS8vIHJldmVhbGVkRGVzY3JpcHRvcnMuYWRkKGVsZW1lbnQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIG1vZGlmaWVkID0gdHJ1ZTsKLQkvLyByZXR1cm4gcmVhZE9ubHlFbGVtZW50QWZmZWN0ZWQ7Ci0JLy8gfQotCi0JLy8gLyoqCi0JLy8gKiBAcGFyYW0gc2VsZWN0aW9uCi0JLy8gKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBjYWxsIHJldmVhbGVkIGFueSByZWFkLW9ubHkgZWxlbWVudAotCS8vICovCi0JLy8gcHVibGljIGJvb2xlYW4gcmV2ZWFsKExpc3Qgc2VsZWN0aW9uKSB7Ci0JLy8gQXJyYXlMaXN0IHJldmVhbGVkRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gYm9vbGVhbiByZXQgPSByZXZlYWwoc2VsZWN0aW9uLCByZXZlYWxlZERlc2NyaXB0b3JzKTsKLQkvLyBMaXN0IGRlc2NyaXB0b3JzVG9SZXZlYWwgPSBnZXRPd25SZWxhdGVkRWxlbWVudHMocmV2ZWFsZWREZXNjcmlwdG9ycywKLQkvLyBmYWxzZSk7Ci0JLy8gaWYoZGVzY3JpcHRvcnNUb1JldmVhbCAhPSBudWxsKSB7Ci0JLy8gYm9vbGVhbiByZXQyID0gcmV2ZWFsKGRlc2NyaXB0b3JzVG9SZXZlYWwsIHJldmVhbGVkRGVzY3JpcHRvcnMpOwotCS8vIHJldHVybiByZXQgfHwgcmV0MjsKLQkvLyB9Ci0JLy8gcmV0dXJuIHJldDsKLQkvLyB9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBuZWVkIHRvIHVzZSB7QGxpbmsgU3VwcHJlc3Npb25Db21tYW5kfSBpbnN0ZWFkCi0JICovCi0JcHVibGljIHZvaWQgcmV2ZWFsKExpc3Qgc2VsZWN0aW9uKSB7Ci0JCWRvU2V0U3VwcHJlc3NlZChzZWxlY3Rpb24sIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Vmlld1R5cGUoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCS8vIG5vIG5lZWQgdG8gc3RvcmUgc2VwYXJhdGUgcGF0aCBmb3IgQ0JTLCByZXVzZSBXQlMvVEJTL1dQQlMgcGF0aHMKLQkJLy8JCQotCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlyZXR1cm4gV0JTOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSB8fCBlIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBUQlM7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJcmV0dXJuIFdQQlM7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHByb2Nlc3MgR1VJRCBpbiB0aGUgZ2l2ZW4gR1VJRCBwYXRoCi0JICogCi0JICogQHBhcmFtIGd1aWRQYXRoCi0JICogQHJldHVybgotCSAqIEBzZWUgI2dldFBhdGgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvY2Vzc0dVSUQoU3RyaW5nIGd1aWRQYXRoKSB7Ci0JCWludCBpZCA9IGd1aWRQYXRoLmluZGV4T2YoIjovLyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpZCAhPSAtMSkgewotCQkJaW50IGJlZ2luSW5kZXggPSBpZCArIDM7Ci0JCQlpZiAoYmVnaW5JbmRleCA8IGd1aWRQYXRoLmxlbmd0aCgpKSB7Ci0JCQkJaW50IGVuZEluZGV4ID0gZ3VpZFBhdGguaW5kZXhPZignLycsIGJlZ2luSW5kZXgpOwotCQkJCWlmIChlbmRJbmRleCAhPSAtMSkgewotCQkJCQlyZXR1cm4gZ3VpZFBhdGguc3Vic3RyaW5nKGJlZ2luSW5kZXgsIGVuZEluZGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGF0aChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCVN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgcGFyZW50TGlzdCA9IFByb2Nlc3NVdGlsLmdldFBhcmVudExpc3QobnVsbCwgd3JhcHBlcik7Ci0JCWlmICghcGFyZW50TGlzdC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHBhcmVudExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCS8vIGV4Y2x1ZGUgVGFza0Rlc2NyaXB0b3IgYW5kIFJvbGVEZXNjcmlwdG9yIGZyb20gdGhlIHBhcmVudAotCQkJCS8vIHBhdGggYi9jIHRob3NlIGRlc2NyaXB0b3JzIGNhbiBiZQotCQkJCS8vIHBhcmVudCBvbmx5IGluIENCUyB2aWV3Ci0JCQkJaWYgKCEoZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yIHx8IGUgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikpIHsKLQkJCQkJcGF0aC5hcHBlbmQoJy8nKS5hcHBlbmQoZS5nZXRHdWlkKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCXBhdGguYXBwZW5kKCcvJykuYXBwZW5kKGUuZ2V0R3VpZCgpKTsKLQkJU3RyaW5nIHZpZXdUeXBlID0gZ2V0Vmlld1R5cGUod3JhcHBlcik7Ci0JCXBhdGguaW5zZXJ0KDAsICI6LyIpLmluc2VydCgwLCB2aWV3VHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHBhdGgudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0IGdldE93blJlbGF0ZWRFbGVtZW50cyhDb2xsZWN0aW9uIGNoYW5nZWREZXNjcmlwdG9ycywKLQkJCWJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQlpZiAoIWNoYW5nZWREZXNjcmlwdG9ycy5pc0VtcHR5KCkpIHsKLQkJCUFycmF5TGlzdCBkZXNjcmlwdG9yc1RvQ2hhbmdlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChjaGFuZ2VkRGVzY3JpcHRvcnMpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlEZXNjcmlwdG9yIGRlc2MgPSAoRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0W10gcmVsYXRpb25zaGlwcyA9IG51bGw7Ci0JCQkJaWYgKGRlc2MgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQlyZWxhdGlvbnNoaXBzID0gUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLlRBU0tfREVTQ1JJUFRPUl9fUkVMQVRJT05TSElQUzsKLQkJCQl9IGVsc2UgaWYgKGRlc2MgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQlyZWxhdGlvbnNoaXBzID0gUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLlJPTEVfREVTQ1JJUFRPUl9fUkVMQVRJT05TSElQUzsKLQkJCQl9IGVsc2UgaWYgKGRlc2MgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJcmVsYXRpb25zaGlwcyA9IFJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUkVMQVRJT05TSElQUzsKLQkJCQl9Ci0JCQkJaWYgKHJlbGF0aW9uc2hpcHMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlbGF0aW9uc2hpcHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCU9iamVjdCBmZWF0dXJlID0gcmVsYXRpb25zaGlwc1tpXTsKLQkJCQkJCWJvb2xlYW4gaXNNYW55OwotCQkJCQkJT2JqZWN0IHZhbHVlOwotCQkJCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBPcHBvc2l0ZUZlYXR1cmUpIHsKLQkJCQkJCQlPcHBvc2l0ZUZlYXR1cmUgZiA9IChPcHBvc2l0ZUZlYXR1cmUpIGZlYXR1cmU7Ci0JCQkJCQkJaXNNYW55ID0gZi5pc01hbnkoKTsKLQkJCQkJCQl2YWx1ZSA9ICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGRlc2MpCi0JCQkJCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoZik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZTsKLQkJCQkJCQlpc01hbnkgPSBmLmlzTWFueSgpOwotCQkJCQkJCXZhbHVlID0gZGVzYy5lR2V0KGYpOwotCQkJCQkJfQotCQkJCQkJaWYgKGlzTWFueSkgewotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAoKENvbGxlY3Rpb24pIHZhbHVlKQotCQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQkJRGVzY3JpcHRvciByZWYgPSAoRGVzY3JpcHRvcikgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQlpZiAocmVmLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSAhPSBzdXBwcmVzc2VkCi0JCQkJCQkJCQkJJiYgIVByb2Nlc3NVdGlsCi0JCQkJCQkJCQkJCQkuY2hlY2tEZXNjcmlwdG9yUmVmZXJlbmNlcygKLQkJCQkJCQkJCQkJCQkJY2hhbmdlZERlc2NyaXB0b3JzLCByZWYpKSB7Ci0JCQkJCQkJCQlkZXNjcmlwdG9yc1RvQ2hhbmdlLmFkZChyZWYpOwotCQkJCQkJCQkJY2hhbmdlZERlc2NyaXB0b3JzLmFkZChyZWYpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlEZXNjcmlwdG9yIHJlZiA9IChEZXNjcmlwdG9yKSB2YWx1ZTsKLQkJCQkJCQlpZiAocmVmICE9IG51bGwpIHsKLQkJCQkJCQkJaWYgKHJlZi5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkgIT0gc3VwcHJlc3NlZAotCQkJCQkJCQkJCSYmICFQcm9jZXNzVXRpbC5jaGVja0Rlc2NyaXB0b3JSZWZlcmVuY2VzKAotCQkJCQkJCQkJCQkJY2hhbmdlZERlc2NyaXB0b3JzLCByZWYpKSB7Ci0JCQkJCQkJCQlkZXNjcmlwdG9yc1RvQ2hhbmdlLmFkZChyZWYpOwotCQkJCQkJCQkJY2hhbmdlZERlc2NyaXB0b3JzLmFkZChyZWYpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGRlc2NyaXB0b3JzVG9DaGFuZ2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU3VwcHJlc3NlcyBvciByZXZlYWxzIHRoZSBnaXZlbiBzZWxlY3Rpb24KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHBhcmFtIHN1cHByZXNzZWQKLQkgKiBAcmV0dXJuIHtAbGluayBSZXN1bHR9IG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhpcyBjYWxsCi0JICovCi0JcHJpdmF0ZSBSZXN1bHQgc2V0U3VwcHJlc3NlZChMaXN0IHNlbGVjdGlvbiwgYm9vbGVhbiBzdXBwcmVzc2VkKSB7Ci0JCVJlc3VsdCByZXN1bHQgPSBkb1NldFN1cHByZXNzZWQoc2VsZWN0aW9uLCBzdXBwcmVzc2VkKTsKLQotCQkvLyBpZiBkZXNjcmlwdG9ycyBoYWQgYmVlbiBzdXBwcmVzc2VkLCByZWxhdGVkIGVsZW1lbnRzIHRoYXQgYXJlIG5vdAotCQkvLyB1c2VkIGFueXdoZXJlIGVsc2UgYWxzbyBuZWVkIHRvIGJlIHN1cHByZXNzZWQgKGp1c3QgbGlrZSBkZWxldGUpCi0JCS8vCQotCQlpZiAoIXJlc3VsdC5kZXNjcmlwdG9ycy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZGVzY3JpcHRvcnNUb1N1cHByZXNzID0gZ2V0T3duUmVsYXRlZEVsZW1lbnRzKAotCQkJCQlyZXN1bHQuZGVzY3JpcHRvcnMsIHN1cHByZXNzZWQpOwotCQkJaWYgKGRlc2NyaXB0b3JzVG9TdXBwcmVzcyAhPSBudWxsKSB7Ci0JCQkJUmVzdWx0IHJlc3VsdDIgPSBkb1NldFN1cHByZXNzZWQoZGVzY3JpcHRvcnNUb1N1cHByZXNzLAotCQkJCQkJc3VwcHJlc3NlZCk7Ci0KLQkJCQkvLyBtZXJnZSByZXN1bHRzCi0JCQkJLy8KLQkJCQlyZXN1bHQuZWxlbWVudHMuYWRkQWxsKHJlc3VsdDIuZWxlbWVudHMpOwotCQkJCXJlc3VsdC5kZXNjcmlwdG9ycy5hZGRBbGwocmVzdWx0Mi5kZXNjcmlwdG9ycyk7Ci0JCQkJcmVzdWx0LnBhdGhzLmFkZEFsbChyZXN1bHQyLnBhdGhzKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgbmVlZCB0byB1c2Uge0BsaW5rIFN1cHByZXNzaW9uQ29tbWFuZH0gaW5zdGVhZAotCSAqLwotCXB1YmxpYyB2b2lkIHN1cHByZXNzKExpc3Qgc2VsZWN0aW9uKSB7Ci0JCWRvU2V0U3VwcHJlc3NlZChzZWxlY3Rpb24sIHRydWUpOwotCX0KLQotCS8vIHB1YmxpYyBib29sZWFuIHN1cHByZXNzKExpc3Qgc2VsZWN0aW9uKSB7Ci0JLy8gQXJyYXlMaXN0IHN1cHByZXNzZWREZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBib29sZWFuIHJldCA9IHN1cHByZXNzKHNlbGVjdGlvbiwgc3VwcHJlc3NlZERlc2NyaXB0b3JzKTsKLQkvLwkJCi0JLy8gLy8gaWYgZGVzY3JpcHRvcnMgaGFkIGJlZW4gc3VwcHJlc3NlZCwgcmVsYXRlZCBlbGVtZW50cyB0aGF0IGFyZSBub3QgdXNlZAotCS8vIGFueXdoZXJlIGVsc2UgYWxzbyBuZWVkIHRvIGJlIHN1cHByZXNzZWQgKGp1c3QgbGlrZSBkZWxldGUpCi0JLy8gLy8KLQkvLyBMaXN0IGRlc2NyaXB0b3JzVG9TdXBwcmVzcyA9IGdldE93blJlbGF0ZWRFbGVtZW50cyhzdXBwcmVzc2VkRGVzY3JpcHRvcnMsCi0JLy8gdHJ1ZSk7Ci0JLy8gaWYoZGVzY3JpcHRvcnNUb1N1cHByZXNzICE9IG51bGwpIHsKLQkvLyBBcnJheUxpc3Qgb3V0ID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIGJvb2xlYW4gcmV0MiA9IHN1cHByZXNzKGRlc2NyaXB0b3JzVG9TdXBwcmVzcywgb3V0KTsKLQkvLyBpZihvdXQuc2l6ZSgpICE9IGRlc2NyaXB0b3JzVG9TdXBwcmVzcy5zaXplKCkpIHsKLQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlN1cHByZXNzaW9uLnN1cHByZXNzKExpc3QpCi0JLy8gaXMgYnVnZ3kuIik7IC8vJE5PTi1OTFMtMSQKLQkvLyB9Ci0JLy8gcmV0dXJuIHJldCB8fCByZXQyOwotCS8vIH0KLQkvLyByZXR1cm4gcmV0OwotCS8vIH0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlc3VsdCB7Ci0JCS8qKiBFbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBzdXBwcmVzc2VkIG9yIHJldmVhbGVkICovCi0JCUNvbGxlY3Rpb24gZWxlbWVudHM7Ci0KLQkJLyoqIERlc2NyaXB0b3JzIHRoYXQgaGF2ZSBiZWVuIHN1cHByZXNzZWQgb3IgcmV2ZWFsZWQgKi8KLQkJQ29sbGVjdGlvbiBkZXNjcmlwdG9yczsKLQotCQkvKioKLQkJICogUGF0aHMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tCi0JCSAqIDxjb2RlPnN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRoczwvY29kZT4KLQkJICovCi0JCUNvbGxlY3Rpb24gcGF0aHM7Ci0KLQkJUmVzdWx0KCkgewotCQkJZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXBhdGhzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0KLQkJYm9vbGVhbiBpc0VtcHR5KCkgewotCQkJcmV0dXJuIGVsZW1lbnRzLmlzRW1wdHkoKSAmJiBwYXRocy5pc0VtcHR5KCk7Ci0JCX0KLQotCQl2b2lkIGNsZWFyKCkgewotCQkJZWxlbWVudHMuY2xlYXIoKTsKLQkJCWRlc2NyaXB0b3JzLmNsZWFyKCk7Ci0JCQlwYXRocy5jbGVhcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VwcHJlc3NlcyBvciByZXZlYWxzIHRoZSBnaXZlbiBzZWxlY3Rpb24gZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZgotCSAqIDxjb2RlPnN1cHByZXNzZWQ8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEBwYXJhbSBzdXBwcmVzc2VkCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgUmVzdWx0IGRvU2V0U3VwcHJlc3NlZChMaXN0IHNlbGVjdGlvbiwgYm9vbGVhbiBzdXBwcmVzc2VkKSB7Ci0JCVJlc3VsdCByZXN1bHQgPSBuZXcgUmVzdWx0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudDsKLQkJCQkvLyBpZiAoIWlzU3VwcHJlc3NlZCh3cmFwcGVyKSkgewotCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJCQlpZiAoIXdyYXBwZXIuaXNSZWFkT25seSgpKSB7Ci0JCQkJCS8vIHdyYXBwZXIgb2YgbG9jYWwgZWxlbWVudAotCQkJCQkvLwotCQkJCQlpZiAoZS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkgIT0gc3VwcHJlc3NlZCkgewotCQkJCQkJZS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4udmFsdWVPZihzdXBwcmVzc2VkKSk7Ci0JCQkJCQlyZXN1bHQuZWxlbWVudHMuYWRkKGUpOwotCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJcmVzdWx0LmRlc2NyaXB0b3JzLmFkZChlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGFkZCB0aGUgcGF0aHMgb2Ygc3VwcHJlc3NlZCBlbGVtZW50IHRvIHRoZSBtYXAKLQkJCQkJLy8KLQkJCQkJU3RyaW5nIHBhdGggPSBnZXRQYXRoKHdyYXBwZXIpOwotCQkJCQlib29sZWFuIGI7Ci0JCQkJCWlmIChzdXBwcmVzc2VkKSB7Ci0JCQkJCQliID0gZ2V0U3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzKCkuYWRkKHBhdGgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYiA9IGdldFN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocygpLnJlbW92ZShwYXRoKTsKLQkJCQkJfQotCQkJCQlpZiAoYikgewotCQkJCQkJcmVzdWx0LnBhdGhzLmFkZChwYXRoKTsKLQkJCQkJfQotCQkJCQkvLyB9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9ICgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCQkJaWYgKGUuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpICE9IHN1cHByZXNzZWQpIHsKLQkJCQkJZS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4udmFsdWVPZihzdXBwcmVzc2VkKSk7Ci0JCQkJCXJlc3VsdC5lbGVtZW50cy5hZGQoZSk7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCQkJcmVzdWx0LmRlc2NyaXB0b3JzLmFkZChlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQltb2RpZmllZCA9ICFyZXN1bHQuaXNFbXB0eSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vIHByaXZhdGUgYm9vbGVhbiBzdXBwcmVzcyhMaXN0IHNlbGVjdGlvbiwgQ29sbGVjdGlvbgotCS8vIHN1cHByZXNzZWREZXNjcmlwdG9ycykgewotCS8vIGJvb2xlYW4gcmVhZE9ubHlFbGVtZW50U3VwcHJlc3NlZCA9IGZhbHNlOwotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCS8vIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkvLyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0KLQkvLyAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQ7Ci0JLy8gaWYgKCFpc1N1cHByZXNzZWQod3JhcHBlcikpIHsKLQkvLyBCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbAotCS8vIC51bndyYXAod3JhcHBlcik7Ci0JLy8gaWYgKCF3cmFwcGVyLmlzUmVhZE9ubHkoKSkgewotCS8vIC8vIHdyYXBwZXIgb2YgbG9jYWwgZWxlbWVudAotCS8vIC8vCi0JLy8gZS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4uVFJVRSk7Ci0JLy8gaWYoZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkvLyBzdXBwcmVzc2VkRGVzY3JpcHRvcnMuYWRkKGUpOwotCS8vIH0KLQkvLyB9IGVsc2UgewotCS8vIC8vIGFkZCB0aGUgcGF0aHMgb2Ygc3VwcHJlc3NlZCBlbGVtZW50IHRvIHRoZSBtYXAKLQkvLyAvLwotCS8vIFN0cmluZyBwYXRoID0gZ2V0UGF0aCh3cmFwcGVyKTsKLQkvLyBnZXRTdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMoKS5hZGQocGF0aCk7Ci0JLy8gcmVhZE9ubHlFbGVtZW50U3VwcHJlc3NlZCA9IHRydWU7Ci0JLy8gfQotCS8vIH0KLQkvLyB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JLy8gKChNZXRob2RFbGVtZW50KSBlbGVtZW50KS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4uVFJVRSk7Ci0JLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkvLyBzdXBwcmVzc2VkRGVzY3JpcHRvcnMuYWRkKGVsZW1lbnQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIG1vZGlmaWVkID0gdHJ1ZTsKLQkvLyByZXR1cm4gcmVhZE9ubHlFbGVtZW50U3VwcHJlc3NlZDsKLQkvLyB9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1Vuc3VwcHJlc3NlZChMaXN0IHNlbGVjdGlvbikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCWlmICghaXNTdXBwcmVzc2VkKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCWlmICghaXNTdXBwcmVzc2VkKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbW9kaWZpZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlTmVlZGVkKCkgewotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZUlzRG9uZSgpIHsKLQkJbW9kaWZpZWQgPSBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIF9faXNTdXBwcmVzc2VkKENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgY29tcG9zZWRXcmFwcGVyKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbXBvc2VkV3JhcHBlci5nZXRWYWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZighaXNTdXBwcmVzc2VkKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBlbGVtZW50LCBvciB0aGUgaXRlbSBwcm92aWRlciBvciBhZGFwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUKLQkgKiBlbGVtZW50IGlzIHN1cHByZXNzZWQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQgb3IgYW4gYXNzb2NpYXRlZCB3cmFwcGVyLCBhZGFwdG9yLCBvciBpdGVtCi0JICogICAgICAgICAgICBwcm92aWRlciwgZXRjLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VwcHJlc3NlZChPYmplY3QgZSkgewotCQkvLyBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJdHJ5IHsKLQotCQkJaWYgKGUgPT0gbnVsbCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJCi0JCQlDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGNvbXBvc2VkV3JhcHBlciA9IFByb2Nlc3NVdGlsLmdldENvbXBvc2VkV3JhcHBlcihlKTsKLQkJCWlmKGNvbXBvc2VkV3JhcHBlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIF9faXNTdXBwcmVzc2VkKGNvbXBvc2VkV3JhcHBlcik7Ci0JCQl9Ci0KLQkJCWlmIChpbnRlcm5hbFVuc3VwcHJlc3NlZEVsZW1lbnRzLmNvbnRhaW5zKGUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlpZiAoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIF9faXNTdXBwcmVzc2VkKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZSk7Ci0JCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJcmV0dXJuIF9faXNTdXBwcmVzc2VkKChCcmVha2Rvd25FbGVtZW50KSBlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJT2JqZWN0IHRhcmdldE9iaiA9IG51bGw7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCXRhcmdldE9iaiA9ICgoV3JhcHBlckl0ZW1Qcm92aWRlcikgZSkuZ2V0VmFsdWUoKTsKLQkJCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJCXRhcmdldE9iaiA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgZSkuZ2V0VGFyZ2V0KCk7Ci0JCQkJfQotCi0JCQkJaWYgKHRhcmdldE9iaiAhPSBudWxsICYmIHRhcmdldE9iaiAhPSBlKSB7Ci0JCQkJCXJldHVybiBpc1N1cHByZXNzZWQodGFyZ2V0T2JqKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBmYWxzZTsKLQotCQl9IGZpbmFsbHkgewotCQkJLy8gbG9uZyB0aW1lID0gKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpOwotCQkJLy8gaWYodGltZSA+IDEwMDApIHsKLQkJCS8vIEJyZWFrZG93bkVsZW1lbnQgYmUgPSAoQnJlYWtkb3duRWxlbWVudClUbmdVdGlsLnVud3JhcChlKTsKLQkJCS8vIFN0cmluZyBtc2cgPSAiU3VwcHJlc3Npb24uaXNTdXBwcmVzc2VkKCk6IHRpbWUgdGFrZW4gKG1zKSAiICsKLQkJCS8vIHRpbWUgKwotCQkJLy8gIlxuIHByb2Nlc3M6ICIgKyAoZSBpbnN0YW5jZW9mCi0JCQkvLyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciA/Ci0JCQkvLyAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWUpLmdldFRvcEl0ZW0oKSA6Ci0JCQkvLyBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYmUpKSArCi0JCQkvLyAiXG4gZWxlbWVudDogIiArIFByb2Nlc3NVdGlsLmdldExhYmVsV2l0aFBhdGgoYmUpOwotCQkJLy8JCQkJCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dJbmZvKG1zZyk7Ci0JCQkvLyB9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzdXBwcmVzc2lvbiBzdGF0ZSBvZiB0aGUgZ2l2ZW4gPGNvZGU+d3JhcHBlcjwvY29kZT4gZnJvbQotCSAqIGl0cyBiYXNlLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNhbGwgbW9kaWZpZWQgdGhlIHN1cHByZXNzaW9uIHN0YXRlCi0JICogICAgICAgICBvZiB0aGUgZ2l2ZW4gd3JhcHBlciwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2UoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCVN0cmluZyBwYXRoID0gZ2V0UGF0aCh3cmFwcGVyKTsKLQkJYm9vbGVhbiByZXQ7Ci0JCUJyZWFrZG93bkVsZW1lbnQgZSA9IGdldFN1cHByZXNzZWQod3JhcHBlciwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlLAotCQkJCW51bGwpOwotCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQlyZXQgPSBnZXRTdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMoKS5hZGQocGF0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXQgPSBnZXRTdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMoKS5yZW1vdmUocGF0aCk7Ci0JCX0KLQkJaWYgKHJldCkgewotCQkJbW9kaWZpZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVkZXMgdGhlIGRlc2NyaXB0b3JzIHdpdGggdGhlIHNhbWUgbGlua2VkIGVsZW1lbnQgZnJvbSB0aGUgY2hlY2sKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uVG9SZXZlYWwKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBjaGVja0R1cGxpY2F0ZU5hbWVBZnRlclJldmVhbCgKLQkJCUNvbGxlY3Rpb24gc2VsZWN0aW9uVG9SZXZlYWxPclN1cHByZXNzLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJQ29sbGVjdGlvbiBlbGVtZW50c1RvUmV2ZWFsID0gZ2V0QXBwbGljYWJsZUl0ZW1zKAotCQkJCXNlbGVjdGlvblRvUmV2ZWFsT3JTdXBwcmVzcywgZmFsc2UpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvUmV2ZWFsLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCUJyZWFrZG93bkVsZW1lbnQgYmUgPSAoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudDsKLQkJCQlTdHJpbmcgbXNnID0gUHJvY2Vzc1V0aWwuY2hlY2tCcmVha2Rvd25FbGVtZW50TmFtZSgKLQkJCQkJCWFkYXB0ZXJGYWN0b3J5LCBiZSwgYmUuZ2V0TmFtZSgpLCB0aGlzKTsKLQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLlN1cHByZXNzaW9uX25hbWVEdXBsaWNhdGlvbjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQltc2cgPSBQcm9jZXNzVXRpbC5jaGVja0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKAotCQkJCQkJYWRhcHRlckZhY3RvcnksIGJlLCBiZS5nZXRQcmVzZW50YXRpb25OYW1lKCksIHRoaXMpOwotCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuU3VwcHJlc3Npb25fcHJlc2VudGF0aW9uTmFtZUR1cGxpY2F0aW9uOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlPYmplY3QgdW53cmFwcGVkID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQkJaWYgKHVud3JhcHBlZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJLmFkYXB0KGVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCU9iamVjdCBwYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCUNvbGxlY3Rpb24gc2libGluZ3MgPSBpdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJCQkJCU9iamVjdCBsaW5rZWRFbGVtZW50ID0gbnVsbDsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCQkJCWxpbmtlZEVsZW1lbnQgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBlbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaW50ZXJuYWxVbnN1cHByZXNzZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJCQkJbmFtZUNoZWNrTG9vcDogZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNpYmxpbmdzCi0JCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCQlPYmplY3Qgc2libGluZyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYgKHNpYmxpbmcgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQkJCQlCcmVha2Rvd25FbGVtZW50IGJlID0gKEJyZWFrZG93bkVsZW1lbnQpIHNpYmxpbmc7Ci0JCQkJCQkJCQkvLyBza2lwIGNoZWNraW5nIG9uIHN1cHByZXNzZWQgZWxlbWVudAotCQkJCQkJCQkJLy8KLQkJCQkJCQkJCWlmIChiZS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCQkJCQljb250aW51ZSBuYW1lQ2hlY2tMb29wOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKGxpbmtlZEVsZW1lbnQgIT0gbnVsbAotCQkJCQkJCQkJCQkmJiBzaWJsaW5nIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCQkJCQkJCS8vIHNraXAgY2hlY2tpbmcgb24gZGVzY3JpcHRvcnMgd2l0aCB0aGUKLQkJCQkJCQkJCQkvLyBzYW1lIGxpbmtlZCBlbGVtZW50Ci0JCQkJCQkJCQkJLy8KLQkJCQkJCQkJCQlPYmplY3Qgb3RoZXJMaW5rZWRFbGVtZW50ID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcikgZWxlbWVudCk7Ci0JCQkJCQkJCQkJaWYgKG90aGVyTGlua2VkRWxlbWVudCA9PSBsaW5rZWRFbGVtZW50KSB7Ci0JCQkJCQkJCQkJCWNvbnRpbnVlIG5hbWVDaGVja0xvb3A7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJU3RyaW5nIG1zZyA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCQkJCS5jaGVja0JyZWFrZG93bkVsZW1lbnROYW1lKAotCQkJCQkJCQkJCQkJCWFkYXB0ZXJGYWN0b3J5LCBiZSwgYmUKLQkJCQkJCQkJCQkJCQkJCS5nZXROYW1lKCksIHRoaXMpOwotCQkJCQkJCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLlN1cHByZXNzaW9uX25hbWVEdXBsaWNhdGlvbjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfQotCQkJCQkJCQkJbXNnID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJCQkJLmNoZWNrQnJlYWtkb3duRWxlbWVudFByZXNlbnRhdGlvbk5hbWUoCi0JCQkJCQkJCQkJCQkJYWRhcHRlckZhY3RvcnksIGJlLAotCQkJCQkJCQkJCQkJCWJlLmdldFByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQkJCQkJCQkJCQl0aGlzKTsKLQkJCQkJCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQkJCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5TdXBwcmVzc2lvbl9wcmVzZW50YXRpb25OYW1lRHVwbGljYXRpb247IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJaW50ZXJuYWxVbnN1cHByZXNzZWRFbGVtZW50cy5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3RCeVBhdGgoU3RyaW5nW10gZ3VpZFBhdGgsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlpZiAoZ3VpZFBhdGgubGVuZ3RoID09IDAgfHwgYWRhcHRlckZhY3RvcnkgPT0gbnVsbAotCQkJCXx8ICFndWlkUGF0aFswXS5lcXVhbHMocHJvY2Vzcy5nZXRHdWlkKCkpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU9iamVjdCBvYmplY3QgPSBwcm9jZXNzOwotCQlpbnQgbGVuID0gZ3VpZFBhdGgubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMTsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChvYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0KLQkJCS8vIGlmIGN1cnJlbnQgb2JqZWN0IGlzIGFuIGFjdGl2aXR5LCBtYWtlIHN1cmUgaXQgaXMgcm9sbGVkIGRvd24KLQkJCS8vIGJlZm9yZSBsb29raW5nIGludG8gaXRzIGNoaWxkcmVuCi0JCQkvLwotCQkJSUJTSXRlbVByb3ZpZGVyIHJvbGxlZFVwQWRhcHRlciA9IG51bGw7Ci0JCQlJdGVyYXRvciBpdGVyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaWYgKFRuZ1V0aWwudW53cmFwKG9iamVjdCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgYWN0aXZpdHlJdGVtUHJvdmlkZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJCQkJCWlmIChhY3Rpdml0eUl0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCkpIHsKLQkJCQkJCQlhY3Rpdml0eUl0ZW1Qcm92aWRlci5iYXNpY1NldFJvbGxlZFVwKGZhbHNlKTsKLQkJCQkJCQlyb2xsZWRVcEFkYXB0ZXIgPSBhY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlJQlNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJCQkJCWlmIChpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpKSB7Ci0JCQkJCQkJaXRlbVByb3ZpZGVyLnNldFJvbGxlZFVwKGZhbHNlKTsKLQkJCQkJCQlyb2xsZWRVcEFkYXB0ZXIgPSBpdGVtUHJvdmlkZXI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaXRlciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pdGVyYXRvcigpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAocm9sbGVkVXBBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJcm9sbGVkVXBBZGFwdGVyLnNldFJvbGxlZFVwKHRydWUpOwotCQkJCX0KLQkJCX0KLQotCQkJZmluZF9jaGlsZDogd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCQkmJiAoKE1ldGhvZEVsZW1lbnQpIGUpLmdldEd1aWQoKS5lcXVhbHMoZ3VpZFBhdGhbaV0pKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJb2JqZWN0ID0gY2hpbGQ7Ci0JCQkJCWJyZWFrIGZpbmRfY2hpbGQ7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIWZvdW5kKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGJyZWFrZG93biBlbGVtZW50IGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuCi0JICogPGNvZGU+Z3VpZFBhdGg8L2NvZGU+IGlzIHN1cHByZXNzZWQgaW4gdGhlIHByb2Nlc3Mgb2YgdGhpcyBTdXBwcmVzc2lvbgotCSAqIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBndWlkUGF0aAotCSAqIEByZXR1cm4KLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gcGF0aCBjb3VsZCBub3QgYmUgZm91bmQgdXNpbmcKLQkgKiAgICAgICAgICAgICAgICB0aGUgZ2l2ZW4gYWRhcHRlciBmYWN0b3J5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwcmVzc2VkKFN0cmluZ1tdIGd1aWRQYXRoLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkKLQkJCXRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlPYmplY3Qgb2JqZWN0ID0gZ2V0T2JqZWN0QnlQYXRoKGd1aWRQYXRoLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIkNvdWxkIG5vdCBmaW5kIG9iamVjdCB3aXRoIHBhdGggJyIgKyBndWlkUGF0aCArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBpc1N1cHByZXNzZWQob2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzZXQgb2Ygc3VwcHJlc3NlZCBpdGVtIG9mIHRoZSBnaXZlbiBwcm9jZXNzZXMuCi0JICogCi0JICogQHBhcmFtIHByb2MKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcmllcwotCSAqICAgICAgICAgICAgdGhlIGFkYXB0ZXIgZmFjdG9yaWVzIGZvciBXQlMsIFRCUywgV1BCUywgYW5kIENCUyB2aWV3cwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNldCBnZXRTdXBwcmVzc2VkSXRlbXMoUHJvY2VzcyBwcm9jLAotCQkJQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzKSB7Ci0JCVNldCBzdXBwcmVzc2VkSXRlbXMgPSBuZXcgSGFzaFNldCgpOwotCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IG5ldyBTdXBwcmVzc2lvbihwcm9jKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVyRmFjdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoCi0JCQkJCWFkYXB0ZXJGYWN0b3JpZXNbaV0sIHByb2MpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgaXRlbSA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChzdXBwcmVzc2lvbi5pc1N1cHByZXNzZWQoaXRlbSkpIHsKLQkJCQkJc3VwcHJlc3NlZEl0ZW1zLmFkZChpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cHByZXNzZWRJdGVtczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFN1cHByZXNzaW9uQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkJcHJpdmF0ZSBMaXN0IGNvbGxlY3Rpb247Ci0KLQkJcHJpdmF0ZSBSZXN1bHQgcmVzdWx0OwotCi0JCXByaXZhdGUgYm9vbGVhbiBzdXBwcmVzc2VkOwotCi0JCXByaXZhdGUgU3VwcHJlc3Npb24gc3VwcHJlc3Npb247Ci0KLQkJcHVibGljIFN1cHByZXNzaW9uQ29tbWFuZChTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgTGlzdCBzZWxlY3Rpb24sCi0JCQkJYm9vbGVhbiBzdXBwcmVzc2VkKSB7Ci0JCQl0aGlzLnN1cHByZXNzaW9uID0gc3VwcHJlc3Npb247Ci0JCQljb2xsZWN0aW9uID0gc2VsZWN0aW9uOwotCQkJdGhpcy5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JCSAqLwotCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJCWlmIChtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHN1cHByZXNzaW9uCi0JCQkJCQkuZ2V0UHJvY2VzcygpLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJcmVzdWx0ID0gc3VwcHJlc3Npb24uc2V0U3VwcHJlc3NlZChjb2xsZWN0aW9uLCBzdXBwcmVzc2VkKTsKLQkJCWRpZEV4ZWN1dGUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGRpZEV4ZWN1dGUoKSB7Ci0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQkJZXhlY3V0ZSgpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgdW5kbygpIHsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiAhcmVzdWx0LmlzRW1wdHkoKSkgewotCQkJCWlmICghcmVzdWx0LmVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXN1bHQuZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJCQllLnNldFN1cHByZXNzZWQoQm9vbGVhbi52YWx1ZU9mKCFzdXBwcmVzc2VkKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFyZXN1bHQucGF0aHMuaXNFbXB0eSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc3VsdC5wYXRocy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBwYXRoID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoc3VwcHJlc3NlZCkgewotCQkJCQkJCXN1cHByZXNzaW9uLmdldFN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocygpCi0JCQkJCQkJCQkucmVtb3ZlKHBhdGgpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlzdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMoKQotCQkJCQkJCQkJLmFkZChwYXRoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlkaWRVbmRvKCk7Ci0JCQkJcmVzdWx0LmNsZWFyKCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBkaWRVbmRvKCkgewotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjcHJlcGFyZSgpCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0UmVzdWx0KCkKLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJCWlmICghcmVzdWx0LmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBjb2xsZWN0aW9uOwotCQkJfQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJCXJldHVybiBjb2xsZWN0aW9uOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNSZWFkT25seUVsZW1lbnRBZmZlY3RlZCgpIHsKLQkJCXJldHVybiAhcmVzdWx0LnBhdGhzLmlzRW1wdHkoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQuY2xlYXIoKTsKLQkJCX0KLQotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9UbmdVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9UbmdVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ2NzEyMTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvVG5nVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsLkNvcGllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuU2V0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BdHRyaWJ1dGVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5GZWF0dXJlTWFwRW50cnlXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuTmV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Db3B5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLk1vdmVEb3duQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Nb3ZlVXBDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlByb2Nlc3NEZWVwQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwudXRpbC5TdHJpbmdSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLk5hbWVDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuTWVzc2FnZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3Mgd2l0aCBzdGF0aWMgbWV0aG9kcyBmb3IgbWV0aG9kIGF1dGhvcmluZwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRuZ1V0aWwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBVbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB1bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSA9IG5ldyBVbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJREFOQ0VfRklMRVNUUklOR19TRVBBUkFUT1IgPSAifCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlEQU5DRV9GSUxFU1RSSU5HX1NFUEFSQVRPUl9TUExJVFRFUiA9ICJcXHwiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DQVRFR09SWV9QUk9QRVJUWSA9ICJQVUJMSVNIX0NBVEVHT1JZIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIGFkYXB0ZXJzIHRoYXQgYXJlIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBjbGFzcyBmcm9tIHRoZSBnaXZlbgotCSAqIEVPYmplY3QuCi0JICogCi0JICogQHBhcmFtIGVPYmoKLQkgKiBAcGFyYW0gY2xzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFkYXB0ZXJzKEVPYmplY3QgZU9iaiwgQ2xhc3MgY2xzKSB7Ci0JCWZvciAoSXRlcmF0b3IgYWRhcHRlcnMgPSBlT2JqLmVBZGFwdGVycygpLml0ZXJhdG9yKCk7IGFkYXB0ZXJzCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBhZGFwdGVycy5uZXh0KCk7Ci0JCQlpZiAoY2xzLmlzSW5zdGFuY2UoYWRhcHRlcikpIHsKLQkJCQlhZGFwdGVycy5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEFkYXB0ZXIoRU9iamVjdCBlT2JqLCBDbGFzcyBjbHMpIHsKLQkJZm9yIChJdGVyYXRvciBhZGFwdGVycyA9IGVPYmouZUFkYXB0ZXJzKCkuaXRlcmF0b3IoKTsgYWRhcHRlcnMKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGFkYXB0ZXJzLm5leHQoKTsKLQkJCWlmIChjbHMuaXNJbnN0YW5jZShhZGFwdGVyKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQWRhcHRlciBhZGFwdChBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBOb3RpZmllciBub3RpZmllciwKLQkJCU9iamVjdCB0eXBlLCBDbGFzcyB2aWV3VHlwZSkgewotCQlmb3IgKEl0ZXJhdG9yIGFkYXB0ZXJzID0gbm90aWZpZXIuZUFkYXB0ZXJzKCkuaXRlcmF0b3IoKTsgYWRhcHRlcnMKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGFkYXB0ZXJzLm5leHQoKTsKLQkJCWlmIChhZGFwdGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkgJiYgdmlld1R5cGUuaXNJbnN0YW5jZShhZGFwdGVyKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWN0b3J5LmFkYXB0TmV3KG5vdGlmaWVyLCB0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEZpbGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChuYW1lLmluZGV4T2YoJy8nKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJ1xcJykgIT0gLTEKLQkJCQl8fCBuYW1lLmluZGV4T2YoJzonKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJyonKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJz8nKSAhPSAtMSAKLQkJCQl8fCBuYW1lLmluZGV4T2YoJyInKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJzwnKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJz4nKSAhPSAtMQotCQkJCXx8IG5hbWUuaW5kZXhPZignfCcpICE9IC0xIHx8IG5hbWUuaW5kZXhPZignOycpICE9IC0xIHx8IG5hbWUuaW5kZXhPZignJicpICE9IC0xKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogdmFsaWRhdGUgdGhlIHN0cmluZyBmb3IgYSBwbHVnaW4gbmFtZQotCSAqIAotCSAqIEBwYXJhbSBuYW1lIFN0cmluZwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRQbHVnaW5OYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChpc1ZhbGlkRmlsZU5hbWUobmFtZSkgPT0gZmFsc2UgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCS8vIG5lZWQgdG8gcmVtb3ZlIHRoZXNlIGNoYXJhY3RlcnMgc2luY2UgdGhleSBjYXVzZWQgcHJvYmxlbSB3aXRoIGVsZW1lbnQgdXJsIGVuY29kaW5nLCBib29rbWFyayBpc3N1ZSwgCi0JCS8vIGFuZCBqYXZhc2NyaXB0IHN0cmluZyBsaXRlcm5hbCBlc2NhcGluZyBpc3N1ZQotCQkvLyBzZWUgMTU2OTQ2IC0gcGx1Z2luIG5hbWUgc2hvdWxkIG5vdCBhbGxvdyAlLCAjLCBhbmQgJwotCQlpZiAobmFtZS5pbmRleE9mKCclJykgIT0gLTEgfHwgbmFtZS5pbmRleE9mKCcjJykgIT0gLTEKLQkJCQl8fCBuYW1lLmluZGV4T2YoJ1wnJykgIT0gLTEgKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgZm9yIHRoZSBnaXZlbiBFT2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlT2JqCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gZUNsYXNzZXMKLQkgKiAgICAgICAgICAgIGNvbGxlY3Rpb24gb2YgRUNsYXNzIG9iamVjdHMuIFRoZSBFT2JqZWN0IGluc3RhbmNlcyBvZiB0aGVzZQotCSAqICAgICAgICAgICAgRUNsYXNzIG9iamVjdHMgd2lsbCBiZSBzYXZlZCBpbiB0aGVpciBvd24gZGlyZWN0b3J5LgotCSAqIEByZXR1cm4gbnVsbCBpZiBzdWNjZXNzZnVsLCBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja05hbWUoTmFtZWRFbGVtZW50IGUsIFN0cmluZyBuYW1lLAotCQkJQ29sbGVjdGlvbiBlQ2xhc3NlcykgewotCQlyZXR1cm4gY2hlY2tOYW1lKCgoRU9iamVjdCkgZSkuZUNvbnRhaW5lcigpLCBlLCBuYW1lLCBUbmdVdGlsCi0JCQkJLmdldFR5cGVUZXh0KGUpLCBlQ2xhc3Nlcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lKEVPYmplY3QgcGFyZW50LCBOYW1lZEVsZW1lbnQgZSwgU3RyaW5nIG5hbWUsCi0JCQlTdHJpbmcgZWxlbWVudFR5cGVUZXh0LCBDb2xsZWN0aW9uIGVDbGFzc2VzKSB7Ci0JCVN0cmluZyBtc2cgPSBjaGVja0VsZW1lbnROYW1lKG5hbWUsIGVsZW1lbnRUeXBlVGV4dCk7Ci0JCWlmIChtc2cgIT0gbnVsbCkKLQkJCXJldHVybiBtc2c7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlMaXN0IGNoaWxkcmVuID0gcGFyZW50LmVDb250ZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlOYW1lZEVsZW1lbnQgY2hpbGQgPSAoTmFtZWRFbGVtZW50KSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQlpZiAoY2hpbGQgIT0gZSAmJiBpc0VDbGFzc0luc3RhbmNlT2YoZUNsYXNzZXMsIGNoaWxkKQotCQkJCQkmJiBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoY2hpbGQuZ2V0TmFtZSgpKSkgewotCQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csIG5hbWUpOyAKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja05hbWUoRU9iamVjdCBwYXJlbnQsIE5hbWVkRWxlbWVudCBlLCBTdHJpbmcgbmFtZSwKLQkJCVN0cmluZyBlbGVtZW50VHlwZVRleHQsIElGaWx0ZXIgY2hpbGRGaWx0ZXIpIHsKLQkJU3RyaW5nIG1zZyA9IGNoZWNrRWxlbWVudE5hbWUobmFtZSwgZWxlbWVudFR5cGVUZXh0KTsKLQkJaWYgKG1zZyAhPSBudWxsKQotCQkJcmV0dXJuIG1zZzsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZUNvbnRlbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCU5hbWVkRWxlbWVudCBjaGlsZCA9IChOYW1lZEVsZW1lbnQpIGNoaWxkcmVuLmdldChpKTsKLQkJCWlmIChjaGlsZCAhPSBlICYmIGNoaWxkRmlsdGVyLmFjY2VwdChjaGlsZCkKLQkJCQkJJiYgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKGNoaWxkLmdldE5hbWUoKSkpIHsKLQkJCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLCBuYW1lKTsgCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBuYW1lIGNhbiBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4gVGhlIG1ldGhvZAotCSAqIGFzc3VtZSB0aGF0IHRoZSBnaXZlbiBlbGVtZW50IHdpbGwgYmUgc2F2ZWQgdW5kZXIgdGhlIGdpdmVuIGRpcmVjdG9yeQotCSAqIHVzaW5nIHRoZSBnaXZlbiBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiAgICAgICAgICAgIERpcmVjdG9yeSB3aGVyZSB0aGUgZ2l2ZW4gZWxlbWVudCB3aWxsIGJlIHNhdmVkIGluIGEgZmlsZSBvciBhCi0JICogICAgICAgICAgICBkaXJlY3RvcnkgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBpc0RpcgotCSAqIEBwYXJhbSBzaWJsaW5ncwotCSAqICAgICAgICAgICAgZXhpc2l0aW5nIHNpYmxpbmdzIG9mIHRoZSBnaXZlbiBlbGVtZW50IDxjb2RlPmU8L2NvZGU+Ci0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IGl0cyBuYW1lIHRvIGJlIGNoZWNrZWQuCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBzdWdnZXN0ZWQgbmV3IG5hbWUgZm9yIHRoZSBnaXZlbiBlbGVtZW50IDxjb2RlPmU8L2NvZGU+Ci0JICogQHBhcmFtIHR5cGVMYWJlbAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgdHlwZSBsYWJlbC4KLQkgKiBAcGFyYW0gaXNEaXIKLQkgKiAgICAgICAgICAgIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBnaXZlbiBlbGVtZW50IHdpbGwgYmUgc2F2ZWQgYQotCSAqICAgICAgICAgICAgZGlyZWN0b3J5Ci0JICogQHJldHVybiBudWxsIGlmIHRoZSBnaXZlbiBuYW1lIGNhbiBiZSB1c2VkLCBhbiBlcnJvciBtZXNzYWdlIGlmIHRoZSBuYW1lCi0JICogICAgICAgICBpcyBhbHJlYWR5IHRha2VuLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShGaWxlIGRpciwgQ29sbGVjdGlvbiBzaWJsaW5ncywKLQkJCU5hbWVkRWxlbWVudCBlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGVsZW1lbnRUeXBlVGV4dCwgYm9vbGVhbiBpc0RpcikgewotCQlTdHJpbmcgbXNnID0gY2hlY2tFbGVtZW50TmFtZShuYW1lLCBlbGVtZW50VHlwZVRleHQpOwotCQlpZiAobXNnICE9IG51bGwpCi0JCQlyZXR1cm4gbXNnOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBuYW1lOwotCQlpZiAoIWlzRGlyKSB7Ci0JCQlmaWxlTmFtZSA9IGZpbGVOYW1lICsgKChJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcilTZXJ2aWNlcy5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlcigpKS5nZXRGaWxlRXh0ZW5zaW9uKGUpOwotCQl9Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpciwgZmlsZU5hbWUpOwotCQlGaWxlIGN1cnJlbnRGaWxlID0gbnVsbDsKLQkJaWYgKGUgIT0gbnVsbCAmJiBlLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCWN1cnJlbnRGaWxlID0gbmV3IEZpbGUoZS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlpZiAoaXNEaXIpIHsKLQkJCQljdXJyZW50RmlsZSA9IGN1cnJlbnRGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCX0KLQkJfQotCQlib29sZWFuIGIgPSBmaWxlLmV4aXN0cygpOwotCQlpZiAoYiAmJiAhZmlsZS5lcXVhbHMoY3VycmVudEZpbGUpKSB7Ci0JCQltc2cgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZywgbmFtZSk7IAotCQkJT2JqZWN0W10gcGFyYW1zID0gbmV3IE9iamVjdFsyXTsKLQkJCWlmIChmaWxlLmlzRmlsZSgpKSB7Ci0JCQkJcGFyYW1zWzBdID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZmlsZV90ZXh0OyAKLQkJCX0gZWxzZSB7Ci0JCQkJcGFyYW1zWzBdID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZGlyZWN0b3J5X3RleHQ7IAotCQkJfQotCQkJcGFyYW1zWzFdID0gZmlsZTsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChtc2csIHBhcmFtcykudG9TdHJpbmcoKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzaWJsaW5ncy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5hbWVkRWxlbWVudCBjaGlsZCA9IChOYW1lZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkICE9IGUgJiYgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKGNoaWxkLmdldE5hbWUoKSkpIHsKLQkJCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLCBuYW1lKTsgCi0JCQl9Ci0JCX0KLQkJLy8gCi0JCXJldHVybiBudWxsOwotCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tFbGVtZW50TmFtZShTdHJpbmcgbmFtZSwgU3RyaW5nIGVsZW1lbnRUeXBlVGV4dCkgewotCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZywgU3RyVXRpbC50b0xvd2VyKGVsZW1lbnRUeXBlVGV4dCkpOyAKLQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiICIpKSAvLyROT04tTkxTLTEkCi0JCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZEVsZW1lbnROYW1lRXJyb3IxX21zZywgbmFtZSk7IAotCQlpZiAobmFtZS5lbmRzV2l0aCgiLiIpKSAvLyROT04tTkxTLTEkCi0JCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZEVsZW1lbnROYW1lRXJyb3IyX21zZywgbmFtZSk7IAkJCi0JCWlmICghaXNWYWxpZEZpbGVOYW1lKG5hbWUpKQotCQkJLy8JCXJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmludmFsaWRFbGVtZW50TmFtZUVycm9yM19tc2csIG5hbWUpOyAKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tQbHVnaW5OYW1lKFN0cmluZyBuYW1lKSB7Ci0JCi0JCVN0cmluZyBlcnJvciA9IGNoZWNrRWxlbWVudE5hbWUobmFtZSwgVG5nVXRpbC5nZXRUeXBlVGV4dCgiTWV0aG9kUGx1Z2luIikgKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIGVycm9yICE9IG51bGwgKSB7Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLQkJCi0JCS8vIDE1Njk0NiAtIHBsdWdpbiBuYW1lIHNob3VsZCBub3QgYWxsb3cgJSwgIywgYW5kICcKLQkJaWYgKCFpc1ZhbGlkUGx1Z2luTmFtZShuYW1lKSApIHsKLQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjNfbXNnLCBuYW1lKTsgCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tBY3Rpdml0eU5hbWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIGlmKCFpc1ZhbGlkRmlsZU5hbWUobmFtZSkpIHJldHVybiAiSW52YWxpZCBuYW1lOiAnIiArIG5hbWUgKyAiJy4gVGhlCi0JCS8vIG5hbWUgY2Fubm90IGNvbnRhaW4gZm9sbG93aW5nIGNoYXJhY3RlcnM6IFxcIC8gOiAqID8gXCIgPCA+IHwiOwotCQlyZXR1cm4gTmFtZUNoZWNrZXIuY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCAoQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0LCBBY3Rpdml0eS5jbGFzcywKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCBuYW1lLCBzdXBwcmVzc2lvbik7Ci0JfQotCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1dCU0FjdGl2aXR5TmFtZShPYmplY3QgYWN0LCBTdHJpbmcgbmFtZSkgewotLy8JCXJldHVybiBjaGVja0FjdGl2aXR5TmFtZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotLy8JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGFjdCwgbmFtZSk7Ci0vLwl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1dCU0FjdGl2aXR5UHJlc2VudGF0aW9uTmFtZShPYmplY3QgYWN0LAotCQkJU3RyaW5nIG5hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCWlmICghKGFjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gTmFtZUNoZWNrZXIuY2hlY2tOYW1lKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIChCcmVha2Rvd25FbGVtZW50KSBhY3QsIEFjdGl2aXR5LmNsYXNzLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksCi0JCQkJbmFtZSwgc3VwcHJlc3Npb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrV29ya0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKE9iamVjdCBlLAotCQkJU3RyaW5nIG5hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCWlmICghKGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIE5hbWVDaGVja2VyLmNoZWNrTmFtZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCAoQnJlYWtkb3duRWxlbWVudCkgZSwKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcywgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLCBuYW1lLCBzdXBwcmVzc2lvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tXb3JrUHJvZHVjdERlc2NyaXB0b3JQcmVzZW50YXRpb25OYW1lKE9iamVjdCBlLAotCQkJU3RyaW5nIG5hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCWlmICghKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBOYW1lQ2hlY2tlci5jaGVja05hbWUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgKEJyZWFrZG93bkVsZW1lbnQpIGUsCi0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksIG5hbWUsIHN1cHByZXNzaW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1JvbGVEZXNjcmlwdG9yUHJlc2VudGF0aW9uTmFtZShPYmplY3QgZSwKLQkJCVN0cmluZyBuYW1lLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQlpZiAoIShlIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBOYW1lQ2hlY2tlci5jaGVja05hbWUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgKEJyZWFrZG93bkVsZW1lbnQpIGUsIFJvbGVEZXNjcmlwdG9yLmNsYXNzLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksCi0JCQkJbmFtZSwgc3VwcHJlc3Npb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VDbGFzc0luc3RhbmNlT2YoQ29sbGVjdGlvbiBlQ2xhc3NlcywgT2JqZWN0IG9iaikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlQ2xhc3Nlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlQ2xhc3MuaXNJbnN0YW5jZShvYmopKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnN0YW5jZU9mKENvbGxlY3Rpb24gY2xhc3NlcywgT2JqZWN0IG9iaikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjbGFzc2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ2xhc3MgY2xhenogPSAoQ2xhc3MpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGNsYXp6LmlzSW5zdGFuY2Uob2JqKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBZGFwdGVyRmFjdG9yeSBnZXRCZXN0QWRhcHRlckZhY3RvcnkoCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlyZXR1cm4gKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0TGFiZWwob2JqZWN0LCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMYWJlbChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgYWx0ZXJuYXRpdmVMYWJlbCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIG9iamVjdDsKLQkJCWlmIChlT2JqLmVJc1Byb3h5KCkpIHsKLQkJCQlTdHJpbmcgcGF0aCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSB1cmkgPSBlT2JqLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCkKLQkJCQkJCQkubm9ybWFsaXplKCgoSW50ZXJuYWxFT2JqZWN0KSBlT2JqKS5lUHJveHlVUkkoKSk7Ci0JCQkJCXBhdGggPSB1cmkuaXNGaWxlKCkgPyB1cmkudG9GaWxlU3RyaW5nKCkgOiB1cmkudG9TdHJpbmcoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLwotCQkJCX0KLQkJCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCXBhdGggPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQkiICcnezB9JyciLCBuZXcgT2JqZWN0W10geyBwYXRoIH0pOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJcGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMudW5yZXNvbHZlZF90ZXh0LCBwYXRoKTsgCi0JCQl9Ci0JCX0KLQkJU3RyaW5nIGxhYmVsID0gbnVsbDsKLQkJYm9vbGVhbiBzaG93UHJlc2VudGF0aW9uTmFtZXMgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmlzU2hvd1ByZXNlbnRhdGlvbk5hbWVzKCk7Ci0JCWlmIChzaG93UHJlc2VudGF0aW9uTmFtZXMgJiYgb2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KQotCQkJbGFiZWwgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCWVsc2UgaWYgKHNob3dQcmVzZW50YXRpb25OYW1lcyAmJiBvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KQotCQkJbGFiZWwgPSAoKFByb2Nlc3NDb21wb25lbnQpIG9iamVjdCkuZ2V0UHJvY2VzcygpCi0JCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCWlmIChsYWJlbCA9PSBudWxsIHx8IGxhYmVsLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkJbGFiZWwgPSAoKE5hbWVkRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLnRyaW0oKS5sZW5ndGgoKSA9PSAwID8gYWx0ZXJuYXRpdmVMYWJlbCA6IGxhYmVsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExhYmVsKFZhcmlhYmlsaXR5RWxlbWVudCBvYmplY3QsCi0JCQlTdHJpbmcgYWx0ZXJuYXRpdmVMYWJlbCwgYm9vbGVhbiBwcmVmZXJCYXNlKSB7Ci0JCVN0cmluZyBsYWJlbCA9IFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBhbHRlcm5hdGl2ZUxhYmVsKTsKLQkJaWYgKHByZWZlckJhc2UgJiYgb2JqZWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSA9IG9iamVjdC5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCVN0cmluZyB2YXJpYWJpbGl0eVR4dCA9IG51bGw7Ci0JCQlpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCkgewotCQkJCXZhcmlhYmlsaXR5VHh0ID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuY29udHJpYnV0ZXNUb190ZXh0OyAKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OX0xJVEVSQUwpIHsKLQkJCQkJdmFyaWFiaWxpdHlUeHQgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5sb2NhbENvbnRyaWJ1dGVzVG9fdGV4dDsgCi0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCkgewotCQkJCXZhcmlhYmlsaXR5VHh0ID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZXh0ZW5kc190ZXh0OyAKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVNfTElURVJBTCkgewotCQkJCXZhcmlhYmlsaXR5VHh0ID0gTGlicmFyeUVkaXRSZXNvdXJjZXMucmVwbGFjZXNfdGV4dDsgCi0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UX0xJVEVSQUwpIHsKLQkJCQl2YXJpYWJpbGl0eVR4dCA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmxvY2FsUmVwbGFjZXNfdGV4dDsgCi0JCQl9Ci0JCQlpZiAodmFyaWFiaWxpdHlUeHQgIT0gbnVsbCkgewotCQkJCU1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ob2JqZWN0Ci0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJCQlpZiAoYmFzZVBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJCWxhYmVsID0gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHl3aXRocGx1Z2luX2luZm8sIChuZXcgU3RyaW5nW10gewotCQkJCQlsYWJlbCwKLQkJCQkJdmFyaWFiaWxpdHlUeHQsCi0JCQkJCVRuZ1V0aWwKLQkJCQkJCQkuZ2V0TGFiZWwoCi0JCQkJCQkJCQlvYmplY3QKLQkJCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwKLQkJCQkJCQkJCWFsdGVybmF0aXZlTGFiZWwpLAotCQkJCQliYXNlUGx1Z2luLmdldE5hbWUoKSB9KSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbGFiZWwgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5VdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eV9pbmZvLCAobmV3IFN0cmluZ1tdIHsKLQkJCQkJbGFiZWwsCi0JCQkJCXZhcmlhYmlsaXR5VHh0LAotCQkJCQlUbmdVdGlsLmdldExhYmVsKG9iamVjdAotCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksCi0JCQkJCQkJYWx0ZXJuYXRpdmVMYWJlbCkgfSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgUHJvY2Vzc0NvbXBvbmVudAotCSAqIAotCSAqIEBwYXJhbSBjb21wb25lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZVByb2Nlc3NDb21wb25lbnQoUHJvY2Vzc0NvbXBvbmVudCBjb21wb25lbnQsCi0JCQlFQ2xhc3MgdHlwZSkgewotCQkvLyBjcmVhdGUgbmV3IHByb2Nlc3MgZm9yIHRoZSBwcm9jZXNzIGNvbXBvbmVudAotCQkvLwotCQlQcm9jZXNzIHByb2MgPSBjb21wb25lbnQuZ2V0UHJvY2VzcygpOwotCQlpZiAocHJvYyA9PSBudWxsKSB7Ci0JCQlwcm9jID0gKFByb2Nlc3MpIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZSh0eXBlKTsKLQkJCWNvbXBvbmVudC5zZXRQcm9jZXNzKHByb2MpOwotCQl9Ci0KLQkJLy8gY3JlYXRlIHRvcCBhY3Rpdml0eQotCQkvLwotCQkvLyBpZihwcm9jLmdldFRvcExldmVsQnJlYWtkb3duRWxlbWVudCgpID09IG51bGwpIHsKLQkJLy8gQWN0aXZpdHkgYWN0ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKTsKLQkJLy8gcHJvYy5zZXRUb3BMZXZlbEJyZWFrZG93bkVsZW1lbnQoYWN0KTsKLQkJLy8gY29tcG9uZW50LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGFjdCk7Ci0JCS8vIH0KLQotCQkvLyBjcmVhdGUgV0JTLCBPQlMsIGFuZCBQQlMKLQkJLy8KLQkJLy8gaWYoY29tcG9uZW50LmdldFdCUygpID09IG51bGwpCi0JCS8vIGNvbXBvbmVudC5zZXRXQlMoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV0JTKCkpOwotCQkvLyBpZihjb21wb25lbnQuZ2V0VEJTKCkgPT0gbnVsbCkKLQkJLy8gY29tcG9uZW50LnNldFRCUyhVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUQlMoKSk7Ci0JCS8vIGlmKGNvbXBvbmVudC5nZXRXUEJTKCkgPT0gbnVsbCkKLQkJLy8gY29tcG9uZW50LnNldFdQQlMoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV1BCUygpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEJyZWFrZG93bkVsZW1lbnQgZ2V0UGFyZW50KEJyZWFrZG93bkVsZW1lbnQgYmUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tOdWxsKFN0cmluZyBzdHIpIHsKLQkJcmV0dXJuIChzdHIgPT0gbnVsbCA/ICIiIDogc3RyKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZXNjcmlwdG9yRXhpc3RzKFJvbGUgcm9sZSwgTGlzdCByb2xlRGVzY3JpcHRvckxpc3QpIHsKLQkJZm9yIChpbnQgaSA9IHJvbGVEZXNjcmlwdG9yTGlzdC5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIHJvbGVEZXNjcmlwdG9yTGlzdAotCQkJCQkuZ2V0KGkpOwotCQkJaWYgKHJvbGVEZXNjLmdldFJvbGUoKSA9PSByb2xlKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgY29weShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ29waWVyIGNvcGllciA9IG5ldyBDb3BpZXIoKSB7Ci0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTc4NDY1NzYwMzM5MDQ2OTFMOwotCi0JCQkvKioKLQkJCSAqIENhbGxlZCB0byBoYW5kbGUgdGhlIGNvcHlpbmcgb2YgYSBjcm9zcyByZWZlcmVuY2U7IHRoaXMgYWRkcwotCQkJICogdmFsdWVzIG9yIHNldHMgYSBzaW5nbGUgdmFsdWUgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBtdWx0aXBsaWNpdHkKLQkJCSAqIHdoaWxlIG9taXR0aW5nIGFueSBiaWRpcmVjdGlvbmFsIHJlZmVyZW5jZSBvciBzaW5nbGUgb3Bwb3NpdGUKLQkJCSAqIGZlYXR1cmUncyByZWZlcmVuY2UgdGhhdCBpc24ndCBpbiB0aGUgY29weSBtYXAuCi0JCQkgKiAKLQkJCSAqIEBwYXJhbSBlUmVmZXJlbmNlCi0JCQkgKiAgICAgICAgICAgIHRoZSByZWZlcmVuY2UgdG8gY29weS4KLQkJCSAqIEBwYXJhbSBlT2JqZWN0Ci0JCQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5LgotCQkJICogQHBhcmFtIGNvcHlFT2JqZWN0Ci0JCQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29weSB0by4KLQkJCSAqLwotCQkJcHJvdGVjdGVkIHZvaWQgY29weVJlZmVyZW5jZShFUmVmZXJlbmNlIGVSZWZlcmVuY2UsCi0JCQkJCUVPYmplY3QgZU9iamVjdCwgRU9iamVjdCBjb3B5RU9iamVjdCkgewotCQkJCWlmIChlT2JqZWN0LmVJc1NldChlUmVmZXJlbmNlKSkgewotCQkJCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gT3Bwb3NpdGVGZWF0dXJlLmdldE9wcG9zaXRlRmVhdHVyZShlUmVmZXJlbmNlKTsKLQkJCQkJCi0JCQkJCS8vICJtYW55IiBvcHBvc2l0ZSBmZWF0dXJlIGRvZXMgbm90IHJlcXVpcmUgY29waWVkIHRhcmdldCwgaXQgaXMKLQkJCQkJLy8gdHJlYXRlZCBhcyBhIHJlZ3VsYXIgbm9uLWNvbnRhaW5tZW50IHJlZmVyZW5jZQotCQkJCQkvLyBUT0RPOiBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IGNvcGllZCBpbgotCQkJCQkvLyBFTUYgaW1wbGVtZW50YXRpb24KLQkJCQkJLy8KLQkJCQkJYm9vbGVhbiBjb3BpZWRUYXJnZXRSZXF1aXJlZCA9IGVSZWZlcmVuY2UuZ2V0RU9wcG9zaXRlKCkgIT0gbnVsbAotCQkJCQkJCXx8IChvcHBvc2l0ZUZlYXR1cmUgIT0gbnVsbCAmJiAhb3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKTsKLQkJCQkJCQkJCQkKLQkJCQkJaWYgKGVSZWZlcmVuY2UuaXNNYW55KCkpIHsKLQkJCQkJCUxpc3Qgc291cmNlID0gKExpc3QpIGVPYmplY3QuZUdldChlUmVmZXJlbmNlKTsKLQkJCQkJCUludGVybmFsRUxpc3QgdGFyZ2V0ID0gKEludGVybmFsRUxpc3QpIGNvcHlFT2JqZWN0Ci0JCQkJCQkJCS5lR2V0KGdldFRhcmdldChlUmVmZXJlbmNlKSk7Ci0JCQkJCQlpZiAoc291cmNlLmlzRW1wdHkoKSkgewotCQkJCQkJCXRhcmdldC5jbGVhcigpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgayA9IHNvdXJjZS5pdGVyYXRvcigpOyBrLmhhc05leHQoKTspIHsKLQkJCQkJCQkJT2JqZWN0IHJlZmVyZW5jZWRFT2JqZWN0ID0gay5uZXh0KCk7Ci0JCQkJCQkJCU9iamVjdCBjb3B5UmVmZXJlbmNlZEVPYmplY3QgPSBnZXQocmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCQlpZiAoY29weVJlZmVyZW5jZWRFT2JqZWN0ID09IG51bGwpIHsKLQkJCQkJCQkJCWlmICghY29waWVkVGFyZ2V0UmVxdWlyZWQpIHsKLQkJCQkJCQkJCQl0YXJnZXQuYWRkVW5pcXVlKGluZGV4LAotCQkJCQkJCQkJCQkJcmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCQkJCSsraW5kZXg7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlpZiAoY29waWVkVGFyZ2V0UmVxdWlyZWQpIHsKLQkJCQkJCQkJCQlpbnQgcG9zaXRpb24gPSB0YXJnZXQKLQkJCQkJCQkJCQkJCS5pbmRleE9mKGNvcHlSZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQkJaWYgKHBvc2l0aW9uID09IC0xKSB7Ci0JCQkJCQkJCQkJCXRhcmdldC5hZGRVbmlxdWUoaW5kZXgsCi0JCQkJCQkJCQkJCQkJY29weVJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQkJCQl9IGVsc2UgaWYgKGluZGV4ICE9IHBvc2l0aW9uKSB7Ci0JCQkJCQkJCQkJCXRhcmdldC5tb3ZlKGluZGV4LAotCQkJCQkJCQkJCQkJCWNvcHlSZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQl0YXJnZXQuYWRkVW5pcXVlKGluZGV4LAotCQkJCQkJCQkJCQkJY29weVJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCSsraW5kZXg7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlPYmplY3QgcmVmZXJlbmNlZEVPYmplY3QgPSBlT2JqZWN0LmVHZXQoZVJlZmVyZW5jZSk7Ci0JCQkJCQlpZiAocmVmZXJlbmNlZEVPYmplY3QgPT0gbnVsbCkgewotCQkJCQkJCWNvcHlFT2JqZWN0LmVTZXQoZ2V0VGFyZ2V0KGVSZWZlcmVuY2UpLCBudWxsKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJT2JqZWN0IGNvcHlSZWZlcmVuY2VkRU9iamVjdCA9IGdldChyZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJaWYgKGNvcHlSZWZlcmVuY2VkRU9iamVjdCA9PSBudWxsKSB7Ci0JCQkJCQkJCWlmICghY29waWVkVGFyZ2V0UmVxdWlyZWQpIHsKLQkJCQkJCQkJCWNvcHlFT2JqZWN0LmVTZXQoZ2V0VGFyZ2V0KGVSZWZlcmVuY2UpLAotCQkJCQkJCQkJCQlyZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQljb3B5RU9iamVjdC5lU2V0KGdldFRhcmdldChlUmVmZXJlbmNlKSwKLQkJCQkJCQkJCQljb3B5UmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJTWV0aG9kRWxlbWVudCBjb3B5ID0gKE1ldGhvZEVsZW1lbnQpIGNvcGllci5jb3B5KGVsZW1lbnQpOwotCQljb3BpZXIuY29weVJlZmVyZW5jZXMoKTsKLQotCQkvLyB1bnNldCB0aGUgR1VJRCBvZiB0aGUgY29weSBhbmQgaXRzIG9mZnN0cmluZwotCQkvLwotCQljb3B5LnNldEd1aWQobnVsbCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvcHkuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCSgoTWV0aG9kRWxlbWVudCkgZSkuc2V0R3VpZChudWxsKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFZhcmlhYmlsaXR5RWxlbWVudCBnZXRCYXNlKFZhcmlhYmlsaXR5RWxlbWVudCBjKSB7Ci0JCWZvciAoOyBjLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsOyBjID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgYwotCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpCi0JCQk7Ci0JCXJldHVybiBjOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29udGVudENhdGVnb3J5IGZpbmRJbmhlcml0ZWQoQ29sbGVjdGlvbiBpbmhlcml0ZWRMaXN0LAotCQkJQ29udGVudENhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGluaGVyaXRlZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgZWxlbWVudCA9IChDb250ZW50Q2F0ZWdvcnkpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwKLQkJCQkJJiYgKGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IGNhdGVnb3J5IHx8IGVsZW1lbnQKLQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IGNhdGVnb3J5Ci0JCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkpCi0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb250ZW50Q2F0ZWdvcnkgcmVtb3ZlSW5oZXJpdGVkKExpc3QgaW5oZXJpdGVkTGlzdCwKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbmhlcml0ZWRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ29udGVudENhdGVnb3J5IGVsZW1lbnQgPSAoQ29udGVudENhdGVnb3J5KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBjYXRlZ29yeSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIoTWV0aG9kUGx1Z2luIG1vZGVsKSB7Ci0JCUlHcm91cENvbnRhaW5lciBncm91cENvbnRhaW5lciA9IChJR3JvdXBDb250YWluZXIpIFRuZ1V0aWwuZ2V0QWRhcHRlcigKLQkJCQkoRU9iamVjdCkgbW9kZWwsIElHcm91cENvbnRhaW5lci5jbGFzcyk7Ci0JCWlmIChncm91cENvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQlncm91cENvbnRhaW5lciA9IChJR3JvdXBDb250YWluZXIpIGdyb3VwQ29udGFpbmVyCi0JCQkJCS5nZXRHcm91cEl0ZW1Qcm92aWRlcihMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZ3JvdXBDb250YWluZXIKLQkJCQkJLmdldEdyb3VwSXRlbVByb3ZpZGVyKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHROYW1lKExpc3Qgc2libGluZ3MsIE1ldGhvZEVsZW1lbnQgZSwKLQkJCVN0cmluZyBiYXNlTmFtZSkgewotCQlpZiAoZS5nZXROYW1lKCkgIT0gbnVsbCAmJiBlLmdldE5hbWUoKS50cmltKCkubGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNOYW1lVGFrZW4oc2libGluZ3MsIGUsIGJhc2VOYW1lKSkgewotCQkJZS5zZXROYW1lKGJhc2VOYW1lKTsKLQkJCXNldFByZXNlbnRhdGlvbk5hbWUoZSwgYmFzZU5hbWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGkgPSAyOyB0cnVlOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gYmFzZU5hbWUgKyAnXycgKyBpOwotCQkJaWYgKCFpc05hbWVUYWtlbihzaWJsaW5ncywgZSwgbmFtZSkpIHsKLQkJCQllLnNldE5hbWUobmFtZSk7Ci0JCQkJc2V0UHJlc2VudGF0aW9uTmFtZShlLCBuYW1lKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNldFByZXNlbnRhdGlvbk5hbWUoTWV0aG9kRWxlbWVudCBlLCBTdHJpbmcgYmFzZU5hbWUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBkZSA9IChEZXNjcmliYWJsZUVsZW1lbnQpIGU7Ci0KLQkJCVN0cmluZ0J1ZmZlciBwcmVzTmFtZUJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYmFzZU5hbWUsICJfIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgYVdvcmQgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQlwcmVzTmFtZUJ1Zi5hcHBlbmQoYVdvcmQuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkKLQkJCQkJCSsgYVdvcmQuc3Vic3RyaW5nKDEpICsgIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlkZS5zZXRQcmVzZW50YXRpb25OYW1lKHByZXNOYW1lQnVmLnRvU3RyaW5nKCkudHJpbSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOYW1lVGFrZW4oTGlzdCBzaWJsaW5ncywgTWV0aG9kRWxlbWVudCBlLAotCQkJU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IHNpYmxpbmdzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlNZXRob2RFbGVtZW50IHNpYmxpbmcgPSAoTWV0aG9kRWxlbWVudCkgc2libGluZ3MuZ2V0KGkpOwotCQkJaWYgKHNpYmxpbmcgIT0gZSAmJiBuYW1lLmVxdWFscyhzaWJsaW5nLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGV4dHJhY3QoQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBDbGFzcyBjbHMpIHsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNscy5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQkJbGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHROYW1lKElEZWZhdWx0TmFtZVNldHRlciBkZWZhdWx0TmFtZVNldHRlciwKLQkJCU5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpICE9IG51bGwpIHsKLQkJCWludCBmZWF0dXJlSWQgPSBtc2cuZ2V0RmVhdHVyZUlEKGRlZmF1bHROYW1lU2V0dGVyCi0JCQkJCS5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSk7Ci0JCQlpZiAoZmVhdHVyZUlkID09IGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSkgewotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlkZWZhdWx0TmFtZVNldHRlci5zZXREZWZhdWx0TmFtZShtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCWRlZmF1bHROYW1lU2V0dGVyLnNldERlZmF1bHROYW1lKGl0ZXIubmV4dCgpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYmFzZUNhdGVnb3J5Ci0JICogQHBhcmFtIG1ldGhvZENvbmYKLQkgKiBAcGFyYW0gY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkRXh0ZW5kZWRDaGlsZHJlbihDb250ZW50Q2F0ZWdvcnkgYmFzZUNhdGVnb3J5LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25mLCBDb2xsZWN0aW9uIGNoaWxkcmVuLAotCQkJU3RyaW5nW10gY2F0ZWdvcnlQa2dQYXRoKSB7Ci0JCU1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oYmFzZUNhdGVnb3J5KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbWV0aG9kQ29uZi5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCWlmIChNaXNjLmlzQmFzZU9mKGJhc2VQbHVnaW4sIHBsdWdpbikpIHsKLQkJCQlDb250ZW50UGFja2FnZSBjYXRlZ29yeVBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJCWNhdGVnb3J5UGtnUGF0aCk7Ci0JCQkJaWYgKGNhdGVnb3J5UGtnICE9IG51bGwKLQkJCQkJCSYmIG1ldGhvZENvbmYuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKAotCQkJCQkJCQljYXRlZ29yeVBrZykpIHsKLQkJCQkJQ29udGVudENhdGVnb3J5IGNhdGVnb3J5ID0gZmluZEluaGVyaXRlZChjYXRlZ29yeVBrZwotCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgYmFzZUNhdGVnb3J5KTsKLQkJCQkJaWYgKGNhdGVnb3J5ICE9IG51bGwpIHsKLQkJCQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJCQkJLmFkYXB0KGNhdGVnb3J5LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCQkJCVN5c3RlbS5lcnIKLQkJCQkJCQkJCS5wcmludGxuKCJEaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuYWRkRXh0ZW5kZWRDaGlsZHJlbigpOiBjb3VsZCBub3QgZmluZCBhZGFwdGVyIGZvciAiICsgY2F0ZWdvcnkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWRhcHRlci5nZXRDaGlsZHJlbihjYXRlZ29yeSkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgY2hpbGQgPSAoT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJQ29udGVudEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkJCQkJZWxlbWVudCA9IChDb250ZW50RWxlbWVudCkgY2hpbGQ7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChlbGVtZW50ICE9IG51bGwKLQkJCQkJCQkJCSYmIGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IG51bGwpIHsKLQkJCQkJCQkJLy8gdGhpcyBpcyBhbiBvd24gY2hpbGQgb2YgYW4gZXh0ZW5kZWQgY2F0ZWdvcnkKLQkJCQkJCQkJLy8gaXQgbXVzdCBiZSBhZGRlZCB0byB0aGUgY2hpbGQgbGlzdCBvZiB0aGUKLQkJCQkJCQkJLy8gYmFzZSBjYXRlZ29yeSBpbiB0aGUgY29uZmlndXJhdGlvbi4KLQkJCQkJCQkJLy8KLQkJCQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIGNvbGxlY3QgdGhlIG93biBjaGlsZHJlbiBvZiB0aGUgZXh0ZW5kZWQgY2F0ZWdvcmllcwotCQkJCQkJLy8gb2YgdGhpcyBjYXRlZ29yeSBkb3duIHRoZSBpbmhlcml0YW5jZSB0cmVlCi0JCQkJCQkvLwotCQkJCQkJYWRkRXh0ZW5kZWRDaGlsZHJlbihjYXRlZ29yeSwgbWV0aG9kQ29uZiwgY2hpbGRyZW4sCi0JCQkJCQkJCWNhdGVnb3J5UGtnUGF0aCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEFsbFRvKExpc3QgYWxsQ2hpbGRyZW4sIExpc3QgbmV3Q2hpbGRyZW4pIHsKLQkJaW50IGlkOwotCQlCcmVha2Rvd25FbGVtZW50IGNoaWxkLCBuZXh0LCBsYXN0OwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUoIW5ld0NoaWxkcmVuLmlzRW1wdHkoKSkgewotCQkJY2hpbGQgPSAoQnJlYWtkb3duRWxlbWVudCkgbmV3Q2hpbGRyZW4ucmVtb3ZlKDApOwotCQkJbGlzdC5jbGVhcigpOwotCQkJbGlzdC5hZGQoY2hpbGQpOwotCQkJbGFzdCA9IG51bGw7Ci0JCQkKLQkJCS8vIGZpbmQgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgY2hhaW4gaW4gbmV3IGNoaWxkcmVuIGxpc3QKLQkJCS8vCi0JCQlmaW5kX2xhc3Q6Ci0JCQlmb3IobmV4dCA9IGNoaWxkLmdldFByZXNlbnRlZEFmdGVyKCk7IG5leHQgIT0gbnVsbDsgbmV4dCA9IG5leHQuZ2V0UHJlc2VudGVkQWZ0ZXIoKSkgewotCQkJCWxhc3QgPSBuZXh0OwotCQkJCWlkID0gaW5kZXhPZk5leHRFbGVtZW50KG5ld0NoaWxkcmVuLCBuZXh0KTsKLQkJCQlpZihpZCA9PSAtMSkgewotCQkJCQlicmVhayBmaW5kX2xhc3Q7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlsaXN0LmFkZChuZXdDaGlsZHJlbi5yZW1vdmUoaWQpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZihsYXN0ICE9IG51bGwpIHsKLQkJCQlpZCA9IGluZGV4T2ZOZXh0RWxlbWVudChhbGxDaGlsZHJlbiwgbGFzdCk7Ci0JCQkJaWYoaWQgPT0gLTEpIHsKLQkJCQkJYWxsQ2hpbGRyZW4uYWRkQWxsKGxpc3QpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYWxsQ2hpbGRyZW4uYWRkQWxsKGlkLCBsaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhbGxDaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gY2hpbGQgdG8gdGhlIGFsbENoaWxkcmVuIGxpc3QgYmFzZWQgb24gdGhlIHByZXNlbnRlZEJlZm9yZQotCSAqIG9mIGNoaWxkLgotCSAqIAotCSAqIEBwYXJhbSBhbGxDaGlsZHJlbgotCSAqIEBwYXJhbSBjaGlsZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUbyhMaXN0IGFsbENoaWxkcmVuLCBCcmVha2Rvd25FbGVtZW50IGNoaWxkLAotCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlCcmVha2Rvd25FbGVtZW50IG5leHQgPSBjaGlsZC5nZXRQcmVzZW50ZWRBZnRlcigpOwotCQlpbnQgaWQ7Ci0JCWlmIChuZXh0ID09IG51bGwpIHsKLQkJCWlkID0gLTE7Ci0JCX0gZWxzZSB7Ci0JCQlpZCA9IGluZGV4T2ZOZXh0RWxlbWVudChhbGxDaGlsZHJlbiwgbmV4dCk7Ci0JCQkvLyBpZihpZCA9PSAtMSkgewotCQkJLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJUbmdVdGlsLmFkZFRvKCk6IGludmFsaWQgcHJlc2VudGVkQmVmb3JlCi0JCQkvLyBvZiAiICsgY2hpbGQpOwotCQkJLy8gQnJlYWtkb3duRWxlbWVudCBwcmV2ID0gY2hpbGQuZ2V0UHJlc2VudGVkQmVmb3JlKCk7Ci0JCQkvLyBpZihwcmV2ID09IG51bGwpIHsKLQkJCS8vIGlkID0gMDsKLQkJCS8vIH0KLQkJCS8vIGVsc2UgewotCQkJLy8gaWQgPSBpbmRleE9mKGFsbENoaWxkcmVuLCBwcmV2KTsKLQkJCS8vIGlmKGlkID4gLTEpIHsKLQkJCS8vIGlmKGlkIDwgYWxsQ2hpbGRyZW4uc2l6ZSgpIC0gMSkgewotCQkJLy8gaWQrKzsKLQkJCS8vIH0KLQkJCS8vIGVsc2UgewotCQkJLy8gaWQgPSAtMTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJfQotCQlpZiAoaWQgPT0gLTEpIHsKLQkJCWFsbENoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCX0gZWxzZSB7Ci0JCQlhbGxDaGlsZHJlbi5hZGQoaWQsIGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGluZGV4IG9mIG5leHQgZWxlbWVudCBvZiB0aGUgYnJlYWtkb3duIGVsZW1lbnQgd2hvc2UgcHJlc2VudGVkLWFmdGVyIGVsZW1lbnQgaXMgdGhlIGdpdmVuIAotCSAqIGJyZWFrIGRvd24gZWxlbWVudAotCSAqIEBwYXJhbSBtaXhlZExpc3QKLQkgKiAgICAgICAgICAgIG1peGVkIGxpc3Qgb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgYW5kCi0JICogICAgICAgICAgICBCcmVha2Rvd25FbGVtZW50IG9iamVjdHMKLQkgKiBAcGFyYW0gcHJlc2VudGVkQWZ0ZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4T2ZOZXh0RWxlbWVudChMaXN0IG1peGVkTGlzdCwgQnJlYWtkb3duRWxlbWVudCBwcmVzZW50ZWRBZnRlcikgewotCQlpbnQgc2l6ZSA9IG1peGVkTGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3QgbyA9IHVud3JhcChtaXhlZExpc3QuZ2V0KGkpKTsKLQkJCWlmIChvID09IHByZXNlbnRlZEFmdGVyCi0JCQkJCXx8IChvIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50ICYmICgoVmFyaWFiaWxpdHlFbGVtZW50KW8pLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBwcmVzZW50ZWRBZnRlcikpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBdmFpbGFibGVCYXNlUHJvY2Vzc2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4sCi0JCQlMaXN0IHByb2Nlc3NDbGFzc2VzKSB7Ci0JCUxpc3QgcHJvY2Vzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGFsbEJhc2VQbHVnaW5zID0gTWlzYy5nZXRBbGxCYXNlKHBsdWdpbik7Ci0JCWFsbEJhc2VQbHVnaW5zLmFkZCgwLCBwbHVnaW4pOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbGxCYXNlUGx1Z2lucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlDb2xsZWN0aW9uIHBhY2thZ2VzID0gZ2V0Um9vdFByb2Nlc3NQYWNrYWdlcyhiYXNlUGx1Z2luLAotCQkJCQlwcm9jZXNzQ2xhc3Nlcyk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFja2FnZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IxID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcjEKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBjaGlsZFBrZyA9IChPYmplY3QpIGl0ZXJhdG9yMS5uZXh0KCk7Ci0JCQkJCWlmIChjaGlsZFBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgY2hpbGRQa2cpCi0JCQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkJCQlpZiAoaXNJbnN0YW5jZU9mKHByb2Nlc3NDbGFzc2VzLCBwcm9jKSkgewotCQkJCQkJCXByb2Nlc3Nlcy5hZGQocHJvYyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3NlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRSb290UHJvY2Vzc1BhY2thZ2VQYXRoKENsYXNzIHByb2NDbGFzcykgewotCQlpZiAocHJvY0NsYXNzID09IERlbGl2ZXJ5UHJvY2Vzcy5jbGFzcykgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aDsKLQkJfSBlbHNlIGlmIChwcm9jQ2xhc3MgPT0gQ2FwYWJpbGl0eVBhdHRlcm4uY2xhc3MpIHsKLQkJCXJldHVybiBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aDsKLQkJfSBlbHNlIGlmIChwcm9jQ2xhc3MgPT0gUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuY2xhc3MpIHsKLQkJCXJldHVybiBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnByb2Nlc3NQbGFubmluZ1RlbXBsYXRlUGF0aDsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb24gZ2V0Um9vdFByb2Nlc3NQYWNrYWdlcyhNZXRob2RQbHVnaW4gcGx1Z2luLAotCQkJQ29sbGVjdGlvbiBwcm9jQ2xhc3NlcykgewotCQlMaXN0IHBhY2thZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9jQ2xhc3Nlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUNsYXNzIGNsYXp6ID0gKENsYXNzKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZ1tdIHBhdGggPSBnZXRSb290UHJvY2Vzc1BhY2thZ2VQYXRoKGNsYXp6KTsKLQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQlNZXRob2RQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLCBwYXRoKTsKLQkJCQlpZiAocGtnIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJcGFja2FnZXMuYWRkKHBrZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHBhY2thZ2VzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxQcm9jZXNzZXMoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlMaXN0IHByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbi5nZXRNZXRob2RQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gKE1ldGhvZFBhY2thZ2UpIGl0Lm5leHQoKTsKLQkJCV9pdGVyYXRlUGFja2FnZUZvclByb2Nlc3Nlcyhwa2csIHByb2Nlc3Nlcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc2VzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxQcm9jZXNzZXMoTWV0aG9kUGFja2FnZSBwa2cpIHsKLQkJTGlzdCBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlfaXRlcmF0ZVBhY2thZ2VGb3JQcm9jZXNzZXMocGtnLCBwcm9jZXNzZXMpOwotCi0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgX2l0ZXJhdGVQYWNrYWdlRm9yUHJvY2Vzc2VzKE1ldGhvZFBhY2thZ2UgcGtnLAotCQkJTGlzdCBwcm9jZXNzZXMpIHsKLQkJaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCVByb2Nlc3MgcCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgcGtnKS5nZXRQcm9jZXNzKCk7Ci0JCQlpZiAocCAhPSBudWxsICYmICFwcm9jZXNzZXMuY29udGFpbnMocCkpIHsKLQkJCQlwcm9jZXNzZXMuYWRkKHApOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJX2l0ZXJhdGVQYWNrYWdlRm9yUHJvY2Vzc2VzKChNZXRob2RQYWNrYWdlKSBpdC5uZXh0KCksIHByb2Nlc3Nlcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgZSBpcyBhIHN1YmVsZW1lbnQgb2YgcGFyZW50Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1YmVsZW1lbnRPZihPYmplY3QgcGFyZW50LCBPYmplY3QgZSwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWlmIChwYXJlbnQgPT0gZSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCA9PSBlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKGlzU3ViZWxlbWVudE9mKGVsZW1lbnQsIGUsIGFkYXB0ZXJGYWN0b3J5KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjaGlsZAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1cGVyRWxlbWVudE9mKE9iamVjdCBjaGlsZCwgT2JqZWN0IGUsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlpZiAoY2hpbGQgPT0gZSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGFwdGVyLmdldENoaWxkcmVuKGUpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50ID09IGNoaWxkKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKGlzU3VwZXJFbGVtZW50T2YoY2hpbGQsIGVsZW1lbnQsIGFkYXB0ZXJGYWN0b3J5KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IHVud3JhcChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJZG8gewotCQkJCW9iaiA9ICgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VmFsdWUoKTsKLQkJCX0gd2hpbGUgKG9iaiBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDb21tYW5kV3JhcHBlcikgewotCQkJZG8gewotCQkJCW9iaiA9ICgoQ29tbWFuZFdyYXBwZXIpIG9iaikuZ2V0Q29tbWFuZCgpOwotCQkJfSB3aGlsZSAob2JqIGluc3RhbmNlb2YgQ29tbWFuZFdyYXBwZXIpOwotCQl9Ci0KLQkJcmV0dXJuIG9iajsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBib29sZWFuIHZhbHVlIGJhc2VkIG9uIHdoZXRoZXIgb2JqZWN0IGlzIHdyYXBwZXIgb2JqZWN0IG9yIG5vdAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzV3JhcHBlZChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlciB8fCBvYmogaW5zdGFuY2VvZiBDb21tYW5kV3JhcHBlcikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tbWFuZCB1bndyYXAoQ29tbWFuZCBjbWQpIHsKLQkJd2hpbGUgKGNtZCBpbnN0YW5jZW9mIENvbW1hbmRXcmFwcGVyKSB7Ci0JCQljbWQgPSAoKENvbW1hbmRXcmFwcGVyKSBjbWQpLmdldENvbW1hbmQoKTsKLQkJfQotCi0JCXJldHVybiBjbWQ7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiA8Y29kZT5iYXNlPC9jb2RlPiBpcyB0aGUgYmFzZSBlbGVtZW50IG9mIGFueQotCSAqIGVsZW1lbnQgaW4gdGhlIGdpdmVuIGVsZW1lbnRzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHBhcmFtIGJhc2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmFzZShMaXN0IGVsZW1lbnRzLCBPYmplY3QgYmFzZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCWlmIChiYXNlID09ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KQotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByZXNlbnRhdGlvbk5hbWUoT2JqZWN0IGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCWUgPSAoKENvbnRlbnREZXNjcmlwdGlvbikgZSkuZUNvbnRhaW5lcigpOwotCQl9Ci0KLQkJaWYgKGUgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCWlmIChlIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQluYW1lID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIGUpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJfQotCi0JCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBTdHJVdGlsLmlzQmxhbmsobmFtZSkpIHsKLQkJCW5hbWUgPSAoKE1ldGhvZEVsZW1lbnQpIGUpLmdldE5hbWUoKTsKLQkJfQotCi0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJvY2VzcyBnZXRPd25pbmdQcm9jZXNzKEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlFT2JqZWN0IGNvbnRhaW5lcjsKLQkJZm9yIChjb250YWluZXIgPSBlLmVDb250YWluZXIoKTsgY29udGFpbmVyICE9IG51bGwKLQkJCQkmJiAhKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpOyBjb250YWluZXIgPSBjb250YWluZXIKLQkJCQkuZUNvbnRhaW5lcigpKQotCQkJOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCXJldHVybiAoKFByb2Nlc3NDb21wb25lbnQpIGNvbnRhaW5lcikuZ2V0UHJvY2VzcygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFByb2Nlc3MgZ2V0T3duaW5nUHJvY2VzcyhCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCU9iamVjdCB0b3AgPSB3cmFwcGVyLmdldFRvcEl0ZW0oKTsKLQkJaWYodG9wIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJUHJvY2VzcyBwcm9jID0gKFByb2Nlc3MpIHRvcDsKLQkJCWlmKHByb2MuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCXJldHVybiBwcm9jOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFByb2Nlc3MgZ2V0T3duaW5nUHJvY2VzcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KW9iamVjdCk7Ci0JCX0KLQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuIGdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKW9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhblJlZmVyZW5jZShNZXRob2RFbGVtZW50IHNvdXJjZSwKLQkJCU1ldGhvZEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCU1ldGhvZFBsdWdpbiB0YXJnZXRQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbih0YXJnZXQpOwotCQlNZXRob2RQbHVnaW4gc291cmNlUGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oc291cmNlKTsKLQkJaWYgKHNvdXJjZVBsdWdpbiA9PSB0YXJnZXRQbHVnaW4pCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIE1pc2MuaXNCYXNlT2YodGFyZ2V0UGx1Z2luLCBzb3VyY2VQbHVnaW4pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT3JkZXJJbmZvIGdldE9yZGVySW5mbyhNZXRob2RFbGVtZW50IGUsIFN0cmluZyBvcmRlckluZm9OYW1lKSB7Ci0JCVN0cmluZyBzdHIgPSBlLmdldE9yZGVyaW5nR3VpZGUoKTsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCVJlc291cmNlIHJlcyA9IG5ldyBTdHJpbmdSZXNvdXJjZShzdHIpOwotCQl0cnkgewotCQkJcmVzLmxvYWQobnVsbCk7Ci0JCQlpZiAocmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKQotCQkJCXJldHVybiBudWxsOwotCQkJT3JkZXJJbmZvQ29sbGVjdGlvbiBvcmRlckluZm9zID0gKE9yZGVySW5mb0NvbGxlY3Rpb24pIHJlcwotCQkJCQkuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvcmRlckluZm9zLmdldE9yZGVySW5mb3MoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT3JkZXJJbmZvIG9yZGVySW5mbyA9IChPcmRlckluZm8pIGl0ZXIubmV4dCgpOwotCQkJCWlmIChvcmRlckluZm9OYW1lLmVxdWFsc0lnbm9yZUNhc2Uob3JkZXJJbmZvLmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuIG9yZGVySW5mbzsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvdmlkZXIKLQkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hDb250cmlidXRvcnMoSUNoYW5nZU5vdGlmaWVyIG5vdGlmaWVyLAotCQkJTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwgYm9vbGVhbiBjb250ZW50UmVmcmVzaCwKLQkJCWJvb2xlYW4gbGFiZWxVcGRhdGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Q29udHJpYnV0b3JzKChWYXJpYWJpbGl0eUVsZW1lbnQpIG5vdGlmaWNhdGlvbgotCQkJCS5nZXROb3RpZmllcigpKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJbm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCWVsZW1lbnQsIGNvbnRlbnRSZWZyZXNoLCBsYWJlbFVwZGF0ZSkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFVzZWQgdG8gcmVmcmVzaCBwbHVnaW5zIHRoYXQgZXh0ZW5kIGFub3RoZXIKLQkgKiBAcGFyYW0gbm90aWZpZXIKLQkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCi0JICogQHBhcmFtIGNvbnRlbnRSZWZyZXNoCi0JICogQHBhcmFtIGxhYmVsVXBkYXRlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hQbHVnaW5FeHRlbmRlcnMoSUNoYW5nZU5vdGlmaWVyIG5vdGlmaWVyLAotCQkJTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwgYm9vbGVhbiBjb250ZW50UmVmcmVzaCwKLQkJCWJvb2xlYW4gbGFiZWxVcGRhdGUpIHsKLQkJT2JqZWN0IG9iaiA9IG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRQbHVnaW5EaXJlY3RFeHRlbnNpb25zKAotCQkJCQkoKE1ldGhvZFBsdWdpbikgb2JqKSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlub3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCWVsZW1lbnQsIGNvbnRlbnRSZWZyZXNoLCBsYWJlbFVwZGF0ZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0NvbnRyaWJ1dG9yKFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JCXJldHVybiBoYXNHZW5lcmFsaXplcihlLCBDb2xsZWN0aW9ucwotCQkJCS5zaW5nbGV0b24oVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzR2VuZXJhbGl6ZXIoVmFyaWFiaWxpdHlFbGVtZW50IGUsCi0JCQlDb2xsZWN0aW9uIHZhcmlhYmlsaXR5VHlwZXMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IEFzc29jaWF0aW9uSGVscGVyLmdldEltbWVkaWF0ZVZhcmlldGllcyhlKQotCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICh2YXJpYWJpbGl0eVR5cGVzLmNvbnRhaW5zKGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3IgZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtLCBWYXJpYWJpbGl0eVR5cGUgdHlwZSkgewotCQlMaXN0IHNlbGVjdGVkVmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGFsbFZlcyA9IEFzc29jaWF0aW9uSGVscGVyLmdldEltbWVkaWF0ZVZhcmlldGllcyhlbGVtKTsKLQkJZm9yIChpbnQgaT0wOyBpPGFsbFZlcy5zaXplKCk7IGkrKykgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgYWxsVmVzLmdldChpKTsKLQkJCWlmICh0eXBlID09IHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpKSB7Ci0JCQkJc2VsZWN0ZWRWZXMuYWRkKHZlKTsKLQkJCX0JCQkKLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWRWZXMuaXRlcmF0b3IoKTsKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3IgZ2V0R2VuZXJhbGl6ZXJzKFZhcmlhYmlsaXR5RWxlbWVudCBlLAotCQkJZmluYWwgVmFyaWFiaWxpdHlUeXBlIHR5cGUpIHsKLQkJcmV0dXJuIG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihlLCBmYWxzZSkgewotCi0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM5NzgxNDU0Mzk0NDkyOTg0ODNMOwotCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50ID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXRlcmF0b3IKLQkJCQkJCQkubmV4dCgpOwotCQkJCQlpZiAoKHR5cGUgPT0gbnVsbCkgfHwgZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSB0eXBlKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgZ2VlbnJhbGl6ZXJzIG9mIGFsbCB0eXBlcywgcmVjdXJzaXZlbHkKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGdldEdlbmVyYWxpemVycyhWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlyZXR1cm4gZ2V0R2VuZXJhbGl6ZXJzKGUsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3IgZ2V0Q29udHJpYnV0b3JzKFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JCXJldHVybiBnZXRHZW5lcmFsaXplcnMoZSwgVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSXRlbVByb3ZpZGVyQWRhcHRlciBnZXRBZGFwdGVyKE1ldGhvZFBsdWdpbiBwbHVnaW4sCi0JCQlTdHJpbmdbXSBwYXRoKSB7Ci0JCUlHcm91cENvbnRhaW5lciBncm91cHMgPSAoSUdyb3VwQ29udGFpbmVyKSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChwbHVnaW4sCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgaSA8IHBhdGgubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCQlncm91cHMgPSAoSUdyb3VwQ29udGFpbmVyKSBncm91cHMuZ2V0R3JvdXBJdGVtUHJvdmlkZXIocGF0aFtpXSk7Ci0JCQlpZiAoZ3JvdXBzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBncm91cHMuZ2V0R3JvdXBJdGVtUHJvdmlkZXIocGF0aFtpXSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWZyZXNoQWRhcHRlcihNZXRob2RQbHVnaW4gcGx1Z2luLCBTdHJpbmdbXSBwYXRoLAotCQkJTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAocGx1Z2luID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKHBsdWdpbiwgcGF0aCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCWFkYXB0ZXIuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihtc2csIGFkYXB0ZXIsCi0JCQkJCXRydWUsIGZhbHNlKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaEFkYXB0ZXIoU3RyaW5nW10gcGF0aCwgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlFT2JqZWN0IGVPYmogPSBudWxsOwotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQllT2JqID0gKEVPYmplY3QpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJZU9iaiA9IChFT2JqZWN0KSBuZXcgQXJyYXlMaXN0KChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24KLQkJCQkJLmdldE5ld1ZhbHVlKCkpLmdldCgwKTsKLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQllT2JqID0gKEVPYmplY3QpIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJZU9iaiA9IChFT2JqZWN0KSBuZXcgQXJyYXlMaXN0KChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24KLQkJCQkJLmdldE9sZFZhbHVlKCkpLmdldCgwKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChlT2JqICE9IG51bGwpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlT2JqKTsKLQkJCVRuZ1V0aWwucmVmcmVzaEFkYXB0ZXIocGx1Z2luLCBwYXRoLCBub3RpZmljYXRpb24pOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hVbmNhdGVnb3JpemVkVGFza3NJdGVtUHJvdmlkZXIoCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luLCBOb3RpZmljYXRpb24gbXNnKSB7Ci0JCS8vIHJlZnJlc2ggdGhlIHVuY2F0ZWdvcml6ZWQgdGFza3MgZ3JvdXAKLQkJLy8KLQotCQlyZWZyZXNoQWRhcHRlcihwbHVnaW4sIExpYnJhcnlFZGl0Q29uc3RhbnRzLlVOQ0FURUdPUklaRURfVEFTS1NfUEFUSCwKLQkJCQltc2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoRG9tYWluVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlcigKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4sIE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJcmVmcmVzaEFkYXB0ZXIocGx1Z2luLAotCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLlVOQ0FURUdPUklaRURfRE9NQUlOX1dPUktQUk9EVUNUU19QQVRILAotCQkJCW1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hXb3JrUHJvZHVjdFR5cGVVbmNhdGVnb3JpemVkKE1ldGhvZFBsdWdpbiBwbHVnaW4sCi0JCQlOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXJlZnJlc2hBZGFwdGVyKAotCQkJCXBsdWdpbiwKLQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5VTkNBVEVHT1JJWkVEX1dPUktQUk9EVUNUVFlQRV9XT1JLUFJPRFVDVFNfUEFUSCwKLQkJCQltc2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlcnMoCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luLCBOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXJlZnJlc2hEb21haW5VbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVyKHBsdWdpbiwgbXNnKTsKLQkJcmVmcmVzaFdvcmtQcm9kdWN0VHlwZVVuY2F0ZWdvcml6ZWQocGx1Z2luLCBtc2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoVW5jYXRlZ29yaXplZFJvbGVzSXRlbVByb3ZpZGVyKAotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiwgTm90aWZpY2F0aW9uIG1zZykgewotCQlyZWZyZXNoQWRhcHRlcihwbHVnaW4sIExpYnJhcnlFZGl0Q29uc3RhbnRzLlVOQ0FURUdPUklaRURfUk9MRVNfUEFUSCwKLQkJCQltc2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoVW5jYXRlZ29yaXplZFRvb2xNZW50b3JzSXRlbVByb3ZpZGVyKAotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiwgTm90aWZpY2F0aW9uIG1zZykgewotCQlyZWZyZXNoQWRhcHRlcihwbHVnaW4sCi0JCQkJTGlicmFyeUVkaXRDb25zdGFudHMuVU5DQVRFR09SSVpFRF9UT09MTUVOVE9SU19QQVRILCBtc2cpOwotCi0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlV3JhcHBlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKEZlYXR1cmVNYXBVdGlsLmlzRmVhdHVyZU1hcChmZWF0dXJlKSkgewotCQkJdmFsdWUgPSBuZXcgRmVhdHVyZU1hcEVudHJ5V3JhcHBlckl0ZW1Qcm92aWRlcigKLQkJCQkJKEZlYXR1cmVNYXAuRW50cnkpIHZhbHVlLCBvYmplY3QsIChFQXR0cmlidXRlKSBmZWF0dXJlLAotCQkJCQlpbmRleCwgYWRhcHRlckZhY3RvcnksIG51bGwpOwotCQl9IGVsc2UgaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSB7Ci0JCQl2YWx1ZSA9IG5ldyBBdHRyaWJ1dGVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIodmFsdWUsIG9iamVjdCwKLQkJCQkJKEVBdHRyaWJ1dGUpIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSwgbnVsbCk7Ci0JCX0gZWxzZSBpZiAoISgoRVJlZmVyZW5jZSkgZmVhdHVyZSkuaXNDb250YWlubWVudCgpKSB7Ci0JCQl2YWx1ZSA9IG5ldyBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKGZlYXR1cmUsIHZhbHVlLCBvYmplY3QsCi0JCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQkJfQotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXROYXZpZ2F0b3JQYXJlbnRJdGVtUHJvdmlkZXIoR3VpZGFuY2UgZ3VpZGFuY2UpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSBndWlkYW5jZS5lQ29udGFpbmVyKCk7Ci0JCWlmICghKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkKLQkJCXJldHVybiBudWxsOwotCQlDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkuZ2V0QWRhcHRlcihjb250YWluZXIsIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJcmV0dXJuIGl0ZW1Qcm92aWRlciAhPSBudWxsID8gaXRlbVByb3ZpZGVyLmdldEd1aWRhbmNlcygpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXROYXZpZ2F0b3JQYXJlbnRJdGVtUHJvdmlkZXIoV29ya1Byb2R1Y3Qgb2JqZWN0KSB7Ci0JCUVPYmplY3QgY29udGVudFBrZyA9IG9iamVjdC5lQ29udGFpbmVyKCk7Ci0JCWlmIChjb250ZW50UGtnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJLmdldEFkYXB0ZXIoY29udGVudFBrZywgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlyZXR1cm4gaXRlbVByb3ZpZGVyICE9IG51bGwgPyBpdGVtUHJvdmlkZXIuZ2V0V29ya1Byb2R1Y3RzKCkgOiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCU9iamVjdCBhZGFwdGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFkYXB0ZXIgPSB1bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5hZGFwdChvYmplY3QsCi0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElJdGVtTGFiZWxQcm92aWRlcikgewotCQkJCXJldHVybiAoKElJdGVtTGFiZWxQcm92aWRlcikgYWRhcHRlcikuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmKGFkYXB0ZXIgIT0gb2JqZWN0ICYmIGFkYXB0ZXIgaW5zdGFuY2VvZiBJRGlzcG9zYWJsZSkgewotCQkJCSgoSURpc3Bvc2FibGUpYWRhcHRlcikuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIFN0cmluZyBjb2xOYW1lKSB7Ci0JCS8vIGlmKGNvbE5hbWUgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFKQotCQkvLyBpZihjb2xOYW1lID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRSkKLQkJaWYgKGNvbE5hbWUgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSkgewotCQkJcmV0dXJuIGdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTW92ZSBlbGVtZW50IHVwIHdpdGhpbmcgdGhlIHBhcmVudAotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBlbGVtZW50T2JqCi0JICogQHBhcmFtIGVDbGFzc2VzCi0JICogQHBhcmFtIGFjdGlvbk1ncgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtb3ZlVXAoQWN0aXZpdHkgYWN0aXZpdHksIE9iamVjdCBlbGVtZW50T2JqLAotCQkJQ29sbGVjdGlvbiBlQ2xhc3NlcywgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCU1vdmVVcENvbW1hbmQgY21kID0gbmV3IE1vdmVVcENvbW1hbmQoYWN0aXZpdHksIGVsZW1lbnRPYmosIGVDbGFzc2VzKTsKLQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGVsZW1lbnQgZG93biB3aXRoaW4gdGhlIHBhcmVudAotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBlbGVtZW50T2JqCi0JICogQHBhcmFtIGVDbGFzc2VzCi0JICogQHBhcmFtIGFjdGlvbk1ncgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtb3ZlRG93bihBY3Rpdml0eSBhY3Rpdml0eSwgT2JqZWN0IGVsZW1lbnRPYmosCi0JCQlDb2xsZWN0aW9uIGVDbGFzc2VzLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJTW92ZURvd25Db21tYW5kIGNtZCA9IG5ldyBNb3ZlRG93bkNvbW1hbmQoYWN0aXZpdHksIGVsZW1lbnRPYmosCi0JCQkJZUNsYXNzZXMpOwotCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ3VzdG9tQ2F0ZWdvcnkgY3JlYXRlUm9vdEN1c3RvbUNhdGVnb3J5KAotCQkJQ29udGVudFBhY2thZ2UgY3VzdG9tQ2F0ZWdvcnlQa2cpIHsKLQkJLy8gY3JlYXRlIHJvb3QgY3VzdG9tIGNhdGVnb3J5Ci0JCS8vCi0JCUN1c3RvbUNhdGVnb3J5IHJvb3RDdXN0b21DYXRlZ29yeSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUN1c3RvbUNhdGVnb3J5KCk7Ci0JCXJvb3RDdXN0b21DYXRlZ29yeS5zZXROYW1lKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJLmdldFN0cmluZygiX1VJX0N1c3RvbV9DYXRlZ29yaWVzX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCUNvbnRlbnRQYWNrYWdlIGhpZGRlblBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGN1c3RvbUNhdGVnb3J5UGtnCi0JCQkJLmdldENoaWxkUGFja2FnZXMoKSwgTW9kZWxTdHJ1Y3R1cmUuSElEREVOX1BBQ0tBR0VfTkFNRSk7Ci0JCWlmIChoaWRkZW5Qa2cgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGhpZGRlbiBwYWNrYWdlIHRvIHN0b3JlIHRoZSByb290IGN1c3RvbSBjYXRlZ29yeQotCQkJLy8KLQkJCWhpZGRlblBrZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKCk7Ci0JCQloaWRkZW5Qa2cuc2V0TmFtZShNb2RlbFN0cnVjdHVyZS5ISURERU5fUEFDS0FHRV9OQU1FKTsKLQkJCWN1c3RvbUNhdGVnb3J5UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQoaGlkZGVuUGtnKTsKLQkJfQotCQloaWRkZW5Qa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKHJvb3RDdXN0b21DYXRlZ29yeSk7Ci0KLQkJcmV0dXJuIHJvb3RDdXN0b21DYXRlZ29yeTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEN1c3RvbUNhdGVnb3J5IGdldFJvb3RDdXN0b21DYXRlZ29yeShNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUNvbnRlbnRQYWNrYWdlIGN1c3RvbUNhdGVnb3J5UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoKTsKLQkJaWYgKGN1c3RvbUNhdGVnb3J5UGtnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29udGVudFBhY2thZ2UgaGlkZGVuUGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoY3VzdG9tQ2F0ZWdvcnlQa2cKLQkJCQkuZ2V0Q2hpbGRQYWNrYWdlcygpLCBNb2RlbFN0cnVjdHVyZS5ISURERU5fUEFDS0FHRV9OQU1FKTsKLQkJaWYgKGhpZGRlblBrZyAhPSBudWxsICYmICFoaWRkZW5Qa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gKEN1c3RvbUNhdGVnb3J5KSBoaWRkZW5Qa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuZ2V0KDApOwotCQl9Ci0JCUN1c3RvbUNhdGVnb3J5IHJvb3QgPSBjcmVhdGVSb290Q3VzdG9tQ2F0ZWdvcnkoY3VzdG9tQ2F0ZWdvcnlQa2cpOwotCQkvLyBjb2RlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OiBhZGQgYWxsIHRoZSBjdXN0b20gY2F0ZWdvcmllcyB1bmRlcgotCQkvLyBjdXN0b21DYXRlZ29yeVBrZwotCQkvLyB0byB0aGUgY29udGVudCBlbGVtZW50IHJlZmVyZW5jZSBsaXN0IG9mIHRoZSByb290IGN1c3RvbSBjYXRlZ29yeSBzbwotCQkvLyB0aGV5IGNhbiBiZSB2aXNpYmxlCi0JCS8vIGluIHRoZSBuZXcgVUkKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY3VzdG9tQ2F0ZWdvcnlQa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCXJvb3QuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSb290Q3VzdG9tQ2F0ZWdvcnkoQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQkJRU9iamVjdCBwa2cgPSBjYXRlZ29yeS5lQ29udGFpbmVyKCk7Ci0JCWlmIChwa2cgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZQotCQkJCSYmIE1vZGVsU3RydWN0dXJlLkhJRERFTl9QQUNLQUdFX05BTUUKLQkJCQkJCS5lcXVhbHMoKChDb250ZW50UGFja2FnZSkgcGtnKS5nZXROYW1lKCkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUm9vdEN1dG9tQ2F0ZWdvcnlQYWNrYWdlKE1ldGhvZFBhY2thZ2UgcGtnKSB7Ci0JCWlmICggIShwa2cgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgfHwKLQkJCQkhTW9kZWxTdHJ1Y3R1cmUuSElEREVOX1BBQ0tBR0VfTkFNRQotCQkJCQkJLmVxdWFscyhwa2cuZ2V0TmFtZSgpKSApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJLy8gY2hlY2sgdGhlIHBsdWdpbiBhbmQgbWFrZSBzdXJlIGl0J3MgdGhlIG9iamVjdCwgVE9ETwotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFNhdmVzIHJlc291cmNlIG9mIHRoZSBnaXZlbiBlbGVtZW50J3MgY29udGFpbmVyIGlmIHRoaXMgaGFzIGJlZW4gbW9kaWZpZWQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlQ29udGFpbmVyUmVzb3VyY2UoRU9iamVjdCBlbGVtZW50LAotCQkJSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyKSB7Ci0JCS8vIHNhdmUgY29udGFpbmVyJ3MgcmVzb3VyY2UKLQkJaWYgKGVsZW1lbnQuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gZWxlbWVudC5lQ29udGFpbmVyKCkuZVJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5pc01vZGlmaWVkKCkpIHsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29udGVudENhdGVnb3J5IGZpbmRDb250cmlidXRvcihDb250ZW50UGFja2FnZSBjYXRlZ29yeVBrZywKLQkJCUNvbnRlbnRDYXRlZ29yeSBiYXNlQ2F0ZWdvcnkpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2F0ZWdvcnlQa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY2F0ID0gKENvbnRlbnRDYXRlZ29yeSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2F0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBiYXNlQ2F0ZWdvcnkpIHsKLQkJCQlyZXR1cm4gY2F0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VtcHR5KENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSkgewotCQlpZiAoIWNhdGVnb3J5LmdldENvbmNlcHRzQW5kUGFwZXJzKCkuaXNFbXB0eSgpCi0JCQkJfHwgIWNhdGVnb3J5LmdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGNhdGVnb3J5IGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJcmV0dXJuICgoRGlzY2lwbGluZSkgY2F0ZWdvcnkpLmdldFRhc2tzKCkuaXNFbXB0eSgpOwotCQl9IGVsc2UgaWYgKGNhdGVnb3J5IGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQlyZXR1cm4gKChEb21haW4pIGNhdGVnb3J5KS5nZXRXb3JrUHJvZHVjdHMoKS5pc0VtcHR5KCk7Ci0JCX0gZWxzZSBpZiAoY2F0ZWdvcnkgaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQlyZXR1cm4gKChSb2xlU2V0KSBjYXRlZ29yeSkuZ2V0Um9sZXMoKS5pc0VtcHR5KCk7Ci0JCX0gZWxzZSBpZiAoY2F0ZWdvcnkgaW5zdGFuY2VvZiBUb29sKSB7Ci0JCQlyZXR1cm4gKChUb29sKSBjYXRlZ29yeSkuZ2V0VG9vbE1lbnRvcnMoKS5pc0VtcHR5KCk7Ci0JCX0gZWxzZSBpZiAoY2F0ZWdvcnkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpIHsKLQkJCXJldHVybiAoKFdvcmtQcm9kdWN0VHlwZSkgY2F0ZWdvcnkpLmdldFdvcmtQcm9kdWN0cygpLmlzRW1wdHkoKTsKLQkJfSBlbHNlIGlmIChjYXRlZ29yeSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlDdXN0b21DYXRlZ29yeSB1c2VyRGVmaW5lZENhdGVnb3J5ID0gKChDdXN0b21DYXRlZ29yeSkgY2F0ZWdvcnkpOwotCQkJcmV0dXJuIHVzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLmlzRW1wdHkoKQotCQkJLy8gJiYgdXNlckRlZmluZWRDYXRlZ29yeS5nZXRTdWJDYXRlZ29yaWVzKCkuaXNFbXB0eSgpCi0JCQk7Ci0JCX0KLQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGNhdGVnb3J5OiAiICsgY2F0ZWdvcnkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9yZGVyCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRUb1BhY2thZ2UoV29ya09yZGVyIG9yZGVyLCBCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSBlLmVDb250YWluZXIoKTsKLQkJaWYoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCSgoUHJvY2Vzc1BhY2thZ2UpIGNvbnRhaW5lcikuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKG9yZGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvcmRlcgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlRnJvbVBhY2thZ2UoV29ya09yZGVyIG9yZGVyLCBCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJKChQcm9jZXNzUGFja2FnZSkgZS5lQ29udGFpbmVyKCkpLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZShvcmRlcik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhbmRsZVByZWRlY2Vzc29yTGlzdENoYW5nZSgKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciwgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19MSU5LX1RPX1BSRURFQ0VTU09SOgotCQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlhZGRUb1BhY2thZ2UoKFdvcmtPcmRlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCksCi0JCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uCi0JCQkJCQkJLmdldE5ld1ZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJYWRkVG9QYWNrYWdlKChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpLAotCQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJcmVtb3ZlRnJvbVBhY2thZ2UoKFdvcmtPcmRlcikgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCksCi0JCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uCi0JCQkJCQkJLmdldE9sZFZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJcmVtb3ZlRnJvbVBhY2thZ2UoKFdvcmtPcmRlcikgaXRlci5uZXh0KCksCi0JCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0KLQkJCQl9Ci0KLQkJCQlhZGFwdGVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHJldHVybiBhbGwgdGhlIGdsb2JhbCBwYWNrYWdlcyBmb3IgdGhlIG1ldGhvZCBwbHVnaW4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBNZXRob2RQbHVnaW4KLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIGdsb2JhbCBwYWNrYWdlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRHbG9iYWxQYWNrYWdlcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUFycmF5TGlzdCBwYWNrYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nW11bXSBjYXRlZ29yeVBhdGhzID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5nZXRDYXRlZ29yeVBhdGhzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcnlQYXRocy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gcGF0aCA9IGNhdGVnb3J5UGF0aHNbaV07Ci0JCQlDb250ZW50UGFja2FnZSBjYXRlZ29yeVBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJcGF0aCk7Ci0JCQlpZiAoY2F0ZWdvcnlQa2cgIT0gbnVsbCkgewotCQkJCXBhY2thZ2VzLmFkZChjYXRlZ29yeVBrZyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcGFja2FnZXM7Ci0JfQotCi0JCi0JLyoqCi0JICogcmV0dXJuIGFsbCB0aGUgY29udGVudCBjYXRlZ29yeSBwYWNrYWdlcyBmb3IgdGhlIG1ldGhvZCBwbHVnaW4uIAotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2YgZ2xvYmFsIHBhY2thZ2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJcmV0dXJuIGdldEdsb2JhbFBhY2thZ2VzKHBsdWdpbik7Ci0JfQotCQotCQotCS8qKgotCSAqIHJldHVybiBhbGwgdGhlIHN5c3RlbSBkZWZpbmVkIHBhY2thZ2VzIGZvciB0aGUgbWV0aG9kIHBsdWdpbgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2YgYWxsIHN5c3RlbSBwYWNrYWdlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxTeXN0ZW1QYWNrYWdlcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUFycmF5TGlzdCBwYWNrYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nW11bXSBwYXRocyA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZ2V0QWxsU3lzdGVtUGF0aHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gcGF0aCA9IHBhdGhzW2ldOwotCQkJTWV0aG9kUGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwgcGF0aCk7Ci0JCQlpZiAocGtnICE9IG51bGwgJiYgIXBhY2thZ2VzLmNvbnRhaW5zKHBrZykpIHsKLQkJCQlwYWNrYWdlcy5hZGQocGtnKTsKLQkJCQlFT2JqZWN0IG8gPSBwa2cuZUNvbnRhaW5lcigpOwotCQkJCXdoaWxlICgobyBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpICYmICFwYWNrYWdlcy5jb250YWlucyhvKSkgewotCQkJCQlwYWNrYWdlcy5hZGQobyk7Ci0JCQkJCW8gPSBvLmVDb250YWluZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBhbHNvIGFkZCB0aGUgaGlkZGVuIGNvc3RvbSBjYXRlZ29yeSBwYWNrYWdlCi0JCUNvbnRlbnRQYWNrYWdlIGN1c3RvbUNhdGVnb3J5UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoKTsKLQkJaWYgKGN1c3RvbUNhdGVnb3J5UGtnICE9IG51bGwpIHsKLQkJCUNvbnRlbnRQYWNrYWdlIGhpZGRlblBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKAotCQkJCQljdXN0b21DYXRlZ29yeVBrZy5nZXRDaGlsZFBhY2thZ2VzKCksCi0JCQkJCU1vZGVsU3RydWN0dXJlLkhJRERFTl9QQUNLQUdFX05BTUUpOwotCQkJaWYgKGhpZGRlblBrZyAhPSBudWxsKSB7Ci0JCQkJcGFja2FnZXMuYWRkKGhpZGRlblBrZyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcGFja2FnZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJlZGVmaW5lZChNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeQotCQkJCSYmIGlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJU3RyaW5nIHBhdGggPSBNb2RlbFN0cnVjdHVyZQotCQkJCS50b0ZpbGVQYXRoKE1pc2MuZ2V0UGF0aFJlbGF0aXZlVG9QbHVnaW4oZSkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBNb2RlbFN0cnVjdHVyZS5BTExfUFJFREVGSU5FRF9QQVRIUy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBwcmVkZWZpbmVQYXRoID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlpZiAocHJlZGVmaW5lUGF0aC5zdGFydHNXaXRoKHBhdGgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHdyYXBwZXIgZm9yIHRoZSBnaXZlbiB2YWx1ZSBpbiB0aGUgZ2l2ZW4gd3JhcHBlcnMuCi0JICogCi0JICogQHBhcmFtIHdyYXBwZXJzCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFdyYXBwZXIoQ29sbGVjdGlvbiB3cmFwcGVycywgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh3cmFwcGVycyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHdyYXBwZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSVdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChJV3JhcHBlckl0ZW1Qcm92aWRlcikgaXRlci5uZXh0KCk7Ci0JCQlpZiAod3JhcHBlci5nZXRWYWx1ZSgpID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHdyYXBwZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNZXRob2RQYWNrYWdlIGdldE1ldGhvZFBhY2thZ2UoRU9iamVjdCBlKSB7Ci0JCWZvciAoOyAhKGUgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSAmJiBlICE9IG51bGw7IGUgPSBlLmVDb250YWluZXIoKSkKLQkJCTsKLQkJcmV0dXJuIChNZXRob2RQYWNrYWdlKSBlOwotCX0KLQotCS8qKgotCSAqIHZhbGlkYXRlIHRoZSBjb25maWd1cmF0aW9uIGJ5IGZvcmNpbmcgdG8gc2VsZWN0IHRoZSBnbG9iYWwgcGFja2FnZXMgb2YKLQkgKiB0aGUgc2VsZWN0ZWQgbWV0aG9kIHBsdWdpbnMsIHRoaXMgaXMgbmVlZGVkIGZvciBjb25maWd1cmF0aW9uIGV4cG9ydGluZy4KLQkgKiBJZiBnbG9iYWwgcGFja2FnZXMgYXJlIG1pc3NpbmcsIHRoZSBleHBvcnRlZCBjb25maWd1cmF0aW9uIGlzIG5vdCB2YWxpZAotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUxpc3QgcGx1Z2lucyA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJTGlzdCBwa2dTZWxzID0gY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQotCQkvLyBtYWtlIHN1cmUgYWxsIHJlcXVpcmVkIHBhY2thZ2VzIGFyZSBzZWxlY3RlZC4KLQkJLy8gaWYgYSBwYWNrYWdlIGlzIHNlbGVjdGVkLCBhbGwgdGhlIHBhcmVudCBwYWNrYWdlcyBtdXN0IGJlIHNlbGVjdGVkLgotCQlmb3IgKCBJdGVyYXRvciBpdCA9IG5ldyBBcnJheUxpc3QocGtnU2VscykuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gKE1ldGhvZFBhY2thZ2UpaXQubmV4dCgpOwotCQkJRU9iamVjdCBjID0gcGtnLmVDb250YWluZXIoKTsKLQkJCXdoaWxlICggKChjIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgfHwgKGMgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSAKLQkJCQkJJiYgIXBrZ1NlbHMuY29udGFpbnMoYykgJiYgIXBsdWdpbnMuY29udGFpbnMoYykgKSB7Ci0JCQkJaWYgKGMgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJcGx1Z2lucy5hZGQoYyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcGtnU2Vscy5hZGQoYyk7Ci0JCQkJfQotCQkJCQotCQkJCWMgPSBjLmVDb250YWluZXIoKTsKLQkJCX0JCi0JCX0KLQkJCi0JCS8vIG1ha2Ugc3VyZSBhbGwgc3lzdGVtIHBhY2thZ2VzIGFyZSBzZWxlY3RlZAotCQlmb3IgKEl0ZXJhdG9yIGl0cCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXRwLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdHAubmV4dCgpOwotCQkJTGlzdCBwa2dzID0gVG5nVXRpbC5nZXRBbGxTeXN0ZW1QYWNrYWdlcyhwbHVnaW4pOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBrZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBwa2cgPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCFwa2dTZWxzLmNvbnRhaW5zKHBrZykpIHsKLQkJCQkJcGtnU2Vscy5hZGQocGtnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gb2JqZWN0J3MgbWV0aG9kIHBhY2thZ2UgYW5kIHBsdWdpbiB0byB0aGUgZ2l2ZW4KLQkgKiBjb25maWd1cmF0aW9uIGlmIHRoZXkgYXJlIG5vdCBpbiB0aGUgY29uZmlndXJhdGlvbiB5ZXQuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkVG8oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIEVPYmplY3Qgb2JqZWN0LAotCQkJU2V0IGFkZGVkT2JqZWN0cykgewotCQlNZXRob2RQYWNrYWdlIHBrZyA9IGdldE1ldGhvZFBhY2thZ2Uob2JqZWN0KTsKLQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQlpZiAoIWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuY29udGFpbnMocGtnKSkgewotCQkJCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCQkJYWRkZWRPYmplY3RzLmFkZChwa2cpOwotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwa2cpOwotCQkJCQotCQkJCS8vIDE1MDU1MiAtIFByb2Nlc3NlczogSWYgY29uZmlndXJhdGlvbiBpcyB1cGRhdGVkIGJ5IGl0c2VsZiBkdWUgdG8gYWN0aW9ucyBsaWtlIENQIGV4dGVuZGlpbmcgb3IgZGVlcCBjb3B5LCAKLQkJCQkvLyB0aGVyZSBpcyBhIHJlZnJlc2ggaXNzdWUuCi0JCQkJLy8gbWlzc2luZyB0aGUgIiEiIGhlcmUhCi0JCQkJaWYgKCFjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuY29udGFpbnMocGx1Z2luKSkgewotCQkJCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCQkJCWFkZGVkT2JqZWN0cy5hZGQocGx1Z2luKTsKLQkJCQkKLQkJCQkJLy8gbmVlZCB0byB2YWxpZGF0ZSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdG8gbWFrZSBzdXJlIGFsbCByZWxhdGVkIHN5c3RlbSBwYWNrYWdlcyBhcmUgc2VsZWN0ZWQuCi0JCQkJCS8vIG90aGVyd2lzZSB0aGUgY29uZmlndXJhdGlvbiBleHBsb3JlciB3aWxsIG5vdCB3b3JrCi0JCQkJCS8vIDE1MDU1MiAtIFByb2Nlc3NlczogSWYgY29uZmlndXJhdGlvbiBpcyB1cGRhdGVkIGJ5IGl0c2VsZiBkdWUgdG8gYWN0aW9ucyBsaWtlIENQIGV4dGVuZGlpbmcgb3IgZGVlcCBjb3B5LCB0aGVyZSBpcyBhIHJlZnJlc2ggaXNzdWUuCQkKLQkJCQkJdmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkVG9Db25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJRU9iamVjdCBvYmplY3QsIFNldCBhZGRlZE9iamVjdHMpIHsKLQkJaW50IHNpemUgPSBhZGRlZE9iamVjdHMuc2l6ZSgpOwotCQlhZGRUbyhjb25maWcsIG9iamVjdCwgYWRkZWRPYmplY3RzKTsKLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkvLyBhZGQgYWxsIHRoZSBiYXNlIGVsZW1lbnRzIGlmIHRoZXJlIGlzIGFueQotCQkJZm9yIChWYXJpYWJpbGl0eUVsZW1lbnQgYyA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QpCi0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7IGMgIT0gbnVsbDsgYyA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGMKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCWFkZFRvKGNvbmZpZywgYywgYWRkZWRPYmplY3RzKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBhZGRlZE9iamVjdHMuc2l6ZSgpID4gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZU9iagotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICB0aGUgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw8L2NvZGU+IHRoYXQgaXMgdG8gYmUKLQkgKiAgICAgICAgICAgIHVzZWQgdG8gcGFyZW50IGFueSBkaWFsb2dzIHdpdGggdGhlIHVzZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICAgICBpZiB0aGVyZSBpcyBubyBVSSBjb250ZXh0IChkZWNsYXJlZCBhcyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+Ci0JICogICAgICAgICAgICB0byBhdm9pZCBhbnkgZGlyZWN0IHJlZmVyZW5jZXMgb24gdGhlIFNXVCBjb21wb25lbnQpCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjaGVja0VkaXQoRU9iamVjdCBlT2JqLCBPYmplY3QgY29udGV4dCkgewotCQlpZiAoKChJbnRlcm5hbEVPYmplY3QpIGVPYmopLmVQcm94eVVSSSgpICE9IG51bGwpIHsKLQkJCS8vIHRoaXMgaXMgYSB1bnJlc29sdmVkIHByb3h5LCBkaXNhbGxvdyBlZGl0aW5nIGl0Ci0JCQkvLwotCQkJRU9iamVjdCBwcm94eSA9IGVPYmo7Ci0JCQlTdHJpbmcgdXJpID0gKChJbnRlcm5hbEVPYmplY3QpIHByb3h5KS5lUHJveHlVUkkoKS50b1N0cmluZygpOwotCQkJb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSBjb250YWluZXJVUkkgPSBwcm94eS5lQ29udGFpbmVyKCkgIT0gbnVsbCA/IHByb3h5Ci0JCQkJCS5lQ29udGFpbmVyKCkuZVJlc291cmNlKCkuZ2V0VVJJKCkKLQkJCQkJOiBudWxsOwotCQkJU3RyaW5nIGxvY2F0aW9uOwotCQkJaWYgKGNvbnRhaW5lclVSSSAhPSBudWxsKSB7Ci0JCQkJbG9jYXRpb24gPSBjb250YWluZXJVUkkgIT0gbnVsbCAmJiBjb250YWluZXJVUkkuaXNGaWxlKCkgPyBjb250YWluZXJVUkkudG9GaWxlU3RyaW5nKCkKLQkJCQkJCTogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobG9jYXRpb24ubGVuZ3RoKCkgIT0gMCkgewotCQkJCQlsb2NhdGlvbiA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCSIgaW4gJyd7MH0nJyIsIG5ldyBPYmplY3RbXSB7IGxvY2F0aW9uIH0pOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlsb2NhdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoTGlicmFyeUVkaXRSZXNvdXJjZXMudW5yZXNvbHZlZE9iamVjdEVycm9yX3JlYXNvbgotCQkJCQksIG5ldyBPYmplY3RbXSB7IHByb3h5LmVDbGFzcygpLmdldE5hbWUoKSwgdXJpLCBsb2NhdGlvbiB9KTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgbXNnLCBudWxsKTsKLQkJfQotLy8JCWlmIChlT2JqLmVSZXNvdXJjZSgpID09IG51bGwpIHsKLS8vCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLS8vCQkJCQkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuT0ssICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotLy8JCX0KLS8vCQlTdHJpbmcgcGF0aCA9IGVPYmouZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0vLwkJcmV0dXJuIENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuZ2V0RmlsZU1hbmFnZXIoKS5jaGVja01vZGlmeShwYXRoLAotLy8JCQkJY29udGV4dCk7Ci0JCQotCQlJQWNjZXNzQ29udHJvbGxlciBhYyA9IFNlcnZpY2VzLmdldEFjY2Vzc0NvbnRyb2xsZXIoKTsKLQkJaWYoYWMgPT0gbnVsbCkgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJcmV0dXJuIGFjLmNoZWNrTW9kaWZ5KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZU9iaiksIGNvbnRleHQpOwotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB0aGUgZ2l2ZW4gZWxlbWVudCBmb3IgbW9kaWZpYWJsZQotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHRocm93cyBNZXNzYWdlRXhjZXB0aW9uIGlmIHRoZSBlbGVtZW50IGNhbm5vdCBiZSBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja01vZGlmeShFT2JqZWN0IGUpIHsKLQkJSUFjY2Vzc0NvbnRyb2xsZXIgYWMgPSBTZXJ2aWNlcy5nZXRBY2Nlc3NDb250cm9sbGVyKCk7Ci0JCWlmKGFjICE9IG51bGwpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gYWMuY2hlY2tNb2RpZnkoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChlKSwgbnVsbCk7Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlTdHJpbmcgbXNnID0gVW1hVXRpbC5nZXRNZXNzYWdlKHN0YXR1cyk7Ci0JCQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQkJCU9iamVjdCBvYmo7Ci0JCQkJCWlmKGUuZVJlc291cmNlKCkuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCQkJCW9iaiA9IGUuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlvYmogPSBlOyAKLQkJCQkJfQotCQkJCQltc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChVbWFSZXNvdXJjZXMuZXJyX2Nhbm5vdE1vZGlmeTAsCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgb2JqIH0pOwotCQkJCX0KLQkJCQl0aHJvdyBuZXcgTWVzc2FnZUV4Y2VwdGlvbihtc2cpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShJU3RhdHVzIHN0YXR1cykgewotCQlTdHJpbmcgbXNnID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJaWYgKHN0YXR1cy5pc011bHRpU3RhdHVzKCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKG1zZyk7Ci0JCQlJU3RhdHVzIHN0YXR1c2VzW10gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHVzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlzdHJCdWYuYXBwZW5kKCdcbicpLmFwcGVuZChzdGF0dXNlc1tpXS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQkJbXNnID0gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JCX0KLQkJaWYgKG1zZyA9PSBudWxsIHx8IG1zZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQltc2cgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy51dGlsX3RuZ3V0aWxfY2Fubm90X2VkaXRfcmVzb3VyY2U7IAotCQl9Ci0JCXJldHVybiBtc2c7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udHJpYnV0b3IoVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwKLQkJJiYgKGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250cmlidXRvck9yUmVwbGFjZXIoVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBlLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQlyZXR1cm4gYmFzZSAhPSBudWxsICYmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFU19MSVRFUkFMIHx8IHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0dlbmVyYWxpemVyKE9iamVjdCBvYmosIENvbGxlY3Rpb24gdHlwZXMpIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqOwotCQlpZiAodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh0eXBlcyA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiB0eXBlcy5jb250YWlucyh2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZVRleHQoU3RyaW5nIHR5cGVLZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJXyIgKyB0eXBlS2V5ICsgIl90eXBlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Vua25vd25fdHlwZSIpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0KLQkvKioKLQkgKiBMb29rcyB1cCB0aGUgdXNlciBmcmllbmRseSB0eXBlIG5hbWUgZm9yIGEgTWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZVRleHQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBnZXRUeXBlVGV4dChlbGVtZW50LmVDbGFzcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9va3MgdXAgdGhlIHVzZXItZnJpZW5kbHkgdHlwZSBuYW1lIGZvciBhIGdpdmVuIHR5cGUuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZVRleHQoRUNsYXNzIHR5cGUpIHsKLQkJcmV0dXJuIGdldFR5cGVUZXh0KHR5cGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGxvb2tzIHVwIHRoZSBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgZmVhdHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGZWF0dXJlVGV4dChPYmplY3QgZmVhdHVyZSkgewotCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVTdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQkJcmV0dXJuIGdldEZlYXR1cmVUZXh0KChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICJVbmtub3duIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgbG9ja2VkLiBBbiBvYmplY3QgaXMgY29uc2lkZXJlZCBsb2NrZWQgaWYKLQkgKiBpdHMgTWV0aG9kUGx1Z2luIGhhcyB0aGUgYXR0cmlidXRlIHVzZXJDaGFuZ2VhYmxlIHNldCB0byBmYWxzZS4gVGhlCi0JICogJ2xvY2tlZCcgc3RhdHVzIG9mIGFuIG9iamVjdCBpcyBpbmRlcGVuZGVudCBmcm9tICdyZWFkLW9ubHknIHN0YXR1cyBvZgotCSAqIGl0cyByZXNvdXJjZSBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTG9ja2VkKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihvYmplY3QpOwotCQlpZiAocGx1Z2luID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAhcGx1Z2luLmdldFVzZXJDaGFuZ2VhYmxlKCkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrRXhpc3QoQ29sbGVjdGlvbiB3cmFwcGVycywgT2JqZWN0IGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHdyYXBwZXJzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gdW53cmFwKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQlpZiAoZWxlbWVudCA9PSBlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBpbmRleCBvZiBlbGVtZW50IG9yIGl0cyB3cmFwcGVyIGluIHRoZSBnaXZlbiBsaXN0Ci0JICogQHBhcmFtIGxpc3QgYSBtaXhlZCBsaXN0IG9mIGVsZW1lbnQgYW5kIHdyYXBwZXIKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gLTEgaWYgdGhlIGVsZW1lbnQgb3IgaXRzIHdyYXBwZXIgY291bGQgbm90IGJlIGZvdW5kIGluIHRoZSBsaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SW5kZXhPZihMaXN0IGxpc3QsIE9iamVjdCBlKSB7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IHVud3JhcChsaXN0LmdldChpKSk7Ci0JCQlpZihlbGVtZW50ID09IGUpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q29udGFpbmluZ0ZlYXR1cmUoT2JqZWN0IG9iamVjdCwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQob2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChvYmplY3QpOwotCQlpZiAoIShwYXJlbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSkKLQkJCXJldHVybiBudWxsOwotCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQocGFyZW50LAotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlcikgewotCQkJRU9iamVjdCBwYXJlbnRFT2JqID0gKEVPYmplY3QpIHBhcmVudDsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlcikgYWRhcHRlcikKLQkJCQkJLmdldENoaWxkcmVuRmVhdHVyZXMocGFyZW50KS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChmLmlzTWFueSgpKSB7Ci0JCQkJCWlmICgoKENvbGxlY3Rpb24pIHBhcmVudEVPYmouZUdldChmKSkuY29udGFpbnMob2JqZWN0KSkgewotCQkJCQkJcmV0dXJuIGY7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAocGFyZW50RU9iai5lR2V0KGYpID09IG9iamVjdCkgewotCQkJCQkJcmV0dXJuIGY7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIExvb2tzIHVwIHRoZSB1c2VyLWZyaWVuZGx5IG5hbWUgZm9yIGEgZ2l2ZW4gZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGZWF0dXJlVGV4dChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlzd2l0Y2ggKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkpIHsKLQkJLy8gY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLQkJLy8gcmV0dXJuICJQcmltYXJ5IFBlcmZvcm1lciI7Ci0JCS8vIGNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCS8vIHJldHVybiAiU2Vjb25kYXJ5IFBlcmZvcm1lciI7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZOgotCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLmFzc2lzdHNfdGV4dDsgCi0JCX0KLQotCQlTdHJpbmcgZmVhdHVyZUtleTsKLQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFU3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmU7Ci0JCQlmZWF0dXJlS2V5ID0gZUZlYXR1cmUuZ2V0RUNvbnRhaW5pbmdDbGFzcygpLmdldE5hbWUoKQotCQkJCQkrICJfIiArIGVGZWF0dXJlLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJZmVhdHVyZUtleSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnVua25vd25fdGV4dDsgCi0JCX0KLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkuZ2V0U3RyaW5nKCJfVUlfIiArIGZlYXR1cmVLZXkgKyAiX2ZlYXR1cmUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBsaWJyYXJ5IHJvb3QgcGF0aCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQsIGFzc3VtaW5nIHRoZSBlbGVtZW50IGFuZAotCSAqIGl0J3MgcGFyZW50cyBhcmUgbG9hZGVkCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIEZpbGUgdGhlIHJvb3QgcGF0aCBvZiB0aGUgbGlicmFyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRMaWJyYXJ5Um9vdFBhdGgoRU9iamVjdCBlbGVtZW50KSB7Ci0JCUVPYmplY3QgcGFyZW50ID0gZWxlbWVudDsKLQkJd2hpbGUgKChwYXJlbnQgIT0gbnVsbCkgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSkgewotCQkJcGFyZW50ID0gcGFyZW50LmVDb250YWluZXIoKTsKLQkJfQotCi0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSB1cmkgPSBwYXJlbnQuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQlTdHJpbmcgcGF0aCA9IHVyaS50b0ZpbGVTdHJpbmcoKTsKLQkJCUZpbGUgZiA9IG5ldyBGaWxlKHBhdGgpOwotCQkJcmV0dXJuIGYuZ2V0UGFyZW50RmlsZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZnVsbCBwYXRoIFVSSSBieSBhcHBlbmRpbmcgdGhlIHJlbGF0aXZlIHBhdGggVVJJIHRvIHRoZSBvYmplY3QncwotCSAqIGxpYnJhcnkgcGF0aAotCSAqIAotCSAqIEBwYXJhbSBvCi0JICogICAgICAgICAgICBFT2JqZWN0IHRoZSBvYmplY3QgdG8gZmluZCB0aGUgTWV0aG9kTGlicmFyeSwgY2FuIGJlIGFueQotCSAqICAgICAgICAgICAgb2JqZWN0IGluIHRoZSBsaWJyYXJ5Ci0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgVGhlIHVyaSB0byBiZSBmaXhlZAotCSAqIEByZXR1cm4gVVJJIHRoZSBmdWxsIHBhdGggdXJpCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkkgZ2V0RnVsbFBhdGhVUkkoRU9iamVjdCBvLCBVUkkgdXJpKSB7Ci0JCWlmICh1cmkgPT0gbnVsbCkgewotCQkJcmV0dXJuIHVyaTsKLQkJfQotCi0JCS8vIHRyeSBpZiB0aGlzIGlzIGEgdmFsaWQgVVJMIG9yIG5vdAotCQl0cnkgewotCQkJVVJMIHVybCA9IHVyaS50b1VSTCgpOwotCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHVyaTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQk7IC8vIG5vdCBhIHZhbGlkIHVybCwgbWF5YmUgYSByZWxhdGl2ZSBwYXRoCi0JCX0KLQotCQkvLyBuZWVkIHRvIGdldCB0aGUgZWxlbWVudCdzIHJlc291cmNlIHBhdGgKLQkJRmlsZSBmID0gZ2V0TGlicmFyeVJvb3RQYXRoKG8pOwotCQlpZiAoZiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbGUoZiwgTmV0VXRpbC5kZWNvZGVkRmlsZVVybCh1cmkudG9TdHJpbmcoKSkpLnRvVVJJKCk7Ci0JCX0KLQotCQlyZXR1cm4gdXJpOwotCX0KLQotCQotCS8qKgotCSAqIFRvIGdldCB0aGUgbm9kZSBpY29uL3NoYXBlIGljb24gZnVsbCBwYXRoIFVSSSBieSBhcHBlbmRpbmcgdGhlIHJlbGF0aXZlIHBhdGggVVJJIHRvIHRoZSBvYmplY3QncwotCSAqIGxpYnJhcnkgcGF0aAotCSAqIAotCSAqIEBwYXJhbSBvCi0JICogICAgICAgICAgICBFT2JqZWN0IHRoZSBvYmplY3QgdG8gZmluZCB0aGUgTWV0aG9kTGlicmFyeSwgY2FuIGJlIGFueQotCSAqICAgICAgICAgICAgb2JqZWN0IGluIHRoZSBsaWJyYXJ5Ci0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgVGhlIHVyaSB0byBiZSBmaXhlZAotCSAqIEByZXR1cm4gVVJJIHRoZSBmdWxsIHBhdGggdXJpCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkkgZ2V0RnVsbFBhdGhvZk5vZGVvclNoYXBlSWNvblVSSShFT2JqZWN0IG8sIFVSSSB1cmkpIHsKLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdXJpOwotCQl9Ci0KLQkJLy8gdHJ5IGlmIHRoaXMgaXMgYSB2YWxpZCBVUkwgb3Igbm90Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gdXJpLnRvVVJMKCk7Ci0JCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdXJpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCTsgLy8gbm90IGEgdmFsaWQgdXJsLCBtYXliZSBhIHJlbGF0aXZlIHBhdGgKLQkJfQotCi0JCS8vIG5lZWQgdG8gZ2V0IHRoZSBlbGVtZW50J3MgcmVzb3VyY2UgcGF0aAotCQlGaWxlIGYgPSBnZXRMaWJyYXJ5Um9vdFBhdGgobyk7Ci0JCVN0cmluZyBwYXRoID0gdXJpLmdldFBhdGgoKTsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKG8pOwotCQlpZihwbHVnaW4gIT0gbnVsbCAmJiBwYXRoLmluZGV4T2YocGx1Z2luLmdldE5hbWUoKSkgPiAtMSl7Ci0JCQlyZXR1cm4gbmV3IEZpbGUoZiwgTmV0VXRpbC5kZWNvZGVkRmlsZVVybCh1cmkudG9TdHJpbmcoKSkpLnRvVVJJKCk7Ci0JCX1lbHNlewotCQkJcmV0dXJuIG5ldyBGaWxlKGYsIHBsdWdpbi5nZXROYW1lKCkrIEZpbGUuc2VwYXJhdG9yK05ldFV0aWwuZGVjb2RlZEZpbGVVcmwodXJpLnRvU3RyaW5nKCkpKS50b1VSSSgpOwotCQl9Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RhY2tUcmFjZVN0cmluZyhUaHJvd2FibGUgZSkgewotCQlTdHJpbmdXcml0ZXIgc3RyV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQllLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIoc3RyV3JpdGVyKSk7Ci0JCXJldHVybiBzdHJXcml0ZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMYWJlbFdpdGhQYXRoKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCXJldHVybiBQcm9jZXNzVXRpbC5nZXRMYWJlbFdpdGhQYXRoKChCcmVha2Rvd25FbGVtZW50KSBvYmplY3QpOwotCQl9Ci0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJcmV0dXJuIGdldExhYmVsV2l0aFBhdGgoKChDb250ZW50RGVzY3JpcHRpb24pIG9iamVjdCkuZUNvbnRhaW5lcigpKTsKLQkJfQotCi0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCU1ldGhvZEVsZW1lbnQgbWUgPSAoTWV0aG9kRWxlbWVudCkgb2JqZWN0OwotCQkJU3RyaW5nW10gc3RyID0gTWlzYy5nZXRQYXRoUmVsYXRpdmVUb1BsdWdpbihtZSk7Ci0JCQlTdHJpbmdCdWZmZXIgcGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0TGFiZWwob2JqZWN0LCBtZS5nZXRHdWlkKCkpKTsKLS8vCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQlpZiAoTWV0aG9kRWxlbWVudFV0aWwuZ2V0TWV0aG9kTW9kZWwob2JqZWN0KSAhPSBudWxsKSB7Ci0JCQkJcGF0aAotCQkJCS5hcHBlbmQoIiwgIikuYXBwZW5kKE1ldGhvZEVsZW1lbnRVdGlsLmdldE1ldGhvZE1vZGVsKG9iamVjdCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVN0cmluZyBzID0gc3RyW2ldOwotCi0JCQkJCWlmIChNb2RlbFN0cnVjdHVyZS5DT1JFX0NPTlRFTlRfUEFDQUtHRV9OQU1FLmVxdWFscyhzKSB8fCBNb2RlbFN0cnVjdHVyZS5DT05URU5UX1BBQ0tBR0VfTkFNRS5lcXVhbHNJZ25vcmVDYXNlKHMpCi0JCQkJCQkJfHwgKCgoTmFtZWRFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKS5lcXVhbHMocykpKSB7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwYXRoLmFwcGVuZCgnLycpLmFwcGVuZChzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLS8vCQkJfQotCQkJcmV0dXJuIHBhdGgudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVPYmplY3QgZ2V0T3duZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWNvbW1hbmQgPSBUbmdVdGlsLnVud3JhcChjb21tYW5kKTsKLQkJRU9iamVjdCBvd25lciA9IG51bGw7Ci0JCWlmIChjb21tYW5kIGluc3RhbmNlb2YgQWRkQ29tbWFuZCkgewotCQkJb3duZXIgPSAoKEFkZENvbW1hbmQpIGNvbW1hbmQpLmdldE93bmVyKCk7Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFJlbW92ZUNvbW1hbmQpIHsKLQkJCW93bmVyID0gKChSZW1vdmVDb21tYW5kKSBjb21tYW5kKS5nZXRPd25lcigpOwotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBTZXRDb21tYW5kKSB7Ci0JCQlvd25lciA9ICgoU2V0Q29tbWFuZCkgY29tbWFuZCkuZ2V0T3duZXIoKTsKLQkJfSBlbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgTW92ZUNvbW1hbmQpIHsKLQkJCW93bmVyID0gKChNb3ZlQ29tbWFuZCkgY29tbWFuZCkuZ2V0T3duZXIoKTsKLQkJfSBlbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCkgewotCQkJT2JqZWN0IG8gPSAoKFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQpIGNvbW1hbmQpLmdldE93bmVyKCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlvd25lciA9IChFT2JqZWN0KSBvOwotCQkJfQotCQl9Ci0JCXJldHVybiBvd25lcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgY29udmVydEd1aWRhbmNlQXR0YWNobWVudHNUb0xpc3QoU3RyaW5nIGF0dGFjaG1lbnRTdHJpbmcpIHsKLQkJQXJyYXlMaXN0IGF0dGFjaG1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoYXR0YWNobWVudFN0cmluZyA9PSBudWxsKQotCQkJYXR0YWNobWVudFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBmaWxlc1tdID0gYXR0YWNobWVudFN0cmluZwotCQkJCS5zcGxpdChHVUlEQU5DRV9GSUxFU1RSSU5HX1NFUEFSQVRPUl9TUExJVFRFUik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmaWxlc1tpXS50cmltKCkubGVuZ3RoKCkgPiAwKQotCQkJCWF0dGFjaG1lbnRzLmFkZChmaWxlc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGF0dGFjaG1lbnRzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRHdWlkYW5jZUF0dGFjaG1lbnRzVG9TdHJpbmcoTGlzdCBhdHRhY2htZW50TGlzdCkgewotCQlTdHJpbmcgYXR0YWNobWVudFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXR0YWNobWVudExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgYXR0YWNobWVudCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGkrKyA+IDApCi0JCQkJYXR0YWNobWVudFN0cmluZyA9IGF0dGFjaG1lbnRTdHJpbmcKLQkJCQkJCS5jb25jYXQoR1VJREFOQ0VfRklMRVNUUklOR19TRVBBUkFUT1IpOwotCQkJYXR0YWNobWVudFN0cmluZyA9IGF0dGFjaG1lbnRTdHJpbmcuY29uY2F0KGF0dGFjaG1lbnQpOwotCQl9Ci0JCXJldHVybiBhdHRhY2htZW50U3RyaW5nOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gdHJ1ZSBpZmYgdGhlIE1ldGhvZEVsZW1lbnQgaXMgYWxsb3dlZCBhbiBhdHRhY2htZW50LiAgQ3VycmVudGx5LCBvbmx5Ci0JICogRXhhbXBsZSwgUmVzdWFibGVBc3NldCwgVGVtcGxhdGUsICBXaGl0ZXBhcGVyIGFyZSBhbGxvd2VkIGF0dGFjaG1lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWxsb3dlZEF0dGFjaG1lbnRzKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGUgaW5zdGFuY2VvZiBFeGFtcGxlKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChlIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZSBpbnN0YW5jZW9mIFRlbXBsYXRlKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChlIGluc3RhbmNlb2YgV2hpdGVwYXBlcikKLQkJCXJldHVybiB0cnVlOwotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIDxjb2RlPmVsZW1lbnRzPC9jb2RlPiBjb250YWlucyA8Y29kZT5lPC9jb2RlPiBvciBoYXMgYSB3cmFwcGVyIG9mIDxjb2RlPmU8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKENvbGxlY3Rpb24gZWxlbWVudHMsIE9iamVjdCBlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmKGVsZW1lbnQgPT0gZSB8fCBlID09IHVud3JhcChlbGVtZW50KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBDdXN0b21DYXRlZ29yeSBpcyBhbiBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4gRGVzY2liYWJsZUVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gY2MKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKiBAZGVwcmVjYXRlZCBtb3ZlZCB0byB7QGxpbmsgRGVwZW5kZW5jeUNoZWNrZXIjaXNBbmNlc3Nvck9mKEN1c3RvbUNhdGVnb3J5LCBEZXNjcmliYWJsZUVsZW1lbnQpfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FuY2Vzc29yT2YoQ3VzdG9tQ2F0ZWdvcnkgY2MsIERlc2NyaWJhYmxlRWxlbWVudCBlKSB7Ci0JCXJldHVybiBEZXBlbmRlbmN5Q2hlY2tlci5pc0FuY2Vzc29yT2YoY2MsIGUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwgSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyKSB7Ci0JCWlmKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTkFNRToKLQkJCQlpZihQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmlzU2hvd1ByZXNlbnRhdGlvbk5hbWVzKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCQlpZighUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5pc1Nob3dQcmVzZW50YXRpb25OYW1lcygpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQllbHNlIGlmICggbm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChOYW1lZEVsZW1lbnQuY2xhc3MpICE9IFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVF9fTkFNRSApewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIG5hbWUgY2hhbmdlIG1pZ2h0IGNoYW5nZSB0aGUgZWxlbWVudCdzIG9yZGVyIGluIHRoZSBzb3J0ZWQgbGlzdAotCQkvLyByZWZyZXNoIHRoZSBwYXJlbnQgY29udGVudCB0byByZXNvcnQgdGhlIGVsZW1lbnQgbGlzdAotCQkvLwotCQlhZGFwdGVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBhZGFwdGVyLmdldFBhcmVudChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSksIHRydWUsIGZhbHNlKSk7Ci0JfQkKLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGVsZW1lbnQgPGNvZGU+ZTwvY29kZT4gaXMgYSBjb250cmlidXRvciBvZiB0aGUgZ2l2ZW4gPGNvZGU+YmFzZTwvY29kZT4KLQkgKiBAcGFyYW0gYmFzZQotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRyaWJ1dG9yT2YoT2JqZWN0IGJhc2UsIFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JCWZvcihWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlOwotCQl2ZSAhPSBudWxsICYmIHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFU19MSVRFUkFMICYmIHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsOwotCQl2ZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJaWYodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IGJhc2UpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0vLwkvKioKLS8vCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gcGFyZW50IGNvbnRhaW5zIHRoZSBnaXZlbiBjaGlsZCwgZWl0aGVyIHZpYSBjb250YWlubWVudCBvciBjb250cmlidXRpb24KLS8vCSAqIEBwYXJhbSBwYXJlbnQKLS8vCSAqIEBwYXJhbSBjaGlsZAotLy8JICogQHJldHVybgotLy8JICovCi0vLwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250YWluZWRCeShBcnRpZmFjdCBwYXJlbnQsIEFydGlmYWN0IGNoaWxkKSB7Ci0vLwkJRU9iamVjdCBjb250YWluZXIgPSBjaGlsZC5lQ29udGFpbmVyKCk7Ci0vLwkJaWYoY29udGFpbmVyIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLS8vCQkJQXJ0aWZhY3QgY3VycmVudFBhcmVudCA9IChBcnRpZmFjdCljb250YWluZXI7Ci0vLwkJCWlmKGNvbnRhaW5lciA9PSBwYXJlbnQgfHwgaXNDb250cmlidXRvck9mKHBhcmVudCwgY3VycmVudFBhcmVudCkpIHsKLS8vCQkJCXJldHVybiB0cnVlOwotLy8JCQl9Ci0vLwkJCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IocGFyZW50LCBmYWxzZSkgewotLy8JCQkJCi0vLwkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLS8vCQkJCQotLy8JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLS8vCQkJCQlyZXR1cm4gKChBcnRpZmFjdClvYmplY3QpLmdldENvbnRhaW5lZEFydGlmYWN0cygpLml0ZXJhdG9yKCk7Ci0vLwkJCQl9Ci0vLwkJCQkKLS8vCQkJfTsKLS8vCQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLS8vCQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0vLwkJCQlpZihvID09IGN1cnJlbnRQYXJlbnQgfHwgaXNDb250cmlidXRvck9mKG8sIGN1cnJlbnRQYXJlbnQpKSB7Ci0vLwkJCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLS8vCQllbHNlIHsKLS8vCQkJcmV0dXJuIFVtYVV0aWwuaXNDb250YWluZWRCeShjaGlsZCwgcGFyZW50KTsKLS8vCQl9Ci0vLwl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldENvbmZpZ3VyYXRpb25zVG9VcGRhdGUoTWV0aG9kUGFja2FnZSBwYXJlbnQsIE1ldGhvZFBhY2thZ2UgcGtnLCBDb2xsZWN0aW9uIGNvbmZpZ3NUb1VwZGF0ZSkgewotCQlPYmplY3QgY29uZmlncyA9ICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHBhcmVudCkKLQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKEFzc29jaWF0aW9uSGVscGVyLk1ldGhvZFBhY2thZ2VfTWV0aG9kQ29uZmlndXJhdGlvbnMpOwotCQlpZiAoY29uZmlncyBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRjb25maWcgPSAoKExpc3QpIGNvbmZpZ3MpLml0ZXJhdG9yKCk7IGl0Y29uZmlnCi0JCQkuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0Y29uZmlnCi0JCQkJLm5leHQoKTsKLQkJCQlMaXN0IHBrZ3MgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQkJCWlmICghcGtncy5jb250YWlucyhwa2cpKSB7Ci0JCQkJCWNvbmZpZ3NUb1VwZGF0ZS5hZGQoY29uZmlnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBvYmplY3QgY2FuIGJlIGVzdGltYXRlZAotCSAqIAotCSAqIEBwYXJhbSBvCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5Fc3RpbWF0ZShPYmplY3QgbykgewotCQlyZXR1cm4gbyBpbnN0YW5jZW9mIFRhc2sgfHwgbyBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50OwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVidWdTaG93QWxsKCkgewotCQlJTGlicmFyeUluc3BlY3RvciBpbnNwZWN0b3IgPSBnZXRMaWJyYXJ5SW5zcGVjdG9yKCk7Ci0JCWlmIChpbnNwZWN0b3IgIT0gbnVsbCkgewotCQkJaW5zcGVjdG9yLnNob3dBbGxDb250ZW50cygpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWJ1Z1Nob3dBbGwoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJSUxpYnJhcnlJbnNwZWN0b3IgaW5zcGVjdG9yID0gZ2V0TGlicmFyeUluc3BlY3RvcigpOwotCQlpZiAoaW5zcGVjdG9yICE9IG51bGwpIHsKLQkJCWluc3BlY3Rvci5zaG93QWxsQ29udGVudHMobGliKTsKLQkJfQotCX0KLQkKLQkvL1VzZWQgZm9yIGRlYnVnIG9ubHkKLQlwdWJsaWMgc3RhdGljIElMaWJyYXJ5SW5zcGVjdG9yIGdldExpYnJhcnlJbnNwZWN0b3IoKSB7Ci0JCXJldHVybiAoSUxpYnJhcnlJbnNwZWN0b3IpIEV4dGVuc2lvbk1hbmFnZXIuZ2V0RXh0ZW5zaW9uKCJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0IiwgImxpYnJhcnlJbnNwZWN0b3IiKTsgCQkJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0luUGx1Z2luV2l0aExlc3NUaGFuT25lU3VwZXJDdXN0b21DYXRlZ29yeShDdXN0b21DYXRlZ29yeSBjYywgTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlpZihVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjYykgIT0gcGx1Z2luKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJTGlzdCBsaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhjYyk7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCkgJiYgY291bnQgPCAyOykgewotCQkJQ3VzdG9tQ2F0ZWdvcnkgY2F0ID0gKEN1c3RvbUNhdGVnb3J5KSBpdGVyLm5leHQoKTsKLQkJCWlmKFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNhdCkgPT0gcGx1Z2luKSB7Ci0JCQkJY291bnQrKzsKLQkJCX0JCQkJCQkKLQkJfQotCQlyZXR1cm4gY291bnQgPCAyOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIHRoZSBnaXZlbiB3cmFwcGVyIGlzIHVuZGVyIGEgY3VzdG9tIGNhdGVnb3J5IHRyZWUKLQkgKiAKLQkgKiBAcGFyYW0gaXRlbQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVbmRlckN1c3RvbUNhdGVnb3J5VHJlZShJV3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCWRvIHsKLQkJCU9iamVjdCBvd25lciA9IHdyYXBwZXIuZ2V0T3duZXIoKTsKLQkJCWlmKHVud3JhcChvd25lcikgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJd3JhcHBlciA9IG93bmVyIGluc3RhbmNlb2YgSVdyYXBwZXJJdGVtUHJvdmlkZXIgPyAoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIG93bmVyIDogbnVsbDsKLQkJfSB3aGlsZSh3cmFwcGVyICE9IG51bGwpOwotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0RXhjbHVzaXZlU3ViQ3VzdG9tQ2F0ZWdvcmllcyhDdXN0b21DYXRlZ29yeSBjYykgewotCQlBcnJheUxpc3QgY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJY29sbGVjdEV4Y2x1c2l2ZVN1YkN1c3RvbUNhdGVnb3JpZXMoY29sbGVjdGlvbiwgY2MsIFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNjKSk7Ci0JCXJldHVybiBjb2xsZWN0aW9uOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbGxlY3RFeGNsdXNpdmVTdWJDdXN0b21DYXRlZ29yaWVzKENvbGxlY3Rpb24gY29sbGVjdGlvbiwgQ3VzdG9tQ2F0ZWdvcnkgY2MsIE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2MuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCUN1c3RvbUNhdGVnb3J5IHN1YiA9IChDdXN0b21DYXRlZ29yeSkgZTsKLQkJCQlpZihpc0luUGx1Z2luV2l0aExlc3NUaGFuT25lU3VwZXJDdXN0b21DYXRlZ29yeShzdWIsIHBsdWdpbikpIHsKLQkJCQkJY29sbGVjdGlvbi5hZGQoZSk7Ci0JCQkJCWNvbGxlY3RFeGNsdXNpdmVTdWJDdXN0b21DYXRlZ29yaWVzKGNvbGxlY3Rpb24sIHN1YiwgcGx1Z2luKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogY3JlYXRlIGEgZGVlcCBjb3B5IG9mIGEgcHJvY2VzcyB0byB0aGUgc3BlY2lmaWVkIHByb2Nlc3MgcGFja2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICogQHByYXJtIG5ld1Byb2Nlc3NOYW1lCi0JICogQHBhcmFtIGRlZXBDb3B5Q29uZmlnCi0JICogQHBhcmFtIHRhcmdldFBhY2thZ2UKLQkgKiBAcmV0dXJuIFByb2Nlc3MgdGhlIG5ld2x5IGNyZWF0ZWQgcHJvY2VzcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIGRlZXBDb3B5KAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCAKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jZXNzLCAKLQkJCVN0cmluZyBuZXdQcm9jZXNzTmFtZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gZGVlcENvcHlDb25maWcsIAotCQkJUHJvY2Vzc1BhY2thZ2UgdGFyZ2V0UGFja2FnZSkgewotCQkKLQkJLy8gaWYgdGhlIHRhcmdldFBhY2thZ2UgaXMgbnVsbCwgdXNlIHRoZSBzYW1lIHBhY2thZ2Ugb2YgdGhlIHNvdXJjZSBwcm9jZXNzCi0JCWlmICggdGFyZ2V0UGFja2FnZSA9PSBudWxsICkgewotCQkJdGFyZ2V0UGFja2FnZSA9IChQcm9jZXNzUGFja2FnZSlwcm9jZXNzLmVDb250YWluZXIoKS5lQ29udGFpbmVyKCk7Ci0JCX0KLQkJCi0JCS8vCQluZXcgZGVlcC1jb3BpZWQgcHJvY2VzcydzIHJlZmVyZW5jZQotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgbmV3UHJvY2VzcyA9IG51bGw7Ci0KLQkJQ29weUhlbHBlciBoZWxwZXIgPSBuZXcgQ29weUhlbHBlcigpOwkKLQkJdHJ5IHsKLQkJCWlmKG1vbml0b3IgPT0gbnVsbCkgewotCQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJfQotCQkJCQkKLQkJCVByb2Nlc3NEZWVwQ29weUNvbW1hbmQgY21kID0gbmV3IFByb2Nlc3NEZWVwQ29weUNvbW1hbmQocHJvY2VzcywgbmV3UHJvY2Vzc05hbWUsIGhlbHBlciwgZGVlcENvcHlDb25maWcsIHRhcmdldFBhY2thZ2UsIG1vbml0b3IpOwotCQkJdHJ5IHsKLQkJCQljbWQuZXhlY3V0ZSgpOwotCQkJCUNvbGxlY3Rpb24gcmVzdWx0ID0gY21kLmdldFJlc3VsdCgpOwotCQkJCWlmKCFyZXN1bHQuaXNFbXB0eSgpKSB7Ci0JCQkJCWNtZC5jb3B5U3VwcHJlc3Npb25TdGF0ZXMoKTsKLQkJCQkJbmV3UHJvY2VzcyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIHJlc3VsdC50b0FycmF5KClbMF07Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJY21kLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWhlbHBlci5jbGVhcigpOwotCQl9Ci0JCQotCQkvLyBmaXggYnJlYWtkb3duIGVsZW1lbnQgb3JkZXIgb2YgYWxsIGFjdGl2aXRpZXMKLQkJLy8KLQkJaWYgKCBuZXdQcm9jZXNzICE9IG51bGwgKSB7Ci0JCQlQcm9jZXNzVXRpbC5maXhCcmVha2RvbndFbGVtZW50T3JkZXJSZWN1cnNpdmVseShuZXdQcm9jZXNzKTsJCi0JCX0KLQkJcmV0dXJuIG5ld1Byb2Nlc3M7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEFkYXB0ZXJCeVR5cGUoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vdGlmaWVyLmVBZGFwdGVycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGl0ZXIubmV4dCgpOwotCQkJaWYoYWRhcHRlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbGwgcmVmZXJlbmNlcyB0byBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBhIG1hcCBjb250YWluaW5nIHRoZSByZW1vdmVkIHJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCByZW1vdmVSZWZlcmVuY2VzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gVG5nVXRpbC5yZW1vdmVSZWZlcmVuY2VzKGVsZW1lbnQsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFsbCByZWZlcmVuY2VzIHRvIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgbWFwIG9mIG1ldGhvZCBlbGVtZW50cyB3aG9zZSByZWZlcmVuY2VzIHRvIHRoZSBnaXZlbiBlbGVtZW50Ci0JICogICAgICAgICBhcmUganVzdCByZW1vdmVkLCBhbmQgdGhlaXIgZmVhdHVyZXMgdGhhdCBob2xkIHRoZSByZWZlcmVuY2VzIHRvCi0JICogICAgICAgICB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIHJlbW92ZVJlZmVyZW5jZXMoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJYm9vbGVhbiBjaGVja01vZGlmeSkgewotCQkvLyBMaXN0IHJlZmVyZW5jZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlNYXAgb2JqZWN0RmVhdHVyZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlNdWx0aVJlc291cmNlRU9iamVjdCBlT2JqID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlbGVtZW50OwotCQotCQlpZiAoZU9iai5iYXNpY0dldE9wcG9zaXRlRmVhdHVyZU1hcCgpID09IG51bGwpCi0JCQlyZXR1cm4gb2JqZWN0RmVhdHVyZXNNYXA7Ci0JCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVPYmouZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9ICgoT3Bwb3NpdGVGZWF0dXJlKSBlbnRyeS5nZXRLZXkoKSk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCk7Ci0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBBcnJheUxpc3QoKENvbGxlY3Rpb24pIGVPYmoKLQkJCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUob3Bwb3NpdGVGZWF0dXJlKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKGNoZWNrTW9kaWZ5KSB7Ci0JCQkJCQkJY2hlY2tNb2RpZnkob2JqKTsKLQkJCQkJCX0KLQkJCQkJCSgoTGlzdCkgb2JqLmVHZXQoZmVhdHVyZSkpLnJlbW92ZShlbGVtZW50KTsKLQkJCQkJCUxpc3QgZmVhdHVyZXMgPSAoTGlzdCkgb2JqZWN0RmVhdHVyZXNNYXAuZ2V0KG9iaik7Ci0JCQkJCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCkgewotCQkJCQkJCWZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCW9iamVjdEZlYXR1cmVzTWFwLnB1dChvYmosIGZlYXR1cmVzKTsKLQkJCQkJCX0KLQkJCQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpIGVPYmoKLQkJCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUob3Bwb3NpdGVGZWF0dXJlKTsKLQkJCQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoY2hlY2tNb2RpZnkpIHsKLQkJCQkJCQljaGVja01vZGlmeShvYmopOwotCQkJCQkJfQotCQkJCQkJKChMaXN0KSBvYmouZUdldChmZWF0dXJlKSkucmVtb3ZlKGVsZW1lbnQpOwotCQkJCQkJTGlzdCBmZWF0dXJlcyA9IChMaXN0KSBvYmplY3RGZWF0dXJlc01hcC5nZXQob2JqKTsKLQkJCQkJCWlmIChmZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQkJCQkJZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJb2JqZWN0RmVhdHVyZXNNYXAucHV0KG9iaiwgZmVhdHVyZXMpOwotCQkJCQkJfQotCQkJCQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQXJyYXlMaXN0KChDb2xsZWN0aW9uKSBlT2JqCi0JCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKG9wcG9zaXRlRmVhdHVyZSkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmIChjaGVja01vZGlmeSkgewotCQkJCQkJCWNoZWNrTW9kaWZ5KG9iaik7Ci0JCQkJCQl9Ci0JCQkJCQlvYmouZVNldChmZWF0dXJlLCBudWxsKTsKLQkJCQkJCUxpc3QgZmVhdHVyZXMgPSAoTGlzdCkgb2JqZWN0RmVhdHVyZXNNYXAuZ2V0KG9iaik7Ci0JCQkJCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCkgewotCQkJCQkJCWZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCW9iamVjdEZlYXR1cmVzTWFwLnB1dChvYmosIGZlYXR1cmVzKTsKLQkJCQkJCX0KLQkJCQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpIGVPYmoKLQkJCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUob3Bwb3NpdGVGZWF0dXJlKTsKLQkJCQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoY2hlY2tNb2RpZnkpIHsKLQkJCQkJCQljaGVja01vZGlmeShvYmopOwotCQkJCQkJfQotCQkJCQkJb2JqLmVTZXQoZmVhdHVyZSwgbnVsbCk7Ci0JCQkJCQlMaXN0IGZlYXR1cmVzID0gKExpc3QpIG9iamVjdEZlYXR1cmVzTWFwLmdldChvYmopOwotCQkJCQkJaWYgKGZlYXR1cmVzID09IG51bGwpIHsKLQkJCQkJCQlmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlvYmplY3RGZWF0dXJlc01hcC5wdXQob2JqLCBmZWF0dXJlcyk7Ci0JCQkJCQl9Ci0JCQkJCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0RmVhdHVyZXNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCS8vIHJlZmVyZW5jZXJzLmFkZChuZXcgUmVmZXJlbmNlcigoRU9iamVjdCllbnRyeS5nZXRLZXkoKSwKLQkJLy8gKExpc3QpZW50cnkuZ2V0VmFsdWUoKSkpOwotCQkvLyB9Ci0JCS8vIHJldHVybiByZWZlcmVuY2VyczsKLQkJcmV0dXJuIG9iamVjdEZlYXR1cmVzTWFwOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gcHVibGlzaGluZyBjYXRlZ29yeSBwcm9wZXJ0eSBmb3IgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKiAJCSBwcm9wZXJ0eSBpZiBmb3VuZCwgZWxzZSBudWxsCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50UHJvcGVydHkgZ2V0UHVibGlzaENhdGVnb3J5UHJvcGVydHkoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCUxpc3QgcHJvcHMgPSBlbGVtZW50LmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCQlpZiAocHJvcHMgPT0gbnVsbCB8fCBwcm9wcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvcHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSAoTWV0aG9kRWxlbWVudFByb3BlcnR5KSBpdC5uZXh0KCk7Ci0JCQlpZiAoUFVCTElTSF9DQVRFR09SWV9QUk9QRVJUWS5lcXVhbHMocHJvcC5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHByb3A7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvV3JhcHBlck1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1dyYXBwZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUyMDI1YjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvV3JhcHBlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotCi0vKioKLSAqIE1hbmFnZXMgd3JhcHBlcnMgb2YgYW4gaXRlbSBwcm92aWRlcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEZlYiAxNSwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdyYXBwZXJNYW5hZ2VyIGltcGxlbWVudHMgSURpc3Bvc2FibGUgewotCi0JcHJpdmF0ZSBIYXNoTWFwIHZhbHVlVG9XcmFwcGVyTWFwOwotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgV3JhcHBlck1hbmFnZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldFdyYXBwZXIoT2JqZWN0IHZhbHVlKSB7Ci0JCWlmKHZhbHVlVG9XcmFwcGVyTWFwICE9IG51bGwpIHsKLQkJCXJldHVybiB2YWx1ZVRvV3JhcHBlck1hcC5nZXQodmFsdWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRXcmFwcGVycygpIHsKLQkJaWYodmFsdWVUb1dyYXBwZXJNYXAgIT0gbnVsbCkgewotCQkJcmV0dXJuIHZhbHVlVG9XcmFwcGVyTWFwLnZhbHVlcygpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHdyYXBwZXIgZm9yIHRoZSBnaXZlbiB2YWx1ZSwgb3duZXIsIGFuZCBhZGFwdGVyIGZhY3RvcnkuCi0JICovCi0JcHJvdGVjdGVkIElXcmFwcGVySXRlbVByb3ZpZGVyIGNyZWF0ZVdyYXBwZXIoT2JqZWN0IHZhbHVlLCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIodmFsdWUsIG93bmVyLCBudWxsLCBDb21tYW5kUGFyYW1ldGVyLk5PX0lOREVYLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKENvbGxlY3Rpb24gZGVsZWdhdGVWYWx1ZXMpIHsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCVNldCBvbGREZWxlZ2F0ZVZhbHVlcyA9IGRlbGVnYXRlVmFsdWVzICE9IG51bGwgPyBuZXcgSGFzaFNldChkZWxlZ2F0ZVZhbHVlcykgOiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JCQotCQlpZiAodmFsdWVUb1dyYXBwZXJNYXAgPT0gbnVsbCAmJiAhZGVsZWdhdGVWYWx1ZXMuaXNFbXB0eSgpKQotCQl7Ci0JCQl2YWx1ZVRvV3JhcHBlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJCi0JCS8vIFdyYXAgYW55IG5ldyBjaGlsZHJlbiBhbmQgYWRkIHRoZW0gdG8gdGhlIG1hcC4gUmVtb3ZlIGVhY2ggY3VycmVudCBjaGlsZCBmcm9tIHRoZSBzZXQgb2Ygb2xkIGNoaWxkcmVuLgotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBkZWxlZ2F0ZVZhbHVlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCQl7Ci0JCQlPYmplY3QgY2hpbGQgPSBpLm5leHQoKTsKLQkJCQotCQkJaWYgKCF2YWx1ZVRvV3JhcHBlck1hcC5jb250YWluc0tleShjaGlsZCkpCi0JCQl7Ci0JCQkJSVdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IGNyZWF0ZVdyYXBwZXIoY2hpbGQsIHRoaXMsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQl2YWx1ZVRvV3JhcHBlck1hcC5wdXQoY2hpbGQsIHdyYXBwZXIpOwotCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJfQotCQkJb2xkRGVsZWdhdGVWYWx1ZXMucmVtb3ZlKGNoaWxkKTsKLQkJfQotCQkKLQkJLy8gUmVtb3ZlIGFuZCBkaXNwb3NlIGFueSB3cmFwcGVycyBmb3IgcmVtYWluaW5nIG9sZCBjaGlsZHJlbi4KLQkJLy8KLQkJaWYgKCFvbGREZWxlZ2F0ZVZhbHVlcy5pc0VtcHR5KCkpCi0JCXsKLQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCi0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBvbGREZWxlZ2F0ZVZhbHVlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCQkJewotCQkJCU9iamVjdCBjaGlsZCA9IGkubmV4dCgpOwotCQkJCQotCQkJCUlXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoSVdyYXBwZXJJdGVtUHJvdmlkZXIpdmFsdWVUb1dyYXBwZXJNYXAucmVtb3ZlKGNoaWxkKTsKLQkJCQlpZiAod3JhcHBlciAhPSBudWxsKQotCQkJCXsKLQkJCQkJd3JhcHBlci5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBJZiBhbnkgY2hpbGRyZW4gd2VyZSBhZGRlZCBvciByZW1vdmVkLCByZXNldCB0aGUgaW5kaWNlcy4KLQkJaWYgKGNoYW5nZWQpCi0JCXsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBkZWxlZ2F0ZVZhbHVlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaW5kZXgrKykKLQkJCXsKLQkJCQkoKElXcmFwcGVySXRlbVByb3ZpZGVyKXZhbHVlVG9XcmFwcGVyTWFwLmdldChpLm5leHQoKSkpLnNldEluZGV4KGluZGV4KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JICAgIGlmICh2YWx1ZVRvV3JhcHBlck1hcCAhPSBudWxsKQotCSAgICB7Ci0JICAgICAgZm9yIChJdGVyYXRvciBpID0gdmFsdWVUb1dyYXBwZXJNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCSAgICAgIHsKLQkgICAgICAgICgoSURpc3Bvc2FibGUpaS5uZXh0KCkpLmRpc3Bvc2UoKTsKLQkgICAgICB9Ci0JICAgICAgdmFsdWVUb1dyYXBwZXJNYXAuY2xlYXIoKTsKLQkgICAgICB2YWx1ZVRvV3JhcHBlck1hcCA9IG51bGw7Ci0JICAgIH0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL01vZGVsRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvTW9kZWxGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0NGZlMjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvTW9kZWxGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuIEl0IHByb3ZpZGVzIGEKLSAqIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNb2RlbEZhY3RvcnkgZUlOU1RBTkNFID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5pbXBsLk1vZGVsRmFjdG9yeUltcGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3JkZXIgSW5mbzwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk9yZGVyIEluZm88L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9yZGVySW5mbyBjcmVhdGVPcmRlckluZm8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPcmRlckluZm9Db2xsZWN0aW9uIGNyZWF0ZU9yZGVySW5mb0NvbGxlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1vZGVsUGFja2FnZSBnZXRNb2RlbFBhY2thZ2UoKTsKLQotfSAvLyBNb2RlbEZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL01vZGVsUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvTW9kZWxQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViZGE1ZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvTW9kZWxQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuIEl0IGNvbnRhaW5zCi0gKiBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxGYWN0b3J5Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAibW9kZWwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovLy9jb20vaWJtL3VtYS9lZGl0L3RuZy91dGlsL21vZGVsLmVjb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQudG5nLnV0aWwubW9kZWwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNb2RlbFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbAotCQkJLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuT3JkZXJJbmZvSW1wbCA8ZW0+T3JkZXIgSW5mbzwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldE9yZGVySW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBPUkRFUl9JTkZPID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9SREVSX0lORk9fX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdVSSBEczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9SREVSX0lORk9fX0dVSV9EUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZXN0YW1wPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9SREVSX0lORk9fX1RJTUVTVEFNUCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk9yZGVyIEluZm88L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9SREVSX0lORk9fRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5pbXBsLk9yZGVySW5mb0NvbGxlY3Rpb25JbXBsIDxlbT5PcmRlciBJbmZvIENvbGxlY3Rpb248L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuT3JkZXJJbmZvQ29sbGVjdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0T3JkZXJJbmZvQ29sbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBPUkRFUl9JTkZPX0NPTExFQ1RJT04gPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyIEluZm9zPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1JERVJfSU5GT19DT0xMRUNUSU9OX19PUkRFUl9JTkZPUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk9yZGVyIEluZm8gQ29sbGVjdGlvbjwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1JERVJfSU5GT19DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbyA8ZW0+T3JkZXIgSW5mbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3JkZXIgSW5mbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE9yZGVySW5mbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8jZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0T3JkZXJJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPcmRlckluZm9fTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8jZ2V0R1VJRHMgPGVtPkdVSSBEczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdVSSBEczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8jZ2V0R1VJRHMoKQotCSAqIEBzZWUgI2dldE9yZGVySW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3JkZXJJbmZvX0dVSURzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8jZ2V0VGltZXN0YW1wIDxlbT5UaW1lc3RhbXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGltZXN0YW1wPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbyNnZXRUaW1lc3RhbXAoKQotCSAqIEBzZWUgI2dldE9yZGVySW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3JkZXJJbmZvX1RpbWVzdGFtcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb24gPGVtPk9yZGVyIEluZm8gQ29sbGVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE9yZGVySW5mb0NvbGxlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbiNnZXRPcmRlckluZm9zIDxlbT5PcmRlciBJbmZvczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk9yZGVyIEluZm9zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb24jZ2V0T3JkZXJJbmZvcygpCi0JICogQHNlZSAjZ2V0T3JkZXJJbmZvQ29sbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0T3JkZXJJbmZvQ29sbGVjdGlvbl9PcmRlckluZm9zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTW9kZWxGYWN0b3J5IGdldE1vZGVsRmFjdG9yeSgpOwotCi19IC8vIE1vZGVsUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvT3JkZXJJbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9PcmRlckluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2UyZTRjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9PcmRlckluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBPcmRlckluZm8gZXh0ZW5kcyBFT2JqZWN0IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX01BTlVBTCA9ICJtYW51YWwiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogCi0JICogQHJldHVybgotCSAqIEBtb2RlbAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybgotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKi8KLQlFTGlzdCBnZXRHVUlEcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZXN0YW1wPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UaW1lc3RhbXA8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGltZXN0YW1wPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUaW1lc3RhbXAobG9uZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbFBhY2thZ2UjZ2V0T3JkZXJJbmZvX1RpbWVzdGFtcCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWxvbmcgZ2V0VGltZXN0YW1wKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvI2dldFRpbWVzdGFtcCA8ZW0+VGltZXN0YW1wPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRpbWVzdGFtcDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGltZXN0YW1wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUaW1lc3RhbXAobG9uZyB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL09yZGVySW5mb0NvbGxlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL09yZGVySW5mb0NvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGZlOGRlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9PcmRlckluZm9Db2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogQ29sbGVjdGlvbiBvZiBvcmRlciBpbmZvcm1hdGlvbgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JkZXJJbmZvQ29sbGVjdGlvbiBleHRlbmRzIEVPYmplY3QgewotCi0JLyoqCi0JICogQHJldHVybgotCSAqIEBtb2RlbCB0eXBlPSJjb20uaWJtLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbyIKLQkgKiAgICAgICAgY29udGFpbmVtZW50PSJ0cnVlIgotCSAqLwotCUVMaXN0IGdldE9yZGVySW5mb3MoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvZWRpdHV0aWwuZWNvcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9lZGl0dXRpbC5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTk4NzYzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9lZGl0dXRpbC5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9Im1vZGVsIgotICAgIG5zVVJJPSJodHRwOi8vL2NvbS9pYm0vdW1hL2VkaXQvdG5nL3V0aWwvbW9kZWwuZWNvcmUiIG5zUHJlZml4PSJjb20uaWJtLnVtYS5lZGl0LnRuZy51dGlsLm1vZGVsIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPcmRlckluZm8iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Im1hbnVhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnVUlEcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGltZXN0YW1wIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FTG9uZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPcmRlckluZm9Db2xsZWN0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3JkZXJJbmZvcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9PcmRlckluZm8iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2VkaXR1dGlsLmdlbm1vZGVsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvZWRpdHV0aWwuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwY2E2NDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvZWRpdHV0aWwuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9jb20uaWJtLnVtYS5lZGl0LnRuZy9zcmMiCi0gICAgZWRpdERpcmVjdG9yeT0iL2NvbS5pYm0udW1hLnJlc291cmNlbWFuYWdlci5lZGl0L3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvY29tLmlibS51bWEucmVzb3VyY2VtYW5hZ2VyLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0iY29tLmlibS51bWEuZWRpdC50bmciIHJ1bnRpbWVKYXI9InRydWUiIG1vZGVsTmFtZT0iZWRpdHV0aWwiIGVkaXRQbHVnaW5DbGFzcz0iY29tLmlibS51bWEucmVzb3VyY2VtYW5hZ2VyLnByb3ZpZGVyLmVkaXR1dGlsRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0iY29tLmlibS51bWEucmVzb3VyY2VtYW5hZ2VyLnByZXNlbnRhdGlvbi5lZGl0dXRpbEVkaXRvclBsdWdpbiIKLSAgICBydW50aW1lQ29tcGF0aWJpbGl0eT0iZmFsc2UiPgotICA8Zm9yZWlnbk1vZGVsPkBtb2RlbDwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJNb2RlbCIgYmFzZVBhY2thZ2U9ImNvbS5pYm0udW1hLmVkaXQudG5nLnV0aWwiIGVjb3JlUGFja2FnZT0iZWRpdHV0aWwuZWNvcmUjLyI+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWRpdHV0aWwuZWNvcmUjLy9PcmRlckluZm8iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVkaXR1dGlsLmVjb3JlIy8vT3JkZXJJbmZvL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlZGl0dXRpbC5lY29yZSMvL09yZGVySW5mby9nVUlEcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlZGl0dXRpbC5lY29yZSMvL09yZGVySW5mb0NvbGxlY3Rpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVkaXR1dGlsLmVjb3JlIy8vT3JkZXJJbmZvQ29sbGVjdGlvbi9vcmRlckluZm9zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvTW9kZWxGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9Nb2RlbEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkYmYxNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9Nb2RlbEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm9Db2xsZWN0aW9uOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBNb2RlbEZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgYW5kIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kZWxGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GTzoKLQkJCXJldHVybiBjcmVhdGVPcmRlckluZm8oKTsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19DT0xMRUNUSU9OOgotCQkJcmV0dXJuIGNyZWF0ZU9yZGVySW5mb0NvbGxlY3Rpb24oKTsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3JkZXJJbmZvIGNyZWF0ZU9yZGVySW5mbygpIHsKLQkJT3JkZXJJbmZvSW1wbCBvcmRlckluZm8gPSBuZXcgT3JkZXJJbmZvSW1wbCgpOwotCQlyZXR1cm4gb3JkZXJJbmZvOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3JkZXJJbmZvQ29sbGVjdGlvbiBjcmVhdGVPcmRlckluZm9Db2xsZWN0aW9uKCkgewotCQlPcmRlckluZm9Db2xsZWN0aW9uSW1wbCBvcmRlckluZm9Db2xsZWN0aW9uID0gbmV3IE9yZGVySW5mb0NvbGxlY3Rpb25JbXBsKCk7Ci0JCXJldHVybiBvcmRlckluZm9Db2xsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kZWxQYWNrYWdlIGdldE1vZGVsUGFja2FnZSgpIHsKLQkJcmV0dXJuIChNb2RlbFBhY2thZ2UpIGdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2RlbFBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vIE1vZGVsRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvTW9kZWxQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9Nb2RlbFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4ODNlNGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9Nb2RlbFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uIDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIE1vZGVsUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG9yZGVySW5mb0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgb3JkZXJJbmZvQ29sbGVjdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlCi0JICogcGFja2FnZSBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD4KLQkgKiBOb3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljIGZhY3RvcnkKLQkgKiBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gb2YgdGhlCi0JICogcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLCBpZiBvbmUgYWxyZWFkeSBleGlzdHMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbFBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1vZGVsUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsCi0JICogYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gU2ltcGxlIGRlcGVuZGVuY2llcyBhcmUKLQkgKiBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwgZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZwotCSAqIGFueXRoaW5nIGVsc2UuIFRoaXMgbWV0aG9kIGRyaXZlcyBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQKLQkgKiBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwgd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD4KLQkgKiBPZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoIGhhdmUgbm90Ci0JICogeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkIGFuZCByZWdpc3RlcmVkLgotCSAqIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6IG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IKLQkgKiBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkgYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUKLQkgKiBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0byB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPgotCSAqIEludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUgYWxyZWFkeQotCSAqIGJlZW4gaW5pdGlhbGl6ZWQuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1vZGVsUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpCi0JCQlyZXR1cm4gKE1vZGVsUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UKLQkJCQkJLmdldEVQYWNrYWdlKE1vZGVsUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCU1vZGVsUGFja2FnZUltcGwgdGhlTW9kZWxQYWNrYWdlID0gKE1vZGVsUGFja2FnZUltcGwpIChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRQotCQkJCS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIE1vZGVsUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRQotCQkJCS5nZXRFUGFja2FnZShlTlNfVVJJKQotCQkJCTogbmV3IE1vZGVsUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZU1vZGVsUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZU1vZGVsUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVNb2RlbFBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZU1vZGVsUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRPcmRlckluZm8oKSB7Ci0JCXJldHVybiBvcmRlckluZm9FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE9yZGVySW5mb19OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIG9yZGVySW5mb0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPcmRlckluZm9fR1VJRHMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgb3JkZXJJbmZvRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE9yZGVySW5mb19UaW1lc3RhbXAoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgb3JkZXJJbmZvRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0T3JkZXJJbmZvQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIG9yZGVySW5mb0NvbGxlY3Rpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE9yZGVySW5mb0NvbGxlY3Rpb25fT3JkZXJJbmZvcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBvcmRlckluZm9Db2xsZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbEZhY3RvcnkgZ2V0TW9kZWxGYWN0b3J5KCkgewotCQlyZXR1cm4gKE1vZGVsRmFjdG9yeSkgZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiBUaGlzIG1ldGhvZCBpcyBndWFyZGVkIHRvCi0JICogaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKQotCQkJcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlvcmRlckluZm9FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoT1JERVJfSU5GTyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUob3JkZXJJbmZvRUNsYXNzLCBPUkRFUl9JTkZPX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShvcmRlckluZm9FQ2xhc3MsIE9SREVSX0lORk9fX0dVSV9EUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUob3JkZXJJbmZvRUNsYXNzLCBPUkRFUl9JTkZPX19USU1FU1RBTVApOwotCi0JCW9yZGVySW5mb0NvbGxlY3Rpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoT1JERVJfSU5GT19DT0xMRUNUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShvcmRlckluZm9Db2xsZWN0aW9uRUNsYXNzLAotCQkJCU9SREVSX0lORk9fQ09MTEVDVElPTl9fT1JERVJfSU5GT1MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKQotCQkJcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcygKLQkJCQlvcmRlckluZm9FQ2xhc3MsCi0JCQkJT3JkZXJJbmZvLmNsYXNzLAotCQkJCSJPcmRlckluZm8iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0T3JkZXJJbmZvX05hbWUoKSwKLQkJCQllY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLAotCQkJCSJuYW1lIiwgbnVsbCwgMCwgMSwgT3JkZXJJbmZvLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE9yZGVySW5mb19HVUlEcygpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksCi0JCQkJImdVSURzIiwgbnVsbCwgMCwgLTEsIE9yZGVySW5mby5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRPcmRlckluZm9fVGltZXN0YW1wKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVMb25nKCksCi0JCQkJInRpbWVzdGFtcCIsIG51bGwsIDAsIDEsIE9yZGVySW5mby5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJb3JkZXJJbmZvQ29sbGVjdGlvbkVDbGFzcywKLQkJCQlPcmRlckluZm9Db2xsZWN0aW9uLmNsYXNzLAotCQkJCSJPcmRlckluZm9Db2xsZWN0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE9yZGVySW5mb0NvbGxlY3Rpb25fT3JkZXJJbmZvcygpLAotCQkJCXRoaXMuZ2V0T3JkZXJJbmZvKCksCi0JCQkJbnVsbCwKLQkJCQkib3JkZXJJbmZvcyIsIG51bGwsIDAsIC0xLCBPcmRlckluZm9Db2xsZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotfSAvLyBNb2RlbFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL09yZGVySW5mb0NvbGxlY3Rpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL09yZGVySW5mb0NvbGxlY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNlODUwMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9PcmRlckluZm9Db2xsZWN0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuT3JkZXJJbmZvQ29sbGVjdGlvbkltcGwjZ2V0T3JkZXJJbmZvcyA8ZW0+T3JkZXIgSW5mb3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3JkZXJJbmZvQ29sbGVjdGlvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzCi0JCU9yZGVySW5mb0NvbGxlY3Rpb24gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yZGVySW5mb3MoKSA8ZW0+T3JkZXIgSW5mb3M8L2VtPn0nCi0JICogY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldE9yZGVySW5mb3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBvcmRlckluZm9zID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT3JkZXJJbmZvQ29sbGVjdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRPcmRlckluZm9Db2xsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRPcmRlckluZm9zKCkgewotCQlpZiAob3JkZXJJbmZvcyA9PSBudWxsKSB7Ci0JCQlvcmRlckluZm9zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE9yZGVySW5mby5jbGFzcywgdGhpcywKLQkJCQkJTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fQ09MTEVDVElPTl9fT1JERVJfSU5GT1MpOwotCQl9Ci0JCXJldHVybiBvcmRlckluZm9zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX0NPTExFQ1RJT05fX09SREVSX0lORk9TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldE9yZGVySW5mb3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCQltc2dzKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsCi0JCQkJCQltc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19DT0xMRUNUSU9OX19PUkRFUl9JTkZPUzoKLQkJCXJldHVybiBnZXRPcmRlckluZm9zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19DT0xMRUNUSU9OX19PUkRFUl9JTkZPUzoKLQkJCWdldE9yZGVySW5mb3MoKS5jbGVhcigpOwotCQkJZ2V0T3JkZXJJbmZvcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fQ09MTEVDVElPTl9fT1JERVJfSU5GT1M6Ci0JCQlnZXRPcmRlckluZm9zKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19DT0xMRUNUSU9OX19PUkRFUl9JTkZPUzoKLQkJCXJldHVybiBvcmRlckluZm9zICE9IG51bGwgJiYgIW9yZGVySW5mb3MuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy8gT3JkZXJJbmZvQ29sbGVjdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvT3JkZXJJbmZvSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9PcmRlckluZm9JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIyY2YyNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9PcmRlckluZm9JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbzsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PcmRlciBJbmZvPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuT3JkZXJJbmZvSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuT3JkZXJJbmZvSW1wbCNnZXRHVUlEcyA8ZW0+R1VJIERzPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuT3JkZXJJbmZvSW1wbCNnZXRUaW1lc3RhbXAgPGVtPlRpbWVzdGFtcDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPcmRlckluZm9JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBPcmRlckluZm8gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHVUlEcygpIDxlbT5HVUkgRHM8L2VtPn0nIGF0dHJpYnV0ZQotCSAqIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEdVSURzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZ1VJRHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVzdGFtcCgpIDxlbT5UaW1lc3RhbXA8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRUaW1lc3RhbXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgbG9uZyBUSU1FU1RBTVBfRURFRkFVTFQgPSAwTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVzdGFtcCgpIDxlbT5UaW1lc3RhbXA8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRUaW1lc3RhbXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBsb25nIHRpbWVzdGFtcCA9IFRJTUVTVEFNUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT3JkZXJJbmZvSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE9yZGVySW5mbygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCU1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRHVUlEcygpIHsKLQkJaWYgKGdVSURzID09IG51bGwpIHsKLQkJCWdVSURzID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywKLQkJCQkJTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX0dVSV9EUyk7Ci0JCX0KLQkJcmV0dXJuIGdVSURzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRUaW1lc3RhbXAoKSB7Ci0JCXJldHVybiB0aW1lc3RhbXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChsb25nIG5ld1RpbWVzdGFtcCkgewotCQlsb25nIG9sZFRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKLQkJdGltZXN0YW1wID0gbmV3VGltZXN0YW1wOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fVElNRVNUQU1QLCBvbGRUaW1lc3RhbXAsIHRpbWVzdGFtcCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX05BTUU6Ci0JCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19HVUlfRFM6Ci0JCQlyZXR1cm4gZ2V0R1VJRHMoKTsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fVElNRVNUQU1QOgotCQkJcmV0dXJuIG5ldyBMb25nKGdldFRpbWVzdGFtcCgpKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19OQU1FOgotCQkJc2V0TmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX0dVSV9EUzoKLQkJCWdldEdVSURzKCkuY2xlYXIoKTsKLQkJCWdldEdVSURzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX1RJTUVTVEFNUDoKLQkJCXNldFRpbWVzdGFtcCgoKExvbmcpIG5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fTkFNRToKLQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX0dVSV9EUzoKLQkJCWdldEdVSURzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fVElNRVNUQU1QOgotCQkJc2V0VGltZXN0YW1wKFRJTUVTVEFNUF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX05BTUU6Ci0JCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhuYW1lKTsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fR1VJX0RTOgotCQkJcmV0dXJuIGdVSURzICE9IG51bGwgJiYgIWdVSURzLmlzRW1wdHkoKTsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fVElNRVNUQU1QOgotCQkJcmV0dXJuIHRpbWVzdGFtcCAhPSBUSU1FU1RBTVBfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ1VJRHM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZ1VJRHMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRpbWVzdGFtcDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh0aW1lc3RhbXApOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gT3JkZXJJbmZvSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTQ4MmFjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3Igb3JkZXJpbmcgY29udGVudCBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmMjNiYjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIG9yZGVyaW5nIGNvbnRlbnQgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9Nb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC91dGlsL01vZGVsQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzVlOTEyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC91dGlsL01vZGVsQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm9Db2xsZWN0aW9uOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4gSXQKLSAqIHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlCi0gKiBtb2RlbC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBNb2RlbFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kZWxBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mCi0JICogdGhlIG1vZGVsLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTW9kZWxTd2l0Y2ggbW9kZWxTd2l0Y2ggPSBuZXcgTW9kZWxTd2l0Y2goKSB7Ci0JCXB1YmxpYyBPYmplY3QgY2FzZU9yZGVySW5mbyhPcmRlckluZm8gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlT3JkZXJJbmZvQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlT3JkZXJJbmZvQ29sbGVjdGlvbihPcmRlckluZm9Db2xsZWN0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU9yZGVySW5mb0NvbGxlY3Rpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlcikgbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpIHRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvIDxlbT5PcmRlciBJbmZvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKLQkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCi0JICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU9yZGVySW5mb0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb24gPGVtPk9yZGVyIEluZm8gQ29sbGVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0Ci0JICogd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7IGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZQotCSAqIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlT3JkZXJJbmZvQ29sbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcwotCSAqIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvLyBNb2RlbEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC91dGlsL01vZGVsU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC91dGlsL01vZGVsU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkOTE2Y2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9Nb2RlbFN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZQotICogaGllcmFyY2h5LiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdCBhbmQgcHJvY2VlZGluZyB1cCB0aGUKLSAqIGluaGVyaXRhbmNlIGhpZXJhcmNoeSB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwgd2hpY2ggaXMgdGhlCi0gKiByZXN1bHQgb2YgdGhlIHN3aXRjaC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBNb2RlbFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kZWxTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUKLQkgKiByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4KLQkgKiAgICAgICAgIGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lCi0JICogcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+Ci0JICogICAgICAgICBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9IGVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuIGVTdXBlclR5cGVzLmlzRW1wdHkoKSA/IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDogZG9Td2l0Y2goCi0JCQkJCShFQ2xhc3MpIGVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lCi0JICogcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+Ci0JICogICAgICAgICBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPOiB7Ci0JCQlPcmRlckluZm8gb3JkZXJJbmZvID0gKE9yZGVySW5mbykgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlT3JkZXJJbmZvKG9yZGVySW5mbyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fQ09MTEVDVElPTjogewotCQkJT3JkZXJJbmZvQ29sbGVjdGlvbiBvcmRlckluZm9Db2xsZWN0aW9uID0gKE9yZGVySW5mb0NvbGxlY3Rpb24pIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZU9yZGVySW5mb0NvbGxlY3Rpb24ob3JkZXJJbmZvQ29sbGVjdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3JkZXIgSW5mbzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsgcmV0dXJuaW5nIGEKLQkgKiBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcmRlciBJbmZvPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VPcmRlckluZm8oT3JkZXJJbmZvIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQotCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk9yZGVyIEluZm8gQ29sbGVjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlT3JkZXJJbmZvQ29sbGVjdGlvbihPcmRlckluZm9Db2xsZWN0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsgcmV0dXJuaW5nIGEKLQkgKiBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZQotCSAqIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvLyBNb2RlbFN3aXRjaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9TdHJpbmdSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9TdHJpbmdSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MTVkZTRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvU3RyaW5nUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nQnVmZmVySW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VJbXBsOwotCi0vKioKLSAqIFJlc291cmNlIHRvIHN0b3JlIHN0cmluZwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ1Jlc291cmNlIGV4dGVuZHMgWE1JUmVzb3VyY2VJbXBsIHsKLQlwcml2YXRlIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQ7Ci0KLQlwcml2YXRlIFN0cmluZyBzdHI7Ci0KLQlwdWJsaWMgU3RyaW5nUmVzb3VyY2UoU3RyaW5nIHN0cikgewotCQl0aGlzLnN0ciA9IHN0cjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCXRyeSB7Ci0JCQlzYXZlKG91dCwgb3B0aW9ucyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlvdXQuY2xvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotCQlpZiAob3V0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGVuY29kaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBvdXQudG9TdHJpbmcoKTsKLQkJfQotCQl0cnkgewotCQkJcmV0dXJuIG91dC50b1N0cmluZyhlbmNvZGluZyk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoIWlzTG9hZGVkKSB7Ci0JCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbShzdHIpOwotCQkJdHJ5IHsKLQkJCQlsb2FkKGlucHV0U3RyZWFtLCBvcHRpb25zKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODcxYWFmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIG9yZGVyaW5nIGNvbnRlbnQgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNzhiNzQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGVkaXRpbmcgYW5kIHF1ZXJ5aW5nIHN1cHBvcnQgZm9yIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0Fic3RyYWN0U3RyaW5nVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9BYnN0cmFjdFN0cmluZ1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZmYyNjhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0Fic3RyYWN0U3RyaW5nVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0cmluZ1ZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IgewotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBpc1ZhbGlkKE9iamVjdCB2YWx1ZSkgewotCQlpZih2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJU3RyaW5nIG1zZyA9IGlzVmFsaWQoKFN0cmluZyl2YWx1ZSk7Ci0JCQlpZihtc2cgPT0gbnVsbCkgewotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksCi0JCQkJCQkwLCBtc2csIG51bGwpOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9DaXJjdWxhckRlcGVuZGVuY3lDaGVjay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWI2OTk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9DaXJjdWxhckRlcGVuZGVuY3lDaGVjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkb2VzIGNpcmN1bGFyIGRlcGVuZGVuY3kgY2hlY2sKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDaXJjdWxhckRlcGVuZGVuY3lDaGVjayB7Ci0JCQotCXByaXZhdGUgRGVwZW5kZW5jeUluZm9NZ3IgZGVwSW5mb01ncjsKLQlwcml2YXRlIElEZXBlbmRlbmN5SW5mbyB2ZUluZm87Ci0JcHJpdmF0ZSBib29sZWFuIG1vdmUgPSBmYWxzZTsKLQkKLQlwdWJsaWMgQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2soRGVwZW5kZW5jeUluZm9NZ3IgbWdyLCBWYXJpYWJpbGl0eUVsZW1lbnQgdmUsCi0JCQkJCQkJCWJvb2xlYW4gZmlsdGVyLCBib29sZWFuIG1vdmUpIHsKLQkJZGVwSW5mb01nciA9IG1ncjsKLQkJdmVJbmZvID0gZGVwSW5mb01nci5yZWdpc3RlclZhcmlhYmlsaXR5RWxlbWVudCh2ZSwgZmlsdGVyLCBmYWxzZSk7Ci0JCXRoaXMubW92ZSA9IG1vdmU7Ci0JfQotCQotCXByb3RlY3RlZCBEZXBlbmRlbmN5SW5mb01nciBnZXREZXBJbmZvTWdyKCkgewotCQlyZXR1cm4gZGVwSW5mb01ncjsKLQl9Ci0JCi0JcHJvdGVjdGVkIElEZXBlbmRlbmN5SW5mbyBnZXRWZUluZm8oKSB7Ci0JCXJldHVybiB2ZUluZm87Ci0JfQotCQkKLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCi0JCWlmIChyZWFjaGFibGUob2JqLCB0cnVlLCB0cnVlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAobW92ZSkgewotCQkJaWYoIShvYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpKSByZXR1cm4gdHJ1ZTsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBvYmpWZUJhc2UgPSAoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAob2JqVmVCYXNlICE9IG51bGwpIHsKLQkJCQlJRGVwZW5kZW5jeUluZm8gaW5mbyA9IGRlcEluZm9NZ3IucmVnaXN0ZXJWYXJpYWJpbGl0eUVsZW1lbnQob2JqVmVCYXNlLCBmYWxzZSwgZmFsc2UpOwkKLQkJCQlpZiAoaW5mby5yZWFjaGFibGVCeSh2ZUluZm8pKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiByZWFjaGFibGUoT2JqZWN0IG9iaiwgYm9vbGVhbiBjaGVja1JlYWNoYWJsZUJ5T2JqLCBib29sZWFuIGNoZWNrUmVhY2hhYmxlVG9PYmopIHsKLQkJaWYgKCEgKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgdmVJbmZvLmdldEVsZW1lbnQoKTsKLQkJaWYgKHZlID09IG9iaikgewotCQkJcmV0dXJuIHRydWU7CQkJCi0JCX0KLQotCQlJRGVwZW5kZW5jeUluZm8gb2JqVmVJbmZvID0gZGVwSW5mb01nci5yZWdpc3RlclZhcmlhYmlsaXR5RWxlbWVudCggKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqLCBmYWxzZSwgbW92ZSk7CQkKLQkJCi0JCWlmIChjaGVja1JlYWNoYWJsZUJ5T2JqICYmIHZlSW5mby5yZWFjaGFibGVCeShvYmpWZUluZm8pKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKGNoZWNrUmVhY2hhYmxlVG9PYmogJiYgb2JqVmVJbmZvLnJlYWNoYWJsZUJ5KHZlSW5mbykpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9CQkKLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9CQotCQotCXB1YmxpYyBib29sZWFuIHJlYWNoYWJsZUJ5KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHJlYWNoYWJsZShvYmosIHRydWUsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVhY2hhYmxlVG8oT2JqZWN0IG9iaikgewotCQlyZXR1cm4gcmVhY2hhYmxlKG9iaiwgZmFsc2UsIHRydWUpOwotCX0JCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9DaXJjdWxhckRlcGVuZGVuY3lDaGVja0ZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2tGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2I3NTNhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9DaXJjdWxhckRlcGVuZGVuY3lDaGVja0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBmaWx0ZXIgZm9yIGNpcmN1bGFyIGRlcGVuZGVuY3kgY2hlY2sKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDaXJjdWxhckRlcGVuZGVuY3lDaGVja0ZpbHRlciBleHRlbmRzIENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrIGltcGxlbWVudHMgSUZpbHRlciB7CQotCQotCXByaXZhdGUgTWFwIGFuY2VzdG9yTWFwOwotCQotCQotCXB1YmxpYyBDaXJjdWxhckRlcGVuZGVuY3lDaGVja0ZpbHRlcihEZXBlbmRlbmN5SW5mb01nciBtZ3IsIFZhcmlhYmlsaXR5RWxlbWVudCB2ZSkgewotCQlzdXBlcihtZ3IsIHZlLCB0cnVlLCBmYWxzZSk7Ci0JCQotCQkKLQkJCi0JfQkJCQotCQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBzdXBlci5hY2NlcHQob2JqKTsKLQl9Ci0JCi0vKglwdWJsaWMgc3RhdGljIGJvb2xlYW4gVmVUb0NoZWNrKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIAlvYmogaW5zdGFuY2VvZiBEb21haW4gfHwgCQkJCS8vZ2V0U3ViZG9tYWlucwotCQkJCW9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5IHx8IAkJLy9nZXRTdWJDYXRlZ29yaWVzCi0JCQkJb2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QgfHwgCQkJCS8vZ2V0Q29udGFpbmVkQXJ0aWZhY3RzCi0JCQkJb2JqIGluc3RhbmNlb2YgUHJhY3RpY2UgfHwgCQkJCS8vZ2V0U3ViUHJhY3RpY2VzCi0JCQkJb2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUgfHwJCQkvL2dldERlbGl2ZXJlZFdvcmtQcm9kdWN0cwotCQkJCW9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5OwkJCQkvL2dldEJyZWFrZG93bkVsZW1lbnRzCi0JfSovCi0JCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9EZXBlbmRlbmN5Q2hlY2tlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vRGVwZW5kZW5jeUNoZWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGQzNGI0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9EZXBlbmRlbmN5Q2hlY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhhcyBzdGF0aWMgbWV0aG9kcyB0aGF0IGNoZWNrIGZvciBjeWNsZXMgaW4gdGhlIGVsZW1lbnQgZGVwZW5kZW5jeQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGVwZW5kZW5jeUNoZWNrZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIElTdGF0dXMgRVJST1JfU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBuZXdDaGVjayAJCT0gdHJ1ZTsJCQkvL3RlbXAgZmxhZywgd2lsbCBiZSByZW1vdmVkIQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBuZXdDaGVja0FjdCAJPSB0cnVlOwkJCS8vdGVtcCBmbGFnLCB3aWxsIGJlIHJlbW92ZWQhCi0KLQkvKioKLQkgKiBDaGVja3MgZm9yIHRoZSBjeWNsZXMgaW4gdGhlIGRlcGVuZGVuY3kgZ3JhcGggb2YgdGhlIGdpdmVuIGZlYXR1cmUgaWYgdGhlCi0JICogZ2l2ZW4gdmFsdWUgaXMgYWRkZWQvYXNzaWduZWQgdG8gaXQuCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICB0aGUgb3duZXIgb2YgdGhlIGZlYXR1cmUKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgdGhlIGZlYXR1cmUgdG8gY2hlY2sgZm9yIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBiZSBhZGRlZC9hc3NpZ25lZCB0byB0aGUgZmVhdHVyZQotCSAqIEByZXR1cm4gY2hlY2sgc3RhdHVzLCBPSyBpZiBubyBjeWNsZSwgRVJST1IgaWYgdGhlcmUgd2lsbCBiZSBjaXJjdWxhcgotCSAqICAgICAgICAgZGVwZW5kZW5jeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjaGVja0NpcmN1bGFyRGVwZW5kZW5jeShFT2JqZWN0IG93bmVyLAotCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFMpIHsKLQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIG93bmVyOwotCQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQkJcmV0dXJuIGNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdGl2aXR5LCAoQWN0aXZpdHkpIHZhbHVlLCB0eXBlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCkgewotCQkJaWYgKGlzQ2lyY3VsYXJEZXBlbmRlbmN5KChWYXJpYWJpbGl0eUVsZW1lbnQpIG93bmVyLAotCQkJCQkoVmFyaWFiaWxpdHlFbGVtZW50KSB2YWx1ZSkpIHsKLQkJCQlyZXR1cm4gRVJST1JfU1RBVFVTOwotCQkJfQotCQl9IGVsc2UgaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFMpIHsKLQkJCWlmICghY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcygoRGVsaXZlcmFibGUpdmFsdWUsIChEZWxpdmVyYWJsZSlvd25lcikpIHsKLQkJCQlyZXR1cm4gRVJST1JfU1RBVFVTOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKHZhbHVlKSB7Ci0KLQkJCQkJLyoqCi0JCQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkJCSAqLwotCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwTDsKLQotCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJaWYgKGZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKS5pc0luc3RhbmNlKG9iamVjdCkpIHsKLQkJCQkJCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQkJCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQkJCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQkJaWYgKGZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKS5pc0luc3RhbmNlKAotCQkJCQkJCQkJCQllbGVtZW50KSkgewotCQkJCQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCQl9Ci0KLQkJCQl9OwotCi0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCWlmIChpdGVyLm5leHQoKSA9PSBvd25lcikgewotCQkJCQkJcmV0dXJuIEVSUk9SX1NUQVRVUzsKLQkJCQkJfQotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpLmlzSW5zdGFuY2UodmFsdWUpKSB7Ci0JCQkJCUVPYmplY3QgdiA9IChFT2JqZWN0KSB2YWx1ZTsKLQkJCQkJZG8gewotCQkJCQkJaWYgKHYgPT0gb3duZXIpIHsKLQkJCQkJCQlyZXR1cm4gRVJST1JfU1RBVFVTOwotCQkJCQkJfQotCQkJCQkJT2JqZWN0IG8gPSB2LmVHZXQoZmVhdHVyZSk7Ci0JCQkJCQlpZiAoZmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpLmlzSW5zdGFuY2UobykpIHsKLQkJCQkJCQl2ID0gKEVPYmplY3QpIG87Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXYgPSBudWxsOwotCQkJCQkJfQotCQkJCQl9IHdoaWxlICh2ICE9IG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeSBpZiB0aGUgZ2l2ZW4gYWN0aXZpdHkgaXMgYXBwbGllZCB0byB0aGUKLQkgKiBnaXZlbiB0YXJnZXQgYWN0aXZpdHkgdmlhIGV4dGVuZCBvciBjb3B5LgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eSBhY3Rpdml0eSB0byBhcHBseQotCSAqIEBwYXJhbSB0YXJnZXQgdGFyZ2V0IGFjdGl2aXR5IHRvIGFkZCBleHRlbnNpb24gb3IgY29weSBvZiB0aGUgZ2l2ZW4gYWN0aXZpdHkKLQkgKiBAcmV0dXJuIHN0YXR1cyBvZiB0aGlzIGNoZWNrCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KEFjdGl2aXR5IGFjdGl2aXR5LCBBY3Rpdml0eSB0YXJnZXQpIHsKLQkJaWYgKGlzUGFyZW50KGFjdGl2aXR5LCB0YXJnZXQpKSB7Ci0JCQlPYmplY3RbXSBhcmdzID0geyB0YXJnZXQuZ2V0TmFtZSgpIH07Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUwotCQkJCQkuYmluZCgKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cxLAotCQkJCQkJCWFyZ3MpOwotCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9Ci0JCVByb2Nlc3MgcHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyh0YXJnZXQpOwotCQlpZighbmV3Q2hlY2tBY3QgJiYgaGFzQ3ljbGljRGVwZW5kZW5jeShhY3Rpdml0eSwgcHJvY2VzcykgfHwKLQkJCQluZXdDaGVja0FjdCAmJiBzb3VyY2VSZWFjaGFibGVCeVRhcmdldChhY3Rpdml0eSwgdGFyZ2V0KSkgewotCQkJT2JqZWN0W10gYXJncyA9IHsgYWN0aXZpdHkuZ2V0TmFtZSgpLCBwcm9jZXNzLmdldE5hbWUoKSB9OwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZCgKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5hcHBseV9wYXR0ZXJuX2Vycm9yX21zZywKLQkJCQkJCQlhcmdzKTsKLQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRJZCgpLCAwLCBtZXNzYWdlLCBudWxsKTsKLQkJfQotCQllbHNlIGlmKFByb2Nlc3NVdGlsLmhhc0NvbnRyaWJ1dG9yT3JSZXBsYWNlcihhY3Rpdml0eSkpIHsKLQkJCU9iamVjdFtdIGFyZ3MgPSB7IGFjdGl2aXR5LmdldE5hbWUoKSwgcHJvY2Vzcy5nZXROYW1lKCkgfTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnMSwKLQkJCQkJCQlhcmdzKTsKLQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRJZCgpLCAwLCBtZXNzYWdlLCBudWxsKTsKLQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc0N5Y2xpY0RlcGVuZGVuY3koQWN0aXZpdHkgYWN0aXZpdHksIFByb2Nlc3MgcHJvY2VzcykgewotCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGFjdGl2aXR5KSB7Ci0KLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMEw7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoQWN0aXZpdHkpIG9iamVjdCkKLQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJCX0KLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJfQotCi0JCX07Ci0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJVmFyaWFiaWxpdHlUeXBlIHZUeXBlID0gdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQlpZiAoYmFzZSAhPSBudWxsICYmICh2VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKSkgewotCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwKLQkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBiYXNlKTsKLQkJCQlpZiAocHJvYyA9PSBwcm9jZXNzKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHBhcmVudCBpcyBhIHN1cGVyIGFjdGl2aXR5IG9mIGNoaWxkLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gY2hpbGQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGFyZW50KEFjdGl2aXR5IHBhcmVudCwgQnJlYWtkb3duRWxlbWVudCBjaGlsZCkgewotCQlmb3IgKEFjdGl2aXR5IGFjdCA9IGNoaWxkLmdldFN1cGVyQWN0aXZpdGllcygpOyBhY3QgIT0gbnVsbDsgYWN0ID0gYWN0Ci0JCQkJLmdldFN1cGVyQWN0aXZpdGllcygpKSB7Ci0JCQlpZiAoYWN0ID09IHBhcmVudCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgZm9yIGN5Y2xlcyBpbiBkZXBlbmRlbmN5IHBhdGggb2YgdGhlIGdpdmVuIGFjdGl2aXR5Ci0JICogPGNvZGU+YWN0PC9jb2RlPiBpZiA8Y29kZT5iYXNlPC9jb2RlPiBpcyB0aGUgYmFzZSBhY3Rpdml0eSBvZgotCSAqIDxjb2RlPmFjdDwvY29kZT4gZm9yIGdpdmVuIHZhcmlhYmlsaXR5IHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHBhcmFtIGJhc2UKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koQWN0aXZpdHkgYWN0LCBBY3Rpdml0eSBiYXNlLAotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUpIHsKLQkJcmV0dXJuIGNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdCwgYmFzZSwgdHlwZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZGVuY3lBZnRlckZpbHRlclNlbGVjdGlvbihBY3Rpdml0eSBhY3QsIEFjdGl2aXR5IGJhc2UsCi0JCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSkgewotCQlyZXR1cm4gY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koYWN0LCBiYXNlLCB0eXBlLCB0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBjaGVja0NpcmN1bGFyRGVwZW5kZW5jeShBY3Rpdml0eSBhY3QsIEFjdGl2aXR5IGJhc2UsCi0JCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSwgYm9vbGVhbiBmaWx0ZXJpbmcpIHsKLQkJaWYoKGJhc2UgaW5zdGFuY2VvZiBQcm9jZXNzKQotCQkJCSYmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFU19MSVRFUkFMKSAmJiAhKGFjdCBpbnN0YW5jZW9mIFByb2Nlc3MpKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzM7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKGlzUGFyZW50KGJhc2UsIGFjdCkpIHsKLQkJCU9iamVjdFtdIGFyZ3MgPSB7IGFjdC5nZXROYW1lKCkgfTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzEsCi0JCQkJCQkJYXJncyk7Ci0KLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0SWQoKSwgMCwgbWVzc2FnZSwgbnVsbCk7Ci0JCX0gCi0JCWVsc2UgaWYgKG5ld0NoZWNrQWN0ICYmIGZpbHRlcmluZykgewotCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRDaXJjdWxhckRlcGVuZGVuY3lDaGVja0ZpbHRlcihhY3QpOwotCQkJaWYgKCEgZmlsdGVyLmFjY2VwdChiYXNlKSkgewotCQkJCU9iamVjdFtdIGFyZ3MgPSB7IGFjdC5nZXROYW1lKCksIGJhc2UuZ2V0TmFtZSgpIH07Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMKLQkJCQkJCS5iaW5kKAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cyLAotCQkJCQkJCQlhcmdzKTsKLQotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJZWxzZSBpZiAoaXNDaXJjdWxhckRlcGVuZGVuY3koYWN0LCBiYXNlKSkgewotCQkJT2JqZWN0W10gYXJncyA9IHsgYWN0LmdldE5hbWUoKSwgYmFzZS5nZXROYW1lKCkgfTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzIsCi0JCQkJCQkJYXJncyk7Ci0KLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0SWQoKSwgMCwgbWVzc2FnZSwgbnVsbCk7Ci0JCX0KLQkJLy8gYmxvY2sgZm9yIGNoaWxkcmVuCi0JCWVsc2UgaWYgKFByb2Nlc3NVdGlsLmhhc0NvbnRyaWJ1dG9yT3JSZXBsYWNlcihiYXNlKQotCQkJCSYmIHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCkgewotCQkJT2JqZWN0W10gYXJncyA9IHsgYWN0LmdldE5hbWUoKSwgYmFzZS5nZXROYW1lKCkgfTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZywKLQkJCQkJCQlhcmdzKTsKLQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRJZCgpLCAwLCBtZXNzYWdlLCBudWxsKTsKLQkJfQotCQlQcm9jZXNzIHByb2Nlc3MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KTsKLQkJaWYocHJvY2VzcyAhPSBudWxsICYmIGhhc0N5Y2xpY0RlcGVuZGVuY3koYmFzZSwgcHJvY2VzcykpIHsKLQkJCU9iamVjdFtdIGFyZ3MgPSB7IGFjdC5nZXROYW1lKCksIGJhc2UuZ2V0TmFtZSgpIH07Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUwotCQkJCQkuYmluZCgKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cyLAotCQkJCQkJCWFyZ3MpOwotCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQotCS8qKgotCSAqIENoZWNrIGZvciBjaXJjdWxhciBkZXBlbmRlbmN5IGlmIDxjb2RlPmJhc2U8L2NvZGU+IGlzIHRoZSBiYXNlIGVsZW1lbnQKLQkgKiBvZiB0aGUgZ2l2ZW4gPGNvZGU+ZWxlbWVudDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGJhc2UKLQkgKiAgICAgICAgICAgIGJhc2UgZWxlbWVudAotCSAqIEByZXR1cm4gc3RhdHVzIHdoaWNoIGluZGljYXRlcyBjaXJjdWxhciBkZXBlbmVkZW5jeSBpcyBkZXRlY3RlZCBvciBub3QKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ2lyY3VsYXJEZXBlbmRlbmN5KFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50LAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UpIHsKLQkJLy8gc3RhbmRhcmQgY2hlY2sKLQkJLy8KLQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBiYXNlLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQl3aGlsZSAodHlwZSAhPSBWYXJpYWJpbGl0eVR5cGUuTkFfTElURVJBTCkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gYmFzZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAodmUgIT0gbnVsbCAmJiB2ZSA9PSBlbGVtZW50KQotCQkJCXJldHVybiB0cnVlOwotCQkJYmFzZSA9IHZlOwotCQkJdHlwZSA9IHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgd2hldGhlciBnaXZlbiBkZWxpdmVyYWJsZXMgbGVhZHMgdG8gY2lyY3VsYXIgZGVwZW5kZW5jeQotCSAqIAotCSAqIEBwYXJhbSB0b0JlUGFydAotCSAqIEBwYXJhbSBkZWxpdmVyYWJsZQotCSAqIEByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGluZGljYXRlIHdoZXRoZXIgY2lyY3VsYXIgZGVwZW5kZW5jeSBpcwotCSAqICAgICAgICAgZGV0ZWN0ZWQsIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcyhEZWxpdmVyYWJsZSB0b0JlUGFydCwKLQkJCURlbGl2ZXJhYmxlIGRlbGl2ZXJhYmxlKSB7Ci0JCWlmIChuZXdDaGVjaykgewotCQkJcmV0dXJuICEgc291cmNlUmVhY2hhYmxlQnlUYXJnZXQodG9CZVBhcnQsIGRlbGl2ZXJhYmxlKTsKLQkJfQotCQkKLQkJaWYgKHRvQmVQYXJ0ID09IGRlbGl2ZXJhYmxlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJamF2YS51dGlsLkxpc3QgZGVsaXZlcmFibGVzID0gdG9CZVBhcnQuZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCk7Ci0JCWlmIChkZWxpdmVyYWJsZXMgIT0gbnVsbCAmJiBkZWxpdmVyYWJsZXMuc2l6ZSgpID4gMCkgewotCQkJaWYgKGRlbGl2ZXJhYmxlcy5jb250YWlucyhkZWxpdmVyYWJsZSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRlbGl2ZXJhYmxlcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJCXJldHVybiBjaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKChEZWxpdmVyYWJsZSkgb2JqLAotCQkJCQkJCWRlbGl2ZXJhYmxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBDdXN0b21DYXRlZ29yeSBpcyBhbiBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4KLQkgKiBEZXNjaWJhYmxlRWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBjYwotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FuY2Vzc29yT2YoQ3VzdG9tQ2F0ZWdvcnkgY2MsIERlc2NyaWJhYmxlRWxlbWVudCBlKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoY2MsIGZhbHNlKSB7Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJcmV0dXJuICgoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdCkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJCQkJLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoaXRlci5uZXh0KCkgPT0gZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGNpcmN1bGFyIGRlcGVuZGVuY3kgd2hlbiBtb3ZpbmcgYSBjb2xsZWN0aW9uIG9mIGFydGlmYWN0IG9iamVjdHMKLQkgKiBpbiAic291cmNlRWxlbWVudHMiIHVuZGVyICJkZXN0aW5hdGlvbiIKLQkgKiAKLQkgKiBAcGFyYW0gZGVzdGluYXRpb24KLQkgKiBAcGFyYW0gc291cmNlRWxlbWVudHMKLQkgKiBAcmV0dXJuIHRydWUgaWYgbm8gY2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZCwgb3RoZXJ3aXNlIGZhbHNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJGb3JBcnRpZmFjdHMoQXJ0aWZhY3QgZGVzdGluYXRpb24sCi0JCQlDb2xsZWN0aW9uIHNvdXJjZUVsZW1lbnRzKSB7Ci0JCUhhc2hTZXQgdmFyaWFudFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWNvbGxlY3RWYXJpYW50U2V0KGRlc3RpbmF0aW9uLCB2YXJpYW50U2V0LCBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVNfTElURVJBTCk7Ci0JCWNvbGxlY3RWYXJpYW50U2V0KGRlc3RpbmF0aW9uLCB2YXJpYW50U2V0LCBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKTsKLQkJaWYgKCEgY2hlY2tDaXJjdWxhckZvckFydGlmYWN0czEoZGVzdGluYXRpb24sIHNvdXJjZUVsZW1lbnRzLCB2YXJpYW50U2V0KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBjaGVja0NpcmN1bGFyRm9yQXJ0aWZhY3RzMihkZXN0aW5hdGlvbiwgc291cmNlRWxlbWVudHMpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJGb3JBcnRpZmFjdHMxKEFydGlmYWN0IGRlc3RpbmF0aW9uLAotCQkJQ29sbGVjdGlvbiBzb3VyY2VFbGVtZW50cywgSGFzaFNldCB2YXJpYW50U2V0KSB7Ci0JCWlmIChzb3VyY2VFbGVtZW50cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEFydGlmYWN0KXsKLQkJCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgb2JqOwotCQkJCWlmICh2YXJpYW50U2V0LmNvbnRhaW5zKGFydGlmYWN0KSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmICghIGNoZWNrQ2lyY3VsYXJGb3JBcnRpZmFjdHMxKGRlc3RpbmF0aW9uLCBhcnRpZmFjdC5nZXRDb250YWluZWRBcnRpZmFjdHMoKSwgdmFyaWFudFNldCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0JCQkKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGVja0NpcmN1bGFyRm9yQXJ0aWZhY3RzMihBcnRpZmFjdCBkZXN0aW5hdGlvbiwKLQkJCUNvbGxlY3Rpb24gc291cmNlRWxlbWVudHMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc291cmNlRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QgJiYgc291cmNlSXNPckFib3ZlTWUoKEFydGlmYWN0KSBvYmosIGRlc3RpbmF0aW9uKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0JCQkKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzb3VyY2VJc09yQWJvdmVNZShBcnRpZmFjdCBzb3VyY2UsIEFydGlmYWN0IG1lKSB7Ci0JCWlmIChzb3VyY2UgPT0gbWUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCU9iamVjdCBvYmogPSBtZS5nZXRDb250YWluZXJBcnRpZmFjdCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QgJiYgc291cmNlSXNPckFib3ZlTWUoc291cmNlLCAoQXJ0aWZhY3QpIG9iaikpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCW9iaiA9IG1lLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFydGlmYWN0ICYmIHNvdXJjZUlzT3JBYm92ZU1lKHNvdXJjZSwgKEFydGlmYWN0KSBvYmopKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvL0NvbGxlY3QgYWxsIHZhcmlhbnRzIG9mICJhIiBhbmQgImEicyBhbmNlc3Ryb3IgQXJ0aWZhY3Qgb2JqZWN0cwotCXByaXZhdGUgc3RhdGljIHZvaWQgY29sbGVjdFZhcmlhbnRTZXQoQXJ0aWZhY3QgYSwgSGFzaFNldCB2YXJpYW50U2V0LCBWYXJpYWJpbGl0eVR5cGUgdHlwZSkgewotCQl3aGlsZSAoYSAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBUbmdVdGlsLmdldEdlbmVyYWxpemVycyhhLCB0eXBlKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJdmFyaWFudFNldC5hZGQoaXRlci5uZXh0KCkpOwotCQkJfQotCQkJYSA9IGEuZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKTsKLQkJfQotCX0JCQkKLQkKLQlwcml2YXRlIHN0YXRpYyBDaXJjdWxhckRlcGVuZGVuY3lDaGVjayBnZXRDaXJjdWxhckRlcGVuZGVuY3lDaGVjayhWYXJpYWJpbGl0eUVsZW1lbnQgdmUsIAotCQkJCQlib29sZWFuIGZpbHRlciwgYm9vbGVhbiBtb3ZlLCBib29sZWFuIGRuZCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeSh2ZSk7CQkJCQkJCi0JCURlcGVuZGVuY3lJbmZvTWdyIGRlcEluZm9NZ3IgPSBuZXcgRGVwZW5kZW5jeUluZm9NZ3IobGliKTsKLQkJZGVwSW5mb01nci5zZXREbmRCaXQoZG5kKTsKLQkJcmV0dXJuIG5ldyBDaXJjdWxhckRlcGVuZGVuY3lDaGVjayhkZXBJbmZvTWdyLCB2ZSwgZmlsdGVyLCBtb3ZlIHx8IGRuZCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc291cmNlUmVhY2hhYmxlQnlUYXJnZXQoVmFyaWFiaWxpdHlFbGVtZW50IHNvdXJjZSwgVmFyaWFiaWxpdHlFbGVtZW50IHRhcmdldCkgewotCQlyZXR1cm4gZ2V0Q2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2soc291cmNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKS5yZWFjaGFibGVCeSh0YXJnZXQpOwotCX0KLQkKLQkvKioKLQkgKiByZXR1cm4gYSBjaXJjdWxhciBkZXBlbmRlbmN5IGNoZWNrIGZpbHRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZpbHRlciBnZXRDaXJjdWxhckRlcGVuZGVuY3lDaGVja0ZpbHRlcihWYXJpYWJpbGl0eUVsZW1lbnQgdmUpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkodmUpOwkJCQkJCQotCQlEZXBlbmRlbmN5SW5mb01nciBkZXBJbmZvTWdyID0gbmV3IERlcGVuZGVuY3lJbmZvTWdyKGxpYik7Ci0JCXJldHVybiBuZXcgQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2tGaWx0ZXIoZGVwSW5mb01nciwgdmUpOwotCX0JCi0JCi0JLy9SZXR1cm4gdHJ1ZSBpZiBubyBjaXJjdWxhciBkZXRlY3RlZAotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0NpcmN1bGFyRm9yTW92aW5nVmFyaWFiaWxpdHlFbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCBkZXN0aW5hdGlvbiwKLQkJCUNvbGxlY3Rpb24gc291cmNlRWxlbWVudHMpIHsKLQkJcmV0dXJuIGNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQoZGVzdGluYXRpb24sIHNvdXJjZUVsZW1lbnRzLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0NpcmN1bGFyRm9yTW92aW5nVmFyaWFiaWxpdHlFbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCBkZXN0aW5hdGlvbiwKLQkJCUNvbGxlY3Rpb24gc291cmNlRWxlbWVudHMsIGJvb2xlYW4gZG5kKSB7Ci0JCWlmICghIERlcGVuZGVuY3lJbmZvTWdyLlZlVG9DaGVjayhkZXN0aW5hdGlvbikpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlDaXJjdWxhckRlcGVuZGVuY3lDaGVjayBjaGVjayA9IGdldENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrKGRlc3RpbmF0aW9uLCBmYWxzZSwgdHJ1ZSwgZG5kKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHNvdXJjZUVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWlmICghIGNoZWNrLmFjY2VwdChpdC5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5QWZ0ZXJGaWx0ZXJTZWxlY3Rpb24oVmFyaWFiaWxpdHlFbGVtZW50IHZlLCBWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSkgewotCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRDaXJjdWxhckRlcGVuZGVuY3lDaGVja0ZpbHRlcih2ZSk7Ci0JCQlpZiAoISBmaWx0ZXIuYWNjZXB0KGJhc2UpKSB7Ci0JCQkJT2JqZWN0W10gYXJncyA9IHsgdmUuZ2V0TmFtZSgpLCBiYXNlLmdldE5hbWUoKSB9OwotCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCQkuYmluZCgKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMudmFyaWFiaWxpdHlfZXJyb3JfbXNnLAotCQkJCQkJCQlhcmdzKTsJCS8vTm90IHJpZ2h0IG1lc3NhZ2UsIG5lZWQgdG8gYWRkIGEgbmV3IHJlc291Y2Ugc3RyaW5nIGxhdGVyIQotCQotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lJbmZvTWdyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9EZXBlbmRlbmN5SW5mb01nci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZTc4Y2ExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lJbmZvTWdyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5Qcm9maWxpbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIG1hbmFnZXMgY2lyY3VsYXIgZGVwZW5kZW5jeSBpbmZvLgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERlcGVuZGVuY3lJbmZvTWdyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHByb2ZpbGluZyA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgbGliOwotCXByaXZhdGUgTWFwIHJlYWNoYWJsZUluZm9NYXA7CS8ve2d1aWQsIHVwd2FyZFJlYWNoYWJsZUluZm99Ci0JcHJpdmF0ZSBNYXAgcmVwbGFjZXJNYXA7Ci0JcHJpdmF0ZSBNYXAgcHJvY2Vzc2VkOwotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBmaWx0ZXJFbGVtZW50OwotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBtb3ZlRWxlbWVudDsKLQlwcml2YXRlIExpc3QgY2lyY3VsYXJMaXN0OwotCXByaXZhdGUgYm9vbGVhbiBkbmRCaXQgPSBmYWxzZTsKLQkKLQlwdWJsaWMgRGVwZW5kZW5jeUluZm9NZ3IoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJdGhpcy5saWIgPSBsaWI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGxvZ0NpcmN1bGFyRGVwZW5kZW5jeShTdGFjayB0cmFjZSkgewotCQlpZiAoY2lyY3VsYXJMaXN0ID09IG51bGwpIHsKLQkJCWNpcmN1bGFyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQljaXJjdWxhckxpc3QuYWRkQWxsKHRyYWNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGdldEFuZENsZWFyQ2lyY3VsYXJMaXN0KCkgewotCQlMaXN0IHJldCA9IGNpcmN1bGFyTGlzdDsKLQkJY2lyY3VsYXJMaXN0ID0gbnVsbDsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNGaWx0ZXJFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbSkgewotCQlyZXR1cm4gZmlsdGVyRWxlbWVudCA9PSBlbGVtOwotCX0JCi0JCi0JcHVibGljIGJvb2xlYW4gaXNNb3ZlRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW0pIHsKLQkJcmV0dXJuIG1vdmVFbGVtZW50ID09IGVsZW07Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2coU3RyaW5nIG1zZykgewotCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2cobXNnKTsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZG5lY3koVmFyaWFiaWxpdHlFbGVtZW50IHZlKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdmU6ICIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgodmUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQlJRGVwZW5kZW5jeUluZm8gaW5mbyA9IHJlZ2lzdGVyVmFyaWFiaWxpdHlFbGVtZW50KHZlLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQlMaXN0IGNpckxpc3QgPSBnZXRBbmRDbGVhckNpcmN1bGFyTGlzdCgpOwotCQlib29sZWFuIGxvb3AgPSBjaXJMaXN0ICE9IG51bGwgJiYgIWNpckxpc3QuaXNFbXB0eSgpOwotCQlib29sZWFuIHJlcGxhY2luZ0FuY2VzdG9yID0gaW5mby5pbmhlcml0QW5jZXN0b3IoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUwpOwotCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhMaWJyYXJ5RWRpdFBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobG9vcCkgewotCQkJbG9nKCJFcnJvcj4gQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZDogIik7CQkvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpPTA7IGk8Y2lyTGlzdC5zaXplKCk7IGkrKykgewotCQkJCUlEZXBlbmRlbmN5SW5mbyBsb29wSW5mbyA9IChJRGVwZW5kZW5jeUluZm8pIGNpckxpc3QuZ2V0KGkpOwotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IGxvb3BJbmZvLmdldEVsZW1lbnQoKTsJCQkJCQkJCi0JCQkJbG9nKCJFcnJvcj4gIiArIGkgKyAiOiAiICsgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVsZW0pKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCQotCQkJbXVsdGlTdGF0dXMuYWRkKG5ldyBWYWxpZGF0aW9uU3RhdHVzKElTdGF0dXMuRVJST1IsIDAsIGdlbkVycm9yTXNnKGNpckxpc3QpLCB2ZSwgbnVsbCkpOwkJCQotCQl9Ci0JCWlmIChyZXBsYWNpbmdBbmNlc3RvcikgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gaW5mby5nZXRFbGVtZW50KCk7Ci0JCQlsb2coIkVycm9yPiAiICsgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVsZW0pICsgIiBpcyByZXBsYWNpbmcgYW4gYW5jZXN0b3IuIik7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkKLQkJCW11bHRpU3RhdHVzLmFkZChuZXcgVmFsaWRhdGlvblN0YXR1cyhJU3RhdHVzLkVSUk9SLCAwLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5yZXBsYWNpbmdfYW5jZXN0b3JfZXJyb3JfbXNnLCB2ZSwgbnVsbCkpOwkJCQkJCQkKLQkJfQotCQkKLQkJcmV0dXJuIG11bHRpU3RhdHVzOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZW5FcnJvck1zZyhMaXN0IGNpckxpc3QpIHsKLQkJU3RyaW5nIG1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnZhcmlhYmlsaXR5X2VsZW1lbnRfY2lyY3VsYXJfbG9vcF9lcnJvcl9tc2c7Ci0JCWZvciAoaW50IGk9MDsgaTxjaXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlJRGVwZW5kZW5jeUluZm8gbG9vcEluZm8gPSAoSURlcGVuZGVuY3lJbmZvKSBjaXJMaXN0LmdldChpKTsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IGxvb3BJbmZvLmdldEVsZW1lbnQoKTsJCi0JCQlpZiAoaSA+IDApIHsKLQkJCQltc2cgKz0gIjogIjsgLy8kTk9OLU5MUy0xJCAKLQkJCX0KLQkJCW1zZyArPSBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbSk7CQotCQl9Ci0JCXJldHVybiBtc2c7Ci0JfQotCQkJCi0JcHVibGljIElEZXBlbmRlbmN5SW5mbyByZWdpc3RlclZhcmlhYmlsaXR5RWxlbWVudChWYXJpYWJpbGl0eUVsZW1lbnQgdmUsIAotCQkJYm9vbGVhbglpc0ZpbHRlckVsZW1lbnQsIGJvb2xlYW4gaXNNb3ZlRWxlbWVudCkgewotCQlyZXR1cm4gcmVnaXN0ZXJWYXJpYWJpbGl0eUVsZW1lbnQodmUsIGlzRmlsdGVyRWxlbWVudCwgaXNNb3ZlRWxlbWVudCwgZmFsc2UpOwotCX0KLQkKLQlwcml2YXRlIElEZXBlbmRlbmN5SW5mbyByZWdpc3RlclZhcmlhYmlsaXR5RWxlbWVudChWYXJpYWJpbGl0eUVsZW1lbnQgdmUsIAotCQkJYm9vbGVhbglpc0ZpbHRlckVsZW1lbnQsIGJvb2xlYW4gaXNNb3ZlRWxlbWVudCwgYm9vbGVhbiBjaGVja0NpcmN1bGFyKSB7Ci0JCWlmIChpc0ZpbHRlckVsZW1lbnQpIHsKLQkJCWZpbHRlckVsZW1lbnQgPSB2ZTsKLQkJfQotCQlpZiAoaXNNb3ZlRWxlbWVudCkgewotCQkJbW92ZUVsZW1lbnQgPSB2ZTsKLQkJfQkJCi0JCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gIGdldFByb2Nlc3NlZEluZm8odmUpOwotCQlpZiAoaW5mbyA9PSBudWxsKSB7CQkKLQkJCWluZm8gPSBuZXdEZXBlbmRlbmN5SW5mbyh0aGlzLCB2ZSk7Ci0JCX0KLQkJaWYgKCEgaW5mby5pc0NvbXBsZXRlKCkpIHsKLQkJCWluZm8uYnVpbGQoY2hlY2tDaXJjdWxhcik7Ci0JCX0KLQkJcmV0dXJuIGluZm87Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NlZChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHByb2Nlc3NlZCAhPSBudWxsICYmIHByb2Nlc3NlZC5jb250YWluc0tleShlbGVtZW50LmdldEd1aWQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBJRGVwZW5kZW5jeUluZm8gZ2V0UHJvY2Vzc2VkSW5mbyhNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHByb2Nlc3NlZCA9PSBudWxsID8gbnVsbCA6IChJRGVwZW5kZW5jeUluZm8pIHByb2Nlc3NlZC5nZXQoZWxlbWVudC5nZXRHdWlkKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1Byb2Nlc3NlZChJRGVwZW5kZW5jeUluZm8gaW5mbykgewotCQlpZiAocHJvY2Vzc2VkID09IG51bGwpIHsKLQkJCXByb2Nlc3NlZCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJcHJvY2Vzc2VkLnB1dChpbmZvLmdldEVsZW1lbnQoKS5nZXRHdWlkKCksIGluZm8pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1JlcGxhY2VyTWFwKElEZXBlbmRlbmN5SW5mbyByZXBsYWNlckluZm8pIHsKLQkJaWYgKHJlcGxhY2VyTWFwID09IG51bGwpIHsKLQkJCXJlcGxhY2VyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlyZXBsYWNlck1hcC5wdXQocmVwbGFjZXJJbmZvLmdldEVsZW1lbnQoKS5nZXRHdWlkKCksIHJlcGxhY2VySW5mbyk7Ci0JfQkKLQkJCi0JcHJpdmF0ZSBJRGVwZW5kZW5jeUluZm8gYWRkVG9SZWFjaGFibGVJbmZvTWFwKE1ldGhvZEVsZW1lbnQgZWxlbSkgewotCQlpZiAocmVhY2hhYmxlSW5mb01hcCA9PSBudWxsKSB7Ci0JCQlyZWFjaGFibGVJbmZvTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlJRGVwZW5kZW5jeUluZm8gaW5mbyA9IChJRGVwZW5kZW5jeUluZm8pIHJlYWNoYWJsZUluZm9NYXAuZ2V0KGVsZW0uZ2V0R3VpZCgpKTsKLQkJaWYgKGluZm8gPT0gbnVsbCkgewkJCi0JCQlpbmZvID0gbmV3RGVwZW5kZW5jeUluZm8odGhpcywgZWxlbSk7Ci0JCQlyZWFjaGFibGVJbmZvTWFwLnB1dChlbGVtLmdldEd1aWQoKSwgaW5mbyk7Ci0JCX0JCQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQkvKgotCSAqIERldGVjdCBjaXJjdWxhciBkZXBlbmRlbmN5IGZvciB0aGUgd2hvbGUgbGlicmFyeQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NpcmN1bGFyRGVwZW5kZW5jeSgpICB7Ci0JCWJ1aWxkUmVhY2hhYmxlSW5mb01hcCgpOwotCQkKLQkJYm9vbGVhbiByZXBsYWNpbmdBY2VzdG9yID0gZmFsc2U7Ci0JCWlmIChyZXBsYWNlck1hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVwbGFjZXJNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVVwd2FyZFJlYWNoYWJsZUluZm8gaW5mbyA9IChVcHdhcmRSZWFjaGFibGVJbmZvKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGluZm8uaW5oZXJpdEFuY2VzdG9yKFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFU19MSVRFUkFMKSkgewotCQkJCQlyZXBsYWNpbmdBY2VzdG9yID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGRlYnVnICYmIGNpcmN1bGFyTGlzdCAhPSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBDaXJjdWxhciBsb29wcyBkZXRlY3RlZDogIik7CS8vJE5PTi1OTFMtMSQKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjaXJjdWxhckxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVN0YWNrIHN0YWNrID0gKFN0YWNrKSBpdC5uZXh0KCk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPHN0YWNrLnNpemUoKTsgaSsrKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+ICIgKyAoaSkgKyAiOiAiICsgc3RhY2suZ2V0KGkpKTsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmVwbGFjaW5nQWNlc3RvciB8fCBudW1DaXJjdWxhckRlcGVuZGVuY3koKSA+IDA7Ci0JfQotCQotCXByaXZhdGUgaW50IG51bUNpcmN1bGFyRGVwZW5kZW5jeSgpIHsKLQkJcmV0dXJuIGNpcmN1bGFyTGlzdCA9PSBudWxsID8gMCA6IGNpcmN1bGFyTGlzdC5zaXplKCk7Ci0JfQotCQotCS8vdG8gYmUgc3BlY2lhbGl6ZWQgYnkgc3ViIGNsYXNzZXMKLQlwcm90ZWN0ZWQgSURlcGVuZGVuY3lJbmZvIG5ld0RlcGVuZGVuY3lJbmZvKERlcGVuZGVuY3lJbmZvTWdyIG1nciwgTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCXJldHVybiAgbmV3IFVwd2FyZFJlYWNoYWJsZUluZm8odGhpcywgZWxlbSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFJlYWNoYWJsZUluZm9NYXAoKSB7Ci0JCWxvbmcgdXNlZE1lbTAgPSAwOwotCQlSdW50aW1lIHJ0ID0gUnVudGltZS5nZXRSdW50aW1lKCk7IAotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGliLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJaXQubmV4dCgpOwotCQkJfQotCQkJUHJvZmlsaW5nVXRpbC5mdWxsR0MoKTsKLQkJCXVzZWRNZW0wID0gcnQudG90YWxNZW1vcnkoKSAtIHJ0LmZyZWVNZW1vcnkoKTsKLQkJfQotCQkKLQkJYnVpbGRSZWFjaGFibGVJbmZvTWFwXygpOwotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlQcm9maWxpbmdVdGlsLmZ1bGxHQygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdXNlZE1lbTA6ICIgKyB1c2VkTWVtMC8xMDAwICsgIiBrIGJ5dGVzIik7Ci0JCQlsb25nIHVzZWRNZW0xID0gcnQudG90YWxNZW1vcnkoKSAtIHJ0LmZyZWVNZW1vcnkoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHVzZWRNZW0xOiAiICsgdXNlZE1lbTEvMTAwMCArICIgayBieXRlcyIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZGlmZk1lbTogIiArICh1c2VkTWVtMSAtIHVzZWRNZW0wKS8xMDAwICsgIiBrIGJ5dGVzIik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRSZWFjaGFibGVJbmZvTWFwXygpIHsKLQkJcmVhY2hhYmxlSW5mb01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3QgcGx1Z2lucyA9IGxpYi5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHBsdWdpbnMuZ2V0KGkpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbi5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKFZlVG9DaGVjayhvYmopKSB7Ci0JCQkJCWFkZFRvUmVhY2hhYmxlSW5mb01hcCgoTWV0aG9kRWxlbWVudCkgb2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSByZWFjaGFibGVJbmZvTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gKElEZXBlbmRlbmN5SW5mbykgaXQubmV4dCgpOwotCQkJaWYgKCEgcHJvY2Vzc2VkKGluZm8uZ2V0RWxlbWVudCgpKSkgewotCQkJCWluZm8uYnVpbGQodHJ1ZSk7Ci0JCQl9Ci0JCX0JCi0KLQl9CQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIFZlVG9DaGVjayhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiAJb2JqIGluc3RhbmNlb2YgRG9tYWluIHx8IAotCQkJCW9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5IHx8IAotCQkJCW9iaiBpbnN0YW5jZW9mIEFydGlmYWN0IHx8IAotCQkJCW9iaiBpbnN0YW5jZW9mIFByYWN0aWNlIHx8IAotCQkJCW9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlIHx8Ci0JCQkJb2JqIGluc3RhbmNlb2YgQWN0aXZpdHk7Ci0JfQotCQotCS8qCi0JICogQ2hlY2sgY2lyY3VsYXIgZGVwZW5kZW5jeSBmb3IgdGhlIGxpYnJhcnkuCi0JICovCi0JcHVibGljIENoZWNrUmVzdWx0IGNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KFRyYWNlciB0cmFjZXIpIHsKLQkJbG9uZyB1c2VkTWVtMCA9IDA7Ci0JCVJ1bnRpbWUgcnQgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsgCi0JCWlmIChwcm9maWxpbmcpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBsaWIuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlpdC5uZXh0KCk7Ci0JCQl9Ci0JCQlQcm9maWxpbmdVdGlsLmZ1bGxHQygpOwotCQkJdXNlZE1lbTAgPSBydC50b3RhbE1lbW9yeSgpIC0gcnQuZnJlZU1lbW9yeSgpOwotCQl9Ci0KLQkJQ2hlY2tSZXN1bHQgcmVzdWx0ID0gY2hlY2tDaXJjdWxhckRlcGVuZG5lY3lfKHRyYWNlcik7Ci0JCQotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlQcm9maWxpbmdVdGlsLmZ1bGxHQygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdXNlZE1lbTA6ICIgKyB1c2VkTWVtMC8xMDAwICsgIiBrIGJ5dGVzIik7Ci0JCQlsb25nIHVzZWRNZW0xID0gcnQudG90YWxNZW1vcnkoKSAtIHJ0LmZyZWVNZW1vcnkoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHVzZWRNZW0xOiAiICsgdXNlZE1lbTEvMTAwMCArICIgayBieXRlcyIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZGlmZk1lbTogIiArICh1c2VkTWVtMSAtIHVzZWRNZW0wKS8xMDAwICsgIiBrIGJ5dGVzIik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBDaGVja1Jlc3VsdCBjaGVja0NpcmN1bGFyRGVwZW5kbmVjeV8oVHJhY2VyIHRyYWNlcikgewotCQlDaGVja1Jlc3VsdCByZXN1bHQgPSBuZXcgQ2hlY2tSZXN1bHQoKTsKLQkJCi0JCUhhc2hTZXQgc2VlbiA9IG5ldyBIYXNoU2V0KCk7Ci0JCUxpc3QgcGx1Z2lucyA9IGxpYi5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGlpdCA9IHBsdWdpbi5lQWxsQ29udGVudHMoKTsgaWl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaWl0Lm5leHQoKTsKLQkJCQlpZiAoc2Vlbi5jb250YWlucyhvYmopKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlzZWVuLmFkZChvYmopOwkJCQkKLQkJCQlpZiAoVmVUb0NoZWNrKG9iaikpIHsKLQkJCQkJSURlcGVuZGVuY3lJbmZvIGluZm8gPSByZWdpc3RlclZhcmlhYmlsaXR5RWxlbWVudCgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmosIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCQkJCUxpc3QgY2lyTGlzdCA9IGdldEFuZENsZWFyQ2lyY3VsYXJMaXN0KCk7Ci0JCQkJCQotCQkJCQlib29sZWFuIGxvb3AgPSBjaXJMaXN0ICE9IG51bGwgJiYgIWNpckxpc3QuaXNFbXB0eSgpOwotCQkJCQlib29sZWFuIHJlcGxhY2luZ0FuY2VzdG9yID0gaW5mby5pbmhlcml0QW5jZXN0b3IoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUwpOwotCQkJCQkKLQkJCQkJaWYgKGxvb3ApIHsKLQkJCQkJCXRyYWNlci50cmFjZSgiRXJyb3I+IENpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQ6ICIpOwkJLy8kTk9OLU5MUy0xJAotCQkJCQkJZm9yIChpbnQgaT0wOyBpPGNpckxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQlJRGVwZW5kZW5jeUluZm8gbG9vcEluZm8gPSAoSURlcGVuZGVuY3lJbmZvKSBjaXJMaXN0LmdldChpKTsKLQkJCQkJCQlNZXRob2RFbGVtZW50IGVsZW0gPSBsb29wSW5mby5nZXRFbGVtZW50KCk7CQkJCQkJCQotCQkJCQkJCXRyYWNlci50cmFjZSgiRXJyb3I+ICIgKyBpICsgIjogIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtKSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCQlyZXN1bHQuY2lyY3VsYXJMaXN0LmFkZChjaXJMaXN0KTsKLQkJCQkJfQotCQkJCQlpZiAocmVwbGFjaW5nQW5jZXN0b3IpIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IGluZm8uZ2V0RWxlbWVudCgpOwotCQkJCQkJdHJhY2VyLnRyYWNlKCJFcnJvcj4gIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtKSArICIgaXMgcmVwbGFjaW5nIGFuIGFuY2VzdG9yLiIpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJcmVzdWx0LnJlcGxhY2luZ0FuY2VzdG9yTGlzdC5hZGQoaW5mbyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0JCQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ2hlY2tSZXN1bHQgewotCQlwdWJsaWMgTGlzdCBjaXJjdWxhckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXB1YmxpYyBMaXN0IHJlcGxhY2luZ0FuY2VzdG9yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCXB1YmxpYyBpbnQgZ2V0RXJyb3JDb3VudCgpIHsKLQkJCXJldHVybiBjaXJjdWxhckxpc3Quc2l6ZSgpICsgcmVwbGFjaW5nQW5jZXN0b3JMaXN0LnNpemUoKTsKLQkJfQotCQkKLQkJcHVibGljIGludCBnZXRDaXJjdWxhckVsZW1lbnRDb3VudCgpIHsKLQkJCWludCBjb3VudCA9IHJlcGxhY2luZ0FuY2VzdG9yTGlzdC5zaXplKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8Y2lyY3VsYXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJTGlzdCBsaXN0ID0gKExpc3QpIGNpcmN1bGFyTGlzdC5nZXQoaSk7Ci0JCQkJaW50IHN6ID0gbGlzdCA9PSBudWxsID8gMCA6IGxpc3Quc2l6ZSgpOwotCQkJCWNvdW50ICs9IHN6OwotCQkJfQotCQkJcmV0dXJuIGNvdW50OwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzRG5kRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW0pIHsKLQkJcmV0dXJuIGRuZEJpdCAmJiBtb3ZlRWxlbWVudCA9PSBlbGVtOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREbmRCaXQoYm9vbGVhbiBiKSB7Ci0JCWRuZEJpdCA9IGI7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vRGVwZW5kZW5jeVZhbGlkYXRpb25NZ3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lWYWxpZGF0aW9uTWdyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NDJjYjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vRGVwZW5kZW5jeVZhbGlkYXRpb25NZ3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIG1hbmFnZXMgYWxsIGRlcGVuZGVuY3kgY2hlY2tzIGZvciB2YWxpZGF0aW9uCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW5jeVZhbGlkYXRpb25NZ3IgewotCQotCXByaXZhdGUgRGVwZW5kZW5jeUluZm9NZ3IgdmVEZXBJbmZvTWdyOwotCXByaXZhdGUgUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IgcGx1Z2luRGVwSW5mb01ncjsKLQkKLQlwdWJsaWMgRGVwZW5kZW5jeVZhbGlkYXRpb25NZ3IoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJdmVEZXBJbmZvTWdyID0gbmV3IERlcGVuZGVuY3lJbmZvTWdyKGxpYik7Ci0JCXBsdWdpbkRlcEluZm9NZ3IgPSBuZXcgUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IobGliKTsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZG5lY3koTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCXJldHVybiB2ZURlcEluZm9NZ3IuY2hlY2tDaXJjdWxhckRlcGVuZG5lY3koKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudCk7Ci0JCX0KLQkJCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlyZXR1cm4gcGx1Z2luRGVwSW5mb01nci5jaGVja0NpcmN1bGFyRGVwZW5kbmVjeSgoTWV0aG9kUGx1Z2luKSBlbGVtZW50KTsKLQkJfQkJCi0JCQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI5MDkyZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGRlcGVuZGVuY3kgaW5mbyB1c2VkIGluIGNpcmN1bGFyIGRlcGVuZGVuY3kgY2hlY2tpbmcKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURlcGVuZGVuY3lJbmZvIHsKLQkKLQl2b2lkIGJ1aWxkKGJvb2xlYW4gY2hlY2tDaXJjdWxhcik7Ci0JCi0JYm9vbGVhbiBpc0NvbXBsZXRlKCk7Ci0JCi0JYm9vbGVhbiByZWFjaGFibGVCeShJRGVwZW5kZW5jeUluZm8gaW5mbyk7Ci0JCi0JYm9vbGVhbiBpbmhlcml0QW5jZXN0b3IoVmFyaWFiaWxpdHlUeXBlIHR5cGUpOwotCQotCU1ldGhvZEVsZW1lbnQgZ2V0RWxlbWVudCgpOwotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSU5hbWVQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSU5hbWVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMDQ2Mjg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lOYW1lUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gcHJvdmlkZSBuYW1lIGZvciBhIHNwZWNpZmllZCBvYmplY3QKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKYW4gMzEsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5hbWVQcm92aWRlciB7Ci0JU3RyaW5nIGdldE5hbWUoT2JqZWN0IG9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcxNDJiMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciB2YWxpZGF0b3IuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDEsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmFsaWRhdG9yIHsKLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIGdpdmVuIHN0cmluZy4gUmV0dXJucyBhbiBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgaWYgdGhlCi0JICogbmV3IHRleHQgaXMgaW52YWxpZC4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBlcnJvci4KLQkgKiBOb3RlIHRoYXQgdGhlIGVtcHR5IHN0cmluZyBpcyBub3QgdHJlYXRlZCB0aGUgc2FtZSBhcyA8Y29kZT5udWxsPC9jb2RlPjsKLQkgKiBpdCBpbmRpY2F0ZXMgYW4gZXJyb3Igc3RhdGUgYnV0IHdpdGggbm8gbWVzc2FnZSB0byBkaXNwbGF5LgotCSAqIAotCSAqIEBwYXJhbSBuZXdUZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCB0byBjaGVjayBmb3IgdmFsaWRpdHkKLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGVycm9yIG1lc3NhZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gZXJyb3IKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpOwotCQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgZ2l2ZW4gb2JqZWN0IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gdmFsaWRhdGUKLQkgKiBAcmV0dXJuIGEgc3RhdHVzCi0JICovCi0JcHVibGljIElTdGF0dXMgaXNWYWxpZChPYmplY3QgdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSVZhbGlkYXRvckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lWYWxpZGF0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmYWYwYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSVZhbGlkYXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotCi0vKioKLSAqIEZhY3RvcnkgaW50ZXJmYWNlIHRvIGNyZWF0ZSB2YXJpb3VzIHZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgc3RyaW5nIHZhbHVlIG9mCi0gKiBzcGVjaWZpZWQgb2JqZWN0IGZlYXR1cmUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRvckZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVZhbGlkYXRvckZhY3RvcnkgSU5TVEFOQ0UgPSBWYWxpZGF0b3JGYWN0b3J5Ci0JCQkuY3JlYXRlVmFsaWRhdG9yRmFjdG9yeSgpOwotCi0JSVZhbGlkYXRvciBjcmVhdGVOYW1lVmFsaWRhdG9yKE5hbWVkRWxlbWVudCBlLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIG5hbWUgdmFsaWRhdG9yIGZvciBhIGNvbnRlbnQgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCUlWYWxpZGF0b3IgY3JlYXRlTmFtZVZhbGlkYXRvcihPYmplY3QgcGFyZW50LCBDb250ZW50RWxlbWVudCBlKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgbmFtZSB2YWxpZGF0b3IgZm9yIGEgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCUlWYWxpZGF0b3IgY3JlYXRlTmFtZVZhbGlkYXRvcihPYmplY3QgcGFyZW50LCBOYW1lZEVsZW1lbnQgZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIG5hbWUgdmFsaWRhdG9yIGZvciBhbiBlbGVtZW50IG9mIG5ld1R5cGUgd2l0aCBuYW1lIG9mIGUuZ2V0TmFtZSgpCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JSVZhbGlkYXRvciBjcmVhdGVOYW1lVmFsaWRhdG9yKE9iamVjdCBwYXJlbnQsIE5hbWVkRWxlbWVudCBlLCBFQ2xhc3MgbmV3VHlwZSk7Ci0KLQlJVmFsaWRhdG9yIGNyZWF0ZVByZXNlbnRhdGlvbk5hbWVWYWxpZGF0b3IoT2JqZWN0IHBhcmVudCwKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBlKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSB2YWxpZGF0b3IgZm9yIHRoZSBnaXZlbiBmZWF0dXJlIG9mIHRoZSBnaXZlbiBvYmplY3QuIFRoZSBvYmplY3QKLQkgKiBpcyByZWZlcmVuY2VkIGJ5IHRoZSBnaXZlbiBwYXJlbnQgdmlhIHRoZSBzcGVjaWZpZWQgcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gcmVmZXJlbmNlIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgdGhlIGZlYXR1cmUgdG8gdmFsaWRhdGUgaXRzIHZhbHVlCi0JICogQHBhcmFtIGVDbGFzcwotCSAqICAgICAgICAgICAgdGhlIEVDbGFzcyBvZiB0aGUgb2JqZWN0IHRvIHZhbGlkYXRlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogICAgICAgICAgICBub3QgYXBwbGljYWJsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcihFT2JqZWN0IHBhcmVudCwgRVJlZmVyZW5jZSByZWZlcmVuY2UsCi0JCQlFQ2xhc3MgZUNsYXNzLCBFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpOwotCQotCUlWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKEVPYmplY3QgcGFyZW50LCBFUmVmZXJlbmNlIHJlZmVyZW5jZSwKLQkJCUlGaWx0ZXIgY2hpbGRGaWx0ZXIsIEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSk7CQotCQotCUlWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKE9iamVjdCBwYXJlbnQsIEVDbGFzcyBlQ2xhc3MsIEVPYmplY3Qgb2JqZWN0LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL05hbWVDaGVja2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9OYW1lQ2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YzcxMjQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL05hbWVDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkZWZpbmVzIHZhcmlvdXMgc3RhdGljIG1ldGhvZHMgdG8gdmFsaWRhdGUgbmFtZSBvZiBzcGVjaWZpZWQKLSAqIG9iamVjdAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTmFtZUNoZWNrZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVEVYVCA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmVsZW1lbnRfdGV4dDsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElOYW1lUHJvdmlkZXIgcHJlc2VudGF0aW9uTmFtZVByb3ZpZGVyID0gbmV3IElOYW1lUHJvdmlkZXIoKSB7Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKE9iamVjdCBvYmplY3QpIHsKLQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0KTsKLQkJCX0KLQkJCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoRGVzY3JpYmFibGVFbGVtZW50KW9iamVjdCkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJT2JqZWN0IHBhcmVudCwgT2JqZWN0IGUsIGZpbmFsIENsYXNzIHR5cGUsCi0JCQlJTmFtZVByb3ZpZGVyIG5hbWVQcm92aWRlciwgU3RyaW5nIG5ld05hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNpb24sCi0JCQlib29sZWFuIGlnbm9yZVN1cHByZXNzZWQpIHsKLQkJSUZpbHRlciBjaGlsZEZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiB0eXBlLmlzSW5zdGFuY2Uob2JqKTsKLQkJCX0KLQotCQl9OwotCi0JCXJldHVybiBjaGVja05hbWUoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgZSwgY2hpbGRGaWx0ZXIsIG5hbWVQcm92aWRlciwKLQkJCQluZXdOYW1lLCBzdXBwcmVzaW9uLCBpZ25vcmVTdXBwcmVzc2VkKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJT2JqZWN0IHBhcmVudCwgT2JqZWN0IGUsIElGaWx0ZXIgY2hpbGRGaWx0ZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgbmFtZUZlYXR1cmUsIFN0cmluZyBuZXdOYW1lLAotCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIGJvb2xlYW4gaWdub3JlU3VwcHJlc3NlZCkgewotCQlyZXR1cm4gY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIGUsIGNoaWxkRmlsdGVyLAotCQkJCWNyZWF0ZU5hbWVQcm92aWRlcihuYW1lRmVhdHVyZSksIG5ld05hbWUsIHN1cHByZXNzaW9uLAotCQkJCWlnbm9yZVN1cHByZXNzZWQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjaGVja05hbWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlPYmplY3QgcGFyZW50LCBPYmplY3QgZSwgSUZpbHRlciBjaGlsZEZpbHRlciwKLQkJCUlOYW1lUHJvdmlkZXIgbmFtZVByb3ZpZGVyLCBTdHJpbmcgbmV3TmFtZSwKLQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBib29sZWFuIGlnbm9yZVN1cHByZXNzZWQpIAotCXsKLQkJaWYgKGlnbm9yZVN1cHByZXNzZWQpCi0JCQlpZiAoc3VwcHJlc3Npb24gIT0gbnVsbCAmJiBzdXBwcmVzc2lvbi5pc1N1cHByZXNzZWQoZSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbjsKLQotCQkvLyBnZXQgY2hpbGRyZW4gb2YgdGhlIHJvbGxlZC1kb3duIGRhcHRlcgotCQkvLwotCQlib29sZWFuIHdhc1JvbGxlZFVwID0gZmFsc2U7Ci0JCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSBudWxsOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCWJzSXRlbVByb3ZpZGVyID0gKChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKTsKLQkJCXdhc1JvbGxlZFVwID0gYnNJdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlpZiAod2FzUm9sbGVkVXApIHsKLQkJCQlic0l0ZW1Qcm92aWRlci5zZXRSb2xsZWRVcChmYWxzZSk7Ci0JCQl9Ci0JCQljaGlsZHJlbiA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IGV4OwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHdhc1JvbGxlZFVwKSB7Ci0JCQkJYnNJdGVtUHJvdmlkZXIuYmFzaWNTZXRSb2xsZWRVcCh3YXNSb2xsZWRVcCk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBpdGVtID0gaXRlci5uZXh0KCk7Ci0KLQkJCS8vIHNraXAgY2hlY2tpbmcgb24gc3VwcHJlc3NlZCBlbGVtZW50Ci0JCQkvLwotLyoxNzAwNTgJaWYgKHN1cHByZXNzaW9uICE9IG51bGwgJiYgc3VwcHJlc3Npb24uaXNTdXBwcmVzc2VkKGl0ZW0pKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ki8KLQotCQkJT2JqZWN0IGNoaWxkID0gVG5nVXRpbC51bndyYXAoaXRlbSk7Ci0JCQlpZiAoY2hpbGQgIT0gZSAmJiBjaGlsZEZpbHRlci5hY2NlcHQoY2hpbGQpKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBuYW1lUHJvdmlkZXIuZ2V0TmFtZShjaGlsZCk7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShuZXdOYW1lKSkgewotCQkJCQkvLyByZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLAotCQkJCQkJCW5hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJTmFtZVByb3ZpZGVyIGNyZWF0ZU5hbWVQcm92aWRlcigKLQkJCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBuYW1lRmVhdHVyZSkgewotCQlpZihuYW1lRmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJcmV0dXJuIHByZXNlbnRhdGlvbk5hbWVQcm92aWRlcjsgCi0JCX0KLQkJCi0JCXJldHVybiBuZXcgSU5hbWVQcm92aWRlcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBnZXROYW1lKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQlyZXR1cm4gKFN0cmluZykgKChFT2JqZWN0KSBvYmplY3QpLmVHZXQobmFtZUZlYXR1cmUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCWZpbmFsIEJyZWFrZG93bkVsZW1lbnQgZSwgQ2xhc3MgdHlwZSwgRVN0cnVjdHVyYWxGZWF0dXJlIG5hbWVGZWF0dXJlLAotCQkJU3RyaW5nIG5ld05hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSAKLQl7Ci0JCXJldHVybiBjaGVja05hbWUoYWRhcHRlckZhY3RvcnksIG51bGwsIGUsIHR5cGUsIG5hbWVGZWF0dXJlLCBuZXdOYW1lLAotCQkJCXN1cHByZXNzaW9uLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgT2JqZWN0IHBhcmVudCwKLQkJCWZpbmFsIEJyZWFrZG93bkVsZW1lbnQgZSwgQ2xhc3MgdHlwZSwgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIG5hbWVGZWF0dXJlLAotCQkJU3RyaW5nIG5ld05hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBib29sZWFuIGlnbm9yZVN1cHByZXNzZWQpIAotCXsKLQkJU3RyaW5nIG1zZyA9IGNoZWNrRW1wdHkoZSwgbmV3TmFtZSk7Ci0JCWlmKG1zZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbXNnOwotCQl9Ci0KLQkJaWYodHlwZSA9PSBudWxsKSB7Ci0JCQl0eXBlID0gY2hvb3NlVHlwZShlKTsKLQkJfQotCQkKLQkJaWYocGFyZW50ID09IG51bGwpIHsKLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQoZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQoZSk7Ci0JCQlpZihwYXJlbnQgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJLy8gYmFzaWMgY2hlY2sKLQkJLy8KLQkJbXNnID0gY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIGUsIHR5cGUsCi0JCQkJY3JlYXRlTmFtZVByb3ZpZGVyKG5hbWVGZWF0dXJlKSwgbmV3TmFtZSwgc3VwcHJlc3Npb24sCi0JCQkJaWdub3JlU3VwcHJlc3NlZCk7Ci0KLQkJaWYgKG1zZyAhPSBudWxsKQotCQkJcmV0dXJuIG1zZzsKLQkJSUZpbHRlciBjaGlsZEZpbHRlciA9IG51bGw7Ci0JCWlmIChlIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCS8vIGRvbid0IGFsbG93IHRlYW0gd2l0aCB0aGUgc2FtZSBuYW1lIHdpdGhpbiB0aGUgc2FtZSBzY29wZQotCQkJLy8KLQkJCWNoaWxkRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkJcmV0dXJuIGUgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLy8gUExFQVNFIERPTidUIENMRUFOIFVQLgotCQkvLyBDb21tZW50ZWQgb3V0IGZvciBub3csIHNpbmNlIHdlIGNoYW5nZSBzY29wZSBvZiBEZWxpdmVyYWJsZS4KLQkJLy8gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCQkvLyAmJiAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZSkuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mCi0JCS8vIERlbGl2ZXJhYmxlKSB7Ci0JCS8vIGNoaWxkRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCS8vCQotCQkvLyBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyByZXR1cm4gZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCQkvLyAmJiAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZSkuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mCi0JCS8vIERlbGl2ZXJhYmxlOwotCQkvLyB9Ci0JCS8vIH07Ci0JCS8vIH0KLQotCQlpZiAoY2hpbGRGaWx0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNoZWNrTmFtZUluU2NvcGUoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgZSwgbmFtZUZlYXR1cmUsIG5ld05hbWUsCi0JCQkJCWNoaWxkRmlsdGVyLCBzdXBwcmVzc2lvbiwgaWdub3JlU3VwcHJlc3NlZCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoZWNrRW1wdHkoT2JqZWN0IGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBlbGVtZW50VHlwZTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBOYW1lZEVsZW1lbnQpIHsKLQkJCWVsZW1lbnRUeXBlID0gVG5nVXRpbC5nZXRUeXBlVGV4dCgoTmFtZWRFbGVtZW50KSBlKTsKLQkJfSBlbHNlIHsKLQkJCWVsZW1lbnRUeXBlID0gRUxFTUVOVF9URVhUOwotCQl9Ci0JCWlmIChuZXdOYW1lID09IG51bGwgfHwgbmV3TmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewkJCQotCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2csCi0JCQkJCVN0clV0aWwudG9Mb3dlcihlbGVtZW50VHlwZSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFVzZWQgYnkKLQkgKiB7QGxpbmsgI2NoZWNrTmFtZShBZGFwdGVyRmFjdG9yeSwgQnJlYWtkb3duRWxlbWVudCwgRVN0cnVjdHVyYWxGZWF0dXJlLCBTdHJpbmcsIFN1cHByZXNzaW9uLCBib29sZWFuKSBjaGVja05hbWUoKX0KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBDbGFzcyBjaG9vc2VUeXBlKEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlyZXR1cm4gQWN0aXZpdHkuY2xhc3M7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gVGFza0Rlc2NyaXB0b3IuY2xhc3M7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gUm9sZURlc2NyaXB0b3IuY2xhc3M7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJcmV0dXJuIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzczsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBlLmdldENsYXNzKCk7Ci0JCX0KLQkJLy8gcmV0dXJuIEJyZWFrZG93bkVsZW1lbnQuY2xhc3M7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZUluU2NvcGUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlPYmplY3QgY3VycmVudFBhcmVudCwgQnJlYWtkb3duRWxlbWVudCBlLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFN0cmluZyBuYW1lLCBJRmlsdGVyIGNoaWxkRmlsdGVyLAotCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIGJvb2xlYW4gaWdub3JlU3VwcHJlc3NlZCkgewotCQkvLyBjaGVjayB1cAotCQlmb3IgKE9iamVjdCBwYXJlbnQgPSBjdXJyZW50UGFyZW50OyBwYXJlbnQgIT0gbnVsbDspIHsKLQkJCVN0cmluZyBtc2cgPSBjaGVja05hbWUoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgZSwgY2hpbGRGaWx0ZXIsCi0JCQkJCWZlYXR1cmUsIG5hbWUsIHN1cHByZXNzaW9uLCBpZ25vcmVTdXBwcmVzc2VkKTsKLQkJCWlmIChtc2cgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbXNnOwotCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlwYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCX0KLQotCQkvLyBjaGVjayBkb3duCi0JCWlmIChjdXJyZW50UGFyZW50ICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoYWRhcHRlckZhY3RvcnksCi0JCQkJCWN1cnJlbnRQYXJlbnQsIGZhbHNlKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBjaGlsZCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCQlpZiAoY2hpbGQgIT0gZSAmJiBjaGlsZEZpbHRlci5hY2NlcHQoY2hpbGQpKSB7Ci0JCQkJCVN0cmluZyBjaGlsZE5hbWUgPSAoU3RyaW5nKSAoKEVPYmplY3QpIGNoaWxkKS5lR2V0KGZlYXR1cmUpOwotCQkJCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKGNoaWxkTmFtZSkpIHsKLQkJCQkJCS8vIHJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksCi0JCQkJCQkvLyBkYXRhKTsKLQkJCQkJCXJldHVybiBOTFMKLQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csCi0JCQkJCQkJCQkJbmFtZSk7Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCWZpbmFsIEJyZWFrZG93bkVsZW1lbnQgZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFN0cmluZyBuYW1lLAotCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJcmV0dXJuIGNoZWNrTmFtZShhZGFwdGVyRmFjdG9yeSwgZSwgZmVhdHVyZSwgbmFtZSwgc3VwcHJlc3Npb24sIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgdGhlIG5hbWUgb3IgcHJlc2VudGF0aW9uIG5hbWUgb2YgYSBicmVha2Rvd24gZWxlbWVudCB0aGF0IGlzCi0JICogYWxyZWFkeSBwYXJ0IG9mIGEgcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gc3VwcHJlc3Npb24KLQkgKiBAcGFyYW0gaWdub3JlU3VwcHJlc3NlZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja05hbWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlmaW5hbCBCcmVha2Rvd25FbGVtZW50IGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmcgbmFtZSwKLQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBib29sZWFuIGlnbm9yZVN1cHByZXNzZWQpIAotCXsKLQkJcmV0dXJuIGNoZWNrTmFtZShhZGFwdGVyRmFjdG9yeSwgKE9iamVjdCludWxsLCBlLCAoQ2xhc3MpbnVsbCwgZmVhdHVyZSwgbmFtZSwgc3VwcHJlc3Npb24sIGlnbm9yZVN1cHByZXNzZWQpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuSGF2ZUVtcHR5UHJlc2VudGF0aW9uTmFtZShEZXNjcmliYWJsZUVsZW1lbnQgZSkgewotCQlpZihlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgdlR5cGUgPSAoKFZhcmlhYmlsaXR5RWxlbWVudCllKS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCXJldHVybiB2VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMCi0JCQkJfHwgdlR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwKLQkJCQl8fCB2VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OX0xJVEVSQUw7CQkJCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9QbHVnaW5EZXBJbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9QbHVnaW5EZXBJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3NzliNDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vUGx1Z2luRGVwSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhhbmRsZXMgcGx1Z2luIGRlcGVuZGVuY3kgaW5mbyBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeSBjaGVjawotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkRlcEluZm8gewotCi0JcHJpdmF0ZSBQbHVnaW5EZXBlbmRlbmN5SW5mb01nciBtZ3I7Ci0JcHJpdmF0ZSBNZXRob2RQbHVnaW4gcGx1Z2luOwotCXByaXZhdGUgSGFzaE1hcCBwYXJlbnRNYXA7Ci0JcHJpdmF0ZSBib29sZWFuIGNvbXBsZXRlID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIFBsdWdpbkRlcEluZm8oUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IgbWdyLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCXRoaXMubWdyID0gbWdyOwotCQl0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGNvbXBsZXRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBidWlsZChib29sZWFuIGNoZWNrQ2lyY3VsYXIpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBidWlsZDogIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCX0KLQkJYnVpbGRJbm5lcihjaGVja0NpcmN1bGFyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkSW5uZXIoYm9vbGVhbiBjaGVja0NpcmN1bGFyKSB7Ci0JCU9iamVjdCBpbmZvID0gbWdyLmdldFByb2Nlc3NlZEluZm8oZ2V0UGx1Z2luKCkpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoaW5mbyA9PSB0aGlzICYmIGNvbXBsZXRlKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIGVycm9yIGluIGJ1aWxkSW5uZXI6ICIgKyBpbmZvKTsJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQltZ3IuYWRkVG9Qcm9jZXNzZWQodGhpcyk7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gYnVpbGRJbm5lcjogIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJYnVpbGRJbm5lcl8oY2hlY2tDaXJjdWxhcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZElubmVyXyhib29sZWFuIGNoZWNrQ2lyY3VsYXIpIHsKLQkJTGlzdCBwYXJlbnRzID0gZ2V0UGx1Z2luKCkuZ2V0QmFzZXMoKTsKLQkJaW50IHN6ID0gcGFyZW50cyA9PSBudWxsID8gMCA6IHBhcmVudHMuc2l6ZSgpOwotCQlpZiAoc3ogPT0gMCkgewotCQkJY29tcGxldGUgPSB0cnVlOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlwYXJlbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlMaXN0IHByb2Nlc3NlZFBhcmVudHMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaTwgc3o7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBhcmVudEVsZW0gPSAoTWV0aG9kUGx1Z2luKSBwYXJlbnRzLmdldChpKTsKLQkJCVBsdWdpbkRlcEluZm8gcGluZm8gPSAoUGx1Z2luRGVwSW5mbykgbWdyLmdldFByb2Nlc3NlZEluZm8ocGFyZW50RWxlbSk7Ci0JCQlpZiAocGluZm8gPT0gbnVsbCl7Ci0JCQkJcGluZm8gPSBuZXcgUGx1Z2luRGVwSW5mbyhtZ3IsIHBhcmVudEVsZW0pOwotCQkJCXBhcmVudE1hcC5wdXQocGFyZW50RWxlbS5nZXRHdWlkKCksIHBpbmZvKTsKLQkJCQlwaW5mby5idWlsZElubmVyKGNoZWNrQ2lyY3VsYXIpOwotCQkJfSBlbHNlIHsKLQkJCQlwYXJlbnRNYXAucHV0KHBhcmVudEVsZW0uZ2V0R3VpZCgpLCBwaW5mbyk7Ci0JCQkJaWYgKGNoZWNrQ2lyY3VsYXIpIHsKLQkJCQkJaWYgKHByb2Nlc3NlZFBhcmVudHMgPT0gbnVsbCkgewotCQkJCQkJcHJvY2Vzc2VkUGFyZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJfQotCQkJCQlwcm9jZXNzZWRQYXJlbnRzLmFkZChwaW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNvbXBsZXRlID0gdHJ1ZTsKLQkJCQotCQlpZiAoY2hlY2tDaXJjdWxhciAmJiBwcm9jZXNzZWRQYXJlbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9MDsgaTxwcm9jZXNzZWRQYXJlbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVhY2hhYmxlQnkoKFBsdWdpbkRlcEluZm8pIHByb2Nlc3NlZFBhcmVudHMuZ2V0KGkpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiByZWFjaGFibGVCeShQbHVnaW5EZXBJbmZvIGluZm8pICB7Ci0JCWlmICghIChpbmZvIGluc3RhbmNlb2YgUGx1Z2luRGVwSW5mbykpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gRW50cnkgcmVhY2hhYmxlQnk6IHRoaXMgLT4gIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBFbnRyeSByZWFjaGFibGVCeTogaW5mbyAtPiAiICsgaW5mbyk7CS8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7CQkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlYWNoYWJsZUJ5KChQbHVnaW5EZXBJbmZvKSBpbmZvLCBuZXcgU3RhY2soKSwgbmV3IEhhc2hNYXAoKSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiByZWFjaGFibGVCeShQbHVnaW5EZXBJbmZvIGluZm8sIFN0YWNrIHN0YWNrLCBNYXAgc2VlbikgIHsKLQkJc3RhY2sucHVzaChpbmZvKTsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiByZWFjaGFibGVCeTogdGhpcyAtPiAiICsgdGhpcyk7CQkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiByZWFjaGFibGVCeTogaW5mbyAtPiAiICsgaW5mbyk7CQkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiByZXQgPSAgcmVhY2hhYmxlQnlfKGluZm8sIHN0YWNrLCBzZWVuKTsKLQkJc3RhY2sucG9wKCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiByZWFjaGFibGVCeV8oUGx1Z2luRGVwSW5mbyBpbmZvLCBTdGFjayBzdGFjaywgTWFwIHNlZW4pICB7Ci0JCU1hcCB0ZXN0TWFwID0gaW5mby5wYXJlbnRNYXA7CQkKLQkJaWYgKHRlc3RNYXAgPT0gbnVsbCB8fCB0ZXN0TWFwLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAodGVzdE1hcC5jb250YWluc0tleShnZXRQbHVnaW4oKS5nZXRHdWlkKCkpKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBDb250YWluZWQgaW4gcGFyZW50TWFwIG9mOiAiICsgaW5mbyk7CQkvLyROT04tTkxTLTEkCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJc3RhY2sucHVzaCh0aGlzKTsKLQkJCW1nci5sb2dDaXJjdWxhckRlcGVuZGVuY3koKFN0YWNrKSBzdGFjay5jbG9uZSgpKTsKLQkJCXN0YWNrLnBvcCgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmIChzZWVuLmNvbnRhaW5zS2V5KGluZm8uZ2V0UGx1Z2luKCkuZ2V0R3VpZCgpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQkKLQkJc2Vlbi5wdXQoaW5mby5nZXRQbHVnaW4oKS5nZXRHdWlkKCksIGluZm8pOwotCQkKLQkJZm9yIChJdGVyYXRvciBpdCA9IHRlc3RNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJUGx1Z2luRGVwSW5mbyBwYXJlbnRJbmZvID0gKFBsdWdpbkRlcEluZm8pIGl0Lm5leHQoKTsKLQkJCWlmIChwYXJlbnRJbmZvLmNvbnRhaW5lZEluKHN0YWNrKSkgewotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBjb250YWluZWRJbiBzdGFjazogIiArIGluZm8pOwkJLy8kTk9OLU5MUy0xJAkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJc3RhY2sucHVzaChwYXJlbnRJbmZvKTsKLQkJCQltZ3IubG9nQ2lyY3VsYXJEZXBlbmRlbmN5KChTdGFjaykgc3RhY2suY2xvbmUoKSk7Ci0JCQkJc3RhY2sucG9wKCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAgKHJlYWNoYWJsZUJ5KHBhcmVudEluZm8sIHN0YWNrLCBzZWVuKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9CQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgTWV0aG9kUGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0JCQkJCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChwbHVnaW4pOwotCX0KLQkKLQkvL1RoaXMgd291bGQgc2NhbGUgdXAgZm9yIHBlcmZvcm1hbmNlIHdoZW4gaW5mb0xpc3QgZ2V0cyBsYXJnZQotCXByaXZhdGUgYm9vbGVhbiBjb250YWluZWRJbihMaXN0IGluZm9MaXN0KSB7Ci0JCWludCBzeiA9IGluZm9MaXN0ID09IG51bGwgPyAwIDogaW5mb0xpc3Quc2l6ZSgpOwotCQlpZiAoc3ogPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBndWlkID0gZ2V0UGx1Z2luKCkuZ2V0R3VpZCgpOwotCQlpZiAoc3ogPT0gMSkgewotCQkJcmV0dXJuIGd1aWQuZXF1YWxzKCgoUGx1Z2luRGVwSW5mbykgaW5mb0xpc3QuZ2V0KDApKS5nZXRQbHVnaW4oKS5nZXRHdWlkKCkpOwotCQl9Ci0JCU1hcCBsaXN0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCVBsdWdpbkRlcEluZm8gaW5mbyA9IChQbHVnaW5EZXBJbmZvKSBpbmZvTGlzdC5nZXQoaSk7Ci0JCQlsaXN0TWFwLnB1dChpbmZvLmdldFBsdWdpbigpLmdldEd1aWQoKSwgaW5mbyk7Ci0JCX0KLQkJCi0JCXJldHVybiBsaXN0TWFwLmNvbnRhaW5zS2V5KGd1aWQpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1BsdWdpbkRlcGVuZGVuY3lJbmZvTWdyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9QbHVnaW5EZXBlbmRlbmN5SW5mb01nci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NDBmODJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1BsdWdpbkRlcGVuZGVuY3lJbmZvTWdyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuUHJvZmlsaW5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIG1hbmFnZXMgY2lyY3VsYXIgZGVwZW5kZW5jeSBpbmZvIGZvciBwbHVnaW5zLgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkRlcGVuZGVuY3lJbmZvTWdyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHByb2ZpbGluZyA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgbGliOwotCXByaXZhdGUgTWFwIHByb2Nlc3NlZDsKLQlwcml2YXRlIExpc3QgY2lyY3VsYXJMaXN0OwotCQotCXB1YmxpYyBQbHVnaW5EZXBlbmRlbmN5SW5mb01ncihNZXRob2RMaWJyYXJ5IGxpYikgewotCQl0aGlzLmxpYiA9IGxpYjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9nQ2lyY3VsYXJEZXBlbmRlbmN5KFN0YWNrIHRyYWNlKSB7Ci0JCWlmIChjaXJjdWxhckxpc3QgPT0gbnVsbCkgewotCQkJY2lyY3VsYXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWNpcmN1bGFyTGlzdC5hZGRBbGwodHJhY2UpOwotCX0KLQkKLQlwcml2YXRlIExpc3QgZ2V0QW5kQ2xlYXJDaXJjdWxhckxpc3QoKSB7Ci0JCUxpc3QgcmV0ID0gY2lyY3VsYXJMaXN0OwotCQljaXJjdWxhckxpc3QgPSBudWxsOwotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKG1zZyk7Ci0JfQotCQotCXByaXZhdGUgUGx1Z2luRGVwSW5mbyByZWdpc3RlclBsdWdpbihNZXRob2RQbHVnaW4gcGx1Z2luLCBib29sZWFuIGNoZWNrQ2lyY3VsYXIpIHsJCQotCQlQbHVnaW5EZXBJbmZvIGluZm8gPSAgZ2V0UHJvY2Vzc2VkSW5mbyhwbHVnaW4pOwotCQlpZiAoaW5mbyA9PSBudWxsKSB7CQkKLQkJCWluZm8gPSBuZXcgUGx1Z2luRGVwSW5mbyh0aGlzLCBwbHVnaW4pOwotCQl9Ci0JCWlmICghIGluZm8uaXNDb21wbGV0ZSgpKSB7Ci0JCQlpbmZvLmJ1aWxkKGNoZWNrQ2lyY3VsYXIpOwotCQl9Ci0JCXJldHVybiBpbmZvOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyBjaGVja0NpcmN1bGFyRGVwZW5kbmVjeShNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gcGx1Z2luOiAiICsgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKHBsdWdpbikpOwkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVBsdWdpbkRlcEluZm8gaW5mbyA9IHJlZ2lzdGVyUGx1Z2luKHBsdWdpbiwgdHJ1ZSk7Ci0JCUxpc3QgY2lyTGlzdCA9IGdldEFuZENsZWFyQ2lyY3VsYXJMaXN0KCk7Ci0JCWJvb2xlYW4gbG9vcCA9IGNpckxpc3QgIT0gbnVsbCAmJiAhY2lyTGlzdC5pc0VtcHR5KCk7Ci0JCWlmIChsb29wKSB7Ci0JCQlsb2coIkVycm9yPiBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkOiAiKTsJCS8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGk9MDsgaTxjaXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJUGx1Z2luRGVwSW5mbyBsb29wSW5mbyA9IChQbHVnaW5EZXBJbmZvKSBjaXJMaXN0LmdldChpKTsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW0gPSBsb29wSW5mby5nZXRQbHVnaW4oKTsJCQkJCQkJCi0JCQkJbG9nKCJFcnJvcj4gIiArIGkgKyAiOiAiICsgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVsZW0pKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCQlsb2coIiIpOwkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBWYWxpZGF0aW9uU3RhdHVzKElTdGF0dXMuRVJST1IsIDAsIGdlbkVycm9yTXNnKGNpckxpc3QpLCBwbHVnaW4sIG51bGwpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZW5FcnJvck1zZyhMaXN0IGNpckxpc3QpIHsKLQkJU3RyaW5nIG1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnZhcmlhYmlsaXR5X2VsZW1lbnRfY2lyY3VsYXJfbG9vcF9lcnJvcl9tc2c7Ci0JCWZvciAoaW50IGk9MDsgaTxjaXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlQbHVnaW5EZXBJbmZvIGxvb3BJbmZvID0gKFBsdWdpbkRlcEluZm8pIGNpckxpc3QuZ2V0KGkpOwotCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gbG9vcEluZm8uZ2V0UGx1Z2luKCk7CQotCQkJaWYgKGkgPiAwKSB7Ci0JCQkJbXNnICs9ICI6ICI7IC8vJE5PTi1OTFMtMSQgCi0JCQl9Ci0JCQltc2cgKz0gVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVsZW0pOwkKLQkJfQotCQlyZXR1cm4gbXNnOwotCX0KLQkJCQotCXByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NlZChNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCXJldHVybiBwcm9jZXNzZWQgIT0gbnVsbCAmJiBwcm9jZXNzZWQuY29udGFpbnNLZXkocGx1Z2luLmdldEd1aWQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBQbHVnaW5EZXBJbmZvIGdldFByb2Nlc3NlZEluZm8oTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlyZXR1cm4gcHJvY2Vzc2VkID09IG51bGwgPyBudWxsIDogKFBsdWdpbkRlcEluZm8pIHByb2Nlc3NlZC5nZXQocGx1Z2luLmdldEd1aWQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFRvUHJvY2Vzc2VkKFBsdWdpbkRlcEluZm8gaW5mbykgewotCQlpZiAocHJvY2Vzc2VkID09IG51bGwpIHsKLQkJCXByb2Nlc3NlZCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJcHJvY2Vzc2VkLnB1dChpbmZvLmdldFBsdWdpbigpLmdldEd1aWQoKSwgaW5mbyk7Ci0JfQotCQotCS8qCi0JICogQ2hlY2sgY2lyY3VsYXIgZGVwZW5kZW5jeSBhbW9uZyB0aGUgcGx1Z2lucyBvZiB0aGUgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgQ2hlY2tSZXN1bHQgY2hlY2tDaXJjdWxhckRlcGVuZG5lY3koVHJhY2VyIHRyYWNlciwgYm9vbGVhbiBhY2N1bUVycm9ycykgewotCQlpZiAodHJhY2VyID09IG51bGwpIHsKLQkJCXRyYWNlciA9IG5ldyBUcmFjZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgdHJhY2UoU3RyaW5nIGxpbmUpIHt9Ci0JCQl9OwotCQl9Ci0JCWxvbmcgdXNlZE1lbTAgPSAwOwotCQlSdW50aW1lIHJ0ID0gUnVudGltZS5nZXRSdW50aW1lKCk7IAotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGliLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJaXQubmV4dCgpOwotCQkJfQotCQkJUHJvZmlsaW5nVXRpbC5mdWxsR0MoKTsKLQkJCXVzZWRNZW0wID0gcnQudG90YWxNZW1vcnkoKSAtIHJ0LmZyZWVNZW1vcnkoKTsKLQkJfQotCi0JCUNoZWNrUmVzdWx0IHJlc3VsdCA9IGNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5Xyh0cmFjZXIsIGFjY3VtRXJyb3JzKTsKLQkJCi0JCWlmIChwcm9maWxpbmcpIHsKLQkJCVByb2ZpbGluZ1V0aWwuZnVsbEdDKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB1c2VkTWVtMDogIiArIHVzZWRNZW0wLzEwMDAgKyAiIGsgYnl0ZXMiKTsKLQkJCWxvbmcgdXNlZE1lbTEgPSBydC50b3RhbE1lbW9yeSgpIC0gcnQuZnJlZU1lbW9yeSgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdXNlZE1lbTE6ICIgKyB1c2VkTWVtMS8xMDAwICsgIiBrIGJ5dGVzIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBkaWZmTWVtOiAiICsgKHVzZWRNZW0xIC0gdXNlZE1lbTApLzEwMDAgKyAiIGsgYnl0ZXMiKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIENoZWNrUmVzdWx0IGNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5XyhUcmFjZXIgdHJhY2VyLCBib29sZWFuIGFjY3VtRXJyb3JzKSB7Ci0JCUNoZWNrUmVzdWx0IHJlc3VsdCA9IG5ldyBDaGVja1Jlc3VsdCgpOwotCQkKLQkJTGlzdCBwbHVnaW5zID0gbGliLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCQotCQkJUGx1Z2luRGVwSW5mbyBpbmZvID0gcmVnaXN0ZXJQbHVnaW4ocGx1Z2luLCB0cnVlKTsKLQkJCUxpc3QgY2lyTGlzdCA9IGdldEFuZENsZWFyQ2lyY3VsYXJMaXN0KCk7CQkJCi0JCQlib29sZWFuIGxvb3AgPSBjaXJMaXN0ICE9IG51bGwgJiYgIWNpckxpc3QuaXNFbXB0eSgpOwotCQkJaWYgKGxvb3ApIHsKLQkJCQl0cmFjZXIudHJhY2UoIkVycm9yPiBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkOiAiKTsJCS8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKGludCBpPTA7IGk8Y2lyTGlzdC5zaXplKCk7IGkrKykgewotCQkJCQlQbHVnaW5EZXBJbmZvIGxvb3BJbmZvID0gKFBsdWdpbkRlcEluZm8pIGNpckxpc3QuZ2V0KGkpOwotCQkJCQlNZXRob2RFbGVtZW50IGVsZW0gPSBsb29wSW5mby5nZXRQbHVnaW4oKTsJCQkJCQkJCi0JCQkJCXRyYWNlci50cmFjZSgiRXJyb3I+ICIgKyBpICsgIjogIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtKSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCXJlc3VsdC5jaXJjdWxhckxpc3QuYWRkKGNpckxpc3QpOwotCQkJCWlmICghIGFjY3VtRXJyb3JzKSB7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJfQotCQl9CQkJCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIENoZWNrUmVzdWx0IHsKLQkJcHVibGljIExpc3QgY2lyY3VsYXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJcHVibGljIGludCBnZXRFcnJvckNvdW50KCkgewotCQkJcmV0dXJuIGNpcmN1bGFyTGlzdC5zaXplKCk7Ci0JCX0JCQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1RyYWNlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVHJhY2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE4YTQxM2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVHJhY2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIFRyYWNlciB7Ci0Jdm9pZCB0cmFjZShTdHJpbmcgbGluZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9VbmlxdWVOYW1lSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVW5pcXVlTmFtZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODJhNTczYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9VbmlxdWVOYW1lSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBoZWxwZXIgY2xhc3MgZm9yIG1ldGhvZCBlbGVtZW50IHVuaXF1ZSBuYW1lIGhhbmRsaW5nCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgVW5pcXVlTmFtZUhhbmRsZXIgewotCXByaXZhdGUgU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCi0JLyoqCi0JICogRW1wdHkgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgVW5pcXVlTmFtZUhhbmRsZXIoKSB7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyTmFtZXMoQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiBlbGVtZW50cykgewotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8TWV0aG9kRWxlbWVudD4gaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQlyZWdpc3RlcihlbGVtZW50LmdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJQcmVzZW50YXRpb25OYW1lcyhDb2xsZWN0aW9uPERlc2NyaWJhYmxlRWxlbWVudD4gZWxlbWVudHMpIHsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPERlc2NyaWJhYmxlRWxlbWVudD4gaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZWxlbWVudCA9IGl0Lm5leHQoKTsKLQkJCXJlZ2lzdGVyKGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyKFN0cmluZyBuYW1lKSB7Ci0JCW5hbWVzLmFkZChuYW1lKTsJCQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlTmFtZShTdHJpbmcgb2xkTmFtZSkgewkJCi0JCVN0cmluZyBuYW1lID0gb2xkTmFtZTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZShuYW1lcy5jb250YWlucyhuYW1lKSkgewotCQkJaSsrOwotCQkJbmFtZSA9IG9sZE5hbWUgKyAiXyIgKyBpOwkJLy8kTk9OLU5MUy0xJCAKLQkJfQkJCQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JCi0JCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9VbmlxdWVOYW1lUE5hbWVIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9VbmlxdWVOYW1lUE5hbWVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMGIyM2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVW5pcXVlTmFtZVBOYW1lSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgaGVscGVyIGNsYXNzIGZvciB1bmlxdWUgbmFtZSBhbmQgcHJlc2VudGF0aW9uIG5hbWUgaGFuZGxpbmcKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmlxdWVOYW1lUE5hbWVIYW5kbGVyIHsKLQlwcml2YXRlIFVuaXF1ZU5hbWVIYW5kbGVyIG5hbWVIYW5kbGVyID0gbmV3IFVuaXF1ZU5hbWVIYW5kbGVyKCk7Ci0JcHJpdmF0ZSBVbmlxdWVOYW1lSGFuZGxlciBwbmFtZUhhbmRsZXIgPSBuZXcgVW5pcXVlTmFtZUhhbmRsZXIoKTsKLQkKLQkvKioKLQkgKiBFbXB0eSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBVbmlxdWVOYW1lUE5hbWVIYW5kbGVyKENvbGxlY3Rpb248TWV0aG9kRWxlbWVudD4gbmFtZUVsZW1lbnRzLCBDb2xsZWN0aW9uPERlc2NyaWJhYmxlRWxlbWVudD4gcG5hbWVFbGVtZW50cykgewotCQluYW1lSGFuZGxlci5yZWdpc3Rlck5hbWVzKG5hbWVFbGVtZW50cyk7Ci0JCXBuYW1lSGFuZGxlci5yZWdpc3RlclByZXNlbnRhdGlvbk5hbWVzKHBuYW1lRWxlbWVudHMpOwkJCi0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgZW5zdXJlVW5pcXVlKERlc2NyaWJhYmxlRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBuYW1lID0gbmFtZUhhbmRsZXIuZ2V0VW5pcXVlTmFtZShlbGVtZW50LmdldE5hbWUoKSk7Ci0JCWlmICghIG5hbWUuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCQkJbmFtZUhhbmRsZXIucmVnaXN0ZXIobmFtZSk7Ci0JCX0KLQkJCi0JCVN0cmluZyBwbmFtZSA9IHBuYW1lSGFuZGxlci5nZXRVbmlxdWVOYW1lKGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJaWYgKCEgcG5hbWUuZXF1YWxzKGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKSkgewotCQkJZWxlbWVudC5zZXRQcmVzZW50YXRpb25OYW1lKHBuYW1lKTsKLQkJCXBuYW1lSGFuZGxlci5yZWdpc3RlcihuYW1lKTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1Vwd2FyZFJlYWNoYWJsZUluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1Vwd2FyZFJlYWNoYWJsZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDIzOWNkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9VcHdhcmRSZWFjaGFibGVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaGFuZGxlcyB1cHdhcmQgcmVhY2hhYmxlIGluZm8gZm9yIGNpcmN1bGFyIGRlcGVuZGVuY3kgY2hlY2tpbmcKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBVcHdhcmRSZWFjaGFibGVJbmZvIGltcGxlbWVudHMgSURlcGVuZGVuY3lJbmZvIHsKLQotCXByaXZhdGUgRGVwZW5kZW5jeUluZm9NZ3IgbWdyOwotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgSGFzaE1hcCBwYXJlbnRNYXA7Ci0JcHJpdmF0ZSBib29sZWFuIGNvbXBsZXRlID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIFVwd2FyZFJlYWNoYWJsZUluZm8oRGVwZW5kZW5jeUluZm9NZ3IgbWdyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5tZ3IgPSBtZ3I7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCXJldHVybiBjb21wbGV0ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYnVpbGQoYm9vbGVhbiBjaGVja0NpcmN1bGFyKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gYnVpbGQ6ICIgKyB0aGlzKTsJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJ1aWxkSW5uZXIoY2hlY2tDaXJjdWxhcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZElubmVyKGJvb2xlYW4gY2hlY2tDaXJjdWxhcikgewotCQlPYmplY3QgaW5mbyA9IG1nci5nZXRQcm9jZXNzZWRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoaW5mbyA9PSB0aGlzICYmIGNvbXBsZXRlKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIGVycm9yIGluIGJ1aWxkSW5uZXI6ICIgKyBpbmZvKTsJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQltZ3IuYWRkVG9Qcm9jZXNzZWQodGhpcyk7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gYnVpbGRJbm5lcjogIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJYnVpbGRJbm5lcl8oY2hlY2tDaXJjdWxhcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZElubmVyXyhib29sZWFuIGNoZWNrQ2lyY3VsYXIpIHsKLQkJTGlzdCBwYXJlbnRzID0gZ2V0TWl4ZWRQYXJlbnRMaXN0KCk7Ci0JCWludCBzeiA9IHBhcmVudHMgPT0gbnVsbCA/IDAgOiBwYXJlbnRzLnNpemUoKTsKLQkJaWYgKHN6ID09IDApIHsKLQkJCWNvbXBsZXRlID0gdHJ1ZTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJcGFyZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJTGlzdCBwcm9jZXNzZWRQYXJlbnRzID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGk8IHN6OyBpKyspIHsKLQkJCU1ldGhvZEVsZW1lbnQgcGFyZW50RWxlbSA9IChNZXRob2RFbGVtZW50KSBwYXJlbnRzLmdldChpKTsKLQkJCVVwd2FyZFJlYWNoYWJsZUluZm8gcGluZm8gPSAoVXB3YXJkUmVhY2hhYmxlSW5mbykgbWdyLmdldFByb2Nlc3NlZEluZm8ocGFyZW50RWxlbSk7Ci0JCQlpZiAocGluZm8gPT0gbnVsbCl7Ci0JCQkJcGluZm8gPSBuZXcgVXB3YXJkUmVhY2hhYmxlSW5mbyhtZ3IsIHBhcmVudEVsZW0pOwotCQkJCXBhcmVudE1hcC5wdXQocGFyZW50RWxlbS5nZXRHdWlkKCksIHBpbmZvKTsKLQkJCQlwaW5mby5idWlsZElubmVyKGNoZWNrQ2lyY3VsYXIpOwotCQkJfSBlbHNlIHsKLQkJCQlwYXJlbnRNYXAucHV0KHBhcmVudEVsZW0uZ2V0R3VpZCgpLCBwaW5mbyk7Ci0JCQkJaWYgKGNoZWNrQ2lyY3VsYXIpIHsKLQkJCQkJaWYgKHByb2Nlc3NlZFBhcmVudHMgPT0gbnVsbCkgewotCQkJCQkJcHJvY2Vzc2VkUGFyZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJfQotCQkJCQlwcm9jZXNzZWRQYXJlbnRzLmFkZChwaW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNvbXBsZXRlID0gdHJ1ZTsKLQkJCQotCQlpZiAoY2hlY2tDaXJjdWxhciAmJiBwcm9jZXNzZWRQYXJlbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9MDsgaTxwcm9jZXNzZWRQYXJlbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVhY2hhYmxlQnkoKElEZXBlbmRlbmN5SW5mbykgcHJvY2Vzc2VkUGFyZW50cy5nZXQoaSkpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHJlYWNoYWJsZUJ5KElEZXBlbmRlbmN5SW5mbyBpbmZvKSAgewotCQlpZiAoISAoaW5mbyBpbnN0YW5jZW9mIFVwd2FyZFJlYWNoYWJsZUluZm8pKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IEVudHJ5IHJlYWNoYWJsZUJ5OiB0aGlzIC0+ICIgKyB0aGlzKTsJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gRW50cnkgcmVhY2hhYmxlQnk6IGluZm8gLT4gIiArIGluZm8pOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZWFjaGFibGVCeSgoVXB3YXJkUmVhY2hhYmxlSW5mbykgaW5mbywgbmV3IFN0YWNrKCksIG5ldyBIYXNoTWFwKCkpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gcmVhY2hhYmxlQnkoVXB3YXJkUmVhY2hhYmxlSW5mbyBpbmZvLCBTdGFjayBzdGFjaywgTWFwIHNlZW4pICB7Ci0JCXN0YWNrLnB1c2goaW5mbyk7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gcmVhY2hhYmxlQnk6IHRoaXMgLT4gIiArIHRoaXMpOwkJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gcmVhY2hhYmxlQnk6IGluZm8gLT4gIiArIGluZm8pOwkJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gcmV0ID0gIHJlYWNoYWJsZUJ5XyhpbmZvLCBzdGFjaywgc2Vlbik7Ci0JCXN0YWNrLnBvcCgpOwotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gcmVhY2hhYmxlQnlfKFVwd2FyZFJlYWNoYWJsZUluZm8gaW5mbywgU3RhY2sgc3RhY2ssIE1hcCBzZWVuKSAgewotCQlNYXAgdGVzdE1hcCA9IGluZm8ucGFyZW50TWFwOwkJCi0JCWlmICh0ZXN0TWFwID09IG51bGwgfHwgdGVzdE1hcC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKHRlc3RNYXAuY29udGFpbnNLZXkoZWxlbWVudC5nZXRHdWlkKCkpKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBDb250YWluZWQgaW4gcGFyZW50TWFwIG9mOiAiICsgaW5mbyk7CQkvLyROT04tTkxTLTEkCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJc3RhY2sucHVzaCh0aGlzKTsKLQkJCW1nci5sb2dDaXJjdWxhckRlcGVuZGVuY3koKFN0YWNrKSBzdGFjay5jbG9uZSgpKTsKLQkJCXN0YWNrLnBvcCgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmIChzZWVuLmNvbnRhaW5zS2V5KGluZm8uZ2V0RWxlbWVudCgpLmdldEd1aWQoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJCi0JCXNlZW4ucHV0KGluZm8uZ2V0RWxlbWVudCgpLmdldEd1aWQoKSwgaW5mbyk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdGVzdE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlVcHdhcmRSZWFjaGFibGVJbmZvIHBhcmVudEluZm8gPSAoVXB3YXJkUmVhY2hhYmxlSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKHBhcmVudEluZm8uY29udGFpbmVkSW4oc3RhY2spKSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGNvbnRhaW5lZEluIHN0YWNrOiAiICsgaW5mbyk7CQkvLyROT04tTkxTLTEkCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlzdGFjay5wdXNoKHBhcmVudEluZm8pOwotCQkJCW1nci5sb2dDaXJjdWxhckRlcGVuZGVuY3koKFN0YWNrKSBzdGFjay5jbG9uZSgpKTsKLQkJCQlzdGFjay5wb3AoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmICAocmVhY2hhYmxlQnkocGFyZW50SW5mbywgc3RhY2ssIHNlZW4pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0JCi0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQkKLQlwcml2YXRlIExpc3QgZ2V0TWl4ZWRQYXJlbnRMaXN0KCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWNvbGxlY3RQYXJlbnRMaXN0KGVsZW1lbnQsIGxpc3QpOwotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50OwotCQljb2xsZWN0UGFyZW50TGlzdEJ5VmFyaWFudFBhdGhzKHZlLCBsaXN0KTsKLQkJaWYgKHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFU19MSVRFUkFMICkgewotCQkJbWdyLmFkZFRvUmVwbGFjZXJNYXAodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjb2xsZWN0UGFyZW50TGlzdChNZXRob2RFbGVtZW50IGVsZW0sIExpc3QgbGlzdCkgewotCQlMaXN0IHBhcmVudExpc3QgPSBnZXRQYXJlbnRMaXN0KGVsZW0pOwotCQkKLQkJaW50IHN6ID0gcGFyZW50TGlzdCA9PSBudWxsID8gMCA6IHBhcmVudExpc3Quc2l6ZSgpOwotCQlpZiAobWdyLmlzTW92ZUVsZW1lbnQoZWxlbSkpIHsKLQkJCWlmIChzeiA+IDEpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsJCi0JCQl9Ci0JCX0gZWxzZSBpZiAoc3ogPiAwKSB7Ci0JCQlsaXN0LmFkZEFsbChwYXJlbnRMaXN0KTsKLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFBhcmVudExpc3QoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCUxpc3QgcGFyZW50TGlzdCA9IG51bGw7Ci0JCQotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlwYXJlbnRMaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcygoQ3VzdG9tQ2F0ZWdvcnkpIGVsZW0pOwotCQl9IGVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJcGFyZW50TGlzdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldERlbGl2ZXJhYmxlcygoRGVsaXZlcmFibGUpIGVsZW0pOwkJCQotCQl9IGVsc2UgewkKLQkJCU9iamVjdCBwYXJlbnQgPSBnZXRTYW1lVHlwZVBhcmVudChlbGVtKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCXBhcmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJcGFyZW50TGlzdC5hZGQocGFyZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFyZW50TGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RQYXJlbnRMaXN0QnlWYXJpYW50UGF0aHMoVmFyaWFiaWxpdHlFbGVtZW50IHZlLCBMaXN0IGxpc3QpIHsKLQkJaWYgKCEgbWdyLmlzRmlsdGVyRWxlbWVudCh2ZSkpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBwYXJlbnRWZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gcGFyZW50VmUgPT0gbnVsbCA/IG51bGwgOiB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCWlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFU19MSVRFUkFMIHx8IHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUwpIHsKLQkJCQlsaXN0LmFkZChwYXJlbnRWZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobWdyLmlzRG5kRWxlbWVudCh2ZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkJCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gVG5nVXRpbC5nZXRJbW1lZGlhdGVWYXJpZXRpZXModmUsIFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpIDsgaXQuaGFzTmV4dCgpOykgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGV4dGVuZGVyID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCQkJaWYgKCEgbWdyLmlzRmlsdGVyRWxlbWVudChleHRlbmRlcikpIHsKLQkJCQlsaXN0LmFkZChleHRlbmRlcik7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0U2FtZVR5cGVQYXJlbnQoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCWlmIChlbGVtIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXJldHVybiAoKEFjdGl2aXR5KSBlbGVtKS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJfQotCQkJCi0JCU1ldGhvZEVsZW1lbnQgcGFyZW50ID0gKE1ldGhvZEVsZW1lbnQpIGVsZW0uZUNvbnRhaW5lcigpOwotCQlyZXR1cm4gcGFyZW50LmdldFR5cGUoKSA9PSBlbGVtLmdldFR5cGUoKSA/IHBhcmVudCA6IG51bGw7Ci0JfQkJCi0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaW5oZXJpdEFuY2VzdG9yKFZhcmlhYmlsaXR5VHlwZSB0eXBlKSB7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCBwYXJlbnRWZSA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCWlmIChwYXJlbnRWZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCgoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KS5nZXRWYXJpYWJpbGl0eVR5cGUoKSAhPSB0eXBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQXJyYXlMaXN0IG1peFBhcmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CQotCQljb2xsZWN0UGFyZW50TGlzdChlbGVtZW50LCBtaXhQYXJlbnRMaXN0KTsKLQkJaWYgKG1peFBhcmVudExpc3QgIT0gbnVsbCAmJiBtaXhQYXJlbnRMaXN0LmNvbnRhaW5zKHBhcmVudFZlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlVcHdhcmRSZWFjaGFibGVJbmZvIHBhcmVudFZlSW5mbyA9IChVcHdhcmRSZWFjaGFibGVJbmZvKSBwYXJlbnRNYXAuZ2V0KHBhcmVudFZlLmdldEd1aWQoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwYXJlbnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJVXB3YXJkUmVhY2hhYmxlSW5mbyBwYXJlbnRJbmZvID0gKFVwd2FyZFJlYWNoYWJsZUluZm8pIGl0Lm5leHQoKTsKLQkJCWlmICAocGFyZW50VmVJbmZvID09IHBhcmVudEluZm8pIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChwYXJlbnRWZUluZm8ucmVhY2hhYmxlQnkocGFyZW50SW5mbykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkJCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8vVGhpcyB3b3VsZCBzY2FsZSB1cCBmb3IgcGVyZm9ybWFuY2Ugd2hlbiBpbmZvTGlzdCBnZXRzIGxhcmdlCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5lZEluKExpc3QgaW5mb0xpc3QpIHsKLQkJaW50IHN6ID0gaW5mb0xpc3QgPT0gbnVsbCA/IDAgOiBpbmZvTGlzdC5zaXplKCk7Ci0JCWlmIChzeiA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGd1aWQgPSBnZXRFbGVtZW50KCkuZ2V0R3VpZCgpOwotCQlpZiAoc3ogPT0gMSkgewotCQkJcmV0dXJuIGd1aWQuZXF1YWxzKCgoSURlcGVuZGVuY3lJbmZvKSBpbmZvTGlzdC5nZXQoMCkpLmdldEVsZW1lbnQoKS5nZXRHdWlkKCkpOwotCQl9Ci0JCU1hcCBsaXN0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gKElEZXBlbmRlbmN5SW5mbykgaW5mb0xpc3QuZ2V0KGkpOwotCQkJbGlzdE1hcC5wdXQoaW5mby5nZXRFbGVtZW50KCkuZ2V0R3VpZCgpLCBpbmZvKTsKLQkJfQotCQkKLQkJcmV0dXJuIGxpc3RNYXAuY29udGFpbnNLZXkoZ3VpZCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXR1cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZTk2MmRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uU3RhdHVzIGV4dGVuZHMgU3RhdHVzIHsKLQotCXByaXZhdGUgT2JqZWN0IGNoZWNrZWRPYmplY3Q7Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCS8qKgotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqIEBwYXJhbSBjb2RlCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcGFyYW0gY2hlY2tlZE9iamVjdAotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uU3RhdHVzKGludCBzZXZlcml0eSwgaW50IGNvZGUsIFN0cmluZyBtZXNzYWdlLCBPYmplY3QgY2hlY2tlZE9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJc3VwZXIoc2V2ZXJpdHksIExpYnJhcnlFZGl0UGx1Z2luLlBMVUdJTl9JRCwgY29kZSwgbWVzc2FnZSwgbnVsbCk7Ci0JCXRoaXMuY2hlY2tlZE9iamVjdCA9IGNoZWNrZWRPYmplY3Q7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCQotCXB1YmxpYyBWYWxpZGF0aW9uU3RhdHVzKFN0cmluZyBwbHVnaW5JZCwgaW50IHNldmVyaXR5LCBpbnQgY29kZSwgU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBjaGVja2VkT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlzdXBlcihzZXZlcml0eSwgcGx1Z2luSWQsIGNvZGUsIG1lc3NhZ2UsIG51bGwpOwotCQl0aGlzLmNoZWNrZWRPYmplY3QgPSBjaGVja2VkT2JqZWN0OwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0Q2hlY2tlZE9iamVjdCgpIHsKLQkJcmV0dXJuIGNoZWNrZWRPYmplY3Q7Ci0JfQotCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL0NvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MDZhMjc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL0NvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0KLS8qKgotICogTmFtZSB2YWxpZGF0b3IgZm9yIENvbnRlbnRFbGVtZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IgZXh0ZW5kcyBVbmlxdWVuZXNzVmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvcihFT2JqZWN0IGNvbnRhaW5lciwgQ29udGVudEVsZW1lbnQgZSwKLQkJCUlGaWx0ZXIgY2hpbGRGaWx0ZXIpIHsKLQkJc3VwZXIoY29udGFpbmVyLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgY2hpbGRGaWx0ZXIsIGUsCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yKEVPYmplY3QgcGFyZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGNvbnRhaW5pbmdGZWF0dXJlLCBDb250ZW50RWxlbWVudCBlLAotCQkJSUZpbHRlciBjaGlsZEZpbHRlcikgewotCQlzdXBlcihwYXJlbnQsIGNvbnRhaW5pbmdGZWF0dXJlLCBjaGlsZEZpbHRlciwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWwuVW5pcXVlbmVzc1ZhbGlkYXRvciNpc1ZhbGlkKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJQ29udGVudEVsZW1lbnQgZSA9IChDb250ZW50RWxlbWVudCkgb2JqZWN0OwotCi0JCS8vIDE1Njk0NSAtIEVsZW1lbnQgbmFtZSBuZWVkIHRvIGFsbG93IG1vcmUgc3BlY2lhbCBjaGFyYWN0ZXJzIHN1Y2ggYXMgPyAKLQkJLy8gaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZ2VuZXJhdGUgYSByZXNvdXJjZSBmaWxlCi0JCWlmICggZSBpbnN0YW5jZW9mIFNlY3Rpb24gKSB7Ci0JCQlyZXR1cm4gbmV3VGV4dDsKLQkJfQotCQkKLQkJU3RyaW5nIG1zZyA9IFRuZ1V0aWwuY2hlY2tFbGVtZW50TmFtZShuZXdUZXh0LCBUbmdVdGlsLmdldFR5cGVUZXh0KGUpKTsKLQkJaWYgKG1zZyAhPSBudWxsKQotCQkJcmV0dXJuIG1zZzsKLQotCQkvLyBDaGVjayB3aGV0aGVyIGEgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuCi0JCWlmIChjb250YWluZXIgIT0gbnVsbCAmJiBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihlKSkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNvbnRhaW5lcik7Ci0JCQlpZihwbHVnaW4gPT0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSkpIHsKLQkJCQlVUkkgdXJpID0gcGx1Z2luLmVSZXNvdXJjZSgpLmdldFVSSSgpOwotCQkJCWlmKHVyaS5pc0ZpbGUoKSkgewotCQkJCQlGaWxlIHBsdWdpbkRpciA9IG5ldyBGaWxlKHVyaS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50RmlsZSgpOwotCQkJCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSAoKElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKVNlcnZpY2VzLmdldExpYnJhcnlQZXJzaXN0ZXIoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpKTsJCQkKLQkJCQkJU3RyaW5nIGZvbGRlclBhdGggPSBwZXJzaXN0ZXIuZ2V0Rm9sZGVyUmVsYXRpdmVQYXRoKGUpOwotCQkJCQlTdHJpbmcgZGlyID0gbmV3IFN0cmluZ0J1ZmZlcihwbHVnaW5EaXIuZ2V0QWJzb2x1dGVQYXRoKCkpLmFwcGVuZCgKLQkJCQkJCQlGaWxlLnNlcGFyYXRvcikuYXBwZW5kKGZvbGRlclBhdGgpLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBmaWxlTmFtZSA9IG5ld1RleHQgKyBwZXJzaXN0ZXIuZ2V0RmlsZUV4dGVuc2lvbihlKTsKLQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyLCBmaWxlTmFtZSk7Ci0JCQkJCUZpbGUgY3VycmVudEZpbGUgPSBudWxsOwotCQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IGUuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQkJCWlmIChjb250ZW50LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJCWN1cnJlbnRGaWxlID0gbmV3IEZpbGUoY29udGVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkJCQkudG9GaWxlU3RyaW5nKCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY3VycmVudEZpbGUgPSBmaWxlOwotCQkJCQl9Ci0JCQkJCWlmIChmaWxlLmV4aXN0cygpICYmICFuZXdUZXh0LmVxdWFscyhlLmdldE5hbWUoKSkgJiYgIWZpbGUuZXF1YWxzKGN1cnJlbnRGaWxlKSkgewotCQkJCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3JfbXNnLCBmaWxlKTsgCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuaXNWYWxpZChuZXdUZXh0KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9DdXN0b21DYXRlZ29yeU5hbWVWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL0N1c3RvbUNhdGVnb3J5TmFtZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMDEwZmQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL0N1c3RvbUNhdGVnb3J5TmFtZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0KLS8qKgotICogTmFtZSB2YWxpZGF0b3IgZm9yIEN1c3RvbUNhdGVnb3J5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlOYW1lVmFsaWRhdG9yIGV4dGVuZHMgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBjaGlsZEZpbHRlcgotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeU5hbWVWYWxpZGF0b3IoQ3VzdG9tQ2F0ZWdvcnkgcGFyZW50LCBDdXN0b21DYXRlZ29yeSBlLAotCQkJSUZpbHRlciBjaGlsZEZpbHRlcikgewotCQlzdXBlcihwYXJlbnQsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUywgZSwgY2hpbGRGaWx0ZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvRG9Ob3RoaW5nVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9Eb05vdGhpbmdWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDU1MmJiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9Eb05vdGhpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci0KLS8qKgotICogVmFsaWRhdG9yIHRoYXQgdmFsaWRhdGVzIG5vdGhpbmcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDQsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERvTm90aGluZ1ZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRG9Ob3RoaW5nVmFsaWRhdG9yIElOU1RBTkNFID0gbmV3IERvTm90aGluZ1ZhbGlkYXRvcigpOwotCi0JcHJpdmF0ZSBEb05vdGhpbmdWYWxpZGF0b3IoKSB7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL01ldGhvZENvbmZpZ3VyYXRpb25OYW1lVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9NZXRob2RDb25maWd1cmF0aW9uTmFtZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NmY1ODAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL01ldGhvZENvbmZpZ3VyYXRpb25OYW1lVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0KLS8qKgotICogTmFtZSB2YWxpZGF0b3IgZm9yIE1ldGhvZENvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWF5IDEyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kQ29uZmlndXJhdGlvbk5hbWVWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdFN0cmluZ1ZhbGlkYXRvciB7Ci0KLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgbGlicmFyeTsKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lVmFsaWRhdG9yKE1ldGhvZExpYnJhcnkgbGliLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlsaWJyYXJ5ID0gbGliOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQlTdHJpbmcgY29uZmlnRm9sZGVyID0gKChJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcilTZXJ2aWNlcy5nZXRMaWJyYXJ5UGVyc2lzdGVyKFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFKSkgCi0JCQkuZ2V0Rm9sZGVyUmVsYXRpdmVQYXRoKGNvbmZpZyk7Ci0JCUZpbGUgZGlyID0gbmV3IEZpbGUobmV3IEZpbGUobGlicmFyeS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkKLQkJCQkJCS5nZXRQYXJlbnQoKSwgY29uZmlnRm9sZGVyKTsKLQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tOYW1lKGRpciwgbGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSwgY29uZmlnLAotCQkJCW5ld1RleHQsIFRuZ1V0aWwuZ2V0VHlwZVRleHQoY29uZmlnKSwgZmFsc2UpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9NZXRob2RQbHVnaW5OYW1lVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9NZXRob2RQbHVnaW5OYW1lVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1ZDhjZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvTWV0aG9kUGx1Z2luTmFtZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkFic3RyYWN0U3RyaW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjEKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFBsdWdpbk5hbWVWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdFN0cmluZ1ZhbGlkYXRvciB7Ci0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGxpYjsKLQlwcml2YXRlIE1ldGhvZFBsdWdpbiBwbHVnaW47CQotCi0JLyoqCi0JICogQHBhcmFtIGxpYgotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW5OYW1lVmFsaWRhdG9yKE1ldGhvZExpYnJhcnkgbGliLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGliID0gbGliOwotCQl0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLQl9Ci0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQlTdHJpbmcgbXNnID0gVG5nVXRpbC5jaGVja1BsdWdpbk5hbWUobmV3VGV4dCk7Ci0JCWlmKG1zZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbXNnOwotCQl9Ci0JCQotCQlGaWxlIGRpciA9IG5ldyBGaWxlKGxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkKLQkJCQkuZ2V0UGFyZW50RmlsZSgpOwotCQlTdHJpbmcgZWxlbWVudFR5cGVUZXh0ID0gKHBsdWdpbiAhPSBudWxsKSA/IFRuZ1V0aWwuZ2V0VHlwZVRleHQocGx1Z2luKQotCQkJCTogVG5nVXRpbC5nZXRUeXBlVGV4dCgiTWV0aG9kUGx1Z2luIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tOYW1lKGRpciwgbGliLmdldE1ldGhvZFBsdWdpbnMoKSwgcGx1Z2luLCBuZXdUZXh0LAotCQkJCWVsZW1lbnRUeXBlVGV4dCwgdHJ1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9Qcm9jZXNzQ29tcG9uZW50TmFtZVZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUHJvY2Vzc0NvbXBvbmVudE5hbWVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2FjMzFjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9Qcm9jZXNzQ29tcG9uZW50TmFtZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkFic3RyYWN0U3RyaW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi0vKioKLSAqIFZhbGlkYXRlcyB0aGUgbmFtZSBvZiBhIHByb2Nlc3MgY29tcG9uZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQ29tcG9uZW50TmFtZVZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0U3RyaW5nVmFsaWRhdG9yIHsKLQotCXByaXZhdGUgUHJvY2Vzc1BhY2thZ2UgcGFyZW50OwotCi0JcHJpdmF0ZSBQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudE5hbWVWYWxpZGF0b3IoUHJvY2Vzc1BhY2thZ2UgcGFyZW50LAotCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy5wcm9jQ29tcCA9IHByb2NDb21wOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQlTdHJpbmcgcmVsYXRpdmVQYXRoID0gKChJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcilTZXJ2aWNlcy5nZXRMaWJyYXJ5UGVyc2lzdGVyKFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFKSkKLQkJCS5nZXRGb2xkZXJSZWxhdGl2ZVBhdGgocHJvY0NvbXApOwotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ocGFyZW50KTsKLQkJRmlsZSBkaXIgPSBuZXcgRmlsZSgKLQkJCQluZXcgRmlsZShwbHVnaW4uZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpCi0JCQkJCQkuZ2V0UGFyZW50KCkKLQkJCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyByZWxhdGl2ZVBhdGgpOwotCQlpZiAoISBuZXdUZXh0LmVxdWFscyhTdHJVdGlsLm1ha2VWYWxpZEZpbGVOYW1lKG5ld1RleHQpKSkgewotCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmludmFsaWRFbGVtZW50TmFtZUVycm9yM19tc2csIG5ld1RleHQpOyAKLQkJfQotCQlyZXR1cm4gVG5nVXRpbC5jaGVja05hbWUoZGlyLCBwYXJlbnQuZ2V0Q2hpbGRQYWNrYWdlcygpLCBwcm9jQ29tcCwKLQkJCQluZXdUZXh0LCBUbmdVdGlsLmdldFR5cGVUZXh0KHByb2NDb21wKSwgdHJ1ZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVW5pcXVlbmVzc1ZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVW5pcXVlbmVzc1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDExNjU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL1VuaXF1ZW5lc3NWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBWYWxpZGF0ZXMgdGhlIHVuaXF1ZW5lc3Mgb2YgYW4gb2JqZWN0IHdpdGhpbiBhIGdpdmVuIGZlYXR1cmUgdGhhdCBjb250YWlucyBpdC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVuaXF1ZW5lc3NWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yIHsKLQlwcm90ZWN0ZWQgRU9iamVjdCBvYmplY3Q7Ci0KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZmVhdHVyZU5hbWU7Ci0KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjb250YWluaW5nRmVhdHVyZTsKLQotCXByaXZhdGUgSUZpbHRlciBjaGlsZEZpbHRlcjsKLQotCXByb3RlY3RlZCBFT2JqZWN0IGNvbnRhaW5lcjsKLQotCXB1YmxpYyBVbmlxdWVuZXNzVmFsaWRhdG9yKEVPYmplY3QgY29udGFpbmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGNvbnRhaW5pbmdGZWF0dXJlLCBJRmlsdGVyIGNoaWxkRmlsdGVyLAotCQkJRU9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXRoaXMoY29udGFpbmVyLCBjb250YWluaW5nRmVhdHVyZSwgY2hpbGRGaWx0ZXIsIG9iaiwgZmVhdHVyZSwgU3RyVXRpbAotCQkJCS50b0xvd2VyKFRuZ1V0aWwuZ2V0RmVhdHVyZVRleHQoZmVhdHVyZSkpKTsKLQl9Ci0KLQlwdWJsaWMgVW5pcXVlbmVzc1ZhbGlkYXRvcihFT2JqZWN0IGNvbnRhaW5lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBjb250YWluaW5nRmVhdHVyZSwgSUZpbHRlciBjaGlsZEZpbHRlciwKLQkJCUVPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCXRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOwotCQlvYmplY3QgPSBvYmo7Ci0JCXRoaXMuY29udGFpbmluZ0ZlYXR1cmUgPSBjb250YWluaW5nRmVhdHVyZTsKLQkJdGhpcy5jaGlsZEZpbHRlciA9IGNoaWxkRmlsdGVyOwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLmZlYXR1cmVOYW1lID0gZmVhdHVyZU5hbWU7Ci0JfQotCQotCXZvaWQgc2V0Q2hpbGRGaWx0ZXIoSUZpbHRlciBjaGlsZEZpbHRlcikgewotCQl0aGlzLmNoaWxkRmlsdGVyID0gY2hpbGRGaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQluZXdUZXh0ID0gbmV3VGV4dC50cmltKCk7Ci0JCWlmIChTdHJVdGlsLmlzQmxhbmsobmV3VGV4dCkpIHsKLQkJCS8vIHJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2csCi0JCQkJCWZlYXR1cmVOYW1lKTsKLQkJfQotCQlDb2xsZWN0aW9uIGNoaWxkcmVuOwotCQlpZiAoY29udGFpbmluZ0ZlYXR1cmUgPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBjb250YWluZXIuZUNvbnRlbnRzKCk7Ci0JCX0gZWxzZSB7Ci0JCQljaGlsZHJlbiA9IChDb2xsZWN0aW9uKSBjb250YWluZXIuZUdldChjb250YWluaW5nRmVhdHVyZSk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCAhPSBvYmplY3QgJiYgY2hpbGRGaWx0ZXIuYWNjZXB0KGNoaWxkKSkgewotCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgKChFT2JqZWN0KSBjaGlsZCkuZUdldChmZWF0dXJlKTsKLQkJCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKG5ld1RleHQpKSB7Ci0JCQkJCS8vIHJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csCi0JCQkJCQkJbmV3VGV4dCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdGF0dXMgaXNWYWxpZChPYmplY3QgdmFsdWUpIHsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW47Ci0JCWlmIChjb250YWluaW5nRmVhdHVyZSA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IGNvbnRhaW5lci5lQ29udGVudHMoKTsKLQkJfSBlbHNlIHsKLQkJCWNoaWxkcmVuID0gKENvbGxlY3Rpb24pIGNvbnRhaW5lci5lR2V0KGNvbnRhaW5pbmdGZWF0dXJlKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkICE9IG9iamVjdCAmJiBjaGlsZEZpbHRlci5hY2NlcHQoY2hpbGQpKSB7Ci0JCQkJU3RyaW5nIG8gPSAoU3RyaW5nKSAoKEVPYmplY3QpIGNoaWxkKS5lR2V0KGZlYXR1cmUpOwotCQkJCWlmIChvLmVxdWFscyh2YWx1ZSkpIHsKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwKLQkJCQkJCQkwLAotCQkJCQkJCU5MUwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUZlYXR1cmVWYWx1ZSwKLQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQlUbmdVdGlsLmdldExhYmVsKGNvbnRhaW5lciksCi0JCQkJCQkJCQkJCQkJZmVhdHVyZU5hbWUKLQkJCQkJCQkJCQkJfSksIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRFT2JqZWN0KCkgewotCQlyZXR1cm4gb2JqZWN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmI1ZGY0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkFic3RyYWN0U3RyaW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uTmFtZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBJVmFsaWRhdG9yRmFjdG9yeS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvckZhY3RvcnkgaW1wbGVtZW50cyBJVmFsaWRhdG9yRmFjdG9yeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBjb250cmlidXRlZFZhbGlkYXRvckZhY3RvcmllczsKLQotCXByaXZhdGUgc3RhdGljIElWYWxpZGF0b3JGYWN0b3J5IGluc3RhbmNlOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3RvcnkjY3JlYXRlTmFtZVZhbGlkYXRvcihvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50KQotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZU5hbWVWYWxpZGF0b3IoT2JqZWN0IHBhcmVudCwgQ29udGVudEVsZW1lbnQgZSkgewotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkgJiYgZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlyZXR1cm4gbmV3IENvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvcigoRU9iamVjdCkgcGFyZW50LAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCksIGUsCi0JCQkJCW5ldyBUeXBlRmlsdGVyKGUpKTsKLQkJfQotCQlFT2JqZWN0IGNvbnRhaW5lciA9IG51bGw7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQljb250YWluZXIgPSAoRU9iamVjdCkgcGFyZW50OwotCQl9Ci0JCXJldHVybiBuZXcgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yKGNvbnRhaW5lciwgZSwgbmV3IFR5cGVGaWx0ZXIoZSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5I2NyZWF0ZVByZXNlbnRhdGlvbk5hbWVWYWxpZGF0b3Iob3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCkKLQkgKiAgICAgIENoYW5nZWQgZnJvbSBDb250ZW50RWxlbWVudCB0byBEZXNjcmliYWJsZUVsZW1lbnQsIGJlY2F1c2UKLQkgKiAgICAgIFByZXNlbnRhdGlvbk5hbWUgYXR0cmlidXRlIGlzIGF2YWlsYWJsZSBpbiBEZXNjcmliYWJsZUVsZW1lbnQuCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgY3JlYXRlUHJlc2VudGF0aW9uTmFtZVZhbGlkYXRvcihPYmplY3QgcGFyZW50LAotCQkJRGVzY3JpYmFibGVFbGVtZW50IGUpIHsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCU9iamVjdFtdIGFyciA9IGdldENoaWxkUmVmZXJlbmNlQW5kRmlsdGVyKHBhcmVudCwgZSk7Ci0JCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChFUmVmZXJlbmNlKSBhcnJbMF07Ci0JCQlJRmlsdGVyIGNoaWxkRmlsdGVyID0gKElGaWx0ZXIpIGFyclsxXTsKLQkJCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkgewotCQkJCWlmIChjaGlsZEZpbHRlciA9PSBudWxsKSB7Ci0JCQkJCWNoaWxkRmlsdGVyID0gbmV3IFR5cGVGaWx0ZXIoZSk7Ci0JCQkJfQotCQkJCXJldHVybiBuZXcgVW5pcXVlbmVzc1ZhbGlkYXRvcigoRU9iamVjdCkgcGFyZW50LCByZWZlcmVuY2UsCi0JCQkJCQljaGlsZEZpbHRlciwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpIHsKLQkJCQkJLyoKLQkJCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCQkgKiAKLQkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWwuVW5pcXVlbmVzc1ZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5TdHJpbmcpCi0JCQkJCSAqLwotCQkJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJCQkJCWlmIChTdHJVdGlsLmlzQmxhbmsobmV3VGV4dCkKLQkJCQkJCQkJJiYgTmFtZUNoZWNrZXIKLQkJCQkJCQkJCQkuY2FuSGF2ZUVtcHR5UHJlc2VudGF0aW9uTmFtZSgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpKSB7Ci0JCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gc3VwZXIuaXNWYWxpZChuZXdUZXh0KTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gRG9Ob3RoaW5nVmFsaWRhdG9yLklOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVHlwZUZpbHRlciBpbXBsZW1lbnRzIElGaWx0ZXIgewotCQlwcml2YXRlIGludCBjbGFzc0lEOwotCi0JCXByaXZhdGUgRUNsYXNzIGVDbGFzczsKLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwdWJsaWMgVHlwZUZpbHRlcihFT2JqZWN0IG9iaikgewotCQkJY2xhc3NJRCA9IG9iai5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKTsKLQkJfQotCi0JCXB1YmxpYyBUeXBlRmlsdGVyKEVDbGFzcyBlQ2xhc3MpIHsKLQkJCXRoaXMuZUNsYXNzID0gZUNsYXNzOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCWlmIChlQ2xhc3MgIT0gbnVsbCkgewotCQkJCXJldHVybiBlQ2xhc3MuaXNJbnN0YW5jZShvYmopOwotCQkJfQotCi0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgRU9iamVjdAotCQkJCQkmJiBjbGFzc0lEID09ICgoRU9iamVjdCkgb2JqKS5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKTsKLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRmlsdGVyIG5vbkZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgc3RhdGljIE9iamVjdFtdIGdldENoaWxkUmVmZXJlbmNlQW5kRmlsdGVyKE9iamVjdCBwYXJlbnQsCi0JCQlPYmplY3QgY2hpbGQpIHsKLQkJRVJlZmVyZW5jZSByZWZlcmVuY2UgPSBudWxsOwotCQlJRmlsdGVyIGNoaWxkRmlsdGVyID0gbnVsbDsKLQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeQotCQkJCQkmJiBjaGlsZCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJcmVmZXJlbmNlID0gVW1hUGFja2FnZS5MaXRlcmFscy5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlRTOwotCQkJCWNoaWxkRmlsdGVyID0gbmV3IFR5cGVGaWx0ZXIoCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWSk7Ci0JCQl9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJcmVmZXJlbmNlID0gVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFM7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlCi0JCQkJJiYgcGFyZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJcmVmZXJlbmNlID0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVM7Ci0JCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmVmZXJlbmNlID0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlM7Ci0JCQkJY2hpbGRGaWx0ZXIgPSBub25GaWx0ZXI7Ci0JCQl9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCXJlZmVyZW5jZSA9IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlM7Ci0JCQkJY2hpbGRGaWx0ZXIgPSBub25GaWx0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IHJlZmVyZW5jZSwgY2hpbGRGaWx0ZXIgfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeSNjcmVhdGVOYW1lVmFsaWRhdG9yKG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50KQotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZU5hbWVWYWxpZGF0b3IoT2JqZWN0IHBhcmVudCwgZmluYWwgTmFtZWRFbGVtZW50IGUpIHsKLQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX0VMRU1FTlRfX05BTUU7Ci0JCU9iamVjdFtdIGFyciA9IGdldENoaWxkUmVmZXJlbmNlQW5kRmlsdGVyKHBhcmVudCwgZSk7Ci0JCUVSZWZlcmVuY2UgcmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIGFyclswXTsKLQkJSUZpbHRlciBjaGlsZEZpbHRlciA9IChJRmlsdGVyKSBhcnJbMV07Ci0JCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNyZWF0ZVZhbGlkYXRvcigoRU9iamVjdCkgcGFyZW50LCByZWZlcmVuY2UsIGNoaWxkRmlsdGVyLCBlLAotCQkJCQlmZWF0dXJlKTsKLQkJfQotCQlyZXR1cm4gRG9Ob3RoaW5nVmFsaWRhdG9yLklOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZU5hbWVWYWxpZGF0b3IoT2JqZWN0IHBhcmVudCwgZmluYWwgTmFtZWRFbGVtZW50IGUsIEVDbGFzcyBuZXdUeXBlKSB7Ci0JCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FOwotCQlPYmplY3RbXSBhcnIgPSBnZXRDaGlsZFJlZmVyZW5jZUFuZEZpbHRlcihwYXJlbnQsIGUpOwotCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChFUmVmZXJlbmNlKSBhcnJbMF07Ci0JCUlGaWx0ZXIgY2hpbGRGaWx0ZXIgPSBuZXcgVHlwZUZpbHRlcihuZXdUeXBlKTsKLQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY3JlYXRlVmFsaWRhdG9yKChFT2JqZWN0KSBwYXJlbnQsIHJlZmVyZW5jZSwgY2hpbGRGaWx0ZXIsIGUsCi0JCQkJCWZlYXR1cmUpOwotCQl9Ci0JCXJldHVybiBEb05vdGhpbmdWYWxpZGF0b3IuSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3RvcnkjY3JlYXRlTmFtZVZhbGlkYXRvcihvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZU5hbWVWYWxpZGF0b3IoTmFtZWRFbGVtZW50IGUsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgY29udGFpbmluZ0ZlYXR1cmUgPSBUbmdVdGlsLmdldENvbnRhaW5pbmdGZWF0dXJlKGUsCi0JCQkJYWRhcHRlckZhY3RvcnkpOwotCQlpZiAoY29udGFpbmluZ0ZlYXR1cmUgIT0gbnVsbCkgewotCQkJRU9iamVjdCBwYXJlbnQgPSAoRU9iamVjdCkgKChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpKS5nZXRQYXJlbnQoZSk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIG5ldyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IocGFyZW50LAotCQkJCQkJY29udGFpbmluZ0ZlYXR1cmUsIChDb250ZW50RWxlbWVudCkgZSwKLQkJCQkJCW5ldyBUeXBlRmlsdGVyKGUpKTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQKLQkJCQkJJiYgcGFyZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlyZXR1cm4gbmV3IFByb2Nlc3NDb21wb25lbnROYW1lVmFsaWRhdG9yKAotCQkJCQkJKFByb2Nlc3NQYWNrYWdlKSBwYXJlbnQsIChQcm9jZXNzQ29tcG9uZW50KSBlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG5ldyBVbmlxdWVuZXNzVmFsaWRhdG9yKHBhcmVudCwgY29udGFpbmluZ0ZlYXR1cmUsCi0JCQkJCQluZXcgVHlwZUZpbHRlcihlKSwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjcmVhdGVOYW1lVmFsaWRhdG9yKGUuZUNvbnRhaW5lcigpLCBlKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3RvcnkjY3JlYXRlVmFsaWRhdG9yKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2UsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzcywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKEVPYmplY3QgcGFyZW50LCBFUmVmZXJlbmNlIHJlZmVyZW5jZSwKLQkJCUVDbGFzcyBlQ2xhc3MsIGZpbmFsIEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlJRmlsdGVyIGNoaWxkRmlsdGVyID0gZUNsYXNzICE9IG51bGwgPyBuZXcgVHlwZUZpbHRlcihlQ2xhc3MpIDogbnVsbDsKLQkJcmV0dXJuIGNyZWF0ZVZhbGlkYXRvcihwYXJlbnQsIHJlZmVyZW5jZSwgY2hpbGRGaWx0ZXIsIG9iamVjdCwgZmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVmFsaWRhdG9yRmFjdG9yeSBjcmVhdGVWYWxpZGF0b3JGYWN0b3J5KCkgewotCQlpZiAoY29udHJpYnV0ZWRWYWxpZGF0b3JGYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJY29udHJpYnV0ZWRWYWxpZGF0b3JGYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybQotCQkJCQkuZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5Ci0JCQkJCS5nZXRFeHRlbnNpb25Qb2ludChMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwKLQkJCQkJCQkidmFsaWRhdGlvblN1cHBvcnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCQl0cnkgewotCQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJCU9iamVjdCBleHQgPSBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSkKLQkJCQkJCQkJCQkubmV3SW5zdGFuY2UoKTsKLQkJCQkJCQkJYm9vbGVhbiByZXBsYWNlID0gbmV3IEJvb2xlYW4oY29uZmlnRWxlbWVudAotCQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoInJlcGxhY2UiKSkuYm9vbGVhblZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJaWYgKHJlcGxhY2UpIHsKLQkJCQkJCQkJCWNvbnRyaWJ1dGVkVmFsaWRhdG9yRmFjdG9yaWVzLmNsZWFyKCk7Ci0JCQkJCQkJCQlpbnN0YW5jZSA9IChJVmFsaWRhdG9yRmFjdG9yeSkgZXh0OwotCQkJCQkJCQl9IGVsc2UgaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJCQkJCWNvbnRyaWJ1dGVkVmFsaWRhdG9yRmFjdG9yaWVzLmFkZChleHQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgVmFsaWRhdG9yRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeSNjcmVhdGVWYWxpZGF0b3Iob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzcywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcihmaW5hbCBPYmplY3QgcGFyZW50LCBFQ2xhc3MgZUNsYXNzLAotCQkJZmluYWwgRU9iamVjdCBvYmplY3QsIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJZmluYWwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRQotCQkJCQl8fCBmZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUpIHsKLQkJCQlmaW5hbCBCcmVha2Rvd25FbGVtZW50IGJlID0gKEJyZWFrZG93bkVsZW1lbnQpIG9iamVjdDsKLQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MocGFyZW50KTsKLQkJCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkJCWZpbmFsIFN1cHByZXNzaW9uIHN1cHAgPSBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jKTsKLQkJCQkJcmV0dXJuIG5ldyBBYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcigpIHsKLQotCQkJCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJCQkJcmV0dXJuIE5hbWVDaGVja2VyLmNoZWNrTmFtZShhZGFwdGVyRmFjdG9yeSwKLQkJCQkJCQkJCXBhcmVudCwgYmUsIG51bGwsIGZlYXR1cmUsIG5ld1RleHQsIHN1cHAsCi0JCQkJCQkJCQl0cnVlKTsKLQkJCQkJCX0KLQotCQkJCQl9OwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBEb05vdGhpbmdWYWxpZGF0b3IuSU5TVEFOQ0U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSUZpbHRlciBnZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIsIEVPYmplY3QgZU9iamVjdCkgewotCQlyZXR1cm4gZmlsdGVyICE9IG51bGwgPyBmaWx0ZXIgOiAoZU9iamVjdCAhPSBudWxsID8gbmV3IFR5cGVGaWx0ZXIoCi0JCQkJZU9iamVjdCkgOiBub25GaWx0ZXIpOwotCX0KLQotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcihFT2JqZWN0IHBhcmVudCwgRVJlZmVyZW5jZSByZWZlcmVuY2UsCi0JCQlJRmlsdGVyIGNoaWxkRmlsdGVyLCBmaW5hbCBFT2JqZWN0IG9iamVjdCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRSkgewotCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJaWYgKHJlZmVyZW5jZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpCi0JCQkJCQl8fCAocmVmZXJlbmNlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUyAmJiBvYmplY3QgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkpIHsKLQkJCQkJdmFsaWRhdG9yID0gbmV3IENvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvcihwYXJlbnQsCi0JCQkJCQkJcmVmZXJlbmNlLCAoQ29udGVudEVsZW1lbnQpIG9iamVjdCwgZ2V0RmlsdGVyKAotCQkJCQkJCQkJY2hpbGRGaWx0ZXIsIG9iamVjdCkpOwotCi0JCQkJfSBlbHNlIGlmICgocmVmZXJlbmNlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMpCi0JCQkJCQl8fCAocmVmZXJlbmNlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUykpIHsKLQkJCQkJLy8gRGlzY2lwbGluZSBhbmQgRGlzY2lwbGluZUdyb3VwaW5nLCBSb2xlU2V0IGFuZAotCQkJCQkvLyBSb2xlU2V0R3JvdXBpbmcKLQkJCQkJLy8gaGFuZGxpbmcKLQkJCQkJLy8gbmVjZXNzYXJ5IGluIG9yZGVyIHRvIG1haW50YWluIHVuaXF1ZW5lc3MgYWNyb3NzIHBsdWdpbi4KLQkJCQkJdmFsaWRhdG9yID0gbmV3IFVuaXF1ZW5lc3NWYWxpZGF0b3IocGFyZW50LmVDb250YWluZXIoKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLAotCQkJCQkJCWdldEZpbHRlcihjaGlsZEZpbHRlciwgb2JqZWN0KSwgb2JqZWN0LCBmZWF0dXJlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQKLQkJCQkJJiYgcGFyZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UKLQkJCQkJJiYgcmVmZXJlbmNlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpKSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBwYXJlbnQ7Ci0JCQkJaWYgKHBrZy5lUmVzb3VyY2UoKS5nZXRVUkkoKS5pc0ZpbGUoKSkgewotCQkJCQlyZXR1cm4gbmV3IFByb2Nlc3NDb21wb25lbnROYW1lVmFsaWRhdG9yKAotCQkJCQkJCShQcm9jZXNzUGFja2FnZSkgcGFyZW50LCAoUHJvY2Vzc0NvbXBvbmVudCkgb2JqZWN0KTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gbmV3IFVuaXF1ZW5lc3NWYWxpZGF0b3IoKEVPYmplY3QpIHBhcmVudCwgcmVmZXJlbmNlLAotCQkJCQkJCWdldEZpbHRlcihjaGlsZEZpbHRlciwgb2JqZWN0KSwgb2JqZWN0LCBmZWF0dXJlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQlNZXRob2RMaWJyYXJ5IGxpYiA9IChNZXRob2RMaWJyYXJ5KSBwYXJlbnQ7Ci0JCQkJaWYgKHJlZmVyZW5jZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUykgewotCQkJCQlpZiAobGliLmVSZXNvdXJjZSgpLmdldFVSSSgpLmlzRmlsZSgpKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IE1ldGhvZFBsdWdpbk5hbWVWYWxpZGF0b3IobGliLAotCQkJCQkJCQkoTWV0aG9kUGx1Z2luKSBvYmplY3QpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIG5ldyBVbmlxdWVuZXNzVmFsaWRhdG9yKAotCQkJCQkJCQlsaWIsCi0JCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TLAotCQkJCQkJCQlub25GaWx0ZXIsIG9iamVjdCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHJlZmVyZW5jZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TKSB7Ci0JCQkJCWlmIChsaWIuZVJlc291cmNlKCkuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCQkJCXJldHVybiBuZXcgTWV0aG9kQ29uZmlndXJhdGlvbk5hbWVWYWxpZGF0b3IobGliLAotCQkJCQkJCQkoTWV0aG9kQ29uZmlndXJhdGlvbikgb2JqZWN0KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiBuZXcgVW5pcXVlbmVzc1ZhbGlkYXRvcigKLQkJCQkJCQkJbGliLAotCQkJCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TLAotCQkJCQkJCQlub25GaWx0ZXIsIG9iamVjdCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXZhbGlkYXRvciA9IG5ldyBVbmlxdWVuZXNzVmFsaWRhdG9yKHBhcmVudCwgcmVmZXJlbmNlLAotCQkJCQkJZ2V0RmlsdGVyKGNoaWxkRmlsdGVyLCBvYmplY3QpLCBvYmplY3QsIGZlYXR1cmUpOwotCQkJfQotCi0JCQlyZXR1cm4gdmFsaWRhdG9yOwotCQl9IGVsc2UgaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSkgewotCQkJcmV0dXJuIGNyZWF0ZVByZXNlbnRhdGlvbk5hbWVWYWxpZGF0b3IocGFyZW50LAotCQkJCQkoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpOwotCQl9Ci0KLQkJcmV0dXJuIERvTm90aGluZ1ZhbGlkYXRvci5JTlNUQU5DRTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3ZTE4MjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciB2YWxpZGF0aW5nIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDZjM2QwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgdmFsaWRhdGluZyBtZXRob2QgbGlicmFyeSBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhjNGYyMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIj4KLQkJPGF0dHJpYnV0ZXM+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhdHRyaWJ1dGVzPgotCQk8L2F0dHJpYnV0ZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZDNiOGVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIENvbW1vbiBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjNjMThjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2U8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmZmYxODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi51bWE7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLmVjb3JlMmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLmVjb3JlMnhtbDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsCi0gb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UsCi0gb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbiwKLSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaCwKLSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLAotIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbCwKLSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLnV0aWwKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBsdWdpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNWNjYTdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIG1pZ3JhdGlvbi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvbWlncmF0aW9uL21pZ3JhdG9ycy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9taWdyYXRpb24vbWlncmF0b3JzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwNzllNmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9taWdyYXRpb24vbWlncmF0b3JzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWh0dHBcOi8vL2NvbS9pYm0vdW1hLmVjb3JlPW9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uaW50ZXJuYWwuTWlncmF0b3IKLW9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uaW50ZXJuYWwuTWlncmF0b3I9aHR0cFw6Ly93d3cuaWJtLmNvbS91bWEvMS4wLjIvdW1hLmVjb3JlCi1odHRwXDovL3d3dy5pYm0uY29tL3VtYS8xLjAuMi91bWEuZWNvcmU9b3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbC5NaWdyYXRvcjEwMgotb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbC5NaWdyYXRvcjEwMj1odHRwXDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zL3VtYS5lY29yZQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL21pZ3JhdGlvbi91bWExLjAuMl8xLjAuMy5lY29yZTJlY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvbWlncmF0aW9uL3VtYTEuMC4yXzEuMC4zLmVjb3JlMmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MDJlNzRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvbWlncmF0aW9uL3VtYTEuMC4yXzEuMC4zLmVjb3JlMmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlMmVjb3JlOkVjb3JlMkVjb3JlTWFwcGluZ1Jvb3QgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZTJlY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwNC9FY29yZTJFY29yZSIgdG9wVG9Cb3R0b209InRydWUiPgotICA8aW5wdXRzIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjIvdW1hLmVjb3JlIy8iLz4KLSAgPG91dHB1dHMgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMy91bWEuZWNvcmUjLyIvPgotPC9lY29yZTJlY29yZTpFY29yZTJFY29yZU1hcHBpbmdSb290PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVjZTJjZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgTGlicmFyeSBQZXJzaXN0ZW5jZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0YjA4NDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtaWdyYXRvcnMiIG5hbWU9Ik1pZ3JhdG9ycyIgc2NoZW1hPSJzY2hlbWEvbWlncmF0b3JzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InJlc291cmNlU2V0RmFjdG9yaWVzIiBuYW1lPSJMaWJyYXJ5IFJlc291cmNlIFNldCBGYWN0b3JpZXMiIHNjaGVtYT0ic2NoZW1hL3Jlc291cmNlU2V0RmFjdG9yaWVzLmV4c2QiLz4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgIDxwYWNrYWdlIAotICAgICAgIHVyaSA9ICJodHRwOi8vL2NvbS9pYm0vdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgCi0gICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlIiAvPgotICAgIDxwYWNrYWdlCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSIKLSAgICAgICAgICB1cmk9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiLz4KLSAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm1pZ3JhdG9ycyI+Ci0gICAgIDxtaWdyYXRvcgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbC5NaWdyYXRvciIKLSAgICAgICAgICAgbGliTnNVUkk9Imh0dHA6Ly8vY29tL2libS91bWEuZWNvcmUiLz4KLSAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5zZXJ2aWNlUHJvdmlkZXJzIj4KLSAgICAgPGFjY2Vzc0NvbnRyb2xsZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLmludGVybmFsLkFjY2Vzc0NvbnRyb2xsZXIiLz4KLSAgICAgPGxpYnJhcnlQZXJzaXN0ZXIKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5YTUlMaWJyYXJ5UGVyc2lzdGVyIgotICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgdHlwZT0ieG1pIi8+Ci0gICAgIDxmaWxlTWFuYWdlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkRlbGVnYXRlRmlsZU1hbmFnZXIiLz4KLSAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLnJlc291cmNlU2V0RmFjdG9yaWVzIj4KLSAgICAgPHJlc291cmNlU2V0RmFjdG9yeQotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLlhNSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkiCi0gICAgICAgICAgIHR5cGU9InhtaSIvPgotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NjaGVtYS9taWdyYXRvcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc2NoZW1hL21pZ3JhdG9ycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNjBhMGVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc2NoZW1hL21pZ3JhdG9ycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZSIgaWQ9Im1pZ3JhdG9ycyIgbmFtZT0iTWlncmF0b3JzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIE1pZ3JhdG9yIG1pZ3JhdGVzIG1ldGhvZCBsaWJyYXJ5IGZyb20gb25lIHZlcnNpb24gdG8gYW5vdGhlcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtaWdyYXRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJtaWdyYXRvciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIG1pZ3JhdG9yLiBUaGlzIGNsYXNzIG11c3QgYmUgYSBwdWJsaWMgaW1wbGVtZW50YXRpb24gb2YgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLklNaWdyYXRvciZsdDsvY29kZSZndDsgd2l0aCBhIHB1YmxpYyAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxpYk5zVVJJIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIHNwYWNlIFVSSSBvZiB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCB0aGlzIG1pZ3JhdG9yIGNhbiBtaWdyYXRlcwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm1pZ3JhdG9ycyZxdW90OyZndDsKLSAgICAgJmx0O21pZ3JhdG9yCi0gICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uaW50ZXJuYWwuTWlncmF0b3ImcXVvdDsKLSAgICAgICAgICAgbGliTnNVUkk9JnF1b3Q7aHR0cDovLy9jb20vaWJtL3VtYS5lY29yZSZxdW90Oy8mZ3Q7Ci0gICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLklNaWdyYXRvcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLmludGVybmFsLk1pZ3JhdG9yCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc2NoZW1hL3Jlc291cmNlU2V0RmFjdG9yaWVzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NjaGVtYS9yZXNvdXJjZVNldEZhY3Rvcmllcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Y2U1ODg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc2NoZW1hL3Jlc291cmNlU2V0RmFjdG9yaWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlIiBpZD0icmVzb3VyY2VTZXRGYWN0b3JpZXMiIG5hbWU9IkxpYnJhcnkgUmVzb3VyY2UgU2V0IEZhY3RvcmllcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFeHRlbnNpb24gcG9pbnQgdG8gY29udHJpYnV0ZSBmYWN0b3JpZXMgZm9yIGNyZWF0aW9uIG9mIGxpYnJhcnkgcmVzb3VyY2Ugc2V0LiBUaGUgZmFjdG9yaWVzIG11c3QgaW1wbGVtZW50IGludGVyZmFjZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSBhbmQgbXVzdCBoYXZlIGEgcHVibGljIG5vbi1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icmVzb3VyY2VTZXRGYWN0b3J5IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJlc291cmNlU2V0RmFjdG9yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0idHlwZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4xCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JTGlicmFyeVJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JTGlicmFyeVJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhM2M1NWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvSUxpYnJhcnlSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeVJlc291cmNlIGV4dGVuZHMgUmVzb3VyY2UgewotCWxvbmcgZ2V0TG9hZFN0YW1wKCk7Ci0JVVJJIGdldFByb3h5VVJJKEVPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lMaWJyYXJ5UmVzb3VyY2VTZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lMaWJyYXJ5UmVzb3VyY2VTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjE3ZWUxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JTGlicmFyeVJlc291cmNlU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSVVtYVJlc291cmNlU2V0OwotCi0vKioKLSAqIEEgcmVzb3VyY2Ugc2V0IHRoYXQgbWFuYWdlcyBhIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFJlc291cmNlfQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5UmVzb3VyY2VTZXQgZXh0ZW5kcyBJVW1hUmVzb3VyY2VTZXQgewotCS8qKgotCSAqIEdldHMgdGhlIHBlcnNpc3RlbmNlIHR5cGUgdGhpcyByZXNvdXJjZSBzZXQgc3VwcG9ydHMKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB0eXBlCi0JICogQHNlZSBTZXJ2aWNlcyNnZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlbmNlVHlwZSgpCi0JICogQHNlZSBTZXJ2aWNlcyNYTUlfUEVSU0lTVEVOQ0VfVFlQRQotCSAqLwotCVN0cmluZyBnZXRQZXJzaXN0ZW5jZVR5cGUoKTsKLQotCS8qKgotCSAqIExvYWRzIG1ldGhvZCBsaWJyYXJpZXMgaW50byB0aGlzIHJlc291cmNlIHNldCBmcm9tIHRoZSBnaXZlbiBVUkkuCi0JICogCi0JICogQHBhcmFtIHBhcmFtZXRlcnMKLQkgKiBAcmV0dXJuCi0JICovCi0Jdm9pZCBsb2FkTWV0aG9kTGlicmFyaWVzKFVSSSB1cmksIE1hcCBwYXJhbWV0ZXJzKQotCQkJdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEdldHMgdGhlIGxpc3Qgb2YgbWV0aG9kIGxpYnJhcmllcyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQgaW50byB0aGlzCi0JICogcmVzb3VyY2Ugc2V0LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlMaXN0IGdldE1ldGhvZExpYnJhcmllcygpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgZmlyc3QgbG9hZGVkIG1ldGhvZCBsaWJyYXJ5IG9mIHRoaXMgcmVzb3VyY2Ugc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGhvZCBsaWJyYXJ5IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGlzIG5vdCBsb2FkZWQKLQkgKiAgICAgICAgIHlldC4KLQkgKiBAc2VlICNsb2FkTGlicmFyeShVUkksIE1hcCkKLQkgKi8KLQlNZXRob2RMaWJyYXJ5IGdldEZpcnN0TWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBHVUlEIChHbG9iYWxseSBVbmlxdWUgSWRlbnRpZmllcikKLQkgKiAKLQkgKiBAcGFyYW0gZ3VpZAotCSAqIEByZXR1cm4KLQkgKi8KLQlFT2JqZWN0IGdldEVPYmplY3QoU3RyaW5nIGd1aWQpOwotCi0JTWFwIGdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCi0JLyoqCi0JICogTG9hZHMgdGhlIGdpdmVuIG9wcG9zaXRlIGZlYXR1cmVzIG9mIGFsbCBsb2FkZWQgb2JqZWN0cyBpbiB0aGlzIHJlc291cmNlCi0JICogc2V0LgotCSAqIAotCSAqIEBwYXJhbSBvcHBvc2l0ZUZlYXR1cmVzCi0JICovCi0Jdm9pZCBsb2FkT3Bwb3NpdGVGZWF0dXJlcyhMaXN0IG9wcG9zaXRlRmVhdHVyZXMpOwotCi0JLyoqCi0JICogTG9hZHMgdGhlIGdpdmVuIG9wcG9zaXRlIGZlYXR1cmVzIG9mIHRob3NlIG9iamVjdHMgaW4gdGhpcyByZXNvdXJjZSBzZXQKLQkgKiB3aG9zZSBHVUlEcyBhcmUgc3BlY2lmaWVkIGluIDxjb2RlPkdVSURzPC9jb2RlPiBzZXQuCi0JICogCi0JICogQHBhcmFtIG9wcG9zaXRlRmVhdHVyZXMKLQkgKiBAcGFyYW0gR1VJRHMKLQkgKi8KLQl2b2lkIGxvYWRPcHBvc2l0ZUZlYXR1cmVzKExpc3Qgb3Bwb3NpdGVGZWF0dXJlcywgU2V0IEdVSURzKTsKLQotCS8qKgotCSAqIFNhdmVzIHRoaXMgcmVzb3VyY2Ugc2V0IHdpdGggdGhlIGdpdmVuIHNhdmUgb3B0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqICAgICAgICAgICAgc2F2ZSBvcHRpb25zCi0JICogQHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24KLQkgKi8KLQl2b2lkIHNhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBVbmxvYWRzIHRoZSBnaXZlbiBvYmplY3QgaW4gdGhpcyByZXNvdXJjZSBzZXQKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBvYmplY3Qgd2FzIHVubG9hZGVkCi0JICogICAgICAgICBzdWNjZXNzZnVsbHkKLQkgKi8KLQlib29sZWFuIHVubG9hZChFT2JqZWN0IG9iamVjdCk7Ci0KLQkvKioKLQkgKiBVbmxvYWRzIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2Ugb2YgdGhpcyByZXNvdXJjZSBzZXQuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKi8KLQl2b2lkIHVubG9hZChSZXNvdXJjZSByZXNvdXJjZSwgTWFwIG9wdGlvbnMpOwotCi0JLyoqCi0JICogUmVsb2FkcyB0aGUgZ2l2ZW4gcmVzb3VyY2VzCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcwotCSAqIEByZXR1cm4gcmVzb3VyY2VzIHRoYXQgaGFkIGJlZW4gcmVsb2FkZWQKLQkgKi8KLQlDb2xsZWN0aW9uIHJlbG9hZFJlc291cmNlcyhDb2xsZWN0aW9uIHJlc291cmNlcyk7Ci0KLQkvKioKLQkgKiBSZWxvYWRzIHRoZSBnaXZlbiBwZXJzaXN0ZWQgb2JqZWN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0cwotCSAqIEByZXR1cm4gb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiByZWxvYWRlZAotCSAqLwotCUNvbGxlY3Rpb24gcmVsb2FkT2JqZWN0cyhDb2xsZWN0aW9uIG9iamVjdHMpOwotCi0JLyoqCi0JICogVW5sb2FkcyB0aGlzIHJlc291cmNlIHNldC4gVGhpcyB3aWxsIHVubG9hZCBldmVyeSByZXNvdXJjZSBpbiB0aGlzCi0JICogcmVzb3VyY2Ugc2V0IGFuZCByZXNldCB0aGUgcmVzb3VyY2Ugc2V0IHRvIHRoZSBzdGF0ZSBiZWZvcmUgbG9hZGluZyB0aGUKLQkgKiBsaWJyYXJ5LgotCSAqIAotCSAqLwotCXZvaWQgdW5sb2FkKCk7Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlcmUgaXMgYW55IHVucmVzb2x2ZWQgcHJveHkgZGV0ZWN0ZWQgaW4gdGhlIGxpYnJhcnkKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBoYXNVbnJlc29sdmVkUHJveHkoKTsKLQotCS8qKgotCSAqIFN1YnNjcmliZXMgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciB0byBsaXN0ZW4gdG8gcmVmcmVzaCBldmVudHMgYnJvYWRjYXN0ZWQKLQkgKiB3aGVuZXZlciByZXNvdXJjZXMgb3Igb2JqZWN0cyBvZiB0aGlzIHJlc291cmNlIHNldCBpcyByZWZyZXNoZWQvcmVsb2FkZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogQHNlZSAjcmVsb2FkUmVzb3VyY2VzKENvbGxlY3Rpb24pCi0JICovCi0Jdm9pZCBhZGRSZWZyZXNoTGlzdGVuZXIoSVJlZnJlc2hMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JLyoqCi0JICogVW5zdWJzY3JpYmVzIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgZnJvbSBsaXN0ZW5pbmcgdG8gcmVmcmVzaCBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0Jdm9pZCByZW1vdmVSZWZyZXNoTGlzdGVudGVyKElSZWZyZXNoTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JSUxpYnJhcnlQZXJzaXN0ZXIgZ2V0UGVyc2lzdGVyKCk7Ci0KLQl2b2lkIGNoZWNrTW9kaWZ5KFJlc291cmNlW10gcmVzb3VyY2VzLCBPYmplY3QgY29udGV4dCkKLQkJCXRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb247Ci0KLQlJU3RhdHVzIGNoZWNrTW9kaWZ5KENvbGxlY3Rpb24gZU9iamVjdHMsIE9iamVjdCBjb250ZXh0KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMjk3M2I1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTsKLQotLyoqCi0gKiBGYWN0b3J5IHRvIGNyZWF0ZSB7QGxpbmsgSUxpYnJhcnlSZXNvdXJjZVNldH0gaW5zdGFuY2Ugb2YgdGhlIHBhcnRpY3VsYXIKLSAqIHBlcnNpc3RlbmNlIHR5cGUKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMjYsIDIwMDYKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwZXJzaXN0ZW5jZSB0eXBlIG9mIHRoZSByZXNvdXJjZSBzZXQgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB0eXBlCi0JICovCi0JU3RyaW5nIGdldFBlcnNpc3RlbmNlVHlwZSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsaWJyYXJ5IHJlc291cmNlIHNldAotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgbGlicmFyeSByZXNvdXJjZSBzZXQKLQkgKi8KLQlJTGlicmFyeVJlc291cmNlU2V0IGNyZWF0ZUxpYnJhcnlSZXNvdXJjZVNldCgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvSVJlZnJlc2hJbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JUmVmcmVzaEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmVhN2IwY2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvSVJlZnJlc2hJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDMsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZnJlc2hJbmZvIHsKLQkvKioKLQkgKiBHZXRzIGV4aXN0aW5nIHJlc291cmNlcyB0aGF0IHJlYXBwZWFycyBpbiB3b3Jrc3BhY2UKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZGRlZFJlc291cmNlcwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFkZGVkUmVzb3VyY2VzKCk7Ci0JCi0JLyoqCi0JICogR2V0cyBuZXdseSBhZGRlZCB3b3Jrc3BhY2UgcmVzb3VyY2VzCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFkZGVkV29ya3NwYWNlUmVzb3VyY2VzKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjaGFuZ2VkUmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoYW5nZWRSZXNvdXJjZXMoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSByZW1vdmVkUmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlbW92ZWRSZXNvdXJjZXMoKTsKLQkKLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIG1hbmFnZXIgdGhhdCB0aGUgZ2l2ZW4gcmVzb3VyY2UganVzdCBoYXMgYmVlbiBzYXZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvdXJjZVNhdmVkKFJlc291cmNlIHJlc291cmNlKTsJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9MaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0xpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNDBiMDEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0xpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2U7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDgyNzI1ODczNDQ2Nzg2NzY4MjhMOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqLwotCXB1YmxpYyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIobWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcGFyYW0gY2F1c2UKLQkgKi8KLQlwdWJsaWMgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLQkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjYXVzZQotCSAqLwotCXB1YmxpYyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0JCXN1cGVyKGNhdXNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlU2VydmljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxNjkxYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCA3LCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVNlcnZpY2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBlcnNpc3RlbmNlU2VydmljZSBJTlNUQU5DRSA9IG5ldyBQZXJzaXN0ZW5jZVNlcnZpY2UoKTsKLQotCXByaXZhdGUgc3RhdGljIEhhc2hNYXAgdHlwZVRvRmFjdG9yeURlZk1hcDsKLQotCXByaXZhdGUgUGVyc2lzdGVuY2VTZXJ2aWNlKCkgewotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBSZXNvdXJjZVNldCBmb3IgdGhlIGdpdmVuIHBlcnNpc3RlbmNlIHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlSZXNvdXJjZVNldCBjcmVhdGVSZXNvdXJjZVNldChTdHJpbmcgdHlwZSkgewotCQlJTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSh0eXBlKTsKLQkJaWYoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVMaWJyYXJ5UmVzb3VyY2VTZXQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gdHlwZTogIiArIHR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBGYWN0b3J5RGVmIHsKLQkJQnVuZGxlIGJ1bmRsZTsKLQotCQlTdHJpbmcgdHlwZTsKLQotCQlTdHJpbmcgY2xhc3NOYW1lOwotCQkKLQkJSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkgaW5zdGFuY2U7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBidW5kbGUKLQkJICogQHBhcmFtIHR5cGUKLQkJICogQHBhcmFtIGNsYXNzTmFtZQotCQkgKiBAcGFyYW0gaW5zdGFuY2UKLQkJICovCi0JCXByaXZhdGUgRmFjdG9yeURlZihCdW5kbGUgYnVuZGxlLCBTdHJpbmcgdHlwZSwgU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQl9Ci0JCQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkgZ2V0RmFjdG9yeShTdHJpbmcgcGVyc2lzdGVuY2VUeXBlKSB7Ci0JCWlmICh0eXBlVG9GYWN0b3J5RGVmTWFwID09IG51bGwpIHsKLQkJCXR5cGVUb0ZhY3RvcnlEZWZNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJLy8gUHJvY2VzcyB0aGUgIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm1pZ3JhdG9ycyIKLQkJCS8vIGV4dGVuc2lvbiBwb2ludAotCQkJLy8gY29udHJpYnV0b3JzLgotCQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0KLQkJCQkJLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeQotCQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJCQkJIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlIiwgInJlc291cmNlU2V0RmFjdG9yaWVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCQl0cnkgewotCQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIHR5cGUgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJ0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwKLQkJCQkJCQkJCSYmIGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCQkmJiB0eXBlICE9IG51bGwKLQkJCQkJCQkJCSYmIHR5cGUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQl0eXBlVG9GYWN0b3J5RGVmTWFwLnB1dCh0eXBlLCBuZXcgRmFjdG9yeURlZihidW5kbGUsCi0JCQkJCQkJCQkJdHlwZSwgY2xhc3NOYW1lKSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUZhY3RvcnlEZWYgZmFjdG9yeSA9IChGYWN0b3J5RGVmKSB0eXBlVG9GYWN0b3J5RGVmTWFwLmdldChwZXJzaXN0ZW5jZVR5cGUpOwotCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlpZiAoZmFjdG9yeS5pbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkgcmVzb3VyY2VTZXRGYWN0b3J5ID0gKElMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5KSBmYWN0b3J5LmJ1bmRsZS5sb2FkQ2xhc3MoCi0JCQkJCQkJZmFjdG9yeS5jbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQkJCWlmKHBlcnNpc3RlbmNlVHlwZS5lcXVhbHMocmVzb3VyY2VTZXRGYWN0b3J5LmdldFBlcnNpc3RlbmNlVHlwZSgpKSkgewotCQkJCQkJZmFjdG9yeS5pbnN0YW5jZSA9IHJlc291cmNlU2V0RmFjdG9yeTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihmYWN0b3J5LmNsYXNzTmFtZSArCi0JCQkJCQkJCSIgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSB3cm9uZyBwZXJzaXN0ZW5jZSB0eXBlICciICsgcGVyc2lzdGVuY2VUeXBlICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkiJy4gVGhlIGNvcnJlY3QgdHlwZSBtdXN0IGJlICciICsgcmVzb3VyY2VTZXRGYWN0b3J5LmdldFBlcnNpc3RlbmNlVHlwZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCWlmKERFQlVHKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhY3RvcnkuaW5zdGFuY2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9pbnRlcm5hbC9BY2Nlc3NDb250cm9sbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9pbnRlcm5hbC9BY2Nlc3NDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUzOTA0NmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvaW50ZXJuYWwvQWNjZXNzQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUFjY2Vzc0NvbnRyb2xsZXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgOSwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjY2Vzc0NvbnRyb2xsZXIgaW1wbGVtZW50cyBJQWNjZXNzQ29udHJvbGxlciB7Ci0KLQlwdWJsaWMgQWNjZXNzQ29udHJvbGxlcigpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUFjY2Vzc0NvbnRyb2xsZXIjY2hlY2tNb2RpZnkoamF2YS51dGlsLkNvbGxlY3Rpb24sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdGF0dXMgY2hlY2tNb2RpZnkoQ29sbGVjdGlvbiBlT2JqZWN0cywgT2JqZWN0IGNvbnRleHQpIHsKLQkJaWYoZU9iamVjdHMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVPYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBvLmVSZXNvdXJjZSgpOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCXJlc291cmNlU2V0ID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQlpZihyZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZihyZXNvdXJjZVNldCBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2VTZXQpIHsKLQkJCXJldHVybiAoKElMaWJyYXJ5UmVzb3VyY2VTZXQpcmVzb3VyY2VTZXQpLmNoZWNrTW9kaWZ5KGVPYmplY3RzLCBjb250ZXh0KTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUFjY2Vzc0NvbnRyb2xsZXIjY2hlY2tNb2RpZnkob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlW10sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdGF0dXMgY2hlY2tNb2RpZnkoUmVzb3VyY2VbXSByZXNvdXJjZXMsIE9iamVjdCBjb250ZXh0KSB7Ci0JCWlmKHJlc291cmNlcy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJQXJyYXlMaXN0PFN0cmluZz4gcGF0aHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOwotCQkJaWYocmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCQlwYXRocy5hZGQocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCWlmKCFwYXRocy5pc0VtcHR5KCkpIHsKLQkJCVN0cmluZ1tdIGFyciA9IG5ldyBTdHJpbmdbcGF0aHMuc2l6ZSgpXTsKLQkJCXBhdGhzLnRvQXJyYXkoYXJyKTsKLQkJCXJldHVybiBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNoZWNrTW9kaWZ5KGFyciwgY29udGV4dCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL2ludGVybmFsL0lGYWlsU2FmZVNhdmFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL2ludGVybmFsL0lGYWlsU2FmZVNhdmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTk3MWNhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9pbnRlcm5hbC9JRmFpbFNhZmVTYXZhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5pbnRlcm5hbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgYSByZXNvdXJjZSBtdXN0IGltcGxlbWVudCB0byBzdXBwb3J0IGZhaWwtc2FmZSBwZXJzaXN0ZW5jZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJRmFpbFNhZmVTYXZhYmxlIHsKLQl2b2lkIGNvbW1pdCgpOwotCQotCWJvb2xlYW4gcmVzdG9yZSgpOwotCQotCXZvaWQgc2V0VHhJRChTdHJpbmcgdHhJRCk7Ci0JCi0JYm9vbGVhbiBoYXNUZW1wVVJJKCk7Ci0JCi0Jdm9pZCB0eEZpbmlzaGVkKGJvb2xlYW4gc3VjY2Vzc2Z1bCk7Ci0JCi0Jdm9pZCBkZWxldGVCYWNrdXAoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL3V0aWwvRXh0ZW5kZWRSZXNvdXJjZVNldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvdXRpbC9FeHRlbmRlZFJlc291cmNlU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQzMTk0YjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvdXRpbC9FeHRlbmRlZFJlc291cmNlU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuVW5ub3JtYWxpemVkVVJJRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgZXh0ZW5kZWQgcmVzb3VyY2Ugc2V0IHdob3NlIG9iamVjdHMgY2FuIHJlZmVyZW5jZXMgb2JqZWN0cyBvZiBvdGhlciByZXNvdXJjZSBzZXQKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgOSwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuZGVkUmVzb3VyY2VTZXQgZXh0ZW5kcyBSZXNvdXJjZVNldEltcGwgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVSSV9UWVBFX1VOS05PV04gPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVSSV9UWVBFX0xPQ0FMID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUklfVFlQRV9FWFRFUk5BTCA9IDI7Ci0JCi0JcHJvdGVjdGVkIExpc3Q8UmVzb3VyY2VTZXQ+IHJlZmVyZW5jZWRSZXNvdXJjZVNldHMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlU2V0PigpOwotCi0JCi0JLyoqCi0JICogR2V0cyB0aGUgdHlwZSBvZiB0aGUgZ2l2ZW4gVVJJLgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuIG9uZSBvZiBVUkkgdHlwZSBjb25zdGFudHM6IHtAbGluayAjVVJJX1RZUEVfRVhURVJOQUx9LCB7QGxpbmsgI1VSSV9UWVBFX0xPQ0FMfSwge0BsaW5rICNVUklfVFlQRV9VTktOT1dOfQotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0VVJJVHlwZShVUkkgdXJpKSB7Ci0JCXJldHVybiBVUklfVFlQRV9VTktOT1dOOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBhZGQoUmVzb3VyY2VTZXQgcmVmZXJlbmNlZFJlc291cmNlU2V0KSB7Ci0JCWlmKCFyZWZlcmVuY2VkUmVzb3VyY2VTZXRzLmNvbnRhaW5zKHJlZmVyZW5jZWRSZXNvdXJjZVNldCkpIHsKLQkJCXJldHVybiByZWZlcmVuY2VkUmVzb3VyY2VTZXRzLmFkZChyZWZlcmVuY2VkUmVzb3VyY2VTZXQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdChVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlFT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0JCVVubm9ybWFsaXplZFVSSUV4Y2VwdGlvbiBleCA9IG51bGw7Ci0JCWludCB1cmlUeXBlID0gZ2V0VVJJVHlwZSh1cmkpOwotCQlpZih1cmlUeXBlID09IFVSSV9UWVBFX1VOS05PV04gfHwgdXJpVHlwZSA9PSBVUklfVFlQRV9MT0NBTCkgewotCQkJdHJ5IHsKLQkJCQlvYmplY3QgPSBzdXBlci5nZXRFT2JqZWN0KHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkJCX0gY2F0Y2ggKFVubm9ybWFsaXplZFVSSUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZXggPSBlOwotCQkJfQotCQkJaWYob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gb2JqZWN0OwotCQkJfQotCQl9Ci0JCWlmKHVyaVR5cGUgPT0gVVJJX1RZUEVfVU5LTk9XTiB8fCB1cmlUeXBlID09IFVSSV9UWVBFX0VYVEVSTkFMKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VkUmVzb3VyY2VTZXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gKFJlc291cmNlU2V0KSBpdGVyLm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQlvYmplY3QgPSByZXNvdXJjZVNldC5nZXRFT2JqZWN0KHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkJCQkJaWYob2JqZWN0ICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBvYmplY3Q7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24gZSkgewotCQkJCQlleCA9IGU7Ci0JCQkJfQotCQkJfQotCQl9IAotCQkKLQkJaWYoZXggIT0gbnVsbCkgewotCQkJdGhyb3cgZXg7Ci0JCX0KLQkJcmV0dXJuIG9iamVjdDsKLQl9CQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJdHJ5ewotCQkJCXJlc291cmNlLnVubG9hZCgpOwkJCQotCQkJfQotCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCXJlZmVyZW5jZWRSZXNvdXJjZVNldHMuY2xlYXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRGVsZWdhdGVGaWxlTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0RlbGVnYXRlRmlsZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTdhYmJkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRGVsZWdhdGVGaWxlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAxMCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGVnYXRlRmlsZU1hbmFnZXIgaW1wbGVtZW50cyBJRmlsZU1hbmFnZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlTWFuYWdlciNjaGVja01vZGlmeShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KFN0cmluZyBwYXRoLCBPYmplY3QgY29udGV4dCkgewotCQlyZXR1cm4gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jaGVja01vZGlmeShwYXRoLCBjb250ZXh0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVNYW5hZ2VyI2NoZWNrTW9kaWZ5KGphdmEubGFuZy5TdHJpbmdbXSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjaGVja01vZGlmeShTdHJpbmdbXSBwYXRocywgT2JqZWN0IGNvbnRleHQpIHsKLQkJcmV0dXJuIEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuY2hlY2tNb2RpZnkocGF0aHMsIGNvbnRleHQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZU1hbmFnZXIjZGVsZXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGVsZXRlKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmRlbGV0ZShwYXRoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVNYW5hZ2VyI21vdmUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtb3ZlKFN0cmluZyBvbGRQYXRoLCBTdHJpbmcgbmV3UGF0aCkgewotCQlyZXR1cm4gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5tb3ZlKG9sZFBhdGgsIG5ld1BhdGgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZU1hbmFnZXIjcmVuYW1lKGphdmEuaW8uRmlsZSwgamF2YS5pby5GaWxlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbmFtZShGaWxlIG9sZEZpbGUsIEZpbGUgbmV3RmlsZSkgewotCQlyZXR1cm4gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW5hbWUob2xkRmlsZSwgbmV3RmlsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRXh0ZW5kZWRSZXNvdXJjZVNldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0V4dGVuZGVkUmVzb3VyY2VTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTk3NjFjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRXh0ZW5kZWRSZXNvdXJjZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiBBIGV4dGVuZGVkIHJlc291cmNlIHNldCB3aG9zZSBvYmplY3RzIGNhbiByZWZlcmVuY2VzIG9iamVjdHMgb2Ygb3RoZXIgcmVzb3VyY2Ugc2V0Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDksIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZFJlc291cmNlU2V0IGV4dGVuZHMgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUklfVFlQRV9VTktOT1dOID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUklfVFlQRV9MT0NBTCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVJJX1RZUEVfRVhURVJOQUwgPSAyOwotCQotCXByb3RlY3RlZCBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVmZXJlbmNlZFJlc291cmNlU2V0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiB7QGxpbmsgRXh0ZW5kZWRSZXNvdXJjZVNldH0gdGhhdCBjYW4gaGF2ZSByZWZlcmVuY2UgdG8gb2JqZWN0cyBpbiB0aGUgZ2l2ZW4gcmVzb3VyY2Ugc2V0IAotCSAqLwotCXB1YmxpYyBFeHRlbmRlZFJlc291cmNlU2V0KE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZWZlcmVuY2VkUmVzb3VyY2VTZXQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZWZlcmVuY2VkUmVzb3VyY2VTZXQgPSByZWZlcmVuY2VkUmVzb3VyY2VTZXQ7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiBvbmUgb2YgVVJJIHR5cGUgY29uc3RhbnRzOiB7QGxpbmsgI1VSSV9UWVBFX0VYVEVSTkFMfSwge0BsaW5rICNVUklfVFlQRV9MT0NBTH0sIHtAbGluayAjVVJJX1RZUEVfVU5LTk9XTn0KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFVSSVR5cGUoVVJJIHVyaSkgewotCQlyZXR1cm4gVVJJX1RZUEVfVU5LTk9XTjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbCNnZXRFT2JqZWN0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoRU9iamVjdCByZXNvbHZlciwgVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJRU9iamVjdCBvYmplY3QgPSBudWxsOwotCQlVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24gZXggPSBudWxsOwotCQlpbnQgdXJpVHlwZSA9IGdldFVSSVR5cGUodXJpKTsKLQkJaWYodXJpVHlwZSA9PSBVUklfVFlQRV9VTktOT1dOIHx8IHVyaVR5cGUgPT0gVVJJX1RZUEVfTE9DQUwpIHsKLQkJCXRyeSB7Ci0JCQkJb2JqZWN0ID0gc3VwZXIuZ2V0RU9iamVjdChyZXNvbHZlciwgdXJpLCBsb2FkT25EZW1hbmQpOwotCQkJfSBjYXRjaCAoVW5ub3JtYWxpemVkVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQlleCA9IGU7Ci0JCQl9Ci0JCQlpZihvYmplY3QgIT0gbnVsbCkgewotCQkJCXJldHVybiBvYmplY3Q7Ci0JCQl9Ci0JCX0KLQkJaWYodXJpVHlwZSA9PSBVUklfVFlQRV9VTktOT1dOIHx8IHVyaVR5cGUgPT0gVVJJX1RZUEVfRVhURVJOQUwpIHsKLQkJCXRyeSB7Ci0JCQkJb2JqZWN0ID0gcmVmZXJlbmNlZFJlc291cmNlU2V0LmdldEVPYmplY3QocmVzb2x2ZXIsIHVyaSwKLQkJCQkJCWxvYWRPbkRlbWFuZCk7Ci0JCQl9IGNhdGNoIChVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24gZSkgewotCQkJCWV4ID0gZTsKLQkJCX0KLQkJfSAKLQkJCi0JCWlmKGV4ICE9IG51bGwpIHsKLQkJCXRocm93IGV4OwotCQl9Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9GYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJlN2NmODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIgewotCXByaXZhdGUgVVJJIGZpbmFsVVJJOwotCXByaXZhdGUgVVJJIG9sZFVSSTsKLQlwcml2YXRlIFN0cmluZyBjdXJyZW50VHhJRDsKLQlwcml2YXRlIFJlc291cmNlIHJlc291cmNlOwotCXByaXZhdGUgVVJJIHRlbXBVUkk7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgYmFja3VwRmlsZTsKLQlwcml2YXRlIFVSSUNvbnZlcnRlciBjb252ZXJ0ZXI7Ci0JCi0JcHVibGljIEZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIoUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBpZCkgewotCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7IAotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMuY29udmVydGVyID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSAhPSBudWxsID8gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGVtcG9yYXJ5IFVSSSB0byBzYXZlIHRoaXMgcmVzb3VyY2UgdG8gYW5kIGl0IHdpbGwgYmUgcmVuYW1lZCB0bwotCSAqIHRoZSBvcmlnaW5hbCBVUkkgd2hlbiBzYXZpbmcgaXMgZG9uZQotCSAqLwotCXB1YmxpYyBVUkkgc2V0VGVtcFVSSShTdHJpbmcgdHhJRCkgewotCQlpZiAoZmluYWxVUkkgPT0gbnVsbCkgewotCQkJZmluYWxVUkkgPSBvbGRVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCWN1cnJlbnRUeElEID0gdHhJRDsKLQotCQkJdGVtcFVSSSA9IGNyZWF0ZVRlbXBVUkkoKTsKLQkJCXJlc291cmNlLnNldFVSSSh0ZW1wVVJJKTsKLQkJfQotCQlyZXR1cm4gdGVtcFVSSTsKLQl9Ci0JCi0JcHJpdmF0ZSBVUkkgY3JlYXRlVGVtcFVSSSgpIHsKLQkJcmV0dXJuIFVSSS5jcmVhdGVGaWxlVVJJKG5ldyBTdHJpbmdCdWZmZXIoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsLmdldFRlbXBEaXIoKSkuYXBwZW5kKAotCQkJCUZpbGUuc2VwYXJhdG9yKS5hcHBlbmQoY3VycmVudFR4SUQpCi0JCQkJLmFwcGVuZCgibmV3IikuYXBwZW5kKGlkKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEJhY2t1cEZpbGVQYXRoKCkgewotCQlTdHJpbmcgYmFja3VwRmlsZSA9IG5ldyBTdHJpbmdCdWZmZXIoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsLmdldFRlbXBEaXIoKSkKLQkJCQkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKQotCQkJCS5hcHBlbmQoY3VycmVudFR4SUQpCi0JCQkJLmFwcGVuZCgib2xkIikuYXBwZW5kKGlkKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBiYWNrdXBGaWxlOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyB0b0ZpbGVTdHJpbmcoVVJJIHVyaSkgewotCQlyZXR1cm4gRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKHVyaSwgY29udmVydGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY29tbWl0KCkgewotCQlpZiAoZmluYWxVUkkgIT0gbnVsbCAmJiAhcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCUZpbGUgZmluYWxGaWxlID0gbmV3IEZpbGUodG9GaWxlU3RyaW5nKGZpbmFsVVJJKSk7Ci0JCQlib29sZWFuIHdhc01vdmUgPSAhb2xkVVJJLmVxdWFscyhmaW5hbFVSSSk7Ci0JCQlpZiAod2FzTW92ZSkgewotCQkJfSBlbHNlIHsKLQkJCQkvLyBiYWNrIHVwIHRoZSBmaWxlCi0JCQkJLy8KLQkJCQlTdHJpbmcgYmFja3VwID0gZ2V0QmFja3VwRmlsZVBhdGgoKTsKLQkJCQlGaWxlIGJha0ZpbGUgPSBuZXcgRmlsZShiYWNrdXApOwotCi0JCQkJLy8gdHJ5aW5nIHRvIGRlbGV0ZSB0aGUgb2xkIGJhY2t1cCBmaWxlIGlmIGl0IGV4aXN0cwotCQkJCS8vCi0JCQkJaWYgKGJha0ZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJYmFrRmlsZS5kZWxldGUoKTsKLQkJCQl9Ci0KLQkJCQlpZiAoZmluYWxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCS8vIHNvbWUgQ00gcHJvdmlkZXIgbGlrZSBDbGVhckNhc2UgcmVuYW1lZCB0aGUgdmVyc2lvbmVkCi0JCQkJCS8vIGZpbGUgaXQgaXRzIHJlcG9zaXRvcnkgYXMgc29vbiBhcyB1c2VyIHJlbmFtZWQgdGhlIGZpbGUKLQkJCQkJLy8gaW4gdGhlIHdvcmtzcGFjZS4gVG8gYXZvaWQgdGhpcywgdXNlIG9ubHkgcmVndWxhciByZW5hbWUKLQkJCQkJLy8gcm91dGluZSBvZiBqYXZhLmlvLkZpbGUgaW5zdGVhZCBvZiBJUmVzb3VyY2Ugcm91dGluZQotCQkJCQkvLwotCQkJCQlpZiAoRmlsZVV0aWwubW92ZUZpbGUoZmluYWxGaWxlLCBiYWtGaWxlKSkgewotCQkJCQkJYmFja3VwRmlsZSA9IGJhY2t1cDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZCgKLQkJCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMucmVuYW1lRXJyb3JfbXNnLAotCQkJCQkJCQlmaW5hbEZpbGUsIGJhY2t1cCk7Ci0JCQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24obXNnKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gcmVuYW1lIHRoZSByZXNvdXJjZSBmaWxlIHRvIHRoZSBvcmlnaW5hbCBuYW1lCi0JCQkvLwotCQkJRmlsZSBjdXJyZW50RmlsZSA9IG5ldyBGaWxlKHdhc01vdmUgPyB0b0ZpbGVTdHJpbmcob2xkVVJJKQotCQkJCQk6IHRvRmlsZVN0cmluZyhyZXNvdXJjZS5nZXRVUkkoKSkpOwotCQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCQlpZiAod2FzTW92ZSkgewotCQkJCXN1Y2Nlc3MgPSBNdWx0aUZpbGVTYXZlVXRpbC5tb3ZlKHJlc291cmNlLCBjdXJyZW50RmlsZSwgZmluYWxGaWxlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gc29tZSBDTSBwcm92aWRlciBsaWtlIENsZWFyQ2FzZSByZW5hbWVkIHRoZSB2ZXJzaW9uZWQgZmlsZSBpdAotCQkJCS8vIGl0cyByZXBvc2l0b3J5IGFzIHNvb24gYXMgdXNlciByZW5hbWVkIHRoZSBmaWxlCi0JCQkJLy8gaW4gdGhlIHdvcmtzcGFjZS4gVG8gYXZvaWQgdGhpcywgdXNlIG9ubHkgcmVndWxhciByZW5hbWUKLQkJCQkvLyByb3V0aW5lIG9mIGphdmEuaW8uRmlsZSBpbnN0ZWFkIG9mIElSZXNvdXJjZSByb3V0aW5lCi0JCQkJLy8KLQkJCQlzdWNjZXNzID0gRmlsZVV0aWwubW92ZUZpbGUoY3VycmVudEZpbGUsIGZpbmFsRmlsZSk7Ci0JCQl9Ci0JCQlpZiAoIXN1Y2Nlc3MpIHsKLQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMucmVuYW1lRXJyb3JfbXNnLAotCQkJCQkJY3VycmVudEZpbGUsIGZpbmFsRmlsZSk7Ci0JCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKG1zZyk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh3YXNNb3ZlKSB7Ci0JCQkJCWRpZE1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzcyB0byBvdmVycmlkZSB0byBoYW5kbGUgcG9zdCBtb3ZlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlkTW92ZSgpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGVCYWNrdXAoKSB7Ci0JCWlmIChiYWNrdXBGaWxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJLy8gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5kZWxldGUoYmFja3VwRmlsZSk7Ci0JCQkJbmV3IEZpbGUoYmFja3VwRmlsZSkuZGVsZXRlKCk7Ci0JCQkJYmFja3VwRmlsZSA9IG51bGw7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc1RlbXBVUkkoKSB7Ci0JCWlmIChjdXJyZW50VHhJRCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY3JlYXRlVGVtcFVSSSgpLmVxdWFscyhyZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBVUkkgZ2V0RmluYWxVUkkoKSB7Ci0JCWlmIChmaW5hbFVSSSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmluYWxVUkk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlLmdldFVSSSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlc3RvcmUoKSB7Ci0JCUZpbGUgc3JjID0gbnVsbCwgZGVzdCA9IG51bGw7Ci0JCWJvb2xlYW4gbW92ZWQgPSBmYWxzZTsKLQkJaWYgKGJhY2t1cEZpbGUgIT0gbnVsbCkgewotCQkJc3JjID0gbmV3IEZpbGUoYmFja3VwRmlsZSk7Ci0JCQlkZXN0ID0gbmV3IEZpbGUodG9GaWxlU3RyaW5nKGdldEZpbmFsVVJJKCkpKTsKLQkJfSBlbHNlIHsKLQkJCW1vdmVkID0gb2xkVVJJICE9IG51bGwgJiYgIW9sZFVSSS5lcXVhbHMoZmluYWxVUkkpOwotCQkJaWYgKG1vdmVkKSB7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodG9GaWxlU3RyaW5nKGdldEZpbmFsVVJJKCkpKTsKLQkJCQlkZXN0ID0gbmV3IEZpbGUodG9GaWxlU3RyaW5nKG9sZFVSSSkpOwotCQkJCW1vdmVkID0gZmlsZS5leGlzdHMoKSAmJiAhZGVzdC5leGlzdHMoKTsKLQkJCQlpZiAobW92ZWQpIHsKLQkJCQkJc3JjID0gZmlsZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHNyYyAhPSBudWxsKSB7Ci0JCQlpZiAoZGVzdC5leGlzdHMoKSkgewotCQkJCUZpbGVVdGlsLm1vdmVGaWxlKGRlc3QsbmV3IEZpbGUodG9GaWxlU3RyaW5nKHJlc291cmNlLmdldFVSSSgpKSkpOwotCQkJfQotCQkJYm9vbGVhbiBzdWNjZXNzOwotCQkJaWYgKG1vdmVkKSB7Ci0JCQkJc3VjY2VzcyA9IE11bHRpRmlsZVNhdmVVdGlsLm1vdmUocmVzb3VyY2UsIHNyYywgZGVzdCk7Ci0JCQkJLy8gaWYoc3VjY2VzcykgewotCQkJCS8vIE11bHRpRmlsZVNhdmVVdGlsLnVwZGF0ZVVSSU1hcHBpbmdzKHRoaXMsIG51bGwpOwotCQkJCS8vIH0KLQkJCX0gZWxzZSB7Ci0JCQkJc3VjY2VzcyA9IEZpbGVVdGlsLm1vdmVGaWxlKHNyYyxkZXN0KTsKLQkJCX0KLQkJCWlmICghc3VjY2VzcykgewotCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihOTFMuYmluZCgKLQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlc3RvcmVSZXNvdXJjZUVycm9yX21zZywgdGhpcykpOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHR4RmluaXNoZWQoYm9vbGVhbiBzdWNjZXNzZnVsKSB7Ci0vLwkJYm9vbGVhbiB3YXNNb3ZlID0gIW9sZFVSSS5lcXVhbHMoZmluYWxVUkkpOwotCQlpZiAoc3VjY2Vzc2Z1bCkgewotCQkJcmVzb3VyY2Uuc2V0VVJJKGZpbmFsVVJJKTsKLQkJCXJlc291cmNlLnNldE1vZGlmaWVkKGZhbHNlKTsKLS8vCQkJdXBkYXRlVGltZVN0YW1wcygpOwotLy8JCQlGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlZnJlc2godGhpcyk7Ci0vLwkJCWlmKCF3YXNNb3ZlKSB7Ci0vLwkJCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRSZXNvdXJjZVNldCgpOwotLy8JCQkJaWYocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotLy8JCQkJCXJlc291cmNlU2V0LmdldFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIoKS52YWxpZGF0ZU1hcmtlcnModGhpcyk7Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlc3RvcmVVUkkoKTsKLS8vCQkJaWYgKHdhc01vdmUpIHsKLS8vCQkJCS8vIHJlc3RvcmUgdXJpIG9mIFJlc291cmNlRGVzY3JpcHRvciBvZiB0aGlzIHJlc291cmNlCi0vLwkJCQkvLwotLy8JCQkJTXVsdGlGaWxlU2F2ZVV0aWwudXBkYXRlVVJJTWFwcGluZ3ModGhpcywgb2xkVVJJLCBudWxsLCB0cnVlKTsKLS8vCQkJfQotCQl9Ci0vLwkJaWYgKG9sZFVSSSAhPSBudWxsKSB7Ci0vLwkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGdldFJlc291cmNlU2V0KCk7Ci0vLwkJCWlmIChyZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0vLwkJCQlyZXNvdXJjZVNldC5nZXRVUklUb1RlbXBVUklNYXAoKS5yZW1vdmUob2xkVVJJKTsKLS8vCQkJfQotLy8JCQlvbGRVUkkgPSBudWxsOwotLy8JCX0KLQkJY3VycmVudFR4SUQgPSBudWxsOwotCQlmaW5hbFVSSSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmVzdG9yZXMgdGhlIHJlc291cmNlIFVSSSB0byB0aGUgb3JpZ2luYWwgb25lLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGwKLQkgKiBhZnRlciBzYXZpbmcgcmVnYXJsZXNzIG9mIGl0cyBzdWNjZXNzLgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZXN0b3JlVVJJKCkgewotCQlpZiAob2xkVVJJICE9IG51bGwpIHsKLQkJCXJlc291cmNlLnNldFVSSShvbGRVUkkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRmlsZU1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9GaWxlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NmE5YTZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9GaWxlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnV0aWxzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotaW1wb3J0IHN1bi5zZWN1cml0eS5hY3Rpb24uR2V0UHJvcGVydHlBY3Rpb247Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIElGaWxlTWFuYWdlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZpbGVNYW5hZ2VyIGltcGxlbWVudHMgSUZpbGVNYW5hZ2VyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IEZpbGVNYW5hZ2VyLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIEZpbGVNYW5hZ2VyIGluc3RhbmNlID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0bXBkaXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUZW1wRGlyKCkgewotCQlpZiAodG1wZGlyID09IG51bGwpIHsKLQkJCUdldFByb3BlcnR5QWN0aW9uIGEgPSBuZXcgR2V0UHJvcGVydHlBY3Rpb24oImphdmEuaW8udG1wZGlyIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRtcGRpciA9ICgoU3RyaW5nKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChhKSk7Ci0JCX0KLQkJcmV0dXJuIHRtcGRpcjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVFZGl0SW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsZU1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKEZpbGVNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgRmlsZU1hbmFnZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlTWFuYWdlcigpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZUZvckxvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShsb2NhdGlvbik7Ci0JCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChsb2NhdGlvbik7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZTsKLQkJaWYgKGZpbGUuaXNGaWxlKCkpIHsKLQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCUlSZXNvdXJjZSBwYXJlbnRSZXNvdXJjZSA9IGdldFJlc291cmNlRm9yTG9jYXRpb24oZmlsZQotCQkJCQkJLmdldFBhcmVudCgpKTsKLQkJCQlpZiAocGFyZW50UmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJcGFyZW50UmVzb3VyY2UucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG51bGwpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCX0KLQkJCQkJcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0Q29udGFpbmVyRm9yTG9jYXRpb24ocGF0aCk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZWZyZXNoKElSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoIXJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQlBcnJheUxpc3QgZm9sZGVyc1RvUmVmcmVzaCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlDb250YWluZXIgY29udGFpbmVyOwotCQkJZm9yIChjb250YWluZXIgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsgIWNvbnRhaW5lci5leGlzdHMoKTsgY29udGFpbmVyID0gY29udGFpbmVyCi0JCQkJCS5nZXRQYXJlbnQoKSkgewotCQkJCWZvbGRlcnNUb1JlZnJlc2guYWRkKDAsIGNvbnRhaW5lcik7Ci0JCQl9Ci0JCQlpZiAoY29udGFpbmVyLmV4aXN0cygpKSB7Ci0JCQkJY29udGFpbmVyLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJCX0KLQkJCWlmICghZm9sZGVyc1RvUmVmcmVzaC5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmb2xkZXJzVG9SZWZyZXNoLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlGb2xkZXIgZm9sZGVyID0gKElGb2xkZXIpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJCQlmb2xkZXIucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG51bGwpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJlc291cmNlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaGVzIGZpbGUgb3IgZGlyZWN0b3J5IHdpdGggZ2l2ZW4gbG9jYWwgZmlsZSBzeXN0ZW0KLQkgKiA8Y29kZT5wYXRoPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBsb2NhbCBmaWxlIHN5c3RlbSBwYXRoCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcmVmcmVzaChTdHJpbmcgcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZUZvckxvY2F0aW9uKHBhdGgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlZnJlc2gocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWZyZXNoKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVmcmVzaChyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIG1vdmUoU3RyaW5nIG9sZFBhdGgsIFN0cmluZyBuZXdQYXRoKSB7Ci0JCXJldHVybiBtb3ZlKG9sZFBhdGgsIG5ld1BhdGgsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtb3ZlKFN0cmluZyBvbGRQYXRoLCBTdHJpbmcgbmV3UGF0aCwKLQkJCWJvb2xlYW4gZm9yY2VSZW1vdmVTb3VyY2UpIHsKLQkJdHJ5IHsKLQkJCXJlZnJlc2gob2xkUGF0aCk7Ci0KLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpCi0JCQkJCS5nZXRSb290KCk7Ci0KLQkJCS8vIGNyZWF0ZSB0aGUgZm9sZGVycyBvZiB0aGUgZGVzdGluYXRpb24gaWYgdGhleSBkaWQgbm90IGV4aXN0Ci0JCQlJUGF0aCBkZXN0UGF0aCA9IG5ldyBQYXRoKG5ld1BhdGgpOwotCQkJaWYgKG5ldyBGaWxlKG9sZFBhdGgpLmlzRmlsZSgpKSB7Ci0JCQkJcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldEZpbGVGb3JMb2NhdGlvbihkZXN0UGF0aCk7Ci0JCQl9IGVsc2UgewotCQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRDb250YWluZXJGb3JMb2NhdGlvbihkZXN0UGF0aCk7Ci0JCQl9Ci0JCQlpZiAocmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCQlyZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG51bGwpOwotCQkJCWlmKHJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihOTFMuYmluZCgKLQkJCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5tb3ZlRXJyb3JfbXNnLCBvbGRQYXRoLCBuZXdQYXRoKSk7Ci0JCQkJfQotCQkJfQotCQkJQXJyYXlMaXN0IGZvbGRlcnNUb0NyZWF0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlDb250YWluZXIgY29udGFpbmVyOwotCQkJZm9yIChjb250YWluZXIgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsgIWNvbnRhaW5lci5leGlzdHMoKTsgY29udGFpbmVyID0gY29udGFpbmVyCi0JCQkJCS5nZXRQYXJlbnQoKSkgewotCQkJCWZvbGRlcnNUb0NyZWF0ZS5hZGQoMCwgY29udGFpbmVyKTsKLQkJCX0KLQkJCWlmICghZm9sZGVyc1RvQ3JlYXRlLmlzRW1wdHkoKSkgewotCQkJCWNvbnRhaW5lci5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZm9sZGVyc1RvQ3JlYXRlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQkJCWZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlmb2xkZXIucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZGVzdFBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotCi0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgob2xkUGF0aCk7Ci0JCQlJRmlsZSBmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXNvdXJjZSA9IGZpbGU7Ci0JCQl9IGVsc2UgewotCQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRDb250YWluZXJGb3JMb2NhdGlvbihwYXRoKTsKLQkJCX0KLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzb3VyY2UubW92ZShkZXN0UGF0aCwgdHJ1ZSwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoZm9yY2VSZW1vdmVTb3VyY2UpIHsKLQkJCQkJCXRocm93IGU7Ci0JCQkJCX0KLQotCQkJCQlib29sZWFuIGZhaWxlZCA9IGZhbHNlOwotCi0JCQkJCS8vIGhhbmRsZSBzaXR1YXRpb24gd2hlbiBFY2xpcHNlIG1vdmVzIGZpbGUvZGlyZWN0b3J5IGJ5Ci0JCQkJCS8vIGNvcHlpbmcgaXQgdG8gZGVzdGluYXRpb24gdGhlbiBkZWxldGluZyB0aGUgc291cmNlCi0JCQkJCS8vIGJ1dCBkZWxldGlvbiBmYWlsZWQKLQkJCQkJSVN0YXR1c1tdIHN0YXR1c2VzID0gZS5nZXRTdGF0dXMoKS5nZXRDaGlsZHJlbigpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXR1c2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IHN0YXR1c2VzW2ldOwotCQkJCQkJaWYgKHN0YXR1cy5nZXRDb2RlKCkgPT0gSVJlc291cmNlU3RhdHVzLkZBSUxFRF9ERUxFVEVfTE9DQUwKLQkJCQkJCQkJJiYgc3RhdHVzLmdldE1lc3NhZ2UoKSA9PSBNZXNzYWdlcy5sb2NhbHN0b3JlX2RlbGV0ZVByb2JsZW0pIHsKLQkJCQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdAotCQkJCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCQkJIldhcm5pbmcgd2hpbGUgbW92aW5nICcnezB9JycgdG8gJyd7MX0nJzogezJ9IiwgbmV3IE9iamVjdFtdIHsgb2xkUGF0aCwgbmV3UGF0aCwgc3RhdHVzLmdldE1lc3NhZ2UoKSB9KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2cobXNnKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZmFpbGVkID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoZmFpbGVkIHx8ICFuZXcgRmlsZShuZXdQYXRoKS5leGlzdHMoKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW5hbWUoRmlsZSBvbGRGaWxlLCBGaWxlIG5ld0ZpbGUpIHsKLQkJcmV0dXJuIG1vdmUob2xkRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgbmV3RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlUmVzb3VyY2UoU3RyaW5nIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gbm8gbmVlZCB0byByZWZyZXNoIHRoZSB3aG9sZSB0cmVlIGZyb20gc3BlY2lmaWVkIHBhdGgKLQkJLy8gZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbigpIHJlZnJlc2hlcyByZXNvdXJjZSBpbiBhIG1vcmUgZWZmaWNpZW50IHdheQotCQkvLwotCQkvLyBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0KLQkJLy8gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJLy8gdHJ5IHsKLQkJLy8gd29ya3NwYWNlUm9vdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBtb25pdG9yKTsKLQkJLy8gfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkvLyBlMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJLy8gfQotCi0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZS5kZWxldGUodHJ1ZSwgbW9uaXRvcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBkZWxldGUoU3RyaW5nIHBhdGgpIHsKLQkJdHJ5IHsKLQkJCWRlbGV0ZVJlc291cmNlKHBhdGgsIG51bGwpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZnJvbUNDKElTdGF0dXMgc3RhdHVzKSB7Ci0JCVN0cmluZyBwbHVnaW5JZCA9IHN0YXR1cy5nZXRQbHVnaW4oKTsKLQkJcmV0dXJuIHBsdWdpbklkICE9IG51bGwKLQkJCQkmJiBwbHVnaW5JZC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImNsZWFyY2FzZSIpICE9IC0xOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElTdGF0dXMgY2hlY2tNb2RpZnkoU3RyaW5nW10gcGF0aHMsIE9iamVjdCBjb250ZXh0KSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlGaWxlW10gZmlsZXMgPSBuZXcgSUZpbGVbcGF0aHMubGVuZ3RoXTsKLQkJQXJyYXlMaXN0IG5vdEZvdW5kRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBwYXRoID0gcGF0aHNbaV07Ci0JCQl0cnkgewotCQkJCXJlZnJlc2gocGF0aCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJfQotCQkJSUZpbGUgZmlsZSA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKHBhdGgpKTsKLQkJCWlmIChmaWxlID09IG51bGwpIHsKLQkJCQlub3RGb3VuZEZpbGVzLmFkZChwYXRoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZmlsZXNbaV0gPSBmaWxlOwotCQkJfQotCQl9Ci0JCWlmICghbm90Rm91bmRGaWxlcy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUExVR0lOX0lELCBJU3RhdHVzLldBUk5JTkcsIE5MUwotCQkJCQkuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5maWxlTm90Rm91bmRFcnJvcl9tc2csCi0JCQkJCQkJbm90Rm91bmRGaWxlcyksIG51bGwpOwotCQl9Ci0KLQkJaWYgKCF2YWxpZGF0ZUVkaXRJbml0aWFsaXplZCkgewotCQkJc3RhdHVzID0gd29ya3NwYWNlLnZhbGlkYXRlRWRpdChmaWxlcywgY29udGV4dCk7Ci0JCQl2YWxpZGF0ZUVkaXRJbml0aWFsaXplZCA9IHRydWU7Ci0JCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJCS8vIGRvdWJsZS1jaGVjayBhZnRlciBpbml0aWFsaXphdGlvbgotCQkJCS8vCi0JCQkJc3RhdHVzID0gd29ya3NwYWNlLnZhbGlkYXRlRWRpdChmaWxlcywgY29udGV4dCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVFZGl0KGZpbGVzLCBjb250ZXh0KTsKLQkJfQotCi0JCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQkvLyBzb21lIHZlcnNpb24gY29udHJvbCBwcm92aWRlciBzdGlsbCByZXR1cm5zIE9LIHN0YXR1cyBldmVuIHRob3VnaAotCQkJLy8gdXNlciBjYW5jZWxsZWQgdGhlIGNoZWNrIG91dAotCQkJLy8gZG91YmxlLWNoZWNrIGhlcmUgYWdhaW4gdG8gbWFrZSBzdXJlIHRoZSBmaWxlIGlzIG5vdCByZWFkLW9ubHkKLQkJCS8vCQkJCi0JCQlBcnJheUxpc3QgcmVhZE9ubHlGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRmlsZSBmaWxlID0gZmlsZXNbaV07Ci0JCQkJdHJ5IHsKLQkJCQkJZmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG51bGwpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCX0KLQkJCQlpZiAoZmlsZS5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJcmVhZE9ubHlGaWxlcy5hZGQoZmlsZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFyZWFkT25seUZpbGVzLmlzRW1wdHkoKSkgewotCQkJCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFBMVUdJTl9JRCwKLQkJCQkJCUlTdGF0dXMuT0ssIFBlcnNpc3RlbmNlUmVzb3VyY2VzLm1vZGlmeUZpbGVzRXJyb3JfbXNnLAotCQkJCQkJbnVsbCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVhZE9ubHlGaWxlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgaXRlci5uZXh0KCk7Ci0JCQkJCVN0cmluZyBsb2NhbFBhdGggPSBmaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMuRmlsZU1hbmFnZXJfZmlsZVJlYWRPbmx5LAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IGxvY2FsUGF0aCB9KTsKLQkJCQkJbXVsdGlTdGF0dXMuYWRkKG5ldyBSZXNvdXJjZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCAwLCBmaWxlCi0JCQkJCQkJLmdldEZ1bGxQYXRoKCksIG1zZywgbnVsbCkpOwotCQkJCX0KLQkJCQlzdGF0dXMgPSBtdWx0aVN0YXR1czsKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gaGFjayBmb3IgY2xlYXJjYXNlCi0JCQlpZiAoZnJvbUNDKHN0YXR1cykpIHsKLQkJCQlTdHJpbmcgbXNnID0gUGVyc2lzdGVuY2VSZXNvdXJjZXMubW9kaWZ5RmlsZXNFcnJvcl9tc2c7Ci0JCQkJTXVsdGlTdGF0dXMgbXVsdGlTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoUExVR0lOX0lELCBzdGF0dXMKLQkJCQkJCS5nZXRDb2RlKCksIG1zZywgbnVsbCk7Ci0JCQkJbXVsdGlTdGF0dXMuYWRkKHN0YXR1cyk7Ci0JCQkJcmV0dXJuIG11bHRpU3RhdHVzOwotCQkJfQotCQl9Ci0KLQkJLy8gY29udmVydCB3b3Jrc3BhY2UgcGF0aCB0byBsb2NhbCBmaWxlIHN5c3RlbSBwYXRoCi0JCWlmIChzdGF0dXMgaW5zdGFuY2VvZiBNdWx0aVN0YXR1cykgewotCQkJTXVsdGlTdGF0dXMgbXMgPSAoTXVsdGlTdGF0dXMpIHN0YXR1czsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbXMuZ2V0Q2hpbGRyZW4oKS5sZW5ndGg7IGkrKykgewotCQkJCUlTdGF0dXMgY2hpbGRTdGF0dXMgPSBtcy5nZXRDaGlsZHJlbigpW2ldOwotCQkJCWlmIChjaGlsZFN0YXR1cyBpbnN0YW5jZW9mIElSZXNvdXJjZVN0YXR1cwotCQkJCQkJJiYgY2hpbGRTdGF0dXMuZ2V0Q29kZSgpID09IElSZXNvdXJjZVN0YXR1cy5SRUFEX09OTFlfTE9DQUwpIHsKLQkJCQkJSVJlc291cmNlU3RhdHVzIHJlc291cmNlU3RhdHVzID0gKChJUmVzb3VyY2VTdGF0dXMpIGNoaWxkU3RhdHVzKTsKLQkJCQkJSVBhdGggcGF0aCA9IHJlc291cmNlU3RhdHVzLmdldFBhdGgoKTsKLQkJCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKLQkJCQkJCQkuZ2V0RmlsZShwYXRoKTsKLQkJCQkJU3RyaW5nIGxvY2FsUGF0aCA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5GaWxlTWFuYWdlcl9maWxlUmVhZE9ubHksCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgbG9jYWxQYXRoIH0pOyAvLyROT04tTkxTLTEkCi0JCQkJCW1zLmdldENoaWxkcmVuKClbaV0gPSBuZXcgUmVzb3VyY2VTdGF0dXMoY2hpbGRTdGF0dXMKLQkJCQkJCQkuZ2V0U2V2ZXJpdHkoKSwgY2hpbGRTdGF0dXMuZ2V0Q29kZSgpLAotCQkJCQkJCXJlc291cmNlU3RhdHVzLmdldFBhdGgoKSwgbXNnLCBjaGlsZFN0YXR1cwotCQkJCQkJCQkJLmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlciNjaGVja01vZGlmeShqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjaGVja01vZGlmeShTdHJpbmcgcGF0aCwgT2JqZWN0IGNvbnRleHQpIHsKLQkJcmV0dXJuIGNoZWNrTW9kaWZ5KG5ldyBTdHJpbmdbXSB7IHBhdGggfSwgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBwYXRoIGlzIHRlYW0tcHJpdmF0ZSBmaWxlIG9yIGZvbGRlcgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVGVhbVByaXZhdGUoU3RyaW5nIHBhdGgpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihwYXRoKTsKLQkJcmV0dXJuIHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNUZWFtUHJpdmF0ZU1lbWJlcigpOwotCX0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBVUkksIHVzaW5nIGEgVVJJIGNvbnZlcnRlcgotICAgICAqIGlmIG5lY2Vzc2FyeSAoYW5kIHByb3ZpZGVkKSB0byBub3JtYWxpemUgaXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaSBhIFVSSQotICAgICAqIEBwYXJhbSBjb252ZXJ0ZXIgYW4gb3B0aW9uYWwgVVJJIGNvbnZlcnRlciAobWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+KQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZpbGUsIGlmIGF2YWlsYWJsZSBpbiB0aGUgd29ya3NwYWNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKFVSSSB1cmksIFVSSUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLSAgICAgICAgSUZpbGUgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmICgicGxhdGZvcm0iLmVxdWFscyh1cmkuc2NoZW1lKCkpICYmICh1cmkuc2VnbWVudENvdW50KCkgPiAyKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAoInJlc291cmNlIi5lcXVhbHModXJpLnNlZ21lbnQoMCkpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoVVJJLmRlY29kZSh1cmkucGF0aCgpKSkucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodXJpLmlzRmlsZSgpICYmICF1cmkuaXNSZWxhdGl2ZSgpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbigKLSAgICAgICAgICAgICAgICBuZXcgUGF0aCh1cmkudG9GaWxlU3RyaW5nKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSwgdG8gc2VlIHdoZXRoZXIgbWF5IHdlIGNhbiByZXNvbHZlIGl0IHRoaXMgdGltZQotICAgICAgICAgICAgaWYgKGNvbnZlcnRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgVVJJIG5vcm1hbGl6ZWQgPSBjb252ZXJ0ZXIubm9ybWFsaXplKHVyaSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKCF1cmkuZXF1YWxzKG5vcm1hbGl6ZWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2Ugb24gdGhlIG5ldyBVUkkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0RmlsZShub3JtYWxpemVkLCBjb252ZXJ0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0ZpbGVTdHJpbmcoVVJJIHVyaSwgVVJJQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlpZih1cmkuaXNGaWxlKCkpIHsKLQkJCXJldHVybiB1cmkudG9GaWxlU3RyaW5nKCk7Ci0JCX0KLQkJSUZpbGUgZmlsZSA9IGdldEZpbGUodXJpLCBjb252ZXJ0ZXIpOwotCQlyZXR1cm4gZmlsZSAhPSBudWxsID8gZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkgOiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0ZpbGVTdHJpbmcoVVJJIHVyaSkgewotCQlyZXR1cm4gdG9GaWxlU3RyaW5nKHVyaSwgbnVsbCk7Ci0JfQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRmlsZVBhdGhQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZpbGVQYXRoUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGZjMjZlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRmlsZVBhdGhQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogRmlsZS1iYXNlZCBVUkkgcHJvdmlkZXIKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgOCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotY2xhc3MgRmlsZVBhdGhQcm92aWRlciBpbXBsZW1lbnRzIElVUklQcm92aWRlciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuSVVSSVByb3ZpZGVyI2dldFVSSShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgVVJJIGdldFVSSShFT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuY3JlYXRlRmlsZVVSSSgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9JVVJJUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9JVVJJUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWZlY2Y1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvSVVSSVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIEludGVyZmFjZSB0byBwcm92aWRlIFVSSSBmb3IgYW4gRU9iamVjdC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgOCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVVJJUHJvdmlkZXIgewotCQotCS8qKgotCSAqIEdldHMgdGhlIFVSSSBmb3IgdGhlIGdpdmVuIG9iamVjdCBpZiB0aGlzIG9iamVjdCBoYXMgb3Igc2hvdWxkIGhhdmUgYSBkaXJlY3QgcmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiB0aGUgVVJJIG9yIG51bGwgaWYgdGhlIGdpdmVuIG9iamVjdCBkb2VzL3dpbGwgbm90IGhhdmUgYSBkaXJlY3QgcmVzb3VyY2UKLQkgKi8KLQlVUkkgZ2V0VVJJKEVPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDhjYWU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuaW50ZXJuYWwuSUZhaWxTYWZlU2F2YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBGaWxlLWJhc2VkIGltcGxlbWVudGF0aW9uIGZvciBJTWV0aG9kTGlicmFyeVBlcnNpc3RlcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeVBlcnNpc3RlciBpbXBsZW1lbnRzIElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEZvbGRlckluZm8gewotCi0JCUVDbGFzcyBlQ2xheno7Ci0KLQkJYm9vbGVhbiBzaGFyZWQ7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCQkvKioKLQkJICogQHBhcmFtIGNsYXp6Ci0JCSAqIEBwYXJhbSBzaGFyZWQKLQkJICovCi0JCXB1YmxpYyBGb2xkZXJJbmZvKEVDbGFzcyBjbGF6eiwgYm9vbGVhbiBzaGFyZWQpIHsKLQkJCXN1cGVyKCk7Ci0JCQllQ2xhenogPSBjbGF6ejsKLQkJCXRoaXMuc2hhcmVkID0gc2hhcmVkOwotCQkJdGhpcy5uYW1lID0gbG93ZXJBbmRQbHVyYWxpemUoY2xhenouZ2V0TmFtZSgpKTsKLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIElOU1RBTkNFID0gbmV3IE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIoKTsKLQotCS8vIG5lZWQgdG8gZXhwb3NlIHRoaXMsIGp4aQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0ZPTERFUiA9ICJyZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IGZvbGRlckluZm9zID0gbmV3IEFycmF5TGlzdCgpOwotCi0Jc3RhdGljIHsKLQkJZm9sZGVySW5mb3MuYWRkKG5ldyBGb2xkZXJJbmZvKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlKCksCi0JCQkJZmFsc2UpKTsKLQkJZm9sZGVySW5mb3MuYWRkKG5ldyBGb2xkZXJJbmZvKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0KCksCi0JCQkJdHJ1ZSkpOwotCQlmb2xkZXJJbmZvcwotCQkJCS5hZGQobmV3IEZvbGRlckluZm8oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKSwgdHJ1ZSkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IHdhcm5pbmdzOwotCi0JcHVibGljIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29ycmVjdCBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcGx1Z2luKSBvZiB0aGUgZmlsZSBvZiB0aGUKLQkgKiBnaXZlbiBjb250ZW50IGRlc2NyaXB0aW9uIG9yIG51bGwgaWYgdGhlIGdpdmVuIGNvbnRlbnQgZG9lcyBub3QgYmUgbG9uZwotCSAqIHRvIGFueSBwbHVnaW4uCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29ycmVjdFBhdGgoQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQpIHsKLQkJcmV0dXJuIGdldENvcnJlY3RQYXRoKChEZXNjcmliYWJsZUVsZW1lbnQpIGNvbnRlbnQuZUNvbnRhaW5lcigpLAotCQkJCWNvbnRlbnQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDb3JyZWN0UGF0aChEZXNjcmliYWJsZUVsZW1lbnQgZSwKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50KSB7Ci0JCWlmIChlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpOwotCQlpZiAocGx1Z2luID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVJlc291cmNlIHJlc291cmNlID0gcGx1Z2luLmVSZXNvdXJjZSgpOwotCQlVUkkgdXJpOwotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCXVyaSA9ICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZSkuZ2V0RmluYWxVUkkoKTsKLQkJfSBlbHNlIHsKLQkJCXVyaSA9IHJlc291cmNlLmdldFVSSSgpOwotCQl9Ci0JCUZpbGUgcGx1Z2luRGlyID0gbmV3IEZpbGUodXJpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCVN0cmluZyBmb2xkZXJQYXRoID0gc3RhdGljR2V0Rm9sZGVyUGF0aChlLmVDbGFzcygpKTsKLQkJU3RyaW5nIGRpciA9IG5ldyBTdHJpbmdCdWZmZXIocGx1Z2luRGlyLmdldEFic29sdXRlUGF0aCgpKS5hcHBlbmQoCi0JCQkJRmlsZS5zZXBhcmF0b3IpLmFwcGVuZChmb2xkZXJQYXRoKS5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpCi0JCQkJLnRvU3RyaW5nKCk7Ci0KLQkJcmV0dXJuIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShkaXIsIGUsIGNvbnRlbnQpOwotCX0KLQotCXN0YXRpYyBTdHJpbmcgZ2V0TmV4dEF2YWlsYWJsZUZpbGVOYW1lKFN0cmluZyBkaXIsIFN0cmluZyByZXF1ZXN0ZWROYW1lLAotCQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgZSkgewotCQlTdHJpbmcgY3VycmVudEZpbGVuYW1lID0gbnVsbDsKLQkJRmlsZSBjdXJyZW50RmlsZSA9IG51bGw7Ci0JCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGUKLQkJCQkuZURpcmVjdFJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkvLyBrZWVwIGV4aXN0aW5nIGZpbGUgbmFtZSBkdXJpbmcgbW92ZSBpZiBpdCBpcyBub3QgdGFrZW4geWV0LiBEb24ndAotCQkJLy8gdHJ5IHRvIG1hdGNoIHRoZSBlbGVtZW50J3MgbmFtZQotCQkJLy8KLQkJCVN0cmluZyBwYXRoID0gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGUuZVJlc291cmNlKCkpCi0JCQkJCS5nZXRGaW5hbFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJY3VycmVudEZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJCWN1cnJlbnRGaWxlbmFtZSA9IGN1cnJlbnRGaWxlLmdldE5hbWUoKTsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpciwgY3VycmVudEZpbGVuYW1lKTsKLQkJCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJCS8vIHRoZSBlbGVtZW50IGlzIGJlaW5nIG1vdmVkCi0JCQkJLy8KLQkJCQlyZXR1cm4gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCX0KLQkJfQotCi0JCS8vIGVsZW1lbnQgd2l0aG91dCBhIHJlc291cmNlIG9yIHBhdGggaXMgYWxyZWFkeSB0YWtlbgotCQkvLwotCQlTdHJpbmcgcGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoZGlyKS5hcHBlbmQocmVxdWVzdGVkTmFtZSkuYXBwZW5kKAotCQkJCU11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfRklMRV9FWFRFTlNJT04pLnRvU3RyaW5nKCk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotCQlpZihmaWxlLmVxdWFscyhjdXJyZW50RmlsZSkpIHsKLQkJCXJldHVybiBwYXRoOwotCQl9Ci0JCWlmICgoY3VycmVudEZpbGVuYW1lICE9IG51bGwgJiYgY3VycmVudEZpbGVuYW1lLmVxdWFscyhyZXF1ZXN0ZWROYW1lKSkKLQkJCQl8fCBmaWxlLmV4aXN0cygpKSB7Ci0JCQlmb3IgKGludCBpID0gMjsgdHJ1ZTsgaSsrKSB7Ci0JCQkJcGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoZGlyKS5hcHBlbmQocmVxdWVzdGVkTmFtZSkuYXBwZW5kKCcgJykKLQkJCQkJCS5hcHBlbmQoaSkuYXBwZW5kKAotCQkJCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0ZJTEVfRVhURU5TSU9OKQotCQkJCQkJLnRvU3RyaW5nKCk7Ci0JCQkJaWYgKCFuZXcgRmlsZShwYXRoKS5leGlzdHMoKSkgewotCQkJCQlyZXR1cm4gcGF0aDsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfQotCX0KLQotCXN0YXRpYyBTdHJpbmcgZ2V0TmV4dEF2YWlsYWJsZUZpbGVOYW1lKFN0cmluZyBkaXIsCi0JCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCkgewotCQlyZXR1cm4gZ2V0TmV4dEF2YWlsYWJsZUZpbGVOYW1lKGRpciwgKERlc2NyaWJhYmxlRWxlbWVudCkgY29udGVudAotCQkJCS5lQ29udGFpbmVyKCksIGNvbnRlbnQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXROZXh0QXZhaWxhYmxlRmlsZU5hbWUoU3RyaW5nIGRpciwKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBlLCBDb250ZW50RGVzY3JpcHRpb24gY29udGVudCkgewotCQlyZXR1cm4gZ2V0TmV4dEF2YWlsYWJsZUZpbGVOYW1lKGRpciwgZS5nZXROYW1lKCksCi0JCQkJKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBjb250ZW50KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3RhdGljR2V0Rm9sZGVyUGF0aChFQ2xhc3MgZUNsYXp6KSB7Ci0JCWludCBzaXplID0gZm9sZGVySW5mb3Muc2l6ZSgpOwotCQlGb2xkZXJJbmZvIGluZm8gPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJRm9sZGVySW5mbyBmb2xkZXJJbmZvID0gKEZvbGRlckluZm8pIGZvbGRlckluZm9zLmdldChpKTsKLQkJCWlmIChmb2xkZXJJbmZvLmVDbGF6ei5pc1N1cGVyVHlwZU9mKGVDbGF6eikpIHsKLQkJCQlpbmZvID0gZm9sZGVySW5mbzsKLQkJCX0KLQkJfQotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoaW5mby5lQ2xhenogPT0gZUNsYXp6IHx8IGluZm8uc2hhcmVkKSB7Ci0JCQkJcmV0dXJuIGluZm8ubmFtZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoaW5mby5uYW1lKS5hcHBlbmQoRmlsZS5zZXBhcmF0b3JDaGFyKQotCQkJCQkJLmFwcGVuZChsb3dlckFuZFBsdXJhbGl6ZShlQ2xhenouZ2V0TmFtZSgpKSkudG9TdHJpbmcoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiBsb3dlckFuZFBsdXJhbGl6ZShlQ2xhenouZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvd2VyQW5kUGx1cmFsaXplKFN0cmluZyBuYW1lKSB7Ci0JCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCWlmIChuYW1lLmVuZHNXaXRoKCJjaGlsZHJlbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuYW1lOwotCQl9IGVsc2UgaWYgKG5hbWUuZW5kc1dpdGgoImNoaWxkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5hbWUgKyAicmVuIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG5hbWUuZW5kc1dpdGgoImRhdGEiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZTsKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJkYXR1bSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMikgKyAiYSI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJieSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuYW1lICsgInMiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgieSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMSkgKyAiaWVzIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG5hbWUuZW5kc1dpdGgoImV4IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSAyKSArICJpY2VzIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG5hbWUuZW5kc1dpdGgoIngiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZSArICJlcyI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJ1cyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMikgKyAiaSI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJzcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuYW1lICsgImVzIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG5hbWUuZW5kc1dpdGgoInMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBuYW1lICsgInMiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5IHJvb3QgZGlyZWN0b3J5IHRvIHRoZSByZXNvdXJjZQotCSAqIGZvbGRlciBvZiB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCQlTdHJpbmcgZm9sZGVyUGF0aCA9IGdldEVsZW1lbnRQYXRoKGUpOwotCQlpZiAoZm9sZGVyUGF0aCA9PSBudWxsIHx8IGZvbGRlclBhdGguZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfRk9MREVSOwotCQl9IGVsc2UgaWYgKGZvbGRlclBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcihmb2xkZXJQYXRoKS5hcHBlbmQoUkVTT1VSQ0VfRk9MREVSKQotCQkJCQkudG9TdHJpbmcoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKGZvbGRlclBhdGgpLmFwcGVuZChGaWxlLnNlcGFyYXRvcikuYXBwZW5kKAotCQkJCQlSRVNPVVJDRV9GT0xERVIpLnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50UGF0aChNZXRob2RFbGVtZW50IGUpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpOwotCQlpZiAocGx1Z2luID09IG51bGwpIHsKLQkJCWlmICghKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uIHx8IGUgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSkgewotCQkJCS8vIGVycm9yOiBwbHVnaW4gZWxlbWVudCB3aXRob3V0IGEgdmFsaWQgcGx1Z2luIHNldC4gVGhpcwotCQkJCS8vIHByb2JsZW0gbmVlZHMgdG8gYmUgZml4ZWQuCi0JCQkJLy8gc3RpbGwgc2VlIGl0IGZyb20gdGltZSB0byB0aW1lLAotCQkJCS8vIGZvciBleGFtcGxlLCB3aGVuIGxpY2sgb24gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaW4KLQkJCQkvLyBDT25maWd1cmF0aW9uIEV4cGxvcmVyCi0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oImVycm9yIGluIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuZ2V0RWxlbWVudFBhdGgoKTogcGx1Z2luIGVsZW1lbnQgd2l0aG91dCBhIHZhbGlkIHBsdWdpbi4gVGhpcyBwcm9ibGVtIG5lZWRzIHRvIGJlIGZpeGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChwbHVnaW4uZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCS8vIGVycm9yOiBwbHVnaW4gd2l0aG91dCBsaWJyYXJ5IHNldC4gVGhpcyBwcm9ibGVtIG5lZWRzIHRvIGJlCi0JCQkvLyBmaXhlZC4KLQkJCS8vIHN0aWxsIHNlZSBpdCBmcm9tIHRpbWUgdG8gdGltZQotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiZXJyb3IgaW4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXRFbGVtZW50UGF0aCgpOiBwbHVnaW4gd2l0aG91dCBsaWJyYXJ5IHNldC4gVGhpcyBwcm9ibGVtIG5lZWRzIHRvIGJlIGZpeGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVN0cmluZyByZWxQbHVnaW5QYXRoOwotCQlpZiAocGx1Z2luLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCVJlc291cmNlIGxpYlJlcyA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeShwbHVnaW4pLmVSZXNvdXJjZSgpOwotCQkJaWYgKGxpYlJlcyA9PSBwbHVnaW4uZVJlc291cmNlKCkpIHsKLQkJCQkvLyB0aGUgcGx1Z2luIGlzIG5vdCBzYXZlZCB5ZXQKLQkJCQlyZWxQbHVnaW5QYXRoID0gcGx1Z2luLmdldE5hbWUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJVVJJIHVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEZpbmFsVVJJKHBsdWdpbi5lUmVzb3VyY2UoKSk7Ci0JCQkJVVJJIHJlbFVyaSA9IHVyaS5kZXJlc29sdmUoTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJCS5nZXRGaW5hbFVSSShsaWJSZXMpKTsKLQkJCQlyZWxQbHVnaW5QYXRoID0gcmVsVXJpLnRyaW1TZWdtZW50cygxKS50b0ZpbGVTdHJpbmcoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIHRoZSBsaWJyYXJ5IGlzIG5vdCBzYXZlZCB5ZXQKLQkJCXJlbFBsdWdpblBhdGggPSBwbHVnaW4uZ2V0TmFtZSgpOwotCQl9Ci0JCVN0cmluZyBmb2xkZXJQYXRoID0gc3RhdGljR2V0Rm9sZGVyUmVsYXRpdmVQYXRoKGUpOwotCi0JCXJldHVybiAoZm9sZGVyUGF0aC5sZW5ndGgoKSA9PSAwID8gcmVsUGx1Z2luUGF0aCA6IG5ldyBTdHJpbmdCdWZmZXIoCi0JCQkJcmVsUGx1Z2luUGF0aCkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yQ2hhcikuYXBwZW5kKGZvbGRlclBhdGgpCi0JCQkJLmFwcGVuZChGaWxlLnNlcGFyYXRvckNoYXIpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRUNsYXNzIGVDbHMgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZW1wbGF0ZSgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oZUNscy5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIEFkanVzdHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBnaXZlbiByZXNvdXJjZSBhbmQgc2F2ZSBhbGwgdGhlIHJlc291cmNlcwotCSAqIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgYXMgdGhlIHJlc3VsdCBvZiB0aGlzIGFkanVzdG1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGp1c3RMb2NhdGlvbihSZXNvdXJjZSByZXNvdXJjZSkgewotCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlNdWx0aUZpbGVTYXZlVXRpbC5hZGp1c3RMb2NhdGlvbihyZXNvdXJjZSwgbW9kaWZpZWRSZXNvdXJjZXMpOwotCi0JCS8vIHNhdmUgdGhlIG1vZGlmaWVkIHJlc291cmNlcwotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSByZXNvdXJjZQotCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2RpZmllZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCXRyeSB7Ci0JCQkJcmVzb3VyY2VTZXQuc2F2ZSgoUmVzb3VyY2UpIGl0ZXIubmV4dCgpLCBudWxsKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb24gewotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSByZXNvdXJjZQotCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCQlyZXNvdXJjZVNldC5zYXZlKHJlc291cmNlLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVGaWxlcyhNZXRob2RFbGVtZW50IGUsIFN0cmluZyBwYXRoLAotCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJaWYgKG5ldyBGaWxlKHBhdGgpLmlzRGlyZWN0b3J5KCkgJiYgIWUuZUlzUHJveHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJTWV0aG9kRWxlbWVudCBtZSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlcyk7Ci0JCQkJaWYgKG1lICE9IG51bGwgJiYgVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KG1lLCBlKSkgewotCQkJCQlyZXMudW5sb2FkKCk7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJdHJ5IHsKLQkJCUZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZGVsZXRlUmVzb3VyY2UocGF0aCwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZXgpOwotCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlcyB0aGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGUoTWV0aG9kRWxlbWVudCBlLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJaWYgKCFVbWFVdGlsLmhhc0RpcmVjdFJlc291cmNlKGUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBlCi0JCQkJLmVSZXNvdXJjZSgpOwotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSByZXNvdXJjZQotCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCi0JCS8vIERvbid0IGRlbGV0ZSB0aGlzIHJlc291cmNlJ3MgZmlsZSBpZiBpdCBzdGlsbCBjb250YWlucyBvdGhlcgotCQkvLyBNZXRob2RFbGVtZW50Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIGVsZW1lbnQgIT0gZSkgewotCQkJCXJlc291cmNlU2V0LnJlbW92ZVVSSU1hcHBpbmdzKGUsIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLnJlbW92ZShlKTsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyBwYXRoOwotCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuaGFzT3duRm9sZGVyKGUpKSB7Ci0JCQkvLyBwYXRoIGlzIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIE1ldGhvZFBsdWdpbi9Qcm9jZXNzQ29tcG9uZW50Ci0JCQkvLwotCQkJcGF0aCA9IG5ldyBGaWxlKHJlc291cmNlLmdldEZpbmFsVVJJKCkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpOwotCi0JCQkvLyB1bmxvYWQvcmVtb3ZlIGFsbCByZXNvdXJjZXMgdW5kZXIgdGhlIGZvbGRlcgotCQkJLy8KLQkJCUNvbGxlY3Rpb24gdW5sb2FkZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlkbyB7Ci0JCQkJdW5sb2FkZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJCQkvLyBjb2xsZWN0IGFsbCByZXNvdXJjZXMgd2hvc2Ugcm9vdCBlbGVtZW50IGlzIGNvbnRhaW5lZCBieSB0aGUKLQkJCQkvLyBnaXZlbiBlbGVtZW50Ci0JCQkJLy8KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KHJlc291cmNlU2V0LmdldFJlc291cmNlcygpKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAocmVzLmlzTG9hZGVkKCkpIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQocmVzKTsKLQkJCQkJCWlmIChtZSAhPSBudWxsICYmIFVtYVV0aWwuaXNDb250YWluZWRCeShtZSwgZSkpIHsKLQkJCQkJCQl1bmxvYWRlZFJlc291cmNlcy5hZGQocmVzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB1bmxvYWRlZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQlyZXMudW5sb2FkKCk7Ci0JCQkJfQotCQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLnJlbW92ZUFsbCh1bmxvYWRlZFJlc291cmNlcyk7Ci0JCQl9IHdoaWxlICghdW5sb2FkZWRSZXNvdXJjZXMuaXNFbXB0eSgpKTsKLQkJfSBlbHNlIHsKLQkJCXBhdGggPSByZXNvdXJjZS5nZXRGaW5hbFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXJlc291cmNlU2V0LmNsZWFuVXAocmVzb3VyY2UsIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUxKTsKLQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQkJZGVsZXRlRmlsZXMoZSwgcGF0aCwgcmVzb3VyY2VTZXQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIG9iamVjdHNXaXRoRGlyZWN0UmVzb3VyY2VzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRPYmplY3RzV2l0aERpcmVjdFJlc291cmNlcyhFT2JqZWN0IGUsCi0JCQlDb2xsZWN0aW9uIG9iamVjdHNXaXRoRGlyZWN0UmVzb3VyY2VzKSB7Ci0JCWlmIChVbWFVdGlsLmhhc0RpcmVjdFJlc291cmNlKGUpKSB7Ci0JCQlvYmplY3RzV2l0aERpcmVjdFJlc291cmNlcy5hZGQoZSk7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlLmVDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWdldE9iamVjdHNXaXRoRGlyZWN0UmVzb3VyY2VzKChFT2JqZWN0KSBpdGVyLm5leHQoKSwKLQkJCQkJCW9iamVjdHNXaXRoRGlyZWN0UmVzb3VyY2VzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyI2RlbGV0ZShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlKE1ldGhvZEVsZW1lbnQgZSkgewotCQkvLyBjb2xsZWN0IGFsbCBlbGVtZW50cyB3aXRoIGRpcmVjdCByZXNvdXJjZXMgdGhhdCBhcmUgdGhlIGdpdmVuIGVsZW1lbnQKLQkJLy8gb3IgaXRzIG9mZnN0cmluZwotCQlBcnJheUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldE9iamVjdHNXaXRoRGlyZWN0UmVzb3VyY2VzKGUsIGVsZW1lbnRzKTsKLQkJaWYgKCFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCVNldCBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlkZWxldGUoKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCQl9Ci0KLQkJCS8vIHNhdmUgbW9kaWZpZWQgcmVzb3VyY2VzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCXRyeSB7Ci0JCQkJCXNhdmUocmVzb3VyY2UpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihleCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgZm9sZGVyIHRoYXQgY2FuIHN0b3JlIHRoZSBjb250ZW50IG9mIHRoZQotCSAqIGdpdmVuIE1ldGhvZEVsZW1lbnQuIFRoZSBwYXRoIGlzIHJlbGF0aXZlIHRvIGl0cyBwbHVnaW4gZm9sZGVyIG9yIGxpYnJhcnkKLQkgKiBmb2xkZXIgaWYgdGhlIGVsZW1lbnQgY2Fubm90IGJlIHN0b3JlZCBpbiBhIHBsdWdpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3RhdGljR2V0Rm9sZGVyUmVsYXRpdmVQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gc3RhdGljR2V0Rm9sZGVyUGF0aChlLmVDbGFzcygpKTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJcmV0dXJuIE11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FOwotCQl9Ci0KLQkJTWV0aG9kVW5pdCB1bml0ID0gVW1hVXRpbC5nZXRNZXRob2RVbml0KGUpOwotCi0JCWlmICh1bml0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSB1bml0KS5nZXRQcm9jZXNzKCk7Ci0JCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJcmV0dXJuIE11bHRpRmlsZVNhdmVVdGlsLkNBUEFCSUxJVFlfUEFUVEVSTl9QQVRIOwotCQkJfSBlbHNlIGlmIChwcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJcmV0dXJuIE11bHRpRmlsZVNhdmVVdGlsLkRFTElWRVJZX1BST0NFU1NfUEFUSDsKLQkJCX0KLQkJfSBlbHNlIGlmICh1bml0IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQlyZXR1cm4gc3RhdGljR2V0Rm9sZGVyUmVsYXRpdmVQYXRoKChNZXRob2RFbGVtZW50KSB1bml0Ci0JCQkJCS5lQ29udGFpbmVyKCkpOwotCQl9Ci0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGb2xkZXJSZWxhdGl2ZVBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBzdGF0aWNHZXRGb2xkZXJSZWxhdGl2ZVBhdGgoZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjZ2V0V2FybmluZ3MoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFdhcm5pbmdzKCkgewotCQlpZiAod2FybmluZ3MgPT0gbnVsbCkgewotCQkJd2FybmluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIHdhcm5pbmdzOwotCX0KLQotCXN0YXRpYyBjbGFzcyBGYWlsU2FmZVBlcnNpc3RlciBleHRlbmRzIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgaW1wbGVtZW50cwotCQkJRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHsKLQotCQlwcml2YXRlIE1hcCBzYXZlT3B0aW9uczsKLQotCQlwcml2YXRlIFR4UmVjb3JkIHR4UmVjb3JkID0gbmV3IFR4UmVjb3JkKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuVHhSZWNvcmQjY2xlYXIoKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCQlpZiAod2FybmluZ3MgIT0gbnVsbCAmJiAhd2FybmluZ3MuaXNFbXB0eSgpKSB7Ci0JCQkJCS8vIGNvcHkgdGhlIHdhcm5pbmcgdG8gcGVyc2lzdGVyCi0JCQkJCS8vCi0JCQkJCUZhaWxTYWZlUGVyc2lzdGVyLnRoaXMud2FybmluZ3MgPSBDb2xsZWN0aW9ucwotCQkJCQkJCS51bm1vZGlmaWFibGVMaXN0KHdhcm5pbmdzKTsKLQkJCQl9Ci0JCQkJc3VwZXIuY2xlYXIoKTsKLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIE1hcCBlbGVtZW50VG9JbmZvTWFwVG9EZWxldGVGaWxlczsKLQotCQlwdWJsaWMgRmFpbFNhZmVQZXJzaXN0ZXIoKSB7Ci0JCQlzYXZlT3B0aW9ucyA9IG5ldyBIYXNoTWFwKAotCQkJCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuREVGQVVMVF9TQVZFX09QVElPTlMpOwotCQkJdHhSZWNvcmQgPSBuZXcgVHhSZWNvcmQoKTsKLQkJCXNhdmVPcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5UWF9SRUNPUkQsIHR4UmVjb3JkKTsKLQkJCWVsZW1lbnRUb0luZm9NYXBUb0RlbGV0ZUZpbGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjZ2V0V2FybmluZ3MoKQotCQkgKi8KLQkJcHVibGljIExpc3QgZ2V0V2FybmluZ3MoKSB7Ci0JCQlpZiAodHhSZWNvcmQuZ2V0VHhJRCgpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0V2FybmluZ3MoKTsKLQkJCX0KLQkJCXJldHVybiB0eFJlY29yZC5nZXRXYXJuaW5ncygpOwotCQl9Ci0KLQkJTWFwIGdldFNhdmVPcHRpb25zKCkgewotCQkJcmV0dXJuIHNhdmVPcHRpb25zOwotCQl9Ci0KLQkJdm9pZCBjaGVja01vdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCS8vIGRpc2FsbG93IG5ldyBvcGVyYXRpb24gb24gcmVzb3VyY2Ugd2hpY2ggaGFzIHN0YXJ0ZWQgb3BlcmF0aW9uCi0JCQkvLyB0aGF0IGlzIG5vdCBjb21taXR0ZWQKLQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCBtZlJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2U7Ci0JCQlpZiAobWZSZXNvdXJjZS50eFN0YXJ0ZWQoKSkgewotCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihOTFMuYmluZCgKLQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLm1vdmVSZXNvdXJjZUVycm9yX21zZywgcmVzb3VyY2UpKTsKLQkJCX0JCQkKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlciNzYXZlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNhdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb24gewotCQkJaWYocmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCAmJgotCQkJCQlyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHJlc291cmNlCi0JCQkJLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJaWYgKHJlc291cmNlU2V0ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIHVwZGF0ZSB2ZXJzaW9uIGluZm8gaW4gbGlicmFyeSByZXNvdXJjZSBpZiBuZWVkZWQKLQkJCQkvLwotCQkJCVJlc291cmNlIGxpYlJlc291cmNlVG9TYXZlID0gbnVsbDsKLQkJCQlNZXRob2RFbGVtZW50IG1lID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJCWlmKG1lICE9IG51bGwpIHsKLQkJCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkobWUpOwotCQkJCQlpZihsaWIgIT0gbnVsbCkgewotCQkJCQkJUmVzb3VyY2UgbGliUmVzb3VyY2UgPSBsaWIuZVJlc291cmNlKCk7Ci0JCQkJCQlpZihsaWJSZXNvdXJjZSAhPSBudWxsIAotCQkJCQkJCQkmJiBsaWJSZXNvdXJjZSAhPSByZXNvdXJjZQotCQkJCQkJCQkmJiBQZXJzaXN0ZW5jZVV0aWwuY2hlY2tUb29sVmVyc2lvbihsaWJSZXNvdXJjZSkgIT0gMCkgewotCQkJCQkJCWxpYlJlc291cmNlVG9TYXZlID0gbGliUmVzb3VyY2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoTXVsdGlGaWxlWE1JU2F2ZUltcGwuY2hlY2tNb2RpZnlSZXF1aXJlZChzYXZlT3B0aW9ucykpIHsKLQkJCQkJQ29sbGVjdGlvbiByZXNvdXJjZXM7Ci0JCQkJCWlmKGxpYlJlc291cmNlVG9TYXZlICE9IG51bGwpIHsKLQkJCQkJCXJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCXJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJcmVzb3VyY2VzLmFkZChsaWJSZXNvdXJjZVRvU2F2ZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXNvdXJjZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHJlc291cmNlKTsKLQkJCQkJfQotCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja01vZGlmeShyZXNvdXJjZXMpOwotCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja091dE9mU3luY2gocmVzb3VyY2VzKTsKLQkJCQl9Ci0KLQkJCQlyZXNvdXJjZVNldC5zYXZlKHJlc291cmNlLCBzYXZlT3B0aW9ucyk7Ci0JCQkJaWYobGliUmVzb3VyY2VUb1NhdmUgIT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZVNldC5zYXZlKGxpYlJlc291cmNlVG9TYXZlLCBzYXZlT3B0aW9ucyk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZihyZXNvdXJjZSBpbnN0YW5jZW9mIElGYWlsU2FmZVNhdmFibGUpIHsKLQkJCQlJRmFpbFNhZmVTYXZhYmxlIGZhaWxTYWZlU2F2YWJsZSA9IChJRmFpbFNhZmVTYXZhYmxlKSByZXNvdXJjZTsKLQkJCQlmYWlsU2FmZVNhdmFibGUuc2V0VHhJRCh0eFJlY29yZC5nZXRUeElEKCkpOwotCQkJCXJlc291cmNlLnNhdmUoc2F2ZU9wdGlvbnMpOwotCQkJCXR4UmVjb3JkLmdldFJlc291cmNlc1RvQ29tbWl0KCkuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uKCJSZXNvdXJjZSBtdXN0IGltcGxlbWVudCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5JRmFpbFNhZmVTYXZhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlciNhZGp1c3RMb2NhdGlvbihvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGp1c3RMb2NhdGlvbihSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJY2hlY2tNb3ZlKHJlc291cmNlKTsKLQkJCVNldCBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwucHJlcGFyZUFkanVzdExvY2F0aW9uKAotCQkJCQkoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZSwgbW9kaWZpZWRSZXNvdXJjZXMpKSB7Ci0JCQkJdHhSZWNvcmQuZ2V0UmVzb3VyY2VzVG9Db21taXQoKS5hZGQocmVzb3VyY2UpOwotCQkJCQotCQkJCUhhc2hTZXQgcmVzb3VyY2VzVG9DaGVjayA9IG5ldyBIYXNoU2V0KG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCQlyZXNvdXJjZXNUb0NoZWNrLmFkZEFsbChyZXNvdXJjZXNUb0NoZWNrKTsKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja01vZGlmeShyZXNvdXJjZXNUb0NoZWNrKTsKLQkJCQkKLQkJCQlpZiAoIW1vZGlmaWVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewkJCQkJCi0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLmNoZWNrT3V0T2ZTeW5jaChtb2RpZmllZFJlc291cmNlcyk7Ci0KLQkJCQkJLy8gc2F2ZSB0aGUgbW9kaWZpZWQgcmVzb3VyY2VzCi0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzYXZlKChSZXNvdXJjZSkgaXRlci5uZXh0KCkpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY29tbWl0KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGp1c3RMb2NhdGlvbihDb2xsZWN0aW9uIHJlc291cmNlcykgewotCQkJaWYgKHJlc291cmNlcyA9PSBudWxsIHx8IHJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQljaGVja01vdmUoKFJlc291cmNlKSBpdGVyLm5leHQoKSk7Ci0JCQl9Ci0KLQkJCVNldCBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlIYXNoU2V0IHJlc291cmNlc1RvQ2hlY2sgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGl0ZXIKLQkJCQkJCS5uZXh0KCk7Ci0JCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLnByZXBhcmVBZGp1c3RMb2NhdGlvbigKLQkJCQkJCShNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlc291cmNlLCBtb2RpZmllZFJlc291cmNlcykpIHsKLQkJCQkJdHhSZWNvcmQuZ2V0UmVzb3VyY2VzVG9Db21taXQoKS5hZGQocmVzb3VyY2UpOwotCQkJCQlyZXNvdXJjZXNUb0NoZWNrLmFkZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXNvdXJjZXNUb0NoZWNrLmFkZEFsbChtb2RpZmllZFJlc291cmNlcyk7Ci0JCQlpZighcmVzb3VyY2VzVG9DaGVjay5pc0VtcHR5KCkpIHsKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja01vZGlmeShyZXNvdXJjZXNUb0NoZWNrKTsKLQkJCX0JCQkKLQkJCWlmICghbW9kaWZpZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQkJTXVsdGlGaWxlU2F2ZVV0aWwuY2hlY2tPdXRPZlN5bmNoKG1vZGlmaWVkUmVzb3VyY2VzKTsKLQotCQkJCS8vIHNhdmUgdGhlIG1vZGlmaWVkIHJlc291cmNlcwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzYXZlKChSZXNvdXJjZSkgaXRlci5uZXh0KCkpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY29tbWl0KCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnBlcnNpc3RlbmNlLk1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjZGVsZXRlRmlsZXMob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50LAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCkKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUZpbGVzKE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIHBhdGgsCi0JCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJCS8vIGtlZXAgdGhlIGluZm8gdG8gcmVhbGx5IGRlbGV0ZSB0aGUgZmlsZXMgaW4gY29tbWl0KCkKLQkJCWVsZW1lbnRUb0luZm9NYXBUb0RlbGV0ZUZpbGVzLnB1dChlLCBuZXcgT2JqZWN0W10geyBwYXRoLAotCQkJCQlyZXNvdXJjZVNldCB9KTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBzdXBlckRlbGV0ZUZpbGVzKE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIHBhdGgsCi0JCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJCXN1cGVyLmRlbGV0ZUZpbGVzKGUsIHBhdGgsIHJlc291cmNlU2V0KTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjY29tbWl0KCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGNvbW1pdCgpIHsKLQkJCS8vIHNhdmUgaXMgZG9uZQotCQkJLy8gY2FsbCBzYXZlSXNEb25lKCkgb24gZXZlcnkgc2F2ZWQgZmlsZSB0byByZW5hbWUgaXQgdG8gdGhlIGNvcnJlY3QKLQkJCS8vIG5hbWUKLQkJCWludCBzaXplID0gdHhSZWNvcmQuZ2V0UmVzb3VyY2VzVG9Db21taXQoKS5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCSgoSUZhaWxTYWZlU2F2YWJsZSkgdHhSZWNvcmQuZ2V0UmVzb3VyY2VzVG9Db21taXQoKQotCQkJCQkJLmdldChpKSkuY29tbWl0KCk7Ci0JCQl9Ci0KLQkJCS8vIG5vdGlmeSBhbGwgY29tbWl0ZWQgcmVzb3VyY2VzIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGlzIGRvbmUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJKChJRmFpbFNhZmVTYXZhYmxlKSB0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpCi0JCQkJCQkuZ2V0KGkpKS50eEZpbmlzaGVkKHRydWUpOwotCQkJfQotCi0JCQkvLyBkZWxldGUgYmFja3VwCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCSgoSUZhaWxTYWZlU2F2YWJsZSkgdHhSZWNvcmQuZ2V0UmVzb3VyY2VzVG9Db21taXQoKQotCQkJCQkJLmdldChpKSkuZGVsZXRlQmFja3VwKCk7Ci0JCQl9Ci0KLQkJCXR4UmVjb3JkLmNsZWFyKCk7Ci0KLQkJCS8vIGRlbGV0ZSBmaWxlcyBvZiBkZWxldGVkIGVsZW1lbnRzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudFRvSW5mb01hcFRvRGVsZXRlRmlsZXMuZW50cnlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0W10gaW5mbyA9IChPYmplY3RbXSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGluZm9bMF07Ci0JCQkJdHJ5IHsKLQkJCQkJc3VwZXJEZWxldGVGaWxlcygoTWV0aG9kRWxlbWVudCkgZW50cnkuZ2V0S2V5KCksIHBhdGgsCi0JCQkJCQkJKFJlc291cmNlU2V0KSBpbmZvWzFdKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIFdyYXBwZWRFeGNlcHRpb24pIHsKLQkJCQkJCWUgPSAoKFdyYXBwZWRFeGNlcHRpb24pIGUpLmV4Y2VwdGlvbigpOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBtc2cgPSBQZXJzaXN0ZW5jZVJlc291cmNlcy5FcnJNc2dfQ291bGROb3REZWxldGU7Ci0JCQkJCVN0cmluZyBvdGhlck1zZyA9IG51bGw7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSAoKENvcmVFeGNlcHRpb24pIGUpLmdldFN0YXR1cygpOwotCQkJCQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQkJCQkJb3RoZXJNc2cgPSBVbWFVdGlsLmdldE1lc3NhZ2Uoc3RhdHVzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAob3RoZXJNc2cgPT0gbnVsbCkgewotCQkJCQkJb3RoZXJNc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCW1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1zZywgbmV3IE9iamVjdFtdIHsgcGF0aCwKLQkJCQkJCQlvdGhlck1zZyB9KTsKLQkJCQkJZSA9IG5ldyBFeGNlcHRpb24obXNnLCBlKTsKLQkJCQkJZ2V0V2FybmluZ3MoKS5hZGQoZSk7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsZW1lbnRUb0luZm9NYXBUb0RlbGV0ZUZpbGVzLmNsZWFyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyI3JvbGxiYWNrKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJvbGxiYWNrKCkgewotCQkJaWYgKCF0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLmlzRW1wdHkoKSkgewotCQkJCXRyeSB7Ci0JCQkJCWludCBtYXggPSB0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLnNpemUoKSAtIDE7Ci0JCQkJCUFycmF5TGlzdCByZXN0b3JlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCQkvLyBTb21ldGhpbmcgd2VudCB3cm9uZywgcmVzdG9yZSBmcm9tIGJhY2t1cAotCQkJCQlmb3IgKGludCBpID0gbWF4OyBpID4gLTE7IGktLSkgewotCQkJCQkJSUZhaWxTYWZlU2F2YWJsZSByZXNvdXJjZSA9IChJRmFpbFNhZmVTYXZhYmxlKSB0eFJlY29yZAotCQkJCQkJCQkuZ2V0UmVzb3VyY2VzVG9Db21taXQoKS5nZXQoaSk7Ci0JCQkJCQlpZiAocmVzb3VyY2UucmVzdG9yZSgpKSB7Ci0JCQkJCQkJcmVzdG9yZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc3RvcmVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIKLQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCXJlc291cmNlLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCQl9Ci0KLQkJCQkJLy8gZGVsZXRlIHRlbXAgZmlsZXMKLQkJCQkJZm9yIChpbnQgaSA9IG1heDsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSB0eFJlY29yZAotCQkJCQkJCQkuZ2V0UmVzb3VyY2VzVG9Db21taXQoKS5nZXQoaSk7Ci0JCQkJCQlpZiAoKChJRmFpbFNhZmVTYXZhYmxlKXJlc291cmNlKS5oYXNUZW1wVVJJKCkpIHsKLQkJCQkJCQkvLyB1cmkga2VlcHMgdGhlIHBhdGggdG8gdGVtcCBmaWxlCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbmV3IEZpbGUocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpCi0JCQkJCQkJCQkJLmRlbGV0ZSgpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIG5vdGlmeSBhbGwgY29tbWl0ZWQgcmVzb3VyY2VzIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGlzCi0JCQkJCS8vIGRvbmUKLQkJCQkJZm9yIChpbnQgaSA9IG1heDsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJCSgoSUZhaWxTYWZlU2F2YWJsZSkgdHhSZWNvcmQKLQkJCQkJCQkJLmdldFJlc291cmNlc1RvQ29tbWl0KCkuZ2V0KGkpKQotCQkJCQkJCQkudHhGaW5pc2hlZChmYWxzZSk7Ci0JCQkJCX0KLQotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0JCQl9Ci0JCQl0eFJlY29yZC5jbGVhcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyI2dldEZhaWxTYWZlUGVyc2lzdGVyKCkKLQkJICovCi0JCXB1YmxpYyBGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjZ2V0Q3VycmVudFR4SUQoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDdXJyZW50VHhJRCgpIHsKLQkJCXJldHVybiB0eFJlY29yZC5nZXRUeElEKCk7Ci0JCX0KLQotCX0KLQotCUZhaWxTYWZlUGVyc2lzdGVyIGdldEZhaWxTYWZlUGVyc2lzdGVyKE1hcCBvcHRpb25zKSB7Ci0JCUZhaWxTYWZlUGVyc2lzdGVyIHBlcnNpc3RlciA9IG5ldyBGYWlsU2FmZVBlcnNpc3RlcigpOwotCQlwZXJzaXN0ZXIuc2F2ZU9wdGlvbnMucHV0QWxsKG9wdGlvbnMpOwotCi0JCS8vIG1ha2Ugc3VyZSB0aGF0IFRYX1JFQ09SRCBzdGlsbCBrZWVwcyB0aGUgY29ycmVjdCB2YWx1ZQotCQlwZXJzaXN0ZXIuc2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlRYX1JFQ09SRCwKLQkJCQlwZXJzaXN0ZXIudHhSZWNvcmQpOwotCi0JCXJldHVybiBwZXJzaXN0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjaGFzT3duRm9sZGVyKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duRm9sZGVyKE9iamVjdCBlKSB7Ci0JCXJldHVybiBNdWx0aUZpbGVTYXZlVXRpbC5oYXNPd25Gb2xkZXIoZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjaGFzT3duUmVzb3VyY2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNPd25SZXNvdXJjZShPYmplY3QgZSkgewotCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuaGFzT3duUmVzb3VyY2UoZSwKLQkJCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuREVGQVVMVF9TQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VUKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNnZXRGYWlsU2FmZVBlcnNpc3RlcigpCi0JICovCi0JcHVibGljIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBnZXRGYWlsU2FmZVBlcnNpc3RlcigpIHsKLQkJcmV0dXJuIG5ldyBGYWlsU2FmZVBlcnNpc3RlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTm9uRmFpbFNhZmVQZXJzaXN0ZXIgZXh0ZW5kcyBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyCi0JCQlpbXBsZW1lbnRzIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciB7Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciNjb21taXQoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgY29tbWl0KCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciNyb2xsYmFjaygpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByb2xsYmFjaygpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjZ2V0Q3VycmVudFR4SUQoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDdXJyZW50VHhJRCgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciNhZGp1c3RMb2NhdGlvbihqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFkanVzdExvY2F0aW9uKENvbGxlY3Rpb24gcmVzb3VyY2VzKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJYWRqdXN0TG9jYXRpb24oKFJlc291cmNlKSBpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBub25GYWlsU2FmZVBlcnNpc3RlciA9IG5ldyBOb25GYWlsU2FmZVBlcnNpc3RlcigpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjZ2V0RmlsZUV4dGVuc2lvbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbihPYmplY3QgZSkgewotCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjc2F2ZShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlpZighaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoZWxlbWVudCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZWxlbWVudCkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJVVJJIHVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLmNyZWF0ZUZpbGVVUkkoZWxlbWVudCk7Ci0JCU1hcCBvcHRpb25zID0gcmVzb3VyY2VTZXQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCk7IAotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSBNdWx0aUZpbGVTYXZlVXRpbC5zYXZlKHJlc291cmNlU2V0LCBlbGVtZW50LCB1cmksIG9wdGlvbnMsIGZhbHNlKTsKLQkJcmVzb3VyY2UudXBkYXRlVGltZVN0YW1wcygpOwotCQkKLQkJU3RyaW5nIHN0ciA9IChTdHJpbmcpIG9wdGlvbnMuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlJFRlJFU0hfTkVXX1JFU09VUkNFKTsKLQkJaWYgKHN0ciAhPSBudWxsICYmIEJvb2xlYW4udmFsdWVPZihzdHIpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkvLyBub3RpZnkgUmVmcmVzaEpvYiB0aGUgdGhpcyByZXNvdXJjZSBpcyBzYXZlZCBzbyBpdCB3aWxsIG5vdCBiZQotCQkJLy8gcmVsb2FkZWQgYWZ0ZXIgcmVmcmVzaGluZyBpdAotCQkJLy8KLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNvdXJjZVNhdmVkKHJlc291cmNlKTsKLQotCQkJLy8gcmVmcmVzaCB0aGUgbmV3bHkgY3JlYXRlZCByZXNvdXJjZSBzbyBpdCBpcyBpbiBzeW5jaCB3aXRoIHRoZQotCQkJLy8gd29ya3NwYWNlCi0JCQkvLwotCQkJRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWZyZXNoKHJlc291cmNlKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNoYXNPd25SZXNvdXJjZVdpdGhvdXRSZWZlcnJlcihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKE9iamVjdCBlKSB7Ci0JCXJldHVybiBlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlSU9FeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVJT0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlM2MyNzk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVJT0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi0vKioKLSAqIEJhc2UgZXhjZXB0aW9uIGZvciBmaWxlLWJhc2VkIHBlcnNpc3RlbmNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUZpbGVJT0V4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1Nzg1MzE5ODcyMjM0NzMyMUw7Ci0KLQlwcml2YXRlIE9iamVjdCB0cm91YmxlT2JqZWN0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTXVsdGlGaWxlSU9FeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTXVsdGlGaWxlSU9FeGNlcHRpb24oU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHVibGljIE11bHRpRmlsZUlPRXhjZXB0aW9uKFN0cmluZyBtc2csIE9iamVjdCB0cm91YmxlT2JqKSB7Ci0JCXN1cGVyKG1zZyk7Ci0JCXRyb3VibGVPYmplY3QgPSB0cm91YmxlT2JqOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdHJvdWJsZU9iamVjdC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFRyb3VibGVPYmplY3QoKSB7Ci0JCXJldHVybiB0cm91YmxlT2JqZWN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVJlc291cmNlU2V0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVJlc291cmNlU2V0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMzc4ZmY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEluZm9JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxNYXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5MaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guaW50ZXJuYWwuUmVmcmVzaEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5VbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSVVtYVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuUmVzb2x2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuRXZlbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgZXh0ZW5kcyBSZXNvdXJjZVNldEltcGwgaW1wbGVtZW50cwotCQlJUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIsIElVbWFSZXNvdXJjZVNldCwgSUxpYnJhcnlSZXNvdXJjZVNldCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX0RFTElWRVJZX1BST0NFU1NfUEFUSCA9IHsgIkRlbGl2ZXJ5UHJvY2Vzc2VzIiB9OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX0NBUEFCSUxJVFlfUEFUVEVSTl9QQVRIID0gewotCQkJIkNvbnRlbnQiLCAiQ2FwYWJpbGl0eVBhdHRlcm5zIiB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfUFJPQ0VTU19DT05UUklCVVRJT05fUEFUSCA9IHsgIlByb2Nlc3NDb250cmlidXRpb25zIiB9OyAvLyROT04tTkxTLTEkCQkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW11bXSBQUk9DRVNTX1BBQ0tBR0VfUEFUSFMgPSB7Ci0JCQlERUZBVUxUX0RFTElWRVJZX1BST0NFU1NfUEFUSCwgREVGQVVMVF9DQVBBQklMSVRZX1BBVFRFUk5fUEFUSCwKLQkJCURFRkFVTFRfUFJPQ0VTU19DT05UUklCVVRJT05fUEFUSCB9OwotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIFJFUE9SVF9FUlJPUiA9IHRydWU7Ci0KLQlzdGF0aWMgZmluYWwgTWFwIERFRkFVTFRfU0FWRV9PUFRJT05TID0gbmV3IEhhc2hNYXAoKTsKLQotCXN0YXRpYyBmaW5hbCBTZXQgREVGQVVMVF9TQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VUID0gbmV3IEhhc2hTZXQoKTsKLQotCXN0YXRpYyB7Ci0JCURFRkFVTFRfU0FWRV9TRVBBUkFURUxZX0NMQVNTX1NFVC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luKCkpOwotCQlERUZBVUxUX1NBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NDb21wb25lbnQoKSk7Ci0JCURFRkFVTFRfU0FWRV9TRVBBUkFURUxZX0NMQVNTX1NFVC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQkvLyBlQ2xhc3Nlcy5hZGQoUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VNYW5hZ2VyKCkpOwotCQlERUZBVUxUX1NBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0KLQkJWE1MUmVzb3VyY2UuWE1MTWFwIHhtbE1hcCA9IGNyZWF0ZVNhdmVYTUxNYXAoKTsKLQotCQlIYXNoU2V0IHNhdmVUb2dldGhlciA9IG5ldyBIYXNoU2V0KCk7Ci0JCXNhdmVUb2dldGhlci5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpOwotCi0JCURFRkFVTFRfU0FWRV9PUFRJT05TLnB1dCgKLQkJCQlNdWx0aUZpbGVYTUlTYXZlSW1wbC5TQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VULAotCQkJCURFRkFVTFRfU0FWRV9TRVBBUkFURUxZX0NMQVNTX1NFVCk7Ci0JCURFRkFVTFRfU0FWRV9PUFRJT05TLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5TQVZFX0FMTCwgImZhbHNlIik7IC8vJE5PTi1OTFMtMSQKLQkJREVGQVVMVF9TQVZFX09QVElPTlMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlNBVkVfVE9HRVRIRVJfQ0xBU1NfU0VULAotCQkJCXNhdmVUb2dldGhlcik7Ci0JCURFRkFVTFRfU0FWRV9PUFRJT05TLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5SRUZSRVNIX05FV19SRVNPVVJDRSwKLQkJCQkidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCURFRkFVTFRfU0FWRV9PUFRJT05TLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5DSEVDS19NT0RJRlksICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJREVGQVVMVF9TQVZFX09QVElPTlMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJREVGQVVMVF9TQVZFX09QVElPTlMucHV0KFhNTFJlc291cmNlLk9QVElPTl9QUk9DRVNTX0RBTkdMSU5HX0hSRUYsCi0JCQkJWE1MUmVzb3VyY2UuT1BUSU9OX1BST0NFU1NfREFOR0xJTkdfSFJFRl9ESVNDQVJEKTsKLQkJREVGQVVMVF9TQVZFX09QVElPTlMucHV0KFhNTFJlc291cmNlLk9QVElPTl9YTUxfTUFQLCB4bWxNYXApOwotCi0JCUFzc29jaWF0aW9uSGVscGVyLmluaXQoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNNR1JfWE1JID0gInJlc21nci54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEhhc2hNYXAgZGVmYXVsdFNhdmVPcHRpb25zOwotCi0JcHJpdmF0ZSBIYXNoTWFwIGd1aWRUb01ldGhvZEVsZW1lbnRNYXA7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbG9hZGluZzsKLQotCXByaXZhdGUgYm9vbGVhbiBsb2FkaW5nUmVzb3VyY2VNYW5hZ2VyVHJlZTsKLQotCXByaXZhdGUgTWFwIFVSSVRvVGVtcFVSSU1hcDsKLQotCXByaXZhdGUgVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlciBtYXJrZXJNYW5hbmdlcjsKLQotCXByaXZhdGUgVW5pcXVlRUxpc3QgcmVmcmVzaExpc3RlbmVyczsKLQotCXByaXZhdGUgSVVSSVByb3ZpZGVyIHVyaVByb3ZpZGVyOwotCi0JcHJpdmF0ZSBQYXRoIGNvbmZpZ0ZvbGRlclBhdGg7Ci0KLQlwcml2YXRlIFBhdGggbGliRm9sZGVyUGF0aDsKLQotCXByaXZhdGUgc3RhdGljIFhNTFJlc291cmNlLlhNTE1hcCBjcmVhdGVMb2FkWE1MTWFwKCkgewotCQlYTUxSZXNvdXJjZS5YTUxNYXAgeG1sTWFwID0gbmV3IFhNTE1hcEltcGwoKTsKLQkJU2V0IGV4Y2x1ZGVkQXR0cmlidXRlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWV4Y2x1ZGVkQXR0cmlidXRlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCkpOwotCQlleGNsdWRlZEF0dHJpYnV0ZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVDbGFzc2lmaWVycygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRUNsYXNzaWZpZXIgZUNsYXNzaWZpZXIgPSAoRUNsYXNzaWZpZXIpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVDbGFzc2lmaWVyIGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpIGVDbGFzc2lmaWVyOwotCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVDbGFzcy5nZXRFQXR0cmlidXRlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFQXR0cmlidXRlIGF0dHJpYiA9IChFQXR0cmlidXRlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmICghZXhjbHVkZWRBdHRyaWJ1dGVzLmNvbnRhaW5zKGF0dHJpYikpIHsKLQkJCQkJCVhNTFJlc291cmNlLlhNTEluZm8geG1sSW5mbyA9IG5ldyBYTUxJbmZvSW1wbCgpOwotCQkJCQkJeG1sSW5mby5zZXROYW1lKGF0dHJpYi5nZXROYW1lKCkpOwotCQkJCQkJeG1sSW5mbwotCQkJCQkJCQkuc2V0WE1MUmVwcmVzZW50YXRpb24oWE1MUmVzb3VyY2UuWE1MSW5mby5FTEVNRU5UKTsKLQkJCQkJCXhtbE1hcC5hZGQoYXR0cmliLCB4bWxJbmZvKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB4bWxNYXA7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzYXZlQXR0cmlidXRlQXNFbGVtZW50KEVDbGFzcyBlQ2xhc3MsCi0JCQlDb2xsZWN0aW9uIHNlbGVjdGVkRUNsYXNzZXMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0ZWRFQ2xhc3Nlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVDbGFzcyBiYXNlID0gKEVDbGFzcykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoYmFzZS5pc1N1cGVyVHlwZU9mKGVDbGFzcykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgWE1MUmVzb3VyY2UuWE1MTWFwIGNyZWF0ZVNhdmVYTUxNYXAoKSB7Ci0JCVhNTFJlc291cmNlLlhNTE1hcCB4bWxNYXAgPSBuZXcgWE1MTWFwSW1wbCgpOwotCQlTZXQgZXhjbHVkZWRBdHRyaWJ1dGVzID0gbmV3IEhhc2hTZXQoKTsKLQkJZXhjbHVkZWRBdHRyaWJ1dGVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0d1aWQoKSk7Ci0JCWV4Y2x1ZGVkQXR0cmlidXRlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0KLQkJLy8gc2VsZWN0IG9ubHkgQ29udGVudERlc2NyaXB0aW9uIGFuZCBTZWN0aW9uCi0JCVNldCBzZWxlY3RlZEVDbGFzc2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJc2VsZWN0ZWRFQ2xhc3Nlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlzZWxlY3RlZEVDbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN0aW9uKCkpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVDbGFzc2lmaWVycygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRUNsYXNzaWZpZXIgZUNsYXNzaWZpZXIgPSAoRUNsYXNzaWZpZXIpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVDbGFzc2lmaWVyIGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpIGVDbGFzc2lmaWVyOwotCi0JCQkJaWYgKHNhdmVBdHRyaWJ1dGVBc0VsZW1lbnQoZUNsYXNzLCBzZWxlY3RlZEVDbGFzc2VzKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKCFleGNsdWRlZEF0dHJpYnV0ZXMuY29udGFpbnMoYXR0cmliKSkgewotCQkJCQkJCVhNTFJlc291cmNlLlhNTEluZm8geG1sSW5mbyA9IG5ldyBYTUxJbmZvSW1wbCgpOwotCQkJCQkJCXhtbEluZm8uc2V0TmFtZShhdHRyaWIuZ2V0TmFtZSgpKTsKLQkJCQkJCQl4bWxJbmZvCi0JCQkJCQkJCQkuc2V0WE1MUmVwcmVzZW50YXRpb24oWE1MUmVzb3VyY2UuWE1MSW5mby5FTEVNRU5UKTsKLQkJCQkJCQl4bWxNYXAuYWRkKGF0dHJpYiwgeG1sSW5mbyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4geG1sTWFwOwotCX0KLQotCXB1YmxpYyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCW1hcmtlck1hbmFuZ2VyID0gbmV3IFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbChib29sZWFuIHJlcG9ydEVycm9yKSB7Ci0JCXRoaXMoKTsKLQkJbWFya2VyTWFuYW5nZXIuc2V0RW5hYmxlZChyZXBvcnRFcnJvcik7Ci0JfQotCi0JcHVibGljIFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIgZ2V0VW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcigpIHsKLQkJcmV0dXJuIG1hcmtlck1hbmFuZ2VyOwkJCi0JfQotCQotCXByb3RlY3RlZCBJVVJJUHJvdmlkZXIgZ2V0VVJJUHJvdmlkZXIoKSB7Ci0JCWlmKHVyaVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXVyaVByb3ZpZGVyID0gbmV3IEZpbGVQYXRoUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gdXJpUHJvdmlkZXI7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVSZXNvdXJjZUNoYW5nZShJUmVzb3VyY2Ugd3NSZXMpIHsKLQkJU3lzdGVtLm91dAotCQkJCS5wcmludGxuKCJNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuaGFuZGxlUmVzb3VyY2VDaGFuZ2UoKTogIiArIHdzUmVzLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZ2V0UmVzb3VyY2UoCi0JCQkJVVJJLmNyZWF0ZUZpbGVVUkkod3NSZXMuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKSwgZmFsc2UpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlBcnJheUxpc3QgcHJveGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlyZXNvdXJjZS5yZWxvYWQocHJveGllcyk7Ci0KLQkJCQkvLyBub3RpZnkgTUFLRV9QUk9YWSBldmVudCBmb3IgYWxsIHByb3hpZXMKLQkJCQkvLwotCQkJCU5vdGlmaWNhdGlvbiBtc2cgPSBuZXcgTm90aWZpY2F0aW9uSW1wbChFdmVudFR5cGVzLk1BS0VfUFJPWFksCi0JCQkJCQlmYWxzZSwgdHJ1ZSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJveGllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlvLmVOb3RpZnkobXNnKTsKLQkJCQl9Ci0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgTWFwIGdldExvYWRPcHRpb25zKCkgewotCQlNYXAgb3B0aW9ucyA9IHN1cGVyLmdldExvYWRPcHRpb25zKCk7Ci0JCW9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJb3B0aW9ucy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1hNTF9NQVAsIGNyZWF0ZUxvYWRYTUxNYXAoKSk7Ci0JCXJldHVybiBvcHRpb25zOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkgewotCQlpZiAoZGVmYXVsdFNhdmVPcHRpb25zID09IG51bGwpIHsKLQkJCWRlZmF1bHRTYXZlT3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlkZWZhdWx0U2F2ZU9wdGlvbnMucHV0QWxsKERFRkFVTFRfU0FWRV9PUFRJT05TKTsKLQkJfQotCi0JCXJldHVybiBkZWZhdWx0U2F2ZU9wdGlvbnM7Ci0JfQotCi0JcHJpdmF0ZSBSZXNvdXJjZSBnZXRNZXRob2RMaWJyYXJ5UmVzb3VyY2UoKSB7Ci0JCWlmIChnZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChSZXNvdXJjZSkgZ2V0UmVzb3VyY2VzKCkuZ2V0KDApOwotCX0KLQotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldE1ldGhvZExpYnJhcnkoKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZ2V0TWV0aG9kTGlicmFyeVJlc291cmNlKCk7Ci0JCXJldHVybiByZXNvdXJjZSA9PSBudWxsID8gbnVsbCA6IChNZXRob2RMaWJyYXJ5KSBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlTWFuYWdlciBnZXRSb290UmVzb3VyY2VNYW5hZ2VyKCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldE1ldGhvZExpYnJhcnlSZXNvdXJjZSgpOwotCQlyZXR1cm4gcmVzb3VyY2UgPT0gbnVsbCA/IG51bGwgOiBNdWx0aUZpbGVTYXZlVXRpbAotCQkJCS5nZXRSZXNvdXJjZU1hbmFnZXIocmVzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsI2dldFVSSUNvbnZlcnRlcigpCi0JICovCi0JcHVibGljIFVSSUNvbnZlcnRlciBnZXRVUklDb252ZXJ0ZXIoKSB7Ci0JCWlmICh1cmlDb252ZXJ0ZXIgPT0gbnVsbCkgewotCQkJdXJpQ29udmVydGVyID0gbmV3IE11bHRpRmlsZVVSSUNvbnZlcnRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gdXJpQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIHJlc291cmNlIHdpdGggdGhlIGdpdmVuIFVSSSBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIHVyaSkgewotCQlpZiAoZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlSZXNvdXJjZSByZXMgPSBudWxsOwotCQl0cnkgewotCQkJcmVzID0gc3VwZXIuZ2V0UmVzb3VyY2UodXJpLCBmYWxzZSk7Ci0JCQlpZiAocmVzID09IG51bGwpIHsKLQkJCQlNYXAgbWFwID0gZ2V0VVJJUmVzb3VyY2VNYXAoKTsKLQkJCQlyZXMgPSBjcmVhdGVSZXNvdXJjZSh1cmkpOwotCi0JCQkJdHJ5IHsKLQkJCQkJZGVtYW5kTG9hZEhlbHBlcihyZXMpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkvLyByZW1vdmUgdGhlIHJlc291cmNlIGZyb20gcmVzb3VyY2Ugc2V0IGlmIGl0IGNvdWxkIG5vdCBiZQotCQkJCQkvLyBsb2FkZWQKLQkJCQkJLy8KLQkJCQkJZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlcyk7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCi0JCQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQkJCW1hcC5wdXQodXJpLCByZXMpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5leGNlcHRpb24oKSBpbnN0YW5jZW9mIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbikgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJdGhyb3cgZTsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGwjZGVtYW5kTG9hZChvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVtYW5kTG9hZChSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIuZGVtYW5kTG9hZChyZXNvdXJjZSk7Ci0JCQotCQkvLyByZWZyZXNoIHdvcmtzcGFjZSByZXNvdXJjZSBvZiB0aGlzIHJlc291cmNlIHRvIG1ha2UgdGhlbSBzeW5jaHJvbml6ZWQKLQkJLy8KLQkJYm9vbGVhbiByZXQgPSBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlZnJlc2gocmVzb3VyY2UpOwotCQlpZihNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJaWYoIXJldCkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLmRlbWFuZExvYWQoKTogY291bGQgbm90IHJlZnJlc2ggcmVzb3VyY2UgIiArIHJlc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGwjZ2V0UmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSwKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCWlmIChnZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUodXJpKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVJlc291cmNlIHJlcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXMgPSBzdXBlci5nZXRSZXNvdXJjZSh1cmksIGxvYWRPbkRlbWFuZCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1zZyA9IG51bGw7Ci0JCQlpZiAoZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLQkJCQltc2cgPSBOTFMuYmluZCgKLQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLmxvYWRSZXNvdXJjZUVycm9yV2l0aFJlYXNvbl9tc2csCi0JCQkJCQkobmV3IE9iamVjdFtdIHsgdXJpLCBlLmdldE1lc3NhZ2UoKSB9KSk7Ci0JCQllbHNlCi0JCQkJbXNnID0gTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZFJlc291cmNlRXJyb3JfbXNnLCB1cmkpOwotCQkJaGFuZGxlRXhjZXB0aW9uKG1zZyk7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJdGhyb3cgZTsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlZnJlc2hMaXN0ZW5lcihJUmVmcmVzaExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChyZWZyZXNoTGlzdGVuZXJzID09IG51bGwpIHsKLQkJCXJlZnJlc2hMaXN0ZW5lcnMgPSBuZXcgVW5pcXVlRUxpc3QoKTsKLQkJfQotCQlyZWZyZXNoTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVmcmVzaExpc3RlbnRlcihJUmVmcmVzaExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChyZWZyZXNoTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCXJlZnJlc2hMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbG9hZHMgdGhlIGdpdmVuIHJlc291cmNlcwotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkgKiBAcmV0dXJuIHJlc291cmNlcyB0aGF0IGhhZCBiZWVuIHJlbG9hZGVkCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBDb2xsZWN0aW9uIHJlbG9hZFJlc291cmNlcyhDb2xsZWN0aW9uIHJlc291cmNlcykgewkJCi0JCS8vIHNhdmUgdGhlIFJlc291cmNlRGVzY3JpcHRvciBmb3IgdGhlIHJlc291cmNlcyB0byBjcmVhdGUgVVJJIGZvciB0aGVpcgotCQkvLyBwcm94aWVzIGFmdGVyIHVubG9hZAotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBpdGVyCi0JCQkJCS5uZXh0KCk7Ci0JCQkKLQkJCWlmKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIk11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5yZWxvYWRSZXNvdXJjZXMoKTogcmVzb3VyY2U9IiArIHJlc291cmNlICsgIiwgZWxlbWVudD0iICsgUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQkKLQkJCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJLmdldFJlc291cmNlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCQlpZiAocmVzRGVzYyAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2Uuc2V0UmVzb3VyY2VEZXNjcmlwdG9yKHJlc0Rlc2MpOwotCQkJfQotCQl9Ci0KLQkJQXJyYXlMaXN0IHJlbG9hZGVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlIYXNoU2V0IHByb3hpZXMgPSBuZXcgSGFzaFNldCgpOwotCQlBcnJheUxpc3QgcmVzb3VyY2VMaXN0ID0gbmV3IEFycmF5TGlzdChyZXNvdXJjZXMpOwotCi0JCVJlc291cmNlIGxpYlJlc291cmNlID0gZ2V0TWV0aG9kTGlicmFyeVJlc291cmNlKCk7Ci0JCWJvb2xlYW4gcmVsb2FkQWxsQ29uZmlncyA9IGZhbHNlOwotCQlpZiAocmVzb3VyY2VMaXN0LnJlbW92ZShsaWJSZXNvdXJjZSkpIHsKLQkJCS8vIE1ldGhvZExpYnJhcnkgcmVzb3VyY2UgaXMgdG8gcmVsb2FkLCBpdCBtdXN0IGJlIHJlbG9hZGVkIGZpcnN0Ci0JCQkvLwkJCQotCQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgbGliUmVzb3VyY2U7Ci0KLQkJCS8vIGNsZWFyIG1hcmtlcnMgZm9yIHRoaXMgcmVzb3VyY2UKLQkJCS8vCi0JCQltYXJrZXJNYW5hbmdlci5jbGVhck1hcmtlcnMocmVzb3VyY2UpOwotCi0JCQl0cnkgewotCQkJCWlmIChyZXNvdXJjZS5yZWxvYWQocHJveGllcykpIHsKLQkJCQkJcmVsb2FkZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQotCQkJCQkvLyByZXNldCB0aGUgcmVzb3VyY2UgbWFuYWdlciByZWZlcmVuY2UgaW4gVVJJQ29udmVydGVyIG9mCi0JCQkJCS8vIHRoaXMgcmVzb3VyY2Ugc2V0Ci0JCQkJCS8vIHNpbmNlIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGlzIHJlbG9hZGVkCi0JCQkJCS8vCi0JCQkJCU11bHRpRmlsZVVSSUNvbnZlcnRlciB1cmlDb252ZXJ0ZXIgPSAoTXVsdGlGaWxlVVJJQ29udmVydGVyKSBnZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQkJdXJpQ29udmVydGVyLnJlc01nciA9IG51bGw7Ci0JCQkJCQotCQkJCQlyZWxvYWRBbGxDb25maWdzID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCX0KLQotCQl9Ci0JCS8vIHJlbG9hZCB0aGUgcmVzb3VyY2VzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGl0ZXIKLQkJCQkJLm5leHQoKTsKLQotCQkJLy8gY2xlYXIgbWFya2VycyBmb3IgdGhpcyByZXNvdXJjZQotCQkJLy8KLQkJCW1hcmtlck1hbmFuZ2VyLmNsZWFyTWFya2VycyhyZXNvdXJjZSk7Ci0KLQkJCXRyeSB7Ci0JCQkJaWYgKHJlc291cmNlLnJlbG9hZChwcm94aWVzKSkgewotCQkJCQlyZWxvYWRlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFyZWxvYWRlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCS8vIHJlaW5pdGlhbGl6ZSB0aGUgcmVzb3VyY2Ugc2V0Ci0JCQkvLwotCQkJaW5pdGlhbGl6ZShyZWxvYWRBbGxDb25maWdzKTsKLQotCQkJLy8gbm90aWZ5IHRoZSBsaXN0ZW5lcnMKLQkJCS8vCi0JCQlpZiAocmVmcmVzaExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJSVJlZnJlc2hFdmVudCBldmVudCA9IG5ldyBSZWZyZXNoRXZlbnQocmVsb2FkZWRSZXNvdXJjZXMsCi0JCQkJCQlwcm94aWVzKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KHJlZnJlc2hMaXN0ZW5lcnMpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlSZWZyZXNoTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVJlZnJlc2hMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQkJCWxpc3RlbmVyLm5vdGlmeVJlZnJlc2hlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlbG9hZGVkUmVzb3VyY2VzOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoYm9vbGVhbiBsb2FkQ29uZmlndXJhdGlvbnMpIHsKLQkJLy8gbG9hZCB0aGUgUmVzb3VyY2VNYW5hZ2VyIHRyZWUgYW5kIG9wcG9zaXRlIGZlYXR1cmVzCi0JCS8vCi0JCWxvYWRSZXNvdXJjZU1hbmFnZXJUcmVlKCk7Ci0KLQkJc2V0Q29udGFpbmVyc09mTG9hZGVkRWxlbWVudHMoKTsKLQkJCi0JCWlmKGxvYWRDb25maWd1cmF0aW9ucykgewotCQkJbG9hZENvbmZpZ3VyYXRpb25zKCk7Ci0JCX0KLQotCQlsb2FkT3Bwb3NpdGVGZWF0dXJlcygpOwotCi0JCS8vIHJlc2V0IHRoZSByZXNvdXJjZSBtYW5hZ2VyIHJlZmVyZW5jZSBpbiBVUklDb252ZXJ0ZXIgb2YgdGhpcyByZXNvdXJjZQotCQkvLyBzZXQKLQkJLy8KLQkJTXVsdGlGaWxlVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9IChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIGdldFVSSUNvbnZlcnRlcigpOwotCQl1cmlDb252ZXJ0ZXIucmVzTWdyID0gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldENvbnRhaW5lcnNPZkxvYWRlZEVsZW1lbnRzKCkgewotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0Um9vdFJlc291cmNlTWFuYWdlcigpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihyZXNNZ3IsIGZhbHNlKSB7Ci0KLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjE3MjY5MTAxNzk4NzcwMjUwNkw7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IChSZXNvdXJjZU1hbmFnZXIpIG9iamVjdDsKLQkJCQlDb2xsZWN0aW9uIEdVSURzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlMaXN0IHN1Yk1ncnMgPSBuZXcgQXJyYXlMaXN0KHJlc01nci5nZXRTdWJNYW5hZ2VycygpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdWJNZ3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQl0cnkgewotCQkJCQkJSW50ZXJuYWxFT2JqZWN0IHN1Yk1nciA9IChJbnRlcm5hbEVPYmplY3QpIGl0ZXIKLQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCWlmIChzdWJNZ3IgIT0gbnVsbCAmJiAhc3ViTWdyLmVJc1Byb3h5KCkpIHsKLQkJCQkJCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KHN1Yk1nci5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJR1VJRHMuYWRkKGUuZ2V0R3VpZCgpKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aHJvdyBlOwotCQkJCQl9Ci0JCQkJfQotCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzTWdyLmVSZXNvdXJjZSgpOwotCQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBwYXJlbnQgPSBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0KLQkJCQkJLy8gcmVzb2x2ZSB0aGUgcHJveHkgb2YgdGhpcyBlbGVtZW50IGluIHRoZSBwYXJlbnQKLQkJCQkJLy8KLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwucmVzb2x2ZVByb3hpZXMoR1VJRHMsIHBhcmVudCk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHJlc01nci5nZXRTdWJNYW5hZ2VycygpLml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJZm9yICg7IGl0ZXJhdG9yLmhhc05leHQoKTsgaXRlcmF0b3IubmV4dCgpKQotCQkJOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gd29ya3NwYWNlIHJlc291cmNlIHJlcHJlc2VudHMgYSBsaWJyYXJ5IHJlc291cmNlCi0JICogCi0JICogQHBhcmFtIHdzUmVzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMaWJyYXJ5UmVzb3VyY2UoSVJlc291cmNlIHdzUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGxpYkZvbGRlclBhdGggIT0gbnVsbCAmJiBsaWJGb2xkZXJQYXRoLmlzUHJlZml4T2Yod3NSZXNvdXJjZS5nZXRMb2NhdGlvbigpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB3b3Jrc3BhY2UgcmVzb3VyY2UgaXMgYSBuZXcgcmVzb3VyY2UgdGhhdCBjYW4gYmUgbG9hZGVkIAotCSAqIHVzaW5nIHtAbGluayAjbG9hZE5ld1Jlc291cmNlcyhDb2xsZWN0aW9uKX0KLQkgKiAgCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmV3UmVzb3VyY2VUb0xvYWQoSVJlc291cmNlIHdzUmVzb3VyY2UpIHsKLQkJSVBhdGggbG9jID0gd3NSZXNvdXJjZS5nZXRMb2NhdGlvbigpOwotCQlyZXR1cm4gKGxvYyAhPSBudWxsICYmIGNvbmZpZ0ZvbGRlclBhdGggIT0gbnVsbCAKLQkJCQkmJiBNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0ZJTEVfRVhURU5TSU9OLmVxdWFsc0lnbm9yZUNhc2UoIi4iICsgbG9jLmdldEZpbGVFeHRlbnNpb24oKSkgLy8kTk9OLU5MUy0xJAotCQkJCSYmIGNvbmZpZ0ZvbGRlclBhdGguaXNQcmVmaXhPZihsb2MpCi0JCQkJJiYgIUZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuaXNUZWFtUHJpdmF0ZShsb2MudG9TdHJpbmcoKSkpOwotCi0JfQotCQotCS8qKgotCSAqIExvYWRzIG5ldyByZXNvdXJjZXMgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBjb2xsZWN0aW9uIG9mIHtAbGluayBJUmVzb3VyY2Ugd29yayBzcGFjZSByZXNvdXJjZXN9Ci0JICogaW50byB0aGlzIHJlc291cmNlIHNldAotCSAqIFRPRE86IG1lcmdlIHRoaXMgY29kZSB0byB7QGxpbmsgI2dldFJlc291cmNlKFVSSSwgYm9vbGVhbil9Ci0JICogQHBhcmFtIHdzUmVzb3VyY2VzIGNvbGxlY3Rpb24gb2Yge0BsaW5rIElSZXNvdXJjZX0gb2JqZWN0cwotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWROZXdSZXNvdXJjZXMoQ29sbGVjdGlvbiB3c1Jlc291cmNlcykgewotCQlBcnJheUxpc3QgbmV3Q29uZmlnRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHdzUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHdzUmVzb3VyY2UgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKHdzUmVzb3VyY2UgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQlJUmVzb3VyY2Ugd3NSZXMgPSAoSVJlc291cmNlKSB3c1Jlc291cmNlOwotCQkJCUlQYXRoIGxvYyA9IHdzUmVzLmdldExvY2F0aW9uKCk7Ci0JCQkJU3RyaW5nIGNvbmZpZ0ZpbGU7Ci0JCQkJaWYobG9jICE9IG51bGwgJiYgY29uZmlnRm9sZGVyUGF0aCAhPSBudWxsIAotCQkJCQkJJiYgTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTi5lcXVhbHNJZ25vcmVDYXNlKCIuIiArIGxvYy5nZXRGaWxlRXh0ZW5zaW9uKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSYmIGNvbmZpZ0ZvbGRlclBhdGguaXNQcmVmaXhPZihsb2MpCi0JCQkJCQkmJiAhRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc1RlYW1Qcml2YXRlKGNvbmZpZ0ZpbGUgPSBsb2MudG9TdHJpbmcoKSkpIHsKLQkJCQkJbmV3Q29uZmlnRmlsZXMuYWRkKGNvbmZpZ0ZpbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gbG9hZCBuZXcgY29uZmlndXJhdGlvbnMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3Q29uZmlnRmlsZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgY29uZmlnRmlsZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJbG9hZENvbmZpZ3VyYXRpb24obmV3IEZpbGUoY29uZmlnRmlsZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3BlY2lhbCBoYW5kbGluZyBmb3IgTWV0aG9kQ29uZmlndXJhdGlvbiBzaW5jZSBNZXRob2RMaWJyYXJ5IHdpbGwgbm8KLQkgKiBsb25nZXIga2VlcHMgdGhlIHJlZmVyZW5jZXMgdG8gTWV0aG9kQ29uZmlndXJhdGlvbnMgYW5kIHRoZWlyIGZpbGVzLiBBbnkKLQkgKiBYTUkgZmlsZSB1bmRlciBmb2xkZXIgLi9jb25maWd1cmF0aW9ucyBhbmQgaXRzIHN1YmZvbGRlcnMgd2lsbCBiZSB0cmVhdGVkCi0JICogYXMgYSBjb25maWd1cmF0aW9uIGZpbGUuIFRoZXkgd2lsbCBiZSBsb2FkZWQgYW5kIGFkZGVkIHRvIE1ldGhvZExpYnJhcnkKLQkgKiBhcyBpdHMgY29uZmlndXJhdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZENvbmZpZ3VyYXRpb25zKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGdldE1ldGhvZExpYnJhcnkoKTsKLQkJRmlsZSBjb25maWdEaXIgPSBuZXcgRmlsZShuZXcgRmlsZShsaWIuZVJlc291cmNlKCkuZ2V0VVJJKCkKLQkJCQkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpLAotCQkJCU11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FKTsKLQkJSXRlcmF0b3IgZGlySXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihjb25maWdEaXIsIGZhbHNlKSB7Ci0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI3NTg0MzYxOTMwMDA2NDA5MDdMOwotCi0JCQlGaWxlRmlsdGVyIGZpbHRlciA9IG5ldyBGaWxlRmlsdGVyKCkgewotCi0JCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKLQkJCQkJcmV0dXJuICFGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmlzVGVhbVByaXZhdGUocGF0aG5hbWUuZ2V0QWJzb2x1dGVQYXRoKCkpICYmCi0JCQkJCQkJKHBhdGhuYW1lLmlzRGlyZWN0b3J5KCkKLQkJCQkJCQl8fCBwYXRobmFtZS5nZXROYW1lKCkuZW5kc1dpdGgoCi0JCQkJCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0ZJTEVfRVhURU5TSU9OKSk7Ci0JCQkJfQotCi0JCQl9OwotCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCUZpbGVbXSBmaWxlcyA9ICgoRmlsZSkgb2JqZWN0KS5saXN0RmlsZXMoZmlsdGVyKTsKLQkJCQlpZiAoZmlsZXMgIT0gbnVsbCAmJiBmaWxlcy5sZW5ndGggPiAwKSB7Ci0JCQkJCXJldHVybiBBcnJheXMuYXNMaXN0KGZpbGVzKS5pdGVyYXRvcigpOwotCQkJCX0KLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJfQotCi0JCX07Ci0JCUhhc2hTZXQgY29uZmlnRmlsZXMgPSBuZXcgSGFzaFNldCgpOwotCQl3aGlsZSAoZGlySXRlci5oYXNOZXh0KCkpIHsKLQkJCUZpbGUgY29uZmlnRmlsZSA9IChGaWxlKSBkaXJJdGVyLm5leHQoKTsKLQkJCWlmKGNvbmZpZ0ZpbGUuaXNGaWxlKCkpIHsKLQkJCQljb25maWdGaWxlcy5hZGQoY29uZmlnRmlsZSk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdGVyLm5leHQoKTsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGNvbmZpZy5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlpZiAoY29uZmlnRmlsZXMuY29udGFpbnMoZmlsZSkpIHsKLQkJCQljb25maWdGaWxlcy5yZW1vdmUoZmlsZSk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb25maWdGaWxlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUZpbGUgZmlsZSA9IChGaWxlKSBpdGVyLm5leHQoKTsKLQkJCWxvYWRDb25maWd1cmF0aW9uKGZpbGUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxvYWRDb25maWd1cmF0aW9uKEZpbGUgY29uZmlnRmlsZSkgewotCQl0cnkgewotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkoY29uZmlnRmlsZS5nZXRDYW5vbmljYWxQYXRoKCkpOwotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBzdXBlci5nZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQkJbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLmFkZChlKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBUT0RPOiBtdXN0IGxvZyBlcnJvciBpbnRvIHByb2JsZW0gdmlldwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE86IG11c3QgbG9nIGVycm9yIGludG8gcHJvYmxlbSB2aWV3Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUV4Y2VwdGlvbihPYmplY3QgZXJyKSB7Ci0JCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZXJyKTsKLQkJaWYgKGVyciBpbnN0YW5jZW9mIEV4Y2VwdGlvbikgewotCQkJKChFeGNlcHRpb24pIGVycikucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZXJyLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCWlmICh1cmlDb252ZXJ0ZXIgaW5zdGFuY2VvZiBNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIHsKLQkJCSgoTXVsdGlGaWxlVVJJQ29udmVydGVyKSB1cmlDb252ZXJ0ZXIpLmRpc3Bvc2UoKTsKLQkJfQotCQl1cmlDb252ZXJ0ZXIgPSBudWxsOwotCQlib29sZWFuIG5vdGlmeSA9IGVEZWxpdmVyKCk7Ci0JCWJvb2xlYW4gcmVwb3J0RXJyb3IgPSBSRVBPUlRfRVJST1I7Ci0JCWJvb2xlYW4gcmVmcmVzaCA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5pc0VuYWJsZWQoKTsKLQkJdHJ5IHsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCVJFUE9SVF9FUlJPUiA9IGZhbHNlOwotCQkJbWFya2VyTWFuYW5nZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQltYXJrZXJNYW5hbmdlci5jbGVhckFsbCgpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KGdldFJlc291cmNlcygpKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCXRyeSB7Ci0JCQkJCXJlc291cmNlLnVubG9hZCgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3IgdW5sb2FkaW5nIHJlc291cmNlOiAiICsKLQkJCQkJLy8gcmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQotCQkJY2xlYXJFcnJvcnMoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWVTZXREZWxpdmVyKG5vdGlmeSk7Ci0JCQlSRVBPUlRfRVJST1IgPSByZXBvcnRFcnJvcjsKLQkJCW1hcmtlck1hbmFuZ2VyLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZChyZWZyZXNoKTsKLQkJfQotCi0JCWlmIChndWlkVG9NZXRob2RFbGVtZW50TWFwICE9IG51bGwpIHsKLQkJCWd1aWRUb01ldGhvZEVsZW1lbnRNYXAuY2xlYXIoKTsKLQkJfQotCi0JCWdldFJlc291cmNlcygpLmNsZWFyKCk7Ci0KLQkJaWYgKFVSSVRvVGVtcFVSSU1hcCAhPSBudWxsKSB7Ci0JCQlVUklUb1RlbXBVUklNYXAuY2xlYXIoKTsKLQkJfQotCi0JCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbC5jbGVhckRldGFjaGVkRU9iamVjdFRvSURNYXAoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJFcnJvcnMoKSB7Ci0JCS8vIGNsZWFyIGFsbCBtYXJrZXJzCi0JCW1hcmtlck1hbmFuZ2VyLmNsZWFyQWxsKCk7Ci0JfQotCi0JcHVibGljIE1ldGhvZExpYnJhcnkgbG9hZExpYnJhcnkoU3RyaW5nIHBhdGgpIHRocm93cyBFeGNlcHRpb24gewotCQlsb25nIGJlZ2luID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJcmVzZXQoKTsKLQotCQlsb25nIGFmdGVyUmVzZXQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCi0JCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNldCB0aW1lOiAiICsgKGFmdGVyUmVzZXQgLSBiZWdpbikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGxvYWRMaWJyYXJ5V2l0aG91dFJlc2V0KHBhdGgpOwotCi0JCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiTG9hZCB0aW1lOiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gYmVnaW4pKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkvLyBjaGVjayBpZiBhbnkgcmVzb3VyY2UgaXMgbWFya2VkIGFzIG1vZGlmaWVkIGFmdGVyIGxvYWRpbmcKLQkJCS8vCi0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIk1vZGlmaWVkIHJlc291cmNlcyBhZnRlciBsb2FkaW5nOiIpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChyZXNvdXJjZS5pc01vZGlmaWVkKCkpIHsKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCIgICIgKyByZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxpYjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFJlc291cmNlIGxvYWRMaWJyYXJ5UmVzb3VyY2UoU3RyaW5nIHBhdGgpIHsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKHBhdGgpOwotCQlSZXNvdXJjZSByZXMgPSBzdXBlci5nZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCQlpZiAoIXJlcy5nZXRFcnJvcnMoKS5pc0VtcHR5KCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzdHJCdWYuYXBwZW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLmxvYWRMaWJyYXJ5RXJyb3JfbXNnKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlcy5nZXRFcnJvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZS5EaWFnbm9zdGljIGVycm9yID0gKFJlc291cmNlLkRpYWdub3N0aWMpIGl0ZXIKLQkJCQkJCS5uZXh0KCk7Ci0JCQkJc3RyQnVmLmFwcGVuZChOTFMuYmluZCgKLQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLmxvYWRMaWJyYXJ5RXJyb3JfZGV0YWlscywKLQkJCQkJCShuZXcgT2JqZWN0W10geyBTdHJpbmcudmFsdWVPZihlcnJvci5nZXRMaW5lKCkpLAotCQkJCQkJCQlTdHJpbmcudmFsdWVPZihlcnJvci5nZXRDb2x1bW4oKSksCi0JCQkJCQkJCWVycm9yLmdldE1lc3NhZ2UoKSB9KSkpOwotCQkJfQotCQkJU3RyaW5nIG1zZyA9IHN0ckJ1Zi50b1N0cmluZygpOwotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhtc2cpOwotCQkJaWYoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGxvYWRMaWJyYXJ5V2l0aG91dFJlc2V0KFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbG9hZGluZyA9IHRydWU7Ci0KLQkJLy8gbm8gcmVmcmVzaCBkdXJpbmcgbG9hZGluZwotCQkvLwotCQlib29sZWFuIGIgPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuaXNFbmFibGVkKCk7Ci0JCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc2V0KCk7Ci0JCXRyeSB7CQkKLQkJCUZpbGUgbGliRmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotCQkJY29uZmlnRm9sZGVyUGF0aCA9IG5ldyBQYXRoKG5ldyBGaWxlKGxpYkZpbGUuZ2V0UGFyZW50RmlsZSgpLAotCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5NRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQkJCWxpYkZvbGRlclBhdGggPSBuZXcgUGF0aChsaWJGaWxlLmdldFBhcmVudEZpbGUoKS5nZXRDYW5vbmljYWxQYXRoKCkpOwotCQkJUmVzb3VyY2UgcmVzID0gbG9hZExpYnJhcnlSZXNvdXJjZShsaWJGaWxlLmdldENhbm9uaWNhbFBhdGgoKSk7IAotCQkJdHJ5IHsKLQkJCQlpbml0aWFsaXplKHRydWUpOwotCQkJCQotCQkJCS8vIFNldCBtb2RpZmllZCBmbGFnIG9mIGxpYnJhcnkgcmVzb3VyY2UgdG8gZmFsc2UgaW4gY2FzZSBpdCBoYWQgYmVlbiBtb2RpZmllZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24KLQkJCQkvLwotCQkJCWlmKHJlcyAhPSBudWxsKSB7Ci0JCQkJCXJlcy5zZXRNb2RpZmllZChmYWxzZSk7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihOTFMuYmluZCgKLQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLmludmFsaWRMaWJyYXJ5RmlsZUVycm9yX21zZywgcGF0aCkpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQoYik7Ci0KLQkJCWxvYWRpbmcgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWRzIG9wcG9zaXRlIGZlYXR1cmVzIGZvciBhbGwgbG9hZGVkIG9iamVjdHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoKSB7Ci0JCUFycmF5TGlzdCBvcHBvc2l0ZUZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcygpCi0JCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9IChPcHBvc2l0ZUZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCW9wcG9zaXRlRmVhdHVyZXMuYWRkKG9wcG9zaXRlRmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQkJbG9hZE9wcG9zaXRlRmVhdHVyZXMob3Bwb3NpdGVGZWF0dXJlcyk7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgUmVzb3VyY2VNYW5hZ2VyIHRyZWUgb2YgdGhlIG9wZW4gbGlicmFyeSBhbmQgY29ubmVjdCBhbnkgbG9hZGVkCi0JICogTWV0aG9kVW5pdCB0byB0aGUgbGlicmFyeSB0cmVlIGFzIHdlbGwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRSZXNvdXJjZU1hbmFnZXJUcmVlKCkgewotCQlsb25nIGJlZ2luID0gMDsKLQkJCi0JCWlmKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQliZWdpbiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0KLQkJLy8gZGlzYWJsZSBsb2dnaW5nIHVucmVzb2x2ZWQgcHJveGllcyBkdXJpbmcgbG9hZGluZyByZXNvdXJjZSBtYW5hZ2VyCi0JCS8vIHRyZWUKLQkJLy8KLQkJbWFya2VyTWFuYW5nZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJTXVsdGlGaWxlVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9IChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIGdldFVSSUNvbnZlcnRlcigpOwotCQl0cnkgewotCQkJLy8gdGhpcyBwcmV2ZW50cyB1cmlDb252ZXJ0ZXIgZnJvbSBsb2FkaW5nIHJlc291cmNlcyB3aGlsZQotCQkJLy8gbm9ybWFsaXppbmcgVVJJCi0JCQkvLwotCQkJdXJpQ29udmVydGVyLnNldFJlc29sdmVQcm94eShmYWxzZSk7Ci0KLQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSb290UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihyZXNNZ3IsIGZhbHNlKSB7Ci0KLQkJCQkvKioKLQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCSAqLwotCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIxNzI2OTEwMTc5ODc3MDI1MDZMOwotCi0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IChSZXNvdXJjZU1hbmFnZXIpIG9iamVjdDsKLQkJCQkJcmV0dXJuIHJlc01nci5nZXRTdWJNYW5hZ2VycygpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCi0JCQl9OwotCQkJbG9hZGluZ1Jlc291cmNlTWFuYWdlclRyZWUgPSB0cnVlOwotCQkJZm9yICg7IGl0ZXJhdG9yLmhhc05leHQoKTsgaXRlcmF0b3IubmV4dCgpKQotCQkJCTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1hcmtlck1hbmFuZ2VyLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl1cmlDb252ZXJ0ZXIuc2V0UmVzb2x2ZVByb3h5KHRydWUpOwotCQkJbG9hZGluZ1Jlc291cmNlTWFuYWdlclRyZWUgPSBmYWxzZTsKLQotCQkJLy8gUmVwb3J0aW5nIG9mIHVubm9ybWFsaXplZCBVUklzIHdhcyBkaXNhYmxlZCB3aGlsZSBsb2FkaW5nCi0JCQkvLyByZXNvdXJjZSBtYW5hZ2VyIHRyZWUuIE5vdyB3ZSBuZWVkCi0JCQkvLyB0byBnbyB0aHJ1IGFsbCB0aGUgbG9hZGVkIG9iamVjdHMgdG8gZmluZCBwcm94aWVzIHdpdGgKLQkJCS8vIHVubm9ybWFsaXplZCBVUklzIGFuZCByZXBvcnQgdGhlbQotCQkJLy8KLQkJCXRyeSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkudmFsdWVzKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUludGVybmFsRU9iamVjdCBvID0gKEludGVybmFsRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChvLmVJc1Byb3h5KCkgJiYgby5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJCQkJVVJJIHVyaSA9IG8uZVByb3h5VVJJKCk7Ci0JCQkJCQlVUkkgbm9ybWFsaXplZFVSSSA9IGdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpOwotCQkJCQkJaWYgKG5vcm1hbGl6ZWRVUkkgPT0gbnVsbCkgewotCQkJCQkJCS8vIHRoaXMgY2FsbCB3aWxsIGxvZyBlcnJvciBhYm91dCB1bnJlc29sdmVkIHByb3h5Ci0JCQkJCQkJLy8KLQkJCQkJCQkoKEludGVybmFsRU9iamVjdCkgby5lQ29udGFpbmVyKCkpLmVSZXNvbHZlUHJveHkobyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCQotCQkJaWYoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLmxvYWRSZXNvdXJjZU1hbmFnZXJUcmVlKCk6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWdpbikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2VNYW5hZ2VyIGdldFJlc291cmNlTWFuYWdlcigpIHsKLQkJcmV0dXJuICgoTXVsdGlGaWxlVVJJQ29udmVydGVyKSBnZXRVUklDb252ZXJ0ZXIoKSkuZ2V0UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVPYmplY3QgZmluZEVPYmplY3RJblVubG9hZGVkUmVzb3VyY2VzKFN0cmluZyBpZCkgewotCQlyZXR1cm4gZmluZEVPYmplY3RJblVubG9hZGVkUmVzb3VyY2VzKGdldFJlc291cmNlTWFuYWdlcigpLCBpZCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGZpbmRFT2JqZWN0SW5VbmxvYWRlZFJlc291cmNlcyhSZXNvdXJjZU1hbmFnZXIgcmVzTWdyLAotCQkJU3RyaW5nIGlkKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBzdXBlci5nZXRSZXNvdXJjZShkZXNjLmdldFJlc29sdmVkVVJJKCksIGZhbHNlKTsKLQkJCWlmIChyZXNvdXJjZSA9PSBudWxsIHx8ICFyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzb3VyY2UgPSBzdXBlci5nZXRSZXNvdXJjZShkZXNjLmdldFJlc29sdmVkVVJJKCksIHRydWUpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vCi0JCQkJfQotCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCUVPYmplY3QgZU9iamVjdCA9IHJlc291cmNlLmdldEVPYmplY3QoaWQpOwotCQkJCQlpZiAoZU9iamVjdCAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gZU9iamVjdDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IGZpbmRFT2JqZWN0SW5VbmxvYWRlZFJlc291cmNlcygKLQkJCQkJKFJlc291cmNlTWFuYWdlcikgaXRlci5uZXh0KCksIGlkKTsKLQkJCWlmIChlT2JqZWN0ICE9IG51bGwpCi0JCQkJcmV0dXJuIGVPYmplY3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gaWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRFT2JqZWN0KFN0cmluZyBpZCkgewotCQkvLyBmaXJzdCwgdHJ5IHRvIGdldCB0aGUgb2JqZWN0IGZyb20gdGhlIGNhY2hlIGd1aWRUb01ldGhvZEVsZW1lbnQKLQkJLy8KLQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGdldEd1aWRUb01ldGhvZEVsZW1lbnRNYXAoKS5nZXQoaWQpOwotCQlpZiAoZU9iamVjdCAhPSBudWxsKQotCQkJcmV0dXJuIGVPYmplY3Q7Ci0KLQkJVVJJIHVyaSA9IE11bHRpRmlsZVVSSUNvbnZlcnRlci5jcmVhdGVVUkkoaWQpLmFwcGVuZEZyYWdtZW50KGlkKTsKLQkJVVJJIG5vcm1hbGl6ZWQgPSBnZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUodXJpKTsKLQkJaWYgKG5vcm1hbGl6ZWQgPT0gbnVsbCkgewotCQkJLy8gdGhlIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBpZCBtaWdodCBub3QgaGF2ZSBkaXJlY3QgcmVzb3VyY2UsCi0JCQkvLyBoZW5jZSwgaXQgZG9lcyBub3QgaGF2ZQotCQkJLy8gaXRzIG93biBSZXNvdXJjZURlc2NyaXB0b3IgaW4gUmVzb3VyY2VNYW5hZ2VyIHRyZWUuCi0JCQkvLyBnbyB0aHJ1IGFsbCB1bmxvYWRlZCByZXNvdXJjZXMsIGxvYWQgdGhlbSwgYW5kIHRyeSB0byBmaW5kIHRoZQotCQkJLy8gb2JqZWN0IHdpdGggdGhlIGdpdmVuIGlkLgotCQkJLy8KLQkJCWVPYmplY3QgPSBmaW5kRU9iamVjdEluVW5sb2FkZWRSZXNvdXJjZXMoaWQpOwotCQkJaWYgKGVPYmplY3QgPT0gbnVsbCAmJiBSRVBPUlRfRVJST1IpIHsKLQkJCQloYW5kbGVFeGNlcHRpb24oTkxTLmJpbmQoCi0JCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5vYmpOb3RGb3VuZEVycm9yX21zZywgaWQpKTsKLQkJCX0KLQkJCXJldHVybiBlT2JqZWN0OwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRFT2JqZWN0KHVyaSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCNnZXRFT2JqZWN0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJcmV0dXJuIGdldEVPYmplY3QobnVsbCwgdXJpLCBsb2FkT25EZW1hbmQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0I2NyZWF0ZVJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJUmVzb3VyY2UgcmVzdWx0ID0gZG9DcmVhdGVSZXNvdXJjZSh1cmkpOwotCQlyZXN1bHQuc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JCWdldFJlc291cmNlcygpLmFkZChyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZG9DcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCXJldHVybiBuZXcgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKHVyaSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBiYWNrdXBSZXF1aXJlZChNYXAgb3B0aW9ucykgewotCQlCb29sZWFuIGJhY2t1cCA9IChCb29sZWFuKSBvcHRpb25zCi0JCQkJLmdldChNdWx0aUZpbGVYTUlTYXZlSW1wbC5CQUNLX1VQX0JFRk9SRV9TQVZFKTsKLQkJcmV0dXJuIGJhY2t1cCAhPSBudWxsICYmIGJhY2t1cC5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYmFja3VwKFJlc291cmNlIHJlcykgewotCQl0cnkgewotCQkJaWYgKHJlcy5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm47Ci0JCQlPYmplY3Qgb2JqZWN0ID0gcmVzLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeQotCQkJCQl8fCBvYmplY3QgaW5zdGFuY2VvZiBSZXNvdXJjZU1hbmFnZXIgfHwgb2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkKLQkJCQlyZXR1cm47Ci0KLQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IGdldE1ldGhvZExpYnJhcnkoKTsKLQkJCVN0cmluZyBiYWNrdXBEaXIgPSBuZXcgRmlsZShsaWJyYXJ5LmVSZXNvdXJjZSgpLmdldFVSSSgpCi0JCQkJCS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCkKLQkJCQkJKyBGaWxlLnNlcGFyYXRvciArICIuYmFrIjsgLy8kTk9OLU5MUy0xJAotCQkJU2ltcGxlRGF0ZUZvcm1hdCBkYXRlRm9ybWF0dGVyID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoCi0JCQkJCSJ5eU1NZGRISG1tc3MuUyIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocmVzID09IGxpYnJhcnkuZVJlc291cmNlKCkpIHsKLQkJCQlEYXRlRm9ybWF0LmdldEluc3RhbmNlKCkuZm9ybWF0KAotCQkJCQkJQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lKCkpOwotCQkJCUZpbGUgYmFja3VwRmlsZSA9IG5ldyBGaWxlKGJhY2t1cERpciwKLQkJCQkJCU11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfTElCUkFSWV9NT0RFTF9GSUxFTkFNRQotCQkJCQkJCQkrICdfJwotCQkJCQkJCQkrIGRhdGVGb3JtYXR0ZXIuZm9ybWF0KENhbGVuZGFyLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkuZ2V0VGltZSgpKSk7Ci0JCQkJaWYgKCFiYWNrdXBGaWxlLmdldFBhcmVudEZpbGUoKS5leGlzdHMoKSkgewotCQkJCQliYWNrdXBGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQkJCQl9Ci0JCQkJRmlsZVV0aWwubW92ZUZpbGUobmV3IEZpbGUocmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKSwgYmFja3VwRmlsZSk7Ci0JCQl9IGVsc2UgewotCQkJCVN0cmluZyByZWxhdGl2ZVBhdGggPSByZXMuZ2V0VVJJKCkuZGVyZXNvbHZlKAotCQkJCQkJbGlicmFyeS5lUmVzb3VyY2UoKS5nZXRVUkkoKSkudG9GaWxlU3RyaW5nKCk7Ci0JCQkJRmlsZSBiYWNrdXBGaWxlID0gbmV3IEZpbGUoYmFja3VwRGlyLCByZWxhdGl2ZVBhdGgKLQkJCQkJCSsgJ18nCi0JCQkJCQkrIGRhdGVGb3JtYXR0ZXIKLQkJCQkJCQkJLmZvcm1hdChDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWUoKSkpOwotCQkJCWlmICghYmFja3VwRmlsZS5nZXRQYXJlbnRGaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQkJYmFja3VwRmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQkJfQotCQkJCUZpbGVVdGlsLm1vdmVGaWxlKG5ldyBGaWxlKHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSksIGJhY2t1cEZpbGUpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJaGFuZGxlRXhjZXB0aW9uKE5MUy5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLmJhY2t1cEVycm9yX21zZywgcmVzKSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZVVSSU1hcHBpbmdzKEVPYmplY3QgZU9iaiwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZU1hbmFnZXIoZU9iagotCQkJCS5lUmVzb3VyY2UoKSk7Ci0JCWlmIChyZXNNZ3IgIT0gbnVsbCAmJiByZXNNZ3IuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCUVjb3JlVXRpbC5yZW1vdmUocmVzTWdyKTsKLQkJfQotCQlyZXNNZ3IgPSBnZXRSb290UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCWlmKHJlc01nciAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IE11bHRpRmlsZVNhdmVVdGlsLmZpbmRSZXNvdXJjZURlc2NyaXB0b3IoCi0JCQkJCXJlc01nciwgTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0R3VpZChlT2JqKSwKLQkJCQkJbnVsbCwgdHJ1ZSk7Ci0JCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwgJiYgZGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChkZXNjLmVSZXNvdXJjZSgpKTsKLQkJCQl9Ci0JCQkJRWNvcmVVdGlsLnJlbW92ZShkZXNjKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFuVXAoUmVzb3VyY2UgcmVtb3ZlZFJlc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQljbGVhblVwKHJlbW92ZWRSZXNvdXJjZSwgbnVsbCk7Ci0JfQotCi0JLy8gcHJvdGVjdGVkIHZvaWQgY2xlYW5VcChFT2JqZWN0IG9iaiwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JLy8gdHJ5IHsKLQkvLyAvLyByZW1vdmUgYWxsIHRoZSBVUkkgbWFwcGluZ3MKLQkvLyAvLwotCS8vIHJlbW92ZVVSSU1hcHBpbmdzKG9iaiwgbW9kaWZpZWRSZXNvdXJjZXMpOwotCS8vIH0KLQkvLyBmaW5hbGx5IHsKLQkvLyBSZXNvdXJjZSByZXNvdXJjZSA9IG9iai5lUmVzb3VyY2UoKTsKLQkvLyBpZihyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldENvbnRlbnRzKCkuY29udGFpbnMob2JqKSkgewotCS8vIHJlc291cmNlLnVubG9hZCgpOwotCS8vIGdldFJlc291cmNlcygpLnJlbW92ZShyZXNvdXJjZSk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0KLQl2b2lkIGNsZWFuVXAoUmVzb3VyY2UgcmVtb3ZlZFJlc291cmNlLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8KLQkJCWlmIChyZW1vdmVkUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCQlyZW1vdmVkUmVzb3VyY2UudW5sb2FkKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVtb3ZlZFJlc291cmNlLmxvYWQobnVsbCk7Ci0JCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gdGhlIGZpbGUgbWlnaHQgYWxyZWFkeSBiZSBkZWxldGVkLCBtb3ZlZCBvciBuZXZlcgotCQkJCQkvLyBjcmVhcmVkLgotCQkJCQkvLwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQlFT2JqZWN0IG9iaiA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlbW92ZWRSZXNvdXJjZSk7Ci0KLQkJCS8vIGlmKG9iaiA9PSBudWxsKSByZXR1cm47Ci0JCQkvLyBib29sZWFuIGNsZWFuRm9sZGVyOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkvLyBjbGVhbkZvbGRlciA9IHRydWU7Ci0JCQkvLyB9Ci0JCQkvLyBlbHNlIHsKLQkJCS8vIGNsZWFuRm9sZGVyID0gZmFsc2U7Ci0JCQkvLyB9Ci0KLQkJCS8vIE11bHRpRmlsZVVSSUNvbnZlcnRlciB1bWFVcmlDb252ZXJ0ZXIgPQotCQkJLy8gKChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpZ2V0VVJJQ29udmVydGVyKCkpOwotCQkJLy8gdW1hVXJpQ29udmVydGVyLmdldFJlc291cmNlTWFuYWdlcigpLnJlbW92ZVJlc291cmNlRGVzY3JpcHRvcihyZW1vdmVkUmVzb3VyY2UuZ2V0VVJJKCksCi0JCQkvLyBjbGVhbkZvbGRlcik7Ci0KLQkJCS8vIHJlbW92ZSBhbGwgdGhlIFVSSSBtYXBwaW5ncwotCQkJLy8KLQkJCXJlbW92ZVVSSU1hcHBpbmdzKG9iaiwgbW9kaWZpZWRSZXNvdXJjZXMpOwotCi0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJLy8gY2xlYW5VcFJlc291cmNlRGVzY3JpcHRvcnMoKFByb2Nlc3NQYWNrYWdlKW9iaik7Ci0JCQkvLyB9Ci0KLQkJCXJlbW92ZWRSZXNvdXJjZS51bmxvYWQoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWdldFJlc291cmNlcygpLnJlbW92ZShyZW1vdmVkUmVzb3VyY2UpOwotCQkJVVJJIG9sZFVSSSA9ICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZW1vdmVkUmVzb3VyY2UpCi0JCQkJCS5nZXRPbGRVUkkoKTsKLQkJCWlmIChvbGRVUkkgIT0gbnVsbCkgewotCQkJCWdldFVSSVRvVGVtcFVSSU1hcCgpLnJlbW92ZShvbGRVUkkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFuVXAoUHJvY2Vzc1BhY2thZ2UgcHJvY1BrZykgewotCQkvLyByZW1vdmUgQ29udGVudERlc2NyaXB0aW9uIG9mIGFsbCBQcm9jZXNzRWxlbWVudHMgaW4gdGhpcwotCQkvLyBQcm9jZXNzUGFja2FnZQotCQkvLwotCQlyZW1vdmVDb250ZW50RGVzY3JpcHRpb25zKHByb2NQa2cpOwotCi0JCUVjb3JlVXRpbC5yZW1vdmUocHJvY1BrZyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2NQa2cKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQ29udGVudERlc2NyaXB0aW9ucyhQcm9jZXNzUGFja2FnZSBwcm9jUGtnKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHByb2NQa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlQcm9jZXNzRWxlbWVudCBlbGVtZW50ID0gKFByb2Nlc3NFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihlbGVtZW50KQotCQkJCQkmJiBlbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQlyZW1vdmVQcmVzZW50YXRpb24oZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9jUGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBwa2cgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChwa2cgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCXJlbW92ZUNvbnRlbnREZXNjcmlwdGlvbnMoKFByb2Nlc3NQYWNrYWdlKSBwa2cpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJlc2VudGF0aW9uKFByb2Nlc3NFbGVtZW50IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpOwotCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLnJlbW92ZShlbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2F2ZShDb2xsZWN0aW9uIHJlc291cmNlcywgTWFwIG9wdGlvbnMsIGJvb2xlYW4gcHJlcGFyZVNhdmUpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCkgewotCQkJb3B0aW9ucyA9IGdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQl9Ci0KLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJb3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VULAotCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJdHJ5IHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCXNhdmUocmVzLCBvcHRpb25zLCBwcmVwYXJlU2F2ZSk7Ci0JCQl9Ci0JCQlzYXZlTW9kaWZpZWRSZXNvdXJjZXMob3B0aW9ucyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBmaW5hbGx5IHsKLQkJCW9wdGlvbnMucmVtb3ZlKE11bHRpRmlsZVhNSVNhdmVJbXBsLk1PRElGSUVEX1JFU09VUkNFX1NFVCk7Ci0JCX0KLQl9Ci0KLQlib29sZWFuIHNhdmUoUmVzb3VyY2UgcmVzLCBNYXAgb3B0aW9ucywgYm9vbGVhbiBwcmVwYXJlU2F2ZSkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSAoU2V0KSBvcHRpb25zCi0JCQkJLmdldChNdWx0aUZpbGVYTUlTYXZlSW1wbC5NT0RJRklFRF9SRVNPVVJDRV9TRVQpOwotCQlUeFJlY29yZCB0eFJlY29yZCA9IChUeFJlY29yZCkgb3B0aW9ucwotCQkJCS5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuVFhfUkVDT1JEKTsKLQkJTGlzdCByZXNvdXJjZXNUb0NvbW1pdCA9IHR4UmVjb3JkICE9IG51bGwgPyB0eFJlY29yZAotCQkJCS5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpIDogbnVsbDsKLQotCQl0cnkgewotCQkJTWV0aG9kRWxlbWVudCBlT2JqID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzKTsKLQkJCWlmIChlT2JqICE9IG51bGwpIHsKLQkJCQlpZiAocHJlcGFyZVNhdmUpIHsKLQkJCQkJaWYgKGVPYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQlQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wID0gKFByb2Nlc3NDb21wb25lbnQpIGVPYmo7Ci0JCQkJCQlSZXNvdXJjZSBjb250ZW50ID0gcHJvY0NvbXAuZ2V0UHJvY2VzcygpICE9IG51bGwKLQkJCQkJCQkJJiYgQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotCQkJCQkJCQkJCS5oYXNQcmVzZW50YXRpb24ocHJvY0NvbXAuZ2V0UHJvY2VzcygpKSA/IHByb2NDb21wCi0JCQkJCQkJCS5nZXRQcm9jZXNzKCkuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCkKLQkJCQkJCQkJOiBudWxsOwotCQkJCQkJYm9vbGVhbiBhbHJlYWR5TW9kaWZpZWQgPSBjb250ZW50ICE9IG51bGwKLQkJCQkJCQkJJiYgY29udGVudC5pc01vZGlmaWVkKCk7Ci0JCQkJCQlwcmVwYXJlU2F2ZShwcm9jQ29tcCk7Ci0JCQkJCQlpZiAoY29udGVudCAhPSBudWxsICYmIGNvbnRlbnQuaXNNb2RpZmllZCgpCi0JCQkJCQkJCSYmICFhbHJlYWR5TW9kaWZpZWQpIHsKLQkJCQkJCQkvLyBjb250ZW50IGlzIG1vZGlmaWVkIGFzIHJlc3VsdCBvZiBwcmVwYXJlU2F2ZSgpLAotCQkJCQkJCS8vIGl0IG5lZWRzIHRvIGJlIHNhdmVkIGFmdGVyIG1vZGVsIGlzIHNhdmVkCi0JCQkJCQkJLy8KLQkJCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoY29udGVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoZU9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuYWRkUmVzb3VyY2VNYW5hZ2VyKHJlcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHJlcy5pc01vZGlmaWVkKCkpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLS0tPiBTdGFydCBzYXZpbmcgIiArIHJlcyk7Ci0JCQkJCWJvb2xlYW4gYmFja3VwUmVxdWlyZWQgPSBiYWNrdXBSZXF1aXJlZChvcHRpb25zKTsKLQkJCQkJaWYgKGJhY2t1cFJlcXVpcmVkKSB7Ci0JCQkJCQkvLyBiYWNrIHVwIHJlc291cmNlIGJlZm9yZSBzYXZpbmcKLQkJCQkJCS8vCi0JCQkJCQliYWNrdXAocmVzKTsKLQkJCQkJfQotCi0JCQkJCWlmIChyZXNvdXJjZXNUb0NvbW1pdCAhPSBudWxsKSB7Ci0JCQkJCQkoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzKS5zZXRUZW1wVVJJKHR4UmVjb3JkCi0JCQkJCQkJCS5nZXRUeElEKCkpOwotCQkJCQkJcmVzb3VyY2VzVG9Db21taXQuYWRkKHJlcyk7Ci0JCQkJCX0KLQotCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5zYXZlKHJlcywgb3B0aW9ucyk7Ci0KLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCI8LS0tLSBTYXZlZCByZXNvdXJjZTogIiArIHJlcyk7Ci0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCXRocm93IGV4Y2VwdGlvbjsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIGEgcmVzb3VyY2Ugb2YgdGhpcyByZXNvdXJjZSBzZXQgd2l0aCB0aGUgZ2l2ZW4gc2F2ZSBvcHRpb25zCi0JICogCi0JICogQHBhcmFtIHJlcwotCSAqIEBwYXJhbSBvcHRpb25zCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBpcyBhdCBsZWFzdCBhIHJlc291cmNlIGhhcyBiZWVuIHNhdmVkIGluIHRoaXMgY2FsbAotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2F2ZShSZXNvdXJjZSByZXMsIE1hcCBvcHRpb25zKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQkvLyBjbGVhciBhbGwgZXJyb3IgbWFya2VycyBmb3IgdGhpcyByZXNvdXJjZQotLy8JCS8vCi0vLwkJbWFya2VyTWFuYW5nZXIuY2xlYXJNYXJrZXJzKHJlcyk7Ci0KLQkJaWYgKHJlcyA9PSBudWxsIHx8IHJlcy5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAob3B0aW9ucyA9PSBudWxsKSB7Ci0JCQlvcHRpb25zID0gZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCk7Ci0JCX0KLQotCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlvcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5NT0RJRklFRF9SRVNPVVJDRV9TRVQsCi0JCQkJbW9kaWZpZWRSZXNvdXJjZXMpOwotCQlib29sZWFuIG5vdEZhaWxTYWZlID0gb3B0aW9ucy5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuVFhfUkVDT1JEKSA9PSBudWxsOwotCQl0cnkgewotCQkJQ29sbGVjdGlvbiBzYXZlZFJlc291cmNlcyA9IG51bGw7Ci0JCQlpZihub3RGYWlsU2FmZSkgewotCQkJCXNhdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJfQotCQkJYm9vbGVhbiByZXQgPSBzYXZlKHJlcywgb3B0aW9ucywgdHJ1ZSk7Ci0JCQlpZihyZXQgJiYgbm90RmFpbFNhZmUpIHsKLQkJCQlzYXZlZFJlc291cmNlcy5hZGQocmVzKTsKLQkJCX0KLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IHNhdmVNb2RpZmllZFJlc291cmNlcyhvcHRpb25zKTsKLQkJCWlmKCFjb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCXJldCA9IHRydWU7Ci0JCQkJaWYobm90RmFpbFNhZmUpIHsKLQkJCQkJc2F2ZWRSZXNvdXJjZXMuYWRkQWxsKGNvbGxlY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYobm90RmFpbFNhZmUgJiYgcmV0KSB7Ci0JCQkJLy8gdXBkYXRlIHJlc291cmNlIGNhY2hlZCB0aW1lc3RhbXBzCi0JCQkJLy8KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzYXZlZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IHJlc291cmNlID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQkJCQkoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXNvdXJjZSkudXBkYXRlVGltZVN0YW1wcygpOwotCQkJCQl9Ci0JCQkJfQkJCQkJCQkJCi0JCQl9Ci0JCQkKLQkJCXJldHVybiByZXQ7Ci0JCX0gZmluYWxseSB7Ci0JCQlvcHRpb25zLnJlbW92ZShNdWx0aUZpbGVYTUlTYXZlSW1wbC5NT0RJRklFRF9SRVNPVVJDRV9TRVQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgb25seSB0aGUgbW9kaWZpZWQgcmVzb3VyY2VzIGluIHRoaXMgcmVzb3VyY2Ugc2V0LgotCSAqIAotCSAqIEBwYXJhbSBvcHRpb25zCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShNYXAgb3B0aW9ucykgdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlzYXZlKG9wdGlvbnMsIGZhbHNlLCB0cnVlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0JCQkJdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pZTsKLQkJCX0KLQkJCXRocm93IG5ldyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqIEByZXR1cm4gcmVzb3VyY2VzIHRoYXQgaGFkIGJlZW4gc2F2ZWQgYnkgdGhpcyBjYWxsCi0JICovCi0JQ29sbGVjdGlvbiBzYXZlTW9kaWZpZWRSZXNvdXJjZXMoTWFwIG9wdGlvbnMpIHsKLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gKFNldCkgb3B0aW9ucwotCQkJCS5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VUKTsKLQkJVHhSZWNvcmQgdHhSZWNvcmQgPSAoVHhSZWNvcmQpIG9wdGlvbnMKLQkJCQkuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlRYX1JFQ09SRCk7Ci0JCUxpc3QgcmVzb3VyY2VzVG9Db21taXQgPSB0eFJlY29yZCAhPSBudWxsID8gdHhSZWNvcmQKLQkJCQkuZ2V0UmVzb3VyY2VzVG9Db21taXQoKSA6IG51bGw7Ci0JCWlmIChtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWJvb2xlYW4gYmFja3VwUmVxdWlyZWQgPSBiYWNrdXBSZXF1aXJlZChvcHRpb25zKTsKLQkJYm9vbGVhbiBjaGVja01vZGlmeSA9IE11bHRpRmlsZVhNSVNhdmVJbXBsLmNoZWNrTW9kaWZ5UmVxdWlyZWQob3B0aW9ucyk7Ci0JCUNvbGxlY3Rpb24gc2F2ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlICghbW9kaWZpZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChtb2RpZmllZFJlc291cmNlcykuaXRlcmF0b3IoKTsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGNoZWNrTW9kaWZ5KSB7Ci0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLmNoZWNrTW9kaWZ5KHJlc291cmNlKTsKLQkJCQkJaWYocmVzb3VyY2VzVG9Db21taXQgIT0gbnVsbCkgewotCQkJCQkJLy8gY2hlY2sgZm9yIG91dC1vZi1zeW5jaCBvbmx5IGluIGZhaWwtc2FmZSBzYXZpbmcgZm9yIG5vdwotCQkJCQkJLy8KLQkJCQkJCU11bHRpRmlsZVNhdmVVdGlsLmNoZWNrT3V0T2ZTeW5jaChDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHJlc291cmNlKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gaWYocmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQkJaWYgKGJhY2t1cFJlcXVpcmVkKSB7Ci0JCQkJCS8vIGJhY2sgdXAgcmVzb3VyY2UgYmVmb3JlIHNhdmluZwotCQkJCQkvLwotCQkJCQliYWNrdXAocmVzb3VyY2UpOwotCQkJCX0KLQotCQkJCWlmIChyZXNvdXJjZXNUb0NvbW1pdCAhPSBudWxsKSB7Ci0JCQkJCSgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZSkuc2V0VGVtcFVSSSh0eFJlY29yZAotCQkJCQkJCS5nZXRUeElEKCkpOwotCQkJCQlyZXNvdXJjZXNUb0NvbW1pdC5hZGQocmVzb3VyY2UpOwotCQkJCX0KLQotCQkJCWlmKE11bHRpRmlsZVNhdmVVdGlsLnNhdmUocmVzb3VyY2UsIG9wdGlvbnMpKSB7Ci0JCQkJCXNhdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJCS8vIH0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2F2ZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiBAcGFyYW0gc2F2ZUFsbAotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgZm9yY2Ugc2F2aW5nIGFsbCB0aGUgcmVzb3VyY2VzIGV2ZW4gaWYgdGhleSBhcmUgbm90Ci0JICogICAgICAgICAgICBtb2RpZmllZC4KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMsIGJvb2xlYW4gc2F2ZUFsbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNhdmUob3B0aW9ucywgc2F2ZUFsbCwgZmFsc2UpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2F2ZShNYXAgb3B0aW9ucywgYm9vbGVhbiBzYXZlQWxsLCBib29sZWFuIGZhaWxTYWZlKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChvcHRpb25zID09IG51bGwpIHsKLQkJCW9wdGlvbnMgPSBuZXcgSGFzaE1hcChnZXREZWZhdWx0U2F2ZU9wdGlvbnMoKSk7Ci0JCX0KLQotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCU11bHRpRmlsZVNhdmVVdGlsLnNldEd1aWQobGlicmFyeSk7Ci0KLQkJcHJlcGFyZVNhdmUobGlicmFyeSk7Ci0KLQkJLy8gZG8gY2xlYW4tdXAgdGhpcyByZXNvdXJjZSBzZXQgYmVmb3JlIHNhdmluZwotCQkvLwotCQljbGVhblVwKCk7Ci0KLQkJTXVsdGlGaWxlVVJJQ29udmVydGVyIHVtYVVyaUNvbnZlcnRlciA9ICgoTXVsdGlGaWxlVVJJQ29udmVydGVyKSBnZXRVUklDb252ZXJ0ZXIoKSk7Ci0JCXVtYVVyaUNvbnZlcnRlci5zZXRMaWJyYXJ5VVJJcyhsaWJyYXJ5KTsKLQotCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlvcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5NT0RJRklFRF9SRVNPVVJDRV9TRVQsCi0JCQkJbW9kaWZpZWRSZXNvdXJjZXMpOwotCQlNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlUGVyc2lzdGVyIHBlcnNpc3RlciA9IG51bGw7Ci0JCWlmIChmYWlsU2FmZSkgewotCQkJcGVyc2lzdGVyID0gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRQotCQkJCQkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIob3B0aW9ucyk7Ci0JCQlvcHRpb25zID0gcGVyc2lzdGVyLmdldFNhdmVPcHRpb25zKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCUxpc3QgbGlzdCA9IGdldFJlc291cmNlcygpOwotCQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnQgc2F2aW5nICIgKyBzaXplICsgIiBsb2FkZWQgcmVzb3VyY2VzOiAiCi0JCQkvLyArIGxpc3QpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlib29sZWFuIGJhY2t1cFJlcXVpcmVkID0gYmFja3VwUmVxdWlyZWQob3B0aW9ucyk7Ci0JCQlMaXN0IHNhdmVSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlMaXN0IG1vdmVSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgbGlzdC5nZXQoaSk7Ci0KLQkJCQkgaWYgKHJlcy5pc01vZGlmaWVkKCkgJiYgCi0JCQkJCQkgTXVsdGlGaWxlU2F2ZVV0aWwuYWRqdXN0TG9jYXRpb25SZXF1aXJlZCgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXMpKSB7Ci0JCQkJCSBtb3ZlUmVzb3VyY2VzLmFkZChyZXMpOwotCQkJCSB9Ci0KLQkJCQlNZXRob2RFbGVtZW50IGVPYmogPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXMpOwotCQkJCWlmIChlT2JqICE9IG51bGwgJiYgZU9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJaWYgKHNhdmVBbGwgfHwgcmVzLmlzTW9kaWZpZWQoKSkgewotLy8JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0+IFN0YXJ0IHNhdmluZyAiICsgcmVzKTsKLS8vCQkJCQkJaWYgKGZhaWxTYWZlKSB7Ci0vLwkJCQkJCQlzYXZlUmVzb3VyY2VzLmFkZChyZXMpOwotLy8JCQkJCQl9IGVsc2UgewotLy8JCQkJCQkJaWYgKGJhY2t1cFJlcXVpcmVkKSB7Ci0vLwkJCQkJCQkJLy8gYmFjayB1cCByZXNvdXJjZSBiZWZvcmUgc2F2aW5nCi0vLwkJCQkJCQkJLy8KLS8vCQkJCQkJCQliYWNrdXAocmVzKTsKLS8vCQkJCQkJCX0KLS8vCi0vLwkJCQkJCQlpZihNdWx0aUZpbGVTYXZlVXRpbC5zYXZlKHJlcywgb3B0aW9ucykpIHsKLS8vCQkJCQkJCQlzYXZlZFJlc291cmNlcy5hZGQocmVzKTsKLS8vCQkJCQkJCQlpZihyZXMgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLS8vCQkJCQkJCQkJKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzKS51cGRhdGVUaW1lU3RhbXBzKCk7Ci0vLwkJCQkJCQkJfQotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiPC0tLS0gU2F2ZWQgcmVzb3VyY2U6ICIgKyByZXMpOwotCQkJCQkJCi0JCQkJCQlzYXZlUmVzb3VyY2VzLmFkZChyZXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZighc2F2ZVJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQlSZXNvdXJjZSBsaWJSZXNvdXJjZSA9IGdldE1ldGhvZExpYnJhcnlSZXNvdXJjZSgpOwotCQkJCWlmKCFzYXZlUmVzb3VyY2VzLmNvbnRhaW5zKGxpYlJlc291cmNlKSAmJiBQZXJzaXN0ZW5jZVV0aWwuY2hlY2tUb29sVmVyc2lvbihsaWJSZXNvdXJjZSkgIT0gMCkgewotCQkJCQlzYXZlUmVzb3VyY2VzLmFkZChsaWJSZXNvdXJjZSk7Ci0JCQkJfQotCQkJCWlmKE11bHRpRmlsZVhNSVNhdmVJbXBsLmNoZWNrTW9kaWZ5UmVxdWlyZWQob3B0aW9ucykpIHsKLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuY2hlY2tNb2RpZnkoc2F2ZVJlc291cmNlcyk7Ci0JCQkJfQotCQkJCWlmIChmYWlsU2FmZSkgewotCQkJCQl0cnkgewotCQkJCQkJc2F2ZShzYXZlUmVzb3VyY2VzLCBvcHRpb25zLCBmYWxzZSk7Ci0JCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCQlwZXJzaXN0ZXIuYWRqdXN0TG9jYXRpb24obW92ZVJlc291cmNlcyk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCXRocm93IGU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzYXZlUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYoTXVsdGlGaWxlU2F2ZVV0aWwuc2F2ZShyZXNvdXJjZSwgb3B0aW9ucykpIHsKLQkJCQkJCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJCQkJCQkoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXNvdXJjZSkudXBkYXRlVGltZVN0YW1wcygpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb3ZlUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuYWRqdXN0TG9jYXRpb24ocmVzb3VyY2UsCi0JCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCQkJfQotCQkJCQlDb2xsZWN0aW9uIHNhdmVkID0gc2F2ZU1vZGlmaWVkUmVzb3VyY2VzKG9wdGlvbnMpOwotCQkJCQlpZiAoc2F2ZWQgIT0gbnVsbCkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2F2ZWQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQkJCQkJCSgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKXJlc291cmNlKS51cGRhdGVUaW1lU3RhbXBzKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCXRocm93IGV4Y2VwdGlvbjsKLQkJfSBmaW5hbGx5IHsKLQkJCW9wdGlvbnMucmVtb3ZlKE11bHRpRmlsZVhNSVNhdmVJbXBsLk1PRElGSUVEX1JFU09VUkNFX1NFVCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgb3BlbiBsaWJyYXJ5IHVuZGVyIGEgbmV3IGxvY2F0aW9uCi0JICogCi0JICogQHBhcmFtIG5ld0xvY2F0aW9uCi0JICogICAgICAgICAgICBkaXJlY3RvcnkgdG8gc2F2ZSB0aGUgb3BlbiBsaWJyYXJ5IHRvCi0JICogQHBhcmFtIGlmCi0JICogICAgICAgICAgICB0cnVlLCByZWdlbmVyYXRlR1VJRCByZWdlbmVyYXRlIEdVSUQgZm9yIGFsbCBNZXRob2RFbGVtZW50cyBpbgotCSAqICAgICAgICAgICAgdGhlIG9wZW4gbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVBcyhTdHJpbmcgbmV3TG9jYXRpb24sIGJvb2xlYW4gcmVnZW5lcmF0ZUdVSUQsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGdldE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGxvYWQgYWxsIHRoZSByZXNvdXJjZXMgaW4gbWVtb3J5Ci0JCS8vCi0JCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQltb25pdG9yLnNldFRhc2tOYW1lKFBlcnNpc3RlbmNlUmVzb3VyY2VzLmxvYWRSZXNvdXJjZXNUYXNrX25hbWUpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZ2VuZXJhdGVHVUlEICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJKChNZXRob2RFbGVtZW50KSBlbGVtZW50KS5zZXRHdWlkKFVtYVV0aWwuZ2VuZXJhdGVHVUlEKCkpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJfQotCQl9Ci0KLQkJLy8gY2hhbmdlIFVSSSBvZiBhbGwgbG9hZGVkIHJlc291cmNlcyBmb3IgbmV3IGxvY2F0aW9uCi0JCS8vCi0JCVVSSSBvbGREaXIgPSBVUkkuY3JlYXRlRmlsZVVSSShuZXcgRmlsZShsaWIuZVJlc291cmNlKCkuZ2V0VVJJKCkKLQkJCQkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpCi0JCQkJKyBGaWxlLnNlcGFyYXRvcik7Ci0JCVVSSSBuZXdEaXIgPSBVUkkuY3JlYXRlRmlsZVVSSShuZXdMb2NhdGlvbiArIEZpbGUuc2VwYXJhdG9yKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlyZXNvdXJjZS5zZXRVUkkocmVzb3VyY2UuZ2V0VVJJKCkucmVwbGFjZVByZWZpeChvbGREaXIsIG5ld0RpcikpOwotCQl9Ci0KLQkJLy8gY2xlYXIgdGhlIFJlc291cmNlTWFuYWdlcgotCQkvLwotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gKChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIGdldFVSSUNvbnZlcnRlcigpKQotCQkJCS5nZXRSZXNvdXJjZU1hbmFnZXIoKTsKLQkJaWYgKHJlc01nciAhPSBudWxsKSB7Ci0JCQlyZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLmNsZWFyKCk7Ci0JCX0KLQotCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJbW9uaXRvci5zZXRUYXNrTmFtZShQZXJzaXN0ZW5jZVJlc291cmNlcy5zYXZlTGlicmFyeVRhc2tfbmFtZSk7Ci0JCXNhdmUobnVsbCwgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVubG9hZFdpdGhvdXRSZW1vdmUoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJcmVzb3VyY2UudW5sb2FkV2l0aG91dFJlbW92ZSgpOwotCQlpZihlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlpZihsaWIgIT0gbnVsbCkgewotCQkJCWxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5yZW1vdmUoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFuVXAoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCUxpc3QgcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlMaXN0IGxpc3QgPSBnZXRSZXNvdXJjZXMoKTsKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgbGlzdC5nZXQoaSk7Ci0JCQlib29sZWFuIHJlbW92ZSA9IGZhbHNlOwotCQkJaWYgKHJlcy5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuY2xlYW5VcCgpOiBlbXB0eSByZXNvdXJjZTogIiArIHJlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZW1vdmUgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlNZXRob2RFbGVtZW50IGVPYmogPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXMpOwotCQkJCWlmIChlT2JqID09IG51bGwKLQkJCQkJCXx8IChlT2JqICE9IGxpYnJhcnkgJiYgZU9iai5lQ29udGFpbmVyKCkgPT0gbnVsbCkpIHsKLQkJCQkJaWYgKGVPYmogPT0gbnVsbCkgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLmNsZWFuVXAoKTogcmVzb3VyY2Ugd2l0aG91dCBhbnkgTWV0aG9kRWxlbWVudDogIiArIHJlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJlbW92ZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJLy8gc29tZSByZXNvdXJjZXMgbWlnaHQgYmUgbG9hZGVkIGRpcmVjdGx5LCBub3QgdGhydSBpdHMKLQkJCQkJLy8gY29udGFpbmVyLiBUaGVyZWZvcmUsIHdlIGNhbm5vdCBhc3N1bWUKLQkJCQkJLy8gdGhhdCBhIG9iamVjdCB3aXRob3V0IGEgY29udGFpbmVyIGluIGEgbG9hZGVkIHJlc291cmNlIGlzCi0JCQkJCS8vIGEgcmVtb3ZlZCBvYmplY3QuCi0JCQkJCS8vCi0JCQkJCWVsc2UgaWYgKGVPYmogIT0gbGlicmFyeSAmJiBlT2JqLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuY2xlYW5VcCgpOiByZXNvdXJjZSB3aXRob3V0IGEgY29udGFpbmVyOiAiICsgcmVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlbW92ZSkgewotCQkJCS8vIFRoaXMgaXMgYSByZW1vdmVkIG9iamVjdC4gQWRkIGl0cyBwYXRoIHRvIHRoZSBsaXN0IGZvcgotCQkJCS8vIHJlbW92aW5nIGl0cyBmaWxlcyBsYXRlci4KLQkJCQkvLwotCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBkbyBjbGVhbi11cAotCQkvLwotCQlTeXN0ZW0ub3V0Ci0JCQkJLnByaW50bG4oIk11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5jbGVhblVwKCk6IHJlbW92ZWQgcmVzb3VyY2VzOiAiICsgcmVtb3ZlZFJlc291cmNlcyk7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZW1vdmVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQotCQkJdHJ5IHsKLQkJCQkvLyByZW1vdmUgUmVzb3VyY2VEZXNjcmlwdG9yIG9mIHRoZSByZW1vdmVkIHJlc291cmNlCi0JCQkJLy8KLQkJCQljbGVhblVwKHJlcyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCi0JCS8vIGdldFJlc291cmNlcygpLnJlbW92ZUFsbChyZW1vdmVkUmVzb3VyY2VzKTsKLQl9Ci0JCi0JLyoqCi0JICogUHJlcGFyZXMgdGhlIGxpYnJhcnkgZm9yIHNhdmluZwotCSAqLwotCXByaXZhdGUgdm9pZCBwcmVwYXJlU2F2ZShNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJLy8gY2hlY2sgaWYgdGhlIGxpYnJhcnkgYWxyZWFkeSBoYXMgYSBSZXNvdXJjZU1hbmFnZXIKLQkJLy8gaWYgbm90LCBjcmVhdGUgUmVzb3VyY2VNYW5hZ2VyIGZvciBpdAotCQkvLwotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBsaWJyYXJ5Ci0JCQkJLmVSZXNvdXJjZSgpOwotCQlSZXNvdXJjZU1hbmFnZXIgbGliUmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwuYWRkUmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlKTsKLQkJaWYobGliUmVzTWdyICE9IG51bGwpIHsKLQkJCU11bHRpRmlsZVNhdmVVdGlsLnJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcihsaWJSZXNNZ3IsIGxpYnJhcnksCi0JCQkJCXJlc291cmNlLmdldEZpbmFsVVJJKCkpOwotCQl9Ci0KLQkJTGlzdCBtb2RlbHMgPSBsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJaW50IHNpemUgPSBtb2RlbHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcHJlcGFyZVNhdmUoKE1ldGhvZFBsdWdpbikgbW9kZWxzLmdldChpKSk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJY2xlYW5VcCgoTWV0aG9kUGx1Z2luKSBtb2RlbHMuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2xlYW5VcChNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgUFJPQ0VTU19QQUNLQUdFX1BBVEhTLmxlbmd0aDsgaSsrKSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoCi0JCQkJCXBsdWdpbiwgUFJPQ0VTU19QQUNLQUdFX1BBVEhTW2ldKTsKLQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCWNsZWFuVXBQcm9jZXNzZXMocGtnKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmVwYXJlU2F2ZShNZXRob2RQbHVnaW4gbW9kZWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBQUk9DRVNTX1BBQ0tBR0VfUEFUSFMubGVuZ3RoOyBpKyspIHsKLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZSgKLQkJCQkJbW9kZWwsIFBST0NFU1NfUEFDS0FHRV9QQVRIU1tpXSk7Ci0JCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCQlwcmVwYXJlU2F2ZShwa2cpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBwcm9jZXNzIHBhY2thZ2VzIG9mIHVudXNlZCBhY3Rpdml0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBwa2cKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNsZWFuVXBQcm9jZXNzZXMoUHJvY2Vzc1BhY2thZ2UgcGtnKSB7Ci0JCUxpc3QgbGlzdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gbGlzdC5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSAoUHJvY2Vzc0NvbXBvbmVudCkgb2JqOwotCQkJCUxpc3QgcGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJvY0NvbXAuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJCWdldFJlbW92ZWRQYWNrYWdlcygoUHJvY2Vzc1BhY2thZ2UpIGVsZW1lbnQsIHBhY2thZ2VzKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFja2FnZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUoKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRSZW1vdmVkUGFja2FnZXMoUHJvY2Vzc1BhY2thZ2UgcGtnLAotCQkJTGlzdCByZW1vdmVkUGFja2FnZXMpIHsKLQkJLy8gZmluZCBhY3Rpdml0eQotCQkvLwotCQlBY3Rpdml0eSBhY3QgPSBnZXRBY3Rpdml0eShwa2cpOwotCi0JCWlmIChhY3QgPT0gbnVsbCB8fCBnZXRQYXJlbnQoYWN0KSA9PSBudWxsKSB7Ci0JCQkvLyBJbnZhbGlkIHByb2Nlc3MgcGFja2FnZS4gSXQgZG9lcyBub3QgY29udGFpbiBhbnkgYWN0aXZpdHkuCi0JCQkvLyBBZGQgaXQgdG8gdGhlIGxpc3Qgb2YgcGFja2FnZXMgdG8gYmUgcmVtb3ZlZC4KLQkJCS8vCi0JCQlyZW1vdmVkUGFja2FnZXMuYWRkKHBrZyk7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJZ2V0UmVtb3ZlZFBhY2thZ2VzKChQcm9jZXNzUGFja2FnZSkgZWxlbWVudCwKLQkJCQkJCQlyZW1vdmVkUGFja2FnZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KFByb2Nlc3NQYWNrYWdlIHBrZykgewotCQkvLyBmaW5kIGFjdGl2aXR5Ci0JCS8vCi0JCUFjdGl2aXR5IGFjdCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJYWN0ID0gKEFjdGl2aXR5KSBlbGVtZW50OwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBhY3Q7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldFBhcmVudChCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJLy8gSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpCi0JCS8vIFRuZ1V0aWwuZ2V0QWRhcHRlcihlLCBJQlNJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQkvLyByZXR1cm4gYWRhcHRlciA9PSBudWxsID8gbnVsbCA6IGFkYXB0ZXIuZ2V0UGFyZW50KGUpOwotCi0JCXJldHVybiBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgcHJvY2VzcyBwYWNrYWdlIGZvciB0aG9zZSBhY3Rpdml0aWVzIHRoYXQgc3RpbGwgZG9uJ3QgYmVsb25nIHRvCi0JICogYW55IHByb2Nlc3MgcGFja2FnZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJlcGFyZVNhdmUoUHJvY2Vzc1BhY2thZ2UgcGtnKSB7Ci0JCUxpc3QgbGlzdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gbGlzdC5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCXByZXBhcmVTYXZlKChQcm9jZXNzQ29tcG9uZW50KSBvYmopOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByZXBhcmVTYXZlKFByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXApIHsKLQkJUHJvY2VzcyBwcm9jID0gcHJvY0NvbXAuZ2V0UHJvY2VzcygpOwotCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkvLyBhc3NvY2lhdGVBbGxBZGFwdGVycyhwcm9jKTsKLQkJCXByZXBhcmVTYXZlKHByb2MpOwotCi0JCQljbGVhblVwRGFuZ2xpbmdEZXNjcmlwdG9ycyhwcm9jQ29tcCk7Ci0KLQkJCUxpc3QgZGFuZ2xpbmdQa2dzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChwcm9jQ29tcC5nZXRDaGlsZFBhY2thZ2VzKCkpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBlbGVtZW50OwotCQkJCQlyZW9yZ2FuaXplKHBrZywgZGFuZ2xpbmdQa2dzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGNsZWFuIHVwIGRhbmdsaW5nIFByb2Nlc3NQYWNrYWdlcwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRhbmdsaW5nUGtncy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQljbGVhblVwKChQcm9jZXNzUGFja2FnZSkgaXRlci5uZXh0KCkpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQkvLyAvKioKLQkvLyAqIEBwYXJhbSBhY3Rpdml0eQotCS8vICovCi0JLy8gcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NvY2lhdGVBbGxBZGFwdGVycyhBY3Rpdml0eSBhY3Rpdml0eSkgewotCS8vIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0KLQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCS8vIEl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKQotCS8vIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGFjdGl2aXR5LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oYWN0aXZpdHkpLml0ZXJhdG9yKCk7Ci0JLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkvLyBhc3NvY2lhdGVBbGxBZGFwdGVycygoQWN0aXZpdHkpIGVsZW1lbnQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmVwYXJlU2F2ZShBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlQcm9jZXNzUGFja2FnZSBwYXJlbnRQa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJTGlzdCBlbGVtZW50cyA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0KLQkJLy8gYWRkIG5ldyBkZXNjcmlwdG9ycyBhbmQgb3RoZXIgbm9uLWFjdGl2aXR5IGJyZWFrZG93biBlbGVtZW50cyBvZiB0aGUKLQkJLy8gYWN0aXZpdHkgdG8gaXRzIHByb2Nlc3MgcGFja2FnZQotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgJiYgZWxlbWVudC5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCXBhcmVudFBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgbmV3IFdvcmtPcmRlciBvYmplY3RzIG9yIHJlbW92ZSB1bnVzZWQgV29ya09yZGVyIG9iamVjdHMgb2YgdGhpcwotCQkvLyBhY3Rpdml0eQotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpdml0eS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJV29ya09yZGVyIHdvcmtPcmRlciA9IChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpOwotCQkJaWYgKHdvcmtPcmRlci5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCWlmICh3b3JrT3JkZXIuZ2V0UHJlZCgpICE9IG51bGwKLQkJCQkJCSYmIGdldFBhcmVudCh3b3JrT3JkZXIuZ2V0UHJlZCgpKSAhPSBudWxsKSB7Ci0JCQkJCXBhcmVudFBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQod29ya09yZGVyKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICh3b3JrT3JkZXIuZ2V0UHJlZCgpID09IG51bGwKLQkJCQkJCXx8IGdldFBhcmVudCh3b3JrT3JkZXIuZ2V0UHJlZCgpKSA9PSBudWxsKSB7Ci0JCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJJbnZhbGlkIFdvcmtPcmRlcjogIiArIHdvcmtPcmRlcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlwYXJlbnRQa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlKHdvcmtPcmRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gcmVtb3ZlZCB1bnVzZWQgZGlhZ3JhbXMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGFyZW50UGtnLmdldERpYWdyYW1zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgaXRlci5uZXh0KCk7Ci0JCQlTZW1hbnRpY01vZGVsQnJpZGdlIGJyaWRnZSA9IGRpYWdyYW0uZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJaWYgKGJyaWRnZSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIHsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGJyaWRnZSkKLQkJCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJJiYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MpICYmIGdldFBhcmVudCgoQWN0aXZpdHkpIGVsZW1lbnQpID09IG51bGwpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaW50IHNpemUgPSBlbGVtZW50cy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3QgZSA9IGVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGU7Ci0JCQkJaWYgKGFjdC5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQlQcm9jZXNzUGFja2FnZSBwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJCQlwa2cuc2V0TmFtZShhY3QuZ2V0TmFtZSgpKTsKLQkJCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChhY3QpOwotCQkJCQlMaXN0IGRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLnNpemUoKTsgaisrKSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuZ2V0KGopOwotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQkJCQlkZXNjcmlwdG9ycy5hZGQob2JqKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKGRlc2NyaXB0b3JzKTsKLQotCQkJCQlwYXJlbnRQa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChwa2cpOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3MgcGFja2FnZSBjcmVhdGVkIGZvciBhY3Rpdml0eToKLQkJCQkJLy8gJyIgKyBhY3QuZ2V0TmFtZSgpICsgIiciKTsKLQkJCQl9Ci0JCQkJcHJlcGFyZVNhdmUoYWN0KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2xlYW5VcERhbmdsaW5nRGVzY3JpcHRvcnMoUHJvY2Vzc1BhY2thZ2UgcGtnKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQKLQkJCQkJJiYgKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50KS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJYm9vbGVhbiByZW1vdmUgPSBmYWxzZTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCWlmIChBc3NvY2lhdGlvbkhlbHBlci5nZXRUZWFtUHJvZmlsZXMoCi0JCQkJCQkJKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50KS5pc0VtcHR5KCkpIHsKLQkJCQkJCXJlbW92ZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJaWYgKEFzc29jaWF0aW9uSGVscGVyLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRvcnMoCi0JCQkJCQkJKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkuaXNFbXB0eSgpKSB7Ci0JCQkJCQlyZW1vdmUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQkJaWYgKCgoVGVhbVByb2ZpbGUpIGVsZW1lbnQpLmdldFN1cGVyVGVhbSgpID09IG51bGwpIHsKLQkJCQkJCXJlbW92ZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZW1vdmUgPSB0cnVlOwotCQkJCX0KLQotCQkJCWlmIChyZW1vdmUpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNb3ZlcyB0aGUgcHJvY2VzcyBwYWNrYWdlcyB0byB0aGUgcmlnaHQgbG9jYXRpb24gaW4gdGhlIHRyZWUgaWYgbmVlZGVkLgotCSAqIAotCSAqIEBwYXJhbSBwa2cKLQkgKiBAcGFyYW0gZGFuZ2xpbmdQa2dzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlb3JnYW5pemUoUHJvY2Vzc1BhY2thZ2UgcGtnLCBMaXN0IGRhbmdsaW5nUGtncykgewotCQlBY3Rpdml0eSBhY3QgPSBnZXRBY3Rpdml0eShwa2cpOwotCQlpZiAoYWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gbWFrZSBzdXJlIHRoZSBwYWNrYWdlIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBhY3Rpdml0eSdzIG5hbWUKLQkJLy8KLQkJaWYgKCFwa2cuZ2V0TmFtZSgpLmVxdWFscyhhY3QuZ2V0TmFtZSgpKSkgewotCQkJcGtnLnNldE5hbWUoYWN0LmdldE5hbWUoKSk7Ci0JCX0KLQotCQkvLyBjaGVjayBpZiB0aGUgY29udGFpbmVyIG9mIHBrZyBpcyBhY3R1YWxseSBob2xkaW5nIHRoZSBwYXJlbnQgYWN0aXZpdHkKLQkJLy8gb2YgYWN0Ci0JCS8vCi0JCUVPYmplY3QgcGFyZW50QWN0ID0gKEVPYmplY3QpIGdldFBhcmVudChhY3QpOwotCi0JCWlmIChwYXJlbnRBY3QgPT0gbnVsbCkgewotCQkJLy8gY2xlYW5VcFJlc291cmNlRGVzY3JpcHRvcnMocGtnKTsKLQkJCS8vIGNsZWFuVXAocGtnKTsKLQkJCS8vIHJldHVybjsKLQkJCWRhbmdsaW5nUGtncy5hZGQocGtnKTsKLQkJfSBlbHNlIGlmIChwYXJlbnRBY3QgIT0gZ2V0QWN0aXZpdHkoKFByb2Nlc3NQYWNrYWdlKSBwa2cuZUNvbnRhaW5lcigpKSkgewotCQkJLy8gbW92ZSB0aGUgcGFja2FnZSB0byB0aGUgcmlnaHQgbG9jYXRpb24sIHVuZGVyIHRoZSBwcm9jZXNzIHBhY2thZ2UKLQkJCS8vIG9mIHBhcmVudEFjdAotCQkJLy8KLQkJCVByb2Nlc3NQYWNrYWdlIHBhcmVudFBrZyA9IChQcm9jZXNzUGFja2FnZSkgcGFyZW50QWN0LmVDb250YWluZXIoKTsKLQkJCXBhcmVudFBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKHBrZyk7Ci0JCX0KLQotCQlpZiAocGFyZW50QWN0ICE9IG51bGwpIHsKLQkJCWNsZWFuVXBEYW5nbGluZ0Rlc2NyaXB0b3JzKHBrZyk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlyZW9yZ2FuaXplKChQcm9jZXNzUGFja2FnZSkgZWxlbWVudCwgZGFuZ2xpbmdQa2dzKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBNYXAgZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpIHsKLQkJaWYgKGd1aWRUb01ldGhvZEVsZW1lbnRNYXAgPT0gbnVsbCkgewotCQkJZ3VpZFRvTWV0aG9kRWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJcmV0dXJuIGd1aWRUb01ldGhvZEVsZW1lbnRNYXA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkJhc2ljTm90aWZpZXJJbXBsI2VOb3RpZnkob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVOb3RpZnkoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl0cnkgewotCQkJc3VwZXIuZU5vdGlmeShub3RpZmljYXRpb24pOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRQotCQkJCQkubG9nKCJFUlJPUiBub3RpZnlpbmcgY2hhbmdlczogcmVzb3VyY2VTZXQ9IiArIHRoaXMgKyAiLCBub3RpZmljYXRpb249IiArIG5vdGlmaWNhdGlvbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRNYXJrZXIoRXhjZXB0aW9uIGUpIHsKLQkJdHJ5IHsKLQkJCS8vIGluc2VydCBwcm9ibGVtIG1hcmtlcgotCQkJLy8KLQkJCW1hcmtlck1hbmFuZ2VyLm5vdGlmeUV4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhleCk7Ci0JCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvYWRpbmcoYm9vbGVhbiBiKSB7Ci0JCWxvYWRpbmcgPSBiOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JRXhjZXB0aW9uQ29sbGVjdG9yI2NvbGxlY3QoamF2YS5sYW5nLkV4Y2VwdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQkJaWYgKGxvYWRpbmdSZXNvdXJjZU1hbmFnZXJUcmVlKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFJlc29sdmVFeGNlcHRpb24pIHsKLQkJCQlpZiAoKChSZXNvbHZlRXhjZXB0aW9uKSBlKS5leGNlcHRpb24oKSBpbnN0YW5jZW9mIE11bHRpRmlsZUlPRXhjZXB0aW9uKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdHJ5IHsKLQkJCWFkZE1hcmtlcihlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklQcm94eVJlc29sdXRpb25MaXN0ZW5lciNwcm94eVJlc29sdmVkKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoT2JqZWN0IHByb3h5LCBPYmplY3QgcmVzb2x2ZWQpIHsKLQkJaWYocmVzb2x2ZWQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlTdHJpbmcgZ3VpZCA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEd1aWQocmVzb2x2ZWQpOwotCQkJaWYgKGd1aWQgIT0gbnVsbCkgewotCQkJCWdldEd1aWRUb01ldGhvZEVsZW1lbnRNYXAoKS5wdXQoZ3VpZCwgcmVzb2x2ZWQpOwotCQkJfQotCQl9Ci0JCW1hcmtlck1hbmFuZ2VyLnByb3h5UmVzb2x2ZWQocHJveHksIHJlc29sdmVkKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgZ2V0RU9iamVjdEJ5R1VJRChTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gKEVPYmplY3QpIGdldEd1aWRUb01ldGhvZEVsZW1lbnRNYXAoKS5nZXQoZ3VpZCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklVbWFSZXNvdXJjZVNldCNnZXRFT2JqZWN0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRFT2JqZWN0KEVPYmplY3QgcmVzb2x2ZXIsIFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCS8vIGxvbmcgc3RhcnQ7Ci0JCS8vIGlmKE11bHRpRmlsZVNhdmVVdGlsLlBST0ZJTEUpIHsKLQkJLy8gc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJLy8gfQotCi0JCVVSSSBub3JtYWxpemVkID0gKChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIGdldFVSSUNvbnZlcnRlcigpKS5ub3JtYWxpemUoCi0JCQkJdXJpLCByZXNvbHZlcik7Ci0JCWlmIChub3JtYWxpemVkID09IG51bGwpIHsKLQkJCS8vIHdvcmstYXJvdW5kIHRvIGxvb2sgdXAgZm9yIG9iamVjdCBieSBpdHMgR1VJRCBpbiBjYXNlIGl0IGhhZCBiZWVuCi0JCQkvLyBtb3ZlZCB0byBvdGhlciByZXNvdXJjZQotCQkJLy8KLQkJCVN0cmluZyBndWlkID0gdXJpLmZyYWdtZW50KCk7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSBnZXRFT2JqZWN0QnlHVUlEKGd1aWQpOwotCQkJaWYgKGVPYmplY3QgIT0gbnVsbCkgewotCQkJCXJldHVybiBlT2JqZWN0OwotCQkJfQotCi0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMubm9ybWFsaXplVVJJRXJyb3JfbXNnLAotCQkJCQl1cmkpOwotCQkJdGhyb3cgbmV3IFVubm9ybWFsaXplZFVSSUV4Y2VwdGlvbihtc2cpOwotCQl9Ci0JCVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2Uobm9ybWFsaXplZC50cmltRnJhZ21lbnQoKSwgbG9hZE9uRGVtYW5kKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmcmFnbWVudCA9IG5vcm1hbGl6ZWQuZnJhZ21lbnQoKTsKLQkJCWlmIChmcmFnbWVudCA9PSBudWxsIHx8IGZyYWdtZW50Lmxlbmd0aCgpID09IDApIHsKLQkJCQlyZXR1cm4gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJfQotCQkJRU9iamVjdCBlT2JqZWN0ID0gcmVzb3VyY2UuZ2V0RU9iamVjdChmcmFnbWVudCk7Ci0JCQlpZiAoZU9iamVjdCA9PSBudWxsICYmICFmcmFnbWVudC5lcXVhbHModXJpLmF1dGhvcml0eSgpKSkgewotCQkJCS8vIHdvcmstYXJvdW5kIHRvIGxvb2sgdXAgZm9yIG9iamVjdCBieSBpdHMgR1VJRCBpbiBjYXNlIGl0IGhhZAotCQkJCS8vIGJlZW4gbW92ZWQKLQkJCQkvLwotCQkJCXJldHVybiBnZXRFT2JqZWN0QnlHVUlEKGZyYWdtZW50KTsKLQkJCX0KLQkJCXJldHVybiBlT2JqZWN0OwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBpZihNdWx0aUZpbGVTYXZlVXRpbC5QUk9GSUxFKSB7Ci0JCS8vCQkJCi0JCS8vIH0KLQl9Ci0KLQkvLyAvKioKLQkvLyAqIEByZXR1cm4gUmV0dXJucyB0aGUgZXhjZXB0aW9ucy4KLQkvLyAqLwotCS8vIHB1YmxpYyBMaXN0IGdldEV4Y2VwdGlvbnMoKSB7Ci0JLy8gcmV0dXJuIGV4Y2VwdGlvbnM7Ci0JLy8gfQotCi0JcHVibGljIHZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoTGlzdCBvcHBvc2l0ZUZlYXR1cmVzKSB7Ci0JCWludCBtYXggPSBvcHBvc2l0ZUZlYXR1cmVzLnNpemUoKSAtIDE7Ci0JCWlmIChtYXggPCAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQXJyYXlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkudmFsdWVzKCkpOwotCQlIYXNoU2V0IGxvYWRlZEVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQkJd2hpbGUgKCFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgb2JqOwotCQkJCQlmb3IgKGludCBpID0gbWF4OyBpID4gLTE7IGktLSkgewotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlID0gKChPcHBvc2l0ZUZlYXR1cmUpIG9wcG9zaXRlRmVhdHVyZXMKLQkJCQkJCQkJLmdldChpKSkuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQkJCQkJaWYgKGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCQkJCWlmIChlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCQlJbnRlcm5hbEVMaXN0IGxpc3QgPSAoSW50ZXJuYWxFTGlzdCkgZWxlbWVudAotCQkJCQkJCQkJCS5lR2V0KGVGZWF0dXJlKTsKLQkJCQkJCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQllbGVtZW50LmVHZXQoZUZlYXR1cmUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gZ2V0cyB0aGUgbmV3bHkgbG9hZGVkIGVsZW1lbnRzIHRvIGxvYWQgdGhlaXIgb3Bwb3NpdGUgZmVhdHVyZXMKLQkJCS8vCi0JCQlsb2FkZWRFbGVtZW50cy5hZGRBbGwoZWxlbWVudHMpOwotCQkJZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KGdldEd1aWRUb01ldGhvZEVsZW1lbnRNYXAoKS52YWx1ZXMoKSk7Ci0JCQllbGVtZW50cy5yZW1vdmVBbGwobG9hZGVkRWxlbWVudHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoTGlzdCBvcHBvc2l0ZUZlYXR1cmVzLCBTZXQgZGVsZXRlZEdVSURzKSB7Ci0JCWludCBtYXggPSBvcHBvc2l0ZUZlYXR1cmVzLnNpemUoKSAtIDE7Ci0JCWlmIChtYXggPCAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQXJyYXlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkudmFsdWVzKCkpOwotCQlIYXNoU2V0IGxvYWRlZEVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQkJd2hpbGUgKCFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgb2JqOwotCQkJCQlmb3IgKGludCBpID0gbWF4OyBpID4gLTE7IGktLSkgewotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlID0gKChPcHBvc2l0ZUZlYXR1cmUpIG9wcG9zaXRlRmVhdHVyZXMKLQkJCQkJCQkJLmdldChpKSkuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQkJCQkJaWYgKGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCQkJCWlmIChlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCQlJbnRlcm5hbEVMaXN0IGxpc3QgPSAoSW50ZXJuYWxFTGlzdCkgZWxlbWVudAotCQkJCQkJCQkJCS5lR2V0KGVGZWF0dXJlKTsKLQkJCQkJCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJCQkJYm9vbGVhbiByZXNvbHZlID0gZmFsc2U7Ci0JCQkJCQkJCQljaGVja19yZXNvbHZlOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdAotCQkJCQkJCQkJCQkuYmFzaWNJdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCUludGVybmFsRU9iamVjdCBlID0gKEludGVybmFsRU9iamVjdCkgaXRlcmF0b3IKLQkJCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCQkJaWYgKGUuZUlzUHJveHkoKSkgewotCQkJCQkJCQkJCQlTdHJpbmcgZ3VpZCA9IGUuZVByb3h5VVJJKCkKLQkJCQkJCQkJCQkJCQkuZnJhZ21lbnQoKTsKLQkJCQkJCQkJCQkJaWYgKGRlbGV0ZWRHVUlEcy5jb250YWlucyhndWlkKSkgewotCQkJCQkJCQkJCQkJcmVzb2x2ZSA9IHRydWU7Ci0JCQkJCQkJCQkJCQlicmVhayBjaGVja19yZXNvbHZlOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKHJlc29sdmUpIHsKLQkJCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdAotCQkJCQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQuZUdldChlRmVhdHVyZSwgZmFsc2UpOwotCQkJCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpIHsKLQkJCQkJCQkJCUludGVybmFsRU9iamVjdCBlID0gKEludGVybmFsRU9iamVjdCkgdmFsdWU7Ci0JCQkJCQkJCQlpZiAoZS5lSXNQcm94eSgpKSB7Ci0JCQkJCQkJCQkJU3RyaW5nIGd1aWQgPSBlLmVQcm94eVVSSSgpLmZyYWdtZW50KCk7Ci0JCQkJCQkJCQkJaWYgKGRlbGV0ZWRHVUlEcy5jb250YWlucyhndWlkKSkgewotCQkJCQkJCQkJCQllbGVtZW50LmVHZXQoZUZlYXR1cmUpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIGdldHMgdGhlIG5ld2x5IGxvYWRlZCBlbGVtZW50cyB0byBsb2FkIHRoZWlyIG9wcG9zaXRlIGZlYXR1cmVzCi0JCQkvLwotCQkJbG9hZGVkRWxlbWVudHMuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCWVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkudmFsdWVzKCkpOwotCQkJZWxlbWVudHMucmVtb3ZlQWxsKGxvYWRlZEVsZW1lbnRzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1VucmVzb2x2ZWRQcm94eSgpIHsKLQkJcmV0dXJuIG1hcmtlck1hbmFuZ2VyLmhhc1VucmVzb2x2ZWRQcm94eSgpOwotCX0KLQotCXByb3RlY3RlZCBNYXAgZ2V0VVJJVG9UZW1wVVJJTWFwKCkgewotCQlpZiAoVVJJVG9UZW1wVVJJTWFwID09IG51bGwpIHsKLQkJCVVSSVRvVGVtcFVSSU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQotCQlyZXR1cm4gVVJJVG9UZW1wVVJJTWFwOwotCX0KLQotCXB1YmxpYyBVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyIGdldE1hcmtlck1hbmFuZ2VyKCkgewotCQlyZXR1cm4gbWFya2VyTWFuYW5nZXI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCNjaGVja01vZGlmeShvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlW10sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tNb2RpZnkoUmVzb3VyY2VbXSByZXNvdXJjZXMsIE9iamVjdCBjb250ZXh0KSB0aHJvd3MgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uIHsJCQotCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja01vZGlmeShBcnJheXMuYXNMaXN0KHJlc291cmNlcykpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjY2hlY2tNb2RpZnkoamF2YS51dGlsLkNvbGxlY3Rpb24sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdGF0dXMgY2hlY2tNb2RpZnkoQ29sbGVjdGlvbiBlT2JqZWN0cywgT2JqZWN0IGNvbnRleHQpIHsKLQkJSGFzaFNldCBwYXRoU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZU9iamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IG8uZVJlc291cmNlKCk7Ci0JCQlpZihyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkgPT0gdGhpcykgewotCQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCBtZlJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2U7Ci0JCQkJaWYoIW1mUmVzb3VyY2UuaGFzVGVtcFVSSSgpKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gbWZSZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQkJcGF0aFNldC5hZGQocGF0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKHBhdGhTZXQuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlTdHJpbmdbXSBwYXRocyA9IG5ldyBTdHJpbmdbcGF0aFNldC5zaXplKCldOwotCQlwYXRoU2V0LnRvQXJyYXkocGF0aHMpOwotCQlyZXR1cm4gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jaGVja01vZGlmeShwYXRocywgY29udGV4dCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCNnZXRQZXJzaXN0ZXIoKQotCSAqLwotCXB1YmxpYyBJTGlicmFyeVBlcnNpc3RlciBnZXRQZXJzaXN0ZXIoKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjdW5sb2FkKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSwgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmxvYWQoUmVzb3VyY2UgcmVzb3VyY2UsIE1hcCBvcHRpb25zKSB7Ci0JCWlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQl1bmxvYWRXaXRob3V0UmVtb3ZlKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlc291cmNlKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjdW5sb2FkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmxvYWQoKSB7Ci0JCXJlc2V0KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCNnZXRGaXJzdE1ldGhvZExpYnJhcnkoKQotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldEZpcnN0TWV0aG9kTGlicmFyeSgpIHsKLQkJcmV0dXJuIGdldE1ldGhvZExpYnJhcnkoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0I2dldE1ldGhvZExpYnJhcmllcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWV0aG9kTGlicmFyaWVzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGdldE1ldGhvZExpYnJhcnkoKTsKLQkJaWYobGliID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGxpYik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCNsb2FkTWV0aG9kTGlicmFyaWVzKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksIGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIHZvaWQgbG9hZE1ldGhvZExpYnJhcmllcyhVUkkgdXJpLCBNYXAgcGFyYW1ldGVycykgdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlsb2FkTGlicmFyeSh1cmkudG9GaWxlU3RyaW5nKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYoZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLQkJCQl0aHJvdyAoUnVudGltZUV4Y2VwdGlvbillOwotCQkJfQotCQkJdGhyb3cgbmV3IExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbihlKTsKLQkJfQotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCNnZXRQZXJzaXN0ZW5jZVR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGVyc2lzdGVuY2VUeXBlKCkgewotCQlyZXR1cm4gU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCN1bmxvYWQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdW5sb2FkKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gb2JqZWN0LmVSZXNvdXJjZSgpOwotCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzb3VyY2UpLnVubG9hZGVkKChJbnRlcm5hbEVPYmplY3QpIG9iamVjdCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0I3JlbG9hZE9iamVjdHMoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gcmVsb2FkT2JqZWN0cyhDb2xsZWN0aW9uIG9iamVjdHMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlU2F2ZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVTYXZlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMjUxZGU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVTYXZlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5DYWxlbmRhcjsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHdpdGggc3RhdGljIHJvdXRpbmVzIGZvciBYTUkgcGVyc2lzdGVuY2UKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE11bHRpRmlsZVNhdmVVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTU9ERUxfRklMRU5BTUUgPSAibW9kZWwueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT05URU5UX0ZJTEVOQU1FID0gImNvbnRlbnQueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MSUJSQVJZX01PREVMX0ZJTEVOQU1FID0gImxpYnJhcnkueG1pIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUExVR0lOX0VYUE9SVF9GSUxFTkFNRSA9ICJleHBvcnQueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QTFVHSU5fTU9ERUxfRklMRU5BTUUgPSAicGx1Z2luLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRklMRV9FWFRFTlNJT04gPSAiLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQlJBUllfRklMRV9FWFRFTlNJT04gPSAidW1hIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FQQUJJTElUWV9QQVRURVJOX1BBVEggPSAiY2FwYWJpbGl0eXBhdHRlcm5zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSVZFUllfUFJPQ0VTU19QQVRIID0gImRlbGl2ZXJ5cHJvY2Vzc2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU19DT05UUklCVVRJT05fUEFUSCA9ICJwcm9jZXNzY29udHJpYnV0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FID0gImNvbmZpZ3VyYXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuaXNEZWJ1Z2dpbmcoKTsKLQotCXN0YXRpYyBmaW5hbCBib29sZWFuIFBST0ZJTEUgPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KAotCQkJInl5TU1kZEhIbW1zcy5TIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRmlsZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG5hbWUuaW5kZXhPZignLycpICE9IC0xIHx8IG5hbWUuaW5kZXhPZignXFwnKSAhPSAtMQotCQkJCXx8IG5hbWUuaW5kZXhPZignOicpICE9IC0xIHx8IG5hbWUuaW5kZXhPZignKicpICE9IC0xCi0JCQkJfHwgbmFtZS5pbmRleE9mKCc/JykgIT0gLTEgfHwgbmFtZS5pbmRleE9mKCciJykgIT0gLTEKLQkJCQl8fCBuYW1lLmluZGV4T2YoJzwnKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJz4nKSAhPSAtMQotCQkJCXx8IG5hbWUuaW5kZXhPZignfCcpICE9IC0xKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCQlTdHJpbmdCdWZmZXIgc3RyQnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoU3RyaW5nLnZhbHVlT2YoZS5nZXROYW1lKCkpKTsKLQkJZm9yIChlID0gKE1ldGhvZEVsZW1lbnQpICgoRU9iamVjdCkgZSkuZUNvbnRhaW5lcigpOyBlICE9IG51bGw7IGUgPSAoTWV0aG9kRWxlbWVudCkgKChFT2JqZWN0KSBlKQotCQkJCS5lQ29udGFpbmVyKCkpIHsKLQkJCXN0ckJ1ZmYuaW5zZXJ0KDAsIFN0cmluZy52YWx1ZU9mKGUuZ2V0TmFtZSgpKSArICIgPiAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzdHJCdWZmLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlRGlyTmFtZShNZXRob2RFbGVtZW50IG9iaikgewotCQlTdHJpbmcgbmFtZSA9ICgoTWV0aG9kRWxlbWVudCkgb2JqKS5nZXROYW1lKCk7Ci0JCWlmIChpc1ZhbGlkRmlsZU5hbWUobmFtZSkpCi0JCQlyZXR1cm4gbmFtZTsKLQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKE5MUy5iaW5kKAotCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLmludmFsaWROYW1lRXJyb3JfbXNnLCBuYW1lKSwgb2JqKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVPYmplY3QgcmVzb2x2ZShFT2JqZWN0IHByb3h5KSB7Ci0JCWlmICghKHByb3h5IGluc3RhbmNlb2YgSW50ZXJuYWxFT2JqZWN0KSkKLQkJCXJldHVybiBwcm94eTsKLQkJSW50ZXJuYWxFT2JqZWN0IG9iaiA9IChJbnRlcm5hbEVPYmplY3QpIHByb3h5OwotCQlpZiAob2JqLmVQcm94eVVSSSgpID09IG51bGwpCi0JCQlyZXR1cm4gcHJveHk7Ci0JCVhNSVJlc291cmNlSW1wbCByZXMgPSBuZXcgWE1JUmVzb3VyY2VJbXBsKG9iai5lUHJveHlVUkkoKSk7Ci0JCXRyeSB7Ci0JCQlyZXMubG9hZChudWxsKTsKLQkJCXJldHVybiBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBwcm94eTsKLQl9Ci0KLQlzdGF0aWMgUmVzb3VyY2Ugc2F2ZShFT2JqZWN0IG8sIFVSSSB1cmksIE1hcCBvcHRpb25zKSB7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gby5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSBzYXZlKHJlc291cmNlU2V0LCBvLCB1cmksIG9wdGlvbnMpOwotCi0JCWlmIChvcHRpb25zID09IG51bGwpIHsKLQkJCW9wdGlvbnMgPSAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2VTZXQpCi0JCQkJCS5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsKLQkJfQotCQlTdHJpbmcgc3RyID0gKFN0cmluZykgb3B0aW9ucwotCQkJCS5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuUkVGUkVTSF9ORVdfUkVTT1VSQ0UpOwotCQlpZiAoc3RyICE9IG51bGwgJiYgQm9vbGVhbi52YWx1ZU9mKHN0cikuYm9vbGVhblZhbHVlKCkpIHsKLQkJCS8vIG5vdGlmeSBSZWZyZXNoSm9iIHRoZSB0aGlzIHJlc291cmNlIGlzIHNhdmVkIHNvIGl0IHdpbGwgbm90IGJlCi0JCQkvLyByZWxvYWRlZCBhZnRlciByZWZyZXNoaW5nIGl0Ci0JCQkvLwotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc291cmNlU2F2ZWQocmVzb3VyY2UpOwotCi0JCQkvLyByZWZyZXNoIHRoZSBuZXdseSBjcmVhdGVkIHJlc291cmNlIHNvIGl0IGlzIGluIHN5bmNoIHdpdGggdGhlCi0JCQkvLyB3b3Jrc3BhY2UKLQkJCS8vCi0JCQlGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlZnJlc2gocmVzb3VyY2UpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5TYXZlVG9nZXRoZXIoTWFwIG9wdGlvbnMsIE9iamVjdCBvYmopIHsKLQkJU2V0IHNhdmVUb2dldGhlckNsYXNzZXMgPSAoU2V0KSBvcHRpb25zCi0JCQkJLmdldChNdWx0aUZpbGVYTUlTYXZlSW1wbC5TQVZFX1RPR0VUSEVSX0NMQVNTX1NFVCk7Ci0JCWlmIChzYXZlVG9nZXRoZXJDbGFzc2VzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNhdmVUb2dldGhlckNsYXNzZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFQ2xhc3MgZUNscyA9IChFQ2xhc3MpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVDbHMuaXNJbnN0YW5jZShvYmopKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBvYmplY3QgdG8gdGhlIGdpdmVuIHJlc291cmNlIHdoaWxlIHN0aWxsIHByZXNlcnZpbmcKLQkgKiBvYmplY3QncyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEBwYXJhbSBvCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRUbyhSZXNvdXJjZSByZXNvdXJjZSwgTXVsdGlSZXNvdXJjZUVPYmplY3QgbykgewotCQlCYXNpY0VMaXN0IGNvbnRlbnRzID0gKChCYXNpY0VMaXN0KSByZXNvdXJjZS5nZXRDb250ZW50cygpKTsKLQkJaWYgKGNvbnRlbnRzLmlzRW1wdHkoKSkgewotCQkJLy8gdGhpcyB3aWxsIGZsYWcgcmVzb3VyY2UgYXMgbG9hZGVkCi0JCQkvLwotCQkJY29udGVudHMuY2xlYXIoKTsKLQotCQkJY29udGVudHMuc2V0RGF0YSgxLCBuZXcgT2JqZWN0W10geyBvIH0pOwotCQl9IGVsc2UgewotCQkJT2JqZWN0W10gZGF0YSA9IGNvbnRlbnRzLnRvQXJyYXkoKTsKLQkJCU9iamVjdFtdIG5ld0RhdGEgPSBuZXcgT2JqZWN0W2RhdGEubGVuZ3RoICsgMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIG5ld0RhdGEsIDAsIGRhdGEubGVuZ3RoKTsKLQkJCW5ld0RhdGFbZGF0YS5sZW5ndGhdID0gbzsKLQkJCWNvbnRlbnRzLnNldERhdGEobmV3RGF0YS5sZW5ndGgsIG5ld0RhdGEpOwotCQl9Ci0JCW8uZVNldFJlc291cmNlKChSZXNvdXJjZS5JbnRlcm5hbCkgcmVzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIGEgbmV3IGNvbnRhaW5lZCBFT2JqZWN0IGluIGl0cyBvd24gbmV3IHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBvCi0JICogQHBhcmFtIHVyaQotCSAqIEBwYXJhbSBvcHRpb25zCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHNhdmUoUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQsCi0JCQlFT2JqZWN0IG8sIFVSSSB1cmksIE1hcCBvcHRpb25zKSB7Ci0JCXJldHVybiBzYXZlKHJlc291cmNlU2V0LCBvLCB1cmksIG9wdGlvbnMsIHRydWUpOwotCX0KLQkKLQlzdGF0aWMgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHNhdmUoUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQsCi0JCQlFT2JqZWN0IG8sIFVSSSB1cmksIE1hcCBvcHRpb25zLCBib29sZWFuIHJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcikgewotCQkvLyBEZXRhY2ggdGhlIG9iamVjdCBmcm9tIGNvbnRhaW5lciByZXNvdXJjZQotCQkvLwotCQlNdWx0aVJlc291cmNlRU9iamVjdCBtckVPYmogPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG87Ci0JCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCBjdXJyZW50UmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBvCi0JCQkJLmVSZXNvdXJjZSgpOwotCi0JCWlmIChjdXJyZW50UmVzb3VyY2UgIT0gbnVsbCkgewotCQkJY3VycmVudFJlc291cmNlLmRldGFjaGVkKG8pOwotCQl9Ci0KLQkJTGlzdCBuZXdSZXNvdXJjZURlc2NyaXB0b3JzID0gbnVsbDsKLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gKFNldCkgb3B0aW9ucwotCQkJCS5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VUKTsKLQotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzID0gbnVsbDsKLQkJaWYgKGNhblNhdmVUb2dldGhlcihvcHRpb25zLCBvKSkgewotCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIG1mUmVzb3VyY2VTZXQgPSAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2VTZXQpOwotCi0JCQkvLyBpZiB0aGUgdXJpIGhhcyBhIHRlbXBvcmFyeSBVUkksIHVzZSBpdCBpbnN0ZWFkIHRvIGxvY2F0ZSB0aGUKLQkJCS8vIHJlc291cmNlIHRoYXQgaXMgaW4gcHJvY2VzcyBvZiBzYXZpbmcKLQkJCS8vCi0JCQlVUkkgdGVtcFVSSSA9IChVUkkpIG1mUmVzb3VyY2VTZXQuZ2V0VVJJVG9UZW1wVVJJTWFwKCkuZ2V0KHVyaSk7Ci0JCQlpZiAodGVtcFVSSSAhPSBudWxsKSB7Ci0JCQkJdXJpID0gdGVtcFVSSTsKLQkJCX0KLQotCQkJcmVzID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgbWZSZXNvdXJjZVNldC5nZXRSZXNvdXJjZSh1cmkpOwotCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJaWYgKCFyZXMuZ2V0Q29udGVudHMoKS5jb250YWlucyhvKSkgewotCQkJCQlpZiAocmVzLmdldEZpbmFsVVJJKCkgPT0gcmVzLmdldFVSSSgpKSB7Ci0JCQkJCQlpZiAoTXVsdGlGaWxlWE1JU2F2ZUltcGwuY2hlY2tNb2RpZnlSZXF1aXJlZChvcHRpb25zKSkgewotCQkJCQkJCS8vIG5vdCBhIHRlbXAgZmlsZSBvZiBmYWlsLXNhZmUgcGVyc2lzdGVuY2UKLQkJCQkJCQkvLyB0cmFuc2FjdGlvbgotCQkJCQkJCS8vIGNoZWNrIGZvciB3cml0ZWFibGUKLQkJCQkJCQkvLwotCQkJCQkJCU11bHRpRmlsZVNhdmVVdGlsLmNoZWNrTW9kaWZ5KHJlcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlhZGRUbyhyZXMsIG1yRU9iaik7Ci0KLQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJaWYocmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCQkJCQkJLy8gcmVnaXN0ZXIgdGhpcyBuZXcgb2JqZWN0IHdpdGggUmVzb3VyY2VNYW5hZ2VyCi0JCQkJCQkJLy8KLQkJCQkJCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyRm9yKG8sCi0JCQkJCQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJCQkJZGVzYyA9IHJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcihyZXNNZ3IsIG8sIHJlcwotCQkJCQkJCQkJLmdldEZpbmFsVVJJKCkpOwotCQkJCQkJCWlmIChkZXNjICE9IG51bGwgJiYgbW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzTWdyLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCXJlcy5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCQkJCW1mUmVzb3VyY2VTZXQuc2F2ZShyZXMsIG9wdGlvbnMsIGZhbHNlKTsKLQotCQkJCQkJcmVzLmF0dGFjaGVkQWxsKG8pOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gcm9sbGJhY2sKLQkJCQkJCS8vCi0KLQkJCQkJCS8vIHJlbW92ZSB0aGlzIG9iamVjdCBmcm9tIHRoZSByZXNvdXJjZQotCQkJCQkJcmVzLmdldENvbnRlbnRzKCkucmVtb3ZlKG1yRU9iaik7Ci0JCQkJCQltckVPYmouZVNldFJlc291cmNlKChSZXNvdXJjZS5JbnRlcm5hbCkgbnVsbCk7Ci0KLQkJCQkJCS8vIHJlbW92ZSB0aGUgY3JlYXRlZCBSZXNvdXJjZURlc2NyaXB0b3IKLQkJCQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQkJCQlFY29yZVV0aWwucmVtb3ZlKGRlc2MpOwotCQkJCQkJfQotCi0JCQkJCQkvLyByZS1hdHRhY2ggdG8gY29udGFpbmVyIHJlc291cmNlCi0JCQkJCQlpZiAoY3VycmVudFJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQljdXJyZW50UmVzb3VyY2UuYXR0YWNoZWQobyk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHJlczsKLQkJCX0KLQkJfQotCi0JCXJlcyA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JCWFkZFRvKHJlcywgbXJFT2JqKTsKLQkJaWYobXJFT2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlhZGRSZXNvdXJjZU1hbmFnZXIocmVzKTsKLQkJfQotCi0JCU1hcCBvYmpUb0NvbnRhaW5lck1hcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZihyZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIpIHsKLQkJCQluZXdSZXNvdXJjZURlc2NyaXB0b3JzID0gcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKHJlcywKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMpOwotCQkJfQotCi0JCQkvLyBiYWNrIHVwIHRoZSBjb250YWluZXIgcmVmZXJlbmNlcyBhbmQgc2V0IGNvbnRlbnQgb2JqZWN0J3MKLQkJCS8vIGNvbnRhaW5lciB0byBudWxsCi0JCQkvLwotCQkJb2JqVG9Db250YWluZXJNYXAgPSByZW1vdmVDb250YWluZXJzKHJlcyk7Ci0KLQkJCXJlcy5zYXZlKG9wdGlvbnMpOwotCi0JCQlyZXMuYXR0YWNoZWRBbGwobyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCi0JCQkvLyByb2xsYmFjawotCQkJLy8KLQotCQkJLy8gcmVtb3ZlIHRoZSBmYWlsZWQgcmVvdXNyY2UgZnJvbSB0aGUgcmVzb3VyY2Ugc2V0Ci0JCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5yZW1vdmUocmVzKTsKLQkJCW1yRU9iai5lU2V0UmVzb3VyY2UoKFJlc291cmNlLkludGVybmFsKSBudWxsKTsKLQotCQkJLy8gcmVtb3ZlIHRoZSBjcmVhdGVkIFJlc291cmNlRGVzY3JpcHRvcnMKLQkJCWlmKG5ld1Jlc291cmNlRGVzY3JpcHRvcnMgIT0gbnVsbCAmJiAhbmV3UmVzb3VyY2VEZXNjcmlwdG9ycy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXdSZXNvdXJjZURlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFY29yZVV0aWwucmVtb3ZlKChFT2JqZWN0KSBpdGVyLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyByZS1hdHRhY2ggdG8gY29udGFpbmVyIHJlc291cmNlCi0JCQlpZiAoY3VycmVudFJlc291cmNlICE9IG51bGwpIHsKLQkJCQljdXJyZW50UmVzb3VyY2UuYXR0YWNoZWQobyk7Ci0JCQl9Ci0KLQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyByZXN0b3JlIHRoZSBjb250YWluZXIgcmVmZXJlbmNlcyBmb3IgdGhlIGNvbnRlbnQgb2JqZWN0cwotCQkJLy8KLQkJCXJlc3RvcmVDb250YWluZXJzKHJlcywgb2JqVG9Db250YWluZXJNYXApOwotCQl9Ci0KLQkJaWYocmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gYWRkTmV3UmVzb3VyY2VNYW5hZ2VyKHJlcyk7Ci0JCQlpZiAocmVzTWdyID09IG51bGwpIHsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQkvLyBjcmVhdGUgbmV3IFJlc291cmNlTWFuYWdlciBmb3IgbmV3IE1ldGhvZFBsdWdpbgotCQkJCQkvLwotCQkJCQlyZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXJGb3IobywgbW9kaWZpZWRSZXNvdXJjZXMpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNNZ3IuZUNvbnRhaW5lcigpLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCi0JCXJlcy51cGRhdGVUaW1lU3RhbXBzKCk7Ci0KLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXAgcmVtb3ZlQ29udGFpbmVycyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpbnQgc2l6ZSA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuc2l6ZSgpOwotCQlNYXAgb2JqVG9Db250YWluZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXVsdGlSZXNFT2JqID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvdXJjZQotCQkJCQkuZ2V0Q29udGVudHMoKS5nZXQoaSk7Ci0JCQlJbnRlcm5hbEVPYmplY3QgY29udGFpbmVyID0gKEludGVybmFsRU9iamVjdCkgbXVsdGlSZXNFT2JqCi0JCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQlvYmpUb0NvbnRhaW5lck1hcC5wdXQobXVsdGlSZXNFT2JqLCBjb250YWluZXIpOwotCQkJCW11bHRpUmVzRU9iai5lQmFzaWNTZXRDb250YWluZXIobnVsbCwgbXVsdGlSZXNFT2JqCi0JCQkJCQkuZUNvbnRhaW5lckZlYXR1cmVJRCgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb2JqVG9Db250YWluZXJNYXA7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGFpbmVycyBvZiBvYmplY3RzIGluIHJlc291cmNlJ3MgY29udGVudHMKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIG1hcCBvZiBvYmplY3QgdG8gY29udGFpbmVyIGVudHJpZXMKLQkgKi8KLQlzdGF0aWMgTWFwIGdldENvbnRhaW5lcnMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaW50IHNpemUgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLnNpemUoKTsKLQkJTWFwIG9ialRvQ29udGFpbmVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IG11bHRpUmVzRU9iaiA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb3VyY2UKLQkJCQkJLmdldENvbnRlbnRzKCkuZ2V0KGkpOwotCQkJSW50ZXJuYWxFT2JqZWN0IGNvbnRhaW5lciA9IChJbnRlcm5hbEVPYmplY3QpIG11bHRpUmVzRU9iagotCQkJCQkuZUNvbnRhaW5lcigpOwotCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJb2JqVG9Db250YWluZXJNYXAucHV0KG11bHRpUmVzRU9iaiwgY29udGFpbmVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb2JqVG9Db250YWluZXJNYXA7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlcyB0aGUgY29udGFpbmVycyBvZiB0aGUgb2JqZWN0cyBpbiByZXNvdXJjZSdzIGNvbnRlbnRzIHRoYXQKLQkgKiBwcmV2aW91c2x5IHNhdmVkIGluIGEgbWFwIHJldHVybmVkIGZyb20gZ2V0Q29udGFpbmVycyhSZXNvdXJjZSByZXNvdXJjZSkKLQkgKiBvciByZW1vdmVDb250YWluZXJzKFJlc291cmNlIHJlc291cmNlKQotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEBwYXJhbSBvYmpUb0NvbnRhaW5lck1hcAotCSAqIEBzZWUgI2dldENvbnRhaW5lcnMoUmVzb3VyY2UpCi0JICogQHNlZSAjcmVtb3ZlQ29udGFpbmVycyhSZXNvdXJjZSkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlc3RvcmVDb250YWluZXJzKFJlc291cmNlIHJlc291cmNlLAotCQkJTWFwIG9ialRvQ29udGFpbmVyTWFwKSB7Ci0JCWludCBzaXplID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlNdWx0aVJlc291cmNlRU9iamVjdCBtdWx0aVJlc0VPYmogPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc291cmNlCi0JCQkJCS5nZXRDb250ZW50cygpLmdldChpKTsKLQkJCUludGVybmFsRU9iamVjdCBjb250YWluZXIgPSAoSW50ZXJuYWxFT2JqZWN0KSBvYmpUb0NvbnRhaW5lck1hcAotCQkJCQkuZ2V0KG11bHRpUmVzRU9iaik7Ci0JCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQltdWx0aVJlc0VPYmouZUJhc2ljU2V0Q29udGFpbmVyKGNvbnRhaW5lciwgbXVsdGlSZXNFT2JqCi0JCQkJCQkuZUNvbnRhaW5lckZlYXR1cmVJRCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja01vZGlmeShSZXNvdXJjZSByZXNvdXJjZSkgewotCQkvLyBkb24ndCBjaGVjayBpZiB0aGUgcmVzb3VyY2UgaXMgY3VycmVudGx5IGJlaW5nIHNhdmVkIHRvIGEgdGVtcG9yYXJ5Ci0JCS8vIGZpbGUKLQkJLy8KLQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsCi0JCQkJJiYgKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlc291cmNlKS5oYXNUZW1wVVJJKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgcGF0aCA9IHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQlJU3RhdHVzIHN0YXR1cyA9IEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuY2hlY2tNb2RpZnkocGF0aCwKLQkJCQlNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCVN0cmluZyBtc2cgPSBVbWFVdGlsLmdldE1lc3NhZ2Uoc3RhdHVzKTsKLQkJCWlmIChtc2cgPT0gbnVsbCkgewotCQkJCW1zZyA9IE5MUy5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLm1vZGlmeUZpbGVFcnJvcl9tc2csIHBhdGgpOwotCQkJfQotCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKG1zZyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tNb2RpZnkoQ29sbGVjdGlvbiByZXNvdXJjZXMpIHsKLQkJQXJyYXlMaXN0IHBhdGhMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCAmJiAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXNvdXJjZSkuaGFzVGVtcFVSSSgpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlwYXRoTGlzdC5hZGQocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQl9Ci0JCWlmKCFwYXRoTGlzdC5pc0VtcHR5KCkpIHsKLQkJCVN0cmluZ1tdIHBhdGhzID0gbmV3IFN0cmluZ1twYXRoTGlzdC5zaXplKCldOwotCQkJcGF0aExpc3QudG9BcnJheShwYXRocyk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuY2hlY2tNb2RpZnkocGF0aHMsCi0JCQkJCU1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSk7Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlTdHJpbmcgbXNnID0gVW1hVXRpbC5nZXRNZXNzYWdlKHN0YXR1cyk7Ci0JCQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQkJCW1zZyA9IE5MUy5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLm1vZGlmeUZpbGVFcnJvcl9tc2csIEFycmF5cwotCQkJCQkJCS5hc0xpc3QocGF0aHMpKTsKLQkJCQl9Ci0JCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKG1zZyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tPdXRPZlN5bmNoKENvbGxlY3Rpb24gcmVzb3VyY2VzKSB7Ci0JCS8vIGNoZWNrIGZvciBvdXQtb2Ytc3luY2gKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlcyA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGl0ZXIKLQkJCQkJLm5leHQoKTsKLQkJCWlmKHJlcy5pc0xvYWRlZCgpICYmICFyZXMuaGFzVGVtcFVSSSgpKSB7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQlpZihmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWxvbmcgbGFzdE1vZGlmaWVkID0gZmlsZS5sYXN0TW9kaWZpZWQoKTsKLQkJCQkJaWYgKHJlcy5nZXRGaWxlTGFzdE1vZGlmaWVkKCkgIT0gbGFzdE1vZGlmaWVkICYmICFzYW1lKGxhc3RNb2RpZmllZCwgcmVzLmdldEZpbGVMYXN0TW9kaWZpZWQoKSkpIHsKLQkJCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZCgKLQkJCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMucmVzb3VyY2VPdXRPZlN5bmNoX21zZywgcmVzCi0JCQkJCQkJCS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24obXNnKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBleGlzdGluZyBvd24gcmVzb3VyY2Ugb2YgYSBjb250YWluZWQgRU9iamVjdC4gQWRkcyByZXNvdXJjZXMKLQkgKiB0aGF0IGhhdmUgYmVlbiBtb2RpZmVkIGFmdGVyIHRoaXMgY2FsbCB0byB0aGUgTU9ESUZJRURfUkVTT1VSQ0VfU0VUIG9mCi0JICogdGhlIHNhdmUgb3B0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgaGFzIGJlZW4gc2F2ZWQgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2F2ZShSZXNvdXJjZSByZXNvdXJjZSwgTWFwIG9wdGlvbnMpIHsKLQkJaWYgKHJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVNldCBtb2RpZmllZFJlc291cmNlcyA9IChTZXQpIG9wdGlvbnMKLQkJCQkuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLk1PRElGSUVEX1JFU09VUkNFX1NFVCk7Ci0KLQkJLy8gc2hvdWxkIG5vdCBjaGFuZ2UgcmVzb3VyY2UgbG9jYXRpb24gYXV0b21hdGljYWxseSB3aXRob3V0IGxldHRpbmcKLQkJLy8gdXNlciBrbm93IGFib3V0IGl0Ci0JCS8vCi0JCS8vIGFkanVzdExvY2F0aW9uKHJlc291cmNlLCBtb2RpZmllZFJlc291cmNlcyk7Ci0KLQkJLy8gYmFjayB1cCB0aGUgY29udGFpbmVyIHJlZmVyZW5jZXMgYW5kIHNldCBjb250ZW50IG9iamVjdCdzIGNvbnRhaW5lcgotCQkvLyB0byBudWxsCi0JCS8vCi0JCU1hcCBvYmpUb0NvbnRhaW5lck1hcCA9IHJlbW92ZUNvbnRhaW5lcnMocmVzb3VyY2UpOwotCQl0cnkgewotCQkJcmVzb3VyY2Uuc2F2ZShvcHRpb25zKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyByZXN0b3JlIHRoZSBjb250YWluZXIgcmVmZXJlbmNlcyBmb3IgdGhlIGNvbnRlbnQgb2JqZWN0cwotCQkJLy8KLQkJCXJlc3RvcmVDb250YWluZXJzKHJlc291cmNlLCBvYmpUb0NvbnRhaW5lck1hcCk7Ci0JCX0KLQotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gYWRkTmV3UmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlKTsKLQkJaWYgKHJlc01nciAhPSBudWxsICYmIG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNNZ3IuZUNvbnRhaW5lcigpLmVSZXNvdXJjZSgpKTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiBSZXNvdXJjZU1hbmFnZXIgdGhhdCBpcyBqdXN0IGFkZGVkIHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyIHRyZWUKLQkgKiAgICAgICAgIG9yIG51bGwuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VNYW5hZ2VyIGFkZE5ld1Jlc291cmNlTWFuYWdlcihSZXNvdXJjZSByZXNvdXJjZSkgewotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlKTsKLQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQlFT2JqZWN0IGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOwotCQlpZiAocmVzTWdyICE9IG51bGwgJiYgY29udGFpbmVyICE9IG51bGwgJiYgcmVzTWdyLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkvLyBuZXcgUmVzb3VyY2VNYW5hZ2VyIGlzIGFkZGVkIHRvIHRoZSByZXNvdXJjZQotCQkJLy8KLQkJCVJlc291cmNlTWFuYWdlciBwYXJlbnRSZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIoY29udGFpbmVyCi0JCQkJCS5lUmVzb3VyY2UoKSk7Ci0KLQkJCS8vIGNoZWNrIGlmIHJlc01nciBpcyBhbHJlYWR5IGEgc3ViIG1hbmFnZXIgb2YgcGFyZW50UmVzTWdyIGJlZm9yZQotCQkJLy8gYWRkaW5nIGl0Ci0JCQkvLwotCQkJaWYgKCFwYXJlbnRSZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKS5jb250YWlucyhyZXNNZ3IpKSB7Ci0JCQkJcGFyZW50UmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkuYWRkKHJlc01ncik7Ci0JCQkJcmV0dXJuIHJlc01ncjsKLQkJCX0KLQotCQkJLy8gcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKHBhcmVudFJlc01nciwgcmVzTWdyLAotCQkJLy8gcmVzTWdyLmVSZXNvdXJjZSgpLmdldFVSSSgpLmFwcGVuZEZyYWdtZW50KHJlc01nci5nZXRHdWlkKCkpKTsKLQkJCS8vIHJldHVybiByZXNNZ3I7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvRmlsZVN0cmluZyhFT2JqZWN0IGVPYmopIHsKLQkJcmV0dXJuIGVPYmouZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUoCi0JCQkJZU9iai5lUmVzb3VyY2UoKS5nZXRVUkkoKSkudG9GaWxlU3RyaW5nKCk7Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gaGFzT3duRm9sZGVyKE9iamVjdCBlKSB7Ci0JCXJldHVybiBlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50OwotCX0KLQotCXN0YXRpYyBib29sZWFuIGhhc093blJlc291cmNlKE9iamVjdCBvYmosIENvbGxlY3Rpb24gc2F2ZVNlcGFyYXRlbHlDbGFzc1NldCkgewotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kVW5pdCkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoc2F2ZVNlcGFyYXRlbHlDbGFzc1NldCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzYXZlU2VwYXJhdGVseUNsYXNzU2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRUNsYXNzIGVDbHMgPSAoRUNsYXNzKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlQ2xzLmlzSW5zdGFuY2Uob2JqKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlRmlsZVVSSShNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUuZUNvbnRhaW5lcigpID09IG51bGwpCi0JCQlyZXR1cm4gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGUuZVJlc291cmNlKCkpLmdldEZpbmFsVVJJKCk7Ci0KLQkJLy8gSGFuZGxlIFByb2Nlc3NDb21wb25lbnQgc3BlY2lhbGx5LiBQcm9jZXNzQ29tcG9uZW50IG9iamVjdHMgYXJlCi0JCS8vIHN0b3JlZCBhcyBmb2xsb3dpbmcgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5OgotCQkvLyA8TWV0aG9kIExpYnJhcnk+Ci0JCS8vIHxfIDxNZXRob2QgUGx1Z2luPgotCQkvLyB8X3Byb2Nlc3NlcwotCQkvLyB8X2NhcGFiaWxpdHlfcGF0dGVybnMKLQkJLy8gfF9kZWxpdmVyeV9wcm9jZXNzZXMKLQkJLy8gfF9wcm9jZXNzX2NvbnRyaWJ1dGlvbnMKLQkJLy8KLQkJaWYgKGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IChNZXRob2RMaWJyYXJ5KSBwbHVnaW4uZUNvbnRhaW5lcigpOwotCQkJU3RyaW5nIHBsdWdpbkRpcjsKLQkJCWlmIChsaWIgIT0gbnVsbCkgewotCQkJCVN0cmluZyBsaWJEaXIgPSBuZXcgRmlsZSgoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgbGliCi0JCQkJCQkuZVJlc291cmNlKCkpLmdldEZpbmFsVVJJKCkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpOwotCQkJCXBsdWdpbkRpciA9IGxpYkRpciArIEZpbGUuc2VwYXJhdG9yICsgcGx1Z2luLmdldE5hbWUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHBsdWdpbi5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkJCS8vIHBsdWdpbiBpcyBhbHJlYWR5IGRlbGV0ZWQKLQkJCQkJLy8KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXBsdWdpbkRpciA9IG5ldyBGaWxlKCgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBwbHVnaW4KLQkJCQkJCS5lUmVzb3VyY2UoKSkuZ2V0RmluYWxVUkkoKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCQlTdHJpbmcgcmVsYXRpdmVEaXI7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZSkKLQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCWlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQlyZWxhdGl2ZURpciA9IENBUEFCSUxJVFlfUEFUVEVSTl9QQVRIOwotCQkJfSBlbHNlIGlmIChwcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJcmVsYXRpdmVEaXIgPSBERUxJVkVSWV9QUk9DRVNTX1BBVEg7Ci0JCQl9IGVsc2UgewotCQkJCXJlbGF0aXZlRGlyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJU3RyaW5nIHBhdGggPSBwbHVnaW5EaXIgKyBGaWxlLnNlcGFyYXRvciArIHJlbGF0aXZlRGlyCi0JCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyBlLmdldE5hbWUoKSArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCSsgREVGQVVMVF9NT0RFTF9GSUxFTkFNRTsKLQkJCXJldHVybiBVUkkuY3JlYXRlRmlsZVVSSShwYXRoKTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKSB7Ci0JCQlTdHJpbmcgZGlyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZGlyID0gbmV3IEZpbGUoKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIFVtYVV0aWwKLQkJCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50KGUpLmVSZXNvdXJjZSgpKS5nZXRGaW5hbFVSSSgpCi0JCQkJCQkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IGV4OwotCQkJfQotCQkJcmV0dXJuIFVSSS5jcmVhdGVGaWxlVVJJKGRpciArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCSsgREVGQVVMVF9DT05URU5UX0ZJTEVOQU1FKTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQlVUkkgdXJpOwotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQ29udGVudERlc2NyaXB0aW9uKSBlOwotCQkJU3RyaW5nIHBhdGggPSBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmdldENvcnJlY3RQYXRoKGNvbnRlbnQpOwotCQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJCVN0cmluZyBkaXIgPSAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZS5lUmVzb3VyY2UoKSkKLQkJCQkJCS5nZXRGaW5hbFVSSSgpLnRyaW1TZWdtZW50cygxKS50b0ZpbGVTdHJpbmcoKQotCQkJCQkJKyBGaWxlLnNlcGFyYXRvcjsKLQkJCQlwYXRoID0gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXROZXh0QXZhaWxhYmxlRmlsZU5hbWUoZGlyLAotCQkJCQkJY29udGVudCk7Ci0JCQl9Ci0JCQl1cmkgPSBVUkkuY3JlYXRlRmlsZVVSSShwYXRoKTsKLQkJCXJldHVybiB1cmk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCVN0cmluZyBkaXIgPSBuZXcgU3RyaW5nQnVmZmVyKCgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBlCi0JCQkJCS5lQ29udGFpbmVyKCkuZVJlc291cmNlKCkpLmdldEZpbmFsVVJJKCkudHJpbVNlZ21lbnRzKDEpCi0JCQkJCS50b0ZpbGVTdHJpbmcoKSkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKS5hcHBlbmQoCi0JCQkJCU1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FKS5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpCi0JCQkJCS50b1N0cmluZygpOwotCQkJU3RyaW5nIHBhdGggPSBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmdldE5leHRBdmFpbGFibGVGaWxlTmFtZShkaXIsCi0JCQkJCVN0clV0aWwubWFrZVZhbGlkRmlsZU5hbWUoZS5nZXROYW1lKCkpLAotCQkJCQkoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGUpOwotCQkJcmV0dXJuIFVSSS5jcmVhdGVGaWxlVVJJKHBhdGgpOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUVPYmplY3QgbGFzdENvbnRhaW5lciA9IG51bGw7Ci0JCWZvciAoTWV0aG9kRWxlbWVudCBvYmogPSAoTWV0aG9kRWxlbWVudCkgZS5lQ29udGFpbmVyKCk7IG9iaiAhPSBudWxsOyBvYmogPSAoTWV0aG9kRWxlbWVudCkgb2JqCi0JCQkJLmVDb250YWluZXIoKSkgewotCQkJbGFzdENvbnRhaW5lciA9IG9iajsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJcGF0aC5pbnNlcnQoMCwgbmV3IEZpbGUoKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIG9iagotCQkJCQkJLmVSZXNvdXJjZSgpKS5nZXRGaW5hbFVSSSgpLnRvRmlsZVN0cmluZygpKQotCQkJCQkJLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCXBhdGguaW5zZXJ0KDAsIG9iai5nZXROYW1lKCkpLmluc2VydCgwLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCQkJfQotCQl9Ci0JCWlmIChsYXN0Q29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBlLmVSZXNvdXJjZSgpICE9IG51bGwgPyAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZQotCQkJCQkuZVJlc291cmNlKCkpLmdldEZpbmFsVVJJKCkgOiBudWxsOwotCQl9Ci0JCWlmICghKGxhc3RDb250YWluZXIgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSkgewotCQkJcGF0aC5pbnNlcnQoMCwgbmV3IEZpbGUodG9GaWxlU3RyaW5nKGxhc3RDb250YWluZXIpKQotCQkJCQkuZ2V0UGFyZW50RmlsZSgpLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0KLQotCQlTdHJpbmcgbW9kZWxGaWxlTmFtZTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCW1vZGVsRmlsZU5hbWUgPSBERUZBVUxUX1BMVUdJTl9NT0RFTF9GSUxFTkFNRTsKLQkJfSBlbHNlIHsKLQkJCW1vZGVsRmlsZU5hbWUgPSBNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX01PREVMX0ZJTEVOQU1FOwotCQl9Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlRmlsZVVSSShwYXRoLnRvU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCSsgTXVsdGlGaWxlU2F2ZVV0aWwuY3JlYXRlRGlyTmFtZShlKSArIEZpbGUuc2VwYXJhdG9yCi0JCQkJKyBtb2RlbEZpbGVOYW1lKTsKLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlKEZpbGUgZmlsZSkgewotCQlGaWxlW10gZmlsZXMgPSBmaWxlLmxpc3RGaWxlcygpOwotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWRlbGV0ZShmaWxlc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJZmlsZS5kZWxldGUoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcGFyYW0gbW9kaWZpZWRSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIG91dHB1dCBvZiByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBhZnRlciB0aGlzIGNhbGwuCi0JICovCi0Jc3RhdGljIHZvaWQgc2V0VVJJTWFwcGluZyhFT2JqZWN0IGUsIFVSSSB1cmksIFNldCBtb2RpZmllZFJlc291cmNlcykgewotCQlNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyID0gKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgZQotCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpOwotCQl1cmlDb252ZXJ0ZXIuc2V0VVJJTWFwcGluZyhlLCB1cmksIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gbW9kaWZpZWRSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIG91dHB1dCBvZiByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBhZnRlciB0aGlzIGNhbGwKLQkgKi8KLQlzdGF0aWMgdm9pZCB1cGRhdGVVUklNYXBwaW5ncyhNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UsCi0JCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJdXBkYXRlVVJJTWFwcGluZ3MocmVzb3VyY2UsIG1vZGlmaWVkUmVzb3VyY2VzLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHJlc291cmNlU2V0IGhhcyB0aGUgbG9hZGVkIHJlc291cmNlIHdpdGggdGhlIGdpdmVuCi0JICogdXJpCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlU2V0Ci0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4KLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBoYXNMb2FkZWRSZXNvdXJjZShSZXNvdXJjZVNldCByZXNvdXJjZVNldCwgVVJJIHVyaSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZS5pc0xvYWRlZCgpICYmIHJlc291cmNlLmdldFVSSSgpLmVxdWFscyh1cmkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgVVJJTWFwcGluZ3Mgd2l0aCB0aGUgZmluYWwgVVJJIG9mIHRoZSBnaXZlbiByZXNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqLwotCXN0YXRpYyB2b2lkIHVwZGF0ZVVSSU1hcHBpbmdzKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSwKLQkJCVNldCBtb2RpZmllZFJlc291cmNlcywgYm9vbGVhbiBhZnRlck1vdmUpIHsKLQkJdXBkYXRlVVJJTWFwcGluZ3MocmVzb3VyY2UsIHJlc291cmNlLmdldEZpbmFsVVJJKCksIG1vZGlmaWVkUmVzb3VyY2VzLAotCQkJCWFmdGVyTW92ZSk7Ci0JfQotCi0Jc3RhdGljIHZvaWQgdXBkYXRlVVJJTWFwcGluZ3MoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlLCBVUkkgdXJpLAotCQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzLCBib29sZWFuIGFmdGVyTW92ZSkgewotCQkvLyB0aGUgcmVzb3VyY2UgVVJJIGhhcyBiZWVuIGNoYW5nZWQsIHJlc2V0IGFsbCB0aGUgY2FjaGVkIHJlc29sdmVkIFVSSQotCQkvLyBpbiBhbGwgb2Zmc3RyaW5nIHJlc291cmNlIGRlc2NyaXB0b3JzCi0JCS8vIG9mIGl0cyBtYW5hZ2VyLCBpZiBpdCBoYXMgb25lLgotCQkvLwotCQlIYXNoTWFwIG9sZFVSSVRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwID0gbnVsbDsKLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJlc291cmNlTWFuYWdlcihyZXNvdXJjZSk7Ci0JCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJb2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzTWdyLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJlc291cmNlRGVzY3JpcHRvcikgewotCQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9ICgoUmVzb3VyY2VEZXNjcmlwdG9yKSBvYmopOwotCQkJCQlvbGRVUklUb1Jlc291cmNlRGVzY3JpcHRvck1hcC5wdXQoZGVzYy5nZXRSZXNvbHZlZFVSSSgpLAotCQkJCQkJCWRlc2MpOwotCQkJCQlpZiAoYWZ0ZXJNb3ZlKSB7Ci0JCQkJCQlkZXNjLmNsZWFyUmVzb2x2ZWRVUkkoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJCS8vIHNldFVSSU1hcHBpbmcoZWxlbWVudCwgcmVzb3VyY2UuZ2V0RmluYWxVUkkoKSwKLQkJCS8vIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCU11bHRpRmlsZVVSSUNvbnZlcnRlciB1cmlDb252ZXJ0ZXIgPSAoTXVsdGlGaWxlVVJJQ29udmVydGVyKSByZXNvdXJjZQotCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCXVyaUNvbnZlcnRlci5zZXRVUklNYXBwaW5nKGVsZW1lbnQsIHVyaSwgbW9kaWZpZWRSZXNvdXJjZXMsCi0JCQkJCWFmdGVyTW92ZSk7Ci0JCX0KLQotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0JCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCS8vIHNldFVSSU1hcHBpbmcoZWxlbWVudCwgcmVzb3VyY2UuZ2V0VVJJKCksIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJLy8gfQotCi0JCWlmIChvbGRVUklUb1Jlc291cmNlRGVzY3JpcHRvck1hcCAhPSBudWxsKSB7Ci0JCQkvLyBnbyB0aHJ1IHRoZSBsaXN0IG9mIGxvYWRlZCByZXNvdXJjZXMgaW4gcmVzb3VyY2Ugc2V0IHRvIHVwZGF0ZQotCQkJLy8gdGhlIFVSSQotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBvbGRVUklUb1Jlc291cmNlRGVzY3JpcHRvck1hcAotCQkJCQkJLmdldChyZXMuZ2V0VVJJKCkpOwotCQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQkJaWYgKGFmdGVyTW92ZSkgewotCQkJCQkJcmVzLnNldFVSSShkZXNjLmdldFJlc29sdmVkVVJJKCkpOwotCQkJCQl9IGVsc2UgaWYgKHJlcy5pc0xvYWRlZCgpKSB7Ci0JCQkJCQlkZXNjLmNsZWFyUmVzb2x2ZWRVUkkoKTsKLQkJCQkJCXJlcy5zZXRVUkkoZGVzYy5nZXRSZXNvbHZlZFVSSSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXNNZ3IKLQkgKiBAcGFyYW0gbwotCSAqIEBwYXJhbSB1cmkKLQkgKi8KLQkvLyBwcml2YXRlIHN0YXRpYyB2b2lkIHNldFVyaShSZXNvdXJjZU1hbmFnZXIgcmVzTWdyLCBNZXRob2RFbGVtZW50IGUsIFVSSQotCS8vIHVyaSkgewotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuaXRlcmF0b3IoKTsKLQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBSZXNvdXJjZURlc2NyaXB0b3IgcmVzRGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCS8vIGlmKHJlc0Rlc2MuZ2V0SWQoKS5lcXVhbHMoZS5nZXRHdWlkKCkpKSB7Ci0JLy8gLy8gY2hhbmdlIG90aGVyIFVSSXMgdGhhdCBhcmUgY2hhbmdlZCBhcyByZXN1bHQgb2YgdGhpcyBVUkkgY2hhbmdlCi0JLy8gLy8KLQkvLyBpZih1cmkuZnJhZ21lbnQoKSA9PSBudWxsKSB7Ci0JLy8gVVJJIG9sZERpciA9IFVSSS5jcmVhdGVGaWxlVVJJKG5ldwotCS8vIEZpbGUocmVzRGVzYy5nZXRSZXNvbHZlZFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKSArCi0JLy8gRmlsZS5zZXBhcmF0b3IpOwotCS8vIFVSSSBuZXdEaXIgPSBVUkkuY3JlYXRlRmlsZVVSSShuZXcgRmlsZSh1cmkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpICsKLQkvLyBGaWxlLnNlcGFyYXRvcik7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuaXRlcmF0b3IoKTsKLQkvLyBpdGVyYXRvcgotCS8vIC5oYXNOZXh0KCk7KSB7Ci0JLy8gUmVzb3VyY2VEZXNjcmlwdG9yIGVsZW1lbnQgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyYXRvci5uZXh0KCk7Ci0JLy8gVVJJIGN1cnJlbnRVcmkgPSBlbGVtZW50LmdldFJlc29sdmVkVVJJKCk7Ci0JLy8gVVJJIG5ld1VyaSA9IGN1cnJlbnRVcmkucmVwbGFjZVByZWZpeChvbGREaXIsIG5ld0Rpcik7Ci0JLy8gaWYobmV3VXJpICE9IG51bGwpIHsKLQkvLyBlbGVtZW50LnNldFJlc29sdmVkVVJJKG5ld1VyaSk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gcmVzRGVzYy5zZXRSZXNvbHZlZFVSSSh1cmkpOwotCS8vIHJldHVybjsKLQkvLyB9Ci0JLy8gfQotCS8vIFJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0KLQkvLyBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZXNvdXJjZURlc2NyaXB0b3IoKTsKLQkvLyByZXNEZXNjLnNldElkKGUuZ2V0R3VpZCgpKTsKLQkvLyByZXNEZXNjLnNldFJlc29sdmVkVVJJKHVyaSk7Ci0JLy8gcmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5hZGQocmVzRGVzYyk7Ci0JLy8gfQotCS8qKgotCSAqIEdldHMgdGhlIHJpZ2h0IFJlc291cmNlTWFuYWdlciBmb3IgdGhlIGdpdmVuIEVPYmplY3QsIGNyZWF0ZXMgbmV3Ci0JICogUmVzb3VyY2VNYW5hZ2VyIGlmIGl0IGRvZXMgbm90IGV4aXN0IHlldC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kaWZpZWRSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIG91dHB1dCBvZiByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBhZnRlciB0aGlzIGNhbGwuCi0JICovCi0Jc3RhdGljIFJlc291cmNlTWFuYWdlciBnZXRSZXNvdXJjZU1hbmFnZXJGb3IoRU9iamVjdCBlT2JqLAotCQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZU9iai5lQ29udGFpbmVyKCkgIT0gbnVsbCA/IGVPYmouZUNvbnRhaW5lcigpCi0JCQkJLmVSZXNvdXJjZSgpIDogZU9iai5lUmVzb3VyY2UoKTsKLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJlc291cmNlTWFuYWdlcihyZXNvdXJjZSk7Ci0JCWlmIChyZXNNZ3IgPT0gbnVsbCkgewotCQkJcmVzTWdyID0gUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVzb3VyY2VNYW5hZ2VyKCk7Ci0KLQkJCS8vIGFkZCB0byBiZWdpbm5pbmcgb2YgdGhlIHJlc291cmNlJ3MgY29udGVudHMKLQkJCS8vCi0JCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZCgwLCByZXNNZ3IpOwotCi0JCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCQlFT2JqZWN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lcldpdGhEaXJlY3RSZXNvdXJjZSgoSW50ZXJuYWxFT2JqZWN0KSBlT2JqKTsKLQkJCWlmIChjb250YWluZXIgIT0gbnVsbCAmJiBjb250YWluZXIuZVJlc291cmNlKCkgIT0gcmVzb3VyY2UpIHsKLQkJCQlSZXNvdXJjZU1hbmFnZXIgcGFyZW50UmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyRm9yKGNvbnRhaW5lciwKLQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCQlpZiAocGFyZW50UmVzTWdyICE9IG51bGwpIHsKLQkJCQkJcGFyZW50UmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkuYWRkKHJlc01ncik7Ci0JCQkJCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocGFyZW50UmVzTWdyLmVSZXNvdXJjZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXNNZ3I7Ci0KLQl9Ci0KLQlzdGF0aWMgTGlzdCByZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlLAotCQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXJGb3IoCi0JCQkJUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpLCBtb2RpZmllZFJlc291cmNlcyk7Ci0KLQkJTGlzdCByZXNvdXJjZURlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSByZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIocmVzTWdyLAotCQkJCQkJZWxlbWVudCwgcmVzb3VyY2UuZ2V0RmluYWxVUkkoKSk7Ci0JCQkJaWYgKHJlc0Rlc2MgIT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZURlc2NyaXB0b3JzLmFkZChyZXNEZXNjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCFyZXNvdXJjZURlc2NyaXB0b3JzLmlzRW1wdHkoKSAmJiBtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzTWdyLmVSZXNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VEZXNjcmlwdG9yczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlRGVzY3JpcHRvciByZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIoCi0JCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyLCBPYmplY3QgZWxlbWVudCwgVVJJIHVyaSkgewotCQlTdHJpbmcgZ3VpZCA9IGdldEd1aWQoZWxlbWVudCk7Ci0JCWlmIChyZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKGd1aWQpID09IG51bGwpIHsKLQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZURlc2NyaXB0b3IocmVzTWdyLCBndWlkLCB1cmkpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvLyAvKioKLQkvLyAqIENyZWF0ZXMgYSBuZXcgUmVzb3VyY2VEZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudCBhbmQgYWRkIGl0Ci0JLy8gdG8gdGhlIGdpdmVuIFJlc291cmNlTWFuYWdlcgotCS8vICoKLQkvLyAqIEBwYXJhbSBlCi0JLy8gKiBAcmV0dXJuIG5ld2x5IGFkZGVkIFJlc291cmNlRGVzY3JpcHRvcgotCS8vICovCi0JLy8gcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VEZXNjcmlwdG9yCi0JLy8gY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKFJlc291cmNlTWFuYWdlciByZXNNZ3IsIE1ldGhvZEVsZW1lbnQgZSkgewotCS8vIHJldHVybiBjcmVhdGVSZXNvdXJjZURlc2NyaXB0b3IocmVzTWdyLCBlLmdldEd1aWQoKSwgY3JlYXRlRmlsZVVSSShlKSk7Ci0JLy8gfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBSZXNvdXJjZURlc2NyaXB0b3Igd2l0aCB0aGUgZ2l2ZW4gaWQgYW5kIHJlc29sdmVkVVJJLCB0aGVuCi0JICogYWRkcyBpdCB0byB0aGUgZ2l2ZW4gcmVzTWdyCi0JICogCi0JICogQHBhcmFtIHJlc01ncgotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSByZXNvbHZlZFVSSQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZURlc2NyaXB0b3IgY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKAotCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciwgU3RyaW5nIGlkLCBVUkkgcmVzb2x2ZWRVUkkpIHsKLQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVSZXNvdXJjZURlc2NyaXB0b3IoKTsKLQkJcmVzRGVzYy5zZXRJZChpZCk7Ci0JCXJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuYWRkKHJlc0Rlc2MpOwotCQlyZXNEZXNjLnNldFJlc29sdmVkVVJJKHJlc29sdmVkVVJJKTsKLQkJcmV0dXJuIHJlc0Rlc2M7Ci0JfQotCi0JLy8gc3RhdGljIHZvaWQgc2V0VXJpKE11bHRpRmlsZVVSSUNvbnZlcnRlciB1cmlDb252ZXJ0ZXIsIE1ldGhvZEVsZW1lbnQgZSwKLQkvLyBVUkkgdXJpKSB7Ci0JLy8gc2V0VXJpKHVyaUNvbnZlcnRlciwgZSwgdXJpLCBmYWxzZSk7Ci0JLy8gfQotCi0JLy8gc3RhdGljIHZvaWQgc2V0VXJpKE11bHRpRmlsZVVSSUNvbnZlcnRlciB1cmlDb252ZXJ0ZXIsIE1ldGhvZEVsZW1lbnQgZSwKLQkvLyBVUkkgdXJpLCBib29sZWFuIHNhdmVOb3cpIHsKLQkvLyBSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gdXJpQ29udmVydGVyLmdldFJlc291cmNlTWFuYWdlcigpOwotCS8vIGlmKHJlc01nciA9PSBudWxsKSB7Ci0JLy8gcmVzTWdyID0gUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVzb3VyY2VNYW5hZ2VyKCk7Ci0JLy8gdXJpQ29udmVydGVyLnNldFJlc291cmNlTWFuYWdlcihyZXNNZ3IpOwotCS8vIH0KLQkvLyBzZXRVcmkocmVzTWdyLCBlLCB1cmkpOwotCS8vIHJlc01nci5lUmVzb3VyY2UoKTsKLQkvLyB9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRHdWlkKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZS5nZXRHdWlkKCkgPT0gbnVsbCB8fCBlLmdldEd1aWQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZS5zZXRHdWlkKEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudCBpbiBpdHMgb3duIGZpbGUgd2hpbGUgc3RpbGwgcHJlc2VydmluZyB0aGUKLQkgKiBleGlzdGluZyBjb250YWlubWVudCBhc3NvY2lhdGlvbiBpZiB0aGVyZSBpcyBhbnkKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlKE1ldGhvZEVsZW1lbnQgZSwgTWFwIG9wdGlvbnMpIHsKLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZQotCQkJCS5lUmVzb3VyY2UoKTsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UKLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCkgewotCQkJb3B0aW9ucyA9IHJlc291cmNlU2V0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQl9Ci0JCUVPYmplY3QgY29udGFpbmVyID0gZS5lQ29udGFpbmVyKCk7Ci0KLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJb3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VULAotCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJdHJ5IHsKLQkJCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5jcmVhdGVGaWxlVVJJKGUpOwotCQkJYm9vbGVhbiBjcmVhdGVSZXNvdXJjZSA9IHJlc291cmNlID09IG51bGwKLQkJCQkJfHwgKGNvbnRhaW5lciAhPSBudWxsICYmIHJlc291cmNlID09IGNvbnRhaW5lci5lUmVzb3VyY2UoKSk7Ci0JCQlpZiAoY3JlYXRlUmVzb3VyY2UpIHsKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5zYXZlKGUsIHVyaSwgb3B0aW9ucyk7Ci0JCQl9IGVsc2UgewotCQkJCVVSSSBvbGRVcmkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCQlpZiAoIW9sZFVyaS5lcXVhbHModXJpKSkgewotCi0JCQkJCS8vIHJlc291cmNlJ3MgbG9jYXRpb24gaXMgY2hhbmdlZC4KLQkJCQkJLy8gbW92ZSB0aGUgcmVzb3VyY2UsIHRoZW4gY2hhbmdlIGl0cyBVUkkgaWYgdGhlIHJlc291cmNlCi0JCQkJCS8vIG1vdmUgaXMgc3VjY2Vzc2Z1bC4KLQkJCQkJLy8gICAKLQkJCQkJaWYgKEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkubW92ZShvbGRVcmkudG9GaWxlU3RyaW5nKCksCi0JCQkJCQkJdXJpLnRvRmlsZVN0cmluZygpKSkgewotCQkJCQkJLy8gTXVsdGlGaWxlVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9Ci0JCQkJCQkvLyAoTXVsdGlGaWxlVVJJQ29udmVydGVyKQotCQkJCQkJLy8gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQkJCS8vIE11bHRpRmlsZVNhdmVVdGlsLnNldFVyaSh1cmlDb252ZXJ0ZXIsIGUsIHVyaSk7Ci0JCQkJCQlyZXNvdXJjZS5zZXRVUkkodXJpKTsKLQkJCQkJCXVwZGF0ZVVSSU1hcHBpbmdzKHJlc291cmNlLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAocmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLnNhdmUocmVzb3VyY2UsIG9wdGlvbnMpOwotCQkJCX0KLQkJCX0KLQotCQkJcmVzb3VyY2VTZXQuc2F2ZU1vZGlmaWVkUmVzb3VyY2VzKG9wdGlvbnMpOwotCQl9IGZpbmFsbHkgewotCi0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlKFJlc291cmNlU2V0IHJlc291cmNlU2V0LCBNZXRob2RFbGVtZW50IGUsCi0JCQlNYXAgb3B0aW9ucykgewotCQlVUkkgdXJpID0gY3JlYXRlRmlsZVVSSShlKTsKLQkJc2F2ZShyZXNvdXJjZVNldCwgZSwgdXJpLCBvcHRpb25zKTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBhZGp1c3RMb2NhdGlvbihSZXNvdXJjZSByZXNvdXJjZSwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVVJJIG5ld0ZpbGUgPSBjcmVhdGVGaWxlVVJJKGUpOwotCQlpZiAobmV3RmlsZSAhPSBudWxsICYmIGFkanVzdExvY2F0aW9uKHJlc291cmNlLCBuZXdGaWxlKSkgewotCQkJcmVzb3VyY2Uuc2V0VVJJKG5ld0ZpbGUpOwotCQkJdXBkYXRlVVJJTWFwcGluZ3MoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UsCi0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJfQotCX0KLQotCXN0YXRpYyBVUkkgZ2V0TmV3VVJJKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSkgewotCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCWlmIChlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVVSSSBuZXdGaWxlID0gY3JlYXRlRmlsZVVSSShlKTsKLQkJaWYgKG5ld0ZpbGUgIT0gbnVsbCAmJiBhZGp1c3RMb2NhdGlvblJlcXVpcmVkKHJlc291cmNlLCBuZXdGaWxlKSkgewotCQkJcmV0dXJuIG5ld0ZpbGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gcHJlcGFyZUFkanVzdExvY2F0aW9uKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSwKLQkJCVNldCBtb2RpZmllZFJlc291cmNlcykgewotCQlVUkkgbmV3RmlsZSA9IGdldE5ld1VSSShyZXNvdXJjZSk7Ci0JCWlmIChuZXdGaWxlICE9IG51bGwpIHsKLQkJCXJlc291cmNlLmJhY2tVcFVSSSgpOwotCQkJcmVzb3VyY2Uuc2V0RmluYWxVUkkobmV3RmlsZSk7Ci0JCQl1cGRhdGVVUklNYXBwaW5ncygoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZSwKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMsIGZhbHNlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHdWlkKE9iamVjdCBlKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0R3VpZCgpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBSZXNvdXJjZU1hbmFnZXIpIHsKLQkJCXJldHVybiAoKFJlc291cmNlTWFuYWdlcikgZSkuZ2V0R3VpZCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXN0YXRpYyBib29sZWFuIGFkanVzdExvY2F0aW9uUmVxdWlyZWQoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlLAotCQkJVVJJIG5ld1VSSSkgewotCQlGaWxlIG9sZEZpbGUgPSBuZXcgRmlsZShyZXNvdXJjZS5nZXRGaW5hbFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUobmV3VVJJLnRvRmlsZVN0cmluZygpKTsKLQkJcmV0dXJuICFvbGRGaWxlLmVxdWFscyhuZXdGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHJlc291cmNlJ3MgVVJJIGhhcyBiZWVuIGNoYW5nZWQgYW5kIGFkanVzdCB0aGUgcmVzb3VyY2UncwotCSAqIGxvY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBvbGRVcmkKLQkgKiBAcGFyYW0gbmV3VXJpCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gYWRqdXN0TG9jYXRpb24oUmVzb3VyY2UgcmVzb3VyY2UsIFVSSSBuZXdVcmkpIHsKLQkJRmlsZSBvbGRGaWxlID0gbmV3IEZpbGUocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQlGaWxlIG5ld0ZpbGUgPSBuZXcgRmlsZShuZXdVcmkudG9GaWxlU3RyaW5nKCkpOwotCQlpZiAob2xkRmlsZS5lcXVhbHMobmV3RmlsZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gbW92ZShyZXNvdXJjZSwgb2xkRmlsZSwgbmV3RmlsZSk7Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gbW92ZShSZXNvdXJjZSByZXNvdXJjZSwgRmlsZSBvbGRGaWxlLCBGaWxlIG5ld0ZpbGUpIHsKLQkJYm9vbGVhbiByZXQgPSB0cnVlOwotCQlpZiAob2xkRmlsZS5lcXVhbHMobmV3RmlsZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlPYmplY3Qgb2JqID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQlpZiAoaGFzT3duRm9sZGVyKG9iaikpIHsKLQkJCVN0cmluZyBvbGREaXIgPSBvbGRGaWxlLmdldFBhcmVudEZpbGUoKS50b1N0cmluZygpOwotCQkJaWYgKCFvbGRGaWxlLmdldFBhcmVudEZpbGUoKS5lcXVhbHMobmV3RmlsZS5nZXRQYXJlbnRGaWxlKCkpKSB7Ci0JCQkJaWYgKEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVuYW1lKG9sZEZpbGUuZ2V0UGFyZW50RmlsZSgpLAotCQkJCQkJbmV3RmlsZS5nZXRQYXJlbnRGaWxlKCkpKSB7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiRGlyZWN0b3J5ICciICsgb2xkRGlyICsgIicgaXMgc3VjY2Vzc2Z1bGx5IG1vdmVkIHRvICciICsgbmV3RmlsZS5nZXRQYXJlbnRGaWxlKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0ID0gZmFsc2U7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiQ291bGQgbm90IG1vdmUgZGlyZWN0b3J5ICciICsgb2xkRGlyICsgIicgdG8gJyIgKyBuZXdGaWxlLmdldFBhcmVudEZpbGUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIW9sZEZpbGUuZ2V0TmFtZSgpLmVxdWFscyhuZXdGaWxlLmdldE5hbWUoKSkpIHsKLQkJCQlvbGRGaWxlID0gbmV3IEZpbGUobmV3RmlsZS5nZXRQYXJlbnRGaWxlKCksIG9sZEZpbGUuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW5hbWUob2xkRmlsZSwgbmV3RmlsZSkpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJGaWxlICciICsgb2xkRmlsZSArICInIGlzIHN1Y2Nlc3NmdWxseSBtb3ZlZCB0byAnIiArIG5ld0ZpbGUgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0ID0gZmFsc2U7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiQ291bGQgbm90IG1vdmUgZmlsZSAnIiArIG9sZEZpbGUgKyAiJyB0byAnIiArIG5ld0ZpbGUgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJldDsKLQkJfSBlbHNlIGlmIChvbGRGaWxlLmV4aXN0cygpKSAvKiBpZihvbGRGaWxlLmdldFBhcmVudEZpbGUoKS5lcXVhbHMobmV3RmlsZS5nZXRQYXJlbnRGaWxlKCkpKSAqL3sKLQkJCVN0cmluZyBvbGRGaWxlU3RyID0gb2xkRmlsZS50b1N0cmluZygpOwotCQkJaWYgKEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVuYW1lKG9sZEZpbGUsIG5ld0ZpbGUpKSB7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiRmlsZSAnIiArIG9sZEZpbGVTdHIgKyAiJyBpcyBzdWNjZXNzZnVsbHkgbW92ZWQgdG8gJyIgKyBuZXdGaWxlICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChERUJVRykgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIkNvdWxkIG5vdCBtb3ZlIGZpbGUgJyIgKyBvbGRGaWxlU3RyICsgIicgdG8gJyIgKyBuZXdGaWxlICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZXNNZ3IKLQkgKiBAcGFyYW0gZ3VpZAotCSAqIEBwYXJhbSBleGNsdWRlZFJlc01hbmFnZXJzCi0JICogICAgICAgICAgICBSZXNvdXJjZU1hbmFnZXIgdGhhdCBhcmUgZXhjbHVkZWQgZnJvbSB0aGlzIHNlYXJjaAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlRGVzY3JpcHRvciBmaW5kUmVzb3VyY2VEZXNjcmlwdG9yKAotCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciwgU3RyaW5nIGd1aWQsCi0JCQlDb2xsZWN0aW9uIGV4Y2x1ZGVkUmVzTWFuYWdlcnMsIGJvb2xlYW4gcmVzb2x2ZVByb3h5KSB7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IHJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3IoZ3VpZCk7Ci0JCQlpZiAoZGVzYyAhPSBudWxsKQotCQkJCXJldHVybiBkZXNjOwotCQkJLy8gVE9ETzogKFBob25nKSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBuZWVkZWQgdG8gYXZvaWQgbG9hZGluZwotCQkJLy8gcmVzb3VyY2VzIGV4Y2Vzc2l2ZWx5Ci0JCQkvLwotCQkJSXRlcmF0b3IgaXRlcjsKLQkJCWlmIChyZXNvbHZlUHJveHkpIHsKLQkJCQlpdGVyID0gbmV3IEFycmF5TGlzdChyZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKSkuaXRlcmF0b3IoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaXRlciA9ICgoSW50ZXJuYWxFTGlzdCkgcmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkpCi0JCQkJCQkuYmFzaWNJdGVyYXRvcigpOwotCQkJfQotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyIG1nciA9IChSZXNvdXJjZU1hbmFnZXIpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChtZ3IgIT0gbnVsbAotCQkJCQkJJiYgIW1nci5lSXNQcm94eSgpCi0JCQkJCQkmJiAoZXhjbHVkZWRSZXNNYW5hZ2VycyA9PSBudWxsIHx8ICFleGNsdWRlZFJlc01hbmFnZXJzCi0JCQkJCQkJCS5jb250YWlucyhtZ3IpKSkgewotCQkJCQlkZXNjID0gZmluZFJlc291cmNlRGVzY3JpcHRvcihtZ3IsIGd1aWQsCi0JCQkJCQkJZXhjbHVkZWRSZXNNYW5hZ2VycywgcmVzb2x2ZVByb3h5KTsKLQkJCQkJaWYgKGRlc2MgIT0gbnVsbCkKLQkJCQkJCXJldHVybiBkZXNjOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcmVzTWdyCi0JICogQHJldHVybiBob3cgbWFueSBSZXNvdXJjZURlc2NyaXB0b3JzIGFyZSBpbiB0aGUgcmVzTWdyIGFuZCBpdHMKLQkgKiAgICAgICAgIFN1Yk1hbmFnZXJzCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Q291bnRSZXNvdXJjZURlc2NyaXB0b3JzKFJlc291cmNlTWFuYWdlciByZXNNZ3IpIHsKLQkJaW50IGNvdW50ID0gcmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5zaXplKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc01nci5nZXRTdWJNYW5hZ2VycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2VNYW5hZ2VyIG1nciA9IChSZXNvdXJjZU1hbmFnZXIpIGl0ZXIubmV4dCgpOwotCQkJY291bnQgKz0gZ2V0Q291bnRSZXNvdXJjZURlc2NyaXB0b3JzKG1ncik7Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJlc291cmNlIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiByZXNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlRGVzY3JpcHRvciBnZXRSZXNvdXJjZURlc2NyaXB0b3IoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJUmVzb3VyY2VNYW5hZ2VyIGNvbnRhaW5lclJlc01nciA9IG51bGw7Ci0JCU1ldGhvZEVsZW1lbnQgbWUgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIocmVzb3VyY2UpOwotCQkJCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IHJlc01ncgotCQkJCQkJCS5nZXRSZXNvdXJjZURlc2NyaXB0b3IoKChNZXRob2RFbGVtZW50KSBlbGVtZW50KQotCQkJCQkJCQkJLmdldEd1aWQoKSk7Ci0JCQkJCS8vIGhhY2sgdG8gYWRkIG1pc3NpbmcgUmVzb3VyY2VEZXNjcmlwdG9yIGZvciBsaWJyYXJ5J3MKLQkJCQkJLy8gcmVzb3VyY2UKLQkJCQkJLy8KLQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJZGVzYyA9IHJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcihyZXNNZ3IsIGVsZW1lbnQsCi0JCQkJCQkJCSgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZSkKLQkJCQkJCQkJCQkuZ2V0RmluYWxVUkkoKSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGRlc2M7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG1lID09IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQltZSA9IChNZXRob2RFbGVtZW50KSBlbGVtZW50OwotCQkJfQotCQkJaWYgKGNvbnRhaW5lclJlc01nciA9PSBudWxsICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpIHsKLQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lcldpdGhEaXJlY3RSZXNvdXJjZSgoSW50ZXJuYWxFT2JqZWN0KSBlbGVtZW50KTsKLQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQkJY29udGFpbmVyUmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyKGNvbnRhaW5lci5lUmVzb3VyY2UoKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG1lICE9IG51bGwgJiYgY29udGFpbmVyUmVzTWdyICE9IG51bGwpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmKG1lICE9IG51bGwpIHsKLQkJCWlmIChjb250YWluZXJSZXNNZ3IgIT0gbnVsbCkgewotCQkJCXJldHVybiBjb250YWluZXJSZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKCgoTWV0aG9kRWxlbWVudCkgbWUpCi0JCQkJCQkuZ2V0R3VpZCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYobWUuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkvLyB0aGlzIGVsZW1lbnQgaGFzIGJlZW4gbG9hZGVkIGJlZm9yZSBpdHMgY29udGFpbmVyCi0JCQkJLy8gdHJ5IHRvIGZpbmQgaXRzIHJlc291cmNlIGRlc2NyaXB0b3IgdXNpbmcgcm9vdCByZXNvdXJjZSBtYW5hZ2VyCi0JCQkJLy8KLQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJaWYocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHsKLQkJCQkJUmVzb3VyY2VNYW5hZ2VyIHJvb3RSZXNNZ3IgPSAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbClyZXNvdXJjZVNldCkuZ2V0Um9vdFJlc291cmNlTWFuYWdlcigpOwotCQkJCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKHJvb3RSZXNNZ3IpIHsKLQotCQkJCQkJLyoqCi0JCQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCQkJICovCi0JCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBSZXNvdXJjZU1hbmFnZXIpIHsKLQkJCQkJCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gKFJlc291cmNlTWFuYWdlcilvYmplY3Q7IAotCQkJCQkJCQljaGlsZHJlbi5hZGRBbGwocmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcnMoKSk7Ci0JCQkJCQkJCWNoaWxkcmVuLmFkZEFsbChyZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKSk7Ci0JCQkJCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX07Ci0JCQkJCVVSSSB1cmkgPSBnZXRGaW5hbFVSSShyZXNvdXJjZSk7Ci0JCQkJCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYobyBpbnN0YW5jZW9mIFJlc291cmNlRGVzY3JpcHRvcikgewotCQkJCQkJCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gKFJlc291cmNlRGVzY3JpcHRvcikgbzsKLQkJCQkJCQlpZih1cmkuZXF1YWxzKHJlc0Rlc2MuZ2V0UmVzb2x2ZWRVUkkoKSkpIHsKLQkJCQkJCQkJcmV0dXJuIHJlc0Rlc2M7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VEZXNjcmlwdG9yIGZpbmRSZXNvdXJjZURlc2NyaXB0b3IoTWV0aG9kRWxlbWVudCBlKQotCS8vIHsKLQkvLyBSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gbnVsbDsKLQkvLyBpZihlLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkvLyByZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIoZS5lUmVzb3VyY2UoKSk7Ci0JLy8gfQotCS8vIFJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gbnVsbDsKLQkvLyBDb2xsZWN0aW9uIGV4Y2x1ZGVkUmVzTWdycyA9IG51bGw7Ci0JLy8gaWYocmVzTWdyICE9IG51bGwpIHsKLQkvLyBkZXNjID0gZmluZFJlc291cmNlRGVzY3JpcHRvcihyZXNNZ3IsIGUuZ2V0R3VpZCgpKTsKLQkvLyBpZihkZXNjICE9IG51bGwpIHJldHVybiBkZXNjOwotCS8vIGV4Y2x1ZGVkUmVzTWdycyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocmVzTWdyKTsKLQkvLyB9Ci0JLy8JCQotCS8vIE1ldGhvZExpYnJhcnkgbGliID0gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KGUpOwotCS8vIHJlc01nciA9IGdldFJlc291cmNlTWFuYWdlcihsaWIuZVJlc291cmNlKCkpOwotCS8vCQkKLQkvLyByZXR1cm4gZmluZFJlc291cmNlRGVzY3JpcHRvcihyZXNNZ3IsIGUuZ2V0R3VpZCgpLCBleGNsdWRlZFJlc01ncnMpOwotCS8vIH0KLQotCS8qKgotCSAqIEdldHMgdGhlIFJlc291cmNlTWFuYWdlciBpbiB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIHJlc291cmNlCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VNYW5hZ2VyIGdldFJlc291cmNlTWFuYWdlcihSZXNvdXJjZSByZXNvdXJjZSkgewotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJlc291cmNlTWFuYWdlcikgewotCQkJCXJlc01nciA9IChSZXNvdXJjZU1hbmFnZXIpIGVsZW1lbnQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzTWdyOwotCX0KLQotCXN0YXRpYyBJbnRlcm5hbEVPYmplY3QgZ2V0Q29udGFpbmVyV2l0aERpcmVjdFJlc291cmNlKEludGVybmFsRU9iamVjdCBvYmopIHsKLQkJaWYgKG9iai5lQ29udGFpbmVyKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJbnRlcm5hbEVPYmplY3QgY29udGFpbmVyID0gKEludGVybmFsRU9iamVjdCkgKChJbnRlcm5hbEVPYmplY3QpIG9iagotCQkJCS5lQ29udGFpbmVyKCkpOwotCQlpZiAoY29udGFpbmVyLmVEaXJlY3RSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250YWluZXI7Ci0JCX0KLQkJcmV0dXJuIGdldENvbnRhaW5lcldpdGhEaXJlY3RSZXNvdXJjZShjb250YWluZXIpOwotCX0KLQotCXN0YXRpYyBTdHJpbmcgZ2V0SFJFRihSZXNvdXJjZSByZXNvdXJjZSwgT2JqZWN0IG9iaikgewotCQlNZXRob2RFbGVtZW50IG93bmVyID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQlyZXR1cm4gTXVsdGlGaWxlVVJJQ29udmVydGVyLmNyZWF0ZVVSSShvd25lci5nZXRHdWlkKCkpLmFwcGVuZEZyYWdtZW50KAotCQkJCWdldEd1aWQob2JqKSkudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCYWNrdXBGaWxlU3VmZml4KCkgewotCQlyZXR1cm4gIl8iICsgZGF0ZUZvcm1hdHRlci5mb3JtYXQoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmVzb2x2ZSB0aGUgcHJveHkgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gPGNvZGU+Z3VpZDwvY29kZT4gd2l0aG91dAotCSAqIGxvYWRpbmcgYWxsIG90aGVyIHByb3hpZXMgaW4gPGNvZGU+cGFyZW50PC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBndWlkCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVzb2x2ZVByb3hpZXMoQ29sbGVjdGlvbiBHVUlEcywgRU9iamVjdCBwYXJlbnQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBhcmVudC5lQ2xhc3MoKS5nZXRFQWxsQ29udGFpbm1lbnRzKCkKLQkJCQkuaXRlcmF0b3IoKTsgIUdVSURzLmlzRW1wdHkoKSAmJiBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJSW50ZXJuYWxFTGlzdCBsaXN0ID0gKEludGVybmFsRUxpc3QpIHBhcmVudC5lR2V0KGZlYXR1cmUpOwotCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IGxpc3QuYmFzaWNJdGVyYXRvcigpOyAhR1VJRHMuaXNFbXB0eSgpCi0JCQkJCQkmJiBpdGVyMS5oYXNOZXh0KCk7IGluZGV4KyspIHsKLQkJCQkJSW50ZXJuYWxFT2JqZWN0IGNoaWxkID0gKEludGVybmFsRU9iamVjdCkgaXRlcjEubmV4dCgpOwotCQkJCQlpZiAoY2hpbGQuZUlzUHJveHkoKSkgewotCQkJCQkJU3RyaW5nIGd1aWQgPSBjaGlsZC5lUHJveHlVUkkoKS5mcmFnbWVudCgpOwotCQkJCQkJaWYgKEdVSURzLmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJCQkJLy8gdGhpcyB3aWxsIHJlc29sdmUgdGhlIG9iamVjdCB3aXRoIGd1aWQKLQkJCQkJCQkvLwotCQkJCQkJCWxpc3QuZ2V0KGluZGV4KTsKLQkJCQkJCQlHVUlEcy5yZW1vdmUoZ3VpZCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXNvbHZlUHJveGllcyhHVUlEcywgY2hpbGQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgY2hpbGQgPSAoSW50ZXJuYWxFT2JqZWN0KSBwYXJlbnQuZUdldChmZWF0dXJlLAotCQkJCQkJZmFsc2UpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCWlmIChjaGlsZC5lSXNQcm94eSgpKSB7Ci0JCQkJCQlTdHJpbmcgZ3VpZCA9IGNoaWxkLmVQcm94eVVSSSgpLmZyYWdtZW50KCk7Ci0JCQkJCQlpZiAoR1VJRHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQkJCQkvLyB0aGlzIHdpbGwgcmVzb2x2ZSB0aGUgb2JqZWN0IHdpdGggZ3VpZAotCQkJCQkJCS8vCi0JCQkJCQkJcGFyZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQkJCQkJR1VJRHMucmVtb3ZlKGd1aWQpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVzb2x2ZVByb3hpZXMoR1VJRHMsIGNoaWxkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJJIGdldEZpbmFsVVJJKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiByZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCA/ICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZSkKLQkJCQkuZ2V0RmluYWxVUkkoKQotCQkJCTogcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGltcGwKLQkgKiBAcmV0dXJuCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gYWRqdXN0TG9jYXRpb25SZXF1aXJlZChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UpIHsKLQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwkJCi0JCWlmKGUgIT0gbnVsbCAmJiBoYXNPd25Gb2xkZXIoZSkpIHsKLQkJCVVSSSBuZXdVUkkgPSBjcmVhdGVGaWxlVVJJKGUpOwotCQkJaWYoYWRqdXN0TG9jYXRpb25SZXF1aXJlZChyZXNvdXJjZSwgbmV3VVJJKSAmJiAhbmV3IEZpbGUobmV3VVJJLnRvRmlsZVN0cmluZygpKS5leGlzdHMoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBpcyBjdXJyZW50bHkgc3luY2hyb25pemVkIHdpdGggaXRzIGRhdGEgc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIDxsaT4gLTEgZG9uJ3Qga25vdwotCSAqICAgICAgICAgPGxpPiAwIG5vCi0JICogICAgICAgICA8bGk+IDEgeWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY2hlY2tTeW5jaHJvbml6ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCXJldHVybiAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXNvdXJjZSkuY2hlY2tTeW5jaHJvbml6ZWQoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogU29tZSB0ZWFtIHByb3ZpZGVycyBjaGFuZ2VkIHRoZSB0aW1lc3RhbXAgb2YgbGFzdCBmaWxlIG1vZGlmaWNhdGlvbiBieSByZW1vdmluZyBzZWNvbmQgZnJhY3Rpb24KLQkgKiBldmVuIHRoZSBmaWxlIHdhcyBub3QgY2hhbmdlZC4gVGhpcyBtZXRob2QgY2hlY2sgdGhlIGN1cnJlbnQgYW5kIG9sZCB0aW1lIHN0YW1wcyBmb3IgdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gY3VycmVudFRpbWVTdGFtcAotCSAqIEBwYXJhbSBsYXN0VGltZVN0YW1wCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYW1lKGxvbmcgY3VycmVudFRpbWVTdGFtcCwgbG9uZyBsYXN0VGltZVN0YW1wKSB7Ci0JCXJldHVybiBjdXJyZW50VGltZVN0YW1wIDwgbGFzdFRpbWVTdGFtcCAmJiAoY3VycmVudFRpbWVTdGFtcCAmIDcpID09IDAgJiYgKGxhc3RUaW1lU3RhbXAgLSBjdXJyZW50VGltZVN0YW1wKSA8IDEwMDA7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhbiBlbXB0eSByZXNvdXJjZSBtYW5hZ2VyIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UgaWYgaXQgZG9lcyBub3QgaGF2ZSBvbmUuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiB0cnVlIGlmIGEgbmV3IHJlc291cmNlIG1hbmFnZXIgaXMgYWRkZWQsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXN0YXRpYyBSZXNvdXJjZU1hbmFnZXIgYWRkUmVzb3VyY2VNYW5hZ2VyKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIocmVzb3VyY2UpOwotCQlpZiAocmVzTWdyID09IG51bGwpIHsKLQkJCXJlc01nciA9IFJlc291cmNlbWFuYWdlckZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlc291cmNlTWFuYWdlcigpOwotCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoMCwgcmVzTWdyKTsKLQkJCXJldHVybiByZXNNZ3I7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVVUklDb252ZXJ0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVVUklDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWVmNDI5Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlVVJJQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIFVSSSBjb252ZXJ0ZXIgdGhhdCBjb252ZXJ0cyBhIGZpbGUtYmFzZWQgVVJJIHRvIGEgVU1BLWJhc2VkIFVSSSBhbmQgdmljZQotICogdmVyc2EgdXNpbmcgdGhlIG1hcHBpbmcgaW5mb3JtYXRpb24gc3RvcmVkIGluIFJlc291cmNlRGVzY3JpcHRvcnMgb2YKLSAqIFJlc291cmNlTWFuYWdlci4gQSBVTUEtYmFzZWQgVVJJIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKLSAqIHVtYTovL0dVSUQxI0dVSUQyIHdoZXJlIEdVSUQxIGlzIHRoZSBHVUlEIG9mIHRoZSBmaWxlIGFuZCBHVUlEMiBpcyB0aGUKLSAqIG9iamVjdCdzIEdVSUQuIAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlGaWxlVVJJQ29udmVydGVyIGV4dGVuZHMgVVJJQ29udmVydGVySW1wbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUUgPSAidW1hIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldCBsb2NrZWRHVUlEcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2VNYW5hZ2VyIHJlc01ncjsKLQotCXByaXZhdGUgVVJJIGxpYnJhcnlVUkk7Ci0KLQlwcml2YXRlIFVSSSBsaWJyYXJ5VW1hVVJJOwotCi0JcHJpdmF0ZSBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVzb2x2ZVByb3h5OwotCi0JcHVibGljIE11bHRpRmlsZVVSSUNvbnZlcnRlcihNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQpIHsKLQkJdGhpcy5yZXNvdXJjZVNldCA9IHJlc291cmNlU2V0OwotCX0KLQotCXZvaWQgc2V0UmVzb2x2ZVByb3h5KGJvb2xlYW4gcmVzb2x2ZVByb3h5KSB7Ci0JCXRoaXMucmVzb2x2ZVByb3h5ID0gcmVzb2x2ZVByb3h5OwotCX0KLQotCXZvaWQgc2V0TGlicmFyeVVSSXMoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCWxpYnJhcnlVUkkgPSBsaWJyYXJ5LmVSZXNvdXJjZSgpLmdldFVSSSgpOwotCQlsaWJyYXJ5VW1hVVJJID0gVVJJLmNyZWF0ZVVSSShuZXcgU3RyaW5nQnVmZmVyKFNDSEVNRSkKLQkJCQkuYXBwZW5kKCI6Ly8iKS5hcHBlbmQobGlicmFyeS5nZXRHdWlkKCkpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2NrR1VJRChTdHJpbmcgZ3VpZCkgewotCQlzeW5jaHJvbml6ZWQgKGxvY2tlZEdVSURzKSB7Ci0JCQlsb2NrZWRHVUlEcy5hZGQoZ3VpZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTG9ja2VkR1VJRChTdHJpbmcgZ3VpZCkgewotCQlzeW5jaHJvbml6ZWQgKGxvY2tlZEdVSURzKSB7Ci0JCQlyZXR1cm4gbG9ja2VkR1VJRHMuY29udGFpbnMoZ3VpZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHVubG9ja0dVSUQoU3RyaW5nIGd1aWQpIHsKLQkJc3luY2hyb25pemVkIChsb2NrZWRHVUlEcykgewotCQkJcmV0dXJuIGxvY2tlZEdVSURzLnJlbW92ZShndWlkKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbCNub3JtYWxpemUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkgKi8KLQlwdWJsaWMgVVJJIG5vcm1hbGl6ZShVUkkgdXJpKSB7Ci0JCXJldHVybiBub3JtYWxpemUodXJpLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgVVJJIG5vcm1hbGl6ZShVUkkgdXJpLCBFT2JqZWN0IHJlc29sdmVyKSB7Ci0JCWlmIChTQ0hFTUUuZXF1YWxzSWdub3JlQ2FzZSh1cmkuc2NoZW1lKCkpKSB7Ci0JCQlTdHJpbmcgZ3VpZCA9IHVyaS5hdXRob3JpdHkoKTsKLQkJCWlmIChpc0xvY2tlZEdVSUQoZ3VpZCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJbG9ja0dVSUQoZ3VpZCk7Ci0KLQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IG51bGw7Ci0JCQkJSGFzaFNldCBleGNsdWRlZFJlc01hbmFnZXJzID0gbnVsbDsKLQkJCQlpZiAocmVzb2x2ZXIgIT0gbnVsbCAmJiByZXNvbHZlci5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBNdWx0aUZpbGVTYXZlVXRpbAotCQkJCQkJCS5nZXRSZXNvdXJjZU1hbmFnZXIocmVzb2x2ZXIuZVJlc291cmNlKCkpOwotCQkJCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCQkJCWRlc2MgPSBNdWx0aUZpbGVTYXZlVXRpbC5maW5kUmVzb3VyY2VEZXNjcmlwdG9yKHJlc01nciwKLQkJCQkJCQkJZ3VpZCwgbnVsbCwgcmVzb2x2ZVByb3h5KTsKLQkJCQkJCWlmIChkZXNjID09IG51bGwpIHsKLQkJCQkJCQkvLyBhZGQgdGhpcyBSZXNvdXJjZU1hbmFnZXIgYW5kIGl0cyBzdWJtYW5hZ2VycyB0bwotCQkJCQkJCS8vIGV4Y2x1ZGVkUmVzTWFuYWdlcnMKLQkJCQkJCQkvLyBzbyB0aGUgbmV4dCBzZWFyY2ggZm9yIFJlc291cmNlRGVzY3JpcHRvciB3aWxsCi0JCQkJCQkJLy8gaWdub3JlIHRoZW0KLQkJCQkJCQkvLwotCQkJCQkJCWV4Y2x1ZGVkUmVzTWFuYWdlcnMgPSBuZXcgSGFzaFNldCgpOwotCQkJCQkJCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IocmVzTWdyKSB7Ci0KLQkJCQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCQkJCXJldHVybiAoKFJlc291cmNlTWFuYWdlcikgb2JqZWN0KQotCQkJCQkJCQkJCQkuZ2V0U3ViTWFuYWdlcnMoKS5pdGVyYXRvcigpOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQl9OwotCQkJCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJCQlleGNsdWRlZFJlc01hbmFnZXJzLmFkZChpdGVyLm5leHQoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChkZXNjID09IG51bGwgJiYgZ2V0UmVzb3VyY2VNYW5hZ2VyKCkgIT0gbnVsbCkgewotCQkJCQlkZXNjID0gTXVsdGlGaWxlU2F2ZVV0aWwuZmluZFJlc291cmNlRGVzY3JpcHRvcigKLQkJCQkJCQlnZXRSZXNvdXJjZU1hbmFnZXIoKSwgZ3VpZCwgZXhjbHVkZWRSZXNNYW5hZ2VycywKLQkJCQkJCQlyZXNvbHZlUHJveHkpOwotCQkJCX0KLQkJCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCVVSSSBub3JtYWxpemVkID0gZGVzYy5nZXRSZXNvbHZlZFVSSSgpOwotCi0JCQkJCS8vIGNoZWNrIGlmIHRoZSByZXNvdXJjZSB3aXRoIHRoaXMgbm9ybWFsaXplZCBVUkkgaGFzCi0JCQkJCS8vIHRlbXBvcmFyeSBVUkkKLQkJCQkJLy8KLQkJCQkJVVJJIHRlbXBVUkkgPSAoVVJJKSByZXNvdXJjZVNldC5nZXRVUklUb1RlbXBVUklNYXAoKS5nZXQoCi0JCQkJCQkJbm9ybWFsaXplZCk7Ci0JCQkJCWlmICh0ZW1wVVJJICE9IG51bGwpIHsKLQkJCQkJCW5vcm1hbGl6ZWQgPSB0ZW1wVVJJOwotCQkJCQl9Ci0KLQkJCQkJaWYgKHVyaS5oYXNGcmFnbWVudCgpKSB7Ci0JCQkJCQlub3JtYWxpemVkID0gbm9ybWFsaXplZC5hcHBlbmRGcmFnbWVudCh1cmkuZnJhZ21lbnQoKSk7Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm4gbm9ybWFsaXplZDsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXVubG9ja0dVSUQoZ3VpZCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIubm9ybWFsaXplKHVyaSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsI2NyZWF0ZUlucHV0U3RyZWFtKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGNyZWF0ZUlucHV0U3RyZWFtKFVSSSB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICh1cmkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gc3VwZXIuY3JlYXRlSW5wdXRTdHJlYW0odXJpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVVUkkoU3RyaW5nIGd1aWQpIHsKLQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkobmV3IFN0cmluZ0J1ZmZlcihTQ0hFTUUpCi0JCQkJLmFwcGVuZCgiOi8vIikuYXBwZW5kKGd1aWQpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlVVJJKE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSShjcmVhdGVVcmlTdHJpbmcoZSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVVyaVN0cmluZyhPYmplY3QgZSkgewotCQlJbnRlcm5hbEVPYmplY3QgbyA9IChJbnRlcm5hbEVPYmplY3QpIGU7Ci0KLQkJVVJJIG9iamVjdFVSSSA9IG8uZVByb3h5VVJJKCk7Ci0JCWlmIChvYmplY3RVUkkgIT0gbnVsbCAmJiBTQ0hFTUUuZXF1YWxzKG9iamVjdFVSSS5zY2hlbWUoKSkpIHsKLQkJCXJldHVybiBvYmplY3RVUkkudG9TdHJpbmcoKTsKLQkJfQotCi0JCVN0cmluZyBndWlkID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0R3VpZChlKTsKLQkJaWYgKGd1aWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoU0NIRU1FKS5hcHBlbmQoIjovLyIpLmFwcGVuZChndWlkKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gcHVibGljIFVSSSB0b1VtYVVyaShVUkkgdXJpKSB7Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aUZpbGVVUklDb252ZXJ0ZXIudG9VbWFVcmkoKTogdXJpPSIrdXJpKTsKLQkvLyBpZih1cmkuc2NoZW1lKCkuZXF1YWxzKCJ1bWEiKSB8fCB1cmlEZXNjTWFwID09IG51bGwpIHJldHVybiB1cmk7Ci0JLy8gaWYobGlicmFyeVVSSS5lcXVhbHModXJpKSkgcmV0dXJuIGxpYnJhcnlVbWFVUkk7Ci0JLy8gUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKQotCS8vIHVyaURlc2NNYXAuZ2V0KHVyaS50cmltRnJhZ21lbnQoKS50b1N0cmluZygpKTsKLQkvLyByZXR1cm4gZGVzYyA9PSBudWxsID8gdXJpIDogVVJJLmNyZWF0ZVVSSSgidW1hOi8vIiArCi0JLy8gZGVzYy5nZXRJZCgpKS5hcHBlbmRGcmFnbWVudCh1cmkuZnJhZ21lbnQoKSk7Ci0JLy8gfQotCi0JLy8gcHVibGljIHZvaWQgc2V0UmVzb3VyY2VNYW5hZ2VyKFJlc291cmNlTWFuYWdlciByZXNNZ3IpIHsKLQkvLyB0aGlzLnJlc01nciA9IHJlc01ncjsKLQkvLyB9Ci0KLQlwdWJsaWMgUmVzb3VyY2VNYW5hZ2VyIGdldFJlc291cmNlTWFuYWdlcigpIHsKLQkJaWYgKHJlc01nciA9PSBudWxsKSB7Ci0JCQlyZXNNZ3IgPSByZXNvdXJjZVNldC5nZXRSb290UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc01ncjsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBSZXNvdXJjZURlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBHVUlEIGZyb20gcm9vdCBSZXNvdXJjZU1hbmFnZXIKLQkgKiAKLQkgKiBAcGFyYW0gZ3VpZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VEZXNjcmlwdG9yIGZpbmRSZXNvdXJjZURlc2NyaXB0b3IoU3RyaW5nIGd1aWQpIHsKLQkJcmV0dXJuIE11bHRpRmlsZVNhdmVVdGlsLmZpbmRSZXNvdXJjZURlc2NyaXB0b3IoZ2V0UmVzb3VyY2VNYW5hZ2VyKCksCi0JCQkJZ3VpZCwgbnVsbCwgcmVzb2x2ZVByb3h5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCXJlc01nci5kaXNwb3NlKCk7Ci0JCQlyZXNNZ3IgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gdXJpCi0JICogQHBhcmFtIG1vZGlmaWVkUmVzb3VyY2VzCi0JICogICAgICAgICAgICBvdXRwdXQgb2YgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgYWZ0ZXIgdGhpcyBjYWxsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVSSU1hcHBpbmcoRU9iamVjdCBlLCBVUkkgdXJpLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJc2V0VVJJTWFwcGluZyhlLCB1cmksIG1vZGlmaWVkUmVzb3VyY2VzLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVUklNYXBwaW5nKEVPYmplY3QgZSwgVVJJIHVyaSwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzLAotCQkJYm9vbGVhbiBhZnRlck1vdmUpIHsKLQkJU3RyaW5nIGd1aWQgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRHdWlkKGUpOwotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VNYW5hZ2VyRm9yKGUsCi0JCQkJbW9kaWZpZWRSZXNvdXJjZXMpOwotCQlSZXNvdXJjZURlc2NyaXB0b3IgcmVzRGVzYyA9IHJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3IoZ3VpZCk7Ci0JCWlmIChyZXNEZXNjICE9IG51bGwpIHsKLQkJCWlmIChhZnRlck1vdmUpIHsKLQkJCQlyZXNEZXNjLnNldFJlc29sdmVkVVJJKHVyaSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHByZXNlcnZlIHRoZSBjdXJyZW50IHJlc29sdmVkIFVSSQotCQkJCXJlc0Rlc2MuZ2V0UmVzb2x2ZWRVUkkoKTsKLQkJCQkvLyBzZXQgbmV3IFVSSSBzdHJpbmcgZm9yIHRoZSB1cGNvbWluZyBtb3ZlCi0JCQkJcmVzRGVzYy5zZXRVcmkodXJpLmRlcmVzb2x2ZSgKLQkJCQkJCU11bHRpRmlsZVNhdmVVdGlsLmdldEZpbmFsVVJJKHJlc0Rlc2MuZVJlc291cmNlKCkpKQotCQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpCi0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc0Rlc2MuZVJlc291cmNlKCkpOwotCQl9IGVsc2UgewotCQkJLy8gZmluZCB0aGUgUmVzb3VyY2VEZXNjcmlwdG9yIGluIG90aGVyIFJlc291cmNlTWFuYWdlcnMKLQkJCS8vCi0JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBlCi0JCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJUmVzb3VyY2VNYW5hZ2VyIGxpYlJlc01nciA9IHJlc291cmNlU2V0LmdldFJvb3RSZXNvdXJjZU1hbmFnZXIoKTsKLQkJCXJlc0Rlc2MgPSBNdWx0aUZpbGVTYXZlVXRpbC5maW5kUmVzb3VyY2VEZXNjcmlwdG9yKGxpYlJlc01nciwgZ3VpZCwKLQkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChyZXNNZ3IpLCByZXNvbHZlUHJveHkpOwotCQkJaWYgKHJlc0Rlc2MgIT0gbnVsbCkgewotCQkJCS8vIFJlc291cmNlRGVzY3JpcHRvciBhbHJlYWR5IGV4aXN0cwotCQkJCS8vIGNoYW5nZSBpdHMgdXJpLCBtb3ZlIGl0IGFuZCBpdHMgc3ViIG1hbmFnZXIsIGlmIHRoZXJlIGlzIGFueSwKLQkJCQkvLyB0byBuZXcgUmVzb3VyY2VNYW5hZ2VyCi0JCQkJLy8KLQotCQkJCS8vIGZpbmQgc3ViIG1hbmFnZXIKLQkJCQlSZXNvdXJjZU1hbmFnZXIgY3VycmVudFJlc01nciA9IChSZXNvdXJjZU1hbmFnZXIpIHJlc0Rlc2MKLQkJCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyIHN1Yk1nciA9IG51bGw7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY3VycmVudFJlc01nci5nZXRTdWJNYW5hZ2VycygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJlc291cmNlTWFuYWdlciBtZ3IgPSAoUmVzb3VyY2VNYW5hZ2VyKSBpdGVyLm5leHQoKTsKLQkJCQkJVVJJIG1nclVSSSA9ICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBtZ3IuZVJlc291cmNlKCkpCi0JCQkJCQkJLmdldEZpbmFsVVJJKCk7Ci0JCQkJCWlmIChtZ3JVUkkuZXF1YWxzKHVyaSkpIHsKLQkJCQkJCXN1Yk1nciA9IG1ncjsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gbW92ZSBSZXNvdXJjZURlc2NyaXB0b3IKLQkJCQlyZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLmFkZChyZXNEZXNjKTsKLQkJCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoY3VycmVudFJlc01nci5lUmVzb3VyY2UoKSk7Ci0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNNZ3IuZVJlc291cmNlKCkpOwotCQkJCX0KLQotCQkJCS8vIG1vdmUgc3ViIFJlc291cmNlTWFuYWdlcgotCQkJCWlmIChzdWJNZ3IgIT0gbnVsbCkgewotCQkJCQlyZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKS5hZGQoc3ViTWdyKTsKLQkJCQl9Ci0KLQkJCQkvLyBzZXQgbmV3IFVSSQotCQkJCWlmIChhZnRlck1vdmUpIHsKLQkJCQkJcmVzRGVzYy5zZXRSZXNvbHZlZFVSSSh1cmkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHByZXNlcnZlIHRoZSBjdXJyZW50IHJlc29sdmVkIFVSSQotCQkJCQlyZXNEZXNjLmdldFJlc29sdmVkVVJJKCk7Ci0JCQkJCS8vIHNldCBuZXcgVVJJIHN0cmluZyBmb3IgdGhlIHVwY29taW5nIG1vdmUKLQkJCQkJcmVzRGVzYy5zZXRVcmkodXJpLmRlcmVzb2x2ZShyZXNEZXNjLmVSZXNvdXJjZSgpLmdldFVSSSgpKQotCQkJCQkJCS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpCi0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNEZXNjLmVSZXNvdXJjZSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJTXVsdGlGaWxlU2F2ZVV0aWwucmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKHJlc01nciwgZSwgdXJpKTsKLQkJCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc01nci5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVVSSSB1cmkgPSBVUkkKLQkJCQkuY3JlYXRlVVJJKCJ1bWE6Ly9fTFB6ZEFHWjdFZG1BbV94U1gyRWRVQSMvL0BicmVha2Rvd25FbGVtZW50cy4wIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHVyaSk7Ci0JCVN5c3RlbS5vdXQKLQkJCQkucHJpbnRsbigiZGVyZXNvbHZlZCBVUkk6ICIgKyB1cmkuZGVyZXNvbHZlKFVSSS5jcmVhdGVVUkkoInVtYTovL19MUHpkQUdaN0VkbUFtX3hTWDJFZFVBIikpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSUhlbHBlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVYTUlIZWxwZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRlODVjYjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSUhlbHBlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSUhlbHBlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLQotLyoqCi0gKiBYTUxIZWxwZXIgaW1wbGVtZW50YXRpb24gZm9yIGxpYnJhcnkgWE1JIHBlcnNpc3RlbmNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUZpbGVYTUlIZWxwZXJJbXBsIGV4dGVuZHMgWE1JSGVscGVySW1wbCB7Ci0KLQkvKioKLQkgKiBQbGF0Zm9ybS1zcGVjaWZpYyBsaW5lIHNlcGFyYXRvci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9TRVAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBib29sZWFuIGxvZ0Vycm9yID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBMaXN0IHNhbWVEb2NSZWZlcmVuY2VzOwotCi0JcHJpdmF0ZSBib29sZWFuIGRpc2NhcmRVbnJlc29sdmVkUmVmOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTXVsdGlGaWxlWE1JSGVscGVySW1wbChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgeG1pUmVzKSB7Ci0JCXN1cGVyKHhtaVJlcyk7Ci0JCXNhbWVEb2NSZWZlcmVuY2VzID0gbmV3IFVuaXF1ZUVMaXN0KCk7Ci0JCUJvb2xlYW4gYiA9IChCb29sZWFuKSAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgeG1pUmVzCi0JCQkJLmdldFJlc291cmNlU2V0KCkpLmdldERlZmF1bHRTYXZlT3B0aW9ucygpLmdldCgKLQkJCQlNdWx0aUZpbGVYTUlTYXZlSW1wbC5ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUyk7Ci0JCWRpc2NhcmRVbnJlc29sdmVkUmVmID0gYiAhPSBudWxsID8gYi5ib29sZWFuVmFsdWUoKSA6IGZhbHNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MSGVscGVySW1wbCNzZXRSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlKFhNTFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXN1cGVyLnNldFJlc291cmNlKHJlc291cmNlKTsKLQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCXJlc291cmNlVVJJID0gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzb3VyY2UpLmdldEZpbmFsVVJJKCk7Ci0JCQlkZXJlc29sdmUgPSByZXNvdXJjZVVSSSAhPSBudWxsICYmICFyZXNvdXJjZVVSSS5pc1JlbGF0aXZlKCkgJiYgcmVzb3VyY2VVUkkuaXNIaWVyYXJjaGljYWwoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEhlbHBlckltcGwjZ2V0SFJFRihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhSRUYoRU9iamVjdCBvYmopIHsKLQkJaWYgKGRpc2NhcmRVbnJlc29sdmVkUmVmKSB7Ci0JCQkvLyByZW1vdmUgdW5yZXNvbHZlZCByZWZlcmVuY2VzCi0JCQkvLwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE11bHRpUmVzb3VyY2VFT2JqZWN0Ci0JCQkJCSYmICEoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBvYmopLmlzVmFsaWQoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE11bHRpUmVzb3VyY2VFT2JqZWN0KSB7Ci0JCQlJbnRlcm5hbEVPYmplY3QgbyA9IChJbnRlcm5hbEVPYmplY3QpIG9iajsKLQotCQkJVVJJIG9iamVjdFVSSSA9IG8uZVByb3h5VVJJKCk7Ci0JCQlpZiAob2JqZWN0VVJJID09IG51bGwpIHsKLQkJCQlSZXNvdXJjZSBvdGhlclJlc291cmNlID0gb2JqLmVSZXNvdXJjZSgpOwotCQkJCWlmIChvdGhlclJlc291cmNlID09IG51bGwpIHsKLQkJCQkJb2JqZWN0VVJJID0gaGFuZGxlRGFuZ2xpbmdIUkVGKG9iaik7Ci0JCQkJCWlmIChvYmplY3RVUkkgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHJlc291cmNlID09IG90aGVyUmVzb3VyY2UpIHsKLQkJCQkJcmV0dXJuICIjIiArIHJlc291cmNlLmdldFVSSUZyYWdtZW50KG9iaik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQkJLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgTWV0aG9kQ29uZmlndXJhdGlvbi4KLQkJCQkJCS8vIFNlZQotCQkJCQkJLy8gb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5sb2FkQ29uZmlndXJhdGlvbnMoKQotCQkJCQkJLy8KLQkJCQkJCUVPYmplY3QgbGliID0gb2JqLmVDb250YWluZXIoKTsKLQkJCQkJCWlmIChsaWIgIT0gbnVsbCkgewotCQkJCQkJCW90aGVyUmVzb3VyY2UgPSBsaWIuZVJlc291cmNlKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChvdGhlclJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gb3RoZXJSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCQkJaWYocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgCi0JCQkJCQkJCSYmICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRSZXNvdXJjZU1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQkJb2JqZWN0VVJJID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkob3RoZXJSZXNvdXJjZSkuYXBwZW5kRnJhZ21lbnQoZ2V0VVJJRnJhZ21lbnQob3RoZXJSZXNvdXJjZSwgb2JqKSk7Ci0JCQkJCQkJcmV0dXJuIGRlcmVzb2x2ZShvYmplY3RVUkkpLnRvU3RyaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgcmVzRGVzYyA9IE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCQkJCS5nZXRSZXNvdXJjZURlc2NyaXB0b3Iob3RoZXJSZXNvdXJjZSk7Ci0JCQkJCQlpZiAocmVzRGVzYyAhPSBudWxsKSB7Ci0JCQkJCQkJb2JqZWN0VVJJID0gTXVsdGlGaWxlVVJJQ29udmVydGVyLmNyZWF0ZVVSSSgKLQkJCQkJCQkJCXJlc0Rlc2MuZ2V0SWQoKSkuYXBwZW5kRnJhZ21lbnQoCi0JCQkJCQkJCQlnZXRVUklGcmFnbWVudChvdGhlclJlc291cmNlLCBvYmopKTsKLQkJCQkJCQlyZXR1cm4gb2JqZWN0VVJJLnRvU3RyaW5nKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIW9iamVjdFVSSS5zY2hlbWUoKS5lcXVhbHMoTXVsdGlGaWxlVVJJQ29udmVydGVyLlNDSEVNRSkpIHsKLQkJCQkJU3RyaW5nIGZyYWdtZW50ID0gb2JqZWN0VVJJLmZyYWdtZW50KCk7Ci0JCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbAotCQkJCQkJCSYmICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZSkKLQkJCQkJCQkJCS5nZXRFT2JqZWN0QnlJRChmcmFnbWVudCkgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuICIjIiArIGZyYWdtZW50OyAvLyROT04tTkxTLTEkCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlvYmplY3RVUkkgPSBkZXJlc29sdmUob2JqZWN0VVJJKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gb2JqZWN0VVJJLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0SFJFRihvYmopOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgUHJveHlSZWZlcmVuY2UgewotCQlwcml2YXRlIEludGVybmFsRU9iamVjdCBvd25lcjsKLQotCQlwcml2YXRlIEVSZWZlcmVuY2UgcmVmZXJlbmNlOwotCi0JCXByaXZhdGUgSW50ZXJuYWxFT2JqZWN0IHByb3h5OwotCi0JCS8qKgotCQkgKiBAcGFyYW0gb3duZXIKLQkJICogQHBhcmFtIHJlZmVyZW5jZQotCQkgKiBAcGFyYW0gcHJveHkKLQkJICovCi0JCXB1YmxpYyBQcm94eVJlZmVyZW5jZShJbnRlcm5hbEVPYmplY3Qgb3duZXIsIEVSZWZlcmVuY2UgcmVmZXJlbmNlLAotCQkJCUludGVybmFsRU9iamVjdCBwcm94eSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMub3duZXIgPSBvd25lcjsKLQkJCXRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlOwotCQkJdGhpcy5wcm94eSA9IHByb3h5OwotCQl9Ci0KLQkJcHVibGljIEludGVybmFsRU9iamVjdCBnZXRPd25lcigpIHsKLQkJCXJldHVybiBvd25lcjsKLQkJfQotCi0JCXB1YmxpYyBJbnRlcm5hbEVPYmplY3QgZ2V0UHJveHkoKSB7Ci0JCQlyZXR1cm4gcHJveHk7Ci0JCX0KLQotCQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoKSB7Ci0JCQlyZXR1cm4gcmVmZXJlbmNlOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBwb3NpdGlvbikgewotCQkvLyBUT0RPOiBtb3JlIGVmZmljaWVudCB3YXkgdG8gZG8gdGhpcyByZXBsYWNlbWVudAotCQkvLyBzaG91bGQgbG9vayBhdCBNdWx0aUZpbGVYTUlTYXZlSW1wbC5NeUVzY2FwZS5jb252ZXJ0VGV4dCgpCi0JCS8vCi0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJU3RyaW5nIHN0ciA9IChTdHJpbmcpIHZhbHVlOwotCQkJaWYgKHN0ci5pbmRleE9mKCJcbiIpID4gMCkgeyAvLyROT04tTkxTLTEkCi0JCQkJdmFsdWUgPSBzdHIucmVwbGFjZUFsbCgiXG4iLCBMSU5FX1NFUCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQk7Ci0KLQkJaW50IGtpbmQgPSBnZXRGZWF0dXJlS2luZChmZWF0dXJlKTsKLQotCQl0cnkgewotCQkJLy8gVE9ETzogdGVtcG9yYXJ5IGZpeCB0byBhdm9pZCBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sCi0JCQkvLyBuZWVkcyByZXZpc2l0Ci0JCQkvLwotCQkJaWYgKGtpbmQgPT0gSVNfTUFOWV9NT1ZFKSB7Ci0JCQkJTGlzdCBsaXN0ID0gKExpc3QpIG9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJCWlmIChwb3NpdGlvbiA+IC0xICYmIGxpc3QuaW5kZXhPZih2YWx1ZSkgPT0gLTEpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQotCQkJc3VwZXIuc2V0VmFsdWUob2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwgcG9zaXRpb24pOwotCi0JCQlzd2l0Y2ggKGtpbmQpIHsKLQkJCWNhc2UgSVNfTUFOWV9BREQ6Ci0JCQljYXNlIElTX01BTllfTU9WRToKLQkJCQlJbnRlcm5hbEVMaXN0IGxpc3QgPSAoSW50ZXJuYWxFTGlzdCkgb2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0KLQkJCQkvLyBzYXZlIHNhbWUgZG9jdW1lbnQgZm9yd2FyZCAodW5pZGlyZWN0aW9uYWwpIHJlZmVyZW5jZXMgdG8KLQkJCQkvLyByZXNvbHZlIGF0IHRoZSBlbmQgb2YgZG9jdW1lbnQgcGFyc2luZwotCQkJCS8vCQkJCQotCQkJCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgewotCQkJCQlFUmVmZXJlbmNlIHJlZiA9IChFUmVmZXJlbmNlKSBmZWF0dXJlOwotCQkJCQlpZiAocmVmLmdldEVPcHBvc2l0ZSgpICE9IG51bGwpIHsKLQkJCQkJCUludGVybmFsRU9iamVjdCBvd25lciA9IChJbnRlcm5hbEVPYmplY3QpIG9iamVjdDsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuYmFzaWNJdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJSW50ZXJuYWxFT2JqZWN0IGVsZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyCi0JCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCWlmIChlbGVtZW50LmVJc1Byb3h5KCkKLQkJCQkJCQkJCSYmIGVsZW1lbnQuZVByb3h5VVJJKCkudHJpbUZyYWdtZW50KCkKLQkJCQkJCQkJCQkJLmVxdWFscyhyZXNvdXJjZVVSSSkpIHsKLQkJCQkJCQkJc2FtZURvY1JlZmVyZW5jZXMuYWRkKG5ldyBQcm94eVJlZmVyZW5jZShvd25lciwKLQkJCQkJCQkJCQlyZWYsIGVsZW1lbnQpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlicmVhazsKLQkJCX0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAobG9nRXJyb3IpIHsKLQkJCQlpZihNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCVN0cmluZyBlcnJNc2cgPSBuZXcgU3RyaW5nQnVmZmVyKAotCQkJCQkJIk11bHRpRmlsZVhNSUhlbHBlckltcGwuc2V0VmFsdWUoKTogRVJST1IiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuYXBwZW5kKCJcbiAgb2JqZWN0OiAiKS5hcHBlbmQob2JqZWN0KSAvLyROT04tTkxTLTEkCi0JCQkJCQkuYXBwZW5kKCJcbiAgZmVhdHVyZTogIikuYXBwZW5kKGZlYXR1cmUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoIlxuICB2YWx1ZTogIikuYXBwZW5kKHZhbHVlKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuYXBwZW5kKCJcbiAgcG9zaXRpb246ICIpLmFwcGVuZChwb3NpdGlvbikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLmFwcGVuZCgiXG4gIGtpbmQ6ICIpLmFwcGVuZChraW5kKSAvLyROT04tTkxTLTEkCi0JCQkJCQkudG9TdHJpbmcoKTsKLQkJCQlpZihNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oZXJyTXNnKTsKLQkJCQl9Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlcnJNc2cpOwotCQkJfQotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIZWxwZXJJbXBsI2dldFZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoRU9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IHN1cGVyLmdldFZhbHVlKG9iaiwgZik7Ci0JCQotCQkvLyByZW1vdmUgYW55IHZhbHVlIHRoYXQgZG9lcyBub3QgYmVsb25nIHRvIGFueSByZXNvdXJjZQotCQkvLwotCQlpZihmIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgewotCQkJaWYoZi5pc01hbnkoKSkgewotCQkJCWlmKGYuaXNDaGFuZ2VhYmxlKCkgJiYgdmFsdWUgaW5zdGFuY2VvZiBJbnRlcm5hbEVMaXN0KSB7Ci0JCQkJCUludGVybmFsRUxpc3QgbGlzdCA9IChJbnRlcm5hbEVMaXN0KSB2YWx1ZTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmKCFvLmVJc1Byb3h5KCkgJiYgby5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSB2YWx1ZTsKLQkJCQlpZighby5lSXNQcm94eSgpICYmIG8uZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVYTUlMb2FkSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSUxvYWRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkODFiNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSUxvYWRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuU0FYWE1JSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JTG9hZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5FUEZWZXJzaW9uczsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIFhNTExvYWQgaW1wbGVtZW50YXRpb24gZm9yIGxpYnJhcnkgWE1JIHBlcnNpc3RlbmNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUZpbGVYTUlMb2FkSW1wbCBleHRlbmRzIFhNSUxvYWRJbXBsIHsKLQotCXB1YmxpYyBNdWx0aUZpbGVYTUlMb2FkSW1wbChYTUxIZWxwZXIgaGVscGVyKSB7Ci0JCXN1cGVyKGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIERlZmF1bHRIYW5kbGVyIG1ha2VEZWZhdWx0SGFuZGxlcigpIHsKLQkJcmV0dXJuIG5ldyBTQVhYTUlIYW5kbGVyKHJlc291cmNlLCBoZWxwZXIsIG9wdGlvbnMpIHsKLQkJCSAgCi0JCQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoRU9iamVjdCBvYmplY3QsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzRWxlbWVudCkgewotCQkJCWlmIChFUEZWZXJzaW9ucy5UT09MX0lELmVxdWFscyhwcmVmaXgpKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0RmVhdHVyZShvYmplY3QsIHByZWZpeCwgbmFtZSwgaXNFbGVtZW50KTsKLQkJCX0KLQkJCQotCQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlVW5rbm93bkZlYXR1cmUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNFbGVtZW50LCBFT2JqZWN0IHBlZWtPYmplY3QsIFN0cmluZyB2YWx1ZSkgewotCQkJCWlmIChFUEZWZXJzaW9ucy5UT09MX0lELmVxdWFscyhwcmVmaXgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJc3VwZXIuaGFuZGxlVW5rbm93bkZlYXR1cmUocHJlZml4LCBuYW1lLCBpc0VsZW1lbnQsIHBlZWtPYmplY3QsIHZhbHVlKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSB7Ci0JCQkJc3VwZXIuZW5kRG9jdW1lbnQoKTsKLQotCQkJCWlmIChoZWxwZXIgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlIZWxwZXJJbXBsKSB7Ci0JCQkJCUxpc3Qgc2FtZURvY1JlZmVyZW5jZXMgPSAoKE11bHRpRmlsZVhNSUhlbHBlckltcGwpIGhlbHBlcikuc2FtZURvY1JlZmVyZW5jZXM7Ci0JCQkJCWlmICghc2FtZURvY1JlZmVyZW5jZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzYW1lRG9jUmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJTXVsdGlGaWxlWE1JSGVscGVySW1wbC5Qcm94eVJlZmVyZW5jZSBwcm94eVJlZiA9IChNdWx0aUZpbGVYTUlIZWxwZXJJbXBsLlByb3h5UmVmZXJlbmNlKSBpdGVyCi0JCQkJCQkJCQkubmV4dCgpOwotCi0JCQkJCQkJLy8gdGhpcyB3aWxsIG1lcmdlIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIG1hcHMgYXMgd2VsbAotCQkJCQkJCUVPYmplY3QgcmVzb2x2ZWQgPSBwcm94eVJlZi5nZXRPd25lcigpCi0JCQkJCQkJCQkuZVJlc29sdmVQcm94eShwcm94eVJlZi5nZXRQcm94eSgpKTsKLQotCQkJCQkJCUludGVybmFsRUxpc3QgdmFsdWVzID0gKEludGVybmFsRUxpc3QpIHByb3h5UmVmCi0JCQkJCQkJCQkuZ2V0T3duZXIoKS5lR2V0KHByb3h5UmVmLmdldFJlZmVyZW5jZSgpKTsKLQkJCQkJCQlpbnQgaW5kZXggPSB2YWx1ZXMuYmFzaWNMaXN0KCkuaW5kZXhPZigKLQkJCQkJCQkJCXByb3h5UmVmLmdldFByb3h5KCkpOwotCQkJCQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCQkJCQl2YWx1ZXMuc2V0VW5pcXVlKGluZGV4LCByZXNvbHZlZCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTExvYWRJbXBsI2xvYWQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZSwKLQkgKiAgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0sIGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIHZvaWQgbG9hZChYTUxSZXNvdXJjZSByZXNvdXJjZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIE1hcCBvcHRpb25zKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCS8vIHN0cmlwIG9mZiB0aGUgVVRGLTggQk9NIGJ5dGVzIGlmIHRoZXkgYXJlIHN0aWxsIHRoZXJlCi0JCQkvLwotCQkJUHVzaGJhY2tJbnB1dFN0cmVhbSBwYmlzID0gbmV3IFB1c2hiYWNrSW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0sIDMpOwotCQkJYnl0ZSBib21bXSA9IG5ldyBieXRlWzNdOwotCQkJaWYgKHBiaXMucmVhZChib20pID09IDMpIHsKLQkJCQlpZiAoYm9tWzBdICE9IChieXRlKSAweEVGIHx8IGJvbVsxXSAhPSAoYnl0ZSkgMHhCQgotCQkJCQkJfHwgYm9tWzJdICE9IChieXRlKSAweEJGKSB7Ci0JCQkJCXBiaXMudW5yZWFkKGJvbSk7Ci0JCQkJfQotCQkJfQotCi0JCQlzdXBlci5sb2FkKHJlc291cmNlLCBwYmlzLCBvcHRpb25zKTsKLQkJfSBjYXRjaCAoUmVzb3VyY2UuSU9XcmFwcGVkRXhjZXB0aW9uIGUpIHsKLQkJCWlmICghcmVzb3VyY2UuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpICYmIGhlbHBlciA9PSBudWxsKSB7Ci0JCQkJLy8gdW5rbm93biBmZWF0dXJlcyBkZXRlY3RlZCwgbG9nIHRoZSB3YXJuaW5nIGFuZCBpZ25vcmUgdGhlbQotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlLmdldEVycm9ycygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUV4Y2VwdGlvbiBleCA9IChFeGNlcHRpb24pIGl0ZXIubmV4dCgpOwotCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGV4LmdldE1lc3NhZ2UoKSk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNThlMTQ5OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MTG9hZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFNhdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuaW50ZXJuYWwuSUZhaWxTYWZlU2F2YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZU5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFJlc291cmNlIGltcGxlbWVudGF0aW9uIGZvciBsaWJyYXJ5IFhNSSBwZXJzaXN0ZW5jZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1JUmVzb3VyY2VJbXBsIAotaW1wbGVtZW50cyBJTGlicmFyeVJlc291cmNlLCBJRmFpbFNhZmVTYXZhYmxlCi17Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdGVtcERpcjsKLQotCXByaXZhdGUgVVJJIGZpbmFsVVJJOwotCi0JcHJpdmF0ZSBVUkkgb2xkVVJJOwotCi0JcHJpdmF0ZSBTdHJpbmcgYmFja3VwRmlsZTsKLQotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRUeElEOwotCi0JcHJpdmF0ZSBsb25nIGxhc3RMb2FkVGltZVN0YW1wOwotCi0JcHJpdmF0ZSBSZXNvdXJjZURlc2NyaXB0b3IgcmVzb3VyY2VEZXNjcmlwdG9yOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzVW5sb2FkaW5nOwotCi0JcHJpdmF0ZSBsb25nIGZpbGVMYXN0TW9kaWZpZWQ7Ci0KLQlwdWJsaWMgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKLQkJc3VwZXIodXJpKTsKLQkJc2V0SW50cmluc2ljSURUb0VPYmplY3RNYXAobmV3IEhhc2hNYXAoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFhNTExvYWQgY3JlYXRlWE1MTG9hZCgpIHsKLQkJcmV0dXJuIG5ldyBNdWx0aUZpbGVYTUlMb2FkSW1wbChjcmVhdGVYTUxIZWxwZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI2NyZWF0ZVhNTFNhdmUoKQotCSAqLwotCXByb3RlY3RlZCBYTUxTYXZlIGNyZWF0ZVhNTFNhdmUoKSB7Ci0JCXJldHVybiBuZXcgTXVsdGlGaWxlWE1JU2F2ZUltcGwoY3JlYXRlWE1MSGVscGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbCNjcmVhdGVYTUxIZWxwZXIoKQotCSAqLwotCXByb3RlY3RlZCBYTUxIZWxwZXIgY3JlYXRlWE1MSGVscGVyKCkgewotCQlyZXR1cm4gbmV3IE11bHRpRmlsZVhNSUhlbHBlckltcGwodGhpcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlI2dldElEKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCVN0cmluZyBpZCA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEd1aWQoZU9iamVjdCk7Ci0JCWlmIChpZCAhPSBudWxsKQotCQkJcmV0dXJuIGlkOwotCQlyZXR1cm4gc3VwZXIuZ2V0SUQoZU9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI3NldElEKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJRChFT2JqZWN0IGVPYmplY3QsIFN0cmluZyBpZCkgewotCQlPYmplY3Qgb2xkSUQgPSBpZCAhPSBudWxsID8gZ2V0RU9iamVjdFRvSURNYXAoKS5wdXQoZU9iamVjdCwgaWQpCi0JCQkJOiBnZXRFT2JqZWN0VG9JRE1hcCgpLnJlbW92ZShlT2JqZWN0KTsKLQotCQlNYXAgZ3VpZFRvTWV0aG9kRWxlbWVudE1hcCA9ICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRSZXNvdXJjZVNldCgpKQotCQkJCS5nZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCk7Ci0KLQkJaWYgKG9sZElEICE9IG51bGwpIHsKLQkJCWdldElEVG9FT2JqZWN0TWFwKCkucmVtb3ZlKG9sZElEKTsKLQkJCQotCQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJLy8gcmVtb3ZlIG9iamVjdCBmcm9tIGd1aWRUb01ldGhvZEVsZW1lbnRNYXAgb25seSBpZiBpdCBpcyBhIHByb3h5Ci0JCQkJLy8KLQkJCQlpZihlT2JqZWN0LmVJc1Byb3h5KCkpIHsKLQkJCQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgZ3VpZFRvTWV0aG9kRWxlbWVudE1hcC5nZXQoaWQpOwotCQkJCQlpZihvYmogIT0gbnVsbCAmJiBvYmouZUlzUHJveHkoKSkgewotCQkJCQkJZ3VpZFRvTWV0aG9kRWxlbWVudE1hcC5yZW1vdmUoaWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlndWlkVG9NZXRob2RFbGVtZW50TWFwLnJlbW92ZShpZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCWdldElEVG9FT2JqZWN0TWFwKCkucHV0KGlkLCBlT2JqZWN0KTsKLQkJCWlmIChlT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCWd1aWRUb01ldGhvZEVsZW1lbnRNYXAucHV0KGlkLCBlT2JqZWN0KTsKLQotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBlT2JqZWN0OwotCQkJCWlmICghZS5nZXRHdWlkKCkuZXF1YWxzKGlkKSkgewotCQkJCQllLnNldEd1aWQoaWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCN1c2VVVUlEcygpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlVVVJRHMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlI2dldFVSSUZyYWdtZW50KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VVJJRnJhZ21lbnQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgaWQgPSBnZXRJRChlT2JqZWN0KTsKLQotCQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gaWQ7Ci0JCQl9IGVsc2UgewotCQkJCUxpc3QgdXJpRnJhZ21lbnRQYXRoID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoRU9iamVjdCBjb250YWluZXIgPSBlT2JqZWN0LmVDb250YWluZXIoKTsgY29udGFpbmVyICE9IG51bGwKLQkJCQkJCSYmIGNvbnRhaW5lci5lUmVzb3VyY2UoKSA9PSB0aGlzOyBjb250YWluZXIgPSBlT2JqZWN0Ci0JCQkJCQkuZUNvbnRhaW5lcigpKSB7Ci0JCQkJCXVyaUZyYWdtZW50UGF0aC5hZGQoKChJbnRlcm5hbEVPYmplY3QpIGNvbnRhaW5lcikKLQkJCQkJCQkuZVVSSUZyYWdtZW50U2VnbWVudChlT2JqZWN0LmVDb250YWluaW5nRmVhdHVyZSgpLAotCQkJCQkJCQkJZU9iamVjdCkpOwotCQkJCQllT2JqZWN0ID0gY29udGFpbmVyOwotCQkJCX0KLQotCQkJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYXBwZW5kKGdldFVSSUZyYWdtZW50Um9vdFNlZ21lbnQoZU9iamVjdCkpOwotCi0JCQkJZm9yIChMaXN0SXRlcmF0b3IgaSA9IHVyaUZyYWdtZW50UGF0aAotCQkJCQkJLmxpc3RJdGVyYXRvcih1cmlGcmFnbWVudFBhdGguc2l6ZSgpKTsgaS5oYXNQcmV2aW91cygpOykgewotCQkJCQlyZXN1bHQuYXBwZW5kKCcvJyk7Ci0JCQkJCXJlc3VsdC5hcHBlbmQoKFN0cmluZykgaS5wcmV2aW91cygpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3IgZ2V0dGluZyBVUkkgZnJhZ21lbnQgZm9yICIgKyBlT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNhdHRhY2hlZEhlbHBlcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhdHRhY2hlZEhlbHBlcihFT2JqZWN0IGVPYmplY3QpIHsKLQkJc3VwZXIuYXR0YWNoZWRIZWxwZXIoZU9iamVjdCk7Ci0KLQkJaWYgKHVzZUlEcygpKSB7Ci0JCQlTdHJpbmcgaWQgPSBnZXRJRChlT2JqZWN0KTsKLQkJCWlmIChpZCAhPSBudWxsKSB7Ci0JCQkJLy8gdXBkYXRlIHRoZSBlT2JqZWN0VG9JRE1hcAotCQkJCS8vCi0JCQkJZ2V0RU9iamVjdFRvSURNYXAoKS5wdXQoZU9iamVjdCwgaWQpOwotCQkJCQotCQkJCWlmIChlT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZ2V0UmVzb3VyY2VTZXQoKSkKLQkJCQkJCQkuZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpLnB1dChpZCwgZU9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGlzVHJhY2tpbmdNb2RpZmljYXRpb24oKSAmJiBlT2JqZWN0LmVSZXNvdXJjZSgpICE9IHRoaXMpIHsKLQkJCS8vIHJlbW92ZSB0aGUgbW9kaWZpY2F0aW9uIHRyYWNraW5nIGFkYXB0ZXIgZnJvbSB0aGUgZU9iamVjdAotCQkJLy8KLQkJCWVPYmplY3QuZUFkYXB0ZXJzKCkucmVtb3ZlKG1vZGlmaWNhdGlvblRyYWNraW5nQWRhcHRlcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXR0YWNoZWRBbGxXaXRoSURzKEVPYmplY3QgZU9iaikgewotCQkvLyBhdHRhY2hlZEhlbHBlcihlT2JqKTsKLQkJLy8gTGlzdCBsaXN0ID0gZU9iai5lQ29udGVudHMoKTsKLQkJLy8gaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJLy8gRU9iamVjdCBvID0gKEVPYmplY3QpIGxpc3QuZ2V0KGkpOwotCQkvLyBpZiAoby5lUmVzb3VyY2UoKSA9PSB0aGlzKSB7Ci0JCS8vIGF0dGFjaGVkQWxsV2l0aElEcyhvKTsKLQkJLy8gfQotCQkvLyB9Ci0KLQkJSXRlcmF0b3IgYWxsQ29udGVudHMgPSBuZXcgQ29udGVudFRyZWVJdGVyYXRvcihlT2JqKTsKLQotCQl3aGlsZSAoYWxsQ29udGVudHMuaGFzTmV4dCgpKSB7Ci0JCQlhdHRhY2hlZEhlbHBlcigoRU9iamVjdCkgYWxsQ29udGVudHMubmV4dCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBiYXNpY0F0dGFjaGVkQWxsKEVPYmplY3QgZU9iaikgewotCQllT2JqLmVBZGFwdGVycygpLmFkZChtb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIpOwotCQlMaXN0IGxpc3QgPSBlT2JqLmVDb250ZW50cygpOwotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGxpc3QuZ2V0KGkpOwotCQkJaWYgKG8uZVJlc291cmNlKCkgPT0gdGhpcykgewotCQkJCWJhc2ljQXR0YWNoZWRBbGwobyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyBvbiBhbiBvYmplY3QgYW5kIGFsbCBvZiBpdHMgb2Zmc3RyaW5nIG9iamVjdHMgdGhhdCBhcmUgaW4gdGhlIHNhbWUKLQkgKiByZXNvdXJjZSBhcyB0aGUgb2JqZWN0IHdoZW4gdGhlIG9iamVjdCBpcyBhdHRhY2hlZCB0byB0aGlzIHJlc291cmNlLiBUaGlzCi0JICogbWV0aG9kIGlzIGV4cGVuc2l2ZSwgc28gdXNlIGl0IHdpdGggY2F1dGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZU9iagotCSAqLwotCXB1YmxpYyB2b2lkIGF0dGFjaGVkQWxsKEVPYmplY3QgZU9iaikgewotCQlpZiAodXNlSURzKCkpIHsKLQkJCWF0dGFjaGVkQWxsV2l0aElEcyhlT2JqKTsKLQkJfSBlbHNlIHsKLQkJCWJhc2ljQXR0YWNoZWRBbGwoZU9iaik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5JbnRlcm5hbCNhdHRhY2hlZChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhdHRhY2hlZChFT2JqZWN0IGVPYmplY3QpIHsKLQkJYXR0YWNoZWRBbGwoZU9iamVjdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRldGFjaGVkQWxsV2l0aElEcyhFT2JqZWN0IGVPYmopIHsKLQkJSXRlcmF0b3IgYWxsQ29udGVudHMgPSBuZXcgQ29udGVudFRyZWVJdGVyYXRvcihlT2JqKTsKLQotCQl3aGlsZSAoYWxsQ29udGVudHMuaGFzTmV4dCgpKSB7Ci0JCQlkZXRhY2hlZEhlbHBlcigoRU9iamVjdCkgYWxsQ29udGVudHMubmV4dCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBiYXNpY0RldGFjaGVkQWxsKEVPYmplY3QgZU9iaikgewotCQllT2JqLmVBZGFwdGVycygpLnJlbW92ZShtb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIpOwotCQlMaXN0IGxpc3QgPSBlT2JqLmVDb250ZW50cygpOwotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGxpc3QuZ2V0KGkpOwotCQkJaWYgKG8uZVJlc291cmNlKCkgPT0gdGhpcykgewotCQkJCWJhc2ljRGV0YWNoZWRBbGwobyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGwjZ2V0RU9iamVjdEJ5SUQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFT2JqZWN0QnlJRChTdHJpbmcgaWQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBndWlkID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0R3VpZChlbGVtZW50KTsKLQkJCWlmIChndWlkICE9IG51bGwgJiYgZ3VpZC5lcXVhbHMoaWQpKQotCQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0KLQkJLy8gcmV0dXJuIHN1cGVyLmdldEVPYmplY3RCeUlEKGlkKTsKLQotCQlpZiAoaWRUb0VPYmplY3RNYXAgIT0gbnVsbCkgewotCQkJSW50ZXJuYWxFT2JqZWN0IGVPYmplY3QgPSAoSW50ZXJuYWxFT2JqZWN0KSBpZFRvRU9iamVjdE1hcC5nZXQoaWQpOwotCQkJaWYgKGVPYmplY3QgIT0gbnVsbCAmJiAhZU9iamVjdC5lSXNQcm94eSgpKSB7Ci0JCQkJcmV0dXJuIGVPYmplY3Q7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbCNsb2FkKGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIHZvaWQgbG9hZChNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzVW5sb2FkaW5nKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubG9hZChvcHRpb25zKTsKLQkJdXBkYXRlVGltZVN0YW1wcygpOwotCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCWlmIChnZXRVUkkoKS50b1N0cmluZygpLmVxdWFscyh0ZXN0UmVzb3VyY2VVUklTdHIpKSB7Ci0JCQkJdGVzdFJlc291cmNlTG9hZGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdGVzdFJlc291cmNlTG9hZGVkOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRlc3RSZXNvdXJjZVVSSVN0ciA9ICJmaWxlOi9DOi90ZW1wL25ld2xpYi9saWJyYXJ5LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGZpbGVMYXN0TW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRGaWxlTGFzdE1vZGlmaWVkKCkgewotCQlyZXR1cm4gZmlsZUxhc3RNb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiBSZWxvYWRzIHRoaXMgcmVzb3VyY2UuIE9sZCBvYmplY3RzIHdpbGwgYmVjb21lIHByb3hpZXMgYW5kIHRoZXkgd2lsbCBiZQotCSAqIGFkZGVkIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiA8Y29kZT5wcm94aWVzPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBwcm94aWVzCi0JICovCi0Jc3luY2hyb25pemVkIGJvb2xlYW4gcmVsb2FkKENvbGxlY3Rpb24gcHJveGllcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzTG9hZGVkKSB7Ci0JCQlOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gc2V0TG9hZGVkKGZhbHNlKTsKLQkJCWRvVW5sb2FkKHByb3hpZXMsIGZhbHNlKTsKLQkJCS8vIGRvVW5sb2FkKCkgbWlnaHQgaGF2ZSBzZXQgdGhpcyByZXNvdXJjZSBsb2FkZWQgYWdhaW4KLQkJCS8vIHNldCBpc0xvYWRlZCB0byBmYWxzZSBhbmQgY29udGVudHMgdG8gbnVsbCB0byBtYWtlIHN1cmUKLQkJCS8vCi0JCQlpc0xvYWRlZCA9IGZhbHNlOwotCQkJY29udGVudHMgPSBudWxsOwotCQkJaWYgKG5vdGlmaWNhdGlvbiAhPSBudWxsKSB7Ci0JCQkJZU5vdGlmeShub3RpZmljYXRpb24pOwotCQkJfQotCQkJbG9hZChnZXRSZXNvdXJjZVNldCgpLmdldExvYWRPcHRpb25zKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogSmF2YWRvYyBjb3BpZWQgZnJvbSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdW5sb2FkV2l0aG91dFJlbW92ZSgpIHsKLQkJaWYgKGlzTG9hZGVkKSB7Ci0JCQkvLyBzYXZlIHRoZSBSZXNvdXJjZURlc2NyaXB0b3IgcGYgdGhpcyByZXNvdXJjZSBmb3IgbGF0ZXIgdXNlIHRvCi0JCQkvLyBjcmVhdGUgVVJJIGZvciB0aGUgcHJveGllcyBhZnRlciB1bmxvYWQKLQkJCS8vCi0JCQlSZXNvdXJjZURlc2NyaXB0b3IgcmVzRGVzYyA9IE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCS5nZXRSZXNvdXJjZURlc2NyaXB0b3IodGhpcyk7Ci0JCQlpZiAocmVzRGVzYyAhPSBudWxsKSB7Ci0JCQkJc2V0UmVzb3VyY2VEZXNjcmlwdG9yKHJlc0Rlc2MpOwotCQkJfQotCi0JCQlOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gc2V0TG9hZGVkKGZhbHNlKTsKLQkJCWRvVW5sb2FkKG51bGwsIGZhbHNlKTsKLQkJCWlmIChub3RpZmljYXRpb24gIT0gbnVsbCkgewotCQkJCWVOb3RpZnkobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERvZXMgYWxsIHRoZSB3b3JrIG9mIHVubG9hZGluZyB0aGUgcmVzb3VyY2UuIEl0IGNhbGxzCi0JICoge0BsaW5rICN1bmxvYWRlZCB1bmxvYWRlZH0gZm9yIGVhY2ggb2JqZWN0IGl0IHRoZSBjb250ZW50Ci0JICoge0BsaW5rICNnZXRBbGxDb250ZW50cyB0cmVlfSwgYW5kIGNsZWFycyB0aGUKLQkgKiB7QGxpbmsgI2dldENvbnRlbnRzIGNvbnRlbnRzfSwge0BsaW5rICNnZXRFcnJvcnMgZXJyb3JzfSwgYW5kCi0JICoge0BsaW5rICNnZXRXYXJuaW5ncyB3YXJuaW5nc30uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9VbmxvYWQoKSB7Ci0JCWRvVW5sb2FkKG51bGwsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gSnVsIDE3LCAyMDA2Ci0JICogQHNpbmNlIDEuMAotCSAqLwotCXByaXZhdGUgZmluYWwgY2xhc3MgQ29udGVudFRyZWVJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHsKLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkvKioKLQkJICogQHBhcmFtIG9iamVjdAotCQkgKi8KLQkJcHJpdmF0ZSBDb250ZW50VHJlZUl0ZXJhdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJCXN1cGVyKG9iamVjdCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJRUNvbnRlbnRzRUxpc3QgY29udGVudHMgPSBuZXcgRUNvbnRlbnRzRUxpc3QoKEVPYmplY3QpIG9iamVjdCkgewotCQkJCQkvKgotCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCSAqIAotCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50c0VMaXN0I3Jlc29sdmUoKQotCQkJCQkgKi8KLQkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gcmVzb2x2ZSgpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX07Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29udGVudHMuYmFzaWNJdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoby5lUmVzb3VyY2UoKSA9PSBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwudGhpcwotCQkJCQkJCXx8IG8uZUlzUHJveHkoKSkgewotCQkJCQkJY2hpbGRyZW4uYWRkKG8pOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJfQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVubG9hZHMgdGhpcyByZXNvdXJjZS4gT2xkIG9iamVjdHMgd2lsbCBiZSBjb21lIHByb3hpZXMgYW5kIHdpbGwgYmUgYWRkZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gPGNvZGU+cHJveGllczwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gcHJveGllcwotCSAqIEBwYXJhbSByZW1vdmUKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+IHdpbGwgcmVtb3ZlIGFsbCB0aGUgdW5sb2FkZWQgb2JqZWN0cyBpbgotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIGZyb20gdGhlaXIgY29udGFpbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VubG9hZChDb2xsZWN0aW9uIHByb3hpZXMsIGJvb2xlYW4gcmVtb3ZlKSB7Ci0JCWlzVW5sb2FkaW5nID0gdHJ1ZTsKLQotCQl0cnkgewotCQkJLy8gZnJvbSBSZXNvdXJjZUltcGwKLQkJCS8vCi0KLQkJCUl0ZXJhdG9yIGFsbENvbnRlbnRzID0gZ2V0QWxsUHJvcGVyQ29udGVudHMobmV3IEFycmF5TGlzdCgKLQkJCQkJZ2V0Q29udGVudHMoKSkpOwotCi0JCQkvLyBUaGlzIGd1YXJkIGlzIG5lZWRlZCB0byBlbnN1cmUgdGhhdCBjbGVhciBkb2Vzbid0IG1ha2UgdGhlCi0JCQkvLyByZXNvdXJjZQotCQkJLy8gYmVjb21lIGxvYWRlZC4KLQkJCS8vCi0JCQlpZiAoIWdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJaWYgKHJlbW92ZSkgewotCQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gZG9uJ3QgY2FsbCBnZXRDb250ZW50cygpLmNsZWFyKCkgdG8ga2VlcCB0aGUgcmVmZXJlbmNlcwotCQkJCQkvLyB0byBlbGVtZW50cwotCQkJCQkvLyB0aGF0IGp1c3QgYmVjYW1lIHByb3hpZXMgYWZ0ZXIgdW5sb2FkCi0JCQkJCS8vCi0JCQkJCWNvbnRlbnRzID0gbnVsbDsKLQkJCQl9Ci0KLQkJCQkvLyBNYXAgb2JqVG9Db250YWluZXJNYXAgPSBudWxsOwotCQkJCS8vIE1hcCBjb250YWluZXJUb0RlbGl2ZXJNYXAgPSBudWxsOwotCQkJCS8vIGlmKCFyZW1vdmUpIHsKLQkJCQkvLyBvYmpUb0NvbnRhaW5lck1hcCA9IE11bHRpRmlsZVNhdmVVdGlsLmdldENvbnRhaW5lcnModGhpcyk7Ci0JCQkJLy8gaWYoIW9ialRvQ29udGFpbmVyTWFwLmlzRW1wdHkoKSkgewotCQkJCS8vIC8vIHNhdmUgdGhlIGN1cnJlbnQgZGVsaXZlciBmbGFnIG9mIGFsbCBjb250YWluZXJzIG9mIGNvbnRlbnQKLQkJCQkvLyBvYmplY3RzCi0JCQkJLy8gLy8gYW5kIGRpc2FibGUgbm90aWZpY2F0aW9uIG9uIHRob3NlIGNvbnRhaW5lciBzbwotCQkJCS8vIGdldENvbnRlbnQoKS5jbGVhcigpIHdpbGwKLQkJCQkvLyAvLyBub3QgZGlzcGF0Y2ggbm90aWZpY2F0aW9uIHRoYXQgbWlnaHQgdXBkYXRlIFVJLiBBbmQgd2UKLQkJCQkvLyBkb24ndCB3YW50IHRvIHVwZGF0ZQotCQkJCS8vIC8vIFVJIGF0IHRoaXMgc3RhZ2UKLQkJCQkvLyAvLwotCQkJCS8vIGNvbnRhaW5lclRvRGVsaXZlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gb2JqVG9Db250YWluZXJNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkvLyBFT2JqZWN0IGNvbnRhaW5lciA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkvLyBjb250YWluZXJUb0RlbGl2ZXJNYXAucHV0KGNvbnRhaW5lciwgbmV3Ci0JCQkJLy8gQm9vbGVhbihjb250YWluZXIuZURlbGl2ZXIoKSkpOwotCQkJCS8vIGNvbnRhaW5lci5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCS8vIGlmKCFyZW1vdmUgJiYgY29udGFpbmVyVG9EZWxpdmVyTWFwICE9IG51bGwpIHsKLQkJCQkvLyAvLyByZXN0b3JlIHRoZSBjb250YWluZXIgb2YgY29udGVudHMgb2JqZWN0cwotCQkJCS8vIC8vCi0JCQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gb2JqVG9Db250YWluZXJNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkJCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCS8vIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCS8vIE11bHRpUmVzb3VyY2VFT2JqZWN0IG9iaiA9Ci0JCQkJLy8gKChNdWx0aVJlc291cmNlRU9iamVjdCllbnRyeS5nZXRLZXkoKSk7Ci0JCQkJLy8gSW50ZXJuYWxFT2JqZWN0IGNvbnRhaW5lciA9IChJbnRlcm5hbEVPYmplY3QpCi0JCQkJLy8gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkvLyBvYmouZUJhc2ljU2V0Q29udGFpbmVyKGNvbnRhaW5lciwgb2JqLmVDb250YWluZXJGZWF0dXJlSUQoKSk7Ci0JCQkJLy8gfQotCi0JCQkJLy8gLy8gcmVzdG9yZSB0aGUgZGVsaXZlciBmbGFnIG9mIGNvbnRlbnRzIG9iamVjdHM7Ci0JCQkJLy8gLy8KLQkJCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPQotCQkJCS8vIGNvbnRhaW5lclRvRGVsaXZlck1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJCQkvLyB7Ci0JCQkJLy8gTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJLy8gRU9iamVjdCBjb250YWluZXIgPSAoRU9iamVjdCkgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJLy8gYm9vbGVhbiBkZWxpdmVyID0gKChCb29sZWFuKWVudHJ5LmdldFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCS8vIGNvbnRhaW5lci5lU2V0RGVsaXZlcihkZWxpdmVyKTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJfQotCQkJZ2V0RXJyb3JzKCkuY2xlYXIoKTsKLQkJCWdldFdhcm5pbmdzKCkuY2xlYXIoKTsKLQotCQkJQXJyYXlMaXN0IHVubG9hZGVkT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXRyeSB7Ci0JCQkJd2hpbGUgKGFsbENvbnRlbnRzLmhhc05leHQoKSkgewotCQkJCQl0cnkgewotCQkJCQkJSW50ZXJuYWxFT2JqZWN0IG8gPSAoSW50ZXJuYWxFT2JqZWN0KSBhbGxDb250ZW50cwotCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJdW5sb2FkZWQobyk7Ci0JCQkJCQl1bmxvYWRlZE9iamVjdHMuYWRkKG8pOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCX0KLQkJCWlmIChwcm94aWVzICE9IG51bGwgJiYgIXVubG9hZGVkT2JqZWN0cy5pc0VtcHR5KCkpIHsKLQkJCQlwcm94aWVzLmFkZEFsbCh1bmxvYWRlZE9iamVjdHMpOwotCQkJfQotCQkJaWYgKHJlbW92ZSkgewotCQkJCS8vIHJlbW92ZSB0aGUgdW5sb2FkZWQgb2JqZWN0cyBmcm9tIGl0cyBjb250YWluZXIgdG8gcHJldmVudCB0aGUKLQkJCQkvLyB3aG9sZSBsaWJyYXJ5IGZyb20gc3RheWluZwotCQkJCS8vIGluIG1lbW9yeSBpZiBvbmx5IG9uZSBvZiBpdHMgZWxlbWVudCBpcyBsZWFrZWQKLQkJCQkvLyAKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB1bmxvYWRlZE9iamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3Qgb2JqZWN0ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlFY29yZVV0aWwucmVtb3ZlKG9iamVjdCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBmcm9tIFhNTFJlc291cmNlSW1sCi0JCQkvLwkJCi0KLQkJCWlmIChpZFRvRU9iamVjdE1hcCAhPSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gaWRUb0VPYmplY3RNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGdldFJlc291cmNlU2V0KCkpCi0JCQkJCQkJLmdldEd1aWRUb01ldGhvZEVsZW1lbnRNYXAoKS5yZW1vdmUoaXRlci5uZXh0KCkpOwotCQkJCX0KLQkJCQlpZFRvRU9iamVjdE1hcC5jbGVhcigpOwotCQkJfQotCi0JCQlpZiAoZU9iamVjdFRvSURNYXAgIT0gbnVsbCkgewotCQkJCWVPYmplY3RUb0lETWFwLmNsZWFyKCk7Ci0JCQl9Ci0KLQkJCWlmIChlT2JqZWN0VG9FeHRlbnNpb25NYXAgIT0gbnVsbCkgewotCQkJCWVPYmplY3RUb0V4dGVuc2lvbk1hcC5jbGVhcigpOwotCQkJfQotCi0JCQlpZiAoaW50cmluc2ljSURUb0VPYmplY3RNYXAgIT0gbnVsbCkgewotCQkJCWludHJpbnNpY0lEVG9FT2JqZWN0TWFwLmNsZWFyKCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpc1VubG9hZGluZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdW5sb2FkZWQoSW50ZXJuYWxFT2JqZWN0IGludGVybmFsRU9iamVjdCkgewotCQlTdHJpbmcgZ3VpZCA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEd1aWQoaW50ZXJuYWxFT2JqZWN0KTsKLQkJaWYgKGd1aWQgIT0gbnVsbCkgewotCQkJVVJJIHVyaSA9IHJlc291cmNlRGVzY3JpcHRvciAhPSBudWxsID8gTXVsdGlGaWxlVVJJQ29udmVydGVyCi0JCQkJCS5jcmVhdGVVUkkocmVzb3VyY2VEZXNjcmlwdG9yLmdldElkKCkpIDogZ2V0VVJJKCk7Ci0JCQlpbnRlcm5hbEVPYmplY3QuZVNldFByb3h5VVJJKHVyaS5hcHBlbmRGcmFnbWVudChndWlkKSk7Ci0JCX0KLQkJaW50ZXJuYWxFT2JqZWN0LmVBZGFwdGVycygpLmNsZWFyKCk7Ci0KLQkJaWYgKGludGVybmFsRU9iamVjdCBpbnN0YW5jZW9mIE11bHRpUmVzb3VyY2VFT2JqZWN0KSB7Ci0JCQlNdWx0aVJlc291cmNlRU9iamVjdCBtdWx0aVJlc291cmNlRU9iamVjdCA9ICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGludGVybmFsRU9iamVjdCk7Ci0KLQkJCS8vIGNsZWFyIG93biBvcHBvc2l0ZSBmZWF0dXJlIG1hcAotCQkJLy8JCQkKLQkJCU1hcCBvcHBvc2l0ZUZlYXR1cmVNYXAgPSBtdWx0aVJlc291cmNlRU9iamVjdAotCQkJCQkuYmFzaWNHZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKTsKLQkJCWlmIChvcHBvc2l0ZUZlYXR1cmVNYXAgIT0gbnVsbCkgewotCQkJCW9wcG9zaXRlRmVhdHVyZU1hcC5jbGVhcigpOwotCQkJfQotCi0JCQkvLyByZW1vdmUgaXRzZWxmIGZyb20gYWxsIG9wcG9zaXRlIGZlYXR1cmVzCi0JCQkvLyAKLQkJCW11bHRpUmVzb3VyY2VFT2JqZWN0LnJlbW92ZUZyb21BbGxPcHBvc2l0ZUZlYXR1cmVzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZXRhY2hlZEFsbChFT2JqZWN0IGVPYmopIHsKLQkJaWYgKHVzZUlEcygpKSB7Ci0JCQlkZXRhY2hlZEFsbFdpdGhJRHMoZU9iaik7Ci0JCX0gZWxzZSB7Ci0JCQliYXNpY0RldGFjaGVkQWxsKGVPYmopOwotCQl9Ci0JfQkJCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5JbnRlcm5hbCNkZXRhY2hlZChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXRhY2hlZChFT2JqZWN0IGVPYmplY3QpIHsKLQkJZGV0YWNoZWRBbGwoZU9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUltcGwjY3JlYXRlTW9kaWZpY2F0aW9uVHJhY2tpbmdBZGFwdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgQWRhcHRlciBjcmVhdGVNb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTW9kaWZpY2F0aW9uVHJhY2tpbmdBZGFwdGVyKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUltcGwuTW9kaWZpY2F0aW9uVHJhY2tpbmdBZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQkvLyBkb24ndCBoYW5kbGUgT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uIGIvYyBpdCBkb2VzIG5vdAotCQkJCS8vIHJlYWxseSBtb2RpZnkgdGhpcyByZXNvdXJjZQotCQkJCS8vCi0JCQkJaWYgKG5vdGlmaWNhdGlvbiBpbnN0YW5jZW9mIE9wcG9zaXRlRmVhdHVyZU5vdGlmaWNhdGlvbikgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbCNzZXRNb2RpZmllZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVkKGJvb2xlYW4gaXNNb2RpZmllZCkgewotCQkvLyBib29sZWFuIHdhc01vZGlmaWVkID0gaXNNb2RpZmllZCgpOwotCQlzdXBlci5zZXRNb2RpZmllZChpc01vZGlmaWVkKTsKLQkJLy8gaWYoTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0TWV0aG9kRWxlbWVudCh0aGlzKSBpbnN0YW5jZW9mCi0JCS8vIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwuc2V0TW9kaWZpZWQoKTogIiArCi0JCS8vIHRoaXMpOwotCQkvLyB9Ci0JCS8vIHRoaXMgY29kZSBpcyBuZWVkZWQgdG8gc2V0IGRpcnR5IGZsYWcgdG8gdGhlIGl0ZW0gcHJvdmlkZXIncyBsYWJlbAotCQkvLwotCQkvLyBpZih3YXNNb2RpZmllZCAhPSBpc01vZGlmaWVkICYmICFnZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkvLyAvLyByZWZyZXNoIHRoZSBsYWJlbCBvZiB0aGUgcmVzb3VyY2UncyBvYmplY3QKLQkJLy8gLy8KLQkJLy8gRU9iamVjdCBvYmogPSAoRU9iamVjdCkgZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IG9iai5lQWRhcHRlcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gT2JqZWN0IGFkYXB0ZXIgPSBpdGVyLm5leHQoKTsKLQkJLy8gaWYoYWRhcHRlciBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJLy8gKChJdGVtUHJvdmlkZXJBZGFwdGVyKWFkYXB0ZXIpLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldwotCQkvLyBWaWV3ZXJOb3RpZmljYXRpb24obmV3IE5vdGlmaWNhdGlvbkltcGwoTm90aWZpY2F0aW9uLlNFVCwgb2JqLCBvYmopLAotCQkvLyBvYmosIGZhbHNlLCB0cnVlKSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0KLQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQlpZiAodGVzdFJlc291cmNlTG9hZGVkCi0JCQkJCSYmIGdldFVSSSgpLnRvU3RyaW5nKCkuZXF1YWxzKHRlc3RSZXNvdXJjZVVSSVN0cikpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImlzTW9kaWZpZWQ9IiArIGlzTW9kaWZpZWQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpZXJJbXBsI2VEZWxpdmVyKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlRGVsaXZlcigpIHsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBnZXRSZXNvdXJjZVNldCgpOwotCQlpZiAocmVzb3VyY2VTZXQgIT0gbnVsbCAmJiAhcmVzb3VyY2VTZXQuZURlbGl2ZXIoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gc3VwZXIuZURlbGl2ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAob3B0aW9ucyA9PSBudWxsKSB7Ci0JCQlvcHRpb25zID0gTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLkRFRkFVTFRfU0FWRV9PUFRJT05TOwotCQl9Ci0JCQotCQlzdXBlci5zYXZlKG9wdGlvbnMpOwotCi0JCS8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIHNhdmluZyBNZXRob2RMaWJyYXJ5IHRvIHJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0bwotCQkvLyBNZXRob2RDb25maWd1cmF0aW9ucyBmcm9tIGxpYnJhcnkgZmlsZS4KLQkJLy8KLQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQodGhpcyk7Ci0JCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSAoTWV0aG9kTGlicmFyeSkgZTsKLQkJCS8vIHJlbW92ZSBSZXNvdXJjZURlc2NyaXB0b3JzIG9mIGNvbmZpZ3VyYXRpb24gZmlsZXMKLQkJCS8vCi0JCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VNYW5hZ2VyKHRoaXMpOwotCQkJaWYgKHJlc01nciAhPSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0ZXIKLQkJCQkJCQkubmV4dCgpOwotCQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgcmVzRGVzYyA9IHJlc01ncgotCQkJCQkJCS5nZXRSZXNvdXJjZURlc2NyaXB0b3IoY29uZmlnLmdldEd1aWQoKSk7Ci0JCQkJCWlmIChyZXNEZXNjICE9IG51bGwpIHsKLQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUocmVzRGVzYyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlMaXN0IGNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0KGxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSk7Ci0JCQlib29sZWFuIG9sZERlbGl2ZXIgPSBsaWIuZURlbGl2ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJbGliLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQlsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQkKLQkJCQkvLyBTYXZlIGxpYnJhcnkgZmlsZSBhZ2FpbiB0byByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gY29uZmlndXJhdGlvbnMuCi0JCQkJLy8gVGhlIHByZXZpb3VzIHNhdmUgaXMgc3RpbGwgbmVlZGVkIHRvIHNhdmUgbmV3IGNvbmZpZ3VyYXRpb24gaW4gaXRzIG93biBmaWxlCi0JCQkJLy8KLQkJCQlzdXBlci5zYXZlKG9wdGlvbnMpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkuYWRkQWxsKGNvbmZpZ3MpOwotCQkJCWxpYi5lU2V0RGVsaXZlcihvbGREZWxpdmVyKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBVUkkgZ2V0RmluYWxVUkkoKSB7Ci0JCWlmIChmaW5hbFVSSSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmluYWxVUkk7Ci0JCX0KLQkJcmV0dXJuIGdldFVSSSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbmFsVVJJKFVSSSB1cmkpIHsKLQkJZmluYWxVUkkgPSB1cmk7Ci0JfQotCi0JcHVibGljIHZvaWQgYmFja1VwVVJJKCkgewotCQlvbGRVUkkgPSBnZXRVUkkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNUZW1wVVJJKCkgewotCQlpZiAoY3VycmVudFR4SUQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNyZWF0ZVRlbXBVUkkoKS5lcXVhbHMoZ2V0VVJJKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIFVSSSBjcmVhdGVUZW1wVVJJKCkgewotCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudCh0aGlzKTsKLQkJcmV0dXJuIFVSSS5jcmVhdGVGaWxlVVJJKG5ldyBTdHJpbmdCdWZmZXIoZ2V0VGVtcERpcigpKS5hcHBlbmQoCi0JCQkJRmlsZS5zZXBhcmF0b3IpLmFwcGVuZChjdXJyZW50VHhJRCkKLQkJCQkuYXBwZW5kKCJuZXciKS5hcHBlbmQoZS5nZXRHdWlkKCkpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIFN0cmluZyBnZXRUZW1wRGlyKCkgewotCQlpZiAodGVtcERpciA9PSBudWxsKSB7Ci0JCQl0ZW1wRGlyID0gbmV3IEZpbGUoRmlsZU1hbmFnZXIuZ2V0VGVtcERpcigpLCAiRVBGIikuZ2V0QWJzb2x1dGVQYXRoKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdGVtcERpcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0ZW1wb3JhcnkgVVJJIHRvIHNhdmUgdGhpcyByZXNvdXJjZSB0byBhbmQgaXQgd2lsbCBiZSByZW5hbWVkIHRvCi0JICogdGhlIG9yaWdpbmFsIFVSSSB3aGVuIHNhdmluZyBpcyBkb25lCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVtcFVSSShTdHJpbmcgdHhJRCkgewotCQlpZiAoZmluYWxVUkkgPT0gbnVsbCkgewotCQkJZmluYWxVUkkgPSBvbGRVUkkgPSBnZXRVUkkoKTsKLQkJCWN1cnJlbnRUeElEID0gdHhJRDsKLQotCQkJVVJJIHRlbXBVUkkgPSBjcmVhdGVUZW1wVVJJKCk7Ci0JCQlzZXRVUkkodGVtcFVSSSk7Ci0KLQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGdldFJlc291cmNlU2V0KCk7Ci0JCQlyZXNvdXJjZVNldC5nZXRVUklUb1RlbXBVUklNYXAoKS5wdXQob2xkVVJJLCB0ZW1wVVJJKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlc3RvcmVzIHRoZSByZXNvdXJjZSBVUkkgdG8gdGhlIG9yaWdpbmFsIG9uZS4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsCi0JICogYWZ0ZXIgc2F2aW5nIHJlZ2FybGVzcyBvZiBpdHMgc3VjY2Vzcy4KLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzdG9yZVVSSSgpIHsKLQkJaWYgKG9sZFVSSSAhPSBudWxsKSB7Ci0JCQlzZXRVUkkob2xkVVJJKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHR4U3RhcnRlZCgpIHsKLQkJcmV0dXJuIG1vdmVTdGFydGVkKCkgfHwgc2F2ZVN0YXJ0ZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUaW1lU3RhbXBzKCkgewotCQlsYXN0TG9hZFRpbWVTdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlmaWxlTGFzdE1vZGlmaWVkID0gbmV3IEZpbGUoZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLmxhc3RNb2RpZmllZCgpOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhpcyByZXNvdXJjZSBpcyBjdXJyZW50bHkgc3luY2hyb25pemVkIHdpdGggaXRzIGRhdGEgc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIDxsaT4gLTEgZG9uJ3Qga25vdwotCSAqICAgICAgICAgPGxpPiAwIG5vCi0JICogICAgICAgICA8bGk+IDEgeWVzCi0JICovCi0JcHVibGljIGludCBjaGVja1N5bmNocm9uaXplZCgpIHsKLQkJbG9uZyBjdXJyZW50VGltZSA9IG5ldyBGaWxlKGdldFVSSSgpLnRvRmlsZVN0cmluZygpKS5sYXN0TW9kaWZpZWQoKTsKLQkJaWYoTXVsdGlGaWxlU2F2ZVV0aWwuc2FtZShjdXJyZW50VGltZSwgZmlsZUxhc3RNb2RpZmllZCkpIHsKLQkJCS8vIHNvbWUgdGVhbSBwcm92aWRlcnMgY2hhbmdlZCB0aGUgdGltZXN0YW1wIG9mIGxhc3QgZmlsZSBtb2RpZmljYXRpb24gYnkgcmVtb3Zpbmcgc2Vjb25kIGZyYWN0aW9uCi0JCQkvLyBldmVuIHRoZSBmaWxlIHdhcyBub3QgY2hhbmdlZAotCQkJLy8KLQkJCXJldHVybiAxOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0eEZpbmlzaGVkKGJvb2xlYW4gc3VjY2Vzc2Z1bCkgewotCQlib29sZWFuIHdhc01vdmUgPSAhb2xkVVJJLmVxdWFscyhmaW5hbFVSSSk7Ci0JCWlmIChzdWNjZXNzZnVsKSB7Ci0JCQlzZXRVUkkoZmluYWxVUkkpOwotCQkJc2V0TW9kaWZpZWQoZmFsc2UpOwotCQkJdXBkYXRlVGltZVN0YW1wcygpOwotCQkJRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWZyZXNoKHRoaXMpOwotCQkJaWYoIXdhc01vdmUpIHsKLQkJCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRSZXNvdXJjZVNldCgpOwotCQkJCWlmKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQkJcmVzb3VyY2VTZXQuZ2V0VW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcigpLnZhbGlkYXRlTWFya2Vycyh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXN0b3JlVVJJKCk7Ci0JCQlpZiAod2FzTW92ZSkgewotCQkJCS8vIHJlc3RvcmUgdXJpIG9mIFJlc291cmNlRGVzY3JpcHRvciBvZiB0aGlzIHJlc291cmNlCi0JCQkJLy8KLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC51cGRhdGVVUklNYXBwaW5ncyh0aGlzLCBvbGRVUkksIG51bGwsIHRydWUpOwotCQkJfQotCQl9Ci0JCWlmIChvbGRVUkkgIT0gbnVsbCkgewotCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCWlmIChyZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2VTZXQuZ2V0VVJJVG9UZW1wVVJJTWFwKCkucmVtb3ZlKG9sZFVSSSk7Ci0JCQl9Ci0JCQlvbGRVUkkgPSBudWxsOwotCQl9Ci0JCWN1cnJlbnRUeElEID0gbnVsbDsKLQkJZmluYWxVUkkgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZUJhY2t1cCgpIHsKLQkJaWYgKGJhY2t1cEZpbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQkvLyBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmRlbGV0ZShiYWNrdXBGaWxlKTsKLQkJCQluZXcgRmlsZShiYWNrdXBGaWxlKS5kZWxldGUoKTsKLQkJCQliYWNrdXBGaWxlID0gbnVsbDsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXN0b3JlKCkgewotCQlGaWxlIHNyYyA9IG51bGwsIGRlc3QgPSBudWxsOwotCQlib29sZWFuIG1vdmVkID0gZmFsc2U7Ci0JCWlmIChiYWNrdXBGaWxlICE9IG51bGwpIHsKLQkJCXNyYyA9IG5ldyBGaWxlKGJhY2t1cEZpbGUpOwotCQkJZGVzdCA9IG5ldyBGaWxlKGdldEZpbmFsVVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQl9IGVsc2UgewotCQkJbW92ZWQgPSBvbGRVUkkgIT0gbnVsbCAmJiAhb2xkVVJJLmVxdWFscyhmaW5hbFVSSSk7Ci0JCQlpZiAobW92ZWQpIHsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShnZXRGaW5hbFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQlkZXN0ID0gbmV3IEZpbGUob2xkVVJJLnRvRmlsZVN0cmluZygpKTsKLQkJCQltb3ZlZCA9IGZpbGUuZXhpc3RzKCkgJiYgIWRlc3QuZXhpc3RzKCk7Ci0JCQkJaWYgKG1vdmVkKSB7Ci0JCQkJCXNyYyA9IGZpbGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzcmMgIT0gbnVsbCkgewotCQkJaWYgKGRlc3QuZXhpc3RzKCkpIHsKLQkJCQlGaWxlVXRpbC5tb3ZlRmlsZShkZXN0LG5ldyBGaWxlKGdldFVSSSgpLnRvRmlsZVN0cmluZygpKSk7Ci0JCQl9Ci0JCQlib29sZWFuIHN1Y2Nlc3M7Ci0JCQlpZiAobW92ZWQpIHsKLQkJCQlzdWNjZXNzID0gTXVsdGlGaWxlU2F2ZVV0aWwubW92ZSh0aGlzLCBzcmMsIGRlc3QpOwotCQkJCS8vIGlmKHN1Y2Nlc3MpIHsKLQkJCQkvLyBNdWx0aUZpbGVTYXZlVXRpbC51cGRhdGVVUklNYXBwaW5ncyh0aGlzLCBudWxsKTsKLQkJCQkvLyB9Ci0JCQl9IGVsc2UgewotCQkJCXN1Y2Nlc3MgPSBGaWxlVXRpbC5tb3ZlRmlsZShzcmMsZGVzdCk7Ci0JCQl9Ci0JCQlpZiAoIXN1Y2Nlc3MpIHsKLQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oTkxTLmJpbmQoCi0JCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5yZXN0b3JlUmVzb3VyY2VFcnJvcl9tc2csIHRoaXMpKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlVUkkgZ2V0T2xkVVJJKCkgewotCQlyZXR1cm4gb2xkVVJJOwotCX0KLQotCWJvb2xlYW4gbW92ZVN0YXJ0ZWQoKSB7Ci0JCXJldHVybiBvbGRVUkkgIT0gbnVsbCAmJiAhb2xkVVJJLmVxdWFscyhnZXRGaW5hbFVSSSgpKTsKLQl9Ci0KLQlib29sZWFuIHNhdmVTdGFydGVkKCkgewotCQlyZXR1cm4gY3VycmVudFR4SUQgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb21taXQoKSB7Ci0JCWlmIChmaW5hbFVSSSAhPSBudWxsICYmICFnZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJRmlsZSBmaW5hbEZpbGUgPSBuZXcgRmlsZShmaW5hbFVSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlib29sZWFuIHdhc01vdmUgPSAhb2xkVVJJLmVxdWFscyhmaW5hbFVSSSk7Ci0JCQlpZiAod2FzTW92ZSkgewotCQkJCU9iamVjdCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQodGhpcyk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCQkJaWYgKGZpbmFsRmlsZS5leGlzdHMoKSkgewotCQkJCQkJLy8gbmFtZSBmb3IgZmluYWxGaWxlIGlzIGFscmVhZHkgdGFrZW4KLQkJCQkJCS8vIHRyeSB0byBnZXQgdGhlIG5leHQgYXZhaWxhYmxlIG5hbWUKLQkJCQkJCS8vCi0JCQkJCQlmaW5hbFVSSSA9IFVSSS5jcmVhdGVGaWxlVVJJKE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIKLQkJCQkJCQkJLmdldE5leHRBdmFpbGFibGVGaWxlTmFtZShmaW5hbEZpbGUuZ2V0UGFyZW50KCkKLQkJCQkJCQkJCQkrIEZpbGUuc2VwYXJhdG9yLAotCQkJCQkJCQkJCShDb250ZW50RGVzY3JpcHRpb24pIGUpKTsKLQkJCQkJCWZpbmFsRmlsZSA9IG5ldyBGaWxlKGZpbmFsVVJJLnRvRmlsZVN0cmluZygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gYmFjayB1cCB0aGUgZmlsZQotCQkJCS8vCi0JCQkJU3RyaW5nIGJhY2t1cCA9IGdldEJhY2t1cEZpbGVQYXRoKCk7Ci0JCQkJRmlsZSBiYWtGaWxlID0gbmV3IEZpbGUoYmFja3VwKTsKLQotCQkJCS8vIHRyeWluZyB0byBkZWxldGUgdGhlIG9sZCBiYWNrdXAgZmlsZSBpZiBpdCBleGlzdHMKLQkJCQkvLwotCQkJCWlmIChiYWtGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWJha0ZpbGUuZGVsZXRlKCk7Ci0JCQkJfQotCi0JCQkJaWYgKGZpbmFsRmlsZS5leGlzdHMoKSkgewotCQkJCQkvLyBzb21lIENNIHByb3ZpZGVyIGxpa2UgQ2xlYXJDYXNlIHJlbmFtZWQgdGhlIHZlcnNpb25lZAotCQkJCQkvLyBmaWxlIGl0IGl0cyByZXBvc2l0b3J5IGFzIHNvb24gYXMgdXNlciByZW5hbWVkIHRoZSBmaWxlCi0JCQkJCS8vIGluIHRoZSB3b3Jrc3BhY2UuIFRvIGF2b2lkIHRoaXMsIHVzZSBvbmx5IHJlZ3VsYXIgcmVuYW1lCi0JCQkJCS8vIHJvdXRpbmUgb2YgamF2YS5pby5GaWxlIGluc3RlYWQgb2YgSVJlc291cmNlIHJvdXRpbmUKLQkJCQkJLy8KLQkJCQkJaWYgKEZpbGVVdGlsLm1vdmVGaWxlKGZpbmFsRmlsZSwgYmFrRmlsZSkpIHsKLQkJCQkJCWJhY2t1cEZpbGUgPSBiYWNrdXA7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlbmFtZUVycm9yX21zZywKLQkJCQkJCQkJZmluYWxGaWxlLCBiYWNrdXApOwotCQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKG1zZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHJlbmFtZSB0aGUgcmVzb3VyY2UgZmlsZSB0byB0aGUgb3JpZ2luYWwgbmFtZQotCQkJLy8KLQkJCUZpbGUgY3VycmVudEZpbGUgPSBuZXcgRmlsZSh3YXNNb3ZlID8gb2xkVVJJLnRvRmlsZVN0cmluZygpCi0JCQkJCTogZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCQlpZiAod2FzTW92ZSkgewotCQkJCXN1Y2Nlc3MgPSBNdWx0aUZpbGVTYXZlVXRpbC5tb3ZlKHRoaXMsIGN1cnJlbnRGaWxlLCBmaW5hbEZpbGUpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBzb21lIENNIHByb3ZpZGVyIGxpa2UgQ2xlYXJDYXNlIHJlbmFtZWQgdGhlIHZlcnNpb25lZCBmaWxlIGl0Ci0JCQkJLy8gaXRzIHJlcG9zaXRvcnkgYXMgc29vbiBhcyB1c2VyIHJlbmFtZWQgdGhlIGZpbGUKLQkJCQkvLyBpbiB0aGUgd29ya3NwYWNlLiBUbyBhdm9pZCB0aGlzLCB1c2Ugb25seSByZWd1bGFyIHJlbmFtZQotCQkJCS8vIHJvdXRpbmUgb2YgamF2YS5pby5GaWxlIGluc3RlYWQgb2YgSVJlc291cmNlIHJvdXRpbmUKLQkJCQkvLwotCQkJCXN1Y2Nlc3MgPSBGaWxlVXRpbC5tb3ZlRmlsZShjdXJyZW50RmlsZSwgZmluYWxGaWxlKTsKLQkJCX0KLQkJCWlmICghc3VjY2VzcykgewotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5yZW5hbWVFcnJvcl9tc2csCi0JCQkJCQljdXJyZW50RmlsZSwgZmluYWxGaWxlKTsKLQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24obXNnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHdhc01vdmUpIHsKLQkJCQkJLy8gcmVmcmVzaCByZXNvbHZlIFVSSSBvZiBSZXNvdXJjZURlc2NyaXB0b3Igb2YgdGhpcwotCQkJCQkvLyByZXNvdXJjZQotCQkJCQkvLwotCQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgcmVzRGVzYyA9IE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCQkJLmdldFJlc291cmNlRGVzY3JpcHRvcih0aGlzKTsKLQkJCQkJaWYgKHJlc0Rlc2MgIT0gbnVsbCkgewotCQkJCQkJcmVzRGVzYy5jbGVhclJlc29sdmVkVVJJKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gIkZBVEFMIEVSUk9SOiBubyBSZXNvdXJjZURlc2NyaXB0b3IgZm91bmQgaW4gcGFyZW50IHJlc291cmNlIGZvciAiICsgdGhpczsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhtc2cpOwotCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKG1zZyk7Ci0JCQkJCX0KLQotCQkJCQkvLyByZWZyZXNoIHJlc29sdmUgVVJJcyBpbiBSZXNvdXJjZURlc2NyaXB0b3JzIG9mIHRoZSBjaGlsZAotCQkJCQkvLyByZXNvdXJjZXMgb2YgdGhpcyByZXNvdXJjZQotCQkJCQkvLwotCQkJCQlIYXNoTWFwIG9sZFVSSVRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwID0gbnVsbDsKLQkJCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCQkJLmdldFJlc291cmNlTWFuYWdlcih0aGlzKTsKLQkJCQkJaWYgKHJlc01nciAhPSBudWxsKSB7Ci0JCQkJCQlvbGRVUklUb1Jlc291cmNlRGVzY3JpcHRvck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNNZ3IuZUFsbENvbnRlbnRzKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJlc291cmNlRGVzY3JpcHRvcikgewotCQkJCQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9ICgoUmVzb3VyY2VEZXNjcmlwdG9yKSBvYmopOwotCQkJCQkJCQlvbGRVUklUb1Jlc291cmNlRGVzY3JpcHRvck1hcC5wdXQoZGVzYwotCQkJCQkJCQkJCS5nZXRSZXNvbHZlZFVSSSgpLCBkZXNjKTsKLQkJCQkJCQkJZGVzYy5jbGVhclJlc29sdmVkVVJJKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy8gcmVmcmVzaCBVUkkgb2YgbG9hZGVkIGNoaWxkIHJlc291cmNlcyBvZiB0aGlzIHJlc291cmNlCi0JCQkJCS8vCi0JCQkJCWlmIChvbGRVUklUb1Jlc291cmNlRGVzY3JpcHRvck1hcCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBnbyB0aHJ1IHRoZSBsaXN0IG9mIGxvYWRlZCByZXNvdXJjZXMgaW4gcmVzb3VyY2Ugc2V0Ci0JCQkJCQkvLyB0byB1cGRhdGUgdGhlIFVSSQotCQkJCQkJLy8KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBvbGRVUklUb1Jlc291cmNlRGVzY3JpcHRvck1hcAotCQkJCQkJCQkJLmdldChyZXMuZ2V0VVJJKCkpOwotCQkJCQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQkJCQkJcmVzLnNldFVSSShkZXNjLmdldFJlc29sdmVkVVJJKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNvdXJjZVNhdmVkKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCYWNrdXBGaWxlUGF0aCgpIHsKLQkJU3RyaW5nIGJhY2t1cEZpbGUgPSBuZXcgU3RyaW5nQnVmZmVyKGdldFRlbXBEaXIoKSkKLQkJCQkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKQotCQkJCS5hcHBlbmQoY3VycmVudFR4SUQpCi0JCQkJLmFwcGVuZCgib2xkIikuYXBwZW5kKFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHRoaXMpLmdldEd1aWQoKSkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYmFja3VwRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBsYXN0TG9hZFRpbWVTdGFtcAotCSAqLwotCXB1YmxpYyBsb25nIGdldExhc3RMb2FkVGltZVN0YW1wKCkgewotCQlyZXR1cm4gbGFzdExvYWRUaW1lU3RhbXA7Ci0JfQotCi0Jc3RhdGljIHZvaWQgY2xlYXJEZXRhY2hlZEVPYmplY3RUb0lETWFwKCkgewotCQlERVRBQ0hFRF9FT0JKRUNUX1RPX0lEX01BUC5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXNEZXNjCi0JICovCi0Jdm9pZCBzZXRSZXNvdXJjZURlc2NyaXB0b3IoUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MpIHsKLQkJcmVzb3VyY2VEZXNjcmlwdG9yID0gcmVzRGVzYzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlI2dldExvYWRTdGFtcCgpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TG9hZFN0YW1wKCkgewotCQlyZXR1cm4gZ2V0TGFzdExvYWRUaW1lU3RhbXAoKTsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldFByb3h5VVJJKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBndWlkID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0R3VpZChvYmplY3QpOwotCQlpZiAoZ3VpZCAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZURlc2NyaXB0b3IgcmVzb3VyY2VEZXNjcmlwdG9yID0gdGhpcy5yZXNvdXJjZURlc2NyaXB0b3IgIT0gbnVsbCA/IHRoaXMucmVzb3VyY2VEZXNjcmlwdG9yIDoKLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKHRoaXMpOwotCQkJVVJJIHVyaSA9IHJlc291cmNlRGVzY3JpcHRvciAhPSBudWxsID8gTXVsdGlGaWxlVVJJQ29udmVydGVyCi0JCQkJCS5jcmVhdGVVUkkocmVzb3VyY2VEZXNjcmlwdG9yLmdldElkKCkpIDogZ2V0VVJJKCk7Ci0JCQlyZXR1cm4gdXJpLmFwcGVuZEZyYWdtZW50KGd1aWQpOwotCQl9Ci0JCXJldHVybiBnZXRVUkkoKS5hcHBlbmRGcmFnbWVudChnZXRJRChvYmplY3QpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeElEKFN0cmluZyB0eElEKSB7Ci0JCXNldFRlbXBVUkkodHhJRCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVYTUlTYXZlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSVNhdmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI5ZDhhYjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSVNhdmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FeHRlbmRlZE1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVNhdmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuRVBGVmVyc2lvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5WZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogWE1MU2F2ZSBpbXBsZW1lbnRhdGlvbiBmb3IgbGlicmFyeSBYTUkgcGVyc2lzdGVuY2UKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE11bHRpRmlsZVhNSVNhdmVJbXBsIGV4dGVuZHMgWE1JU2F2ZUltcGwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9TRVBBUkFURUxZX0NMQVNTX1NFVCA9ICJTQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VUIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2F2ZSBvcHRpb25zIHRvIGZvcmNlIHNhdmluZyBhbGwgcmVzb3VyY2VzIGluIHRoZSByZXNvdXJjZSBzZXQsIHdoZXRoZXIKLQkgKiB0aGV5IGhhdmUgYmVlbiBtb2RpZmllZCBvciB1bmNoYW5nZWQuIEl0cyB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nICJ0cnVlIgotCSAqIG9yICJmYWxzZSIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0FMTCA9ICJTQVZFX0FMTCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNhdmUgb3B0aW9uIHRvIHNhdmUgb2JqZWN0cyBvZiB0aGUgc2F2ZSB0eXBlIHRvZ2V0aGVyIGluIHRoZSBzYW1lIGZpbGUgaWYKLQkgKiBNdWx0aUZpbGVVdGlsLmNyZWF0ZUZpbGVVUkkoKSByZXR1cm5zIHRoZSBzYW1lIFVSSSBmb3IgdGhlbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX1RPR0VUSEVSX0NMQVNTX1NFVCA9ICJTQVZFX1RPR0VUSEVSX0NMQVNTX1NFVCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tfVVBfQkVGT1JFX1NBVkUgPSAiQkFDS19VUF9CRUZPUkVfU0FWRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTID0gIkRJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBNT0RJRklFRF9SRVNPVVJDRV9TRVQgPSAiTU9ESUZJRURfUkVTT1VSQ0VfU0VUIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2F2ZSBvcHRpb24gdG8gc3BlY2lmeSBhIFR4UmVjb3JkIHRvIGxvZyB0aGUgdHJhbnNhY3Rpb25hbCBkYXRhIGZvcgotCSAqIGZhaWwtc2FmZSBwZXJzaXN0ZW5jZQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlcgotCSAqIEBzZWUgVHhSZWNvcmQKLQkgKi8KLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRYX1JFQ09SRCA9ICJUWF9SRUNPUkQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSV9GSUxFID0gIk1VTFRJX0ZJTEUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTYXZlIG9wdGlvbiB0byByZWZyZXNoIHRoZSB3b3Jrc3BhY2Ugd2hlbiBuZXcgcmVzb3VyY2UgaXMgY3JlYXRlZCBhbmQKLQkgKiBzYXZlZC4gSXRzIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgInRydWUiIG9yICJmYWxzZSIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZSRVNIX05FV19SRVNPVVJDRSA9ICJSRUZSRVNIX05FV19SRVNPVVJDRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNhdmUgb3B0aW9uIHRvIGNoZWNrIHRoZSByZXNvdXJjZSBmb3IgbW9kaWZpYWJsZSBiZWZvcmUgc2F2aW5nIGl0LiBJdHMKLQkgKiB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nICJ0cnVlIiBvciAiZmFsc2UiCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tfTU9ESUZZID0gIkNIRUNLX01PRElGWSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHByaXZhdGUgUmVzb3VyY2UgcmVzb3VyY2U7Ci0JcHJpdmF0ZSBTZXQgc2F2ZVNlcGFyYXRlbHlDbGFzc1NldDsKLQotCXByaXZhdGUgTWFwIG9wdGlvbnM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaGVscGVyCi0JICovCi0JcHVibGljIE11bHRpRmlsZVhNSVNhdmVJbXBsKFhNTEhlbHBlciBoZWxwZXIpIHsKLQkJc3VwZXIoaGVscGVyKTsKLQl9Ci0KLQlYTUxIZWxwZXIgZ2V0WE1MSGVscGVyKCkgewotCQlyZXR1cm4gaGVscGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFNhdmVJbXBsI2luaXQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZSwKLQkgKiAgICAgIGphdmEudXRpbC5NYXApCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdChYTUxSZXNvdXJjZSByZXNvdXJjZSwgTWFwIG9wdHMpIHsKLQkJc3VwZXIuaW5pdChyZXNvdXJjZSwgb3B0cyk7Ci0KLQkJaWYgKGVzY2FwZSAhPSBudWxsKSB7Ci0JCQkvLyB1c2UgTXlFc2NhcGUgdG8gaWdub3JlIHdoaXRlc3BhY2VzCi0JCQkvLwotCQkJZXNjYXBlID0gbmV3IE15RXNjYXBlKCk7Ci0JCX0KLQotCQlzYXZlU2VwYXJhdGVseUNsYXNzU2V0ID0gKFNldCkgb3B0cy5nZXQoU0FWRV9TRVBBUkFURUxZX0NMQVNTX1NFVCk7Ci0JCW9wdGlvbnMgPSBvcHRzOwotCi0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJaWYgKHJlc291cmNlU2V0ID09IG51bGwpIHsKLQkJCXJlc291cmNlU2V0ID0gbmV3IE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCgpOwotCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc291cmNlKTsKLQkJfQotCX0KLQotCWJvb2xlYW4gY2FuU2F2ZVNlcGFyYXRlbHkoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuaGFzT3duUmVzb3VyY2Uob2JqLCBzYXZlU2VwYXJhdGVseUNsYXNzU2V0KTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRVbWFIUkVGKFJlc291cmNlIHJlc291cmNlLCBJbnRlcm5hbEVPYmplY3QgbykgewotCQlpZiAoby5lSXNQcm94eSgpCi0JCQkJJiYgby5lUHJveHlVUkkoKS5zY2hlbWUoKS5lcXVhbHMoTXVsdGlGaWxlVVJJQ29udmVydGVyLlNDSEVNRSkpIHsKLQkJCXJldHVybiBvLmVQcm94eVVSSSgpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJU3RyaW5nIGhyZWYgPSBudWxsOwotCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCWhyZWYgPSBoZWxwZXIuZ2V0SFJFRihvKTsKLQkJfQotCQlpZiAoaHJlZiA9PSBudWxsKSB7Ci0JCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIkNvdWxkIG5vdCBmaW5kIHJlc291cmNlIGRlc2NyaXB0b3IgZm9yIHJlc291cmNlICIgKyByZXNvdXJjZSArICJcbiAgb2JqZWN0OiAiICsgbyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIE11bHRpRmlsZVNhdmVVdGlsLmdldEhSRUYocmVzb3VyY2UsIG8pOwotCQl9Ci0JCXJldHVybiBocmVmOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFNhdmVJbXBsI3NhdmVIcmVmKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlSHJlZihFT2JqZWN0IHJlbW90ZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGYpIHsKLQkJaWYgKGYgaW5zdGFuY2VvZiBFUmVmZXJlbmNlICYmICgoRVJlZmVyZW5jZSkgZikuaXNDb250YWlubWVudCgpCi0JCQkJJiYgIXRvRE9NKSB7Ci0JCQkvLyBpZiB0aGlzIEhSRUYgaXMgYSBjb250YWluZWQgZWxlbWVudCwgc2F2ZSBpdHMgSUQgYXR0cmlidXRlIHNvIHRoZQotCQkJLy8gcHJveHkgY2FuIGJlIGNhY2hlZCBpbiB0aGUKLQkJCS8vIEdVSURUb0VsZW1lbnRNYXAgZm9yIHRlbXBvcmFyeSB1c2UgYmVmb3JlIGl0IGNhbiBiZSByZXNvbHZlZC4KLQkJCS8vIFRoaXMgaGVscHMgaW1wcm92ZSBsb2FkaW5nIHRpbWUuCi0JCQkvLwotCQkJU3RyaW5nIGhyZWYgPSBoZWxwZXIuZ2V0SFJFRihyZW1vdGUpOwotCQkJaWYgKGhyZWYgIT0gbnVsbCkgewotCQkJCWlmIChlc2NhcGVVUkkgIT0gbnVsbCkgewotCQkJCQlocmVmID0gZXNjYXBlVVJJLmNvbnZlcnQoaHJlZik7Ci0JCQkJfQotCQkJCVN0cmluZyBuYW1lID0gaGVscGVyLmdldFFOYW1lKGYpOwotCQkJCWRvYy5zdGFydEVsZW1lbnQobmFtZSk7Ci0JCQkJRUNsYXNzIGVDbGFzcyA9IHJlbW90ZS5lQ2xhc3MoKTsKLQkJCQlFQ2xhc3MgZXhwZWN0ZWRUeXBlID0gKEVDbGFzcykgZi5nZXRFVHlwZSgpOwotCQkJCWlmIChzYXZlVHlwZUluZm8gPyB4bWxUeXBlSW5mby5zaG91bGRTYXZlVHlwZShlQ2xhc3MsCi0JCQkJCQlleHBlY3RlZFR5cGUsIGYpIDogZUNsYXNzICE9IGV4cGVjdGVkVHlwZQotCQkJCQkJJiYgZXhwZWN0ZWRUeXBlLmlzQWJzdHJhY3QoKSkgewotCQkJCQlzYXZlVHlwZUF0dHJpYnV0ZShlQ2xhc3MpOwotCQkJCX0KLQkJCQlTdHJpbmcgaWQgPSBoZWxwZXIuZ2V0SUQocmVtb3RlKTsKLQkJCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJCQlkb2MuYWRkQXR0cmlidXRlKGlkQXR0cmlidXRlTmFtZSwgaWQpOwotCQkJCX0KLQkJCQlkb2MuYWRkQXR0cmlidXRlKFhNTFJlc291cmNlLkhSRUYsIGhyZWYpOwotCQkJCWlmIChlT2JqZWN0VG9FeHRlbnNpb25NYXAgIT0gbnVsbCkgewotCQkJCQlwcm9jZXNzQXR0cmlidXRlRXh0ZW5zaW9ucyhyZW1vdGUpOwotCQkJCQlpZiAocHJvY2Vzc0VsZW1lbnRFeHRlbnNpb25zKHJlbW90ZSkpIHsKLQkJCQkJCWRvYy5lbmRFbGVtZW50KCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlkb2MuZW5kRW1wdHlFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlkb2MuZW5kRW1wdHlFbGVtZW50KCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIuc2F2ZUhyZWYocmVtb3RlLCBmKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxTYXZlSW1wbCNzYXZlRmVhdHVyZXMob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2F2ZUZlYXR1cmVzKEVPYmplY3QgbykgewotCQl0cnkgewotCQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgbwotCQkJCQkuZVJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCUVPYmplY3QgY29udGFpbmVyID0gby5lQ29udGFpbmVyKCk7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IGludGVybmFsRU9iamVjdCA9ICgoSW50ZXJuYWxFT2JqZWN0KSBvKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgY2FuU2F2ZVNlcGFyYXRlbHkobykKLQkJCQkJCSYmIGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCWJvb2xlYW4gY29udGFpbnNOZXdGZWF0dXJlID0gKHJlc291cmNlID09IGNvbnRhaW5lcgotCQkJCQkJCS5lUmVzb3VyY2UoKSk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBvOwotCQkJCQlVUkkgdXJpID0gTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJCQkuY3JlYXRlRmlsZVVSSSgoTWV0aG9kRWxlbWVudCkgbyk7Ci0JCQkJCWlmIChjb250YWluc05ld0ZlYXR1cmUpIHsKLQkJCQkJCWlmICghaW50ZXJuYWxFT2JqZWN0LmVJc1Byb3h5KCkpIHsKLQkJCQkJCQlyZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCQkJCQkuc2F2ZShvLCB1cmksIG9wdGlvbnMpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSBSZXNvdXJjZURlc2NyaXB0b3IgZm9yIHRoaXMKLQkJCQkJCS8vIGVsZW1lbnQKLQkJCQkJCS8vIGNyZWF0ZSBhIG5ldyBvbmUgaWYgbmVlZGVkCi0JCQkJCQkvLwotCQkJCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCQkJCS5nZXRSZXNvdXJjZU1hbmFnZXIoY29udGFpbmVyLmVSZXNvdXJjZSgpKTsKLQkJCQkJCWlmIChyZXNNZ3IgIT0gbnVsbAotCQkJCQkJCQkmJiByZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKGUuZ2V0R3VpZCgpKSA9PSBudWxsKSB7Ci0JCQkJCQkJLy8gbWFrZSBzdXJlIHRoYXQgbm8gb3RoZXIgUmVzb3VyY2VNYW5hZ2VyIGhhcyBhCi0JCQkJCQkJLy8gUmVzb3VyY2VEZXNjcmlwdG9yIGZvciB0aGlzIGVsZW1lbnQKLQkJCQkJCQkvLwotCQkJCQkJCU11bHRpRmlsZVVSSUNvbnZlcnRlciB1cmlDb252ZXJ0ZXIgPSAoTXVsdGlGaWxlVVJJQ29udmVydGVyKSByZXNvdXJjZQotCQkJCQkJCQkJLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCk7Ci0JCQkJCQkJaWYgKHVyaUNvbnZlcnRlcgotCQkJCQkJCQkJLmZpbmRSZXNvdXJjZURlc2NyaXB0b3IoZS5nZXRHdWlkKCkpID09IG51bGwpIHsKLQkJCQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwucmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKAotCQkJCQkJCQkJCXJlc01nciwgZSwgcmVzb3VyY2UuZ2V0RmluYWxVUkkoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJU3RyaW5nIGhyZWYgPSBnZXRVbWFIUkVGKHJlc291cmNlLCBpbnRlcm5hbEVPYmplY3QpOwotCQkJCQlkb2MuYWRkQXR0cmlidXRlKFhNTFJlc291cmNlLkhSRUYsIGhyZWYpOwotCQkJCQllbmRTYXZlRmVhdHVyZXMobywgMCwgbnVsbCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlpZiAobyBpbnN0YW5jZW9mIFJlc291cmNlTWFuYWdlcgotCQkJCQkJJiYgaGVscGVyLmdldFJlc291cmNlKCkgIT0gcmVzb3VyY2UpIHsKLQkJCQkJU3RyaW5nIGhyZWYgPSBnZXRVbWFIUkVGKHJlc291cmNlLCBpbnRlcm5hbEVPYmplY3QpOwotCQkJCQlkb2MuYWRkQXR0cmlidXRlKFhNTFJlc291cmNlLkhSRUYsIGhyZWYpOwotCQkJCQllbmRTYXZlRmVhdHVyZXMobywgMCwgbnVsbCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdXBlci5zYXZlRmVhdHVyZXMobyk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJFUlJPUiBzYXZpbmcgZmVhdHVyZTogIiArIG8pOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLmVyci5wcmludGxuKCIgIEZlYXR1cmUgcmVzb3VyY2U6ICIgKyBvLmVSZXNvdXJjZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JU2F2ZUltcGwjYWRkTmFtZXNwYWNlRGVjbGFyYXRpb25zKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2VEZWNsYXJhdGlvbnMoKSB7Ci0JCXN1cGVyLmFkZE5hbWVzcGFjZURlY2xhcmF0aW9ucygpOwotCQkKLQkJaWYgKCF0b0RPTSkgewotCQkJLy8gc2F2ZSB0b29sIHZlcnNpb24gaW5mbwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IFZlcnNpb25VdGlsLmdldEFsbFRvb2xJRHMoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyB0b29sSUQgPSAoU3RyaW5nKWl0ZXIubmV4dCgpOwotCQkJCUVQRlZlcnNpb25zIGVwZlZlcnNpb25zID0gVmVyc2lvblV0aWwuZ2V0VmVyc2lvbnModG9vbElEKTsKLQkJCQlTdHJpbmcgbnNVcmkgPSBlcGZWZXJzaW9ucy5nZXROc1VSSSgpOwotCQkJCWRvYy5hZGRBdHRyaWJ1dGUoRXh0ZW5kZWRNZXRhRGF0YS5YTUxOU19QUkVGSVggKyAiOiIgKyB0b29sSUQsIG5zVXJpKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyB0b29sVmVyc2lvbiA9IGVwZlZlcnNpb25zLmdldE1pblRvb2xWZXJzaW9uRm9yQ3VycmVudExpYnJhcnlWZXJzaW9uKCkuZ2V0VG9vbFZlcnNpb24oKS50b1N0cmluZygpOwotCQkJCWRvYy5hZGRBdHRyaWJ1dGUodG9vbElEICsgIjp2ZXJzaW9uIiwgdG9vbFZlcnNpb24pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YXR5cGVWYWx1ZShPYmplY3QgdmFsdWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmLAotCSAqIGJvb2xlYW4gaXNBdHRyaWJ1dGUpIHsgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkgKiBTdHJpbmcgc3RyID0gKFN0cmluZyl2YWx1ZTsgaWYgKHN0ci5pbmRleE9mKCJcciIpID4gMCkgeyBzdHIgPQotCSAqIHN0ci5yZXBsYWNlQWxsKCJcciIsICIiKTsgcmV0dXJuIHN1cGVyLmdldERhdGF0eXBlVmFsdWUoc3RyLCBmLAotCSAqIGlzQXR0cmlidXRlKTsgfSB9OyByZXR1cm4gc3VwZXIuZ2V0RGF0YXR5cGVWYWx1ZSh2YWx1ZSwgZiwgaXNBdHRyaWJ1dGUpOyB9Ci0JICovCi0KLQkvLyBUT0RPOiBuZWVkcyB0byByZXZpc2l0IHRoaXMgY2xhc3Mgc2luY2UgaXRzIGJhc2UgY2xhc3MgaGFzIGJlZW4gdXBkYXRlZCBhCi0JLy8gbG90IGluIEVNRiAyLjIKLQlwdWJsaWMgc3RhdGljIGNsYXNzIE15RXNjYXBlIGV4dGVuZHMgRXNjYXBlIHsKLQkJcHJvdGVjdGVkIGZpbmFsIGNoYXJbXSBHUkVBVEVSID0geyAnJicsICdnJywgJ3QnLCAnOycgfTsKLQotCQlwcm90ZWN0ZWQgZmluYWwgY2hhcltdIEJMQU5LID0ge307Ci0KLQkJcHVibGljIE15RXNjYXBlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qCi0JCSAqIENvbnZlcnRzOiAmIHRvICZhbXA7IDwgdG8gJmx0OyAiIHRvICZxdW90OyBcdCB0byAmI3g5OyBcbiB0byAmI3hBOyBccgotCQkgKiB0byAmI3hEOwotCQkgKi8KLQkJcHVibGljIFN0cmluZyBjb252ZXJ0KFN0cmluZyBpbnB1dCkgewotCQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCQlpbnQgaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGgoKTsKLQkJCWdyb3coaW5wdXRMZW5ndGgpOwotCQkJaW5wdXQuZ2V0Q2hhcnMoMCwgaW5wdXRMZW5ndGgsIHZhbHVlLCAwKTsKLQkJCWludCBwb3MgPSAwOwotCQkJY2hhciBjaCA9IDA7Ci0JCQl3aGlsZSAoaW5wdXRMZW5ndGgtLSA+IDApIHsKLQkJCQljaCA9IHZhbHVlW3Bvc107Ci0JCQkJc3dpdGNoIChjaCkgewotCQkJCWNhc2UgJyYnOgotCQkJCQlwb3MgPSByZXBsYWNlKHBvcywgQU1QLCBpbnB1dExlbmd0aCk7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlICc8JzoKLQkJCQkJcG9zID0gcmVwbGFjZShwb3MsIExFU1MsIGlucHV0TGVuZ3RoKTsKLQkJCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJz4nOgotCQkJCQlwb3MgPSByZXBsYWNlKHBvcywgR1JFQVRFUiwgaW5wdXRMZW5ndGgpOwotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnIic6Ci0JCQkJCXBvcyA9IHJlcGxhY2UocG9zLCBRVU9URSwgaW5wdXRMZW5ndGgpOwotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJLyoKLQkJCQkJICogaWYgKCFYTUxDaGFyLmlzVmFsaWQoY2gpKSB7IHRocm93IG5ldwotCQkJCQkgKiBSdW50aW1lRXhjZXB0aW9uKCJBbiBpbnZhbGlkIFhNTCBjaGFyYWN0ZXIgKFVuaWNvZGU6IDB4IiArCi0JCQkJCSAqIEludGVnZXIudG9IZXhTdHJpbmcoY2gpKyIpIHdhcyBmb3VuZCBpbiB0aGUgZWxlbWVudAotCQkJCQkgKiBjb250ZW50OiIgK2lucHV0KTsgfQotCQkJCQkgKi8KLQkJCQkJcG9zKys7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjaGFuZ2VkID8gbmV3IFN0cmluZyh2YWx1ZSwgMCwgcG9zKSA6IGlucHV0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIENvbnZlcnRzOiAmIHRvICZhbXA7IDwgdG8gJmx0OyA+IHRvICZndDsgIiB0byAmcXVvdDsgXG4gdG8KLQkJICogcGxhdGZvcm0tZGVwZW5kZW50IGxpbmUgYnJlYWtpbmcgY2hhcmFjdGVyCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUZXh0KFN0cmluZyBpbnB1dCkgewotCQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCQlpbnQgaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGgoKTsKLQkJCWdyb3coaW5wdXRMZW5ndGgpOwotCQkJaW5wdXQuZ2V0Q2hhcnMoMCwgaW5wdXRMZW5ndGgsIHZhbHVlLCAwKTsKLQkJCWludCBwb3MgPSAwOwotCQkJd2hpbGUgKGlucHV0TGVuZ3RoLS0gPiAwKSB7Ci0JCQkJc3dpdGNoICh2YWx1ZVtwb3NdKSB7Ci0JCQkJY2FzZSAnJic6Ci0JCQkJCXBvcyA9IHJlcGxhY2UocG9zLCBBTVAsIGlucHV0TGVuZ3RoKTsKLQkJCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJzwnOgotCQkJCQlwb3MgPSByZXBsYWNlKHBvcywgTEVTUywgaW5wdXRMZW5ndGgpOwotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnPic6Ci0JCQkJCXBvcyA9IHJlcGxhY2UocG9zLCBHUkVBVEVSLCBpbnB1dExlbmd0aCk7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlICciJzoKLQkJCQkJcG9zID0gcmVwbGFjZShwb3MsIFFVT1RFLCBpbnB1dExlbmd0aCk7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlICdccic6Ci0JCQkJCXBvcyA9IHJlcGxhY2UocG9zLCBCTEFOSywgaW5wdXRMZW5ndGgpOwotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXG4nOgotCQkJCQlwb3MgPSByZXBsYWNlKHBvcywgTElORV9GRUVELCBpbnB1dExlbmd0aCk7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlwb3MrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNoYW5nZWQgPyBuZXcgU3RyaW5nKHZhbHVlLCAwLCBwb3MpIDogaW5wdXQ7Ci0JCX0KLQotCQkvKgotCQkgKiBUYWtlbiBmcm9tIFhNTFNhdmVJbXBsJEVzY2FwZS5jb252ZXJ0VGV4dCwgYW5kIGFkZGVkIGNvbnZlcnNpb24gb2YgPgotCQkgKiBUaGlzIGlzIHVzZWQgZm9yIFhMSUZGJ3MgLSBjaGFuZ2UgaXQncyBuYW1lIHNvIGl0IGRvZXNuJ3QgaW1wYWN0IEVNRgotCQkgKiBzYXZpbmcgQ29udmVydDogJiB0byAmYW1wOyA8IHRvICZsdDsgIiB0byAmcXVvdDsgXG4gdG8gbGluZSBzZXBhcmF0b3IKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgbXlDb252ZXJ0VGV4dChTdHJpbmcgaW5wdXQpIHsKLQkJCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQkJaW50IGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoKCk7Ci0JCQlncm93KGlucHV0TGVuZ3RoKTsKLQkJCWlucHV0LmdldENoYXJzKDAsIGlucHV0TGVuZ3RoLCB2YWx1ZSwgMCk7Ci0JCQlpbnQgcG9zID0gMDsKLQkJCXdoaWxlIChpbnB1dExlbmd0aC0tID4gMCkgewotCQkJCXN3aXRjaCAodmFsdWVbcG9zXSkgewotCQkJCWNhc2UgJyYnOgotCQkJCQlwb3MgPSByZXBsYWNlKHBvcywgQU1QLCBpbnB1dExlbmd0aCk7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlICc8JzoKLQkJCQkJcG9zID0gcmVwbGFjZShwb3MsIExFU1MsIGlucHV0TGVuZ3RoKTsKLQkJCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJz4nOgotCQkJCQlwb3MgPSByZXBsYWNlKHBvcywgR1JFQVRFUiwgaW5wdXRMZW5ndGgpOwotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnIic6Ci0JCQkJCXBvcyA9IHJlcGxhY2UocG9zLCBRVU9URSwgaW5wdXRMZW5ndGgpOwotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXG4nOiB7Ci0JCQkJCXBvcyA9IHJlcGxhY2UocG9zLCBMSU5FX0ZFRUQsIGlucHV0TGVuZ3RoKTsKLQkJCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlkZWZhdWx0OgotCQkJCQlwb3MrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gY2hhbmdlZCA/IG5ldyBTdHJpbmcodmFsdWUsIDAsIHBvcykgOiBpbnB1dDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja01vZGlmeVJlcXVpcmVkKE1hcCBvcHRpb25zKSB7Ci0JCU9iamVjdCBvcHQgPSBvcHRpb25zLmdldChNdWx0aUZpbGVYTUlTYXZlSW1wbC5DSEVDS19NT0RJRlkpOwotCQlyZXR1cm4gb3B0ICE9IG51bGwgPyBCb29sZWFuLnZhbHVlT2Yob3B0LnRvU3RyaW5nKCkpLmJvb2xlYW5WYWx1ZSgpCi0JCQkJOiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmMwY2I4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgZm9yIHRoZSBMaWJyYXJ5IFBlcnNpc3RlbmNlIHBsdWctaW4uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUGVyc2lzdGVuY2VQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RvcChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1R4UmVjb3JkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvVHhSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzljMGVhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvVHhSZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBrZWVwIHRoZSB0cmFuc2FjdGlvbiBkYXRhIHRvIHN1cHBvcnQgZmFpbC1zYWZlIHBlcnNpc3RlbmNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLWNsYXNzIFR4UmVjb3JkIHsKLQotCXByaXZhdGUgU3RyaW5nIHR4SUQ7Ci0KLQlwcml2YXRlIExpc3QgcmVzb3VyY2VzVG9Db21taXQ7Ci0KLQlwcm90ZWN0ZWQgTGlzdCB3YXJuaW5nczsKLQotCS8qKgotCSAqIEBwYXJhbSB0eGlkCi0JICogQHBhcmFtIGNvbW1pdAotCSAqLwotCXB1YmxpYyBUeFJlY29yZCgpIHsKLQkJc3VwZXIoKTsKLQkJcmVzb3VyY2VzVG9Db21taXQgPSBuZXcgVW5pcXVlRUxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR4SUQoKSB7Ci0JCWlmICh0eElEID09IG51bGwpIHsKLQkJCXR4SUQgPSBVbWFVdGlsLmdlbmVyYXRlR1VJRCgpOwotCQl9Ci0JCXJldHVybiB0eElEOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlc1RvQ29tbWl0KCkgewotCQlyZXR1cm4gcmVzb3VyY2VzVG9Db21taXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgd2FybmluZ3MKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXYXJuaW5ncygpIHsKLQkJaWYgKHdhcm5pbmdzID09IG51bGwpIHsKLQkJCXdhcm5pbmdzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiB3YXJuaW5nczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJdHhJRCA9IG51bGw7Ci0JCXJlc291cmNlc1RvQ29tbWl0LmNsZWFyKCk7Ci0JCWlmICh3YXJuaW5ncyAhPSBudWxsKSB7Ci0JCQl3YXJuaW5ncy5jbGVhcigpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvVW5ub3JtYWxpemVkVVJJRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvVW5ub3JtYWxpemVkVVJJRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE4OGUyMjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1Vubm9ybWFsaXplZFVSSUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi0vKioKLSAqIEV4Y2VwdGlvbiBmb3IgVVJJIHRoYXQgY2Fubm90IGJlIG5vcm1hbGl6ZWQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24gZXh0ZW5kcyBNdWx0aUZpbGVJT0V4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbXNnCi0JICovCi0JcHVibGljIFVubm9ybWFsaXplZFVSSUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7Ci0JCXN1cGVyKG1zZyk7Ci0JfQotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4MTI5MzE2MjEwNzU1MzM3ODE2TDsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1hNSUxpYnJhcnlQZXJzaXN0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9YTUlMaWJyYXJ5UGVyc2lzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA1ODBhYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1hNSUxpYnJhcnlQZXJzaXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDEwLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1JTGlicmFyeVBlcnNpc3RlciBpbXBsZW1lbnRzIElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyIHsKLQkKLQkvKioKLQkgKiBDb250cnVjdHMgYSBuZXcgWE1JTGlicmFyeVBlcnNpc3RlciBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgWE1JTGlicmFyeVBlcnNpc3RlcigpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjZ2V0RmlsZUV4dGVuc2lvbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbihPYmplY3QgZSkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5nZXRGaWxlRXh0ZW5zaW9uKGUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNnZXRGb2xkZXJSZWxhdGl2ZVBhdGgob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9sZGVyUmVsYXRpdmVQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5nZXRGb2xkZXJSZWxhdGl2ZVBhdGgoZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyI2hhc093bkZvbGRlcihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc093bkZvbGRlcihPYmplY3QgZSkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5oYXNPd25Gb2xkZXIoZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklMaWJyYXJ5UGVyc2lzdGVyI2FkanVzdExvY2F0aW9uKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGp1c3RMb2NhdGlvbihSZXNvdXJjZSByZXNvdXJjZSkgewotCQlNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmFkanVzdExvY2F0aW9uKHJlc291cmNlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUxpYnJhcnlQZXJzaXN0ZXIjZGVsZXRlKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGUoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuZGVsZXRlKGUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JTGlicmFyeVBlcnNpc3RlciNnZXRGYWlsU2FmZVBlcnNpc3RlcigpCi0JICovCi0JcHVibGljIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBnZXRGYWlsU2FmZVBlcnNpc3RlcigpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUxpYnJhcnlQZXJzaXN0ZXIjZ2V0V2FybmluZ3MoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFdhcm5pbmdzKCkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5nZXRXYXJuaW5ncygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JTGlicmFyeVBlcnNpc3RlciNoYXNPd25SZXNvdXJjZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc093blJlc291cmNlKE9iamVjdCBlKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmhhc093blJlc291cmNlKGUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JTGlicmFyeVBlcnNpc3RlciNoYXNPd25SZXNvdXJjZVdpdGhvdXRSZWZlcnJlcihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKE9iamVjdCBlKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmhhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKGUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JTGlicmFyeVBlcnNpc3RlciNzYXZlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5zYXZlKHJlc291cmNlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUxpYnJhcnlQZXJzaXN0ZXIjc2F2ZShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLnNhdmUoZWxlbWVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvWE1JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1hNSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2MyYWY5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvWE1JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMjcsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUlMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5IGltcGxlbWVudHMgSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkjY3JlYXRlTGlicmFyeVJlc291cmNlU2V0KCkKLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlSZXNvdXJjZVNldCBjcmVhdGVMaWJyYXJ5UmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiBuZXcgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkjZ2V0UGVyc2lzdGVuY2VUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBlcnNpc3RlbmNlVHlwZSgpIHsKLQkJcmV0dXJuIFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9JTWlncmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vSU1pZ3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ2NjExYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9JTWlncmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0gKiBNaWdyYXRlcyBvbmUgdmVyc2lvbiBvZiBVTUEgbGlicmFyeSB0byBhbm90aGVyCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1pZ3JhdG9yIHsKLQotCXZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uOwotCXZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBVcGdyYWRlQ2FsbGVySW5mbyBpbmZvKSB0aHJvd3MgRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL01hcHBpbmdVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL01hcHBpbmdVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZkMzNhNDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9NYXBwaW5nVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aXRoIHN0YXRpYyBjb252ZW5pZW5jZSBtZXRob2RzIHRvIHBlcmZvcm0gbGlicmFyeSB1cGdyYWRlIGZyb20KLSAqIG9sZGVyIHZlcnNpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNYXBwaW5nVXRpbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNaWdyYXRvciB7Ci0JCUJ1bmRsZSBidW5kbGU7Ci0KLQkJU3RyaW5nIGNsYXNzTmFtZTsKLQotCQlTdHJpbmcgbGliTnNVUkk7Ci0KLQkJSU1pZ3JhdG9yIGluc3RhbmNlOwotCi0JCS8qKgotCQkgKiBAcGFyYW0gYnVuZGxlCi0JCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkJICogQHBhcmFtIGxpYk5zVVJJCi0JCSAqLwotCQlwdWJsaWMgTWlncmF0b3IoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGxpYk5zVVJJKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJCXRoaXMubGliTnNVUkkgPSBsaWJOc1VSSTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIE1hcCBtaWdyYXRvcnM7Ci0JcHJpdmF0ZSBzdGF0aWMgU2V0IG9sZE5zVXJpcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElNaWdyYXRvciBnZXRNaWdyYXRvcihTdHJpbmcgbGliTnNVUkkpIHsKLQkJaWYgKG1pZ3JhdG9ycyA9PSBudWxsKSB7Ci0JCQltaWdyYXRvcnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJLy8gUHJvY2VzcyB0aGUgIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm1pZ3JhdG9ycyIKLQkJCS8vIGV4dGVuc2lvbiBwb2ludAotCQkJLy8gY29udHJpYnV0b3JzLgotCQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0KLQkJCQkJLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeQotCQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJCQkJIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlIiwgIm1pZ3JhdG9ycyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBuc1VSSSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImxpYk5zVVJJIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwKLQkJCQkJCQkJCSYmIGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCQkmJiBuc1VSSSAhPSBudWxsCi0JCQkJCQkJCQkmJiBuc1VSSS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCW1pZ3JhdG9ycy5wdXQobnNVUkksIG5ldyBNaWdyYXRvcihidW5kbGUsCi0JCQkJCQkJCQkJY2xhc3NOYW1lLCBuc1VSSSkpOwotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlNaWdyYXRvciBtaWdyYXRvciA9IChNaWdyYXRvcikgbWlncmF0b3JzLmdldChsaWJOc1VSSSk7Ci0JCWlmIChtaWdyYXRvciAhPSBudWxsKSB7Ci0JCQlpZiAobWlncmF0b3IuaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCW1pZ3JhdG9yLmluc3RhbmNlID0gKElNaWdyYXRvcikgbWlncmF0b3IuYnVuZGxlLmxvYWRDbGFzcygKLQkJCQkJCQltaWdyYXRvci5jbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbWlncmF0b3IuaW5zdGFuY2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBjb252ZXJzaW9uUmVxdWlyZWQoU3RyaW5nIGxpYlBhdGgpIHsKLQkJU3RyaW5nIGN1cnJlbnROc1VSSSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRVTUFOc1VSSSgpOwotCQlTdHJpbmcgbGliTnNVUkkgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0VU1BTnNVUkkobGliUGF0aCk7Ci0KLQkJaWYgKG9sZE5zVXJpcy5jb250YWlucyhsaWJOc1VSSSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChjdXJyZW50TnNVUkkuZXF1YWxzKGxpYk5zVVJJKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWJvb2xlYW4gcmV0ID0gZ2V0TWlncmF0b3IobGliTnNVUkkpICE9IG51bGw7Ci0JCWlmIChyZXQpIHsKLQkJCW9sZE5zVXJpcy5hZGQobGliTnNVUkkpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1pZ3JhdGUoU3RyaW5nIGxpYlBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVXBncmFkZUNhbGxlckluZm8gaW5mbykKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgbnNVUkkgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0VU1BTnNVUkkobGliUGF0aCk7Ci0JCUlNaWdyYXRvciBtaWdyYXRvciA9IGdldE1pZ3JhdG9yKG5zVVJJKTsKLQkJaWYgKG1pZ3JhdG9yICE9IG51bGwpIHsKLQkJCW1pZ3JhdG9yLm1pZ3JhdGUobGliUGF0aCwgbW9uaXRvciwgaW5mbyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN0cmluZyBsaWJQYXRoID0gYXJnc1swXTsKLQkJU3lzdGVtLm91dAotCQkJCS5wcmludGxuKCJTdGFydCBtaWdyYXRpbmcgbWV0aG9kIGxpYnJhcnkgYXQgJyIgKyBsaWJQYXRoICsgIicuLi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRyeSB7Ci0JCQltaWdyYXRlKGxpYlBhdGgsIG51bGwsIG51bGwpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1pZ3JhdGlvbiBzdWNjZXNzZnVsbC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigpOwotCQkJU3lzdGVtLmVyci5wcmludGxuKCJNaWdyYXRpb24gZmFpbGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vTWlncmF0aW9uUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL01pZ3JhdGlvblJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMmMzOGYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vTWlncmF0aW9uUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuQmFzaWNSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkFueVR5cGU7Ci0KLS8qKgotICogUmVzb3VyY2UgaGFuZGxlciBmb3IgbWlncmF0aW5nIFVNQSBsaWJyYXJ5IGZyb20gb25lIHZlcnNpb24gdG8gYW5vdGhlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1pZ3JhdGlvblJlc291cmNlSGFuZGxlciBleHRlbmRzIEJhc2ljUmVzb3VyY2VIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOwotCi0JcHVibGljIE1pZ3JhdGlvblJlc291cmNlSGFuZGxlcigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5CYXNpY1Jlc291cmNlSGFuZGxlciNwb3N0TG9hZChvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlLAotCSAqICAgICAgamF2YS5pby5JbnB1dFN0cmVhbSwgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwb3N0TG9hZChYTUxSZXNvdXJjZSByZXNvdXJjZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sCi0JCQlNYXAgb3B0aW9ucykgewotCQlpZiAoIXJlc291cmNlLmdldEVPYmplY3RUb0V4dGVuc2lvbk1hcCgpLmlzRW1wdHkoKSkgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIk1pZ3JhdGlvblJlc291cmNlSGFuZGxlci5wb3N0TG9hZCgpOiAiICsgcmVzb3VyY2UuZ2V0VVJJKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tIFN0YXJ0IHVua25vd24gZmVhdHVyZXMgLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRFT2JqZWN0VG9FeHRlbnNpb25NYXAoKS5lbnRyeVNldCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZW50cnkuZ2V0S2V5KCkgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCS8vIGhhbmRsZSBtb3ZlZCBkYXRhCi0JCQkJCS8vCi0JCQkJCWhhbmRsZVVua25vd25EYXRhKChFT2JqZWN0KSBlbnRyeS5nZXRLZXkoKSwgKEFueVR5cGUpZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBFbmQgdW5rbm93biBmZWF0dXJlcyAtLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRleHQoQW55VHlwZSB2YWx1ZSkgewotCQl0cnkgewotCQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlGZWF0dXJlTWFwLkVudHJ5IGVudHJ5ID0gKEZlYXR1cmVNYXAuRW50cnkpIHZhbHVlLmdldE1peGVkKCkuZ2V0KDApOwotCQkJcmV0dXJuIChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgRUF0dHJpYnV0ZSBnZXRFQXR0cmlidXRlKEVDbGFzcyBlQ2xhc3MsIFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlQ2xhc3MuZ2V0RUFsbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlFQXR0cmlidXRlIGF0dHJpYiA9IChFQXR0cmlidXRlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoYXR0cmliLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gYXR0cmliOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWYWx1ZShFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICghZmVhdHVyZS5pc01hbnkoKSkgewotCQkJZU9iamVjdC5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCUNvbGxlY3Rpb24gdmFsdWVzID0gKENvbGxlY3Rpb24pIGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJCQl2YWx1ZXMuYWRkQWxsKChDb2xsZWN0aW9uKSB2YWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXZhbHVlcy5hZGQodmFsdWUpOwotCQkJfQotCQl9Ci0KLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaGFuZGxlVW5rbm93bkZlYXR1cmUoRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSk7Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlVW5rbm93bkZlYXR1cmVzKEVPYmplY3Qgb3duZXIsIEZlYXR1cmVNYXAgZmVhdHVyZU1hcCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlTWFwLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRmVhdHVyZU1hcC5FbnRyeSBlbnRyeSA9IChGZWF0dXJlTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gZW50cnkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCQlpZihoYW5kbGVVbmtub3duRmVhdHVyZShvd25lciwgZiwgZW50cnkuZ2V0VmFsdWUoKSkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGtleQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVVua25vd25EYXRhKEVPYmplY3QgZSwgQW55VHlwZSB1bmtub3duRGF0YSkgewotCQloYW5kbGVVbmtub3duRmVhdHVyZXMoZSwgdW5rbm93bkRhdGEuZ2V0TWl4ZWQoKSk7Ci0JCWhhbmRsZVVua25vd25GZWF0dXJlcyhlLCB1bmtub3duRGF0YS5nZXRBbnlBdHRyaWJ1dGUoKSk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRTaW5nbGVWYWx1ZShGZWF0dXJlTWFwIGZlYXR1cmVNYXAsCi0JCQlTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZU1hcC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUZlYXR1cmVNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVudHJ5LmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLmdldE5hbWUoKS5lcXVhbHMoZmVhdHVyZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBDb2xsZWN0aW9uIGdldFZhbHVlKEZlYXR1cmVNYXAgZmVhdHVyZU1hcCwKLQkJCVN0cmluZyBmZWF0dXJlTmFtZSkgewotCQlDb2xsZWN0aW9uIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZlYXR1cmVNYXAuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlGZWF0dXJlTWFwLkVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbnRyeS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKS5nZXROYW1lKCkuZXF1YWxzKGZlYXR1cmVOYW1lKSkgewotCQkJCWxpc3QuYWRkKGVudHJ5LmdldFZhbHVlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9NaWdyYXRpb25VdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL01pZ3JhdGlvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWUxNTI4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL01pZ3JhdGlvblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5odG1sLkhUTUxGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gaGVscCBtaWdyYXRlIGFuZCBmb3JtYXQgdGhlIGh0bWwgY29udGVudC4KLSAqIAotICogQGF1dGhvciBKSW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1pZ3JhdGlvblV0aWwgewotCi0JcHVibGljIHN0YXRpYyBTZXQ8U3RyaW5nPiBjZGF0YUZlYXR1cmVOYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQlzdGF0aWMgewotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImFsdGVybmF0aXZlcyIpOyAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgibWFpbkRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJob3dUb1N0YWZmIik7IC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJrZXlDb25zaWRlcmF0aW9ucyIpOyAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgicHVycG9zZSIpOyAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgic2NvcGUiKTsgLy8gUHJvY2Vzc0Rlc2NyaXB0aW9uIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJ1c2FnZU5vdGVzIik7IC8vIFByb2Nlc3NEZXNjcmlwdGlvbiAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0h0bWxGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmKSB7Ci0JCXJldHVybiBjZGF0YUZlYXR1cmVOYW1lcy5jb250YWlucyhmLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGZvcm1hdFZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCS8vIGdldCBhbGwgc3RyaW5nIHR5cGUgYXR0cmlidXRlcwotCi0JCQlIVE1MRm9ybWF0dGVyIGZvcm1hdGVyID0gbmV3IEhUTUxGb3JtYXR0ZXIoKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwcm9wZXJ0aWVzCi0JCQkJCQkuZ2V0KGkpOwotCi0JCQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHZhbHVlOwotCQkJCWlmIChpc0h0bWxGZWF0dXJlKGZlYXR1cmUpICYmIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQluZXdWYWx1ZSA9IGZvcm1hdGVyLmZvcm1hdEhUTUwoKFN0cmluZykgdmFsdWUpOwotCQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIE5vdCBjaGFuZ2UgdmFsdWUgaWYgaXQgY2Fubm90IGJlIGZvcm1hdHRlZAotCQkJCQkJLy8gU2hvdWxkIGFsc28gd3JpdGUgdG8gbG9nIGZvciB1c2VyIGF0dGVudGlvbgotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJZWxlbWVudC5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vVU1BMlVNQVJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9VTUEyVU1BUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0MjVkMWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9VTUEyVU1BUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQW55VHlwZTsKLQotLyoqCi0gKiBSZXNvdXJjZSBoYW5kbGVyIGZvciBtaWdyYXRpbmcgVU1BIGxpYnJhcnkgZnJvbSBvbmUgdmVyc2lvbiB0byBhbm90aGVyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVU1BMlVNQVJlc291cmNlSGFuZGxlciBleHRlbmRzIE1pZ3JhdGlvblJlc291cmNlSGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsKLQotCXByaXZhdGUgTGlzdCBtb3ZlSW5mb3M7Ci0KLQlwdWJsaWMgVU1BMlVNQVJlc291cmNlSGFuZGxlcigpIHsKLQkJbW92ZUluZm9zID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgRUF0dHJpYnV0ZSBnZXRFQXR0cmlidXRlKEVDbGFzcyBlQ2xhc3MsIFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlQ2xhc3MuZ2V0RUFsbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlFQXR0cmlidXRlIGF0dHJpYiA9IChFQXR0cmlidXRlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoYXR0cmliLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gYXR0cmliOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgcnVsZXMgdG8gbW92ZSBkYXRhCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGZlYXR1cmVOYW1lCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0TmV3RmVhdHVyZShFT2JqZWN0IG93bmVyLCBTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSBydWxlcyB0byBtb3ZlIGRhdGEKLQkgKiAKLQkgKiBAcGFyYW0gb2xkT3duZXIKLQkgKiBAcGFyYW0gZmVhdHVyZU5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0TmV3T3duZXIoRU9iamVjdCBvbGRPd25lciwgU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0TmV3VmFsdWUoRU9iamVjdCBvbGRPd25lciwgU3RyaW5nIGZlYXR1cmVOYW1lLAotCQkJQW55VHlwZSB2YWx1ZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlRGF0YSgpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW92ZUluZm9zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTW92ZUluZm8gaW5mbyA9IChNb3ZlSW5mbykgaXRlci5uZXh0KCk7Ci0JCQlFT2JqZWN0IG5ld093bmVyID0gZ2V0TmV3T3duZXIoaW5mby5vbGRPd25lciwgaW5mby5vbGRGZWF0dXJlTmFtZSk7Ci0JCQlpZiAobmV3T3duZXIgIT0gbnVsbCkgewotCQkJCXNldFZhbHVlKG5ld093bmVyLCBpbmZvLm5ld0ZlYXR1cmUsIGluZm8udmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFZhbHVlKEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUpIHsKLQkJaWYgKCFmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQllT2JqZWN0LmVTZXQoZmVhdHVyZSwgdmFsdWUpOwotCQl9IGVsc2UgewotCQkJQ29sbGVjdGlvbiB2YWx1ZXMgPSAoQ29sbGVjdGlvbikgZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotCQkJCXZhbHVlcy5hZGRBbGwoKENvbGxlY3Rpb24pIHZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmFsdWVzLmFkZCh2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1vdmVJbmZvIHsKLQkJRU9iamVjdCBvbGRPd25lcjsKLQotCQlTdHJpbmcgb2xkRmVhdHVyZU5hbWU7Ci0KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIG5ld0ZlYXR1cmU7Ci0KLQkJT2JqZWN0IHZhbHVlOwotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoKQotCQkJCQkuYXBwZW5kKGdldENsYXNzKCkuZ2V0TmFtZSgpKQotCQkJCQkuYXBwZW5kKCIoXG4iKSAvLyROT04tTkxTLTEkCi0JCQkJCS5hcHBlbmQoIiAgb2xkRmVhdHVyZU5hbWU6ICIpLmFwcGVuZChvbGRGZWF0dXJlTmFtZSkuYXBwZW5kKCdcbicpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLmFwcGVuZCgiICBuZXdGZWF0dXJlOiAiKS5hcHBlbmQobmV3RmVhdHVyZSkuYXBwZW5kKCdcbicpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLmFwcGVuZCgiICB2YWx1ZTogIikuYXBwZW5kKHZhbHVlKS5hcHBlbmQoJ1xuJykgLy8kTk9OLU5MUy0xJAotCQkJCQkuYXBwZW5kKCIpIikudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0U2luZ2xlVmFsdWUoRmVhdHVyZU1hcCBmZWF0dXJlTWFwLAotCQkJU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZlYXR1cmVNYXAuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlGZWF0dXJlTWFwLkVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbnRyeS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKS5nZXROYW1lKCkuZXF1YWxzKGZlYXR1cmVOYW1lKSkgewotCQkJCXJldHVybiBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgQ29sbGVjdGlvbiBnZXRWYWx1ZShGZWF0dXJlTWFwIGZlYXR1cmVNYXAsCi0JCQlTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLQkJQ29sbGVjdGlvbiBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlTWFwLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRmVhdHVyZU1hcC5FbnRyeSBlbnRyeSA9IChFbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZW50cnkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscyhmZWF0dXJlTmFtZSkpIHsKLQkJCQlsaXN0LmFkZChlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhck1vdmVJbmZvcygpIHsKLQkJbW92ZUluZm9zLmNsZWFyKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uTWlncmF0aW9uUmVzb3VyY2VIYW5kbGVyI2hhbmRsZVVua25vd25GZWF0dXJlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZVVua25vd25GZWF0dXJlKEVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJU3RyaW5nIGZlYXR1cmVOYW1lID0gZmVhdHVyZS5nZXROYW1lKCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBuZXdGZWF0dXJlID0gZ2V0TmV3RmVhdHVyZShvd25lciwgZmVhdHVyZU5hbWUpOwotCQlpZiAobmV3RmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlNb3ZlSW5mbyBtb3ZlSW5mbyA9IG5ldyBNb3ZlSW5mbygpOwotCQkJbW92ZUluZm8ub2xkT3duZXIgPSBvd25lcjsKLQkJCW1vdmVJbmZvLm9sZEZlYXR1cmVOYW1lID0gZmVhdHVyZU5hbWU7Ci0JCQltb3ZlSW5mby5uZXdGZWF0dXJlID0gbmV3RmVhdHVyZTsKLQkJCW1vdmVJbmZvLnZhbHVlID0gdmFsdWUgaW5zdGFuY2VvZiBBbnlUeXBlID8gZ2V0TmV3VmFsdWUoCi0JCQkJCW93bmVyLCBmZWF0dXJlTmFtZSwgKEFueVR5cGUpIHZhbHVlKQotCQkJCQk6IHZhbHVlOwotCQkJbW92ZUluZm9zLmFkZChtb3ZlSW5mbyk7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obW92ZUluZm8pOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9VcGdyYWRlQ2FsbGVySW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9VcGdyYWRlQ2FsbGVySW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0M2NlNjc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vVXBncmFkZUNhbGxlckluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBDbGFzcyByZXByZXNlbnRpbmcgY2FsbGVyIGluZm8gZm9yIGNhbGxpbmcgbGlicmFyeSB1cGdyYWRlIGNvZGUuCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGdyYWRlQ2FsbGVySW5mbyB7Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgdXBncmFkZUxpYnJhcnkgPSAwOwotCXB1YmxpYyBzdGF0aWMgaW50IHVwZ3JhZGVJbXBvcnRQbHVnaW4gPSAxOwotCXB1YmxpYyBzdGF0aWMgaW50IHVwZ3JhZGVJbXBvcnRDb25maWcgPSAyOwotCQotCXByaXZhdGUgaW50IGNhbGxlclR5cGUgPSB1cGdyYWRlTGlicmFyeTsKLQlwcml2YXRlIFN0cmluZyBlcnJvck1zZzsKLQlGaWxlIGxpYkZpbGU7Ci0JRmlsZSBjb3BpZWRMaWJGaWxlOwotCQotCXB1YmxpYyBVcGdyYWRlQ2FsbGVySW5mbyhpbnQgY2FsbGVyVHlwZSwgRmlsZSBsaWJGaWxlKSB7Ci0JCXRoaXMuY2FsbGVyVHlwZSA9IGNhbGxlclR5cGU7Ci0JCXRoaXMubGliRmlsZSA9IGxpYkZpbGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VwZ3JhZGVMaWJyYXJ5KFVwZ3JhZGVDYWxsZXJJbmZvIGluZm8pIHsKLQkJcmV0dXJuIGluZm8gPT0gbnVsbCB8fCBpbmZvLmlzVXBncmFkZUxpYnJhcnkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNVcGdyYWRlTGlicmFyeSgpIHsKLQkJcmV0dXJuIGNhbGxlclR5cGUgPT0gdXBncmFkZUxpYnJhcnk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldElzRXhwb3J0ZWRQbHVnaW5MaWIoKSB7Ci0JCXJldHVybiBjYWxsZXJUeXBlID09IHVwZ3JhZGVJbXBvcnRQbHVnaW47Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEVycm9yTXNnKFN0cmluZyBtc2cpIHsKLQkJZXJyb3JNc2cgPSBtc2c7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNc2coKSB7Ci0JCXJldHVybiBlcnJvck1zZzsKLQl9CQkJCi0JCi0JcHVibGljIHZvaWQgc2V0Q29waWVkTGliRmlsZShGaWxlIGZpbGUpIHsKLQkJY29waWVkTGliRmlsZSA9IGZpbGU7Ci0JfQotCQotCXB1YmxpYyBGaWxlIGdldENvcGllZExpYkZpbGUoKSB7Ci0JCXJldHVybiBjb3BpZWRMaWJGaWxlOwotCX0KLQkKLQlwcm90ZWN0ZWQgRmlsZSBnZXRMaWJGaWxlKCkgewotCQlyZXR1cm4gbGliRmlsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb3B5TGlicmFyeSgpIHsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29waWVkTGlicmFyeSgpIHsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL2ludGVybmFsL01pZ3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL2ludGVybmFsL01pZ3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIzODVhYTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9pbnRlcm5hbC9NaWdyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZVJlZ2lzdHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkV4dGVuZGVkTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5JbGxlZ2FsVmFsdWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5BbnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLmVjb3JlMnhtbC5FY29yZTJYTUxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLmVjb3JlMnhtbC5FY29yZTJYTUxSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJ4bWwuaW1wbC5FY29yZTJYTUxSZWdpc3RyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyeG1sLnV0aWwuRWNvcmUyWE1MRXh0ZW5kZWRNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVVUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVhNSUhlbHBlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVNQTJVTUFSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBNaWdyYXRlcyBvbmUgdmVyc2lvbiBvZiBVTUEgbGlicmFyeSB0byBhbm90aGVyIHVzaW5nIHRoZSBwcm92aWRlZCBFY29yZTJYTUwKLSAqIG1hcHBpbmcgZmlsZXMgYW5kIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIuIFRoZSBFY29yZTJYTUwgbWFwcGluZyBmaWxlcwotICogc3BlY2lmaWVzIHRoZSBuYW1lIGNoYW5nZXMgb2YgY2xhc3Nlcy9hdHRyaWJ1dGVzIHdoaWxlIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIKLSAqIGhhbmRsZXMgdGhlIGRhdGEgbW92aW5nLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWlncmF0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE5TX1VSSXMgPSB7IE1pZ3JhdG9yLk9MRF9VTUFfTlNfVVJJLAotCQkJTWlncmF0b3IuT0xEX1VNQV9OU19VUkksIE1pZ3JhdG9yLlVNQV9OU19VUkkgfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFVSSVtdIEVDT1JFMlhNTF9VUklzID0gewotCQkJVVJJCi0JCQkJCS5jcmVhdGVVUkkoInBsYXRmb3JtOi9wbHVnaW4vY29tLmlibS5ycG0ubGlicmFyeS5wZXJzaXN0ZW5jZS9taWdyYXRpb24vdW1hLmVjb3JlMnhtbCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCVVSSQotCQkJCQkuY3JlYXRlVVJJKCJwbGF0Zm9ybTovcGx1Z2luL2NvbS5pYm0ucnBtLmxpYnJhcnkucGVyc2lzdGVuY2UvbWlncmF0aW9uL3VtYTIuZWNvcmUyeG1sIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJVVJJCi0JCQkJCS5jcmVhdGVVUkkoInBsYXRmb3JtOi9wbHVnaW4vY29tLmlibS5ycG0ubGlicmFyeS5wZXJzaXN0ZW5jZS9taWdyYXRpb24vdW1hMy5lY29yZTJ4bWwiKSAvLyROT04tTkxTLTEkCi0JfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9MRF9VTUFfTlNfVVJJID0gImh0dHA6Ly8vY29tL2libS91bWEuZWNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFfTlNfVVJJID0gImh0dHA6Ly93d3cuaWJtLmNvbS91bWEvMS4wLjIvdW1hLmVjb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBFeHRlbmRlZE1ldGFEYXRhW10gZXh0ZW5kZWRNZXRhRGF0YXM7Ci0KLQlwcml2YXRlIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIwIHJlc291cmNlSGFuZGxlcjsKLQotCXB1YmxpYyBIYXNoTWFwIG9sZFBhdGhUb05ld1VSSU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBhbnlUeXBlRmVhdHVyZVZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEV4dGVuZGVkTWV0YURhdGEgZ2V0RXh0ZW5kZWRNZXRhRGF0YShTdHJpbmcgb2xkTnNVUkksCi0JCQlVUkkgZWNvcmUyWE1MVVJJKSB7Ci0JCUVQYWNrYWdlLlJlZ2lzdHJ5IGVQYWNrYWdlUmVnaXN0cnkgPSBuZXcgRVBhY2thZ2VSZWdpc3RyeUltcGwoCi0JCQkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UpOwotCQllUGFja2FnZVJlZ2lzdHJ5LnB1dChvbGROc1VSSSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCUVjb3JlMlhNTFJlZ2lzdHJ5IGVjb3JlMnhtbFJlZ2lzdHJ5ID0gbmV3IEVjb3JlMlhNTFJlZ2lzdHJ5SW1wbCgKLQkJCQlFY29yZTJYTUxSZWdpc3RyeS5JTlNUQU5DRSk7Ci0KLQkJZWNvcmUyeG1sUmVnaXN0cnkKLQkJCQkucHV0KG9sZE5zVVJJLCBFY29yZVV0aWwuZ2V0T2JqZWN0QnlUeXBlKG5ldyBSZXNvdXJjZVNldEltcGwoKQotCQkJCQkJLmdldFJlc291cmNlKGVjb3JlMlhNTFVSSSwgdHJ1ZSkuZ2V0Q29udGVudHMoKSwKLQkJCQkJCUVjb3JlMlhNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFhNTE1hcCgpKSk7Ci0KLQkJcmV0dXJuIG5ldyBFY29yZTJYTUxFeHRlbmRlZE1ldGFEYXRhKGVQYWNrYWdlUmVnaXN0cnksCi0JCQkJZWNvcmUyeG1sUmVnaXN0cnkpIHsKLQkJCXB1YmxpYyBFQ2xhc3NpZmllciBnZXRUeXBlKEVQYWNrYWdlIGVQYWNrYWdlLCBTdHJpbmcgbmFtZSkgewotCQkJCUVDbGFzc2lmaWVyIHR5cGUgPSBzdXBlci5nZXRUeXBlKGVQYWNrYWdlLCBuYW1lKTsKLQotCQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkJLy8gdHJ5IHRvIGdldCB0eXBlIGZyb20gdGhlIHBhY2thZ2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZQotCQkJCQkvLwotCQkJCQlMaXN0IGVDbGFzc2lmaWVycyA9IGVQYWNrYWdlLmdldEVDbGFzc2lmaWVycygpOwotCQkJCQlmb3IgKGludCBpID0gMCwgc2l6ZSA9IGVDbGFzc2lmaWVycy5zaXplKCk7IGkgPCBzaXplOyArK2kpIHsKLQkJCQkJCUVDbGFzc2lmaWVyIGVDbGFzc2lmaWVyID0gKEVDbGFzc2lmaWVyKSBlQ2xhc3NpZmllcnMKLQkJCQkJCQkJLmdldChpKTsKLQkJCQkJCWlmIChuYW1lLmVxdWFscyhlQ2xhc3NpZmllci5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJcmV0dXJuIGVDbGFzc2lmaWVyOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9Ci0KLQkJCQlyZXR1cm4gdHlwZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgTWlncmF0b3IoKSB7Ci0JCXRoaXMoTlNfVVJJcywgRUNPUkUyWE1MX1VSSXMpOwotCX0KLQotCXB1YmxpYyBNaWdyYXRvcihTdHJpbmdbXSBuc1VSSXMsIFVSSVtdIGVjb3JlMlhNTFVSSXMpIHsKLQkJaW50IHNpemUgPSBlY29yZTJYTUxVUklzLmxlbmd0aDsKLQkJZXh0ZW5kZWRNZXRhRGF0YXMgPSBuZXcgRXh0ZW5kZWRNZXRhRGF0YVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlY29yZTJYTUxVUklzLmxlbmd0aDsgaSsrKSB7Ci0JCQlleHRlbmRlZE1ldGFEYXRhc1tpXSA9IGdldEV4dGVuZGVkTWV0YURhdGEobnNVUklzW2ldLAotCQkJCQllY29yZTJYTUxVUklzW2ldKTsKLQkJfQotCQl0aGlzLnJlc291cmNlSGFuZGxlciA9IG5ldyBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyMCgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlU3RhdHVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgU3RyaW5nIG1zZykgewotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yLnNldFRhc2tOYW1lKG1zZyk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEFueVR5cGVGZWF0dXJlVmFsdWUgewotCQlTdHJpbmcgb3duZXJJZDsKLQotCQlFT2JqZWN0IG93bmVyOwotCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JCVN0cmluZyB2YWx1ZUlkOwotCi0JCUFueVR5cGUgdmFsdWU7Ci0KLQkJaW50IGluZGV4OwotCX0KLQotCWNsYXNzIE1pZ3JhdG9yVVJJQ29udmVydGVyIGV4dGVuZHMgTXVsdGlGaWxlVVJJQ29udmVydGVyIHsKLQkJcHJpdmF0ZSBSZXNvdXJjZU1hbmFnZXIgb2xkUmVzTWdyOwotCi0JCS8qKgotCQkgKiBAcGFyYW0gcmVzb3VyY2VTZXQKLQkJICovCi0JCXB1YmxpYyBNaWdyYXRvclVSSUNvbnZlcnRlcihNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQpIHsKLQkJCXN1cGVyKHJlc291cmNlU2V0KTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS51bWEucGVyc2lzdGVuY2UuTXVsdGlGaWxlVVJJQ29udmVydGVyI25vcm1hbGl6ZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCQkgKi8KLQkJcHVibGljIFVSSSBub3JtYWxpemUoVVJJIHVyaSkgewotCQkJVVJJIG5vcm1hbGl6ZWQgPSBzdXBlci5ub3JtYWxpemUodXJpKTsKLQkJCWlmIChub3JtYWxpemVkID09IG51bGwgJiYgU0NIRU1FLmVxdWFsc0lnbm9yZUNhc2UodXJpLnNjaGVtZSgpKSkgewotCQkJCWlmIChvbGRSZXNNZ3IgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgaWQgPSB1cmkuYXV0aG9yaXR5KCk7Ci0JCQkJCW5vcm1hbGl6ZWQgPSBnZXRVUklGcm9tT2xkUmVzb3VyY2VNYW5hZ2VyKGlkKTsKLQkJCQkJaWYgKG5vcm1hbGl6ZWQgIT0gbnVsbCkgewotCQkJCQkJaWYgKHVyaS5oYXNGcmFnbWVudCgpKSB7Ci0JCQkJCQkJbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQuYXBwZW5kRnJhZ21lbnQodXJpCi0JCQkJCQkJCQkuZnJhZ21lbnQoKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCW5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLmFwcGVuZEZyYWdtZW50KGlkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQkJcmV0dXJuIG5vcm1hbGl6ZWQ7Ci0JCX0KLQotCQlwdWJsaWMgVVJJIGdldFVSSUZyb21PbGRSZXNvdXJjZU1hbmFnZXIoU3RyaW5nIGlkKSB7Ci0JCQlpZiAob2xkUmVzTWdyID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IG9sZFJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3IoaWQpOwotCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCVVSSSBub3JtYWxpemVkID0gZGVzYy5nZXRSZXNvbHZlZFVSSSgpOwotCQkJCVVSSSBuZXdVUkkgPSAoVVJJKSBvbGRQYXRoVG9OZXdVUklNYXAuZ2V0KG5vcm1hbGl6ZWQKLQkJCQkJCS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJaWYgKG5ld1VSSSAhPSBudWxsKSB7Ci0JCQkJCW5vcm1hbGl6ZWQgPSBuZXdVUkk7Ci0JCQkJfQotCQkJCXJldHVybiBub3JtYWxpemVkOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0udW1hLnBlcnNpc3RlbmNlLk11bHRpRmlsZVVSSUNvbnZlcnRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZiAob2xkUmVzTWdyICE9IG51bGwpIHsKLQkJCQlvbGRSZXNNZ3IuZGlzcG9zZSgpOwotCQkJCW9sZFJlc01nciA9IG51bGw7Ci0JCQl9Ci0KLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gcmVzTWdyMgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0T2xkUmVzb3VyY2VNYW5hZ2VyKFJlc291cmNlTWFuYWdlciByZXNNZ3IpIHsKLQkJCW9sZFJlc01nciA9IHJlc01ncjsKLQkJfQotCi0JCXB1YmxpYyBSZXNvdXJjZU1hbmFnZXIgZ2V0T2xkUmVzb3VyY2VNYW5hZ2VyKCkgewotCQkJcmV0dXJuIG9sZFJlc01ncjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS51bWEucGVyc2lzdGVuY2UuTXVsdGlGaWxlVVJJQ29udmVydGVyI3NldFVSSU1hcHBpbmcob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSwgamF2YS51dGlsLlNldCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFVSSU1hcHBpbmcoRU9iamVjdCBlLCBVUkkgdXJpLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJCS8vIGNvZGUgdG8gc3VwcG9ydCBtaWdyYXRpb24gZnJvbSBvbGRlciB2ZXJzaW9uCi0JCQkvLwotCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJTWlncmF0b3JVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyID0gKE1pZ3JhdG9yVVJJQ29udmVydGVyKSAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZQotCQkJCQkJLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpLmdldFVSSUNvbnZlcnRlcigpOwotCQkJCVJlc291cmNlTWFuYWdlciBvbGRSZXNNZ3IgPSB1cmlDb252ZXJ0ZXIKLQkJCQkJCS5nZXRPbGRSZXNvdXJjZU1hbmFnZXIoKTsKLQkJCQlpZiAob2xkUmVzTWdyICE9IG51bGwpIHsKLQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSBvbGRSZXNNZ3IKLQkJCQkJCQkuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKCgoTWV0aG9kRWxlbWVudCkgZSkKLQkJCQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCQlvbGRQYXRoVG9OZXdVUklNYXAucHV0KGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKQotCQkJCQkJCQkudG9GaWxlU3RyaW5nKCksIHVyaSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXN1cGVyLnNldFVSSU1hcHBpbmcoZSwgdXJpLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBNaWdyYXRvclJlc291cmNlU2V0IGV4dGVuZHMgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLnVtYS5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGwjZ2V0VVJJQ29udmVydGVyKCkKLQkJICovCi0JCXB1YmxpYyBVUklDb252ZXJ0ZXIgZ2V0VVJJQ29udmVydGVyKCkgewotCQkJaWYgKHVyaUNvbnZlcnRlciA9PSBudWxsKSB7Ci0JCQkJdXJpQ29udmVydGVyID0gbmV3IE1pZ3JhdG9yVVJJQ29udmVydGVyKHRoaXMpOwotCQkJfQotCQkJcmV0dXJuIHVyaUNvbnZlcnRlcjsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBsb2FkT2xkUmVzb3VyY2VNYW5hZ2VyKFN0cmluZyBsaWJQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJLy8gdHJ5aW5nIHRvIGxvYWQgdGhlIHJlc291cmNlIGRlc2NyaXB0b3JzIGZpbGUKLQkJCS8vCi0JCQlTdHJpbmcgbGliRGlyID0gbmV3IEZpbGUobGliUGF0aCkuZ2V0UGFyZW50KCkgKyBGaWxlLnNlcGFyYXRvcjsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGxpYkRpciwgUkVTTUdSX1hNSSk7Ci0JCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gbnVsbDsKLQkJCU11bHRpRmlsZVVSSUNvbnZlcnRlciBtdWx0aUZpbGVVUklDb252ZXJ0ZXIgPSAoTXVsdGlGaWxlVVJJQ29udmVydGVyKSBnZXRVUklDb252ZXJ0ZXIoKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJUmVzb3VyY2UgcmVzTWdyUmVzID0gbmV3IFhNSVJlc291cmNlSW1wbChVUkkuY3JlYXRlRmlsZVVSSShmaWxlCi0JCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpKTsgLy8gc3VwZXIuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZUZpbGVVUkkoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksCi0JCQkJLy8gdHJ1ZSk7Ci0JCQkJcmVzTWdyUmVzLmxvYWQobnVsbCk7Ci0JCQkJaWYgKCFyZXNNZ3JSZXMuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCQkJT2JqZWN0IG9iaiA9IHJlc01nclJlcy5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJlc291cmNlTWFuYWdlcikgewotCQkJCQkJcmVzTWdyID0gKFJlc291cmNlTWFuYWdlcikgb2JqOwotCQkJCQkJLy8gcmVzTWdyLnJlc29sdmUoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN5c3RlbS5lcnIKLQkJCQkJCQkJLnByaW50bG4oIkludmFsaWQgUmVzb3VyY2VNYW5hZ2VyIGZpbGU6ICIgKyBmaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJKChNaWdyYXRvclVSSUNvbnZlcnRlcikgbXVsdGlGaWxlVVJJQ29udmVydGVyKQotCQkJCQkuc2V0T2xkUmVzb3VyY2VNYW5hZ2VyKHJlc01ncik7Ci0JCX0KLQotCQlwdWJsaWMgTWV0aG9kTGlicmFyeSBsb2FkTGlicmFyeShTdHJpbmcgcGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQlsb2FkT2xkUmVzb3VyY2VNYW5hZ2VyKHBhdGgpOwotCi0JCQlyZXR1cm4gbG9hZExpYnJhcnlXaXRob3V0UmVzZXQocGF0aCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0udW1hLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbCNmaW5kRU9iamVjdEluVW5sb2FkZWRSZXNvdXJjZXMoamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGZpbmRFT2JqZWN0SW5VbmxvYWRlZFJlc291cmNlcyhTdHJpbmcgaWQpIHsKLQkJCU9iamVjdCBvYmplY3QgPSBudWxsOwotCQkJaWYgKGdldFJlc291cmNlTWFuYWdlcigpICE9IG51bGwpIHsKLQkJCQlvYmplY3QgPSBzdXBlci5maW5kRU9iamVjdEluVW5sb2FkZWRSZXNvdXJjZXMoaWQpOwotCQkJfQotCQkJaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0JCQkJVVJJIHVyaSA9ICgoTWlncmF0b3JVUklDb252ZXJ0ZXIpIGdldFVSSUNvbnZlcnRlcigpKQotCQkJCQkJLmdldFVSSUZyb21PbGRSZXNvdXJjZU1hbmFnZXIoaWQpOwotCQkJCVJlc291cmNlIHJlc291cmNlID0gc3VwZXIuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJCQlyZXR1cm4gcmVzb3VyY2UuZ2V0RU9iamVjdChpZCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS51bWEucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsI2dldEVPYmplY3Qob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSwKLQkJICogICAgICBib29sZWFuKQotCQkgKi8KLQkJcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdChVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQkJLy8gRU9iamVjdCBlT2JqID0gc3VwZXJHZXRFT2JqZWN0KHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkJCUVPYmplY3QgZU9iaiA9IHN1cGVyLmdldEVPYmplY3QodXJpLCBsb2FkT25EZW1hbmQpOwotCQkJaWYgKGVPYmogPT0gbnVsbAotCQkJCQkmJiBNaWdyYXRvclVSSUNvbnZlcnRlci5TQ0hFTUUuZXF1YWxzSWdub3JlQ2FzZSh1cmkKLQkJCQkJCQkuc2NoZW1lKCkpICYmICF1cmkuaGFzRnJhZ21lbnQoKSkgewotCQkJCWVPYmogPSBzdXBlci5nZXRFT2JqZWN0KHVyaS5hdXRob3JpdHkoKSk7Ci0JCQl9Ci0JCQkvLyBpZih1cmkuYXV0aG9yaXR5KCkuZXF1YWxzKCJ7MTFCNjBBNEItQTBDNy00RDVDLTg5MUEtMzQ2RTg2NTJBNEVCfSIpKQotCQkJLy8gewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJNaWdyYXRvclJlc291cmNlU2V0LmdldEVPYmplY3QoKTogZU9iaiA9ICIgKwotCQkJLy8gZU9iaik7Ci0JCQkvLyB9Ci0JCQlpZiAoZU9iaiA9PSBudWxsIHx8IGVPYmouZUlzUHJveHkoKSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotCQkJCQkJIkNvdWxkIG5vdCBsb2FkIG9iamVjdCB3aXRoIFVSSSAnIiArIHVyaSArICInIChub3JtYWxpemVkIFVSSTogJyIgKyBnZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUodXJpKSArICInKS5cblBsZWFzZSBzZWUgbG9nIGZpbGUgZm9yIG1vcmUgZGV0YWlscy4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCXJldHVybiBlT2JqOwotCQl9Ci0KLQkJcHVibGljIEVPYmplY3Qgc3VwZXJHZXRFT2JqZWN0KFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCQl0cnkgewotCQkJCVVSSSBub3JtYWxpemVkID0gZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSk7Ci0JCQkJaWYgKG5vcm1hbGl6ZWQgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQkJCXJlc291cmNlID0gZ2V0UmVzb3VyY2Uobm9ybWFsaXplZC50cmltRnJhZ21lbnQoKSwgbG9hZE9uRGVtYW5kKTsKLQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZnJhZ21lbnQgPSBub3JtYWxpemVkLmZyYWdtZW50KCk7Ci0JCQkJCWlmIChmcmFnbWVudCA9PSBudWxsIHx8IGZyYWdtZW50Lmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXJldHVybiBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQkJdHJ5IHsKLQkJCQkJCXJldHVybiByZXNvdXJjZS5nZXRFT2JqZWN0KGZyYWdtZW50KTsKLQkJCQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCS8vCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS51bWEucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsI2NyZWF0ZVJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JCSAqLwotCQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQkJUmVzb3VyY2UgcmVzdWx0ID0gbmV3IE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCh1cmkpIHsKLQkJCQlwcm90ZWN0ZWQgWE1MSGVscGVyIGNyZWF0ZVhNTEhlbHBlcigpIHsKLQkJCQkJcmV0dXJuIG5ldyBNdWx0aUZpbGVYTUlIZWxwZXJJbXBsKHRoaXMpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHNldFZhbHVlKEVPYmplY3Qgb2JqZWN0LAotCQkJCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLAotCQkJCQkJCQlpbnQgcG9zaXRpb24pIHsKLQkJCQkJCQlib29sZWFuIG9sZCA9IGxvZ0Vycm9yOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWxvZ0Vycm9yID0gZmFsc2U7Ci0JCQkJCQkJCXN1cGVyCi0JCQkJCQkJCQkJLnNldFZhbHVlKG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJCQkJCQkJCQlwb3NpdGlvbik7Ci0JCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEFueVR5cGUKLQkJCQkJCQkJCQkmJiBvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCQkJCS8vICYmIG9iamVjdCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Ci0JCQkJCQkJCS8vICYmIGZlYXR1cmUgPT0KLQkJCQkJCQkJLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKQotCQkJCQkJCQkpIHsKLQkJCQkJCQkJCUFueVR5cGVGZWF0dXJlVmFsdWUgZnZhbHVlID0gbmV3IEFueVR5cGVGZWF0dXJlVmFsdWUoKTsKLQkJCQkJCQkJCS8vIGZ2YWx1ZS5vd25lciA9IG9iamVjdDsKLQkJCQkJCQkJCWZ2YWx1ZS5vd25lcklkID0gKChNZXRob2RFbGVtZW50KSBvYmplY3QpCi0JCQkJCQkJCQkJCS5nZXRHdWlkKCk7Ci0JCQkJCQkJCQlmdmFsdWUuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCQkJCQkJCQkvLyBmdmFsdWUudmFsdWUgPSAoQW55VHlwZSkgdmFsdWU7Ci0JCQkJCQkJCQlmdmFsdWUudmFsdWVJZCA9IChTdHJpbmcpIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIKLQkJCQkJCQkJCQkJLmdldFNpbmdsZVZhbHVlKCgoQW55VHlwZSkgdmFsdWUpCi0JCQkJCQkJCQkJCQkJLmdldEFueUF0dHJpYnV0ZSgpLCAiZ3VpZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQlmdmFsdWUuaW5kZXggPSBwb3NpdGlvbjsKLQkJCQkJCQkJCWFueVR5cGVGZWF0dXJlVmFsdWVzLmFkZChmdmFsdWUpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJdGhyb3cgZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCWxvZ0Vycm9yID0gb2xkOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIExpc3Qgc2V0TWFueVJlZmVyZW5jZSgKLQkJCQkJCQkJb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXIuTWFueVJlZmVyZW5jZSByZWZlcmVuY2UsCi0JCQkJCQkJCVN0cmluZyBsb2NhdGlvbikgewotCQkJCQkJCUxpc3QgZXhjZXB0aW9ucyA9IHN1cGVyLnNldE1hbnlSZWZlcmVuY2UocmVmZXJlbmNlLAotCQkJCQkJCQkJbG9jYXRpb24pOwotCQkJCQkJCWlmIChleGNlcHRpb25zID09IG51bGwpCi0JCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGV4Y2VwdGlvbnMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJT2JqZWN0IGV4ID0gaXRlci5uZXh0KCk7Ci0JCQkJCQkJCWlmIChleCBpbnN0YW5jZW9mIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbikgewotCQkJCQkJCQkJSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGl2ZSA9IChJbGxlZ2FsVmFsdWVFeGNlcHRpb24pIGV4OwotCQkJCQkJCQkJaWYgKGl2ZS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQW55VHlwZQotCQkJCQkJCQkJCQkmJiBpdmUuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQkJCQkJQW55VHlwZUZlYXR1cmVWYWx1ZSBmdmFsdWUgPSBuZXcgQW55VHlwZUZlYXR1cmVWYWx1ZSgpOwotCQkJCQkJCQkJCWZ2YWx1ZS5vd25lcklkID0gKChNZXRob2RFbGVtZW50KSBpdmUKLQkJCQkJCQkJCQkJCS5nZXRPYmplY3QoKSkuZ2V0R3VpZCgpOwotCQkJCQkJCQkJCWZ2YWx1ZS5mZWF0dXJlID0gaXZlLmdldEZlYXR1cmUoKTsKLQkJCQkJCQkJCQlmdmFsdWUudmFsdWVJZCA9IChTdHJpbmcpIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIKLQkJCQkJCQkJCQkJCS5nZXRTaW5nbGVWYWx1ZSgoKEFueVR5cGUpIGl2ZQotCQkJCQkJCQkJCQkJCQkuZ2V0VmFsdWUoKSkKLQkJCQkJCQkJCQkJCQkJLmdldEFueUF0dHJpYnV0ZSgpLAotCQkJCQkJCQkJCQkJCQkiZ3VpZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJZnZhbHVlLmluZGV4ID0gLTE7Ci0JCQkJCQkJCQkJYW55VHlwZUZlYXR1cmVWYWx1ZXMuYWRkKGZ2YWx1ZSk7Ci0JCQkJCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoZXhjZXB0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBleGNlcHRpb25zOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCX0KLQkJCX07Ci0JCQlyZXN1bHQuc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JCQlnZXRSZXNvdXJjZXMoKS5hZGQocmVzdWx0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2V0IGNsYXNzTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotCQljbGFzc05hbWVzLmFkZCgiVGVjaG5pcXVlIik7IC8vJE5PTi1OTFMtMSQKLQotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSBuZXcgTWlncmF0b3JSZXNvdXJjZVNldCgpOwotCQkvLyBSZXNvdXJjZU1hbmFnZXIgb2xkUmVzTWdyID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbmRlZE1ldGFEYXRhcy5sZW5ndGg7IGkrKykgewotCQkJcmVzb3VyY2VTZXQuZ2V0TG9hZE9wdGlvbnMoKS5wdXQoCi0JCQkJCVhNTFJlc291cmNlLk9QVElPTl9SRUNPUkRfVU5LTk9XTl9GRUFUVVJFLCBCb29sZWFuLlRSVUUpOwotCQkJaWYgKGkgPCAyKSB7Ci0JCQkJcmVzb3VyY2VTZXQuZ2V0TG9hZE9wdGlvbnMoKS5wdXQoCi0JCQkJCQlYTUxSZXNvdXJjZS5PUFRJT05fUkVTT1VSQ0VfSEFORExFUiwgcmVzb3VyY2VIYW5kbGVyKTsKLQkJCX0KLQkJCXJlc291cmNlU2V0LmdldExvYWRPcHRpb25zKCkKLQkJCQkJLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLAotCQkJCQkJCWV4dGVuZGVkTWV0YURhdGFzW2ldKTsKLQotCQkJaWYgKGkgPT0gMCkgewotCQkJCXJlc291cmNlSGFuZGxlci5zYXZlUHJlc2VudGF0aW9uVVJJRm9yKGNsYXNzTmFtZXMpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXNvdXJjZUhhbmRsZXIuc2F2ZVByZXNlbnRhdGlvblVSSUZvcihudWxsKTsKLQkJCX0KLQotCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLmxvYWRMaWJyYXJ5VGFza19uYW1lKTsKLQotCQkJLy8gaWYob2xkUmVzTWdyICE9IG51bGwpIHsKLQkJCS8vICgoTWlncmF0b3JVUklDb252ZXJ0ZXIpcmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCkpLnNldE9sZFJlc291cmNlTWFuYWdlcihvbGRSZXNNZ3IpOwotCQkJLy8gcmVzb3VyY2VTZXQubG9hZExpYnJhcnlXaXRob3V0UmVzZXQobGliUGF0aCk7Ci0JCQkvLyB9Ci0JCQkvLyBlbHNlIHsKLQkJCXJlc291cmNlU2V0LmxvYWRMaWJyYXJ5KGxpYlBhdGgpOwotCQkJLy8gfQotCi0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IHJlc291cmNlU2V0LmdldE1ldGhvZExpYnJhcnkoKTsKLQkJCWlmIChsaWIgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCS8vIGxvYWQgYWxsIHRoZSByZXNvdXJjZXMgaW4gbWVtb3J5Ci0JCQkvLwotCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLmxvYWRSZXNvdXJjZXNUYXNrX25hbWUpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEd1aWRlbGluZSAmJiBpID4gMCkgewotCQkJCQkvLyBoYWNrIHRvIHJlc3RvcmUgdGhlIHJpZ2h0IHByZXNlbnRhdGlvbiBmb3Igb2xkIFRlY2huaXF1ZQotCQkJCQkvLwotCQkJCQlHdWlkZWxpbmUgZ3VpZGVsaW5lID0gKEd1aWRlbGluZSkgZWxlbWVudDsKLQkJCQkJVVJJIHVyaSA9IHJlc291cmNlSGFuZGxlci5nZXRQcmVzZW50YXRpb25VUkkoZ3VpZGVsaW5lCi0JCQkJCQkJLmdldEd1aWQoKSk7Ci0JCQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCQkJQ29udGVudERlc2NyaXB0aW9uIHByZXNlbnRhdGlvbiA9IChDb250ZW50RGVzY3JpcHRpb24pIHJlc291cmNlU2V0Ci0JCQkJCQkJCS5nZXRFT2JqZWN0KHVyaSwgdHJ1ZSk7Ci0JCQkJCQlndWlkZWxpbmUuc2V0UHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5lQ3Jvc3NSZWZlcmVuY2VzKCkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJU3lzdGVtLmVycgotCQkJCQkJCQkucHJpbnRsbigiRXJyb3IgaXRlcmF0ZSB0aHJ1IGNyb3NzIHJlZmVyZW5jZXMgb2YgZWxlbWVudDogIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChpID09IDApIHsKLQkJCQkvLyBvbGRSZXNNZ3IgPQotCQkJCS8vICgoTWlncmF0b3JVUklDb252ZXJ0ZXIpcmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCkpLmdldE9sZFJlc291cmNlTWFuYWdlcigpOwotCi0JCQkJbWlncmF0ZVByb2Nlc3NDb250ZW50RGVzY3JpcHRpb25zKG1vbml0b3IsIGxpYik7Ci0KLQkJCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMubW92ZURhdGFUYXNrX25hbWUpOwotCi0JCQl9Ci0KLQkJCWlmIChpIDwgMikgewotCQkJCXJlc291cmNlSGFuZGxlci5tb3ZlRGF0YSgpOwotCQkJCXJlc291cmNlSGFuZGxlci5jbGVhck1vdmVJbmZvcygpOwotCQkJfQotCi0JCQlpZiAoaSA9PSBleHRlbmRlZE1ldGFEYXRhcy5sZW5ndGggLSAxKSB7Ci0JCQkJbWlncmF0ZVByb2Nlc3Nlcyhtb25pdG9yLCBsaWIpOwotCi0JCQkJcmVzdG9yZVJlZmVyZW5jZXMocmVzb3VyY2VTZXQpOwotCi0JCQl9Ci0KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5zYXZlTGlicmFyeVRhc2tfbmFtZSk7Ci0KLQkJCXJlc291cmNlU2V0LnNhdmUobnVsbCwgdHJ1ZSk7Ci0JCQlyZXNvdXJjZVNldC5yZXNldCgpOwotCi0JCX0KLQotCQkvLyBkZWxldGUgb2xkIHJlc21nci54bWkKLQkJLy8KLQkJdHJ5IHsKLQkJCUZpbGUgcmVzTWdyRmlsZSA9IG5ldyBGaWxlKG5ldyBGaWxlKGxpYlBhdGgpLmdldFBhcmVudEZpbGUoKSwKLQkJCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLlJFU01HUl9YTUkpOwotCQkJaWYgKHJlc01nckZpbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXNNZ3JGaWxlLmRlbGV0ZSgpOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmVSZWZlcmVuY2VzKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbnlUeXBlRmVhdHVyZVZhbHVlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFueVR5cGVGZWF0dXJlVmFsdWUgZWxlbWVudCA9IChBbnlUeXBlRmVhdHVyZVZhbHVlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50Lm93bmVySWQgIT0gbnVsbCAmJiBlbGVtZW50LnZhbHVlSWQgIT0gbnVsbCkgewotCQkJCUVPYmplY3Qgb3duZXIgPSByZXNvdXJjZVNldC5nZXRFT2JqZWN0KGVsZW1lbnQub3duZXJJZCk7Ci0JCQkJT2JqZWN0IHZhbHVlID0gcmVzb3VyY2VTZXQuZ2V0RU9iamVjdChlbGVtZW50LnZhbHVlSWQpOwotCQkJCVVNQTJVTUFSZXNvdXJjZUhhbmRsZXIuc2V0VmFsdWUob3duZXIsIGVsZW1lbnQuZmVhdHVyZSwgdmFsdWUpOwotCQkJfQotCQl9Ci0JCWFueVR5cGVGZWF0dXJlVmFsdWVzLmNsZWFyKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBtaWdyYXRlUHJvY2Vzc2VzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCU1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5maXhQcmVzZW50YXRpb25OYW1lVGFza19uYW1lKTsKLQotCQlTdHJpbmdbXVtdIHByb2NQa2dQYXRocyA9IE11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5QUk9DRVNTX1BBQ0tBR0VfUEFUSFM7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5nZXRNZXRob2RQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlBcnJheUxpc3QgcHJvY1BrZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHByb2NQa2dQYXRocy5sZW5ndGg7IGorKykgewotCQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJCQlwcm9jUGtnUGF0aHNbal0pOwotCQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCQlwcm9jUGtncy5hZGQocGtnKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJvY1BrZ3MuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IxID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcjEKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgY2hpbGRQa2cgPSAoRU9iamVjdCkgaXRlcmF0b3IxLm5leHQoKTsKLQkJCQkJaWYgKGNoaWxkUGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIGNoaWxkUGtnKQotCQkJCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJCQkJaWYgKHByb2MgIT0gbnVsbCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWZpeFByZXNlbnRhdGlvbk5hbWUocHJvYyk7Ci0JCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCXRocm93IGU7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlTdHJpbmcgbXNnID0gTWlncmF0b3IuY2xhc3MuZ2V0TmFtZSgpCi0JCQkJCQkJCQkrICI6IGludmFsaWQgUHJvY2Vzc0NvbXBvbmVudCAod2l0aCBubyBQcm9jZXNzKTogIiArIGNoaWxkUGtnIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSsgIlxuICBQcm9jZXNzQ29tcG9uZW50J3MgcmVzb3VyY2UgVVJJOiAiICsgKGNoaWxkUGtnLmVSZXNvdXJjZSgpICE9IG51bGwgPyBjaGlsZFBrZy5lUmVzb3VyY2UoKS5nZXRVUkkoKSA6IG51bGwpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSsgIlxuICBQYXJlbnQgcGFja2FnZTogIiArIHBrZyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkrICJcbiAgUGFyZW50IHBhY2thZ2UncyByZXNvdXJjZSBVUkk6ICIgKyAocGtnLmVSZXNvdXJjZSgpICE9IG51bGwgPyBwa2cuZVJlc291cmNlKCkuZ2V0VVJJKCkgOiBudWxsKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJOwotCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2cobXNnKTsKLQkJCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgbWlncmF0ZVByb2Nlc3NDb250ZW50RGVzY3JpcHRpb25zKAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBNZXRob2RMaWJyYXJ5IGxpYikgewotCQl1cGRhdGVTdGF0dXMobW9uaXRvciwKLQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5taWdyYXRlQ29udGVudERlc2NyaXB0aW9uc1Rhc2tfbmFtZSk7Ci0KLQkJU3RyaW5nW11bXSBwcm9jUGtnUGF0aHMgPSBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuUFJPQ0VTU19QQUNLQUdFX1BBVEhTOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZ2V0TWV0aG9kUGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJQXJyYXlMaXN0IHByb2NQa2dzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcm9jUGtnUGF0aHMubGVuZ3RoOyBqKyspIHsKLQkJCQlNZXRob2RQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCQkJcHJvY1BrZ1BhdGhzW2pdKTsKLQkJCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCQkJcHJvY1BrZ3MuYWRkKHBrZyk7Ci0JCQkJfQotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHByb2NQa2dzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMSA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IxCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgY2hpbGRQa2cgPSAoT2JqZWN0KSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCQlpZiAoY2hpbGRQa2cgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgY2hpbGRQa2cpCi0JCQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkJCQltaWdyYXRlQ29udGVudERlc2NyaXB0aW9uKHByb2MpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBtaWdyYXRlQ29udGVudERlc2NyaXB0aW9uKEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlpZiAoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oZSkpIHsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gZS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCUVDbGFzcyBlQ2xzID0gQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uRUNsYXNzKGUpOwotCQkJaWYgKGVDbHMgIT0gY29udGVudCkgewotCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBuZXdDb250ZW50ID0gQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotCQkJCQkJLmNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbihlKTsKLQkJCQluZXdDb250ZW50LnNldE1haW5EZXNjcmlwdGlvbihjb250ZW50LmdldE1haW5EZXNjcmlwdGlvbigpKTsKLQkJCQluZXdDb250ZW50LnNldEtleUNvbnNpZGVyYXRpb25zKGNvbnRlbnQuZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKSk7Ci0JCQkJbmV3Q29udGVudC5nZXRTZWN0aW9ucygpLmFkZEFsbChjb250ZW50LmdldFNlY3Rpb25zKCkpOwotCQkJCWUuc2V0UHJlc2VudGF0aW9uKG5ld0NvbnRlbnQpOwotCQkJfQotCQl9Ci0JCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQWN0aXZpdHkpIGUpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCW1pZ3JhdGVDb250ZW50RGVzY3JpcHRpb24oKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZml4UHJlc2VudGF0aW9uTmFtZShCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJaWYgKGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpID09IG51bGwKLQkJCQl8fCBlLmdldFByZXNlbnRhdGlvbk5hbWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZS5zZXRQcmVzZW50YXRpb25OYW1lKGUuZ2V0TmFtZSgpKTsKLQkJfQotCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKEFjdGl2aXR5KSBlKS5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlmaXhQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vaW50ZXJuYWwvVU1BMlVNQVJlc291cmNlSGFuZGxlcjAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vaW50ZXJuYWwvVU1BMlVNQVJlc291cmNlSGFuZGxlcjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjNkMjFjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL2ludGVybmFsL1VNQTJVTUFSZXNvdXJjZUhhbmRsZXIwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5BbnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VTUEyVU1BUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVU1BMlVNQVJlc291cmNlSGFuZGxlcjAgZXh0ZW5kcyBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyIHsKLQotCXByaXZhdGUgU2V0IHByb2NNb3ZlZEZlYXR1cmVOYW1lczsKLQotCXByaXZhdGUgTWFwIGd1aWRUb1ByZXNlbnRhdGlvbk1hcDsKLQotCXByaXZhdGUgU2V0IGNsYXNzTmFtZXNUb1NhdmVQcmVzZW50YXRpb25VUkk7Ci0KLQlwdWJsaWMgVU1BMlVNQVJlc291cmNlSGFuZGxlcjAoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJZ3VpZFRvUHJlc2VudGF0aW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlwcm9jTW92ZWRGZWF0dXJlTmFtZXMgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7Ci0JCQkJInB1cnBvc2UiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJrZXlDb25zaWRlcmF0aW9ucyIgLy8kTk9OLU5MUy0xJAotCQkJCSwgImFsdGVybmF0aXZlcyIgLy8kTk9OLU5MUy0xJAotCQkJCSwgImhvd3RvU3RhZmYiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJ1c2FnZUd1aWRhbmNlIiAvLyROT04tTkxTLTEkCi0JCQkJLCAiZXh0ZXJuYWxJZCIgLy8kTk9OLU5MUy0xJAotCQkJCSwgInNjb3BlIiAvLyROT04tTkxTLTEkCi0JCQkJLCAidXNhZ2VOb3RlcyIgLy8kTk9OLU5MUy0xJAotCQkJCSwgInNjYWxlIiAvLyROT04tTkxTLTEkCi0JCQkJLCAicHJvamVjdENoYXJhY3RlcmlzdGljcyIgLy8kTk9OLU5MUy0xJAotCQkJCSwgInJpc2tMZXZlbCIgLy8kTk9OLU5MUy0xJAotCQkJCSwgImVzdGltYXRpbmdUZWNobmlxdWUiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIiAvLyROT04tTkxTLTEkCi0JCQkJLCAidHlwZU9mQ29udHJhY3QiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJ0ZWNobmlxdWVzIiAvLyROT04tTkxTLTEkCi0JCQkJLCAibWFpbkRlc2NyaXB0aW9uIiAvLyROT04tTkxTLTEkCi0JCX0pKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uVU1BMlVNQVJlc291cmNlSGFuZGxlciNnZXROZXdGZWF0dXJlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE5ld0ZlYXR1cmUoRU9iamVjdCBvd25lciwgU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCWlmICgicHJlc2VudGF0aW9uTmFtZSIuZXF1YWxzKGZlYXR1cmVOYW1lKSAmJiBvd25lciBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCk7Ci0JCX0KLQkJaWYgKHByb2NNb3ZlZEZlYXR1cmVOYW1lcy5jb250YWlucyhmZWF0dXJlTmFtZSkpIHsKLQkJCWlmIChvd25lciBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50KSB7Ci0JCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoKFByb2Nlc3NFbGVtZW50KSBvd25lcikKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCQlFQXR0cmlidXRlIGF0dHJpYiA9IGdldEVBdHRyaWJ1dGUoY29udGVudC5lQ2xhc3MoKSwgZmVhdHVyZU5hbWUpOwotCQkJCWlmIChhdHRyaWIgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gYXR0cmliOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIldvcmtPcmRlciIuZXF1YWxzKGZlYXR1cmVOYW1lKSAmJiBvd25lciBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzUGFja2FnZV9Qcm9jZXNzRWxlbWVudHMoKTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXROZXdGZWF0dXJlKG93bmVyLCBmZWF0dXJlTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVNQTJVTUFSZXNvdXJjZUhhbmRsZXIjZ2V0TmV3T3duZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldE5ld093bmVyKEVPYmplY3Qgb2xkT3duZXIsIFN0cmluZyBmZWF0dXJlTmFtZSkgewotCQlpZiAoInByZXNlbnRhdGlvbk5hbWUiLmVxdWFscyhmZWF0dXJlTmFtZSkgJiYgb2xkT3duZXIgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsgLy8kTk9OLU5MUy0xJAotCQkJRGVzY3JpYmFibGVFbGVtZW50IGRlID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIG9sZE93bmVyLmVDb250YWluZXIoKSk7Ci0JCQlpZiAoZGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIGRlOwotCQl9Ci0JCWlmIChwcm9jTW92ZWRGZWF0dXJlTmFtZXMuY29udGFpbnMoZmVhdHVyZU5hbWUpCi0JCQkJJiYgb2xkT3duZXIgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0VsZW1lbnQpIG9sZE93bmVyKS5nZXRQcmVzZW50YXRpb24oKTsKLQkJfQotCQlpZiAoIldvcmtPcmRlciIuZXF1YWxzKGZlYXR1cmVOYW1lKSAmJiBvbGRPd25lciBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBvbGRPd25lcjsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXROZXdPd25lcihvbGRPd25lciwgZmVhdHVyZU5hbWUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVNQTJVTUFSZXNvdXJjZUhhbmRsZXIjZ2V0TmV3VmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5BbnlUeXBlKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0TmV3VmFsdWUoRU9iamVjdCBvbGRPd25lciwgU3RyaW5nIGZlYXR1cmVOYW1lLCBBbnlUeXBlIHZhbHVlKSB7Ci0JCWlmICgiV29ya09yZGVyIi5lcXVhbHMoZmVhdHVyZU5hbWUpICYmIG9sZE93bmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsgLy8kTk9OLU5MUy0xJAotCQkJV29ya09yZGVyIHdvcmtPcmRlciA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtPcmRlcigpOwotCQkJd29ya09yZGVyLnNldEd1aWQoKFN0cmluZykgZ2V0U2luZ2xlVmFsdWUodmFsdWUuZ2V0QW55QXR0cmlidXRlKCksCi0JCQkJCSJndWlkIikpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgcHJlZEd1aWQgPSAoU3RyaW5nKSBnZXRTaW5nbGVWYWx1ZSh2YWx1ZS5nZXRBbnlBdHRyaWJ1dGUoKSwKLQkJCQkJInByZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHByZWRHdWlkID09IG51bGwpIHsKLQkJCQlJbnRlcm5hbEVPYmplY3Qgb2JqID0gKEludGVybmFsRU9iamVjdCkgZ2V0U2luZ2xlVmFsdWUodmFsdWUKLQkJCQkJCS5nZXRNaXhlZCgpLCAicHJlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJcHJlZEd1aWQgPSBvYmouZVByb3h5VVJJKCkuYXV0aG9yaXR5KCk7Ci0JCQl9Ci0JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBvbGRPd25lcgotCQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHJlc291cmNlU2V0Ci0JCQkJCS5nZXRFT2JqZWN0KHByZWRHdWlkKTsKLQkJCXdvcmtPcmRlci5zZXRQcmVkKHByZWQpOwotCQkJd29ya09yZGVyLnNldExpbmtUeXBlKFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX0ZJTklTSF9MSVRFUkFMKTsKLQkJCXJldHVybiB3b3JrT3JkZXI7Ci0JCX0KLQkJcmV0dXJuIGdldFRleHQodmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVQcmVzZW50YXRpb25VUklGb3IoU2V0IGNsYXNzTmFtZXMpIHsKLQkJY2xhc3NOYW1lc1RvU2F2ZVByZXNlbnRhdGlvblVSSSA9IGNsYXNzTmFtZXM7Ci0JfQotCi0JcHVibGljIFVSSSBnZXRQcmVzZW50YXRpb25VUkkoU3RyaW5nIGd1aWQpIHsKLQkJcmV0dXJuIChVUkkpIGd1aWRUb1ByZXNlbnRhdGlvbk1hcC5nZXQoZ3VpZCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uTWlncmF0aW9uUmVzb3VyY2VIYW5kbGVyI2hhbmRsZVVua25vd25EYXRhKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVVua25vd25EYXRhKEVPYmplY3QgZSwgQW55VHlwZSB1bmtub3duRGF0YSkgewotCQlzdXBlci5oYW5kbGVVbmtub3duRGF0YShlLCB1bmtub3duRGF0YSk7Ci0JCQotCQlpZiAoY2xhc3NOYW1lc1RvU2F2ZVByZXNlbnRhdGlvblVSSSAhPSBudWxsCi0JCQkJJiYgZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRWYWx1ZSh1bmtub3duRGF0YS5nZXRNaXhlZCgpLCAiY29udGVudEVsZW1lbnRzIikuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlBbnlUeXBlIHZhbHVlID0gKEFueVR5cGUpIGl0ZXIubmV4dCgpOwotCQkJCWlmICh2YWx1ZSAhPSBudWxsCi0JCQkJCQkmJiBjbGFzc05hbWVzVG9TYXZlUHJlc2VudGF0aW9uVVJJLmNvbnRhaW5zKHZhbHVlCi0JCQkJCQkJCS5lQ2xhc3MoKS5nZXROYW1lKCkpKSB7Ci0JCQkJCU9iamVjdCBwcmVzZW50YXRpb24gPSBnZXRTaW5nbGVWYWx1ZSh2YWx1ZS5nZXRNaXhlZCgpLAotCQkJCQkJCSJwcmVzZW50YXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAocHJlc2VudGF0aW9uICE9IG51bGwpIHsKLQkJCQkJCU9iamVjdCBndWlkID0gZ2V0U2luZ2xlVmFsdWUodmFsdWUuZ2V0QW55QXR0cmlidXRlKCksCi0JCQkJCQkJCSJndWlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVVSSSB1cmkgPSAoKEludGVybmFsRU9iamVjdCkgcHJlc2VudGF0aW9uKS5lUHJveHlVUkkoKTsKLQkJCQkJCWd1aWRUb1ByZXNlbnRhdGlvbk1hcC5wdXQoZ3VpZCwgdXJpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL2ludGVybmFsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vaW50ZXJuYWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZjNlMDFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vaW50ZXJuYWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbW50YXRpb24gZm9yIHVwZ3JhZGluZyBhIG1ldGhvZCBsaWJyYXJ5IHRvIGEgbmV3ZXIgVU1BIHZlcnNpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWJmMDZkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciB1cGdyYWRpbmcgYSBtZXRob2QgbGlicmFyeSB0byBhIG5ld2VyIFVNQSB2ZXJzaW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNmIwN2Q3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBhbmQgaW1wbGVtZW50YXRpb24gZm9yIHBlcnNpc3RpbmcgYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9JUmVmcmVzaEV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9JUmVmcmVzaEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4NzRlZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvSVJlZnJlc2hFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBJbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHByb3ZpZGVzIGRhdGEgYWJvdXQgYSByZWZyZXNoIGV2ZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZWZyZXNoRXZlbnQgewotCi0JLyoqCi0JICogR2V0cyByZXNvdXJjZXMgdGhhdCBoYWQgYmVlbiByZWZyZXNoZWQuCi0JICogCi0JICogQHJldHVybiByZWZyZXNoZWQgcmVzb3VyY2VzCi0JICovCi0JQ29sbGVjdGlvbiBnZXRSZWZyZXNoZWRSZXNvdXJjZXMoKTsKLQotCS8qKgotCSAqIEdldHMgb2JqZWN0cyB0aGF0IGhhZCBiZWVuIHVubG9hZGVkIGFuZCBiZWNvbWUgcHJveGllcyBhZnRlciByZWZyZXNoCi0JICogCi0JICogQHJldHVybiB1bmxvYWRlZCBvYmplY3RzCi0JICovCi0JQ29sbGVjdGlvbiBnZXRVbmxvYWRlZE9iamVjdHMoKTsKLQotCS8qKgotCSAqIEdldHMgb2JqZWN0cyB0aGF0IGhhZCBiZWVuIHJlZnJlc2hlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHJlZnJlc2hlZCBvYmplY3RzCi0JICovCi0JQ29sbGVjdGlvbiBnZXRSZWZyZXNoZWRPYmplY3RzKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9JUmVmcmVzaEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL0lSZWZyZXNoSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NDliYmI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL0lSZWZyZXNoSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0gKiBJbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpbGwgYmUgbm90aWZ5IGFib3V0IGNoYW5nZXMgaW4gcmVzb3VyY2VzIHNvIGl0IGNhbgotICogcmVhY3QgYWNjb3JkaW5nbHkKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVmcmVzaEhhbmRsZXIgewotCi0Jdm9pZCByZWZyZXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL0lSZWZyZXNoTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL0lSZWZyZXNoTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzQxMzQxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9JUmVmcmVzaExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaDsKLQotLyoqCi0gKiBJbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCBpZiBsaXN0ZW5pbmcgdG8gcmVmcmVzaCBldmVudCwgd2lsbCBnZXQgbm90aWZpZWQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZnJlc2hMaXN0ZW5lciB7Ci0KLQl2b2lkIG5vdGlmeVJlZnJlc2hlZChJUmVmcmVzaEV2ZW50IGV2ZW50KTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvUmVmcmVzaEpvYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvUmVmcmVzaEpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNjRlNGMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL1JlZnJlc2hKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIEJhY2tncm91bmQgam9iIHRoYXQga2VlcHMgbm90aWZ5aW5nIHJlZnJlc2ggaGFuZGxlcnMgYWJvdXQgY2hhbmdlcyBpbgotICogcmVzb3VyY2VzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZyZXNoSm9iIGV4dGVuZHMgV29ya3NwYWNlSm9iIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVUERBVEVfREVMQVkgPSAyMDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfUFJFRklYID0gIkVQRiBBdXRvLXJlZnJlc2g6IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBSZXNvdXJjZVNldCByZXNvdXJjZVNldDsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBhZGRlZFJlc291cmNlcyA9IG5ldyBVbmlxdWVFTGlzdCgpOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgVW5pcXVlRUxpc3QoKTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IFVuaXF1ZUVMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vdmVkUmVzb3VyY2VzID0gbmV3IFVuaXF1ZUVMaXN0KCk7Ci0KLQlwcml2YXRlIFVuaXF1ZUVMaXN0IHNhdmVkUmVzb3VyY2VzID0gbmV3IFVuaXF1ZUVMaXN0KCk7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgSVJlZnJlc2hIYW5kbGVyIHJlZnJlc2hIYW5kbGVyOwotCi0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGFkZGVkV29ya3NwYWNlUmVzb3VyY2VzID0gbmV3IFVuaXF1ZUVMaXN0KCk7Ci0KLQlwcml2YXRlIFJlZnJlc2hKb2IoKSB7Ci0JCXN1cGVyKCJFUEYgQXV0by1SZWZyZXNoIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gYikgewotCQllbmFibGVkID0gYjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBlbmFibGVkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXNvdXJjZVNldAotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlU2V0IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVNldChSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQl0aGlzLnJlc291cmNlU2V0ID0gcmVzb3VyY2VTZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVmcmVzaEhhbmRsZXIoSVJlZnJlc2hIYW5kbGVyIGhhbmRsZXIpIHsKLQkJcmVmcmVzaEhhbmRsZXIgPSBoYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIEdldHMgZXhpc3RpbmcgcmVzb3VyY2VzIHRoYXQgcmVhcHBlYXIgaW4gd29ya3NwYWNlcwotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkZGVkUmVzb3VyY2VzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWRkZWRSZXNvdXJjZXMoKSB7Ci0JCXJlbW92ZVJlc291cmNlcyhhZGRlZFJlc291cmNlcywgc2F2ZWRSZXNvdXJjZXMpOwotCQlyZXR1cm4gYWRkZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBhZGRlZFdvcmtzcGFjZVJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNoYW5nZWRSZXNvdXJjZXMuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hhbmdlZFJlc291cmNlcygpIHsKLQkJcmVtb3ZlUmVzb3VyY2VzKGNoYW5nZWRSZXNvdXJjZXMsIHNhdmVkUmVzb3VyY2VzKTsKLQkJcmVtb3ZlUmVzb3VyY2VzKGNoYW5nZWRSZXNvdXJjZXMsIGxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMpOwotCQlyZXR1cm4gY2hhbmdlZFJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIDxjb2RlPnJlc291cmNlc1RvUmVtb3ZlPC9jb2RlPiBmcm9tIDxjb2RlPnJlc291cmNlczwvY29kZT4gaWYKLQkgKiB0aGUgcmVzb3VyY2VzIGFyZSBzeW5jaHJvbml6ZWQgd2l0aCB0aGVpciBzdG9yYWdlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXNUb1JlbW92ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlUmVzb3VyY2VzKENvbGxlY3Rpb24gcmVzb3VyY2VzLAotCQkJQ29sbGVjdGlvbiByZXNvdXJjZXNUb1JlbW92ZSkgewotCQlzeW5jaHJvbml6ZWQgKHJlc291cmNlc1RvUmVtb3ZlKSB7Ci0JCQlpZiAoIXJlc291cmNlc1RvUmVtb3ZlLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlc1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCByZXNvdXJjZSA9IGl0ZXIubmV4dCgpOwotCQkJCQlib29sZWFuIGNhblJlbW92ZSA9IHRydWU7Ci0JCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJCQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIG1mUmVzb3VyY2UgPSAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UpOwotCQkJCQkJbG9uZyBjdXJyZW50VGltZSA9IG5ldyBGaWxlKG1mUmVzb3VyY2UuZ2V0VVJJKCkKLQkJCQkJCQkJLnRvRmlsZVN0cmluZygpKS5sYXN0TW9kaWZpZWQoKTsKLQkJCQkJCWNhblJlbW92ZSA9IGN1cnJlbnRUaW1lID09IG1mUmVzb3VyY2UKLQkJCQkJCQkJLmdldEZpbGVMYXN0TW9kaWZpZWQoKQotCQkJCQkJCQl8fCBNdWx0aUZpbGVTYXZlVXRpbC5zYW1lKGN1cnJlbnRUaW1lLAotCQkJCQkJCQkJCW1mUmVzb3VyY2UuZ2V0RmlsZUxhc3RNb2RpZmllZCgpKTsKLQkJCQkJfQotCQkJCQlpZiAoY2FuUmVtb3ZlKSB7Ci0JCQkJCQlpZiAocmVzb3VyY2VzLnJlbW92ZShyZXNvdXJjZSkpIHsKLQkJCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSByZW1vdmVkUmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlbW92ZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiByZW1vdmVkUmVzb3VyY2VzOwotCX0KLQkKLQkvKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1vdmVkUmVzb3VyY2VzLiAKLQkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb3ZlZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIG1vdmVkUmVzb3VyY2VzOyAgICAgICAgICAgICAKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotCXB1YmxpYyB2b2lkIHJlc291cmNlU2F2ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJc3luY2hyb25pemVkIChzYXZlZFJlc291cmNlcykgewotCQkJc2F2ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZWxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQljaGFuZ2VkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCXJlbW92ZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJbW92ZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJc2F2ZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcy5jbGVhcigpOwotCQlhZGRlZFJlc291cmNlcy5jbGVhcigpOwotCQlhZGRlZFdvcmtzcGFjZVJlc291cmNlcy5jbGVhcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzY2hlZHVsZVJlZnJlc2goKSB7Ci0JCWlmIChnZXRTdGF0ZSgpID09IEpvYi5OT05FKSB7Ci0JCQlzY2hlZHVsZShVUERBVEVfREVMQVkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBXb3Jrc3BhY2VKb2IjcnVuSW5Xb3Jrc3BhY2UKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBydW5JbldvcmtzcGFjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHJlZnJlc2hIYW5kbGVyID09IG51bGwpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCVRocm93YWJsZSBlcnJvciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKERFQlVHX1BSRUZJWCArICIgc3RhcnRpbmcgcmVmcmVzaCBqb2IiKTsgLy8kTk9OLU5MUy0xJAotCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCXRyeSB7Ci0JCQkJcmVmcmVzaEhhbmRsZXIucmVmcmVzaChtb25pdG9yKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJZXJyb3IgPSBlOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oREVCVUdfUFJFRklYCi0JCQkJCQkJCSsgIiBmaW5pc2hlZCByZWZyZXNoIGpvYiBpbjogIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoZXJyb3IgIT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEZpbGVNYW5hZ2VyLlBMVUdJTl9JRCwgMCwKLQkJCQkJIlJlZnJlc2ggZXJyb3IiLCBlcnJvcik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2Ijc2hvdWxkUnVuKCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2hvdWxkUnVuKCkgewotCQlyZXR1cm4gc2hvdWxkUmVmcmVzaCgpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRSZWZyZXNoKCkgewotCQlyZXR1cm4gIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpIHx8ICFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKQotCQkJCXx8ICFhZGRlZFJlc291cmNlcy5pc0VtcHR5KCkgfHwgIW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKQotCQkJCXx8ICFsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzLmlzRW1wdHkoKQotCQkJCXx8ICFhZGRlZFdvcmtzcGFjZVJlc291cmNlcy5pc0VtcHR5KCk7Ci0JfQotCi0JLyoqCi0JICogU3RhcnRzIHRoZSByZWZyZXNoIGpvYgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVmcmVzaEpvYi5zdGFydCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wcyB0aGUgcmVmcmVzaCBqb2IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVmcmVzaEpvYi5zdG9wKCkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQljYW5jZWwoKTsKLQl9Ci0KLQkvL1RPRE86IG1vdmUgdGhpcyBtZXRob2QgdG8gYSB1dGlsaXR5IGNsYXNzIGFuZCBtYWtlIGl0IHN0YXRpYwotCXB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShTdHJpbmcgcGF0aCkgewotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkocGF0aCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3QocmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkpCi0JCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJaWYgKHVyaS5lcXVhbHMocmVzb3VyY2UuZ2V0VVJJKCkpKSB7Ci0JCQkJcmV0dXJuIHJlc291cmNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vVE9ETzogbW92ZSB0aGlzIG1ldGhvZCB0byBhIHV0aWxpdHkgY2xhc3MgYW5kIG1ha2UgaXQgc3RhdGljCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKElSZXNvdXJjZSB3c1JlcykgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2Uod3NSZXMuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHJlc291cmNlIGNhbiBiZSBhY2NlcHRlZCBhcyBhIG5ldyByZXNvdXJjZSBvZgotCSAqIHJlc291cmNlIHNldCBvZiB0aGlzIHJlZnJlc2ggam9iIHRoYXQgbmVlZHMgdG8gYmUgbG9hZGVkLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gYWNjZXB0KElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHsKLQkJCXJldHVybiAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2VTZXQpCi0JCQkJCS5pc05ld1Jlc291cmNlVG9Mb2FkKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICghaXNFbmFibGVkKCkgfHwgcmVzb3VyY2VTZXQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQlpZiAoZGVsdGEgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCWNsYXNzIFJlc291cmNlRGVsdGFWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJCQlwcml2YXRlIENvbGxlY3Rpb24gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCXByaXZhdGUgQ29sbGVjdGlvbiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQotCQkJCXByaXZhdGUgQ29sbGVjdGlvbiBtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCXByaXZhdGUgQ29sbGVjdGlvbiBhZGRlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCXByaXZhdGUgQXJyYXlMaXN0IGFkZGVkV29ya3NwYWNlUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2U7Ci0JCQkJCUlQYXRoIHBhdGg7Ci0JCQkJCVN0cmluZyBsb2M7Ci0JCQkJCWlmIChkZWx0YS5nZXRGbGFncygpICE9IElSZXNvdXJjZURlbHRhLk1BUktFUlMKLQkJCQkJCQkmJiBkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQ6Ci0JCQkJCQkJLy8gaGFuZGxlIGFkZGVkIHJlc291cmNlCi0JCQkJCQkJLy8KLQkJCQkJCQlwYXRoID0gZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRMb2NhdGlvbigpOwotCQkJCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJCQkJbG9jID0gcGF0aC50b1N0cmluZygpOwotCQkJCQkJCQlyZXNvdXJjZSA9IGdldFJlc291cmNlKGxvYyk7Ci0JCQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpZiAoIXJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCQkJCQkvLyB0aGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQgYnV0IG5vdAotCQkJCQkJCQkJCS8vIGxvYWRlZCBiL2MgdGhlIHdvcmtzcGFjZSByZXNvdXJjZQotCQkJCQkJCQkJCS8vIHdhcyBub3QgYWRkZWQgdG8gdGhlIHdvcmtzcGFjZSBhdCB0aGUKLQkJCQkJCQkJCQkvLyB0aW1lIG9mIGxvYWRpbmcKLQkJCQkJCQkJCQkvLwotCQkJCQkJCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJCQkJCQkJCQlpZiAoIShtZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikpIHsKLQkJCQkJCQkJCQkJLy8gbm8gYXV0by1yZWxvYWQgZm9yIGNvbnRlbnQKLQkJCQkJCQkJCQkJLy8gZGVzY3JpcHRpb24KLQkJCQkJCQkJCQkJLy8gTWV0aG9kRWxlbWVudEVkaXRvciB3aWxsIGRldGVjdAotCQkJCQkJCQkJCQkvLyB0aGUgY2hhbmdlIGFuZCBsb2FkIGl0Ci0JCQkJCQkJCQkJCS8vIHdoZW4gYWN0aXZhdGVkLgotCQkJCQkJCQkJCQkvLwotCQkJCQkJCQkJCQlhZGRlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIGlmIChhY2NlcHQoZGVsdGEuZ2V0UmVzb3VyY2UoKSkpIHsKLQkJCQkJCQkJCWFkZGVkV29ya3NwYWNlUmVzb3VyY2VzLmFkZChkZWx0YQotCQkJCQkJCQkJCQkuZ2V0UmVzb3VyY2UoKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQ6Ci0JCQkJCQkJaWYgKChJUmVzb3VyY2VEZWx0YS5NT1ZFRF9UTyAmIGRlbHRhLmdldEZsYWdzKCkpICE9IDApIHsKLQkJCQkJCQkJLy8gaGFuZGxlIGZpbGUgbW92ZQotCQkJCQkJCQlwYXRoID0gZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRMb2NhdGlvbigpOyAgICAgICAgICAgICAKLQkJCQkJCQkJaWYocGF0aCAhPSBudWxsKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCQkJCQlyZXNvdXJjZSA9IGdldFJlc291cmNlKHBhdGgudG9TdHJpbmcoKSk7ICAgICAgICAgIAotCQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJCQkJCQltb3ZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOyAgICAgICAgICAgICAgICAgCi0JCQkJCQkJCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQkJCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJCQkJLy8KLQkJCQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQkJCQlJUGF0aCBtb3ZlZEZyb21QYXRoID0gZGVsdGEuZ2V0UmVzb3VyY2UoKQotCQkJCQkJCQkJCQkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCQkJCUlQYXRoIG1vdmVkVG9QYXRoID0gZGVsdGEuZ2V0TW92ZWRUb1BhdGgoKTsKLQkJCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCQkJLnByaW50bG4oIlJlc291cmNlIG1vdmVkIGZyb20gJyIgKyBtb3ZlZEZyb21QYXRoICsgIicgdG8gJyIgKyBtb3ZlZFRvUGF0aCArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQkJCX0KLQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXBhdGggPSBkZWx0YS5nZXRSZXNvdXJjZSgpLmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJCQkJCXJlc291cmNlID0gZ2V0UmVzb3VyY2UocGF0aC50b1N0cmluZygpKTsKLQkJCQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJcmVtb3ZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEOgotCQkJCQkJCWJvb2xlYW4gZW5jb2RpbmdDaGFuZ2VkID0gKChJUmVzb3VyY2VEZWx0YS5FTkNPRElORyAmIGRlbHRhCi0JCQkJCQkJCQkuZ2V0RmxhZ3MoKSkgIT0gMCk7Ci0JCQkJCQkJYm9vbGVhbiBjb250ZW50Q2hhbmdlZCA9ICgoSVJlc291cmNlRGVsdGEuQ09OVEVOVCAmIGRlbHRhCi0JCQkJCQkJCQkuZ2V0RmxhZ3MoKSkgIT0gMCk7Ci0JCQkJCQkJaWYgKGVuY29kaW5nQ2hhbmdlZCB8fCBjb250ZW50Q2hhbmdlZCkgewotCQkJCQkJCQlwYXRoID0gZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRMb2NhdGlvbigpOwotCQkJCQkJCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlsb2MgPSBwYXRoLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCQlyZXNvdXJjZSA9IGdldFJlc291cmNlKGxvYyk7Ci0JCQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbAotCQkJCQkJCQkJCQkmJiBNdWx0aUZpbGVTYXZlVXRpbAotCQkJCQkJCQkJCQkJCS5jaGVja1N5bmNocm9uaXplZChyZXNvdXJjZSkgIT0gMSkgewotCQkJCQkJCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyB3YXRjaCBmb3IgcHJvamVjdCBtb3ZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCWVsc2UgaWYgKGRlbHRhLmdldEZsYWdzKCkgIT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJCQkmJiBkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgeyAgICAgICAgICAgICAgICAgIAotCQkJCQkJLy8gdGVzdGVkIHVzaW5nIHRoZSBNb3ZlLi4gY29tbWFuZCBpbiB0aGUgUmVzb3VyY2UgTmF2aWdhdG9yIHZpZXcgICAgICAgICAgICAgCi0JCQkJCQkvLyB0aGUgUkVQTEFDRUQgZmxhZyBvbmx5IHNlZW1lZCB0byBvY2N1ciB3aGVuIHRoZSBsaWJyYXJ5IHdhcyBtb3ZlZCAgICAgICAgICAKLQkJCQkJCS8vIG91dHNpZGUgb2YgRVBGIGFuZCBFUEYgd2FzIHJlLXN0YXJ0ZWQsIHNvIG1ha2Ugc3VyZSBpdCdzIGNsZWFyLCBvdGhlcndpc2UgIAotCQkJCQkJLy8gd2UgcmVsb2FkIHRoZSBsaWJyYXJ5IHJpZ2h0IGFmdGVyIGxvYWRpbmcgaXQgd2hlbiBzdGFydGluZyBFUEYgICAgICAgICAgICAgCi0JCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJCQkJKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpID09IDApICYmICAgICAgICAgICAgICAgIAotCQkJCQkJCQkoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5ERVNDUklQVElPTikgIT0gMCkpIHsgICAgICAgICAgICAgCi0JCQkJCQkJbW92ZWRSZXNvdXJjZXMuYWRkKGRlbHRhLmdldFJlc291cmNlKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCQlyZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGFuZ2VkUmVzb3VyY2VzKCkgewotCQkJCQlyZXR1cm4gY2hhbmdlZFJlc291cmNlczsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZW1vdmVkUmVzb3VyY2VzKCkgewotCQkJCQlyZXR1cm4gcmVtb3ZlZFJlc291cmNlczsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb3ZlZFJlc291cmNlcygpIHsgICAgCi0JCQkJCXJldHVybiBtb3ZlZFJlc291cmNlczsgICAgICAgICAgICAgICAgIAotCQkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCX07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQkJCVJlc291cmNlRGVsdGFWaXNpdG9yIHZpc2l0b3IgPSBuZXcgUmVzb3VyY2VEZWx0YVZpc2l0b3IoKTsKLQkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yKTsKLQotCQkJcmVtb3ZlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5nZXRSZW1vdmVkUmVzb3VyY2VzKCkpOwotCQkJbW92ZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0TW92ZWRSZXNvdXJjZXMoKSk7Ci0JCQljaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7Ci0JCQlhZGRlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5hZGRlZFJlc291cmNlcyk7Ci0JCQlhZGRlZFdvcmtzcGFjZVJlc291cmNlcy5hZGRBbGwodmlzaXRvci5hZGRlZFdvcmtzcGFjZVJlc291cmNlcyk7Ci0KLQkJCWlmIChzaG91bGRSZWZyZXNoKCkpIHsKLQkJCQlzY2hlZHVsZVJlZnJlc2goKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVzb2x2ZXMgdGhlIHByb3h5IGFuZCBpdHMgY29udGFpbmVycwotCSAqIAotCSAqIFRPRE86IG1vdmUgdGhpcyBtZXRob2QgdG8gYSB1dGlsaXR5IGNsYXNzIGFuZCBtYWtlIGl0IHN0YXRpYwotCSAqIAotCSAqIEBwYXJhbSBwcm94eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCByZXNvbHZlKEVPYmplY3QgcHJveHkpIHsKLQkJRU9iamVjdCByZXNvbHZlZDsKLQkJdHJ5IHsKLQkJCXJlc29sdmVkID0gRWNvcmVVdGlsLnJlc29sdmUocHJveHksIHJlc291cmNlU2V0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJlc29sdmVkID0gcHJveHk7Ci0JCX0KLQkJRU9iamVjdCBjb250YWluZXIgPSBwcm94eS5lQ29udGFpbmVyKCk7Ci0JCWlmIChyZXNvbHZlZC5lQ29udGFpbmVyKCkgPT0gbnVsbCAmJiBjb250YWluZXIgIT0gbnVsbCkgewotCQkJaWYgKGNvbnRhaW5lci5lSXNQcm94eSgpKSB7Ci0JCQkJY29udGFpbmVyID0gcmVzb2x2ZShjb250YWluZXIpOwotCQkJfQotCQkJRVJlZmVyZW5jZSByZWYgPSBwcm94eS5lQ29udGFpbm1lbnRGZWF0dXJlKCk7Ci0JCQlpZiAocmVmLmlzTWFueSgpKSB7Ci0JCQkJTGlzdCB2YWx1ZXMgPSAoTGlzdCkgY29udGFpbmVyLmVHZXQocmVmKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7IGl0ZXIKLQkJCQkJCS5uZXh0KCkpCi0JCQkJCTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29udGFpbmVyLmVHZXQocmVmKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb2x2ZWQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZWZyZXNoSm9iIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUmVmcmVzaEpvYiBpbnN0YW5jZSA9IG5ldyBSZWZyZXNoSm9iKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9pbnRlcm5hbC9SZWZyZXNoRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL2ludGVybmFsL1JlZnJlc2hFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjlkMzViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL2ludGVybmFsL1JlZnJlc2hFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaEV2ZW50OwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIGNsYXNzIG9mIElSZWZyZXNoRXZlbnQKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZnJlc2hFdmVudCBpbXBsZW1lbnRzIElSZWZyZXNoRXZlbnQgewotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIHJlZnJlc2hlZFJlc291cmNlczsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiB1bmxvYWRlZE9iamVjdHM7Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIHJlZnJlc2hlZE9iamVjdHM7Ci0KLQlwdWJsaWMgUmVmcmVzaEV2ZW50KENvbGxlY3Rpb24gcmVmcmVzaGVkUmVzb3VyY2VzLAotCQkJQ29sbGVjdGlvbiB1bmxvYWRlZE9iamVjdHMpIHsKLQkJdGhpcyhyZWZyZXNoZWRSZXNvdXJjZXMsIHVubG9hZGVkT2JqZWN0cywgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7Ci0JfQkKLQotCS8qKgotCSAqIEBwYXJhbSByZWZyZXNoZWRSZXNvdXJjZXMKLQkgKiBAcGFyYW0gdW5sb2FkZWRPYmplY3RzCi0JICogQHBhcmFtIHJlZnJlc2hlZE9iamVjdHMKLQkgKi8KLQlwdWJsaWMgUmVmcmVzaEV2ZW50KENvbGxlY3Rpb24gcmVmcmVzaGVkUmVzb3VyY2VzLCBDb2xsZWN0aW9uIHVubG9hZGVkT2JqZWN0cywgQ29sbGVjdGlvbiByZWZyZXNoZWRPYmplY3RzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucmVmcmVzaGVkUmVzb3VyY2VzID0gcmVmcmVzaGVkUmVzb3VyY2VzOwotCQl0aGlzLnVubG9hZGVkT2JqZWN0cyA9IHVubG9hZGVkT2JqZWN0czsKLQkJdGhpcy5yZWZyZXNoZWRPYmplY3RzID0gcmVmcmVzaGVkT2JqZWN0czsKLQl9Ci0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaEV2ZW50I2dldFJlZnJlc2hlZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVmcmVzaGVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gcmVmcmVzaGVkUmVzb3VyY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hFdmVudCNnZXRVbmxvYWRlZE9iamVjdHMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFVubG9hZGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHVubG9hZGVkT2JqZWN0czsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaEV2ZW50I2dldFJlZnJlc2hlZE9iamVjdHMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlZnJlc2hlZE9iamVjdHMoKSB7Ci0JCXJldHVybiByZWZyZXNoZWRPYmplY3RzOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL2ludGVybmFsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL2ludGVybmFsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDNkN2I0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIG1hbmFnaW5nIG1ldGhvZCBsaWJyYXJ5IHJlZnJlc2hlcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlhYjdjNTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIG1hbmFnaW5nIG1ldGhvZCBsaWJyYXJ5IHJlZnJlc2hlcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9MaWJyYXJ5U2NoZWR1bGluZ1J1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL0xpYnJhcnlTY2hlZHVsaW5nUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZjM2YmVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL0xpYnJhcnlTY2hlZHVsaW5nUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLk11bHRpUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogU2NoZWR1bGluZyBydWxlIHVzZWQgdG8gbG9jayBhIGxpYnJhcnkgZHVyaW5nIGEgb3BlcmF0aW9uIGFuZCBkZWZlciB0aGUKLSAqIGJyb2FkY2FzdGluZyBvZiByZXNvdXJjZSBjaGFuZ2UgZXZlbnQgdW50aWwgdGhlIG9wZXJhdGlvbiBpcyBmaW5pc2hlZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgMTUsIDIwMDYKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlTY2hlZHVsaW5nUnVsZSBpbXBsZW1lbnRzIElTY2hlZHVsaW5nUnVsZSB7Ci0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGxpYnJhcnk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGliCi0JICovCi0JcHVibGljIExpYnJhcnlTY2hlZHVsaW5nUnVsZShNZXRob2RMaWJyYXJ5IGxpYikgewotCQl0aGlzLmxpYnJhcnkgPSBsaWI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGUjY29udGFpbnMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0JCWlmICh0aGlzID09IHJ1bGUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChydWxlIGluc3RhbmNlb2YgTGlicmFyeVNjaGVkdWxpbmdSdWxlKSB7Ci0JCQlyZXR1cm4gKChMaWJyYXJ5U2NoZWR1bGluZ1J1bGUpIHJ1bGUpLmxpYnJhcnkgPT0gbGlicmFyeTsKLQkJfQotCQlpZiAocnVsZSBpbnN0YW5jZW9mIE11bHRpUnVsZSkgewotCQkJTXVsdGlSdWxlIG1ydWxlID0gKE11bHRpUnVsZSkgcnVsZTsKLQkJCUlTY2hlZHVsaW5nUnVsZVtdIGNoaWxkUnVsZXMgPSBtcnVsZS5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaT0wOyBpPGNoaWxkUnVsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoISAoY2hpbGRSdWxlc1tpXSBpbnN0YW5jZW9mIElSZXNvdXJjZSkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gYWxsb3cgYW55IElSZXNvdXJjZSBydWxlIHRvIG5lc3Qgd2l0aGluIHRoZSBzYW1lIHRocmVhZAotCQkvLwotCQlyZXR1cm4gcnVsZSBpbnN0YW5jZW9mIElSZXNvdXJjZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZSNpc0NvbmZsaWN0aW5nKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbmZsaWN0aW5nKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0JCXJldHVybiBlcXVhbHMocnVsZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiB0aGlzID09IG9iagotCQkJCXx8IChvYmogaW5zdGFuY2VvZiBMaWJyYXJ5U2NoZWR1bGluZ1J1bGUgJiYgKChMaWJyYXJ5U2NoZWR1bGluZ1J1bGUpIG9iaikubGlicmFyeSA9PSBsaWJyYXJ5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1BhdHRlcm5Db25zdHJ1Y3Rvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGF0dGVybkNvbnN0cnVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyNDZlNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGF0dGVybkNvbnN0cnVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVyblN5bnRheEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHdpdGggc3RhdGljIG1ldGhvZHMgdG8gY3JlYXRlIHNlYXJjaCBwYXR0ZXJuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXR0ZXJuQ29uc3RydWN0b3IgewotCi0JcHJpdmF0ZSBQYXR0ZXJuQ29uc3RydWN0b3IoKSB7Ci0JCS8vIGRvbid0IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBQYXR0ZXJuIGNyZWF0ZVBhdHRlcm4oU3RyaW5nIHBhdHRlcm4sCi0JCQlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSwgYm9vbGVhbiBpc1JlZ2V4KQotCQkJdGhyb3dzIFBhdHRlcm5TeW50YXhFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlUGF0dGVybihwYXR0ZXJuLCBpc1JlZ2V4LCB0cnVlLCBpc0Nhc2VTZW5zaXRpdmUsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcGF0dGVybiBlbGVtZW50IGZyb20gdGhlIHBhdHRlcm4gc3RyaW5nIHdoaWNoIGlzIGVpdGhlciBhCi0JICogcmVnLWV4IGV4cHJlc3Npb24gb3IgaW4gb3VyIG9sZCAnU3RyaW5nTWF0Y2hlcicgZm9ybWF0LgotCSAqIAotCSAqIEBwYXJhbSBwYXR0ZXJuCi0JICogICAgICAgICAgICBUaGUgc2VhcmNoIHBhdHRlcm4KLQkgKiBAcGFyYW0gaXNSZWdleAotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBhc3NlZCBzdHJpbmcgYWxyZWFkeSBpcyBhIHJlZy1leAotCSAqICAgICAgICAgICAgcGF0dGVybgotCSAqIEBwYXJhbSBpc1N0cmluZ01hdGNoZXIKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwYXNzZWQgc3RyaW5nIGlzIGluIHRoZQotCSAqICAgICAgICAgICAgU3RyaW5nTWF0Y2hlciBmb3JtYXQuCi0JICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZQotCSAqICAgICAgICAgICAgU2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IHRvIGNyZWF0ZSBhIGNhc2UgaW5zZW5zaXRpdmUKLQkgKiAgICAgICAgICAgIHBhdHRlcm4KLQkgKiBAcGFyYW0gaXNXaG9sZVdvcmQKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IHRvIGNyZWF0ZSBhIHBhdHRlcm4gdGhhdCByZXF1aXJlcyBhIHdvcmQKLQkgKiAgICAgICAgICAgIGJvdW5kYXJ5IGF0IHRoZSBiZWdpbm5pbmcgYW5kIHRoZSBlbmQuCi0JICogQHJldHVybiBUaGUgY3JlYXRlZCBwYXR0ZXJuCi0JICogQHRocm93cyBQYXR0ZXJuU3ludGF4RXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBQYXR0ZXJuIGNyZWF0ZVBhdHRlcm4oU3RyaW5nIHBhdHRlcm4sIGJvb2xlYW4gaXNSZWdleCwKLQkJCWJvb2xlYW4gaXNTdHJpbmdNYXRjaGVyLCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSwKLQkJCWJvb2xlYW4gaXNXaG9sZVdvcmQpIHRocm93cyBQYXR0ZXJuU3ludGF4RXhjZXB0aW9uIHsKLQkJaWYgKGlzUmVnZXgpIHsKLQkJCWlmIChpc1dob2xlV29yZCkgewotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHBhdHRlcm4ubGVuZ3RoKCkgKyAxMCk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXFxiKD86IikuYXBwZW5kKHBhdHRlcm4pLmFwcGVuZCgiKVxcYiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlwYXR0ZXJuID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgbGVuID0gcGF0dGVybi5sZW5ndGgoKTsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbiArIDEwKTsKLQkJCS8vIGRvbid0IGFkZCBhIHdvcmQgYm91bmRhcnkgaWYgdGhlIHNlYXJjaCB0ZXh0IGRvZXMgbm90IHN0YXJ0IHdpdGgKLQkJCS8vIGEgd29yZCBjaGFyLiAodGhpcyB3b3JrcyBhcm91bmQgYSB1c2VyIGlucHV0IGVycm9yKS4KLQkJCWlmIChpc1dob2xlV29yZCAmJiBsZW4gPiAwICYmIGlzV29yZENoYXIocGF0dGVybi5jaGFyQXQoMCkpKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXFxiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWFwcGVuZEFzUmVnRXgoaXNTdHJpbmdNYXRjaGVyLCBwYXR0ZXJuLCBidWZmZXIpOwotCQkJaWYgKGlzV2hvbGVXb3JkICYmIGxlbiA+IDAgJiYgaXNXb3JkQ2hhcihwYXR0ZXJuLmNoYXJBdChsZW4gLSAxKSkpIHsKLQkJCQlidWZmZXIuYXBwZW5kKCJcXGIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcGF0dGVybiA9IGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0KLQkJaW50IHJlZ2V4T3B0aW9ucyA9IFBhdHRlcm4uTVVMVElMSU5FOwotCQlpZiAoIWlzQ2FzZVNlbnNpdGl2ZSkgewotCQkJcmVnZXhPcHRpb25zIHw9IFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uVU5JQ09ERV9DQVNFOwotCQl9Ci0JCXJldHVybiBQYXR0ZXJuLmNvbXBpbGUocGF0dGVybiwgcmVnZXhPcHRpb25zKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzV29yZENoYXIoY2hhciBjKSB7Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBwYXR0ZXJuIGVsZW1lbnQgZnJvbSBhbiBhcnJheSBvZiBwYXR0ZXJucyBpbiB0aGUgb2xkCi0JICogJ1N0cmluZ01hdGNoZXInIGZvcm1hdC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0dGVybnMKLQkgKiAgICAgICAgICAgIFRoZSBzZWFyY2ggcGF0dGVybnMKLQkgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlCi0JICogICAgICAgICAgICBTZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gY3JlYXRlIGEgY2FzZSBpbnNlbnNpdGl2ZQotCSAqICAgICAgICAgICAgcGF0dGVybgotCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgcGF0dGVybgotCSAqIEB0aHJvd3MgUGF0dGVyblN5bnRheEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGF0dGVybiBjcmVhdGVQYXR0ZXJuKFN0cmluZ1tdIHBhdHRlcm5zLAotCQkJYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHRocm93cyBQYXR0ZXJuU3ludGF4RXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVmZmVyIHBhdHRlcm4gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0dGVybnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpID4gMCkgewotCQkJCS8vIG5vdGUgdGhhdCB0aGlzIHdvcmtzIG9ubHkgYXMgd2Uga25vdyB0aGF0IHRoZSBvcGVyYW5kcyBvZiB0aGUKLQkJCQkvLyBvciBleHByZXNzaW9uIHdpbGwgYmUgc2ltcGxlIGFuZCBuZWVkIG5vIGJyYWNrZXRzLgotCQkJCXBhdHRlcm4uYXBwZW5kKCd8Jyk7Ci0JCQl9Ci0JCQlhcHBlbmRBc1JlZ0V4KHRydWUsIHBhdHRlcm5zW2ldLCBwYXR0ZXJuKTsKLQkJfQotCQlyZXR1cm4gY3JlYXRlUGF0dGVybihwYXR0ZXJuLnRvU3RyaW5nKCksIHRydWUsIHRydWUsIGlzQ2FzZVNlbnNpdGl2ZSwKLQkJCQlmYWxzZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdCdWZmZXIgYXBwZW5kQXNSZWdFeChib29sZWFuIGlzU3RyaW5nTWF0Y2hlciwKLQkJCVN0cmluZyBwYXR0ZXJuLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCWJvb2xlYW4gaXNFc2NhcGVkID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0dGVybi5sZW5ndGgoKTsgaSsrKSB7Ci0JCQljaGFyIGMgPSBwYXR0ZXJuLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoYykgewotCQkJLy8gdGhlIGJhY2tzbGFzaAotCQkJY2FzZSAnXFwnOgotCQkJCS8vIHRoZSBiYWNrc2xhc2ggaXMgZXNjYXBlIGNoYXIgaW4gc3RyaW5nIG1hdGNoZXIKLQkJCQlpZiAoaXNTdHJpbmdNYXRjaGVyICYmICFpc0VzY2FwZWQpIHsKLQkJCQkJaXNFc2NhcGVkID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlidWZmZXIuYXBwZW5kKCJcXFxcIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaXNFc2NhcGVkID0gZmFsc2U7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJLy8gY2hhcmFjdGVycyB0aGF0IG5lZWQgdG8gYmUgZXNjYXBlZCBpbiB0aGUgcmVnZXguCi0JCQljYXNlICcoJzoKLQkJCWNhc2UgJyknOgotCQkJY2FzZSAneyc6Ci0JCQljYXNlICd9JzoKLQkJCWNhc2UgJy4nOgotCQkJY2FzZSAnWyc6Ci0JCQljYXNlICddJzoKLQkJCWNhc2UgJyQnOgotCQkJY2FzZSAnXic6Ci0JCQljYXNlICcrJzoKLQkJCWNhc2UgJ3wnOgotCQkJCWlmIChpc0VzY2FwZWQpIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFxcXCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlzRXNjYXBlZCA9IGZhbHNlOwotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKCdcXCcpOwotCQkJCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICc/JzoKLQkJCQlpZiAoaXNTdHJpbmdNYXRjaGVyICYmICFpc0VzY2FwZWQpIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgnLicpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoJ1xcJyk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JCQkJCWlzRXNjYXBlZCA9IGZhbHNlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgJyonOgotCQkJCWlmIChpc1N0cmluZ01hdGNoZXIgJiYgIWlzRXNjYXBlZCkgewotCQkJCQlidWZmZXIuYXBwZW5kKCIuKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgnXFwnKTsKLQkJCQkJYnVmZmVyLmFwcGVuZChjKTsKLQkJCQkJaXNFc2NhcGVkID0gZmFsc2U7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlpZiAoaXNFc2NhcGVkKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxcXFwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpc0VzY2FwZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZChjKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoaXNFc2NhcGVkKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCJcXFxcIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlzRXNjYXBlZCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiBidWZmZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9QZXJzaXN0ZW5jZVJlc291cmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGVyc2lzdGVuY2VSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzljYzg4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9QZXJzaXN0ZW5jZVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBNZXNzYWdlIGJ1bmRsZSBjbGFzcyBmb3IgbGlicmFyeSBwZXJzaXN0ZW5jZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUGVyc2lzdGVuY2VSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gUGVyc2lzdGVuY2VSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBQZXJzaXN0ZW5jZVJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZE5hbWVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvYmpOb3RGb3VuZEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRMaWJyYXJ5RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZExpYnJhcnlFcnJvcl9kZXRhaWxzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmcmVzaExpYnJhcnlGaWxlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc3RvcmVSZXNvdXJjZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVNYW5hZ2VyX2ZpbGVSZWFkT25seTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVyck1zZ19Db3VsZE5vdERlbGV0ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbmFtZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhY2t1cEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1hcmtlcl9lcnJfY2Fubm90UmVzb2x2ZVByb3h5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW9kaWZ5RmlsZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRSZXNvdXJjZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRSZXNvdXJjZUVycm9yV2l0aFJlYXNvbl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkTGlicmFyeUZpbGVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlTm90Rm91bmRFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub3JtYWxpemVVUklFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb3ZlRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW9kaWZ5UmVhZE9ubHlGaWxlRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW92ZVJlc291cmNlRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW9kaWZ5RmlsZXNFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvdXJjZU91dE9mU3luY2hfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZExpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb3ZlRGF0YVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVMaWJyYXJ5VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZFJlc291cmNlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pZ3JhdGVDb250ZW50RGVzY3JpcHRpb25zVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZml4UHJlc2VudGF0aW9uTmFtZVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXJfY291bGROb3RSZXNvbHZlUHJveHk7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGVyc2lzdGVuY2VVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9QZXJzaXN0ZW5jZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGRiMjE1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9QZXJzaXN0ZW5jZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuRVBGVmVyc2lvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5WZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbC5NaWdyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3Mgd2l0aCBzdGF0aWMgaGVscGVyIG1ldGhvZHMgZm9yIGxpYnJhcnkgcGVyc2lzdGVuY2UKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVXRpbCB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjdXJyZW50IG5hbWVzcGFjZSBVUkkgb2YgVU1BLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFVNQU5zVVJJKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5lTlNfVVJJOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFVNQU5zVVJJKFN0cmluZyBsaWJQYXRoKSB7Ci0JCXRyeSB7Ci0JCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKQotCQkJCQkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQlEb2N1bWVudCBkb2MgPSBidWlsZGVyLnBhcnNlKG5ldyBGaWxlKGxpYlBhdGgpKTsKLQkJCUVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCVN0cmluZyBuc1VSSSA9IHJvb3QuZ2V0QXR0cmlidXRlKCJ4bWxuczpjb20uaWJtLnVtYSIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobnNVUkkgPT0gbnVsbCB8fCBuc1VSSS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQluc1VSSSA9IHJvb3QuZ2V0QXR0cmlidXRlKCJ4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBuc1VSSTsKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBjb252ZXJzaW9uUmVxdWlyZWQoU3RyaW5nIGxpYlBhdGgpIHsKLQkJU3RyaW5nIGN1cnJlbnROc1VSSSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRVTUFOc1VSSSgpOwotCQlTdHJpbmcgbGliTnNVUkkgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0VU1BTnNVUkkobGliUGF0aCk7Ci0JCWlmIChjdXJyZW50TnNVUkkuZXF1YWxzKGxpYk5zVVJJKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKE1pZ3JhdG9yLk9MRF9VTUFfTlNfVVJJLmVxdWFscyhsaWJOc1VSSSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVJlc291cmNlIGdldFdvcmtzcGFjZVJlc291cmNlKE9iamVjdCBvYmopIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZSA9IChEZXNjcmliYWJsZUVsZW1lbnQpIG9iajsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gZS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCXJlc291cmNlID0gY29udGVudC5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJcmVzb3VyY2UgPSBlLmVSZXNvdXJjZSgpOwotCQkJfQotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJlc291cmNlID0gKChFT2JqZWN0KSBvYmopLmVSZXNvdXJjZSgpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgb2JqOwotCQl9Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFVSSSgpLmlzRmlsZSgpKSB7Ci0JCQlyZXR1cm4gRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihyZXNvdXJjZS5nZXRVUkkoKQotCQkJCQkudG9GaWxlU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbjxFT2JqZWN0PiBnZXRQcm94aWVzKEVPYmplY3Qgb2JqKSB7Ci0JCUNvbGxlY3Rpb248RU9iamVjdD4gcHJveGllcyA9IG5ldyBBcnJheUxpc3Q8RU9iamVjdD4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChvLmVJc1Byb3h5KCkpIHsKLQkJCQlwcm94aWVzLmFkZChvKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJveGllczsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgdGhlIHByaW1hcnkgdG9vbCB2ZXJzaW9uIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gcmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIDxsaT4gPCAwIGlmIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcmltYXJ5IHRvb2wgc3RvcmVkIGluIHRoZSBnaXZlbiByZXNvdXJjZSBpcyBtaXNzaW5nIG9yIG9sZGVyIHRoYW4gY3VycmVudAotCSAqICAgICAgICAgPGxpPiAwIGlmIHRoZSBwcmltYXJ5IHRvb2wgdmVyc2lvbiBpbiB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWF0Y2hlcyB0aGUgY3VycmVudCB2ZXJzaW9uCi0JICogICAgICAgICA8bGk+ID4gMCBpZiAgdGhlIHByaW1hcnkgdG9vbCB2ZXJzaW9uIGluIHRoZSBnaXZlbiByZXNvdXJjZSBpcyBuZXdlciB0aGFuIHRoZSBjdXJyZW50IHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjaGVja1Rvb2xWZXJzaW9uKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJTWFwIGZpbGVWZXJzaW9uTWFwID0gVmVyc2lvblV0aWwucmVhZFZlcnNpb25zRnJvbUZpbGUoZmlsZSk7Ci0JCWlmKGZpbGVWZXJzaW9uTWFwICE9IG51bGwpIHsKLQkJCVN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgZmlsZVZlcnNpb25NYXAuZ2V0KFZlcnNpb25VdGlsLmdldFByaW1hcnlUb29sSUQoKSk7Ci0JCQlpZih2ZXJzaW9uICE9IG51bGwpIHsKLQkJCQlFUEZWZXJzaW9ucyB2ZXJzaW9ucyA9IFZlcnNpb25VdGlsLmdldFZlcnNpb25zKFZlcnNpb25VdGlsLmdldFByaW1hcnlUb29sSUQoKSk7Ci0JCQkJcmV0dXJuIHZlcnNpb25zLmdldEN1cnJlbnRWZXJzaW9uKCkuY29tcGFyZVRvb2xWZXJzaW9uVG8obmV3IFZlcnNpb24odmVyc2lvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBmaXJzdCBtZXRob2QgZWxlbWVudCBpbiBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0JICogIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudChSZXNvdXJjZSByZXNvdXJjZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXJldHVybiAoTWV0aG9kRWxlbWVudCkgZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmUyYWRhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgRXJyb3IgTWVzc2FnZXMKLWludmFsaWROYW1lRXJyb3JfbXNnPVRoZSBuYW1lICcnezB9JycgaXMgaW52YWxpZC4gTWV0aG9kIGVsZW1lbnQgbmFtZSBjYW5ub3QgY29udGFpbiB0aGVzZSBjaGFyYWN0ZXJzOiBcXCAvIDogKiA/ICIgPCA+IHwKLW9iak5vdEZvdW5kRXJyb3JfbXNnPUNvdWxkIG5vdCBmaW5kIG9iamVjdCB3aXRoIGlkICcnezB9JycKLWxvYWRMaWJyYXJ5RXJyb3JfbXNnPUVycm9ycyBlbmNvdW50ZXJlZCB3aGlsZSBsb2FkaW5nIG1ldGhvZCBsaWJyYXJ5OgotbG9hZExpYnJhcnlFcnJvcl9kZXRhaWxzPVwgXCBsaW5lOiB7MH0sIGNvbHVtbjogezF9LCBtc2c6IHsyfQotcmVzdG9yZVJlc291cmNlRXJyb3JfbXNnPUNvdWxkIG5vdCByZXN0b3JlIHJlc291cmNlICcnezB9JycKLUZpbGVNYW5hZ2VyX2ZpbGVSZWFkT25seT1GaWxlICcnezB9JycgaXMgcmVhZC1vbmx5Ci1FcnJNc2dfQ291bGROb3REZWxldGU9Q291bGQgbm90IGRlbGV0ZSB7MH0uIHsxfQotcmVuYW1lRXJyb3JfbXNnPUNvdWxkIG5vdCByZW5hbWUgJyd7MH0nJyB0byAnJ3sxfScnCi1iYWNrdXBFcnJvcl9tc2c9Q291bGQgbm90IGJhY2t1cCB1cCByZXNvdXJjZSAnJ3swfScnCi1tYXJrZXJfZXJyX2Nhbm5vdFJlc29sdmVQcm94eT1Db3VsZCBub3QgcmVzb2x2ZSBwcm94eSB7MH0KLW1vZGlmeUZpbGVFcnJvcl9tc2c9Q2Fubm90IG1vZGlmeSBmaWxlICcnezB9JycKLWxvYWRSZXNvdXJjZUVycm9yX21zZz1Db3VsZCBub3QgbG9hZCByZXNvdXJjZSAnJ3swfScnCi1sb2FkUmVzb3VyY2VFcnJvcldpdGhSZWFzb25fbXNnPUNvdWxkIG5vdCBsb2FkIHJlc291cmNlICcnezB9JycuIFJlYXNvbjogezF9Ci1pbnZhbGlkTGlicmFyeUZpbGVFcnJvcl9tc2c9SW52YWxpZCBtZXRob2QgbGlicmFyeSBmaWxlOgotZmlsZU5vdEZvdW5kRXJyb3JfbXNnPUNvdWxkIG5vdCBsb2NhdGUgYW55IG1ldGhvZCBsaWJyYXJ5IGZpbGUgaW4gd29ya3NwYWNlICcnezB9JycKLW5vcm1hbGl6ZVVSSUVycm9yX21zZz1Db3VsZCBub3QgZmluZCB0aGUgbm9ybWFsaXplZCBVUkkgZm9yICcnezB9JycKLW1vdmVFcnJvcl9tc2c9Q291bGQgbm90IG1vdmUgJyd7MH0nJyB0byAnJ3sxfScnLiBUaGUgZGVzdGluYXRpb24gYWxyZWFkeSBleGlzdHMuCi1tb2RpZnlSZWFkT25seUZpbGVFcnJvcl9tc2c9Q2Fubm90IG1vZGlmeSByZWFkLW9ubHkgZmlsZShzKTogezB9Ci1tb3ZlUmVzb3VyY2VFcnJvcl9tc2c9UmVzb3VyY2UgJyd7MH0nJyBpcyBpbnZvbHZlZCBpbiBhIHBlcnNpc3RlbmNlIG9wZXJhdGlvbiB0aGF0IGhhcyBub3QgYmVlbiBjb21taXR0ZWQuCi1tb2RpZnlGaWxlc0Vycm9yX21zZz1Db3VsZCBub3QgbW9kaWZ5IG9uZSBvciBtb3JlIGZpbGVzCi1yZXNvdXJjZU91dE9mU3luY2hfbXNnPVJlc291cmNlIGlzIG91dCBvZiBzeW5jaCBhbmQgbmVlZHMgdG8gYmUgcmVsb2FkZWQ6IHswfQotCi0jIFByb2dyZXNzIE1lc3NhZ2VzCi1sb2FkTGlicmFyeVRhc2tfbmFtZT1Mb2FkaW5nIG1ldGhvZCBsaWJyYXJ5Li4uCi1tb3ZlRGF0YVRhc2tfbmFtZT1Nb3ZpbmcgdGhlIGRhdGEuLi4KLXNhdmVMaWJyYXJ5VGFza19uYW1lPVNhdmluZyBtZXRob2QgbGlicmFyeS4uLgotbG9hZFJlc291cmNlc1Rhc2tfbmFtZT1Mb2FkaW5nIGFsbCByZXNvdXJjZXMgaW50byBtZW1vcnkuLi4KLW1pZ3JhdGVDb250ZW50RGVzY3JpcHRpb25zVGFza19uYW1lPU1pZ3JhdGluZyBwcm9jZXNzIGNvbnRlbnQgZGVzY3JpcHRpb25zLi4uCi1maXhQcmVzZW50YXRpb25OYW1lVGFza19uYW1lPVNldHRpbmcgbnVsbC9lbXB0eSBwcmVzZW50YXRpb24gbmFtZSBvZiBldmVyeSBicmVha2Rvd24gZWxlbWVudCB0byBpdHMgbmFtZS4uLgotVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcl9jb3VsZE5vdFJlc29sdmVQcm94eT1Db3VsZCBub3QgcmVzb2x2ZSBwcm94eSAnJ3swfScnCi1yZWZyZXNoTGlicmFyeUZpbGVzVGFza19uYW1lPVJlZnJlc2hpbmcgbGlicmFyeSBmaWxlcyBpbiB3b3Jrc3BhY2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1VucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1VucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmU3ZDQxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9VbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Xb3Jrc3BhY2VKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JUHJveHlSZXNvbHV0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5SZXNvbHZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi0vKioKLSAqIEJhY2tncm91bmQgam9iIHRoYXQgbWFuYWdlIG1hcmtlcnMgZm9yIHVucmVzb2x2ZWQgcHJveGllcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlciBleHRlbmRzIFdvcmtzcGFjZUpvYiBpbXBsZW1lbnRzIElQcm94eVJlc29sdXRpb25MaXN0ZW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFTEFZID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9VUkkgPSAicHJveHlVUkkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1dORVJfR1VJRCA9ICJvd25lckdVSUQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmFsaWRPYmplY3QgewotCQlib29sZWFuIHZhbGlkOwotCQlPYmplY3Qgb2JqZWN0OwotCQkKLQkJLyoqCi0JCSAqIEBwYXJhbSB2YWxpZAotCQkgKiBAcGFyYW0gb2JqZWN0Ci0JCSAqLwotCQlwdWJsaWMgVmFsaWRPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCQkJdmFsaWQgPSB0cnVlOwkJCQotCQl9Ci0JCQkJCi0JfQotCQotCXByaXZhdGUgTWFwIHVyaVRvRXhjZXB0aW9uc01hcDsKLQlwcml2YXRlIExpc3QgZXhjZXB0aW9uczsKLQlwcml2YXRlIE1hcCByZXNvdXJjZUdVSVRvTWFya2Vyc01hcDsKLQlwcml2YXRlIE1hcCBlbGVtZW50R1VJVG9NYXJrZXJzTWFwOwotCXByaXZhdGUgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7Ci0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZWQ7Ci0JcHJpdmF0ZSBMaXN0IHJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzOwotCi0JcHVibGljIFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIoUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJc3VwZXIoIkVQRiBVbnJlc29sdmVkIFByb3h5IExvZ2dlciIpOyAvLyROT04tTkxTLTEkCQkKLQkJdGhpcy5yZXNvdXJjZVNldCA9IHJlc291cmNlU2V0OwotLy8JCXVucmVzb2x2ZWRSZXNvdXJjZUdVSURUb01hcmtlcnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl1cmlUb0V4Y2VwdGlvbnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlleGNlcHRpb25zID0gbmV3IEFycmF5TGlzdCgpOyAKLQkJcmVzb3VyY2VHVUlUb01hcmtlcnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQllbGVtZW50R1VJVG9NYXJrZXJzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJcmVzb3VyY2VzVG9WYWxpZGF0ZU1hcmtlcnMgPSBuZXcgVW5pcXVlRUxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgSU1hcmtlciBmaW5kTWFya2VyKElGaWxlIGZpbGUsIFN0cmluZyBwcm94eVVSSSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlNYXJrZXJbXSBtYXJrZXJzID0gZmlsZS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJaWYocHJveHlVUkkuZXF1YWxzKG1hcmtlci5nZXRBdHRyaWJ1dGUoUFJPWFlfVVJJKSkKLQkJCQkJJiYgbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQsIC0xKSA9PSBzdGFydAotCQkJCQkmJiBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQsIC0xKSA9PSBlbmQpIAotCQkJewotCQkJCXJldHVybiBtYXJrZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFkZEV4Y2VwdGlvbihSZXNvbHZlRXhjZXB0aW9uIHJlKSB7Ci0JCXN5bmNocm9uaXplZChleGNlcHRpb25zKSB7Ci0JCQlVUkkgdXJpID0gKChJbnRlcm5hbEVPYmplY3QpcmUuZ2V0UHJveHkoKSkuZVByb3h5VVJJKCk7Ci0JCQlTZXQgZXhjZXB0aW9ucyA9IChTZXQpIHVyaVRvRXhjZXB0aW9uc01hcC5nZXQodXJpKTsJCQotCQkJaWYoZXhjZXB0aW9ucyA9PSBudWxsKSB7Ci0JCQkJZXhjZXB0aW9ucyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJdXJpVG9FeGNlcHRpb25zTWFwLnB1dCh1cmksIGV4Y2VwdGlvbnMpOwotCQkJfQotCQkJaWYoZXhjZXB0aW9ucy5hZGQocmUpKSB7Ci0JCQkJdGhpcy5leGNlcHRpb25zLmFkZChyZSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRG9jdW1lbnQgYmFzZWQgY2hhcmFjdGVyIHNlcXVlbmNlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIERvY3VtZW50Q2hhclNlcXVlbmNlIGltcGxlbWVudHMgQ2hhclNlcXVlbmNlIHsKLQotCQkvKiogRG9jdW1lbnQgKi8KLQkJcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCi0JCS8qKgotCQkgKiBJbml0aWFsaXplIHdpdGggdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGdpdmVuCi0JCSAqIGRvY3VtZW50LgotCQkgKgotCQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50Ci0JCSAqLwotCQlwdWJsaWMgRG9jdW1lbnRDaGFyU2VxdWVuY2UoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCQlmRG9jdW1lbnQ9IGRvY3VtZW50OwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlI2xlbmd0aCgpCi0JCSAqLwotCQlwdWJsaWMgaW50IGxlbmd0aCgpIHsKLQkJCXJldHVybiBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UjY2hhckF0KGludCkKLQkJICovCi0JCXB1YmxpYyBjaGFyIGNoYXJBdChpbnQgaW5kZXgpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZEb2N1bWVudC5nZXRDaGFyKGluZGV4KTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbih4LmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ujc3ViU2VxdWVuY2UoaW50LCBpbnQpCi0JCSAqLwotCQlwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZkRvY3VtZW50LmdldChzdGFydCwgZW5kIC0gc3RhcnQpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKHguZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkTWFya2VyKFJlc291cmNlIHJlc291cmNlLCBVUkkgcHJveHlVUkksIFN0cmluZyBlcnJNc2csIFN0cmluZyBvd25lckdVSUQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlVUkkgY29udGFpbmVyVVJJID0gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoY29udGFpbmVyVVJJLnRvRmlsZVN0cmluZygpKTsKLQkJSUZpbGUgZmlsZSA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbG9jYXRpb24gPSBjb250YWluZXJVUkkgIT0gbnVsbCA/IGNvbnRhaW5lclVSSQotCQkJCQkudG9GaWxlU3RyaW5nKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQl0cnkgewotCQkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBudWxsKTsKLQkJCQkKLQkJCQkvLyBsb2NhdGUgdGhlIHRleHQgb2YgdW5yZXNvbHZlZCBVUkkgaW4gZmlsZQotCQkJCS8vCi0JCQkJSVRleHRGaWxlQnVmZmVyTWFuYWdlciBtYW5hZ2VyPSBGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKTsKLQkJCQl0cnkgewotCQkJCQltYW5hZ2VyLmNvbm5lY3QocGF0aCwgbW9uaXRvcik7Ci0JCQkJCUlUZXh0RmlsZUJ1ZmZlciBmaWxlQnVmZmVyPSBtYW5hZ2VyLmdldFRleHRGaWxlQnVmZmVyKHBhdGgpOwotCQkJCQlmaWxlQnVmZmVyLnJlcXVlc3RTeW5jaHJvbml6YXRpb25Db250ZXh0KCk7Ci0JCQkJCWZpbGVCdWZmZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJSURvY3VtZW50IGRvYyA9IGZpbGVCdWZmZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJaWYoZG9jICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBwcm94eVVSSVN0ciA9IHByb3h5VVJJLnRvU3RyaW5nKCk7Ci0JCQkJCQlQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuQ29uc3RydWN0b3IuY3JlYXRlUGF0dGVybihwcm94eVVSSVN0ciwgdHJ1ZSwgZmFsc2UpOwotCQkJCQkJTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKG5ldyBEb2N1bWVudENoYXJTZXF1ZW5jZShkb2MpKTsKLQkJCQkJCXdoaWxlKG1hdGNoZXIuZmluZCgpKSB7Ci0JCQkJCQkJaW50IHN0YXJ0ID0gbWF0Y2hlci5zdGFydCgpOwotCQkJCQkJCWludCBlbmQgPSBtYXRjaGVyLmVuZCgpOwotCQkJCQkJCWlmKHN0YXJ0ICE9IGVuZCkgewotCQkJCQkJCQkvLyBtYWtlIHN1cmUgdGhhdCByZXNvbHZlciBpcyBzdGlsbCBpbiB0aGUgb3BlbiBsaWJyYXJ5IGJ5IGNoZWNraW5nIHdoZXRoZXIgaXRzIHJlc291cmNlCi0JCQkJCQkJCS8vIHN0aWxsIGJlbG9uZ3MgdG8gYSByZXNvdXJjZSBzZXQKLQkJCQkJCQkJLy8KLQkJCQkJCQkJaWYocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpICE9IG51bGwpIHsKLQkJCQkJCQkJCS8vIGNyZWF0ZSBwcm9ibGVtIG1hcmtlciBmb3IgZmlsZQotCQkJCQkJCQkJSU1hcmtlciBtYXJrZXIgPSBmaW5kTWFya2VyKGZpbGUsIHByb3h5VVJJU3RyLCBzdGFydCwgZW5kKTsKLQkJCQkJCQkJCWlmKG1hcmtlciA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJbWFya2VyID0gZmlsZS5jcmVhdGVNYXJrZXIoSU1hcmtlci5QUk9CTEVNKTsKLQkJCQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksCi0JCQkJCQkJCQkJCQlJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLQkJCQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgZXJyTXNnKTsKLQkJCQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTE9DQVRJT04sIGxvY2F0aW9uKTsKLQkJCQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuVFJBTlNJRU5ULCB0cnVlKTsKLQkJCQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCwgc3RhcnQpOwkKLQkJCQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQsIGVuZCk7Ci0JCQkJCQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShQUk9YWV9VUkksIHByb3h5VVJJU3RyKTsKLQkJCQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKE9XTkVSX0dVSUQsIG93bmVyR1VJRCk7Ci0KLQkJCQkJCQkJCQkvLyBjYWNoZSBtYXJrZXIgdG8gaXQgY2FuIGJlIGZvdW5kIGVhc2lseSBhbmQgZGVsZXRlZAotCQkJCQkJCQkJCS8vCi0JCQkJCQkJCQkJY2FjaGVNYXJrZXIobWFya2VyLCBwcm94eVVSSSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQkvLyB1cGRhdGUgb3duZXIgR1VJRAotCQkJCQkJCQkJCS8vCi0JCQkJCQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShPV05FUl9HVUlELCBvd25lckdVSUQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWZpbGVCdWZmZXIucmVsZWFzZVN5bmNocm9uaXphdGlvbkNvbnRleHQoKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1hbmFnZXIuZGlzY29ubmVjdChwYXRoLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhleCk7Ci0JCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkTWFya2VyKFJlc29sdmVFeGNlcHRpb24gcmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJbnRlcm5hbEVPYmplY3QgcHJveHkgPSAoSW50ZXJuYWxFT2JqZWN0KSByZS5nZXRQcm94eSgpOwotCQlVUkkgY29udGFpbmVyVVJJID0gbnVsbDsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlpZihyZS5nZXRSZXNvbHZlcigpICE9IG51bGwpIHsKLQkJCXJlc291cmNlID0gcmUuZ2V0UmVzb2x2ZXIoKS5lUmVzb3VyY2UoKTsKLQkJCQotCQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVzb2x2ZXIgaXMgc3RpbGwgaW4gdGhlIG9wZW4gbGlicmFyeSBieSBjaGVja2luZyB3aGV0aGVyIGl0cyByZXNvdXJjZQotCQkJLy8gc3RpbGwgYmVsb25ncyB0byBhIHJlc291cmNlIHNldAotCQkJLy8KLS8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyLmFkZE1hcmtlcigpOiByZXNvdXJjZVNldD0iICsgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKS5oYXNoQ29kZSgpKTsKLQkJCWlmKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSAhPSBudWxsKSB7CQkJCQotCQkJCWNvbnRhaW5lclVSSSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJfQotCQl9CQkJCQotCQlpZiAoY29udGFpbmVyVVJJICE9IG51bGwpIHsKLQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGNvbnRhaW5lclVSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlJRmlsZSBmaWxlID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGVyck1zZzsKLQkJCQlpZiAocmUuZXhjZXB0aW9uKCkgIT0gbnVsbCAmJiByZS5leGNlcHRpb24oKS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkgIT0gbnVsbCAmJiAKLQkJCQkJCXJlLmV4Y2VwdGlvbigpLmdldExvY2FsaXplZE1lc3NhZ2UoKS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWVyck1zZyA9IHJlLmV4Y2VwdGlvbigpLmdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWVyck1zZyA9IHJlLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMuVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcl9jb3VsZE5vdFJlc29sdmVQcm94eSwgcHJveHkuZVByb3h5VVJJKCkpIDogcmUKLQkJCQkJCQkJLmdldE1lc3NhZ2UoKTsKLQkJCQl9Ci0JCQkJYWRkTWFya2VyKHJlc291cmNlLCBwcm94eS5lUHJveHlVUkkoKSwgZXJyTXNnLCBNdWx0aUZpbGVTYXZlVXRpbC5nZXRHdWlkKHJlLmdldFJlc29sdmVyKCkpLCBtb25pdG9yKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtYXJrZXIKLQkgKiBAcGFyYW0gdXJpIHByb3h5IHVyaSAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2FjaGVNYXJrZXIoSU1hcmtlciBtYXJrZXIsIFVSSSB1cmkpIHsKLQkJc3luY2hyb25pemVkKGVsZW1lbnRHVUlUb01hcmtlcnNNYXApIHsKLQkJCVN0cmluZyByZXNvdXJjZUdVSUQgPSB1cmkuYXV0aG9yaXR5KCk7Ci0JCQlpZihyZXNvdXJjZUdVSUQgIT0gbnVsbCkgewotCQkJCVZhbGlkT2JqZWN0IHZvID0gKFZhbGlkT2JqZWN0KSByZXNvdXJjZUdVSVRvTWFya2Vyc01hcC5nZXQocmVzb3VyY2VHVUlEKTsKLQkJCQlpZih2byA9PSBudWxsKSB7Ci0JCQkJCXZvID0gbmV3IFZhbGlkT2JqZWN0KG5ldyBIYXNoU2V0KCkpOwotCQkJCQlyZXNvdXJjZUdVSVRvTWFya2Vyc01hcC5wdXQocmVzb3VyY2VHVUlELCB2byk7Ci0JCQkJfQotCQkJCUNvbGxlY3Rpb24gbWFya2VycyA9IChDb2xsZWN0aW9uKSB2by5vYmplY3Q7Ci0JCQkJbWFya2Vycy5hZGQobWFya2VyKTsKLQkJCX0KLQkJCVN0cmluZyBlbGVtZW50R1VJRCA9IHVyaS5mcmFnbWVudCgpOwotCQkJQ29sbGVjdGlvbiBtYXJrZXJzID0gKENvbGxlY3Rpb24pIGVsZW1lbnRHVUlUb01hcmtlcnNNYXAuZ2V0KGVsZW1lbnRHVUlEKTsKLQkJCWlmKG1hcmtlcnMgPT0gbnVsbCkgewotCQkJCW1hcmtlcnMgPSBuZXcgSGFzaFNldCgpOwotCQkJCWVsZW1lbnRHVUlUb01hcmtlcnNNYXAucHV0KGVsZW1lbnRHVUlELCBtYXJrZXJzKTsKLQkJCX0KLQkJCW1hcmtlcnMuYWRkKG5ldyBWYWxpZE9iamVjdChtYXJrZXIpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyQWxsKCkgewotCQlib29sZWFuIG9sZEVuYWJsZWQgPSBlbmFibGVkOwotCQl0cnkgewotCQkJZW5hYmxlZCA9IGZhbHNlOwotCQkJY2FuY2VsKCk7Ci0KLQkJCXN5bmNocm9uaXplZCAoZXhjZXB0aW9ucykgewotCQkJCXVyaVRvRXhjZXB0aW9uc01hcC5jbGVhcigpOwotCQkJCWV4Y2VwdGlvbnMuY2xlYXIoKTsKLQkJCX0KLQkJCXN5bmNocm9uaXplZChlbGVtZW50R1VJVG9NYXJrZXJzTWFwKSB7Ci0JCQkJaWYoIWVsZW1lbnRHVUlUb01hcmtlcnNNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRHVUlUb01hcmtlcnNNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlDb2xsZWN0aW9uIG1hcmtlcnMgPSAoQ29sbGVjdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gbWFya2Vycy5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJVmFsaWRPYmplY3Qgdm8gPSAoVmFsaWRPYmplY3QpIGl0ZXIxLm5leHQoKTsKLQkJCQkJCQlJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKSB2by5vYmplY3Q7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJaWYobWFya2VyLmV4aXN0cygpKSB7Ci0JCQkJCQkJCQltYXJrZXIuZGVsZXRlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQltYXJrZXJzLmNsZWFyKCk7Ci0JCQkJCX0KLQkJCQkJZWxlbWVudEdVSVRvTWFya2Vyc01hcC5jbGVhcigpOwotCQkJCQlyZXNvdXJjZUdVSVRvTWFya2Vyc01hcC5jbGVhcigpOwotCQkJCX0JCi0JCQl9Ci0JCQlzeW5jaHJvbml6ZWQocmVzb3VyY2VzVG9WYWxpZGF0ZU1hcmtlcnMpIHsKLQkJCQlyZXNvdXJjZXNUb1ZhbGlkYXRlTWFya2Vycy5jbGVhcigpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJZW5hYmxlZCA9IG9sZEVuYWJsZWQ7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlci5jbGVhckFsbCgpOiBlbmQiKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1VucmVzb2x2ZWRQcm94eSgpIHsKLQkJcmV0dXJuICFlbGVtZW50R1VJVG9NYXJrZXJzTWFwLmlzRW1wdHkoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBSZXNvbHZlRXhjZXB0aW9uIG5leHRFeGNlcHRpb24oKSB7Ci0JCXN5bmNocm9uaXplZChleGNlcHRpb25zKSB7CQkJCi0JCQkvLyBzeW5jaHJvbml6ZWQ6IGluIG9yZGVyIHRvIGF0b21pY2FsbHkgb2J0YWluIGFuZCBjbGVhciByZXF1ZXN0cwotCQkJaWYoZXhjZXB0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVJlc29sdmVFeGNlcHRpb24gZSA9IChSZXNvbHZlRXhjZXB0aW9uKSB0aGlzLmV4Y2VwdGlvbnMucmVtb3ZlKDApOwotCQkJCVVSSSB1cmkgPSAoKEludGVybmFsRU9iamVjdCllLmdldFByb3h5KCkpLmVQcm94eVVSSSgpOwotCQkJCUNvbGxlY3Rpb24gZXhjZXB0aW9ucyA9IChDb2xsZWN0aW9uKSB1cmlUb0V4Y2VwdGlvbnNNYXAuZ2V0KHVyaSk7Ci0JCQkJaWYoZXhjZXB0aW9ucyAhPSBudWxsKSB7Ci0JCQkJCWV4Y2VwdGlvbnMucmVtb3ZlKGUpOwotCQkJCQlpZihleGNlcHRpb25zLmlzRW1wdHkoKSkgewotCQkJCQkJdXJpVG9FeGNlcHRpb25zTWFwLnJlbW92ZSh1cmkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBlOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgUmVzb3VyY2UgbmV4dFJlc291cmNlVG9WYWxpZGF0ZU1hcmtlcnMoKSB7Ci0JCXN5bmNocm9uaXplZChyZXNvdXJjZXNUb1ZhbGlkYXRlTWFya2VycykgewotCQkJaWYocmVzb3VyY2VzVG9WYWxpZGF0ZU1hcmtlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gKFJlc291cmNlKSByZXNvdXJjZXNUb1ZhbGlkYXRlTWFya2Vycy5yZW1vdmUoMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iI3J1bkluV29ya3NwYWNlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlci5ydW5JbldvcmtzcGFjZSgpOiBiZWdpbiIpOwotCQl0cnkgewotCQlpZighZW5hYmxlZCkgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0KLQkJdHJ5IHsKLQkJCS8vIGFkZCBtYXJrZXJzCi0JCQkvLwotCQkJUmVzb2x2ZUV4Y2VwdGlvbiByZTsKLQkJCXdoaWxlKChyZSA9IG5leHRFeGNlcHRpb24oKSkgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWFkZE1hcmtlcihyZSwgbW9uaXRvcik7Ci0JCQkJfQotCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyByZW1vdmUgaW52YWxpZCBtYXJrZXJzCi0JCQkvLwotCQkJcmVtb3ZlTWFya2Vycyhtb25pdG9yKTsKLQkJCQotCQkJLy8gdmFsaWRhdGUgcmVzb3VyY2UgbWFya2VycwotCQkJLy8KLQkJCVJlc291cmNlIHJlc291cmNlOwotCQkJd2hpbGUoKHJlc291cmNlID0gbmV4dFJlc291cmNlVG9WYWxpZGF0ZU1hcmtlcnMoKSkgIT0gbnVsbCkgewotCQkJCWRvVmFsaWRhdGVNYXJrZXJzKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJfQotCQkKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJZmluYWxseSB7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlci5ydW5JbldvcmtzcGFjZSgpOiBlbmQiKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gcmVtb3ZlRnJvbVJlc291cmNlR1VJRFRvTWFya2Vyc01hcChTdHJpbmcgcHJveHlVUkksIElNYXJrZXIgbWFya2VyKSB7Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHByb3h5VVJJKTsKLQkJU3RyaW5nIHJlc291cmNlR1VJRCA9IHVyaS5hdXRob3JpdHkoKTsKLQkJaWYocmVzb3VyY2VHVUlEICE9IG51bGwpIHsKLQkJCVZhbGlkT2JqZWN0IHZvID0gKFZhbGlkT2JqZWN0KSByZXNvdXJjZUdVSVRvTWFya2Vyc01hcC5nZXQocmVzb3VyY2VHVUlEKTsKLQkJCWlmKHZvICE9IG51bGwpIHsKLQkJCQlDb2xsZWN0aW9uIG1hcmtlcnMgPSAoKENvbGxlY3Rpb24pdm8ub2JqZWN0KTsKLQkJCQlib29sZWFuIHJldCA9IG1hcmtlcnMucmVtb3ZlKG1hcmtlcik7Ci0JCQkJaWYobWFya2Vycy5pc0VtcHR5KCkpIHsKLQkJCQkJcmVzb3VyY2VHVUlUb01hcmtlcnNNYXAucmVtb3ZlKHJlc291cmNlR1VJRCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlRnJvbUVsZW1lbnRHVUlEVG9NYXJrZXJzTWFwKFN0cmluZyBwcm94eVVSSSwgSU1hcmtlciBtYXJrZXIpIHsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkocHJveHlVUkkpOwotCQlTdHJpbmcgZWxlbWVudEdVSUQgPSB1cmkuZnJhZ21lbnQoKTsKLQkJaWYoZWxlbWVudEdVSUQgIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiB2YWxpZE9iamVjdHMgPSAoQ29sbGVjdGlvbikgZWxlbWVudEdVSVRvTWFya2Vyc01hcC5nZXQoZWxlbWVudEdVSUQpOwotCQkJaWYodmFsaWRPYmplY3RzICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMSA9IHZhbGlkT2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyYXRvcjEKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlWYWxpZE9iamVjdCB2bzEgPSAoVmFsaWRPYmplY3QpIGl0ZXJhdG9yMS5uZXh0KCk7Ci0JCQkJCWlmKHZvMS5vYmplY3QgPT0gbWFya2VyKSB7Ci0JCQkJCQlpdGVyYXRvcjEucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYodmFsaWRPYmplY3RzLmlzRW1wdHkoKSkgewotCQkJCQllbGVtZW50R1VJVG9NYXJrZXJzTWFwLnJlbW92ZShlbGVtZW50R1VJRCk7Ci0JCQkJfQkKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlTWFya2VycyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc3luY2hyb25pemVkKGVsZW1lbnRHVUlUb01hcmtlcnNNYXApIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudEdVSVRvTWFya2Vyc01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUNvbGxlY3Rpb24gbWFya2VycyA9IChDb2xsZWN0aW9uKSBpdGVyLm5leHQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtYXJrZXJzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlWYWxpZE9iamVjdCB2byA9IChWYWxpZE9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKCF2by52YWxpZCkgewotCQkJCQl0cnkgewotCQkJCQkJSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgdm8ub2JqZWN0OwotCQkJCQkJaWYobWFya2VyLmV4aXN0cygpKSB7Ci0JCQkJCQkJU3RyaW5nIHByb3h5VVJJID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShQUk9YWV9VUkkpOwotCi0JCQkJCQkJbWFya2VyLmRlbGV0ZSgpOwotCi0JCQkJCQkJLy8gcmVtb3ZlIHRoaXMgbWFya2VyIGZyb20gcmVzb3VyY2VHVUlUb01hcmtlcnNNYXAKLQkJCQkJCQkvLwotCQkJCQkJCXJlbW92ZUZyb21SZXNvdXJjZUdVSURUb01hcmtlcnNNYXAocHJveHlVUkksIG1hcmtlcik7Ci0JCQkJCQl9Ci0JCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZUdVSVRvTWFya2Vyc01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVZhbGlkT2JqZWN0IHZvID0gKFZhbGlkT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKCF2by52YWxpZCkgewotCQkJCXZvLnZhbGlkID0gdHJ1ZTsKLQkJCQlDb2xsZWN0aW9uIG1hcmtlcnMgPSAoQ29sbGVjdGlvbikgdm8ub2JqZWN0OwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtYXJrZXJzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJSU1hcmtlciBtYXJrZXI7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltYXJrZXIgPSAoSU1hcmtlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYobWFya2VyLmV4aXN0cygpKSB7Ci0JCQkJCQkJU3RyaW5nIHByb3h5VVJJU3RyID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShQUk9YWV9VUkkpOwotCQkJCQkJCVVSSSBwcm94eVVSSSA9IFVSSS5jcmVhdGVVUkkocHJveHlVUklTdHIpOwotCi0JCQkJCQkJLy8gcHJveHkgaXMgaW4gdGhlIHNhbWUgcmVzb3VyY2UgdGhhdCBpcyBqdXN0IGxvYWRlZCAKLQkJCQkJCQkvLyB0cnkgdG8gZ2V0IHRoZSBvYmplY3Qgd2l0aCB0aGlzIHByb3h5IFVSSSB3aXRob3V0IGxvYWRpbmcgbmV3IHJlc291cmNlCi0JCQkJCQkJLy8KLS8vCQkJCQkJCUVPYmplY3QgbyA9IHJlc291cmNlU2V0LmdldEVPYmplY3QocHJveHlVUkksIGZhbHNlKTsKLQkJCQkJCQlTdHJpbmcgZWxlbWVudEdVSUQgPSBwcm94eVVSSS5mcmFnbWVudCgpOwkJCQkJCQkKLQkJCQkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpcmVzb3VyY2VTZXQpLmdldEd1aWRUb01ldGhvZEVsZW1lbnRNYXAoKS5nZXQoZWxlbWVudEdVSUQpOwotCQkJCQkJCWlmKG8gIT0gbnVsbCAmJiAhby5lSXNQcm94eSgpKSB7Ci0JCQkJCQkJCW1hcmtlci5kZWxldGUoKTsKLQkJCQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7CQotCi0JCQkJCQkJCS8vIHJlbW92ZSB0aGlzIG1hcmtlciBmcm9tIGVsZW1lbnRHVUlUb01hcmtlcnNNYXAKLQkJCQkJCQkJLy8KLQkJCQkJCQkJcmVtb3ZlRnJvbUVsZW1lbnRHVUlEVG9NYXJrZXJzTWFwKHByb3h5VVJJU3RyLCBtYXJrZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKG1hcmtlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklQcm94eVJlc29sdXRpb25MaXN0ZW5lciNub3RpZnlFeGNlcHRpb24oamF2YS5sYW5nLkV4Y2VwdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQkJaWYoIWVuYWJsZWQpIHJldHVybjsKLQkJCi0JCWlmKGUgaW5zdGFuY2VvZiBSZXNvbHZlRXhjZXB0aW9uKSB7Ci0JCQlSZXNvbHZlRXhjZXB0aW9uIHJlID0gKFJlc29sdmVFeGNlcHRpb24pIGU7Ci0JCQkKLS8vCQkJVVJJIHVyaSA9ICgoSW50ZXJuYWxFT2JqZWN0KXJlLmdldFByb3h5KCkpLmVQcm94eVVSSSgpOwotLy8JCQlpZigiXzJKNFlvUFRERWRta3BZQVJOTjQ2OEEiLmVxdWFscyh1cmkuZnJhZ21lbnQoKSkpIHsKLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotLy8JCQl9Ci0JCQkKLQkJCWlmKGFkZEV4Y2VwdGlvbihyZSkpIHsJCQkKLQkJCQlzY2hlZHVsZShERUxBWSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklQcm94eVJlc29sdXRpb25MaXN0ZW5lciNwcm94eVJlc29sdmVkKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChPYmplY3QgcHJveHksIE9iamVjdCByZXNvbHZlZCkgewotCQlpZighZW5hYmxlZCkgcmV0dXJuOwotCQkKLQkJaWYocHJveHkgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpIHsKLQkJCVVSSSB1cmkgPSAoKEludGVybmFsRU9iamVjdClwcm94eSkuZVByb3h5VVJJKCk7Ci0JCQkKLS8vCQkJaWYoIl8ySjRZb1BUREVkbWtwWUFSTk40NjhBIi5lcXVhbHModXJpLmZyYWdtZW50KCkpKSB7Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLS8vCQkJfQotCQkJCi0JCQkvLyByZW1vdmUgYWxsIGV4Y2VwdGlvbnMgZm9yIHRoaXMgVVJJCi0JCQkvLwotCQkJcmVtb3ZlRXhjZXB0aW9ucyh1cmkpOwotCQkJCi0JCQkvLyBpbnZhbGlkYXRlIGFsbCBtYXJrZXJzIGZvciB0aGlzIFVSSQotCQkJLy8KLQkJCWlmKGludmFsaWRhdGVNYXJrZXJzKHVyaSkpIHsKLQkJCQlzY2hlZHVsZShERUxBWSk7Ci0JCQl9CQkJCQkJCi0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gdXJpCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGludmFsaWRhdGVNYXJrZXJzKFVSSSB1cmkpIHsKLQkJc3luY2hyb25pemVkKGVsZW1lbnRHVUlUb01hcmtlcnNNYXApIHsKLQkJCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCQlTdHJpbmcgcmVzb3VyY2VHVUlEID0gdXJpLmF1dGhvcml0eSgpOwotCQkJaWYocmVzb3VyY2VHVUlEICE9IG51bGwpIHsKLQkJCQlWYWxpZE9iamVjdCB2byA9IChWYWxpZE9iamVjdCkgcmVzb3VyY2VHVUlUb01hcmtlcnNNYXAuZ2V0KHJlc291cmNlR1VJRCk7Ci0JCQkJaWYodm8gIT0gbnVsbCkgewotCQkJCQl2by52YWxpZCA9IGZhbHNlOwotCQkJCQlyZXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyBlbGVtZW50R1VJRCA9IHVyaS5mcmFnbWVudCgpOwotCQkJaWYoZWxlbWVudEdVSUQgIT0gbnVsbCkgewotCQkJCUNvbGxlY3Rpb24gbWFya2VycyA9IChDb2xsZWN0aW9uKSBlbGVtZW50R1VJVG9NYXJrZXJzTWFwLmdldChlbGVtZW50R1VJRCk7Ci0JCQkJaWYobWFya2VycyAhPSBudWxsICYmICFtYXJrZXJzLmlzRW1wdHkoKSkgewotCQkJCQlyZXQgPSB0cnVlOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYXJrZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJVmFsaWRPYmplY3Qgdm8gPSAoVmFsaWRPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQkJdm8udmFsaWQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdXJpCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUV4Y2VwdGlvbnMoVVJJIHVyaSkgewotCQlzeW5jaHJvbml6ZWQgKGV4Y2VwdGlvbnMpIHsKLQkJCUNvbGxlY3Rpb24gZXhjZXB0aW9ucyA9IChDb2xsZWN0aW9uKSB1cmlUb0V4Y2VwdGlvbnNNYXAuZ2V0KHVyaSk7Ci0JCQlpZihleGNlcHRpb25zID09IG51bGwgfHwgZXhjZXB0aW9ucy5pc0VtcHR5KCkpIHJldHVybjsKLQkJCXRoaXMuZXhjZXB0aW9ucy5yZW1vdmVBbGwoZXhjZXB0aW9ucyk7Ci0JCQl1cmlUb0V4Y2VwdGlvbnNNYXAucmVtb3ZlKHVyaSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgbWFya2VycyBmb3IgdW5yZXNvbHZlZCBwcm94aWVzIG9mIHRoZSBnaXZlbiByZXNvdXJjZQotCSAqICAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhck1hcmtlcnMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJdHJ5IHsKLQkJCUlSZXNvdXJjZSBmaWxlID0gRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlpZihmaWxlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQlJTWFya2VyW10gbWFya2VycyA9IGZpbGUuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCXJlbW92ZU1hcmtlcihtYXJrZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZU1hcmtlcihJTWFya2VyIG1hcmtlcikgewotCQlTdHJpbmcgcHJveHlVUkkgPSBudWxsOwotCQl0cnkgewotCQkJaWYobWFya2VyLmV4aXN0cygpKSB7Ci0JCQkJcHJveHlVUkkgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKFBST1hZX1VSSSk7Ci0JCQkJbWFya2VyLmRlbGV0ZSgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCWlmKHByb3h5VVJJICE9IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZChlbGVtZW50R1VJVG9NYXJrZXJzTWFwKSB7Ci0JCQkJcmVtb3ZlRnJvbUVsZW1lbnRHVUlEVG9NYXJrZXJzTWFwKHByb3h5VVJJLCBtYXJrZXIpOwotCQkJCXJlbW92ZUZyb21SZXNvdXJjZUdVSURUb01hcmtlcnNNYXAocHJveHlVUkksIG1hcmtlcik7Ci0JCQl9Ci0JCX0JCQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1hcmtlckluZm8gewotCQlTdHJpbmcgcHJveHlVUkk7Ci0JCVN0cmluZyBvd25lckdVSUQ7Ci0JCVN0cmluZyBtZXNzYWdlOwotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYob2JqIGluc3RhbmNlb2YgTWFya2VySW5mbykgewotCQkJCU1hcmtlckluZm8gaW5mbyA9IChNYXJrZXJJbmZvKSBvYmo7Ci0JCQkJaWYocHJveHlVUkkgIT0gbnVsbCAmJiBvd25lckdVSUQgIT0gbnVsbCAmJiBwcm94eVVSSS5lcXVhbHMoaW5mby5wcm94eVVSSSkgJiYgb3duZXJHVUlELmVxdWFscyhpbmZvLm93bmVyR1VJRCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFZhbGlkYXRlcyBtYXJrZXJzIGZvciB1bnJlc29sdmVkIHByb3hpZXMgb2YgdGhlIGdpdmVuIHJlc291cmNlCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNYXJrZXJzKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWJvb2xlYW4gbmV3bHlBZGRlZCA9IGZhbHNlOwotCQlzeW5jaHJvbml6ZWQocmVzb3VyY2VzVG9WYWxpZGF0ZU1hcmtlcnMpIHsKLQkJCW5ld2x5QWRkZWQgPSByZXNvdXJjZXNUb1ZhbGlkYXRlTWFya2Vycy5hZGQocmVzb3VyY2UpOwotCQl9Ci0JCWlmKG5ld2x5QWRkZWQpIHsKLQkJCXNjaGVkdWxlKERFTEFZKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZG9WYWxpZGF0ZU1hcmtlcnMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJdHJ5IHsKLQkJCUlSZXNvdXJjZSBmaWxlID0gRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlpZihmaWxlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQlJTWFya2VyW10gbWFya2VycyA9IGZpbGUuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCUhhc2hTZXQgbWFya2VySW5mb3MgPSBuZXcgSGFzaFNldCgpOwkJCQkKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJCQlTdHJpbmcgcHJveHlVUkkgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKFBST1hZX1VSSSk7Ci0JCQkJCWlmKHByb3h5VVJJICE9IG51bGwpIHsKLQkJCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHByb3h5VVJJKTsKLQkJCQkJCS8vIHRyeSB0byBnZXQgdGhlIG9iamVjdCB3aXRoIHRoaXMgcHJveHkgVVJJIHdpdGhvdXQgbG9hZGluZyBuZXcgcmVzb3VyY2UKLQkJCQkJCS8vCi0JCQkJCQlTdHJpbmcgZWxlbWVudEdVSUQgPSB1cmkuZnJhZ21lbnQoKTsJCQkJCQkJCi0JCQkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpcmVzb3VyY2VTZXQpLmdldEd1aWRUb01ldGhvZEVsZW1lbnRNYXAoKS5nZXQoZWxlbWVudEdVSUQpOwotCQkJCQkJaWYobyA9PSBudWxsIHx8IG8uZUlzUHJveHkoKSkgewotCQkJCQkJCU1hcmtlckluZm8gaW5mbyA9IG5ldyBNYXJrZXJJbmZvKCk7Ci0JCQkJCQkJaW5mby5tZXNzYWdlID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpOwotCQkJCQkJCWluZm8ub3duZXJHVUlEID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShPV05FUl9HVUlEKTsKLQkJCQkJCQlpbmZvLnByb3h5VVJJID0gcHJveHlVUkk7Ci0JCQkJCQkJbWFya2VySW5mb3MuYWRkKGluZm8pOwkJCQkJCQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZihtYXJrZXIuZXhpc3RzKCkpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQltYXJrZXIuZGVsZXRlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsJCQkJCQkJCQkKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlzeW5jaHJvbml6ZWQoZWxlbWVudEdVSVRvTWFya2Vyc01hcCkgewotCQkJCQkJCXJlbW92ZUZyb21FbGVtZW50R1VJRFRvTWFya2Vyc01hcChwcm94eVVSSSwgbWFya2VyKTsKLQkJCQkJCQlyZW1vdmVGcm9tUmVzb3VyY2VHVUlEVG9NYXJrZXJzTWFwKHByb3h5VVJJLCBtYXJrZXIpOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYoIW1hcmtlckluZm9zLmlzRW1wdHkoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYXJrZXJJbmZvcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU1hcmtlckluZm8gaW5mbyA9IChNYXJrZXJJbmZvKSBpdGVyLm5leHQoKTsKLQkJCQkJCWFkZE1hcmtlcihyZXNvdXJjZSwgVVJJLmNyZWF0ZVVSSShpbmZvLnByb3h5VVJJKSwgaW5mby5tZXNzYWdlLCBpbmZvLm93bmVyR1VJRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsJCQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRiM2ZhMDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgcGVyc2lzdGluZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OTRjMjM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZSBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IjZ2V0VXJpIDxlbT5Vcmk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSNnZXRSZXNvdXJjZURlc2NyaXB0b3IoKQotICogQG1vZGVsCi0gKiBAZXh0ZW5kcyBFRGF0YU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlRGVzY3JpcHRvciBleHRlbmRzIEVEYXRhT2JqZWN0IHsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSNnZXRSZXNvdXJjZURlc2NyaXB0b3JfSWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Vcmk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXJpPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVcmkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlI2dldFJlc291cmNlRGVzY3JpcHRvcl9VcmkoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBTdHJpbmcgZ2V0VXJpKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciNnZXRVcmkgPGVtPlVyaTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXJpPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICB2b2lkIHNldFVyaShTdHJpbmcgdmFsdWUpOwotCi0gICAgVVJJIGdldFJlc29sdmVkVVJJKCk7Ci0gICAgCi0gICAgdm9pZCBzZXRSZXNvbHZlZFVSSShVUkkgdXJpKTsKLQkKLQkvKioKLQkgKiBDbGVhcnMgdGhlIHJlc29sdmVkIFVSSSB0aGF0IGhhcyBiZWVuIGNhY2hlZCBpbiBwcmV2aW91cyBjYWxsZWQgb2YgZ2V0UmVzb2x2ZWRVUkkoKQotCSAqIHNvIHRoZSBuZXh0IGNhbGwgdG8gZ2V0UmVzb2x2ZWRVUkkoKSB3aWxsIHVwZGF0ZSB0aGUgcmVzb2x2ZWRVUkkuCi0JICoKLQkgKi8KLQl2b2lkIGNsZWFyUmVzb2x2ZWRVUkkoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQxN2ZiMTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlIE1hbmFnZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0R3VpZCA8ZW0+R3VpZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0VXJpQmFzZSA8ZW0+VXJpIEJhc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFN1Yk1hbmFnZXJzIDxlbT5TdWIgTWFuYWdlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFJlc291cmNlRGVzY3JpcHRvcnMgPGVtPlJlc291cmNlIERlc2NyaXB0b3JzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2UjZ2V0UmVzb3VyY2VNYW5hZ2VyKCkKLSAqIEBtb2RlbAotICogQGV4dGVuZHMgRURhdGFPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZU1hbmFnZXIgZXh0ZW5kcyBFRGF0YU9iamVjdCB7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3VpZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HdWlkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRHdWlkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSNnZXRSZXNvdXJjZU1hbmFnZXJfR3VpZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRHdWlkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNnZXRHdWlkIDxlbT5HdWlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HdWlkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRHdWlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHdWlkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VcmkgQmFzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXJpIEJhc2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXJpIEJhc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVyaUJhc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlI2dldFJlc291cmNlTWFuYWdlcl9VcmlCYXNlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFVyaUJhc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFVyaUJhc2UgPGVtPlVyaSBCYXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VcmkgQmFzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VXJpQmFzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXJpQmFzZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIE1hbmFnZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIE1hbmFnZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIE1hbmFnZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlI2dldFJlc291cmNlTWFuYWdlcl9TdWJNYW5hZ2VycygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U3ViTWFuYWdlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIERlc2NyaXB0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSNnZXRSZXNvdXJjZU1hbmFnZXJfUmVzb3VyY2VEZXNjcmlwdG9ycygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIExpc3QgZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBHZXRzIGRpcmVjdCBSZXNvdXJjZURlc2NyaXB0b3Igd2hvc2UgaWQgaXMgdGhlIGdpdmVuIGd1aWQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlc291cmNlRGVzY3JpcHRvciBnZXRSZXNvdXJjZURlc2NyaXB0b3IoU3RyaW5nIGd1aWQpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgUmVzb3VyY2VEZXNjcmlwdG9yIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHVyaS4gSWYgY2xlYXJGb2xkZXIgaXMgdHJ1ZSwgdGhpcyBjYWxsIHdpbGwgcmVtb3ZlCi0gICAgICogYWxsIG90aGVyIFJlc291cmNlRGVzY3JpcHRvcnMgd2hvc2UgVVJJIHNoYXJlcyB0aGUgc2FtZSBmb2xkZXIgb2YgdGhlIGdpdmVuIHVyaS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICogQHBhcmFtIGNsZWFyRm9sZGVyCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIExpc3QgcmVtb3ZlUmVzb3VyY2VEZXNjcmlwdG9yKFVSSSB1cmksIGJvb2xlYW4gY2xlYXJGb2xkZXIpOwotCi0Jdm9pZCBkaXNwb3NlKCk7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlbWFuYWdlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ODg2Y2FjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBSZXNvdXJjZURlc2NyaXB0b3IgY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlIE1hbmFnZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlIE1hbmFnZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFJlc291cmNlTWFuYWdlciBjcmVhdGVSZXNvdXJjZU1hbmFnZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSBnZXRSZXNvdXJjZW1hbmFnZXJQYWNrYWdlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9SZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAzZTE5YWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9SZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFN0cmluZyBlTkFNRSA9ICJyZXNvdXJjZW1hbmFnZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VEZXNjcmlwdG9ySW1wbCA8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZURlc2NyaXB0b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwjZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgaW50IFJFU09VUkNFX0RFU0NSSVBUT1IgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgUkVTT1VSQ0VfREVTQ1JJUFRPUl9fSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVyaTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IFJFU09VUkNFX0RFU0NSSVBUT1JfX1VSSSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBSRVNPVVJDRV9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VNYW5hZ2VySW1wbCA8ZW0+UmVzb3VyY2UgTWFuYWdlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZU1hbmFnZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwjZ2V0UmVzb3VyY2VNYW5hZ2VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgaW50IFJFU09VUkNFX01BTkFHRVIgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9NQU5BR0VSX19HVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcmkgQmFzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX01BTkFHRVJfX1VSSV9CQVNFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWIgTWFuYWdlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX01BTkFHRVJfX1NVQl9NQU5BR0VSUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRGVzY3JpcHRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IFJFU09VUkNFX01BTkFHRVJfX1JFU09VUkNFX0RFU0NSSVBUT1JTID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBNYW5hZ2VyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IFJFU09VUkNFX01BTkFHRVJfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yIDxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlc291cmNlIERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQ2xhc3MgZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VEZXNjcmlwdG9yX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yI2dldFVyaSA8ZW0+VXJpPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXJpPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IjZ2V0VXJpKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQXR0cmlidXRlIGdldFJlc291cmNlRGVzY3JpcHRvcl9VcmkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyIDxlbT5SZXNvdXJjZSBNYW5hZ2VyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlc291cmNlIE1hbmFnZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQ2xhc3MgZ2V0UmVzb3VyY2VNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldEd1aWQgPGVtPkd1aWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HdWlkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0R3VpZCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VNYW5hZ2VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZU1hbmFnZXJfR3VpZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNnZXRVcmlCYXNlIDxlbT5VcmkgQmFzZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVyaSBCYXNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0VXJpQmFzZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VNYW5hZ2VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZU1hbmFnZXJfVXJpQmFzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFN1Yk1hbmFnZXJzIDxlbT5TdWIgTWFuYWdlcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YiBNYW5hZ2VyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFN1Yk1hbmFnZXJzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZU1hbmFnZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlTWFuYWdlcl9TdWJNYW5hZ2VycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFJlc291cmNlRGVzY3JpcHRvcnMgPGVtPlJlc291cmNlIERlc2NyaXB0b3JzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFJlc291cmNlRGVzY3JpcHRvcnMoKQotCSAqIEBzZWUgI2dldFJlc291cmNlTWFuYWdlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VNYW5hZ2VyX1Jlc291cmNlRGVzY3JpcHRvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFJlc291cmNlbWFuYWdlckZhY3RvcnkgZ2V0UmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzICB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlRGVzY3JpcHRvckltcGwgPGVtPlJlc291cmNlIERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VEZXNjcmlwdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbCNnZXRSZXNvdXJjZURlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVTT1VSQ0VfREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZURlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfREVTQ1JJUFRPUl9fSUQgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9ERVNDUklQVE9SX19VUkkgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yX1VyaSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlTWFuYWdlckltcGwgPGVtPlJlc291cmNlIE1hbmFnZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VNYW5hZ2VySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbCNnZXRSZXNvdXJjZU1hbmFnZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVTT1VSQ0VfTUFOQUdFUiA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZU1hbmFnZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9NQU5BR0VSX19HVUlEID0gZUlOU1RBTkNFLmdldFJlc291cmNlTWFuYWdlcl9HdWlkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VcmkgQmFzZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX01BTkFHRVJfX1VSSV9CQVNFID0gZUlOU1RBTkNFLmdldFJlc291cmNlTWFuYWdlcl9VcmlCYXNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgTWFuYWdlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFU09VUkNFX01BTkFHRVJfX1NVQl9NQU5BR0VSUyA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZU1hbmFnZXJfU3ViTWFuYWdlcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIERlc2NyaXB0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBSRVNPVVJDRV9NQU5BR0VSX19SRVNPVVJDRV9ERVNDUklQVE9SUyA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZU1hbmFnZXJfUmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VEZXNjcmlwdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL1Jlc291cmNlRGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDU3Yjg4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VEZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZSBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VEZXNjcmlwdG9ySW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZURlc2NyaXB0b3JJbXBsI2dldFVyaSA8ZW0+VXJpPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VEZXNjcmlwdG9ySW1wbCBleHRlbmRzIE11bHRpUmVzb3VyY2VFT2JqZWN0IGltcGxlbWVudHMgUmVzb3VyY2VEZXNjcmlwdG9yIHsKLQkKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTY3MjUwODI2NjIzODU0NjJMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXJpKCkgPGVtPlVyaTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXJpKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXJpKCkgPGVtPlVyaTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXJpKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHVyaSA9IFVSSV9FREVGQVVMVDsKLQotCXByb3RlY3RlZCBVUkkgcmVzb2x2ZWRVUkk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgUmVzb3VyY2VEZXNjcmlwdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLSAgCi0gLy9VTUEtLT4KLSAJCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotIC8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLkxpdGVyYWxzLlJFU09VUkNFX0RFU0NSSVBUT1I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVyaSgpIHsKLQkJaWYocmVzb2x2ZWRVUkkgIT0gbnVsbCAmJiAodXJpID09IG51bGwgfHwgdXJpLnN0YXJ0c1dpdGgoIi4uLyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQl1cmkgPSByZXNvbHZlZFVSSS5kZXJlc29sdmUoTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkoZVJlc291cmNlKCkpKS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHZvaWQgc2V0VXJpKFN0cmluZyBuZXdVcmkpIHsKLQkJU3RyaW5nIG9sZFVyaSA9IHVyaTsKLQkJdXJpID0gbmV3VXJpOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1JfX1VSSSwgb2xkVXJpLCB1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfREVTQ1JJUFRPUl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfREVTQ1JJUFRPUl9fVVJJOgotCQkJCXJldHVybiBnZXRVcmkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1JfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SX19VUkk6Ci0JCQkJc2V0VXJpKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfREVTQ1JJUFRPUl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SX19VUkk6Ci0JCQkJc2V0VXJpKFVSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0vL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SX19VUkk6Ci0JCQkJcmV0dXJuIFVSSV9FREVGQVVMVCA9PSBudWxsID8gdXJpICE9IG51bGwgOiAhVVJJX0VERUZBVUxULmVxdWFscyh1cmkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVyaTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh1cmkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IjZ2V0VVJJKCkKLQkgKi8KLQlwdWJsaWMgVVJJIGdldFJlc29sdmVkVVJJKCkgewotCQlpZihyZXNvbHZlZFVSSSA9PSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVSZXNvdXJjZSgpOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCVVSSSBiYXNlID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkoZVJlc291cmNlKCkpOwotCQkJCXJlc29sdmVkVVJJID0gVVJJLmNyZWF0ZVVSSShnZXRVcmkoKSkucmVzb2x2ZShiYXNlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlc29sdmVkVVJJID0gVVJJLmNyZWF0ZVVSSShnZXRVcmkoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVkVVJJOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciNzZXRVUkkob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvbHZlZFVSSShVUkkgdXJpKSB7CQkKLQkJcmVzb2x2ZWRVUkkgPSB1cmk7Ci0JCVN0cmluZyBuZXdVcmkgPSBudWxsOwotCQlpZihyZXNvbHZlZFVSSSAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVSZXNvdXJjZSgpOwkKLQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlVUkkgYmFzZVVSSSA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEZpbmFsVVJJKHJlc291cmNlKTsKLQkJCQluZXdVcmkgPSByZXNvbHZlZFVSSS5kZXJlc29sdmUoYmFzZVVSSSkudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlzZXRVcmkobmV3VXJpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IjY2xlYXJSZXNvbHZlZFVSSSgpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXJSZXNvbHZlZFVSSSgpIHsKLQkJcmVzb2x2ZWRVUkkgPSBudWxsOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZU1hbmFnZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VNYW5hZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZjA2MmZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZU1hbmFnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2UgTWFuYWdlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlTWFuYWdlckltcGwjZ2V0R3VpZCA8ZW0+R3VpZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlTWFuYWdlckltcGwjZ2V0VXJpQmFzZSA8ZW0+VXJpIEJhc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZU1hbmFnZXJJbXBsI2dldFN1Yk1hbmFnZXJzIDxlbT5TdWIgTWFuYWdlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZU1hbmFnZXJJbXBsI2dldFJlc291cmNlRGVzY3JpcHRvcnMgPGVtPlJlc291cmNlIERlc2NyaXB0b3JzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VNYW5hZ2VySW1wbCBleHRlbmRzIE11bHRpUmVzb3VyY2VFT2JqZWN0IGltcGxlbWVudHMgUmVzb3VyY2VNYW5hZ2VyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTE2NDQ3MTQ3NTUwOTE2OTIwNEw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3VpZCgpIDxlbT5HdWlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHdWlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEd1aWQoKSA8ZW0+R3VpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3VpZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBndWlkID0gR1VJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmlCYXNlKCkgPGVtPlVyaSBCYXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmlCYXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfQkFTRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmlCYXNlKCkgPGVtPlVyaSBCYXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmlCYXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVyaUJhc2UgPSBVUklfQkFTRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1Yk1hbmFnZXJzKCkgPGVtPlN1YiBNYW5hZ2VyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJNYW5hZ2VycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHN1Yk1hbmFnZXJzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlRGVzY3JpcHRvcnMoKSA8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgcHJvdGVjdGVkIEVMaXN0IHJlc291cmNlRGVzY3JpcHRvcnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLSAgICBwcm90ZWN0ZWQgUmVzb3VyY2VNYW5hZ2VySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCWd1aWQgPSBVbWFVdGlsLmdlbmVyYXRlR1VJRCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5MaXRlcmFscy5SRVNPVVJDRV9NQU5BR0VSOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R3VpZCgpIHsKLQkJcmV0dXJuIGd1aWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R3VpZChTdHJpbmcgbmV3R3VpZCkgewotCQlTdHJpbmcgb2xkR3VpZCA9IGd1aWQ7Ci0JCWd1aWQgPSBuZXdHdWlkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX0dVSUQsIG9sZEd1aWQsIGd1aWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVyaUJhc2UoKSB7Ci0JCXJldHVybiB1cmlCYXNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVyaUJhc2UoU3RyaW5nIG5ld1VyaUJhc2UpIHsKLQkJU3RyaW5nIG9sZFVyaUJhc2UgPSB1cmlCYXNlOwotCQl1cmlCYXNlID0gbmV3VXJpQmFzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19VUklfQkFTRSwgb2xkVXJpQmFzZSwgdXJpQmFzZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFN1Yk1hbmFnZXJzKCkgewotCQlpZiAoc3ViTWFuYWdlcnMgPT0gbnVsbCkgewotCQkJc3ViTWFuYWdlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nKFJlc291cmNlTWFuYWdlci5jbGFzcywgdGhpcywgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19TVUJfTUFOQUdFUlMpOwotCQl9Ci0JCXJldHVybiBzdWJNYW5hZ2VyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkgewotCQlpZiAocmVzb3VyY2VEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZURlc2NyaXB0b3JzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZyhSZXNvdXJjZURlc2NyaXB0b3IuY2xhc3MsIHRoaXMsIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fUkVTT1VSQ0VfREVTQ1JJUFRPUlMpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChndWlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGd1aWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVyaUJhc2U6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodXJpQmFzZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8vCi0JLy8gU3RhcnQgY3VzdG9tIGNvZGUKLQkvLwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS51bWFmLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3QjZVJlc29sdmVQcm94eShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0KQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGVSZXNvbHZlUHJveHkoSW50ZXJuYWxFT2JqZWN0IHByb3h5KSB7Ci0JCXJldHVybiBzdXBlci5lUmVzb2x2ZVByb3h5KHByb3h5KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI3Jlc29sdmUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc29sdmUoKSB7Ci0JCVVSSSBiYXNlID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkoZVJlc291cmNlKCkpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBSZXNvdXJjZURlc2NyaXB0b3JJbXBsIGRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9ySW1wbCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBkZXNjLnJlc29sdmVkVVJJID0gVVJJLmNyZWF0ZVVSSShkZXNjLmdldFVyaSgpKS5yZXNvbHZlKGJhc2UpOwotICAgICAgICB9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2RlcmVzb2x2ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGVyZXNvbHZlKCkgewotCQlVUkkgYmFzZSA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEZpbmFsVVJJKGVSZXNvdXJjZSgpKTsKLSAgICAgICAgLy8gY29udmVydCBwYXRoIGluIGFsbCBkZXNjcmlwdG9ycyB0byByZWxhdGl2ZQotICAgICAgICAvLwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgZGVzYy5zZXRVcmkoZGVzYy5nZXRSZXNvbHZlZFVSSSgpLmRlcmVzb2x2ZShiYXNlKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjcmVtb3ZlUmVzb3VyY2VEZXNjcmlwdG9yKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksIGJvb2xlYW4pCi0JICovCi0JcHVibGljIExpc3QgcmVtb3ZlUmVzb3VyY2VEZXNjcmlwdG9yKFVSSSB1cmksIGJvb2xlYW4gY2xlYXJGb2xkZXIpIHsKLQkJQXJyYXlMaXN0IHJlbW92ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCVJlc291cmNlRGVzY3JpcHRvciByZW1vdmVkRGVzY3JpcHRvciA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gKFJlc291cmNlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZih1cmkuZXF1YWxzKGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKS50cmltRnJhZ21lbnQoKSkpIHsKLSAgICAgICAgICAgICAgICBpdGVyLnJlbW92ZSgpOwotLy8gICAgICAgICAgICAgICAgcmVtb3ZlZERlc2NyaXB0b3IgPSBkZXNjOwotICAgICAgICAgICAgICAgIHJlbW92ZWRMaXN0LmFkZChkZXNjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotLy8gICAgICAgIGlmKHJlbW92ZWREZXNjcmlwdG9yICE9IG51bGwpIHsgICAgICAgIAkKLSAgICAgICAgCWlmKGNsZWFyRm9sZGVyKSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGFsbCBjaGlsZCBkZXNjcmlwdG9ycyBvZiB0aGUgcmVtb3ZlZCBkZXNjcmlwdG9yCi0gICAgICAgIAkJLy8KLSAgICAgICAgCQlTdHJpbmcgb2xkRGlyID0gbmV3IEZpbGUodXJpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKSArIEZpbGUuc2VwYXJhdG9yOwotICAgICAgICAJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLSAgICAgICAgCQkJaWYoZGVzYy5nZXRSZXNvbHZlZFVSSSgpLnRvRmlsZVN0cmluZygpLnN0YXJ0c1dpdGgob2xkRGlyKSkgewotICAgICAgICAJCQkJaXRlci5yZW1vdmUoKTsKLSAgICAgICAgCQkJCXJlbW92ZWRMaXN0LmFkZChkZXNjKTsKLSAgICAgICAgCQkJfQotICAgICAgICAJCX0KLSAgICAgICAgCX0KLS8vICAgICAgICAJZWxzZSB7Ci0vLyAgICAgICAgCQkvLyByZW1vdmUgYWxsIHRoZSBkZXNjcmlwdG9ycyBvZiB0aGUgc2FtZSByZXNvdXJjZQotLy8gICAgICAgIAkJLy8KLS8vICAgICAgICAJCVVSSSByZXNVcmkgPSByZW1vdmVkRGVzY3JpcHRvci5nZXRSZXNvbHZlZFVSSSgpLnRyaW1GcmFnbWVudCgpOwotLy8gICAgICAgIAkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8gICAgICAgIAkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gKFJlc291cmNlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0vLyAgICAgICAgCQkJaWYoZGVzYy5nZXRSZXNvbHZlZFVSSSgpLnRyaW1GcmFnbWVudCgpLmVxdWFscyhyZXNVcmkpKSB7Ci0vLyAgICAgICAgCQkJCWl0ZXIucmVtb3ZlKCk7Ci0vLyAgICAgICAgCQkJCXJlbW92ZWRMaXN0LmFkZChkZXNjKTsKLS8vICAgICAgICAJCQl9Ci0vLyAgICAgICAgCQl9ICAgICAgICAJCQotLy8gICAgICAgIAl9Ci0vLyAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVtb3ZlZExpc3Q7Ci0JfQkKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlRGVzY3JpcHRvciBnZXRSZXNvdXJjZURlc2NyaXB0b3IoU3RyaW5nIGd1aWQpIHsKLQkJaWYoaWRUb1Jlc291cmNlRGVzY3JpcHRvck1hcCA9PSBudWxsKSB7Ci0JCQlpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQotCQkJZUFkYXB0ZXJzKCkuYWRkKG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJICAgICAgICAgICAgUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2M7Ci0JCSAgICAgICAgICAgIHN3aXRjaChtc2cuZ2V0RmVhdHVyZUlEKFJlc291cmNlTWFuYWdlci5jbGFzcykpIHsKLQkJICAgICAgICAgICAgICAgIGNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19SRVNPVVJDRV9ERVNDUklQVE9SUzoKLQkJICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKW1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJCQkJaWRUb1Jlc291cmNlRGVzY3JpcHRvck1hcC5wdXQoZGVzYy5nZXRJZCgpLCBkZXNjKTsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pbXNnLmdldE5ld1ZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCQlkZXNjID0gKFJlc291cmNlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJCQkJCQkJaWRUb1Jlc291cmNlRGVzY3JpcHRvck1hcC5wdXQoZGVzYy5nZXRJZCgpLCBkZXNjKTsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb1Jlc291cmNlRGVzY3JpcHRvck1hcC5yZW1vdmUoKChSZXNvdXJjZURlc2NyaXB0b3IpbXNnLmdldE9sZFZhbHVlKCkpLmdldElkKCkpOwotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotCQkgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbiltc2cuZ2V0T2xkVmFsdWUoKSkuaXRlcmF0b3IoKTsgaXRlcgotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAucmVtb3ZlKCgoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyLm5leHQoKSkuZ2V0SWQoKSk7Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0JCSAgICAgICAgICAgICAgICAgICAgfQotCQkgICAgICAgICAgICB9Ci0JCSAgICAgICAgfQotCi0JCQl9KTsKLQkJCQotCQkJLy8gcG9wdWxhdGUgdGhlIG1hcAotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgZWxlbWVudCA9IChSZXNvdXJjZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCWlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAucHV0KGVsZW1lbnQuZ2V0SWQoKSwgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwLmdldChndWlkKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fU1VCX01BTkFHRVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U3ViTWFuYWdlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1JFU09VUkNFX0RFU0NSSVBUT1JTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19HVUlEOgotCQkJCXJldHVybiBnZXRHdWlkKCk7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fVVJJX0JBU0U6Ci0JCQkJcmV0dXJuIGdldFVyaUJhc2UoKTsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19TVUJfTUFOQUdFUlM6Ci0JCQkJcmV0dXJuIGdldFN1Yk1hbmFnZXJzKCk7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fUkVTT1VSQ0VfREVTQ1JJUFRPUlM6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlRGVzY3JpcHRvcnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX0dVSUQ6Ci0JCQkJc2V0R3VpZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fVVJJX0JBU0U6Ci0JCQkJc2V0VXJpQmFzZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fU1VCX01BTkFHRVJTOgotCQkJCWdldFN1Yk1hbmFnZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRTdWJNYW5hZ2VycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1JFU09VUkNFX0RFU0NSSVBUT1JTOgotCQkJCWdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fR1VJRDoKLQkJCQlzZXRHdWlkKEdVSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19VUklfQkFTRToKLQkJCQlzZXRVcmlCYXNlKFVSSV9CQVNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fU1VCX01BTkFHRVJTOgotCQkJCWdldFN1Yk1hbmFnZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fUkVTT1VSQ0VfREVTQ1JJUFRPUlM6Ci0JCQkJZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0vL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19HVUlEOgotCQkJCXJldHVybiBHVUlEX0VERUZBVUxUID09IG51bGwgPyBndWlkICE9IG51bGwgOiAhR1VJRF9FREVGQVVMVC5lcXVhbHMoZ3VpZCk7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fVVJJX0JBU0U6Ci0JCQkJcmV0dXJuIFVSSV9CQVNFX0VERUZBVUxUID09IG51bGwgPyB1cmlCYXNlICE9IG51bGwgOiAhVVJJX0JBU0VfRURFRkFVTFQuZXF1YWxzKHVyaUJhc2UpOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1NVQl9NQU5BR0VSUzoKLQkJCQlyZXR1cm4gc3ViTWFuYWdlcnMgIT0gbnVsbCAmJiAhc3ViTWFuYWdlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1JFU09VUkNFX0RFU0NSSVBUT1JTOgotCQkJCXJldHVybiByZXNvdXJjZURlc2NyaXB0b3JzICE9IG51bGwgJiYgIXJlc291cmNlRGVzY3JpcHRvcnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoaWRUb1Jlc291cmNlRGVzY3JpcHRvck1hcCAhPSBudWxsKSB7Ci0JCQlpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwLmNsZWFyKCk7Ci0JCQlpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwID0gbnVsbDsKLQkJfQotCQkKLQkJZUFkYXB0ZXJzKCkuY2xlYXIoKTsJCQotCQkKLQkJLy8gZGlzcG9zZSB0aGUgc3ViIG1hbmFnZXJzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoSW50ZXJuYWxFTGlzdClnZXRTdWJNYW5hZ2VycygpKS5iYXNpY0l0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2VNYW5hZ2VyIHN1Yk1nciA9IChSZXNvdXJjZU1hbmFnZXIpIGl0ZXIubmV4dCgpOwotCQkJaWYoISgoSW50ZXJuYWxFT2JqZWN0KXN1Yk1ncikuZUlzUHJveHkoKSkgewotCQkJCXN1Yk1nci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE1hcCBpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZW1hbmFnZXJGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxN2Y1ZGFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZW1hbmFnZXJGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5IHsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZW1hbmFnZXJGYWN0b3J5IHRoZVJlc291cmNlbWFuYWdlckZhY3RvcnkgPSAoUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIpOyAvLyROT04tTkxTLTEkIAotCQkJaWYgKHRoZVJlc291cmNlbWFuYWdlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVSZXNvdXJjZW1hbmFnZXJGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IFJlc291cmNlbWFuYWdlckZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKCk7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJlc291cmNlTWFuYWdlcigpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBSZXNvdXJjZURlc2NyaXB0b3IgY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKCkgewotCQlSZXNvdXJjZURlc2NyaXB0b3JJbXBsIHJlc291cmNlRGVzY3JpcHRvciA9IG5ldyBSZXNvdXJjZURlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiByZXNvdXJjZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFJlc291cmNlTWFuYWdlciBjcmVhdGVSZXNvdXJjZU1hbmFnZXIoKSB7Ci0JCVJlc291cmNlTWFuYWdlckltcGwgcmVzb3VyY2VNYW5hZ2VyID0gbmV3IFJlc291cmNlTWFuYWdlckltcGwoKTsKLQkJcmV0dXJuIHJlc291cmNlTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSBnZXRSZXNvdXJjZW1hbmFnZXJQYWNrYWdlKCkgewotCQlyZXR1cm4gKFJlc291cmNlbWFuYWdlclBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NDViNzI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSB7Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgcmVzb3VyY2VEZXNjcmlwdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByaXZhdGUgRUNsYXNzIHJlc291cmNlTWFuYWdlckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcml2YXRlIFJlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlbWFuYWdlclBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFJlc291cmNlbWFuYWdlclBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCVJlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsIHRoZVJlc291cmNlbWFuYWdlclBhY2thZ2UgPSAoUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZVJlc291cmNlbWFuYWdlclBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlUmVzb3VyY2VtYW5hZ2VyUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFJlc291cmNlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHJlc291cmNlRGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZURlc2NyaXB0b3JfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZURlc2NyaXB0b3JfVXJpKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRSZXNvdXJjZU1hbmFnZXIoKSB7Ci0JCXJldHVybiByZXNvdXJjZU1hbmFnZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VNYW5hZ2VyX0d1aWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZU1hbmFnZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZU1hbmFnZXJfVXJpQmFzZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlTWFuYWdlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlTWFuYWdlcl9TdWJNYW5hZ2VycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJlc291cmNlTWFuYWdlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlTWFuYWdlcl9SZXNvdXJjZURlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVzb3VyY2VNYW5hZ2VyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFJlc291cmNlbWFuYWdlckZhY3RvcnkgZ2V0UmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChSZXNvdXJjZW1hbmFnZXJGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCXJlc291cmNlRGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRVNPVVJDRV9ERVNDUklQVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZURlc2NyaXB0b3JFQ2xhc3MsIFJFU09VUkNFX0RFU0NSSVBUT1JfX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZURlc2NyaXB0b3JFQ2xhc3MsIFJFU09VUkNFX0RFU0NSSVBUT1JfX1VSSSk7Ci0KLQkJcmVzb3VyY2VNYW5hZ2VyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFU09VUkNFX01BTkFHRVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlTWFuYWdlckVDbGFzcywgUkVTT1VSQ0VfTUFOQUdFUl9fR1VJRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VNYW5hZ2VyRUNsYXNzLCBSRVNPVVJDRV9NQU5BR0VSX19VUklfQkFTRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VNYW5hZ2VyRUNsYXNzLCBSRVNPVVJDRV9NQU5BR0VSX19TVUJfTUFOQUdFUlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlc291cmNlTWFuYWdlckVDbGFzcywgUkVTT1VSQ0VfTUFOQUdFUl9fUkVTT1VSQ0VfREVTQ1JJUFRPUlMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MocmVzb3VyY2VEZXNjcmlwdG9yRUNsYXNzLCBSZXNvdXJjZURlc2NyaXB0b3IuY2xhc3MsICJSZXNvdXJjZURlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VEZXNjcmlwdG9yX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIFJlc291cmNlRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZURlc2NyaXB0b3JfVXJpKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ1cmkiLCBudWxsLCAwLCAxLCBSZXNvdXJjZURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHJlc291cmNlTWFuYWdlckVDbGFzcywgUmVzb3VyY2VNYW5hZ2VyLmNsYXNzLCAiUmVzb3VyY2VNYW5hZ2VyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlTWFuYWdlcl9HdWlkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJndWlkIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VNYW5hZ2VyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlTWFuYWdlcl9VcmlCYXNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ1cmlCYXNlIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VNYW5hZ2VyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlTWFuYWdlcl9TdWJNYW5hZ2VycygpLCB0aGlzLmdldFJlc291cmNlTWFuYWdlcigpLCBudWxsLCAic3ViTWFuYWdlcnMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VNYW5hZ2VyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVzb3VyY2VNYW5hZ2VyX1Jlc291cmNlRGVzY3JpcHRvcnMoKSwgdGhpcy5nZXRSZXNvdXJjZURlc2NyaXB0b3IoKSwgbnVsbCwgInJlc291cmNlRGVzY3JpcHRvcnMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VNYW5hZ2VyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlFT3BlcmF0aW9uIG9wID0gYWRkRU9wZXJhdGlvbihyZXNvdXJjZU1hbmFnZXJFQ2xhc3MsIHRoaXMuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKCksICJnZXRSZXNvdXJjZURlc2NyaXB0b3IiLCAwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZ3VpZCIsIDAsIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0YjBkMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgbWFuYWdpbmcgWE1JIHJlc291cmNlcyBpbiBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0YWZjNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgbWFuYWdpbmcgWE1JIHJlc291cmNlcyBpbiBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9yZXNvdXJjZW1hbmFnZXIuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0MWM4YjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9yZXNvdXJjZW1hbmFnZXIuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJyZXNvdXJjZW1hbmFnZXIiCi0gICAgbnNVUkk9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlciI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVzb3VyY2VEZXNjcmlwdG9yIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJpIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlc291cmNlTWFuYWdlciI+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFJlc291cmNlRGVzY3JpcHRvciIgZVR5cGU9IiMvL1Jlc291cmNlRGVzY3JpcHRvciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdldHMgZGlyZWN0IFJlc291cmNlRGVzY3JpcHRvciB3aG9zZSBpZCBpcyB0aGUgZ2l2ZW4gZ3VpZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZ3VpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imd1aWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJpQmFzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJNYW5hZ2VycyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9SZXNvdXJjZU1hbmFnZXIiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc291cmNlRGVzY3JpcHRvcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUmVzb3VyY2VEZXNjcmlwdG9yIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3Jlc291cmNlbWFuYWdlci5nZW5tb2RlbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcmVzb3VyY2VtYW5hZ2VyLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhY2I3OWM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcmVzb3VyY2VtYW5hZ2VyLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjIgotICAgIGVkaXREaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlciIgdGVtcGxhdGVEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcyIKLSAgICBydW50aW1lSmFyPSJ0cnVlIiBkeW5hbWljVGVtcGxhdGVzPSJ0cnVlIiBtb2RlbE5hbWU9IlJlc291cmNlbWFuYWdlciIgZWRpdFBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLnByb3ZpZGVyLlJlc291cmNlbWFuYWdlckVkaXRQbHVnaW4iCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIucHJlc2VudGF0aW9uLlJlc291cmNlbWFuYWdlckVkaXRvclBsdWdpbiIKLSAgICBub25OTFNNYXJrZXJzPSJ0cnVlIiByb290RXh0ZW5kc0ludGVyZmFjZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5FRGF0YU9iamVjdCIKLSAgICByb290RXh0ZW5kc0NsYXNzPSJvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3QiIHJvb3RJbXBsZW1lbnRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkludGVybmFsRURhdGFPYmplY3QiCi0gICAgc3VwcHJlc3NFTUZUeXBlcz0idHJ1ZSIgZmVhdHVyZU1hcFdyYXBwZXJJbnRlcmZhY2U9ImNvbW1vbmouc2RvLlNlcXVlbmNlIiBmZWF0dXJlTWFwV3JhcHBlckludGVybmFsSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnV0aWwuRVNlcXVlbmNlIgotICAgIGZlYXR1cmVNYXBXcmFwcGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8udXRpbC5CYXNpY0VTZXF1ZW5jZSIgY29udGFpbm1lbnRQcm94aWVzPSJ0cnVlIj4KLSAgPGZvcmVpZ25Nb2RlbD5DOlxDQ19WaWV3c1xwbGVfVE5HX0F1dGhvcmluZ1x0bmdfYXV0aG9yaW5nXFRORyBVTUwgTW9kZWxzXHJlc291cmNlbWFuYWdlci5tZGw8L2ZvcmVpZ25Nb2RlbD4KLSAgPHN0YXRpY1BhY2thZ2VzPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvU0RPPC9zdGF0aWNQYWNrYWdlcz4KLSAgPG1vZGVsUGx1Z2luVmFyaWFibGVzPkVNRl9DT01NT05KX1NETz1vcmcuZWNsaXBzZS5lbWYuY29tbW9uai5zZG88L21vZGVsUGx1Z2luVmFyaWFibGVzPgotICA8bW9kZWxQbHVnaW5WYXJpYWJsZXM+RU1GX0VDT1JFX1NETz1vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvPC9tb2RlbFBsdWdpblZhcmlhYmxlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iUmVzb3VyY2VtYW5hZ2VyIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuZXBmIiBlY29yZVBhY2thZ2U9InJlc291cmNlbWFuYWdlci5lY29yZSMvIj4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJyZXNvdXJjZW1hbmFnZXIuZWNvcmUjLy9SZXNvdXJjZURlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHJlc291cmNlbWFuYWdlci5lY29yZSMvL1Jlc291cmNlRGVzY3JpcHRvci9pZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHJlc291cmNlbWFuYWdlci5lY29yZSMvL1Jlc291cmNlRGVzY3JpcHRvci91cmkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0icmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8vUmVzb3VyY2VNYW5hZ2VyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSByZXNvdXJjZW1hbmFnZXIuZWNvcmUjLy9SZXNvdXJjZU1hbmFnZXIvZ3VpZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHJlc291cmNlbWFuYWdlci5lY29yZSMvL1Jlc291cmNlTWFuYWdlci91cmlCYXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHJlc291cmNlbWFuYWdlci5lY29yZSMvL1Jlc291cmNlTWFuYWdlci9zdWJNYW5hZ2VycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSByZXNvdXJjZW1hbmFnZXIuZWNvcmUjLy9SZXNvdXJjZU1hbmFnZXIvcmVzb3VyY2VEZXNjcmlwdG9ycyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249InJlc291cmNlbWFuYWdlci5lY29yZSMvL1Jlc291cmNlTWFuYWdlci9nZXRSZXNvdXJjZURlc2NyaXB0b3IiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0icmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8vUmVzb3VyY2VNYW5hZ2VyL2dldFJlc291cmNlRGVzY3JpcHRvci9ndWlkIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9SZXNvdXJjZW1hbmFnZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci91dGlsL1Jlc291cmNlbWFuYWdlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQzMzBkNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci91dGlsL1Jlc291cmNlbWFuYWdlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlbWFuYWdlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VtYW5hZ2VyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgUmVzb3VyY2VtYW5hZ2VyU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IFJlc291cmNlbWFuYWdlclN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlRGVzY3JpcHRvcihSZXNvdXJjZURlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlTWFuYWdlcihSZXNvdXJjZU1hbmFnZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlTWFuYWdlckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciA8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXNvdXJjZURlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyIDxlbT5SZXNvdXJjZSBNYW5hZ2VyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlc291cmNlTWFuYWdlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9SZXNvdXJjZW1hbmFnZXJTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9SZXNvdXJjZW1hbmFnZXJTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTBhNDdjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3V0aWwvUmVzb3VyY2VtYW5hZ2VyU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlbWFuYWdlclN3aXRjaCB7Ci0JCi0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VtYW5hZ2VyU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFJlc291cmNlbWFuYWdlclBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfREVTQ1JJUFRPUjogewotCQkJCVJlc291cmNlRGVzY3JpcHRvciByZXNvdXJjZURlc2NyaXB0b3IgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZXNvdXJjZURlc2NyaXB0b3IocmVzb3VyY2VEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUjogewotCQkJCVJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIgPSAoUmVzb3VyY2VNYW5hZ2VyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZXNvdXJjZU1hbmFnZXIocmVzb3VyY2VNYW5hZ2VyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZURlc2NyaXB0b3IoUmVzb3VyY2VEZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgTWFuYWdlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBNYW5hZ2VyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZU1hbmFnZXIoUmVzb3VyY2VNYW5hZ2VyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNTg3ZDZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBtYW5hZ2luZyBYTUkgcmVzb3VyY2VzIGluIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZTFkZWU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIExpYnJhcnkgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjZGUxZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZWE1YTBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLAotIG9yZy5lY2xpcHNlLmVwZi51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLnVpLmlkZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3MsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudmlld3MsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcwotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3MzFlZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMKLSAgICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2ljb25zL09wZW5MaWJyYXJ5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvT3BlbkxpYnJhcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjQ5ODMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvT3BlbkxpYnJhcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvZnVsbC93aXpiYW4vRXhwb3J0UHJvY2Vzcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydFByb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjQ5ODMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvZnVsbC93aXpiYW4vRXhwb3J0UHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2ljb25zL2Z1bGwvd2l6YmFuL09wZW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9pY29ucy9mdWxsL3dpemJhbi9PcGVuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI0OTgzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2ljb25zL2Z1bGwvd2l6YmFuL09wZW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiZTFiZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgTGlicmFyeSBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBBY3Rpb24gCi1hY3Rpb25TZXRMYWJlbD1NZXRob2QgQXV0aG9yaW5nCi1maWxlT3Blbk1lbnVMYWJlbD1PcGVuCi1vcGVuTGlicmFyeUFjdGlvbmxhYmVsPU1ldGhvZCBMaWJyYXJ5Ci1vcGVuTGlicmFyeUFjdGlvblRvb2x0aXA9T3BlbiBhIG1ldGhvZCBsaWJyYXJ5Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISEKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgRGVmYXVsdCBNZXRob2QgTGlicmFyeSBQYXRoLgotbGlicmFyeVBhdGg9PHVzZXIuaG9tZT4vPGFwcC5uYW1lPi9NZXRob2QgTGlicmFyaWVzL2xpYnJhcnkxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYjc3NDYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPiAgICAgICAgICAgCi0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJuZXdMaWJyYXJ5V2l6YXJkUGFnZXMiCi0gICAgICAgICBuYW1lPSJFUEYgTmV3IE1ldGhvZCBMaWJyYXJ5IFdpemFyZCBQYWdlcyIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL05ld0xpYnJhcnlXaXphcmRQYWdlcy5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJvcGVuTGlicmFyeVdpemFyZFBhZ2VzIgotICAgICAgICAgbmFtZT0iRVBGIE9wZW4gTWV0aG9kIExpYnJhcnkgV2l6YXJkIFBhZ2VzIgotICAgICAgICAgc2NoZW1hPSJzY2hlbWEvT3BlbkxpYnJhcnlXaXphcmRQYWdlcy5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvblNldCIKLSAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uU2V0TGFiZWwiCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj4KLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubWVudS5maWxlT3Blbk1lbnUiCi0gICAgICAgICAgICAgICBsYWJlbD0iJWZpbGVPcGVuTWVudUxhYmVsIgotICAgICAgICAgICAgICAgcGF0aD0iZmlsZS9uZXcuZXh0Ij4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IgbmFtZT0iZ3JvdXBtMSIvPgotICAgICAgICAgICAgPHNlcGFyYXRvciBuYW1lPSJncm91cG0yIi8+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5PcGVuTGlicmFyeUFjdGlvbiIKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9ImZpbGVfb3Blbl9saWJyYXJ5X2NvbnRleHQiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuT3BlbkxpYnJhcnlBY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJW9wZW5MaWJyYXJ5QWN0aW9ubGFiZWwiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iZmlsZS9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5tZW51LmZpbGVPcGVuTWVudS9ncm91cG0xIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJW9wZW5MaWJyYXJ5QWN0aW9uVG9vbHRpcCIvPgotICAgICAgPC9hY3Rpb25TZXQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVzZXJJbnRlcmFjdGlvbkhhbmRsZXIiPgotICAgICAgPHVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuVXNlckludGVyYWN0aW9uSGFuZGxlciIvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zY2hlbWEvTmV3TGlicmFyeVdpemFyZFBhZ2VzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NjaGVtYS9OZXdMaWJyYXJ5V2l6YXJkUGFnZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTM5YzQ2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NjaGVtYS9OZXdMaWJyYXJ5V2l6YXJkUGFnZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkiIGlkPSJuZXdMaWJyYXJ5V2l6YXJkUGFnZXMiIG5hbWU9IkVQRiBOZXcgTWV0aG9kIExpYnJhcnkgV2l6YXJkIFBhZ2VzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEVuYWJsZXMgYSBwbHVnLWluIHRvIGNvbnRyaWJ1dGUgYSBtZXRob2QgbGlicmFyeSB0eXBlIHNwZWNpZmljIHdpemFyZCBwYWdlIHRvIHRoZSBOZXcgTWV0aG9kIExpYnJhcnkgd2l6YXJkLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJuZXdMaWJyYXJ5V2l6YXJkUGFnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im5ld0xpYnJhcnlXaXphcmRQYWdlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgd2l6YXJkIHBhZ2UuIFRoaXMgY2xhc3MgbXVzdCBleHRlbmRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuQWRkTGlicmFyeVdpemFyZFBhZ2UmbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgYSBzcGVjaWZpYyBtZXRob2QgbGlicmFyeSB0eXBlIChkYXRhYmFzZSwgeG1pLCBldGMuKS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0aXRsZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSB3aXphcmQgcGFnZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgZGVzY3JpcHRpb24gZm9yIHRoZSB3aXphcmQgcGFnZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIExpYnJhcnkgTWFuYWdlciBleHRlbnNpb24gcG9pbnQ6IAotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5uZXdMaWJyYXJ5V2l6YXJkUGFnZXMmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7YWRkTGlicmFyeVdpemFyZFBhZ2UKLSAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5OZXdYTUlMaWJyYXJ5V2l6YXJkUGFnZSZxdW90OwotICAgICAgICAgdHlwZT0mcXVvdDt4bWkmcXVvdDsKLSAgICAgICAgIHRpdGxlPSZxdW90O0NyZWF0ZXMgYSBYTUkgbWV0aG9kIGxpYnJhcnkuJnF1b3Q7Ci0gICAgICAgICBkZXNjcmlwdGlvbj0mcXVvdDtTcGVjaWZ5IHRoZSBsb2NhdGlvbiBmb3IgdGhlIFhNSSBtZXRob2QgbGlicmFyeS4mcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L2FkZExpYnJhcnlXaXphcmRQYWdlJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc2NoZW1hL09wZW5MaWJyYXJ5V2l6YXJkUGFnZXMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc2NoZW1hL09wZW5MaWJyYXJ5V2l6YXJkUGFnZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGMwZTQxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NjaGVtYS9PcGVuTGlicmFyeVdpemFyZFBhZ2VzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpIiBpZD0ib3BlbkxpYnJhcnlXaXphcmRQYWdlcyIgbmFtZT0iRVBGIE9wZW4gTWV0aG9kIExpYnJhcnkgV2l6YXJkIFBhZ2VzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEVuYWJsZXMgYSBwbHVnLWluIHRvIGNvbnRyaWJ1dGUgYSBtZXRob2QgbGlicmFyeSB0eXBlIHNwZWNpZmljIHdpemFyZCBwYWdlIHRvIHRoZSBPcGVuIE1ldGhvZCBMaWJyYXJ5IHdpemFyZC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib3BlbkxpYnJhcnlXaXphcmRQYWdlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ib3BlbkxpYnJhcnlXaXphcmRQYWdlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgd2l6YXJkIHBhZ2UuIFRoaXMgY2xhc3MgbXVzdCBleHRlbmRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuQWRkTGlicmFyeVdpemFyZFBhZ2UmbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgYSBzcGVjaWZpYyBtZXRob2QgbGlicmFyeSB0eXBlIChkYXRhYmFzZSwgeG1pLCBldGMuKS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0aXRsZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSB3aXphcmQgcGFnZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgZGVzY3JpcHRpb24gZm9yIHRoZSB3aXphcmQgcGFnZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIExpYnJhcnkgTWFuYWdlciBleHRlbnNpb24gcG9pbnQ6IAotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYubGlicnJheS51aS5vcGVuTGlicmFyeVdpemFyZFBhZ2VzJnF1b3Q7Jmd0OwotICAgICAgJmx0O29wZW5MaWJyYXJ5V2l6YXJkUGFnZQotICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLk9wZW5YTUlMaWJyYXJ5V2l6YXJkUGFnZSZxdW90OwotICAgICAgICAgdHlwZT0mcXVvdDt4bWkmcXVvdDsKLSAgICAgICAgIHRpdGxlPSZxdW90O09wZW5zIGEgWE1JIG1ldGhvZCBsaWJyYXJ5LiZxdW90OwotICAgICAgICAgZGVzY3JpcHRpb249JnF1b3Q7U3BlY2lmeSB0aGUgbG9jYXRpb24gZm9yIHRoZSBYTUkgbWV0aG9kIGxpYnJhcnkuJnF1b3Q7Jmd0OwotICAgICAgJmx0Oy9vcGVuTGlicmFyeVdpemFyZFBhZ2UmZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvSUxpYnJhcnlVSU1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0lMaWJyYXJ5VUlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczYWRiYzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvSUxpYnJhcnlVSU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpOwotCi0vKioKLSAqIEludGVyZmFjZSB0byBwcm92aWRlIHVzZXIgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBvciBvcGVuaW5nIG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAyNiwgMjAwNgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5VUlNYW5hZ2VyIHsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1ldGhvZCBsaWJyYXJ5IHdpdGggdXNlciBzcGVjaWZpZWQgaW5mb3JtYXRpb24uCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gY3JlYXRlTmV3TGlicmFyeSgpOwotCi0JLyoqCi0JICogT3BlbiBhIG1ldGhvZCBsaWJyYXJ5IHRoYXQgdXNlciBzcGVjaWZpZWQuCi0JICogCi0JICogQHBhcmFtIGxhc3RPcGVuCi0JICogICAgICAgICAgICBpZiB0cnVlIHdpbGwgdHJ5IHRvIG9wZW4gdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgaGFkIGJlZW4KLQkgKiAgICAgICAgICAgIG9wZW5lZCBtb3N0IHJlY2VudGx5LgotCSAqIEByZXR1cm4KLQkgKiAgICAgICAgICAgIDxsaT48Y29kZT50cnVlPC9jb2RlPiBpZiBzdWNjZXNzZnVsCi0JICogICAgICAgICAgICA8bGk+PGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHVzZXIgY2FuY2VsbGVkIG9yIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgb2NjdXJlZAotCSAqLwotCWJvb2xlYW4gb3BlbkxpYnJhcnkoYm9vbGVhbiBsYXN0T3Blbik7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9JTWV0aG9kRWxlbWVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9JTWV0aG9kRWxlbWVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2NGI2NjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvSU1ldGhvZEVsZW1lbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZEVsZW1lbnRQcm92aWRlciB7Ci0JTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlJbWFnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSUltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYTFhNTMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSUltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotLyoqCi0gKiBMaWJyYXJ5IFVJIGltYWdlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VUlJbWFnZXMgewotCi0JLyoqCi0JICogVGhlIGltYWdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIE1ldGhvZCBMaWJyYXJ5IGVsZW1lbnRzLgotCSAqIDxwPgotCSAqIFRoZXNlIGltYWdlcyBhcmUgY2FjaGVkIGFuZCBzaG91bGQgbm90IGJlIGRpc3Bvc2VkIGJ5IHRoZSB1c2VyIQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0FDVElWSVRZID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0FjdGl2aXR5Iik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0FSVElGQUNUID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0FydGlmYWN0Iik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0NBUEFCSUxJVFlfUEFUVEVSTiA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19DSEVDS0xJU1QgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvQ2hlY2tsaXN0Iik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0NPTVBPU0lURV9ST0xFID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0NvbXBvc2l0ZVJvbGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ09OQ0VQVCA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Db25jZXB0Iik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0NPTlRFTlRfUEFDS0FHRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Db250ZW50UGFja2FnZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19DVVNUT01fQ0FURUdPUlkgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvQ3VzdG9tQ2F0ZWdvcnkiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfREVMSVZFUkFCTEUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvRGVsaXZlcmFibGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfREVMSVZFUllfUFJPQ0VTUyA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfRElTQ0lQTElORSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9EaXNjaXBsaW5lIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0RJU0NJUExJTkVfR1JPVVBJTkcgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvRGlzY2lwbGluZUdyb3VwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0RPTUFJTiA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Eb21haW4iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfRVNUSU1BVEUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvRXN0aW1hdGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfRVNUSU1BVElOR19NRVRSSUMgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvRXN0aW1hdGluZ01ldHJpYyIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19FWEFNUExFID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0V4YW1wbGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfR1VJREVMSU5FID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0d1aWRlbGluZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19JVEVSQVRJT04gPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvSXRlcmF0aW9uIik7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19NRVRIT0RfQ09ORklHVVJBVE9OID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfTUVUSE9EX0xJQkFSQVJZID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L01ldGhvZExpYnJhcnkiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfTUVUSE9EX1BBQ0tBR0UgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGFja2FnZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19NRVRIT0RfUExVR0lOID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L01ldGhvZFBsdWdpbiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19NSUxFU1RPTkUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvTWlsZXN0b25lIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX09VVENPTUUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvT3V0Y29tZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QSEFTRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9QaGFzZSIpOyAvLyROT04tTkxTLTEkCQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUFJBQ1RJQ0UgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvUHJhY3RpY2UiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUFJPQ0VTUyA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Qcm9jZXNzIik7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QUk9DRVNTX0NPTlRSSUJVVElPTiA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Qcm9jZXNzQ29udHJpYnV0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1BST0NFU1NfRkFNSUxZID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3NGYW1pbHkiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUFJPQ0VTU19QQUNLQUdFID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3NQYWNrYWdlIik7IC8vJE5PTi1OTFMtMQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUkVQT1JUID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1JlcG9ydCIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ST0FETUFQID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1JvYWRtYXAiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUk9MRV9ERVNDUklQVE9SID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1JvbGVEZXNjcmlwdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1JPTEUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvUm9sZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ST0xFX1NFVCA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Sb2xlU2V0Iik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1JPTEVfU0VUX0dST1VQSU5HID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1JvbGVTZXRHcm91cGluZyIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19TVVBQT1JUSU5HX01BVEVSSUFMID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbCIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19UQVNLID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Rhc2siKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfVEFTS19ERVNDUklQVE9SID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1RFQU1fUFJPRklMRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9UZWFtUHJvZmlsZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19URU1QTEFURSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9UZW1wbGF0ZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19URVJNX0RFRklOSVRJT04gPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvVGVybURlZmluaXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfVE9PTCA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Ub29sIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1RPT0xfTUVOVE9SID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Rvb2xNZW50b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfV0hJVEVQQVBFUiA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9XaGl0ZXBhcGVyIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1dPUktfUFJPRFVDVCA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdCIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19XT1JLX1BST0RVQ1RfVFlQRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZ2l2ZW4gdGhlIHJlbGF0aXZlIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIEEgcGF0aCByZWxhdGl2ZSB0byB0aGUgVU1BIEVkaXQgcGx1Zy1pbiByb290LgotCSAqIEByZXR1cm4gQSA8Y29kZT5JbWFnZTwvY29kZT4gb2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgZ2V0RWxlbWVudEltYWdlKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgKLQkJCQlVbWFFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKHBhdGgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSU1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTdkYWJkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5Db25maWd1cmF0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLk9wZW5MaWJyYXJ5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3MuU2VsZWN0TGlicmFyeURpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLkxpYnJhcnlCYWNrdXBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLk1hcHBpbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uVXBncmFkZUNhbGxlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Ub29sQmFyQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFRoZSBMaWJyYXJ5IFVJIE1hbmFnZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlVSU1hbmFnZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xCQVJfQ09ORklHX0NPTlRSSUJVVElPTl9JRCA9ICJ0b29sYmFyLmNvbmZpZy5jb250cmlidXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBMaWJyYXJ5VUlNYW5hZ2VyIGluc3RhbmNlID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjbWRMaW5lTGliUGF0aCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNtZExpbmVEZWZhdWx0TGliUGF0aCA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFwcE5hbWUgPSAiY29tcG9zZXIiOwotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCB0eXBlVG9NYW5hZ2VyRGVmTWFwOwotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHID0gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVVJTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoTGlicmFyeVVJTWFuYWdlci5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IExpYnJhcnlVSU1hbmFnZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFByaXZhdGUgZGVmYXVsdCBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZwotCSAqIGluc3RhbnRpYXRlZC4KLQkgKi8KLQlwcml2YXRlIExpYnJhcnlVSU1hbmFnZXIoKSB7Ci0JCWFkZENvbmZpZ3VyYXRpb25Db250cmlidXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIE1ldGhvZCBMaWJyYXJ5LgotCSAqLwotCXB1YmxpYyB2b2lkIHByb21wdEZvck1ldGhvZExpYnJhcnkoKSB7Ci0JCXRyeSB7Ci0JCQlPcGVuTGlicmFyeUFjdGlvbiBhY3Rpb24gPSBuZXcgT3BlbkxpYnJhcnlBY3Rpb24oKTsKLQkJCWFjdGlvbi5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkpOwotCQkJYWN0aW9uLnJ1bihudWxsKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJCi0JCS8qCi0JCWlmKCFTZXJ2aWNlcy5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlbmNlVHlwZSgpLmVxdWFscyhTZXJ2aWNlcy5YTUlfUEVSU0lTVEVOQ0VfVFlQRSkpIHsKLQkJCUlMaWJyYXJ5VUlNYW5hZ2VyIG1hbmFnZXIgPSBnZXRMaWJyYXJ5VUlNYW5hZ2VyKFNlcnZpY2VzLmdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVuY2VUeXBlKCkpOwotCQkJaWYobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJaWYoIW1hbmFnZXIub3BlbkxpYnJhcnkodHJ1ZSkpIHsKLQkJCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJCi0JCS8vIFJldHJpZXZlIHRoZSBMaWJyYXJ5IHBhdGggdGhhdCB3YXMgc2F2ZWQgaW4gYSBwcmV2aW91cyBzZXNzaW9uLgotCQlTdHJpbmcgbGliUGF0aCA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldFNhdmVkTGlicmFyeVBhdGgoKTsKLQkJaWYgKGNtZExpbmVMaWJQYXRoICE9IG51bGwpIHsKLQkJCWxpYlBhdGggPSBjbWRMaW5lTGliUGF0aDsKLQkJfSBlbHNlIGlmIChsaWJQYXRoID09IG51bGwgfHwgbGliUGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpZiAoY21kTGluZURlZmF1bHRMaWJQYXRoICE9IG51bGwpIHsKLQkJCQlsaWJQYXRoID0gY21kTGluZURlZmF1bHRMaWJQYXRoOwotCQkJfQotCQl9Ci0KLQkJLy8gUHJvbXB0IHRoZSB1c2VyIHRvIHNlbGVjdCBhIE1ldGhvZCBMaWJyYXJ5IGZvbGRlciBpZjoKLQkJLy8gKDEpIFRoZSBzYXZlZCBvciBjb21tYW5kIGxpbmUgTGlicmFyeSBwYXRoIGlzIGludmFsaWQgQU5ECi0JCS8vICgyKSBUaGUgcHJvbXB0IGZvciBNZXRob2QgTGlicmFyeSBhdCBzdGFydHVwIHByZWZlcmVuY2UgaXMgc2V0IHRvCi0JCS8vIHRydWUgKHRoZSBkZWZhdWx0KQotCQlpZiAoWE1JTGlicmFyeVV0aWwuaXNWYWxpZExpYnJhcnkobGliUGF0aCwgdHJ1ZSkgPT0gU3RhdHVzLk9LX1NUQVRVUwotCQkJCSYmICFMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRQcm9tcHRGb3JNZXRob2RMaWJyYXJ5QXRTdGFydHVwKCkKLQkJCQkmJiAhWE1JTGlicmFyeVV0aWwuaXNNZXRob2RMaWJyYXJ5TG9ja2VkKGxpYlBhdGgpKSB7Ci0JCQlvcGVuTGlicmFyeShsaWJQYXRoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIE9wZW4gYSBkaWFsb2cgdG8gcHJvbXB0IHRoZSB1c2VyIHRvIHNlbGVjdCBhIE1ldGhvZCBMaWJycmF5IGZvbGRlci4KLQkJaWYgKFhNSUxpYnJhcnlVdGlsLmlzVmFsaWRMaWJyYXJ5KGxpYlBhdGgpICE9IFN0YXR1cy5PS19TVEFUVVMpIHsKLQkJCWxpYlBhdGggPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXREZWZhdWx0TGlicmFyeVBhdGgoKTsKLQkJfQotCQkKLQkJLy8gYnVnIDE1MTE5OSAtIGNoYW5nZSBwYXJlbnQgc2hlbGwgdG8gbnVsbC4gZGlhbG9nIGlzIGFsc28gY2hhbmdlZCB0bwotCQkvLyBub3QgYmUgT05fVE9QCi0JCU9wZW5MaWJyYXJ5RGlhbG9nIGRpYWxvZyA9IG5ldyBPcGVuTGlicmFyeURpYWxvZyhudWxsLCBsaWJQYXRoKTsKLQkJd2hpbGUgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlsaWJQYXRoID0gZGlhbG9nLmdldExpYnJhcnlQYXRoKCk7Ci0JCQlsaWJQYXRoID0gdG9BYnNvbHV0ZUxpYnJhcnlQYXRoKGxpYlBhdGgpOwotCQkJaWYgKFhNSUxpYnJhcnlVdGlsLmlzVmFsaWRMaWJyYXJ5KGxpYlBhdGgsIHRydWUpID09IFN0YXR1cy5PS19TVEFUVVMpIHsKLQkJCQlpZiAoWE1JTGlicmFyeVV0aWwuaXNNZXRob2RMaWJyYXJ5TG9ja2VkKGxpYlBhdGgpKSB7Ci0JCQkJCWlmIChkaXNwbGF5TGlicmFyeUxvY2tlZE1lc3NhZ2UoKSAhPSAwKQotCQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCVZlcnNpb25VdGlsLlZlcnNpb25DaGVja0luZm8gaW5mbyA9IFZlcnNpb25VdGlsLmNoZWNrTGlicmFyeVZlcnNpb24oCi0JCQkJCQluZXcgRmlsZShsaWJQYXRoLCBYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1hNSSkpOwotCQkJCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby5yZXN1bHQgPiAwKSB7Ci0JCQkJCVN0cmluZyBtZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGluZm8udG9vbElELmVxdWFscyhWZXJzaW9uVXRpbC5nZXRQcmltYXJ5VG9vbElEKCkpKSB7Ci0JCQkJCQltZXNzYWdlID0gTkxTLmJpbmQoTGlicmFyeVVJUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0LCBuZXcgT2JqZWN0W10gewotCQkJCQkJCQlQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpLCBpbmZvLnRvb2xWZXJzaW9ufSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQltZXNzYWdlID0gTkxTLmJpbmQoTGlicmFyeVVJUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0X3Vua25vd24sIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCVBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsKLQkJCQkJfQotCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLgotCQkJCQkJZGlzcGxheUVycm9yKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwgbWVzc2FnZSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoWE1JTGlicmFyeVV0aWwuaXNNZXRob2RMaWJyYXJ5VXBncmFkZVJlcXVpcmVkKGxpYlBhdGgpKSB7Ci0JCQkJCWlmICghTGlicmFyeVVJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RleHQpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlpZiAoIXVwZ3JhZGVMaWJyYXJ5KGxpYlBhdGgsIG51bGwpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAob3BlbkxpYnJhcnkobGliUGF0aCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJTXNnRGlhbG9nIG1zZ0RpYWxvZyA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQlib29sZWFuIHJjID0gbXNnRGlhbG9nCi0JCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJCQlOTFMKLQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeURpYWxvZ19uZXdMaWJyYXJ5X3RleHQsCi0JCQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyBsaWJQYXRoIH0pKTsKLQkJCQlpZiAoIXJjKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY3JlYXRlTGlicmFyeShsaWJQYXRoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuaW52YWxpZExpYnJhcnlQYXRoX21zZywKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmludmFsaWRMaWJyYXJ5UGF0aF9yZWFzb24pOwotCQl9Ci0JCTsKLQotCQkvLyBpZiBkaWFsb2cgaXMgY2xvc2VkIHdpdGggdGhlIE9LIGJ1dHRvbmJlaW5nIGNsaWNrZWQgLS0gdHJlYXQgaXQgYXMKLQkJLy8gY2FuY2VsCi0JCVN5c3RlbS5leGl0KDApOwotCQkqLwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNYW5hZ2VyRGVmIHsKLQkJQnVuZGxlIGJ1bmRsZTsKLQotCQlTdHJpbmcgdHlwZTsKLQotCQlTdHJpbmcgY2xhc3NOYW1lOwotCQkKLQkJSUxpYnJhcnlVSU1hbmFnZXIgaW5zdGFuY2U7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBidW5kbGUKLQkJICogQHBhcmFtIHR5cGUKLQkJICogQHBhcmFtIGNsYXNzTmFtZQotCQkgKiBAcGFyYW0gaW5zdGFuY2UKLQkJICovCi0JCXByaXZhdGUgTWFuYWdlckRlZihCdW5kbGUgYnVuZGxlLCBTdHJpbmcgdHlwZSwgU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQl9Ci0JCQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUxpYnJhcnlVSU1hbmFnZXIgZ2V0TGlicmFyeVVJTWFuYWdlcihTdHJpbmcgcGVyc2lzdGVuY2VUeXBlKSB7Ci0JCWlmICh0eXBlVG9NYW5hZ2VyRGVmTWFwID09IG51bGwpIHsKLQkJCXR5cGVUb01hbmFnZXJEZWZNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJLy8gUHJvY2VzcyB0aGUgZXh0ZW5zaW9uIHBvaW50IGNvbnRyaWJ1dG9ycy4KLQkJCS8vCi0JCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybQotCQkJCQkuZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5Ci0JCQkJCS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQkJCQkib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkiLCAibGlicmFyeVVJTWFuYWdlcnMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgdHlwZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoInR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbAotCQkJCQkJCQkJJiYgY2xhc3NOYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkJCQkJCSYmIHR5cGUgIT0gbnVsbAotCQkJCQkJCQkJJiYgdHlwZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCXR5cGVUb01hbmFnZXJEZWZNYXAucHV0KHR5cGUsIG5ldyBNYW5hZ2VyRGVmKGJ1bmRsZSwKLQkJCQkJCQkJCQl0eXBlLCBjbGFzc05hbWUpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTWFuYWdlckRlZiBtZ3IgPSAoTWFuYWdlckRlZikgdHlwZVRvTWFuYWdlckRlZk1hcC5nZXQocGVyc2lzdGVuY2VUeXBlKTsKLQkJaWYgKG1nciAhPSBudWxsKSB7Ci0JCQlpZiAobWdyLmluc3RhbmNlID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQltZ3IuaW5zdGFuY2UgPSAoSUxpYnJhcnlVSU1hbmFnZXIpIG1nci5idW5kbGUubG9hZENsYXNzKAotCQkJCQkJCW1nci5jbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQlpZihERUJVRyApIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbWdyLmluc3RhbmNlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkJCi0JLyoqCi0JICogT3BlbnMgYSBNZXRob2QgTGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuTGlicmFyeSgpIHsKLQkJaWYoIVNlcnZpY2VzLmdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVuY2VUeXBlKCkuZXF1YWxzKFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFKSkgewotCQkJSUxpYnJhcnlVSU1hbmFnZXIgbWFuYWdlciA9IGdldExpYnJhcnlVSU1hbmFnZXIoU2VydmljZXMuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZW5jZVR5cGUoKSk7Ci0JCQlpZihtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltYW5hZ2VyLm9wZW5MaWJyYXJ5KGZhbHNlKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlTZWxlY3RMaWJyYXJ5RGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBTZWxlY3RMaWJyYXJ5RGlyZWN0b3J5RGlhbG9nKAotCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCkpOwotCQlTdHJpbmcgbGliUGF0aCA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldFNhdmVkTGlicmFyeVBhdGgoKTsKLQkJZGlhbG9nLnNldEZpbHRlclBhdGgobGliUGF0aCk7Ci0JCWRvIHsKLQkJCWxpYlBhdGggPSBkaWFsb2cub3BlbigpOwotCQkJaWYgKGxpYlBhdGggPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChYTUlMaWJyYXJ5VXRpbC5pc1ZhbGlkTGlicmFyeShsaWJQYXRoLCB0cnVlKSA9PSBTdGF0dXMuT0tfU1RBVFVTKSB7Ci0JCQkJaWYgKFhNSUxpYnJhcnlVdGlsLmlzTWV0aG9kTGlicmFyeUxvY2tlZChsaWJQYXRoKSkgewotCQkJCQlpZiAoZGlzcGxheUxpYnJhcnlMb2NrZWRNZXNzYWdlKCkgIT0gMCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlWZXJzaW9uVXRpbC5WZXJzaW9uQ2hlY2tJbmZvIGluZm8gPSBWZXJzaW9uVXRpbC5jaGVja0xpYnJhcnlWZXJzaW9uKAotCQkJCQkJbmV3IEZpbGUobGliUGF0aCwgWE1JTGlicmFyeU1hbmFnZXIuTElCUkFSWV9YTUkpKTsKLQkJCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8ucmVzdWx0ID4gMCkgewotCQkJCQlTdHJpbmcgbWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChpbmZvLnRvb2xJRC5lcXVhbHMoVmVyc2lvblV0aWwuZ2V0UHJpbWFyeVRvb2xJRCgpKSkgewotCQkJCQkJbWVzc2FnZSA9IE5MUy5iaW5kKExpYnJhcnlVSVJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dCwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKSwgaW5mby50b29sVmVyc2lvbn0pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbWVzc2FnZSA9IE5MUy5iaW5kKExpYnJhcnlVSVJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dF91bmtub3duLCBuZXcgT2JqZWN0W10gewotCQkJCQkJCQlQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpfSk7Ci0JCQkJCX0KLQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS4KLQkJCQkJCWRpc3BsYXlFcnJvcihMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsIG1lc3NhZ2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmIChYTUlMaWJyYXJ5VXRpbC5pc01ldGhvZExpYnJhcnlVcGdyYWRlUmVxdWlyZWQobGliUGF0aCkpIHsKLQkJCQkJaWYgKCFMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMudXBncmFkZUxpYnJhcnlEaWFsb2dfdGV4dCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlpZiAoIXVwZ3JhZGVMaWJyYXJ5KGxpYlBhdGgsIG51bGwpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG9wZW5MaWJyYXJ5KGxpYlBhdGgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlNc2dEaWFsb2cgbXNnRGlhbG9nID0gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQkJCW1zZ0RpYWxvZy5kaXNwbGF5RXJyb3IoTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuaW52YWxpZExpYnJhcnlQYXRoX21zZywKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmludmFsaWRMaWJyYXJ5UGF0aF9yZWFzb24pOwotCQl9IHdoaWxlIChsaWJQYXRoICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGEgTWV0aG9kIExpYnJhcnkgZ2l2ZW4gdGhlIExpYnJhcnkgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgUGF0aCB0byBhIE1ldGhvZCBMaWJyYXJ5LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIE1ldGhvZCBMaWJyYXJ5IGlzIG9wZW5lZCBzdWNjZXNzZnVsbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gb3BlbkxpYnJhcnkoZmluYWwgU3RyaW5nIHBhdGgpIHsKLQkJTWFwIGFyZ3MgPSBuZXcgSGFzaE1hcCgpOwotCQlhcmdzLnB1dChYTUlMaWJyYXJ5TWFuYWdlci5BUkdfTElCUkFSWV9QQVRILCBwYXRoKTsKLQkJcmV0dXJuIG9wZW5MaWJyYXJ5KFhNSUxpYnJhcnlNYW5hZ2VyLkxJQlJBUllfVFlQRSwgYXJncyk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG9wZW5MaWJyYXJ5KGZpbmFsIFN0cmluZyB0eXBlLCBmaW5hbCBNYXAgYXJncykgewotCQlmaW5hbCBTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGFyZ3MuZ2V0KFhNSUxpYnJhcnlNYW5hZ2VyLkxJQlJBUllfVFlQRSk7Ci0JCQotCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0KLQkJZmluYWwgTGlzdCBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIGZpbmFsIElTdGF0dXNbXSBzdGF0dXMgPSBuZXcgSVN0YXR1c1sxXTsKLQotCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZwotCQkvLyBhY3Rpdml0eSB0aGF0IG1vZGlmaWVzIHRoZSB3b3Jrc3BhY2UuCi0JCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlTdHJpbmcgdGFza05hbWUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbmluZ0xpYnJhcnlUYXNrX25hbWU7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2sodGFza05hbWUsIDIpOwotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3Iuc2V0VGFza05hbWUodGFza05hbWUpOwotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jbG9zZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkub3Blbk1ldGhvZExpYnJhcnkodHlwZSwgYXJncyk7Ci0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2V0Q3VycmVudE1ldGhvZExpYnJhcnkoCi0JCQkJCQkJbGlicmFyeSk7Ci0JCQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzLnNldFNhdmVkTGlicmFyeVBhdGgocGF0aCk7Ci0JCQkJCS8vIHNob3cgUHJvYmxlbXMgVmlldyBpZiBuZWNlc3NhcnkKLQkJCQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9ICgoSUxpYnJhcnlSZXNvdXJjZVNldCkgTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKQotCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQkJCWlmIChyZXNvdXJjZVNldC5oYXNVbnJlc29sdmVkUHJveHkoKSkgewotCQkJCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlQbGF0Zm9ybVVJCi0JCQkJCQkJCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJLmdldEFjdGl2ZVBhZ2UoKQotCQkJCQkJCQkJCQkuc2hvd1ZpZXcoCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb2JsZW1WaWV3IiwgbnVsbCwgSVdvcmtiZW5jaFBhZ2UuVklFV19WSVNJQkxFKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJLy8gY291bGRuJ3Qgb3BlbiB0aGUgcHJvYmxlbSB2aWV3LCB0b28gYmFkLi4KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKCEoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uICYmIGUuZ2V0TWVzc2FnZSgpCi0JCQkJCQkJLnN0YXJ0c1dpdGgoIiMjIyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJCWVycm9ycy5hZGQoZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCkgewotCQkJCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCQkJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJCQkJc2hlbGwuc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUpOwotCQkJCX0KLQkJCX07Ci0JCQlkaWFsb2cucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOwotCQkJaWYgKGVycm9ycy5pc0VtcHR5KCkpIHsKLQkJCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQlpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCQkJCWFjdGl2ZVBhZ2UuY2xvc2VBbGxFZGl0b3JzKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJSXRlcmF0b3IgaXRlciA9IGVycm9ycy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlFeGNlcHRpb24gZSA9IChFeGNlcHRpb24pIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7Ci0JCQkJCQlTdHJpbmcgbWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCQkJaWYgKG1lc3NhZ2Uuc3RhcnRzV2l0aCgiIyMjIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBwcm9qZWN0RmlsZU5hbWUgPSBtZXNzYWdlLnN1YnN0cmluZygzKTsKLQotCQkJCQkJCVN0cmluZyBwcm9tcHQgPSBMaWJyYXJ5VUlSZXNvdXJjZXMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMucmVhZE9ubHlQcm9qZWN0RmlsZV90ZXh0LAotCQkJCQkJCQkJCQlwcm9qZWN0RmlsZU5hbWUpOwotCQkJCQkJCVN0cmluZ1tdIGJ1dHRvbkxhYmVscyA9IHsKLQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5yZXRyeUJ1dHRvbl90ZXh0LAotCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmNhbmNlbEJ1dHRvbl90ZXh0IH07Ci0JCQkJCQkJTWVzc2FnZURpYWxvZyBtc2dCb3ggPSBuZXcgTWVzc2FnZURpYWxvZyhEaXNwbGF5Ci0JCQkJCQkJCQkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQkJCQludWxsLCBwcm9tcHQsIE1lc3NhZ2VEaWFsb2cuV0FSTklORywKLQkJCQkJCQkJCWJ1dHRvbkxhYmVscywgMCk7Ci0JCQkJCQkJaWYgKG1zZ0JveC5vcGVuKCkgPT0gMCkgewotCQkJCQkJCQlyZXR1cm4gb3BlbkxpYnJhcnkocGF0aCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBvcGVucyBhIG5ldyBNZXRob2QgTGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgVGhlIE1ldGhvZCBMaWJyYXJ5IHBhdGguCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgTWV0aG9kIExpYnJhcnkgaXMgb3BlbmVkIHN1Y2Nlc3NmdWxseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjcmVhdGVMaWJyYXJ5KFN0cmluZyBwYXRoKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIGxpYnJhcnlQYXRoID0gbmV3IEZpbGUocGF0aCk7Ci0JCQlpZiAoIWxpYnJhcnlQYXRoLmV4aXN0cygpKSB7Ci0JCQkJbGlicmFyeVBhdGgubWtkaXJzKCk7Ci0JCQl9Ci0JCQlYTUlMaWJyYXJ5VXRpbC5jcmVhdGVNZXRob2RMaWJyYXJ5KGxpYnJhcnlQYXRoLmdldE5hbWUoKSwgcGF0aCk7Ci0JCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5zZXRTYXZlZExpYnJhcnlQYXRoKHBhdGgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBDb25maWd1cmF0aW9uIGNvbnRyaWJ1dGlvbiB0byB0aGUgd29ya2JlbmNoIHRvb2xiYXIuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbigpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCQlpZiAod29ya2JlbmNoICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gKElXb3JrYmVuY2hXaW5kb3cpIHdvcmtiZW5jaAotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQlpZiAod2luZG93ICE9IG51bGwgJiYgd2luZG93IGluc3RhbmNlb2YgQXBwbGljYXRpb25XaW5kb3cpIHsKLQkJCQkvLyBDaGVjayB0byBzZWUgaWYgdGhlIGNvbmZpZ3VyYXRpb24gY29udHJpYnV0aW9uIGFscmVhZHkKLQkJCQkvLyBleGlzdHMuCi0JCQkJSUNvb2xCYXJNYW5hZ2VyIGNvb2xCYXIgPSAoKEFwcGxpY2F0aW9uV2luZG93KXdpbmRvdykuZ2V0Q29vbEJhck1hbmFnZXIoKTsKLQkJCQlJQ29udHJpYnV0aW9uSXRlbSBtYXJrZXIgPSBudWxsOwotCQkJCUlDb250cmlidXRpb25JdGVtIGNvb2xCYXJJdGVtID0gY29vbEJhcgotCQkJCQkJLmZpbmQoVE9PTEJBUl9DT05GSUdfQ09OVFJJQlVUSU9OX0lEKTsKLQkJCQlpZiAoY29vbEJhckl0ZW0gIT0gbnVsbCkgewotCQkJCQlpZiAoY29vbEJhckl0ZW0uaXNWaXNpYmxlKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gY29vbEJhci5nZXRJdGVtcygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoaXRlbXNbaV0gPT0gY29vbEJhckl0ZW0pIHsKLQkJCQkJCQljb29sQmFyLnJlbW92ZShUT09MQkFSX0NPTkZJR19DT05UUklCVVRJT05fSUQpOwotCQkJCQkJCWlmIChpICsgMSA8IGl0ZW1zLmxlbmd0aCkgewotCQkJCQkJCQltYXJrZXIgPSBpdGVtc1tpICsgMV07Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJSVRvb2xCYXJNYW5hZ2VyIHRvb2xiYXJNZ3IgPSBuZXcgVG9vbEJhck1hbmFnZXIoU1dULkZMQVQKLQkJCQkJCXwgU1dULkxFRlQpOwotCQkJCUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtIHRlc3RJdGVtID0gbmV3IENvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtKAotCQkJCQkJbnVsbCk7Ci0JCQkJdG9vbGJhck1nci5hZGQodGVzdEl0ZW0pOwotCQkJCVRvb2xCYXJDb250cmlidXRpb25JdGVtIGNvbnRyaWJJdGVtID0gbmV3IFRvb2xCYXJDb250cmlidXRpb25JdGVtKAotCQkJCQkJdG9vbGJhck1nciwgVE9PTEJBUl9DT05GSUdfQ09OVFJJQlVUSU9OX0lEKTsKLQkJCQlpZiAobWFya2VyICE9IG51bGwpIHsKLQkJCQkJY29vbEJhci5pbnNlcnRCZWZvcmUobWFya2VyLmdldElkKCksIGNvbnRyaWJJdGVtKTsKLQkJCQl9IGVsc2UgewotCQkJCQljb29sQmFyLmFkZChjb250cmliSXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBncmFkZXMgYSBNZXRob2QgTGlicmFyeSB0byBhIG5ldyBtZXRhLW1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBsaWJEaXIKLQkgKiAgICAgICAgICAgIFBhdGggdG8gYSBNZXRob2QgTGlicmFyeS4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBNZXRob2QgTGlicmFyeSBpcyBzdWNlc3NmdWxseQotCSAqICAgICAgICAgdXBncmFkZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHVwZ3JhZGVMaWJyYXJ5KGZpbmFsIFN0cmluZyBsaWJEaXIsIGZpbmFsIFVwZ3JhZGVDYWxsZXJJbmZvIGNhbGxlckluZm8pIHsJCQkJCQkJCQotCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCWlmIChVcGdyYWRlQ2FsbGVySW5mby5pc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pKSB7Ci0JCQlMaWJyYXJ5QmFja3VwVXRpbC5wcm9tcHRCYWNrdXBMaWJyYXJ5KHNoZWxsLCBuZXcgRmlsZShsaWJEaXIpKTsKLQkJfQotCQkKLQkJZmluYWwgU3RyaW5nQnVmZmVyIGVyck1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZmluYWwgYm9vbGVhbltdIGNhbmNlbEZsYWdIb2xkZXIgPSB7IGZhbHNlIH07Ci0KLQkJLy8gRG8gdGhlIHdvcmsgd2l0aGluIGFuIG9wZXJhdGlvbiBiZWNhdXNlIHRoaXMgaXMgYSBsb25nIHJ1bm5pbmcKLQkJLy8gYWN0aXZpdHkgdGhhdCBtb2RpZmllcyB0aGUgd29ya2JlbmNoLgotCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJU3RyaW5nIGxpYlhtaSA9IE11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfTElCUkFSWV9NT0RFTF9GSUxFTkFNRTsKLQkJCQlpZiAoY2FsbGVySW5mbyAhPSBudWxsICYmIGNhbGxlckluZm8uZ2V0SXNFeHBvcnRlZFBsdWdpbkxpYigpKSB7Ci0JCQkJCWxpYlhtaSA9IFhNSUxpYnJhcnlNYW5hZ2VyLmV4cG9ydEZpbGU7Ci0JCQkJfQotCQkJCW1vbml0b3IuYmVnaW5UYXNrKExpYnJhcnlVSVJlc291cmNlcy51cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lLCAxMCk7Ci0JCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJdHJ5IHsKLQkJCQkJTWFwcGluZ1V0aWwKLQkJCQkJCQkubWlncmF0ZSgKLQkJCQkJCQkJCWxpYkRpcgotCQkJCQkJCQkJCQkrICIvIiArIGxpYlhtaSwgbW9uaXRvciwgY2FsbGVySW5mbyk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IAotCQkJCWNhdGNoKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJY2FuY2VsRmxhZ0hvbGRlclswXSA9IHRydWU7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQkJCWlmIChtc2cgPT0gbnVsbCkgewotCQkJCQkJbXNnID0gTGlicmFyeVVJUmVzb3VyY2VzLnVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnOwotCQkJCQl9Ci0JCQkJCWVyck1zZy5hcHBlbmQobXNnKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCS8vIFJ1biB0aGUgb3BlcmF0aW9uIGFuZCBkaXNwbGF5IHRoZSBwcm9ncmVzcy4KLQkJCVByb2dyZXNzTW9uaXRvckRpYWxvZyBwbURpYWxvZyA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpIHsJCQkKLQkJCSAgICBwcm90ZWN0ZWQgUG9pbnQgZ2V0SW5pdGlhbFNpemUoKSB7Ci0JCQkgICAgICAgIFBvaW50IGNhbGN1bGF0ZWRTaXplID0gc3VwZXIuZ2V0SW5pdGlhbFNpemUoKTsKLQkJCSAgICAgICAgaWYgKGNhbGN1bGF0ZWRTaXplLnggPCA2NzUpIHsKLQkJCSAgICAgICAgCWNhbGN1bGF0ZWRTaXplLnggPSA2NzU7Ci0JCQkJCX0KLQkJCSAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZWRTaXplOwotCQkJICAgIH0KLQkJCX07CQkgICAgCi0JCQlwbURpYWxvZy5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7Ci0JCQlpZihjYW5jZWxGbGFnSG9sZGVyWzBdKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSBpZiAoZXJyTXNnLmxlbmd0aCgpID4gMCkgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlLAotCQkJCQkJZXJyTXNnLnRvU3RyaW5nKCkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlLAotCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMudXBncmFkZUxpYnJhcnlFcnJvcl9tc2cpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgTGlicmFyeSBwYXRoIHNldCB2aWEgdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gIi1saWJyYXJ5Ci0JICogPHBhdGg+Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb21tYW5kTGluZUxpYnJhcnlQYXRoKCkgewotCQlyZXR1cm4gY21kTGluZUxpYlBhdGg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgTGlicmFyeSBwYXRoIHZpYSB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbiAiLWxpYnJhcnkgPHBhdGg+Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29tbWFuZExpbmVMaWJyYXJ5UGF0aChTdHJpbmcgbGliUGF0aCkgewotCQljbWRMaW5lTGliUGF0aCA9IGxpYlBhdGg7Ci0JCUlQYXRoIHBhdGggPSBQYXRoLmZyb21PU1N0cmluZyhsaWJQYXRoKTsKLQkJaWYgKCFwYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJLy8gVE9ETzogUmV2aWV3IGltcGxlbWVudGF0aW9uLgotCQkJY21kTGluZUxpYlBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgKyBGaWxlLnNlcGFyYXRvciArIGxpYlBhdGg7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoWE1JTGlicmFyeVV0aWwuaXNWYWxpZExpYnJhcnkoY21kTGluZUxpYlBhdGgsIHRydWUpICE9IFN0YXR1cy5PS19TVEFUVVMpIHsKLQkJCWNtZExpbmVMaWJQYXRoID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIExpYnJhcnkgcGF0aCB2aWEgdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gIi1kZWZhdWx0bGlicmFyeSA8cGF0aD4iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb21tYW5kTGluZURlZmF1bHRMaWJyYXJ5UGF0aChTdHJpbmcgbGliUGF0aCkgewotCQljbWRMaW5lRGVmYXVsdExpYlBhdGggPSBsaWJQYXRoOwotCQlJUGF0aCBwYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcobGliUGF0aCk7Ci0JCWlmICghcGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCS8vIFRPRE86IFJldmlldyBpbXBsZW1lbnRhdGlvbi4KLQkJCWNtZExpbmVEZWZhdWx0TGliUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSArIEZpbGUuc2VwYXJhdG9yICsgbGliUGF0aDsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiY21kTGluZURlZmF1bHRMaWJQYXRoPSIgKyBjbWRMaW5lRGVmYXVsdExpYlBhdGgpOwotCQlpZiAoWE1JTGlicmFyeVV0aWwuaXNWYWxpZExpYnJhcnkoY21kTGluZURlZmF1bHRMaWJQYXRoLCB0cnVlKSAhPSBTdGF0dXMuT0tfU1RBVFVTKSB7Ci0JCQljbWRMaW5lRGVmYXVsdExpYlBhdGggPSBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnRzIGxpYiBwYXRoIHRvIGFic29sdXRlIGxpYnJhcnkgcGF0aAotCSAqIAotCSAqIEBwYXJhbSBsaWJQYXRoCi0JICogQHJldHVybiBSZXR1cm5zIGFic29sdXRlIGxpYnJhcnkgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvQWJzb2x1dGVMaWJyYXJ5UGF0aChTdHJpbmcgbGliUGF0aCkgewotCQlTdHJpbmcgYWJzUGF0aCA9IGxpYlBhdGg7Ci0KLQkJSVBhdGggZWNQYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcobGliUGF0aCk7Ci0JCWlmICghZWNQYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJLy8gVE9ETzogUmV2aWV3IGltcGxlbWVudGF0aW9uLgotCQkJYWJzUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSArIEZpbGUuc2VwYXJhdG9yICsgLy8kTk9OLU5MUy0xJAotCQkJCQkiTWV0aG9kIExpYnJhcmllcyIgKyBGaWxlLnNlcGFyYXRvciArIGxpYlBhdGg7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBhYnNQYXRoOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXkgbGlicmFyeSBsb2NrZWQgbWVzc2FnZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGRpc3BsYXlMaWJyYXJ5TG9ja2VkTWVzc2FnZSgpIHsKLQkJU2hlbGwgc2hlbGwgPSBudWxsOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzaGVsbCA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpCi0JCQkJCS5nZXRBY3RpdmVTaGVsbCgpOwotCQkJaW1hZ2UgPSBzaGVsbC5nZXRJbWFnZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCU1lc3NhZ2VEaWFsb2cgbXNnRGxnID0gbmV3IE1lc3NhZ2VEaWFsb2coc2hlbGwsCi0JCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLCBpbWFnZSwKLQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMubGlicmFyeUxvY2tlZF9tc2csIE1lc3NhZ2VEaWFsb2cuRVJST1IsCi0JCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5saWJyYXJ5TG9ja2VkX29wZW5CdXR0b25fdGV4dCwKLQkJCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH0sCi0JCQkJMSk7Ci0KLQkJcmV0dXJuIG1zZ0RsZy5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhcHBsaWNhdGlvbiBuYW1lCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXBwTmFtZSgpIHsKLQkJcmV0dXJuIGFwcE5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFwcGxpY2F0aW9uIG5hbWUKLQkgKiBAcGFyYW0gYXBwTmFtZQotCSAqIAkJCUFwcGxpY2F0aW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QXBwTmFtZShTdHJpbmcgYXBwTmFtZSkgewotCQlMaWJyYXJ5VUlNYW5hZ2VyLmFwcE5hbWUgPSBhcHBOYW1lOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOGNjYmU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi0vKioKLSAqIFRoZSBMaWJyYXJ5IFVJIHBsdWctaW4gY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIExpYnJhcnlVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5VUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpYnJhcnlVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVJlc291cmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlYzJmZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBMaWJyYXJ5IFVJIFJlc291cmNlcwotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlVSVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXBhYmlsaXR5UGF0dGVybl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tsaXN0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0l0ZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBvc2l0ZVJvbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNlcHRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRlbnRQYWNrYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21DYXRlZ29yeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJ5UHJvY2Vzc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZUdyb3VwaW5nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW5nTWV0cmljX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4YW1wbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRhbmNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkZWxpbmVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGl0ZXJhdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kQ29udGVudF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kTGlicmFyeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kUGFja2FnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kUGx1Z2luX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtaWxlc3RvbmVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dGNvbWVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBoYXNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0ZhbWlseV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc1BhY2thZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9ydF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV1c2FibGVBc3NldF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9hZG1hcF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURlc2NyaXB0b3JfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRHcm91cGluZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhbmRhcmRDYXRlZ29yeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RlcF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrRGVzY3JpcHRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVhbVByb2ZpbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlbXBsYXRlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZXJtRGVmaW5pdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbE1lbnRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2hpdGVwYXBlcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RFbGVtZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFR5cGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGl2aXR5X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXBhYmlsaXR5UGF0dGVybl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrbGlzdF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrSXRlbV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBvc2l0ZVJvbGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jZXB0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udGVudFBhY2thZ2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21DYXRlZ29yeV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcnlQcm9jZXNzX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRvcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lR3JvdXBpbmdfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5fdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0ZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRpbmdNZXRyaWNfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGFtcGxlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGFuY2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkZWxpbmVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpdGVyYXRpb25fdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RDb25maWd1cmF0aW9uX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kQ29udGVudF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZExpYnJhcnlfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RQYWNrYWdlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kUGx1Z2luX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWlsZXN0b25lX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0Y29tZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBoYXNlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NGYW1pbHlfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzUGFja2FnZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9ydF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldXNhYmxlQXNzZXRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2FkbWFwX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURlc2NyaXB0b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRHcm91cGluZ190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YW5kYXJkQ2F0ZWdvcnlfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGVwX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VwcG9ydGluZ01hdGVyaWFsX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tEZXNjcmlwdG9yX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVhbVByb2ZpbGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wbGF0ZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlcm1EZWZpbml0aW9uX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xNZW50b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aGl0ZXBhcGVyX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdEVsZW1lbnRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFR5cGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBsaWNhdGlvbl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlNYWluV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5TWFpbldpemFyZFBhZ2VfdGl0bGVfMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5TWFpbldpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhdGhMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cmlMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5VHlwZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5TGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvbXB0Rm9yTGlicmFyeUNoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuTGlicmFyeURpYWxvZ19uZXdMaWJyYXJ5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuTGlicmFyeUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5SW50ZXJubEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uNDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfYWR2aWNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZExpYnJhcnlQYXRoX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRMaWJyYXJ5UGF0aF9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5TG9ja2VkX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlMb2NrZWRfb3BlbkJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZE9ubHlQcm9qZWN0RmlsZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV0cnlCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbmNlbEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBncmFkZUxpYnJhcnlEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cGdyYWRlTGlicmFyeURpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBncmFkaW5nTGlicmFyeVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3dpdGNoQ29uZmlnRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3dpdGNoQ29uZmlnRGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXJyZW50Q29uZmlnTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVGaWxlc0NvbmZpcm1hdGlvbl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVGaWxlc0Vycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVBhdGhFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkUGF0aF9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYWNrdXBMaWJyYXJ5RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFja3VwTGlicmFyeURpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFja2luZ1VwTGlicmFyeVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhdGhTZWxlY3Rpb25FcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBva0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2tpcEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWx3YXlzQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXZlckJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvbXB0QnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaW5rVG9VUkxfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpbmtUb0ZpbGVfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRMaW5rX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50TGlua1dpdGhUeXBlX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50TGlua1dpdGhVc2VyVGV4dF9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEFjdGl2aXR5RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEFjdGl2aXR5RGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bnN1cHBvcnRlZEFjdGl2aXR5VHlwZV9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bnN1cHBvcnRlZEFjdGl2aXR5VHlwZV9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0X3Vua25vd247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzZXNMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJpZWZEZXNjcmlwdGlvbkxhYmVsX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb25fZGVsZXRlY29uZmlybV90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlybURlbGV0ZURpYWxvZ19tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlybURlbGV0ZURpYWxvZ19tc2dXaXRoUmVmZXJlbmNlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQ7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBMaWJyYXJ5VUlSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2Uga2V5IGFuZCBmb3JtYXR0ZWQKLQkgKiB3aXRoIGEgZ2l2ZW4gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2Uga2V5LgotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBBbiBvYmplY3QuCi0JICogQHJldHVybiBBIGZvcm1hdHRlZCBsb2NhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGtleSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKGtleSwgbmV3IE9iamVjdFtdIHsgZGF0YSB9KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlUZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI3NjMwMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNoZWNrbGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db25jZXB0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRvbWFpbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkV4YW1wbGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkZWxpbmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JdGVyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NaWxlc3RvbmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5PdXRjb21lSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGhhc2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NGYW1pbHlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlcG9ydEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJldXNhYmxlQXNzZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2FkbWFwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0ZXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlbXBsYXRlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVybURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Ub29sSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbE1lbnRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldoaXRlcGFwZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGw7Ci0KLS8qKgotICogRGVmaW5lcyBhbmQgY2FjaGVzIHRoZSBjb21tb25seSByZWZlcmVuY2VkIHRleHQgaW4gdGhlIExpYnJhcnkgVUkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVVJVGV4dCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0FDVElWSVRZID0gTGlicmFyeVVJUmVzb3VyY2VzLmFjdGl2aXR5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0FSVElGQUNUID0gTGlicmFyeVVJUmVzb3VyY2VzLmFydGlmYWN0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NBUEFCSUxJVFlfUEFUVEVSTiA9IExpYnJhcnlVSVJlc291cmNlcy5jYXBhYmlsaXR5UGF0dGVybl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DSEVDS0xJU1QgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY2hlY2tsaXN0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NIRUNLX0lURU0gPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY2hlY2tJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NPTVBPU0lURV9ST0xFID0gTGlicmFyeVVJUmVzb3VyY2VzLmNvbXBvc2l0ZVJvbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ09OQ0VQVCA9IExpYnJhcnlVSVJlc291cmNlcy5jb25jZXB0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NPTlRFTlRfUEFDS0FHRSA9IExpYnJhcnlVSVJlc291cmNlcy5jb250ZW50UGFja2FnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DVVNUT01fQ0FURUdPUlkgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY3VzdG9tQ2F0ZWdvcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfREVMSVZFUkFCTEUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZGVsaXZlcmFibGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfREVMSVZFUllfUFJPQ0VTUyA9IExpYnJhcnlVSVJlc291cmNlcy5kZWxpdmVyeVByb2Nlc3NfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfREVTQ1JJUFRPUiA9IExpYnJhcnlVSVJlc291cmNlcy5kZXNjcmlwdG9yX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RJU0NJUExJTkUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZGlzY2lwbGluZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ESVNDSVBMSU5FX0dST1VQSU5HID0gTGlicmFyeVVJUmVzb3VyY2VzLmRpc2NpcGxpbmVHcm91cGluZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ET01BSU4gPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZG9tYWluX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0VTVElNQVRFID0gTGlicmFyeVVJUmVzb3VyY2VzLmV4YW1wbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRVNUSU1BVElOR19NRVRSSUMgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZXN0aW1hdGluZ01ldHJpY190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gTGlicmFyeVVJUmVzb3VyY2VzLmVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FWEFNUExFID0gTGlicmFyeVVJUmVzb3VyY2VzLmV4YW1wbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfR1VJREFOQ0UgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZ3VpZGFuY2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfR1VJREVMSU5FID0gTGlicmFyeVVJUmVzb3VyY2VzLmd1aWRlbGluZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9JVEVSQVRJT04gPSBMaWJyYXJ5VUlSZXNvdXJjZXMuaXRlcmF0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FVEhPRF9DT05GSUdVUkFUT04gPSBMaWJyYXJ5VUlSZXNvdXJjZXMubWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9NRVRIT0RfQ09OVEVOVCA9IExpYnJhcnlVSVJlc291cmNlcy5tZXRob2RDb250ZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FVEhPRF9MSUJBUkFSWSA9IExpYnJhcnlVSVJlc291cmNlcy5tZXRob2RMaWJyYXJ5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FVEhPRF9QQUNLQUdFID0gTGlicmFyeVVJUmVzb3VyY2VzLm1ldGhvZFBhY2thZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX1BMVUdJTiA9IExpYnJhcnlVSVJlc291cmNlcy5tZXRob2RQbHVnaW5fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUlMRVNUT05FID0gTGlicmFyeVVJUmVzb3VyY2VzLm1pbGVzdG9uZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9PVVRDT01FID0gTGlicmFyeVVJUmVzb3VyY2VzLm91dGNvbWVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUEhBU0UgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucGhhc2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJBQ1RJQ0UgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJhY3RpY2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJPQ0VTUyA9IExpYnJhcnlVSVJlc291cmNlcy5wcm9jZXNzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1BST0NFU1NfQ09OVFJJQlVUSU9OID0gTGlicmFyeVVJUmVzb3VyY2VzLnByb2Nlc3NDb250cmlidXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJPQ0VTU19GQU1JTFkgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJvY2Vzc0ZhbWlseV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QUk9DRVNTX1BBQ0tBR0UgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJvY2Vzc1BhY2thZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUkVQT1JUID0gTGlicmFyeVVJUmVzb3VyY2VzLnJlcG9ydF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9SRVVTQUJMRV9BU1NFVCA9IExpYnJhcnlVSVJlc291cmNlcy5yZXVzYWJsZUFzc2V0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JPQURNQVAgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9hZG1hcF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ST0xFID0gTGlicmFyeVVJUmVzb3VyY2VzLnJvbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9ERVNDUklQVE9SID0gTGlicmFyeVVJUmVzb3VyY2VzLnJvbGVEZXNjcmlwdG9yX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JPTEVfU0VUID0gTGlicmFyeVVJUmVzb3VyY2VzLnJvbGVTZXRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9TRVRfR1JPVVBJTkcgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9sZVNldEdyb3VwaW5nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NUQU5EQVJEX0NBVEVHT1JZID0gTGlicmFyeVVJUmVzb3VyY2VzLnN0YW5kYXJkQ2F0ZWdvcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfU1RFUCA9IExpYnJhcnlVSVJlc291cmNlcy5zdGVwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RBU0sgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudGFza190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9UQVNLX0RFU0NSSVBUT1IgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudGFza0Rlc2NyaXB0b3JfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVEVBTV9QUk9GSUxFID0gTGlicmFyeVVJUmVzb3VyY2VzLnRlYW1Qcm9maWxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RFTVBMQVRFID0gTGlicmFyeVVJUmVzb3VyY2VzLnRlbXBsYXRlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RFUk1fREVGSU5JVElPTiA9IExpYnJhcnlVSVJlc291cmNlcy50ZXJtRGVmaW5pdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9UT09MID0gTGlicmFyeVVJUmVzb3VyY2VzLnRvb2xfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVE9PTF9NRU5UT1IgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudG9vbE1lbnRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9XSElURVBBUEVSID0gTGlicmFyeVVJUmVzb3VyY2VzLndoaXRlcGFwZXJfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfV09SS19QUk9EVUNUID0gTGlicmFyeVVJUmVzb3VyY2VzLndvcmtQcm9kdWN0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dPUktfUFJPRFVDVF9ERVNDUklQVE9SID0gTGlicmFyeVVJUmVzb3VyY2VzLndvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9XT1JLX1BST0RVQ1RfRUxFTUVOVCA9IExpYnJhcnlVSVJlc291cmNlcy53b3JrUHJvZHVjdEVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfV09SS19QUk9EVUNUX1RZUEUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMud29ya1Byb2R1Y3RUeXBlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0FDVElWSVRZX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5hY3Rpdml0eV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQVJUSUZBQ1RfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmFydGlmYWN0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DQVBBQklMSVRZX1BBVFRFUk5fUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmNhcGFiaWxpdHlQYXR0ZXJuX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DSEVDS0xJU1RfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmNoZWNrbGlzdF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ0hFQ0tfSVRFTV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY2hlY2tJdGVtX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DT01QT1NJVEVfUk9MRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY29tcG9zaXRlUm9sZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ09OQ0VQVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY29uY2VwdF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ09OVEVOVF9QQUNLQUdFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5jb250ZW50UGFja2FnZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ1VTVE9NX0NBVEVHT1JZX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5jdXN0b21DYXRlZ29yeV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfREVMSVZFUkFCTEVfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmRlbGl2ZXJhYmxlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ERUxJVkVSWV9QUk9DRVNTX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5kZWxpdmVyeVByb2Nlc3NfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RFU0NSSVBUT1JfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmRlc2NyaXB0b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RJU0NJUExJTkVfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmRpc2NpcGxpbmVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RJU0NJUExJTkVfR1JPVVBJTkdfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmRpc2NpcGxpbmVHcm91cGluZ190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRE9NQUlOX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5kb21haW5fdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0VTVElNQVRFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5leGFtcGxlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FU1RJTUFUSU5HX01FVFJJQ19QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZXN0aW1hdGluZ01ldHJpY190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FWEFNUExFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5leGFtcGxlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9HVUlEQU5DRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZ3VpZGFuY2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0dVSURFTElORV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZ3VpZGVsaW5lX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9JVEVSQVRJT05fUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLml0ZXJhdGlvbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX0NPTkZJR1VSQVRPTl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMubWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX0NPTlRFTlRfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLm1ldGhvZENvbnRlbnRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FVEhPRF9MSUJBUkFSWV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMubWV0aG9kTGlicmFyeV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX1BBQ0tBR0VfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLm1ldGhvZFBhY2thZ2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FVEhPRF9QTFVHSU5fUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLm1ldGhvZFBsdWdpbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUlMRVNUT05FX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5taWxlc3RvbmVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX09VVENPTUVfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLm91dGNvbWVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1BIQVNFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5waGFzZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJBQ1RJQ0VfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnByYWN0aWNlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QUk9DRVNTX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5wcm9jZXNzX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QUk9DRVNTX0NPTlRSSUJVVElPTl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJPQ0VTU19GQU1JTFlfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnByb2Nlc3NGYW1pbHlfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1BST0NFU1NfUEFDS0FHRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJvY2Vzc1BhY2thZ2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JFUE9SVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucmVwb3J0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9SRVVTQUJMRV9BU1NFVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucmV1c2FibGVBc3NldF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9BRE1BUF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9hZG1hcF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9sZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9ERVNDUklQVE9SX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5yb2xlRGVzY3JpcHRvcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9TRVRfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnJvbGVTZXRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JPTEVfU0VUX0dST1VQSU5HX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5yb2xlU2V0R3JvdXBpbmdfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NUQU5EQVJEX0NBVEVHT1JZX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5zdGFuZGFyZENhdGVnb3J5X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9TVEVQX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5zdGVwX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9TVVBQT1JUSU5HX01BVEVSSUFMX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RBU0tfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnRhc2tfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RBU0tfREVTQ1JJUFRPUl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudGFza0Rlc2NyaXB0b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RFQU1fUFJPRklMRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudGVhbVByb2ZpbGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RFTVBMQVRFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy50ZW1wbGF0ZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVEVSTV9ERUZJTklUSU9OX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy50ZXJtRGVmaW5pdGlvbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVE9PTF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudG9vbF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVE9PTF9NRU5UT1JfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnRvb2xNZW50b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dISVRFUEFQRVJfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLndoaXRlcGFwZXJfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dPUktfUFJPRFVDVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMud29ya1Byb2R1Y3RfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dPUktfUFJPRFVDVF9ERVNDUklQVE9SX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy53b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dPUktfUFJPRFVDVF9FTEVNRU5UX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy53b3JrUHJvZHVjdEVsZW1lbnRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dPUktfUFJPRFVDVF9UWVBFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy53b3JrUHJvZHVjdFR5cGVfdGV4dF9wbHVyYWw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgRUxFTUVOVF9URVhUID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBFTEVNRU5UX1RFWFRfUExVUkFMID0gbmV3IEhhc2hNYXAoKTsKLQotCXN0YXRpYyB7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoQWN0aXZpdHlJbXBsLmNsYXNzLCBURVhUX0FDVElWSVRZKTsKLQkJRUxFTUVOVF9URVhULnB1dChBcnRpZmFjdEltcGwuY2xhc3MsIFRFWFRfQVJUSUZBQ1QpOwotCQlFTEVNRU5UX1RFWFQucHV0KENhcGFiaWxpdHlQYXR0ZXJuSW1wbC5jbGFzcywgVEVYVF9DQVBBQklMSVRZX1BBVFRFUk4pOwotCQlFTEVNRU5UX1RFWFQucHV0KENoZWNrbGlzdEltcGwuY2xhc3MsIFRFWFRfQ0hFQ0tMSVNUKTsKLQkJRUxFTUVOVF9URVhULnB1dChDb21wb3NpdGVSb2xlSW1wbC5jbGFzcywgVEVYVF9DT01QT1NJVEVfUk9MRSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoQ29uY2VwdEltcGwuY2xhc3MsIFRFWFRfQ09OQ0VQVCk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoQ29udGVudFBhY2thZ2VJbXBsLmNsYXNzLCBURVhUX0NPTlRFTlRfUEFDS0FHRSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoQ3VzdG9tQ2F0ZWdvcnlJbXBsLmNsYXNzLCBURVhUX0NVU1RPTV9DQVRFR09SWSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoRGVsaXZlcmFibGVJbXBsLmNsYXNzLCBURVhUX0RFTElWRVJBQkxFKTsKLQkJRUxFTUVOVF9URVhULnB1dChEZWxpdmVyeVByb2Nlc3NJbXBsLmNsYXNzLCBURVhUX0RFTElWRVJZX1BST0NFU1MpOwotCQlFTEVNRU5UX1RFWFQucHV0KERpc2NpcGxpbmVJbXBsLmNsYXNzLCBURVhUX0RJU0NJUExJTkUpOwotCQlFTEVNRU5UX1RFWFQKLQkJCQkucHV0KERpc2NpcGxpbmVHcm91cGluZ0ltcGwuY2xhc3MsIFRFWFRfRElTQ0lQTElORV9HUk9VUElORyk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoRG9tYWluSW1wbC5jbGFzcywgVEVYVF9ET01BSU4pOwotCQlFTEVNRU5UX1RFWFQucHV0KEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuY2xhc3MsCi0JCQkJVEVYVF9FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQkJRUxFTUVOVF9URVhULnB1dChFeGFtcGxlSW1wbC5jbGFzcywgVEVYVF9FWEFNUExFKTsKLQkJRUxFTUVOVF9URVhULnB1dChHdWlkZWxpbmVJbXBsLmNsYXNzLCBURVhUX0dVSURFTElORSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoSXRlcmF0aW9uSW1wbC5jbGFzcywgVEVYVF9JVEVSQVRJT04pOwotCQlFTEVNRU5UX1RFWFQucHV0KE1ldGhvZENvbmZpZ3VyYXRpb25JbXBsLmNsYXNzLAotCQkJCVRFWFRfTUVUSE9EX0NPTkZJR1VSQVRPTik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoTWV0aG9kTGlicmFyeUltcGwuY2xhc3MsIFRFWFRfTUVUSE9EX0xJQkFSQVJZKTsKLQkJRUxFTUVOVF9URVhULnB1dChNZXRob2RQYWNrYWdlSW1wbC5jbGFzcywgVEVYVF9NRVRIT0RfUEFDS0FHRSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoTWV0aG9kUGx1Z2luSW1wbC5jbGFzcywgVEVYVF9NRVRIT0RfUExVR0lOKTsKLQkJRUxFTUVOVF9URVhULnB1dChNaWxlc3RvbmVJbXBsLmNsYXNzLCBURVhUX01JTEVTVE9ORSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoT3V0Y29tZUltcGwuY2xhc3MsIFRFWFRfT1VUQ09NRSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoUGhhc2VJbXBsLmNsYXNzLCBURVhUX1BIQVNFKTsKLQkJRUxFTUVOVF9URVhULnB1dChQcmFjdGljZUltcGwuY2xhc3MsIFRFWFRfUFJBQ1RJQ0UpOwotCQlFTEVNRU5UX1RFWFQucHV0KFByb2Nlc3NGYW1pbHlJbXBsLmNsYXNzLCBURVhUX1BST0NFU1NfRkFNSUxZKTsKLQkJRUxFTUVOVF9URVhULnB1dChQcm9jZXNzUGFja2FnZUltcGwuY2xhc3MsIFRFWFRfUFJPQ0VTU19QQUNLQUdFKTsKLQkJRUxFTUVOVF9URVhULnB1dChSZXBvcnRJbXBsLmNsYXNzLCBURVhUX1JFUE9SVCk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoUmV1c2FibGVBc3NldEltcGwuY2xhc3MsIFRFWFRfUkVVU0FCTEVfQVNTRVQpOwotCQlFTEVNRU5UX1RFWFQucHV0KFJvYWRtYXBJbXBsLmNsYXNzLCBURVhUX1JPQURNQVApOwotCQlFTEVNRU5UX1RFWFQucHV0KFJvbGVJbXBsLmNsYXNzLCBURVhUX1JPTEUpOwotCQlFTEVNRU5UX1RFWFQucHV0KFJvbGVEZXNjcmlwdG9ySW1wbC5jbGFzcywgVEVYVF9ST0xFX0RFU0NSSVBUT1IpOwotCQlFTEVNRU5UX1RFWFQucHV0KFJvbGVTZXRJbXBsLmNsYXNzLCBURVhUX1JPTEVfU0VUKTsKLQkJRUxFTUVOVF9URVhULnB1dChSb2xlU2V0R3JvdXBpbmdJbXBsLmNsYXNzLCBURVhUX1JPTEVfU0VUX0dST1VQSU5HKTsKLQkJRUxFTUVOVF9URVhULnB1dChTdGVwSW1wbC5jbGFzcywgVEVYVF9TVEVQKTsKLQkJRUxFTUVOVF9URVhUCi0JCQkJLnB1dChTdXBwb3J0aW5nTWF0ZXJpYWxJbXBsLmNsYXNzLCBURVhUX1NVUFBPUlRJTkdfTUFURVJJQUwpOwotCQlFTEVNRU5UX1RFWFQucHV0KFRhc2tJbXBsLmNsYXNzLCBURVhUX1RBU0spOwotCQlFTEVNRU5UX1RFWFQucHV0KFRhc2tEZXNjcmlwdG9ySW1wbC5jbGFzcywgVEVYVF9UQVNLX0RFU0NSSVBUT1IpOwotCQlFTEVNRU5UX1RFWFQucHV0KFRlYW1Qcm9maWxlSW1wbC5jbGFzcywgVEVYVF9URUFNX1BST0ZJTEUpOwotCQlFTEVNRU5UX1RFWFQucHV0KFRlbXBsYXRlSW1wbC5jbGFzcywgVEVYVF9URU1QTEFURSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoVGVybURlZmluaXRpb25JbXBsLmNsYXNzLCBURVhUX1RFUk1fREVGSU5JVElPTik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoVGVtcGxhdGVJbXBsLmNsYXNzLCBURVhUX1RFTVBMQVRFKTsKLQkJRUxFTUVOVF9URVhULnB1dChUb29sSW1wbC5jbGFzcywgVEVYVF9UT09MKTsKLQkJRUxFTUVOVF9URVhULnB1dChUb29sTWVudG9ySW1wbC5jbGFzcywgVEVYVF9UT09MX01FTlRPUik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoV2hpdGVwYXBlckltcGwuY2xhc3MsIFRFWFRfV0hJVEVQQVBFUik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoV29ya1Byb2R1Y3RJbXBsLmNsYXNzLCBURVhUX1dPUktfUFJPRFVDVCk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5jbGFzcywKLQkJCQlURVhUX1dPUktfUFJPRFVDVF9ERVNDUklQVE9SKTsKLQkJRUxFTUVOVF9URVhULnB1dChXb3JrUHJvZHVjdFR5cGVJbXBsLmNsYXNzLCBURVhUX1dPUktfUFJPRFVDVF9UWVBFKTsKLQotCQkvLyBwbHVyYWwKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoQWN0aXZpdHlJbXBsLmNsYXNzLCBURVhUX0FDVElWSVRZX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KEFydGlmYWN0SW1wbC5jbGFzcywgVEVYVF9BUlRJRkFDVF9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChDYXBhYmlsaXR5UGF0dGVybkltcGwuY2xhc3MsCi0JCQkJVEVYVF9DQVBBQklMSVRZX1BBVFRFUk5fUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoQ2hlY2tsaXN0SW1wbC5jbGFzcywgVEVYVF9DSEVDS0xJU1RfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoQ29tcG9zaXRlUm9sZUltcGwuY2xhc3MsCi0JCQkJVEVYVF9DT01QT1NJVEVfUk9MRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChDb25jZXB0SW1wbC5jbGFzcywgVEVYVF9DT05DRVBUX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KENvbnRlbnRQYWNrYWdlSW1wbC5jbGFzcywKLQkJCQlURVhUX0NPTlRFTlRfUEFDS0FHRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChDdXN0b21DYXRlZ29yeUltcGwuY2xhc3MsCi0JCQkJVEVYVF9DVVNUT01fQ0FURUdPUllfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRGVsaXZlcmFibGVJbXBsLmNsYXNzLCBURVhUX0RFTElWRVJBQkxFX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KERlbGl2ZXJ5UHJvY2Vzc0ltcGwuY2xhc3MsCi0JCQkJVEVYVF9ERUxJVkVSWV9QUk9DRVNTX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KERpc2NpcGxpbmVJbXBsLmNsYXNzLCBURVhUX0RJU0NJUExJTkVfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRGlzY2lwbGluZUdyb3VwaW5nSW1wbC5jbGFzcywKLQkJCQlURVhUX0RJU0NJUExJTkVfR1JPVVBJTkdfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRG9tYWluSW1wbC5jbGFzcywgVEVYVF9ET01BSU5fUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbC5jbGFzcywKLQkJCQlURVhUX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlNfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRXhhbXBsZUltcGwuY2xhc3MsIFRFWFRfRVhBTVBMRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChHdWlkZWxpbmVJbXBsLmNsYXNzLCBURVhUX0dVSURFTElORV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChJdGVyYXRpb25JbXBsLmNsYXNzLCBURVhUX0lURVJBVElPTl9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChNZXRob2RDb25maWd1cmF0aW9uSW1wbC5jbGFzcywKLQkJCQlURVhUX01FVEhPRF9DT05GSUdVUkFUT05fUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoTWV0aG9kTGlicmFyeUltcGwuY2xhc3MsCi0JCQkJVEVYVF9NRVRIT0RfTElCQVJBUllfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoTWV0aG9kUGFja2FnZUltcGwuY2xhc3MsCi0JCQkJVEVYVF9NRVRIT0RfUEFDS0FHRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChNZXRob2RQbHVnaW5JbXBsLmNsYXNzLAotCQkJCVRFWFRfTUVUSE9EX1BMVUdJTl9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChNaWxlc3RvbmVJbXBsLmNsYXNzLCBURVhUX01JTEVTVE9ORV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChPdXRjb21lSW1wbC5jbGFzcywgVEVYVF9PVVRDT01FX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFBoYXNlSW1wbC5jbGFzcywgVEVYVF9QSEFTRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChQcmFjdGljZUltcGwuY2xhc3MsIFRFWFRfUFJBQ1RJQ0VfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUHJvY2Vzc0ZhbWlseUltcGwuY2xhc3MsCi0JCQkJVEVYVF9QUk9DRVNTX0ZBTUlMWV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChQcm9jZXNzUGFja2FnZUltcGwuY2xhc3MsCi0JCQkJVEVYVF9QUk9DRVNTX1BBQ0tBR0VfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUmVwb3J0SW1wbC5jbGFzcywgVEVYVF9SRVBPUlRfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUmV1c2FibGVBc3NldEltcGwuY2xhc3MsCi0JCQkJVEVYVF9SRVVTQUJMRV9BU1NFVF9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChSb2FkbWFwSW1wbC5jbGFzcywgVEVYVF9ST0FETUFQX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFJvbGVJbXBsLmNsYXNzLCBURVhUX1JPTEVfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUm9sZURlc2NyaXB0b3JJbXBsLmNsYXNzLAotCQkJCVRFWFRfUk9MRV9ERVNDUklQVE9SX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFJvbGVTZXRJbXBsLmNsYXNzLCBURVhUX1JPTEVfU0VUX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFJvbGVTZXRHcm91cGluZ0ltcGwuY2xhc3MsCi0JCQkJVEVYVF9ST0xFX1NFVF9HUk9VUElOR19QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChTdGVwSW1wbC5jbGFzcywgVEVYVF9TVEVQX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFN1cHBvcnRpbmdNYXRlcmlhbEltcGwuY2xhc3MsCi0JCQkJVEVYVF9TVVBQT1JUSU5HX01BVEVSSUFMX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFRhc2tJbXBsLmNsYXNzLCBURVhUX1RBU0tfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoVGFza0Rlc2NyaXB0b3JJbXBsLmNsYXNzLAotCQkJCVRFWFRfVEFTS19ERVNDUklQVE9SX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwKLQkJCQkucHV0KFRlYW1Qcm9maWxlSW1wbC5jbGFzcywgVEVYVF9URUFNX1BST0ZJTEVfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoVGVtcGxhdGVJbXBsLmNsYXNzLCBURVhUX1RFTVBMQVRFX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFRlcm1EZWZpbml0aW9uSW1wbC5jbGFzcywKLQkJCQlURVhUX1RFUk1fREVGSU5JVElPTl9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChUZW1wbGF0ZUltcGwuY2xhc3MsIFRFWFRfVEVNUExBVEVfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoVG9vbEltcGwuY2xhc3MsIFRFWFRfVE9PTF9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChUb29sTWVudG9ySW1wbC5jbGFzcywgVEVYVF9UT09MX01FTlRPUl9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChXaGl0ZXBhcGVySW1wbC5jbGFzcywgVEVYVF9XSElURVBBUEVSX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwKLQkJCQkucHV0KFdvcmtQcm9kdWN0SW1wbC5jbGFzcywgVEVYVF9XT1JLX1BST0RVQ1RfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5jbGFzcywKLQkJCQlURVhUX1dPUktfUFJPRFVDVF9ERVNDUklQVE9SX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFdvcmtQcm9kdWN0VHlwZUltcGwuY2xhc3MsCi0JCQkJVEVYVF9XT1JLX1BST0RVQ1RfVFlQRV9QTFVSQUwpOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXNlciBmcmllbmRseSB0ZXh0IGZvciBhIE1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVJVGV4dChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldFVJVGV4dChlbGVtZW50LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXNlciBmcmllbmRseSB0ZXh0IGZvciBhIE1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBwbHVyYWwKLQkgKiAgICAgICAgICAgIHRydWUgdG8gcmV0dXJuIHRoZSBwbHVyYWwgZm9ybQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVJVGV4dChNZXRob2RFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gcGx1cmFsKSB7Ci0JCWlmIChwbHVyYWwpIHsKLQkJCVN0cmluZyBsYWJlbCA9IChTdHJpbmcpIEVMRU1FTlRfVEVYVF9QTFVSQUwuZ2V0KGVsZW1lbnQuZ2V0Q2xhc3MoKSk7Ci0JCQlyZXR1cm4gKGxhYmVsID09IG51bGwpID8gZWxlbWVudC5nZXROYW1lKCkgOiBsYWJlbDsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBsYWJlbCA9IChTdHJpbmcpIEVMRU1FTlRfVEVYVC5nZXQoZWxlbWVudC5nZXRDbGFzcygpKTsKLQkJCXJldHVybiAobGFiZWwgPT0gbnVsbCkgPyBlbGVtZW50LmdldE5hbWUoKSA6IGxhYmVsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXNlciBmcmllbmRseSB0ZXh0IGZvciBhIE1ldGhvZCBlbGVtZW50IGluIGxvd2VyIGNhc2UgKGV4Y2VwdAotCSAqIGZvciBHZXJtYW4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVJVGV4dExvd2VyKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0VUlUZXh0TG93ZXIoZWxlbWVudCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVzZXIgZnJpZW5kbHkgdGV4dCBmb3IgYSBNZXRob2QgZWxlbWVudCBpbiBsb3dlciBjYXNlIChleGNlcHQKLQkgKiBmb3IgR2VybWFuKS4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1cmFsCi0JICogICAgICAgICAgICB0cnVlIHRvIHJldHVybiB0aGUgcGx1cmFsIGZvcm0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVSVRleHRMb3dlcihNZXRob2RFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gcGx1cmFsKSB7Ci0JCVN0cmluZyBsYWJlbDsKLQkJaWYgKHBsdXJhbCkgewotCQkJbGFiZWwgPSAoU3RyaW5nKSBFTEVNRU5UX1RFWFRfUExVUkFMLmdldChlbGVtZW50LmdldENsYXNzKCkpOwotCQkJbGFiZWwgPSAobGFiZWwgPT0gbnVsbCkgPyBlbGVtZW50LmdldE5hbWUoKSA6IGxhYmVsOwotCQl9IGVsc2UgewotCQkJbGFiZWwgPSAoU3RyaW5nKSBFTEVNRU5UX1RFWFQuZ2V0KGVsZW1lbnQuZ2V0Q2xhc3MoKSk7Ci0JCQlsYWJlbCA9IChsYWJlbCA9PSBudWxsKSA/IGVsZW1lbnQuZ2V0TmFtZSgpIDogbGFiZWw7Ci0JCX0KLQotCQlyZXR1cm4gU3RyVXRpbC50b0xvd2VyKGxhYmVsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJhMTQ3ZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEhlbHBlciB1dGlsaXRpZXMgZm9yIGltcGxlbWVudGluZyBtZXRob2QgbGlicmFyeSBVSS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VUlVdGlsIHsKLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGFwcGxpY2F0aW9uIHNoZWxsIHRpdGxlIHRvIGRpc3BsYXkgdGhlIGFwcGxpY2F0aW9uIG5hbWUgYW5kCi0JICogdGhlIGRlZmF1bHQgbWV0aG9kIGxpYnJhcnkgcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlU2hlbGxUaXRsZSgpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCVNoZWxsIHNoZWxsID0gd2luZG93LmdldFNoZWxsKCk7Ci0JCQlpZiAoc2hlbGwgIT0gbnVsbCkgewotCQkJCVN0cmluZyBsaWJQYXRoID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpOyAKLQkJCQlpZihsaWJQYXRoID09IG51bGwpIHsKLQkJCQkJbGliUGF0aCA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKS5nZXROYW1lKCk7Ci0JCQkJfQotCQkJCVN0cmluZyBhcHBOYW1lID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKTsKLQkJCQlTdHJpbmcgYXBwVGl0bGUgPSBOTFMuYmluZChMaWJyYXJ5VUlSZXNvdXJjZXMuYXBwbGljYXRpb25fdGl0bGUsCi0JCQkJCQluZXcgT2JqZWN0W10geyBhcHBOYW1lLCBsaWJQYXRoIH0pOwotCQkJCXNoZWxsLnNldFRleHQoYXBwVGl0bGUpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4N2Y4OGI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgTWV0aG9kIEVsZW1lbnQgTmFtZXMgKFNpbmd1bGFyKQotYWN0aXZpdHlfdGV4dD1BY3Rpdml0eQotYXJ0aWZhY3RfdGV4dD1BcnRpZmFjdAotY2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1DYXBhYmlsaXR5IFBhdHRlcm4KLWNoZWNrbGlzdF90ZXh0PUNoZWNrbGlzdAotY2hlY2tJdGVtX3RleHQ9Q2hlY2sgSXRlbQotY29tcG9zaXRlUm9sZV90ZXh0PUNvbXBvc2l0ZSBSb2xlCi1jb25jZXB0X3RleHQ9Q29uY2VwdAotY29udGVudFBhY2thZ2VfdGV4dD1Db250ZW50IFBhY2thZ2UKLWN1c3RvbUNhdGVnb3J5X3RleHQ9Q3VzdG9tIENhdGVnb3J5Ci1kZWxpdmVyYWJsZV90ZXh0PURlbGl2ZXJhYmxlCi1kZWxpdmVyeVByb2Nlc3NfdGV4dD1EZWxpdmVyeSBQcm9jZXNzCi1kZXNjcmlwdG9yX3RleHQ9RGVzY3JpcHRvcgotZGlzY2lwbGluZV90ZXh0PURpc2NpcGxpbmUKLWRpc2NpcGxpbmVHcm91cGluZ190ZXh0PURpc2NpcGxpbmUgR3JvdXBpbmcKLWRvbWFpbl90ZXh0PURvbWFpbgotZXN0aW1hdGVfdGV4dD1Fc3RpbWF0ZQotZXN0aW1hdGluZ01ldHJpY190ZXh0PUVzdGltYXRpbmcgTWV0cmljCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dD1Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zCi1leGFtcGxlX3RleHQ9RXhhbXBsZQotZ3VpZGFuY2VfdGV4dD1HdWlkYW5jZQotZ3VpZGVsaW5lX3RleHQ9R3VpZGVsaW5lCi1pdGVyYXRpb25fdGV4dD1JdGVyYXRpb24KLW1ldGhvZENvbmZpZ3VyYXRpb25fdGV4dD1NZXRob2QgQ29uZmlndXJhdGlvbgotbWV0aG9kQ29udGVudF90ZXh0PU1ldGhvZCBDb250ZW50Ci1tZXRob2RMaWJyYXJ5X3RleHQ9TWV0aG9kIExpYnJhcnkKLW1ldGhvZFBhY2thZ2VfdGV4dD1NZXRob2QgUGFja2FnZQotbWV0aG9kUGx1Z2luX3RleHQ9TWV0aG9kIFBsdWctaW4KLW1pbGVzdG9uZV90ZXh0PU1pbGVzdG9uZQotb3V0Y29tZV90ZXh0PU91dGNvbWUKLXBoYXNlX3RleHQ9UGhhc2UKLXByYWN0aWNlX3RleHQ9UHJhY3RpY2UKLXByb2Nlc3NfdGV4dD1Qcm9jZXNzCi1wcm9jZXNzQ29udHJpYnV0aW9uX3RleHQ9RGlmZmVyZW50aWFsIFByb2Nlc3MKLXByb2Nlc3NGYW1pbHlfdGV4dD1Qcm9jZXNzIEZhbWlseQotcHJvY2Vzc1BhY2thZ2VfdGV4dD1Qcm9jZXNzIFBhY2thZ2UKLXJlcG9ydF90ZXh0PVJlcG9ydAotcmV1c2FibGVBc3NldF90ZXh0PVJldXNhYmxlIEFzc2V0Ci1yb2FkbWFwX3RleHQ9Um9hZG1hcAotcm9sZURlc2NyaXB0b3JfdGV4dD1Sb2xlIERlc2NyaXB0b3IKLXJvbGVfdGV4dD1Sb2xlCi1yb2xlU2V0X3RleHQ9Um9sZSBTZXQKLXJvbGVTZXRHcm91cGluZ190ZXh0PVJvbGUgU2V0IEdyb3VwaW5nCi1zdGFuZGFyZENhdGVnb3J5X3RleHQ9U3RhbmRhcmQgQ2F0ZWdvcnkKLXN0ZXBfdGV4dD1TdGVwCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dD1TdXBwb3J0aW5nIE1hdGVyaWFsCi10YXNrX3RleHQ9VGFzawotdGFza0Rlc2NyaXB0b3JfdGV4dD1UYXNrIERlc2NyaXB0b3IKLXRlYW1Qcm9maWxlX3RleHQ9VGVhbSBQcm9maWxlCi10ZW1wbGF0ZV90ZXh0PVRlbXBsYXRlCi10ZXJtRGVmaW5pdGlvbl90ZXh0PVRlcm0gRGVmaW5pdGlvbgotdG9vbF90ZXh0PVRvb2wKLXRvb2xNZW50b3JfdGV4dD1Ub29sIE1lbnRvcgotd2hpdGVwYXBlcl90ZXh0PVdoaXRlcGFwZXIKLXdvcmtQcm9kdWN0X3RleHQ9V29yayBQcm9kdWN0Ci13b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dD1Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcgotd29ya1Byb2R1Y3RFbGVtZW50X3RleHQ9V29yayBQcm9kdWN0IEVsZW1lbnQKLXdvcmtQcm9kdWN0VHlwZV90ZXh0PVdvcmsgUHJvZHVjdCBLaW5kCi0KLSMgTWV0aG9kIEVsZW1lbnQgTmFtZXMgKFBsdXJhbCkKLWFjdGl2aXR5X3RleHRfcGx1cmFsPUFjdGl2aXRpZXMKLWFydGlmYWN0X3RleHRfcGx1cmFsPUFydGlmYWN0cwotY2FwYWJpbGl0eVBhdHRlcm5fdGV4dF9wbHVyYWw9Q2FwYWJpbGl0eSBQYXR0ZXJucwotY2hlY2tsaXN0X3RleHRfcGx1cmFsPUNoZWNrbGlzdHMKLWNoZWNrSXRlbV90ZXh0X3BsdXJhbD1DaGVjayBJdGVtcwotY29tcG9zaXRlUm9sZV90ZXh0X3BsdXJhbD1Db21wb3NpdGUgUm9sZXMKLWNvbmNlcHRfdGV4dF9wbHVyYWw9Q29uY2VwdHMKLWNvbnRlbnRQYWNrYWdlX3RleHRfcGx1cmFsPUNvbnRlbnQgUGFja2FnZXMKLWN1c3RvbUNhdGVnb3J5X3RleHRfcGx1cmFsPUN1c3RvbSBDYXRlZ29yaWVzCi1kZWxpdmVyYWJsZV90ZXh0X3BsdXJhbD1EZWxpdmVyYWJsZXMKLWRlbGl2ZXJ5UHJvY2Vzc190ZXh0X3BsdXJhbD1EZWxpdmVyeSBQcm9jZXNzZXMKLWRlc2NyaXB0b3JfdGV4dF9wbHVyYWw9RGVzY3JpcHRvcnMKLWRpc2NpcGxpbmVfdGV4dF9wbHVyYWw9RGlzY2lwbGluZXMKLWRpc2NpcGxpbmVHcm91cGluZ190ZXh0X3BsdXJhbD1EaXNjaXBsaW5lIEdyb3VwaW5ncwotZG9tYWluX3RleHRfcGx1cmFsPURvbWFpbnMKLWVzdGltYXRlX3RleHRfcGx1cmFsPUVzdGltYXRlcwotZXN0aW1hdGluZ01ldHJpY190ZXh0X3BsdXJhbD1Fc3RpbWF0aW5nIE1ldHJpY3MKLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0X3BsdXJhbD1Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zCi1leGFtcGxlX3RleHRfcGx1cmFsPUV4YW1wbGVzCi1ndWlkYW5jZV90ZXh0X3BsdXJhbD1HdWlkYW5jZXMKLWd1aWRlbGluZV90ZXh0X3BsdXJhbD1HdWlkZWxpbmVzCi1pdGVyYXRpb25fdGV4dF9wbHVyYWw9SXRlcmF0aW9ucwotbWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0X3BsdXJhbD1NZXRob2QgQ29uZmlndXJhdGlvbnMKLW1ldGhvZENvbnRlbnRfdGV4dF9wbHVyYWw9TWV0aG9kIENvbnRlbnRzCi1tZXRob2RMaWJyYXJ5X3RleHRfcGx1cmFsPU1ldGhvZCBMaWJyYXJpZXMKLW1ldGhvZFBhY2thZ2VfdGV4dF9wbHVyYWw9TWV0aG9kIFBhY2thZ2VzCi1tZXRob2RQbHVnaW5fdGV4dF9wbHVyYWw9TWV0aG9kIFBsdWctaW5zCi1taWxlc3RvbmVfdGV4dF9wbHVyYWw9TWlsZXN0b25lcwotb3V0Y29tZV90ZXh0X3BsdXJhbD1PdXRjb21lcwotcGhhc2VfdGV4dF9wbHVyYWw9UGhhc2VzCi1wcmFjdGljZV90ZXh0X3BsdXJhbD1QcmFjdGljZXMKLXByb2Nlc3NfdGV4dF9wbHVyYWw9UHJvY2Vzc2VzCi1wcm9jZXNzQ29udHJpYnV0aW9uX3RleHRfcGx1cmFsPURpZmZlcmVudGlhbCBQcm9jZXNzZXMKLXByb2Nlc3NGYW1pbHlfdGV4dF9wbHVyYWw9UHJvY2VzcyBGYW1pbGllcwotcHJvY2Vzc1BhY2thZ2VfdGV4dF9wbHVyYWw9UHJvY2VzcyBQYWNrYWdlcwotcmVwb3J0X3RleHRfcGx1cmFsPVJlcG9ydHMKLXJldXNhYmxlQXNzZXRfdGV4dF9wbHVyYWw9UmV1c2FibGUgQXNzZXRzCi1yb2FkbWFwX3RleHRfcGx1cmFsPVJvYWRtYXBzCi1yb2xlRGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1Sb2xlIERlc2NyaXB0b3JzCi1yb2xlX3RleHRfcGx1cmFsPVJvbGVzCi1yb2xlU2V0X3RleHRfcGx1cmFsPVJvbGUgU2V0cwotcm9sZVNldEdyb3VwaW5nX3RleHRfcGx1cmFsPVJvbGUgU2V0IEdyb3VwaW5ncwotc3RhbmRhcmRDYXRlZ29yeV90ZXh0X3BsdXJhbD1TdGFuZGFyZCBDYXRlZ29yaWVzCi1zdGVwX3RleHRfcGx1cmFsPVN0ZXBzCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dF9wbHVyYWw9U3VwcG9ydGluZyBNYXRlcmlhbHMKLXRhc2tfdGV4dF9wbHVyYWw9VGFza3MKLXRhc2tEZXNjcmlwdG9yX3RleHRfcGx1cmFsPVRhc2sgRGVzY3JpcHRvcnMKLXRlYW1Qcm9maWxlX3RleHRfcGx1cmFsPVRlYW0gUHJvZmlsZXMKLXRlbXBsYXRlX3RleHRfcGx1cmFsPVRlbXBsYXRlcwotdGVybURlZmluaXRpb25fdGV4dF9wbHVyYWw9VGVybSBEZWZpbml0aW9ucwotdG9vbF90ZXh0X3BsdXJhbD1Ub29scwotdG9vbE1lbnRvcl90ZXh0X3BsdXJhbD1Ub29sIE1lbnRvcnMKLXdoaXRlcGFwZXJfdGV4dF9wbHVyYWw9V2hpdGVwYXBlcnMKLXdvcmtQcm9kdWN0X3RleHRfcGx1cmFsPVdvcmsgUHJvZHVjdHMKLXdvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMKLXdvcmtQcm9kdWN0RWxlbWVudF90ZXh0X3BsdXJhbD1Xb3JrIFByb2R1Y3QgRWxlbWVudHMKLXdvcmtQcm9kdWN0VHlwZV90ZXh0X3BsdXJhbD1Xb3JrIFByb2R1Y3QgS2luZHMKLQotIyBBcHBsaWNhdGlvbiB0aXRsZS4KLWFwcGxpY2F0aW9uX3RpdGxlPXswfSAtIHsxfQotCi0jIE9wZW4gTWV0aG9kIExpYnJhcnkgV2l6YXJkCi1vcGVuTGlicmFyeVdpemFyZF90aXRsZT1PcGVuIE1ldGhvZCBMaWJyYXJ5Ci1vcGVuTGlicmFyeU1haW5XaXphcmRQYWdlX3RpdGxlPVNwZWNpZnkgYSBwYXRoIGNvbnRhaW5pbmcgYSBtZXRob2QgbGlicmFyeQotb3BlbkxpYnJhcnlNYWluV2l6YXJkUGFnZV90aXRsZV8yPVNlbGVjdCBhIG1ldGhvZCBsaWJyYXJ5Ci1vcGVuTGlicmFyeU1haW5XaXphcmRQYWdlX3RleHQ9ezB9IHN0b3JlcyBtZXRob2RzIGFuZCBwcm9jZXNzZXMgaW4gYSBmb2xkZXIgY2FsbGVkIFxuYSBtZXRob2QgbGlicmFyeS4gU2VsZWN0IGEgbWV0aG9kIGxpYnJhcnkgZm9sZGVyIHRvIHVzZSBmb3IgdGhpcyBzZXNzaW9uLgotcGF0aExhYmVsX3RleHQ9UGF0aDoKLW5hbWVMYWJlbF90ZXh0PU5hbWU6Ci11cmlMYWJlbF90ZXh0PVVSSToKLW9wZW5Vbmxpc3RlZExpYnJhcnlDaGVja2JveF90ZXh0PU9wZW4gYSBtZXRob2QgbGlicmFyeSB0aGF0IGlzIG5vdCBsaXN0ZWQgYWJvdmUKLWxpYnJhcnlUeXBlTGFiZWxfdGV4dD1UeXBlOgotbGlicmFyeUxhYmVsX3RleHQ9TGlicmFyeToKLWJyb3dzZUJ1dHRvbl90ZXh0PUJyb3dzZS4uLgotcHJvbXB0Rm9yTGlicmFyeUNoZWNrYm94X3RleHQ9VXNlIHRoaXMgYXMgdGhlIGRlZmF1bHQgYW5kIGRvIG5vdCBhc2sgYWdhaW4uCi1vcGVuTGlicmFyeURpYWxvZ19uZXdMaWJyYXJ5X3RleHQ9Tm8gbWV0aG9kIGxpYnJhcnkgZXhpc3RzIGF0ICcnezB9JycuXG5BIG5ldyBtZXRob2QgbGlicmFyeSB3aWxsIGJlIGNyZWF0ZWQgYW5kIG9wZW5lZCBmb3IgeW91IGF0IHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LlxuXG5DbGljayBPSyB0byBwcm9jZWVkIG9yIENhbmNlbCB0byBzcGVjaWZ5IGFub3RoZXIgbWV0aG9kIGxpYnJhcnkgcGF0aC4KLQotIyBTZWxlY3QgTWV0aG9kIExpYnJhcnkgRm9sZGVyIERpYWxvZwotc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190aXRsZT1TZWxlY3QgTWV0aG9kIExpYnJhcnkKLXNlbGVjdExpYnJhcnlGb2xkZXJEaWFsb2dfdGV4dD1TZWxlY3QgYSBtZXRob2QgbGlicmFyeSBmb2xkZXIuCi0KLSMgT3BlbiBMaWJyYXJ5IFByb2dyZXNzIE1lc3NhZ2UKLW9wZW5pbmdMaWJyYXJ5VGFza19uYW1lPU9wZW5pbmcgbWV0aG9kIGxpYnJhcnkuLi4KLQotIyBPcGVuIE1ldGhvZCBMaWJyYXJ5IEVycm9yIERpYWxvZwotb3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTRFOiBVbmFibGUgdG8gY3JlYXRlIHRoZSBtZXRob2QgbGlicmFyeS4KLW9wZW5MaWJyYXJ5SW50ZXJubEVycm9yX3JlYXNvbj1BbiBpbnRlcm5hbCBlcnJvciBoYXMgb2NjdXJyZWQuCi1vcGVuTGlicmFyeUVycm9yX3JlYXNvbjE9VGhlIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeSBwYXRoICcnezB9JycgaXMgaW52YWxpZC4KLW9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uMj1BIG1ldGhvZCBsaWJyYXJ5IGFscmVhZHkgZXhpc3RzIGluICcnezB9JycuCi1vcGVuTGlicmFyeUVycm9yX3JlYXNvbjM9VGhlIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeSBmb2xkZXIgJyd7MH0nJyBjYW5ub3QgYmUgY3JlYXRlZC4KLW9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uND1UaGUgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5IGZvbGRlciBpcyBhIHBsdWdpbiBvciBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb24gZXhwb3J0IGZvbGRlci4KLW9wZW5MaWJyYXJ5RXJyb3JfYWR2aWNlPVNlbGVjdCBPSyB0byBzcGVjaWZ5IGFub3RoZXIgbWV0aG9kIGxpYnJhcnkgbmFtZSBvciBsb2NhdGlvbi4KLQotIyBPcGVuIE1ldGhvZCBMaWJyYXJ5IEVycm9yIE1lc3NhZ2VzCi1pbnZhbGlkTGlicmFyeVBhdGhfbXNnPUlVUEwwMzAwRTogVW5hYmxlIHRvIG9wZW4gdGhlIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeS4KLWludmFsaWRMaWJyYXJ5UGF0aF9yZWFzb249VGhlIHNlbGVjdGVkIG1ldGhvZCBsaWJyYXJ5IGZvbGRlciBpcyBpbnZhbGlkLCBkb2VzIG5vdCBleGlzdCwgb3IgeW91IGRvIG5vdCBoYXZlIHRoZSBwcm9wZXIgcGVybWlzc2lvbiB0byBhY2Nlc3MgaXQuXG5cbkNsaWNrIE9LIHRvIHNlbGVjdCBhbm90aGVyIGxpYnJhcnkgZm9sZGVyLgotCi0jIExpYnJhcnkgTG9ja2VkIEVycm9yIERpYWxvZwotbGlicmFyeUxvY2tlZF9tc2c9SVVQTDAzMDNFOiBVbmFibGUgdG8gb3BlbiB0aGUgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5LlxuXG5UaGUgc2VsZWN0ZWQgbWV0aG9kIGxpYnJhcnkgYXBwZWFycyB0byBiZSBpbiB1c2UuIENsaWNrIENhbmNlbCB0byBzZWxlY3QgYW5vdGhlciBsaWJyYXJ5IGZvbGRlciwgb3IgY2xpY2sgRm9yY2UgT3BlbiBpZiB5b3Ugd2FudCB0byBvcGVuIHRoZSBsaWJyYXJ5IGFueXdheS5cblxuV0FSTklORzogQ29uY3VycmVudCB1c2Ugb2YgYSBtZXRob2QgbGlicmFyeSBtYXkgY2F1c2UgdGhhdCBsaWJyYXJ5IHRvIGJlY29tZSBjb3JydXB0ZWQuCi1saWJyYXJ5TG9ja2VkX29wZW5CdXR0b25fdGV4dD1Gb3JjZSBPcGVuCi0KLSMgUmVhZC1vbmx5IFByb2plY3QgRmlsZSBFcnJvciBEaWFsb2cKLXJlYWRPbmx5UHJvamVjdEZpbGVfdGV4dD1JVVBMMDMwMkU6ICcnezB9JycgaXMgcmVhZC1vbmx5LiBNYWtlIGl0IHdyaXRhYmxlIGJlZm9yZSBjb250aW51aW5nLgotcmV0cnlCdXR0b25fdGV4dD1SZXRyeQotY2FuY2VsQnV0dG9uX3RleHQ9Q2FuY2VsCi0KLSMgVmVyc2lvbiBNaXNtYXRjaCBEaWFsb2cKLXZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0PUlVUEwzMDVFOiBUaGUgc2VsZWN0ZWQgbGlicmFyeSBjYW5ub3QgYmUgb3BlbmVkLiBZb3UgbXVzdCB1cGdyYWRlIHswfSB0byB2ZXJzaW9uIHsxfSBvciBoaWdoZXIgaW4gb3JkZXIgdG8gb3BlbiB0aGlzIGxpYnJhcnkuCi12ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dF91bmtub3duPUlVUEwzMDZFOiBUaGUgc2VsZWN0ZWQgbGlicmFyeSBjYW5ub3QgYmUgb3BlbmVkLiBZb3UgbXVzdCB1cGdyYWRlIHswfSB0byBhIGhpZ2hlciB2ZXJzaW9uIGluIG9yZGVyIHRvIG9wZW4gdGhpcyBsaWJyYXJ5LgotCi0jIFVwZ3JhZGUgTWV0aG9kIExpYnJhcnkgRGlhbG9nCi11cGdyYWRlTGlicmFyeURpYWxvZ190aXRsZT1VcGdyYWRlIE1ldGhvZCBMaWJyYXJ5Ci11cGdyYWRlTGlicmFyeURpYWxvZ190ZXh0PVRoZSBsaWJyYXJ5IHlvdSBoYXZlIHNlbGVjdGVkIG5lZWRzIHRvIGJlIHVwZ3JhZGVkIHRvIHRoZSBuZXcgbGlicmFyeSBzdHJ1Y3R1cmUuXG5cbkRvIHlvdSB3YW50IHRvIHByb2NlZWQgd2l0aCB0aGUgdXBncmFkZT8KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9VXBncmFkaW5nIG1ldGhvZCBsaWJyYXJ5Li4uCi0KLSMgVXBncmFkZSBMaWJyYXJ5IEVycm9yIERpYWxvZwotdXBncmFkZUxpYnJhcnlFcnJvcl9tc2c9SVVQTDAzMDFFOiBGYWlsZWQgdG8gdXBncmFkZSB0aGUgbWV0aG9kIGxpYnJhcnkuIFBsZWFzZSBzZWUgdGhlIGxvZyBmaWxlIGZvciBtb3JlIGRldGFpbHMuCi0KLSMgU3dpdGNoIENvbmZpZ3VyYXRpb24gRGlhbG9nCi1zd2l0Y2hDb25maWdEaWFsb2dfdGl0bGU9U3dpdGNoIENvbmZpZ3VyYXRpb24KLXN3aXRjaENvbmZpZ0RpYWxvZ190ZXh0PURvIHlvdSB3YW50IHRvIHN3aXRjaCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sICcnezB9JycsIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VsZWN0ZWQgcHJvY2Vzcz8KLQkKLSMgQ29uZmlndXJhdGlvbiBDb21ibwotY3VycmVudENvbmZpZ0xhYmVsX3RleHQ9Q3VycmVudCBjb25maWd1cmF0aW9uOgotc2VsZWN0Q29uZmlnTGFiZWxfdGV4dD1TZWxlY3QgYSBjb25maWd1cmF0aW9uCi0KLSMgRGVsZXRlIEZpbGVzIENvbmZpcm1hdGlvbiBNZXNzYWdlCi1kZWxldGVGaWxlc0NvbmZpcm1hdGlvbl9tc2c9VGhlIHNwZWNpZmllZCBwYXRoICcnezB9JycgYWxyZWFkeSBleGlzdHMuIEFsbCBmaWxlcyBpbiB0aGUgZm9sZGVyIHdpbGwgYmUgZGVsZXRlZC4gRG8geW91IHdhbnQgdG8gcHJvY2VlZD8KLQotIyBQYXRocy9GaWxlcyBFcnJvciBNZXNzYWdlcwotZGVsZXRlRmlsZXNFcnJvcl9yZWFzb249VGhlIHBhdGggJyd7MH0nJyBjb250YWlucyBvbmUgb3IgbW9yZSBmaWxlcyB0aGF0IGNhbm5vdCBiZSBkZWxldGVkLlxuXG5TZWxlY3QgYW5vdGhlciBwYXRoIGFuZCB0cnkgYWdhaW4uCi1jcmVhdGVQYXRoRXJyb3JfcmVhc29uPVVuYWJsZSB0byBjcmVhdGUgcGF0aCAnJ3swfScnLlxuXG5TZWxlY3QgYW5vdGhlciBwYXRoIGFuZCB0cnkgYWdhaW4uCi1pbnZhbGlkUGF0aF9tc2c9VGhlIHNwZWNpZmllZCBwYXRoIGlzIG5vdCB2YWxpZC4KLQotIyBCYWNrdXAgTGlicmFyeSBEaWFsb2cKLWJhY2t1cExpYnJhcnlEaWFsb2dfdGl0bGU9QmFja3VwIExpYnJhcnkKLWJhY2t1cExpYnJhcnlEaWFsb2dfdGV4dD1JdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBiYWNrIHVwIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IGJlZm9yZSBwcm9jZWVkaW5nLlxuXG5DbGljayBPSyB0byBjcmVhdGUgYSBiYWNrdXAgY29weSBvZiB0aGUgbGlicmFyeSBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4gQ2xpY2sgU2tpcCB0byBjb250aW51ZSB3aXRob3V0IGNyZWF0aW5nIHRoZSBiYWNrdXAuCi1iYWNraW5nVXBMaWJyYXJ5VGFza19uYW1lPU1ha2luZyBhIGJhY2t1cCBjb3B5IG9mIGxpYnJhcnkgZmlsZXMgLi4uCi0KLSMgUGF0aCBTZWxlY3Rpb24gRGlhbG9nCi1wYXRoU2VsZWN0aW9uRXJyb3JfbXNnPVVuYWJsZSB0byBjcmVhdGUgZGlyCi1va0J1dHRvbl90ZXh0PU9LCi1za2lwQnV0dG9uX3RleHQ9U2tpcAotCi0jIFByb2Nlc3MgRWRpdG9yIHByZWZlcmVuY2VzCi1hbHdheXNCdXR0b25fdGV4dD1BbHdheXMKLW5ldmVyQnV0dG9uX3RleHQ9TmV2ZXIKLXByb21wdEJ1dHRvbl90ZXh0PVByb21wdAotCi0jIEFkZCBMaW5rIERpYWxvZwotbGlua1RvVVJMX25hbWU9VVJMCi1saW5rVG9GaWxlX25hbWU9RmlsZQotZWxlbWVudExpbmtfbmFtZT1NZXRob2QgZWxlbWVudAotZWxlbWVudExpbmtXaXRoVHlwZV9uYW1lPU1ldGhvZCBlbGVtZW50IHdpdGggdHlwZSBwcmVmaXgKLWVsZW1lbnRMaW5rV2l0aFVzZXJUZXh0X25hbWU9TWV0aG9kIGVsZW1lbnQgd2l0aCBjdXN0b20gdGV4dAotCi0jIENvbnZlcnQgQWN0aXZpdHkgVHlwZSBEaWFsb2cKLWNvbnZlcnRBY3Rpdml0eURpYWxvZ190aXRsZT1Db252ZXJ0IEFjdGl2aXR5IFR5cGUKLWNvbnZlcnRBY3Rpdml0eURpYWxvZ190ZXh0PVNlbGVjdCB0aGUgdGFyZ2V0IGFjdGl2aXR5IHR5cGUuCi11bnN1cHBvcnRlZEFjdGl2aXR5VHlwZV9tc2c9SVVQTDAzMDRFOiBUaGlzIGFjdGl2aXR5IGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYW5vdGhlciB0eXBlLgotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfcmVhc29uPVRoZXJlIGlzIG5vIGNvbXBhdGlibGUgYWN0aXZpdHkgdHlwZSBmb3IgezB9LgotCi0jIFNlbGVjdCBQcm9jZXNzIFdpemFyZCBQYWdlCi1zZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90aXRsZT1TZWxlY3QgcHJvY2Vzcwotc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGV4dD1TZWxlY3QgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcyB0byBleHBvcnQuCi1wcm9jZXNzZXNMYWJlbF90ZXh0PVByb2Nlc3NlczoKLWJyaWVmRGVzY3JpcHRpb25MYWJlbF90ZXh0PUJyaWVmIGRlc2NyaXB0aW9uOgotCi0jIEV4cG9ydCBQcm9jZXNzIFdpemFyZCBFcnJvciBNZXNzYWdlLgotbm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnPU5vIG1ldGhvZCBsaWJyYXJ5IGlzIGN1cnJlbnRseSBvcGVuZWQuIENsaWNrIENhbmNlbCwgb3BlbiBhIG1ldGhvZCBsaWJyYXJ5IG9yIGNyZWF0ZSBhIG5ldyBvbmUsIGFuZCBydW4gdGhpcyB3aXphcmQgYWdhaW4uIAotCi0jTW92ZWQgZnJvbSBhdXRob3JpbmcgdWkgdG8gYXZvaWQgYXV0aG9yaW5ndWkgZGVwZW5kZW5jeQotZXJyb3JEaWFsb2dfdGl0bGU9RXJyb3IKLU1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb25fZGVsZXRlY29uZmlybV90ZXh0PUFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgJyd7MH0nJz8KLWNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU9Q29uZmlybSBEZWxldGlvbgotY29uZmlybURlbGV0ZURpYWxvZ19tc2c9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAnJ3swfScnPwotY29uZmlybURlbGV0ZURpYWxvZ19tc2dXaXRoUmVmZXJlbmNlPUFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgJyd7MH0nJz9cblxuVGhlIGZvbGxvd2luZyBlbGVtZW50KHMpIGNvbnRhaW4gcmVmZXJlbmNlcyB0byB0aGUgaXRlbShzKSB0byBiZSBkZWxldGVkOiB7MX0KLVByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQ9VGhpcyB3aWxsIHNhdmUgdGhlIGN1cnJlbnQgZWRpdG9yIGFuZCB0aGUgY2hhbmdlIHdpbGwgYmUgcGVybWFuZW50LiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICcnezB9Jyc/CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0NvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0NvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQzZTRjYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9Db25maWd1cmF0aW9uQ29udHJpYnV0aW9uSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcy5MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5OYW1lQ2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci0KLS8qKgotICogQWRkcyB0aGUgQ29uZmlndXJhdGlvbiBjb21ib3hib3ggdG8gdGhlIHN5c3RlbSB0b29sYmFyLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtIGV4dGVuZHMgQ29udHJpYnV0aW9uSXRlbSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb21ibyBjb25maWdDb21ibzsKLQlwcml2YXRlIHN0YXRpYyBDb21ib1ZpZXdlciBjb25maWdDb21ib1ZpZXdlcjsKLQlwcm90ZWN0ZWQgVG9vbEl0ZW0gaXRlbTsKLQlwcm90ZWN0ZWQgQ29vbEl0ZW0gY29vbEl0ZW07Ci0JcHJpdmF0ZSBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lciBsaWJTdmNMaXN0ZW5lcjsKLQotCQotCS8vIHRoZSAiU2VsZWN0IGEgY29uZmlndXJhdGlvbiIgc3RyaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9DT05GSUdVUkFUSU9OID0gTGlicmFyeVVJUmVzb3VyY2VzLnNlbGVjdENvbmZpZ0xhYmVsX3RleHQ7Ci0KLQkvLyBjb250ZW50IHByb3ZpZGVyCi0JcHJvdGVjdGVkIHN0YXRpYyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXJDb25maWdzID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJTGlzdCBjb25maWdzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkgPT0gbnVsbCkgewotCQkJCWNvbmZpZ3NMaXN0LmFkZChTRUxFQ1RfQ09ORklHVVJBVElPTik7Ci0JCQl9Ci0JCQljb25maWdzTGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChMaWJyYXJ5U2VydmljZVV0aWwuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbnMoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKSkpOwotCQkJcmV0dXJuIGNvbmZpZ3NMaXN0LnRvQXJyYXkoKTsKLQkJfQotCX07Ci0JCi0JLy8gbGFiZWwgcHJvdmlkZXIKLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlckNvbmZpZ3MgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJcmV0dXJuIChTdHJpbmcpIG9iamVjdDsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQlyZXR1cm4gKChNZXRob2RDb25maWd1cmF0aW9uKW9iamVjdCkuZ2V0TmFtZSgpOwotCQkJfQotCQkJZWxzZSByZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oSUFjdGlvbiBhY3Rpb24pIHsKLQl9Ci0KLQkvKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtI2ZpbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhciwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGwoVG9vbEJhciBwYXJlbnQsIGludCBpbmRleCkgewotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHBhcmVudCwgU1dULlNFUEFSQVRPUik7Ci0JCUNvbnRyb2wgYm94ID0gY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQlpdGVtLnNldENvbnRyb2woYm94KTsKLQkJaXRlbS5zZXRXaWR0aCgyNDApOwotCX0KLQotCS8qIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sQmFyLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbChDb29sQmFyIGNvb2xCYXIsIGludCBpbmRleCkgewotCQlDb250cm9sIGJveCA9IGNyZWF0ZUNvbnRyb2woY29vbEJhcik7Ci0KLQkJaW50IGZsYWdzID0gU1dULkRST1BfRE9XTjsKLQkJaWYgKGluZGV4ID49IDApIHsKLQkJCWNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIGZsYWdzLCBpbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQljb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCBmbGFncyk7Ci0JCX0KLQkJLy8gU2V0IHRoZSBiYWNrIHJlZmVyZW5jZS4KLQkJY29vbEl0ZW0uc2V0RGF0YSh0aGlzKTsKLQotCQkvLyBBZGQgdGhlIHRvb2xiYXIgdG8gdGhlIENvb2xJdGVtIHdpZGdldC4KLQkJY29vbEl0ZW0uc2V0Q29udHJvbChib3gpOwotCi0JCS8vIElmIHRoZSB0b29sYmFyIGl0ZW0gZXhpc3RzIHRoZW4gYWRqdXN0IHRoZSBzaXplIG9mIHRoZSBjb29sIGl0ZW0uCi0JCVBvaW50IHRvb2xCYXJTaXplID0gYm94LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJLy8gU2V0IHRoZSBwcmVmZmVyZWQgc2l6ZSB0byB0aGUgc2l6ZSBvZiB0aGUgdG9vbGJhciBwbHVzIHRyaW0uCi0JCWNvb2xJdGVtLnNldE1pbmltdW1TaXplKHRvb2xCYXJTaXplKTsKLQkJY29vbEl0ZW0uc2V0UHJlZmVycmVkU2l6ZSh0b29sQmFyU2l6ZSk7Ci0JCWNvb2xJdGVtLnNldFNpemUodG9vbEJhclNpemUpOwotCX0KLQotCS8qIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNvbmZpZ0NvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCQljb25maWdDb21iby5zZXRWaXNpYmxlSXRlbUNvdW50KDEwKTsKLQkJY29uZmlnQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLQkJY29uZmlnQ29tYm9WaWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIoY29uZmlnQ29tYm8pOwotCQljb25maWdDb21ib1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyQ29uZmlncyk7Ci0JCWNvbmZpZ0NvbWJvVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlckNvbmZpZ3MpOwotCQljb25maWdDb21ib1ZpZXdlci5zZXRJbnB1dChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQljb25maWdDb21ib1ZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpKTsKLQotCi0JCWNvbmZpZ0NvbWJvVmlld2VyLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXBlcmZvcm1TZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJU3RyaW5nIHNhdmVkQ29uZmlnTmFtZSA9IGdldFNhdmVkTGFzdENvbmZpZygpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIHNhdmVkQ29uZmlnID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oCi0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBzYXZlZENvbmZpZ05hbWUpOwotCQlpZiAoc2F2ZWRDb25maWcgIT0gbnVsbCkgewotCQkJY29uZmlnQ29tYm9WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNhdmVkQ29uZmlnKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljb25maWdDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oU0VMRUNUX0NPTkZJR1VSQVRJT04pKTsKLQkJfQotCQkKLQkJbGliU3ZjTGlzdGVuZXIgPSBuZXcgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCQlzZWxlY3RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJY29uZmlnQ29tYm9WaWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCWNvbmZpZ0NvbWJvVmlld2VyLnNldElucHV0KGxpYnJhcnkpOwotCQkJCXNlbGVjdENvbmZpZ3VyYXRpb24obnVsbCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJY29uZmlnQ29tYm9WaWV3ZXIuc2V0SW5wdXQobGlicmFyeSk7Ci0JCQkJcmVmcmVzaCgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJaWYgKGxpYnJhcnkgIT0gY29uZmlnQ29tYm9WaWV3ZXIuZ2V0SW5wdXQoKSkgewotCQkJCQljb25maWdDb21ib1ZpZXdlci5zZXRJbnB1dChsaWJyYXJ5KTsKLQkJCQkJcmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeVNldChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQlpZiAobGlicmFyeSAhPSBjb25maWdDb21ib1ZpZXdlci5nZXRJbnB1dCgpKSB7Ci0JCQkJCWNvbmZpZ0NvbWJvVmlld2VyLnNldElucHV0KGxpYnJhcnkpOwotCQkJCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQkJCQlzZWxlY3RDb25maWd1cmF0aW9uKG51bGwpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCX07Ci0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCQkKLQkJcmV0dXJuIGNvbmZpZ0NvbWJvOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY3VycmVudGx5IHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRDdXJyZW50U2VsZWN0ZWRDb25maWcoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29uZmlnQ29tYm9WaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBvYmplY3QgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlyZXR1cm4gKE1ldGhvZENvbmZpZ3VyYXRpb24pb2JqZWN0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gY3VycmVudGx5IHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q3VycmVudFNlbGVjdGVkQ29uZmlnTmFtZSgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb25maWdDb21ib1ZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IG9iamVjdCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKG9iamVjdCAhPSBudWxsICYmIG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCXJldHVybiAoKE1ldGhvZENvbmZpZ3VyYXRpb24pb2JqZWN0KS5nZXROYW1lKCk7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykKLQkJCXJldHVybiAoU3RyaW5nKW9iamVjdDsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwZXJmb3JtU2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRDdXJyZW50U2VsZWN0ZWRDb25maWcoKTsKLQkJaWYgKGNvbmZpZyAhPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkpIHsgCi0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCX0KLQkJc2F2ZVNlbGVjdGVkQ29uZmlnSW50b1BlcnNpc3RlbmNlKCk7Ci0JCXJlZnJlc2goKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNhdmVTZWxlY3RlZENvbmZpZ0ludG9QZXJzaXN0ZW5jZSgpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlzdG9yZQotCQkJCS5zZXRWYWx1ZSgKLQkJCQkJCUxpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfU0VMRUNURURfQ09ORklHX0lOX0xBU1RfU0VTU0lPTiwKLQkJCQkJCWdldEN1cnJlbnRTZWxlY3RlZENvbmZpZ05hbWUoKSk7Ci0JCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTYXZlZExhc3RDb25maWcoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJcmV0dXJuIHN0b3JlCi0JCQkJLmdldFN0cmluZyhMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1NFTEVDVEVEX0NPTkZJR19JTl9MQVNUX1NFU1NJT04pOwotCX0KLQotCS8qIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYobGliU3ZjTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW1vdmVMaXN0ZW5lcihsaWJTdmNMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCWlmICggY29uZmlnQ29tYm8gIT0gbnVsbCAmJiAhY29uZmlnQ29tYm8uaXNEaXNwb3NlZCgpICkgewotCQkJY29uZmlnQ29tYm8uZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVmcmVzaCBjb25maWd1cmF0aW9uIGNvbWJvCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCWNvbmZpZ0NvbWJvVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0JCi0JLyoqCi0JICogU2VsZWN0IGNvbmZpZ3VyYXRpb24gaW4gY29uZmlndXJhdGlvbiBjb21ibyBib3gKLQkgKiBAcGFyYW0gY29uZmlnCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbGVjdENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTmFtZUNhY2hlLmdldEluc3RhbmNlKCkuY2xlYXIoKTsKLQkJaWYgKGNvbmZpZyAhPSBudWxsICYmIGNvbmZpZyA9PSBnZXRDdXJyZW50U2VsZWN0ZWRDb25maWcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJY29uZmlnQ29tYm9WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbmZpZykpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gY29uZmlnIGlzIG51bGwsIHNvIHNlbGVjdCB0aGUgIlNlbGVjdCBhIGNvbmZpZ3VyYXRpb24gaXRlbSIKLQkJCS8vIGZpcnN0IHJlZnJlc2ggbGlzdCBzbyB0aGF0IHRoZSAiU2VsZWN0IGEgY29uZmlnLi4iIHN0cmluZyBnZXRzIGFkZGVkIHRvIHRoZSBsaXN0Ci0JCQlyZWZyZXNoKCk7Ci0JCQljb25maWdDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oU0VMRUNUX0NPTkZJR1VSQVRJT04pLCB0cnVlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0lMaWJyYXJ5QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0lMaWJyYXJ5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzNDZhYzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9JTGlicmFyeUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIExpYnJhcnkgYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5QWN0aW9uIGV4dGVuZHMgSUFjdGlvbiB7Ci0Jc3RhdGljIGZpbmFsIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyIERFRkFVTFRfVUlfSEFORExFUiA9IG5ldyBVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0KLS8vCXZvaWQgbm90aWZ5UHJvcGVydHlDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLAotLy8JCQlPYmplY3QgbmV3VmFsdWUpOwotCQotCXZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzE1ZjhkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0xpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuTGlicmFyeVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci0KLS8qKgotICogUnVucyBvcGVyYXRpb24gdGhhdCBsb2NrcyB0aGUgbGlicmFyeSBmb3IgdGhlIGR1cmF0aW9uIG9mIGl0cyBleGVjdXRpb24KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBpbXBsZW1lbnRzIElSdW5uYWJsZUNvbnRleHQgewotCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcjsKLQkKLQlwdWJsaWMgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKSB7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgZG9SdW4oZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLCBmaW5hbCBib29sZWFuIHdvcmtVbmtub3duKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbltdIGl0ZUhvbGRlciA9IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uWzFdOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVdvcmtzcGFjZVJ1bm5hYmxlIHdvcmtzcGFjZVJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYod29ya1Vua25vd24pIHsKLSAgICAgICAgCQkJCQlwbS5iZWdpblRhc2soIiIsIDIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAkJCQkJcG0ud29ya2VkKDEpOwotICAgICAgICAJCQkJCXRyeSB7Ci0gICAgICAgIAkJCQkJCXJ1bm5hYmxlLnJ1bihwbSk7Ci0gICAgICAgIAkJCQkJCXBtLndvcmtlZCgyKTsKLSAgICAgICAgCQkJCQl9Ci0gICAgICAgIAkJCQkJZmluYWxseSB7Ci0gICAgICAgIAkJCQkJCXBtLmRvbmUoKTsKLSAgICAgICAgCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIAlydW5uYWJsZS5ydW4ocG0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhc3MgaXQgb3V0c2lkZSB0aGUgd29ya3NwYWNlIHJ1bm5hYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICBpdGVIb2xkZXJbMF0gPSBlOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZS10aHJvdyBhcyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiwgd2hpY2ggd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2F1Z2h0IGFuZCByZS10aHJvd24gYXMgSW50ZXJydXB0ZWRFeGNlcHRpb24gYmVsb3cuCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvcmVFeGNlcHRpb24gYW5kIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGFyZSBwcm9wYWdhdGVkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4od29ya3NwYWNlUnVubmFibGUsCi0gICAgICAgICAgICAJCW5ldyBMaWJyYXJ5U2NoZWR1bGluZ1J1bGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKSwKLSAgICAgICAgICAgIAkJSVdvcmtzcGFjZS5BVk9JRF9VUERBVEUsIGdldFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBSZS10aHJvdyB0aGUgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgaWYgYW55IG9jY3VycmVkCi0gICAgICAgIGlmIChpdGVIb2xkZXJbMF0gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgaXRlSG9sZGVyWzBdOwotICAgICAgICB9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQjcnVuKGJvb2xlYW4sIGJvb2xlYW4sIG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3MpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKGJvb2xlYW4gZm9yaywgYm9vbGVhbiBjYW5jZWxhYmxlLAotCQkJZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJZG9SdW4ocnVubmFibGUsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlKSB7Ci0JCXRyeSB7Ci0JCQlkb1J1bihydW5uYWJsZSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIGNhdXNlID0gZS5nZXRDYXVzZSgpOwotCQkJaWYoY2F1c2UgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0JCQkJdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pY2F1c2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZihjYXVzZSA9PSBudWxsKSB7Ci0JCQkJCWNhdXNlID0gZTsKLQkJCQl9Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihjYXVzZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIG1zZyA9IGNhdXNlLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gY2F1c2UuZ2V0TWVzc2FnZSgpIDogY2F1c2UudG9TdHJpbmcoKTsgCi0JCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKExpYnJhcnlVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgbXNnLCBjYXVzZSk7Ci0JCQkJfQotCQkJCWNhdGNoKEV4Y2VwdGlvbiBleCkgewotCQkJCQkKLQkJCQl9CQkJCQotCQkJfQotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJaWYocHJvZ3Jlc3NNb25pdG9yID09IG51bGwpIHsKLQkJCXByb2dyZXNzTW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIHByb2dyZXNzTW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIHRoZSBwcm9ncmVzc01vbml0b3IgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCXRoaXMucHJvZ3Jlc3NNb25pdG9yID0gcHJvZ3Jlc3NNb25pdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZmMzQwOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotCi0KLS8qKgotICogQWN0aW9uIHRvIGRlbGV0ZSBtZXRob2QgZWxlbWVudAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbiBleHRlbmRzIERlbGV0ZUFjdGlvbiBpbXBsZW1lbnRzIElMaWJyYXJ5QWN0aW9uIHsKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29uZmlybSA9IHRydWU7Ci0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yOwotCi0JLyoqCi0JICogRGVsZXRlcyBtZXRob2QgZWxlbWVudAotCSAqCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24oRWRpdGluZ0RvbWFpbiBkb21haW4pIHsKLQkJc3VwZXIoZG9tYWluKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBkb21haW4KLQkgKiBAcGFyYW0gY29uZmlybQotCSAqICAgICAgICAgICAgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciB1c2VyIGNvbmZpcm1hdGlvbiBpcyByZXF1aXJlZC4gSWYKLQkgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgZXhlY3V0aW5nIHRoaXMgY29tbWFuZCB3aWxsIG5vdAotCSAqICAgICAgICAgICAgaW50ZXJhY3Qgd2l0aCB1c2VyIGFuZCB0aGUgZGVmYXVsdCBiZWhhdmlvciB3aWxsIGFwcGx5LgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uKEVkaXRpbmdEb21haW4gZG9tYWluLCBib29sZWFuIGNvbmZpcm0pIHsKLQkJdGhpcyhkb21haW4pOwotCQl0aGlzLmNvbmZpcm0gPSBjb25maXJtOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkRlbGV0ZUFjdGlvbiNjcmVhdGVDb21tYW5kKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0KLQkJRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQgY21kID0gY3JlYXRlTWV0aG9kRWxlbWVudERlbGV0ZUNvbW1hbmQoKTsKLQkJY21kCi0JCQkJLmFkZENvbW1hbmRMaXN0ZW5lcihuZXcgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQuQ29tbWFuZExpc3RlbmVyKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUV4ZWN1dGVkKEV2ZW50T2JqZWN0IGV2ZW50T2JqZWN0KSB7Ci0JCQkJCQlEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCBjbWQgPSAoRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQpIGV2ZW50T2JqZWN0Ci0JCQkJCQkJCS5nZXRTb3VyY2UoKTsKLQkJCQkJCWRpZERlbGV0ZShjbWQuZ2V0UmVzdWx0KCkpOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgbm90aWZ5RmFpbHVyZShFdmVudE9iamVjdCBldmVudE9iamVjdCkgewotCQkJCQkJZGVsZXRlRmFpbGVkKCk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCQlyZXR1cm4gY21kOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUZhaWxlZCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBjb21tYW5kIHRvIGRlbGV0ZSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gY29tbWFuZAotCSAqLwotCXB1YmxpYyBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCBjcmVhdGVNZXRob2RFbGVtZW50RGVsZXRlQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZChzdXBlci5jcmVhdGVDb21tYW5kKHNlbGVjdGlvbiksCi0JCQkJc2VsZWN0aW9uLCBjb25maXJtKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBsb2FkT3Bwb3NpdGVGZWF0dXJlcyhMaXN0IG9wcG9zaXRlRmVhdHVyZXMsCi0JCQkJCVNldCBkZWxldGVkR1VJRHMpIHsKLQkJCQlJTGlicmFyeVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gKElMaWJyYXJ5UmVzb3VyY2VTZXQpIExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLmVSZXNvdXJjZSgpCi0JCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQlyZXNvdXJjZVNldAotCQkJCQkJLmxvYWRPcHBvc2l0ZUZlYXR1cmVzKG9wcG9zaXRlRmVhdHVyZXMsIGRlbGV0ZWRHVUlEcyk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlkRGVsZXRlKENvbGxlY3Rpb24gZGVsZXRlZEVsZW1lbnRzKSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgY29uZmlybWF0aW9uIG1lc3NhZ2UgdG8gZGVsZXRlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVsZXRlQ29uZmlybWF0aW9uTWVzc2FnZSgpIHsKLQkJcmV0dXJuIExpYnJhcnlVSVJlc291cmNlcy5NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbmZpcm1EZWxldGUoKSB7Ci0JCWlmICghY29uZmlybSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpbnQgaSA9IDA7Ci0JCVN0cmluZ0J1ZmZlciBlbGVtZW50U3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKGl0Lm5leHQoKSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCWlmIChpID4gMCkgewotCQkJCQllbGVtZW50U3RyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbGVtZW50U3RyLmFwcGVuZCgoKE1ldGhvZEVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpKTsKLQotCQkJCWkrKzsKLQkJCX0KLQkJfQotCi0JCU9iamVjdFtdIGFyZ3MgPSB7IGVsZW1lbnRTdHIudG9TdHJpbmcoKSB9OwotCQlTdHJpbmcgbXNnID0gTGlicmFyeVVJUmVzb3VyY2VzLmJpbmQoTGlicmFyeVVJUmVzb3VyY2VzLmNvbmZpcm1EZWxldGVEaWFsb2dfbXNnLCBhcmdzKTsgLy8gTk9OLU5MUy0xJAotCi0JCVN0cmluZyB0aXRsZSA9IExpYnJhcnlVSVJlc291cmNlcy5jb25maXJtRGVsZXRlRGlhbG9nX3RpdGxlOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gZGVsZXRlT2sgPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJLmRpc3BsYXlDb25maXJtYXRpb24odGl0bGUsIG1zZyk7Ci0JCXJldHVybiBkZWxldGVPazsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JTGlicmFyeUFjdGlvbiNzZXRQcm9ncmVzc01vbml0b3Iob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlwcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHByb2dyZXNzTW9uaXRvcgotCSAqLwotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJaWYocHJvZ3Jlc3NNb25pdG9yID09IG51bGwpIHsKLQkJCXByb2dyZXNzTW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIHByb2dyZXNzTW9uaXRvcjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQlydW5uZXIuc2V0UHJvZ3Jlc3NNb25pdG9yKGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJcnVubmVyLnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCXBlcmZvcm1EZWxldGUoKTsKLQkJCX0KLQkJCQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogUGVyZm9ybXMgZGVsZXRlCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVsZXRlKCkgewotCQlzdXBlci5ydW4oKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9PcGVuTGlicmFyeUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9PcGVuTGlicmFyeUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOTQ3ZjI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvT3BlbkxpYnJhcnlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLk9wZW5MaWJyYXJ5V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogSW1wbGVtZW50cyB0aGUgT3BlbiBMaWJyYXJ5IGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTGlicmFyeUFjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjcnVuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCU9wZW5MaWJyYXJ5V2l6YXJkIHdpemFyZCA9IG5ldyBPcGVuTGlicmFyeVdpemFyZCgpOwotCQl3aXphcmQuaW5pdCh3aW5kb3cuZ2V0V29ya2JlbmNoKCksIG51bGwpOwotCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9Qcm9jZXNzRGVsZXRlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL1Byb2Nlc3NEZWxldGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWE1NzY1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL1Byb2Nlc3NEZWxldGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5EZWxldGVSb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5EZWxldGVUYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5EZWxldGVUZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5EZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuRGVsZXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlByb2Nlc3NFbGVtZW50RGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5SZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotCi0vKioKLSAqIERlbGV0ZSBhY3Rpb24gZm9yIHByb2Nlc3MgZWxlbWVudAotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NEZWxldGVBY3Rpb24gZXh0ZW5kcyBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uIHsKLQlwcml2YXRlIGJvb2xlYW4gZGVsZXRpb25Db25maXJtZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgSGFzaFNldCByZW1vdmVkRGVzY3JpcHRvcnM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICovCi0JcHVibGljIFByb2Nlc3NEZWxldGVBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIAotCSAqIEBwYXJhbSBkb21haW4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0RlbGV0ZUFjdGlvbihFZGl0aW5nRG9tYWluIGRvbWFpbikgewotCQlzdXBlcihkb21haW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIGNvbmZpcm0KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0RlbGV0ZUFjdGlvbihFZGl0aW5nRG9tYWluIGRvbWFpbiwgYm9vbGVhbiBjb25maXJtKSB7Ci0JCXN1cGVyKGRvbWFpbiwgY29uZmlybSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uI2NyZWF0ZU1ldGhvZEVsZW1lbnREZWxldGVDb21tYW5kKCkKLQkgKi8KLQlwdWJsaWMgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQgY3JlYXRlTWV0aG9kRWxlbWVudERlbGV0ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgUHJvY2Vzc0VsZW1lbnREZWxldGVDb21tYW5kKFJlbW92ZUNvbW1hbmQuY3JlYXRlKGRvbWFpbiwKLQkJCQlzZWxlY3Rpb24pLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgY29udGVudCBvZiB0aGUgZ2l2ZW4gYWN0aXZpdHkgZnJvbSBpdHMgcmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHBhcmFtIG1vZGlmaWVkUmVzb3VyY2VzCi0JICovCi0JLy8gcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVDb250ZW50RnJvbVJlc291cmNlKEFjdGl2aXR5IGFjdCwKLQkvLyBTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkvLyBpZiAoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oYWN0KSkgewotCS8vIENvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gYWN0LmdldFByZXNlbnRhdGlvbigpOwotCS8vIFJlc291cmNlIHJlc291cmNlID0gY29udGVudC5lUmVzb3VyY2UoKTsKLQkvLyBpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCS8vIHJlc291cmNlLmdldENvbnRlbnRzKCkucmVtb3ZlKGNvbnRlbnQpOwotCS8vIG1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLyoqCi0JICogUnVuIHRoZSBkZWxldGUgYWN0aW9uIGdpdmVuIHRoZSBhY3Rpb24gbWFuYWdlcgotCSAqIEBwYXJhbSBhY3Rpb25NZ3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCWlmIChjb25maXJtRGVsZXRlKCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkvLyByZW1vdmUgcmVmZXJlbmNlcwotCQkJCXJlbW92ZVJlZmVyZW5jZXMoYWN0aW9uTWdyLCBpdG9yLm5leHQoKSk7Ci0JCQl9Ci0KLQkJCS8vIGRlbGV0ZSBlbGVtZW50Ci0JCQlkb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVDdXJyZW50RWRpdG9yKCkgewotCi0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uI2dldERlbGV0ZUNvbmZpcm1hdGlvbk1lc3NhZ2UoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVsZXRlQ29uZmlybWF0aW9uTWVzc2FnZSgpIHsKLQkJcmV0dXJuIExpYnJhcnlVSVJlc291cmNlcy5Qcm9jZXNzRGVsZXRlQWN0aW9uX2RlbGV0ZWNvZmlybV90ZXh0OyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoY29uZmlybURlbGV0ZSgpKSB7CQkJCi0JCQkvLyBjb2xsZWN0aW9uIHRoZSByZWxhdGVkIGRlc2NyaXB0b3JzIGJlZm9yZSB0aGUgZWxlbWVudHMgZ290IGRlbGV0ZWQKLQkJCS8vCi0JCQlDb2xsZWN0aW9uIGRlc2NyaXB0b3JzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWFkZFJlbGF0ZWREZXNjcmlwdG9ycyhkZXNjcmlwdG9ycywgZWxlbWVudCk7Ci0JCQl9Ci0KLQkJCQotCQkJQ29tbWFuZCBjbWQgPSBjb21tYW5kOwotCi0JCQkvLyBkZWxldGUgZWxlbWVudHMKLQkJCS8vCi0JCQljbWQuZXhlY3V0ZSgpOwotCi0JCQkvLyBDaGVjayByZWZlcmVuY2UgY29uZmlybWF0aW9uIGFuZCBpZiBjb25maXJtZWQgc2V0Ci0JCQkvLyBkZWxldGlvbmNvbmZpcm1lZCB0byB0cnVlCi0JCQkvLyBJZiBhbnkgZGVsZXRpb24gaGFwcGVucyBpbiBzZXF1ZW5jZSwgd2lsbCBjaGVjayBmb3IKLQkJCS8vIGRlbGV0aW9uY29uZmlybWVkIHZhcmlhYmxlCi0JCQkvLyBhbmQgcHJvY2VlZHMgcmVtYWluaW5nIGRlbGV0aW9uIHNlcXVlbmNlLiAoZWc6Ci0JCQkvLyBBYnN0cmFjdERpYWdyYW1FZGl0b3IgLSBEZWxldGVBY3Rpb24oKSkuCi0JCQlpZiAoKChEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCkgY21kKS5leGVjdXRlZCkgewotCQkJCWRlbGV0aW9uQ29uZmlybWVkID0gdHJ1ZTsKLQkJCQotCQkJCUNvbGxlY3Rpb24gZGVsZXRlZEVsZW1lbnRzID0gY21kLmdldFJlc3VsdCgpOwotCQkJCUNvbW1hbmQgZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kID0gbmV3IERlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCgKLQkJCQkJCWRlc2NyaXB0b3JzLCBmYWxzZSwgZGVsZXRlZEVsZW1lbnRzKSB7Ci0JCQkJCQotCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBkZWxldGUoTGlzdCBlbGVtZW50cykgewotCQkJCQkJcmV0dXJuIFByb2Nlc3NEZWxldGVBY3Rpb24uZGVsZXRlKGVsZW1lbnRzKTsKLQkJCQkJfQotCQkJCQkKLS8vCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlKExpc3QgZGVzY3JpcHRvcnNUb0RlbGV0ZSkgewotLy8JCQkJCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0RlbGV0ZUFjdGlvbl9zZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlOyAKLS8vCQkJCQkJT2JqZWN0W10gZGVzY3JpcHRvcnMgPSBSZWZlcmVuY2VTZWxlY3Rpb24uZ2V0UmVmZXJlbmNlcyhkZXNjcmlwdG9yc1RvRGVsZXRlLCBtc2cpOwotLy8JCQkJCQlkZXNjcmlwdG9yc1RvRGVsZXRlLnJldGFpbkFsbChBcnJheXMuYXNMaXN0KGRlc2NyaXB0b3JzKSk7Ci0vLwkJCQkJfQotCQkJCX07Ci0JCQkJdHJ5IHsKLQkJCQkJZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLmV4ZWN1dGUoKTsKLQkJCQl9Ci0JCQkJY2F0Y2goT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCQkvLwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHNhdmUgdGhlIGN1cnJlbnQgZWRpdG9yCi0JCQkvLwotCQkJc2F2ZUN1cnJlbnRFZGl0b3IoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkUmVsYXRlZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gZGVzY3JpcHRvcnMsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQ7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwodGFza0Rlc2MuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwodGFza0Rlc2MuZ2V0QXNzaXN0ZWRCeSgpKTsKLQkJCWRlc2NyaXB0b3JzLmFkZCh0YXNrRGVzYy5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpKTsKLQkJCWRlc2NyaXB0b3JzLmFkZEFsbCh0YXNrRGVzYy5nZXRNYW5kYXRvcnlJbnB1dCgpKTsKLQkJCWRlc2NyaXB0b3JzLmFkZEFsbCh0YXNrRGVzYy5nZXRFeHRlcm5hbElucHV0KCkpOwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKHRhc2tEZXNjLmdldE9wdGlvbmFsSW5wdXQoKSk7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwodGFza0Rlc2MuZ2V0T3V0cHV0KCkpOwotCQl9Ci0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCWRlc2NyaXB0b3JzLmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRBc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYykpOwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldEFkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpKTsKLQkJCWRlc2NyaXB0b3JzLmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKSk7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwocm9sZURlc2MuZ2V0UmVzcG9uc2libGVGb3IoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUmVmZXJlbmNlcyhJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIE9iamVjdCBvYmopIHsKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIGNtZCA9IG51bGw7Ci0JCWJvb2xlYW4gZm9yY2UgPSAhY29uZmlybTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQljbWQgPSBuZXcgRGVsZXRlVGFza0Rlc2NyaXB0b3IoKFRhc2tEZXNjcmlwdG9yKSBvYmosIGZvcmNlKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJY21kID0gbmV3IERlbGV0ZVJvbGVEZXNjcmlwdG9yKChSb2xlRGVzY3JpcHRvcikgb2JqLCBmb3JjZSk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQljbWQgPSBuZXcgRGVsZXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaiwKLQkJCQkJZm9yY2UpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQljbWQgPSBuZXcgRGVsZXRlVGVhbVByb2ZpbGUoKFRlYW1Qcm9maWxlKSBvYmopOwotCQl9Ci0JCWlmIChjbWQgIT0gbnVsbCkgewotCQkJaWYgKGFjdGlvbk1nciAhPSBudWxsKSB7Ci0JCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQotCQkJfSBlbHNlIHsKLQkJCQljbWQuZXhlY3V0ZSgpOwotCQkJfQotCQkJaWYgKGNtZCBpbnN0YW5jZW9mIFJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCkgewotCQkJCXJlbW92ZWREZXNjcmlwdG9ycwotCQkJCQkJLmFkZEFsbCgoKFJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCkgY21kKQotCQkJCQkJCQkuZ2V0UmVtb3ZlZERlc2NyaXB0b3JzKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCi0JCWJvb2xlYW4gcmV0ID0gc3VwZXIudXBkYXRlU2VsZWN0aW9uKGZpbHRlclNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBGaWx0ZXIgc2VsZWN0aW9uIAotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICogCQkJTmV3IFNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZmlsdGVyU2VsZWN0aW9uKAotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCQkmJiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50KQotCQkJCQkJCS5pc1JlYWRPbmx5KCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJbGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obGlzdCk7Ci0JfQotCi0JLyoqCi0JICogaWYgZGVsZXRpb24gY29uZmlybWVkLCBzZXQgY29uZmlybWF0aW9uIGFuZCBjaGlsZCBwcm9jZXNzIGNhbiB1c2UgdGhlCi0JICogY29uZmlybWF0aW9uIHRvIHByb2NlZWQgZm9yIHRoZSBkZWxldGlvbiBvZiByZW1haW5pbmcuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWxldGlvbkNvbmZpcm1lZCgpIHsKLQkJcmV0dXJuIGRlbGV0aW9uQ29uZmlybWVkOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBjb21tYW5kCi0JICogQHJldHVybiBjbWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb21tYW5kKCkgewotCQlyZXR1cm4gY29tbWFuZDsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGRlbGV0ZSBwcm9jZXNzIGVsZW1lbnRzIHdpdGhvdXQgVUkgYWN0aW9uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHJldHVybiB0aGUgZXhlY3V0ZWQgZGVsZXRlIGNvbW1hbmQgaWYgc29tZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudHMgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSBkZWxldGVkLCA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGlmIHVzZXIgY2FuY2VsZWQgdGhpcyBkZWxldGlvbiBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbW1hbmQgZGVsZXRlKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJUHJvY2Vzc0RlbGV0ZUFjdGlvbiBkZWxldGVBY3Rpb24gPSBuZXcgUHJvY2Vzc0RlbGV0ZUFjdGlvbigKLQkJCQludWxsLCBmYWxzZSkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbiNjcmVhdGVDb21tYW5kKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCQkJICovCi0JCQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJZG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbigKLQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCkpOwotCi0JCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbW1hbmQoc2VsZWN0aW9uKTsKLQkJCX0KLQotCQl9OwotCQlpZiAoZGVsZXRlQWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgQXJyYXlMaXN0KGVsZW1lbnRzKSkpKSB7Ci0JCQlkZWxldGVBY3Rpb24ucnVuKCk7Ci0JCQlpZiAoIWRlbGV0ZUFjdGlvbi5pc0RlbGV0aW9uQ29uZmlybWVkKCkpIHsKLQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXJldHVybiBkZWxldGVBY3Rpb24uZ2V0Q29tbWFuZCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL1VzZXJJbnRlcmFjdGlvbkhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvVXNlckludGVyYWN0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMGVjZmZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvVXNlckludGVyYWN0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuRXJyb3JEaWFsb2dOb1JlYXNvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3MuVW5jYW5jZWxhYmxlTGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzLlVzZXJJbnB1dHNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nOwotCi0vKioKLSAqIEltcGxlbWVudHMgaGFuZGxpbmcgb2YgdXNlciBpbnRlcmFjdGlvbiBkdXJpbmcgY29tbWFuZCBleGVjdXRpb24KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVXNlckludGVyYWN0aW9uSGFuZGxlciBpbXBsZW1lbnRzIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHsKLQkKLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCXByaXZhdGUgSU1lc3NlbmdlciBtZXNzZW5nZXIgPSBuZXcgSU1lc3NlbmdlcigpIHsKLQotCi0JCS8qIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaG93V2FybmluZyhmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBtc2cpIHsKLQkJCWlmKERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpIHsKLQkJCQkvLyBjdXJyZW50IHRocmVhZCBpcyBub3QgYSB1c2VyLWludGVyZmFjZSB0aHJlYWQKLQkJCQkvLwotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlXYXJuaW5nKHRpdGxlLCBtc2cpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbXNnKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0Vycm9yKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2hvd0Vycm9yKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1zZywgZmluYWwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJCWlmKHN0YXR1cyA9PSBudWxsKSB7Ci0JCQkJc2hvd0Vycm9yKHRpdGxlLCBtc2cpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkgewotCQkJCQkvLyBjdXJyZW50IHRocmVhZCBpcyBub3QgYSB1c2VyLWludGVyZmFjZSB0aHJlYWQKLQkJCQkJLy8KLQkJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZywgc3RhdHVzKTsKLQkJCQkJCX0KLQotCQkJCQl9KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIHN0YXR1cyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93RXJyb3IoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkV4Y2VwdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNob3dFcnJvcihmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBtc2csIGZpbmFsIFN0cmluZyByZWFzb24sIGZpbmFsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCWlmKERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpIHsKLQkJCQkvLyBjdXJyZW50IHRocmVhZCBpcyBub3QgYSB1c2VyLWludGVyZmFjZSB0aHJlYWQKLQkJCQkvLwotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnLCByZWFzb24sIGV4Y2VwdGlvbik7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnLCByZWFzb24sIGV4Y2VwdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQkvKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93V2FybmluZyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2hvd1dhcm5pbmcoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbXNnLCBmaW5hbCBTdHJpbmcgcmVhc29uKSB7Ci0JCQlpZihEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKSB7Ci0JCQkJLy8gY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdXNlci1pbnRlcmZhY2UgdGhyZWFkCi0JCQkJLy8KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbXNnLCByZWFzb24pOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbXNnLCByZWFzb24pOwotCQkJfQotCQl9Ci0KLQkJLyogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0Vycm9yKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaG93RXJyb3IoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbXNnKSB7Ci0JCQlpZihEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKSB7Ci0JCQkJLy8gY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdXNlci1pbnRlcmZhY2UgdGhyZWFkCi0JCQkJLy8KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZyk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnKTsKLQkJCX0KLQkJfQotCi0JCS8qIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dJbmZvKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaG93SW5mbyhmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBtc2cpIHsKLQkJCWlmKERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpIHsKLQkJCQkvLyBjdXJyZW50IHRocmVhZCBpcyBub3QgYSB1c2VyLWludGVyZmFjZSB0aHJlYWQKLQkJCQkvLwotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlJbmZvKHRpdGxlLCBtc2cpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5SW5mbyh0aXRsZSwgbXNnKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0Vycm9yKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5FeGNlcHRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaG93RXJyb3IoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbXNnLCBmaW5hbCBTdHJpbmcgcmVhc29uLCBmaW5hbCBTdHJpbmcgZGV0YWlscywgZmluYWwgRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJaWYoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkgewotCQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJCS8vCi0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIHJlYXNvbiwgZGV0YWlscywgZXhjZXB0aW9uKTsKLQkJCQkJfQotCQkJCQkKLQkJCQl9KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIHJlYXNvbiwgZGV0YWlscywgZXhjZXB0aW9uKTsKLQkJCX0KLQkJfQotCQkKLQl9OwotCQotCXB1YmxpYyBVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCkgewotCQkKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNoZWxsIHRoZSBzaGVsbCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaGVsbChTaGVsbCBzaGVsbCkgewotCQl0aGlzLnNoZWxsID0gc2hlbGw7Ci0JfQotCi0JLyogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIjZ2V0VUlDb250ZXh0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFVJQ29udGV4dCgpIHsKLQkJaWYoc2hlbGwgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKTsKLQkJfQotCQlyZXR1cm4gc2hlbGw7Ci0JfQotCi0JLyogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIjc2VsZWN0KGphdmEudXRpbC5MaXN0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyLCBib29sZWFuLCBqYXZhLnV0aWwuTGlzdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgTGlzdCBzZWxlY3QoTGlzdCBvYmplY3RzVG9TZWxlY3QsCi0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLCBib29sZWFuIG11bHRpcGxlLAotCQkJTGlzdCBpbnRpdGlhbFNlbGVjdGlvbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCWlmKG11bHRpcGxlKSB7Ci0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKTsKLQkJCVVuY2FuY2VsYWJsZUxpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IFVuY2FuY2VsYWJsZUxpc3RTZWxlY3Rpb25EaWFsb2coc2hlbGwsIG9iamVjdHNUb1NlbGVjdCwKLQkJCQkJY29udGVudFByb3ZpZGVyLCBsYWJlbFByb3ZpZGVyLCBtc2cpOwotCQkJZGxnLnNldFRpdGxlKHRpdGxlKTsKLQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWRsZy5vcGVuKCk7Ci0JCQlPYmplY3Qgb2Jqc1tdID0gZGxnLmdldFJlc3VsdCgpOwotCQkJaWYob2JqcyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZihvYmpzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJCX0KLQkJCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChvYmpzKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCUVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyhzaGVsbCwgbGFiZWxQcm92aWRlcik7Ci0JCQkKLQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWRsZy5zZXRFbGVtZW50cyhvYmplY3RzVG9TZWxlY3QudG9BcnJheSgpKTsKLQkJCWRsZy5zZXRNdWx0aXBsZVNlbGVjdGlvbihmYWxzZSk7Ci0JCQlkbGcuc2V0TWVzc2FnZShtc2cpOyAKLQkJCWRsZy5zZXRUaXRsZSh0aXRsZSk7Ci0JCQlkbGcuc2V0RmlsdGVyKG51bGwpOwotCQkJaWYoZGxnLm9wZW4oKSA9PSBEaWFsb2cuQ0FOQ0VMKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlPYmplY3Qgb2JqID0gZGxnLmdldEZpcnN0UmVzdWx0KCk7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChvYmopOwotCQl9Ci0JfQotCi0JLyogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIjc2VsZWN0T25lKGludFtdLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBpbnQgc2VsZWN0T25lKGludFtdIGFjdGlvbnMsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgSVN0YXR1cyBzdGF0dXMpIHsKLQkJZmluYWwgU3RyaW5nW10gYnV0dG9uTGFiZWxzID0gbmV3IFN0cmluZ1thY3Rpb25zLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJYnV0dG9uTGFiZWxzW2ldID0gZ2V0QWN0aW9uVGV4dChhY3Rpb25zW2ldKTsKLQkJfQotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzaGVsbCA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpCi0JCQkJCS5nZXRBY3RpdmVTaGVsbCgpOwotCQkJaW1hZ2UgPSBzaGVsbC5nZXRJbWFnZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCWlmKHN0YXR1cyA9PSBudWxsKSB7Ci0JCQlNZXNzYWdlRGlhbG9nIG1zZ0RsZyA9IG5ldyBNZXNzYWdlRGlhbG9nKHNoZWxsLCB0aXRsZSwgaW1hZ2UsIG1zZywgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgYnV0dG9uTGFiZWxzLCAwKTsKLQkJCWludCBpZCA9IG1zZ0RsZy5vcGVuKCk7Ci0JCQlyZXR1cm4gYWN0aW9uc1tpZF07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlFcnJvckRpYWxvZ05vUmVhc29uIGRsZyA9IG5ldyBFcnJvckRpYWxvZ05vUmVhc29uKHNoZWxsLCB0aXRsZSwgbXNnLCBzdGF0dXMsIElTdGF0dXMuT0sKLQkJCQkJfCBJU3RhdHVzLklORk8gfCBJU3RhdHVzLldBUk5JTkcgfCBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkKLQkJCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCQkJLy8gY3JlYXRlIE9LIGFuZCBEZXRhaWxzIGJ1dHRvbnMKLQkJCSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidXR0b25MYWJlbHMubGVuZ3RoOyBpKyspIHsKLQkJCSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IGJ1dHRvbkxhYmVsc1tpXTsKLQkJCSAgICAgICAgICAgIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIGksIGxhYmVsLCBpID09IDApOwotCQkJICAgICAgICB9Ci0JCQkJCWlmIChzaG91bGRTaG93RGV0YWlsc0J1dHRvbigpKSB7Ci0JCQkJCQlkZXRhaWxzQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lELAotCQkJCQkJCQlJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCwgZmFsc2UpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQkKLQkJCQkvKiAobm9uLUphdmFkb2MpCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkVycm9yRGlhbG9nTm9SZWFzb24jYnV0dG9uUHJlc3NlZChpbnQpCi0JCQkJICovCi0JCQkJcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgaWQpIHsKLQkJCQkJaWYgKGlkID09IElEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCkgewotCQkJCQkJc3VwZXIuYnV0dG9uUHJlc3NlZChpZCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJICAgICAgICBzZXRSZXR1cm5Db2RlKGlkKTsKLQkJCQkgICAgICAgIGNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJaW50IGlkID0gZGxnLm9wZW4oKTsKLQkJCXJldHVybiBhY3Rpb25zW2lkXTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhY3Rpb24gdGV4dAotCSAqIEBwYXJhbSBhY3Rpb24KLQkgKiBAcmV0dXJuCi0JICogCQlBY3Rpb24gdGV4dCAtIGVpdGhlciBBQk9SVCwgQ0FOQ0VMLCBPSywgUkVUUlkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25UZXh0KGludCBhY3Rpb24pIHsKLQkJc3dpdGNoIChhY3Rpb24pIHsKLQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQUJPUlQ6Ci0JCQlyZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5BQk9SVF9MQUJFTDsKLQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMOgotCQkJcmV0dXJuIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMOwotCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9PSzoKLQkJCXJldHVybiBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMOwotCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9SRVRSWToKLQkJCXJldHVybiBJRGlhbG9nQ29uc3RhbnRzLlJFVFJZX0xBQkVMOwotCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9ZRVM6Ci0JCQlyZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUw7Ci0JCWNhc2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX05POgotCQkJcmV0dXJuIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUw7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlciNnZXRNZXNzZW5nZXIoKQotCSAqLwotCXB1YmxpYyBJTWVzc2VuZ2VyIGdldE1lc3NlbmdlcigpIHsKLQkJcmV0dXJuIG1lc3NlbmdlciA7Ci0JfQotCi0JLyogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIjcmVxdWVzdElucHV0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlcXVlc3RJbnB1dChTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIExpc3QgdXNlcklucHV0cykgewotCi0JCWlmICh1c2VySW5wdXRzID09IG51bGwgfHwgdXNlcklucHV0cy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJVXNlcklucHV0c0RpYWxvZyBkaWFsb2cgPSBuZXcgVXNlcklucHV0c0RpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQl1c2VySW5wdXRzLCB0aXRsZSwgbXNnKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm4gZGlhbG9nLmdldFJlc3VsdCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlciNnZXRSdW5uYWJsZUNvbnRleHQoKQotCSAqLwotCXB1YmxpYyBJUnVubmFibGVDb250ZXh0IGdldFJ1bm5hYmxlQ29udGV4dCgpIHsKLQkJU2hlbGwgc2hlbGw7Ci0JCU9iamVjdCB1aUN0eCA9IGdldFVJQ29udGV4dCgpOwotCQlpZih1aUN0eCBpbnN0YW5jZW9mIFNoZWxsKSB7Ci0JCQlzaGVsbCA9IChTaGVsbCkgdWlDdHg7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzaGVsbCA9IE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKTsKLQkJfQotCQlyZXR1cm4gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNlNTRjOWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBhY3Rpb25zIGZvciBtYW5hZ2luZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvQmFzZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9CYXNlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyZGNkNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9CYXNlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIExpYnJhcnkgVUkgZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlRGlhbG9nIGV4dGVuZHMgVGl0bGVBcmVhRGlhbG9nIHsKLQotCS8qKgotCSAqIFRoZSBPSyBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLQotCS8qKgotCSAqIFRoZSBDYW5jZWwgYnV0dG9uLgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gY2FuY2VsQnV0dG9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcGFyZW50IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBCYXNlRGlhbG9nKFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRpYWxvZyBidXR0b25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIE9LIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLQkJCQl0cnVlKTsKLQotCQkvLyBDcmVhdGUgdGhlIENhbmNlbCBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0KLQkJLy8gU2V0IGhlbHAgY29udGV4dCBmb3IgdGhlIE9LIGJ1dHRvbi4KLQkJb2tCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0KLQkJLy8gU2V0IGhlbHAgY29udGV4dCBmb3IgdGhlIENhbmNlbCBidXR0b24uCi0JCWNhbmNlbEJ1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0NvbnZlcnRBY3Rpdml0eURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9Db252ZXJ0QWN0aXZpdHlEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGU0ZWVjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0NvbnZlcnRBY3Rpdml0eURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Db252ZXJ0QWN0aXZpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdERpYWxvZzsKLQotLyoqCi0gKiBEaWFsb2cgdG8gY29udmVydCBhY3Rpdml0eSB0eXBlIAotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnZlcnRBY3Rpdml0eURpYWxvZyB7Ci0KLQkvKioKLQkgKiBRdWVyeSB1c2VyIGFuZCBjb252ZXJ0IHRoZSBvbGQgYWN0aXZpdHkgaW50byBuZXcgb25lCi0JICogCi0JICogQHBhcmFtIG9sZEFjdGl2aXR5Ci0JICogQHBhcmFtIHNoZWxsCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAKLQkgKiBAcmV0dXJuIE5ld2x5IGNvbnZlcnRlZCBhY3Rpdml0eQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHkgcXVlcnlVc2VyQW5kQ29udmVydChBY3Rpdml0eSBvbGRBY3Rpdml0eSwgU2hlbGwgc2hlbGwsCi0JCQlEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0JCQotCQlpZiAoc2hlbGwgPT0gbnVsbCkKLQkJCXNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJTGlzdERpYWxvZyBkbGcgPSBuZXcgTGlzdERpYWxvZyhzaGVsbCk7Ci0JCWRsZy5zZXRIZWlnaHRJbkNoYXJzKDUpOwotCQlkbGcuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJZGxnLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlzd2l0Y2ggKCgoSW50ZWdlcikgZWxlbWVudCkuaW50VmFsdWUoKSkgewotCQkJCS8vIFRPRE86IHJlZmFjdG9yIHRoZXNlIHN0cmluZ3MgKGFuZCB0aGlzIHdob2xlIGRpYWxvZykgaW50bwotCQkJCS8vIGxpYnJhcnkudWkKLQkJCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFk6Ci0JCQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfQUNUSVZJVFk7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLklURVJBVElPTjoKLQkJCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9JVEVSQVRJT047Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlBIQVNFOgotCQkJCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX1BIQVNFOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLnVua25vd25HdWlkYW5jZV90ZXh0OyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQl9Ci0JCX0pOwotCQlMaXN0IG5ld0FjdGl2aXR5VHlwZUxpc3QgPSBnZXRWYWxpZE5ld0FjdGl2aXR5VHlwZXMob2xkQWN0aXZpdHkpOwotCQlpZiAobmV3QWN0aXZpdHlUeXBlTGlzdCA9PSBudWxsKSB7Ci0JCQlMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLmNvbnZlcnRBY3Rpdml0eUVycm9yX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX21zZywKLQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuYmluZChMaWJyYXJ5VUlSZXNvdXJjZXMudW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfcmVhc29uLCBTdHJVdGlsLnRvTG93ZXIoVG5nVXRpbC5nZXRUeXBlVGV4dChvbGRBY3Rpdml0eSkpKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlkbGcuc2V0SW5wdXQobmV3QWN0aXZpdHlUeXBlTGlzdCk7Ci0JCWRsZy5zZXRUaXRsZShMaWJyYXJ5VUlSZXNvdXJjZXMuY29udmVydEFjdGl2aXR5RGlhbG9nX3RpdGxlKTsKLQkJZGxnLnNldE1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLmNvbnZlcnRBY3Rpdml0eURpYWxvZ190ZXh0KTsKLQkJaWYgKGRsZy5vcGVuKCkgPT0gRGlhbG9nLkNBTkNFTCkKLQkJCXJldHVybiBudWxsOwotCi0JCU9iamVjdFtdIHNlbGVjdGlvblJlc3VsdCA9IGRsZy5nZXRSZXN1bHQoKTsKLQkJaWYgKHNlbGVjdGlvblJlc3VsdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBjaG9zZW5BY3Rpdml0eSA9ICgoSW50ZWdlcikgc2VsZWN0aW9uUmVzdWx0WzBdKS5pbnRWYWx1ZSgpOwotCQkKLS8vCQlyZXR1cm4gQ29udmVydEFjdGl2aXR5VHlwZS5jb252ZXJ0QWN0aXZpdHkob2xkQWN0aXZpdHksIGNob3NlbkFjdGl2aXR5LCBjb21tYW5kKTsKLQkJCi0JCXJldHVybiBUeXBlQ29udmVydGVyLmNvbnZlcnRBY3Rpdml0eShvbGRBY3Rpdml0eSwgVHlwZUNvbnZlcnRlci5nZXRBY3Rpdml0eVR5cGUoY2hvc2VuQWN0aXZpdHkpKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBsaXN0IG9mIHZhbGlkIG5ldyBhY3Rpdml0eSB0eXBlcyBiYXNlZCBvbiBvbGQgYWN0aXZpdHkgdHlwZQotCSAqIAotCSAqIEBwYXJhbSBvbGRBY3Rpdml0eQotCSAqIAotCSAqIEByZXR1cm4gbGlzdCBvZiB2YWxpZCBhY3Rpdml0eSB0eXBlcwotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRWYWxpZE5ld0FjdGl2aXR5VHlwZXMoQWN0aXZpdHkgb2xkQWN0aXZpdHkpIHsKLQkJaWYgKG9sZEFjdGl2aXR5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSW50ZWdlciBvbGRBY3Rpdml0eUNsYXNzSUQgPSBuZXcgSW50ZWdlcihvbGRBY3Rpdml0eS5lQ2xhc3MoKQotCQkJCS5nZXRDbGFzc2lmaWVySUQoKSk7Ci0JCWlmICghQ29udmVydEFjdGl2aXR5VHlwZS5jb21wYXRpYmxlQWN0aXZpdGllc0xpc3QuY29udGFpbnMob2xkQWN0aXZpdHlDbGFzc0lEKSkKLQkJCXJldHVybiBudWxsOwotCQlMaXN0IGFjdGl2aXR5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gQ29udmVydEFjdGl2aXR5VHlwZS5jb21wYXRpYmxlQWN0aXZpdGllc0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJbnRlZ2VyIGNvbXBhdGlibGVBY3Rpdml0eVR5cGVDbGFzc0lEID0gKEludGVnZXIpaXRlci5uZXh0KCk7Ci0JCQlpZiAoIW9sZEFjdGl2aXR5Q2xhc3NJRC5lcXVhbHMoY29tcGF0aWJsZUFjdGl2aXR5VHlwZUNsYXNzSUQpICYmCi0JCQkJCWNvbXBhdGlibGVBY3Rpdml0eVR5cGVDbGFzc0lELmludFZhbHVlKCkgIT0gVW1hUGFja2FnZS5DQVBBQklMSVRZX1BBVFRFUk4gJiYKLQkJCQkJY29tcGF0aWJsZUFjdGl2aXR5VHlwZUNsYXNzSUQuaW50VmFsdWUoKSAhPSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1MpCi0JCQkJYWN0aXZpdHlMaXN0LmFkZChjb21wYXRpYmxlQWN0aXZpdHlUeXBlQ2xhc3NJRCk7Ci0JCX0KLQkJcmV0dXJuIGFjdGl2aXR5TGlzdDsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvTGlicmFyeUJhY2t1cERpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9MaWJyYXJ5QmFja3VwRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllYjViYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9MaWJyYXJ5QmFja3VwRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gYmFjayB1cCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeUJhY2t1cERpYWxvZyBleHRlbmRzIFBhdGhTZWxlY3Rpb25EaWFsb2cgewotCi0JcHVibGljIExpYnJhcnlCYWNrdXBEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwKLQkJCVN0cmluZyBkaWFsb2dNZXNzYWdlLCBTdHJpbmcgZGVmYXVsdFBhdGgpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBkaWFsb2dNZXNzYWdlLCBkZWZhdWx0UGF0aCk7Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVCdXR0b24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBpbnQsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgaW50IGlkLCBTdHJpbmcgbGFiZWwsCi0JCQlib29sZWFuIGRlZmF1bHRCdXR0b24pIHsKLQkJQnV0dG9uIGIgPSBzdXBlci5jcmVhdGVCdXR0b24ocGFyZW50LCBpZCwgbGFiZWwsIGRlZmF1bHRCdXR0b24pOwotCQlpZiAoaWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJYi5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5va0J1dHRvbl90ZXh0KTsKLQotCQl9IGVsc2UgaWYgKGlkID09IElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKSB7Ci0JCQliLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLnNraXBCdXR0b25fdGV4dCk7Ci0JCX0KLQotCQlyZXR1cm4gYjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL09wZW5MaWJyYXJ5RGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL09wZW5MaWJyYXJ5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhYWRlNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9PcGVuTGlicmFyeURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogUHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBNZXRob2QgTGlicmFyeSBmb2xkZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciAxLjAKLSAqIAotICogZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NjM4Ci0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTGlicmFyeURpYWxvZyBleHRlbmRzIEJhc2VEaWFsb2cgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIEltYWdlIHRpdGxlSW1hZ2U7Ci0KLQlwcml2YXRlIFRleHQgbGlicmFyeVBhdGhUZXh0OwotCi0JcHJpdmF0ZSBTdHJpbmcgbGlicmFyeVBhdGg7Ci0KLQlwcml2YXRlIEJ1dHRvbiBwcm9tcHRGb3JMaWJyYXJ5Q2hlY2tib3g7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udHJvbC4KLQkgKiBAcGFyYW0gbGlicmFyeVBhdGgKLQkgKiAgICAgICAgICAgIFBhdGggdG8gYSBNZXRob2QgTGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgT3BlbkxpYnJhcnlEaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgbGlicmFyeVBhdGgpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5saWJyYXJ5UGF0aCA9IGxpYnJhcnlQYXRoOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9ncy5CYXNlRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlzZXRUaXRsZShMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlNYWluV2l6YXJkUGFnZV90aXRsZSk7Ci0JCVN0cmluZyBhcHBOYW1lID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKTsKLQkJU3RyaW5nIG9wZW5MaWJEdGV4dCA9IE5MUy5iaW5kKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeU1haW5XaXphcmRQYWdlX3RleHQsCi0JCQkJbmV3IE9iamVjdFtdIHsgYXBwTmFtZX0pOwotCQlzZXRNZXNzYWdlKG9wZW5MaWJEdGV4dCk7Ci0JCXRpdGxlSW1hZ2UgPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJPcGVuTGlicmFyeS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUaXRsZUltYWdlKHRpdGxlSW1hZ2UpOwotCi0JCUNvbXBvc2l0ZSBpbnB1dENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQlpbnB1dENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQotCQljcmVhdGVMYWJlbChpbnB1dENvbXBvc2l0ZSwgIiAiLCAzKTsgLy8kTk9OLU5MUy0xJAotCi0JCUxhYmVsIGxpYnJhcnlMYWJlbCA9IG5ldyBMYWJlbChpbnB1dENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsaWJyYXJ5TGFiZWwuc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMubGlicmFyeUxhYmVsX3RleHQpOwotCi0JCWxpYnJhcnlQYXRoVGV4dCA9IG5ldyBUZXh0KGlucHV0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNDUwOwotCQlsaWJyYXJ5UGF0aFRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJbGlicmFyeVBhdGhUZXh0LnNldFRleHQobGlicmFyeVBhdGgpOwotCQlsaWJyYXJ5UGF0aFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKG9rQnV0dG9uICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHN0YXR1cyA9IGlzVmFsaWRQYXRoKGxpYnJhcnlQYXRoVGV4dC5nZXRUZXh0KCkpOwotCQkJCQlpZiAoc3RhdHVzID09IG51bGwpIHsKLQkJCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKTsKLQkJCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlCdXR0b24gYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihpbnB1dENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXRyeSB7Ci0JCQkJCVNlbGVjdExpYnJhcnlEaXJlY3RvcnlEaWFsb2cgZGQgPSBuZXcgU2VsZWN0TGlicmFyeURpcmVjdG9yeURpYWxvZygKLQkJCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpKTsKLQkJCQkJZGQuc2V0RmlsdGVyUGF0aChsaWJyYXJ5UGF0aFRleHQuZ2V0VGV4dCgpKTsKLQkJCQkJU3RyaW5nIHBhdGggPSBkZC5vcGVuKCk7Ci0JCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJCWxpYnJhcnlQYXRoVGV4dC5zZXRUZXh0KHBhdGgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gVE9ETzogRGlzcGxheSBhbiBlcnJvciBkaWFsb2cuCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljcmVhdGVMYWJlbChpbnB1dENvbXBvc2l0ZSwgIiAiLCAzKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMYWJlbChpbnB1dENvbXBvc2l0ZSwgIiAiLCAzKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMYWJlbChpbnB1dENvbXBvc2l0ZSwgIiAiLCAzKTsgLy8kTk9OLU5MUy0xJAotCQluZXcgTGFiZWwoaW5wdXRDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0KLQkJcHJvbXB0Rm9yTGlicmFyeUNoZWNrYm94ID0gbmV3IEJ1dHRvbihpbnB1dENvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJcHJvbXB0Rm9yTGlicmFyeUNoZWNrYm94Ci0JCQkJLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLnByb21wdEZvckxpYnJhcnlDaGVja2JveF90ZXh0KTsKLQotCQlzdXBlci5nZXRTaGVsbCgpLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlKTsKLQotCQlzdXBlci5nZXRTaGVsbCgpLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHRpdGxlSW1hZ2UgIT0gbnVsbCAmJiAhdGl0bGVJbWFnZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJdGl0bGVJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQl9Ci0KLQkvKiogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I29wZW4oKQotCSAqLwotCXB1YmxpYyBpbnQgb3BlbigpIHsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCQlyZXR1cm4gc3VwZXIub3BlbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LndpZGdldCA9PSBwcm9tcHRGb3JMaWJyYXJ5Q2hlY2tib3gpIHsKLQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCS5zZXRQcm9tcHRGb3JNZXRob2RMaWJyYXJ5QXRTdGFydHVwKHByb21wdEZvckxpYnJhcnlDaGVja2JveAotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3BhbikgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGlzVmFsaWRQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIExpYnJhcnlVSVJlc291cmNlcy5pbnZhbGlkUGF0aF9tc2c7Ci0JCX0KLQotCQlJUGF0aCBlY1BhdGggPSBQYXRoLmZyb21PU1N0cmluZyhwYXRoKTsKLQkJYm9vbGVhbiBpc1ZhbGlkID0gZWNQYXRoLmlzVmFsaWRQYXRoKHBhdGgpOwotCQlpZiAoIWlzVmFsaWQpIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlSZXNvdXJjZXMuaW52YWxpZFBhdGhfbXNnOwotCQl9IGVsc2UgewotCQkJaWYgKCFTdHJVdGlsLmlzVmFsaWRQdWJsaXNoUGF0aChwYXRoKSkKLQkJCQlyZXR1cm4gTGlicmFyeVVJUmVzb3VyY2VzLmludmFsaWRQYXRoX21zZzsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9ncy5CYXNlRGlhbG9nI2NyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlCi0JICogICAgICBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJbGlicmFyeVBhdGggPSBsaWJyYXJ5UGF0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuc2V0UHJvbXB0Rm9yTWV0aG9kTGlicmFyeUF0U3RhcnR1cCghcHJvbXB0Rm9yTGlicmFyeUNoZWNrYm94Ci0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgQ2FuY2VsIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKiAKLQkgKiBUT0RPOiBUaGlzIHdpbGwgc2h1dGRvd24gdGhlIEVjbGlwc2UgSURFLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQoKSB7Ci0JCVN5c3RlbS5leGl0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlbGVjdGVkIE1ldGhvZCBMaWJyYXJ5IHBhdGguCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5UGF0aCgpIHsKLQkJcmV0dXJuIGxpYnJhcnlQYXRoOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9QYXRoU2VsZWN0aW9uRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1BhdGhTZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDFjYWUyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1BhdGhTZWxlY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuRGlyZWN0b3J5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIAotICogVXRpbGl0eSBjbGFzcyB0byBzZWxlY3QgYSBwYXRoCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBhdGhTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JcHJvdGVjdGVkIFRleHQgY3RybF9wYXRoOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX2Jyb3dzZV9idXR0b247Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotCi0JcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlOwotCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZTsKLQotCXB1YmxpYyBQYXRoU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsCi0JCQlTdHJpbmcgZGlhbG9nTWVzc2FnZSwgU3RyaW5nIGRlZmF1bHRQYXRoKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQotCQl0aXRsZSA9IGRpYWxvZ1RpdGxlOwotCQltZXNzYWdlID0gZGlhbG9nTWVzc2FnZTsKLQkJdmFsdWUgPSBkZWZhdWx0UGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2J1dHRvblByZXNzZWQoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQl2YWx1ZSA9IGN0cmxfcGF0aC5nZXRUZXh0KCk7Ci0KLQkJCS8vIG1ha2Ugc3VyZSB0aGUgcGF0aCBpcyB2YWxpZAotCQkJU3RyaW5nIG1zZyA9IExpYnJhcnlVSVJlc291cmNlcy5wYXRoU2VsZWN0aW9uRXJyb3JfbXNnOwotCQkJaWYgKERpcmVjdG9yeVZhbGlkYXRvci5jaGVja0FuZENyZWF0ZURpcih2YWx1ZSwgdGl0bGUsIG1zZykgPT0gZmFsc2UpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl2YWx1ZSA9IG51bGw7Ci0JCX0KLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJaWYgKHRpdGxlICE9IG51bGwpCi0JCQlzaGVsbC5zZXRUZXh0KHRpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgT0sgYW5kIENhbmNlbCBidXR0b25zIGJ5IGRlZmF1bHQKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLQkJCQl0cnVlKTsKLQotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCi0JCS8vIGRvIHRoaXMgaGVyZSBiZWNhdXNlIHNldHRpbmcgdGhlIHRleHQgd2lsbCBzZXQgZW5hYmxlbWVudCBvbiB0aGUgb2sKLQkJLy8gYnV0dG9uCi0JCWN0cmxfcGF0aC5zZXRGb2N1cygpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJY3RybF9wYXRoLnNldFRleHQodmFsdWUpOwotCQkJY3RybF9wYXRoLnNlbGVjdEFsbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkvLyBjcmVhdGUgbWVzc2FnZQotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJCWxhYmVsLnNldFRleHQobWVzc2FnZSk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLQkJCQkJfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQkJZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLk1JTklNVU1fTUVTU0FHRV9BUkVBX1dJRFRIKTsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlsYWJlbC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQl9Ci0JCWN0cmxfcGF0aCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQljdHJsX3BhdGguc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMCi0JCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQljdHJsX2Jyb3dzZV9idXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljdHJsX2Jyb3dzZV9idXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0JCQkJR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJY3RybF9icm93c2VfYnV0dG9uLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLmJyb3dzZUJ1dHRvbl90ZXh0KTsKLQkJY3RybF9icm93c2VfYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW9wZW5EaXJlY3RvcnlEaWFsb2coKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBkaXJlY3RvcnkgZGlhbG9nCi0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgb3BlbkRpcmVjdG9yeURpYWxvZygpIHsKLQkJdHJ5IHsKLQkJCS8vIFRleHQgY3RybF9wYXRoID0gc3VwZXIuZ2V0VGV4dCgpOwotCQkJRGlyZWN0b3J5RGlhbG9nIGRkID0gbmV3IERpcmVjdG9yeURpYWxvZyh0aGlzLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJCWRkLnNldEZpbHRlclBhdGgoY3RybF9wYXRoLmdldFRleHQoKSk7Ci0KLQkJCVN0cmluZyBkZXN0aW5hdGlvbiA9IGRkLm9wZW4oKTsKLQkJCWlmIChkZXN0aW5hdGlvbiAhPSBudWxsKSB7Ci0JCQkJY3RybF9wYXRoLnNldFRleHQoZGVzdGluYXRpb24pOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGF0aAotCSAqIEByZXR1cm4gcGF0aAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvU2VsZWN0TGlicmFyeURpcmVjdG9yeURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9TZWxlY3RMaWJyYXJ5RGlyZWN0b3J5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4Y2E3ZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9TZWxlY3RMaWJyYXJ5RGlyZWN0b3J5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFByb21wcyB0aGUgdXNlciB0byBzZWxlY3QgYSBtZXRob2QgbGlicmFyeSBmb2xkZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0TGlicmFyeURpcmVjdG9yeURpYWxvZyB7Ci0KLQlwcml2YXRlIERpcmVjdG9yeURpYWxvZyBkaWFsb2c7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgc2hlbGwuCi0JICovCi0JcHVibGljIFNlbGVjdExpYnJhcnlEaXJlY3RvcnlEaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXRoaXMocGFyZW50LCBTV1QuTk9ORSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IHNoZWxsLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIGRpYWxvZyBzdHlsZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0TGlicmFyeURpcmVjdG9yeURpYWxvZyhTaGVsbCBwYXJlbnQsIGludCBzdHlsZSkgewotCQlkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHBhcmVudCwgc3R5bGUpOwotCQlkaWFsb2cuc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMuc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190aXRsZSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKExpYnJhcnlVSVJlc291cmNlcy5zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RleHQpOwotCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXREZWZhdWx0TGlicmFyeVBhdGgoKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZmlsdGVyIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBmaWx0ZXIgcGF0aC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXJQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIE1ha2VzIHRoZSBkaWFsb2cgdmlzaWJsZSBhbmQgYnJpbmdzIGl0IHRvIHRoZSBmcm9udCBvZiB0aGUgZGlzcGxheS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIG9wZW4oKSB7Ci0JCXJldHVybiBkaWFsb2cub3BlbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9Td2l0Y2hDb25maWdEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvU3dpdGNoQ29uZmlnRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyODU3MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9Td2l0Y2hDb25maWdEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFByb21wdHMgdGhlIHVzZXIgdG8gc3dpdGNoIHRoZSBjdXJyZW50IENvbmZpZ3VyYXRpb24gdG8gYSByZWNvbW1lbmRlZAotICogQ29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN3aXRjaENvbmZpZ0RpYWxvZyB7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gcmVjb21tZW5kZWRDb25maWc7Ci0KLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgc2hlbGwuCi0JICogQHBhcmFtIHJlY29tbWVuZGVkQ29uZmlnCi0JICogICAgICAgICAgICBUaGUgcmVjb21tZW5kZWQgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3dpdGNoQ29uZmlnRGlhbG9nKFNoZWxsIHNoZWxsLCBNZXRob2RDb25maWd1cmF0aW9uIHJlY29tbWVuZGVkQ29uZmlnKSB7Ci0JCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQkJdGhpcy5yZWNvbW1lbmRlZENvbmZpZyA9IHJlY29tbWVuZGVkQ29uZmlnOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBkaWFsb2cgaWZmIHRoZSBnaXZlbiByZWNvbW1lbmRlZENvbmZpZyBpcyBkaWZmZXJlbnQgdGhhbiB0aGUKLQkgKiBjdXJyZW50bHkgc2VsZWN0ZWQgY29uZmlnCi0JICogCi0JICogcmV0dXJucyBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEIGlmIGRpYWxvZyB3YXNuJ3Qgc2hvd24sIG9yIGlmIGNvbmZpZyB3YXMKLQkgKiBzd2l0Y2hlZCByZXR1cm5zIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEIGlmIGRpYWxvZyB3YXMgc2hvd24gYW5kIHVzZXIKLQkgKiBkaWQgbm90IGNsaWNrIFllcwotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmIChyZWNvbW1lbmRlZENvbmZpZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIHN3aXRjaENvbmZpZ1ByZWYgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRTd2l0Y2hDb25maWcoKTsKLQkJaWYgKE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLk5FVkVSLmVxdWFscyhzd2l0Y2hDb25maWdQcmVmKSkgewotCQkJLy8gQ2FsbCB0aGlzIHRvIHJlZnJlc2ggYWN0aXZlIHBhcnQgaWYgbmVlZGVkLgotCQkJLy8gVE9ETzogUmV2aWV3IGltcGxlbWVudGF0aW9uLgotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpICE9IHJlY29tbWVuZGVkQ29uZmlnKSB7Ci0JCQlTdHJpbmcgY29uZmlnTmFtZSA9IHJlY29tbWVuZGVkQ29uZmlnLmdldE5hbWUoKTsKLQkJCWlmIChNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5QUk9NUFQuZXF1YWxzKHN3aXRjaENvbmZpZ1ByZWYpKSB7Ci0JCQkJTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUgZGlhbG9nID0gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUKLQkJCQkJCS5vcGVuWWVzTm9RdWVzdGlvbihzaGVsbCwKLQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnN3aXRjaENvbmZpZ0RpYWxvZ190aXRsZSwKLQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzCi0JCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5zd2l0Y2hDb25maWdEaWFsb2dfdGV4dCwKLQkJCQkJCQkJCQljb25maWdOYW1lKSwKLQkJCQkJCQkJbnVsbCwgZmFsc2UsIExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksCi0JCQkJCQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzLlBSRUZfU1dJVENIX0NPTkZJRyk7Ci0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQpIHsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwKLQkJCQkJCQkJCWNvbmZpZ05hbWUpOwotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKAotCQkJCQkJCWNvbmZpZyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gQ2FsbCB0aGlzIHRvIHJlZnJlc2ggYWN0aXZlIHBhcnQgaWYgbmVlZGVkLgotCQkJCQkvLyBUT0RPOiBSZXZpZXcgaW1wbGVtZW50YXRpb24uCi0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oCi0JCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuQUxXQVlTLmVxdWFscyhzd2l0Y2hDb25maWdQcmVmKSkgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBjb25maWdOYW1lKTsKLQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKAotCQkJCQkJY29uZmlnKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9VbmNhbmNlbGFibGVMaXN0U2VsZWN0aW9uRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1VuY2FuY2VsYWJsZUxpc3RTZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2FmM2FjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1VuY2FuY2VsYWJsZUxpc3RTZWxlY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3RTZWxlY3Rpb25EaWFsb2c7Ci0KLS8qKgotICogVGhpcyBkaWFsb2cgZXh0ZW5kcyBqZmFjZSBMaXN0U2VsZWN0aW9uRGlhbG9nIGFuZCByZW1vdmVzIGNhbmNlbCBidXR0b24KLSAgKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4xCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVW5jYW5jZWxhYmxlTGlzdFNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIExpc3RTZWxlY3Rpb25EaWFsb2cgewotCi0JcHVibGljIFVuY2FuY2VsYWJsZUxpc3RTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIE9iamVjdCBpbnB1dCwKLSAgICAgICAgICAgIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciwKLSAgICAgICAgICAgIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsIFN0cmluZyBtZXNzYWdlKQotCXsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGlucHV0LCBjb250ZW50UHJvdmlkZXIsIGxhYmVsUHJvdmlkZXIsIG1lc3NhZ2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLSAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1VzZXJJbnB1dHNEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvVXNlcklucHV0c0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MTFiNjFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvVXNlcklucHV0c0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuVXNlcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRoaXMgZGlhbG9nIGFjdHMgYXMgYSBpbnB1dCBkaWFsb2cgZHVyaW5nIGNvbW1hbmQgZXhlY3V0aW9uIGJhc2VkIG9uIHVzZXIKLSAqIGlucHV0IGFuZCBpbnB1dFR5cGUgZGlhbG9nIGJlaGF2aW91ciBjaGFuZ2VzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFVzZXJJbnB1dHNEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCi0JSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQotCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZ2xvYmFsRXJyb3JUeHQgPSAiIjsKLQkKLQlwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotCi0JcHJpdmF0ZSBMaXN0IHVzZXJJbnB1dHM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQlMYWJlbCBtZXNzYWdlQXJlYTsKLQotCUxhYmVsIGVycm9yQXJlYTsKLQotCUhhc2hNYXA8T2JqZWN0LE9iamVjdD4gb2xkSW5mb0ZvckNhbmNlbDsKLQkKLQlwcml2YXRlIENvbG9yIHJlZENvbG9yOwotCQotCXB1YmxpYyBVc2VySW5wdXRzRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBMaXN0IHVzZXJJbnB1dHMsIFN0cmluZyB0aXRsZSwKLQkJCVN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotCQl0aGlzLnVzZXJJbnB1dHMgPSB1c2VySW5wdXRzOwotCQlvbGRJbmZvRm9yQ2FuY2VsID0gbmV3IEhhc2hNYXA8T2JqZWN0LE9iamVjdD4oKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgVHJlZSBWaWV3ZXIuCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBVc2VySW5wdXQgdXNlcklucHV0KSB7Ci0JCVRyZWVWaWV3ZXIgdmlld2VyOwotCQlpZiAoIXVzZXJJbnB1dC5pc011bHRpcGxlKCkpIHsKLQkJCXZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTAotCQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl9IGVsc2UgewotCQkJdmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwKLQkJCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJfQotCi0JCUdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJewotCQkJc3BlYy53aWR0aEhpbnQgPSAyMDA7Ci0JCQlzcGVjLmhlaWdodEhpbnQgPSAyMDA7Ci0JCQlzcGVjLmhvcml6b250YWxTcGFuID0gMzsKLQkJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShzcGVjKTsKLQkJfQotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQotCQkJfQotCi0JCX0pOwotCi0JCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCQl9IGVsc2UgewotCQkJCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQkJfQotCQkJdmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0KLQkJCXZpZXdlci5zZXRJbnB1dCh1c2VySW5wdXQuZ2V0Q2hvaWNlcygpKTsKLQkJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJCS8vIFRPRE86IHRyZWVWaWV3ZXIgU29ydGVyIGFuZCBFeHBhbmQvQ29sbGFwc2UKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBUYWJsZVZpZXdlcgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIFVzZXJJbnB1dCB1c2VySW5wdXQpIHsKLQkJVGFibGVWaWV3ZXIgdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCk7Ci0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBUZXh0IGNvbnRyb2wKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHVzZXJJbnB1dAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgVXNlcklucHV0IHVzZXJJbnB1dCkgewotCQlmaW5hbCBVc2VySW5wdXQgbG9jYWxpbnB1dCA9IHVzZXJJbnB1dDsKLQkJZmluYWwgSVZhbGlkYXRvciB2YWxpZGF0b3IgPSB1c2VySW5wdXQuZ2V0VmFsaWRhdG9yKCk7Ci0JCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQllcnJvckFyZWEuc2V0VGV4dCgiIik7Ci0JCQl9Ci0JCX0pOwotCi0JCXRleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCVN0cmluZyBlcnJvclR4dCA9ICIiOwotCQkJCWlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotCQkJCQllcnJvclR4dCA9IHZhbGlkYXRvci5pc1ZhbGlkKHRleHQuZ2V0VGV4dCgpKTsKLQkJCQkJaWYgKGVycm9yVHh0ICE9IG51bGwgJiYgZXJyb3JUeHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQllcnJvckFyZWEuc2V0VGV4dChlcnJvclR4dCk7Ci0JCQkJCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZmFsc2UpOwkJCQkJCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllcnJvckFyZWEuc2V0VGV4dCgiIik7Ci0JCQkJCX0KLQkJCQkJZ2xvYmFsRXJyb3JUeHQgPSBlcnJvclR4dDsKLQkJCQl9Ci0JCQkJaWYgKGVycm9yVHh0ID09IG51bGwgfHwgZXJyb3JUeHQubGVuZ3RoKCkgPD0gMCkgewotCQkJCQlsb2NhbGlucHV0LnNldElucHV0KHRleHQuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlpZiAodXNlcklucHV0LmdldElucHV0KCkgIT0gbnVsbCkgewotCQkJdGV4dC5zZXRUZXh0KChTdHJpbmcpIHVzZXJJbnB1dC5nZXRJbnB1dCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0byBzZXRJbnB1dCwgc3ViY2xhc3MgY2FuIG92ZXJyaWRlIGl0LgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldElucHV0KFVzZXJJbnB1dCBpbnB1dCwgT2JqZWN0IG9iaikgewotCQlpbnB1dC5zZXRJbnB1dChvYmopOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBDb21ib3ZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogQHBhcmFtIHVzZXJJbnB1dAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbWJvVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUsIFVzZXJJbnB1dCB1c2VySW5wdXQpIHsKLQkJZmluYWwgVXNlcklucHV0IGxvY2FsSW5wdXQgPSB1c2VySW5wdXQ7Ci0JCWZpbmFsIElWYWxpZGF0b3IgdmFsaWRhdG9yID0gdXNlcklucHV0LmdldFZhbGlkYXRvcigpOwotCQlmaW5hbCBDb21ib1ZpZXdlciB2aWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIoY29tcG9zaXRlKTsKLQkJdmlld2VyLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YSgKLQkJCQluZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQlpZiAodXNlcklucHV0LmdldExhYmVsUHJvdmlkZXIoKSAhPSBudWxsKSB7Ci0JCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcih1c2VySW5wdXQuZ2V0TGFiZWxQcm92aWRlcigpKTsKLQkJfQotCQlMaXN0IGNob2ljZXMgPSB1c2VySW5wdXQuZ2V0Q2hvaWNlcygpOwotCQl2aWV3ZXIuc2V0SW5wdXQoY2hvaWNlcyk7Ci0JCWlmIChjaG9pY2VzICE9IG51bGwgJiYgY2hvaWNlcy5zaXplKCkgPiAwKSB7Ci0JCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNob2ljZXMuZ2V0KDApKSk7Ci0JCQlsb2NhbElucHV0LnNldElucHV0KGNob2ljZXMuZ2V0KDApKTsKLQkJfQotCQl2aWV3ZXIuZ2V0Q29tYm8oKS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIGVycm9yVHh0ID0gIiI7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ZWQgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdG9yLmlzVmFsaWQoc2VsZWN0ZWQuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJCWVycm9yVHh0ID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJCQl9Ci0JCQkJaWYgKGVycm9yVHh0ICE9IG51bGwgJiYgZXJyb3JUeHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWVycm9yQXJlYS5zZXRUZXh0KGVycm9yVHh0KTsKLQkJCQkJZ2V0QnV0dG9uKE9LKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9IGlmIChnbG9iYWxFcnJvclR4dCAhPSBudWxsICYmIGdsb2JhbEVycm9yVHh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQllcnJvckFyZWEuc2V0VGV4dChnbG9iYWxFcnJvclR4dCk7Ci0JCQkJCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJZXJyb3JBcmVhLnNldFRleHQoIiIpOwotCQkJfQotCQl9KTsKLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZXJyb3JBcmVhLnNldFRleHQoIiIpOwotCi0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCU9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIGVycm9yVHh0ID0gIiI7Ci0JCQkJaWYgKHZhbGlkYXRvciAhPSBudWxsKSB7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdG9yLmlzVmFsaWQob2JqKTsKLQkJCQkJaWYgKHN0YXR1cy5nZXRDb2RlKCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCQkJZXJyb3JUeHQgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQkJCQl9Ci0JCQkJCWlmIChlcnJvclR4dCAhPSBudWxsICYmIGVycm9yVHh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQkJZXJyb3JBcmVhLnNldFRleHQoZXJyb3JUeHQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGdsb2JhbEVycm9yVHh0ICE9IG51bGwgJiYgZ2xvYmFsRXJyb3JUeHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQllcnJvckFyZWEuc2V0VGV4dChnbG9iYWxFcnJvclR4dCk7Ci0JCQkJCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCWVycm9yQXJlYS5zZXRUZXh0KCIiKTsKLQkJCQl9Ci0JCQkJaWYgKGVycm9yVHh0ID09IG51bGwgfHwgZXJyb3JUeHQubGVuZ3RoKCkgPD0gMCkgewotCQkJCQlsb2NhbElucHV0LnNldElucHV0KG9iaik7Ci0JCQkJfQotCQkJfQotCQl9KTsJCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgTGFiZWwgYW5kIFRleHQgZm9yIG1lc3NhZ2UgYXJlYS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVNZXNzYWdlQXJlYShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCW1lc3NhZ2VBcmVhID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQltZXNzYWdlQXJlYS5zZXRUZXh0KG1lc3NhZ2UpOwotCQl9Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2QuaGVpZ2h0SGludCA9IDI1OwotCQltZXNzYWdlQXJlYS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYXBwbHlEaWFsb2dGb250KG1lc3NhZ2VBcmVhKTsKLQkJTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkhPUklaT05UQUwgfCBTV1QuU0VQQVJBVE9SKTsKLQkJR3JpZERhdGEgZ2QxID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkMS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkMSk7Ci0JCXJldHVybiBtZXNzYWdlQXJlYTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQotCQljcmVhdGVNZXNzYWdlQXJlYShjb21wb3NpdGUpOwotCi0JCS8vIENyZWF0ZSBjb250cm9scyBiYXNlZCBvbiBVc2VySW5wdXRzCi0JCWlmICh1c2VySW5wdXRzICE9IG51bGwgJiYgdXNlcklucHV0cy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdXNlcklucHV0cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVXNlcklucHV0KSB7Ci0JCQkJCVVzZXJJbnB1dCB1c2VySW5wdXQgPSAoVXNlcklucHV0KSBvYmplY3Q7Ci0KLQkJCQkJLy8gU3RvcmUgdGhlIHVzZXJJbnB1dCBpbiB0aGUgaGFzaG1hcCBmb3IgY2FuY2VsIGFjdGlvbi4KLQkJCQkJb2xkSW5mb0ZvckNhbmNlbC5wdXQodXNlcklucHV0LCB1c2VySW5wdXQuZ2V0SW5wdXQoKSk7Ci0KLQkJCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQkJCWxhYmVsLnNldFRleHQodXNlcklucHV0LmdldExhYmVsKCkpOwotCQkJCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkJCQlpZiAodXNlcklucHV0LmdldFR5cGUoKSA9PSBVc2VySW5wdXQuVEVYVCkgewotCQkJCQkJY3JlYXRlVGV4dChjb21wb3NpdGUsIHVzZXJJbnB1dCk7Ci0JCQkJCX0gZWxzZSBpZiAodXNlcklucHV0LmdldFR5cGUoKSA9PSBVc2VySW5wdXQuU0VMRUNUSU9OKSB7Ci0JCQkJCQljcmVhdGVDb21ib1ZpZXdlcihjb21wb3NpdGUsIHVzZXJJbnB1dCk7Ci0JCQkJCX0KLQkJCQkJLy8gY3JlYXRlRW1wdHlMYWJlbChjb21wb3NpdGUsIDIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljcmVhdGVFcnJvckFyZWEoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgRXJyb3IgQXJlYS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVycm9yQXJlYShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCS8vIGNyZWF0ZSBibGFuayBsYWJlbAotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0KLQkJZXJyb3JBcmVhID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQlyZWRDb2xvciA9IG5ldyBDb2xvcihudWxsLCBuZXcgUkdCKDI1NSwgMCwgMCkpOwotCQlpZihyZWRDb2xvciAhPSBudWxsKXsKLQkJCWVycm9yQXJlYS5zZXRGb3JlZ3JvdW5kKHJlZENvbG9yKTsKLQkJfQotCQkvLyBpZihlcnJvclR4dCAhPSBudWxsICYmIGVycm9yVHh0Lmxlbmd0aCgpID4wKXsKLQkJLy8gZXJyb3JBcmVhLnNldFRleHQoZXJyb3JUeHQpOwotCQkvLyB9Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2QuaGVpZ2h0SGludCA9IDI1OwotCQllcnJvckFyZWEuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWFwcGx5RGlhbG9nRm9udChlcnJvckFyZWEpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCWlmICh0aGlzLnRpdGxlICE9IG51bGwpIHsKLQkJCW5ld1NoZWxsLnNldFRleHQodGhpcy50aXRsZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI29rUHJlc3NlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlyZXN1bHQgPSB0cnVlOwkJCi0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY2FuY2VsUHJlc3NlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2FuY2VsUHJlc3NlZCgpIHsKLQkJaWYgKHVzZXJJbnB1dHMgIT0gbnVsbCAmJiB1c2VySW5wdXRzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB1c2VySW5wdXRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBVc2VySW5wdXQpIHsKLQkJCQkJVXNlcklucHV0IHVzZXJJbnB1dCA9IChVc2VySW5wdXQpIG9iamVjdDsKLQkJCQkJdXNlcklucHV0LnNldElucHV0KG9sZEluZm9Gb3JDYW5jZWwuZ2V0KHVzZXJJbnB1dCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5jYW5jZWxQcmVzc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0cy4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQlpZihyZWRDb2xvciAhPSBudWxsKXsKLQkJCXJlZENvbG9yLmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlIGEgZW1wdHkgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzcGFuCi0JICovCi0JLy8gcHJpdmF0ZSB2b2lkIGNyZWF0ZUVtcHR5TGFiZWwoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHNwYW4pewotCS8vIExhYmVsIGVtcHR5TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JLy8gZW1wdHlMYWJlbC5zZXRCYWNrZ3JvdW5kKENvbG9ycy5JTkhFUklURURfRUxFTUVOVF9MQUJFTCk7Ci0JLy8gR3JpZERhdGEgZW1wdHlEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JLy8gZW1wdHlMYWJlbC5zZXRUZXh0KCIiKTsKLQkvLyBlbXB0eURhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkvLyBlbXB0eURhdGEuaG9yaXpvbnRhbFNwYW4gPXNwYW47Ci0JLy8gZW1wdHlEYXRhLmhlaWdodEhpbnQgPSAzOwotCS8vIGVtcHR5TGFiZWwuc2V0TGF5b3V0RGF0YShlbXB0eURhdGEpOwotCS8vIH0KLQkvKioKLQkgKiB2YWxpZGF0ZXMgdGhlIGlucHV0IHdpdGggZ2l2ZW4gVmFsaWRhdG9yIGluIFVzZXJJbnB1dC4KLQkgKi8KLQkvLyBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGUoKSB7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gdXNlcklucHV0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBVc2VySW5wdXQgZWxlbWVudCA9IChVc2VySW5wdXQpIGl0ZXIubmV4dCgpOwotCS8vIElWYWxpZGF0b3IgdmFsaWRhdG9yID0gZWxlbWVudC5nZXRWYWxpZGF0b3IoKTsKLQkvLyBpZiAodmFsaWRhdG9yICE9IG51bGwpIHsKLQkvLyBpZiAoZWxlbWVudC5nZXRUeXBlKCkgPT0gVXNlcklucHV0LlRFWFQpIHsKLQkvLyBlcnJvclR4dCArPSB2YWxpZGF0b3IKLQkvLyAuaXNWYWxpZChlbGVtZW50LmdldElucHV0KCkudG9TdHJpbmcoKSk7Ci0JLy8gfSBlbHNlIHsKLQkvLyBlcnJvclR4dCArPSB2YWxpZGF0b3IuaXNWYWxpZChlbGVtZW50LmdldElucHV0KCkpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIGVycm9yVHh0ID0gIlN5c3RlbSBvdXQgdGVzdGluZyI7Ci0JLy8gaWYgKGVycm9yVHh0ICE9IG51bGwgJiYgZXJyb3JUeHQubGVuZ3RoKCkgPiAwKSB7Ci0JLy8gZXJyb3JBcmVhLnNldFRleHQoZXJyb3JUeHQpOwotCS8vIGVycm9yQXJlYS5zZXRGb3JlZ3JvdW5kKENvbG9yQ29uc3RhbnRzLnJlZCk7Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQkvLyByZXR1cm4gdHJ1ZTsKLQkvLyB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NDAwNzZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZGlhbG9ncyBmb3IgbWFuYWdpbmcgYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0MTM2YTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogTW9kZWxzIHRoZSA8bmV3TGlicmFyeVdpemFyZFBhZ2U+IGVsZW1lbnQgaW4gdGhlCi0gKiAib3JnLmVjbGlwc2UuZXBmLmxpYnJyYXkudWkubmV3TGlicmFyeVdpemFyZFBhZ2VzIiBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24gewotCi0JLy8gVGhlIHBsdWctaW4gdGhhdCBjb250cmlidXRlZCB0aGlzIHByb3ZpZGVyLgotCXByaXZhdGUgQnVuZGxlIGJ1bmRsZTsKLQotCS8vIFRoZSB3aXphcmQgcGFnZSBjbGFzcyBuYW1lLgotCXByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKLQotCS8vIFRoZSBsaWJyYXJ5IHR5cGUgaWRlbnRpZmllci4KLQlwcml2YXRlIFN0cmluZyB0eXBlSWQ7Ci0KLQkvLyBUaGUgd2l6YXJkIHBhZ2UgdGl0bGUuCi0JcHJpdmF0ZSBTdHJpbmcgdGl0bGU7Ci0KLQkvLyBUaGUgd2l6YXJkIHBhZ2UgZGVzY3JpcHRpb24uCi0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbihCdW5kbGUgYnVuZGxlLCBTdHJpbmcgY2xhc3NOYW1lLAotCQkJU3RyaW5nIHR5cGVJZCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQl0aGlzLnR5cGVJZCA9IHR5cGVJZDsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Zy1pbiB0aGF0IGNvbnRyaWJ1dGVkIHRoaXMgcHJvdmlkZXIuCi0JICovCi0JcHVibGljIEJ1bmRsZSBnZXRCdW5kbGUoKSB7Ci0JCXJldHVybiBidW5kbGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2l6YXJkIHBhZ2UgY2xhc3MgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlIGlkZW50aWZpZXIuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlSWQoKSB7Ci0JCXJldHVybiB0eXBlSWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2l6YXJkIHBhZ2UgdGl0bGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdpemFyZCBwYWdlIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZDc3YzRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNb2RlbHMgdGhlIDxvcGVuTGlicmFyeVdpemFyZFBhZ2U+IGVsZW1lbnQgaW4gdGhlCi0gKiAib3JnLmVjbGlwc2UuZXBmLmxpYnJyYXkudWkub3BlbkxpYnJhcnlXaXphcmRQYWdlcyIgZXh0ZW5zaW9uIHBvaW50LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiB0aGF0IGNvbnRyaWJ1dGVkIHRoaXMgcHJvdmlkZXIuCi0JcHJpdmF0ZSBCdW5kbGUgYnVuZGxlOwotCi0JLy8gVGhlIHdpemFyZCBwYWdlIGNsYXNzIG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCi0JLy8gVGhlIGxpYnJhcnkgdHlwZSBpZGVudGlmaWVyLgotCXByaXZhdGUgU3RyaW5nIHR5cGVJZDsKLQotCS8vIFRoZSB3aXphcmQgcGFnZSB0aXRsZS4KLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotCS8vIFRoZSB3aXphcmQgcGFnZSBkZXNjcmlwdGlvbi4KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbihCdW5kbGUgYnVuZGxlLCBTdHJpbmcgY2xhc3NOYW1lLAotCQkJU3RyaW5nIHR5cGVJZCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQl0aGlzLnR5cGVJZCA9IHR5cGVJZDsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Zy1pbiB0aGF0IGNvbnRyaWJ1dGVkIHRoaXMgcHJvdmlkZXIuCi0JICovCi0JcHVibGljIEJ1bmRsZSBnZXRCdW5kbGUoKSB7Ci0JCXJldHVybiBidW5kbGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2l6YXJkIHBhZ2UgY2xhc3MgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlIGlkZW50aWZpZXIuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlSWQoKSB7Ci0JCXJldHVybiB0eXBlSWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2l6YXJkIHBhZ2UgdGl0bGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdpemFyZCBwYWdlIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGQzMmRlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgVUkgc3VwcHBvcnQgZm9yIG1hbmFnaW5nIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJlZmVyZW5jZXMvTGlicmFyeVVJUHJlZmVyZW5jZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ByZWZlcmVuY2VzL0xpYnJhcnlVSVByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkMDVjYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJlZmVyZW5jZXMvTGlicmFyeVVJUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlByZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgTGlicmFyeSBVSSBwcmVmZXJlbmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VUlQcmVmZXJlbmNlcyB7Ci0KLQkvKioKLQkgKiBUaGUgTGlicmFyeSBVSSBwcmVmZXJlbmNlIGtleXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPTVBUX0ZPUl9MSUJSQVJZX0FUX1NUQVJUVVAgPSAicHJvbXB0Rm9yTGlicmFyeUF0U3RhcnR1cCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX0xJQlJBUllfUEFUSCA9ICJzYXZlZExpYnJhcnlQYXRoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9VTk9QRU5fQUNUSVZJVFlfREQgPSAicHVibGlzaFVub3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU1dJVENIX0NPTkZJRyA9ICJzd2l0Y2hDb25maWd1cmF0aW9uT25Qcm9jZXNzQWN0aXZhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0FEX0ZPUl9BQ1RJVklUWV9FWFRFTlNJT04gPSAicHVibGlzaEFjdGl2aXR5RGlhZ3JhbWZvckFjdGl2aXR5RXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fU0hPUlRfTkFNRSA9ICJhcHBuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19MSUJSQVJZX1BBVEhTID0gIm5ld0xpYnJhcnlQYXRocyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX0xJQlJBUllfUEFUSFMgPSAib3BlbkxpYnJhcnlQYXRocyI7IC8vJE5PTi1OTFMtMSQJCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fTElCUkFSWV9VUklTID0gIm9wZW5MaWJyYXJ5VVJJcyI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyB7Ci0JCS8vIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCi0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlzdG9yZS5zZXREZWZhdWx0KFBST01QVF9GT1JfTElCUkFSWV9BVF9TVEFSVFVQLCB0cnVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChTQVZFRF9MSUJSQVJZX1BBVEgsICIiKTsgLy8kTk9OLU5MUy0xJAkKLQkJc3RvcmUuc2V0RGVmYXVsdChQUkVGX1NXSVRDSF9DT05GSUcsIE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLlBST01QVCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoTkVXX0xJQlJBUllfUEFUSFMsIGdldERlZmF1bHRMaWJyYXJ5UGF0aCgpKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChPUEVOX0xJQlJBUllfUEFUSFMsIGdldERlZmF1bHRMaWJyYXJ5UGF0aCgpKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChPUEVOX0xJQlJBUllfVVJJUywgIiIpOyAvLyROT04tTkxTLTEkCQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb21wdCBmb3IgTWV0aG9kIExpYnJhcnkgYXQgc3RhcnR1cCBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaXMgdGhlIHByZWZlcmVuY2UgaXMgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRQcm9tcHRGb3JNZXRob2RMaWJyYXJ5QXRTdGFydHVwKCkgewotCQlyZXR1cm4gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotCQkJCVBST01QVF9GT1JfTElCUkFSWV9BVF9TVEFSVFVQKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwcm9tcHQgZm9yIE1ldGhvZCBMaWJyYXJ5IGF0IHN0YXJ0dXAgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZW5hYmxlZAotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9tcHRGb3JNZXRob2RMaWJyYXJ5QXRTdGFydHVwKGJvb2xlYW4gZW5hYmxlZCkgewotCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKAotCQkJCVBST01QVF9GT1JfTElCUkFSWV9BVF9TVEFSVFVQLCBlbmFibGVkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHVibGlzaFVub3BlbkFjdGl2aXR5ZGQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoCi0JCQkJUFVCTElTSF9VTk9QRU5fQUNUSVZJVFlfREQsIGVuYWJsZWQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCgpIHsKLQkJcmV0dXJuIExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbigKLQkJCQlQVUJMSVNIX1VOT1BFTl9BQ1RJVklUWV9ERCk7Ci0JfQotCi0JLyoqCi0JICogU2V0dGVyIG1ldGhvZCBmb3IgUHVibGlzaCBBY3Rpdml0eSBEaWFncmFtIGZvciBBY3Rpdml0eSBFeHRlbnNpb24sCi0JICogCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oYm9vbGVhbiBlbmFibGVkKSB7Ci0JCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoCi0JCQkJUFVCTElTSF9BRF9GT1JfQUNUSVZJVFlfRVhURU5TSU9OLCBlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXR0ZXIgbWV0aG9kIGZvciBQdWJsaXNoIEFjdGl2aXR5IERpYWdyYW0gZm9yIEFjdGl2aXR5IEV4dGVuc2lvbiBmbGFnCi0JICogZnJvbSBwcmVmZXJlbmNlIHN0b3JlLAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbigKLQkJCQlQVUJMSVNIX0FEX0ZPUl9BQ1RJVklUWV9FWFRFTlNJT04pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgc3dpdGNoIGNvbmZpZ3VyYXRpb24gdmFsdWUgc3RvcmUgaW4gcHJlZmVyZW5jZSBzdG9yZQotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgLSBjb3VsZCBiZSBBTFdBWVMsIE5FVkVSLCBQUk9NUFQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTd2l0Y2hDb25maWcoKSB7Ci0JCXJldHVybiBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQlQUkVGX1NXSVRDSF9DT05GSUcpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHN3aXRjaCBjb25maWd1cmF0aW9uIHZhbHVlIGluIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFZhbHVlIGNvdWxkIGJlIEFMV0FZUywgTkVWRVIsIFBST01QVAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTd2l0Y2hDb25maWcoU3RyaW5nIHZhbHVlKSB7Ci0JCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoCi0JCQkJUFJFRl9TV0lUQ0hfQ09ORklHLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgTWV0aG9kIExpYnJhcnkgcGF0aCB0aGF0IHdhcyBzYXZlZCBpbiBhIHByZXZpb3VzIHNlc3Npb24uCi0JICogCi0JICogQHJldHVybiBUaGUgc2F2ZWQgbGlicmFyeSBwYXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNhdmVkTGlicmFyeVBhdGgoKSB7Ci0JCXJldHVybiBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQlTQVZFRF9MSUJSQVJZX1BBVEgpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIGEgTWV0aG9kIExpYnJhcnkgcGF0aCB0byB0aGUgTGlicmFyeSBVSSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqIAotCSAqIEBwYXJhbSBsaWJQYXRoCi0JICogICAgICAgICAgICBQYXRoIHRvIGEgTWV0aG9kIExpYnJhcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNhdmVkTGlicmFyeVBhdGgoU3RyaW5nIGxpYlBhdGgpIHsKLQkJU3RyaW5nIHBhdGggPSBsaWJQYXRoOwotCQlpZiAocGF0aC5lbmRzV2l0aChNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0xJQlJBUllfTU9ERUxfRklMRU5BTUUpKSB7Ci0JCQlwYXRoID0gRmlsZVV0aWwuZ2V0UGFyZW50RGlyZWN0b3J5KHBhdGgpOwotCQl9Ci0JCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoCi0JCQkJU0FWRURfTElCUkFSWV9QQVRILCBwYXRoKTsKLQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IE1ldGhvZCBMaWJyYXJ5IHBhdGguCi0JICogCi0JICogQHJldHVybiBUaGUgZGVmYXVsdCBNZXRob2QgTGlicmFyeSBwYXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRMaWJyYXJ5UGF0aCgpIHsKLQkJU3RyaW5nIHVzZXJIb21lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKS5yZXBsYWNlKCdcXCcsICcvJyk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGxpYnJhcnlQYXRoID0gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmcoCi0JCQkJImxpYnJhcnlQYXRoIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGxpYnJhcnlQYXRoID09IG51bGwgfHwgbGlicmFyeVBhdGgubGVuZ3RoKCkgPT0gMAotCQkJCXx8IGxpYnJhcnlQYXRoLnN0YXJ0c1dpdGgoIlsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlsaWJyYXJ5UGF0aCA9IHVzZXJIb21lICsgIi9NZXRob2QgTGlicmFyaWVzL0xpYnJhcnkiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAobGlicmFyeVBhdGguc3RhcnRzV2l0aCgiPHVzZXIuaG9tZT4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlsaWJyYXJ5UGF0aCA9IHVzZXJIb21lICsgbGlicmFyeVBhdGguc3Vic3RyaW5nKDExKTsKLQkJfQotCQlpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpLmVxdWFscygiXFwiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWxpYnJhcnlQYXRoID0gbGlicmFyeVBhdGgucmVwbGFjZSgnLycsICdcXCcpOwotCQl9Ci0KLQkJaW50IGlkeCA9IC0xOwotCQlpZiAoKGlkeCA9IGxpYnJhcnlQYXRoLmluZGV4T2YoIjxhcHAubmFtZT4iKSkgPj0gMCkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXBwTmFtZVByb3BlciA9IExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCS5nZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpOwotCQkJbGlicmFyeVBhdGggPSBsaWJyYXJ5UGF0aC5zdWJzdHJpbmcoMCwgaWR4KSArIGFwcE5hbWVQcm9wZXIKLQkJCQkJKyBsaWJyYXJ5UGF0aC5zdWJzdHJpbmcoaWR4ICsgMTApOwotCQl9Ci0KLQkJcmV0dXJuIGxpYnJhcnlQYXRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFwcGxpY2F0aW9uIHNob3J0IG5hbWUgcGFzc2VkIGluIHRoZSBtYWluIGZlYXR1cmUncwotCSAqIHBsdWdpbl9jdXN0b21pemF0aW9uLmluaS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBwYXNzZWQtaW4gYXBwbGljYXRpb24gc2hvcnQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpIHsKLQkJU3RyaW5nIGFwcG5hbWUgPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJLmdldFN0cmluZyhBUFBMSUNBVElPTl9TSE9SVF9OQU1FKTsKLQkJcmV0dXJuIGFwcG5hbWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmV3IGxpYnJhcnkgcGF0aHMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1ldGhvZCBsaWJyYXJ5IHBhdGhzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXROZXdMaWJyYXJ5UGF0aHMoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRTdHJpbmdWYWx1ZXMoTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSwgTkVXX0xJQlJBUllfUEFUSFMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG5ldyBsaWJyYXJ5IHBhdGhzIHByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgbWV0aG9kIGxpYnJhcnkgcGF0aHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TmV3TGlicmFyeVBhdGhzTGlzdCgpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldExpc3QoTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSwgTkVXX0xJQlJBUllfUEFUSFMpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBtZXRob2QgbGlicmFyeSBwYXRoIHRvIHRoZSBuZXcgbGlicmFyeSBwYXRocyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5IHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTmV3TGlicmFyeVBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJTGlzdCBwYXRocyA9IGdldE5ld0xpYnJhcnlQYXRoc0xpc3QoKTsKLQkJCXBhdGhzLnJlbW92ZShwYXRoKTsKLQkJCXBhdGhzLmFkZCgwLCBwYXRoKTsKLQkJCS8vIEZJWE1FISBSZWFkIGZyb20gZ2xvYmFsIHByZWZlcmVuY2UuCi0JCQlpZiAocGF0aHMuc2l6ZSgpID4gMTApIHsKLQkJCQlwYXRocyA9IHBhdGhzLnN1Ykxpc3QoMCwgMTApOwotCQkJCXBhdGhzLnNldCg5LCBnZXREZWZhdWx0TGlicmFyeVBhdGgoKSk7Ci0JCQl9Ci0JCQlQcmVmZXJlbmNlVXRpbC5zZXRMaXN0KExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpLCBORVdfTElCUkFSWV9QQVRIUywgcGF0aHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgb3BlbiBsaWJyYXJ5IHBhdGhzIHByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBtZXRob2QgbGlicmFyeSBwYXRocwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0T3BlbkxpYnJhcnlQYXRocygpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldFN0cmluZ1ZhbHVlcyhMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpLCBPUEVOX0xJQlJBUllfUEFUSFMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wZW4gbGlicmFyeSBwYXRocyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIG1ldGhvZCBsaWJyYXJ5IHBhdGhzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE9wZW5MaWJyYXJ5UGF0aHNMaXN0KCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuZ2V0TGlzdChMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpLCBPUEVOX0xJQlJBUllfUEFUSFMpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBtZXRob2QgbGlicmFyeSBwYXRoIHRvIHRoZSBvcGVuIGxpYnJhcnkgcGF0aHMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeSBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE9wZW5MaWJyYXJ5UGF0aChTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlMaXN0IHBhdGhzID0gZ2V0T3BlbkxpYnJhcnlQYXRoc0xpc3QoKTsKLQkJCXBhdGhzLnJlbW92ZShwYXRoKTsKLQkJCXBhdGhzLmFkZCgwLCBwYXRoKTsKLQkJCS8vIEZJWE1FISBSZWFkIGZyb20gZ2xvYmFsIHByZWZlcmVuY2UuCi0JCQlpZiAocGF0aHMuc2l6ZSgpID4gMTApIHsKLQkJCQlwYXRocyA9IHBhdGhzLnN1Ykxpc3QoMCwgMTApOwotCQkJCXBhdGhzLnNldCg5LCBnZXREZWZhdWx0TGlicmFyeVBhdGgoKSk7Ci0JCQl9Ci0JCQlQcmVmZXJlbmNlVXRpbC5zZXRMaXN0KExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpLCBPUEVOX0xJQlJBUllfUEFUSFMsIHBhdGhzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wZW4gbGlicmFyeSBVUklzIHByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgbWV0aG9kIGxpYnJhcnkgVVJJcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0T3BlbkxpYnJhcnlVUklzKCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuZ2V0U3RyaW5nVmFsdWVzKExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksIE9QRU5fTElCUkFSWV9VUklTKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcGVuIGxpYnJhcnkgVVJJcyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIG1ldGhvZCBsaWJyYXJ5IFVSSXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0T3BlbkxpYnJhcnlVUklzTGlzdCgpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldExpc3QoTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSwgT1BFTl9MSUJSQVJZX1VSSVMpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBtZXRob2QgbGlicmFyeSBVUkkgdG8gdGhlIG9wZW4gbGlicmFyeSBVUklzIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeSBVUkkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkT3BlbkxpYnJhcnlVUkkoU3RyaW5nIHVyaSkgewotCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCUxpc3QgbGlicmFyeVVSSXMgPSBnZXRPcGVuTGlicmFyeVBhdGhzTGlzdCgpOwotCQkJbGlicmFyeVVSSXMucmVtb3ZlKHVyaSk7Ci0JCQlsaWJyYXJ5VVJJcy5hZGQoMCwgdXJpKTsKLQkJCS8vIEZJWE1FISBSZWFkIGZyb20gZ2xvYmFsIHByZWZlcmVuY2UuCi0JCQlpZiAobGlicmFyeVVSSXMuc2l6ZSgpID4gMTApIHsKLQkJCQlsaWJyYXJ5VVJJcyA9IGxpYnJhcnlVUklzLnN1Ykxpc3QoMCwgMTApOwotCQkJfQotCQkJUHJlZmVyZW5jZVV0aWwuc2V0TGlzdChMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSwgT1BFTl9MSUJSQVJZX1VSSVMsIGxpYnJhcnlVUklzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmUgYWxsIHByZWZlcmVuY2VzCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVBbGxQcmVmZXJlbmNlcygpIHsKLQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ByZWZlcmVuY2VzL1JlY2VudGx5T3BlbmVkTGlicmFyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJlZmVyZW5jZXMvUmVjZW50bHlPcGVuZWRMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQxZWEzMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJlZmVyZW5jZXMvUmVjZW50bHlPcGVuZWRMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotCi0vKioKLSAqIE1vZGVscyBhIHJlY2VudGx5IG9wZW5lZCBtZXRob2QgbGlicmFyeSBwcmVmZXJlbmNlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqLwotcHVibGljIGNsYXNzIFJlY2VudGx5T3BlbmVkTGlicmFyeSB7Ci0KLQlwcml2YXRlIFVSSSB1cmk7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkKLQlwcml2YXRlIFN0cmluZyBwYXRoOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUmVjZW50bHlPcGVuZWRMaWJyYXJ5KFN0cmluZyB1cmkpIHsKLQkJdHJ5IHsKLQkJCXRoaXMudXJpID0gbmV3IFVSSSh1cmkpOwotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodGhpcy51cmkpOwotCQkJdGhpcy5uYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0JCQl0aGlzLnBhdGggPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlicmFyeSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaWJyYXJ5IFVSSS4KLQkgKi8KLQlwdWJsaWMgVVJJIGdldFVSSSgpIHsKLQkJcmV0dXJuIHVyaTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgbGlicmFyeSBwYXRoLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIHBhdGg7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOTg1OGEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHByZWZlcmVuY2Ugc3VwcG9ydCBmb3IgbWFuYWdpbmcgYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWM5YzY1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIFRoZSBjb250ZW50IHByb3ZpZGVyIGZvciBhIHByb2Nlc3MgdHJlZS4KLSAqIDxwPgotICogRGlzcGxheXMgdGhlIHRyZWUgaW4gdGhlIGZvbGxvd2luZyBoaWVyYXJjaHk6Ci0gKiA8dWw+Ci0gKiA8bGk+bWV0aG9kX3BsdWdpbl8xPC9saT4KLSAqIDx1bD4KLSAqIDxsaT4iQ2FwYWJpbGl0eSBQYXR0ZXJucyIgVUkgZm9sZGVyPC9saT4KLSAqIDx1bD4KLSAqIDxsaT5jYXBhYmlsaXR5X3BhdHRlcm5fMTwvbGk+Ci0gKiA8bGk+Y2FwYWJpbGl0eV9wYXR0ZXJuXzI8L2xpPgotICogPC91bD4KLSAqIDwvbGk+Ci0gKiA8bGk+IkRlbGl2ZXJ5IFByb2Nlc3NlcyIgVUkgZm9sZGVyPC9saT4KLSAqIDx1bD4KLSAqIDxsaT5kZWxpdmVyeV9wcm9jZXNzXzE8L2xpPgotICogPGxpPmRlbGl2ZXJ5X3Byb2Nlc3NfMjwvbGk+Ci0gKiA8L3VsPgotICogPC9saT4KLSAqIDwvdWw+Ci0gKiA8L2xpPgotICogPGxpPm1ldGhvZF9wbHVnaW5fMjwvbGk+Ci0gKiA8dWw+Ci0gKiA8bGk+IkNhcGFiaWxpdHkgUGF0dGVybnMiIFVJIGZvbGRlcjwvbGk+Ci0gKiA8L2xpPgotICogPGxpPiJEZWxpdmVyeSBQcm9jZXNzZXMiIFVJIGZvbGRlcjwvbGk+Ci0gKiA8L2xpPgotICogPC91bD4KLSAqIDwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfUEFUVEVSTlMgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY2FwYWJpbGl0eVBhdHRlcm5fdGV4dF9wbHVyYWw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSVZFUllfUFJPQ0VTU0VTID0gTGlicmFyeVVJUmVzb3VyY2VzLmRlbGl2ZXJ5UHJvY2Vzc190ZXh0X3BsdXJhbDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX0xJU1QgPSBuZXcgT2JqZWN0WzBdOwotCi0JcHJpdmF0ZSBNYXA8TWV0aG9kUGx1Z2luLCBQcm9jZXNzVHJlZVVJRm9sZGVyPiBjYXBhYmlsaXR5UGF0dGVyblVJRm9sZGVycyA9IG5ldyBIYXNoTWFwPE1ldGhvZFBsdWdpbiwgUHJvY2Vzc1RyZWVVSUZvbGRlcj4oKTsKLQotCXByaXZhdGUgTWFwPE1ldGhvZFBsdWdpbiwgUHJvY2Vzc1RyZWVVSUZvbGRlcj4gZGVsaXZlcnlQcm9jZXNzVUlGb2xkZXJzID0gbmV3IEhhc2hNYXA8TWV0aG9kUGx1Z2luLCBQcm9jZXNzVHJlZVVJRm9sZGVyPigpOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlMaXN0PE9iamVjdD4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCUxpc3QgcGx1Z2lucyA9ICgoTWV0aG9kTGlicmFyeSkgcGFyZW50RWxlbWVudCkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQkJTGlzdCBwcm9jZXNzZXMgPSBUbmdVdGlsLmdldEFsbFByb2Nlc3NlcyhwbHVnaW4pOwotCQkJCWlmIChwcm9jZXNzZXMuc2l6ZSgpID4gMCkgewotCQkJCQljaGlsZHJlbi5hZGQocGx1Z2luKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCQl9IGVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBwYXJlbnRFbGVtZW50OwotCi0JCQlQcm9jZXNzVHJlZVVJRm9sZGVyIGNhcGFiaWxpdHlQYXR0ZXJuVUlGb2xkZXIgPSBjYXBhYmlsaXR5UGF0dGVyblVJRm9sZGVycwotCQkJCQkuZ2V0KHBsdWdpbik7Ci0JCQlpZiAoY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlciA9PSBudWxsKSB7Ci0JCQkJY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlciA9IG5ldyBQcm9jZXNzVHJlZVVJRm9sZGVyKAotCQkJCQkJQ0FQQUJJTElUWV9QQVRURVJOUywKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybnMiKSwgcGFyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQljYXBhYmlsaXR5UGF0dGVyblVJRm9sZGVycy5wdXQocGx1Z2luLAotCQkJCQkJY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlcik7Ci0JCQl9Ci0KLQkJCVByb2Nlc3NUcmVlVUlGb2xkZXIgZGVsaXZlcnlQcm9jZXNzVUlGb2xkZXIgPSBkZWxpdmVyeVByb2Nlc3NVSUZvbGRlcnMKLQkJCQkJLmdldChwbHVnaW4pOwotCQkJaWYgKGRlbGl2ZXJ5UHJvY2Vzc1VJRm9sZGVyID09IG51bGwpIHsKLQkJCQlkZWxpdmVyeVByb2Nlc3NVSUZvbGRlciA9IG5ldyBQcm9jZXNzVHJlZVVJRm9sZGVyKAotCQkJCQkJREVMSVZFUllfUFJPQ0VTU0VTLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc2VzIiksIHBhcmVudEVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJZGVsaXZlcnlQcm9jZXNzVUlGb2xkZXJzLnB1dChwbHVnaW4sIGRlbGl2ZXJ5UHJvY2Vzc1VJRm9sZGVyKTsKLQkJCX0KLQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IGNhcGFiaWxpdHlQYXR0ZXJuVUlGb2xkZXIsCi0JCQkJCWRlbGl2ZXJ5UHJvY2Vzc1VJRm9sZGVyIH07Ci0JCX0gZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NUcmVlVUlGb2xkZXIpIHsKLQkJCVByb2Nlc3NUcmVlVUlGb2xkZXIgdWlGb2xkZXIgPSAoUHJvY2Vzc1RyZWVVSUZvbGRlcikgcGFyZW50RWxlbWVudDsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSB1aUZvbGRlci5nZXRQYXJlbnQoKTsKLQkJCWlmICh1aUZvbGRlci5nZXROYW1lKCkgPT0gQ0FQQUJJTElUWV9QQVRURVJOUykgewotCQkJCXJldHVybiBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKHBsdWdpbikKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0RGVsaXZlcnlQcm9jZXNzZXMocGx1Z2luKQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NUcmVlVUlGb2xkZXIpIHsKLQkJCXJldHVybiAoKFByb2Nlc3NUcmVlVUlGb2xkZXIpIGVsZW1lbnQpLmdldFBhcmVudCgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwKLQkJCQkJLmdldE1ldGhvZFBsdWdpbigoQ2FwYWJpbGl0eVBhdHRlcm4pIGVsZW1lbnQpOwotCQkJcmV0dXJuIGNhcGFiaWxpdHlQYXR0ZXJuVUlGb2xkZXJzLmdldChwbHVnaW4pOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsCi0JCQkJCS5nZXRNZXRob2RQbHVnaW4oKERlbGl2ZXJ5UHJvY2VzcykgZWxlbWVudCk7Ci0JCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzVUlGb2xkZXJzLmdldChwbHVnaW4pOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlcnMuY2xlYXIoKTsKLQkJZGVsaXZlcnlQcm9jZXNzVUlGb2xkZXJzLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZWExNjVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFRoZSBsYWJlbCBwcm92aWRlciBmb3IgdGhlIHByb2Nlc3MgdHJlZSB2aWV3ZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1RyZWVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCW5ldyBVbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NUcmVlTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIExhYmVsUHJvdmlkZXIjZ2V0VGV4dChPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NUcmVlVUlGb2xkZXIpIHsKLQkJCXJldHVybiAoKFByb2Nlc3NUcmVlVUlGb2xkZXIpIG9iaikuZ2V0TmFtZSgpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXJldHVybiAoKE1ldGhvZEVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBsYWJlbFByb3ZpZGVyLmdldFRleHQob2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIExhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzVHJlZVVJRm9sZGVyKSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzVHJlZVVJRm9sZGVyKSBvYmopLmdldEltYWdlKCk7Ci0JCX0KLQkJcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlVUlGb2xkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlVUlGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTNlZWUxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZVVJRm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBNb2RlbHMgYSBVSSBmb2xkZXIgaW4gdGhlIHByb2Nlc3MgdHJlZSB2aWV3ZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1RyZWVVSUZvbGRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZSBERUZBVUxUX0lNQUdFID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Gb2xkZXIiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgSW1hZ2UgaW1hZ2U7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1RyZWVVSUZvbGRlcihTdHJpbmcgbmFtZSkgewotCQl0aGlzKG5hbWUsIERFRkFVTFRfSU1BR0UsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIGZvbGRlcgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgb2JqZWN0Ci0JICovCi0JcHVibGljIFByb2Nlc3NUcmVlVUlGb2xkZXIoU3RyaW5nIG5hbWUsIE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcyhuYW1lLCBERUZBVUxUX0lNQUdFLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIGZvbGRlcgotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgYW4gaW1hZ2UgZm9yIHRoZSBmb2xkZXIKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IG9iamVjdAotCSAqLwotCXB1YmxpYyBQcm9jZXNzVHJlZVVJRm9sZGVyKFN0cmluZyBuYW1lLCBJbWFnZSBpbWFnZSwgT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgZm9sZGVyIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGZvciBhIFVJIGZvbGRlcgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudCBvYmplY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgcGFyZW50IG9iamVjdCBmb3IgdGhlIGZvbGRlcgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBhcmVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBvYmplY3QKLQkgKiBAcmV0dXJuIHRoZSBnaXZlbiBwYXJlbnQgb2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvbGRlciBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZVZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmJhMDIzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRGlzcGxheXMgYSB0cmVlIHZpZXcgdGhhdCBhbGxvd3MgYSB1c2VyIHRvIHNlbGVjdCBhIGNhcGFiaWxpdHkgcGF0dGVybiBvcgotICogZGVsaXZlcnkgcHJvY2Vzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzVHJlZVZpZXdlciBleHRlbmRzIFRyZWVWaWV3ZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyBQcm9jZXNzVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCXNldENvbnRlbnRQcm92aWRlcihuZXcgUHJvY2Vzc1RyZWVDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXNldExhYmVsUHJvdmlkZXIobmV3IFByb2Nlc3NUcmVlTGFiZWxQcm92aWRlcigpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NWaWV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOTU0NjJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudmlld3M7Ci0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzVmlldyB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvRGlyZWN0b3J5VmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL0RpcmVjdG9yeVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MGM2NmY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvRGlyZWN0b3J5VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciB2YWxpZGF0aW5nIGFuZCBjcmVhdGluZyBhIGRpcmVjdG9yeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MjE1MwotICovCi1wdWJsaWMgY2xhc3MgRGlyZWN0b3J5VmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyBhbmQgY3JlYXRlcyBhIGdpdmVuIGRpcmVjdG9yeS4KLQkgKiA8cD4KLQkgKiBEaXNwbGF5cyBhbiBlcnJvciBkaWFsb2cgaWYgdGhlIGRpcmVjdG9yeSBwYXRoIGlzIG5vdCB2YWxpZC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICBUaGUgcGF0aCB0byBiZSB2YWxpZGF0ZWQgYW5kIGNyZWF0ZWQuCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgZGlhbG9nIHRpdGxlLgotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBwYXRoIGlzIHZhbGlkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0FuZENyZWF0ZURpcihTdHJpbmcgZGlyLCBTdHJpbmcgdGl0bGUsCi0JCQlTdHJpbmcgZXJyb3JNc2cpIHsKLQkJYm9vbGVhbiBhbnN3ZXIgPSBmYWxzZTsKLQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIpOwotCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJRmlsZVtdIGZpbGVzID0gZmlsZS5saXN0RmlsZXMoKTsKLQkJCWlmIChmaWxlcyAhPSBudWxsICYmIGZpbGVzLmxlbmd0aCA+IDApIHsKLQkJCQlhbnN3ZXIgPSBMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCXRpdGxlLAotCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5kZWxldGVGaWxlc0NvbmZpcm1hdGlvbl9tc2csCi0JCQkJCQkJCQkJCQlkaXIpKTsKLQkJCQlpZiAoYW5zd2VyID09IHRydWUpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWFuc3dlciA9IEZpbGVVdGlsCi0JCQkJCQkJCS5kZWxldGVBbGxGaWxlcyhmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCWlmIChhbnN3ZXIgPT0gZmFsc2UpIHsKLQkJCQkJCQlMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJdGl0bGUsCi0JCQkJCQkJCQkJCWVycm9yTXNnLAotCQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5kZWxldGVGaWxlc0Vycm9yX3JlYXNvbiwKLQkJCQkJCQkJCQkJCQkJCWRpcikpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJdGl0bGUsCi0JCQkJCQkJCQkJZXJyb3JNc2csCi0JCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJCQkJCQlkaXIpLCBlKTsKLQkJCQkJCWFuc3dlciA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlhbnN3ZXIgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotLy8JCQlpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKSB7Ci0vLwkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwKLS8vCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmludmFsaWRQYXRoX21zZyk7Ci0vLwkJCQlhbnN3ZXIgPSBmYWxzZTsKLS8vCQkJfSBlbHNlIHsKLQotCQkJCXRyeSB7Ci0JCQkJCWlmIChmaWxlLm1rZGlycygpID09IGZhbHNlKSB7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQl0aXRsZSwKLQkJCQkJCQkJCQllcnJvck1zZywKLQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuY3JlYXRlUGF0aEVycm9yX3JlYXNvbiwKLQkJCQkJCQkJCQkJCQkJZGlyKSk7Ci0JCQkJCQlhbnN3ZXIgPSBmYWxzZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWFuc3dlciA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQl0aXRsZSwKLQkJCQkJCQllcnJvck1zZywKLQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5jcmVhdGVQYXRoRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJZGlyKSwgZSk7Ci0JCQkJCWFuc3dlciA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLS8vCQl9Ci0KLQkJcmV0dXJuIGFuc3dlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL0xpYnJhcnlCYWNrdXBVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL0xpYnJhcnlCYWNrdXBVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyY2Q2MDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9MaWJyYXJ5QmFja3VwVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGF5b3V0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzLkxpYnJhcnlCYWNrdXBEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBiYWNrIHVwIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5QmFja3VwVXRpbCB7Ci0KLQlwcml2YXRlIFN0cmluZyBwYXRoID0gbnVsbDsKLQotCS8qKgotCSAqIFByb21wdHMgdG8gYmFja3VwIGxpYnJhcnkKLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiBAcGFyYW0gbGliUGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcm9tcHRCYWNrdXBMaWJyYXJ5KFNoZWxsIHNoZWxsLCBGaWxlIGxpYlBhdGgpIHsKLQkJbmV3IExpYnJhcnlCYWNrdXBVdGlsKCkuZG9CYWNrdXAoc2hlbGwsIGxpYlBhdGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkb0JhY2t1cChmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgRmlsZSBsaWJQYXRoKSB7Ci0JCXBhdGggPSBudWxsOwotCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTaGVsbCBzID0gc2hlbGw7Ci0JCQkJaWYgKHMgPT0gbnVsbCkgewotCQkJCQlzID0gTXNnQm94LmdldERlZmF1bHRTaGVsbCgpOwotCQkJCX0KLQotCQkJCWlmIChzID09IG51bGwpIHsKLQkJCQkJcyA9IG5ldyBTaGVsbChNc2dCb3guZ2V0RGlzcGxheSgpKTsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuYmFja3VwTGlicmFyeURpYWxvZ190aXRsZTsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IExpYnJhcnlVSVJlc291cmNlcy5iYWNrdXBMaWJyYXJ5RGlhbG9nX3RleHQ7Ci0JCQkJU3RyaW5nIGJhY2t1cFBhdGggPSBsaWJQYXRoLmdldEFic29sdXRlUGF0aCgpICsgIi5iYWNrdXAiOyAvLyROT04tTkxTLTEkCQotCi0JCQkJTGlicmFyeUJhY2t1cERpYWxvZyBkbGcgPSBuZXcgTGlicmFyeUJhY2t1cERpYWxvZyhzLCB0aXRsZSwKLQkJCQkJCW1lc3NhZ2UsIGJhY2t1cFBhdGgpOwotCi0JCQkJaWYgKGRsZy5vcGVuKCkgPT0gRGlhbG9nLk9LKSB7Ci0JCQkJCXBhdGggPSBkbGcuZ2V0UGF0aCgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJYmFja3VwKGxpYlBhdGgsIG5ldyBGaWxlKHBhdGgpKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQmFjayB1cCBsaWJyYXJ5IAotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gZGVzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBiYWNrdXAoZmluYWwgRmlsZSBzb3VyY2UsIGZpbmFsIEZpbGUgZGVzdCkgewotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQkvLyBleGN1ZGUgdGhlIG5vbi1saWJyYXJ5IGZpbGVzIHRoYXQgbWlnaHQgYmUgbG9ja2VkIGJ5IHJtYy4KLQkJCQkJLy8gdGhlc2UgZmlsZXMgbWF5IGNhdXNlIGJhY2t1cCB0byBmYWlsIGR1ZSB0byBmaWxlIGxvY2suCi0JCQkJCVN0cmluZyBleGNsdWRlcyA9ICIubG9jayI7Ci0JCQkJCUxheW91dFJlc291cmNlcy5jb3B5RGlyKHNvdXJjZSwgZGVzdCwgIioqIiwgZXhjbHVkZXMpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLAotCQkJCUxpYnJhcnlVSVJlc291cmNlcy5iYWNraW5nVXBMaWJyYXJ5VGFza19uYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2FhMDYwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBjbGFzcyBmb3IgYSBOZXcgTWV0aG9kIExpYnJhcnkgd2l6YXJkIHBhZ2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmV3TGlicmFyeVdpemFyZFBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdMaWJyYXJ5V2l6YXJkUGFnZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IHNwZWNpZmljIHVzZXIgc2VsZWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgTWFwIGdldFNlbGVjdGlvbnMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4NWM5OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkRlYnVnVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmludGVybmFsLndpemFyZHMuTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBOZXcgTGlicmFyeSB3aXphcmQgcGFnZXMgZGVmaW5lZCB2aWEgdGhlCi0gKiAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmV3TGlicmFyeVdpemFyZFBhZ2VzIiBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5IHsKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UgPSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUUgPSAibmV3TGlicmFyeVdpemFyZFBhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gSWYgdHJ1ZSwgZGVidWcgdHJhY2luZyBpcyBlbmFibGVkLgotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIE5ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvLyBBIG1hcCBvZiB3aXphcmQgcGFnZSBwcm92aWRlcnMuCi0JcHJpdmF0ZSBNYXAgd2l6YXJkUGFnZVByb3ZpZGVycyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBBIGxpc3Qgb2Ygd2l6YXJkIHBhZ2UgaW5zdGFuY2VzLgotCXByaXZhdGUgTWFwIHdpemFyZFBhZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5LmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5KCkgewotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImluaXQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KAotCQkJCUVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UsIEVYVEVOU0lPTl9QT0lOVF9OQU1FKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyB0eXBlSWQgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgdGl0bGUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgidGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJkZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJpbml0IiwgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQkJCSJjb25maWdFbGVtZW50LCBjbGFzcz0iICsgY2xhc3NOYW1lICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkiLCB0eXBlPSIgKyB0eXBlSWQgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSIsIHRpdGxlPSIgKyB0aXRsZSArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJIiwgZGVzY3JpcHRpb249IiArIGRlc2NyaXB0aW9uKTsgLy8kTk9OLU5MUy0xJAkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCAmJiBjbGFzc05hbWUudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiB0eXBlSWQgIT0gbnVsbCAmJiB0eXBlSWQudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiB0aXRsZSAhPSBudWxsICYmIHRpdGxlLnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkJCQkJJiYgZGVzY3JpcHRpb24gIT0gbnVsbAotCQkJCQkJCQkmJiBkZXNjcmlwdGlvbi50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJaWYgKCF3aXphcmRQYWdlUHJvdmlkZXJzLmNvbnRhaW5zS2V5KHR5cGVJZCkpIHsKLQkJCQkJCQkJTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24gcHJvdmlkZXIgPSBuZXcgTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24oCi0JCQkJCQkJCQkJYnVuZGxlLCBjbGFzc05hbWUsIHR5cGVJZCwgdGl0bGUsCi0JCQkJCQkJCQkJZGVzY3JpcHRpb24pOwotCQkJCQkJCQl3aXphcmRQYWdlUHJvdmlkZXJzLnB1dCh0eXBlSWQsIHByb3ZpZGVyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5OZXdMaWJyYXJ5V2l6YXJkUGFnZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTmV3TGlicmFyeVdpemFyZFBhZ2UgY3JlYXRlV2l6YXJkUGFnZShTdHJpbmcgcGFnZUlkLCBTdHJpbmcgdHlwZUlkKSB7Ci0JCU5ld0xpYnJhcnlXaXphcmRQYWdlIHdpemFyZFBhZ2UgPSAoTmV3TGlicmFyeVdpemFyZFBhZ2UpIHdpemFyZFBhZ2VzCi0JCQkJLmdldCh0eXBlSWQpOwotCQlpZiAod2l6YXJkUGFnZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gd2l6YXJkUGFnZTsKLQkJfQotCi0JCU5ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uIHByb3ZpZGVyID0gKE5ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uKSB3aXphcmRQYWdlUHJvdmlkZXJzCi0JCQkJLmdldCh0eXBlSWQpOwotCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJQnVuZGxlIGJ1bmRsZSA9IHByb3ZpZGVyLmdldEJ1bmRsZSgpOwotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHByb3ZpZGVyLmdldENsYXNzTmFtZSgpOwotCQkJQ2xhc3Mgd2l6YXJkUGFnZUNsYXNzOwotCQkJQ2xhc3NbXSBhcmdDbGFzcyA9IG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzIH07Ci0JCQlPYmplY3RbXSBhcmdWYWx1ZSA9IG5ldyBPYmplY3RbXSB7IHBhZ2VJZCB9OwotCQkJQ29uc3RydWN0b3IgY29uc3RydWN0b3I7Ci0JCQl0cnkgewotCQkJCXdpemFyZFBhZ2VDbGFzcyA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCQljb25zdHJ1Y3RvciA9IHdpemFyZFBhZ2VDbGFzcy5nZXRDb25zdHJ1Y3RvcihhcmdDbGFzcyk7Ci0JCQkJd2l6YXJkUGFnZSA9IChOZXdMaWJyYXJ5V2l6YXJkUGFnZSkgY29uc3RydWN0b3IKLQkJCQkJCS5uZXdJbnN0YW5jZShhcmdWYWx1ZSk7Ci0JCQkJd2l6YXJkUGFnZS5zZXRUaXRsZShwcm92aWRlci5nZXRUaXRsZSgpKTsKLQkJCQl3aXphcmRQYWdlLnNldERlc2NyaXB0aW9uKHByb3ZpZGVyLmdldERlc2NyaXB0aW9uKCkpOwotCQkJCXdpemFyZFBhZ2VzLnB1dCh0eXBlSWQsIHdpemFyZFBhZ2UpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB3aXphcmRQYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb3IgY2FjaGVkIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5OZXdMaWJyYXJ5V2l6YXJkUGFnZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIE5ld0xpYnJhcnlXaXphcmRQYWdlIGdldFdpemFyZFBhZ2UoU3RyaW5nIHR5cGVJZCkgewotCQlyZXR1cm4gKE5ld0xpYnJhcnlXaXphcmRQYWdlKSB3aXphcmRQYWdlcy5nZXQodHlwZUlkKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlNYWluUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9PcGVuTGlicmFyeU1haW5QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhMDEyM2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9PcGVuTGlicmFyeU1haW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIHBhdGggdG8gb3BlbiBhIG1ldGhvZAotICogbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTGlicmFyeU1haW5QYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBwYWdlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gT3BlbkxpYnJhcnlNYWluUGFnZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0lEID0gInR5cGVJZCI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCi0JcHJpdmF0ZSBDb21ibyBsaWJyYXJ5UGF0aENvbWJvOwotCi0JcHJpdmF0ZSBCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGlicmFyeVR5cGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBPcGVuTGlicmFyeU1haW5QYWdlKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlNYWluV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vT3Blbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIExpYnJhcnlVSVJlc291cmNlcy5wYXRoTGFiZWxfdGV4dCk7Ci0KLQkJbGlicmFyeVBhdGhDb21ibyA9IGNyZWF0ZUNvbWJvYm94KGNvbXBvc2l0ZSk7Ci0KLQkJYnJvd3NlQnV0dG9uID0gY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwKLQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQpOwotCi0JCWluaXRDb250cm9scygpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMgd2l0aCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250cm9scygpIHsKLQkJU3RyaW5nW10gb3BlbkxpYnJhcnlQYXRocyA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldE9wZW5MaWJyYXJ5UGF0aHMoKTsKLQkJbGlicmFyeVBhdGhDb21iby5zZXRJdGVtcyhvcGVuTGlicmFyeVBhdGhzKTsKLQkJaWYgKG9wZW5MaWJyYXJ5UGF0aHMubGVuZ3RoID4gMCkgewotCQkJbGlicmFyeVBhdGhDb21iby5zZXRUZXh0KG9wZW5MaWJyYXJ5UGF0aHNbMF0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJbGlicmFyeVBhdGhDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQotCQlsaWJyYXJ5UGF0aENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoZ2V0TGlicmFyeVBhdGgoKSk7Ci0JCQkJU3RyaW5nIHNlbGVjdGVkRGlyID0gZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoc2VsZWN0ZWREaXIgIT0gbnVsbCkgewotCQkJCQlsaWJyYXJ5UGF0aENvbWJvLmFkZChzZWxlY3RlZERpciwgMCk7Ci0JCQkJCWxpYnJhcnlQYXRoQ29tYm8uc2V0VGV4dChzZWxlY3RlZERpcik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGdldExpYnJhcnlOYW1lKCkubGVuZ3RoKCkgPiAwOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpYnJhcnkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlOYW1lKCkgewotCQlTdHJpbmcgbGliUGF0aCA9IGdldExpYnJhcnlQYXRoKCk7Ci0JCVN0cmluZyBsaWJOYW1lID0gbmV3IEZpbGUobGliUGF0aCkuZ2V0TmFtZSgpOwotCQlpZiAoIWxpYlBhdGguZXF1YWxzKGxpYk5hbWUpKSB7Ci0JCQlyZXR1cm4gbGliTmFtZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgbGlicmFyeSBwYXRoLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVBhdGgoKSB7Ci0JCXJldHVybiBsaWJyYXJ5UGF0aENvbWJvLmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgbWV0aG9kIGxpYnJhcnkgdHlwZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlUeXBlKCkgewotCQlyZXR1cm4gbGlicmFyeVR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5TWFpblBhZ2UyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5TWFpblBhZ2UyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiZWNjNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9PcGVuTGlicmFyeU1haW5QYWdlMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuUmVjZW50bHlPcGVuZWRMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIGVudGVyIHRoZSBuYW1lLCBicmllZiBkZXNjcmlwdGlvbiBhbmQKLSAqIHR5cGUgZm9yIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIE9wZW5MaWJyYXJ5TWFpblBhZ2UyIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBwYWdlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gT3BlbkxpYnJhcnlNYWluUGFnZTIuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9JRCA9ICJ0eXBlSWQiOyAvLyROT04tTkxTLTEkCQotCi0JcHJvdGVjdGVkIENvbWJvIG5hbWVDb21ibzsKLQotCXByb3RlY3RlZCBUZXh0IHVyaVRleHQ7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIG9wZW5Vbmxpc3RlZExpYnJhcnlDaGVja2JveDsKLQotCXByb3RlY3RlZCBib29sZWFuIG9wZW5Vbmxpc3RlZExpYnJhcnkgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBCdXR0b25bXSByYWRpb0J1dHRvbnM7Ci0KLQlwcm90ZWN0ZWQgTWFwIHJlY2VudGx5T3BlbmVkTGlicmFyaWVzID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE9wZW5MaWJyYXJ5TWFpblBhZ2UyKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlNYWluV2l6YXJkUGFnZV90aXRsZV8yKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9PcGVuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQlMYWJlbCBuYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9STUFMKTsKLQkJbmFtZUxhYmVsLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLm5hbWVMYWJlbF90ZXh0KTsKLQotCQluYW1lQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCW5hbWVDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkvLyBTZXQgdGhlIGNvbmZpZ3VyYXRpb24gbGlzdC4KLQkJTGlzdCBsaWJyYXJ5TGlzdCA9IGdldFJlY2VudGx5T3BlbmVkTGlicmFyaWVzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBsaWJyYXJ5TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlSZWNlbnRseU9wZW5lZExpYnJhcnkgbGlicmFyeSA9IChSZWNlbnRseU9wZW5lZExpYnJhcnkpIGl0Lm5leHQoKTsKLQkJCXJlY2VudGx5T3BlbmVkTGlicmFyaWVzLnB1dChsaWJyYXJ5LmdldE5hbWUoKSwgbGlicmFyeSk7Ci0JCX0KLQkJU3RyaW5nW10gbGlicmFyeU5hbWVzID0gbmV3IFN0cmluZ1tyZWNlbnRseU9wZW5lZExpYnJhcmllcy5zaXplKCldOwotCQlyZWNlbnRseU9wZW5lZExpYnJhcmllcy5rZXlTZXQoKS50b0FycmF5KGxpYnJhcnlOYW1lcyk7Ci0JCW5hbWVDb21iby5zZXRJdGVtcyhsaWJyYXJ5TmFtZXMpOwotCi0JCUxhYmVsIHVyaUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PUk1BTCk7Ci0JCXVyaUxhYmVsLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLnVyaUxhYmVsX3RleHQpOwotCi0JCXVyaVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl1cmlUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl1cmlUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQotCQlvcGVuVW5saXN0ZWRMaWJyYXJ5Q2hlY2tib3ggPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94Ci0JCQkJLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5Vbmxpc3RlZExpYnJhcnlDaGVja2JveF90ZXh0KTsKLQkJb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkoKEdyaWREYXRhKSBvcGVuVW5saXN0ZWRMaWJyYXJ5Q2hlY2tib3guZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJTGFiZWwgbGlicmFyeVR5cGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT1JNQUwpOwotCQlsaWJyYXJ5VHlwZUxhYmVsLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLmxpYnJhcnlUeXBlTGFiZWxfdGV4dCk7Ci0KLQkJQ29tcG9zaXRlIHR5cGVDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PUk1BTCk7Ci0JCXR5cGVDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCXR5cGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTWFwIHR5cGVzID0gTGlicmFyeU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0TGlicmFyeVR5cGVzKCk7Ci0JCXJhZGlvQnV0dG9ucyA9IG5ldyBCdXR0b25bdHlwZXMuc2l6ZSgpXTsKLQkJaW50IHJhZGlvQnV0dG9uSW5kZXggPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdHlwZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHR5cGVJZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyB0eXBlTmFtZSA9IChTdHJpbmcpIHR5cGVzLmdldCh0eXBlSWQpOwotCQkJQnV0dG9uIHJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbih0eXBlQ29tcG9zaXRlLCBTV1QuUkFESU8pOwotCQkJcmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlyYWRpb0J1dHRvbi5zZXRUZXh0KHR5cGVOYW1lKTsKLQkJCXJhZGlvQnV0dG9uLnNldERhdGEoVFlQRV9JRCwgdHlwZUlkKTsKLQkJCXJhZGlvQnV0dG9uc1tyYWRpb0J1dHRvbkluZGV4KytdID0gcmFkaW9CdXR0b247Ci0JCX0KLQotCQlpZiAocmFkaW9CdXR0b25zLmxlbmd0aCA+IDApIHsKLQkJCXJhZGlvQnV0dG9uc1swXS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJT3BlbkxpYnJhcnlXaXphcmRQYWdlIHdpemFyZFBhZ2UgPSBPcGVuTGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5Ci0JCQkJLmdldEluc3RhbmNlKCkuZ2V0V2l6YXJkUGFnZShnZXRMaWJyYXJ5VHlwZSgpKTsKLQkJaWYgKHdpemFyZFBhZ2UgIT0gbnVsbCkgewotCQkJd2l6YXJkUGFnZS5vbkVudGVyUGFnZShnZXRMaWJyYXJ5TmFtZSgpKTsKLQkJfQotCQlpZiAoIW9wZW5Vbmxpc3RlZExpYnJhcnkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB3aXphcmRQYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlyZXR1cm4gZ2V0TGlicmFyeU5hbWUoKS5sZW5ndGgoKSA+IDAgfHwgb3BlblVubGlzdGVkTGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGxpc3RlbmVycyB0byB0aGUgd2l6YXJkIGNvbnRyb2xzLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCW5hbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCX0pOwotCi0JCW9wZW5Vbmxpc3RlZExpYnJhcnlDaGVja2JveAotCQkJCS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJCW9wZW5Vbmxpc3RlZExpYnJhcnkgPSBvcGVuVW5saXN0ZWRMaWJyYXJ5Q2hlY2tib3gKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzZWxlY3RlZCBtZXRob2QgbGlicmFyeSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoKSB7Ci0JCXJldHVybiBuYW1lQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBVUkkgb2YgdGhlIHVzZXIgc2VsZWN0ZWQgbWV0aG9kIGxpYnJhcnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5VVJJKCkgewotCQlSZWNlbnRseU9wZW5lZExpYnJhcnkgbGlicmFyeSA9IChSZWNlbnRseU9wZW5lZExpYnJhcnkpIHJlY2VudGx5T3BlbmVkTGlicmFyaWVzCi0JCQkJLmdldChnZXRMaWJyYXJ5TmFtZSgpKTsKLQkJcmV0dXJuIGxpYnJhcnkuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXRoIG9mIHRoZSB1c2VyIHNlbGVjdGVkIG1ldGhvZCBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVBhdGgoKSB7Ci0JCVJlY2VudGx5T3BlbmVkTGlicmFyeSBsaWJyYXJ5ID0gKFJlY2VudGx5T3BlbmVkTGlicmFyeSkgcmVjZW50bHlPcGVuZWRMaWJyYXJpZXMKLQkJCQkuZ2V0KGdldExpYnJhcnlOYW1lKCkpOwotCQlyZXR1cm4gbGlicmFyeS5nZXRQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgb3BlbiB1bmxpc3RlZCBtZXRob2QgbGlicnJheSBvcHRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPcGVuVW5saXN0ZWRMaWJyYXJ5KCkgewotCQlyZXR1cm4gb3BlblVubGlzdGVkTGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1c2VyIHNlbGVjdGVkIG1ldGhvZCBsaWJyYXJ5IHR5cGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5VHlwZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByYWRpb0J1dHRvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUJ1dHRvbiByYWRpb0J1dHRvbiA9IHJhZGlvQnV0dG9uc1tpXTsKLQkJCWlmIChyYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCXJldHVybiAoU3RyaW5nKSByYWRpb0J1dHRvbi5nZXREYXRhKFRZUEVfSUQpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoU3RyaW5nKSByYWRpb0J1dHRvbnNbMF0uZ2V0RGF0YShUWVBFX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgbGlzdCBvZiByZWNlbnRseSBvcGVuZWQgbWV0aG9kIGxpYnJhcmllcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiA8Y29kZT5SZWNlbnRseU9wZW5lZExpYnJhcnk8L2NvZGU+IG9iamVjdHMKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExpc3QgZ2V0UmVjZW50bHlPcGVuZWRMaWJyYXJpZXMoKSB7Ci0JCUxpc3QgbGlicmFyeVVSSXMgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRPcGVuTGlicmFyeVVSSXNMaXN0KCk7Ci0JCUxpc3QgbGlicmFyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAobGlicmFyeVVSSXMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGxpYnJhcnlVUklzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgbGlicmFyeVVSSSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQlsaWJyYXJpZXMuYWRkKG5ldyBSZWNlbnRseU9wZW5lZExpYnJhcnkobGlicmFyeVVSSSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaWJyYXJpZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1M2E3ZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEEgd2l6YXJkIHRoYXQgZ3VpZGVzIHRoZSB1c2VyIHRvIG9wZW4gYSBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTGlicmFyeVdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfSUQgPSBPcGVuTGlicmFyeVdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvLyBUaGUgbWFpbiB3aXphcmQgcGFnZS4KLQlwcml2YXRlIE9wZW5MaWJyYXJ5TWFpblBhZ2UgbWFpblBhZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBPcGVuTGlicmFyeVdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldFdpbmRvd1RpdGxlKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJbWFpblBhZ2UgPSBjcmVhdGVNYWluUGFnZSgpOwotCQlhZGRQYWdlKG1haW5QYWdlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3BlbkxpYnJhcnlNYWluUGFnZSBjcmVhdGVNYWluUGFnZSgpIHsKLQkJcmV0dXJuIG5ldyBPcGVuTGlicmFyeU1haW5QYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkiZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlyZXR1cm4gb3Blbk1ldGhvZExpYnJhcnkobWFpblBhZ2UuZ2V0TGlicmFyeVBhdGgoKSwgbWFpblBhZ2UuZ2V0TGlicmFyeVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuTWV0aG9kTGlicmFyeShTdHJpbmcgcGF0aCwgU3RyaW5nIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCU1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJCUZpbGUgbGlicmFyeVBhdGggPSBuZXcgRmlsZShwYXRoKTsKLQkJCW9wdGlvbnMucHV0KFhNSUxpYnJhcnlNYW5hZ2VyLkFSR19MSUJSQVJZX1BBVEgsIGxpYnJhcnlQYXRoCi0JCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLQkJCWlmIChYTUlMaWJyYXJ5VXRpbC5pc1ZhbGlkTGlicmFyeShwYXRoLCB0cnVlKSA9PSBTdGF0dXMuT0tfU1RBVFVTKSB7Ci0JCQkJaWYgKFhNSUxpYnJhcnlVdGlsLmlzTWV0aG9kTGlicmFyeUxvY2tlZChwYXRoKSkgewotCQkJCQlpZiAoTGlicmFyeVVJTWFuYWdlci5kaXNwbGF5TGlicmFyeUxvY2tlZE1lc3NhZ2UoKSAhPSAwKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoIWhhbmRsZVRvb2xWZXJzaW9uKHBhdGgsIG51bGwpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKExpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5vcGVuTGlicmFyeShwYXRoKSkgewotCQkJCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5hZGRPcGVuTGlicmFyeVBhdGgobGlicmFyeVBhdGgKLQkJCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKFhNSUxpYnJhcnlVdGlsCi0JCQkJCS5jb250YWluc1BsdWdpbk9yQ29uZmlnU3BlY0V4cG9ydEZpbGUocGF0aCkpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX3JlYXNvbjQpOwotCQkJfSBlbHNlIHsKLQkJCQlNc2dEaWFsb2cgbXNnRGlhbG9nID0gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpOwotCQkJCWJvb2xlYW4gcmMgPSBtc2dEaWFsb2cKLQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQkJCU5MUwotCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dCwKLQkJCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IHBhdGggfSkpOwotCQkJCWlmICghcmMpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAoTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUxpYnJhcnkocGF0aCkpIHsKLQkJCQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuYWRkT3BlbkxpYnJhcnlQYXRoKGxpYnJhcnlQYXRoCi0JCQkJCQkJLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyByZWFzb24gPSBlLmdldE1lc3NhZ2UoKTsKLQkJCWlmIChyZWFzb24gPT0gbnVsbCkgewotCQkJCXJlYXNvbiA9IExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUludGVybmxFcnJvcl9yZWFzb247Ci0JCQl9Ci0JCQlyZWFzb24gKz0gIlxuXG4iICsgTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfYWR2aWNlOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfbXNnLCByZWFzb24pOwotCQkJfSBlbHNlIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX21zZywgcmVhc29uLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgYW5kIGhhbmRsZSB0b29sIHZlcnNpb24gZGlmZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFuZGxlVG9vbFZlcnNpb24oU3RyaW5nIHBhdGgsCi0JCQlVcGdyYWRlQ2FsbGVySW5mbyBjYWxsZXJJbmZvKSB7Ci0JCVN0cmluZyBsaWJYbWkgPSBYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1hNSTsKLQkJaWYgKGNhbGxlckluZm8gIT0gbnVsbCAmJiBjYWxsZXJJbmZvLmdldElzRXhwb3J0ZWRQbHVnaW5MaWIoKSkgewotCQkJbGliWG1pID0gWE1JTGlicmFyeU1hbmFnZXIuZXhwb3J0RmlsZTsKLQkJfQotCQlWZXJzaW9uVXRpbC5WZXJzaW9uQ2hlY2tJbmZvIGluZm8gPSBWZXJzaW9uVXRpbAotCQkJCS5jaGVja0xpYnJhcnlWZXJzaW9uKG5ldyBGaWxlKHBhdGgsIGxpYlhtaSkpOwotCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8ucmVzdWx0ID4gMCkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGluZm8udG9vbElELmVxdWFscyhWZXJzaW9uVXRpbC5nZXRQcmltYXJ5VG9vbElEKCkpKSB7Ci0JCQkJbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0LAotCQkJCQkJbmV3IE9iamVjdFtdIHsgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKSwKLQkJCQkJCQkJaW5mby50b29sVmVyc2lvbiB9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0X3Vua25vd24sCi0JCQkJCQluZXcgT2JqZWN0W10geyBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpIH0pOwotCQkJfQotCQkJaWYgKCFpc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pKSB7Ci0JCQkJY2FsbGVySW5mby5zZXRFcnJvck1zZyhtZXNzYWdlKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLCBtZXNzYWdlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoWE1JTGlicmFyeVV0aWwuaXNNZXRob2RMaWJyYXJ5VXBncmFkZVJlcXVpcmVkKHBhdGgsIGxpYlhtaSkpIHsKLQkJCWlmIChpc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pCi0JCQkJCSYmICFMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMudXBncmFkZUxpYnJhcnlEaWFsb2dfdGV4dCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoIWlzVXBncmFkZUxpYnJhcnkoY2FsbGVySW5mbykpIHsKLQkJCQljYWxsZXJJbmZvLmNvcHlMaWJyYXJ5KCk7Ci0JCQkJaWYgKGNhbGxlckluZm8uZ2V0Q29waWVkTGliRmlsZSgpICE9IG51bGwpIHsKLQkJCQkJcGF0aCA9IGNhbGxlckluZm8uZ2V0Q29waWVkTGliRmlsZSgpLmdldFBhcmVudEZpbGUoKQotCQkJCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIUxpYnJhcnlVSU1hbmFnZXIudXBncmFkZUxpYnJhcnkocGF0aCwgY2FsbGVySW5mbykpIHsKLQkJCQlpZiAoY2FsbGVySW5mbyAhPSBudWxsKSB7Ci0JCQkJCS8vIGNhbGxlckluZm8uc2V0RXJyb3JNc2coInVwZ3JhZGVMaWJyYXJ5IEZhaWxlZCEiKTsgLy9uZWVkCi0JCQkJCS8vIG5ldyByZXNvdXJjZSBzdHJpbmcKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VwZ3JhZGVMaWJyYXJ5KFVwZ3JhZGVDYWxsZXJJbmZvIGNhbGxlckluZm8pIHsKLQkJcmV0dXJuIFVwZ3JhZGVDYWxsZXJJbmZvLmlzVXBncmFkZUxpYnJhcnkoY2FsbGVySW5mbyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkMi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWM1YTU2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVwZ3JhZGVDYWxsZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBBIHdpemFyZCB0aGF0IGd1aWRlcyB0aGUgdXNlciB0byBvcGVuIGEgbWV0aG9kIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgT3BlbkxpYnJhcnlXaXphcmQyIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9JRCA9IE9wZW5MaWJyYXJ5V2l6YXJkMi5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvLyBUaGUgbWFpbiB3aXphcmQgcGFnZS4KLQlwcml2YXRlIE9wZW5MaWJyYXJ5TWFpblBhZ2UyIG1haW5QYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgT3BlbkxpYnJhcnlXaXphcmQyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2V0V2luZG93VGl0bGUoTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQltYWluUGFnZSA9IG5ldyBPcGVuTGlicmFyeU1haW5QYWdlMigpOwotCQlhZGRQYWdlKG1haW5QYWdlKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gTGlicmFyeU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0TGlicmFyeVR5cGVzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHBlcnNpc3RlbmNlSWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgcGFnZUlkID0gcGVyc2lzdGVuY2VJZCArICJQYWdlIjsgLy8kTk9OLU5MUy0xJAotCQkJT3BlbkxpYnJhcnlXaXphcmRQYWdlIHBhZ2UgPSBPcGVuTGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5Ci0JCQkJCS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVdpemFyZFBhZ2UocGFnZUlkLCBwZXJzaXN0ZW5jZUlkKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlwYWdlLnNldEltYWdlRGVzY3JpcHRvcihMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL3dpemJhbi9PcGVuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAkJCQkJCi0JCQkJYWRkUGFnZShwYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCQkJImZ1bGwvb2JqMTYvTWV0aG9kTGlicmFyeS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCWlmIChtYWluUGFnZS5pc1BhZ2VDb21wbGV0ZSgpICYmICFtYWluUGFnZS5pc09wZW5Vbmxpc3RlZExpYnJhcnkoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJSVdpemFyZFBhZ2VbXSBwYWdlcyA9IGdldFBhZ2VzKCk7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghcGFnZXNbaV0uaXNQYWdlQ29tcGxldGUoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKSAhPSBtYWluUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJU3RyaW5nIHR5cGUgPSBtYWluUGFnZS5nZXRMaWJyYXJ5VHlwZSgpOwotCQlPcGVuTGlicmFyeVdpemFyZFBhZ2UgcGFnZSA9IE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRXaXphcmRQYWdlKHR5cGUpOwotCQl0cnkgewotCQkJU3RyaW5nIHBhdGggPSBudWxsOwotCQkJaWYgKG1haW5QYWdlLmlzT3BlblVubGlzdGVkTGlicmFyeSgpKSB7Ci0JCQkJTWFwIG9wdGlvbnMgPSBwYWdlLmdldFNlbGVjdGlvbnMoKTsKLQkJCQlwYXRoID0gKFN0cmluZykgb3B0aW9ucy5nZXQoWE1JTGlicmFyeU1hbmFnZXIuQVJHX0xJQlJBUllfUEFUSCk7Ci0JCQl9IGVsc2UgewotCQkJCXBhdGggPSBtYWluUGFnZS5nZXRMaWJyYXJ5UGF0aCgpOwotCQkJfQotCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCWlmIChYTUlMaWJyYXJ5VXRpbC5pc1ZhbGlkTGlicmFyeShwYXRoLCB0cnVlKSA9PSBTdGF0dXMuT0tfU1RBVFVTKSB7Ci0JCQkJCWlmIChYTUlMaWJyYXJ5VXRpbC5pc01ldGhvZExpYnJhcnlMb2NrZWQocGF0aCkpIHsKLQkJCQkJCWlmIChMaWJyYXJ5VUlNYW5hZ2VyLmRpc3BsYXlMaWJyYXJ5TG9ja2VkTWVzc2FnZSgpICE9IDApCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCWlmICghaGFuZGxlVG9vbFZlcnNpb24ocGF0aCwgbnVsbCkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQlpZiAoTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLm9wZW5MaWJyYXJ5KHBhdGgpKSB7Ci0JCQkJCQlhZGRSZWNlbnRseU9wZW5lZExpYnJhcnkoKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChYTUlMaWJyYXJ5VXRpbAotCQkJCQkJLmNvbnRhaW5zUGx1Z2luT3JDb25maWdTcGVjRXhwb3J0RmlsZShwYXRoKSkgewotCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKAotCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX3JlYXNvbjQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCU1zZ0RpYWxvZyBtc2dEaWFsb2cgPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpOwotCQkJCQlib29sZWFuIHJjID0gbXNnRGlhbG9nCi0JCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQkJCQlOTFMKLQkJCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dCwKLQkJCQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyBwYXRoIH0pKTsKLQkJCQkJaWYgKCFyYykKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJaWYgKExpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVMaWJyYXJ5KHBhdGgpKSB7Ci0JCQkJCQlhZGRSZWNlbnRseU9wZW5lZExpYnJhcnkoKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQlpZiAocmVhc29uID09IG51bGwpIHsKLQkJCQlyZWFzb24gPSBMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlJbnRlcm5sRXJyb3JfcmVhc29uOwotCQkJfQotCQkJcmVhc29uICs9ICJcblxuIiArIExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX2FkdmljZTsKLQkJCWlmIChlLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlFcnJvcl9tc2csIHJlYXNvbik7Ci0JCQl9IGVsc2UgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfbXNnLCByZWFzb24sIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBuZXdseSBvcGVuZWQgb3IgY3JlYXRlZCBtZXRob2QgbGlicmFyeSB0byB0aGUgcmVjZW50bHkgb3BlbmVkCi0JICogbWV0aG9kIGxpYnJhcmllcyBwcmVmZXJlbmNlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlY2VudGx5T3BlbmVkTGlicmFyeSgpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbGlicmFyeVVSSSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0TGlicmFyeU1hbmFnZXIoCi0JCQkJCWxpYnJhcnkpLmdldE1ldGhvZExpYnJhcnlVUkkoKS50b1N0cmluZygpOwotCQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuYWRkT3BlbkxpYnJhcnlVUkkobGlicmFyeVVSSSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBhbmQgaGFuZGxlIHRvb2wgdmVyc2lvbiBkaWZmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYW5kbGVUb29sVmVyc2lvbihTdHJpbmcgcGF0aCwKLQkJCVVwZ3JhZGVDYWxsZXJJbmZvIGNhbGxlckluZm8pIHsKLQkJU3RyaW5nIGxpYlhtaSA9IFhNSUxpYnJhcnlNYW5hZ2VyLkxJQlJBUllfWE1JOwotCQlpZiAoY2FsbGVySW5mbyAhPSBudWxsICYmIGNhbGxlckluZm8uZ2V0SXNFeHBvcnRlZFBsdWdpbkxpYigpKSB7Ci0JCQlsaWJYbWkgPSBYTUlMaWJyYXJ5TWFuYWdlci5leHBvcnRGaWxlOwotCQl9Ci0JCVZlcnNpb25VdGlsLlZlcnNpb25DaGVja0luZm8gaW5mbyA9IFZlcnNpb25VdGlsCi0JCQkJLmNoZWNrTGlicmFyeVZlcnNpb24obmV3IEZpbGUocGF0aCwgbGliWG1pKSk7Ci0JCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby5yZXN1bHQgPiAwKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW5mby50b29sSUQuZXF1YWxzKFZlcnNpb25VdGlsLmdldFByaW1hcnlUb29sSUQoKSkpIHsKLQkJCQltZXNzYWdlID0gTkxTLmJpbmQoCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHQsCi0JCQkJCQluZXcgT2JqZWN0W10geyBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpLAotCQkJCQkJCQlpbmZvLnRvb2xWZXJzaW9uIH0pOwotCQkJfSBlbHNlIHsKLQkJCQltZXNzYWdlID0gTkxTLmJpbmQoCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHRfdW5rbm93biwKLQkJCQkJCW5ldyBPYmplY3RbXSB7IFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCkgfSk7Ci0JCQl9Ci0JCQlpZiAoIWlzVXBncmFkZUxpYnJhcnkoY2FsbGVySW5mbykpIHsKLQkJCQljYWxsZXJJbmZvLnNldEVycm9yTXNnKG1lc3NhZ2UpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsIG1lc3NhZ2UpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChYTUlMaWJyYXJ5VXRpbC5pc01ldGhvZExpYnJhcnlVcGdyYWRlUmVxdWlyZWQocGF0aCwgbGliWG1pKSkgewotCQkJaWYgKGlzVXBncmFkZUxpYnJhcnkoY2FsbGVySW5mbykKLQkJCQkJJiYgIUxpYnJhcnlVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy51cGdyYWRlTGlicmFyeURpYWxvZ190ZXh0KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmICghaXNVcGdyYWRlTGlicmFyeShjYWxsZXJJbmZvKSkgewotCQkJCWNhbGxlckluZm8uY29weUxpYnJhcnkoKTsKLQkJCQlpZiAoY2FsbGVySW5mby5nZXRDb3BpZWRMaWJGaWxlKCkgIT0gbnVsbCkgewotCQkJCQlwYXRoID0gY2FsbGVySW5mby5nZXRDb3BpZWRMaWJGaWxlKCkuZ2V0UGFyZW50RmlsZSgpCi0JCQkJCQkJLmdldEFic29sdXRlUGF0aCgpOwotCQkJCX0KLQkJCX0KLQkJCWlmICghTGlicmFyeVVJTWFuYWdlci51cGdyYWRlTGlicmFyeShwYXRoLCBjYWxsZXJJbmZvKSkgewotCQkJCWlmIChjYWxsZXJJbmZvICE9IG51bGwpIHsKLQkJCQkJLy8gY2FsbGVySW5mby5zZXRFcnJvck1zZygidXBncmFkZUxpYnJhcnkgRmFpbGVkISIpOyAvL25lZWQKLQkJCQkJLy8gbmV3IHJlc291cmNlIHN0cmluZwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVXBncmFkZUxpYnJhcnkoVXBncmFkZUNhbGxlckluZm8gY2FsbGVySW5mbykgewotCQlyZXR1cm4gVXBncmFkZUNhbGxlckluZm8uaXNVcGdyYWRlTGlicmFyeShjYWxsZXJJbmZvKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYmEyOTAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBjbGFzcyBmb3IgYSBPcGVuIE1ldGhvZCBMaWJyYXJ5IHdpemFyZCBwYWdlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IHNwZWNpZmljIHVzZXIgc2VsZWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgTWFwIGdldFNlbGVjdGlvbnMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDU4N2RiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5pbnRlcm5hbC53aXphcmRzLk9wZW5MaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIE9wZW4gTGlicmFyeSB3aXphcmQgcGFnZXMgZGVmaW5lZCB2aWEgdGhlCi0gKiAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkub3BlbkxpYnJhcnlXaXphcmRQYWdlcyIgZXh0ZW5zaW9uIHBvaW50LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRSA9ICJvcGVuTGlicmFyeVdpemFyZFBhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBPcGVuTGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5IGluc3RhbmNlID0gbmV3IE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkoKTsKLQotCS8vIEEgbWFwIG9mIHdpemFyZCBwYWdlIHByb3ZpZGVycy4KLQlwcml2YXRlIE1hcCB3aXphcmRQYWdlUHJvdmlkZXJzID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIEEgbGlzdCBvZiB3aXphcmQgcGFnZSBpbnN0YW5jZXMuCi0JcHJpdmF0ZSBNYXAgd2l6YXJkUGFnZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcGVuTGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5KCkgewotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQlFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFLCBFWFRFTlNJT05fUE9JTlRfTkFNRSk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgdHlwZUlkID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3RyaW5nIHRpdGxlID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoInRpdGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAkJCQkJCQotCQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsICYmIGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIHR5cGVJZCAhPSBudWxsICYmIHR5cGVJZC50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIHRpdGxlICE9IG51bGwgJiYgdGl0bGUudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiBkZXNjcmlwdGlvbiAhPSBudWxsCi0JCQkJCQkJCSYmIGRlc2NyaXB0aW9uLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlpZiAoIXdpemFyZFBhZ2VQcm92aWRlcnMuY29udGFpbnNLZXkodHlwZUlkKSkgewotCQkJCQkJCQlPcGVuTGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24gcHJvdmlkZXIgPSBuZXcgT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uKAotCQkJCQkJCQkJCWJ1bmRsZSwgY2xhc3NOYW1lLCB0eXBlSWQsIHRpdGxlLAotCQkJCQkJCQkJCWRlc2NyaXB0aW9uKTsKLQkJCQkJCQkJd2l6YXJkUGFnZVByb3ZpZGVycy5wdXQodHlwZUlkLCBwcm92aWRlcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+T3BlbkxpYnJhcnlXaXphcmRQYWdlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBPcGVuTGlicmFyeVdpemFyZFBhZ2UgY3JlYXRlV2l6YXJkUGFnZShTdHJpbmcgcGFnZUlkLCBTdHJpbmcgdHlwZUlkKSB7Ci0JCU9wZW5MaWJyYXJ5V2l6YXJkUGFnZSB3aXphcmRQYWdlID0gKE9wZW5MaWJyYXJ5V2l6YXJkUGFnZSkgd2l6YXJkUGFnZXMKLQkJCQkuZ2V0KHR5cGVJZCk7Ci0JCWlmICh3aXphcmRQYWdlICE9IG51bGwpIHsKLQkJCXJldHVybiB3aXphcmRQYWdlOwotCQl9Ci0KLQkJT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uIHByb3ZpZGVyID0gKE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbikgd2l6YXJkUGFnZVByb3ZpZGVycwotCQkJCS5nZXQodHlwZUlkKTsKLQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCUJ1bmRsZSBidW5kbGUgPSBwcm92aWRlci5nZXRCdW5kbGUoKTsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBwcm92aWRlci5nZXRDbGFzc05hbWUoKTsKLQkJCUNsYXNzIHdpemFyZFBhZ2VDbGFzczsKLQkJCUNsYXNzW10gYXJnQ2xhc3MgPSBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcyB9OwotCQkJT2JqZWN0W10gYXJnVmFsdWUgPSBuZXcgT2JqZWN0W10geyBwYWdlSWQgfTsKLQkJCUNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yOwotCQkJdHJ5IHsKLQkJCQl3aXphcmRQYWdlQ2xhc3MgPSBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JCQkJY29uc3RydWN0b3IgPSB3aXphcmRQYWdlQ2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJnQ2xhc3MpOwotCQkJCXdpemFyZFBhZ2UgPSAoT3BlbkxpYnJhcnlXaXphcmRQYWdlKSBjb25zdHJ1Y3RvcgotCQkJCQkJLm5ld0luc3RhbmNlKGFyZ1ZhbHVlKTsKLQkJCQl3aXphcmRQYWdlLnNldFRpdGxlKHByb3ZpZGVyLmdldFRpdGxlKCkpOwotCQkJCXdpemFyZFBhZ2Uuc2V0RGVzY3JpcHRpb24ocHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkJd2l6YXJkUGFnZXMucHV0KHR5cGVJZCwgd2l6YXJkUGFnZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdpemFyZFBhZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvciBjYWNoZWQgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPk5ld0xpYnJhcnlXaXphcmRQYWdlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgT3BlbkxpYnJhcnlXaXphcmRQYWdlIGdldFdpemFyZFBhZ2UoU3RyaW5nIHR5cGVJZCkgewotCQlyZXR1cm4gKE9wZW5MaWJyYXJ5V2l6YXJkUGFnZSkgd2l6YXJkUGFnZXMuZ2V0KHR5cGVJZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL1NlbGVjdFByb2Nlc3NQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL1NlbGVjdFByb2Nlc3NQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlkZGUyYTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9TZWxlY3RQcm9jZXNzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzLlByb2Nlc3NUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIHByb2Nlc3MgdG8gZXhwb3J0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSA3LjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdFByb2Nlc3NQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0UHJvY2Vzc1BhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBQcm9jZXNzVHJlZVZpZXdlciBwcm9jZXNzVHJlZVZpZXdlcjsKLQotCXByaXZhdGUgVGV4dCBicmllZkRlc2NUZXh0OwotCi0JcHJpdmF0ZSBQcm9jZXNzIHByb2Nlc3M7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RQcm9jZXNzUGFnZSgpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoTGlicmFyeVVJUmVzb3VyY2VzLnNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oTGlicmFyeVVJUmVzb3VyY2VzLnNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL0V4cG9ydFByb2Nlc3MuZ2lmIikpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBMaWJyYXJ5VUlSZXNvdXJjZXMucHJvY2Vzc2VzTGFiZWxfdGV4dCk7Ci0KLQkJcHJvY2Vzc1RyZWVWaWV3ZXIgPSBuZXcgUHJvY2Vzc1RyZWVWaWV3ZXIoY29tcG9zaXRlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RICi0JCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMjUwOwotCQlwcm9jZXNzVHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBMaWJyYXJ5VUlSZXNvdXJjZXMuYnJpZWZEZXNjcmlwdGlvbkxhYmVsX3RleHQpOwotCi0JCWJyaWVmRGVzY1RleHQgPSBjcmVhdGVUZXh0TXVsdGkoY29tcG9zaXRlLCAiIiwgMTAwLCA3MCwgMSk7IC8vJE5PTi1OTFMtMSQJCi0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlwcm9jZXNzVHJlZVZpZXdlci5zZXRJbnB1dChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQlwcm9jZXNzVHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQotCQlhZGRFdmVudEhhbmRsZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBldmVudCBoYW5kbGVycyB0byB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXZlbnRIYW5kbGVycygpIHsKLQkJcHJvY2Vzc1RyZWVWaWV3ZXIKLQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJT2JqZWN0IHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFRyZWVTZWxlY3Rpb24pIHsKLQkJCQkJCQlPYmplY3QgZWxlbWVudCA9ICgoVHJlZVNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCQkJCQlwcm9jZXNzID0gKFByb2Nlc3MpIGVsZW1lbnQ7Ci0JCQkJCQkJCWJyaWVmRGVzY1RleHQuc2V0VGV4dChwcm9jZXNzCi0JCQkJCQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcHJvY2VzcyA9IG51bGw7Ci0JCQkJCQkJCWJyaWVmRGVzY1RleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSA9PSBudWxsKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLm5vT3BlbkxpYnJhcnlXYXJuaW5nX21zZyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGdldFByb2Nlc3MoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJSVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IGdldFdpemFyZCgpLmdldE5leHRQYWdlKHRoaXMpOwotCQlpZiAod2l6YXJkUGFnZSAhPSBudWxsICYmIHdpemFyZFBhZ2UgaW5zdGFuY2VvZiBCYXNlV2l6YXJkUGFnZSkgewotCQkJQmFzZVdpemFyZFBhZ2UgbmV4dFdpemFyZFBhZ2UgPSAoQmFzZVdpemFyZFBhZ2UpIHdpemFyZFBhZ2U7Ci0JCQluZXh0V2l6YXJkUGFnZS5vbkVudGVyUGFnZShnZXRQcm9jZXNzKCkpOwotCQl9Ci0JCXJldHVybiB3aXphcmRQYWdlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc2VsZWN0ZWQgcHJvY2Vzcy4KLQkgKi8KLQlwdWJsaWMgUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlyZXR1cm4gcHJvY2VzczsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZjY2MDBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgd2l6YXJkcyBmb3IgbWFuYWdpbmcgYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjFiNzc4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgWE1JIExpYnJhcnkgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmMzI1M2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZWYwMzk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBTZXAgMTEgMTI6MzE6NTcgUERUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy8vc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXMucHJvcGVydGllcz04ODU5XzEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFjMmE3MmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5UGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5wcmVmZXJlbmNlcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMwYjJmYzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlmMmVjN2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIFhNSSBMaWJyYXJ5Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGMwYWE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImRpYWdyYW1NaWdyYXRpb24iIG5hbWU9IkRpYWdyYW0gTWlncmF0aW9uIiBzY2hlbWE9InNjaGVtYS9JRGlhZ3JhbU1pZ3JhdGlvbi5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5saWJyYXJ5TWFuYWdlcnMiPgotICAgICAgPGxpYnJhcnlNYW5hZ2VyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlNYW5hZ2VyIiAgICAgICAJCQotICAgICAgICAgICAgdHlwZT0ieG1pIgotICAgICAgICAgICAgdHlwZU5hbWU9IlhNSSI+Ci0gICAgICA8L2xpYnJhcnlNYW5hZ2VyPiAgICAgCi0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5taWdyYXRvcnMiPgotICAgICAgPG1pZ3JhdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLmludGVybmFsLm1pZ3JhdGlvbi5NaWdyYXRvcjEwMiIKLSAgICAgICAgICAgIGxpYk5zVVJJPSJodHRwOi8vd3d3LmlibS5jb20vdW1hLzEuMC4yL3VtYS5lY29yZSIvPgotICAgICAgPG1pZ3JhdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLmludGVybmFsLm1pZ3JhdGlvbi5NaWdyYXRvcjEwMyIKLSAgICAgICAgICAgIGxpYk5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlMSIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5vcHBvc2l0ZUZlYXR1cmVMb2FkZXJzIj4KLSAgICAgIDxvcHBvc2l0ZUZlYXR1cmVMb2FkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5pbnRlcm5hbC5YTUlPcHBvc2l0ZUZlYXR1cmVMb2FkZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NjaGVtYS9JRGlhZ3JhbU1pZ3JhdGlvbi5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc2NoZW1hL0lEaWFncmFtTWlncmF0aW9uLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcxNWJlNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc2NoZW1hL0lEaWFncmFtTWlncmF0aW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkiIGlkPSJJRGlhZ3JhbU1pZ3JhdGlvbiIgbmFtZT0iRGlhZ3JhbSBNaWdyYXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgUHJvdmlkZSBkaWFncmFtIG1pZ3JhdGlvbiBBUEkuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkaWFncmFtTWlncmF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGlhZ3JhbU1pZ3JhdGlvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5JRGlhZ3JhbU1pZ3JhdGlvbgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL0lEaWFncmFtTWlncmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL0lEaWFncmFtTWlncmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEyZmM3MDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9JRGlhZ3JhbU1pZ3JhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBkaWdyYW0gbWlncmF0aW9uIAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUgLSBNYXJjaCAxOSwgMjAwNwotICogQHNpbmNlICAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhZ3JhbU1pZ3JhdGlvbiB7Ci0KLQl2b2lkIG1pZ3JhdGUoQ29sbGVjdGlvbjxQcm9jZXNzPiBwcm9jZXNzZXMpIHRocm93cyBFeGNlcHRpb247Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExMWE5M2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLWZpbGVQYXRoPUZpbGUgcGF0aAotY2Fubm90V3JpdGVUb0ZpbGVzPUNhbm5vdCB3cml0ZSB0byBmaWxlKHMpCi1yZWFkT25seUZpbGVzX3RpdGxlPVJlYWQtb25seSBmaWxlKHMpCi1yZWFkT25seUZpbGVzX21zZz1UaGUgZmlsZXMgbGlzdGVkIGluIERldGFpbHMgYXJlIHJlYWQtb25seS4gTWFrZSB0aGVtIHdyaXRhYmxlIGFuZCBjbGljayBvbiBSZXRyeSB0byBjb250aW51ZS4KLWVsZW1lbnRQYXRoPUVsZW1lbnQgcGF0aAotcHJvbXB0UmVtb3ZlUmVmZXJlbmNlc1RvTWlzc2luZ0ZpbGVzX21zZz1UaGUgZm9sbG93aW5nIGZpbGVzIGFyZSBtaXNzaW5nLiBDbGljayBPSyBpZiB5b3Ugd2FudCB0byByZW1vdmUgZXZlcnkgcmVmZXJlbmNlIHRvIHRoZSBzZWxlY3RlZCBmaWxlcyBpbiB0aGUgbGlicmFyeQotbWlzc2luZ0ZpbGVzX3RpdGxlPU1pc3NpbmcgZmlsZShzKQotbG9hZEVycm9yPUxvYWQgZXJyb3IKLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb0ZpbGVzV2l0aExvYWRFcnJvcnNfbXNnPVRoZSBmb2xsb3dpbmcgZmlsZShzKSBjb3VsZCBub3QgYmUgbG9hZGVkLiBDbGljayBPSyBpZiB5b3Ugd2FudCB0byByZW1vdmUgZXZlcnkgcmVmZXJlbmNlIHRvIHRoZSBzZWxlY3RlZCBmaWxlcyBpbiB0aGUgbGlicmFyeQotZmlsZXNXaXRoTG9hZEVycm9yc190aXRsZT1GaWxlKHMpIHdpdGggbG9hZCBlcnJvcgotCi0jIEVycm9yIE1lc3NhZ2VzCi1saWJyYXJ5QWxyZWFkeUV4aXN0c0Vycm9yX21zZz1BIG1ldGhvZCBsaWJyYXJ5IGFscmVhZHkgZXhpc3RzIGluICcnezB9JycuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMjAxODRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuRGVidWdUcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkFic3RyYWN0TGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeUFscmVhZHlFeGlzdHNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Nb2RlbFN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IFhNSSBMaWJyYXJ5IE1hbmFnZXIgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNSUxpYnJhcnlNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RMaWJyYXJ5TWFuYWdlciB7Ci0JLyoqCi0JICogVGhlIHN1cHBvcnRlZCBsaWJyYXJ5IHR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCUkFSWV9UWVBFID0gInhtaSI7Ci0KLQkvKioKLQkgKiBUaGUgbGlicmFyeSBYTUkgZmlsZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQlJBUllfWE1JID0gImxpYnJhcnkueG1pIjsKLQotCS8qKgotCSAqIFRoZSBwbHVnaW4gYW5kIGNvbmZpZyBzcGVjIGV4cG9ydCBmaWxlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXhwb3J0RmlsZSA9ICJleHBvcnQueG1pIjsgLy8kTk9OLU5MUy0xJAotCQkKLQkvKioKLQkgKiBUaGUgbGlicmFyeSBwYXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR19MSUJSQVJZX1BBVEggPSAibGlicmFyeS5wYXRoIjsKLQotCS8vIFRoZSBuYW1lIG9mIHRoZSBsb2NrIGZpbGUgZm9yIGEgbGlicmFyeS4KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJSQVJZX0xPQ0tfRklMRU5BTUUgPSAiLmxvY2siOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgbWFuYWdlZCBsaWJyYXJ5LgotCXByb3RlY3RlZCBTdHJpbmcgcGF0aDsKLQotCS8vIFRoZSBmaWxlIGxvY2sgZm9yIHRoZSBtYW5hZ2VkIGxpYnJhcnkuCi0vLwlwcml2YXRlIEZpbGVMb2NrIGxvY2s7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeSBpcyBsb2NrZWQuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgZGlzYWJsZSB0aGlzIGNvZGUgZm9yIG5vdyAtIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3MTA2Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGxpYnJhcnkgaXMgbG9ja2VkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXRob2RMaWJyYXJ5TG9ja2VkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0vKgkJaWYgKGRlYnVnKSB7IAotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiaXNNZXRob2RMaWJyYXJ5TG9ja2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBYTUlMaWJyYXJ5VXRpbC5pc01ldGhvZExpYnJhcnlMb2NrZWQoZ2V0TWV0aG9kTGlicmFyeVBhdGgoKSk7Ci0qLwl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIG5ldyBtZXRob2QgbGlicmFyeQotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBtZXRob2QgbGlicmFyeSBzcGVjaWZpYyBhcmd1bWVudHMKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBjcmVhdGVNZXRob2RMaWJyYXJ5KFN0cmluZyBuYW1lLCBNYXAgYXJncykKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiY3JlYXRlTWV0aG9kTGlicmFyeSIsICJuYW1lPSIgKyBuYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCB8fCBhcmdzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCVN0cmluZyBwYXRoID0gKFN0cmluZykgYXJncy5nZXQoQVJHX0xJQlJBUllfUEFUSCk7Ci0JCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlGaWxlIGxpYnJhcnlQYXRoID0gbmV3IEZpbGUocGF0aCk7Ci0JCUZpbGUgbGlicmFyeVhNSUZpbGUgPSBuZXcgRmlsZShsaWJyYXJ5UGF0aCwgTElCUkFSWV9YTUkpOwotCQlpZiAobGlicmFyeVhNSUZpbGUuZXhpc3RzKCkpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZCgKLQkJCQkJWE1JTGlicmFyeVJlc291cmNlcy5saWJyYXJ5QWxyZWFkeUV4aXN0c0Vycm9yX21zZywKLQkJCQkJbGlicmFyeVBhdGguZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJdGhyb3cgbmV3IExpYnJhcnlBbHJlYWR5RXhpc3RzRXhjZXB0aW9uKG1zZyk7Ci0JCX0KLQotCQlpZiAoIWxpYnJhcnlQYXRoLmV4aXN0cygpKSB7Ci0JCQlsaWJyYXJ5UGF0aC5ta2RpcnMoKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlza2lwRXZlbnRQcm9jZXNzaW5nID0gdHJ1ZTsKLQotCQkJLy8gTG9jayB0aGUgbWV0aG9kIGxpYnJhcnkgdG8gcHJldmVudCBhY2Nlc3MgYnkgYW5vdGhlciBFUEYgY29tcG9zZXIKLQkJCS8vIGluc3RhbmNlLgotCQkJbG9ja01ldGhvZExpYnJhcnkobGlicmFyeVBhdGgpOwotCi0JCQkvLyBPcGVuIHRoZSBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGZpbGUuCi0JCQlNZXRob2RMaWJyYXJ5UHJvamVjdC5vcGVuUHJvamVjdChsaWJyYXJ5UGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSwKLQkJCQkJbnVsbCk7Ci0KLQkJCS8vIENyZWF0ZSB0aGUgcmVzb3VyY2Ugc2V0LgotCQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IChJTGlicmFyeVJlc291cmNlU2V0KSBlZGl0aW5nRG9tYWluCi0JCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCi0JCQkvLyBDcmVhdGUgYSBuZXcgbWV0aG9kIGxpYnJhcnkuCi0JCQlNb2RlbFN0b3JhZ2UubmV3TGlicmFyeShyZXNvdXJjZVNldCwgbmFtZSwgbGlicmFyeVBhdGgKLQkJCQkJLmdldEFic29sdXRlUGF0aCgpLCB0cnVlKTsKLQkJCWxpYnJhcnkgPSByZXNvdXJjZVNldC5nZXRGaXJzdE1ldGhvZExpYnJhcnkoKTsKLQotCQkJLy8gQWRkIGEgbGlzdGVuZXIgdG8gbW9uaXRvciBsaWJyYXJ5IHJlc291cmNlIGNoYW5nZXMuCi0JCQlhZGRSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcnMoKTsKLQotCQkJLy8gLy8gdGhpcyBpcyBhbHJlYWR5IG1vdmVkIHRvIExpYnJhcnlTZXJ2aWNlCi0JCQkvLyBub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTE9BREVELCBudWxsKTsKLQotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLAotCQkJCQkJImNyZWF0ZU1ldGhvZExpYnJhcnkiLCAibGlicmFyeT0iICsgbGlicmFyeSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQlyZXR1cm4gbGlicmFyeTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNraXBFdmVudFByb2Nlc3NpbmcgPSBmYWxzZTsKLQotCQkJLy8gLy8gZXZlbnQgcHJvY2Vzc2VkIGluIExpYnJhcnlTZXJ2aWNlCi0JCQkvLyBub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ1JFQVRFRCwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkgVVJJCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgb3Blbk1ldGhvZExpYnJhcnkoamF2YS5uZXQuVVJJIHVyaSkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAib3Blbk1ldGhvZExpYnJhcnkiKTsKLQkJfQotCi0JCWlmICh1cmkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHVyaSk7Ci0JCQlsaWJyYXJ5ID0gb3Blbk1ldGhvZExpYnJhcnkoZmlsZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsaWJyYXJ5ID0gbnVsbDsKLQkJfQotCi0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAib3Blbk1ldGhvZExpYnJhcnkiLCAibGlicmFyeT0iICsgbGlicmFyeSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcmV0dXJuIGxpYnJhcnk7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSA8Y29kZT5GaWxlPC9jb2RlPiBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgcGF0aCB0byB0aGUKLQkgKiAgICAgICAgICAgIG1ldGhvZCBsaWJyYXJ5LgotCSAqIEByZXR1cm4gYSA8Y29kZT5NZXRob2RMaWJyYXJ5PC9jb2RlPi4KLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kTGlicmFyeSBvcGVuTWV0aG9kTGlicmFyeShGaWxlIHBhdGgpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlGaWxlIGxpYnJhcnlYTUlGaWxlID0gbmV3IEZpbGUocGF0aCwgTElCUkFSWV9YTUkpOwotCQlpZiAoIWxpYnJhcnlYTUlGaWxlLmV4aXN0cygpKSB7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeU5vdEZvdW5kRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQkvL0FuIG9sZCB2ZXJzaW9uIGxpYnJhcnkgc2hvdWxkIGFsd2F5cyBiZSBvcGVubmVkIGZyb20gT3BlbkxpYnJhcnlXaXphcmQuIERvbid0IHdhbnQgdG8gaGFuZGxlIGl0IGhlcmUuCi0JCVZlcnNpb25VdGlsLlZlcnNpb25DaGVja0luZm8gaW5mbyA9IFZlcnNpb25VdGlsLmNoZWNrTGlicmFyeVZlcnNpb24obGlicmFyeVhNSUZpbGUpOwotCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8ucmVzdWx0ID4gMCkgewotCQkJdGhyb3cgbmV3IExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uKCk7Ci0JCX0gZWxzZSBpZiAoWE1JTGlicmFyeVV0aWwuaXNNZXRob2RMaWJyYXJ5VXBncmFkZVJlcXVpcmVkKHBhdGguZ2V0QWJzb2x1dGVQYXRoKCksIExJQlJBUllfWE1JKSkgewotCQkJdGhyb3cgbmV3IExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJCQkKLQkJdHJ5IHsKLQkJCXNraXBFdmVudFByb2Nlc3NpbmcgPSB0cnVlOwotCi0JCQkvLyBMb2NrIHRoZSBtZXRob2QgbGlicmFyeSB0byBwcmV2ZW50IGFjY2VzcyBieSBhbm90aGVyIEVQRiBjb21wb3NlcgotCQkJLy8gaW5zdGFuY2UuCi0JCQlsb2NrTWV0aG9kTGlicmFyeShwYXRoKTsKLQotCQkJLy8gT3BlbiB0aGUgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBmaWxlLgotCQkJTWV0aG9kTGlicmFyeVByb2plY3Qub3BlblByb2plY3QocGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSwgbnVsbCk7Ci0KLQkJCS8vIENyZWF0ZSB0aGUgcmVzb3VyY2Ugc2V0LgotCQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9ICgoSUxpYnJhcnlSZXNvdXJjZVNldCkgZWRpdGluZ0RvbWFpbgotCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0KLQkJCS8vIExvYWQgdGhlIG1ldGhvZCBsaWJyYXJ5LgotCQkJcmVzb3VyY2VTZXQubG9hZE1ldGhvZExpYnJhcmllcyhVUkkuY3JlYXRlRmlsZVVSSShsaWJyYXJ5WE1JRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkKLQkJCQkJLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQkJbGlicmFyeSA9IHJlc291cmNlU2V0LmdldEZpcnN0TWV0aG9kTGlicmFyeSgpOwotCQkJCi0JCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBtb25pdG9yIGxpYnJhcnkgcmVzb3VyY2UgY2hhbmdlcy4KLQkJCWFkZFJlc291cmNlQ2hhbmdlZExpc3RlbmVycygpOwotCi0JCQlyZXR1cm4gbGlicmFyeTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCURlYnVnVHJhY2UucHJpbnQoZSk7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2UobGlicmFyeSwgUFJPUF9ESVJUWSk7Ci0JCQlza2lwRXZlbnRQcm9jZXNzaW5nID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVbmxvY2tzIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIEBkZXByZWNhdGVkIGRpc2FibGUgdGhpcyBjb2RlIGZvciBub3cgLSBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NzEwNgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVubG9ja01ldGhvZExpYnJhcnkoKSB7Ci0vKgkJdHJ5IHsKLQkJCWlmIChsb2NrICE9IG51bGwpIHsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCQlsb2NrLmNoYW5uZWwoKS5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJ1bmxvY2tNZXRob2RMaWJyYXJ5IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotKi8JfQotCi0JLyoqCi0JICogT3BlbnMgYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgYXJndW1lbnRzCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgb3Blbk1ldGhvZExpYnJhcnkoTWFwIGFyZ3MpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgIm9wZW5NZXRob2RMaWJyYXJ5Iik7Ci0JCX0KLQotCQlpZiAoYXJncyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGFyZ3MuZ2V0KEFSR19MSUJSQVJZX1BBVEgpOwotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJbGlicmFyeSA9IG9wZW5NZXRob2RMaWJyYXJ5KG5ldyBGaWxlKHBhdGgpKTsKLQotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgIm9wZW5NZXRob2RMaWJyYXJ5IiwgImxpYnJhcnk9IiArIGxpYnJhcnkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXJldHVybiBsaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIFJlb3BlbnMgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgcmVvcGVuTWV0aG9kTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAicmVvcGVuTWV0aG9kTGlicmFyeSIpOwotCQl9Ci0KLQkJbGlicmFyeSA9IG9wZW5NZXRob2RMaWJyYXJ5KG5ldyBGaWxlKGdldE1ldGhvZExpYnJhcnlQYXRoKCkpKTsKLQotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgInJlb3Blbk1ldGhvZExpYnJhcnkiLCAibGlicmFyeT0iICsgbGlicmFyeSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcmV0dXJuIGxpYnJhcnk7Ci0JfQotCi0JLyoqCi0JICogTG9ja3MgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkgdG8gcHJldmVudCBhY2Nlc3MgYnkgYW5vdGhlciBFUEYKLQkgKiBDb21wb3NlciBpbnN0YW5jZS4KLQkgKiA8cD4KLQkgKiBUaGUgLmxvY2sgZmlsZSBpbiB0aGUgbWV0aG9kIGxpYnJhcnkgZm9sZGVyIHdpbGwgYmUgbG9ja2VkLiBJZiBpdCBkb2VzCi0JICogbm90IGV4aXN0cywgYSBuZXcgLmxvY2sgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgZGlzYWJsZSB0aGlzIGNvZGUgZm9yIG5vdyAtIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3MTA2Ci0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+RmlsZTwvY29kZT4gb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHBhdGggdG8gdGhlCi0JICogICAgICAgICAgICBtZXRob2QgbGlicmFyeS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2NrTWV0aG9kTGlicmFyeShGaWxlIHBhdGgpIHsKLS8qCQlGaWxlIGxvY2tGaWxlID0gbmV3IEZpbGUocGF0aCwgUmVzb3VyY2VVdGlsLkxPQ0tfRklMRU5BTUUpOwotCQlsb2NrID0gRmlsZVV0aWwubG9ja0ZpbGUobG9ja0ZpbGUpOwotKi8JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5BYnN0cmFjdExpYnJhcnlNYW5hZ2VyI2dldExpYnJhcnlQZXJzaXN0ZXJUeXBlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExpYnJhcnlQZXJzaXN0ZXJUeXBlKCkgewotCQlyZXR1cm4gU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuQWJzdHJhY3RMaWJyYXJ5TWFuYWdlciNjcmVhdGVSZXNvdXJjZVNldCgpCi0JICovCi0JcHJvdGVjdGVkIElMaWJyYXJ5UmVzb3VyY2VTZXQgY3JlYXRlUmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiBQZXJzaXN0ZW5jZVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUmVzb3VyY2VTZXQoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTGlicmFyeVBhdGgoKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiZ2V0TWV0aG9kTGlicmFyeVBhdGgiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJamF2YS5uZXQuVVJJIGxpYnJhcnlVUkkgPSBnZXRNZXRob2RMaWJyYXJ5VVJJKCk7Ci0JCWlmIChsaWJyYXJ5VVJJICE9IG51bGwpIHsKLQkJCS8vIEZpbGUgbGlicmFyeVhNSUZpbGUgPSBuZXcgRmlsZShsaWJyYXJ5VVJJLnRvRmlsZVN0cmluZygpKTsKLQkJCUZpbGUgbGlicmFyeVhNSUZpbGUgPSBuZXcgRmlsZShsaWJyYXJ5VVJJKTsKLQkJCWlmIChsaWJyYXJ5WE1JRmlsZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShMSUJSQVJZX1hNSSkpIHsKLQkJCQlsaWJyYXJ5WE1JRmlsZSA9IGxpYnJhcnlYTUlGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCX0KLQkJCXJldHVybiBsaWJyYXJ5WE1JRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5UGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmIxOGI1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIFhNSSBMaWJyYXJ5IHBsdWctaW4gYWN0aXZhdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNSUxpYnJhcnlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgWE1JTGlicmFyeVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBYTUlMaWJyYXJ5UGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5jb3JlLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmNvcmUucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBYTUlMaWJyYXJ5UGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlSZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNGMyNDY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgWE1JIExpYnJhcnkgcmVzb3VyY2UgYnVuZGxlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUlMaWJyYXJ5UmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IFhNSUxpYnJhcnlSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2Fubm90V3JpdGVUb0ZpbGVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudFBhdGg7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlUGF0aDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVzV2l0aExvYWRFcnJvcnNfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkRXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtaXNzaW5nRmlsZXNfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9GaWxlc1dpdGhMb2FkRXJyb3JzX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb21wdFJlbW92ZVJlZmVyZW5jZXNUb01pc3NpbmdGaWxlc19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkT25seUZpbGVzX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRPbmx5RmlsZXNfdGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeUFscmVhZHlFeGlzdHNFcnJvcl9tc2c7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBYTUlMaWJyYXJ5UmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFhNSUxpYnJhcnlSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMDY3ZmQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBIZWxwZXIgdXRpbGl0aWVzIGZvciBhY2Nlc3NpbmcgYSBYTUkgbWV0aG9kIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1JTGlicmFyeVV0aWwgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX01FVEhPRF9MSUJSQVJZX1BBVEhfTVNHID0gTGlicmFyeVJlc291cmNlcy5lbXB0eUxpYnJhcnlQYXRoRXJyb3JfcmVhc29uOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfTElCUkFSWV9GSUxFX01TRyA9IExpYnJhcnlSZXNvdXJjZXMubWlzc2luZ0xpYnJhcnlGaWxlRXJyb3JfcmVhc29uOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPVUxEX05PVF9MT0NLX0xJQlJBUllfTVNHID0gTGlicmFyeVJlc291cmNlcy5jb3VsZE5vdExvY2tMaWJyYXJ5X3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVN0YXR1cyBFTVBUWV9NRVRIT0RfTElCUkFSWV9QQVRIX1NUQVRVUyA9IG5ldyBTdGF0dXMoCi0JCQlTdGF0dXMuRVJST1IsIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksIDEsCi0JCQlFTVBUWV9NRVRIT0RfTElCUkFSWV9QQVRIX01TRywgbnVsbCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTdGF0dXMgTUlTU0lOR19MSUJSQVJZX0ZJTEVfU1RBVFVTID0gbmV3IFN0YXR1cygKLQkJCVN0YXR1cy5FUlJPUiwgTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgMSwKLQkJCU1JU1NJTkdfTElCUkFSWV9GSUxFX01TRywgbnVsbCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTdGF0dXMgQ09VTERfTk9UX0xPQ0tfTElCUkFSWV9TVEFUVVMgPSBuZXcgU3RhdHVzKAotCQkJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAxLAotCQkJQ09VTERfTk9UX0xPQ0tfTElCUkFSWV9NU0csIG51bGwpOwotCi0Jc3RhdGljIHsKLQkJdHJ5IHsKLQkJCS8vIFRPRE86IFRoaXMgY2FsbCBpcyBuZWVkZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcGVyc2lzdGVuY2UgbGF5ZXIKLQkJCS8vIHRvIGF2b2lkIGEgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbiBpbgotCQkJLy8gUGVyc2lzdGVuY2VVdGlsLmNvbnZlcnNpb25SZXF1aXJlZCgpLiBBIGJldHRlciBzb2x1dGlvbiBpcwotCQkJLy8gbmVlZGVkLgotCQkJbmV3IE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIGxpYnJhcnkgZXhpc3RzIG9uIGEgZ2l2ZW4gcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcGF0aCBjb250YWlucyBhIHZhbGlkIG1ldGhvZAotCSAqICAgICAgICAgbGlicmFyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNNZXRob2RMaWJyYXJ5KFN0cmluZyBwYXRoKSB7Ci0JCWlmIChwYXRoID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCUZpbGUgbGlicmFyeURpciA9IG5ldyBGaWxlKHBhdGgpOwotCQlpZiAoIWxpYnJhcnlEaXIuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUZpbGUgbGlicmFyeUZpbGUgPSBuZXcgRmlsZShsaWJyYXJ5RGlyLCBYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1hNSSk7Ci0JCWlmICghbGlicmFyeUZpbGUuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeSBtb2RlbCAobGlicmFyeS54bWkpIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm50IGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeSBtb2RlbCBmaWxlIChpZiBvbmUgZXhpc3RzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExpYnJhcnlNb2RlbEZpbGUoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKCFTdHJVdGlsLmlzQmxhbmsocGF0aCkpIHsKLQkJCVN0cmluZyBsaWJQYXRoID0gbmV3IEZpbGUocGF0aCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQlTdHJpbmcgc3VmZml4ID0gRmlsZS5zZXBhcmF0b3IKLQkJCQkJKyBNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0xJQlJBUllfTU9ERUxfRklMRU5BTUU7Ci0JCQlpZiAobGliUGF0aC5lbmRzV2l0aChzdWZmaXgpKSB7Ci0JCQkJcmV0dXJuIGxpYlBhdGg7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBsaWJQYXRoICsgc3VmZml4OwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyBhIG1ldGhvZCBsaWJyYXJ5IHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqIEBwYXJhbSB2YWxpZGF0ZU1vZGVsRmlsZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHZhbGlkYXRlIHRoYXQgdGhlIGxpYnJhcnkueG1pIGZpbGUKLQkgKiAgICAgICAgICAgIGFsc28gZXhpc3RzLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHBhdGggaXMgYSB2YWxpZCBtZXRob2QgbGlicmFyeQotCSAqICAgICAgICAgZm9sZGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGlzVmFsaWRMaWJyYXJ5KFN0cmluZyBwYXRoLCBib29sZWFuIHZhbGlkYXRlTW9kZWxGaWxlKSB7Ci0JCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIEVNUFRZX01FVEhPRF9MSUJSQVJZX1BBVEhfU1RBVFVTOwotCQl9Ci0KLQkJaWYgKHZhbGlkYXRlTW9kZWxGaWxlKSB7Ci0JCQlGaWxlIGxpYkZpbGUgPSBuZXcgRmlsZShnZXRMaWJyYXJ5TW9kZWxGaWxlKHBhdGgpKTsKLQkJCWlmICghbGliRmlsZS5leGlzdHMoKSkgewotCQkJCXJldHVybiBNSVNTSU5HX0xJQlJBUllfRklMRV9TVEFUVVM7Ci0JCQl9Ci0JCX0KLQotCQlGaWxlIGxpYlBhdGggPSBuZXcgRmlsZShwYXRoKTsKLQkJaWYgKHBhdGguZW5kc1dpdGgoTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9MSUJSQVJZX01PREVMX0ZJTEVOQU1FKSkgewotCQkJbGliUGF0aCA9IGxpYlBhdGguZ2V0UGFyZW50RmlsZSgpOwotCQl9Ci0KLQkJU3RyaW5nIGxpYkZ1bGxQYXRoID0gbGliUGF0aC5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotCQlpZiAobGliRnVsbFBhdGguc3RhcnRzV2l0aCgiXFwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyB0aGUgZmlyc3QgcGFydCBtdXN0IGJlIGEgbWFjaGluZSBuYW1lLCBhbmQgeW91IG11c3Qgc3BlY2lmeSBhCi0JCQkvLyBmb2xkZXIKLQotCQkJYm9vbGVhbiBpc1ZhbGlkID0gdHJ1ZTsKLQkJCVN0cmluZyB1bmNQYXRoOwotCQkJaW50IGluZGV4ID0gbGliRnVsbFBhdGguaW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIsIDIpOwotCQkJaWYgKGluZGV4IDwgMCkgewotCQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdW5jUGF0aCA9IGxpYkZ1bGxQYXRoLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJCWlmICh1bmNQYXRoLmxlbmd0aCgpID09IDApIHsKLQkJCQkJLy8gbXVzdCBzcGVjaWZ5IGEgdmFsaWQgcGF0aAotCQkJCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gdGhlIHRvcCBsZXZlbCBwYXRoIG11c3QgYmUgdmFsaWQKLQkJCQkJaW5kZXggPSBsaWJGdWxsUGF0aC5pbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhciwgaW5kZXggKyAxKTsKLQkJCQkJaWYgKGluZGV4IDwgMCkgewotCQkJCQkJdW5jUGF0aCA9IGxpYkZ1bGxQYXRoOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdW5jUGF0aCA9IGxpYkZ1bGxQYXRoLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJCX0KLQotCQkJCQlGaWxlIGYgPSBuZXcgRmlsZSh1bmNQYXRoKTsKLQkJCQkJaWYgKCFmLmV4aXN0cygpKSB7Ci0JCQkJCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghaXNWYWxpZCkgewotCQkJCS8vIG5vIG5ldyByZXNvdXJjZSBzdHJpbmcsIHdhaXQgbGF0ZXIKLQkJCQkvLyByZXR1cm4gbmV3IFN0YXR1cyhTdGF0dXMuRVJST1IsCi0JCQkJLy8gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgMSwgIkludmFsaWQgcGF0aCIsIG51bGwpOwotCQkJCXJldHVybiBFTVBUWV9NRVRIT0RfTElCUkFSWV9QQVRIX1NUQVRVUzsKLQkJCX0KLQkJfQotCi0JCS8vIENoZWNrIGZvciBwcmVzZW5jZSBvZiBhIC5wcm9qZWN0IGZpbGUuCi0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOwotCQl0cnkgewotCQkJZGVzY3JpcHRpb24gPSBSZXNvdXJjZXNQbHVnaW4KLQkJCQkJLmdldFdvcmtzcGFjZSgpCi0JCQkJCS5sb2FkUHJvamVjdERlc2NyaXB0aW9uKAotCQkJCQkJCW5ldyBQYXRoKGxpYkZ1bGxQYXRoICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCQkJCSsgSVByb2plY3REZXNjcmlwdGlvbi5ERVNDUklQVElPTl9GSUxFX05BTUUpKTsKLQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJLy8gSWYgYSAucHJvamVjdCBmaWxlIGRvZXMgbm90IGV4aXN0cywgdXNlIGl0IHRvIHZhbGlkYXRlIHRoZSBwYXRoLgotCQkvLyBvbmx5IGNhbGwgdmFsaWRhdGVQcm9qZWN0TG9jYXRpb24gaWYgcGF0aCBpcyBub3Qgb24gd29ya3NwYWNlCi0JCS8vIGZvciBzb21lIHJlYXNvbiwgdmFsaWRhdGVQcm9qZWN0TG9jYXRpb24gb25seSB3b3JrcyBvbiBwYXRocyBub3Qgb24gdGhlIHdvcmtzcGFjZQotCQlpZiAoUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS5pc1ByZWZpeE9mKG5ldyBQYXRoKGxpYkZ1bGxQYXRoKSkpIHsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZVV0aWwuZmluZFByb2plY3QobGliRnVsbFBhdGgpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KAotCQkJCQlsaWJQYXRoLmdldE5hbWUoKSk7Ci0JCX0KLQotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlUHJvamVjdExvY2F0aW9uKHByb2plY3QsCi0JCQkJbmV3IFBhdGgobGliRnVsbFBhdGgpKTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgYSBtZXRob2QgbGlicmFyeSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBwYXRoIGlzIGEgdmFsaWQgbWV0aG9kIGxpYnJhcnkKLQkgKiAgICAgICAgIGZvbGRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBpc1ZhbGlkTGlicmFyeShTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gaXNWYWxpZExpYnJhcnkocGF0aCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIGxpYnJhcnkgaXMgbG9ja2VkLgotCSAqIDxwPgotCSAqIE9uY2UgYSBtZXRob2QgbGlicmFyeSBpcyBsb2NrZWQsIGl0IGNhbm5vdCBiZSBhY2Nlc3NlZCBieSBhbm90aGVyIEVQRgotCSAqIENvbXBvc2VyIGluc3RhbmNlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIGRpc2FibGUgdGhpcyBjb2RlIGZvciBub3cgLSBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NzEwNgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgbGlicmFyeSBpcyBsb2NrZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZXRob2RMaWJyYXJ5TG9ja2VkKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBmYWxzZTsKLS8qCQkvLyBjaGVjayBpZiBsaWJyYXJ5IGlzIGN1cnJlbnRseSBvcGVuZWQgYnkgdGhpcyBpbnN0YW5jZQotCQkvLyB0aGUgRmlsZUxvY2sgbWVjaGFuaXNtIGluIEphdmEgZG9lcyBub3Qgc2VlbSB0byBwcm9wZXJseSBkZXRlY3Qgd2hlbgotCQkvLyAJCXRoZSBjdXJyZW50IEpWTSBoYXMgbG9ja2VkIHRoZSBmaWxlCi0JCS8vIFRPRE86IGNoZWNrIGFsbCBvcGVuZWQgbGlicmFyaWVzIChyYXRoZXIgdGhhbiBqdXN0IGN1cnJlbnQpIHdoZW4gdGhlIEFQSSBhbGxvd3MgaXQKLQkJU3RyaW5nIGN1cnJlbnRMaWJyYXJ5UGF0aCA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCk7Ci0JCWlmIChjdXJyZW50TGlicmFyeVBhdGggIT0gbnVsbCAmJiBuZXcgRmlsZShjdXJyZW50TGlicmFyeVBhdGgpLmVxdWFscyhuZXcgRmlsZShwYXRoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUZpbGUgbG9ja0ZpbGUgPSBuZXcgRmlsZShwYXRoLCBSZXNvdXJjZVV0aWwuTE9DS19GSUxFTkFNRSk7Ci0JCXJldHVybiBGaWxlVXRpbC5pc0ZpbGVMb2NrZWQobG9ja0ZpbGUpOwotKi8JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBtZXRob2QgbGlicmFyeSBuZWVkcyB0byBiZSB1cGdyYWRlZCB0byBhIG5ldyBmb3JtYXQuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIEFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBsaWJyYXJ5IG5lZWRzIHRvIGJlIHVwZ3JhZGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWV0aG9kTGlicmFyeVVwZ3JhZGVSZXF1aXJlZChTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gaXNNZXRob2RMaWJyYXJ5VXBncmFkZVJlcXVpcmVkKHBhdGgsIFhNSUxpYnJhcnlNYW5hZ2VyLkxJQlJBUllfWE1JKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWV0aG9kTGlicmFyeVVwZ3JhZGVSZXF1aXJlZChTdHJpbmcgcGF0aCwgU3RyaW5nIGxpYlhtaSkgewotCQlyZXR1cm4gb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5NYXBwaW5nVXRpbC5jb252ZXJzaW9uUmVxdWlyZWQoCi0JCQkJCXBhdGggKyBGaWxlLnNlcGFyYXRvciArIGxpYlhtaSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgWE1JIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBuZXcgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RMaWJyYXJ5IGNyZWF0ZU1ldGhvZExpYnJhcnkoU3RyaW5nIG5hbWUsIFN0cmluZyBwYXRoKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJTWFwIGFyZ3MgPSBuZXcgSGFzaE1hcCgpOwotCQlhcmdzLnB1dChYTUlMaWJyYXJ5TWFuYWdlci5BUkdfTElCUkFSWV9QQVRILCBwYXRoKTsKLQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuY3JlYXRlTWV0aG9kTGlicmFyeShuYW1lLAotCQkJCVhNSUxpYnJhcnlNYW5hZ2VyLkxJQlJBUllfVFlQRSwgYXJncyk7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYW4gZXhpc3RpbmcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kTGlicmFyeSBvcGVuTWV0aG9kTGlicmFyeShTdHJpbmcgcGF0aCkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCU1hcCBhcmdzID0gbmV3IEhhc2hNYXAoKTsKLQkJYXJncy5wdXQoWE1JTGlicmFyeU1hbmFnZXIuQVJHX0xJQlJBUllfUEFUSCwgcGF0aCk7Ci0JCXJldHVybiBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLm9wZW5NZXRob2RMaWJyYXJ5KAotCQkJCVhNSUxpYnJhcnlNYW5hZ2VyLkxJQlJBUllfVFlQRSwgYXJncyk7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgdGhlIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5NZXRob2RMaWJyYXJ5UHJvamVjdChNZXRob2RMaWJyYXJ5IGxpYnJhcnksCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCAmJiBsaWJyYXJ5LmVSZXNvdXJjZSgpLmdldFVSSSgpLmlzRmlsZSgpKSB7CQkJCi0JCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VVdGlsLmZpbmRQcm9qZWN0KGxpYnJhcnkpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiAhcHJvamVjdC5pc09wZW4oKSkgewotCQkJCXRyeSB7Ci0JCQkJCXByb2plY3Qub3BlbihJUmVzb3VyY2UuQkFDS0dST1VORF9SRUZSRVNILCBtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJWE1JTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENoZWNrIGlmIHRoZSBkaXJlY3RvcnkgZ2l2ZW4gYnkgc3BlY2lmaWVkIHBhdGggY29udGFpbnMgYSBwbHVnaW4gb3IgY29uZmlnIHNwZWMKLQkgKiBleHBvcnQgZmlsZS4gCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc1BsdWdpbk9yQ29uZmlnU3BlY0V4cG9ydEZpbGUoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcGF0aCA9IG5ldyBGaWxlKHBhdGgpLmdldEFic29sdXRlUGF0aCgpOwotCQlwYXRoICs9IEZpbGUuc2VwYXJhdG9yICsgWE1JTGlicmFyeU1hbmFnZXIuZXhwb3J0RmlsZTsKLQkJRmlsZSBleHBvcnRGaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCXJldHVybiBleHBvcnRGaWxlLmV4aXN0cygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9MaWJyYXJ5UHJvY2Vzc29yLnR4dCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvTGlicmFyeVByb2Nlc3Nvci50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhYjQxYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9MaWJyYXJ5UHJvY2Vzc29yLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEyNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVMb2NrOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5QYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGF5b3V0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5WZXJzaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLk1vZGVsU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JU2F2ZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMudXRpbC5Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lcjsKLQotLyoqCi0gKiBNYW5hZ2VzIGEgTWV0aG9kIExpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5UHJvY2Vzc29yIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BfRElSVFkgPSAxOwotCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5UHJvY2Vzc29yIGluc3RhbmNlID0gbnVsbDsKLQotCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKLQotCS8vIG1haW50YWluIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY29uZmlndXJhdGlvbgotCS8vIHVzZXIgc2hvdWxkIGNhbGwgc2V0L2dldEN1cnJlbnRDb25maWd1cmF0aW9uKCkgbWV0aG9kcwotCS8vIHByb3RlY3RlZCBTdHJpbmcgY3VycmVudENvbmZpZ05hbWUgPSBudWxsOwotCi0JcHJpdmF0ZSBNYXAgc2F2ZU9wdGlvbnM7Ci0KLQkvLyBwcml2YXRlIE1hcCBzYXZlQXNPcHRpb25zOwotCS8vIHByaXZhdGUgU2V0IGVDbGFzc2VzOwotCi0JcHJpdmF0ZSBMaXN0IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIGtlZXAgdGhlIGxpc3RlbmVycyB0byBiZSBkZWxldGVkLCBkbyB0aGUgZGVsZXRlIGJlZm9yZSBlYWNoIG5vdGlmaWNhdGlvbgotCS8vIGFuZCBlbXB0eSB0aGlzIGxpc3QuCi0JLy8gZG9uJ3QgZGVsZXRlIGluIHRoZSBtaWRkbGUgb2YgdGhlIG5vdGlmaWNhdGlvbiBzaW5jZSB3ZSBkb24ndCB3YW50IHRvCi0JLy8gY2hhbmdlIHRoZSBsaXN0ZW5lciBsaXN0IGF0IHRoaXMgdGltZQotCXByaXZhdGUgTGlzdCB0bXBfbGlzdGVuZXJzX3RvYmVfZGVsZXRlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIHByaXZhdGUgYm9vbGVhbiBpc011bHRpcGxlRmlsZXMgPSBmYWxzZTsKLQotCS8vIHByaXZhdGUgYm9vbGVhbiBkaXJ0eSA9IGZhbHNlOwotCi0JYm9vbGVhbiBsb2FkZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBpbk9wZXJhdGlvbiA9IGZhbHNlOwotCi0JcHJpdmF0ZSBWZXJzaW9uTWFuYWdlciB2ZXJzaW9uTWdyID0gbnVsbDsKLQotCXByaXZhdGUgRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWdyID0gbnVsbDs7Ci0KLQkvLyBSQVRMQzAwMzg0NTk4IC0gRXhwb3J0OiBJbmZpbml0ZSBsb29wIE51bGxwb2ludGVyRXhjZXB0aW9uIGFmdGVyCi0JLy8gZXhwb3J0aW5nIGFuZCB1bmNoZWNraW5nIHJ1cCBwbHVnaW4gaW4gY29uZmlndXJhdGlvbgotCS8vIGFkZCB0aGlzIGZsYWcgdG8gdHJlYXQgdGhlIGluc3RhbmNlIGFzIHNpbmdsZXRvbiBpbnN0YWNuZSBvciBub3QKLQkvLyBvbmx5IHRoZSBzaW5nbGV0b24gaW5zdGFuY2UgY2FuIGRpc3Bvc2Ugc2hhcmVkIG9iamVjdHMuCi0JcHJpdmF0ZSBib29sZWFuIGlzU2luZ2xldG9uSW5zdGFuY2UgPSBmYWxzZTsKLQotCS8vIHRoZSBsb2NrIG9uIHRoZSBsaWJyYXJ5J3MgLnByb2plY3QgZmlsZQotCXByaXZhdGUgRmlsZUxvY2sgbG9jazsKLQotCS8vVE9ETzogZmluZCBhIGJldHRlciB3YXkgdG8gbm90aWZ5IHRoZSBjaGFuZ2UgaW4gbGlicmFyeSBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGhlIGNvbW1hbmQgc3RhY2sgbGlzdGVuZXIKLQlwcml2YXRlIENvbW1hbmRTdGFja0xpc3RlbmVyIGNvbW1hbmRTdGFja0xpc3RlbmVyID0gbmV3IENvbW1hbmRTdGFja0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKGZpbmFsIEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCQlpZiAoIWluT3BlcmF0aW9uKSB7Ci0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4KLQkJCQkJCS8vCi0JCQkJCQlDb21tYW5kIG1vc3RSZWNlbnRDb21tYW5kID0gTGlicmFyeVV0aWwKLQkJCQkJCQkJLnVud3JhcCgoKENvbW1hbmRTdGFjaykgZXZlbnQuZ2V0U291cmNlKCkpCi0JCQkJCQkJCQkJLmdldE1vc3RSZWNlbnRDb21tYW5kKCkpOwotCi0JCQkJCQlpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgewotCQkJCQkJCWlmIChtb3N0UmVjZW50Q29tbWFuZCBpbnN0YW5jZW9mIEFkZENvbW1hbmQpIHsKLQkJCQkJCQkJQWRkQ29tbWFuZCBjbWQgPSAoQWRkQ29tbWFuZCkgbW9zdFJlY2VudENvbW1hbmQ7Ci0JCQkJCQkJCUVPYmplY3Qgb3duZXIgPSBjbWQuZ2V0T3duZXIoKTsKLQkJCQkJCQkJaWYgKG93bmVyIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQkJCQkJQ29sbGVjdGlvbiBvYmpzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQkJb2Jqcy5hZGQob3duZXIpOwotCQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCQlJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VELAotCQkJCQkJCQkJCQlvYmpzKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCUNvbGxlY3Rpb24gb2JqcyA9IG1vc3RSZWNlbnRDb21tYW5kLmdldFJlc3VsdCgpOwotCQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCQlJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ORVdDSElMRCwKLQkJCQkJCQkJCQkJb2Jqcyk7Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCS8vIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3Rpb24gaWYgdGhlCi0JCQkJCQkJCQkvLyBvYmplY3QgaXMgYSBuZXdseSBhZGRlZCBtZXRob2QgcGFja2FnZQotCQkJCQkJCQkJLy8KLQkJCQkJCQkJCWlmIChvd25lciBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJCQkJCQlvYmpzID0gTGlicmFyeVV0aWwuZ2V0Q29udGFpbmVkRWxlbWVudHMob3duZXIsIG9ianMpOwotCQkJCQkJCQkJCWlmKCFvYmpzLmlzRW1wdHkoKSkgewotCQkJCQkJCQkJCQlhZGROZXdQYWNrYWdlc1RvQ29uZmlndXJhdGlvbihvYmpzKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQotCQkJCQkJCX0gCi0JCQkJCQkJZWxzZSBpZihtb3N0UmVjZW50Q29tbWFuZCBpbnN0YW5jZW9mIFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQpIHsKLQkJCQkJCQkJQ29sbGVjdGlvbiBvYmpzID0gbW9zdFJlY2VudENvbW1hbmQuZ2V0UmVzdWx0KCk7Ci0JCQkJCQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ORVdDSElMRCwgb2Jqcyk7CQotCQkJCQkJCQlQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kIGNtZCA9ICgoUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCltb3N0UmVjZW50Q29tbWFuZCk7Ci0JCQkJCQkJCQotCQkJCQkJCQkvLyB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0aW9uIGlmIHRoZQotCQkJCQkJCQkvLyBvYmplY3QgaXMgYSBuZXdseSBhZGRlZCBtZXRob2QgcGFja2FnZQotCQkJCQkJCQkvLwotCQkJCQkJCQlpZiAoY21kLmdldE93bmVyKCkgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCQkJCQlvYmpzID0gTGlicmFyeVV0aWwuZ2V0Q29udGFpbmVkRWxlbWVudHMoY21kLmdldE93bmVyKCksIG9ianMpOwotCQkJCQkJCQkJaWYoIW9ianMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCQkJYWRkTmV3UGFja2FnZXNUb0NvbmZpZ3VyYXRpb24ob2Jqcyk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAobW9zdFJlY2VudENvbW1hbmQgaW5zdGFuY2VvZiBDcmVhdGVDaGlsZENvbW1hbmQpIHsKLQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCUlMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxELAotCQkJCQkJCQkJCW1vc3RSZWNlbnRDb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpKTsKLQkJCQkJCQl9IGVsc2UgaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKLQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCUlMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQsCi0JCQkJCQkJCQkJbW9zdFJlY2VudENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIGFkZCB0aGUgbmV3IHBhY2thZ2VzIGludG8gdGhlIGNvbmZpZ3VyYXRpb25zIGlmIHRoZSBwYXJlbnQgaXMgaW4gdGhlCi0JICogY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBuZXdvYmpzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE5ld1BhY2thZ2VzVG9Db25maWd1cmF0aW9uKENvbGxlY3Rpb24gbmV3b2JqcykgewotCQlpZiAobmV3b2JqcyA9PSBudWxsIHx8IG5ld29ianMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXIgaGVscGVyID0gbmV3IExpYnJhcnlNb2RpZmljYXRpb25IZWxwZXIoKTsKLQotCQl0cnkgewotCQkJRU9iamVjdCBlLCBwYXJlbnQ7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbmV3b2Jqcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJZSA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKChlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkKLQkJCQkJCSYmICgocGFyZW50ID0gZS5lQ29udGFpbmVyKCkpICE9IG51bGwpCi0JCQkJCQkmJiAocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkpIHsKLQkJCQkJT2JqZWN0IGNvbmZpZ3MgPSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBwYXJlbnQpCi0JCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKEFzc29jaWF0aW9uSGVscGVyLk1ldGhvZFBhY2thZ2VfTWV0aG9kQ29uZmlndXJhdGlvbnMpOwotCQkJCQlpZiAoY29uZmlncyBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRjb25maWcgPSAoKExpc3QpIGNvbmZpZ3MpLml0ZXJhdG9yKCk7IGl0Y29uZmlnCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRjb25maWcKLQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJTGlzdCBwa2dzID0gY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJCQkJCQlpZiAoIXBrZ3MuY29udGFpbnMoZSkpIHsKLQkJCQkJCQkJLy8gcGtncy5hZGQoZSk7Ci0JCQkJCQkJCWhlbHBlcgotCQkJCQkJCQkJCS5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQkJCQljb25maWcsCi0JCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksCi0JCQkJCQkJCQkJCQllLCAtMSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQloZWxwZXIuc2F2ZSgpOwotCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQloZWxwZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lciA9IG5ldyBJTm90aWZ5Q2hhbmdlZExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCWlmICghaW5PcGVyYXRpb24pIHsKLQkJCQlpbnQgZXZlbnRUeXBlID0gbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpOwotCQkJCXN3aXRjaCAoZXZlbnRUeXBlKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOiB7Ci0JCQkJCS8vIG9ubHkgZm9yIGFkZCBNZXRob2RQbHVnaW4sIG9yIG1heWJlIHNvbWUgb3RoZXIgbWlzc2luZwotCQkJCQkvLyBzdHVmZiAoaWYgYW55KSB0aGF0IGFyZSBub3QgY3JlYXRlZCBieSBhIGNvbW1hbmQuCi0JCQkJCS8vIGFueXRoaW5nIGNyZWF0ZWQgYnkgYSBjb21tYW5kIGFyZSBoYW5kbGVkIGJ5IHRoZQotCQkJCQkvLyBjb21tYW5kU3RhY2tMaXN0ZW5lcgotCQkJCQlPYmplY3Qgbm90aWZpZXIgPSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCQkJT2JqZWN0IHYgPSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQkJaWYgKChub3RpZmllciBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpCi0JCQkJCQkJJiYgKHYgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQkJCQlDb2xsZWN0aW9uIGFmZmVjdGVkT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWFmZmVjdGVkT2JqZWN0cy5hZGQodik7Ci0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTkVXQ0hJTEQsCi0JCQkJCQkJCWFmZmVjdGVkT2JqZWN0cyk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOiB7Ci0JCQkJCU9iamVjdCBub3RpZmllciA9IG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJCQlpZiAobm90aWZpZXIgIT0gbnVsbCkgewotCQkJCQkJQ29sbGVjdGlvbiBhZmZlY3RlZE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlhZmZlY3RlZE9iamVjdHMuYWRkKG5vdGlmaWVyKTsKLQkJCQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VELAotCQkJCQkJCQlhZmZlY3RlZE9iamVjdHMpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCS8vIG5vdGU6IHRoaXMgaXMgdGhlIHJlbW92ZSBvZiBlbGVtZW50cyBmcm9tIHRoZSBwYXJlbnQsCi0JCQkJLy8gaXQgbWlnaHQgYmUgYSBkZWxldGUgYWN0aW9uLCBvciBtaWdodCBiZSBqdXN0IGEgcmVtb3ZlIG9mCi0JCQkJLy8gcmVmZXJlbmNlcwotCQkJCS8vIGZvciBkZWxldGUgYWN0aW9uLCB0aGUgZGVsZXRlZCBlbGVtZW50IGhhcyBubyBjb250YWluZXIKLQkJCQkvLyBmb3IgcmVtb3ZlZCByZWZlcmVuY2UsIHRoZSByZW1vdmVkIGVsZW1lbnQgc3RpbGwgaGF2ZSBpdCdzCi0JCQkJLy8gcGFyZW50Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOiB7Ci0JCQkJCU9iamVjdCBub3RpZmllciA9IG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJCQlPYmplY3Qgb2xkVmFsdWUgPSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKTsKLQkJCQkJQ29sbGVjdGlvbiBhZmZlY3RlZE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWlmIChvbGRWYWx1ZSBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkJCQkmJiAoKEVPYmplY3QpIG9sZFZhbHVlKS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkJLy8gdGhlIGVsZW1lbnQgaXMgZGVsZXRlZCwgc2VudCBhIGRlbGV0ZSBldmVudAotCQkJCQkJYWZmZWN0ZWRPYmplY3RzLmFkZChvbGRWYWx1ZSk7Ci0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fREVMRVRFRCwKLQkJCQkJCQkJYWZmZWN0ZWRPYmplY3RzKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIG90aGVyd2lzZSwgaXQncyBqdXN0IGEgcmVtb3ZlIG9mIHJlZmVyZW5jZXMsIHRoZQotCQkJCQkJLy8gbm90aWZpZXIgaXMgdGhlIGNoYW5nZWQgZWxlbWVudAotCQkJCQkJYWZmZWN0ZWRPYmplY3RzLmFkZChub3RpZmllcik7Ci0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRCwKLQkJCQkJCQkJYWZmZWN0ZWRPYmplY3RzKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6IHsKLQkJCQkJTGlzdCBvbGRWYWx1ZSA9IG5ldyBBcnJheUxpc3QoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbgotCQkJCQkJCS5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJQXJyYXlMaXN0IGRlbGV0ZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJQXJyYXlMaXN0IHJlbW92ZWRSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlpZiAoIW9sZFZhbHVlLmlzRW1wdHkoKSkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2xkVmFsdWUuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQkJCWlmICgoKEVPYmplY3QpIGVsZW1lbnQpLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQkJCQlkZWxldGVkRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJcmVtb3ZlZFJlZmVyZW5jZXMuYWRkKGVsZW1lbnQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghZGVsZXRlZEVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJCQkJLy8gdGhlIGVsZW1lbnQgaXMgZGVsZXRlZCwgc2VudCBhIGRlbGV0ZSBldmVudAotCQkJCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0RFTEVURUQsCi0JCQkJCQkJCWRlbGV0ZWRFbGVtZW50cyk7Ci0JCQkJCX0KLQkJCQkJaWYgKCFyZW1vdmVkUmVmZXJlbmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCS8vIG90aGVyd2lzZSwgaXQncyBqdXN0IGEgcmVtb3ZlIG9mIHJlZmVyZW5jZXMsIHRoZQotCQkJCQkJLy8gbm90aWZpZXIgaXMgdGhlIGNoYW5nZWQgZWxlbWVudAotCQkJCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQsCi0JCQkJCQkJCXJlbW92ZWRSZWZlcmVuY2VzKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgYm9vbGVhbiBsaXN0ZW5lckFkZGVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIEFkYXB0ZXIgbGliQ2hhbmdlZExpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChNZXRob2RMaWJyYXJ5LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUzoKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luOwotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJcGx1Z2luLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCXBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJCQkJcGx1Z2luLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZCgKLQkJCQkJCQkJcmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCXBsdWdpbi5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5yZW1vdmUoCi0JCQkJCQkJcmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCQkJCXBsdWdpbi5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5yZW1vdmUoCi0JCQkJCQkJCXJlc291cmNlQ2hhbmdlZExpc3RlbmVyKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBBZGFwdGVyIHJlc291cmNlQ2hhbmdlZExpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmIChtc2cuZ2V0RmVhdHVyZUlEKG51bGwpID09IFJlc291cmNlLlJFU09VUkNFX19JU19NT0RJRklFRAotCQkJCQkmJiBtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLlNFVCkgewotCQkJCS8vIGRpcnR5ID0gdHJ1ZTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UobXNnLmdldE5vdGlmaWVyKCksIFBST1BfRElSVFkpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgTGlzdGVuZXJMaXN0IHByb3BDaGFuZ2VMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0KLQlwcml2YXRlIElSZWZyZXNoTGlzdGVuZXIgcmVmcmVzaExpc3RlbmVyID0gbmV3IElSZWZyZXNoTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgbm90aWZ5UmVmcmVzaGVkKElSZWZyZXNoRXZlbnQgZXZlbnQpIHsKLQkJCWhhbmRsZVJlZnJlc2hFdmVudChldmVudCk7Ci0JCX0KLQkJCi0JfTsKLQotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVByb2Nlc3NvciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoTGlicmFyeVByb2Nlc3Nvci5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IExpYnJhcnlQcm9jZXNzb3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVmcmVzaEV2ZW50KElSZWZyZXNoRXZlbnQgZXZlbnQpIHsKLQkJaWYoTG9nLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxpYnJhcnlQcm9jZXNzb3IuaGFuZGxlUmVmcmVzaEV2ZW50KCkiKTsgLy8kTk9OLU5MUy1OJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIHJlZnJlc2hlZCByZXNvdXJjZXM6ICIgKyBldmVudC5nZXRSZWZyZXNoZWRSZXNvdXJjZXMoKSk7Ci0JCX0KLQkJaWYoIWV2ZW50LmdldFVubG9hZGVkT2JqZWN0cygpLmlzRW1wdHkoKSkgewotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuY2xlYW5VcCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaWJyYXJ5UHJvY2Vzc29yKCkgewotCQlpbml0KCk7Ci0KLQkJLy8gdGhpcyBpcyB0aGUgbWFpbiBpbnN0YW5jZSwgd2lsbCBiZSB0cmVhdGVkIGFzIHNpbmdsZXRvbgotCQlpc1NpbmdsZXRvbkluc3RhbmNlID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgTGlicmFyeVByb2Nlc3NvcihSZXNvdXJjZSByZXMpIHsKLQkJdGhpcygpOwotCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCXNldFJlc291cmNlKHJlcyk7Ci0JCX0KLQotCQlpc1NpbmdsZXRvbkluc3RhbmNlID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogdGhpcyBjb25zdHJ1Y3Qgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGlmIHlvdSB3YW50IHRvIG1haW50YWluIHlvdXIgb3duCi0JICogTGlicmFyeVByb2Nlc3Nvciwgc3VjaCBhcyB3aGVuIGZvciBsaWJyYXJ5IGltcG9ydGluZyBvciBleHBvcnRpbmcuCi0JICogT3RoZXJ3aXNlLCBjYWxsIHRoZSBzdGF0aWMgZ2V0SW5zdGFuY2UoKSBtZXRob2QgdG8gcmV0cmlldmUgdGhlIHNpbmdsZXRvbgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5UGF0aAotCSAqLwotCXB1YmxpYyBMaWJyYXJ5UHJvY2Vzc29yKFN0cmluZyBsaWJyYXJ5UGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMoKTsKLQkJb3BlbkxpYnJhcnkobGlicmFyeVBhdGgpOwotCi0JCWlzU2luZ2xldG9uSW5zdGFuY2UgPSBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlMaXN0ZW5lcihJUHJvcGVydHlMaXN0ZW5lciBsKSB7Ci0JCXByb3BDaGFuZ2VMaXN0ZW5lcnMuYWRkKGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5TGlzdGVuZXIoSVByb3BlcnR5TGlzdGVuZXIgbCkgewotCQlwcm9wQ2hhbmdlTGlzdGVuZXJzLnJlbW92ZShsKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlcyBhIHByb3BlcnR5IGNoYW5nZWQgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5SWQKLQkgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKGZpbmFsIE9iamVjdCBzb3VyY2UsIGZpbmFsIGludCBwcm9wZXJ0eUlkKSB7Ci0JCU9iamVjdFtdIGFycmF5ID0gcHJvcENoYW5nZUxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChpbnQgblggPSAwOyBuWCA8IGFycmF5Lmxlbmd0aDsgblgrKykgewotCQkJZmluYWwgSVByb3BlcnR5TGlzdGVuZXIgbCA9IChJUHJvcGVydHlMaXN0ZW5lcikgYXJyYXlbblhdOwotCi0JCQkvLyBzaW5jZSB0aGlzIHdpbGwgY2F1c2UgVUkgdXBkYXRlLCB3aGljaCBtdXN0IGJlIGV4ZWN1dGVkIGluIHRoZSBVSQotCQkJLy8gdGhyZWFkCi0JCQkvLyBvdGhlcndpc2UsIHdpbGwgY2F1c2UgSW52YWxpZCBUaHJlYWQgQWNjZXNzIGV4Y2VwdGlvbgotCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWwucHJvcGVydHlDaGFuZ2VkKHNvdXJjZSwgcHJvcGVydHlJZCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTGlicmFyeUxpc3RlbmVycygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gZ2V0TGlicmFyeSgpOwotCi0JCWlmIChsaWJyYXJ5ID09IG51bGwgfHwgbGlicmFyeS5lUmVzb3VyY2UoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyBpZighbGlicmFyeS5lQWRhcHRlcnMoKS5jb250YWlucyhsaWJDaGFuZ2VkTGlzdGVuZXIpKSB7Ci0JCS8vIGxpYnJhcnkuZUFkYXB0ZXJzKCkuYWRkKGxpYkNoYW5nZWRMaXN0ZW5lcik7Ci0JCS8vIH0KLQkJaWYgKCFsaWJyYXJ5LmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmNvbnRhaW5zKHJlc291cmNlQ2hhbmdlZExpc3RlbmVyKSkgewotCQkJbGlicmFyeS5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5hZGQocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJaWYgKCFwbHVnaW4uZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkuY29udGFpbnMoCi0JCQkJCXJlc291cmNlQ2hhbmdlZExpc3RlbmVyKSkgewotCQkJCXBsdWdpbi5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5hZGQocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUxpYnJhcnlMaXN0ZW5lcnMoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IGdldExpYnJhcnkoKTsKLQotCQlpZiAobGlicmFyeSA9PSBudWxsIHx8IGxpYnJhcnkuZVJlc291cmNlKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gbGlicmFyeS5lQWRhcHRlcnMoKS5yZW1vdmUobGliQ2hhbmdlZExpc3RlbmVyKTsKLQkJbGlicmFyeS5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5yZW1vdmUocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCXBsdWdpbi5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5yZW1vdmUocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgewotCQkJaWYgKCFsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAodG1wX2xpc3RlbmVyc190b2JlX2RlbGV0ZWQpIHsKLQkJCS8vIGRlbGF5IHRoZSByZW1vdmUgdGlsbCBhIG5vdGlmaWNhdGlvbiBpcyByZXF1ZXN0ZWQKLQkJCWlmICghdG1wX2xpc3RlbmVyc190b2JlX2RlbGV0ZWQuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQkJdG1wX2xpc3RlbmVyc190b2JlX2RlbGV0ZWQuYWRkKGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGZpbmFsIGludCBvcHRpb24sCi0JCQlmaW5hbCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJbG9hZGVkID0gdHJ1ZTsKLQotCQl0cnkgewotCQkJLy8gcmVtb3ZlIHRoZSBsaXN0ZW5lcnMgdG8gYmUgZGVsZXRlZAotCQkJaWYgKHRtcF9saXN0ZW5lcnNfdG9iZV9kZWxldGVkLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdG1wX2xpc3RlbmVyc190b2JlX2RlbGV0ZWQuaXRlcmF0b3IoKTsgaXQKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBsID0gaXQubmV4dCgpOwotCQkJCQlpZiAobGlzdGVuZXJzLmNvbnRhaW5zKGwpKSB7Ci0JCQkJCQlsaXN0ZW5lcnMucmVtb3ZlKGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXRtcF9saXN0ZW5lcnNfdG9iZV9kZWxldGVkLmNsZWFyKCk7Ci0JCQl9Ci0KLQkJCS8vIG5vdGlmeSBsaXN0ZW5lcnMsCi0JCQkvLyBub3RlLCB0aGUgc2l6ZSBtYXkgY2hhbmdlIHNpbmNlIG5vdGlmeSBhIGxpc3RlbmVyIG1heSBjYXVzZWQgbmV3Ci0JCQkvLyBsaXN0ZW5lcnMgYmVpbmcgYWRkZWQKLQkJCS8vIHRob3NlIG5ldyBsaXN0ZW5lcnMgd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IHNvIHdlCi0JCQkvLyBhcmUgb2sKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgbGlzdGVuZXJzLnNpemUoKSkgewotCQkJCWZpbmFsIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcikgbGlzdGVuZXJzCi0JCQkJCQkuZ2V0KGkpOwotCQkJCWlmIChsaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCS8vIHNpbmNlIHRoaXMgd2lsbCBjYXVzZSBVSSB1cGRhdGUsIHdoaWNoIG11c3QgYmUgZXhlY3V0ZWQKLQkJCQkJLy8gaW4gdGhlIFVJIHRocmVhZAotCQkJCQkvLyBvdGhlcndpc2UsIHdpbGwgY2F1c2UgSW52YWxpZCBUaHJlYWQgQWNjZXNzIGV4Y2VwdGlvbgotCi0JCQkJCS8vIGV4ZWN1dGUgaXQgaW4gc3luYyBtb2RlLCBvdGhlcndpc2UgbWF5IGNhdXNlIHByb2JsZW0KLQkJCQkJLy8gc2luY2UgdGhlIG5vdGlmaWNhdGlvbiBtaWdodCBiZSBleGVjdXRlZCB0b28gbGF0ZS4KLQkJCQkJLy8gZm9yIGV4YW1wbGUsIGFmdGVyIHRoZSBsaXN0ZW5lciBvYmplY3QgaXMgZGlzcG9zZWQKLQkJCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWxpc3RlbmVyLmxpYnJhcnlDaGFuZ2VkKG9wdGlvbiwgY29sbGVjdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQotCQkJCWkrKzsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBiZWdpbk9wZXJhdGlvbigpIHsKLQkJaW5PcGVyYXRpb24gPSB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBlbmRPcGVyYXRpb24oKSB7Ci0JCWluT3BlcmF0aW9uID0gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIHZhbGlkIGluIHRoZSBjdXJyZW50IHJlc291cmNlIHNldAotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZChFT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgIT0gbnVsbCAmJiBvYmplY3QuZUlzUHJveHkoKSkgewotCQkJRU9iamVjdCBlID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc29sdmUob2JqZWN0KTsKLQkJCXJldHVybiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJJiYgIWUuZUlzUHJveHkoKQotCQkJCQkmJiBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZSkgPT0gZ2V0TGlicmFyeSgpKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGxpYnJhcnkncyBwcm9qZWN0IGlzIHN0aWxsIG9wZW4uIElmIG5vdCwgb3BlbiBpdAotCSAqLwotCS8qCi0JcHVibGljIGJvb2xlYW4gZW5zdXJlTGlicmFyeVByb2plY3RPcGVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGdldExpYnJhcnkoKTsKLQkJaWYobGliICE9IG51bGwpIHsKLQkJCUlQcm9qZWN0IHByaiA9IFJlc291cmNlVXRpbC5maW5kUHJvamVjdChsaWIpOwotCQkJaWYocHJqICE9IG51bGwgJiYgIXByai5pc09wZW4oKSkgewotCQkJCXRyeSB7Ci0JCQkJCXByai5vcGVuKElSZXNvdXJjZS5CQUNLR1JPVU5EX1JFRlJFU0gsIG1vbml0b3IpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JKi8KLQkKLQlwdWJsaWMgdm9pZCBvcGVuTGlicmFyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgb3BlbkxpYnJhcnkgPSBnZXRMaWJyYXJ5Um9vdFBhdGgoKS5nZXRBYnNvbHV0ZVBhdGgoKQotCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyAibGlicmFyeS54bWkiOyAvLyROT04tTkxTLTEkCi0JCWlmIChvcGVuTGlicmFyeSAhPSBudWxsICYmICFvcGVuTGlicmFyeS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCW9wZW5MaWJyYXJ5KG9wZW5MaWJyYXJ5KTsKLQkJfQotCX0KLQotCXB1YmxpYyBJU3RhdHVzIG9wZW5MaWJyYXJ5KFN0cmluZyBsaWJyYXJ5UGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQliZWdpbk9wZXJhdGlvbigpOwotCQkJCi0JCQkvLyBvcGVuIHRoZSBtZXRob2QgbGlicmFyeSBhcyBhIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZSBzbyBpdCB3aWxsCi0JCQkvLyBzaG93IHVwIGluIHRoZSBSZXNvdXJjZSB2aWV3LgotCQkJLy8KLQkJCUZpbGUgbGliRGlyID0gbmV3IEZpbGUobGlicmFyeVBhdGgpLmdldFBhcmVudEZpbGUoKTsKLQkJCQotCQkJLy8gb25seSBjbG9zZSBwcmV2aW91cyBsaWJyYXJ5IGlmIHRoZSBuZXcgbGlicmFyeSdzIHByb2plY3Qgd2FzCi0JCQkvLyBvcGVuZWQgc3VjY2Vzc2Z1bGx5Ci0JCQkvLyBjbG9zZSBwcmV2aW91cyBsaWJyYXJ5J3MgcHJvamVjdCBvbmx5IGlmIGl0IGlzIGRpZmZlcmVudCB0aGFuIHRoZQotCQkJLy8gbmV3IG9uZQotCQkJY2xvc2VPcGVuZWRMaWJyYXJ5KCk7Ci0KLQkJCS8vIGxvY2sgdGhlIGxpYnJhcnkKLQkJCS8vCi0JCQlsb2NrTGlicmFyeShsaWJEaXIpOwotCi0JCQlSZXNvdXJjZVV0aWwub3BlbihsaWJEaXIuZ2V0QWJzb2x1dGVQYXRoKCksIG51bGwpOwotCi0JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZWRpdGluZ0RvbWFpbgotCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQlhc3NpZ25MaWJyYXJ5KHJlc291cmNlU2V0LmxvYWRMaWJyYXJ5KGxpYnJhcnlQYXRoKSk7Ci0KLQkJCUlTdGF0dXMgc3RhdHVzOwotCQkJaWYgKCFyZXNvdXJjZVNldC5oYXNVbnJlc29sdmVkUHJveHkoKSkgewotCQkJCVN0cmluZyBtc2cgPSBMaWJyYXJ5UmVzb3VyY2VzCi0JCQkJCQkuZ2V0U3RyaW5nKCJMaWJyYXJ5LnVucmVzb2x2ZWRQcm94eUVycm9yLnJlYXNvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0SWQoKSwgMCwgbXNnLCBudWxsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQotCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0xPQURFRCwgbnVsbCk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9IGZpbmFsbHkgewotCQkJZW5kT3BlcmF0aW9uKCk7Ci0KLQkJCS8vIGRpcnR5ID0gZmFsc2U7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2UoZ2V0TGlicmFyeSgpLCBQUk9QX0RJUlRZKTsKLQotCQkJLy8gc2V0Q3VycmVudENvbmZpZ3VyYXRpb24obnVsbCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEFzc2lnbnMgbGlicmFyeSB0byBhIG5ldyB2YWx1ZSBhbmQgYXR0YWNoIHRoZSBjaGFuZ2UgbGlzdGVuZXJzIHRvIGl0LgotCSAqIAotCSAqIEBwYXJhbSBsaWIKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXNzaWduTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYikgewotCQlyZW1vdmVMaWJyYXJ5TGlzdGVuZXJzKCk7Ci0JCWFkZExpYnJhcnlMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBuZXdMaWJyYXJ5KFN0cmluZyBsaWJyYXJ5TmFtZSwgU3RyaW5nIGxpYnJhcnlQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNsb3NlT3BlbmVkTGlicmFyeSgpOwotCi0JCQkvLyBpc011bHRpcGxlRmlsZXMgPSBiTXVsdGlwbGU7Ci0JCQliZWdpbk9wZXJhdGlvbigpOwotCi0JCQlGaWxlIGxpYl9wYXRoID0gbmV3IEZpbGUobGlicmFyeVBhdGgpOwotCQkJbGlicmFyeVBhdGggPSBsaWJfcGF0aC5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotCQkJLy8gb3BlbiB0aGUgbWV0aG9kIGxpYnJhcnkgYXMgYSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2Ugc28gaXQgd2lsbAotCQkJLy8gc2hvdyB1cCBpbiB0aGUgUmVzb3VyY2Ugdmlldy4KLQkJCVJlc291cmNlVXRpbC5vcGVuKGxpYnJhcnlQYXRoLCBudWxsKTsKLQotCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZWRpdGluZ0RvbWFpbgotCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCU1vZGVsU3RvcmFnZS5uZXdMaWJyYXJ5KHJlc291cmNlU2V0LCBsaWJyYXJ5TmFtZSwgbGlicmFyeVBhdGgsIHRydWUpOwotCQkJYXNzaWduTGlicmFyeShyZXNvdXJjZVNldC5nZXRNZXRob2RMaWJyYXJ5KCkpOwotCi0JCQkvLyBsb2NrIHRoZSBsaWJyYXJ5Ci0JCQlsb2NrTGlicmFyeShsaWJfcGF0aCk7Ci0JCX0gZmluYWxseSB7Ci0JCQllbmRPcGVyYXRpb24oKTsKLQkJCS8vIHNldERpcnR5KHRydWUpOwotCQkJLy8gc2V0Q3VycmVudENvbmZpZ3VyYXRpb24obnVsbCk7Ci0JCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ1JFQVRFRCwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgZ2l2ZW4gcmVzb3VyY2UgaWYgaXQgYmVsb25nIHRvIHRoZSBjdXJyZW50bHkgb3BlbiBsaWJyYXJ5Ci0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGVkaXRpbmdEb21haW4KLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCWlmIChyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCXJlc291cmNlU2V0LnNhdmUocmVzb3VyY2UsIHNhdmVPcHRpb25zKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVMaWJyYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IGdldExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJZG9TYXZlKHNhdmVPcHRpb25zKTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShsaWJyYXJ5LCBQUk9QX0RJUlRZKTsKLQotCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX1NBVkVELCBudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBvcGVuIGxpYnJhcnkgdW5kZXIgYSBuZXcgbG9jYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gbmV3RGlyCi0JICogICAgICAgICAgICBkaXJlY3RvcnkgdG8gc2F2ZSB0aGUgb3BlbiBsaWJyYXJ5IHRvCi0JICogQHBhcmFtIHJlZ2VuZXJhdGVHVUlECi0JICogICAgICAgICAgICBpZiB0cnVlLCByZWdlbmVyYXRlIEdVSUQgZm9yIGFsbCBNZXRob2RFbGVtZW50cyBpbiB0aGUgb3BlbgotCSAqICAgICAgICAgICAgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVMaWJyYXJ5QXMoU3RyaW5nIG5ld0RpciwgYm9vbGVhbiByZWdlbmVyYXRlR1VJRCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBvbGRMaWJEaXIgPSBnZXRMaWJyYXJ5Um9vdFBhdGgoKQotCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotCQkvLyBjcmVhdGUgbmV3IElQcm9qZWN0Ci0JCVJlc291cmNlVXRpbC5vcGVuKG5ld0RpciwgbW9uaXRvcik7Ci0KLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZ2V0TGlicmFyeSgpCi0JCQkJLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCXJlc291cmNlU2V0LnNhdmVBcyhuZXdEaXIsIHJlZ2VuZXJhdGVHVUlELCBtb25pdG9yKTsKLQotCQkvLyBoYW5kbGUgYXR0YWNobWVudHMgaGVyZQotCQlDb3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uLmNvcHlBdHRhY2htZW50c0xpYnJhcnkob2xkTGliRGlyLCBuZXdEaXIsCi0JCQkJbnVsbCwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnlQYXRoCi0JICogQHBhcmFtIGJNdWx0aXBsZQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTGlicmFyeUFzKFN0cmluZyBsaWJyYXJ5UGF0aCwgYm9vbGVhbiBiTXVsdGlwbGUpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gUmVzb3VyY2UgcmVzID0KLQkJLy8gKChSZXNvdXJjZSllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKTsKLQkJLy8gcmVzLnNldFVSSShVUkkuY3JlYXRlRmlsZVVSSShsaWJyYXJ5UGF0aCkpOwotCQkvLyByZXMuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCS8vCi0JCS8vIHNldFNhdmVBc011bHRpcGxlRm9sZGVyKGJNdWx0aXBsZSk7Ci0JCS8vICAgICAgICAJCi0JCS8vIGRvU2F2ZShzYXZlQXNPcHRpb25zKTsKLQkJLy8gc2V0RGlydHkoZmFsc2UpOwotCQkvLyBpc011bHRpcGxlRmlsZXMgPSBiTXVsdGlwbGU7Ci0JCS8vICAgICAgICAKLQkJLy8gbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX1NBVkVELCBudWxsKTsKLQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UmVzb3VyY2UoUmVzb3VyY2UgcmVzKSB7Ci0JCWlmIChyZXMgIT0gbnVsbCkgewotCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZWRpdGluZ0RvbWFpbgotCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCXJlc291cmNlU2V0LnJlc2V0KCk7Ci0JCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQocmVzKTsKLQkJCWFzc2lnbkxpYnJhcnkocmVzb3VyY2VTZXQuZ2V0TWV0aG9kTGlicmFyeSgpKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VELCBudWxsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUmVzb3VyY2UgZ2V0TGlicmFyeVJlc291cmNlKCkgewotCQlMaXN0IHJlcyA9IGdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpOwotCQlpZiAocmVzLnNpemUoKSA+IDApIHsKLQkJCXJldHVybiAoUmVzb3VyY2UpIHJlcy5nZXQoMCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRMaWJyYXJ5KCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldExpYnJhcnlSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRDb250ZW50cygpLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQkJcmV0dXJuIChNZXRob2RMaWJyYXJ5KSBvOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBVUkkgZ2V0TGlicmFyeVVSSSgpIHsKLQkJUmVzb3VyY2Ugc2F2ZWRSZXNvdXJjZSA9IGdldExpYnJhcnlSZXNvdXJjZSgpOwotCQlpZiAoc2F2ZWRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc2F2ZWRSZXNvdXJjZS5nZXRVUkkoKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBVUkkgZ2V0UmVsYXRpdmVVUkkoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVVSSSBsaWJVUkkgPSBnZXRMaWJyYXJ5VVJJKCk7Ci0JCVVSSSBlbGVtZXRuVVJJID0gZWxlbWVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKLQkJVVJJIHJlbFVyaSA9IGVsZW1ldG5VUkkuZGVyZXNvbHZlKGxpYlVSSSk7Ci0KLQkJcmV0dXJuIHJlbFVyaTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGdldExheW91dE1hbmFnZXIoKSB7Ci0JCS8vIG5vIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGlkIGxpYnJhcnkgaXMgbm90IGxvYWRlZAotCQlpZiAobGF5b3V0TWdyID09IG51bGwpIHsKLQkJCWlmIChnZXRMaWJyYXJ5KCkgIT0gbnVsbCkgewotCQkJCWxheW91dE1nciA9IG5ldyBFbGVtZW50TGF5b3V0TWFuYWdlcigpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxheW91dE1ncjsKLQl9Ci0KLQkvKgotCXB1YmxpYyBWZXJzaW9uTWFuYWdlciBnZXRWZXJzaW9uTWFuYWdlcigpIHsKLQkJaWYgKHZlcnNpb25NZ3IgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKHZlcnNpb25NZ3IgPT0gbnVsbCkgewotCQkJCQl2ZXJzaW9uTWdyID0gbmV3IFZlcnNpb25NYW5hZ2VyKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB2ZXJzaW9uTWdyOwotCX0KLQkqLwotCi0JcHVibGljIHZvaWQgc2V0TGlicmFyeShNZXRob2RMaWJyYXJ5IG5ld0xpYikgewotCQlhc3NpZ25MaWJyYXJ5KG5ld0xpYik7Ci0JCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkKLQkJCQkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApOwotCQlyZXMuZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQlyZXMuZ2V0Q29udGVudHMoKS5hZGQobmV3TGliKTsKLQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0xPQURFRCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKAotCQkJCQkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfQkFDS19VUF9CRUZPUkVfU0FWRSkpIHsKLQkJCQkJCQlzYXZlT3B0aW9ucy5wdXQoCi0JCQkJCQkJCQlNdWx0aUZpbGVYTUlTYXZlSW1wbC5CQUNLX1VQX0JFRk9SRV9TQVZFLAotCQkJCQkJCQkJZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKGV2ZW50Ci0JCQkJCQkJCS5nZXRQcm9wZXJ0eSgpCi0JCQkJCQkJCS5lcXVhbHMoCi0JCQkJCQkJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTKSkgewotCQkJCQkJCXNhdmVPcHRpb25zCi0JCQkJCQkJCQkucHV0KAotCQkJCQkJCQkJCQlNdWx0aUZpbGVYTUlTYXZlSW1wbC5ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUywKLQkJCQkJCQkJCQkJZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX0pOwotCi0JCS8vIGNyZWF0ZSB0aGUgZGVmYXVsdCBlZGl0aW5nIGRvbWFpbiBmb3IgbGlicmFyeSBvcGVyYXRpb24KLQkJTGlzdCBmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJZmFjdG9yaWVzKTsKLQotCQkvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUKLQkJLy8gZXhlY3V0ZWQuCi0JCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOwotCi0JCS8vIENyZWF0ZSB0aGUgZWRpdGluZyBkb21haW4gd2l0aCBhIHNwZWNpYWwgY29tbWFuZCBzdGFjay4KLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gbmV3IE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCgpOwotCQkKLQkJcmVzb3VyY2VTZXQuYWRkUmVmcmVzaExpc3RlbmVyKHJlZnJlc2hMaXN0ZW5lcik7Ci0JCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRSZXNvdXJjZVNldChyZXNvdXJjZVNldCk7Ci0KLQkJc2F2ZU9wdGlvbnMgPSByZXNvdXJjZVNldC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsKLQkJYm9vbGVhbiBiID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbigKLQkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfQkFDS19VUF9CRUZPUkVfU0FWRSk7Ci0JCXNhdmVPcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5CQUNLX1VQX0JFRk9SRV9TQVZFLCBCb29sZWFuCi0JCQkJLnZhbHVlT2YoYikpOwotCQliID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbigKLQkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMpOwotCQlzYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMsCi0JCQkJQm9vbGVhbi52YWx1ZU9mKGIpKTsKLQotCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwKLQkJCQljb21tYW5kU3RhY2ssIHJlc291cmNlU2V0KTsKLQotCQkvLyBDcmVhdGUgbmV3IElDb250ZW50RGVzY3JpcHRpb25QZXJzaXN0ZXIgYW5kIHNldCBpdCB0byB0aGUKLQkJLy8gQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeSBmb3IgdXNlLgotCQkvLwotCQlJTWV0aG9kTGlicmFyeVBlcnNpc3RlciBjb250ZW50RGVzY1BlcnNpc3RlciA9IG5ldyBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyKCk7Ci0JCUNvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkuc2V0TWV0aG9kTGlicmFyeVBlcnNpc3Rlcihjb250ZW50RGVzY1BlcnNpc3Rlcik7Ci0KLQkJQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5zZXRGaWxlTWFuYWdlcihGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpKTsKLQotCQlyZWdpc3RlckVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9TYXZlKE1hcCBvcHRpb25zKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKExvZy5ERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTYXZlIG9wdGlvbnM6ICIgKyBvcHRpb25zKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gTGlzdCByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIEZpbGUgbGliRGlyID0gbmV3Ci0JCS8vIEZpbGUoKChSZXNvdXJjZSllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50RmlsZSgpOwotCi0JCXRyeSB7Ci0JCQliZWdpbk9wZXJhdGlvbigpOwotCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGVkaXRpbmdEb21haW4KLQkJCQkJLmdldFJlc291cmNlU2V0KCkpOwotCQkJLy8gU2F2ZSB0aGUgcmVzb3VyY2UocykKLQkJCS8vCi0JCQlyZXNvdXJjZVNldC5zYXZlKG9wdGlvbnMpOwotCi0JCQkoKEJhc2ljQ29tbWFuZFN0YWNrKSBlZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5zYXZlSXNEb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGV4Y2VwdGlvbjsKLQkJfSBmaW5hbGx5IHsKLQkJCWVuZE9wZXJhdGlvbigpOwotCi0JCX0KLQl9Ci0KLQkvKgotCXB1YmxpYyB2b2lkIGRpc2NhcmRDaGFuZ2VzKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkKLQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlyZXNvdXJjZS5zZXRNb2RpZmllZChmYWxzZSk7Ci0JCX0KLQl9Ci0JKi8KLQotCXB1YmxpYyBib29sZWFuIGlzTGlicmFyeUxvYWRlZCgpIHsKLQkJcmV0dXJuIGxvYWRlZDsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBnZXRFZGl0aW5nRG9tYWluKCkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0TWV0aG9kTW9kZWxzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBnZXRMaWJyYXJ5KCk7Ci0JCXJldHVybiAobGlicmFyeSA9PSBudWxsKSA/IG5ldyBBcnJheUxpc3QoKSA6IGxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCX0KLQotCXB1YmxpYyBNZXRob2RQbHVnaW4gZ2V0TWV0aG9kUGx1Z2luKFN0cmluZyBndWlkKSB7Ci0JCWlmIChndWlkICE9IG51bGwpIHsJCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0TWV0aG9kTW9kZWxzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZFBsdWdpbiBwID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJCWlmIChndWlkLmVxdWFscyhwLmdldEd1aWQoKSkpIHsKLQkJCQkJcmV0dXJuIHA7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHByb2Nlc3MgZmFtaWx5IGJ5IG5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gUHJvY2Vzc0ZhbWlseQotCSAqLwotCXB1YmxpYyBQcm9jZXNzRmFtaWx5IGdldFByb2Nlc3NGYW1pbHkoU3RyaW5nIG5hbWUpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IGdldExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJTGlzdCBjb25maWdzID0gbGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjb25maWdzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQljb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXQubmV4dCgpOwotCQkJCWlmICgoY29uZmlnIGluc3RhbmNlb2YgUHJvY2Vzc0ZhbWlseSkKLQkJCQkJCSYmIGNvbmZpZy5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCXJldHVybiAoUHJvY2Vzc0ZhbWlseSkgY29uZmlnOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHJlZ2lzdGVyIGVkdGluZyBkb21haW4gd2l0aCB0aGlzIGxpYnJhcnkKLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJFZGl0aW5nRG9tYWluKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBkb21haW4pIHsKLQkJLyoqCi0JCSAqIHRoaXMgbm90aWZ5cyBhbGwgY2hhbmdlcywgbm90IGp1c3QgdGhlIGNvbnRlbnQgY2hhbmdlLCBvbmx5IHBpY2sgdGhlCi0JCSAqIG9uZXMgZm9yIGVsZW1lbnQgdXBkYXRlcy4gVGhlIG90aGVyIG9wZXJhdGlvbnMgYXJlIGNvbHZlcmVkIGJ5IHRoZQotCQkgKiBDb21tYW5kIGV2ZW50cwotCQkgKi8KLQkJKChDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBkb21haW4uZ2V0QWRhcHRlckZhY3RvcnkoKSkKLQkJCQkuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQotCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBzZXQgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQncyBhZmZlY3RlZCBvYmplY3RzIHRvCi0JCS8vIGJlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHZpZXdlciB3aXRoIGZvY3VzLgotCQlkb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIoY29tbWFuZFN0YWNrTGlzdGVuZXIpOwotCi0JfQotCi0JcHVibGljIHZvaWQgbGlzdGVuVG8oQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlhZGFwdGVyRmFjdG9yeS5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3BMaXN0ZW5pbmdUbyhDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWFkYXB0ZXJGYWN0b3J5LnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdGVuVG8oQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaykgewotCQljb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIoY29tbWFuZFN0YWNrTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3BMaXN0ZW5pbmdUbyhDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKSB7Ci0JCWNvbW1hbmRTdGFjay5yZW1vdmVDb21tYW5kU3RhY2tMaXN0ZW5lcihjb21tYW5kU3RhY2tMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBzYXZlT3B0aW9ucy4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldFNhdmVPcHRpb25zKCkgewotCQlyZXR1cm4gc2F2ZU9wdGlvbnM7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0TGlicmFyeVJvb3RQYXRoKCkgewotCQlVUkkgdXJpID0gdGhpcy5nZXRMaWJyYXJ5VVJJKCk7Ci0JCWlmICh1cmkgIT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSB1cmkudG9GaWxlU3RyaW5nKCk7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZShwYXRoKTsKLQkJCXJldHVybiBmLmdldFBhcmVudEZpbGUoKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE1ldGhvZFBsdWdpbihmaW5hbCBNZXRob2RQbHVnaW4gbW9kZWwpIHsKLQotCQkvLyBzaW5jZSB0aGlzIHdpbGwgY2F1c2UgVUkgdXBkYXRlLCB3aGljaCBtdXN0IGJlIGV4ZWN1dGVkIGluIHRoZSBVSQotCQkvLyB0aHJlYWQKLQkJLy8gb3RoZXJ3aXNlLCB3aWxsIGNhdXNlIEludmFsaWQgVGhyZWFkIEFjY2VzcyBleGNlcHRpb24KLQkJZmluYWwgRXhjZXB0aW9uW10gZXhjZXB0aW9ucyA9IG5ldyBFeGNlcHRpb25bMV07Ci0KLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWdldExpYnJhcnkoKS5nZXRNZXRob2RQbHVnaW5zKCkuYWRkKG1vZGVsKTsKLQotCQkJCUlNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Ci0JCQkJCQkuZ2V0TWV0aG9kTGlicmFyeVBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcGVyc2lzdGVyLnNhdmUoZ2V0TGlicmFyeSgpLmVSZXNvdXJjZSgpKTsKLQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQlleGNlcHRpb25zWzBdID0gZTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCW1vZGVsLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0pOwotCi0JCWlmIChleGNlcHRpb25zWzBdICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4Y2VwdGlvbnNbMF0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlcy9kaXNhYmxlcyBub3RpZmljYXRpb24gZW50aXJlbHkuCi0JICogCi0JICogQHBhcmFtIGIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb3RpZmljYXRpb25FbmFibGVkKGJvb2xlYW4gYikgewotCQllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZVNldERlbGl2ZXIoYik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOb3RpZmljYXRpb25FbmFibGVkKCkgewotCQlyZXR1cm4gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmVEZWxpdmVyKCk7Ci0JfQotCi0JLyoqCi0JICogY2FsbCB0aGlzIG1ldGhvZCB3aGVuIHRoZSBjdXJyZW50IGxpYnJhcnkgaXMgdG8gYmUgY2xvc2VkLiBmb3IgZXhhbXBsZSwKLQkgKiB3aGVuIHlvdSB0cnkgdG8gb3BlbiBhIG5vdGhlciBsaWJyYXJ5IGZvciBjcmVhdGUgYSBuZXcgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlT3BlbmVkTGlicmFyeSgpIHsKLQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0xJQlJBUllfQ0xPU0VELCBudWxsKTsKLQotCQlpZiAoTG9nLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJVc2VkIG1lbW9yeSBiZWZvcmUgY2xvc2luZyBsaWJyYXJ5OiAiICsgKFJ1bnRpbWUuZ2V0UnVudGltZSgpLnRvdGFsTWVtb3J5KCkgLSBSdW50aW1lLmdldFJ1bnRpbWUoKS5mcmVlTWVtb3J5KCkpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIFJBVExDMDAzODQ1OTggLSBFeHBvcnQ6IEluZmluaXRlIGxvb3AgTnVsbHBvaW50ZXJFeGNlcHRpb24gYWZ0ZXIKLQkJLy8gZXhwb3J0aW5nIGFuZCB1bmNoZWNraW5nIHJ1cCBwbHVnaW4gaW4gY29uZmlndXJhdGlvbgotCQkvLyBzbyBkb24ndCBkaXNwb3NlIGl0IGlmIG5vdCB0aGUgbWFpbiBzaW5nbGV0b24gaW5zdGFuY2UKLQkJaWYgKGlzU2luZ2xldG9uSW5zdGFuY2UpIHsKLQkJCS8vIGRpc3Bvc2UgYWxsIGl0ZW0gcHJvdmlkZXJzCi0JCQkvLwotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UucmVzZXQoKTsKLQotCQkJLy8gY2xlYXIgZmlsdGVyIGNvbnN0YW50cyBoYXNoTWFwCi0JCQlpZiAoRmlsdGVyQ29uc3RhbnRzLmhhc2hNYXAgIT0gbnVsbCkgewotCQkJCUZpbHRlckNvbnN0YW50cy5oYXNoTWFwLmNsZWFyKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGhpcy5sYXlvdXRNZ3IgIT0gbnVsbCkgewotCQkJdGhpcy5sYXlvdXRNZ3IuY2xlYXIoKTsKLQkJfQotCi0KLQkJLy8gY2xlYXIgdGhlIHRlbXAgbGF5b3V0IAotCQlMYXlvdXRSZXNvdXJjZXMuY2xlYXIoKTsKLQotCQkvKgotCQkgKiBpZiAoIHRoaXMuZGVwTWdyICE9IG51bGwgKSB7IHRoaXMuZGVwTWdyLmNsZWFyKCk7IH0gdGhpcy5kZXBNZ3IgPQotCQkgKiBudWxsOwotCQkgKi8KLQotCQl0aGlzLmxheW91dE1nciA9IG51bGw7Ci0KLQkJLy8gdGhpcy5pbnZhbGlkR3VpZHMuY2xlYXIoKTsKLQotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBlZGl0aW5nRG9tYWluCi0JCQkJLmdldFJlc291cmNlU2V0KCk7Ci0KLQkJcmVzb3VyY2VTZXQuY2xlYXJFcnJvcnMoKTsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gZ2V0TGlicmFyeSgpOwotCi0JCXVubG9ja0xpYnJhcnkoKTsKLQotCQlyZXNvdXJjZVNldC5yZXNldCgpOwotCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzZXQoKTsKLQotCQlSdW50aW1lLmdldFJ1bnRpbWUoKS5nYygpOwotCQlpZiAoTG9nLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJVc2VkIG1lbW9yeSBhZnRlciBjbG9zaW5nIGxpYnJhcnk6ICIgKyAoUnVudGltZS5nZXRSdW50aW1lKCkudG90YWxNZW1vcnkoKSAtIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCB1bmxvY2tMaWJyYXJ5KCkgewotCQkvLyByZWxlYXNlIGxvY2sgb24gb2xkIGxpYidzIHByb2plY3QKLQkJdHJ5IHsKLQkJCWlmIChsb2NrICE9IG51bGwpIHsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCQlsb2NrLmNoYW5uZWwoKS5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2NrcyB0aGUgLmxvY2sgZmlsZSBpbiB0aGUgZ2l2ZW4gcGF0aC4gQ3JlYXRlcyBhIC5sb2NrIGZpbGUgaWYgb25lIGRvZXMKLQkgKiBub3QgZXhpc3QKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgcGF0aCB0byBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgbG9ja0xpYnJhcnkoRmlsZSBsaWJEaXJGaWxlKSB7Ci0JCUZpbGUgbG9ja0ZpbGUgPSBuZXcgRmlsZShsaWJEaXJGaWxlLCBSZXNvdXJjZVV0aWwuTE9DS19GSUxFTkFNRSk7Ci0JCWxvY2sgPSBGaWxlVXRpbC5sb2NrRmlsZShsb2NrRmlsZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9YTUlPcHBvc2l0ZUZlYXR1cmVMb2FkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvWE1JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEzYjdiNTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9YTUlPcHBvc2l0ZUZlYXR1cmVMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSU9wcG9zaXRlRmVhdHVyZUxvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBsb2FkaW5nIG9mIG9wcG9zaXRlIGZlYXR1cmVzIGZvciBhIFhNSS1iYXNlZCBtZXRob2QgbGlicmFyeS4KLSAqICAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyIGltcGxlbWVudHMgSU9wcG9zaXRlRmVhdHVyZUxvYWRlciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSU9wcG9zaXRlRmVhdHVyZUxvYWRlciNsb2FkT3Bwb3NpdGVGZWF0dXJlcyhqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkT3Bwb3NpdGVGZWF0dXJlcyhDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCUhhc2hTZXQgb3Bwb3NpdGVGZWF0dXJlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUhhc2hTZXQgZGVsZXRlZEdVSURzID0gbmV3IEhhc2hTZXQoKTsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgbzsKLQkJCQlpZihyZXNvdXJjZVNldCA9PSBudWxsKSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gZS5lUmVzb3VyY2UoKTsKLQkJCQkJUmVzb3VyY2VTZXQgcnNldDsKLQkJCQkJaWYocmVzb3VyY2UgPT0gbnVsbCB8fCAhKChyc2V0ID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSkgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlyZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHJzZXQ7Ci0JCQkJfQotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlLmVBbGxDb250ZW50cygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCUNvbGxlY3Rpb24gZmVhdHVyZXMgPSAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpCi0JCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVzKCk7Ci0JCQkJCQlpZiAoZmVhdHVyZXMgIT0gbnVsbAotCQkJCQkJCQkmJiAhZmVhdHVyZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJb3Bwb3NpdGVGZWF0dXJlcwotCQkJCQkJCQkJLmFkZEFsbChmZWF0dXJlcyk7Ci0JCQkJCQkJZGVsZXRlZEdVSURzLmFkZCgoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpCi0JCQkJCQkJCQkuZ2V0R3VpZCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlDb2xsZWN0aW9uIGZlYXR1cmVzID0gZS5nZXRPcHBvc2l0ZUZlYXR1cmVzKCk7Ci0JCQkJaWYgKGZlYXR1cmVzICE9IG51bGwgJiYgIWZlYXR1cmVzLmlzRW1wdHkoKSkgewotCQkJCQlvcHBvc2l0ZUZlYXR1cmVzLmFkZEFsbChmZWF0dXJlcyk7Ci0JCQkJCWRlbGV0ZWRHVUlEcy5hZGQoZS5nZXRHdWlkKCkpOwotCQkJCX0JCQkJCi0JCQl9Ci0JCX0KLQkJCi0JCXJlc291cmNlU2V0LmxvYWRPcHBvc2l0ZUZlYXR1cmVzKG5ldyBBcnJheUxpc3Qob3Bwb3NpdGVGZWF0dXJlcyksIGRlbGV0ZWRHVUlEcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvcjEwMi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0b3IxMDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzJkNzI1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvcjEwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5pbnRlcm5hbC5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50c0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVhNSVNhdmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uSU1pZ3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uTWlncmF0aW9uUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uTWlncmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVwZ3JhZGVDYWxsZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1biAxMiwgMjAwNgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWlncmF0b3IxMDIgaW1wbGVtZW50cyBJTWlncmF0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBYTUlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmlzRGVidWdnaW5nKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZVN0YXR1cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyBtc2cpIHsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJbW9uaXRvci5zdWJUYXNrKG1zZyk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDEwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvLwotCQkJfQotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gcHJveGllc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBNYXAgcHJveHlUb0ZpbGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHByb3h5VG9GaWxlV2l0aExvYWRFcnJvck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBub3RGb3VuZFByb3hpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBwcm94aWVzV2l0aFVubm9ybWFsaXplZFVSSSA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsaWI7Ci0KLQlwcml2YXRlIE1pZ3JhdGlvblJlc291cmNlSGFuZGxlciByZXNvdXJjZUhhbmRsZXIgPSBuZXcgTWlncmF0aW9uUmVzb3VyY2VIYW5kbGVyKCkgewotCi0JCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZVVua25vd25GZWF0dXJlKEVPYmplY3Qgb3duZXIsCi0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQkJLy8gT3JkZXIgZ3JhcGggbm9kZXMgb2YgdGFzayBkZXNjcmlwdG9ycyBpbiBBREQgYmFzZWQgb24gdGhlaXIgb3JkZXIKLQkJCS8vIGluIHRoZSB0YXNrIGRlc2NyaXB0b3IgbGlzdCBvZiB0aGUgcm9sZSBkZXNjcmlwdG9yCi0JCQkvLyBvbGQgZmVhdHVyZTogUm9sZURlc2NyaXB0b3IucGVyZm9ybXNBc093bmVyCi0JCQkvLwotCQkJaWYob3duZXIgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcgotCQkJCQkmJiAicGVyZm9ybXNBc093bmVyIi5lcXVhbHMoZmVhdHVyZS5nZXROYW1lKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJJiYgdmFsdWUgIT0gbnVsbCkKLQkJCXsKLQkJCQlBcnJheUxpc3QgR1VJRHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoKFN0cmluZykgdmFsdWUpOwotCQkJCXdoaWxlKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJR1VJRHMuYWRkKHRva2Vucy5uZXh0VG9rZW4oKSk7Ci0JCQkJfQotCQkJCWlmKEdVSURzLnNpemUoKSA+IDEpIHsKLQkJCQkJQWN0aXZpdHkgYWN0ID0gKChSb2xlRGVzY3JpcHRvcilvd25lcikuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQkJCURpYWdyYW0gYWRkID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKGFjdCwgR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSwgZmFsc2UpOwotCQkJCQlpZihhZGQgIT0gbnVsbCkgewotCQkJCQkJTWFwIHRkR3VpZFRvR3JhcGhOb2RlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkJCWludCBzaXplID0gYWRkLmdldENvbnRhaW5lZCgpLnNpemUoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBhZGQuZ2V0Q29udGFpbmVkKCkuZ2V0KGkpOwotCQkJCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBHcmFwaE5vZGUpIHsKLQkJCQkJCQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9ICgoR3JhcGhOb2RlKWVsZW1lbnQpOwotCQkJCQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlIGJyaWRnZSA9IGdyYXBoTm9kZS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJCQkJCWlmIChicmlkZ2UgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSB7Ci0JCQkJCQkJCQlNZXRob2RFbGVtZW50IG1lID0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBicmlkZ2UpLmdldEVsZW1lbnQoKTsJCQkJCQkJCQotCQkJCQkJCQkJaWYobWUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJCQkJCUxpc3QgbGlzdCA9IGdyYXBoTm9kZS5nZXRMaXN0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFkpOwotCQkJCQkJCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRQcm9wZXJ0eUJ5S2V5KGxpc3QsCi0JCQkJCQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfV09SS19QUk9EVUNUX0NPTVBPU0lURV9UWVBFKTsKLQkJCQkJCQkJCQlpZiAocHJvcGVydHkgPT0gbnVsbCkgewotCQkJCQkJCQkJCQkvLyB0aGlzIGlzIG5vdCBhIEdyYXBoTm9kZSBmb3IgV29ya1Byb2R1Y3RDb21wb3NpdGUKLQkJCQkJCQkJCQkJLy8gaXQgbXVzdCBiZSBhIEdyYXBoTm9kZSBmb3IgYSBUYXNrRGVzY3JpcHRvcgotCQkJCQkJCQkJCQkvLwotCQkJCQkJCQkJCQl0ZEd1aWRUb0dyYXBoTm9kZU1hcC5wdXQobWUuZ2V0R3VpZCgpLCBncmFwaE5vZGUpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJLy8gcmVvcmRlciB0aGUgZ3JhcGggbm9kZXMgdG8gbWF0Y2ggb3JkZXIgb2YgdGhlaXIgbGlua2VkIHRhc2sgZGVzY3JpcHRvcnMKLQkJCQkJCS8vCi0JCQkJCQlBcnJheUxpc3QgZ3JhcGhOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBHVUlEcy5zaXplKCk7IGkrKykgewotCQkJCQkJCU9iamVjdCBncmFwaE5vZGUgPSB0ZEd1aWRUb0dyYXBoTm9kZU1hcC5nZXQoR1VJRHMuZ2V0KGkpKTsKLQkJCQkJCQlpZihncmFwaE5vZGUgIT0gbnVsbCkgewotCQkJCQkJCQlncmFwaE5vZGVzLmFkZChncmFwaE5vZGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWFkZC5nZXRDb250YWluZWQoKS5yZW1vdmVBbGwoZ3JhcGhOb2Rlcyk7Ci0JCQkJCQlhZGQuZ2V0Q29udGFpbmVkKCkuYWRkQWxsKGdyYXBoTm9kZXMpOwotCQkJCQl9CQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BBVEggPSBYTUlMaWJyYXJ5UmVzb3VyY2VzLmZpbGVQYXRoOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLklNaWdyYXRvciNtaWdyYXRlKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBFeGNlcHRpb24gewotCQltaWdyYXRlKGxpYlBhdGgsIG1vbml0b3IsIG51bGwpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLklNaWdyYXRvciNtaWdyYXRlKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVwZ3JhZGVDYWxsZXJJbmZvKQotCSAqLwotCXB1YmxpYyB2b2lkIG1pZ3JhdGUoU3RyaW5nIGxpYlBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVXBncmFkZUNhbGxlckluZm8gaW5mbykKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlpbml0TWlncmF0ZSgpOwotCQkKLQkJRmlsZSBsaWJGaWxlID0gbmV3IEZpbGUobGliUGF0aCk7Ci0KLQkJYm9vbGVhbiB0b1ZlcmlmeSA9IHRydWU7Ci0JCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby5nZXRJc0V4cG9ydGVkUGx1Z2luTGliKCkpIHsKLQkJCXRvVmVyaWZ5ID0gZmFsc2U7Ci0JCX0KLQkJCi0JCVJlc291cmNlVXRpbC5vcGVuKGxpYkZpbGUuZ2V0UGFyZW50KCksIG1vbml0b3IpOwotCi0JCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXQgMS4wLjIgZGVmYXVsdCB2YWx1ZXMgc28gZGF0YSBjYW4gYmUgY29ycmVjdGx5IGxvYWRlZAotCQkJLy8KLQkJCXNldE9sZERlZmF1bHRWYWx1ZXMoKTsKLQotCQkJLy8gbG9hZCB0aGUgbGlicmFyeQotCQkJLy8KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkTGlicmFyeVRhc2tfbmFtZSk7Ci0KLQkJCWlmICh0b1ZlcmlmeSkgewotCQkJCXJlc291cmNlU2V0ID0gbmV3IE11bHRpRmlsZVJlc291cmNlU2V0SW1wbChmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCXJlc291cmNlU2V0ID0gbmV3IE11bHRpRmlsZVJlc291cmNlU2V0SW1wbChmYWxzZSkgewotCQkJCQlwcm90ZWN0ZWQgdm9pZCBkZW1hbmRMb2FkKFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJCQkJaWYgKCEgc2tpcERlbWFuZExvYWQocmVzb3VyY2UpKSB7Ci0JCQkJCQkJc3VwZXIuZGVtYW5kTG9hZChyZXNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcHJpdmF0ZSBib29sZWFuIHNraXBEZW1hbmRMb2FkKFJlc291cmNlIHJlcykgewotCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQkJCWlmICghIGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5nZXROYW1lKCkuZXF1YWxzKE11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfUExVR0lOX01PREVMX0ZJTEVOQU1FKSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJCQkJCQotCQkJcmVzb3VyY2VTZXQuZ2V0TG9hZE9wdGlvbnMoKS5wdXQoCi0JCQkJCVhNTFJlc291cmNlLk9QVElPTl9SRUNPUkRfVU5LTk9XTl9GRUFUVVJFLCBCb29sZWFuLlRSVUUpOwotCQkJcmVzb3VyY2VTZXQuZ2V0TG9hZE9wdGlvbnMoKS5wdXQoCi0JCQkJCVhNTFJlc291cmNlLk9QVElPTl9SRVNPVVJDRV9IQU5ETEVSLCByZXNvdXJjZUhhbmRsZXIpOwotCQkJbGliID0gcmVzb3VyY2VTZXQubG9hZExpYnJhcnkobGliUGF0aCk7Ci0JCQkKLQkJCXJlbW92ZVByb2Nlc3NDb250cmlidXRpb25zKG1vbml0b3IpOwotCi0JCQkvLyB2ZXJpZnkgdGhlIGxpYnJhcnkKLQkJCS8vCi0JCQkvLyBUT0RPOiB1bmNvbW1lbnQgYWZ0ZXIgZXh0ZXJuYWxpemUgdGhlIHRleHQKLQkJCS8vIHVwZGF0ZVN0YXR1cyhtb25pdG9yLCAiVmVyaWZ5aW5nLi4uIik7Ci0KLQkJCWlmICh0b1ZlcmlmeSkgewotCQkJCURpc3BsYXkgZGlzID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQkJaWYgKGRpcyA9PSBudWxsIHx8IGRpcy5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7Ci0JCQkJCXZlcmlmeSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRpcy5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJdmVyaWZ5KCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCQlyZW1vdmVVbnJlc29sdmVkUmVmZXJlbmNlcyhtb25pdG9yKTsKLQkJCX0KLQkJCQotCQkJLy8gbG9hZCBhbGwgZWxlbWVudHMgaW4gbWVtb3J5Ci0JCQkvLwotCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLmxvYWRSZXNvdXJjZXNUYXNrX25hbWUpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5lQ3Jvc3NSZWZlcmVuY2VzKCkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQkJU3lzdGVtLmVycgotCQkJCQkJCQkJLnByaW50bG4oIkVycm9yIGl0ZXJhdGUgdGhydSBjcm9zcyByZWZlcmVuY2VzIG9mIGVsZW1lbnQ6ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXVwZGF0ZSgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCwgbW9uaXRvcik7Ci0JCQkJfQotCQkJfQotCi0JCQkKLQkJCQotCQkJcmVtb3ZlT2xkRGVmYXVsdFZhbHVlcygpOwotCi0JCQkvLyBjaGVjayBtb2RpZmllZCByZXNvdXJjZXMgZm9yIHdyaXRhYmxlIGJlZm9yZSBzYXZpbmcgdGhlbQotCQkJLy8KLQkJCURpc3BsYXkgZGlzID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQlpZiAoZGlzID09IG51bGwgfHwgZGlzLmdldFRocmVhZCgpID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpIHsKLQkJCQljaGVja01vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCQl9IGVsc2UgewotCQkJCWRpcy5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWNoZWNrTW9kaWZpZWRSZXNvdXJjZXMoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQkvLyBzYXZlIGFsbCBmaWxlcwotCQkJLy8KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5zYXZlTGlicmFyeVRhc2tfbmFtZSk7Ci0JCQlNYXAgc2F2ZU9wdGlvbnMgPSByZXNvdXJjZVNldC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsKLQkJCWlmICh0b1ZlcmlmeSkgewotCQkJCXNhdmVPcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUywKLQkJCQkJQm9vbGVhbi5UUlVFKTsKLQkJCX0KLQkJCXJlc291cmNlU2V0LnNhdmUoc2F2ZU9wdGlvbnMsIHRydWUpOwotCi0JCQl1cGRhdGVTdGF0dXMobW9uaXRvciwKLQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMucmVmcmVzaExpYnJhcnlGaWxlc1Rhc2tfbmFtZSk7Ci0JCQlSZXNvdXJjZVV0aWwucmVmcmVzaFJlc291cmNlcyhsaWIsIG1vbml0b3IpOwotCQkJbWlncmF0ZURpYWdyYW0obW9uaXRvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCXJlc291cmNlU2V0LnJlc2V0KCk7Ci0JCQkJcmVzb3VyY2VTZXQgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBwcm9jZXNzIGNvbnRyaWJ1dGlvbnMgZnJvbSBhbGwgcGx1Z2lucwotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVQcm9jZXNzQ29udHJpYnV0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmdldE1ldGhvZFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGgpOwotCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBBcnJheUxpc3QocGtnLmdldENoaWxkUGFja2FnZXMoKSkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1ldGhvZFBhY2thZ2UgY2hpbGRQa2cgPSAoTWV0aG9kUGFja2FnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9ICgoSW50ZXJuYWxFT2JqZWN0KSBjaGlsZFBrZykKLQkJCQkJCQkuZURpcmVjdFJlc291cmNlKCk7Ci0JCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuZGVsZXRlKHBrZyk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChyZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0JCQkJCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmNsZWFyKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tNb2RpZmllZFJlc291cmNlcygpIHsKLQkJZG8gewotCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBsaWIuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCUFycmF5TGlzdCByZWFkT25seVJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCVN0cmluZyBwbHVnaW5JZCA9IFhNSUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCk7Ci0JCQlNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMocGx1Z2luSWQsIDAsCi0JCQkJCVhNSUxpYnJhcnlSZXNvdXJjZXMuY2Fubm90V3JpdGVUb0ZpbGVzLCBudWxsKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlU2V0LmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJCWlmIChmaWxlLmV4aXN0cygpICYmICFmaWxlLmNhbldyaXRlKCkpIHsKLQkJCQkJcmVhZE9ubHlSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIHBsdWdpbklkLCAwLCBmaWxlCi0JCQkJCQkJLnRvU3RyaW5nKCksIG51bGwpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBYTUlMaWJyYXJ5UmVzb3VyY2VzLnJlYWRPbmx5RmlsZXNfdGl0bGU7Ci0JCQkJU3RyaW5nIG1zZyA9IFhNSUxpYnJhcnlSZXNvdXJjZXMucmVhZE9ubHlGaWxlc19tc2c7Ci0JCQkJRXJyb3JEaWFsb2cgZXJyRGxnID0gbmV3IEVycm9yRGlhbG9nKE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSwKLQkJCQkJCXRpdGxlLCBtc2csIHN0YXR1cywgSVN0YXR1cy5PSyB8IElTdGF0dXMuSU5GTwotCQkJCQkJCQl8IElTdGF0dXMuV0FSTklORyB8IElTdGF0dXMuRVJST1IpIHsKLQkJCQkJLyoKLQkJCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCQkgKiAKLQkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nI2NyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCQkJCQkgKi8KLQkJCQkJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQkJCQkvLyBjcmVhdGUgUmV0cnksIENhbmNlbCBhbmQgRGV0YWlscyBidXR0b25zCi0JCQkJCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELAotCQkJCQkJCQlJRGlhbG9nQ29uc3RhbnRzLlJFVFJZX0xBQkVMLCB0cnVlKTsKLQotCQkJCQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0KLQkJCQkJCWNyZWF0ZURldGFpbHNCdXR0b24ocGFyZW50KTsKLQkJCQkJfQotCi0JCQkJCS8qCi0JCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJICogCi0JCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZyNvcGVuKCkKLQkJCQkJICovCi0JCQkJCXB1YmxpYyBpbnQgb3BlbigpIHsKLQkJCQkJCXNob3dEZXRhaWxzQXJlYSgpOwotCQkJCQkJcmV0dXJuIHN1cGVyLm9wZW4oKTsKLQkJCQkJfQotCi0JCQkJfTsKLQkJCQlpZiAoZXJyRGxnLm9wZW4oKSA9PSBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCkgewotCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfSB3aGlsZSAodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlVW5yZXNvbHZlZFJlZmVyZW5jZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChwcm94aWVzVG9SZW1vdmUuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQkvLyBUT0RPOiB1bmNvbW1lbnQgYWZ0ZXIgZXh0ZXJuYWxpemUgdGhlIHRleHQKLQkJLy8gdXBkYXRlU3RhdHVzKG1vbml0b3IsICJSZW1vdmluZyB1bnJlc29sdmVkIHJlZmVyZW5jZXMiKTsKLQkJSGFzaFNldCBHVUlEcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHByb3hpZXNUb1JlbW92ZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUludGVybmFsRU9iamVjdCBwcm94eSA9IChJbnRlcm5hbEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJR1VJRHMuYWRkKHByb3h5LmVQcm94eVVSSSgpLmZyYWdtZW50KCkpOwotCQkJRWNvcmVVdGlsLnJlbW92ZShwcm94eSk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWZvciAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yIGl0ZXJhdG9yID0gKEZlYXR1cmVJdGVyYXRvcikgZWxlbWVudAotCQkJCQkuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlJbnRlcm5hbEVPYmplY3Qgb2JqID0gKEludGVybmFsRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChvYmouZUlzUHJveHkoKQotCQkJCQkJJiYgR1VJRHMuY29udGFpbnMob2JqLmVQcm94eVVSSSgpLmZyYWdtZW50KCkpKSB7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gaXRlcmF0b3IuZmVhdHVyZSgpOwotCQkJCQlpZiAoZmVhdHVyZS5pc0NoYW5nZWFibGUoKSAmJiAhZmVhdHVyZS5pc0Rlcml2ZWQoKSkgewotCQkJCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkoKExpc3QpIGVsZW1lbnQuZUdldChmZWF0dXJlKSkucmVtb3ZlKG9iaik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWVsZW1lbnQuZVNldChmZWF0dXJlLCBudWxsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaWIKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmVyaWZ5KCkgewotCQlub3RGb3VuZFByb3hpZXMuY2xlYXIoKTsKLQkJcHJveGllc1RvUmVtb3ZlLmNsZWFyKCk7Ci0JCXByb3h5VG9GaWxlTWFwLmNsZWFyKCk7Ci0JCXByb3h5VG9GaWxlV2l0aExvYWRFcnJvck1hcC5jbGVhcigpOwotCQlwcm94aWVzV2l0aFVubm9ybWFsaXplZFVSSS5jbGVhcigpOwotCi0JCUNvbGxlY3Rpb248RU9iamVjdD4gcHJveGllcyA9IFBlcnNpc3RlbmNlVXRpbC5nZXRQcm94aWVzKGxpYik7Ci0JCWlmICghcHJveGllcy5pc0VtcHR5KCkpIHsKLQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbGliLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyID0gcmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm94aWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUludGVybmFsRU9iamVjdCBwcm94eSA9IChJbnRlcm5hbEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCVVSSSB1cmkgPSBwcm94eS5lUHJveHlVUkkoKTsKLQkJCQlVUkkgbm9ybWFsaXplZFVSSSA9IHVyaUNvbnZlcnRlci5ub3JtYWxpemUodXJpKTsKLQkJCQlpZiAobm9ybWFsaXplZFVSSSA9PSBudWxsKSB7Ci0JCQkJCXByb3hpZXNXaXRoVW5ub3JtYWxpemVkVVJJLmFkZChwcm94eSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUobm9ybWFsaXplZFVSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJCQkJcHJveHlUb0ZpbGVNYXAucHV0KHByb3h5LCBmaWxlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZSgKLQkJCQkJCQkJCW5vcm1hbGl6ZWRVUkkudHJpbUZyYWdtZW50KCksIHRydWUpOwotCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRFT2JqZWN0KG5vcm1hbGl6ZWRVUkkuZnJhZ21lbnQoKSkgPT0gbnVsbCkgewotCQkJCQkJCQlub3RGb3VuZFByb3hpZXMuYWRkKHByb3h5KTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCVN0cmluZyBlcnJNc2cgPSBlLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZQotCQkJCQkJCQkJLmdldE1lc3NhZ2UoKSA6IGUudG9TdHJpbmcoKTsKLQkJCQkJCQlwcm94eVRvRmlsZVdpdGhMb2FkRXJyb3JNYXAucHV0KHByb3h5LAotCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgZmlsZSwgZXJyTXNnIH0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFwcm94eVRvRmlsZU1hcC5pc0VtcHR5KCkpIHsKLQkJCS8vIHByb21wIHVzZXIgdG8gcmVzb2x2ZSBtaXNzaW5nIGZpbGVzCi0JCQkvLwotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChwcm94eVRvRmlsZU1hcC5rZXlTZXQoKSk7Ci0JCQlmaW5hbCBTdHJpbmcgRUxFTUVOVF9QQVRIID0gWE1JTGlicmFyeVJlc291cmNlcy5lbGVtZW50UGF0aDsKLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCi0JCQkJLyoKLQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJICogCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCQkJCSAqLwotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBwcm94eVRvRmlsZU1hcC5nZXQob2JqZWN0KTsKLQkJCQkJcmV0dXJuIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKLQkJCQkJCQkrICIgKCIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgob2JqZWN0KSArICcpJzsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkJCQkgKiAgICAgIGludCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQkJY2FzZSAwOgotCQkJCQkJcmV0dXJuIHByb3h5VG9GaWxlTWFwLmdldChvYmplY3QpLnRvU3RyaW5nKCk7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgob2JqZWN0KTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCX07Ci0KLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIG1zZyA9IFhNSUxpYnJhcnlSZXNvdXJjZXMucHJvbXB0UmVtb3ZlUmVmZXJlbmNlc1RvTWlzc2luZ0ZpbGVzX21zZzsKLQkJCQlTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IFNlbGVjdGlvbkRpYWxvZyhNc2dCb3gKLQkJCQkJCS5nZXREZWZhdWx0U2hlbGwoKSwgbGlzdCwgbGFiZWxQcm92aWRlciwgbXNnKTsKLQotCQkJCWRsZy5zZXRUaXRsZShYTUlMaWJyYXJ5UmVzb3VyY2VzLm1pc3NpbmdGaWxlc190aXRsZSk7Ci0JCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWRsZy5zZXRJbml0aWFsRWxlbWVudFNlbGVjdGlvbnMobGlzdCk7Ci0JCQkJZGxnCi0JCQkJCQkuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nW10geyBGSUxFX1BBVEgsCi0JCQkJCQkJCUVMRU1FTlRfUEFUSCB9KTsKLQkJCQlpZiAoZGxnLm9wZW4oKSA9PSBEaWFsb2cuQ0FOQ0VMKSB7Ci0JCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlPYmplY3Qgb2Jqc1tdID0gZGxnLmdldFJlc3VsdCgpOwotCQkJCWlmIChvYmpzID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCXByb3hpZXNUb1JlbW92ZS5hZGQoaXRlci5uZXh0KCkpOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0KLQkJLy8gcHJvbXB0IHVzZXIgdG8gcmVzb2x2ZSBmaWxlcyB0aGF0IGNhbiBub3QgYmUgbG9hZGVkCi0JCS8vCi0JCWlmICghcHJveHlUb0ZpbGVXaXRoTG9hZEVycm9yTWFwLmlzRW1wdHkoKSkgewotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChwcm94eVRvRmlsZVdpdGhMb2FkRXJyb3JNYXAua2V5U2V0KCkpOwotCQkJZmluYWwgU3RyaW5nIExPQURfRVJST1IgPSBYTUlMaWJyYXJ5UmVzb3VyY2VzLmxvYWRFcnJvcjsKLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCi0JCQkJLyoKLQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJICogCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCQkJCSAqICAgICAgaW50KQotCQkJCSAqLwotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQkJT2JqZWN0W10gYXJyID0gKE9iamVjdFtdKSBwcm94eVRvRmlsZU1hcC5nZXQob2JqZWN0KTsKLQkJCQkJaWYgKGNvbHVtbkluZGV4IDwgMikgewotCQkJCQkJcmV0dXJuIGFycltjb2x1bW5JbmRleF0udG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCX07Ci0KLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIG1zZyA9IFhNSUxpYnJhcnlSZXNvdXJjZXMucHJvbXB0UmVtb3ZlUmVmZXJlbmNlc1RvRmlsZXNXaXRoTG9hZEVycm9yc19tc2c7Ci0JCQkJU2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBTZWxlY3Rpb25EaWFsb2coTXNnQm94Ci0JCQkJCQkuZ2V0RGVmYXVsdFNoZWxsKCksIGxpc3QsIGxhYmVsUHJvdmlkZXIsIG1zZyk7Ci0KLQkJCQlkbGcuc2V0VGl0bGUoWE1JTGlicmFyeVJlc291cmNlcy5maWxlc1dpdGhMb2FkRXJyb3JzX3RpdGxlKTsKLQkJCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZGxnLnNldEluaXRpYWxFbGVtZW50U2VsZWN0aW9ucyhsaXN0KTsKLQkJCQlkbGcuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nW10geyBGSUxFX1BBVEgsIExPQURfRVJST1IgfSk7Ci0JCQkJaWYgKGRsZy5vcGVuKCkgPT0gRGlhbG9nLkNBTkNFTCkgewotCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJT2JqZWN0IG9ianNbXSA9IGRsZy5nZXRSZXN1bHQoKTsKLQkJCQlpZiAob2JqcyA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlwcm94aWVzVG9SZW1vdmUuYWRkKGl0ZXIubmV4dCgpKTsKLQotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCi0JCUFycmF5TGlzdCBwcm94aWVzVG9SZXRhaW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXByb3hpZXMuYWRkQWxsKHByb3h5VG9GaWxlTWFwLmtleVNldCgpKTsKLQkJcHJveGllcy5hZGRBbGwocHJveHlUb0ZpbGVXaXRoTG9hZEVycm9yTWFwLmtleVNldCgpKTsKLQkJcHJveGllcy5yZW1vdmVBbGwocHJveGllc1RvUmVtb3ZlKTsKLQotCQlpZiAocHJveGllc1RvUmV0YWluLmlzRW1wdHkoKSkgewotCQkJcHJveGllc1RvUmVtb3ZlLmFkZEFsbChub3RGb3VuZFByb3hpZXMpOwotCQkJcHJveGllc1RvUmVtb3ZlLmFkZEFsbChwcm94aWVzV2l0aFVubm9ybWFsaXplZFVSSSk7Ci0JCX0KLQotCQlTdHJpbmcgbXNnID0gIlN1bW1hcnkgb2YgdW5yZXNvbHZlZCBwcm94aWVzOiI7IC8vJE5PTi1OTFMtMSQKLQkJbXNnICs9ICJcbiAgTm90IGZvdW5kIHByb3hpZXM6ICIgKyBub3RGb3VuZFByb3hpZXM7IC8vJE5PTi1OTFMtMSQKLQkJbXNnICs9ICJcbiAgUHJveGllcyB3aXRoIHVubm9ybWFsaXplZCBVUkk6ICIgKyBwcm94aWVzV2l0aFVubm9ybWFsaXplZFVSSTsgLy8kTk9OLU5MUy0xJAotCQlYTUlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dJbmZvKG1zZyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU9sZERlZmF1bHRWYWx1ZXMoKSB7Ci0JCU11bHRpUmVzb3VyY2VFT2JqZWN0LnJlbW92ZURlZmF1bHRWYWx1ZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRqdXN0VG9OZXdEZWZhdWx0VmFsdWVzKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJKChNdWx0aVJlc291cmNlRU9iamVjdCkgZSkKLQkJCQkJLnJlbW92ZUZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRPbGREZWZhdWx0VmFsdWVzKCkgewotCQlNdWx0aVJlc291cmNlRU9iamVjdC5zZXREZWZhdWx0VmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCksIEJvb2xlYW4uRkFMU0UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShNZXRob2RFbGVtZW50IGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlhZGp1c3RUb05ld0RlZmF1bHRWYWx1ZXMoZSk7Ci0KLQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBlOwotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBhY3QuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCkgewotCQkJCWFjdAotCQkJCQkJLnNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OX0xJVEVSQUwpOwotCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFU19MSVRFUkFMKSB7Ci0JCQkJYWN0Ci0JCQkJCQkuc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVF9MSVRFUkFMKTsKLQkJCX0KLQkJfQotCQlNaWdyYXRpb25VdGlsLmZvcm1hdFZhbHVlKGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0TWlncmF0ZSgpIHsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBtaWdyYXRlRGlhZ3JhbShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yMTAyXzEwMy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0b3IxMDJfMTAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlYTg5YTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0b3IxMDJfMTAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuaW50ZXJuYWwubWlncmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLS8qKgotICogQGF1dGhvciBXZWlwaW5nIEx1IC0gTWFyIDIwLCAyMDA3Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRvcjEwMl8xMDMgZXh0ZW5kcyBNaWdyYXRvcjEwMiB7Ci0KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFByb2Nlc3M+IGRpYWdyYW1FbGVtTWFwOyAKLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0TWlncmF0ZSgpIHsKLQkJZGlhZ3JhbUVsZW1NYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFByb2Nlc3M+KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShNZXRob2RFbGVtZW50IGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnVwZGF0ZShlLCBtb25pdG9yKTsKLQkJTWlncmF0b3IxMDMudXBkYXRlRWxlbWVudChlLCBkaWFncmFtRWxlbU1hcCwgbW9uaXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbWlncmF0ZURpYWdyYW0oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWlncmF0b3IxMDMuZGlhZ3JhbU1pZ3JhdGUoZGlhZ3JhbUVsZW1NYXAsIG1vbml0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yMTAzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvcjEwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZDRmYmM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yMTAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLmludGVybmFsLm1pZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuSURpYWdyYW1NaWdyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLk1pZ3JhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0vKioKLSAqIEBhdXRob3IgV2VpcGluZyBMdSAtIEZlYiAxMiwgMjAwNwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgTWlncmF0b3IxMDMgZXh0ZW5kcyBNaWdyYXRvckJhc2UgewotCQotCXByaXZhdGUgTWFwPFN0cmluZywgUHJvY2Vzcz4gZGlhZ3JhbUVsZW1NYXA7IAotCQotCXB1YmxpYyB2b2lkIG1pZ3JhdGUoU3RyaW5nIGxpYlBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW1pZ3JhdGUobGliUGF0aCwgbW9uaXRvciwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1pZ3JhdGUoU3RyaW5nIGxpYlBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVXBncmFkZUNhbGxlckluZm8gaW5mbykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGUgbGliRmlsZSA9IG5ldyBGaWxlKGxpYlBhdGgpOwotCi0JCVJlc291cmNlVXRpbC5vcGVuKGxpYkZpbGUuZ2V0UGFyZW50KCksIG1vbml0b3IpOwotCi0JCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IG51bGw7Ci0JCQotCQlkaWFncmFtRWxlbU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgUHJvY2Vzcz4oKTsKLQkJdHJ5IHsKLQkJCS8vIGxvYWQgdGhlIGxpYnJhcnkKLQkJCS8vCi0JCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZExpYnJhcnlUYXNrX25hbWUpOwotCi0JCQlyZXNvdXJjZVNldCA9IG5ldyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoZmFsc2UpOwotCQkJCQkJCi0JCQlyZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpLnB1dCgKLQkJCQkJWE1MUmVzb3VyY2UuT1BUSU9OX1JFQ09SRF9VTktOT1dOX0ZFQVRVUkUsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJCU1ldGhvZExpYnJhcnkgbGliID0gcmVzb3VyY2VTZXQubG9hZExpYnJhcnkobGliUGF0aCk7Ci0JCQkJCQkKLQkJCS8vIGxvYWQgYWxsIGVsZW1lbnRzIGluIG1lbW9yeQotCQkJLy8KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkUmVzb3VyY2VzVGFza19uYW1lKTsKLQkJCQotCQkJdXBkYXRlQWxsQ29udGVudHMobW9uaXRvciwgbGliKTsJCQkJCQotCQkJCi0JCQkvLyBzYXZlIGFsbCBmaWxlcwotCQkJLy8KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5zYXZlTGlicmFyeVRhc2tfbmFtZSk7Ci0JCQlNYXAgc2F2ZU9wdGlvbnMgPSByZXNvdXJjZVNldC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsKLQkJCXJlc291cmNlU2V0LnNhdmUoc2F2ZU9wdGlvbnMsIHRydWUpOwotCi0JCQl1cGRhdGVTdGF0dXMobW9uaXRvciwKLQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMucmVmcmVzaExpYnJhcnlGaWxlc1Rhc2tfbmFtZSk7Ci0JCQkKLQkJCQotCQkJUmVzb3VyY2VVdGlsLnJlZnJlc2hSZXNvdXJjZXMobGliLCBtb25pdG9yKTsKLQkJCQotCQkJZGlhZ3JhbU1pZ3JhdGUoZGlhZ3JhbUVsZW1NYXAsIG1vbml0b3IpOwkKLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZVNldC5yZXNldCgpOwotCQkJCXJlc291cmNlU2V0ID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGRpYWdyYW1NaWdyYXRlKE1hcDxTdHJpbmcsIFByb2Nlc3M+IGRpYWdyYW1FbGVtTWFwLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gQ29udmVydCBkaWFncmFtcyAJCQkKLQkJSURpYWdyYW1NaWdyYXRpb24gaWRtID0gKElEaWFncmFtTWlncmF0aW9uKSBFeHRlbnNpb25NYW5hZ2VyLmdldEV4dGVuc2lvbigib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pIiwgImRpYWdyYW1NaWdyYXRpb24iKTsgCQkJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmIChpZG0gIT0gbnVsbCAmJiAhZGlhZ3JhbUVsZW1NYXAuaXNFbXB0eSgpKSB7Ci0JCQl0cnkgewotCQkJCWlkbS5taWdyYXRlKGRpYWdyYW1FbGVtTWFwLnZhbHVlcygpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQl1cGRhdGVFbGVtZW50KGVsZW1lbnQsIGRpYWdyYW1FbGVtTWFwLCBtb25pdG9yKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgdXBkYXRlRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW1lbnQsIE1hcDxTdHJpbmcsIFByb2Nlc3M+IGRpYWdyYW1FbGVtTWFwLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuIHx8Ci0JCQllbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQlTdHJpbmcgZ3VpZCA9IGVsZW1lbnQuZ2V0R3VpZCgpOwotCQkJUHJvY2VzcyBwcm9jID0gZGlhZ3JhbUVsZW1NYXAuZ2V0KGd1aWQpOwotCQkJaWYgKHByb2MgPT0gbnVsbCkgewotCQkJCWRpYWdyYW1FbGVtTWFwLnB1dChlbGVtZW50LmdldEd1aWQoKSwgKFByb2Nlc3MpIGVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnQocHJvYyA9PSBlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlNaWdyYXRpb25VdGlsLmZvcm1hdFZhbHVlKGVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0b3JCYXNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvckJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDA1MjNiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvckJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5pbnRlcm5hbC5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLklNaWdyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVwZ3JhZGVDYWxsZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBpbXBsZW1lbnRhdGlvbiBmb3IgbWlncmF0b3JzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdSAtIEZlYiAxMiwgMjAwNwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWlncmF0b3JCYXNlIGltcGxlbWVudHMgSU1pZ3JhdG9yIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBYTUlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmlzRGVidWdnaW5nKCk7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHVwZGF0ZVN0YXR1cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyBtc2cpIHsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJbW9uaXRvci5zdWJUYXNrKG1zZyk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDEwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvLwotCQkJfQotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQWxsQ29udGVudHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBNZXRob2RMaWJyYXJ5IGxpYikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQl0cnkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5lQ3Jvc3NSZWZlcmVuY2VzKCkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0uZXJyCi0JCQkJCQkJCS5wcmludGxuKCJFcnJvciBpdGVyYXRlIHRocnUgY3Jvc3MgcmVmZXJlbmNlcyBvZiBlbGVtZW50OiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQl1cGRhdGVFbGVtZW50KChNZXRob2RFbGVtZW50KSBlbGVtZW50LCBtb25pdG9yKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB1cGRhdGVFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uOwkKLQkKLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb247Ci0JCi0JcHVibGljIGFic3RyYWN0IHZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBVcGdyYWRlQ2FsbGVySW5mbyBpbmZvKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9TZWxlY3Rpb25EaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL1NlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNjY0ZGZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL1NlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLmludGVybmFsLm1pZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0U2VsZWN0aW9uRGlhbG9nOwotCi0vKioKLSAqIERpc3BsYXlzIGEgZGlhbG9nIHRoYXQgbGlzdHMgbWlzc2luZyBmaWxlcyBpbiBhIG1ldGhvZCBsaWJyYXJ5IHRvIGJlIHVwZ3JhZGVkLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgTGlzdFNlbGVjdGlvbkRpYWxvZyB7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIE9iamVjdCBpbnB1dCwKLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciwKLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBpbnB1dCwgY29udGVudFByb3ZpZGVyLCBsYWJlbFByb3ZpZGVyLCBtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIExpc3QgaW5wdXQsCi0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLCBTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgaW5wdXQsIG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuICgoTGlzdCkgb2JqZWN0KS50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsCi0JCQkJCU9iamVjdCBuZXdJbnB1dCkgewotCQkJfQotCQl9LCBsYWJlbFByb3ZpZGVyLCBtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW5Qcm9wZXJ0aWVzKFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXMpIHsKLQkJdGhpcy5jb2x1bW5Qcm9wZXJ0aWVzID0gY29sdW1uUHJvcGVydGllczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjdHJsID0gc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSBjb2x1bW5zCi0JCS8vCi0JCVRhYmxlIHRhYmxlID0gZ2V0Vmlld2VyKCkuZ2V0VGFibGUoKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Qcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJsZUNvbHVtbiBjb2wgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5MRUZUKTsKLQkJCWNvbC5zZXRUZXh0KGNvbHVtblByb3BlcnRpZXNbaV0pOwotCQkJY29sLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJCWNvbC5zZXRXaWR0aCgyMDApOwotCQl9Ci0JCWdldFZpZXdlcigpLnNldENvbHVtblByb3BlcnRpZXMoY29sdW1uUHJvcGVydGllcyk7Ci0JCWdldFZpZXdlcigpLnJlZnJlc2goKTsKLQotCQlyZXR1cm4gY3RybDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzg3YzNkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBtaWdyYXRpb24gc3VwcG9ydCBmb3IgdXBncmFkaW5nIGEgWE1JLWJhc2VkIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlNzc2OGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBtYW5hZ2luZyBhIFhNSS1iYXNlZCBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYTVkZTJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBtYW5hZ2luZyBhIFhNSS1iYXNlZCBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL3ByZWZlcmVuY2VzL1hNSUxpYnJhcnlQcmVmZXJlbmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9wcmVmZXJlbmNlcy9YTUlMaWJyYXJ5UHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzI3YzQ1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL3ByZWZlcmVuY2VzL1hNSUxpYnJhcnlQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogVGhlIFhNTCBNZXRob2QgTGlicmFyeSBwcmVmZXJlbmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUlMaWJyYXJ5UHJlZmVyZW5jZXMgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgbGlicmFyeSBwYXRoIHByZWZlcmVuY2Uga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTElCUkFSWV9QQVRIID0gImRlZmF1bHRMaWJyYXJ5UGF0aCI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyB7Ci0JCS8vIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCi0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBYTUlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJU3RyaW5nIGRlZmF1bHRMaWJyYXJ5UGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIikgLy8kTk9OLU5MUy0xJAotCQkJCS8vIEZJWE1FISBBdm9pZCB1c2luZyBoYXJkIGNvZGVkIGNvbnN0YW50Ci0JCQkJKyBGaWxlVXRpbC5GSUxFX1NFUCArICJFUEYiCi0JCQkJKyBGaWxlVXRpbC5GSUxFX1NFUCArICJNZXRob2QgTGlicmFyaWVzIjsgLy8kTk9OLU5MUy0xJAotCQlzdG9yZS5zZXREZWZhdWx0KERFRkFVTFRfTElCUkFSWV9QQVRILCBkZWZhdWx0TGlicmFyeVBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgbGlicmFyeSBwYXRoIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdExpYnJhcnlQYXRoKCkgewotCQlyZXR1cm4gWE1JTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCURFRkFVTFRfTElCUkFSWV9QQVRIKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFjOWY3OTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4NGIzMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdCwKLSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwsCi0gb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIGNvbS5pYm0uaWN1Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODQ5NGVmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIG1vZGVsLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9tb2RlbC9NU19Qcm9qZWN0XzIwMDMuZ2VubW9kZWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvbW9kZWwvTVNfUHJvamVjdF8yMDAzLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2OTQ2ZjJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9tb2RlbC9NU19Qcm9qZWN0XzIwMDMuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdCIgbW9kZWxOYW1lPSJNU19Qcm9qZWN0XzIwMDMiIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLnhzZC5lY29yZS5pbXBvcnRlciI+Ci0gIDxmb3JlaWduTW9kZWw+ZmlsZTovQzovRWNsaXBzZTMxMS9NU19Qcm9qZWN0XzIwMDMueHNkPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9Ik1zcHJvamVjdCIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmVwZiIgcmVzb3VyY2U9IlhNTCIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGxvYWRJbml0aWFsaXphdGlvbj0idHJ1ZSIgZWNvcmVQYWNrYWdlPSJtc3Byb2plY3QuZWNvcmUjLyI+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9BY2NydWVBdCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0FsaWFzVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQXV0aG9yVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0Jvb2tpbmdUeXBlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQm9va2luZ1R5cGVUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQ2FsY3VsYXRpb25UeXBlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQ2F0ZWdvcnlUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Db2RlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQ29tcGFueVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0NvbnN0cmFpbnRUeXBlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQ29udGFjdFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0Nvc3RSYXRlVGFibGVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9DdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQ3VycmVuY3lTeW1ib2xUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9EYXlUeXBlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9EZWZhdWx0VGFza0VWTWV0aG9kVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRGVmYXVsdFRhc2tUeXBlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRHVyYXRpb25Gb3JtYXRUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9EdXJhdGlvbkZvcm1hdFR5cGUxIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9EdXJhdGlvbkZvcm1hdFR5cGUyIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9EdXJhdGlvbkZvcm1hdFR5cGUzIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9EdXJhdGlvbkZvcm1hdFR5cGU0Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9EdXJhdGlvbkZvcm1hdFR5cGU1Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9FYXJuZWRWYWx1ZU1ldGhvZFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0Vhcm5lZFZhbHVlTWV0aG9kVHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0VtYWlsQWRkcmVzc1R5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0V4dGVybmFsVGFza1Byb2plY3RUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9GaXhlZENvc3RBY2NydWFsVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRllTdGFydERhdGVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Hcm91cFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0h5cGVybGlua0FkZHJlc3NUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9IeXBlcmxpbmtBZGRyZXNzVHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0h5cGVybGlua0FkZHJlc3NUeXBlMiIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0h5cGVybGlua1N1YkFkZHJlc3NUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9IeXBlcmxpbmtUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9IeXBlcmxpbmtUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vSHlwZXJsaW5rVHlwZTIiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0luaXRpYWxzVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vTGFnRm9ybWF0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0xldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vTWFuYWdlclR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL01hdGVyaWFsTGFiZWxUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9OYW1lVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vTmFtZVR5cGUxIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9OYW1lVHlwZTIiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL05hbWVUeXBlMyIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vTmV3VGFza1N0YXJ0RGF0ZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL05UQWNjb3VudFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL091dGxpbmVOdW1iZXJUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9PdmVydGltZVJhdGVGb3JtYXRUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9PdmVydGltZVJhdGVGb3JtYXRUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vUGhvbmV0aWNBbGlhc1R5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1Bob25ldGljc1R5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1ByZWZpeFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1JhdGVUYWJsZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1JvbGx1cFR5cGVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9TdGFuZGFyZFJhdGVGb3JtYXRUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9TdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vU3ViamVjdFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1N1YnByb2plY3ROYW1lVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vVGl0bGVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9UeXBlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vVHlwZVR5cGUxIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9UeXBlVHlwZTIiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1R5cGVUeXBlMyIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vVHlwZVR5cGU0Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9UeXBlVHlwZTUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1VJRFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1VuaXRUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZWxpc3RTb3J0T3JkZXJUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9XZWVrU3RhcnREYXlUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Xb3JrQ29udG91clR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1dvcmtGb3JtYXRUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Xb3JrR3JvdXBUeXBlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC91SUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3Rhc2tVSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3Jlc291cmNlVUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9wZXJjZW50V29ya0NvbXBsZXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9hY3R1YWxDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9hY3R1YWxGaW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2FjdHVhbE92ZXJ0aW1lQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYWN0dWFsT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9hY3R1YWxTdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYWN0dWFsV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYUNXUCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvY29uZmlybWVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9jb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9jb3N0UmF0ZVRhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9jb3N0VmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2NWIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9kZWxheSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvZmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9maW5pc2hWYXJpYW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvaHlwZXJsaW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9oeXBlcmxpbmtBZGRyZXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9oeXBlcmxpbmtTdWJBZGRyZXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC93b3JrVmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2hhc0ZpeGVkUmF0ZVVuaXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9maXhlZE1hdGVyaWFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9sZXZlbGluZ0RlbGF5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9sZXZlbGluZ0RlbGF5Rm9ybWF0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9saW5rZWRGaWVsZHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L21pbGVzdG9uZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvbm90ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L292ZXJhbGxvY2F0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L292ZXJ0aW1lQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvb3ZlcnRpbWVXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9yZWd1bGFyV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvcmVtYWluaW5nQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvcmVtYWluaW5nT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9yZW1haW5pbmdPdmVydGltZVdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3JlbWFpbmluZ1dvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3Jlc3BvbnNlUGVuZGluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvc3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3N0b3AiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3Jlc3VtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvc3RhcnRWYXJpYW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvdW5pdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3VwZGF0ZU5lZWRlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvdkFDIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC93b3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC93b3JrQ29udG91ciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYkNXUyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYkNXUCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYm9va2luZ1R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2FjdHVhbFdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvY3JlYXRpb25EYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvZXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9iYXNlbGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3RpbWVwaGFzZWREYXRhIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnRzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudHMvYXNzaWdubWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9BdmFpbGFiaWxpdHlQZXJpb2QiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0F2YWlsYWJpbGl0eVBlcmlvZC9hdmFpbGFibGVGcm9tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXZhaWxhYmlsaXR5UGVyaW9kL2F2YWlsYWJsZVRvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXZhaWxhYmlsaXR5UGVyaW9kL2F2YWlsYWJsZVVuaXRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0F2YWlsYWJpbGl0eVBlcmlvZHMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9BdmFpbGFiaWxpdHlQZXJpb2RzL2F2YWlsYWJpbGl0eVBlcmlvZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL3RpbWVwaGFzZWREYXRhIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUvbnVtYmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUvaW50ZXJpbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL3N0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUvZmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUvZHVyYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZS9kdXJhdGlvbkZvcm1hdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL2VzdGltYXRlZER1cmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUvd29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL2Nvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZS9iQ1dTIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUvYkNXUCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMi9udW1iZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTIvd29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMi9jb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUyL2JDV1MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTIvYkNXUCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTMvdGltZXBoYXNlZERhdGEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTMvbnVtYmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUzL3N0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUzL2ZpbmlzaCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMy93b3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUzL2Nvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTMvYkNXUyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMy9iQ1dQIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0NhbGVuZGFyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9DYWxlbmRhci91SUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9DYWxlbmRhci9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQ2FsZW5kYXIvaXNCYXNlQ2FsZW5kYXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9DYWxlbmRhci9iYXNlQ2FsZW5kYXJVSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vQ2FsZW5kYXIvd2Vla0RheXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vQ2FsZW5kYXJzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vQ2FsZW5kYXJzL2NhbGVuZGFyIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0RvY3VtZW50Um9vdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0RvY3VtZW50Um9vdC9taXhlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Eb2N1bWVudFJvb3QveE1MTlNQcmVmaXhNYXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vRG9jdW1lbnRSb290L3hTSVNjaGVtYUxvY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0RvY3VtZW50Um9vdC9wcm9qZWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS9maWVsZElEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUvZmllbGROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUvYWxpYXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS9waG9uZXRpY0FsaWFzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUvcm9sbHVwVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL2NhbGN1bGF0aW9uVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL2Zvcm11bGEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS9yZXN0cmljdFZhbHVlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL3ZhbHVlbGlzdFNvcnRPcmRlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL2FwcGVuZE5ld1ZhbHVlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL2RlZmF1bHQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUvdmFsdWVMaXN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUyL3VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMi9maWVsZElEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUyL3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUyL3ZhbHVlSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTIvZHVyYXRpb25Gb3JtYXQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTMvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUzL2ZpZWxkSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTMvdmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTMvdmFsdWVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMy9kdXJhdGlvbkZvcm1hdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlNC91SUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTQvZmllbGRJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlNC92YWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlNC92YWx1ZUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGU0L2R1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlcy9leHRlbmRlZEF0dHJpYnV0ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9NYXNrIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9NYXNrL2xldmVsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vTWFzay90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vTWFzay9sZW5ndGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9NYXNrL3NlcGFyYXRvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9NYXNrcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL01hc2tzL21hc2siLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL2ZpZWxkSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS9maWVsZE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS9hbGlhcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL3Bob25ldGljQWxpYXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvdmFsdWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvZW50ZXJwcmlzZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL2VudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvbGVhZk9ubHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS9hbGxMZXZlbHNSZXF1aXJlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL29ubHlUYWJsZVZhbHVlc0FsbG93ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvbWFza3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZTIvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUyL2ZpZWxkSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZTIvdmFsdWVJRCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZTMiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlMy91SUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZTMvZmllbGRJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlMy92YWx1ZUlEIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2Rlcy9vdXRsaW5lQ29kZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9QcmVkZWNlc3NvckxpbmsiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ByZWRlY2Vzc29yTGluay9wcmVkZWNlc3NvclVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ByZWRlY2Vzc29yTGluay90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJlZGVjZXNzb3JMaW5rL2Nyb3NzUHJvamVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ByZWRlY2Vzc29yTGluay9jcm9zc1Byb2plY3ROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJlZGVjZXNzb3JMaW5rL2xpbmtMYWciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9QcmVkZWNlc3NvckxpbmsvbGFnRm9ybWF0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC90aXRsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvc3ViamVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvY2F0ZWdvcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2NvbXBhbnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L21hbmFnZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2F1dGhvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvY3JlYXRpb25EYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9yZXZpc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbGFzdFNhdmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9zY2hlZHVsZUZyb21TdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvc3RhcnREYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9maW5pc2hEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9mWVN0YXJ0RGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvY3JpdGljYWxTbGFja0xpbWl0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9jdXJyZW5jeURpZ2l0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvY3VycmVuY3lTeW1ib2wiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2N1cnJlbmN5U3ltYm9sUG9zaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2NhbGVuZGFyVUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9kZWZhdWx0U3RhcnRUaW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9kZWZhdWx0RmluaXNoVGltZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbWludXRlc1BlckRheSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbWludXRlc1BlcldlZWsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2RheXNQZXJNb250aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZGVmYXVsdFRhc2tUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9kZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZGVmYXVsdFN0YW5kYXJkUmF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZGVmYXVsdE92ZXJ0aW1lUmF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3dvcmtGb3JtYXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2VkaXRhYmxlQWN0dWFsQ29zdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2hvbm9yQ29uc3RyYWludHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2Vhcm5lZFZhbHVlTWV0aG9kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9pbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L211bHRpcGxlQ3JpdGljYWxQYXRocyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbmV3VGFza3NFZmZvcnREcml2ZW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L25ld1Rhc2tzRXN0aW1hdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9zcGxpdHNJblByb2dyZXNzVGFza3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3NwcmVhZEFjdHVhbENvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3NwcmVhZFBlcmNlbnRDb21wbGV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvdGFza1VwZGF0ZXNSZXNvdXJjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZmlzY2FsWWVhclN0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC93ZWVrU3RhcnREYXkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L21vdmVDb21wbGV0ZWRFbmRzQmFjayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2siLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L21vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9tb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2Jhc2VsaW5lRm9yRWFybmVkVmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvc3RhdHVzRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvY3VycmVudERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L21pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2F1dG9saW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9uZXdUYXNrU3RhcnREYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9kZWZhdWx0VGFza0VWTWV0aG9kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9wcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZXh0ZW5kZWRDcmVhdGlvbkRhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2FjdHVhbHNJblN5bmMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3JlbW92ZUZpbGVQcm9wZXJ0aWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9hZG1pblByb2plY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9vdXRsaW5lQ29kZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC93QlNNYXNrcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2V4dGVuZGVkQXR0cmlidXRlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2NhbGVuZGFycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3Rhc2tzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvcmVzb3VyY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvYXNzaWdubWVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vUmF0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmF0ZS9yYXRlc0Zyb20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SYXRlL3JhdGVzVG8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SYXRlL3JhdGVUYWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1JhdGUvc3RhbmRhcmRSYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmF0ZS9zdGFuZGFyZFJhdGVGb3JtYXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SYXRlL292ZXJ0aW1lUmF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1JhdGUvb3ZlcnRpbWVSYXRlRm9ybWF0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmF0ZS9jb3N0UGVyVXNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1JhdGVzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUmF0ZXMvcmF0ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvaUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2lzTnVsbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2luaXRpYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvcGhvbmV0aWNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvblRBY2NvdW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvbWF0ZXJpYWxMYWJlbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2NvZGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9ncm91cCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3dvcmtHcm91cCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2VtYWlsQWRkcmVzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2h5cGVybGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2h5cGVybGlua0FkZHJlc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9oeXBlcmxpbmtTdWJBZGRyZXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvbWF4VW5pdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9wZWFrVW5pdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9vdmVyQWxsb2NhdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYXZhaWxhYmxlRnJvbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2F2YWlsYWJsZVRvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvc3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9maW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9jYW5MZXZlbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2FjY3J1ZUF0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvd29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3JlZ3VsYXJXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvb3ZlcnRpbWVXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYWN0dWFsV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3JlbWFpbmluZ1dvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hY3R1YWxPdmVydGltZVdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9yZW1haW5pbmdPdmVydGltZVdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9wZXJjZW50V29ya0NvbXBsZXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvc3RhbmRhcmRSYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvc3RhbmRhcmRSYXRlRm9ybWF0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvY29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL292ZXJ0aW1lUmF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL292ZXJ0aW1lUmF0ZUZvcm1hdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL292ZXJ0aW1lQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2Nvc3RQZXJVc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hY3R1YWxDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYWN0dWFsT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvcmVtYWluaW5nQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3JlbWFpbmluZ092ZXJ0aW1lQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3dvcmtWYXJpYW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2Nvc3RWYXJpYW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3NWIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvY1YiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hQ1dQIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvY2FsZW5kYXJVSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9ub3RlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2JDV1MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9iQ1dQIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvaXNHZW5lcmljIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvaXNJbmFjdGl2ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2lzRW50ZXJwcmlzZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2Jvb2tpbmdUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYWN0dWFsV29ya1Byb3RlY3RlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2FjdGl2ZURpcmVjdG9yeUdVSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9jcmVhdGlvbkRhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvZXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYmFzZWxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvb3V0bGluZUNvZGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYXZhaWxhYmlsaXR5UGVyaW9kcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9yYXRlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS90aW1lcGhhc2VkRGF0YSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZXMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZXMvcmVzb3VyY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vVGFzayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay91SUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2lEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9pc051bGwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2NyZWF0ZURhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2NvbnRhY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3dCUyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svd0JTTGV2ZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL291dGxpbmVOdW1iZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL291dGxpbmVMZXZlbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcHJpb3JpdHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3N0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9maW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2R1cmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9kdXJhdGlvbkZvcm1hdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svd29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svc3RvcCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcmVzdW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9yZXN1bWVWYWxpZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZWZmb3J0RHJpdmVuIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9yZWN1cnJpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL292ZXJBbGxvY2F0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2VzdGltYXRlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svbWlsZXN0b25lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9zdW1tYXJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9jcml0aWNhbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svaXNTdWJwcm9qZWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9pc1N1YnByb2plY3RSZWFkT25seSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svc3VicHJvamVjdE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2V4dGVybmFsVGFzayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZXh0ZXJuYWxUYXNrUHJvamVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZWFybHlTdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZWFybHlGaW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2xhdGVTdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svbGF0ZUZpbmlzaCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svc3RhcnRWYXJpYW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZmluaXNoVmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3dvcmtWYXJpYW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZnJlZVNsYWNrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay90b3RhbFNsYWNrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9maXhlZENvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2ZpeGVkQ29zdEFjY3J1YWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3BlcmNlbnRDb21wbGV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcGVyY2VudFdvcmtDb21wbGV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svY29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svb3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9vdmVydGltZVdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2FjdHVhbFN0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hY3R1YWxGaW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2FjdHVhbER1cmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hY3R1YWxDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hY3R1YWxPdmVydGltZUNvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2FjdHVhbFdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2FjdHVhbE92ZXJ0aW1lV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcmVndWxhcldvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3JlbWFpbmluZ0R1cmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9yZW1haW5pbmdDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9yZW1haW5pbmdXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9yZW1haW5pbmdPdmVydGltZUNvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3JlbWFpbmluZ092ZXJ0aW1lV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYUNXUCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svY1YiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2NvbnN0cmFpbnRUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9jYWxlbmRhclVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svY29uc3RyYWludERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2RlYWRsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9sZXZlbEFzc2lnbm1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9sZXZlbGluZ0NhblNwbGl0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9sZXZlbGluZ0RlbGF5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9sZXZlbGluZ0RlbGF5Rm9ybWF0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9wcmVMZXZlbGVkU3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3ByZUxldmVsZWRGaW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2h5cGVybGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svaHlwZXJsaW5rQWRkcmVzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svaHlwZXJsaW5rU3ViQWRkcmVzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svaWdub3JlUmVzb3VyY2VDYWxlbmRhciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svbm90ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2hpZGVCYXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3JvbGx1cCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYkNXUyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYkNXUCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcGh5c2ljYWxQZXJjZW50Q29tcGxldGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2Vhcm5lZFZhbHVlTWV0aG9kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcHJlZGVjZXNzb3JMaW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hY3R1YWxXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9leHRlbmRlZEF0dHJpYnV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2Jhc2VsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svb3V0bGluZUNvZGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay90aW1lcGhhc2VkRGF0YSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9UYXNrcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2tzL3Rhc2siLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vVGltZVBlcmlvZCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGltZVBlcmlvZC9mcm9tRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1RpbWVQZXJpb2QvdG9EYXRlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1RpbWVwaGFzZWREYXRhVHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGltZXBoYXNlZERhdGFUeXBlL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UaW1lcGhhc2VkRGF0YVR5cGUvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGltZXBoYXNlZERhdGFUeXBlL3N0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGltZXBoYXNlZERhdGFUeXBlL2ZpbmlzaCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1RpbWVwaGFzZWREYXRhVHlwZS91bml0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGltZXBoYXNlZERhdGFUeXBlL3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1ZhbHVlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZS92YWx1ZUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWUvcGFyZW50VmFsdWVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ZhbHVlL3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWUvZGVzY3JpcHRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vVmFsdWUyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZTIvaUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZTIvdmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZTIvZGVzY3JpcHRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vVmFsdWVMaXN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWVMaXN0L3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1ZhbHVlcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ZhbHVlcy9ncm91cCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZXMvdmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vV0JTTWFzayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vV0JTTWFzay9sZXZlbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dCU01hc2svdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dCU01hc2svbGVuZ3RoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vV0JTTWFzay9zZXBhcmF0b3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vV0JTTWFza3MiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dCU01hc2tzL3ZlcmlmeVVuaXF1ZUNvZGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vV0JTTWFza3MvZ2VuZXJhdGVDb2RlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dCU01hc2tzL3ByZWZpeCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9XQlNNYXNrcy93QlNNYXNrIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1dlZWtEYXkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dlZWtEYXkvZGF5VHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dlZWtEYXkvZGF5V29ya2luZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9XZWVrRGF5L3RpbWVQZXJpb2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vV2Vla0RheS93b3JraW5nVGltZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vV2Vla0RheXMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9XZWVrRGF5cy93ZWVrRGF5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1dvcmtpbmdUaW1lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Xb3JraW5nVGltZS9mcm9tVGltZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dvcmtpbmdUaW1lL3RvVGltZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9Xb3JraW5nVGltZXMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Xb3JraW5nVGltZXMvd29ya2luZ1RpbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L21vZGVsL21zcHJvamVjdC5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9tb2RlbC9tc3Byb2plY3QuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMxZWJkMjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L21vZGVsL21zcHJvamVjdC5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDU1MTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0ibXNwcm9qZWN0IgotICAgIG5zVVJJPSJodHRwOi8vZXBmLmVjbGlwc2Uub3JnL21zcHJvamVjdCIgbnNQcmVmaXg9Im1zcHJvamVjdCI+Ci0gIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZnVsbCBwcm9qZWN0IHNjaGVtYSBkZWZpbml0aW9uIGZyb20gdGhlIHByb2plY3QgbGV2ZWwgZG93biwgJiN4RDsmI3hBOyYjeDk7JiN4OTtzdGFydGluZyB3aXRoIGRhdGEgdHlwZSBkZWZpbml0aW9ucy4iLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQW5ub3RhdGlvbnM+Ci0gICAgPGRldGFpbHMga2V5PSJhcHBpbmZvIiB2YWx1ZT0iVGhlIE1pY3Jvc29mdCBQcm9qZWN0IERhdGEgSW50ZXJjaGFuZ2UgU2NoZW1hIGZvciBNaWNyb3NvZnQgUHJvamVjdCAxMC4mI3hEOyYjeEE7JiN4OTsmI3g5OyIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJBY2NydWVBdCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjY3J1ZUF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdGl2ZURpcmVjdG9yeUdVSURfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSIxNiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJBbGlhc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFsaWFzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXNzaWdubWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBc3NpZ25tZW50Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFza1VJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNvdXJjZVVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZVVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBlcmNlbnRXb3JrQ29tcGxldGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygd29yayBjb21wbGV0ZWQgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGVyY2VudFdvcmtDb21wbGV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbENvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgY29zdCBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsRmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBmaW5pc2ggZGF0ZSBvZiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZUNvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgb3ZlcnRpbWUgY29zdCBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZVdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGFtb3VudCBvZiBvdmVydGltZSB3b3JrIGluY3VycmVkIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBzdGFydCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgYW1vdW50IG9mIHdvcmsgaW5jdXJyZWQgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIGFzc2lnbm1lbnQgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29uZmlybWVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBSZXNvdXJjZSBoYXMgYWNjZXB0ZWQgYWxsIG9mIGhpcyBvciBoZXIgYXNzaWdubWVudHMuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29uZmlybWVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByb2plY3RlZCBvciBzY2hlZHVsZWQgY29zdCBvZiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdFJhdGVUYWJsZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0Nvc3RSYXRlVGFibGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvc3QgcmF0ZSB0YWJsZSB1c2VkIGZvciB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0UmF0ZVRhYmxlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY29zdCBhbmQgYmFzZWxpbmUgY29zdCBmb3IgYSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0VmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjViIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVhcm5lZCB2YWx1ZSBjb3N0IHZhcmlhbmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNWIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVsYXkiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgdGhhdCB0aGUgYXNzaWdubWVudCBpcyBkZWxheWVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlbGF5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2hWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhcmlhbmNlIG9mIHRoZSBhc3NpZ25tZW50IGZpbmlzaCBkYXRlIGZyb20gdGhlIGJhc2VsaW5lIGZpbmlzaCBkYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaFZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aXRsZSBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rQWRkcmVzc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtBZGRyZXNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rU3ViQWRkcmVzcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua1N1YkFkZHJlc3NUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkb2N1bWVudCBib29rbWFyayBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya1ZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhcmlhbmNlIG9mIGFzc2lnbm1lbnQgd29yayBmcm9tIHRoZSBiYXNlbGluZSB3b3JrIGFzIG1pbnV0ZXMgeCAxMDAwLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhhc0ZpeGVkUmF0ZVVuaXRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBVbml0cyBhcmUgRml4ZWQgUmF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIYXNGaXhlZFJhdGVVbml0cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpeGVkTWF0ZXJpYWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIGNvbnN1bXB0aW9uIG9mIHRoZSBhc3NpZ25lZCBtYXRlcmlhbCByZXNvdXJjZSBvY2N1cnMgaW4gYSBzaW5nbGUsIGZpeGVkIGFtb3VudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaXhlZE1hdGVyaWFsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxpbmdEZWxheSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlbGF5IGNhdXNlZCBieSBsZXZlbGluZy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0RlbGF5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxpbmdEZWxheUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0xldmVsaW5nRGVsYXlGb3JtYXRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgZHVyYXRpb24gb2YgdGhlIGRlbGF5LiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdEZWxheUZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxpbmtlZEZpZWxkcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgUHJvamVjdCBpcyBsaW5rZWQgdG8gYW5vdGhlciBPTEUgb2JqZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxpbmtlZEZpZWxkcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbGVzdG9uZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgYXNzaWdubWVudCBpcyBhIG1pbGVzdG9uZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNaWxlc3RvbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub3RlcyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUZXh0IG5vdGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOb3RlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJhbGxvY2F0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIGFzc2lnbm1lbnQgaXMgb3ZlcmFsbG9jYXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVyYWxsb2NhdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3VtIG9mIHRoZSBhY3R1YWwgYW5kIHJlbWFpbmluZyBvdmVydGltZSBjb3N0IG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgZm9yIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZ3VsYXJXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBub24tb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgZm9yIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlZ3VsYXJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgY29zdCBvZiBjb21wbGV0aW5nIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ0Nvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdPdmVydGltZUNvc3QiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgcHJvamVjdGVkIG92ZXJ0aW1lIGNvc3Qgb2YgY29tcGxldGluZyB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdPdmVydGltZVdvcmsiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIG92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIHRvIGNvbXBsZXRlIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ092ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ1dvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHdvcmsgc2NoZWR1bGVkIHRvIGNvbXBsZXRlIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ1dvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNwb25zZVBlbmRpbmciIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRydWUgaWYgYSByZXNwb25zZSBoYXMgbm90IGJlZW4gcmVjZWl2ZWQgZm9yIGEgVGVhbUFzc2lnbiBtZXNzYWdlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNwb25zZVBlbmRpbmciLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0b3AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSBhc3NpZ25tZW50IHdhcyBzdG9wcGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0b3AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXN1bWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSBhc3NpZ25tZW50IHJlc3VtZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzdW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnRWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhcmlhbmNlIG9mIHRoZSBhc3NpZ25tZW50IHN0YXJ0IGRhdGUgZnJvbSB0aGUgYmFzZWxpbmUgc3RhcnQgZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydFZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idW5pdHMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIHVuaXRzIGZvciB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVbml0cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVwZGF0ZU5lZWRlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVHJ1ZSBpZiB0aGUgcmVzb3VyY2UgYXNzaWduZWQgdG8gYSB0YXNrIG5lZWRzIHRvIGJlIHVwZGF0ZWQgYXMgdG8gdGhlIHN0YXR1cyBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVcGRhdGVOZWVkZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2QUMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGJhc2xpbmUgY29zdCBhbmQgdG90YWwgY29zdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWQUMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBzY2hlZHVsZWQgd29yayBmb3IgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtDb250b3VyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vV29ya0NvbnRvdXJUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdvcmsgY29udG91ciBvZiB0aGUgYXNzaWdubWVudC4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPUZsYXQsIDE9QmFjayBMb2FkZWQsIDI9RnJvbnQgTG9hZGVkLCAzPURvdWJsZSBQZWFrLCA0PUVhcmx5IFBlYWssIDU9TGF0ZSBQZWFrLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY9QmVsbCwgNz1UdXJ0bGUsIDg9Q29udG91cmVkJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya0NvbnRvdXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBvbiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSBhc3NpZ25tZW50IHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJvb2tpbmdUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQm9va2luZ1R5cGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBib29raW5nIHR5cGUgb2YgdGhlIGFzc2lnbm1lbnQuIDE9Q29tbWl0ZWQsIDI9UHJvcG9zZWQmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCb29raW5nVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFdvcmtQcm90ZWN0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIHdvcmsgaXMgcHJvdGVjdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIG92ZXJ0aW1lIHdvcmsgaXMgcHJvdGVjdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyZWF0aW9uRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgd2FzIGNyZWF0ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyZWF0aW9uRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVuZGVkQXR0cmlidXRlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0V4dGVuZGVkQXR0cmlidXRlNCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIGJhY2sgdG8gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgdGhlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgSUQsIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlbGluZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9CYXNlbGluZTMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiBiYXNlbGluZSB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGltZXBoYXNlZERhdGEiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpbWUgcGhhc2VkIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVwaGFzZWREYXRhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXNzaWdubWVudHMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXNzaWdubWVudHNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3NpZ25tZW50IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Fzc2lnbm1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBhc3NpZ25tZW50IGluIGVhY2ggQXNzaWdubWVudHMgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBc3NpZ25tZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQXV0aG9yVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXV0aG9yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkF2YWlsYWJpbGl0eVBlcmlvZCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFiaWxpdHlQZXJpb2RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdmFpbGFibGVGcm9tIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgcmVzb3VyY2UgYmVjb21lcyBhdmFpbGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgcGVyaW9kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFibGVGcm9tIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXZhaWxhYmxlVG8iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGFzdCBkYXRlIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBwZXJpb2QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJsZVRvIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXZhaWxhYmxlVW5pdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGVyY2VudGFnZSB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUgZHVyaW5nIHRoZSBzcGVjaWZpZWQgcGVyaW9kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFibGVVbml0cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkF2YWlsYWJpbGl0eVBlcmlvZHMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmlsaXR5UGVyaW9kc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImF2YWlsYWJpbGl0eVBlcmlvZCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9BdmFpbGFiaWxpdHlQZXJpb2QiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGVyaW9kIHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJpbGl0eVBlcmlvZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJhc2VsaW5lIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGltZXBoYXNlZERhdGEiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpbWUgcGhhc2VkIGRhdGEgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrIGJhc2VsaW5lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im51bWJlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBudW1iZXIgb2YgdGhlIGJhc2VsaW5lIGRhdGEgcmVjb3JkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOdW1iZXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbnRlcmltIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGlzIGlzIGFuIEludGVyaW0gQmFzZWxpbmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkludGVyaW0iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBkdXJhdGlvbiBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgRHVyYXRpb24gb2YgdGhlIFRhc2sgYmFzZWxpbmUuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRlZER1cmF0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBiYXNlbGluZSBkdXJhdGlvbiBvZiB0aGUgdGFzayB3YXMgZXN0aW1hdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFc3RpbWF0ZWREdXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIHdvcmsgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByb2plY3RlZCBjb3N0IG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIHRhc2sgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJhc2VsaW5lMiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJudW1iZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgbnVtYmVyIG9mIHRoZSBiYXNlbGluZSBkYXRhIHJlY29yZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTnVtYmVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3b3JrIGFzc2lnbmVkIHRoZSByZXNvdXJjZSB3aGVuIHRoZSBiYXNlbGluZSBpcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3QiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdGVkIGNvc3QgZm9yIHRoZSByZXNvdXJjZSB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldCBjb3N0IG9mIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygb2YgdGhlIHdvcmsgcGVyZm9ybWVkIGJ5IHRoZSByZXNvdXJjZSBmb3IgdGhlIHByb2plY3QgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJhc2VsaW5lMyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZV8uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lcGhhc2VkRGF0YSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSBwaGFzZWQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIEJhc2VsaW5lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVwaGFzZWREYXRhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibnVtYmVyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgbnVtYmVyIG9mIHRoZSBiYXNlbGluZSBkYXRhIHJlY29yZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOdW1iZXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIHN0YXJ0IGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdG90YWwgYW1vdW50IG9mIHdvcmsgc2NoZWR1bGVkIG9uIHRoZSBhc3NpZ25tZW50IHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdG90YWwgcHJvamVjdGVkIGNvc3Qgb2YgdGhlIGFzc2lnbm1lbnQgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBvbiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSBhc3NpZ25tZW50IHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCA1IDYgNyA4IDkgMTAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQm9va2luZ1R5cGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQm9va2luZ1R5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQm9va2luZ1R5cGVUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJvb2tpbmdUeXBlXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDYWxjdWxhdGlvblR5cGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsY3VsYXRpb25UeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2FsZW5kYXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsZW5kYXJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY2FsZW5kYXIuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9OYW1lVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSBjYWxlbmRhci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzQmFzZUNhbGVuZGFyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBjYWxlbmRhciBpcyBhIGJhc2UgY2FsZW5kYXIuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzQmFzZUNhbGVuZGFyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmFzZUNhbGVuZGFyVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGJhc2UgY2FsZW5kYXIgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gd2hpY2ggdGhpcyBjYWxlbmRhciBkZXBlbmRzLiBPbmx5IGFwcGxpY2FibGUgaWYgdGhlIGNhbGVuZGFyIGlzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBhIGJhc2UgY2FsZW5kYXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VDYWxlbmRhclVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndlZWtEYXlzIiBlVHlwZT0iIy8vV2Vla0RheXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiBXZWVrZGF5cyB0aGF0IGRlZmluZXMgdGhpcyBjYWxlbmRhci4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2Vla0RheXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDYWxlbmRhcnMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsZW5kYXJzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2FsZW5kYXIiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2FsZW5kYXIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDYWxlbmRhcnMgYXJlIHVzZWQgdG8gZGVmaW5lIHN0YW5kYXJkIHdvcmtpbmcgYW5kICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIG5vbi13b3JraW5nIHRpbWVzLiBQcm9qZWN0cyBtdXN0IGhhdmUgb25lIGJhc2UgY2FsZW5kYXIuIFRhc2tzIGFuZCByZXNvdXJjZXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgbWF5IGhhdmUgdGhlaXIgb3duIG5vbi1iYXNlIGNhbGVuZGFycyB3aGljaCBhcmUgYmFzZWQgb24gYSBiYXNlIGNhbGVuZGFyLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNhdGVnb3J5VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2F0ZWdvcnlfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ29kZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvZGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ29tcGFueVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbXBhbnlfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ29uc3RyYWludFR5cGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29uc3RyYWludFR5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2IDciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ29udGFjdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnRhY3RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ29zdFJhdGVUYWJsZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0UmF0ZVRhYmxlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3VycmVuY3lTeW1ib2xQb3NpdGlvbl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ3VycmVuY3lTeW1ib2xUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXJyZW5jeVN5bWJvbF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRheVR5cGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGF5VHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCA1IDYgNyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRlZmF1bHRUYXNrRVZNZXRob2RUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdFRhc2tFVk1ldGhvZF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEZWZhdWx0VGFza1R5cGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdFRhc2tUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRG9jdW1lbnRSb290Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0ibWl4ZWQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWl4ZWQiIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50V2lsZGNhcmQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iOm1peGVkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InhNTE5TUHJlZml4TWFwIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InhtbG5zOnByZWZpeCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ4U0lTY2hlbWFMb2NhdGlvbiIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmdUb1N0cmluZ01hcEVudHJ5IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ4c2k6c2NoZW1hTG9jYXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvamVjdCIgdXBwZXJCb3VuZD0iLTIiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9qZWN0IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByb2plY3QgaXMgdGhlIHRvcCBsZXZlbCBlbGVtZW50IG9mIHRoZSBkb2N1bWVudC4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2plY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRHVyYXRpb25Gb3JtYXRUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Xy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRHVyYXRpb25Gb3JtYXRUeXBlMiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Xy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRHVyYXRpb25Gb3JtYXRUeXBlMyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Xy5fM18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRHVyYXRpb25Gb3JtYXRUeXBlNCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Xy5fNF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRHVyYXRpb25Gb3JtYXRUeXBlNSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Xy5fNV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRWFybmVkVmFsdWVNZXRob2RUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWFybmVkVmFsdWVNZXRob2RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRWFybmVkVmFsdWVNZXRob2RUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVhcm5lZFZhbHVlTWV0aG9kXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJFbWFpbEFkZHJlc3NUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFbWFpbEFkZHJlc3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZW5kZWRBdHRyaWJ1dGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIFBJRCBvZiB0aGUgY3VzdG9tIGZpZWxkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGROYW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSBjdXN0b20gZmllbGQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkTmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsaWFzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vQWxpYXNUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFsaWFzIG9mIHRoZSBjdXN0b20gZmllbGQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWxpYXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwaG9uZXRpY0FsaWFzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vUGhvbmV0aWNBbGlhc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGhvbmV0aWMgcHJvbnVuY2lhdGlvbiBvZiB0aGUgYWxpYXMgb2YgdGhlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSBmaWVsZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaG9uZXRpY0FsaWFzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm9sbHVwVHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1JvbGx1cFR5cGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSG93IHJvbGx1cHMgYXJlIGNhbGN1bGF0ZWQuIFZhbHVlcyBhcmU6IDA9TWF4aW11bSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1IgZm9yIGZsYWcgZmllbGRzKSwgMT1NaW5pbXVtIChBTkQgZm9yIGZsYWcgZmllbGRzKSwgMj1Db3VudCBhbGwsIDM9U3VtLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0PUF2ZXJhZ2UsIDU9QXZlcmFnZSBGaXJzdCBTdWJsZXZlbCwgNj1Db3VudCBGaXJzdCBTdWJsZXZlbCwgNz1Db3VudCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25zdW1tYXJpZXMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUm9sbHVwVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhbGN1bGF0aW9uVHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0NhbGN1bGF0aW9uVHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHJvbGx1cHMgYXJlIGNhbGN1bGF0ZWQgZm9yIHRhc2sgYW5kIGdyb3VwIHN1bW1hcnkgcm93cy4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1Ob25lLCAxPVJvbGx1cCwgMj1DYWxjdWxhdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxjdWxhdGlvblR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmb3JtdWxhIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtdWxhIHRoYXQgTWljcm9zb2Z0IFByb2plY3QgdXNlcyB0byBwb3B1bGF0ZSB0aGUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tIHRhc2sgZmllbGQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZvcm11bGEiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXN0cmljdFZhbHVlcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgUmVzdHJpY3RWYWx1ZXM9VHJ1ZSB0aGVuIG9ubHkgdmFsdWVzIGluIHRoZSBsaXN0IGFyZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkIGluIHRoZSBmaWxlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3RyaWN0VmFsdWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVsaXN0U29ydE9yZGVyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vVmFsdWVsaXN0U29ydE9yZGVyVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkhvdyB2YWx1ZSBsaXN0cyBhcmUgc29ydGVkLiBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPURlc2NlbmRpbmcsIDE9QXNjZW5kaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlbGlzdFNvcnRPcmRlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFwcGVuZE5ld1ZhbHVlcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgQXBwZW5kTmV3VmFsdWVzPVRydWUgdGhlbiBhbnkgbmV3IHZhbHVlcyBhZGRlZCBpbiBhIHByb2plY3QgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQgdG8gdGhlIGxpc3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFwcGVuZE5ld1ZhbHVlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBwb2ludHMgdG8gdGhlIGRlZmF1bHQgdmFsdWUgaW4gdGhlIGxpc3QuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCBwcmVzZW50IGlmIG5vIGRlZmF1bHQgaXMgc2V0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsdWVMaXN0IiBlVHlwZT0iIy8vVmFsdWVMaXN0IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hlbiB2YWx1ZXMgb2YgZXh0ZW5kZWQgYXR0cmlidXRlcyBhcmUgc3BlY2lmaWVkIGFzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgb2YgZWxlbWVudHMgaW4gdGhlIHNjaGVtYSwgdGhleSBtYXkgZWl0aGVyIGJlIHNwZWNpZmllZCBieSB2YWx1ZXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYnkgcmVmZXJlbmNlcyB0byB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGlzIGxpc3QuICBBcHBsaWNhdGlvbnMgbWF5ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc3VtZSBvcmRlcmluZyBvZiB0aGUgbGlzdCBieSBvcmRlcmluZyBzcGVjaWZpZWQgaGVyZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVMaXN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZW5kZWRBdHRyaWJ1dGUyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBQSUQgb2YgdGhlIGN1c3RvbSBmaWVsZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dCBsb29rdXAgdGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBidWxrIGR1cmF0aW9uLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTk9JSwgMjA9ZSUsIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlbmRlZEF0dHJpYnV0ZTMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGVfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIFBJRCBvZiB0aGUgY3VzdG9tIGZpZWxkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0IGxvb2t1cCB0YWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRHVyYXRpb25Gb3JtYXRUeXBlMyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGJ1bGsgZHVyYXRpb24uICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuZGVkQXR0cmlidXRlNCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZV8uXzNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaWVsZCBJRCBpbiB0aGUgbG9jYWxpc2VkIGxhbmd1YWdlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dCBsb29rdXAgdGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRHVyYXRpb25Gb3JtYXRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgMjA9ZSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlbmRlZEF0dHJpYnV0ZXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGVzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZW5kZWRBdHRyaWJ1dGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRXh0ZW5kZWRBdHRyaWJ1dGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFYWNoIG9mIHRoZSBpbmRpdmlkdWFsIGVudHJpZXMgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZXMgZGVmaW5pdGlvbiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLiAgVGhlcmUgYXJlIG5vIGxpbWl0cyB0byB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoYXQgbWF5IGFwcGVhciwgYnV0IHByb2plY3QgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgd2lsbCBvbmx5IHVuZGVyc3RhbmQgRmxhZzEtRmxhZzEwLCBldGMuICBUaGlzIG11c3QgYXBwZWFyIG9uY2UgaW4gZWFjaCBFeHRlbmRlZEF0dHJpYnV0ZXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZXJuYWxUYXNrUHJvamVjdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJGaXhlZENvc3RBY2NydWFsVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRml4ZWRDb3N0QWNjcnVhbF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRllTdGFydERhdGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRllTdGFydERhdGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJHcm91cFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikdyb3VwXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua0FkZHJlc3NUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtBZGRyZXNzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua0FkZHJlc3NUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rQWRkcmVzc18uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rQWRkcmVzc1R5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtBZGRyZXNzXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rU3ViQWRkcmVzc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3NfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua1N1YkFkZHJlc3NUeXBlMiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rU3ViQWRkcmVzc18uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua1R5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua1R5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkluaXRpYWxzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW5pdGlhbHNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTGFnRm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxhZ0Zvcm1hdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0RlbGF5Rm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0RlbGF5Rm9ybWF0Xy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTWFuYWdlclR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hbmFnZXJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWFzayI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXNrXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWwiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsZXZlbCBvZiB0aGUgbWFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVHlwZVR5cGU1Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgbWFzay4gVmFsdWVzIGFyZTogMD1OdW1iZXJzLCAxPVVwcGVyIENhc2UgTGV0dGVycywgMj1Mb3dlciBDYXNlIExldHRlcnMsIDM9Q2hhcmFjdGVycyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGVuZ3RoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWF4aW11bSBsZW5ndGggaW4gY2hhcmFjdGVycyBvZiB0aGUgb3V0bGluZSBjb2RlIHZhbHVlcy4gIElmIGxlbmd0aCBpcyBhbnksIHRoZSB2YWx1ZSBpcyB6ZXJvLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZW5ndGgiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZXBhcmF0b3IiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlcGFyYXRvciB2YWx1ZSBvZiB0aGUgY29kZSB2YWx1ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNlcGFyYXRvciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1hc2tzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hc2tzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFzayIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NYXNrIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvdXIgZWxlbWVudHMgb2YgdGhlIG1hc2sgY29uc3RpdHV0ZSB0aGUgZm9ybWF0IGluIHdoaWNoIHRoZSBvdXRsaW5lIGNvZGUgbXVzdCBhcHBlYXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hc2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJNYXRlcmlhbExhYmVsVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWF0ZXJpYWxMYWJlbF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJOYW1lVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJOYW1lVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5hbWVUeXBlMiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZV8uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTmFtZVR5cGUzIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lXy5fM18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjI1NSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJOZXdUYXNrU3RhcnREYXRlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5ld1Rhc2tTdGFydERhdGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTlRBY2NvdW50VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTlRBY2NvdW50Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGxpbmVDb2RlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb3Jlc3BvbmRzIHRvIHRoZSBmaWVsZCBudW1iZXIgb2Ygb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGROYW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZE5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbGlhcyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWxpYXMgb2YgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFsaWFzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGhvbmV0aWNBbGlhcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGhvbmV0aWMgcHJvbnVuY2lhdGlvbiBvZiB0aGUgYWxpYXMgb2YgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBob25ldGljQWxpYXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWx1ZXMiIGVUeXBlPSIjLy9WYWx1ZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWVzIG9mIHRoZSB0YWJsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVudGVycHJpc2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkluZGljYXRlcyB3aGV0aGVyIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlIGlzIGFuIGVudGVycHJpc2UgY3VzdG9tIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRW50ZXJwcmlzZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHJlZmVyZW5jZSB0byBhbm90aGVyIGN1c3RvbSBmaWVsZCBmb3Igd2hpY2ggdGhpcyBpcyBhbiBhbGlhcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUgY2FuIGJlIHVzZWQgYnkgdGhlIFJlc291cmNlIFN1YnN0aXR1dGlvbiBXaXphcmQgaW4gTWljcm9zb2Z0IFByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxlYWZPbmx5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIG9yIG5vdCB2YWx1ZXMgc3BlY2lmaWVkIGluIHRoaXMgb3V0bGluZSBjb2RlIGZpZWxkIG11c3QgYmUgbGVhZiB2YWx1ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxlYWZPbmx5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWxsTGV2ZWxzUmVxdWlyZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik5ldyBjb2RlcyBtdXN0IGhhdmUgYWxsIGxldmVscyBwcmVzZW50LiAgTm90IGF2YWlsYWJsZSBmb3IgRW50ZXJwcmlzZSBDb2Rlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWxsTGV2ZWxzUmVxdWlyZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvbmx5VGFibGVWYWx1ZXNBbGxvd2VkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHZhbHVlcyBzcGVjaWZpZWQgbXVzdCBjb21lIGZyb20gdmFsdWVzIHRhYmxlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPbmx5VGFibGVWYWx1ZXNBbGxvd2VkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFza3MiIGVUeXBlPSIjLy9NYXNrcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0YWJsZSBvZiBlbnRyaWVzIHRoYXQgZGVmaW5lIHRoZSBvdXRsaW5lIGNvZGUgbWFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFza3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRsaW5lQ29kZTIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgb3V0bGluZSBjb2RlIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpZWxkIElEIGluIHRoZSBsb2NhbGlzZWQgbGFuZ3VhZ2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIGluIHRoZSB2YWx1ZSBsaXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBpbiB0aGUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZSBjb2RlIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRsaW5lQ29kZTMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGVfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgb3V0bGluZSBjb2RlIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpZWxkIElEIGluIHRoZSBsb2NhbGlzZWQgbGFuZ3VhZ2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIGluIHRoZSB2YWx1ZSBsaXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgb3V0bGluZSBjb2RlIGNvbGxlY3Rpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRsaW5lQ29kZXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGVzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0bGluZUNvZGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vT3V0bGluZUNvZGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaW5kaXZpZHVhbCBvdXRsaW5lIGNvZGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik91dGxpbmVOdW1iZXJUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lTnVtYmVyXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVJhdGVGb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyA0IDUgNyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJPdmVydGltZVJhdGVGb3JtYXRUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdF8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyA0IDUgNyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJQaG9uZXRpY0FsaWFzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhvbmV0aWNBbGlhc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlBob25ldGljc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBob25ldGljc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcmVkZWNlc3NvckxpbmsiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlZGVjZXNzb3JMaW5rXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlZGVjZXNzb3JVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcHJlZGVjZXNzb3IgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlZGVjZXNzb3JVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVHlwZVR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxpbmsgdHlwZS4gIFZhbHVlcyBhcmUgMD1GRiwgMT1GUywgMj1TRiBhbmQgMz1TUyYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3Jvc3NQcm9qZWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBwcmVkZWNlc3NvciBpcyBwYXJ0IG9mIGFub3RoZXIgcHJvamVjdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3Jvc3NQcm9qZWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3Jvc3NQcm9qZWN0TmFtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZXh0ZXJuYWwgcHJlZGVjZXNzb3IgcHJvamVjdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3Jvc3NQcm9qZWN0TmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxpbmtMYWciIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgbGFnIGluIHRlbnRocyBvZiBhIG1pbnV0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGlua0xhZyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxhZ0Zvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0xhZ0Zvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBsYWcgZm9ybWF0LiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA9ZSUsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGFnRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUHJlZml4VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlZml4Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9qZWN0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVUlEVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9OYW1lVHlwZTMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRpdGxlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVGl0bGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpdGxlIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaXRsZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1YmplY3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdWJqZWN0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdWJqZWN0IG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJqZWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2F0ZWdvcnkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9DYXRlZ29yeVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY2F0ZWdvcnkgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhdGVnb3J5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29tcGFueSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbXBhbnlUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbXBhbnkgdGhhdCBvd25zIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb21wYW55Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFuYWdlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL01hbmFnZXJUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1hbmFnZXIgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hbmFnZXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRob3IiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9BdXRob3JUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGF1dGhvciBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXV0aG9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JlYXRpb25EYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgcHJvamVjdCB3YXMgY3JlYXRlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3JlYXRpb25EYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmV2aXNpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBudW1iZXIgb2YgdGltZXMgYSBwcm9qZWN0IGhhcyBiZWVuIHNhdmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXZpc2lvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imxhc3RTYXZlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHByb2plY3Qgd2FzIGxhc3Qgc2F2ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikxhc3RTYXZlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjaGVkdWxlRnJvbVN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBwcm9qZWN0IGlzIHNjaGR1bGVkIGZyb20gdGhlIHN0YXJ0IGRhdGUgb3IgZmluaXNoIGRhdGUuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTY2hlZHVsZUZyb21TdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0RGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdGFydCBkYXRlIG9mIHRoZSBwcm9qZWN0LiBSZXF1aXJlZCBpZiBTY2hlZHVsZUZyb21TdGFydCBpcyB0cnVlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnREYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaW5pc2ggZGF0ZSBvZiB0aGUgcHJvamVjdC4gUmVxdWlyZWQgaWYgU2NoZWR1bGVGcm9tU3RhcnQgaXMgZmFsc2UuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2hEYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZllTdGFydERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9GWVN0YXJ0RGF0ZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJGaXNjYWwgWWVhciBzdGFydGluZyBtb250aC4gVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzE9SmFudWFyeSwgMj1GZWJydWFyeSwgMz1NYXJjaCwgND1BcHJpbCwgNT1NYXksIDY9SnVuZSwgNz1KdWx5LCAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7OD1BdWd1c3QsIDk9U2VwdGVtYmVyLCAxMD1PY3RvYmVyLCAxMT1Ob3ZlbWJlciwgMTI9RGVjZW1iZXIgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZZU3RhcnREYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JpdGljYWxTbGFja0xpbWl0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIGRheXMgcGFzdCBpdHMgZW5kIGRhdGUgdGhhdCBhIHRhc2sgY2FuIGdvICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtiZWZvcmUgTWljcm9zb2Z0IFByb2plY3QgbWFya3MgdGhhdCB0YXNrIGFzIGEgY3JpdGljYWwgdGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3JpdGljYWxTbGFja0xpbWl0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3VycmVuY3lEaWdpdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHN5bWJvbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3VycmVuY3lEaWdpdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjdXJyZW5jeVN5bWJvbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0N1cnJlbmN5U3ltYm9sVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjdXJyZW5jeSBzeW1ib2wgdXNlZCBpbiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3VycmVuY3lTeW1ib2wiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjdXJyZW5jeVN5bWJvbFBvc2l0aW9uIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbmN5IHN5bWJvbC4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPUJlZm9yZSwgMT1BZnRlciwgMj1CZWZvcmUgV2l0aCBTcGFjZSwgMz1BZnRlciB3aXRoIHNwYWNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXJyZW5jeVN5bWJvbFBvc2l0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FsZW5kYXJVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcm9qZWN0IGNhbGVuZGFyLiAgUmVmZXJzIHRvIGEgdmFsaWQgVUlEIGluIHRoZSAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Q2FsZW5kYXJzIGVsZW1lbnQgb2YgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBTY2hlbWEuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdFN0YXJ0VGltZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9UaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgc3RhcnQgdGltZSBvZiBuZXcgdGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRTdGFydFRpbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0RmluaXNoVGltZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9UaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZmluaXNoIHRpbWUgb2YgbmV3IHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0RmluaXNoVGltZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbnV0ZXNQZXJEYXkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBudW1iZXIgb2YgbWludXRlcyBwZXIgZGF5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNaW51dGVzUGVyRGF5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWludXRlc1BlcldlZWsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBudW1iZXIgb2YgbWludXRlcyBwZXIgd2Vlay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWludXRlc1BlcldlZWsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkYXlzUGVyTW9udGgiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBudW1iZXIgb2YgZGF5cyBwZXIgbW9udGguIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRheXNQZXJNb250aCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRUYXNrVHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0RlZmF1bHRUYXNrVHlwZVR5cGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjEiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCB0eXBlIG9mIG5ldyB0YXNrcy4gVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9Rml4ZWQgVW5pdHMsIDE9Rml4ZWQgRHVyYXRpb24sIDI9Rml4ZWQgV29yay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdFRhc2tUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9EZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBmcm9tIHdoZXJlIGZpeGVkIGNvc3RzIGFyZSBhY2NydWVkLiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzE9U3RhcnQsIDI9UHJvcmF0ZWQsIDM9RW5kIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRGaXhlZENvc3RBY2NydWFsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdFN0YW5kYXJkUmF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHN0YW5kYXJkIHJhdGUgZm9yIG5ldyByZXNvdXJjZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRTdGFuZGFyZFJhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0T3ZlcnRpbWVSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgb3ZlcnRpbWUgcmF0ZSBmb3IgbmV3IHJlc291cmNlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdE92ZXJ0aW1lUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRHVyYXRpb25Gb3JtYXRUeXBlNSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGJ1bGsgZHVyYXRpb24uICBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Mz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgMjA9ZSUsIDIxPW51bGwsICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTszNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTs1Mz1udWxsLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrRm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHdvcmsgdW5pdCBmb3JtYXQuIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsxPW0sIDI9aCwgMz1kLCA0PXcsIDU9bW8iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya0Zvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVkaXRhYmxlQWN0dWFsQ29zdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIG9yIG5vdCBhY3R1YWwgY29zdHMgYXJlIGVkaXRhYmxlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFZGl0YWJsZUFjdHVhbENvc3RzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaG9ub3JDb25zdHJhaW50cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0YXNrcyBob25vdXIgdGhlaXIgY29uc3RyYWludCBkYXRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSG9ub3JDb25zdHJhaW50cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVhcm5lZFZhbHVlTWV0aG9kIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRWFybmVkVmFsdWVNZXRob2RUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IG1ldGhvZCBmb3IgY2FsY3VsYXRpbmcgZWFybmVkIHZhbHVlLiBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MD1QZXJjZW50IENvbXBsZXRlLCAxPVBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWFybmVkVmFsdWVNZXRob2QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdG8gY2FsY3VsYXRlIHN1YnRhc2tzIGFzIHN1bW1hcnkgdGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im11bHRpcGxlQ3JpdGljYWxQYXRocyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgbXVsdGlwbGUgY3JpdGljYWwgcGF0aHMgYXJlIGNhbGN1bGF0ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik11bHRpcGxlQ3JpdGljYWxQYXRocyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5ld1Rhc2tzRWZmb3J0RHJpdmVuIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIG5ldyB0YXNrcyBhcmUgZWZmb3J0IGRyaXZlbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmV3VGFza3NFZmZvcnREcml2ZW4iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuZXdUYXNrc0VzdGltYXRlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0byBzaG93IHRoZSBlc3RpbWF0ZWQgZHVyYXRpb24gYnkgZGVmYXVsdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmV3VGFza3NFc3RpbWF0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzcGxpdHNJblByb2dyZXNzVGFza3MiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgaW4tcHJvZ3Jlc3MgdGFza3MgY2FuIGJlIHNwbGl0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTcGxpdHNJblByb2dyZXNzVGFza3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzcHJlYWRBY3R1YWxDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIGFjdHVhbCBjb3N0cyBhcmUgc3ByZWFkIHRvIHRoZSBzdGF0dXMgZGF0ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3ByZWFkQWN0dWFsQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwcmVhZFBlcmNlbnRDb21wbGV0ZSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgcGVyY2VudCBjb21wbGV0ZSBpcyBzcHJlYWQgdG8gdGhlIHN0YXR1cyBkYXRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTcHJlYWRQZXJjZW50Q29tcGxldGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXNrVXBkYXRlc1Jlc291cmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHVwZGF0ZXMgdG8gdGFza3MgdXBkYXRlIHJlc291cmNlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFza1VwZGF0ZXNSZXNvdXJjZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpc2NhbFllYXJTdGFydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIGZpc2NhbCB5ZWFyIG51bWJlcmluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaXNjYWxZZWFyU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3ZWVrU3RhcnREYXkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9XZWVrU3RhcnREYXlUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3RhcnQgZGF5IG9mIHRoZSB3ZWVrLiBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MD1TdW5kYXksIDE9TW9uZGF5LCAyPVR1ZXNkYXksIDM9V2VkbmVzZGF5LCA0PVRodXJzZGF5LCA1PUZyaWRheSwgNj1TYXR1cmRheSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrU3RhcnREYXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtb3ZlQ29tcGxldGVkRW5kc0JhY2siCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtTcGVjaWZpZXMgd2hldGhlciB0aGUgZW5kIG9mIGNvbXBsZXRlZCBwb3J0aW9ucyBvZiB0YXNrcyBzY2hlZHVsZWQgdG8gYmVnaW4gYWZ0ZXIgdGhlICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O3N0YXR1cyBkYXRlIGJ1dCBiZWd1biBlYXJseSBzaG91bGQgYmUgbW92ZWQgYmFjayB0byB0aGUgc3RhdHVzIGRhdGUuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNb3ZlQ29tcGxldGVkRW5kc0JhY2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtb3ZlUmVtYWluaW5nU3RhcnRzQmFjayIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O1NwZWNpZmllcyB3aGV0aGVyIHRoZSBiZWdpbm5pbmcgb2YgcmVtYWluaW5nIHBvcnRpb25zIG9mIHRhc2tzIHNjaGVkdWxlZCB0byBiZWdpbiBhZnRlciB0aGUgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7c3RhdHVzIGRhdGUgYnV0IGJlZ3VuIGVhcmx5IHNob3VsZCBiZSBtb3ZlZCBiYWNrIHRvIHRoZSBzdGF0dXMgZGF0ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1vdmVSZW1haW5pbmdTdGFydHNCYWNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtTcGVjaWZpZXMgd2hldGhlciB0aGUgYmVnaW5uaW5nIG9mIHJlbWFpbmluZyBwb3J0aW9ucyBvZiB0YXNrcyBzY2hlZHVsZWQgdG8gaGF2ZSBiZWd1biBsYXRlICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O3Nob3VsZCBiZSBtb3ZlZCB1cCB0byB0aGUgc3RhdHVzIGRhdGUuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O1NwZWNpZmllcyB3aGV0aGVyIHRoZSBlbmQgb2YgY29tcGxldGVkIHBvcnRpb25zIG9mIHRhc2tzIHNjaGVkdWxlZCB0byBoYXZlIGJlZW4gY29tcGxldGVkICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O2JlZm9yZSB0aGUgc3RhdHVzIGRhdGUgYnV0IGJlZ3VuIGxhdGUgc2hvdWxkIGJlIG1vdmVkIHVwIHRvIHRoZSBzdGF0dXMgZGF0ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJhc2VsaW5lRm9yRWFybmVkVmFsdWUiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9CYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzcGVjaWZpYyBiYXNlbGluZSB1c2VkIHRvIGNhbGN1bGF0ZSBWYXJpYW5jZSB2YWx1ZXMuICBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MD1CYXNlbGluZSwgMT1CYXNlbGluZSAxLCAyPUJhc2VsaW5lIDIsIDM9QmFzZWxpbmUgMywgND1CYXNlbGluZSA0LCA1PUJhc2VsaW5lIDUsIDY9QmFzZWxpbmUgNiwgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5Ozc9QmFzZWxpbmUgNywgOD1CYXNlbGluZSA4LCA5PUJhc2VsaW5lIDksIDEwPUJhc2VsaW5lIDEwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lRm9yRWFybmVkVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdG8gYXV0b21hdGljYWxseSBhZGQgbmV3IHJlc291cmNlcyB0byB0aGUgcmVzb3VyY2UgcG9vbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhdHVzRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRhdGUgdXNlZCBmb3IgY2FsY3VsYXRpb24gYW5kIHJlcG9ydGluZy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhdHVzRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN1cnJlbnREYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN5c3RlbSBkYXRlIHRoYXQgdGhlIFhNTCB3YXMgZ2VuZXJhdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXJyZW50RGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHByb2plY3Qgd2FzIGNyZWF0ZWQgYnkgYSBQcm9qZWN0IFNlcnZlciB1c2VyIGFzIG9wcG9zZWQgdG8gYW4gTlQgdXNlci4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRvbGluayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0byBhdXRvbGluayBpbnNlcnRlZCBvciBtb3ZlZCB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXV0b2xpbmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuZXdUYXNrU3RhcnREYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTmV3VGFza1N0YXJ0RGF0ZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBkYXRlIGZvciBuZXcgdGFza3Mgc3RhcnQuICBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MD1Qcm9qZWN0IFN0YXJ0IERhdGUsIDE9Q3VycmVudCBEYXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5ld1Rhc2tTdGFydERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0VGFza0VWTWV0aG9kIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBlYXJuZWQgdmFsdWUgbWV0aG9kIGZvciB0YXNrcy4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPVBlcmNlbnQgQ29tcGxldGUsIDE9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0VGFza0VWTWV0aG9kIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdEV4dGVybmFsbHlFZGl0ZWQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHByb2plY3QgWE1MIHdhcyBlZGl0ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2plY3RFeHRlcm5hbGx5RWRpdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZW5kZWRDcmVhdGlvbkRhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEYXRlIHVzZWQgZm9yIGNhbGN1bGF0aW9uIGFuZCByZXBvcnRpbmcuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQ3JlYXRpb25EYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsc0luU3luYyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBhbGwgYWN0dWFsIHdvcmsgaGFzIGJlZW4gc3luY2hyb25pemVkIHdpdGggdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbHNJblN5bmMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1vdmVGaWxlUHJvcGVydGllcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0byByZW1vdmUgYWxsIGZpbGUgcHJvcGVydGllcyBvbiBzYXZlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1vdmVGaWxlUHJvcGVydGllcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFkbWluUHJvamVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcHJvamVjdCBpcyBhbiBhZG1pbmlzdHJhdGl2ZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBZG1pblByb2plY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRsaW5lQ29kZXMiIGVUeXBlPSIjLy9PdXRsaW5lQ29kZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiBvdXRsaW5lIGNvZGUgZGVmaW5pdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9qZWN0LiAgVGhlc2UgY29kZXMgbWF5IGJlIGFzc29jaWF0ZWQgb25seSB3aXRoIHRoaXMgcHJvamVjdCwgb3IgbWF5IGJlIGNvbW1vbiBhbW9uZyBzZXZlcmFsIHByb2plY3RzIChlbnRlcnByaXNlIGNvZGVzKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id0JTTWFza3MiIGVUeXBlPSIjLy9XQlNNYXNrcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0YWJsZSBvZiBlbnRyaWVzIHRoYXQgZGVmaW5lIHRoZSBvdXRsaW5lIGNvZGUgbWFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV0JTTWFza3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlbmRlZEF0dHJpYnV0ZXMiIGVUeXBlPSIjLy9FeHRlbmRlZEF0dHJpYnV0ZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiBleHRlbmRlZCBhdHRyaWJ1dGUgKGN1c3RvbSBmaWVsZCkgZGVmaW5pdGlvbnMgJiN4RDsmI3hBOyAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYWxlbmRhcnMiIGVUeXBlPSIjLy9DYWxlbmRhcnMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiBjYWxlbmRhcnMgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlICYjeEQ7JiN4QTsgICAgICAgIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFycyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhc2tzIiBlVHlwZT0iIy8vVGFza3MiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiB0YXNrcyB0aGF0IG1ha2UgdXAgdGhlIHByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzb3VyY2VzIiBlVHlwZT0iIy8vUmVzb3VyY2VzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgcmVzb3VyY2VzIHRoYXQgbWFrZSB1cCB0aGUgcHJvamVjdC4mI3hEOyYjeEE7ICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzb3VyY2VzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzaWdubWVudHMiIGVUeXBlPSIjLy9Bc3NpZ25tZW50cyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIGFzc2lnbm1lbnRzIHRoYXQgbWFrZSB1cCB0aGUgcHJvamVjdC4mI3hEOyYjeEE7ICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBc3NpZ25tZW50cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJhdGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhdGVzRnJvbSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHJhdGUgYmVjb21lcyBlZmZlY3RpdmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVzRnJvbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhdGVzVG8iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGFzdCBkYXRlIHRoYXQgdGhlIHJhdGUgaXMgZWZmZWN0aXZlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlc1RvIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmF0ZVRhYmxlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vUmF0ZVRhYmxlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmF0ZSB0YWJsZSBmb3IgdGhlIHJlc291cmNlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPUEsIDE9QiwgMj1DLCAzPUQsIDQ9RSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlVGFibGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFuZGFyZFJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdGFuZGFyZCByYXRlIGZvciB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwZXJpb2Qgc3BlY2lmaWVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFuZGFyZFJhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFuZGFyZFJhdGVGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdGFuZGFyZFJhdGVGb3JtYXRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXRzIHVzZWQgYnkgTWljcm9zb2Z0IFByb2plY3QgdG8gZGlzcGxheSB0aGUgc3RhbmRhcmQgcmF0ZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZUZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lUmF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG92ZXJ0aW1lIHJhdGUgZm9yIHRoZSByZXNvdXJjZSBmb3IgdGhlIHBlcmlvZCBzcGVjaWZpZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lUmF0ZUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL092ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pdHMgdXNlZCBieSBNaWNyb3NvZnQgUHJvamVjdCB0byBkaXNwbGF5IHRoZSBvdmVydGltZSByYXRlLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vLCA3PXkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdFBlclVzZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvc3QgcGVyIHVzZSBvZiB0aGUgcmVzb3VyY2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RQZXJVc2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSYXRlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJhdGUiIHVwcGVyQm91bmQ9IjI1IiBlVHlwZT0iIy8vUmF0ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZpbml0aW9uIG9mIGEgdGltZSBwZXJpb2QsIGFuZCB0aGUgcmF0ZXMgYXBwbGljYWJsZSBmb3IgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlc291cmNlIGR1cmluZyB0aGF0IHBlcmlvZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlJhdGVUYWJsZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlVGFibGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVzb3VyY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzb3VyY2VfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcG9zaXRpb24gaWRlbnRpZmllciBvZiB0aGUgcmVzb3VyY2Ugd2l0aGluIHRoZSBsaXN0IG9mIHJlc291cmNlcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vTmFtZVR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1R5cGVUeXBlNCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIHJlc291cmNlLiBWYWx1ZXMgYXJlOiAwPU1hdGVyaWFsLCAxPVdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzTnVsbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIG51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzTnVsbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImluaXRpYWxzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSW5pdGlhbHNUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGluaXRpYWxzIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW5pdGlhbHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwaG9uZXRpY3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9QaG9uZXRpY3NUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBob25ldGljIHNwZWxsaW5nIG9mIHRoZSByZXNvdXJjZSBuYW1lLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIHVzZSB3aXRoIEphcGFuZXNlIG9ubHkuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBob25ldGljcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5UQWNjb3VudCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL05UQWNjb3VudFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgTlQgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOVEFjY291bnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYXRlcmlhbExhYmVsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTWF0ZXJpYWxMYWJlbFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pdCBvZiBtZWFzdXJlIGZvciB0aGUgbWF0ZXJpYWwgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hdGVyaWFsTGFiZWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb2RlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vQ29kZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29kZSBvciBvdGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvZGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0dyb3VwVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBncm91cCB0byB3aGljaCB0aGUgcmVzb3VyY2UgYmVsb25ncy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iR3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrR3JvdXAiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrR3JvdXBUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2Ygd29ya2dyb3VwIHRvIHdoaWNoIHRoZSByZXNvdXJjZSBiZWxvbmdzLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPURlZmF1bHQsIDE9Tm9uZSwgMj1FbWFpbCwgMz1XZWImI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya0dyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW1haWxBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRW1haWxBZGRyZXNzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbWFpbCBhZGRyZXNzIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRW1haWxBZGRyZXNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGl0bGUgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rQWRkcmVzc1R5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtBZGRyZXNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rU3ViQWRkcmVzcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua1N1YkFkZHJlc3NUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRvY3VtZW50IGJvb2ttYXJrIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rU3ViQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1heFVuaXRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIxLjAiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWF4aW11bSBudW1iZXIgb2YgdW5pdHMgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXhVbml0cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBlYWtVbml0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXJnZXN0IG51bWJlciBvZiB1bml0cyBhc3NpZ25lZCB0byB0aGUgcmVzb3VyY2UgYXQgYW55IHRpbWUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlYWtVbml0cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJBbGxvY2F0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHJlc291cmNlIGlzIG92ZXJhbGxvY2F0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJBbGxvY2F0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdmFpbGFibGVGcm9tIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpcnN0IGRhdGUgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFibGVGcm9tIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXZhaWxhYmxlVG8iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGFzdCBkYXRlIHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJsZVRvIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIHN0YXJ0IGRhdGUgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYW5MZXZlbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcmVzb3VyY2UgY2FuIGJlIGxldmVsZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbkxldmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWNjcnVlQXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9BY2NydWVBdCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkhvdyBjb3N0IGlzIGFjY3J1ZWQgYWdhaW5zdCB0aGUgcmVzb3VyY2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDE9U3RhcnQsIDI9RW5kLCAzPVByb3JhdGVkJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjY3J1ZUF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0b3RhbCB3b3JrIGFzc2lnbmVkIHRvIHRoZSByZXNvdXJjZSBhY3Jvc3MgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVndWxhcldvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIG5vbi1vdmVydGltZSB3b3JrIGFzc2lnbmVkIHRvIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVndWxhcldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIG92ZXJ0aW1lIHdvcmsgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBhY3R1YWwgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgcmVtYWluaW5nIHdvcmsgcmVxdWlyZWQgdG8gY29tcGxldGUgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBhY3R1YWwgb3ZlcnRpbWUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdPdmVydGltZVdvcmsiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHJlbWFpbmluZyBvdmVydGltZSB3b3JrIHJlcXVpcmVkIHRvIGNvbXBsZXRlIGFsbCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVyY2VudFdvcmtDb21wbGV0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBlcmNlbnRhZ2Ugb2Ygd29yayBjb21wbGV0ZWQgYWNyb3NzIGFsbCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGVyY2VudFdvcmtDb21wbGV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YW5kYXJkUmF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN0YW5kYXJkIHJhdGUgb2YgdGhlIHJlc291cmNlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlIGV4aXN0cyBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFuZGFyZFJhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFuZGFyZFJhdGVGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIHN0YW5kYXJkIHJhdGUuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPW0sIDI9aCwgMz1kLCA0PXcsIDU9bW8sIDc9eSwgOD1tYXRlcmlhbCByZXNvdXJjZSByYXRlIChvciBibGFuayBzeW1ib2wgc3BlY2lmaWVkKSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFuZGFyZFJhdGVGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdG90YWwgcHJvamVjdCBjb3N0IGZvciB0aGUgcmVzb3VyY2UgYWNyb3NzIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lUmF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG92ZXJ0aW1lIHJhdGUgb2YgdGhlIHJlc291cmNlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlIGV4aXN0cyBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVJhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVJhdGVGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9PdmVydGltZVJhdGVGb3JtYXRUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIG92ZXJ0aW1lIHJhdGUuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPW0sIDI9aCwgMz1kLCA0PXcsIDU9bW8sIDc9eSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVJhdGVGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZUNvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0b3RhbCBvdmVydGltZSBjb3N0IGZvciB0aGUgcmVzb3VyY2UgaW5jbHVkaW5nIGFjdHVhbCBhbmQgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3RzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0UGVyVXNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29zdCBwZXIgdXNlIG9mIHRoZSByZXNvdXJjZS4gVGhpcyB2YWx1ZSBpcyBhcyBvZiB0aGUgY3VycmVudCBkYXRlIGlmIGEgcmF0ZSB0YWJsZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFBlclVzZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbENvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgY29zdCBpbmN1cnJlZCBieSB0aGUgcmVzb3VyY2UgYWNyb3NzIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBvdmVydGltZSBjb3N0IGluY3VycmVkIGJ5IHRoZSByZXNvdXJjZSBhY3Jvc3MgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHByb2plY3RlZCBjb3N0IG9mIHRoZSByZXNvdXJjZSB0byBjb21wbGV0ZSBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ0Nvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdPdmVydGltZUNvc3QiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgcHJvamVjdGVkIG92ZXJ0aW1lIGNvc3Qgb2YgdGhlIHJlc291cmNlIHRvIGNvbXBsZXRlIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya1ZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYmFzZWxpbmUgd29yayBhbmQgdGhlIHdvcmsgYXMgbWludXRlcyB4IDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3RWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGJhc2VsaW5lIGNvc3QgYW5kIHRoZSBjb3N0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0VmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzViIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVhcm5lZCB2YWx1ZSBzY2hlZHVsZSB2YXJpYW5jZSwgdGhyb3VnaCB0aGUgcHJvamVjdCBzdGF0dXMgZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU1YiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjViIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVhcm5lZCB2YWx1ZSBjb3N0IHZhcmlhbmNlLCB0aHJvdWdoIHRoZSBwcm9qZWN0IHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDViIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGNvc3Qgb2YgdGhlIHdvcmsgcGVyZm9ybWVkIGJ5IHRoZSByZXNvdXJjZSBmb3IgdGhlIHByb2plY3QgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQUNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhbGVuZGFyVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVzb3VyY2UgY2FsZW5kYXIuUmVmZXJzIHRvIGEgdmFsaWQgVUlEIGluIHRoZSBDYWxlbmRhcnMgZWxlbWVudCBvZiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgTWljcm9zb2Z0IFByb2plY3QgWE1MIFNjaGVtYS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsZW5kYXJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub3RlcyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUZXh0IG5vdGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5vdGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXQgY29zdCBvZiB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIG9mIHRoZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwcm9qZWN0IHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0dlbmVyaWMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBnZW5lcmljLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc0dlbmVyaWMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0luYWN0aXZlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgc2V0IHRvIGluYWN0aXZlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc0luYWN0aXZlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNFbnRlcnByaXNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgYW4gRW50ZXJwcmlzZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNFbnRlcnByaXNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYm9va2luZ1R5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Cb29raW5nVHlwZVR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBib29raW5nIHR5cGUgb2YgdGhlIHJlc291cmNlLiAxPUNvbW1pdGVkLCAyPVByb3Bvc2VkJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJvb2tpbmdUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsV29ya1Byb3RlY3RlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIG92ZXJ0aW1lIHdvcmsgaXMgcHJvdGVjdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3RpdmVEaXJlY3RvcnlHVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgQWN0aXZlIERpcmVjdG9yeSBHVUlEIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdGl2ZURpcmVjdG9yeUdVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcmVhdGlvbkRhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSB3YXMgY3JlYXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3JlYXRpb25EYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZW5kZWRBdHRyaWJ1dGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRXh0ZW5kZWRBdHRyaWJ1dGUzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIG9mIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIGJhY2sgdG8gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgdGhlIEZpZWxkIElELCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHZhbHVlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VsaW5lIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Jhc2VsaW5lMiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBiYXNlbGluZSB2YWx1ZXMgZm9yIHRoZSByZXNvdXJjZXMuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0bGluZUNvZGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vT3V0bGluZUNvZGUzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIG9mIGFuIG91dGxpbmUgY29kZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gYSBwb2ludGVyIGJhY2sgdG8gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG91dGxpbmUgY29kZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgdGhlIEZpZWxkIElELCBhbmQgdGhlIHZhbHVlIHdoaWNoIGlzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImF2YWlsYWJpbGl0eVBlcmlvZHMiIGVUeXBlPSIjLy9BdmFpbGFiaWxpdHlQZXJpb2RzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBjb2xsZWN0aW9uIG9mIHBlcmlvZHMgZHVyaW5nIHdoaWNoIHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJpbGl0eVBlcmlvZHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyYXRlcyIgZVR5cGU9IiMvL1JhdGVzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBjb2xsZWN0aW9uIG9mIHBlcmlvZHMgYW5kIHRoZSByYXRlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBvbmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGltZXBoYXNlZERhdGEiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpbWUgcGhhc2VkIGRhdGEmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGEiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXNvdXJjZXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzb3VyY2VzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzb3VyY2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUmVzb3VyY2UiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSByZXNvdXJjZSBpbiBlYWNoIFJlc291cmNlcyBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlJvbGx1cFR5cGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUm9sbHVwVHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCA1IDYgNyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTdGFuZGFyZFJhdGVGb3JtYXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlRm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1IDciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFuZGFyZFJhdGVGb3JtYXRfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1IDcgOCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTdWJqZWN0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3ViamVjdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTdWJwcm9qZWN0TmFtZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YnByb2plY3ROYW1lXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2siPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFza18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwb3NpdGlvbiBpZGVudGlmaWVyIG9mIHRoZSB0YXNrIHdpdGhpbiB0aGUgbGlzdCBvZiB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vTmFtZVR5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiB0YXNrLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPUZpeGVkIFVuaXRzLCAxPUZpeGVkIER1cmF0aW9uLCAyPUZpeGVkIFdvcmsuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc051bGwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB3aGV0aGVyIHRoZSB0YXNrIGlzIG51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzTnVsbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyZWF0ZURhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSB0YXNrIHdhcyBjcmVhdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcmVhdGVEYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29udGFjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnRhY3RUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbnRhY3QgcGVyc29uIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGFjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndCUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIGNvZGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldCUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndCU0xldmVsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByaWdodG1vc3QgV0JTIGxldmVsIG9mIHRoZSB0YXNrLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV0JTTGV2ZWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdXRsaW5lTnVtYmVyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vT3V0bGluZU51bWJlclR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgb3V0bGluZSBudW1iZXIgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVOdW1iZXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdXRsaW5lTGV2ZWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBvdXRsaW5lIGxldmVsIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lTGV2ZWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmlvcml0eSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByaW9yaXR5IG9mIHRoZSB0YXNrIGZyb20gMCB0byAxMDAwLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmlvcml0eSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBsYW5uZWQgZHVyYXRpb24gb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGU0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgRHVyYXRpb24gb2YgdGhlIFRhc2suICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHNjaGVkdWxlZCB3b3JrIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0b3AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSB0YXNrIHdhcyBzdG9wcGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdG9wIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgdGFzayByZXN1bWVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXN1bWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXN1bWVWYWxpZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBjYW4gYmUgcmVzdW1lZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzdW1lVmFsaWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlZmZvcnREcml2ZW4iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgZWZmb3J0LWRyaXZlbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWZmb3J0RHJpdmVuIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVjdXJyaW5nIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGEgcmVjdXJyaW5nIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlY3VycmluZyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJBbGxvY2F0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgb3ZlcmFsbG9jYXRlZC4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGluZm9ybWF0aW9uYWwgb25seS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlckFsbG9jYXRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBlc3RpbWF0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbGVzdG9uZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBhIG1pbGVzdG9uZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWlsZXN0b25lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3VtbWFyeSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBhIHN1bW1hcnkgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3VtbWFyeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyaXRpY2FsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGluIHRoZSBjcml0aWNhbCBjaGFpbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3JpdGljYWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1N1YnByb2plY3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgYW4gaW5zZXJ0ZWQgcHJvamVjdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNTdWJwcm9qZWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNTdWJwcm9qZWN0UmVhZE9ubHkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIGluc2VydGVkIHByb2plY3QgaXMgcmVhZC1vbmx5LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc1N1YnByb2plY3RSZWFkT25seSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1YnByb2plY3ROYW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3VicHJvamVjdE5hbWVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgaW5zZXJ0ZWQgcHJvamVjdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3VicHJvamVjdE5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbFRhc2siIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgZXh0ZXJuYWwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVybmFsVGFzayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsVGFza1Byb2plY3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9FeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzb3VyY2UgbG9jYXRpb24gYW5kIHRhc2sgaWRlbnRpZmllciBvZiB0aGUgZXh0ZXJuYWwgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZXJuYWxUYXNrUHJvamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVhcmx5U3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWFybHkgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWFybHlTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVhcmx5RmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVhcmx5IGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJseUZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxhdGVTdGFydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXRlIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxhdGVTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxhdGVGaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGF0ZSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGF0ZUZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0VmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYW5jZSBvZiB0aGUgdGFzayBzdGFydCBkYXRlIGZyb20gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJhc2VsaW5lIHN0YXJ0IGRhdGUgYXMgbWludXRlcyB4IDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0VmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2hWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhcmlhbmNlIG9mIHRoZSB0YXNrIGZpbmlzaCBkYXRlIGZyb20gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJhc2VsaW5lIGZpbmlzaCBkYXRlIGFzIG1pbnV0ZXMgeCAxMDAwLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2hWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYW5jZSBvZiB0YXNrIHdvcmsgZnJvbSB0aGUgYmFzZWxpbmUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzayB3b3JrIGFzIG1pbnV0ZXMgeCAxMDAwLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrVmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmcmVlU2xhY2siIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgZnJlZSBzbGFjay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRnJlZVNsYWNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idG90YWxTbGFjayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiB0b3RhbCBzbGFjay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVG90YWxTbGFjayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpeGVkQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaXhlZCBjb3N0IG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaXhlZENvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaXhlZENvc3RBY2NydWFsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRml4ZWRDb3N0QWNjcnVhbFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJIb3cgdGhlIGZpeGVkIGNvc3QgaXMgYWNjcnVlZCBhZ2FpbnN0IHRoZSB0YXNrLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAxPVN0YXJ0LCAyPVByb3JhdGVkIGFuZCAzPUVuZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRml4ZWRDb3N0QWNjcnVhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBlcmNlbnRDb21wbGV0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhc2sgZHVyYXRpb24gY29tcGxldGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJjZW50Q29tcGxldGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZXJjZW50V29ya0NvbXBsZXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGVyY2VudGFnZSBvZiB0aGUgdGFzayB3b3JrIGNvbXBsZXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGVyY2VudFdvcmtDb21wbGV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3QiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcm9qZWN0ZWQgb3Igc2NoZWR1bGVkIGNvc3Qgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZUNvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdW0gb2YgdGhlIGFjdHVhbCBhbmQgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3Qgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxTdGFydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxGaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxEdXJhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgZHVyYXRpb24gb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbER1cmF0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBjb3N0IG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIG92ZXJ0aW1lIGNvc3Qgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHdvcmsgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBvdmVydGltZSB3b3JrIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVndWxhcldvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIG5vbi1vdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlZ3VsYXJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nRHVyYXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHRpbWUgcmVxdWlyZWQgdG8gY29tcGxldGUgdGhlIHVuZmluaXNoZWQgcG9ydGlvbiBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nRHVyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHByb2plY3RlZCBjb3N0IG9mIGNvbXBsZXRpbmcgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ0Nvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyB3b3JrIHNjaGVkdWxlZCB0byBjb21wbGV0ZSB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lQ29zdCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBvdmVydGltZSBjb3N0IHByb2plY3RlZCB0byBmaW5pc2ggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ092ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lV29yayIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgdG8gZmluaXNoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSB0YXNrIHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjViIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVhcm5lZCB2YWx1ZSBjb3N0IHZhcmlhbmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDViIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbnN0cmFpbnRUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ29uc3RyYWludFR5cGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbnN0cmFpbnQgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPUFzIFNvb24gQXMgUG9zc2libGUsIDE9QXMgTGF0ZSBBcyBQb3NzaWJsZSwgMj1NdXN0IFN0YXJ0IE9uLCAzPU11c3QgRmluaXNoIE9uLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0PVN0YXJ0IE5vIEVhcmxpZXIgVGhhbiwgNT1TdGFydCBObyBMYXRlciBUaGFuLCA2PUZpbmlzaCBObyBFYXJsaWVyIFRoYW4gYW5kIDc9RmluaXNoIE5vIExhdGVyIFRoYW4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29uc3RyYWludFR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYWxlbmRhclVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRhc2sgY2FsZW5kYXIuUmVmZXJzIHRvIGEgdmFsaWQgVUlEIGluIHRoZSBDYWxlbmRhcnMgZWxlbWVudCBvZiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgTWljcm9zb2Z0IFByb2plY3QgWE1MIFNjaGVtYS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsZW5kYXJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25zdHJhaW50RGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIGFyZ3VtZW50IGZvciB0aGUgdGFzayBjb25zdHJhaW50IHR5cGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnN0cmFpbnREYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVhZGxpbmUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVhZGxpbmUgZm9yIHRoZSB0YXNrIHRvIGJlIGNvbXBsZXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVhZGxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbEFzc2lnbm1lbnRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIGxldmVsaW5nIGNhbiBhZGp1c3QgYXNzaWdubWVudHMuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsQXNzaWdubWVudHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbGluZ0NhblNwbGl0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIGxldmVsaW5nIGNhbiBzcGxpdCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdDYW5TcGxpdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsaW5nRGVsYXkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWxheSBjYXVzZWQgYnkgbGV2ZWxpbmcgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbGluZ0RlbGF5Rm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgZHVyYXRpb24gb2YgdGhlIGRlbGF5LiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA9ZSUsIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdEZWxheUZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZUxldmVsZWRTdGFydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdGFydCBkYXRlIG9mIHRoZSB0YXNrIGJlZm9yZSBpdCB3YXMgbGV2ZWxlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlTGV2ZWxlZFN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlTGV2ZWxlZEZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzayBiZWZvcmUgaXQgd2FzIGxldmVsZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZUxldmVsZWRGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtUeXBlMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aXRsZSBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rQWRkcmVzcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua0FkZHJlc3NUeXBlMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtBZGRyZXNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rU3ViQWRkcmVzcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua1N1YkFkZHJlc3NUeXBlMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkb2N1bWVudCBib29rbWFyayBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rU3ViQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imlnbm9yZVJlc291cmNlQ2FsZW5kYXIiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaWdub3JlcyB0aGUgcmVzb3VyY2UgY2FsZW5kYXIuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Iklnbm9yZVJlc291cmNlQ2FsZW5kYXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub3RlcyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUZXh0IG5vdGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTm90ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoaWRlQmFyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBHQU5UVCBiYXIgb2YgdGhlIHRhc2sgaXMgaGlkZGVuIHdoZW4gZGlzcGxheWVkIGluIE1pY3Jvc29mdCBQcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIaWRlQmFyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm9sbHVwIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIHJvbGxlZCB1cC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUm9sbHVwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgdGFzayB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGh5c2ljYWxQZXJjZW50Q29tcGxldGUiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJjZW50YWdlIGNvbXBsZXRlIHZhbHVlIGVudGVyZWQgYnkgdGhlIFByb2plY3QgTWFuYWdlci4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY2FuIGJlIHVzZWQgYXMgYW4gYWx0ZXJuYXRpdmUgZm9yIGNhbGN1bGF0aW5nIEJDV1AuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBoeXNpY2FsUGVyY2VudENvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWFybmVkVmFsdWVNZXRob2QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9FYXJuZWRWYWx1ZU1ldGhvZFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWV0aG9kIGZvciBjYWxjdWxhdGluZyBlYXJuZWQgdmFsdWUuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9UGVyY2VudCBDb21wbGV0ZSwgMT1QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVhcm5lZFZhbHVlTWV0aG9kIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZGVjZXNzb3JMaW5rIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1ByZWRlY2Vzc29yTGluayIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgdGhlIHByZWRlY2Vzc29yIHRhc2sgb2YgdGhlIHRhc2sgdGhhdCBjb250YWlucyBpdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlZGVjZXNzb3JMaW5rIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsV29ya1Byb3RlY3RlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIG92ZXJ0aW1lIHdvcmsgaXMgcHJvdGVjdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlbmRlZEF0dHJpYnV0ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9FeHRlbmRlZEF0dHJpYnV0ZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgYW4gZXh0ZW5kZWQgYXR0cmlidXRlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgYmFjayB0byB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgRmllbGQgSUQsIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZWxpbmUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQmFzZWxpbmUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiBiYXNlbGluZSB2YWx1ZXMgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0bGluZUNvZGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vT3V0bGluZUNvZGUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIG9mIGFuIG91dGxpbmUgY29kZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIGJhY2sgdG8gdGhlIG91dGxpbmUgY29kZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgdGhlIEZpZWxkIElELCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHZhbHVlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVwaGFzZWREYXRhIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHBoYXNlZCBkYXRhIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGEiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhc2siIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFzayIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIHRhc2sgaW4gZWFjaCBUYXNrcyBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGltZVBlcmlvZCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lUGVyaW9kXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZnJvbURhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYmVnaW5uaW5nIG9mIHRoZSBleGNlcHRpb24gdGltZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZyb21EYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idG9EYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVuZCBvZiB0aGUgZXhjZXB0aW9uIHRpbWUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUb0RhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUaW1lcGhhc2VkRGF0YVR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZpbml0aW9uIG9mIHRoZSB0aW1lIHBoYXNlZCBkYXRhIGJsb2NrLiYjeEQ7JiN4QTsmI3g5OyYjeDk7ICAgICAgICAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVwaGFzZWREYXRhVHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1R5cGVUeXBlMyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgVGhlIHR5cGUgb2YgdGFzayB0aW1lcGhhc2VkIGRhdGEuIFZhbHVlcyBhcmU6JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMT1Bc3NpZ25tZW50IFJlbWFpbmluZyBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMj1Bc3NpZ25tZW50IEFjdHVhbCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMz1Bc3NpZ25tZW50IEFjdHVhbCBPdmVydGltZSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgND1Bc3NpZ25tZW50IEJhc2VsaW5lIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1PUFzc2lnbm1lbnQgQmFzZWxpbmUgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY9QXNzaWdubWVudCBBY3R1YWwgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDc9UmVzb3VyY2UgQmFzZWxpbmUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDg9UmVzb3VyY2UgQmFzZWxpbmUgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDk9VGFzayBCYXNlbGluZSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMTA9VGFzayBCYXNlbGluZSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMTE9VGFzayBQZXJjZW50IENvbXBsZXRlJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMTY9QXNzaWdubWVudCBCYXNlbGluZSAxIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxNz1Bc3NpZ25tZW50IEJhc2VsaW5lIDEgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDE4PVRhc2sgQmFzZWxpbmUgMSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMTk9VGFzayBCYXNlbGluZSAxIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyMD1SZXNvdXJjZSBCYXNlbGluZSAxIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyMT1SZXNvdXJjZSBCYXNlbGluZSAxIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyMj1Bc3NpZ25tZW50IEJhc2VsaW5lIDIgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDIzPUFzc2lnbm1lbnQgQmFzZWxpbmUgMiBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjQ9VGFzayBCYXNlbGluZSAyIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyNT1UYXNrIEJhc2VsaW5lIDIgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI2PVJlc291cmNlIEJhc2VsaW5lIDIgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI3PVJlc291cmNlIEJhc2VsaW5lIDIgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI4PUFzc2lnbm1lbnQgQmFzZWxpbmUgMyBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjk9QXNzaWdubWVudCBCYXNlbGluZSAzIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzMD1UYXNrIEJhc2VsaW5lIDMgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDMxPVRhc2sgQmFzZWxpbmUgMyBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzI9UmVzb3VyY2UgQmFzZWxpbmUgMyBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzM9UmVzb3VyY2UgQmFzZWxpbmUgMyBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzQ9QXNzaWdubWVudCBCYXNlbGluZSA0IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzNT1Bc3NpZ25tZW50IEJhc2VsaW5lIDQgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM2PVRhc2sgQmFzZWxpbmUgNCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzc9VGFzayBCYXNlbGluZSA0IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzOD1SZXNvdXJjZSBCYXNlbGluZSA0IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzOT1SZXNvdXJjZSBCYXNlbGluZSA0IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0MD1Bc3NpZ25tZW50IEJhc2VsaW5lIDUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQxPUFzc2lnbm1lbnQgQmFzZWxpbmUgNSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDI9VGFzayBCYXNlbGluZSA1IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0Mz1UYXNrIEJhc2VsaW5lIDUgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQ0PVJlc291cmNlIEJhc2VsaW5lIDUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQ1PVJlc291cmNlIEJhc2VsaW5lIDUgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQ2PUFzc2lnbm1lbnQgQmFzZWxpbmUgNiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDc9QXNzaWdubWVudCBCYXNlbGluZSA2IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0OD1UYXNrIEJhc2VsaW5lIDYgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQ5PVRhc2sgQmFzZWxpbmUgNiBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTA9UmVzb3VyY2UgQmFzZWxpbmUgNiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTE9UmVzb3VyY2UgQmFzZWxpbmUgNiBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTI9QXNzaWdubWVudCBCYXNlbGluZSA3IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1Mz1Bc3NpZ25tZW50IEJhc2VsaW5lIDcgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU0PVRhc2sgQmFzZWxpbmUgNyBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTU9VGFzayBCYXNlbGluZSA3IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1Nj1SZXNvdXJjZSBCYXNlbGluZSA3IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1Nz1SZXNvdXJjZSBCYXNlbGluZSA3IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1OD1Bc3NpZ25tZW50IEJhc2VsaW5lIDggV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU5PUFzc2lnbm1lbnQgQmFzZWxpbmUgOCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjA9VGFzayBCYXNlbGluZSA4IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2MT1UYXNrIEJhc2VsaW5lIDggQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDYyPVJlc291cmNlIEJhc2VsaW5lIDggV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDYzPVJlc291cmNlIEJhc2VsaW5lIDggQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY0PUFzc2lnbm1lbnQgQmFzZWxpbmUgOSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjU9QXNzaWdubWVudCBCYXNlbGluZSA5IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2Nj1UYXNrIEJhc2VsaW5lIDkgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY3PVRhc2sgQmFzZWxpbmUgOSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjg9UmVzb3VyY2UgQmFzZWxpbmUgOSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjk9UmVzb3VyY2UgQmFzZWxpbmUgOSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNzA9QXNzaWdubWVudCBCYXNlbGluZSAxMCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNzE9QXNzaWdubWVudCBCYXNlbGluZSAxMCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNzI9VGFzayBCYXNlbGluZSAxMCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNzM9VGFzayBCYXNlbGluZSAxMCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNzQ9UmVzb3VyY2UgQmFzZWxpbmUgMTAgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDc1PVJlc291cmNlIEJhc2VsaW5lIDEwIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3Nj1QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcmVjb3JkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHRpbWVwaGFzZWQgZGF0YSBwZXJpb2QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmluaXNoIGRhdGUgb2YgdGhlIHRpbWVwaGFzZWQgZGF0YSBwZXJpb2QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idW5pdCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1VuaXRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpbWUgdW5pdCBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPW0sIDE9aCwgMj1kLCAzPXcsIDU9bW8sIDg9eSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVuaXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgcGVyIHVuaXQgb2YgdGltZSBmb3IgdGhlIHRpbWVwaGFzZWQgZGF0YSBwZXJpb2QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJUaXRsZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpdGxlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJUeXBlVHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGUzIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZV8uXzNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxNiAxNyAxOCAxOSAyMCAyMSAyMiAyMyAyNCAyNSAyNiAyNyAyOCAyOSAzMCAzMSAzMiAzMyAzNCAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA0NSA0NiA0NyA0OCA0OSA1MCA1MSA1MiA1MyA1NCA1NSA1NiA1NyA1OCA1OSA2MCA2MSA2MiA2MyA2NCA2NSA2NiA2NyA2OCA2OSA3MCA3MSA3MiA3MyA3NCA3NSA3NiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJUeXBlVHlwZTQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlXy5fNF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJUeXBlVHlwZTUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlXy5fNV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVUlEVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iMTYiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVW5pdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVbml0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA1IDgiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmFsdWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSBvdXRsaW5lIGNvZGUgdmFsdWUgYWNyb3NzIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFyZW50VmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIG9mIHRoZSBwYXJlbnQgbm9kZSBvZiB0aGUgb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQYXJlbnRWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCB2YWx1ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGRlc2NyaXB0aW9uIG9mIHRoaXMgdmFsdWUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlc2NyaXB0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmFsdWUyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlEIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVbmlxdWUgSUQgb2YgdmFsdWUgYWNyb3NzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgdmFsdWUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB2YWx1ZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgbGlzdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVzY3JpcHRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWYWx1ZUxpc3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVMaXN0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsdWUiIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVmFsdWUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlcyB0aGF0IG1ha2UgdXAgdGhlIHZhbHVlIGxpc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVmFsdWVsaXN0U29ydE9yZGVyVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlbGlzdFNvcnRPcmRlcl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWYWx1ZXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAiIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDowIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1ZhbHVlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGluZGl2aWR1YWwgdmFsdWVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXQlNNYXNrIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldCU01hc2tfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxldmVsIG9mIHRoZSBtYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9UeXBlVHlwZTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiB0aGUgbm9kZSB2YWx1ZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlcyBhcmU6IDA9TnVtYmVycywgMT1VcHBlcmNhc2UgTGV0dGVycywgMj1Mb3dlcmNhc2UgTGV0dGVycywgMz1DaGFyYWN0ZXJzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGVuZ3RoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtYXhpbXVtIGxlbmd0aCBpbiBjaGFyYWN0ZXJzLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIG9taXR0ZWQgd2hlbiBsZW5ndGggaXMgJnF1b3Q7YW55JnF1b3Q7LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZW5ndGgiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZXBhcmF0b3IiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlcGFyYXRvciBjaGFyYWN0ZXIgb2YgdGhlIG5vZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNlcGFyYXRvciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldCU01hc2tzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldCU01hc2tzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyaWZ5VW5pcXVlQ29kZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIFdCUyBjb2RlcyBhcmUgdW5pcXVlIGZvciBuZXcgdGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZlcmlmeVVuaXF1ZUNvZGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2VuZXJhdGVDb2RlcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgV0JTIGNvZGVzIGFyZSBnZW5lcmF0ZWQgZm9yIG5ldyB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iR2VuZXJhdGVDb2RlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWZpeCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1ByZWZpeFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJlZml4IGZvciBhbGwgV0JTIGNvZGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVmaXgiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3QlNNYXNrIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1dCU01hc2siIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgV0JTIE1hc2sgdGhhdCBpcyBhcHBsaWVkIHRvIGFsbCB0YXNrcyBpbiB0aGUgUHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV0JTTWFzayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldlZWtEYXkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2Vla0RheV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRheVR5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9EYXlUeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIGRheS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9RXhjZXB0aW9uLCAxPU1vbmRheSwgMj1UdWVzZGF5LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMz1XZWRuZXNkYXksIDQ9VGh1cnNkYXksIDU9RnJpZGF5LCA2PVNhdHVyZGF5LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNz1TdW5kYXkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGF5VHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRheVdvcmtpbmciIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHNwZWNpZmllZCBkYXRlIG9yIGRheSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBpcyB3b3JraW5nLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEYXlXb3JraW5nIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGltZVBlcmlvZCIgZVR5cGU9IiMvL1RpbWVQZXJpb2QiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIGEgY29udGlndW91cyBzZXQgb2YgZXhjZXB0aW9uIGRheXMuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lUGVyaW9kIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya2luZ1RpbWVzIiBlVHlwZT0iIy8vV29ya2luZ1RpbWVzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2Ygd29ya2luZyB0aW1lcyB0aGF0IGRlZmluZSB0aGUgdGltZSB3b3JrZWQgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSB3ZWVrZGF5LiAgT25lIG9mIHRoZXNlIG11c3QgYmUgcHJlc2VudCwgYW5kIHRoZXJlIG1heSBiZSBubyBtb3JlIHRoYW4gZml2ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtpbmdUaW1lcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldlZWtEYXlzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldlZWtEYXlzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2Vla0RheSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9XZWVrRGF5IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSB3ZWVrZGF5IGVpdGhlciBkZWZpbmVzIHJlZ3VsYXIgZGF5cyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgd2VlayBvciBleGNlcHRpb24gZGF5cyBpbiB0aGUgY2FsZW5kYXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldlZWtEYXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJXZWVrU3RhcnREYXlUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2Vla1N0YXJ0RGF5Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJXb3JrQ29udG91clR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrQ29udG91cl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCA1IDYgNyA4Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IldvcmtGb3JtYXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya0Zvcm1hdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJXb3JrR3JvdXBUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya0dyb3VwXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JraW5nVGltZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JraW5nVGltZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZyb21UaW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1RpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYmVnaW5uaW5nIG9mIHRoZSB3b3JraW5nIHRpbWUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRnJvbVRpbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0b1RpbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbmQgb2YgdGhlIHdvcmtpbmcgIHRpbWUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVG9UaW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya2luZ1RpbWVzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtpbmdUaW1lc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtpbmdUaW1lIiB1cHBlckJvdW5kPSI1IgotICAgICAgICBlVHlwZT0iIy8vV29ya2luZ1RpbWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSB3b3JraW5nIHRpbWUgZHVyaW5nIHRoZSB3ZWVrZGF5LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtpbmdUaW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MTY4MDYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgPGNvcHlyaWdodD4KLSMgPC9jb3B5cmlnaHQ+Ci0jCi0jICRJZDogcGx1Z2luLnByb3BlcnRpZXMsdiAxLjUgMjAwNy8wMy8wNiAyMToxMDoyMiBza2Fubm9vcmkgRXhwICQKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotcGx1Z2luTmFtZSA9IEVQRiBNU1Byb2plY3QyMDAzIE1vZGVsCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWJiNDNjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTwhLS0KLSA8Y29weXJpZ2h0PgotIDwvY29weXJpZ2h0PgotCi0gJElkOiBwbHVnaW4ueG1sLHYgMS4yIDIwMDYvMDQvMTEgMTU6Mjk6NTUganRoYXJpbyBFeHAgJAotLS0+Ci0KLTxwbHVnaW4+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICA8cGFja2FnZSAKLSAgICAgICB1cmkgPSAiaHR0cDovL2VwZi5lY2xpcHNlLm9yZy9tc3Byb2plY3QiIAotICAgICAgIGNsYXNzID0gIm9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSIKLSAgICAgICBnZW5Nb2RlbCA9ICJtb2RlbC9NU19Qcm9qZWN0XzIwMDMuZ2VubW9kZWwiIC8+IAotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZXh0ZW5zaW9uX3BhcnNlciI+Ci0gICAgPHBhcnNlciAKLSAgICAgICB0eXBlPSJtc3Byb2plY3QiIAotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWwuTXNwcm9qZWN0UmVzb3VyY2VGYWN0b3J5SW1wbCIgLz4KLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQXNzaWdubWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Fzc2lnbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTM1ZDVhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQXNzaWdubWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzNCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFzc2lnbm1lbnQuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFzc2lnbm1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VGFza1VJRCA8ZW0+VGFzayBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZXNvdXJjZVVJRCA8ZW0+UmVzb3VyY2UgVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxGaW5pc2ggPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbFN0YXJ0IDxlbT5BY3R1YWwgU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxXb3JrIDxlbT5BY3R1YWwgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFDV1AgPGVtPkFDV1A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0NvbmZpcm1lZCA8ZW0+Q29uZmlybWVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3RSYXRlVGFibGUgPGVtPkNvc3QgUmF0ZSBUYWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3RWYXJpYW5jZSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENWIDxlbT5DVjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldERlbGF5IDxlbT5EZWxheTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RmluaXNoVmFyaWFuY2UgPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGluayA8ZW0+SHlwZXJsaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0SHlwZXJsaW5rQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0hhc0ZpeGVkUmF0ZVVuaXRzIDxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzRml4ZWRNYXRlcmlhbCA8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRMZXZlbGluZ0RlbGF5IDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldExldmVsaW5nRGVsYXlGb3JtYXQgPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzTGlua2VkRmllbGRzIDxlbT5MaW5rZWQgRmllbGRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzT3ZlcmFsbG9jYXRlZCA8ZW0+T3ZlcmFsbG9jYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE92ZXJ0aW1lQ29zdCA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlZ3VsYXJXb3JrIDxlbT5SZWd1bGFyIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdDb3N0IDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nV29yayA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1Jlc3BvbnNlUGVuZGluZyA8ZW0+UmVzcG9uc2UgUGVuZGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0b3AgPGVtPlN0b3A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZXN1bWUgPGVtPlJlc3VtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0YXJ0VmFyaWFuY2UgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VW5pdHMgPGVtPlVuaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNVcGRhdGVOZWVkZWQgPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRWQUMgPGVtPlZBQzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmsgPGVtPldvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrQ29udG91ciA8ZW0+V29yayBDb250b3VyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCb29raW5nVHlwZSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDcmVhdGlvbkRhdGUgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRFeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QmFzZWxpbmUgPGVtPkJhc2VsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Fzc2lnbm1lbnRfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXNzaWdubWVudCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1VJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXNrIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFzayBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRhc2tVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1Rhc2tVSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Rhc2tVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFRhc2tVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRUYXNrVUlEIDxlbT5UYXNrIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFzayBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRhc2tVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhc2tVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZSBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlc291cmNlVUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9SZXNvdXJjZVVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVzb3VyY2VVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFJlc291cmNlVUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVzb3VyY2VVSUQgPGVtPlJlc291cmNlIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZVVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzb3VyY2VVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2Ygd29yayBjb21wbGV0ZWQgb24gdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBlcmNlbnRXb3JrQ29tcGxldGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1BlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1BlcmNlbnRXb3JrQ29tcGxldGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFBlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGVyY2VudFdvcmtDb21wbGV0ZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGNvc3QgaW5jdXJyZWQgb24gdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQWN0dWFsQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0QWN0dWFsQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBGaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgZmluaXNoIGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgRmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxGaW5pc2goT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQWN0dWFsRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbEZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbEZpbmlzaCA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxGaW5pc2goT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIG92ZXJ0aW1lIGNvc3QgaW5jdXJyZWQgb24gdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9BY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbE92ZXJ0aW1lQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0IDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgYW1vdW50IG9mIG92ZXJ0aW1lIHdvcmsgaW5jdXJyZWQgb24gdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbE92ZXJ0aW1lV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBzdGFydCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxTdGFydChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9BY3R1YWxTdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbFN0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsU3RhcnQgPGVtPkFjdHVhbCBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsU3RhcnQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGFtb3VudCBvZiB3b3JrIGluY3VycmVkIG9uIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQWN0dWFsV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbFdvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QUNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSBhc3NpZ25tZW50IHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QUNXUCgpCi0JICogQHNlZSAjc2V0QUNXUChmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0FDV1AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBQ1dQJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QUNXUCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFDV1AgPGVtPkFDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QUNXUCgpCi0JICogQHNlZSAjdW5zZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBQ1dQKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFDV1AgPGVtPkFDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QUNXUCgpCi0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQHNlZSAjc2V0QUNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEFDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFDV1AgPGVtPkFDV1A8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFDV1A8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEFDV1AoKQotCSAqIEBzZWUgI2dldEFDV1AoKQotCSAqIEBzZWUgI3NldEFDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRBQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25maXJtZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIFJlc291cmNlIGhhcyBhY2NlcHRlZCBhbGwgb2YgaGlzIG9yIGhlciBhc3NpZ25tZW50cy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmZpcm1lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDb25maXJtZWQoKQotCSAqIEBzZWUgI3Vuc2V0Q29uZmlybWVkKCkKLQkgKiBAc2VlICNzZXRDb25maXJtZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0NvbmZpcm1lZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29uZmlybWVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0NvbmZpcm1lZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzQ29uZmlybWVkIDxlbT5Db25maXJtZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbmZpcm1lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDb25maXJtZWQoKQotCSAqIEBzZWUgI3Vuc2V0Q29uZmlybWVkKCkKLQkgKiBAc2VlICNpc0NvbmZpcm1lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29uZmlybWVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNDb25maXJtZWQgPGVtPkNvbmZpcm1lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRDb25maXJtZWQoKQotCSAqIEBzZWUgI2lzQ29uZmlybWVkKCkKLQkgKiBAc2VlICNzZXRDb25maXJtZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldENvbmZpcm1lZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNDb25maXJtZWQgPGVtPkNvbmZpcm1lZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlybWVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDb25maXJtZWQoKQotCSAqIEBzZWUgI2lzQ29uZmlybWVkKCkKLQkgKiBAc2VlICNzZXRDb25maXJtZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldENvbmZpcm1lZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHByb2plY3RlZCBvciBzY2hlZHVsZWQgY29zdCBvZiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0Nvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Nvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldENvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0IDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdCBSYXRlIFRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29zdCByYXRlIHRhYmxlIHVzZWQgZm9yIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3N0UmF0ZVRhYmxlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9Db3N0UmF0ZVRhYmxlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ29zdFJhdGVUYWJsZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Nvc3RSYXRlVGFibGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldENvc3RSYXRlVGFibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0UmF0ZVRhYmxlIDxlbT5Db3N0IFJhdGUgVGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgUmF0ZSBUYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29zdFJhdGVUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29zdFJhdGVUYWJsZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvc3QgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNvc3QgYW5kIGJhc2VsaW5lIGNvc3QgZm9yIGEgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0IFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldENvc3RWYXJpYW5jZShmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0Nvc3RWYXJpYW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Nvc3RWYXJpYW5jZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldENvc3RWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3RWYXJpYW5jZSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI3Vuc2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3RWYXJpYW5jZShmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0VmFyaWFuY2UgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldENvc3RWYXJpYW5jZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldENvc3RWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0IFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0Q29zdFZhcmlhbmNlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q29zdFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DVjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRWFybmVkIHZhbHVlIGNvc3QgdmFyaWFuY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DVjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDVigpCi0JICogQHNlZSAjdW5zZXRDVigpCi0JICogQHNlZSAjc2V0Q1YoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9DVigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NWJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0Q1YoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDViA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNWPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENWKCkKLQkgKiBAc2VlICN1bnNldENWKCkKLQkgKiBAc2VlICNnZXRDVigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q1YoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q1YgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENWKCkKLQkgKiBAc2VlICNnZXRDVigpCi0JICogQHNlZSAjc2V0Q1YoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q1YgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DVjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0Q1YoKQotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAc2VlICNzZXRDVihmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldENWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWxheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCB0aGF0IHRoZSBhc3NpZ25tZW50IGlzIGRlbGF5ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWxheTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVsYXkoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0RlbGF5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWxheScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RGVsYXkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXREZWxheSA8ZW0+RGVsYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlbGF5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWxheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVsYXkoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9GaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaW5pc2gnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5pc2goT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbmlzaCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhcmlhbmNlIG9mIHRoZSBhc3NpZ25tZW50IGZpbmlzaCBkYXRlIGZyb20gdGhlIGJhc2VsaW5lIGZpbmlzaCBkYXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaW5pc2hWYXJpYW5jZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfRmluaXNoVmFyaWFuY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpbmlzaFZhcmlhbmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRGaW5pc2hWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEZpbmlzaFZhcmlhbmNlIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmluaXNoVmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmlzaFZhcmlhbmNlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SHlwZXJsaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdGl0bGUgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEh5cGVybGluayhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9IeXBlcmxpbmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5IeXBlcmxpbmtUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHlwZXJsaW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SHlwZXJsaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIeXBlcmxpbmsoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh5cGVybGluayBBZGRyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0h5cGVybGlua0FkZHJlc3MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5IeXBlcmxpbmtBZGRyZXNzVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSHlwZXJsaW5rQWRkcmVzcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRIeXBlcmxpbmtBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0SHlwZXJsaW5rQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkb2N1bWVudCBib29rbWFyayBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SHlwZXJsaW5rU3ViQWRkcmVzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9IeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmtTdWJBZGRyZXNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SHlwZXJsaW5rU3ViQWRkcmVzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yayBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhcmlhbmNlIG9mIGFzc2lnbm1lbnQgd29yayBmcm9tIHRoZSBiYXNlbGluZSB3b3JrIGFzIG1pbnV0ZXMgeCAxMDAwLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3Vuc2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRXb3JrVmFyaWFuY2UoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9Xb3JrVmFyaWFuY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrVmFyaWFuY2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRXb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICN1bnNldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrVmFyaWFuY2UoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRXb3JrVmFyaWFuY2UoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRXb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFdvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIFVuaXRzIGFyZSBGaXhlZCBSYXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SGFzRml4ZWRSYXRlVW5pdHMoKQotCSAqIEBzZWUgI3Vuc2V0SGFzRml4ZWRSYXRlVW5pdHMoKQotCSAqIEBzZWUgI3NldEhhc0ZpeGVkUmF0ZVVuaXRzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9IYXNGaXhlZFJhdGVVbml0cygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSGFzRml4ZWRSYXRlVW5pdHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSGFzRml4ZWRSYXRlVW5pdHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0hhc0ZpeGVkUmF0ZVVuaXRzIDxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SGFzRml4ZWRSYXRlVW5pdHMoKQotCSAqIEBzZWUgI3Vuc2V0SGFzRml4ZWRSYXRlVW5pdHMoKQotCSAqIEBzZWUgI2lzSGFzRml4ZWRSYXRlVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEhhc0ZpeGVkUmF0ZVVuaXRzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNIYXNGaXhlZFJhdGVVbml0cyA8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SGFzRml4ZWRSYXRlVW5pdHMoKQotCSAqIEBzZWUgI2lzSGFzRml4ZWRSYXRlVW5pdHMoKQotCSAqIEBzZWUgI3NldEhhc0ZpeGVkUmF0ZVVuaXRzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRIYXNGaXhlZFJhdGVVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNIYXNGaXhlZFJhdGVVbml0cyA8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjaXNIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjc2V0SGFzRml4ZWRSYXRlVW5pdHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEhhc0ZpeGVkUmF0ZVVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaXhlZCBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgY29uc3VtcHRpb24gb2YgdGhlIGFzc2lnbmVkIG1hdGVyaWFsIHJlc291cmNlIG9jY3VycyBpbiBhIHNpbmdsZSwgZml4ZWQgYW1vdW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Rml4ZWRNYXRlcmlhbCgpCi0JICogQHNlZSAjdW5zZXRGaXhlZE1hdGVyaWFsKCkKLQkgKiBAc2VlICNzZXRGaXhlZE1hdGVyaWFsKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9GaXhlZE1hdGVyaWFsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaXhlZE1hdGVyaWFsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0ZpeGVkTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0ZpeGVkTWF0ZXJpYWwgPGVtPkZpeGVkIE1hdGVyaWFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRGaXhlZE1hdGVyaWFsKCkKLQkgKiBAc2VlICN1bnNldEZpeGVkTWF0ZXJpYWwoKQotCSAqIEBzZWUgI2lzRml4ZWRNYXRlcmlhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Rml4ZWRNYXRlcmlhbChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzRml4ZWRNYXRlcmlhbCA8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Rml4ZWRNYXRlcmlhbCgpCi0JICogQHNlZSAjaXNGaXhlZE1hdGVyaWFsKCkKLQkgKiBAc2VlICNzZXRGaXhlZE1hdGVyaWFsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRGaXhlZE1hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0ZpeGVkTWF0ZXJpYWwgPGVtPkZpeGVkIE1hdGVyaWFsPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0Rml4ZWRNYXRlcmlhbCgpCi0JICogQHNlZSAjaXNGaXhlZE1hdGVyaWFsKCkKLQkgKiBAc2VlICNzZXRGaXhlZE1hdGVyaWFsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRGaXhlZE1hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZXZlbGluZyBEZWxheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlbGF5IGNhdXNlZCBieSBsZXZlbGluZy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsaW5nIERlbGF5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMZXZlbGluZ0RlbGF5KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9MZXZlbGluZ0RlbGF5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbGluZ0RlbGF5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRMZXZlbGluZ0RlbGF5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0TGV2ZWxpbmdEZWxheSA8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsaW5nIERlbGF5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMZXZlbGluZ0RlbGF5KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgZGVsYXkuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgMjA9ZSUsIDIxPW51bGwsIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExldmVsaW5nRGVsYXlGb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0xldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5MZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGV2ZWxpbmdEZWxheUZvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldExldmVsaW5nRGVsYXlGb3JtYXQgPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGlua2VkIEZpZWxkczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgUHJvamVjdCBpcyBsaW5rZWQgdG8gYW5vdGhlciBPTEUgb2JqZWN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGlua2VkIEZpZWxkczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRMaW5rZWRGaWVsZHMoKQotCSAqIEBzZWUgI3Vuc2V0TGlua2VkRmllbGRzKCkKLQkgKiBAc2VlICNzZXRMaW5rZWRGaWVsZHMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0xpbmtlZEZpZWxkcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGlua2VkRmllbGRzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0xpbmtlZEZpZWxkcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzTGlua2VkRmllbGRzIDxlbT5MaW5rZWQgRmllbGRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rZWQgRmllbGRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldExpbmtlZEZpZWxkcygpCi0JICogQHNlZSAjdW5zZXRMaW5rZWRGaWVsZHMoKQotCSAqIEBzZWUgI2lzTGlua2VkRmllbGRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMaW5rZWRGaWVsZHMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0xpbmtlZEZpZWxkcyA8ZW0+TGlua2VkIEZpZWxkczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRMaW5rZWRGaWVsZHMoKQotCSAqIEBzZWUgI2lzTGlua2VkRmllbGRzKCkKLQkgKiBAc2VlICNzZXRMaW5rZWRGaWVsZHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldExpbmtlZEZpZWxkcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNMaW5rZWRGaWVsZHMgPGVtPkxpbmtlZCBGaWVsZHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxpbmtlZCBGaWVsZHM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldExpbmtlZEZpZWxkcygpCi0JICogQHNlZSAjaXNMaW5rZWRGaWVsZHMoKQotCSAqIEBzZWUgI3NldExpbmtlZEZpZWxkcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TGlua2VkRmllbGRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaWxlc3RvbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIGFzc2lnbm1lbnQgaXMgYSBtaWxlc3RvbmUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaWxlc3RvbmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWlsZXN0b25lKCkKLQkgKiBAc2VlICN1bnNldE1pbGVzdG9uZSgpCi0JICogQHNlZSAjc2V0TWlsZXN0b25lKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9NaWxlc3RvbmUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01pbGVzdG9uZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNNaWxlc3RvbmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc01pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NaWxlc3RvbmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWlsZXN0b25lKCkKLQkgKiBAc2VlICN1bnNldE1pbGVzdG9uZSgpCi0JICogQHNlZSAjaXNNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1pbGVzdG9uZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TWlsZXN0b25lKCkKLQkgKiBAc2VlICNpc01pbGVzdG9uZSgpCi0JICogQHNlZSAjc2V0TWlsZXN0b25lKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRNaWxlc3RvbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbGVzdG9uZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TWlsZXN0b25lKCkKLQkgKiBAc2VlICNpc01pbGVzdG9uZSgpCi0JICogQHNlZSAjc2V0TWlsZXN0b25lKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRNaWxlc3RvbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUZXh0IG5vdGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5vdGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROb3RlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9Ob3RlcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOb3RlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROb3RlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROb3RlcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlcmFsbG9jYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgYXNzaWdubWVudCBpcyBvdmVyYWxsb2NhdGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcmFsbG9jYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRPdmVyYWxsb2NhdGVkKCkKLQkgKiBAc2VlICN1bnNldE92ZXJhbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3NldE92ZXJhbGxvY2F0ZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X092ZXJhbGxvY2F0ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J092ZXJhbGxvY2F0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzT3ZlcmFsbG9jYXRlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzT3ZlcmFsbG9jYXRlZCA8ZW0+T3ZlcmFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcmFsbG9jYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRPdmVyYWxsb2NhdGVkKCkKLQkgKiBAc2VlICN1bnNldE92ZXJhbGxvY2F0ZWQoKQotCSAqIEBzZWUgI2lzT3ZlcmFsbG9jYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcmFsbG9jYXRlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzT3ZlcmFsbG9jYXRlZCA8ZW0+T3ZlcmFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRPdmVyYWxsb2NhdGVkKCkKLQkgKiBAc2VlICNpc092ZXJhbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3NldE92ZXJhbGxvY2F0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE92ZXJhbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzT3ZlcmFsbG9jYXRlZCA8ZW0+T3ZlcmFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcmFsbG9jYXRlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0T3ZlcmFsbG9jYXRlZCgpCi0JICogQHNlZSAjaXNPdmVyYWxsb2NhdGVkKCkKLQkgKiBAc2VlICNzZXRPdmVyYWxsb2NhdGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRPdmVyYWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc3VtIG9mIHRoZSBhY3R1YWwgYW5kIHJlbWFpbmluZyBvdmVydGltZSBjb3N0IG9mIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9PdmVydGltZUNvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J092ZXJ0aW1lQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0T3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgZm9yIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3ZlcnRpbWVXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X092ZXJ0aW1lV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J092ZXJ0aW1lV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRPdmVydGltZVdvcmsgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcnRpbWVXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWd1bGFyIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2Ygbm9uLW92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZ3VsYXIgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVndWxhcldvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfUmVndWxhcldvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZWd1bGFyV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSZWd1bGFyV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlZ3VsYXJXb3JrIDxlbT5SZWd1bGFyIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZ3VsYXIgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlZ3VsYXJXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1haW5pbmcgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgY29zdCBvZiBjb21wbGV0aW5nIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ0Nvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1JlbWFpbmluZ0Nvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ0Nvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldFJlbWFpbmluZ0Nvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdDb3N0IDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlbWFpbmluZ0Nvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgb3ZlcnRpbWUgY29zdCBvZiBjb21wbGV0aW5nIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfUmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdPdmVydGltZUNvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIG92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIHRvIGNvbXBsZXRlIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ092ZXJ0aW1lV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9SZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdPdmVydGltZVdvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1haW5pbmcgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHJlbWFpbmluZyB3b3JrIHNjaGVkdWxlZCB0byBjb21wbGV0ZSB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZW1haW5pbmdXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1JlbWFpbmluZ1dvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlbWFpbmluZ1dvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ1dvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlbWFpbmluZ1dvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3BvbnNlIFBlbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRydWUgaWYgYSByZXNwb25zZSBoYXMgbm90IGJlZW4gcmVjZWl2ZWQgZm9yIGEgVGVhbUFzc2lnbiBtZXNzYWdlLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3BvbnNlIFBlbmRpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UmVzcG9uc2VQZW5kaW5nKCkKLQkgKiBAc2VlICN1bnNldFJlc3BvbnNlUGVuZGluZygpCi0JICogQHNlZSAjc2V0UmVzcG9uc2VQZW5kaW5nKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9SZXNwb25zZVBlbmRpbmcoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc3BvbnNlUGVuZGluZycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNSZXNwb25zZVBlbmRpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1Jlc3BvbnNlUGVuZGluZyA8ZW0+UmVzcG9uc2UgUGVuZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzcG9uc2UgUGVuZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBzZWUgI3Vuc2V0UmVzcG9uc2VQZW5kaW5nKCkKLQkgKiBAc2VlICNpc1Jlc3BvbnNlUGVuZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzcG9uc2VQZW5kaW5nKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNSZXNwb25zZVBlbmRpbmcgPGVtPlJlc3BvbnNlIFBlbmRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0UmVzcG9uc2VQZW5kaW5nKCkKLQkgKiBAc2VlICNpc1Jlc3BvbnNlUGVuZGluZygpCi0JICogQHNlZSAjc2V0UmVzcG9uc2VQZW5kaW5nKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRSZXNwb25zZVBlbmRpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzUmVzcG9uc2VQZW5kaW5nIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBzZWUgI2lzUmVzcG9uc2VQZW5kaW5nKCkKLQkgKiBAc2VlICNzZXRSZXNwb25zZVBlbmRpbmcoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFJlc3BvbnNlUGVuZGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFydChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9TdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXJ0KE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdG9wPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGF0IHRoZSBhc3NpZ25tZW50IHdhcyBzdG9wcGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RvcDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RvcChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9TdG9wKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RvcCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRTdG9wKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RvcCA8ZW0+U3RvcDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RvcDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RvcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RvcChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzdW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGF0IHRoZSBhc3NpZ25tZW50IHJlc3VtZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlc3VtZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9SZXN1bWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXN1bWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVzdW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVzdW1lIDxlbT5SZXN1bWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVzdW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXN1bWUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YXJ0IFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFyaWFuY2Ugb2YgdGhlIGFzc2lnbm1lbnQgc3RhcnQgZGF0ZSBmcm9tIHRoZSBiYXNlbGluZSBzdGFydCBkYXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0VmFyaWFuY2UoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1N0YXJ0VmFyaWFuY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXJ0VmFyaWFuY2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFN0YXJ0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdGFydFZhcmlhbmNlIDxlbT5TdGFydCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXJ0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXJ0VmFyaWFuY2UoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vbml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG51bWJlciBvZiB1bml0cyBmb3IgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vbml0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRVbml0cygpCi0JICogQHNlZSAjdW5zZXRVbml0cygpCi0JICogQHNlZSAjc2V0VW5pdHMoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9Vbml0cygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1VuaXRzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0VW5pdHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVbml0cyA8ZW0+VW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFVuaXRzKCkKLQkgKiBAc2VlICN1bnNldFVuaXRzKCkKLQkgKiBAc2VlICNnZXRVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VW5pdHMoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VW5pdHMgPGVtPlVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFVuaXRzKCkKLQkgKiBAc2VlICNnZXRVbml0cygpCi0JICogQHNlZSAjc2V0VW5pdHMoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VW5pdHMgPGVtPlVuaXRzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vbml0czwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VW5pdHMoKQotCSAqIEBzZWUgI2dldFVuaXRzKCkKLQkgKiBAc2VlICNzZXRVbml0cyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VcGRhdGUgTmVlZGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUcnVlIGlmIHRoZSByZXNvdXJjZSBhc3NpZ25lZCB0byBhIHRhc2sgbmVlZHMgdG8gYmUgdXBkYXRlZCBhcyB0byB0aGUgc3RhdHVzIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRVcGRhdGVOZWVkZWQoKQotCSAqIEBzZWUgI3Vuc2V0VXBkYXRlTmVlZGVkKCkKLQkgKiBAc2VlICNzZXRVcGRhdGVOZWVkZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1VwZGF0ZU5lZWRlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVXBkYXRlTmVlZGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1VwZGF0ZU5lZWRlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzVXBkYXRlTmVlZGVkIDxlbT5VcGRhdGUgTmVlZGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VcGRhdGUgTmVlZGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFVwZGF0ZU5lZWRlZCgpCi0JICogQHNlZSAjdW5zZXRVcGRhdGVOZWVkZWQoKQotCSAqIEBzZWUgI2lzVXBkYXRlTmVlZGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVcGRhdGVOZWVkZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1VwZGF0ZU5lZWRlZCA8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRVcGRhdGVOZWVkZWQoKQotCSAqIEBzZWUgI2lzVXBkYXRlTmVlZGVkKCkKLQkgKiBAc2VlICNzZXRVcGRhdGVOZWVkZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFVwZGF0ZU5lZWRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNVcGRhdGVOZWVkZWQgPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFVwZGF0ZU5lZWRlZCgpCi0JICogQHNlZSAjaXNVcGRhdGVOZWVkZWQoKQotCSAqIEBzZWUgI3NldFVwZGF0ZU5lZWRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VXBkYXRlTmVlZGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WQUM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYmFzbGluZSBjb3N0IGFuZCB0b3RhbCBjb3N0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VkFDPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFZBQygpCi0JICogQHNlZSAjdW5zZXRWQUMoKQotCSAqIEBzZWUgI3NldFZBQyhmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1ZBQygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZBQycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldFZBQygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFZBQyA8ZW0+VkFDPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WQUM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VkFDKCkKLQkgKiBAc2VlICN1bnNldFZBQygpCi0JICogQHNlZSAjZ2V0VkFDKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWQUMoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VkFDIDxlbT5WQUM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VkFDKCkKLQkgKiBAc2VlICNnZXRWQUMoKQotCSAqIEBzZWUgI3NldFZBQyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFZBQygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VkFDIDxlbT5WQUM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZBQzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VkFDKCkKLQkgKiBAc2VlICNnZXRWQUMoKQotCSAqIEBzZWUgI3NldFZBQyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFZBQygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiBzY2hlZHVsZWQgd29yayBmb3IgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1dvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIENvbnRvdXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB3b3JrIGNvbnRvdXIgb2YgdGhlIGFzc2lnbm1lbnQuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPUZsYXQsIDE9QmFjayBMb2FkZWQsIDI9RnJvbnQgTG9hZGVkLCAzPURvdWJsZSBQZWFrLCA0PUVhcmx5IFBlYWssIDU9TGF0ZSBQZWFrLCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNj1CZWxsLCA3PVR1cnRsZSwgOD1Db250b3VyZWQKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgQ29udG91cjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29ya0NvbnRvdXIoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1dvcmtDb250b3VyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya0NvbnRvdXJUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrQ29udG91cicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0V29ya0NvbnRvdXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrQ29udG91ciA8ZW0+V29yayBDb250b3VyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIENvbnRvdXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdvcmtDb250b3VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrQ29udG91cihCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgb24gdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0JDV1MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dTJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCQ1dTKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgYXNzaWdubWVudCB0by1kYXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9CQ1dQKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQkNXUCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEJDV1AoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Qm9va2luZyBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgdGhlIGJvb2tpbmcgdHlwZSBvZiB0aGUgYXNzaWdubWVudC4gMT1Db21taXRlZCwgMj1Qcm9wb3NlZAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Qm9va2luZyBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRCb29raW5nVHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQm9va2luZ1R5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Cb29raW5nVHlwZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Jvb2tpbmdUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRCb29raW5nVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJvb2tpbmdUeXBlIDxlbT5Cb29raW5nIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJvb2tpbmcgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Qm9va2luZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJvb2tpbmdUeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIHdvcmsgaXMgcHJvdGVjdGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0FjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxXb3JrUHJvdGVjdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsV29ya1Byb3RlY3RlZChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIG92ZXJ0aW1lIHdvcmsgaXMgcHJvdGVjdGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DcmVhdGlvbiBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGF0IHRoZSBhc3NpZ25tZW50IHdhcyBjcmVhdGVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDcmVhdGlvbkRhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQ3JlYXRpb25EYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ3JlYXRpb25EYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldENyZWF0aW9uRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3JlYXRpb25EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDcmVhdGlvbkRhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZSBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgYmFjayB0byB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkIElELCBhbmQgdGhlIHZhbHVlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfRXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXh0ZW5kZWRBdHRyaWJ1dGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZWxpbmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lM30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBiYXNlbGluZSB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZWxpbmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9CYXNlbGluZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCYXNlbGluZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEJhc2VsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdGltZSBwaGFzZWQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9UaW1lcGhhc2VkRGF0YSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUaW1lcGhhc2VkRGF0YScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCk7Ci0KLX0gLy8gQXNzaWdubWVudApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Fzc2lnbm1lbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQXNzaWdubWVudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjcyYjczZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQXNzaWdubWVudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXNzaWdubWVudHMuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Bc3NpZ25tZW50czwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzI2dldEFzc2lnbm1lbnQgPGVtPkFzc2lnbm1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50cygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXNzaWdubWVudHNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXNzaWdubWVudHMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGFzc2lnbm1lbnQgaW4gZWFjaCBBc3NpZ25tZW50cyBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXNzaWdubWVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50c19Bc3NpZ25tZW50KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBc3NpZ25tZW50JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QXNzaWdubWVudCgpOwotCi19IC8vIEFzc2lnbm1lbnRzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQXZhaWxhYmlsaXR5UGVyaW9kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQXZhaWxhYmlsaXR5UGVyaW9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxM2JjN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0F2YWlsYWJpbGl0eVBlcmlvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXZhaWxhYmlsaXR5UGVyaW9kLmphdmEsdiAxLjIgMjAwNi8wNC8xMSAxNToyOTo1NSBqdGhhcmlvIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdmFpbGFiaWxpdHkgUGVyaW9kPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZUZyb20gPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVUbyA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVVbml0cyA8ZW0+QXZhaWxhYmxlIFVuaXRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdBdmFpbGFiaWxpdHlQZXJpb2RfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXZhaWxhYmlsaXR5UGVyaW9kIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXZhaWxhYmxlIEZyb208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIHJlc291cmNlIGJlY29tZXMgYXZhaWxhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHBlcmlvZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgRnJvbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXZhaWxhYmxlRnJvbShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kX0F2YWlsYWJsZUZyb20oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdmFpbGFibGVGcm9tJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEF2YWlsYWJsZUZyb20oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZUZyb20gPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgRnJvbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXZhaWxhYmxlRnJvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXZhaWxhYmxlRnJvbShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXZhaWxhYmxlIFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGFzdCBkYXRlIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBwZXJpb2QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmxlIFRvPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdmFpbGFibGVUbyhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kX0F2YWlsYWJsZVRvKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXZhaWxhYmxlVG8nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QXZhaWxhYmxlVG8oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZVRvIDxlbT5BdmFpbGFibGUgVG88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJsZSBUbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVG8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF2YWlsYWJsZVRvKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdmFpbGFibGUgVW5pdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwZXJjZW50YWdlIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZSBkdXJpbmcgdGhlIHNwZWNpZmllZCBwZXJpb2QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmxlIFVuaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICN1bnNldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICNzZXRBdmFpbGFibGVVbml0cyhmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBdmFpbGFiaWxpdHlQZXJpb2RfQXZhaWxhYmxlVW5pdHMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdmFpbGFibGVVbml0cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEF2YWlsYWJsZVVuaXRzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVVbml0cyA8ZW0+QXZhaWxhYmxlIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgVW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QXZhaWxhYmxlVW5pdHMoKQotCSAqIEBzZWUgI3Vuc2V0QXZhaWxhYmxlVW5pdHMoKQotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdmFpbGFibGVVbml0cyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZVVuaXRzIDxlbT5BdmFpbGFibGUgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QXZhaWxhYmxlVW5pdHMoKQotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICNzZXRBdmFpbGFibGVVbml0cyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEF2YWlsYWJsZVVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZVVuaXRzIDxlbT5BdmFpbGFibGUgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QXZhaWxhYmxlVW5pdHMoKQotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICNzZXRBdmFpbGFibGVVbml0cyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEF2YWlsYWJsZVVuaXRzKCk7Ci0KLX0gLy8gQXZhaWxhYmlsaXR5UGVyaW9kCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQXZhaWxhYmlsaXR5UGVyaW9kcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0F2YWlsYWJpbGl0eVBlcmlvZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmM0MjNkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQXZhaWxhYmlsaXR5UGVyaW9kcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBdmFpbGFiaWxpdHlQZXJpb2RzLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2RzI2dldEF2YWlsYWJpbGl0eVBlcmlvZCA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0F2YWlsYWJpbGl0eVBlcmlvZHNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXZhaWxhYmlsaXR5UGVyaW9kcyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGVyaW9kIHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzX0F2YWlsYWJpbGl0eVBlcmlvZCgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdmFpbGFiaWxpdHlQZXJpb2QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKTsKLQotfSAvLyBBdmFpbGFiaWxpdHlQZXJpb2RzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQmFzZWxpbmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9CYXNlbGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyODZkZTAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9CYXNlbGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQmFzZWxpbmUuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2VsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNpc0ludGVyaW0gPGVtPkludGVyaW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldER1cmF0aW9uIDxlbT5EdXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzRXN0aW1hdGVkRHVyYXRpb24gPGVtPkVzdGltYXRlZCBEdXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Jhc2VsaW5lXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJhc2VsaW5lIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpbWUgcGhhc2VkIGRhdGEgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrIGJhc2VsaW5lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZV9UaW1lcGhhc2VkRGF0YSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUaW1lcGhhc2VkRGF0YScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OdW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgbnVtYmVyIG9mIHRoZSBiYXNlbGluZSBkYXRhIHJlY29yZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OdW1iZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE51bWJlcihCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX051bWJlcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTnVtYmVyJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXROdW1iZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk51bWJlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TnVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROdW1iZXIoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRlcmltPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoaXMgaXMgYW4gSW50ZXJpbSBCYXNlbGluZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmltPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEludGVyaW0oKQotCSAqIEBzZWUgI3Vuc2V0SW50ZXJpbSgpCi0JICogQHNlZSAjc2V0SW50ZXJpbShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX0ludGVyaW0oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbnRlcmltJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0ludGVyaW0oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjaXNJbnRlcmltIDxlbT5JbnRlcmltPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmltPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEludGVyaW0oKQotCSAqIEBzZWUgI3Vuc2V0SW50ZXJpbSgpCi0JICogQHNlZSAjaXNJbnRlcmltKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbnRlcmltKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzSW50ZXJpbSA8ZW0+SW50ZXJpbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJbnRlcmltKCkKLQkgKiBAc2VlICNpc0ludGVyaW0oKQotCSAqIEBzZWUgI3NldEludGVyaW0oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEludGVyaW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNpc0ludGVyaW0gPGVtPkludGVyaW08L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkludGVyaW08L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEludGVyaW0oKQotCSAqIEBzZWUgI2lzSW50ZXJpbSgpCi0JICogQHNlZSAjc2V0SW50ZXJpbShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SW50ZXJpbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZV9TdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RHVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgZHVyYXRpb24gb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREdXJhdGlvbihPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfRHVyYXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEdXJhdGlvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXREdXJhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RHVyYXRpb24oT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgRHVyYXRpb24gb2YgdGhlIFRhc2sgYmFzZWxpbmUuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZV9EdXJhdGlvbkZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkR1cmF0aW9uRm9ybWF0VHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0R1cmF0aW9uRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRlZCBEdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgYmFzZWxpbmUgZHVyYXRpb24gb2YgdGhlIHRhc2sgd2FzIGVzdGltYXRlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI3Vuc2V0RXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI3NldEVzdGltYXRlZER1cmF0aW9uKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfRXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VzdGltYXRlZER1cmF0aW9uJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0VzdGltYXRlZER1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzRXN0aW1hdGVkRHVyYXRpb24gPGVtPkVzdGltYXRlZCBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGVkIER1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVzdGltYXRlZER1cmF0aW9uKCkKLQkgKiBAc2VlICN1bnNldEVzdGltYXRlZER1cmF0aW9uKCkKLQkgKiBAc2VlICNpc0VzdGltYXRlZER1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFc3RpbWF0ZWREdXJhdGlvbihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNpc0VzdGltYXRlZER1cmF0aW9uIDxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI2lzRXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI3NldEVzdGltYXRlZER1cmF0aW9uKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRFc3RpbWF0ZWREdXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzRXN0aW1hdGVkRHVyYXRpb24gPGVtPkVzdGltYXRlZCBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGVkIER1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRFc3RpbWF0ZWREdXJhdGlvbigpCi0JICogQHNlZSAjaXNFc3RpbWF0ZWREdXJhdGlvbigpCi0JICogQHNlZSAjc2V0RXN0aW1hdGVkRHVyYXRpb24oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEVzdGltYXRlZER1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2NoZWR1bGVkIHdvcmsgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX1dvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0V29yayA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHByb2plY3RlZCBjb3N0IG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRDb3N0IDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX0JDV1MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dTJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgdGFzayB0by1kYXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX0JDV1AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dQJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dQKCk7Ci0KLX0gLy8gQmFzZWxpbmUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9CYXNlbGluZTIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9CYXNlbGluZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGEwYmRmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQmFzZWxpbmUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCYXNlbGluZTIuamF2YSx2IDEuMiAyMDA2LzA0LzExIDE1OjI5OjU1IGp0aGFyaW8gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmFzZWxpbmUyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldE51bWJlciA8ZW0+TnVtYmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUyKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdCYXNlbGluZV8uXzFfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmFzZWxpbmUyIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TnVtYmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIG51bWJlciBvZiB0aGUgYmFzZWxpbmUgZGF0YSByZWNvcmQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TnVtYmVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROdW1iZXIoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTJfTnVtYmVyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTnVtYmVyJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXROdW1iZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldE51bWJlciA8ZW0+TnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OdW1iZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE51bWJlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TnVtYmVyKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHdvcmsgYXNzaWduZWQgdGhlIHJlc291cmNlIHdoZW4gdGhlIGJhc2VsaW5lIGlzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lMl9Xb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcHJvamVjdGVkIGNvc3QgZm9yIHRoZSByZXNvdXJjZSB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDb3N0KCkKLQkgKiBAc2VlICN1bnNldENvc3QoKQotCSAqIEBzZWUgI3NldENvc3QoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUyX0Nvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0Q29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDb3N0KCkKLQkgKiBAc2VlICN1bnNldENvc3QoKQotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3QoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRDb3N0IDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENvc3QoKQotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBzZWUgI3NldENvc3QoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENvc3QoKQotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBzZWUgI3NldENvc3QoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dTPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0IGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTJfQkNXUygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXRlZCBjb3N0IG9mIG9mIHRoZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwcm9qZWN0IHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUyX0JDV1AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dQJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJDV1AoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dQKCk7Ci0KLX0gLy8gQmFzZWxpbmUyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQmFzZWxpbmUzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQmFzZWxpbmUzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg3NmJmZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Jhc2VsaW5lMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQmFzZWxpbmUzLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmFzZWxpbmUzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldE51bWJlciA8ZW0+TnVtYmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdCYXNlbGluZV8uXzJfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmFzZWxpbmUzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpbWUgcGhhc2VkIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBCYXNlbGluZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTNfVGltZXBoYXNlZERhdGEoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGltZXBoYXNlZERhdGEnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRUaW1lcGhhc2VkRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TnVtYmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIG51bWJlciBvZiB0aGUgYmFzZWxpbmUgZGF0YSByZWNvcmQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OdW1iZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE51bWJlcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUzX051bWJlcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTnVtYmVyJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE51bWJlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk51bWJlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TnVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROdW1iZXIoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2NoZWR1bGVkIHN0YXJ0IGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTNfU3RhcnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50IHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmluaXNoKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTNfRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpbmlzaCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaW5pc2goKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdG90YWwgYW1vdW50IG9mIHdvcmsgc2NoZWR1bGVkIG9uIHRoZSBhc3NpZ25tZW50IHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lM19Xb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdG90YWwgcHJvamVjdGVkIGNvc3Qgb2YgdGhlIGFzc2lnbm1lbnQgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29zdChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUzX0Nvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRDb3N0IDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dTPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIG9uIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUzX0JDV1MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dTJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJDV1MoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgYXNzaWdubWVudCB0by1kYXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUzX0JDV1AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dQJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJDV1AoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dQKCk7Ci0KLX0gLy8gQmFzZWxpbmUzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQ2FsZW5kYXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9DYWxlbmRhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOGE5MjJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9DYWxlbmRhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ2FsZW5kYXIuamF2YSx2IDEuMiAyMDA2LzA0LzExIDE1OjI5OjU1IGp0aGFyaW8gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2FsZW5kYXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2lzSXNCYXNlQ2FsZW5kYXIgPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0QmFzZUNhbGVuZGFyVUlEIDxlbT5CYXNlIENhbGVuZGFyIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRXZWVrRGF5cyA8ZW0+V2VlayBEYXlzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0Q2FsZW5kYXIoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NhbGVuZGFyXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENhbGVuZGFyIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNhbGVuZGFyLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0Q2FsZW5kYXJfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbmFtZSBvZiB0aGUgY2FsZW5kYXIuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldENhbGVuZGFyX05hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5OYW1lVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTmFtZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIEJhc2UgQ2FsZW5kYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIGNhbGVuZGFyIGlzIGEgYmFzZSBjYWxlbmRhci4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICN1bnNldElzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNzZXRJc0Jhc2VDYWxlbmRhcihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldENhbGVuZGFyX0lzQmFzZUNhbGVuZGFyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJc0Jhc2VDYWxlbmRhcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc0Jhc2VDYWxlbmRhcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNpc0lzQmFzZUNhbGVuZGFyIDxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICN1bnNldElzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNpc0lzQmFzZUNhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0Jhc2VDYWxlbmRhcihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNpc0lzQmFzZUNhbGVuZGFyIDxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNpc0lzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNzZXRJc0Jhc2VDYWxlbmRhcihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNCYXNlQ2FsZW5kYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNpc0lzQmFzZUNhbGVuZGFyIDxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc0Jhc2VDYWxlbmRhcigpCi0JICogQHNlZSAjaXNJc0Jhc2VDYWxlbmRhcigpCi0JICogQHNlZSAjc2V0SXNCYXNlQ2FsZW5kYXIoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzQmFzZUNhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIENhbGVuZGFyIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBiYXNlIGNhbGVuZGFyIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gd2hpY2ggdGhpcyBjYWxlbmRhciBkZXBlbmRzLiBPbmx5IGFwcGxpY2FibGUgaWYgdGhlIGNhbGVuZGFyIGlzIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGEgYmFzZSBjYWxlbmRhci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBDYWxlbmRhciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJhc2VDYWxlbmRhclVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldENhbGVuZGFyX0Jhc2VDYWxlbmRhclVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQmFzZUNhbGVuZGFyVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRCYXNlQ2FsZW5kYXJVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0QmFzZUNhbGVuZGFyVUlEIDxlbT5CYXNlIENhbGVuZGFyIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBDYWxlbmRhciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJhc2VDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QmFzZUNhbGVuZGFyVUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2VlayBEYXlzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBXZWVrZGF5cyB0aGF0IGRlZmluZXMgdGhpcyBjYWxlbmRhci4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XZWVrIERheXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFdlZWtEYXlzKFdlZWtEYXlzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldENhbGVuZGFyX1dlZWtEYXlzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV2Vla0RheXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWVrRGF5cyBnZXRXZWVrRGF5cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRXZWVrRGF5cyA8ZW0+V2VlayBEYXlzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5XZWVrIERheXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFdlZWtEYXlzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXZWVrRGF5cyhXZWVrRGF5cyB2YWx1ZSk7Ci0KLX0gLy8gQ2FsZW5kYXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9DYWxlbmRhcnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9DYWxlbmRhcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWRhOGZiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQ2FsZW5kYXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENhbGVuZGFycy5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNhbGVuZGFyczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFycyNnZXRDYWxlbmRhciA8ZW0+Q2FsZW5kYXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRDYWxlbmRhcnMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NhbGVuZGFyc18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDYWxlbmRhcnMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWxlbmRhcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQ2FsZW5kYXJzIGFyZSB1c2VkIHRvIGRlZmluZSBzdGFuZGFyZCB3b3JraW5nIGFuZCAKLQkgKiAgICAgICAgICAgICAgICAgICAgIG5vbi13b3JraW5nIHRpbWVzLiBQcm9qZWN0cyBtdXN0IGhhdmUgb25lIGJhc2UgY2FsZW5kYXIuIFRhc2tzIGFuZCByZXNvdXJjZXMgCi0JICogICAgICAgICAgICAgICAgICAgICBtYXkgaGF2ZSB0aGVpciBvd24gbm9uLWJhc2UgY2FsZW5kYXJzIHdoaWNoIGFyZSBiYXNlZCBvbiBhIGJhc2UgY2FsZW5kYXIuCi0JICogICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FsZW5kYXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0Q2FsZW5kYXJzX0NhbGVuZGFyKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhbGVuZGFyJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Q2FsZW5kYXIoKTsKLQotfSAvLyBDYWxlbmRhcnMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Eb2N1bWVudFJvb3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Eb2N1bWVudFJvb3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTJjNWRmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRG9jdW1lbnRSb290LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEb2N1bWVudFJvb3QuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RG9jdW1lbnQgUm9vdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0UHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldERvY3VtZW50Um9vdCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nJyBraW5kPSdtaXhlZCciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9jdW1lbnRSb290IGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1peGVkPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWl4ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X01peGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50V2lsZGNhcmQnIG5hbWU9JzptaXhlZCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0TWl4ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcC4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT4nIG1hcCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicgbWFwLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldERvY3VtZW50Um9vdF9YTUxOU1ByZWZpeE1hcCgpCi0JICogQG1vZGVsIG1hcFR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIga2V5VHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdmFsdWVUeXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0neG1sbnM6cHJlZml4JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRU1hcCBnZXRYTUxOU1ByZWZpeE1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwLgotCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicgbWFwIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+JyBtYXAuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCkKLQkgKiBAbW9kZWwgbWFwVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiBrZXlUeXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB2YWx1ZVR5cGU9ImphdmEubGFuZy5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd4c2k6c2NoZW1hTG9jYXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTWFwIGdldFhTSVNjaGVtYUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9qZWN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcHJvamVjdCBpcyB0aGUgdG9wIGxldmVsIGVsZW1lbnQgb2YgdGhlIGRvY3VtZW50LgotCSAqIAkJCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcm9qZWN0KFByb2plY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X1Byb2plY3QoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiB1cHBlcj0iLTIiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Byb2plY3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9qZWN0IGdldFByb2plY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldFByb2plY3QgPGVtPlByb2plY3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb2plY3QoUHJvamVjdCB2YWx1ZSk7Ci0KLX0gLy8gRG9jdW1lbnRSb290CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNWJhNWIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXh0ZW5kZWRBdHRyaWJ1dGUuamF2YSx2IDEuMiAyMDA2LzA0LzExIDE1OjI5OjU1IGp0aGFyaW8gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RmllbGROYW1lIDxlbT5GaWVsZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEFsaWFzIDxlbT5BbGlhczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRQaG9uZXRpY0FsaWFzIDxlbT5QaG9uZXRpYyBBbGlhczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRSb2xsdXBUeXBlIDxlbT5Sb2xsdXAgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRDYWxjdWxhdGlvblR5cGUgPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Rm9ybXVsYSA8ZW0+Rm9ybXVsYTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc1Jlc3RyaWN0VmFsdWVzIDxlbT5SZXN0cmljdCBWYWx1ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0VmFsdWVsaXN0U29ydE9yZGVyIDxlbT5WYWx1ZWxpc3QgU29ydCBPcmRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc0FwcGVuZE5ld1ZhbHVlcyA8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RGVmYXVsdCA8ZW0+RGVmYXVsdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRWYWx1ZUxpc3QgPGVtPlZhbHVlIExpc3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXh0ZW5kZWRBdHRyaWJ1dGVfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5kZWRBdHRyaWJ1dGUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgUElEIG9mIHRoZSBjdXN0b20gZmllbGQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpZWxkSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlX0ZpZWxkSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmllbGRJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmllbGRJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG5hbWUgb2YgdGhlIGN1c3RvbSBmaWVsZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmllbGROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9GaWVsZE5hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmllbGROYW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpZWxkTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRGaWVsZE5hbWUgPGVtPkZpZWxkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpZWxkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmllbGROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFsaWFzIG9mIHRoZSBjdXN0b20gZmllbGQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWxpYXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsaWFzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9BbGlhcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFsaWFzVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWxpYXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWxpYXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsaWFzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaG9uZXRpYyBBbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBob25ldGljIHByb251bmNpYXRpb24gb2YgdGhlIGFsaWFzIG9mIHRoZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSBmaWVsZAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaG9uZXRpYyBBbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGhvbmV0aWNBbGlhcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfUGhvbmV0aWNBbGlhcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlBob25ldGljQWxpYXNUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQaG9uZXRpY0FsaWFzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBob25ldGljQWxpYXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0UGhvbmV0aWNBbGlhcyA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBob25ldGljIEFsaWFzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQaG9uZXRpY0FsaWFzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xsdXAgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSG93IHJvbGx1cHMgYXJlIGNhbGN1bGF0ZWQuIFZhbHVlcyBhcmU6IDA9TWF4aW11bSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUiBmb3IgZmxhZyBmaWVsZHMpLCAxPU1pbmltdW0gKEFORCBmb3IgZmxhZyBmaWVsZHMpLCAyPUNvdW50IGFsbCwgMz1TdW0sIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgND1BdmVyYWdlLCA1PUF2ZXJhZ2UgRmlyc3QgU3VibGV2ZWwsIDY9Q291bnQgRmlyc3QgU3VibGV2ZWwsIDc9Q291bnQgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25zdW1tYXJpZXMKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sbHVwIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJvbGx1cFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9Sb2xsdXBUeXBlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUm9sbHVwVHlwZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JvbGx1cFR5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFJvbGx1cFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Um9sbHVwVHlwZSA8ZW0+Um9sbHVwIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvbGx1cCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSb2xsdXBUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSb2xsdXBUeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FsY3VsYXRpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciByb2xsdXBzIGFyZSBjYWxjdWxhdGVkIGZvciB0YXNrIGFuZCBncm91cCBzdW1tYXJ5IHJvd3MuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1Ob25lLCAxPVJvbGx1cCwgMj1DYWxjdWxhdGlvbgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxjdWxhdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYWxjdWxhdGlvblR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9DYWxjdWxhdGlvblR5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxjdWxhdGlvblR5cGVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDYWxjdWxhdGlvblR5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldENhbGN1bGF0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRDYWxjdWxhdGlvblR5cGUgPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhbGN1bGF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2FsY3VsYXRpb25UeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Rm9ybXVsYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm11bGEgdGhhdCBNaWNyb3NvZnQgUHJvamVjdCB1c2VzIHRvIHBvcHVsYXRlIHRoZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSB0YXNrIGZpZWxkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Gb3JtdWxhPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGb3JtdWxhKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9Gb3JtdWxhKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Zvcm11bGEnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Rm9ybXVsYSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRGb3JtdWxhIDxlbT5Gb3JtdWxhPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Gb3JtdWxhPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGb3JtdWxhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGb3JtdWxhKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXN0cmljdCBWYWx1ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIElmIFJlc3RyaWN0VmFsdWVzPVRydWUgdGhlbiBvbmx5IHZhbHVlcyBpbiB0aGUgbGlzdCBhcmUgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkIGluIHRoZSBmaWxlCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXN0cmljdFZhbHVlcygpCi0JICogQHNlZSAjdW5zZXRSZXN0cmljdFZhbHVlcygpCi0JICogQHNlZSAjc2V0UmVzdHJpY3RWYWx1ZXMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9SZXN0cmljdFZhbHVlcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVzdHJpY3RWYWx1ZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUmVzdHJpY3RWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjaXNSZXN0cmljdFZhbHVlcyA8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN0cmljdCBWYWx1ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UmVzdHJpY3RWYWx1ZXMoKQotCSAqIEBzZWUgI3Vuc2V0UmVzdHJpY3RWYWx1ZXMoKQotCSAqIEBzZWUgI2lzUmVzdHJpY3RWYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc3RyaWN0VmFsdWVzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzUmVzdHJpY3RWYWx1ZXMgPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXN0cmljdFZhbHVlcygpCi0JICogQHNlZSAjaXNSZXN0cmljdFZhbHVlcygpCi0JICogQHNlZSAjc2V0UmVzdHJpY3RWYWx1ZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlc3RyaWN0VmFsdWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjaXNSZXN0cmljdFZhbHVlcyA8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN0cmljdCBWYWx1ZXM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlc3RyaWN0VmFsdWVzKCkKLQkgKiBAc2VlICNpc1Jlc3RyaWN0VmFsdWVzKCkKLQkgKiBAc2VlICNzZXRSZXN0cmljdFZhbHVlcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVzdHJpY3RWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBIb3cgdmFsdWUgbGlzdHMgYXJlIHNvcnRlZC4gVmFsdWVzIGFyZTogCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPURlc2NlbmRpbmcsIDE9QXNjZW5kaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZWxpc3RTb3J0T3JkZXIoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9WYWx1ZWxpc3RTb3J0T3JkZXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZWxpc3RTb3J0T3JkZXJUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZWxpc3RTb3J0T3JkZXInIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFZhbHVlbGlzdFNvcnRPcmRlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIgPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZWxpc3QgU29ydCBPcmRlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWVsaXN0U29ydE9yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZWxpc3RTb3J0T3JkZXIoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BcHBlbmQgTmV3IFZhbHVlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgQXBwZW5kTmV3VmFsdWVzPVRydWUgdGhlbiBhbnkgbmV3IHZhbHVlcyBhZGRlZCBpbiBhIHByb2plY3QgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXV0b21hdGljYWxseSBhcHBlbmRlZCB0byB0aGUgbGlzdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICN1bnNldEFwcGVuZE5ld1ZhbHVlcygpCi0JICogQHNlZSAjc2V0QXBwZW5kTmV3VmFsdWVzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfQXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBcHBlbmROZXdWYWx1ZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQXBwZW5kTmV3VmFsdWVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzQXBwZW5kTmV3VmFsdWVzIDxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICN1bnNldEFwcGVuZE5ld1ZhbHVlcygpCi0JICogQHNlZSAjaXNBcHBlbmROZXdWYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFwcGVuZE5ld1ZhbHVlcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc0FwcGVuZE5ld1ZhbHVlcyA8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICNpc0FwcGVuZE5ld1ZhbHVlcygpCi0JICogQHNlZSAjc2V0QXBwZW5kTmV3VmFsdWVzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBcHBlbmROZXdWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc0FwcGVuZE5ld1ZhbHVlcyA8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFwcGVuZCBOZXcgVmFsdWVzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBcHBlbmROZXdWYWx1ZXMoKQotCSAqIEBzZWUgI2lzQXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICNzZXRBcHBlbmROZXdWYWx1ZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEFwcGVuZE5ld1ZhbHVlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBwb2ludHMgdG8gdGhlIGRlZmF1bHQgdmFsdWUgaW4gdGhlIGxpc3QuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IHByZXNlbnQgaWYgbm8gZGVmYXVsdCBpcyBzZXQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlZmF1bHQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlX0RlZmF1bHQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVmYXVsdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldERlZmF1bHQgPGVtPkRlZmF1bHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlZmF1bHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlIExpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZW4gdmFsdWVzIG9mIGV4dGVuZGVkIGF0dHJpYnV0ZXMgYXJlIHNwZWNpZmllZCBhcyAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgb2YgZWxlbWVudHMgaW4gdGhlIHNjaGVtYSwgdGhleSBtYXkgZWl0aGVyIGJlIHNwZWNpZmllZCBieSB2YWx1ZXMgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBieSByZWZlcmVuY2VzIHRvIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbGlzdC4gIEFwcGxpY2F0aW9ucyBtYXkgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3N1bWUgb3JkZXJpbmcgb2YgdGhlIGxpc3QgYnkgb3JkZXJpbmcgc3BlY2lmaWVkIGhlcmUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIExpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFZhbHVlTGlzdChWYWx1ZUxpc3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfVmFsdWVMaXN0KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWVMaXN0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFsdWVMaXN0IGdldFZhbHVlTGlzdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRWYWx1ZUxpc3QgPGVtPlZhbHVlIExpc3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIExpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFZhbHVlTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWVMaXN0KFZhbHVlTGlzdCB2YWx1ZSk7Ci0KLX0gLy8gRXh0ZW5kZWRBdHRyaWJ1dGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZTIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjdmODEyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeHRlbmRlZEF0dHJpYnV0ZTIuamF2YSx2IDEuMiAyMDA2LzA0LzExIDE1OjI5OjU1IGp0aGFyaW8gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlMjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0V4dGVuZGVkQXR0cmlidXRlXy5fMV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFeHRlbmRlZEF0dHJpYnV0ZTIgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgY29sbGVjdGlvbi4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlMl9VSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1VJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRVSUQgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgUElEIG9mIHRoZSBjdXN0b20gZmllbGQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpZWxkSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlMl9GaWVsZElEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpZWxkSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGRJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZElEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX1ZhbHVlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dCBsb29rdXAgdGFibGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfVmFsdWVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RHVyYXRpb24gRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBidWxrIGR1cmF0aW9uLiAgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5PSUsIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX0R1cmF0aW9uRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRHVyYXRpb25Gb3JtYXRUeXBlMiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRHVyYXRpb25Gb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldER1cmF0aW9uRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotfSAvLyBFeHRlbmRlZEF0dHJpYnV0ZTIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZTMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTBiMDEwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGUzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeHRlbmRlZEF0dHJpYnV0ZTMuamF2YSx2IDEuMiAyMDA2LzA0LzExIDE1OjI5OjU1IGp0aGFyaW8gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlMzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0V4dGVuZGVkQXR0cmlidXRlXy5fMl8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFeHRlbmRlZEF0dHJpYnV0ZTMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgY29sbGVjdGlvbi4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlM19VSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1VJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRVSUQgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgUElEIG9mIHRoZSBjdXN0b20gZmllbGQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpZWxkSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlM19GaWVsZElEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpZWxkSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGRJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZElEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX1ZhbHVlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dCBsb29rdXAgdGFibGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfVmFsdWVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RHVyYXRpb24gRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBidWxrIGR1cmF0aW9uLiAgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX0R1cmF0aW9uRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRHVyYXRpb25Gb3JtYXRUeXBlMyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRHVyYXRpb25Gb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldER1cmF0aW9uRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotfSAvLyBFeHRlbmRlZEF0dHJpYnV0ZTMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZTQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTQ0MjQwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGU0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeHRlbmRlZEF0dHJpYnV0ZTQuamF2YSx2IDEuMiAyMDA2LzA0LzExIDE1OjI5OjU1IGp0aGFyaW8gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlNDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0V4dGVuZGVkQXR0cmlidXRlXy5fM18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFeHRlbmRlZEF0dHJpYnV0ZTQgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgY29sbGVjdGlvbi4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmaWVsZCBJRCBpbiB0aGUgbG9jYWxpc2VkIGxhbmd1YWdlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpZWxkSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlNF9GaWVsZElEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpZWxkSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGRJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZElEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0IGxvb2t1cCB0YWJsZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X1ZhbHVlSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X0R1cmF0aW9uRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRHVyYXRpb25Gb3JtYXRUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEdXJhdGlvbkZvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi19IC8vIEV4dGVuZGVkQXR0cmlidXRlNApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZTYzYWRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXh0ZW5kZWRBdHRyaWJ1dGVzLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlcyNnZXRFeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdFeHRlbmRlZEF0dHJpYnV0ZXNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5kZWRBdHRyaWJ1dGVzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFYWNoIG9mIHRoZSBpbmRpdmlkdWFsIGVudHJpZXMgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZXMgZGVmaW5pdGlvbiAKLQkgKiAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uICBUaGVyZSBhcmUgbm8gbGltaXRzIHRvIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCBtYXkgYXBwZWFyLCBidXQgcHJvamVjdCAKLQkgKiAgICAgICAgICAgICAgICAgICAgIHdpbGwgb25seSB1bmRlcnN0YW5kIEZsYWcxLUZsYWcxMCwgZXRjLiAgVGhpcyBtdXN0IGFwcGVhciBvbmNlIGluIGVhY2ggRXh0ZW5kZWRBdHRyaWJ1dGVzIAotCSAqICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlc19FeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVuZGVkQXR0cmlidXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotfSAvLyBFeHRlbmRlZEF0dHJpYnV0ZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9NYXNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTWFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZTAyZTI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9NYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNYXNrLmphdmEsdiAxLjIgMjAwNi8wNC8xMSAxNToyOTo1NSBqdGhhcmlvIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1hc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrI2dldExldmVsIDxlbT5MZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZW5ndGggPGVtPkxlbmd0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrI2dldFNlcGFyYXRvciA8ZW0+U2VwYXJhdG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0TWFzaygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTWFza18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNYXNrIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBsZXZlbCBvZiB0aGUgbWFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExldmVsKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0TWFza19MZXZlbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGV2ZWwnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldExldmVsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0TGV2ZWwgPGVtPkxldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHR5cGUgb2YgbWFzay4gVmFsdWVzIGFyZTogMD1OdW1iZXJzLCAxPVVwcGVyIENhc2UgTGV0dGVycywgMj1Mb3dlciBDYXNlIExldHRlcnMsIDM9Q2hhcmFjdGVycwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0TWFza19UeXBlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVHlwZVR5cGU1IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxlbmd0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG1heGltdW0gbGVuZ3RoIGluIGNoYXJhY3RlcnMgb2YgdGhlIG91dGxpbmUgY29kZSB2YWx1ZXMuICBJZiBsZW5ndGggaXMgYW55LCB0aGUgdmFsdWUgaXMgemVyby4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGVuZ3RoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMZW5ndGgoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRNYXNrX0xlbmd0aCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGVuZ3RoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZW5ndGggPGVtPkxlbmd0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGVuZ3RoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExlbmd0aChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcGFyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNlcGFyYXRvciB2YWx1ZSBvZiB0aGUgY29kZSB2YWx1ZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcGFyYXRvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2VwYXJhdG9yKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRNYXNrX1NlcGFyYXRvcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTZXBhcmF0b3InIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2VwYXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0U2VwYXJhdG9yIDxlbT5TZXBhcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcGFyYXRvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2VwYXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZXBhcmF0b3IoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBNYXNrCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTWFza3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9NYXNrcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNDRlNDU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9NYXNrcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNYXNrcy5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1hc2tzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza3MjZ2V0TWFzayA8ZW0+TWFzazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE1hc2tzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNYXNrc18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNYXNrcyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hc2s8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvdXIgZWxlbWVudHMgb2YgdGhlIG1hc2sgY29uc3RpdHV0ZSB0aGUgZm9ybWF0IGluIHdoaWNoIHRoZSBvdXRsaW5lIGNvZGUgbXVzdCBhcHBlYXIuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hc2s8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0TWFza3NfTWFzaygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWFzaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE1hc2soKTsKLQotfSAvLyBNYXNrcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01zcHJvamVjdEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Nc3Byb2plY3RGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjOWVlZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01zcHJvamVjdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1zcHJvamVjdEZhY3RvcnkuamF2YSx2IDEuMiAyMDA2LzA0LzExIDE1OjI5OjU1IGp0aGFyaW8gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1zcHJvamVjdEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNc3Byb2plY3RGYWN0b3J5IGVJTlNUQU5DRSA9IG5ldyBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0RmFjdG9yeUltcGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXNzaWdubWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXNzaWdubWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXNzaWdubWVudCBjcmVhdGVBc3NpZ25tZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFzc2lnbm1lbnRzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Bc3NpZ25tZW50czwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXNzaWdubWVudHMgY3JlYXRlQXNzaWdubWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXZhaWxhYmlsaXR5UGVyaW9kIGNyZWF0ZUF2YWlsYWJpbGl0eVBlcmlvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUF2YWlsYWJpbGl0eVBlcmlvZHMgY3JlYXRlQXZhaWxhYmlsaXR5UGVyaW9kcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CYXNlbGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmFzZWxpbmU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJhc2VsaW5lIGNyZWF0ZUJhc2VsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJhc2VsaW5lMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmFzZWxpbmUyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCYXNlbGluZTIgY3JlYXRlQmFzZWxpbmUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJhc2VsaW5lMzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmFzZWxpbmUzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCYXNlbGluZTMgY3JlYXRlQmFzZWxpbmUzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNhbGVuZGFyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DYWxlbmRhcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ2FsZW5kYXIgY3JlYXRlQ2FsZW5kYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2FsZW5kYXJzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DYWxlbmRhcnM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNhbGVuZGFycyBjcmVhdGVDYWxlbmRhcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG9jdW1lbnRSb290IGNyZWF0ZURvY3VtZW50Um9vdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXh0ZW5kZWRBdHRyaWJ1dGUgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXh0ZW5kZWRBdHRyaWJ1dGUyIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlMigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFeHRlbmRlZEF0dHJpYnV0ZTMgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGUzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4dGVuZGVkQXR0cmlidXRlNCBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXh0ZW5kZWRBdHRyaWJ1dGVzIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NYXNrPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NYXNrPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNYXNrIGNyZWF0ZU1hc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWFza3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1hc2tzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNYXNrcyBjcmVhdGVNYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGxpbmUgQ29kZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3V0bGluZUNvZGUgY3JlYXRlT3V0bGluZUNvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlMjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3V0bGluZUNvZGUyIGNyZWF0ZU91dGxpbmVDb2RlMigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PdXRsaW5lIENvZGUzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PdXRsaW5lIENvZGUzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPdXRsaW5lQ29kZTMgY3JlYXRlT3V0bGluZUNvZGUzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGxpbmUgQ29kZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGxpbmUgQ29kZXM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU91dGxpbmVDb2RlcyBjcmVhdGVPdXRsaW5lQ29kZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJlZGVjZXNzb3JMaW5rIGNyZWF0ZVByZWRlY2Vzc29yTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9qZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9qZWN0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9qZWN0IGNyZWF0ZVByb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmF0ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmF0ZSBjcmVhdGVSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJhdGVzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SYXRlczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmF0ZXMgY3JlYXRlUmF0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVzb3VyY2VzIGNyZWF0ZVJlc291cmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXNrIGNyZWF0ZVRhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFza3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2tzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXNrcyBjcmVhdGVUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UaW1lIFBlcmlvZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRpbWVQZXJpb2QgY3JlYXRlVGltZVBlcmlvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UaW1lcGhhc2VkIERhdGEgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGltZXBoYXNlZCBEYXRhIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRpbWVwaGFzZWREYXRhVHlwZSBjcmVhdGVUaW1lcGhhc2VkRGF0YVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VmFsdWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlWYWx1ZSBjcmVhdGVWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5WYWx1ZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlZhbHVlMjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFsdWUyIGNyZWF0ZVZhbHVlMigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5WYWx1ZSBMaXN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5WYWx1ZSBMaXN0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlWYWx1ZUxpc3QgY3JlYXRlVmFsdWVMaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlZhbHVlczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VmFsdWVzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlWYWx1ZXMgY3JlYXRlVmFsdWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldCUyBNYXNrPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XQlMgTWFzazwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV0JTTWFzayBjcmVhdGVXQlNNYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldCUyBNYXNrczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V0JTIE1hc2tzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXQlNNYXNrcyBjcmVhdGVXQlNNYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XZWVrIERheTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2VlayBEYXk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlZWtEYXkgY3JlYXRlV2Vla0RheSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XZWVrIERheXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldlZWsgRGF5czwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV2Vla0RheXMgY3JlYXRlV2Vla0RheXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29ya2luZyBUaW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JraW5nIFRpbWU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtpbmdUaW1lIGNyZWF0ZVdvcmtpbmdUaW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmtpbmcgVGltZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmtpbmcgVGltZXM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtpbmdUaW1lcyBjcmVhdGVXb3JraW5nVGltZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTXNwcm9qZWN0UGFja2FnZSBnZXRNc3Byb2plY3RQYWNrYWdlKCk7Ci0KLX0gLy9Nc3Byb2plY3RGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTXNwcm9qZWN0UGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01zcHJvamVjdFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODg1Njc2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTXNwcm9qZWN0UGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1NDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNc3Byb2plY3RQYWNrYWdlLmphdmEsdiAxLjIgMjAwNi8wNC8xMSAxNToyOTo1NSBqdGhhcmlvIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIGZ1bGwgcHJvamVjdCBzY2hlbWEgZGVmaW5pdGlvbiBmcm9tIHRoZSBwcm9qZWN0IGxldmVsIGRvd24sIAotICogCQlzdGFydGluZyB3aXRoIGRhdGEgdHlwZSBkZWZpbml0aW9ucy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RGYWN0b3J5Ci0gKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNc3Byb2plY3RQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gIm1zcHJvamVjdCI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly9lcGYuZWNsaXBzZS5vcmcvbXNwcm9qZWN0IjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm1zcHJvamVjdCI7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCU1zcHJvamVjdFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsIDxlbT5Bc3NpZ25tZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBU1NJR05NRU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19VSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhc2sgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fVEFTS19VSUQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1JFU09VUkNFX1VJRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0FDVFVBTF9DT1NUID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgRmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQUNUVUFMX0ZJTklTSCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfQ09TVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfV09SSyA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQUNUVUFMX1NUQVJUID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0FDVFVBTF9XT1JLID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQUNXUCA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmZpcm1lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0NPTkZJUk1FRCA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19DT1NUID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdCBSYXRlIFRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQ09TVF9SQVRFX1RBQkxFID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0NPU1RfVkFSSUFOQ0UgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DVjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0NWID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVsYXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19ERUxBWSA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0ZJTklTSCA9IDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0ZJTklTSF9WQVJJQU5DRSA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0hZUEVSTElOSyA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluayBBZGRyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fSFlQRVJMSU5LX0FERFJFU1MgPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19IWVBFUkxJTktfU1VCX0FERFJFU1MgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fV09SS19WQVJJQU5DRSA9IDIyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fSEFTX0ZJWEVEX1JBVEVfVU5JVFMgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaXhlZCBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0ZJWEVEX01BVEVSSUFMID0gMjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGV2ZWxpbmcgRGVsYXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19MRVZFTElOR19ERUxBWSA9IDI1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVCA9IDI2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBGaWVsZHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19MSU5LRURfRklFTERTID0gMjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWlsZXN0b25lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fTUlMRVNUT05FID0gMjg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19OT1RFUyA9IDI5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJhbGxvY2F0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19PVkVSQUxMT0NBVEVEID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX09WRVJUSU1FX0NPU1QgPSAzMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fT1ZFUlRJTUVfV09SSyA9IDMyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZ3VsYXIgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1JFR1VMQVJfV09SSyA9IDMzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fUkVNQUlOSU5HX0NPU1QgPSAzNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUID0gMzU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSyA9IDM2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fUkVNQUlOSU5HX1dPUksgPSAzNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zZSBQZW5kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fUkVTUE9OU0VfUEVORElORyA9IDM4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fU1RBUlQgPSAzOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdG9wPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fU1RPUCA9IDQwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3VtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1JFU1VNRSA9IDQxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fU1RBUlRfVkFSSUFOQ0UgPSA0MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vbml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1VOSVRTID0gNDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBkYXRlIE5lZWRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1VQREFURV9ORUVERUQgPSA0NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WQUM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19WQUMgPSA0NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fV09SSyA9IDQ2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgQ29udG91cjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1dPUktfQ09OVE9VUiA9IDQ3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19CQ1dTID0gNDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0JDV1AgPSA0OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Cb29raW5nIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19CT09LSU5HX1RZUEUgPSA1MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19BQ1RVQUxfV09SS19QUk9URUNURUQgPSA1MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQgPSA1MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DcmVhdGlvbiBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQ1JFQVRJT05fREFURSA9IDUzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fRVhURU5ERURfQVRUUklCVVRFID0gNTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZWxpbmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0JBU0VMSU5FID0gNTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19USU1FUEhBU0VEX0RBVEEgPSA1NjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QXNzaWdubWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX0ZFQVRVUkVfQ09VTlQgPSA1NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRzSW1wbCA8ZW0+QXNzaWdubWVudHM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudHNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QXNzaWdubWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVFMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2lnbm1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRTX19BU1NJR05NRU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QXNzaWdubWVudHM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVFNfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5BdmFpbGFiaWxpdHlQZXJpb2RJbXBsIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkF2YWlsYWJpbGl0eVBlcmlvZEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVZBSUxBQklMSVRZX1BFUklPRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXZhaWxhYmxlIEZyb208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfRlJPTSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXZhaWxhYmxlIFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1RPID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdmFpbGFibGUgVW5pdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVU5JVFMgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFWQUlMQUJJTElUWV9QRVJJT0RfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5BdmFpbGFiaWxpdHlQZXJpb2RzSW1wbCA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXZhaWxhYmlsaXR5UGVyaW9kc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFWQUlMQUJJTElUWV9QRVJJT0RTID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdmFpbGFiaWxpdHkgUGVyaW9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBVkFJTEFCSUxJVFlfUEVSSU9EU19fQVZBSUxBQklMSVRZX1BFUklPRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFWQUlMQUJJTElUWV9QRVJJT0RTX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmVJbXBsIDxlbT5CYXNlbGluZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBCQVNFTElORSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fVElNRVBIQVNFRF9EQVRBID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OdW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fTlVNQkVSID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmltPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkVfX0lOVEVSSU0gPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkVfX1NUQVJUID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fRklOSVNIID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19EVVJBVElPTiA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVyYXRpb24gRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkVfX0RVUkFUSU9OX0ZPUk1BVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGVkIER1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkVfX0VTVElNQVRFRF9EVVJBVElPTiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19XT1JLID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkVfX0NPU1QgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fQkNXUyA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fQkNXUCA9IDExOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5CYXNlbGluZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9GRUFUVVJFX0NPVU5UID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTJJbXBsIDxlbT5CYXNlbGluZTI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEJhc2VsaW5lMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBCQVNFTElORTIgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk51bWJlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FMl9fTlVNQkVSID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUyX19XT1JLID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUyX19DT1NUID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CQ1dTPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUyX19CQ1dTID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUyX19CQ1dQID0gNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QmFzZWxpbmUyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FMl9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lM0ltcGwgPGVtPkJhc2VsaW5lMzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QmFzZWxpbmUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJBU0VMSU5FMyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTNfX1RJTUVQSEFTRURfREFUQSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnVtYmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUzX19OVU1CRVIgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUzX19TVEFSVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUzX19GSU5JU0ggPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTNfX1dPUksgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTNfX0NPU1QgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTNfX0JDV1MgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTNfX0JDV1AgPSA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5CYXNlbGluZTM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUzX0ZFQVRVUkVfQ09VTlQgPSA4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQ2FsZW5kYXJJbXBsIDxlbT5DYWxlbmRhcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDYWxlbmRhcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDQUxFTkRBUiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FMRU5EQVJfX1VJRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBTEVOREFSX19OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBCYXNlIENhbGVuZGFyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FMRU5EQVJfX0lTX0JBU0VfQ0FMRU5EQVIgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgQ2FsZW5kYXIgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FMRU5EQVJfX0JBU0VfQ0FMRU5EQVJfVUlEID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWVrIERheXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQUxFTkRBUl9fV0VFS19EQVlTID0gNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+Q2FsZW5kYXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FMRU5EQVJfRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhcnNJbXBsIDxlbT5DYWxlbmRhcnM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQ2FsZW5kYXJzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldENhbGVuZGFycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDQUxFTkRBUlMgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhbGVuZGFyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQUxFTkRBUlNfX0NBTEVOREFSID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+Q2FsZW5kYXJzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBTEVOREFSU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkRvY3VtZW50Um9vdEltcGwgPGVtPkRvY3VtZW50IFJvb3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRG9jdW1lbnRSb290SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fTUlYRUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX1BST0pFQ1QgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZUltcGwgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsaWFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19BTElBUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGhvbmV0aWMgQWxpYXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVfX1BIT05FVElDX0FMSUFTID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2xsdXAgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fUk9MTFVQX1RZUEUgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhbGN1bGF0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVfX0NBTENVTEFUSU9OX1RZUEUgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZvcm11bGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVfX0ZPUk1VTEEgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3RyaWN0IFZhbHVlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fUkVTVFJJQ1RfVkFMVUVTID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZWxpc3QgU29ydCBPcmRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVMSVNUX1NPUlRfT1JERVIgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFwcGVuZCBOZXcgVmFsdWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19BUFBFTkRfTkVXX1ZBTFVFUyA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fREVGQVVMVCA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIExpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFX0xJU1QgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9GRUFUVVJFX0NPVU5UID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTJJbXBsIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlMkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFMiA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTJfX1VJRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUyX19GSUVMRF9JRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRV9JRCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVyYXRpb24gRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFMl9fRFVSQVRJT05fRk9STUFUID0gNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUyX0ZFQVRVUkVfQ09VTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTMgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUzX19VSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFM19fRklFTERfSUQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFM19fVkFMVUUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFM19fVkFMVUVfSUQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTNfX0RVUkFUSU9OX0ZPUk1BVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFM19GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlNEltcGwgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEU0ID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFNF9fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTRfX0ZJRUxEX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTRfX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTRfX1ZBTFVFX0lEID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdXJhdGlvbiBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEU0X19EVVJBVElPTl9GT1JNQVQgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTRfRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZXNJbXBsIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFUyA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFU19fRVhURU5ERURfQVRUUklCVVRFID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVTX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTWFza0ltcGwgPGVtPk1hc2s8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTWFza0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRNYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1BU0sgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1BU0tfX0xFVkVMID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUFTS19fVFlQRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGVuZ3RoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUFTS19fTEVOR1RIID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXBhcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNQVNLX19TRVBBUkFUT1IgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5NYXNrPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1BU0tfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrc0ltcGwgPGVtPk1hc2tzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1hc2tzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE1hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1BU0tTID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFzazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUFTS1NfX01BU0sgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5NYXNrczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNQVNLU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCA8ZW0+T3V0bGluZSBDb2RlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERSA9IDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19GSUVMRF9JRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERV9fRklFTERfTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWxpYXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX0FMSUFTID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaG9uZXRpYyBBbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERV9fUEhPTkVUSUNfQUxJQVMgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERV9fVkFMVUVTID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRlcnByaXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19FTlRFUlBSSVNFID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERV9fRU5URVJQUklTRV9PVVRMSU5FX0NPREVfQUxJQVMgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19SRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGVhZiBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19MRUFGX09OTFkgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX0FMTF9MRVZFTFNfUkVRVUlSRUQgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX09OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRUQgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXNrczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERV9fTUFTS1MgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+T3V0bGluZSBDb2RlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERV9GRUFUVVJFX0NPVU5UID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZTJJbXBsIDxlbT5PdXRsaW5lIENvZGUyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlMkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRPdXRsaW5lQ29kZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFMiA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERTJfX1VJRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREUyX19GSUVMRF9JRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREUyX19WQUxVRV9JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk91dGxpbmUgQ29kZTI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFMl9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlM0ltcGwgPGVtPk91dGxpbmUgQ29kZTM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGUzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE91dGxpbmVDb2RlMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREUzID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFM19fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERTNfX0ZJRUxEX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERTNfX1ZBTFVFX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+T3V0bGluZSBDb2RlMzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREUzX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVzSW1wbCA8ZW0+T3V0bGluZSBDb2RlczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZXNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0T3V0bGluZUNvZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERVMgPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRsaW5lIENvZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERVNfX09VVExJTkVfQ09ERSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk91dGxpbmUgQ29kZXM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByZWRlY2Vzc29yTGlua0ltcGwgPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJlZGVjZXNzb3JMaW5rSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFByZWRlY2Vzc29yTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUkVERUNFU1NPUl9MSU5LID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3IgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJFREVDRVNTT1JfTElOS19fUFJFREVDRVNTT1JfVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJFREVDRVNTT1JfTElOS19fVFlQRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3Jvc3MgUHJvamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1QgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyb3NzIFByb2plY3QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1RfTkFNRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluayBMYWc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkVERUNFU1NPUl9MSU5LX19MSU5LX0xBRyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFnIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSRURFQ0VTU09SX0xJTktfX0xBR19GT1JNQVQgPSA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSRURFQ0VTU09SX0xJTktfRkVBVFVSRV9DT1VOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCA8ZW0+UHJvamVjdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPSkVDVCA9IDIyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1VJRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpdGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fVElUTEUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YmplY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19TVUJKRUNUID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0NBVEVHT1JZID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21wYW55PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ09NUEFOWSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFuYWdlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX01BTkFHRVIgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0FVVEhPUiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3JlYXRpb24gRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0NSRUFUSU9OX0RBVEUgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldmlzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fUkVWSVNJT04gPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhc3QgU2F2ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19MQVNUX1NBVkVEID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZWR1bGUgRnJvbSBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1NDSEVEVUxFX0ZST01fU1RBUlQgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fU1RBUlRfREFURSA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fRklOSVNIX0RBVEUgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GWSBTdGFydCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fRllTVEFSVF9EQVRFID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19DUklUSUNBTF9TTEFDS19MSU1JVCA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbmN5IERpZ2l0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0NVUlJFTkNZX0RJR0lUUyA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbmN5IFN5bWJvbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0NVUlJFTkNZX1NZTUJPTCA9IDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0NVUlJFTkNZX1NZTUJPTF9QT1NJVElPTiA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhbGVuZGFyIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0NBTEVOREFSX1VJRCA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgU3RhcnQgVGltZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RFRkFVTFRfU1RBUlRfVElNRSA9IDIwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgRmluaXNoIFRpbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19ERUZBVUxUX0ZJTklTSF9USU1FID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWludXRlcyBQZXIgRGF5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTUlOVVRFU19QRVJfREFZID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWludXRlcyBQZXIgV2VlazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX01JTlVURVNfUEVSX1dFRUsgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXlzIFBlciBNb250aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RBWVNfUEVSX01PTlRIID0gMjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBUYXNrIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19ERUZBVUxUX1RBU0tfVFlQRSA9IDI1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUwgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFN0YW5kYXJkIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19ERUZBVUxUX1NUQU5EQVJEX1JBVEUgPSAyNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19ERUZBVUxUX09WRVJUSU1FX1JBVEUgPSAyODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdXJhdGlvbiBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19EVVJBVElPTl9GT1JNQVQgPSAyOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1dPUktfRk9STUFUID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fRURJVEFCTEVfQUNUVUFMX0NPU1RTID0gMzE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SG9ub3IgQ29uc3RyYWludHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19IT05PUl9DT05TVFJBSU5UUyA9IDMyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19FQVJORURfVkFMVUVfTUVUSE9EID0gMzM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fSU5TRVJURURfUFJPSkVDVFNfTElLRV9TVU1NQVJZID0gMzQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19NVUxUSVBMRV9DUklUSUNBTF9QQVRIUyA9IDM1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTkVXX1RBU0tTX0VGRk9SVF9EUklWRU4gPSAzNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OZXcgVGFza3MgRXN0aW1hdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTkVXX1RBU0tTX0VTVElNQVRFRCA9IDM3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1NQTElUU19JTl9QUk9HUkVTU19UQVNLUyA9IDM4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNwcmVhZCBBY3R1YWwgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1NQUkVBRF9BQ1RVQUxfQ09TVCA9IDM5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fU1BSRUFEX1BFUkNFTlRfQ09NUExFVEUgPSA0MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19UQVNLX1VQREFURVNfUkVTT1VSQ0UgPSA0MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaXNjYWwgWWVhciBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0ZJU0NBTF9ZRUFSX1NUQVJUID0gNDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2VlayBTdGFydCBEYXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19XRUVLX1NUQVJUX0RBWSA9IDQzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vdmUgQ29tcGxldGVkIEVuZHMgQmFjazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfQkFDSyA9IDQ0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0sgPSA0NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX01PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJEID0gNDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19GT1JXQVJEID0gNDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZWxpbmUgRm9yIEVhcm5lZCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0JBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUUgPSA0ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0FVVE9fQUREX05FV19SRVNPVVJDRVNfQU5EX1RBU0tTID0gNDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhdHVzIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19TVEFUVVNfREFURSA9IDUwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0NVUlJFTlRfREFURSA9IDUxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19NSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMID0gNTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0b2xpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19BVVRPTElOSyA9IDUzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19ORVdfVEFTS19TVEFSVF9EQVRFID0gNTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RFRkFVTFRfVEFTS19FVl9NRVRIT0QgPSA1NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9qZWN0IEV4dGVybmFsbHkgRWRpdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fUFJPSkVDVF9FWFRFUk5BTExZX0VESVRFRCA9IDU2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVuZGVkIENyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19FWFRFTkRFRF9DUkVBVElPTl9EQVRFID0gNTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFscyBJbiBTeW5jPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQUNUVUFMU19JTl9TWU5DID0gNTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1JFTU9WRV9GSUxFX1BST1BFUlRJRVMgPSA1OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZG1pbiBQcm9qZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQURNSU5fUFJPSkVDVCA9IDYwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGxpbmUgQ29kZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19PVVRMSU5FX0NPREVTID0gNjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V0JTIE1hc2tzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fV0JTX01BU0tTID0gNjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVMgPSA2MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYWxlbmRhcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19DQUxFTkRBUlMgPSA2NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXNrczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1RBU0tTID0gNjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fUkVTT1VSQ0VTID0gNjY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzaWdubWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19BU1NJR05NRU5UUyA9IDY3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Qcm9qZWN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfRkVBVFVSRV9DT1VOVCA9IDY4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZUltcGwgPGVtPlJhdGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJBVEUgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYXRlcyBGcm9tPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFURV9fUkFURVNfRlJPTSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmF0ZXMgVG88L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFX19SQVRFU19UTyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmF0ZSBUYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVfX1JBVEVfVEFCTEUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YW5kYXJkIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFX19TVEFOREFSRF9SQVRFID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVfX1NUQU5EQVJEX1JBVEVfRk9STUFUID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdmVydGltZSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFURV9fT1ZFUlRJTUVfUkFURSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFX19PVkVSVElNRV9SQVRFX0ZPUk1BVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdCBQZXIgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFURV9fQ09TVF9QRVJfVVNFID0gNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UmF0ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFX0ZFQVRVUkVfQ09VTlQgPSA4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZXNJbXBsIDxlbT5SYXRlczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRSYXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSQVRFUyA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVTX19SQVRFID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UmF0ZXM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFURVNfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwgPGVtPlJlc291cmNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFU09VUkNFID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1VJRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fSUQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fTkFNRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19UWVBFID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBOdWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0lTX05VTEwgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0lOSVRJQUxTID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaG9uZXRpY3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fUEhPTkVUSUNTID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OVCBBY2NvdW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX05UQUNDT1VOVCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWF0ZXJpYWwgTGFiZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fTUFURVJJQUxfTEFCRUwgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQ09ERSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fR1JPVVAgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrIEdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1dPUktfR1JPVVAgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbWFpbCBBZGRyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0VNQUlMX0FERFJFU1MgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IeXBlcmxpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fSFlQRVJMSU5LID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SHlwZXJsaW5rIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fSFlQRVJMSU5LX0FERFJFU1MgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fSFlQRVJMSU5LX1NVQl9BRERSRVNTID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWF4IFVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX01BWF9VTklUUyA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlYWsgVW5pdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fUEVBS19VTklUUyA9IDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXIgQWxsb2NhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX09WRVJfQUxMT0NBVEVEID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXZhaWxhYmxlIEZyb208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQVZBSUxBQkxFX0ZST00gPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdmFpbGFibGUgVG88L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQVZBSUxBQkxFX1RPID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fU1RBUlQgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fRklOSVNIID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FuIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0NBTl9MRVZFTCA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY3J1ZSBBdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BQ0NSVUVfQVQgPSAyNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1dPUksgPSAyNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWd1bGFyIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fUkVHVUxBUl9XT1JLID0gMjY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19PVkVSVElNRV9XT1JLID0gMjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQUNUVUFMX1dPUksgPSAyODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19SRU1BSU5JTkdfV09SSyA9IDI5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUksgPSAzMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhbmRhcmQgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19TVEFOREFSRF9SQVRFID0gMzM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fU1RBTkRBUkRfUkFURV9GT1JNQVQgPSAzNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0NPU1QgPSAzNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdmVydGltZSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEUgPSAzNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdmVydGltZSBSYXRlIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19PVkVSVElNRV9SQVRFX0ZPUk1BVCA9IDM3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fT1ZFUlRJTUVfQ09TVCA9IDM4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvc3QgUGVyIFVzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19DT1NUX1BFUl9VU0UgPSAzOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BQ1RVQUxfQ09TVCA9IDQwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9DT1NUID0gNDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtYWluaW5nIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fUkVNQUlOSU5HX0NPU1QgPSA0MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVCA9IDQzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fV09SS19WQVJJQU5DRSA9IDQ0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvc3QgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQ09TVF9WQVJJQU5DRSA9IDQ1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNWPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1NWID0gNDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q1Y8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQ1YgPSA0NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0FDV1AgPSA0ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYWxlbmRhciBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQ0FMRU5EQVJfVUlEID0gNDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fTk9URVMgPSA1MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CQ1dTPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0JDV1MgPSA1MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0JDV1AgPSA1MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBHZW5lcmljPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0lTX0dFTkVSSUMgPSA1MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBJbmFjdGl2ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19JU19JTkFDVElWRSA9IDU0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEVudGVycHJpc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fSVNfRU5URVJQUklTRSA9IDU1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJvb2tpbmcgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19CT09LSU5HX1RZUEUgPSA1NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQUNUVUFMX1dPUktfUFJPVEVDVEVEID0gNTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRCA9IDU4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BQ1RJVkVfRElSRUNUT1JZX0dVSUQgPSA1OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DcmVhdGlvbiBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0NSRUFUSU9OX0RBVEUgPSA2MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19FWFRFTkRFRF9BVFRSSUJVVEUgPSA2MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0JBU0VMSU5FID0gNjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0bGluZSBDb2RlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fT1VUTElORV9DT0RFID0gNjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQVZBSUxBQklMSVRZX1BFUklPRFMgPSA2NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19SQVRFUyA9IDY1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWVwaGFzZWQgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1RJTUVQSEFTRURfREFUQSA9IDY2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5SZXNvdXJjZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9GRUFUVVJFX0NPVU5UID0gNjc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZXNJbXBsIDxlbT5SZXNvdXJjZXM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFJlc291cmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRVNPVVJDRVMgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VTX19SRVNPVVJDRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlJlc291cmNlczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRVNfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCA8ZW0+VGFzazwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEFTSyA9IDI3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1VJRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19JRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX05BTUUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19UWVBFID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBOdWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fSVNfTlVMTCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3JlYXRlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19DUkVBVEVfREFURSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0NPTlRBQ1QgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldCUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1dCUyA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V0JTIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fV0JTX0xFVkVMID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRsaW5lIE51bWJlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09VVExJTkVfTlVNQkVSID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRsaW5lIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1VUTElORV9MRVZFTCA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByaW9yaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUFJJT1JJVFkgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1NUQVJUID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRklOSVNIID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19EVVJBVElPTiA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0RVUkFUSU9OX0ZPUk1BVCA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19XT1JLID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RvcDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1NUT1AgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXN1bWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19SRVNVTUUgPSAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXN1bWUgVmFsaWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19SRVNVTUVfVkFMSUQgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FZmZvcnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRUZGT1JUX0RSSVZFTiA9IDIwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlY3VycmluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFQ1VSUklORyA9IDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXIgQWxsb2NhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1ZFUl9BTExPQ0FURUQgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FU1RJTUFURUQgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaWxlc3RvbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19NSUxFU1RPTkUgPSAyNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdW1tYXJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU1VNTUFSWSA9IDI1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyaXRpY2FsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ1JJVElDQUwgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTdWJwcm9qZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fSVNfU1VCUFJPSkVDVCA9IDI3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fSVNfU1VCUFJPSkVDVF9SRUFEX09OTFkgPSAyODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWJwcm9qZWN0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19TVUJQUk9KRUNUX05BTUUgPSAyOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBUYXNrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVhURVJOQUxfVEFTSyA9IDMwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIFRhc2sgUHJvamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VYVEVSTkFMX1RBU0tfUFJPSkVDVCA9IDMxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVhcmx5IFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRUFSTFlfU1RBUlQgPSAzMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FYXJseSBGaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FQVJMWV9GSU5JU0ggPSAzMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYXRlIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTEFURV9TVEFSVCA9IDM0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhdGUgRmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTEFURV9GSU5JU0ggPSAzNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1NUQVJUX1ZBUklBTkNFID0gMzY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRklOSVNIX1ZBUklBTkNFID0gMzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1dPUktfVkFSSUFOQ0UgPSAzODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GcmVlIFNsYWNrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRlJFRV9TTEFDSyA9IDM5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIFNsYWNrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fVE9UQUxfU0xBQ0sgPSA0MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaXhlZCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRklYRURfQ09TVCA9IDQxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpeGVkIENvc3QgQWNjcnVhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0ZJWEVEX0NPU1RfQUNDUlVBTCA9IDQyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcmNlbnQgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QRVJDRU5UX0NPTVBMRVRFID0gNDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFID0gNDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0NPU1QgPSA0NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1ZFUlRJTUVfQ09TVCA9IDQ2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PVkVSVElNRV9XT1JLID0gNDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQUNUVUFMX1NUQVJUID0gNDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIEZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDVFVBTF9GSU5JU0ggPSA0OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgRHVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19BQ1RVQUxfRFVSQVRJT04gPSA1MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDVFVBTF9DT1NUID0gNTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19BQ1RVQUxfT1ZFUlRJTUVfQ09TVCA9IDUyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQUNUVUFMX1dPUksgPSA1MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLID0gNTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVndWxhciBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUkVHVUxBUl9XT1JLID0gNTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtYWluaW5nIER1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUkVNQUlOSU5HX0RVUkFUSU9OID0gNTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtYWluaW5nIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19SRU1BSU5JTkdfQ09TVCA9IDU3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUkVNQUlOSU5HX1dPUksgPSA1ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUID0gNTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSyA9IDYwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19BQ1dQID0gNjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q1Y8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19DViA9IDYyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnN0cmFpbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0NPTlNUUkFJTlRfVFlQRSA9IDYzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhbGVuZGFyIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0NBTEVOREFSX1VJRCA9IDY0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnN0cmFpbnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0NPTlNUUkFJTlRfREFURSA9IDY1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlYWRsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fREVBRExJTkUgPSA2NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZXZlbCBBc3NpZ25tZW50czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0xFVkVMX0FTU0lHTk1FTlRTID0gNjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTEVWRUxJTkdfQ0FOX1NQTElUID0gNjg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGV2ZWxpbmcgRGVsYXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19MRVZFTElOR19ERUxBWSA9IDY5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVCA9IDcwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZSBMZXZlbGVkIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUFJFX0xFVkVMRURfU1RBUlQgPSA3MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgTGV2ZWxlZCBGaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QUkVfTEVWRUxFRF9GSU5JU0ggPSA3MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IeXBlcmxpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19IWVBFUkxJTksgPSA3MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0hZUEVSTElOS19BRERSRVNTID0gNzQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fSFlQRVJMSU5LX1NVQl9BRERSRVNTID0gNzU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fSUdOT1JFX1JFU09VUkNFX0NBTEVOREFSID0gNzY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19OT1RFUyA9IDc3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhpZGUgQmFyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fSElERV9CQVIgPSA3ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2xsdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19ST0xMVVAgPSA3OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CQ1dTPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQkNXUyA9IDgwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19CQ1dQID0gODE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEUgPSA4MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FYXJuZWQgVmFsdWUgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRUFSTkVEX1ZBTFVFX01FVEhPRCA9IDgzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yIExpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BSRURFQ0VTU09SX0xJTksgPSA4NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19BQ1RVQUxfV09SS19QUk9URUNURUQgPSA4NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQgPSA4NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VYVEVOREVEX0FUVFJJQlVURSA9IDg3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2VsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19CQVNFTElORSA9IDg4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGxpbmUgQ29kZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1VUTElORV9DT0RFID0gODk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19USU1FUEhBU0VEX0RBVEEgPSA5MDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VGFzazwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0ZFQVRVUkVfQ09VTlQgPSA5MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tzSW1wbCA8ZW0+VGFza3M8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza3NJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VGFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEFTS1MgPSAyODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXNrPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLU19fVEFTSyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlRhc2tzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tTX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZVBlcmlvZEltcGwgPGVtPlRpbWUgUGVyaW9kPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRpbWVQZXJpb2RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VGltZVBlcmlvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUSU1FX1BFUklPRCA9IDI5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyb20gRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVfUEVSSU9EX19GUk9NX0RBVEUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUSU1FX1BFUklPRF9fVE9fREFURSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlRpbWUgUGVyaW9kPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVfUEVSSU9EX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZXBoYXNlZERhdGFUeXBlSW1wbCA8ZW0+VGltZXBoYXNlZCBEYXRhIFR5cGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZXBoYXNlZERhdGFUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFRpbWVwaGFzZWREYXRhVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUSU1FUEhBU0VEX0RBVEFfVFlQRSA9IDMwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUSU1FUEhBU0VEX0RBVEFfVFlQRV9fVFlQRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VJRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUSU1FUEhBU0VEX0RBVEFfVFlQRV9fU1RBUlQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFX19GSU5JU0ggPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUSU1FUEhBU0VEX0RBVEFfVFlQRV9fVU5JVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUSU1FUEhBU0VEX0RBVEFfVFlQRV9fVkFMVUUgPSA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5UaW1lcGhhc2VkIERhdGEgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUSU1FUEhBU0VEX0RBVEFfVFlQRV9GRUFUVVJFX0NPVU5UID0gNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlSW1wbCA8ZW0+VmFsdWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVkFMVUUgPSAzMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFX19WQUxVRV9JRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFyZW50IFZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUVfX1BBUkVOVF9WQUxVRV9JRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRV9fVkFMVUUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUVfX0RFU0NSSVBUSU9OID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VmFsdWU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUVfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZTJJbXBsIDxlbT5WYWx1ZTI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWUySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFZhbHVlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBWQUxVRTIgPSAzMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFMl9fSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUUyX19WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRTJfX0RFU0NSSVBUSU9OID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VmFsdWUyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFMl9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlTGlzdEltcGwgPGVtPlZhbHVlIExpc3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVMaXN0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFZhbHVlTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBWQUxVRV9MSVNUID0gMzM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFX0xJU1RfX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VmFsdWUgTGlzdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRV9MSVNUX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVzSW1wbCA8ZW0+VmFsdWVzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRWYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVkFMVUVTID0gMzQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFU19fR1JPVVAgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRVNfX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VmFsdWVzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFU19GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tJbXBsIDxlbT5XQlMgTWFzazwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XQlNNYXNrSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdCU01hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV0JTX01BU0sgPSAzNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdCU19NQVNLX19MRVZFTCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdCU19NQVNLX19UWVBFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZW5ndGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXQlNfTUFTS19fTEVOR1RIID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXBhcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXQlNfTUFTS19fU0VQQVJBVE9SID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V0JTIE1hc2s8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XQlNNYXNrc0ltcGwgPGVtPldCUyBNYXNrczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XQlNNYXNrc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRXQlNNYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXQlNfTUFTS1MgPSAzNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJpZnkgVW5pcXVlIENvZGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tTX19WRVJJRllfVU5JUVVFX0NPREVTID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBDb2RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdCU19NQVNLU19fR0VORVJBVEVfQ09ERVMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdCU19NQVNLU19fUFJFRklYID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XQlMgTWFzazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tTX19XQlNfTUFTSyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPldCUyBNYXNrczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXQlNfTUFTS1NfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XZWVrRGF5SW1wbCA8ZW0+V2VlayBEYXk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV2Vla0RheUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRXZWVrRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdFRUtfREFZID0gMzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUVLX0RBWV9fREFZX1RZUEUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRheSBXb3JraW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VFS19EQVlfX0RBWV9XT1JLSU5HID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFRUtfREFZX19USU1FX1BFUklPRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29ya2luZyBUaW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFRUtfREFZX19XT1JLSU5HX1RJTUVTID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V2VlayBEYXk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VFS19EQVlfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XZWVrRGF5c0ltcGwgPGVtPldlZWsgRGF5czwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XZWVrRGF5c0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRXZWVrRGF5cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXRUVLX0RBWVMgPSAzODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWVrIERheTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VFS19EQVlTX19XRUVLX0RBWSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPldlZWsgRGF5czwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUVLX0RBWVNfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Xb3JraW5nVGltZUltcGwgPGVtPldvcmtpbmcgVGltZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Xb3JraW5nVGltZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRXb3JraW5nVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLSU5HX1RJTUUgPSAzOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Gcm9tIFRpbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLSU5HX1RJTUVfX0ZST01fVElNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG8gVGltZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktJTkdfVElNRV9fVE9fVElNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPldvcmtpbmcgVGltZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLSU5HX1RJTUVfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Xb3JraW5nVGltZXNJbXBsIDxlbT5Xb3JraW5nIFRpbWVzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldvcmtpbmdUaW1lc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRXb3JraW5nVGltZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS0lOR19USU1FUyA9IDQwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmtpbmcgVGltZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS0lOR19USU1FU19fV09SS0lOR19USU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V29ya2luZyBUaW1lczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLSU5HX1RJTUVTX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5BY2NydWUgQXQ8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEFjY3J1ZUF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFDQ1JVRV9BVCA9IDQxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBQ1RJVkVfRElSRUNUT1JZX0dVSURfVFlQRSA9IDQyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5BbGlhcyBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEFsaWFzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBTElBU19UWVBFID0gNDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkF1dGhvciBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEF1dGhvclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVVUSE9SX1RZUEUgPSA0NDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+QmFzZWxpbmUgRm9yIEVhcm5lZCBWYWx1ZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBCQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFX1RZUEUgPSA0NTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Qm9va2luZyBUeXBlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEJvb2tpbmdUeXBlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBCT09LSU5HX1RZUEVfVFlQRSA9IDQ2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Cb29raW5nIFR5cGUgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEJvb2tpbmdUeXBlVHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQk9PS0lOR19UWVBFX1RZUEUxID0gNDc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkNhbGN1bGF0aW9uIFR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Q2FsY3VsYXRpb25UeXBlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDQUxDVUxBVElPTl9UWVBFX1RZUEUgPSA0ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q2F0ZWdvcnkgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDYXRlZ29yeVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ0FURUdPUllfVFlQRSA9IDQ5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Db2RlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Q29kZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09ERV9UWVBFID0gNTA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkNvbXBhbnkgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDb21wYW55VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT01QQU5ZX1RZUEUgPSA1MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q29uc3RyYWludCBUeXBlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldENvbnN0cmFpbnRUeXBlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT05TVFJBSU5UX1RZUEVfVFlQRSA9IDUyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Db250YWN0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Q29udGFjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OVEFDVF9UWVBFID0gNTM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkNvc3QgUmF0ZSBUYWJsZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDb3N0UmF0ZVRhYmxlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT1NUX1JBVEVfVEFCTEVfVFlQRSA9IDU0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb24gVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OX1RZUEUgPSA1NTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q3VycmVuY3kgU3ltYm9sIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Q3VycmVuY3lTeW1ib2xUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENVUlJFTkNZX1NZTUJPTF9UWVBFID0gNTY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkRheSBUeXBlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldERheVR5cGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERBWV9UWVBFX1RZUEUgPSA1NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWwgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX1RZUEUgPSA1ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXREZWZhdWx0VGFza0VWTWV0aG9kVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERUZBVUxUX1RBU0tfRVZfTUVUSE9EX1RZUEUgPSA1OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RGVmYXVsdCBUYXNrIFR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RGVmYXVsdFRhc2tUeXBlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERUZBVUxUX1RBU0tfVFlQRV9UWVBFID0gNjA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXREdXJhdGlvbkZvcm1hdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFVSQVRJT05fRk9STUFUX1RZUEUgPSA2MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUxPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXREdXJhdGlvbkZvcm1hdFR5cGUxKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERVUkFUSU9OX0ZPUk1BVF9UWVBFMSA9IDYyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTI8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldER1cmF0aW9uRm9ybWF0VHlwZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFVSQVRJT05fRk9STUFUX1RZUEUyID0gNjM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMzwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVVJBVElPTl9GT1JNQVRfVFlQRTMgPSA2NDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXREdXJhdGlvbkZvcm1hdFR5cGU0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERVUkFUSU9OX0ZPUk1BVF9UWVBFNCA9IDY1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldER1cmF0aW9uRm9ybWF0VHlwZTUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFVSQVRJT05fRk9STUFUX1RZUEU1ID0gNjY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2QgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RWFybmVkVmFsdWVNZXRob2RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRSA9IDY3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kIFR5cGUxPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRTEgPSA2ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RW1haWwgQWRkcmVzcyBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEVtYWlsQWRkcmVzc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRU1BSUxfQUREUkVTU19UWVBFID0gNjk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkV4dGVybmFsIFRhc2sgUHJvamVjdCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEV4dGVybmFsVGFza1Byb2plY3RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVYVEVSTkFMX1RBU0tfUFJPSkVDVF9UWVBFID0gNzA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkZpeGVkIENvc3QgQWNjcnVhbCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEZpeGVkQ29zdEFjY3J1YWxUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFID0gNzE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkZZIFN0YXJ0IERhdGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RllTdGFydERhdGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEZZX1NUQVJUX0RBVEVfVFlQRSA9IDcyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Hcm91cCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEdyb3VwVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBHUk9VUF9UWVBFID0gNzM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkh5cGVybGluayBBZGRyZXNzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0SHlwZXJsaW5rQWRkcmVzc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFlQRVJMSU5LX0FERFJFU1NfVFlQRSA9IDc0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlMTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFlQRVJMSU5LX0FERFJFU1NfVFlQRTEgPSA3NTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTI8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0SHlwZXJsaW5rQWRkcmVzc1R5cGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEhZUEVSTElOS19BRERSRVNTX1RZUEUyID0gNzY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFID0gNzc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlMTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFlQRVJMSU5LX1NVQl9BRERSRVNTX1RZUEUxID0gNzg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlMjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFlQRVJMSU5LX1NVQl9BRERSRVNTX1RZUEUyID0gNzk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkh5cGVybGluayBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEh5cGVybGlua1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFlQRVJMSU5LX1RZUEUgPSA4MDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIFR5cGUxPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEh5cGVybGlua1R5cGUxKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEhZUEVSTElOS19UWVBFMSA9IDgxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5IeXBlcmxpbmsgVHlwZTI8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0SHlwZXJsaW5rVHlwZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFlQRVJMSU5LX1RZUEUyID0gODI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkluaXRpYWxzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0SW5pdGlhbHNUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElOSVRJQUxTX1RZUEUgPSA4MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TGFnIEZvcm1hdCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRMYWdGb3JtYXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IExBR19GT1JNQVRfVFlQRSA9IDg0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEUgPSA4NTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0IFR5cGUxPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEUxID0gODY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk1hbmFnZXIgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRNYW5hZ2VyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNQU5BR0VSX1RZUEUgPSA4NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TWF0ZXJpYWwgTGFiZWwgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRNYXRlcmlhbExhYmVsVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNQVRFUklBTF9MQUJFTF9UWVBFID0gODg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk5hbWUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXROYW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOQU1FX1RZUEUgPSA4OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TmFtZSBUeXBlMTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXROYW1lVHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTkFNRV9UWVBFMSA9IDkwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5OYW1lIFR5cGUyPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE5hbWVUeXBlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOQU1FX1RZUEUyID0gOTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk5hbWUgVHlwZTM8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0TmFtZVR5cGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5BTUVfVFlQRTMgPSA5MjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TmV3IFRhc2sgU3RhcnQgRGF0ZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXROZXdUYXNrU3RhcnREYXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBORVdfVEFTS19TVEFSVF9EQVRFX1RZUEUgPSA5MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TlQgQWNjb3VudCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE5UQWNjb3VudFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTlRfQUNDT1VOVF9UWVBFID0gOTQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk91dGxpbmUgTnVtYmVyIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0T3V0bGluZU51bWJlclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1VUTElORV9OVU1CRVJfVFlQRSA9IDk1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5PdmVydGltZSBSYXRlIEZvcm1hdCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRPdmVydGltZVJhdGVGb3JtYXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEUgPSA5NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEUxID0gOTc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlBob25ldGljIEFsaWFzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UGhvbmV0aWNBbGlhc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEhPTkVUSUNfQUxJQVNfVFlQRSA9IDk4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5QaG9uZXRpY3MgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRQaG9uZXRpY3NUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBIT05FVElDU19UWVBFID0gOTk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlByZWZpeCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFByZWZpeFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJFRklYX1RZUEUgPSAxMDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlJhdGUgVGFibGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UmF0ZVRhYmxlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSQVRFX1RBQkxFX1RZUEUgPSAxMDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlJvbGx1cCBUeXBlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFJvbGx1cFR5cGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTExVUF9UWVBFX1RZUEUgPSAxMDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRSA9IDEwMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEUxID0gMTA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5TdWJqZWN0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0U3ViamVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU1VCSkVDVF9UWVBFID0gMTA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5TdWJwcm9qZWN0IE5hbWUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRTdWJwcm9qZWN0TmFtZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU1VCUFJPSkVDVF9OQU1FX1RZUEUgPSAxMDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlRpdGxlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VGl0bGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRJVExFX1RZUEUgPSAxMDc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VHlwZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVFlQRV9UWVBFID0gMTA4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5UeXBlIFR5cGUxPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUeXBlVHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVFlQRV9UWVBFMSA9IDEwOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VHlwZSBUeXBlMjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VHlwZVR5cGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRZUEVfVFlQRTIgPSAxMTA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlR5cGUgVHlwZTM8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFR5cGVUeXBlMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUWVBFX1RZUEUzID0gMTExOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5UeXBlIFR5cGU0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUeXBlVHlwZTQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVFlQRV9UWVBFNCA9IDExMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VHlwZSBUeXBlNTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VHlwZVR5cGU1KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRZUEVfVFlQRTUgPSAxMTM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlVJRCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFVJRFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVUlEX1RZUEUgPSAxMTQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlVuaXQgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VW5pdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVU5JVF9UWVBFID0gMTE1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5WYWx1ZWxpc3QgU29ydCBPcmRlciBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFZBTFVFTElTVF9TT1JUX09SREVSX1RZUEUgPSAxMTY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPldlZWsgU3RhcnQgRGF5IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdlZWtTdGFydERheVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV0VFS19TVEFSVF9EQVlfVFlQRSA9IDExNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+V29yayBDb250b3VyIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdvcmtDb250b3VyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX0NPTlRPVVJfVFlQRSA9IDExODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+V29yayBGb3JtYXQgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0V29ya0Zvcm1hdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19GT1JNQVRfVFlQRSA9IDExOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+V29yayBHcm91cCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRXb3JrR3JvdXBUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfR1JPVVBfVFlQRSA9IDEyMDsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50IDxlbT5Bc3NpZ25tZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFzc2lnbm1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFzc2lnbm1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFVJRCA8ZW0+VUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFVJRCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9VSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFRhc2tVSUQgPGVtPlRhc2sgVUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFzayBVSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VGFza1VJRCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9UYXNrVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZXNvdXJjZVVJRCA8ZW0+UmVzb3VyY2UgVUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzb3VyY2UgVUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc291cmNlVUlEKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1Jlc291cmNlVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9QZXJjZW50V29ya0NvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbENvc3QoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsRmluaXNoIDxlbT5BY3R1YWwgRmluaXNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxGaW5pc2goKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbFN0YXJ0IDxlbT5BY3R1YWwgU3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgU3RhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsU3RhcnQoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsV29yaygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QUNXUDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzQ29uZmlybWVkIDxlbT5Db25maXJtZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db25maXJtZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNDb25maXJtZWQoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ29uZmlybWVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0IDxlbT5Db3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0KCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0Nvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3RSYXRlVGFibGUgPGVtPkNvc3QgUmF0ZSBUYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvc3QgUmF0ZSBUYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0UmF0ZVRhYmxlKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0Nvc3RSYXRlVGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3RWYXJpYW5jZSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvc3QgVmFyaWFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0Nvc3RWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q1YgPGVtPkNWPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q1Y8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q1YoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldERlbGF5IDxlbT5EZWxheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlbGF5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldERlbGF5KCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0RlbGF5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRGaW5pc2goKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRGaW5pc2hWYXJpYW5jZSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEZpbmlzaFZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0ZpbmlzaFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkh5cGVybGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmsoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfSHlwZXJsaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfSHlwZXJsaW5rQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfSHlwZXJsaW5rU3ViQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V29yayBWYXJpYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfV29ya1ZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0hhc0ZpeGVkUmF0ZVVuaXRzIDxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzSGFzRml4ZWRSYXRlVW5pdHMoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfSGFzRml4ZWRSYXRlVW5pdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzRml4ZWRNYXRlcmlhbCA8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0ZpeGVkTWF0ZXJpYWwoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfRml4ZWRNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0TGV2ZWxpbmdEZWxheSA8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZXZlbGluZyBEZWxheTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRMZXZlbGluZ0RlbGF5KCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0xldmVsaW5nRGVsYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldExldmVsaW5nRGVsYXlGb3JtYXQgPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0xldmVsaW5nRGVsYXlGb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzTGlua2VkRmllbGRzIDxlbT5MaW5rZWQgRmllbGRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGlua2VkIEZpZWxkczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0xpbmtlZEZpZWxkcygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9MaW5rZWRGaWVsZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NaWxlc3RvbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNNaWxlc3RvbmUoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfTWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXROb3RlcyA8ZW0+Tm90ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ob3RlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXROb3RlcygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Ob3RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNPdmVyYWxsb2NhdGVkIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcmFsbG9jYXRlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc092ZXJhbGxvY2F0ZWQoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfT3ZlcmFsbG9jYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRPdmVydGltZVdvcmsgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVydGltZSBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE92ZXJ0aW1lV29yaygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9PdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlZ3VsYXJXb3JrIDxlbT5SZWd1bGFyIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWd1bGFyIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVndWxhcldvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZW1haW5pbmdDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ092ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZW1haW5pbmdPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtYWluaW5nIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZW1haW5pbmdXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1Jlc3BvbnNlUGVuZGluZyA8ZW0+UmVzcG9uc2UgUGVuZGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc3BvbnNlIFBlbmRpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVzcG9uc2VQZW5kaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdGFydCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9TdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RvcCA8ZW0+U3RvcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0b3A8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RvcCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9TdG9wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZXN1bWUgPGVtPlJlc3VtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc3VtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZXN1bWUoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVzdW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdGFydFZhcmlhbmNlIDxlbT5TdGFydCBWYXJpYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0YXJ0VmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfU3RhcnRWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VW5pdHMgPGVtPlVuaXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VW5pdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VW5pdHMoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfVW5pdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzVXBkYXRlTmVlZGVkIDxlbT5VcGRhdGUgTmVlZGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1VwZGF0ZU5lZWRlZCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9VcGRhdGVOZWVkZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFZBQyA8ZW0+VkFDPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VkFDPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFZBQygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9WQUMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmsgPGVtPldvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmsoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29ya0NvbnRvdXIgPGVtPldvcmsgQ29udG91cjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcmsgQ29udG91cjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrQ29udG91cigpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Xb3JrQ29udG91cigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9CQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QkNXUDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0JDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJvb2tpbmdUeXBlIDxlbT5Cb29raW5nIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Cb29raW5nIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Qm9va2luZ1R5cGUoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQm9va2luZ1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbFdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNyZWF0aW9uIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q3JlYXRpb25EYXRlKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0NyZWF0aW9uRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRFeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFzc2lnbm1lbnRfRXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QmFzZWxpbmUgPGVtPkJhc2VsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5CYXNlbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCYXNlbGluZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzaWdubWVudF9CYXNlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VGltZXBoYXNlZERhdGEoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFzc2lnbm1lbnRfVGltZXBoYXNlZERhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHMgPGVtPkFzc2lnbm1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFzc2lnbm1lbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50cwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXNzaWdubWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzI2dldEFzc2lnbm1lbnQgPGVtPkFzc2lnbm1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkFzc2lnbm1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzI2dldEFzc2lnbm1lbnQoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBc3NpZ25tZW50c19Bc3NpZ25tZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEF2YWlsYWJpbGl0eVBlcmlvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVGcm9tIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlRnJvbSgpCi0JICogQHNlZSAjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBdmFpbGFiaWxpdHlQZXJpb2RfQXZhaWxhYmxlRnJvbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVUbyA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXZhaWxhYmxlIFRvPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlVG8oKQotCSAqIEBzZWUgI2dldEF2YWlsYWJpbGl0eVBlcmlvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kX0F2YWlsYWJsZVRvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZVVuaXRzIDxlbT5BdmFpbGFibGUgVW5pdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdmFpbGFibGUgVW5pdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVVbml0cygpCi0JICogQHNlZSAjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBdmFpbGFiaWxpdHlQZXJpb2RfQXZhaWxhYmxlVW5pdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kcyA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZHMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEF2YWlsYWJpbGl0eVBlcmlvZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZHMjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2RzI2dldEF2YWlsYWJpbGl0eVBlcmlvZCgpCi0JICogQHNlZSAjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kc19BdmFpbGFiaWxpdHlQZXJpb2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUgPGVtPkJhc2VsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJhc2VsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QmFzZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0VGltZXBoYXNlZERhdGEoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCYXNlbGluZV9UaW1lcGhhc2VkRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldE51bWJlciA8ZW0+TnVtYmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TnVtYmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXROdW1iZXIoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9OdW1iZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNpc0ludGVyaW0gPGVtPkludGVyaW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbnRlcmltPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNpc0ludGVyaW0oKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9JbnRlcmltKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0RmluaXNoKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0RHVyYXRpb24gPGVtPkR1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RHVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldER1cmF0aW9uKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfRHVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lX0R1cmF0aW9uRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjaXNFc3RpbWF0ZWREdXJhdGlvbiA8ZW0+RXN0aW1hdGVkIER1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXN0aW1hdGVkIER1cmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNpc0VzdGltYXRlZER1cmF0aW9uKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfRXN0aW1hdGVkRHVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0V29yaygpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lX1dvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRDb3N0IDxlbT5Db3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0Q29zdCgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lX0Nvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QkNXUzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lX0JDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QkNXUDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lX0JDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyIDxlbT5CYXNlbGluZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QmFzZWxpbmUyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEJhc2VsaW5lMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk51bWJlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldE51bWJlcigpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTJfTnVtYmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldFdvcmsgPGVtPldvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0V29yaygpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTJfV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRDb3N0IDxlbT5Db3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldENvc3QoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUyX0Nvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9CQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTJfQkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMgPGVtPkJhc2VsaW5lMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CYXNlbGluZTM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QmFzZWxpbmUzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0VGltZXBoYXNlZERhdGEoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QmFzZWxpbmUzX1RpbWVwaGFzZWREYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldE51bWJlciA8ZW0+TnVtYmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TnVtYmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0TnVtYmVyKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lM19OdW1iZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRTdGFydCgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5pc2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRGaW5pc2goKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX0ZpbmlzaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFdvcmsoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX1dvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRDb3N0KCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lM19Db3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dTPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfQkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QkNXUDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1AoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX0JDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIgPGVtPkNhbGVuZGFyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNhbGVuZGFyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q2FsZW5kYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRVSUQgPGVtPlVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0VUlEKCkKLQkgKiBAc2VlICNnZXRDYWxlbmRhcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q2FsZW5kYXJfVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldENhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjaXNJc0Jhc2VDYWxlbmRhciA8ZW0+SXMgQmFzZSBDYWxlbmRhcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2lzSXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI2dldENhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9Jc0Jhc2VDYWxlbmRhcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldEJhc2VDYWxlbmRhclVJRCA8ZW0+QmFzZSBDYWxlbmRhciBVSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CYXNlIENhbGVuZGFyIFVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0QmFzZUNhbGVuZGFyVUlEKCkKLQkgKiBAc2VlICNnZXRDYWxlbmRhcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q2FsZW5kYXJfQmFzZUNhbGVuZGFyVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0V2Vla0RheXMgPGVtPldlZWsgRGF5czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPldlZWsgRGF5czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0V2Vla0RheXMoKQotCSAqIEBzZWUgI2dldENhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDYWxlbmRhcl9XZWVrRGF5cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnMgPGVtPkNhbGVuZGFyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DYWxlbmRhcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFycwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q2FsZW5kYXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnMjZ2V0Q2FsZW5kYXIgPGVtPkNhbGVuZGFyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5DYWxlbmRhcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXJzI2dldENhbGVuZGFyKCkKLQkgKiBAc2VlICNnZXRDYWxlbmRhcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENhbGVuZGFyc19DYWxlbmRhcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QgPGVtPkRvY3VtZW50IFJvb3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREb2N1bWVudFJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPk1peGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0TWl4ZWQoKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RG9jdW1lbnRSb290X01peGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldFhNTE5TUHJlZml4TWFwKCkKLQkgKiBAc2VlICNnZXREb2N1bWVudFJvb3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9YTUxOU1ByZWZpeE1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCNnZXRYU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0UHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByb2plY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCNnZXRQcm9qZWN0KCkKLQkgKiBAc2VlICNnZXREb2N1bWVudFJvb3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9Qcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpZWxkIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRGaWVsZElEKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfRmllbGRJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZpZWxkTmFtZSA8ZW0+RmllbGQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpZWxkIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZpZWxkTmFtZSgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0ZpZWxkTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEFsaWFzIDxlbT5BbGlhczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFsaWFzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRBbGlhcygpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0FsaWFzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0UGhvbmV0aWNBbGlhcyA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QaG9uZXRpYyBBbGlhczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0UGhvbmV0aWNBbGlhcygpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX1Bob25ldGljQWxpYXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRSb2xsdXBUeXBlIDxlbT5Sb2xsdXAgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJvbGx1cCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRSb2xsdXBUeXBlKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfUm9sbHVwVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldENhbGN1bGF0aW9uVHlwZSA8ZW0+Q2FsY3VsYXRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldENhbGN1bGF0aW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0NhbGN1bGF0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZvcm11bGEgPGVtPkZvcm11bGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Gb3JtdWxhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRGb3JtdWxhKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfRm9ybXVsYSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzUmVzdHJpY3RWYWx1ZXMgPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjaXNSZXN0cmljdFZhbHVlcygpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX1Jlc3RyaWN0VmFsdWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0VmFsdWVsaXN0U29ydE9yZGVyIDxlbT5WYWx1ZWxpc3QgU29ydCBPcmRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9WYWx1ZWxpc3RTb3J0T3JkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc0FwcGVuZE5ld1ZhbHVlcyA8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjaXNBcHBlbmROZXdWYWx1ZXMoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9BcHBlbmROZXdWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXREZWZhdWx0IDxlbT5EZWZhdWx0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RGVmYXVsdCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0RlZmF1bHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRWYWx1ZUxpc3QgPGVtPlZhbHVlIExpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5WYWx1ZSBMaXN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRWYWx1ZUxpc3QoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9WYWx1ZUxpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldFVJRCA8ZW0+VUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VUlEKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlMl9VSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWVsZCBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldEZpZWxkSUQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX0ZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZSBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldFZhbHVlSUQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX1ZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlMl9EdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRVSUQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpZWxkIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0RmllbGRJRCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfRmllbGRJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlM19WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0VmFsdWVJRCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfVmFsdWVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX0R1cmF0aW9uRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlNDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEV4dGVuZGVkQXR0cmlidXRlNCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXRVSUQgPGVtPlVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFVJRCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXRGaWVsZElEKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9GaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWUgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXRWYWx1ZUlEKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9WYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfRHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXMjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXMjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzX0V4dGVuZGVkQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sgPGVtPk1hc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0TGV2ZWwgPGVtPkxldmVsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGV2ZWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0TGV2ZWwoKQotCSAqIEBzZWUgI2dldE1hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1hc2tfTGV2ZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldE1hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1hc2tfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZW5ndGg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0TGVuZ3RoKCkKLQkgKiBAc2VlICNnZXRNYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNYXNrX0xlbmd0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0U2VwYXJhdG9yIDxlbT5TZXBhcmF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXBhcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0U2VwYXJhdG9yKCkKLQkgKiBAc2VlICNnZXRNYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNYXNrX1NlcGFyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrcyA8ZW0+TWFza3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWFza3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2tzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza3MjZ2V0TWFzayA8ZW0+TWFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza3MjZ2V0TWFzaygpCi0JICogQHNlZSAjZ2V0TWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1hc2tzX01hc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUgPGVtPk91dGxpbmUgQ29kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRPdXRsaW5lQ29kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldEZpZWxkSUQoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9GaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RmllbGROYW1lIDxlbT5GaWVsZCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RmllbGROYW1lKCkKLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGVfRmllbGROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWxpYXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldEFsaWFzKCkKLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGVfQWxpYXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRQaG9uZXRpY0FsaWFzIDxlbT5QaG9uZXRpYyBBbGlhczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBob25ldGljIEFsaWFzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGVfUGhvbmV0aWNBbGlhcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldFZhbHVlcyA8ZW0+VmFsdWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VmFsdWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRWYWx1ZXMoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRPdXRsaW5lQ29kZV9WYWx1ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0VudGVycHJpc2UgPGVtPkVudGVycHJpc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbnRlcnByaXNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9FbnRlcnByaXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMgPGVtPkVudGVycHJpc2UgT3V0bGluZSBDb2RlIEFsaWFzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RW50ZXJwcmlzZSBPdXRsaW5lIENvZGUgQWxpYXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKCkKLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGVfRW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCA8ZW0+UmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9SZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0xlYWZPbmx5IDxlbT5MZWFmIE9ubHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZWFmIE9ubHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzTGVhZk9ubHkoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9MZWFmT25seSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzQWxsTGV2ZWxzUmVxdWlyZWQgPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0FsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGVfQWxsTGV2ZWxzUmVxdWlyZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQgPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9Pbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0TWFza3MgPGVtPk1hc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TWFza3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldE1hc2tzKCkKLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0T3V0bGluZUNvZGVfTWFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyIDxlbT5PdXRsaW5lIENvZGUyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk91dGxpbmUgQ29kZTI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0T3V0bGluZUNvZGUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyI2dldFVJRCA8ZW0+VUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0VUlEKCkKLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlMl9VSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWVsZCBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyI2dldEZpZWxkSUQoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUyX0ZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZSBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyI2dldFZhbHVlSUQoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUyX1ZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzIDxlbT5PdXRsaW5lIENvZGUzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk91dGxpbmUgQ29kZTM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0T3V0bGluZUNvZGUzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzI2dldFVJRCA8ZW0+VUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0VUlEKCkKLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlM19VSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWVsZCBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzI2dldEZpZWxkSUQoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUzX0ZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZSBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzI2dldFZhbHVlSUQoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUzX1ZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzIDxlbT5PdXRsaW5lIENvZGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk91dGxpbmUgQ29kZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0T3V0bGluZUNvZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXMjZ2V0T3V0bGluZUNvZGUgPGVtPk91dGxpbmUgQ29kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+T3V0bGluZSBDb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXMjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0T3V0bGluZUNvZGVzX091dGxpbmVDb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayA8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByZWRlY2Vzc29yTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRQcmVkZWNlc3NvclVJRCA8ZW0+UHJlZGVjZXNzb3IgVUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlZGVjZXNzb3IgVUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0UHJlZGVjZXNzb3JVSUQoKQotCSAqIEBzZWUgI2dldFByZWRlY2Vzc29yTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJlZGVjZXNzb3JMaW5rX1ByZWRlY2Vzc29yVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNpc0Nyb3NzUHJvamVjdCA8ZW0+Q3Jvc3MgUHJvamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNyb3NzIFByb2plY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNpc0Nyb3NzUHJvamVjdCgpCi0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfQ3Jvc3NQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldENyb3NzUHJvamVjdE5hbWUgPGVtPkNyb3NzIFByb2plY3QgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNyb3NzIFByb2plY3QgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldENyb3NzUHJvamVjdE5hbWUoKQotCSAqIEBzZWUgI2dldFByZWRlY2Vzc29yTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJlZGVjZXNzb3JMaW5rX0Nyb3NzUHJvamVjdE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0TGlua0xhZyA8ZW0+TGluayBMYWc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MaW5rIExhZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldExpbmtMYWcoKQotCSAqIEBzZWUgI2dldFByZWRlY2Vzc29yTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJlZGVjZXNzb3JMaW5rX0xpbmtMYWcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0TGFnRm9ybWF0IDxlbT5MYWcgRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGFnIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldExhZ0Zvcm1hdCgpCi0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfTGFnRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QgPGVtPlByb2plY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0VUlEKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRUaXRsZSA8ZW0+VGl0bGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UaXRsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRUaXRsZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9UaXRsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0U3ViamVjdCA8ZW0+U3ViamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN1YmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0U3ViamVjdCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9TdWJqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDYXRlZ29yeSA8ZW0+Q2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDYXRlZ29yeSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q29tcGFueSA8ZW0+Q29tcGFueTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbXBhbnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q29tcGFueSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Db21wYW55KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRNYW5hZ2VyIDxlbT5NYW5hZ2VyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFuYWdlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRNYW5hZ2VyKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01hbmFnZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEF1dGhvciA8ZW0+QXV0aG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXV0aG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEF1dGhvcigpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9BdXRob3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNyZWF0aW9uIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3JlYXRpb25EYXRlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NyZWF0aW9uRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0UmV2aXNpb24gPGVtPlJldmlzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmV2aXNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0UmV2aXNpb24oKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfUmV2aXNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldExhc3RTYXZlZCA8ZW0+TGFzdCBTYXZlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxhc3QgU2F2ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TGFzdFNhdmVkKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0xhc3RTYXZlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTY2hlZHVsZUZyb21TdGFydCA8ZW0+U2NoZWR1bGUgRnJvbSBTdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTY2hlZHVsZUZyb21TdGFydCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9TY2hlZHVsZUZyb21TdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0U3RhcnREYXRlIDxlbT5TdGFydCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdGFydERhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfU3RhcnREYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRGaW5pc2hEYXRlIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaCBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEZpbmlzaERhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRmluaXNoRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RllTdGFydERhdGUgPGVtPkZZIFN0YXJ0IERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GWSBTdGFydCBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEZZU3RhcnREYXRlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0ZZU3RhcnREYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDcml0aWNhbFNsYWNrTGltaXQgPGVtPkNyaXRpY2FsIFNsYWNrIExpbWl0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3JpdGljYWxTbGFja0xpbWl0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NyaXRpY2FsU2xhY2tMaW1pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lEaWdpdHMgPGVtPkN1cnJlbmN5IERpZ2l0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkN1cnJlbmN5IERpZ2l0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeURpZ2l0cygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DdXJyZW5jeURpZ2l0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lTeW1ib2wgPGVtPkN1cnJlbmN5IFN5bWJvbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkN1cnJlbmN5IFN5bWJvbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeVN5bWJvbCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DdXJyZW5jeVN5bWJvbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbiA8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQ3VycmVuY3lTeW1ib2xQb3NpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhbGVuZGFyIFVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDYWxlbmRhclVJRCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DYWxlbmRhclVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFN0YXJ0VGltZSA8ZW0+RGVmYXVsdCBTdGFydCBUaW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBTdGFydCBUaW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFydFRpbWUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdFN0YXJ0VGltZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdEZpbmlzaFRpbWUgPGVtPkRlZmF1bHQgRmluaXNoIFRpbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IEZpbmlzaCBUaW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRGaW5pc2hUaW1lKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0RlZmF1bHRGaW5pc2hUaW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRNaW51dGVzUGVyRGF5IDxlbT5NaW51dGVzIFBlciBEYXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NaW51dGVzIFBlciBEYXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TWludXRlc1BlckRheSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9NaW51dGVzUGVyRGF5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRNaW51dGVzUGVyV2VlayA8ZW0+TWludXRlcyBQZXIgV2VlazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1pbnV0ZXMgUGVyIFdlZWs8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TWludXRlc1BlcldlZWsoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTWludXRlc1BlcldlZWsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERheXNQZXJNb250aCA8ZW0+RGF5cyBQZXIgTW9udGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EYXlzIFBlciBNb250aDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREYXlzUGVyTW9udGgoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGF5c1Blck1vbnRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0VGFza1R5cGUgPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBUYXNrIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0RlZmF1bHRUYXNrVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwgPGVtPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFuZGFyZFJhdGUgPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0RlZmF1bHRTdGFuZGFyZFJhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRPdmVydGltZVJhdGUgPGVtPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0RlZmF1bHRPdmVydGltZVJhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFdvcmtGb3JtYXQgPGVtPldvcmsgRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V29yayBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V29ya0Zvcm1hdCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Xb3JrRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0VkaXRhYmxlQWN0dWFsQ29zdHMgPGVtPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0VkaXRhYmxlQWN0dWFsQ29zdHMoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRWRpdGFibGVBY3R1YWxDb3N0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNIb25vckNvbnN0cmFpbnRzIDxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzSG9ub3JDb25zdHJhaW50cygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Ib25vckNvbnN0cmFpbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFYXJuZWRWYWx1ZU1ldGhvZCA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRWFybmVkVmFsdWVNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5IDxlbT5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc011bHRpcGxlQ3JpdGljYWxQYXRocyA8ZW0+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc011bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9NdWx0aXBsZUNyaXRpY2FsUGF0aHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTmV3VGFza3NFZmZvcnREcml2ZW4gPGVtPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNOZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9OZXdUYXNrc0VmZm9ydERyaXZlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNOZXdUYXNrc0VzdGltYXRlZCA8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNOZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9OZXdUYXNrc0VzdGltYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcGxpdHNJblByb2dyZXNzVGFza3MgPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9TcGxpdHNJblByb2dyZXNzVGFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3ByZWFkQWN0dWFsQ29zdCA8ZW0+U3ByZWFkIEFjdHVhbCBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3ByZWFkIEFjdHVhbCBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9TcHJlYWRBY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSA8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9TcHJlYWRQZXJjZW50Q29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzVGFza1VwZGF0ZXNSZXNvdXJjZSA8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzVGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9UYXNrVXBkYXRlc1Jlc291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0Zpc2NhbFllYXJTdGFydCA8ZW0+RmlzY2FsIFllYXIgU3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0Zpc2NhbFllYXJTdGFydCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9GaXNjYWxZZWFyU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFdlZWtTdGFydERheSA8ZW0+V2VlayBTdGFydCBEYXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5XZWVrIFN0YXJ0IERheTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXZWVrU3RhcnREYXkoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfV2Vla1N0YXJ0RGF5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVDb21wbGV0ZWRFbmRzQmFjayA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01vdmVDb21wbGV0ZWRFbmRzQmFjaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayA8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlIDxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QmFzZWxpbmUgRm9yIEVhcm5lZCBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0Jhc2VsaW5lRm9yRWFybmVkVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzIDxlbT5BdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0U3RhdHVzRGF0ZSA8ZW0+U3RhdHVzIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGF0dXMgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdGF0dXNEYXRlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1N0YXR1c0RhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbnREYXRlIDxlbT5DdXJyZW50IERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DdXJyZW50IERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVudERhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQ3VycmVudERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCA8ZW0+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQXV0b2xpbmsgPGVtPkF1dG9saW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXV0b2xpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvbGluaygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9BdXRvbGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TmV3VGFza1N0YXJ0RGF0ZSA8ZW0+TmV3IFRhc2sgU3RhcnQgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TmV3VGFza1N0YXJ0RGF0ZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9OZXdUYXNrU3RhcnREYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0VGFza0VWTWV0aG9kIDxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0VGFza0VWTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0RlZmF1bHRUYXNrRVZNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm9qZWN0IEV4dGVybmFsbHkgRWRpdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEV4dGVuZGVkQ3JlYXRpb25EYXRlIDxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9FeHRlbmRlZENyZWF0aW9uRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBY3R1YWxzSW5TeW5jIDxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBY3R1YWxzSW5TeW5jKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0FjdHVhbHNJblN5bmMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzUmVtb3ZlRmlsZVByb3BlcnRpZXMgPGVtPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzUmVtb3ZlRmlsZVByb3BlcnRpZXMoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfUmVtb3ZlRmlsZVByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWRtaW5Qcm9qZWN0IDxlbT5BZG1pbiBQcm9qZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWRtaW4gUHJvamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FkbWluUHJvamVjdCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9BZG1pblByb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE91dGxpbmVDb2RlcyA8ZW0+T3V0bGluZSBDb2RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk91dGxpbmUgQ29kZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0T3V0bGluZUNvZGVzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9qZWN0X091dGxpbmVDb2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V0JTTWFza3MgPGVtPldCUyBNYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPldCUyBNYXNrczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXQlNNYXNrcygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvamVjdF9XQlNNYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2plY3RfRXh0ZW5kZWRBdHRyaWJ1dGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDYWxlbmRhcnMgPGVtPkNhbGVuZGFyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNhbGVuZGFyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDYWxlbmRhcnMoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2plY3RfQ2FsZW5kYXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRUYXNrcyA8ZW0+VGFza3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5UYXNrczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRUYXNrcygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvamVjdF9UYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0UmVzb3VyY2VzIDxlbT5SZXNvdXJjZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5SZXNvdXJjZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0UmVzb3VyY2VzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9qZWN0X1Jlc291cmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0QXNzaWdubWVudHMgPGVtPkFzc2lnbm1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QXNzaWdubWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0QXNzaWdubWVudHMoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2plY3RfQXNzaWdubWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSA8ZW0+UmF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRSYXRlc0Zyb20gPGVtPlJhdGVzIEZyb208L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SYXRlcyBGcm9tPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVzRnJvbSgpCi0JICogQHNlZSAjZ2V0UmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmF0ZV9SYXRlc0Zyb20oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVzVG8gPGVtPlJhdGVzIFRvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmF0ZXMgVG88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0UmF0ZXNUbygpCi0JICogQHNlZSAjZ2V0UmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmF0ZV9SYXRlc1RvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRSYXRlVGFibGUgPGVtPlJhdGUgVGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SYXRlIFRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVUYWJsZSgpCi0JICogQHNlZSAjZ2V0UmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmF0ZV9SYXRlVGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFN0YW5kYXJkUmF0ZSA8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YW5kYXJkIFJhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0U3RhbmRhcmRSYXRlKCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX1N0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0IDxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCgpCi0JICogQHNlZSAjZ2V0UmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmF0ZV9TdGFuZGFyZFJhdGVGb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldE92ZXJ0aW1lUmF0ZSA8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX092ZXJ0aW1lUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0IDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQHNlZSAjZ2V0UmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmF0ZV9PdmVydGltZVJhdGVGb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldENvc3RQZXJVc2UgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvc3QgUGVyIFVzZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRDb3N0UGVyVXNlKCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX0Nvc3RQZXJVc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXMgPGVtPlJhdGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJhdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmF0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVzI2dldFJhdGUgPGVtPlJhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVzI2dldFJhdGUoKQotCSAqIEBzZWUgI2dldFJhdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSYXRlc19SYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlIDxlbT5SZXNvdXJjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJlc291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFVJRCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldElEIDxlbT5JRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRJRCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0lEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBOdWxsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzTnVsbCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0lzTnVsbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEluaXRpYWxzIDxlbT5Jbml0aWFsczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluaXRpYWxzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRJbml0aWFscygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0luaXRpYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGhvbmV0aWNzIDxlbT5QaG9uZXRpY3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QaG9uZXRpY3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFBob25ldGljcygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1Bob25ldGljcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE5UQWNjb3VudCA8ZW0+TlQgQWNjb3VudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5UIEFjY291bnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE5UQWNjb3VudCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX05UQWNjb3VudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE1hdGVyaWFsTGFiZWwgPGVtPk1hdGVyaWFsIExhYmVsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWF0ZXJpYWwgTGFiZWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE1hdGVyaWFsTGFiZWwoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9NYXRlcmlhbExhYmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29kZSA8ZW0+Q29kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvZGUoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Db2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEdyb3VwKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfR3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrR3JvdXAgPGVtPldvcmsgR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrR3JvdXAoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Xb3JrR3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRFbWFpbEFkZHJlc3MgPGVtPkVtYWlsIEFkZHJlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbWFpbCBBZGRyZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRFbWFpbEFkZHJlc3MoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9FbWFpbEFkZHJlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkh5cGVybGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SHlwZXJsaW5rKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSHlwZXJsaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SHlwZXJsaW5rQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SHlwZXJsaW5rQWRkcmVzcygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0h5cGVybGlua0FkZHJlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9IeXBlcmxpbmtTdWJBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF4VW5pdHMgPGVtPk1heCBVbml0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1heCBVbml0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF4VW5pdHMoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9NYXhVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFBlYWtVbml0cyA8ZW0+UGVhayBVbml0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBlYWsgVW5pdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFBlYWtVbml0cygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1BlYWtVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzT3ZlckFsbG9jYXRlZCA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfT3ZlckFsbG9jYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEF2YWlsYWJsZUZyb20gPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXZhaWxhYmxlIEZyb208L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEF2YWlsYWJsZUZyb20oKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BdmFpbGFibGVGcm9tKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QXZhaWxhYmxlVG8gPGVtPkF2YWlsYWJsZSBUbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF2YWlsYWJsZSBUbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QXZhaWxhYmxlVG8oKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BdmFpbGFibGVUbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTdGFydCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1N0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5pc2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0ZpbmlzaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzQ2FuTGV2ZWwgPGVtPkNhbiBMZXZlbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhbiBMZXZlbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNDYW5MZXZlbCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0NhbkxldmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWNjcnVlQXQgPGVtPkFjY3J1ZSBBdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjY3J1ZSBBdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWNjcnVlQXQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY2NydWVBdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmsgPGVtPldvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlZ3VsYXJXb3JrIDxlbT5SZWd1bGFyIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWd1bGFyIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlZ3VsYXJXb3JrKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUmVndWxhcldvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVdvcmsgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVydGltZSBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVdvcmsoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxXb3JrIDxlbT5BY3R1YWwgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0dWFsV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtYWluaW5nIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ1dvcmsoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZW1haW5pbmdXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1JlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1BlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTdGFuZGFyZFJhdGUgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFuZGFyZCBSYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9TdGFuZGFyZFJhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTdGFuZGFyZFJhdGVGb3JtYXQgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1N0YW5kYXJkUmF0ZUZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0KCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lUmF0ZSA8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lUmF0ZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX092ZXJ0aW1lUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfT3ZlcnRpbWVSYXRlRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVDb3N0KCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdFBlclVzZSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdCBQZXIgVXNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0UGVyVXNlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ29zdFBlclVzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbENvc3QoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0IDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdDb3N0IDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFpbmluZyBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdDb3N0KCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUmVtYWluaW5nQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUmVtYWluaW5nT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V29yayBWYXJpYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfV29ya1ZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ29zdFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U1YgPGVtPlNWPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U1Y8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFNWKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfU1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDViA8ZW0+Q1Y8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DVjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q1YoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9DVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFDV1AgPGVtPkFDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQUNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENhbGVuZGFyVUlEIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYWxlbmRhciBVSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENhbGVuZGFyVUlEKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ2FsZW5kYXJVSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROb3RlcyA8ZW0+Tm90ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ob3RlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Tm90ZXMoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Ob3RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dTPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNHZW5lcmljIDxlbT5JcyBHZW5lcmljPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgR2VuZXJpYzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0dlbmVyaWMoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jc0dlbmVyaWMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzSW5hY3RpdmUgPGVtPklzIEluYWN0aXZlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgSW5hY3RpdmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNJbmFjdGl2ZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0lzSW5hY3RpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzRW50ZXJwcmlzZSA8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIEVudGVycHJpc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNFbnRlcnByaXNlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSXNFbnRlcnByaXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Qm9va2luZ1R5cGUgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJvb2tpbmcgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Qm9va2luZ1R5cGUoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Cb29raW5nVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbFdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCA8ZW0+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0aXZlRGlyZWN0b3J5R1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNyZWF0aW9uIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENyZWF0aW9uRGF0ZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0NyZWF0aW9uRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlX0V4dGVuZGVkQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkJhc2VsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCYXNlbGluZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlX0Jhc2VsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfT3V0bGluZUNvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfQXZhaWxhYmlsaXR5UGVyaW9kcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJhdGVzIDxlbT5SYXRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlJhdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSYXRlcygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlX1JhdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFRpbWVwaGFzZWREYXRhKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfVGltZXBoYXNlZERhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzIDxlbT5SZXNvdXJjZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVzb3VyY2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJlc291cmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzI2dldFJlc291cmNlIDxlbT5SZXNvdXJjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVzb3VyY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlcyNnZXRSZXNvdXJjZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZXNfUmVzb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayA8ZW0+VGFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRVSUQgPGVtPlVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRVSUQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRJRCA8ZW0+SUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRJRCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19JRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgTnVsbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzTnVsbCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Jc051bGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENyZWF0ZURhdGUgPGVtPkNyZWF0ZSBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JlYXRlIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q3JlYXRlRGF0ZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19DcmVhdGVEYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb250YWN0IDxlbT5Db250YWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29udGFjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb250YWN0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0NvbnRhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdCUyA8ZW0+V0JTPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V0JTPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdCUygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19XQlMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdCU0xldmVsIDxlbT5XQlMgTGV2ZWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5XQlMgTGV2ZWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V0JTTGV2ZWwoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfV0JTTGV2ZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE91dGxpbmVOdW1iZXIgPGVtPk91dGxpbmUgTnVtYmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZU51bWJlcigpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19PdXRsaW5lTnVtYmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdXRsaW5lTGV2ZWwgPGVtPk91dGxpbmUgTGV2ZWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdXRsaW5lIExldmVsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE91dGxpbmVMZXZlbCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19PdXRsaW5lTGV2ZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByaW9yaXR5IDxlbT5Qcmlvcml0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByaW9yaXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByaW9yaXR5KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1ByaW9yaXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdGFydCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19TdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5pc2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RmluaXNoKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0ZpbmlzaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RHVyYXRpb24gPGVtPkR1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RHVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RHVyYXRpb24oKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRHVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdvcmsgPGVtPldvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdvcmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RvcCA8ZW0+U3RvcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0b3A8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RvcCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19TdG9wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZXN1bWUgPGVtPlJlc3VtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc3VtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZXN1bWUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUmVzdW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1Jlc3VtZVZhbGlkIDxlbT5SZXN1bWUgVmFsaWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXN1bWUgVmFsaWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSZXN1bWVWYWxpZCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19SZXN1bWVWYWxpZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFZmZvcnREcml2ZW4gPGVtPkVmZm9ydCBEcml2ZW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FZmZvcnQgRHJpdmVuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0VmZm9ydERyaXZlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSZWN1cnJpbmcgPGVtPlJlY3VycmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlY3VycmluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JlY3VycmluZygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19SZWN1cnJpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzT3ZlckFsbG9jYXRlZCA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfT3ZlckFsbG9jYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFc3RpbWF0ZWQgPGVtPkVzdGltYXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVzdGltYXRlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VzdGltYXRlZCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Fc3RpbWF0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NaWxlc3RvbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNNaWxlc3RvbmUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfTWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1N1bW1hcnkgPGVtPlN1bW1hcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdW1tYXJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzU3VtbWFyeSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19TdW1tYXJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0NyaXRpY2FsIDxlbT5Dcml0aWNhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNyaXRpY2FsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzQ3JpdGljYWwoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQ3JpdGljYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0IDxlbT5JcyBTdWJwcm9qZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgU3VicHJvamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Jc1N1YnByb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkgPGVtPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Jc1N1YnByb2plY3RSZWFkT25seSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3VicHJvamVjdE5hbWUgPGVtPlN1YnByb2plY3QgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN1YnByb2plY3QgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdWJwcm9qZWN0TmFtZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19TdWJwcm9qZWN0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFeHRlcm5hbFRhc2sgPGVtPkV4dGVybmFsIFRhc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHRlcm5hbCBUYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRXh0ZXJuYWxUYXNrKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0V4dGVybmFsVGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCA8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEV4dGVybmFsVGFza1Byb2plY3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRXh0ZXJuYWxUYXNrUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybHlTdGFydCA8ZW0+RWFybHkgU3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FYXJseSBTdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJseVN0YXJ0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0Vhcmx5U3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEVhcmx5RmluaXNoIDxlbT5FYXJseSBGaW5pc2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FYXJseSBGaW5pc2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybHlGaW5pc2goKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRWFybHlGaW5pc2goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExhdGVTdGFydCA8ZW0+TGF0ZSBTdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxhdGUgU3RhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGF0ZVN0YXJ0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0xhdGVTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGF0ZUZpbmlzaCA8ZW0+TGF0ZSBGaW5pc2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MYXRlIEZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMYXRlRmluaXNoKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0xhdGVGaW5pc2goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN0YXJ0VmFyaWFuY2UgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RhcnRWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19TdGFydFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaW5pc2hWYXJpYW5jZSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpbmlzaFZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0ZpbmlzaFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Xb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZyZWVTbGFjayA8ZW0+RnJlZSBTbGFjazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZyZWUgU2xhY2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RnJlZVNsYWNrKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0ZyZWVTbGFjaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0VG90YWxTbGFjayA8ZW0+VG90YWwgU2xhY2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ub3RhbCBTbGFjazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRUb3RhbFNsYWNrKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1RvdGFsU2xhY2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpeGVkQ29zdCA8ZW0+Rml4ZWQgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpeGVkIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Rml4ZWRDb3N0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0ZpeGVkQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Rml4ZWRDb3N0QWNjcnVhbCA8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpeGVkQ29zdEFjY3J1YWwoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRml4ZWRDb3N0QWNjcnVhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UGVyY2VudENvbXBsZXRlIDxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGVyY2VudCBDb21wbGV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUGVyY2VudENvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19QZXJjZW50V29ya0NvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb3N0IDxlbT5Db3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb3N0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0Nvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE92ZXJ0aW1lQ29zdCA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3ZlcnRpbWVDb3N0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX092ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcnRpbWUgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdmVydGltZVdvcmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxTdGFydCA8ZW0+QWN0dWFsIFN0YXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIFN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxGaW5pc2ggPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgRmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxGaW5pc2goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbER1cmF0aW9uIDxlbT5BY3R1YWwgRHVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgRHVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsRHVyYXRpb24oKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsRHVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsQ29zdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbE92ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbFdvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29yayA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZWd1bGFyV29yayA8ZW0+UmVndWxhciBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVndWxhciBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlZ3VsYXJXb3JrKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1JlZ3VsYXJXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdEdXJhdGlvbiA8ZW0+UmVtYWluaW5nIER1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtYWluaW5nIER1cmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ0R1cmF0aW9uKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1JlbWFpbmluZ0R1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdDb3N0IDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFpbmluZyBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nV29yayA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1JlbWFpbmluZ1dvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1JlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFDV1A8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QUNXUCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19BQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDViA8ZW0+Q1Y8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DVjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDVigpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19DVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29uc3RyYWludFR5cGUgPGVtPkNvbnN0cmFpbnQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbnN0cmFpbnQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb25zdHJhaW50VHlwZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Db25zdHJhaW50VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhbGVuZGFyIFVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDYWxlbmRhclVJRCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19DYWxlbmRhclVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29uc3RyYWludERhdGUgPGVtPkNvbnN0cmFpbnQgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbnN0cmFpbnQgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb25zdHJhaW50RGF0ZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Db25zdHJhaW50RGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RGVhZGxpbmUgPGVtPkRlYWRsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVhZGxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RGVhZGxpbmUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRGVhZGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxBc3NpZ25tZW50cyA8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsQXNzaWdubWVudHMoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfTGV2ZWxBc3NpZ25tZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNMZXZlbGluZ0NhblNwbGl0IDxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNMZXZlbGluZ0NhblNwbGl0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0xldmVsaW5nQ2FuU3BsaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExldmVsaW5nRGVsYXkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGV2ZWxpbmdEZWxheSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19MZXZlbGluZ0RlbGF5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0IDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19MZXZlbGluZ0RlbGF5Rm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmVMZXZlbGVkU3RhcnQgPGVtPlByZSBMZXZlbGVkIFN0YXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlIExldmVsZWQgU3RhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJlTGV2ZWxlZFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1ByZUxldmVsZWRTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJlTGV2ZWxlZEZpbmlzaCA8ZW0+UHJlIExldmVsZWQgRmluaXNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlIExldmVsZWQgRmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZUxldmVsZWRGaW5pc2goKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUHJlTGV2ZWxlZEZpbmlzaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IeXBlcmxpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SHlwZXJsaW5rKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0h5cGVybGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SHlwZXJsaW5rQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0h5cGVybGlua0FkZHJlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0h5cGVybGlua1N1YkFkZHJlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhciA8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19JZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXROb3RlcyA8ZW0+Tm90ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ob3RlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXROb3RlcygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Ob3RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNIaWRlQmFyIDxlbT5IaWRlIEJhcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhpZGUgQmFyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSGlkZUJhcigpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19IaWRlQmFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JvbGx1cCA8ZW0+Um9sbHVwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Um9sbHVwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUm9sbHVwKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1JvbGx1cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QkNXUygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19CQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QkNXUDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0JDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlIDxlbT5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19QaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybmVkVmFsdWVNZXRob2QgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEVhcm5lZFZhbHVlTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0Vhcm5lZFZhbHVlTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZWRlY2Vzc29yTGluayA8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmVkZWNlc3NvckxpbmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfUHJlZGVjZXNzb3JMaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxXb3JrUHJvdGVjdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19FeHRlbmRlZEF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkJhc2VsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJhc2VsaW5lKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX0Jhc2VsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk91dGxpbmUgQ29kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdXRsaW5lQ29kZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19PdXRsaW5lQ29kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0VGltZXBoYXNlZERhdGEoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfVGltZXBoYXNlZERhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3MgPGVtPlRhc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhc2tzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzI2dldFRhc2sgPGVtPlRhc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRhc2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzI2dldFRhc2soKQotCSAqIEBzZWUgI2dldFRhc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrc19UYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QgPGVtPlRpbWUgUGVyaW9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRpbWUgUGVyaW9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUaW1lUGVyaW9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZCNnZXRGcm9tRGF0ZSA8ZW0+RnJvbSBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RnJvbSBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kI2dldEZyb21EYXRlKCkKLQkgKiBAc2VlICNnZXRUaW1lUGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUaW1lUGVyaW9kX0Zyb21EYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZCNnZXRUb0RhdGUgPGVtPlRvIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UbyBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kI2dldFRvRGF0ZSgpCi0JICogQHNlZSAjZ2V0VGltZVBlcmlvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGltZVBlcmlvZF9Ub0RhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlIDxlbT5UaW1lcGhhc2VkIERhdGEgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UaW1lcGhhc2VkIERhdGEgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFVJRCA8ZW0+VUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VUlEKCkKLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9VSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRTdGFydCgpCi0JICogQHNlZSAjZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5pc2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRGaW5pc2goKQotCSAqIEBzZWUgI2dldFRpbWVwaGFzZWREYXRhVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGltZXBoYXNlZERhdGFUeXBlX0ZpbmlzaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRVbml0IDxlbT5Vbml0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VW5pdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFVuaXQoKQotCSAqIEBzZWUgI2dldFRpbWVwaGFzZWREYXRhVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGltZXBoYXNlZERhdGFUeXBlX1VuaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRWYWx1ZUlEKCkKLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VmFsdWVfVmFsdWVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFBhcmVudFZhbHVlSUQgPGVtPlBhcmVudCBWYWx1ZSBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhcmVudCBWYWx1ZSBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0UGFyZW50VmFsdWVJRCgpCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhbHVlX1BhcmVudFZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRWYWx1ZV9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhbHVlX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiA8ZW0+VmFsdWUyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlZhbHVlMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRWYWx1ZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIjZ2V0SUQgPGVtPklEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXRJRCgpCi0JICogQHNlZSAjZ2V0VmFsdWUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRWYWx1ZTJfSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0VmFsdWUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRWYWx1ZTJfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0VmFsdWUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRWYWx1ZTJfRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0IDxlbT5WYWx1ZSBMaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlZhbHVlIExpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VmFsdWVMaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3QjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0I2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRWYWx1ZUxpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFZhbHVlTGlzdF9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXMgPGVtPlZhbHVlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5WYWx1ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VmFsdWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXMjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzI2dldEdyb3VwKCkKLQkgKiBAc2VlICNnZXRWYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhbHVlc19Hcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlcyNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0VmFsdWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRWYWx1ZXNfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayA8ZW0+V0JTIE1hc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V0JTIE1hc2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdCU01hc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldExldmVsIDxlbT5MZXZlbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldExldmVsKCkKLQkgKiBAc2VlICNnZXRXQlNNYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXQlNNYXNrX0xldmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRXQlNNYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXQlNNYXNrX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldExlbmd0aCA8ZW0+TGVuZ3RoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGVuZ3RoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldExlbmd0aCgpCi0JICogQHNlZSAjZ2V0V0JTTWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V0JTTWFza19MZW5ndGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldFNlcGFyYXRvciA8ZW0+U2VwYXJhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VwYXJhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldFNlcGFyYXRvcigpCi0JICogQHNlZSAjZ2V0V0JTTWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V0JTTWFza19TZXBhcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MgPGVtPldCUyBNYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XQlMgTWFza3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXQlNNYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzVmVyaWZ5VW5pcXVlQ29kZXMgPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJpZnkgVW5pcXVlIENvZGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNpc1ZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAc2VlICNnZXRXQlNNYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V0JTTWFza3NfVmVyaWZ5VW5pcXVlQ29kZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNpc0dlbmVyYXRlQ29kZXMgPGVtPkdlbmVyYXRlIENvZGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzR2VuZXJhdGVDb2RlcygpCi0JICogQHNlZSAjZ2V0V0JTTWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdCU01hc2tzX0dlbmVyYXRlQ29kZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByZWZpeDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjZ2V0UHJlZml4KCkKLQkgKiBAc2VlICNnZXRXQlNNYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V0JTTWFza3NfUHJlZml4KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNnZXRXQlNNYXNrIDxlbT5XQlMgTWFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+V0JTIE1hc2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2dldFdCU01hc2soKQotCSAqIEBzZWUgI2dldFdCU01hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXQlNNYXNrc19XQlNNYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkgPGVtPldlZWsgRGF5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldlZWsgRGF5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXZWVrRGF5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNnZXREYXlUeXBlIDxlbT5EYXkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRheSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldERheVR5cGUoKQotCSAqIEBzZWUgI2dldFdlZWtEYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdlZWtEYXlfRGF5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjaXNEYXlXb3JraW5nIDxlbT5EYXkgV29ya2luZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRheSBXb3JraW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2lzRGF5V29ya2luZygpCi0JICogQHNlZSAjZ2V0V2Vla0RheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2Vla0RheV9EYXlXb3JraW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNnZXRUaW1lUGVyaW9kIDxlbT5UaW1lIFBlcmlvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlRpbWUgUGVyaW9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldFRpbWVQZXJpb2QoKQotCSAqIEBzZWUgI2dldFdlZWtEYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlZWtEYXlfVGltZVBlcmlvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0V29ya2luZ1RpbWVzIDxlbT5Xb3JraW5nIFRpbWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+V29ya2luZyBUaW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNnZXRXb3JraW5nVGltZXMoKQotCSAqIEBzZWUgI2dldFdlZWtEYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlZWtEYXlfV29ya2luZ1RpbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzIDxlbT5XZWVrIERheXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V2VlayBEYXlzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5cwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V2Vla0RheXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzI2dldFdlZWtEYXkgPGVtPldlZWsgRGF5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5XZWVrIERheTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXMjZ2V0V2Vla0RheSgpCi0JICogQHNlZSAjZ2V0V2Vla0RheXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlZWtEYXlzX1dlZWtEYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUgPGVtPldvcmtpbmcgVGltZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JraW5nIFRpbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JraW5nVGltZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lI2dldEZyb21UaW1lIDxlbT5Gcm9tIFRpbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Gcm9tIFRpbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lI2dldEZyb21UaW1lKCkKLQkgKiBAc2VlICNnZXRXb3JraW5nVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya2luZ1RpbWVfRnJvbVRpbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZSNnZXRUb1RpbWUgPGVtPlRvIFRpbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UbyBUaW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZSNnZXRUb1RpbWUoKQotCSAqIEBzZWUgI2dldFdvcmtpbmdUaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JraW5nVGltZV9Ub1RpbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzIDxlbT5Xb3JraW5nIFRpbWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmtpbmcgVGltZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya2luZ1RpbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXMjZ2V0V29ya2luZ1RpbWUgPGVtPldvcmtpbmcgVGltZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+V29ya2luZyBUaW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXMjZ2V0V29ya2luZ1RpbWUoKQotCSAqIEBzZWUgI2dldFdvcmtpbmdUaW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya2luZ1RpbWVzX1dvcmtpbmdUaW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkFjY3J1ZSBBdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+QWNjcnVlIEF0PC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0FjY3J1ZUF0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMSAyIDMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEFjY3J1ZUF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+QWN0aXZlIERpcmVjdG9yeSBHVUlEIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdBY3RpdmVEaXJlY3RvcnlHVUlEXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nMTYnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEFjdGl2ZURpcmVjdG9yeUdVSURUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+QWxpYXMgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+QWxpYXMgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQWxpYXNfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0QWxpYXNUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+QXV0aG9yIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkF1dGhvciBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdBdXRob3JfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEF1dGhvclR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+QmFzZWxpbmUgRm9yIEVhcm5lZCBWYWx1ZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMgNCA1IDYgNyA4IDkgMTAnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkJvb2tpbmcgVHlwZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Cb29raW5nIFR5cGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdCb29raW5nVHlwZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Qm9va2luZ1R5cGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkJvb2tpbmcgVHlwZSBUeXBlMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Qm9va2luZyBUeXBlIFR5cGUxPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Jvb2tpbmdUeXBlXy5fMV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Qm9va2luZ1R5cGVUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5DYWxjdWxhdGlvbiBUeXBlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkNhbGN1bGF0aW9uIFR5cGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDYWxjdWxhdGlvblR5cGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Q2FsY3VsYXRpb25UeXBlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkNhdGVnb3J5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkNhdGVnb3J5IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NhdGVnb3J5Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDYXRlZ29yeVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5Db2RlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkNvZGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29kZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Q29kZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5Db21wYW55IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkNvbXBhbnkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29tcGFueV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Q29tcGFueVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+Q29uc3RyYWludCBUeXBlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkNvbnN0cmFpbnQgVHlwZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbnN0cmFpbnRUeXBlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDIgMyA0IDUgNiA3JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDb25zdHJhaW50VHlwZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5Db250YWN0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkNvbnRhY3QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29udGFjdF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Q29udGFjdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+Q29zdCBSYXRlIFRhYmxlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkNvc3QgUmF0ZSBUYWJsZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Nvc3RSYXRlVGFibGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzIDQnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldENvc3RSYXRlVGFibGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDdXJyZW5jeVN5bWJvbFBvc2l0aW9uXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDIgMyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5DdXJyZW5jeSBTeW1ib2wgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q3VycmVuY3kgU3ltYm9sIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0N1cnJlbmN5U3ltYm9sXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nMjAnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEN1cnJlbmN5U3ltYm9sVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5EYXkgVHlwZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EYXkgVHlwZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0RheVR5cGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzIDQgNSA2IDcnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldERheVR5cGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScxIDIgMyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0RlZmF1bHRUYXNrRVZNZXRob2RfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldERlZmF1bHRUYXNrRVZNZXRob2RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkRlZmF1bHQgVGFzayBUeXBlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkRlZmF1bHQgVGFzayBUeXBlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGVmYXVsdFRhc2tUeXBlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldERlZmF1bHRUYXNrVHlwZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0R1cmF0aW9uRm9ybWF0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUxPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0R1cmF0aW9uRm9ybWF0Xy5fMV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldER1cmF0aW9uRm9ybWF0VHlwZTEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTI8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRHVyYXRpb25Gb3JtYXRfLl8yXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMzwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEdXJhdGlvbkZvcm1hdF8uXzNfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPSczIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGUzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlNDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU0PC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0R1cmF0aW9uRm9ybWF0Xy5fNF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldER1cmF0aW9uRm9ybWF0VHlwZTQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU1PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRHVyYXRpb25Gb3JtYXRfLl81Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdFYXJuZWRWYWx1ZU1ldGhvZF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RWFybmVkVmFsdWVNZXRob2RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2QgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2QgVHlwZTE8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRWFybmVkVmFsdWVNZXRob2RfLl8xXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+RW1haWwgQWRkcmVzcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5FbWFpbCBBZGRyZXNzIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0VtYWlsQWRkcmVzc18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RW1haWxBZGRyZXNzVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkV4dGVybmFsIFRhc2sgUHJvamVjdCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXh0ZXJuYWxUYXNrUHJvamVjdF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5GaXhlZCBDb3N0IEFjY3J1YWwgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0ZpeGVkQ29zdEFjY3J1YWxfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgZW51bWVyYXRpb249JzEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRGaXhlZENvc3RBY2NydWFsVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5GWSBTdGFydCBEYXRlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkZZIFN0YXJ0IERhdGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdGWVN0YXJ0RGF0ZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRGWVN0YXJ0RGF0ZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5Hcm91cCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Hcm91cCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdHcm91cF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0R3JvdXBUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rQWRkcmVzc18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rQWRkcmVzc1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTE8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0h5cGVybGlua0FkZHJlc3NfLl8xXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZTEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTI8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0h5cGVybGlua0FkZHJlc3NfLl8yXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3MgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0h5cGVybGlua1N1YkFkZHJlc3NfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3MgVHlwZTE8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0h5cGVybGlua1N1YkFkZHJlc3NfLl8xXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3MgVHlwZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlMjwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rU3ViQWRkcmVzc18uXzJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkh5cGVybGluayBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5IeXBlcmxpbmsgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRIeXBlcmxpbmtUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+SHlwZXJsaW5rIFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5IeXBlcmxpbmsgVHlwZTE8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0h5cGVybGlua18uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEh5cGVybGlua1R5cGUxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+SHlwZXJsaW5rIFR5cGUyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5IeXBlcmxpbmsgVHlwZTI8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0h5cGVybGlua18uXzJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEh5cGVybGlua1R5cGUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+SW5pdGlhbHMgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SW5pdGlhbHMgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSW5pdGlhbHNfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEluaXRpYWxzVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5MYWcgRm9ybWF0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkxhZyBGb3JtYXQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdMYWdGb3JtYXRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPSczIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRMYWdGb3JtYXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdMZXZlbGluZ0RlbGF5Rm9ybWF0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0IFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQgVHlwZTE8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTGV2ZWxpbmdEZWxheUZvcm1hdF8uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPSczIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5NYW5hZ2VyIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk1hbmFnZXIgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTWFuYWdlcl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TWFuYWdlclR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5NYXRlcmlhbCBMYWJlbCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5NYXRlcmlhbCBMYWJlbCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNYXRlcmlhbExhYmVsXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRNYXRlcmlhbExhYmVsVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPk5hbWUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TmFtZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdOYW1lXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXROYW1lVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPk5hbWUgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk5hbWUgVHlwZTE8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J05hbWVfLl8xXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXROYW1lVHlwZTEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5OYW1lIFR5cGUyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5OYW1lIFR5cGUyPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdOYW1lXy5fMl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TmFtZVR5cGUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+TmFtZSBUeXBlMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TmFtZSBUeXBlMzwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTmFtZV8uXzNfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPScyNTUnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE5hbWVUeXBlMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5OZXcgVGFzayBTdGFydCBEYXRlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdOZXdUYXNrU3RhcnREYXRlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXROZXdUYXNrU3RhcnREYXRlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPk5UIEFjY291bnQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TlQgQWNjb3VudCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdOVEFjY291bnRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE5UQWNjb3VudFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5PdXRsaW5lIE51bWJlciBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5PdXRsaW5lIE51bWJlciBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdPdXRsaW5lTnVtYmVyXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRPdXRsaW5lTnVtYmVyVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5PdmVydGltZSBSYXRlIEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J092ZXJ0aW1lUmF0ZUZvcm1hdF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzEgMiAzIDQgNSA3JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRPdmVydGltZVJhdGVGb3JtYXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0IFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5PdmVydGltZSBSYXRlIEZvcm1hdCBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdPdmVydGltZVJhdGVGb3JtYXRfLl8xXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMSAyIDMgNCA1IDcnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+UGhvbmV0aWMgQWxpYXMgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+UGhvbmV0aWMgQWxpYXMgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUGhvbmV0aWNBbGlhc18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUwJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRQaG9uZXRpY0FsaWFzVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlBob25ldGljcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5QaG9uZXRpY3MgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUGhvbmV0aWNzXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRQaG9uZXRpY3NUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+UHJlZml4IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlByZWZpeCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQcmVmaXhfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0UHJlZml4VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5SYXRlIFRhYmxlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlJhdGUgVGFibGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdSYXRlVGFibGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzIDQnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFJhdGVUYWJsZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+Um9sbHVwIFR5cGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Um9sbHVwIFR5cGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdSb2xsdXBUeXBlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDIgMyA0IDUgNiA3JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRSb2xsdXBUeXBlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1N0YW5kYXJkUmF0ZUZvcm1hdF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzEgMiAzIDQgNSA3JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0IFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdCBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdTdGFuZGFyZFJhdGVGb3JtYXRfLl8xXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMSAyIDMgNCA1IDcgOCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5TdWJqZWN0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlN1YmplY3QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nU3ViamVjdF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0U3ViamVjdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5TdWJwcm9qZWN0IE5hbWUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+U3VicHJvamVjdCBOYW1lIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1N1YnByb2plY3ROYW1lXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRTdWJwcm9qZWN0TmFtZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5UaXRsZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5UaXRsZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUaXRsZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VGl0bGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlR5cGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VHlwZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1R5cGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VHlwZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+VHlwZSBUeXBlMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VHlwZSBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUeXBlXy5fMV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFR5cGVUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5UeXBlIFR5cGUyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5UeXBlIFR5cGUyPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1R5cGVfLl8yXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDIgMyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VHlwZVR5cGUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlR5cGUgVHlwZTM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlR5cGUgVHlwZTM8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVHlwZV8uXzNfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxNiAxNyAxOCAxOSAyMCAyMSAyMiAyMyAyNCAyNSAyNiAyNyAyOCAyOSAzMCAzMSAzMiAzMyAzNCAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA0NSA0NiA0NyA0OCA0OSA1MCA1MSA1MiA1MyA1NCA1NSA1NiA1NyA1OCA1OSA2MCA2MSA2MiA2MyA2NCA2NSA2NiA2NyA2OCA2OSA3MCA3MSA3MiA3MyA3NCA3NSA3NiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VHlwZVR5cGUzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlR5cGUgVHlwZTQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlR5cGUgVHlwZTQ8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVHlwZV8uXzRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFR5cGVUeXBlNCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5UeXBlIFR5cGU1PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5UeXBlIFR5cGU1PC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1R5cGVfLl81Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDIgMyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VHlwZVR5cGU1KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+VUlEIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlVJRCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdVSURfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPScxNiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VUlEVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5Vbml0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlVuaXQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdVbml0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDIgMyA1IDgnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFVuaXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVmFsdWVsaXN0U29ydE9yZGVyXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPldlZWsgU3RhcnQgRGF5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPldlZWsgU3RhcnQgRGF5IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV2Vla1N0YXJ0RGF5Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDIgMyA0IDUgNiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0V2Vla1N0YXJ0RGF5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5Xb3JrIENvbnRvdXIgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+V29yayBDb250b3VyIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV29ya0NvbnRvdXJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzIDQgNSA2IDcgOCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0V29ya0NvbnRvdXJUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPldvcmsgRm9ybWF0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPldvcmsgRm9ybWF0IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV29ya0Zvcm1hdF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzEgMiAzIDQgNSciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0V29ya0Zvcm1hdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+V29yayBHcm91cCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Xb3JrIEdyb3VwIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV29ya0dyb3VwXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDIgMyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0V29ya0dyb3VwVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTXNwcm9qZWN0RmFjdG9yeSBnZXRNc3Byb2plY3RGYWN0b3J5KCk7Ci0KLX0gLy9Nc3Byb2plY3RQYWNrYWdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9PdXRsaW5lQ29kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZGU2Zjg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9PdXRsaW5lQ29kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogT3V0bGluZUNvZGUuamF2YSx2IDEuMiAyMDA2LzA0LzExIDE1OjI5OjU1IGp0aGFyaW8gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0bGluZSBDb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RmllbGROYW1lIDxlbT5GaWVsZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldEFsaWFzIDxlbT5BbGlhczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRQaG9uZXRpY0FsaWFzIDxlbT5QaG9uZXRpYyBBbGlhczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRWYWx1ZXMgPGVtPlZhbHVlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0VudGVycHJpc2UgPGVtPkVudGVycHJpc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMgPGVtPkVudGVycHJpc2UgT3V0bGluZSBDb2RlIEFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIDxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0xlYWZPbmx5IDxlbT5MZWFmIE9ubHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNBbGxMZXZlbHNSZXF1aXJlZCA8ZW0+QWxsIExldmVscyBSZXF1aXJlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQgPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0TWFza3MgPGVtPk1hc2tzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J091dGxpbmVDb2RlXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE91dGxpbmVDb2RlIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIENvcmVzcG9uZHMgdG8gdGhlIGZpZWxkIG51bWJlciBvZiBvdXRsaW5lIGNvZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZElEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZV9GaWVsZElEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpZWxkSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGRJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpZWxkSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpZWxkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBuYW1lIG9mIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX0ZpZWxkTmFtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaWVsZE5hbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldEZpZWxkTmFtZSA8ZW0+RmllbGQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsaWFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWxpYXMgb2YgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsaWFzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBbGlhcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVfQWxpYXMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWxpYXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWxpYXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsaWFzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaG9uZXRpYyBBbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBob25ldGljIHByb251bmNpYXRpb24gb2YgdGhlIGFsaWFzIG9mIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaG9uZXRpYyBBbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGhvbmV0aWNBbGlhcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVfUGhvbmV0aWNBbGlhcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQaG9uZXRpY0FsaWFzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBob25ldGljQWxpYXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0UGhvbmV0aWNBbGlhcyA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBob25ldGljIEFsaWFzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQaG9uZXRpY0FsaWFzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZXMgb2YgdGhlIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG91dGxpbmUgY29kZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRWYWx1ZXMoVmFsdWVzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX1ZhbHVlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVZhbHVlcyBnZXRWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0VmFsdWVzIDxlbT5WYWx1ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VmFsdWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZXMoVmFsdWVzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudGVycHJpc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlIGlzIGFuIGVudGVycHJpc2UgY3VzdG9tIG91dGxpbmUgY29kZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW50ZXJwcmlzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFbnRlcnByaXNlKCkKLQkgKiBAc2VlICN1bnNldEVudGVycHJpc2UoKQotCSAqIEBzZWUgI3NldEVudGVycHJpc2UoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZV9FbnRlcnByaXNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFbnRlcnByaXNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0VudGVycHJpc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNFbnRlcnByaXNlIDxlbT5FbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRlcnByaXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVudGVycHJpc2UoKQotCSAqIEBzZWUgI3Vuc2V0RW50ZXJwcmlzZSgpCi0JICogQHNlZSAjaXNFbnRlcnByaXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbnRlcnByaXNlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzRW50ZXJwcmlzZSA8ZW0+RW50ZXJwcmlzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRFbnRlcnByaXNlKCkKLQkgKiBAc2VlICNpc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI3NldEVudGVycHJpc2UoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEVudGVycHJpc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0VudGVycHJpc2UgPGVtPkVudGVycHJpc2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGVycHJpc2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEVudGVycHJpc2UoKQotCSAqIEBzZWUgI2lzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjc2V0RW50ZXJwcmlzZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RW50ZXJwcmlzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW50ZXJwcmlzZSBPdXRsaW5lIENvZGUgQWxpYXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgcmVmZXJlbmNlIHRvIGFub3RoZXIgY3VzdG9tIGZpZWxkIGZvciB3aGljaCB0aGlzIGlzIGFuIGFsaWFzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZV9FbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzIDxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW50ZXJwcmlzZSBPdXRsaW5lIENvZGUgQWxpYXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyhCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlIGNhbiBiZSB1c2VkIGJ5IHRoZSBSZXNvdXJjZSBTdWJzdGl0dXRpb24gV2l6YXJkIGluIE1pY3Jvc29mdCBQcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI3Vuc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAc2VlICNzZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZV9SZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI3Vuc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAc2VlICNpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIDxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAc2VlICNzZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIDxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQHNlZSAjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI3NldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZWFmIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgb3Igbm90IHZhbHVlcyBzcGVjaWZpZWQgaW4gdGhpcyBvdXRsaW5lIGNvZGUgZmllbGQgbXVzdCBiZSBsZWFmIHZhbHVlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGVhZiBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldExlYWZPbmx5KCkKLQkgKiBAc2VlICN1bnNldExlYWZPbmx5KCkKLQkgKiBAc2VlICNzZXRMZWFmT25seShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX0xlYWZPbmx5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZWFmT25seScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNMZWFmT25seSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0xlYWZPbmx5IDxlbT5MZWFmIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxlYWYgT25seTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRMZWFmT25seSgpCi0JICogQHNlZSAjdW5zZXRMZWFmT25seSgpCi0JICogQHNlZSAjaXNMZWFmT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGVhZk9ubHkoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNMZWFmT25seSA8ZW0+TGVhZiBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldExlYWZPbmx5KCkKLQkgKiBAc2VlICNpc0xlYWZPbmx5KCkKLQkgKiBAc2VlICNzZXRMZWFmT25seShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TGVhZk9ubHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0xlYWZPbmx5IDxlbT5MZWFmIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxlYWYgT25seTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TGVhZk9ubHkoKQotCSAqIEBzZWUgI2lzTGVhZk9ubHkoKQotCSAqIEBzZWUgI3NldExlYWZPbmx5KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRMZWFmT25seSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWxsIExldmVscyBSZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogTmV3IGNvZGVzIG11c3QgaGF2ZSBhbGwgbGV2ZWxzIHByZXNlbnQuICBOb3QgYXZhaWxhYmxlIGZvciBFbnRlcnByaXNlIENvZGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICN1bnNldEFsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNzZXRBbGxMZXZlbHNSZXF1aXJlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX0FsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBbGxMZXZlbHNSZXF1aXJlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNBbGxMZXZlbHNSZXF1aXJlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0FsbExldmVsc1JlcXVpcmVkIDxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICN1bnNldEFsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNpc0FsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBbGxMZXZlbHNSZXF1aXJlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0FsbExldmVsc1JlcXVpcmVkIDxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEFsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNpc0FsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNzZXRBbGxMZXZlbHNSZXF1aXJlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QWxsTGV2ZWxzUmVxdWlyZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0FsbExldmVsc1JlcXVpcmVkIDxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBbGxMZXZlbHNSZXF1aXJlZCgpCi0JICogQHNlZSAjaXNBbGxMZXZlbHNSZXF1aXJlZCgpCi0JICogQHNlZSAjc2V0QWxsTGV2ZWxzUmVxdWlyZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEFsbExldmVsc1JlcXVpcmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHZhbHVlcyBzcGVjaWZpZWQgbXVzdCBjb21lIGZyb20gdmFsdWVzIHRhYmxlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBzZWUgI3Vuc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J09ubHlUYWJsZVZhbHVlc0FsbG93ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQgPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjdW5zZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkKLQkgKiBAc2VlICNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkIDxlbT5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBzZWUgI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCA8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkKLQkgKiBAc2VlICNzZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXNrczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRhYmxlIG9mIGVudHJpZXMgdGhhdCBkZWZpbmUgdGhlIG91dGxpbmUgY29kZSBtYXNrLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXNrczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWFza3MoTWFza3MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVfTWFza3MoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYXNrcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1hc2tzIGdldE1hc2tzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldE1hc2tzIDxlbT5NYXNrczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFza3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE1hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXNrcyhNYXNrcyB2YWx1ZSk7Ci0KLX0gLy8gT3V0bGluZUNvZGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9PdXRsaW5lQ29kZTIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9PdXRsaW5lQ29kZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTg4M2Q0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZTIuamF2YSx2IDEuMiAyMDA2LzA0LzExIDE1OjI5OjU1IGp0aGFyaW8gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0bGluZSBDb2RlMjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGUyKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdPdXRsaW5lQ29kZV8uXzFfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3V0bGluZUNvZGUyIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgb3V0bGluZSBjb2RlIGNvbGxlY3Rpb24uCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZTJfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZpZWxkIElEIGluIHRoZSBsb2NhbGlzZWQgbGFuZ3VhZ2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpZWxkSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlMl9GaWVsZElEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpZWxkSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGRJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZElEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBpbiB0aGUgdmFsdWUgbGlzdCBhc3NvY2lhdGVkIHdpdGggdGhlIGRlZmluaXRpb24gaW4gdGhlIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZSBjb2RlIGNvbGxlY3Rpb24uCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZTJfVmFsdWVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi19IC8vIE91dGxpbmVDb2RlMgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2RlMy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2RlMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NWE5YTE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9PdXRsaW5lQ29kZTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE91dGxpbmVDb2RlMy5qYXZhLHYgMS4yIDIwMDYvMDQvMTEgMTU6Mjk6NTUganRoYXJpbyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRsaW5lIENvZGUzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZTMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J091dGxpbmVDb2RlXy5fMl8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBPdXRsaW5lQ29kZTMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlM19VSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1VJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRVSUQgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZmllbGQgSUQgaW4gdGhlIGxvY2FsaXNlZCBsYW5ndWFnZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmllbGRJRChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGUzX0ZpZWxkSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmllbGRJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpZWxkSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIElEIGluIHRoZSB2YWx1ZSBsaXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZTNfVmFsdWVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi19IC8vIE91dGxpbmVDb2RlMwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2Rlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2Rlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMTBiZTZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9PdXRsaW5lQ29kZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogT3V0bGluZUNvZGVzLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0bGluZSBDb2RlczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlcyNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdPdXRsaW5lQ29kZXNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3V0bGluZUNvZGVzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0bGluZSBDb2RlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaW5kaXZpZHVhbCBvdXRsaW5lIGNvZGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVzX091dGxpbmVDb2RlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0bGluZUNvZGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRPdXRsaW5lQ29kZSgpOwotCi19IC8vIE91dGxpbmVDb2RlcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ByZWRlY2Vzc29yTGluay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ByZWRlY2Vzc29yTGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMjNmZTUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9QcmVkZWNlc3NvckxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByZWRlY2Vzc29yTGluay5qYXZhLHYgMS4yIDIwMDYvMDQvMTEgMTU6Mjk6NTUganRoYXJpbyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmVkZWNlc3NvciBMaW5rPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldFByZWRlY2Vzc29yVUlEIDxlbT5QcmVkZWNlc3NvciBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2lzQ3Jvc3NQcm9qZWN0IDxlbT5Dcm9zcyBQcm9qZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRDcm9zc1Byb2plY3ROYW1lIDxlbT5Dcm9zcyBQcm9qZWN0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldExpbmtMYWcgPGVtPkxpbmsgTGFnPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRMYWdGb3JtYXQgPGVtPkxhZyBGb3JtYXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcmVkZWNlc3NvckxpbmsoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ByZWRlY2Vzc29yTGlua18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcmVkZWNlc3NvckxpbmsgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvciBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcHJlZGVjZXNzb3IgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZWRlY2Vzc29yVUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJlZGVjZXNzb3JMaW5rX1ByZWRlY2Vzc29yVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmVkZWNlc3NvclVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UHJlZGVjZXNzb3JVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldFByZWRlY2Vzc29yVUlEIDxlbT5QcmVkZWNlc3NvciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWRlY2Vzc29yIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWRlY2Vzc29yVUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGxpbmsgdHlwZS4gIFZhbHVlcyBhcmUgMD1GRiwgMT1GUywgMj1TRiBhbmQgMz1TUwotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcmVkZWNlc3NvckxpbmtfVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlR5cGVUeXBlMSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVHlwZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyb3NzIFByb2plY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHByZWRlY2Vzc29yIGlzIHBhcnQgb2YgYW5vdGhlciBwcm9qZWN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyb3NzIFByb2plY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q3Jvc3NQcm9qZWN0KCkKLQkgKiBAc2VlICN1bnNldENyb3NzUHJvamVjdCgpCi0JICogQHNlZSAjc2V0Q3Jvc3NQcm9qZWN0KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJlZGVjZXNzb3JMaW5rX0Nyb3NzUHJvamVjdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ3Jvc3NQcm9qZWN0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0Nyb3NzUHJvamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjaXNDcm9zc1Byb2plY3QgPGVtPkNyb3NzIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNyb3NzIFByb2plY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q3Jvc3NQcm9qZWN0KCkKLQkgKiBAc2VlICN1bnNldENyb3NzUHJvamVjdCgpCi0JICogQHNlZSAjaXNDcm9zc1Byb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyb3NzUHJvamVjdChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjaXNDcm9zc1Byb2plY3QgPGVtPkNyb3NzIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Q3Jvc3NQcm9qZWN0KCkKLQkgKiBAc2VlICNpc0Nyb3NzUHJvamVjdCgpCi0JICogQHNlZSAjc2V0Q3Jvc3NQcm9qZWN0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDcm9zc1Byb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjaXNDcm9zc1Byb2plY3QgPGVtPkNyb3NzIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyb3NzIFByb2plY3Q8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENyb3NzUHJvamVjdCgpCi0JICogQHNlZSAjaXNDcm9zc1Byb2plY3QoKQotCSAqIEBzZWUgI3NldENyb3NzUHJvamVjdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q3Jvc3NQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Dcm9zcyBQcm9qZWN0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBleHRlcm5hbCBwcmVkZWNlc3NvciBwcm9qZWN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyb3NzIFByb2plY3QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3Jvc3NQcm9qZWN0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJlZGVjZXNzb3JMaW5rX0Nyb3NzUHJvamVjdE5hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ3Jvc3NQcm9qZWN0TmFtZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDcm9zc1Byb2plY3ROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRDcm9zc1Byb2plY3ROYW1lIDxlbT5Dcm9zcyBQcm9qZWN0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNyb3NzIFByb2plY3QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3Jvc3NQcm9qZWN0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGluayBMYWc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2YgbGFnIGluIHRlbnRocyBvZiBhIG1pbnV0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rIExhZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGlua0xhZyhCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByZWRlY2Vzc29yTGlua19MaW5rTGFnKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMaW5rTGFnJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRMaW5rTGFnKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRMaW5rTGFnIDxlbT5MaW5rIExhZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGluayBMYWc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExpbmtMYWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExpbmtMYWcoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MYWcgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBsYWcgZm9ybWF0LiAgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCA0Mz1tbz8sIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYWcgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYWdGb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcmVkZWNlc3NvckxpbmtfTGFnRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTGFnRm9ybWF0VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGFnRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRMYWdGb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldExhZ0Zvcm1hdCA8ZW0+TGFnIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGFnIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGFnRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYWdGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLX0gLy8gUHJlZGVjZXNzb3JMaW5rCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUHJvamVjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Byb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTg2MThhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYyMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2plY3QuamF2YSx2IDEuMiAyMDA2LzA0LzExIDE1OjI5OjU1IGp0aGFyaW8gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvamVjdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0VGl0bGUgPGVtPlRpdGxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0U3ViamVjdCA8ZW0+U3ViamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhdGVnb3J5IDxlbT5DYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENvbXBhbnkgPGVtPkNvbXBhbnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRNYW5hZ2VyIDxlbT5NYW5hZ2VyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0QXV0aG9yIDxlbT5BdXRob3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDcmVhdGlvbkRhdGUgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXZpc2lvbiA8ZW0+UmV2aXNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRMYXN0U2F2ZWQgPGVtPkxhc3QgU2F2ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NjaGVkdWxlRnJvbVN0YXJ0IDxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0U3RhcnREYXRlIDxlbT5TdGFydCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RmluaXNoRGF0ZSA8ZW0+RmluaXNoIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRGWVN0YXJ0RGF0ZSA8ZW0+RlkgU3RhcnQgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENyaXRpY2FsU2xhY2tMaW1pdCA8ZW0+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeURpZ2l0cyA8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lTeW1ib2wgPGVtPkN1cnJlbmN5IFN5bWJvbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24gPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhbGVuZGFyVUlEIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0U3RhcnRUaW1lIDxlbT5EZWZhdWx0IFN0YXJ0IFRpbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0RmluaXNoVGltZSA8ZW0+RGVmYXVsdCBGaW5pc2ggVGltZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1pbnV0ZXNQZXJEYXkgPGVtPk1pbnV0ZXMgUGVyIERheTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1pbnV0ZXNQZXJXZWVrIDxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGF5c1Blck1vbnRoIDxlbT5EYXlzIFBlciBNb250aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrVHlwZSA8ZW0+RGVmYXVsdCBUYXNrIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCA8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0U3RhbmRhcmRSYXRlIDxlbT5EZWZhdWx0IFN0YW5kYXJkIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlIDxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V29ya0Zvcm1hdCA8ZW0+V29yayBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0VkaXRhYmxlQWN0dWFsQ29zdHMgPGVtPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzSG9ub3JDb25zdHJhaW50cyA8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFYXJuZWRWYWx1ZU1ldGhvZCA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5IDxlbT5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc011bHRpcGxlQ3JpdGljYWxQYXRocyA8ZW0+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuIDxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTmV3VGFza3NFc3RpbWF0ZWQgPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcyA8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRBY3R1YWxDb3N0IDxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSA8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1Rhc2tVcGRhdGVzUmVzb3VyY2UgPGVtPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRmlzY2FsWWVhclN0YXJ0IDxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFdlZWtTdGFydERheSA8ZW0+V2VlayBTdGFydCBEYXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVDb21wbGV0ZWRFbmRzQmFjayA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayA8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlIDxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0U3RhdHVzRGF0ZSA8ZW0+U3RhdHVzIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW50RGF0ZSA8ZW0+Q3VycmVudCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIDxlbT5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvbGluayA8ZW0+QXV0b2xpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROZXdUYXNrU3RhcnREYXRlIDxlbT5OZXcgVGFzayBTdGFydCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCA8ZW0+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSA8ZW0+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWN0dWFsc0luU3luYyA8ZW0+QWN0dWFscyBJbiBTeW5jPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNSZW1vdmVGaWxlUHJvcGVydGllcyA8ZW0+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWRtaW5Qcm9qZWN0IDxlbT5BZG1pbiBQcm9qZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0T3V0bGluZUNvZGVzIDxlbT5PdXRsaW5lIENvZGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V0JTTWFza3MgPGVtPldCUyBNYXNrczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEV4dGVuZGVkQXR0cmlidXRlcyA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhbGVuZGFycyA8ZW0+Q2FsZW5kYXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0VGFza3MgPGVtPlRhc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0UmVzb3VyY2VzIDxlbT5SZXNvdXJjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRBc3NpZ25tZW50cyA8ZW0+QXNzaWdubWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQcm9qZWN0Xy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2plY3QgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlVJRFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1VJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRVSUQgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG5hbWUgb2YgdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTmFtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk5hbWVUeXBlMyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTmFtZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGl0bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0aXRsZSBvZiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGl0bGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRpdGxlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1RpdGxlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGl0bGVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUaXRsZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUaXRsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFRpdGxlIDxlbT5UaXRsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGl0bGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRpdGxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUaXRsZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHN1YmplY3Qgb2YgdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YmplY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN1YmplY3QoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfU3ViamVjdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlN1YmplY3RUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdWJqZWN0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFN1YmplY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdWJqZWN0IDxlbT5TdWJqZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdWJqZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdWJqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdWJqZWN0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNhdGVnb3J5IG9mIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2F0ZWdvcnkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQ2F0ZWdvcnkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYXRlZ29yeVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhdGVnb3J5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2F0ZWdvcnkgPGVtPkNhdGVnb3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhdGVnb3J5KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21wYW55PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29tcGFueSB0aGF0IG93bnMgdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbXBhbnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbXBhbnkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQ29tcGFueSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNvbXBhbnlUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb21wYW55JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvbXBhbnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDb21wYW55IDxlbT5Db21wYW55PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21wYW55PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb21wYW55KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb21wYW55KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYW5hZ2VyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbWFuYWdlciBvZiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFuYWdlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFuYWdlcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9NYW5hZ2VyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFuYWdlclR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01hbmFnZXInIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWFuYWdlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1hbmFnZXIgPGVtPk1hbmFnZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hbmFnZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hbmFnZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1hbmFnZXIoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF1dGhvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGF1dGhvciBvZiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdXRob3IoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQXV0aG9yKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXV0aG9yVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXV0aG9yJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEF1dGhvcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEF1dGhvciA8ZW0+QXV0aG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRob3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF1dGhvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXV0aG9yKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DcmVhdGlvbiBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGF0IHRoZSBwcm9qZWN0IHdhcyBjcmVhdGVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDcmVhdGlvbkRhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQ3JlYXRpb25EYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ3JlYXRpb25EYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldENyZWF0aW9uRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3JlYXRpb25EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDcmVhdGlvbkRhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJldmlzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIGEgcHJvamVjdCBoYXMgYmVlbiBzYXZlZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmV2aXNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJldmlzaW9uKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9SZXZpc2lvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmV2aXNpb24nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFJldmlzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0UmV2aXNpb24gPGVtPlJldmlzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXZpc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmV2aXNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJldmlzaW9uKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGFzdCBTYXZlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhhdCB0aGUgcHJvamVjdCB3YXMgbGFzdCBzYXZlZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGFzdCBTYXZlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGFzdFNhdmVkKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0xhc3RTYXZlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xhc3RTYXZlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRMYXN0U2F2ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRMYXN0U2F2ZWQgPGVtPkxhc3QgU2F2ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhc3QgU2F2ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhc3RTYXZlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGFzdFNhdmVkKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHByb2plY3QgaXMgc2NoZHVsZWQgZnJvbSB0aGUgc3RhcnQgZGF0ZSBvciBmaW5pc2ggZGF0ZS4KLQkgKiAJCQkJCQkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZWR1bGUgRnJvbSBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTY2hlZHVsZUZyb21TdGFydCgpCi0JICogQHNlZSAjdW5zZXRTY2hlZHVsZUZyb21TdGFydCgpCi0JICogQHNlZSAjc2V0U2NoZWR1bGVGcm9tU3RhcnQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1NjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTY2hlZHVsZUZyb21TdGFydCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTY2hlZHVsZUZyb21TdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU2NoZWR1bGVGcm9tU3RhcnQgPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U2NoZWR1bGVGcm9tU3RhcnQoKQotCSAqIEBzZWUgI3Vuc2V0U2NoZWR1bGVGcm9tU3RhcnQoKQotCSAqIEBzZWUgI2lzU2NoZWR1bGVGcm9tU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNjaGVkdWxlRnJvbVN0YXJ0KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTY2hlZHVsZUZyb21TdGFydCA8ZW0+U2NoZWR1bGUgRnJvbSBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRTY2hlZHVsZUZyb21TdGFydCgpCi0JICogQHNlZSAjaXNTY2hlZHVsZUZyb21TdGFydCgpCi0JICogQHNlZSAjc2V0U2NoZWR1bGVGcm9tU3RhcnQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFNjaGVkdWxlRnJvbVN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NjaGVkdWxlRnJvbVN0YXJ0IDxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTY2hlZHVsZUZyb21TdGFydCgpCi0JICogQHNlZSAjaXNTY2hlZHVsZUZyb21TdGFydCgpCi0JICogQHNlZSAjc2V0U2NoZWR1bGVGcm9tU3RhcnQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFNjaGVkdWxlRnJvbVN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgcHJvamVjdC4gUmVxdWlyZWQgaWYgU2NoZWR1bGVGcm9tU3RhcnQgaXMgdHJ1ZS4KLQkgKiAJCQkJCQkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnREYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1N0YXJ0RGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXJ0RGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRTdGFydERhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdGFydERhdGUgPGVtPlN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnREYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2ggRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZpbmlzaCBkYXRlIG9mIHRoZSBwcm9qZWN0LiBSZXF1aXJlZCBpZiBTY2hlZHVsZUZyb21TdGFydCBpcyBmYWxzZS4KLQkgKiAJCQkJCQkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaERhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRmluaXNoRGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpbmlzaERhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RmluaXNoRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoRGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RlkgU3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRmlzY2FsIFllYXIgc3RhcnRpbmcgbW9udGguIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTE9SmFudWFyeSwgMj1GZWJydWFyeSwgMz1NYXJjaCwgND1BcHJpbCwgNT1NYXksIDY9SnVuZSwgNz1KdWx5LCAKLQkgKiAJCQkJCQk4PUF1Z3VzdCwgOT1TZXB0ZW1iZXIsIDEwPU9jdG9iZXIsIDExPU5vdmVtYmVyLCAxMj1EZWNlbWJlciAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RlkgU3RhcnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RllTdGFydERhdGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0ZZU3RhcnREYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRllTdGFydERhdGVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGWVN0YXJ0RGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RllTdGFydERhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRGWVN0YXJ0RGF0ZSA8ZW0+RlkgU3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RlkgU3RhcnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RllTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZZU3RhcnREYXRlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBudW1iZXIgb2YgZGF5cyBwYXN0IGl0cyBlbmQgZGF0ZSB0aGF0IGEgdGFzayBjYW4gZ28gCi0JICogCQkJCQkJYmVmb3JlIE1pY3Jvc29mdCBQcm9qZWN0IG1hcmtzIHRoYXQgdGFzayBhcyBhIGNyaXRpY2FsIHRhc2suCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyaXRpY2FsIFNsYWNrIExpbWl0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDcml0aWNhbFNsYWNrTGltaXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0NyaXRpY2FsU2xhY2tMaW1pdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ3JpdGljYWxTbGFja0xpbWl0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRDcml0aWNhbFNsYWNrTGltaXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDcml0aWNhbFNsYWNrTGltaXQgPGVtPkNyaXRpY2FsIFNsYWNrIExpbWl0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Dcml0aWNhbCBTbGFjayBMaW1pdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3JpdGljYWxTbGFja0xpbWl0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDcml0aWNhbFNsYWNrTGltaXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DdXJyZW5jeSBEaWdpdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHN5bWJvbC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDdXJyZW5jeURpZ2l0cyhCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQ3VycmVuY3lEaWdpdHMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0N1cnJlbmN5RGlnaXRzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRDdXJyZW5jeURpZ2l0cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbmN5RGlnaXRzIDxlbT5DdXJyZW5jeSBEaWdpdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkN1cnJlbmN5IERpZ2l0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3VycmVuY3lEaWdpdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEN1cnJlbmN5RGlnaXRzKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3VycmVuY3kgU3ltYm9sPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY3VycmVuY3kgc3ltYm9sIHVzZWQgaW4gdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkN1cnJlbmN5IFN5bWJvbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3VycmVuY3lTeW1ib2woU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQ3VycmVuY3lTeW1ib2woKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DdXJyZW5jeVN5bWJvbFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0N1cnJlbmN5U3ltYm9sJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEN1cnJlbmN5U3ltYm9sKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lTeW1ib2wgPGVtPkN1cnJlbmN5IFN5bWJvbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDdXJyZW5jeVN5bWJvbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3VycmVuY3lTeW1ib2woU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW5jeSBzeW1ib2wuICBWYWx1ZXMgYXJlOiAKLQkgKiAJCQkJCQkwPUJlZm9yZSwgMT1BZnRlciwgMj1CZWZvcmUgV2l0aCBTcGFjZSwgMz1BZnRlciB3aXRoIHNwYWNlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0N1cnJlbmN5U3ltYm9sUG9zaXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ3VycmVuY3lTeW1ib2xQb3NpdGlvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24gPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FsZW5kYXIgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcHJvamVjdCBjYWxlbmRhci4gIFJlZmVycyB0byBhIHZhbGlkIFVJRCBpbiB0aGUgCi0JICogCQkJCQkJQ2FsZW5kYXJzIGVsZW1lbnQgb2YgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBTY2hlbWEuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhbGVuZGFyIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FsZW5kYXJVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0NhbGVuZGFyVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDYWxlbmRhclVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0Q2FsZW5kYXJVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxlbmRhciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhbGVuZGFyVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYWxlbmRhclVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgU3RhcnQgVGltZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgc3RhcnQgdGltZSBvZiBuZXcgdGFza3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgU3RhcnQgVGltZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVmYXVsdFN0YXJ0VGltZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9EZWZhdWx0U3RhcnRUaW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5UaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWZhdWx0U3RhcnRUaW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldERlZmF1bHRTdGFydFRpbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0U3RhcnRUaW1lIDxlbT5EZWZhdWx0IFN0YXJ0IFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgU3RhcnQgVGltZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdFN0YXJ0VGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdFN0YXJ0VGltZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBGaW5pc2ggVGltZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgZmluaXNoIHRpbWUgb2YgbmV3IHRhc2tzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IEZpbmlzaCBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0RmluaXNoVGltZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9EZWZhdWx0RmluaXNoVGltZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVmYXVsdEZpbmlzaFRpbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0RmluaXNoVGltZSA8ZW0+RGVmYXVsdCBGaW5pc2ggVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBGaW5pc2ggVGltZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRGaW5pc2hUaW1lKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaW51dGVzIFBlciBEYXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBudW1iZXIgb2YgbWludXRlcyBwZXIgZGF5LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaW51dGVzIFBlciBEYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1pbnV0ZXNQZXJEYXkoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X01pbnV0ZXNQZXJEYXkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01pbnV0ZXNQZXJEYXknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldE1pbnV0ZXNQZXJEYXkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRNaW51dGVzUGVyRGF5IDxlbT5NaW51dGVzIFBlciBEYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1pbnV0ZXMgUGVyIERheTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWludXRlc1BlckRheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWludXRlc1BlckRheShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1pbnV0ZXMgUGVyIFdlZWs8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBudW1iZXIgb2YgbWludXRlcyBwZXIgd2Vlay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWludXRlcyBQZXIgV2VlazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWludXRlc1BlcldlZWsoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X01pbnV0ZXNQZXJXZWVrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNaW51dGVzUGVyV2VlaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TWludXRlc1BlcldlZWsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRNaW51dGVzUGVyV2VlayA8ZW0+TWludXRlcyBQZXIgV2VlazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWludXRlcyBQZXIgV2VlazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWludXRlc1BlcldlZWsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1pbnV0ZXNQZXJXZWVrKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGF5cyBQZXIgTW9udGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBudW1iZXIgb2YgZGF5cyBwZXIgbW9udGguCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRheXMgUGVyIE1vbnRoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREYXlzUGVyTW9udGgoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0RheXNQZXJNb250aCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGF5c1Blck1vbnRoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREYXlzUGVyTW9udGgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREYXlzUGVyTW9udGggPGVtPkRheXMgUGVyIE1vbnRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EYXlzIFBlciBNb250aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGF5c1Blck1vbnRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREYXlzUGVyTW9udGgoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IFRhc2sgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIxIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCB0eXBlIG9mIG5ldyB0YXNrcy4gVmFsdWVzIGFyZTogCi0JICogCQkJCQkJMD1GaXhlZCBVbml0cywgMT1GaXhlZCBEdXJhdGlvbiwgMj1GaXhlZCBXb3JrLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI3Vuc2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAc2VlICNzZXREZWZhdWx0VGFza1R5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0RlZmF1bHRUYXNrVHlwZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IjEiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRlZmF1bHRUYXNrVHlwZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlZmF1bHRUYXNrVHlwZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RGVmYXVsdFRhc2tUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFRhc2tUeXBlIDxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBUYXNrIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAc2VlICN1bnNldERlZmF1bHRUYXNrVHlwZSgpCi0JICogQHNlZSAjZ2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0VGFza1R5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0VGFza1R5cGUgPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldERlZmF1bHRUYXNrVHlwZSgpCi0JICogQHNlZSAjZ2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAc2VlICNzZXREZWZhdWx0VGFza1R5cGUoQmlnSW50ZWdlcikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldERlZmF1bHRUYXNrVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFRhc2tUeXBlIDxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBUYXNrIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldERlZmF1bHRUYXNrVHlwZSgpCi0JICogQHNlZSAjZ2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAc2VlICNzZXREZWZhdWx0VGFza1R5cGUoQmlnSW50ZWdlcikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldERlZmF1bHRUYXNrVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IGZyb20gd2hlcmUgZml4ZWQgY29zdHMgYXJlIGFjY3J1ZWQuICBWYWx1ZXMgYXJlOiAKLQkgKiAJCQkJCQkxPVN0YXJ0LCAyPVByb3JhdGVkLCAzPUVuZAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0RlZmF1bHRGaXhlZENvc3RBY2NydWFsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCA8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IFN0YW5kYXJkIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IHN0YW5kYXJkIHJhdGUgZm9yIG5ldyByZXNvdXJjZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkKLQkgKiBAc2VlICN1bnNldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI3NldERlZmF1bHRTdGFuZGFyZFJhdGUoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9EZWZhdWx0U3RhbmRhcmRSYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVmYXVsdFN0YW5kYXJkUmF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldERlZmF1bHRTdGFuZGFyZFJhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0U3RhbmRhcmRSYXRlIDxlbT5EZWZhdWx0IFN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkKLQkgKiBAc2VlICN1bnNldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI2dldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRTdGFuZGFyZFJhdGUoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSA8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI2dldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI3NldERlZmF1bHRTdGFuZGFyZFJhdGUoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXREZWZhdWx0U3RhbmRhcmRSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0U3RhbmRhcmRSYXRlIDxlbT5EZWZhdWx0IFN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldERlZmF1bHRTdGFuZGFyZFJhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgb3ZlcnRpbWUgcmF0ZSBmb3IgbmV3IHJlc291cmNlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI3Vuc2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpCi0JICogQHNlZSAjc2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZShmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0RlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWZhdWx0T3ZlcnRpbWVSYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRPdmVydGltZVJhdGUgPGVtPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI3Vuc2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpCi0JICogQHNlZSAjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZShmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlIDxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpCi0JICogQHNlZSAjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpCi0JICogQHNlZSAjc2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldERlZmF1bHRPdmVydGltZVJhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRPdmVydGltZVJhdGUgPGVtPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNzZXREZWZhdWx0T3ZlcnRpbWVSYXRlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RHVyYXRpb24gRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBidWxrIGR1cmF0aW9uLiAgVmFsdWVzIGFyZTogCi0JICogCQkJCQkJMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgMjA9ZSUsIDIxPW51bGwsIAotCSAqIAkJCQkJCTM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgCi0JICogCQkJCQkJNTM9bnVsbC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRHVyYXRpb25Gb3JtYXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EdXJhdGlvbkZvcm1hdFR5cGU1IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEdXJhdGlvbkZvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCB3b3JrIHVuaXQgZm9ybWF0LiBWYWx1ZXMgYXJlOiAKLQkgKiAJCQkJCQkxPW0sIDI9aCwgMz1kLCA0PXcsIDU9bW8KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdvcmtGb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1dvcmtGb3JtYXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JrRm9ybWF0VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV29ya0Zvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0V29ya0Zvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFdvcmtGb3JtYXQgPGVtPldvcmsgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V29ya0Zvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29ya0Zvcm1hdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBvciBub3QgYWN0dWFsIGNvc3RzIGFyZSBlZGl0YWJsZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVkaXRhYmxlQWN0dWFsQ29zdHMoKQotCSAqIEBzZWUgI3Vuc2V0RWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQHNlZSAjc2V0RWRpdGFibGVBY3R1YWxDb3N0cyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VkaXRhYmxlQWN0dWFsQ29zdHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRWRpdGFibGVBY3R1YWxDb3N0cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRWRpdGFibGVBY3R1YWxDb3N0cyA8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQHNlZSAjdW5zZXRFZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAc2VlICNpc0VkaXRhYmxlQWN0dWFsQ29zdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVkaXRhYmxlQWN0dWFsQ29zdHMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0VkaXRhYmxlQWN0dWFsQ29zdHMgPGVtPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRFZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAc2VlICNpc0VkaXRhYmxlQWN0dWFsQ29zdHMoKQotCSAqIEBzZWUgI3NldEVkaXRhYmxlQWN0dWFsQ29zdHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEVkaXRhYmxlQWN0dWFsQ29zdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRWRpdGFibGVBY3R1YWxDb3N0cyA8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEVkaXRhYmxlQWN0dWFsQ29zdHMoKQotCSAqIEBzZWUgI2lzRWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQHNlZSAjc2V0RWRpdGFibGVBY3R1YWxDb3N0cyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RWRpdGFibGVBY3R1YWxDb3N0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SG9ub3IgQ29uc3RyYWludHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0YXNrcyBob25vdXIgdGhlaXIgY29uc3RyYWludCBkYXRlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SG9ub3JDb25zdHJhaW50cygpCi0JICogQHNlZSAjdW5zZXRIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICNzZXRIb25vckNvbnN0cmFpbnRzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9Ib25vckNvbnN0cmFpbnRzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIb25vckNvbnN0cmFpbnRzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0hvbm9yQ29uc3RyYWludHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0hvbm9yQ29uc3RyYWludHMgPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICN1bnNldEhvbm9yQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI2lzSG9ub3JDb25zdHJhaW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SG9ub3JDb25zdHJhaW50cyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzSG9ub3JDb25zdHJhaW50cyA8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SG9ub3JDb25zdHJhaW50cygpCi0JICogQHNlZSAjaXNIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICNzZXRIb25vckNvbnN0cmFpbnRzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRIb25vckNvbnN0cmFpbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0hvbm9yQ29uc3RyYWludHMgPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SG9ub3JDb25zdHJhaW50cygpCi0JICogQHNlZSAjaXNIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICNzZXRIb25vckNvbnN0cmFpbnRzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRIb25vckNvbnN0cmFpbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FYXJuZWQgVmFsdWUgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBtZXRob2QgZm9yIGNhbGN1bGF0aW5nIGVhcm5lZCB2YWx1ZS4gVmFsdWVzIGFyZTogCi0JICogCQkJCQkJMD1QZXJjZW50IENvbXBsZXRlLCAxPVBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGUKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RWFybmVkVmFsdWVNZXRob2QoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0Vhcm5lZFZhbHVlTWV0aG9kKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRWFybmVkVmFsdWVNZXRob2RUeXBlMSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRWFybmVkVmFsdWVNZXRob2QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEVhcm5lZFZhbHVlTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RWFybmVkVmFsdWVNZXRob2QgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVhcm5lZFZhbHVlTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFYXJuZWRWYWx1ZU1ldGhvZChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRvIGNhbGN1bGF0ZSBzdWJ0YXNrcyBhcyBzdW1tYXJ5IHRhc2tzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAc2VlICN1bnNldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQHNlZSAjc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9JbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSA8ZW0+SW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAc2VlICN1bnNldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQHNlZSAjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5IDxlbT5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAc2VlICNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQHNlZSAjc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5IDxlbT5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAc2VlICNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQHNlZSAjc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIG11bHRpcGxlIGNyaXRpY2FsIHBhdGhzIGFyZSBjYWxjdWxhdGVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBzZWUgI3Vuc2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAc2VlICNzZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X011bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J011bHRpcGxlQ3JpdGljYWxQYXRocycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc011bHRpcGxlQ3JpdGljYWxQYXRocyA8ZW0+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE11bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQHNlZSAjdW5zZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBzZWUgI2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc011bHRpcGxlQ3JpdGljYWxQYXRocyA8ZW0+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAc2VlICNpc011bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQHNlZSAjc2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE11bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQHNlZSAjaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBzZWUgI3NldE11bHRpcGxlQ3JpdGljYWxQYXRocyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIG5ldyB0YXNrcyBhcmUgZWZmb3J0IGRyaXZlbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TmV3VGFza3NFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI3Vuc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI3NldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9OZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTmV3VGFza3NFZmZvcnREcml2ZW4nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTmV3VGFza3NFZmZvcnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuIDxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TmV3VGFza3NFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI3Vuc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI2lzTmV3VGFza3NFZmZvcnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNOZXdUYXNrc0VmZm9ydERyaXZlbiA8ZW0+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TmV3VGFza3NFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI2lzTmV3VGFza3NFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI3NldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXROZXdUYXNrc0VmZm9ydERyaXZlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNOZXdUYXNrc0VmZm9ydERyaXZlbiA8ZW0+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXROZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjaXNOZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OZXcgVGFza3MgRXN0aW1hdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdG8gc2hvdyB0aGUgZXN0aW1hdGVkIGR1cmF0aW9uIGJ5IGRlZmF1bHQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0TmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI3NldE5ld1Rhc2tzRXN0aW1hdGVkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9OZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTmV3VGFza3NFc3RpbWF0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTmV3VGFza3NFc3RpbWF0ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRXN0aW1hdGVkIDxlbT5OZXcgVGFza3MgRXN0aW1hdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OZXcgVGFza3MgRXN0aW1hdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE5ld1Rhc2tzRXN0aW1hdGVkKCkKLQkgKiBAc2VlICN1bnNldE5ld1Rhc2tzRXN0aW1hdGVkKCkKLQkgKiBAc2VlICNpc05ld1Rhc2tzRXN0aW1hdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROZXdUYXNrc0VzdGltYXRlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTmV3VGFza3NFc3RpbWF0ZWQgPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI2lzTmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI3NldE5ld1Rhc2tzRXN0aW1hdGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXROZXdUYXNrc0VzdGltYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNOZXdUYXNrc0VzdGltYXRlZCA8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI2lzTmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI3NldE5ld1Rhc2tzRXN0aW1hdGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXROZXdUYXNrc0VzdGltYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgaW4tcHJvZ3Jlc3MgdGFza3MgY2FuIGJlIHNwbGl0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICN1bnNldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcygpCi0JICogQHNlZSAjc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9TcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NwbGl0c0luUHJvZ3Jlc3NUYXNrcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTcGxpdHNJblByb2dyZXNzVGFza3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcyA8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICN1bnNldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcygpCi0JICogQHNlZSAjaXNTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIDxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpCi0JICogQHNlZSAjc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIDxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpCi0JICogQHNlZSAjc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNwcmVhZCBBY3R1YWwgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIGFjdHVhbCBjb3N0cyBhcmUgc3ByZWFkIHRvIHRoZSBzdGF0dXMgZGF0ZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ByZWFkIEFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNwcmVhZEFjdHVhbENvc3QoKQotCSAqIEBzZWUgI3Vuc2V0U3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQHNlZSAjc2V0U3ByZWFkQWN0dWFsQ29zdChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfU3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3ByZWFkQWN0dWFsQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTcHJlYWRBY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRBY3R1YWxDb3N0IDxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNwcmVhZCBBY3R1YWwgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICN1bnNldFNwcmVhZEFjdHVhbENvc3QoKQotCSAqIEBzZWUgI2lzU3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3ByZWFkQWN0dWFsQ29zdChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3ByZWFkQWN0dWFsQ29zdCA8ZW0+U3ByZWFkIEFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFNwcmVhZEFjdHVhbENvc3QoKQotCSAqIEBzZWUgI2lzU3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQHNlZSAjc2V0U3ByZWFkQWN0dWFsQ29zdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U3ByZWFkQWN0dWFsQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRBY3R1YWxDb3N0IDxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNwcmVhZCBBY3R1YWwgQ29zdDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0U3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQHNlZSAjaXNTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNzZXRTcHJlYWRBY3R1YWxDb3N0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRTcHJlYWRBY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBwZXJjZW50IGNvbXBsZXRlIGlzIHNwcmVhZCB0byB0aGUgc3RhdHVzIGRhdGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQHNlZSAjdW5zZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBzZWUgI3NldFNwcmVhZFBlcmNlbnRDb21wbGV0ZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfU3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3ByZWFkUGVyY2VudENvbXBsZXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3ByZWFkUGVyY2VudENvbXBsZXRlIDxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICN1bnNldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQHNlZSAjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNwcmVhZFBlcmNlbnRDb21wbGV0ZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3ByZWFkUGVyY2VudENvbXBsZXRlIDxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBzZWUgI2lzU3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICNzZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUgPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQHNlZSAjc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB1cGRhdGVzIHRvIHRhc2tzIHVwZGF0ZSByZXNvdXJjZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRUYXNrVXBkYXRlc1Jlc291cmNlKCkKLQkgKiBAc2VlICN1bnNldFRhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBzZWUgI3NldFRhc2tVcGRhdGVzUmVzb3VyY2UoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1Rhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Rhc2tVcGRhdGVzUmVzb3VyY2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzVGFza1VwZGF0ZXNSZXNvdXJjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzVGFza1VwZGF0ZXNSZXNvdXJjZSA8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQHNlZSAjdW5zZXRUYXNrVXBkYXRlc1Jlc291cmNlKCkKLQkgKiBAc2VlICNpc1Rhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhc2tVcGRhdGVzUmVzb3VyY2UoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1Rhc2tVcGRhdGVzUmVzb3VyY2UgPGVtPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRUYXNrVXBkYXRlc1Jlc291cmNlKCkKLQkgKiBAc2VlICNpc1Rhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBzZWUgI3NldFRhc2tVcGRhdGVzUmVzb3VyY2UoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFRhc2tVcGRhdGVzUmVzb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzVGFza1VwZGF0ZXNSZXNvdXJjZSA8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFRhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBzZWUgI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQHNlZSAjc2V0VGFza1VwZGF0ZXNSZXNvdXJjZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmlzY2FsIFllYXIgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBmaXNjYWwgeWVhciBudW1iZXJpbmcKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmlzY2FsIFllYXIgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICN1bnNldEZpc2NhbFllYXJTdGFydCgpCi0JICogQHNlZSAjc2V0RmlzY2FsWWVhclN0YXJ0KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9GaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Zpc2NhbFllYXJTdGFydCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNGaXNjYWxZZWFyU3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0Zpc2NhbFllYXJTdGFydCA8ZW0+RmlzY2FsIFllYXIgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEZpc2NhbFllYXJTdGFydCgpCi0JICogQHNlZSAjdW5zZXRGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBzZWUgI2lzRmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaXNjYWxZZWFyU3RhcnQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0Zpc2NhbFllYXJTdGFydCA8ZW0+RmlzY2FsIFllYXIgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICNpc0Zpc2NhbFllYXJTdGFydCgpCi0JICogQHNlZSAjc2V0RmlzY2FsWWVhclN0YXJ0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRGaXNjYWxZZWFyU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRmlzY2FsWWVhclN0YXJ0IDxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmlzY2FsIFllYXIgU3RhcnQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEZpc2NhbFllYXJTdGFydCgpCi0JICogQHNlZSAjaXNGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBzZWUgI3NldEZpc2NhbFllYXJTdGFydChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RmlzY2FsWWVhclN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XZWVrIFN0YXJ0IERheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3RhcnQgZGF5IG9mIHRoZSB3ZWVrLiBWYWx1ZXMgYXJlOiAKLQkgKiAJCQkJCQkwPVN1bmRheSwgMT1Nb25kYXksIDI9VHVlc2RheSwgMz1XZWRuZXNkYXksIDQ9VGh1cnNkYXksIDU9RnJpZGF5LCA2PVNhdHVyZGF5Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldlZWsgU3RhcnQgRGF5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXZWVrU3RhcnREYXkoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1dlZWtTdGFydERheSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtTdGFydERheVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dlZWtTdGFydERheScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0V2Vla1N0YXJ0RGF5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V2Vla1N0YXJ0RGF5IDxlbT5XZWVrIFN0YXJ0IERheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V2VlayBTdGFydCBEYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdlZWtTdGFydERheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V2Vla1N0YXJ0RGF5KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAJCQkJCQkJU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVuZCBvZiBjb21wbGV0ZWQgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGJlZ2luIGFmdGVyIHRoZSAKLQkgKiAJCQkJCQkJc3RhdHVzIGRhdGUgYnV0IGJlZ3VuIGVhcmx5IHNob3VsZCBiZSBtb3ZlZCBiYWNrIHRvIHRoZSBzdGF0dXMgZGF0ZS4KLQkgKiAJCQkJCQkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQHNlZSAjdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBzZWUgI3NldE1vdmVDb21wbGV0ZWRFbmRzQmFjayhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTW92ZUNvbXBsZXRlZEVuZHNCYWNrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01vdmVDb21wbGV0ZWRFbmRzQmFjaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgQmFjazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBzZWUgI3Vuc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkKLQkgKiBAc2VlICNpc01vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2sgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgQmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBzZWUgI2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkKLQkgKiBAc2VlICNzZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2sgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgQmFjazwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBzZWUgI2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkKLQkgKiBAc2VlICNzZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAkJCQkJCQlTcGVjaWZpZXMgd2hldGhlciB0aGUgYmVnaW5uaW5nIG9mIHJlbWFpbmluZyBwb3J0aW9ucyBvZiB0YXNrcyBzY2hlZHVsZWQgdG8gYmVnaW4gYWZ0ZXIgdGhlIAotCSAqIAkJCQkJCQlzdGF0dXMgZGF0ZSBidXQgYmVndW4gZWFybHkgc2hvdWxkIGJlIG1vdmVkIGJhY2sgdG8gdGhlIHN0YXR1cyBkYXRlLgotCSAqIAkJCQkJCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQHNlZSAjdW5zZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQHNlZSAjc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2snIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKQotCSAqIEBzZWUgI3Vuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKQotCSAqIEBzZWUgI2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayA8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKQotCSAqIEBzZWUgI2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKQotCSAqIEBzZWUgI3NldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayA8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQHNlZSAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQHNlZSAjc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCQkJCQkJCVNwZWNpZmllcyB3aGV0aGVyIHRoZSBiZWdpbm5pbmcgb2YgcmVtYWluaW5nIHBvcnRpb25zIG9mIHRhc2tzIHNjaGVkdWxlZCB0byBoYXZlIGJlZ3VuIGxhdGUgCi0JICogCQkJCQkJCXNob3VsZCBiZSBtb3ZlZCB1cCB0byB0aGUgc3RhdHVzIGRhdGUuCi0JICogCQkJCQkJCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAc2VlICN1bnNldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAc2VlICNzZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpCi0JICogQHNlZSAjdW5zZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpCi0JICogQHNlZSAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpCi0JICogQHNlZSAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpCi0JICogQHNlZSAjc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEZvcndhcmQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAc2VlICNzZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCQkJCQkJCVNwZWNpZmllcyB3aGV0aGVyIHRoZSBlbmQgb2YgY29tcGxldGVkIHBvcnRpb25zIG9mIHRhc2tzIHNjaGVkdWxlZCB0byBoYXZlIGJlZW4gY29tcGxldGVkIAotCSAqIAkJCQkJCQliZWZvcmUgdGhlIHN0YXR1cyBkYXRlIGJ1dCBiZWd1biBsYXRlIHNob3VsZCBiZSBtb3ZlZCB1cCB0byB0aGUgc3RhdHVzIGRhdGUuCi0JICogCQkJCQkJCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBzZWUgI3Vuc2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAc2VlICNzZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAc2VlICN1bnNldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQHNlZSAjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAc2VlICNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQHNlZSAjc2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAc2VlICNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQHNlZSAjc2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzcGVjaWZpYyBiYXNlbGluZSB1c2VkIHRvIGNhbGN1bGF0ZSBWYXJpYW5jZSB2YWx1ZXMuICBWYWx1ZXMgYXJlOiAKLQkgKiAJCQkJCQkwPUJhc2VsaW5lLCAxPUJhc2VsaW5lIDEsIDI9QmFzZWxpbmUgMiwgMz1CYXNlbGluZSAzLCA0PUJhc2VsaW5lIDQsIDU9QmFzZWxpbmUgNSwgNj1CYXNlbGluZSA2LCAKLQkgKiAJCQkJCQk3PUJhc2VsaW5lIDcsIDg9QmFzZWxpbmUgOCwgOT1CYXNlbGluZSA5LCAxMD1CYXNlbGluZSAxMAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9CYXNlbGluZUZvckVhcm5lZFZhbHVlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Jhc2VsaW5lRm9yRWFybmVkVmFsdWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlIDxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IGFkZCBuZXcgcmVzb3VyY2VzIHRvIHRoZSByZXNvdXJjZSBwb29sLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI3Vuc2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAc2VlICNzZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzIDxlbT5BdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAc2VlICN1bnNldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpCi0JICogQHNlZSAjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzIDxlbT5BdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI2lzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAc2VlICNzZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAc2VlICNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpCi0JICogQHNlZSAjc2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YXR1cyBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEYXRlIHVzZWQgZm9yIGNhbGN1bGF0aW9uIGFuZCByZXBvcnRpbmcuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0YXR1cyBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGF0dXNEYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1N0YXR1c0RhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGF0dXNEYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0YXR1c0RhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdGF0dXNEYXRlIDxlbT5TdGF0dXMgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhdHVzIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXR1c0RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXR1c0RhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkN1cnJlbnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHN5c3RlbSBkYXRlIHRoYXQgdGhlIFhNTCB3YXMgZ2VuZXJhdGVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DdXJyZW50IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEN1cnJlbnREYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0N1cnJlbnREYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ3VycmVudERhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0Q3VycmVudERhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW50RGF0ZSA8ZW0+Q3VycmVudCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DdXJyZW50IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEN1cnJlbnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDdXJyZW50RGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgcHJvamVjdCB3YXMgY3JlYXRlZCBieSBhIFByb2plY3QgU2VydmVyIHVzZXIgYXMgb3Bwb3NlZCB0byBhbiBOVCB1c2VyLgotCSAqIAkJCQkJCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKQotCSAqIEBzZWUgI3Vuc2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQHNlZSAjc2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIDxlbT5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKQotCSAqIEBzZWUgI3Vuc2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQHNlZSAjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIDxlbT5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKQotCSAqIEBzZWUgI2lzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQHNlZSAjc2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIDxlbT5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAc2VlICNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKQotCSAqIEBzZWUgI3NldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF1dG9saW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRvIGF1dG9saW5rIGluc2VydGVkIG9yIG1vdmVkIHRhc2tzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRvbGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBdXRvbGluaygpCi0JICogQHNlZSAjdW5zZXRBdXRvbGluaygpCi0JICogQHNlZSAjc2V0QXV0b2xpbmsoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0F1dG9saW5rKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdXRvbGluaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNBdXRvbGluaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQXV0b2xpbmsgPGVtPkF1dG9saW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRvbGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBdXRvbGluaygpCi0JICogQHNlZSAjdW5zZXRBdXRvbGluaygpCi0JICogQHNlZSAjaXNBdXRvbGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXV0b2xpbmsoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9saW5rIDxlbT5BdXRvbGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBdXRvbGluaygpCi0JICogQHNlZSAjaXNBdXRvbGluaygpCi0JICogQHNlZSAjc2V0QXV0b2xpbmsoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEF1dG9saW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9saW5rIDxlbT5BdXRvbGluazwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXV0b2xpbms8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEF1dG9saW5rKCkKLQkgKiBAc2VlICNpc0F1dG9saW5rKCkKLQkgKiBAc2VlICNzZXRBdXRvbGluayhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QXV0b2xpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IGRhdGUgZm9yIG5ldyB0YXNrcyBzdGFydC4gIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTA9UHJvamVjdCBTdGFydCBEYXRlLCAxPUN1cnJlbnQgRGF0ZQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OZXcgVGFzayBTdGFydCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROZXdUYXNrU3RhcnREYXRlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9OZXdUYXNrU3RhcnREYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTmV3VGFza1N0YXJ0RGF0ZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J05ld1Rhc2tTdGFydERhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldE5ld1Rhc2tTdGFydERhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROZXdUYXNrU3RhcnREYXRlIDxlbT5OZXcgVGFzayBTdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OZXcgVGFzayBTdGFydCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROZXdUYXNrU3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROZXdUYXNrU3RhcnREYXRlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgZWFybmVkIHZhbHVlIG1ldGhvZCBmb3IgdGFza3MuICBWYWx1ZXMgYXJlOiAKLQkgKiAJCQkJCQkwPVBlcmNlbnQgQ29tcGxldGUsIDE9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0VGFza0VWTWV0aG9kKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9EZWZhdWx0VGFza0VWTWV0aG9kKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlZmF1bHRUYXNrRVZNZXRob2QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldERlZmF1bHRUYXNrRVZNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0VGFza0VWTWV0aG9kIDxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza0VWTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0VGFza0VWTWV0aG9kKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgcHJvamVjdCBYTUwgd2FzIGVkaXRlZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQHNlZSAjdW5zZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQHNlZSAjc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKQotCSAqIEBzZWUgI2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCA8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQHNlZSAjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQHNlZSAjc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkIDxlbT5Qcm9qZWN0IEV4dGVybmFsbHkgRWRpdGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IEV4dGVybmFsbHkgRWRpdGVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQHNlZSAjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQHNlZSAjc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEYXRlIHVzZWQgZm9yIGNhbGN1bGF0aW9uIGFuZCByZXBvcnRpbmcuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVuZGVkIENyZWF0aW9uIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4dGVuZGVkQ3JlYXRpb25EYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0V4dGVuZGVkQ3JlYXRpb25EYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXh0ZW5kZWRDcmVhdGlvbkRhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSA8ZW0+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4dGVuZGVkQ3JlYXRpb25EYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWxzIEluIFN5bmM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgYWxsIGFjdHVhbCB3b3JrIGhhcyBiZWVuIHN5bmNocm9uaXplZCB3aXRoIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QWN0dWFsc0luU3luYygpCi0JICogQHNlZSAjdW5zZXRBY3R1YWxzSW5TeW5jKCkKLQkgKiBAc2VlICNzZXRBY3R1YWxzSW5TeW5jKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9BY3R1YWxzSW5TeW5jKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxzSW5TeW5jJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0FjdHVhbHNJblN5bmMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FjdHVhbHNJblN5bmMgPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFscyBJbiBTeW5jPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFjdHVhbHNJblN5bmMoKQotCSAqIEBzZWUgI3Vuc2V0QWN0dWFsc0luU3luYygpCi0JICogQHNlZSAjaXNBY3R1YWxzSW5TeW5jKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxzSW5TeW5jKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBY3R1YWxzSW5TeW5jIDxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QWN0dWFsc0luU3luYygpCi0JICogQHNlZSAjaXNBY3R1YWxzSW5TeW5jKCkKLQkgKiBAc2VlICNzZXRBY3R1YWxzSW5TeW5jKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBY3R1YWxzSW5TeW5jKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FjdHVhbHNJblN5bmMgPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFscyBJbiBTeW5jPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBY3R1YWxzSW5TeW5jKCkKLQkgKiBAc2VlICNpc0FjdHVhbHNJblN5bmMoKQotCSAqIEBzZWUgI3NldEFjdHVhbHNJblN5bmMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEFjdHVhbHNJblN5bmMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdG8gcmVtb3ZlIGFsbCBmaWxlIHByb3BlcnRpZXMgb24gc2F2ZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQHNlZSAjdW5zZXRSZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQHNlZSAjc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1vdmVGaWxlUHJvcGVydGllcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNSZW1vdmVGaWxlUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzUmVtb3ZlRmlsZVByb3BlcnRpZXMgPGVtPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoKQotCSAqIEBzZWUgI3Vuc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoKQotCSAqIEBzZWUgI2lzUmVtb3ZlRmlsZVByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNSZW1vdmVGaWxlUHJvcGVydGllcyA8ZW0+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQHNlZSAjaXNSZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQHNlZSAjc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzIDxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRSZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQHNlZSAjaXNSZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQHNlZSAjc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZG1pbiBQcm9qZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBwcm9qZWN0IGlzIGFuIGFkbWluaXN0cmF0aXZlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkbWluIFByb2plY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QWRtaW5Qcm9qZWN0KCkKLQkgKiBAc2VlICN1bnNldEFkbWluUHJvamVjdCgpCi0JICogQHNlZSAjc2V0QWRtaW5Qcm9qZWN0KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9BZG1pblByb2plY3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FkbWluUHJvamVjdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNBZG1pblByb2plY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FkbWluUHJvamVjdCA8ZW0+QWRtaW4gUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWRtaW4gUHJvamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBZG1pblByb2plY3QoKQotCSAqIEBzZWUgI3Vuc2V0QWRtaW5Qcm9qZWN0KCkKLQkgKiBAc2VlICNpc0FkbWluUHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWRtaW5Qcm9qZWN0KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBZG1pblByb2plY3QgPGVtPkFkbWluIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QWRtaW5Qcm9qZWN0KCkKLQkgKiBAc2VlICNpc0FkbWluUHJvamVjdCgpCi0JICogQHNlZSAjc2V0QWRtaW5Qcm9qZWN0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBZG1pblByb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWRtaW5Qcm9qZWN0IDxlbT5BZG1pbiBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZG1pbiBQcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBZG1pblByb2plY3QoKQotCSAqIEBzZWUgI2lzQWRtaW5Qcm9qZWN0KCkKLQkgKiBAc2VlICNzZXRBZG1pblByb2plY3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEFkbWluUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0bGluZSBDb2RlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvbGxlY3Rpb24gb2Ygb3V0bGluZSBjb2RlIGRlZmluaXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC4gIFRoZXNlIGNvZGVzIG1heSBiZSBhc3NvY2lhdGVkIG9ubHkgd2l0aCB0aGlzIHByb2plY3QsIG9yIG1heSBiZSBjb21tb24gYW1vbmcgc2V2ZXJhbCBwcm9qZWN0cyAoZW50ZXJwcmlzZSBjb2RlcykuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgQ29kZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE91dGxpbmVDb2RlcyhPdXRsaW5lQ29kZXMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9PdXRsaW5lQ29kZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdXRsaW5lQ29kZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPdXRsaW5lQ29kZXMgZ2V0T3V0bGluZUNvZGVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0T3V0bGluZUNvZGVzIDxlbT5PdXRsaW5lIENvZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRsaW5lIENvZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE91dGxpbmVDb2RlcyhPdXRsaW5lQ29kZXMgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V0JTIE1hc2tzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdGFibGUgb2YgZW50cmllcyB0aGF0IGRlZmluZSB0aGUgb3V0bGluZSBjb2RlIG1hc2suCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldCUyBNYXNrczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0V0JTTWFza3MoV0JTTWFza3MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9XQlNNYXNrcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dCU01hc2tzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV0JTTWFza3MgZ2V0V0JTTWFza3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXQlNNYXNrcyA8ZW0+V0JTIE1hc2tzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5XQlMgTWFza3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFdCU01hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXQlNNYXNrcyhXQlNNYXNrcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBleHRlbmRlZCBhdHRyaWJ1dGUgKGN1c3RvbSBmaWVsZCkgZGVmaW5pdGlvbnMgCi0JICogICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEV4dGVuZGVkQXR0cmlidXRlcyhFeHRlbmRlZEF0dHJpYnV0ZXMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9FeHRlbmRlZEF0dHJpYnV0ZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlbmRlZEF0dHJpYnV0ZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFeHRlbmRlZEF0dHJpYnV0ZXMgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4dGVuZGVkQXR0cmlidXRlcyhFeHRlbmRlZEF0dHJpYnV0ZXMgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FsZW5kYXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBjYWxlbmRhcnMgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIAotCSAqICAgICAgICAgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FsZW5kYXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDYWxlbmRhcnMoQ2FsZW5kYXJzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQ2FsZW5kYXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ2FsZW5kYXJzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ2FsZW5kYXJzIGdldENhbGVuZGFycygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhbGVuZGFycyA8ZW0+Q2FsZW5kYXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxlbmRhcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENhbGVuZGFycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2FsZW5kYXJzKENhbGVuZGFycyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXNrczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvbGxlY3Rpb24gb2YgdGFza3MgdGhhdCBtYWtlIHVwIHRoZSBwcm9qZWN0LgotCSAqICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhc2tzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRUYXNrcyhUYXNrcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1Rhc2tzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGFza3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXNrcyBnZXRUYXNrcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFRhc2tzIDxlbT5UYXNrczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFza3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFRhc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUYXNrcyhUYXNrcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIHJlc291cmNlcyB0aGF0IG1ha2UgdXAgdGhlIHByb2plY3QuCi0JICogICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSZXNvdXJjZXMoUmVzb3VyY2VzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfUmVzb3VyY2VzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVzb3VyY2VzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVzb3VyY2VzIGdldFJlc291cmNlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFJlc291cmNlcyA8ZW0+UmVzb3VyY2VzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJlc291cmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzb3VyY2VzKFJlc291cmNlcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvbGxlY3Rpb24gb2YgYXNzaWdubWVudHMgdGhhdCBtYWtlIHVwIHRoZSBwcm9qZWN0LgotCSAqICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXNzaWdubWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFzc2lnbm1lbnRzKEFzc2lnbm1lbnRzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQXNzaWdubWVudHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBc3NpZ25tZW50cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFzc2lnbm1lbnRzIGdldEFzc2lnbm1lbnRzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0QXNzaWdubWVudHMgPGVtPkFzc2lnbm1lbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NpZ25tZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFzc2lnbm1lbnRzKEFzc2lnbm1lbnRzIHZhbHVlKTsKLQotfSAvLyBQcm9qZWN0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmF0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1JhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Q3MWQ3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmF0ZS5qYXZhLHYgMS4yIDIwMDYvMDQvMTEgMTU6Mjk6NTUganRoYXJpbyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SYXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRSYXRlc0Zyb20gPGVtPlJhdGVzIEZyb208L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRSYXRlc1RvIDxlbT5SYXRlcyBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVUYWJsZSA8ZW0+UmF0ZSBUYWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFN0YW5kYXJkUmF0ZSA8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGUgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGVGb3JtYXQgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0Q29zdFBlclVzZSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUmF0ZV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSYXRlIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmF0ZXMgRnJvbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhhdCB0aGUgcmF0ZSBiZWNvbWVzIGVmZmVjdGl2ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYXRlcyBGcm9tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSYXRlc0Zyb20oT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJhdGVfUmF0ZXNGcm9tKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JhdGVzRnJvbScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSYXRlc0Zyb20oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRSYXRlc0Zyb20gPGVtPlJhdGVzIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJhdGVzIEZyb208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJhdGVzRnJvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmF0ZXNGcm9tKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYXRlcyBUbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGxhc3QgZGF0ZSB0aGF0IHRoZSByYXRlIGlzIGVmZmVjdGl2ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYXRlcyBUbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmF0ZXNUbyhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZV9SYXRlc1RvKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JhdGVzVG8nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmF0ZXNUbygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVzVG8gPGVtPlJhdGVzIFRvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYXRlcyBUbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmF0ZXNUbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmF0ZXNUbyhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmF0ZSBUYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByYXRlIHRhYmxlIGZvciB0aGUgcmVzb3VyY2UuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1BLCAxPUIsIDI9QywgMz1ELCA0PUUKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmF0ZSBUYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmF0ZVRhYmxlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZV9SYXRlVGFibGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlVGFibGVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSYXRlVGFibGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFJhdGVUYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVUYWJsZSA8ZW0+UmF0ZSBUYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmF0ZSBUYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmF0ZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSYXRlVGFibGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFuZGFyZCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc3RhbmRhcmQgcmF0ZSBmb3IgdGhlIHJlc291cmNlIGZvciB0aGUgcGVyaW9kIHNwZWNpZmllZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFuZGFyZCBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFuZGFyZFJhdGUoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSYXRlX1N0YW5kYXJkUmF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhbmRhcmRSYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRTdGFuZGFyZFJhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRTdGFuZGFyZFJhdGUgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YW5kYXJkIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhbmRhcmRSYXRlKEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIHN0YW5kYXJkIHJhdGUuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15Ci0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YW5kYXJkUmF0ZUZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJhdGVfU3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuU3RhbmRhcmRSYXRlRm9ybWF0VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhbmRhcmRSYXRlRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRTdGFuZGFyZFJhdGVGb3JtYXQgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFuZGFyZFJhdGVGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVydGltZSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgb3ZlcnRpbWUgcmF0ZSBmb3IgdGhlIHJlc291cmNlIGZvciB0aGUgcGVyaW9kIHNwZWNpZmllZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZVJhdGUoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSYXRlX092ZXJ0aW1lUmF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcnRpbWVSYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRPdmVydGltZVJhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGUgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcnRpbWVSYXRlKEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIG92ZXJ0aW1lIHJhdGUuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZVJhdGVGb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSYXRlX092ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J092ZXJ0aW1lUmF0ZUZvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0IDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcnRpbWVSYXRlRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdCBQZXIgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29zdCBwZXIgdXNlIG9mIHRoZSByZXNvdXJjZS4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlIGV4aXN0cyBmb3IgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgUGVyIFVzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29zdFBlclVzZShCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJhdGVfQ29zdFBlclVzZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdFBlclVzZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdFBlclVzZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldENvc3RQZXJVc2UgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBQZXIgVXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3N0UGVyVXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0UGVyVXNlKEJpZ0RlY2ltYWwgdmFsdWUpOwotCi19IC8vIFJhdGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9SYXRlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1JhdGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZmZmYyYzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1JhdGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJhdGVzLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmF0ZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlcyNnZXRSYXRlIDxlbT5SYXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZXMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JhdGVzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJhdGVzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmaW5pdGlvbiBvZiBhIHRpbWUgcGVyaW9kLCBhbmQgdGhlIHJhdGVzIGFwcGxpY2FibGUgZm9yIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlc291cmNlIGR1cmluZyB0aGF0IHBlcmlvZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmF0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSYXRlc19SYXRlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiB1cHBlcj0iMjUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRSYXRlKCk7Ci0KLX0gLy8gUmF0ZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9SZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Jlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0NjUzNzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Jlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjg2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVzb3VyY2UuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SUQgPGVtPklEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRJbml0aWFscyA8ZW0+SW5pdGlhbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGhvbmV0aWNzIDxlbT5QaG9uZXRpY3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TlRBY2NvdW50IDxlbT5OVCBBY2NvdW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE1hdGVyaWFsTGFiZWwgPGVtPk1hdGVyaWFsIExhYmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvZGUgPGVtPkNvZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmtHcm91cCA8ZW0+V29yayBHcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRFbWFpbEFkZHJlc3MgPGVtPkVtYWlsIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SHlwZXJsaW5rQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE1heFVuaXRzIDxlbT5NYXggVW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGVha1VuaXRzIDxlbT5QZWFrIFVuaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzT3ZlckFsbG9jYXRlZCA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QXZhaWxhYmxlRnJvbSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QXZhaWxhYmxlVG8gPGVtPkF2YWlsYWJsZSBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNDYW5MZXZlbCA8ZW0+Q2FuIExldmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjY3J1ZUF0IDxlbT5BY2NydWUgQXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZWd1bGFyV29yayA8ZW0+UmVndWxhciBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxXb3JrIDxlbT5BY3R1YWwgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YW5kYXJkUmF0ZSA8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTdGFuZGFyZFJhdGVGb3JtYXQgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVSYXRlIDxlbT5PdmVydGltZSBSYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3RQZXJVc2UgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3RWYXJpYW5jZSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTViA8ZW0+U1Y8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q1YgPGVtPkNWPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFDV1AgPGVtPkFDV1A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROb3RlcyA8ZW0+Tm90ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNHZW5lcmljIDxlbT5JcyBHZW5lcmljPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNJbmFjdGl2ZSA8ZW0+SXMgSW5hY3RpdmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0VudGVycHJpc2UgPGVtPklzIEVudGVycHJpc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Qm9va2luZ1R5cGUgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCA8ZW0+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJhdGVzIDxlbT5SYXRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2UoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Jlc291cmNlXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBvc2l0aW9uIGlkZW50aWZpZXIgb2YgdGhlIHJlc291cmNlIHdpdGhpbiB0aGUgbGlzdCBvZiByZXNvdXJjZXMuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0lEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRJRCA8ZW0+SUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfTmFtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk5hbWVUeXBlMSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTmFtZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0eXBlIG9mIHJlc291cmNlLiBWYWx1ZXMgYXJlOiAwPU1hdGVyaWFsLCAxPVdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlR5cGVUeXBlNCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVHlwZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgTnVsbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIG51bGwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgTnVsbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc051bGwoKQotCSAqIEBzZWUgI3Vuc2V0SXNOdWxsKCkKLQkgKiBAc2VlICNzZXRJc051bGwoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Jc051bGwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0lzTnVsbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc051bGwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIE51bGw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNOdWxsKCkKLQkgKiBAc2VlICN1bnNldElzTnVsbCgpCi0JICogQHNlZSAjaXNJc051bGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzTnVsbChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc051bGwoKQotCSAqIEBzZWUgI2lzSXNOdWxsKCkKLQkgKiBAc2VlICNzZXRJc051bGwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzTnVsbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBOdWxsPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc051bGwoKQotCSAqIEBzZWUgI2lzSXNOdWxsKCkKLQkgKiBAc2VlICNzZXRJc051bGwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzTnVsbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdGlhbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBpbml0aWFscyBvZiB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEluaXRpYWxzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Jbml0aWFscygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkluaXRpYWxzVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSW5pdGlhbHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SW5pdGlhbHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SW5pdGlhbHMgPGVtPkluaXRpYWxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SW5pdGlhbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEluaXRpYWxzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaG9uZXRpY3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwaG9uZXRpYyBzcGVsbGluZyBvZiB0aGUgcmVzb3VyY2UgbmFtZS4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIHVzZSB3aXRoIEphcGFuZXNlIG9ubHkuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGhvbmV0aWNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQaG9uZXRpY3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1Bob25ldGljcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlBob25ldGljc1R5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Bob25ldGljcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQaG9uZXRpY3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGhvbmV0aWNzIDxlbT5QaG9uZXRpY3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBob25ldGljczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGhvbmV0aWNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQaG9uZXRpY3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5UIEFjY291bnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBOVCBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TlQgQWNjb3VudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TlRBY2NvdW50KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9OVEFjY291bnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5OVEFjY291bnRUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOVEFjY291bnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TlRBY2NvdW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE5UQWNjb3VudCA8ZW0+TlQgQWNjb3VudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TlQgQWNjb3VudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TlRBY2NvdW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROVEFjY291bnQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hdGVyaWFsIExhYmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pdCBvZiBtZWFzdXJlIGZvciB0aGUgbWF0ZXJpYWwgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWF0ZXJpYWwgTGFiZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hdGVyaWFsTGFiZWwoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX01hdGVyaWFsTGFiZWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXRlcmlhbExhYmVsVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWF0ZXJpYWxMYWJlbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYXRlcmlhbExhYmVsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE1hdGVyaWFsTGFiZWwgPGVtPk1hdGVyaWFsIExhYmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXRlcmlhbCBMYWJlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWF0ZXJpYWxMYWJlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWF0ZXJpYWxMYWJlbChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29kZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvZGUgb3Igb3RoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvZGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvZGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0NvZGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Db2RlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29kZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb2RlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvZGUgPGVtPkNvZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvZGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvZGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZ3JvdXAgdG8gd2hpY2ggdGhlIHJlc291cmNlIGJlbG9uZ3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEdyb3VwKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Hcm91cCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lkdyb3VwVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nR3JvdXAnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0R3JvdXAoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEdyb3VwKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIEdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdHlwZSBvZiB3b3JrZ3JvdXAgdG8gd2hpY2ggdGhlIHJlc291cmNlIGJlbG9uZ3MuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1EZWZhdWx0LCAxPU5vbmUsIDI9RW1haWwsIDM9V2ViCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBHcm91cDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29ya0dyb3VwKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfV29ya0dyb3VwKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya0dyb3VwVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV29ya0dyb3VwJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRXb3JrR3JvdXAoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29ya0dyb3VwIDxlbT5Xb3JrIEdyb3VwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIEdyb3VwPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JrR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmtHcm91cChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVtYWlsIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBlbWFpbCBhZGRyZXNzIG9mIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbWFpbCBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFbWFpbEFkZHJlc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0VtYWlsQWRkcmVzcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkVtYWlsQWRkcmVzc1R5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VtYWlsQWRkcmVzcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFbWFpbEFkZHJlc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0RW1haWxBZGRyZXNzIDxlbT5FbWFpbCBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbWFpbCBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFbWFpbEFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVtYWlsQWRkcmVzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SHlwZXJsaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdGl0bGUgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SHlwZXJsaW5rKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9IeXBlcmxpbmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5IeXBlcmxpbmtUeXBlMSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSHlwZXJsaW5rJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEh5cGVybGluaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEh5cGVybGluayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SHlwZXJsaW5rIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SHlwZXJsaW5rQWRkcmVzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfSHlwZXJsaW5rQWRkcmVzcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lkh5cGVybGlua0FkZHJlc3NUeXBlMSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSHlwZXJsaW5rQWRkcmVzcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRIeXBlcmxpbmtBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEh5cGVybGlua0FkZHJlc3MgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SHlwZXJsaW5rQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SHlwZXJsaW5rQWRkcmVzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZG9jdW1lbnQgYm9va21hcmsgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SHlwZXJsaW5rU3ViQWRkcmVzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfSHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lkh5cGVybGlua1N1YkFkZHJlc3NUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmtTdWJBZGRyZXNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEh5cGVybGlua1N1YkFkZHJlc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1heCBVbml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIxLjAiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB1bml0cyB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWF4IFVuaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1heFVuaXRzKCkKLQkgKiBAc2VlICN1bnNldE1heFVuaXRzKCkKLQkgKiBAc2VlICNzZXRNYXhVbml0cyhmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9NYXhVbml0cygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IjEuMCIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWF4VW5pdHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRNYXhVbml0cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRNYXhVbml0cyA8ZW0+TWF4IFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXggVW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWF4VW5pdHMoKQotCSAqIEBzZWUgI3Vuc2V0TWF4VW5pdHMoKQotCSAqIEBzZWUgI2dldE1heFVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXhVbml0cyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF4VW5pdHMgPGVtPk1heCBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNYXhVbml0cygpCi0JICogQHNlZSAjZ2V0TWF4VW5pdHMoKQotCSAqIEBzZWUgI3NldE1heFVuaXRzKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TWF4VW5pdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRNYXhVbml0cyA8ZW0+TWF4IFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXggVW5pdHM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE1heFVuaXRzKCkKLQkgKiBAc2VlICNnZXRNYXhVbml0cygpCi0JICogQHNlZSAjc2V0TWF4VW5pdHMoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRNYXhVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVhayBVbml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGxhcmdlc3QgbnVtYmVyIG9mIHVuaXRzIGFzc2lnbmVkIHRvIHRoZSByZXNvdXJjZSBhdCBhbnkgdGltZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZWFrIFVuaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFBlYWtVbml0cygpCi0JICogQHNlZSAjdW5zZXRQZWFrVW5pdHMoKQotCSAqIEBzZWUgI3NldFBlYWtVbml0cyhmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9QZWFrVW5pdHMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQZWFrVW5pdHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRQZWFrVW5pdHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGVha1VuaXRzIDxlbT5QZWFrIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QZWFrIFVuaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFBlYWtVbml0cygpCi0JICogQHNlZSAjdW5zZXRQZWFrVW5pdHMoKQotCSAqIEBzZWUgI2dldFBlYWtVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGVha1VuaXRzKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQZWFrVW5pdHMgPGVtPlBlYWsgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0UGVha1VuaXRzKCkKLQkgKiBAc2VlICNnZXRQZWFrVW5pdHMoKQotCSAqIEBzZWUgI3NldFBlYWtVbml0cyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFBlYWtVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFBlYWtVbml0cyA8ZW0+UGVhayBVbml0czwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVhayBVbml0czwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UGVha1VuaXRzKCkKLQkgKiBAc2VlICNnZXRQZWFrVW5pdHMoKQotCSAqIEBzZWUgI3NldFBlYWtVbml0cyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFBlYWtVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlciBBbGxvY2F0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHJlc291cmNlIGlzIG92ZXJhbGxvY2F0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjdW5zZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfT3ZlckFsbG9jYXRlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlckFsbG9jYXRlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNPdmVyQWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzT3ZlckFsbG9jYXRlZCA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE92ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzT3ZlckFsbG9jYXRlZCA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRPdmVyQWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE92ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI2lzT3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjc2V0T3ZlckFsbG9jYXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0T3ZlckFsbG9jYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXZhaWxhYmxlIEZyb208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmaXJzdCBkYXRlIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgRnJvbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXZhaWxhYmxlRnJvbShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQXZhaWxhYmxlRnJvbSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0F2YWlsYWJsZUZyb20nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QXZhaWxhYmxlRnJvbSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVGcm9tIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmxlIEZyb208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZUZyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF2YWlsYWJsZUZyb20oT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF2YWlsYWJsZSBUbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGxhc3QgZGF0ZSB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJsZSBUbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXZhaWxhYmxlVG8oT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0F2YWlsYWJsZVRvKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXZhaWxhYmxlVG8nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QXZhaWxhYmxlVG8oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QXZhaWxhYmxlVG8gPGVtPkF2YWlsYWJsZSBUbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmxlIFRvPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdmFpbGFibGVUbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXZhaWxhYmxlVG8oT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2NoZWR1bGVkIHN0YXJ0IGRhdGUgb2YgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFydChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfU3RhcnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFydCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaW5pc2goT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0ZpbmlzaCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpbmlzaCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRGaW5pc2goKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5pc2goT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhbiBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgcmVzb3VyY2UgY2FuIGJlIGxldmVsZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FuIExldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENhbkxldmVsKCkKLQkgKiBAc2VlICN1bnNldENhbkxldmVsKCkKLQkgKiBAc2VlICNzZXRDYW5MZXZlbChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0NhbkxldmVsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDYW5MZXZlbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNDYW5MZXZlbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0NhbkxldmVsIDxlbT5DYW4gTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhbiBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDYW5MZXZlbCgpCi0JICogQHNlZSAjdW5zZXRDYW5MZXZlbCgpCi0JICogQHNlZSAjaXNDYW5MZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2FuTGV2ZWwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNDYW5MZXZlbCA8ZW0+Q2FuIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENhbkxldmVsKCkKLQkgKiBAc2VlICNpc0NhbkxldmVsKCkKLQkgKiBAc2VlICNzZXRDYW5MZXZlbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q2FuTGV2ZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0NhbkxldmVsIDxlbT5DYW4gTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhbiBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0Q2FuTGV2ZWwoKQotCSAqIEBzZWUgI2lzQ2FuTGV2ZWwoKQotCSAqIEBzZWUgI3NldENhbkxldmVsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDYW5MZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjcnVlIEF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBIb3cgY29zdCBpcyBhY2NydWVkIGFnYWluc3QgdGhlIHJlc291cmNlLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDE9U3RhcnQsIDI9RW5kLCAzPVByb3JhdGVkCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjcnVlIEF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY2NydWVBdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0FjY3J1ZUF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQWNjcnVlQXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjY3J1ZUF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRBY2NydWVBdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY2NydWVBdCA8ZW0+QWNjcnVlIEF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2NydWUgQXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjY3J1ZUF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY2NydWVBdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0b3RhbCB3b3JrIGFzc2lnbmVkIHRvIHRoZSByZXNvdXJjZSBhY3Jvc3MgYWxsIGFzc2lnbmVkIHRhc2tzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1dvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29yayA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVndWxhciBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIG5vbi1vdmVydGltZSB3b3JrIGFzc2lnbmVkIHRvIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWd1bGFyIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlZ3VsYXJXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9SZWd1bGFyV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlZ3VsYXJXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlZ3VsYXJXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlZ3VsYXJXb3JrIDxlbT5SZWd1bGFyIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZ3VsYXIgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlZ3VsYXJXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIG92ZXJ0aW1lIHdvcmsgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE92ZXJ0aW1lV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfT3ZlcnRpbWVXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcnRpbWVXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVdvcmsgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcnRpbWVXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiBhY3R1YWwgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BY3R1YWxXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2YgcmVtYWluaW5nIHdvcmsgcmVxdWlyZWQgdG8gY29tcGxldGUgYWxsIGFzc2lnbmVkIHRhc2tzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZW1haW5pbmdXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9SZW1haW5pbmdXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSZW1haW5pbmdXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2YgYWN0dWFsIG92ZXJ0aW1lIHdvcmsgcGVyZm9ybWVkIGJ5IHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxPdmVydGltZVdvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lV29yayA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbE92ZXJ0aW1lV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2YgcmVtYWluaW5nIG92ZXJ0aW1lIHdvcmsgcmVxdWlyZWQgdG8gY29tcGxldGUgYWxsIHRhc2tzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1JlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ092ZXJ0aW1lV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwZXJjZW50YWdlIG9mIHdvcmsgY29tcGxldGVkIGFjcm9zcyBhbGwgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQZXJjZW50V29ya0NvbXBsZXRlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfUGVyY2VudFdvcmtDb21wbGV0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGVyY2VudFdvcmtDb21wbGV0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGVyY2VudFdvcmtDb21wbGV0ZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YW5kYXJkIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzdGFuZGFyZCByYXRlIG9mIHRoZSByZXNvdXJjZS4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlIGV4aXN0cyBmb3IgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0YW5kYXJkIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YW5kYXJkUmF0ZShCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1N0YW5kYXJkUmF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhbmRhcmRSYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRTdGFuZGFyZFJhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U3RhbmRhcmRSYXRlIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFuZGFyZCBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdGFuZGFyZFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YW5kYXJkUmF0ZShCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pdHMgdXNlZCBieSBNaWNyb3NvZnQgUHJvamVjdCB0byBkaXNwbGF5IHRoZSBzdGFuZGFyZCByYXRlLiAgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPW0sIDI9aCwgMz1kLCA0PXcsIDU9bW8sIDc9eSwgOD1tYXRlcmlhbCByZXNvdXJjZSByYXRlIChvciBibGFuayBzeW1ib2wgc3BlY2lmaWVkKQotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFuZGFyZFJhdGVGb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9TdGFuZGFyZFJhdGVGb3JtYXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5TdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhbmRhcmRSYXRlRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0IDxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhbmRhcmRSYXRlRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRvdGFsIHByb2plY3QgY29zdCBmb3IgdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0Nvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Nvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldENvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBvdmVydGltZSByYXRlIG9mIHRoZSByZXNvdXJjZS4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlIGV4aXN0cyBmb3IgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE92ZXJ0aW1lUmF0ZShCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX092ZXJ0aW1lUmF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcnRpbWVSYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRPdmVydGltZVJhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVSYXRlIDxlbT5PdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE92ZXJ0aW1lUmF0ZShCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pdHMgdXNlZCBieSBNaWNyb3NvZnQgUHJvamVjdCB0byBkaXNwbGF5IHRoZSBvdmVydGltZSByYXRlLiAgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPW0sIDI9aCwgMz1kLCA0PXcsIDU9bW8sIDc9eQotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZVJhdGVGb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9PdmVydGltZVJhdGVGb3JtYXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdmVydGltZVJhdGVGb3JtYXRUeXBlMSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcnRpbWVSYXRlRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRPdmVydGltZVJhdGVGb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0IDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcnRpbWVSYXRlRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRvdGFsIG92ZXJ0aW1lIGNvc3QgZm9yIHRoZSByZXNvdXJjZSBpbmNsdWRpbmcgYWN0dWFsIGFuZCByZW1haW5pbmcgb3ZlcnRpbWUgY29zdHMuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfT3ZlcnRpbWVDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVydGltZUNvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldE92ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdCBQZXIgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29zdCBwZXIgdXNlIG9mIHRoZSByZXNvdXJjZS4gVGhpcyB2YWx1ZSBpcyBhcyBvZiB0aGUgY3VycmVudCBkYXRlIGlmIGEgcmF0ZSB0YWJsZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyBmb3IgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgUGVyIFVzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29zdFBlclVzZShCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0Nvc3RQZXJVc2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Nvc3RQZXJVc2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldENvc3RQZXJVc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdFBlclVzZSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0IFBlciBVc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvc3RQZXJVc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3RQZXJVc2UoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBjb3N0IGluY3VycmVkIGJ5IHRoZSByZXNvdXJjZSBhY3Jvc3MgYWxsIGFzc2lnbmVkIHRhc2tzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQWN0dWFsQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0QWN0dWFsQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbENvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBvdmVydGltZSBjb3N0IGluY3VycmVkIGJ5IHRoZSByZXNvdXJjZSBhY3Jvc3MgYWxsIGFzc2lnbmVkIHRhc2tzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbE92ZXJ0aW1lQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIHByb2plY3RlZCBjb3N0IG9mIHRoZSByZXNvdXJjZSB0byBjb21wbGV0ZSBhbGwgYXNzaWduZWQgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ0Nvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9SZW1haW5pbmdDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRSZW1haW5pbmdDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIHByb2plY3RlZCBvdmVydGltZSBjb3N0IG9mIHRoZSByZXNvdXJjZSB0byBjb21wbGV0ZSBhbGwgYXNzaWduZWQgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1JlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nT3ZlcnRpbWVDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yayBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYmFzZWxpbmUgd29yayBhbmQgdGhlIHdvcmsgYXMgbWludXRlcyB4IDEwMDAuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3Vuc2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRXb3JrVmFyaWFuY2UoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfV29ya1ZhcmlhbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV29ya1ZhcmlhbmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0V29ya1ZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3Vuc2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmtWYXJpYW5jZShmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRXb3JrVmFyaWFuY2UoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRXb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRXb3JrVmFyaWFuY2UoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRXb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvc3QgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGJhc2VsaW5lIGNvc3QgYW5kIHRoZSBjb3N0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICN1bnNldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0Q29zdFZhcmlhbmNlKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0Nvc3RWYXJpYW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Nvc3RWYXJpYW5jZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldENvc3RWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0VmFyaWFuY2UgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICN1bnNldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0VmFyaWFuY2UoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3RWYXJpYW5jZSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0Q29zdFZhcmlhbmNlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q29zdFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0IFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0Q29zdFZhcmlhbmNlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q29zdFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TVjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRWFybmVkIHZhbHVlIHNjaGVkdWxlIHZhcmlhbmNlLCB0aHJvdWdoIHRoZSBwcm9qZWN0IHN0YXR1cyBkYXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNWPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNWKCkKLQkgKiBAc2VlICN1bnNldFNWKCkKLQkgKiBAc2VlICNzZXRTVihmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9TVigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NWJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0U1YoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U1YgPGVtPlNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TVjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTVigpCi0JICogQHNlZSAjdW5zZXRTVigpCi0JICogQHNlZSAjZ2V0U1YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNWKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTViA8ZW0+U1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0U1YoKQotCSAqIEBzZWUgI2dldFNWKCkKLQkgKiBAc2VlICNzZXRTVihmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFNWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U1YgPGVtPlNWPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TVjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0U1YoKQotCSAqIEBzZWUgI2dldFNWKCkKLQkgKiBAc2VlICNzZXRTVihmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFNWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DVjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRWFybmVkIHZhbHVlIGNvc3QgdmFyaWFuY2UsIHRocm91Z2ggdGhlIHByb2plY3Qgc3RhdHVzIGRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q1Y8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI3Vuc2V0Q1YoKQotCSAqIEBzZWUgI3NldENWKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0NWKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ1YnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRDVigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDViA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNWPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENWKCkKLQkgKiBAc2VlICN1bnNldENWKCkKLQkgKiBAc2VlICNnZXRDVigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q1YoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENWIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRDVigpCi0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBzZWUgI3NldENWKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDViA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNWPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDVigpCi0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBzZWUgI3NldENWKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgY29zdCBvZiB0aGUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlIGZvciB0aGUgcHJvamVjdCB0by1kYXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QUNXUCgpCi0JICogQHNlZSAjdW5zZXRBQ1dQKCkKLQkgKiBAc2VlICNzZXRBQ1dQKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0FDV1AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBQ1dQJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QUNXUCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QUNXUCgpCi0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QUNXUChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAc2VlICNzZXRBQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QUNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFDV1AgPGVtPkFDV1A8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFDV1A8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEFDV1AoKQotCSAqIEBzZWUgI2dldEFDV1AoKQotCSAqIEBzZWUgI3NldEFDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRBQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWxlbmRhciBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZXNvdXJjZSBjYWxlbmRhci5SZWZlcnMgdG8gYSB2YWxpZCBVSUQgaW4gdGhlIENhbGVuZGFycyBlbGVtZW50IG9mIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBTY2hlbWEuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FsZW5kYXIgVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYWxlbmRhclVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0NhbGVuZGFyVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDYWxlbmRhclVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0Q2FsZW5kYXJVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FsZW5kYXIgVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2FsZW5kYXJVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGV4dCBub3RlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5vdGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROb3RlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfTm90ZXMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTm90ZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Tm90ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Tm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5vdGVzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dTPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0IGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9CQ1dTKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQkNXUycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEJDV1MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJDV1MoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QkNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygb2YgdGhlIHdvcmsgcGVyZm9ybWVkIGJ5IHRoZSByZXNvdXJjZSBmb3IgdGhlIHByb2plY3QgdG8tZGF0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9CQ1dQKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQkNXUCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEJDV1AoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJDV1AoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgR2VuZXJpYzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIGdlbmVyaWMuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgR2VuZXJpYzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0dlbmVyaWMoKQotCSAqIEBzZWUgI3Vuc2V0SXNHZW5lcmljKCkKLQkgKiBAc2VlICNzZXRJc0dlbmVyaWMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Jc0dlbmVyaWMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0lzR2VuZXJpYycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc0dlbmVyaWMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0dlbmVyaWMgPGVtPklzIEdlbmVyaWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIEdlbmVyaWM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNHZW5lcmljKCkKLQkgKiBAc2VlICN1bnNldElzR2VuZXJpYygpCi0JICogQHNlZSAjaXNJc0dlbmVyaWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzR2VuZXJpYyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzR2VuZXJpYyA8ZW0+SXMgR2VuZXJpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc0dlbmVyaWMoKQotCSAqIEBzZWUgI2lzSXNHZW5lcmljKCkKLQkgKiBAc2VlICNzZXRJc0dlbmVyaWMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzR2VuZXJpYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNHZW5lcmljIDxlbT5JcyBHZW5lcmljPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBHZW5lcmljPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc0dlbmVyaWMoKQotCSAqIEBzZWUgI2lzSXNHZW5lcmljKCkKLQkgKiBAc2VlICNzZXRJc0dlbmVyaWMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzR2VuZXJpYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgSW5hY3RpdmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBzZXQgdG8gaW5hY3RpdmUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgSW5hY3RpdmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNJbmFjdGl2ZSgpCi0JICogQHNlZSAjdW5zZXRJc0luYWN0aXZlKCkKLQkgKiBAc2VlICNzZXRJc0luYWN0aXZlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfSXNJbmFjdGl2ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSXNJbmFjdGl2ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc0luYWN0aXZlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNJbmFjdGl2ZSA8ZW0+SXMgSW5hY3RpdmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIEluYWN0aXZlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzSW5hY3RpdmUoKQotCSAqIEBzZWUgI3Vuc2V0SXNJbmFjdGl2ZSgpCi0JICogQHNlZSAjaXNJc0luYWN0aXZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0luYWN0aXZlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNJbmFjdGl2ZSA8ZW0+SXMgSW5hY3RpdmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNJbmFjdGl2ZSgpCi0JICogQHNlZSAjaXNJc0luYWN0aXZlKCkKLQkgKiBAc2VlICNzZXRJc0luYWN0aXZlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc0luYWN0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0luYWN0aXZlIDxlbT5JcyBJbmFjdGl2ZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgSW5hY3RpdmU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzSW5hY3RpdmUoKQotCSAqIEBzZWUgI2lzSXNJbmFjdGl2ZSgpCi0JICogQHNlZSAjc2V0SXNJbmFjdGl2ZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNJbmFjdGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgRW50ZXJwcmlzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIGFuIEVudGVycHJpc2UgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI3Vuc2V0SXNFbnRlcnByaXNlKCkKLQkgKiBAc2VlICNzZXRJc0VudGVycHJpc2UoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Jc0VudGVycHJpc2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0lzRW50ZXJwcmlzZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc0VudGVycHJpc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0VudGVycHJpc2UgPGVtPklzIEVudGVycHJpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIEVudGVycHJpc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNFbnRlcnByaXNlKCkKLQkgKiBAc2VlICN1bnNldElzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjaXNJc0VudGVycHJpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzRW50ZXJwcmlzZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzRW50ZXJwcmlzZSA8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI2lzSXNFbnRlcnByaXNlKCkKLQkgKiBAc2VlICNzZXRJc0VudGVycHJpc2UoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzRW50ZXJwcmlzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNFbnRlcnByaXNlIDxlbT5JcyBFbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFbnRlcnByaXNlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI2lzSXNFbnRlcnByaXNlKCkKLQkgKiBAc2VlICNzZXRJc0VudGVycHJpc2UoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzRW50ZXJwcmlzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Qm9va2luZyBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgdGhlIGJvb2tpbmcgdHlwZSBvZiB0aGUgcmVzb3VyY2UuIDE9Q29tbWl0ZWQsIDI9UHJvcG9zZWQKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Cb29raW5nIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJvb2tpbmdUeXBlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQm9va2luZ1R5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Cb29raW5nVHlwZVR5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCb29raW5nVHlwZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0Qm9va2luZ1R5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Qm9va2luZ1R5cGUgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Qm9va2luZyBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRCb29raW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Qm9va2luZ1R5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgd29yayBpcyBwcm90ZWN0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsV29ya1Byb3RlY3RlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIEFjdGl2ZSBEaXJlY3RvcnkgR1VJRCBmb3IgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0aXZlRGlyZWN0b3J5R1VJRChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQWN0aXZlRGlyZWN0b3J5R1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFjdGl2ZURpcmVjdG9yeUdVSURUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3RpdmVEaXJlY3RvcnlHVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFjdGl2ZURpcmVjdG9yeUdVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCA8ZW0+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdGl2ZURpcmVjdG9yeUdVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdGl2ZURpcmVjdG9yeUdVSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIHJlc291cmNlIHdhcyBjcmVhdGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyZWF0aW9uRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ3JlYXRpb25EYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ3JlYXRpb25EYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldENyZWF0aW9uRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDcmVhdGlvbkRhdGUgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3JlYXRpb25EYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlM30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFsdWUgb2YgYW4gZXh0ZW5kZWQgYXR0cmlidXRlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSBGaWVsZCBJRCwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHZhbHVlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9FeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlbmRlZEF0dHJpYnV0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEV4dGVuZGVkQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBiYXNlbGluZSB2YWx1ZXMgZm9yIHRoZSByZXNvdXJjZXMuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZWxpbmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQmFzZWxpbmUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQmFzZWxpbmUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRCYXNlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0bGluZSBDb2RlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhbHVlIG9mIGFuIG91dGxpbmUgY29kZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gYSBwb2ludGVyIGJhY2sgdG8gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3V0bGluZSBjb2RlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgRmllbGQgSUQsIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfT3V0bGluZUNvZGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0bGluZUNvZGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRPdXRsaW5lQ29kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgY29sbGVjdGlvbiBvZiBwZXJpb2RzIGR1cmluZyB3aGljaCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBdmFpbGFiaWxpdHlQZXJpb2RzKEF2YWlsYWJpbGl0eVBlcmlvZHMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQXZhaWxhYmlsaXR5UGVyaW9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0F2YWlsYWJpbGl0eVBlcmlvZHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBdmFpbGFiaWxpdHlQZXJpb2RzIGdldEF2YWlsYWJpbGl0eVBlcmlvZHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcyA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdmFpbGFiaWxpdHlQZXJpb2RzKEF2YWlsYWJpbGl0eVBlcmlvZHMgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmF0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgY29sbGVjdGlvbiBvZiBwZXJpb2RzIGFuZCB0aGUgcmF0ZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggb25lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJhdGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSYXRlcyhSYXRlcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9SYXRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JhdGVzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmF0ZXMgZ2V0UmF0ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmF0ZXMgPGVtPlJhdGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmF0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJhdGVzKFJhdGVzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRpbWVwaGFzZWQgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0aW1lIHBoYXNlZCBkYXRhCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1RpbWVwaGFzZWREYXRhKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RpbWVwaGFzZWREYXRhJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0VGltZXBoYXNlZERhdGEoKTsKLQotfSAvLyBSZXNvdXJjZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Jlc291cmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Jlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Y2FlOTFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9SZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVzb3VyY2VzLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2VzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzI2dldFJlc291cmNlIDxlbT5SZXNvdXJjZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlcygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUmVzb3VyY2VzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlcyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSByZXNvdXJjZSBpbiBlYWNoIFJlc291cmNlcyBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlc19SZXNvdXJjZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc291cmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UmVzb3VyY2UoKTsKLQotfSAvLyBSZXNvdXJjZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UYXNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNDU3MWM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTcxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGFzay5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRJRCA8ZW0+SUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q3JlYXRlRGF0ZSA8ZW0+Q3JlYXRlIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb250YWN0IDxlbT5Db250YWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V0JTIDxlbT5XQlM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXQlNMZXZlbCA8ZW0+V0JTIExldmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZU51bWJlciA8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdXRsaW5lTGV2ZWwgPGVtPk91dGxpbmUgTGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmlvcml0eSA8ZW0+UHJpb3JpdHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldER1cmF0aW9uIDxlbT5EdXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RvcCA8ZW0+U3RvcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlc3VtZSA8ZW0+UmVzdW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSZXN1bWVWYWxpZCA8ZW0+UmVzdW1lIFZhbGlkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFZmZvcnREcml2ZW4gPGVtPkVmZm9ydCBEcml2ZW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JlY3VycmluZyA8ZW0+UmVjdXJyaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRXN0aW1hdGVkIDxlbT5Fc3RpbWF0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc01pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNTdW1tYXJ5IDxlbT5TdW1tYXJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNDcml0aWNhbCA8ZW0+Q3JpdGljYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdCA8ZW0+SXMgU3VicHJvamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkgPGVtPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3VicHJvamVjdE5hbWUgPGVtPlN1YnByb2plY3QgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRXh0ZXJuYWxUYXNrIDxlbT5FeHRlcm5hbCBUYXNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCA8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybHlTdGFydCA8ZW0+RWFybHkgU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJseUZpbmlzaCA8ZW0+RWFybHkgRmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGF0ZVN0YXJ0IDxlbT5MYXRlIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGF0ZUZpbmlzaCA8ZW0+TGF0ZSBGaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdGFydFZhcmlhbmNlIDxlbT5TdGFydCBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpbmlzaFZhcmlhbmNlIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGcmVlU2xhY2sgPGVtPkZyZWUgU2xhY2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRUb3RhbFNsYWNrIDxlbT5Ub3RhbCBTbGFjazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpeGVkQ29zdCA8ZW0+Rml4ZWQgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpeGVkQ29zdEFjY3J1YWwgPGVtPkZpeGVkIENvc3QgQWNjcnVhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBlcmNlbnRDb21wbGV0ZSA8ZW0+UGVyY2VudCBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdmVydGltZVdvcmsgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxTdGFydCA8ZW0+QWN0dWFsIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsRmluaXNoIDxlbT5BY3R1YWwgRmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsRHVyYXRpb24gPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0IDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlZ3VsYXJXb3JrIDxlbT5SZWd1bGFyIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdEdXJhdGlvbiA8ZW0+UmVtYWluaW5nIER1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENWIDxlbT5DVjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnN0cmFpbnRUeXBlIDxlbT5Db25zdHJhaW50IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29uc3RyYWludERhdGUgPGVtPkNvbnN0cmFpbnQgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldERlYWRsaW5lIDxlbT5EZWFkbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxBc3NpZ25tZW50cyA8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsaW5nQ2FuU3BsaXQgPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExldmVsaW5nRGVsYXkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJlTGV2ZWxlZFN0YXJ0IDxlbT5QcmUgTGV2ZWxlZCBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZUxldmVsZWRGaW5pc2ggPGVtPlByZSBMZXZlbGVkIEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGluayA8ZW0+SHlwZXJsaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SHlwZXJsaW5rQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIgPGVtPklnbm9yZSBSZXNvdXJjZSBDYWxlbmRhcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSGlkZUJhciA8ZW0+SGlkZSBCYXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JvbGx1cCA8ZW0+Um9sbHVwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSA8ZW0+UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEVhcm5lZFZhbHVlTWV0aG9kIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJlZGVjZXNzb3JMaW5rIDxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QmFzZWxpbmUgPGVtPkJhc2VsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZUNvZGUgPGVtPk91dGxpbmUgQ29kZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUYXNrXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2sgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1VJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBvc2l0aW9uIGlkZW50aWZpZXIgb2YgdGhlIHRhc2sgd2l0aGluIHRoZSBsaXN0IG9mIHRhc2tzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0lEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldElEIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBuYW1lIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfTmFtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk5hbWVUeXBlMiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTmFtZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHR5cGUgb2YgdGFzay4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPUZpeGVkIFVuaXRzLCAxPUZpeGVkIER1cmF0aW9uLCAyPUZpeGVkIFdvcmsuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlR5cGVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIE51bGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSB0YXNrIGlzIG51bGwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgTnVsbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc051bGwoKQotCSAqIEBzZWUgI3Vuc2V0SXNOdWxsKCkKLQkgKiBAc2VlICNzZXRJc051bGwoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0lzTnVsbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSXNOdWxsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzTnVsbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBOdWxsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzTnVsbCgpCi0JICogQHNlZSAjdW5zZXRJc051bGwoKQotCSAqIEBzZWUgI2lzSXNOdWxsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc051bGwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc051bGwoKQotCSAqIEBzZWUgI2lzSXNOdWxsKCkKLQkgKiBAc2VlICNzZXRJc051bGwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzTnVsbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIE51bGw8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzTnVsbCgpCi0JICogQHNlZSAjaXNJc051bGwoKQotCSAqIEBzZWUgI3NldElzTnVsbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNOdWxsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DcmVhdGUgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhhdCB0aGUgdGFzayB3YXMgY3JlYXRlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGUgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3JlYXRlRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19DcmVhdGVEYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ3JlYXRlRGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRDcmVhdGVEYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q3JlYXRlRGF0ZSA8ZW0+Q3JlYXRlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0ZSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDcmVhdGVEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDcmVhdGVEYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250YWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29udGFjdCBwZXJzb24gZm9yIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbnRhY3QoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQ29udGFjdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNvbnRhY3RUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb250YWN0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvbnRhY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb250YWN0IDxlbT5Db250YWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb250YWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb250YWN0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XQlM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgY29kZSBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XQlM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdCUyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19XQlMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV0JTJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFdCUygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdCUyA8ZW0+V0JTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5XQlM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdCUygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V0JTKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XQlMgTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByaWdodG1vc3QgV0JTIGxldmVsIG9mIHRoZSB0YXNrLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XQlMgTGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdCU0xldmVsKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1dCU0xldmVsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dCU0xldmVsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFdCU0xldmVsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V0JTTGV2ZWwgPGVtPldCUyBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V0JTIExldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXQlNMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V0JTTGV2ZWwoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dGxpbmUgTnVtYmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgb3V0bGluZSBudW1iZXIgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE91dGxpbmVOdW1iZXIoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfT3V0bGluZU51bWJlcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVOdW1iZXJUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdXRsaW5lTnVtYmVyJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE91dGxpbmVOdW1iZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdXRsaW5lTnVtYmVyIDxlbT5PdXRsaW5lIE51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE91dGxpbmVOdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE91dGxpbmVOdW1iZXIoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dGxpbmUgTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBvdXRsaW5lIGxldmVsIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgTGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE91dGxpbmVMZXZlbChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfT3V0bGluZUxldmVsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdXRsaW5lTGV2ZWwnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldE91dGxpbmVMZXZlbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE91dGxpbmVMZXZlbCA8ZW0+T3V0bGluZSBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3V0bGluZSBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3V0bGluZUxldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdXRsaW5lTGV2ZWwoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcmlvcml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHByaW9yaXR5IG9mIHRoZSB0YXNrIGZyb20gMCB0byAxMDAwLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByaW9yaXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmlvcml0eShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUHJpb3JpdHkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByaW9yaXR5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRQcmlvcml0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByaW9yaXR5IDxlbT5Qcmlvcml0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJpb3JpdHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByaW9yaXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmlvcml0eShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2NoZWR1bGVkIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1N0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0U3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19GaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaW5pc2gnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5pc2goT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkR1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGxhbm5lZCBkdXJhdGlvbiBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RHVyYXRpb24oT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRHVyYXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEdXJhdGlvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXREdXJhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldER1cmF0aW9uIDxlbT5EdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldER1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREdXJhdGlvbihPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RHVyYXRpb24gRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBEdXJhdGlvbiBvZiB0aGUgVGFzay4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRHVyYXRpb25Gb3JtYXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EdXJhdGlvbkZvcm1hdFR5cGU0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEdXJhdGlvbkZvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2Ygc2NoZWR1bGVkIHdvcmsgZm9yIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0V29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdvcmsgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0b3A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIHRhc2sgd2FzIHN0b3BwZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RvcDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RvcChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19TdG9wKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RvcCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRTdG9wKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RvcCA8ZW0+U3RvcDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RvcDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RvcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RvcChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzdW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGF0IHRoZSB0YXNrIHJlc3VtZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXN1bWUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUmVzdW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVzdW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlc3VtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlc3VtZSA8ZW0+UmVzdW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlc3VtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzdW1lKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXN1bWUgVmFsaWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgY2FuIGJlIHJlc3VtZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdW1lIFZhbGlkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlc3VtZVZhbGlkKCkKLQkgKiBAc2VlICN1bnNldFJlc3VtZVZhbGlkKCkKLQkgKiBAc2VlICNzZXRSZXN1bWVWYWxpZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUmVzdW1lVmFsaWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc3VtZVZhbGlkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1Jlc3VtZVZhbGlkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSZXN1bWVWYWxpZCA8ZW0+UmVzdW1lIFZhbGlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bWUgVmFsaWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UmVzdW1lVmFsaWQoKQotCSAqIEBzZWUgI3Vuc2V0UmVzdW1lVmFsaWQoKQotCSAqIEBzZWUgI2lzUmVzdW1lVmFsaWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc3VtZVZhbGlkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSZXN1bWVWYWxpZCA8ZW0+UmVzdW1lIFZhbGlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJlc3VtZVZhbGlkKCkKLQkgKiBAc2VlICNpc1Jlc3VtZVZhbGlkKCkKLQkgKiBAc2VlICNzZXRSZXN1bWVWYWxpZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UmVzdW1lVmFsaWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVzdW1lVmFsaWQgPGVtPlJlc3VtZSBWYWxpZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdW1lIFZhbGlkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRSZXN1bWVWYWxpZCgpCi0JICogQHNlZSAjaXNSZXN1bWVWYWxpZCgpCi0JICogQHNlZSAjc2V0UmVzdW1lVmFsaWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFJlc3VtZVZhbGlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FZmZvcnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlzIGVmZm9ydC1kcml2ZW4uCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWZmb3J0IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI3Vuc2V0RWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNzZXRFZmZvcnREcml2ZW4oYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0VmZm9ydERyaXZlbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRWZmb3J0RHJpdmVuJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0VmZm9ydERyaXZlbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRWZmb3J0RHJpdmVuIDxlbT5FZmZvcnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FZmZvcnQgRHJpdmVuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVmZm9ydERyaXZlbigpCi0JICogQHNlZSAjdW5zZXRFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI2lzRWZmb3J0RHJpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFZmZvcnREcml2ZW4oYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VmZm9ydERyaXZlbiA8ZW0+RWZmb3J0IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI2lzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNzZXRFZmZvcnREcml2ZW4oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEVmZm9ydERyaXZlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFZmZvcnREcml2ZW4gPGVtPkVmZm9ydCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVmZm9ydCBEcml2ZW48L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEVmZm9ydERyaXZlbigpCi0JICogQHNlZSAjaXNFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI3NldEVmZm9ydERyaXZlbihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RWZmb3J0RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWN1cnJpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgaXMgYSByZWN1cnJpbmcgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWN1cnJpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UmVjdXJyaW5nKCkKLQkgKiBAc2VlICN1bnNldFJlY3VycmluZygpCi0JICogQHNlZSAjc2V0UmVjdXJyaW5nKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19SZWN1cnJpbmcoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlY3VycmluZycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNSZWN1cnJpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JlY3VycmluZyA8ZW0+UmVjdXJyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWN1cnJpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UmVjdXJyaW5nKCkKLQkgKiBAc2VlICN1bnNldFJlY3VycmluZygpCi0JICogQHNlZSAjaXNSZWN1cnJpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlY3VycmluZyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVjdXJyaW5nIDxlbT5SZWN1cnJpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0UmVjdXJyaW5nKCkKLQkgKiBAc2VlICNpc1JlY3VycmluZygpCi0JICogQHNlZSAjc2V0UmVjdXJyaW5nKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRSZWN1cnJpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVjdXJyaW5nIDxlbT5SZWN1cnJpbmc8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlY3VycmluZzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UmVjdXJyaW5nKCkKLQkgKiBAc2VlICNpc1JlY3VycmluZygpCi0JICogQHNlZSAjc2V0UmVjdXJyaW5nKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSZWN1cnJpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk92ZXIgQWxsb2NhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlzIG92ZXJhbGxvY2F0ZWQuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGluZm9ybWF0aW9uYWwgb25seS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICN1bnNldE92ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3NldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX092ZXJBbGxvY2F0ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J092ZXJBbGxvY2F0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzT3ZlckFsbG9jYXRlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzT3ZlckFsbG9jYXRlZCA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE92ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3NldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE92ZXJBbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzT3ZlckFsbG9jYXRlZCA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3NldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE92ZXJBbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgdGFzayBpcyBlc3RpbWF0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVzdGltYXRlZCgpCi0JICogQHNlZSAjdW5zZXRFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI3NldEVzdGltYXRlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRXN0aW1hdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFc3RpbWF0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRXN0aW1hdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFc3RpbWF0ZWQgPGVtPkVzdGltYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVzdGltYXRlZCgpCi0JICogQHNlZSAjdW5zZXRFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI2lzRXN0aW1hdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFc3RpbWF0ZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VzdGltYXRlZCA8ZW0+RXN0aW1hdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEVzdGltYXRlZCgpCi0JICogQHNlZSAjaXNFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI3NldEVzdGltYXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RXN0aW1hdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VzdGltYXRlZCA8ZW0+RXN0aW1hdGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0ZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEVzdGltYXRlZCgpCi0JICogQHNlZSAjaXNFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI3NldEVzdGltYXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RXN0aW1hdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaWxlc3RvbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgaXMgYSBtaWxlc3RvbmUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWlsZXN0b25lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1pbGVzdG9uZSgpCi0JICogQHNlZSAjdW5zZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3NldE1pbGVzdG9uZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfTWlsZXN0b25lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNaWxlc3RvbmUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWlsZXN0b25lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1pbGVzdG9uZSgpCi0JICogQHNlZSAjdW5zZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNaWxlc3RvbmUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc01pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1pbGVzdG9uZSgpCi0JICogQHNlZSAjaXNNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3NldE1pbGVzdG9uZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc01pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaWxlc3RvbmU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE1pbGVzdG9uZSgpCi0JICogQHNlZSAjaXNNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3NldE1pbGVzdG9uZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdW1tYXJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlzIGEgc3VtbWFyeSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1bW1hcnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U3VtbWFyeSgpCi0JICogQHNlZSAjdW5zZXRTdW1tYXJ5KCkKLQkgKiBAc2VlICNzZXRTdW1tYXJ5KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19TdW1tYXJ5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdW1tYXJ5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1N1bW1hcnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1N1bW1hcnkgPGVtPlN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1bW1hcnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U3VtbWFyeSgpCi0JICogQHNlZSAjdW5zZXRTdW1tYXJ5KCkKLQkgKiBAc2VlICNpc1N1bW1hcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1bW1hcnkoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1N1bW1hcnkgPGVtPlN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0U3VtbWFyeSgpCi0JICogQHNlZSAjaXNTdW1tYXJ5KCkKLQkgKiBAc2VlICNzZXRTdW1tYXJ5KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRTdW1tYXJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1N1bW1hcnkgPGVtPlN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1bW1hcnk8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFN1bW1hcnkoKQotCSAqIEBzZWUgI2lzU3VtbWFyeSgpCi0JICogQHNlZSAjc2V0U3VtbWFyeShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0U3VtbWFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JpdGljYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgaXMgaW4gdGhlIGNyaXRpY2FsIGNoYWluLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyaXRpY2FsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENyaXRpY2FsKCkKLQkgKiBAc2VlICN1bnNldENyaXRpY2FsKCkKLQkgKiBAc2VlICNzZXRDcml0aWNhbChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQ3JpdGljYWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NyaXRpY2FsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0NyaXRpY2FsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNDcml0aWNhbCA8ZW0+Q3JpdGljYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNyaXRpY2FsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENyaXRpY2FsKCkKLQkgKiBAc2VlICN1bnNldENyaXRpY2FsKCkKLQkgKiBAc2VlICNpc0NyaXRpY2FsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDcml0aWNhbChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzQ3JpdGljYWwgPGVtPkNyaXRpY2FsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENyaXRpY2FsKCkKLQkgKiBAc2VlICNpc0NyaXRpY2FsKCkKLQkgKiBAc2VlICNzZXRDcml0aWNhbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q3JpdGljYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzQ3JpdGljYWwgPGVtPkNyaXRpY2FsPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Dcml0aWNhbDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0Q3JpdGljYWwoKQotCSAqIEBzZWUgI2lzQ3JpdGljYWwoKQotCSAqIEBzZWUgI3NldENyaXRpY2FsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDcml0aWNhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgU3VicHJvamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgdGFzayBpcyBhbiBpbnNlcnRlZCBwcm9qZWN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFN1YnByb2plY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNTdWJwcm9qZWN0KCkKLQkgKiBAc2VlICN1bnNldElzU3VicHJvamVjdCgpCi0JICogQHNlZSAjc2V0SXNTdWJwcm9qZWN0KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Jc1N1YnByb2plY3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0lzU3VicHJvamVjdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc1N1YnByb2plY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdCA8ZW0+SXMgU3VicHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3VicHJvamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1N1YnByb2plY3QoKQotCSAqIEBzZWUgI3Vuc2V0SXNTdWJwcm9qZWN0KCkKLQkgKiBAc2VlICNpc0lzU3VicHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNTdWJwcm9qZWN0KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3QgPGVtPklzIFN1YnByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNTdWJwcm9qZWN0KCkKLQkgKiBAc2VlICNpc0lzU3VicHJvamVjdCgpCi0JICogQHNlZSAjc2V0SXNTdWJwcm9qZWN0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc1N1YnByb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0IDxlbT5JcyBTdWJwcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTdWJwcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc1N1YnByb2plY3QoKQotCSAqIEBzZWUgI2lzSXNTdWJwcm9qZWN0KCkKLQkgKiBAc2VlICNzZXRJc1N1YnByb2plY3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzU3VicHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIGluc2VydGVkIHByb2plY3QgaXMgcmVhZC1vbmx5LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAc2VlICN1bnNldElzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAc2VlICNzZXRJc1N1YnByb2plY3RSZWFkT25seShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfSXNTdWJwcm9qZWN0UmVhZE9ubHkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0lzU3VicHJvamVjdFJlYWRPbmx5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzU3VicHJvamVjdFJlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3RSZWFkT25seSA8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAc2VlICN1bnNldElzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAc2VlICNpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1N1YnByb2plY3RSZWFkT25seShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkgPGVtPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAc2VlICNpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAc2VlICNzZXRJc1N1YnByb2plY3RSZWFkT25seShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkgPGVtPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKQotCSAqIEBzZWUgI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkoKQotCSAqIEBzZWUgI3NldElzU3VicHJvamVjdFJlYWRPbmx5KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc1N1YnByb2plY3RSZWFkT25seSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VicHJvamVjdCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBpbnNlcnRlZCBwcm9qZWN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YnByb2plY3QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3VicHJvamVjdE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfU3VicHJvamVjdE5hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5TdWJwcm9qZWN0TmFtZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1YnByb2plY3ROYW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFN1YnByb2plY3ROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3VicHJvamVjdE5hbWUgPGVtPlN1YnByb2plY3QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3VicHJvamVjdCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdWJwcm9qZWN0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3VicHJvamVjdE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVybmFsIFRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgaXMgZXh0ZXJuYWwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFeHRlcm5hbFRhc2soKQotCSAqIEBzZWUgI3Vuc2V0RXh0ZXJuYWxUYXNrKCkKLQkgKiBAc2VlICNzZXRFeHRlcm5hbFRhc2soYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0V4dGVybmFsVGFzaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXh0ZXJuYWxUYXNrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0V4dGVybmFsVGFzaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRXh0ZXJuYWxUYXNrIDxlbT5FeHRlcm5hbCBUYXNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBUYXNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEV4dGVybmFsVGFzaygpCi0JICogQHNlZSAjdW5zZXRFeHRlcm5hbFRhc2soKQotCSAqIEBzZWUgI2lzRXh0ZXJuYWxUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHRlcm5hbFRhc2soYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0V4dGVybmFsVGFzayA8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRFeHRlcm5hbFRhc2soKQotCSAqIEBzZWUgI2lzRXh0ZXJuYWxUYXNrKCkKLQkgKiBAc2VlICNzZXRFeHRlcm5hbFRhc2soYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEV4dGVybmFsVGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFeHRlcm5hbFRhc2sgPGVtPkV4dGVybmFsIFRhc2s8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIFRhc2s8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEV4dGVybmFsVGFzaygpCi0JICogQHNlZSAjaXNFeHRlcm5hbFRhc2soKQotCSAqIEBzZWUgI3NldEV4dGVybmFsVGFzayhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RXh0ZXJuYWxUYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzb3VyY2UgbG9jYXRpb24gYW5kIHRhc2sgaWRlbnRpZmllciBvZiB0aGUgZXh0ZXJuYWwgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4dGVybmFsVGFza1Byb2plY3QoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRXh0ZXJuYWxUYXNrUHJvamVjdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVybmFsVGFza1Byb2plY3RUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlcm5hbFRhc2tQcm9qZWN0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEV4dGVybmFsVGFza1Byb2plY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFeHRlcm5hbFRhc2tQcm9qZWN0IDxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIFRhc2sgUHJvamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXh0ZXJuYWxUYXNrUHJvamVjdChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWFybHkgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBlYXJseSBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVhcmx5IFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFYXJseVN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0Vhcmx5U3RhcnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFYXJseVN0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEVhcmx5U3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJseVN0YXJ0IDxlbT5FYXJseSBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWFybHkgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVhcmx5U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVhcmx5U3RhcnQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVhcmx5IEZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGVhcmx5IGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVhcmx5IEZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RWFybHlGaW5pc2goT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRWFybHlGaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFYXJseUZpbmlzaCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRFYXJseUZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEVhcmx5RmluaXNoIDxlbT5FYXJseSBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVhcmx5IEZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RWFybHlGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVhcmx5RmluaXNoKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MYXRlIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGF0ZSBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxhdGUgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExhdGVTdGFydChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19MYXRlU3RhcnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMYXRlU3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0TGF0ZVN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGF0ZVN0YXJ0IDxlbT5MYXRlIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYXRlIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMYXRlU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExhdGVTdGFydChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGF0ZSBGaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBsYXRlIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxhdGUgRmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYXRlRmluaXNoKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0xhdGVGaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMYXRlRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldExhdGVGaW5pc2goKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMYXRlRmluaXNoIDxlbT5MYXRlIEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGF0ZSBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhdGVGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExhdGVGaW5pc2goT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YXJ0IFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFyaWFuY2Ugb2YgdGhlIHRhc2sgc3RhcnQgZGF0ZSBmcm9tIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJhc2VsaW5lIHN0YXJ0IGRhdGUgYXMgbWludXRlcyB4IDEwMDAuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0VmFyaWFuY2UoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1N0YXJ0VmFyaWFuY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXJ0VmFyaWFuY2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFN0YXJ0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdGFydFZhcmlhbmNlIDxlbT5TdGFydCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXJ0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXJ0VmFyaWFuY2UoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2ggVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YXJpYW5jZSBvZiB0aGUgdGFzayBmaW5pc2ggZGF0ZSBmcm9tIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJhc2VsaW5lIGZpbmlzaCBkYXRlIGFzIG1pbnV0ZXMgeCAxMDAwLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmluaXNoVmFyaWFuY2UoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0ZpbmlzaFZhcmlhbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaW5pc2hWYXJpYW5jZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RmluaXNoVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaW5pc2hWYXJpYW5jZSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpbmlzaFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5pc2hWYXJpYW5jZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YXJpYW5jZSBvZiB0YXNrIHdvcmsgZnJvbSB0aGUgYmFzZWxpbmUgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrIHdvcmsgYXMgbWludXRlcyB4IDEwMDAuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3Vuc2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRXb3JrVmFyaWFuY2UoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Xb3JrVmFyaWFuY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrVmFyaWFuY2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRXb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICN1bnNldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrVmFyaWFuY2UoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRXb3JrVmFyaWFuY2UoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRXb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFdvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RnJlZSBTbGFjazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiBmcmVlIHNsYWNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZyZWUgU2xhY2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZyZWVTbGFjayhCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRnJlZVNsYWNrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGcmVlU2xhY2snIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEZyZWVTbGFjaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZyZWVTbGFjayA8ZW0+RnJlZSBTbGFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RnJlZSBTbGFjazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RnJlZVNsYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGcmVlU2xhY2soQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub3RhbCBTbGFjazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiB0b3RhbCBzbGFjay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub3RhbCBTbGFjazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VG90YWxTbGFjayhCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfVG90YWxTbGFjaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVG90YWxTbGFjaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VG90YWxTbGFjaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFRvdGFsU2xhY2sgPGVtPlRvdGFsIFNsYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ub3RhbCBTbGFjazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VG90YWxTbGFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VG90YWxTbGFjayhCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpeGVkIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmaXhlZCBjb3N0IG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpeGVkIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Rml4ZWRDb3N0KCkKLQkgKiBAc2VlICN1bnNldEZpeGVkQ29zdCgpCi0JICogQHNlZSAjc2V0Rml4ZWRDb3N0KGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRml4ZWRDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRml4ZWRDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0Rml4ZWRDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Rml4ZWRDb3N0IDxlbT5GaXhlZCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaXhlZCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEZpeGVkQ29zdCgpCi0JICogQHNlZSAjdW5zZXRGaXhlZENvc3QoKQotCSAqIEBzZWUgI2dldEZpeGVkQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Rml4ZWRDb3N0KGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpeGVkQ29zdCA8ZW0+Rml4ZWQgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRGaXhlZENvc3QoKQotCSAqIEBzZWUgI2dldEZpeGVkQ29zdCgpCi0JICogQHNlZSAjc2V0Rml4ZWRDb3N0KGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Rml4ZWRDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3QgPGVtPkZpeGVkIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpeGVkIENvc3Q8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEZpeGVkQ29zdCgpCi0JICogQHNlZSAjZ2V0Rml4ZWRDb3N0KCkKLQkgKiBAc2VlICNzZXRGaXhlZENvc3QoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRGaXhlZENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpeGVkIENvc3QgQWNjcnVhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSG93IHRoZSBmaXhlZCBjb3N0IGlzIGFjY3J1ZWQgYWdhaW5zdCB0aGUgdGFzay4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAxPVN0YXJ0LCAyPVByb3JhdGVkIGFuZCAzPUVuZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpeGVkQ29zdEFjY3J1YWwoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkZpeGVkQ29zdEFjY3J1YWxUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaXhlZENvc3RBY2NydWFsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpeGVkQ29zdEFjY3J1YWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3RBY2NydWFsIDxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpeGVkIENvc3QgQWNjcnVhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Rml4ZWRDb3N0QWNjcnVhbChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyY2VudCBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhc2sgZHVyYXRpb24gY29tcGxldGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcmNlbnQgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBlcmNlbnRDb21wbGV0ZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQZXJjZW50Q29tcGxldGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFBlcmNlbnRDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBlcmNlbnRDb21wbGV0ZSA8ZW0+UGVyY2VudCBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGVyY2VudCBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGVyY2VudENvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZXJjZW50Q29tcGxldGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwZXJjZW50YWdlIG9mIHRoZSB0YXNrIHdvcmsgY29tcGxldGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGVyY2VudFdvcmtDb21wbGV0ZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUGVyY2VudFdvcmtDb21wbGV0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGVyY2VudFdvcmtDb21wbGV0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZXJjZW50V29ya0NvbXBsZXRlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHByb2plY3RlZCBvciBzY2hlZHVsZWQgY29zdCBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Db3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzdW0gb2YgdGhlIGFjdHVhbCBhbmQgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3Qgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19PdmVydGltZUNvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J092ZXJ0aW1lQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0T3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2Ygb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE92ZXJ0aW1lV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19PdmVydGltZVdvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVydGltZVdvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0T3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE92ZXJ0aW1lV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxTdGFydChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BY3R1YWxTdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbFN0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsU3RhcnQgPGVtPkFjdHVhbCBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsU3RhcnQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBGaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsRmluaXNoKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0FjdHVhbEZpbmlzaCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbEZpbmlzaCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxGaW5pc2goKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxGaW5pc2ggPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsRmluaXNoKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgRHVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgZHVyYXRpb24gb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIER1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxEdXJhdGlvbihPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BY3R1YWxEdXJhdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbER1cmF0aW9uJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbER1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsRHVyYXRpb24gPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIER1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxEdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsRHVyYXRpb24oT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGNvc3Qgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbENvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0FjdHVhbENvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbENvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldEFjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbENvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBvdmVydGltZSBjb3N0IG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0FjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRBY3R1YWxPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCB3b3JrIGZvciB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BY3R1YWxXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBvdmVydGltZSB3b3JrIGZvciB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0FjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbE92ZXJ0aW1lV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZ3VsYXIgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiBub24tb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZ3VsYXIgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVndWxhcldvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUmVndWxhcldvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZWd1bGFyV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSZWd1bGFyV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlZ3VsYXJXb3JrIDxlbT5SZWd1bGFyIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZ3VsYXIgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlZ3VsYXJXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1haW5pbmcgRHVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2YgdGltZSByZXF1aXJlZCB0byBjb21wbGV0ZSB0aGUgdW5maW5pc2hlZCBwb3J0aW9uIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBEdXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nRHVyYXRpb24oT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUmVtYWluaW5nRHVyYXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdEdXJhdGlvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSZW1haW5pbmdEdXJhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ0R1cmF0aW9uIDxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBEdXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlbWFpbmluZ0R1cmF0aW9uKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1haW5pbmcgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgY29zdCBvZiBjb21wbGV0aW5nIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZW1haW5pbmdDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19SZW1haW5pbmdDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRSZW1haW5pbmdDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgd29yayBzY2hlZHVsZWQgdG8gY29tcGxldGUgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ1dvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUmVtYWluaW5nV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVtYWluaW5nV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgb3ZlcnRpbWUgY29zdCBwcm9qZWN0ZWQgdG8gZmluaXNoIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZW1haW5pbmdPdmVydGltZUNvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1JlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nT3ZlcnRpbWVDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdPdmVydGltZUNvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHJlbWFpbmluZyBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCB0byBmaW5pc2ggdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ092ZXJ0aW1lV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19SZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdPdmVydGltZVdvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIHRhc2sgdG8tZGF0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QUNXUCgpCi0JICogQHNlZSAjc2V0QUNXUChmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0FDV1AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBQ1dQJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QUNXUCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFDV1AgPGVtPkFDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QUNXUCgpCi0JICogQHNlZSAjdW5zZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBQ1dQKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFDV1AgPGVtPkFDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QUNXUCgpCi0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQHNlZSAjc2V0QUNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEFDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFDV1AgPGVtPkFDV1A8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFDV1A8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEFDV1AoKQotCSAqIEBzZWUgI2dldEFDV1AoKQotCSAqIEBzZWUgI3NldEFDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRBQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DVjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRWFybmVkIHZhbHVlIGNvc3QgdmFyaWFuY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q1Y8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI3Vuc2V0Q1YoKQotCSAqIEBzZWUgI3NldENWKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQ1YoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDVicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldENWKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q1YgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DVjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDVigpCi0JICogQHNlZSAjdW5zZXRDVigpCi0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENWKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENWIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRDVigpCi0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBzZWUgI3NldENWKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENWIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q1Y8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENWKCkKLQkgKiBAc2VlICNnZXRDVigpCi0JICogQHNlZSAjc2V0Q1YoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uc3RyYWludCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29uc3RyYWludCBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1BcyBTb29uIEFzIFBvc3NpYmxlLCAxPUFzIExhdGUgQXMgUG9zc2libGUsIDI9TXVzdCBTdGFydCBPbiwgMz1NdXN0IEZpbmlzaCBPbiwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0PVN0YXJ0IE5vIEVhcmxpZXIgVGhhbiwgNT1TdGFydCBObyBMYXRlciBUaGFuLCA2PUZpbmlzaCBObyBFYXJsaWVyIFRoYW4gYW5kIDc9RmluaXNoIE5vIExhdGVyIFRoYW4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25zdHJhaW50IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbnN0cmFpbnRUeXBlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Db25zdHJhaW50VHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNvbnN0cmFpbnRUeXBlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29uc3RyYWludFR5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldENvbnN0cmFpbnRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29uc3RyYWludFR5cGUgPGVtPkNvbnN0cmFpbnQgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29uc3RyYWludCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb25zdHJhaW50VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29uc3RyYWludFR5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWxlbmRhciBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0YXNrIGNhbGVuZGFyLlJlZmVycyB0byBhIHZhbGlkIFVJRCBpbiB0aGUgQ2FsZW5kYXJzIGVsZW1lbnQgb2YgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgTWljcm9zb2Z0IFByb2plY3QgWE1MIFNjaGVtYS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxlbmRhciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhbGVuZGFyVUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19DYWxlbmRhclVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ2FsZW5kYXJVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldENhbGVuZGFyVUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FsZW5kYXIgVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2FsZW5kYXJVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25zdHJhaW50IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIGFyZ3VtZW50IGZvciB0aGUgdGFzayBjb25zdHJhaW50IHR5cGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb25zdHJhaW50RGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Db25zdHJhaW50RGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbnN0cmFpbnREYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldENvbnN0cmFpbnREYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29uc3RyYWludERhdGUgPGVtPkNvbnN0cmFpbnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb25zdHJhaW50RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29uc3RyYWludERhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlYWRsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVhZGxpbmUgZm9yIHRoZSB0YXNrIHRvIGJlIGNvbXBsZXRlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWFkbGluZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVhZGxpbmUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRGVhZGxpbmUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWFkbGluZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXREZWFkbGluZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldERlYWRsaW5lIDxlbT5EZWFkbGluZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVhZGxpbmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlYWRsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWFkbGluZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGV2ZWwgQXNzaWdubWVudHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgbGV2ZWxpbmcgY2FuIGFkanVzdCBhc3NpZ25tZW50cy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAc2VlICN1bnNldExldmVsQXNzaWdubWVudHMoKQotCSAqIEBzZWUgI3NldExldmVsQXNzaWdubWVudHMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0xldmVsQXNzaWdubWVudHMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xldmVsQXNzaWdubWVudHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTGV2ZWxBc3NpZ25tZW50cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxBc3NpZ25tZW50cyA8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldExldmVsQXNzaWdubWVudHMoKQotCSAqIEBzZWUgI3Vuc2V0TGV2ZWxBc3NpZ25tZW50cygpCi0JICogQHNlZSAjaXNMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMZXZlbEFzc2lnbm1lbnRzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNMZXZlbEFzc2lnbm1lbnRzIDxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAc2VlICNpc0xldmVsQXNzaWdubWVudHMoKQotCSAqIEBzZWUgI3NldExldmVsQXNzaWdubWVudHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldExldmVsQXNzaWdubWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxBc3NpZ25tZW50cyA8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAc2VlICNpc0xldmVsQXNzaWdubWVudHMoKQotCSAqIEBzZWUgI3NldExldmVsQXNzaWdubWVudHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldExldmVsQXNzaWdubWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVsaW5nIENhbiBTcGxpdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBsZXZlbGluZyBjYW4gc3BsaXQgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldExldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBzZWUgI3Vuc2V0TGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQHNlZSAjc2V0TGV2ZWxpbmdDYW5TcGxpdChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfTGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGV2ZWxpbmdDYW5TcGxpdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNMZXZlbGluZ0NhblNwbGl0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNMZXZlbGluZ0NhblNwbGl0IDxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRMZXZlbGluZ0NhblNwbGl0KCkKLQkgKiBAc2VlICN1bnNldExldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBzZWUgI2lzTGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGV2ZWxpbmdDYW5TcGxpdChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxpbmdDYW5TcGxpdCA8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldExldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBzZWUgI2lzTGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQHNlZSAjc2V0TGV2ZWxpbmdDYW5TcGxpdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TGV2ZWxpbmdDYW5TcGxpdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNMZXZlbGluZ0NhblNwbGl0IDxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQHNlZSAjaXNMZXZlbGluZ0NhblNwbGl0KCkKLQkgKiBAc2VlICNzZXRMZXZlbGluZ0NhblNwbGl0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRMZXZlbGluZ0NhblNwbGl0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZXZlbGluZyBEZWxheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlbGF5IGNhdXNlZCBieSBsZXZlbGluZyB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBEZWxheTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGV2ZWxpbmdEZWxheShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfTGV2ZWxpbmdEZWxheSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGV2ZWxpbmdEZWxheScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TGV2ZWxpbmdEZWxheSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExldmVsaW5nRGVsYXkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBEZWxheTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGV2ZWxpbmdEZWxheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGV2ZWxpbmdEZWxheShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgZHVyYXRpb24gb2YgdGhlIGRlbGF5LiAgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExldmVsaW5nRGVsYXlGb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0xldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5MZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xldmVsaW5nRGVsYXlGb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldExldmVsaW5nRGVsYXlGb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0IDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGV2ZWxpbmdEZWxheUZvcm1hdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZSBMZXZlbGVkIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzayBiZWZvcmUgaXQgd2FzIGxldmVsZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIExldmVsZWQgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZUxldmVsZWRTdGFydChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19QcmVMZXZlbGVkU3RhcnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmVMZXZlbGVkU3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UHJlTGV2ZWxlZFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJlTGV2ZWxlZFN0YXJ0IDxlbT5QcmUgTGV2ZWxlZCBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIExldmVsZWQgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZUxldmVsZWRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlTGV2ZWxlZFN0YXJ0KE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmUgTGV2ZWxlZCBGaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzayBiZWZvcmUgaXQgd2FzIGxldmVsZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIExldmVsZWQgRmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVMZXZlbGVkRmluaXNoKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1ByZUxldmVsZWRGaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmVMZXZlbGVkRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFByZUxldmVsZWRGaW5pc2goKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmVMZXZlbGVkRmluaXNoIDxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZSBMZXZlbGVkIEZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlTGV2ZWxlZEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlTGV2ZWxlZEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SHlwZXJsaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdGl0bGUgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmsoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfSHlwZXJsaW5rKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSHlwZXJsaW5rVHlwZTIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0h5cGVybGluaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRIeXBlcmxpbmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEh5cGVybGluayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SHlwZXJsaW5rIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0h5cGVybGlua0FkZHJlc3MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5IeXBlcmxpbmtBZGRyZXNzVHlwZTIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0h5cGVybGlua0FkZHJlc3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHlwZXJsaW5rQWRkcmVzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGlua0FkZHJlc3MgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SHlwZXJsaW5rQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SHlwZXJsaW5rQWRkcmVzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZG9jdW1lbnQgYm9va21hcmsgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0h5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0h5cGVybGlua1N1YkFkZHJlc3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgaWdub3JlcyB0aGUgcmVzb3VyY2UgY2FsZW5kYXIuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI3Vuc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQHNlZSAjc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSWdub3JlUmVzb3VyY2VDYWxlbmRhcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyIDxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklnbm9yZSBSZXNvdXJjZSBDYWxlbmRhcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAc2VlICN1bnNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhciA8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQHNlZSAjc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyIDxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklnbm9yZSBSZXNvdXJjZSBDYWxlbmRhcjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQHNlZSAjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNzZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGV4dCBub3RlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vdGVzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX05vdGVzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J05vdGVzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5vdGVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Tm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5vdGVzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IaWRlIEJhcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgR0FOVFQgYmFyIG9mIHRoZSB0YXNrIGlzIGhpZGRlbiB3aGVuIGRpc3BsYXllZCBpbiBNaWNyb3NvZnQgUHJvamVjdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IaWRlIEJhcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIaWRlQmFyKCkKLQkgKiBAc2VlICN1bnNldEhpZGVCYXIoKQotCSAqIEBzZWUgI3NldEhpZGVCYXIoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0hpZGVCYXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0hpZGVCYXInIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSGlkZUJhcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSGlkZUJhciA8ZW0+SGlkZSBCYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhpZGUgQmFyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEhpZGVCYXIoKQotCSAqIEBzZWUgI3Vuc2V0SGlkZUJhcigpCi0JICogQHNlZSAjaXNIaWRlQmFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIaWRlQmFyKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNIaWRlQmFyIDxlbT5IaWRlIEJhcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRIaWRlQmFyKCkKLQkgKiBAc2VlICNpc0hpZGVCYXIoKQotCSAqIEBzZWUgI3NldEhpZGVCYXIoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEhpZGVCYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSGlkZUJhciA8ZW0+SGlkZSBCYXI8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhpZGUgQmFyPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRIaWRlQmFyKCkKLQkgKiBAc2VlICNpc0hpZGVCYXIoKQotCSAqIEBzZWUgI3NldEhpZGVCYXIoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEhpZGVCYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvbGx1cDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgdGFzayBpcyByb2xsZWQgdXAuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sbHVwPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJvbGx1cCgpCi0JICogQHNlZSAjdW5zZXRSb2xsdXAoKQotCSAqIEBzZWUgI3NldFJvbGx1cChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUm9sbHVwKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSb2xsdXAnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUm9sbHVwKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSb2xsdXAgPGVtPlJvbGx1cDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um9sbHVwPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJvbGx1cCgpCi0JICogQHNlZSAjdW5zZXRSb2xsdXAoKQotCSAqIEBzZWUgI2lzUm9sbHVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSb2xsdXAoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JvbGx1cCA8ZW0+Um9sbHVwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJvbGx1cCgpCi0JICogQHNlZSAjaXNSb2xsdXAoKQotCSAqIEBzZWUgI3NldFJvbGx1cChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Um9sbHVwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JvbGx1cCA8ZW0+Um9sbHVwPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xsdXA8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJvbGx1cCgpCi0JICogQHNlZSAjaXNSb2xsdXAoKQotCSAqIEBzZWUgI3NldFJvbGx1cChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Um9sbHVwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dTPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19CQ1dTKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQkNXUycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEJDV1MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QkNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIHRhc2sgdG8tZGF0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0JDV1AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dQJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCQ1dQKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGVyY2VudGFnZSBjb21wbGV0ZSB2YWx1ZSBlbnRlcmVkIGJ5IHRoZSBQcm9qZWN0IE1hbmFnZXIuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY2FuIGJlIHVzZWQgYXMgYW4gYWx0ZXJuYXRpdmUgZm9yIGNhbGN1bGF0aW5nIEJDV1AuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1BoeXNpY2FsUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSA8ZW0+UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWFybmVkIFZhbHVlIE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG1ldGhvZCBmb3IgY2FsY3VsYXRpbmcgZWFybmVkIHZhbHVlLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9UGVyY2VudCBDb21wbGV0ZSwgMT1QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RWFybmVkVmFsdWVNZXRob2QoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0Vhcm5lZFZhbHVlTWV0aG9kKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRWFybmVkVmFsdWVNZXRob2RUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFYXJuZWRWYWx1ZU1ldGhvZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RWFybmVkVmFsdWVNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJuZWRWYWx1ZU1ldGhvZCA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVhcm5lZFZhbHVlTWV0aG9kKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3IgTGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlZmluZXMgdGhlIHByZWRlY2Vzc29yIHRhc2sgb2YgdGhlIHRhc2sgdGhhdCBjb250YWlucyBpdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZWRlY2Vzc29yTGluaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFByZWRlY2Vzc29yTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIHdvcmsgaXMgcHJvdGVjdGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsV29ya1Byb3RlY3RlZChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsV29ya1Byb3RlY3RlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCBvdmVydGltZSB3b3JrIGlzIHByb3RlY3RlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZSBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIGJhY2sgdG8gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgRmllbGQgSUQsIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXh0ZW5kZWRBdHRyaWJ1dGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZWxpbmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIGJhc2VsaW5lIHZhbHVlcyBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlbGluZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0Jhc2VsaW5lKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQmFzZWxpbmUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRCYXNlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0bGluZSBDb2RlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhbHVlIG9mIGFuIG91dGxpbmUgY29kZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgYmFjayB0byB0aGUgb3V0bGluZSBjb2RlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgRmllbGQgSUQsIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19PdXRsaW5lQ29kZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdXRsaW5lQ29kZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE91dGxpbmVDb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdGltZSBwaGFzZWQgZGF0YSBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfVGltZXBoYXNlZERhdGEoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGltZXBoYXNlZERhdGEnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRUaW1lcGhhc2VkRGF0YSgpOwotCi19IC8vIFRhc2sKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UYXNrcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Rhc2tzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwZjY5NzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Rhc2tzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRhc2tzLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFza3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrcyNnZXRUYXNrIDxlbT5UYXNrPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza3MoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Rhc2tzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2tzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFzazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSB0YXNrIGluIGVhY2ggVGFza3MgY29sbGVjdGlvbi4KLQkgKiAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tzX1Rhc2soKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2siIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Rhc2snIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRUYXNrKCk7Ci0KLX0gLy8gVGFza3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UaW1lUGVyaW9kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVGltZVBlcmlvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZGE3N2NhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UaW1lUGVyaW9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRpbWVQZXJpb2QuamF2YSx2IDEuMiAyMDA2LzA0LzExIDE1OjI5OjU1IGp0aGFyaW8gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRpbWUgUGVyaW9kPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZCNnZXRGcm9tRGF0ZSA8ZW0+RnJvbSBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QjZ2V0VG9EYXRlIDxlbT5UbyBEYXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGltZVBlcmlvZCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGltZVBlcmlvZF8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUaW1lUGVyaW9kIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RnJvbSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYmVnaW5uaW5nIG9mIHRoZSBleGNlcHRpb24gdGltZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RnJvbSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGcm9tRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGltZVBlcmlvZF9Gcm9tRGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Zyb21EYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZyb21EYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QjZ2V0RnJvbURhdGUgPGVtPkZyb20gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RnJvbSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGcm9tRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RnJvbURhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBlbmQgb2YgdGhlIGV4Y2VwdGlvbiB0aW1lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UbyBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUb0RhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRpbWVQZXJpb2RfVG9EYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVG9EYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFRvRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kI2dldFRvRGF0ZSA8ZW0+VG8gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VG8gRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VG9EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUb0RhdGUoT2JqZWN0IHZhbHVlKTsKLQotfSAvLyBUaW1lUGVyaW9kCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVGltZXBoYXNlZERhdGFUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVGltZXBoYXNlZERhdGFUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3OTVhMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1RpbWVwaGFzZWREYXRhVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGltZXBoYXNlZERhdGFUeXBlLmphdmEsdiAxLjIgMjAwNi8wNC8xMSAxNToyOTo1NSBqdGhhcmlvIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIGRlZmluaXRpb24gb2YgdGhlIHRpbWUgcGhhc2VkIGRhdGEgYmxvY2suCi0gKiAJCSAgICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFVuaXQgPGVtPlVuaXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRpbWVwaGFzZWREYXRhVHlwZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGltZXBoYXNlZERhdGFUeXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGltZXBoYXNlZERhdGFUeXBlIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogICAgICAgICAgICAgICAgIFRoZSB0eXBlIG9mIHRhc2sgdGltZXBoYXNlZCBkYXRhLiBWYWx1ZXMgYXJlOgotCSAqICAgICAgICAgICAgICAgICAgICAgMT1Bc3NpZ25tZW50IFJlbWFpbmluZyBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAyPUFzc2lnbm1lbnQgQWN0dWFsIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDM9QXNzaWdubWVudCBBY3R1YWwgT3ZlcnRpbWUgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgND1Bc3NpZ25tZW50IEJhc2VsaW5lIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDU9QXNzaWdubWVudCBCYXNlbGluZSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA2PUFzc2lnbm1lbnQgQWN0dWFsIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDc9UmVzb3VyY2UgQmFzZWxpbmUgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgOD1SZXNvdXJjZSBCYXNlbGluZSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA5PVRhc2sgQmFzZWxpbmUgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMTA9VGFzayBCYXNlbGluZSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAxMT1UYXNrIFBlcmNlbnQgQ29tcGxldGUKLQkgKiAgICAgICAgICAgICAgICAgICAgIDE2PUFzc2lnbm1lbnQgQmFzZWxpbmUgMSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAxNz1Bc3NpZ25tZW50IEJhc2VsaW5lIDEgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMTg9VGFzayBCYXNlbGluZSAxIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDE5PVRhc2sgQmFzZWxpbmUgMSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAyMD1SZXNvdXJjZSBCYXNlbGluZSAxIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDIxPVJlc291cmNlIEJhc2VsaW5lIDEgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMjI9QXNzaWdubWVudCBCYXNlbGluZSAyIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDIzPUFzc2lnbm1lbnQgQmFzZWxpbmUgMiBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAyND1UYXNrIEJhc2VsaW5lIDIgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMjU9VGFzayBCYXNlbGluZSAyIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDI2PVJlc291cmNlIEJhc2VsaW5lIDIgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMjc9UmVzb3VyY2UgQmFzZWxpbmUgMiBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAyOD1Bc3NpZ25tZW50IEJhc2VsaW5lIDMgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMjk9QXNzaWdubWVudCBCYXNlbGluZSAzIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDMwPVRhc2sgQmFzZWxpbmUgMyBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAzMT1UYXNrIEJhc2VsaW5lIDMgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMzI9UmVzb3VyY2UgQmFzZWxpbmUgMyBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAzMz1SZXNvdXJjZSBCYXNlbGluZSAzIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDM0PUFzc2lnbm1lbnQgQmFzZWxpbmUgNCBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAzNT1Bc3NpZ25tZW50IEJhc2VsaW5lIDQgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMzY9VGFzayBCYXNlbGluZSA0IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDM3PVRhc2sgQmFzZWxpbmUgNCBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAzOD1SZXNvdXJjZSBCYXNlbGluZSA0IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDM5PVJlc291cmNlIEJhc2VsaW5lIDQgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNDA9QXNzaWdubWVudCBCYXNlbGluZSA1IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQxPUFzc2lnbm1lbnQgQmFzZWxpbmUgNSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA0Mj1UYXNrIEJhc2VsaW5lIDUgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNDM9VGFzayBCYXNlbGluZSA1IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQ0PVJlc291cmNlIEJhc2VsaW5lIDUgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNDU9UmVzb3VyY2UgQmFzZWxpbmUgNSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA0Nj1Bc3NpZ25tZW50IEJhc2VsaW5lIDYgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNDc9QXNzaWdubWVudCBCYXNlbGluZSA2IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQ4PVRhc2sgQmFzZWxpbmUgNiBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA0OT1UYXNrIEJhc2VsaW5lIDYgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNTA9UmVzb3VyY2UgQmFzZWxpbmUgNiBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA1MT1SZXNvdXJjZSBCYXNlbGluZSA2IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDUyPUFzc2lnbm1lbnQgQmFzZWxpbmUgNyBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA1Mz1Bc3NpZ25tZW50IEJhc2VsaW5lIDcgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNTQ9VGFzayBCYXNlbGluZSA3IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDU1PVRhc2sgQmFzZWxpbmUgNyBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA1Nj1SZXNvdXJjZSBCYXNlbGluZSA3IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDU3PVJlc291cmNlIEJhc2VsaW5lIDcgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNTg9QXNzaWdubWVudCBCYXNlbGluZSA4IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDU5PUFzc2lnbm1lbnQgQmFzZWxpbmUgOCBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA2MD1UYXNrIEJhc2VsaW5lIDggV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNjE9VGFzayBCYXNlbGluZSA4IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDYyPVJlc291cmNlIEJhc2VsaW5lIDggV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNjM9UmVzb3VyY2UgQmFzZWxpbmUgOCBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA2ND1Bc3NpZ25tZW50IEJhc2VsaW5lIDkgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNjU9QXNzaWdubWVudCBCYXNlbGluZSA5IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDY2PVRhc2sgQmFzZWxpbmUgOSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA2Nz1UYXNrIEJhc2VsaW5lIDkgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNjg9UmVzb3VyY2UgQmFzZWxpbmUgOSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA2OT1SZXNvdXJjZSBCYXNlbGluZSA5IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDcwPUFzc2lnbm1lbnQgQmFzZWxpbmUgMTAgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNzE9QXNzaWdubWVudCBCYXNlbGluZSAxMCBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA3Mj1UYXNrIEJhc2VsaW5lIDEwIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDczPVRhc2sgQmFzZWxpbmUgMTAgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNzQ9UmVzb3VyY2UgQmFzZWxpbmUgMTAgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNzU9UmVzb3VyY2UgQmFzZWxpbmUgMTAgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNzY9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZQotCSAqICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRpbWVwaGFzZWREYXRhVHlwZV9UeXBlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVHlwZVR5cGUzIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRpbWVwaGFzZWQgZGF0YSByZWNvcmQuCi0JICogICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRpbWVwaGFzZWREYXRhVHlwZV9VSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHRpbWVwaGFzZWQgZGF0YSBwZXJpb2QuCi0JICogICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRpbWVwaGFzZWREYXRhVHlwZV9TdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZpbmlzaCBkYXRlIG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLgotCSAqICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaW5pc2goT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRpbWVwaGFzZWREYXRhVHlwZV9GaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaW5pc2gnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpbWUgdW5pdCBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4gCi0JICogICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9bSwgMT1oLCAyPWQsIDM9dywgNT1tbywgOD15Ci0JICogICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vbml0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVbml0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGltZXBoYXNlZERhdGFUeXBlX1VuaXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Vbml0VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVW5pdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VW5pdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VW5pdCA8ZW0+VW5pdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5pdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VW5pdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFsdWUgcGVyIHVuaXQgb2YgdGltZSBmb3IgdGhlIHRpbWVwaGFzZWQgZGF0YSBwZXJpb2QuCi0JICogICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRpbWVwaGFzZWREYXRhVHlwZV9WYWx1ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gVGltZXBoYXNlZERhdGFUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVmFsdWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNTk2YzcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVmFsdWUuamF2YSx2IDEuMiAyMDA2LzA0LzExIDE1OjI5OjU1IGp0aGFyaW8gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRQYXJlbnRWYWx1ZUlEIDxlbT5QYXJlbnQgVmFsdWUgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdWYWx1ZV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBWYWx1ZSBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSBvdXRsaW5lIGNvZGUgdmFsdWUgYWNyb3NzIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlX1ZhbHVlSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyZW50IFZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFsdWUgb2YgdGhlIHBhcmVudCBub2RlIG9mIHRoZSBvdXRsaW5lIGNvZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcmVudCBWYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFyZW50VmFsdWVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlX1BhcmVudFZhbHVlSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1BhcmVudFZhbHVlSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFBhcmVudFZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0UGFyZW50VmFsdWVJRCA8ZW0+UGFyZW50IFZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJlbnQgVmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhcmVudFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcmVudFZhbHVlSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCB2YWx1ZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZV9WYWx1ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIGRlc2NyaXB0aW9uIG9mIHRoaXMgdmFsdWUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWVfRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVzY3JpcHRpb24nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gVmFsdWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZTIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWJkOTEzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVmFsdWUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBWYWx1ZTIuamF2YSx2IDEuMiAyMDA2LzA0LzExIDE1OjI5OjU1IGp0aGFyaW8gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFsdWUyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldElEIDxlbT5JRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZTIoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ZhbHVlXy5fMV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBWYWx1ZTIgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVW5pcXVlIElEIG9mIHZhbHVlIGFjcm9zcyAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZTJfSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0SUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldElEIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHZhbHVlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlMl9WYWx1ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB2YWx1ZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBsaXN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlMl9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZXNjcmlwdGlvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gVmFsdWUyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVmFsdWVMaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVmFsdWVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4YmQ3ZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ZhbHVlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBWYWx1ZUxpc3QuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYWx1ZSBMaXN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlTGlzdCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVmFsdWVMaXN0Xy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhbHVlTGlzdCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhbHVlcyB0aGF0IG1ha2UgdXAgdGhlIHZhbHVlIGxpc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWVMaXN0X1ZhbHVlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFZhbHVlKCk7Ci0KLX0gLy8gVmFsdWVMaXN0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVmFsdWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVmFsdWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzMzBjMzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ZhbHVlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBWYWx1ZXMuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlZhbHVlczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlcyNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlcygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVmFsdWVzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhbHVlcyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlc19Hcm91cCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGluZGl2aWR1YWwgdmFsdWVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZXNfVmFsdWUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZScgZ3JvdXA9JyNncm91cDowJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0VmFsdWUoKTsKLQotfSAvLyBWYWx1ZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9XQlNNYXNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV0JTTWFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNzVlZjQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9XQlNNYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXQlNNYXNrLmphdmEsdiAxLjIgMjAwNi8wNC8xMSAxNToyOTo1NSBqdGhhcmlvIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldCUyBNYXNrPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2soKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dCU01hc2tfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV0JTTWFzayBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGV2ZWwgb2YgdGhlIG1hc2suCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMZXZlbChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2tfTGV2ZWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TGV2ZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGV2ZWwoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdHlwZSBvZiB0aGUgbm9kZSB2YWx1ZS4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWVzIGFyZTogMD1OdW1iZXJzLCAxPVVwcGVyY2FzZSBMZXR0ZXJzLCAyPUxvd2VyY2FzZSBMZXR0ZXJzLCAzPUNoYXJhY3RlcnMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXQlNNYXNrX1R5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UeXBlVHlwZTIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxlbmd0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG1heGltdW0gbGVuZ3RoIGluIGNoYXJhY3RlcnMuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBvbWl0dGVkIHdoZW4gbGVuZ3RoIGlzICJhbnkiLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExlbmd0aChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V0JTTWFza19MZW5ndGgoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xlbmd0aCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRMZW5ndGggPGVtPkxlbmd0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGVuZ3RoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExlbmd0aChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VwYXJhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2VwYXJhdG9yIGNoYXJhY3RlciBvZiB0aGUgbm9kZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VwYXJhdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZXBhcmF0b3IoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2tfU2VwYXJhdG9yKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTZXBhcmF0b3InIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2VwYXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0U2VwYXJhdG9yIDxlbT5TZXBhcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcGFyYXRvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2VwYXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZXBhcmF0b3IoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBXQlNNYXNrCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV0JTTWFza3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9XQlNNYXNrcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OWVhMWZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9XQlNNYXNrcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV0JTTWFza3MuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XQlMgTWFza3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNpc1ZlcmlmeVVuaXF1ZUNvZGVzIDxlbT5WZXJpZnkgVW5pcXVlIENvZGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzR2VuZXJhdGVDb2RlcyA8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjZ2V0V0JTTWFzayA8ZW0+V0JTIE1hc2s8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXQlNNYXNrcygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV0JTTWFza3NfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV0JTTWFza3MgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJpZnkgVW5pcXVlIENvZGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIFdCUyBjb2RlcyBhcmUgdW5pcXVlIGZvciBuZXcgdGFza3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBzZWUgI3Vuc2V0VmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBzZWUgI3NldFZlcmlmeVVuaXF1ZUNvZGVzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V0JTTWFza3NfVmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWZXJpZnlVbmlxdWVDb2RlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNWZXJpZnlVbmlxdWVDb2RlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNpc1ZlcmlmeVVuaXF1ZUNvZGVzIDxlbT5WZXJpZnkgVW5pcXVlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJpZnkgVW5pcXVlIENvZGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAc2VlICN1bnNldFZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAc2VlICNpc1ZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWZXJpZnlVbmlxdWVDb2Rlcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNpc1ZlcmlmeVVuaXF1ZUNvZGVzIDxlbT5WZXJpZnkgVW5pcXVlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAc2VlICNpc1ZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAc2VlICNzZXRWZXJpZnlVbmlxdWVDb2Rlcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VmVyaWZ5VW5pcXVlQ29kZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNpc1ZlcmlmeVVuaXF1ZUNvZGVzIDxlbT5WZXJpZnkgVW5pcXVlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJpZnkgVW5pcXVlIENvZGVzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQHNlZSAjaXNWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQHNlZSAjc2V0VmVyaWZ5VW5pcXVlQ29kZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFZlcmlmeVVuaXF1ZUNvZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBDb2RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBXQlMgY29kZXMgYXJlIGdlbmVyYXRlZCBmb3IgbmV3IHRhc2tzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZSBDb2RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAc2VlICN1bnNldEdlbmVyYXRlQ29kZXMoKQotCSAqIEBzZWUgI3NldEdlbmVyYXRlQ29kZXMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXQlNNYXNrc19HZW5lcmF0ZUNvZGVzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nR2VuZXJhdGVDb2RlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNHZW5lcmF0ZUNvZGVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzR2VuZXJhdGVDb2RlcyA8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlIENvZGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEdlbmVyYXRlQ29kZXMoKQotCSAqIEBzZWUgI3Vuc2V0R2VuZXJhdGVDb2RlcygpCi0JICogQHNlZSAjaXNHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHZW5lcmF0ZUNvZGVzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzR2VuZXJhdGVDb2RlcyA8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0R2VuZXJhdGVDb2RlcygpCi0JICogQHNlZSAjaXNHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAc2VlICNzZXRHZW5lcmF0ZUNvZGVzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRHZW5lcmF0ZUNvZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNHZW5lcmF0ZUNvZGVzIDxlbT5HZW5lcmF0ZSBDb2RlczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEdlbmVyYXRlQ29kZXMoKQotCSAqIEBzZWUgI2lzR2VuZXJhdGVDb2RlcygpCi0JICogQHNlZSAjc2V0R2VuZXJhdGVDb2Rlcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0R2VuZXJhdGVDb2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcHJlZml4IGZvciBhbGwgV0JTIGNvZGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZWZpeChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V0JTTWFza3NfUHJlZml4KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZml4VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlZml4JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByZWZpeCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWZpeChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V0JTIE1hc2s8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIFdCUyBNYXNrIHRoYXQgaXMgYXBwbGllZCB0byBhbGwgdGFza3MgaW4gdGhlIFByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldCUyBNYXNrPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2tzX1dCU01hc2soKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2siIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dCU01hc2snIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRXQlNNYXNrKCk7Ci0KLX0gLy8gV0JTTWFza3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9XZWVrRGF5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV2Vla0RheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjM2RlMmZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9XZWVrRGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXZWVrRGF5LmphdmEsdiAxLjIgMjAwNi8wNC8xMSAxNToyOTo1NSBqdGhhcmlvIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldlZWsgRGF5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNnZXREYXlUeXBlIDxlbT5EYXkgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2lzRGF5V29ya2luZyA8ZW0+RGF5IFdvcmtpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNnZXRUaW1lUGVyaW9kIDxlbT5UaW1lIFBlcmlvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldFdvcmtpbmdUaW1lcyA8ZW0+V29ya2luZyBUaW1lczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdlZWtEYXkoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dlZWtEYXlfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2Vla0RheSBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRheSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdHlwZSBvZiBkYXkuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9RXhjZXB0aW9uLCAxPU1vbmRheSwgMj1UdWVzZGF5LCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzPVdlZG5lc2RheSwgND1UaHVyc2RheSwgNT1GcmlkYXksIDY9U2F0dXJkYXksIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc9U3VuZGF5Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRheSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREYXlUeXBlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V2Vla0RheV9EYXlUeXBlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRGF5VHlwZVR5cGUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEYXlUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREYXlUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0RGF5VHlwZSA8ZW0+RGF5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRheSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREYXlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREYXlUeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGF5IFdvcmtpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHNwZWNpZmllZCBkYXRlIG9yIGRheSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGlzIHdvcmtpbmcuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRheSBXb3JraW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERheVdvcmtpbmcoKQotCSAqIEBzZWUgI3Vuc2V0RGF5V29ya2luZygpCi0JICogQHNlZSAjc2V0RGF5V29ya2luZyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdlZWtEYXlfRGF5V29ya2luZygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGF5V29ya2luZycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNEYXlXb3JraW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjaXNEYXlXb3JraW5nIDxlbT5EYXkgV29ya2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGF5IFdvcmtpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGF5V29ya2luZygpCi0JICogQHNlZSAjdW5zZXREYXlXb3JraW5nKCkKLQkgKiBAc2VlICNpc0RheVdvcmtpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERheVdvcmtpbmcoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNpc0RheVdvcmtpbmcgPGVtPkRheSBXb3JraW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldERheVdvcmtpbmcoKQotCSAqIEBzZWUgI2lzRGF5V29ya2luZygpCi0JICogQHNlZSAjc2V0RGF5V29ya2luZyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RGF5V29ya2luZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjaXNEYXlXb3JraW5nIDxlbT5EYXkgV29ya2luZzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF5IFdvcmtpbmc8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldERheVdvcmtpbmcoKQotCSAqIEBzZWUgI2lzRGF5V29ya2luZygpCi0JICogQHNlZSAjc2V0RGF5V29ya2luZyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RGF5V29ya2luZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZSBQZXJpb2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlZmluZXMgYSBjb250aWd1b3VzIHNldCBvZiBleGNlcHRpb24gZGF5cy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFRpbWVQZXJpb2QoVGltZVBlcmlvZCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXZWVrRGF5X1RpbWVQZXJpb2QoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUaW1lUGVyaW9kJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGltZVBlcmlvZCBnZXRUaW1lUGVyaW9kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0VGltZVBlcmlvZCA8ZW0+VGltZSBQZXJpb2Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRpbWUgUGVyaW9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRUaW1lUGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUaW1lUGVyaW9kKFRpbWVQZXJpb2QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29ya2luZyBUaW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvbGxlY3Rpb24gb2Ygd29ya2luZyB0aW1lcyB0aGF0IGRlZmluZSB0aGUgdGltZSB3b3JrZWQgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIHdlZWtkYXkuICBPbmUgb2YgdGhlc2UgbXVzdCBiZSBwcmVzZW50LCBhbmQgdGhlcmUgbWF5IGJlIG5vIG1vcmUgdGhhbiBmaXZlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRXb3JraW5nVGltZXMoV29ya2luZ1RpbWVzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdlZWtEYXlfV29ya2luZ1RpbWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV29ya2luZ1RpbWVzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya2luZ1RpbWVzIGdldFdvcmtpbmdUaW1lcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldFdvcmtpbmdUaW1lcyA8ZW0+V29ya2luZyBUaW1lczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29ya2luZyBUaW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0V29ya2luZ1RpbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JraW5nVGltZXMoV29ya2luZ1RpbWVzIHZhbHVlKTsKLQotfSAvLyBXZWVrRGF5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV2Vla0RheXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9XZWVrRGF5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMDdlZmE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9XZWVrRGF5cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXZWVrRGF5cy5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldlZWsgRGF5czwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzI2dldFdlZWtEYXkgPGVtPldlZWsgRGF5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V2Vla0RheXMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dlZWtEYXlzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlZWtEYXlzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2VlayBEYXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSB3ZWVrZGF5IGVpdGhlciBkZWZpbmVzIHJlZ3VsYXIgZGF5cyAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB3ZWVrIG9yIGV4Y2VwdGlvbiBkYXlzIGluIHRoZSBjYWxlbmRhci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2VlayBEYXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V2Vla0RheXNfV2Vla0RheSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV2Vla0RheScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFdlZWtEYXkoKTsKLQotfSAvLyBXZWVrRGF5cwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dvcmtpbmdUaW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV29ya2luZ1RpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmRiOTIxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV29ya2luZ1RpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya2luZ1RpbWUuamF2YSx2IDEuMiAyMDA2LzA0LzExIDE1OjI5OjU1IGp0aGFyaW8gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmtpbmcgVGltZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lI2dldEZyb21UaW1lIDxlbT5Gcm9tIFRpbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUjZ2V0VG9UaW1lIDxlbT5UbyBUaW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V29ya2luZ1RpbWUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtpbmdUaW1lXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtpbmdUaW1lIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RnJvbSBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYmVnaW5uaW5nIG9mIHRoZSB3b3JraW5nIHRpbWUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Gcm9tIFRpbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZyb21UaW1lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXb3JraW5nVGltZV9Gcm9tVGltZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRnJvbVRpbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RnJvbVRpbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUjZ2V0RnJvbVRpbWUgPGVtPkZyb20gVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RnJvbSBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGcm9tVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RnJvbVRpbWUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvIFRpbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBlbmQgb2YgdGhlIHdvcmtpbmcgIHRpbWUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UbyBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUb1RpbWUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdvcmtpbmdUaW1lX1RvVGltZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVG9UaW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFRvVGltZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZSNnZXRUb1RpbWUgPGVtPlRvIFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRvIFRpbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRvVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VG9UaW1lKE9iamVjdCB2YWx1ZSk7Ci0KLX0gLy8gV29ya2luZ1RpbWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Xb3JraW5nVGltZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Xb3JraW5nVGltZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzU5MzRhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV29ya2luZ1RpbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtpbmdUaW1lcy5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmtpbmcgVGltZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXMjZ2V0V29ya2luZ1RpbWUgPGVtPldvcmtpbmcgVGltZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdvcmtpbmdUaW1lcygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV29ya2luZ1RpbWVzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtpbmdUaW1lcyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmtpbmcgVGltZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVmaW5lcyB0aGUgd29ya2luZyB0aW1lIGR1cmluZyB0aGUgd2Vla2RheS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmtpbmcgVGltZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXb3JraW5nVGltZXNfV29ya2luZ1RpbWUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiB1cHBlcj0iNSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV29ya2luZ1RpbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRXb3JraW5nVGltZSgpOwotCi19IC8vIFdvcmtpbmdUaW1lcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQXNzaWdubWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Fzc2lnbm1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU4MGYzMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQXNzaWdubWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MDAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBc3NpZ25tZW50SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Bc3NpZ25tZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRUYXNrVUlEIDxlbT5UYXNrIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFJlc291cmNlVUlEIDxlbT5SZXNvdXJjZSBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEFjdHVhbEZpbmlzaCA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0QWN0dWFsU3RhcnQgPGVtPkFjdHVhbCBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2lzQ29uZmlybWVkIDxlbT5Db25maXJtZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0Q29zdFJhdGVUYWJsZSA8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0Q1YgPGVtPkNWPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0RGVsYXkgPGVtPkRlbGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRGaW5pc2hWYXJpYW5jZSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2lzSGFzRml4ZWRSYXRlVW5pdHMgPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjaXNGaXhlZE1hdGVyaWFsIDxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldExldmVsaW5nRGVsYXkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjaXNMaW5rZWRGaWVsZHMgPGVtPkxpbmtlZCBGaWVsZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNpc01pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjaXNPdmVyYWxsb2NhdGVkIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2lzUmVzcG9uc2VQZW5kaW5nIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0U3RvcCA8ZW0+U3RvcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFJlc3VtZSA8ZW0+UmVzdW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0U3RhcnRWYXJpYW5jZSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRVbml0cyA8ZW0+VW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNpc1VwZGF0ZU5lZWRlZCA8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFZBQyA8ZW0+VkFDPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFdvcmtDb250b3VyIDxlbT5Xb3JrIENvbnRvdXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEJvb2tpbmdUeXBlIDxlbT5Cb29raW5nIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRCYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXNzaWdubWVudEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFzc2lnbm1lbnQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFza1VJRCgpIDxlbT5UYXNrIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFza1VJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRBU0tfVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhc2tVSUQoKSA8ZW0+VGFzayBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhc2tVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHRhc2tVSUQgPSBUQVNLX1VJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZVVJRCgpIDxlbT5SZXNvdXJjZSBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUkVTT1VSQ0VfVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVUlEKCkgPGVtPlJlc291cmNlIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHJlc291cmNlVUlEID0gUkVTT1VSQ0VfVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBwZXJjZW50V29ya0NvbXBsZXRlID0gUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbENvc3QoKSA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBBQ1RVQUxfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxDb3N0KCkgPGVtPkFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBhY3R1YWxDb3N0ID0gQUNUVUFMX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsRmluaXNoKCkgPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX0ZJTklTSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxGaW5pc2goKSA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbEZpbmlzaCA9IEFDVFVBTF9GSU5JU0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgYWN0dWFsT3ZlcnRpbWVDb3N0ID0gQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9PVkVSVElNRV9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbE92ZXJ0aW1lV29yayA9IEFDVFVBTF9PVkVSVElNRV9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFN0YXJ0KCkgPGVtPkFjdHVhbCBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9TVEFSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxTdGFydCgpIDxlbT5BY3R1YWwgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbFN0YXJ0ID0gQUNUVUFMX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFdvcmsoKSA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFdvcmsoKSA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsV29yayA9IEFDVFVBTF9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFDV1AoKSA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBBQ1dQX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFDV1AoKSA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGFDV1AgPSBBQ1dQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBQ1dQIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhQ1dQRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ29uZmlybWVkKCkgPGVtPkNvbmZpcm1lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDb25maXJtZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBDT05GSVJNRURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ29uZmlybWVkKCkgPGVtPkNvbmZpcm1lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDb25maXJtZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvbmZpcm1lZCA9IENPTkZJUk1FRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ29uZmlybWVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25maXJtZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGNvc3QgPSBDT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RSYXRlVGFibGUoKSA8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0UmF0ZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQ09TVF9SQVRFX1RBQkxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RSYXRlVGFibGUoKSA8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0UmF0ZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBjb3N0UmF0ZVRhYmxlID0gQ09TVF9SQVRFX1RBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RWYXJpYW5jZSgpIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQ09TVF9WQVJJQU5DRV9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0VmFyaWFuY2UoKSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgY29zdFZhcmlhbmNlID0gQ09TVF9WQVJJQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ29zdCBWYXJpYW5jZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29zdFZhcmlhbmNlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENWKCkgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDVigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBDVl9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDVigpIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBjViA9IENWX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDViBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY1ZFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVsYXkoKSA8ZW0+RGVsYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREVMQVlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVsYXkoKSA8ZW0+RGVsYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkZWxheSA9IERFTEFZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaCgpIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgRklOSVNIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaCgpIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBmaW5pc2ggPSBGSU5JU0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoVmFyaWFuY2UoKSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2hWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hWYXJpYW5jZSgpIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBmaW5pc2hWYXJpYW5jZSA9IEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmsoKSA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmsoKSA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rID0gSFlQRVJMSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua0FkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua0FkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rQWRkcmVzcyA9IEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzcyA9IEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrVmFyaWFuY2UoKSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1ZhcmlhbmNlKCkgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IHdvcmtWYXJpYW5jZSA9IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFdvcmsgVmFyaWFuY2UgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHdvcmtWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hhc0ZpeGVkUmF0ZVVuaXRzKCkgPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSEFTX0ZJWEVEX1JBVEVfVU5JVFNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSGFzRml4ZWRSYXRlVW5pdHMoKSA8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSGFzRml4ZWRSYXRlVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc0ZpeGVkUmF0ZVVuaXRzID0gSEFTX0ZJWEVEX1JBVEVfVU5JVFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEhhcyBGaXhlZCBSYXRlIFVuaXRzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNGaXhlZFJhdGVVbml0c0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpeGVkTWF0ZXJpYWwoKSA8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRml4ZWRNYXRlcmlhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEZJWEVEX01BVEVSSUFMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpeGVkTWF0ZXJpYWwoKSA8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRml4ZWRNYXRlcmlhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZml4ZWRNYXRlcmlhbCA9IEZJWEVEX01BVEVSSUFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBGaXhlZCBNYXRlcmlhbCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZml4ZWRNYXRlcmlhbEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbGluZ0RlbGF5KCkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTEVWRUxJTkdfREVMQVlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWxpbmdEZWxheSgpIDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWxpbmdEZWxheSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgbGV2ZWxpbmdEZWxheSA9IExFVkVMSU5HX0RFTEFZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKSA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKSA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5Rm9ybWF0ID0gTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTGlua2VkRmllbGRzKCkgPGVtPkxpbmtlZCBGaWVsZHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGlua2VkRmllbGRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTElOS0VEX0ZJRUxEU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMaW5rZWRGaWVsZHMoKSA8ZW0+TGlua2VkIEZpZWxkczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNMaW5rZWRGaWVsZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGxpbmtlZEZpZWxkcyA9IExJTktFRF9GSUVMRFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIExpbmtlZCBGaWVsZHMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGxpbmtlZEZpZWxkc0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01pbGVzdG9uZSgpIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUlMRVNUT05FX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01pbGVzdG9uZSgpIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtaWxlc3RvbmUgPSBNSUxFU1RPTkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE1pbGVzdG9uZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWlsZXN0b25lRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vdGVzKCkgPGVtPk5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9URVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90ZXMoKSA8ZW0+Tm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5vdGVzID0gTk9URVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNPdmVyYWxsb2NhdGVkKCkgPGVtPk92ZXJhbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzT3ZlcmFsbG9jYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE9WRVJBTExPQ0FURURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzT3ZlcmFsbG9jYXRlZCgpIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc092ZXJhbGxvY2F0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG92ZXJhbGxvY2F0ZWQgPSBPVkVSQUxMT0NBVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBPdmVyYWxsb2NhdGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvdmVyYWxsb2NhdGVkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lQ29zdCgpIDxlbT5PdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBPVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lQ29zdCgpIDxlbT5PdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIG92ZXJ0aW1lQ29zdCA9IE9WRVJUSU1FX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVXb3JrKCkgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVdvcmsoKSA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IG92ZXJ0aW1lV29yayA9IE9WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVndWxhcldvcmsoKSA8ZW0+UmVndWxhciBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVHVUxBUl9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZ3VsYXJXb3JrKCkgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVndWxhcldvcmsgPSBSRUdVTEFSX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nQ29zdCgpIDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFJFTUFJTklOR19DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ0Nvc3QoKSA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIHJlbWFpbmluZ0Nvc3QgPSBSRU1BSU5JTkdfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCByZW1haW5pbmdPdmVydGltZUNvc3QgPSBSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVtYWluaW5nT3ZlcnRpbWVXb3JrID0gUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nV29yaygpIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVNQUlOSU5HX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nV29yaygpIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZW1haW5pbmdXb3JrID0gUkVNQUlOSU5HX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXNwb25zZVBlbmRpbmcoKSA8ZW0+UmVzcG9uc2UgUGVuZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRVNQT05TRV9QRU5ESU5HX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Jlc3BvbnNlUGVuZGluZygpIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Jlc3BvbnNlUGVuZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzcG9uc2VQZW5kaW5nID0gUkVTUE9OU0VfUEVORElOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVzcG9uc2UgUGVuZGluZyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzcG9uc2VQZW5kaW5nRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RvcCgpIDxlbT5TdG9wPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdG9wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9QX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0b3AoKSA8ZW0+U3RvcDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RvcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBzdG9wID0gU1RPUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXN1bWUoKSA8ZW0+UmVzdW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXN1bWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJFU1VNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXN1bWUoKSA8ZW0+UmVzdW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXN1bWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVzdW1lID0gUkVTVU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0VmFyaWFuY2UoKSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBTVEFSVF9WQVJJQU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydFZhcmlhbmNlKCkgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBzdGFydFZhcmlhbmNlID0gU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5pdHMoKSA8ZW0+VW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFVOSVRTX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaXRzKCkgPGVtPlVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IHVuaXRzID0gVU5JVFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFVuaXRzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1bml0c0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VwZGF0ZU5lZWRlZCgpIDxlbT5VcGRhdGUgTmVlZGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1VwZGF0ZU5lZWRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFVQREFURV9ORUVERURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXBkYXRlTmVlZGVkKCkgPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVXBkYXRlTmVlZGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVOZWVkZWQgPSBVUERBVEVfTkVFREVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBVcGRhdGUgTmVlZGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVOZWVkZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VkFDKCkgPGVtPlZBQzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VkFDKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFZBQ19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWQUMoKSA8ZW0+VkFDPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWQUMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCB2QUMgPSBWQUNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFZBQyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdkFDRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgd29yayA9IFdPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya0NvbnRvdXIoKSA8ZW0+V29yayBDb250b3VyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrQ29udG91cigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFdPUktfQ09OVE9VUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrQ29udG91cigpIDxlbT5Xb3JrIENvbnRvdXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtDb250b3VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB3b3JrQ29udG91ciA9IFdPUktfQ09OVE9VUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dTID0gQkNXU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXU0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXUF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dQID0gQkNXUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXUEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCb29raW5nVHlwZSgpIDxlbT5Cb29raW5nIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJvb2tpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQk9PS0lOR19UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJvb2tpbmdUeXBlKCkgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Qm9va2luZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGJvb2tpbmdUeXBlID0gQk9PS0lOR19UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKSA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsV29ya1Byb3RlY3RlZCA9IEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkID0gQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWF0aW9uRGF0ZSgpIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IENSRUFUSU9OX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25EYXRlKCkgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGlvbkRhdGUgPSBDUkVBVElPTl9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXh0ZW5kZWRBdHRyaWJ1dGUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZWxpbmUoKSA8ZW0+QmFzZWxpbmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBiYXNlbGluZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUaW1lcGhhc2VkRGF0YSgpIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGltZXBoYXNlZERhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB0aW1lcGhhc2VkRGF0YSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXNzaWdubWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRBc3NpZ25tZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChCaWdJbnRlZ2VyIG5ld1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRUYXNrVUlEKCkgewotCQlyZXR1cm4gdGFza1VJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXNrVUlEKEJpZ0ludGVnZXIgbmV3VGFza1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFRhc2tVSUQgPSB0YXNrVUlEOwotCQl0YXNrVUlEID0gbmV3VGFza1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19UQVNLX1VJRCwgb2xkVGFza1VJRCwgdGFza1VJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFJlc291cmNlVUlEKCkgewotCQlyZXR1cm4gcmVzb3VyY2VVSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VVSUQoQmlnSW50ZWdlciBuZXdSZXNvdXJjZVVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFJlc291cmNlVUlEID0gcmVzb3VyY2VVSUQ7Ci0JCXJlc291cmNlVUlEID0gbmV3UmVzb3VyY2VVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTT1VSQ0VfVUlELCBvbGRSZXNvdXJjZVVJRCwgcmVzb3VyY2VVSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkgewotCQlyZXR1cm4gcGVyY2VudFdvcmtDb21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZXJjZW50V29ya0NvbXBsZXRlKEJpZ0ludGVnZXIgbmV3UGVyY2VudFdvcmtDb21wbGV0ZSkgewotCQlCaWdJbnRlZ2VyIG9sZFBlcmNlbnRXb3JrQ29tcGxldGUgPSBwZXJjZW50V29ya0NvbXBsZXRlOwotCQlwZXJjZW50V29ya0NvbXBsZXRlID0gbmV3UGVyY2VudFdvcmtDb21wbGV0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19QRVJDRU5UX1dPUktfQ09NUExFVEUsIG9sZFBlcmNlbnRXb3JrQ29tcGxldGUsIHBlcmNlbnRXb3JrQ29tcGxldGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRBY3R1YWxDb3N0KCkgewotCQlyZXR1cm4gYWN0dWFsQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxDb3N0KEJpZ0RlY2ltYWwgbmV3QWN0dWFsQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZEFjdHVhbENvc3QgPSBhY3R1YWxDb3N0OwotCQlhY3R1YWxDb3N0ID0gbmV3QWN0dWFsQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfQ09TVCwgb2xkQWN0dWFsQ29zdCwgYWN0dWFsQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsRmluaXNoKCkgewotCQlyZXR1cm4gYWN0dWFsRmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbEZpbmlzaChPYmplY3QgbmV3QWN0dWFsRmluaXNoKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxGaW5pc2ggPSBhY3R1YWxGaW5pc2g7Ci0JCWFjdHVhbEZpbmlzaCA9IG5ld0FjdHVhbEZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfRklOSVNILCBvbGRBY3R1YWxGaW5pc2gsIGFjdHVhbEZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldEFjdHVhbE92ZXJ0aW1lQ29zdCgpIHsKLQkJcmV0dXJuIGFjdHVhbE92ZXJ0aW1lQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCBuZXdBY3R1YWxPdmVydGltZUNvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRBY3R1YWxPdmVydGltZUNvc3QgPSBhY3R1YWxPdmVydGltZUNvc3Q7Ci0JCWFjdHVhbE92ZXJ0aW1lQ29zdCA9IG5ld0FjdHVhbE92ZXJ0aW1lQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfQ09TVCwgb2xkQWN0dWFsT3ZlcnRpbWVDb3N0LCBhY3R1YWxPdmVydGltZUNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29yaygpIHsKLQkJcmV0dXJuIGFjdHVhbE92ZXJ0aW1lV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmsoT2JqZWN0IG5ld0FjdHVhbE92ZXJ0aW1lV29yaykgewotCQlPYmplY3Qgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrID0gYWN0dWFsT3ZlcnRpbWVXb3JrOwotCQlhY3R1YWxPdmVydGltZVdvcmsgPSBuZXdBY3R1YWxPdmVydGltZVdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX1dPUkssIG9sZEFjdHVhbE92ZXJ0aW1lV29yaywgYWN0dWFsT3ZlcnRpbWVXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxTdGFydCgpIHsKLQkJcmV0dXJuIGFjdHVhbFN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbFN0YXJ0KE9iamVjdCBuZXdBY3R1YWxTdGFydCkgewotCQlPYmplY3Qgb2xkQWN0dWFsU3RhcnQgPSBhY3R1YWxTdGFydDsKLQkJYWN0dWFsU3RhcnQgPSBuZXdBY3R1YWxTdGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfU1RBUlQsIG9sZEFjdHVhbFN0YXJ0LCBhY3R1YWxTdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsV29yaygpIHsKLQkJcmV0dXJuIGFjdHVhbFdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsV29yayhPYmplY3QgbmV3QWN0dWFsV29yaykgewotCQlPYmplY3Qgb2xkQWN0dWFsV29yayA9IGFjdHVhbFdvcms7Ci0JCWFjdHVhbFdvcmsgPSBuZXdBY3R1YWxXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9XT1JLLCBvbGRBY3R1YWxXb3JrLCBhY3R1YWxXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEFDV1AoKSB7Ci0JCXJldHVybiBhQ1dQOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFDV1AoZmxvYXQgbmV3QUNXUCkgewotCQlmbG9hdCBvbGRBQ1dQID0gYUNXUDsKLQkJYUNXUCA9IG5ld0FDV1A7Ci0JCWJvb2xlYW4gb2xkQUNXUEVTZXQgPSBhQ1dQRVNldDsKLQkJYUNXUEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDV1AsIG9sZEFDV1AsIGFDV1AsICFvbGRBQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QUNXUCgpIHsKLQkJZmxvYXQgb2xkQUNXUCA9IGFDV1A7Ci0JCWJvb2xlYW4gb2xkQUNXUEVTZXQgPSBhQ1dQRVNldDsKLQkJYUNXUCA9IEFDV1BfRURFRkFVTFQ7Ci0JCWFDV1BFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1dQLCBvbGRBQ1dQLCBBQ1dQX0VERUZBVUxULCBvbGRBQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QUNXUCgpIHsKLQkJcmV0dXJuIGFDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29uZmlybWVkKCkgewotCQlyZXR1cm4gY29uZmlybWVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbmZpcm1lZChib29sZWFuIG5ld0NvbmZpcm1lZCkgewotCQlib29sZWFuIG9sZENvbmZpcm1lZCA9IGNvbmZpcm1lZDsKLQkJY29uZmlybWVkID0gbmV3Q29uZmlybWVkOwotCQlib29sZWFuIG9sZENvbmZpcm1lZEVTZXQgPSBjb25maXJtZWRFU2V0OwotCQljb25maXJtZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT05GSVJNRUQsIG9sZENvbmZpcm1lZCwgY29uZmlybWVkLCAhb2xkQ29uZmlybWVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q29uZmlybWVkKCkgewotCQlib29sZWFuIG9sZENvbmZpcm1lZCA9IGNvbmZpcm1lZDsKLQkJYm9vbGVhbiBvbGRDb25maXJtZWRFU2V0ID0gY29uZmlybWVkRVNldDsKLQkJY29uZmlybWVkID0gQ09ORklSTUVEX0VERUZBVUxUOwotCQljb25maXJtZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT05GSVJNRUQsIG9sZENvbmZpcm1lZCwgQ09ORklSTUVEX0VERUZBVUxULCBvbGRDb25maXJtZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRDb25maXJtZWQoKSB7Ci0JCXJldHVybiBjb25maXJtZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldENvc3QoKSB7Ci0JCXJldHVybiBjb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvc3QoQmlnRGVjaW1hbCBuZXdDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkQ29zdCA9IGNvc3Q7Ci0JCWNvc3QgPSBuZXdDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1QsIG9sZENvc3QsIGNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRDb3N0UmF0ZVRhYmxlKCkgewotCQlyZXR1cm4gY29zdFJhdGVUYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3N0UmF0ZVRhYmxlKEJpZ0ludGVnZXIgbmV3Q29zdFJhdGVUYWJsZSkgewotCQlCaWdJbnRlZ2VyIG9sZENvc3RSYXRlVGFibGUgPSBjb3N0UmF0ZVRhYmxlOwotCQljb3N0UmF0ZVRhYmxlID0gbmV3Q29zdFJhdGVUYWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUX1JBVEVfVEFCTEUsIG9sZENvc3RSYXRlVGFibGUsIGNvc3RSYXRlVGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0Q29zdFZhcmlhbmNlKCkgewotCQlyZXR1cm4gY29zdFZhcmlhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvc3RWYXJpYW5jZShmbG9hdCBuZXdDb3N0VmFyaWFuY2UpIHsKLQkJZmxvYXQgb2xkQ29zdFZhcmlhbmNlID0gY29zdFZhcmlhbmNlOwotCQljb3N0VmFyaWFuY2UgPSBuZXdDb3N0VmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkQ29zdFZhcmlhbmNlRVNldCA9IGNvc3RWYXJpYW5jZUVTZXQ7Ci0JCWNvc3RWYXJpYW5jZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1RfVkFSSUFOQ0UsIG9sZENvc3RWYXJpYW5jZSwgY29zdFZhcmlhbmNlLCAhb2xkQ29zdFZhcmlhbmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q29zdFZhcmlhbmNlKCkgewotCQlmbG9hdCBvbGRDb3N0VmFyaWFuY2UgPSBjb3N0VmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkQ29zdFZhcmlhbmNlRVNldCA9IGNvc3RWYXJpYW5jZUVTZXQ7Ci0JCWNvc3RWYXJpYW5jZSA9IENPU1RfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0JCWNvc3RWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1RfVkFSSUFOQ0UsIG9sZENvc3RWYXJpYW5jZSwgQ09TVF9WQVJJQU5DRV9FREVGQVVMVCwgb2xkQ29zdFZhcmlhbmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q29zdFZhcmlhbmNlKCkgewotCQlyZXR1cm4gY29zdFZhcmlhbmNlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0Q1YoKSB7Ci0JCXJldHVybiBjVjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDVihmbG9hdCBuZXdDVikgewotCQlmbG9hdCBvbGRDViA9IGNWOwotCQljViA9IG5ld0NWOwotCQlib29sZWFuIG9sZENWRVNldCA9IGNWRVNldDsKLQkJY1ZFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DViwgb2xkQ1YsIGNWLCAhb2xkQ1ZFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDVigpIHsKLQkJZmxvYXQgb2xkQ1YgPSBjVjsKLQkJYm9vbGVhbiBvbGRDVkVTZXQgPSBjVkVTZXQ7Ci0JCWNWID0gQ1ZfRURFRkFVTFQ7Ci0JCWNWRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ1YsIG9sZENWLCBDVl9FREVGQVVMVCwgb2xkQ1ZFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRDVigpIHsKLQkJcmV0dXJuIGNWRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREZWxheSgpIHsKLQkJcmV0dXJuIGRlbGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlbGF5KEJpZ0ludGVnZXIgbmV3RGVsYXkpIHsKLQkJQmlnSW50ZWdlciBvbGREZWxheSA9IGRlbGF5OwotCQlkZWxheSA9IG5ld0RlbGF5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0RFTEFZLCBvbGREZWxheSwgZGVsYXkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZpbmlzaCgpIHsKLQkJcmV0dXJuIGZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2goT2JqZWN0IG5ld0ZpbmlzaCkgewotCQlPYmplY3Qgb2xkRmluaXNoID0gZmluaXNoOwotCQlmaW5pc2ggPSBuZXdGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNILCBvbGRGaW5pc2gsIGZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEZpbmlzaFZhcmlhbmNlKCkgewotCQlyZXR1cm4gZmluaXNoVmFyaWFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluaXNoVmFyaWFuY2UoQmlnSW50ZWdlciBuZXdGaW5pc2hWYXJpYW5jZSkgewotCQlCaWdJbnRlZ2VyIG9sZEZpbmlzaFZhcmlhbmNlID0gZmluaXNoVmFyaWFuY2U7Ci0JCWZpbmlzaFZhcmlhbmNlID0gbmV3RmluaXNoVmFyaWFuY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIX1ZBUklBTkNFLCBvbGRGaW5pc2hWYXJpYW5jZSwgZmluaXNoVmFyaWFuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGluaygpIHsKLQkJcmV0dXJuIGh5cGVybGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmsoU3RyaW5nIG5ld0h5cGVybGluaykgewotCQlTdHJpbmcgb2xkSHlwZXJsaW5rID0gaHlwZXJsaW5rOwotCQloeXBlcmxpbmsgPSBuZXdIeXBlcmxpbms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LLCBvbGRIeXBlcmxpbmssIGh5cGVybGluaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rQWRkcmVzcygpIHsKLQkJcmV0dXJuIGh5cGVybGlua0FkZHJlc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rQWRkcmVzcyhTdHJpbmcgbmV3SHlwZXJsaW5rQWRkcmVzcykgewotCQlTdHJpbmcgb2xkSHlwZXJsaW5rQWRkcmVzcyA9IGh5cGVybGlua0FkZHJlc3M7Ci0JCWh5cGVybGlua0FkZHJlc3MgPSBuZXdIeXBlcmxpbmtBZGRyZXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOS19BRERSRVNTLCBvbGRIeXBlcmxpbmtBZGRyZXNzLCBoeXBlcmxpbmtBZGRyZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rU3ViQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZyBuZXdIeXBlcmxpbmtTdWJBZGRyZXNzKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmtTdWJBZGRyZXNzID0gaHlwZXJsaW5rU3ViQWRkcmVzczsKLQkJaHlwZXJsaW5rU3ViQWRkcmVzcyA9IG5ld0h5cGVybGlua1N1YkFkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX1NVQl9BRERSRVNTLCBvbGRIeXBlcmxpbmtTdWJBZGRyZXNzLCBoeXBlcmxpbmtTdWJBZGRyZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldFdvcmtWYXJpYW5jZSgpIHsKLQkJcmV0dXJuIHdvcmtWYXJpYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrVmFyaWFuY2UoZmxvYXQgbmV3V29ya1ZhcmlhbmNlKSB7Ci0JCWZsb2F0IG9sZFdvcmtWYXJpYW5jZSA9IHdvcmtWYXJpYW5jZTsKLQkJd29ya1ZhcmlhbmNlID0gbmV3V29ya1ZhcmlhbmNlOwotCQlib29sZWFuIG9sZFdvcmtWYXJpYW5jZUVTZXQgPSB3b3JrVmFyaWFuY2VFU2V0OwotCQl3b3JrVmFyaWFuY2VFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLX1ZBUklBTkNFLCBvbGRXb3JrVmFyaWFuY2UsIHdvcmtWYXJpYW5jZSwgIW9sZFdvcmtWYXJpYW5jZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFdvcmtWYXJpYW5jZSgpIHsKLQkJZmxvYXQgb2xkV29ya1ZhcmlhbmNlID0gd29ya1ZhcmlhbmNlOwotCQlib29sZWFuIG9sZFdvcmtWYXJpYW5jZUVTZXQgPSB3b3JrVmFyaWFuY2VFU2V0OwotCQl3b3JrVmFyaWFuY2UgPSBXT1JLX1ZBUklBTkNFX0VERUZBVUxUOwotCQl3b3JrVmFyaWFuY2VFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLX1ZBUklBTkNFLCBvbGRXb3JrVmFyaWFuY2UsIFdPUktfVkFSSUFOQ0VfRURFRkFVTFQsIG9sZFdvcmtWYXJpYW5jZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFdvcmtWYXJpYW5jZSgpIHsKLQkJcmV0dXJuIHdvcmtWYXJpYW5jZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIYXNGaXhlZFJhdGVVbml0cygpIHsKLQkJcmV0dXJuIGhhc0ZpeGVkUmF0ZVVuaXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc0ZpeGVkUmF0ZVVuaXRzKGJvb2xlYW4gbmV3SGFzRml4ZWRSYXRlVW5pdHMpIHsKLQkJYm9vbGVhbiBvbGRIYXNGaXhlZFJhdGVVbml0cyA9IGhhc0ZpeGVkUmF0ZVVuaXRzOwotCQloYXNGaXhlZFJhdGVVbml0cyA9IG5ld0hhc0ZpeGVkUmF0ZVVuaXRzOwotCQlib29sZWFuIG9sZEhhc0ZpeGVkUmF0ZVVuaXRzRVNldCA9IGhhc0ZpeGVkUmF0ZVVuaXRzRVNldDsKLQkJaGFzRml4ZWRSYXRlVW5pdHNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IQVNfRklYRURfUkFURV9VTklUUywgb2xkSGFzRml4ZWRSYXRlVW5pdHMsIGhhc0ZpeGVkUmF0ZVVuaXRzLCAhb2xkSGFzRml4ZWRSYXRlVW5pdHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRIYXNGaXhlZFJhdGVVbml0cygpIHsKLQkJYm9vbGVhbiBvbGRIYXNGaXhlZFJhdGVVbml0cyA9IGhhc0ZpeGVkUmF0ZVVuaXRzOwotCQlib29sZWFuIG9sZEhhc0ZpeGVkUmF0ZVVuaXRzRVNldCA9IGhhc0ZpeGVkUmF0ZVVuaXRzRVNldDsKLQkJaGFzRml4ZWRSYXRlVW5pdHMgPSBIQVNfRklYRURfUkFURV9VTklUU19FREVGQVVMVDsKLQkJaGFzRml4ZWRSYXRlVW5pdHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IQVNfRklYRURfUkFURV9VTklUUywgb2xkSGFzRml4ZWRSYXRlVW5pdHMsIEhBU19GSVhFRF9SQVRFX1VOSVRTX0VERUZBVUxULCBvbGRIYXNGaXhlZFJhdGVVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEhhc0ZpeGVkUmF0ZVVuaXRzKCkgewotCQlyZXR1cm4gaGFzRml4ZWRSYXRlVW5pdHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRml4ZWRNYXRlcmlhbCgpIHsKLQkJcmV0dXJuIGZpeGVkTWF0ZXJpYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rml4ZWRNYXRlcmlhbChib29sZWFuIG5ld0ZpeGVkTWF0ZXJpYWwpIHsKLQkJYm9vbGVhbiBvbGRGaXhlZE1hdGVyaWFsID0gZml4ZWRNYXRlcmlhbDsKLQkJZml4ZWRNYXRlcmlhbCA9IG5ld0ZpeGVkTWF0ZXJpYWw7Ci0JCWJvb2xlYW4gb2xkRml4ZWRNYXRlcmlhbEVTZXQgPSBmaXhlZE1hdGVyaWFsRVNldDsKLQkJZml4ZWRNYXRlcmlhbEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJWEVEX01BVEVSSUFMLCBvbGRGaXhlZE1hdGVyaWFsLCBmaXhlZE1hdGVyaWFsLCAhb2xkRml4ZWRNYXRlcmlhbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEZpeGVkTWF0ZXJpYWwoKSB7Ci0JCWJvb2xlYW4gb2xkRml4ZWRNYXRlcmlhbCA9IGZpeGVkTWF0ZXJpYWw7Ci0JCWJvb2xlYW4gb2xkRml4ZWRNYXRlcmlhbEVTZXQgPSBmaXhlZE1hdGVyaWFsRVNldDsKLQkJZml4ZWRNYXRlcmlhbCA9IEZJWEVEX01BVEVSSUFMX0VERUZBVUxUOwotCQlmaXhlZE1hdGVyaWFsRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklYRURfTUFURVJJQUwsIG9sZEZpeGVkTWF0ZXJpYWwsIEZJWEVEX01BVEVSSUFMX0VERUZBVUxULCBvbGRGaXhlZE1hdGVyaWFsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Rml4ZWRNYXRlcmlhbCgpIHsKLQkJcmV0dXJuIGZpeGVkTWF0ZXJpYWxFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldExldmVsaW5nRGVsYXkoKSB7Ci0JCXJldHVybiBsZXZlbGluZ0RlbGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExldmVsaW5nRGVsYXkoQmlnSW50ZWdlciBuZXdMZXZlbGluZ0RlbGF5KSB7Ci0JCUJpZ0ludGVnZXIgb2xkTGV2ZWxpbmdEZWxheSA9IGxldmVsaW5nRGVsYXk7Ci0JCWxldmVsaW5nRGVsYXkgPSBuZXdMZXZlbGluZ0RlbGF5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZLCBvbGRMZXZlbGluZ0RlbGF5LCBsZXZlbGluZ0RlbGF5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpIHsKLQkJcmV0dXJuIGxldmVsaW5nRGVsYXlGb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV2ZWxpbmdEZWxheUZvcm1hdChCaWdJbnRlZ2VyIG5ld0xldmVsaW5nRGVsYXlGb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGRMZXZlbGluZ0RlbGF5Rm9ybWF0ID0gbGV2ZWxpbmdEZWxheUZvcm1hdDsKLQkJbGV2ZWxpbmdEZWxheUZvcm1hdCA9IG5ld0xldmVsaW5nRGVsYXlGb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVlfRk9STUFULCBvbGRMZXZlbGluZ0RlbGF5Rm9ybWF0LCBsZXZlbGluZ0RlbGF5Rm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMaW5rZWRGaWVsZHMoKSB7Ci0JCXJldHVybiBsaW5rZWRGaWVsZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlua2VkRmllbGRzKGJvb2xlYW4gbmV3TGlua2VkRmllbGRzKSB7Ci0JCWJvb2xlYW4gb2xkTGlua2VkRmllbGRzID0gbGlua2VkRmllbGRzOwotCQlsaW5rZWRGaWVsZHMgPSBuZXdMaW5rZWRGaWVsZHM7Ci0JCWJvb2xlYW4gb2xkTGlua2VkRmllbGRzRVNldCA9IGxpbmtlZEZpZWxkc0VTZXQ7Ci0JCWxpbmtlZEZpZWxkc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xJTktFRF9GSUVMRFMsIG9sZExpbmtlZEZpZWxkcywgbGlua2VkRmllbGRzLCAhb2xkTGlua2VkRmllbGRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TGlua2VkRmllbGRzKCkgewotCQlib29sZWFuIG9sZExpbmtlZEZpZWxkcyA9IGxpbmtlZEZpZWxkczsKLQkJYm9vbGVhbiBvbGRMaW5rZWRGaWVsZHNFU2V0ID0gbGlua2VkRmllbGRzRVNldDsKLQkJbGlua2VkRmllbGRzID0gTElOS0VEX0ZJRUxEU19FREVGQVVMVDsKLQkJbGlua2VkRmllbGRzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTElOS0VEX0ZJRUxEUywgb2xkTGlua2VkRmllbGRzLCBMSU5LRURfRklFTERTX0VERUZBVUxULCBvbGRMaW5rZWRGaWVsZHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRMaW5rZWRGaWVsZHMoKSB7Ci0JCXJldHVybiBsaW5rZWRGaWVsZHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWlsZXN0b25lKCkgewotCQlyZXR1cm4gbWlsZXN0b25lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbGVzdG9uZShib29sZWFuIG5ld01pbGVzdG9uZSkgewotCQlib29sZWFuIG9sZE1pbGVzdG9uZSA9IG1pbGVzdG9uZTsKLQkJbWlsZXN0b25lID0gbmV3TWlsZXN0b25lOwotCQlib29sZWFuIG9sZE1pbGVzdG9uZUVTZXQgPSBtaWxlc3RvbmVFU2V0OwotCQltaWxlc3RvbmVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19NSUxFU1RPTkUsIG9sZE1pbGVzdG9uZSwgbWlsZXN0b25lLCAhb2xkTWlsZXN0b25lRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TWlsZXN0b25lKCkgewotCQlib29sZWFuIG9sZE1pbGVzdG9uZSA9IG1pbGVzdG9uZTsKLQkJYm9vbGVhbiBvbGRNaWxlc3RvbmVFU2V0ID0gbWlsZXN0b25lRVNldDsKLQkJbWlsZXN0b25lID0gTUlMRVNUT05FX0VERUZBVUxUOwotCQltaWxlc3RvbmVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19NSUxFU1RPTkUsIG9sZE1pbGVzdG9uZSwgTUlMRVNUT05FX0VERUZBVUxULCBvbGRNaWxlc3RvbmVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNaWxlc3RvbmUoKSB7Ci0JCXJldHVybiBtaWxlc3RvbmVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm90ZXMoKSB7Ci0JCXJldHVybiBub3RlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb3RlcyhTdHJpbmcgbmV3Tm90ZXMpIHsKLQkJU3RyaW5nIG9sZE5vdGVzID0gbm90ZXM7Ci0JCW5vdGVzID0gbmV3Tm90ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTk9URVMsIG9sZE5vdGVzLCBub3RlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3ZlcmFsbG9jYXRlZCgpIHsKLQkJcmV0dXJuIG92ZXJhbGxvY2F0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcmFsbG9jYXRlZChib29sZWFuIG5ld092ZXJhbGxvY2F0ZWQpIHsKLQkJYm9vbGVhbiBvbGRPdmVyYWxsb2NhdGVkID0gb3ZlcmFsbG9jYXRlZDsKLQkJb3ZlcmFsbG9jYXRlZCA9IG5ld092ZXJhbGxvY2F0ZWQ7Ci0JCWJvb2xlYW4gb2xkT3ZlcmFsbG9jYXRlZEVTZXQgPSBvdmVyYWxsb2NhdGVkRVNldDsKLQkJb3ZlcmFsbG9jYXRlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJBTExPQ0FURUQsIG9sZE92ZXJhbGxvY2F0ZWQsIG92ZXJhbGxvY2F0ZWQsICFvbGRPdmVyYWxsb2NhdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0T3ZlcmFsbG9jYXRlZCgpIHsKLQkJYm9vbGVhbiBvbGRPdmVyYWxsb2NhdGVkID0gb3ZlcmFsbG9jYXRlZDsKLQkJYm9vbGVhbiBvbGRPdmVyYWxsb2NhdGVkRVNldCA9IG92ZXJhbGxvY2F0ZWRFU2V0OwotCQlvdmVyYWxsb2NhdGVkID0gT1ZFUkFMTE9DQVRFRF9FREVGQVVMVDsKLQkJb3ZlcmFsbG9jYXRlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJBTExPQ0FURUQsIG9sZE92ZXJhbGxvY2F0ZWQsIE9WRVJBTExPQ0FURURfRURFRkFVTFQsIG9sZE92ZXJhbGxvY2F0ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRPdmVyYWxsb2NhdGVkKCkgewotCQlyZXR1cm4gb3ZlcmFsbG9jYXRlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0T3ZlcnRpbWVDb3N0KCkgewotCQlyZXR1cm4gb3ZlcnRpbWVDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIG5ld092ZXJ0aW1lQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZE92ZXJ0aW1lQ29zdCA9IG92ZXJ0aW1lQ29zdDsKLQkJb3ZlcnRpbWVDb3N0ID0gbmV3T3ZlcnRpbWVDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX0NPU1QsIG9sZE92ZXJ0aW1lQ29zdCwgb3ZlcnRpbWVDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPdmVydGltZVdvcmsoKSB7Ci0JCXJldHVybiBvdmVydGltZVdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVXb3JrKE9iamVjdCBuZXdPdmVydGltZVdvcmspIHsKLQkJT2JqZWN0IG9sZE92ZXJ0aW1lV29yayA9IG92ZXJ0aW1lV29yazsKLQkJb3ZlcnRpbWVXb3JrID0gbmV3T3ZlcnRpbWVXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX1dPUkssIG9sZE92ZXJ0aW1lV29yaywgb3ZlcnRpbWVXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZWd1bGFyV29yaygpIHsKLQkJcmV0dXJuIHJlZ3VsYXJXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ3VsYXJXb3JrKE9iamVjdCBuZXdSZWd1bGFyV29yaykgewotCQlPYmplY3Qgb2xkUmVndWxhcldvcmsgPSByZWd1bGFyV29yazsKLQkJcmVndWxhcldvcmsgPSBuZXdSZWd1bGFyV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRUdVTEFSX1dPUkssIG9sZFJlZ3VsYXJXb3JrLCByZWd1bGFyV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldFJlbWFpbmluZ0Nvc3QoKSB7Ci0JCXJldHVybiByZW1haW5pbmdDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ0Nvc3QoQmlnRGVjaW1hbCBuZXdSZW1haW5pbmdDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkUmVtYWluaW5nQ29zdCA9IHJlbWFpbmluZ0Nvc3Q7Ci0JCXJlbWFpbmluZ0Nvc3QgPSBuZXdSZW1haW5pbmdDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19DT1NULCBvbGRSZW1haW5pbmdDb3N0LCByZW1haW5pbmdDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgewotCQlyZXR1cm4gcmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIG5ld1JlbWFpbmluZ092ZXJ0aW1lQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA9IHJlbWFpbmluZ092ZXJ0aW1lQ29zdDsKLQkJcmVtYWluaW5nT3ZlcnRpbWVDb3N0ID0gbmV3UmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9DT1NULCBvbGRSZW1haW5pbmdPdmVydGltZUNvc3QsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgewotCQlyZXR1cm4gcmVtYWluaW5nT3ZlcnRpbWVXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lV29yayhPYmplY3QgbmV3UmVtYWluaW5nT3ZlcnRpbWVXb3JrKSB7Ci0JCU9iamVjdCBvbGRSZW1haW5pbmdPdmVydGltZVdvcmsgPSByZW1haW5pbmdPdmVydGltZVdvcms7Ci0JCXJlbWFpbmluZ092ZXJ0aW1lV29yayA9IG5ld1JlbWFpbmluZ092ZXJ0aW1lV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSywgb2xkUmVtYWluaW5nT3ZlcnRpbWVXb3JrLCByZW1haW5pbmdPdmVydGltZVdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlbWFpbmluZ1dvcmsoKSB7Ci0JCXJldHVybiByZW1haW5pbmdXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ1dvcmsoT2JqZWN0IG5ld1JlbWFpbmluZ1dvcmspIHsKLQkJT2JqZWN0IG9sZFJlbWFpbmluZ1dvcmsgPSByZW1haW5pbmdXb3JrOwotCQlyZW1haW5pbmdXb3JrID0gbmV3UmVtYWluaW5nV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfV09SSywgb2xkUmVtYWluaW5nV29yaywgcmVtYWluaW5nV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVzcG9uc2VQZW5kaW5nKCkgewotCQlyZXR1cm4gcmVzcG9uc2VQZW5kaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc3BvbnNlUGVuZGluZyhib29sZWFuIG5ld1Jlc3BvbnNlUGVuZGluZykgewotCQlib29sZWFuIG9sZFJlc3BvbnNlUGVuZGluZyA9IHJlc3BvbnNlUGVuZGluZzsKLQkJcmVzcG9uc2VQZW5kaW5nID0gbmV3UmVzcG9uc2VQZW5kaW5nOwotCQlib29sZWFuIG9sZFJlc3BvbnNlUGVuZGluZ0VTZXQgPSByZXNwb25zZVBlbmRpbmdFU2V0OwotCQlyZXNwb25zZVBlbmRpbmdFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNQT05TRV9QRU5ESU5HLCBvbGRSZXNwb25zZVBlbmRpbmcsIHJlc3BvbnNlUGVuZGluZywgIW9sZFJlc3BvbnNlUGVuZGluZ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlc3BvbnNlUGVuZGluZygpIHsKLQkJYm9vbGVhbiBvbGRSZXNwb25zZVBlbmRpbmcgPSByZXNwb25zZVBlbmRpbmc7Ci0JCWJvb2xlYW4gb2xkUmVzcG9uc2VQZW5kaW5nRVNldCA9IHJlc3BvbnNlUGVuZGluZ0VTZXQ7Ci0JCXJlc3BvbnNlUGVuZGluZyA9IFJFU1BPTlNFX1BFTkRJTkdfRURFRkFVTFQ7Ci0JCXJlc3BvbnNlUGVuZGluZ0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU1BPTlNFX1BFTkRJTkcsIG9sZFJlc3BvbnNlUGVuZGluZywgUkVTUE9OU0VfUEVORElOR19FREVGQVVMVCwgb2xkUmVzcG9uc2VQZW5kaW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmVzcG9uc2VQZW5kaW5nKCkgewotCQlyZXR1cm4gcmVzcG9uc2VQZW5kaW5nRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoT2JqZWN0IG5ld1N0YXJ0KSB7Ci0JCU9iamVjdCBvbGRTdGFydCA9IHN0YXJ0OwotCQlzdGFydCA9IG5ld1N0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJULCBvbGRTdGFydCwgc3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFN0b3AoKSB7Ci0JCXJldHVybiBzdG9wOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0b3AoT2JqZWN0IG5ld1N0b3ApIHsKLQkJT2JqZWN0IG9sZFN0b3AgPSBzdG9wOwotCQlzdG9wID0gbmV3U3RvcDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVE9QLCBvbGRTdG9wLCBzdG9wKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZXN1bWUoKSB7Ci0JCXJldHVybiByZXN1bWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzdW1lKE9iamVjdCBuZXdSZXN1bWUpIHsKLQkJT2JqZWN0IG9sZFJlc3VtZSA9IHJlc3VtZTsKLQkJcmVzdW1lID0gbmV3UmVzdW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU1VNRSwgb2xkUmVzdW1lLCByZXN1bWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRTdGFydFZhcmlhbmNlKCkgewotCQlyZXR1cm4gc3RhcnRWYXJpYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydFZhcmlhbmNlKEJpZ0ludGVnZXIgbmV3U3RhcnRWYXJpYW5jZSkgewotCQlCaWdJbnRlZ2VyIG9sZFN0YXJ0VmFyaWFuY2UgPSBzdGFydFZhcmlhbmNlOwotCQlzdGFydFZhcmlhbmNlID0gbmV3U3RhcnRWYXJpYW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVEFSVF9WQVJJQU5DRSwgb2xkU3RhcnRWYXJpYW5jZSwgc3RhcnRWYXJpYW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRVbml0cygpIHsKLQkJcmV0dXJuIHVuaXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuaXRzKGZsb2F0IG5ld1VuaXRzKSB7Ci0JCWZsb2F0IG9sZFVuaXRzID0gdW5pdHM7Ci0JCXVuaXRzID0gbmV3VW5pdHM7Ci0JCWJvb2xlYW4gb2xkVW5pdHNFU2V0ID0gdW5pdHNFU2V0OwotCQl1bml0c0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VOSVRTLCBvbGRVbml0cywgdW5pdHMsICFvbGRVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFVuaXRzKCkgewotCQlmbG9hdCBvbGRVbml0cyA9IHVuaXRzOwotCQlib29sZWFuIG9sZFVuaXRzRVNldCA9IHVuaXRzRVNldDsKLQkJdW5pdHMgPSBVTklUU19FREVGQVVMVDsKLQkJdW5pdHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VTklUUywgb2xkVW5pdHMsIFVOSVRTX0VERUZBVUxULCBvbGRVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFVuaXRzKCkgewotCQlyZXR1cm4gdW5pdHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXBkYXRlTmVlZGVkKCkgewotCQlyZXR1cm4gdXBkYXRlTmVlZGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVwZGF0ZU5lZWRlZChib29sZWFuIG5ld1VwZGF0ZU5lZWRlZCkgewotCQlib29sZWFuIG9sZFVwZGF0ZU5lZWRlZCA9IHVwZGF0ZU5lZWRlZDsKLQkJdXBkYXRlTmVlZGVkID0gbmV3VXBkYXRlTmVlZGVkOwotCQlib29sZWFuIG9sZFVwZGF0ZU5lZWRlZEVTZXQgPSB1cGRhdGVOZWVkZWRFU2V0OwotCQl1cGRhdGVOZWVkZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VUERBVEVfTkVFREVELCBvbGRVcGRhdGVOZWVkZWQsIHVwZGF0ZU5lZWRlZCwgIW9sZFVwZGF0ZU5lZWRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFVwZGF0ZU5lZWRlZCgpIHsKLQkJYm9vbGVhbiBvbGRVcGRhdGVOZWVkZWQgPSB1cGRhdGVOZWVkZWQ7Ci0JCWJvb2xlYW4gb2xkVXBkYXRlTmVlZGVkRVNldCA9IHVwZGF0ZU5lZWRlZEVTZXQ7Ci0JCXVwZGF0ZU5lZWRlZCA9IFVQREFURV9ORUVERURfRURFRkFVTFQ7Ci0JCXVwZGF0ZU5lZWRlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VQREFURV9ORUVERUQsIG9sZFVwZGF0ZU5lZWRlZCwgVVBEQVRFX05FRURFRF9FREVGQVVMVCwgb2xkVXBkYXRlTmVlZGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VXBkYXRlTmVlZGVkKCkgewotCQlyZXR1cm4gdXBkYXRlTmVlZGVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0VkFDKCkgewotCQlyZXR1cm4gdkFDOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZBQyhmbG9hdCBuZXdWQUMpIHsKLQkJZmxvYXQgb2xkVkFDID0gdkFDOwotCQl2QUMgPSBuZXdWQUM7Ci0JCWJvb2xlYW4gb2xkVkFDRVNldCA9IHZBQ0VTZXQ7Ci0JCXZBQ0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1ZBQywgb2xkVkFDLCB2QUMsICFvbGRWQUNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRWQUMoKSB7Ci0JCWZsb2F0IG9sZFZBQyA9IHZBQzsKLQkJYm9vbGVhbiBvbGRWQUNFU2V0ID0gdkFDRVNldDsKLQkJdkFDID0gVkFDX0VERUZBVUxUOwotCQl2QUNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19WQUMsIG9sZFZBQywgVkFDX0VERUZBVUxULCBvbGRWQUNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRWQUMoKSB7Ci0JCXJldHVybiB2QUNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0V29yaygpIHsKLQkJcmV0dXJuIHdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29yayhPYmplY3QgbmV3V29yaykgewotCQlPYmplY3Qgb2xkV29yayA9IHdvcms7Ci0JCXdvcmsgPSBuZXdXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUkssIG9sZFdvcmssIHdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRXb3JrQ29udG91cigpIHsKLQkJcmV0dXJuIHdvcmtDb250b3VyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtDb250b3VyKEJpZ0ludGVnZXIgbmV3V29ya0NvbnRvdXIpIHsKLQkJQmlnSW50ZWdlciBvbGRXb3JrQ29udG91ciA9IHdvcmtDb250b3VyOwotCQl3b3JrQ29udG91ciA9IG5ld1dvcmtDb250b3VyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfQ09OVE9VUiwgb2xkV29ya0NvbnRvdXIsIHdvcmtDb250b3VyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1MoKSB7Ci0JCXJldHVybiBiQ1dTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1MoZmxvYXQgbmV3QkNXUykgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYkNXUyA9IG5ld0JDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXU0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1MsIG9sZEJDV1MsIGJDV1MsICFvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QkNXUygpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXUyA9IEJDV1NfRURFRkFVTFQ7Ci0JCWJDV1NFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQ1dTLCBvbGRCQ1dTLCBCQ1dTX0VERUZBVUxULCBvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1NFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dQKGZsb2F0IG5ld0JDV1ApIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJDV1AgPSBuZXdCQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQ1dQLCBvbGRCQ1dQLCBiQ1dQLCAhb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1AoKSB7Ci0JCWZsb2F0IG9sZEJDV1AgPSBiQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCQliQ1dQRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUCwgb2xkQkNXUCwgQkNXUF9FREVGQVVMVCwgb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRCb29raW5nVHlwZSgpIHsKLQkJcmV0dXJuIGJvb2tpbmdUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvb2tpbmdUeXBlKEJpZ0ludGVnZXIgbmV3Qm9va2luZ1R5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGRCb29raW5nVHlwZSA9IGJvb2tpbmdUeXBlOwotCQlib29raW5nVHlwZSA9IG5ld0Jvb2tpbmdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JPT0tJTkdfVFlQRSwgb2xkQm9va2luZ1R5cGUsIGJvb2tpbmdUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkgewotCQlyZXR1cm4gYWN0dWFsV29ya1Byb3RlY3RlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKE9iamVjdCBuZXdBY3R1YWxXb3JrUHJvdGVjdGVkKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxXb3JrUHJvdGVjdGVkID0gYWN0dWFsV29ya1Byb3RlY3RlZDsKLQkJYWN0dWFsV29ya1Byb3RlY3RlZCA9IG5ld0FjdHVhbFdvcmtQcm90ZWN0ZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1dPUktfUFJPVEVDVEVELCBvbGRBY3R1YWxXb3JrUHJvdGVjdGVkLCBhY3R1YWxXb3JrUHJvdGVjdGVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSB7Ci0JCXJldHVybiBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKE9iamVjdCBuZXdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA9IGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDsKLQkJYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkID0gbmV3QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRCwgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkLCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0aW9uRGF0ZSgpIHsKLQkJcmV0dXJuIGNyZWF0aW9uRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvbkRhdGUoT2JqZWN0IG5ld0NyZWF0aW9uRGF0ZSkgewotCQlPYmplY3Qgb2xkQ3JlYXRpb25EYXRlID0gY3JlYXRpb25EYXRlOwotCQljcmVhdGlvbkRhdGUgPSBuZXdDcmVhdGlvbkRhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ1JFQVRJT05fREFURSwgb2xkQ3JlYXRpb25EYXRlLCBjcmVhdGlvbkRhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFeHRlbmRlZEF0dHJpYnV0ZTQuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRVhURU5ERURfQVRUUklCVVRFKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEJhc2VsaW5lKCkgewotCQlpZiAoYmFzZWxpbmUgPT0gbnVsbCkgewotCQkJYmFzZWxpbmUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQmFzZWxpbmUzLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JBU0VMSU5FKTsKLQkJfQotCQlyZXR1cm4gYmFzZWxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCkgewotCQlpZiAodGltZXBoYXNlZERhdGEgPT0gbnVsbCkgewotCQkJdGltZXBoYXNlZERhdGEgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVGltZXBoYXNlZERhdGFUeXBlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RJTUVQSEFTRURfREFUQSk7Ci0JCX0KLQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQVNFTElORToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRCYXNlbGluZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RJTUVQSEFTRURfREFUQToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRUaW1lcGhhc2VkRGF0YSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVUlEOgotCQkJCXJldHVybiBnZXRVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19UQVNLX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VGFza1VJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU09VUkNFX1VJRDoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19QRVJDRU5UX1dPUktfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGdldFBlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfQ09TVDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9GSU5JU0g6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbEZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRBY3R1YWxPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1NUQVJUOgotCQkJCXJldHVybiBnZXRBY3R1YWxTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9XT1JLOgotCQkJCXJldHVybiBnZXRBY3R1YWxXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEFDV1AoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09ORklSTUVEOgotCQkJCXJldHVybiBpc0NvbmZpcm1lZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUOgotCQkJCXJldHVybiBnZXRDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9SQVRFX1RBQkxFOgotCQkJCXJldHVybiBnZXRDb3N0UmF0ZVRhYmxlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9WQVJJQU5DRToKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldENvc3RWYXJpYW5jZSgpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DVjoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldENWKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0RFTEFZOgotCQkJCXJldHVybiBnZXREZWxheSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0RmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIX1ZBUklBTkNFOgotCQkJCXJldHVybiBnZXRGaW5pc2hWYXJpYW5jZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOSzoKLQkJCQlyZXR1cm4gZ2V0SHlwZXJsaW5rKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGlua0FkZHJlc3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IWVBFUkxJTktfU1VCX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLX1ZBUklBTkNFOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0V29ya1ZhcmlhbmNlKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hBU19GSVhFRF9SQVRFX1VOSVRTOgotCQkJCXJldHVybiBpc0hhc0ZpeGVkUmF0ZVVuaXRzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJWEVEX01BVEVSSUFMOgotCQkJCXJldHVybiBpc0ZpeGVkTWF0ZXJpYWwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVk6Ci0JCQkJcmV0dXJuIGdldExldmVsaW5nRGVsYXkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MRVZFTElOR19ERUxBWV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldExldmVsaW5nRGVsYXlGb3JtYXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MSU5LRURfRklFTERTOgotCQkJCXJldHVybiBpc0xpbmtlZEZpZWxkcygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19NSUxFU1RPTkU6Ci0JCQkJcmV0dXJuIGlzTWlsZXN0b25lKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX05PVEVTOgotCQkJCXJldHVybiBnZXROb3RlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJBTExPQ0FURUQ6Ci0JCQkJcmV0dXJuIGlzT3ZlcmFsbG9jYXRlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBnZXRPdmVydGltZVdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRUdVTEFSX1dPUks6Ci0JCQkJcmV0dXJuIGdldFJlZ3VsYXJXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ0Nvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19XT1JLOgotCQkJCXJldHVybiBnZXRSZW1haW5pbmdXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTUE9OU0VfUEVORElORzoKLQkJCQlyZXR1cm4gaXNSZXNwb25zZVBlbmRpbmcoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RPUDoKLQkJCQlyZXR1cm4gZ2V0U3RvcCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU1VNRToKLQkJCQlyZXR1cm4gZ2V0UmVzdW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RBUlRfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0VmFyaWFuY2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VTklUUzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldFVuaXRzKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VQREFURV9ORUVERUQ6Ci0JCQkJcmV0dXJuIGlzVXBkYXRlTmVlZGVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1ZBQzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldFZBQygpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLOgotCQkJCXJldHVybiBnZXRXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SS19DT05UT1VSOgotCQkJCXJldHVybiBnZXRXb3JrQ29udG91cigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1M6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dTKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1A6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dQKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JPT0tJTkdfVFlQRToKLQkJCQlyZXR1cm4gZ2V0Qm9va2luZ1R5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQ6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJcmV0dXJuIGdldENyZWF0aW9uRGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQVNFTElORToKLQkJCQlyZXR1cm4gZ2V0QmFzZWxpbmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIGdldFRpbWVwaGFzZWREYXRhKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19UQVNLX1VJRDoKLQkJCQlzZXRUYXNrVUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTT1VSQ0VfVUlEOgotCQkJCXNldFJlc291cmNlVUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFOgotCQkJCXNldFBlcmNlbnRXb3JrQ29tcGxldGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfQ09TVDoKLQkJCQlzZXRBY3R1YWxDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX0ZJTklTSDoKLQkJCQlzZXRBY3R1YWxGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1NUQVJUOgotCQkJCXNldEFjdHVhbFN0YXJ0KChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SSzoKLQkJCQlzZXRBY3R1YWxXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1dQOgotCQkJCXNldEFDV1AoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09ORklSTUVEOgotCQkJCXNldENvbmZpcm1lZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVDoKLQkJCQlzZXRDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9SQVRFX1RBQkxFOgotCQkJCXNldENvc3RSYXRlVGFibGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUX1ZBUklBTkNFOgotCQkJCXNldENvc3RWYXJpYW5jZSgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DVjoKLQkJCQlzZXRDVigoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19ERUxBWToKLQkJCQlzZXREZWxheSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJTklTSF9WQVJJQU5DRToKLQkJCQlzZXRGaW5pc2hWYXJpYW5jZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOSzoKLQkJCQlzZXRIeXBlcmxpbmsoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOS19BRERSRVNTOgotCQkJCXNldEh5cGVybGlua0FkZHJlc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLX1ZBUklBTkNFOgotCQkJCXNldFdvcmtWYXJpYW5jZSgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IQVNfRklYRURfUkFURV9VTklUUzoKLQkJCQlzZXRIYXNGaXhlZFJhdGVVbml0cygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklYRURfTUFURVJJQUw6Ci0JCQkJc2V0Rml4ZWRNYXRlcmlhbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVk6Ci0JCQkJc2V0TGV2ZWxpbmdEZWxheSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVDoKLQkJCQlzZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTElOS0VEX0ZJRUxEUzoKLQkJCQlzZXRMaW5rZWRGaWVsZHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX01JTEVTVE9ORToKLQkJCQlzZXRNaWxlc3RvbmUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX05PVEVTOgotCQkJCXNldE5vdGVzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSQUxMT0NBVEVEOgotCQkJCXNldE92ZXJhbGxvY2F0ZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0T3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRPdmVydGltZVdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFR1VMQVJfV09SSzoKLQkJCQlzZXRSZWd1bGFyV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTUE9OU0VfUEVORElORzoKLQkJCQlzZXRSZXNwb25zZVBlbmRpbmcoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJUOgotCQkJCXNldFN0YXJ0KChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVE9QOgotCQkJCXNldFN0b3AoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU1VNRToKLQkJCQlzZXRSZXN1bWUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJUX1ZBUklBTkNFOgotCQkJCXNldFN0YXJ0VmFyaWFuY2UoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VTklUUzoKLQkJCQlzZXRVbml0cygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VUERBVEVfTkVFREVEOgotCQkJCXNldFVwZGF0ZU5lZWRlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVkFDOgotCQkJCXNldFZBQygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLOgotCQkJCXNldFdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfQ09OVE9VUjoKLQkJCQlzZXRXb3JrQ29udG91cigoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1M6Ci0JCQkJc2V0QkNXUygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQ1dQOgotCQkJCXNldEJDV1AoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQk9PS0lOR19UWVBFOgotCQkJCXNldEJvb2tpbmdUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJc2V0Q3JlYXRpb25EYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkFTRUxJTkU6Ci0JCQkJZ2V0QmFzZWxpbmUoKS5jbGVhcigpOwotCQkJCWdldEJhc2VsaW5lKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVElNRVBIQVNFRF9EQVRBOgotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuY2xlYXIoKTsKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RBU0tfVUlEOgotCQkJCXNldFRhc2tVSUQoVEFTS19VSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNPVVJDRV9VSUQ6Ci0JCQkJc2V0UmVzb3VyY2VVSUQoUkVTT1VSQ0VfVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFOgotCQkJCXNldFBlcmNlbnRXb3JrQ29tcGxldGUoUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsQ29zdChBQ1RVQUxfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9GSU5JU0g6Ci0JCQkJc2V0QWN0dWFsRmluaXNoKEFDVFVBTF9GSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRBY3R1YWxPdmVydGltZUNvc3QoQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRBY3R1YWxPdmVydGltZVdvcmsoQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfU1RBUlQ6Ci0JCQkJc2V0QWN0dWFsU3RhcnQoQUNUVUFMX1NUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1dPUks6Ci0JCQkJc2V0QWN0dWFsV29yayhBQ1RVQUxfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDV1A6Ci0JCQkJdW5zZXRBQ1dQKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPTkZJUk1FRDoKLQkJCQl1bnNldENvbmZpcm1lZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUOgotCQkJCXNldENvc3QoQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1RfUkFURV9UQUJMRToKLQkJCQlzZXRDb3N0UmF0ZVRhYmxlKENPU1RfUkFURV9UQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1RfVkFSSUFOQ0U6Ci0JCQkJdW5zZXRDb3N0VmFyaWFuY2UoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ1Y6Ci0JCQkJdW5zZXRDVigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19ERUxBWToKLQkJCQlzZXREZWxheShERUxBWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goRklOSVNIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIX1ZBUklBTkNFOgotCQkJCXNldEZpbmlzaFZhcmlhbmNlKEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOSzoKLQkJCQlzZXRIeXBlcmxpbmsoSFlQRVJMSU5LX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJc2V0SHlwZXJsaW5rQWRkcmVzcyhIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJdW5zZXRXb3JrVmFyaWFuY2UoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSEFTX0ZJWEVEX1JBVEVfVU5JVFM6Ci0JCQkJdW5zZXRIYXNGaXhlZFJhdGVVbml0cygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19GSVhFRF9NQVRFUklBTDoKLQkJCQl1bnNldEZpeGVkTWF0ZXJpYWwoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVk6Ci0JCQkJc2V0TGV2ZWxpbmdEZWxheShMRVZFTElOR19ERUxBWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVDoKLQkJCQlzZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xJTktFRF9GSUVMRFM6Ci0JCQkJdW5zZXRMaW5rZWRGaWVsZHMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTUlMRVNUT05FOgotCQkJCXVuc2V0TWlsZXN0b25lKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX05PVEVTOgotCQkJCXNldE5vdGVzKE5PVEVTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUkFMTE9DQVRFRDoKLQkJCQl1bnNldE92ZXJhbGxvY2F0ZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRPdmVydGltZUNvc3QoT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0T3ZlcnRpbWVXb3JrKE9WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRUdVTEFSX1dPUks6Ci0JCQkJc2V0UmVndWxhcldvcmsoUkVHVUxBUl9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nQ29zdChSRU1BSU5JTkdfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lV29yayhSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19XT1JLOgotCQkJCXNldFJlbWFpbmluZ1dvcmsoUkVNQUlOSU5HX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNQT05TRV9QRU5ESU5HOgotCQkJCXVuc2V0UmVzcG9uc2VQZW5kaW5nKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJUOgotCQkJCXNldFN0YXJ0KFNUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RPUDoKLQkJCQlzZXRTdG9wKFNUT1BfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNVTUU6Ci0JCQkJc2V0UmVzdW1lKFJFU1VNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJUX1ZBUklBTkNFOgotCQkJCXNldFN0YXJ0VmFyaWFuY2UoU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VTklUUzoKLQkJCQl1bnNldFVuaXRzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VQREFURV9ORUVERUQ6Ci0JCQkJdW5zZXRVcGRhdGVOZWVkZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVkFDOgotCQkJCXVuc2V0VkFDKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUks6Ci0JCQkJc2V0V29yayhXT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SS19DT05UT1VSOgotCQkJCXNldFdvcmtDb250b3VyKFdPUktfQ09OVE9VUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1M6Ci0JCQkJdW5zZXRCQ1dTKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1A6Ci0JCQkJdW5zZXRCQ1dQKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JPT0tJTkdfVFlQRToKLQkJCQlzZXRCb29raW5nVHlwZShCT09LSU5HX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsV29ya1Byb3RlY3RlZChBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKEFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJc2V0Q3JlYXRpb25EYXRlKENSRUFUSU9OX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQVNFTElORToKLQkJCQlnZXRCYXNlbGluZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RJTUVQSEFTRURfREFUQToKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19UQVNLX1VJRDoKLQkJCQlyZXR1cm4gVEFTS19VSURfRURFRkFVTFQgPT0gbnVsbCA/IHRhc2tVSUQgIT0gbnVsbCA6ICFUQVNLX1VJRF9FREVGQVVMVC5lcXVhbHModGFza1VJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTT1VSQ0VfVUlEOgotCQkJCXJldHVybiBSRVNPVVJDRV9VSURfRURFRkFVTFQgPT0gbnVsbCA/IHJlc291cmNlVUlEICE9IG51bGwgOiAhUkVTT1VSQ0VfVUlEX0VERUZBVUxULmVxdWFscyhyZXNvdXJjZVVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFOgotCQkJCXJldHVybiBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQgPT0gbnVsbCA/IHBlcmNlbnRXb3JrQ29tcGxldGUgIT0gbnVsbCA6ICFQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQuZXF1YWxzKHBlcmNlbnRXb3JrQ29tcGxldGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBBQ1RVQUxfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsQ29zdCAhPSBudWxsIDogIUFDVFVBTF9DT1NUX0VERUZBVUxULmVxdWFscyhhY3R1YWxDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfRklOSVNIOgotCQkJCXJldHVybiBBQ1RVQUxfRklOSVNIX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxGaW5pc2ggIT0gbnVsbCA6ICFBQ1RVQUxfRklOSVNIX0VERUZBVUxULmVxdWFscyhhY3R1YWxGaW5pc2gpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsT3ZlcnRpbWVDb3N0ICE9IG51bGwgOiAhQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIEFDVFVBTF9PVkVSVElNRV9XT1JLX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxPdmVydGltZVdvcmsgIT0gbnVsbCA6ICFBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVC5lcXVhbHMoYWN0dWFsT3ZlcnRpbWVXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfU1RBUlQ6Ci0JCQkJcmV0dXJuIEFDVFVBTF9TVEFSVF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsU3RhcnQgIT0gbnVsbCA6ICFBQ1RVQUxfU1RBUlRfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SSzoKLQkJCQlyZXR1cm4gQUNUVUFMX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbFdvcmsgIT0gbnVsbCA6ICFBQ1RVQUxfV09SS19FREVGQVVMVC5lcXVhbHMoYWN0dWFsV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNXUDoKLQkJCQlyZXR1cm4gaXNTZXRBQ1dQKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09ORklSTUVEOgotCQkJCXJldHVybiBpc1NldENvbmZpcm1lZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1Q6Ci0JCQkJcmV0dXJuIENPU1RfRURFRkFVTFQgPT0gbnVsbCA/IGNvc3QgIT0gbnVsbCA6ICFDT1NUX0VERUZBVUxULmVxdWFscyhjb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUX1JBVEVfVEFCTEU6Ci0JCQkJcmV0dXJuIENPU1RfUkFURV9UQUJMRV9FREVGQVVMVCA9PSBudWxsID8gY29zdFJhdGVUYWJsZSAhPSBudWxsIDogIUNPU1RfUkFURV9UQUJMRV9FREVGQVVMVC5lcXVhbHMoY29zdFJhdGVUYWJsZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9WQVJJQU5DRToKLQkJCQlyZXR1cm4gaXNTZXRDb3N0VmFyaWFuY2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DVjoKLQkJCQlyZXR1cm4gaXNTZXRDVigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0RFTEFZOgotCQkJCXJldHVybiBERUxBWV9FREVGQVVMVCA9PSBudWxsID8gZGVsYXkgIT0gbnVsbCA6ICFERUxBWV9FREVGQVVMVC5lcXVhbHMoZGVsYXkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJTklTSDoKLQkJCQlyZXR1cm4gRklOSVNIX0VERUZBVUxUID09IG51bGwgPyBmaW5pc2ggIT0gbnVsbCA6ICFGSU5JU0hfRURFRkFVTFQuZXF1YWxzKGZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIX1ZBUklBTkNFOgotCQkJCXJldHVybiBGSU5JU0hfVkFSSUFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaFZhcmlhbmNlICE9IG51bGwgOiAhRklOSVNIX1ZBUklBTkNFX0VERUZBVUxULmVxdWFscyhmaW5pc2hWYXJpYW5jZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LOgotCQkJCXJldHVybiBIWVBFUkxJTktfRURFRkFVTFQgPT0gbnVsbCA/IGh5cGVybGluayAhPSBudWxsIDogIUhZUEVSTElOS19FREVGQVVMVC5lcXVhbHMoaHlwZXJsaW5rKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX0FERFJFU1NfRURFRkFVTFQgPT0gbnVsbCA/IGh5cGVybGlua0FkZHJlc3MgIT0gbnVsbCA6ICFIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVC5lcXVhbHMoaHlwZXJsaW5rQWRkcmVzcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX1NVQl9BRERSRVNTOgotCQkJCXJldHVybiBIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQgPT0gbnVsbCA/IGh5cGVybGlua1N1YkFkZHJlc3MgIT0gbnVsbCA6ICFIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQuZXF1YWxzKGh5cGVybGlua1N1YkFkZHJlc3MpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIGlzU2V0V29ya1ZhcmlhbmNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSEFTX0ZJWEVEX1JBVEVfVU5JVFM6Ci0JCQkJcmV0dXJuIGlzU2V0SGFzRml4ZWRSYXRlVW5pdHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19GSVhFRF9NQVRFUklBTDoKLQkJCQlyZXR1cm4gaXNTZXRGaXhlZE1hdGVyaWFsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVk6Ci0JCQkJcmV0dXJuIExFVkVMSU5HX0RFTEFZX0VERUZBVUxUID09IG51bGwgPyBsZXZlbGluZ0RlbGF5ICE9IG51bGwgOiAhTEVWRUxJTkdfREVMQVlfRURFRkFVTFQuZXF1YWxzKGxldmVsaW5nRGVsYXkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVDoKLQkJCQlyZXR1cm4gTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBsZXZlbGluZ0RlbGF5Rm9ybWF0ICE9IG51bGwgOiAhTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxULmVxdWFscyhsZXZlbGluZ0RlbGF5Rm9ybWF0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MSU5LRURfRklFTERTOgotCQkJCXJldHVybiBpc1NldExpbmtlZEZpZWxkcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX01JTEVTVE9ORToKLQkJCQlyZXR1cm4gaXNTZXRNaWxlc3RvbmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19OT1RFUzoKLQkJCQlyZXR1cm4gTk9URVNfRURFRkFVTFQgPT0gbnVsbCA/IG5vdGVzICE9IG51bGwgOiAhTk9URVNfRURFRkFVTFQuZXF1YWxzKG5vdGVzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSQUxMT0NBVEVEOgotCQkJCXJldHVybiBpc1NldE92ZXJhbGxvY2F0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBPVkVSVElNRV9DT1NUX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZUNvc3QgIT0gbnVsbCA6ICFPVkVSVElNRV9DT1NUX0VERUZBVUxULmVxdWFscyhvdmVydGltZUNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIE9WRVJUSU1FX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IG92ZXJ0aW1lV29yayAhPSBudWxsIDogIU9WRVJUSU1FX1dPUktfRURFRkFVTFQuZXF1YWxzKG92ZXJ0aW1lV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVHVUxBUl9XT1JLOgotCQkJCXJldHVybiBSRUdVTEFSX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IHJlZ3VsYXJXb3JrICE9IG51bGwgOiAhUkVHVUxBUl9XT1JLX0VERUZBVUxULmVxdWFscyhyZWd1bGFyV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19DT1NUX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdDb3N0ICE9IG51bGwgOiAhUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ0Nvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nT3ZlcnRpbWVDb3N0ICE9IG51bGwgOiAhUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ092ZXJ0aW1lQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdPdmVydGltZVdvcmsgIT0gbnVsbCA6ICFSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nT3ZlcnRpbWVXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfV09SSzoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ1dvcmsgIT0gbnVsbCA6ICFSRU1BSU5JTkdfV09SS19FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTUE9OU0VfUEVORElORzoKLQkJCQlyZXR1cm4gaXNTZXRSZXNwb25zZVBlbmRpbmcoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVEFSVDoKLQkJCQlyZXR1cm4gU1RBUlRfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0ICE9IG51bGwgOiAhU1RBUlRfRURFRkFVTFQuZXF1YWxzKHN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVE9QOgotCQkJCXJldHVybiBTVE9QX0VERUZBVUxUID09IG51bGwgPyBzdG9wICE9IG51bGwgOiAhU1RPUF9FREVGQVVMVC5lcXVhbHMoc3RvcCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTVU1FOgotCQkJCXJldHVybiBSRVNVTUVfRURFRkFVTFQgPT0gbnVsbCA/IHJlc3VtZSAhPSBudWxsIDogIVJFU1VNRV9FREVGQVVMVC5lcXVhbHMocmVzdW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVEFSVF9WQVJJQU5DRToKLQkJCQlyZXR1cm4gU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0VmFyaWFuY2UgIT0gbnVsbCA6ICFTVEFSVF9WQVJJQU5DRV9FREVGQVVMVC5lcXVhbHMoc3RhcnRWYXJpYW5jZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVU5JVFM6Ci0JCQkJcmV0dXJuIGlzU2V0VW5pdHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VUERBVEVfTkVFREVEOgotCQkJCXJldHVybiBpc1NldFVwZGF0ZU5lZWRlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1ZBQzoKLQkJCQlyZXR1cm4gaXNTZXRWQUMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLOgotCQkJCXJldHVybiBXT1JLX0VERUZBVUxUID09IG51bGwgPyB3b3JrICE9IG51bGwgOiAhV09SS19FREVGQVVMVC5lcXVhbHMod29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SS19DT05UT1VSOgotCQkJCXJldHVybiBXT1JLX0NPTlRPVVJfRURFRkFVTFQgPT0gbnVsbCA/IHdvcmtDb250b3VyICE9IG51bGwgOiAhV09SS19DT05UT1VSX0VERUZBVUxULmVxdWFscyh3b3JrQ29udG91cik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUzoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dTKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUDoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dQKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQk9PS0lOR19UWVBFOgotCQkJCXJldHVybiBCT09LSU5HX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGJvb2tpbmdUeXBlICE9IG51bGwgOiAhQk9PS0lOR19UWVBFX0VERUZBVUxULmVxdWFscyhib29raW5nVHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbFdvcmtQcm90ZWN0ZWQgIT0gbnVsbCA6ICFBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFdvcmtQcm90ZWN0ZWQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgIT0gbnVsbCA6ICFBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ1JFQVRJT05fREFURToKLQkJCQlyZXR1cm4gQ1JFQVRJT05fREFURV9FREVGQVVMVCA9PSBudWxsID8gY3JlYXRpb25EYXRlICE9IG51bGwgOiAhQ1JFQVRJT05fREFURV9FREVGQVVMVC5lcXVhbHMoY3JlYXRpb25EYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlICE9IG51bGwgJiYgIWV4dGVuZGVkQXR0cmlidXRlLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQVNFTElORToKLQkJCQlyZXR1cm4gYmFzZWxpbmUgIT0gbnVsbCAmJiAhYmFzZWxpbmUuaXNFbXB0eSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RJTUVQSEFTRURfREFUQToKLQkJCQlyZXR1cm4gdGltZXBoYXNlZERhdGEgIT0gbnVsbCAmJiAhdGltZXBoYXNlZERhdGEuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1SUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRhc2tVSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRhc2tVSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc291cmNlVUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXNvdXJjZVVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGVyY2VudFdvcmtDb21wbGV0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGVyY2VudFdvcmtDb21wbGV0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsRmluaXNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxGaW5pc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbE92ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsT3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsU3RhcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbFN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhQ1dQOiAiKTsKLQkJaWYgKGFDV1BFU2V0KSByZXN1bHQuYXBwZW5kKGFDV1ApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb25maXJtZWQ6ICIpOwotCQlpZiAoY29uZmlybWVkRVNldCkgcmVzdWx0LmFwcGVuZChjb25maXJtZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0UmF0ZVRhYmxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3N0UmF0ZVRhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0VmFyaWFuY2U6ICIpOwotCQlpZiAoY29zdFZhcmlhbmNlRVNldCkgcmVzdWx0LmFwcGVuZChjb3N0VmFyaWFuY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjVjogIik7Ci0JCWlmIChjVkVTZXQpIHJlc3VsdC5hcHBlbmQoY1YpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWxheTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVsYXkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaW5pc2hWYXJpYW5jZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoVmFyaWFuY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGluazogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaHlwZXJsaW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoeXBlcmxpbmtBZGRyZXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoeXBlcmxpbmtBZGRyZXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoeXBlcmxpbmtTdWJBZGRyZXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoeXBlcmxpbmtTdWJBZGRyZXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrVmFyaWFuY2U6ICIpOwotCQlpZiAod29ya1ZhcmlhbmNlRVNldCkgcmVzdWx0LmFwcGVuZCh3b3JrVmFyaWFuY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoYXNGaXhlZFJhdGVVbml0czogIik7Ci0JCWlmIChoYXNGaXhlZFJhdGVVbml0c0VTZXQpIHJlc3VsdC5hcHBlbmQoaGFzRml4ZWRSYXRlVW5pdHMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaXhlZE1hdGVyaWFsOiAiKTsKLQkJaWYgKGZpeGVkTWF0ZXJpYWxFU2V0KSByZXN1bHQuYXBwZW5kKGZpeGVkTWF0ZXJpYWwpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbGluZ0RlbGF5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbGluZ0RlbGF5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbGluZ0RlbGF5Rm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbGluZ0RlbGF5Rm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsaW5rZWRGaWVsZHM6ICIpOwotCQlpZiAobGlua2VkRmllbGRzRVNldCkgcmVzdWx0LmFwcGVuZChsaW5rZWRGaWVsZHMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtaWxlc3RvbmU6ICIpOwotCQlpZiAobWlsZXN0b25lRVNldCkgcmVzdWx0LmFwcGVuZChtaWxlc3RvbmUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBub3RlczogIik7Ci0JCXJlc3VsdC5hcHBlbmQobm90ZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJhbGxvY2F0ZWQ6ICIpOwotCQlpZiAob3ZlcmFsbG9jYXRlZEVTZXQpIHJlc3VsdC5hcHBlbmQob3ZlcmFsbG9jYXRlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG92ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVndWxhcldvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlZ3VsYXJXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdPdmVydGltZUNvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ092ZXJ0aW1lQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtYWluaW5nT3ZlcnRpbWVXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdPdmVydGltZVdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ1dvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ1dvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc3BvbnNlUGVuZGluZzogIik7Ci0JCWlmIChyZXNwb25zZVBlbmRpbmdFU2V0KSByZXN1bHQuYXBwZW5kKHJlc3BvbnNlUGVuZGluZyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGFydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RvcDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RvcCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzdW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXN1bWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0VmFyaWFuY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YXJ0VmFyaWFuY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVuaXRzOiAiKTsKLQkJaWYgKHVuaXRzRVNldCkgcmVzdWx0LmFwcGVuZCh1bml0cyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVwZGF0ZU5lZWRlZDogIik7Ci0JCWlmICh1cGRhdGVOZWVkZWRFU2V0KSByZXN1bHQuYXBwZW5kKHVwZGF0ZU5lZWRlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZBQzogIik7Ci0JCWlmICh2QUNFU2V0KSByZXN1bHQuYXBwZW5kKHZBQyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcmtDb250b3VyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrQ29udG91cik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUzogIik7Ci0JCWlmIChiQ1dTRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dTKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUDogIik7Ci0JCWlmIChiQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYm9va2luZ1R5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGJvb2tpbmdUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxXb3JrUHJvdGVjdGVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxXb3JrUHJvdGVjdGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3JlYXRpb25EYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjcmVhdGlvbkRhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Bc3NpZ25tZW50SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQXNzaWdubWVudHNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Bc3NpZ25tZW50c0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzdlODA5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Bc3NpZ25tZW50c0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFzc2lnbm1lbnRzSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXNzaWdubWVudHM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50c0ltcGwjZ2V0QXNzaWdubWVudCA8ZW0+QXNzaWdubWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFzc2lnbm1lbnRzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQXNzaWdubWVudHMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFzc2lnbm1lbnQoKSA8ZW0+QXNzaWdubWVudDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYXNzaWdubWVudCA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXNzaWdubWVudHNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXNzaWdubWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QXNzaWdubWVudCgpIHsKLQkJaWYgKGFzc2lnbm1lbnQgPT0gbnVsbCkgewotCQkJYXNzaWdubWVudCA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChBc3NpZ25tZW50LmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRTX19BU1NJR05NRU5UKTsKLQkJfQotCQlyZXR1cm4gYXNzaWdubWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVFNfX0FTU0lHTk1FTlQ6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QXNzaWdubWVudCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVFNfX0FTU0lHTk1FTlQ6Ci0JCQkJcmV0dXJuIGdldEFzc2lnbm1lbnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVFNfX0FTU0lHTk1FTlQ6Ci0JCQkJZ2V0QXNzaWdubWVudCgpLmNsZWFyKCk7Ci0JCQkJZ2V0QXNzaWdubWVudCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UU19fQVNTSUdOTUVOVDoKLQkJCQlnZXRBc3NpZ25tZW50KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UU19fQVNTSUdOTUVOVDoKLQkJCQlyZXR1cm4gYXNzaWdubWVudCAhPSBudWxsICYmICFhc3NpZ25tZW50LmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vQXNzaWdubWVudHNJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9BdmFpbGFiaWxpdHlQZXJpb2RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9BdmFpbGFiaWxpdHlQZXJpb2RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc2NTIzMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQXZhaWxhYmlsaXR5UGVyaW9kSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXZhaWxhYmlsaXR5UGVyaW9kSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXZhaWxhYmlsaXR5IFBlcmlvZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkF2YWlsYWJpbGl0eVBlcmlvZEltcGwjZ2V0QXZhaWxhYmxlRnJvbSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5BdmFpbGFiaWxpdHlQZXJpb2RJbXBsI2dldEF2YWlsYWJsZVRvIDxlbT5BdmFpbGFibGUgVG88L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5BdmFpbGFiaWxpdHlQZXJpb2RJbXBsI2dldEF2YWlsYWJsZVVuaXRzIDxlbT5BdmFpbGFibGUgVW5pdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBdmFpbGFiaWxpdHlQZXJpb2RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBBdmFpbGFiaWxpdHlQZXJpb2QgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdmFpbGFibGVGcm9tKCkgPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdmFpbGFibGVGcm9tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBVkFJTEFCTEVfRlJPTV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdmFpbGFibGVGcm9tKCkgPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdmFpbGFibGVGcm9tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGF2YWlsYWJsZUZyb20gPSBBVkFJTEFCTEVfRlJPTV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdmFpbGFibGVUbygpIDxlbT5BdmFpbGFibGUgVG88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVRvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBVkFJTEFCTEVfVE9fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXZhaWxhYmxlVG8oKSA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdmFpbGFibGVUbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhdmFpbGFibGVUbyA9IEFWQUlMQUJMRV9UT19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdmFpbGFibGVVbml0cygpIDxlbT5BdmFpbGFibGUgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEFWQUlMQUJMRV9VTklUU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdmFpbGFibGVVbml0cygpIDxlbT5BdmFpbGFibGUgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYXZhaWxhYmxlVW5pdHMgPSBBVkFJTEFCTEVfVU5JVFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEF2YWlsYWJsZSBVbml0cyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXZhaWxhYmxlVW5pdHNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXZhaWxhYmlsaXR5UGVyaW9kSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEF2YWlsYWJpbGl0eVBlcmlvZCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QXZhaWxhYmxlRnJvbSgpIHsKLQkJcmV0dXJuIGF2YWlsYWJsZUZyb207Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlRnJvbShPYmplY3QgbmV3QXZhaWxhYmxlRnJvbSkgewotCQlPYmplY3Qgb2xkQXZhaWxhYmxlRnJvbSA9IGF2YWlsYWJsZUZyb207Ci0JCWF2YWlsYWJsZUZyb20gPSBuZXdBdmFpbGFibGVGcm9tOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9GUk9NLCBvbGRBdmFpbGFibGVGcm9tLCBhdmFpbGFibGVGcm9tKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBdmFpbGFibGVUbygpIHsKLQkJcmV0dXJuIGF2YWlsYWJsZVRvOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF2YWlsYWJsZVRvKE9iamVjdCBuZXdBdmFpbGFibGVUbykgewotCQlPYmplY3Qgb2xkQXZhaWxhYmxlVG8gPSBhdmFpbGFibGVUbzsKLQkJYXZhaWxhYmxlVG8gPSBuZXdBdmFpbGFibGVUbzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVE8sIG9sZEF2YWlsYWJsZVRvLCBhdmFpbGFibGVUbykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRBdmFpbGFibGVVbml0cygpIHsKLQkJcmV0dXJuIGF2YWlsYWJsZVVuaXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF2YWlsYWJsZVVuaXRzKGZsb2F0IG5ld0F2YWlsYWJsZVVuaXRzKSB7Ci0JCWZsb2F0IG9sZEF2YWlsYWJsZVVuaXRzID0gYXZhaWxhYmxlVW5pdHM7Ci0JCWF2YWlsYWJsZVVuaXRzID0gbmV3QXZhaWxhYmxlVW5pdHM7Ci0JCWJvb2xlYW4gb2xkQXZhaWxhYmxlVW5pdHNFU2V0ID0gYXZhaWxhYmxlVW5pdHNFU2V0OwotCQlhdmFpbGFibGVVbml0c0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9VTklUUywgb2xkQXZhaWxhYmxlVW5pdHMsIGF2YWlsYWJsZVVuaXRzLCAhb2xkQXZhaWxhYmxlVW5pdHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBdmFpbGFibGVVbml0cygpIHsKLQkJZmxvYXQgb2xkQXZhaWxhYmxlVW5pdHMgPSBhdmFpbGFibGVVbml0czsKLQkJYm9vbGVhbiBvbGRBdmFpbGFibGVVbml0c0VTZXQgPSBhdmFpbGFibGVVbml0c0VTZXQ7Ci0JCWF2YWlsYWJsZVVuaXRzID0gQVZBSUxBQkxFX1VOSVRTX0VERUZBVUxUOwotCQlhdmFpbGFibGVVbml0c0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9VTklUUywgb2xkQXZhaWxhYmxlVW5pdHMsIEFWQUlMQUJMRV9VTklUU19FREVGQVVMVCwgb2xkQXZhaWxhYmxlVW5pdHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRBdmFpbGFibGVVbml0cygpIHsKLQkJcmV0dXJuIGF2YWlsYWJsZVVuaXRzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX0ZST006Ci0JCQkJcmV0dXJuIGdldEF2YWlsYWJsZUZyb20oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVE86Ci0JCQkJcmV0dXJuIGdldEF2YWlsYWJsZVRvKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1VOSVRTOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QXZhaWxhYmxlVW5pdHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9GUk9NOgotCQkJCXNldEF2YWlsYWJsZUZyb20oKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9UTzoKLQkJCQlzZXRBdmFpbGFibGVUbygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1VOSVRTOgotCQkJCXNldEF2YWlsYWJsZVVuaXRzKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfRlJPTToKLQkJCQlzZXRBdmFpbGFibGVGcm9tKEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1RPOgotCQkJCXNldEF2YWlsYWJsZVRvKEFWQUlMQUJMRV9UT19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9VTklUUzoKLQkJCQl1bnNldEF2YWlsYWJsZVVuaXRzKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX0ZST006Ci0JCQkJcmV0dXJuIEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUID09IG51bGwgPyBhdmFpbGFibGVGcm9tICE9IG51bGwgOiAhQVZBSUxBQkxFX0ZST01fRURFRkFVTFQuZXF1YWxzKGF2YWlsYWJsZUZyb20pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9UTzoKLQkJCQlyZXR1cm4gQVZBSUxBQkxFX1RPX0VERUZBVUxUID09IG51bGwgPyBhdmFpbGFibGVUbyAhPSBudWxsIDogIUFWQUlMQUJMRV9UT19FREVGQVVMVC5lcXVhbHMoYXZhaWxhYmxlVG8pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9VTklUUzoKLQkJCQlyZXR1cm4gaXNTZXRBdmFpbGFibGVVbml0cygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYXZhaWxhYmxlRnJvbTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXZhaWxhYmxlRnJvbSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXZhaWxhYmxlVG86ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF2YWlsYWJsZVRvKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdmFpbGFibGVVbml0czogIik7Ci0JCWlmIChhdmFpbGFibGVVbml0c0VTZXQpIHJlc3VsdC5hcHBlbmQoYXZhaWxhYmxlVW5pdHMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQXZhaWxhYmlsaXR5UGVyaW9kSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQXZhaWxhYmlsaXR5UGVyaW9kc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0F2YWlsYWJpbGl0eVBlcmlvZHNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUzYzIzMzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQXZhaWxhYmlsaXR5UGVyaW9kc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEF2YWlsYWJpbGl0eVBlcmlvZHNJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5BdmFpbGFiaWxpdHlQZXJpb2RzSW1wbCNnZXRBdmFpbGFiaWxpdHlQZXJpb2QgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBdmFpbGFiaWxpdHlQZXJpb2RzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQXZhaWxhYmlsaXR5UGVyaW9kcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYXZhaWxhYmlsaXR5UGVyaW9kID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBdmFpbGFiaWxpdHlQZXJpb2RzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEF2YWlsYWJpbGl0eVBlcmlvZHMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkgewotCQlpZiAoYXZhaWxhYmlsaXR5UGVyaW9kID09IG51bGwpIHsKLQkJCWF2YWlsYWJpbGl0eVBlcmlvZCA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChBdmFpbGFiaWxpdHlQZXJpb2QuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRFNfX0FWQUlMQUJJTElUWV9QRVJJT0QpOwotCQl9Ci0JCXJldHVybiBhdmFpbGFiaWxpdHlQZXJpb2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RTX19BVkFJTEFCSUxJVFlfUEVSSU9EOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEF2YWlsYWJpbGl0eVBlcmlvZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRFNfX0FWQUlMQUJJTElUWV9QRVJJT0Q6Ci0JCQkJcmV0dXJuIGdldEF2YWlsYWJpbGl0eVBlcmlvZCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EU19fQVZBSUxBQklMSVRZX1BFUklPRDoKLQkJCQlnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKS5jbGVhcigpOwotCQkJCWdldEF2YWlsYWJpbGl0eVBlcmlvZCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EU19fQVZBSUxBQklMSVRZX1BFUklPRDoKLQkJCQlnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RTX19BVkFJTEFCSUxJVFlfUEVSSU9EOgotCQkJCXJldHVybiBhdmFpbGFiaWxpdHlQZXJpb2QgIT0gbnVsbCAmJiAhYXZhaWxhYmlsaXR5UGVyaW9kLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vQXZhaWxhYmlsaXR5UGVyaW9kc0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Jhc2VsaW5lMkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Jhc2VsaW5lMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzExZDg2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9CYXNlbGluZTJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCYXNlbGluZTJJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2VsaW5lMjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lMkltcGwjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTJJbXBsI2dldFdvcmsgPGVtPldvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTJJbXBsI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTJJbXBsI2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTJJbXBsI2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlbGluZTJJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBCYXNlbGluZTIgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdW1iZXIoKSA8ZW0+TnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBOVU1CRVJfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TnVtYmVyKCkgPGVtPk51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TnVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBudW1iZXIgPSBOVU1CRVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBXT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCB3b3JrID0gV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQ09TVF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBjb3N0ID0gQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ29zdCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29zdEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dTID0gQkNXU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXU0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXUF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dQID0gQkNXUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXUEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBCYXNlbGluZTJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmFzZWxpbmUyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TnVtYmVyKCkgewotCQlyZXR1cm4gbnVtYmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE51bWJlcihCaWdJbnRlZ2VyIG5ld051bWJlcikgewotCQlCaWdJbnRlZ2VyIG9sZE51bWJlciA9IG51bWJlcjsKLQkJbnVtYmVyID0gbmV3TnVtYmVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fTlVNQkVSLCBvbGROdW1iZXIsIG51bWJlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0V29yaygpIHsKLQkJcmV0dXJuIHdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29yayhPYmplY3QgbmV3V29yaykgewotCQlPYmplY3Qgb2xkV29yayA9IHdvcms7Ci0JCXdvcmsgPSBuZXdXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fV09SSywgb2xkV29yaywgd29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRDb3N0KCkgewotCQlyZXR1cm4gY29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3N0KGZsb2F0IG5ld0Nvc3QpIHsKLQkJZmxvYXQgb2xkQ29zdCA9IGNvc3Q7Ci0JCWNvc3QgPSBuZXdDb3N0OwotCQlib29sZWFuIG9sZENvc3RFU2V0ID0gY29zdEVTZXQ7Ci0JCWNvc3RFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0NPU1QsIG9sZENvc3QsIGNvc3QsICFvbGRDb3N0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q29zdCgpIHsKLQkJZmxvYXQgb2xkQ29zdCA9IGNvc3Q7Ci0JCWJvb2xlYW4gb2xkQ29zdEVTZXQgPSBjb3N0RVNldDsKLQkJY29zdCA9IENPU1RfRURFRkFVTFQ7Ci0JCWNvc3RFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0NPU1QsIG9sZENvc3QsIENPU1RfRURFRkFVTFQsIG9sZENvc3RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRDb3N0KCkgewotCQlyZXR1cm4gY29zdEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1MoKSB7Ci0JCXJldHVybiBiQ1dTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1MoZmxvYXQgbmV3QkNXUykgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYkNXUyA9IG5ld0JDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXU0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUywgb2xkQkNXUywgYkNXUywgIW9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dTKCkgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYm9vbGVhbiBvbGRCQ1dTRVNldCA9IGJDV1NFU2V0OwotCQliQ1dTID0gQkNXU19FREVGQVVMVDsKLQkJYkNXU0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUywgb2xkQkNXUywgQkNXU19FREVGQVVMVCwgb2xkQkNXU0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEJDV1MoKSB7Ci0JCXJldHVybiBiQ1dTRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0QkNXUCgpIHsKLQkJcmV0dXJuIGJDV1A7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QkNXUChmbG9hdCBuZXdCQ1dQKSB7Ci0JCWZsb2F0IG9sZEJDV1AgPSBiQ1dQOwotCQliQ1dQID0gbmV3QkNXUDsKLQkJYm9vbGVhbiBvbGRCQ1dQRVNldCA9IGJDV1BFU2V0OwotCQliQ1dQRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19CQ1dQLCBvbGRCQ1dQLCBiQ1dQLCAhb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1AoKSB7Ci0JCWZsb2F0IG9sZEJDV1AgPSBiQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCQliQ1dQRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19CQ1dQLCBvbGRCQ1dQLCBCQ1dQX0VERUZBVUxULCBvbGRCQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUCgpIHsKLQkJcmV0dXJuIGJDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX05VTUJFUjoKLQkJCQlyZXR1cm4gZ2V0TnVtYmVyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19XT1JLOgotCQkJCXJldHVybiBnZXRXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19DT1NUOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0Q29zdCgpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1M6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dTKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1AoKSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fTlVNQkVSOgotCQkJCXNldE51bWJlcigoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fV09SSzoKLQkJCQlzZXRXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0NPU1Q6Ci0JCQkJc2V0Q29zdCgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1M6Ci0JCQkJc2V0QkNXUygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1A6Ci0JCQkJc2V0QkNXUCgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19OVU1CRVI6Ci0JCQkJc2V0TnVtYmVyKE5VTUJFUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fV09SSzoKLQkJCQlzZXRXb3JrKFdPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0NPU1Q6Ci0JCQkJdW5zZXRDb3N0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUzoKLQkJCQl1bnNldEJDV1MoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19CQ1dQOgotCQkJCXVuc2V0QkNXUCgpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fTlVNQkVSOgotCQkJCXJldHVybiBOVU1CRVJfRURFRkFVTFQgPT0gbnVsbCA/IG51bWJlciAhPSBudWxsIDogIU5VTUJFUl9FREVGQVVMVC5lcXVhbHMobnVtYmVyKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX1dPUks6Ci0JCQkJcmV0dXJuIFdPUktfRURFRkFVTFQgPT0gbnVsbCA/IHdvcmsgIT0gbnVsbCA6ICFXT1JLX0VERUZBVUxULmVxdWFscyh3b3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0NPU1Q6Ci0JCQkJcmV0dXJuIGlzU2V0Q29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUzoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dTKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19CQ1dQOgotCQkJCXJldHVybiBpc1NldEJDV1AoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG51bWJlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobnVtYmVyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0OiAiKTsKLQkJaWYgKGNvc3RFU2V0KSByZXN1bHQuYXBwZW5kKGNvc3QpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dTOiAiKTsKLQkJaWYgKGJDV1NFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1MpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dQOiAiKTsKLQkJaWYgKGJDV1BFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1ApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQmFzZWxpbmUySW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQmFzZWxpbmUzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQmFzZWxpbmUzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZTY0Yzc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Jhc2VsaW5lM0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJhc2VsaW5lM0ltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CYXNlbGluZTM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldE51bWJlciA8ZW0+TnVtYmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUzSW1wbCNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUzSW1wbCNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUzSW1wbCNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUzSW1wbCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUzSW1wbCNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQmFzZWxpbmUzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQmFzZWxpbmUzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUaW1lcGhhc2VkRGF0YSgpIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGltZXBoYXNlZERhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB0aW1lcGhhc2VkRGF0YSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TnVtYmVyKCkgPGVtPk51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TnVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOVU1CRVJfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TnVtYmVyKCkgPGVtPk51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TnVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG51bWJlciA9IE5VTUJFUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydCgpIDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzdGFydCA9IFNUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaCgpIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOSVNIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaCgpIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaW5pc2ggPSBGSU5JU0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBXT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCB3b3JrID0gV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvc3QgPSBDT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1MoKSA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBCQ1dTX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1MoKSA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGJDV1MgPSBCQ1dTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBCQ1dTIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiQ1dTRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1AoKSA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBCQ1dQX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1AoKSA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBCQ1dQIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiQ1dQRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEJhc2VsaW5lM0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRCYXNlbGluZTMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VGltZXBoYXNlZERhdGEoKSB7Ci0JCWlmICh0aW1lcGhhc2VkRGF0YSA9PSBudWxsKSB7Ci0JCQl0aW1lcGhhc2VkRGF0YSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChUaW1lcGhhc2VkRGF0YVR5cGUuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19USU1FUEhBU0VEX0RBVEEpOwotCQl9Ci0JCXJldHVybiB0aW1lcGhhc2VkRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE51bWJlcigpIHsKLQkJcmV0dXJuIG51bWJlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROdW1iZXIoU3RyaW5nIG5ld051bWJlcikgewotCQlTdHJpbmcgb2xkTnVtYmVyID0gbnVtYmVyOwotCQludW1iZXIgPSBuZXdOdW1iZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19OVU1CRVIsIG9sZE51bWJlciwgbnVtYmVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIHN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KFN0cmluZyBuZXdTdGFydCkgewotCQlTdHJpbmcgb2xkU3RhcnQgPSBzdGFydDsKLQkJc3RhcnQgPSBuZXdTdGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1NUQVJULCBvbGRTdGFydCwgc3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbmlzaCgpIHsKLQkJcmV0dXJuIGZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2goU3RyaW5nIG5ld0ZpbmlzaCkgewotCQlTdHJpbmcgb2xkRmluaXNoID0gZmluaXNoOwotCQlmaW5pc2ggPSBuZXdGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19GSU5JU0gsIG9sZEZpbmlzaCwgZmluaXNoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRXb3JrKCkgewotCQlyZXR1cm4gd29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrKE9iamVjdCBuZXdXb3JrKSB7Ci0JCU9iamVjdCBvbGRXb3JrID0gd29yazsKLQkJd29yayA9IG5ld1dvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19XT1JLLCBvbGRXb3JrLCB3b3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb3N0KCkgewotCQlyZXR1cm4gY29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3N0KFN0cmluZyBuZXdDb3N0KSB7Ci0JCVN0cmluZyBvbGRDb3N0ID0gY29zdDsKLQkJY29zdCA9IG5ld0Nvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19DT1NULCBvbGRDb3N0LCBjb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1MoKSB7Ci0JCXJldHVybiBiQ1dTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1MoZmxvYXQgbmV3QkNXUykgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYkNXUyA9IG5ld0JDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXU0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQkNXUywgb2xkQkNXUywgYkNXUywgIW9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dTKCkgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYm9vbGVhbiBvbGRCQ1dTRVNldCA9IGJDV1NFU2V0OwotCQliQ1dTID0gQkNXU19FREVGQVVMVDsKLQkJYkNXU0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQkNXUywgb2xkQkNXUywgQkNXU19FREVGQVVMVCwgb2xkQkNXU0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEJDV1MoKSB7Ci0JCXJldHVybiBiQ1dTRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0QkNXUCgpIHsKLQkJcmV0dXJuIGJDV1A7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QkNXUChmbG9hdCBuZXdCQ1dQKSB7Ci0JCWZsb2F0IG9sZEJDV1AgPSBiQ1dQOwotCQliQ1dQID0gbmV3QkNXUDsKLQkJYm9vbGVhbiBvbGRCQ1dQRVNldCA9IGJDV1BFU2V0OwotCQliQ1dQRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dQLCBvbGRCQ1dQLCBiQ1dQLCAhb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1AoKSB7Ci0JCWZsb2F0IG9sZEJDV1AgPSBiQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCQliQ1dQRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dQLCBvbGRCQ1dQLCBCQ1dQX0VERUZBVUxULCBvbGRCQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUCgpIHsKLQkJcmV0dXJuIGJDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1RJTUVQSEFTRURfREFUQToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRUaW1lcGhhc2VkRGF0YSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIGdldFRpbWVwaGFzZWREYXRhKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19OVU1CRVI6Ci0JCQkJcmV0dXJuIGdldE51bWJlcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19GSU5JU0g6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fV09SSzoKLQkJCQlyZXR1cm4gZ2V0V29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQ09TVDoKLQkJCQlyZXR1cm4gZ2V0Q29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQkNXUzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1MoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dQOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QkNXUCgpKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5jbGVhcigpOwotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19OVU1CRVI6Ci0JCQkJc2V0TnVtYmVyKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1NUQVJUOgotCQkJCXNldFN0YXJ0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fV09SSzoKLQkJCQlzZXRXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0NPU1Q6Ci0JCQkJc2V0Q29zdCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dTOgotCQkJCXNldEJDV1MoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dQOgotCQkJCXNldEJDV1AoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fVElNRVBIQVNFRF9EQVRBOgotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19OVU1CRVI6Ci0JCQkJc2V0TnVtYmVyKE5VTUJFUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoU1RBUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goRklOSVNIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19XT1JLOgotCQkJCXNldFdvcmsoV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQ09TVDoKLQkJCQlzZXRDb3N0KENPU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1M6Ci0JCQkJdW5zZXRCQ1dTKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQkNXUDoKLQkJCQl1bnNldEJDV1AoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1RJTUVQSEFTRURfREFUQToKLQkJCQlyZXR1cm4gdGltZXBoYXNlZERhdGEgIT0gbnVsbCAmJiAhdGltZXBoYXNlZERhdGEuaXNFbXB0eSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fTlVNQkVSOgotCQkJCXJldHVybiBOVU1CRVJfRURFRkFVTFQgPT0gbnVsbCA/IG51bWJlciAhPSBudWxsIDogIU5VTUJFUl9FREVGQVVMVC5lcXVhbHMobnVtYmVyKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1NUQVJUOgotCQkJCXJldHVybiBTVEFSVF9FREVGQVVMVCA9PSBudWxsID8gc3RhcnQgIT0gbnVsbCA6ICFTVEFSVF9FREVGQVVMVC5lcXVhbHMoc3RhcnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fRklOSVNIOgotCQkJCXJldHVybiBGSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaCAhPSBudWxsIDogIUZJTklTSF9FREVGQVVMVC5lcXVhbHMoZmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1dPUks6Ci0JCQkJcmV0dXJuIFdPUktfRURFRkFVTFQgPT0gbnVsbCA/IHdvcmsgIT0gbnVsbCA6ICFXT1JLX0VERUZBVUxULmVxdWFscyh3b3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0NPU1Q6Ci0JCQkJcmV0dXJuIENPU1RfRURFRkFVTFQgPT0gbnVsbCA/IGNvc3QgIT0gbnVsbCA6ICFDT1NUX0VERUZBVUxULmVxdWFscyhjb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1M6Ci0JCQkJcmV0dXJuIGlzU2V0QkNXUygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQkNXUDoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dQKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChudW1iZXI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG51bWJlcik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaW5pc2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpbmlzaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQod29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUzogIik7Ci0JCWlmIChiQ1dTRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dTKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUDogIik7Ci0JCWlmIChiQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Jhc2VsaW5lM0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Jhc2VsaW5lSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQmFzZWxpbmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3ZjcyNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQmFzZWxpbmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OTYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCYXNlbGluZUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2VsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmVJbXBsI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjaXNJbnRlcmltIDxlbT5JbnRlcmltPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmVJbXBsI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNpc0VzdGltYXRlZER1cmF0aW9uIDxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmVJbXBsI2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJhc2VsaW5lSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQmFzZWxpbmUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVwaGFzZWREYXRhKCkgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRpbWVwaGFzZWREYXRhID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdW1iZXIoKSA8ZW0+TnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBOVU1CRVJfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TnVtYmVyKCkgPGVtPk51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TnVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBudW1iZXIgPSBOVU1CRVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbnRlcmltKCkgPGVtPkludGVyaW08L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSW50ZXJpbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElOVEVSSU1fRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSW50ZXJpbSgpIDxlbT5JbnRlcmltPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ludGVyaW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGludGVyaW0gPSBJTlRFUklNX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJbnRlcmltIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbnRlcmltRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZpbmlzaCA9IEZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbigpIDxlbT5EdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IERVUkFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uKCkgPGVtPkR1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkdXJhdGlvbiA9IERVUkFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXQgPSBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFc3RpbWF0ZWREdXJhdGlvbigpIDxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFU1RJTUFURURfRFVSQVRJT05fRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXN0aW1hdGVkRHVyYXRpb24oKSA8ZW0+RXN0aW1hdGVkIER1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VzdGltYXRlZER1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlc3RpbWF0ZWREdXJhdGlvbiA9IEVTVElNQVRFRF9EVVJBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRXN0aW1hdGVkIER1cmF0aW9uIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlc3RpbWF0ZWREdXJhdGlvbkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFdPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHdvcmsgPSBXT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3QoKSA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIENPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBjb3N0ID0gQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dTID0gQkNXU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXU0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXUF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dQID0gQkNXUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXUEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBCYXNlbGluZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRCYXNlbGluZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUaW1lcGhhc2VkRGF0YSgpIHsKLQkJaWYgKHRpbWVwaGFzZWREYXRhID09IG51bGwpIHsKLQkJCXRpbWVwaGFzZWREYXRhID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFRpbWVwaGFzZWREYXRhVHlwZS5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fVElNRVBIQVNFRF9EQVRBKTsKLQkJfQotCQlyZXR1cm4gdGltZXBoYXNlZERhdGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TnVtYmVyKCkgewotCQlyZXR1cm4gbnVtYmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE51bWJlcihCaWdJbnRlZ2VyIG5ld051bWJlcikgewotCQlCaWdJbnRlZ2VyIG9sZE51bWJlciA9IG51bWJlcjsKLQkJbnVtYmVyID0gbmV3TnVtYmVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19OVU1CRVIsIG9sZE51bWJlciwgbnVtYmVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnRlcmltKCkgewotCQlyZXR1cm4gaW50ZXJpbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnRlcmltKGJvb2xlYW4gbmV3SW50ZXJpbSkgewotCQlib29sZWFuIG9sZEludGVyaW0gPSBpbnRlcmltOwotCQlpbnRlcmltID0gbmV3SW50ZXJpbTsKLQkJYm9vbGVhbiBvbGRJbnRlcmltRVNldCA9IGludGVyaW1FU2V0OwotCQlpbnRlcmltRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0lOVEVSSU0sIG9sZEludGVyaW0sIGludGVyaW0sICFvbGRJbnRlcmltRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SW50ZXJpbSgpIHsKLQkJYm9vbGVhbiBvbGRJbnRlcmltID0gaW50ZXJpbTsKLQkJYm9vbGVhbiBvbGRJbnRlcmltRVNldCA9IGludGVyaW1FU2V0OwotCQlpbnRlcmltID0gSU5URVJJTV9FREVGQVVMVDsKLQkJaW50ZXJpbUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19JTlRFUklNLCBvbGRJbnRlcmltLCBJTlRFUklNX0VERUZBVUxULCBvbGRJbnRlcmltRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SW50ZXJpbSgpIHsKLQkJcmV0dXJuIGludGVyaW1FU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChPYmplY3QgbmV3U3RhcnQpIHsKLQkJT2JqZWN0IG9sZFN0YXJ0ID0gc3RhcnQ7Ci0JCXN0YXJ0ID0gbmV3U3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1NUQVJULCBvbGRTdGFydCwgc3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZpbmlzaCgpIHsKLQkJcmV0dXJuIGZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2goT2JqZWN0IG5ld0ZpbmlzaCkgewotCQlPYmplY3Qgb2xkRmluaXNoID0gZmluaXNoOwotCQlmaW5pc2ggPSBuZXdGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0ZJTklTSCwgb2xkRmluaXNoLCBmaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldER1cmF0aW9uKCkgewotCQlyZXR1cm4gZHVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RHVyYXRpb24oT2JqZWN0IG5ld0R1cmF0aW9uKSB7Ci0JCU9iamVjdCBvbGREdXJhdGlvbiA9IGR1cmF0aW9uOwotCQlkdXJhdGlvbiA9IG5ld0R1cmF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTiwgb2xkRHVyYXRpb24sIGR1cmF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKSB7Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIG5ld0R1cmF0aW9uRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkRHVyYXRpb25Gb3JtYXQgPSBkdXJhdGlvbkZvcm1hdDsKLQkJZHVyYXRpb25Gb3JtYXQgPSBuZXdEdXJhdGlvbkZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRFVSQVRJT05fRk9STUFULCBvbGREdXJhdGlvbkZvcm1hdCwgZHVyYXRpb25Gb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VzdGltYXRlZER1cmF0aW9uKCkgewotCQlyZXR1cm4gZXN0aW1hdGVkRHVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXN0aW1hdGVkRHVyYXRpb24oYm9vbGVhbiBuZXdFc3RpbWF0ZWREdXJhdGlvbikgewotCQlib29sZWFuIG9sZEVzdGltYXRlZER1cmF0aW9uID0gZXN0aW1hdGVkRHVyYXRpb247Ci0JCWVzdGltYXRlZER1cmF0aW9uID0gbmV3RXN0aW1hdGVkRHVyYXRpb247Ci0JCWJvb2xlYW4gb2xkRXN0aW1hdGVkRHVyYXRpb25FU2V0ID0gZXN0aW1hdGVkRHVyYXRpb25FU2V0OwotCQllc3RpbWF0ZWREdXJhdGlvbkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19FU1RJTUFURURfRFVSQVRJT04sIG9sZEVzdGltYXRlZER1cmF0aW9uLCBlc3RpbWF0ZWREdXJhdGlvbiwgIW9sZEVzdGltYXRlZER1cmF0aW9uRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RXN0aW1hdGVkRHVyYXRpb24oKSB7Ci0JCWJvb2xlYW4gb2xkRXN0aW1hdGVkRHVyYXRpb24gPSBlc3RpbWF0ZWREdXJhdGlvbjsKLQkJYm9vbGVhbiBvbGRFc3RpbWF0ZWREdXJhdGlvbkVTZXQgPSBlc3RpbWF0ZWREdXJhdGlvbkVTZXQ7Ci0JCWVzdGltYXRlZER1cmF0aW9uID0gRVNUSU1BVEVEX0RVUkFUSU9OX0VERUZBVUxUOwotCQllc3RpbWF0ZWREdXJhdGlvbkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19FU1RJTUFURURfRFVSQVRJT04sIG9sZEVzdGltYXRlZER1cmF0aW9uLCBFU1RJTUFURURfRFVSQVRJT05fRURFRkFVTFQsIG9sZEVzdGltYXRlZER1cmF0aW9uRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RXN0aW1hdGVkRHVyYXRpb24oKSB7Ci0JCXJldHVybiBlc3RpbWF0ZWREdXJhdGlvbkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRXb3JrKCkgewotCQlyZXR1cm4gd29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrKE9iamVjdCBuZXdXb3JrKSB7Ci0JCU9iamVjdCBvbGRXb3JrID0gd29yazsKLQkJd29yayA9IG5ld1dvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1dPUkssIG9sZFdvcmssIHdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRDb3N0KCkgewotCQlyZXR1cm4gY29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3N0KEJpZ0RlY2ltYWwgbmV3Q29zdCkgewotCQlCaWdEZWNpbWFsIG9sZENvc3QgPSBjb3N0OwotCQljb3N0ID0gbmV3Q29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQ09TVCwgb2xkQ29zdCwgY29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dTKGZsb2F0IG5ld0JDV1MpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJDV1MgPSBuZXdCQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1NFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUywgb2xkQkNXUywgYkNXUywgIW9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dTKCkgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYm9vbGVhbiBvbGRCQ1dTRVNldCA9IGJDV1NFU2V0OwotCQliQ1dTID0gQkNXU19FREVGQVVMVDsKLQkJYkNXU0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dTLCBvbGRCQ1dTLCBCQ1dTX0VERUZBVUxULCBvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1NFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dQKGZsb2F0IG5ld0JDV1ApIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJDV1AgPSBuZXdCQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUCwgb2xkQkNXUCwgYkNXUCwgIW9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dQKCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYm9vbGVhbiBvbGRCQ1dQRVNldCA9IGJDV1BFU2V0OwotCQliQ1dQID0gQkNXUF9FREVGQVVMVDsKLQkJYkNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dQLCBvbGRCQ1dQLCBCQ1dQX0VERUZBVUxULCBvbGRCQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUCgpIHsKLQkJcmV0dXJuIGJDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFRpbWVwaGFzZWREYXRhKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCXJldHVybiBnZXRUaW1lcGhhc2VkRGF0YSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19OVU1CRVI6Ci0JCQkJcmV0dXJuIGdldE51bWJlcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19JTlRFUklNOgotCQkJCXJldHVybiBpc0ludGVyaW0oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1NUQVJUOgotCQkJCXJldHVybiBnZXRTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19GSU5JU0g6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTjoKLQkJCQlyZXR1cm4gZ2V0RHVyYXRpb24oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBnZXREdXJhdGlvbkZvcm1hdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19FU1RJTUFURURfRFVSQVRJT046Ci0JCQkJcmV0dXJuIGlzRXN0aW1hdGVkRHVyYXRpb24oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1dPUks6Ci0JCQkJcmV0dXJuIGdldFdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQ09TVDoKLQkJCQlyZXR1cm4gZ2V0Q29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dTOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QkNXUygpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1AoKSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5jbGVhcigpOwotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX05VTUJFUjoKLQkJCQlzZXROdW1iZXIoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fSU5URVJJTToKLQkJCQlzZXRJbnRlcmltKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19GSU5JU0g6Ci0JCQkJc2V0RmluaXNoKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRFVSQVRJT046Ci0JCQkJc2V0RHVyYXRpb24oKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRVNUSU1BVEVEX0RVUkFUSU9OOgotCQkJCXNldEVzdGltYXRlZER1cmF0aW9uKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fV09SSzoKLQkJCQlzZXRXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQ09TVDoKLQkJCQlzZXRDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0JDV1M6Ci0JCQkJc2V0QkNXUygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUDoKLQkJCQlzZXRCQ1dQKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX05VTUJFUjoKLQkJCQlzZXROdW1iZXIoTlVNQkVSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0lOVEVSSU06Ci0JCQkJdW5zZXRJbnRlcmltKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19TVEFSVDoKLQkJCQlzZXRTdGFydChTVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19GSU5JU0g6Ci0JCQkJc2V0RmluaXNoKEZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTjoKLQkJCQlzZXREdXJhdGlvbihEVVJBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoRFVSQVRJT05fRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0VTVElNQVRFRF9EVVJBVElPTjoKLQkJCQl1bnNldEVzdGltYXRlZER1cmF0aW9uKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19XT1JLOgotCQkJCXNldFdvcmsoV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19DT1NUOgotCQkJCXNldENvc3QoQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dTOgotCQkJCXVuc2V0QkNXUygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUDoKLQkJCQl1bnNldEJDV1AoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCXJldHVybiB0aW1lcGhhc2VkRGF0YSAhPSBudWxsICYmICF0aW1lcGhhc2VkRGF0YS5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX05VTUJFUjoKLQkJCQlyZXR1cm4gTlVNQkVSX0VERUZBVUxUID09IG51bGwgPyBudW1iZXIgIT0gbnVsbCA6ICFOVU1CRVJfRURFRkFVTFQuZXF1YWxzKG51bWJlcik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0lOVEVSSU06Ci0JCQkJcmV0dXJuIGlzU2V0SW50ZXJpbSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19TVEFSVDoKLQkJCQlyZXR1cm4gU1RBUlRfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0ICE9IG51bGwgOiAhU1RBUlRfRURFRkFVTFQuZXF1YWxzKHN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRklOSVNIOgotCQkJCXJldHVybiBGSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaCAhPSBudWxsIDogIUZJTklTSF9FREVGQVVMVC5lcXVhbHMoZmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRFVSQVRJT046Ci0JCQkJcmV0dXJuIERVUkFUSU9OX0VERUZBVUxUID09IG51bGwgPyBkdXJhdGlvbiAhPSBudWxsIDogIURVUkFUSU9OX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gRFVSQVRJT05fRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBkdXJhdGlvbkZvcm1hdCAhPSBudWxsIDogIURVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMoZHVyYXRpb25Gb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19FU1RJTUFURURfRFVSQVRJT046Ci0JCQkJcmV0dXJuIGlzU2V0RXN0aW1hdGVkRHVyYXRpb24oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fV09SSzoKLQkJCQlyZXR1cm4gV09SS19FREVGQVVMVCA9PSBudWxsID8gd29yayAhPSBudWxsIDogIVdPUktfRURFRkFVTFQuZXF1YWxzKHdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19DT1NUOgotCQkJCXJldHVybiBDT1NUX0VERUZBVUxUID09IG51bGwgPyBjb3N0ICE9IG51bGwgOiAhQ09TVF9FREVGQVVMVC5lcXVhbHMoY29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0JDV1M6Ci0JCQkJcmV0dXJuIGlzU2V0QkNXUygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dQOgotCQkJCXJldHVybiBpc1NldEJDV1AoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG51bWJlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobnVtYmVyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbnRlcmltOiAiKTsKLQkJaWYgKGludGVyaW1FU2V0KSByZXN1bHQuYXBwZW5kKGludGVyaW0pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkdXJhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZHVyYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR1cmF0aW9uRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkdXJhdGlvbkZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXN0aW1hdGVkRHVyYXRpb246ICIpOwotCQlpZiAoZXN0aW1hdGVkRHVyYXRpb25FU2V0KSByZXN1bHQuYXBwZW5kKGVzdGltYXRlZER1cmF0aW9uKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQod29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUzogIik7Ci0JCWlmIChiQ1dTRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dTKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUDogIik7Ci0JCWlmIChiQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Jhc2VsaW5lSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQ2FsZW5kYXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9DYWxlbmRhckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDVjNDBiZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9DYWxlbmRhckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENhbGVuZGFySW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYWxlbmRhcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkNhbGVuZGFySW1wbCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkNhbGVuZGFySW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQ2FsZW5kYXJJbXBsI2lzSXNCYXNlQ2FsZW5kYXIgPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhckltcGwjZ2V0QmFzZUNhbGVuZGFyVUlEIDxlbT5CYXNlIENhbGVuZGFyIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkNhbGVuZGFySW1wbCNnZXRXZWVrRGF5cyA8ZW0+V2VlayBEYXlzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2FsZW5kYXJJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBDYWxlbmRhciB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFVJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHVJRCA9IFVJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNCYXNlQ2FsZW5kYXIoKSA8ZW0+SXMgQmFzZSBDYWxlbmRhcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc0Jhc2VDYWxlbmRhcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0JBU0VfQ0FMRU5EQVJfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNCYXNlQ2FsZW5kYXIoKSA8ZW0+SXMgQmFzZSBDYWxlbmRhcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc0Jhc2VDYWxlbmRhcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNCYXNlQ2FsZW5kYXIgPSBJU19CQVNFX0NBTEVOREFSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBCYXNlIENhbGVuZGFyIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Jhc2VDYWxlbmRhckVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlQ2FsZW5kYXJVSUQoKSA8ZW0+QmFzZSBDYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhc2VDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEJBU0VfQ0FMRU5EQVJfVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VDYWxlbmRhclVJRCgpIDxlbT5CYXNlIENhbGVuZGFyIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZUNhbGVuZGFyVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBiYXNlQ2FsZW5kYXJVSUQgPSBCQVNFX0NBTEVOREFSX1VJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlZWtEYXlzKCkgPGVtPldlZWsgRGF5czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2Vla0RheXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBXZWVrRGF5cyB3ZWVrRGF5cyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FsZW5kYXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FsZW5kYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgbmV3VUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVUlEID0gdUlEOwotCQl1SUQgPSBuZXdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNCYXNlQ2FsZW5kYXIoKSB7Ci0JCXJldHVybiBpc0Jhc2VDYWxlbmRhcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0Jhc2VDYWxlbmRhcihib29sZWFuIG5ld0lzQmFzZUNhbGVuZGFyKSB7Ci0JCWJvb2xlYW4gb2xkSXNCYXNlQ2FsZW5kYXIgPSBpc0Jhc2VDYWxlbmRhcjsKLQkJaXNCYXNlQ2FsZW5kYXIgPSBuZXdJc0Jhc2VDYWxlbmRhcjsKLQkJYm9vbGVhbiBvbGRJc0Jhc2VDYWxlbmRhckVTZXQgPSBpc0Jhc2VDYWxlbmRhckVTZXQ7Ci0JCWlzQmFzZUNhbGVuZGFyRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX0lTX0JBU0VfQ0FMRU5EQVIsIG9sZElzQmFzZUNhbGVuZGFyLCBpc0Jhc2VDYWxlbmRhciwgIW9sZElzQmFzZUNhbGVuZGFyRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNCYXNlQ2FsZW5kYXIoKSB7Ci0JCWJvb2xlYW4gb2xkSXNCYXNlQ2FsZW5kYXIgPSBpc0Jhc2VDYWxlbmRhcjsKLQkJYm9vbGVhbiBvbGRJc0Jhc2VDYWxlbmRhckVTZXQgPSBpc0Jhc2VDYWxlbmRhckVTZXQ7Ci0JCWlzQmFzZUNhbGVuZGFyID0gSVNfQkFTRV9DQUxFTkRBUl9FREVGQVVMVDsKLQkJaXNCYXNlQ2FsZW5kYXJFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fSVNfQkFTRV9DQUxFTkRBUiwgb2xkSXNCYXNlQ2FsZW5kYXIsIElTX0JBU0VfQ0FMRU5EQVJfRURFRkFVTFQsIG9sZElzQmFzZUNhbGVuZGFyRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNCYXNlQ2FsZW5kYXIoKSB7Ci0JCXJldHVybiBpc0Jhc2VDYWxlbmRhckVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0QmFzZUNhbGVuZGFyVUlEKCkgewotCQlyZXR1cm4gYmFzZUNhbGVuZGFyVUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhc2VDYWxlbmRhclVJRChCaWdJbnRlZ2VyIG5ld0Jhc2VDYWxlbmRhclVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZEJhc2VDYWxlbmRhclVJRCA9IGJhc2VDYWxlbmRhclVJRDsKLQkJYmFzZUNhbGVuZGFyVUlEID0gbmV3QmFzZUNhbGVuZGFyVUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19CQVNFX0NBTEVOREFSX1VJRCwgb2xkQmFzZUNhbGVuZGFyVUlELCBiYXNlQ2FsZW5kYXJVSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2Vla0RheXMgZ2V0V2Vla0RheXMoKSB7Ci0JCXJldHVybiB3ZWVrRGF5czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXZWVrRGF5cyhXZWVrRGF5cyBuZXdXZWVrRGF5cywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlXZWVrRGF5cyBvbGRXZWVrRGF5cyA9IHdlZWtEYXlzOwotCQl3ZWVrRGF5cyA9IG5ld1dlZWtEYXlzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19XRUVLX0RBWVMsIG9sZFdlZWtEYXlzLCBuZXdXZWVrRGF5cyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2Vla0RheXMoV2Vla0RheXMgbmV3V2Vla0RheXMpIHsKLQkJaWYgKG5ld1dlZWtEYXlzICE9IHdlZWtEYXlzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh3ZWVrRGF5cyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl3ZWVrRGF5cykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1dFRUtfREFZUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3V2Vla0RheXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3V2Vla0RheXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19XRUVLX0RBWVMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V2Vla0RheXMobmV3V2Vla0RheXMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fV0VFS19EQVlTLCBuZXdXZWVrRGF5cywgbmV3V2Vla0RheXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1dFRUtfREFZUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0V2Vla0RheXMobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fSVNfQkFTRV9DQUxFTkRBUjoKLQkJCQlyZXR1cm4gaXNJc0Jhc2VDYWxlbmRhcigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fQkFTRV9DQUxFTkRBUl9VSUQ6Ci0JCQkJcmV0dXJuIGdldEJhc2VDYWxlbmRhclVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19XRUVLX0RBWVM6Ci0JCQkJcmV0dXJuIGdldFdlZWtEYXlzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19VSUQ6Ci0JCQkJc2V0VUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX0lTX0JBU0VfQ0FMRU5EQVI6Ci0JCQkJc2V0SXNCYXNlQ2FsZW5kYXIoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19CQVNFX0NBTEVOREFSX1VJRDoKLQkJCQlzZXRCYXNlQ2FsZW5kYXJVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fV0VFS19EQVlTOgotCQkJCXNldFdlZWtEYXlzKChXZWVrRGF5cyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fVUlEOgotCQkJCXNldFVJRChVSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fSVNfQkFTRV9DQUxFTkRBUjoKLQkJCQl1bnNldElzQmFzZUNhbGVuZGFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19CQVNFX0NBTEVOREFSX1VJRDoKLQkJCQlzZXRCYXNlQ2FsZW5kYXJVSUQoQkFTRV9DQUxFTkRBUl9VSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fV0VFS19EQVlTOgotCQkJCXNldFdlZWtEYXlzKChXZWVrRGF5cyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19JU19CQVNFX0NBTEVOREFSOgotCQkJCXJldHVybiBpc1NldElzQmFzZUNhbGVuZGFyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX0JBU0VfQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBCQVNFX0NBTEVOREFSX1VJRF9FREVGQVVMVCA9PSBudWxsID8gYmFzZUNhbGVuZGFyVUlEICE9IG51bGwgOiAhQkFTRV9DQUxFTkRBUl9VSURfRURFRkFVTFQuZXF1YWxzKGJhc2VDYWxlbmRhclVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1dFRUtfREFZUzoKLQkJCQlyZXR1cm4gd2Vla0RheXMgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc0Jhc2VDYWxlbmRhcjogIik7Ci0JCWlmIChpc0Jhc2VDYWxlbmRhckVTZXQpIHJlc3VsdC5hcHBlbmQoaXNCYXNlQ2FsZW5kYXIpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiYXNlQ2FsZW5kYXJVSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGJhc2VDYWxlbmRhclVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NhbGVuZGFySW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQ2FsZW5kYXJzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQ2FsZW5kYXJzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYmUzNzBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0NhbGVuZGFyc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENhbGVuZGFyc0ltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2FsZW5kYXJzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQ2FsZW5kYXJzSW1wbCNnZXRDYWxlbmRhciA8ZW0+Q2FsZW5kYXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWxlbmRhcnNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBDYWxlbmRhcnMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhbGVuZGFyKCkgPGVtPkNhbGVuZGFyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY2FsZW5kYXIgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENhbGVuZGFyc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYWxlbmRhcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q2FsZW5kYXIoKSB7Ci0JCWlmIChjYWxlbmRhciA9PSBudWxsKSB7Ci0JCQljYWxlbmRhciA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChDYWxlbmRhci5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUlNfX0NBTEVOREFSKTsKLQkJfQotCQlyZXR1cm4gY2FsZW5kYXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSU19fQ0FMRU5EQVI6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q2FsZW5kYXIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSU19fQ0FMRU5EQVI6Ci0JCQkJcmV0dXJuIGdldENhbGVuZGFyKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSU19fQ0FMRU5EQVI6Ci0JCQkJZ2V0Q2FsZW5kYXIoKS5jbGVhcigpOwotCQkJCWdldENhbGVuZGFyKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSU19fQ0FMRU5EQVI6Ci0JCQkJZ2V0Q2FsZW5kYXIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSU19fQ0FMRU5EQVI6Ci0JCQkJcmV0dXJuIGNhbGVuZGFyICE9IG51bGwgJiYgIWNhbGVuZGFyLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vQ2FsZW5kYXJzSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRG9jdW1lbnRSb290SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRG9jdW1lbnRSb290SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZjc4NmY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0RvY3VtZW50Um9vdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERvY3VtZW50Um9vdEltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZUVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb2N1bWVudCBSb290PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Eb2N1bWVudFJvb3RJbXBsI2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0UHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50Um9vdEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIERvY3VtZW50Um9vdCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWl4ZWQoKSA8ZW0+TWl4ZWQ8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWl4ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIG1peGVkID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhNTE5TUHJlZml4TWFwKCkgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn0nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFhNTE5TUHJlZml4TWFwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU1hcCB4TUxOU1ByZWZpeE1hcCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYU0lTY2hlbWFMb2NhdGlvbigpIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRYU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVNYXAgeFNJU2NoZW1hTG9jYXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50Um9vdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRNaXhlZCgpIHsKLQkJaWYgKG1peGVkID09IG51bGwpIHsKLQkJCW1peGVkID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEKTsKLQkJfQotCQlyZXR1cm4gbWl4ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVNYXAgZ2V0WE1MTlNQcmVmaXhNYXAoKSB7Ci0JCWlmICh4TUxOU1ByZWZpeE1hcCA9PSBudWxsKSB7Ci0JCQl4TUxOU1ByZWZpeE1hcCA9IG5ldyBFY29yZUVNYXAoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUCk7Ci0JCX0KLQkJcmV0dXJuIHhNTE5TUHJlZml4TWFwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTWFwIGdldFhTSVNjaGVtYUxvY2F0aW9uKCkgewotCQlpZiAoeFNJU2NoZW1hTG9jYXRpb24gPT0gbnVsbCkgewotCQkJeFNJU2NoZW1hTG9jYXRpb24gPSBuZXcgRWNvcmVFTWFwKEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOwotCQl9Ci0JCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gKFByb2plY3QpZ2V0TWl4ZWQoKS5nZXQoTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X1Byb2plY3QoKSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJvamVjdChQcm9qZWN0IG5ld1Byb2plY3QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfUHJvamVjdCgpLCBuZXdQcm9qZWN0LCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgbmV3UHJvamVjdCkgewotCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuc2V0KE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9Qcm9qZWN0KCksIG5ld1Byb2plY3QpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNaXhlZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0WE1MTlNQcmVmaXhNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fUFJPSkVDVDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0UHJvamVjdChudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQlyZXR1cm4gZ2V0TWl4ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCXJldHVybiBnZXRYTUxOU1ByZWZpeE1hcCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJcmV0dXJuIGdldFhTSVNjaGVtYUxvY2F0aW9uKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fUFJPSkVDVDoKLQkJCQlyZXR1cm4gZ2V0UHJvamVjdCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQlnZXRNaXhlZCgpLmNsZWFyKCk7Ci0JCQkJZ2V0TWl4ZWQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCWdldFhNTE5TUHJlZml4TWFwKCkuY2xlYXIoKTsKLQkJCQlnZXRYTUxOU1ByZWZpeE1hcCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5jbGVhcigpOwotCQkJCWdldFhTSVNjaGVtYUxvY2F0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fUFJPSkVDVDoKLQkJCQlzZXRQcm9qZWN0KChQcm9qZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCWdldE1peGVkKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlnZXRYTUxOU1ByZWZpeE1hcCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19QUk9KRUNUOgotCQkJCXNldFByb2plY3QoKFByb2plY3QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJcmV0dXJuIG1peGVkICE9IG51bGwgJiYgIW1peGVkLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCXJldHVybiB4TUxOU1ByZWZpeE1hcCAhPSBudWxsICYmICF4TUxOU1ByZWZpeE1hcC5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlyZXR1cm4geFNJU2NoZW1hTG9jYXRpb24gIT0gbnVsbCAmJiAheFNJU2NoZW1hTG9jYXRpb24uaXNFbXB0eSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGdldFByb2plY3QoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWl4ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1peGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRG9jdW1lbnRSb290SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOGZhNWY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4dGVuZGVkQXR0cmlidXRlMkltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlMjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlMkltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTJJbXBsI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTJJbXBsI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbCNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRXh0ZW5kZWRBdHRyaWJ1dGUyIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdUlEID0gVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkSUQoKSA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkSUQoKSA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmllbGRJRCA9IEZJRUxEX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFZBTFVFX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHZhbHVlSUQgPSBWQUxVRV9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbkZvcm1hdCgpIDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgRFVSQVRJT05fRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0ID0gRFVSQVRJT05fRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4dGVuZGVkQXR0cmlidXRlMkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgbmV3VUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVUlEID0gdUlEOwotCQl1SUQgPSBuZXdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVUlELCBvbGRVSUQsIHVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGRJRCgpIHsKLQkJcmV0dXJuIGZpZWxkSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmllbGRJRChTdHJpbmcgbmV3RmllbGRJRCkgewotCQlTdHJpbmcgb2xkRmllbGRJRCA9IGZpZWxkSUQ7Ci0JCWZpZWxkSUQgPSBuZXdGaWVsZElEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0ZJRUxEX0lELCBvbGRGaWVsZElELCBmaWVsZElEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpIHsKLQkJcmV0dXJuIHZhbHVlSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIG5ld1ZhbHVlSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRWYWx1ZUlEID0gdmFsdWVJRDsKLQkJdmFsdWVJRCA9IG5ld1ZhbHVlSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVkFMVUVfSUQsIG9sZFZhbHVlSUQsIHZhbHVlSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpIHsKLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgbmV3RHVyYXRpb25Gb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGREdXJhdGlvbkZvcm1hdCA9IGR1cmF0aW9uRm9ybWF0OwotCQlkdXJhdGlvbkZvcm1hdCA9IG5ld0R1cmF0aW9uRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0RVUkFUSU9OX0ZPUk1BVCwgb2xkRHVyYXRpb25Gb3JtYXQsIGR1cmF0aW9uRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIGdldEZpZWxkSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVUlEOgotCQkJCXNldFVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fRFVSQVRJT05fRk9STUFUOgotCQkJCXNldER1cmF0aW9uRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRChGSUVMRF9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRChWQUxVRV9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlzZXREdXJhdGlvbkZvcm1hdChEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1VJRDoKLQkJCQlyZXR1cm4gVUlEX0VERUZBVUxUID09IG51bGwgPyB1SUQgIT0gbnVsbCA6ICFVSURfRURFRkFVTFQuZXF1YWxzKHVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIEZJRUxEX0lEX0VERUZBVUxUID09IG51bGwgPyBmaWVsZElEICE9IG51bGwgOiAhRklFTERfSURfRURFRkFVTFQuZXF1YWxzKGZpZWxkSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBWQUxVRV9JRF9FREVGQVVMVCA9PSBudWxsID8gdmFsdWVJRCAhPSBudWxsIDogIVZBTFVFX0lEX0VERUZBVUxULmVxdWFscyh2YWx1ZUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJcmV0dXJuIERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCA9PSBudWxsID8gZHVyYXRpb25Gb3JtYXQgIT0gbnVsbCA6ICFEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQuZXF1YWxzKGR1cmF0aW9uRm9ybWF0KTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaWVsZElEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaWVsZElEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR1cmF0aW9uRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkdXJhdGlvbkZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0V4dGVuZGVkQXR0cmlidXRlMkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlM0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlM0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOThjODVmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZTNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeHRlbmRlZEF0dHJpYnV0ZTNJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTNJbXBsI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlM0ltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlM0ltcGwjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuZGVkQXR0cmlidXRlM0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEV4dGVuZGVkQXR0cmlidXRlMyB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFVJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHVJRCA9IFVJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkSUQgPSBGSUVMRF9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBWQUxVRV9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB2YWx1ZUlEID0gVkFMVUVfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbkZvcm1hdCgpIDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdCA9IERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeHRlbmRlZEF0dHJpYnV0ZTNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChCaWdJbnRlZ2VyIG5ld1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkSUQoKSB7Ci0JCXJldHVybiBmaWVsZElEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkSUQoU3RyaW5nIG5ld0ZpZWxkSUQpIHsKLQkJU3RyaW5nIG9sZEZpZWxkSUQgPSBmaWVsZElEOwotCQlmaWVsZElEID0gbmV3RmllbGRJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19GSUVMRF9JRCwgb2xkRmllbGRJRCwgZmllbGRJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKSB7Ci0JCXJldHVybiB2YWx1ZUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciBuZXdWYWx1ZUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVmFsdWVJRCA9IHZhbHVlSUQ7Ci0JCXZhbHVlSUQgPSBuZXdWYWx1ZUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFX0lELCBvbGRWYWx1ZUlELCB2YWx1ZUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKSB7Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIG5ld0R1cmF0aW9uRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkRHVyYXRpb25Gb3JtYXQgPSBkdXJhdGlvbkZvcm1hdDsKLQkJZHVyYXRpb25Gb3JtYXQgPSBuZXdEdXJhdGlvbkZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19EVVJBVElPTl9GT1JNQVQsIG9sZER1cmF0aW9uRm9ybWF0LCBkdXJhdGlvbkZvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBnZXRGaWVsZElEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIGdldFZhbHVlSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldER1cmF0aW9uRm9ybWF0KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlzZXREdXJhdGlvbkZvcm1hdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoRklFTERfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoVkFMVUVfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoRFVSQVRJT05fRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBGSUVMRF9JRF9FREVGQVVMVCA9PSBudWxsID8gZmllbGRJRCAhPSBudWxsIDogIUZJRUxEX0lEX0VERUZBVUxULmVxdWFscyhmaWVsZElEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gVkFMVUVfSURfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlSUQgIT0gbnVsbCA6ICFWQUxVRV9JRF9FREVGQVVMVC5lcXVhbHModmFsdWVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGR1cmF0aW9uRm9ybWF0ICE9IG51bGwgOiAhRFVSQVRJT05fRk9STUFUX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbkZvcm1hdCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1SUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmllbGRJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmllbGRJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkdXJhdGlvbkZvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZHVyYXRpb25Gb3JtYXQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FeHRlbmRlZEF0dHJpYnV0ZTNJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFjNjM1YzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlNEltcGwjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlNEltcGwjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZEF0dHJpYnV0ZTRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFeHRlbmRlZEF0dHJpYnV0ZTQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWVsZElEID0gRklFTERfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVkFMVUVfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdmFsdWVJRCA9IFZBTFVFX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXQgPSBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4dGVuZGVkQXR0cmlidXRlNCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFVJRCgpIHsKLQkJcmV0dXJuIHVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVSUQoQmlnSW50ZWdlciBuZXdVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRVSUQgPSB1SUQ7Ci0JCXVJRCA9IG5ld1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19VSUQsIG9sZFVJRCwgdUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZElEKCkgewotCQlyZXR1cm4gZmllbGRJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWVsZElEKFN0cmluZyBuZXdGaWVsZElEKSB7Ci0JCVN0cmluZyBvbGRGaWVsZElEID0gZmllbGRJRDsKLQkJZmllbGRJRCA9IG5ld0ZpZWxkSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fRklFTERfSUQsIG9sZEZpZWxkSUQsIGZpZWxkSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRWYWx1ZUlEKCkgewotCQlyZXR1cm4gdmFsdWVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZUlEKEJpZ0ludGVnZXIgbmV3VmFsdWVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFZhbHVlSUQgPSB2YWx1ZUlEOwotCQl2YWx1ZUlEID0gbmV3VmFsdWVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19WQUxVRV9JRCwgb2xkVmFsdWVJRCwgdmFsdWVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldER1cmF0aW9uRm9ybWF0KCkgewotCQlyZXR1cm4gZHVyYXRpb25Gb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlciBuZXdEdXJhdGlvbkZvcm1hdCkgewotCQlCaWdJbnRlZ2VyIG9sZER1cmF0aW9uRm9ybWF0ID0gZHVyYXRpb25Gb3JtYXQ7Ci0JCWR1cmF0aW9uRm9ybWF0ID0gbmV3RHVyYXRpb25Gb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fRFVSQVRJT05fRk9STUFULCBvbGREdXJhdGlvbkZvcm1hdCwgZHVyYXRpb25Gb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVUlEOgotCQkJCXJldHVybiBnZXRVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gZ2V0RmllbGRJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBnZXRWYWx1ZUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBnZXREdXJhdGlvbkZvcm1hdCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19VSUQ6Ci0JCQkJc2V0VUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVUlEOgotCQkJCXNldFVJRChVSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKEZJRUxEX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKFZBTFVFX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fRFVSQVRJT05fRk9STUFUOgotCQkJCXNldER1cmF0aW9uRm9ybWF0KERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gRklFTERfSURfRURFRkFVTFQgPT0gbnVsbCA/IGZpZWxkSUQgIT0gbnVsbCA6ICFGSUVMRF9JRF9FREVGQVVMVC5lcXVhbHMoZmllbGRJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIFZBTFVFX0lEX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZUlEICE9IG51bGwgOiAhVkFMVUVfSURfRURFRkFVTFQuZXF1YWxzKHZhbHVlSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gRFVSQVRJT05fRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBkdXJhdGlvbkZvcm1hdCAhPSBudWxsIDogIURVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMoZHVyYXRpb25Gb3JtYXQpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1SUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpZWxkSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpZWxkSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZHVyYXRpb25Gb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGR1cmF0aW9uRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzhiNDlmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4dGVuZGVkQXR0cmlidXRlSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldEZpZWxkTmFtZSA8ZW0+RmllbGQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNnZXRBbGlhcyA8ZW0+QWxpYXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZUltcGwjZ2V0UGhvbmV0aWNBbGlhcyA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZUltcGwjZ2V0Um9sbHVwVHlwZSA8ZW0+Um9sbHVwIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZUltcGwjZ2V0Q2FsY3VsYXRpb25UeXBlIDxlbT5DYWxjdWxhdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldEZvcm11bGEgPGVtPkZvcm11bGE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZUltcGwjaXNSZXN0cmljdFZhbHVlcyA8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldFZhbHVlbGlzdFNvcnRPcmRlciA8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZUltcGwjaXNBcHBlbmROZXdWYWx1ZXMgPGVtPkFwcGVuZCBOZXcgVmFsdWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldERlZmF1bHQgPGVtPkRlZmF1bHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZUltcGwjZ2V0VmFsdWVMaXN0IDxlbT5WYWx1ZSBMaXN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFeHRlbmRlZEF0dHJpYnV0ZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkSUQoKSA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkSUQoKSA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmllbGRJRCA9IEZJRUxEX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkTmFtZSgpIDxlbT5GaWVsZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGROYW1lKCkgPGVtPkZpZWxkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWVsZE5hbWUgPSBGSUVMRF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsaWFzKCkgPGVtPkFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbGlhcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJQVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWxpYXMoKSA8ZW0+QWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFsaWFzID0gQUxJQVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGhvbmV0aWNBbGlhcygpIDxlbT5QaG9uZXRpYyBBbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGhvbmV0aWNBbGlhcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhPTkVUSUNfQUxJQVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGhvbmV0aWNBbGlhcygpIDxlbT5QaG9uZXRpYyBBbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGhvbmV0aWNBbGlhcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwaG9uZXRpY0FsaWFzID0gUEhPTkVUSUNfQUxJQVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sbHVwVHlwZSgpIDxlbT5Sb2xsdXAgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9sbHVwVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFJPTExVUF9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGx1cFR5cGUoKSA8ZW0+Um9sbHVwIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGx1cFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHJvbGx1cFR5cGUgPSBST0xMVVBfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWxjdWxhdGlvblR5cGUoKSA8ZW0+Q2FsY3VsYXRpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FsY3VsYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQ0FMQ1VMQVRJT05fVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWxjdWxhdGlvblR5cGUoKSA8ZW0+Q2FsY3VsYXRpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FsY3VsYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBjYWxjdWxhdGlvblR5cGUgPSBDQUxDVUxBVElPTl9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZvcm11bGEoKSA8ZW0+Rm9ybXVsYTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Rm9ybXVsYSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STVVMQV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGb3JtdWxhKCkgPGVtPkZvcm11bGE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZvcm11bGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZm9ybXVsYSA9IEZPUk1VTEFfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXN0cmljdFZhbHVlcygpIDxlbT5SZXN0cmljdCBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVzdHJpY3RWYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRVNUUklDVF9WQUxVRVNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVzdHJpY3RWYWx1ZXMoKSA8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Jlc3RyaWN0VmFsdWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXN0cmljdFZhbHVlcyA9IFJFU1RSSUNUX1ZBTFVFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVzdHJpY3QgVmFsdWVzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXN0cmljdFZhbHVlc0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIoKSA8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlbGlzdFNvcnRPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFZBTFVFTElTVF9TT1JUX09SREVSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlbGlzdFNvcnRPcmRlcigpIDxlbT5WYWx1ZWxpc3QgU29ydCBPcmRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVsaXN0U29ydE9yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB2YWx1ZWxpc3RTb3J0T3JkZXIgPSBWQUxVRUxJU1RfU09SVF9PUkRFUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0FwcGVuZE5ld1ZhbHVlcygpIDxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBcHBlbmROZXdWYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBBUFBFTkRfTkVXX1ZBTFVFU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBcHBlbmROZXdWYWx1ZXMoKSA8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhcHBlbmROZXdWYWx1ZXMgPSBBUFBFTkRfTkVXX1ZBTFVFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQXBwZW5kIE5ldyBWYWx1ZXMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFwcGVuZE5ld1ZhbHVlc0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0KCkgPGVtPkRlZmF1bHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdCgpIDxlbT5EZWZhdWx0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRfID0gREVGQVVMVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlTGlzdCgpIDxlbT5WYWx1ZSBMaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUxpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBWYWx1ZUxpc3QgdmFsdWVMaXN0ID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeHRlbmRlZEF0dHJpYnV0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGRJRCgpIHsKLQkJcmV0dXJuIGZpZWxkSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmllbGRJRChTdHJpbmcgbmV3RmllbGRJRCkgewotCQlTdHJpbmcgb2xkRmllbGRJRCA9IGZpZWxkSUQ7Ci0JCWZpZWxkSUQgPSBuZXdGaWVsZElEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfSUQsIG9sZEZpZWxkSUQsIGZpZWxkSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKLQkJcmV0dXJuIGZpZWxkTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWVsZE5hbWUoU3RyaW5nIG5ld0ZpZWxkTmFtZSkgewotCQlTdHJpbmcgb2xkRmllbGROYW1lID0gZmllbGROYW1lOwotCQlmaWVsZE5hbWUgPSBuZXdGaWVsZE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9OQU1FLCBvbGRGaWVsZE5hbWUsIGZpZWxkTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWxpYXMoKSB7Ci0JCXJldHVybiBhbGlhczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGlhcyhTdHJpbmcgbmV3QWxpYXMpIHsKLQkJU3RyaW5nIG9sZEFsaWFzID0gYWxpYXM7Ci0JCWFsaWFzID0gbmV3QWxpYXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19BTElBUywgb2xkQWxpYXMsIGFsaWFzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQaG9uZXRpY0FsaWFzKCkgewotCQlyZXR1cm4gcGhvbmV0aWNBbGlhczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQaG9uZXRpY0FsaWFzKFN0cmluZyBuZXdQaG9uZXRpY0FsaWFzKSB7Ci0JCVN0cmluZyBvbGRQaG9uZXRpY0FsaWFzID0gcGhvbmV0aWNBbGlhczsKLQkJcGhvbmV0aWNBbGlhcyA9IG5ld1Bob25ldGljQWxpYXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19QSE9ORVRJQ19BTElBUywgb2xkUGhvbmV0aWNBbGlhcywgcGhvbmV0aWNBbGlhcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFJvbGx1cFR5cGUoKSB7Ci0JCXJldHVybiByb2xsdXBUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGx1cFR5cGUoQmlnSW50ZWdlciBuZXdSb2xsdXBUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkUm9sbHVwVHlwZSA9IHJvbGx1cFR5cGU7Ci0JCXJvbGx1cFR5cGUgPSBuZXdSb2xsdXBUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUk9MTFVQX1RZUEUsIG9sZFJvbGx1cFR5cGUsIHJvbGx1cFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRDYWxjdWxhdGlvblR5cGUoKSB7Ci0JCXJldHVybiBjYWxjdWxhdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FsY3VsYXRpb25UeXBlKEJpZ0ludGVnZXIgbmV3Q2FsY3VsYXRpb25UeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkQ2FsY3VsYXRpb25UeXBlID0gY2FsY3VsYXRpb25UeXBlOwotCQljYWxjdWxhdGlvblR5cGUgPSBuZXdDYWxjdWxhdGlvblR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19DQUxDVUxBVElPTl9UWVBFLCBvbGRDYWxjdWxhdGlvblR5cGUsIGNhbGN1bGF0aW9uVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9ybXVsYSgpIHsKLQkJcmV0dXJuIGZvcm11bGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9ybXVsYShTdHJpbmcgbmV3Rm9ybXVsYSkgewotCQlTdHJpbmcgb2xkRm9ybXVsYSA9IGZvcm11bGE7Ci0JCWZvcm11bGEgPSBuZXdGb3JtdWxhOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRk9STVVMQSwgb2xkRm9ybXVsYSwgZm9ybXVsYSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVzdHJpY3RWYWx1ZXMoKSB7Ci0JCXJldHVybiByZXN0cmljdFZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXN0cmljdFZhbHVlcyhib29sZWFuIG5ld1Jlc3RyaWN0VmFsdWVzKSB7Ci0JCWJvb2xlYW4gb2xkUmVzdHJpY3RWYWx1ZXMgPSByZXN0cmljdFZhbHVlczsKLQkJcmVzdHJpY3RWYWx1ZXMgPSBuZXdSZXN0cmljdFZhbHVlczsKLQkJYm9vbGVhbiBvbGRSZXN0cmljdFZhbHVlc0VTZXQgPSByZXN0cmljdFZhbHVlc0VTZXQ7Ci0JCXJlc3RyaWN0VmFsdWVzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19SRVNUUklDVF9WQUxVRVMsIG9sZFJlc3RyaWN0VmFsdWVzLCByZXN0cmljdFZhbHVlcywgIW9sZFJlc3RyaWN0VmFsdWVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVzdHJpY3RWYWx1ZXMoKSB7Ci0JCWJvb2xlYW4gb2xkUmVzdHJpY3RWYWx1ZXMgPSByZXN0cmljdFZhbHVlczsKLQkJYm9vbGVhbiBvbGRSZXN0cmljdFZhbHVlc0VTZXQgPSByZXN0cmljdFZhbHVlc0VTZXQ7Ci0JCXJlc3RyaWN0VmFsdWVzID0gUkVTVFJJQ1RfVkFMVUVTX0VERUZBVUxUOwotCQlyZXN0cmljdFZhbHVlc0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUkVTVFJJQ1RfVkFMVUVTLCBvbGRSZXN0cmljdFZhbHVlcywgUkVTVFJJQ1RfVkFMVUVTX0VERUZBVUxULCBvbGRSZXN0cmljdFZhbHVlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJlc3RyaWN0VmFsdWVzKCkgewotCQlyZXR1cm4gcmVzdHJpY3RWYWx1ZXNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFZhbHVlbGlzdFNvcnRPcmRlcigpIHsKLQkJcmV0dXJuIHZhbHVlbGlzdFNvcnRPcmRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZWxpc3RTb3J0T3JkZXIoQmlnSW50ZWdlciBuZXdWYWx1ZWxpc3RTb3J0T3JkZXIpIHsKLQkJQmlnSW50ZWdlciBvbGRWYWx1ZWxpc3RTb3J0T3JkZXIgPSB2YWx1ZWxpc3RTb3J0T3JkZXI7Ci0JCXZhbHVlbGlzdFNvcnRPcmRlciA9IG5ld1ZhbHVlbGlzdFNvcnRPcmRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFTElTVF9TT1JUX09SREVSLCBvbGRWYWx1ZWxpc3RTb3J0T3JkZXIsIHZhbHVlbGlzdFNvcnRPcmRlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXBwZW5kTmV3VmFsdWVzKCkgewotCQlyZXR1cm4gYXBwZW5kTmV3VmFsdWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFwcGVuZE5ld1ZhbHVlcyhib29sZWFuIG5ld0FwcGVuZE5ld1ZhbHVlcykgewotCQlib29sZWFuIG9sZEFwcGVuZE5ld1ZhbHVlcyA9IGFwcGVuZE5ld1ZhbHVlczsKLQkJYXBwZW5kTmV3VmFsdWVzID0gbmV3QXBwZW5kTmV3VmFsdWVzOwotCQlib29sZWFuIG9sZEFwcGVuZE5ld1ZhbHVlc0VTZXQgPSBhcHBlbmROZXdWYWx1ZXNFU2V0OwotCQlhcHBlbmROZXdWYWx1ZXNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FQUEVORF9ORVdfVkFMVUVTLCBvbGRBcHBlbmROZXdWYWx1ZXMsIGFwcGVuZE5ld1ZhbHVlcywgIW9sZEFwcGVuZE5ld1ZhbHVlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEFwcGVuZE5ld1ZhbHVlcygpIHsKLQkJYm9vbGVhbiBvbGRBcHBlbmROZXdWYWx1ZXMgPSBhcHBlbmROZXdWYWx1ZXM7Ci0JCWJvb2xlYW4gb2xkQXBwZW5kTmV3VmFsdWVzRVNldCA9IGFwcGVuZE5ld1ZhbHVlc0VTZXQ7Ci0JCWFwcGVuZE5ld1ZhbHVlcyA9IEFQUEVORF9ORVdfVkFMVUVTX0VERUZBVUxUOwotCQlhcHBlbmROZXdWYWx1ZXNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FQUEVORF9ORVdfVkFMVUVTLCBvbGRBcHBlbmROZXdWYWx1ZXMsIEFQUEVORF9ORVdfVkFMVUVTX0VERUZBVUxULCBvbGRBcHBlbmROZXdWYWx1ZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRBcHBlbmROZXdWYWx1ZXMoKSB7Ci0JCXJldHVybiBhcHBlbmROZXdWYWx1ZXNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRfOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5ld0RlZmF1bHQpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHQgPSBkZWZhdWx0XzsKLQkJZGVmYXVsdF8gPSBuZXdEZWZhdWx0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fREVGQVVMVCwgb2xkRGVmYXVsdCwgZGVmYXVsdF8pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFsdWVMaXN0IGdldFZhbHVlTGlzdCgpIHsKLQkJcmV0dXJuIHZhbHVlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRWYWx1ZUxpc3QoVmFsdWVMaXN0IG5ld1ZhbHVlTGlzdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlWYWx1ZUxpc3Qgb2xkVmFsdWVMaXN0ID0gdmFsdWVMaXN0OwotCQl2YWx1ZUxpc3QgPSBuZXdWYWx1ZUxpc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRV9MSVNULCBvbGRWYWx1ZUxpc3QsIG5ld1ZhbHVlTGlzdCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVMaXN0KFZhbHVlTGlzdCBuZXdWYWx1ZUxpc3QpIHsKLQkJaWYgKG5ld1ZhbHVlTGlzdCAhPSB2YWx1ZUxpc3QpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHZhbHVlTGlzdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl2YWx1ZUxpc3QpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VmFsdWVMaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1ZhbHVlTGlzdCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRV9MSVNULCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFZhbHVlTGlzdChuZXdWYWx1ZUxpc3QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFX0xJU1QsIG5ld1ZhbHVlTGlzdCwgbmV3VmFsdWVMaXN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0VmFsdWVMaXN0KG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIGdldEZpZWxkSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX05BTUU6Ci0JCQkJcmV0dXJuIGdldEZpZWxkTmFtZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQUxJQVM6Ci0JCQkJcmV0dXJuIGdldEFsaWFzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19QSE9ORVRJQ19BTElBUzoKLQkJCQlyZXR1cm4gZ2V0UGhvbmV0aWNBbGlhcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUk9MTFVQX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFJvbGx1cFR5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0NBTENVTEFUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGdldENhbGN1bGF0aW9uVHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRk9STVVMQToKLQkJCQlyZXR1cm4gZ2V0Rm9ybXVsYSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUkVTVFJJQ1RfVkFMVUVTOgotCQkJCXJldHVybiBpc1Jlc3RyaWN0VmFsdWVzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVMSVNUX1NPUlRfT1JERVI6Ci0JCQkJcmV0dXJuIGdldFZhbHVlbGlzdFNvcnRPcmRlcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQVBQRU5EX05FV19WQUxVRVM6Ci0JCQkJcmV0dXJuIGlzQXBwZW5kTmV3VmFsdWVzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fREVGQVVMVDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVDoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9OQU1FOgotCQkJCXNldEZpZWxkTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19BTElBUzoKLQkJCQlzZXRBbGlhcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19QSE9ORVRJQ19BTElBUzoKLQkJCQlzZXRQaG9uZXRpY0FsaWFzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JPTExVUF9UWVBFOgotCQkJCXNldFJvbGx1cFR5cGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0NBTENVTEFUSU9OX1RZUEU6Ci0JCQkJc2V0Q2FsY3VsYXRpb25UeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GT1JNVUxBOgotCQkJCXNldEZvcm11bGEoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUkVTVFJJQ1RfVkFMVUVTOgotCQkJCXNldFJlc3RyaWN0VmFsdWVzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFTElTVF9TT1JUX09SREVSOgotCQkJCXNldFZhbHVlbGlzdFNvcnRPcmRlcigoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQVBQRU5EX05FV19WQUxVRVM6Ci0JCQkJc2V0QXBwZW5kTmV3VmFsdWVzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0RFRkFVTFQ6Ci0JCQkJc2V0RGVmYXVsdCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRV9MSVNUOgotCQkJCXNldFZhbHVlTGlzdCgoVmFsdWVMaXN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRChGSUVMRF9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfTkFNRToKLQkJCQlzZXRGaWVsZE5hbWUoRklFTERfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQUxJQVM6Ci0JCQkJc2V0QWxpYXMoQUxJQVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1BIT05FVElDX0FMSUFTOgotCQkJCXNldFBob25ldGljQWxpYXMoUEhPTkVUSUNfQUxJQVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JPTExVUF9UWVBFOgotCQkJCXNldFJvbGx1cFR5cGUoUk9MTFVQX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0NBTENVTEFUSU9OX1RZUEU6Ci0JCQkJc2V0Q2FsY3VsYXRpb25UeXBlKENBTENVTEFUSU9OX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZPUk1VTEE6Ci0JCQkJc2V0Rm9ybXVsYShGT1JNVUxBX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19SRVNUUklDVF9WQUxVRVM6Ci0JCQkJdW5zZXRSZXN0cmljdFZhbHVlcygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFTElTVF9TT1JUX09SREVSOgotCQkJCXNldFZhbHVlbGlzdFNvcnRPcmRlcihWQUxVRUxJU1RfU09SVF9PUkRFUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQVBQRU5EX05FV19WQUxVRVM6Ci0JCQkJdW5zZXRBcHBlbmROZXdWYWx1ZXMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19ERUZBVUxUOgotCQkJCXNldERlZmF1bHQoREVGQVVMVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVDoKLQkJCQlzZXRWYWx1ZUxpc3QoKFZhbHVlTGlzdCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBGSUVMRF9JRF9FREVGQVVMVCA9PSBudWxsID8gZmllbGRJRCAhPSBudWxsIDogIUZJRUxEX0lEX0VERUZBVUxULmVxdWFscyhmaWVsZElEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX05BTUU6Ci0JCQkJcmV0dXJuIEZJRUxEX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGZpZWxkTmFtZSAhPSBudWxsIDogIUZJRUxEX05BTUVfRURFRkFVTFQuZXF1YWxzKGZpZWxkTmFtZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19BTElBUzoKLQkJCQlyZXR1cm4gQUxJQVNfRURFRkFVTFQgPT0gbnVsbCA/IGFsaWFzICE9IG51bGwgOiAhQUxJQVNfRURFRkFVTFQuZXF1YWxzKGFsaWFzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1BIT05FVElDX0FMSUFTOgotCQkJCXJldHVybiBQSE9ORVRJQ19BTElBU19FREVGQVVMVCA9PSBudWxsID8gcGhvbmV0aWNBbGlhcyAhPSBudWxsIDogIVBIT05FVElDX0FMSUFTX0VERUZBVUxULmVxdWFscyhwaG9uZXRpY0FsaWFzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JPTExVUF9UWVBFOgotCQkJCXJldHVybiBST0xMVVBfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gcm9sbHVwVHlwZSAhPSBudWxsIDogIVJPTExVUF9UWVBFX0VERUZBVUxULmVxdWFscyhyb2xsdXBUeXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0NBTENVTEFUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIENBTENVTEFUSU9OX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGNhbGN1bGF0aW9uVHlwZSAhPSBudWxsIDogIUNBTENVTEFUSU9OX1RZUEVfRURFRkFVTFQuZXF1YWxzKGNhbGN1bGF0aW9uVHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GT1JNVUxBOgotCQkJCXJldHVybiBGT1JNVUxBX0VERUZBVUxUID09IG51bGwgPyBmb3JtdWxhICE9IG51bGwgOiAhRk9STVVMQV9FREVGQVVMVC5lcXVhbHMoZm9ybXVsYSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19SRVNUUklDVF9WQUxVRVM6Ci0JCQkJcmV0dXJuIGlzU2V0UmVzdHJpY3RWYWx1ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFTElTVF9TT1JUX09SREVSOgotCQkJCXJldHVybiBWQUxVRUxJU1RfU09SVF9PUkRFUl9FREVGQVVMVCA9PSBudWxsID8gdmFsdWVsaXN0U29ydE9yZGVyICE9IG51bGwgOiAhVkFMVUVMSVNUX1NPUlRfT1JERVJfRURFRkFVTFQuZXF1YWxzKHZhbHVlbGlzdFNvcnRPcmRlcik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19BUFBFTkRfTkVXX1ZBTFVFUzoKLQkJCQlyZXR1cm4gaXNTZXRBcHBlbmROZXdWYWx1ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0RFRkFVTFQ6Ci0JCQkJcmV0dXJuIERFRkFVTFRfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRfICE9IG51bGwgOiAhREVGQVVMVF9FREVGQVVMVC5lcXVhbHMoZGVmYXVsdF8pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVDoKLQkJCQlyZXR1cm4gdmFsdWVMaXN0ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmaWVsZElEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaWVsZElEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaWVsZE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWxpYXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFsaWFzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwaG9uZXRpY0FsaWFzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwaG9uZXRpY0FsaWFzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByb2xsdXBUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyb2xsdXBUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYWxjdWxhdGlvblR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhbGN1bGF0aW9uVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZm9ybXVsYTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZm9ybXVsYSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzdHJpY3RWYWx1ZXM6ICIpOwotCQlpZiAocmVzdHJpY3RWYWx1ZXNFU2V0KSByZXN1bHQuYXBwZW5kKHJlc3RyaWN0VmFsdWVzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWVsaXN0U29ydE9yZGVyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZWxpc3RTb3J0T3JkZXIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFwcGVuZE5ld1ZhbHVlczogIik7Ci0JCWlmIChhcHBlbmROZXdWYWx1ZXNFU2V0KSByZXN1bHQuYXBwZW5kKGFwcGVuZE5ld1ZhbHVlcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlZmF1bHRfKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZXNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEwNjA3ZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGVzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXh0ZW5kZWRBdHRyaWJ1dGVzSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVzSW1wbCNnZXRFeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRBdHRyaWJ1dGVzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRXh0ZW5kZWRBdHRyaWJ1dGVzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBleHRlbmRlZEF0dHJpYnV0ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXh0ZW5kZWRBdHRyaWJ1dGVzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4dGVuZGVkQXR0cmlidXRlcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpIHsKLQkJaWYgKGV4dGVuZGVkQXR0cmlidXRlID09IG51bGwpIHsKLQkJCWV4dGVuZGVkQXR0cmlidXRlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEV4dGVuZGVkQXR0cmlidXRlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURVNfX0VYVEVOREVEX0FUVFJJQlVURSk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVTX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURVNfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFU19fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuY2xlYXIoKTsKLQkJCQlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVTX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURVNfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGUgIT0gbnVsbCAmJiAhZXh0ZW5kZWRBdHRyaWJ1dGUuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9FeHRlbmRlZEF0dHJpYnV0ZXNJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9NYXNrSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvTWFza0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGEwZjEwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9NYXNrSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWFza0ltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1hc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrSW1wbCNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTWFza0ltcGwjZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrSW1wbCNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1hc2tJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNYXNrIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWwoKSA8ZW0+TGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTEVWRUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWwoKSA8ZW0+TGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsZXZlbCA9IExFVkVMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZW5ndGgoKSA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBMRU5HVEhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGVuZ3RoKCkgPGVtPkxlbmd0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGVuZ3RoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsZW5ndGggPSBMRU5HVEhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VwYXJhdG9yKCkgPGVtPlNlcGFyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VwYXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVBBUkFUT1JfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VwYXJhdG9yKCkgPGVtPlNlcGFyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VwYXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcGFyYXRvciA9IFNFUEFSQVRPUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNYXNrSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE1hc2soKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRMZXZlbCgpIHsKLQkJcmV0dXJuIGxldmVsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExldmVsKEJpZ0ludGVnZXIgbmV3TGV2ZWwpIHsKLQkJQmlnSW50ZWdlciBvbGRMZXZlbCA9IGxldmVsOwotCQlsZXZlbCA9IG5ld0xldmVsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFVkVMLCBvbGRMZXZlbCwgbGV2ZWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKEJpZ0ludGVnZXIgbmV3VHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gbGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlbmd0aChCaWdJbnRlZ2VyIG5ld0xlbmd0aCkgewotCQlCaWdJbnRlZ2VyIG9sZExlbmd0aCA9IGxlbmd0aDsKLQkJbGVuZ3RoID0gbmV3TGVuZ3RoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFTkdUSCwgb2xkTGVuZ3RoLCBsZW5ndGgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcGFyYXRvcigpIHsKLQkJcmV0dXJuIHNlcGFyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXBhcmF0b3IoU3RyaW5nIG5ld1NlcGFyYXRvcikgewotCQlTdHJpbmcgb2xkU2VwYXJhdG9yID0gc2VwYXJhdG9yOwotCQlzZXBhcmF0b3IgPSBuZXdTZXBhcmF0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fU0VQQVJBVE9SLCBvbGRTZXBhcmF0b3IsIHNlcGFyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19MRVZFTDoKLQkJCQlyZXR1cm4gZ2V0TGV2ZWwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fTEVOR1RIOgotCQkJCXJldHVybiBnZXRMZW5ndGgoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19TRVBBUkFUT1I6Ci0JCQkJcmV0dXJuIGdldFNlcGFyYXRvcigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19MRVZFTDoKLQkJCQlzZXRMZXZlbCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFTkdUSDoKLQkJCQlzZXRMZW5ndGgoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19TRVBBUkFUT1I6Ci0JCQkJc2V0U2VwYXJhdG9yKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fTEVWRUw6Ci0JCQkJc2V0TGV2ZWwoTEVWRUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFTkdUSDoKLQkJCQlzZXRMZW5ndGgoTEVOR1RIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fU0VQQVJBVE9SOgotCQkJCXNldFNlcGFyYXRvcihTRVBBUkFUT1JfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFVkVMOgotCQkJCXJldHVybiBMRVZFTF9FREVGQVVMVCA9PSBudWxsID8gbGV2ZWwgIT0gbnVsbCA6ICFMRVZFTF9FREVGQVVMVC5lcXVhbHMobGV2ZWwpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19MRU5HVEg6Ci0JCQkJcmV0dXJuIExFTkdUSF9FREVGQVVMVCA9PSBudWxsID8gbGVuZ3RoICE9IG51bGwgOiAhTEVOR1RIX0VERUZBVUxULmVxdWFscyhsZW5ndGgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX1NFUEFSQVRPUjoKLQkJCQlyZXR1cm4gU0VQQVJBVE9SX0VERUZBVUxUID09IG51bGwgPyBzZXBhcmF0b3IgIT0gbnVsbCA6ICFTRVBBUkFUT1JfRURFRkFVTFQuZXF1YWxzKHNlcGFyYXRvcik7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsZXZlbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGV2ZWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxlbmd0aDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGVuZ3RoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZXBhcmF0b3I6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNlcGFyYXRvcik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01hc2tJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9NYXNrc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01hc2tzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMTU5ZTQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01hc2tzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWFza3NJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NYXNrczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1hc2tzSW1wbCNnZXRNYXNrIDxlbT5NYXNrPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWFza3NJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNYXNrcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFzaygpIDxlbT5NYXNrPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtYXNrID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNYXNrc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRNYXNrcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNYXNrKCkgewotCQlpZiAobWFzayA9PSBudWxsKSB7Ci0JCQltYXNrID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1hc2suY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuTUFTS1NfX01BU0spOwotCQl9Ci0JCXJldHVybiBtYXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLU19fTUFTSzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNYXNrKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLU19fTUFTSzoKLQkJCQlyZXR1cm4gZ2V0TWFzaygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLU19fTUFTSzoKLQkJCQlnZXRNYXNrKCkuY2xlYXIoKTsKLQkJCQlnZXRNYXNrKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tTX19NQVNLOgotCQkJCWdldE1hc2soKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tTX19NQVNLOgotCQkJCXJldHVybiBtYXNrICE9IG51bGwgJiYgIW1hc2suaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9NYXNrc0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01zcHJvamVjdEZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Nc3Byb2plY3RGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZDRmYzZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01zcHJvamVjdEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQ0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTXNwcm9qZWN0RmFjdG9yeUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTXNwcm9qZWN0RmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBNc3Byb2plY3RGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNc3Byb2plY3RGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlQ6IHJldHVybiBjcmVhdGVBc3NpZ25tZW50KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVFM6IHJldHVybiBjcmVhdGVBc3NpZ25tZW50cygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0Q6IHJldHVybiBjcmVhdGVBdmFpbGFiaWxpdHlQZXJpb2QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EUzogcmV0dXJuIGNyZWF0ZUF2YWlsYWJpbGl0eVBlcmlvZHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTogcmV0dXJuIGNyZWF0ZUJhc2VsaW5lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyOiByZXR1cm4gY3JlYXRlQmFzZWxpbmUyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzOiByZXR1cm4gY3JlYXRlQmFzZWxpbmUzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVI6IHJldHVybiBjcmVhdGVDYWxlbmRhcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSUzogcmV0dXJuIGNyZWF0ZUNhbGVuZGFycygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1Q6IHJldHVybiBjcmVhdGVEb2N1bWVudFJvb3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU6IHJldHVybiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTI6IHJldHVybiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzOiByZXR1cm4gY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGUzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNDogcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlNCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURVM6IHJldHVybiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLOiByZXR1cm4gY3JlYXRlTWFzaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tTOiByZXR1cm4gY3JlYXRlTWFza3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREU6IHJldHVybiBjcmVhdGVPdXRsaW5lQ29kZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTI6IHJldHVybiBjcmVhdGVPdXRsaW5lQ29kZTIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzOiByZXR1cm4gY3JlYXRlT3V0bGluZUNvZGUzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFUzogcmV0dXJuIGNyZWF0ZU91dGxpbmVDb2RlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTks6IHJldHVybiBjcmVhdGVQcmVkZWNlc3NvckxpbmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUOiByZXR1cm4gY3JlYXRlUHJvamVjdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEU6IHJldHVybiBjcmVhdGVSYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURVM6IHJldHVybiBjcmVhdGVSYXRlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFOiByZXR1cm4gY3JlYXRlUmVzb3VyY2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRVM6IHJldHVybiBjcmVhdGVSZXNvdXJjZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLOiByZXR1cm4gY3JlYXRlVGFzaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tTOiByZXR1cm4gY3JlYXRlVGFza3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FX1BFUklPRDogcmV0dXJuIGNyZWF0ZVRpbWVQZXJpb2QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRTogcmV0dXJuIGNyZWF0ZVRpbWVwaGFzZWREYXRhVHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFOiByZXR1cm4gY3JlYXRlVmFsdWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTI6IHJldHVybiBjcmVhdGVWYWx1ZTIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9MSVNUOiByZXR1cm4gY3JlYXRlVmFsdWVMaXN0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVTOiByZXR1cm4gY3JlYXRlVmFsdWVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0s6IHJldHVybiBjcmVhdGVXQlNNYXNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTOiByZXR1cm4gY3JlYXRlV0JTTWFza3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWTogcmV0dXJuIGNyZWF0ZVdlZWtEYXkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWVM6IHJldHVybiBjcmVhdGVXZWVrRGF5cygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRTogcmV0dXJuIGNyZWF0ZVdvcmtpbmdUaW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FUzogcmV0dXJuIGNyZWF0ZVdvcmtpbmdUaW1lcygpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BQ0NSVUVfQVQ6Ci0JCQkJcmV0dXJuIGNyZWF0ZUFjY3J1ZUF0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQUNUSVZFX0RJUkVDVE9SWV9HVUlEX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUFjdGl2ZURpcmVjdG9yeUdVSURUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQUxJQVNfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQWxpYXNUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVVUSE9SX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUF1dGhvclR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQk9PS0lOR19UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUJvb2tpbmdUeXBlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJPT0tJTkdfVFlQRV9UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlQm9va2luZ1R5cGVUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTENVTEFUSU9OX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ2FsY3VsYXRpb25UeXBlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBVEVHT1JZX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUNhdGVnb3J5VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPREVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ29kZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT01QQU5ZX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbXBhbnlUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09OU1RSQUlOVF9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbnN0cmFpbnRUeXBlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPTlRBQ1RfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ29udGFjdFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT1NUX1JBVEVfVEFCTEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ29zdFJhdGVUYWJsZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DVVJSRU5DWV9TWU1CT0xfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ3VycmVuY3lTeW1ib2xUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuREFZX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRGF5VHlwZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ERUZBVUxUX1RBU0tfRVZfTUVUSE9EX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRUYXNrRVZNZXRob2RUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuREVGQVVMVF9UQVNLX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFRhc2tUeXBlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVEdXJhdGlvbkZvcm1hdFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRTE6Ci0JCQkJcmV0dXJuIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTFGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRTI6Ci0JCQkJcmV0dXJuIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTJGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRTM6Ci0JCQkJcmV0dXJuIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTNGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRTQ6Ci0JCQkJcmV0dXJuIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRTU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FQVJORURfVkFMVUVfTUVUSE9EX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRTE6Ci0JCQkJcmV0dXJuIGNyZWF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZTFGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FTUFJTF9BRERSRVNTX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUVtYWlsQWRkcmVzc1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFUk5BTF9UQVNLX1BST0pFQ1RfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRXh0ZXJuYWxUYXNrUHJvamVjdFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5GSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRml4ZWRDb3N0QWNjcnVhbFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5GWV9TVEFSVF9EQVRFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUZZU3RhcnREYXRlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkdST1VQX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUdyb3VwVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19BRERSRVNTX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUh5cGVybGlua0FkZHJlc3NUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRTE6Ci0JCQkJcmV0dXJuIGNyZWF0ZUh5cGVybGlua0FkZHJlc3NUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19BRERSRVNTX1RZUEUyOgotCQkJCXJldHVybiBjcmVhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTJGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRTE6Ci0JCQkJcmV0dXJuIGNyZWF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFMjoKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUh5cGVybGlua1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRTE6Ci0JCQkJcmV0dXJuIGNyZWF0ZUh5cGVybGlua1R5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1RZUEUyOgotCQkJCXJldHVybiBjcmVhdGVIeXBlcmxpbmtUeXBlMkZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLklOSVRJQUxTX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUluaXRpYWxzVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkxBR19GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlTGFnRm9ybWF0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkxFVkVMSU5HX0RFTEFZX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkxFVkVMSU5HX0RFTEFZX0ZPUk1BVF9UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFOQUdFUl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVNYW5hZ2VyVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BVEVSSUFMX0xBQkVMX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZU1hdGVyaWFsTGFiZWxUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVOYW1lVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5BTUVfVFlQRTE6Ci0JCQkJcmV0dXJuIGNyZWF0ZU5hbWVUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5BTUVfVFlQRTI6Ci0JCQkJcmV0dXJuIGNyZWF0ZU5hbWVUeXBlMkZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5BTUVfVFlQRTM6Ci0JCQkJcmV0dXJuIGNyZWF0ZU5hbWVUeXBlM0Zyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5FV19UQVNLX1NUQVJUX0RBVEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlTmV3VGFza1N0YXJ0RGF0ZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OVF9BQ0NPVU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZU5UQWNjb3VudFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX05VTUJFUl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVPdXRsaW5lTnVtYmVyVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTFGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QSE9ORVRJQ19BTElBU19UWVBFOgotCQkJCXJldHVybiBjcmVhdGVQaG9uZXRpY0FsaWFzVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBIT05FVElDU19UWVBFOgotCQkJCXJldHVybiBjcmVhdGVQaG9uZXRpY3NUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFRklYX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVByZWZpeFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX1RBQkxFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVJhdGVUYWJsZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ST0xMVVBfVFlQRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVSb2xsdXBUeXBlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5TVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTFGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5TVUJKRUNUX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVN1YmplY3RUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuU1VCUFJPSkVDVF9OQU1FX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVN1YnByb2plY3ROYW1lVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJVExFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVRpdGxlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlVHlwZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVUeXBlVHlwZTFGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEUyOgotCQkJCXJldHVybiBjcmVhdGVUeXBlVHlwZTJGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEUzOgotCQkJCXJldHVybiBjcmVhdGVUeXBlVHlwZTNGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEU0OgotCQkJCXJldHVybiBjcmVhdGVUeXBlVHlwZTRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEU1OgotCQkJCXJldHVybiBjcmVhdGVUeXBlVHlwZTVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5VSURfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlVUlEVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlVOSVRfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlVW5pdFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRUxJU1RfU09SVF9PUkRFUl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19TVEFSVF9EQVlfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlV2Vla1N0YXJ0RGF5VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktfQ09OVE9VUl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVXb3JrQ29udG91clR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVXb3JrRm9ybWF0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktfR1JPVVBfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlV29ya0dyb3VwVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BQ0NSVUVfQVQ6Ci0JCQkJcmV0dXJuIGNvbnZlcnRBY2NydWVBdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQUNUSVZFX0RJUkVDVE9SWV9HVUlEX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQUxJQVNfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEFsaWFzVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVVUSE9SX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRBdXRob3JUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQk9PS0lOR19UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRCb29raW5nVHlwZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJPT0tJTkdfVFlQRV9UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydEJvb2tpbmdUeXBlVHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTENVTEFUSU9OX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydENhbGN1bGF0aW9uVHlwZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBVEVHT1JZX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRDYXRlZ29yeVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPREVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydENvZGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT01QQU5ZX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRDb21wYW55VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09OU1RSQUlOVF9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRDb25zdHJhaW50VHlwZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPTlRBQ1RfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydENvbnRhY3RUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT1NUX1JBVEVfVEFCTEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydENvc3RSYXRlVGFibGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DVVJSRU5DWV9TWU1CT0xfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEN1cnJlbmN5U3ltYm9sVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuREFZX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydERheVR5cGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ERUZBVUxUX1RBU0tfRVZfTUVUSE9EX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnREZWZhdWx0VGFza0VWTWV0aG9kVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuREVGQVVMVF9UQVNLX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydERlZmF1bHRUYXNrVHlwZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRTE6Ci0JCQkJcmV0dXJuIGNvbnZlcnREdXJhdGlvbkZvcm1hdFR5cGUxVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRTI6Ci0JCQkJcmV0dXJuIGNvbnZlcnREdXJhdGlvbkZvcm1hdFR5cGUyVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRTM6Ci0JCQkJcmV0dXJuIGNvbnZlcnREdXJhdGlvbkZvcm1hdFR5cGUzVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRTQ6Ci0JCQkJcmV0dXJuIGNvbnZlcnREdXJhdGlvbkZvcm1hdFR5cGU0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRTU6Ci0JCQkJcmV0dXJuIGNvbnZlcnREdXJhdGlvbkZvcm1hdFR5cGU1VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FQVJORURfVkFMVUVfTUVUSE9EX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRFYXJuZWRWYWx1ZU1ldGhvZFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRTE6Ci0JCQkJcmV0dXJuIGNvbnZlcnRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FTUFJTF9BRERSRVNTX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRFbWFpbEFkZHJlc3NUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFUk5BTF9UQVNLX1BST0pFQ1RfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEV4dGVybmFsVGFza1Byb2plY3RUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5GSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEZpeGVkQ29zdEFjY3J1YWxUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5GWV9TVEFSVF9EQVRFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRGWVN0YXJ0RGF0ZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkdST1VQX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRHcm91cFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19BRERSRVNTX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRIeXBlcmxpbmtBZGRyZXNzVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRTE6Ci0JCQkJcmV0dXJuIGNvbnZlcnRIeXBlcmxpbmtBZGRyZXNzVHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19BRERSRVNTX1RZUEUyOgotCQkJCXJldHVybiBjb252ZXJ0SHlwZXJsaW5rQWRkcmVzc1R5cGUyVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua1N1YkFkZHJlc3NUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRTE6Ci0JCQkJcmV0dXJuIGNvbnZlcnRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFMjoKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMlRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRIeXBlcmxpbmtUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRTE6Ci0JCQkJcmV0dXJuIGNvbnZlcnRIeXBlcmxpbmtUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1RZUEUyOgotCQkJCXJldHVybiBjb252ZXJ0SHlwZXJsaW5rVHlwZTJUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLklOSVRJQUxTX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRJbml0aWFsc1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkxBR19GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydExhZ0Zvcm1hdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkxFVkVMSU5HX0RFTEFZX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0TGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkxFVkVMSU5HX0RFTEFZX0ZPUk1BVF9UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydExldmVsaW5nRGVsYXlGb3JtYXRUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFOQUdFUl9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0TWFuYWdlclR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BVEVSSUFMX0xBQkVMX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRNYXRlcmlhbExhYmVsVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0TmFtZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5BTUVfVFlQRTE6Ci0JCQkJcmV0dXJuIGNvbnZlcnROYW1lVHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5BTUVfVFlQRTI6Ci0JCQkJcmV0dXJuIGNvbnZlcnROYW1lVHlwZTJUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5BTUVfVFlQRTM6Ci0JCQkJcmV0dXJuIGNvbnZlcnROYW1lVHlwZTNUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5FV19UQVNLX1NUQVJUX0RBVEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydE5ld1Rhc2tTdGFydERhdGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OVF9BQ0NPVU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnROVEFjY291bnRUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX05VTUJFUl9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0T3V0bGluZU51bWJlclR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRPdmVydGltZVJhdGVGb3JtYXRUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydE92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QSE9ORVRJQ19BTElBU19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0UGhvbmV0aWNBbGlhc1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBIT05FVElDU19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0UGhvbmV0aWNzVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFRklYX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRQcmVmaXhUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX1RBQkxFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRSYXRlVGFibGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ST0xMVVBfVFlQRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Um9sbHVwVHlwZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5TVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydFN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5TVUJKRUNUX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRTdWJqZWN0VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuU1VCUFJPSkVDVF9OQU1FX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRTdWJwcm9qZWN0TmFtZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJVExFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUaXRsZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFR5cGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0VHlwZVR5cGUxVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEUyOgotCQkJCXJldHVybiBjb252ZXJ0VHlwZVR5cGUyVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEUzOgotCQkJCXJldHVybiBjb252ZXJ0VHlwZVR5cGUzVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEU0OgotCQkJCXJldHVybiBjb252ZXJ0VHlwZVR5cGU0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEU1OgotCQkJCXJldHVybiBjb252ZXJ0VHlwZVR5cGU1VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5VSURfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFVJRFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlVOSVRfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFVuaXRUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRUxJU1RfU09SVF9PUkRFUl9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VmFsdWVsaXN0U29ydE9yZGVyVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19TVEFSVF9EQVlfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFdlZWtTdGFydERheVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktfQ09OVE9VUl9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0V29ya0NvbnRvdXJUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0V29ya0Zvcm1hdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktfR1JPVVBfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFdvcmtHcm91cFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFzc2lnbm1lbnQgY3JlYXRlQXNzaWdubWVudCgpIHsKLQkJQXNzaWdubWVudEltcGwgYXNzaWdubWVudCA9IG5ldyBBc3NpZ25tZW50SW1wbCgpOwotCQlyZXR1cm4gYXNzaWdubWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXNzaWdubWVudHMgY3JlYXRlQXNzaWdubWVudHMoKSB7Ci0JCUFzc2lnbm1lbnRzSW1wbCBhc3NpZ25tZW50cyA9IG5ldyBBc3NpZ25tZW50c0ltcGwoKTsKLQkJcmV0dXJuIGFzc2lnbm1lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBdmFpbGFiaWxpdHlQZXJpb2QgY3JlYXRlQXZhaWxhYmlsaXR5UGVyaW9kKCkgewotCQlBdmFpbGFiaWxpdHlQZXJpb2RJbXBsIGF2YWlsYWJpbGl0eVBlcmlvZCA9IG5ldyBBdmFpbGFiaWxpdHlQZXJpb2RJbXBsKCk7Ci0JCXJldHVybiBhdmFpbGFiaWxpdHlQZXJpb2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEF2YWlsYWJpbGl0eVBlcmlvZHMgY3JlYXRlQXZhaWxhYmlsaXR5UGVyaW9kcygpIHsKLQkJQXZhaWxhYmlsaXR5UGVyaW9kc0ltcGwgYXZhaWxhYmlsaXR5UGVyaW9kcyA9IG5ldyBBdmFpbGFiaWxpdHlQZXJpb2RzSW1wbCgpOwotCQlyZXR1cm4gYXZhaWxhYmlsaXR5UGVyaW9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmFzZWxpbmUgY3JlYXRlQmFzZWxpbmUoKSB7Ci0JCUJhc2VsaW5lSW1wbCBiYXNlbGluZSA9IG5ldyBCYXNlbGluZUltcGwoKTsKLQkJcmV0dXJuIGJhc2VsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCYXNlbGluZTIgY3JlYXRlQmFzZWxpbmUyKCkgewotCQlCYXNlbGluZTJJbXBsIGJhc2VsaW5lMiA9IG5ldyBCYXNlbGluZTJJbXBsKCk7Ci0JCXJldHVybiBiYXNlbGluZTI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJhc2VsaW5lMyBjcmVhdGVCYXNlbGluZTMoKSB7Ci0JCUJhc2VsaW5lM0ltcGwgYmFzZWxpbmUzID0gbmV3IEJhc2VsaW5lM0ltcGwoKTsKLQkJcmV0dXJuIGJhc2VsaW5lMzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ2FsZW5kYXIgY3JlYXRlQ2FsZW5kYXIoKSB7Ci0JCUNhbGVuZGFySW1wbCBjYWxlbmRhciA9IG5ldyBDYWxlbmRhckltcGwoKTsKLQkJcmV0dXJuIGNhbGVuZGFyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYWxlbmRhcnMgY3JlYXRlQ2FsZW5kYXJzKCkgewotCQlDYWxlbmRhcnNJbXBsIGNhbGVuZGFycyA9IG5ldyBDYWxlbmRhcnNJbXBsKCk7Ci0JCXJldHVybiBjYWxlbmRhcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvY3VtZW50Um9vdCBjcmVhdGVEb2N1bWVudFJvb3QoKSB7Ci0JCURvY3VtZW50Um9vdEltcGwgZG9jdW1lbnRSb290ID0gbmV3IERvY3VtZW50Um9vdEltcGwoKTsKLQkJcmV0dXJuIGRvY3VtZW50Um9vdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRBdHRyaWJ1dGUgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0JCUV4dGVuZGVkQXR0cmlidXRlSW1wbCBleHRlbmRlZEF0dHJpYnV0ZSA9IG5ldyBFeHRlbmRlZEF0dHJpYnV0ZUltcGwoKTsKLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeHRlbmRlZEF0dHJpYnV0ZTIgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGUyKCkgewotCQlFeHRlbmRlZEF0dHJpYnV0ZTJJbXBsIGV4dGVuZGVkQXR0cmlidXRlMiA9IG5ldyBFeHRlbmRlZEF0dHJpYnV0ZTJJbXBsKCk7Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZTI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4dGVuZGVkQXR0cmlidXRlMyBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTMoKSB7Ci0JCUV4dGVuZGVkQXR0cmlidXRlM0ltcGwgZXh0ZW5kZWRBdHRyaWJ1dGUzID0gbmV3IEV4dGVuZGVkQXR0cmlidXRlM0ltcGwoKTsKLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlMzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRBdHRyaWJ1dGU0IGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlNCgpIHsKLQkJRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbCBleHRlbmRlZEF0dHJpYnV0ZTQgPSBuZXcgRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbCgpOwotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeHRlbmRlZEF0dHJpYnV0ZXMgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGVzKCkgewotCQlFeHRlbmRlZEF0dHJpYnV0ZXNJbXBsIGV4dGVuZGVkQXR0cmlidXRlcyA9IG5ldyBFeHRlbmRlZEF0dHJpYnV0ZXNJbXBsKCk7Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1hc2sgY3JlYXRlTWFzaygpIHsKLQkJTWFza0ltcGwgbWFzayA9IG5ldyBNYXNrSW1wbCgpOwotCQlyZXR1cm4gbWFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWFza3MgY3JlYXRlTWFza3MoKSB7Ci0JCU1hc2tzSW1wbCBtYXNrcyA9IG5ldyBNYXNrc0ltcGwoKTsKLQkJcmV0dXJuIG1hc2tzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPdXRsaW5lQ29kZSBjcmVhdGVPdXRsaW5lQ29kZSgpIHsKLQkJT3V0bGluZUNvZGVJbXBsIG91dGxpbmVDb2RlID0gbmV3IE91dGxpbmVDb2RlSW1wbCgpOwotCQlyZXR1cm4gb3V0bGluZUNvZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGxpbmVDb2RlMiBjcmVhdGVPdXRsaW5lQ29kZTIoKSB7Ci0JCU91dGxpbmVDb2RlMkltcGwgb3V0bGluZUNvZGUyID0gbmV3IE91dGxpbmVDb2RlMkltcGwoKTsKLQkJcmV0dXJuIG91dGxpbmVDb2RlMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3V0bGluZUNvZGUzIGNyZWF0ZU91dGxpbmVDb2RlMygpIHsKLQkJT3V0bGluZUNvZGUzSW1wbCBvdXRsaW5lQ29kZTMgPSBuZXcgT3V0bGluZUNvZGUzSW1wbCgpOwotCQlyZXR1cm4gb3V0bGluZUNvZGUzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPdXRsaW5lQ29kZXMgY3JlYXRlT3V0bGluZUNvZGVzKCkgewotCQlPdXRsaW5lQ29kZXNJbXBsIG91dGxpbmVDb2RlcyA9IG5ldyBPdXRsaW5lQ29kZXNJbXBsKCk7Ci0JCXJldHVybiBvdXRsaW5lQ29kZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByZWRlY2Vzc29yTGluayBjcmVhdGVQcmVkZWNlc3NvckxpbmsoKSB7Ci0JCVByZWRlY2Vzc29yTGlua0ltcGwgcHJlZGVjZXNzb3JMaW5rID0gbmV3IFByZWRlY2Vzc29yTGlua0ltcGwoKTsKLQkJcmV0dXJuIHByZWRlY2Vzc29yTGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvamVjdCBjcmVhdGVQcm9qZWN0KCkgewotCQlQcm9qZWN0SW1wbCBwcm9qZWN0ID0gbmV3IFByb2plY3RJbXBsKCk7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSYXRlIGNyZWF0ZVJhdGUoKSB7Ci0JCVJhdGVJbXBsIHJhdGUgPSBuZXcgUmF0ZUltcGwoKTsKLQkJcmV0dXJuIHJhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJhdGVzIGNyZWF0ZVJhdGVzKCkgewotCQlSYXRlc0ltcGwgcmF0ZXMgPSBuZXcgUmF0ZXNJbXBsKCk7Ci0JCXJldHVybiByYXRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoKSB7Ci0JCVJlc291cmNlSW1wbCByZXNvdXJjZSA9IG5ldyBSZXNvdXJjZUltcGwoKTsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZXMgY3JlYXRlUmVzb3VyY2VzKCkgewotCQlSZXNvdXJjZXNJbXBsIHJlc291cmNlcyA9IG5ldyBSZXNvdXJjZXNJbXBsKCk7Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2sgY3JlYXRlVGFzaygpIHsKLQkJVGFza0ltcGwgdGFzayA9IG5ldyBUYXNrSW1wbCgpOwotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFza3MgY3JlYXRlVGFza3MoKSB7Ci0JCVRhc2tzSW1wbCB0YXNrcyA9IG5ldyBUYXNrc0ltcGwoKTsKLQkJcmV0dXJuIHRhc2tzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUaW1lUGVyaW9kIGNyZWF0ZVRpbWVQZXJpb2QoKSB7Ci0JCVRpbWVQZXJpb2RJbXBsIHRpbWVQZXJpb2QgPSBuZXcgVGltZVBlcmlvZEltcGwoKTsKLQkJcmV0dXJuIHRpbWVQZXJpb2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRpbWVwaGFzZWREYXRhVHlwZSBjcmVhdGVUaW1lcGhhc2VkRGF0YVR5cGUoKSB7Ci0JCVRpbWVwaGFzZWREYXRhVHlwZUltcGwgdGltZXBoYXNlZERhdGFUeXBlID0gbmV3IFRpbWVwaGFzZWREYXRhVHlwZUltcGwoKTsKLQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFsdWUgY3JlYXRlVmFsdWUoKSB7Ci0JCVZhbHVlSW1wbCB2YWx1ZSA9IG5ldyBWYWx1ZUltcGwoKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYWx1ZTIgY3JlYXRlVmFsdWUyKCkgewotCQlWYWx1ZTJJbXBsIHZhbHVlMiA9IG5ldyBWYWx1ZTJJbXBsKCk7Ci0JCXJldHVybiB2YWx1ZTI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhbHVlTGlzdCBjcmVhdGVWYWx1ZUxpc3QoKSB7Ci0JCVZhbHVlTGlzdEltcGwgdmFsdWVMaXN0ID0gbmV3IFZhbHVlTGlzdEltcGwoKTsKLQkJcmV0dXJuIHZhbHVlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFsdWVzIGNyZWF0ZVZhbHVlcygpIHsKLQkJVmFsdWVzSW1wbCB2YWx1ZXMgPSBuZXcgVmFsdWVzSW1wbCgpOwotCQlyZXR1cm4gdmFsdWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXQlNNYXNrIGNyZWF0ZVdCU01hc2soKSB7Ci0JCVdCU01hc2tJbXBsIHdic01hc2sgPSBuZXcgV0JTTWFza0ltcGwoKTsKLQkJcmV0dXJuIHdic01hc2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdCU01hc2tzIGNyZWF0ZVdCU01hc2tzKCkgewotCQlXQlNNYXNrc0ltcGwgd2JzTWFza3MgPSBuZXcgV0JTTWFza3NJbXBsKCk7Ci0JCXJldHVybiB3YnNNYXNrczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2Vla0RheSBjcmVhdGVXZWVrRGF5KCkgewotCQlXZWVrRGF5SW1wbCB3ZWVrRGF5ID0gbmV3IFdlZWtEYXlJbXBsKCk7Ci0JCXJldHVybiB3ZWVrRGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWVrRGF5cyBjcmVhdGVXZWVrRGF5cygpIHsKLQkJV2Vla0RheXNJbXBsIHdlZWtEYXlzID0gbmV3IFdlZWtEYXlzSW1wbCgpOwotCQlyZXR1cm4gd2Vla0RheXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtpbmdUaW1lIGNyZWF0ZVdvcmtpbmdUaW1lKCkgewotCQlXb3JraW5nVGltZUltcGwgd29ya2luZ1RpbWUgPSBuZXcgV29ya2luZ1RpbWVJbXBsKCk7Ci0JCXJldHVybiB3b3JraW5nVGltZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya2luZ1RpbWVzIGNyZWF0ZVdvcmtpbmdUaW1lcygpIHsKLQkJV29ya2luZ1RpbWVzSW1wbCB3b3JraW5nVGltZXMgPSBuZXcgV29ya2luZ1RpbWVzSW1wbCgpOwotCQlyZXR1cm4gd29ya2luZ1RpbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUFjY3J1ZUF0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEFjY3J1ZUF0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0QWN0aXZlRGlyZWN0b3J5R1VJRFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlQWxpYXNUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRBbGlhc1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlQXV0aG9yVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0QXV0aG9yVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVCb29raW5nVHlwZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Qm9va2luZ1R5cGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlQm9va2luZ1R5cGVUeXBlMUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRCb29raW5nVHlwZVR5cGUxVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlQ2FsY3VsYXRpb25UeXBlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDYWxjdWxhdGlvblR5cGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVDYXRlZ29yeVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydENhdGVnb3J5VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVDb2RlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q29kZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlQ29tcGFueVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydENvbXBhbnlUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVDb25zdHJhaW50VHlwZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q29uc3RyYWludFR5cGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVDb250YWN0VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q29udGFjdFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUNvc3RSYXRlVGFibGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydENvc3RSYXRlVGFibGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUN1cnJlbmN5U3ltYm9sVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q3VycmVuY3lTeW1ib2xUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVEYXlUeXBlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnREYXlUeXBlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZURlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVEZWZhdWx0VGFza0VWTWV0aG9kVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnREZWZhdWx0VGFza0VWTWV0aG9kVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZURlZmF1bHRUYXNrVHlwZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RGVmYXVsdFRhc2tUeXBlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnREdXJhdGlvbkZvcm1hdFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVEdXJhdGlvbkZvcm1hdFR5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVEdXJhdGlvbkZvcm1hdFR5cGUyRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTJUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVEdXJhdGlvbkZvcm1hdFR5cGUzRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTNUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVEdXJhdGlvbkZvcm1hdFR5cGU0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVEdXJhdGlvbkZvcm1hdFR5cGU1RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RWFybmVkVmFsdWVNZXRob2RUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlMUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVFbWFpbEFkZHJlc3NUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRFbWFpbEFkZHJlc3NUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUV4dGVybmFsVGFza1Byb2plY3RUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVGaXhlZENvc3RBY2NydWFsVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Rml4ZWRDb3N0QWNjcnVhbFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUZZU3RhcnREYXRlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRGWVN0YXJ0RGF0ZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUdyb3VwVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0R3JvdXBUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUh5cGVybGlua0FkZHJlc3NUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRIeXBlcmxpbmtBZGRyZXNzVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEh5cGVybGlua0FkZHJlc3NUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTJGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEh5cGVybGlua0FkZHJlc3NUeXBlMlRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTJUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlSHlwZXJsaW5rVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SHlwZXJsaW5rVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIeXBlcmxpbmtUeXBlMUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SHlwZXJsaW5rVHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlSHlwZXJsaW5rVHlwZTJGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEh5cGVybGlua1R5cGUyVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUluaXRpYWxzVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SW5pdGlhbHNUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVMYWdGb3JtYXRUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydExhZ0Zvcm1hdFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZU1hbmFnZXJUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRNYW5hZ2VyVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVNYXRlcmlhbExhYmVsVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TWF0ZXJpYWxMYWJlbFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE5hbWVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWVUeXBlMUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TmFtZVR5cGUxVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWVUeXBlMkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TmFtZVR5cGUyVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWVUeXBlM0Zyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TmFtZVR5cGUzVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVOZXdUYXNrU3RhcnREYXRlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROZXdUYXNrU3RhcnREYXRlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTlRBY2NvdW50VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TlRBY2NvdW50VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVPdXRsaW5lTnVtYmVyVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0T3V0bGluZU51bWJlclR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVQaG9uZXRpY0FsaWFzVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0UGhvbmV0aWNBbGlhc1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlUGhvbmV0aWNzVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0UGhvbmV0aWNzVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVQcmVmaXhUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRQcmVmaXhUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVSYXRlVGFibGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJhdGVUYWJsZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVSb2xsdXBUeXBlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRSb2xsdXBUeXBlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVTdWJqZWN0VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U3ViamVjdFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlU3VicHJvamVjdE5hbWVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTdWJwcm9qZWN0TmFtZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlVGl0bGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUaXRsZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVR5cGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFR5cGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlVHlwZVR5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFR5cGVUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVR5cGVUeXBlMkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUeXBlVHlwZTJUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVUeXBlVHlwZTNGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VHlwZVR5cGUzVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlVHlwZVR5cGU0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFR5cGVUeXBlNFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVR5cGVUeXBlNUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUeXBlVHlwZTVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVVJRFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFVJRFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVVuaXRUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFVuaXRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlVmFsdWVsaXN0U29ydE9yZGVyVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlV2Vla1N0YXJ0RGF5VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRXZWVrU3RhcnREYXlUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlV29ya0NvbnRvdXJUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFdvcmtDb250b3VyVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVdvcmtGb3JtYXRUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFdvcmtGb3JtYXRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlV29ya0dyb3VwVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRXb3JrR3JvdXBUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1zcHJvamVjdFBhY2thZ2UgZ2V0TXNwcm9qZWN0UGFja2FnZSgpIHsKLQkJcmV0dXJuIChNc3Byb2plY3RQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1zcHJvamVjdFBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvL01zcHJvamVjdEZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Nc3Byb2plY3RQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvTXNwcm9qZWN0UGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjU1MjcyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Nc3Byb2plY3RQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMxMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1zcHJvamVjdFBhY2thZ2VJbXBsLmphdmEsdiAxLjQgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuRWNvcmVSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5pbXBsLlhNTFR5cGVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QudXRpbC5Nc3Byb2plY3RWYWxpZGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTXNwcm9qZWN0UGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBNc3Byb2plY3RQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhY2thZ2VGaWxlbmFtZSA9ICJtc3Byb2plY3QuZWNvcmUiOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXNzaWdubWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhc3NpZ25tZW50c0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhdmFpbGFiaWxpdHlQZXJpb2RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXZhaWxhYmlsaXR5UGVyaW9kc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBiYXNlbGluZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBiYXNlbGluZTJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYmFzZWxpbmUzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNhbGVuZGFyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNhbGVuZGFyc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkb2N1bWVudFJvb3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXh0ZW5kZWRBdHRyaWJ1dGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXh0ZW5kZWRBdHRyaWJ1dGUyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV4dGVuZGVkQXR0cmlidXRlM0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBleHRlbmRlZEF0dHJpYnV0ZTRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXh0ZW5kZWRBdHRyaWJ1dGVzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1hc2tFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWFza3NFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgb3V0bGluZUNvZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgb3V0bGluZUNvZGUyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG91dGxpbmVDb2RlM0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBvdXRsaW5lQ29kZXNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJlZGVjZXNzb3JMaW5rRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2plY3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcmF0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByYXRlc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZXNvdXJjZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZXNvdXJjZXNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFza0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YXNrc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0aW1lUGVyaW9kRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRpbWVwaGFzZWREYXRhVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB2YWx1ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB2YWx1ZTJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdmFsdWVMaXN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHZhbHVlc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3YnNNYXNrRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdic01hc2tzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdlZWtEYXlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2Vla0RheXNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya2luZ1RpbWVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya2luZ1RpbWVzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGFjY3J1ZUF0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGFjdGl2ZURpcmVjdG9yeUdVSURUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGFsaWFzVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBhdXRob3JUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGJvb2tpbmdUeXBlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBib29raW5nVHlwZVR5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGNhbGN1bGF0aW9uVHlwZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgY2F0ZWdvcnlUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGNvZGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGNvbXBhbnlUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGNvbnN0cmFpbnRUeXBlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBjb250YWN0VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBjb3N0UmF0ZVRhYmxlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBjdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBjdXJyZW5jeVN5bWJvbFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZGF5VHlwZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGRlZmF1bHRUYXNrRVZNZXRob2RUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGRlZmF1bHRUYXNrVHlwZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZHVyYXRpb25Gb3JtYXRUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGR1cmF0aW9uRm9ybWF0VHlwZTFFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZHVyYXRpb25Gb3JtYXRUeXBlMkVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkdXJhdGlvbkZvcm1hdFR5cGUzRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGR1cmF0aW9uRm9ybWF0VHlwZTRFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZHVyYXRpb25Gb3JtYXRUeXBlNUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBlYXJuZWRWYWx1ZU1ldGhvZFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZWFybmVkVmFsdWVNZXRob2RUeXBlMUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBlbWFpbEFkZHJlc3NUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGV4dGVybmFsVGFza1Byb2plY3RUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGZpeGVkQ29zdEFjY3J1YWxUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGZ5U3RhcnREYXRlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBncm91cFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rQWRkcmVzc1R5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rQWRkcmVzc1R5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGh5cGVybGlua0FkZHJlc3NUeXBlMkVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTFFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGh5cGVybGlua1R5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rVHlwZTFFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rVHlwZTJFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaW5pdGlhbHNUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGxhZ0Zvcm1hdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG1hbmFnZXJUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG1hdGVyaWFsTGFiZWxUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG5hbWVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG5hbWVUeXBlMUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBuYW1lVHlwZTJFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbmFtZVR5cGUzRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG5ld1Rhc2tTdGFydERhdGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG50QWNjb3VudFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgb3V0bGluZU51bWJlclR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgb3ZlcnRpbWVSYXRlRm9ybWF0VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBvdmVydGltZVJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBwaG9uZXRpY0FsaWFzVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBwaG9uZXRpY3NUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHByZWZpeFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgcmF0ZVRhYmxlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSByb2xsdXBUeXBlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHN1YmplY3RUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHN1YnByb2plY3ROYW1lVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB0aXRsZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdHlwZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdHlwZVR5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHR5cGVUeXBlMkVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB0eXBlVHlwZTNFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdHlwZVR5cGU0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHR5cGVUeXBlNUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB1aWRUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHVuaXRUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHZhbHVlbGlzdFNvcnRPcmRlclR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgd2Vla1N0YXJ0RGF5VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB3b3JrQ29udG91clR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgd29ya0Zvcm1hdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgd29ya0dyb3VwVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1zcHJvamVjdFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBNc3Byb2plY3RGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNc3Byb2plY3RQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChNc3Byb2plY3RQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlNc3Byb2plY3RQYWNrYWdlSW1wbCB0aGVNc3Byb2plY3RQYWNrYWdlID0gKE1zcHJvamVjdFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIE1zcHJvamVjdFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgTXNwcm9qZWN0UGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlYTUxUeXBlUGFja2FnZUltcGwuaW5pdCgpOwotCi0JCS8vIExvYWQgcGFja2FnZXMKLQkJdGhlTXNwcm9qZWN0UGFja2FnZS5sb2FkUGFja2FnZSgpOwotCi0JCS8vIEZpeCBsb2FkZWQgcGFja2FnZXMKLQkJdGhlTXNwcm9qZWN0UGFja2FnZS5maXhQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBSZWdpc3RlciBwYWNrYWdlIHZhbGlkYXRvcgotCQlFVmFsaWRhdG9yLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dAotCQkJKHRoZU1zcHJvamVjdFBhY2thZ2UsIAotCQkJIG5ldyBFVmFsaWRhdG9yLkRlc2NyaXB0b3IoKSB7Ci0JCQkJIHB1YmxpYyBFVmFsaWRhdG9yIGdldEVWYWxpZGF0b3IoKSB7Ci0JCQkJCSByZXR1cm4gTXNwcm9qZWN0VmFsaWRhdG9yLklOU1RBTkNFOwotCQkJCSB9Ci0JCQkgfSk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVNc3Byb2plY3RQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVNc3Byb2plY3RQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXNzaWdubWVudCgpIHsKLQkJaWYgKGFzc2lnbm1lbnRFQ2xhc3MgPT0gbnVsbCkgewotCQkJYXNzaWdubWVudEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMyk7Ci0JCX0KLQkJcmV0dXJuIGFzc2lnbm1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1Rhc2tVSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1Jlc291cmNlVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9QZXJjZW50V29ya0NvbXBsZXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxGaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxTdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQUNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0NvbmZpcm1lZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0Nvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Db3N0UmF0ZVRhYmxlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ29zdFZhcmlhbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ1YoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9EZWxheSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0ZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0ZpbmlzaFZhcmlhbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfSHlwZXJsaW5rKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfSHlwZXJsaW5rQWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0h5cGVybGlua1N1YkFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Xb3JrVmFyaWFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IYXNGaXhlZFJhdGVVbml0cygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0ZpeGVkTWF0ZXJpYWwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9MZXZlbGluZ0RlbGF5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfTGV2ZWxpbmdEZWxheUZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0xpbmtlZEZpZWxkcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X01pbGVzdG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X05vdGVzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfT3ZlcmFsbG9jYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X092ZXJ0aW1lQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X092ZXJ0aW1lV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlZ3VsYXJXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVtYWluaW5nQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ092ZXJ0aW1lQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ092ZXJ0aW1lV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ1dvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZXNwb25zZVBlbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1N0b3AoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZXN1bWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9TdGFydFZhcmlhbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfVW5pdHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Myk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9VcGRhdGVOZWVkZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9WQUMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Xb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfV29ya0NvbnRvdXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Nyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9CQ1dTKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQkNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0Jvb2tpbmdUeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsV29ya1Byb3RlY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0NyZWF0aW9uRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBc3NpZ25tZW50X0V4dGVuZGVkQXR0cmlidXRlKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFzc2lnbm1lbnRfQmFzZWxpbmUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXNzaWdubWVudF9UaW1lcGhhc2VkRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFzc2lnbm1lbnRzKCkgewotCQlpZiAoYXNzaWdubWVudHNFQ2xhc3MgPT0gbnVsbCkgewotCQkJYXNzaWdubWVudHNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDQpOwotCQl9Ci0JCXJldHVybiBhc3NpZ25tZW50c0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBc3NpZ25tZW50c19Bc3NpZ25tZW50KCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0QXNzaWdubWVudHMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkgewotCQlpZiAoYXZhaWxhYmlsaXR5UGVyaW9kRUNsYXNzID09IG51bGwpIHsKLQkJCWF2YWlsYWJpbGl0eVBlcmlvZEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNik7Ci0JCX0KLQkJcmV0dXJuIGF2YWlsYWJpbGl0eVBlcmlvZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBdmFpbGFiaWxpdHlQZXJpb2RfQXZhaWxhYmxlRnJvbSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEF2YWlsYWJpbGl0eVBlcmlvZCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kX0F2YWlsYWJsZVRvKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBdmFpbGFiaWxpdHlQZXJpb2RfQXZhaWxhYmxlVW5pdHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpIHsKLQkJaWYgKGF2YWlsYWJpbGl0eVBlcmlvZHNFQ2xhc3MgPT0gbnVsbCkgewotCQkJYXZhaWxhYmlsaXR5UGVyaW9kc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNyk7Ci0JCX0KLQkJcmV0dXJuIGF2YWlsYWJpbGl0eVBlcmlvZHNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kc19BdmFpbGFiaWxpdHlQZXJpb2QoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEJhc2VsaW5lKCkgewotCQlpZiAoYmFzZWxpbmVFQ2xhc3MgPT0gbnVsbCkgewotCQkJYmFzZWxpbmVFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDgpOwotCQl9Ci0JCXJldHVybiBiYXNlbGluZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCYXNlbGluZV9UaW1lcGhhc2VkRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9OdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfSW50ZXJpbSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9GaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfRHVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfRHVyYXRpb25Gb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfRXN0aW1hdGVkRHVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9Db3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lX0JDV1MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lX0JDV1AoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QmFzZWxpbmUyKCkgewotCQlpZiAoYmFzZWxpbmUyRUNsYXNzID09IG51bGwpIHsKLQkJCWJhc2VsaW5lMkVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOSk7Ci0JCX0KLQkJcmV0dXJuIGJhc2VsaW5lMkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTJfTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTJfV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUyX0Nvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9CQ1dTKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTJfQkNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRCYXNlbGluZTMoKSB7Ci0JCWlmIChiYXNlbGluZTNFQ2xhc3MgPT0gbnVsbCkgewotCQkJYmFzZWxpbmUzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMCk7Ci0JCX0KLQkJcmV0dXJuIGJhc2VsaW5lM0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCYXNlbGluZTNfVGltZXBoYXNlZERhdGEoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRCYXNlbGluZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lM19OdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lM19TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX0ZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX1dvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lM19Db3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfQkNXUygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX0JDV1AoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q2FsZW5kYXIoKSB7Ci0JCWlmIChjYWxlbmRhckVDbGFzcyA9PSBudWxsKSB7Ci0JCQljYWxlbmRhckVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTUpOwotCQl9Ci0JCXJldHVybiBjYWxlbmRhckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRDYWxlbmRhcigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2FsZW5kYXJfTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldENhbGVuZGFyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9Jc0Jhc2VDYWxlbmRhcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldENhbGVuZGFyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9CYXNlQ2FsZW5kYXJVSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRDYWxlbmRhcigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q2FsZW5kYXJfV2Vla0RheXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRDYWxlbmRhcigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDYWxlbmRhcnMoKSB7Ci0JCWlmIChjYWxlbmRhcnNFQ2xhc3MgPT0gbnVsbCkgewotCQkJY2FsZW5kYXJzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxNik7Ci0JCX0KLQkJcmV0dXJuIGNhbGVuZGFyc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDYWxlbmRhcnNfQ2FsZW5kYXIoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRDYWxlbmRhcnMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RG9jdW1lbnRSb290KCkgewotCQlpZiAoZG9jdW1lbnRSb290RUNsYXNzID09IG51bGwpIHsKLQkJCWRvY3VtZW50Um9vdEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjkpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudFJvb3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RG9jdW1lbnRSb290X01peGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RG9jdW1lbnRSb290KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXREb2N1bWVudFJvb3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9YU0lTY2hlbWFMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldERvY3VtZW50Um9vdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1Byb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXREb2N1bWVudFJvb3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZUVDbGFzcyA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZUVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzkpOwotCQl9Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9GaWVsZElEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0ZpZWxkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9BbGlhcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9QaG9uZXRpY0FsaWFzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX1JvbGx1cFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfQ2FsY3VsYXRpb25UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0Zvcm11bGEoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfUmVzdHJpY3RWYWx1ZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfVmFsdWVsaXN0U29ydE9yZGVyKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0FwcGVuZE5ld1ZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9EZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9WYWx1ZUxpc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkgewotCQlpZiAoZXh0ZW5kZWRBdHRyaWJ1dGUyRUNsYXNzID09IG51bGwpIHsKLQkJCWV4dGVuZGVkQXR0cmlidXRlMkVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDApOwotCQl9Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZTJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX1VJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX0ZpZWxkSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlMl9WYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX1ZhbHVlSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlMl9EdXJhdGlvbkZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZTNFQ2xhc3MgPT0gbnVsbCkgewotCQkJZXh0ZW5kZWRBdHRyaWJ1dGUzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg0MSk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlM0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfRmllbGRJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX1ZhbHVlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfVmFsdWVJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX0R1cmF0aW9uRm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEV4dGVuZGVkQXR0cmlidXRlNCgpIHsKLQkJaWYgKGV4dGVuZGVkQXR0cmlidXRlNEVDbGFzcyA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZTRFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDQyKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9GaWVsZElEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9WYWx1ZUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfRHVyYXRpb25Gb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkgewotCQlpZiAoZXh0ZW5kZWRBdHRyaWJ1dGVzRUNsYXNzID09IG51bGwpIHsKLQkJCWV4dGVuZGVkQXR0cmlidXRlc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDMpOwotCQl9Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzX0V4dGVuZGVkQXR0cmlidXRlKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1hc2soKSB7Ci0JCWlmIChtYXNrRUNsYXNzID09IG51bGwpIHsKLQkJCW1hc2tFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDYyKTsKLQkJfQotCQlyZXR1cm4gbWFza0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNYXNrX0xldmVsKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0TWFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWFza19UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0TWFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWFza19MZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRNYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNYXNrX1NlcGFyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE1hc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWFza3MoKSB7Ci0JCWlmIChtYXNrc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQltYXNrc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNjMpOwotCQl9Ci0JCXJldHVybiBtYXNrc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNYXNrc19NYXNrKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0TWFza3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0T3V0bGluZUNvZGUoKSB7Ci0JCWlmIChvdXRsaW5lQ29kZUVDbGFzcyA9PSBudWxsKSB7Ci0JCQlvdXRsaW5lQ29kZUVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNzEpOwotCQl9Ci0JCXJldHVybiBvdXRsaW5lQ29kZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9GaWVsZElEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0ZpZWxkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9BbGlhcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9QaG9uZXRpY0FsaWFzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE91dGxpbmVDb2RlX1ZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9FbnRlcnByaXNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0VudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9MZWFmT25seSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9BbGxMZXZlbHNSZXF1aXJlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9Pbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRPdXRsaW5lQ29kZV9NYXNrcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRPdXRsaW5lQ29kZTIoKSB7Ci0JCWlmIChvdXRsaW5lQ29kZTJFQ2xhc3MgPT0gbnVsbCkgewotCQkJb3V0bGluZUNvZGUyRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3Mik7Ci0JCX0KLQkJcmV0dXJuIG91dGxpbmVDb2RlMkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTJfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTJfRmllbGRJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUyX1ZhbHVlSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRPdXRsaW5lQ29kZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0T3V0bGluZUNvZGUzKCkgewotCQlpZiAob3V0bGluZUNvZGUzRUNsYXNzID09IG51bGwpIHsKLQkJCW91dGxpbmVDb2RlM0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNzMpOwotCQl9Ci0JCXJldHVybiBvdXRsaW5lQ29kZTNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUzX1VJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUzX0ZpZWxkSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRPdXRsaW5lQ29kZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlM19WYWx1ZUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE91dGxpbmVDb2RlcygpIHsKLQkJaWYgKG91dGxpbmVDb2Rlc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQlvdXRsaW5lQ29kZXNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDc0KTsKLQkJfQotCQlyZXR1cm4gb3V0bGluZUNvZGVzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE91dGxpbmVDb2Rlc19PdXRsaW5lQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldE91dGxpbmVDb2RlcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcmVkZWNlc3NvckxpbmsoKSB7Ci0JCWlmIChwcmVkZWNlc3NvckxpbmtFQ2xhc3MgPT0gbnVsbCkgewotCQkJcHJlZGVjZXNzb3JMaW5rRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg4MCk7Ci0JCX0KLQkJcmV0dXJuIHByZWRlY2Vzc29yTGlua0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfUHJlZGVjZXNzb3JVSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcmVkZWNlc3NvckxpbmsoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJlZGVjZXNzb3JMaW5rKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfQ3Jvc3NQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJlZGVjZXNzb3JMaW5rKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfQ3Jvc3NQcm9qZWN0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByZWRlY2Vzc29yTGluaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJlZGVjZXNzb3JMaW5rX0xpbmtMYWcoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcmVkZWNlc3NvckxpbmsoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19MYWdGb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcmVkZWNlc3NvckxpbmsoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvamVjdCgpIHsKLQkJaWYgKHByb2plY3RFQ2xhc3MgPT0gbnVsbCkgewotCQkJcHJvamVjdEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoODIpOwotCQl9Ci0JCXJldHVybiBwcm9qZWN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9OYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9UaXRsZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfU3ViamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQ2F0ZWdvcnkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NvbXBhbnkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0F1dGhvcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQ3JlYXRpb25EYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9SZXZpc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTGFzdFNhdmVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfU2NoZWR1bGVGcm9tU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9TdGFydERhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9GaW5pc2hEYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRllTdGFydERhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Dcml0aWNhbFNsYWNrTGltaXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DdXJyZW5jeURpZ2l0cygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0N1cnJlbmN5U3ltYm9sKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQ3VycmVuY3lTeW1ib2xQb3NpdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NhbGVuZGFyVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdFN0YXJ0VGltZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0RlZmF1bHRGaW5pc2hUaW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTWludXRlc1BlckRheSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01pbnV0ZXNQZXJXZWVrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRGF5c1Blck1vbnRoKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdFRhc2tUeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0U3RhbmRhcmRSYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdE92ZXJ0aW1lUmF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0R1cmF0aW9uRm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfV29ya0Zvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0VkaXRhYmxlQWN0dWFsQ29zdHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Ib25vckNvbnN0cmFpbnRzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRWFybmVkVmFsdWVNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9JbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9NdWx0aXBsZUNyaXRpY2FsUGF0aHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9OZXdUYXNrc0VmZm9ydERyaXZlbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05ld1Rhc2tzRXN0aW1hdGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfU3ByZWFkQWN0dWFsQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1Rhc2tVcGRhdGVzUmVzb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9GaXNjYWxZZWFyU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9XZWVrU3RhcnREYXkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Myk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Nb3ZlQ29tcGxldGVkRW5kc0JhY2soKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Nb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1N0YXR1c0RhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DdXJyZW50RGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9BdXRvbGluaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05ld1Rhc2tTdGFydERhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0VGFza0VWTWV0aG9kKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9FeHRlbmRlZENyZWF0aW9uRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0FjdHVhbHNJblN5bmMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1OCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9SZW1vdmVGaWxlUHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0FkbWluUHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9qZWN0X091dGxpbmVDb2RlcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9qZWN0X1dCU01hc2tzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2plY3RfRXh0ZW5kZWRBdHRyaWJ1dGVzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2plY3RfQ2FsZW5kYXJzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2plY3RfVGFza3MoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvamVjdF9SZXNvdXJjZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvamVjdF9Bc3NpZ25tZW50cygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJhdGUoKSB7Ci0JCWlmIChyYXRlRUNsYXNzID09IG51bGwpIHsKLQkJCXJhdGVFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDgzKTsKLQkJfQotCQlyZXR1cm4gcmF0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSYXRlX1JhdGVzRnJvbSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJhdGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJhdGVfUmF0ZXNUbygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJhdGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJhdGVfUmF0ZVRhYmxlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmF0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmF0ZV9TdGFuZGFyZFJhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSYXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSYXRlX1N0YW5kYXJkUmF0ZUZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJhdGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJhdGVfT3ZlcnRpbWVSYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmF0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmF0ZV9PdmVydGltZVJhdGVGb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSYXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSYXRlX0Nvc3RQZXJVc2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSYXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJhdGVzKCkgewotCQlpZiAocmF0ZXNFQ2xhc3MgPT0gbnVsbCkgewotCQkJcmF0ZXNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDg0KTsKLQkJfQotCQlyZXR1cm4gcmF0ZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmF0ZXNfUmF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFJhdGVzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlc291cmNlKCkgewotCQlpZiAocmVzb3VyY2VFQ2xhc3MgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDg2KTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0lEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jc051bGwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSW5pdGlhbHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUGhvbmV0aWNzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX05UQWNjb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9NYXRlcmlhbExhYmVsKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0NvZGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfR3JvdXAoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1dvcmtHcm91cCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfRW1haWxBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9IeXBlcmxpbmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0h5cGVybGlua0FkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0h5cGVybGlua1N1YkFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX01heFVuaXRzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9QZWFrVW5pdHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX092ZXJBbGxvY2F0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0F2YWlsYWJsZUZyb20oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0F2YWlsYWJsZVRvKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfRmluaXNoKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9DYW5MZXZlbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWNjcnVlQXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1dvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1JlZ3VsYXJXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVydGltZVdvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbFdvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1JlbWFpbmluZ1dvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9QZXJjZW50V29ya0NvbXBsZXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9TdGFuZGFyZFJhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1N0YW5kYXJkUmF0ZUZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfT3ZlcnRpbWVSYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVydGltZVJhdGVGb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX092ZXJ0aW1lQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ29zdFBlclVzZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0dWFsQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0dWFsT3ZlcnRpbWVDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZW1haW5pbmdDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZW1haW5pbmdPdmVydGltZUNvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1dvcmtWYXJpYW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ29zdFZhcmlhbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9TVigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ1YoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0FDV1AoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0NhbGVuZGFyVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Ob3RlcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQkNXUygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQkNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSXNHZW5lcmljKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jc0luYWN0aXZlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jc0VudGVycHJpc2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0Jvb2tpbmdUeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxXb3JrUHJvdGVjdGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdGl2ZURpcmVjdG9yeUdVSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0NyZWF0aW9uRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfRXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlX0Jhc2VsaW5lKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9PdXRsaW5lQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Myk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfQXZhaWxhYmlsaXR5UGVyaW9kcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfUmF0ZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlX1RpbWVwaGFzZWREYXRhKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlc291cmNlcygpIHsKLQkJaWYgKHJlc291cmNlc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZXNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDg3KTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlc19SZXNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFJlc291cmNlcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUYXNrKCkgewotCQlpZiAodGFza0VDbGFzcyA9PSBudWxsKSB7Ci0JCQl0YXNrRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg5Myk7Ci0JCX0KLQkJcmV0dXJuIHRhc2tFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0lEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19OYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Jc051bGwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0NyZWF0ZURhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0NvbnRhY3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1dCUygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfV0JTTGV2ZWwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX091dGxpbmVOdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX091dGxpbmVMZXZlbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1ByaW9yaXR5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19GaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19EdXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0R1cmF0aW9uRm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1N0b3AoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19SZXN1bWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19SZXN1bWVWYWxpZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0VmZm9ydERyaXZlbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1JlY3VycmluZygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX092ZXJBbGxvY2F0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Fc3RpbWF0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19NaWxlc3RvbmUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19TdW1tYXJ5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQ3JpdGljYWwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Jc1N1YnByb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Jc1N1YnByb2plY3RSZWFkT25seSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1N1YnByb2plY3ROYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRXh0ZXJuYWxUYXNrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRXh0ZXJuYWxUYXNrUHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0Vhcmx5U3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19FYXJseUZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0xhdGVTdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0xhdGVGaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19TdGFydFZhcmlhbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRmluaXNoVmFyaWFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Xb3JrVmFyaWFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19GcmVlU2xhY2soKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Ub3RhbFNsYWNrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRml4ZWRDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRml4ZWRDb3N0QWNjcnVhbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1BlcmNlbnRDb21wbGV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1BlcmNlbnRXb3JrQ29tcGxldGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Db3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfT3ZlcnRpbWVDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0OCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxGaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0OSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxEdXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbENvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxPdmVydGltZUNvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUmVndWxhcldvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdEdXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1JlbWFpbmluZ0Nvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1Nyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQUNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0NWKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQ29uc3RyYWludFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Myk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19DYWxlbmRhclVJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0NvbnN0cmFpbnREYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRGVhZGxpbmUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19MZXZlbEFzc2lnbm1lbnRzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfTGV2ZWxpbmdDYW5TcGxpdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0xldmVsaW5nRGVsYXkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2OSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19MZXZlbGluZ0RlbGF5Rm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUHJlTGV2ZWxlZFN0YXJ0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUHJlTGV2ZWxlZEZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0h5cGVybGluaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDczKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0h5cGVybGlua0FkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19IeXBlcmxpbmtTdWJBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDc2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX05vdGVzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfSGlkZUJhcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDc4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1JvbGx1cCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDc5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0JDV1MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19CQ1dQKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoODEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19FYXJuZWRWYWx1ZU1ldGhvZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrX1ByZWRlY2Vzc29yTGluaygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbFdvcmtQcm90ZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19FeHRlbmRlZEF0dHJpYnV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrX0Jhc2VsaW5lKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoODgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tfT3V0bGluZUNvZGUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4OSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19UaW1lcGhhc2VkRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhc2tzKCkgewotCQlpZiAodGFza3NFQ2xhc3MgPT0gbnVsbCkgewotCQkJdGFza3NFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDk0KTsKLQkJfQotCQlyZXR1cm4gdGFza3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza3NfVGFzaygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFRhc2tzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRpbWVQZXJpb2QoKSB7Ci0JCWlmICh0aW1lUGVyaW9kRUNsYXNzID09IG51bGwpIHsKLQkJCXRpbWVQZXJpb2RFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDk1KTsKLQkJfQotCQlyZXR1cm4gdGltZVBlcmlvZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lUGVyaW9kX0Zyb21EYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGltZVBlcmlvZCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGltZVBlcmlvZF9Ub0RhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lUGVyaW9kKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRpbWVwaGFzZWREYXRhVHlwZSgpIHsKLQkJaWYgKHRpbWVwaGFzZWREYXRhVHlwZUVDbGFzcyA9PSBudWxsKSB7Ci0JCQl0aW1lcGhhc2VkRGF0YVR5cGVFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDk2KTsKLQkJfQotCQlyZXR1cm4gdGltZXBoYXNlZERhdGFUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9GaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9Vbml0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VmFsdWUoKSB7Ci0JCWlmICh2YWx1ZUVDbGFzcyA9PSBudWxsKSB7Ci0JCQl2YWx1ZUVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTA2KTsKLQkJfQotCQlyZXR1cm4gdmFsdWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFsdWVfVmFsdWVJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFZhbHVlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRWYWx1ZV9QYXJlbnRWYWx1ZUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFZhbHVlX1ZhbHVlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFZhbHVlX0Rlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VmFsdWUyKCkgewotCQlpZiAodmFsdWUyRUNsYXNzID09IG51bGwpIHsKLQkJCXZhbHVlMkVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTA3KTsKLQkJfQotCQlyZXR1cm4gdmFsdWUyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFZhbHVlMl9JRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFZhbHVlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFsdWUyX1ZhbHVlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRWYWx1ZTJfRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRWYWx1ZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VmFsdWVMaXN0KCkgewotCQlpZiAodmFsdWVMaXN0RUNsYXNzID09IG51bGwpIHsKLQkJCXZhbHVlTGlzdEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTA4KTsKLQkJfQotCQlyZXR1cm4gdmFsdWVMaXN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFZhbHVlTGlzdF9WYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFZhbHVlTGlzdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRWYWx1ZXMoKSB7Ci0JCWlmICh2YWx1ZXNFQ2xhc3MgPT0gbnVsbCkgewotCQkJdmFsdWVzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMTApOwotCQl9Ci0JCXJldHVybiB2YWx1ZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFsdWVzX0dyb3VwKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWVzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRWYWx1ZXNfVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRWYWx1ZXMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V0JTTWFzaygpIHsKLQkJaWYgKHdic01hc2tFQ2xhc3MgPT0gbnVsbCkgewotCQkJd2JzTWFza0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTExKTsKLQkJfQotCQlyZXR1cm4gd2JzTWFza0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXQlNNYXNrX0xldmVsKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0V0JTTWFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V0JTTWFza19UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0V0JTTWFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V0JTTWFza19MZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXQlNNYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXQlNNYXNrX1NlcGFyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFdCU01hc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V0JTTWFza3MoKSB7Ci0JCWlmICh3YnNNYXNrc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQl3YnNNYXNrc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTEyKTsKLQkJfQotCQlyZXR1cm4gd2JzTWFza3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V0JTTWFza3NfVmVyaWZ5VW5pcXVlQ29kZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXQlNNYXNrcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V0JTTWFza3NfR2VuZXJhdGVDb2RlcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFdCU01hc2tzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXQlNNYXNrc19QcmVmaXgoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXQlNNYXNrcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V0JTTWFza3NfV0JTTWFzaygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFdCU01hc2tzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdlZWtEYXkoKSB7Ci0JCWlmICh3ZWVrRGF5RUNsYXNzID09IG51bGwpIHsKLQkJCXdlZWtEYXlFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExMyk7Ci0JCX0KLQkJcmV0dXJuIHdlZWtEYXlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2Vla0RheV9EYXlUeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0V2Vla0RheSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2Vla0RheV9EYXlXb3JraW5nKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0V2Vla0RheSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2Vla0RheV9UaW1lUGVyaW9kKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0V2Vla0RheSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2Vla0RheV9Xb3JraW5nVGltZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRXZWVrRGF5KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdlZWtEYXlzKCkgewotCQlpZiAod2Vla0RheXNFQ2xhc3MgPT0gbnVsbCkgewotCQkJd2Vla0RheXNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExNCk7Ci0JCX0KLQkJcmV0dXJuIHdlZWtEYXlzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlZWtEYXlzX1dlZWtEYXkoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRXZWVrRGF5cygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JraW5nVGltZSgpIHsKLQkJaWYgKHdvcmtpbmdUaW1lRUNsYXNzID09IG51bGwpIHsKLQkJCXdvcmtpbmdUaW1lRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMTkpOwotCQl9Ci0JCXJldHVybiB3b3JraW5nVGltZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JraW5nVGltZV9Gcm9tVGltZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFdvcmtpbmdUaW1lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JraW5nVGltZV9Ub1RpbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXb3JraW5nVGltZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JraW5nVGltZXMoKSB7Ci0JCWlmICh3b3JraW5nVGltZXNFQ2xhc3MgPT0gbnVsbCkgewotCQkJd29ya2luZ1RpbWVzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMjApOwotCQl9Ci0JCXJldHVybiB3b3JraW5nVGltZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya2luZ1RpbWVzX1dvcmtpbmdUaW1lKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0V29ya2luZ1RpbWVzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEFjY3J1ZUF0KCkgewotCQlpZiAoYWNjcnVlQXRFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJYWNjcnVlQXRFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDApOwotCQl9Ci0JCXJldHVybiBhY2NydWVBdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEFjdGl2ZURpcmVjdG9yeUdVSURUeXBlKCkgewotCQlpZiAoYWN0aXZlRGlyZWN0b3J5R1VJRFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJYWN0aXZlRGlyZWN0b3J5R1VJRFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDEpOwotCQl9Ci0JCXJldHVybiBhY3RpdmVEaXJlY3RvcnlHVUlEVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEFsaWFzVHlwZSgpIHsKLQkJaWYgKGFsaWFzVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlhbGlhc1R5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDIpOwotCQl9Ci0JCXJldHVybiBhbGlhc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRBdXRob3JUeXBlKCkgewotCQlpZiAoYXV0aG9yVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlhdXRob3JUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg1KTsKLQkJfQotCQlyZXR1cm4gYXV0aG9yVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlKCkgewotCQlpZiAoYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExKTsKLQkJfQotCQlyZXR1cm4gYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRCb29raW5nVHlwZVR5cGUoKSB7Ci0JCWlmIChib29raW5nVHlwZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJYm9va2luZ1R5cGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMik7Ci0JCX0KLQkJcmV0dXJuIGJvb2tpbmdUeXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEJvb2tpbmdUeXBlVHlwZTEoKSB7Ci0JCWlmIChib29raW5nVHlwZVR5cGUxRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWJvb2tpbmdUeXBlVHlwZTFFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDEzKTsKLQkJfQotCQlyZXR1cm4gYm9va2luZ1R5cGVUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldENhbGN1bGF0aW9uVHlwZVR5cGUoKSB7Ci0JCWlmIChjYWxjdWxhdGlvblR5cGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWNhbGN1bGF0aW9uVHlwZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDE0KTsKLQkJfQotCQlyZXR1cm4gY2FsY3VsYXRpb25UeXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldENhdGVnb3J5VHlwZSgpIHsKLQkJaWYgKGNhdGVnb3J5VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQljYXRlZ29yeVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDE3KTsKLQkJfQotCQlyZXR1cm4gY2F0ZWdvcnlUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Q29kZVR5cGUoKSB7Ci0JCWlmIChjb2RlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQljb2RlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTgpOwotCQl9Ci0JCXJldHVybiBjb2RlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldENvbXBhbnlUeXBlKCkgewotCQlpZiAoY29tcGFueVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJY29tcGFueVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDE5KTsKLQkJfQotCQlyZXR1cm4gY29tcGFueVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRDb25zdHJhaW50VHlwZVR5cGUoKSB7Ci0JCWlmIChjb25zdHJhaW50VHlwZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJY29uc3RyYWludFR5cGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgyMCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnN0cmFpbnRUeXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldENvbnRhY3RUeXBlKCkgewotCQlpZiAoY29udGFjdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJY29udGFjdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDIxKTsKLQkJfQotCQlyZXR1cm4gY29udGFjdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRDb3N0UmF0ZVRhYmxlVHlwZSgpIHsKLQkJaWYgKGNvc3RSYXRlVGFibGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWNvc3RSYXRlVGFibGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgyMik7Ci0JCX0KLQkJcmV0dXJuIGNvc3RSYXRlVGFibGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUoKSB7Ci0JCWlmIChjdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQljdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjMpOwotCQl9Ci0JCXJldHVybiBjdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEN1cnJlbmN5U3ltYm9sVHlwZSgpIHsKLQkJaWYgKGN1cnJlbmN5U3ltYm9sVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQljdXJyZW5jeVN5bWJvbFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDI0KTsKLQkJfQotCQlyZXR1cm4gY3VycmVuY3lTeW1ib2xUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RGF5VHlwZVR5cGUoKSB7Ci0JCWlmIChkYXlUeXBlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkYXlUeXBlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjUpOwotCQl9Ci0JCXJldHVybiBkYXlUeXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldERlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSgpIHsKLQkJaWYgKGRlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDI2KTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUoKSB7Ci0JCWlmIChkZWZhdWx0VGFza0VWTWV0aG9kVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0VGFza0VWTWV0aG9kVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjcpOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0VGFza0VWTWV0aG9kVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldERlZmF1bHRUYXNrVHlwZVR5cGUoKSB7Ci0JCWlmIChkZWZhdWx0VGFza1R5cGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWRlZmF1bHRUYXNrVHlwZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDI4KTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFRhc2tUeXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldER1cmF0aW9uRm9ybWF0VHlwZSgpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkdXJhdGlvbkZvcm1hdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDMwKTsKLQkJfQotCQlyZXR1cm4gZHVyYXRpb25Gb3JtYXRUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMSgpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZTFFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZHVyYXRpb25Gb3JtYXRUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzEpOwotCQl9Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdFR5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMigpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZTJFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZHVyYXRpb25Gb3JtYXRUeXBlMkVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzIpOwotCQl9Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdFR5cGUyRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMygpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZTNFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZHVyYXRpb25Gb3JtYXRUeXBlM0VEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzMpOwotCQl9Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdFR5cGUzRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNCgpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZTRFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZHVyYXRpb25Gb3JtYXRUeXBlNEVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzQpOwotCQl9Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdFR5cGU0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNSgpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZTVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZHVyYXRpb25Gb3JtYXRUeXBlNUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzUpOwotCQl9Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdFR5cGU1RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RWFybmVkVmFsdWVNZXRob2RUeXBlKCkgewotCQlpZiAoZWFybmVkVmFsdWVNZXRob2RUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWVhcm5lZFZhbHVlTWV0aG9kVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzYpOwotCQl9Ci0JCXJldHVybiBlYXJuZWRWYWx1ZU1ldGhvZFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxKCkgewotCQlpZiAoZWFybmVkVmFsdWVNZXRob2RUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQllYXJuZWRWYWx1ZU1ldGhvZFR5cGUxRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzNyk7Ci0JCX0KLQkJcmV0dXJuIGVhcm5lZFZhbHVlTWV0aG9kVHlwZTFFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRFbWFpbEFkZHJlc3NUeXBlKCkgewotCQlpZiAoZW1haWxBZGRyZXNzVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQllbWFpbEFkZHJlc3NUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzOCk7Ci0JCX0KLQkJcmV0dXJuIGVtYWlsQWRkcmVzc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSgpIHsKLQkJaWYgKGV4dGVybmFsVGFza1Byb2plY3RUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWV4dGVybmFsVGFza1Byb2plY3RUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg0NCk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVybmFsVGFza1Byb2plY3RUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKSB7Ci0JCWlmIChmaXhlZENvc3RBY2NydWFsVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlmaXhlZENvc3RBY2NydWFsVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDUpOwotCQl9Ci0JCXJldHVybiBmaXhlZENvc3RBY2NydWFsVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEZZU3RhcnREYXRlVHlwZSgpIHsKLQkJaWYgKGZ5U3RhcnREYXRlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlmeVN0YXJ0RGF0ZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDQ2KTsKLQkJfQotCQlyZXR1cm4gZnlTdGFydERhdGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0R3JvdXBUeXBlKCkgewotCQlpZiAoZ3JvdXBUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWdyb3VwVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDcpOwotCQl9Ci0JCXJldHVybiBncm91cFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZSgpIHsKLQkJaWYgKGh5cGVybGlua0FkZHJlc3NUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWh5cGVybGlua0FkZHJlc3NUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg0OCk7Ci0JCX0KLQkJcmV0dXJuIGh5cGVybGlua0FkZHJlc3NUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rQWRkcmVzc1R5cGUxKCkgewotCQlpZiAoaHlwZXJsaW5rQWRkcmVzc1R5cGUxRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWh5cGVybGlua0FkZHJlc3NUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDkpOwotCQl9Ci0JCXJldHVybiBoeXBlcmxpbmtBZGRyZXNzVHlwZTFFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZTIoKSB7Ci0JCWlmIChoeXBlcmxpbmtBZGRyZXNzVHlwZTJFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rQWRkcmVzc1R5cGUyRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg1MCk7Ci0JCX0KLQkJcmV0dXJuIGh5cGVybGlua0FkZHJlc3NUeXBlMkVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlKCkgewotCQlpZiAoaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDUxKTsKLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEoKSB7Ci0JCWlmIChoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTFFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg1Mik7Ci0JCX0KLQkJcmV0dXJuIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMigpIHsKLQkJaWYgKGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMkVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQloeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTJFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDUzKTsKLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rVHlwZSgpIHsKLQkJaWYgKGh5cGVybGlua1R5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNTQpOwotCQl9Ci0JCXJldHVybiBoeXBlcmxpbmtUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rVHlwZTEoKSB7Ci0JCWlmIChoeXBlcmxpbmtUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQloeXBlcmxpbmtUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNTUpOwotCQl9Ci0JCXJldHVybiBoeXBlcmxpbmtUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEh5cGVybGlua1R5cGUyKCkgewotCQlpZiAoaHlwZXJsaW5rVHlwZTJFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rVHlwZTJFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDU2KTsKLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rVHlwZTJFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRJbml0aWFsc1R5cGUoKSB7Ci0JCWlmIChpbml0aWFsc1R5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaW5pdGlhbHNUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg1Nyk7Ci0JCX0KLQkJcmV0dXJuIGluaXRpYWxzVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldExhZ0Zvcm1hdFR5cGUoKSB7Ci0JCWlmIChsYWdGb3JtYXRUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWxhZ0Zvcm1hdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDU4KTsKLQkJfQotCQlyZXR1cm4gbGFnRm9ybWF0VHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldExldmVsaW5nRGVsYXlGb3JtYXRUeXBlKCkgewotCQlpZiAobGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDU5KTsKLQkJfQotCQlyZXR1cm4gbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEoKSB7Ci0JCWlmIChsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTFFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg2MCk7Ci0JCX0KLQkJcmV0dXJuIGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE1hbmFnZXJUeXBlKCkgewotCQlpZiAobWFuYWdlclR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbWFuYWdlclR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDYxKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlclR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRNYXRlcmlhbExhYmVsVHlwZSgpIHsKLQkJaWYgKG1hdGVyaWFsTGFiZWxUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCW1hdGVyaWFsTGFiZWxUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg2NCk7Ci0JCX0KLQkJcmV0dXJuIG1hdGVyaWFsTGFiZWxUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TmFtZVR5cGUoKSB7Ci0JCWlmIChuYW1lVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQluYW1lVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNjUpOwotCQl9Ci0JCXJldHVybiBuYW1lVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE5hbWVUeXBlMSgpIHsKLQkJaWYgKG5hbWVUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQluYW1lVHlwZTFFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDY2KTsKLQkJfQotCQlyZXR1cm4gbmFtZVR5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TmFtZVR5cGUyKCkgewotCQlpZiAobmFtZVR5cGUyRURhdGFUeXBlID09IG51bGwpIHsKLQkJCW5hbWVUeXBlMkVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNjcpOwotCQl9Ci0JCXJldHVybiBuYW1lVHlwZTJFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXROYW1lVHlwZTMoKSB7Ci0JCWlmIChuYW1lVHlwZTNFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbmFtZVR5cGUzRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg2OCk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVUeXBlM0VEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE5ld1Rhc2tTdGFydERhdGVUeXBlKCkgewotCQlpZiAobmV3VGFza1N0YXJ0RGF0ZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbmV3VGFza1N0YXJ0RGF0ZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDY5KTsKLQkJfQotCQlyZXR1cm4gbmV3VGFza1N0YXJ0RGF0ZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXROVEFjY291bnRUeXBlKCkgewotCQlpZiAobnRBY2NvdW50VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQludEFjY291bnRUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3MCk7Ci0JCX0KLQkJcmV0dXJuIG50QWNjb3VudFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRPdXRsaW5lTnVtYmVyVHlwZSgpIHsKLQkJaWYgKG91dGxpbmVOdW1iZXJUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCW91dGxpbmVOdW1iZXJUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3NSk7Ci0JCX0KLQkJcmV0dXJuIG91dGxpbmVOdW1iZXJUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSgpIHsKLQkJaWYgKG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJb3ZlcnRpbWVSYXRlRm9ybWF0VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNzYpOwotCQl9Ci0JCXJldHVybiBvdmVydGltZVJhdGVGb3JtYXRUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEoKSB7Ci0JCWlmIChvdmVydGltZVJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlvdmVydGltZVJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNzcpOwotCQl9Ci0JCXJldHVybiBvdmVydGltZVJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFBob25ldGljQWxpYXNUeXBlKCkgewotCQlpZiAocGhvbmV0aWNBbGlhc1R5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJcGhvbmV0aWNBbGlhc1R5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDc4KTsKLQkJfQotCQlyZXR1cm4gcGhvbmV0aWNBbGlhc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRQaG9uZXRpY3NUeXBlKCkgewotCQlpZiAocGhvbmV0aWNzVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlwaG9uZXRpY3NUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3OSk7Ci0JCX0KLQkJcmV0dXJuIHBob25ldGljc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRQcmVmaXhUeXBlKCkgewotCQlpZiAocHJlZml4VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlwcmVmaXhUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg4MSk7Ci0JCX0KLQkJcmV0dXJuIHByZWZpeFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRSYXRlVGFibGVUeXBlKCkgewotCQlpZiAocmF0ZVRhYmxlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlyYXRlVGFibGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg4NSk7Ci0JCX0KLQkJcmV0dXJuIHJhdGVUYWJsZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRSb2xsdXBUeXBlVHlwZSgpIHsKLQkJaWYgKHJvbGx1cFR5cGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXJvbGx1cFR5cGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg4OCk7Ci0JCX0KLQkJcmV0dXJuIHJvbGx1cFR5cGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZSgpIHsKLQkJaWYgKHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJc3RhbmRhcmRSYXRlRm9ybWF0VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoODkpOwotCQl9Ci0JCXJldHVybiBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEoKSB7Ci0JCWlmIChzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOTApOwotCQl9Ci0JCXJldHVybiBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFN1YmplY3RUeXBlKCkgewotCQlpZiAoc3ViamVjdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJc3ViamVjdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDkxKTsKLQkJfQotCQlyZXR1cm4gc3ViamVjdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRTdWJwcm9qZWN0TmFtZVR5cGUoKSB7Ci0JCWlmIChzdWJwcm9qZWN0TmFtZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJc3VicHJvamVjdE5hbWVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg5Mik7Ci0JCX0KLQkJcmV0dXJuIHN1YnByb2plY3ROYW1lVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFRpdGxlVHlwZSgpIHsKLQkJaWYgKHRpdGxlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQl0aXRsZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDk3KTsKLQkJfQotCQlyZXR1cm4gdGl0bGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHlwZVR5cGUoKSB7Ci0JCWlmICh0eXBlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQl0eXBlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOTgpOwotCQl9Ci0JCXJldHVybiB0eXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFR5cGVUeXBlMSgpIHsKLQkJaWYgKHR5cGVUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQl0eXBlVHlwZTFFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDk5KTsKLQkJfQotCQlyZXR1cm4gdHlwZVR5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHlwZVR5cGUyKCkgewotCQlpZiAodHlwZVR5cGUyRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXR5cGVUeXBlMkVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTAwKTsKLQkJfQotCQlyZXR1cm4gdHlwZVR5cGUyRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHlwZVR5cGUzKCkgewotCQlpZiAodHlwZVR5cGUzRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXR5cGVUeXBlM0VEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTAxKTsKLQkJfQotCQlyZXR1cm4gdHlwZVR5cGUzRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHlwZVR5cGU0KCkgewotCQlpZiAodHlwZVR5cGU0RURhdGFUeXBlID09IG51bGwpIHsKLQkJCXR5cGVUeXBlNEVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTAyKTsKLQkJfQotCQlyZXR1cm4gdHlwZVR5cGU0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHlwZVR5cGU1KCkgewotCQlpZiAodHlwZVR5cGU1RURhdGFUeXBlID09IG51bGwpIHsKLQkJCXR5cGVUeXBlNUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTAzKTsKLQkJfQotCQlyZXR1cm4gdHlwZVR5cGU1RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VUlEVHlwZSgpIHsKLQkJaWYgKHVpZFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJdWlkVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTA0KTsKLQkJfQotCQlyZXR1cm4gdWlkVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFVuaXRUeXBlKCkgewotCQlpZiAodW5pdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJdW5pdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDEwNSk7Ci0JCX0KLQkJcmV0dXJuIHVuaXRUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VmFsdWVsaXN0U29ydE9yZGVyVHlwZSgpIHsKLQkJaWYgKHZhbHVlbGlzdFNvcnRPcmRlclR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJdmFsdWVsaXN0U29ydE9yZGVyVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTA5KTsKLQkJfQotCQlyZXR1cm4gdmFsdWVsaXN0U29ydE9yZGVyVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFdlZWtTdGFydERheVR5cGUoKSB7Ci0JCWlmICh3ZWVrU3RhcnREYXlUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXdlZWtTdGFydERheVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExNSk7Ci0JCX0KLQkJcmV0dXJuIHdlZWtTdGFydERheVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRXb3JrQ29udG91clR5cGUoKSB7Ci0JCWlmICh3b3JrQ29udG91clR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJd29ya0NvbnRvdXJUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMTYpOwotCQl9Ci0JCXJldHVybiB3b3JrQ29udG91clR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRXb3JrRm9ybWF0VHlwZSgpIHsKLQkJaWYgKHdvcmtGb3JtYXRUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXdvcmtGb3JtYXRUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMTcpOwotCQl9Ci0JCXJldHVybiB3b3JrRm9ybWF0VHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFdvcmtHcm91cFR5cGUoKSB7Ci0JCWlmICh3b3JrR3JvdXBUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXdvcmtHcm91cFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExOCk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtHcm91cFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1zcHJvamVjdEZhY3RvcnkgZ2V0TXNwcm9qZWN0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIChNc3Byb2plY3RGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNMb2FkZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIExhb2RzIHRoZSBwYWNrYWdlIGFuZCBhbnkgc3ViLXBhY2thZ2VzIGZyb20gdGhlaXIgc2VyaWFsaXplZCBmb3JtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRQYWNrYWdlKCkgewotCQlpZiAoaXNMb2FkZWQpIHJldHVybjsKLQkJaXNMb2FkZWQgPSB0cnVlOwotCi0JCVVSTCB1cmwgPSBnZXRDbGFzcygpLmdldFJlc291cmNlKHBhY2thZ2VGaWxlbmFtZSk7Ci0JCWlmICh1cmwgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk1pc3Npbmcgc2VyaWFsaXplZCBwYWNrYWdlOiAiICsgcGFja2FnZUZpbGVuYW1lKTsKLQkJfQotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBFY29yZVJlc291cmNlRmFjdG9yeUltcGwoKS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHVybC50b1N0cmluZygpKSk7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZS5sb2FkKG51bGwpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCX0KLQkJaW5pdGlhbGl6ZUZyb21Mb2FkZWRFUGFja2FnZSh0aGlzLCAoRVBhY2thZ2UpcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCkpOwotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ZpeGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBGaXhlcyB1cCB0aGUgbG9hZGVkIHBhY2thZ2UsIHRvIG1ha2UgaXQgYXBwZWFyIGFzIGlmIGl0IGhhZCBiZWVuIHByb2dyYW1tYXRpY2FsbHkgYnVpbHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZml4UGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNGaXhlZCkgcmV0dXJuOwotCQlpc0ZpeGVkID0gdHJ1ZTsKLQkJZml4RUNsYXNzaWZpZXJzKCk7Ci0JfQotfSAvL01zcHJvamVjdFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZTJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZTJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyNmQ4ZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvT3V0bGluZUNvZGUySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogT3V0bGluZUNvZGUySW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRsaW5lIENvZGUyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGUySW1wbCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlMkltcGwjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZTJJbXBsI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3V0bGluZUNvZGUySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgT3V0bGluZUNvZGUyIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdUlEID0gVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkSUQoKSA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkSUQoKSA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmllbGRJRCA9IEZJRUxEX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBWQUxVRV9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB2YWx1ZUlEID0gVkFMVUVfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT3V0bGluZUNvZGUySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGxpbmVDb2RlMigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFVJRCgpIHsKLQkJcmV0dXJuIHVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVSUQoQmlnSW50ZWdlciBuZXdVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRVSUQgPSB1SUQ7Ci0JCXVJRCA9IG5ld1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19VSUQsIG9sZFVJRCwgdUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZElEKCkgewotCQlyZXR1cm4gZmllbGRJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWVsZElEKFN0cmluZyBuZXdGaWVsZElEKSB7Ci0JCVN0cmluZyBvbGRGaWVsZElEID0gZmllbGRJRDsKLQkJZmllbGRJRCA9IG5ld0ZpZWxkSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fRklFTERfSUQsIG9sZEZpZWxkSUQsIGZpZWxkSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRWYWx1ZUlEKCkgewotCQlyZXR1cm4gdmFsdWVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZUlEKEJpZ0ludGVnZXIgbmV3VmFsdWVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFZhbHVlSUQgPSB2YWx1ZUlEOwotCQl2YWx1ZUlEID0gbmV3VmFsdWVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19WQUxVRV9JRCwgb2xkVmFsdWVJRCwgdmFsdWVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBnZXRGaWVsZElEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIGdldFZhbHVlSUQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fVUlEOgotCQkJCXNldFVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fVUlEOgotCQkJCXNldFVJRChVSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKEZJRUxEX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRChWQUxVRV9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gRklFTERfSURfRURFRkFVTFQgPT0gbnVsbCA/IGZpZWxkSUQgIT0gbnVsbCA6ICFGSUVMRF9JRF9FREVGQVVMVC5lcXVhbHMoZmllbGRJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIFZBTFVFX0lEX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZUlEICE9IG51bGwgOiAhVkFMVUVfSURfRURFRkFVTFQuZXF1YWxzKHZhbHVlSUQpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1SUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpZWxkSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpZWxkSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlSUQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9PdXRsaW5lQ29kZTJJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZTNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZTNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4ZmRmNWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvT3V0bGluZUNvZGUzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogT3V0bGluZUNvZGUzSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRsaW5lIENvZGUzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGUzSW1wbCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlM0ltcGwjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZTNJbXBsI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3V0bGluZUNvZGUzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgT3V0bGluZUNvZGUzIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdUlEID0gVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkSUQoKSA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkSUQoKSA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmllbGRJRCA9IEZJRUxEX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBWQUxVRV9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB2YWx1ZUlEID0gVkFMVUVfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT3V0bGluZUNvZGUzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGxpbmVDb2RlMygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFVJRCgpIHsKLQkJcmV0dXJuIHVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVSUQoQmlnSW50ZWdlciBuZXdVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRVSUQgPSB1SUQ7Ci0JCXVJRCA9IG5ld1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19VSUQsIG9sZFVJRCwgdUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZElEKCkgewotCQlyZXR1cm4gZmllbGRJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWVsZElEKFN0cmluZyBuZXdGaWVsZElEKSB7Ci0JCVN0cmluZyBvbGRGaWVsZElEID0gZmllbGRJRDsKLQkJZmllbGRJRCA9IG5ld0ZpZWxkSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fRklFTERfSUQsIG9sZEZpZWxkSUQsIGZpZWxkSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRWYWx1ZUlEKCkgewotCQlyZXR1cm4gdmFsdWVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZUlEKEJpZ0ludGVnZXIgbmV3VmFsdWVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFZhbHVlSUQgPSB2YWx1ZUlEOwotCQl2YWx1ZUlEID0gbmV3VmFsdWVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19WQUxVRV9JRCwgb2xkVmFsdWVJRCwgdmFsdWVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBnZXRGaWVsZElEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIGdldFZhbHVlSUQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fVUlEOgotCQkJCXNldFVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fVUlEOgotCQkJCXNldFVJRChVSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKEZJRUxEX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRChWQUxVRV9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gRklFTERfSURfRURFRkFVTFQgPT0gbnVsbCA/IGZpZWxkSUQgIT0gbnVsbCA6ICFGSUVMRF9JRF9FREVGQVVMVC5lcXVhbHMoZmllbGRJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIFZBTFVFX0lEX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZUlEICE9IG51bGwgOiAhVkFMVUVfSURfRURFRkFVTFQuZXF1YWxzKHZhbHVlSUQpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1SUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpZWxkSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpZWxkSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlSUQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9PdXRsaW5lQ29kZTNJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDk4YmJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogT3V0bGluZUNvZGVJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGxpbmUgQ29kZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNnZXRGaWVsZE5hbWUgPGVtPkZpZWxkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZUltcGwjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2dldFBob25ldGljQWxpYXMgPGVtPlBob25ldGljIEFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2dldFZhbHVlcyA8ZW0+VmFsdWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2lzRW50ZXJwcmlzZSA8ZW0+RW50ZXJwcmlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyA8ZW0+RW50ZXJwcmlzZSBPdXRsaW5lIENvZGUgQWxpYXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZUltcGwjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2lzTGVhZk9ubHkgPGVtPkxlYWYgT25seTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNpc0FsbExldmVsc1JlcXVpcmVkIDxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCA8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNnZXRNYXNrcyA8ZW0+TWFza3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRsaW5lQ29kZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE91dGxpbmVDb2RlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWVsZElEID0gRklFTERfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGROYW1lKCkgPGVtPkZpZWxkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZE5hbWUoKSA8ZW0+RmllbGQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkTmFtZSA9IEZJRUxEX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWxpYXMoKSA8ZW0+QWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTElBU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbGlhcygpIDxlbT5BbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWxpYXMgPSBBTElBU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaG9uZXRpY0FsaWFzKCkgPGVtPlBob25ldGljIEFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9ORVRJQ19BTElBU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaG9uZXRpY0FsaWFzKCkgPGVtPlBob25ldGljIEFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBob25ldGljQWxpYXMgPSBQSE9ORVRJQ19BTElBU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlcygpIDxlbT5WYWx1ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhbHVlcyB2YWx1ZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRW50ZXJwcmlzZSgpIDxlbT5FbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VudGVycHJpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFTlRFUlBSSVNFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VudGVycHJpc2UoKSA8ZW0+RW50ZXJwcmlzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFbnRlcnByaXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbnRlcnByaXNlID0gRU5URVJQUklTRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRW50ZXJwcmlzZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW50ZXJwcmlzZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpIDxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBFTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpIDxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzID0gRU5URVJQUklTRV9PVVRMSU5FX0NPREVfQUxJQVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKSA8ZW0+UmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkgPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkID0gUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMZWFmT25seSgpIDxlbT5MZWFmIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGVhZk9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBMRUFGX09OTFlfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTGVhZk9ubHkoKSA8ZW0+TGVhZiBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0xlYWZPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsZWFmT25seSA9IExFQUZfT05MWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTGVhZiBPbmx5IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsZWFmT25seUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0FsbExldmVsc1JlcXVpcmVkKCkgPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBBTExfTEVWRUxTX1JFUVVJUkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0FsbExldmVsc1JlcXVpcmVkKCkgPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFsbExldmVsc1JlcXVpcmVkID0gQUxMX0xFVkVMU19SRVFVSVJFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQWxsIExldmVscyBSZXF1aXJlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWxsTGV2ZWxzUmVxdWlyZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkgPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE9OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpIDxlbT5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG9ubHlUYWJsZVZhbHVlc0FsbG93ZWQgPSBPTkxZX1RBQkxFX1ZBTFVFU19BTExPV0VEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBPbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFza3MoKSA8ZW0+TWFza3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWFza3MgbWFza3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE91dGxpbmVDb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGxpbmVDb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZElEKCkgewotCQlyZXR1cm4gZmllbGRJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWVsZElEKFN0cmluZyBuZXdGaWVsZElEKSB7Ci0JCVN0cmluZyBvbGRGaWVsZElEID0gZmllbGRJRDsKLQkJZmllbGRJRCA9IG5ld0ZpZWxkSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19GSUVMRF9JRCwgb2xkRmllbGRJRCwgZmllbGRJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkgewotCQlyZXR1cm4gZmllbGROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkTmFtZShTdHJpbmcgbmV3RmllbGROYW1lKSB7Ci0JCVN0cmluZyBvbGRGaWVsZE5hbWUgPSBmaWVsZE5hbWU7Ci0JCWZpZWxkTmFtZSA9IG5ld0ZpZWxkTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX05BTUUsIG9sZEZpZWxkTmFtZSwgZmllbGROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbGlhcygpIHsKLQkJcmV0dXJuIGFsaWFzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsaWFzKFN0cmluZyBuZXdBbGlhcykgewotCQlTdHJpbmcgb2xkQWxpYXMgPSBhbGlhczsKLQkJYWxpYXMgPSBuZXdBbGlhczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0FMSUFTLCBvbGRBbGlhcywgYWxpYXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBob25ldGljQWxpYXMoKSB7Ci0JCXJldHVybiBwaG9uZXRpY0FsaWFzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBob25ldGljQWxpYXMoU3RyaW5nIG5ld1Bob25ldGljQWxpYXMpIHsKLQkJU3RyaW5nIG9sZFBob25ldGljQWxpYXMgPSBwaG9uZXRpY0FsaWFzOwotCQlwaG9uZXRpY0FsaWFzID0gbmV3UGhvbmV0aWNBbGlhczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1BIT05FVElDX0FMSUFTLCBvbGRQaG9uZXRpY0FsaWFzLCBwaG9uZXRpY0FsaWFzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhbHVlcyBnZXRWYWx1ZXMoKSB7Ci0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VmFsdWVzKFZhbHVlcyBuZXdWYWx1ZXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJVmFsdWVzIG9sZFZhbHVlcyA9IHZhbHVlczsKLQkJdmFsdWVzID0gbmV3VmFsdWVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTLCBvbGRWYWx1ZXMsIG5ld1ZhbHVlcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVzKFZhbHVlcyBuZXdWYWx1ZXMpIHsKLQkJaWYgKG5ld1ZhbHVlcyAhPSB2YWx1ZXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHZhbHVlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl2YWx1ZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdWYWx1ZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VmFsdWVzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1ZBTFVFUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRWYWx1ZXMobmV3VmFsdWVzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19WQUxVRVMsIG5ld1ZhbHVlcywgbmV3VmFsdWVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbnRlcnByaXNlKCkgewotCQlyZXR1cm4gZW50ZXJwcmlzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbnRlcnByaXNlKGJvb2xlYW4gbmV3RW50ZXJwcmlzZSkgewotCQlib29sZWFuIG9sZEVudGVycHJpc2UgPSBlbnRlcnByaXNlOwotCQllbnRlcnByaXNlID0gbmV3RW50ZXJwcmlzZTsKLQkJYm9vbGVhbiBvbGRFbnRlcnByaXNlRVNldCA9IGVudGVycHJpc2VFU2V0OwotCQllbnRlcnByaXNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19FTlRFUlBSSVNFLCBvbGRFbnRlcnByaXNlLCBlbnRlcnByaXNlLCAhb2xkRW50ZXJwcmlzZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEVudGVycHJpc2UoKSB7Ci0JCWJvb2xlYW4gb2xkRW50ZXJwcmlzZSA9IGVudGVycHJpc2U7Ci0JCWJvb2xlYW4gb2xkRW50ZXJwcmlzZUVTZXQgPSBlbnRlcnByaXNlRVNldDsKLQkJZW50ZXJwcmlzZSA9IEVOVEVSUFJJU0VfRURFRkFVTFQ7Ci0JCWVudGVycHJpc2VFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0UsIG9sZEVudGVycHJpc2UsIEVOVEVSUFJJU0VfRURFRkFVTFQsIG9sZEVudGVycHJpc2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRFbnRlcnByaXNlKCkgewotCQlyZXR1cm4gZW50ZXJwcmlzZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKSB7Ci0JCXJldHVybiBlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyhCaWdJbnRlZ2VyIG5ld0VudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMgPSBlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhczsKLQkJZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMgPSBuZXdFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0VfT1VUTElORV9DT0RFX0FMSUFTLCBvbGRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcywgZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpIHsKLQkJcmV0dXJuIHJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoYm9vbGVhbiBuZXdSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQpIHsKLQkJYm9vbGVhbiBvbGRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPSByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQ7Ci0JCXJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCA9IG5ld1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZDsKLQkJYm9vbGVhbiBvbGRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0ID0gcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkRVNldDsKLQkJcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19SRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRCwgb2xkUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkLCByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQsICFvbGRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKSB7Ci0JCWJvb2xlYW4gb2xkUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkID0gcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkOwotCQlib29sZWFuIG9sZFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZEVTZXQgPSByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0OwotCQlyZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPSBSRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRF9FREVGQVVMVDsKLQkJcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19SRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRCwgb2xkUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkLCBSRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRF9FREVGQVVMVCwgb2xkUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkgewotCQlyZXR1cm4gcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xlYWZPbmx5KCkgewotCQlyZXR1cm4gbGVhZk9ubHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVhZk9ubHkoYm9vbGVhbiBuZXdMZWFmT25seSkgewotCQlib29sZWFuIG9sZExlYWZPbmx5ID0gbGVhZk9ubHk7Ci0JCWxlYWZPbmx5ID0gbmV3TGVhZk9ubHk7Ci0JCWJvb2xlYW4gb2xkTGVhZk9ubHlFU2V0ID0gbGVhZk9ubHlFU2V0OwotCQlsZWFmT25seUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTEVBRl9PTkxZLCBvbGRMZWFmT25seSwgbGVhZk9ubHksICFvbGRMZWFmT25seUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldExlYWZPbmx5KCkgewotCQlib29sZWFuIG9sZExlYWZPbmx5ID0gbGVhZk9ubHk7Ci0JCWJvb2xlYW4gb2xkTGVhZk9ubHlFU2V0ID0gbGVhZk9ubHlFU2V0OwotCQlsZWFmT25seSA9IExFQUZfT05MWV9FREVGQVVMVDsKLQkJbGVhZk9ubHlFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0xFQUZfT05MWSwgb2xkTGVhZk9ubHksIExFQUZfT05MWV9FREVGQVVMVCwgb2xkTGVhZk9ubHlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRMZWFmT25seSgpIHsKLQkJcmV0dXJuIGxlYWZPbmx5RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FsbExldmVsc1JlcXVpcmVkKCkgewotCQlyZXR1cm4gYWxsTGV2ZWxzUmVxdWlyZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsTGV2ZWxzUmVxdWlyZWQoYm9vbGVhbiBuZXdBbGxMZXZlbHNSZXF1aXJlZCkgewotCQlib29sZWFuIG9sZEFsbExldmVsc1JlcXVpcmVkID0gYWxsTGV2ZWxzUmVxdWlyZWQ7Ci0JCWFsbExldmVsc1JlcXVpcmVkID0gbmV3QWxsTGV2ZWxzUmVxdWlyZWQ7Ci0JCWJvb2xlYW4gb2xkQWxsTGV2ZWxzUmVxdWlyZWRFU2V0ID0gYWxsTGV2ZWxzUmVxdWlyZWRFU2V0OwotCQlhbGxMZXZlbHNSZXF1aXJlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxMX0xFVkVMU19SRVFVSVJFRCwgb2xkQWxsTGV2ZWxzUmVxdWlyZWQsIGFsbExldmVsc1JlcXVpcmVkLCAhb2xkQWxsTGV2ZWxzUmVxdWlyZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBbGxMZXZlbHNSZXF1aXJlZCgpIHsKLQkJYm9vbGVhbiBvbGRBbGxMZXZlbHNSZXF1aXJlZCA9IGFsbExldmVsc1JlcXVpcmVkOwotCQlib29sZWFuIG9sZEFsbExldmVsc1JlcXVpcmVkRVNldCA9IGFsbExldmVsc1JlcXVpcmVkRVNldDsKLQkJYWxsTGV2ZWxzUmVxdWlyZWQgPSBBTExfTEVWRUxTX1JFUVVJUkVEX0VERUZBVUxUOwotCQlhbGxMZXZlbHNSZXF1aXJlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxMX0xFVkVMU19SRVFVSVJFRCwgb2xkQWxsTGV2ZWxzUmVxdWlyZWQsIEFMTF9MRVZFTFNfUkVRVUlSRURfRURFRkFVTFQsIG9sZEFsbExldmVsc1JlcXVpcmVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QWxsTGV2ZWxzUmVxdWlyZWQoKSB7Ci0JCXJldHVybiBhbGxMZXZlbHNSZXF1aXJlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkgewotCQlyZXR1cm4gb25seVRhYmxlVmFsdWVzQWxsb3dlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKGJvb2xlYW4gbmV3T25seVRhYmxlVmFsdWVzQWxsb3dlZCkgewotCQlib29sZWFuIG9sZE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQgPSBvbmx5VGFibGVWYWx1ZXNBbGxvd2VkOwotCQlvbmx5VGFibGVWYWx1ZXNBbGxvd2VkID0gbmV3T25seVRhYmxlVmFsdWVzQWxsb3dlZDsKLQkJYm9vbGVhbiBvbGRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldCA9IG9ubHlUYWJsZVZhbHVlc0FsbG93ZWRFU2V0OwotCQlvbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19PTkxZX1RBQkxFX1ZBTFVFU19BTExPV0VELCBvbGRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkLCBvbmx5VGFibGVWYWx1ZXNBbGxvd2VkLCAhb2xkT25seVRhYmxlVmFsdWVzQWxsb3dlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKSB7Ci0JCWJvb2xlYW4gb2xkT25seVRhYmxlVmFsdWVzQWxsb3dlZCA9IG9ubHlUYWJsZVZhbHVlc0FsbG93ZWQ7Ci0JCWJvb2xlYW4gb2xkT25seVRhYmxlVmFsdWVzQWxsb3dlZEVTZXQgPSBvbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldDsKLQkJb25seVRhYmxlVmFsdWVzQWxsb3dlZCA9IE9OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRURfRURFRkFVTFQ7Ci0JCW9ubHlUYWJsZVZhbHVlc0FsbG93ZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX09OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRUQsIG9sZE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQsIE9OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRURfRURFRkFVTFQsIG9sZE9ubHlUYWJsZVZhbHVlc0FsbG93ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkgewotCQlyZXR1cm4gb25seVRhYmxlVmFsdWVzQWxsb3dlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1hc2tzIGdldE1hc2tzKCkgewotCQlyZXR1cm4gbWFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TWFza3MoTWFza3MgbmV3TWFza3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJTWFza3Mgb2xkTWFza3MgPSBtYXNrczsKLQkJbWFza3MgPSBuZXdNYXNrczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX01BU0tTLCBvbGRNYXNrcywgbmV3TWFza3MpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hc2tzKE1hc2tzIG5ld01hc2tzKSB7Ci0JCWlmIChuZXdNYXNrcyAhPSBtYXNrcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAobWFza3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbWFza3MpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTUFTS1MsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld01hc2tzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld01hc2tzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX01BU0tTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE1hc2tzKG5ld01hc2tzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19NQVNLUywgbmV3TWFza3MsIG5ld01hc2tzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRWYWx1ZXMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTUFTS1M6Ci0JCQkJCXJldHVybiBiYXNpY1NldE1hc2tzKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIGdldEZpZWxkSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX05BTUU6Ci0JCQkJcmV0dXJuIGdldEZpZWxkTmFtZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxJQVM6Ci0JCQkJcmV0dXJuIGdldEFsaWFzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19QSE9ORVRJQ19BTElBUzoKLQkJCQlyZXR1cm4gZ2V0UGhvbmV0aWNBbGlhcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTOgotCQkJCXJldHVybiBnZXRWYWx1ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0U6Ci0JCQkJcmV0dXJuIGlzRW50ZXJwcmlzZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0VfT1VUTElORV9DT0RFX0FMSUFTOgotCQkJCXJldHVybiBnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRUQ6Ci0JCQkJcmV0dXJuIGlzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTEVBRl9PTkxZOgotCQkJCXJldHVybiBpc0xlYWZPbmx5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxMX0xFVkVMU19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNBbGxMZXZlbHNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX09OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRUQ6Ci0JCQkJcmV0dXJuIGlzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX01BU0tTOgotCQkJCXJldHVybiBnZXRNYXNrcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRklFTERfTkFNRToKLQkJCQlzZXRGaWVsZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxJQVM6Ci0JCQkJc2V0QWxpYXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUEhPTkVUSUNfQUxJQVM6Ci0JCQkJc2V0UGhvbmV0aWNBbGlhcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19WQUxVRVM6Ci0JCQkJc2V0VmFsdWVzKChWYWx1ZXMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0U6Ci0JCQkJc2V0RW50ZXJwcmlzZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19FTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBUzoKLQkJCQlzZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRUQ6Ci0JCQkJc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0xFQUZfT05MWToKLQkJCQlzZXRMZWFmT25seSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTExfTEVWRUxTX1JFUVVJUkVEOgotCQkJCXNldEFsbExldmVsc1JlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX09OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRUQ6Ci0JCQkJc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19NQVNLUzoKLQkJCQlzZXRNYXNrcygoTWFza3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKEZJRUxEX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19GSUVMRF9OQU1FOgotCQkJCXNldEZpZWxkTmFtZShGSUVMRF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTElBUzoKLQkJCQlzZXRBbGlhcyhBTElBU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUEhPTkVUSUNfQUxJQVM6Ci0JCQkJc2V0UGhvbmV0aWNBbGlhcyhQSE9ORVRJQ19BTElBU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTOgotCQkJCXNldFZhbHVlcygoVmFsdWVzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0U6Ci0JCQkJdW5zZXRFbnRlcnByaXNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRU5URVJQUklTRV9PVVRMSU5FX0NPREVfQUxJQVM6Ci0JCQkJc2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoRU5URVJQUklTRV9PVVRMSU5FX0NPREVfQUxJQVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1JFU09VUkNFX1NVQlNUSVRVVElPTl9FTkFCTEVEOgotCQkJCXVuc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTEVBRl9PTkxZOgotCQkJCXVuc2V0TGVhZk9ubHkoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTExfTEVWRUxTX1JFUVVJUkVEOgotCQkJCXVuc2V0QWxsTGV2ZWxzUmVxdWlyZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19PTkxZX1RBQkxFX1ZBTFVFU19BTExPV0VEOgotCQkJCXVuc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX01BU0tTOgotCQkJCXNldE1hc2tzKChNYXNrcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBGSUVMRF9JRF9FREVGQVVMVCA9PSBudWxsID8gZmllbGRJRCAhPSBudWxsIDogIUZJRUxEX0lEX0VERUZBVUxULmVxdWFscyhmaWVsZElEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX05BTUU6Ci0JCQkJcmV0dXJuIEZJRUxEX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGZpZWxkTmFtZSAhPSBudWxsIDogIUZJRUxEX05BTUVfRURFRkFVTFQuZXF1YWxzKGZpZWxkTmFtZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTElBUzoKLQkJCQlyZXR1cm4gQUxJQVNfRURFRkFVTFQgPT0gbnVsbCA/IGFsaWFzICE9IG51bGwgOiAhQUxJQVNfRURFRkFVTFQuZXF1YWxzKGFsaWFzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1BIT05FVElDX0FMSUFTOgotCQkJCXJldHVybiBQSE9ORVRJQ19BTElBU19FREVGQVVMVCA9PSBudWxsID8gcGhvbmV0aWNBbGlhcyAhPSBudWxsIDogIVBIT05FVElDX0FMSUFTX0VERUZBVUxULmVxdWFscyhwaG9uZXRpY0FsaWFzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1ZBTFVFUzoKLQkJCQlyZXR1cm4gdmFsdWVzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19FTlRFUlBSSVNFOgotCQkJCXJldHVybiBpc1NldEVudGVycHJpc2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0VfT1VUTElORV9DT0RFX0FMSUFTOgotCQkJCXJldHVybiBFTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBU19FREVGQVVMVCA9PSBudWxsID8gZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMgIT0gbnVsbCA6ICFFTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBU19FREVGQVVMVC5lcXVhbHMoZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19MRUFGX09OTFk6Ci0JCQkJcmV0dXJuIGlzU2V0TGVhZk9ubHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0FMTF9MRVZFTFNfUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0QWxsTGV2ZWxzUmVxdWlyZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX09OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTUFTS1M6Ci0JCQkJcmV0dXJuIG1hc2tzICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmaWVsZElEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaWVsZElEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaWVsZE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWxpYXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFsaWFzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwaG9uZXRpY0FsaWFzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwaG9uZXRpY0FsaWFzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbnRlcnByaXNlOiAiKTsKLQkJaWYgKGVudGVycHJpc2VFU2V0KSByZXN1bHQuYXBwZW5kKGVudGVycHJpc2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZDogIik7Ci0JCWlmIChyZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0KSByZXN1bHQuYXBwZW5kKHJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxlYWZPbmx5OiAiKTsKLQkJaWYgKGxlYWZPbmx5RVNldCkgcmVzdWx0LmFwcGVuZChsZWFmT25seSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFsbExldmVsc1JlcXVpcmVkOiAiKTsKLQkJaWYgKGFsbExldmVsc1JlcXVpcmVkRVNldCkgcmVzdWx0LmFwcGVuZChhbGxMZXZlbHNSZXF1aXJlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG9ubHlUYWJsZVZhbHVlc0FsbG93ZWQ6ICIpOwotCQlpZiAob25seVRhYmxlVmFsdWVzQWxsb3dlZEVTZXQpIHJlc3VsdC5hcHBlbmQob25seVRhYmxlVmFsdWVzQWxsb3dlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9PdXRsaW5lQ29kZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2Rlc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2Rlc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjU3YTY1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZXNJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGxpbmUgQ29kZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZXNJbXBsI2dldE91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRsaW5lQ29kZXNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBPdXRsaW5lQ29kZXMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVDb2RlKCkgPGVtPk91dGxpbmUgQ29kZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG91dGxpbmVDb2RlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPdXRsaW5lQ29kZXNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0bGluZUNvZGVzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE91dGxpbmVDb2RlKCkgewotCQlpZiAob3V0bGluZUNvZGUgPT0gbnVsbCkgewotCQkJb3V0bGluZUNvZGUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoT3V0bGluZUNvZGUuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFU19fT1VUTElORV9DT0RFKTsKLQkJfQotCQlyZXR1cm4gb3V0bGluZUNvZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERVNfX09VVExJTkVfQ09ERToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRPdXRsaW5lQ29kZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFU19fT1VUTElORV9DT0RFOgotCQkJCXJldHVybiBnZXRPdXRsaW5lQ29kZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVTX19PVVRMSU5FX0NPREU6Ci0JCQkJZ2V0T3V0bGluZUNvZGUoKS5jbGVhcigpOwotCQkJCWdldE91dGxpbmVDb2RlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERVNfX09VVExJTkVfQ09ERToKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFU19fT1VUTElORV9DT0RFOgotCQkJCXJldHVybiBvdXRsaW5lQ29kZSAhPSBudWxsICYmICFvdXRsaW5lQ29kZS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL091dGxpbmVDb2Rlc0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ByZWRlY2Vzc29yTGlua0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ByZWRlY2Vzc29yTGlua0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2IyNzM0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9QcmVkZWNlc3NvckxpbmtJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcmVkZWNlc3NvckxpbmtJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluazsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByZWRlY2Vzc29yIExpbms8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5QcmVkZWNlc3NvckxpbmtJbXBsI2dldFByZWRlY2Vzc29yVUlEIDxlbT5QcmVkZWNlc3NvciBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5QcmVkZWNlc3NvckxpbmtJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5QcmVkZWNlc3NvckxpbmtJbXBsI2lzQ3Jvc3NQcm9qZWN0IDxlbT5Dcm9zcyBQcm9qZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJlZGVjZXNzb3JMaW5rSW1wbCNnZXRDcm9zc1Byb2plY3ROYW1lIDxlbT5Dcm9zcyBQcm9qZWN0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5QcmVkZWNlc3NvckxpbmtJbXBsI2dldExpbmtMYWcgPGVtPkxpbmsgTGFnPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJlZGVjZXNzb3JMaW5rSW1wbCNnZXRMYWdGb3JtYXQgPGVtPkxhZyBGb3JtYXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVkZWNlc3NvckxpbmtJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBQcmVkZWNlc3NvckxpbmsgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVkZWNlc3NvclVJRCgpIDxlbT5QcmVkZWNlc3NvciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWRlY2Vzc29yVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUFJFREVDRVNTT1JfVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWRlY2Vzc29yVUlEKCkgPGVtPlByZWRlY2Vzc29yIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHByZWRlY2Vzc29yVUlEID0gUFJFREVDRVNTT1JfVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nyb3NzUHJvamVjdCgpIDxlbT5Dcm9zcyBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Nyb3NzUHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENST1NTX1BST0pFQ1RfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ3Jvc3NQcm9qZWN0KCkgPGVtPkNyb3NzIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ3Jvc3NQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjcm9zc1Byb2plY3QgPSBDUk9TU19QUk9KRUNUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDcm9zcyBQcm9qZWN0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjcm9zc1Byb2plY3RFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSgpIDxlbT5Dcm9zcyBQcm9qZWN0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyb3NzUHJvamVjdE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENST1NTX1BST0pFQ1RfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcm9zc1Byb2plY3ROYW1lKCkgPGVtPkNyb3NzIFByb2plY3QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjcm9zc1Byb2plY3ROYW1lID0gQ1JPU1NfUFJPSkVDVF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtMYWcoKSA8ZW0+TGluayBMYWc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmtMYWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBMSU5LX0xBR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5rTGFnKCkgPGVtPkxpbmsgTGFnPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaW5rTGFnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsaW5rTGFnID0gTElOS19MQUdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFnRm9ybWF0KCkgPGVtPkxhZyBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhZ0Zvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIExBR19GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFnRm9ybWF0KCkgPGVtPkxhZyBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhZ0Zvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgbGFnRm9ybWF0ID0gTEFHX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcmVkZWNlc3NvckxpbmtJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJlZGVjZXNzb3JMaW5rKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UHJlZGVjZXNzb3JVSUQoKSB7Ci0JCXJldHVybiBwcmVkZWNlc3NvclVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVkZWNlc3NvclVJRChCaWdJbnRlZ2VyIG5ld1ByZWRlY2Vzc29yVUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkUHJlZGVjZXNzb3JVSUQgPSBwcmVkZWNlc3NvclVJRDsKLQkJcHJlZGVjZXNzb3JVSUQgPSBuZXdQcmVkZWNlc3NvclVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19QUkVERUNFU1NPUl9VSUQsIG9sZFByZWRlY2Vzc29yVUlELCBwcmVkZWNlc3NvclVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoQmlnSW50ZWdlciBuZXdUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nyb3NzUHJvamVjdCgpIHsKLQkJcmV0dXJuIGNyb3NzUHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDcm9zc1Byb2plY3QoYm9vbGVhbiBuZXdDcm9zc1Byb2plY3QpIHsKLQkJYm9vbGVhbiBvbGRDcm9zc1Byb2plY3QgPSBjcm9zc1Byb2plY3Q7Ci0JCWNyb3NzUHJvamVjdCA9IG5ld0Nyb3NzUHJvamVjdDsKLQkJYm9vbGVhbiBvbGRDcm9zc1Byb2plY3RFU2V0ID0gY3Jvc3NQcm9qZWN0RVNldDsKLQkJY3Jvc3NQcm9qZWN0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fQ1JPU1NfUFJPSkVDVCwgb2xkQ3Jvc3NQcm9qZWN0LCBjcm9zc1Byb2plY3QsICFvbGRDcm9zc1Byb2plY3RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDcm9zc1Byb2plY3QoKSB7Ci0JCWJvb2xlYW4gb2xkQ3Jvc3NQcm9qZWN0ID0gY3Jvc3NQcm9qZWN0OwotCQlib29sZWFuIG9sZENyb3NzUHJvamVjdEVTZXQgPSBjcm9zc1Byb2plY3RFU2V0OwotCQljcm9zc1Byb2plY3QgPSBDUk9TU19QUk9KRUNUX0VERUZBVUxUOwotCQljcm9zc1Byb2plY3RFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNULCBvbGRDcm9zc1Byb2plY3QsIENST1NTX1BST0pFQ1RfRURFRkFVTFQsIG9sZENyb3NzUHJvamVjdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldENyb3NzUHJvamVjdCgpIHsKLQkJcmV0dXJuIGNyb3NzUHJvamVjdEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcm9zc1Byb2plY3ROYW1lKCkgewotCQlyZXR1cm4gY3Jvc3NQcm9qZWN0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDcm9zc1Byb2plY3ROYW1lKFN0cmluZyBuZXdDcm9zc1Byb2plY3ROYW1lKSB7Ci0JCVN0cmluZyBvbGRDcm9zc1Byb2plY3ROYW1lID0gY3Jvc3NQcm9qZWN0TmFtZTsKLQkJY3Jvc3NQcm9qZWN0TmFtZSA9IG5ld0Nyb3NzUHJvamVjdE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fQ1JPU1NfUFJPSkVDVF9OQU1FLCBvbGRDcm9zc1Byb2plY3ROYW1lLCBjcm9zc1Byb2plY3ROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TGlua0xhZygpIHsKLQkJcmV0dXJuIGxpbmtMYWc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlua0xhZyhCaWdJbnRlZ2VyIG5ld0xpbmtMYWcpIHsKLQkJQmlnSW50ZWdlciBvbGRMaW5rTGFnID0gbGlua0xhZzsKLQkJbGlua0xhZyA9IG5ld0xpbmtMYWc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fTElOS19MQUcsIG9sZExpbmtMYWcsIGxpbmtMYWcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRMYWdGb3JtYXQoKSB7Ci0JCXJldHVybiBsYWdGb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFnRm9ybWF0KEJpZ0ludGVnZXIgbmV3TGFnRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkTGFnRm9ybWF0ID0gbGFnRm9ybWF0OwotCQlsYWdGb3JtYXQgPSBuZXdMYWdGb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fTEFHX0ZPUk1BVCwgb2xkTGFnRm9ybWF0LCBsYWdGb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fUFJFREVDRVNTT1JfVUlEOgotCQkJCXJldHVybiBnZXRQcmVkZWNlc3NvclVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNUOgotCQkJCXJldHVybiBpc0Nyb3NzUHJvamVjdCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNUX05BTUU6Ci0JCQkJcmV0dXJuIGdldENyb3NzUHJvamVjdE5hbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19MSU5LX0xBRzoKLQkJCQlyZXR1cm4gZ2V0TGlua0xhZygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0xBR19GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldExhZ0Zvcm1hdCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19QUkVERUNFU1NPUl9VSUQ6Ci0JCQkJc2V0UHJlZGVjZXNzb3JVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19UWVBFOgotCQkJCXNldFR5cGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNUOgotCQkJCXNldENyb3NzUHJvamVjdCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fQ1JPU1NfUFJPSkVDVF9OQU1FOgotCQkJCXNldENyb3NzUHJvamVjdE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0xJTktfTEFHOgotCQkJCXNldExpbmtMYWcoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19MQUdfRk9STUFUOgotCQkJCXNldExhZ0Zvcm1hdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19QUkVERUNFU1NPUl9VSUQ6Ci0JCQkJc2V0UHJlZGVjZXNzb3JVSUQoUFJFREVDRVNTT1JfVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNUOgotCQkJCXVuc2V0Q3Jvc3NQcm9qZWN0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1RfTkFNRToKLQkJCQlzZXRDcm9zc1Byb2plY3ROYW1lKENST1NTX1BST0pFQ1RfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0xJTktfTEFHOgotCQkJCXNldExpbmtMYWcoTElOS19MQUdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19MQUdfRk9STUFUOgotCQkJCXNldExhZ0Zvcm1hdChMQUdfRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19QUkVERUNFU1NPUl9VSUQ6Ci0JCQkJcmV0dXJuIFBSRURFQ0VTU09SX1VJRF9FREVGQVVMVCA9PSBudWxsID8gcHJlZGVjZXNzb3JVSUQgIT0gbnVsbCA6ICFQUkVERUNFU1NPUl9VSURfRURFRkFVTFQuZXF1YWxzKHByZWRlY2Vzc29yVUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19UWVBFOgotCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fQ1JPU1NfUFJPSkVDVDoKLQkJCQlyZXR1cm4gaXNTZXRDcm9zc1Byb2plY3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNUX05BTUU6Ci0JCQkJcmV0dXJuIENST1NTX1BST0pFQ1RfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gY3Jvc3NQcm9qZWN0TmFtZSAhPSBudWxsIDogIUNST1NTX1BST0pFQ1RfTkFNRV9FREVGQVVMVC5lcXVhbHMoY3Jvc3NQcm9qZWN0TmFtZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fTElOS19MQUc6Ci0JCQkJcmV0dXJuIExJTktfTEFHX0VERUZBVUxUID09IG51bGwgPyBsaW5rTGFnICE9IG51bGwgOiAhTElOS19MQUdfRURFRkFVTFQuZXF1YWxzKGxpbmtMYWcpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0xBR19GT1JNQVQ6Ci0JCQkJcmV0dXJuIExBR19GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGxhZ0Zvcm1hdCAhPSBudWxsIDogIUxBR19GT1JNQVRfRURFRkFVTFQuZXF1YWxzKGxhZ0Zvcm1hdCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwcmVkZWNlc3NvclVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlZGVjZXNzb3JVSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNyb3NzUHJvamVjdDogIik7Ci0JCWlmIChjcm9zc1Byb2plY3RFU2V0KSByZXN1bHQuYXBwZW5kKGNyb3NzUHJvamVjdCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNyb3NzUHJvamVjdE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNyb3NzUHJvamVjdE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxpbmtMYWc6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxpbmtMYWcpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhZ0Zvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGFnRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJlZGVjZXNzb3JMaW5rSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUHJvamVjdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Byb2plY3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlM2Q4M2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUHJvamVjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NzEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9qZWN0SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3M7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9qZWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0VGl0bGUgPGVtPlRpdGxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0U3ViamVjdCA8ZW0+U3ViamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldENhdGVnb3J5IDxlbT5DYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldENvbXBhbnkgPGVtPkNvbXBhbnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRNYW5hZ2VyIDxlbT5NYW5hZ2VyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0QXV0aG9yIDxlbT5BdXRob3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRDcmVhdGlvbkRhdGUgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRSZXZpc2lvbiA8ZW0+UmV2aXNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRMYXN0U2F2ZWQgPGVtPkxhc3QgU2F2ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc1NjaGVkdWxlRnJvbVN0YXJ0IDxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0U3RhcnREYXRlIDxlbT5TdGFydCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0RmluaXNoRGF0ZSA8ZW0+RmluaXNoIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRGWVN0YXJ0RGF0ZSA8ZW0+RlkgU3RhcnQgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldENyaXRpY2FsU2xhY2tMaW1pdCA8ZW0+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRDdXJyZW5jeURpZ2l0cyA8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0Q3VycmVuY3lTeW1ib2wgPGVtPkN1cnJlbmN5IFN5bWJvbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24gPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldENhbGVuZGFyVUlEIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREZWZhdWx0U3RhcnRUaW1lIDxlbT5EZWZhdWx0IFN0YXJ0IFRpbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREZWZhdWx0RmluaXNoVGltZSA8ZW0+RGVmYXVsdCBGaW5pc2ggVGltZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldE1pbnV0ZXNQZXJEYXkgPGVtPk1pbnV0ZXMgUGVyIERheTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldE1pbnV0ZXNQZXJXZWVrIDxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0RGF5c1Blck1vbnRoIDxlbT5EYXlzIFBlciBNb250aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldERlZmF1bHRUYXNrVHlwZSA8ZW0+RGVmYXVsdCBUYXNrIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCA8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREZWZhdWx0U3RhbmRhcmRSYXRlIDxlbT5EZWZhdWx0IFN0YW5kYXJkIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlIDxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0V29ya0Zvcm1hdCA8ZW0+V29yayBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc0VkaXRhYmxlQWN0dWFsQ29zdHMgPGVtPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzSG9ub3JDb25zdHJhaW50cyA8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRFYXJuZWRWYWx1ZU1ldGhvZCA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5IDxlbT5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc011bHRpcGxlQ3JpdGljYWxQYXRocyA8ZW0+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuIDxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzTmV3VGFza3NFc3RpbWF0ZWQgPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcyA8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNTcHJlYWRBY3R1YWxDb3N0IDxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSA8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc1Rhc2tVcGRhdGVzUmVzb3VyY2UgPGVtPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzRmlzY2FsWWVhclN0YXJ0IDxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldFdlZWtTdGFydERheSA8ZW0+V2VlayBTdGFydCBEYXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc01vdmVDb21wbGV0ZWRFbmRzQmFjayA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayA8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlIDxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0U3RhdHVzRGF0ZSA8ZW0+U3RhdHVzIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRDdXJyZW50RGF0ZSA8ZW0+Q3VycmVudCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIDxlbT5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNBdXRvbGluayA8ZW0+QXV0b2xpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXROZXdUYXNrU3RhcnREYXRlIDxlbT5OZXcgVGFzayBTdGFydCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCA8ZW0+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSA8ZW0+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzQWN0dWFsc0luU3luYyA8ZW0+QWN0dWFscyBJbiBTeW5jPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNSZW1vdmVGaWxlUHJvcGVydGllcyA8ZW0+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzQWRtaW5Qcm9qZWN0IDxlbT5BZG1pbiBQcm9qZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0T3V0bGluZUNvZGVzIDxlbT5PdXRsaW5lIENvZGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0V0JTTWFza3MgPGVtPldCUyBNYXNrczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlcyA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldENhbGVuZGFycyA8ZW0+Q2FsZW5kYXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0VGFza3MgPGVtPlRhc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0UmVzb3VyY2VzIDxlbT5SZXNvdXJjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRBc3NpZ25tZW50cyA8ZW0+QXNzaWdubWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUHJvamVjdCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUaXRsZSgpIDxlbT5UaXRsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGl0bGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpdGxlKCkgPGVtPlRpdGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaXRsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZSA9IFRJVExFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YmplY3QoKSA8ZW0+U3ViamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCSkVDVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJqZWN0KCkgPGVtPlN1YmplY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc3ViamVjdCA9IFNVQkpFQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0ZWdvcnkoKSA8ZW0+Q2F0ZWdvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXRlZ29yeSgpIDxlbT5DYXRlZ29yeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2F0ZWdvcnkgPSBDQVRFR09SWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21wYW55KCkgPGVtPkNvbXBhbnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbXBhbnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBTllfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tcGFueSgpIDxlbT5Db21wYW55PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb21wYW55KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXBhbnkgPSBDT01QQU5ZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hbmFnZXIoKSA8ZW0+TWFuYWdlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFuYWdlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOQUdFUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYW5hZ2VyKCkgPGVtPk1hbmFnZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hbmFnZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFuYWdlciA9IE1BTkFHRVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9yKCkgPGVtPkF1dGhvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9yKCkgPGVtPkF1dGhvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF1dGhvciA9IEFVVEhPUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcmVhdGlvbkRhdGUoKSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JlYXRpb25EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBDUkVBVElPTl9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWF0aW9uRGF0ZSgpIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRpb25EYXRlID0gQ1JFQVRJT05fREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXZpc2lvbigpIDxlbT5SZXZpc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmV2aXNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBSRVZJU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXZpc2lvbigpIDxlbT5SZXZpc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmV2aXNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHJldmlzaW9uID0gUkVWSVNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFzdFNhdmVkKCkgPGVtPkxhc3QgU2F2ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhc3RTYXZlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgTEFTVF9TQVZFRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYXN0U2F2ZWQoKSA8ZW0+TGFzdCBTYXZlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFzdFNhdmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGxhc3RTYXZlZCA9IExBU1RfU0FWRURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTY2hlZHVsZUZyb21TdGFydCgpIDxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0NIRURVTEVfRlJPTV9TVEFSVF9FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkgPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2NoZWR1bGVGcm9tU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNjaGVkdWxlRnJvbVN0YXJ0ID0gU0NIRURVTEVfRlJPTV9TVEFSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU2NoZWR1bGUgRnJvbSBTdGFydCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2NoZWR1bGVGcm9tU3RhcnRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnREYXRlKCkgPGVtPlN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydERhdGUoKSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0RGF0ZSA9IFNUQVJUX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoRGF0ZSgpIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgRklOSVNIX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoRGF0ZSgpIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBmaW5pc2hEYXRlID0gRklOSVNIX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RllTdGFydERhdGUoKSA8ZW0+RlkgU3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RllTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBGWVNUQVJUX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RllTdGFydERhdGUoKSA8ZW0+RlkgU3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RllTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGZZU3RhcnREYXRlID0gRllTVEFSVF9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyaXRpY2FsU2xhY2tMaW1pdCgpIDxlbT5Dcml0aWNhbCBTbGFjayBMaW1pdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JpdGljYWxTbGFja0xpbWl0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQ1JJVElDQUxfU0xBQ0tfTElNSVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JpdGljYWxTbGFja0xpbWl0KCkgPGVtPkNyaXRpY2FsIFNsYWNrIExpbWl0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcml0aWNhbFNsYWNrTGltaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGNyaXRpY2FsU2xhY2tMaW1pdCA9IENSSVRJQ0FMX1NMQUNLX0xJTUlUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1cnJlbmN5RGlnaXRzKCkgPGVtPkN1cnJlbmN5IERpZ2l0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3VycmVuY3lEaWdpdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBDVVJSRU5DWV9ESUdJVFNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVuY3lEaWdpdHMoKSA8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXJyZW5jeURpZ2l0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgY3VycmVuY3lEaWdpdHMgPSBDVVJSRU5DWV9ESUdJVFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVuY3lTeW1ib2woKSA8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXJyZW5jeVN5bWJvbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSUkVOQ1lfU1lNQk9MX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1cnJlbmN5U3ltYm9sKCkgPGVtPkN1cnJlbmN5IFN5bWJvbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3VycmVuY3lTeW1ib2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY3VycmVuY3lTeW1ib2wgPSBDVVJSRU5DWV9TWU1CT0xfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigpIDxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigpIDxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGN1cnJlbmN5U3ltYm9sUG9zaXRpb24gPSBDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsZW5kYXJVSUQoKSA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIENBTEVOREFSX1VJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWxlbmRhclVJRCgpIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhbGVuZGFyVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBjYWxlbmRhclVJRCA9IENBTEVOREFSX1VJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0U3RhcnRUaW1lKCkgPGVtPkRlZmF1bHQgU3RhcnQgVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdFN0YXJ0VGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgREVGQVVMVF9TVEFSVF9USU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRTdGFydFRpbWUoKSA8ZW0+RGVmYXVsdCBTdGFydCBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0U3RhcnRUaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRlZmF1bHRTdGFydFRpbWUgPSBERUZBVUxUX1NUQVJUX1RJTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKSA8ZW0+RGVmYXVsdCBGaW5pc2ggVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IERFRkFVTFRfRklOSVNIX1RJTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKSA8ZW0+RGVmYXVsdCBGaW5pc2ggVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZGVmYXVsdEZpbmlzaFRpbWUgPSBERUZBVUxUX0ZJTklTSF9USU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbnV0ZXNQZXJEYXkoKSA8ZW0+TWludXRlcyBQZXIgRGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaW51dGVzUGVyRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTUlOVVRFU19QRVJfREFZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbnV0ZXNQZXJEYXkoKSA8ZW0+TWludXRlcyBQZXIgRGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaW51dGVzUGVyRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBtaW51dGVzUGVyRGF5ID0gTUlOVVRFU19QRVJfREFZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbnV0ZXNQZXJXZWVrKCkgPGVtPk1pbnV0ZXMgUGVyIFdlZWs8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1pbnV0ZXNQZXJXZWVrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTUlOVVRFU19QRVJfV0VFS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaW51dGVzUGVyV2VlaygpIDxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaW51dGVzUGVyV2VlaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgbWludXRlc1BlcldlZWsgPSBNSU5VVEVTX1BFUl9XRUVLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERheXNQZXJNb250aCgpIDxlbT5EYXlzIFBlciBNb250aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGF5c1Blck1vbnRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREFZU19QRVJfTU9OVEhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF5c1Blck1vbnRoKCkgPGVtPkRheXMgUGVyIE1vbnRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREYXlzUGVyTW9udGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGRheXNQZXJNb250aCA9IERBWVNfUEVSX01PTlRIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRUYXNrVHlwZSgpIDxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREVGQVVMVF9UQVNLX1RZUEVfRURFRkFVTFQgPSBuZXcgQmlnSW50ZWdlcigiMSIpOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFRhc2tUeXBlKCkgPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGRlZmF1bHRUYXNrVHlwZSA9IERFRkFVTFRfVEFTS19UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBEZWZhdWx0IFRhc2sgVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdFRhc2tUeXBlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKCkgPGVtPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKCkgPGVtPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwgPSBERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkgPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX1NUQU5EQVJEX1JBVEVfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpIDxlbT5EZWZhdWx0IFN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBkZWZhdWx0U3RhbmRhcmRSYXRlID0gREVGQVVMVF9TVEFOREFSRF9SQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBEZWZhdWx0IFN0YW5kYXJkIFJhdGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRTdGFuZGFyZFJhdGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpIDxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9PVkVSVElNRV9SQVRFX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRPdmVydGltZVJhdGUoKSA8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgZGVmYXVsdE92ZXJ0aW1lUmF0ZSA9IERFRkFVTFRfT1ZFUlRJTUVfUkFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRGVmYXVsdCBPdmVydGltZSBSYXRlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0T3ZlcnRpbWVSYXRlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXQgPSBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya0Zvcm1hdCgpIDxlbT5Xb3JrIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya0Zvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFdPUktfRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtGb3JtYXQoKSA8ZW0+V29yayBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHdvcmtGb3JtYXQgPSBXT1JLX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VkaXRhYmxlQWN0dWFsQ29zdHMoKSA8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VkaXRhYmxlQWN0dWFsQ29zdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFRElUQUJMRV9BQ1RVQUxfQ09TVFNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRWRpdGFibGVBY3R1YWxDb3N0cygpIDxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWRpdGFibGVBY3R1YWxDb3N0cyA9IEVESVRBQkxFX0FDVFVBTF9DT1NUU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRWRpdGFibGUgQWN0dWFsIENvc3RzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlZGl0YWJsZUFjdHVhbENvc3RzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSG9ub3JDb25zdHJhaW50cygpIDxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSE9OT1JfQ09OU1RSQUlOVFNfRURFRkFVTFQgPSB0cnVlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIb25vckNvbnN0cmFpbnRzKCkgPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hvbm9yQ29uc3RyYWludHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhvbm9yQ29uc3RyYWludHMgPSBIT05PUl9DT05TVFJBSU5UU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSG9ub3IgQ29uc3RyYWludHMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhvbm9yQ29uc3RyYWludHNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKSA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBFQVJORURfVkFMVUVfTUVUSE9EX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVhcm5lZFZhbHVlTWV0aG9kKCkgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVhcm5lZFZhbHVlTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBlYXJuZWRWYWx1ZU1ldGhvZCA9IEVBUk5FRF9WQUxVRV9NRVRIT0RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKSA8ZW0+SW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWV9FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpIDxlbT5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPSBJTlNFUlRFRF9QUk9KRUNUU19MSUtFX1NVTU1BUllfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzKCkgPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc011bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1VTFRJUExFX0NSSVRJQ0FMX1BBVEhTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc011bHRpcGxlQ3JpdGljYWxQYXRocygpIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG11bHRpcGxlQ3JpdGljYWxQYXRocyA9IE1VTFRJUExFX0NSSVRJQ0FMX1BBVEhTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNdWx0aXBsZSBDcml0aWNhbCBQYXRocyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTmV3VGFza3NFZmZvcnREcml2ZW4oKSA8ZW0+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTmV3VGFza3NFZmZvcnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBORVdfVEFTS1NfRUZGT1JUX0RSSVZFTl9FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkgPGVtPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBuZXdUYXNrc0VmZm9ydERyaXZlbiA9IE5FV19UQVNLU19FRkZPUlRfRFJJVkVOX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBOZXcgVGFza3MgRWZmb3J0IERyaXZlbiBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbmV3VGFza3NFZmZvcnREcml2ZW5FU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNOZXdUYXNrc0VzdGltYXRlZCgpIDxlbT5OZXcgVGFza3MgRXN0aW1hdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc05ld1Rhc2tzRXN0aW1hdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTkVXX1RBU0tTX0VTVElNQVRFRF9FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05ld1Rhc2tzRXN0aW1hdGVkKCkgPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG5ld1Rhc2tzRXN0aW1hdGVkID0gTkVXX1RBU0tTX0VTVElNQVRFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTmV3IFRhc2tzIEVzdGltYXRlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbmV3VGFza3NFc3RpbWF0ZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTcGxpdHNJblByb2dyZXNzVGFza3MoKSA8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNQTElUU19JTl9QUk9HUkVTU19UQVNLU19FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpIDxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcGxpdHNJblByb2dyZXNzVGFza3MgPSBTUExJVFNfSU5fUFJPR1JFU1NfVEFTS1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3ByZWFkQWN0dWFsQ29zdCgpIDxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNQUkVBRF9BQ1RVQUxfQ09TVF9FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NwcmVhZEFjdHVhbENvc3QoKSA8ZW0+U3ByZWFkIEFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NwcmVhZEFjdHVhbENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNwcmVhZEFjdHVhbENvc3QgPSBTUFJFQURfQUNUVUFMX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFNwcmVhZCBBY3R1YWwgQ29zdCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3ByZWFkQWN0dWFsQ29zdEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpIDxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBTUFJFQURfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUoKSA8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcHJlYWRQZXJjZW50Q29tcGxldGUgPSBTUFJFQURfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU3ByZWFkIFBlcmNlbnQgQ29tcGxldGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Rhc2tVcGRhdGVzUmVzb3VyY2UoKSA8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Rhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBUQVNLX1VQREFURVNfUkVTT1VSQ0VfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSgpIDxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGFza1VwZGF0ZXNSZXNvdXJjZSA9IFRBU0tfVVBEQVRFU19SRVNPVVJDRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVGFzayBVcGRhdGVzIFJlc291cmNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0YXNrVXBkYXRlc1Jlc291cmNlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmlzY2FsWWVhclN0YXJ0KCkgPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Zpc2NhbFllYXJTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEZJU0NBTF9ZRUFSX1NUQVJUX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Zpc2NhbFllYXJTdGFydCgpIDxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZpc2NhbFllYXJTdGFydCA9IEZJU0NBTF9ZRUFSX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBGaXNjYWwgWWVhciBTdGFydCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmlzY2FsWWVhclN0YXJ0RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlZWtTdGFydERheSgpIDxlbT5XZWVrIFN0YXJ0IERheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2Vla1N0YXJ0RGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgV0VFS19TVEFSVF9EQVlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2Vla1N0YXJ0RGF5KCkgPGVtPldlZWsgU3RhcnQgRGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXZWVrU3RhcnREYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHdlZWtTdGFydERheSA9IFdFRUtfU1RBUlRfREFZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgQmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBNT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0tfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgQmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1vdmVDb21wbGV0ZWRFbmRzQmFjayA9IE1PVkVfQ09NUExFVEVEX0VORFNfQkFDS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1PVkVfUkVNQUlOSU5HX1NUQVJUU19CQUNLX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlUmVtYWluaW5nU3RhcnRzQmFjayA9IE1PVkVfUkVNQUlOSU5HX1NUQVJUU19CQUNLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjayBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2tFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCA9IE1PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKSA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKSA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkID0gTU9WRV9DT01QTEVURURfRU5EU19GT1JXQVJEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKCkgPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBCQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoKSA8ZW0+QmFzZWxpbmUgRm9yIEVhcm5lZCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSA9IEJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKSA8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1NfRURFRkFVTFQgPSB0cnVlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKSA8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPSBBVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3MgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGF0dXNEYXRlKCkgPGVtPlN0YXR1cyBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGF0dXNEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBTVEFUVVNfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGF0dXNEYXRlKCkgPGVtPlN0YXR1cyBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGF0dXNEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXR1c0RhdGUgPSBTVEFUVVNfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXJyZW50RGF0ZSgpIDxlbT5DdXJyZW50IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1cnJlbnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBDVVJSRU5UX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVudERhdGUoKSA8ZW0+Q3VycmVudCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXJyZW50RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjdXJyZW50RGF0ZSA9IENVUlJFTlRfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKSA8ZW0+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUlDUk9TT0ZUX1BST0pFQ1RfU0VSVkVSX1VSTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCA9IE1JQ1JPU09GVF9QUk9KRUNUX1NFUlZFUl9VUkxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkwgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBdXRvbGluaygpIDxlbT5BdXRvbGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBdXRvbGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEFVVE9MSU5LX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0F1dG9saW5rKCkgPGVtPkF1dG9saW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0F1dG9saW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdXRvbGluayA9IEFVVE9MSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBdXRvbGluayBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXV0b2xpbmtFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmV3VGFza1N0YXJ0RGF0ZSgpIDxlbT5OZXcgVGFzayBTdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROZXdUYXNrU3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTkVXX1RBU0tfU1RBUlRfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROZXdUYXNrU3RhcnREYXRlKCkgPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5ld1Rhc2tTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIG5ld1Rhc2tTdGFydERhdGUgPSBORVdfVEFTS19TVEFSVF9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRUYXNrRVZNZXRob2QoKSA8ZW0+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERFRkFVTFRfVEFTS19FVl9NRVRIT0RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgpIDxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza0VWTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkZWZhdWx0VGFza0VWTWV0aG9kID0gREVGQVVMVF9UQVNLX0VWX01FVEhPRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkgPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkgPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByb2plY3RFeHRlcm5hbGx5RWRpdGVkID0gUFJPSkVDVF9FWFRFUk5BTExZX0VESVRFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKSA8ZW0+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEVYVEVOREVEX0NSRUFUSU9OX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKSA8ZW0+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZXh0ZW5kZWRDcmVhdGlvbkRhdGUgPSBFWFRFTkRFRF9DUkVBVElPTl9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQWN0dWFsc0luU3luYygpIDxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQWN0dWFsc0luU3luYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEFDVFVBTFNfSU5fU1lOQ19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBY3R1YWxzSW5TeW5jKCkgPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBY3R1YWxzSW5TeW5jKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY3R1YWxzSW5TeW5jID0gQUNUVUFMU19JTl9TWU5DX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBY3R1YWxzIEluIFN5bmMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjdHVhbHNJblN5bmNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZW1vdmVGaWxlUHJvcGVydGllcygpIDxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVNT1ZFX0ZJTEVfUFJPUEVSVElFU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZW1vdmVGaWxlUHJvcGVydGllcygpIDxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaWxlUHJvcGVydGllcyA9IFJFTU9WRV9GSUxFX1BST1BFUlRJRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJlbW92ZSBGaWxlIFByb3BlcnRpZXMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpbGVQcm9wZXJ0aWVzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQWRtaW5Qcm9qZWN0KCkgPGVtPkFkbWluIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQWRtaW5Qcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQURNSU5fUFJPSkVDVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBZG1pblByb2plY3QoKSA8ZW0+QWRtaW4gUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBZG1pblByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkbWluUHJvamVjdCA9IEFETUlOX1BST0pFQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEFkbWluIFByb2plY3QgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkbWluUHJvamVjdEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVDb2RlcygpIDxlbT5PdXRsaW5lIENvZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPdXRsaW5lQ29kZXMgb3V0bGluZUNvZGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdCU01hc2tzKCkgPGVtPldCUyBNYXNrczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V0JTTWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBXQlNNYXNrcyB3QlNNYXNrcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXh0ZW5kZWRBdHRyaWJ1dGVzIGV4dGVuZGVkQXR0cmlidXRlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWxlbmRhcnMoKSA8ZW0+Q2FsZW5kYXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxlbmRhcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDYWxlbmRhcnMgY2FsZW5kYXJzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhc2tzKCkgPGVtPlRhc2tzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tzIHRhc2tzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlcygpIDxlbT5SZXNvdXJjZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlcyByZXNvdXJjZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzaWdubWVudHMoKSA8ZW0+QXNzaWdubWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXNzaWdubWVudHMgYXNzaWdubWVudHMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2plY3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvamVjdCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChTdHJpbmcgbmV3VUlEKSB7Ci0JCVN0cmluZyBvbGRVSUQgPSB1SUQ7Ci0JCXVJRCA9IG5ld1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19VSUQsIG9sZFVJRCwgdUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiB0aXRsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgbmV3VGl0bGUpIHsKLQkJU3RyaW5nIG9sZFRpdGxlID0gdGl0bGU7Ci0JCXRpdGxlID0gbmV3VGl0bGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVElUTEUsIG9sZFRpdGxlLCB0aXRsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3ViamVjdCgpIHsKLQkJcmV0dXJuIHN1YmplY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3ViamVjdChTdHJpbmcgbmV3U3ViamVjdCkgewotCQlTdHJpbmcgb2xkU3ViamVjdCA9IHN1YmplY3Q7Ci0JCXN1YmplY3QgPSBuZXdTdWJqZWN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NVQkpFQ1QsIG9sZFN1YmplY3QsIHN1YmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCQlyZXR1cm4gY2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnkoU3RyaW5nIG5ld0NhdGVnb3J5KSB7Ci0JCVN0cmluZyBvbGRDYXRlZ29yeSA9IGNhdGVnb3J5OwotCQljYXRlZ29yeSA9IG5ld0NhdGVnb3J5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBVEVHT1JZLCBvbGRDYXRlZ29yeSwgY2F0ZWdvcnkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbXBhbnkoKSB7Ci0JCXJldHVybiBjb21wYW55OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbXBhbnkoU3RyaW5nIG5ld0NvbXBhbnkpIHsKLQkJU3RyaW5nIG9sZENvbXBhbnkgPSBjb21wYW55OwotCQljb21wYW55ID0gbmV3Q29tcGFueTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DT01QQU5ZLCBvbGRDb21wYW55LCBjb21wYW55KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYW5hZ2VyKCkgewotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyKFN0cmluZyBuZXdNYW5hZ2VyKSB7Ci0JCVN0cmluZyBvbGRNYW5hZ2VyID0gbWFuYWdlcjsKLQkJbWFuYWdlciA9IG5ld01hbmFnZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUFOQUdFUiwgb2xkTWFuYWdlciwgbWFuYWdlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9yKCkgewotCQlyZXR1cm4gYXV0aG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dGhvcihTdHJpbmcgbmV3QXV0aG9yKSB7Ci0JCVN0cmluZyBvbGRBdXRob3IgPSBhdXRob3I7Ci0JCWF1dGhvciA9IG5ld0F1dGhvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRIT1IsIG9sZEF1dGhvciwgYXV0aG9yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGlvbkRhdGUoKSB7Ci0JCXJldHVybiBjcmVhdGlvbkRhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRpb25EYXRlKE9iamVjdCBuZXdDcmVhdGlvbkRhdGUpIHsKLQkJT2JqZWN0IG9sZENyZWF0aW9uRGF0ZSA9IGNyZWF0aW9uRGF0ZTsKLQkJY3JlYXRpb25EYXRlID0gbmV3Q3JlYXRpb25EYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSRUFUSU9OX0RBVEUsIG9sZENyZWF0aW9uRGF0ZSwgY3JlYXRpb25EYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UmV2aXNpb24oKSB7Ci0JCXJldHVybiByZXZpc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXZpc2lvbihCaWdJbnRlZ2VyIG5ld1JldmlzaW9uKSB7Ci0JCUJpZ0ludGVnZXIgb2xkUmV2aXNpb24gPSByZXZpc2lvbjsKLQkJcmV2aXNpb24gPSBuZXdSZXZpc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRVZJU0lPTiwgb2xkUmV2aXNpb24sIHJldmlzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRMYXN0U2F2ZWQoKSB7Ci0JCXJldHVybiBsYXN0U2F2ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFzdFNhdmVkKE9iamVjdCBuZXdMYXN0U2F2ZWQpIHsKLQkJT2JqZWN0IG9sZExhc3RTYXZlZCA9IGxhc3RTYXZlZDsKLQkJbGFzdFNhdmVkID0gbmV3TGFzdFNhdmVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0xBU1RfU0FWRUQsIG9sZExhc3RTYXZlZCwgbGFzdFNhdmVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTY2hlZHVsZUZyb21TdGFydCgpIHsKLQkJcmV0dXJuIHNjaGVkdWxlRnJvbVN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjaGVkdWxlRnJvbVN0YXJ0KGJvb2xlYW4gbmV3U2NoZWR1bGVGcm9tU3RhcnQpIHsKLQkJYm9vbGVhbiBvbGRTY2hlZHVsZUZyb21TdGFydCA9IHNjaGVkdWxlRnJvbVN0YXJ0OwotCQlzY2hlZHVsZUZyb21TdGFydCA9IG5ld1NjaGVkdWxlRnJvbVN0YXJ0OwotCQlib29sZWFuIG9sZFNjaGVkdWxlRnJvbVN0YXJ0RVNldCA9IHNjaGVkdWxlRnJvbVN0YXJ0RVNldDsKLQkJc2NoZWR1bGVGcm9tU3RhcnRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TQ0hFRFVMRV9GUk9NX1NUQVJULCBvbGRTY2hlZHVsZUZyb21TdGFydCwgc2NoZWR1bGVGcm9tU3RhcnQsICFvbGRTY2hlZHVsZUZyb21TdGFydEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFNjaGVkdWxlRnJvbVN0YXJ0KCkgewotCQlib29sZWFuIG9sZFNjaGVkdWxlRnJvbVN0YXJ0ID0gc2NoZWR1bGVGcm9tU3RhcnQ7Ci0JCWJvb2xlYW4gb2xkU2NoZWR1bGVGcm9tU3RhcnRFU2V0ID0gc2NoZWR1bGVGcm9tU3RhcnRFU2V0OwotCQlzY2hlZHVsZUZyb21TdGFydCA9IFNDSEVEVUxFX0ZST01fU1RBUlRfRURFRkFVTFQ7Ci0JCXNjaGVkdWxlRnJvbVN0YXJ0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU0NIRURVTEVfRlJPTV9TVEFSVCwgb2xkU2NoZWR1bGVGcm9tU3RhcnQsIFNDSEVEVUxFX0ZST01fU1RBUlRfRURFRkFVTFQsIG9sZFNjaGVkdWxlRnJvbVN0YXJ0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0U2NoZWR1bGVGcm9tU3RhcnQoKSB7Ci0JCXJldHVybiBzY2hlZHVsZUZyb21TdGFydEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTdGFydERhdGUoKSB7Ci0JCXJldHVybiBzdGFydERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnREYXRlKE9iamVjdCBuZXdTdGFydERhdGUpIHsKLQkJT2JqZWN0IG9sZFN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTsKLQkJc3RhcnREYXRlID0gbmV3U3RhcnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NUQVJUX0RBVEUsIG9sZFN0YXJ0RGF0ZSwgc3RhcnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGaW5pc2hEYXRlKCkgewotCQlyZXR1cm4gZmluaXNoRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2hEYXRlKE9iamVjdCBuZXdGaW5pc2hEYXRlKSB7Ci0JCU9iamVjdCBvbGRGaW5pc2hEYXRlID0gZmluaXNoRGF0ZTsKLQkJZmluaXNoRGF0ZSA9IG5ld0ZpbmlzaERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklOSVNIX0RBVEUsIG9sZEZpbmlzaERhdGUsIGZpbmlzaERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRGWVN0YXJ0RGF0ZSgpIHsKLQkJcmV0dXJuIGZZU3RhcnREYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZZU3RhcnREYXRlKEJpZ0ludGVnZXIgbmV3RllTdGFydERhdGUpIHsKLQkJQmlnSW50ZWdlciBvbGRGWVN0YXJ0RGF0ZSA9IGZZU3RhcnREYXRlOwotCQlmWVN0YXJ0RGF0ZSA9IG5ld0ZZU3RhcnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZZU1RBUlRfREFURSwgb2xkRllTdGFydERhdGUsIGZZU3RhcnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q3JpdGljYWxTbGFja0xpbWl0KCkgewotCQlyZXR1cm4gY3JpdGljYWxTbGFja0xpbWl0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyaXRpY2FsU2xhY2tMaW1pdChCaWdJbnRlZ2VyIG5ld0NyaXRpY2FsU2xhY2tMaW1pdCkgewotCQlCaWdJbnRlZ2VyIG9sZENyaXRpY2FsU2xhY2tMaW1pdCA9IGNyaXRpY2FsU2xhY2tMaW1pdDsKLQkJY3JpdGljYWxTbGFja0xpbWl0ID0gbmV3Q3JpdGljYWxTbGFja0xpbWl0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSSVRJQ0FMX1NMQUNLX0xJTUlULCBvbGRDcml0aWNhbFNsYWNrTGltaXQsIGNyaXRpY2FsU2xhY2tMaW1pdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEN1cnJlbmN5RGlnaXRzKCkgewotCQlyZXR1cm4gY3VycmVuY3lEaWdpdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVuY3lEaWdpdHMoQmlnSW50ZWdlciBuZXdDdXJyZW5jeURpZ2l0cykgewotCQlCaWdJbnRlZ2VyIG9sZEN1cnJlbmN5RGlnaXRzID0gY3VycmVuY3lEaWdpdHM7Ci0JCWN1cnJlbmN5RGlnaXRzID0gbmV3Q3VycmVuY3lEaWdpdHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfRElHSVRTLCBvbGRDdXJyZW5jeURpZ2l0cywgY3VycmVuY3lEaWdpdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbmN5U3ltYm9sKCkgewotCQlyZXR1cm4gY3VycmVuY3lTeW1ib2w7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVuY3lTeW1ib2woU3RyaW5nIG5ld0N1cnJlbmN5U3ltYm9sKSB7Ci0JCVN0cmluZyBvbGRDdXJyZW5jeVN5bWJvbCA9IGN1cnJlbmN5U3ltYm9sOwotCQljdXJyZW5jeVN5bWJvbCA9IG5ld0N1cnJlbmN5U3ltYm9sOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX1NZTUJPTCwgb2xkQ3VycmVuY3lTeW1ib2wsIGN1cnJlbmN5U3ltYm9sKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGN1cnJlbmN5U3ltYm9sUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbihCaWdJbnRlZ2VyIG5ld0N1cnJlbmN5U3ltYm9sUG9zaXRpb24pIHsKLQkJQmlnSW50ZWdlciBvbGRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uID0gY3VycmVuY3lTeW1ib2xQb3NpdGlvbjsKLQkJY3VycmVuY3lTeW1ib2xQb3NpdGlvbiA9IG5ld0N1cnJlbmN5U3ltYm9sUG9zaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OLCBvbGRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uLCBjdXJyZW5jeVN5bWJvbFBvc2l0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q2FsZW5kYXJVSUQoKSB7Ci0JCXJldHVybiBjYWxlbmRhclVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWxlbmRhclVJRChCaWdJbnRlZ2VyIG5ld0NhbGVuZGFyVUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkQ2FsZW5kYXJVSUQgPSBjYWxlbmRhclVJRDsKLQkJY2FsZW5kYXJVSUQgPSBuZXdDYWxlbmRhclVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUl9VSUQsIG9sZENhbGVuZGFyVUlELCBjYWxlbmRhclVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFN0YXJ0VGltZSgpIHsKLQkJcmV0dXJuIGRlZmF1bHRTdGFydFRpbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFN0YXJ0VGltZShPYmplY3QgbmV3RGVmYXVsdFN0YXJ0VGltZSkgewotCQlPYmplY3Qgb2xkRGVmYXVsdFN0YXJ0VGltZSA9IGRlZmF1bHRTdGFydFRpbWU7Ci0JCWRlZmF1bHRTdGFydFRpbWUgPSBuZXdEZWZhdWx0U3RhcnRUaW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBUlRfVElNRSwgb2xkRGVmYXVsdFN0YXJ0VGltZSwgZGVmYXVsdFN0YXJ0VGltZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKSB7Ci0JCXJldHVybiBkZWZhdWx0RmluaXNoVGltZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0RmluaXNoVGltZShPYmplY3QgbmV3RGVmYXVsdEZpbmlzaFRpbWUpIHsKLQkJT2JqZWN0IG9sZERlZmF1bHRGaW5pc2hUaW1lID0gZGVmYXVsdEZpbmlzaFRpbWU7Ci0JCWRlZmF1bHRGaW5pc2hUaW1lID0gbmV3RGVmYXVsdEZpbmlzaFRpbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9GSU5JU0hfVElNRSwgb2xkRGVmYXVsdEZpbmlzaFRpbWUsIGRlZmF1bHRGaW5pc2hUaW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TWludXRlc1BlckRheSgpIHsKLQkJcmV0dXJuIG1pbnV0ZXNQZXJEYXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWludXRlc1BlckRheShCaWdJbnRlZ2VyIG5ld01pbnV0ZXNQZXJEYXkpIHsKLQkJQmlnSW50ZWdlciBvbGRNaW51dGVzUGVyRGF5ID0gbWludXRlc1BlckRheTsKLQkJbWludXRlc1BlckRheSA9IG5ld01pbnV0ZXNQZXJEYXk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlOVVRFU19QRVJfREFZLCBvbGRNaW51dGVzUGVyRGF5LCBtaW51dGVzUGVyRGF5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TWludXRlc1BlcldlZWsoKSB7Ci0JCXJldHVybiBtaW51dGVzUGVyV2VlazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaW51dGVzUGVyV2VlayhCaWdJbnRlZ2VyIG5ld01pbnV0ZXNQZXJXZWVrKSB7Ci0JCUJpZ0ludGVnZXIgb2xkTWludXRlc1BlcldlZWsgPSBtaW51dGVzUGVyV2VlazsKLQkJbWludXRlc1BlcldlZWsgPSBuZXdNaW51dGVzUGVyV2VlazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9XRUVLLCBvbGRNaW51dGVzUGVyV2VlaywgbWludXRlc1BlcldlZWspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREYXlzUGVyTW9udGgoKSB7Ci0JCXJldHVybiBkYXlzUGVyTW9udGg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF5c1Blck1vbnRoKEJpZ0ludGVnZXIgbmV3RGF5c1Blck1vbnRoKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRGF5c1Blck1vbnRoID0gZGF5c1Blck1vbnRoOwotCQlkYXlzUGVyTW9udGggPSBuZXdEYXlzUGVyTW9udGg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREFZU19QRVJfTU9OVEgsIG9sZERheXNQZXJNb250aCwgZGF5c1Blck1vbnRoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RGVmYXVsdFRhc2tUeXBlKCkgewotCQlyZXR1cm4gZGVmYXVsdFRhc2tUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRUYXNrVHlwZShCaWdJbnRlZ2VyIG5ld0RlZmF1bHRUYXNrVHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZERlZmF1bHRUYXNrVHlwZSA9IGRlZmF1bHRUYXNrVHlwZTsKLQkJZGVmYXVsdFRhc2tUeXBlID0gbmV3RGVmYXVsdFRhc2tUeXBlOwotCQlib29sZWFuIG9sZERlZmF1bHRUYXNrVHlwZUVTZXQgPSBkZWZhdWx0VGFza1R5cGVFU2V0OwotCQlkZWZhdWx0VGFza1R5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfVFlQRSwgb2xkRGVmYXVsdFRhc2tUeXBlLCBkZWZhdWx0VGFza1R5cGUsICFvbGREZWZhdWx0VGFza1R5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXREZWZhdWx0VGFza1R5cGUoKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRGVmYXVsdFRhc2tUeXBlID0gZGVmYXVsdFRhc2tUeXBlOwotCQlib29sZWFuIG9sZERlZmF1bHRUYXNrVHlwZUVTZXQgPSBkZWZhdWx0VGFza1R5cGVFU2V0OwotCQlkZWZhdWx0VGFza1R5cGUgPSBERUZBVUxUX1RBU0tfVFlQRV9FREVGQVVMVDsKLQkJZGVmYXVsdFRhc2tUeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9UQVNLX1RZUEUsIG9sZERlZmF1bHRUYXNrVHlwZSwgREVGQVVMVF9UQVNLX1RZUEVfRURFRkFVTFQsIG9sZERlZmF1bHRUYXNrVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldERlZmF1bHRUYXNrVHlwZSgpIHsKLQkJcmV0dXJuIGRlZmF1bHRUYXNrVHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKSB7Ci0JCXJldHVybiBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbChCaWdJbnRlZ2VyIG5ld0RlZmF1bHRGaXhlZENvc3RBY2NydWFsKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwgPSBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbDsKLQkJZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwgPSBuZXdEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTCwgb2xkRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwsIGRlZmF1bHRGaXhlZENvc3RBY2NydWFsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldERlZmF1bHRTdGFuZGFyZFJhdGUoKSB7Ci0JCXJldHVybiBkZWZhdWx0U3RhbmRhcmRSYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRTdGFuZGFyZFJhdGUoZmxvYXQgbmV3RGVmYXVsdFN0YW5kYXJkUmF0ZSkgewotCQlmbG9hdCBvbGREZWZhdWx0U3RhbmRhcmRSYXRlID0gZGVmYXVsdFN0YW5kYXJkUmF0ZTsKLQkJZGVmYXVsdFN0YW5kYXJkUmF0ZSA9IG5ld0RlZmF1bHRTdGFuZGFyZFJhdGU7Ci0JCWJvb2xlYW4gb2xkRGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQgPSBkZWZhdWx0U3RhbmRhcmRSYXRlRVNldDsKLQkJZGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBTkRBUkRfUkFURSwgb2xkRGVmYXVsdFN0YW5kYXJkUmF0ZSwgZGVmYXVsdFN0YW5kYXJkUmF0ZSwgIW9sZERlZmF1bHRTdGFuZGFyZFJhdGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkgewotCQlmbG9hdCBvbGREZWZhdWx0U3RhbmRhcmRSYXRlID0gZGVmYXVsdFN0YW5kYXJkUmF0ZTsKLQkJYm9vbGVhbiBvbGREZWZhdWx0U3RhbmRhcmRSYXRlRVNldCA9IGRlZmF1bHRTdGFuZGFyZFJhdGVFU2V0OwotCQlkZWZhdWx0U3RhbmRhcmRSYXRlID0gREVGQVVMVF9TVEFOREFSRF9SQVRFX0VERUZBVUxUOwotCQlkZWZhdWx0U3RhbmRhcmRSYXRlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9TVEFOREFSRF9SQVRFLCBvbGREZWZhdWx0U3RhbmRhcmRSYXRlLCBERUZBVUxUX1NUQU5EQVJEX1JBVEVfRURFRkFVTFQsIG9sZERlZmF1bHRTdGFuZGFyZFJhdGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkgewotCQlyZXR1cm4gZGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldERlZmF1bHRPdmVydGltZVJhdGUoKSB7Ci0JCXJldHVybiBkZWZhdWx0T3ZlcnRpbWVSYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRPdmVydGltZVJhdGUoZmxvYXQgbmV3RGVmYXVsdE92ZXJ0aW1lUmF0ZSkgewotCQlmbG9hdCBvbGREZWZhdWx0T3ZlcnRpbWVSYXRlID0gZGVmYXVsdE92ZXJ0aW1lUmF0ZTsKLQkJZGVmYXVsdE92ZXJ0aW1lUmF0ZSA9IG5ld0RlZmF1bHRPdmVydGltZVJhdGU7Ci0JCWJvb2xlYW4gb2xkRGVmYXVsdE92ZXJ0aW1lUmF0ZUVTZXQgPSBkZWZhdWx0T3ZlcnRpbWVSYXRlRVNldDsKLQkJZGVmYXVsdE92ZXJ0aW1lUmF0ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfT1ZFUlRJTUVfUkFURSwgb2xkRGVmYXVsdE92ZXJ0aW1lUmF0ZSwgZGVmYXVsdE92ZXJ0aW1lUmF0ZSwgIW9sZERlZmF1bHRPdmVydGltZVJhdGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkgewotCQlmbG9hdCBvbGREZWZhdWx0T3ZlcnRpbWVSYXRlID0gZGVmYXVsdE92ZXJ0aW1lUmF0ZTsKLQkJYm9vbGVhbiBvbGREZWZhdWx0T3ZlcnRpbWVSYXRlRVNldCA9IGRlZmF1bHRPdmVydGltZVJhdGVFU2V0OwotCQlkZWZhdWx0T3ZlcnRpbWVSYXRlID0gREVGQVVMVF9PVkVSVElNRV9SQVRFX0VERUZBVUxUOwotCQlkZWZhdWx0T3ZlcnRpbWVSYXRlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9PVkVSVElNRV9SQVRFLCBvbGREZWZhdWx0T3ZlcnRpbWVSYXRlLCBERUZBVUxUX09WRVJUSU1FX1JBVEVfRURFRkFVTFQsIG9sZERlZmF1bHRPdmVydGltZVJhdGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkgewotCQlyZXR1cm4gZGVmYXVsdE92ZXJ0aW1lUmF0ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKSB7Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIG5ld0R1cmF0aW9uRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkRHVyYXRpb25Gb3JtYXQgPSBkdXJhdGlvbkZvcm1hdDsKLQkJZHVyYXRpb25Gb3JtYXQgPSBuZXdEdXJhdGlvbkZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EVVJBVElPTl9GT1JNQVQsIG9sZER1cmF0aW9uRm9ybWF0LCBkdXJhdGlvbkZvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFdvcmtGb3JtYXQoKSB7Ci0JCXJldHVybiB3b3JrRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtGb3JtYXQoQmlnSW50ZWdlciBuZXdXb3JrRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkV29ya0Zvcm1hdCA9IHdvcmtGb3JtYXQ7Ci0JCXdvcmtGb3JtYXQgPSBuZXdXb3JrRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dPUktfRk9STUFULCBvbGRXb3JrRm9ybWF0LCB3b3JrRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFZGl0YWJsZUFjdHVhbENvc3RzKCkgewotCQlyZXR1cm4gZWRpdGFibGVBY3R1YWxDb3N0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0YWJsZUFjdHVhbENvc3RzKGJvb2xlYW4gbmV3RWRpdGFibGVBY3R1YWxDb3N0cykgewotCQlib29sZWFuIG9sZEVkaXRhYmxlQWN0dWFsQ29zdHMgPSBlZGl0YWJsZUFjdHVhbENvc3RzOwotCQllZGl0YWJsZUFjdHVhbENvc3RzID0gbmV3RWRpdGFibGVBY3R1YWxDb3N0czsKLQkJYm9vbGVhbiBvbGRFZGl0YWJsZUFjdHVhbENvc3RzRVNldCA9IGVkaXRhYmxlQWN0dWFsQ29zdHNFU2V0OwotCQllZGl0YWJsZUFjdHVhbENvc3RzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRURJVEFCTEVfQUNUVUFMX0NPU1RTLCBvbGRFZGl0YWJsZUFjdHVhbENvc3RzLCBlZGl0YWJsZUFjdHVhbENvc3RzLCAhb2xkRWRpdGFibGVBY3R1YWxDb3N0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEVkaXRhYmxlQWN0dWFsQ29zdHMoKSB7Ci0JCWJvb2xlYW4gb2xkRWRpdGFibGVBY3R1YWxDb3N0cyA9IGVkaXRhYmxlQWN0dWFsQ29zdHM7Ci0JCWJvb2xlYW4gb2xkRWRpdGFibGVBY3R1YWxDb3N0c0VTZXQgPSBlZGl0YWJsZUFjdHVhbENvc3RzRVNldDsKLQkJZWRpdGFibGVBY3R1YWxDb3N0cyA9IEVESVRBQkxFX0FDVFVBTF9DT1NUU19FREVGQVVMVDsKLQkJZWRpdGFibGVBY3R1YWxDb3N0c0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VESVRBQkxFX0FDVFVBTF9DT1NUUywgb2xkRWRpdGFibGVBY3R1YWxDb3N0cywgRURJVEFCTEVfQUNUVUFMX0NPU1RTX0VERUZBVUxULCBvbGRFZGl0YWJsZUFjdHVhbENvc3RzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RWRpdGFibGVBY3R1YWxDb3N0cygpIHsKLQkJcmV0dXJuIGVkaXRhYmxlQWN0dWFsQ29zdHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSG9ub3JDb25zdHJhaW50cygpIHsKLQkJcmV0dXJuIGhvbm9yQ29uc3RyYWludHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG9ub3JDb25zdHJhaW50cyhib29sZWFuIG5ld0hvbm9yQ29uc3RyYWludHMpIHsKLQkJYm9vbGVhbiBvbGRIb25vckNvbnN0cmFpbnRzID0gaG9ub3JDb25zdHJhaW50czsKLQkJaG9ub3JDb25zdHJhaW50cyA9IG5ld0hvbm9yQ29uc3RyYWludHM7Ci0JCWJvb2xlYW4gb2xkSG9ub3JDb25zdHJhaW50c0VTZXQgPSBob25vckNvbnN0cmFpbnRzRVNldDsKLQkJaG9ub3JDb25zdHJhaW50c0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0hPTk9SX0NPTlNUUkFJTlRTLCBvbGRIb25vckNvbnN0cmFpbnRzLCBob25vckNvbnN0cmFpbnRzLCAhb2xkSG9ub3JDb25zdHJhaW50c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEhvbm9yQ29uc3RyYWludHMoKSB7Ci0JCWJvb2xlYW4gb2xkSG9ub3JDb25zdHJhaW50cyA9IGhvbm9yQ29uc3RyYWludHM7Ci0JCWJvb2xlYW4gb2xkSG9ub3JDb25zdHJhaW50c0VTZXQgPSBob25vckNvbnN0cmFpbnRzRVNldDsKLQkJaG9ub3JDb25zdHJhaW50cyA9IEhPTk9SX0NPTlNUUkFJTlRTX0VERUZBVUxUOwotCQlob25vckNvbnN0cmFpbnRzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSE9OT1JfQ09OU1RSQUlOVFMsIG9sZEhvbm9yQ29uc3RyYWludHMsIEhPTk9SX0NPTlNUUkFJTlRTX0VERUZBVUxULCBvbGRIb25vckNvbnN0cmFpbnRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SG9ub3JDb25zdHJhaW50cygpIHsKLQkJcmV0dXJuIGhvbm9yQ29uc3RyYWludHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEVhcm5lZFZhbHVlTWV0aG9kKCkgewotCQlyZXR1cm4gZWFybmVkVmFsdWVNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWFybmVkVmFsdWVNZXRob2QoQmlnSW50ZWdlciBuZXdFYXJuZWRWYWx1ZU1ldGhvZCkgewotCQlCaWdJbnRlZ2VyIG9sZEVhcm5lZFZhbHVlTWV0aG9kID0gZWFybmVkVmFsdWVNZXRob2Q7Ci0JCWVhcm5lZFZhbHVlTWV0aG9kID0gbmV3RWFybmVkVmFsdWVNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRUFSTkVEX1ZBTFVFX01FVEhPRCwgb2xkRWFybmVkVmFsdWVNZXRob2QsIGVhcm5lZFZhbHVlTWV0aG9kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKSB7Ci0JCXJldHVybiBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KGJvb2xlYW4gbmV3SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KSB7Ci0JCWJvb2xlYW4gb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5ID0gaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5OwotCQlpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPSBuZXdJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnk7Ci0JCWJvb2xlYW4gb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldCA9IGluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQ7Ci0JCWluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0lOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWSwgb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5LCBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnksICFvbGRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKSB7Ci0JCWJvb2xlYW4gb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5ID0gaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5OwotCQlib29sZWFuIG9sZEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQgPSBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnlFU2V0OwotCQlpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPSBJTlNFUlRFRF9QUk9KRUNUU19MSUtFX1NVTU1BUllfRURFRkFVTFQ7Ci0JCWluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0lOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWSwgb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5LCBJTlNFUlRFRF9QUk9KRUNUU19MSUtFX1NVTU1BUllfRURFRkFVTFQsIG9sZEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpIHsKLQkJcmV0dXJuIGluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKSB7Ci0JCXJldHVybiBtdWx0aXBsZUNyaXRpY2FsUGF0aHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKGJvb2xlYW4gbmV3TXVsdGlwbGVDcml0aWNhbFBhdGhzKSB7Ci0JCWJvb2xlYW4gb2xkTXVsdGlwbGVDcml0aWNhbFBhdGhzID0gbXVsdGlwbGVDcml0aWNhbFBhdGhzOwotCQltdWx0aXBsZUNyaXRpY2FsUGF0aHMgPSBuZXdNdWx0aXBsZUNyaXRpY2FsUGF0aHM7Ci0JCWJvb2xlYW4gb2xkTXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCA9IG11bHRpcGxlQ3JpdGljYWxQYXRoc0VTZXQ7Ci0JCW11bHRpcGxlQ3JpdGljYWxQYXRoc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01VTFRJUExFX0NSSVRJQ0FMX1BBVEhTLCBvbGRNdWx0aXBsZUNyaXRpY2FsUGF0aHMsIG11bHRpcGxlQ3JpdGljYWxQYXRocywgIW9sZE11bHRpcGxlQ3JpdGljYWxQYXRoc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE11bHRpcGxlQ3JpdGljYWxQYXRocygpIHsKLQkJYm9vbGVhbiBvbGRNdWx0aXBsZUNyaXRpY2FsUGF0aHMgPSBtdWx0aXBsZUNyaXRpY2FsUGF0aHM7Ci0JCWJvb2xlYW4gb2xkTXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCA9IG11bHRpcGxlQ3JpdGljYWxQYXRoc0VTZXQ7Ci0JCW11bHRpcGxlQ3JpdGljYWxQYXRocyA9IE1VTFRJUExFX0NSSVRJQ0FMX1BBVEhTX0VERUZBVUxUOwotCQltdWx0aXBsZUNyaXRpY2FsUGF0aHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NVUxUSVBMRV9DUklUSUNBTF9QQVRIUywgb2xkTXVsdGlwbGVDcml0aWNhbFBhdGhzLCBNVUxUSVBMRV9DUklUSUNBTF9QQVRIU19FREVGQVVMVCwgb2xkTXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKCkgewotCQlyZXR1cm4gbXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkgewotCQlyZXR1cm4gbmV3VGFza3NFZmZvcnREcml2ZW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oYm9vbGVhbiBuZXdOZXdUYXNrc0VmZm9ydERyaXZlbikgewotCQlib29sZWFuIG9sZE5ld1Rhc2tzRWZmb3J0RHJpdmVuID0gbmV3VGFza3NFZmZvcnREcml2ZW47Ci0JCW5ld1Rhc2tzRWZmb3J0RHJpdmVuID0gbmV3TmV3VGFza3NFZmZvcnREcml2ZW47Ci0JCWJvb2xlYW4gb2xkTmV3VGFza3NFZmZvcnREcml2ZW5FU2V0ID0gbmV3VGFza3NFZmZvcnREcml2ZW5FU2V0OwotCQluZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FRkZPUlRfRFJJVkVOLCBvbGROZXdUYXNrc0VmZm9ydERyaXZlbiwgbmV3VGFza3NFZmZvcnREcml2ZW4sICFvbGROZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCkgewotCQlib29sZWFuIG9sZE5ld1Rhc2tzRWZmb3J0RHJpdmVuID0gbmV3VGFza3NFZmZvcnREcml2ZW47Ci0JCWJvb2xlYW4gb2xkTmV3VGFza3NFZmZvcnREcml2ZW5FU2V0ID0gbmV3VGFza3NFZmZvcnREcml2ZW5FU2V0OwotCQluZXdUYXNrc0VmZm9ydERyaXZlbiA9IE5FV19UQVNLU19FRkZPUlRfRFJJVkVOX0VERUZBVUxUOwotCQluZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FRkZPUlRfRFJJVkVOLCBvbGROZXdUYXNrc0VmZm9ydERyaXZlbiwgTkVXX1RBU0tTX0VGRk9SVF9EUklWRU5fRURFRkFVTFQsIG9sZE5ld1Rhc2tzRWZmb3J0RHJpdmVuRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TmV3VGFza3NFZmZvcnREcml2ZW4oKSB7Ci0JCXJldHVybiBuZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXdUYXNrc0VzdGltYXRlZCgpIHsKLQkJcmV0dXJuIG5ld1Rhc2tzRXN0aW1hdGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5ld1Rhc2tzRXN0aW1hdGVkKGJvb2xlYW4gbmV3TmV3VGFza3NFc3RpbWF0ZWQpIHsKLQkJYm9vbGVhbiBvbGROZXdUYXNrc0VzdGltYXRlZCA9IG5ld1Rhc2tzRXN0aW1hdGVkOwotCQluZXdUYXNrc0VzdGltYXRlZCA9IG5ld05ld1Rhc2tzRXN0aW1hdGVkOwotCQlib29sZWFuIG9sZE5ld1Rhc2tzRXN0aW1hdGVkRVNldCA9IG5ld1Rhc2tzRXN0aW1hdGVkRVNldDsKLQkJbmV3VGFza3NFc3RpbWF0ZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS1NfRVNUSU1BVEVELCBvbGROZXdUYXNrc0VzdGltYXRlZCwgbmV3VGFza3NFc3RpbWF0ZWQsICFvbGROZXdUYXNrc0VzdGltYXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE5ld1Rhc2tzRXN0aW1hdGVkKCkgewotCQlib29sZWFuIG9sZE5ld1Rhc2tzRXN0aW1hdGVkID0gbmV3VGFza3NFc3RpbWF0ZWQ7Ci0JCWJvb2xlYW4gb2xkTmV3VGFza3NFc3RpbWF0ZWRFU2V0ID0gbmV3VGFza3NFc3RpbWF0ZWRFU2V0OwotCQluZXdUYXNrc0VzdGltYXRlZCA9IE5FV19UQVNLU19FU1RJTUFURURfRURFRkFVTFQ7Ci0JCW5ld1Rhc2tzRXN0aW1hdGVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tTX0VTVElNQVRFRCwgb2xkTmV3VGFza3NFc3RpbWF0ZWQsIE5FV19UQVNLU19FU1RJTUFURURfRURFRkFVTFQsIG9sZE5ld1Rhc2tzRXN0aW1hdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TmV3VGFza3NFc3RpbWF0ZWQoKSB7Ci0JCXJldHVybiBuZXdUYXNrc0VzdGltYXRlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTcGxpdHNJblByb2dyZXNzVGFza3MoKSB7Ci0JCXJldHVybiBzcGxpdHNJblByb2dyZXNzVGFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKGJvb2xlYW4gbmV3U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKSB7Ci0JCWJvb2xlYW4gb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzID0gc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzOwotCQlzcGxpdHNJblByb2dyZXNzVGFza3MgPSBuZXdTcGxpdHNJblByb2dyZXNzVGFza3M7Ci0JCWJvb2xlYW4gb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldCA9IHNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQ7Ci0JCXNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQTElUU19JTl9QUk9HUkVTU19UQVNLUywgb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzLCBzcGxpdHNJblByb2dyZXNzVGFza3MsICFvbGRTcGxpdHNJblByb2dyZXNzVGFza3NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKSB7Ci0JCWJvb2xlYW4gb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzID0gc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzOwotCQlib29sZWFuIG9sZFNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQgPSBzcGxpdHNJblByb2dyZXNzVGFza3NFU2V0OwotCQlzcGxpdHNJblByb2dyZXNzVGFza3MgPSBTUExJVFNfSU5fUFJPR1JFU1NfVEFTS1NfRURFRkFVTFQ7Ci0JCXNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQTElUU19JTl9QUk9HUkVTU19UQVNLUywgb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzLCBTUExJVFNfSU5fUFJPR1JFU1NfVEFTS1NfRURFRkFVTFQsIG9sZFNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcygpIHsKLQkJcmV0dXJuIHNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTcHJlYWRBY3R1YWxDb3N0KCkgewotCQlyZXR1cm4gc3ByZWFkQWN0dWFsQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcHJlYWRBY3R1YWxDb3N0KGJvb2xlYW4gbmV3U3ByZWFkQWN0dWFsQ29zdCkgewotCQlib29sZWFuIG9sZFNwcmVhZEFjdHVhbENvc3QgPSBzcHJlYWRBY3R1YWxDb3N0OwotCQlzcHJlYWRBY3R1YWxDb3N0ID0gbmV3U3ByZWFkQWN0dWFsQ29zdDsKLQkJYm9vbGVhbiBvbGRTcHJlYWRBY3R1YWxDb3N0RVNldCA9IHNwcmVhZEFjdHVhbENvc3RFU2V0OwotCQlzcHJlYWRBY3R1YWxDb3N0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX0FDVFVBTF9DT1NULCBvbGRTcHJlYWRBY3R1YWxDb3N0LCBzcHJlYWRBY3R1YWxDb3N0LCAhb2xkU3ByZWFkQWN0dWFsQ29zdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFNwcmVhZEFjdHVhbENvc3QoKSB7Ci0JCWJvb2xlYW4gb2xkU3ByZWFkQWN0dWFsQ29zdCA9IHNwcmVhZEFjdHVhbENvc3Q7Ci0JCWJvb2xlYW4gb2xkU3ByZWFkQWN0dWFsQ29zdEVTZXQgPSBzcHJlYWRBY3R1YWxDb3N0RVNldDsKLQkJc3ByZWFkQWN0dWFsQ29zdCA9IFNQUkVBRF9BQ1RVQUxfQ09TVF9FREVGQVVMVDsKLQkJc3ByZWFkQWN0dWFsQ29zdEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQUkVBRF9BQ1RVQUxfQ09TVCwgb2xkU3ByZWFkQWN0dWFsQ29zdCwgU1BSRUFEX0FDVFVBTF9DT1NUX0VERUZBVUxULCBvbGRTcHJlYWRBY3R1YWxDb3N0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0U3ByZWFkQWN0dWFsQ29zdCgpIHsKLQkJcmV0dXJuIHNwcmVhZEFjdHVhbENvc3RFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3ByZWFkUGVyY2VudENvbXBsZXRlKCkgewotCQlyZXR1cm4gc3ByZWFkUGVyY2VudENvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwcmVhZFBlcmNlbnRDb21wbGV0ZShib29sZWFuIG5ld1NwcmVhZFBlcmNlbnRDb21wbGV0ZSkgewotCQlib29sZWFuIG9sZFNwcmVhZFBlcmNlbnRDb21wbGV0ZSA9IHNwcmVhZFBlcmNlbnRDb21wbGV0ZTsKLQkJc3ByZWFkUGVyY2VudENvbXBsZXRlID0gbmV3U3ByZWFkUGVyY2VudENvbXBsZXRlOwotCQlib29sZWFuIG9sZFNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQgPSBzcHJlYWRQZXJjZW50Q29tcGxldGVFU2V0OwotCQlzcHJlYWRQZXJjZW50Q29tcGxldGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfUEVSQ0VOVF9DT01QTEVURSwgb2xkU3ByZWFkUGVyY2VudENvbXBsZXRlLCBzcHJlYWRQZXJjZW50Q29tcGxldGUsICFvbGRTcHJlYWRQZXJjZW50Q29tcGxldGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKSB7Ci0JCWJvb2xlYW4gb2xkU3ByZWFkUGVyY2VudENvbXBsZXRlID0gc3ByZWFkUGVyY2VudENvbXBsZXRlOwotCQlib29sZWFuIG9sZFNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQgPSBzcHJlYWRQZXJjZW50Q29tcGxldGVFU2V0OwotCQlzcHJlYWRQZXJjZW50Q29tcGxldGUgPSBTUFJFQURfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVDsKLQkJc3ByZWFkUGVyY2VudENvbXBsZXRlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX1BFUkNFTlRfQ09NUExFVEUsIG9sZFNwcmVhZFBlcmNlbnRDb21wbGV0ZSwgU1BSRUFEX1BFUkNFTlRfQ09NUExFVEVfRURFRkFVTFQsIG9sZFNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUYXNrVXBkYXRlc1Jlc291cmNlKCkgewotCQlyZXR1cm4gdGFza1VwZGF0ZXNSZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXNrVXBkYXRlc1Jlc291cmNlKGJvb2xlYW4gbmV3VGFza1VwZGF0ZXNSZXNvdXJjZSkgewotCQlib29sZWFuIG9sZFRhc2tVcGRhdGVzUmVzb3VyY2UgPSB0YXNrVXBkYXRlc1Jlc291cmNlOwotCQl0YXNrVXBkYXRlc1Jlc291cmNlID0gbmV3VGFza1VwZGF0ZXNSZXNvdXJjZTsKLQkJYm9vbGVhbiBvbGRUYXNrVXBkYXRlc1Jlc291cmNlRVNldCA9IHRhc2tVcGRhdGVzUmVzb3VyY2VFU2V0OwotCQl0YXNrVXBkYXRlc1Jlc291cmNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS19VUERBVEVTX1JFU09VUkNFLCBvbGRUYXNrVXBkYXRlc1Jlc291cmNlLCB0YXNrVXBkYXRlc1Jlc291cmNlLCAhb2xkVGFza1VwZGF0ZXNSZXNvdXJjZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFRhc2tVcGRhdGVzUmVzb3VyY2UoKSB7Ci0JCWJvb2xlYW4gb2xkVGFza1VwZGF0ZXNSZXNvdXJjZSA9IHRhc2tVcGRhdGVzUmVzb3VyY2U7Ci0JCWJvb2xlYW4gb2xkVGFza1VwZGF0ZXNSZXNvdXJjZUVTZXQgPSB0YXNrVXBkYXRlc1Jlc291cmNlRVNldDsKLQkJdGFza1VwZGF0ZXNSZXNvdXJjZSA9IFRBU0tfVVBEQVRFU19SRVNPVVJDRV9FREVGQVVMVDsKLQkJdGFza1VwZGF0ZXNSZXNvdXJjZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tfVVBEQVRFU19SRVNPVVJDRSwgb2xkVGFza1VwZGF0ZXNSZXNvdXJjZSwgVEFTS19VUERBVEVTX1JFU09VUkNFX0VERUZBVUxULCBvbGRUYXNrVXBkYXRlc1Jlc291cmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRhc2tVcGRhdGVzUmVzb3VyY2VFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmlzY2FsWWVhclN0YXJ0KCkgewotCQlyZXR1cm4gZmlzY2FsWWVhclN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpc2NhbFllYXJTdGFydChib29sZWFuIG5ld0Zpc2NhbFllYXJTdGFydCkgewotCQlib29sZWFuIG9sZEZpc2NhbFllYXJTdGFydCA9IGZpc2NhbFllYXJTdGFydDsKLQkJZmlzY2FsWWVhclN0YXJ0ID0gbmV3RmlzY2FsWWVhclN0YXJ0OwotCQlib29sZWFuIG9sZEZpc2NhbFllYXJTdGFydEVTZXQgPSBmaXNjYWxZZWFyU3RhcnRFU2V0OwotCQlmaXNjYWxZZWFyU3RhcnRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GSVNDQUxfWUVBUl9TVEFSVCwgb2xkRmlzY2FsWWVhclN0YXJ0LCBmaXNjYWxZZWFyU3RhcnQsICFvbGRGaXNjYWxZZWFyU3RhcnRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRGaXNjYWxZZWFyU3RhcnQoKSB7Ci0JCWJvb2xlYW4gb2xkRmlzY2FsWWVhclN0YXJ0ID0gZmlzY2FsWWVhclN0YXJ0OwotCQlib29sZWFuIG9sZEZpc2NhbFllYXJTdGFydEVTZXQgPSBmaXNjYWxZZWFyU3RhcnRFU2V0OwotCQlmaXNjYWxZZWFyU3RhcnQgPSBGSVNDQUxfWUVBUl9TVEFSVF9FREVGQVVMVDsKLQkJZmlzY2FsWWVhclN0YXJ0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklTQ0FMX1lFQVJfU1RBUlQsIG9sZEZpc2NhbFllYXJTdGFydCwgRklTQ0FMX1lFQVJfU1RBUlRfRURFRkFVTFQsIG9sZEZpc2NhbFllYXJTdGFydEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEZpc2NhbFllYXJTdGFydCgpIHsKLQkJcmV0dXJuIGZpc2NhbFllYXJTdGFydEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0V2Vla1N0YXJ0RGF5KCkgewotCQlyZXR1cm4gd2Vla1N0YXJ0RGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlZWtTdGFydERheShCaWdJbnRlZ2VyIG5ld1dlZWtTdGFydERheSkgewotCQlCaWdJbnRlZ2VyIG9sZFdlZWtTdGFydERheSA9IHdlZWtTdGFydERheTsKLQkJd2Vla1N0YXJ0RGF5ID0gbmV3V2Vla1N0YXJ0RGF5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dFRUtfU1RBUlRfREFZLCBvbGRXZWVrU3RhcnREYXksIHdlZWtTdGFydERheSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkgewotCQlyZXR1cm4gbW92ZUNvbXBsZXRlZEVuZHNCYWNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vdmVDb21wbGV0ZWRFbmRzQmFjayhib29sZWFuIG5ld01vdmVDb21wbGV0ZWRFbmRzQmFjaykgewotCQlib29sZWFuIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFjayA9IG1vdmVDb21wbGV0ZWRFbmRzQmFjazsKLQkJbW92ZUNvbXBsZXRlZEVuZHNCYWNrID0gbmV3TW92ZUNvbXBsZXRlZEVuZHNCYWNrOwotCQlib29sZWFuIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFja0VTZXQgPSBtb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0OwotCQltb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0ssIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFjaywgbW92ZUNvbXBsZXRlZEVuZHNCYWNrLCAhb2xkTW92ZUNvbXBsZXRlZEVuZHNCYWNrRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkgewotCQlib29sZWFuIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFjayA9IG1vdmVDb21wbGV0ZWRFbmRzQmFjazsKLQkJYm9vbGVhbiBvbGRNb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0ID0gbW92ZUNvbXBsZXRlZEVuZHNCYWNrRVNldDsKLQkJbW92ZUNvbXBsZXRlZEVuZHNCYWNrID0gTU9WRV9DT01QTEVURURfRU5EU19CQUNLX0VERUZBVUxUOwotCQltb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0ssIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFjaywgTU9WRV9DT01QTEVURURfRU5EU19CQUNLX0VERUZBVUxULCBvbGRNb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soKSB7Ci0JCXJldHVybiBtb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKSB7Ci0JCXJldHVybiBtb3ZlUmVtYWluaW5nU3RhcnRzQmFjazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayhib29sZWFuIG5ld01vdmVSZW1haW5pbmdTdGFydHNCYWNrKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2sgPSBtb3ZlUmVtYWluaW5nU3RhcnRzQmFjazsKLQkJbW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2sgPSBuZXdNb3ZlUmVtYWluaW5nU3RhcnRzQmFjazsKLQkJYm9vbGVhbiBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzQmFja0VTZXQgPSBtb3ZlUmVtYWluaW5nU3RhcnRzQmFja0VTZXQ7Ci0JCW1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0ssIG9sZE1vdmVSZW1haW5pbmdTdGFydHNCYWNrLCBtb3ZlUmVtYWluaW5nU3RhcnRzQmFjaywgIW9sZE1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2sgPSBtb3ZlUmVtYWluaW5nU3RhcnRzQmFjazsKLQkJYm9vbGVhbiBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzQmFja0VTZXQgPSBtb3ZlUmVtYWluaW5nU3RhcnRzQmFja0VTZXQ7Ci0JCW1vdmVSZW1haW5pbmdTdGFydHNCYWNrID0gTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0tfRURFRkFVTFQ7Ci0JCW1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0ssIG9sZE1vdmVSZW1haW5pbmdTdGFydHNCYWNrLCBNT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDS19FREVGQVVMVCwgb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2tFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpIHsKLQkJcmV0dXJuIG1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkgewotCQlyZXR1cm4gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoYm9vbGVhbiBuZXdNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCkgewotCQlib29sZWFuIG9sZE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkID0gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ7Ci0JCW1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkID0gbmV3TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ7Ci0JCWJvb2xlYW4gb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0ID0gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0OwotCQltb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJELCBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCwgbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQsICFvbGRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkgewotCQlib29sZWFuIG9sZE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkID0gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ7Ci0JCWJvb2xlYW4gb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0ID0gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0OwotCQltb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCA9IE1PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJEX0VERUZBVUxUOwotCQltb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJELCBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCwgTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkRfRURFRkFVTFQsIG9sZE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKSB7Ci0JCXJldHVybiBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKSB7Ci0JCXJldHVybiBtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKGJvb2xlYW4gbmV3TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkID0gbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkOwotCQltb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPSBuZXdNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQ7Ci0JCWJvb2xlYW4gb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkRVNldCA9IG1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQ7Ci0JCW1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRCwgb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkLCBtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQsICFvbGRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkID0gbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkOwotCQlib29sZWFuIG9sZE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQgPSBtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmRFU2V0OwotCQltb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPSBNT1ZFX0NPTVBMRVRFRF9FTkRTX0ZPUldBUkRfRURFRkFVTFQ7Ci0JCW1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRCwgb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkLCBNT1ZFX0NPTVBMRVRFRF9FTkRTX0ZPUldBUkRfRURFRkFVTFQsIG9sZE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpIHsKLQkJcmV0dXJuIG1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIGJhc2VsaW5lRm9yRWFybmVkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZShCaWdJbnRlZ2VyIG5ld0Jhc2VsaW5lRm9yRWFybmVkVmFsdWUpIHsKLQkJQmlnSW50ZWdlciBvbGRCYXNlbGluZUZvckVhcm5lZFZhbHVlID0gYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZTsKLQkJYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSA9IG5ld0Jhc2VsaW5lRm9yRWFybmVkVmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRSwgb2xkQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSwgYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkgewotCQlyZXR1cm4gYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyhib29sZWFuIG5ld0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcykgewotCQlib29sZWFuIG9sZEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyA9IGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrczsKLQkJYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzID0gbmV3QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzOwotCQlib29sZWFuIG9sZEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQgPSBhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3NFU2V0OwotCQlhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3NFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLUywgb2xkQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzLCBhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MsICFvbGRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKSB7Ci0JCWJvb2xlYW4gb2xkQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzID0gYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzOwotCQlib29sZWFuIG9sZEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQgPSBhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3NFU2V0OwotCQlhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPSBBVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLU19FREVGQVVMVDsKLQkJYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1MsIG9sZEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcywgQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1NfRURFRkFVTFQsIG9sZEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpIHsKLQkJcmV0dXJuIGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTdGF0dXNEYXRlKCkgewotCQlyZXR1cm4gc3RhdHVzRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGF0dXNEYXRlKE9iamVjdCBuZXdTdGF0dXNEYXRlKSB7Ci0JCU9iamVjdCBvbGRTdGF0dXNEYXRlID0gc3RhdHVzRGF0ZTsKLQkJc3RhdHVzRGF0ZSA9IG5ld1N0YXR1c0RhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBVFVTX0RBVEUsIG9sZFN0YXR1c0RhdGUsIHN0YXR1c0RhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEN1cnJlbnREYXRlKCkgewotCQlyZXR1cm4gY3VycmVudERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudERhdGUoT2JqZWN0IG5ld0N1cnJlbnREYXRlKSB7Ci0JCU9iamVjdCBvbGRDdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlOwotCQljdXJyZW50RGF0ZSA9IG5ld0N1cnJlbnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTlRfREFURSwgb2xkQ3VycmVudERhdGUsIGN1cnJlbnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkgewotCQlyZXR1cm4gbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKGJvb2xlYW4gbmV3TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCkgewotCQlib29sZWFuIG9sZE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPSBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMOwotCQltaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMID0gbmV3TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTDsKLQkJYm9vbGVhbiBvbGRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMRVNldCA9IG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0OwotCQltaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlDUk9TT0ZUX1BST0pFQ1RfU0VSVkVSX1VSTCwgb2xkTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCwgbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCwgIW9sZE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkgewotCQlib29sZWFuIG9sZE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPSBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMOwotCQlib29sZWFuIG9sZE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0ID0gbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTEVTZXQ7Ci0JCW1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPSBNSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMX0VERUZBVUxUOwotCQltaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlDUk9TT0ZUX1BST0pFQ1RfU0VSVkVSX1VSTCwgb2xkTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCwgTUlDUk9TT0ZUX1BST0pFQ1RfU0VSVkVSX1VSTF9FREVGQVVMVCwgb2xkTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKSB7Ci0JCXJldHVybiBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0F1dG9saW5rKCkgewotCQlyZXR1cm4gYXV0b2xpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0b2xpbmsoYm9vbGVhbiBuZXdBdXRvbGluaykgewotCQlib29sZWFuIG9sZEF1dG9saW5rID0gYXV0b2xpbms7Ci0JCWF1dG9saW5rID0gbmV3QXV0b2xpbms7Ci0JCWJvb2xlYW4gb2xkQXV0b2xpbmtFU2V0ID0gYXV0b2xpbmtFU2V0OwotCQlhdXRvbGlua0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9MSU5LLCBvbGRBdXRvbGluaywgYXV0b2xpbmssICFvbGRBdXRvbGlua0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEF1dG9saW5rKCkgewotCQlib29sZWFuIG9sZEF1dG9saW5rID0gYXV0b2xpbms7Ci0JCWJvb2xlYW4gb2xkQXV0b2xpbmtFU2V0ID0gYXV0b2xpbmtFU2V0OwotCQlhdXRvbGluayA9IEFVVE9MSU5LX0VERUZBVUxUOwotCQlhdXRvbGlua0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9MSU5LLCBvbGRBdXRvbGluaywgQVVUT0xJTktfRURFRkFVTFQsIG9sZEF1dG9saW5rRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QXV0b2xpbmsoKSB7Ci0JCXJldHVybiBhdXRvbGlua0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TmV3VGFza1N0YXJ0RGF0ZSgpIHsKLQkJcmV0dXJuIG5ld1Rhc2tTdGFydERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmV3VGFza1N0YXJ0RGF0ZShCaWdJbnRlZ2VyIG5ld05ld1Rhc2tTdGFydERhdGUpIHsKLQkJQmlnSW50ZWdlciBvbGROZXdUYXNrU3RhcnREYXRlID0gbmV3VGFza1N0YXJ0RGF0ZTsKLQkJbmV3VGFza1N0YXJ0RGF0ZSA9IG5ld05ld1Rhc2tTdGFydERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tfU1RBUlRfREFURSwgb2xkTmV3VGFza1N0YXJ0RGF0ZSwgbmV3VGFza1N0YXJ0RGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldERlZmF1bHRUYXNrRVZNZXRob2QoKSB7Ci0JCXJldHVybiBkZWZhdWx0VGFza0VWTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRUYXNrRVZNZXRob2QoQmlnSW50ZWdlciBuZXdEZWZhdWx0VGFza0VWTWV0aG9kKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRGVmYXVsdFRhc2tFVk1ldGhvZCA9IGRlZmF1bHRUYXNrRVZNZXRob2Q7Ci0JCWRlZmF1bHRUYXNrRVZNZXRob2QgPSBuZXdEZWZhdWx0VGFza0VWTWV0aG9kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfVEFTS19FVl9NRVRIT0QsIG9sZERlZmF1bHRUYXNrRVZNZXRob2QsIGRlZmF1bHRUYXNrRVZNZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkgewotCQlyZXR1cm4gcHJvamVjdEV4dGVybmFsbHlFZGl0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoYm9vbGVhbiBuZXdQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCkgewotCQlib29sZWFuIG9sZFByb2plY3RFeHRlcm5hbGx5RWRpdGVkID0gcHJvamVjdEV4dGVybmFsbHlFZGl0ZWQ7Ci0JCXByb2plY3RFeHRlcm5hbGx5RWRpdGVkID0gbmV3UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQ7Ci0JCWJvb2xlYW4gb2xkUHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0ID0gcHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0OwotCQlwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1BST0pFQ1RfRVhURVJOQUxMWV9FRElURUQsIG9sZFByb2plY3RFeHRlcm5hbGx5RWRpdGVkLCBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCwgIW9sZFByb2plY3RFeHRlcm5hbGx5RWRpdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKSB7Ci0JCWJvb2xlYW4gb2xkUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPSBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZDsKLQkJYm9vbGVhbiBvbGRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQgPSBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQ7Ci0JCXByb2plY3RFeHRlcm5hbGx5RWRpdGVkID0gUFJPSkVDVF9FWFRFUk5BTExZX0VESVRFRF9FREVGQVVMVDsKLQkJcHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19QUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVELCBvbGRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCwgUFJPSkVDVF9FWFRFUk5BTExZX0VESVRFRF9FREVGQVVMVCwgb2xkUHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpIHsKLQkJcmV0dXJuIHByb2plY3RFeHRlcm5hbGx5RWRpdGVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEV4dGVuZGVkQ3JlYXRpb25EYXRlKCkgewotCQlyZXR1cm4gZXh0ZW5kZWRDcmVhdGlvbkRhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoT2JqZWN0IG5ld0V4dGVuZGVkQ3JlYXRpb25EYXRlKSB7Ci0JCU9iamVjdCBvbGRFeHRlbmRlZENyZWF0aW9uRGF0ZSA9IGV4dGVuZGVkQ3JlYXRpb25EYXRlOwotCQlleHRlbmRlZENyZWF0aW9uRGF0ZSA9IG5ld0V4dGVuZGVkQ3JlYXRpb25EYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0NSRUFUSU9OX0RBVEUsIG9sZEV4dGVuZGVkQ3JlYXRpb25EYXRlLCBleHRlbmRlZENyZWF0aW9uRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWN0dWFsc0luU3luYygpIHsKLQkJcmV0dXJuIGFjdHVhbHNJblN5bmM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsc0luU3luYyhib29sZWFuIG5ld0FjdHVhbHNJblN5bmMpIHsKLQkJYm9vbGVhbiBvbGRBY3R1YWxzSW5TeW5jID0gYWN0dWFsc0luU3luYzsKLQkJYWN0dWFsc0luU3luYyA9IG5ld0FjdHVhbHNJblN5bmM7Ci0JCWJvb2xlYW4gb2xkQWN0dWFsc0luU3luY0VTZXQgPSBhY3R1YWxzSW5TeW5jRVNldDsKLQkJYWN0dWFsc0luU3luY0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FDVFVBTFNfSU5fU1lOQywgb2xkQWN0dWFsc0luU3luYywgYWN0dWFsc0luU3luYywgIW9sZEFjdHVhbHNJblN5bmNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBY3R1YWxzSW5TeW5jKCkgewotCQlib29sZWFuIG9sZEFjdHVhbHNJblN5bmMgPSBhY3R1YWxzSW5TeW5jOwotCQlib29sZWFuIG9sZEFjdHVhbHNJblN5bmNFU2V0ID0gYWN0dWFsc0luU3luY0VTZXQ7Ci0JCWFjdHVhbHNJblN5bmMgPSBBQ1RVQUxTX0lOX1NZTkNfRURFRkFVTFQ7Ci0JCWFjdHVhbHNJblN5bmNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BQ1RVQUxTX0lOX1NZTkMsIG9sZEFjdHVhbHNJblN5bmMsIEFDVFVBTFNfSU5fU1lOQ19FREVGQVVMVCwgb2xkQWN0dWFsc0luU3luY0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEFjdHVhbHNJblN5bmMoKSB7Ci0JCXJldHVybiBhY3R1YWxzSW5TeW5jRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gcmVtb3ZlRmlsZVByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoYm9vbGVhbiBuZXdSZW1vdmVGaWxlUHJvcGVydGllcykgewotCQlib29sZWFuIG9sZFJlbW92ZUZpbGVQcm9wZXJ0aWVzID0gcmVtb3ZlRmlsZVByb3BlcnRpZXM7Ci0JCXJlbW92ZUZpbGVQcm9wZXJ0aWVzID0gbmV3UmVtb3ZlRmlsZVByb3BlcnRpZXM7Ci0JCWJvb2xlYW4gb2xkUmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0ID0gcmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0OwotCQlyZW1vdmVGaWxlUHJvcGVydGllc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFTU9WRV9GSUxFX1BST1BFUlRJRVMsIG9sZFJlbW92ZUZpbGVQcm9wZXJ0aWVzLCByZW1vdmVGaWxlUHJvcGVydGllcywgIW9sZFJlbW92ZUZpbGVQcm9wZXJ0aWVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoKSB7Ci0JCWJvb2xlYW4gb2xkUmVtb3ZlRmlsZVByb3BlcnRpZXMgPSByZW1vdmVGaWxlUHJvcGVydGllczsKLQkJYm9vbGVhbiBvbGRSZW1vdmVGaWxlUHJvcGVydGllc0VTZXQgPSByZW1vdmVGaWxlUHJvcGVydGllc0VTZXQ7Ci0JCXJlbW92ZUZpbGVQcm9wZXJ0aWVzID0gUkVNT1ZFX0ZJTEVfUFJPUEVSVElFU19FREVGQVVMVDsKLQkJcmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRU1PVkVfRklMRV9QUk9QRVJUSUVTLCBvbGRSZW1vdmVGaWxlUHJvcGVydGllcywgUkVNT1ZFX0ZJTEVfUFJPUEVSVElFU19FREVGQVVMVCwgb2xkUmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZW1vdmVGaWxlUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHJlbW92ZUZpbGVQcm9wZXJ0aWVzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkbWluUHJvamVjdCgpIHsKLQkJcmV0dXJuIGFkbWluUHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZG1pblByb2plY3QoYm9vbGVhbiBuZXdBZG1pblByb2plY3QpIHsKLQkJYm9vbGVhbiBvbGRBZG1pblByb2plY3QgPSBhZG1pblByb2plY3Q7Ci0JCWFkbWluUHJvamVjdCA9IG5ld0FkbWluUHJvamVjdDsKLQkJYm9vbGVhbiBvbGRBZG1pblByb2plY3RFU2V0ID0gYWRtaW5Qcm9qZWN0RVNldDsKLQkJYWRtaW5Qcm9qZWN0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQURNSU5fUFJPSkVDVCwgb2xkQWRtaW5Qcm9qZWN0LCBhZG1pblByb2plY3QsICFvbGRBZG1pblByb2plY3RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBZG1pblByb2plY3QoKSB7Ci0JCWJvb2xlYW4gb2xkQWRtaW5Qcm9qZWN0ID0gYWRtaW5Qcm9qZWN0OwotCQlib29sZWFuIG9sZEFkbWluUHJvamVjdEVTZXQgPSBhZG1pblByb2plY3RFU2V0OwotCQlhZG1pblByb2plY3QgPSBBRE1JTl9QUk9KRUNUX0VERUZBVUxUOwotCQlhZG1pblByb2plY3RFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BRE1JTl9QUk9KRUNULCBvbGRBZG1pblByb2plY3QsIEFETUlOX1BST0pFQ1RfRURFRkFVTFQsIG9sZEFkbWluUHJvamVjdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEFkbWluUHJvamVjdCgpIHsKLQkJcmV0dXJuIGFkbWluUHJvamVjdEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGxpbmVDb2RlcyBnZXRPdXRsaW5lQ29kZXMoKSB7Ci0JCXJldHVybiBvdXRsaW5lQ29kZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0T3V0bGluZUNvZGVzKE91dGxpbmVDb2RlcyBuZXdPdXRsaW5lQ29kZXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJT3V0bGluZUNvZGVzIG9sZE91dGxpbmVDb2RlcyA9IG91dGxpbmVDb2RlczsKLQkJb3V0bGluZUNvZGVzID0gbmV3T3V0bGluZUNvZGVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX09VVExJTkVfQ09ERVMsIG9sZE91dGxpbmVDb2RlcywgbmV3T3V0bGluZUNvZGVzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdXRsaW5lQ29kZXMoT3V0bGluZUNvZGVzIG5ld091dGxpbmVDb2RlcykgewotCQlpZiAobmV3T3V0bGluZUNvZGVzICE9IG91dGxpbmVDb2RlcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAob3V0bGluZUNvZGVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW91dGxpbmVDb2RlcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fT1VUTElORV9DT0RFUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3T3V0bGluZUNvZGVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld091dGxpbmVDb2RlcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fT1VUTElORV9DT0RFUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRPdXRsaW5lQ29kZXMobmV3T3V0bGluZUNvZGVzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fT1VUTElORV9DT0RFUywgbmV3T3V0bGluZUNvZGVzLCBuZXdPdXRsaW5lQ29kZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV0JTTWFza3MgZ2V0V0JTTWFza3MoKSB7Ci0JCXJldHVybiB3QlNNYXNrczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXQlNNYXNrcyhXQlNNYXNrcyBuZXdXQlNNYXNrcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlXQlNNYXNrcyBvbGRXQlNNYXNrcyA9IHdCU01hc2tzOwotCQl3QlNNYXNrcyA9IG5ld1dCU01hc2tzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dCU19NQVNLUywgb2xkV0JTTWFza3MsIG5ld1dCU01hc2tzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXQlNNYXNrcyhXQlNNYXNrcyBuZXdXQlNNYXNrcykgewotCQlpZiAobmV3V0JTTWFza3MgIT0gd0JTTWFza3MpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHdCU01hc2tzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXdCU01hc2tzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XQlNfTUFTS1MsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1dCU01hc2tzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dCU01hc2tzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XQlNfTUFTS1MsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V0JTTWFza3MobmV3V0JTTWFza3MsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XQlNfTUFTS1MsIG5ld1dCU01hc2tzLCBuZXdXQlNNYXNrcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeHRlbmRlZEF0dHJpYnV0ZXMgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEV4dGVuZGVkQXR0cmlidXRlcyhFeHRlbmRlZEF0dHJpYnV0ZXMgbmV3RXh0ZW5kZWRBdHRyaWJ1dGVzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUV4dGVuZGVkQXR0cmlidXRlcyBvbGRFeHRlbmRlZEF0dHJpYnV0ZXMgPSBleHRlbmRlZEF0dHJpYnV0ZXM7Ci0JCWV4dGVuZGVkQXR0cmlidXRlcyA9IG5ld0V4dGVuZGVkQXR0cmlidXRlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FWFRFTkRFRF9BVFRSSUJVVEVTLCBvbGRFeHRlbmRlZEF0dHJpYnV0ZXMsIG5ld0V4dGVuZGVkQXR0cmlidXRlcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKEV4dGVuZGVkQXR0cmlidXRlcyBuZXdFeHRlbmRlZEF0dHJpYnV0ZXMpIHsKLQkJaWYgKG5ld0V4dGVuZGVkQXR0cmlidXRlcyAhPSBleHRlbmRlZEF0dHJpYnV0ZXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGV4dGVuZGVkQXR0cmlidXRlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClleHRlbmRlZEF0dHJpYnV0ZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0V4dGVuZGVkQXR0cmlidXRlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFeHRlbmRlZEF0dHJpYnV0ZXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKG5ld0V4dGVuZGVkQXR0cmlidXRlcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVMsIG5ld0V4dGVuZGVkQXR0cmlidXRlcywgbmV3RXh0ZW5kZWRBdHRyaWJ1dGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhbGVuZGFycyBnZXRDYWxlbmRhcnMoKSB7Ci0JCXJldHVybiBjYWxlbmRhcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2FsZW5kYXJzKENhbGVuZGFycyBuZXdDYWxlbmRhcnMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ2FsZW5kYXJzIG9sZENhbGVuZGFycyA9IGNhbGVuZGFyczsKLQkJY2FsZW5kYXJzID0gbmV3Q2FsZW5kYXJzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSUywgb2xkQ2FsZW5kYXJzLCBuZXdDYWxlbmRhcnMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhbGVuZGFycyhDYWxlbmRhcnMgbmV3Q2FsZW5kYXJzKSB7Ci0JCWlmIChuZXdDYWxlbmRhcnMgIT0gY2FsZW5kYXJzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjYWxlbmRhcnMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY2FsZW5kYXJzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUlMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NhbGVuZGFycyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDYWxlbmRhcnMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDYWxlbmRhcnMobmV3Q2FsZW5kYXJzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJTLCBuZXdDYWxlbmRhcnMsIG5ld0NhbGVuZGFycykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrcyBnZXRUYXNrcygpIHsKLQkJcmV0dXJuIHRhc2tzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFRhc2tzKFRhc2tzIG5ld1Rhc2tzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVRhc2tzIG9sZFRhc2tzID0gdGFza3M7Ci0JCXRhc2tzID0gbmV3VGFza3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS1MsIG9sZFRhc2tzLCBuZXdUYXNrcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFza3MoVGFza3MgbmV3VGFza3MpIHsKLQkJaWYgKG5ld1Rhc2tzICE9IHRhc2tzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh0YXNrcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0YXNrcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS1MsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Rhc2tzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Rhc2tzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRUYXNrcyhuZXdUYXNrcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tTLCBuZXdUYXNrcywgbmV3VGFza3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VzIGdldFJlc291cmNlcygpIHsKLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZXNvdXJjZXMoUmVzb3VyY2VzIG5ld1Jlc291cmNlcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlSZXNvdXJjZXMgb2xkUmVzb3VyY2VzID0gcmVzb3VyY2VzOwotCQlyZXNvdXJjZXMgPSBuZXdSZXNvdXJjZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTLCBvbGRSZXNvdXJjZXMsIG5ld1Jlc291cmNlcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VzKFJlc291cmNlcyBuZXdSZXNvdXJjZXMpIHsKLQkJaWYgKG5ld1Jlc291cmNlcyAhPSByZXNvdXJjZXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJlc291cmNlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZXNvdXJjZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFU09VUkNFUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmVzb3VyY2VzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Jlc291cmNlcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJlc291cmNlcyhuZXdSZXNvdXJjZXMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRVNPVVJDRVMsIG5ld1Jlc291cmNlcywgbmV3UmVzb3VyY2VzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFzc2lnbm1lbnRzIGdldEFzc2lnbm1lbnRzKCkgewotCQlyZXR1cm4gYXNzaWdubWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QXNzaWdubWVudHMoQXNzaWdubWVudHMgbmV3QXNzaWdubWVudHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQXNzaWdubWVudHMgb2xkQXNzaWdubWVudHMgPSBhc3NpZ25tZW50czsKLQkJYXNzaWdubWVudHMgPSBuZXdBc3NpZ25tZW50czsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BU1NJR05NRU5UUywgb2xkQXNzaWdubWVudHMsIG5ld0Fzc2lnbm1lbnRzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBc3NpZ25tZW50cyhBc3NpZ25tZW50cyBuZXdBc3NpZ25tZW50cykgewotCQlpZiAobmV3QXNzaWdubWVudHMgIT0gYXNzaWdubWVudHMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFzc2lnbm1lbnRzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFzc2lnbm1lbnRzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BU1NJR05NRU5UUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QXNzaWdubWVudHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QXNzaWdubWVudHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FTU0lHTk1FTlRTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFzc2lnbm1lbnRzKG5ld0Fzc2lnbm1lbnRzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVNTSUdOTUVOVFMsIG5ld0Fzc2lnbm1lbnRzLCBuZXdBc3NpZ25tZW50cykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19PVVRMSU5FX0NPREVTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRPdXRsaW5lQ29kZXMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dCU19NQVNLUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0V0JTTWFza3MobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVM6Ci0JCQkJCXJldHVybiBiYXNpY1NldEV4dGVuZGVkQXR0cmlidXRlcyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRDYWxlbmRhcnMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRUYXNrcyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRSZXNvdXJjZXMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FTU0lHTk1FTlRTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRBc3NpZ25tZW50cyhudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19USVRMRToKLQkJCQlyZXR1cm4gZ2V0VGl0bGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVUJKRUNUOgotCQkJCXJldHVybiBnZXRTdWJqZWN0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGdldENhdGVnb3J5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ09NUEFOWToKLQkJCQlyZXR1cm4gZ2V0Q29tcGFueSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01BTkFHRVI6Ci0JCQkJcmV0dXJuIGdldE1hbmFnZXIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRIT1I6Ci0JCQkJcmV0dXJuIGdldEF1dGhvcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJcmV0dXJuIGdldENyZWF0aW9uRGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFVklTSU9OOgotCQkJCXJldHVybiBnZXRSZXZpc2lvbigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0xBU1RfU0FWRUQ6Ci0JCQkJcmV0dXJuIGdldExhc3RTYXZlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NDSEVEVUxFX0ZST01fU1RBUlQ6Ci0JCQkJcmV0dXJuIGlzU2NoZWR1bGVGcm9tU3RhcnQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBUlRfREFURToKLQkJCQlyZXR1cm4gZ2V0U3RhcnREYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklOSVNIX0RBVEU6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaERhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GWVNUQVJUX0RBVEU6Ci0JCQkJcmV0dXJuIGdldEZZU3RhcnREYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1JJVElDQUxfU0xBQ0tfTElNSVQ6Ci0JCQkJcmV0dXJuIGdldENyaXRpY2FsU2xhY2tMaW1pdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX0RJR0lUUzoKLQkJCQlyZXR1cm4gZ2V0Q3VycmVuY3lEaWdpdHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9TWU1CT0w6Ci0JCQkJcmV0dXJuIGdldEN1cnJlbmN5U3ltYm9sKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OOgotCQkJCXJldHVybiBnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBnZXRDYWxlbmRhclVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBUlRfVElNRToKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFN0YXJ0VGltZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfRklOSVNIX1RJTUU6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRGaW5pc2hUaW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlOVVRFU19QRVJfREFZOgotCQkJCXJldHVybiBnZXRNaW51dGVzUGVyRGF5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlOVVRFU19QRVJfV0VFSzoKLQkJCQlyZXR1cm4gZ2V0TWludXRlc1BlcldlZWsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EQVlTX1BFUl9NT05USDoKLQkJCQlyZXR1cm4gZ2V0RGF5c1Blck1vbnRoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9UQVNLX1RZUEU6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRUYXNrVHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMOgotCQkJCXJldHVybiBnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBTkRBUkRfUkFURToKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldERlZmF1bHRTdGFuZGFyZFJhdGUoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9PVkVSVElNRV9SQVRFOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldER1cmF0aW9uRm9ybWF0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV09SS19GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldFdvcmtGb3JtYXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FRElUQUJMRV9BQ1RVQUxfQ09TVFM6Ci0JCQkJcmV0dXJuIGlzRWRpdGFibGVBY3R1YWxDb3N0cygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19IT05PUl9DT05TVFJBSU5UUzoKLQkJCQlyZXR1cm4gaXNIb25vckNvbnN0cmFpbnRzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGdldEVhcm5lZFZhbHVlTWV0aG9kKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSU5TRVJURURfUFJPSkVDVFNfTElLRV9TVU1NQVJZOgotCQkJCXJldHVybiBpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NVUxUSVBMRV9DUklUSUNBTF9QQVRIUzoKLQkJCQlyZXR1cm4gaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tTX0VGRk9SVF9EUklWRU46Ci0JCQkJcmV0dXJuIGlzTmV3VGFza3NFZmZvcnREcml2ZW4oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tTX0VTVElNQVRFRDoKLQkJCQlyZXR1cm4gaXNOZXdUYXNrc0VzdGltYXRlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUExJVFNfSU5fUFJPR1JFU1NfVEFTS1M6Ci0JCQkJcmV0dXJuIGlzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQUkVBRF9BQ1RVQUxfQ09TVDoKLQkJCQlyZXR1cm4gaXNTcHJlYWRBY3R1YWxDb3N0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQUkVBRF9QRVJDRU5UX0NPTVBMRVRFOgotCQkJCXJldHVybiBpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLX1VQREFURVNfUkVTT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzVGFza1VwZGF0ZXNSZXNvdXJjZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GSVNDQUxfWUVBUl9TVEFSVDoKLQkJCQlyZXR1cm4gaXNGaXNjYWxZZWFyU3RhcnQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV0VFS19TVEFSVF9EQVk6Ci0JCQkJcmV0dXJuIGdldFdlZWtTdGFydERheSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfQkFDSzoKLQkJCQlyZXR1cm4gaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0s6Ci0JCQkJcmV0dXJuIGlzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkQ6Ci0JCQkJcmV0dXJuIGlzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19GT1JXQVJEOgotCQkJCXJldHVybiBpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19CQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFOgotCQkJCXJldHVybiBnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1M6Ci0JCQkJcmV0dXJuIGlzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NUQVRVU19EQVRFOgotCQkJCXJldHVybiBnZXRTdGF0dXNEYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOVF9EQVRFOgotCQkJCXJldHVybiBnZXRDdXJyZW50RGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01JQ1JPU09GVF9QUk9KRUNUX1NFUlZFUl9VUkw6Ci0JCQkJcmV0dXJuIGlzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRPTElOSzoKLQkJCQlyZXR1cm4gaXNBdXRvbGluaygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS19TVEFSVF9EQVRFOgotCQkJCXJldHVybiBnZXROZXdUYXNrU3RhcnREYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9UQVNLX0VWX01FVEhPRDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1BST0pFQ1RfRVhURVJOQUxMWV9FRElURUQ6Ci0JCQkJcmV0dXJuIGlzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQ1JFQVRJT05fREFURToKLQkJCQlyZXR1cm4gZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BQ1RVQUxTX0lOX1NZTkM6Ci0JCQkJcmV0dXJuIGlzQWN0dWFsc0luU3luYygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRU1PVkVfRklMRV9QUk9QRVJUSUVTOgotCQkJCXJldHVybiBpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FETUlOX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGlzQWRtaW5Qcm9qZWN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX09VVExJTkVfQ09ERVM6Ci0JCQkJcmV0dXJuIGdldE91dGxpbmVDb2RlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dCU19NQVNLUzoKLQkJCQlyZXR1cm4gZ2V0V0JTTWFza3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FWFRFTkRFRF9BVFRSSUJVVEVTOgotCQkJCXJldHVybiBnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUlM6Ci0JCQkJcmV0dXJuIGdldENhbGVuZGFycygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tTOgotCQkJCXJldHVybiBnZXRUYXNrcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFU09VUkNFUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVNTSUdOTUVOVFM6Ci0JCQkJcmV0dXJuIGdldEFzc2lnbm1lbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1VJRDoKLQkJCQlzZXRVSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVElUTEU6Ci0JCQkJc2V0VGl0bGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NVQkpFQ1Q6Ci0JCQkJc2V0U3ViamVjdCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FURUdPUlk6Ci0JCQkJc2V0Q2F0ZWdvcnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NPTVBBTlk6Ci0JCQkJc2V0Q29tcGFueSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUFOQUdFUjoKLQkJCQlzZXRNYW5hZ2VyKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRIT1I6Ci0JCQkJc2V0QXV0aG9yKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DUkVBVElPTl9EQVRFOgotCQkJCXNldENyZWF0aW9uRGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVWSVNJT046Ci0JCQkJc2V0UmV2aXNpb24oKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19MQVNUX1NBVkVEOgotCQkJCXNldExhc3RTYXZlZCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU0NIRURVTEVfRlJPTV9TVEFSVDoKLQkJCQlzZXRTY2hlZHVsZUZyb21TdGFydCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBUlRfREFURToKLQkJCQlzZXRTdGFydERhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZJTklTSF9EQVRFOgotCQkJCXNldEZpbmlzaERhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZZU1RBUlRfREFURToKLQkJCQlzZXRGWVN0YXJ0RGF0ZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSSVRJQ0FMX1NMQUNLX0xJTUlUOgotCQkJCXNldENyaXRpY2FsU2xhY2tMaW1pdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX0RJR0lUUzoKLQkJCQlzZXRDdXJyZW5jeURpZ2l0cygoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX1NZTUJPTDoKLQkJCQlzZXRDdXJyZW5jeVN5bWJvbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OOgotCQkJCXNldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUl9VSUQ6Ci0JCQkJc2V0Q2FsZW5kYXJVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1NUQVJUX1RJTUU6Ci0JCQkJc2V0RGVmYXVsdFN0YXJ0VGltZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9GSU5JU0hfVElNRToKLQkJCQlzZXREZWZhdWx0RmluaXNoVGltZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlOVVRFU19QRVJfREFZOgotCQkJCXNldE1pbnV0ZXNQZXJEYXkoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9XRUVLOgotCQkJCXNldE1pbnV0ZXNQZXJXZWVrKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREFZU19QRVJfTU9OVEg6Ci0JCQkJc2V0RGF5c1Blck1vbnRoKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9UQVNLX1RZUEU6Ci0JCQkJc2V0RGVmYXVsdFRhc2tUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUw6Ci0JCQkJc2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1NUQU5EQVJEX1JBVEU6Ci0JCQkJc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX09WRVJUSU1FX1JBVEU6Ci0JCQkJc2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XT1JLX0ZPUk1BVDoKLQkJCQlzZXRXb3JrRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRURJVEFCTEVfQUNUVUFMX0NPU1RTOgotCQkJCXNldEVkaXRhYmxlQWN0dWFsQ29zdHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0hPTk9SX0NPTlNUUkFJTlRTOgotCQkJCXNldEhvbm9yQ29uc3RyYWludHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJc2V0RWFybmVkVmFsdWVNZXRob2QoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19JTlNFUlRFRF9QUk9KRUNUU19MSUtFX1NVTU1BUlk6Ci0JCQkJc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NVUxUSVBMRV9DUklUSUNBTF9QQVRIUzoKLQkJCQlzZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FRkZPUlRfRFJJVkVOOgotCQkJCXNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS1NfRVNUSU1BVEVEOgotCQkJCXNldE5ld1Rhc2tzRXN0aW1hdGVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUExJVFNfSU5fUFJPR1JFU1NfVEFTS1M6Ci0JCQkJc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfQUNUVUFMX0NPU1Q6Ci0JCQkJc2V0U3ByZWFkQWN0dWFsQ29zdCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLX1VQREFURVNfUkVTT1VSQ0U6Ci0JCQkJc2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklTQ0FMX1lFQVJfU1RBUlQ6Ci0JCQkJc2V0RmlzY2FsWWVhclN0YXJ0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XRUVLX1NUQVJUX0RBWToKLQkJCQlzZXRXZWVrU3RhcnREYXkoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0s6Ci0JCQkJc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDSzoKLQkJCQlzZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkQ6Ci0JCQkJc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRDoKLQkJCQlzZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0JBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUU6Ci0JCQkJc2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9fQUREX05FV19SRVNPVVJDRVNfQU5EX1RBU0tTOgotCQkJCXNldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBVFVTX0RBVEU6Ci0JCQkJc2V0U3RhdHVzRGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOVF9EQVRFOgotCQkJCXNldEN1cnJlbnREYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMOgotCQkJCXNldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9MSU5LOgotCQkJCXNldEF1dG9saW5rKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS19TVEFSVF9EQVRFOgotCQkJCXNldE5ld1Rhc2tTdGFydERhdGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfRVZfTUVUSE9EOgotCQkJCXNldERlZmF1bHRUYXNrRVZNZXRob2QoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19QUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEOgotCQkJCXNldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FWFRFTkRFRF9DUkVBVElPTl9EQVRFOgotCQkJCXNldEV4dGVuZGVkQ3JlYXRpb25EYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BQ1RVQUxTX0lOX1NZTkM6Ci0JCQkJc2V0QWN0dWFsc0luU3luYygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVNT1ZFX0ZJTEVfUFJPUEVSVElFUzoKLQkJCQlzZXRSZW1vdmVGaWxlUHJvcGVydGllcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQURNSU5fUFJPSkVDVDoKLQkJCQlzZXRBZG1pblByb2plY3QoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX09VVExJTkVfQ09ERVM6Ci0JCQkJc2V0T3V0bGluZUNvZGVzKChPdXRsaW5lQ29kZXMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XQlNfTUFTS1M6Ci0JCQkJc2V0V0JTTWFza3MoKFdCU01hc2tzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQVRUUklCVVRFUzoKLQkJCQlzZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKEV4dGVuZGVkQXR0cmlidXRlcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSUzoKLQkJCQlzZXRDYWxlbmRhcnMoKENhbGVuZGFycyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tTOgotCQkJCXNldFRhc2tzKChUYXNrcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFU09VUkNFUzoKLQkJCQlzZXRSZXNvdXJjZXMoKFJlc291cmNlcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FTU0lHTk1FTlRTOgotCQkJCXNldEFzc2lnbm1lbnRzKChBc3NpZ25tZW50cyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVElUTEU6Ci0JCQkJc2V0VGl0bGUoVElUTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVUJKRUNUOgotCQkJCXNldFN1YmplY3QoU1VCSkVDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBVEVHT1JZOgotCQkJCXNldENhdGVnb3J5KENBVEVHT1JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ09NUEFOWToKLQkJCQlzZXRDb21wYW55KENPTVBBTllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NQU5BR0VSOgotCQkJCXNldE1hbmFnZXIoTUFOQUdFUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVEhPUjoKLQkJCQlzZXRBdXRob3IoQVVUSE9SX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1JFQVRJT05fREFURToKLQkJCQlzZXRDcmVhdGlvbkRhdGUoQ1JFQVRJT05fREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFVklTSU9OOgotCQkJCXNldFJldmlzaW9uKFJFVklTSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTEFTVF9TQVZFRDoKLQkJCQlzZXRMYXN0U2F2ZWQoTEFTVF9TQVZFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NDSEVEVUxFX0ZST01fU1RBUlQ6Ci0JCQkJdW5zZXRTY2hlZHVsZUZyb21TdGFydCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVEFSVF9EQVRFOgotCQkJCXNldFN0YXJ0RGF0ZShTVEFSVF9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklOSVNIX0RBVEU6Ci0JCQkJc2V0RmluaXNoRGF0ZShGSU5JU0hfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZZU1RBUlRfREFURToKLQkJCQlzZXRGWVN0YXJ0RGF0ZShGWVNUQVJUX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DUklUSUNBTF9TTEFDS19MSU1JVDoKLQkJCQlzZXRDcml0aWNhbFNsYWNrTGltaXQoQ1JJVElDQUxfU0xBQ0tfTElNSVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9ESUdJVFM6Ci0JCQkJc2V0Q3VycmVuY3lEaWdpdHMoQ1VSUkVOQ1lfRElHSVRTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MOgotCQkJCXNldEN1cnJlbmN5U3ltYm9sKENVUlJFTkNZX1NZTUJPTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX1NZTUJPTF9QT1NJVElPTjoKLQkJCQlzZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKENVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSX1VJRDoKLQkJCQlzZXRDYWxlbmRhclVJRChDQUxFTkRBUl9VSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1NUQVJUX1RJTUU6Ci0JCQkJc2V0RGVmYXVsdFN0YXJ0VGltZShERUZBVUxUX1NUQVJUX1RJTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJTklTSF9USU1FOgotCQkJCXNldERlZmF1bHRGaW5pc2hUaW1lKERFRkFVTFRfRklOSVNIX1RJTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9EQVk6Ci0JCQkJc2V0TWludXRlc1BlckRheShNSU5VVEVTX1BFUl9EQVlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9XRUVLOgotCQkJCXNldE1pbnV0ZXNQZXJXZWVrKE1JTlVURVNfUEVSX1dFRUtfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EQVlTX1BFUl9NT05USDoKLQkJCQlzZXREYXlzUGVyTW9udGgoREFZU19QRVJfTU9OVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfVFlQRToKLQkJCQl1bnNldERlZmF1bHRUYXNrVHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlzZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbChERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBTkRBUkRfUkFURToKLQkJCQl1bnNldERlZmF1bHRTdGFuZGFyZFJhdGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9PVkVSVElNRV9SQVRFOgotCQkJCXVuc2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoRFVSQVRJT05fRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV09SS19GT1JNQVQ6Ci0JCQkJc2V0V29ya0Zvcm1hdChXT1JLX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VESVRBQkxFX0FDVFVBTF9DT1NUUzoKLQkJCQl1bnNldEVkaXRhYmxlQWN0dWFsQ29zdHMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSE9OT1JfQ09OU1RSQUlOVFM6Ci0JCQkJdW5zZXRIb25vckNvbnN0cmFpbnRzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJc2V0RWFybmVkVmFsdWVNZXRob2QoRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0lOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWToKLQkJCQl1bnNldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NVUxUSVBMRV9DUklUSUNBTF9QQVRIUzoKLQkJCQl1bnNldE11bHRpcGxlQ3JpdGljYWxQYXRocygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS1NfRUZGT1JUX0RSSVZFTjoKLQkJCQl1bnNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FU1RJTUFURUQ6Ci0JCQkJdW5zZXROZXdUYXNrc0VzdGltYXRlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUExJVFNfSU5fUFJPR1JFU1NfVEFTS1M6Ci0JCQkJdW5zZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX0FDVFVBTF9DT1NUOgotCQkJCXVuc2V0U3ByZWFkQWN0dWFsQ29zdCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfUEVSQ0VOVF9DT01QTEVURToKLQkJCQl1bnNldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLX1VQREFURVNfUkVTT1VSQ0U6Ci0JCQkJdW5zZXRUYXNrVXBkYXRlc1Jlc291cmNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZJU0NBTF9ZRUFSX1NUQVJUOgotCQkJCXVuc2V0RmlzY2FsWWVhclN0YXJ0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dFRUtfU1RBUlRfREFZOgotCQkJCXNldFdlZWtTdGFydERheShXRUVLX1NUQVJUX0RBWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfQkFDSzoKLQkJCQl1bnNldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDSzoKLQkJCQl1bnNldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJEOgotCQkJCXVuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19GT1JXQVJEOgotCQkJCXVuc2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0JBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUU6Ci0JCQkJc2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZShCQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1M6Ci0JCQkJdW5zZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBVFVTX0RBVEU6Ci0JCQkJc2V0U3RhdHVzRGF0ZShTVEFUVVNfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTlRfREFURToKLQkJCQlzZXRDdXJyZW50RGF0ZShDVVJSRU5UX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMOgotCQkJCXVuc2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRPTElOSzoKLQkJCQl1bnNldEF1dG9saW5rKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLX1NUQVJUX0RBVEU6Ci0JCQkJc2V0TmV3VGFza1N0YXJ0RGF0ZShORVdfVEFTS19TVEFSVF9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9UQVNLX0VWX01FVEhPRDoKLQkJCQlzZXREZWZhdWx0VGFza0VWTWV0aG9kKERFRkFVTFRfVEFTS19FVl9NRVRIT0RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19QUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEOgotCQkJCXVuc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQ1JFQVRJT05fREFURToKLQkJCQlzZXRFeHRlbmRlZENyZWF0aW9uRGF0ZShFWFRFTkRFRF9DUkVBVElPTl9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQUNUVUFMU19JTl9TWU5DOgotCQkJCXVuc2V0QWN0dWFsc0luU3luYygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRU1PVkVfRklMRV9QUk9QRVJUSUVTOgotCQkJCXVuc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQURNSU5fUFJPSkVDVDoKLQkJCQl1bnNldEFkbWluUHJvamVjdCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19PVVRMSU5FX0NPREVTOgotCQkJCXNldE91dGxpbmVDb2RlcygoT3V0bGluZUNvZGVzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XQlNfTUFTS1M6Ci0JCQkJc2V0V0JTTWFza3MoKFdCU01hc2tzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FWFRFTkRFRF9BVFRSSUJVVEVTOgotCQkJCXNldEV4dGVuZGVkQXR0cmlidXRlcygoRXh0ZW5kZWRBdHRyaWJ1dGVzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUlM6Ci0JCQkJc2V0Q2FsZW5kYXJzKChDYWxlbmRhcnMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tTOgotCQkJCXNldFRhc2tzKChUYXNrcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTOgotCQkJCXNldFJlc291cmNlcygoUmVzb3VyY2VzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BU1NJR05NRU5UUzoKLQkJCQlzZXRBc3NpZ25tZW50cygoQXNzaWdubWVudHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVElUTEU6Ci0JCQkJcmV0dXJuIFRJVExFX0VERUZBVUxUID09IG51bGwgPyB0aXRsZSAhPSBudWxsIDogIVRJVExFX0VERUZBVUxULmVxdWFscyh0aXRsZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1VCSkVDVDoKLQkJCQlyZXR1cm4gU1VCSkVDVF9FREVGQVVMVCA9PSBudWxsID8gc3ViamVjdCAhPSBudWxsIDogIVNVQkpFQ1RfRURFRkFVTFQuZXF1YWxzKHN1YmplY3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBVEVHT1JZOgotCQkJCXJldHVybiBDQVRFR09SWV9FREVGQVVMVCA9PSBudWxsID8gY2F0ZWdvcnkgIT0gbnVsbCA6ICFDQVRFR09SWV9FREVGQVVMVC5lcXVhbHMoY2F0ZWdvcnkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NPTVBBTlk6Ci0JCQkJcmV0dXJuIENPTVBBTllfRURFRkFVTFQgPT0gbnVsbCA/IGNvbXBhbnkgIT0gbnVsbCA6ICFDT01QQU5ZX0VERUZBVUxULmVxdWFscyhjb21wYW55KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NQU5BR0VSOgotCQkJCXJldHVybiBNQU5BR0VSX0VERUZBVUxUID09IG51bGwgPyBtYW5hZ2VyICE9IG51bGwgOiAhTUFOQUdFUl9FREVGQVVMVC5lcXVhbHMobWFuYWdlcik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUSE9SOgotCQkJCXJldHVybiBBVVRIT1JfRURFRkFVTFQgPT0gbnVsbCA/IGF1dGhvciAhPSBudWxsIDogIUFVVEhPUl9FREVGQVVMVC5lcXVhbHMoYXV0aG9yKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DUkVBVElPTl9EQVRFOgotCQkJCXJldHVybiBDUkVBVElPTl9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjcmVhdGlvbkRhdGUgIT0gbnVsbCA6ICFDUkVBVElPTl9EQVRFX0VERUZBVUxULmVxdWFscyhjcmVhdGlvbkRhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFVklTSU9OOgotCQkJCXJldHVybiBSRVZJU0lPTl9FREVGQVVMVCA9PSBudWxsID8gcmV2aXNpb24gIT0gbnVsbCA6ICFSRVZJU0lPTl9FREVGQVVMVC5lcXVhbHMocmV2aXNpb24pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0xBU1RfU0FWRUQ6Ci0JCQkJcmV0dXJuIExBU1RfU0FWRURfRURFRkFVTFQgPT0gbnVsbCA/IGxhc3RTYXZlZCAhPSBudWxsIDogIUxBU1RfU0FWRURfRURFRkFVTFQuZXF1YWxzKGxhc3RTYXZlZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU0NIRURVTEVfRlJPTV9TVEFSVDoKLQkJCQlyZXR1cm4gaXNTZXRTY2hlZHVsZUZyb21TdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NUQVJUX0RBVEU6Ci0JCQkJcmV0dXJuIFNUQVJUX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0RGF0ZSAhPSBudWxsIDogIVNUQVJUX0RBVEVfRURFRkFVTFQuZXF1YWxzKHN0YXJ0RGF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklOSVNIX0RBVEU6Ci0JCQkJcmV0dXJuIEZJTklTSF9EQVRFX0VERUZBVUxUID09IG51bGwgPyBmaW5pc2hEYXRlICE9IG51bGwgOiAhRklOSVNIX0RBVEVfRURFRkFVTFQuZXF1YWxzKGZpbmlzaERhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZZU1RBUlRfREFURToKLQkJCQlyZXR1cm4gRllTVEFSVF9EQVRFX0VERUZBVUxUID09IG51bGwgPyBmWVN0YXJ0RGF0ZSAhPSBudWxsIDogIUZZU1RBUlRfREFURV9FREVGQVVMVC5lcXVhbHMoZllTdGFydERhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSSVRJQ0FMX1NMQUNLX0xJTUlUOgotCQkJCXJldHVybiBDUklUSUNBTF9TTEFDS19MSU1JVF9FREVGQVVMVCA9PSBudWxsID8gY3JpdGljYWxTbGFja0xpbWl0ICE9IG51bGwgOiAhQ1JJVElDQUxfU0xBQ0tfTElNSVRfRURFRkFVTFQuZXF1YWxzKGNyaXRpY2FsU2xhY2tMaW1pdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfRElHSVRTOgotCQkJCXJldHVybiBDVVJSRU5DWV9ESUdJVFNfRURFRkFVTFQgPT0gbnVsbCA/IGN1cnJlbmN5RGlnaXRzICE9IG51bGwgOiAhQ1VSUkVOQ1lfRElHSVRTX0VERUZBVUxULmVxdWFscyhjdXJyZW5jeURpZ2l0cyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MOgotCQkJCXJldHVybiBDVVJSRU5DWV9TWU1CT0xfRURFRkFVTFQgPT0gbnVsbCA/IGN1cnJlbmN5U3ltYm9sICE9IG51bGwgOiAhQ1VSUkVOQ1lfU1lNQk9MX0VERUZBVUxULmVxdWFscyhjdXJyZW5jeVN5bWJvbCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OOgotCQkJCXJldHVybiBDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGN1cnJlbmN5U3ltYm9sUG9zaXRpb24gIT0gbnVsbCA6ICFDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fRURFRkFVTFQuZXF1YWxzKGN1cnJlbmN5U3ltYm9sUG9zaXRpb24pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSX1VJRDoKLQkJCQlyZXR1cm4gQ0FMRU5EQVJfVUlEX0VERUZBVUxUID09IG51bGwgPyBjYWxlbmRhclVJRCAhPSBudWxsIDogIUNBTEVOREFSX1VJRF9FREVGQVVMVC5lcXVhbHMoY2FsZW5kYXJVSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBUlRfVElNRToKLQkJCQlyZXR1cm4gREVGQVVMVF9TVEFSVF9USU1FX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0U3RhcnRUaW1lICE9IG51bGwgOiAhREVGQVVMVF9TVEFSVF9USU1FX0VERUZBVUxULmVxdWFscyhkZWZhdWx0U3RhcnRUaW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJTklTSF9USU1FOgotCQkJCXJldHVybiBERUZBVUxUX0ZJTklTSF9USU1FX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0RmluaXNoVGltZSAhPSBudWxsIDogIURFRkFVTFRfRklOSVNIX1RJTUVfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRGaW5pc2hUaW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9EQVk6Ci0JCQkJcmV0dXJuIE1JTlVURVNfUEVSX0RBWV9FREVGQVVMVCA9PSBudWxsID8gbWludXRlc1BlckRheSAhPSBudWxsIDogIU1JTlVURVNfUEVSX0RBWV9FREVGQVVMVC5lcXVhbHMobWludXRlc1BlckRheSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlOVVRFU19QRVJfV0VFSzoKLQkJCQlyZXR1cm4gTUlOVVRFU19QRVJfV0VFS19FREVGQVVMVCA9PSBudWxsID8gbWludXRlc1BlcldlZWsgIT0gbnVsbCA6ICFNSU5VVEVTX1BFUl9XRUVLX0VERUZBVUxULmVxdWFscyhtaW51dGVzUGVyV2Vlayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREFZU19QRVJfTU9OVEg6Ci0JCQkJcmV0dXJuIERBWVNfUEVSX01PTlRIX0VERUZBVUxUID09IG51bGwgPyBkYXlzUGVyTW9udGggIT0gbnVsbCA6ICFEQVlTX1BFUl9NT05USF9FREVGQVVMVC5lcXVhbHMoZGF5c1Blck1vbnRoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfVFlQRToKLQkJCQlyZXR1cm4gaXNTZXREZWZhdWx0VGFza1R5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlyZXR1cm4gREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRGaXhlZENvc3RBY2NydWFsICE9IG51bGwgOiAhREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRGaXhlZENvc3RBY2NydWFsKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1NUQU5EQVJEX1JBVEU6Ci0JCQkJcmV0dXJuIGlzU2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfT1ZFUlRJTUVfUkFURToKLQkJCQlyZXR1cm4gaXNTZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGR1cmF0aW9uRm9ybWF0ICE9IG51bGwgOiAhRFVSQVRJT05fRk9STUFUX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbkZvcm1hdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV09SS19GT1JNQVQ6Ci0JCQkJcmV0dXJuIFdPUktfRk9STUFUX0VERUZBVUxUID09IG51bGwgPyB3b3JrRm9ybWF0ICE9IG51bGwgOiAhV09SS19GT1JNQVRfRURFRkFVTFQuZXF1YWxzKHdvcmtGb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VESVRBQkxFX0FDVFVBTF9DT1NUUzoKLQkJCQlyZXR1cm4gaXNTZXRFZGl0YWJsZUFjdHVhbENvc3RzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSE9OT1JfQ09OU1RSQUlOVFM6Ci0JCQkJcmV0dXJuIGlzU2V0SG9ub3JDb25zdHJhaW50cygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIEVBUk5FRF9WQUxVRV9NRVRIT0RfRURFRkFVTFQgPT0gbnVsbCA/IGVhcm5lZFZhbHVlTWV0aG9kICE9IG51bGwgOiAhRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVC5lcXVhbHMoZWFybmVkVmFsdWVNZXRob2QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0lOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWToKLQkJCQlyZXR1cm4gaXNTZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NVUxUSVBMRV9DUklUSUNBTF9QQVRIUzoKLQkJCQlyZXR1cm4gaXNTZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS1NfRUZGT1JUX0RSSVZFTjoKLQkJCQlyZXR1cm4gaXNTZXROZXdUYXNrc0VmZm9ydERyaXZlbigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FU1RJTUFURUQ6Ci0JCQkJcmV0dXJuIGlzU2V0TmV3VGFza3NFc3RpbWF0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUExJVFNfSU5fUFJPR1JFU1NfVEFTS1M6Ci0JCQkJcmV0dXJuIGlzU2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBpc1NldFNwcmVhZEFjdHVhbENvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfUEVSQ0VOVF9DT01QTEVURToKLQkJCQlyZXR1cm4gaXNTZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLX1VQREFURVNfUkVTT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzU2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZJU0NBTF9ZRUFSX1NUQVJUOgotCQkJCXJldHVybiBpc1NldEZpc2NhbFllYXJTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dFRUtfU1RBUlRfREFZOgotCQkJCXJldHVybiBXRUVLX1NUQVJUX0RBWV9FREVGQVVMVCA9PSBudWxsID8gd2Vla1N0YXJ0RGF5ICE9IG51bGwgOiAhV0VFS19TVEFSVF9EQVlfRURFRkFVTFQuZXF1YWxzKHdlZWtTdGFydERheSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19CQUNLOgotCQkJCXJldHVybiBpc1NldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfUkVNQUlOSU5HX1NUQVJUU19CQUNLOgotCQkJCXJldHVybiBpc1NldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkQ6Ci0JCQkJcmV0dXJuIGlzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0ZPUldBUkQ6Ci0JCQkJcmV0dXJuIGlzU2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRToKLQkJCQlyZXR1cm4gQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSAhPSBudWxsIDogIUJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfRURFRkFVTFQuZXF1YWxzKGJhc2VsaW5lRm9yRWFybmVkVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9fQUREX05FV19SRVNPVVJDRVNfQU5EX1RBU0tTOgotCQkJCXJldHVybiBpc1NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NUQVRVU19EQVRFOgotCQkJCXJldHVybiBTVEFUVVNfREFURV9FREVGQVVMVCA9PSBudWxsID8gc3RhdHVzRGF0ZSAhPSBudWxsIDogIVNUQVRVU19EQVRFX0VERUZBVUxULmVxdWFscyhzdGF0dXNEYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5UX0RBVEU6Ci0JCQkJcmV0dXJuIENVUlJFTlRfREFURV9FREVGQVVMVCA9PSBudWxsID8gY3VycmVudERhdGUgIT0gbnVsbCA6ICFDVVJSRU5UX0RBVEVfRURFRkFVTFQuZXF1YWxzKGN1cnJlbnREYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMOgotCQkJCXJldHVybiBpc1NldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRPTElOSzoKLQkJCQlyZXR1cm4gaXNTZXRBdXRvbGluaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLX1NUQVJUX0RBVEU6Ci0JCQkJcmV0dXJuIE5FV19UQVNLX1NUQVJUX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IG5ld1Rhc2tTdGFydERhdGUgIT0gbnVsbCA6ICFORVdfVEFTS19TVEFSVF9EQVRFX0VERUZBVUxULmVxdWFscyhuZXdUYXNrU3RhcnREYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfRVZfTUVUSE9EOgotCQkJCXJldHVybiBERUZBVUxUX1RBU0tfRVZfTUVUSE9EX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0VGFza0VWTWV0aG9kICE9IG51bGwgOiAhREVGQVVMVF9UQVNLX0VWX01FVEhPRF9FREVGQVVMVC5lcXVhbHMoZGVmYXVsdFRhc2tFVk1ldGhvZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUFJPSkVDVF9FWFRFUk5BTExZX0VESVRFRDoKLQkJCQlyZXR1cm4gaXNTZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0NSRUFUSU9OX0RBVEU6Ci0JCQkJcmV0dXJuIEVYVEVOREVEX0NSRUFUSU9OX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGV4dGVuZGVkQ3JlYXRpb25EYXRlICE9IG51bGwgOiAhRVhURU5ERURfQ1JFQVRJT05fREFURV9FREVGQVVMVC5lcXVhbHMoZXh0ZW5kZWRDcmVhdGlvbkRhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FDVFVBTFNfSU5fU1lOQzoKLQkJCQlyZXR1cm4gaXNTZXRBY3R1YWxzSW5TeW5jKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVNT1ZFX0ZJTEVfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gaXNTZXRSZW1vdmVGaWxlUHJvcGVydGllcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FETUlOX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGlzU2V0QWRtaW5Qcm9qZWN0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fT1VUTElORV9DT0RFUzoKLQkJCQlyZXR1cm4gb3V0bGluZUNvZGVzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV0JTX01BU0tTOgotCQkJCXJldHVybiB3QlNNYXNrcyAhPSBudWxsOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlcyAhPSBudWxsOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSUzoKLQkJCQlyZXR1cm4gY2FsZW5kYXJzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS1M6Ci0JCQkJcmV0dXJuIHRhc2tzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTOgotCQkJCXJldHVybiByZXNvdXJjZXMgIT0gbnVsbDsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BU1NJR05NRU5UUzoKLQkJCQlyZXR1cm4gYXNzaWdubWVudHMgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0aXRsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGl0bGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN1YmplY3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN1YmplY3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhdGVnb3J5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYXRlZ29yeSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29tcGFueTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29tcGFueSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWFuYWdlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWFuYWdlcik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXV0aG9yOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdXRob3IpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNyZWF0aW9uRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3JlYXRpb25EYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXZpc2lvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmV2aXNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhc3RTYXZlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGFzdFNhdmVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzY2hlZHVsZUZyb21TdGFydDogIik7Ci0JCWlmIChzY2hlZHVsZUZyb21TdGFydEVTZXQpIHJlc3VsdC5hcHBlbmQoc2NoZWR1bGVGcm9tU3RhcnQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydERhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YXJ0RGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmluaXNoRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZllTdGFydERhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZZU3RhcnREYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjcml0aWNhbFNsYWNrTGltaXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNyaXRpY2FsU2xhY2tMaW1pdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3VycmVuY3lEaWdpdHM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGN1cnJlbmN5RGlnaXRzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjdXJyZW5jeVN5bWJvbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3VycmVuY3lTeW1ib2wpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGN1cnJlbmN5U3ltYm9sUG9zaXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGN1cnJlbmN5U3ltYm9sUG9zaXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhbGVuZGFyVUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYWxlbmRhclVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdFN0YXJ0VGltZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVmYXVsdFN0YXJ0VGltZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdEZpbmlzaFRpbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlZmF1bHRGaW5pc2hUaW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtaW51dGVzUGVyRGF5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtaW51dGVzUGVyRGF5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtaW51dGVzUGVyV2VlazogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWludXRlc1BlcldlZWspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRheXNQZXJNb250aDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGF5c1Blck1vbnRoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0VGFza1R5cGU6ICIpOwotCQlpZiAoZGVmYXVsdFRhc2tUeXBlRVNldCkgcmVzdWx0LmFwcGVuZChkZWZhdWx0VGFza1R5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRTdGFuZGFyZFJhdGU6ICIpOwotCQlpZiAoZGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQpIHJlc3VsdC5hcHBlbmQoZGVmYXVsdFN0YW5kYXJkUmF0ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRPdmVydGltZVJhdGU6ICIpOwotCQlpZiAoZGVmYXVsdE92ZXJ0aW1lUmF0ZUVTZXQpIHJlc3VsdC5hcHBlbmQoZGVmYXVsdE92ZXJ0aW1lUmF0ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR1cmF0aW9uRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkdXJhdGlvbkZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29ya0Zvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQod29ya0Zvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWRpdGFibGVBY3R1YWxDb3N0czogIik7Ci0JCWlmIChlZGl0YWJsZUFjdHVhbENvc3RzRVNldCkgcmVzdWx0LmFwcGVuZChlZGl0YWJsZUFjdHVhbENvc3RzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaG9ub3JDb25zdHJhaW50czogIik7Ci0JCWlmIChob25vckNvbnN0cmFpbnRzRVNldCkgcmVzdWx0LmFwcGVuZChob25vckNvbnN0cmFpbnRzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWFybmVkVmFsdWVNZXRob2Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVhcm5lZFZhbHVlTWV0aG9kKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnk6ICIpOwotCQlpZiAoaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldCkgcmVzdWx0LmFwcGVuZChpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtdWx0aXBsZUNyaXRpY2FsUGF0aHM6ICIpOwotCQlpZiAobXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCkgcmVzdWx0LmFwcGVuZChtdWx0aXBsZUNyaXRpY2FsUGF0aHMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuZXdUYXNrc0VmZm9ydERyaXZlbjogIik7Ci0JCWlmIChuZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQpIHJlc3VsdC5hcHBlbmQobmV3VGFza3NFZmZvcnREcml2ZW4pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuZXdUYXNrc0VzdGltYXRlZDogIik7Ci0JCWlmIChuZXdUYXNrc0VzdGltYXRlZEVTZXQpIHJlc3VsdC5hcHBlbmQobmV3VGFza3NFc3RpbWF0ZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzcGxpdHNJblByb2dyZXNzVGFza3M6ICIpOwotCQlpZiAoc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldCkgcmVzdWx0LmFwcGVuZChzcGxpdHNJblByb2dyZXNzVGFza3MpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzcHJlYWRBY3R1YWxDb3N0OiAiKTsKLQkJaWYgKHNwcmVhZEFjdHVhbENvc3RFU2V0KSByZXN1bHQuYXBwZW5kKHNwcmVhZEFjdHVhbENvc3QpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzcHJlYWRQZXJjZW50Q29tcGxldGU6ICIpOwotCQlpZiAoc3ByZWFkUGVyY2VudENvbXBsZXRlRVNldCkgcmVzdWx0LmFwcGVuZChzcHJlYWRQZXJjZW50Q29tcGxldGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0YXNrVXBkYXRlc1Jlc291cmNlOiAiKTsKLQkJaWYgKHRhc2tVcGRhdGVzUmVzb3VyY2VFU2V0KSByZXN1bHQuYXBwZW5kKHRhc2tVcGRhdGVzUmVzb3VyY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaXNjYWxZZWFyU3RhcnQ6ICIpOwotCQlpZiAoZmlzY2FsWWVhclN0YXJ0RVNldCkgcmVzdWx0LmFwcGVuZChmaXNjYWxZZWFyU3RhcnQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3ZWVrU3RhcnREYXk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdlZWtTdGFydERheSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbW92ZUNvbXBsZXRlZEVuZHNCYWNrOiAiKTsKLQkJaWYgKG1vdmVDb21wbGV0ZWRFbmRzQmFja0VTZXQpIHJlc3VsdC5hcHBlbmQobW92ZUNvbXBsZXRlZEVuZHNCYWNrKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2s6ICIpOwotCQlpZiAobW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2tFU2V0KSByZXN1bHQuYXBwZW5kKG1vdmVSZW1haW5pbmdTdGFydHNCYWNrKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ6ICIpOwotCQlpZiAobW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0KSByZXN1bHQuYXBwZW5kKG1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkOiAiKTsKLQkJaWYgKG1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQpIHJlc3VsdC5hcHBlbmQobW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzOiAiKTsKLQkJaWYgKGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQpIHJlc3VsdC5hcHBlbmQoYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhdHVzRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhdHVzRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3VycmVudERhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGN1cnJlbnREYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMOiAiKTsKLQkJaWYgKG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0KSByZXN1bHQuYXBwZW5kKG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdXRvbGluazogIik7Ci0JCWlmIChhdXRvbGlua0VTZXQpIHJlc3VsdC5hcHBlbmQoYXV0b2xpbmspOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuZXdUYXNrU3RhcnREYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuZXdUYXNrU3RhcnREYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0VGFza0VWTWV0aG9kOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0VGFza0VWTWV0aG9kKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZDogIik7Ci0JCWlmIChwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQpIHJlc3VsdC5hcHBlbmQocHJvamVjdEV4dGVybmFsbHlFZGl0ZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleHRlbmRlZENyZWF0aW9uRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXh0ZW5kZWRDcmVhdGlvbkRhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbHNJblN5bmM6ICIpOwotCQlpZiAoYWN0dWFsc0luU3luY0VTZXQpIHJlc3VsdC5hcHBlbmQoYWN0dWFsc0luU3luYyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbW92ZUZpbGVQcm9wZXJ0aWVzOiAiKTsKLQkJaWYgKHJlbW92ZUZpbGVQcm9wZXJ0aWVzRVNldCkgcmVzdWx0LmFwcGVuZChyZW1vdmVGaWxlUHJvcGVydGllcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFkbWluUHJvamVjdDogIik7Ci0JCWlmIChhZG1pblByb2plY3RFU2V0KSByZXN1bHQuYXBwZW5kKGFkbWluUHJvamVjdCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9qZWN0SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmF0ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1JhdGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVlMzlmNTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmF0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJhdGVJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SYXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZUltcGwjZ2V0UmF0ZXNGcm9tIDxlbT5SYXRlcyBGcm9tPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZUltcGwjZ2V0UmF0ZXNUbyA8ZW0+UmF0ZXMgVG88L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlSW1wbCNnZXRSYXRlVGFibGUgPGVtPlJhdGUgVGFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlSW1wbCNnZXRTdGFuZGFyZFJhdGUgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlSW1wbCNnZXRTdGFuZGFyZFJhdGVGb3JtYXQgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZUltcGwjZ2V0T3ZlcnRpbWVSYXRlIDxlbT5PdmVydGltZSBSYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZUltcGwjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0IDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVJbXBsI2dldENvc3RQZXJVc2UgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJhdGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBSYXRlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmF0ZXNGcm9tKCkgPGVtPlJhdGVzIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhdGVzRnJvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkFURVNfRlJPTV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYXRlc0Zyb20oKSA8ZW0+UmF0ZXMgRnJvbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmF0ZXNGcm9tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJhdGVzRnJvbSA9IFJBVEVTX0ZST01fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmF0ZXNUbygpIDxlbT5SYXRlcyBUbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmF0ZXNUbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkFURVNfVE9fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmF0ZXNUbygpIDxlbT5SYXRlcyBUbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmF0ZXNUbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByYXRlc1RvID0gUkFURVNfVE9fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmF0ZVRhYmxlKCkgPGVtPlJhdGUgVGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhdGVUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFJBVEVfVEFCTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmF0ZVRhYmxlKCkgPGVtPlJhdGUgVGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhdGVUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgcmF0ZVRhYmxlID0gUkFURV9UQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFuZGFyZFJhdGUoKSA8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhbmRhcmRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgU1RBTkRBUkRfUkFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFuZGFyZFJhdGUoKSA8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhbmRhcmRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBzdGFuZGFyZFJhdGUgPSBTVEFOREFSRF9SQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCgpIDxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgU1RBTkRBUkRfUkFURV9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHN0YW5kYXJkUmF0ZUZvcm1hdCA9IFNUQU5EQVJEX1JBVEVfRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lUmF0ZSgpIDxlbT5PdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBPVkVSVElNRV9SQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lUmF0ZSgpIDxlbT5PdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIG92ZXJ0aW1lUmF0ZSA9IE9WRVJUSU1FX1JBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGVGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBPVkVSVElNRV9SQVRFX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVJhdGVGb3JtYXQoKSA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgb3ZlcnRpbWVSYXRlRm9ybWF0ID0gT1ZFUlRJTUVfUkFURV9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdFBlclVzZSgpIDxlbT5Db3N0IFBlciBVc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3RQZXJVc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBDT1NUX1BFUl9VU0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdFBlclVzZSgpIDxlbT5Db3N0IFBlciBVc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3RQZXJVc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGNvc3RQZXJVc2UgPSBDT1NUX1BFUl9VU0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmF0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRSYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSYXRlc0Zyb20oKSB7Ci0JCXJldHVybiByYXRlc0Zyb207Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmF0ZXNGcm9tKE9iamVjdCBuZXdSYXRlc0Zyb20pIHsKLQkJT2JqZWN0IG9sZFJhdGVzRnJvbSA9IHJhdGVzRnJvbTsKLQkJcmF0ZXNGcm9tID0gbmV3UmF0ZXNGcm9tOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVTX0ZST00sIG9sZFJhdGVzRnJvbSwgcmF0ZXNGcm9tKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSYXRlc1RvKCkgewotCQlyZXR1cm4gcmF0ZXNUbzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSYXRlc1RvKE9iamVjdCBuZXdSYXRlc1RvKSB7Ci0JCU9iamVjdCBvbGRSYXRlc1RvID0gcmF0ZXNUbzsKLQkJcmF0ZXNUbyA9IG5ld1JhdGVzVG87Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfVE8sIG9sZFJhdGVzVG8sIHJhdGVzVG8pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRSYXRlVGFibGUoKSB7Ci0JCXJldHVybiByYXRlVGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmF0ZVRhYmxlKEJpZ0ludGVnZXIgbmV3UmF0ZVRhYmxlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkUmF0ZVRhYmxlID0gcmF0ZVRhYmxlOwotCQlyYXRlVGFibGUgPSBuZXdSYXRlVGFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURV9UQUJMRSwgb2xkUmF0ZVRhYmxlLCByYXRlVGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRTdGFuZGFyZFJhdGUoKSB7Ci0JCXJldHVybiBzdGFuZGFyZFJhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhbmRhcmRSYXRlKEJpZ0RlY2ltYWwgbmV3U3RhbmRhcmRSYXRlKSB7Ci0JCUJpZ0RlY2ltYWwgb2xkU3RhbmRhcmRSYXRlID0gc3RhbmRhcmRSYXRlOwotCQlzdGFuZGFyZFJhdGUgPSBuZXdTdGFuZGFyZFJhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fU1RBTkRBUkRfUkFURSwgb2xkU3RhbmRhcmRSYXRlLCBzdGFuZGFyZFJhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKSB7Ci0JCXJldHVybiBzdGFuZGFyZFJhdGVGb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhbmRhcmRSYXRlRm9ybWF0KEJpZ0ludGVnZXIgbmV3U3RhbmRhcmRSYXRlRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkU3RhbmRhcmRSYXRlRm9ybWF0ID0gc3RhbmRhcmRSYXRlRm9ybWF0OwotCQlzdGFuZGFyZFJhdGVGb3JtYXQgPSBuZXdTdGFuZGFyZFJhdGVGb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fU1RBTkRBUkRfUkFURV9GT1JNQVQsIG9sZFN0YW5kYXJkUmF0ZUZvcm1hdCwgc3RhbmRhcmRSYXRlRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0T3ZlcnRpbWVSYXRlKCkgewotCQlyZXR1cm4gb3ZlcnRpbWVSYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJ0aW1lUmF0ZShCaWdEZWNpbWFsIG5ld092ZXJ0aW1lUmF0ZSkgewotCQlCaWdEZWNpbWFsIG9sZE92ZXJ0aW1lUmF0ZSA9IG92ZXJ0aW1lUmF0ZTsKLQkJb3ZlcnRpbWVSYXRlID0gbmV3T3ZlcnRpbWVSYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX09WRVJUSU1FX1JBVEUsIG9sZE92ZXJ0aW1lUmF0ZSwgb3ZlcnRpbWVSYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkgewotCQlyZXR1cm4gb3ZlcnRpbWVSYXRlRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJ0aW1lUmF0ZUZvcm1hdChCaWdJbnRlZ2VyIG5ld092ZXJ0aW1lUmF0ZUZvcm1hdCkgewotCQlCaWdJbnRlZ2VyIG9sZE92ZXJ0aW1lUmF0ZUZvcm1hdCA9IG92ZXJ0aW1lUmF0ZUZvcm1hdDsKLQkJb3ZlcnRpbWVSYXRlRm9ybWF0ID0gbmV3T3ZlcnRpbWVSYXRlRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX09WRVJUSU1FX1JBVEVfRk9STUFULCBvbGRPdmVydGltZVJhdGVGb3JtYXQsIG92ZXJ0aW1lUmF0ZUZvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldENvc3RQZXJVc2UoKSB7Ci0JCXJldHVybiBjb3N0UGVyVXNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvc3RQZXJVc2UoQmlnRGVjaW1hbCBuZXdDb3N0UGVyVXNlKSB7Ci0JCUJpZ0RlY2ltYWwgb2xkQ29zdFBlclVzZSA9IGNvc3RQZXJVc2U7Ci0JCWNvc3RQZXJVc2UgPSBuZXdDb3N0UGVyVXNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX0NPU1RfUEVSX1VTRSwgb2xkQ29zdFBlclVzZSwgY29zdFBlclVzZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFU19GUk9NOgotCQkJCXJldHVybiBnZXRSYXRlc0Zyb20oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFU19UTzoKLQkJCQlyZXR1cm4gZ2V0UmF0ZXNUbygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVfVEFCTEU6Ci0JCQkJcmV0dXJuIGdldFJhdGVUYWJsZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1NUQU5EQVJEX1JBVEU6Ci0JCQkJcmV0dXJuIGdldFN0YW5kYXJkUmF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1NUQU5EQVJEX1JBVEVfRk9STUFUOgotCQkJCXJldHVybiBnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19PVkVSVElNRV9SQVRFOgotCQkJCXJldHVybiBnZXRPdmVydGltZVJhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19PVkVSVElNRV9SQVRFX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fQ09TVF9QRVJfVVNFOgotCQkJCXJldHVybiBnZXRDb3N0UGVyVXNlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVTX0ZST006Ci0JCQkJc2V0UmF0ZXNGcm9tKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFU19UTzoKLQkJCQlzZXRSYXRlc1RvKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFX1RBQkxFOgotCQkJCXNldFJhdGVUYWJsZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1NUQU5EQVJEX1JBVEU6Ci0JCQkJc2V0U3RhbmRhcmRSYXRlKChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fU1RBTkRBUkRfUkFURV9GT1JNQVQ6Ci0JCQkJc2V0U3RhbmRhcmRSYXRlRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fT1ZFUlRJTUVfUkFURToKLQkJCQlzZXRPdmVydGltZVJhdGUoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19PVkVSVElNRV9SQVRFX0ZPUk1BVDoKLQkJCQlzZXRPdmVydGltZVJhdGVGb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19DT1NUX1BFUl9VU0U6Ci0JCQkJc2V0Q29zdFBlclVzZSgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFU19GUk9NOgotCQkJCXNldFJhdGVzRnJvbShSQVRFU19GUk9NX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfVE86Ci0JCQkJc2V0UmF0ZXNUbyhSQVRFU19UT19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVfVEFCTEU6Ci0JCQkJc2V0UmF0ZVRhYmxlKFJBVEVfVEFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19TVEFOREFSRF9SQVRFOgotCQkJCXNldFN0YW5kYXJkUmF0ZShTVEFOREFSRF9SQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fU1RBTkRBUkRfUkFURV9GT1JNQVQ6Ci0JCQkJc2V0U3RhbmRhcmRSYXRlRm9ybWF0KFNUQU5EQVJEX1JBVEVfRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fT1ZFUlRJTUVfUkFURToKLQkJCQlzZXRPdmVydGltZVJhdGUoT1ZFUlRJTUVfUkFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX09WRVJUSU1FX1JBVEVfRk9STUFUOgotCQkJCXNldE92ZXJ0aW1lUmF0ZUZvcm1hdChPVkVSVElNRV9SQVRFX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX0NPU1RfUEVSX1VTRToKLQkJCQlzZXRDb3N0UGVyVXNlKENPU1RfUEVSX1VTRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfRlJPTToKLQkJCQlyZXR1cm4gUkFURVNfRlJPTV9FREVGQVVMVCA9PSBudWxsID8gcmF0ZXNGcm9tICE9IG51bGwgOiAhUkFURVNfRlJPTV9FREVGQVVMVC5lcXVhbHMocmF0ZXNGcm9tKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFU19UTzoKLQkJCQlyZXR1cm4gUkFURVNfVE9fRURFRkFVTFQgPT0gbnVsbCA/IHJhdGVzVG8gIT0gbnVsbCA6ICFSQVRFU19UT19FREVGQVVMVC5lcXVhbHMocmF0ZXNUbyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURV9UQUJMRToKLQkJCQlyZXR1cm4gUkFURV9UQUJMRV9FREVGQVVMVCA9PSBudWxsID8gcmF0ZVRhYmxlICE9IG51bGwgOiAhUkFURV9UQUJMRV9FREVGQVVMVC5lcXVhbHMocmF0ZVRhYmxlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19TVEFOREFSRF9SQVRFOgotCQkJCXJldHVybiBTVEFOREFSRF9SQVRFX0VERUZBVUxUID09IG51bGwgPyBzdGFuZGFyZFJhdGUgIT0gbnVsbCA6ICFTVEFOREFSRF9SQVRFX0VERUZBVUxULmVxdWFscyhzdGFuZGFyZFJhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1NUQU5EQVJEX1JBVEVfRk9STUFUOgotCQkJCXJldHVybiBTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVCA9PSBudWxsID8gc3RhbmRhcmRSYXRlRm9ybWF0ICE9IG51bGwgOiAhU1RBTkRBUkRfUkFURV9GT1JNQVRfRURFRkFVTFQuZXF1YWxzKHN0YW5kYXJkUmF0ZUZvcm1hdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fT1ZFUlRJTUVfUkFURToKLQkJCQlyZXR1cm4gT1ZFUlRJTUVfUkFURV9FREVGQVVMVCA9PSBudWxsID8gb3ZlcnRpbWVSYXRlICE9IG51bGwgOiAhT1ZFUlRJTUVfUkFURV9FREVGQVVMVC5lcXVhbHMob3ZlcnRpbWVSYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19PVkVSVElNRV9SQVRFX0ZPUk1BVDoKLQkJCQlyZXR1cm4gT1ZFUlRJTUVfUkFURV9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IG92ZXJ0aW1lUmF0ZUZvcm1hdCAhPSBudWxsIDogIU9WRVJUSU1FX1JBVEVfRk9STUFUX0VERUZBVUxULmVxdWFscyhvdmVydGltZVJhdGVGb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX0NPU1RfUEVSX1VTRToKLQkJCQlyZXR1cm4gQ09TVF9QRVJfVVNFX0VERUZBVUxUID09IG51bGwgPyBjb3N0UGVyVXNlICE9IG51bGwgOiAhQ09TVF9QRVJfVVNFX0VERUZBVUxULmVxdWFscyhjb3N0UGVyVXNlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJhdGVzRnJvbTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmF0ZXNGcm9tKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByYXRlc1RvOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyYXRlc1RvKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByYXRlVGFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJhdGVUYWJsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhbmRhcmRSYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGFuZGFyZFJhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YW5kYXJkUmF0ZUZvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhbmRhcmRSYXRlRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvdmVydGltZVJhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG92ZXJ0aW1lUmF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlcnRpbWVSYXRlRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvdmVydGltZVJhdGVGb3JtYXQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvc3RQZXJVc2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvc3RQZXJVc2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9SYXRlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmF0ZXNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SYXRlc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmM3ZDkwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SYXRlc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJhdGVzSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmF0ZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlc0ltcGwjZ2V0UmF0ZSA8ZW0+UmF0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJhdGVzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUmF0ZXMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhdGUoKSA8ZW0+UmF0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmF0ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmF0ZXNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmF0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UmF0ZSgpIHsKLQkJaWYgKHJhdGUgPT0gbnVsbCkgewotCQkJcmF0ZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSYXRlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlJBVEVTX19SQVRFKTsKLQkJfQotCQlyZXR1cm4gcmF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURVNfX1JBVEU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmF0ZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURVNfX1JBVEU6Ci0JCQkJcmV0dXJuIGdldFJhdGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURVNfX1JBVEU6Ci0JCQkJZ2V0UmF0ZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0UmF0ZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFU19fUkFURToKLQkJCQlnZXRSYXRlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFU19fUkFURToKLQkJCQlyZXR1cm4gcmF0ZSAhPSBudWxsICYmICFyYXRlLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vUmF0ZXNJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Jlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMDU2NzZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Jlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIxNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJlc291cmNlSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0SUQgPGVtPklEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRJbml0aWFscyA8ZW0+SW5pdGlhbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0UGhvbmV0aWNzIDxlbT5QaG9uZXRpY3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0TlRBY2NvdW50IDxlbT5OVCBBY2NvdW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE1hdGVyaWFsTGFiZWwgPGVtPk1hdGVyaWFsIExhYmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldENvZGUgPGVtPkNvZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFdvcmtHcm91cCA8ZW0+V29yayBHcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRFbWFpbEFkZHJlc3MgPGVtPkVtYWlsIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0SHlwZXJsaW5rQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE1heFVuaXRzIDxlbT5NYXggVW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0UGVha1VuaXRzIDxlbT5QZWFrIFVuaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2lzT3ZlckFsbG9jYXRlZCA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QXZhaWxhYmxlRnJvbSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QXZhaWxhYmxlVG8gPGVtPkF2YWlsYWJsZSBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjaXNDYW5MZXZlbCA8ZW0+Q2FuIExldmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEFjY3J1ZUF0IDxlbT5BY2NydWUgQXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRSZWd1bGFyV29yayA8ZW0+UmVndWxhciBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3R1YWxXb3JrIDxlbT5BY3R1YWwgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFN0YW5kYXJkUmF0ZSA8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRTdGFuZGFyZFJhdGVGb3JtYXQgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0T3ZlcnRpbWVSYXRlIDxlbT5PdmVydGltZSBSYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldENvc3RQZXJVc2UgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldENvc3RWYXJpYW5jZSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRTViA8ZW0+U1Y8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0Q1YgPGVtPkNWPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEFDV1AgPGVtPkFDV1A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXROb3RlcyA8ZW0+Tm90ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2lzSXNHZW5lcmljIDxlbT5JcyBHZW5lcmljPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2lzSXNJbmFjdGl2ZSA8ZW0+SXMgSW5hY3RpdmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjaXNJc0VudGVycHJpc2UgPGVtPklzIEVudGVycHJpc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0Qm9va2luZ1R5cGUgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCA8ZW0+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRFeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFJhdGVzIDxlbT5SYXRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBSZXNvdXJjZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFVJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHVJRCA9IFVJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJRCgpIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJRCgpIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGlEID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc051bGwoKSA8ZW0+SXMgTnVsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc051bGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19OVUxMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzTnVsbCgpIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOdWxsID0gSVNfTlVMTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgTnVsbCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOdWxsRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxzKCkgPGVtPkluaXRpYWxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbml0aWFscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVElBTFNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbHMoKSA8ZW0+SW5pdGlhbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRpYWxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGluaXRpYWxzID0gSU5JVElBTFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGhvbmV0aWNzKCkgPGVtPlBob25ldGljczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGhvbmV0aWNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9ORVRJQ1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGhvbmV0aWNzKCkgPGVtPlBob25ldGljczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGhvbmV0aWNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBob25ldGljcyA9IFBIT05FVElDU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROVEFjY291bnQoKSA8ZW0+TlQgQWNjb3VudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TlRBY2NvdW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOVEFDQ09VTlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TlRBY2NvdW50KCkgPGVtPk5UIEFjY291bnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5UQWNjb3VudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuVEFjY291bnQgPSBOVEFDQ09VTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF0ZXJpYWxMYWJlbCgpIDxlbT5NYXRlcmlhbCBMYWJlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWF0ZXJpYWxMYWJlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFURVJJQUxfTEFCRUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF0ZXJpYWxMYWJlbCgpIDxlbT5NYXRlcmlhbCBMYWJlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWF0ZXJpYWxMYWJlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYXRlcmlhbExhYmVsID0gTUFURVJJQUxfTEFCRUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29kZSgpIDxlbT5Db2RlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT0RFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvZGUoKSA8ZW0+Q29kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb2RlID0gQ09ERV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwKCkgPGVtPkdyb3VwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBncm91cCA9IEdST1VQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtHcm91cCgpIDxlbT5Xb3JrIEdyb3VwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBXT1JLX0dST1VQX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtHcm91cCgpIDxlbT5Xb3JrIEdyb3VwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHdvcmtHcm91cCA9IFdPUktfR1JPVVBfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW1haWxBZGRyZXNzKCkgPGVtPkVtYWlsIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVtYWlsQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1BSUxfQUREUkVTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbWFpbEFkZHJlc3MoKSA8ZW0+RW1haWwgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW1haWxBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVtYWlsQWRkcmVzcyA9IEVNQUlMX0FERFJFU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rKCkgPGVtPkh5cGVybGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIWVBFUkxJTktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rKCkgPGVtPkh5cGVybGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGh5cGVybGluayA9IEhZUEVSTElOS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGh5cGVybGlua0FkZHJlc3MgPSBIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGh5cGVybGlua1N1YkFkZHJlc3MgPSBIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF4VW5pdHMoKSA8ZW0+TWF4IFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXhVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBNQVhfVU5JVFNfRURFRkFVTFQgPSAxLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF4VW5pdHMoKSA8ZW0+TWF4IFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXhVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IG1heFVuaXRzID0gTUFYX1VOSVRTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNYXggVW5pdHMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1heFVuaXRzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlYWtVbml0cygpIDxlbT5QZWFrIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZWFrVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgUEVBS19VTklUU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZWFrVW5pdHMoKSA8ZW0+UGVhayBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVha1VuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgcGVha1VuaXRzID0gUEVBS19VTklUU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUGVhayBVbml0cyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcGVha1VuaXRzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzT3ZlckFsbG9jYXRlZCgpIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gT1ZFUl9BTExPQ0FURURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzT3ZlckFsbG9jYXRlZCgpIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvdmVyQWxsb2NhdGVkID0gT1ZFUl9BTExPQ0FURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE92ZXIgQWxsb2NhdGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvdmVyQWxsb2NhdGVkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZUZyb20oKSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZUZyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZUZyb20oKSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZUZyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYXZhaWxhYmxlRnJvbSA9IEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZVRvKCkgPGVtPkF2YWlsYWJsZSBUbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVG8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFWQUlMQUJMRV9UT19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdmFpbGFibGVUbygpIDxlbT5BdmFpbGFibGUgVG88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVRvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGF2YWlsYWJsZVRvID0gQVZBSUxBQkxFX1RPX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZpbmlzaCA9IEZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0NhbkxldmVsKCkgPGVtPkNhbiBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDYW5MZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENBTl9MRVZFTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDYW5MZXZlbCgpIDxlbT5DYW4gTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ2FuTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkxldmVsID0gQ0FOX0xFVkVMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDYW4gTGV2ZWwgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkxldmVsRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY3J1ZUF0KCkgPGVtPkFjY3J1ZSBBdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjcnVlQXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBBQ0NSVUVfQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjcnVlQXQoKSA8ZW0+QWNjcnVlIEF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2NydWVBdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgYWNjcnVlQXQgPSBBQ0NSVUVfQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBXT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCB3b3JrID0gV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWd1bGFyV29yaygpIDxlbT5SZWd1bGFyIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZ3VsYXJXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSRUdVTEFSX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVndWxhcldvcmsoKSA8ZW0+UmVndWxhciBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZWd1bGFyV29yayA9IFJFR1VMQVJfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVdvcmsoKSA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBPVkVSVElNRV9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lV29yaygpIDxlbT5PdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgb3ZlcnRpbWVXb3JrID0gT1ZFUlRJTUVfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrKCkgPGVtPkFjdHVhbCBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrKCkgPGVtPkFjdHVhbCBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbFdvcmsgPSBBQ1RVQUxfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdXb3JrKCkgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSRU1BSU5JTkdfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdXb3JrKCkgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlbWFpbmluZ1dvcmsgPSBSRU1BSU5JTkdfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsT3ZlcnRpbWVXb3JrID0gQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlbWFpbmluZ092ZXJ0aW1lV29yayA9IFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBwZXJjZW50V29ya0NvbXBsZXRlID0gUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YW5kYXJkUmF0ZSgpIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFuZGFyZFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBTVEFOREFSRF9SQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YW5kYXJkUmF0ZSgpIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFuZGFyZFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIHN0YW5kYXJkUmF0ZSA9IFNUQU5EQVJEX1JBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKSA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgc3RhbmRhcmRSYXRlRm9ybWF0ID0gU1RBTkRBUkRfUkFURV9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGNvc3QgPSBDT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lUmF0ZSgpIDxlbT5PdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBPVkVSVElNRV9SQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lUmF0ZSgpIDxlbT5PdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIG92ZXJ0aW1lUmF0ZSA9IE9WRVJUSU1FX1JBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGVGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBPVkVSVElNRV9SQVRFX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVJhdGVGb3JtYXQoKSA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgb3ZlcnRpbWVSYXRlRm9ybWF0ID0gT1ZFUlRJTUVfUkFURV9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVDb3N0KCkgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIE9WRVJUSU1FX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVDb3N0KCkgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgb3ZlcnRpbWVDb3N0ID0gT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0UGVyVXNlKCkgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdFBlclVzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIENPU1RfUEVSX1VTRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0UGVyVXNlKCkgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdFBlclVzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgY29zdFBlclVzZSA9IENPU1RfUEVSX1VTRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxDb3N0KCkgPGVtPkFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQUNUVUFMX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsQ29zdCgpIDxlbT5BY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgYWN0dWFsQ29zdCA9IEFDVFVBTF9DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGFjdHVhbE92ZXJ0aW1lQ29zdCA9IEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ0Nvc3QoKSA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBSRU1BSU5JTkdfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdDb3N0KCkgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCByZW1haW5pbmdDb3N0ID0gUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgcmVtYWluaW5nT3ZlcnRpbWVDb3N0ID0gUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1ZhcmlhbmNlKCkgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBXT1JLX1ZBUklBTkNFX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtWYXJpYW5jZSgpIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCB3b3JrVmFyaWFuY2UgPSBXT1JLX1ZBUklBTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBXb3JrIFZhcmlhbmNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB3b3JrVmFyaWFuY2VFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdFZhcmlhbmNlKCkgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3RWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBDT1NUX1ZBUklBTkNFX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RWYXJpYW5jZSgpIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBjb3N0VmFyaWFuY2UgPSBDT1NUX1ZBUklBTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDb3N0IFZhcmlhbmNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb3N0VmFyaWFuY2VFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U1YoKSA8ZW0+U1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFNWX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNWKCkgPGVtPlNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTVigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IHNWID0gU1ZfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFNWIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzVkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDVigpIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQ1ZfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q1YoKSA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgY1YgPSBDVl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ1YgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNWRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFDV1AoKSA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBBQ1dQX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFDV1AoKSA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGFDV1AgPSBBQ1dQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBQ1dQIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhQ1dQRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhbGVuZGFyVUlEKCkgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBDQUxFTkRBUl9VSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsZW5kYXJVSUQoKSA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgY2FsZW5kYXJVSUQgPSBDQUxFTkRBUl9VSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90ZXMoKSA8ZW0+Tm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RFU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb3RlcygpIDxlbT5Ob3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbm90ZXMgPSBOT1RFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dTID0gQkNXU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXU0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXUF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dQID0gQkNXUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXUEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzR2VuZXJpYygpIDxlbT5JcyBHZW5lcmljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzR2VuZXJpYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0dFTkVSSUNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNHZW5lcmljKCkgPGVtPklzIEdlbmVyaWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNHZW5lcmljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0dlbmVyaWMgPSBJU19HRU5FUklDX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBHZW5lcmljIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0dlbmVyaWNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0luYWN0aXZlKCkgPGVtPklzIEluYWN0aXZlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzSW5hY3RpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19JTkFDVElWRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0luYWN0aXZlKCkgPGVtPklzIEluYWN0aXZlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzSW5hY3RpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5hY3RpdmUgPSBJU19JTkFDVElWRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgSW5hY3RpdmUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5hY3RpdmVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0VudGVycHJpc2UoKSA8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc0VudGVycHJpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19FTlRFUlBSSVNFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzRW50ZXJwcmlzZSgpIDxlbT5JcyBFbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzRW50ZXJwcmlzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbnRlcnByaXNlID0gSVNfRU5URVJQUklTRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgRW50ZXJwcmlzZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbnRlcnByaXNlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJvb2tpbmdUeXBlKCkgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Qm9va2luZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBCT09LSU5HX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Qm9va2luZ1R5cGUoKSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCb29raW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgYm9va2luZ1R5cGUgPSBCT09LSU5HX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxXb3JrUHJvdGVjdGVkID0gQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPSBBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpIDxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2ZURpcmVjdG9yeUdVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWRV9ESVJFQ1RPUllfR1VJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEKCkgPGVtPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhY3RpdmVEaXJlY3RvcnlHVUlEID0gQUNUSVZFX0RJUkVDVE9SWV9HVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWF0aW9uRGF0ZSgpIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IENSRUFUSU9OX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25EYXRlKCkgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGlvbkRhdGUgPSBDUkVBVElPTl9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXh0ZW5kZWRBdHRyaWJ1dGUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZWxpbmUoKSA8ZW0+QmFzZWxpbmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBiYXNlbGluZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdXRsaW5lQ29kZSgpIDxlbT5PdXRsaW5lIENvZGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBvdXRsaW5lQ29kZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCkgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXZhaWxhYmlsaXR5UGVyaW9kcyBhdmFpbGFiaWxpdHlQZXJpb2RzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhdGVzKCkgPGVtPlJhdGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFJhdGVzIHJhdGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVwaGFzZWREYXRhKCkgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRpbWVwaGFzZWREYXRhID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFVJRCgpIHsKLQkJcmV0dXJuIHVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVSUQoQmlnSW50ZWdlciBuZXdVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRVSUQgPSB1SUQ7Ci0JCXVJRCA9IG5ld1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVUlELCBvbGRVSUQsIHVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldElEKCkgewotCQlyZXR1cm4gaUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SUQoQmlnSW50ZWdlciBuZXdJRCkgewotCQlCaWdJbnRlZ2VyIG9sZElEID0gaUQ7Ci0JCWlEID0gbmV3SUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lELCBvbGRJRCwgaUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoQmlnSW50ZWdlciBuZXdUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc051bGwoKSB7Ci0JCXJldHVybiBpc051bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNOdWxsKGJvb2xlYW4gbmV3SXNOdWxsKSB7Ci0JCWJvb2xlYW4gb2xkSXNOdWxsID0gaXNOdWxsOwotCQlpc051bGwgPSBuZXdJc051bGw7Ci0JCWJvb2xlYW4gb2xkSXNOdWxsRVNldCA9IGlzTnVsbEVTZXQ7Ci0JCWlzTnVsbEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19OVUxMLCBvbGRJc051bGwsIGlzTnVsbCwgIW9sZElzTnVsbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzTnVsbCgpIHsKLQkJYm9vbGVhbiBvbGRJc051bGwgPSBpc051bGw7Ci0JCWJvb2xlYW4gb2xkSXNOdWxsRVNldCA9IGlzTnVsbEVTZXQ7Ci0JCWlzTnVsbCA9IElTX05VTExfRURFRkFVTFQ7Ci0JCWlzTnVsbEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19OVUxMLCBvbGRJc051bGwsIElTX05VTExfRURFRkFVTFQsIG9sZElzTnVsbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzTnVsbCgpIHsKLQkJcmV0dXJuIGlzTnVsbEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbml0aWFscygpIHsKLQkJcmV0dXJuIGluaXRpYWxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxzKFN0cmluZyBuZXdJbml0aWFscykgewotCQlTdHJpbmcgb2xkSW5pdGlhbHMgPSBpbml0aWFsczsKLQkJaW5pdGlhbHMgPSBuZXdJbml0aWFsczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSU5JVElBTFMsIG9sZEluaXRpYWxzLCBpbml0aWFscykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGhvbmV0aWNzKCkgewotCQlyZXR1cm4gcGhvbmV0aWNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBob25ldGljcyhTdHJpbmcgbmV3UGhvbmV0aWNzKSB7Ci0JCVN0cmluZyBvbGRQaG9uZXRpY3MgPSBwaG9uZXRpY3M7Ci0JCXBob25ldGljcyA9IG5ld1Bob25ldGljczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEhPTkVUSUNTLCBvbGRQaG9uZXRpY3MsIHBob25ldGljcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TlRBY2NvdW50KCkgewotCQlyZXR1cm4gblRBY2NvdW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5UQWNjb3VudChTdHJpbmcgbmV3TlRBY2NvdW50KSB7Ci0JCVN0cmluZyBvbGROVEFjY291bnQgPSBuVEFjY291bnQ7Ci0JCW5UQWNjb3VudCA9IG5ld05UQWNjb3VudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTlRBQ0NPVU5ULCBvbGROVEFjY291bnQsIG5UQWNjb3VudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWF0ZXJpYWxMYWJlbCgpIHsKLQkJcmV0dXJuIG1hdGVyaWFsTGFiZWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWF0ZXJpYWxMYWJlbChTdHJpbmcgbmV3TWF0ZXJpYWxMYWJlbCkgewotCQlTdHJpbmcgb2xkTWF0ZXJpYWxMYWJlbCA9IG1hdGVyaWFsTGFiZWw7Ci0JCW1hdGVyaWFsTGFiZWwgPSBuZXdNYXRlcmlhbExhYmVsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVRFUklBTF9MQUJFTCwgb2xkTWF0ZXJpYWxMYWJlbCwgbWF0ZXJpYWxMYWJlbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29kZSgpIHsKLQkJcmV0dXJuIGNvZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29kZShTdHJpbmcgbmV3Q29kZSkgewotCQlTdHJpbmcgb2xkQ29kZSA9IGNvZGU7Ci0JCWNvZGUgPSBuZXdDb2RlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT0RFLCBvbGRDb2RlLCBjb2RlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRHcm91cCgpIHsKLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyb3VwKFN0cmluZyBuZXdHcm91cCkgewotCQlTdHJpbmcgb2xkR3JvdXAgPSBncm91cDsKLQkJZ3JvdXAgPSBuZXdHcm91cDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fR1JPVVAsIG9sZEdyb3VwLCBncm91cCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFdvcmtHcm91cCgpIHsKLQkJcmV0dXJuIHdvcmtHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrR3JvdXAoQmlnSW50ZWdlciBuZXdXb3JrR3JvdXApIHsKLQkJQmlnSW50ZWdlciBvbGRXb3JrR3JvdXAgPSB3b3JrR3JvdXA7Ci0JCXdvcmtHcm91cCA9IG5ld1dvcmtHcm91cDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SS19HUk9VUCwgb2xkV29ya0dyb3VwLCB3b3JrR3JvdXApKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVtYWlsQWRkcmVzcygpIHsKLQkJcmV0dXJuIGVtYWlsQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbWFpbEFkZHJlc3MoU3RyaW5nIG5ld0VtYWlsQWRkcmVzcykgewotCQlTdHJpbmcgb2xkRW1haWxBZGRyZXNzID0gZW1haWxBZGRyZXNzOwotCQllbWFpbEFkZHJlc3MgPSBuZXdFbWFpbEFkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0VNQUlMX0FERFJFU1MsIG9sZEVtYWlsQWRkcmVzcywgZW1haWxBZGRyZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmsoKSB7Ci0JCXJldHVybiBoeXBlcmxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rKFN0cmluZyBuZXdIeXBlcmxpbmspIHsKLQkJU3RyaW5nIG9sZEh5cGVybGluayA9IGh5cGVybGluazsKLQkJaHlwZXJsaW5rID0gbmV3SHlwZXJsaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTkssIG9sZEh5cGVybGluaywgaHlwZXJsaW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtBZGRyZXNzKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZyBuZXdIeXBlcmxpbmtBZGRyZXNzKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmtBZGRyZXNzID0gaHlwZXJsaW5rQWRkcmVzczsKLQkJaHlwZXJsaW5rQWRkcmVzcyA9IG5ld0h5cGVybGlua0FkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19BRERSRVNTLCBvbGRIeXBlcmxpbmtBZGRyZXNzLCBoeXBlcmxpbmtBZGRyZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rU3ViQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZyBuZXdIeXBlcmxpbmtTdWJBZGRyZXNzKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmtTdWJBZGRyZXNzID0gaHlwZXJsaW5rU3ViQWRkcmVzczsKLQkJaHlwZXJsaW5rU3ViQWRkcmVzcyA9IG5ld0h5cGVybGlua1N1YkFkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19TVUJfQUREUkVTUywgb2xkSHlwZXJsaW5rU3ViQWRkcmVzcywgaHlwZXJsaW5rU3ViQWRkcmVzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRNYXhVbml0cygpIHsKLQkJcmV0dXJuIG1heFVuaXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1heFVuaXRzKGZsb2F0IG5ld01heFVuaXRzKSB7Ci0JCWZsb2F0IG9sZE1heFVuaXRzID0gbWF4VW5pdHM7Ci0JCW1heFVuaXRzID0gbmV3TWF4VW5pdHM7Ci0JCWJvb2xlYW4gb2xkTWF4VW5pdHNFU2V0ID0gbWF4VW5pdHNFU2V0OwotCQltYXhVbml0c0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVhfVU5JVFMsIG9sZE1heFVuaXRzLCBtYXhVbml0cywgIW9sZE1heFVuaXRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TWF4VW5pdHMoKSB7Ci0JCWZsb2F0IG9sZE1heFVuaXRzID0gbWF4VW5pdHM7Ci0JCWJvb2xlYW4gb2xkTWF4VW5pdHNFU2V0ID0gbWF4VW5pdHNFU2V0OwotCQltYXhVbml0cyA9IE1BWF9VTklUU19FREVGQVVMVDsKLQkJbWF4VW5pdHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFYX1VOSVRTLCBvbGRNYXhVbml0cywgTUFYX1VOSVRTX0VERUZBVUxULCBvbGRNYXhVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1heFVuaXRzKCkgewotCQlyZXR1cm4gbWF4VW5pdHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRQZWFrVW5pdHMoKSB7Ci0JCXJldHVybiBwZWFrVW5pdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVha1VuaXRzKGZsb2F0IG5ld1BlYWtVbml0cykgewotCQlmbG9hdCBvbGRQZWFrVW5pdHMgPSBwZWFrVW5pdHM7Ci0JCXBlYWtVbml0cyA9IG5ld1BlYWtVbml0czsKLQkJYm9vbGVhbiBvbGRQZWFrVW5pdHNFU2V0ID0gcGVha1VuaXRzRVNldDsKLQkJcGVha1VuaXRzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFQUtfVU5JVFMsIG9sZFBlYWtVbml0cywgcGVha1VuaXRzLCAhb2xkUGVha1VuaXRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UGVha1VuaXRzKCkgewotCQlmbG9hdCBvbGRQZWFrVW5pdHMgPSBwZWFrVW5pdHM7Ci0JCWJvb2xlYW4gb2xkUGVha1VuaXRzRVNldCA9IHBlYWtVbml0c0VTZXQ7Ci0JCXBlYWtVbml0cyA9IFBFQUtfVU5JVFNfRURFRkFVTFQ7Ci0JCXBlYWtVbml0c0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QRUFLX1VOSVRTLCBvbGRQZWFrVW5pdHMsIFBFQUtfVU5JVFNfRURFRkFVTFQsIG9sZFBlYWtVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFBlYWtVbml0cygpIHsKLQkJcmV0dXJuIHBlYWtVbml0c0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPdmVyQWxsb2NhdGVkKCkgewotCQlyZXR1cm4gb3ZlckFsbG9jYXRlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4gbmV3T3ZlckFsbG9jYXRlZCkgewotCQlib29sZWFuIG9sZE92ZXJBbGxvY2F0ZWQgPSBvdmVyQWxsb2NhdGVkOwotCQlvdmVyQWxsb2NhdGVkID0gbmV3T3ZlckFsbG9jYXRlZDsKLQkJYm9vbGVhbiBvbGRPdmVyQWxsb2NhdGVkRVNldCA9IG92ZXJBbGxvY2F0ZWRFU2V0OwotCQlvdmVyQWxsb2NhdGVkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJfQUxMT0NBVEVELCBvbGRPdmVyQWxsb2NhdGVkLCBvdmVyQWxsb2NhdGVkLCAhb2xkT3ZlckFsbG9jYXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE92ZXJBbGxvY2F0ZWQoKSB7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZCA9IG92ZXJBbGxvY2F0ZWQ7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZEVTZXQgPSBvdmVyQWxsb2NhdGVkRVNldDsKLQkJb3ZlckFsbG9jYXRlZCA9IE9WRVJfQUxMT0NBVEVEX0VERUZBVUxUOwotCQlvdmVyQWxsb2NhdGVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJfQUxMT0NBVEVELCBvbGRPdmVyQWxsb2NhdGVkLCBPVkVSX0FMTE9DQVRFRF9FREVGQVVMVCwgb2xkT3ZlckFsbG9jYXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE92ZXJBbGxvY2F0ZWQoKSB7Ci0JCXJldHVybiBvdmVyQWxsb2NhdGVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF2YWlsYWJsZUZyb20oKSB7Ci0JCXJldHVybiBhdmFpbGFibGVGcm9tOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF2YWlsYWJsZUZyb20oT2JqZWN0IG5ld0F2YWlsYWJsZUZyb20pIHsKLQkJT2JqZWN0IG9sZEF2YWlsYWJsZUZyb20gPSBhdmFpbGFibGVGcm9tOwotCQlhdmFpbGFibGVGcm9tID0gbmV3QXZhaWxhYmxlRnJvbTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQkxFX0ZST00sIG9sZEF2YWlsYWJsZUZyb20sIGF2YWlsYWJsZUZyb20pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF2YWlsYWJsZVRvKCkgewotCQlyZXR1cm4gYXZhaWxhYmxlVG87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlVG8oT2JqZWN0IG5ld0F2YWlsYWJsZVRvKSB7Ci0JCU9iamVjdCBvbGRBdmFpbGFibGVUbyA9IGF2YWlsYWJsZVRvOwotCQlhdmFpbGFibGVUbyA9IG5ld0F2YWlsYWJsZVRvOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCTEVfVE8sIG9sZEF2YWlsYWJsZVRvLCBhdmFpbGFibGVUbykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChPYmplY3QgbmV3U3RhcnQpIHsKLQkJT2JqZWN0IG9sZFN0YXJ0ID0gc3RhcnQ7Ci0JCXN0YXJ0ID0gbmV3U3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQVJULCBvbGRTdGFydCwgc3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZpbmlzaCgpIHsKLQkJcmV0dXJuIGZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2goT2JqZWN0IG5ld0ZpbmlzaCkgewotCQlPYmplY3Qgb2xkRmluaXNoID0gZmluaXNoOwotCQlmaW5pc2ggPSBuZXdGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0ZJTklTSCwgb2xkRmluaXNoLCBmaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NhbkxldmVsKCkgewotCQlyZXR1cm4gY2FuTGV2ZWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FuTGV2ZWwoYm9vbGVhbiBuZXdDYW5MZXZlbCkgewotCQlib29sZWFuIG9sZENhbkxldmVsID0gY2FuTGV2ZWw7Ci0JCWNhbkxldmVsID0gbmV3Q2FuTGV2ZWw7Ci0JCWJvb2xlYW4gb2xkQ2FuTGV2ZWxFU2V0ID0gY2FuTGV2ZWxFU2V0OwotCQljYW5MZXZlbEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DQU5fTEVWRUwsIG9sZENhbkxldmVsLCBjYW5MZXZlbCwgIW9sZENhbkxldmVsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q2FuTGV2ZWwoKSB7Ci0JCWJvb2xlYW4gb2xkQ2FuTGV2ZWwgPSBjYW5MZXZlbDsKLQkJYm9vbGVhbiBvbGRDYW5MZXZlbEVTZXQgPSBjYW5MZXZlbEVTZXQ7Ci0JCWNhbkxldmVsID0gQ0FOX0xFVkVMX0VERUZBVUxUOwotCQljYW5MZXZlbEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DQU5fTEVWRUwsIG9sZENhbkxldmVsLCBDQU5fTEVWRUxfRURFRkFVTFQsIG9sZENhbkxldmVsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q2FuTGV2ZWwoKSB7Ci0JCXJldHVybiBjYW5MZXZlbEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0QWNjcnVlQXQoKSB7Ci0JCXJldHVybiBhY2NydWVBdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2NydWVBdChCaWdJbnRlZ2VyIG5ld0FjY3J1ZUF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkQWNjcnVlQXQgPSBhY2NydWVBdDsKLQkJYWNjcnVlQXQgPSBuZXdBY2NydWVBdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNDUlVFX0FULCBvbGRBY2NydWVBdCwgYWNjcnVlQXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdvcmsoKSB7Ci0JCXJldHVybiB3b3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmsoT2JqZWN0IG5ld1dvcmspIHsKLQkJT2JqZWN0IG9sZFdvcmsgPSB3b3JrOwotCQl3b3JrID0gbmV3V29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SSywgb2xkV29yaywgd29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVndWxhcldvcmsoKSB7Ci0JCXJldHVybiByZWd1bGFyV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWd1bGFyV29yayhPYmplY3QgbmV3UmVndWxhcldvcmspIHsKLQkJT2JqZWN0IG9sZFJlZ3VsYXJXb3JrID0gcmVndWxhcldvcms7Ci0JCXJlZ3VsYXJXb3JrID0gbmV3UmVndWxhcldvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFR1VMQVJfV09SSywgb2xkUmVndWxhcldvcmssIHJlZ3VsYXJXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPdmVydGltZVdvcmsoKSB7Ci0JCXJldHVybiBvdmVydGltZVdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVXb3JrKE9iamVjdCBuZXdPdmVydGltZVdvcmspIHsKLQkJT2JqZWN0IG9sZE92ZXJ0aW1lV29yayA9IG92ZXJ0aW1lV29yazsKLQkJb3ZlcnRpbWVXb3JrID0gbmV3T3ZlcnRpbWVXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9XT1JLLCBvbGRPdmVydGltZVdvcmssIG92ZXJ0aW1lV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsV29yaygpIHsKLQkJcmV0dXJuIGFjdHVhbFdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsV29yayhPYmplY3QgbmV3QWN0dWFsV29yaykgewotCQlPYmplY3Qgb2xkQWN0dWFsV29yayA9IGFjdHVhbFdvcms7Ci0JCWFjdHVhbFdvcmsgPSBuZXdBY3R1YWxXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfV09SSywgb2xkQWN0dWFsV29yaywgYWN0dWFsV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVtYWluaW5nV29yaygpIHsKLQkJcmV0dXJuIHJlbWFpbmluZ1dvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nV29yayhPYmplY3QgbmV3UmVtYWluaW5nV29yaykgewotCQlPYmplY3Qgb2xkUmVtYWluaW5nV29yayA9IHJlbWFpbmluZ1dvcms7Ci0JCXJlbWFpbmluZ1dvcmsgPSBuZXdSZW1haW5pbmdXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfV09SSywgb2xkUmVtYWluaW5nV29yaywgcmVtYWluaW5nV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkgewotCQlyZXR1cm4gYWN0dWFsT3ZlcnRpbWVXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbE92ZXJ0aW1lV29yayhPYmplY3QgbmV3QWN0dWFsT3ZlcnRpbWVXb3JrKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxPdmVydGltZVdvcmsgPSBhY3R1YWxPdmVydGltZVdvcms7Ci0JCWFjdHVhbE92ZXJ0aW1lV29yayA9IG5ld0FjdHVhbE92ZXJ0aW1lV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUkssIG9sZEFjdHVhbE92ZXJ0aW1lV29yaywgYWN0dWFsT3ZlcnRpbWVXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKSB7Ci0JCXJldHVybiByZW1haW5pbmdPdmVydGltZVdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKE9iamVjdCBuZXdSZW1haW5pbmdPdmVydGltZVdvcmspIHsKLQkJT2JqZWN0IG9sZFJlbWFpbmluZ092ZXJ0aW1lV29yayA9IHJlbWFpbmluZ092ZXJ0aW1lV29yazsKLQkJcmVtYWluaW5nT3ZlcnRpbWVXb3JrID0gbmV3UmVtYWluaW5nT3ZlcnRpbWVXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSywgb2xkUmVtYWluaW5nT3ZlcnRpbWVXb3JrLCByZW1haW5pbmdPdmVydGltZVdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkgewotCQlyZXR1cm4gcGVyY2VudFdvcmtDb21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZXJjZW50V29ya0NvbXBsZXRlKEJpZ0ludGVnZXIgbmV3UGVyY2VudFdvcmtDb21wbGV0ZSkgewotCQlCaWdJbnRlZ2VyIG9sZFBlcmNlbnRXb3JrQ29tcGxldGUgPSBwZXJjZW50V29ya0NvbXBsZXRlOwotCQlwZXJjZW50V29ya0NvbXBsZXRlID0gbmV3UGVyY2VudFdvcmtDb21wbGV0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFLCBvbGRQZXJjZW50V29ya0NvbXBsZXRlLCBwZXJjZW50V29ya0NvbXBsZXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0U3RhbmRhcmRSYXRlKCkgewotCQlyZXR1cm4gc3RhbmRhcmRSYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YW5kYXJkUmF0ZShCaWdEZWNpbWFsIG5ld1N0YW5kYXJkUmF0ZSkgewotCQlCaWdEZWNpbWFsIG9sZFN0YW5kYXJkUmF0ZSA9IHN0YW5kYXJkUmF0ZTsKLQkJc3RhbmRhcmRSYXRlID0gbmV3U3RhbmRhcmRSYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFOREFSRF9SQVRFLCBvbGRTdGFuZGFyZFJhdGUsIHN0YW5kYXJkUmF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFN0YW5kYXJkUmF0ZUZvcm1hdCgpIHsKLQkJcmV0dXJuIHN0YW5kYXJkUmF0ZUZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFuZGFyZFJhdGVGb3JtYXQoQmlnSW50ZWdlciBuZXdTdGFuZGFyZFJhdGVGb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGRTdGFuZGFyZFJhdGVGb3JtYXQgPSBzdGFuZGFyZFJhdGVGb3JtYXQ7Ci0JCXN0YW5kYXJkUmF0ZUZvcm1hdCA9IG5ld1N0YW5kYXJkUmF0ZUZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURV9GT1JNQVQsIG9sZFN0YW5kYXJkUmF0ZUZvcm1hdCwgc3RhbmRhcmRSYXRlRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0Q29zdCgpIHsKLQkJcmV0dXJuIGNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdChCaWdEZWNpbWFsIG5ld0Nvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRDb3N0ID0gY29zdDsKLQkJY29zdCA9IG5ld0Nvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1QsIG9sZENvc3QsIGNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRPdmVydGltZVJhdGUoKSB7Ci0JCXJldHVybiBvdmVydGltZVJhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVSYXRlKEJpZ0RlY2ltYWwgbmV3T3ZlcnRpbWVSYXRlKSB7Ci0JCUJpZ0RlY2ltYWwgb2xkT3ZlcnRpbWVSYXRlID0gb3ZlcnRpbWVSYXRlOwotCQlvdmVydGltZVJhdGUgPSBuZXdPdmVydGltZVJhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEUsIG9sZE92ZXJ0aW1lUmF0ZSwgb3ZlcnRpbWVSYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkgewotCQlyZXR1cm4gb3ZlcnRpbWVSYXRlRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJ0aW1lUmF0ZUZvcm1hdChCaWdJbnRlZ2VyIG5ld092ZXJ0aW1lUmF0ZUZvcm1hdCkgewotCQlCaWdJbnRlZ2VyIG9sZE92ZXJ0aW1lUmF0ZUZvcm1hdCA9IG92ZXJ0aW1lUmF0ZUZvcm1hdDsKLQkJb3ZlcnRpbWVSYXRlRm9ybWF0ID0gbmV3T3ZlcnRpbWVSYXRlRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFX0ZPUk1BVCwgb2xkT3ZlcnRpbWVSYXRlRm9ybWF0LCBvdmVydGltZVJhdGVGb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRPdmVydGltZUNvc3QoKSB7Ci0JCXJldHVybiBvdmVydGltZUNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgbmV3T3ZlcnRpbWVDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkT3ZlcnRpbWVDb3N0ID0gb3ZlcnRpbWVDb3N0OwotCQlvdmVydGltZUNvc3QgPSBuZXdPdmVydGltZUNvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX0NPU1QsIG9sZE92ZXJ0aW1lQ29zdCwgb3ZlcnRpbWVDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0Q29zdFBlclVzZSgpIHsKLQkJcmV0dXJuIGNvc3RQZXJVc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdFBlclVzZShCaWdEZWNpbWFsIG5ld0Nvc3RQZXJVc2UpIHsKLQkJQmlnRGVjaW1hbCBvbGRDb3N0UGVyVXNlID0gY29zdFBlclVzZTsKLQkJY29zdFBlclVzZSA9IG5ld0Nvc3RQZXJVc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfUEVSX1VTRSwgb2xkQ29zdFBlclVzZSwgY29zdFBlclVzZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldEFjdHVhbENvc3QoKSB7Ci0JCXJldHVybiBhY3R1YWxDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbENvc3QoQmlnRGVjaW1hbCBuZXdBY3R1YWxDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkQWN0dWFsQ29zdCA9IGFjdHVhbENvc3Q7Ci0JCWFjdHVhbENvc3QgPSBuZXdBY3R1YWxDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfQ09TVCwgb2xkQWN0dWFsQ29zdCwgYWN0dWFsQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldEFjdHVhbE92ZXJ0aW1lQ29zdCgpIHsKLQkJcmV0dXJuIGFjdHVhbE92ZXJ0aW1lQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCBuZXdBY3R1YWxPdmVydGltZUNvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRBY3R1YWxPdmVydGltZUNvc3QgPSBhY3R1YWxPdmVydGltZUNvc3Q7Ci0JCWFjdHVhbE92ZXJ0aW1lQ29zdCA9IG5ld0FjdHVhbE92ZXJ0aW1lQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX0NPU1QsIG9sZEFjdHVhbE92ZXJ0aW1lQ29zdCwgYWN0dWFsT3ZlcnRpbWVDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nQ29zdCgpIHsKLQkJcmV0dXJuIHJlbWFpbmluZ0Nvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsIG5ld1JlbWFpbmluZ0Nvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRSZW1haW5pbmdDb3N0ID0gcmVtYWluaW5nQ29zdDsKLQkJcmVtYWluaW5nQ29zdCA9IG5ld1JlbWFpbmluZ0Nvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19DT1NULCBvbGRSZW1haW5pbmdDb3N0LCByZW1haW5pbmdDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgewotCQlyZXR1cm4gcmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIG5ld1JlbWFpbmluZ092ZXJ0aW1lQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA9IHJlbWFpbmluZ092ZXJ0aW1lQ29zdDsKLQkJcmVtYWluaW5nT3ZlcnRpbWVDb3N0ID0gbmV3UmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVCwgb2xkUmVtYWluaW5nT3ZlcnRpbWVDb3N0LCByZW1haW5pbmdPdmVydGltZUNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0V29ya1ZhcmlhbmNlKCkgewotCQlyZXR1cm4gd29ya1ZhcmlhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtWYXJpYW5jZShmbG9hdCBuZXdXb3JrVmFyaWFuY2UpIHsKLQkJZmxvYXQgb2xkV29ya1ZhcmlhbmNlID0gd29ya1ZhcmlhbmNlOwotCQl3b3JrVmFyaWFuY2UgPSBuZXdXb3JrVmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkV29ya1ZhcmlhbmNlRVNldCA9IHdvcmtWYXJpYW5jZUVTZXQ7Ci0JCXdvcmtWYXJpYW5jZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX1ZBUklBTkNFLCBvbGRXb3JrVmFyaWFuY2UsIHdvcmtWYXJpYW5jZSwgIW9sZFdvcmtWYXJpYW5jZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFdvcmtWYXJpYW5jZSgpIHsKLQkJZmxvYXQgb2xkV29ya1ZhcmlhbmNlID0gd29ya1ZhcmlhbmNlOwotCQlib29sZWFuIG9sZFdvcmtWYXJpYW5jZUVTZXQgPSB3b3JrVmFyaWFuY2VFU2V0OwotCQl3b3JrVmFyaWFuY2UgPSBXT1JLX1ZBUklBTkNFX0VERUZBVUxUOwotCQl3b3JrVmFyaWFuY2VFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SS19WQVJJQU5DRSwgb2xkV29ya1ZhcmlhbmNlLCBXT1JLX1ZBUklBTkNFX0VERUZBVUxULCBvbGRXb3JrVmFyaWFuY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRXb3JrVmFyaWFuY2UoKSB7Ci0JCXJldHVybiB3b3JrVmFyaWFuY2VFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRDb3N0VmFyaWFuY2UoKSB7Ci0JCXJldHVybiBjb3N0VmFyaWFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdFZhcmlhbmNlKGZsb2F0IG5ld0Nvc3RWYXJpYW5jZSkgewotCQlmbG9hdCBvbGRDb3N0VmFyaWFuY2UgPSBjb3N0VmFyaWFuY2U7Ci0JCWNvc3RWYXJpYW5jZSA9IG5ld0Nvc3RWYXJpYW5jZTsKLQkJYm9vbGVhbiBvbGRDb3N0VmFyaWFuY2VFU2V0ID0gY29zdFZhcmlhbmNlRVNldDsKLQkJY29zdFZhcmlhbmNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfVkFSSUFOQ0UsIG9sZENvc3RWYXJpYW5jZSwgY29zdFZhcmlhbmNlLCAhb2xkQ29zdFZhcmlhbmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q29zdFZhcmlhbmNlKCkgewotCQlmbG9hdCBvbGRDb3N0VmFyaWFuY2UgPSBjb3N0VmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkQ29zdFZhcmlhbmNlRVNldCA9IGNvc3RWYXJpYW5jZUVTZXQ7Ci0JCWNvc3RWYXJpYW5jZSA9IENPU1RfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0JCWNvc3RWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1ZBUklBTkNFLCBvbGRDb3N0VmFyaWFuY2UsIENPU1RfVkFSSUFOQ0VfRURFRkFVTFQsIG9sZENvc3RWYXJpYW5jZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldENvc3RWYXJpYW5jZSgpIHsKLQkJcmV0dXJuIGNvc3RWYXJpYW5jZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldFNWKCkgewotCQlyZXR1cm4gc1Y7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U1YoZmxvYXQgbmV3U1YpIHsKLQkJZmxvYXQgb2xkU1YgPSBzVjsKLQkJc1YgPSBuZXdTVjsKLQkJYm9vbGVhbiBvbGRTVkVTZXQgPSBzVkVTZXQ7Ci0JCXNWRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NWLCBvbGRTViwgc1YsICFvbGRTVkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFNWKCkgewotCQlmbG9hdCBvbGRTViA9IHNWOwotCQlib29sZWFuIG9sZFNWRVNldCA9IHNWRVNldDsKLQkJc1YgPSBTVl9FREVGQVVMVDsKLQkJc1ZFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1YsIG9sZFNWLCBTVl9FREVGQVVMVCwgb2xkU1ZFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTVigpIHsKLQkJcmV0dXJuIHNWRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0Q1YoKSB7Ci0JCXJldHVybiBjVjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDVihmbG9hdCBuZXdDVikgewotCQlmbG9hdCBvbGRDViA9IGNWOwotCQljViA9IG5ld0NWOwotCQlib29sZWFuIG9sZENWRVNldCA9IGNWRVNldDsKLQkJY1ZFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ1YsIG9sZENWLCBjViwgIW9sZENWRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q1YoKSB7Ci0JCWZsb2F0IG9sZENWID0gY1Y7Ci0JCWJvb2xlYW4gb2xkQ1ZFU2V0ID0gY1ZFU2V0OwotCQljViA9IENWX0VERUZBVUxUOwotCQljVkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DViwgb2xkQ1YsIENWX0VERUZBVUxULCBvbGRDVkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldENWKCkgewotCQlyZXR1cm4gY1ZFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRBQ1dQKCkgewotCQlyZXR1cm4gYUNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBQ1dQKGZsb2F0IG5ld0FDV1ApIHsKLQkJZmxvYXQgb2xkQUNXUCA9IGFDV1A7Ci0JCWFDV1AgPSBuZXdBQ1dQOwotCQlib29sZWFuIG9sZEFDV1BFU2V0ID0gYUNXUEVTZXQ7Ci0JCWFDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNXUCwgb2xkQUNXUCwgYUNXUCwgIW9sZEFDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBQ1dQKCkgewotCQlmbG9hdCBvbGRBQ1dQID0gYUNXUDsKLQkJYm9vbGVhbiBvbGRBQ1dQRVNldCA9IGFDV1BFU2V0OwotCQlhQ1dQID0gQUNXUF9FREVGQVVMVDsKLQkJYUNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1dQLCBvbGRBQ1dQLCBBQ1dQX0VERUZBVUxULCBvbGRBQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QUNXUCgpIHsKLQkJcmV0dXJuIGFDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldENhbGVuZGFyVUlEKCkgewotCQlyZXR1cm4gY2FsZW5kYXJVSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FsZW5kYXJVSUQoQmlnSW50ZWdlciBuZXdDYWxlbmRhclVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZENhbGVuZGFyVUlEID0gY2FsZW5kYXJVSUQ7Ci0JCWNhbGVuZGFyVUlEID0gbmV3Q2FsZW5kYXJVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NBTEVOREFSX1VJRCwgb2xkQ2FsZW5kYXJVSUQsIGNhbGVuZGFyVUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb3RlcygpIHsKLQkJcmV0dXJuIG5vdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGVzKFN0cmluZyBuZXdOb3RlcykgewotCQlTdHJpbmcgb2xkTm90ZXMgPSBub3RlczsKLQkJbm90ZXMgPSBuZXdOb3RlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTk9URVMsIG9sZE5vdGVzLCBub3RlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dTKGZsb2F0IG5ld0JDV1MpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJDV1MgPSBuZXdCQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1NFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUywgb2xkQkNXUywgYkNXUywgIW9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dTKCkgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYm9vbGVhbiBvbGRCQ1dTRVNldCA9IGJDV1NFU2V0OwotCQliQ1dTID0gQkNXU19FREVGQVVMVDsKLQkJYkNXU0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dTLCBvbGRCQ1dTLCBCQ1dTX0VERUZBVUxULCBvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1NFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dQKGZsb2F0IG5ld0JDV1ApIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJDV1AgPSBuZXdCQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUCwgb2xkQkNXUCwgYkNXUCwgIW9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dQKCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYm9vbGVhbiBvbGRCQ1dQRVNldCA9IGJDV1BFU2V0OwotCQliQ1dQID0gQkNXUF9FREVGQVVMVDsKLQkJYkNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dQLCBvbGRCQ1dQLCBCQ1dQX0VERUZBVUxULCBvbGRCQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUCgpIHsKLQkJcmV0dXJuIGJDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNHZW5lcmljKCkgewotCQlyZXR1cm4gaXNHZW5lcmljOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzR2VuZXJpYyhib29sZWFuIG5ld0lzR2VuZXJpYykgewotCQlib29sZWFuIG9sZElzR2VuZXJpYyA9IGlzR2VuZXJpYzsKLQkJaXNHZW5lcmljID0gbmV3SXNHZW5lcmljOwotCQlib29sZWFuIG9sZElzR2VuZXJpY0VTZXQgPSBpc0dlbmVyaWNFU2V0OwotCQlpc0dlbmVyaWNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfR0VORVJJQywgb2xkSXNHZW5lcmljLCBpc0dlbmVyaWMsICFvbGRJc0dlbmVyaWNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc0dlbmVyaWMoKSB7Ci0JCWJvb2xlYW4gb2xkSXNHZW5lcmljID0gaXNHZW5lcmljOwotCQlib29sZWFuIG9sZElzR2VuZXJpY0VTZXQgPSBpc0dlbmVyaWNFU2V0OwotCQlpc0dlbmVyaWMgPSBJU19HRU5FUklDX0VERUZBVUxUOwotCQlpc0dlbmVyaWNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfR0VORVJJQywgb2xkSXNHZW5lcmljLCBJU19HRU5FUklDX0VERUZBVUxULCBvbGRJc0dlbmVyaWNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc0dlbmVyaWMoKSB7Ci0JCXJldHVybiBpc0dlbmVyaWNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNJbmFjdGl2ZSgpIHsKLQkJcmV0dXJuIGlzSW5hY3RpdmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNJbmFjdGl2ZShib29sZWFuIG5ld0lzSW5hY3RpdmUpIHsKLQkJYm9vbGVhbiBvbGRJc0luYWN0aXZlID0gaXNJbmFjdGl2ZTsKLQkJaXNJbmFjdGl2ZSA9IG5ld0lzSW5hY3RpdmU7Ci0JCWJvb2xlYW4gb2xkSXNJbmFjdGl2ZUVTZXQgPSBpc0luYWN0aXZlRVNldDsKLQkJaXNJbmFjdGl2ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19JTkFDVElWRSwgb2xkSXNJbmFjdGl2ZSwgaXNJbmFjdGl2ZSwgIW9sZElzSW5hY3RpdmVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc0luYWN0aXZlKCkgewotCQlib29sZWFuIG9sZElzSW5hY3RpdmUgPSBpc0luYWN0aXZlOwotCQlib29sZWFuIG9sZElzSW5hY3RpdmVFU2V0ID0gaXNJbmFjdGl2ZUVTZXQ7Ci0JCWlzSW5hY3RpdmUgPSBJU19JTkFDVElWRV9FREVGQVVMVDsKLQkJaXNJbmFjdGl2ZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19JTkFDVElWRSwgb2xkSXNJbmFjdGl2ZSwgSVNfSU5BQ1RJVkVfRURFRkFVTFQsIG9sZElzSW5hY3RpdmVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc0luYWN0aXZlKCkgewotCQlyZXR1cm4gaXNJbmFjdGl2ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc0VudGVycHJpc2UoKSB7Ci0JCXJldHVybiBpc0VudGVycHJpc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNFbnRlcnByaXNlKGJvb2xlYW4gbmV3SXNFbnRlcnByaXNlKSB7Ci0JCWJvb2xlYW4gb2xkSXNFbnRlcnByaXNlID0gaXNFbnRlcnByaXNlOwotCQlpc0VudGVycHJpc2UgPSBuZXdJc0VudGVycHJpc2U7Ci0JCWJvb2xlYW4gb2xkSXNFbnRlcnByaXNlRVNldCA9IGlzRW50ZXJwcmlzZUVTZXQ7Ci0JCWlzRW50ZXJwcmlzZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19FTlRFUlBSSVNFLCBvbGRJc0VudGVycHJpc2UsIGlzRW50ZXJwcmlzZSwgIW9sZElzRW50ZXJwcmlzZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzRW50ZXJwcmlzZSgpIHsKLQkJYm9vbGVhbiBvbGRJc0VudGVycHJpc2UgPSBpc0VudGVycHJpc2U7Ci0JCWJvb2xlYW4gb2xkSXNFbnRlcnByaXNlRVNldCA9IGlzRW50ZXJwcmlzZUVTZXQ7Ci0JCWlzRW50ZXJwcmlzZSA9IElTX0VOVEVSUFJJU0VfRURFRkFVTFQ7Ci0JCWlzRW50ZXJwcmlzZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19FTlRFUlBSSVNFLCBvbGRJc0VudGVycHJpc2UsIElTX0VOVEVSUFJJU0VfRURFRkFVTFQsIG9sZElzRW50ZXJwcmlzZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzRW50ZXJwcmlzZSgpIHsKLQkJcmV0dXJuIGlzRW50ZXJwcmlzZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Qm9va2luZ1R5cGUoKSB7Ci0JCXJldHVybiBib29raW5nVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb29raW5nVHlwZShCaWdJbnRlZ2VyIG5ld0Jvb2tpbmdUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkQm9va2luZ1R5cGUgPSBib29raW5nVHlwZTsKLQkJYm9va2luZ1R5cGUgPSBuZXdCb29raW5nVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQk9PS0lOR19UWVBFLCBvbGRCb29raW5nVHlwZSwgYm9va2luZ1R5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKSB7Ci0JCXJldHVybiBhY3R1YWxXb3JrUHJvdGVjdGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0IG5ld0FjdHVhbFdvcmtQcm90ZWN0ZWQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbFdvcmtQcm90ZWN0ZWQgPSBhY3R1YWxXb3JrUHJvdGVjdGVkOwotCQlhY3R1YWxXb3JrUHJvdGVjdGVkID0gbmV3QWN0dWFsV29ya1Byb3RlY3RlZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX1dPUktfUFJPVEVDVEVELCBvbGRBY3R1YWxXb3JrUHJvdGVjdGVkLCBhY3R1YWxXb3JrUHJvdGVjdGVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSB7Ci0JCXJldHVybiBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKE9iamVjdCBuZXdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA9IGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDsKLQkJYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkID0gbmV3QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQsIG9sZEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCwgYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBY3RpdmVEaXJlY3RvcnlHVUlEKCkgewotCQlyZXR1cm4gYWN0aXZlRGlyZWN0b3J5R1VJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVEaXJlY3RvcnlHVUlEKFN0cmluZyBuZXdBY3RpdmVEaXJlY3RvcnlHVUlEKSB7Ci0JCVN0cmluZyBvbGRBY3RpdmVEaXJlY3RvcnlHVUlEID0gYWN0aXZlRGlyZWN0b3J5R1VJRDsKLQkJYWN0aXZlRGlyZWN0b3J5R1VJRCA9IG5ld0FjdGl2ZURpcmVjdG9yeUdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVElWRV9ESVJFQ1RPUllfR1VJRCwgb2xkQWN0aXZlRGlyZWN0b3J5R1VJRCwgYWN0aXZlRGlyZWN0b3J5R1VJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRpb25EYXRlKCkgewotCQlyZXR1cm4gY3JlYXRpb25EYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyZWF0aW9uRGF0ZShPYmplY3QgbmV3Q3JlYXRpb25EYXRlKSB7Ci0JCU9iamVjdCBvbGRDcmVhdGlvbkRhdGUgPSBjcmVhdGlvbkRhdGU7Ci0JCWNyZWF0aW9uRGF0ZSA9IG5ld0NyZWF0aW9uRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ1JFQVRJT05fREFURSwgb2xkQ3JlYXRpb25EYXRlLCBjcmVhdGlvbkRhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFeHRlbmRlZEF0dHJpYnV0ZTMuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0VYVEVOREVEX0FUVFJJQlVURSk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRCYXNlbGluZSgpIHsKLQkJaWYgKGJhc2VsaW5lID09IG51bGwpIHsKLQkJCWJhc2VsaW5lID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEJhc2VsaW5lMi5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkFTRUxJTkUpOwotCQl9Ci0JCXJldHVybiBiYXNlbGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0T3V0bGluZUNvZGUoKSB7Ci0JCWlmIChvdXRsaW5lQ29kZSA9PSBudWxsKSB7Ci0JCQlvdXRsaW5lQ29kZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChPdXRsaW5lQ29kZTMuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09VVExJTkVfQ09ERSk7Ci0JCX0KLQkJcmV0dXJuIG91dGxpbmVDb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBdmFpbGFiaWxpdHlQZXJpb2RzIGdldEF2YWlsYWJpbGl0eVBlcmlvZHMoKSB7Ci0JCXJldHVybiBhdmFpbGFiaWxpdHlQZXJpb2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEF2YWlsYWJpbGl0eVBlcmlvZHMoQXZhaWxhYmlsaXR5UGVyaW9kcyBuZXdBdmFpbGFiaWxpdHlQZXJpb2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUF2YWlsYWJpbGl0eVBlcmlvZHMgb2xkQXZhaWxhYmlsaXR5UGVyaW9kcyA9IGF2YWlsYWJpbGl0eVBlcmlvZHM7Ci0JCWF2YWlsYWJpbGl0eVBlcmlvZHMgPSBuZXdBdmFpbGFiaWxpdHlQZXJpb2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUywgb2xkQXZhaWxhYmlsaXR5UGVyaW9kcywgbmV3QXZhaWxhYmlsaXR5UGVyaW9kcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXZhaWxhYmlsaXR5UGVyaW9kcyhBdmFpbGFiaWxpdHlQZXJpb2RzIG5ld0F2YWlsYWJpbGl0eVBlcmlvZHMpIHsKLQkJaWYgKG5ld0F2YWlsYWJpbGl0eVBlcmlvZHMgIT0gYXZhaWxhYmlsaXR5UGVyaW9kcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYXZhaWxhYmlsaXR5UGVyaW9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhdmFpbGFiaWxpdHlQZXJpb2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQklMSVRZX1BFUklPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0F2YWlsYWJpbGl0eVBlcmlvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QXZhaWxhYmlsaXR5UGVyaW9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJJTElUWV9QRVJJT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEF2YWlsYWJpbGl0eVBlcmlvZHMobmV3QXZhaWxhYmlsaXR5UGVyaW9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUywgbmV3QXZhaWxhYmlsaXR5UGVyaW9kcywgbmV3QXZhaWxhYmlsaXR5UGVyaW9kcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSYXRlcyBnZXRSYXRlcygpIHsKLQkJcmV0dXJuIHJhdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJhdGVzKFJhdGVzIG5ld1JhdGVzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVJhdGVzIG9sZFJhdGVzID0gcmF0ZXM7Ci0JCXJhdGVzID0gbmV3UmF0ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JBVEVTLCBvbGRSYXRlcywgbmV3UmF0ZXMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhdGVzKFJhdGVzIG5ld1JhdGVzKSB7Ci0JCWlmIChuZXdSYXRlcyAhPSByYXRlcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmF0ZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmF0ZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SQVRFUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmF0ZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmF0ZXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SQVRFUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSYXRlcyhuZXdSYXRlcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SQVRFUywgbmV3UmF0ZXMsIG5ld1JhdGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCkgewotCQlpZiAodGltZXBoYXNlZERhdGEgPT0gbnVsbCkgewotCQkJdGltZXBoYXNlZERhdGEgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVGltZXBoYXNlZERhdGFUeXBlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19USU1FUEhBU0VEX0RBVEEpOwotCQl9Ci0JCXJldHVybiB0aW1lcGhhc2VkRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQVNFTElORToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRCYXNlbGluZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVVRMSU5FX0NPREU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0T3V0bGluZUNvZGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQklMSVRZX1BFUklPRFM6Ci0JCQkJCXJldHVybiBiYXNpY1NldEF2YWlsYWJpbGl0eVBlcmlvZHMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SQVRFUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0UmF0ZXMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VGltZXBoYXNlZERhdGEoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JRDoKLQkJCQlyZXR1cm4gZ2V0SUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX05VTEw6Ci0JCQkJcmV0dXJuIGlzSXNOdWxsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JTklUSUFMUzoKLQkJCQlyZXR1cm4gZ2V0SW5pdGlhbHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEhPTkVUSUNTOgotCQkJCXJldHVybiBnZXRQaG9uZXRpY3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTlRBQ0NPVU5UOgotCQkJCXJldHVybiBnZXROVEFjY291bnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFURVJJQUxfTEFCRUw6Ci0JCQkJcmV0dXJuIGdldE1hdGVyaWFsTGFiZWwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09ERToKLQkJCQlyZXR1cm4gZ2V0Q29kZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19HUk9VUDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SS19HUk9VUDoKLQkJCQlyZXR1cm4gZ2V0V29ya0dyb3VwKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0VNQUlMX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEVtYWlsQWRkcmVzcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTks6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGluaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlyZXR1cm4gZ2V0SHlwZXJsaW5rQWRkcmVzcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTktfU1VCX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFYX1VOSVRTOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0TWF4VW5pdHMoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFQUtfVU5JVFM6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRQZWFrVW5pdHMoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJfQUxMT0NBVEVEOgotCQkJCXJldHVybiBpc092ZXJBbGxvY2F0ZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9GUk9NOgotCQkJCXJldHVybiBnZXRBdmFpbGFibGVGcm9tKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9UTzoKLQkJCQlyZXR1cm4gZ2V0QXZhaWxhYmxlVG8oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0RmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NBTl9MRVZFTDoKLQkJCQlyZXR1cm4gaXNDYW5MZXZlbCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNDUlVFX0FUOgotCQkJCXJldHVybiBnZXRBY2NydWVBdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLOgotCQkJCXJldHVybiBnZXRXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFR1VMQVJfV09SSzoKLQkJCQlyZXR1cm4gZ2V0UmVndWxhcldvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gZ2V0T3ZlcnRpbWVXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9XT1JLOgotCQkJCXJldHVybiBnZXRBY3R1YWxXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19XT1JLOgotCQkJCXJldHVybiBnZXRSZW1haW5pbmdXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBnZXRBY3R1YWxPdmVydGltZVdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QRVJDRU5UX1dPUktfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGdldFBlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURToKLQkJCQlyZXR1cm4gZ2V0U3RhbmRhcmRSYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEVfRk9STUFUOgotCQkJCXJldHVybiBnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09TVDoKLQkJCQlyZXR1cm4gZ2V0Q29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFOgotCQkJCXJldHVybiBnZXRPdmVydGltZVJhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09TVF9QRVJfVVNFOgotCQkJCXJldHVybiBnZXRDb3N0UGVyVXNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBnZXRBY3R1YWxDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRBY3R1YWxPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ0Nvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX1ZBUklBTkNFOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0V29ya1ZhcmlhbmNlKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1ZBUklBTkNFOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0Q29zdFZhcmlhbmNlKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVjoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldFNWKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DVjoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldENWKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1dQOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QUNXUCgpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBnZXRDYWxlbmRhclVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OT1RFUzoKLQkJCQlyZXR1cm4gZ2V0Tm90ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1MoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JDV1A6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dQKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19HRU5FUklDOgotCQkJCXJldHVybiBpc0lzR2VuZXJpYygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfSU5BQ1RJVkU6Ci0JCQkJcmV0dXJuIGlzSXNJbmFjdGl2ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfRU5URVJQUklTRToKLQkJCQlyZXR1cm4gaXNJc0VudGVycHJpc2UoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JPT0tJTkdfVFlQRToKLQkJCQlyZXR1cm4gZ2V0Qm9va2luZ1R5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVElWRV9ESVJFQ1RPUllfR1VJRDoKLQkJCQlyZXR1cm4gZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DUkVBVElPTl9EQVRFOgotCQkJCXJldHVybiBnZXRDcmVhdGlvbkRhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQVNFTElORToKLQkJCQlyZXR1cm4gZ2V0QmFzZWxpbmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1VUTElORV9DT0RFOgotCQkJCXJldHVybiBnZXRPdXRsaW5lQ29kZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUzoKLQkJCQlyZXR1cm4gZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SQVRFUzoKLQkJCQlyZXR1cm4gZ2V0UmF0ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCXJldHVybiBnZXRUaW1lcGhhc2VkRGF0YSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVUlEOgotCQkJCXNldFVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JRDoKLQkJCQlzZXRJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19UWVBFOgotCQkJCXNldFR5cGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfTlVMTDoKLQkJCQlzZXRJc051bGwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JTklUSUFMUzoKLQkJCQlzZXRJbml0aWFscygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BIT05FVElDUzoKLQkJCQlzZXRQaG9uZXRpY3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OVEFDQ09VTlQ6Ci0JCQkJc2V0TlRBY2NvdW50KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFURVJJQUxfTEFCRUw6Ci0JCQkJc2V0TWF0ZXJpYWxMYWJlbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPREU6Ci0JCQkJc2V0Q29kZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0dST1VQOgotCQkJCXNldEdyb3VwKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SS19HUk9VUDoKLQkJCQlzZXRXb3JrR3JvdXAoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRU1BSUxfQUREUkVTUzoKLQkJCQlzZXRFbWFpbEFkZHJlc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTks6Ci0JCQkJc2V0SHlwZXJsaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJc2V0SHlwZXJsaW5rQWRkcmVzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFYX1VOSVRTOgotCQkJCXNldE1heFVuaXRzKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QRUFLX1VOSVRTOgotCQkJCXNldFBlYWtVbml0cygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJc2V0T3ZlckFsbG9jYXRlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9GUk9NOgotCQkJCXNldEF2YWlsYWJsZUZyb20oKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCTEVfVE86Ci0JCQkJc2V0QXZhaWxhYmxlVG8oKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFSVDoKLQkJCQlzZXRTdGFydCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DQU5fTEVWRUw6Ci0JCQkJc2V0Q2FuTGV2ZWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ0NSVUVfQVQ6Ci0JCQkJc2V0QWNjcnVlQXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SSzoKLQkJCQlzZXRXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVHVUxBUl9XT1JLOgotCQkJCXNldFJlZ3VsYXJXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRPdmVydGltZVdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfV09SSzoKLQkJCQlzZXRBY3R1YWxXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlzZXRQZXJjZW50V29ya0NvbXBsZXRlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEU6Ci0JCQkJc2V0U3RhbmRhcmRSYXRlKChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEVfRk9STUFUOgotCQkJCXNldFN0YW5kYXJkUmF0ZUZvcm1hdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUOgotCQkJCXNldENvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfUkFURToKLQkJCQlzZXRPdmVydGltZVJhdGUoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQ6Ci0JCQkJc2V0T3ZlcnRpbWVSYXRlRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0T3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfUEVSX1VTRToKLQkJCQlzZXRDb3N0UGVyVXNlKChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9DT1NUOgotCQkJCXNldEFjdHVhbENvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19DT1NUOgotCQkJCXNldFJlbWFpbmluZ0Nvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJc2V0V29ya1ZhcmlhbmNlKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1ZBUklBTkNFOgotCQkJCXNldENvc3RWYXJpYW5jZSgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1Y6Ci0JCQkJc2V0U1YoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NWOgotCQkJCXNldENWKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1dQOgotCQkJCXNldEFDV1AoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NBTEVOREFSX1VJRDoKLQkJCQlzZXRDYWxlbmRhclVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OT1RFUzoKLQkJCQlzZXROb3RlcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JDV1M6Ci0JCQkJc2V0QkNXUygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUDoKLQkJCQlzZXRCQ1dQKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19HRU5FUklDOgotCQkJCXNldElzR2VuZXJpYygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0lOQUNUSVZFOgotCQkJCXNldElzSW5hY3RpdmUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19FTlRFUlBSSVNFOgotCQkJCXNldElzRW50ZXJwcmlzZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JPT0tJTkdfVFlQRToKLQkJCQlzZXRCb29raW5nVHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsV29ya1Byb3RlY3RlZCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RJVkVfRElSRUNUT1JZX0dVSUQ6Ci0JCQkJc2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJc2V0Q3JlYXRpb25EYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuY2xlYXIoKTsKLQkJCQlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQVNFTElORToKLQkJCQlnZXRCYXNlbGluZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0QmFzZWxpbmUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1VUTElORV9DT0RFOgotCQkJCWdldE91dGxpbmVDb2RlKCkuY2xlYXIoKTsKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUzoKLQkJCQlzZXRBdmFpbGFiaWxpdHlQZXJpb2RzKChBdmFpbGFiaWxpdHlQZXJpb2RzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JBVEVTOgotCQkJCXNldFJhdGVzKChSYXRlcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5jbGVhcigpOwotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JRDoKLQkJCQlzZXRJRChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19OVUxMOgotCQkJCXVuc2V0SXNOdWxsKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JTklUSUFMUzoKLQkJCQlzZXRJbml0aWFscyhJTklUSUFMU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QSE9ORVRJQ1M6Ci0JCQkJc2V0UGhvbmV0aWNzKFBIT05FVElDU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OVEFDQ09VTlQ6Ci0JCQkJc2V0TlRBY2NvdW50KE5UQUNDT1VOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVRFUklBTF9MQUJFTDoKLQkJCQlzZXRNYXRlcmlhbExhYmVsKE1BVEVSSUFMX0xBQkVMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPREU6Ci0JCQkJc2V0Q29kZShDT0RFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0dST1VQOgotCQkJCXNldEdyb3VwKEdST1VQX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1dPUktfR1JPVVA6Ci0JCQkJc2V0V29ya0dyb3VwKFdPUktfR1JPVVBfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRU1BSUxfQUREUkVTUzoKLQkJCQlzZXRFbWFpbEFkZHJlc3MoRU1BSUxfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTks6Ci0JCQkJc2V0SHlwZXJsaW5rKEhZUEVSTElOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtBZGRyZXNzKEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVhfVU5JVFM6Ci0JCQkJdW5zZXRNYXhVbml0cygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEVBS19VTklUUzoKLQkJCQl1bnNldFBlYWtVbml0cygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJdW5zZXRPdmVyQWxsb2NhdGVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCTEVfRlJPTToKLQkJCQlzZXRBdmFpbGFibGVGcm9tKEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9UTzoKLQkJCQlzZXRBdmFpbGFibGVUbyhBVkFJTEFCTEVfVE9fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoU1RBUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRklOSVNIOgotCQkJCXNldEZpbmlzaChGSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FOX0xFVkVMOgotCQkJCXVuc2V0Q2FuTGV2ZWwoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDQ1JVRV9BVDoKLQkJCQlzZXRBY2NydWVBdChBQ0NSVUVfQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SSzoKLQkJCQlzZXRXb3JrKFdPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVHVUxBUl9XT1JLOgotCQkJCXNldFJlZ3VsYXJXb3JrKFJFR1VMQVJfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9XT1JLOgotCQkJCXNldE92ZXJ0aW1lV29yayhPVkVSVElNRV9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9XT1JLOgotCQkJCXNldEFjdHVhbFdvcmsoQUNUVUFMX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nV29yayhSRU1BSU5JTkdfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRBY3R1YWxPdmVydGltZVdvcmsoQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlzZXRQZXJjZW50V29ya0NvbXBsZXRlKFBFUkNFTlRfV09SS19DT01QTEVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFOREFSRF9SQVRFOgotCQkJCXNldFN0YW5kYXJkUmF0ZShTVEFOREFSRF9SQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEVfRk9STUFUOgotCQkJCXNldFN0YW5kYXJkUmF0ZUZvcm1hdChTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUOgotCQkJCXNldENvc3QoQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFOgotCQkJCXNldE92ZXJ0aW1lUmF0ZShPVkVSVElNRV9SQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEVfRk9STUFUOgotCQkJCXNldE92ZXJ0aW1lUmF0ZUZvcm1hdChPVkVSVElNRV9SQVRFX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9DT1NUOgotCQkJCXNldE92ZXJ0aW1lQ29zdChPVkVSVElNRV9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfUEVSX1VTRToKLQkJCQlzZXRDb3N0UGVyVXNlKENPU1RfUEVSX1VTRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfQ09TVDoKLQkJCQlzZXRBY3R1YWxDb3N0KEFDVFVBTF9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lQ29zdChBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfQ09TVDoKLQkJCQlzZXRSZW1haW5pbmdDb3N0KFJFTUFJTklOR19DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX1ZBUklBTkNFOgotCQkJCXVuc2V0V29ya1ZhcmlhbmNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1ZBUklBTkNFOgotCQkJCXVuc2V0Q29zdFZhcmlhbmNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVjoKLQkJCQl1bnNldFNWKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DVjoKLQkJCQl1bnNldENWKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1dQOgotCQkJCXVuc2V0QUNXUCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FMRU5EQVJfVUlEOgotCQkJCXNldENhbGVuZGFyVUlEKENBTEVOREFSX1VJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OT1RFUzoKLQkJCQlzZXROb3RlcyhOT1RFU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dTOgotCQkJCXVuc2V0QkNXUygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUDoKLQkJCQl1bnNldEJDV1AoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0dFTkVSSUM6Ci0JCQkJdW5zZXRJc0dlbmVyaWMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0lOQUNUSVZFOgotCQkJCXVuc2V0SXNJbmFjdGl2ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfRU5URVJQUklTRToKLQkJCQl1bnNldElzRW50ZXJwcmlzZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQk9PS0lOR19UWVBFOgotCQkJCXNldEJvb2tpbmdUeXBlKEJPT0tJTkdfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsV29ya1Byb3RlY3RlZChBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUSVZFX0RJUkVDVE9SWV9HVUlEOgotCQkJCXNldEFjdGl2ZURpcmVjdG9yeUdVSUQoQUNUSVZFX0RJUkVDVE9SWV9HVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJc2V0Q3JlYXRpb25EYXRlKENSRUFUSU9OX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JBU0VMSU5FOgotCQkJCWdldEJhc2VsaW5lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09VVExJTkVfQ09ERToKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUzoKLQkJCQlzZXRBdmFpbGFiaWxpdHlQZXJpb2RzKChBdmFpbGFiaWxpdHlQZXJpb2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkFURVM6Ci0JCQkJc2V0UmF0ZXMoKFJhdGVzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpRCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19OVUxMOgotCQkJCXJldHVybiBpc1NldElzTnVsbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JTklUSUFMUzoKLQkJCQlyZXR1cm4gSU5JVElBTFNfRURFRkFVTFQgPT0gbnVsbCA/IGluaXRpYWxzICE9IG51bGwgOiAhSU5JVElBTFNfRURFRkFVTFQuZXF1YWxzKGluaXRpYWxzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEhPTkVUSUNTOgotCQkJCXJldHVybiBQSE9ORVRJQ1NfRURFRkFVTFQgPT0gbnVsbCA/IHBob25ldGljcyAhPSBudWxsIDogIVBIT05FVElDU19FREVGQVVMVC5lcXVhbHMocGhvbmV0aWNzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTlRBQ0NPVU5UOgotCQkJCXJldHVybiBOVEFDQ09VTlRfRURFRkFVTFQgPT0gbnVsbCA/IG5UQWNjb3VudCAhPSBudWxsIDogIU5UQUNDT1VOVF9FREVGQVVMVC5lcXVhbHMoblRBY2NvdW50KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFURVJJQUxfTEFCRUw6Ci0JCQkJcmV0dXJuIE1BVEVSSUFMX0xBQkVMX0VERUZBVUxUID09IG51bGwgPyBtYXRlcmlhbExhYmVsICE9IG51bGwgOiAhTUFURVJJQUxfTEFCRUxfRURFRkFVTFQuZXF1YWxzKG1hdGVyaWFsTGFiZWwpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT0RFOgotCQkJCXJldHVybiBDT0RFX0VERUZBVUxUID09IG51bGwgPyBjb2RlICE9IG51bGwgOiAhQ09ERV9FREVGQVVMVC5lcXVhbHMoY29kZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0dST1VQOgotCQkJCXJldHVybiBHUk9VUF9FREVGQVVMVCA9PSBudWxsID8gZ3JvdXAgIT0gbnVsbCA6ICFHUk9VUF9FREVGQVVMVC5lcXVhbHMoZ3JvdXApOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX0dST1VQOgotCQkJCXJldHVybiBXT1JLX0dST1VQX0VERUZBVUxUID09IG51bGwgPyB3b3JrR3JvdXAgIT0gbnVsbCA6ICFXT1JLX0dST1VQX0VERUZBVUxULmVxdWFscyh3b3JrR3JvdXApOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19FTUFJTF9BRERSRVNTOgotCQkJCXJldHVybiBFTUFJTF9BRERSRVNTX0VERUZBVUxUID09IG51bGwgPyBlbWFpbEFkZHJlc3MgIT0gbnVsbCA6ICFFTUFJTF9BRERSRVNTX0VERUZBVUxULmVxdWFscyhlbWFpbEFkZHJlc3MpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTks6Ci0JCQkJcmV0dXJuIEhZUEVSTElOS19FREVGQVVMVCA9PSBudWxsID8gaHlwZXJsaW5rICE9IG51bGwgOiAhSFlQRVJMSU5LX0VERUZBVUxULmVxdWFscyhoeXBlcmxpbmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX0FERFJFU1NfRURFRkFVTFQgPT0gbnVsbCA/IGh5cGVybGlua0FkZHJlc3MgIT0gbnVsbCA6ICFIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVC5lcXVhbHMoaHlwZXJsaW5rQWRkcmVzcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxUID09IG51bGwgPyBoeXBlcmxpbmtTdWJBZGRyZXNzICE9IG51bGwgOiAhSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxULmVxdWFscyhoeXBlcmxpbmtTdWJBZGRyZXNzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFYX1VOSVRTOgotCQkJCXJldHVybiBpc1NldE1heFVuaXRzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFQUtfVU5JVFM6Ci0JCQkJcmV0dXJuIGlzU2V0UGVha1VuaXRzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJfQUxMT0NBVEVEOgotCQkJCXJldHVybiBpc1NldE92ZXJBbGxvY2F0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQkxFX0ZST006Ci0JCQkJcmV0dXJuIEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUID09IG51bGwgPyBhdmFpbGFibGVGcm9tICE9IG51bGwgOiAhQVZBSUxBQkxFX0ZST01fRURFRkFVTFQuZXF1YWxzKGF2YWlsYWJsZUZyb20pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCTEVfVE86Ci0JCQkJcmV0dXJuIEFWQUlMQUJMRV9UT19FREVGQVVMVCA9PSBudWxsID8gYXZhaWxhYmxlVG8gIT0gbnVsbCA6ICFBVkFJTEFCTEVfVE9fRURFRkFVTFQuZXF1YWxzKGF2YWlsYWJsZVRvKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBUlQ6Ci0JCQkJcmV0dXJuIFNUQVJUX0VERUZBVUxUID09IG51bGwgPyBzdGFydCAhPSBudWxsIDogIVNUQVJUX0VERUZBVUxULmVxdWFscyhzdGFydCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0ZJTklTSDoKLQkJCQlyZXR1cm4gRklOSVNIX0VERUZBVUxUID09IG51bGwgPyBmaW5pc2ggIT0gbnVsbCA6ICFGSU5JU0hfRURFRkFVTFQuZXF1YWxzKGZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NBTl9MRVZFTDoKLQkJCQlyZXR1cm4gaXNTZXRDYW5MZXZlbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ0NSVUVfQVQ6Ci0JCQkJcmV0dXJuIEFDQ1JVRV9BVF9FREVGQVVMVCA9PSBudWxsID8gYWNjcnVlQXQgIT0gbnVsbCA6ICFBQ0NSVUVfQVRfRURFRkFVTFQuZXF1YWxzKGFjY3J1ZUF0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SSzoKLQkJCQlyZXR1cm4gV09SS19FREVGQVVMVCA9PSBudWxsID8gd29yayAhPSBudWxsIDogIVdPUktfRURFRkFVTFQuZXF1YWxzKHdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRUdVTEFSX1dPUks6Ci0JCQkJcmV0dXJuIFJFR1VMQVJfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVndWxhcldvcmsgIT0gbnVsbCA6ICFSRUdVTEFSX1dPUktfRURFRkFVTFQuZXF1YWxzKHJlZ3VsYXJXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gb3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhT1ZFUlRJTUVfV09SS19FREVGQVVMVC5lcXVhbHMob3ZlcnRpbWVXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX1dPUks6Ci0JCQkJcmV0dXJuIEFDVFVBTF9XT1JLX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxXb3JrICE9IG51bGwgOiAhQUNUVUFMX1dPUktfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfV09SSzoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ1dvcmsgIT0gbnVsbCA6ICFSRU1BSU5JTkdfV09SS19FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsT3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nT3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ092ZXJ0aW1lV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlyZXR1cm4gUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUID09IG51bGwgPyBwZXJjZW50V29ya0NvbXBsZXRlICE9IG51bGwgOiAhUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxULmVxdWFscyhwZXJjZW50V29ya0NvbXBsZXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURToKLQkJCQlyZXR1cm4gU1RBTkRBUkRfUkFURV9FREVGQVVMVCA9PSBudWxsID8gc3RhbmRhcmRSYXRlICE9IG51bGwgOiAhU1RBTkRBUkRfUkFURV9FREVGQVVMVC5lcXVhbHMoc3RhbmRhcmRSYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIFNUQU5EQVJEX1JBVEVfRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBzdGFuZGFyZFJhdGVGb3JtYXQgIT0gbnVsbCA6ICFTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMoc3RhbmRhcmRSYXRlRm9ybWF0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09TVDoKLQkJCQlyZXR1cm4gQ09TVF9FREVGQVVMVCA9PSBudWxsID8gY29zdCAhPSBudWxsIDogIUNPU1RfRURFRkFVTFQuZXF1YWxzKGNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFOgotCQkJCXJldHVybiBPVkVSVElNRV9SQVRFX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZVJhdGUgIT0gbnVsbCA6ICFPVkVSVElNRV9SQVRFX0VERUZBVUxULmVxdWFscyhvdmVydGltZVJhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFX0ZPUk1BVDoKLQkJCQlyZXR1cm4gT1ZFUlRJTUVfUkFURV9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IG92ZXJ0aW1lUmF0ZUZvcm1hdCAhPSBudWxsIDogIU9WRVJUSU1FX1JBVEVfRk9STUFUX0VERUZBVUxULmVxdWFscyhvdmVydGltZVJhdGVGb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBPVkVSVElNRV9DT1NUX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZUNvc3QgIT0gbnVsbCA6ICFPVkVSVElNRV9DT1NUX0VERUZBVUxULmVxdWFscyhvdmVydGltZUNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1BFUl9VU0U6Ci0JCQkJcmV0dXJuIENPU1RfUEVSX1VTRV9FREVGQVVMVCA9PSBudWxsID8gY29zdFBlclVzZSAhPSBudWxsIDogIUNPU1RfUEVSX1VTRV9FREVGQVVMVC5lcXVhbHMoY29zdFBlclVzZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBBQ1RVQUxfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsQ29zdCAhPSBudWxsIDogIUFDVFVBTF9DT1NUX0VERUZBVUxULmVxdWFscyhhY3R1YWxDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxPdmVydGltZUNvc3QgIT0gbnVsbCA6ICFBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsT3ZlcnRpbWVDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19DT1NUX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdDb3N0ICE9IG51bGwgOiAhUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ0Nvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ092ZXJ0aW1lQ29zdCAhPSBudWxsIDogIVJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdPdmVydGltZUNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX1ZBUklBTkNFOgotCQkJCXJldHVybiBpc1NldFdvcmtWYXJpYW5jZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1ZBUklBTkNFOgotCQkJCXJldHVybiBpc1NldENvc3RWYXJpYW5jZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVjoKLQkJCQlyZXR1cm4gaXNTZXRTVigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DVjoKLQkJCQlyZXR1cm4gaXNTZXRDVigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1dQOgotCQkJCXJldHVybiBpc1NldEFDV1AoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBDQUxFTkRBUl9VSURfRURFRkFVTFQgPT0gbnVsbCA/IGNhbGVuZGFyVUlEICE9IG51bGwgOiAhQ0FMRU5EQVJfVUlEX0VERUZBVUxULmVxdWFscyhjYWxlbmRhclVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX05PVEVTOgotCQkJCXJldHVybiBOT1RFU19FREVGQVVMVCA9PSBudWxsID8gbm90ZXMgIT0gbnVsbCA6ICFOT1RFU19FREVGQVVMVC5lcXVhbHMobm90ZXMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dTOgotCQkJCXJldHVybiBpc1NldEJDV1MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUDoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dQKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0dFTkVSSUM6Ci0JCQkJcmV0dXJuIGlzU2V0SXNHZW5lcmljKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0lOQUNUSVZFOgotCQkJCXJldHVybiBpc1NldElzSW5hY3RpdmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfRU5URVJQUklTRToKLQkJCQlyZXR1cm4gaXNTZXRJc0VudGVycHJpc2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQk9PS0lOR19UWVBFOgotCQkJCXJldHVybiBCT09LSU5HX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGJvb2tpbmdUeXBlICE9IG51bGwgOiAhQk9PS0lOR19UWVBFX0VERUZBVUxULmVxdWFscyhib29raW5nVHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxXb3JrUHJvdGVjdGVkICE9IG51bGwgOiAhQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxULmVxdWFscyhhY3R1YWxXb3JrUHJvdGVjdGVkKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCAhPSBudWxsIDogIUFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUSVZFX0RJUkVDVE9SWV9HVUlEOgotCQkJCXJldHVybiBBQ1RJVkVfRElSRUNUT1JZX0dVSURfRURFRkFVTFQgPT0gbnVsbCA/IGFjdGl2ZURpcmVjdG9yeUdVSUQgIT0gbnVsbCA6ICFBQ1RJVkVfRElSRUNUT1JZX0dVSURfRURFRkFVTFQuZXF1YWxzKGFjdGl2ZURpcmVjdG9yeUdVSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DUkVBVElPTl9EQVRFOgotCQkJCXJldHVybiBDUkVBVElPTl9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjcmVhdGlvbkRhdGUgIT0gbnVsbCA6ICFDUkVBVElPTl9EQVRFX0VERUZBVUxULmVxdWFscyhjcmVhdGlvbkRhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlICE9IG51bGwgJiYgIWV4dGVuZGVkQXR0cmlidXRlLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkFTRUxJTkU6Ci0JCQkJcmV0dXJuIGJhc2VsaW5lICE9IG51bGwgJiYgIWJhc2VsaW5lLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1VUTElORV9DT0RFOgotCQkJCXJldHVybiBvdXRsaW5lQ29kZSAhPSBudWxsICYmICFvdXRsaW5lQ29kZS5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJJTElUWV9QRVJJT0RTOgotCQkJCXJldHVybiBhdmFpbGFiaWxpdHlQZXJpb2RzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JBVEVTOgotCQkJCXJldHVybiByYXRlcyAhPSBudWxsOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhICE9IG51bGwgJiYgIXRpbWVwaGFzZWREYXRhLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzTnVsbDogIik7Ci0JCWlmIChpc051bGxFU2V0KSByZXN1bHQuYXBwZW5kKGlzTnVsbCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGluaXRpYWxzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbml0aWFscyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGhvbmV0aWNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwaG9uZXRpY3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5UQWNjb3VudDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoblRBY2NvdW50KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtYXRlcmlhbExhYmVsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYXRlcmlhbExhYmVsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb2RlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb2RlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBncm91cDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXApOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcmtHcm91cDogIik7Ci0JCXJlc3VsdC5hcHBlbmQod29ya0dyb3VwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbWFpbEFkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVtYWlsQWRkcmVzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaHlwZXJsaW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoeXBlcmxpbmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGlua0FkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGlua0FkZHJlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGlua1N1YkFkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGlua1N1YkFkZHJlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1heFVuaXRzOiAiKTsKLQkJaWYgKG1heFVuaXRzRVNldCkgcmVzdWx0LmFwcGVuZChtYXhVbml0cyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBlYWtVbml0czogIik7Ci0JCWlmIChwZWFrVW5pdHNFU2V0KSByZXN1bHQuYXBwZW5kKHBlYWtVbml0cyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJBbGxvY2F0ZWQ6ICIpOwotCQlpZiAob3ZlckFsbG9jYXRlZEVTZXQpIHJlc3VsdC5hcHBlbmQob3ZlckFsbG9jYXRlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF2YWlsYWJsZUZyb206ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF2YWlsYWJsZUZyb20pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF2YWlsYWJsZVRvOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdmFpbGFibGVUbyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaW5pc2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpbmlzaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FuTGV2ZWw6ICIpOwotCQlpZiAoY2FuTGV2ZWxFU2V0KSByZXN1bHQuYXBwZW5kKGNhbkxldmVsKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWNjcnVlQXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjY3J1ZUF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZWd1bGFyV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVndWxhcldvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtYWluaW5nT3ZlcnRpbWVXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdPdmVydGltZVdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBlcmNlbnRXb3JrQ29tcGxldGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBlcmNlbnRXb3JrQ29tcGxldGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YW5kYXJkUmF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhbmRhcmRSYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFuZGFyZFJhdGVGb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YW5kYXJkUmF0ZUZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlcnRpbWVSYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvdmVydGltZVJhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lUmF0ZUZvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVSYXRlRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvdmVydGltZUNvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG92ZXJ0aW1lQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29zdFBlclVzZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29zdFBlclVzZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsT3ZlcnRpbWVDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxPdmVydGltZUNvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ0Nvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ0Nvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtYWluaW5nT3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrVmFyaWFuY2U6ICIpOwotCQlpZiAod29ya1ZhcmlhbmNlRVNldCkgcmVzdWx0LmFwcGVuZCh3b3JrVmFyaWFuY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0VmFyaWFuY2U6ICIpOwotCQlpZiAoY29zdFZhcmlhbmNlRVNldCkgcmVzdWx0LmFwcGVuZChjb3N0VmFyaWFuY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzVjogIik7Ci0JCWlmIChzVkVTZXQpIHJlc3VsdC5hcHBlbmQoc1YpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjVjogIik7Ci0JCWlmIChjVkVTZXQpIHJlc3VsdC5hcHBlbmQoY1YpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhQ1dQOiAiKTsKLQkJaWYgKGFDV1BFU2V0KSByZXN1bHQuYXBwZW5kKGFDV1ApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYWxlbmRhclVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2FsZW5kYXJVSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vdGVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChub3Rlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUzogIik7Ci0JCWlmIChiQ1dTRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dTKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUDogIik7Ci0JCWlmIChiQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNHZW5lcmljOiAiKTsKLQkJaWYgKGlzR2VuZXJpY0VTZXQpIHJlc3VsdC5hcHBlbmQoaXNHZW5lcmljKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNJbmFjdGl2ZTogIik7Ci0JCWlmIChpc0luYWN0aXZlRVNldCkgcmVzdWx0LmFwcGVuZChpc0luYWN0aXZlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNFbnRlcnByaXNlOiAiKTsKLQkJaWYgKGlzRW50ZXJwcmlzZUVTZXQpIHJlc3VsdC5hcHBlbmQoaXNFbnRlcnByaXNlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYm9va2luZ1R5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGJvb2tpbmdUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxXb3JrUHJvdGVjdGVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxXb3JrUHJvdGVjdGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0aXZlRGlyZWN0b3J5R1VJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0aXZlRGlyZWN0b3J5R1VJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3JlYXRpb25EYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjcmVhdGlvbkRhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9SZXNvdXJjZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Jlc291cmNlc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Jlc291cmNlc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWU5YzAzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SZXNvdXJjZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZXNvdXJjZXNJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlc0ltcGwjZ2V0UmVzb3VyY2UgPGVtPlJlc291cmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUmVzb3VyY2VzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZSgpIDxlbT5SZXNvdXJjZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlc291cmNlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZXNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJlc291cmNlKCkgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmVzb3VyY2UgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUmVzb3VyY2UuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTX19SRVNPVVJDRSk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRVNfX1JFU09VUkNFOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRVNfX1JFU09VUkNFOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRVNfX1JFU09VUkNFOgotCQkJCWdldFJlc291cmNlKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNvdXJjZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRVNfX1JFU09VUkNFOgotCQkJCWdldFJlc291cmNlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRVNfX1JFU09VUkNFOgotCQkJCXJldHVybiByZXNvdXJjZSAhPSBudWxsICYmICFyZXNvdXJjZS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL1Jlc291cmNlc0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Rhc2tJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UYXNrSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZDYxOTA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Rhc2tJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzQwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGFza0ltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRJRCA8ZW0+SUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Q3JlYXRlRGF0ZSA8ZW0+Q3JlYXRlIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRDb250YWN0IDxlbT5Db250YWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0V0JTIDxlbT5XQlM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRXQlNMZXZlbCA8ZW0+V0JTIExldmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0T3V0bGluZU51bWJlciA8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRPdXRsaW5lTGV2ZWwgPGVtPk91dGxpbmUgTGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRQcmlvcml0eSA8ZW0+UHJpb3JpdHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldER1cmF0aW9uIDxlbT5EdXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0U3RvcCA8ZW0+U3RvcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFJlc3VtZSA8ZW0+UmVzdW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNSZXN1bWVWYWxpZCA8ZW0+UmVzdW1lIFZhbGlkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNFZmZvcnREcml2ZW4gPGVtPkVmZm9ydCBEcml2ZW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc1JlY3VycmluZyA8ZW0+UmVjdXJyaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzRXN0aW1hdGVkIDxlbT5Fc3RpbWF0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc01pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNTdW1tYXJ5IDxlbT5TdW1tYXJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNDcml0aWNhbCA8ZW0+Q3JpdGljYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc0lzU3VicHJvamVjdCA8ZW0+SXMgU3VicHJvamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkgPGVtPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0U3VicHJvamVjdE5hbWUgPGVtPlN1YnByb2plY3QgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzRXh0ZXJuYWxUYXNrIDxlbT5FeHRlcm5hbCBUYXNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCA8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RWFybHlTdGFydCA8ZW0+RWFybHkgU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRFYXJseUZpbmlzaCA8ZW0+RWFybHkgRmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0TGF0ZVN0YXJ0IDxlbT5MYXRlIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0TGF0ZUZpbmlzaCA8ZW0+TGF0ZSBGaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRTdGFydFZhcmlhbmNlIDxlbT5TdGFydCBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEZpbmlzaFZhcmlhbmNlIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRGcmVlU2xhY2sgPGVtPkZyZWUgU2xhY2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRUb3RhbFNsYWNrIDxlbT5Ub3RhbCBTbGFjazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEZpeGVkQ29zdCA8ZW0+Rml4ZWQgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEZpeGVkQ29zdEFjY3J1YWwgPGVtPkZpeGVkIENvc3QgQWNjcnVhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFBlcmNlbnRDb21wbGV0ZSA8ZW0+UGVyY2VudCBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRPdmVydGltZVdvcmsgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxTdGFydCA8ZW0+QWN0dWFsIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0QWN0dWFsRmluaXNoIDxlbT5BY3R1YWwgRmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0QWN0dWFsRHVyYXRpb24gPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0IDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFJlZ3VsYXJXb3JrIDxlbT5SZWd1bGFyIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRSZW1haW5pbmdEdXJhdGlvbiA8ZW0+UmVtYWluaW5nIER1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldENWIDxlbT5DVjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldENvbnN0cmFpbnRUeXBlIDxlbT5Db25zdHJhaW50IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Q29uc3RyYWludERhdGUgPGVtPkNvbnN0cmFpbnQgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldERlYWRsaW5lIDxlbT5EZWFkbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzTGV2ZWxBc3NpZ25tZW50cyA8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc0xldmVsaW5nQ2FuU3BsaXQgPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldExldmVsaW5nRGVsYXkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UHJlTGV2ZWxlZFN0YXJ0IDxlbT5QcmUgTGV2ZWxlZCBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFByZUxldmVsZWRGaW5pc2ggPGVtPlByZSBMZXZlbGVkIEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEh5cGVybGluayA8ZW0+SHlwZXJsaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0SHlwZXJsaW5rQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIgPGVtPklnbm9yZSBSZXNvdXJjZSBDYWxlbmRhcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzSGlkZUJhciA8ZW0+SGlkZSBCYXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc1JvbGx1cCA8ZW0+Um9sbHVwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSA8ZW0+UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEVhcm5lZFZhbHVlTWV0aG9kIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UHJlZGVjZXNzb3JMaW5rIDxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRFeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0QmFzZWxpbmUgPGVtPkJhc2VsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0T3V0bGluZUNvZGUgPGVtPk91dGxpbmUgQ29kZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVGFzayB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFVJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHVJRCA9IFVJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJRCgpIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJRCgpIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGlEID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc051bGwoKSA8ZW0+SXMgTnVsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc051bGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19OVUxMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzTnVsbCgpIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOdWxsID0gSVNfTlVMTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgTnVsbCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOdWxsRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWF0ZURhdGUoKSA8ZW0+Q3JlYXRlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0ZURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IENSRUFURV9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWF0ZURhdGUoKSA8ZW0+Q3JlYXRlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0ZURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlRGF0ZSA9IENSRUFURV9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRhY3QoKSA8ZW0+Q29udGFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udGFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEFDVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250YWN0KCkgPGVtPkNvbnRhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnRhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29udGFjdCA9IENPTlRBQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V0JTKCkgPGVtPldCUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V0JTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXQlNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V0JTKCkgPGVtPldCUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V0JTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHdCUyA9IFdCU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXQlNMZXZlbCgpIDxlbT5XQlMgTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdCU0xldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXQlNfTEVWRUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V0JTTGV2ZWwoKSA8ZW0+V0JTIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXQlNMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB3QlNMZXZlbCA9IFdCU19MRVZFTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdXRsaW5lTnVtYmVyKCkgPGVtPk91dGxpbmUgTnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRsaW5lTnVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRMSU5FX05VTUJFUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdXRsaW5lTnVtYmVyKCkgPGVtPk91dGxpbmUgTnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRsaW5lTnVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG91dGxpbmVOdW1iZXIgPSBPVVRMSU5FX05VTUJFUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdXRsaW5lTGV2ZWwoKSA8ZW0+T3V0bGluZSBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3V0bGluZUxldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgT1VUTElORV9MRVZFTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdXRsaW5lTGV2ZWwoKSA8ZW0+T3V0bGluZSBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3V0bGluZUxldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBvdXRsaW5lTGV2ZWwgPSBPVVRMSU5FX0xFVkVMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByaW9yaXR5KCkgPGVtPlByaW9yaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmlvcml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFBSSU9SSVRZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByaW9yaXR5KCkgPGVtPlByaW9yaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmlvcml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgcHJpb3JpdHkgPSBQUklPUklUWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydCgpIDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFNUQVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBzdGFydCA9IFNUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaCgpIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgRklOSVNIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaCgpIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBmaW5pc2ggPSBGSU5JU0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb24oKSA8ZW0+RHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldER1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBEVVJBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbigpIDxlbT5EdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZHVyYXRpb24gPSBEVVJBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbkZvcm1hdCgpIDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgRFVSQVRJT05fRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0ID0gRFVSQVRJT05fRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgd29yayA9IFdPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RvcCgpIDxlbT5TdG9wPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdG9wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9QX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0b3AoKSA8ZW0+U3RvcDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RvcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBzdG9wID0gU1RPUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXN1bWUoKSA8ZW0+UmVzdW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXN1bWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJFU1VNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXN1bWUoKSA8ZW0+UmVzdW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXN1bWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVzdW1lID0gUkVTVU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVzdW1lVmFsaWQoKSA8ZW0+UmVzdW1lIFZhbGlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Jlc3VtZVZhbGlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVTVU1FX1ZBTElEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Jlc3VtZVZhbGlkKCkgPGVtPlJlc3VtZSBWYWxpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZXN1bWVWYWxpZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzdW1lVmFsaWQgPSBSRVNVTUVfVkFMSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJlc3VtZSBWYWxpZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzdW1lVmFsaWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFZmZvcnREcml2ZW4oKSA8ZW0+RWZmb3J0IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFZmZvcnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFRkZPUlRfRFJJVkVOX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VmZm9ydERyaXZlbigpIDxlbT5FZmZvcnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VmZm9ydERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWZmb3J0RHJpdmVuID0gRUZGT1JUX0RSSVZFTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRWZmb3J0IERyaXZlbiBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWZmb3J0RHJpdmVuRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVjdXJyaW5nKCkgPGVtPlJlY3VycmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZWN1cnJpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRUNVUlJJTkdfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVjdXJyaW5nKCkgPGVtPlJlY3VycmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZWN1cnJpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlY3VycmluZyA9IFJFQ1VSUklOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVjdXJyaW5nIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWN1cnJpbmdFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNPdmVyQWxsb2NhdGVkKCkgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBPVkVSX0FMTE9DQVRFRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNPdmVyQWxsb2NhdGVkKCkgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG92ZXJBbGxvY2F0ZWQgPSBPVkVSX0FMTE9DQVRFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgT3ZlciBBbGxvY2F0ZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG92ZXJBbGxvY2F0ZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFc3RpbWF0ZWQoKSA8ZW0+RXN0aW1hdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VzdGltYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVTVElNQVRFRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFc3RpbWF0ZWQoKSA8ZW0+RXN0aW1hdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VzdGltYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXN0aW1hdGVkID0gRVNUSU1BVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFc3RpbWF0ZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVzdGltYXRlZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01pbGVzdG9uZSgpIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUlMRVNUT05FX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01pbGVzdG9uZSgpIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtaWxlc3RvbmUgPSBNSUxFU1RPTkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE1pbGVzdG9uZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWlsZXN0b25lRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3VtbWFyeSgpIDxlbT5TdW1tYXJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1N1bW1hcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBTVU1NQVJZX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N1bW1hcnkoKSA8ZW0+U3VtbWFyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTdW1tYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdW1tYXJ5ID0gU1VNTUFSWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU3VtbWFyeSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VtbWFyeUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0NyaXRpY2FsKCkgPGVtPkNyaXRpY2FsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0NyaXRpY2FsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ1JJVElDQUxfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ3JpdGljYWwoKSA8ZW0+Q3JpdGljYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ3JpdGljYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNyaXRpY2FsID0gQ1JJVElDQUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIENyaXRpY2FsIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjcml0aWNhbEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzU3VicHJvamVjdCgpIDxlbT5JcyBTdWJwcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzU3VicHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX1NVQlBST0pFQ1RfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNTdWJwcm9qZWN0KCkgPGVtPklzIFN1YnByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNTdWJwcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1YnByb2plY3QgPSBJU19TVUJQUk9KRUNUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBTdWJwcm9qZWN0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1YnByb2plY3RFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1N1YnByb2plY3RSZWFkT25seSgpIDxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX1NVQlBST0pFQ1RfUkVBRF9PTkxZX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkgPGVtPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1YnByb2plY3RSZWFkT25seSA9IElTX1NVQlBST0pFQ1RfUkVBRF9PTkxZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBTdWJwcm9qZWN0IFJlYWQgT25seSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3VicHJvamVjdE5hbWUoKSA8ZW0+U3VicHJvamVjdCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJwcm9qZWN0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCUFJPSkVDVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YnByb2plY3ROYW1lKCkgPGVtPlN1YnByb2plY3QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3VicHJvamVjdE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc3VicHJvamVjdE5hbWUgPSBTVUJQUk9KRUNUX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeHRlcm5hbFRhc2soKSA8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFeHRlcm5hbFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFWFRFUk5BTF9UQVNLX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4dGVybmFsVGFzaygpIDxlbT5FeHRlcm5hbCBUYXNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0V4dGVybmFsVGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXh0ZXJuYWxUYXNrID0gRVhURVJOQUxfVEFTS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRXh0ZXJuYWwgVGFzayBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXh0ZXJuYWxUYXNrRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsVGFza1Byb2plY3QoKSA8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbFRhc2tQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9UQVNLX1BST0pFQ1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgpIDxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsVGFza1Byb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXh0ZXJuYWxUYXNrUHJvamVjdCA9IEVYVEVSTkFMX1RBU0tfUFJPSkVDVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFYXJseVN0YXJ0KCkgPGVtPkVhcmx5IFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFYXJseVN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBFQVJMWV9TVEFSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFYXJseVN0YXJ0KCkgPGVtPkVhcmx5IFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFYXJseVN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGVhcmx5U3RhcnQgPSBFQVJMWV9TVEFSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFYXJseUZpbmlzaCgpIDxlbT5FYXJseSBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVhcmx5RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBFQVJMWV9GSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWFybHlGaW5pc2goKSA8ZW0+RWFybHkgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFYXJseUZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBlYXJseUZpbmlzaCA9IEVBUkxZX0ZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYXRlU3RhcnQoKSA8ZW0+TGF0ZSBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGF0ZVN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBMQVRFX1NUQVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhdGVTdGFydCgpIDxlbT5MYXRlIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYXRlU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgbGF0ZVN0YXJ0ID0gTEFURV9TVEFSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYXRlRmluaXNoKCkgPGVtPkxhdGUgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYXRlRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBMQVRFX0ZJTklTSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYXRlRmluaXNoKCkgPGVtPkxhdGUgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYXRlRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGxhdGVGaW5pc2ggPSBMQVRFX0ZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydFZhcmlhbmNlKCkgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnRWYXJpYW5jZSgpIDxlbT5TdGFydCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnRWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgc3RhcnRWYXJpYW5jZSA9IFNUQVJUX1ZBUklBTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaFZhcmlhbmNlKCkgPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoVmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBGSU5JU0hfVkFSSUFOQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoVmFyaWFuY2UoKSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2hWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZmluaXNoVmFyaWFuY2UgPSBGSU5JU0hfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1ZhcmlhbmNlKCkgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBXT1JLX1ZBUklBTkNFX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtWYXJpYW5jZSgpIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCB3b3JrVmFyaWFuY2UgPSBXT1JLX1ZBUklBTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBXb3JrIFZhcmlhbmNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB3b3JrVmFyaWFuY2VFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnJlZVNsYWNrKCkgPGVtPkZyZWUgU2xhY2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZyZWVTbGFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEZSRUVfU0xBQ0tfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnJlZVNsYWNrKCkgPGVtPkZyZWUgU2xhY2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZyZWVTbGFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZnJlZVNsYWNrID0gRlJFRV9TTEFDS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb3RhbFNsYWNrKCkgPGVtPlRvdGFsIFNsYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb3RhbFNsYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVE9UQUxfU0xBQ0tfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG90YWxTbGFjaygpIDxlbT5Ub3RhbCBTbGFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG90YWxTbGFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdG90YWxTbGFjayA9IFRPVEFMX1NMQUNLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpeGVkQ29zdCgpIDxlbT5GaXhlZCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaXhlZENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgRklYRURfQ09TVF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaXhlZENvc3QoKSA8ZW0+Rml4ZWQgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Rml4ZWRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgZml4ZWRDb3N0ID0gRklYRURfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRml4ZWQgQ29zdCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZml4ZWRDb3N0RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpeGVkQ29zdEFjY3J1YWwoKSA8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaXhlZENvc3RBY2NydWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSVhFRF9DT1NUX0FDQ1JVQUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rml4ZWRDb3N0QWNjcnVhbCgpIDxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpeGVkQ29zdEFjY3J1YWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZml4ZWRDb3N0QWNjcnVhbCA9IEZJWEVEX0NPU1RfQUNDUlVBTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJjZW50Q29tcGxldGUoKSA8ZW0+UGVyY2VudCBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyY2VudENvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJjZW50Q29tcGxldGUoKSA8ZW0+UGVyY2VudCBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyY2VudENvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBwZXJjZW50Q29tcGxldGUgPSBQRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBwZXJjZW50V29ya0NvbXBsZXRlID0gUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3QoKSA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIENPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBjb3N0ID0gQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZUNvc3QoKSA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZUNvc3QoKSA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBvdmVydGltZUNvc3QgPSBPVkVSVElNRV9DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lV29yaygpIDxlbT5PdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IE9WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVXb3JrKCkgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBvdmVydGltZVdvcmsgPSBPVkVSVElNRV9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFN0YXJ0KCkgPGVtPkFjdHVhbCBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9TVEFSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxTdGFydCgpIDxlbT5BY3R1YWwgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbFN0YXJ0ID0gQUNUVUFMX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbEZpbmlzaCgpIDxlbT5BY3R1YWwgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9GSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsRmluaXNoKCkgPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxGaW5pc2ggPSBBQ1RVQUxfRklOSVNIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbER1cmF0aW9uKCkgPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9EVVJBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxEdXJhdGlvbigpIDxlbT5BY3R1YWwgRHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbER1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbER1cmF0aW9uID0gQUNUVUFMX0RVUkFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbENvc3QoKSA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBBQ1RVQUxfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxDb3N0KCkgPGVtPkFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBhY3R1YWxDb3N0ID0gQUNUVUFMX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgYWN0dWFsT3ZlcnRpbWVDb3N0ID0gQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsV29yaygpIDxlbT5BY3R1YWwgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsV29yaygpIDxlbT5BY3R1YWwgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxXb3JrID0gQUNUVUFMX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9PVkVSVElNRV9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbE92ZXJ0aW1lV29yayA9IEFDVFVBTF9PVkVSVElNRV9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZ3VsYXJXb3JrKCkgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJFR1VMQVJfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWd1bGFyV29yaygpIDxlbT5SZWd1bGFyIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZ3VsYXJXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlZ3VsYXJXb3JrID0gUkVHVUxBUl9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ0R1cmF0aW9uKCkgPGVtPlJlbWFpbmluZyBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJFTUFJTklOR19EVVJBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdEdXJhdGlvbigpIDxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0R1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlbWFpbmluZ0R1cmF0aW9uID0gUkVNQUlOSU5HX0RVUkFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ0Nvc3QoKSA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBSRU1BSU5JTkdfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdDb3N0KCkgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCByZW1haW5pbmdDb3N0ID0gUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nV29yaygpIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVNQUlOSU5HX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nV29yaygpIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZW1haW5pbmdXb3JrID0gUkVNQUlOSU5HX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgcmVtYWluaW5nT3ZlcnRpbWVDb3N0ID0gUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlbWFpbmluZ092ZXJ0aW1lV29yayA9IFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFDV1AoKSA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBBQ1dQX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFDV1AoKSA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGFDV1AgPSBBQ1dQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBQ1dQIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhQ1dQRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENWKCkgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDVigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBDVl9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDVigpIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBjViA9IENWX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDViBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY1ZFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uc3RyYWludFR5cGUoKSA8ZW0+Q29uc3RyYWludCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25zdHJhaW50VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIENPTlNUUkFJTlRfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25zdHJhaW50VHlwZSgpIDxlbT5Db25zdHJhaW50IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnN0cmFpbnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBjb25zdHJhaW50VHlwZSA9IENPTlNUUkFJTlRfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWxlbmRhclVJRCgpIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhbGVuZGFyVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQ0FMRU5EQVJfVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhbGVuZGFyVUlEKCkgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGNhbGVuZGFyVUlEID0gQ0FMRU5EQVJfVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnN0cmFpbnREYXRlKCkgPGVtPkNvbnN0cmFpbnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29uc3RyYWludERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IENPTlNUUkFJTlRfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25zdHJhaW50RGF0ZSgpIDxlbT5Db25zdHJhaW50IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnN0cmFpbnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnN0cmFpbnREYXRlID0gQ09OU1RSQUlOVF9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlYWRsaW5lKCkgPGVtPkRlYWRsaW5lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWFkbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgREVBRExJTkVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVhZGxpbmUoKSA8ZW0+RGVhZGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlYWRsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRlYWRsaW5lID0gREVBRExJTkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMZXZlbEFzc2lnbm1lbnRzKCkgPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0xldmVsQXNzaWdubWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBMRVZFTF9BU1NJR05NRU5UU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMZXZlbEFzc2lnbm1lbnRzKCkgPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0xldmVsQXNzaWdubWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGxldmVsQXNzaWdubWVudHMgPSBMRVZFTF9BU1NJR05NRU5UU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTGV2ZWwgQXNzaWdubWVudHMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGxldmVsQXNzaWdubWVudHNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMZXZlbGluZ0NhblNwbGl0KCkgPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNMZXZlbGluZ0NhblNwbGl0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTEVWRUxJTkdfQ0FOX1NQTElUX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xldmVsaW5nQ2FuU3BsaXQoKSA8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0xldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGxldmVsaW5nQ2FuU3BsaXQgPSBMRVZFTElOR19DQU5fU1BMSVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIExldmVsaW5nIENhbiBTcGxpdCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbGV2ZWxpbmdDYW5TcGxpdEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbGluZ0RlbGF5KCkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTEVWRUxJTkdfREVMQVlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWxpbmdEZWxheSgpIDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWxpbmdEZWxheSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgbGV2ZWxpbmdEZWxheSA9IExFVkVMSU5HX0RFTEFZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKSA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKSA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5Rm9ybWF0ID0gTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZUxldmVsZWRTdGFydCgpIDxlbT5QcmUgTGV2ZWxlZCBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlTGV2ZWxlZFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBQUkVfTEVWRUxFRF9TVEFSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVMZXZlbGVkU3RhcnQoKSA8ZW0+UHJlIExldmVsZWQgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZUxldmVsZWRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBwcmVMZXZlbGVkU3RhcnQgPSBQUkVfTEVWRUxFRF9TVEFSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVMZXZlbGVkRmluaXNoKCkgPGVtPlByZSBMZXZlbGVkIEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlTGV2ZWxlZEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUFJFX0xFVkVMRURfRklOSVNIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZUxldmVsZWRGaW5pc2goKSA8ZW0+UHJlIExldmVsZWQgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVMZXZlbGVkRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHByZUxldmVsZWRGaW5pc2ggPSBQUkVfTEVWRUxFRF9GSU5JU0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rKCkgPGVtPkh5cGVybGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIWVBFUkxJTktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rKCkgPGVtPkh5cGVybGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGh5cGVybGluayA9IEhZUEVSTElOS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGh5cGVybGlua0FkZHJlc3MgPSBIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGh5cGVybGlua1N1YkFkZHJlc3MgPSBIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkgPGVtPklnbm9yZSBSZXNvdXJjZSBDYWxlbmRhcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSUdOT1JFX1JFU09VUkNFX0NBTEVOREFSX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKSA8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlnbm9yZVJlc291cmNlQ2FsZW5kYXIgPSBJR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElnbm9yZSBSZXNvdXJjZSBDYWxlbmRhciBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaWdub3JlUmVzb3VyY2VDYWxlbmRhckVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb3RlcygpIDxlbT5Ob3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEVTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vdGVzKCkgPGVtPk5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBub3RlcyA9IE5PVEVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSGlkZUJhcigpIDxlbT5IaWRlIEJhcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNIaWRlQmFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSElERV9CQVJfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSGlkZUJhcigpIDxlbT5IaWRlIEJhcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNIaWRlQmFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoaWRlQmFyID0gSElERV9CQVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEhpZGUgQmFyIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoaWRlQmFyRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUm9sbHVwKCkgPGVtPlJvbGx1cDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSb2xsdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBST0xMVVBfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUm9sbHVwKCkgPGVtPlJvbGx1cDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSb2xsdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJvbGx1cCA9IFJPTExVUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUm9sbHVwIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByb2xsdXBFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUygpIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEJDV1NfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUygpIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYkNXUyA9IEJDV1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEJDV1MgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJDV1NFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUCgpIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEJDV1BfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUCgpIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYkNXUCA9IEJDV1BfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEJDV1AgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJDV1BFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKSA8ZW0+UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBQSFlTSUNBTF9QRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKCkgPGVtPlBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSA9IFBIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKSA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBFQVJORURfVkFMVUVfTUVUSE9EX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVhcm5lZFZhbHVlTWV0aG9kKCkgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVhcm5lZFZhbHVlTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBlYXJuZWRWYWx1ZU1ldGhvZCA9IEVBUk5FRF9WQUxVRV9NRVRIT0RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVkZWNlc3NvckxpbmsoKSA8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvckxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwcmVkZWNlc3NvckxpbmsgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKSA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsV29ya1Byb3RlY3RlZCA9IEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkID0gQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXh0ZW5kZWRBdHRyaWJ1dGUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZWxpbmUoKSA8ZW0+QmFzZWxpbmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBiYXNlbGluZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdXRsaW5lQ29kZSgpIDxlbT5PdXRsaW5lIENvZGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBvdXRsaW5lQ29kZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUaW1lcGhhc2VkRGF0YSgpIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGltZXBoYXNlZERhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB0aW1lcGhhc2VkRGF0YSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChCaWdJbnRlZ2VyIG5ld1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRJRCgpIHsKLQkJcmV0dXJuIGlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElEKEJpZ0ludGVnZXIgbmV3SUQpIHsKLQkJQmlnSW50ZWdlciBvbGRJRCA9IGlEOwotCQlpRCA9IG5ld0lEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lELCBvbGRJRCwgaUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIG5ld1R5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNOdWxsKCkgewotCQlyZXR1cm4gaXNOdWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzTnVsbChib29sZWFuIG5ld0lzTnVsbCkgewotCQlib29sZWFuIG9sZElzTnVsbCA9IGlzTnVsbDsKLQkJaXNOdWxsID0gbmV3SXNOdWxsOwotCQlib29sZWFuIG9sZElzTnVsbEVTZXQgPSBpc051bGxFU2V0OwotCQlpc051bGxFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19OVUxMLCBvbGRJc051bGwsIGlzTnVsbCwgIW9sZElzTnVsbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzTnVsbCgpIHsKLQkJYm9vbGVhbiBvbGRJc051bGwgPSBpc051bGw7Ci0JCWJvb2xlYW4gb2xkSXNOdWxsRVNldCA9IGlzTnVsbEVTZXQ7Ci0JCWlzTnVsbCA9IElTX05VTExfRURFRkFVTFQ7Ci0JCWlzTnVsbEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX05VTEwsIG9sZElzTnVsbCwgSVNfTlVMTF9FREVGQVVMVCwgb2xkSXNOdWxsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNOdWxsKCkgewotCQlyZXR1cm4gaXNOdWxsRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZURhdGUoKSB7Ci0JCXJldHVybiBjcmVhdGVEYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyZWF0ZURhdGUoT2JqZWN0IG5ld0NyZWF0ZURhdGUpIHsKLQkJT2JqZWN0IG9sZENyZWF0ZURhdGUgPSBjcmVhdGVEYXRlOwotCQljcmVhdGVEYXRlID0gbmV3Q3JlYXRlRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DUkVBVEVfREFURSwgb2xkQ3JlYXRlRGF0ZSwgY3JlYXRlRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGFjdCgpIHsKLQkJcmV0dXJuIGNvbnRhY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGFjdChTdHJpbmcgbmV3Q29udGFjdCkgewotCQlTdHJpbmcgb2xkQ29udGFjdCA9IGNvbnRhY3Q7Ci0JCWNvbnRhY3QgPSBuZXdDb250YWN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlRBQ1QsIG9sZENvbnRhY3QsIGNvbnRhY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdCUygpIHsKLQkJcmV0dXJuIHdCUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXQlMoU3RyaW5nIG5ld1dCUykgewotCQlTdHJpbmcgb2xkV0JTID0gd0JTOwotCQl3QlMgPSBuZXdXQlM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV0JTLCBvbGRXQlMsIHdCUykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V0JTTGV2ZWwoKSB7Ci0JCXJldHVybiB3QlNMZXZlbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXQlNMZXZlbChTdHJpbmcgbmV3V0JTTGV2ZWwpIHsKLQkJU3RyaW5nIG9sZFdCU0xldmVsID0gd0JTTGV2ZWw7Ci0JCXdCU0xldmVsID0gbmV3V0JTTGV2ZWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV0JTX0xFVkVMLCBvbGRXQlNMZXZlbCwgd0JTTGV2ZWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE91dGxpbmVOdW1iZXIoKSB7Ci0JCXJldHVybiBvdXRsaW5lTnVtYmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dGxpbmVOdW1iZXIoU3RyaW5nIG5ld091dGxpbmVOdW1iZXIpIHsKLQkJU3RyaW5nIG9sZE91dGxpbmVOdW1iZXIgPSBvdXRsaW5lTnVtYmVyOwotCQlvdXRsaW5lTnVtYmVyID0gbmV3T3V0bGluZU51bWJlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX05VTUJFUiwgb2xkT3V0bGluZU51bWJlciwgb3V0bGluZU51bWJlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldE91dGxpbmVMZXZlbCgpIHsKLQkJcmV0dXJuIG91dGxpbmVMZXZlbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdXRsaW5lTGV2ZWwoQmlnSW50ZWdlciBuZXdPdXRsaW5lTGV2ZWwpIHsKLQkJQmlnSW50ZWdlciBvbGRPdXRsaW5lTGV2ZWwgPSBvdXRsaW5lTGV2ZWw7Ci0JCW91dGxpbmVMZXZlbCA9IG5ld091dGxpbmVMZXZlbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0xFVkVMLCBvbGRPdXRsaW5lTGV2ZWwsIG91dGxpbmVMZXZlbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFByaW9yaXR5KCkgewotCQlyZXR1cm4gcHJpb3JpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJpb3JpdHkoQmlnSW50ZWdlciBuZXdQcmlvcml0eSkgewotCQlCaWdJbnRlZ2VyIG9sZFByaW9yaXR5ID0gcHJpb3JpdHk7Ci0JCXByaW9yaXR5ID0gbmV3UHJpb3JpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJJT1JJVFksIG9sZFByaW9yaXR5LCBwcmlvcml0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChPYmplY3QgbmV3U3RhcnQpIHsKLQkJT2JqZWN0IG9sZFN0YXJ0ID0gc3RhcnQ7Ci0JCXN0YXJ0ID0gbmV3U3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RBUlQsIG9sZFN0YXJ0LCBzdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmluaXNoKCkgewotCQlyZXR1cm4gZmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmlzaChPYmplY3QgbmV3RmluaXNoKSB7Ci0JCU9iamVjdCBvbGRGaW5pc2ggPSBmaW5pc2g7Ci0JCWZpbmlzaCA9IG5ld0ZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSU5JU0gsIG9sZEZpbmlzaCwgZmluaXNoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXREdXJhdGlvbigpIHsKLQkJcmV0dXJuIGR1cmF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldER1cmF0aW9uKE9iamVjdCBuZXdEdXJhdGlvbikgewotCQlPYmplY3Qgb2xkRHVyYXRpb24gPSBkdXJhdGlvbjsKLQkJZHVyYXRpb24gPSBuZXdEdXJhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19EVVJBVElPTiwgb2xkRHVyYXRpb24sIGR1cmF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKSB7Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIG5ld0R1cmF0aW9uRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkRHVyYXRpb25Gb3JtYXQgPSBkdXJhdGlvbkZvcm1hdDsKLQkJZHVyYXRpb25Gb3JtYXQgPSBuZXdEdXJhdGlvbkZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19EVVJBVElPTl9GT1JNQVQsIG9sZER1cmF0aW9uRm9ybWF0LCBkdXJhdGlvbkZvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0V29yaygpIHsKLQkJcmV0dXJuIHdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29yayhPYmplY3QgbmV3V29yaykgewotCQlPYmplY3Qgb2xkV29yayA9IHdvcms7Ci0JCXdvcmsgPSBuZXdXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dPUkssIG9sZFdvcmssIHdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFN0b3AoKSB7Ci0JCXJldHVybiBzdG9wOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0b3AoT2JqZWN0IG5ld1N0b3ApIHsKLQkJT2JqZWN0IG9sZFN0b3AgPSBzdG9wOwotCQlzdG9wID0gbmV3U3RvcDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVE9QLCBvbGRTdG9wLCBzdG9wKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZXN1bWUoKSB7Ci0JCXJldHVybiByZXN1bWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzdW1lKE9iamVjdCBuZXdSZXN1bWUpIHsKLQkJT2JqZWN0IG9sZFJlc3VtZSA9IHJlc3VtZTsKLQkJcmVzdW1lID0gbmV3UmVzdW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFU1VNRSwgb2xkUmVzdW1lLCByZXN1bWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc3VtZVZhbGlkKCkgewotCQlyZXR1cm4gcmVzdW1lVmFsaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzdW1lVmFsaWQoYm9vbGVhbiBuZXdSZXN1bWVWYWxpZCkgewotCQlib29sZWFuIG9sZFJlc3VtZVZhbGlkID0gcmVzdW1lVmFsaWQ7Ci0JCXJlc3VtZVZhbGlkID0gbmV3UmVzdW1lVmFsaWQ7Ci0JCWJvb2xlYW4gb2xkUmVzdW1lVmFsaWRFU2V0ID0gcmVzdW1lVmFsaWRFU2V0OwotCQlyZXN1bWVWYWxpZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFU1VNRV9WQUxJRCwgb2xkUmVzdW1lVmFsaWQsIHJlc3VtZVZhbGlkLCAhb2xkUmVzdW1lVmFsaWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSZXN1bWVWYWxpZCgpIHsKLQkJYm9vbGVhbiBvbGRSZXN1bWVWYWxpZCA9IHJlc3VtZVZhbGlkOwotCQlib29sZWFuIG9sZFJlc3VtZVZhbGlkRVNldCA9IHJlc3VtZVZhbGlkRVNldDsKLQkJcmVzdW1lVmFsaWQgPSBSRVNVTUVfVkFMSURfRURFRkFVTFQ7Ci0JCXJlc3VtZVZhbGlkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FX1ZBTElELCBvbGRSZXN1bWVWYWxpZCwgUkVTVU1FX1ZBTElEX0VERUZBVUxULCBvbGRSZXN1bWVWYWxpZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJlc3VtZVZhbGlkKCkgewotCQlyZXR1cm4gcmVzdW1lVmFsaWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRWZmb3J0RHJpdmVuKCkgewotCQlyZXR1cm4gZWZmb3J0RHJpdmVuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVmZm9ydERyaXZlbihib29sZWFuIG5ld0VmZm9ydERyaXZlbikgewotCQlib29sZWFuIG9sZEVmZm9ydERyaXZlbiA9IGVmZm9ydERyaXZlbjsKLQkJZWZmb3J0RHJpdmVuID0gbmV3RWZmb3J0RHJpdmVuOwotCQlib29sZWFuIG9sZEVmZm9ydERyaXZlbkVTZXQgPSBlZmZvcnREcml2ZW5FU2V0OwotCQllZmZvcnREcml2ZW5FU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FRkZPUlRfRFJJVkVOLCBvbGRFZmZvcnREcml2ZW4sIGVmZm9ydERyaXZlbiwgIW9sZEVmZm9ydERyaXZlbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEVmZm9ydERyaXZlbigpIHsKLQkJYm9vbGVhbiBvbGRFZmZvcnREcml2ZW4gPSBlZmZvcnREcml2ZW47Ci0JCWJvb2xlYW4gb2xkRWZmb3J0RHJpdmVuRVNldCA9IGVmZm9ydERyaXZlbkVTZXQ7Ci0JCWVmZm9ydERyaXZlbiA9IEVGRk9SVF9EUklWRU5fRURFRkFVTFQ7Ci0JCWVmZm9ydERyaXZlbkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VGRk9SVF9EUklWRU4sIG9sZEVmZm9ydERyaXZlbiwgRUZGT1JUX0RSSVZFTl9FREVGQVVMVCwgb2xkRWZmb3J0RHJpdmVuRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RWZmb3J0RHJpdmVuKCkgewotCQlyZXR1cm4gZWZmb3J0RHJpdmVuRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlY3VycmluZygpIHsKLQkJcmV0dXJuIHJlY3VycmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWN1cnJpbmcoYm9vbGVhbiBuZXdSZWN1cnJpbmcpIHsKLQkJYm9vbGVhbiBvbGRSZWN1cnJpbmcgPSByZWN1cnJpbmc7Ci0JCXJlY3VycmluZyA9IG5ld1JlY3VycmluZzsKLQkJYm9vbGVhbiBvbGRSZWN1cnJpbmdFU2V0ID0gcmVjdXJyaW5nRVNldDsKLQkJcmVjdXJyaW5nRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVDVVJSSU5HLCBvbGRSZWN1cnJpbmcsIHJlY3VycmluZywgIW9sZFJlY3VycmluZ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlY3VycmluZygpIHsKLQkJYm9vbGVhbiBvbGRSZWN1cnJpbmcgPSByZWN1cnJpbmc7Ci0JCWJvb2xlYW4gb2xkUmVjdXJyaW5nRVNldCA9IHJlY3VycmluZ0VTZXQ7Ci0JCXJlY3VycmluZyA9IFJFQ1VSUklOR19FREVGQVVMVDsKLQkJcmVjdXJyaW5nRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVDVVJSSU5HLCBvbGRSZWN1cnJpbmcsIFJFQ1VSUklOR19FREVGQVVMVCwgb2xkUmVjdXJyaW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmVjdXJyaW5nKCkgewotCQlyZXR1cm4gcmVjdXJyaW5nRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJBbGxvY2F0ZWQoKSB7Ci0JCXJldHVybiBvdmVyQWxsb2NhdGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbiBuZXdPdmVyQWxsb2NhdGVkKSB7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZCA9IG92ZXJBbGxvY2F0ZWQ7Ci0JCW92ZXJBbGxvY2F0ZWQgPSBuZXdPdmVyQWxsb2NhdGVkOwotCQlib29sZWFuIG9sZE92ZXJBbGxvY2F0ZWRFU2V0ID0gb3ZlckFsbG9jYXRlZEVTZXQ7Ci0JCW92ZXJBbGxvY2F0ZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSX0FMTE9DQVRFRCwgb2xkT3ZlckFsbG9jYXRlZCwgb3ZlckFsbG9jYXRlZCwgIW9sZE92ZXJBbGxvY2F0ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRPdmVyQWxsb2NhdGVkKCkgewotCQlib29sZWFuIG9sZE92ZXJBbGxvY2F0ZWQgPSBvdmVyQWxsb2NhdGVkOwotCQlib29sZWFuIG9sZE92ZXJBbGxvY2F0ZWRFU2V0ID0gb3ZlckFsbG9jYXRlZEVTZXQ7Ci0JCW92ZXJBbGxvY2F0ZWQgPSBPVkVSX0FMTE9DQVRFRF9FREVGQVVMVDsKLQkJb3ZlckFsbG9jYXRlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJfQUxMT0NBVEVELCBvbGRPdmVyQWxsb2NhdGVkLCBPVkVSX0FMTE9DQVRFRF9FREVGQVVMVCwgb2xkT3ZlckFsbG9jYXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE92ZXJBbGxvY2F0ZWQoKSB7Ci0JCXJldHVybiBvdmVyQWxsb2NhdGVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VzdGltYXRlZCgpIHsKLQkJcmV0dXJuIGVzdGltYXRlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFc3RpbWF0ZWQoYm9vbGVhbiBuZXdFc3RpbWF0ZWQpIHsKLQkJYm9vbGVhbiBvbGRFc3RpbWF0ZWQgPSBlc3RpbWF0ZWQ7Ci0JCWVzdGltYXRlZCA9IG5ld0VzdGltYXRlZDsKLQkJYm9vbGVhbiBvbGRFc3RpbWF0ZWRFU2V0ID0gZXN0aW1hdGVkRVNldDsKLQkJZXN0aW1hdGVkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVNUSU1BVEVELCBvbGRFc3RpbWF0ZWQsIGVzdGltYXRlZCwgIW9sZEVzdGltYXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEVzdGltYXRlZCgpIHsKLQkJYm9vbGVhbiBvbGRFc3RpbWF0ZWQgPSBlc3RpbWF0ZWQ7Ci0JCWJvb2xlYW4gb2xkRXN0aW1hdGVkRVNldCA9IGVzdGltYXRlZEVTZXQ7Ci0JCWVzdGltYXRlZCA9IEVTVElNQVRFRF9FREVGQVVMVDsKLQkJZXN0aW1hdGVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVNUSU1BVEVELCBvbGRFc3RpbWF0ZWQsIEVTVElNQVRFRF9FREVGQVVMVCwgb2xkRXN0aW1hdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RXN0aW1hdGVkKCkgewotCQlyZXR1cm4gZXN0aW1hdGVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01pbGVzdG9uZSgpIHsKLQkJcmV0dXJuIG1pbGVzdG9uZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaWxlc3RvbmUoYm9vbGVhbiBuZXdNaWxlc3RvbmUpIHsKLQkJYm9vbGVhbiBvbGRNaWxlc3RvbmUgPSBtaWxlc3RvbmU7Ci0JCW1pbGVzdG9uZSA9IG5ld01pbGVzdG9uZTsKLQkJYm9vbGVhbiBvbGRNaWxlc3RvbmVFU2V0ID0gbWlsZXN0b25lRVNldDsKLQkJbWlsZXN0b25lRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTUlMRVNUT05FLCBvbGRNaWxlc3RvbmUsIG1pbGVzdG9uZSwgIW9sZE1pbGVzdG9uZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE1pbGVzdG9uZSgpIHsKLQkJYm9vbGVhbiBvbGRNaWxlc3RvbmUgPSBtaWxlc3RvbmU7Ci0JCWJvb2xlYW4gb2xkTWlsZXN0b25lRVNldCA9IG1pbGVzdG9uZUVTZXQ7Ci0JCW1pbGVzdG9uZSA9IE1JTEVTVE9ORV9FREVGQVVMVDsKLQkJbWlsZXN0b25lRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTUlMRVNUT05FLCBvbGRNaWxlc3RvbmUsIE1JTEVTVE9ORV9FREVGQVVMVCwgb2xkTWlsZXN0b25lRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TWlsZXN0b25lKCkgewotCQlyZXR1cm4gbWlsZXN0b25lRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1bW1hcnkoKSB7Ci0JCXJldHVybiBzdW1tYXJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1bW1hcnkoYm9vbGVhbiBuZXdTdW1tYXJ5KSB7Ci0JCWJvb2xlYW4gb2xkU3VtbWFyeSA9IHN1bW1hcnk7Ci0JCXN1bW1hcnkgPSBuZXdTdW1tYXJ5OwotCQlib29sZWFuIG9sZFN1bW1hcnlFU2V0ID0gc3VtbWFyeUVTZXQ7Ci0JCXN1bW1hcnlFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVU1NQVJZLCBvbGRTdW1tYXJ5LCBzdW1tYXJ5LCAhb2xkU3VtbWFyeUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFN1bW1hcnkoKSB7Ci0JCWJvb2xlYW4gb2xkU3VtbWFyeSA9IHN1bW1hcnk7Ci0JCWJvb2xlYW4gb2xkU3VtbWFyeUVTZXQgPSBzdW1tYXJ5RVNldDsKLQkJc3VtbWFyeSA9IFNVTU1BUllfRURFRkFVTFQ7Ci0JCXN1bW1hcnlFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVU1NQVJZLCBvbGRTdW1tYXJ5LCBTVU1NQVJZX0VERUZBVUxULCBvbGRTdW1tYXJ5RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0U3VtbWFyeSgpIHsKLQkJcmV0dXJuIHN1bW1hcnlFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ3JpdGljYWwoKSB7Ci0JCXJldHVybiBjcml0aWNhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDcml0aWNhbChib29sZWFuIG5ld0NyaXRpY2FsKSB7Ci0JCWJvb2xlYW4gb2xkQ3JpdGljYWwgPSBjcml0aWNhbDsKLQkJY3JpdGljYWwgPSBuZXdDcml0aWNhbDsKLQkJYm9vbGVhbiBvbGRDcml0aWNhbEVTZXQgPSBjcml0aWNhbEVTZXQ7Ci0JCWNyaXRpY2FsRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1JJVElDQUwsIG9sZENyaXRpY2FsLCBjcml0aWNhbCwgIW9sZENyaXRpY2FsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q3JpdGljYWwoKSB7Ci0JCWJvb2xlYW4gb2xkQ3JpdGljYWwgPSBjcml0aWNhbDsKLQkJYm9vbGVhbiBvbGRDcml0aWNhbEVTZXQgPSBjcml0aWNhbEVTZXQ7Ci0JCWNyaXRpY2FsID0gQ1JJVElDQUxfRURFRkFVTFQ7Ci0JCWNyaXRpY2FsRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1JJVElDQUwsIG9sZENyaXRpY2FsLCBDUklUSUNBTF9FREVGQVVMVCwgb2xkQ3JpdGljYWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRDcml0aWNhbCgpIHsKLQkJcmV0dXJuIGNyaXRpY2FsRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzU3VicHJvamVjdCgpIHsKLQkJcmV0dXJuIGlzU3VicHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1N1YnByb2plY3QoYm9vbGVhbiBuZXdJc1N1YnByb2plY3QpIHsKLQkJYm9vbGVhbiBvbGRJc1N1YnByb2plY3QgPSBpc1N1YnByb2plY3Q7Ci0JCWlzU3VicHJvamVjdCA9IG5ld0lzU3VicHJvamVjdDsKLQkJYm9vbGVhbiBvbGRJc1N1YnByb2plY3RFU2V0ID0gaXNTdWJwcm9qZWN0RVNldDsKLQkJaXNTdWJwcm9qZWN0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfU1VCUFJPSkVDVCwgb2xkSXNTdWJwcm9qZWN0LCBpc1N1YnByb2plY3QsICFvbGRJc1N1YnByb2plY3RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc1N1YnByb2plY3QoKSB7Ci0JCWJvb2xlYW4gb2xkSXNTdWJwcm9qZWN0ID0gaXNTdWJwcm9qZWN0OwotCQlib29sZWFuIG9sZElzU3VicHJvamVjdEVTZXQgPSBpc1N1YnByb2plY3RFU2V0OwotCQlpc1N1YnByb2plY3QgPSBJU19TVUJQUk9KRUNUX0VERUZBVUxUOwotCQlpc1N1YnByb2plY3RFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19TVUJQUk9KRUNULCBvbGRJc1N1YnByb2plY3QsIElTX1NVQlBST0pFQ1RfRURFRkFVTFQsIG9sZElzU3VicHJvamVjdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzU3VicHJvamVjdCgpIHsKLQkJcmV0dXJuIGlzU3VicHJvamVjdEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc1N1YnByb2plY3RSZWFkT25seSgpIHsKLQkJcmV0dXJuIGlzU3VicHJvamVjdFJlYWRPbmx5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzU3VicHJvamVjdFJlYWRPbmx5KGJvb2xlYW4gbmV3SXNTdWJwcm9qZWN0UmVhZE9ubHkpIHsKLQkJYm9vbGVhbiBvbGRJc1N1YnByb2plY3RSZWFkT25seSA9IGlzU3VicHJvamVjdFJlYWRPbmx5OwotCQlpc1N1YnByb2plY3RSZWFkT25seSA9IG5ld0lzU3VicHJvamVjdFJlYWRPbmx5OwotCQlib29sZWFuIG9sZElzU3VicHJvamVjdFJlYWRPbmx5RVNldCA9IGlzU3VicHJvamVjdFJlYWRPbmx5RVNldDsKLQkJaXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19TVUJQUk9KRUNUX1JFQURfT05MWSwgb2xkSXNTdWJwcm9qZWN0UmVhZE9ubHksIGlzU3VicHJvamVjdFJlYWRPbmx5LCAhb2xkSXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc1N1YnByb2plY3RSZWFkT25seSgpIHsKLQkJYm9vbGVhbiBvbGRJc1N1YnByb2plY3RSZWFkT25seSA9IGlzU3VicHJvamVjdFJlYWRPbmx5OwotCQlib29sZWFuIG9sZElzU3VicHJvamVjdFJlYWRPbmx5RVNldCA9IGlzU3VicHJvamVjdFJlYWRPbmx5RVNldDsKLQkJaXNTdWJwcm9qZWN0UmVhZE9ubHkgPSBJU19TVUJQUk9KRUNUX1JFQURfT05MWV9FREVGQVVMVDsKLQkJaXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19TVUJQUk9KRUNUX1JFQURfT05MWSwgb2xkSXNTdWJwcm9qZWN0UmVhZE9ubHksIElTX1NVQlBST0pFQ1RfUkVBRF9PTkxZX0VERUZBVUxULCBvbGRJc1N1YnByb2plY3RSZWFkT25seUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzU3VicHJvamVjdFJlYWRPbmx5KCkgewotCQlyZXR1cm4gaXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3VicHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBzdWJwcm9qZWN0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdWJwcm9qZWN0TmFtZShTdHJpbmcgbmV3U3VicHJvamVjdE5hbWUpIHsKLQkJU3RyaW5nIG9sZFN1YnByb2plY3ROYW1lID0gc3VicHJvamVjdE5hbWU7Ci0JCXN1YnByb2plY3ROYW1lID0gbmV3U3VicHJvamVjdE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VCUFJPSkVDVF9OQU1FLCBvbGRTdWJwcm9qZWN0TmFtZSwgc3VicHJvamVjdE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsVGFzaygpIHsKLQkJcmV0dXJuIGV4dGVybmFsVGFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbFRhc2soYm9vbGVhbiBuZXdFeHRlcm5hbFRhc2spIHsKLQkJYm9vbGVhbiBvbGRFeHRlcm5hbFRhc2sgPSBleHRlcm5hbFRhc2s7Ci0JCWV4dGVybmFsVGFzayA9IG5ld0V4dGVybmFsVGFzazsKLQkJYm9vbGVhbiBvbGRFeHRlcm5hbFRhc2tFU2V0ID0gZXh0ZXJuYWxUYXNrRVNldDsKLQkJZXh0ZXJuYWxUYXNrRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURVJOQUxfVEFTSywgb2xkRXh0ZXJuYWxUYXNrLCBleHRlcm5hbFRhc2ssICFvbGRFeHRlcm5hbFRhc2tFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRFeHRlcm5hbFRhc2soKSB7Ci0JCWJvb2xlYW4gb2xkRXh0ZXJuYWxUYXNrID0gZXh0ZXJuYWxUYXNrOwotCQlib29sZWFuIG9sZEV4dGVybmFsVGFza0VTZXQgPSBleHRlcm5hbFRhc2tFU2V0OwotCQlleHRlcm5hbFRhc2sgPSBFWFRFUk5BTF9UQVNLX0VERUZBVUxUOwotCQlleHRlcm5hbFRhc2tFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLLCBvbGRFeHRlcm5hbFRhc2ssIEVYVEVSTkFMX1RBU0tfRURFRkFVTFQsIG9sZEV4dGVybmFsVGFza0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEV4dGVybmFsVGFzaygpIHsKLQkJcmV0dXJuIGV4dGVybmFsVGFza0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlcm5hbFRhc2tQcm9qZWN0KCkgewotCQlyZXR1cm4gZXh0ZXJuYWxUYXNrUHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbFRhc2tQcm9qZWN0KFN0cmluZyBuZXdFeHRlcm5hbFRhc2tQcm9qZWN0KSB7Ci0JCVN0cmluZyBvbGRFeHRlcm5hbFRhc2tQcm9qZWN0ID0gZXh0ZXJuYWxUYXNrUHJvamVjdDsKLQkJZXh0ZXJuYWxUYXNrUHJvamVjdCA9IG5ld0V4dGVybmFsVGFza1Byb2plY3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURVJOQUxfVEFTS19QUk9KRUNULCBvbGRFeHRlcm5hbFRhc2tQcm9qZWN0LCBleHRlcm5hbFRhc2tQcm9qZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRFYXJseVN0YXJ0KCkgewotCQlyZXR1cm4gZWFybHlTdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFYXJseVN0YXJ0KE9iamVjdCBuZXdFYXJseVN0YXJ0KSB7Ci0JCU9iamVjdCBvbGRFYXJseVN0YXJ0ID0gZWFybHlTdGFydDsKLQkJZWFybHlTdGFydCA9IG5ld0Vhcmx5U3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTFlfU1RBUlQsIG9sZEVhcmx5U3RhcnQsIGVhcmx5U3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEVhcmx5RmluaXNoKCkgewotCQlyZXR1cm4gZWFybHlGaW5pc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWFybHlGaW5pc2goT2JqZWN0IG5ld0Vhcmx5RmluaXNoKSB7Ci0JCU9iamVjdCBvbGRFYXJseUZpbmlzaCA9IGVhcmx5RmluaXNoOwotCQllYXJseUZpbmlzaCA9IG5ld0Vhcmx5RmluaXNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUkxZX0ZJTklTSCwgb2xkRWFybHlGaW5pc2gsIGVhcmx5RmluaXNoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRMYXRlU3RhcnQoKSB7Ci0JCXJldHVybiBsYXRlU3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGF0ZVN0YXJ0KE9iamVjdCBuZXdMYXRlU3RhcnQpIHsKLQkJT2JqZWN0IG9sZExhdGVTdGFydCA9IGxhdGVTdGFydDsKLQkJbGF0ZVN0YXJ0ID0gbmV3TGF0ZVN0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xBVEVfU1RBUlQsIG9sZExhdGVTdGFydCwgbGF0ZVN0YXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRMYXRlRmluaXNoKCkgewotCQlyZXR1cm4gbGF0ZUZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXRlRmluaXNoKE9iamVjdCBuZXdMYXRlRmluaXNoKSB7Ci0JCU9iamVjdCBvbGRMYXRlRmluaXNoID0gbGF0ZUZpbmlzaDsKLQkJbGF0ZUZpbmlzaCA9IG5ld0xhdGVGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEFURV9GSU5JU0gsIG9sZExhdGVGaW5pc2gsIGxhdGVGaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRTdGFydFZhcmlhbmNlKCkgewotCQlyZXR1cm4gc3RhcnRWYXJpYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydFZhcmlhbmNlKEJpZ0ludGVnZXIgbmV3U3RhcnRWYXJpYW5jZSkgewotCQlCaWdJbnRlZ2VyIG9sZFN0YXJ0VmFyaWFuY2UgPSBzdGFydFZhcmlhbmNlOwotCQlzdGFydFZhcmlhbmNlID0gbmV3U3RhcnRWYXJpYW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVEFSVF9WQVJJQU5DRSwgb2xkU3RhcnRWYXJpYW5jZSwgc3RhcnRWYXJpYW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEZpbmlzaFZhcmlhbmNlKCkgewotCQlyZXR1cm4gZmluaXNoVmFyaWFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluaXNoVmFyaWFuY2UoQmlnSW50ZWdlciBuZXdGaW5pc2hWYXJpYW5jZSkgewotCQlCaWdJbnRlZ2VyIG9sZEZpbmlzaFZhcmlhbmNlID0gZmluaXNoVmFyaWFuY2U7Ci0JCWZpbmlzaFZhcmlhbmNlID0gbmV3RmluaXNoVmFyaWFuY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklOSVNIX1ZBUklBTkNFLCBvbGRGaW5pc2hWYXJpYW5jZSwgZmluaXNoVmFyaWFuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0V29ya1ZhcmlhbmNlKCkgewotCQlyZXR1cm4gd29ya1ZhcmlhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtWYXJpYW5jZShmbG9hdCBuZXdXb3JrVmFyaWFuY2UpIHsKLQkJZmxvYXQgb2xkV29ya1ZhcmlhbmNlID0gd29ya1ZhcmlhbmNlOwotCQl3b3JrVmFyaWFuY2UgPSBuZXdXb3JrVmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkV29ya1ZhcmlhbmNlRVNldCA9IHdvcmtWYXJpYW5jZUVTZXQ7Ci0JCXdvcmtWYXJpYW5jZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dPUktfVkFSSUFOQ0UsIG9sZFdvcmtWYXJpYW5jZSwgd29ya1ZhcmlhbmNlLCAhb2xkV29ya1ZhcmlhbmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0V29ya1ZhcmlhbmNlKCkgewotCQlmbG9hdCBvbGRXb3JrVmFyaWFuY2UgPSB3b3JrVmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkV29ya1ZhcmlhbmNlRVNldCA9IHdvcmtWYXJpYW5jZUVTZXQ7Ci0JCXdvcmtWYXJpYW5jZSA9IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0JCXdvcmtWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dPUktfVkFSSUFOQ0UsIG9sZFdvcmtWYXJpYW5jZSwgV09SS19WQVJJQU5DRV9FREVGQVVMVCwgb2xkV29ya1ZhcmlhbmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0V29ya1ZhcmlhbmNlKCkgewotCQlyZXR1cm4gd29ya1ZhcmlhbmNlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRGcmVlU2xhY2soKSB7Ci0JCXJldHVybiBmcmVlU2xhY2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RnJlZVNsYWNrKEJpZ0ludGVnZXIgbmV3RnJlZVNsYWNrKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRnJlZVNsYWNrID0gZnJlZVNsYWNrOwotCQlmcmVlU2xhY2sgPSBuZXdGcmVlU2xhY2s7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRlJFRV9TTEFDSywgb2xkRnJlZVNsYWNrLCBmcmVlU2xhY2spKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRUb3RhbFNsYWNrKCkgewotCQlyZXR1cm4gdG90YWxTbGFjazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb3RhbFNsYWNrKEJpZ0ludGVnZXIgbmV3VG90YWxTbGFjaykgewotCQlCaWdJbnRlZ2VyIG9sZFRvdGFsU2xhY2sgPSB0b3RhbFNsYWNrOwotCQl0b3RhbFNsYWNrID0gbmV3VG90YWxTbGFjazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19UT1RBTF9TTEFDSywgb2xkVG90YWxTbGFjaywgdG90YWxTbGFjaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRGaXhlZENvc3QoKSB7Ci0JCXJldHVybiBmaXhlZENvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rml4ZWRDb3N0KGZsb2F0IG5ld0ZpeGVkQ29zdCkgewotCQlmbG9hdCBvbGRGaXhlZENvc3QgPSBmaXhlZENvc3Q7Ci0JCWZpeGVkQ29zdCA9IG5ld0ZpeGVkQ29zdDsKLQkJYm9vbGVhbiBvbGRGaXhlZENvc3RFU2V0ID0gZml4ZWRDb3N0RVNldDsKLQkJZml4ZWRDb3N0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklYRURfQ09TVCwgb2xkRml4ZWRDb3N0LCBmaXhlZENvc3QsICFvbGRGaXhlZENvc3RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRGaXhlZENvc3QoKSB7Ci0JCWZsb2F0IG9sZEZpeGVkQ29zdCA9IGZpeGVkQ29zdDsKLQkJYm9vbGVhbiBvbGRGaXhlZENvc3RFU2V0ID0gZml4ZWRDb3N0RVNldDsKLQkJZml4ZWRDb3N0ID0gRklYRURfQ09TVF9FREVGQVVMVDsKLQkJZml4ZWRDb3N0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklYRURfQ09TVCwgb2xkRml4ZWRDb3N0LCBGSVhFRF9DT1NUX0VERUZBVUxULCBvbGRGaXhlZENvc3RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRGaXhlZENvc3QoKSB7Ci0JCXJldHVybiBmaXhlZENvc3RFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rml4ZWRDb3N0QWNjcnVhbCgpIHsKLQkJcmV0dXJuIGZpeGVkQ29zdEFjY3J1YWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rml4ZWRDb3N0QWNjcnVhbChTdHJpbmcgbmV3Rml4ZWRDb3N0QWNjcnVhbCkgewotCQlTdHJpbmcgb2xkRml4ZWRDb3N0QWNjcnVhbCA9IGZpeGVkQ29zdEFjY3J1YWw7Ci0JCWZpeGVkQ29zdEFjY3J1YWwgPSBuZXdGaXhlZENvc3RBY2NydWFsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1RfQUNDUlVBTCwgb2xkRml4ZWRDb3N0QWNjcnVhbCwgZml4ZWRDb3N0QWNjcnVhbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFBlcmNlbnRDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHBlcmNlbnRDb21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZXJjZW50Q29tcGxldGUoQmlnSW50ZWdlciBuZXdQZXJjZW50Q29tcGxldGUpIHsKLQkJQmlnSW50ZWdlciBvbGRQZXJjZW50Q29tcGxldGUgPSBwZXJjZW50Q29tcGxldGU7Ci0JCXBlcmNlbnRDb21wbGV0ZSA9IG5ld1BlcmNlbnRDb21wbGV0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QRVJDRU5UX0NPTVBMRVRFLCBvbGRQZXJjZW50Q29tcGxldGUsIHBlcmNlbnRDb21wbGV0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFBlcmNlbnRXb3JrQ29tcGxldGUoKSB7Ci0JCXJldHVybiBwZXJjZW50V29ya0NvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlcmNlbnRXb3JrQ29tcGxldGUoQmlnSW50ZWdlciBuZXdQZXJjZW50V29ya0NvbXBsZXRlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkUGVyY2VudFdvcmtDb21wbGV0ZSA9IHBlcmNlbnRXb3JrQ29tcGxldGU7Ci0JCXBlcmNlbnRXb3JrQ29tcGxldGUgPSBuZXdQZXJjZW50V29ya0NvbXBsZXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfV09SS19DT01QTEVURSwgb2xkUGVyY2VudFdvcmtDb21wbGV0ZSwgcGVyY2VudFdvcmtDb21wbGV0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldENvc3QoKSB7Ci0JCXJldHVybiBjb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvc3QoQmlnRGVjaW1hbCBuZXdDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkQ29zdCA9IGNvc3Q7Ci0JCWNvc3QgPSBuZXdDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPU1QsIG9sZENvc3QsIGNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRPdmVydGltZUNvc3QoKSB7Ci0JCXJldHVybiBvdmVydGltZUNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgbmV3T3ZlcnRpbWVDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkT3ZlcnRpbWVDb3N0ID0gb3ZlcnRpbWVDb3N0OwotCQlvdmVydGltZUNvc3QgPSBuZXdPdmVydGltZUNvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUlRJTUVfQ09TVCwgb2xkT3ZlcnRpbWVDb3N0LCBvdmVydGltZUNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE92ZXJ0aW1lV29yaygpIHsKLQkJcmV0dXJuIG92ZXJ0aW1lV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVydGltZVdvcmsoT2JqZWN0IG5ld092ZXJ0aW1lV29yaykgewotCQlPYmplY3Qgb2xkT3ZlcnRpbWVXb3JrID0gb3ZlcnRpbWVXb3JrOwotCQlvdmVydGltZVdvcmsgPSBuZXdPdmVydGltZVdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUlRJTUVfV09SSywgb2xkT3ZlcnRpbWVXb3JrLCBvdmVydGltZVdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbFN0YXJ0KCkgewotCQlyZXR1cm4gYWN0dWFsU3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsU3RhcnQoT2JqZWN0IG5ld0FjdHVhbFN0YXJ0KSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxTdGFydCA9IGFjdHVhbFN0YXJ0OwotCQlhY3R1YWxTdGFydCA9IG5ld0FjdHVhbFN0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9TVEFSVCwgb2xkQWN0dWFsU3RhcnQsIGFjdHVhbFN0YXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxGaW5pc2goKSB7Ci0JCXJldHVybiBhY3R1YWxGaW5pc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsRmluaXNoKE9iamVjdCBuZXdBY3R1YWxGaW5pc2gpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbEZpbmlzaCA9IGFjdHVhbEZpbmlzaDsKLQkJYWN0dWFsRmluaXNoID0gbmV3QWN0dWFsRmluaXNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9GSU5JU0gsIG9sZEFjdHVhbEZpbmlzaCwgYWN0dWFsRmluaXNoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxEdXJhdGlvbigpIHsKLQkJcmV0dXJuIGFjdHVhbER1cmF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbER1cmF0aW9uKE9iamVjdCBuZXdBY3R1YWxEdXJhdGlvbikgewotCQlPYmplY3Qgb2xkQWN0dWFsRHVyYXRpb24gPSBhY3R1YWxEdXJhdGlvbjsKLQkJYWN0dWFsRHVyYXRpb24gPSBuZXdBY3R1YWxEdXJhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfRFVSQVRJT04sIG9sZEFjdHVhbER1cmF0aW9uLCBhY3R1YWxEdXJhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldEFjdHVhbENvc3QoKSB7Ci0JCXJldHVybiBhY3R1YWxDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbENvc3QoQmlnRGVjaW1hbCBuZXdBY3R1YWxDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkQWN0dWFsQ29zdCA9IGFjdHVhbENvc3Q7Ci0JCWFjdHVhbENvc3QgPSBuZXdBY3R1YWxDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9DT1NULCBvbGRBY3R1YWxDb3N0LCBhY3R1YWxDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkgewotCQlyZXR1cm4gYWN0dWFsT3ZlcnRpbWVDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIG5ld0FjdHVhbE92ZXJ0aW1lQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZEFjdHVhbE92ZXJ0aW1lQ29zdCA9IGFjdHVhbE92ZXJ0aW1lQ29zdDsKLQkJYWN0dWFsT3ZlcnRpbWVDb3N0ID0gbmV3QWN0dWFsT3ZlcnRpbWVDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9DT1NULCBvbGRBY3R1YWxPdmVydGltZUNvc3QsIGFjdHVhbE92ZXJ0aW1lQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsV29yaygpIHsKLQkJcmV0dXJuIGFjdHVhbFdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsV29yayhPYmplY3QgbmV3QWN0dWFsV29yaykgewotCQlPYmplY3Qgb2xkQWN0dWFsV29yayA9IGFjdHVhbFdvcms7Ci0JCWFjdHVhbFdvcmsgPSBuZXdBY3R1YWxXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9XT1JLLCBvbGRBY3R1YWxXb3JrLCBhY3R1YWxXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmsoKSB7Ci0JCXJldHVybiBhY3R1YWxPdmVydGltZVdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKE9iamVjdCBuZXdBY3R1YWxPdmVydGltZVdvcmspIHsKLQkJT2JqZWN0IG9sZEFjdHVhbE92ZXJ0aW1lV29yayA9IGFjdHVhbE92ZXJ0aW1lV29yazsKLQkJYWN0dWFsT3ZlcnRpbWVXb3JrID0gbmV3QWN0dWFsT3ZlcnRpbWVXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLLCBvbGRBY3R1YWxPdmVydGltZVdvcmssIGFjdHVhbE92ZXJ0aW1lV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVndWxhcldvcmsoKSB7Ci0JCXJldHVybiByZWd1bGFyV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWd1bGFyV29yayhPYmplY3QgbmV3UmVndWxhcldvcmspIHsKLQkJT2JqZWN0IG9sZFJlZ3VsYXJXb3JrID0gcmVndWxhcldvcms7Ci0JCXJlZ3VsYXJXb3JrID0gbmV3UmVndWxhcldvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVHVUxBUl9XT1JLLCBvbGRSZWd1bGFyV29yaywgcmVndWxhcldvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlbWFpbmluZ0R1cmF0aW9uKCkgewotCQlyZXR1cm4gcmVtYWluaW5nRHVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nRHVyYXRpb24oT2JqZWN0IG5ld1JlbWFpbmluZ0R1cmF0aW9uKSB7Ci0JCU9iamVjdCBvbGRSZW1haW5pbmdEdXJhdGlvbiA9IHJlbWFpbmluZ0R1cmF0aW9uOwotCQlyZW1haW5pbmdEdXJhdGlvbiA9IG5ld1JlbWFpbmluZ0R1cmF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19EVVJBVElPTiwgb2xkUmVtYWluaW5nRHVyYXRpb24sIHJlbWFpbmluZ0R1cmF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nQ29zdCgpIHsKLQkJcmV0dXJuIHJlbWFpbmluZ0Nvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsIG5ld1JlbWFpbmluZ0Nvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRSZW1haW5pbmdDb3N0ID0gcmVtYWluaW5nQ29zdDsKLQkJcmVtYWluaW5nQ29zdCA9IG5ld1JlbWFpbmluZ0Nvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0NPU1QsIG9sZFJlbWFpbmluZ0Nvc3QsIHJlbWFpbmluZ0Nvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlbWFpbmluZ1dvcmsoKSB7Ci0JCXJldHVybiByZW1haW5pbmdXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ1dvcmsoT2JqZWN0IG5ld1JlbWFpbmluZ1dvcmspIHsKLQkJT2JqZWN0IG9sZFJlbWFpbmluZ1dvcmsgPSByZW1haW5pbmdXb3JrOwotCQlyZW1haW5pbmdXb3JrID0gbmV3UmVtYWluaW5nV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfV09SSywgb2xkUmVtYWluaW5nV29yaywgcmVtYWluaW5nV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpIHsKLQkJcmV0dXJuIHJlbWFpbmluZ092ZXJ0aW1lQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1haW5pbmdPdmVydGltZUNvc3QoQmlnRGVjaW1hbCBuZXdSZW1haW5pbmdPdmVydGltZUNvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRSZW1haW5pbmdPdmVydGltZUNvc3QgPSByZW1haW5pbmdPdmVydGltZUNvc3Q7Ci0JCXJlbWFpbmluZ092ZXJ0aW1lQ29zdCA9IG5ld1JlbWFpbmluZ092ZXJ0aW1lQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVCwgb2xkUmVtYWluaW5nT3ZlcnRpbWVDb3N0LCByZW1haW5pbmdPdmVydGltZUNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpIHsKLQkJcmV0dXJuIHJlbWFpbmluZ092ZXJ0aW1lV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoT2JqZWN0IG5ld1JlbWFpbmluZ092ZXJ0aW1lV29yaykgewotCQlPYmplY3Qgb2xkUmVtYWluaW5nT3ZlcnRpbWVXb3JrID0gcmVtYWluaW5nT3ZlcnRpbWVXb3JrOwotCQlyZW1haW5pbmdPdmVydGltZVdvcmsgPSBuZXdSZW1haW5pbmdPdmVydGltZVdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX09WRVJUSU1FX1dPUkssIG9sZFJlbWFpbmluZ092ZXJ0aW1lV29yaywgcmVtYWluaW5nT3ZlcnRpbWVXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEFDV1AoKSB7Ci0JCXJldHVybiBhQ1dQOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFDV1AoZmxvYXQgbmV3QUNXUCkgewotCQlmbG9hdCBvbGRBQ1dQID0gYUNXUDsKLQkJYUNXUCA9IG5ld0FDV1A7Ci0JCWJvb2xlYW4gb2xkQUNXUEVTZXQgPSBhQ1dQRVNldDsKLQkJYUNXUEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDV1AsIG9sZEFDV1AsIGFDV1AsICFvbGRBQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QUNXUCgpIHsKLQkJZmxvYXQgb2xkQUNXUCA9IGFDV1A7Ci0JCWJvb2xlYW4gb2xkQUNXUEVTZXQgPSBhQ1dQRVNldDsKLQkJYUNXUCA9IEFDV1BfRURFRkFVTFQ7Ci0JCWFDV1BFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1dQLCBvbGRBQ1dQLCBBQ1dQX0VERUZBVUxULCBvbGRBQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QUNXUCgpIHsKLQkJcmV0dXJuIGFDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRDVigpIHsKLQkJcmV0dXJuIGNWOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENWKGZsb2F0IG5ld0NWKSB7Ci0JCWZsb2F0IG9sZENWID0gY1Y7Ci0JCWNWID0gbmV3Q1Y7Ci0JCWJvb2xlYW4gb2xkQ1ZFU2V0ID0gY1ZFU2V0OwotCQljVkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NWLCBvbGRDViwgY1YsICFvbGRDVkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldENWKCkgewotCQlmbG9hdCBvbGRDViA9IGNWOwotCQlib29sZWFuIG9sZENWRVNldCA9IGNWRVNldDsKLQkJY1YgPSBDVl9FREVGQVVMVDsKLQkJY1ZFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DViwgb2xkQ1YsIENWX0VERUZBVUxULCBvbGRDVkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldENWKCkgewotCQlyZXR1cm4gY1ZFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldENvbnN0cmFpbnRUeXBlKCkgewotCQlyZXR1cm4gY29uc3RyYWludFR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uc3RyYWludFR5cGUoQmlnSW50ZWdlciBuZXdDb25zdHJhaW50VHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZENvbnN0cmFpbnRUeXBlID0gY29uc3RyYWludFR5cGU7Ci0JCWNvbnN0cmFpbnRUeXBlID0gbmV3Q29uc3RyYWludFR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09OU1RSQUlOVF9UWVBFLCBvbGRDb25zdHJhaW50VHlwZSwgY29uc3RyYWludFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRDYWxlbmRhclVJRCgpIHsKLQkJcmV0dXJuIGNhbGVuZGFyVUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhbGVuZGFyVUlEKEJpZ0ludGVnZXIgbmV3Q2FsZW5kYXJVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRDYWxlbmRhclVJRCA9IGNhbGVuZGFyVUlEOwotCQljYWxlbmRhclVJRCA9IG5ld0NhbGVuZGFyVUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NBTEVOREFSX1VJRCwgb2xkQ2FsZW5kYXJVSUQsIGNhbGVuZGFyVUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb25zdHJhaW50RGF0ZSgpIHsKLQkJcmV0dXJuIGNvbnN0cmFpbnREYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnN0cmFpbnREYXRlKE9iamVjdCBuZXdDb25zdHJhaW50RGF0ZSkgewotCQlPYmplY3Qgb2xkQ29uc3RyYWludERhdGUgPSBjb25zdHJhaW50RGF0ZTsKLQkJY29uc3RyYWludERhdGUgPSBuZXdDb25zdHJhaW50RGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05TVFJBSU5UX0RBVEUsIG9sZENvbnN0cmFpbnREYXRlLCBjb25zdHJhaW50RGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGVhZGxpbmUoKSB7Ci0JCXJldHVybiBkZWFkbGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWFkbGluZShPYmplY3QgbmV3RGVhZGxpbmUpIHsKLQkJT2JqZWN0IG9sZERlYWRsaW5lID0gZGVhZGxpbmU7Ci0JCWRlYWRsaW5lID0gbmV3RGVhZGxpbmU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fREVBRExJTkUsIG9sZERlYWRsaW5lLCBkZWFkbGluZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGV2ZWxBc3NpZ25tZW50cygpIHsKLQkJcmV0dXJuIGxldmVsQXNzaWdubWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV2ZWxBc3NpZ25tZW50cyhib29sZWFuIG5ld0xldmVsQXNzaWdubWVudHMpIHsKLQkJYm9vbGVhbiBvbGRMZXZlbEFzc2lnbm1lbnRzID0gbGV2ZWxBc3NpZ25tZW50czsKLQkJbGV2ZWxBc3NpZ25tZW50cyA9IG5ld0xldmVsQXNzaWdubWVudHM7Ci0JCWJvb2xlYW4gb2xkTGV2ZWxBc3NpZ25tZW50c0VTZXQgPSBsZXZlbEFzc2lnbm1lbnRzRVNldDsKLQkJbGV2ZWxBc3NpZ25tZW50c0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMX0FTU0lHTk1FTlRTLCBvbGRMZXZlbEFzc2lnbm1lbnRzLCBsZXZlbEFzc2lnbm1lbnRzLCAhb2xkTGV2ZWxBc3NpZ25tZW50c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldExldmVsQXNzaWdubWVudHMoKSB7Ci0JCWJvb2xlYW4gb2xkTGV2ZWxBc3NpZ25tZW50cyA9IGxldmVsQXNzaWdubWVudHM7Ci0JCWJvb2xlYW4gb2xkTGV2ZWxBc3NpZ25tZW50c0VTZXQgPSBsZXZlbEFzc2lnbm1lbnRzRVNldDsKLQkJbGV2ZWxBc3NpZ25tZW50cyA9IExFVkVMX0FTU0lHTk1FTlRTX0VERUZBVUxUOwotCQlsZXZlbEFzc2lnbm1lbnRzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxfQVNTSUdOTUVOVFMsIG9sZExldmVsQXNzaWdubWVudHMsIExFVkVMX0FTU0lHTk1FTlRTX0VERUZBVUxULCBvbGRMZXZlbEFzc2lnbm1lbnRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TGV2ZWxBc3NpZ25tZW50cygpIHsKLQkJcmV0dXJuIGxldmVsQXNzaWdubWVudHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGV2ZWxpbmdDYW5TcGxpdCgpIHsKLQkJcmV0dXJuIGxldmVsaW5nQ2FuU3BsaXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV2ZWxpbmdDYW5TcGxpdChib29sZWFuIG5ld0xldmVsaW5nQ2FuU3BsaXQpIHsKLQkJYm9vbGVhbiBvbGRMZXZlbGluZ0NhblNwbGl0ID0gbGV2ZWxpbmdDYW5TcGxpdDsKLQkJbGV2ZWxpbmdDYW5TcGxpdCA9IG5ld0xldmVsaW5nQ2FuU3BsaXQ7Ci0JCWJvb2xlYW4gb2xkTGV2ZWxpbmdDYW5TcGxpdEVTZXQgPSBsZXZlbGluZ0NhblNwbGl0RVNldDsKLQkJbGV2ZWxpbmdDYW5TcGxpdEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0NBTl9TUExJVCwgb2xkTGV2ZWxpbmdDYW5TcGxpdCwgbGV2ZWxpbmdDYW5TcGxpdCwgIW9sZExldmVsaW5nQ2FuU3BsaXRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRMZXZlbGluZ0NhblNwbGl0KCkgewotCQlib29sZWFuIG9sZExldmVsaW5nQ2FuU3BsaXQgPSBsZXZlbGluZ0NhblNwbGl0OwotCQlib29sZWFuIG9sZExldmVsaW5nQ2FuU3BsaXRFU2V0ID0gbGV2ZWxpbmdDYW5TcGxpdEVTZXQ7Ci0JCWxldmVsaW5nQ2FuU3BsaXQgPSBMRVZFTElOR19DQU5fU1BMSVRfRURFRkFVTFQ7Ci0JCWxldmVsaW5nQ2FuU3BsaXRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTElOR19DQU5fU1BMSVQsIG9sZExldmVsaW5nQ2FuU3BsaXQsIExFVkVMSU5HX0NBTl9TUExJVF9FREVGQVVMVCwgb2xkTGV2ZWxpbmdDYW5TcGxpdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldExldmVsaW5nQ2FuU3BsaXQoKSB7Ci0JCXJldHVybiBsZXZlbGluZ0NhblNwbGl0RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRMZXZlbGluZ0RlbGF5KCkgewotCQlyZXR1cm4gbGV2ZWxpbmdEZWxheTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbGluZ0RlbGF5KEJpZ0ludGVnZXIgbmV3TGV2ZWxpbmdEZWxheSkgewotCQlCaWdJbnRlZ2VyIG9sZExldmVsaW5nRGVsYXkgPSBsZXZlbGluZ0RlbGF5OwotCQlsZXZlbGluZ0RlbGF5ID0gbmV3TGV2ZWxpbmdEZWxheTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTElOR19ERUxBWSwgb2xkTGV2ZWxpbmdEZWxheSwgbGV2ZWxpbmdEZWxheSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldExldmVsaW5nRGVsYXlGb3JtYXQoKSB7Ci0JCXJldHVybiBsZXZlbGluZ0RlbGF5Rm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExldmVsaW5nRGVsYXlGb3JtYXQoQmlnSW50ZWdlciBuZXdMZXZlbGluZ0RlbGF5Rm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkTGV2ZWxpbmdEZWxheUZvcm1hdCA9IGxldmVsaW5nRGVsYXlGb3JtYXQ7Ci0JCWxldmVsaW5nRGVsYXlGb3JtYXQgPSBuZXdMZXZlbGluZ0RlbGF5Rm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVCwgb2xkTGV2ZWxpbmdEZWxheUZvcm1hdCwgbGV2ZWxpbmdEZWxheUZvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJlTGV2ZWxlZFN0YXJ0KCkgewotCQlyZXR1cm4gcHJlTGV2ZWxlZFN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZUxldmVsZWRTdGFydChPYmplY3QgbmV3UHJlTGV2ZWxlZFN0YXJ0KSB7Ci0JCU9iamVjdCBvbGRQcmVMZXZlbGVkU3RhcnQgPSBwcmVMZXZlbGVkU3RhcnQ7Ci0JCXByZUxldmVsZWRTdGFydCA9IG5ld1ByZUxldmVsZWRTdGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUkVfTEVWRUxFRF9TVEFSVCwgb2xkUHJlTGV2ZWxlZFN0YXJ0LCBwcmVMZXZlbGVkU3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByZUxldmVsZWRGaW5pc2goKSB7Ci0JCXJldHVybiBwcmVMZXZlbGVkRmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZUxldmVsZWRGaW5pc2goT2JqZWN0IG5ld1ByZUxldmVsZWRGaW5pc2gpIHsKLQkJT2JqZWN0IG9sZFByZUxldmVsZWRGaW5pc2ggPSBwcmVMZXZlbGVkRmluaXNoOwotCQlwcmVMZXZlbGVkRmluaXNoID0gbmV3UHJlTGV2ZWxlZEZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUkVfTEVWRUxFRF9GSU5JU0gsIG9sZFByZUxldmVsZWRGaW5pc2gsIHByZUxldmVsZWRGaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGluaygpIHsKLQkJcmV0dXJuIGh5cGVybGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmsoU3RyaW5nIG5ld0h5cGVybGluaykgewotCQlTdHJpbmcgb2xkSHlwZXJsaW5rID0gaHlwZXJsaW5rOwotCQloeXBlcmxpbmsgPSBuZXdIeXBlcmxpbms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LLCBvbGRIeXBlcmxpbmssIGh5cGVybGluaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rQWRkcmVzcygpIHsKLQkJcmV0dXJuIGh5cGVybGlua0FkZHJlc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rQWRkcmVzcyhTdHJpbmcgbmV3SHlwZXJsaW5rQWRkcmVzcykgewotCQlTdHJpbmcgb2xkSHlwZXJsaW5rQWRkcmVzcyA9IGh5cGVybGlua0FkZHJlc3M7Ci0JCWh5cGVybGlua0FkZHJlc3MgPSBuZXdIeXBlcmxpbmtBZGRyZXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOS19BRERSRVNTLCBvbGRIeXBlcmxpbmtBZGRyZXNzLCBoeXBlcmxpbmtBZGRyZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rU3ViQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZyBuZXdIeXBlcmxpbmtTdWJBZGRyZXNzKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmtTdWJBZGRyZXNzID0gaHlwZXJsaW5rU3ViQWRkcmVzczsKLQkJaHlwZXJsaW5rU3ViQWRkcmVzcyA9IG5ld0h5cGVybGlua1N1YkFkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LX1NVQl9BRERSRVNTLCBvbGRIeXBlcmxpbmtTdWJBZGRyZXNzLCBoeXBlcmxpbmtTdWJBZGRyZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkgewotCQlyZXR1cm4gaWdub3JlUmVzb3VyY2VDYWxlbmRhcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKGJvb2xlYW4gbmV3SWdub3JlUmVzb3VyY2VDYWxlbmRhcikgewotCQlib29sZWFuIG9sZElnbm9yZVJlc291cmNlQ2FsZW5kYXIgPSBpZ25vcmVSZXNvdXJjZUNhbGVuZGFyOwotCQlpZ25vcmVSZXNvdXJjZUNhbGVuZGFyID0gbmV3SWdub3JlUmVzb3VyY2VDYWxlbmRhcjsKLQkJYm9vbGVhbiBvbGRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldCA9IGlnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0OwotCQlpZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSUdOT1JFX1JFU09VUkNFX0NBTEVOREFSLCBvbGRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyLCBpZ25vcmVSZXNvdXJjZUNhbGVuZGFyLCAhb2xkSWdub3JlUmVzb3VyY2VDYWxlbmRhckVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKSB7Ci0JCWJvb2xlYW4gb2xkSWdub3JlUmVzb3VyY2VDYWxlbmRhciA9IGlnbm9yZVJlc291cmNlQ2FsZW5kYXI7Ci0JCWJvb2xlYW4gb2xkSWdub3JlUmVzb3VyY2VDYWxlbmRhckVTZXQgPSBpZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldDsKLQkJaWdub3JlUmVzb3VyY2VDYWxlbmRhciA9IElHTk9SRV9SRVNPVVJDRV9DQUxFTkRBUl9FREVGQVVMVDsKLQkJaWdub3JlUmVzb3VyY2VDYWxlbmRhckVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lHTk9SRV9SRVNPVVJDRV9DQUxFTkRBUiwgb2xkSWdub3JlUmVzb3VyY2VDYWxlbmRhciwgSUdOT1JFX1JFU09VUkNFX0NBTEVOREFSX0VERUZBVUxULCBvbGRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpIHsKLQkJcmV0dXJuIGlnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm90ZXMoKSB7Ci0JCXJldHVybiBub3RlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb3RlcyhTdHJpbmcgbmV3Tm90ZXMpIHsKLQkJU3RyaW5nIG9sZE5vdGVzID0gbm90ZXM7Ci0JCW5vdGVzID0gbmV3Tm90ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTk9URVMsIG9sZE5vdGVzLCBub3RlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSGlkZUJhcigpIHsKLQkJcmV0dXJuIGhpZGVCYXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGlkZUJhcihib29sZWFuIG5ld0hpZGVCYXIpIHsKLQkJYm9vbGVhbiBvbGRIaWRlQmFyID0gaGlkZUJhcjsKLQkJaGlkZUJhciA9IG5ld0hpZGVCYXI7Ci0JCWJvb2xlYW4gb2xkSGlkZUJhckVTZXQgPSBoaWRlQmFyRVNldDsKLQkJaGlkZUJhckVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hJREVfQkFSLCBvbGRIaWRlQmFyLCBoaWRlQmFyLCAhb2xkSGlkZUJhckVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEhpZGVCYXIoKSB7Ci0JCWJvb2xlYW4gb2xkSGlkZUJhciA9IGhpZGVCYXI7Ci0JCWJvb2xlYW4gb2xkSGlkZUJhckVTZXQgPSBoaWRlQmFyRVNldDsKLQkJaGlkZUJhciA9IEhJREVfQkFSX0VERUZBVUxUOwotCQloaWRlQmFyRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSElERV9CQVIsIG9sZEhpZGVCYXIsIEhJREVfQkFSX0VERUZBVUxULCBvbGRIaWRlQmFyRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SGlkZUJhcigpIHsKLQkJcmV0dXJuIGhpZGVCYXJFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUm9sbHVwKCkgewotCQlyZXR1cm4gcm9sbHVwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGx1cChib29sZWFuIG5ld1JvbGx1cCkgewotCQlib29sZWFuIG9sZFJvbGx1cCA9IHJvbGx1cDsKLQkJcm9sbHVwID0gbmV3Um9sbHVwOwotCQlib29sZWFuIG9sZFJvbGx1cEVTZXQgPSByb2xsdXBFU2V0OwotCQlyb2xsdXBFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ST0xMVVAsIG9sZFJvbGx1cCwgcm9sbHVwLCAhb2xkUm9sbHVwRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Um9sbHVwKCkgewotCQlib29sZWFuIG9sZFJvbGx1cCA9IHJvbGx1cDsKLQkJYm9vbGVhbiBvbGRSb2xsdXBFU2V0ID0gcm9sbHVwRVNldDsKLQkJcm9sbHVwID0gUk9MTFVQX0VERUZBVUxUOwotCQlyb2xsdXBFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ST0xMVVAsIG9sZFJvbGx1cCwgUk9MTFVQX0VERUZBVUxULCBvbGRSb2xsdXBFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSb2xsdXAoKSB7Ci0JCXJldHVybiByb2xsdXBFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dTKGZsb2F0IG5ld0JDV1MpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJDV1MgPSBuZXdCQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1NFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQ1dTLCBvbGRCQ1dTLCBiQ1dTLCAhb2xkQkNXU0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1MoKSB7Ci0JCWZsb2F0IG9sZEJDV1MgPSBiQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1MgPSBCQ1dTX0VERUZBVUxUOwotCQliQ1dTRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUywgb2xkQkNXUywgQkNXU19FREVGQVVMVCwgb2xkQkNXU0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEJDV1MoKSB7Ci0JCXJldHVybiBiQ1dTRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0QkNXUCgpIHsKLQkJcmV0dXJuIGJDV1A7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QkNXUChmbG9hdCBuZXdCQ1dQKSB7Ci0JCWZsb2F0IG9sZEJDV1AgPSBiQ1dQOwotCQliQ1dQID0gbmV3QkNXUDsKLQkJYm9vbGVhbiBvbGRCQ1dQRVNldCA9IGJDV1BFU2V0OwotCQliQ1dQRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUCwgb2xkQkNXUCwgYkNXUCwgIW9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dQKCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYm9vbGVhbiBvbGRCQ1dQRVNldCA9IGJDV1BFU2V0OwotCQliQ1dQID0gQkNXUF9FREVGQVVMVDsKLQkJYkNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JDV1AsIG9sZEJDV1AsIEJDV1BfRURFRkFVTFQsIG9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKSB7Ci0JCXJldHVybiBwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZShCaWdJbnRlZ2VyIG5ld1BoeXNpY2FsUGVyY2VudENvbXBsZXRlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkUGh5c2ljYWxQZXJjZW50Q29tcGxldGUgPSBwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZTsKLQkJcGh5c2ljYWxQZXJjZW50Q29tcGxldGUgPSBuZXdQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QSFlTSUNBTF9QRVJDRU5UX0NPTVBMRVRFLCBvbGRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSwgcGh5c2ljYWxQZXJjZW50Q29tcGxldGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpIHsKLQkJcmV0dXJuIGVhcm5lZFZhbHVlTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVhcm5lZFZhbHVlTWV0aG9kKEJpZ0ludGVnZXIgbmV3RWFybmVkVmFsdWVNZXRob2QpIHsKLQkJQmlnSW50ZWdlciBvbGRFYXJuZWRWYWx1ZU1ldGhvZCA9IGVhcm5lZFZhbHVlTWV0aG9kOwotCQllYXJuZWRWYWx1ZU1ldGhvZCA9IG5ld0Vhcm5lZFZhbHVlTWV0aG9kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUk5FRF9WQUxVRV9NRVRIT0QsIG9sZEVhcm5lZFZhbHVlTWV0aG9kLCBlYXJuZWRWYWx1ZU1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRQcmVkZWNlc3NvckxpbmsoKSB7Ci0JCWlmIChwcmVkZWNlc3NvckxpbmsgPT0gbnVsbCkgewotCQkJcHJlZGVjZXNzb3JMaW5rID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFByZWRlY2Vzc29yTGluay5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUkVERUNFU1NPUl9MSU5LKTsKLQkJfQotCQlyZXR1cm4gcHJlZGVjZXNzb3JMaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpIHsKLQkJcmV0dXJuIGFjdHVhbFdvcmtQcm90ZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsV29ya1Byb3RlY3RlZChPYmplY3QgbmV3QWN0dWFsV29ya1Byb3RlY3RlZCkgewotCQlPYmplY3Qgb2xkQWN0dWFsV29ya1Byb3RlY3RlZCA9IGFjdHVhbFdvcmtQcm90ZWN0ZWQ7Ci0JCWFjdHVhbFdvcmtQcm90ZWN0ZWQgPSBuZXdBY3R1YWxXb3JrUHJvdGVjdGVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRCwgb2xkQWN0dWFsV29ya1Byb3RlY3RlZCwgYWN0dWFsV29ya1Byb3RlY3RlZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkgewotCQlyZXR1cm4gYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChPYmplY3QgbmV3QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPSBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ7Ci0JCWFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA9IG5ld0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQsIG9sZEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCwgYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEV4dGVuZGVkQXR0cmlidXRlKCkgewotCQlpZiAoZXh0ZW5kZWRBdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJZXh0ZW5kZWRBdHRyaWJ1dGUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRXh0ZW5kZWRBdHRyaWJ1dGUyLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVOREVEX0FUVFJJQlVURSk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRCYXNlbGluZSgpIHsKLQkJaWYgKGJhc2VsaW5lID09IG51bGwpIHsKLQkJCWJhc2VsaW5lID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEJhc2VsaW5lLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JBU0VMSU5FKTsKLQkJfQotCQlyZXR1cm4gYmFzZWxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE91dGxpbmVDb2RlKCkgewotCQlpZiAob3V0bGluZUNvZGUgPT0gbnVsbCkgewotCQkJb3V0bGluZUNvZGUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoT3V0bGluZUNvZGUyLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfQ09ERSk7Ci0JCX0KLQkJcmV0dXJuIG91dGxpbmVDb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUaW1lcGhhc2VkRGF0YSgpIHsKLQkJaWYgKHRpbWVwaGFzZWREYXRhID09IG51bGwpIHsKLQkJCXRpbWVwaGFzZWREYXRhID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFRpbWVwaGFzZWREYXRhVHlwZS5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19USU1FUEhBU0VEX0RBVEEpOwotCQl9Ci0JCXJldHVybiB0aW1lcGhhc2VkRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFREVDRVNTT1JfTElOSzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQcmVkZWNlc3NvckxpbmsoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQVNFTElORToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRCYXNlbGluZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfQ09ERToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRPdXRsaW5lQ29kZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RJTUVQSEFTRURfREFUQToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRUaW1lcGhhc2VkRGF0YSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVUlEOgotCQkJCXJldHVybiBnZXRVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JRDoKLQkJCQlyZXR1cm4gZ2V0SUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX05VTEw6Ci0JCQkJcmV0dXJuIGlzSXNOdWxsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSRUFURV9EQVRFOgotCQkJCXJldHVybiBnZXRDcmVhdGVEYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09OVEFDVDoKLQkJCQlyZXR1cm4gZ2V0Q29udGFjdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dCUzoKLQkJCQlyZXR1cm4gZ2V0V0JTKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV0JTX0xFVkVMOgotCQkJCXJldHVybiBnZXRXQlNMZXZlbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfTlVNQkVSOgotCQkJCXJldHVybiBnZXRPdXRsaW5lTnVtYmVyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9MRVZFTDoKLQkJCQlyZXR1cm4gZ2V0T3V0bGluZUxldmVsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJJT1JJVFk6Ci0JCQkJcmV0dXJuIGdldFByaW9yaXR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklOSVNIOgotCQkJCXJldHVybiBnZXRGaW5pc2goKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19EVVJBVElPTjoKLQkJCQlyZXR1cm4gZ2V0RHVyYXRpb24oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldER1cmF0aW9uRm9ybWF0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SSzoKLQkJCQlyZXR1cm4gZ2V0V29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUT1A6Ci0JCQkJcmV0dXJuIGdldFN0b3AoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRVNVTUU6Ci0JCQkJcmV0dXJuIGdldFJlc3VtZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFU1VNRV9WQUxJRDoKLQkJCQlyZXR1cm4gaXNSZXN1bWVWYWxpZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FRkZPUlRfRFJJVkVOOgotCQkJCXJldHVybiBpc0VmZm9ydERyaXZlbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUNVUlJJTkc6Ci0JCQkJcmV0dXJuIGlzUmVjdXJyaW5nKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJfQUxMT0NBVEVEOgotCQkJCXJldHVybiBpc092ZXJBbGxvY2F0ZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVNUSU1BVEVEOgotCQkJCXJldHVybiBpc0VzdGltYXRlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19NSUxFU1RPTkU6Ci0JCQkJcmV0dXJuIGlzTWlsZXN0b25lKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVTU1BUlk6Ci0JCQkJcmV0dXJuIGlzU3VtbWFyeSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DUklUSUNBTDoKLQkJCQlyZXR1cm4gaXNDcml0aWNhbCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19TVUJQUk9KRUNUOgotCQkJCXJldHVybiBpc0lzU3VicHJvamVjdCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19TVUJQUk9KRUNUX1JFQURfT05MWToKLQkJCQlyZXR1cm4gaXNJc1N1YnByb2plY3RSZWFkT25seSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVUJQUk9KRUNUX05BTUU6Ci0JCQkJcmV0dXJuIGdldFN1YnByb2plY3ROYW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURVJOQUxfVEFTSzoKLQkJCQlyZXR1cm4gaXNFeHRlcm5hbFRhc2soKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURVJOQUxfVEFTS19QUk9KRUNUOgotCQkJCXJldHVybiBnZXRFeHRlcm5hbFRhc2tQcm9qZWN0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTFlfU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldEVhcmx5U3RhcnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJMWV9GSU5JU0g6Ci0JCQkJcmV0dXJuIGdldEVhcmx5RmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEFURV9TVEFSVDoKLQkJCQlyZXR1cm4gZ2V0TGF0ZVN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEFURV9GSU5JU0g6Ci0JCQkJcmV0dXJuIGdldExhdGVGaW5pc2goKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVEFSVF9WQVJJQU5DRToKLQkJCQlyZXR1cm4gZ2V0U3RhcnRWYXJpYW5jZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSF9WQVJJQU5DRToKLQkJCQlyZXR1cm4gZ2V0RmluaXNoVmFyaWFuY2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XT1JLX1ZBUklBTkNFOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0V29ya1ZhcmlhbmNlKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZSRUVfU0xBQ0s6Ci0JCQkJcmV0dXJuIGdldEZyZWVTbGFjaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RPVEFMX1NMQUNLOgotCQkJCXJldHVybiBnZXRUb3RhbFNsYWNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklYRURfQ09TVDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEZpeGVkQ29zdCgpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NUX0FDQ1JVQUw6Ci0JCQkJcmV0dXJuIGdldEZpeGVkQ29zdEFjY3J1YWwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QRVJDRU5UX0NPTVBMRVRFOgotCQkJCXJldHVybiBnZXRQZXJjZW50Q29tcGxldGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QRVJDRU5UX1dPUktfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGdldFBlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT1NUOgotCQkJCXJldHVybiBnZXRDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gZ2V0T3ZlcnRpbWVDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gZ2V0T3ZlcnRpbWVXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1NUQVJUOgotCQkJCXJldHVybiBnZXRBY3R1YWxTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9GSU5JU0g6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbEZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9EVVJBVElPTjoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsRHVyYXRpb24oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfQ09TVDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRBY3R1YWxPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfV09SSzoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBnZXRBY3R1YWxPdmVydGltZVdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUdVTEFSX1dPUks6Ci0JCQkJcmV0dXJuIGdldFJlZ3VsYXJXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0RVUkFUSU9OOgotCQkJCXJldHVybiBnZXRSZW1haW5pbmdEdXJhdGlvbigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19DT1NUOgotCQkJCXJldHVybiBnZXRSZW1haW5pbmdDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX1dPUks6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ1dvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDV1A6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRBQ1dQKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NWOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0Q1YoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09OU1RSQUlOVF9UWVBFOgotCQkJCXJldHVybiBnZXRDb25zdHJhaW50VHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NBTEVOREFSX1VJRDoKLQkJCQlyZXR1cm4gZ2V0Q2FsZW5kYXJVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05TVFJBSU5UX0RBVEU6Ci0JCQkJcmV0dXJuIGdldENvbnN0cmFpbnREYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fREVBRExJTkU6Ci0JCQkJcmV0dXJuIGdldERlYWRsaW5lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxfQVNTSUdOTUVOVFM6Ci0JCQkJcmV0dXJuIGlzTGV2ZWxBc3NpZ25tZW50cygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTElOR19DQU5fU1BMSVQ6Ci0JCQkJcmV0dXJuIGlzTGV2ZWxpbmdDYW5TcGxpdCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTElOR19ERUxBWToKLQkJCQlyZXR1cm4gZ2V0TGV2ZWxpbmdEZWxheSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX1NUQVJUOgotCQkJCXJldHVybiBnZXRQcmVMZXZlbGVkU3RhcnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUkVfTEVWRUxFRF9GSU5JU0g6Ci0JCQkJcmV0dXJuIGdldFByZUxldmVsZWRGaW5pc2goKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTks6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGluaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOS19BRERSRVNTOgotCQkJCXJldHVybiBnZXRIeXBlcmxpbmtBZGRyZXNzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LX1NVQl9BRERSRVNTOgotCQkJCXJldHVybiBnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSUdOT1JFX1JFU09VUkNFX0NBTEVOREFSOgotCQkJCXJldHVybiBpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTk9URVM6Ci0JCQkJcmV0dXJuIGdldE5vdGVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSElERV9CQVI6Ci0JCQkJcmV0dXJuIGlzSGlkZUJhcigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ST0xMVVA6Ci0JCQkJcmV0dXJuIGlzUm9sbHVwKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JDV1M6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dTKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JDV1A6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dQKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGdldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTkVEX1ZBTFVFX01FVEhPRDoKLQkJCQlyZXR1cm4gZ2V0RWFybmVkVmFsdWVNZXRob2QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUkVERUNFU1NPUl9MSU5LOgotCQkJCXJldHVybiBnZXRQcmVkZWNlc3NvckxpbmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQ6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQVNFTElORToKLQkJCQlyZXR1cm4gZ2V0QmFzZWxpbmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0NPREU6Ci0JCQkJcmV0dXJuIGdldE91dGxpbmVDb2RlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVElNRVBIQVNFRF9EQVRBOgotCQkJCXJldHVybiBnZXRUaW1lcGhhc2VkRGF0YSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19VSUQ6Ci0JCQkJc2V0VUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSUQ6Ci0JCQkJc2V0SUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX05VTEw6Ci0JCQkJc2V0SXNOdWxsKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DUkVBVEVfREFURToKLQkJCQlzZXRDcmVhdGVEYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05UQUNUOgotCQkJCXNldENvbnRhY3QoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dCUzoKLQkJCQlzZXRXQlMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dCU19MRVZFTDoKLQkJCQlzZXRXQlNMZXZlbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9OVU1CRVI6Ci0JCQkJc2V0T3V0bGluZU51bWJlcigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9MRVZFTDoKLQkJCQlzZXRPdXRsaW5lTGV2ZWwoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUklPUklUWToKLQkJCQlzZXRQcmlvcml0eSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUQVJUOgotCQkJCXNldFN0YXJ0KChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSU5JU0g6Ci0JCQkJc2V0RmluaXNoKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19EVVJBVElPTjoKLQkJCQlzZXREdXJhdGlvbigoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRFVSQVRJT05fRk9STUFUOgotCQkJCXNldER1cmF0aW9uRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SSzoKLQkJCQlzZXRXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVE9QOgotCQkJCXNldFN0b3AoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFU1VNRToKLQkJCQlzZXRSZXN1bWUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFU1VNRV9WQUxJRDoKLQkJCQlzZXRSZXN1bWVWYWxpZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUZGT1JUX0RSSVZFTjoKLQkJCQlzZXRFZmZvcnREcml2ZW4oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFQ1VSUklORzoKLQkJCQlzZXRSZWN1cnJpbmcoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJfQUxMT0NBVEVEOgotCQkJCXNldE92ZXJBbGxvY2F0ZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VTVElNQVRFRDoKLQkJCQlzZXRFc3RpbWF0ZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX01JTEVTVE9ORToKLQkJCQlzZXRNaWxlc3RvbmUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVTU1BUlk6Ci0JCQkJc2V0U3VtbWFyeSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1JJVElDQUw6Ci0JCQkJc2V0Q3JpdGljYWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1Q6Ci0JCQkJc2V0SXNTdWJwcm9qZWN0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19TVUJQUk9KRUNUX1JFQURfT05MWToKLQkJCQlzZXRJc1N1YnByb2plY3RSZWFkT25seSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VCUFJPSkVDVF9OQU1FOgotCQkJCXNldFN1YnByb2plY3ROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLOgotCQkJCXNldEV4dGVybmFsVGFzaygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURVJOQUxfVEFTS19QUk9KRUNUOgotCQkJCXNldEV4dGVybmFsVGFza1Byb2plY3QoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUkxZX1NUQVJUOgotCQkJCXNldEVhcmx5U3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUkxZX0ZJTklTSDoKLQkJCQlzZXRFYXJseUZpbmlzaCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEFURV9TVEFSVDoKLQkJCQlzZXRMYXRlU3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xBVEVfRklOSVNIOgotCQkJCXNldExhdGVGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUQVJUX1ZBUklBTkNFOgotCQkJCXNldFN0YXJ0VmFyaWFuY2UoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSU5JU0hfVkFSSUFOQ0U6Ci0JCQkJc2V0RmluaXNoVmFyaWFuY2UoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XT1JLX1ZBUklBTkNFOgotCQkJCXNldFdvcmtWYXJpYW5jZSgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GUkVFX1NMQUNLOgotCQkJCXNldEZyZWVTbGFjaygoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RPVEFMX1NMQUNLOgotCQkJCXNldFRvdGFsU2xhY2soKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NUOgotCQkJCXNldEZpeGVkQ29zdCgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NUX0FDQ1JVQUw6Ci0JCQkJc2V0Rml4ZWRDb3N0QWNjcnVhbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEVSQ0VOVF9DT01QTEVURToKLQkJCQlzZXRQZXJjZW50Q29tcGxldGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QRVJDRU5UX1dPUktfQ09NUExFVEU6Ci0JCQkJc2V0UGVyY2VudFdvcmtDb21wbGV0ZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPU1Q6Ci0JCQkJc2V0Q29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0T3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRPdmVydGltZVdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9TVEFSVDoKLQkJCQlzZXRBY3R1YWxTdGFydCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0ZJTklTSDoKLQkJCQlzZXRBY3R1YWxGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9EVVJBVElPTjoKLQkJCQlzZXRBY3R1YWxEdXJhdGlvbigoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9XT1JLOgotCQkJCXNldEFjdHVhbFdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVHVUxBUl9XT1JLOgotCQkJCXNldFJlZ3VsYXJXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfRFVSQVRJT046Ci0JCQkJc2V0UmVtYWluaW5nRHVyYXRpb24oKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19DT1NUOgotCQkJCXNldFJlbWFpbmluZ0Nvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfV09SSzoKLQkJCQlzZXRSZW1haW5pbmdXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDV1A6Ci0JCQkJc2V0QUNXUCgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DVjoKLQkJCQlzZXRDVigoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05TVFJBSU5UX1RZUEU6Ci0JCQkJc2V0Q29uc3RyYWludFR5cGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DQUxFTkRBUl9VSUQ6Ci0JCQkJc2V0Q2FsZW5kYXJVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05TVFJBSU5UX0RBVEU6Ci0JCQkJc2V0Q29uc3RyYWludERhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RFQURMSU5FOgotCQkJCXNldERlYWRsaW5lKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTF9BU1NJR05NRU5UUzoKLQkJCQlzZXRMZXZlbEFzc2lnbm1lbnRzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTElOR19DQU5fU1BMSVQ6Ci0JCQkJc2V0TGV2ZWxpbmdDYW5TcGxpdCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVk6Ci0JCQkJc2V0TGV2ZWxpbmdEZWxheSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVDoKLQkJCQlzZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFX0xFVkVMRURfU1RBUlQ6Ci0JCQkJc2V0UHJlTGV2ZWxlZFN0YXJ0KChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUkVfTEVWRUxFRF9GSU5JU0g6Ci0JCQkJc2V0UHJlTGV2ZWxlZEZpbmlzaCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LOgotCQkJCXNldEh5cGVybGluaygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJc2V0SHlwZXJsaW5rQWRkcmVzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LX1NVQl9BRERSRVNTOgotCQkJCXNldEh5cGVybGlua1N1YkFkZHJlc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lHTk9SRV9SRVNPVVJDRV9DQUxFTkRBUjoKLQkJCQlzZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19OT1RFUzoKLQkJCQlzZXROb3RlcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSElERV9CQVI6Ci0JCQkJc2V0SGlkZUJhcigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUk9MTFVQOgotCQkJCXNldFJvbGx1cCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUzoKLQkJCQlzZXRCQ1dTKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JDV1A6Ci0JCQkJc2V0QkNXUCgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QSFlTSUNBTF9QRVJDRU5UX0NPTVBMRVRFOgotCQkJCXNldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTkVEX1ZBTFVFX01FVEhPRDoKLQkJCQlzZXRFYXJuZWRWYWx1ZU1ldGhvZCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRURFQ0VTU09SX0xJTks6Ci0JCQkJZ2V0UHJlZGVjZXNzb3JMaW5rKCkuY2xlYXIoKTsKLQkJCQlnZXRQcmVkZWNlc3NvckxpbmsoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsV29ya1Byb3RlY3RlZCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuY2xlYXIoKTsKLQkJCQlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JBU0VMSU5FOgotCQkJCWdldEJhc2VsaW5lKCkuY2xlYXIoKTsKLQkJCQlnZXRCYXNlbGluZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfQ09ERToKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0T3V0bGluZUNvZGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5jbGVhcigpOwotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSUQ6Ci0JCQkJc2V0SUQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfTlVMTDoKLQkJCQl1bnNldElzTnVsbCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DUkVBVEVfREFURToKLQkJCQlzZXRDcmVhdGVEYXRlKENSRUFURV9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09OVEFDVDoKLQkJCQlzZXRDb250YWN0KENPTlRBQ1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XQlM6Ci0JCQkJc2V0V0JTKFdCU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dCU19MRVZFTDoKLQkJCQlzZXRXQlNMZXZlbChXQlNfTEVWRUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX05VTUJFUjoKLQkJCQlzZXRPdXRsaW5lTnVtYmVyKE9VVExJTkVfTlVNQkVSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9MRVZFTDoKLQkJCQlzZXRPdXRsaW5lTGV2ZWwoT1VUTElORV9MRVZFTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSSU9SSVRZOgotCQkJCXNldFByaW9yaXR5KFBSSU9SSVRZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoU1RBUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSU5JU0g6Ci0JCQkJc2V0RmluaXNoKEZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OOgotCQkJCXNldER1cmF0aW9uKERVUkFUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRFVSQVRJT05fRk9STUFUOgotCQkJCXNldER1cmF0aW9uRm9ybWF0KERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dPUks6Ci0JCQkJc2V0V29yayhXT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RPUDoKLQkJCQlzZXRTdG9wKFNUT1BfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRVNVTUU6Ci0JCQkJc2V0UmVzdW1lKFJFU1VNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFU1VNRV9WQUxJRDoKLQkJCQl1bnNldFJlc3VtZVZhbGlkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VGRk9SVF9EUklWRU46Ci0JCQkJdW5zZXRFZmZvcnREcml2ZW4oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVDVVJSSU5HOgotCQkJCXVuc2V0UmVjdXJyaW5nKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJfQUxMT0NBVEVEOgotCQkJCXVuc2V0T3ZlckFsbG9jYXRlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FU1RJTUFURUQ6Ci0JCQkJdW5zZXRFc3RpbWF0ZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTUlMRVNUT05FOgotCQkJCXVuc2V0TWlsZXN0b25lKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVTU1BUlk6Ci0JCQkJdW5zZXRTdW1tYXJ5KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSSVRJQ0FMOgotCQkJCXVuc2V0Q3JpdGljYWwoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfU1VCUFJPSkVDVDoKLQkJCQl1bnNldElzU3VicHJvamVjdCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19TVUJQUk9KRUNUX1JFQURfT05MWToKLQkJCQl1bnNldElzU3VicHJvamVjdFJlYWRPbmx5KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVQlBST0pFQ1RfTkFNRToKLQkJCQlzZXRTdWJwcm9qZWN0TmFtZShTVUJQUk9KRUNUX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLOgotCQkJCXVuc2V0RXh0ZXJuYWxUYXNrKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0tfUFJPSkVDVDoKLQkJCQlzZXRFeHRlcm5hbFRhc2tQcm9qZWN0KEVYVEVSTkFMX1RBU0tfUFJPSkVDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUkxZX1NUQVJUOgotCQkJCXNldEVhcmx5U3RhcnQoRUFSTFlfU1RBUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJMWV9GSU5JU0g6Ci0JCQkJc2V0RWFybHlGaW5pc2goRUFSTFlfRklOSVNIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEFURV9TVEFSVDoKLQkJCQlzZXRMYXRlU3RhcnQoTEFURV9TVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xBVEVfRklOSVNIOgotCQkJCXNldExhdGVGaW5pc2goTEFURV9GSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVEFSVF9WQVJJQU5DRToKLQkJCQlzZXRTdGFydFZhcmlhbmNlKFNUQVJUX1ZBUklBTkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklOSVNIX1ZBUklBTkNFOgotCQkJCXNldEZpbmlzaFZhcmlhbmNlKEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJdW5zZXRXb3JrVmFyaWFuY2UoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRlJFRV9TTEFDSzoKLQkJCQlzZXRGcmVlU2xhY2soRlJFRV9TTEFDS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RPVEFMX1NMQUNLOgotCQkJCXNldFRvdGFsU2xhY2soVE9UQUxfU0xBQ0tfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NUOgotCQkJCXVuc2V0Rml4ZWRDb3N0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlzZXRGaXhlZENvc3RBY2NydWFsKEZJWEVEX0NPU1RfQUNDUlVBTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJc2V0UGVyY2VudENvbXBsZXRlKFBFUkNFTlRfQ09NUExFVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QRVJDRU5UX1dPUktfQ09NUExFVEU6Ci0JCQkJc2V0UGVyY2VudFdvcmtDb21wbGV0ZShQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT1NUOgotCQkJCXNldENvc3QoQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0T3ZlcnRpbWVDb3N0KE9WRVJUSU1FX0NPU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9XT1JLOgotCQkJCXNldE92ZXJ0aW1lV29yayhPVkVSVElNRV9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1NUQVJUOgotCQkJCXNldEFjdHVhbFN0YXJ0KEFDVFVBTF9TVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9GSU5JU0g6Ci0JCQkJc2V0QWN0dWFsRmluaXNoKEFDVFVBTF9GSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfRFVSQVRJT046Ci0JCQkJc2V0QWN0dWFsRHVyYXRpb24oQUNUVUFMX0RVUkFUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsQ29zdChBQ1RVQUxfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lQ29zdChBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9XT1JLOgotCQkJCXNldEFjdHVhbFdvcmsoQUNUVUFMX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRBY3R1YWxPdmVydGltZVdvcmsoQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUdVTEFSX1dPUks6Ci0JCQkJc2V0UmVndWxhcldvcmsoUkVHVUxBUl9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0RVUkFUSU9OOgotCQkJCXNldFJlbWFpbmluZ0R1cmF0aW9uKFJFTUFJTklOR19EVVJBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19DT1NUOgotCQkJCXNldFJlbWFpbmluZ0Nvc3QoUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfV09SSzoKLQkJCQlzZXRSZW1haW5pbmdXb3JrKFJFTUFJTklOR19XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KFJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNXUDoKLQkJCQl1bnNldEFDV1AoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1Y6Ci0JCQkJdW5zZXRDVigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05TVFJBSU5UX1RZUEU6Ci0JCQkJc2V0Q29uc3RyYWludFR5cGUoQ09OU1RSQUlOVF9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ0FMRU5EQVJfVUlEOgotCQkJCXNldENhbGVuZGFyVUlEKENBTEVOREFSX1VJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfREFURToKLQkJCQlzZXRDb25zdHJhaW50RGF0ZShDT05TVFJBSU5UX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ERUFETElORToKLQkJCQlzZXREZWFkbGluZShERUFETElORV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMX0FTU0lHTk1FTlRTOgotCQkJCXVuc2V0TGV2ZWxBc3NpZ25tZW50cygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTElOR19DQU5fU1BMSVQ6Ci0JCQkJdW5zZXRMZXZlbGluZ0NhblNwbGl0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0RFTEFZOgotCQkJCXNldExldmVsaW5nRGVsYXkoTEVWRUxJTkdfREVMQVlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTElOR19ERUxBWV9GT1JNQVQ6Ci0JCQkJc2V0TGV2ZWxpbmdEZWxheUZvcm1hdChMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUkVfTEVWRUxFRF9TVEFSVDoKLQkJCQlzZXRQcmVMZXZlbGVkU3RhcnQoUFJFX0xFVkVMRURfU1RBUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUkVfTEVWRUxFRF9GSU5JU0g6Ci0JCQkJc2V0UHJlTGV2ZWxlZEZpbmlzaChQUkVfTEVWRUxFRF9GSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTks6Ci0JCQkJc2V0SHlwZXJsaW5rKEhZUEVSTElOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOS19BRERSRVNTOgotCQkJCXNldEh5cGVybGlua0FkZHJlc3MoSFlQRVJMSU5LX0FERFJFU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTktfU1VCX0FERFJFU1M6Ci0JCQkJc2V0SHlwZXJsaW5rU3ViQWRkcmVzcyhIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVI6Ci0JCQkJdW5zZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05PVEVTOgotCQkJCXNldE5vdGVzKE5PVEVTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSElERV9CQVI6Ci0JCQkJdW5zZXRIaWRlQmFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JPTExVUDoKLQkJCQl1bnNldFJvbGx1cCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQ1dTOgotCQkJCXVuc2V0QkNXUygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQ1dQOgotCQkJCXVuc2V0QkNXUCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QSFlTSUNBTF9QRVJDRU5UX0NPTVBMRVRFOgotCQkJCXNldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKFBIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJORURfVkFMVUVfTUVUSE9EOgotCQkJCXNldEVhcm5lZFZhbHVlTWV0aG9kKEVBUk5FRF9WQUxVRV9NRVRIT0RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUkVERUNFU1NPUl9MSU5LOgotCQkJCWdldFByZWRlY2Vzc29yTGluaygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkFTRUxJTkU6Ci0JCQkJZ2V0QmFzZWxpbmUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0NPREU6Ci0JCQkJZ2V0T3V0bGluZUNvZGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1VJRDoKLQkJCQlyZXR1cm4gVUlEX0VERUZBVUxUID09IG51bGwgPyB1SUQgIT0gbnVsbCA6ICFVSURfRURFRkFVTFQuZXF1YWxzKHVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpRCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19OVUxMOgotCQkJCXJldHVybiBpc1NldElzTnVsbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSRUFURV9EQVRFOgotCQkJCXJldHVybiBDUkVBVEVfREFURV9FREVGQVVMVCA9PSBudWxsID8gY3JlYXRlRGF0ZSAhPSBudWxsIDogIUNSRUFURV9EQVRFX0VERUZBVUxULmVxdWFscyhjcmVhdGVEYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05UQUNUOgotCQkJCXJldHVybiBDT05UQUNUX0VERUZBVUxUID09IG51bGwgPyBjb250YWN0ICE9IG51bGwgOiAhQ09OVEFDVF9FREVGQVVMVC5lcXVhbHMoY29udGFjdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV0JTOgotCQkJCXJldHVybiBXQlNfRURFRkFVTFQgPT0gbnVsbCA/IHdCUyAhPSBudWxsIDogIVdCU19FREVGQVVMVC5lcXVhbHMod0JTKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XQlNfTEVWRUw6Ci0JCQkJcmV0dXJuIFdCU19MRVZFTF9FREVGQVVMVCA9PSBudWxsID8gd0JTTGV2ZWwgIT0gbnVsbCA6ICFXQlNfTEVWRUxfRURFRkFVTFQuZXF1YWxzKHdCU0xldmVsKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX05VTUJFUjoKLQkJCQlyZXR1cm4gT1VUTElORV9OVU1CRVJfRURFRkFVTFQgPT0gbnVsbCA/IG91dGxpbmVOdW1iZXIgIT0gbnVsbCA6ICFPVVRMSU5FX05VTUJFUl9FREVGQVVMVC5lcXVhbHMob3V0bGluZU51bWJlcik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9MRVZFTDoKLQkJCQlyZXR1cm4gT1VUTElORV9MRVZFTF9FREVGQVVMVCA9PSBudWxsID8gb3V0bGluZUxldmVsICE9IG51bGwgOiAhT1VUTElORV9MRVZFTF9FREVGQVVMVC5lcXVhbHMob3V0bGluZUxldmVsKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUklPUklUWToKLQkJCQlyZXR1cm4gUFJJT1JJVFlfRURFRkFVTFQgPT0gbnVsbCA/IHByaW9yaXR5ICE9IG51bGwgOiAhUFJJT1JJVFlfRURFRkFVTFQuZXF1YWxzKHByaW9yaXR5KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVEFSVDoKLQkJCQlyZXR1cm4gU1RBUlRfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0ICE9IG51bGwgOiAhU1RBUlRfRURFRkFVTFQuZXF1YWxzKHN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSU5JU0g6Ci0JCQkJcmV0dXJuIEZJTklTSF9FREVGQVVMVCA9PSBudWxsID8gZmluaXNoICE9IG51bGwgOiAhRklOSVNIX0VERUZBVUxULmVxdWFscyhmaW5pc2gpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OOgotCQkJCXJldHVybiBEVVJBVElPTl9FREVGQVVMVCA9PSBudWxsID8gZHVyYXRpb24gIT0gbnVsbCA6ICFEVVJBVElPTl9FREVGQVVMVC5lcXVhbHMoZHVyYXRpb24pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gRFVSQVRJT05fRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBkdXJhdGlvbkZvcm1hdCAhPSBudWxsIDogIURVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMoZHVyYXRpb25Gb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dPUks6Ci0JCQkJcmV0dXJuIFdPUktfRURFRkFVTFQgPT0gbnVsbCA/IHdvcmsgIT0gbnVsbCA6ICFXT1JLX0VERUZBVUxULmVxdWFscyh3b3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVE9QOgotCQkJCXJldHVybiBTVE9QX0VERUZBVUxUID09IG51bGwgPyBzdG9wICE9IG51bGwgOiAhU1RPUF9FREVGQVVMVC5lcXVhbHMoc3RvcCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FOgotCQkJCXJldHVybiBSRVNVTUVfRURFRkFVTFQgPT0gbnVsbCA/IHJlc3VtZSAhPSBudWxsIDogIVJFU1VNRV9FREVGQVVMVC5lcXVhbHMocmVzdW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRVNVTUVfVkFMSUQ6Ci0JCQkJcmV0dXJuIGlzU2V0UmVzdW1lVmFsaWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FRkZPUlRfRFJJVkVOOgotCQkJCXJldHVybiBpc1NldEVmZm9ydERyaXZlbigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFQ1VSUklORzoKLQkJCQlyZXR1cm4gaXNTZXRSZWN1cnJpbmcoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSX0FMTE9DQVRFRDoKLQkJCQlyZXR1cm4gaXNTZXRPdmVyQWxsb2NhdGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVNUSU1BVEVEOgotCQkJCXJldHVybiBpc1NldEVzdGltYXRlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX01JTEVTVE9ORToKLQkJCQlyZXR1cm4gaXNTZXRNaWxlc3RvbmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVU1NQVJZOgotCQkJCXJldHVybiBpc1NldFN1bW1hcnkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DUklUSUNBTDoKLQkJCQlyZXR1cm4gaXNTZXRDcml0aWNhbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1Q6Ci0JCQkJcmV0dXJuIGlzU2V0SXNTdWJwcm9qZWN0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfU1VCUFJPSkVDVF9SRUFEX09OTFk6Ci0JCQkJcmV0dXJuIGlzU2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVUJQUk9KRUNUX05BTUU6Ci0JCQkJcmV0dXJuIFNVQlBST0pFQ1RfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gc3VicHJvamVjdE5hbWUgIT0gbnVsbCA6ICFTVUJQUk9KRUNUX05BTUVfRURFRkFVTFQuZXF1YWxzKHN1YnByb2plY3ROYW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLOgotCQkJCXJldHVybiBpc1NldEV4dGVybmFsVGFzaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0tfUFJPSkVDVDoKLQkJCQlyZXR1cm4gRVhURVJOQUxfVEFTS19QUk9KRUNUX0VERUZBVUxUID09IG51bGwgPyBleHRlcm5hbFRhc2tQcm9qZWN0ICE9IG51bGwgOiAhRVhURVJOQUxfVEFTS19QUk9KRUNUX0VERUZBVUxULmVxdWFscyhleHRlcm5hbFRhc2tQcm9qZWN0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJMWV9TVEFSVDoKLQkJCQlyZXR1cm4gRUFSTFlfU1RBUlRfRURFRkFVTFQgPT0gbnVsbCA/IGVhcmx5U3RhcnQgIT0gbnVsbCA6ICFFQVJMWV9TVEFSVF9FREVGQVVMVC5lcXVhbHMoZWFybHlTdGFydCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTFlfRklOSVNIOgotCQkJCXJldHVybiBFQVJMWV9GSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IGVhcmx5RmluaXNoICE9IG51bGwgOiAhRUFSTFlfRklOSVNIX0VERUZBVUxULmVxdWFscyhlYXJseUZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEFURV9TVEFSVDoKLQkJCQlyZXR1cm4gTEFURV9TVEFSVF9FREVGQVVMVCA9PSBudWxsID8gbGF0ZVN0YXJ0ICE9IG51bGwgOiAhTEFURV9TVEFSVF9FREVGQVVMVC5lcXVhbHMobGF0ZVN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX0ZJTklTSDoKLQkJCQlyZXR1cm4gTEFURV9GSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IGxhdGVGaW5pc2ggIT0gbnVsbCA6ICFMQVRFX0ZJTklTSF9FREVGQVVMVC5lcXVhbHMobGF0ZUZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RBUlRfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIFNUQVJUX1ZBUklBTkNFX0VERUZBVUxUID09IG51bGwgPyBzdGFydFZhcmlhbmNlICE9IG51bGwgOiAhU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQuZXF1YWxzKHN0YXJ0VmFyaWFuY2UpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSF9WQVJJQU5DRToKLQkJCQlyZXR1cm4gRklOSVNIX1ZBUklBTkNFX0VERUZBVUxUID09IG51bGwgPyBmaW5pc2hWYXJpYW5jZSAhPSBudWxsIDogIUZJTklTSF9WQVJJQU5DRV9FREVGQVVMVC5lcXVhbHMoZmluaXNoVmFyaWFuY2UpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIGlzU2V0V29ya1ZhcmlhbmNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRlJFRV9TTEFDSzoKLQkJCQlyZXR1cm4gRlJFRV9TTEFDS19FREVGQVVMVCA9PSBudWxsID8gZnJlZVNsYWNrICE9IG51bGwgOiAhRlJFRV9TTEFDS19FREVGQVVMVC5lcXVhbHMoZnJlZVNsYWNrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19UT1RBTF9TTEFDSzoKLQkJCQlyZXR1cm4gVE9UQUxfU0xBQ0tfRURFRkFVTFQgPT0gbnVsbCA/IHRvdGFsU2xhY2sgIT0gbnVsbCA6ICFUT1RBTF9TTEFDS19FREVGQVVMVC5lcXVhbHModG90YWxTbGFjayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklYRURfQ09TVDoKLQkJCQlyZXR1cm4gaXNTZXRGaXhlZENvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NUX0FDQ1JVQUw6Ci0JCQkJcmV0dXJuIEZJWEVEX0NPU1RfQUNDUlVBTF9FREVGQVVMVCA9PSBudWxsID8gZml4ZWRDb3N0QWNjcnVhbCAhPSBudWxsIDogIUZJWEVEX0NPU1RfQUNDUlVBTF9FREVGQVVMVC5lcXVhbHMoZml4ZWRDb3N0QWNjcnVhbCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEVSQ0VOVF9DT01QTEVURToKLQkJCQlyZXR1cm4gUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVCA9PSBudWxsID8gcGVyY2VudENvbXBsZXRlICE9IG51bGwgOiAhUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVC5lcXVhbHMocGVyY2VudENvbXBsZXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QRVJDRU5UX1dPUktfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIFBFUkNFTlRfV09SS19DT01QTEVURV9FREVGQVVMVCA9PSBudWxsID8gcGVyY2VudFdvcmtDb21wbGV0ZSAhPSBudWxsIDogIVBFUkNFTlRfV09SS19DT01QTEVURV9FREVGQVVMVC5lcXVhbHMocGVyY2VudFdvcmtDb21wbGV0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09TVDoKLQkJCQlyZXR1cm4gQ09TVF9FREVGQVVMVCA9PSBudWxsID8gY29zdCAhPSBudWxsIDogIUNPU1RfRURFRkFVTFQuZXF1YWxzKGNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIE9WRVJUSU1FX0NPU1RfRURFRkFVTFQgPT0gbnVsbCA/IG92ZXJ0aW1lQ29zdCAhPSBudWxsIDogIU9WRVJUSU1FX0NPU1RfRURFRkFVTFQuZXF1YWxzKG92ZXJ0aW1lQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gb3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhT1ZFUlRJTUVfV09SS19FREVGQVVMVC5lcXVhbHMob3ZlcnRpbWVXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfU1RBUlQ6Ci0JCQkJcmV0dXJuIEFDVFVBTF9TVEFSVF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsU3RhcnQgIT0gbnVsbCA6ICFBQ1RVQUxfU1RBUlRfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfRklOSVNIOgotCQkJCXJldHVybiBBQ1RVQUxfRklOSVNIX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxGaW5pc2ggIT0gbnVsbCA6ICFBQ1RVQUxfRklOSVNIX0VERUZBVUxULmVxdWFscyhhY3R1YWxGaW5pc2gpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9EVVJBVElPTjoKLQkJCQlyZXR1cm4gQUNUVUFMX0RVUkFUSU9OX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxEdXJhdGlvbiAhPSBudWxsIDogIUFDVFVBTF9EVVJBVElPTl9FREVGQVVMVC5lcXVhbHMoYWN0dWFsRHVyYXRpb24pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBBQ1RVQUxfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsQ29zdCAhPSBudWxsIDogIUFDVFVBTF9DT1NUX0VERUZBVUxULmVxdWFscyhhY3R1YWxDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbE92ZXJ0aW1lQ29zdCAhPSBudWxsIDogIUFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxULmVxdWFscyhhY3R1YWxPdmVydGltZUNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9XT1JLOgotCQkJCXJldHVybiBBQ1RVQUxfV09SS19FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsV29yayAhPSBudWxsIDogIUFDVFVBTF9XT1JLX0VERUZBVUxULmVxdWFscyhhY3R1YWxXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbE92ZXJ0aW1lV29yayAhPSBudWxsIDogIUFDVFVBTF9PVkVSVElNRV9XT1JLX0VERUZBVUxULmVxdWFscyhhY3R1YWxPdmVydGltZVdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFR1VMQVJfV09SSzoKLQkJCQlyZXR1cm4gUkVHVUxBUl9XT1JLX0VERUZBVUxUID09IG51bGwgPyByZWd1bGFyV29yayAhPSBudWxsIDogIVJFR1VMQVJfV09SS19FREVGQVVMVC5lcXVhbHMocmVndWxhcldvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19EVVJBVElPTjoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX0RVUkFUSU9OX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdEdXJhdGlvbiAhPSBudWxsIDogIVJFTUFJTklOR19EVVJBVElPTl9FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nRHVyYXRpb24pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19DT1NUOgotCQkJCXJldHVybiBSRU1BSU5JTkdfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nQ29zdCAhPSBudWxsIDogIVJFTUFJTklOR19DT1NUX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfV09SSzoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ1dvcmsgIT0gbnVsbCA6ICFSRU1BSU5JTkdfV09SS19FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdPdmVydGltZUNvc3QgIT0gbnVsbCA6ICFSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nT3ZlcnRpbWVDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ092ZXJ0aW1lV29yayAhPSBudWxsIDogIVJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdPdmVydGltZVdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDV1A6Ci0JCQkJcmV0dXJuIGlzU2V0QUNXUCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NWOgotCQkJCXJldHVybiBpc1NldENWKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09OU1RSQUlOVF9UWVBFOgotCQkJCXJldHVybiBDT05TVFJBSU5UX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGNvbnN0cmFpbnRUeXBlICE9IG51bGwgOiAhQ09OU1RSQUlOVF9UWVBFX0VERUZBVUxULmVxdWFscyhjb25zdHJhaW50VHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBDQUxFTkRBUl9VSURfRURFRkFVTFQgPT0gbnVsbCA/IGNhbGVuZGFyVUlEICE9IG51bGwgOiAhQ0FMRU5EQVJfVUlEX0VERUZBVUxULmVxdWFscyhjYWxlbmRhclVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09OU1RSQUlOVF9EQVRFOgotCQkJCXJldHVybiBDT05TVFJBSU5UX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNvbnN0cmFpbnREYXRlICE9IG51bGwgOiAhQ09OU1RSQUlOVF9EQVRFX0VERUZBVUxULmVxdWFscyhjb25zdHJhaW50RGF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fREVBRExJTkU6Ci0JCQkJcmV0dXJuIERFQURMSU5FX0VERUZBVUxUID09IG51bGwgPyBkZWFkbGluZSAhPSBudWxsIDogIURFQURMSU5FX0VERUZBVUxULmVxdWFscyhkZWFkbGluZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxfQVNTSUdOTUVOVFM6Ci0JCQkJcmV0dXJuIGlzU2V0TGV2ZWxBc3NpZ25tZW50cygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0NBTl9TUExJVDoKLQkJCQlyZXR1cm4gaXNTZXRMZXZlbGluZ0NhblNwbGl0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVk6Ci0JCQkJcmV0dXJuIExFVkVMSU5HX0RFTEFZX0VERUZBVUxUID09IG51bGwgPyBsZXZlbGluZ0RlbGF5ICE9IG51bGwgOiAhTEVWRUxJTkdfREVMQVlfRURFRkFVTFQuZXF1YWxzKGxldmVsaW5nRGVsYXkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVDoKLQkJCQlyZXR1cm4gTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBsZXZlbGluZ0RlbGF5Rm9ybWF0ICE9IG51bGwgOiAhTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxULmVxdWFscyhsZXZlbGluZ0RlbGF5Rm9ybWF0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUkVfTEVWRUxFRF9TVEFSVDoKLQkJCQlyZXR1cm4gUFJFX0xFVkVMRURfU1RBUlRfRURFRkFVTFQgPT0gbnVsbCA/IHByZUxldmVsZWRTdGFydCAhPSBudWxsIDogIVBSRV9MRVZFTEVEX1NUQVJUX0VERUZBVUxULmVxdWFscyhwcmVMZXZlbGVkU3RhcnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX0ZJTklTSDoKLQkJCQlyZXR1cm4gUFJFX0xFVkVMRURfRklOSVNIX0VERUZBVUxUID09IG51bGwgPyBwcmVMZXZlbGVkRmluaXNoICE9IG51bGwgOiAhUFJFX0xFVkVMRURfRklOSVNIX0VERUZBVUxULmVxdWFscyhwcmVMZXZlbGVkRmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTks6Ci0JCQkJcmV0dXJuIEhZUEVSTElOS19FREVGQVVMVCA9PSBudWxsID8gaHlwZXJsaW5rICE9IG51bGwgOiAhSFlQRVJMSU5LX0VERUZBVUxULmVxdWFscyhoeXBlcmxpbmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOS19BRERSRVNTOgotCQkJCXJldHVybiBIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVCA9PSBudWxsID8gaHlwZXJsaW5rQWRkcmVzcyAhPSBudWxsIDogIUhZUEVSTElOS19BRERSRVNTX0VERUZBVUxULmVxdWFscyhoeXBlcmxpbmtBZGRyZXNzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTktfU1VCX0FERFJFU1M6Ci0JCQkJcmV0dXJuIEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVCA9PSBudWxsID8gaHlwZXJsaW5rU3ViQWRkcmVzcyAhPSBudWxsIDogIUhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVC5lcXVhbHMoaHlwZXJsaW5rU3ViQWRkcmVzcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSUdOT1JFX1JFU09VUkNFX0NBTEVOREFSOgotCQkJCXJldHVybiBpc1NldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19OT1RFUzoKLQkJCQlyZXR1cm4gTk9URVNfRURFRkFVTFQgPT0gbnVsbCA/IG5vdGVzICE9IG51bGwgOiAhTk9URVNfRURFRkFVTFQuZXF1YWxzKG5vdGVzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ISURFX0JBUjoKLQkJCQlyZXR1cm4gaXNTZXRIaWRlQmFyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUk9MTFVQOgotCQkJCXJldHVybiBpc1NldFJvbGx1cCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JDV1M6Ci0JCQkJcmV0dXJuIGlzU2V0QkNXUygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JDV1A6Ci0JCQkJcmV0dXJuIGlzU2V0QkNXUCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIFBIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEVfRURFRkFVTFQgPT0gbnVsbCA/IHBoeXNpY2FsUGVyY2VudENvbXBsZXRlICE9IG51bGwgOiAhUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVC5lcXVhbHMocGh5c2ljYWxQZXJjZW50Q29tcGxldGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIEVBUk5FRF9WQUxVRV9NRVRIT0RfRURFRkFVTFQgPT0gbnVsbCA/IGVhcm5lZFZhbHVlTWV0aG9kICE9IG51bGwgOiAhRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVC5lcXVhbHMoZWFybmVkVmFsdWVNZXRob2QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRURFQ0VTU09SX0xJTks6Ci0JCQkJcmV0dXJuIHByZWRlY2Vzc29yTGluayAhPSBudWxsICYmICFwcmVkZWNlc3NvckxpbmsuaXNFbXB0eSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxXb3JrUHJvdGVjdGVkICE9IG51bGwgOiAhQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxULmVxdWFscyhhY3R1YWxXb3JrUHJvdGVjdGVkKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQ6Ci0JCQkJcmV0dXJuIEFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkICE9IG51bGwgOiAhQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxULmVxdWFscyhhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGUgIT0gbnVsbCAmJiAhZXh0ZW5kZWRBdHRyaWJ1dGUuaXNFbXB0eSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JBU0VMSU5FOgotCQkJCXJldHVybiBiYXNlbGluZSAhPSBudWxsICYmICFiYXNlbGluZS5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9DT0RFOgotCQkJCXJldHVybiBvdXRsaW5lQ29kZSAhPSBudWxsICYmICFvdXRsaW5lQ29kZS5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVElNRVBIQVNFRF9EQVRBOgotCQkJCXJldHVybiB0aW1lcGhhc2VkRGF0YSAhPSBudWxsICYmICF0aW1lcGhhc2VkRGF0YS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1SUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0eXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0eXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc051bGw6ICIpOwotCQlpZiAoaXNOdWxsRVNldCkgcmVzdWx0LmFwcGVuZChpc051bGwpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjcmVhdGVEYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjcmVhdGVEYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb250YWN0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb250YWN0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3QlM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdCUyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd0JTTGV2ZWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdCU0xldmVsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvdXRsaW5lTnVtYmVyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvdXRsaW5lTnVtYmVyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvdXRsaW5lTGV2ZWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG91dGxpbmVMZXZlbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJpb3JpdHk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByaW9yaXR5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkdXJhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZHVyYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR1cmF0aW9uRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkdXJhdGlvbkZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQod29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RvcDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RvcCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzdW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXN1bWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc3VtZVZhbGlkOiAiKTsKLQkJaWYgKHJlc3VtZVZhbGlkRVNldCkgcmVzdWx0LmFwcGVuZChyZXN1bWVWYWxpZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVmZm9ydERyaXZlbjogIik7Ci0JCWlmIChlZmZvcnREcml2ZW5FU2V0KSByZXN1bHQuYXBwZW5kKGVmZm9ydERyaXZlbik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlY3VycmluZzogIik7Ci0JCWlmIChyZWN1cnJpbmdFU2V0KSByZXN1bHQuYXBwZW5kKHJlY3VycmluZyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJBbGxvY2F0ZWQ6ICIpOwotCQlpZiAob3ZlckFsbG9jYXRlZEVTZXQpIHJlc3VsdC5hcHBlbmQob3ZlckFsbG9jYXRlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVzdGltYXRlZDogIik7Ci0JCWlmIChlc3RpbWF0ZWRFU2V0KSByZXN1bHQuYXBwZW5kKGVzdGltYXRlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1pbGVzdG9uZTogIik7Ci0JCWlmIChtaWxlc3RvbmVFU2V0KSByZXN1bHQuYXBwZW5kKG1pbGVzdG9uZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN1bW1hcnk6ICIpOwotCQlpZiAoc3VtbWFyeUVTZXQpIHJlc3VsdC5hcHBlbmQoc3VtbWFyeSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNyaXRpY2FsOiAiKTsKLQkJaWYgKGNyaXRpY2FsRVNldCkgcmVzdWx0LmFwcGVuZChjcml0aWNhbCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzU3VicHJvamVjdDogIik7Ci0JCWlmIChpc1N1YnByb2plY3RFU2V0KSByZXN1bHQuYXBwZW5kKGlzU3VicHJvamVjdCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzU3VicHJvamVjdFJlYWRPbmx5OiAiKTsKLQkJaWYgKGlzU3VicHJvamVjdFJlYWRPbmx5RVNldCkgcmVzdWx0LmFwcGVuZChpc1N1YnByb2plY3RSZWFkT25seSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN1YnByb2plY3ROYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdWJwcm9qZWN0TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXh0ZXJuYWxUYXNrOiAiKTsKLQkJaWYgKGV4dGVybmFsVGFza0VTZXQpIHJlc3VsdC5hcHBlbmQoZXh0ZXJuYWxUYXNrKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXh0ZXJuYWxUYXNrUHJvamVjdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXh0ZXJuYWxUYXNrUHJvamVjdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWFybHlTdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZWFybHlTdGFydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWFybHlGaW5pc2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVhcmx5RmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsYXRlU3RhcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxhdGVTdGFydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGF0ZUZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGF0ZUZpbmlzaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhcnRWYXJpYW5jZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnRWYXJpYW5jZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmluaXNoVmFyaWFuY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpbmlzaFZhcmlhbmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrVmFyaWFuY2U6ICIpOwotCQlpZiAod29ya1ZhcmlhbmNlRVNldCkgcmVzdWx0LmFwcGVuZCh3b3JrVmFyaWFuY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmcmVlU2xhY2s6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZyZWVTbGFjayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdG90YWxTbGFjazogIik7Ci0JCXJlc3VsdC5hcHBlbmQodG90YWxTbGFjayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZml4ZWRDb3N0OiAiKTsKLQkJaWYgKGZpeGVkQ29zdEVTZXQpIHJlc3VsdC5hcHBlbmQoZml4ZWRDb3N0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZml4ZWRDb3N0QWNjcnVhbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZml4ZWRDb3N0QWNjcnVhbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGVyY2VudENvbXBsZXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwZXJjZW50Q29tcGxldGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBlcmNlbnRXb3JrQ29tcGxldGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBlcmNlbnRXb3JrQ29tcGxldGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG92ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsU3RhcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbFN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxGaW5pc2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbEZpbmlzaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsRHVyYXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbER1cmF0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZUNvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsT3ZlcnRpbWVXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxPdmVydGltZVdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlZ3VsYXJXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZWd1bGFyV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtYWluaW5nRHVyYXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ0R1cmF0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdPdmVydGltZUNvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ092ZXJ0aW1lQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtYWluaW5nT3ZlcnRpbWVXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdPdmVydGltZVdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFDV1A6ICIpOwotCQlpZiAoYUNXUEVTZXQpIHJlc3VsdC5hcHBlbmQoYUNXUCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNWOiAiKTsKLQkJaWYgKGNWRVNldCkgcmVzdWx0LmFwcGVuZChjVik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbnN0cmFpbnRUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb25zdHJhaW50VHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FsZW5kYXJVSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhbGVuZGFyVUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb25zdHJhaW50RGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29uc3RyYWludERhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlYWRsaW5lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWFkbGluZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGV2ZWxBc3NpZ25tZW50czogIik7Ci0JCWlmIChsZXZlbEFzc2lnbm1lbnRzRVNldCkgcmVzdWx0LmFwcGVuZChsZXZlbEFzc2lnbm1lbnRzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGV2ZWxpbmdDYW5TcGxpdDogIik7Ci0JCWlmIChsZXZlbGluZ0NhblNwbGl0RVNldCkgcmVzdWx0LmFwcGVuZChsZXZlbGluZ0NhblNwbGl0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGV2ZWxpbmdEZWxheTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGV2ZWxpbmdEZWxheSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGV2ZWxpbmdEZWxheUZvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGV2ZWxpbmdEZWxheUZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJlTGV2ZWxlZFN0YXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcmVMZXZlbGVkU3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByZUxldmVsZWRGaW5pc2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZUxldmVsZWRGaW5pc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGluazogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaHlwZXJsaW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoeXBlcmxpbmtBZGRyZXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoeXBlcmxpbmtBZGRyZXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoeXBlcmxpbmtTdWJBZGRyZXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoeXBlcmxpbmtTdWJBZGRyZXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZ25vcmVSZXNvdXJjZUNhbGVuZGFyOiAiKTsKLQkJaWYgKGlnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0KSByZXN1bHQuYXBwZW5kKGlnbm9yZVJlc291cmNlQ2FsZW5kYXIpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBub3RlczogIik7Ci0JCXJlc3VsdC5hcHBlbmQobm90ZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGhpZGVCYXI6ICIpOwotCQlpZiAoaGlkZUJhckVTZXQpIHJlc3VsdC5hcHBlbmQoaGlkZUJhcik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJvbGx1cDogIik7Ci0JCWlmIChyb2xsdXBFU2V0KSByZXN1bHQuYXBwZW5kKHJvbGx1cCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGJDV1M6ICIpOwotCQlpZiAoYkNXU0VTZXQpIHJlc3VsdC5hcHBlbmQoYkNXUyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGJDV1A6ICIpOwotCQlpZiAoYkNXUEVTZXQpIHJlc3VsdC5hcHBlbmQoYkNXUCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBoeXNpY2FsUGVyY2VudENvbXBsZXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWFybmVkVmFsdWVNZXRob2Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVhcm5lZFZhbHVlTWV0aG9kKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxXb3JrUHJvdGVjdGVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxXb3JrUHJvdGVjdGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Rhc2tJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UYXNrc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Rhc2tzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNTU0MmM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Rhc2tzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGFza3NJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3M7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tzSW1wbCNnZXRUYXNrIDxlbT5UYXNrPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza3NJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBUYXNrcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFzaygpIDxlbT5UYXNrPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB0YXNrID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUYXNrKCkgewotCQlpZiAodGFzayA9PSBudWxsKSB7Ci0JCQl0YXNrID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFRhc2suY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuVEFTS1NfX1RBU0spOwotCQl9Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLU19fVEFTSzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRUYXNrKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLU19fVEFTSzoKLQkJCQlyZXR1cm4gZ2V0VGFzaygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLU19fVEFTSzoKLQkJCQlnZXRUYXNrKCkuY2xlYXIoKTsKLQkJCQlnZXRUYXNrKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tTX19UQVNLOgotCQkJCWdldFRhc2soKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tTX19UQVNLOgotCQkJCXJldHVybiB0YXNrICE9IG51bGwgJiYgIXRhc2suaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9UYXNrc0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1RpbWVQZXJpb2RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UaW1lUGVyaW9kSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiY2VmNjIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1RpbWVQZXJpb2RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUaW1lUGVyaW9kSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRpbWUgUGVyaW9kPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZVBlcmlvZEltcGwjZ2V0RnJvbURhdGUgPGVtPkZyb20gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRpbWVQZXJpb2RJbXBsI2dldFRvRGF0ZSA8ZW0+VG8gRGF0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRpbWVQZXJpb2RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBUaW1lUGVyaW9kIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnJvbURhdGUoKSA8ZW0+RnJvbSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGcm9tRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgRlJPTV9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZyb21EYXRlKCkgPGVtPkZyb20gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnJvbURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZnJvbURhdGUgPSBGUk9NX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG9EYXRlKCkgPGVtPlRvIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRvRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9fREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb0RhdGUoKSA8ZW0+VG8gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHRvRGF0ZSA9IFRPX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGltZVBlcmlvZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRUaW1lUGVyaW9kKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGcm9tRGF0ZSgpIHsKLQkJcmV0dXJuIGZyb21EYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZyb21EYXRlKE9iamVjdCBuZXdGcm9tRGF0ZSkgewotCQlPYmplY3Qgb2xkRnJvbURhdGUgPSBmcm9tRGF0ZTsKLQkJZnJvbURhdGUgPSBuZXdGcm9tRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5USU1FX1BFUklPRF9fRlJPTV9EQVRFLCBvbGRGcm9tRGF0ZSwgZnJvbURhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFRvRGF0ZSgpIHsKLQkJcmV0dXJuIHRvRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb0RhdGUoT2JqZWN0IG5ld1RvRGF0ZSkgewotCQlPYmplY3Qgb2xkVG9EYXRlID0gdG9EYXRlOwotCQl0b0RhdGUgPSBuZXdUb0RhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX1RPX0RBVEUsIG9sZFRvRGF0ZSwgdG9EYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EX19GUk9NX0RBVEU6Ci0JCQkJcmV0dXJuIGdldEZyb21EYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX1RPX0RBVEU6Ci0JCQkJcmV0dXJuIGdldFRvRGF0ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FX1BFUklPRF9fRlJPTV9EQVRFOgotCQkJCXNldEZyb21EYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FX1BFUklPRF9fVE9fREFURToKLQkJCQlzZXRUb0RhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FX1BFUklPRF9fRlJPTV9EQVRFOgotCQkJCXNldEZyb21EYXRlKEZST01fREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EX19UT19EQVRFOgotCQkJCXNldFRvRGF0ZShUT19EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FX1BFUklPRF9fRlJPTV9EQVRFOgotCQkJCXJldHVybiBGUk9NX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGZyb21EYXRlICE9IG51bGwgOiAhRlJPTV9EQVRFX0VERUZBVUxULmVxdWFscyhmcm9tRGF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX1RPX0RBVEU6Ci0JCQkJcmV0dXJuIFRPX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IHRvRGF0ZSAhPSBudWxsIDogIVRPX0RBVEVfRURFRkFVTFQuZXF1YWxzKHRvRGF0ZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmcm9tRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZnJvbURhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRvRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodG9EYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVGltZVBlcmlvZEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1RpbWVwaGFzZWREYXRhVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1RpbWVwaGFzZWREYXRhVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTE1ODdiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UaW1lcGhhc2VkRGF0YVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUaW1lcGhhc2VkRGF0YVR5cGVJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZXBoYXNlZERhdGFUeXBlSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZXBoYXNlZERhdGFUeXBlSW1wbCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRpbWVwaGFzZWREYXRhVHlwZUltcGwjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZXBoYXNlZERhdGFUeXBlSW1wbCNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRpbWVwaGFzZWREYXRhVHlwZUltcGwjZ2V0VW5pdCA8ZW0+VW5pdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRpbWVwaGFzZWREYXRhVHlwZUltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGltZXBoYXNlZERhdGFUeXBlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVGltZXBoYXNlZERhdGFUeXBlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFVJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHVJRCA9IFVJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydCgpIDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFNUQVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBzdGFydCA9IFNUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaCgpIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgRklOSVNIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaCgpIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBmaW5pc2ggPSBGSU5JU0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5pdCgpIDxlbT5Vbml0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVU5JVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbml0KCkgPGVtPlVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHVuaXQgPSBVTklUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGltZXBoYXNlZERhdGFUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFRpbWVwaGFzZWREYXRhVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoQmlnSW50ZWdlciBuZXdUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChCaWdJbnRlZ2VyIG5ld1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19VSUQsIG9sZFVJRCwgdUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIHN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KE9iamVjdCBuZXdTdGFydCkgewotCQlPYmplY3Qgb2xkU3RhcnQgPSBzdGFydDsKLQkJc3RhcnQgPSBuZXdTdGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fU1RBUlQsIG9sZFN0YXJ0LCBzdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmluaXNoKCkgewotCQlyZXR1cm4gZmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmlzaChPYmplY3QgbmV3RmluaXNoKSB7Ci0JCU9iamVjdCBvbGRGaW5pc2ggPSBmaW5pc2g7Ci0JCWZpbmlzaCA9IG5ld0ZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fRklOSVNILCBvbGRGaW5pc2gsIGZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFVuaXQoKSB7Ci0JCXJldHVybiB1bml0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuaXQoQmlnSW50ZWdlciBuZXdVbml0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkVW5pdCA9IHVuaXQ7Ci0JCXVuaXQgPSBuZXdVbml0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19VTklULCBvbGRVbml0LCB1bml0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19TVEFSVDoKLQkJCQlyZXR1cm4gZ2V0U3RhcnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fRklOSVNIOgotCQkJCXJldHVybiBnZXRGaW5pc2goKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVU5JVDoKLQkJCQlyZXR1cm4gZ2V0VW5pdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19VSUQ6Ci0JCQkJc2V0VUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1NUQVJUOgotCQkJCXNldFN0YXJ0KChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fRklOSVNIOgotCQkJCXNldEZpbmlzaCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VOSVQ6Ci0JCQkJc2V0VW5pdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19TVEFSVDoKLQkJCQlzZXRTdGFydChTVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19GSU5JU0g6Ci0JCQkJc2V0RmluaXNoKEZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19VTklUOgotCQkJCXNldFVuaXQoVU5JVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fU1RBUlQ6Ci0JCQkJcmV0dXJuIFNUQVJUX0VERUZBVUxUID09IG51bGwgPyBzdGFydCAhPSBudWxsIDogIVNUQVJUX0VERUZBVUxULmVxdWFscyhzdGFydCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX0ZJTklTSDoKLQkJCQlyZXR1cm4gRklOSVNIX0VERUZBVUxUID09IG51bGwgPyBmaW5pc2ggIT0gbnVsbCA6ICFGSU5JU0hfRURFRkFVTFQuZXF1YWxzKGZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VOSVQ6Ci0JCQkJcmV0dXJuIFVOSVRfRURFRkFVTFQgPT0gbnVsbCA/IHVuaXQgIT0gbnVsbCA6ICFVTklUX0VERUZBVUxULmVxdWFscyh1bml0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0eXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0eXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB1SUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaW5pc2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpbmlzaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdW5pdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodW5pdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVGltZXBoYXNlZERhdGFUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVmFsdWUySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVmFsdWUySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZTRmMDJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFZhbHVlMkltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFsdWUyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWUySW1wbCNnZXRJRCA8ZW0+SUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZTJJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlMkltcGwjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVmFsdWUySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVmFsdWUyIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SUQoKSA8ZW0+SUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SUQoKSA8ZW0+SUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBpRCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBWYWx1ZTJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFsdWUyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0SUQoKSB7Ci0JCXJldHVybiBpRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJRChCaWdJbnRlZ2VyIG5ld0lEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkSUQgPSBpRDsKLQkJaUQgPSBuZXdJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX0lELCBvbGRJRCwgaUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX0lEOgotCQkJCXNldElEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fSUQ6Ci0JCQkJc2V0SUQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlEICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVmFsdWUySW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVmFsdWVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDEwM2QwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFZhbHVlSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVJbXBsI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVJbXBsI2dldFBhcmVudFZhbHVlSUQgPGVtPlBhcmVudCBWYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZUltcGwjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVmFsdWVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBWYWx1ZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBWQUxVRV9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB2YWx1ZUlEID0gVkFMVUVfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyZW50VmFsdWVJRCgpIDxlbT5QYXJlbnQgVmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmVudFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBQQVJFTlRfVkFMVUVfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyZW50VmFsdWVJRCgpIDxlbT5QYXJlbnQgVmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmVudFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHBhcmVudFZhbHVlSUQgPSBQQVJFTlRfVkFMVUVfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFZhbHVlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpIHsKLQkJcmV0dXJuIHZhbHVlSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIG5ld1ZhbHVlSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRWYWx1ZUlEID0gdmFsdWVJRDsKLQkJdmFsdWVJRCA9IG5ld1ZhbHVlSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1ZBTFVFX0lELCBvbGRWYWx1ZUlELCB2YWx1ZUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UGFyZW50VmFsdWVJRCgpIHsKLQkJcmV0dXJuIHBhcmVudFZhbHVlSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50VmFsdWVJRChCaWdJbnRlZ2VyIG5ld1BhcmVudFZhbHVlSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRQYXJlbnRWYWx1ZUlEID0gcGFyZW50VmFsdWVJRDsKLQkJcGFyZW50VmFsdWVJRCA9IG5ld1BhcmVudFZhbHVlSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1BBUkVOVF9WQUxVRV9JRCwgb2xkUGFyZW50VmFsdWVJRCwgcGFyZW50VmFsdWVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19QQVJFTlRfVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIGdldFBhcmVudFZhbHVlSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19QQVJFTlRfVkFMVUVfSUQ6Ci0JCQkJc2V0UGFyZW50VmFsdWVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoVkFMVUVfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fUEFSRU5UX1ZBTFVFX0lEOgotCQkJCXNldFBhcmVudFZhbHVlSUQoUEFSRU5UX1ZBTFVFX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIFZBTFVFX0lEX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZUlEICE9IG51bGwgOiAhVkFMVUVfSURfRURFRkFVTFQuZXF1YWxzKHZhbHVlSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19QQVJFTlRfVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIFBBUkVOVF9WQUxVRV9JRF9FREVGQVVMVCA9PSBudWxsID8gcGFyZW50VmFsdWVJRCAhPSBudWxsIDogIVBBUkVOVF9WQUxVRV9JRF9FREVGQVVMVC5lcXVhbHMocGFyZW50VmFsdWVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZhbHVlSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhcmVudFZhbHVlSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhcmVudFZhbHVlSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVmFsdWVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZUxpc3RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2YzFjZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVmFsdWVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVmFsdWVMaXN0SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFsdWUgTGlzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlTGlzdEltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVmFsdWVMaXN0SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVmFsdWVMaXN0IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHZhbHVlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBWYWx1ZUxpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFsdWVMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFZhbHVlKCkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdmFsdWUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVmFsdWUyLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX0xJU1RfX1ZBTFVFKTsKLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX0xJU1RfX1ZBTFVFOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFZhbHVlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9MSVNUX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVF9fVkFMVUU6Ci0JCQkJZ2V0VmFsdWUoKS5jbGVhcigpOwotCQkJCWdldFZhbHVlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX0xJU1RfX1ZBTFVFOgotCQkJCWdldFZhbHVlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9MSVNUX19WQUxVRToKLQkJCQlyZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAhdmFsdWUuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9WYWx1ZUxpc3RJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZXNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNjMGY4NDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVmFsdWVzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVmFsdWVzSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFsdWVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVzSW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZXNJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFZhbHVlc0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFZhbHVlcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAoKSA8ZW0+R3JvdXA8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBWYWx1ZXNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFsdWVzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAoKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKSB7Ci0JCQlncm91cCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX0dST1VQKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFsdWVzX1ZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX0dST1VQOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVTX19WQUxVRToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRWYWx1ZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVTX19HUk9VUDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX0dST1VQOgotCQkJCWdldEdyb3VwKCkuY2xlYXIoKTsKLQkJCQlnZXRHcm91cCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFU19fVkFMVUU6Ci0JCQkJZ2V0VmFsdWUoKS5jbGVhcigpOwotCQkJCWdldFZhbHVlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFU19fR1JPVVA6Ci0JCQkJZ2V0R3JvdXAoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX1ZBTFVFOgotCQkJCWdldFZhbHVlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX0dST1VQOgotCQkJCXJldHVybiBncm91cCAhPSBudWxsICYmICFncm91cC5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVTX19WQUxVRToKLQkJCQlyZXR1cm4gIWdldFZhbHVlKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXA6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVmFsdWVzSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV0JTTWFza0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1dCU01hc2tJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmZDYyMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV0JTTWFza0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdCU01hc2tJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2s7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XQlMgTWFzazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tJbXBsI2dldExldmVsIDxlbT5MZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XQlNNYXNrSW1wbCNnZXRMZW5ndGggPGVtPkxlbmd0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tJbXBsI2dldFNlcGFyYXRvciA8ZW0+U2VwYXJhdG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV0JTTWFza0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdCU01hc2sgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbCgpIDxlbT5MZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBMRVZFTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbCgpIDxlbT5MZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGxldmVsID0gTEVWRUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExlbmd0aCgpIDxlbT5MZW5ndGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExlbmd0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVOR1RIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExlbmd0aCgpIDxlbT5MZW5ndGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExlbmd0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsZW5ndGggPSBMRU5HVEhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VwYXJhdG9yKCkgPGVtPlNlcGFyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VwYXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVBBUkFUT1JfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VwYXJhdG9yKCkgPGVtPlNlcGFyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VwYXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcGFyYXRvciA9IFNFUEFSQVRPUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXQlNNYXNrSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdCU01hc2soKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRMZXZlbCgpIHsKLQkJcmV0dXJuIGxldmVsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExldmVsKEJpZ0ludGVnZXIgbmV3TGV2ZWwpIHsKLQkJQmlnSW50ZWdlciBvbGRMZXZlbCA9IGxldmVsOwotCQlsZXZlbCA9IG5ld0xldmVsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19MRVZFTCwgb2xkTGV2ZWwsIGxldmVsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIG5ld1R5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoU3RyaW5nIG5ld0xlbmd0aCkgewotCQlTdHJpbmcgb2xkTGVuZ3RoID0gbGVuZ3RoOwotCQlsZW5ndGggPSBuZXdMZW5ndGg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX0xFTkdUSCwgb2xkTGVuZ3RoLCBsZW5ndGgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcGFyYXRvcigpIHsKLQkJcmV0dXJuIHNlcGFyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXBhcmF0b3IoU3RyaW5nIG5ld1NlcGFyYXRvcikgewotCQlTdHJpbmcgb2xkU2VwYXJhdG9yID0gc2VwYXJhdG9yOwotCQlzZXBhcmF0b3IgPSBuZXdTZXBhcmF0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX1NFUEFSQVRPUiwgb2xkU2VwYXJhdG9yLCBzZXBhcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX0xFVkVMOgotCQkJCXJldHVybiBnZXRMZXZlbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX0xFTkdUSDoKLQkJCQlyZXR1cm4gZ2V0TGVuZ3RoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX1NFUEFSQVRPUjoKLQkJCQlyZXR1cm4gZ2V0U2VwYXJhdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19MRVZFTDoKLQkJCQlzZXRMZXZlbCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19UWVBFOgotCQkJCXNldFR5cGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fTEVOR1RIOgotCQkJCXNldExlbmd0aCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX1NFUEFSQVRPUjoKLQkJCQlzZXRTZXBhcmF0b3IoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fTEVWRUw6Ci0JCQkJc2V0TGV2ZWwoTEVWRUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fTEVOR1RIOgotCQkJCXNldExlbmd0aChMRU5HVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fU0VQQVJBVE9SOgotCQkJCXNldFNlcGFyYXRvcihTRVBBUkFUT1JfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19MRVZFTDoKLQkJCQlyZXR1cm4gTEVWRUxfRURFRkFVTFQgPT0gbnVsbCA/IGxldmVsICE9IG51bGwgOiAhTEVWRUxfRURFRkFVTFQuZXF1YWxzKGxldmVsKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19MRU5HVEg6Ci0JCQkJcmV0dXJuIExFTkdUSF9FREVGQVVMVCA9PSBudWxsID8gbGVuZ3RoICE9IG51bGwgOiAhTEVOR1RIX0VERUZBVUxULmVxdWFscyhsZW5ndGgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19TRVBBUkFUT1I6Ci0JCQkJcmV0dXJuIFNFUEFSQVRPUl9FREVGQVVMVCA9PSBudWxsID8gc2VwYXJhdG9yICE9IG51bGwgOiAhU0VQQVJBVE9SX0VERUZBVUxULmVxdWFscyhzZXBhcmF0b3IpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobGV2ZWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxldmVsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0eXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0eXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZW5ndGg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxlbmd0aCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2VwYXJhdG9yOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzZXBhcmF0b3IpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9XQlNNYXNrSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV0JTTWFza3NJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XQlNNYXNrc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTkxZjUxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XQlNNYXNrc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdCU01hc2tzSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldCUyBNYXNrczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tzSW1wbCNpc1ZlcmlmeVVuaXF1ZUNvZGVzIDxlbT5WZXJpZnkgVW5pcXVlIENvZGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV0JTTWFza3NJbXBsI2lzR2VuZXJhdGVDb2RlcyA8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XQlNNYXNrc0ltcGwjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XQlNNYXNrc0ltcGwjZ2V0V0JTTWFzayA8ZW0+V0JTIE1hc2s8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXQlNNYXNrc0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdCU01hc2tzIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNWZXJpZnlVbmlxdWVDb2RlcygpIDxlbT5WZXJpZnkgVW5pcXVlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1ZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkVSSUZZX1VOSVFVRV9DT0RFU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNWZXJpZnlVbmlxdWVDb2RlcygpIDxlbT5WZXJpZnkgVW5pcXVlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1ZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJpZnlVbmlxdWVDb2RlcyA9IFZFUklGWV9VTklRVUVfQ09ERVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFZlcmlmeSBVbmlxdWUgQ29kZXMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZlcmlmeVVuaXF1ZUNvZGVzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVDb2RlcygpIDxlbT5HZW5lcmF0ZSBDb2RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gR0VORVJBVEVfQ09ERVNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVDb2RlcygpIDxlbT5HZW5lcmF0ZSBDb2RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmF0ZUNvZGVzID0gR0VORVJBVEVfQ09ERVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEdlbmVyYXRlIENvZGVzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmF0ZUNvZGVzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWZpeCgpIDxlbT5QcmVmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWZpeCgpIDxlbT5QcmVmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVmaXggPSBQUkVGSVhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXQlNNYXNrKCkgPGVtPldCUyBNYXNrPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdCU01hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB3QlNNYXNrID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXQlNNYXNrc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRXQlNNYXNrcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmVyaWZ5VW5pcXVlQ29kZXMoKSB7Ci0JCXJldHVybiB2ZXJpZnlVbmlxdWVDb2RlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJpZnlVbmlxdWVDb2Rlcyhib29sZWFuIG5ld1ZlcmlmeVVuaXF1ZUNvZGVzKSB7Ci0JCWJvb2xlYW4gb2xkVmVyaWZ5VW5pcXVlQ29kZXMgPSB2ZXJpZnlVbmlxdWVDb2RlczsKLQkJdmVyaWZ5VW5pcXVlQ29kZXMgPSBuZXdWZXJpZnlVbmlxdWVDb2RlczsKLQkJYm9vbGVhbiBvbGRWZXJpZnlVbmlxdWVDb2Rlc0VTZXQgPSB2ZXJpZnlVbmlxdWVDb2Rlc0VTZXQ7Ci0JCXZlcmlmeVVuaXF1ZUNvZGVzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19WRVJJRllfVU5JUVVFX0NPREVTLCBvbGRWZXJpZnlVbmlxdWVDb2RlcywgdmVyaWZ5VW5pcXVlQ29kZXMsICFvbGRWZXJpZnlVbmlxdWVDb2Rlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFZlcmlmeVVuaXF1ZUNvZGVzKCkgewotCQlib29sZWFuIG9sZFZlcmlmeVVuaXF1ZUNvZGVzID0gdmVyaWZ5VW5pcXVlQ29kZXM7Ci0JCWJvb2xlYW4gb2xkVmVyaWZ5VW5pcXVlQ29kZXNFU2V0ID0gdmVyaWZ5VW5pcXVlQ29kZXNFU2V0OwotCQl2ZXJpZnlVbmlxdWVDb2RlcyA9IFZFUklGWV9VTklRVUVfQ09ERVNfRURFRkFVTFQ7Ci0JCXZlcmlmeVVuaXF1ZUNvZGVzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19WRVJJRllfVU5JUVVFX0NPREVTLCBvbGRWZXJpZnlVbmlxdWVDb2RlcywgVkVSSUZZX1VOSVFVRV9DT0RFU19FREVGQVVMVCwgb2xkVmVyaWZ5VW5pcXVlQ29kZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRWZXJpZnlVbmlxdWVDb2RlcygpIHsKLQkJcmV0dXJuIHZlcmlmeVVuaXF1ZUNvZGVzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlQ29kZXMoKSB7Ci0JCXJldHVybiBnZW5lcmF0ZUNvZGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlQ29kZXMoYm9vbGVhbiBuZXdHZW5lcmF0ZUNvZGVzKSB7Ci0JCWJvb2xlYW4gb2xkR2VuZXJhdGVDb2RlcyA9IGdlbmVyYXRlQ29kZXM7Ci0JCWdlbmVyYXRlQ29kZXMgPSBuZXdHZW5lcmF0ZUNvZGVzOwotCQlib29sZWFuIG9sZEdlbmVyYXRlQ29kZXNFU2V0ID0gZ2VuZXJhdGVDb2Rlc0VTZXQ7Ci0JCWdlbmVyYXRlQ29kZXNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX0dFTkVSQVRFX0NPREVTLCBvbGRHZW5lcmF0ZUNvZGVzLCBnZW5lcmF0ZUNvZGVzLCAhb2xkR2VuZXJhdGVDb2Rlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEdlbmVyYXRlQ29kZXMoKSB7Ci0JCWJvb2xlYW4gb2xkR2VuZXJhdGVDb2RlcyA9IGdlbmVyYXRlQ29kZXM7Ci0JCWJvb2xlYW4gb2xkR2VuZXJhdGVDb2Rlc0VTZXQgPSBnZW5lcmF0ZUNvZGVzRVNldDsKLQkJZ2VuZXJhdGVDb2RlcyA9IEdFTkVSQVRFX0NPREVTX0VERUZBVUxUOwotCQlnZW5lcmF0ZUNvZGVzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19HRU5FUkFURV9DT0RFUywgb2xkR2VuZXJhdGVDb2RlcywgR0VORVJBVEVfQ09ERVNfRURFRkFVTFQsIG9sZEdlbmVyYXRlQ29kZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRHZW5lcmF0ZUNvZGVzKCkgewotCQlyZXR1cm4gZ2VuZXJhdGVDb2Rlc0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiBwcmVmaXg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBuZXdQcmVmaXgpIHsKLQkJU3RyaW5nIG9sZFByZWZpeCA9IHByZWZpeDsKLQkJcHJlZml4ID0gbmV3UHJlZml4OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fUFJFRklYLCBvbGRQcmVmaXgsIHByZWZpeCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRXQlNNYXNrKCkgewotCQlpZiAod0JTTWFzayA9PSBudWxsKSB7Ci0JCQl3QlNNYXNrID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFdCU01hc2suY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19XQlNfTUFTSyk7Ci0JCX0KLQkJcmV0dXJuIHdCU01hc2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fV0JTX01BU0s6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0V0JTTWFzaygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19WRVJJRllfVU5JUVVFX0NPREVTOgotCQkJCXJldHVybiBpc1ZlcmlmeVVuaXF1ZUNvZGVzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fR0VORVJBVEVfQ09ERVM6Ci0JCQkJcmV0dXJuIGlzR2VuZXJhdGVDb2RlcygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1BSRUZJWDoKLQkJCQlyZXR1cm4gZ2V0UHJlZml4KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19XQlNfTUFTSzoKLQkJCQlyZXR1cm4gZ2V0V0JTTWFzaygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVM6Ci0JCQkJc2V0VmVyaWZ5VW5pcXVlQ29kZXMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fR0VORVJBVEVfQ09ERVM6Ci0JCQkJc2V0R2VuZXJhdGVDb2RlcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19QUkVGSVg6Ci0JCQkJc2V0UHJlZml4KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1dCU19NQVNLOgotCQkJCWdldFdCU01hc2soKS5jbGVhcigpOwotCQkJCWdldFdCU01hc2soKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19WRVJJRllfVU5JUVVFX0NPREVTOgotCQkJCXVuc2V0VmVyaWZ5VW5pcXVlQ29kZXMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19HRU5FUkFURV9DT0RFUzoKLQkJCQl1bnNldEdlbmVyYXRlQ29kZXMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19QUkVGSVg6Ci0JCQkJc2V0UHJlZml4KFBSRUZJWF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fV0JTX01BU0s6Ci0JCQkJZ2V0V0JTTWFzaygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19WRVJJRllfVU5JUVVFX0NPREVTOgotCQkJCXJldHVybiBpc1NldFZlcmlmeVVuaXF1ZUNvZGVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19HRU5FUkFURV9DT0RFUzoKLQkJCQlyZXR1cm4gaXNTZXRHZW5lcmF0ZUNvZGVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19QUkVGSVg6Ci0JCQkJcmV0dXJuIFBSRUZJWF9FREVGQVVMVCA9PSBudWxsID8gcHJlZml4ICE9IG51bGwgOiAhUFJFRklYX0VERUZBVUxULmVxdWFscyhwcmVmaXgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fV0JTX01BU0s6Ci0JCQkJcmV0dXJuIHdCU01hc2sgIT0gbnVsbCAmJiAhd0JTTWFzay5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2ZXJpZnlVbmlxdWVDb2RlczogIik7Ci0JCWlmICh2ZXJpZnlVbmlxdWVDb2Rlc0VTZXQpIHJlc3VsdC5hcHBlbmQodmVyaWZ5VW5pcXVlQ29kZXMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBnZW5lcmF0ZUNvZGVzOiAiKTsKLQkJaWYgKGdlbmVyYXRlQ29kZXNFU2V0KSByZXN1bHQuYXBwZW5kKGdlbmVyYXRlQ29kZXMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcmVmaXg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dCU01hc2tzSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV2Vla0RheUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1dlZWtEYXlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY5NzZkYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV2Vla0RheUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdlZWtEYXlJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XZWVrIERheTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlJbXBsI2dldERheVR5cGUgPGVtPkRheSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV2Vla0RheUltcGwjaXNEYXlXb3JraW5nIDxlbT5EYXkgV29ya2luZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlJbXBsI2dldFRpbWVQZXJpb2QgPGVtPlRpbWUgUGVyaW9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV2Vla0RheUltcGwjZ2V0V29ya2luZ1RpbWVzIDxlbT5Xb3JraW5nIFRpbWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2Vla0RheUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdlZWtEYXkgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXlUeXBlKCkgPGVtPkRheSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREYXlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREFZX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF5VHlwZSgpIDxlbT5EYXkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGF5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZGF5VHlwZSA9IERBWV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGF5V29ya2luZygpIDxlbT5EYXkgV29ya2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNEYXlXb3JraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gREFZX1dPUktJTkdfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGF5V29ya2luZygpIDxlbT5EYXkgV29ya2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNEYXlXb3JraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkYXlXb3JraW5nID0gREFZX1dPUktJTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIERheSBXb3JraW5nIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkYXlXb3JraW5nRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZVBlcmlvZCgpIDxlbT5UaW1lIFBlcmlvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGltZVBlcmlvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFRpbWVQZXJpb2QgdGltZVBlcmlvZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JraW5nVGltZXMoKSA8ZW0+V29ya2luZyBUaW1lczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya2luZ1RpbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya2luZ1RpbWVzIHdvcmtpbmdUaW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2Vla0RheUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWVrRGF5KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RGF5VHlwZSgpIHsKLQkJcmV0dXJuIGRheVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF5VHlwZShCaWdJbnRlZ2VyIG5ld0RheVR5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGREYXlUeXBlID0gZGF5VHlwZTsKLQkJZGF5VHlwZSA9IG5ld0RheVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9UWVBFLCBvbGREYXlUeXBlLCBkYXlUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEYXlXb3JraW5nKCkgewotCQlyZXR1cm4gZGF5V29ya2luZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXlXb3JraW5nKGJvb2xlYW4gbmV3RGF5V29ya2luZykgewotCQlib29sZWFuIG9sZERheVdvcmtpbmcgPSBkYXlXb3JraW5nOwotCQlkYXlXb3JraW5nID0gbmV3RGF5V29ya2luZzsKLQkJYm9vbGVhbiBvbGREYXlXb3JraW5nRVNldCA9IGRheVdvcmtpbmdFU2V0OwotCQlkYXlXb3JraW5nRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9XT1JLSU5HLCBvbGREYXlXb3JraW5nLCBkYXlXb3JraW5nLCAhb2xkRGF5V29ya2luZ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldERheVdvcmtpbmcoKSB7Ci0JCWJvb2xlYW4gb2xkRGF5V29ya2luZyA9IGRheVdvcmtpbmc7Ci0JCWJvb2xlYW4gb2xkRGF5V29ya2luZ0VTZXQgPSBkYXlXb3JraW5nRVNldDsKLQkJZGF5V29ya2luZyA9IERBWV9XT1JLSU5HX0VERUZBVUxUOwotCQlkYXlXb3JraW5nRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9XT1JLSU5HLCBvbGREYXlXb3JraW5nLCBEQVlfV09SS0lOR19FREVGQVVMVCwgb2xkRGF5V29ya2luZ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldERheVdvcmtpbmcoKSB7Ci0JCXJldHVybiBkYXlXb3JraW5nRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGltZVBlcmlvZCBnZXRUaW1lUGVyaW9kKCkgewotCQlyZXR1cm4gdGltZVBlcmlvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUaW1lUGVyaW9kKFRpbWVQZXJpb2QgbmV3VGltZVBlcmlvZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlUaW1lUGVyaW9kIG9sZFRpbWVQZXJpb2QgPSB0aW1lUGVyaW9kOwotCQl0aW1lUGVyaW9kID0gbmV3VGltZVBlcmlvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fVElNRV9QRVJJT0QsIG9sZFRpbWVQZXJpb2QsIG5ld1RpbWVQZXJpb2QpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWVQZXJpb2QoVGltZVBlcmlvZCBuZXdUaW1lUGVyaW9kKSB7Ci0JCWlmIChuZXdUaW1lUGVyaW9kICE9IHRpbWVQZXJpb2QpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHRpbWVQZXJpb2QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdGltZVBlcmlvZCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1RJTUVfUEVSSU9ELCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdUaW1lUGVyaW9kICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1RpbWVQZXJpb2QpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19USU1FX1BFUklPRCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRUaW1lUGVyaW9kKG5ld1RpbWVQZXJpb2QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fVElNRV9QRVJJT0QsIG5ld1RpbWVQZXJpb2QsIG5ld1RpbWVQZXJpb2QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya2luZ1RpbWVzIGdldFdvcmtpbmdUaW1lcygpIHsKLQkJcmV0dXJuIHdvcmtpbmdUaW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXb3JraW5nVGltZXMoV29ya2luZ1RpbWVzIG5ld1dvcmtpbmdUaW1lcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlXb3JraW5nVGltZXMgb2xkV29ya2luZ1RpbWVzID0gd29ya2luZ1RpbWVzOwotCQl3b3JraW5nVGltZXMgPSBuZXdXb3JraW5nVGltZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1dPUktJTkdfVElNRVMsIG9sZFdvcmtpbmdUaW1lcywgbmV3V29ya2luZ1RpbWVzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JraW5nVGltZXMoV29ya2luZ1RpbWVzIG5ld1dvcmtpbmdUaW1lcykgewotCQlpZiAobmV3V29ya2luZ1RpbWVzICE9IHdvcmtpbmdUaW1lcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAod29ya2luZ1RpbWVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXdvcmtpbmdUaW1lcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1dPUktJTkdfVElNRVMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1dvcmtpbmdUaW1lcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXb3JraW5nVGltZXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19XT1JLSU5HX1RJTUVTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdvcmtpbmdUaW1lcyhuZXdXb3JraW5nVGltZXMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fV09SS0lOR19USU1FUywgbmV3V29ya2luZ1RpbWVzLCBuZXdXb3JraW5nVGltZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1RJTUVfUEVSSU9EOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRUaW1lUGVyaW9kKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fV09SS0lOR19USU1FUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0V29ya2luZ1RpbWVzKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19EQVlfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RGF5VHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19EQVlfV09SS0lORzoKLQkJCQlyZXR1cm4gaXNEYXlXb3JraW5nKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19USU1FX1BFUklPRDoKLQkJCQlyZXR1cm4gZ2V0VGltZVBlcmlvZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19XT1JLSU5HX1RJTUVTOgotCQkJCXJldHVybiBnZXRXb3JraW5nVGltZXMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9UWVBFOgotCQkJCXNldERheVR5cGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fREFZX1dPUktJTkc6Ci0JCQkJc2V0RGF5V29ya2luZygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1RJTUVfUEVSSU9EOgotCQkJCXNldFRpbWVQZXJpb2QoKFRpbWVQZXJpb2QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fV09SS0lOR19USU1FUzoKLQkJCQlzZXRXb3JraW5nVGltZXMoKFdvcmtpbmdUaW1lcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fREFZX1RZUEU6Ci0JCQkJc2V0RGF5VHlwZShEQVlfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19EQVlfV09SS0lORzoKLQkJCQl1bnNldERheVdvcmtpbmcoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1RJTUVfUEVSSU9EOgotCQkJCXNldFRpbWVQZXJpb2QoKFRpbWVQZXJpb2QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19XT1JLSU5HX1RJTUVTOgotCQkJCXNldFdvcmtpbmdUaW1lcygoV29ya2luZ1RpbWVzKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19EQVlfVFlQRToKLQkJCQlyZXR1cm4gREFZX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGRheVR5cGUgIT0gbnVsbCA6ICFEQVlfVFlQRV9FREVGQVVMVC5lcXVhbHMoZGF5VHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9XT1JLSU5HOgotCQkJCXJldHVybiBpc1NldERheVdvcmtpbmcoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fVElNRV9QRVJJT0Q6Ci0JCQkJcmV0dXJuIHRpbWVQZXJpb2QgIT0gbnVsbDsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fV09SS0lOR19USU1FUzoKLQkJCQlyZXR1cm4gd29ya2luZ1RpbWVzICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkYXlUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkYXlUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkYXlXb3JraW5nOiAiKTsKLQkJaWYgKGRheVdvcmtpbmdFU2V0KSByZXN1bHQuYXBwZW5kKGRheVdvcmtpbmcpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV2Vla0RheUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1dlZWtEYXlzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV2Vla0RheXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmNGU3ZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV2Vla0RheXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXZWVrRGF5c0ltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5czsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldlZWsgRGF5czwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlzSW1wbCNnZXRXZWVrRGF5IDxlbT5XZWVrIERheTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlZWtEYXlzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV2Vla0RheXMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlZWtEYXkoKSA8ZW0+V2VlayBEYXk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2Vla0RheSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHdlZWtEYXkgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdlZWtEYXlzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlZWtEYXlzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFdlZWtEYXkoKSB7Ci0JCWlmICh3ZWVrRGF5ID09IG51bGwpIHsKLQkJCXdlZWtEYXkgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoV2Vla0RheS5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWVNfX1dFRUtfREFZKTsKLQkJfQotCQlyZXR1cm4gd2Vla0RheTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlTX19XRUVLX0RBWToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRXZWVrRGF5KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWVNfX1dFRUtfREFZOgotCQkJCXJldHVybiBnZXRXZWVrRGF5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZU19fV0VFS19EQVk6Ci0JCQkJZ2V0V2Vla0RheSgpLmNsZWFyKCk7Ci0JCQkJZ2V0V2Vla0RheSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWVNfX1dFRUtfREFZOgotCQkJCWdldFdlZWtEYXkoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZU19fV0VFS19EQVk6Ci0JCQkJcmV0dXJuIHdlZWtEYXkgIT0gbnVsbCAmJiAhd2Vla0RheS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL1dlZWtEYXlzSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV29ya2luZ1RpbWVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Xb3JraW5nVGltZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGYyN2RkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Xb3JraW5nVGltZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtpbmdUaW1lSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JraW5nIFRpbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Xb3JraW5nVGltZUltcGwjZ2V0RnJvbVRpbWUgPGVtPkZyb20gVGltZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldvcmtpbmdUaW1lSW1wbCNnZXRUb1RpbWUgPGVtPlRvIFRpbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JraW5nVGltZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdvcmtpbmdUaW1lIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnJvbVRpbWUoKSA8ZW0+RnJvbSBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGcm9tVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgRlJPTV9USU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZyb21UaW1lKCkgPGVtPkZyb20gVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnJvbVRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZnJvbVRpbWUgPSBGUk9NX1RJTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG9UaW1lKCkgPGVtPlRvIFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRvVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9fVElNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb1RpbWUoKSA8ZW0+VG8gVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9UaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHRvVGltZSA9IFRPX1RJTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya2luZ1RpbWVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya2luZ1RpbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZyb21UaW1lKCkgewotCQlyZXR1cm4gZnJvbVRpbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RnJvbVRpbWUoT2JqZWN0IG5ld0Zyb21UaW1lKSB7Ci0JCU9iamVjdCBvbGRGcm9tVGltZSA9IGZyb21UaW1lOwotCQlmcm9tVGltZSA9IG5ld0Zyb21UaW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRV9fRlJPTV9USU1FLCBvbGRGcm9tVGltZSwgZnJvbVRpbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFRvVGltZSgpIHsKLQkJcmV0dXJuIHRvVGltZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb1RpbWUoT2JqZWN0IG5ld1RvVGltZSkgewotCQlPYmplY3Qgb2xkVG9UaW1lID0gdG9UaW1lOwotCQl0b1RpbWUgPSBuZXdUb1RpbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FX19UT19USU1FLCBvbGRUb1RpbWUsIHRvVGltZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVfX0ZST01fVElNRToKLQkJCQlyZXR1cm4gZ2V0RnJvbVRpbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVfX1RPX1RJTUU6Ci0JCQkJcmV0dXJuIGdldFRvVGltZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVfX0ZST01fVElNRToKLQkJCQlzZXRGcm9tVGltZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FX19UT19USU1FOgotCQkJCXNldFRvVGltZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRV9fRlJPTV9USU1FOgotCQkJCXNldEZyb21UaW1lKEZST01fVElNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRV9fVE9fVElNRToKLQkJCQlzZXRUb1RpbWUoVE9fVElNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FX19GUk9NX1RJTUU6Ci0JCQkJcmV0dXJuIEZST01fVElNRV9FREVGQVVMVCA9PSBudWxsID8gZnJvbVRpbWUgIT0gbnVsbCA6ICFGUk9NX1RJTUVfRURFRkFVTFQuZXF1YWxzKGZyb21UaW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVfX1RPX1RJTUU6Ci0JCQkJcmV0dXJuIFRPX1RJTUVfRURFRkFVTFQgPT0gbnVsbCA/IHRvVGltZSAhPSBudWxsIDogIVRPX1RJTUVfRURFRkFVTFQuZXF1YWxzKHRvVGltZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmcm9tVGltZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZnJvbVRpbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRvVGltZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodG9UaW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV29ya2luZ1RpbWVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Xb3JraW5nVGltZXNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Xb3JraW5nVGltZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhNDI3MzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV29ya2luZ1RpbWVzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya2luZ1RpbWVzSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JraW5nIFRpbWVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV29ya2luZ1RpbWVzSW1wbCNnZXRXb3JraW5nVGltZSA8ZW0+V29ya2luZyBUaW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya2luZ1RpbWVzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV29ya2luZ1RpbWVzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JraW5nVGltZSgpIDxlbT5Xb3JraW5nIFRpbWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya2luZ1RpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB3b3JraW5nVGltZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya2luZ1RpbWVzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtpbmdUaW1lcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRXb3JraW5nVGltZSgpIHsKLQkJaWYgKHdvcmtpbmdUaW1lID09IG51bGwpIHsKLQkJCXdvcmtpbmdUaW1lID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFdvcmtpbmdUaW1lLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRVNfX1dPUktJTkdfVElNRSk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtpbmdUaW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVTX19XT1JLSU5HX1RJTUU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0V29ya2luZ1RpbWUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRVNfX1dPUktJTkdfVElNRToKLQkJCQlyZXR1cm4gZ2V0V29ya2luZ1RpbWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FU19fV09SS0lOR19USU1FOgotCQkJCWdldFdvcmtpbmdUaW1lKCkuY2xlYXIoKTsKLQkJCQlnZXRXb3JraW5nVGltZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVTX19XT1JLSU5HX1RJTUU6Ci0JCQkJZ2V0V29ya2luZ1RpbWUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRVNfX1dPUktJTkdfVElNRToKLQkJCQlyZXR1cm4gd29ya2luZ1RpbWUgIT0gbnVsbCAmJiAhd29ya2luZ1RpbWUuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9Xb3JraW5nVGltZXNJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9tc3Byb2plY3QuZWNvcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9tc3Byb2plY3QuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMxZWJkMjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvbXNwcm9qZWN0LmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsNTUxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJtc3Byb2plY3QiCi0gICAgbnNVUkk9Imh0dHA6Ly9lcGYuZWNsaXBzZS5vcmcvbXNwcm9qZWN0IiBuc1ByZWZpeD0ibXNwcm9qZWN0Ij4KLSAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmdWxsIHByb2plY3Qgc2NoZW1hIGRlZmluaXRpb24gZnJvbSB0aGUgcHJvamVjdCBsZXZlbCBkb3duLCAmI3hEOyYjeEE7JiN4OTsmI3g5O3N0YXJ0aW5nIHdpdGggZGF0YSB0eXBlIGRlZmluaXRpb25zLiIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVBbm5vdGF0aW9ucz4KLSAgICA8ZGV0YWlscyBrZXk9ImFwcGluZm8iIHZhbHVlPSJUaGUgTWljcm9zb2Z0IFByb2plY3QgRGF0YSBJbnRlcmNoYW5nZSBTY2hlbWEgZm9yIE1pY3Jvc29mdCBQcm9qZWN0IDEwLiYjeEQ7JiN4QTsmI3g5OyYjeDk7Ii8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkFjY3J1ZUF0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWNjcnVlQXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0aXZlRGlyZWN0b3J5R1VJRF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjE2Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkFsaWFzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWxpYXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBc3NpZ25tZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lnbm1lbnRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXNrVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFza1VJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc291cmNlVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVyY2VudFdvcmtDb21wbGV0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiB3b3JrIGNvbXBsZXRlZCBvbiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJjZW50V29ya0NvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBjb3N0IGluY3VycmVkIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbENvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxGaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGZpbmlzaCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbEZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBvdmVydGltZSBjb3N0IGluY3VycmVkIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgYW1vdW50IG9mIG92ZXJ0aW1lIHdvcmsgaW5jdXJyZWQgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHN0YXJ0IGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBhbW91bnQgb2Ygd29yayBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYUNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgYXNzaWdubWVudCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25maXJtZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIFJlc291cmNlIGhhcyBhY2NlcHRlZCBhbGwgb2YgaGlzIG9yIGhlciBhc3NpZ25tZW50cy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25maXJtZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdGVkIG9yIHNjaGVkdWxlZCBjb3N0IG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0UmF0ZVRhYmxlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ29zdFJhdGVUYWJsZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29zdCByYXRlIHRhYmxlIHVzZWQgZm9yIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RSYXRlVGFibGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0VmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjb3N0IGFuZCBiYXNlbGluZSBjb3N0IGZvciBhIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNWIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFybmVkIHZhbHVlIGNvc3QgdmFyaWFuY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ1YiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWxheSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCB0aGF0IHRoZSBhc3NpZ25tZW50IGlzIGRlbGF5ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVsYXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGhlIGFzc2lnbm1lbnQgZmluaXNoIGRhdGUgZnJvbSB0aGUgYmFzZWxpbmUgZmluaXNoIGRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoVmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpdGxlIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua0FkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtBZGRyZXNzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtTdWJBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRvY3VtZW50IGJvb2ttYXJrIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrVmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgYXNzaWdubWVudCB3b3JrIGZyb20gdGhlIGJhc2VsaW5lIHdvcmsgYXMgbWludXRlcyB4IDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1ZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFzRml4ZWRSYXRlVW5pdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIFVuaXRzIGFyZSBGaXhlZCBSYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikhhc0ZpeGVkUmF0ZVVuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZml4ZWRNYXRlcmlhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgY29uc3VtcHRpb24gb2YgdGhlIGFzc2lnbmVkIG1hdGVyaWFsIHJlc291cmNlIG9jY3VycyBpbiBhIHNpbmdsZSwgZml4ZWQgYW1vdW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpeGVkTWF0ZXJpYWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbGluZ0RlbGF5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVsYXkgY2F1c2VkIGJ5IGxldmVsaW5nLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbGluZ0RlbGF5Rm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgZGVsYXkuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAyMT1udWxsLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0RlbGF5Rm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGlua2VkRmllbGRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBQcm9qZWN0IGlzIGxpbmtlZCB0byBhbm90aGVyIE9MRSBvYmplY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGlua2VkRmllbGRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWlsZXN0b25lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBhc3NpZ25tZW50IGlzIGEgbWlsZXN0b25lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1pbGVzdG9uZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vdGVzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5vdGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcmFsbG9jYXRlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgYXNzaWdubWVudCBpcyBvdmVyYWxsb2NhdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJhbGxvY2F0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZUNvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdW0gb2YgdGhlIGFjdHVhbCBhbmQgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3Qgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVndWxhcldvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIG5vbi1vdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVndWxhcldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHByb2plY3RlZCBjb3N0IG9mIGNvbXBsZXRpbmcgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lQ29zdCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgb3ZlcnRpbWUgY29zdCBvZiBjb21wbGV0aW5nIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ092ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lV29yayIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgdG8gY29tcGxldGUgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgd29yayBzY2hlZHVsZWQgdG8gY29tcGxldGUgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3BvbnNlUGVuZGluZyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVHJ1ZSBpZiBhIHJlc3BvbnNlIGhhcyBub3QgYmVlbiByZWNlaXZlZCBmb3IgYSBUZWFtQXNzaWduIG1lc3NhZ2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3BvbnNlUGVuZGluZyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RvcCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgd2FzIHN0b3BwZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RvcCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3VtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgcmVzdW1lZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXN1bWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGhlIGFzc2lnbm1lbnQgc3RhcnQgZGF0ZSBmcm9tIHRoZSBiYXNlbGluZSBzdGFydCBkYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0VmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1bml0cyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBudW1iZXIgb2YgdW5pdHMgZm9yIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXBkYXRlTmVlZGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUcnVlIGlmIHRoZSByZXNvdXJjZSBhc3NpZ25lZCB0byBhIHRhc2sgbmVlZHMgdG8gYmUgdXBkYXRlZCBhcyB0byB0aGUgc3RhdHVzIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVwZGF0ZU5lZWRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZBQyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYmFzbGluZSBjb3N0IGFuZCB0b3RhbCBjb3N0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZBQyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHNjaGVkdWxlZCB3b3JrIGZvciB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya0NvbnRvdXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrQ29udG91clR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd29yayBjb250b3VyIG9mIHRoZSBhc3NpZ25tZW50LiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9RmxhdCwgMT1CYWNrIExvYWRlZCwgMj1Gcm9udCBMb2FkZWQsIDM9RG91YmxlIFBlYWssIDQ9RWFybHkgUGVhaywgNT1MYXRlIFBlYWssICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgNj1CZWxsLCA3PVR1cnRsZSwgOD1Db250b3VyZWQmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrQ29udG91ciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIGFzc2lnbm1lbnQgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYm9va2luZ1R5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Cb29raW5nVHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGJvb2tpbmcgdHlwZSBvZiB0aGUgYXNzaWdubWVudC4gMT1Db21taXRlZCwgMj1Qcm9wb3NlZCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJvb2tpbmdUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsV29ya1Byb3RlY3RlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JlYXRpb25EYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgYXNzaWdubWVudCB3YXMgY3JlYXRlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3JlYXRpb25EYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZW5kZWRBdHRyaWJ1dGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRXh0ZW5kZWRBdHRyaWJ1dGU0IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIG9mIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgYmFjayB0byB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZCBJRCwgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VsaW5lIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Jhc2VsaW5lMyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIGJhc2VsaW5lIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lcGhhc2VkRGF0YSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSBwaGFzZWQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGEiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBc3NpZ25tZW50cyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBc3NpZ25tZW50c18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2lnbm1lbnQiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQXNzaWdubWVudCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGFzc2lnbm1lbnQgaW4gZWFjaCBBc3NpZ25tZW50cyBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lnbm1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJBdXRob3JUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdXRob3JfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXZhaWxhYmlsaXR5UGVyaW9kIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJpbGl0eVBlcmlvZF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF2YWlsYWJsZUZyb20iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSBiZWNvbWVzIGF2YWlsYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBwZXJpb2QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJsZUZyb20iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdmFpbGFibGVUbyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXN0IGRhdGUgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmxlVG8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdmFpbGFibGVVbml0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJjZW50YWdlIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZSBkdXJpbmcgdGhlIHNwZWNpZmllZCBwZXJpb2QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJsZVVuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXZhaWxhYmlsaXR5UGVyaW9kcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFiaWxpdHlQZXJpb2RzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXZhaWxhYmlsaXR5UGVyaW9kIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0F2YWlsYWJpbGl0eVBlcmlvZCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJpb2QgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmlsaXR5UGVyaW9kIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmFzZWxpbmUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lcGhhc2VkRGF0YSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSBwaGFzZWQgZGF0YSBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2sgYmFzZWxpbmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVwaGFzZWREYXRhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibnVtYmVyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIG51bWJlciBvZiB0aGUgYmFzZWxpbmUgZGF0YSByZWNvcmQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik51bWJlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImludGVyaW0iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoaXMgaXMgYW4gSW50ZXJpbSBCYXNlbGluZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW50ZXJpbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGR1cmF0aW9uIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBEdXJhdGlvbiBvZiB0aGUgVGFzayBiYXNlbGluZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGVkRHVyYXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIGJhc2VsaW5lIGR1cmF0aW9uIG9mIHRoZSB0YXNrIHdhcyBlc3RpbWF0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRlZER1cmF0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgd29yayBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdGVkIGNvc3Qgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgdGFzayB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmFzZWxpbmUyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im51bWJlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBudW1iZXIgb2YgdGhlIGJhc2VsaW5lIGRhdGEgcmVjb3JkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOdW1iZXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdvcmsgYXNzaWduZWQgdGhlIHJlc291cmNlIHdoZW4gdGhlIGJhc2VsaW5lIGlzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcm9qZWN0ZWQgY29zdCBmb3IgdGhlIHJlc291cmNlIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0IGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiBvZiB0aGUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlIGZvciB0aGUgcHJvamVjdCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmFzZWxpbmUzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVwaGFzZWREYXRhIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHBoYXNlZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgQmFzZWxpbmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGEiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJudW1iZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBudW1iZXIgb2YgdGhlIGJhc2VsaW5lIGRhdGEgcmVjb3JkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik51bWJlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0b3RhbCBhbW91bnQgb2Ygd29yayBzY2hlZHVsZWQgb24gdGhlIGFzc2lnbm1lbnQgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0b3RhbCBwcm9qZWN0ZWQgY29zdCBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIGFzc2lnbm1lbnQgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZUZvckVhcm5lZFZhbHVlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3IDggOSAxMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJCb29raW5nVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCb29raW5nVHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJCb29raW5nVHlwZVR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQm9va2luZ1R5cGVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNhbGN1bGF0aW9uVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxjdWxhdGlvblR5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDYWxlbmRhciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhcl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjYWxlbmRhci4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL05hbWVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIGNhbGVuZGFyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNCYXNlQ2FsZW5kYXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIGNhbGVuZGFyIGlzIGEgYmFzZSBjYWxlbmRhci4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNCYXNlQ2FsZW5kYXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiYXNlQ2FsZW5kYXJVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYmFzZSBjYWxlbmRhciAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB3aGljaCB0aGlzIGNhbGVuZGFyIGRlcGVuZHMuIE9ubHkgYXBwbGljYWJsZSBpZiB0aGUgY2FsZW5kYXIgaXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGEgYmFzZSBjYWxlbmRhci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZUNhbGVuZGFyVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2Vla0RheXMiIGVUeXBlPSIjLy9XZWVrRGF5cyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIFdlZWtkYXlzIHRoYXQgZGVmaW5lcyB0aGlzIGNhbGVuZGFyLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrRGF5cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhbGVuZGFycyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhcnNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYWxlbmRhciIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DYWxlbmRhciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNhbGVuZGFycyBhcmUgdXNlZCB0byBkZWZpbmUgc3RhbmRhcmQgd29ya2luZyBhbmQgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgbm9uLXdvcmtpbmcgdGltZXMuIFByb2plY3RzIG11c3QgaGF2ZSBvbmUgYmFzZSBjYWxlbmRhci4gVGFza3MgYW5kIHJlc291cmNlcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBtYXkgaGF2ZSB0aGVpciBvd24gbm9uLWJhc2UgY2FsZW5kYXJzIHdoaWNoIGFyZSBiYXNlZCBvbiBhIGJhc2UgY2FsZW5kYXIuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ2F0ZWdvcnlUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYXRlZ29yeV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb2RlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29kZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb21wYW55VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29tcGFueV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb25zdHJhaW50VHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25zdHJhaW50VHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCA1IDYgNyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb250YWN0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGFjdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb3N0UmF0ZVRhYmxlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RSYXRlVGFibGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXJyZW5jeVN5bWJvbFBvc2l0aW9uXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDdXJyZW5jeVN5bWJvbFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbmN5U3ltYm9sXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iMjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGF5VHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEYXlUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRGaXhlZENvc3RBY2NydWFsXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0VGFza0VWTWV0aG9kXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRlZmF1bHRUYXNrVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0VGFza1R5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEb2N1bWVudFJvb3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJtaXhlZCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaXhlZCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRXaWxkY2FyZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSI6bWl4ZWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ieE1MTlNQcmVmaXhNYXAiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ieG1sbnM6cHJlZml4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InhTSVNjaGVtYUxvY2F0aW9uIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InhzaTpzY2hlbWFMb2NhdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9qZWN0IiB1cHBlckJvdW5kPSItMiIKLSAgICAgICAgZVR5cGU9IiMvL1Byb2plY3QiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdCBpcyB0aGUgdG9wIGxldmVsIGVsZW1lbnQgb2YgdGhlIGRvY3VtZW50LiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGUzIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl8zXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGU0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl80Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGU1IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl81Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJFYXJuZWRWYWx1ZU1ldGhvZFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJuZWRWYWx1ZU1ldGhvZF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWFybmVkVmFsdWVNZXRob2RfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkVtYWlsQWRkcmVzc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVtYWlsQWRkcmVzc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlbmRlZEF0dHJpYnV0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgUElEIG9mIHRoZSBjdXN0b20gZmllbGQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZE5hbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIGN1c3RvbSBmaWVsZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGROYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWxpYXMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9BbGlhc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWxpYXMgb2YgdGhlIGN1c3RvbSBmaWVsZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBob25ldGljQWxpYXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9QaG9uZXRpY0FsaWFzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwaG9uZXRpYyBwcm9udW5jaWF0aW9uIG9mIHRoZSBhbGlhcyBvZiB0aGUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tIGZpZWxkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBob25ldGljQWxpYXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb2xsdXBUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vUm9sbHVwVHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJIb3cgcm9sbHVwcyBhcmUgY2FsY3VsYXRlZC4gVmFsdWVzIGFyZTogMD1NYXhpbXVtICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUiBmb3IgZmxhZyBmaWVsZHMpLCAxPU1pbmltdW0gKEFORCBmb3IgZmxhZyBmaWVsZHMpLCAyPUNvdW50IGFsbCwgMz1TdW0sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ9QXZlcmFnZSwgNT1BdmVyYWdlIEZpcnN0IFN1YmxldmVsLCA2PUNvdW50IEZpcnN0IFN1YmxldmVsLCA3PUNvdW50ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbnN1bW1hcmllcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xsdXBUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FsY3VsYXRpb25UeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ2FsY3VsYXRpb25UeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgcm9sbHVwcyBhcmUgY2FsY3VsYXRlZCBmb3IgdGFzayBhbmQgZ3JvdXAgc3VtbWFyeSByb3dzLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPU5vbmUsIDE9Um9sbHVwLCAyPUNhbGN1bGF0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGN1bGF0aW9uVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZvcm11bGEiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm11bGEgdGhhdCBNaWNyb3NvZnQgUHJvamVjdCB1c2VzIHRvIHBvcHVsYXRlIHRoZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b20gdGFzayBmaWVsZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRm9ybXVsYSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3RyaWN0VmFsdWVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBSZXN0cmljdFZhbHVlcz1UcnVlIHRoZW4gb25seSB2YWx1ZXMgaW4gdGhlIGxpc3QgYXJlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQgaW4gdGhlIGZpbGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzdHJpY3RWYWx1ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZWxpc3RTb3J0T3JkZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9WYWx1ZWxpc3RTb3J0T3JkZXJUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSG93IHZhbHVlIGxpc3RzIGFyZSBzb3J0ZWQuIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA9RGVzY2VuZGluZywgMT1Bc2NlbmRpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVsaXN0U29ydE9yZGVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXBwZW5kTmV3VmFsdWVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBBcHBlbmROZXdWYWx1ZXM9VHJ1ZSB0aGVuIGFueSBuZXcgdmFsdWVzIGFkZGVkIGluIGEgcHJvamVjdCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXV0b21hdGljYWxseSBhcHBlbmRlZCB0byB0aGUgbGlzdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXBwZW5kTmV3VmFsdWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIHBvaW50cyB0byB0aGUgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgbGlzdC4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IHByZXNlbnQgaWYgbm8gZGVmYXVsdCBpcyBzZXQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWx1ZUxpc3QiIGVUeXBlPSIjLy9WYWx1ZUxpc3QiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGVuIHZhbHVlcyBvZiBleHRlbmRlZCBhdHRyaWJ1dGVzIGFyZSBzcGVjaWZpZWQgYXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyBvZiBlbGVtZW50cyBpbiB0aGUgc2NoZW1hLCB0aGV5IG1heSBlaXRoZXIgYmUgc3BlY2lmaWVkIGJ5IHZhbHVlcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBieSByZWZlcmVuY2VzIHRvIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbGlzdC4gIEFwcGxpY2F0aW9ucyBtYXkgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzdW1lIG9yZGVyaW5nIG9mIHRoZSBsaXN0IGJ5IG9yZGVyaW5nIHNwZWNpZmllZCBoZXJlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUxpc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlbmRlZEF0dHJpYnV0ZTIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIFBJRCBvZiB0aGUgY3VzdG9tIGZpZWxkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0IGxvb2t1cCB0YWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRHVyYXRpb25Gb3JtYXRUeXBlMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGJ1bGsgZHVyYXRpb24uICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuZGVkQXR0cmlidXRlMyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZV8uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgUElEIG9mIHRoZSBjdXN0b20gZmllbGQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXQgbG9va3VwIHRhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGUzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZW5kZWRBdHRyaWJ1dGU0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlXy5fM18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpZWxkIElEIGluIHRoZSBsb2NhbGlzZWQgbGFuZ3VhZ2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0IGxvb2t1cCB0YWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBidWxrIGR1cmF0aW9uLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuZGVkQXR0cmlidXRlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlbmRlZEF0dHJpYnV0ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9FeHRlbmRlZEF0dHJpYnV0ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVhY2ggb2YgdGhlIGluZGl2aWR1YWwgZW50cmllcyBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlcyBkZWZpbml0aW9uICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uICBUaGVyZSBhcmUgbm8gbGltaXRzIHRvIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCBtYXkgYXBwZWFyLCBidXQgcHJvamVjdCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICB3aWxsIG9ubHkgdW5kZXJzdGFuZCBGbGFnMS1GbGFnMTAsIGV0Yy4gIFRoaXMgbXVzdCBhcHBlYXIgb25jZSBpbiBlYWNoIEV4dGVuZGVkQXR0cmlidXRlcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkV4dGVybmFsVGFza1Byb2plY3RUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlcm5hbFRhc2tQcm9qZWN0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkZpeGVkQ29zdEFjY3J1YWxUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaXhlZENvc3RBY2NydWFsXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJGWVN0YXJ0RGF0ZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGWVN0YXJ0RGF0ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikdyb3VwVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iR3JvdXBfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rQWRkcmVzc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rQWRkcmVzc1R5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtBZGRyZXNzXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtBZGRyZXNzVHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3NfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua1N1YkFkZHJlc3NUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rU3ViQWRkcmVzc18uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua18uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rVHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua18uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSW5pdGlhbHNUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbml0aWFsc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJMYWdGb3JtYXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGFnRm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXlGb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXlGb3JtYXRfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJNYW5hZ2VyVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFuYWdlcl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNYXNrIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hc2tfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxldmVsIG9mIHRoZSBtYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZTUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiBtYXNrLiBWYWx1ZXMgYXJlOiAwPU51bWJlcnMsIDE9VXBwZXIgQ2FzZSBMZXR0ZXJzLCAyPUxvd2VyIENhc2UgTGV0dGVycywgMz1DaGFyYWN0ZXJzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZW5ndGgiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtYXhpbXVtIGxlbmd0aCBpbiBjaGFyYWN0ZXJzIG9mIHRoZSBvdXRsaW5lIGNvZGUgdmFsdWVzLiAgSWYgbGVuZ3RoIGlzIGFueSwgdGhlIHZhbHVlIGlzIHplcm8uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikxlbmd0aCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlcGFyYXRvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VwYXJhdG9yIHZhbHVlIG9mIHRoZSBjb2RlIHZhbHVlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2VwYXJhdG9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWFza3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFza3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXNrIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01hc2siCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm91ciBlbGVtZW50cyBvZiB0aGUgbWFzayBjb25zdGl0dXRlIHRoZSBmb3JtYXQgaW4gd2hpY2ggdGhlIG91dGxpbmUgY29kZSBtdXN0IGFwcGVhci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFzayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik1hdGVyaWFsTGFiZWxUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXRlcmlhbExhYmVsXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5hbWVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5hbWVUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTmFtZVR5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJOYW1lVHlwZTMiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWVfLl8zXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iMjU1Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5ld1Rhc2tTdGFydERhdGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmV3VGFza1N0YXJ0RGF0ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJOVEFjY291bnRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOVEFjY291bnRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0bGluZUNvZGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvcmVzcG9uZHMgdG8gdGhlIGZpZWxkIG51bWJlciBvZiBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZE5hbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkTmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsaWFzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbGlhcyBvZiB0aGUgY3VzdG9tIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWxpYXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwaG9uZXRpY0FsaWFzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwaG9uZXRpYyBwcm9udW5jaWF0aW9uIG9mIHRoZSBhbGlhcyBvZiB0aGUgY3VzdG9tIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhvbmV0aWNBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlcyIgZVR5cGU9IiMvL1ZhbHVlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZXMgb2YgdGhlIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW50ZXJwcmlzZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUgaXMgYW4gZW50ZXJwcmlzZSBjdXN0b20gb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFbnRlcnByaXNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFub3RoZXIgY3VzdG9tIGZpZWxkIGZvciB3aGljaCB0aGlzIGlzIGFuIGFsaWFzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgY3VzdG9tIG91dGxpbmUgY29kZSBjYW4gYmUgdXNlZCBieSB0aGUgUmVzb3VyY2UgU3Vic3RpdHV0aW9uIFdpemFyZCBpbiBNaWNyb3NvZnQgUHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGVhZk9ubHkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgb3Igbm90IHZhbHVlcyBzcGVjaWZpZWQgaW4gdGhpcyBvdXRsaW5lIGNvZGUgZmllbGQgbXVzdCBiZSBsZWFmIHZhbHVlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGVhZk9ubHkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbGxMZXZlbHNSZXF1aXJlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTmV3IGNvZGVzIG11c3QgaGF2ZSBhbGwgbGV2ZWxzIHByZXNlbnQuICBOb3QgYXZhaWxhYmxlIGZvciBFbnRlcnByaXNlIENvZGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBbGxMZXZlbHNSZXF1aXJlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9ubHlUYWJsZVZhbHVlc0FsbG93ZWQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdmFsdWVzIHNwZWNpZmllZCBtdXN0IGNvbWUgZnJvbSB2YWx1ZXMgdGFibGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik9ubHlUYWJsZVZhbHVlc0FsbG93ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXNrcyIgZVR5cGU9IiMvL01hc2tzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRhYmxlIG9mIGVudHJpZXMgdGhhdCBkZWZpbmUgdGhlIG91dGxpbmUgY29kZSBtYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGxpbmVDb2RlMiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmllbGQgSUQgaW4gdGhlIGxvY2FsaXNlZCBsYW5ndWFnZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgaW4gdGhlIHZhbHVlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWZpbml0aW9uIGluIHRoZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGxpbmVDb2RlMyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZV8uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmllbGQgSUQgaW4gdGhlIGxvY2FsaXNlZCBsYW5ndWFnZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgaW4gdGhlIHZhbHVlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWZpbml0aW9uICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGxpbmVDb2RlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRsaW5lQ29kZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9PdXRsaW5lQ29kZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpbmRpdmlkdWFsIG91dGxpbmUgY29kZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iT3V0bGluZU51bWJlclR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVOdW1iZXJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlRm9ybWF0Xy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlBob25ldGljQWxpYXNUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaG9uZXRpY0FsaWFzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUGhvbmV0aWNzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhvbmV0aWNzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByZWRlY2Vzc29yTGluayI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVkZWNlc3NvckxpbmtfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVkZWNlc3NvclVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwcmVkZWNlc3NvciB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVkZWNlc3NvclVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGluayB0eXBlLiAgVmFsdWVzIGFyZSAwPUZGLCAxPUZTLCAyPVNGIGFuZCAzPVNTJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcm9zc1Byb2plY3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHByZWRlY2Vzc29yIGlzIHBhcnQgb2YgYW5vdGhlciBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcm9zc1Byb2plY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcm9zc1Byb2plY3ROYW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleHRlcm5hbCBwcmVkZWNlc3NvciBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcm9zc1Byb2plY3ROYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGlua0xhZyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBsYWcgaW4gdGVudGhzIG9mIGEgbWludXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMaW5rTGFnIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFnRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTGFnRm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGxhZyBmb3JtYXQuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYWdGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJQcmVmaXhUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVmaXhfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9qZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2plY3RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9VSURUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL05hbWVUeXBlMyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGl0bGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UaXRsZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGl0bGUgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpdGxlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3ViamVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N1YmplY3RUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN1YmplY3Qgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YmplY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXRlZ29yeSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0NhdGVnb3J5VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjYXRlZ29yeSBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2F0ZWdvcnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb21wYW55IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ29tcGFueVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29tcGFueSB0aGF0IG93bnMgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbXBhbnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYW5hZ2VyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTWFuYWdlclR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWFuYWdlciBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFuYWdlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dGhvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0F1dGhvclR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYXV0aG9yIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdXRob3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcmVhdGlvbkRhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSBwcm9qZWN0IHdhcyBjcmVhdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXZpc2lvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiB0aW1lcyBhIHByb2plY3QgaGFzIGJlZW4gc2F2ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJldmlzaW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFzdFNhdmVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgcHJvamVjdCB3YXMgbGFzdCBzYXZlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGFzdFNhdmVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NoZWR1bGVGcm9tU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHByb2plY3QgaXMgc2NoZHVsZWQgZnJvbSB0aGUgc3RhcnQgZGF0ZSBvciBmaW5pc2ggZGF0ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNjaGVkdWxlRnJvbVN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnREYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHByb2plY3QuIFJlcXVpcmVkIGlmIFNjaGVkdWxlRnJvbVN0YXJ0IGlzIHRydWUuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2hEYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpbmlzaCBkYXRlIG9mIHRoZSBwcm9qZWN0LiBSZXF1aXJlZCBpZiBTY2hlZHVsZUZyb21TdGFydCBpcyBmYWxzZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmWVN0YXJ0RGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0ZZU3RhcnREYXRlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkZpc2NhbCBZZWFyIHN0YXJ0aW5nIG1vbnRoLiBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MT1KYW51YXJ5LCAyPUZlYnJ1YXJ5LCAzPU1hcmNoLCA0PUFwcmlsLCA1PU1heSwgNj1KdW5lLCA3PUp1bHksICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTs4PUF1Z3VzdCwgOT1TZXB0ZW1iZXIsIDEwPU9jdG9iZXIsIDExPU5vdmVtYmVyLCAxMj1EZWNlbWJlciAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRllTdGFydERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcml0aWNhbFNsYWNrTGltaXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBudW1iZXIgb2YgZGF5cyBwYXN0IGl0cyBlbmQgZGF0ZSB0aGF0IGEgdGFzayBjYW4gZ28gJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O2JlZm9yZSBNaWNyb3NvZnQgUHJvamVjdCBtYXJrcyB0aGF0IHRhc2sgYXMgYSBjcml0aWNhbCB0YXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcml0aWNhbFNsYWNrTGltaXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjdXJyZW5jeURpZ2l0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgc3ltYm9sLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXJyZW5jeURpZ2l0cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN1cnJlbmN5U3ltYm9sIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ3VycmVuY3lTeW1ib2xUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGN1cnJlbmN5IHN5bWJvbCB1c2VkIGluIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXJyZW5jeVN5bWJvbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN1cnJlbmN5U3ltYm9sUG9zaXRpb24iCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9DdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVuY3kgc3ltYm9sLiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9QmVmb3JlLCAxPUFmdGVyLCAyPUJlZm9yZSBXaXRoIFNwYWNlLCAzPUFmdGVyIHdpdGggc3BhY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbmN5U3ltYm9sUG9zaXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYWxlbmRhclVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByb2plY3QgY2FsZW5kYXIuICBSZWZlcnMgdG8gYSB2YWxpZCBVSUQgaW4gdGhlICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtDYWxlbmRhcnMgZWxlbWVudCBvZiB0aGUgTWljcm9zb2Z0IFByb2plY3QgWE1MIFNjaGVtYS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsZW5kYXJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0U3RhcnRUaW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1RpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBzdGFydCB0aW1lIG9mIG5ldyB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdFN0YXJ0VGltZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRGaW5pc2hUaW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1RpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBmaW5pc2ggdGltZSBvZiBuZXcgdGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRGaW5pc2hUaW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWludXRlc1BlckRheSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBtaW51dGVzIHBlciBkYXkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1pbnV0ZXNQZXJEYXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaW51dGVzUGVyV2VlayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBtaW51dGVzIHBlciB3ZWVrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNaW51dGVzUGVyV2VlayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRheXNQZXJNb250aCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBkYXlzIHBlciBtb250aC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGF5c1Blck1vbnRoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdFRhc2tUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRGVmYXVsdFRhc2tUeXBlVHlwZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHR5cGUgb2YgbmV3IHRhc2tzLiBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MD1GaXhlZCBVbml0cywgMT1GaXhlZCBEdXJhdGlvbiwgMj1GaXhlZCBXb3JrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0VGFza1R5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0RlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGZyb20gd2hlcmUgZml4ZWQgY29zdHMgYXJlIGFjY3J1ZWQuICBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MT1TdGFydCwgMj1Qcm9yYXRlZCwgMz1FbmQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0U3RhbmRhcmRSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgc3RhbmRhcmQgcmF0ZSBmb3IgbmV3IHJlc291cmNlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdFN0YW5kYXJkUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRPdmVydGltZVJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBvdmVydGltZSByYXRlIGZvciBuZXcgcmVzb3VyY2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0T3ZlcnRpbWVSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGU1Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTszPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzUzPW51bGwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya0Zvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtGb3JtYXRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgd29yayB1bml0IGZvcm1hdC4gVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWRpdGFibGVBY3R1YWxDb3N0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgb3Igbm90IGFjdHVhbCBjb3N0cyBhcmUgZWRpdGFibGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVkaXRhYmxlQWN0dWFsQ29zdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJob25vckNvbnN0cmFpbnRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRhc2tzIGhvbm91ciB0aGVpciBjb25zdHJhaW50IGRhdGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIb25vckNvbnN0cmFpbnRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWFybmVkVmFsdWVNZXRob2QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9FYXJuZWRWYWx1ZU1ldGhvZFR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgbWV0aG9kIGZvciBjYWxjdWxhdGluZyBlYXJuZWQgdmFsdWUuIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPVBlcmNlbnQgQ29tcGxldGUsIDE9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJuZWRWYWx1ZU1ldGhvZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0byBjYWxjdWxhdGUgc3VidGFza3MgYXMgc3VtbWFyeSB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibXVsdGlwbGVDcml0aWNhbFBhdGhzIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBtdWx0aXBsZSBjcml0aWNhbCBwYXRocyBhcmUgY2FsY3VsYXRlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTXVsdGlwbGVDcml0aWNhbFBhdGhzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmV3VGFza3NFZmZvcnREcml2ZW4iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgbmV3IHRhc2tzIGFyZSBlZmZvcnQgZHJpdmVuLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOZXdUYXNrc0VmZm9ydERyaXZlbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5ld1Rhc2tzRXN0aW1hdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIHNob3cgdGhlIGVzdGltYXRlZCBkdXJhdGlvbiBieSBkZWZhdWx0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOZXdUYXNrc0VzdGltYXRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwbGl0c0luUHJvZ3Jlc3NUYXNrcyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBpbi1wcm9ncmVzcyB0YXNrcyBjYW4gYmUgc3BsaXQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNwbGl0c0luUHJvZ3Jlc3NUYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwcmVhZEFjdHVhbENvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgYWN0dWFsIGNvc3RzIGFyZSBzcHJlYWQgdG8gdGhlIHN0YXR1cyBkYXRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTcHJlYWRBY3R1YWxDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3ByZWFkUGVyY2VudENvbXBsZXRlIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBwZXJjZW50IGNvbXBsZXRlIGlzIHNwcmVhZCB0byB0aGUgc3RhdHVzIGRhdGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNwcmVhZFBlcmNlbnRDb21wbGV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhc2tVcGRhdGVzUmVzb3VyY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdXBkYXRlcyB0byB0YXNrcyB1cGRhdGUgcmVzb3VyY2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrVXBkYXRlc1Jlc291cmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmlzY2FsWWVhclN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgd2hldGhlciB0byB1c2UgZmlzY2FsIHllYXIgbnVtYmVyaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpc2NhbFllYXJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndlZWtTdGFydERheSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dlZWtTdGFydERheVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdGFydCBkYXkgb2YgdGhlIHdlZWsuIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPVN1bmRheSwgMT1Nb25kYXksIDI9VHVlc2RheSwgMz1XZWRuZXNkYXksIDQ9VGh1cnNkYXksIDU9RnJpZGF5LCA2PVNhdHVyZGF5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldlZWtTdGFydERheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1vdmVDb21wbGV0ZWRFbmRzQmFjayIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O1NwZWNpZmllcyB3aGV0aGVyIHRoZSBlbmQgb2YgY29tcGxldGVkIHBvcnRpb25zIG9mIHRhc2tzIHNjaGVkdWxlZCB0byBiZWdpbiBhZnRlciB0aGUgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7c3RhdHVzIGRhdGUgYnV0IGJlZ3VuIGVhcmx5IHNob3VsZCBiZSBtb3ZlZCBiYWNrIHRvIHRoZSBzdGF0dXMgZGF0ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1vdmVDb21wbGV0ZWRFbmRzQmFjayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1vdmVSZW1haW5pbmdTdGFydHNCYWNrIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7U3BlY2lmaWVzIHdoZXRoZXIgdGhlIGJlZ2lubmluZyBvZiByZW1haW5pbmcgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGJlZ2luIGFmdGVyIHRoZSAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtzdGF0dXMgZGF0ZSBidXQgYmVndW4gZWFybHkgc2hvdWxkIGJlIG1vdmVkIGJhY2sgdG8gdGhlIHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O1NwZWNpZmllcyB3aGV0aGVyIHRoZSBiZWdpbm5pbmcgb2YgcmVtYWluaW5nIHBvcnRpb25zIG9mIHRhc2tzIHNjaGVkdWxlZCB0byBoYXZlIGJlZ3VuIGxhdGUgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7c2hvdWxkIGJlIG1vdmVkIHVwIHRvIHRoZSBzdGF0dXMgZGF0ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7U3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVuZCBvZiBjb21wbGV0ZWQgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGhhdmUgYmVlbiBjb21wbGV0ZWQgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7YmVmb3JlIHRoZSBzdGF0dXMgZGF0ZSBidXQgYmVndW4gbGF0ZSBzaG91bGQgYmUgbW92ZWQgdXAgdG8gdGhlIHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0Jhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNwZWNpZmljIGJhc2VsaW5lIHVzZWQgdG8gY2FsY3VsYXRlIFZhcmlhbmNlIHZhbHVlcy4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPUJhc2VsaW5lLCAxPUJhc2VsaW5lIDEsIDI9QmFzZWxpbmUgMiwgMz1CYXNlbGluZSAzLCA0PUJhc2VsaW5lIDQsIDU9QmFzZWxpbmUgNSwgNj1CYXNlbGluZSA2LCAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Nz1CYXNlbGluZSA3LCA4PUJhc2VsaW5lIDgsIDk9QmFzZWxpbmUgOSwgMTA9QmFzZWxpbmUgMTAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IGFkZCBuZXcgcmVzb3VyY2VzIHRvIHRoZSByZXNvdXJjZSBwb29sLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGF0dXNEYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0ZSB1c2VkIGZvciBjYWxjdWxhdGlvbiBhbmQgcmVwb3J0aW5nLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGF0dXNEYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3VycmVudERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3lzdGVtIGRhdGUgdGhhdCB0aGUgWE1MIHdhcyBnZW5lcmF0ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbnREYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcHJvamVjdCB3YXMgY3JlYXRlZCBieSBhIFByb2plY3QgU2VydmVyIHVzZXIgYXMgb3Bwb3NlZCB0byBhbiBOVCB1c2VyLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dG9saW5rIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIGF1dG9saW5rIGluc2VydGVkIG9yIG1vdmVkIHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdXRvbGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5ld1Rhc2tTdGFydERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9OZXdUYXNrU3RhcnREYXRlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGRhdGUgZm9yIG5ldyB0YXNrcyBzdGFydC4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPVByb2plY3QgU3RhcnQgRGF0ZSwgMT1DdXJyZW50IERhdGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmV3VGFza1N0YXJ0RGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRUYXNrRVZNZXRob2QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EZWZhdWx0VGFza0VWTWV0aG9kVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGVhcm5lZCB2YWx1ZSBtZXRob2QgZm9yIHRhc2tzLiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9UGVyY2VudCBDb21wbGV0ZSwgMT1QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRUYXNrRVZNZXRob2QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcHJvamVjdCBYTUwgd2FzIGVkaXRlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlbmRlZENyZWF0aW9uRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRhdGUgdXNlZCBmb3IgY2FsY3VsYXRpb24gYW5kIHJlcG9ydGluZy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRDcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxzSW5TeW5jIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIGFsbCBhY3R1YWwgd29yayBoYXMgYmVlbiBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsc0luU3luYyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbW92ZUZpbGVQcm9wZXJ0aWVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIHJlbW92ZSBhbGwgZmlsZSBwcm9wZXJ0aWVzIG9uIHNhdmUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbW92ZUZpbGVQcm9wZXJ0aWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWRtaW5Qcm9qZWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBwcm9qZWN0IGlzIGFuIGFkbWluaXN0cmF0aXZlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFkbWluUHJvamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGxpbmVDb2RlcyIgZVR5cGU9IiMvL091dGxpbmVDb2RlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIG91dGxpbmUgY29kZSBkZWZpbml0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuICBUaGVzZSBjb2RlcyBtYXkgYmUgYXNzb2NpYXRlZCBvbmx5IHdpdGggdGhpcyBwcm9qZWN0LCBvciBtYXkgYmUgY29tbW9uIGFtb25nIHNldmVyYWwgcHJvamVjdHMgKGVudGVycHJpc2UgY29kZXMpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3QlNNYXNrcyIgZVR5cGU9IiMvL1dCU01hc2tzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRhYmxlIG9mIGVudHJpZXMgdGhhdCBkZWZpbmUgdGhlIG91dGxpbmUgY29kZSBtYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNNYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVuZGVkQXR0cmlidXRlcyIgZVR5cGU9IiMvL0V4dGVuZGVkQXR0cmlidXRlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIGV4dGVuZGVkIGF0dHJpYnV0ZSAoY3VzdG9tIGZpZWxkKSBkZWZpbml0aW9ucyAmI3hEOyYjeEE7ICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhbGVuZGFycyIgZVR5cGU9IiMvL0NhbGVuZGFycyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIGNhbGVuZGFycyB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgJiN4RDsmI3hBOyAgICAgICAgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsZW5kYXJzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFza3MiIGVUeXBlPSIjLy9UYXNrcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIHRhc2tzIHRoYXQgbWFrZSB1cCB0aGUgcHJvamVjdC4mI3hEOyYjeEE7ICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFza3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvdXJjZXMiIGVUeXBlPSIjLy9SZXNvdXJjZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMgdGhhdCBtYWtlIHVwIHRoZSBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3NpZ25tZW50cyIgZVR5cGU9IiMvL0Fzc2lnbm1lbnRzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgYXNzaWdubWVudHMgdGhhdCBtYWtlIHVwIHRoZSBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lnbm1lbnRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmF0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmF0ZXNGcm9tIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgcmF0ZSBiZWNvbWVzIGVmZmVjdGl2ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZXNGcm9tIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmF0ZXNUbyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXN0IGRhdGUgdGhhdCB0aGUgcmF0ZSBpcyBlZmZlY3RpdmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVzVG8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYXRlVGFibGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9SYXRlVGFibGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByYXRlIHRhYmxlIGZvciB0aGUgcmVzb3VyY2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9QSwgMT1CLCAyPUMsIDM9RCwgND1FIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVUYWJsZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YW5kYXJkUmF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN0YW5kYXJkIHJhdGUgZm9yIHRoZSByZXNvdXJjZSBmb3IgdGhlIHBlcmlvZCBzcGVjaWZpZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YW5kYXJkUmF0ZUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0YW5kYXJkUmF0ZUZvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pdHMgdXNlZCBieSBNaWNyb3NvZnQgUHJvamVjdCB0byBkaXNwbGF5IHRoZSBzdGFuZGFyZCByYXRlLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vLCA3PXkmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgb3ZlcnRpbWUgcmF0ZSBmb3IgdGhlIHJlc291cmNlIGZvciB0aGUgcGVyaW9kIHNwZWNpZmllZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVSYXRlRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIG92ZXJ0aW1lIHJhdGUuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPW0sIDI9aCwgMz1kLCA0PXcsIDU9bW8sIDc9eSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVJhdGVGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0UGVyVXNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29zdCBwZXIgdXNlIG9mIHRoZSByZXNvdXJjZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBhcyBvZiB0aGUgY3VycmVudCBkYXRlIGlmIGEgcmF0ZSB0YWJsZSBleGlzdHMgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFBlclVzZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJhdGVzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmF0ZSIgdXBwZXJCb3VuZD0iMjUiIGVUeXBlPSIjLy9SYXRlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmluaXRpb24gb2YgYSB0aW1lIHBlcmlvZCwgYW5kIHRoZSByYXRlcyBhcHBsaWNhYmxlIGZvciAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzb3VyY2UgZHVyaW5nIHRoYXQgcGVyaW9kLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUmF0ZVRhYmxlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVUYWJsZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXNvdXJjZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwb3NpdGlvbiBpZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZSB3aXRoaW4gdGhlIGxpc3Qgb2YgcmVzb3VyY2VzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9OYW1lVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVHlwZVR5cGU0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgcmVzb3VyY2UuIFZhbHVlcyBhcmU6IDA9TWF0ZXJpYWwsIDE9V29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNOdWxsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgbnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNOdWxsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5pdGlhbHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Jbml0aWFsc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaW5pdGlhbHMgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbml0aWFscyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBob25ldGljcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1Bob25ldGljc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGhvbmV0aWMgc3BlbGxpbmcgb2YgdGhlIHJlc291cmNlIG5hbWUuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdXNlIHdpdGggSmFwYW5lc2Ugb25seS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhvbmV0aWNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iblRBY2NvdW50IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTlRBY2NvdW50VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBOVCBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5UQWNjb3VudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hdGVyaWFsTGFiZWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9NYXRlcmlhbExhYmVsVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBtYXRlcmlhbCByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWF0ZXJpYWxMYWJlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvZGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9Db2RlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2RlIG9yIG90aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29kZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vR3JvdXBUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGdyb3VwIHRvIHdoaWNoIHRoZSByZXNvdXJjZSBiZWxvbmdzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHcm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtHcm91cCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtHcm91cFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiB3b3JrZ3JvdXAgdG8gd2hpY2ggdGhlIHJlc291cmNlIGJlbG9uZ3MuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9RGVmYXVsdCwgMT1Ob25lLCAyPUVtYWlsLCAzPVdlYiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrR3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbWFpbEFkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9FbWFpbEFkZHJlc3NUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFbWFpbEFkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aXRsZSBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua0FkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtBZGRyZXNzVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtTdWJBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZG9jdW1lbnQgYm9va21hcmsgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWF4VW5pdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjEuMCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtYXhpbXVtIG51bWJlciBvZiB1bml0cyB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1heFVuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVha1VuaXRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhcmdlc3QgbnVtYmVyIG9mIHVuaXRzIGFzc2lnbmVkIHRvIHRoZSByZXNvdXJjZSBhdCBhbnkgdGltZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGVha1VuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlckFsbG9jYXRlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcmVzb3VyY2UgaXMgb3ZlcmFsbG9jYXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlckFsbG9jYXRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF2YWlsYWJsZUZyb20iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmlyc3QgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJsZUZyb20iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdmFpbGFibGVUbyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXN0IGRhdGUgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmxlVG8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhbkxldmVsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSByZXNvdXJjZSBjYW4gYmUgbGV2ZWxlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FuTGV2ZWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY2NydWVBdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0FjY3J1ZUF0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSG93IGNvc3QgaXMgYWNjcnVlZCBhZ2FpbnN0IHRoZSByZXNvdXJjZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMT1TdGFydCwgMj1FbmQsIDM9UHJvcmF0ZWQmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWNjcnVlQXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvdGFsIHdvcmsgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWd1bGFyV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygbm9uLW92ZXJ0aW1lIHdvcmsgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWd1bGFyV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygb3ZlcnRpbWUgd29yayBhc3NpZ25lZCB0byB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIGFjdHVhbCB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiByZW1haW5pbmcgd29yayByZXF1aXJlZCB0byBjb21wbGV0ZSBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ1dvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZVdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIGFjdHVhbCBvdmVydGltZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lV29yayIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgcmVtYWluaW5nIG92ZXJ0aW1lIHdvcmsgcmVxdWlyZWQgdG8gY29tcGxldGUgYWxsIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZXJjZW50V29ya0NvbXBsZXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGVyY2VudGFnZSBvZiB3b3JrIGNvbXBsZXRlZCBhY3Jvc3MgYWxsIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJjZW50V29ya0NvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhbmRhcmRSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3RhbmRhcmQgcmF0ZSBvZiB0aGUgcmVzb3VyY2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YW5kYXJkUmF0ZUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXRzIHVzZWQgYnkgTWljcm9zb2Z0IFByb2plY3QgdG8gZGlzcGxheSB0aGUgc3RhbmRhcmQgcmF0ZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15LCA4PW1hdGVyaWFsIHJlc291cmNlIHJhdGUgKG9yIGJsYW5rIHN5bWJvbCBzcGVjaWZpZWQpJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZUZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3QiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0b3RhbCBwcm9qZWN0IGNvc3QgZm9yIHRoZSByZXNvdXJjZSBhY3Jvc3MgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgb3ZlcnRpbWUgcmF0ZSBvZiB0aGUgcmVzb3VyY2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lUmF0ZUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL092ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXRzIHVzZWQgYnkgTWljcm9zb2Z0IFByb2plY3QgdG8gZGlzcGxheSB0aGUgb3ZlcnRpbWUgcmF0ZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvdGFsIG92ZXJ0aW1lIGNvc3QgZm9yIHRoZSByZXNvdXJjZSBpbmNsdWRpbmcgYWN0dWFsIGFuZCByZW1haW5pbmcgb3ZlcnRpbWUgY29zdHMuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3RQZXJVc2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb3N0IHBlciB1c2Ugb2YgdGhlIHJlc291cmNlLiBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0UGVyVXNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBjb3N0IGluY3VycmVkIGJ5IHRoZSByZXNvdXJjZSBhY3Jvc3MgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIG92ZXJ0aW1lIGNvc3QgaW5jdXJyZWQgYnkgdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ0Nvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgcHJvamVjdGVkIGNvc3Qgb2YgdGhlIHJlc291cmNlIHRvIGNvbXBsZXRlIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lQ29zdCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgb3ZlcnRpbWUgY29zdCBvZiB0aGUgcmVzb3VyY2UgdG8gY29tcGxldGUgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrVmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBiYXNlbGluZSB3b3JrIGFuZCB0aGUgd29yayBhcyBtaW51dGVzIHggMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1ZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYmFzZWxpbmUgY29zdCBhbmQgdGhlIGNvc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNWIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFybmVkIHZhbHVlIHNjaGVkdWxlIHZhcmlhbmNlLCB0aHJvdWdoIHRoZSBwcm9qZWN0IHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTViIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNWIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFybmVkIHZhbHVlIGNvc3QgdmFyaWFuY2UsIHRocm91Z2ggdGhlIHByb2plY3Qgc3RhdHVzIGRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNWIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYUNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgY29zdCBvZiB0aGUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlIGZvciB0aGUgcHJvamVjdCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FsZW5kYXJVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZXNvdXJjZSBjYWxlbmRhci5SZWZlcnMgdG8gYSB2YWxpZCBVSUQgaW4gdGhlIENhbGVuZGFycyBlbGVtZW50IG9mICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBYTUwgU2NoZW1hLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhclVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vdGVzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTm90ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldCBjb3N0IG9mIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygb2YgdGhlIHdvcmsgcGVyZm9ybWVkIGJ5IHRoZSByZXNvdXJjZSBmb3IgdGhlIHByb2plY3QgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzR2VuZXJpYyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIGdlbmVyaWMuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzR2VuZXJpYyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzSW5hY3RpdmUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBzZXQgdG8gaW5hY3RpdmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzSW5hY3RpdmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0VudGVycHJpc2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBhbiBFbnRlcnByaXNlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc0VudGVycHJpc2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJib29raW5nVHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0Jvb2tpbmdUeXBlVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGJvb2tpbmcgdHlwZSBvZiB0aGUgcmVzb3VyY2UuIDE9Q29tbWl0ZWQsIDI9UHJvcG9zZWQmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQm9va2luZ1R5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrUHJvdGVjdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2ZURpcmVjdG9yeUdVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9BY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBBY3RpdmUgRGlyZWN0b3J5IEdVSUQgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0aXZlRGlyZWN0b3J5R1VJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyZWF0aW9uRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHJlc291cmNlIHdhcyBjcmVhdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlbmRlZEF0dHJpYnV0ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9FeHRlbmRlZEF0dHJpYnV0ZTMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgYW4gZXh0ZW5kZWQgYXR0cmlidXRlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgYmFjayB0byB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgRmllbGQgSUQsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZWxpbmUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQmFzZWxpbmUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJhc2VsaW5lIHZhbHVlcyBmb3IgdGhlIHJlc291cmNlcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRsaW5lQ29kZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9PdXRsaW5lQ29kZTMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgYW4gb3V0bGluZSBjb2RlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSBhIHBvaW50ZXIgYmFjayB0byAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3V0bGluZSBjb2RlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgRmllbGQgSUQsIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXZhaWxhYmlsaXR5UGVyaW9kcyIgZVR5cGU9IiMvL0F2YWlsYWJpbGl0eVBlcmlvZHMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGNvbGxlY3Rpb24gb2YgcGVyaW9kcyBkdXJpbmcgd2hpY2ggdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmlsaXR5UGVyaW9kcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJhdGVzIiBlVHlwZT0iIy8vUmF0ZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGNvbGxlY3Rpb24gb2YgcGVyaW9kcyBhbmQgdGhlIHJhdGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIG9uZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lcGhhc2VkRGF0YSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSBwaGFzZWQgZGF0YSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlc291cmNlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvdXJjZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9SZXNvdXJjZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIHJlc291cmNlIGluIGVhY2ggUmVzb3VyY2VzIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUm9sbHVwVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xsdXBUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFuZGFyZFJhdGVGb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyA0IDUgNyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZUZvcm1hdF8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyA0IDUgNyA4Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN1YmplY3RUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJqZWN0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN1YnByb2plY3ROYW1lVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3VicHJvamVjdE5hbWVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFzayI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBvc2l0aW9uIGlkZW50aWZpZXIgb2YgdGhlIHRhc2sgd2l0aGluIHRoZSBsaXN0IG9mIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9OYW1lVHlwZTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIHRhc2suICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9Rml4ZWQgVW5pdHMsIDE9Rml4ZWQgRHVyYXRpb24sIDI9Rml4ZWQgV29yay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzTnVsbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHRhc2sgaXMgbnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNOdWxsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JlYXRlRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHRhc2sgd2FzIGNyZWF0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyZWF0ZURhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb250YWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ29udGFjdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29udGFjdCBwZXJzb24gZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250YWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id0JTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgY29kZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV0JTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id0JTTGV2ZWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJpZ2h0bW9zdCBXQlMgbGV2ZWwgb2YgdGhlIHRhc2suICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNMZXZlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im91dGxpbmVOdW1iZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9PdXRsaW5lTnVtYmVyVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBvdXRsaW5lIG51bWJlciBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZU51bWJlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im91dGxpbmVMZXZlbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG91dGxpbmUgbGV2ZWwgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVMZXZlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByaW9yaXR5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJpb3JpdHkgb2YgdGhlIHRhc2sgZnJvbSAwIHRvIDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByaW9yaXR5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGxhbm5lZCBkdXJhdGlvbiBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZTQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBEdXJhdGlvbiBvZiB0aGUgVGFzay4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygc2NoZWR1bGVkIHdvcmsgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RvcCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHRhc2sgd2FzIHN0b3BwZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0b3AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXN1bWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSB0YXNrIHJlc3VtZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3VtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3VtZVZhbGlkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGNhbiBiZSByZXN1bWVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXN1bWVWYWxpZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVmZm9ydERyaXZlbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBlZmZvcnQtZHJpdmVuLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFZmZvcnREcml2ZW4iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWN1cnJpbmciIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgYSByZWN1cnJpbmcgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVjdXJyaW5nIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlckFsbG9jYXRlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBvdmVyYWxsb2NhdGVkLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgaW5mb3JtYXRpb25hbCBvbmx5LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVyQWxsb2NhdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGVzdGltYXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWlsZXN0b25lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGEgbWlsZXN0b25lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNaWxlc3RvbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdW1tYXJ5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGEgc3VtbWFyeSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdW1tYXJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JpdGljYWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgaW4gdGhlIGNyaXRpY2FsIGNoYWluLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcml0aWNhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3VicHJvamVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBhbiBpbnNlcnRlZCBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc1N1YnByb2plY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1N1YnByb2plY3RSZWFkT25seSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgaW5zZXJ0ZWQgcHJvamVjdCBpcyByZWFkLW9ubHkuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzU3VicHJvamVjdFJlYWRPbmx5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3VicHJvamVjdE5hbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdWJwcm9qZWN0TmFtZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBpbnNlcnRlZCBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJwcm9qZWN0TmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsVGFzayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBleHRlcm5hbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZXJuYWxUYXNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxUYXNrUHJvamVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0V4dGVybmFsVGFza1Byb2plY3RUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNvdXJjZSBsb2NhdGlvbiBhbmQgdGFzayBpZGVudGlmaWVyIG9mIHRoZSBleHRlcm5hbCB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlcm5hbFRhc2tQcm9qZWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWFybHlTdGFydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlYXJseSBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJseVN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWFybHlGaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWFybHkgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVhcmx5RmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGF0ZVN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhdGUgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGF0ZVN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGF0ZUZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXRlIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYXRlRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnRWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhcmlhbmNlIG9mIHRoZSB0YXNrIHN0YXJ0IGRhdGUgZnJvbSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmFzZWxpbmUgc3RhcnQgZGF0ZSBhcyBtaW51dGVzIHggMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnRWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGhlIHRhc2sgZmluaXNoIGRhdGUgZnJvbSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmFzZWxpbmUgZmluaXNoIGRhdGUgYXMgbWludXRlcyB4IDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaFZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya1ZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhcmlhbmNlIG9mIHRhc2sgd29yayBmcm9tIHRoZSBiYXNlbGluZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrIHdvcmsgYXMgbWludXRlcyB4IDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZyZWVTbGFjayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBmcmVlIHNsYWNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGcmVlU2xhY2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0b3RhbFNsYWNrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHRvdGFsIHNsYWNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUb3RhbFNsYWNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZml4ZWRDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpeGVkIGNvc3Qgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpeGVkQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpeGVkQ29zdEFjY3J1YWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9GaXhlZENvc3RBY2NydWFsVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkhvdyB0aGUgZml4ZWQgY29zdCBpcyBhY2NydWVkIGFnYWluc3QgdGhlIHRhc2suICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDE9U3RhcnQsIDI9UHJvcmF0ZWQgYW5kIDM9RW5kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaXhlZENvc3RBY2NydWFsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVyY2VudENvbXBsZXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGVyY2VudGFnZSBvZiB0aGUgdGFzayBkdXJhdGlvbiBjb21wbGV0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlcmNlbnRDb21wbGV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBlcmNlbnRXb3JrQ29tcGxldGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJjZW50YWdlIG9mIHRoZSB0YXNrIHdvcmsgY29tcGxldGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJjZW50V29ya0NvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByb2plY3RlZCBvciBzY2hlZHVsZWQgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN1bSBvZiB0aGUgYWN0dWFsIGFuZCByZW1haW5pbmcgb3ZlcnRpbWUgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbEZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbEZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbER1cmF0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBkdXJhdGlvbiBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsRHVyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGNvc3Qgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbENvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZUNvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgb3ZlcnRpbWUgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgd29yayBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZVdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIG92ZXJ0aW1lIHdvcmsgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWd1bGFyV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygbm9uLW92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVndWxhcldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdEdXJhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgdGltZSByZXF1aXJlZCB0byBjb21wbGV0ZSB0aGUgdW5maW5pc2hlZCBwb3J0aW9uIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdEdXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ0Nvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgcHJvamVjdGVkIGNvc3Qgb2YgY29tcGxldGluZyB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ1dvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHdvcmsgc2NoZWR1bGVkIHRvIGNvbXBsZXRlIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVDb3N0IgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3QgcHJvamVjdGVkIHRvIGZpbmlzaCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVXb3JrIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCB0byBmaW5pc2ggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ092ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIHRhc2sgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQUNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNWIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFybmVkIHZhbHVlIGNvc3QgdmFyaWFuY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNWIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29uc3RyYWludFR5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Db25zdHJhaW50VHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29uc3RyYWludCBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9QXMgU29vbiBBcyBQb3NzaWJsZSwgMT1BcyBMYXRlIEFzIFBvc3NpYmxlLCAyPU11c3QgU3RhcnQgT24sIDM9TXVzdCBGaW5pc2ggT24sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ9U3RhcnQgTm8gRWFybGllciBUaGFuLCA1PVN0YXJ0IE5vIExhdGVyIFRoYW4sIDY9RmluaXNoIE5vIEVhcmxpZXIgVGhhbiBhbmQgNz1GaW5pc2ggTm8gTGF0ZXIgVGhhbiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25zdHJhaW50VHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhbGVuZGFyVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGFzayBjYWxlbmRhci5SZWZlcnMgdG8gYSB2YWxpZCBVSUQgaW4gdGhlIENhbGVuZGFycyBlbGVtZW50IG9mICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBYTUwgU2NoZW1hLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhclVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbnN0cmFpbnREYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgYXJndW1lbnQgZm9yIHRoZSB0YXNrIGNvbnN0cmFpbnQgdHlwZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29uc3RyYWludERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWFkbGluZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWFkbGluZSBmb3IgdGhlIHRhc2sgdG8gYmUgY29tcGxldGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWFkbGluZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsQXNzaWdubWVudHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgbGV2ZWxpbmcgY2FuIGFkanVzdCBhc3NpZ25tZW50cy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxBc3NpZ25tZW50cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsaW5nQ2FuU3BsaXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgbGV2ZWxpbmcgY2FuIHNwbGl0IHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0NhblNwbGl0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxpbmdEZWxheSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlbGF5IGNhdXNlZCBieSBsZXZlbGluZyB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdEZWxheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsaW5nRGVsYXlGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9MZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgZGVsYXkuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0RlbGF5Rm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlTGV2ZWxlZFN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2sgYmVmb3JlIGl0IHdhcyBsZXZlbGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVMZXZlbGVkU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVMZXZlbGVkRmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrIGJlZm9yZSBpdCB3YXMgbGV2ZWxlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlTGV2ZWxlZEZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGluayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua1R5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpdGxlIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rQWRkcmVzc1R5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtTdWJBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRvY3VtZW50IGJvb2ttYXJrIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWdub3JlUmVzb3VyY2VDYWxlbmRhciIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpZ25vcmVzIHRoZSByZXNvdXJjZSBjYWxlbmRhci4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSWdub3JlUmVzb3VyY2VDYWxlbmRhciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vdGVzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOb3RlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhpZGVCYXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIEdBTlRUIGJhciBvZiB0aGUgdGFzayBpcyBoaWRkZW4gd2hlbiBkaXNwbGF5ZWQgaW4gTWljcm9zb2Z0IFByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkhpZGVCYXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb2xsdXAiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgcm9sbGVkIHVwLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xsdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSB0YXNrIHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBlcmNlbnRhZ2UgY29tcGxldGUgdmFsdWUgZW50ZXJlZCBieSB0aGUgUHJvamVjdCBNYW5hZ2VyLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjYW4gYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSBmb3IgY2FsY3VsYXRpbmcgQkNXUC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGh5c2ljYWxQZXJjZW50Q29tcGxldGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlYXJuZWRWYWx1ZU1ldGhvZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0Vhcm5lZFZhbHVlTWV0aG9kVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtZXRob2QgZm9yIGNhbGN1bGF0aW5nIGVhcm5lZCB2YWx1ZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1QZXJjZW50IENvbXBsZXRlLCAxPVBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGUmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWFybmVkVmFsdWVNZXRob2QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkZWNlc3NvckxpbmsiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUHJlZGVjZXNzb3JMaW5rIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgcHJlZGVjZXNzb3IgdGFzayBvZiB0aGUgdGFzayB0aGF0IGNvbnRhaW5zIGl0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVkZWNlc3NvckxpbmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrUHJvdGVjdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVuZGVkQXR0cmlidXRlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0V4dGVuZGVkQXR0cmlidXRlMiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBGaWVsZCBJRCwgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlbGluZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9CYXNlbGluZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIGJhc2VsaW5lIHZhbHVlcyBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRsaW5lQ29kZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9PdXRsaW5lQ29kZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgYW4gb3V0bGluZSBjb2RlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgYmFjayB0byB0aGUgb3V0bGluZSBjb2RlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgRmllbGQgSUQsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGltZXBoYXNlZERhdGEiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpbWUgcGhhc2VkIGRhdGEgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2tzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFzayIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgdGFzayBpbiBlYWNoIFRhc2tzIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUaW1lUGVyaW9kIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVQZXJpb2RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmcm9tRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBiZWdpbm5pbmcgb2YgdGhlIGV4Y2VwdGlvbiB0aW1lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRnJvbURhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0b0RhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZW5kIG9mIHRoZSBleGNlcHRpb24gdGltZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRpbWVwaGFzZWREYXRhVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmluaXRpb24gb2YgdGhlIHRpbWUgcGhhc2VkIGRhdGEgYmxvY2suJiN4RDsmI3hBOyYjeDk7JiN4OTsgICAgICAgICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGFUeXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVHlwZVR5cGUzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiB0YXNrIHRpbWVwaGFzZWQgZGF0YS4gVmFsdWVzIGFyZTomI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxPUFzc2lnbm1lbnQgUmVtYWluaW5nIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyPUFzc2lnbm1lbnQgQWN0dWFsIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzPUFzc2lnbm1lbnQgQWN0dWFsIE92ZXJ0aW1lIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0PUFzc2lnbm1lbnQgQmFzZWxpbmUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU9QXNzaWdubWVudCBCYXNlbGluZSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNj1Bc3NpZ25tZW50IEFjdHVhbCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNz1SZXNvdXJjZSBCYXNlbGluZSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgOD1SZXNvdXJjZSBCYXNlbGluZSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgOT1UYXNrIEJhc2VsaW5lIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxMD1UYXNrIEJhc2VsaW5lIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxMT1UYXNrIFBlcmNlbnQgQ29tcGxldGUmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxNj1Bc3NpZ25tZW50IEJhc2VsaW5lIDEgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDE3PUFzc2lnbm1lbnQgQmFzZWxpbmUgMSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMTg9VGFzayBCYXNlbGluZSAxIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxOT1UYXNrIEJhc2VsaW5lIDEgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDIwPVJlc291cmNlIEJhc2VsaW5lIDEgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDIxPVJlc291cmNlIEJhc2VsaW5lIDEgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDIyPUFzc2lnbm1lbnQgQmFzZWxpbmUgMiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjM9QXNzaWdubWVudCBCYXNlbGluZSAyIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyND1UYXNrIEJhc2VsaW5lIDIgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI1PVRhc2sgQmFzZWxpbmUgMiBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjY9UmVzb3VyY2UgQmFzZWxpbmUgMiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjc9UmVzb3VyY2UgQmFzZWxpbmUgMiBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjg9QXNzaWdubWVudCBCYXNlbGluZSAzIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyOT1Bc3NpZ25tZW50IEJhc2VsaW5lIDMgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDMwPVRhc2sgQmFzZWxpbmUgMyBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzE9VGFzayBCYXNlbGluZSAzIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzMj1SZXNvdXJjZSBCYXNlbGluZSAzIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzMz1SZXNvdXJjZSBCYXNlbGluZSAzIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzND1Bc3NpZ25tZW50IEJhc2VsaW5lIDQgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM1PUFzc2lnbm1lbnQgQmFzZWxpbmUgNCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzY9VGFzayBCYXNlbGluZSA0IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzNz1UYXNrIEJhc2VsaW5lIDQgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM4PVJlc291cmNlIEJhc2VsaW5lIDQgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM5PVJlc291cmNlIEJhc2VsaW5lIDQgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQwPUFzc2lnbm1lbnQgQmFzZWxpbmUgNSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDE9QXNzaWdubWVudCBCYXNlbGluZSA1IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0Mj1UYXNrIEJhc2VsaW5lIDUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQzPVRhc2sgQmFzZWxpbmUgNSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDQ9UmVzb3VyY2UgQmFzZWxpbmUgNSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDU9UmVzb3VyY2UgQmFzZWxpbmUgNSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDY9QXNzaWdubWVudCBCYXNlbGluZSA2IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0Nz1Bc3NpZ25tZW50IEJhc2VsaW5lIDYgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQ4PVRhc2sgQmFzZWxpbmUgNiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDk9VGFzayBCYXNlbGluZSA2IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1MD1SZXNvdXJjZSBCYXNlbGluZSA2IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1MT1SZXNvdXJjZSBCYXNlbGluZSA2IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1Mj1Bc3NpZ25tZW50IEJhc2VsaW5lIDcgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDUzPUFzc2lnbm1lbnQgQmFzZWxpbmUgNyBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTQ9VGFzayBCYXNlbGluZSA3IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1NT1UYXNrIEJhc2VsaW5lIDcgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU2PVJlc291cmNlIEJhc2VsaW5lIDcgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU3PVJlc291cmNlIEJhc2VsaW5lIDcgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU4PUFzc2lnbm1lbnQgQmFzZWxpbmUgOCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTk9QXNzaWdubWVudCBCYXNlbGluZSA4IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2MD1UYXNrIEJhc2VsaW5lIDggV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDYxPVRhc2sgQmFzZWxpbmUgOCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjI9UmVzb3VyY2UgQmFzZWxpbmUgOCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjM9UmVzb3VyY2UgQmFzZWxpbmUgOCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjQ9QXNzaWdubWVudCBCYXNlbGluZSA5IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2NT1Bc3NpZ25tZW50IEJhc2VsaW5lIDkgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY2PVRhc2sgQmFzZWxpbmUgOSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjc9VGFzayBCYXNlbGluZSA5IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2OD1SZXNvdXJjZSBCYXNlbGluZSA5IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2OT1SZXNvdXJjZSBCYXNlbGluZSA5IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3MD1Bc3NpZ25tZW50IEJhc2VsaW5lIDEwIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3MT1Bc3NpZ25tZW50IEJhc2VsaW5lIDEwIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3Mj1UYXNrIEJhc2VsaW5lIDEwIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3Mz1UYXNrIEJhc2VsaW5lIDEwIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3ND1SZXNvdXJjZSBCYXNlbGluZSAxMCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNzU9UmVzb3VyY2UgQmFzZWxpbmUgMTAgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDc2PVBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGUmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRpbWVwaGFzZWQgZGF0YSByZWNvcmQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1bml0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVW5pdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSB1bml0IG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9bSwgMT1oLCAyPWQsIDM9dywgNT1tbywgOD15JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVW5pdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBwZXIgdW5pdCBvZiB0aW1lIGZvciB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlRpdGxlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGl0bGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlMiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJUeXBlVHlwZTMiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlXy5fM18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDE2IDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDI4IDI5IDMwIDMxIDMyIDMzIDM0IDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDQ1IDQ2IDQ3IDQ4IDQ5IDUwIDUxIDUyIDUzIDU0IDU1IDU2IDU3IDU4IDU5IDYwIDYxIDYyIDYzIDY0IDY1IDY2IDY3IDY4IDY5IDcwIDcxIDcyIDczIDc0IDc1IDc2Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlNCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl80Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlNSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl81Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVSURUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSURfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSIxNiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVbml0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVuaXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDUgOCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWYWx1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIG91dGxpbmUgY29kZSB2YWx1ZSBhY3Jvc3MgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYXJlbnRWYWx1ZUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgdGhlIHBhcmVudCBub2RlIG9mIHRoZSBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBhcmVudFZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHZhbHVlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVzY3JpcHRpb24gb2YgdGhpcyB2YWx1ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVzY3JpcHRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWYWx1ZTIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaUQiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVuaXF1ZSBJRCBvZiB2YWx1ZSBhY3Jvc3MgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCB2YWx1ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHZhbHVlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBsaXN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmlwdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhbHVlTGlzdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUxpc3RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWx1ZSIgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9WYWx1ZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWVzIHRoYXQgbWFrZSB1cCB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVsaXN0U29ydE9yZGVyXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhbHVlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsdWUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVmFsdWUiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaW5kaXZpZHVhbCB2YWx1ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDowIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldCU01hc2siPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV0JTTWFza18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGV2ZWwgb2YgdGhlIG1hc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1R5cGVUeXBlMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIHRoZSBub2RlIHZhbHVlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWVzIGFyZTogMD1OdW1iZXJzLCAxPVVwcGVyY2FzZSBMZXR0ZXJzLCAyPUxvd2VyY2FzZSBMZXR0ZXJzLCAzPUNoYXJhY3RlcnMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZW5ndGgiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1heGltdW0gbGVuZ3RoIGluIGNoYXJhY3RlcnMuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgb21pdHRlZCB3aGVuIGxlbmd0aCBpcyAmcXVvdDthbnkmcXVvdDsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikxlbmd0aCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlcGFyYXRvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VwYXJhdG9yIGNoYXJhY3RlciBvZiB0aGUgbm9kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2VwYXJhdG9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV0JTTWFza3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV0JTTWFza3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJpZnlVbmlxdWVDb2RlcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgV0JTIGNvZGVzIGFyZSB1bmlxdWUgZm9yIG5ldyB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmVyaWZ5VW5pcXVlQ29kZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnZW5lcmF0ZUNvZGVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBXQlMgY29kZXMgYXJlIGdlbmVyYXRlZCBmb3IgbmV3IHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHZW5lcmF0ZUNvZGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlZml4IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vUHJlZml4VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcmVmaXggZm9yIGFsbCBXQlMgY29kZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWZpeCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndCU01hc2siIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vV0JTTWFzayIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBXQlMgTWFzayB0aGF0IGlzIGFwcGxpZWQgdG8gYWxsIHRhc2tzIGluIHRoZSBQcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNNYXNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2Vla0RheSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrRGF5Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF5VHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0RheVR5cGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgZGF5LiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1FeGNlcHRpb24sIDE9TW9uZGF5LCAyPVR1ZXNkYXksICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzPVdlZG5lc2RheSwgND1UaHVyc2RheSwgNT1GcmlkYXksIDY9U2F0dXJkYXksICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3PVN1bmRheSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEYXlUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF5V29ya2luZyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgc3BlY2lmaWVkIGRhdGUgb3IgZGF5ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGlzIHdvcmtpbmcuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRheVdvcmtpbmciLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lUGVyaW9kIiBlVHlwZT0iIy8vVGltZVBlcmlvZCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgYSBjb250aWd1b3VzIHNldCBvZiBleGNlcHRpb24gZGF5cy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVQZXJpb2QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JraW5nVGltZXMiIGVUeXBlPSIjLy9Xb3JraW5nVGltZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiB3b3JraW5nIHRpbWVzIHRoYXQgZGVmaW5lIHRoZSB0aW1lIHdvcmtlZCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIHdlZWtkYXkuICBPbmUgb2YgdGhlc2UgbXVzdCBiZSBwcmVzZW50LCBhbmQgdGhlcmUgbWF5IGJlIG5vIG1vcmUgdGhhbiBmaXZlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya2luZ1RpbWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2Vla0RheXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2Vla0RheXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWVrRGF5IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1dlZWtEYXkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHdlZWtkYXkgZWl0aGVyIGRlZmluZXMgcmVndWxhciBkYXlzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB3ZWVrIG9yIGV4Y2VwdGlvbiBkYXlzIGluIHRoZSBjYWxlbmRhci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2Vla0RheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IldlZWtTdGFydERheVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrU3RhcnREYXlfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IldvcmtDb250b3VyVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtDb250b3VyXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3IDgiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iV29ya0Zvcm1hdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrRm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IldvcmtHcm91cFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrR3JvdXBfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtpbmdUaW1lIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtpbmdUaW1lXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZnJvbVRpbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBiZWdpbm5pbmcgb2YgdGhlIHdvcmtpbmcgdGltZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGcm9tVGltZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvVGltZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9UaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVuZCBvZiB0aGUgd29ya2luZyAgdGltZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUb1RpbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JraW5nVGltZXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya2luZ1RpbWVzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya2luZ1RpbWUiIHVwcGVyQm91bmQ9IjUiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JraW5nVGltZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgdGhlIHdvcmtpbmcgdGltZSBkdXJpbmcgdGhlIHdlZWtkYXkuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya2luZ1RpbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMxNjdmZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgTWljcm9zb2Z0IFByb2plY3QgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2UzYjgwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOWJjNmYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MzggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNc3Byb2plY3RBZGFwdGVyRmFjdG9yeS5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MTIga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1zcHJvamVjdEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBNc3Byb2plY3RQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTXNwcm9qZWN0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTXNwcm9qZWN0U3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IE1zcHJvamVjdFN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFzc2lnbm1lbnQoQXNzaWdubWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXNzaWdubWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFzc2lnbm1lbnRzKEFzc2lnbm1lbnRzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBc3NpZ25tZW50c0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUF2YWlsYWJpbGl0eVBlcmlvZChBdmFpbGFiaWxpdHlQZXJpb2Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUF2YWlsYWJpbGl0eVBlcmlvZEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUF2YWlsYWJpbGl0eVBlcmlvZHMoQXZhaWxhYmlsaXR5UGVyaW9kcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXZhaWxhYmlsaXR5UGVyaW9kc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUJhc2VsaW5lKEJhc2VsaW5lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVCYXNlbGluZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUJhc2VsaW5lMihCYXNlbGluZTIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUJhc2VsaW5lMkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUJhc2VsaW5lMyhCYXNlbGluZTMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUJhc2VsaW5lM0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNhbGVuZGFyKENhbGVuZGFyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDYWxlbmRhckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNhbGVuZGFycyhDYWxlbmRhcnMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNhbGVuZGFyc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURvY3VtZW50Um9vdChEb2N1bWVudFJvb3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURvY3VtZW50Um9vdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUV4dGVuZGVkQXR0cmlidXRlKEV4dGVuZGVkQXR0cmlidXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUV4dGVuZGVkQXR0cmlidXRlMihFeHRlbmRlZEF0dHJpYnV0ZTIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlMkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUV4dGVuZGVkQXR0cmlidXRlMyhFeHRlbmRlZEF0dHJpYnV0ZTMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlM0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUV4dGVuZGVkQXR0cmlidXRlNChFeHRlbmRlZEF0dHJpYnV0ZTQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlNEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUV4dGVuZGVkQXR0cmlidXRlcyhFeHRlbmRlZEF0dHJpYnV0ZXMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1hc2soTWFzayBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWFza0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1hc2tzKE1hc2tzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNYXNrc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU91dGxpbmVDb2RlKE91dGxpbmVDb2RlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVPdXRsaW5lQ29kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU91dGxpbmVDb2RlMihPdXRsaW5lQ29kZTIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU91dGxpbmVDb2RlMkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU91dGxpbmVDb2RlMyhPdXRsaW5lQ29kZTMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU91dGxpbmVDb2RlM0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU91dGxpbmVDb2RlcyhPdXRsaW5lQ29kZXMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU91dGxpbmVDb2Rlc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVByZWRlY2Vzc29yTGluayhQcmVkZWNlc3Nvckxpbmsgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByZWRlY2Vzc29yTGlua0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVByb2plY3QoUHJvamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJhdGUoUmF0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmF0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJhdGVzKFJhdGVzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSYXRlc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlKFJlc291cmNlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlcyhSZXNvdXJjZXMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRhc2soVGFzayBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGFza0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRhc2tzKFRhc2tzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUYXNrc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRpbWVQZXJpb2QoVGltZVBlcmlvZCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGltZVBlcmlvZEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRpbWVwaGFzZWREYXRhVHlwZShUaW1lcGhhc2VkRGF0YVR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRpbWVwaGFzZWREYXRhVHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVZhbHVlKFZhbHVlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVWYWx1ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVZhbHVlMihWYWx1ZTIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVZhbHVlMkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVZhbHVlTGlzdChWYWx1ZUxpc3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVZhbHVlTGlzdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVZhbHVlcyhWYWx1ZXMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVZhbHVlc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdCU01hc2soV0JTTWFzayBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV0JTTWFza0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdCU01hc2tzKFdCU01hc2tzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXQlNNYXNrc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdlZWtEYXkoV2Vla0RheSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2Vla0RheUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdlZWtEYXlzKFdlZWtEYXlzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXZWVrRGF5c0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtpbmdUaW1lKFdvcmtpbmdUaW1lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JraW5nVGltZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtpbmdUaW1lcyhXb3JraW5nVGltZXMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtpbmdUaW1lc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQgPGVtPkFzc2lnbm1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFzc2lnbm1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHMgPGVtPkFzc2lnbm1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXNzaWdubWVudHNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUF2YWlsYWJpbGl0eVBlcmlvZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2RzIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZHMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXZhaWxhYmlsaXR5UGVyaW9kc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCYXNlbGluZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIgPGVtPkJhc2VsaW5lMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCYXNlbGluZTJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzIDxlbT5CYXNlbGluZTM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQmFzZWxpbmUzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyIDxlbT5DYWxlbmRhcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhbGVuZGFyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFycyA8ZW0+Q2FsZW5kYXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXJzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhbGVuZGFyc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QgPGVtPkRvY3VtZW50IFJvb3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRG9jdW1lbnRSb290QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGUyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0IDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlNEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXMgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGVzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sgPGVtPk1hc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1hc2tBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza3MgPGVtPk1hc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWFza3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUgPGVtPk91dGxpbmUgQ29kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU91dGxpbmVDb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiA8ZW0+T3V0bGluZSBDb2RlMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRsaW5lQ29kZTJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzIDxlbT5PdXRsaW5lIENvZGUzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU91dGxpbmVDb2RlM0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXMgPGVtPk91dGxpbmUgQ29kZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlT3V0bGluZUNvZGVzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayA8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcmVkZWNlc3NvckxpbmtBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlIDxlbT5SYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVzIDxlbT5SYXRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJhdGVzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlIDxlbT5SZXNvdXJjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlc291cmNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlcyA8ZW0+UmVzb3VyY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlc291cmNlc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzIDxlbT5UYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QgPGVtPlRpbWUgUGVyaW9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUaW1lUGVyaW9kQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSA8ZW0+VGltZXBoYXNlZCBEYXRhIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGltZXBoYXNlZERhdGFUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiA8ZW0+VmFsdWUyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVZhbHVlMkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3QgPGVtPlZhbHVlIExpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVmFsdWVMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlcyA8ZW0+VmFsdWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVZhbHVlc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrIDxlbT5XQlMgTWFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV0JTTWFza0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyA8ZW0+V0JTIE1hc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV0JTTWFza3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSA8ZW0+V2VlayBEYXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlZWtEYXlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXMgPGVtPldlZWsgRGF5czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlZWtEYXlzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lIDxlbT5Xb3JraW5nIFRpbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JraW5nVGltZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXMgPGVtPldvcmtpbmcgVGltZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya2luZ1RpbWVzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL01zcHJvamVjdEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZkMjkyZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0UmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNc3Byb2plY3RSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgRmFjdG9yeTwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QudXRpbC5Nc3Byb2plY3RSZXNvdXJjZUltcGwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1zcHJvamVjdFJlc291cmNlRmFjdG9yeUltcGwgZXh0ZW5kcyBSZXNvdXJjZUZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNc3Byb2plY3RSZXNvdXJjZUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVhNTFJlc291cmNlIHJlc3VsdCA9IG5ldyBNc3Byb2plY3RSZXNvdXJjZUltcGwodXJpKTsKLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fU0NIRU1BX0xPQ0FUSU9OLCBCb29sZWFuLlRSVUUpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0xFWElDQUxfSEFORExFUiwgQm9vbGVhbi5UUlVFKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0gLy9Nc3Byb2plY3RSZXNvdXJjZUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOGMyYmI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNc3Byb2plY3RSZXNvdXJjZUltcGwuamF2YSx2IDEuMiAyMDA2LzA0LzExIDE1OjI5OjU1IGp0aGFyaW8gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSA8L2I+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2FnZS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWwuTXNwcm9qZWN0UmVzb3VyY2VGYWN0b3J5SW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTXNwcm9qZWN0UmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1MUmVzb3VyY2VJbXBsIHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB1cmkgdGhlIFVSSSBvZiB0aGUgbmV3IHJlc291cmNlLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTXNwcm9qZWN0UmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKLQkJc3VwZXIodXJpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MSGVscGVyIGNyZWF0ZVhNTEhlbHBlcigpewotCSAgICByZXR1cm4gbmV3IE1zcHJvamVjdFhNTEhlbHBlckltcGwodGhpcyk7Ci0JfQotfSAvL01zcHJvamVjdFJlc291cmNlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0U3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDNjMzEzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNc3Byb2plY3RTd2l0Y2guamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjEyIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNc3Byb2plY3RTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTXNwcm9qZWN0UGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1zcHJvamVjdFN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlQ6IHsKLQkJCQlBc3NpZ25tZW50IGFzc2lnbm1lbnQgPSAoQXNzaWdubWVudCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXNzaWdubWVudChhc3NpZ25tZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVFM6IHsKLQkJCQlBc3NpZ25tZW50cyBhc3NpZ25tZW50cyA9IChBc3NpZ25tZW50cyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXNzaWdubWVudHMoYXNzaWdubWVudHMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EOiB7Ci0JCQkJQXZhaWxhYmlsaXR5UGVyaW9kIGF2YWlsYWJpbGl0eVBlcmlvZCA9IChBdmFpbGFiaWxpdHlQZXJpb2QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUF2YWlsYWJpbGl0eVBlcmlvZChhdmFpbGFiaWxpdHlQZXJpb2QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EUzogewotCQkJCUF2YWlsYWJpbGl0eVBlcmlvZHMgYXZhaWxhYmlsaXR5UGVyaW9kcyA9IChBdmFpbGFiaWxpdHlQZXJpb2RzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBdmFpbGFiaWxpdHlQZXJpb2RzKGF2YWlsYWJpbGl0eVBlcmlvZHMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTogewotCQkJCUJhc2VsaW5lIGJhc2VsaW5lID0gKEJhc2VsaW5lKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VCYXNlbGluZShiYXNlbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMjogewotCQkJCUJhc2VsaW5lMiBiYXNlbGluZTIgPSAoQmFzZWxpbmUyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VCYXNlbGluZTIoYmFzZWxpbmUyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzOiB7Ci0JCQkJQmFzZWxpbmUzIGJhc2VsaW5lMyA9IChCYXNlbGluZTMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUJhc2VsaW5lMyhiYXNlbGluZTMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUjogewotCQkJCUNhbGVuZGFyIGNhbGVuZGFyID0gKENhbGVuZGFyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDYWxlbmRhcihjYWxlbmRhcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSUzogewotCQkJCUNhbGVuZGFycyBjYWxlbmRhcnMgPSAoQ2FsZW5kYXJzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDYWxlbmRhcnMoY2FsZW5kYXJzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVDogewotCQkJCURvY3VtZW50Um9vdCBkb2N1bWVudFJvb3QgPSAoRG9jdW1lbnRSb290KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEb2N1bWVudFJvb3QoZG9jdW1lbnRSb290KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFOiB7Ci0JCQkJRXh0ZW5kZWRBdHRyaWJ1dGUgZXh0ZW5kZWRBdHRyaWJ1dGUgPSAoRXh0ZW5kZWRBdHRyaWJ1dGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUV4dGVuZGVkQXR0cmlidXRlKGV4dGVuZGVkQXR0cmlidXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMjogewotCQkJCUV4dGVuZGVkQXR0cmlidXRlMiBleHRlbmRlZEF0dHJpYnV0ZTIgPSAoRXh0ZW5kZWRBdHRyaWJ1dGUyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZTIoZXh0ZW5kZWRBdHRyaWJ1dGUyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMzogewotCQkJCUV4dGVuZGVkQXR0cmlidXRlMyBleHRlbmRlZEF0dHJpYnV0ZTMgPSAoRXh0ZW5kZWRBdHRyaWJ1dGUzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZTMoZXh0ZW5kZWRBdHRyaWJ1dGUzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNDogewotCQkJCUV4dGVuZGVkQXR0cmlidXRlNCBleHRlbmRlZEF0dHJpYnV0ZTQgPSAoRXh0ZW5kZWRBdHRyaWJ1dGU0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZTQoZXh0ZW5kZWRBdHRyaWJ1dGU0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFUzogewotCQkJCUV4dGVuZGVkQXR0cmlidXRlcyBleHRlbmRlZEF0dHJpYnV0ZXMgPSAoRXh0ZW5kZWRBdHRyaWJ1dGVzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZXMoZXh0ZW5kZWRBdHRyaWJ1dGVzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTSzogewotCQkJCU1hc2sgbWFzayA9IChNYXNrKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNYXNrKG1hc2spOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLUzogewotCQkJCU1hc2tzIG1hc2tzID0gKE1hc2tzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNYXNrcyhtYXNrcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTogewotCQkJCU91dGxpbmVDb2RlIG91dGxpbmVDb2RlID0gKE91dGxpbmVDb2RlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VPdXRsaW5lQ29kZShvdXRsaW5lQ29kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTI6IHsKLQkJCQlPdXRsaW5lQ29kZTIgb3V0bGluZUNvZGUyID0gKE91dGxpbmVDb2RlMil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlT3V0bGluZUNvZGUyKG91dGxpbmVDb2RlMik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTM6IHsKLQkJCQlPdXRsaW5lQ29kZTMgb3V0bGluZUNvZGUzID0gKE91dGxpbmVDb2RlMyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlT3V0bGluZUNvZGUzKG91dGxpbmVDb2RlMyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERVM6IHsKLQkJCQlPdXRsaW5lQ29kZXMgb3V0bGluZUNvZGVzID0gKE91dGxpbmVDb2Rlcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlT3V0bGluZUNvZGVzKG91dGxpbmVDb2Rlcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTks6IHsKLQkJCQlQcmVkZWNlc3NvckxpbmsgcHJlZGVjZXNzb3JMaW5rID0gKFByZWRlY2Vzc29yTGluayl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJlZGVjZXNzb3JMaW5rKHByZWRlY2Vzc29yTGluayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1Q6IHsKLQkJCQlQcm9qZWN0IHByb2plY3QgPSAoUHJvamVjdCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJvamVjdChwcm9qZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURTogewotCQkJCVJhdGUgcmF0ZSA9IChSYXRlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSYXRlKHJhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFUzogewotCQkJCVJhdGVzIHJhdGVzID0gKFJhdGVzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSYXRlcyhyYXRlcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFOiB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlc291cmNlKHJlc291cmNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTOiB7Ci0JCQkJUmVzb3VyY2VzIHJlc291cmNlcyA9IChSZXNvdXJjZXMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlc291cmNlcyhyZXNvdXJjZXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLOiB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRhc2sodGFzayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tTOiB7Ci0JCQkJVGFza3MgdGFza3MgPSAoVGFza3MpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRhc2tzKHRhc2tzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0Q6IHsKLQkJCQlUaW1lUGVyaW9kIHRpbWVQZXJpb2QgPSAoVGltZVBlcmlvZCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGltZVBlcmlvZCh0aW1lUGVyaW9kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEU6IHsKLQkJCQlUaW1lcGhhc2VkRGF0YVR5cGUgdGltZXBoYXNlZERhdGFUeXBlID0gKFRpbWVwaGFzZWREYXRhVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGltZXBoYXNlZERhdGFUeXBlKHRpbWVwaGFzZWREYXRhVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFOiB7Ci0JCQkJVmFsdWUgdmFsdWUgPSAoVmFsdWUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVZhbHVlKHZhbHVlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyOiB7Ci0JCQkJVmFsdWUyIHZhbHVlMiA9IChWYWx1ZTIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVZhbHVlMih2YWx1ZTIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9MSVNUOiB7Ci0JCQkJVmFsdWVMaXN0IHZhbHVlTGlzdCA9IChWYWx1ZUxpc3QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVZhbHVlTGlzdCh2YWx1ZUxpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVM6IHsKLQkJCQlWYWx1ZXMgdmFsdWVzID0gKFZhbHVlcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVmFsdWVzKHZhbHVlcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLOiB7Ci0JCQkJV0JTTWFzayB3YnNNYXNrID0gKFdCU01hc2spdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdCU01hc2sod2JzTWFzayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLUzogewotCQkJCVdCU01hc2tzIHdic01hc2tzID0gKFdCU01hc2tzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXQlNNYXNrcyh3YnNNYXNrcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZOiB7Ci0JCQkJV2Vla0RheSB3ZWVrRGF5ID0gKFdlZWtEYXkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdlZWtEYXkod2Vla0RheSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZUzogewotCQkJCVdlZWtEYXlzIHdlZWtEYXlzID0gKFdlZWtEYXlzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWVrRGF5cyh3ZWVrRGF5cyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRTogewotCQkJCVdvcmtpbmdUaW1lIHdvcmtpbmdUaW1lID0gKFdvcmtpbmdUaW1lKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXb3JraW5nVGltZSh3b3JraW5nVGltZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRVM6IHsKLQkJCQlXb3JraW5nVGltZXMgd29ya2luZ1RpbWVzID0gKFdvcmtpbmdUaW1lcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV29ya2luZ1RpbWVzKHdvcmtpbmdUaW1lcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFzc2lnbm1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXNzaWdubWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXNzaWdubWVudChBc3NpZ25tZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXNzaWdubWVudHM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXNzaWdubWVudHM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFzc2lnbm1lbnRzKEFzc2lnbm1lbnRzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBdmFpbGFiaWxpdHlQZXJpb2QoQXZhaWxhYmlsaXR5UGVyaW9kIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUF2YWlsYWJpbGl0eVBlcmlvZHMoQXZhaWxhYmlsaXR5UGVyaW9kcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJhc2VsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJhc2VsaW5lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VCYXNlbGluZShCYXNlbGluZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJhc2VsaW5lMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CYXNlbGluZTI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUJhc2VsaW5lMihCYXNlbGluZTIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CYXNlbGluZTM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmFzZWxpbmUzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VCYXNlbGluZTMoQmFzZWxpbmUzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2FsZW5kYXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2FsZW5kYXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNhbGVuZGFyKENhbGVuZGFyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2FsZW5kYXJzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhbGVuZGFyczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ2FsZW5kYXJzKENhbGVuZGFycyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRG9jdW1lbnRSb290KERvY3VtZW50Um9vdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUV4dGVuZGVkQXR0cmlidXRlKEV4dGVuZGVkQXR0cmlidXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZTIoRXh0ZW5kZWRBdHRyaWJ1dGUyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZTMoRXh0ZW5kZWRBdHRyaWJ1dGUzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlNDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZTQoRXh0ZW5kZWRBdHRyaWJ1dGU0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZXMoRXh0ZW5kZWRBdHRyaWJ1dGVzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NYXNrPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNYXNrKE1hc2sgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NYXNrczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NYXNrczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWFza3MoTWFza3Mgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0bGluZSBDb2RlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRsaW5lQ29kZShPdXRsaW5lQ29kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGxpbmUgQ29kZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0bGluZSBDb2RlMjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlT3V0bGluZUNvZGUyKE91dGxpbmVDb2RlMiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGxpbmUgQ29kZTM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0bGluZSBDb2RlMzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlT3V0bGluZUNvZGUzKE91dGxpbmVDb2RlMyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGxpbmUgQ29kZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0bGluZSBDb2RlczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlT3V0bGluZUNvZGVzKE91dGxpbmVDb2RlcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHJlZGVjZXNzb3JMaW5rKFByZWRlY2Vzc29yTGluayBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2plY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHJvamVjdChQcm9qZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SYXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSYXRlKFJhdGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SYXRlczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SYXRlczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUmF0ZXMoUmF0ZXMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2UoUmVzb3VyY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2VzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZXMoUmVzb3VyY2VzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUYXNrKFRhc2sgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVGFza3MoVGFza3Mgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UaW1lIFBlcmlvZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UaW1lIFBlcmlvZDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVGltZVBlcmlvZChUaW1lUGVyaW9kIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGltZXBoYXNlZCBEYXRhIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGltZXBoYXNlZCBEYXRhIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRpbWVwaGFzZWREYXRhVHlwZShUaW1lcGhhc2VkRGF0YVR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVmFsdWUoVmFsdWUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WYWx1ZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFsdWUyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VWYWx1ZTIoVmFsdWUyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFsdWUgTGlzdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WYWx1ZSBMaXN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VWYWx1ZUxpc3QoVmFsdWVMaXN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFsdWVzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlZhbHVlczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVmFsdWVzKFZhbHVlcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldCUyBNYXNrPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldCUyBNYXNrPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXQlNNYXNrKFdCU01hc2sgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XQlMgTWFza3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V0JTIE1hc2tzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXQlNNYXNrcyhXQlNNYXNrcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlZWsgRGF5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlZWsgRGF5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXZWVrRGF5KFdlZWtEYXkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWVrIERheXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2VlayBEYXlzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXZWVrRGF5cyhXZWVrRGF5cyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmtpbmcgVGltZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JraW5nIFRpbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtpbmdUaW1lKFdvcmtpbmdUaW1lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29ya2luZyBUaW1lczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JraW5nVGltZXMoV29ya2luZ1RpbWVzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Nc3Byb2plY3RTd2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1YmE5ZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTgzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTXNwcm9qZWN0VmFsaWRhdG9yLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjoxMiBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLnV0aWwuWE1MVHlwZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3Nvckxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlZhbGlkYXRvcjwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1zcHJvamVjdFZhbGlkYXRvciBleHRlbmRzIEVPYmplY3RWYWxpZGF0b3IgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTXNwcm9qZWN0VmFsaWRhdG9yIElOU1RBTkNFID0gbmV3IE1zcHJvamVjdFZhbGlkYXRvcigpOwotCi0JLyoqCi0JICogQSBjb25zdGFudCBmb3IgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYyNnZXRTb3VyY2UoKSBzb3VyY2V9IG9mIGRpYWdub3N0aWMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljI2dldENvZGUoKSBjb2Rlc30gZnJvbSB0aGlzIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljI2dldFNvdXJjZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYyNnZXRDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR05PU1RJQ19TT1VSQ0UgPSAib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdCI7Ci0KLQkvKioKLQkgKiBBIGNvbnN0YW50IHdpdGggYSBmaXhlZCBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgYXMgdGhlIGJhc2UgdmFsdWUgZm9yIGFkZGl0aW9uYWwgaGFuZCB3cml0dGVuIGNvbnN0YW50cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VORVJBVEVEX0RJQUdOT1NUSUNfQ09ERV9DT1VOVCA9IDA7Ci0KLQkvKioKLQkgKiBBIGNvbnN0YW50IHdpdGggYSBmaXhlZCBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgYXMgdGhlIGJhc2UgdmFsdWUgZm9yIGFkZGl0aW9uYWwgaGFuZCB3cml0dGVuIGNvbnN0YW50cyBpbiBhIGRlcml2ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRElBR05PU1RJQ19DT0RFX0NPVU5UID0gR0VORVJBVEVEX0RJQUdOT1NUSUNfQ09ERV9DT1VOVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgYmFzZSBwYWNrYWdlIHZhbGlkYXRvci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWE1MVHlwZVZhbGlkYXRvciB4bWxUeXBlVmFsaWRhdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNc3Byb2plY3RWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JCXhtbFR5cGVWYWxpZGF0b3IgPSBYTUxUeXBlVmFsaWRhdG9yLklOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugb2YgdGhpcyB2YWxpZGF0b3Igc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUGFja2FnZSBnZXRFUGFja2FnZSgpIHsKLQkgIHJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT52YWxpZGF0ZVhYWDwvY29kZT4gZm9yIHRoZSBjb3JyZXNvbmRpbmcgY2xhc3NpZmllciBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUoaW50IGNsYXNzaWZpZXJJRCwgT2JqZWN0IHZhbHVlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVBc3NpZ25tZW50KChBc3NpZ25tZW50KXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVFM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQXNzaWdubWVudHMoKEFzc2lnbm1lbnRzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVBdmFpbGFiaWxpdHlQZXJpb2QoKEF2YWlsYWJpbGl0eVBlcmlvZCl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RTOgotCQkJCXJldHVybiB2YWxpZGF0ZUF2YWlsYWJpbGl0eVBlcmlvZHMoKEF2YWlsYWJpbGl0eVBlcmlvZHMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORToKLQkJCQlyZXR1cm4gdmFsaWRhdGVCYXNlbGluZSgoQmFzZWxpbmUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTI6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQmFzZWxpbmUyKChCYXNlbGluZTIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQmFzZWxpbmUzKChCYXNlbGluZTMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVDYWxlbmRhcigoQ2FsZW5kYXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUlM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ2FsZW5kYXJzKChDYWxlbmRhcnMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UOgotCQkJCXJldHVybiB2YWxpZGF0ZURvY3VtZW50Um9vdCgoRG9jdW1lbnRSb290KXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiB2YWxpZGF0ZUV4dGVuZGVkQXR0cmlidXRlKChFeHRlbmRlZEF0dHJpYnV0ZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTI6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRXh0ZW5kZWRBdHRyaWJ1dGUyKChFeHRlbmRlZEF0dHJpYnV0ZTIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzOgotCQkJCXJldHVybiB2YWxpZGF0ZUV4dGVuZGVkQXR0cmlidXRlMygoRXh0ZW5kZWRBdHRyaWJ1dGUzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVFeHRlbmRlZEF0dHJpYnV0ZTQoKEV4dGVuZGVkQXR0cmlidXRlNCl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRXh0ZW5kZWRBdHRyaWJ1dGVzKChFeHRlbmRlZEF0dHJpYnV0ZXMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLOgotCQkJCXJldHVybiB2YWxpZGF0ZU1hc2soKE1hc2spdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVNYXNrcygoTWFza3MpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlT3V0bGluZUNvZGUoKE91dGxpbmVDb2RlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVPdXRsaW5lQ29kZTIoKE91dGxpbmVDb2RlMil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlT3V0bGluZUNvZGUzKChPdXRsaW5lQ29kZTMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVTOgotCQkJCXJldHVybiB2YWxpZGF0ZU91dGxpbmVDb2RlcygoT3V0bGluZUNvZGVzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOSzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVQcmVkZWNlc3NvckxpbmsoKFByZWRlY2Vzc29yTGluayl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1Q6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUHJvamVjdCgoUHJvamVjdCl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUmF0ZSgoUmF0ZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVTOgotCQkJCXJldHVybiB2YWxpZGF0ZVJhdGVzKChSYXRlcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFOgotCQkJCXJldHVybiB2YWxpZGF0ZVJlc291cmNlKChSZXNvdXJjZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVSZXNvdXJjZXMoKFJlc291cmNlcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0s6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVGFzaygoVGFzayl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tTOgotCQkJCXJldHVybiB2YWxpZGF0ZVRhc2tzKChUYXNrcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EOgotCQkJCXJldHVybiB2YWxpZGF0ZVRpbWVQZXJpb2QoKFRpbWVQZXJpb2QpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVUaW1lcGhhc2VkRGF0YVR5cGUoKFRpbWVwaGFzZWREYXRhVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFOgotCQkJCXJldHVybiB2YWxpZGF0ZVZhbHVlKChWYWx1ZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVWYWx1ZTIoKFZhbHVlMil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX0xJU1Q6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVmFsdWVMaXN0KChWYWx1ZUxpc3QpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVmFsdWVzKChWYWx1ZXMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTSzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVXQlNNYXNrKChXQlNNYXNrKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTOgotCQkJCXJldHVybiB2YWxpZGF0ZVdCU01hc2tzKChXQlNNYXNrcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZOgotCQkJCXJldHVybiB2YWxpZGF0ZVdlZWtEYXkoKFdlZWtEYXkpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWVM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV2Vla0RheXMoKFdlZWtEYXlzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FOgotCQkJCXJldHVybiB2YWxpZGF0ZVdvcmtpbmdUaW1lKChXb3JraW5nVGltZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRVM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV29ya2luZ1RpbWVzKChXb3JraW5nVGltZXMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BQ0NSVUVfQVQ6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQWNjcnVlQXQoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BQ1RJVkVfRElSRUNUT1JZX0dVSURfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQUxJQVNfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVBbGlhc1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFVVEhPUl9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUF1dGhvclR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJPT0tJTkdfVFlQRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUJvb2tpbmdUeXBlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJPT0tJTkdfVFlQRV9UWVBFMToKLQkJCQlyZXR1cm4gdmFsaWRhdGVCb29raW5nVHlwZVR5cGUxKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMQ1VMQVRJT05fVFlQRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUNhbGN1bGF0aW9uVHlwZVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQVRFR09SWV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUNhdGVnb3J5VHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09ERV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUNvZGVUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT01QQU5ZX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ29tcGFueVR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPTlNUUkFJTlRfVFlQRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUNvbnN0cmFpbnRUeXBlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPTlRBQ1RfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVDb250YWN0VHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09TVF9SQVRFX1RBQkxFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ29zdFJhdGVUYWJsZVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNVUlJFTkNZX1NZTUJPTF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUN1cnJlbmN5U3ltYm9sVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuREFZX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVEYXlUeXBlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuREVGQVVMVF9UQVNLX0VWX01FVEhPRF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZURlZmF1bHRUYXNrRVZNZXRob2RUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuREVGQVVMVF9UQVNLX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVEZWZhdWx0VGFza1R5cGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTEoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRTI6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMigoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUzKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEU0OgotCQkJCXJldHVybiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTQoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRTU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlNSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FQVJORURfVkFMVUVfTUVUSE9EX1RZUEUxOgotCQkJCXJldHVybiB2YWxpZGF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZTEoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FTUFJTF9BRERSRVNTX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRW1haWxBZGRyZXNzVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURVJOQUxfVEFTS19QUk9KRUNUX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUZpeGVkQ29zdEFjY3J1YWxUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5GWV9TVEFSVF9EQVRFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRllTdGFydERhdGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuR1JPVVBfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVHcm91cFR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19BRERSRVNTX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19BRERSRVNTX1RZUEUxOgotCQkJCXJldHVybiB2YWxpZGF0ZUh5cGVybGlua0FkZHJlc3NUeXBlMSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRTI6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUyKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1NVQl9BRERSRVNTX1RZUEUxOgotCQkJCXJldHVybiB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1NVQl9BRERSRVNTX1RZUEUyOgotCQkJCXJldHVybiB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlMigoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSHlwZXJsaW5rVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1RZUEUxOgotCQkJCXJldHVybiB2YWxpZGF0ZUh5cGVybGlua1R5cGUxKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRTI6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSHlwZXJsaW5rVHlwZTIoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLklOSVRJQUxTX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSW5pdGlhbHNUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5MQUdfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTGFnRm9ybWF0VHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkxFVkVMSU5HX0RFTEFZX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiB2YWxpZGF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BTkFHRVJfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVNYW5hZ2VyVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFURVJJQUxfTEFCRUxfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVNYXRlcmlhbExhYmVsVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZU5hbWVUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEUxOgotCQkJCXJldHVybiB2YWxpZGF0ZU5hbWVUeXBlMSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVOYW1lVHlwZTIoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5BTUVfVFlQRTM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTmFtZVR5cGUzKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ORVdfVEFTS19TVEFSVF9EQVRFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTmV3VGFza1N0YXJ0RGF0ZVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OVF9BQ0NPVU5UX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTlRBY2NvdW50VHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9OVU1CRVJfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVPdXRsaW5lTnVtYmVyVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QSE9ORVRJQ19BTElBU19UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVBob25ldGljQWxpYXNUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QSE9ORVRJQ1NfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVQaG9uZXRpY3NUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVGSVhfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVQcmVmaXhUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX1RBQkxFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUmF0ZVRhYmxlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJPTExVUF9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUm9sbHVwVHlwZVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5TVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5TVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFMToKLQkJCQlyZXR1cm4gdmFsaWRhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNVQkpFQ1RfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVTdWJqZWN0VHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuU1VCUFJPSkVDVF9OQU1FX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlU3VicHJvamVjdE5hbWVUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USVRMRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVRpdGxlVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVR5cGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFMToKLQkJCQlyZXR1cm4gdmFsaWRhdGVUeXBlVHlwZTEoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEUyOgotCQkJCXJldHVybiB2YWxpZGF0ZVR5cGVUeXBlMigoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVHlwZVR5cGUzKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFNDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVUeXBlVHlwZTQoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEU1OgotCQkJCXJldHVybiB2YWxpZGF0ZVR5cGVUeXBlNSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlVJRF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVVJRFR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlVOSVRfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVVbml0VHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFTElTVF9TT1JUX09SREVSX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVmFsdWVsaXN0U29ydE9yZGVyVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfU1RBUlRfREFZX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV2Vla1N0YXJ0RGF5VHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktfQ09OVE9VUl9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVdvcmtDb250b3VyVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV29ya0Zvcm1hdFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLX0dST1VQX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV29ya0dyb3VwVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJZGVmYXVsdDogCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFzc2lnbm1lbnQoQXNzaWdubWVudCBhc3NpZ25tZW50LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGFzc2lnbm1lbnQsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFzc2lnbm1lbnRzKEFzc2lnbm1lbnRzIGFzc2lnbm1lbnRzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGFzc2lnbm1lbnRzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBdmFpbGFiaWxpdHlQZXJpb2QoQXZhaWxhYmlsaXR5UGVyaW9kIGF2YWlsYWJpbGl0eVBlcmlvZCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChhdmFpbGFiaWxpdHlQZXJpb2QsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUF2YWlsYWJpbGl0eVBlcmlvZHMoQXZhaWxhYmlsaXR5UGVyaW9kcyBhdmFpbGFiaWxpdHlQZXJpb2RzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGF2YWlsYWJpbGl0eVBlcmlvZHMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUJhc2VsaW5lKEJhc2VsaW5lIGJhc2VsaW5lLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGJhc2VsaW5lLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCYXNlbGluZTIoQmFzZWxpbmUyIGJhc2VsaW5lMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChiYXNlbGluZTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUJhc2VsaW5lMyhCYXNlbGluZTMgYmFzZWxpbmUzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGJhc2VsaW5lMywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ2FsZW5kYXIoQ2FsZW5kYXIgY2FsZW5kYXIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoY2FsZW5kYXIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNhbGVuZGFycyhDYWxlbmRhcnMgY2FsZW5kYXJzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGNhbGVuZGFycywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRG9jdW1lbnRSb290KERvY3VtZW50Um9vdCBkb2N1bWVudFJvb3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoZG9jdW1lbnRSb290LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFeHRlbmRlZEF0dHJpYnV0ZShFeHRlbmRlZEF0dHJpYnV0ZSBleHRlbmRlZEF0dHJpYnV0ZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChleHRlbmRlZEF0dHJpYnV0ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRXh0ZW5kZWRBdHRyaWJ1dGUyKEV4dGVuZGVkQXR0cmlidXRlMiBleHRlbmRlZEF0dHJpYnV0ZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoZXh0ZW5kZWRBdHRyaWJ1dGUyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFeHRlbmRlZEF0dHJpYnV0ZTMoRXh0ZW5kZWRBdHRyaWJ1dGUzIGV4dGVuZGVkQXR0cmlidXRlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChleHRlbmRlZEF0dHJpYnV0ZTMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUV4dGVuZGVkQXR0cmlidXRlNChFeHRlbmRlZEF0dHJpYnV0ZTQgZXh0ZW5kZWRBdHRyaWJ1dGU0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGV4dGVuZGVkQXR0cmlidXRlNCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRXh0ZW5kZWRBdHRyaWJ1dGVzKEV4dGVuZGVkQXR0cmlidXRlcyBleHRlbmRlZEF0dHJpYnV0ZXMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoZXh0ZW5kZWRBdHRyaWJ1dGVzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNYXNrKE1hc2sgbWFzaywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChtYXNrLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNYXNrcyhNYXNrcyBtYXNrcywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChtYXNrcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlT3V0bGluZUNvZGUoT3V0bGluZUNvZGUgb3V0bGluZUNvZGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQob3V0bGluZUNvZGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU91dGxpbmVDb2RlMihPdXRsaW5lQ29kZTIgb3V0bGluZUNvZGUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KG91dGxpbmVDb2RlMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlT3V0bGluZUNvZGUzKE91dGxpbmVDb2RlMyBvdXRsaW5lQ29kZTMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQob3V0bGluZUNvZGUzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPdXRsaW5lQ29kZXMoT3V0bGluZUNvZGVzIG91dGxpbmVDb2RlcywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChvdXRsaW5lQ29kZXMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVByZWRlY2Vzc29yTGluayhQcmVkZWNlc3NvckxpbmsgcHJlZGVjZXNzb3JMaW5rLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHByZWRlY2Vzc29yTGluaywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUHJvamVjdChQcm9qZWN0IHByb2plY3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQocHJvamVjdCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUmF0ZShSYXRlIHJhdGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQocmF0ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUmF0ZXMoUmF0ZXMgcmF0ZXMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQocmF0ZXMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJlc291cmNlKFJlc291cmNlIHJlc291cmNlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHJlc291cmNlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSZXNvdXJjZXMoUmVzb3VyY2VzIHJlc291cmNlcywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChyZXNvdXJjZXMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVRhc2soVGFzayB0YXNrLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHRhc2ssIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVRhc2tzKFRhc2tzIHRhc2tzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHRhc2tzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUaW1lUGVyaW9kKFRpbWVQZXJpb2QgdGltZVBlcmlvZCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh0aW1lUGVyaW9kLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUaW1lcGhhc2VkRGF0YVR5cGUoVGltZXBoYXNlZERhdGFUeXBlIHRpbWVwaGFzZWREYXRhVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh0aW1lcGhhc2VkRGF0YVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVZhbHVlKFZhbHVlIHZhbHVlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZTIoVmFsdWUyIHZhbHVlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh2YWx1ZTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVZhbHVlTGlzdChWYWx1ZUxpc3QgdmFsdWVMaXN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHZhbHVlTGlzdCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVmFsdWVzKFZhbHVlcyB2YWx1ZXMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQodmFsdWVzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXQlNNYXNrKFdCU01hc2sgd2JzTWFzaywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh3YnNNYXNrLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXQlNNYXNrcyhXQlNNYXNrcyB3YnNNYXNrcywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh3YnNNYXNrcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV2Vla0RheShXZWVrRGF5IHdlZWtEYXksIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQod2Vla0RheSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV2Vla0RheXMoV2Vla0RheXMgd2Vla0RheXMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQod2Vla0RheXMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdvcmtpbmdUaW1lKFdvcmtpbmdUaW1lIHdvcmtpbmdUaW1lLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHdvcmtpbmdUaW1lLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXb3JraW5nVGltZXMoV29ya2luZ1RpbWVzIHdvcmtpbmdUaW1lcywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh3b3JraW5nVGltZXMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFjY3J1ZUF0KEJpZ0ludGVnZXIgYWNjcnVlQXQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUFjY3J1ZUF0X0VudW1lcmF0aW9uKGFjY3J1ZUF0LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVBY2NydWVBdF9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBBQ0NSVUVfQVRfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5BY2NydWUgQXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBY2NydWVBdF9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGFjY3J1ZUF0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gQUNDUlVFX0FUX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGFjY3J1ZUF0KTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY2NydWVBdCgpLCBhY2NydWVBdCwgQUNDUlVFX0FUX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUoU3RyaW5nIGFjdGl2ZURpcmVjdG9yeUdVSURUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZV9NYXhMZW5ndGgoYWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+QWN0aXZlIERpcmVjdG9yeSBHVUlEIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZV9NYXhMZW5ndGgoU3RyaW5nIGFjdGl2ZURpcmVjdG9yeUdVSURUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBhY3RpdmVEaXJlY3RvcnlHVUlEVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSAxNjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUoKSwgYWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUsIGxlbmd0aCwgMTYsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFsaWFzVHlwZShTdHJpbmcgYWxpYXNUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVBbGlhc1R5cGVfTWF4TGVuZ3RoKGFsaWFzVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5BbGlhcyBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQWxpYXNUeXBlX01heExlbmd0aChTdHJpbmcgYWxpYXNUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBhbGlhc1R5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTA7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEFsaWFzVHlwZSgpLCBhbGlhc1R5cGUsIGxlbmd0aCwgNTAsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUF1dGhvclR5cGUoU3RyaW5nIGF1dGhvclR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUF1dGhvclR5cGVfTWF4TGVuZ3RoKGF1dGhvclR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+QXV0aG9yIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBdXRob3JUeXBlX01heExlbmd0aChTdHJpbmcgYXV0aG9yVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gYXV0aG9yVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhvclR5cGUoKSwgYXV0aG9yVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlKEJpZ0ludGVnZXIgYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlX0VudW1lcmF0aW9uKGJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBCQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTAiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+QmFzZWxpbmUgRm9yIEVhcm5lZCBWYWx1ZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBiYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IEJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhiYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUoKSwgYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUsIEJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUJvb2tpbmdUeXBlVHlwZShCaWdJbnRlZ2VyIGJvb2tpbmdUeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQm9va2luZ1R5cGVUeXBlX0VudW1lcmF0aW9uKGJvb2tpbmdUeXBlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlQm9va2luZ1R5cGVUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEJPT0tJTkdfVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+Qm9va2luZyBUeXBlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCb29raW5nVHlwZVR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBib29raW5nVHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBCT09LSU5HX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhib29raW5nVHlwZVR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEJvb2tpbmdUeXBlVHlwZSgpLCBib29raW5nVHlwZVR5cGUsIEJPT0tJTkdfVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQm9va2luZ1R5cGVUeXBlMShCaWdJbnRlZ2VyIGJvb2tpbmdUeXBlVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUJvb2tpbmdUeXBlVHlwZTFfRW51bWVyYXRpb24oYm9va2luZ1R5cGVUeXBlMSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlQm9va2luZ1R5cGVUeXBlMV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBCT09LSU5HX1RZUEVfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Cb29raW5nIFR5cGUgVHlwZTE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCb29raW5nVHlwZVR5cGUxX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgYm9va2luZ1R5cGVUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IEJPT0tJTkdfVFlQRV9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhib29raW5nVHlwZVR5cGUxKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRCb29raW5nVHlwZVR5cGUxKCksIGJvb2tpbmdUeXBlVHlwZTEsIEJPT0tJTkdfVFlQRV9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNhbGN1bGF0aW9uVHlwZVR5cGUoQmlnSW50ZWdlciBjYWxjdWxhdGlvblR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVDYWxjdWxhdGlvblR5cGVUeXBlX0VudW1lcmF0aW9uKGNhbGN1bGF0aW9uVHlwZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUNhbGN1bGF0aW9uVHlwZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gQ0FMQ1VMQVRJT05fVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+Q2FsY3VsYXRpb24gVHlwZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ2FsY3VsYXRpb25UeXBlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGNhbGN1bGF0aW9uVHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBDQUxDVUxBVElPTl9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoY2FsY3VsYXRpb25UeXBlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FsY3VsYXRpb25UeXBlVHlwZSgpLCBjYWxjdWxhdGlvblR5cGVUeXBlLCBDQUxDVUxBVElPTl9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDYXRlZ29yeVR5cGUoU3RyaW5nIGNhdGVnb3J5VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQ2F0ZWdvcnlUeXBlX01heExlbmd0aChjYXRlZ29yeVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+Q2F0ZWdvcnkgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNhdGVnb3J5VHlwZV9NYXhMZW5ndGgoU3RyaW5nIGNhdGVnb3J5VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gY2F0ZWdvcnlUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2F0ZWdvcnlUeXBlKCksIGNhdGVnb3J5VHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvZGVUeXBlKFN0cmluZyBjb2RlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQ29kZVR5cGVfTWF4TGVuZ3RoKGNvZGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkNvZGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvZGVUeXBlX01heExlbmd0aChTdHJpbmcgY29kZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGNvZGVUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29kZVR5cGUoKSwgY29kZVR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDb21wYW55VHlwZShTdHJpbmcgY29tcGFueVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUNvbXBhbnlUeXBlX01heExlbmd0aChjb21wYW55VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5Db21wYW55IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDb21wYW55VHlwZV9NYXhMZW5ndGgoU3RyaW5nIGNvbXBhbnlUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBjb21wYW55VHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBhbnlUeXBlKCksIGNvbXBhbnlUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ29uc3RyYWludFR5cGVUeXBlKEJpZ0ludGVnZXIgY29uc3RyYWludFR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVDb25zdHJhaW50VHlwZVR5cGVfRW51bWVyYXRpb24oY29uc3RyYWludFR5cGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVDb25zdHJhaW50VHlwZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gQ09OU1RSQUlOVF9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Db25zdHJhaW50IFR5cGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvbnN0cmFpbnRUeXBlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGNvbnN0cmFpbnRUeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IENPTlNUUkFJTlRfVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGNvbnN0cmFpbnRUeXBlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uc3RyYWludFR5cGVUeXBlKCksIGNvbnN0cmFpbnRUeXBlVHlwZSwgQ09OU1RSQUlOVF9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDb250YWN0VHlwZShTdHJpbmcgY29udGFjdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUNvbnRhY3RUeXBlX01heExlbmd0aChjb250YWN0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5Db250YWN0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDb250YWN0VHlwZV9NYXhMZW5ndGgoU3RyaW5nIGNvbnRhY3RUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBjb250YWN0VHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRhY3RUeXBlKCksIGNvbnRhY3RUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ29zdFJhdGVUYWJsZVR5cGUoQmlnSW50ZWdlciBjb3N0UmF0ZVRhYmxlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQ29zdFJhdGVUYWJsZVR5cGVfRW51bWVyYXRpb24oY29zdFJhdGVUYWJsZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUNvc3RSYXRlVGFibGVUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIENPU1RfUkFURV9UQUJMRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+Q29zdCBSYXRlIFRhYmxlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDb3N0UmF0ZVRhYmxlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGNvc3RSYXRlVGFibGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gQ09TVF9SQVRFX1RBQkxFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoY29zdFJhdGVUYWJsZVR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldENvc3RSYXRlVGFibGVUeXBlKCksIGNvc3RSYXRlVGFibGVUeXBlLCBDT1NUX1JBVEVfVEFCTEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlKEJpZ0ludGVnZXIgY3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlX0VudW1lcmF0aW9uKGN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbiBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBjdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IENVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSgpLCBjdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSwgQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDdXJyZW5jeVN5bWJvbFR5cGUoU3RyaW5nIGN1cnJlbmN5U3ltYm9sVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQ3VycmVuY3lTeW1ib2xUeXBlX01heExlbmd0aChjdXJyZW5jeVN5bWJvbFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+Q3VycmVuY3kgU3ltYm9sIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDdXJyZW5jeVN5bWJvbFR5cGVfTWF4TGVuZ3RoKFN0cmluZyBjdXJyZW5jeVN5bWJvbFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGN1cnJlbmN5U3ltYm9sVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSAyMDsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VycmVuY3lTeW1ib2xUeXBlKCksIGN1cnJlbmN5U3ltYm9sVHlwZSwgbGVuZ3RoLCAyMCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRGF5VHlwZVR5cGUoQmlnSW50ZWdlciBkYXlUeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRGF5VHlwZVR5cGVfRW51bWVyYXRpb24oZGF5VHlwZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZURheVR5cGVUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIERBWV9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5EYXkgVHlwZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRGF5VHlwZVR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBkYXlUeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IERBWV9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZGF5VHlwZVR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldERheVR5cGVUeXBlKCksIGRheVR5cGVUeXBlLCBEQVlfVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlKEJpZ0ludGVnZXIgZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGVfRW51bWVyYXRpb24oZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGRlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlKCksIGRlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSwgREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURlZmF1bHRUYXNrRVZNZXRob2RUeXBlKEJpZ0ludGVnZXIgZGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZURlZmF1bHRUYXNrRVZNZXRob2RUeXBlX0VudW1lcmF0aW9uKGRlZmF1bHRUYXNrRVZNZXRob2RUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVEZWZhdWx0VGFza0VWTWV0aG9kVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBERUZBVUxUX1RBU0tfRVZfTUVUSE9EX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEZWZhdWx0VGFza0VWTWV0aG9kVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGRlZmF1bHRUYXNrRVZNZXRob2RUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gREVGQVVMVF9UQVNLX0VWX01FVEhPRF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGRlZmF1bHRUYXNrRVZNZXRob2RUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWZhdWx0VGFza0VWTWV0aG9kVHlwZSgpLCBkZWZhdWx0VGFza0VWTWV0aG9kVHlwZSwgREVGQVVMVF9UQVNLX0VWX01FVEhPRF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRGVmYXVsdFRhc2tUeXBlVHlwZShCaWdJbnRlZ2VyIGRlZmF1bHRUYXNrVHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZURlZmF1bHRUYXNrVHlwZVR5cGVfRW51bWVyYXRpb24oZGVmYXVsdFRhc2tUeXBlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRGVmYXVsdFRhc2tUeXBlVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBERUZBVUxUX1RBU0tfVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+RGVmYXVsdCBUYXNrIFR5cGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURlZmF1bHRUYXNrVHlwZVR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBkZWZhdWx0VGFza1R5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gREVGQVVMVF9UQVNLX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhkZWZhdWx0VGFza1R5cGVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWZhdWx0VGFza1R5cGVUeXBlKCksIGRlZmF1bHRUYXNrVHlwZVR5cGUsIERFRkFVTFRfVEFTS19UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUoQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZV9FbnVtZXJhdGlvbihkdXJhdGlvbkZvcm1hdFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBEVVJBVElPTl9GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0NCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IERVUkFUSU9OX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGR1cmF0aW9uRm9ybWF0VHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RHVyYXRpb25Gb3JtYXRUeXBlKCksIGR1cmF0aW9uRm9ybWF0VHlwZSwgRFVSQVRJT05fRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUxKEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXRUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMV9FbnVtZXJhdGlvbihkdXJhdGlvbkZvcm1hdFR5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUxX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIERVUkFUSU9OX0ZPUk1BVF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0NCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUxX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXRUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IERVUkFUSU9OX0ZPUk1BVF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhkdXJhdGlvbkZvcm1hdFR5cGUxKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREdXJhdGlvbkZvcm1hdFR5cGUxKCksIGR1cmF0aW9uRm9ybWF0VHlwZTEsIERVUkFUSU9OX0ZPUk1BVF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTIoQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUyX0VudW1lcmF0aW9uKGR1cmF0aW9uRm9ybWF0VHlwZTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTJfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gRFVSQVRJT05fRk9STUFUX1RZUEUyX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTJfRW51bWVyYXRpb24oQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gRFVSQVRJT05fRk9STUFUX1RZUEUyX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGR1cmF0aW9uRm9ybWF0VHlwZTIpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldER1cmF0aW9uRm9ybWF0VHlwZTIoKSwgZHVyYXRpb25Gb3JtYXRUeXBlMiwgRFVSQVRJT05fRk9STUFUX1RZUEUyX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMyhCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZTMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTNfRW51bWVyYXRpb24oZHVyYXRpb25Gb3JtYXRUeXBlMywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlM19FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBEVVJBVElPTl9GT1JNQVRfVFlQRTNfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjExIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlM19FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZTMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBEVVJBVElPTl9GT1JNQVRfVFlQRTNfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZHVyYXRpb25Gb3JtYXRUeXBlMyk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMygpLCBkdXJhdGlvbkZvcm1hdFR5cGUzLCBEVVJBVElPTl9GT1JNQVRfVFlQRTNfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGU0KEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXRUeXBlNCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlNF9FbnVtZXJhdGlvbihkdXJhdGlvbkZvcm1hdFR5cGU0LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGU0X0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIERVUkFUSU9OX0ZPUk1BVF9UWVBFNF9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0NCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGU0X0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXRUeXBlNCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IERVUkFUSU9OX0ZPUk1BVF9UWVBFNF9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhkdXJhdGlvbkZvcm1hdFR5cGU0KTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREdXJhdGlvbkZvcm1hdFR5cGU0KCksIGR1cmF0aW9uRm9ybWF0VHlwZTQsIERVUkFUSU9OX0ZPUk1BVF9UWVBFNF9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTUoQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGU1LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGU1X0VudW1lcmF0aW9uKGR1cmF0aW9uRm9ybWF0VHlwZTUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gRFVSQVRJT05fRk9STUFUX1RZUEU1X19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlNTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGU1LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gRFVSQVRJT05fRk9STUFUX1RZUEU1X19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGR1cmF0aW9uRm9ybWF0VHlwZTUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldER1cmF0aW9uRm9ybWF0VHlwZTUoKSwgZHVyYXRpb25Gb3JtYXRUeXBlNSwgRFVSQVRJT05fRk9STUFUX1RZUEU1X19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlKEJpZ0ludGVnZXIgZWFybmVkVmFsdWVNZXRob2RUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGVfRW51bWVyYXRpb24oZWFybmVkVmFsdWVNZXRob2RUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgZWFybmVkVmFsdWVNZXRob2RUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGVhcm5lZFZhbHVlTWV0aG9kVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWFybmVkVmFsdWVNZXRob2RUeXBlKCksIGVhcm5lZFZhbHVlTWV0aG9kVHlwZSwgRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlMShCaWdJbnRlZ2VyIGVhcm5lZFZhbHVlTWV0aG9kVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZTFfRW51bWVyYXRpb24oZWFybmVkVmFsdWVNZXRob2RUeXBlMSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlMV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBFQVJORURfVkFMVUVfTUVUSE9EX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZCBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZTFfRW51bWVyYXRpb24oQmlnSW50ZWdlciBlYXJuZWRWYWx1ZU1ldGhvZFR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhlYXJuZWRWYWx1ZU1ldGhvZFR5cGUxKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxKCksIGVhcm5lZFZhbHVlTWV0aG9kVHlwZTEsIEVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFbWFpbEFkZHJlc3NUeXBlKFN0cmluZyBlbWFpbEFkZHJlc3NUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVFbWFpbEFkZHJlc3NUeXBlX01heExlbmd0aChlbWFpbEFkZHJlc3NUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkVtYWlsIEFkZHJlc3MgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVtYWlsQWRkcmVzc1R5cGVfTWF4TGVuZ3RoKFN0cmluZyBlbWFpbEFkZHJlc3NUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBlbWFpbEFkZHJlc3NUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW1haWxBZGRyZXNzVHlwZSgpLCBlbWFpbEFkZHJlc3NUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUoU3RyaW5nIGV4dGVybmFsVGFza1Byb2plY3RUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZV9NYXhMZW5ndGgoZXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZV9NYXhMZW5ndGgoU3RyaW5nIGV4dGVybmFsVGFza1Byb2plY3RUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBleHRlcm5hbFRhc2tQcm9qZWN0VHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4dGVybmFsVGFza1Byb2plY3RUeXBlKCksIGV4dGVybmFsVGFza1Byb2plY3RUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRml4ZWRDb3N0QWNjcnVhbFR5cGUoU3RyaW5nIGZpeGVkQ29zdEFjY3J1YWxUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVGaXhlZENvc3RBY2NydWFsVHlwZV9FbnVtZXJhdGlvbihmaXhlZENvc3RBY2NydWFsVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRml4ZWRDb3N0QWNjcnVhbFR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gRklYRURfQ09TVF9BQ0NSVUFMX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSAiMSIsCi0JCQkJICIyIiwKLQkJCQkgIjMiCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5GaXhlZCBDb3N0IEFjY3J1YWwgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUZpeGVkQ29zdEFjY3J1YWxUeXBlX0VudW1lcmF0aW9uKFN0cmluZyBmaXhlZENvc3RBY2NydWFsVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IEZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGZpeGVkQ29zdEFjY3J1YWxUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRGaXhlZENvc3RBY2NydWFsVHlwZSgpLCBmaXhlZENvc3RBY2NydWFsVHlwZSwgRklYRURfQ09TVF9BQ0NSVUFMX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVGWVN0YXJ0RGF0ZVR5cGUoQmlnSW50ZWdlciBmeVN0YXJ0RGF0ZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUZZU3RhcnREYXRlVHlwZV9FbnVtZXJhdGlvbihmeVN0YXJ0RGF0ZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUZZU3RhcnREYXRlVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBGWV9TVEFSVF9EQVRFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjExIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMiIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5GWSBTdGFydCBEYXRlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVGWVN0YXJ0RGF0ZVR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBmeVN0YXJ0RGF0ZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBGWV9TVEFSVF9EQVRFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZnlTdGFydERhdGVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRGWVN0YXJ0RGF0ZVR5cGUoKSwgZnlTdGFydERhdGVUeXBlLCBGWV9TVEFSVF9EQVRFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVHcm91cFR5cGUoU3RyaW5nIGdyb3VwVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlR3JvdXBUeXBlX01heExlbmd0aChncm91cFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+R3JvdXAgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUdyb3VwVHlwZV9NYXhMZW5ndGgoU3RyaW5nIGdyb3VwVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gZ3JvdXBUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3JvdXBUeXBlKCksIGdyb3VwVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua0FkZHJlc3NUeXBlKFN0cmluZyBoeXBlcmxpbmtBZGRyZXNzVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGVfTWF4TGVuZ3RoKGh5cGVybGlua0FkZHJlc3NUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkh5cGVybGluayBBZGRyZXNzIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZV9NYXhMZW5ndGgoU3RyaW5nIGh5cGVybGlua0FkZHJlc3NUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBoeXBlcmxpbmtBZGRyZXNzVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEh5cGVybGlua0FkZHJlc3NUeXBlKCksIGh5cGVybGlua0FkZHJlc3NUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUxKFN0cmluZyBoeXBlcmxpbmtBZGRyZXNzVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUh5cGVybGlua0FkZHJlc3NUeXBlMV9NYXhMZW5ndGgoaHlwZXJsaW5rQWRkcmVzc1R5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkh5cGVybGluayBBZGRyZXNzIFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUxX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rQWRkcmVzc1R5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBoeXBlcmxpbmtBZGRyZXNzVHlwZTEubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRIeXBlcmxpbmtBZGRyZXNzVHlwZTEoKSwgaHlwZXJsaW5rQWRkcmVzc1R5cGUxLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUyKFN0cmluZyBoeXBlcmxpbmtBZGRyZXNzVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUh5cGVybGlua0FkZHJlc3NUeXBlMl9NYXhMZW5ndGgoaHlwZXJsaW5rQWRkcmVzc1R5cGUyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkh5cGVybGluayBBZGRyZXNzIFR5cGUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUyX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rQWRkcmVzc1R5cGUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBoeXBlcmxpbmtBZGRyZXNzVHlwZTIubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRIeXBlcmxpbmtBZGRyZXNzVHlwZTIoKSwgaHlwZXJsaW5rQWRkcmVzc1R5cGUyLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUoU3RyaW5nIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZV9NYXhMZW5ndGgoaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZV9NYXhMZW5ndGgoU3RyaW5nIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlKCksIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxKFN0cmluZyBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlMV9NYXhMZW5ndGgoaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlMV9NYXhMZW5ndGgoU3RyaW5nIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxKCksIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlMihTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTJfTWF4TGVuZ3RoKGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3MgVHlwZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTJfTWF4TGVuZ3RoKFN0cmluZyBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMi5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMigpLCBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlKFN0cmluZyBoeXBlcmxpbmtUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVIeXBlcmxpbmtUeXBlX01heExlbmd0aChoeXBlcmxpbmtUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkh5cGVybGluayBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rVHlwZV9NYXhMZW5ndGgoU3RyaW5nIGh5cGVybGlua1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua1R5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRIeXBlcmxpbmtUeXBlKCksIGh5cGVybGlua1R5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlMShTdHJpbmcgaHlwZXJsaW5rVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUh5cGVybGlua1R5cGUxX01heExlbmd0aChoeXBlcmxpbmtUeXBlMSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5IeXBlcmxpbmsgVHlwZTE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlMV9NYXhMZW5ndGgoU3RyaW5nIGh5cGVybGlua1R5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBoeXBlcmxpbmtUeXBlMS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEh5cGVybGlua1R5cGUxKCksIGh5cGVybGlua1R5cGUxLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rVHlwZTIoU3RyaW5nIGh5cGVybGlua1R5cGUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVIeXBlcmxpbmtUeXBlMl9NYXhMZW5ndGgoaHlwZXJsaW5rVHlwZTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIFR5cGUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rVHlwZTJfTWF4TGVuZ3RoKFN0cmluZyBoeXBlcmxpbmtUeXBlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gaHlwZXJsaW5rVHlwZTIubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRIeXBlcmxpbmtUeXBlMigpLCBoeXBlcmxpbmtUeXBlMiwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUluaXRpYWxzVHlwZShTdHJpbmcgaW5pdGlhbHNUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVJbml0aWFsc1R5cGVfTWF4TGVuZ3RoKGluaXRpYWxzVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5Jbml0aWFscyBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSW5pdGlhbHNUeXBlX01heExlbmd0aChTdHJpbmcgaW5pdGlhbHNUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBpbml0aWFsc1R5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbml0aWFsc1R5cGUoKSwgaW5pdGlhbHNUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTGFnRm9ybWF0VHlwZShCaWdJbnRlZ2VyIGxhZ0Zvcm1hdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUxhZ0Zvcm1hdFR5cGVfRW51bWVyYXRpb24obGFnRm9ybWF0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlTGFnRm9ybWF0VHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBMQUdfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjExIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0NCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5MYWcgRm9ybWF0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMYWdGb3JtYXRUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgbGFnRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IExBR19GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhsYWdGb3JtYXRUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRMYWdGb3JtYXRUeXBlKCksIGxhZ0Zvcm1hdFR5cGUsIExBR19GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlKEJpZ0ludGVnZXIgbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlX0VudW1lcmF0aW9uKGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBMRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0NCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBMRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUoKSwgbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUsIExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxKEJpZ0ludGVnZXIgbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTFfRW51bWVyYXRpb24obGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTFfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdCBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldExldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSgpLCBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEsIExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1hbmFnZXJUeXBlKFN0cmluZyBtYW5hZ2VyVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTWFuYWdlclR5cGVfTWF4TGVuZ3RoKG1hbmFnZXJUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPk1hbmFnZXIgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1hbmFnZXJUeXBlX01heExlbmd0aChTdHJpbmcgbWFuYWdlclR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IG1hbmFnZXJUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWFuYWdlclR5cGUoKSwgbWFuYWdlclR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNYXRlcmlhbExhYmVsVHlwZShTdHJpbmcgbWF0ZXJpYWxMYWJlbFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU1hdGVyaWFsTGFiZWxUeXBlX01heExlbmd0aChtYXRlcmlhbExhYmVsVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5NYXRlcmlhbCBMYWJlbCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTWF0ZXJpYWxMYWJlbFR5cGVfTWF4TGVuZ3RoKFN0cmluZyBtYXRlcmlhbExhYmVsVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gbWF0ZXJpYWxMYWJlbFR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRNYXRlcmlhbExhYmVsVHlwZSgpLCBtYXRlcmlhbExhYmVsVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5hbWVUeXBlKFN0cmluZyBuYW1lVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTmFtZVR5cGVfTWF4TGVuZ3RoKG5hbWVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPk5hbWUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5hbWVUeXBlX01heExlbmd0aChTdHJpbmcgbmFtZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IG5hbWVUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZVR5cGUoKSwgbmFtZVR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOYW1lVHlwZTEoU3RyaW5nIG5hbWVUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTmFtZVR5cGUxX01heExlbmd0aChuYW1lVHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+TmFtZSBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5hbWVUeXBlMV9NYXhMZW5ndGgoU3RyaW5nIG5hbWVUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gbmFtZVR5cGUxLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZVR5cGUxKCksIG5hbWVUeXBlMSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5hbWVUeXBlMihTdHJpbmcgbmFtZVR5cGUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVOYW1lVHlwZTJfTWF4TGVuZ3RoKG5hbWVUeXBlMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5OYW1lIFR5cGUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmFtZVR5cGUyX01heExlbmd0aChTdHJpbmcgbmFtZVR5cGUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBuYW1lVHlwZTIubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lVHlwZTIoKSwgbmFtZVR5cGUyLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmFtZVR5cGUzKFN0cmluZyBuYW1lVHlwZTMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU5hbWVUeXBlM19NYXhMZW5ndGgobmFtZVR5cGUzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPk5hbWUgVHlwZTM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOYW1lVHlwZTNfTWF4TGVuZ3RoKFN0cmluZyBuYW1lVHlwZTMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IG5hbWVUeXBlMy5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSAyNTU7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVUeXBlMygpLCBuYW1lVHlwZTMsIGxlbmd0aCwgMjU1LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOZXdUYXNrU3RhcnREYXRlVHlwZShCaWdJbnRlZ2VyIG5ld1Rhc2tTdGFydERhdGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVOZXdUYXNrU3RhcnREYXRlVHlwZV9FbnVtZXJhdGlvbihuZXdUYXNrU3RhcnREYXRlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlTmV3VGFza1N0YXJ0RGF0ZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gTkVXX1RBU0tfU1RBUlRfREFURV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+TmV3IFRhc2sgU3RhcnQgRGF0ZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmV3VGFza1N0YXJ0RGF0ZVR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBuZXdUYXNrU3RhcnREYXRlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IE5FV19UQVNLX1NUQVJUX0RBVEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhuZXdUYXNrU3RhcnREYXRlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmV3VGFza1N0YXJ0RGF0ZVR5cGUoKSwgbmV3VGFza1N0YXJ0RGF0ZVR5cGUsIE5FV19UQVNLX1NUQVJUX0RBVEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5UQWNjb3VudFR5cGUoU3RyaW5nIG50QWNjb3VudFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU5UQWNjb3VudFR5cGVfTWF4TGVuZ3RoKG50QWNjb3VudFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+TlQgQWNjb3VudCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTlRBY2NvdW50VHlwZV9NYXhMZW5ndGgoU3RyaW5nIG50QWNjb3VudFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IG50QWNjb3VudFR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXROVEFjY291bnRUeXBlKCksIG50QWNjb3VudFR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPdXRsaW5lTnVtYmVyVHlwZShTdHJpbmcgb3V0bGluZU51bWJlclR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU91dGxpbmVOdW1iZXJUeXBlX01heExlbmd0aChvdXRsaW5lTnVtYmVyVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5PdXRsaW5lIE51bWJlciBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlT3V0bGluZU51bWJlclR5cGVfTWF4TGVuZ3RoKFN0cmluZyBvdXRsaW5lTnVtYmVyVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gb3V0bGluZU51bWJlclR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRsaW5lTnVtYmVyVHlwZSgpLCBvdXRsaW5lTnVtYmVyVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUoQmlnSW50ZWdlciBvdmVydGltZVJhdGVGb3JtYXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlX0VudW1lcmF0aW9uKG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgb3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IE9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMob3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSgpLCBvdmVydGltZVJhdGVGb3JtYXRUeXBlLCBPVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEoQmlnSW50ZWdlciBvdmVydGltZVJhdGVGb3JtYXRUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTFfRW51bWVyYXRpb24ob3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIE9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQgVHlwZTE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlMV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMob3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxKCksIG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxLCBPVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBob25ldGljQWxpYXNUeXBlKFN0cmluZyBwaG9uZXRpY0FsaWFzVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlUGhvbmV0aWNBbGlhc1R5cGVfTWF4TGVuZ3RoKHBob25ldGljQWxpYXNUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPlBob25ldGljIEFsaWFzIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQaG9uZXRpY0FsaWFzVHlwZV9NYXhMZW5ndGgoU3RyaW5nIHBob25ldGljQWxpYXNUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBwaG9uZXRpY0FsaWFzVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MDsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGhvbmV0aWNBbGlhc1R5cGUoKSwgcGhvbmV0aWNBbGlhc1R5cGUsIGxlbmd0aCwgNTAsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBob25ldGljc1R5cGUoU3RyaW5nIHBob25ldGljc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVBob25ldGljc1R5cGVfTWF4TGVuZ3RoKHBob25ldGljc1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+UGhvbmV0aWNzIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQaG9uZXRpY3NUeXBlX01heExlbmd0aChTdHJpbmcgcGhvbmV0aWNzVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gcGhvbmV0aWNzVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFBob25ldGljc1R5cGUoKSwgcGhvbmV0aWNzVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVByZWZpeFR5cGUoU3RyaW5nIHByZWZpeFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVByZWZpeFR5cGVfTWF4TGVuZ3RoKHByZWZpeFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+UHJlZml4IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQcmVmaXhUeXBlX01heExlbmd0aChTdHJpbmcgcHJlZml4VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gcHJlZml4VHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MDsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJlZml4VHlwZSgpLCBwcmVmaXhUeXBlLCBsZW5ndGgsIDUwLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSYXRlVGFibGVUeXBlKEJpZ0ludGVnZXIgcmF0ZVRhYmxlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlUmF0ZVRhYmxlVHlwZV9FbnVtZXJhdGlvbihyYXRlVGFibGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVSYXRlVGFibGVUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFJBVEVfVEFCTEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPlJhdGUgVGFibGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJhdGVUYWJsZVR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciByYXRlVGFibGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gUkFURV9UQUJMRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHJhdGVUYWJsZVR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFJhdGVUYWJsZVR5cGUoKSwgcmF0ZVRhYmxlVHlwZSwgUkFURV9UQUJMRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUm9sbHVwVHlwZVR5cGUoQmlnSW50ZWdlciByb2xsdXBUeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlUm9sbHVwVHlwZVR5cGVfRW51bWVyYXRpb24ocm9sbHVwVHlwZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVJvbGx1cFR5cGVUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFJPTExVUF9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Sb2xsdXAgVHlwZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUm9sbHVwVHlwZVR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciByb2xsdXBUeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFJPTExVUF9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMocm9sbHVwVHlwZVR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGx1cFR5cGVUeXBlKCksIHJvbGx1cFR5cGVUeXBlLCBST0xMVVBfVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZShCaWdJbnRlZ2VyIHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGVfRW51bWVyYXRpb24oc3RhbmRhcmRSYXRlRm9ybWF0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBTVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhzdGFuZGFyZFJhdGVGb3JtYXRUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlKCksIHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUsIFNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMShCaWdJbnRlZ2VyIHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMV9FbnVtZXJhdGlvbihzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTFfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdCBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgc3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBTVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEoKSwgc3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEsIFNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU3ViamVjdFR5cGUoU3RyaW5nIHN1YmplY3RUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVTdWJqZWN0VHlwZV9NYXhMZW5ndGgoc3ViamVjdFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+U3ViamVjdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU3ViamVjdFR5cGVfTWF4TGVuZ3RoKFN0cmluZyBzdWJqZWN0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gc3ViamVjdFR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdWJqZWN0VHlwZSgpLCBzdWJqZWN0VHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVN1YnByb2plY3ROYW1lVHlwZShTdHJpbmcgc3VicHJvamVjdE5hbWVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVTdWJwcm9qZWN0TmFtZVR5cGVfTWF4TGVuZ3RoKHN1YnByb2plY3ROYW1lVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5TdWJwcm9qZWN0IE5hbWUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVN1YnByb2plY3ROYW1lVHlwZV9NYXhMZW5ndGgoU3RyaW5nIHN1YnByb2plY3ROYW1lVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gc3VicHJvamVjdE5hbWVUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3VicHJvamVjdE5hbWVUeXBlKCksIHN1YnByb2plY3ROYW1lVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVRpdGxlVHlwZShTdHJpbmcgdGl0bGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVUaXRsZVR5cGVfTWF4TGVuZ3RoKHRpdGxlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5UaXRsZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVGl0bGVUeXBlX01heExlbmd0aChTdHJpbmcgdGl0bGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSB0aXRsZVR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRUaXRsZVR5cGUoKSwgdGl0bGVUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGUoQmlnSW50ZWdlciB0eXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlVHlwZVR5cGVfRW51bWVyYXRpb24odHlwZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVR5cGVUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFRZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPlR5cGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgdHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBUWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnModHlwZVR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFR5cGVUeXBlKCksIHR5cGVUeXBlLCBUWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZTEoQmlnSW50ZWdlciB0eXBlVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVR5cGVUeXBlMV9FbnVtZXJhdGlvbih0eXBlVHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVR5cGVUeXBlMV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBUWVBFX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+VHlwZSBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlMV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHR5cGVUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFRZUEVfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnModHlwZVR5cGUxKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRUeXBlVHlwZTEoKSwgdHlwZVR5cGUxLCBUWVBFX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGUyKEJpZ0ludGVnZXIgdHlwZVR5cGUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVUeXBlVHlwZTJfRW51bWVyYXRpb24odHlwZVR5cGUyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVUeXBlVHlwZTJfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gVFlQRV9UWVBFMl9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPlR5cGUgVHlwZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZTJfRW51bWVyYXRpb24oQmlnSW50ZWdlciB0eXBlVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBUWVBFX1RZUEUyX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHR5cGVUeXBlMik7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VHlwZVR5cGUyKCksIHR5cGVUeXBlMiwgVFlQRV9UWVBFMl9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlMyhCaWdJbnRlZ2VyIHR5cGVUeXBlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlVHlwZVR5cGUzX0VudW1lcmF0aW9uKHR5cGVUeXBlMywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlVHlwZVR5cGUzX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFRZUEVfVFlQRTNfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjExIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0NiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0OSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjU0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1NSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjU3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1OCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2NCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjY2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2NyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjY5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNzEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjcyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNzQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjc1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3NiIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5UeXBlIFR5cGUzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGUzX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgdHlwZVR5cGUzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gVFlQRV9UWVBFM19fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh0eXBlVHlwZTMpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFR5cGVUeXBlMygpLCB0eXBlVHlwZTMsIFRZUEVfVFlQRTNfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZTQoQmlnSW50ZWdlciB0eXBlVHlwZTQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVR5cGVUeXBlNF9FbnVtZXJhdGlvbih0eXBlVHlwZTQsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVR5cGVUeXBlNF9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBUWVBFX1RZUEU0X19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+VHlwZSBUeXBlNDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlNF9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHR5cGVUeXBlNCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFRZUEVfVFlQRTRfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnModHlwZVR5cGU0KTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRUeXBlVHlwZTQoKSwgdHlwZVR5cGU0LCBUWVBFX1RZUEU0X19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGU1KEJpZ0ludGVnZXIgdHlwZVR5cGU1LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVUeXBlVHlwZTVfRW51bWVyYXRpb24odHlwZVR5cGU1LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVUeXBlVHlwZTVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gVFlQRV9UWVBFNV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPlR5cGUgVHlwZTU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZTVfRW51bWVyYXRpb24oQmlnSW50ZWdlciB0eXBlVHlwZTUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBUWVBFX1RZUEU1X19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHR5cGVUeXBlNSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VHlwZVR5cGU1KCksIHR5cGVUeXBlNSwgVFlQRV9UWVBFNV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVVJRFR5cGUoU3RyaW5nIHVpZFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVVJRFR5cGVfTWF4TGVuZ3RoKHVpZFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+VUlEIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVVSURUeXBlX01heExlbmd0aChTdHJpbmcgdWlkVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gdWlkVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSAxNjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VUlEVHlwZSgpLCB1aWRUeXBlLCBsZW5ndGgsIDE2LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVVbml0VHlwZShCaWdJbnRlZ2VyIHVuaXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVVbml0VHlwZV9FbnVtZXJhdGlvbih1bml0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlVW5pdFR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gVU5JVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+VW5pdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVW5pdFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciB1bml0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFVOSVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh1bml0VHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VW5pdFR5cGUoKSwgdW5pdFR5cGUsIFVOSVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVZhbHVlbGlzdFNvcnRPcmRlclR5cGUoQmlnSW50ZWdlciB2YWx1ZWxpc3RTb3J0T3JkZXJUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlX0VudW1lcmF0aW9uKHZhbHVlbGlzdFNvcnRPcmRlclR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVZhbHVlbGlzdFNvcnRPcmRlclR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gVkFMVUVMSVNUX1NPUlRfT1JERVJfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgdmFsdWVsaXN0U29ydE9yZGVyVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFZBTFVFTElTVF9TT1JUX09SREVSX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnModmFsdWVsaXN0U29ydE9yZGVyVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFsdWVsaXN0U29ydE9yZGVyVHlwZSgpLCB2YWx1ZWxpc3RTb3J0T3JkZXJUeXBlLCBWQUxVRUxJU1RfU09SVF9PUkRFUl9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV2Vla1N0YXJ0RGF5VHlwZShCaWdJbnRlZ2VyIHdlZWtTdGFydERheVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVdlZWtTdGFydERheVR5cGVfRW51bWVyYXRpb24od2Vla1N0YXJ0RGF5VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlV2Vla1N0YXJ0RGF5VHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBXRUVLX1NUQVJUX0RBWV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+V2VlayBTdGFydCBEYXkgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdlZWtTdGFydERheVR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciB3ZWVrU3RhcnREYXlUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gV0VFS19TVEFSVF9EQVlfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh3ZWVrU3RhcnREYXlUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWVrU3RhcnREYXlUeXBlKCksIHdlZWtTdGFydERheVR5cGUsIFdFRUtfU1RBUlRfREFZX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXb3JrQ29udG91clR5cGUoQmlnSW50ZWdlciB3b3JrQ29udG91clR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVdvcmtDb250b3VyVHlwZV9FbnVtZXJhdGlvbih3b3JrQ29udG91clR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVdvcmtDb250b3VyVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBXT1JLX0NPTlRPVVJfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPldvcmsgQ29udG91ciBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV29ya0NvbnRvdXJUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgd29ya0NvbnRvdXJUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gV09SS19DT05UT1VSX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMod29ya0NvbnRvdXJUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrQ29udG91clR5cGUoKSwgd29ya0NvbnRvdXJUeXBlLCBXT1JLX0NPTlRPVVJfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdvcmtGb3JtYXRUeXBlKEJpZ0ludGVnZXIgd29ya0Zvcm1hdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVdvcmtGb3JtYXRUeXBlX0VudW1lcmF0aW9uKHdvcmtGb3JtYXRUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVXb3JrRm9ybWF0VHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBXT1JLX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+V29yayBGb3JtYXQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdvcmtGb3JtYXRUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgd29ya0Zvcm1hdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBXT1JLX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHdvcmtGb3JtYXRUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrRm9ybWF0VHlwZSgpLCB3b3JrRm9ybWF0VHlwZSwgV09SS19GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdvcmtHcm91cFR5cGUoQmlnSW50ZWdlciB3b3JrR3JvdXBUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVXb3JrR3JvdXBUeXBlX0VudW1lcmF0aW9uKHdvcmtHcm91cFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVdvcmtHcm91cFR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gV09SS19HUk9VUF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+V29yayBHcm91cCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV29ya0dyb3VwVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHdvcmtHcm91cFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBXT1JLX0dST1VQX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMod29ya0dyb3VwVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0dyb3VwVHlwZSgpLCB3b3JrR3JvdXBUeXBlLCBXT1JLX0dST1VQX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi19IC8vTXNwcm9qZWN0VmFsaWRhdG9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RYTUxIZWxwZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RYTUxIZWxwZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY1Y2Q3N2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0WE1MSGVscGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QudXRpbDsKLQotaW1wb3J0IGphdmEudGV4dC5GaWVsZFBvc2l0aW9uOwotaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEhlbHBlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLmludGVybmFsLlhNTENhbGVuZGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS51dGlsLlhNTFR5cGVVdGlsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLQotLyoqCi0gKiBDcmVhdGUgYSBzbGlnaHRseSBjdXN0b21pemVkIFhNTEhlbHBlckltcGwgY2xhc3MKLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNc3Byb2plY3RYTUxIZWxwZXJJbXBsIGV4dGVuZHMgWE1MSGVscGVySW1wbCBpbXBsZW1lbnRzIFhNTEhlbHBlciB7Ci0KLQkgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEYXRlRm9ybWF0IFtdIEVEQVRFX0ZPUk1BVFMgPQotCSAgewotCQluZXcgU2FmZVNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQnVCdISDptbTpzcyIpLAotCSAgICBuZXcgU2FmZVNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQnVCdISDptbTpzc1oiKSwKLQkgICAgbmV3IFNhZmVTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkWiIpCi0JICB9OwotCSAKLQkgLyoqCi0JICAqIENvbnN0cnVjdG9yCi0JICAqIEBwYXJhbSByZXNvdXJjZQotCSAgKi8KLQlwdWJsaWMgTXNwcm9qZWN0WE1MSGVscGVySW1wbChYTUxSZXNvdXJjZSByZXNvdXJjZSkgewotCQlzdXBlcihyZXNvdXJjZSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYm9vbGVhbiB2YWx1ZSB0byBlaXRoZXIgIjAiIG9yICIxIgotCSAqIENvbnZlcnQgRGF0ZVRpbWUgdmFsdWUgdG8gYmUgY29tcGF0aWJsZSB3aXRoIE1TIHByb2plY3QKLQkgKi8KLQkgcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRUZhY3RvcnkgZmFjdG9yeSwgRURhdGFUeXBlIGRhdGFUeXBlLCBPYmplY3QgdmFsdWUpCi0JICB7Ci0JCSAKLS8vCQkgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLmltcGwuWE1MVHlwZUZhY3RvcnlJbXBsIGFGYWN0b3J5ID0gbmV3IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5pbXBsLlhNTFR5cGVGYWN0b3J5SW1wbCgpOwotLy8JCSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCQkIGRhdGFUeXBlIG5hbWUgPSAiICsgZGF0YVR5cGUuZ2V0TmFtZSgpKTsKLQkJIAotCQkgaWYgKCJCb29sZWFuIi5lcXVhbHNJZ25vcmVDYXNlKGRhdGFUeXBlLmdldE5hbWUoKSkpIHsKLS8vCQkJIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIG5lZWQgdG8gb3ZlcnJpZGUgdGhlIEJvb2xlYW46ICIgKyB2YWx1ZSk7Ci0JCQkgaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkgU3RyaW5nIHJzID0gIjAiOwotCQkJCSB0cnkgewotCQkJCQkgQm9vbGVhbiBiT2JqZWN0ID0gKEJvb2xlYW4pdmFsdWU7Ci0JCQkJCSBpZiAoYk9iamVjdC5ib29sZWFuVmFsdWUoKSkKLQkJCQkJCSBycyA9ICIxIjsKLQkJCQkgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0vLwkJCQkgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgY29udmVydGVkIHN0cmluZyA9ICIgKyBycyk7Ci0JCQkJIHJldHVybiByczsKLQkJCSB9Ci0JCQkgcmV0dXJuIG51bGw7IAotCQkgfSBlbHNlIGlmICgiRGF0ZVRpbWUiLmVxdWFsc0lnbm9yZUNhc2UoZGF0YVR5cGUuZ2V0TmFtZSgpKSkgewotLy8JCQkgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgbmVlZCB0byBvdmVycmlkZSB0aGUgRGF0ZVRpbWU6ICIgKyB2YWx1ZS5nZXRDbGFzcygpICsgIiwiICsgdmFsdWUpOwotCQkJIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJICAgU3RyaW5nIHJzID0gdmFsdWUudG9TdHJpbmcoKTsKLQkJCQkgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKQotCQkJCSAgICB7Ci0JCQkJICAgICAgcnMgPSBFREFURV9GT1JNQVRTWzBdLmZvcm1hdCgoRGF0ZSl2YWx1ZSk7Ci0JCQkJICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBYTUxDYWxlbmRhcil7Ci0JCQkJCSAgcnMgPSAoKFhNTENhbGVuZGFyKXZhbHVlKS50b1N0cmluZygpOwotCQkJCQkgIGludCBpZHggPSBycy5pbmRleE9mKCcuJyk7Ci0JCQkJCSAgaWYgKGlkeCA+IDApCi0JCQkJCQkgIHJzID0gcnMuc3Vic3RyaW5nKDAsIGlkeCk7Ci0JCQkJCX0KLS8vCQkJCSAgIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGNvbnZlcnRlZCBzdHJpbmcgPSAiICsgcnMpOwotCQkJCSAgIHJldHVybiByczsKLQkJCSB9Ci0JCQkgcmV0dXJuIG51bGw7IAotCQkgfQotCQkgCi0vLwkJIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIEVGYWN0b3J5LCBFRGF0YVR5cGUsIHZhbHVlID0gIiArIGZhY3RvcnkgKyAiLCIgKyBkYXRhVHlwZSArICIsIiArIHZhbHVlKTsKLQkJIFN0cmluZyBycyA9IHN1cGVyLmNvbnZlcnRUb1N0cmluZyggZmFjdG9yeSwgIGRhdGFUeXBlLCAgdmFsdWUpOwotLy8JCSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBjb252ZXJ0ZWQgc3RyaW5nIChvdXQpID0gIiArIHJzKTsKLQkJIHJldHVybiByczsKLQkgIH0KLQkgCi0JIC8qKgotCSAgKiBDb252ZXJ0IHRoZSAxIG9yIDAgYm9vbGVhbiB2YWx1ZSB0byBhbiBCb29sZWFuIE9iamVjdAotCSAgKiBjb252ZXJ0IHRoZSBkYXRldGltZSBzdHJpbmcgaW50byBYTUxDYWxlbmRhciBvYmplY3QuCi0JICAqLwotCSBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRUZhY3RvcnkgZUZhY3RvcnksIEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyB2YWx1ZSkKLQkgIHsKLQkJIGlmICgiQm9vbGVhbiIuZXF1YWxzSWdub3JlQ2FzZShlRGF0YVR5cGUuZ2V0TmFtZSgpKSkgewotLy8JCQkgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgbmVlZCB0byBjb252ZXJ0IGZyb20gQm9vbGVhbjogIiArIHZhbHVlKTsKLQkJCSBpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCSBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpIHx8IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoIjEiKSkKLQkJCQkJIHJldHVybiBCb29sZWFuLlRSVUU7Ci0JCQkJIGVsc2UKLQkJCQkJIHJldHVybiBCb29sZWFuLkZBTFNFOwotCQkJIH0KLQkJCSByZXR1cm4gbnVsbDsgCi0JCSB9IGVsc2UgaWYgKCJEYXRlVGltZSIuZXF1YWxzSWdub3JlQ2FzZShlRGF0YVR5cGUuZ2V0TmFtZSgpKSkgewotLy8JCQkgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgbmVlZCB0byBjb252ZXJ0IGZyb20gRGF0ZVRpbWU6ICIgKyB2YWx1ZSk7Ci0JCQkgaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkgICByZXR1cm4gbmV3IFhNTENhbGVuZGFyKGNvbGxhcHNlV2hpdGVTcGFjZSh2YWx1ZSksIFhNTENhbGVuZGFyLkRBVEVUSU1FKTsKLQkJCSB9Ci0JCQkgcmV0dXJuIG51bGw7IAotCQkgfQotCQkgCi0vLwkJIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIEVGYWN0b3J5LCBFRGF0YVR5cGUsIHZhbHVlID0gIiArIGVGYWN0b3J5ICsgIiwiICsgZURhdGFUeXBlICsgIiwiICsgdmFsdWUpOwotCQkgT2JqZWN0IHJvID0gc3VwZXIuY3JlYXRlRnJvbVN0cmluZyggZUZhY3RvcnksICBlRGF0YVR5cGUsICB2YWx1ZSk7Ci0vLwkJIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGNvbnZlcnRlZCBvYmplY3QgKGluKSA9ICIgKyBybyk7Ci0JCSByZXR1cm4gcm87Ci0JICB9Ci0JIAotCSBwcm90ZWN0ZWQgU3RyaW5nIGNvbGxhcHNlV2hpdGVTcGFjZShTdHJpbmcgdmFsdWUpCi0JIHsKLQkJIHJldHVybiBYTUxUeXBlVXRpbC5ub3JtYWxpemUodmFsdWUsIHRydWUpOwotCSB9Ci0JICAKLQkgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2FmZVNpbXBsZURhdGVGb3JtYXQgZXh0ZW5kcyBTaW1wbGVEYXRlRm9ybWF0Ci0JIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHVibGljIFNhZmVTaW1wbGVEYXRlRm9ybWF0KFN0cmluZyBwYXR0ZXJuKQotCSAgICB7Ci0JICAgICAgc3VwZXIocGF0dGVybik7Ci0JICAgIH0KLQotCSAgICBwdWJsaWMgc3luY2hyb25pemVkIERhdGUgcGFyc2UoU3RyaW5nIHNvdXJjZSkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCi0JICAgIHsKLQkgICAgICByZXR1cm4gc3VwZXIucGFyc2Uoc291cmNlKTsKLQkgICAgfQotCi0JICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0KERhdGUgZGF0ZSwgU3RyaW5nQnVmZmVyIHRvQXBwZW5kVG8sIEZpZWxkUG9zaXRpb24gcG9zKQotCSAgICB7Ci0JICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IHN1cGVyLmZvcm1hdChkYXRlLCB0b0FwcGVuZFRvLCBwb3MpOwotLy8JICAgICAgcmVzdWx0Lmluc2VydChyZXN1bHQubGVuZ3RoKCkgLSAyLCAiOiIpOwotCSAgICAgIHJldHVybiByZXN1bHQ7Ci0JICAgIH0KLQkgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWYwM2Q4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBhY2Nlc3NpbmcgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4MTNkMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZjVlNjE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZW5fbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2VfZW4uaHRtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyMmNjZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1mZWF0dXJlTmFtZT1FUEYgUGxhdGZvcm0gRmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1kZXNjcmlwdGlvbj1FUEYgUGxhdGZvcm0gRmVhdHVyZS4KLXVwZGF0ZVNpdGVOYW1lPUVQRiBGZWF0dXJlIFVwZGF0ZXMKLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi1saWNlbnNlVVJMPWxpY2Vuc2VfZW4uaHRtbAotbGljZW5zZVRleHQ9VXNlIG9mIHRoaXMgZmVhdHVyZSBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIHRlcm1zIGFuZCBjb25kaXRpb25zIHdoaWNoIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBQcm9kdWN0IHdoaWNoIGluY2x1ZGVkIHRoaXMgZmVhdHVyZS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YjU2Y2FhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMi4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybSIKLSAgICAgIG9zPSJsaW51eCx3aW4zMiIKLSAgICAgIHdzPSJndGssd2luMzIiCi0gICAgICBhcmNoPSJ4ODYiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlVGV4dAotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjIiLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJjb20uaWJtLmljdSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImNvbS5qY3JhZnQuanNjaCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYW50IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hbnQuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUubHVjZW5lIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb21wYXJlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLndpbjMyLng4NiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIHdzPSJ3aW4zMiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5qb2JzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5jb21wYXRpYmlsaXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eCIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLndpbjMyIgotICAgICAgICAgb3M9IndpbjMyIgotICAgICAgICAgd3M9IndpbjMyIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LmF1dGgiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmRyYXcyZCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbmouc2RvIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmNoYW5nZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5lZGl0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkbyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWRpdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJlY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLmVjb3JlMnhtbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdlZiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLmFwcHNlcnZlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZmFjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2dpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGV4dCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5mb3JtcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmludHJvIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndpbjMyIgotICAgICAgICAgb3M9IndpbjMyIgotICAgICAgICAgd3M9IndpbjMyIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3Qud2luMzIud2luMzIueDg2IgotICAgICAgICAgb3M9IndpbjMyIgotICAgICAgICAgd3M9IndpbjMyIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIHdzPSJ3aW4zMiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscC53ZWJhcHAiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRvbWNhdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnNlYXJjaCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLmxpbnV4Lng4NiIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5ndGsubGludXgueDg2IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnNzaCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnNzaDIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5jb25zb2xlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLmFjdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5hY3Rpb24uaWRlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmFjdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wcm9wZXJ0aWVzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm9wZXJ0aWVzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5pZGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlbmRlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5yZW5kZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkucmVuZGVyLmF3dCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jbGlwYm9hcmQuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5wcm9wZXJ0aWVzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5wcm92aWRlcnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51bWwyLmNvbW1vbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVtbDIuY29tbW9uLmVkaXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51bWwyLnVtbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVtbDIudW1sLmVkaXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmJhdGlrIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLnhlcmNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5nZW9zaGFwZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5yZWdpc3RyeSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLnJlbmRlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkucHJpbnRpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkucHJpbnRpbmcud2luMzIiCi0gICAgICAgICBvcz0id2luMzIiCi0gICAgICAgICB3cz0id2luMzIiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9saWNlbnNlX2VuLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2xpY2Vuc2VfZW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2xpY2Vuc2VfZW4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlZTc0MDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm08L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhM2M4NDAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZmVhdHVyZVBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGM5OTA4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5pbmkgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc3ZDQ5NmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLWFwcE5hbWU9JWZlYXR1cmVOYW1lCi0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyAoJG5sJC8gcHJlZml4IHRvIHBlcm1pdCBsb2NhbGUtc3BlY2lmaWMgdHJhbnNsYXRpb25zIG9mIGVudGlyZSBmaWxlKQotd2VsY29tZVBhZ2U9JG5sJC93ZWxjb21lLnhtbAotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGM4MzQyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWZlYXR1cmVOYW1lPUVjbGlwc2UgUGxhdGZvcm0gMy4yLjEgd2l0aCBFTUYgYW5kIEdFRiAKLQotYmx1cmI9RWNsaXBzZSBQbGF0Zm9ybVxuXAotXG5cCi1WZXJzaW9uOiAzLjIuMVxuXAotQnVpbGQgaWQ6IE0yMDA2MDkyMS0wOTQ1XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA2LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGxhdGZvcm1cblwKLVxuXAotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGVcblwKLUFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYjAwZDQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLmdpZixcCi0gICAgICAgICAgICAgICB3ZWxjb21lLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vZWNsaXBzZTMyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmYTY1NGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLWZlYXR1cmVQbHVnaW5OYW1lPUVQRiBQbGF0Zm9ybSBGZWF0dXJlCi1mZWF0dXJlUGx1Z2luTmFtZU5MPUVQRiBQbGF0Zm9ybSBGZWF0dXJlIChOTDEpCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS93ZWxjb21lLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL3dlbGNvbWUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMDA5MjQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL3dlbGNvbWUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPHdlbGNvbWVQYWdlIAotCXRpdGxlPSJFY2xpcHNlIE1vZGVsaW5nIEZyYW1ld29yayAoRU1GKSI+Ci0KLTxpbnRybz5FTUYgaXMgYSBKYXZhL1hNTCBmcmFtZXdvcmsgZm9yIGdlbmVyYXRpbmcgdG9vbHMgYW5kIG90aGVyIGFwcGxpY2F0aW9ucwotYmFzZWQgb24gc2ltcGxlIGNsYXNzIG1vZGVscy4KLTwvaW50cm8+Ci0KLTxpdGVtPjxiPldoYXQgaXMgRU1GPzwvYj4KLQlSZWFkIHRoZSA8dG9waWMgaHJlZj0iL29yZy5lY2xpcHNlLmVtZi5kb2MvcmVmZXJlbmNlcy9vdmVydmlldy9FTUYuaHRtbCI+b3ZlcnZpZXc8L3RvcGljPiBhcnRpY2xlIHRvIGxlYXJuIGFib3V0IEVNRi4KLQlUaGVuLCBmb2xsb3cgdGhlIDx0b3BpYyBocmVmPSIvb3JnLmVjbGlwc2UuZW1mLmRvYy90dXRvcmlhbHMvY2xpYm1vZC9jbGlibW9kLmh0bWwiPnR1dG9yaWFsPC90b3BpYz4gdG8gc2VlIGhvdyBlYXN5IGl0IGlzIHRvIGdlbmVyYXRlIGEgbW9kZWwuCi08L2l0ZW0+Ci0KLTxpdGVtPjxiPkxlYXJuIE1vcmU8L2I+Ci0JVGhpcyBpcyB0aGUgb2ZmaWNpYWwgc2l0ZSBvZiBFTUY6IDx0b3BpYyBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZiI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWY8L3RvcGljPgotPC9pdGVtPgotCi08L3dlbGNvbWVQYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjY2OTI2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiM2U1MTQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNGcmkgSnVuIDIzIDExOjA2OjAwIFBEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotcGx1Z2luUHJvamVjdC5leHRlbnNpb25zPXRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTdkYWE2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlcjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIuUHVibGlzaGVyUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUltcG9ydC1QYWNrYWdlOiBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcsCi0gb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzhiMTlmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gLixcCi0JCQkgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8KLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvaWNvbnMvV2ViUHVibGlzaC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvaWNvbnMvV2ViUHVibGlzaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc2ZGNmMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyL2ljb25zL1dlYlB1Ymxpc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOGRiZTc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgUHVibGlzaGVyIFBsdWctaW4KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi1wdWJsaXNoZXJMYWJlbD1QdWJsaXNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNmRhMDdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wdWJsaXNoZXJzIj4KLSAgICAgIDxwdWJsaXNoZXIKLSAgICAgICAgICAgIGljb249Imljb25zL1dlYlB1Ymxpc2guZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIiCi0gICAgICAgICAgICBtYW5hZ2VyQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIuc2VydmljZXMuRVBGUHVibGlzaE1hbmFnZXIiCi0gICAgICAgICAgICBsYWJlbD0iJXB1Ymxpc2hlckxhYmVsIgotICAgICAgICAgICAgd2l6YXJkQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLndpemFyZHMuUHVibGlzaENvbmZpZ3VyYXRpb25XaXphcmQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hlci9QdWJsaXNoZXJQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hlci9QdWJsaXNoZXJQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDVmYTQzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoZXIvUHVibGlzaGVyUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIEVQRiBwdWJsaXNoZXIgcGx1Zy1pbiBhY3RpdmF0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoZXJQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBQdWJsaXNoZXJQbHVnaW4uY2xhc3MuZ2V0TmFtZSgpOwotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFB1Ymxpc2hlclBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoZXJQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RvcChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFB1Ymxpc2hlclBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGVyL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hlci9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJlZGJmNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGVyL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBhY3RpdmF0b3IgZm9yIG1hbmFnaW5nIHRoZSBQdWJsaXNoZXIgcGx1Zy1pbidzIGxpZmUgY3ljbGUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGVyL3NlcnZpY2VzL0VQRlB1Ymxpc2hNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoZXIvc2VydmljZXMvRVBGUHVibGlzaE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTU3YTAzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoZXIvc2VydmljZXMvRVBGUHVibGlzaE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoZXIuc2VydmljZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogVGhlIEVQRiBwdWJsaXNoaW5nIG1hbmFnZXIuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFUEZQdWJsaXNoTWFuYWdlciBleHRlbmRzIFB1Ymxpc2hNYW5hZ2VyIHsKLQotCXB1YmxpYyB2b2lkIGluaXQoU3RyaW5nIHB1YkRpciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlQdWJsaXNoT3B0aW9ucyBvcHRpb25zKSB7Ci0JCXN1cGVyLmluaXQocHViRGlyLCBjb25maWcsIG9wdGlvbnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGVyL3NlcnZpY2VzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hlci9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1MDdiZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGVyL3NlcnZpY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgcHVibGlzaGluZyBhIG1ldGhvZCBjb25maWd1cmF0aW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2NlNmU2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJjYzFjNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsCi0gb3JnLmVjbGlwc2UuaGVscC5iYXNlCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMsCi0gb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcud2l6YXJkcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNGI4MjQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvaWNvbnMvUmVwb3J0aW5nLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvaWNvbnMvUmVwb3J0aW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTM4Y2M4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL1JlcG9ydGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL1dlYlB1Ymxpc2guZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9pY29ucy9XZWJQdWJsaXNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzZkY2YwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL1dlYlB1Ymxpc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9pY29ucy9mdWxsL3dpemJhbi9QdWJsaXNoQ29uZmlndXJhdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL1B1Ymxpc2hDb25maWd1cmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI0OTgzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL1B1Ymxpc2hDb25maWd1cmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZjhiMzBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIFB1Ymxpc2hpbmcgVUkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIERlZmF1bHQgZmVlZGJhY2sgVVJMCi1mZWVkYmFja1VSTD1odHRwOi8vd3d3LnB1Ymxpc2hlZF93ZWJzaXRlLmNvbS9mZWVkYmFjawotCi0jIFB1Ymxpc2ggQ29uZmlndXJhdGlvbiBBY3Rpb24KLXB1Ymxpc2hDb25maWdBY3Rpb249JlB1Ymxpc2guLi4KLXB1Ymxpc2hDb25maWdBY3Rpb25Ub29sdGlwPVB1Ymxpc2ggYSB3ZWIgc2l0ZSBmb3IgYSBjb25maWd1cmF0aW9uCi0KLSMgUHJlZmVyZW5jZSBQYWdlCi1wdWJsaXNoaW5nT3B0aW9ucz1QdWJsaXNoaW5nIE9wdGlvbnMKLQotIyBQdWJsaXNoaW5nIEFjdGlvbnMKLWNvbmZpZ0FjdGlvblNldD1Db25maWd1cmF0aW9uCi1jb25maWdNZW51PSZDb25maWd1cmF0aW9uCi0KLSMgUHJpbnQgQ29uZmlndXJhdGlvbiBBY3Rpb24KLXByaW50Q29uZmlnQWN0aW9uPVByaW50Ci0KLSMgdGhlIHRpdGxlIGZvciB0aGUgcHVibGlzaGVkIHNpdGUKLSNkb24ndCBkZWZpbmUgaGVyZSwgbGV0IHVzZXIgc3BlY2lmeSBpdC4KLSN0aXRsZT1PcGVuVVAvQmFzaWMKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBEZWZhdWx0IFB1Ymxpc2ggUGF0aAotcHVibGlzaFBhdGg9PHVzZXIuaG9tZT4vPGFwcC5uYW1lPi9QdWJsaXNoCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDMzYTE0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgICAgaWQ9InB1Ymxpc2hDb25maWdXaXphcmQiCi0gICAgICAgICBuYW1lPSJQdWJsaXNoIE1ldGhvZCBDb25maWd1cmFpdG9uIFdpemFyZCBFeHRlbnNpb24iCi0gICAgICAgICBzY2hlbWE9InNjaGVtYS9QdWJsaXNoQ29uZmlnV2l6YXJkLmV4c2QiIC8+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InB1Ymxpc2hlcnMiIG5hbWU9IlB1Ymxpc2hlcnMiIHNjaGVtYT0ic2NoZW1hL3B1Ymxpc2hlcnMuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0gICAgICA8YWN0aW9uU2V0Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuQ29uZmlnQWN0aW9uU2V0IgotICAgICAgICAgICAgbGFiZWw9IiVjb25maWdBY3Rpb25TZXQiCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj4KLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubWVudS5jb25maWd1cmF0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVjb25maWdNZW51IgotICAgICAgICAgICAgICAgcGF0aD0iYWRkaXRpb25zIi8+ICAKLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5hY3Rpb25zLlB1Ymxpc2hDb25maWdBY3Rpb24iCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNvbmZpZ3VyYXRpb25fcHVibGlzaF9jb250ZXh0IgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvV2ViUHVibGlzaC5naWYiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuYWN0aW9ucy5QdWJsaXNoIgotICAgICAgICAgICAgICAgbGFiZWw9IiVwdWJsaXNoQ29uZmlnQWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm1lbnUuY29uZmlndXJhdGlvbi9hZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIvPgotICAgICAgPC9hY3Rpb25TZXQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgIDxwYWdlIGlkPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5QdWJsaXNoaW5nUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMuUHVibGlzaGluZ1ByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMucm9vdHByZWZwYWdlIiAgICAgICAgICAgIAotICAgICAgICAgICAgbmFtZT0iJXB1Ymxpc2hpbmdPcHRpb25zIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPCEtLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnB1Ymxpc2hlcnMiPgotICAgICAgPHB1Ymxpc2hlcgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvV2ViUHVibGlzaC5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hlciIKLSAgICAgICAgICAgIG1hbmFnZXJDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE1hbmFnZXIiCi0gICAgICAgICAgICBsYWJlbD0iJXB1Ymxpc2hlckxhYmVsIgotICAgICAgICAgICAgd2l6YXJkQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLndpemFyZHMuUHVibGlzaENvbmZpZ3VyYXRpb25XaXphcmQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgLS0+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zY2hlbWEvUHVibGlzaENvbmZpZ1dpemFyZC5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zY2hlbWEvUHVibGlzaENvbmZpZ1dpemFyZC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZTViODk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc2NoZW1hL1B1Ymxpc2hDb25maWdXaXphcmQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkiIGlkPSJwdWJsaXNoQ29uZmlnV2l6YXJkIiBuYW1lPSJQdWJsaXNoIE1ldGhvZCBDb25mZ3VyYXRpb24gV2l6YXJkIEV4dGVuc2lvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFbmFibGVzIGEgcGx1Zy1pbiB0byBleHRlbmQgdGhlIFB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYXRpb24gd2l6YXJkIGJ5IHJlcGxhY2luZyBleGlzdGluZyB3aXphcmQgcGFnZXMgb3IgYWRkaW5nIG5ldyBvbmVzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmRFeHRlbmRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ3aXphcmRFeHRlbmRlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZFBhZ2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHVibGlzaGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSB3aXphcmQgZXh0ZW5kZXIuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuSVB1Ymxpc2hDb25maWdXaXphcmRFeHRlbmRlciZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZFBhZ2UiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHdpemFyZCBwYWdlLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50cyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2UmbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgb2YgZXh0ZW5zaW9uIC0gJnF1b3Q7cmVwbGFjZSZxdW90OyBvciAmcXVvdDtuZXcmcXVvdDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBiYXNlIHdpemFyZCBwYWdlIHRvIGJlIHJlcGxhY2VkIG9yIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIGluc2VydGluZyBhIG5ldyB3aXphcmQgcGFnZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbnNlcnQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGluc2VydGlvbiB0eXBlIGZvciBhIG5ldyB3aXphcmQgcGFnZSAtICZxdW90O2JlZm9yZSZxdW90OyBvciAmcXVvdDthZnRlciZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHVibGlzaGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBjb25maWd1cmF0aW9uIHB1Ymxpc2hlci4gVGhpcyBjbGFzcyBtdXN0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VmcnZpY2VzLkFic3RyYWN0UHVibGlzaE1hbmFnZXImbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0aGUgZXh0ZW5zaW9uIHBvaW50IGNhbiBiZSB1c2VkOiAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHVibGlzaENvbmZpZ1dpemFyZCZxdW90OyZndDsKLSAgICAgICZsdDt3aXphcmRFeHRlbmRlcgotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkcy5NeVB1Ymxpc2hDb25maWdXaXphcmRFeHRlbmRlciZxdW90OyZndDsKLSAgICAgICAgICZsdDt3aXphcmRQYWdlCi0gICAgICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzLk15U2VsZWN0UHVibGlzaE9wdGlvbnNQYWdlJnF1b3Q7Ci0gICAgICAgICAgICAgICB0eXBlPSZxdW90O3JlcGxhY2UmcXVvdDsKLSAgICAgICAgICAgICAgIHRhcmdldD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzLlNlbGVjdFB1Ymxpc2hPcHRpb25zUGFnZSZxdW90Oy8mZ3Q7Ci0gICAgICAgICAmbHQ7d2l6YXJkUGFnZQotICAgICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkcy5NeU5ld1B1Ymxpc2hQYWdlJnF1b3Q7Ci0gICAgICAgICAgICAgICB0eXBlPSZxdW90O25ldyZxdW90OwotICAgICAgICAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuU2VsZWN0UHVibGlzaE9wdGlvbnNQYWdlJnF1b3Q7ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICBpbnNlcnQ9JnF1b3Q7YWZ0ZXImcXVvdDsvJmd0OyAgICAgICAgICAgICAgIAotICAgICAgICAgJmx0O3B1Ymxpc2hlcgotICAgICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuTXlDb25maWdQdWJsaXNoZXImcXVvdDsvJmd0OwotICAgICAgJmx0Oy93aXphcmRFeHRlbmRlciZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NjaGVtYS9wdWJsaXNoZXJzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NjaGVtYS9wdWJsaXNoZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI1ZjIzZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zY2hlbWEvcHVibGlzaGVycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aSIgaWQ9InB1Ymxpc2hlcnMiIG5hbWU9InB1Ymxpc2hlcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgZGVmaW5lIHRoZSBleHRlbnNpb24gcG9pbnQgZm9yIHB1Ymxpc2hlcnMKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHVibGlzaGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InB1Ymxpc2hlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imljb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0id2l6YXJkQ2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWFuYWdlckNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9QdWJsaXNoZXJFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9QdWJsaXNoZXJFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkY2E3ZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUHVibGlzaGVyRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuQWJzdHJhY3RQdWJsaXNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy53aXphcmRzLkFic3RyYWN0UHVibGlzaFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIGF0dHJpYnV0ZXMgZm9yIGEgcHVibGlzaGVyIGV4dGVuc2lvbiBwb2ludAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hlckVsZW1lbnQgewotCUJ1bmRsZSBidW5kbGU7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0JcHJpdmF0ZSBTdHJpbmcgaWNvbjsKLQlwcml2YXRlIFN0cmluZyB3aXphcmRDbGFzczsKLQlwcml2YXRlIFN0cmluZyBtYW5hZ2VyQ2xhc3M7CQotCQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciBQdWJsaXNoZXJFbGVtZW50IGV4dGVuc2lvbiBwb2ludAotCSAqIEBwYXJhbSBidW5kbGUgQnVuZGxlIHRoZSBidW5kbGUgdGhhdCBsYW9kIHRoZSBlbGVtZW50IGRlZmluaXRpb24gZmlsZQotCSAqIEBwYXJhbSBpZCBTdHJpbmcKLQkgKiBAcGFyYW0gbGFiZWwgU3RyaW5nCi0JICogQHBhcmFtIGljb24gU3RyaW5nIGljb24gcGF0aAotCSAqIEBwYXJhbSB3aXphcmRDbGFzcyBTdHJpbmcgdGhlIHB1Ymxpc2hpbmcgd2l6YXJkIGNsYXNzLiAKLQkgKiBUaGlzIGNsYXNzIG11c3QgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy53aXphcmRzLkFic3RyYWN0UHVibGlzaFdpemFyZCBjbGFzcwotCSAqIEBwYXJhbSBtYW5hZ2VyQ2xhc3MgU3RyaW5nIHRoZSBwdWJsaXNoIG1hbWFnZXIgY2xhc3MuIAotCSAqIHRoaXMgY2xhc3MgbXVzdCBleHRlbmRzIHRoZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5BYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyIGNsYXNzLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoZXJFbGVtZW50KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgaWNvbiwgU3RyaW5nIHdpemFyZENsYXNzLCBTdHJpbmcgbWFuYWdlckNsYXNzKSB7Ci0JCXRoaXMuYnVuZGxlID0gYnVuZGxlOyAKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCXRoaXMuaWNvbiA9IGljb247Ci0JCXRoaXMud2l6YXJkQ2xhc3MgPSB3aXphcmRDbGFzczsKLQkJdGhpcy5tYW5hZ2VyQ2xhc3MgPSBtYW5hZ2VyQ2xhc3M7CQkKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBwdWJsaXNoIHdpemFyZAotCSAqIAotCSAqIEByZXR1cm4gQWJzdHJhY3RQdWJsaXNoV2l6YXJkCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RQdWJsaXNoV2l6YXJkIGdldFB1Ymxpc2hXaXphcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQ2xhc3MgY2xhenogPSBidW5kbGUubG9hZENsYXNzKHdpemFyZENsYXNzKTsKLQkJcmV0dXJuIChBYnN0cmFjdFB1Ymxpc2hXaXphcmQpIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgcHVibGlzaCBtYW5hZ2VyCi0JICogCi0JICogQHJldHVybiBBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RQdWJsaXNoTWFuYWdlciBnZXRQdWJsaXNoTWFuYWdlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlDbGFzcyBjbGF6eiA9IGJ1bmRsZS5sb2FkQ2xhc3MobWFuYWdlckNsYXNzKTsKLQkJcmV0dXJuIChBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyKSBjbGF6ei5uZXdJbnN0YW5jZSgpOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGlkIG9mIHRoZSBwdWJsaXNoZXIKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7IAotCQlyZXR1cm4gaWQ7IAotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGxhYmVsIG9mIHRoZSBwdWJsaXNoZXIKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgcHVibGlzaGVyIGljb24uCi0JICogCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJaWYgKCBpY29uID09IG51bGwgfHwgaWNvbi5sZW5ndGgoKSA9PSAwICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVSTCA9IGJ1bmRsZS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCi0JCQlVUkwgaWNvblVSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCwgaWNvbik7Ci0JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaWNvblVSTCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1B1Ymxpc2hlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1B1Ymxpc2hlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWI5YjJlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9QdWJsaXNoZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLmFjdGlvbnMuUHVibGlzaEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgY3JlYXRpb24gb2YgUHVibGlzaGVyIGluc3RhbmNlcyBieSBsb2FkaW5nIHRoZSBwdWJsaXNoZXIgZXh0ZW5zaW9ucy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hlckZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRSA9ICJwdWJsaXNoZXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBQdWJsaXNoZXJGYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQotCS8vIEEgbWFwIG9mIHB1Ymxpc2hlciBjb25maWd1cmF0aW9uIGVsZW1lbnRzLgotCXByaXZhdGUgTWFwPFN0cmluZywgUHVibGlzaGVyRWxlbWVudD4gcHVibGlzaGVyTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQdWJsaXNoZXJFbGVtZW50PigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHVibGlzaGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoUHVibGlzaGVyRmFjdG9yeS5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IFB1Ymxpc2hlckZhY3RvcnkoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBQdWJsaXNoZXJGYWN0b3J5KCkgewotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkvLyBQcm9jZXNzIHRoZSAib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHVibGlzaGVycyIgZXh0ZW5zaW9uIHBvaW50Ci0JCS8vIGNvbnRyaWJ1dG9ycy4KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSwgRVhURU5TSU9OX1BPSU5UX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBpZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgbmFtZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJsYWJlbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgaWNvbiA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJpY29uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyB3aXphcmRDbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgid2l6YXJkQ2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3RyaW5nIG1hbmFnZXJDbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgibWFuYWdlckNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmICgJaWQgIT0gbnVsbCAmJiBpZC50cmltKCkubGVuZ3RoKCkgPiAwIAotCQkJCQkJCQkmJiBuYW1lICE9IG51bGwgJiYgbmFtZS50cmltKCkubGVuZ3RoKCkgPiAwIAotCQkJCQkJCQkmJiB3aXphcmRDbGFzc05hbWUgIT0gbnVsbCAmJiB3aXphcmRDbGFzc05hbWUudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiBtYW5hZ2VyQ2xhc3NOYW1lICE9IG51bGwgJiYgbWFuYWdlckNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwICkgewotCQkJCQkJCWlmICghcHVibGlzaGVyTWFwLmNvbnRhaW5zS2V5KG5hbWUpKSB7Ci0JCQkJCQkJCVB1Ymxpc2hlckVsZW1lbnQgcHJvdmlkZXIgPSBuZXcgUHVibGlzaGVyRWxlbWVudCgKLQkJCQkJCQkJCQlidW5kbGUsIGlkLCBuYW1lLCBpY29uLCB3aXphcmRDbGFzc05hbWUsIG1hbmFnZXJDbGFzc05hbWUpOwotCQkJCQkJCQkKLQkJCQkJCQkJcHVibGlzaGVyTWFwLnB1dChpZCwgcHJvdmlkZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIGdldCB0aGUgcHVibGlzaGVyIGVsZW1lbnQgd2hpY2ggZGVmaW5lcyB0aGUgcHVibGlzaGVyIGV4dGVuc2lvbgotCSAqIAotCSAqIEBwYXJhbSBpZCBTdHJpbmcgaWQgb2YgdGhlIHB1Ymxpc2hlcgotCSAqIAotCSAqIEByZXR1cm4gUHVibGlzaGVyRWxlbWVudAotCSAqLwotCXB1YmxpYyBQdWJsaXNoZXJFbGVtZW50IGdldFB1Ymxpc2hlckVsZW1lbnQoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiAoUHVibGlzaGVyRWxlbWVudClwdWJsaXNoZXJNYXAuZ2V0KGlkKTsKLQl9Ci0gCi0JLyoqCi0JICogZ2V0IGFsbCBwdWJsaXNoZXIgZWxlbWVudHMKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIFB1Ymxpc2hlckVsZW1lbnQgb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFB1Ymxpc2hlckVsZW1lbnRzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdChwdWJsaXNoZXJNYXAudmFsdWVzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBjcmVhdGUgdGhlIFVJIGFjdGlvbnMgZm9yIHRoZSBwdWJsaXNoZXJzCi0JICogCi0JICogQHJldHVybiBBY3Rpb25bXQotCSAqLwotCXB1YmxpYyBBY3Rpb25bXSBjcmVhdGVQdWJsaXNoQWN0aW9ucygpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBnZXRQdWJsaXNoZXJFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlQdWJsaXNoZXJFbGVtZW50IGUgPSAoUHVibGlzaGVyRWxlbWVudClpdC5uZXh0KCk7Ci0JCQkKLQkJCUFjdGlvbiBhY3Rpb24gPSBuZXcgUHVibGlzaEFjdGlvbihlLmdldElkKCksIGUuZ2V0TGFiZWwoKSwgZS5nZXRJbWFnZURlc2NyaXB0b3IoKSk7Ci0JCQlpdGVtcy5hZGQoYWN0aW9uKTsKLQkJfSAKLQotCQlpbnQgc2l6ZSA9IGl0ZW1zLnNpemUoKTsKLQkJQWN0aW9uW10gYWN0aW9ucyA9IG5ldyBBY3Rpb25bc2l6ZV07Ci0JCWl0ZW1zLnRvQXJyYXkoYWN0aW9ucyk7Ci0JCQotCQlyZXR1cm4gYWN0aW9uczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9QdWJsaXNoaW5nVUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1B1Ymxpc2hpbmdVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxODg0OGFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1B1Ymxpc2hpbmdVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyBmb3IgdGhlIHB1Ymxpc2hpbmcgVUkgcGx1Z2luLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaGluZ1VJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBQdWJsaXNoaW5nVUlQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaGluZ1VJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5jb3JlLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5jb3JlLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBQdWJsaXNoaW5nVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1B1Ymxpc2hpbmdVSVJlc291cmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUHVibGlzaGluZ1VJUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc3OWFhNTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUHVibGlzaGluZ1VJUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBjbGFzcyBmb3IgcHVibGlzaGluZyBVSSByZXNvdXJjZXMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHVibGlzaGluZ1VJUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5jbGFzcwotCQkJLmdldFBhY2thZ2UoKS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFB1Ymxpc2hpbmdVSVJlc291cmNlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1dpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb250ZW50V2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbnRlbnRXaXphcmRQYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoQ29uZmlnUmFkaW9CdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hQcm9jZXNzZXNSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5jbHVkZUJhc2VQcm9jZXNzZXNDaGVja2JveExhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1dpemFyZFBhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1dpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hXZWJTaXRlR3JvdXBfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0aXRsZUFuZExpbmtzR3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvb2tBbmRGZWVsR3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRpdGxlTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhbm5lckltYWdlTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFib3V0SFRNTExhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmZWVkYmFja1VSTExhYmVsX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2xvc3NhcnlBbmRJbmRleEdyb3VwX3RleHQ7CQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaEdsb3NzYXJ5TGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hJbmRleExhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZGF0aW9uR3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrRXh0ZXJuYWxMaW5rc0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0QnJva2VuTGlua3NMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhZ3JhbUdyb3VwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoQWN0aXZpdHlEZXRhaWxEaWFncmFtc0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoRXh0ZW5kZWRBY3Rpdml0eURpYWdyYW1zTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxheW91dEdyb3VwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoTGlnaHRXZWlnaHRUcmVlTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hFeHRyYURlc2NyaXB0b3JJbmZvTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hFbXB0eUNhdGVnb3JpZXNMYWJlbF90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdERlc3RpbmF0aW9uV2l6YXJkUGFnZV90aXRsZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3REZXN0aW5hdGlvbldpemFyZFBhZ2VfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXJMYWJlbF90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdlYkFwcEdyb3VwX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhdGljV2ViU2l0ZVJhZGlvQnV0dG9uX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHluYW1pY1dlYkFwcFJhZGlvQnV0dG9uX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5jbHVkZVNlYXJjaENoZWNrYm94X3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2ViQXBwbGljYXRpb25OYW1lTGFiZWxfdGV4dDsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXN0aW5hdGlvbkRpcmVjdG9yeUdyb3VwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXRoTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVzZURlZmF1bHRQYXRoQ2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVzZURlZmF1bHRGZWVkYmFja0xhYmVsX3RleHQ7Ci0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluY2x1ZGVTZWFyY2hlc0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGllbnRTaWRlU2VhcmNoUmFkaW9CdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlclNpZGVTZWFyY2hSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGVXQVJGaWxlTGFiZWxfdGV4dDsKLQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXNlQXBwbGV0Q2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNpdGVDdXN0b21pemF0aW9uV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNpdGVDdXN0b21pemF0aW9uV2l6YXJkUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGhlbWVBbmRTa2luR3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3dCYW5uZXJDaGVja2JveF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0U2tpbkxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXBhYmlsaXR5UGF0dGVybnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkVmlld3NJbmZvX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRWaWV3Q29udHJpYnV0b3JJbmZvX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRWaWV3U2FtZVZpZXdJbmZvX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRWaWV3SW52YWxpZEluZm9fbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZmVyZW5jZVBhZ2VfZGVmYXVsdFBhdGhfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maXJtUGF0aERpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3ZlcndyaXRlRGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5jZWxQdWJsaXNoQ29uZmlnX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXZpZXdDb25maWdFcnJvcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdSZXBvcnRFcnJvcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pc3NpbmdWaWV3RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2Fubm90UHVibGlzaEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRQYXRoRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFBhdGhDaGFyc0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWdFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmV2aWV3Q29uZmlnRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1JlcG9ydEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWdFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVGaWxlc0Vycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZURpckVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5Ccm93c2VyRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2ViQXBwTmFtZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdlYkFwcE5hbWVDaGFyc0Vycm9yX21zZzsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFB1Ymxpc2hpbmdVSVJlc291cmNlcy5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBrZXkgYW5kIGZvcm1hdHRlZAotCSAqIHdpdGggYSBnaXZlbiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIEFuIG9iamVjdC4KLQkgKiBAcmV0dXJuIEEgZm9ybWF0dGVkIGxvY2FsaXplZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcga2V5LCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gTkxTLmJpbmQoa2V5LCBuZXcgT2JqZWN0W10geyBkYXRhIH0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MjUyZjllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiBXaXphcmQKLXB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGU9UHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbgotCi0jIFNlbGVjdCBNZXRob2QgQ29uZmlndXJhdGlvbiBXaXphcmQgUGFnZQotc2VsZWN0Q29uZmlnV2l6YXJkUGFnZV90aXRsZT1TZWxlY3QgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLXNlbGVjdENvbmZpZ1dpemFyZFBhZ2VfdGV4dD1TZWxlY3QgYSBtZXRob2QgY29uZmlndXJhdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRvIHB1Ymxpc2guCi1jb25maWdMYWJlbF90ZXh0PU1ldGhvZCBjb25maWd1cmF0aW9uOgotCi0jIFNlbGVjdCBNZXRob2QgQ29uZmlndXJhdGlvbiBDb250ZW50IFdpemFyZCBQYWdlCi1zZWxlY3RDb250ZW50V2l6YXJkUGFnZV90aXRsZT1TZWxlY3QgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29udGVudAotc2VsZWN0Q29udGVudFdpemFyZFBhZ2VfdGV4dD1TZWxlY3QgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGNvbnRlbnQgdG8gcHVibGlzaC4gWW91IGNhbiBjaG9vc2UgdG8gcHVibGlzaCB0aGUgZW50aXJlIGNvbmZpZ3VyYXRpb24gb3Igb25seSBhIGZldyBzZWxlY3QgcHJvY2Vzc2VzIGluIHRoZSBjb25maWd1cmF0aW9uLgotcHVibGlzaENvbmZpZ1JhZGlvQnV0dG9uX3RleHQ9UHVibGlzaCB0aGUgZW50aXJlIGNvbmZpZ3VyYXRpb24KLXB1Ymxpc2hQcm9jZXNzZXNSYWRpb0J1dHRvbl90ZXh0PVB1Ymxpc2ggdGhlIHByb2Nlc3NlcyBzZWxlY3RlZCBiZWxvdwotaW5jbHVkZUJhc2VQcm9jZXNzZXNDaGVja2JveExhYmVsX3RleHQ9UHVibGlzaCByZWZlcmVuY2VkIGJhc2UgcHJvY2Vzc2VzCi0KLSMgU2VsZWN0IFB1Ymxpc2hpbmcgT3B0aW9ucyBXaXphcmQgUGFnZQotc2VsZWN0UHVibGlzaGluZ09wdGlvbnNXaXphcmRQYWdlX3RpdGxlPVNlbGVjdCBwdWJsaXNoaW5nIG9wdGlvbnMKLXNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zV2l6YXJkUGFnZV90ZXh0PVNlbGVjdCB0aGUgcHVibGlzaGluZyBvcHRpb25zLiBUaGVzZSBvcHRpb25zIHdpbGwgYmUgdXNlZCB0byBjdXN0b21pemUgdGhlIGxvb2sgYW5kIGJlaGF2aW9yIG9mIHRoZSBwdWJsaXNoZWQgd2Vic2l0ZS4KLXRpdGxlQW5kTGlua3NHcm91cF90ZXh0PVRpdGxlIGFuZCBsaW5rcwotdGl0bGVMYWJlbF90ZXh0PVRpdGxlOgotYWJvdXRIVE1MTGFiZWxfdGV4dD1BYm91dCBjb250ZW50OgotZmVlZGJhY2tVUkxMYWJlbF90ZXh0PUZlZWRiYWNrIFVSTDoKLWdsb3NzYXJ5QW5kSW5kZXhHcm91cF90ZXh0PUdsb3NzYXJ5IGFuZCBpbmRleAotcHVibGlzaEdsb3NzYXJ5TGFiZWxfdGV4dD1QdWJsaXNoIGdsb3NzYXJ5Ci1wdWJsaXNoSW5kZXhMYWJlbF90ZXh0PVB1Ymxpc2ggaW5kZXgKLWxvb2tBbmRGZWVsR3JvdXBfdGV4dD1Mb29rIGFuZCBmZWVsCi1iYW5uZXJJbWFnZUxhYmVsX3RleHQ9QmFubmVyIGltYWdlOgotdmFsaWRhdGlvbkdyb3VwX3RleHQ9VmFsaWRhdGlvbgotY2hlY2tFeHRlcm5hbExpbmtzTGFiZWxfdGV4dD1DaGVjayBleHRlcm5hbCBoeXBlcmxpbmtzCi1jb252ZXJ0QnJva2VuTGlua3NMYWJlbF90ZXh0PUNvbnZlcnQgYnJva2VuIGh5cGVybGlua3MgdG8gcGxhaW4gdGV4dAotZGlhZ3JhbUdyb3VwX3RleHQ9RGlhZ3JhbXMKLXB1Ymxpc2hBY3Rpdml0eURldGFpbERpYWdyYW1zTGFiZWxfdGV4dD1QdWJsaXNoIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyB0aGF0IGhhdmUgbm90IGJlZW4gY3JlYXRlZCBtYW51YWxseQotcHVibGlzaEV4dGVuZGVkQWN0aXZpdHlEaWFncmFtc0xhYmVsX3RleHQ9UHVibGlzaCBhY3Rpdml0eSBkaWFncmFtcyBmb3IgdW5tb2RpZmllZCBhY3Rpdml0eSBleHRlbnNpb25zCi1sYXlvdXRHcm91cF90ZXh0PUxheW91dAotcHVibGlzaExpZ2h0V2VpZ2h0VHJlZUxhYmVsX3RleHQ9R2VuZXJhdGUgc3ViLXRyZWUgc3RydWN0dXJlIGZvciB0YXNrLCByb2xlLCB3b3JrIHByb2R1Y3QgYW5kIGRpc2NpcGxpbmUgZWxlbWVudHMgd2l0aG91dCB1c2luZyBmb2xkZXJzCi1wdWJsaXNoRXh0cmFEZXNjcmlwdG9ySW5mb0xhYmVsX3RleHQ9UHVibGlzaCBkZXNjcmlwdG9ycyB3aXRoIHRoZSBjb21wbGV0ZSBjb250ZW50IG9mIHRoZSByZWxhdGVkIG1ldGhvZCBjb250ZW50IGVsZW1lbnQKLXB1Ymxpc2hFbXB0eUNhdGVnb3JpZXNMYWJlbF90ZXh0PVB1Ymxpc2ggY2F0ZWdvcmllcyB3aXRoIG5vIGNhdGVnb3JpemVkIGVsZW1lbnRzCi0KLXB1Ymxpc2hXZWJTaXRlR3JvdXBfdGV4dD1QdWJsaXNoZWQgd2Vic2l0ZQotCi0jIFNlbGVjdCBEZXN0aW5hdGlvbiBXaXphcmQgUGFnZQotc2VsZWN0RGVzdGluYXRpb25XaXphcmRQYWdlX3RpdGxlPVNlbGVjdCBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgYW5kIHdlYnNpdGUgZm9ybWF0Ci1zZWxlY3REZXN0aW5hdGlvbldpemFyZFBhZ2VfdGV4dD1TZWxlY3QgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBhbmQgZm9ybWF0IGZvciB0aGUgcHVibGlzaGVkIHdlYnNpdGUuCi1kaXJMYWJlbF90ZXh0PURpcmVjdG9yeToKLXdlYkFwcEdyb3VwX3RleHQ9V2Vic2l0ZSBmb3JtYXQKLXN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbl90ZXh0PVN0YXRpYyB3ZWIgc2l0ZQotZHluYW1pY1dlYkFwcFJhZGlvQnV0dG9uX3RleHQ9SmF2YSBFRSB3ZWIgYXBwbGljYXRpb24gcGFja2FnZWQgaW4gYSBXQVIgZmlsZSAocmVxdWlyZXMgSmF2YSBTZXJ2bGV0IDIuMyBvciBhYm92ZSBjb21wbGlhbnQgc2VydmxldCBjb250YWluZXIpCi1pbmNsdWRlU2VhcmNoQ2hlY2tib3hfdGV4dD1JbmNsdWRlIHNlYXJjaCBjYXBhYmlsaXR5Ci13ZWJBcHBsaWNhdGlvbk5hbWVMYWJlbF90ZXh0PVdlYiBhcHBsaWNhdGlvbiBuYW1lOgotCi1kZXN0aW5hdGlvbkRpcmVjdG9yeUdyb3VwX3RleHQ9RGVzdGluYXRpb24gZGlyZWN0b3J5Ci1wYXRoTGFiZWxfdGV4dD1QYXRoOgotdXNlRGVmYXVsdFBhdGhDaGVja2JveF90ZXh0PVVzZSBkZWZhdWx0IHBhdGgKLXVzZURlZmF1bHRGZWVkYmFja0xhYmVsX3RleHQ9VXNlIGRlZmF1bHQgZmVlZGJhY2sgVVJMCi0KLWluY2x1ZGVTZWFyY2hDaGVja2JveF90ZXh0PUluY2x1ZGUgc2VhcmNoIGNhcGFiaWxpdHkgKHJlcXVpcmVzIGNvbnRhaW5lciBmb3Igc2VydmxldCkKLWluY2x1ZGVTZWFyY2hlc0xhYmVsX3RleHQ9SW5jbHVkZSBzZWFyY2ggY2FwYWJpbGl0eQotY2xpZW50U2lkZVNlYXJjaFJhZGlvQnV0dG9uX3RleHQ9IENsaWVudCBzaWRlIHNlYXJjaCAocmVxdWlyZXMgSmF2YSBhcHBsZXQgc3VwcG9ydCBpbiBicm93c2VyKQotc2VydmVyU2lkZVNlYXJjaFJhZGlvQnV0dG9uX3RleHQ9IFNlcnZlciBzaWRlIHNlYXJjaCAocmVxdWlyZXMgQ29udGFpbmVyIGZvciBzZXJ2bGV0KQotZ2VuZXJhdGVXQVJGaWxlTGFiZWxfdGV4dD1HZW5lcmF0ZSBXQVIgKFdlYiBBUmNoaXZlKSBmaWxlCi0KLXVzZUFwcGxldENoZWNrYm94X3RleHQ9U3VwcG9ydCB2aWV3IGN1c3RvbWl6YXRpb24gKHJlcXVpcmVzIEphdmEgYXBwbGV0IHN1cHBvcnQgaW4gYnJvd3NlcikKLQotc2l0ZUN1c3RvbWl6YXRpb25XaXphcmRQYWdlX3RpdGxlPUN1c3RvbWl6ZSBXZWJzaXRlCi1zaXRlQ3VzdG9taXphdGlvbldpemFyZFBhZ2VfdGV4dD1DdXN0b21pemUgV2Vic2l0ZSBsb29rIGFuZCBmZWVsCi10aGVtZUFuZFNraW5Hcm91cF90ZXh0PVRoZW1lIGFuZCBTa2luCi1zaG93QmFubmVyQ2hlY2tib3hfdGV4dD1TaG93IGJhbm5lcgotc2VsZWN0U2tpbkxhYmVsX3RleHQ9U2VsZWN0IHNraW46Ci0KLSMgRklYTUUhIFNob3VsZCB0aGVzZSBiZSB3YXJuaW5nIG1lc3NhZ2VzPwotIyBJbmZvcm1hdGlvbiBNZXNzYWdlCi1pbnZhbGlkVmlld3NJbmZvX21zZz1UaGUgZm9sbG93aW5nIHZpZXcocykgaW4gY29uZmlndXJhdGlvbiAnJ3swfScnIHdpbGwgbm90IGJlIHB1Ymxpc2hlZDoKLWludmFsaWRWaWV3Q29udHJpYnV0b3JJbmZvX21zZz17MH06IFRoZSB2aWV3IGlzIGEgY29udHJpYnV0b3IKLWludmFsaWRWaWV3U2FtZVZpZXdJbmZvX21zZz17MH06IFRoaXMgdmlldyBpcyBhIGR1cGxpY2F0ZSBvZiBhbm90aGVyIHZpZXcKLWludmFsaWRWaWV3SW52YWxpZEluZm9fbXNnPXswfTogVGhpcyB2aWV3IGlzIG5vdCBhIHZhbGlkIGVsZW1lbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQotY2FwYWJpbGl0eVBhdHRlcm5zX3RleHQ9Q2FwYWJpbGl0eSBQYXR0ZXJucwotZGVsaXZlcnlQcm9jZXNzZXNfdGV4dD1EZWxpdmVyeSBQcm9jZXNzZXMKLQotIyBQdWJsaXNoaW5nIFByZWZlcmVuY2UgUGFnZQotcHJlZmVyZW5jZVBhZ2VfZGVmYXVsdFBhdGhfdGV4dD1EZWZhdWx0IHBhdGg6Ci0KLSMgQ29uZmlybWF0aW9uIERpYWxvZ3MKLXB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU9UHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbgotY29uZmlybVBhdGhEaWFsb2dfdGV4dD1UaGUgZGVzdGluYXRpb24gcGF0aCBoYXMgYmVlbiByZXNvbHZlZCB0byAnJ3swfScnLiBEbyB5b3Ugd2FudCB0byBwcm9jZWVkPwotb3ZlcndyaXRlRGlhbG9nX3RleHQ9VGhlIGRlc3RpbmF0aW9uIHBhdGggJyd7MH0nJyBhbHJlYWR5IGV4aXN0cy4gQWxsIGZpbGVzIGluIHRoZSBmb2xkZXIgd2lsbCBiZSBkZWxldGVkLiBEbyB5b3Ugd2FudCB0byBwcm9jZWVkPwotY2FuY2VsUHVibGlzaENvbmZpZ19tc2c9VGhlIHB1Ymxpc2hpbmcgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZC4KLQotIyBFcnJvciBEaWFsb2dzCi1wcmV2aWV3Q29uZmlnRXJyb3JfdGl0bGU9UHJldmlldyBQdWJsaXNoZWQgTWV0aG9kIENvbmZpZ3VyYXRpb24KLXZpZXdSZXBvcnRFcnJvcl90aXRsZT1WaWV3IFB1Ymxpc2hpbmcgUmVwb3J0Ci0KLSMgRXJyb3IgTWVzc2FnZXMKLW1pc3NpbmdWaWV3RXJyb3JfbXNnPUlVUFAwMTAwVzogVGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIHZpZXcuIEVkaXQgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIGFkZCBhIHZpZXcsIG9yIHNlbGVjdCBhbm90aGVyIGNvbmZpZ3VyYXRpb24uCi1jYW5ub3RQdWJsaXNoRXJyb3JfbXNnPUlVUFAwMTAxRTogVGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIHB1Ymxpc2hlZC4KLWludmFsaWRQYXRoRXJyb3JfbXNnPUlVUFAwMTAyRTogVGhlIGRlc3RpbmF0aW9uIHBhdGggaXMgYmxhbmsgb3IgaW52YWxpZC4KLWludmFsaWRQYXRoQ2hhcnNFcnJvcl9tc2c9SVVQUDAxMDNFOiBUaGUgZGVzdGluYXRpb24gcGF0aCBjYW5ub3QgY29udGFpbiB0aGVzZSBjaGFyYWN0ZXJzOiBcXCAjICogPyAiIDwgPiB8ICEgJSAvCi1wdWJsaXNoQ29uZmlnRXJyb3JfbXNnPUlVUFAwMTA0RTogVGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gd2FzIG5vdCBwdWJsaXNoZWQgc3VjY2Vzc2Z1bGx5LgotcHJldmlld0NvbmZpZ0Vycm9yX21zZz1JVVBQMDEwNUU6IFVuYWJsZSB0byBvcGVuIGEgSFRNTCBicm93c2VyIHRvIHByZXZpZXcgdGhlIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotdmlld1JlcG9ydEVycm9yX21zZz1JVVBQMDEwNkU6IFVuYWJsZSB0byBvcGVuIGEgSFRNTCBicm93c2VyIHRvIHZpZXcgdGhlIHB1Ymxpc2hpbmcgcmVwb3J0Lgotd2ViQXBwTmFtZUVycm9yX21zZz1JVVBQMDEwN0U6IFRoZSB3ZWIgYXBwbGljYXRpb24gbmFtZSBtdXN0IGJlIHNwZWNpZmllZC4KLXdlYkFwcE5hbWVDaGFyc0Vycm9yX21zZz1JVVBQMDEwOEU6IFRoZSB3ZWIgYXBwbGljYXRpb24gbmFtZSBjYW5ub3QgY29udGFpbiB0aGVzZSBjaGFyYWN0ZXJzOiBcXCAjICogPyAiIDwgPiB8ICEgJSAvCi0KLSMgRXJyb3IgUmVhc29ucyAmIFJlY29tbWVuZGVkIEFjdGlvbnMKLXB1Ymxpc2hDb25maWdFcnJvcl9yZWFzb249SVVQUDAxMDdFOiBBbiBlcnJvciBoYXMgb2NjdXJyZWQuIFNlbGVjdCB0aGUgRGV0YWlscyBidXR0b24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1kZWxldGVGaWxlc0Vycm9yX3JlYXNvbj1UaGUgZGVzdGluYXRpb24gcGF0aCAnJ3swfScnIGNvbnRhaW5zIGZpbGVzIHRoYXQgY2Fubm90IGJlIGRlbGV0ZWQuXG5cbkNsb3NlIHRoaXMgZGlhbG9nIGFuZCBzcGVjaWZ5IGFub3RoZXIgcGF0aC4KLWNyZWF0ZURpckVycm9yX3JlYXNvbj1UaGUgZGVzdGluYXRpb24gcGF0aCAnJ3swfScnIGNhbm5vdCBiZSBjcmVhdGVkLlxuXG5DbG9zZSB0aGlzIGRpYWxvZyBhbmQgc3BlY2lmeSBhbm90aGVyIHBhdGguCi1vcGVuQnJvd3NlckVycm9yX3JlYXNvbj1UaGUgZGVmYXVsdCBIVE1MIGJyb3dzZXIgb24gdGhpcyBzeXN0ZW0gY2Fubm90IGJlIGRldGVjdGVkIG9yIGxvY2F0ZWQuXG5cbkNsb3NlIHRoaXMgZGlhbG9nIGFuZCBvcGVuIHRoZSBmaWxlICcnezB9JycgbWFudWFsbHkgd2l0aCBhIEhUTUwgYnJvd3Nlci4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9hY3Rpb25zL1B1Ymxpc2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2FjdGlvbnMvUHVibGlzaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYTRlYzdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2FjdGlvbnMvUHVibGlzaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcy5MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5BYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLndpemFyZHMuQWJzdHJhY3RQdWJsaXNoV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLndpemFyZHMuUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy53aXphcmRzLlB1Ymxpc2hpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBJbnZva2VzIHRoZSBQdWJsaXNoIE1ldGhvZCBDb25maWd1cmF0aW9uIHdpemFyZC4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqIFRPRE86IFJlbmFtZSB0aGlzIGNsYXNzIHRvIFB1Ymxpc2hDb25maWd1cmF0aW9uQWN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0JcHJpdmF0ZSBQdWJsaXNoT3B0aW9ucyBwdWJsaXNoRGF0YU1vZGVsOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdChJV29ya2JlbmNoV2luZG93KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4oSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJCi0JCWlmICggIShhY3Rpb24gaW5zdGFuY2VvZiBQdWJsaXNoQWN0aW9uKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCVN0cmluZyBpZCA9ICgoUHVibGlzaEFjdGlvbilhY3Rpb24pLmdldElkKCk7Ci0JCQlQdWJsaXNoZXJFbGVtZW50IGUgPSBQdWJsaXNoZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0UHVibGlzaGVyRWxlbWVudChpZCk7CQkKLQkJCWlmICggZSA9PSBudWxsICkgewotCQkJCS8vIHNob3cgZXJyb3IgYW5kIHJldHVybgotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJc3RhcnRQdWJsaXNoKGUpOwotCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXggKSB7Ci0JCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkubG9nRXJyb3IoIkVycm9yIHB1Ymxpc2hpbmcgY29udGVudCIsIGV4KTsJLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0UHVibGlzaChQdWJsaXNoZXJFbGVtZW50IHB1Ymxpc2hlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCi0vLwkJUHVibGlzaENvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkID0gbmV3IFB1Ymxpc2hDb25maWd1cmF0aW9uV2l6YXJkKAotLy8JCXB1Ymxpc2hEYXRhTW9kZWwpOwotCQlBYnN0cmFjdFB1Ymxpc2hXaXphcmQgd2l6YXJkID0gcHVibGlzaGVyLmdldFB1Ymxpc2hXaXphcmQoKTsKLQkJd2l6YXJkLmluaXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgc2VsZWN0aW9uKTsKLQkJcHVibGlzaERhdGFNb2RlbCA9IHdpemFyZC5nZXRQdWJsaXNoT3B0aW9ucygpOwotCi0JCS8vcHVibGlzaERhdGFNb2RlbCA9IG5ldyBQdWJsaXNoT3B0aW9ucygpOwotCi0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJU3RyaW5nIGxhc3RQdWJQYXRoID0gc3RvcmUKLQkJCQkuZ2V0U3RyaW5nKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTEFTVF9QVUJMSVNIX0ZPTERFUik7Ci0JCWlmIChsYXN0UHViUGF0aCAhPSBudWxsICYmIGxhc3RQdWJQYXRoLmxlbmd0aCgpID4gMCkKLQkJCXB1Ymxpc2hEYXRhTW9kZWwuc2V0TGFzdFB1YmxpY2F0aW9uUGF0aChsYXN0UHViUGF0aCk7Ci0KLQkJLy8gSW5zdGFudGlhdGUgdGhlIHdpemFyZCBjb250YWluZXIgd2l0aCB0aGUgd2l6YXJkIGFuZCBvcGVuIGl0LgotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0KLQkJaWYgKCFwdWJsaXNoRGF0YU1vZGVsLmlzRmluaXNoUHJlc3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgcHVibGlzaERlc3RGb2xkZXIgPSBwdWJsaXNoRGF0YU1vZGVsLmdldFB1YmxpY2F0aW9uUGF0aCgpOwotCQlzdG9yZS5zZXRWYWx1ZShMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xBU1RfUFVCTElTSF9GT0xERVIsCi0JCQkJcHVibGlzaERlc3RGb2xkZXIpOwotCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQlBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyIHB1Ymxpc2hNZ3IgPSBudWxsOwotCQl0cnkgewotCQkJU3RyaW5nIHNlbGVjZWRDb25maWdOYW1lID0gcHVibGlzaERhdGFNb2RlbC5nZXRTZWxlY3RlZENvbmZpZygpOwotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBzZWxlY2VkQ29uZmlnTmFtZSk7Ci0KLQkJCXB1Ymxpc2hNZ3IgPSBwdWJsaXNoZXIuZ2V0UHVibGlzaE1hbmFnZXIoKTsKLQkJCXB1Ymxpc2hNZ3IuaW5pdChwdWJsaXNoRGVzdEZvbGRlciwgY29uZmlnLCBwdWJsaXNoRGF0YU1vZGVsKTsKLQkJCVB1Ymxpc2hpbmdPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFB1Ymxpc2hpbmdPcGVyYXRpb24ocHVibGlzaE1ncik7Ci0KLQkJCVB1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2cgZGxnID0gbmV3IFB1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2coCi0JCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHB1Ymxpc2hNZ3IuZ2V0Vmlld0J1aWxkZXIoKSk7Ci0KLQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkucnVuV2l0aFByb2dyZXNzKAotCQkJCQkJCW9wZXJhdGlvbiwKLQkJCQkJCQlkbGcsCi0JCQkJCQkJdHJ1ZSwKLQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ1dpemFyZF90aXRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChwdWJsaXNoTWdyICE9IG51bGwpIHsKLQkJCQlwdWJsaXNoTWdyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiwgSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9hY3Rpb25zL1B1Ymxpc2hBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2FjdGlvbnMvUHVibGlzaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiM2RkOGMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2FjdGlvbnMvUHVibGlzaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotCi0vKioKLSAqIGRlZmluZSB0aGUgUHVibGlzaCBhY3Rpb24KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByaXZhdGUgU3RyaW5nIGlkOwotCQotCS8qKgotCSAqIGNyZWF0ZSBhIFB1Ymxpc2hBY3Rpb24gaW5zdGFuY2UKLQkgKiAKLQkgKiBAcGFyYW0gaWQgU3RyaW5nIHRoZSBpZCBvZiB0aGUgYWN0aW9uCi0JICogQHBhcmFtIG5hbWUgU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBhY3Rpb24KLQkgKiBAcGFyYW0gaW1hZ2UgSW1hZ2VEZXNjcmlwdG9yIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgYWN0aW9uIGljb24KLQkgKi8KLQlwdWJsaWMgUHVibGlzaEFjdGlvbihTdHJpbmcgaWQsICBTdHJpbmcgbmFtZSwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlKSB7Ci0JCXN1cGVyKG5hbWUsIGltYWdlKTsJCi0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBpZCBvZiB0aGUgYWN0aW9uCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCQotCS8qKgotCSAqIGV4ZWN1dGUgdGhlIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCW5ldyBQdWJsaXNoKCkucnVuKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2FjdGlvbnMvUHVibGlzaENvbmZpZ0FjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvYWN0aW9ucy9QdWJsaXNoQ29uZmlnQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNlYTk5MTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvYWN0aW9ucy9QdWJsaXNoQ29uZmlnQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuUHVibGlzaENvbmZpZ1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogSW52b2tlcyB0aGUgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiB3aXphcmQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hDb25maWdBY3Rpb24gaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdChJV29ya2JlbmNoV2luZG93KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4oSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJdHJ5IHsKLQkJCS8vIEluc3RhbnRpYXRlIGFuZCBpbml0aWFsaXplIHRoZSBQdWJsaXNoIE1ldGhvZCBDb25maWd1cmFpdG9uCi0JCQkvLyB3aXphcmQuCi0JCQlQdWJsaXNoQ29uZmlnV2l6YXJkIHdpemFyZCA9IG5ldyBQdWJsaXNoQ29uZmlnV2l6YXJkKCk7Ci0JCQl3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBudWxsKTsKLQotCQkJLy8gSW5zdGFudGlhdGUgdGhlIHdpemFyZCBjb250YWluZXIgd2l0aCB0aGUgd2l6YXJkIGFuZCBvcGVuIGl0LgotCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJLmdldEFjdGl2ZVNoZWxsKCksIHdpemFyZCk7Ci0JCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJIkVycm9yIHB1Ymxpc2hpbmcgY29udGVudCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24sIElTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvYWN0aW9ucy9QdWJsaXNoQ29uZmlndXJhdGlvbkFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvYWN0aW9ucy9QdWJsaXNoQ29uZmlndXJhdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyODE3ZDNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2FjdGlvbnMvUHVibGlzaENvbmZpZ3VyYXRpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcy5MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5BYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLndpemFyZHMuQWJzdHJhY3RQdWJsaXNoV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLndpemFyZHMuUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy53aXphcmRzLlB1Ymxpc2hpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogSW52b2tlcyB0aGUgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiB3aXphcmQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hDb25maWd1cmF0aW9uQWN0aW9uIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KElXb3JrYmVuY2hXaW5kb3cpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihJQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQl0cnkgewotCQkJLy8gdGhpcyB3aWxsIG5vdCB3b3JrLCBuZWVkIHRvIHBpY2sgdXAgdGhlIGNvcnJlY3QgcHVibGlzaGVyCi0JCQkvLyBKaW5odWEgWGkgMS8xMi8wNwotCQkJCi0JCQkvKgotCQkJLy8gSW5zdGFudGlhdGUgYW5kIGluaXRpYWxpemUgdGhlIFB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYWl0b24KLQkJCS8vIHdpemFyZC4KLQkJCVB1Ymxpc2hDb25maWdXaXphcmQgd2l6YXJkID0gbmV3IFB1Ymxpc2hDb25maWdXaXphcmQoKTsKLQkJCXdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIG51bGwpOwotCi0JCQkvLyBJbnN0YW50aWF0ZSB0aGUgd2l6YXJkIGNvbnRhaW5lciB3aXRoIHRoZSB3aXphcmQgYW5kIG9wZW4gaXQuCi0JCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgd2l6YXJkKTsKLQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkqLwotCQkJCi0JCQlMaXN0IGVsZW1lbnRzID0gUHVibGlzaGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFB1Ymxpc2hlckVsZW1lbnRzKCk7Ci0JCQlpZiAoIGVsZW1lbnRzICE9IG51bGwgJiYgZWxlbWVudHMuc2l6ZSgpID4gMCApIHsKLQkJCQkvLyBzaG93IGRpYWxvZyB0byBzZWxlY3QgcHVibGlzaGVyIGlmIG1vcmUgdGhlbiBvbmUsCi0JCQkJLy8gVE9ETwotCQkJCVB1Ymxpc2hlckVsZW1lbnQgZSA9IChQdWJsaXNoZXJFbGVtZW50KWVsZW1lbnRzLmdldCgwKTsKLQkJCQlzdGFydFB1Ymxpc2goZSk7CQkJCi0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJIkVycm9yIHB1Ymxpc2hpbmcgY29udGVudCIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uLCBJU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRQdWJsaXNoKFB1Ymxpc2hlckVsZW1lbnQgcHVibGlzaGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCVB1Ymxpc2hPcHRpb25zIHB1Ymxpc2hEYXRhTW9kZWw7Ci0KLQkJQWJzdHJhY3RQdWJsaXNoV2l6YXJkIHdpemFyZCA9IHB1Ymxpc2hlci5nZXRQdWJsaXNoV2l6YXJkKCk7Ci0JCXdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIG51bGwpOwotCQlwdWJsaXNoRGF0YU1vZGVsID0gd2l6YXJkLmdldFB1Ymxpc2hPcHRpb25zKCk7Ci0KLQkJLy9wdWJsaXNoRGF0YU1vZGVsID0gbmV3IFB1Ymxpc2hPcHRpb25zKCk7Ci0KLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlTdHJpbmcgbGFzdFB1YlBhdGggPSBzdG9yZQotCQkJCS5nZXRTdHJpbmcoTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MQVNUX1BVQkxJU0hfRk9MREVSKTsKLQkJaWYgKGxhc3RQdWJQYXRoICE9IG51bGwgJiYgbGFzdFB1YlBhdGgubGVuZ3RoKCkgPiAwKQotCQkJcHVibGlzaERhdGFNb2RlbC5zZXRMYXN0UHVibGljYXRpb25QYXRoKGxhc3RQdWJQYXRoKTsKLQotCQkvLyBJbnN0YW50aWF0ZSB0aGUgd2l6YXJkIGNvbnRhaW5lciB3aXRoIHRoZSB3aXphcmQgYW5kIG9wZW4gaXQuCi0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJLmdldEFjdGl2ZVNoZWxsKCksIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQotCQlpZiAoIXB1Ymxpc2hEYXRhTW9kZWwuaXNGaW5pc2hQcmVzc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBwdWJsaXNoRGVzdEZvbGRlciA9IHB1Ymxpc2hEYXRhTW9kZWwuZ2V0UHVibGljYXRpb25QYXRoKCk7Ci0JCXN0b3JlLnNldFZhbHVlKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTEFTVF9QVUJMSVNIX0ZPTERFUiwKLQkJCQlwdWJsaXNoRGVzdEZvbGRlcik7Ci0JCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCUFic3RyYWN0UHVibGlzaE1hbmFnZXIgcHVibGlzaE1nciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc2VsZWNlZENvbmZpZ05hbWUgPSBwdWJsaXNoRGF0YU1vZGVsLmdldFNlbGVjdGVkQ29uZmlnKCk7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIHNlbGVjZWRDb25maWdOYW1lKTsKLQotCQkJcHVibGlzaE1nciA9IHB1Ymxpc2hlci5nZXRQdWJsaXNoTWFuYWdlcigpOwotCQkJcHVibGlzaE1nci5pbml0KHB1Ymxpc2hEZXN0Rm9sZGVyLCBjb25maWcsIHB1Ymxpc2hEYXRhTW9kZWwpOwotCQkJUHVibGlzaGluZ09wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgUHVibGlzaGluZ09wZXJhdGlvbihwdWJsaXNoTWdyKTsKLQotCQkJUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZyBkbGcgPSBuZXcgUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZygKLQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgcHVibGlzaE1nci5nZXRWaWV3QnVpbGRlcigpKTsKLQotCQkJVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCS5ydW5XaXRoUHJvZ3Jlc3MoCi0JCQkJCQkJb3BlcmF0aW9uLAotCQkJCQkJCWRsZywKLQkJCQkJCQl0cnVlLAotCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJaWYgKHB1Ymxpc2hNZ3IgIT0gbnVsbCkgewotCQkJCXB1Ymxpc2hNZ3IuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9hY3Rpb25zL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDU4ZWUwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9hY3Rpb25zL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGFjdGlvbnMgZm9yIHRoZSBwdWJsaXNoaW5nIFVJLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2ludGVybmFsL3dpemFyZHMvUHVibGlzaENvbmZpZ09wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvaW50ZXJuYWwvd2l6YXJkcy9QdWJsaXNoQ29uZmlnT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1MWM3OTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvaW50ZXJuYWwvd2l6YXJkcy9QdWJsaXNoQ29uZmlnT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLkFic3RyYWN0UHVibGlzaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuQWJzdHJhY3RWaWV3QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLlByb2dyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGUgcHVibGlzaCBjb25maWd1cmF0aW9uIG9wZXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaENvbmZpZ09wZXJhdGlvbiBpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DT05GSUdfRVJST1JfVElUTEUgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0RpYWxvZ190aXRsZTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ09ORklHX0VSUk9SX01TRyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRXJyb3JfbXNnOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DT05GSUdfRVJST1JfUkVBU09OID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdFcnJvcl9yZWFzb247IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVWSUVXX0NPTkZJR19FUlJPUl9USVRMRSA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wcmV2aWV3Q29uZmlnRXJyb3JfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVWSUVXX0NPTkZJR19FUlJPUl9NU0cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHJldmlld0NvbmZpZ0Vycm9yX21zZzsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfUkVQT1JUX0VSUk9SX1RJVExFID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnZpZXdSZXBvcnRFcnJvcl90aXRsZTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfUkVQT1JUX0VSUk9SX01TRyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy52aWV3UmVwb3J0RXJyb3JfbXNnOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fQlJPV1NFUl9FUlJPUl9SRUFTT04gPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMub3BlbkJyb3dzZXJFcnJvcl9yZWFzb247IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJR19DQU5DRUxfTVNHID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNhbmNlbFB1Ymxpc2hDb25maWdfbXNnOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEFic3RyYWN0UHVibGlzaE1hbmFnZXIgcHVibGlzaE1ncjsKLQotCXByaXZhdGUgU3RyaW5nIHB1Ymxpc2hlZF91cmw7Ci0KLQlwcml2YXRlIFN0cmluZyByZXBvcnRfdXJsOwotCi0JcHJpdmF0ZSBNc2dEaWFsb2cgbXNnRGlhbG9nOwotCi0JcHJpdmF0ZSBFeGNlcHRpb24gcnVuRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaENvbmZpZ09wZXJhdGlvbihBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyIHB1Ymxpc2hNZ3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wdWJsaXNoTWdyID0gcHVibGlzaE1ncjsKLQkJdGhpcy5tc2dEaWFsb2cgPSBQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgdmlldyBidWlsZGVyLgotCSAqIAotCSAqIEByZXR1cm4gQWJzdHJhY3RWaWV3QnVpbGRlcgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFZpZXdCdWlsZGVyIGdldFZpZXdCdWlsZGVyKCkgewotCQlyZXR1cm4gdGhpcy5wdWJsaXNoTWdyLmdldFZpZXdCdWlsZGVyKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB1cmwgZm9yIHRoZSBwdWJsaXNoZWQgc2l0ZQotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoZWRVcmwoKSB7Ci0JCXJldHVybiBwdWJsaXNoZWRfdXJsOwotCX0KLQotCS8qKgotCSAqIHJ1biB0aGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gdGhlIHB1Ymxpc2hpbmcgdGFzay4KLQkgKiBAcGFyYW0gbW9uaXRvciBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJ1bkV4Y2VwdGlvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb25pdG9yLnNldFRhc2tOYW1lKFB1Ymxpc2hpbmdSZXNvdXJjZXMucHVibGlzaGluZ0NvbmZpZ3VyYXRpb25UYXNrX25hbWUpOyAvLyROT04tTkxTLTEkCQkJCi0JCQlwdWJsaXNoTWdyLnB1Ymxpc2gobW9uaXRvcik7Ci0KLQkJCXB1Ymxpc2hlZF91cmwgPSBwdWJsaXNoTWdyLmdldFB1Ymxpc2hlZFVybCgpOwotCQkJcmVwb3J0X3VybCA9IHB1Ymxpc2hNZ3IuZ2V0UHVibGlzaFJlcG9ydFVybCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcnVuRXhjZXB0aW9uID0gZTsKLQkJfQotCi0JCWZpbmFsIGJvb2xlYW4gY2FuY2VsZWQgPSBtb25pdG9yLmlzQ2FuY2VsZWQoKTsKLQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKGNhbmNlbGVkKSB7Ci0JCQkJCW1zZ0RpYWxvZy5kaXNwbGF5SW5mbyhQVUJMSVNIX0NPTkZJR19FUlJPUl9USVRMRSwKLQkJCQkJCQlQVUJMSVNIX0NPTkZJR19DQU5DRUxfTVNHKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmIChwdWJsaXNoZWRfdXJsID09IG51bGwgfHwgcmVwb3J0X3VybCA9PSBudWxsKSB7Ci0JCQkJCW1zZ0RpYWxvZy5kaXNwbGF5RXJyb3IoUFVCTElTSF9DT05GSUdfRVJST1JfVElUTEUsCi0JCQkJCQkJUFVCTElTSF9DT05GSUdfRVJST1JfTVNHLAotCQkJCQkJCVBVQkxJU0hfQ09ORklHX0VSUk9SX1JFQVNPTiwgcnVuRXhjZXB0aW9uKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIExhdW5jaCBhIEhUTUwgYnJvd3NlciB0byB2aWV3IHRoZSBwdWJsaXNoZWQgc2l0ZS4KLQkJCQlpZiAob3BlbkJyb3dzZXIocHVibGlzaGVkX3VybCkgPT0gZmFsc2UpIHsKLQkJCQkJU3RyaW5nIHJlYXNvbiA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCU9QRU5fQlJPV1NFUl9FUlJPUl9SRUFTT04sCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgcHVibGlzaGVkX3VybCB9KTsKLQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlFcnJvcihQUkVWSUVXX0NPTkZJR19FUlJPUl9USVRMRSwKLQkJCQkJCQlQUkVWSUVXX0NPTkZJR19FUlJPUl9NU0csIHJlYXNvbik7Ci0JCQkJfQotCi0JCQkJLy8gTGF1bmNoIGEgSFRNTCBicm93c2VyIHRvIHZpZXcgdGhlIHJlcG9ydCBvbiB0aGUgcHVibGlzaGVkCi0JCQkJLy8gc2l0ZS4KLQkJCQlpZiAob3BlbkJyb3dzZXIocmVwb3J0X3VybCkgPT0gZmFsc2UpIHsKLQkJCQkJU3RyaW5nIHJlYXNvbiA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCU9QRU5fQlJPV1NFUl9FUlJPUl9SRUFTT04sCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgcmVwb3J0X3VybCB9KTsKLQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlFcnJvcihWSUVXX1JFUE9SVF9FUlJPUl9USVRMRSwKLQkJCQkJCQlWSUVXX1JFUE9SVF9FUlJPUl9NU0csIHJlYXNvbik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuIGEgYnJvd3NlciB0byBzaG93IHRoZSBwdWJsaXNoZWQgY29udGVudC4KLQkgKiBAcGFyYW0gdXJsIFN0cmluZyB0aGUgc2l0ZSB1cmwKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBicm93c2VyIG9wZW5lZCBzdWNjZXNzZnVsbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gb3BlbkJyb3dzZXIoZmluYWwgU3RyaW5nIHVybCkgewotCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCS8vIExhdW5jaCB0aGUgZGVmYXVsdCBIVE1MIHZpZXdlciB0byBkaXNwbGF5IHRoZSBIVE1MIHBhZ2UuCi0JCQkvLyBPbiBMaW51eCwgdGhpcyBjYW4ndCBsYXVuY2ggdXJscywgb25seSBsb2NhbCBmaWxlcyBjYW4gYmUKLQkJCS8vIGxhdW5jaGVkLgotCQkJLy8gU29ycnkgSSBoYXZlIHVzZSBpbnRlcm5hbCBjbGFzcyBoZXJlLgotCQkJLy8gaG9wZSBFY2xpcHNlLm9yZyBjYW4gaGF2ZSBhIHB1YmxpYyBhcGkgdG8gZG8gc28uCi0JCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJ3aW4zMiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdWNjZXNzID0gUHJvZ3JhbS5sYXVuY2godXJsKTsKLQkJCX0gZWxzZSB7Ci0vLwkJCQlJQnJvd3NlciBicm93c2VyID0gb3JnLmVjbGlwc2UuaGVscC5pbnRlcm5hbC5icm93c2VyLkJyb3dzZXJNYW5hZ2VyCi0vLwkJCQkJCS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUJyb3dzZXIodHJ1ZSk7Ci0vLwkJCQlpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0vLwkJCQkJdHJ5IHsKLS8vCQkJCQkJYnJvd3Nlci5kaXNwbGF5VVJMKHVybCk7Ci0vLwkJCQkJCXN1Y2Nlc3MgPSB0cnVlOwotLy8JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJCQkJfQotLy8JCQkJfQotCQkJCQotCQkJCS8vIDE1NTQ5MCAtIENhbm5vdCBkZXRlY3RlZCBkZWZhdWx0IGJyb3dzZXIgd2hlbiBwcmV2aWV3IHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIG9uIExpbnV4Ci0JCQkJLy8gY2hhbmdlZCB0byB1c2Ugc3d0IGJyb3dzZXIKLQkJCQlzdWNjZXNzID0gdHJ1ZTsKLQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLQkJCQl7Ci0JCQkJICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0JCQkJCXsKLS8vCQkJCQkJCS8vIG9wZW4gYW5vdGhlciBzd3QgYnJvd3NlciBzaW5jZSB3ZSBoYXZlIG5vIChzaW1wbGUpIHdheSBvZiBjcmVhdGluZyBhIHN5c3RlbSBkZWZhdWx0IGJyb3dzZXIKLS8vCQkJCQkJCS8vIHRoZSBFY2xpcHNlIGd1eXMgaGlkZSBhbGwgdGhlIGdvb2QgYXBpcyBhcyBpbnRlcm5hbAotCQkJCQkJCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKCk7Ci0JCQkJCQkJc2hlbGwuc2V0VGV4dCh1cmwpOwotCQkJCQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCQkJCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCQkJCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJCQkJCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCQkJCQkJCUJyb3dzZXIgcG9wdXBfYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQkJCQkJcG9wdXBfYnJvd3Nlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEh8R3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMfEdyaWREYXRhLkdSQUJfVkVSVElDQUwpKTsKLQkJCQkJCQlwb3B1cF9icm93c2VyLnNldFVybCh1cmwpOwkJCQkJCQkJCQkJCQkJCi0JCQkJCQkJc2hlbGwub3BlbigpOwotCQkJCQl9Ci0JCQkJfSk7CQkJCi0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJc3VjY2VzcyA9IGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9pbnRlcm5hbC93aXphcmRzL1B1Ymxpc2hDb25maWdXaXphcmRFeHRlbnNpb25NYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9pbnRlcm5hbC93aXphcmRzL1B1Ymxpc2hDb25maWdXaXphcmRFeHRlbnNpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2OWM0ZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvaW50ZXJuYWwvd2l6YXJkcy9QdWJsaXNoQ29uZmlnV2l6YXJkRXh0ZW5zaW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuSVB1Ymxpc2hDb25maWdXaXphcmRFeHRlbmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5OZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLlJlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSAib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHVibGlzaENvbmZpZ1dpemFyZCIgZXh0ZW5zaW9uCi0gKiBwb2ludC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoQ29uZmlnV2l6YXJkRXh0ZW5zaW9uTWFuYWdlciB7Ci0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFID0gIm9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FID0gInB1Ymxpc2hDb25maWdXaXphcmQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFB1Ymxpc2hDb25maWdXaXphcmRFeHRlbnNpb25NYW5hZ2VyIGluc3RhbmNlID0gbmV3IFB1Ymxpc2hDb25maWdXaXphcmRFeHRlbnNpb25NYW5hZ2VyKCk7Ci0KLQkvLyBBbiBleHRlbmRlciBvZiB0aGUgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiB3aXphcmQuCi0JcHJpdmF0ZSBJUHVibGlzaENvbmZpZ1dpemFyZEV4dGVuZGVyIHdpemFyZEV4dGVuZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFB1Ymxpc2hDb25maWdXaXphcmRFeHRlbnNpb25NYW5hZ2VyKCkgewotCQlwcm9jZXNzRXh0ZW5zaW9uUG9pbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBQdWJsaXNoQ29uZmlnV2l6YXJkRXh0ZW5zaW9uTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3NlcyB0aGUgIm9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnB1Ymxpc2hDb25maWdXaXphcmQiCi0JICogZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NFeHRlbnNpb25Qb2ludCgpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSwgRVhURU5TSU9OX1BPSU5UX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUHVibGlzaENvbmZpZ1dpemFyZEV4dGVuZGVyIGV4dGVuZGVyID0gKElQdWJsaXNoQ29uZmlnV2l6YXJkRXh0ZW5kZXIpIGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmICh3aXphcmRFeHRlbmRlciA9PSBudWxsKSB7Ci0JCQkJCQkJd2l6YXJkRXh0ZW5kZXIgPSBleHRlbmRlcjsKLQotCQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNoaWxkQ29uZmlnRWxlbWVudHMgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0Q2hpbGRyZW4oIndpemFyZFBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgY2hpbGRDb25maWdFbGVtZW50cy5sZW5ndGg7IGsrKykgewotCQkJCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGRDb25maWdFbGVtZW50ID0gY2hpbGRDb25maWdFbGVtZW50c1trXTsKLQkJCQkJCQkJSVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IChJV2l6YXJkUGFnZSkgY2hpbGRDb25maWdFbGVtZW50Ci0JCQkJCQkJCQkJLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJU3RyaW5nIHR5cGUgPSBjaGlsZENvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJ0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJU3RyaW5nIHRhcmdldCA9IGNoaWxkQ29uZmlnRWxlbWVudAotCQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoInRhcmdldCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCVN0cmluZyBpbnNlcnQgPSBjaGlsZENvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJpbnNlcnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlpZiAod2l6YXJkUGFnZSAhPSBudWxsICYmIHR5cGUgIT0gbnVsbAotCQkJCQkJCQkJCSYmIHR5cGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCQlpZiAodHlwZS5lcXVhbHMoInJlcGxhY2UiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJd2l6YXJkRXh0ZW5kZXIKLQkJCQkJCQkJCQkJCS5hZGRSZXBsYWNlV2l6YXJkUGFnZUNvbnRyaWJ1dGlvbihuZXcgUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24oCi0JCQkJCQkJCQkJCQkJCXdpemFyZFBhZ2UsIHRhcmdldCkpOwotCQkJCQkJCQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscygibmV3IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCWJvb2xlYW4gaW5zZXJ0QWZ0ZXIgPSB0cnVlOwotCQkJCQkJCQkJCWlmIChpbnNlcnQgIT0gbnVsbAotCQkJCQkJCQkJCQkJJiYgaW5zZXJ0LmVxdWFscygiYmVmb3JlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQlpbnNlcnRBZnRlciA9IGZhbHNlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl3aXphcmRFeHRlbmRlcgotCQkJCQkJCQkJCQkJLmFkZE5ld1dpemFyZFBhZ2VDb250cmlidXRpb24obmV3IE5ld1dpemFyZFBhZ2VDb250cmlidXRpb24oCi0JCQkJCQkJCQkJCQkJCXdpemFyZFBhZ2UsIHRhcmdldCwKLQkJCQkJCQkJCQkJCQkJaW5zZXJ0QWZ0ZXIpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQotCQkJCQkJCWNoaWxkQ29uZmlnRWxlbWVudHMgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0Q2hpbGRyZW4oInB1Ymxpc2hlciIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKGNoaWxkQ29uZmlnRWxlbWVudHMubGVuZ3RoID4gMCkgewotCQkJCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGRDb25maWdFbGVtZW50ID0gY2hpbGRDb25maWdFbGVtZW50c1swXTsKLQkJCQkJCQkJUHVibGlzaE1hbmFnZXIgcHVibGlzaGVyID0gKFB1Ymxpc2hNYW5hZ2VyKSBjaGlsZENvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCQkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAkKLQkJCQkJCQkJd2l6YXJkRXh0ZW5kZXIuc2V0UHVibGlzaGVyKHB1Ymxpc2hlcik7Ci0JCQkJCQkJfQotCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIFB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYXRpb24gd2l6YXJkIGV4dGVuZGVyIGxvYWRlZCB2aWEgdGhlCi0JICogIm9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnB1Ymxpc2hDb25maWdXaXphcmQiIGV4dGVuc2lvbiBwb2ludC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIEV4cG9ydCBNU1Agd2l6YXJkIGV4dGVuZGVyIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIElQdWJsaXNoQ29uZmlnV2l6YXJkRXh0ZW5kZXIgZ2V0V2l6YXJkRXh0ZW5kZXIoKSB7Ci0JCXJldHVybiB3aXphcmRFeHRlbmRlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2I3MzhmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIG1hbmFnaW5nIHRoZSBwdWJsaXNoaW5nIFVJLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL1B1Ymxpc2hpbmdQcmVmZXJlbmNlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvUHVibGlzaGluZ1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlMjFhMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvUHVibGlzaGluZ1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5Db21tb25QcmVmUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkRlZmF1bHRDb250ZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBUaGUgUHJlZmVyZW5jZSBwYWdlIGZvciB0aGUgUHVibGlzaGluZyBVSS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqIEJ1Z3MgZml4ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+aHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1Njk1NzwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaGluZ1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQ29tbW9uUHJlZlBhZ2UgaW1wbGVtZW50cwotCQlJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIFNlbGVjdGlvbkxpc3RlbmVyLCBNb2RpZnlMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0KLQlwcml2YXRlIFRleHQgZGVzdGluYXRpb25QYXRoVGV4dDsKLQotCXByaXZhdGUgVGV4dCBmZWVkYmFja1VSTFRleHQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBleHRyYURlc2NyaXB0b3JJbmZvQ3RyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfREVTQ1JJUFRPUl9JTkZPID0gIm9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLmV4dHJhRGVzY3JpcHRvckluZm8iOyAvLyROT04tTkxTLTEkCQkKLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCS8vIENyZWF0ZSB0aGUgRGVzdGluYXRpb24gUGF0aCBncm91cC4KLQkJR3JvdXAgZGVzdGluYXRpb25Hcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJZGVzdGluYXRpb25Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJZGVzdGluYXRpb25Hcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZGVzdGluYXRpb25Hcm91cAotCQkJCS5zZXRUZXh0KFB1Ymxpc2hpbmdVSVJlc291cmNlcy5kZXN0aW5hdGlvbkRpcmVjdG9yeUdyb3VwX3RleHQpOwotCi0JCWNyZWF0ZUxhYmVsKGRlc3RpbmF0aW9uR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnByZWZlcmVuY2VQYWdlX2RlZmF1bHRQYXRoX3RleHQpOwotCQlkZXN0aW5hdGlvblBhdGhUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KGRlc3RpbmF0aW9uR3JvdXAsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlkZXN0aW5hdGlvblBhdGhUZXh0LnNldFRleHQoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0UHVibGlzaFBhdGgoKSk7Ci0JCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oZGVzdGluYXRpb25Hcm91cCwgU1dULk5PTkUpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuQlJPV1NFX0JVVFRPTl9URVhUKTsKLQotCQkvLyBDcmVhdGUgdGhlIFB1Ymxpc2hlZCBXZWJzaXRlIGdyb3VwLgotCQlHcm91cCB3ZWJTaXRlR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCXdlYlNpdGVHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJd2ViU2l0ZUdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl3ZWJTaXRlR3JvdXAuc2V0VGV4dChQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaFdlYlNpdGVHcm91cF90ZXh0KTsKLQotCQljcmVhdGVMYWJlbCh3ZWJTaXRlR3JvdXAsIFB1Ymxpc2hpbmdVSVJlc291cmNlcy5mZWVkYmFja1VSTExhYmVsX3RleHQpOwotCQlmZWVkYmFja1VSTFRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQod2ViU2l0ZUdyb3VwLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZmVlZGJhY2tVUkxUZXh0LnNldFRleHQoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0RmVlZGJhY2tVUkwoKSk7Ci0JCWNyZWF0ZUxhYmVsKHdlYlNpdGVHcm91cCwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ3JlYXRlIHRoZSBsYXlvdXQgZ3JvdXAuCi0JCUdyb3VwIGxheW91dEdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQlsYXlvdXRHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJbGF5b3V0R3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWxheW91dEdyb3VwLnNldFRleHQoUHVibGlzaGluZ1VJUmVzb3VyY2VzLmxheW91dEdyb3VwX3RleHQpOwotCi0JCWV4dHJhRGVzY3JpcHRvckluZm9DdHIgPSBuZXcgQnV0dG9uKGxheW91dEdyb3VwLCBTV1QuQ0hFQ0spOwotCQlleHRyYURlc2NyaXB0b3JJbmZvQ3RyCi0JCQkJLnNldFRleHQoUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hFeHRyYURlc2NyaXB0b3JJbmZvTGFiZWxfdGV4dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZXh0cmFEZXNjcmlwdG9ySW5mb0N0ci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZXh0cmFEZXNjcmlwdG9ySW5mb0N0ci5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RXh0cmFEZXNjcmlwdG9ySW5mbygpKTsKLQotCQlpbml0aWFsaXplVmFsdWVzKCk7Ci0KLQkJZGVzdGluYXRpb25QYXRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoIWlzUGF0aFZhbGlkKGRlc3RpbmF0aW9uUGF0aFRleHQuZ2V0VGV4dCgpKSkgewotCQkJCQlzZXRWYWxpZChmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2V0VmFsaWQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW9wZW5EaXJlY3RvcnlEaWFsb2coKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWluaXRpYWxpemVEZWZhdWx0cygpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJc3RvcmVWYWx1ZXMoKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2F2ZUFsbFByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBjb250cm9scyBiYWNrIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0UHVibGlzaFBhdGgoZGVzdGluYXRpb25QYXRoVGV4dC5nZXRUZXh0KCkKLQkJCQkudHJpbSgpKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuc2V0RmVlZGJhY2tVUkwoZmVlZGJhY2tVUkxUZXh0LmdldFRleHQoKS50cmltKCkpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRFeHRyYURlc2NyaXB0b3JJbmZvKGV4dHJhRGVzY3JpcHRvckluZm9DdHIKLQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCi0JCS8vIEZJWE1FISBSZXZpZXcgaW1wbGVtZW50YXRpb24uCi0JCS8vIGFsbG93IHRvIHBhc3MgdGhlIHZhbHVlIHRvIHRoZSBsaWJyYXJ5IGJyb3dzaW5nCi0JCS8vIFN5c3RlbS5zZXRQcm9wZXJ0eShFWFRSQV9ERVNDUklQVE9SX0lORk8sCi0JCS8vIGV4dHJhRGVzY3JpcHRvckluZm9DdHIuZ2V0U2VsZWN0aW9uKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQkJRGVmYXVsdENvbnRlbnRWYWxpZGF0b3IKLQkJCQkuc2V0RGVmYXVsdFNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycyhleHRyYURlc2NyaXB0b3JJbmZvQ3RyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0cygpIHsKLQkJZGVzdGluYXRpb25QYXRoVGV4dC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldERlZmF1bHRQdWJsaXNoUGF0aCgpKTsKLQkJZmVlZGJhY2tVUkxUZXh0Ci0JCQkJLnNldFRleHQoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0RGVmYXVsdEZlZWRiYWNrVVJMKCkpOwotCQlleHRyYURlc2NyaXB0b3JJbmZvQ3RyLnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZWZhdWx0RXh0cmFEZXNjcmlwdG9ySW5mbygpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBkZWZhdWx0VGV4dCkgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbkRpcmVjdG9yeURpYWxvZygpIHsKLQkJdHJ5IHsKLQkJCURpcmVjdG9yeURpYWxvZyBkZCA9IG5ldyBEaXJlY3RvcnlEaWFsb2coY29tcG9zaXRlLmdldFNoZWxsKCksCi0JCQkJCVNXVC5OT05FKTsKLQotCQkJU3RyaW5nIGRlc3RpbmF0aW9uID0gZGQub3BlbigpOwotCQkJaWYgKGRlc3RpbmF0aW9uICE9IG51bGwpIHsKLQkJCQlkZXN0aW5hdGlvblBhdGhUZXh0LnNldFRleHQoZGVzdGluYXRpb24pOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNQYXRoVmFsaWQoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmxlbmd0aCgpIDw9IDApIHsKLQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW52YWxpZFBhdGhFcnJvcl9tc2cpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlJUGF0aCBlY1BhdGggPSBQYXRoLmZyb21PU1N0cmluZyhwYXRoKTsKLQkJYm9vbGVhbiBpc1ZhbGlkID0gZWNQYXRoLmlzVmFsaWRQYXRoKHBhdGgpOwotCQlpZiAoIWlzVmFsaWQpIHsKLQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW52YWxpZFBhdGhFcnJvcl9tc2cpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoIVN0clV0aWwuaXNWYWxpZFB1Ymxpc2hQYXRoKHBhdGgpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRQYXRoQ2hhcnNFcnJvcl9tc2cpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL1B1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI2MDkyMjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBQdWJsaXNoaW5nIFVJIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wIGZpeCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjYzMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfRU5USVJFX0NPTkZJRyA9ICJwdWJsaXNoRW50aXJlQ29uZmlnIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gUHVibGlzaE9wdGlvbnMuVElUTEU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFOTkVSX0lNQUdFID0gUHVibGlzaE9wdGlvbnMuQkFOTkVSX0lNQUdFOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFCT1VUX0hUTUwgPSBQdWJsaXNoT3B0aW9ucy5BQk9VVF9IVE1MOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFRURCQUNLX1VSTCA9IFB1Ymxpc2hPcHRpb25zLkZFRURCQUNLX1VSTDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX0dMT1NTQVJZID0gUHVibGlzaE9wdGlvbnMuSU5DTFVERV9HTE9TU0FSWTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX0lOREVYID0gUHVibGlzaE9wdGlvbnMuSU5DTFVERV9JTkRFWDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19FWFRFUk5BTF9MSU5LUyA9IFB1Ymxpc2hPcHRpb25zLkNIRUNLX0VYVEVSTkFMX0xJTktTOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRfQlJPS0VOX0xJTktTID0gUHVibGlzaE9wdGlvbnMuQ09OVkVSVF9CUk9LRU5fTElOS1M7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElHSFRfV0VJR0hUX1RSRUUgPSBQdWJsaXNoT3B0aW9ucy5MSUdIVF9XRUlHSFRfVFJFRTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9ERVNDUklQVE9SX0lORk8gPSBQdWJsaXNoT3B0aW9ucy5FWFRSQV9ERVNDUklQVE9SX0lORk87Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9VTk9QRU5fQUNUSVZJVFlfREQgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5QVUJMSVNIX1VOT1BFTl9BQ1RJVklUWV9ERDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0FEX0ZPUl9BQ1RJVklUWV9FWFRFTlNJT04gPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5QVUJMSVNIX0FEX0ZPUl9BQ1RJVklUWV9FWFRFTlNJT047Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9QQVRIID0gUHVibGlzaE9wdGlvbnMuUFVCTElTSF9QQVRIOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfU1RBVElDX1dFQl9TSVRFID0gInB1Ymxpc2hTdGF0aWNXZWJTaXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfU0VSVkxFVF9TRUFSQ0ggPSAiaW5jbHVkZVNlcnZsZXRTZWFyY2giOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCQVBQX05BTUUgPSBQdWJsaXNoT3B0aW9ucy5XRUJBUFBfTkFNRTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX1NFQVJDSCA9ICJpbmNsdWRlU2VhcmNoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOSVRJQUxJWkVEID0gImluaXRpYWxpemVkIjsgLy8kTk9OLU5MUy0xJAkKLQotCS8vIFRoZSBwbHVnLWluIHNwZWNpZmljIHByZWZlcmVuY2Ugc3RvcmUuCi0JcHJpdmF0ZSBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSBQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFRpdGxlID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0QmFubmVySW1hZ2UgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRBYm91dEhUTUwgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRGZWVkYmFja1VSTCA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFB1Ymxpc2hQYXRoID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCS8vIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFBVQkxJU0hfRU5USVJFX0NPTkZJRywgdHJ1ZSk7Ci0KLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoVElUTEUsIGdldERlZmF1bHRUaXRsZSgpKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoQkFOTkVSX0lNQUdFLCBnZXREZWZhdWx0QmFubmVySW1hZ2UoKSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KEFCT1VUX0hUTUwsIGdldERlZmF1bHRBYm91dEhUTUwoKSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KEZFRURCQUNLX1VSTCwgZ2V0RGVmYXVsdEZlZWRiYWNrVVJMKCkpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChJTkNMVURFX0dMT1NTQVJZLCB0cnVlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoSU5DTFVERV9JTkRFWCwgdHJ1ZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KENIRUNLX0VYVEVSTkFMX0xJTktTLCB0cnVlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoQ09OVkVSVF9CUk9LRU5fTElOS1MsIHRydWUpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChQVUJMSVNIX1VOT1BFTl9BQ1RJVklUWV9ERCwgdHJ1ZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTiwgdHJ1ZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KExJR0hUX1dFSUdIVF9UUkVFLCB0cnVlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoRVhUUkFfREVTQ1JJUFRPUl9JTkZPLAotCQkJCWdldERlZmF1bHRFeHRyYURlc2NyaXB0b3JJbmZvKCkpOwotCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFBVQkxJU0hfUEFUSCwgZ2V0RGVmYXVsdFB1Ymxpc2hQYXRoKCkpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChQVUJMSVNIX1NUQVRJQ19XRUJfU0lURSwgdHJ1ZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KElOQ0xVREVfU0VSVkxFVF9TRUFSQ0gsIHRydWUpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChXRUJBUFBfTkFNRSwgIiIpOyAvLyROT04tTkxTLTEkCQkJCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KElOQ0xVREVfU0VBUkNILCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIGVudGlyZSBjb25maWd1cmF0aW9uIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFB1Ymxpc2hFbnRpcmVDb25maWcoU3RyaW5nIGNvbmZpZ05hbWUpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdOYW1lKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnTmFtZSkKLQkJCQkJKyBQVUJMSVNIX0VOVElSRV9DT05GSUcpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFBVQkxJU0hfRU5USVJFX0NPTkZJRyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIGVudGlyZSBjb25maWd1cmF0aW9ucHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnTmFtZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQdWJsaXNoRW50aXJlQ29uZmlnKFN0cmluZyBjb25maWdOYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ05hbWUpCi0JCQkJKyBQVUJMSVNIX0VOVElSRV9DT05GSUcsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHRpdGxlIGZvciBhIHB1Ymxpc2hlZCB3ZWJzaXRlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdGl0bGUgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0VGl0bGUoKSB7Ci0JCWlmIChkZWZhdWx0VGl0bGUgPT0gbnVsbCkgewotCQkJU3RyaW5nIHVybCA9IFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nKCJ0aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAodXJsID09IG51bGwgfHwgdXJsLmxlbmd0aCgpID09IDAgfHwgdXJsLnN0YXJ0c1dpdGgoIlsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdXJsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWRlZmF1bHRUaXRsZSA9IHVybDsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFRpdGxlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHdlYiBzaXRlIHRpdGxlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIEByZXR1cm4gdGhlIHdlYiBzaXRlIHRpdGxlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGl0bGUoU3RyaW5nIGNvbmZpZ05hbWUpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdOYW1lKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdOYW1lKSArIFRJVExFKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKFRJVExFKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHdlYiBzaXRlIHRpdGxlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgdGhlIHdlYiBzaXRlIHRpdGxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFRpdGxlKFN0cmluZyBjb25maWdOYW1lLCBTdHJpbmcgdGl0bGUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnTmFtZSkgKyBUSVRMRSwgdGl0bGUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgYmFubmVyIGltYWdlIGZvciBhIHB1Ymxpc2hlZCB3ZWJzaXRlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgYmFubmVyIGltYWdlIGZvciBhIHB1Ymxpc2hlZCB3ZWJzaXRlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdEJhbm5lckltYWdlKCkgewotCQlpZiAoZGVmYXVsdEJhbm5lckltYWdlID09IG51bGwpIHsKLQkJCVN0cmluZyBpbWFnZSA9IFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nKAotCQkJCQkiYmFubmVySW1hZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGltYWdlID09IG51bGwgfHwgaW1hZ2UubGVuZ3RoKCkgPT0gMCB8fCBpbWFnZS5zdGFydHNXaXRoKCJbIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWRlZmF1bHRCYW5uZXJJbWFnZSA9IGltYWdlOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0QmFubmVySW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYmFubmVyIGltYWdlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIEByZXR1cm4gdGhlIGJhbm5lciBpbWFnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJhbm5lckltYWdlKFN0cmluZyBjb25maWdOYW1lKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnTmFtZSkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnTmFtZSkKLQkJCQkJKyBCQU5ORVJfSU1BR0UpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoQkFOTkVSX0lNQUdFKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhbm5lciBpbWFnZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdOYW1lCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiAgICAgICAgICAgIHRoZSBiYW5uZXIgaW1hZ2UgVVJMCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEJhbm5lckltYWdlKFN0cmluZyBjb25maWdOYW1lLCBTdHJpbmcgaW1hZ2UpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnTmFtZSkgKyBCQU5ORVJfSU1BR0UsCi0JCQkJaW1hZ2UpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgYWJvdXQgSFRNTCBmb3IgYSBwdWJsaXNoZWQgd2Vic2l0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGFib3V0IEhUTUwgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0QWJvdXRIVE1MKCkgewotCQlpZiAoZGVmYXVsdEFib3V0SFRNTCA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgZmlsZSA9IFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldFN0cmluZygiYWJvdXRIVE1MIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChmaWxlID09IG51bGwgfHwgZmlsZS5sZW5ndGgoKSA9PSAwIHx8IGZpbGUuc3RhcnRzV2l0aCgiWyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlmaWxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWRlZmF1bHRBYm91dEhUTUwgPSBmaWxlOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0QWJvdXRIVE1MOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFib3V0IEhUTUwgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnTmFtZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1lCi0JICogQHJldHVybiB0aGUgYWJvdXQgSFRNTCBmaWxlIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBYm91dEhUTUwoU3RyaW5nIGNvbmZpZ05hbWUpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdOYW1lKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdOYW1lKQotCQkJCQkrIEFCT1VUX0hUTUwpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoQUJPVVRfSFRNTCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhYm91dCBIVE1MIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgYWJvdXQgSFRNTCBmaWxlIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QWJvdXRIVE1MKFN0cmluZyBjb25maWdOYW1lLCBTdHJpbmcgcGF0aCkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdOYW1lKSArIEFCT1VUX0hUTUwsIHBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgZmVlZGJhY2sgVVJMIGZvciBhIHB1Ymxpc2hlZCB3ZWJzaXRlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgZmVlZGJhY2sgVVJMIGZvciBhIHB1Ymxpc2hlZCB3ZWJzaXRlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdEZlZWRiYWNrVVJMKCkgewotCQlpZiAoZGVmYXVsdEZlZWRiYWNrVVJMID09IG51bGwpIHsKLQkJCWRlZmF1bHRGZWVkYmFja1VSTCA9ICJodHRwOi8vd3d3LnB1Ymxpc2hlZF93ZWJzaXRlLmNvbS9mZWVkYmFjayI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEZlZWRiYWNrVVJMOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGZlZWRiYWNrIFVSTCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZlZWRiYWNrIFVSTAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZlZWRiYWNrVVJMKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhGRUVEQkFDS19VUkwpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZlZWRiYWNrIFVSTCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIHRoZSBmZWVkYmFjayBVUkwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmVlZGJhY2tVUkwoU3RyaW5nIHVybCkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoRkVFREJBQ0tfVVJMLCB1cmwpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGZlZWRiYWNrIFVSTCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdOYW1lCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBmZWVkYmFjayBVUkwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGZWVkYmFja1VSTChTdHJpbmcgY29uZmlnTmFtZSkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ05hbWUpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ05hbWUpCi0JCQkJCSsgRkVFREJBQ0tfVVJMKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKEZFRURCQUNLX1VSTCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmZWVkYmFjayBVUkwgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnTmFtZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1lCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgdGhlIGZlZWRiYWNrIFVSTAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGZWVkYmFja1VSTChTdHJpbmcgY29uZmlnTmFtZSwgU3RyaW5nIHVybCkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdOYW1lKSArIEZFRURCQUNLX1VSTCwgdXJsKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbmNsdWRlIGdsb3NzYXJ5IHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEluY2x1ZGVHbG9zc2FyeShTdHJpbmcgY29uZmlnTmFtZSkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ05hbWUpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdOYW1lKQotCQkJCQkrIElOQ0xVREVfR0xPU1NBUlkpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKElOQ0xVREVfR0xPU1NBUlkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5jbHVkZSBnbG9zc2FyeSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdOYW1lCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEluY2x1ZGVHbG9zc2FyeShTdHJpbmcgY29uZmlnTmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdOYW1lKSArIElOQ0xVREVfR0xPU1NBUlksCi0JCQkJdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGluY2x1ZGUgaW5kZXggcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnTmFtZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1lCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0SW5jbHVkZUluZGV4KFN0cmluZyBjb25maWdOYW1lKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnTmFtZSkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ05hbWUpCi0JCQkJCSsgSU5DTFVERV9JTkRFWCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oSU5DTFVERV9JTkRFWCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbmNsdWRlIGluZGV4IHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5jbHVkZUluZGV4KFN0cmluZyBjb25maWdOYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ05hbWUpICsgSU5DTFVERV9JTkRFWCwKLQkJCQl2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY2hlY2sgZXh0ZXJuYWwgbGlua3MgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnTmFtZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1lCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Q2hlY2tFeHRlcm5hbExpbmtzKFN0cmluZyBjb25maWdOYW1lKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnTmFtZSkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ05hbWUpCi0JCQkJCSsgQ0hFQ0tfRVhURVJOQUxfTElOS1MpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKENIRUNLX0VYVEVSTkFMX0xJTktTKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNoZWNrIGV4dGVybmFsIGxpbmtzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2hlY2tFeHRlcm5hbExpbmtzKFN0cmluZyBjb25maWdOYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ05hbWUpCi0JCQkJKyBDSEVDS19FWFRFUk5BTF9MSU5LUywgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnZlcnQgYnJva2VuIGxpbmtzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldENvbnZlcnRCcm9rZW5MaW5rcyhTdHJpbmcgY29uZmlnTmFtZSkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ05hbWUpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdOYW1lKQotCQkJCQkrIENPTlZFUlRfQlJPS0VOX0xJTktTKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihDT05WRVJUX0JST0tFTl9MSU5LUyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb252ZXJ0IGJyb2tlbiBsaW5rcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdOYW1lCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENvbnZlcnRCcm9rZW5MaW5rcyhTdHJpbmcgY29uZmlnTmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdOYW1lKQotCQkJCSsgQ09OVkVSVF9CUk9LRU5fTElOS1MsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIHVub3BlbiBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbXMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnTmFtZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1lCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0UHVibGlzaFVub3BlbkFjdGl2aXR5ZGQoU3RyaW5nIGNvbmZpZ05hbWUpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdOYW1lKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnTmFtZSkKLQkJCQkJKyBQVUJMSVNIX1VOT1BFTl9BQ1RJVklUWV9ERCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oUFVCTElTSF9VTk9QRU5fQUNUSVZJVFlfREQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCB1bm9wZW4gYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHVibGlzaFVub3BlbkFjdGl2aXR5ZGQoU3RyaW5nIGNvbmZpZ05hbWUsCi0JCQlib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ05hbWUpCi0JCQkJKyBQVUJMSVNIX1VOT1BFTl9BQ1RJVklUWV9ERCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggYWN0aXZpeSBkaWFncmFtcyBmb3IgYmFzZSBhY3Rpdml0aWVzIHdpdGggdW5tb2RpZmllZAotCSAqIGV4dGVuc2lvbiBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdOYW1lCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihTdHJpbmcgY29uZmlnTmFtZSkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ05hbWUpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdOYW1lKQotCQkJCQkrIFBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oUFVCTElTSF9BRF9GT1JfQUNUSVZJVFlfRVhURU5TSU9OKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggYWN0aXZpeSBkaWFncmFtcyBmb3IgYmFzZSBhY3Rpdml0aWVzIHdpdGggdW5tb2RpZmllZAotCSAqIGV4dGVuc2lvbiBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdOYW1lCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKFN0cmluZyBjb25maWdOYW1lLAotCQkJYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdOYW1lKQotCQkJCSsgUFVCTElTSF9BRF9GT1JfQUNUSVZJVFlfRVhURU5TSU9OLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlnaHQgd2VpZ2h0IHRyZWUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnTmFtZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1lCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0TGlnaHRXZWlnaHRUcmVlKFN0cmluZyBjb25maWdOYW1lKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnTmFtZSkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ05hbWUpCi0JCQkJCSsgTElHSFRfV0VJR0hUX1RSRUUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKExJR0hUX1dFSUdIVF9UUkVFKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxpZ2h0IHdlaWdodCB0cmVlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TGlnaHRXZWlnaHRUcmVlKFN0cmluZyBjb25maWdOYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ05hbWUpICsgTElHSFRfV0VJR0hUX1RSRUUsCi0JCQkJdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgZXh0cmEgZGVzY3JpcHRvciBpbmZvIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RGVmYXVsdEV4dHJhRGVzY3JpcHRvckluZm8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGV4dHJhIGRlc2NyaXB0b3IgaW5mbyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RXh0cmFEZXNjcmlwdG9ySW5mbygpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKEVYVFJBX0RFU0NSSVBUT1JfSU5GTyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVmYXVsdCBleHRyYSBkZXNjcmlwdG9yIGluZm8gcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEV4dHJhRGVzY3JpcHRvckluZm8oYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoRVhUUkFfREVTQ1JJUFRPUl9JTkZPLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZXh0cmEgZGVzY3JpcHRvciBpbmZvIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEV4dHJhRGVzY3JpcHRvckluZm8oU3RyaW5nIGNvbmZpZ05hbWUpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdOYW1lKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnTmFtZSkKLQkJCQkJKyBFWFRSQV9ERVNDUklQVE9SX0lORk8pOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKEVYVFJBX0RFU0NSSVBUT1JfSU5GTyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBleHRyYSBkZXNjcmlwdG9yIGluZm8gcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnTmFtZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRFeHRyYURlc2NyaXB0b3JJbmZvKFN0cmluZyBjb25maWdOYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ05hbWUpCi0JCQkJKyBFWFRSQV9ERVNDUklQVE9SX0lORk8sIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHBhdGggZm9yIGEgcHVibGlzaGVkIHdlYiBzaXRlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgcGF0aCBmb3IgYSBwdWJsaXNoZWQgd2ViIHNpdGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFB1Ymxpc2hQYXRoKCkgewotCQlpZiAoZGVmYXVsdFB1Ymxpc2hQYXRoID09IG51bGwpIHsKLQkJCVN0cmluZyB1c2VySG9tZSA9IFN5c3RlbQotCQkJCQkuZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpLnJlcGxhY2UoJ1xcJywgJy8nKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHBhdGggPSBQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZygKLQkJCQkJInB1Ymxpc2hQYXRoIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC5sZW5ndGgoKSA9PSAwIHx8IHBhdGguc3RhcnRzV2l0aCgiWyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlwYXRoID0gdXNlckhvbWUgKyAiL3B1Ymxpc2giOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKHBhdGguc3RhcnRzV2l0aCgiPHVzZXIuaG9tZT4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcGF0aCA9IHVzZXJIb21lICsgcGF0aC5zdWJzdHJpbmcoMTEpOwotCQkJfQotCQkJaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKS5lcXVhbHMoIlxcIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcGF0aCA9IHBhdGgucmVwbGFjZSgnLycsICdcXCcpOwotCQkJfQotCi0JCQlpbnQgaWR4ID0gLTE7Ci0JCQlpZiAoKGlkeCA9IHBhdGguaW5kZXhPZigiPGFwcC5uYW1lPiIpKSA+PSAwKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgYXBwTmFtZVByb3BlciA9IExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCQkuZ2V0QXBwbGljYXRpb25TaG9ydE5hbWUoKTsKLQkJCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgaWR4KSArIGFwcE5hbWVQcm9wZXIKLQkJCQkJCSsgcGF0aC5zdWJzdHJpbmcoaWR4ICsgMTApOwotCQkJfQotCi0JCQlkZWZhdWx0UHVibGlzaFBhdGggPSBwYXRoOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0UHVibGlzaFBhdGg7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBwYXRoIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHVibGlzaCBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHVibGlzaFBhdGgoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKFBVQkxJU0hfUEFUSCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBwYXRoIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwdWJsaXNoIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHVibGlzaFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFBVQkxJU0hfUEFUSCwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBwYXRoIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIEByZXR1cm4gdGhlIHB1Ymxpc2ggcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFB1Ymxpc2hQYXRoKFN0cmluZyBjb25maWdOYW1lKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnTmFtZSkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnTmFtZSkKLQkJCQkJKyBQVUJMSVNIX1BBVEgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoUFVCTElTSF9QQVRIKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggcGF0aCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdOYW1lCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIHB1Ymxpc2ggcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQdWJsaXNoUGF0aChTdHJpbmcgY29uZmlnTmFtZSwgU3RyaW5nIHBhdGgpIHsKLQkJcHJlZlN0b3JlCi0JCQkJLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnTmFtZSkgKyBQVUJMSVNIX1BBVEgsIHBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggc3RhdGljIHdlYiBzaXRlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFB1Ymxpc2hTdGF0aWNXZWJTaXRlKFN0cmluZyBjb25maWdOYW1lKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnTmFtZSkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ05hbWUpCi0JCQkJCSsgUFVCTElTSF9TVEFUSUNfV0VCX1NJVEUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFBVQkxJU0hfU1RBVElDX1dFQl9TSVRFKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggc3RhdGljIHdlYiBzaXRlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHVibGlzaFN0YXRpY1dlYlNpdGUoU3RyaW5nIGNvbmZpZ05hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnTmFtZSkKLQkJCQkrIFBVQkxJU0hfU1RBVElDX1dFQl9TSVRFLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5jbHVkZSBhcHBsZXQgc2VhcmNoIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEluY2x1ZGVTZXJ2bGV0U2VhcmNoKFN0cmluZyBjb25maWdOYW1lKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnTmFtZSkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ05hbWUpCi0JCQkJCSsgSU5DTFVERV9TRVJWTEVUX1NFQVJDSCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oSU5DTFVERV9TRVJWTEVUX1NFQVJDSCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbmNsdWRlIHNlcnZsZXQgc2VhcmNoIHByZWZlcmVuY2UgdmFsdWUuLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdOYW1lCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEluY2x1ZGVTZXJ2bGV0U2VhcmNoKFN0cmluZyBjb25maWdOYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ05hbWUpCi0JCQkJKyBJTkNMVURFX1NFUlZMRVRfU0VBUkNILCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5jbHVkZSBzZWFyY2ggcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnTmFtZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1lCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0SW5jbHVkZVNlYXJjaChTdHJpbmcgY29uZmlnTmFtZSkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ05hbWUpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdOYW1lKQotCQkJCQkrIElOQ0xVREVfU0VBUkNIKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihJTkNMVURFX1NFQVJDSCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbmNsdWRlIHNlYXJjaCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdOYW1lCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEluY2x1ZGVTZWFyY2goU3RyaW5nIGNvbmZpZ05hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnTmFtZSkgKyBJTkNMVURFX1NFQVJDSCwKLQkJCQl2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgd2ViIGFwcGxpY2F0aW9uIG5hbWUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnTmFtZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1lCi0JICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdlYkFwcE5hbWUoU3RyaW5nIGNvbmZpZ05hbWUpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdOYW1lKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdOYW1lKQotCQkJCQkrIFdFQkFQUF9OQU1FKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKFdFQkFQUF9OQU1FKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHdlYiBhcHBsaWNhdGlvbiBuYW1lIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgd2ViIGFwcGxpY2F0aW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V2ViQXBwTmFtZShTdHJpbmcgY29uZmlnTmFtZSwgU3RyaW5nIG5hbWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnTmFtZSkgKyBXRUJBUFBfTkFNRSwgbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMgcHJlZmVyZW5jZSBwcmVmaXguCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgcHJlZmVyZW5jZSBwcmVmaXggYXNzaWduZWQgdG8gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb25maWdQcmVmUHJlZml4KFN0cmluZyBjb25maWdOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIGNvbmZpZ05hbWUpOwotCQkJcmV0dXJuIGNvbmZpZ05hbWUgKyAiLiIgKyBjb25maWcuZ2V0R3VpZCgpICsgIi4iOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29uZmlndXJhdGlvbiBzcGVjaWZpYyBwcmVmZXJlbmNlcyBpbml0aWFsaXplZCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdOYW1lCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChTdHJpbmcgY29uZmlnTmFtZSkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdOYW1lKQotCQkJCSsgSU5JVElBTElaRUQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMgcHJlZmVyZW5jZXMgaW5pdGlhbGl6ZWQgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnTmFtZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoU3RyaW5nIGNvbmZpZ05hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlCi0JCQkJLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnTmFtZSkgKyBJTklUSUFMSVpFRCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIGFsbCB0aGUgcHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVBbGxQcmVmZXJlbmNlcygpIHsKLQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyNThjMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcHJlZmVyZW5jZSBzdXBwb3J0IGZvciB0aGUgcHVibGlzaGluZyBVSS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL0lQdWJsaXNoQ29uZmlnV2l6YXJkRXh0ZW5kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvSVB1Ymxpc2hDb25maWdXaXphcmRFeHRlbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMGY2ZmZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvSVB1Ymxpc2hDb25maWdXaXphcmRFeHRlbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuSVdpemFyZEV4dGVuZGVyOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGFuIGV4dGVuZGVyIG9mIHRoZSBQdWJsaXNoIENvbmZpZ3VyYXRpb24gd2l6YXJkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHVibGlzaENvbmZpZ1dpemFyZEV4dGVuZGVyIGV4dGVuZHMgSVdpemFyZEV4dGVuZGVyIHsKLQotCS8qKgotCSAqIEdpdmVzIHRoZSB3aXphcmQgZXh0ZW5kZXIgYSBjaGFuY2UgdG8gcGVyZm9ybSBzb21lIGluaXRpYWxpemF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB3aXphcmRQYWdlcwotCSAqICAgICAgICAgICAgYSBjb2xsZWN0aW9uIG9mIDxjb2RlPklXaXphcmRQYWdlPC9jb2RlPiBvd25lZCBieSB0aGUgd2l6YXJkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChMaXN0IHdpemFyZFBhZ2VzKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIHVzZXIgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgdXNlciBzZWxlY3RlZCBjb25maWd1cmF0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb25maWdOYW1lKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBwdWJsaXNoaW5nIG9wdGlvbnMuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPlB1Ymxpc2hPcHRpb25zPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wdGlvbnMgZ2V0UHVibGlzaGluZ09wdGlvbnMoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbmZpZ3VyYXRpb24gcHVibGlzaGVyLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoTWFuYWdlciBnZXRQdWJsaXNoZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbmZpZ3VyYXRpb24gcHVibGlzaGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hlcihQdWJsaXNoTWFuYWdlciBwdWJsaXNoZXIpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hDb25maWdXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvUHVibGlzaENvbmZpZ1dpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZjdkYzE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvUHVibGlzaENvbmZpZ1dpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLmludGVybmFsLndpemFyZHMuUHVibGlzaENvbmZpZ1dpemFyZEV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMuUHVibGlzaGluZ1VJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZDsKLQotLyoqCi0gKiBBIHdpemFyZCB0aGF0IGd1aWRlcyB0aGUgdXNlciB0byBwdWJsaXNoIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdG8gYSB3ZWIKLSAqIHNpdGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaENvbmZpZ1dpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfSUQgPSBQdWJsaXNoQ29uZmlnV2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQotCS8vIFRoZSBzZWxlY3QgY29uZmlndXJhdGlvbiB3aXphcmQgcGFnZS4KLQlwcm90ZWN0ZWQgU2VsZWN0Q29uZmlnUGFnZSBzZWxlY3RDb25maWdQYWdlOwotCi0JLy8gVGhlIHNlbGVjdCBjb25maWZ1cmF0aW9uIGNvbnRlbnQgd2l6YXJkIHBhZ2UuCi0JcHJvdGVjdGVkIFNlbGVjdENvbnRlbnRQYWdlIHNlbGVjdENvbnRlbnRQYWdlOwotCi0JLy8gVGhlIHNlbGVjdCBwdWJsaXNoaW5nIG9wdGlvbnMgd2l6YXJkIHBhZ2UuCi0JcHJvdGVjdGVkIFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSBzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2U7Ci0KLQkvLyBUaGUgc2VsZWN0IGRlc3RpbmF0aW9uIHdpemFyZCBwYWdlLgotCXByb3RlY3RlZCBTZWxlY3REZXN0aW5hdGlvblBhZ2Ugc2VsZWN0RGVzdGluYXRpb25QYWdlOwotCi0JLy8gQW4gZXh0ZW5kZXIgb2YgdGhpcyB3aXphcmQuCi0JcHJvdGVjdGVkIElQdWJsaXNoQ29uZmlnV2l6YXJkRXh0ZW5kZXIgd2l6YXJkRXh0ZW5kZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoQ29uZmlnV2l6YXJkKCkgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ1dpemFyZF90aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXdpemFyZEV4dGVuZGVyID0gUHVibGlzaENvbmZpZ1dpemFyZEV4dGVuc2lvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRXaXphcmRFeHRlbmRlcigpOwotCQlpZiAod2l6YXJkRXh0ZW5kZXIgIT0gbnVsbCkgewotCQkJd2l6YXJkRXh0ZW5kZXIuaW5pdCh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLmFkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJaWYgKHdpemFyZEV4dGVuZGVyID09IG51bGwpIHsKLQkJCXNlbGVjdENvbmZpZ1BhZ2UgPSBuZXcgU2VsZWN0Q29uZmlnUGFnZSgpOwotCQkJc2VsZWN0Q29udGVudFBhZ2UgPSBuZXcgU2VsZWN0Q29udGVudFBhZ2UoKTsKLQkJCXNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSA9IG5ldyBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UoKTsKLQkJCXNlbGVjdERlc3RpbmF0aW9uUGFnZSA9IG5ldyBTZWxlY3REZXN0aW5hdGlvblBhZ2UoKTsKLQkJCXN1cGVyLmFkZFBhZ2Uoc2VsZWN0Q29uZmlnUGFnZSk7Ci0JCQlzdXBlci5hZGRQYWdlKHNlbGVjdENvbnRlbnRQYWdlKTsKLQkJCXN1cGVyLmFkZFBhZ2Uoc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKTsKLQkJCXN1cGVyLmFkZFBhZ2Uoc2VsZWN0RGVzdGluYXRpb25QYWdlKTsKLQkJfSBlbHNlIHsKLQkJCUxpc3Q8SVdpemFyZFBhZ2U+IHdpemFyZFBhZ2VzID0gbmV3IEFycmF5TGlzdDxJV2l6YXJkUGFnZT4oKTsKLQotCQkJSVdpemFyZFBhZ2UgcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShTZWxlY3RDb25maWdQYWdlLlBBR0VfTkFNRSk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHBhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3RDb25maWdQYWdlID0gbmV3IFNlbGVjdENvbmZpZ1BhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQoc2VsZWN0Q29uZmlnUGFnZSk7Ci0JCQl9Ci0KLQkJCXBhZ2UgPSB3aXphcmRFeHRlbmRlcgotCQkJCQkuZ2V0UmVwbGFjZVdpemFyZFBhZ2UoU2VsZWN0Q29udGVudFBhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdENvbnRlbnRQYWdlID0gbmV3IFNlbGVjdENvbnRlbnRQYWdlKCk7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHNlbGVjdENvbnRlbnRQYWdlKTsKLQkJCX0KLQotCQkJcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSA9IG5ldyBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQoc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKTsKLQkJCX0KLQotCQkJcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShTZWxlY3REZXN0aW5hdGlvblBhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdERlc3RpbmF0aW9uUGFnZSA9IG5ldyBTZWxlY3REZXN0aW5hdGlvblBhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQoc2VsZWN0RGVzdGluYXRpb25QYWdlKTsKLQkJCX0KLQotCQkJTGlzdCBjb250cmlidXRpb25zID0gd2l6YXJkRXh0ZW5kZXIuZ2V0TmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbnMoKTsKLQkJCWlmIChjb250cmlidXRpb25zICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29udHJpYnV0aW9ucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU5ld1dpemFyZFBhZ2VDb250cmlidXRpb24gZXhldG5zaW9uID0gKE5ld1dpemFyZFBhZ2VDb250cmlidXRpb24pIGl0Ci0JCQkJCQkJLm5leHQoKTsKLQkJCQkJcGFnZSA9IChJV2l6YXJkUGFnZSkgZXhldG5zaW9uLmdldFdpemFyZFBhZ2UoKTsKLQkJCQkJaW50IGluZGV4ID0gd2l6YXJkUGFnZXMuaW5kZXhPZihwYWdlLmdldE5hbWUoKSk7Ci0JCQkJCWlmIChpbmRleCA9PSAtMSkgewotCQkJCQkJd2l6YXJkUGFnZXMuYWRkKHBhZ2UpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKGV4ZXRuc2lvbi5nZXRJbnNlcnRBZnRlcigpKSB7Ci0JCQkJCQkJd2l6YXJkUGFnZXMuYWRkKGluZGV4ICsgMSwgcGFnZSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXdpemFyZFBhZ2VzLmFkZChpbmRleCwgcGFnZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB3aXphcmRQYWdlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJSVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IChJV2l6YXJkUGFnZSkgaXQubmV4dCgpOwotCQkJCXN1cGVyLmFkZFBhZ2Uod2l6YXJkUGFnZSk7Ci0JCQl9Ci0KLQkJCXdpemFyZEV4dGVuZGVyLmluaXQod2l6YXJkUGFnZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkJCSJmdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJaWYgKHdpemFyZEV4dGVuZGVyICE9IG51bGwgJiYgd2l6YXJkRXh0ZW5kZXIuY2FuRmluaXNoKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdXBlci5jYW5GaW5pc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCVB1Ymxpc2hNYW5hZ2VyIHB1Ymxpc2hlciA9IG51bGw7Ci0JCVN0cmluZyBjb25maWdOYW1lID0gbnVsbDsKLQotCQl0cnkgewotCQkJUHVibGlzaE9wdGlvbnMgb3B0aW9ucyA9IG51bGw7Ci0KLQkJCWlmICh3aXphcmRFeHRlbmRlciAhPSBudWxsKSB7Ci0JCQkJY29uZmlnTmFtZSA9IHdpemFyZEV4dGVuZGVyLmdldENvbmZpZ05hbWUoKTsKLQkJCQlvcHRpb25zID0gd2l6YXJkRXh0ZW5kZXIuZ2V0UHVibGlzaGluZ09wdGlvbnMoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29uZmlnTmFtZSA9IHNlbGVjdENvbmZpZ1BhZ2UuZ2V0Q29uZmlnTmFtZSgpOwotCQkJCW9wdGlvbnMgPSBnZXRQdWJsaXNoaW5nT3B0aW9ucygpOwotCQkJfQotCi0JCQlpZiAoY2hlY2tBbmRDcmVhdGVEaXIob3B0aW9ucykpIHsKLQkJCQlwdWJsaXNoZXIgPSAod2l6YXJkRXh0ZW5kZXIgIT0gbnVsbCkgPyB3aXphcmRFeHRlbmRlcgotCQkJCQkJLmdldFB1Ymxpc2hlcigpIDogbmV3IFB1Ymxpc2hNYW5hZ2VyKCk7Ci0KLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwgY29uZmlnTmFtZSk7Ci0KLQkJCQlwdWJsaXNoZXIuaW5pdChvcHRpb25zLmdldFB1YmxpY2F0aW9uUGF0aCgpLCBjb25maWcsIG9wdGlvbnMpOwotCQkJCVB1Ymxpc2hpbmdPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFB1Ymxpc2hpbmdPcGVyYXRpb24oCi0JCQkJCQlwdWJsaXNoZXIpOwotCi0JCQkJUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZyBkbGcgPSBuZXcgUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZygKLQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHB1Ymxpc2hlcgotCQkJCQkJCQkuZ2V0Vmlld0J1aWxkZXIoKSk7Ci0KLQkJCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKG9wZXJhdGlvbiwgZGxnLCB0cnVlLAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGUpOwotCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSAhPSBudWxsKSB7Ci0JCQkJc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlLnNhdmVQcmVmZXJlbmNlcygpOwotCQkJCXNlbGVjdERlc3RpbmF0aW9uUGFnZS5zYXZlUHJlZmVyZW5jZXMoKTsKLQkJCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnTmFtZSwKLQkJCQkJCXRydWUpOwotCQkJfQotCQkJaWYgKHB1Ymxpc2hlciAhPSBudWxsKSB7Ci0JCQkJcHVibGlzaGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHB1Ymxpc2hpbmcgb3B0aW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB1c2VyIHNwZWNpZmllZCBwdWJsaXNoaW5nIG9wdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIFB1Ymxpc2hPcHRpb25zIGdldFB1Ymxpc2hpbmdPcHRpb25zKCkgewotCQlQdWJsaXNoT3B0aW9ucyBvcHRpb25zID0gc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlCi0JCQkJLmdldFB1Ymxpc2hpbmdPcHRpb25zKCk7Ci0KLQkJYm9vbGVhbiBwdWJsaXNoQ29uZmlnID0gc2VsZWN0Q29udGVudFBhZ2UuZ2V0UHVibGlzaENvbmZpZ1NlbGVjdGlvbigpOwotCQlvcHRpb25zLnNldFB1Ymxpc2hDb25maWd1cmF0aW9uKHB1Ymxpc2hDb25maWcpOwotCQlvcHRpb25zLnNldFB1Ymxpc2hQcm9jZXNzKCFwdWJsaXNoQ29uZmlnKTsKLQkJb3B0aW9ucy5zZXRQdWJsaWNhdGlvblBhdGgoc2VsZWN0RGVzdGluYXRpb25QYWdlLmdldFB1Ymxpc2hEaXJlY3RvcnkoKSk7Ci0KLQkJaWYgKCFzZWxlY3REZXN0aW5hdGlvblBhZ2UuZ2V0U3RhdGljV2ViU2l0ZVNlbGVjdGlvbigpKSB7Ci0JCQlvcHRpb25zLnNlcnZlclNpZGVTZWFyY2ggPSBzZWxlY3REZXN0aW5hdGlvblBhZ2UKLQkJCQkJLmdldEluY2x1ZGVTZWFyY2hTZWxlY3Rpb24oKTsKLQkJCW9wdGlvbnMud2ViQXBwTmFtZSA9IHNlbGVjdERlc3RpbmF0aW9uUGFnZS5nZXRXZWJBcHBOYW1lKCk7Ci0JCX0KLQotCQlyZXR1cm4gb3B0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgYW5kIGNyZWF0ZXMgdGhlIGRlc3RpbmF0aW9uIHBhdGggd2hlcmUgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogd2lsbCBiZSBwdWJsaXNoZWQuCi0JICogCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiAgICAgICAgICAgIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkZXN0aW5hdGlvbiBwYXRoIGlzIHZhbGlkLAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrQW5kQ3JlYXRlRGlyKFB1Ymxpc2hPcHRpb25zIG9wdGlvbnMpIHsKLQkJU3RyaW5nIGRpciA9IG9wdGlvbnMucHVibGljYXRpb25QYXRoOwotCQlTdHJpbmcgZGVmYXVsdFB1Ymxpc2hQYXRoID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVmYXVsdFB1Ymxpc2hQYXRoKCk7Ci0JCWJvb2xlYW4gYW5zd2VyID0gZmFsc2U7Ci0KLQkJSVBhdGggZWNQYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcoZGlyKTsKLQkJaWYgKCFlY1BhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IGRlZmF1bHRQdWJsaXNoUGF0aAotCQkJCQkrIFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKSArIGRpcjsgLy8kTk9OLU5MUy0xJAotCQkJYW5zd2VyID0gUHVibGlzaGluZ1VJUGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5UHJvbXB0KAotCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlLAotCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5jb25maXJtUGF0aERpYWxvZ190ZXh0LAotCQkJCQkJCQkJCQlwYXRoKSk7Ci0KLQkJCWlmIChhbnN3ZXIpIHsKLQkJCQlvcHRpb25zLnNldFB1YmxpY2F0aW9uUGF0aChkaXIpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIpOwotCi0JCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQlGaWxlW10gZmlsZXMgPSBmaWxlLmxpc3RGaWxlcygpOwotCQkJaWYgKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoID4gMCkgewotCQkJCWFuc3dlciA9IFB1Ymxpc2hpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLm92ZXJ3cml0ZURpYWxvZ190ZXh0LAotCQkJCQkJCQkJCQkJZGlyKSk7Ci0KLQkJCQlpZiAoYW5zd2VyID09IHRydWUpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWFuc3dlciA9IEZpbGVVdGlsCi0JCQkJCQkJCS5kZWxldGVBbGxGaWxlcyhmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCWlmIChhbnN3ZXIgPT0gZmFsc2UpIHsKLQkJCQkJCQlQdWJsaXNoaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5jYW5ub3RQdWJsaXNoRXJyb3JfbXNnLAotCQkJCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5kZWxldGVGaWxlc0Vycm9yX3JlYXNvbiwKLQkJCQkJCQkJCQkJCQkJCWRpcikpOwotCQkJCQkJCXJldHVybiBmYWxzZTsKLQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJUHVibGlzaGluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNhbm5vdFB1Ymxpc2hFcnJvcl9tc2csCi0JCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJCQkJCQlkaXIpLCBlKTsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCWFuc3dlciA9IGZpbGUubWtkaXJzKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGUsCi0JCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY2Fubm90UHVibGlzaEVycm9yX21zZywKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5iaW5kKAotCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY3JlYXRlRGlyRXJyb3JfcmVhc29uLAotCQkJCQkJCQlmaWxlLmdldEFic29sdXRlUGF0aCgpKSwgZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKCFhbnN3ZXIpIHsKLQkJCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlLAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNhbm5vdFB1Ymxpc2hFcnJvcl9tc2csCi0JCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNyZWF0ZURpckVycm9yX3JlYXNvbiwKLQkJCQkJCQkJZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBhbnN3ZXI7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoT3B0aW9uQ29udHJpYnV0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hPcHRpb25Db250cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWY4YjNiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hPcHRpb25Db250cmlidXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLS8qKgotICogTW9kZWxzIGEgInB1Ymxpc2hPcHRpb24iIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBpbiB0aGUKLSAqICJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wdWJsaXNoQ29uZmlndXJhdGlvbldpemFyZCIgZXh0ZW5zaW9uIHBvaW50LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hPcHRpb25Db250cmlidXRpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRTZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgZXhwb3J0IG9wdGlvbiBuYW1lCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICB0aGUgZXhwb3J0IG9wdGlvbiBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZWZhdWx0U2VsZWN0aW9uCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhpcyBvcHRpb24gaXMgc2VsZWN0ZWQgYnkgZGVmYXVsdAotCSAqLwotCXB1YmxpYyBQdWJsaXNoT3B0aW9uQ29udHJpYnV0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24sCi0JCQlib29sZWFuIGRlZmF1bHRTZWxlY3Rpb24pIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQl0aGlzLmRlZmF1bHRTZWxlY3Rpb24gPSBkZWZhdWx0U2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBleHBvcnQgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGV4cG9ydCBvcHRpb24gbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBleHBvcnQgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGV4cG9ydCBvcHRpb24gZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBzZWxlY2l0b24gb2YgdGhpcyBleHBvcnQgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBvcHRpb24gc2hvdWxkIGJlIHNlbGVjdGVkIGJ5IGRlZmF1bHQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gZGVmYXVsdFNlbGVjdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjMmZlYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLkFjdGl2aXR5RGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLk5ld0FjdGl2aXR5RGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuQWJzdHJhY3RWaWV3QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogVGhlIHB1Ymxpc2ggY29uZmlndXJhdGlvbiBwcm9ncmVzcyBkaWFsb2cuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2cgZXh0ZW5kcyBQcm9ncmVzc01vbml0b3JEaWFsb2cgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgZGlhZ3JhbVZpZXdlckhvbGRlcjsKLQotCXByaXZhdGUgQWJzdHJhY3RWaWV3QnVpbGRlciB2aWV3QnVpbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2coU2hlbGwgcGFyZW50LAotCQkJQWJzdHJhY3RWaWV3QnVpbGRlciB2aWV3QnVpbGRlcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnZpZXdCdWlsZGVyID0gdmlld0J1aWxkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgY3RybCA9IHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlpZiAodmlld0J1aWxkZXIgIT0gbnVsbCkgewotCQkJLy8gQ3JlYXRlIHRoZSBkaWFncmFtIHZpZXdlciBob2xkZXIgYW5kIHRoZSBkaWFncmFtIHNlcnZpY2UuCi0JCQlkaWFncmFtVmlld2VySG9sZGVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoMSwgMSkpOwotCQkJZGlhZ3JhbVZpZXdlckhvbGRlci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlkaWFncmFtVmlld2VySG9sZGVyLnNldFZpc2libGUoZmFsc2UpOwotCi0JCQlFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNZ3IgPSB2aWV3QnVpbGRlci5nZXRMYXlvdXRNZ3IoKTsKLQkJCVN0cmluZyBuZXdEaWFncmFtcyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoIlBVQkxJU0hfTkVXX0RJQUdSQU0iKTsKLQkJCUJvb2xlYW4gbmV3RGlhZ3JhbSA9IG5ldyBCb29sZWFuKG5ld0RpYWdyYW1zKTsKLQkJCWlmIChuZXdEaWFncmFtLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJTmV3QWN0aXZpdHlEaWFncmFtU2VydmljZSBkaWFncmFtU2VydmljZSA9IG5ldyBOZXdBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKAotCQkJCQkJZGlhZ3JhbVZpZXdlckhvbGRlciwKLQkJCQkJCW5ldyBGaWxlKGxheW91dE1nci5nZXRQdWJsaXNoRGlyKCkpKTsKLQkJCQlkaWFncmFtU2VydmljZS5zZXRQdWJsaXNoZWRVbkNyZWF0ZWRBREQodmlld0J1aWxkZXIKLQkJCQkJCS5nZXRPcHRpb25zKCkuaXNBdXRvR2VuZXJhdGVBY3Rpdml0eURpYWdyYW1zKCkpOwotCQkJCWRpYWdyYW1TZXJ2aWNlLnNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKHZpZXdCdWlsZGVyCi0JCQkJCQkuZ2V0T3B0aW9ucygpLmlzVW5vcGVuRXh0ZW5kZWRBY3Rpdml0eURpYWdyYW0oKSk7Ci0JCQkJbGF5b3V0TWdyLnNldEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoZGlhZ3JhbVNlcnZpY2UpOwotCQkJfSBlbHNlIHsKLQkJCQlBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIGRpYWdyYW1TZXJ2aWNlID0gbmV3IEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoCi0JCQkJCQlkaWFncmFtVmlld2VySG9sZGVyLAotCQkJCQkJbmV3IEZpbGUobGF5b3V0TWdyLmdldFB1Ymxpc2hEaXIoKSkpOwotCQkJCWRpYWdyYW1TZXJ2aWNlLnNldFB1Ymxpc2hlZFVuQ3JlYXRlZEFERCh2aWV3QnVpbGRlcgotCQkJCQkJLmdldE9wdGlvbnMoKS5pc0F1dG9HZW5lcmF0ZUFjdGl2aXR5RGlhZ3JhbXMoKSk7Ci0JCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24odmlld0J1aWxkZXIKLQkJCQkJCS5nZXRPcHRpb25zKCkuaXNVbm9wZW5FeHRlbmRlZEFjdGl2aXR5RGlhZ3JhbSgpKTsKLQkJCQlsYXlvdXRNZ3Iuc2V0QWN0aXZpdHlEaWFncmFtU2VydmljZShkaWFncmFtU2VydmljZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY3RybDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvUHVibGlzaGluZ09wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoaW5nT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYyZjc2ZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoaW5nT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLkFic3RyYWN0UHVibGlzaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuQWJzdHJhY3RWaWV3QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLlByb2dyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi0vKioKLSAqIFBlcmZvcm1zIHRoZSByZWFsIHdvcmsgb2YgcHVibGlzaGluZyBhIE1ldGhvZCBDb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nT3BlcmF0aW9uIGltcGxlbWVudHMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJR19FUlJPUl9USVRMRSA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DT05GSUdfRVJST1JfTVNHID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdFcnJvcl9tc2c7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJR19FUlJPUl9SRUFTT04gPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0Vycm9yX3JlYXNvbjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVZJRVdfQ09ORklHX0VSUk9SX1RJVExFID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnByZXZpZXdDb25maWdFcnJvcl90aXRsZTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVZJRVdfQ09ORklHX0VSUk9SX01TRyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wcmV2aWV3Q29uZmlnRXJyb3JfbXNnOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19SRVBPUlRfRVJST1JfVElUTEUgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMudmlld1JlcG9ydEVycm9yX3RpdGxlOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19SRVBPUlRfRVJST1JfTVNHID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnZpZXdSZXBvcnRFcnJvcl9tc2c7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9CUk9XU0VSX0VSUk9SX1JFQVNPTiA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5vcGVuQnJvd3NlckVycm9yX3JlYXNvbjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ09ORklHX0NBTkNFTF9NU0cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY2FuY2VsUHVibGlzaENvbmZpZ19tc2c7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQWJzdHJhY3RQdWJsaXNoTWFuYWdlciBwdWJsaXNoTWdyOwotCi0JcHJpdmF0ZSBTdHJpbmcgcHVibGlzaGVkX3VybDsKLQotCXByaXZhdGUgU3RyaW5nIHJlcG9ydF91cmw7Ci0KLQlwcml2YXRlIE1zZ0RpYWxvZyBtc2dEaWFsb2c7Ci0KLQlwcml2YXRlIEV4Y2VwdGlvbiBydW5FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoaW5nT3BlcmF0aW9uKEFic3RyYWN0UHVibGlzaE1hbmFnZXIgcHVibGlzaE1ncikgewotCQlzdXBlcigpOwotCQl0aGlzLnB1Ymxpc2hNZ3IgPSBwdWJsaXNoTWdyOwotCQl0aGlzLm1zZ0RpYWxvZyA9IFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB2aWV3IGJ1aWxkZXIuCi0JICogCi0JICogQHJldHVybiBBYnN0cmFjdFZpZXdCdWlsZGVyCi0JICovCi0JcHVibGljIEFic3RyYWN0Vmlld0J1aWxkZXIgZ2V0Vmlld0J1aWxkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnB1Ymxpc2hNZ3IuZ2V0Vmlld0J1aWxkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHVybCBmb3IgdGhlIHB1Ymxpc2hlZCBzaXRlCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hlZFVybCgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hlZF91cmw7Ci0JfQotCi0JLyoqCi0JICogcnVuIHRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSB0aGUgcHVibGlzaGluZyB0YXNrLgotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcnVuRXhjZXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vbml0b3Iuc2V0VGFza05hbWUoUHVibGlzaGluZ1Jlc291cmNlcy5wdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZSk7IC8vJE5PTi1OTFMtMSQJCQkKLQkJCXB1Ymxpc2hNZ3IucHVibGlzaChtb25pdG9yKTsKLQotCQkJcHVibGlzaGVkX3VybCA9IHB1Ymxpc2hNZ3IuZ2V0UHVibGlzaGVkVXJsKCk7Ci0JCQlyZXBvcnRfdXJsID0gcHVibGlzaE1nci5nZXRQdWJsaXNoUmVwb3J0VXJsKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlydW5FeGNlcHRpb24gPSBlOwotCQl9Ci0KLQkJZmluYWwgYm9vbGVhbiBjYW5jZWxlZCA9IG1vbml0b3IuaXNDYW5jZWxlZCgpOwotCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoY2FuY2VsZWQpIHsKLQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlJbmZvKFBVQkxJU0hfQ09ORklHX0VSUk9SX1RJVExFLAotCQkJCQkJCVBVQkxJU0hfQ09ORklHX0NBTkNFTF9NU0cpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKHB1Ymxpc2hlZF91cmwgPT0gbnVsbCB8fCByZXBvcnRfdXJsID09IG51bGwpIHsKLQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlFcnJvcihQVUJMSVNIX0NPTkZJR19FUlJPUl9USVRMRSwKLQkJCQkJCQlQVUJMSVNIX0NPTkZJR19FUlJPUl9NU0csCi0JCQkJCQkJUFVCTElTSF9DT05GSUdfRVJST1JfUkVBU09OLCBydW5FeGNlcHRpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gTGF1bmNoIGEgSFRNTCBicm93c2VyIHRvIHZpZXcgdGhlIHB1Ymxpc2hlZCBzaXRlLgotCQkJCWlmIChvcGVuQnJvd3NlcihwdWJsaXNoZWRfdXJsKSA9PSBmYWxzZSkgewotCQkJCQlTdHJpbmcgcmVhc29uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJT1BFTl9CUk9XU0VSX0VSUk9SX1JFQVNPTiwKLQkJCQkJCQluZXcgT2JqZWN0W10geyBwdWJsaXNoZWRfdXJsIH0pOwotCQkJCQltc2dEaWFsb2cuZGlzcGxheUVycm9yKFBSRVZJRVdfQ09ORklHX0VSUk9SX1RJVExFLAotCQkJCQkJCVBSRVZJRVdfQ09ORklHX0VSUk9SX01TRywgcmVhc29uKTsKLQkJCQl9Ci0KLQkJCQkvLyBMYXVuY2ggYSBIVE1MIGJyb3dzZXIgdG8gdmlldyB0aGUgcmVwb3J0IG9uIHRoZSBwdWJsaXNoZWQKLQkJCQkvLyBzaXRlLgotCQkJCWlmIChvcGVuQnJvd3NlcihyZXBvcnRfdXJsKSA9PSBmYWxzZSkgewotCQkJCQlTdHJpbmcgcmVhc29uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJT1BFTl9CUk9XU0VSX0VSUk9SX1JFQVNPTiwKLQkJCQkJCQluZXcgT2JqZWN0W10geyByZXBvcnRfdXJsIH0pOwotCQkJCQltc2dEaWFsb2cuZGlzcGxheUVycm9yKFZJRVdfUkVQT1JUX0VSUk9SX1RJVExFLAotCQkJCQkJCVZJRVdfUkVQT1JUX0VSUk9SX01TRywgcmVhc29uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIG9wZW4gYSBicm93c2VyIHRvIHNob3cgdGhlIHB1Ymxpc2hlZCBjb250ZW50LgotCSAqIEBwYXJhbSB1cmwgU3RyaW5nIHRoZSBzaXRlIHVybAotCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGJyb3dzZXIgb3BlbmVkIHN1Y2Nlc3NmdWxseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBvcGVuQnJvd3NlcihmaW5hbCBTdHJpbmcgdXJsKSB7Ci0JCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCQl0cnkgewotCQkJLy8gTGF1bmNoIHRoZSBkZWZhdWx0IEhUTUwgdmlld2VyIHRvIGRpc3BsYXkgdGhlIEhUTUwgcGFnZS4KLQkJCS8vIE9uIExpbnV4LCB0aGlzIGNhbid0IGxhdW5jaCB1cmxzLCBvbmx5IGxvY2FsIGZpbGVzIGNhbiBiZQotCQkJLy8gbGF1bmNoZWQuCi0JCQkvLyBTb3JyeSBJIGhhdmUgdXNlIGludGVybmFsIGNsYXNzIGhlcmUuCi0JCQkvLyBob3BlIEVjbGlwc2Uub3JnIGNhbiBoYXZlIGEgcHVibGljIGFwaSB0byBkbyBzby4KLQkJCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXN1Y2Nlc3MgPSBQcm9ncmFtLmxhdW5jaCh1cmwpOwotCQkJfSBlbHNlIHsKLS8vCQkJCUlCcm93c2VyIGJyb3dzZXIgPSBvcmcuZWNsaXBzZS5oZWxwLmludGVybmFsLmJyb3dzZXIuQnJvd3Nlck1hbmFnZXIKLS8vCQkJCQkJLmdldEluc3RhbmNlKCkuY3JlYXRlQnJvd3Nlcih0cnVlKTsKLS8vCQkJCWlmIChicm93c2VyID09IG51bGwpIHsKLS8vCQkJCQl0cnkgewotLy8JCQkJCQlicm93c2VyLmRpc3BsYXlVUkwodXJsKTsKLS8vCQkJCQkJc3VjY2VzcyA9IHRydWU7Ci0vLwkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0JCQkJCi0JCQkJLy8gMTU1NDkwIC0gQ2Fubm90IGRldGVjdGVkIGRlZmF1bHQgYnJvd3NlciB3aGVuIHByZXZpZXcgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gb24gTGludXgKLQkJCQkvLyBjaGFuZ2VkIHRvIHVzZSBzd3QgYnJvd3NlcgotCQkJCXN1Y2Nlc3MgPSB0cnVlOwotCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKQotCQkJCXsKLQkJCQkgICAgcHVibGljIHZvaWQgcnVuKCkKLQkJCQkJewotLy8JCQkJCQkJLy8gb3BlbiBhbm90aGVyIHN3dCBicm93c2VyIHNpbmNlIHdlIGhhdmUgbm8gKHNpbXBsZSkgd2F5IG9mIGNyZWF0aW5nIGEgc3lzdGVtIGRlZmF1bHQgYnJvd3NlcgotLy8JCQkJCQkJLy8gdGhlIEVjbGlwc2UgZ3V5cyBoaWRlIGFsbCB0aGUgZ29vZCBhcGlzIGFzIGludGVybmFsCi0JCQkJCQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQkJCQkJCQlzaGVsbC5zZXRUZXh0KHVybCk7Ci0JCQkJCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJCQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJCQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQkJCQkJc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQkJCQkJQnJvd3NlciBwb3B1cF9icm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJCQkJCQlwb3B1cF9icm93c2VyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USHxHcmlkRGF0YS5HUkFCX0hPUklaT05UQUx8R3JpZERhdGEuR1JBQl9WRVJUSUNBTCkpOwotCQkJCQkJCXBvcHVwX2Jyb3dzZXIuc2V0VXJsKHVybCk7CQkJCQkJCQkJCQkJCQkKLQkJCQkJCQlzaGVsbC5vcGVuKCk7Ci0JCQkJCX0KLQkJCQl9KTsJCQkKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlzdWNjZXNzID0gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gc3VjY2VzczsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdENvbmZpZ1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0Q29uZmlnUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTRmMTJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0Q29uZmlnUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHRvCi0gKiBwdWJsaXNoLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdENvbmZpZ1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RDb25maWdQYWdlLmNsYXNzLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBUYWJsZSB0YWJsZTsKLQotCXByb3RlY3RlZCBUYWJsZVZpZXdlciBjb25maWdWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBicmllZkRlc2NUZXh0OwotCi0JcHJvdGVjdGVkIExpc3QgcHJvY2Vzc1ZpZXdzOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzZWxlY3RlZENvbmZpZ05hbWU7Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLQkJCWltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgaW5kZXgpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gY29uZmlnLmdldE5hbWUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdENvbmZpZ1BhZ2UoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5zZWxlY3RDb25maWdXaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNlbGVjdENvbmZpZ1dpemFyZFBhZ2VfdGV4dCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNvbmZpZ0xhYmVsX3RleHQpOwotCi0JCXRhYmxlID0gbmV3IFRhYmxlKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSAxMjA7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDI4MDsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJY29uZmlnVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9URVhUKTsKLQotCQlicmllZkRlc2NUZXh0ID0gY3JlYXRlVGV4dE11bHRpKGNvbXBvc2l0ZSwgIiIsIDM2MCwgODAsIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCi0JCVBsYXRmb3JtVUkKLQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJLnNldEhlbHAoCi0JCQkJCQljb21wb3NpdGUsCi0JCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5DT05GSUdVUkFUSU9OX1BVQkxJU0hfV0laQVJEX0FMTF9QQUdFU19DT05URVhUKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMgd2l0aCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250cm9scygpIHsKLQkJY29uZmlnVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IENvbmZpZ3VyYXRpb25UYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWNvbmZpZ1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQlNZXRob2RDb25maWd1cmF0aW9uW10gY29uZmlncyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9ucyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCWNvbmZpZ1ZpZXdlci5zZXRJbnB1dChjb25maWdzKTsKLQotCQkvLyBTZWxlY3QgdGhlIGZpcnN0IGNvbmZpZyBhbmQgZGlzcGxheSBpdHMgYnJpZWYgZGVzY3JpcHRpb24uCi0JCWlmIChjb25maWdzLmxlbmd0aCA+IDApIHsKLQkJCXRhYmxlLnNlbGVjdCgwKTsKLQkJCXNldEJyaWVmRGVzY3JpcHRpb24oY29uZmlnc1swXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIHRvIHRoZSB3aXphcmQgcGFnZSBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWNvbmZpZ1ZpZXdlcgotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCQlPYmplY3RbXSBjb25maWdzID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCQkJCQlzZXRCcmllZkRlc2NyaXB0aW9uKChNZXRob2RDb25maWd1cmF0aW9uKSBjb25maWdzWzBdKTsKLQkJCQkJCX0KLQkJCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShMaWJyYXJ5VUlSZXNvdXJjZXMubm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnKTsKLQkJfQotCi0JCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpbnQgY291bnQgPSB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpOwotCi0JCWlmIChjb3VudCA+IDApIHsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlzZWxlY3RlZENvbmZpZ05hbWUgPSBpdGVtc1swXS5nZXRUZXh0KCk7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIHNlbGVjdGVkQ29uZmlnTmFtZSk7Ci0JCQlwcm9jZXNzVmlld3MgPSBudWxsOwotCQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQkJcHJvY2Vzc1ZpZXdzID0gZ2V0VmFsaWRDb25maWdWaWV3cyhjb25maWcpOwotCQkJfQotCi0JCQlpZiAocHJvY2Vzc1ZpZXdzICE9IG51bGwgJiYgcHJvY2Vzc1ZpZXdzLnNpemUoKSA+IDApIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJc2V0TWVzc2FnZShudWxsKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCXNldE1lc3NhZ2UoUHVibGlzaGluZ1VJUmVzb3VyY2VzLm1pc3NpbmdWaWV3RXJyb3JfbXNnLAotCQkJCQkJV2l6YXJkUGFnZS5XQVJOSU5HKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCUlXaXphcmRQYWdlIHBhZ2UgPSBnZXRXaXphcmQoKS5nZXROZXh0UGFnZSh0aGlzKTsKLQkJdHJ5IHsKLQkJCSgoQmFzZVdpemFyZFBhZ2UpIHBhZ2UpLm9uRW50ZXJQYWdlKGdldENvbmZpZ05hbWUoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIGxpc3Qgb2YgdmFsaWQgY29uZmlndXJhdGlvbiB2aWV3cy4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhIGxpc3Qgb2YgY29uZmlndXJhdGlvbiB2aWV3cwotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFZhbGlkQ29uZmlnVmlld3MoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJU3RyaW5nIG1zZzsKLQkJU3RyaW5nQnVmZmVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUxpc3Q8Q29udGVudENhdGVnb3J5PiB2aWV3cyA9IG5ldyBBcnJheUxpc3Q8Q29udGVudENhdGVnb3J5PigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSB2aWV3ID0gKENvbnRlbnRDYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuaXNDb250cmlidXRvcih2aWV3KSkgewotCQkJCW1zZyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5iaW5kKAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRWaWV3Q29udHJpYnV0b3JJbmZvX21zZywKLQkJCQkJCXZpZXcuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJCQltZXNzYWdlLmFwcGVuZChTdHJVdGlsLlRBQikuYXBwZW5kKG1zZykuYXBwZW5kKAotCQkJCQkJU3RyVXRpbC5MSU5FX0ZFRUQpOwotCQkJfSBlbHNlIHsKLQkJCQl2aWV3ID0gKENvbnRlbnRDYXRlZ29yeSkgQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkJLmdldENhbGN1bGF0ZWRFbGVtZW50KHZpZXcsIGNvbmZpZyk7Ci0JCQkJaWYgKHZpZXcgPT0gbnVsbCkgewotCQkJCQltc2cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW52YWxpZFZpZXdJbnZhbGlkSW5mb19tc2csCi0JCQkJCQkJdmlldy5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCQkJCQltZXNzYWdlLmFwcGVuZChTdHJVdGlsLlRBQikuYXBwZW5kKG1zZykuYXBwZW5kKAotCQkJCQkJCVN0clV0aWwuTElORV9GRUVEKTsKLQotCQkJCX0gZWxzZSBpZiAodmlld3MuY29udGFpbnModmlldykpIHsKLQkJCQkJbXNnID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJpbmQoCi0JCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRWaWV3U2FtZVZpZXdJbmZvX21zZywKLQkJCQkJCQl2aWV3LmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJCW1lc3NhZ2UuYXBwZW5kKFN0clV0aWwuVEFCKS5hcHBlbmQobXNnKS5hcHBlbmQoCi0JCQkJCQkJU3RyVXRpbC5MSU5FX0ZFRUQpOwotCi0JCQkJfSBlbHNlIHsKLQkJCQkJdmlld3MuYWRkKHZpZXcpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChtZXNzYWdlLmxlbmd0aCgpID4gMCkgewotCQkJbXNnID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJpbmQoCi0JCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkVmlld3NJbmZvX21zZywgY29uZmlnCi0JCQkJCQkJLmdldE5hbWUoKSk7Ci0JCQltZXNzYWdlLmluc2VydCgwLCBtc2cgKyBTdHJVdGlsLkxJTkVfRkVFRCArIFN0clV0aWwuTElORV9GRUVEKTsKLQotCQkJLy8gRklYTUUhIFNob3VsZCBub3QgZGlzcGxheSB3YXJuaW5nIG1lc3NhZ2VzIGluIHRoZSBicmllZgotCQkJLy8gZGVzY3JpcHRpb24gZmllbGQuCi0JCQlicmllZkRlc2NUZXh0LnNldFRleHQobWVzc2FnZS50b1N0cmluZygpKTsKLQkJfQotCi0JCXJldHVybiB2aWV3czsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHVzZXIgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnTmFtZSgpIHsKLQkJcmV0dXJuIHNlbGVjdGVkQ29uZmlnTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgdGhlIEJyaWVmIERlc2NyaXB0aW9uIHRleHQgY29udHJvbCB3aXRoIHRoZSBnaXZlbgotCSAqIGNvbmZpZ3VyYXRpb24ncyBicmllZiBkZXNjcmlwb3Rpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEJyaWVmRGVzY3JpcHRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJYnJpZWZEZXNjVGV4dC5zZXRUZXh0KGNvbmZpZy5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3RDb250ZW50UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3RDb250ZW50UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NWI3ZWNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0Q29udGVudFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzLlByb2Nlc3NUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzLlByb2Nlc3NUcmVlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBwdWJsaXNoIHRoZSBlbnRpcmUgbWV0aG9kCi0gKiBjb25maWd1cmF0aW9uIG9yIG9ubHkgc3BlY2lmaWMgcHJvY2Vzc2VzIGluIHRoZSBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdENvbnRlbnRQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RDb250ZW50UGFnZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gcHVibGlzaFByb2Nlc3Nlc1JhZGlvQnV0dG9uOwotCi0JcHJvdGVjdGVkIENoZWNrYm94VHJlZVZpZXdlciBwcm9jZXNzVmlld2VyOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBpbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94OwotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJvdGVjdGVkIGNsYXNzIFByb2Nlc3NWaWV3ZXJDb250ZW50UHJvdmlkZXIgZXh0ZW5kcwotCQkJUHJvY2Vzc1RyZWVDb250ZW50UHJvdmlkZXIgewotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBwYXJlbnRFbGVtZW50OwotCQkJCUxpc3Q8T2JqZWN0PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCUxpc3QgcGx1Z2lucyA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQkJCUxpc3QgcHJvY2Vzc2VzID0gVG5nVXRpbC5nZXRBbGxQcm9jZXNzZXMocGx1Z2luKTsKLQkJCQkJaWYgKHByb2Nlc3Nlcy5zaXplKCkgPiAwKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQocGx1Z2luKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCi0JCQl9IGVsc2UgewotCQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdENvbnRlbnRQYWdlKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0Q29udGVudFdpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0Q29udGVudFdpemFyZFBhZ2VfdGV4dCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCXB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKGNvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ1JhZGlvQnV0dG9uX3RleHQsIDEsIHRydWUpOwotCi0JCXB1Ymxpc2hQcm9jZXNzZXNSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKGNvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaFByb2Nlc3Nlc1JhZGlvQnV0dG9uX3RleHQsIDEsCi0JCQkJZmFsc2UpOwotCi0JCUNvbXBvc2l0ZSBwcm9jZXNzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcHJvY2Vzc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgKLQkJCQl8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDEzOwotCQlwcm9jZXNzQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCXByb2Nlc3NWaWV3ZXIgPSBuZXcgQ2hlY2tib3hUcmVlVmlld2VyKHByb2Nlc3NDb21wb3NpdGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSAzMDA7Ci0JCXByb2Nlc3NWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWluY2x1ZGVCYXNlUHJvY2Vzc2VzQ2hlY2tib3ggPSBjcmVhdGVDaGVja2JveChwcm9jZXNzQ29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94TGFiZWxfdGV4dCk7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlwcm9jZXNzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUHJvY2Vzc1ZpZXdlckNvbnRlbnRQcm92aWRlcigpKTsKLQkJcHJvY2Vzc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBQcm9jZXNzVHJlZUxhYmVsUHJvdmlkZXIoKSk7Ci0KLQkJU3RyaW5nIGNvbmZpZ05hbWUgPSBjb25maWcgIT0gbnVsbCA/IGNvbmZpZy5nZXROYW1lKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIHB1Ymxpc2hDb25maWcgPSBQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRQdWJsaXNoRW50aXJlQ29uZmlnKGNvbmZpZ05hbWUpOwotCQlwdWJsaXNoQ29uZmlnUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHB1Ymxpc2hDb25maWcpOwotCQlwdWJsaXNoUHJvY2Vzc2VzUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKCFwdWJsaXNoQ29uZmlnKTsKLQkJcHJvY2Vzc1ZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZCghcHVibGlzaENvbmZpZyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIHRvIHRoZSB3aXphcmQgcGFnZSBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJcHVibGlzaFByb2Nlc3Nlc1JhZGlvQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlpbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCi0JCXByb2Nlc3NWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU9iamVjdCBjaGVja2VkRWxlbWVudCA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQkJCQlib29sZWFuIGNoZWNrZWQgPSBldmVudC5nZXRDaGVja2VkKCk7Ci0KLQkJCQlwcm9jZXNzVmlld2VyLnNldENoZWNrZWQoY2hlY2tlZEVsZW1lbnQsIGNoZWNrZWQpOwotCQkJCXByb2Nlc3NWaWV3ZXIuc2V0U3VidHJlZUNoZWNrZWQoY2hlY2tlZEVsZW1lbnQsIGNoZWNrZWQpOwotCQkJCWlmIChpbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94LmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCXNlbGVjdEJhc2VQcm9jZXNzZXMoKTsKLQkJCQl9Ci0JCQkJdXBkYXRlQ2hlY2tlZFN0YXRlcygpOwotCi0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBjaGVjayBzdGF0ZXMgb2YgcHJvY2VzcyB0cmVlIHZpZXdlci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2hlY2tlZFN0YXRlcygpIHsKLQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY3AgPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpIHByb2Nlc3NWaWV3ZXIKLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gcGx1Z2lucyA9IGNwLmdldENoaWxkcmVuKGNvbmZpZyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3RbXSB1aUZvbGRlcnMgPSBjcC5nZXRDaGlsZHJlbihwbHVnaW5zW2ldKTsKLQkJCQlpbnQgdG90YWxVSUZvbGRlcnMgPSB1aUZvbGRlcnMubGVuZ3RoOwotCQkJCWludCBjaGVja2VkVUlGb2xkZXJzID0gMDsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHVpRm9sZGVycy5sZW5ndGg7IGorKykgewotCQkJCQlPYmplY3RbXSBwcm9jZXNzZXMgPSBjcC5nZXRDaGlsZHJlbih1aUZvbGRlcnNbal0pOwotCQkJCQlpbnQgdG90YWxQcm9jZXNzZXMgPSBwcm9jZXNzZXMubGVuZ3RoOwotCQkJCQlpbnQgY2hlY2tlZFByb2Nlc3NlcyA9IDA7Ci0JCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgcHJvY2Vzc2VzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQlpZiAocHJvY2Vzc1ZpZXdlci5nZXRDaGVja2VkKHByb2Nlc3Nlc1trXSkpIHsKLQkJCQkJCQljaGVja2VkUHJvY2Vzc2VzKys7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGNoZWNrZWRQcm9jZXNzZXMgPT0gMCkgewotCQkJCQkJcHJvY2Vzc1ZpZXdlci5zZXRHcmF5Q2hlY2tlZCh1aUZvbGRlcnNbal0sIGZhbHNlKTsKLQkJCQkJfSBlbHNlIGlmIChjaGVja2VkUHJvY2Vzc2VzID09IHRvdGFsUHJvY2Vzc2VzKSB7Ci0JCQkJCQlwcm9jZXNzVmlld2VyLnNldEdyYXllZCh1aUZvbGRlcnNbal0sIGZhbHNlKTsKLQkJCQkJCXByb2Nlc3NWaWV3ZXIuc2V0Q2hlY2tlZCh1aUZvbGRlcnNbal0sIHRydWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJvY2Vzc1ZpZXdlci5zZXRHcmF5Q2hlY2tlZCh1aUZvbGRlcnNbal0sIHRydWUpOwotCQkJCQl9Ci0JCQkJCWlmIChwcm9jZXNzVmlld2VyLmdldENoZWNrZWQodWlGb2xkZXJzW2pdKSkgewotCQkJCQkJY2hlY2tlZFVJRm9sZGVycysrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChjaGVja2VkVUlGb2xkZXJzID09IHRvdGFsVUlGb2xkZXJzKSB7Ci0JCQkJCXByb2Nlc3NWaWV3ZXIuc2V0R3JheWVkKHBsdWdpbnNbaV0sIGZhbHNlKTsKLQkJCQkJcHJvY2Vzc1ZpZXdlci5zZXRDaGVja2VkKHBsdWdpbnNbaV0sIHRydWUpOwotCQkJCX0gZWxzZSBpZiAoY2hlY2tlZFVJRm9sZGVycyA9PSAwKSB7Ci0JCQkJCXByb2Nlc3NWaWV3ZXIuc2V0R3JheUNoZWNrZWQocGx1Z2luc1tpXSwgZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXByb2Nlc3NWaWV3ZXIuc2V0R3JheUNoZWNrZWQocGx1Z2luc1tpXSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0cyB0aGUgcmVmZXJlbmNlZCBiYXNlIHByb2Nlc3NlcyBpbiB0aGUgcHJvY2VzcyB0cmVlIHZpZXdlci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2VsZWN0QmFzZVByb2Nlc3NlcygpIHsKLQkJLy8gR2V0IHRoZSByZWZlcmVuY2VkIGJhc2UgcHJvY2Vzc2VzLgotCQlMaXN0PFByb2Nlc3M+IHByb2Nlc3NlcyA9IGdldFNlbGVjdGVkUHJvY2Vzc2VzKCk7Ci0JCUxpc3Q8UHJvY2Vzcz4gYmFzZVByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzcz4oKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHByb2Nlc3Nlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlDb25maWd1cmF0aW9uSGVscGVyLmdldEJhc2VQcm9jZXNzZXMoKEFjdGl2aXR5KSBpdC5uZXh0KCksIGNvbmZpZywKLQkJCQkJYmFzZVByb2Nlc3Nlcyk7Ci0JCX0KLQotCQkvLyBVcGRhdGUgdGhlIHByb2Nlc3MgdHJlZSB2aWV3ZXIuCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBiYXNlUHJvY2Vzc2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJcHJvY2Vzc1ZpZXdlci5zZXRDaGVja2VkKGVsZW1lbnQsIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlwcm9jZXNzVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKAotCQkJCXB1Ymxpc2hQcm9jZXNzZXNSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJaWYgKGV2ZW50LndpZGdldCA9PSBpbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94KSB7Ci0JCQkvLyBJZiBzZWxlY3RlZCwgc2VsZWN0IGFsbCByZWZlcmVuY2VkIGJhc2UgcHJvY2Vzc2VzLgotCQkJc2VsZWN0QmFzZVByb2Nlc3NlcygpOwotCQkJdXBkYXRlQ2hlY2tlZFN0YXRlcygpOwotCQl9Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNvbkVudGVyUGFnZShPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgb25FbnRlclBhZ2UoT2JqZWN0IG9iaikgewotCQlpZiAob2JqICE9IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlTdHJpbmcgY29uZmlnTmFtZSA9IChTdHJpbmcpIG9iajsKLQkJCWNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRNZXRob2RDb25maWd1cmF0aW9uKExpYnJhcnlTZXJ2aWNlCi0JCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIGNvbmZpZ05hbWUpOwotCQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQkJcHJvY2Vzc1ZpZXdlci5zZXRJbnB1dChjb25maWcpOwotCQkJCXByb2Nlc3NWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKGdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAocHVibGlzaENvbmZpZ1JhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZ2V0U2VsZWN0ZWRQcm9jZXNzZXMoKS5zaXplKCkgPiAwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJSVdpemFyZFBhZ2UgcGFnZSA9IGdldFdpemFyZCgpLmdldE5leHRQYWdlKHRoaXMpOwotCQl0cnkgewotCQkJKChCYXNlV2l6YXJkUGFnZSkgcGFnZSkub25FbnRlclBhZ2UoY29uZmlnKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBzZWxlY3RlZCBwcm9jZXNzZXMgdG8gYmUgcHVibGlzaGVkLgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIDxjb2RlPlByb2Nlc3M8L2NvZGU+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0UHVibGlzaENvbmZpZ1NlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgdXNlciBzZWxlY3RlZCBwcm9jZXNzZXMgdG8gYmUgcHVibGlzaGVkLgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIDxjb2RlPlByb2Nlc3M8L2NvZGU+Ci0JICovCi0JcHVibGljIExpc3Q8UHJvY2Vzcz4gZ2V0U2VsZWN0ZWRQcm9jZXNzZXMoKSB7Ci0JCUxpc3Q8UHJvY2Vzcz4gcHJvY2Vzc2VzID0gbmV3IEFycmF5TGlzdDxQcm9jZXNzPigpOwotCi0JCU9iamVjdFtdIHNlbGVjdGVkID0gcHJvY2Vzc1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJaWYgKHNlbGVjdGVkICE9IG51bGwgJiYgc2VsZWN0ZWQubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJCWlmIChzZWxlY3RlZFtpXSBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCQkJcHJvY2Vzc2VzLmFkZCgoUHJvY2Vzcykgc2VsZWN0ZWRbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdERlc3RpbmF0aW9uUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3REZXN0aW5hdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzFhMzUyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdERlc3RpbmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgYW5kCi0gKiBmb3JtYXQgZm9yIHRoZSBwdWJsaXNoZWQgd2ViIHNpdGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0RGVzdGluYXRpb25QYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0RGVzdGluYXRpb25QYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJvdGVjdGVkIFNoZWxsIHNoZWxsOwotCi0JcHJvdGVjdGVkIENvbWJvIGRpckNvbWJvOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgc3RhdGljV2ViU2l0ZUNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBCdXR0b24gamF2YVdlYkFwcFJhZGlvQnV0dG9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBqYXZhV2ViQXBwQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIExhYmVsIHdlYkFwcE5hbWVMYWJlbDsKLQotCXByb3RlY3RlZCBDb21ibyB3ZWJBcHBOYW1lQ29tYm87Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGluY2x1ZGVTZWFyY2hDaGVja2JveDsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdERlc3RpbmF0aW9uUGFnZSgpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNlbGVjdERlc3RpbmF0aW9uV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5zZWxlY3REZXN0aW5hdGlvbldpemFyZFBhZ2VfdGV4dCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMSk7Ci0KLQkJQ29tcG9zaXRlIGRpckNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWRpckNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZGlyQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCi0JCWNyZWF0ZUxhYmVsKGRpckNvbXBvc2l0ZSwgUHVibGlzaGluZ1VJUmVzb3VyY2VzLmRpckxhYmVsX3RleHQpOwotCi0JCWRpckNvbWJvID0gY3JlYXRlQ29tYm9ib3goZGlyQ29tcG9zaXRlKTsKLQotCQlicm93c2VCdXR0b24gPSBjcmVhdGVCdXR0b24oZGlyQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CUk9XU0VfQlVUVE9OX1RFWFQpOwotCi0JCUdyb3VwIHdlYkFwcEdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQl3ZWJBcHBHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJd2ViQXBwR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXdlYkFwcEdyb3VwLnNldFRleHQoUHVibGlzaGluZ1VJUmVzb3VyY2VzLndlYkFwcEdyb3VwX3RleHQpOwotCi0JCXN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKHdlYkFwcEdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5zdGF0aWNXZWJTaXRlUmFkaW9CdXR0b25fdGV4dCk7Ci0KLQkJc3RhdGljV2ViU2l0ZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUod2ViQXBwR3JvdXAsIFNXVC5OT05FKTsKLQkJc3RhdGljV2ViU2l0ZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJc3RhdGljV2ViU2l0ZUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJKChHcmlkTGF5b3V0KSBzdGF0aWNXZWJTaXRlQ29tcG9zaXRlLmdldExheW91dCgpKS5tYXJnaW5Ub3AgPSAtMzsKLQkJKChHcmlkTGF5b3V0KSBzdGF0aWNXZWJTaXRlQ29tcG9zaXRlLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gMTM7Ci0KLQkJamF2YVdlYkFwcFJhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24od2ViQXBwR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmR5bmFtaWNXZWJBcHBSYWRpb0J1dHRvbl90ZXh0KTsKLQotCQlqYXZhV2ViQXBwQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh3ZWJBcHBHcm91cCwgU1dULk5PTkUpOwotCQlqYXZhV2ViQXBwQ29tcG9zaXRlCi0JCQkJLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlqYXZhV2ViQXBwQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQkoKEdyaWRMYXlvdXQpIGphdmFXZWJBcHBDb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm1hcmdpblRvcCA9IC0zOwotCQkoKEdyaWRMYXlvdXQpIGphdmFXZWJBcHBDb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm1hcmdpbkxlZnQgPSAxMzsKLQotCQlpbmNsdWRlU2VhcmNoQ2hlY2tib3ggPSBjcmVhdGVDaGVja2JveChqYXZhV2ViQXBwQ29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbmNsdWRlU2VhcmNoQ2hlY2tib3hfdGV4dCwgMyk7Ci0KLQkJd2ViQXBwTmFtZUxhYmVsID0gY3JlYXRlTGFiZWwoamF2YVdlYkFwcENvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMud2ViQXBwbGljYXRpb25OYW1lTGFiZWxfdGV4dCk7Ci0KLQkJd2ViQXBwTmFtZUNvbWJvID0gY3JlYXRlQ29tYm9ib3goamF2YVdlYkFwcENvbXBvc2l0ZSwgMik7Ci0JCXdlYkFwcE5hbWVDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlpbml0Q29udHJvbHMoKTsKLQotCQlhZGRFdmVudEhhbmRsZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCVN0cmluZyBjb25maWdOYW1lID0gY29uZmlnLmdldE5hbWUoKTsKLQotCQkJU3RyaW5nIGRpciA9IFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmdldFB1Ymxpc2hQYXRoKGNvbmZpZ05hbWUpOwotCQkJaWYgKGRpciAhPSBudWxsICYmIGRpci5sZW5ndGgoKSA+IDApIHsKLQkJCQlkaXJDb21iby5zZXRJdGVtcyhuZXcgU3RyaW5nW10geyBkaXIgfSk7Ci0JCQkJZGlyQ29tYm8uc2V0VGV4dChkaXIpOwotCQkJfQotCi0JCQlib29sZWFuIHB1Ymxpc2hTdGF0aWNXZWJTaXRlID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkJLmdldFB1Ymxpc2hTdGF0aWNXZWJTaXRlKGNvbmZpZ05hbWUpOwotCQkJc3RhdGljV2ViU2l0ZVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihwdWJsaXNoU3RhdGljV2ViU2l0ZSk7Ci0JCQlqYXZhV2ViQXBwUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKCFwdWJsaXNoU3RhdGljV2ViU2l0ZSk7Ci0KLQkJCWluY2x1ZGVTZWFyY2hDaGVja2JveC5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkJLmdldEluY2x1ZGVTZWFyY2goY29uZmlnTmFtZSkpOwotCi0JCQlTdHJpbmcgd2ViQXBwTmFtZSA9IFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJCS5nZXRXZWJBcHBOYW1lKGNvbmZpZ05hbWUpOwotCQkJaWYgKHdlYkFwcE5hbWUgIT0gbnVsbCAmJiB3ZWJBcHBOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCXdlYkFwcE5hbWVDb21iby5zZXRJdGVtcyhuZXcgU3RyaW5nW10geyB3ZWJBcHBOYW1lIH0pOwotCQkJCXdlYkFwcE5hbWVDb21iby5zZXRUZXh0KHdlYkFwcE5hbWUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJc3RhdGljV2ViU2l0ZVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWphdmFXZWJBcHBSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0KLQkJdXBkYXRlQ29udHJvbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIHRvIHRoZSB3aXphcmQgcGFnZSBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFdmVudEhhbmRsZXJzKCkgewotCQlkaXJDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coc2hlbGwsCi0JCQkJCQkJU1dULk5PTkUpOwotCQkJCQlTdHJpbmcgc2VsZWN0ZWREaXIgPSBkaWFsb2cub3BlbigpOwotCQkJCQlpZiAoc2VsZWN0ZWREaXIgIT0gbnVsbCkgewotCQkJCQkJZGlyQ29tYm8uYWRkKHNlbGVjdGVkRGlyLCAwKTsKLQkJCQkJCWRpckNvbWJvLnNldFRleHQoc2VsZWN0ZWREaXIpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJamF2YVdlYkFwcFJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVDb250cm9scygpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlib29sZWFuIHB1Ymxpc2hTdGF0aWNXZWJTaXRlID0gZ2V0U3RhdGljV2ViU2l0ZVNlbGVjdGlvbigpOwotCQl3ZWJBcHBOYW1lTGFiZWwuc2V0RW5hYmxlZCghcHVibGlzaFN0YXRpY1dlYlNpdGUpOwotCQl3ZWJBcHBOYW1lQ29tYm8uc2V0RW5hYmxlZCghcHVibGlzaFN0YXRpY1dlYlNpdGUpOwotCQlpbmNsdWRlU2VhcmNoQ2hlY2tib3guc2V0RW5hYmxlZCghcHVibGlzaFN0YXRpY1dlYlNpdGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2Ujb25FbnRlclBhZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCWNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBvYmo7Ci0JCQlpbml0Q29udHJvbHMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlyZXR1cm4gZ2V0UHVibGlzaERpcmVjdG9yeSgpLmxlbmd0aCgpID4gMDsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgcHVibGlzaCBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoRGlyZWN0b3J5KCkgewotCQlGaWxlIGRpciA9IG5ldyBGaWxlKGRpckNvbWJvLmdldFRleHQoKS50cmltKCkpOwotCQlyZXR1cm4gZGlyLmdldEFic29sdXRlUGF0aCgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHN0YXRpYyB3ZWIgc2l0ZSBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0U3RhdGljV2ViU2l0ZVNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBpbmNsdWRlIHNlYXJjaCBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0SW5jbHVkZVNlYXJjaFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGluY2x1ZGVTZWFyY2hDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3ZWIgYXBsaWNhdGlvbiBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2ViQXBwTmFtZSgpIHsKLQkJcmV0dXJuIHdlYkFwcE5hbWVDb21iby5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSB1c2VyIHNlbGVjdGlvbnMgaW4gdGhpcyB3aXphcmQgcGFnZSB0byBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY29uZmlnTmFtZSA9IGNvbmZpZy5nZXROYW1lKCk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRQdWJsaXNoUGF0aChjb25maWdOYW1lLAotCQkJCQlnZXRQdWJsaXNoRGlyZWN0b3J5KCkpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0UHVibGlzaFN0YXRpY1dlYlNpdGUoY29uZmlnTmFtZSwKLQkJCQkJZ2V0U3RhdGljV2ViU2l0ZVNlbGVjdGlvbigpKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldEluY2x1ZGVTZWFyY2goY29uZmlnTmFtZSwKLQkJCQkJZ2V0SW5jbHVkZVNlYXJjaFNlbGVjdGlvbigpKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFdlYkFwcE5hbWUoY29uZmlnTmFtZSwgZ2V0V2ViQXBwTmFtZSgpKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NDMyNmMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5QdWJsaXNoaW5nVUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCB0aGUgcHVibGlzaGluZyBvcHRpb25zIGZvciB0aGUKLSAqIGdlbmVyYXRlZCB3ZWIgc2l0ZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgVGV4dCB0aXRsZVRleHQ7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBiYW5uZXJJbWFnZVRleHQ7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBhYm91dEhUTUxUZXh0OwotCi0JcHJvdGVjdGVkIFRleHQgZmVlZGJhY2tVUkxUZXh0OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBzZWxlY3RJbWFnZUJ1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gc2VsZWN0SFRNTEJ1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gcHVibGlzaEdsb3NzYXJ5Q2hlY2tib3g7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hJbmRleENoZWNrYm94OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjaGVja0V4dGVybmFsTGlua3NDaGVja2JveDsKLQotCXByb3RlY3RlZCBCdXR0b24gY29udmVydEJyb2tlbkxpbmtzQ2hlY2tib3g7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGF1dG9HZW5lcmF0ZUFERENoZWNrYm94OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBwdWJsaXNoQmFzZUFEQ2hlY2tib3g7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hMaWdodFdlaWdodFRyZWVDaGVja2JveDsKLQotCXByb3RlY3RlZCBCdXR0b24gZXh0cmFEZXNjcmlwdG9ySW5mb0N0cjsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgd2l6YXJkIHBhZ2UKLQkgKi8KLQlwdWJsaWMgU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQlzZXRUaXRsZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0UHVibGlzaGluZ09wdGlvbnNXaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zV2l6YXJkUGFnZV90ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9QdWJsaXNoQ29uZmlndXJhdGlvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQkKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UoKSB7Ci0JCXRoaXMoUEFHRV9OQU1FKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJY3JlYXRlVGl0bGVBbmRMaW5rc0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUdsb3NzYXJ5QW5kSW5kZXhHcm91cChjb21wb3NpdGUpOwkJCi0JCWNyZWF0ZUxvb2tBbmRGZWVsR3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlVmFsaWRhdGlvbihjb21wb3NpdGUpOwotCQljcmVhdGVEaWFncmFtR2VuZXJhdGlvbkdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUxheW91dEdyb3VwKGNvbXBvc2l0ZSk7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKGNvbXBvc2l0ZSk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCi0JCVBsYXRmb3JtVUkKLQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJLnNldEhlbHAoCi0JCQkJCQljb21wb3NpdGUsCi0JCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5DT05GSUdVUkFUSU9OX1BVQkxJU0hfV0laQVJEX0FMTF9QQUdFU19DT05URVhUKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGl0bGUgYW5kIGxpbmtzIGdyb3VwLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgZ3JvdXAgY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIEdyb3VwIGNyZWF0ZVRpdGxlQW5kTGlua3NHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIHRpdGxlQW5kTGlua3NHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJdGl0bGVBbmRMaW5rc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQl0aXRsZUFuZExpbmtzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXRpdGxlQW5kTGlua3NHcm91cC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVJlc291cmNlcy50aXRsZUFuZExpbmtzR3JvdXBfdGV4dCk7Ci0JCQotCQljcmVhdGVMYWJlbCh0aXRsZUFuZExpbmtzR3JvdXAsIFB1Ymxpc2hpbmdVSVJlc291cmNlcy50aXRsZUxhYmVsX3RleHQpOwotCQl0aXRsZVRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQodGl0bGVBbmRMaW5rc0dyb3VwLCAiIiwgMzYwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMYWJlbCh0aXRsZUFuZExpbmtzR3JvdXAsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJY3JlYXRlTGFiZWwodGl0bGVBbmRMaW5rc0dyb3VwLCBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYWJvdXRIVE1MTGFiZWxfdGV4dCk7Ci0JCWFib3V0SFRNTFRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQodGl0bGVBbmRMaW5rc0dyb3VwLCAiIiwgMzYwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlzZWxlY3RIVE1MQnV0dG9uID0gbmV3IEJ1dHRvbih0aXRsZUFuZExpbmtzR3JvdXAsIFNXVC5OT05FKTsKLQkJc2VsZWN0SFRNTEJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5TRUxFQ1RfQlVUVE9OX1RFWFQpOwotCi0JCWNyZWF0ZUxhYmVsKHRpdGxlQW5kTGlua3NHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZmVlZGJhY2tVUkxMYWJlbF90ZXh0KTsKLQkJZmVlZGJhY2tVUkxUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KHRpdGxlQW5kTGlua3NHcm91cCwgIiIsIDM2MCwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3JlYXRlTGFiZWwodGl0bGVBbmRMaW5rc0dyb3VwLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXJldHVybiB0aXRsZUFuZExpbmtzR3JvdXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgTG9vayBhbmQgZmVlbCBncm91cC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gdGhlIGdyb3VwIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCBHcm91cCBjcmVhdGVMb29rQW5kRmVlbEdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgbG9va0FuZEZlZWxHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJbG9va0FuZEZlZWxHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJbG9va0FuZEZlZWxHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbG9va0FuZEZlZWxHcm91cC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVJlc291cmNlcy5sb29rQW5kRmVlbEdyb3VwX3RleHQpOwotCi0JCWNyZWF0ZUxhYmVsKGxvb2tBbmRGZWVsR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJhbm5lckltYWdlTGFiZWxfdGV4dCk7Ci0JCWJhbm5lckltYWdlVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChsb29rQW5kRmVlbEdyb3VwLCAiIiwgMzYwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlzZWxlY3RJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24obG9va0FuZEZlZWxHcm91cCwgU1dULk5PTkUpOwotCQlzZWxlY3RJbWFnZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5TRUxFQ1RfQlVUVE9OX1RFWFQpOwotCQkKLQkJcmV0dXJuIGxvb2tBbmRGZWVsR3JvdXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgR2xvc2FyeSBhbmQgaW5kZXggZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBncm91cCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgR3JvdXAgY3JlYXRlR2xvc3NhcnlBbmRJbmRleEdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgZ2xvc3NhcnlBbmRJbmRleEdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQlnbG9zc2FyeUFuZEluZGV4R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQkJZ2xvc3NhcnlBbmRJbmRleEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlnbG9zc2FyeUFuZEluZGV4R3JvdXAKLQkJCQkuc2V0VGV4dChQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZ2xvc3NhcnlBbmRJbmRleEdyb3VwX3RleHQpOwotCi0JCXB1Ymxpc2hHbG9zc2FyeUNoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3goZ2xvc3NhcnlBbmRJbmRleEdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoR2xvc3NhcnlMYWJlbF90ZXh0KTsKLQkJcHVibGlzaEluZGV4Q2hlY2tib3ggPSBjcmVhdGVDaGVja2JveChnbG9zc2FyeUFuZEluZGV4R3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hJbmRleExhYmVsX3RleHQpOwotCi0JCXJldHVybiBnbG9zc2FyeUFuZEluZGV4R3JvdXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVmFsaWRhdGlvbiBncm91cC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gdGhlIGdyb3VwIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCBHcm91cCBjcmVhdGVWYWxpZGF0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgdmFsaWRhdGlvbkdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQl2YWxpZGF0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQkJdmFsaWRhdGlvbkdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl2YWxpZGF0aW9uR3JvdXAuc2V0VGV4dChQdWJsaXNoaW5nVUlSZXNvdXJjZXMudmFsaWRhdGlvbkdyb3VwX3RleHQpOwotCi0JCWNoZWNrRXh0ZXJuYWxMaW5rc0NoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3godmFsaWRhdGlvbkdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5jaGVja0V4dGVybmFsTGlua3NMYWJlbF90ZXh0KTsKLQotCQljb252ZXJ0QnJva2VuTGlua3NDaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KHZhbGlkYXRpb25Hcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY29udmVydEJyb2tlbkxpbmtzTGFiZWxfdGV4dCk7Ci0KLQkJcmV0dXJuIHZhbGlkYXRpb25Hcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBEaWFncmFtIEdlbmVyYXRpb24gZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBncm91cCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgR3JvdXAgY3JlYXRlRGlhZ3JhbUdlbmVyYXRpb25Hcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIGRpYWdyYW1Hcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJZGlhZ3JhbUdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlkaWFncmFtR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWRpYWdyYW1Hcm91cC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVJlc291cmNlcy5kaWFncmFtR3JvdXBfdGV4dCk7Ci0KLQkJYXV0b0dlbmVyYXRlQUREQ2hlY2tib3ggPSBjcmVhdGVDaGVja2JveChkaWFncmFtR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hBY3Rpdml0eURldGFpbERpYWdyYW1zTGFiZWxfdGV4dCk7Ci0KLQkJcHVibGlzaEJhc2VBRENoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3goZGlhZ3JhbUdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoRXh0ZW5kZWRBY3Rpdml0eURpYWdyYW1zTGFiZWxfdGV4dCk7Ci0KLQkJcmV0dXJuIGRpYWdyYW1Hcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBMYXlvdXQgZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBncm91cCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgR3JvdXAgY3JlYXRlTGF5b3V0R3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBsYXlvdXRHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJbGF5b3V0R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlsYXlvdXRHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbGF5b3V0R3JvdXAuc2V0VGV4dChQdWJsaXNoaW5nVUlSZXNvdXJjZXMubGF5b3V0R3JvdXBfdGV4dCk7Ci0KLQkJcHVibGlzaExpZ2h0V2VpZ2h0VHJlZUNoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3gobGF5b3V0R3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hMaWdodFdlaWdodFRyZWVMYWJlbF90ZXh0KTsKLQotCQlleHRyYURlc2NyaXB0b3JJbmZvQ3RyID0gY3JlYXRlQ2hlY2tib3gobGF5b3V0R3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hFeHRyYURlc2NyaXB0b3JJbmZvTGFiZWxfdGV4dCk7Ci0KLQkJcmV0dXJuIGxheW91dEdyb3VwOwotCX0KLQotCS8qKgotCSAqIFByb3ZpZGUgYSBtZWFucyB0byBhZGQgYWRkaXRpb25hbCBvcHRpb25zIHRvIHRoZSBwdWJsaXNoZWQgd2ViIHNpdGUKLQkgKiBncm91cC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluY2x1ZGVBZGRpdGlvbmFsUHVibGlzaGluZ09wdGlvbnMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucyBncm91cHMgdG8gdGhpcyB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVB1Ymxpc2hpbmdPcHRpb25zR3JvdXBzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2Ujb25FbnRlclBhZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCWNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBvYmo7Ci0JCX0KLQotCQlTdHJpbmcgY29uZmlnTmFtZSA9IGNvbmZpZyAhPSBudWxsID8gY29uZmlnLmdldE5hbWUoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJdGl0bGVUZXh0LnNldFRleHQoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0VGl0bGUoY29uZmlnTmFtZSkpOwotCQliYW5uZXJJbWFnZVRleHQuc2V0VGV4dChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRCYW5uZXJJbWFnZShjb25maWdOYW1lKSk7Ci0JCWFib3V0SFRNTFRleHQuc2V0VGV4dChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXRBYm91dEhUTUwoY29uZmlnTmFtZSkpOwotCQlmZWVkYmFja1VSTFRleHQuc2V0VGV4dChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRGZWVkYmFja1VSTChjb25maWdOYW1lKSk7Ci0JCXB1Ymxpc2hHbG9zc2FyeUNoZWNrYm94LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRJbmNsdWRlR2xvc3NhcnkoY29uZmlnTmFtZSkpOwotCQlwdWJsaXNoSW5kZXhDaGVja2JveC5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0SW5jbHVkZUluZGV4KGNvbmZpZ05hbWUpKTsKLQkJY2hlY2tFeHRlcm5hbExpbmtzQ2hlY2tib3guc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldENoZWNrRXh0ZXJuYWxMaW5rcyhjb25maWdOYW1lKSk7Ci0JCWNvbnZlcnRCcm9rZW5MaW5rc0NoZWNrYm94LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRDb252ZXJ0QnJva2VuTGlua3MoY29uZmlnTmFtZSkpOwotCQlhdXRvR2VuZXJhdGVBRERDaGVja2JveC5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oY29uZmlnTmFtZSkpOwotCQlwdWJsaXNoQmFzZUFEQ2hlY2tib3guc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkKGNvbmZpZ05hbWUpKTsKLQkJcHVibGlzaExpZ2h0V2VpZ2h0VHJlZUNoZWNrYm94LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRMaWdodFdlaWdodFRyZWUoY29uZmlnTmFtZSkpOwotCQlleHRyYURlc2NyaXB0b3JJbmZvQ3RyLnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRFeHRyYURlc2NyaXB0b3JJbmZvKGNvbmZpZ05hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlJV2l6YXJkUGFnZSBwYWdlID0gZ2V0V2l6YXJkKCkuZ2V0TmV4dFBhZ2UodGhpcyk7Ci0JCXRyeSB7Ci0JCQkoKEJhc2VXaXphcmRQYWdlKSBwYWdlKS5vbkVudGVyUGFnZShjb25maWcpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBwYWdlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3RlbmVycyBmb3IgdGhlIGNvbnRyb2xzIG9uIHRoaXMgcGFnZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJc2VsZWN0SW1hZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXRyeSB7Ci0JCQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coY29tcG9zaXRlLmdldFNoZWxsKCksCi0JCQkJCQkJU1dULk9QRU4pOwotCQkJCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10gewotCQkJCQkJCSIqLmdpZiIsICIqLmpwZyIsICIqLmJtcCIgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVN0cmluZyBpbWFnZUZpbGUgPSBkaWFsb2cub3BlbigpOwotCQkJCQlpZiAoaW1hZ2VGaWxlICE9IG51bGwpIHsKLQkJCQkJCWJhbm5lckltYWdlVGV4dC5zZXRUZXh0KGltYWdlRmlsZSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJc2VsZWN0SFRNTEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhjb21wb3NpdGUuZ2V0U2hlbGwoKSwKLQkJCQkJCQlTV1QuT1BFTik7Ci0JCQkJCWRpYWxvZwotCQkJCQkJCS5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJCQkiKi5odG0iLCAiKi5odG1sIiB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCVN0cmluZyBodG1sRmlsZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJCWlmIChodG1sRmlsZSAhPSBudWxsKSB7Ci0JCQkJCQlhYm91dEhUTUxUZXh0LnNldFRleHQoaHRtbEZpbGUpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlI3NldFZpc2libGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWlmICh2aXNpYmxlKSB7Ci0JCQlEaXNwbGF5IGRpc3BsYXkgPSB0aXRsZVRleHQuZ2V0RGlzcGxheSgpOwotCQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJdGl0bGVUZXh0LnNldEZvY3VzKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc2VsZWN0ZWQgcHVibGlzaGluZyBvcHRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5QdWJsaXNoT3B0aW9uczwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIFB1Ymxpc2hPcHRpb25zIGdldFB1Ymxpc2hpbmdPcHRpb25zKCkgewotCQlQdWJsaXNoT3B0aW9ucyBvcHRpb25zID0gbmV3IFB1Ymxpc2hPcHRpb25zKCk7Ci0KLQkJb3B0aW9ucy5zZXRUaXRsZShnZXRXZWJTaXRlVGl0bGUoKSk7Ci0JCW9wdGlvbnMuc2V0QmFubmVySW1hZ2UoZ2V0QmFubmVySW1hZ2VQYXRoKCkpOwotCQlvcHRpb25zLnNldEFib3V0SFRNTChnZXRBYm91dEhUTUxQYXRoKCkpOwotCQlvcHRpb25zLnNldEZlZWRiYWNrVVJMKGdldEZlZWRiYWNrVVJMKCkpOwotCQlvcHRpb25zLnNldEdlbmVyYXRlR2xvc3NhcnkoZ2V0UHVibGlzaEdsb3NzYXJ5U2VsZWN0aW9uKCkpOwotCQlvcHRpb25zLnNldEdlbmVyYXRlSW5kZXgoZ2V0UHVibGlzaEluZGV4U2VsZWN0aW9uKCkpOwotCQlvcHRpb25zLnNldENoZWNrRXh0TGlua3MoZ2V0Q2hlY2tFeHRlcm5hbExpbmtzU2VsZWN0aW9uKCkpOwotCQlvcHRpb25zLnNldEF1dG9HZW5lcmF0ZUFjdGl2aXR5RGlhZ3JhbXMoZ2V0QXV0b0dlbmVyYXRlQUREU2VsZWN0aW9uKCkpOwotCQlvcHRpb25zLnNldFVub3BlbkV4dGVuZGVkQWN0aXZpdHlEaWFncmFtKGdldFB1Ymxpc2hCYXNlQURTZWxlY3Rpb24oKSk7Ci0JCW9wdGlvbnMuc2V0Q29udmVydEJyb2tlbkxpbmtzKGdldENvbnZlcnRCcm9rZW5MaW5rc1NlbGVjdGlvbigpKTsKLQkJb3B0aW9ucwotCQkJCS5zZXRHZW5lcmF0ZUxpZ2h0V2VpZ2h0VHJlZShnZXRQdWJsaXNoTGlnaHRXZWlnaHRUcmVlU2VsZWN0aW9uKCkpOwotCQlvcHRpb25zCi0JCQkJLnNldFNob3dFeHRyYURlc2NyaXB0b3JJbmZvKGdldFNob3dFeHRyYURlc2NyaXB0b3JJbmZvU2VsZWN0aW9uKCkpOwotCi0JCXJldHVybiBvcHRpb25zOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHdlYiBzaXRlIHRpdGxlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0V2ViU2l0ZVRpdGxlKCkgewotCQlyZXR1cm4gdGl0bGVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgYmFubmVyIGltYWdlIHBhdGguCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRCYW5uZXJJbWFnZVBhdGgoKSB7Ci0JCXJldHVybiBiYW5uZXJJbWFnZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBhYm91dCBIVE1MIHBhdGguCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBYm91dEhUTUxQYXRoKCkgewotCQlyZXR1cm4gYWJvdXRIVE1MVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGZlZWRiYWNrIFVSTC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZlZWRiYWNrVVJMKCkgewotCQlyZXR1cm4gZmVlZGJhY2tVUkxUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgcHVibGlzaCBnbG9zc2FyeSBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0UHVibGlzaEdsb3NzYXJ5U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gcHVibGlzaEdsb3NzYXJ5Q2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgcHVibGlzaCBpbmRleCBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0UHVibGlzaEluZGV4U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gcHVibGlzaEluZGV4Q2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgY2hlY2sgZXh0ZXJuYWwgbGlua3Mgc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldENoZWNrRXh0ZXJuYWxMaW5rc1NlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGNoZWNrRXh0ZXJuYWxMaW5rc0NoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGNvbnZlcnQgYnJva2VuIGxpbmtzIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRDb252ZXJ0QnJva2VuTGlua3NTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBjb252ZXJ0QnJva2VuTGlua3NDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBhdXRvIGdlbmVyYXRlIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0QXV0b0dlbmVyYXRlQUREU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gYXV0b0dlbmVyYXRlQUREQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgcHVibGlzaCBhY3Rpdml0eSBkaWFncmFtIGZvciBiYXNlIGFjdGl2dGllcyB3aXRoCi0JICogdW5tb2RpZmllZCBleHRlbnNpb25zLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldFB1Ymxpc2hCYXNlQURTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBwdWJsaXNoQmFzZUFEQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgZ2VuZXJhdGUgbGlnaHQgd2VpZ2h0IHRyZWUgc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldFB1Ymxpc2hMaWdodFdlaWdodFRyZWVTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBwdWJsaXNoTGlnaHRXZWlnaHRUcmVlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgc2hvdyBleHRyYSBkZXNjcmlwdG9yIGluZm8gc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldFNob3dFeHRyYURlc2NyaXB0b3JJbmZvU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gZXh0cmFEZXNjcmlwdG9ySW5mb0N0ci5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgdXNlciBzZWxlY3Rpb25zIGluIHRoaXMgd2l6YXJkIHBhZ2UgdG8gcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlUHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNvbmZpZ05hbWUgPSBjb25maWcuZ2V0TmFtZSgpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0VGl0bGUoY29uZmlnTmFtZSwgZ2V0V2ViU2l0ZVRpdGxlKCkpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0QmFubmVySW1hZ2UoY29uZmlnTmFtZSwKLQkJCQkJZ2V0QmFubmVySW1hZ2VQYXRoKCkpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkJLnNldEFib3V0SFRNTChjb25maWdOYW1lLCBnZXRBYm91dEhUTUxQYXRoKCkpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkJLnNldEZlZWRiYWNrVVJMKGNvbmZpZ05hbWUsIGdldEZlZWRiYWNrVVJMKCkpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0SW5jbHVkZUdsb3NzYXJ5KGNvbmZpZ05hbWUsCi0JCQkJCWdldFB1Ymxpc2hHbG9zc2FyeVNlbGVjdGlvbigpKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldEluY2x1ZGVJbmRleChjb25maWdOYW1lLAotCQkJCQlnZXRQdWJsaXNoSW5kZXhTZWxlY3Rpb24oKSk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRDaGVja0V4dGVybmFsTGlua3MoY29uZmlnTmFtZSwKLQkJCQkJZ2V0Q2hlY2tFeHRlcm5hbExpbmtzU2VsZWN0aW9uKCkpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0Q29udmVydEJyb2tlbkxpbmtzKGNvbmZpZ05hbWUsCi0JCQkJCWdldENvbnZlcnRCcm9rZW5MaW5rc1NlbGVjdGlvbigpKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkKGNvbmZpZ05hbWUsCi0JCQkJCWdldEF1dG9HZW5lcmF0ZUFERFNlbGVjdGlvbigpKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKAotCQkJCQljb25maWdOYW1lLCBnZXRQdWJsaXNoQmFzZUFEU2VsZWN0aW9uKCkpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0TGlnaHRXZWlnaHRUcmVlKGNvbmZpZ05hbWUsCi0JCQkJCWdldFB1Ymxpc2hMaWdodFdlaWdodFRyZWVTZWxlY3Rpb24oKSk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRFeHRyYURlc2NyaXB0b3JJbmZvKGNvbmZpZ05hbWUsCi0JCQkJCWdldFNob3dFeHRyYURlc2NyaXB0b3JJbmZvU2VsZWN0aW9uKCkpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvd2l6YXJkcy9BYnN0cmFjdFB1Ymxpc2hXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3dpemFyZHMvQWJzdHJhY3RQdWJsaXNoV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc5YTZiNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvd2l6YXJkcy9BYnN0cmFjdFB1Ymxpc2hXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEFic3RyYWN0IHB1Ymxpc2hpbmcgd2l6YXJkIGNsYXNzLiAKLSAqIHVzZSB0aGUgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHVibGlzaGVycyBleHRlbnNpb24gcG9pbnQgdG8gZXh0ZW5kIHRoaXMgY2xhc3MgCi0gKiBpZiB5b3UgbmVlZCB0byBjdXN0b21pemUgdGhlIHB1Ymxpc2hpbmcgdWkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQdWJsaXNoV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQkvLyBUaGUgcHVibGlzaGluZyBvcHRpb25zLgotCXByb3RlY3RlZCBQdWJsaXNoT3B0aW9ucyBkYXRhTW9kZWwgPSBudWxsOwotCi0JLyoqCi0JICogY29uc3RydWN0b3IKLQkgKgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFB1Ymxpc2hXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIGZpbmlzaCB0aGUgd2l6YXJkCi0JICogCi0JICogQHJldHVybiBib29sZWFuIHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBpbml0aWFsaXplIHRoZSB3aXphcmQuCi0JICogCi0JICogQHBhcmFtIHdvcmtiZW5jaCBJV29ya2JlbmNoCi0JICogQHBhcmFtIHNlbGVjdGlvbiBJU3RydWN0dXJlZFNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbik7Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBwdWJsaXNoIG9wdGlvbnMKLQkgKiAKLQkgKiBAcmV0dXJuIFB1Ymxpc2hPcHRpb25zCi0JICovCi0JcHVibGljIGFic3RyYWN0IFB1Ymxpc2hPcHRpb25zIGdldFB1Ymxpc2hPcHRpb25zKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy93aXphcmRzL1B1Ymxpc2hDb25maWdQdWJsaXNoT3B0aW9uc1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3dpemFyZHMvUHVibGlzaENvbmZpZ1B1Ymxpc2hPcHRpb25zUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZDY0ZTFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3dpemFyZHMvUHVibGlzaENvbmZpZ1B1Ymxpc2hPcHRpb25zUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5QdWJsaXNoaW5nVUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBUaGUgU2VsZWN0IFB1Ymxpc2hpbmcgT3B0aW9ucyBwYWdlIGluIHRoZSBQdWJsaXNoIE1ldGhvZCBDb25maWd1cmF0aW9uCi0gKiB3aXphcmQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogCi0gKiBUT0RPOiBSZW5hbWUgdGhpcyBjbGFzcyB0byBQdWJsaXNoQ29uZmlnU3BlY2lmeU9wdGlvbnNQYWdlIGZpeCBmb3IKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzM4MTcKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hDb25maWdQdWJsaXNoT3B0aW9uc1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIFRleHQgZGVzdGluYXRpb25QYXRoVGV4dDsKLQotCXByaXZhdGUgVGV4dCB0aXRsZVRleHQ7Ci0KLQlwcml2YXRlIFRleHQgYmFubmVySW1hZ2VUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IGFib3V0SFRNTFRleHQ7Ci0KLQlwcml2YXRlIFRleHQgZmVlZGJhY2tVUkxUZXh0OwotCi0JcHJpdmF0ZSBCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gZGVmYXVsdFBhdGhDaGVja2JveDsKLQotCXByaXZhdGUgQnV0dG9uIGRlZmF1bHRGZWVkYmFja0NoZWNrYm94OwotCi0JcHJpdmF0ZSBCdXR0b24gc2VsZWN0SW1hZ2VCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBzZWxlY3RIVE1MQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gaW5jbHVkZUdsb3NzYXJ5OwotCi0JcHJpdmF0ZSBCdXR0b24gaW5jbHVkZUluZGV4OwotCi0JcHJpdmF0ZSBCdXR0b24gY2hlY2tFeHRlcm5hbExpbmtzOwotCi0JcHJpdmF0ZSBCdXR0b24gY29udmVydEJyb2tlbkxpbmtzOwotCi0JcHJpdmF0ZSBCdXR0b24gYXV0b0dlbmVyYXRlQWN0aXZpdHlEaWFncmFtczsKLQotCXByaXZhdGUgYm9vbGVhbiBkaXNwbGF5RGVzdGluYXRpb25Hcm91cCA9IHRydWU7Ci0KLQlwcml2YXRlIEJ1dHRvbiBleHRyYURlc2NyaXB0b3JJbmZvQ3RyOwotCi0JcHJpdmF0ZSBCdXR0b24gbGlnaHRXZWlnaHRUcmVlQ3RyOwotCi0JLy8gZG9uJ3Qgd2FudCB0byBkbyB0aGlzCi0JLy8gcHJpdmF0ZSBCdXR0b24gaW5jbHVkZUVtcHR5Q2F0ZWdvcmllc0N0cjsKLQotCXByb3RlY3RlZCBQdWJsaXNoT3B0aW9ucyBkYXRhTW9kZWwgPSBudWxsOwotCi0JcHJvdGVjdGVkIFN0cmluZyBjb25maWdOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQnV0dG9uIHB1Ymxpc2hVbk9wZW5FeHRlbmRBY3Rpdml0eURpYWdyYW07Ci0KLQkvLyBwcml2YXRlIEJ1dHRvbiBjcmVhdGVXQVJDaGVja0JveDsKLQkvLyBwcml2YXRlIFRleHQgd2ViQXBwTmFtZVRleHQ7Ci0JLy8gcHJpdmF0ZSBMYWJlbCB3YXJMYWJlbDsKLQkvLyBwcml2YXRlIEJ1dHRvbiBpbmNsdWRlU2VhcmNoOwotCS8vIHByaXZhdGUgQ29tcG9zaXRlIHNlYXJjaENvbXBvc2l0ZTsKLQotCS8vIHByaXZhdGUgYm9vbGVhbiBzaG93U2VhcmNoQ2hvaWNlID0gdHJ1ZTsKLQkvLyBwcml2YXRlIGJvb2xlYW4gc2hvd0FwcGxldENob2ljZSA9IHRydWU7Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaENvbmZpZ1B1Ymxpc2hPcHRpb25zUGFnZShTdHJpbmcgcGFnZU5hbWUsCi0JCQlib29sZWFuIGRpc3BsYXlEZXN0aW5hdGlvbkdyb3VwLCBQdWJsaXNoT3B0aW9ucyBkYXRhTW9kZWwpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0UHVibGlzaGluZ09wdGlvbnNXaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zV2l6YXJkUGFnZV90ZXh0KTsKLQkJdGhpcy5kaXNwbGF5RGVzdGluYXRpb25Hcm91cCA9IGRpc3BsYXlEZXN0aW5hdGlvbkdyb3VwOwotCQl0aGlzLmRhdGFNb2RlbCA9IGRhdGFNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoQ29uZmlnUHVibGlzaE9wdGlvbnNQYWdlKFN0cmluZyBwYWdlTmFtZSwKLQkJCVB1Ymxpc2hPcHRpb25zIGRhdGFNb2RlbCkgewotCQl0aGlzKHBhZ2VOYW1lLCB0cnVlLCBkYXRhTW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkvLyBpZiAoUHVibGlzaE1hbmFnZXIuZ2V0QXBwbGV0U2VhcmNoUGF0aCgpPT1udWxsKSBzaG93U2VhcmNoQ2hvaWNlID0KLQkJLy8gZmFsc2U7Ci0JCS8vIGlmIChQdWJsaXNoTWFuYWdlci5nZXRBcHBsZXRQYXRoKCk9PW51bGwpIHNob3dBcHBsZXRDaG9pY2UgPSBmYWxzZTsKLQotCQkvLyBDcmVhdGUgdGhlIGNvbXBvc2l0ZSB0byBob2xkIHRoZSB3aWRnZXRzLgotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCVBsYXRmb3JtVUkKLQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJLnNldEhlbHAoCi0JCQkJCQljb21wb3NpdGUsCi0JCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5DT05GSUdVUkFUSU9OX1BVQkxJU0hfV0laQVJEX0FMTF9QQUdFU19DT05URVhUKTsKLQotCQljcmVhdGVEZXN0aW5hdGlvbkdyb3VwVUkoY29tcG9zaXRlKTsKLQkJY3JlYXRlUHVibGlzaGluZ09wdGlvbnNVSShjb21wb3NpdGUpOwotCQljcmVhdGVQdWJsaXNoaW5nTWlzY09wdGlvbnNVSShjb21wb3NpdGUpOwotCQlpbml0aWFsaXplQ29udHJvbHMoKTsKLQkJYWRkTGlzdGVuZXJzKGNvbXBvc2l0ZSk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlc3RpbmF0aW9uR3JvdXBVSShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWlmIChkaXNwbGF5RGVzdGluYXRpb25Hcm91cCkgewotCQkJLy8gQ3JlYXRlIHRoZSBEZXN0aW5hdGlvbiBQYXRoIGdyb3VwLgotCQkJR3JvdXAgZGVzdGluYXRpb25Hcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJCWRlc3RpbmF0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCQlkZXN0aW5hdGlvbkdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotCQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCWRlc3RpbmF0aW9uR3JvdXAKLQkJCQkJLnNldFRleHQoUHVibGlzaGluZ1VJUmVzb3VyY2VzLmRlc3RpbmF0aW9uRGlyZWN0b3J5R3JvdXBfdGV4dCk7Ci0KLQkJCWNyZWF0ZUxhYmVsKGRlc3RpbmF0aW9uR3JvdXAsIFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wYXRoTGFiZWxfdGV4dCk7Ci0JCQlkZXN0aW5hdGlvblBhdGhUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KGRlc3RpbmF0aW9uR3JvdXAsCi0JCQkJCSIiLCAzNjAsIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oZGVzdGluYXRpb25Hcm91cCwgU1dULk5PTkUpOwotCQkJYnJvd3NlQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkJST1dTRV9CVVRUT05fVEVYVCk7Ci0JCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJCWNyZWF0ZUxhYmVsKGRlc3RpbmF0aW9uR3JvdXAsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJZGVmYXVsdFBhdGhDaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KGRlc3RpbmF0aW9uR3JvdXAsCi0JCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy51c2VEZWZhdWx0UGF0aENoZWNrYm94X3RleHQsIDIpOwotCQkJZGVmYXVsdFBhdGhDaGVja2JveC5zZXRTZWxlY3Rpb24oZGVzdGluYXRpb25QYXRoVGV4dC5nZXRUZXh0KCkKLQkJCQkJLmVxdWFscyhQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXREZWZhdWx0UHVibGlzaFBhdGgoKSkpOwotCQkJZGVzdGluYXRpb25QYXRoVGV4dC5zZXRFbmFibGVkKCFkZWZhdWx0UGF0aENoZWNrYm94LmdldFNlbGVjdGlvbigpKTsKLQotCQkJaWYgKCFkZWZhdWx0UGF0aENoZWNrYm94LmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQdWJsaXNoaW5nT3B0aW9uc1VJKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJLy8gQ3JlYXRlIHRoZSBQdWJsaXNoZWQgV2Vic2l0ZSBncm91cC4KLQkJR3JvdXAgd2ViU2l0ZUdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQl3ZWJTaXRlR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXdlYlNpdGVHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJd2ViU2l0ZUdyb3VwLnNldFRleHQoUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hXZWJTaXRlR3JvdXBfdGV4dCk7Ci0KLQkJY3JlYXRlTGFiZWwod2ViU2l0ZUdyb3VwLCBQdWJsaXNoaW5nVUlSZXNvdXJjZXMudGl0bGVMYWJlbF90ZXh0KTsKLQkJdGl0bGVUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KHdlYlNpdGVHcm91cCwgIiIsIDM2MCwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3JlYXRlTGFiZWwod2ViU2l0ZUdyb3VwLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbCh3ZWJTaXRlR3JvdXAsIFB1Ymxpc2hpbmdVSVJlc291cmNlcy5iYW5uZXJJbWFnZUxhYmVsX3RleHQpOwotCQliYW5uZXJJbWFnZVRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQod2ViU2l0ZUdyb3VwLCAiIiwgMzYwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlzZWxlY3RJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24od2ViU2l0ZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXNlbGVjdEltYWdlQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LlNFTEVDVF9CVVRUT05fVEVYVCk7Ci0KLQkJY3JlYXRlTGFiZWwod2ViU2l0ZUdyb3VwLCBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYWJvdXRIVE1MTGFiZWxfdGV4dCk7Ci0JCWFib3V0SFRNTFRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQod2ViU2l0ZUdyb3VwLCAiIiwgMzYwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlzZWxlY3RIVE1MQnV0dG9uID0gbmV3IEJ1dHRvbih3ZWJTaXRlR3JvdXAsIFNXVC5OT05FKTsKLQkJc2VsZWN0SFRNTEJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5TRUxFQ1RfQlVUVE9OX1RFWFQpOwotCi0JCWNyZWF0ZUxhYmVsKHdlYlNpdGVHcm91cCwgUHVibGlzaGluZ1VJUmVzb3VyY2VzLmZlZWRiYWNrVVJMTGFiZWxfdGV4dCk7Ci0JCWZlZWRiYWNrVVJMVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dCh3ZWJTaXRlR3JvdXAsICIiLCAzNjAsIDEpOyAvLyROT04tTkxTLTEkCi0JCWNyZWF0ZUxhYmVsKHdlYlNpdGVHcm91cCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWNyZWF0ZUxhYmVsKHdlYlNpdGVHcm91cCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWRlZmF1bHRGZWVkYmFja0NoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3god2ViU2l0ZUdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy51c2VEZWZhdWx0RmVlZGJhY2tMYWJlbF90ZXh0LCAyKTsKLQotCQlpbmNsdWRlR2xvc3NhcnkgPSBjcmVhdGVDaGVja2JveCh3ZWJTaXRlR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hHbG9zc2FyeUxhYmVsX3RleHQsIDMpOwotCQlpbmNsdWRlSW5kZXggPSBjcmVhdGVDaGVja2JveCh3ZWJTaXRlR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hJbmRleExhYmVsX3RleHQsIDMpOwotCi0JCS8vIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGFkZCBhZGRpdGlvbmFsIG9wdGlvbnMKLQkJaW5jbHVkZUFkZGl0aW9uYWxQdWJsaXNoaW5nT3B0aW9ucyh3ZWJTaXRlR3JvdXApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluY2x1ZGVBZGRpdGlvbmFsUHVibGlzaGluZ09wdGlvbnMoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVB1Ymxpc2hpbmdNaXNjT3B0aW9uc1VJKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJLy8gQ3JlYXRlIHRoZSBNaXNjIGdyb3VwLgotCQlHcm91cCB2YWxpZGF0aW9uR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCXZhbGlkYXRpb25Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJdmFsaWRhdGlvbkdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl2YWxpZGF0aW9uR3JvdXAuc2V0VGV4dChQdWJsaXNoaW5nVUlSZXNvdXJjZXMudmFsaWRhdGlvbkdyb3VwX3RleHQpOwotCi0JCWNoZWNrRXh0ZXJuYWxMaW5rcyA9IGNyZWF0ZUNoZWNrYm94KHZhbGlkYXRpb25Hcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY2hlY2tFeHRlcm5hbExpbmtzTGFiZWxfdGV4dCk7Ci0KLQkJY29udmVydEJyb2tlbkxpbmtzID0gY3JlYXRlQ2hlY2tib3godmFsaWRhdGlvbkdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5jb252ZXJ0QnJva2VuTGlua3NMYWJlbF90ZXh0KTsKLQotCQkvLyBDcmVhdGUgdGhlIE1pc2MgZ3JvdXAuCi0JCUdyb3VwIGRpYWdyYW1Hcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJZGlhZ3JhbUdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlkaWFncmFtR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWRpYWdyYW1Hcm91cC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVJlc291cmNlcy5kaWFncmFtR3JvdXBfdGV4dCk7Ci0KLQkJYXV0b0dlbmVyYXRlQWN0aXZpdHlEaWFncmFtcyA9IGNyZWF0ZUNoZWNrYm94KGRpYWdyYW1Hcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaEFjdGl2aXR5RGV0YWlsRGlhZ3JhbXNMYWJlbF90ZXh0KTsKLQotCQlwdWJsaXNoVW5PcGVuRXh0ZW5kQWN0aXZpdHlEaWFncmFtID0gY3JlYXRlQ2hlY2tib3goZGlhZ3JhbUdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoRXh0ZW5kZWRBY3Rpdml0eURpYWdyYW1zTGFiZWxfdGV4dCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBsYXlvdXQgZ3JvdXAuCi0JCUdyb3VwIGxheW91dEdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQlsYXlvdXRHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWxheW91dEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlsYXlvdXRHcm91cC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVJlc291cmNlcy5sYXlvdXRHcm91cF90ZXh0KTsKLQotCQlsaWdodFdlaWdodFRyZWVDdHIgPSBjcmVhdGVDaGVja2JveChsYXlvdXRHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaExpZ2h0V2VpZ2h0VHJlZUxhYmVsX3RleHQpOwotCi0JCWV4dHJhRGVzY3JpcHRvckluZm9DdHIgPSBjcmVhdGVDaGVja2JveChsYXlvdXRHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaEV4dHJhRGVzY3JpcHRvckluZm9MYWJlbF90ZXh0KTsKLQotCQlleHRyYURlc2NyaXB0b3JJbmZvQ3RyCi0JCQkJLnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXRFeHRyYURlc2NyaXB0b3JJbmZvKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb250cm9scygpIHsKLQkJLy8gaW5jbHVkZUdsb3NzYXJ5LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkvLyAuZ2V0SW5jbHVkZUdsb3NzYXJ5KCkpOwotCQkvLyBpbmNsdWRlSW5kZXguc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmdldEluY2x1ZGVJbmRleCgpKTsKLQkJLy8gY2hlY2tFeHRlcm5hbExpbmtzLnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkvLyAuZ2V0Q2hlY2tFeHRlcm5hbExpbmtzKCkpOwotCQkvLyBjb252ZXJ0QnJva2VuTGlua3Muc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCS8vIC5nZXRDb252ZXJ0QnJva2VuTGlua3MoKSk7Ci0JCS8vIGF1dG9HZW5lcmF0ZUFjdGl2aXR5RGlhZ3JhbXMuc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCS8vIC5nZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCgpKTsKLQkJLy8gcHVibGlzaFVuT3BlbkV4dGVuZEFjdGl2aXR5RGlhZ3JhbS5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJLy8gLmdldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKCkpOwotCQkvLyBsaWdodFdlaWdodFRyZWVDdHIuc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCS8vIC5nZXRMaWdodFdlaWdodFRyZWUoKSk7Ci0JCS8vIGV4dHJhRGVzY3JpcHRvckluZm9DdHIuc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCS8vIC5nZXRFeHRyYURlc2NyaXB0b3JJbmZvKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJc3VwZXIub25FbnRlclBhZ2Uob2JqKTsKLQkJY29uZmlnTmFtZSA9IChTdHJpbmcpIG9iajsKLQkJdHJ5IHsKLQkJCVN0cmluZyBpbml0UGF0aCA9IFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJCS5nZXRQdWJsaXNoUGF0aChjb25maWdOYW1lKTsKLQkJCWlmIChpbml0UGF0aCA9PSBudWxsIHx8IGluaXRQYXRoLmxlbmd0aCgpIDw9IDApCi0JCQkJaW5pdFBhdGggPSBQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXREZWZhdWx0UHVibGlzaFBhdGgoKTsKLQkJCWRlc3RpbmF0aW9uUGF0aFRleHQuc2V0VGV4dChpbml0UGF0aCk7Ci0JCQlkZWZhdWx0UGF0aENoZWNrYm94LnNldFNlbGVjdGlvbihkZXN0aW5hdGlvblBhdGhUZXh0LmdldFRleHQoKQotCQkJCQkuZXF1YWxzKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmdldERlZmF1bHRQdWJsaXNoUGF0aCgpKSk7Ci0JCQlkZXN0aW5hdGlvblBhdGhUZXh0LnNldEVuYWJsZWQoIWRlZmF1bHRQYXRoQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpOwotCi0JCQlpZiAoIWRlZmF1bHRQYXRoQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0aXRsZVRleHQuc2V0VGV4dChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXRUaXRsZShjb25maWdOYW1lKSk7Ci0JCWJhbm5lckltYWdlVGV4dC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldEJhbm5lckltYWdlKGNvbmZpZ05hbWUpKTsKLQkJYWJvdXRIVE1MVGV4dC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmdldEFib3V0SFRNTChjb25maWdOYW1lKSk7Ci0JCVN0cmluZyBmZWVkYmFja1VSTCA9IFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmdldEZlZWRiYWNrVVJMKGNvbmZpZ05hbWUpOwotCQlpZiAoZmVlZGJhY2tVUkwgPT0gbnVsbCB8fCBmZWVkYmFja1VSTC5sZW5ndGgoKSA8PSAwKQotCQkJZmVlZGJhY2tVUkwgPSBQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXREZWZhdWx0RmVlZGJhY2tVUkwoKTsKLQkJZmVlZGJhY2tVUkxUZXh0LnNldFRleHQoZmVlZGJhY2tVUkwpOwotCQlkZWZhdWx0RmVlZGJhY2tDaGVja2JveC5zZXRTZWxlY3Rpb24oZmVlZGJhY2tVUkxUZXh0LmdldFRleHQoKS5lcXVhbHMoCi0JCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0RGVmYXVsdEZlZWRiYWNrVVJMKCkpKTsKLQkJZmVlZGJhY2tVUkxUZXh0LnNldEVuYWJsZWQoIWRlZmF1bHRGZWVkYmFja0NoZWNrYm94LmdldFNlbGVjdGlvbigpKTsKLQkJaW5jbHVkZUdsb3NzYXJ5LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRJbmNsdWRlR2xvc3NhcnkoY29uZmlnTmFtZSkpOwotCQlpbmNsdWRlSW5kZXguc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldEluY2x1ZGVJbmRleChjb25maWdOYW1lKSk7Ci0KLQkJLy8gY3JlYXRlV0FSQ2hlY2tCb3guc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmdldEluY2x1ZGVTZWFyY2goY29uZmlnTmFtZSkpOwotCQkvLyBTdHJpbmcgd2ViQXBwTmFtZSA9Ci0JCS8vIFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmdldFdlYkFwcE5hbWUoY29uZmlnTmFtZSk7Ci0JCS8vIGlmICh3ZWJBcHBOYW1lICE9IG51bGwgJiYgd2ViQXBwTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJLy8gd2ViQXBwTmFtZVRleHQuc2V0VGV4dCh3ZWJBcHBOYW1lKTsKLQkJLy8gfQotCQkvLyB3ZWJBcHBOYW1lVGV4dC5zZXRFbmFibGVkKGNyZWF0ZVdBUkNoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJLy8KLQkJLy8gaW5jbHVkZVNlYXJjaC5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0SW5jbHVkZVNlYXJjaChjb25maWdOYW1lKSk7Ci0KLQkJY2hlY2tFeHRlcm5hbExpbmtzLnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRDaGVja0V4dGVybmFsTGlua3MoY29uZmlnTmFtZSkpOwotCQljb252ZXJ0QnJva2VuTGlua3Muc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldENvbnZlcnRCcm9rZW5MaW5rcyhjb25maWdOYW1lKSk7Ci0JCWF1dG9HZW5lcmF0ZUFjdGl2aXR5RGlhZ3JhbXMuc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkKGNvbmZpZ05hbWUpKTsKLQkJcHVibGlzaFVuT3BlbkV4dGVuZEFjdGl2aXR5RGlhZ3JhbS5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oY29uZmlnTmFtZSkpOwotCQlsaWdodFdlaWdodFRyZWVDdHIuc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldExpZ2h0V2VpZ2h0VHJlZShjb25maWdOYW1lKSk7Ci0JCWV4dHJhRGVzY3JpcHRvckluZm9DdHIuc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldEV4dHJhRGVzY3JpcHRvckluZm8oY29uZmlnTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoIWRpc3BsYXlEZXN0aW5hdGlvbkdyb3VwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWlmICghaXNUZXh0Tm9uRW1wdHkoZGVzdGluYXRpb25QYXRoVGV4dCkpIHsKLQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW52YWxpZFBhdGhFcnJvcl9tc2cpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlTdHJpbmcgcGF0aCA9IGRlc3RpbmF0aW9uUGF0aFRleHQuZ2V0VGV4dCgpOwotCQlJUGF0aCBlY1BhdGggPSBQYXRoLmZyb21PU1N0cmluZyhwYXRoKTsKLQkJYm9vbGVhbiBpc1ZhbGlkID0gZWNQYXRoLmlzVmFsaWRQYXRoKHBhdGgpOwotCQlpZiAoIWlzVmFsaWQpIHsKLQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW52YWxpZFBhdGhFcnJvcl9tc2cpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoIVN0clV0aWwuaXNWYWxpZFB1Ymxpc2hQYXRoKHBhdGgpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRQYXRoQ2hhcnNFcnJvcl9tc2cpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3RlbmVycyBmb3IgdGhlIGNvbnRyb2xzIG9uIHRoaXMgcGFnZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaWYgKGRpc3BsYXlEZXN0aW5hdGlvbkdyb3VwKSB7Ci0JCQlkZXN0aW5hdGlvblBhdGhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCX0KLQkJCX0pOwotCi0JCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCURpcmVjdG9yeURpYWxvZyBkZCA9IG5ldyBEaXJlY3RvcnlEaWFsb2coY29tcG9zaXRlCi0JCQkJCQkJCS5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCQkJCQlTdHJpbmcgZGVzdGluYXRpb24gPSBkZC5vcGVuKCk7Ci0JCQkJCQlpZiAoZGVzdGluYXRpb24gIT0gbnVsbCkgewotCQkJCQkJCWRlc3RpbmF0aW9uUGF0aFRleHQuc2V0VGV4dChkZXN0aW5hdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWRlZmF1bHRQYXRoQ2hlY2tib3guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChkZWZhdWx0UGF0aENoZWNrYm94LmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCQlkZXN0aW5hdGlvblBhdGhUZXh0LnNldFRleHQoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkJCQkJLmdldERlZmF1bHRQdWJsaXNoUGF0aCgpKTsKLQkJCQkJCWRlc3RpbmF0aW9uUGF0aFRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmcgaW5pdFBhdGggPSBQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCQkJCQkuZ2V0UHVibGlzaFBhdGgoY29uZmlnTmFtZSk7Ci0JCQkJCQlpZiAoaW5pdFBhdGggPT0gbnVsbCB8fCBpbml0UGF0aC5sZW5ndGgoKSA8PSAwKQotCQkJCQkJCWluaXRQYXRoID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkJCQkJCS5nZXREZWZhdWx0UHVibGlzaFBhdGgoKTsKLQkJCQkJCWRlc3RpbmF0aW9uUGF0aFRleHQuc2V0VGV4dChpbml0UGF0aCk7Ci0JCQkJCQlkZXN0aW5hdGlvblBhdGhUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJLy8gY3JlYXRlV0FSQ2hlY2tCb3guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkvLyBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkvLyB3ZWJBcHBOYW1lVGV4dC5zZXRFbmFibGVkKGNyZWF0ZVdBUkNoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJLy8gfQotCQkvLyB9KTsKLQotCQlkZWZhdWx0RmVlZGJhY2tDaGVja2JveC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChkZWZhdWx0RmVlZGJhY2tDaGVja2JveC5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlmZWVkYmFja1VSTFRleHQuc2V0VGV4dChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCQkJCS5nZXREZWZhdWx0RmVlZGJhY2tVUkwoKSk7Ci0JCQkJCWZlZWRiYWNrVVJMVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlTdHJpbmcgaW5pdFVybCA9IFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJCQkJLmdldEZlZWRiYWNrVVJMKGNvbmZpZ05hbWUpOwotCQkJCQlpZiAoaW5pdFVybCA9PSBudWxsIHx8IGluaXRVcmwubGVuZ3RoKCkgPD0gMCkKLQkJCQkJCWluaXRVcmwgPSBQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCQkJCQkuZ2V0RGVmYXVsdEZlZWRiYWNrVVJMKCk7Ci0JCQkJCWZlZWRiYWNrVVJMVGV4dC5zZXRUZXh0KGluaXRVcmwpOwotCQkJCQlmZWVkYmFja1VSTFRleHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXNlbGVjdEltYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl0cnkgewotCQkJCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGNvbXBvc2l0ZS5nZXRTaGVsbCgpLAotCQkJCQkJCVNXVC5PUEVOKTsKLQkJCQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsKLQkJCQkJCQkiKi5naWYiLCAiKi5qcGciLCAiKi5ibXAiIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlTdHJpbmcgaW1hZ2VGaWxlID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKGltYWdlRmlsZSAhPSBudWxsKSB7Ci0JCQkJCQliYW5uZXJJbWFnZVRleHQuc2V0VGV4dChpbWFnZUZpbGUpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXNlbGVjdEhUTUxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXRyeSB7Ci0JCQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coY29tcG9zaXRlLmdldFNoZWxsKCksCi0JCQkJCQkJU1dULk9QRU4pOwotCQkJCQlkaWFsb2cKLQkJCQkJCQkuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10gewotCQkJCQkJCQkJIiouaHRtIiwgIiouaHRtbCIgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlTdHJpbmcgaHRtbEZpbGUgPSBkaWFsb2cub3BlbigpOwotCQkJCQlpZiAoaHRtbEZpbGUgIT0gbnVsbCkgewotCQkJCQkJYWJvdXRIVE1MVGV4dC5zZXRUZXh0KGh0bWxGaWxlKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nUGFnZSNzZXRWaXNpYmxlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSkgewotCQkJRGlzcGxheSBkaXNwbGF5ID0gdGl0bGVUZXh0LmdldERpc3BsYXkoKTsKLQkJCWlmICghKGRpc3BsYXkgPT0gbnVsbCB8fCBkaXNwbGF5LmlzRGlzcG9zZWQoKSkpIHsKLQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXRpdGxlVGV4dC5zZXRGb2N1cygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMuCi0JICovCi0JcHVibGljIFB1Ymxpc2hPcHRpb25zIGdldFB1Ymxpc2hpbmdPcHRpb25zKCkgewotCQlpZiAoZGlzcGxheURlc3RpbmF0aW9uR3JvdXApIHsKLQkJCWRhdGFNb2RlbC5zZXRQdWJsaWNhdGlvblBhdGgoZGVzdGluYXRpb25QYXRoVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJfQotCQlkYXRhTW9kZWwuc2V0VGl0bGUodGl0bGVUZXh0LmdldFRleHQoKS50cmltKCkpOwotCQlkYXRhTW9kZWwuc2V0QmFubmVySW1hZ2UoYmFubmVySW1hZ2VUZXh0LmdldFRleHQoKS50cmltKCkpOwotCQlkYXRhTW9kZWwuYWJvdXRIVE1MID0gYWJvdXRIVE1MVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCQlkYXRhTW9kZWwuZmVlZGJhY2tVUkwgPSBmZWVkYmFja1VSTFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJZGF0YU1vZGVsLmdlbmVyYXRlR2xvc3NhcnkgPSBpbmNsdWRlR2xvc3NhcnkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWRhdGFNb2RlbC5nZW5lcmF0ZUluZGV4ID0gaW5jbHVkZUluZGV4LmdldFNlbGVjdGlvbigpOwotCQkvLyBkYXRhTW9kZWwuZ2VuZXJhdGVTZWFyY2hEQiA9IGluY2x1ZGVTZWFyY2guZ2V0U2VsZWN0aW9uKCk7Ci0JCWRhdGFNb2RlbC5jaGVja0V4dExpbmtzID0gY2hlY2tFeHRlcm5hbExpbmtzLmdldFNlbGVjdGlvbigpOwotCQlkYXRhTW9kZWwuYXV0b0dlbmVyYXRlQWN0aXZpdHlEaWFncmFtcyA9IGF1dG9HZW5lcmF0ZUFjdGl2aXR5RGlhZ3JhbXMKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWRhdGFNb2RlbAotCQkJCS5zZXRVbm9wZW5FeHRlbmRlZEFjdGl2aXR5RGlhZ3JhbShwdWJsaXNoVW5PcGVuRXh0ZW5kQWN0aXZpdHlEaWFncmFtCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQlkYXRhTW9kZWwuY29udmVydEJyb2tlbkxpbmtzID0gY29udmVydEJyb2tlbkxpbmtzLmdldFNlbGVjdGlvbigpOwotCQlkYXRhTW9kZWwuc2hvd0V4dHJhRGVzY3JpcHRvckluZm8gPSBleHRyYURlc2NyaXB0b3JJbmZvQ3RyCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlkYXRhTW9kZWwuZ2VuZXJhdGVMaWdodFdlaWdodFRyZWUgPSBsaWdodFdlaWdodFRyZWVDdHIuZ2V0U2VsZWN0aW9uKCk7Ci0JCS8vIGRhdGFNb2RlbC5pbmNsdWRlRW1wdHlDYXRlZ29yaWVzID0KLQkJLy8gaW5jbHVkZUVtcHR5Q2F0ZWdvcmllc0N0ci5nZXRTZWxlY3Rpb24oKTsKLQotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQotCS8vIHB1YmxpYyBDb21wb3NpdGUgZ2V0U2VhcmNoQ29tcG9zaXRlKCkgewotCS8vIHJldHVybiBzZWFyY2hDb21wb3NpdGU7Ci0JLy8gfQotCS8vCQotCS8vIHB1YmxpYyBCdXR0b24gZ2V0SW5jbHVkZVNlYXJjaCgpIHsKLQkvLyByZXR1cm4gaW5jbHVkZVNlYXJjaDsKLQkvLyB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvd2l6YXJkcy9QdWJsaXNoQ29uZmlnU2VsZWN0Q29uZmlnUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvd2l6YXJkcy9QdWJsaXNoQ29uZmlnU2VsZWN0Q29uZmlnUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwY2MwZWYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3dpemFyZHMvUHVibGlzaENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFRoZSBTZWxlY3QgTWV0aG9kIENvbmZpZ3VyYXRpb24gcGFnZSBpbiB0aGUgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbgotICogd2l6YXJkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hDb25maWdTZWxlY3RDb25maWdQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cwotCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLCBMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmRGVzYzsKLQotCXByaXZhdGUgUHVibGlzaE9wdGlvbnMgZGF0YU1vZGVsID0gbnVsbDsKLQotCXByaXZhdGUgTGlzdCB2d0xpc3Q7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoQ29uZmlnU2VsZWN0Q29uZmlnUGFnZShTdHJpbmcgcGFnZU5hbWUsCi0JCQlQdWJsaXNoT3B0aW9ucyBkYXRhTW9kZWwpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0Q29uZmlnV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5zZWxlY3RDb25maWdXaXphcmRQYWdlX3RleHQpOwotCQl0aGlzLmRhdGFNb2RlbCA9IGRhdGFNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgY29tcG9zaXRlIHRvIGhvbGQgdGhlIHdpZGdldHMuCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJY3JlYXRlTGFiZWwoCi0JCQkJY29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5jb25maWdMYWJlbF90ZXh0KTsKLQotCQl0YWJsZSA9IG5ldyBUYWJsZShjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMTIwOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAyODA7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlcigpKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbnMoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQl0YWJsZVZpZXdlci5zZXRJbnB1dChjb25maWdzKTsKLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9URVhUKTsKLQotCQljdHJsX2JyaWVmRGVzYyA9IGNyZWF0ZVRleHRNdWx0aShjb21wb3NpdGUsICIiLCAzNjAsIDgwLCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFNlbGVjdCB0aGUgZmlyc3QgY29uZmlnIGFuZCBkaXNwbGF5IGl0cyBicmllZiBkZXNjcmlwdGlvbi4KLQkJaWYgKGNvbmZpZ3MubGVuZ3RoID4gMCkgewotCQkJdGFibGUuc2VsZWN0KDApOwotCQkJc2V0RGlzcGxheUF0dHJpYnV0ZXMoY29uZmlnc1swXSk7Ci0JCX0KLQotCQkvLyBUT0RPOiBTaG91bGRuJ3QgdGhpcyBiZSB0aGUgYXBwbGljYXRpb24gc2hlbGwgaW1hZ2U/Ci0JCVB1Ymxpc2hDb25maWd1cmF0aW9uV2l6YXJkIHdpemFyZCA9IChQdWJsaXNoQ29uZmlndXJhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCVNoZWxsIHNoZWxsID0gd2l6YXJkLmdldENvbnRhaW5lcigpLmdldFNoZWxsKCk7Ci0JCXNoZWxsLnNldEltYWdlKExpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX0NPTkZJR1VSQVRPTik7Ci0KLQkJdGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQlQbGF0Zm9ybVVJCi0JCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCS5zZXRIZWxwKAotCQkJCQkJY29tcG9zaXRlLAotCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuQ09ORklHVVJBVElPTl9QVUJMSVNIX1dJWkFSRF9BTExfUEFHRVNfQ09OVEVYVCk7Ci0JfQotCi0JLyoqCi0JICogaGFuZGxlIHRoZSBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50Ci0JICogQHBhcmFtIGV2ZW50IFNlbGVjdGlvbkNoYW5nZWRFdmVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIGNvbmZpZ3MgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJc2V0RGlzcGxheUF0dHJpYnV0ZXMoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ3NbMF0pOwotCQl9Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCS8qKgotCSAqIGhhbmRsZSB0aGUgZXZlbnQKLQkgKiBAcGFyYW0gZXZlbnQgRXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlzcGxheUF0dHJpYnV0ZXMoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJY3RybF9icmllZkRlc2Muc2V0VGV4dChjb25maWcuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIG5leHQgd2l6YXJkIHBhZ2UKLQkgKiAKLQkgKiBAcmV0dXJuIElXaXphcmRQYWdlCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlkYXRhTW9kZWwucHVibGlzaENvbmZpZ3VyYXRpb24gPSB0cnVlOwotCQkvLyBJV2l6YXJkUGFnZSBwYWdlID0gc3VwZXIuZ2V0TmV4dFBhZ2UoKTsKLQotCQlJV2l6YXJkUGFnZSBwYWdlID0gZ2V0V2l6YXJkKCkuZ2V0TmV4dFBhZ2UodGhpcyk7Ci0JCXJldHVybiBwYWdlOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBwYWdlIGlzIGNvbXBsZXRlZCBvciBub3QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKGdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaW50IGNvdW50ID0gdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQotCQlpZiAoY291bnQgPiAwKSB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJZGF0YU1vZGVsLnNldFNlbGVjdGVkQ29uZmlnKGl0ZW1zWzBdLmdldFRleHQoKSk7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksCi0JCQkJCQkJZGF0YU1vZGVsLnNlbGVjdGVkQ29uZmlnKTsKLQkJCXZ3TGlzdCA9IG51bGw7Ci0JCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCQl2d0xpc3QgPSBnZXRWYWxpZFZpZXdzKGNvbmZpZyk7Ci0JCQl9Ci0JCQkKLQkJCQotCQkJaWYgKHZ3TGlzdCAhPSBudWxsICYmIHZ3TGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCXNldE1lc3NhZ2UobnVsbCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQlzZXRNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5taXNzaW5nVmlld0Vycm9yX21zZywKLQkJCQkJCVdpemFyZFBhZ2UuV0FSTklORyk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRWYWxpZFZpZXdzKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCQotCQlTdHJpbmcgbXNnOwotCQlib29sZWFuIHZhbGlkOwotCQlTdHJpbmdCdWZmZXIgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTGlzdCB2aWV3cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSB2aWV3ID0gKENvbnRlbnRDYXRlZ29yeSlpdC5uZXh0KCk7Ci0JCQlpZiAoIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNDb250cmlidXRvcih2aWV3KSApIHsKLQkJCQltc2cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkVmlld0NvbnRyaWJ1dG9ySW5mb19tc2csCi0JCQkJCQl2aWV3LmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJbWVzc2FnZS5hcHBlbmQoU3RyVXRpbC5UQUIpLmFwcGVuZChtc2cpLmFwcGVuZChTdHJVdGlsLkxJTkVfRkVFRCk7CQkJCi0JCQl9IGVsc2UgewotCQkJCXZpZXcgPSAoQ29udGVudENhdGVnb3J5KUNvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQodmlldywgY29uZmlnKTsKLQkJCQlpZiAoIHZpZXcgPT0gbnVsbCApIHsKLQkJCQkJbXNnID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJpbmQoCi0JCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRWaWV3SW52YWxpZEluZm9fbXNnLAotCQkJCQkJCXZpZXcuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJCQkJbWVzc2FnZS5hcHBlbmQoU3RyVXRpbC5UQUIpLmFwcGVuZChtc2cpLmFwcGVuZChTdHJVdGlsLkxJTkVfRkVFRCk7CQkJCi0KLQkJCQl9IGVsc2UgaWYgKCB2aWV3cy5jb250YWlucyh2aWV3KSApIHsKLQkJCQkJbXNnID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJpbmQoCi0JCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRWaWV3U2FtZVZpZXdJbmZvX21zZywKLQkJCQkJCQl2aWV3LmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJCW1lc3NhZ2UuYXBwZW5kKFN0clV0aWwuVEFCKS5hcHBlbmQobXNnKS5hcHBlbmQoU3RyVXRpbC5MSU5FX0ZFRUQpOwkJCQotCi0JCQkJfSBlbHNlIHsKLQkJCQkJdmlld3MuYWRkKHZpZXcpOwotCQkJCX0gCi0JCQl9CQotCQl9Ci0JCQotCQlpZiAoIG1lc3NhZ2UubGVuZ3RoKCkgPiAwICkgewkJCi0JCQltc2cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRWaWV3c0luZm9fbXNnLAotCQkJCQljb25maWcuZ2V0TmFtZSgpKTsKLQkJCW1lc3NhZ2UuaW5zZXJ0KDAsIG1zZyArIFN0clV0aWwuTElORV9GRUVEICsgU3RyVXRpbC5MSU5FX0ZFRUQpOwkJCQotCi0JCQljdHJsX2JyaWVmRGVzYy5zZXRUZXh0KG1lc3NhZ2UudG9TdHJpbmcoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiB2aWV3czsKLQl9Ci0JCi0JY2xhc3MgQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLQkJCWltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgaW5kZXgpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gY29uZmlnLmdldE5hbWUoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvd2l6YXJkcy9QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3dpemFyZHMvUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBjZjhjMjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvd2l6YXJkcy9QdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIFRoZSBTZWxlY3QgcHVibGlzaGluZyBwcm9jZXNlcyB3aXphcmQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzCi0JCUxpc3RlbmVyIHsKLQotCXByaXZhdGUgQnV0dG9uIHJhZGlvX2VudGlyZUNvbmZpZzsKLQotCXByaXZhdGUgQnV0dG9uIHJhZGlvX3Byb2Nlc3NlczsKLQotCXByaXZhdGUgQ29tcG9zaXRlIHByb2Nlc3NDb250YWluZXI7Ci0KLQlwcml2YXRlIEJ1dHRvbiBpbmNsdWRlQmFzZVByb2Nlc3NlczsKLQkKLQkvLyBwcml2YXRlIExpc3QgY2hlY2tfcHJvY2Vzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JTWFwIGNoZWNrQm94VHBQcm9jTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCUNoZWNrYm94VHJlZVZpZXdlciBwcm9jVmlld2VyOwotCi0JcHJpdmF0ZSBQdWJsaXNoT3B0aW9ucyBkYXRhTW9kZWwgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlKFN0cmluZyBwYWdlTmFtZSwKLQkJCVB1Ymxpc2hPcHRpb25zIGRhdGFNb2RlbCkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5zZWxlY3RDb250ZW50V2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5zZWxlY3RDb250ZW50V2l6YXJkUGFnZV90ZXh0KTsKLQkJdGhpcy5kYXRhTW9kZWwgPSBkYXRhTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIGNvbXBvc2l0ZSB0byBob2xkIHRoZSB3aWRnZXRzLgotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCXJhZGlvX2VudGlyZUNvbmZpZyA9IGNyZWF0ZVJhZGlvQnV0dG9uKAotCQkJCWNvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ1JhZGlvQnV0dG9uX3RleHQsIDEsIHRydWUpOwotCi0JCXJhZGlvX3Byb2Nlc3NlcyA9IGNyZWF0ZVJhZGlvQnV0dG9uKAotCQkJCWNvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaFByb2Nlc3Nlc1JhZGlvQnV0dG9uX3RleHQsIDEsIGZhbHNlKTsKLQotCQlwcm9jZXNzQ29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcHJvY2Vzc0NvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgKLQkJCQl8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDEzOwotCQlwcm9jZXNzQ29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCi0JCWNyZWF0ZVByb2Nlc3NDb250YWluZXIocHJvY2Vzc0NvbnRhaW5lcik7Ci0KLQkJcmFkaW9fZW50aXJlQ29uZmlnLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlyYWRpb19wcm9jZXNzZXMuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0KLQkJcHJvY2Vzc0NvbnRhaW5lci5zZXRWaXNpYmxlKHJhZGlvX3Byb2Nlc3Nlcy5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2Nlc3NDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQljcmVhdGVUcmVlVmlld2VyKHBhcmVudCk7Ci0JCWluY2x1ZGVCYXNlUHJvY2Vzc2VzID0gY3JlYXRlQ2hlY2tib3gocGFyZW50LCAKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW5jbHVkZUJhc2VQcm9jZXNzZXNDaGVja2JveExhYmVsX3RleHQpOyAKLQkJaW5jbHVkZUJhc2VQcm9jZXNzZXMuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcHJvY1ZpZXdlciA9IG5ldyBDaGVja2JveFRyZWVWaWV3ZXIocGFyZW50KTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RICi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSAzMDA7Ci0JCQlwcm9jVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlwcm9jVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUHJvY2Vzc0NvbnRlbnRQcm92aWRlcigpKTsKLQkJcHJvY1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBQcm9jZXNzTGFiZWxQcm92aWRlcigpKTsKLQotCQlwcm9jVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlib29sZWFuIGNoZWNrZWQgPSBldmVudC5nZXRDaGVja2VkKCk7Ci0JCQkJdXBkYXRlQ2hlY2tTdGF0ZXMoZXZlbnQuZ2V0RWxlbWVudCgpLCBjaGVja2VkKTsKLQkJCQlzZWxlY3RiYXNlUHJvY2Vzc2VzKCk7Ci0JCQkJCi0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQotCQkJfQotCQl9KTsKLQotCQlTdHJpbmcgc2VsZWNlZENvbmZpZ05hbWUgPSBkYXRhTW9kZWwuZ2V0U2VsZWN0ZWRDb25maWcoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigKLQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksCi0JCQkJc2VsZWNlZENvbmZpZ05hbWUpOwotCi0JCXByb2NWaWV3ZXIuc2V0SW5wdXQoY29uZmlnKTsKLQotCQlwcm9jVmlld2VyLmV4cGFuZEFsbCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVDaGVja1N0YXRlcyhPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBjaGVja2VkKSB7Ci0KLQkJLy8gT2JqZWN0IGVsZW1lbnQgPSBldmVudC5nZXRFbGVtZW50KCk7Ci0KLQkJaWYgKGNoZWNrZWQgPT0gdHJ1ZSkgewotCQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY3AgPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpIHByb2NWaWV3ZXIKLQkJCQkJLmdldENvbnRlbnRQcm92aWRlcigpOwotCQkJY2hlY2tQYXJlbnQoY3AsIGVsZW1lbnQpOwotCQl9IGVsc2UKLQkJCXByb2NWaWV3ZXIuc2V0Q2hlY2tlZChlbGVtZW50LCBmYWxzZSk7Ci0KLQkJc2VsZWN0aW9uQ2hpbGRyZW4oZWxlbWVudCwgY2hlY2tlZCk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tQYXJlbnQoSVRyZWVDb250ZW50UHJvdmlkZXIgY3AsIE9iamVjdCBlbGVtZW50KSB7Ci0JCS8vIGlmIChlbGVtZW50ID09IG51bGwgKSB7Ci0JCS8vIHJldHVybjsKLQkJLy8gfQotCQkvLyBPYmplY3QgcGFyZW50ID0gY3AuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQkvLyBpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJLy8gcHJvY1ZpZXdlci5zZXRDaGVja2VkKHBhcmVudCwgdHJ1ZSk7Ci0JCS8vIGNoZWNrUGFyZW50KGNwLCBwYXJlbnQpOwotCQkvLyB9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VsZWN0aW9uQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gY2hlY2tlZCkgewotCQlJVHJlZUNvbnRlbnRQcm92aWRlciBjcCA9IChJVHJlZUNvbnRlbnRQcm92aWRlcikgcHJvY1ZpZXdlcgotCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJT2JqZWN0W10gY2hpbGRzID0gY3AuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm9jVmlld2VyLnNldENoZWNrZWQoY2hpbGRzW2ldLCBjaGVja2VkKTsKLQkJCXNlbGVjdGlvbkNoaWxkcmVuKGNoaWxkc1tpXSwgY2hlY2tlZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBoYW5kbGUgdGhlIGV2ZW50Ci0JICogQHBhcmFtIGV2ZW50IEV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQotCQlpZiAoIGV2ZW50LndpZGdldCA9PSBpbmNsdWRlQmFzZVByb2Nlc3NlcyApIHsKLQkJCS8vIGlmIHNlbGVjdGVkLCBhbHRvIHNlbGVjdCBhbGwgYmFzZSBwcm9jZXNzZXMKLQkJCXNlbGVjdGJhc2VQcm9jZXNzZXMoKTsKLQkJfQotCi0JCXByb2Nlc3NDb250YWluZXIuc2V0VmlzaWJsZShyYWRpb19wcm9jZXNzZXMuZ2V0U2VsZWN0aW9uKCkpOwotCi0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbmV4dCBXaXphcmQgcGFnZQotCSAqIAotCSAqIEByZXR1cm4gSVdpemFyZFBhZ2UKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0KLQkJcmV0dXJuIHN1cGVyLmdldE5leHRQYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIHBhZ2UgaXMgY29tcGxldGVkIG9yIG5vdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlkYXRhTW9kZWwucHVibGlzaFByb2Nlc3MgPSBmYWxzZTsKLQkJaWYgKHJhZGlvX2VudGlyZUNvbmZpZy5nZXRTZWxlY3Rpb24oKSkgewotCQkJZGF0YU1vZGVsLnB1Ymxpc2hDb25maWd1cmF0aW9uID0gdHJ1ZTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJTGlzdCBwcm9jcyA9IGdldFNlbGVjdGVkUHJvY2Vzc2VzKCk7Ci0KLQkJCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tfcHJvY2Vzc2VzLnNpemUoKTsgaSsrKSB7Ci0JCQkvLyBCdXR0b24gYiA9IChCdXR0b24pIGNoZWNrX3Byb2Nlc3Nlcy5nZXQoaSk7Ci0JCQkvLyBpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJLy8KLQkJCS8vIC8vIHNldCB0aGUgc2VsZWN0aW9ucwotCQkJLy8gcHJvY3MuYWRkKGNoZWNrQm94VHBQcm9jTWFwLmdldChiKSk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0KLS8vCQkJT2JqZWN0W10gc2VsZWN0ZWQgPSBwcm9jVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotLy8JCQlpZiAoc2VsZWN0ZWQgIT0gbnVsbCAmJiBzZWxlY3RlZC5sZW5ndGggPiAwKSB7Ci0vLwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCQkJaWYgKHNlbGVjdGVkW2ldIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSB7Ci0vLwkJCQkJCXByb2NzLmFkZChzZWxlY3RlZFtpXSk7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9Ci0JCQlpZiAocHJvY3Muc2l6ZSgpID4gMCkgewotCQkJCWRhdGFNb2RlbC5wdWJsaXNoUHJvY2VzcyA9IHRydWU7Ci0JCQkJZGF0YU1vZGVsLnB1Ymxpc2hDb25maWd1cmF0aW9uID0gZmFsc2U7Ci0JCQkJZGF0YU1vZGVsLnNldERlbGl2ZXJQcm9jZXNzTGlzdChwcm9jcyk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFNlbGVjdGVkUHJvY2Vzc2VzKCkgewotCQlMaXN0IHByb2NzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCU9iamVjdFtdIHNlbGVjdGVkID0gcHJvY1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJaWYgKHNlbGVjdGVkICE9IG51bGwgJiYgc2VsZWN0ZWQubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJCWlmIChzZWxlY3RlZFtpXSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgewotCQkJCQlwcm9jcy5hZGQoc2VsZWN0ZWRbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHByb2NzOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2VsZWN0YmFzZVByb2Nlc3NlcygpIHsKLQkJaWYgKCAhaW5jbHVkZUJhc2VQcm9jZXNzZXMuZ2V0U2VsZWN0aW9uKCkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVN0cmluZyBzZWxlY2VkQ29uZmlnTmFtZSA9IGRhdGFNb2RlbC5nZXRTZWxlY3RlZENvbmZpZygpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRNZXRob2RDb25maWd1cmF0aW9uKAotCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwKLQkJCQlzZWxlY2VkQ29uZmlnTmFtZSk7Ci0KLQkJTGlzdCBwcm9jcyA9IGdldFNlbGVjdGVkUHJvY2Vzc2VzKCk7Ci0JCUxpc3QgYmFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwcm9jcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJQ29uZmlndXJhdGlvbkhlbHBlci5nZXRCYXNlUHJvY2Vzc2VzKChBY3Rpdml0eSlpdC5uZXh0KCksIGNvbmZpZywgYmFzZXMpOwotCQl9Ci0JCQotCQkvLyB1cGRhdGUgdGhlIHNlbGVjdGlvbnMKLQkJZm9yIChJdGVyYXRvciBpdCA9IGJhc2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0Lm5leHQoKTsKLQkJCXByb2NWaWV3ZXIuc2V0Q2hlY2tlZChlbGVtZW50LCB0cnVlKTsKLQkJCXVwZGF0ZUNoZWNrU3RhdGVzKGVsZW1lbnQsIHRydWUpOwotCQl9CQkKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBQcm9jZXNzQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gaW5wdXQgPSBudWxsOwotCi0JCVN0cmluZyBOT0RFX0NQID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNhcGFiaWxpdHlQYXR0ZXJuc190ZXh0OwotCi0JCVN0cmluZyBOT0RFX0RQID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLmRlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQ7Ci0KLQkJU3RyaW5nW10gRFBDUF9OT0RFUyA9IG5ldyBTdHJpbmdbXSB7IE5PREVfQ1AsIE5PREVfRFAgfTsKLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCXJldHVybiBEUENQX05PREVTOwotCQkJfSBlbHNlIGlmIChOT0RFX0NQLmVxdWFscyhwYXJlbnRFbGVtZW50LnRvU3RyaW5nKCkpCi0JCQkJCXx8IE5PREVfRFAuZXF1YWxzKHBhcmVudEVsZW1lbnQudG9TdHJpbmcoKSkpIHsKLQkJCQlyZXR1cm4gZ2V0UGx1Z2lucyhwYXJlbnRFbGVtZW50KS50b0FycmF5KCk7Ci0JCQl9IGVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBQbHVnaW5Ob2RlKSB7Ci0JCQkJT2JqZWN0IHBhcmVudCA9ICgoUGx1Z2luTm9kZSkgcGFyZW50RWxlbWVudCkucGFyZW50OwotCQkJCWlmIChOT0RFX0NQLmVxdWFscyhwYXJlbnQudG9TdHJpbmcoKSkpIHsKLQkJCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0QWxsQ2FwYWJpbGl0eVBhdHRlcm5zKAotCQkJCQkJCSgoUGx1Z2luTm9kZSkgcGFyZW50RWxlbWVudCkucGx1Z2luLCBpbnB1dCkKLQkJCQkJCQkudG9BcnJheSgpOwotCQkJCX0gZWxzZSBpZiAoTk9ERV9EUC5lcXVhbHMocGFyZW50LnRvU3RyaW5nKCkpKSB7Ci0JCQkJCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmdldEFsbERlbGl2ZXJ5UHJvY2Vzc2VzKAotCQkJCQkJCSgoUGx1Z2luTm9kZSkgcGFyZW50RWxlbWVudCkucGx1Z2luLCBpbnB1dCkKLQkJCQkJCQkudG9BcnJheSgpOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7fTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCXJldHVybiBudWxsOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUGx1Z2luTm9kZSkgewotCQkJCXJldHVybiAoKFBsdWdpbk5vZGUpIGVsZW1lbnQpLnBhcmVudDsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgewotCQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSBlbGVtZW50OwotCQkJCXdoaWxlICgobyAhPSBudWxsKSAmJiAhKG8gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQkJCW8gPSBvLmVDb250YWluZXIoKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbzsKLQkJCX0KLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQbHVnaW5Ob2RlIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCXBsdWdpbk5vZGVNYXAuY2xlYXIoKTsKLQkJCWlucHV0ID0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCWlucHV0ID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIG5ld0lucHV0OwotCQkJfSBlbHNlIHsKLQkJCQlpbnB1dCA9IG51bGw7Ci0JCQl9Ci0KLQkJCXBsdWdpbk5vZGVNYXAuY2xlYXIoKTsKLQkJfQotCi0JCXByaXZhdGUgTGlzdCBnZXRQbHVnaW5zKE9iamVjdCBwYXJlbnQpIHsKLQkJCUxpc3QgdmFsaWRJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQkJTGlzdCBwbHVnaW5zID0gaW5wdXQuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJCQlMaXN0IHByb2NzID0gbnVsbDsKLQkJCQkJaWYgKE5PREVfQ1AuZXF1YWxzKHBhcmVudC50b1N0cmluZygpKSkgewotCQkJCQkJcHJvY3MgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldEFsbENhcGFiaWxpdHlQYXR0ZXJucygKLQkJCQkJCQkJcGx1Z2luLCBpbnB1dCk7Ci0JCQkJCX0gZWxzZSBpZiAoTk9ERV9EUC5lcXVhbHMocGFyZW50LnRvU3RyaW5nKCkpKSB7Ci0JCQkJCQlwcm9jcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0QWxsRGVsaXZlcnlQcm9jZXNzZXMoCi0JCQkJCQkJCXBsdWdpbiwgaW5wdXQpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKHByb2NzICE9IG51bGwgJiYgcHJvY3Muc2l6ZSgpID4gMCkgewotCQkJCQkJdmFsaWRJdGVtcy5hZGQoZ2V0UGx1Z2luTm9kZShwYXJlbnQsIHBsdWdpbikpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHZhbGlkSXRlbXM7Ci0JCX0KLQotCQlNYXAgcGx1Z2luTm9kZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJcHJpdmF0ZSBQbHVnaW5Ob2RlIGdldFBsdWdpbk5vZGUoT2JqZWN0IHBhcmVudCwgTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQkJU3RyaW5nIGtleSA9IHBhcmVudC50b1N0cmluZygpICsgIjoiICsgcGx1Z2luLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJUGx1Z2luTm9kZSBub2RlID0gKFBsdWdpbk5vZGUpIHBsdWdpbk5vZGVNYXAuZ2V0KGtleSk7Ci0JCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJbm9kZSA9IG5ldyBQbHVnaW5Ob2RlKHBhcmVudCwgcGx1Z2luKTsKLQkJCQlwbHVnaW5Ob2RlTWFwLnB1dChrZXksIG5vZGUpOwotCQkJfQotCi0JCQlyZXR1cm4gbm9kZTsKLQkJfQotCi0JCWNsYXNzIFBsdWdpbk5vZGUgewotCQkJT2JqZWN0IHBhcmVudDsKLQotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbjsKLQotCQkJcHVibGljIFBsdWdpbk5vZGUoT2JqZWN0IHBhcmVudCwgTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQkJCXRoaXMucGx1Z2luID0gcGx1Z2luOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBwbHVnaW4uZ2V0TmFtZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBQcm9jZXNzTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSB7Ci0JCQkJLy8gKChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpZWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpCi0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSBlbGVtZW50OwotCQkJCXJldHVybiBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUocHJvYyk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAoZWxlbWVudCA9PSBudWxsKSA/ICIiIDogZWxlbWVudC50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3dpemFyZHMvUHVibGlzaENvbmZpZ3VyYXRpb25XaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3dpemFyZHMvUHVibGlzaENvbmZpZ3VyYXRpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzRkYmQ2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy93aXphcmRzL1B1Ymxpc2hDb25maWd1cmF0aW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkOwotCi0vKioKLSAqIFRoZSBQdWJsaXNoIE1ldGhvZCBDb25maWd1cmF0aW9uIHdpemFyZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoQ29uZmlndXJhdGlvbldpemFyZCBleHRlbmRzIEFic3RyYWN0UHVibGlzaFdpemFyZCB7Ci0KLQkvLyBUaGUgd2l6YXJkIHBhZ2VzLgotCXByb3RlY3RlZCBQdWJsaXNoQ29uZmlnU2VsZWN0Q29uZmlnUGFnZSBzZWxlY3RDb25maWdQYWdlOwotCi0JcHJvdGVjdGVkIFB1Ymxpc2hDb25maWdQdWJsaXNoT3B0aW9uc1BhZ2UgcHVibGlzaE9wdGlvbnNQYWdlOwotCi0JcHJpdmF0ZSBNYXAgY29uZmlnUHJvY2Vzc3BhZ2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaENvbmZpZ3VyYXRpb25XaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdpbmRvd1RpdGxlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQotCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHB1Ymxpc2ggb3B0aW9ucwotCSAqIEByZXR1cm4gUHVibGlzaE9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wdGlvbnMgZ2V0UHVibGlzaE9wdGlvbnMoKSB7Ci0JCWlmICggc3VwZXIuZGF0YU1vZGVsID09IG51bGwgKSB7Ci0JCQlzdXBlci5kYXRhTW9kZWwgPSBuZXcgUHVibGlzaE9wdGlvbnMoKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmRhdGFNb2RlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKCk7Ci0KLQkJc2VsZWN0Q29uZmlnUGFnZSA9IG5ldyBQdWJsaXNoQ29uZmlnU2VsZWN0Q29uZmlnUGFnZSgKLQkJCQkiUHVibGlzaENvbmZpZ1NlbGVjdE92ZXJ2aWV3UGFnZSIsIGRhdGFNb2RlbCk7IC8vJE5PTi1OTFMtMSQKLQkJc2VsZWN0Q29uZmlnUGFnZS5zZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjcmlwdG9yKTsKLQkJYWRkUGFnZShzZWxlY3RDb25maWdQYWdlKTsKLQotCQlwdWJsaXNoT3B0aW9uc1BhZ2UgPSBuZXcgUHVibGlzaENvbmZpZ1B1Ymxpc2hPcHRpb25zUGFnZSgKLQkJCQkiUHVibGlzaENvbmZpZ1B1Ymxpc2hPcHRpb25zUGFnZSIsIGRhdGFNb2RlbCk7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGlzaE9wdGlvbnNQYWdlLnNldEltYWdlRGVzY3JpcHRvcihpbWFnZURlc2NyaXB0b3IpOwotCQlhZGRQYWdlKHB1Ymxpc2hPcHRpb25zUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBzZWxlY3QgcHJvY2VzcyB2aXp3cmQgcGFnZQotCSAqIAotCSAqIEBwYXJhbSBjb25maWdOYW1lIFN0cmluZyB0aGUgY29uZmlndXJhdGlvbiBuYW1lCi0JICogCi0JICogQHJldHVybiBJV2l6YXJkUGFnZQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRTZWxQcm9jZXNzUGFnZShTdHJpbmcgY29uZmlnTmFtZSkgewotCi0JCVB1Ymxpc2hDb25maWdTZWxlY3RQcm9jZXNzUGFnZSBzZWxlY3RQcm9jZXNzUGFnZSA9IChQdWJsaXNoQ29uZmlnU2VsZWN0UHJvY2Vzc1BhZ2UpIGNvbmZpZ1Byb2Nlc3NwYWdlTWFwCi0JCQkJLmdldChjb25maWdOYW1lKTsKLQotCQlpZiAoc2VsZWN0UHJvY2Vzc1BhZ2UgPT0gbnVsbCkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJc2VsZWN0UHJvY2Vzc1BhZ2UgPSBuZXcgUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlKAotCQkJCQkiUHVibGlzaENvbmZpZ1NlbGVjdFByb2Nlc3NQYWdlIiwgZGF0YU1vZGVsKTsgLy8kTk9OLU5MUy0xJAotCQkJc2VsZWN0Q29uZmlnUGFnZS5zZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCWFkZFBhZ2Uoc2VsZWN0UHJvY2Vzc1BhZ2UpOwotCi0JCQljb25maWdQcm9jZXNzcGFnZU1hcC5wdXQoY29uZmlnTmFtZSwgc2VsZWN0UHJvY2Vzc1BhZ2UpOwotCQl9Ci0KLQkJcmV0dXJuIHNlbGVjdFByb2Nlc3NQYWdlOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbmV4dCBwYWdlIGZvciB0aGUgZ2l2ZW4gcGFnZQotCSAqIEBwYXJhbSBwYWdlIElXaXphcmRQYWdlCi0JICogQHJldHVybiBJV2l6YXJkUGFnZQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCWlmIChwYWdlID09IHNlbGVjdENvbmZpZ1BhZ2UpIHsKLQkJCWlmIChkYXRhTW9kZWwuZ2V0U2VsZWN0ZWRDb25maWcoKSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGNvbmZpZ05hbWUgPSBkYXRhTW9kZWwuZ2V0U2VsZWN0ZWRDb25maWcoKTsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwgY29uZmlnTmFtZSk7Ci0JCQkJTGlzdCBwcm9jcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0QWxsUHJvY2Vzc2VzKGNvbmZpZyk7Ci0JCQkJaWYgKHByb2NzICE9IG51bGwgJiYgcHJvY3Muc2l6ZSgpID4gMCkgewotCQkJCQlyZXR1cm4gZ2V0U2VsUHJvY2Vzc1BhZ2UoY29uZmlnTmFtZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJKChCYXNlV2l6YXJkUGFnZSlwdWJsaXNoT3B0aW9uc1BhZ2UpLm9uRW50ZXJQYWdlKAotCQkJCQkJCXN1cGVyLmRhdGFNb2RlbC5nZXRTZWxlY3RlZENvbmZpZygpKTsKLQkJCQkJcmV0dXJuIHB1Ymxpc2hPcHRpb25zUGFnZTsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIGlmIChwYWdlID09IHB1Ymxpc2hPcHRpb25zUGFnZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQkoKEJhc2VXaXphcmRQYWdlKXB1Ymxpc2hPcHRpb25zUGFnZSkub25FbnRlclBhZ2UoCi0JCQkJCXN1cGVyLmRhdGFNb2RlbC5nZXRTZWxlY3RlZENvbmZpZygpKTsKLQkJCXJldHVybiBwdWJsaXNoT3B0aW9uc1BhZ2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2NhbkZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBwdWJsaXNoT3B0aW9uc1BhZ2UgJiYgcHVibGlzaE9wdGlvbnNQYWdlCi0JCQkJLmlzUGFnZUNvbXBsZXRlKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJZGF0YU1vZGVsID0gcHVibGlzaE9wdGlvbnNQYWdlLmdldFB1Ymxpc2hpbmdPcHRpb25zKCk7Ci0JCWJvb2xlYW4gYW5zd2VyID0gY2hlY2tBbmRDcmVhdGVEaXIoZGF0YU1vZGVsLnB1YmxpY2F0aW9uUGF0aCk7Ci0JCWlmIChhbnN3ZXIpIHsKLQkJCWRhdGFNb2RlbC5zZXRGaW5pc2hQcmVzc2VkKHRydWUpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0UHVibGlzaFBhdGgoZGF0YU1vZGVsLmdldFNlbGVjdGVkQ29uZmlnKCksZGF0YU1vZGVsCi0JCQkJCS5nZXRQdWJsaWNhdGlvblBhdGgoKSk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRUaXRsZShkYXRhTW9kZWwuZ2V0U2VsZWN0ZWRDb25maWcoKSxkYXRhTW9kZWwuZ2V0VGl0bGUoKSk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRCYW5uZXJJbWFnZShkYXRhTW9kZWwuZ2V0U2VsZWN0ZWRDb25maWcoKSxkYXRhTW9kZWwuZ2V0QmFubmVySW1hZ2UoKSk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRBYm91dEhUTUwoZGF0YU1vZGVsLmdldFNlbGVjdGVkQ29uZmlnKCksZGF0YU1vZGVsLmdldEFib3V0SFRNTCgpKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldEZlZWRiYWNrVVJMKGRhdGFNb2RlbC5nZXRTZWxlY3RlZENvbmZpZygpLGRhdGFNb2RlbC5nZXRGZWVkYmFja1VSTCgpKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldEluY2x1ZGVHbG9zc2FyeShkYXRhTW9kZWwuZ2V0U2VsZWN0ZWRDb25maWcoKSxkYXRhTW9kZWwKLQkJCQkJLmlzR2VuZXJhdGVHbG9zc2FyeSgpKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJCS5zZXRJbmNsdWRlSW5kZXgoZGF0YU1vZGVsLmdldFNlbGVjdGVkQ29uZmlnKCksZGF0YU1vZGVsLmlzR2VuZXJhdGVJbmRleCgpKTsKLS8vCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0SW5jbHVkZVNlYXJjaChkYXRhTW9kZWwKLS8vCQkJCQkuaXNHZW5lcmF0ZVNlYXJjaERCKCkpOwotLy8JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRJbmNsdWRlUHJvY2Vzc0N1c3RvbWl6YXRpb24oZGF0YU1vZGVsCi0vLwkJCQkJLmlzVXNlQXBwbGV0KCkpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0Q2hlY2tFeHRlcm5hbExpbmtzKGRhdGFNb2RlbC5nZXRTZWxlY3RlZENvbmZpZygpLGRhdGFNb2RlbAotCQkJCQkuaXNDaGVja0V4dExpbmtzKCkpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0Q29udmVydEJyb2tlbkxpbmtzKGRhdGFNb2RlbC5nZXRTZWxlY3RlZENvbmZpZygpLGRhdGFNb2RlbC5pc0NvbnZlcnRCcm9rZW5MaW5rcygpKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldExpZ2h0V2VpZ2h0VHJlZShkYXRhTW9kZWwuZ2V0U2VsZWN0ZWRDb25maWcoKSxkYXRhTW9kZWwuaXNHZW5lcmF0ZUxpZ2h0V2VpZ2h0VHJlZSgpKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldEV4dHJhRGVzY3JpcHRvckluZm8oZGF0YU1vZGVsLmdldFNlbGVjdGVkQ29uZmlnKCksZGF0YU1vZGVsLmlzU2hvd0V4dHJhRGVzY3JpcHRvckluZm8oKSk7Ci0JCQkKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkKGRhdGFNb2RlbC5nZXRTZWxlY3RlZENvbmZpZygpLCAKLQkJCQkJZGF0YU1vZGVsLmlzQXV0b0dlbmVyYXRlQWN0aXZpdHlEaWFncmFtcygpKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKGRhdGFNb2RlbC5nZXRTZWxlY3RlZENvbmZpZygpLCAKLQkJCQkJZGF0YU1vZGVsLmlzVW5vcGVuRXh0ZW5kZWRBY3Rpdml0eURpYWdyYW0oKSk7Ci0JCQkKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNhdmVBbGxQcmVmZXJlbmNlcygpOwotCQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2F2ZUFsbFByZWZlcmVuY2VzKCk7Ci0JCQkKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWRhdGFNb2RlbC5zZXRGaW5pc2hQcmVzc2VkKGZhbHNlKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUNhbmNlbCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpIHsKLQkJZGF0YU1vZGVsLnNldEZpbmlzaFByZXNzZWQoZmFsc2UpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgYW5kIGNyZWF0ZXMgdGhlIGRlc3RpbmF0aW9uIHBhdGguCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tBbmRDcmVhdGVEaXIoU3RyaW5nIGRpcikgewotCQlTdHJpbmcgZGVmYXVsdFB1Ymxpc2hQYXRoID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVmYXVsdFB1Ymxpc2hQYXRoKCk7Ci0JCWJvb2xlYW4gYW5zd2VyID0gZmFsc2U7Ci0KLQkJSVBhdGggZWNQYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcoZGlyKTsKLQkJaWYgKCFlY1BhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IGRlZmF1bHRQdWJsaXNoUGF0aAotCQkJCQkrIFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKSArIGRpcjsgLy8kTk9OLU5MUy0xJAotCQkJYW5zd2VyID0gUHVibGlzaGluZ1VJUGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5UHJvbXB0KAotCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJpbmQoUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNvbmZpcm1QYXRoRGlhbG9nX3RleHQsIHBhdGgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoYW5zd2VyKSB7Ci0JCQkJZGF0YU1vZGVsLnNldFB1YmxpY2F0aW9uUGF0aChkaXIpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIpOwotCi0JCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQlGaWxlW10gZmlsZXMgPSBmaWxlLmxpc3RGaWxlcygpOwotCQkJaWYgKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoID4gMCkgewotCQkJCWFuc3dlciA9IFB1Ymxpc2hpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJpbmQoUHVibGlzaGluZ1VJUmVzb3VyY2VzLm92ZXJ3cml0ZURpYWxvZ190ZXh0LCBkaXIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJaWYgKGFuc3dlciA9PSB0cnVlKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlhbnN3ZXIgPSBGaWxlVXRpbAotCQkJCQkJCQkuZGVsZXRlQWxsRmlsZXMoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCQlpZiAoYW5zd2VyID09IGZhbHNlKSB7Ci0JCQkJCQkJUHVibGlzaGluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5jYW5ub3RQdWJsaXNoRXJyb3JfbXNnLCAvLyROT04tTkxTLTEkCQkJCQkJCQotCQkJCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZChQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZGVsZXRlRmlsZXNFcnJvcl9yZWFzb24sIGRpcikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlQdWJsaXNoaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0RpYWxvZ190aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5jYW5ub3RQdWJsaXNoRXJyb3JfbXNnLCAvLyROT04tTkxTLTEkCQkJCQkJCQotCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5iaW5kKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5kZWxldGVGaWxlc0Vycm9yX3JlYXNvbiwgZGlyKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCWFuc3dlciA9IGZpbGUubWtkaXJzKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVB1Ymxpc2hpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0RpYWxvZ190aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY2Fubm90UHVibGlzaEVycm9yX21zZywgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZChQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY3JlYXRlRGlyRXJyb3JfcmVhc29uLCBmaWxlLmdldEFic29sdXRlUGF0aCgpKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoIWFuc3dlcikgewotCQkJCVB1Ymxpc2hpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0RpYWxvZ190aXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY2Fubm90UHVibGlzaEVycm9yX21zZywgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZChQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY3JlYXRlRGlyRXJyb3JfcmVhc29uLCBmaWxlLmdldEFic29sdXRlUGF0aCgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYW5zd2VyOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3dpemFyZHMvUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvd2l6YXJkcy9QdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmYjQwZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvd2l6YXJkcy9QdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLkFjdGl2aXR5RGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLk5ld0FjdGl2aXR5RGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuQWJzdHJhY3RWaWV3QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogVGhlIHB1Ymxpc2ggY29uZmlndXJhdGlvbiBwcm9ncmVzcyBkaWFsb2cuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2cgZXh0ZW5kcyBQcm9ncmVzc01vbml0b3JEaWFsb2cgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgZGlhZ3JhbVZpZXdlckhvbGRlcjsKLQotCXByaXZhdGUgQWJzdHJhY3RWaWV3QnVpbGRlciB2aWV3QnVpbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2coU2hlbGwgcGFyZW50LAotCQkJQWJzdHJhY3RWaWV3QnVpbGRlciB2aWV3QnVpbGRlcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnZpZXdCdWlsZGVyID0gdmlld0J1aWxkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgY3RybCA9IHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlpZiAodmlld0J1aWxkZXIgIT0gbnVsbCkgewotCQkJLy8gQ3JlYXRlIHRoZSBkaWFncmFtIHZpZXdlciBob2xkZXIgYW5kIHRoZSBkaWFncmFtIHNlcnZpY2UuCi0JCQlkaWFncmFtVmlld2VySG9sZGVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoMSwgMSkpOwotCQkJZGlhZ3JhbVZpZXdlckhvbGRlci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlkaWFncmFtVmlld2VySG9sZGVyLnNldFZpc2libGUoZmFsc2UpOwotCi0JCQlFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNZ3IgPSB2aWV3QnVpbGRlci5nZXRMYXlvdXRNZ3IoKTsKLQkJCVN0cmluZyBuZXdEaWFncmFtcyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoIlBVQkxJU0hfTkVXX0RJQUdSQU0iKTsKLQkJCUJvb2xlYW4gbmV3RGlhZ3JhbSA9IG5ldyBCb29sZWFuKG5ld0RpYWdyYW1zKTsKLQkJCWlmIChuZXdEaWFncmFtLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJTmV3QWN0aXZpdHlEaWFncmFtU2VydmljZSBkaWFncmFtU2VydmljZSA9IG5ldyBOZXdBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKAotCQkJCQkJZGlhZ3JhbVZpZXdlckhvbGRlciwKLQkJCQkJCW5ldyBGaWxlKGxheW91dE1nci5nZXRQdWJsaXNoRGlyKCkpKTsKLQkJCQlkaWFncmFtU2VydmljZS5zZXRQdWJsaXNoZWRVbkNyZWF0ZWRBREQodmlld0J1aWxkZXIKLQkJCQkJCS5nZXRPcHRpb25zKCkuaXNBdXRvR2VuZXJhdGVBY3Rpdml0eURpYWdyYW1zKCkpOwotCQkJCWRpYWdyYW1TZXJ2aWNlLnNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKHZpZXdCdWlsZGVyCi0JCQkJCQkuZ2V0T3B0aW9ucygpLmlzVW5vcGVuRXh0ZW5kZWRBY3Rpdml0eURpYWdyYW0oKSk7Ci0JCQkJbGF5b3V0TWdyLnNldEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoZGlhZ3JhbVNlcnZpY2UpOwotCQkJfSBlbHNlIHsKLQkJCQlBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIGRpYWdyYW1TZXJ2aWNlID0gbmV3IEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoCi0JCQkJCQlkaWFncmFtVmlld2VySG9sZGVyLAotCQkJCQkJbmV3IEZpbGUobGF5b3V0TWdyLmdldFB1Ymxpc2hEaXIoKSkpOwotCQkJCWRpYWdyYW1TZXJ2aWNlLnNldFB1Ymxpc2hlZFVuQ3JlYXRlZEFERCh2aWV3QnVpbGRlcgotCQkJCQkJLmdldE9wdGlvbnMoKS5pc0F1dG9HZW5lcmF0ZUFjdGl2aXR5RGlhZ3JhbXMoKSk7Ci0JCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24odmlld0J1aWxkZXIKLQkJCQkJCS5nZXRPcHRpb25zKCkuaXNVbm9wZW5FeHRlbmRlZEFjdGl2aXR5RGlhZ3JhbSgpKTsKLQkJCQlsYXlvdXRNZ3Iuc2V0QWN0aXZpdHlEaWFncmFtU2VydmljZShkaWFncmFtU2VydmljZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY3RybDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3dpemFyZHMvUHVibGlzaGluZ09wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvd2l6YXJkcy9QdWJsaXNoaW5nT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4MzhhNzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvd2l6YXJkcy9QdWJsaXNoaW5nT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Lk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLkFic3RyYWN0UHVibGlzaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuQWJzdHJhY3RWaWV3QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLlByb2dyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi0vKioKLSAqIFBlcmZvcm1zIHRoZSByZWFsIHdvcmsgb2YgcHVibGlzaGluZyBhIE1ldGhvZCBDb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nT3BlcmF0aW9uIGltcGxlbWVudHMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJR19FUlJPUl9USVRMRSA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DT05GSUdfRVJST1JfTVNHID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdFcnJvcl9tc2c7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJR19FUlJPUl9SRUFTT04gPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0Vycm9yX3JlYXNvbjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVZJRVdfQ09ORklHX0VSUk9SX1RJVExFID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnByZXZpZXdDb25maWdFcnJvcl90aXRsZTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVZJRVdfQ09ORklHX0VSUk9SX01TRyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wcmV2aWV3Q29uZmlnRXJyb3JfbXNnOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19SRVBPUlRfRVJST1JfVElUTEUgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMudmlld1JlcG9ydEVycm9yX3RpdGxlOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19SRVBPUlRfRVJST1JfTVNHID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnZpZXdSZXBvcnRFcnJvcl9tc2c7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9CUk9XU0VSX0VSUk9SX1JFQVNPTiA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5vcGVuQnJvd3NlckVycm9yX3JlYXNvbjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ09ORklHX0NBTkNFTF9NU0cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY2FuY2VsUHVibGlzaENvbmZpZ19tc2c7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQWJzdHJhY3RQdWJsaXNoTWFuYWdlciBwdWJsaXNoTWdyOwotCi0JcHJpdmF0ZSBTdHJpbmcgcHVibGlzaGVkX3VybDsKLQotCXByaXZhdGUgU3RyaW5nIHJlcG9ydF91cmw7Ci0KLQlwcml2YXRlIE1zZ0RpYWxvZyBtc2dEaWFsb2c7Ci0KLQlwcml2YXRlIEV4Y2VwdGlvbiBydW5FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoaW5nT3BlcmF0aW9uKEFic3RyYWN0UHVibGlzaE1hbmFnZXIgcHVibGlzaE1ncikgewotCQlzdXBlcigpOwotCQl0aGlzLnB1Ymxpc2hNZ3IgPSBwdWJsaXNoTWdyOwotCQl0aGlzLm1zZ0RpYWxvZyA9IFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB2aWV3IGJ1aWxkZXIuCi0JICogCi0JICogQHJldHVybiBBYnN0cmFjdFZpZXdCdWlsZGVyCi0JICovCi0JcHVibGljIEFic3RyYWN0Vmlld0J1aWxkZXIgZ2V0Vmlld0J1aWxkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnB1Ymxpc2hNZ3IuZ2V0Vmlld0J1aWxkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHVybCBmb3IgdGhlIHB1Ymxpc2hlZCBzaXRlCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hlZFVybCgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hlZF91cmw7Ci0JfQotCi0JLyoqCi0JICogcnVuIHRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSB0aGUgcHVibGlzaGluZyB0YXNrLgotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcnVuRXhjZXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vbml0b3Iuc2V0VGFza05hbWUoUHVibGlzaGluZ1Jlc291cmNlcy5wdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZSk7IC8vJE5PTi1OTFMtMSQJCQkKLQkJCXB1Ymxpc2hNZ3IucHVibGlzaChtb25pdG9yKTsKLQotCQkJcHVibGlzaGVkX3VybCA9IHB1Ymxpc2hNZ3IuZ2V0UHVibGlzaGVkVXJsKCk7Ci0JCQlyZXBvcnRfdXJsID0gcHVibGlzaE1nci5nZXRQdWJsaXNoUmVwb3J0VXJsKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlydW5FeGNlcHRpb24gPSBlOwotCQl9Ci0KLQkJZmluYWwgYm9vbGVhbiBjYW5jZWxlZCA9IG1vbml0b3IuaXNDYW5jZWxlZCgpOwotCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoY2FuY2VsZWQpIHsKLQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlJbmZvKFBVQkxJU0hfQ09ORklHX0VSUk9SX1RJVExFLAotCQkJCQkJCVBVQkxJU0hfQ09ORklHX0NBTkNFTF9NU0cpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKHB1Ymxpc2hlZF91cmwgPT0gbnVsbCB8fCByZXBvcnRfdXJsID09IG51bGwpIHsKLQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlFcnJvcihQVUJMSVNIX0NPTkZJR19FUlJPUl9USVRMRSwKLQkJCQkJCQlQVUJMSVNIX0NPTkZJR19FUlJPUl9NU0csCi0JCQkJCQkJUFVCTElTSF9DT05GSUdfRVJST1JfUkVBU09OLCBydW5FeGNlcHRpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gTGF1bmNoIGEgSFRNTCBicm93c2VyIHRvIHZpZXcgdGhlIHB1Ymxpc2hlZCBzaXRlLgotCQkJCWlmIChvcGVuQnJvd3NlcihwdWJsaXNoZWRfdXJsKSA9PSBmYWxzZSkgewotCQkJCQlTdHJpbmcgcmVhc29uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJT1BFTl9CUk9XU0VSX0VSUk9SX1JFQVNPTiwKLQkJCQkJCQluZXcgT2JqZWN0W10geyBwdWJsaXNoZWRfdXJsIH0pOwotCQkJCQltc2dEaWFsb2cuZGlzcGxheUVycm9yKFBSRVZJRVdfQ09ORklHX0VSUk9SX1RJVExFLAotCQkJCQkJCVBSRVZJRVdfQ09ORklHX0VSUk9SX01TRywgcmVhc29uKTsKLQkJCQl9Ci0KLQkJCQkvLyBMYXVuY2ggYSBIVE1MIGJyb3dzZXIgdG8gdmlldyB0aGUgcmVwb3J0IG9uIHRoZSBwdWJsaXNoZWQKLQkJCQkvLyBzaXRlLgotCQkJCWlmIChvcGVuQnJvd3NlcihyZXBvcnRfdXJsKSA9PSBmYWxzZSkgewotCQkJCQlTdHJpbmcgcmVhc29uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJT1BFTl9CUk9XU0VSX0VSUk9SX1JFQVNPTiwKLQkJCQkJCQluZXcgT2JqZWN0W10geyByZXBvcnRfdXJsIH0pOwotCQkJCQltc2dEaWFsb2cuZGlzcGxheUVycm9yKFZJRVdfUkVQT1JUX0VSUk9SX1RJVExFLAotCQkJCQkJCVZJRVdfUkVQT1JUX0VSUk9SX01TRywgcmVhc29uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIG9wZW4gYSBicm93c2VyIHRvIHNob3cgdGhlIHB1Ymxpc2hlZCBjb250ZW50LgotCSAqIEBwYXJhbSB1cmwgU3RyaW5nIHRoZSBzaXRlIHVybAotCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGJyb3dzZXIgb3BlbmVkIHN1Y2Nlc3NmdWxseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBvcGVuQnJvd3NlcihmaW5hbCBTdHJpbmcgdXJsKSB7Ci0JCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCQl0cnkgewotCQkJLy8gTGF1bmNoIHRoZSBkZWZhdWx0IEhUTUwgdmlld2VyIHRvIGRpc3BsYXkgdGhlIEhUTUwgcGFnZS4KLQkJCS8vIE9uIExpbnV4LCB0aGlzIGNhbid0IGxhdW5jaCB1cmxzLCBvbmx5IGxvY2FsIGZpbGVzIGNhbiBiZQotCQkJLy8gbGF1bmNoZWQuCi0JCQkvLyBTb3JyeSBJIGhhdmUgdXNlIGludGVybmFsIGNsYXNzIGhlcmUuCi0JCQkvLyBob3BlIEVjbGlwc2Uub3JnIGNhbiBoYXZlIGEgcHVibGljIGFwaSB0byBkbyBzby4KLQkJCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXN1Y2Nlc3MgPSBQcm9ncmFtLmxhdW5jaCh1cmwpOwotCQkJfSBlbHNlIHsKLS8vCQkJCUlCcm93c2VyIGJyb3dzZXIgPSBvcmcuZWNsaXBzZS5oZWxwLmludGVybmFsLmJyb3dzZXIuQnJvd3Nlck1hbmFnZXIKLS8vCQkJCQkJLmdldEluc3RhbmNlKCkuY3JlYXRlQnJvd3Nlcih0cnVlKTsKLS8vCQkJCWlmIChicm93c2VyID09IG51bGwpIHsKLS8vCQkJCQl0cnkgewotLy8JCQkJCQlicm93c2VyLmRpc3BsYXlVUkwodXJsKTsKLS8vCQkJCQkJc3VjY2VzcyA9IHRydWU7Ci0vLwkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0JCQkJCi0JCQkJLy8gMTU1NDkwIC0gQ2Fubm90IGRldGVjdGVkIGRlZmF1bHQgYnJvd3NlciB3aGVuIHByZXZpZXcgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gb24gTGludXgKLQkJCQkvLyBjaGFuZ2VkIHRvIHVzZSBzd3QgYnJvd3NlcgotCQkJCXN1Y2Nlc3MgPSB0cnVlOwotCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKQotCQkJCXsKLQkJCQkgICAgcHVibGljIHZvaWQgcnVuKCkKLQkJCQkJewotLy8JCQkJCQkJLy8gb3BlbiBhbm90aGVyIHN3dCBicm93c2VyIHNpbmNlIHdlIGhhdmUgbm8gKHNpbXBsZSkgd2F5IG9mIGNyZWF0aW5nIGEgc3lzdGVtIGRlZmF1bHQgYnJvd3NlcgotLy8JCQkJCQkJLy8gdGhlIEVjbGlwc2UgZ3V5cyBoaWRlIGFsbCB0aGUgZ29vZCBhcGlzIGFzIGludGVybmFsCi0JCQkJCQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQkJCQkJCQlzaGVsbC5zZXRUZXh0KHVybCk7Ci0JCQkJCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJCQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJCQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQkJCQkJc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQkJCQkJQnJvd3NlciBwb3B1cF9icm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJCQkJCQlwb3B1cF9icm93c2VyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USHxHcmlkRGF0YS5HUkFCX0hPUklaT05UQUx8R3JpZERhdGEuR1JBQl9WRVJUSUNBTCkpOwotCQkJCQkJCXBvcHVwX2Jyb3dzZXIuc2V0VXJsKHVybCk7CQkJCQkJCQkJCQkJCQkKLQkJCQkJCQlzaGVsbC5vcGVuKCk7Ci0JCQkJCX0KLQkJCQl9KTsJCQkKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlzdWNjZXNzID0gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gc3VjY2VzczsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy93aXphcmRzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3dpemFyZHMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZmM4NDg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3dpemFyZHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgd2l6YXJkcyBmb3IgcHVibGlzaGluZyBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGFuZCBwcm9jZXNzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDdhYjI2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSBQdWJsaXNoaW5nIHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OWVkNTU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjQwY2VkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiBwdWJsaXNoaW5nLmphciwgbGliL3Jwd2NvcmUuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZywKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcywKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleCwKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5zZWFyY2gsCi0gb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51dGlsLmh0dHAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGQ4MmZjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1zb3VyY2UucHVibGlzaGluZy5qYXIgPSBzcmMvCi1vdXRwdXQucHVibGlzaGluZy5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwdWJsaXNoaW5nLmphcixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZG9jcm9vdC8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8sXAotICAgICAgICAgICAgICAga2V5d29yZGluZGV4ZGVmLnR4dCxcCi0gICAgICAgICAgICAgICBrZXl3b3JkcG9zdGFtYmxlLnR4dCxcCi0gICAgICAgICAgICAgICBrZXl3b3JkcHJlYW1ibGUudHh0LFwKLSAgICAgICAgICAgICAgIGtleXdvcmRzLnR4dCxcCi0gICAgICAgICAgICAgICB4c2wvCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9hYm91dC5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvYWJvdXQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YWFlZGY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9hYm91dC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLQotCi08aHRtbD4KLTwhLS0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiLz4KLQk8dGl0bGU+QWJvdXQ8L3RpdGxlPgotPHNjcmlwdCBzcmM9InNjcmlwdHMvY29tbW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQk8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotCQlib2R5IHsKLQkJCW1hcmdpbjogOHB4OwotCQl9Ci0JPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLQk8aW1nIHNyYz0iLi9pbWFnZXMvaWNvbl9hYm91dC5naWYiIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgYWx0PSJhYm91dCBpY29uIiBib3JkZXI9IjAiLz48YnIgLz48YnIgLz4KLTxzcGFuIGNsYXNzPSJwb3AiPk9wZW5VUC9CYXNpYzxiciAvPgotVmVyc2lvbiAwLjk8YnIgLz4KLTxiciAvPgotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDYuPGJyIC8+Ci1BbGwgUmlnaHRzIFJlc2VydmVkLjwvc3Bhbj48YnIgLz48YnIgLz4KLQk8dGFibGUgc3VtbWFyeT0iIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JICA8dHI+Ci0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+Ci0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgPC90cj4KLQkgIDx0cj4KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiBjb2xzcGFuPSI0IiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+Ci0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+Ci0JICA8L3RyPgotCSAgPHRyPgotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgPC90cj4KLQkgIDx0cj4KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiBjb2xzcGFuPSIyIiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+Ci0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iamF2YXNjcmlwdDpzZWxmLmNsb3NlKCk7Ij48c3BhbiBjbGFzcz0iYnV0dG9udHh0Ij4mbmJzcDtDbG9zZSZuYnNwOzwvc3Bhbj48L2E+PC90ZD4KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+Ci0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93IiAgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgPC90cj4KLQkgIDx0cj4KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+Ci0JICA8L3RyPgotCSAgPHRyPgotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+Ci0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+Ci0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+Ci0JICA8L3RyPgotCSAgPHRyPgotCSAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgPC90cj4KLQk8L3RhYmxlPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvZXBmLmljbyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9lcGYuaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0M2M4YmI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9lcGYuaWNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9iYW5uZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9iYW5uZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MzMwMGU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvYmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzhmNzAxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2NvbGxhcHNlX2FsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlLmpwZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fY2xvc2UuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NmQyMDI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fY2xvc2UuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9jbG9zZV9zbWFsbC5qcGcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlX3NtYWxsLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjY2YjgxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlX3NtYWxsLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fY2xvc2Vfc21hbGxfcmlnaHQuanBnIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9jbG9zZV9zbWFsbF9yaWdodC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3MDZjOTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9jbG9zZV9zbWFsbF9yaWdodC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX29wZW4uanBnIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9vcGVuLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTY5MDRlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX29wZW4uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9vcGVuX3NtYWxsLmpwZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fb3Blbl9zbWFsbC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhNjM1YjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9vcGVuX3NtYWxsLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fb3Blbl9zbWFsbF9yaWdodC5qcGcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX29wZW5fc21hbGxfcmlnaHQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NWI3ZDRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fb3Blbl9zbWFsbF9yaWdodC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2Rvd25fYXJyb3cuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb3duX2Fycm93LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDY4YzQyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2Rvd25fYXJyb3cuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9leHBhbmRfYWxsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZXhwYW5kX2FsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhMThhMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9leHBhbmRfYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvaWNvbl9hYm91dC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2ljb25fYWJvdXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMTEzZTVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvaWNvbl9hYm91dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2Fib3V0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfYWJvdXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OGFhMTRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfYWJvdXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9kaXNwbGF5VHJlZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2Rpc3BsYXlUcmVlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMThiY2JhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2Rpc3BsYXlUcmVlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfZmVlZGJhY2suZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9mZWVkYmFjay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1ZDUyZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9mZWVkYmFjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2dldFN0YXJ0ZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9nZXRTdGFydGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTdkOGNhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2dldFN0YXJ0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9nbG9zc2FyeS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2dsb3NzYXJ5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDMyYTIzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2dsb3NzYXJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfaGFuZGxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfaGFuZGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjA4ZDA5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2hhbmRsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2luZGV4LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfaW5kZXguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZDZkMzFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfaW5kZXguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9wcmludC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX3ByaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzRhYTFkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX3ByaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfc2VhcmNoLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfc2VhcmNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTY3NzBmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX3NlYXJjaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX3NpdGVNYXAuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9zaXRlTWFwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmYyMTJiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX3NpdGVNYXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9zaGltLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvc2hpbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBhYmE3OTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9zaGltLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvc3BsYXNoLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvc3BsYXNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTIzOTU2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3NwbGFzaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3RpdGxlYmFja19sZWZ0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvdGl0bGViYWNrX2xlZnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMGVjYTBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvdGl0bGViYWNrX2xlZnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy90aXRsZWJhY2tfcmlnaHQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy90aXRsZWJhY2tfcmlnaHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OGI4OWMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvdGl0bGViYWNrX3JpZ2h0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvdG9wLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjE1YWNmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3RvcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3RvcF9zbS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3RvcF9zbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRlN2ZiYTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy90b3Bfc20uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy91cF9hcnJvdy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3VwX2Fycm93LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTFlNWNjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3VwX2Fycm93LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbmRleC9pbmRleC5jc3MgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW5kZXgvaW5kZXguY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2M2I4ZTVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbmRleC9pbmRleC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLXAuaW5kZXhoZWFkaW5nCi17Ci1mb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSBmb250LXdlaWdodDogYm9sZDsKLW1hcmdpbi10b3A6ICsycHg7IAotbWFyZ2luLWJvdHRvbTogLTJweDsKLX0KLQotcC5pbmRleGxldmVsMQotewotZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gZm9udC1zaXplOiBzbWFsbGVyOwotIG1hcmdpbi10b3A6IC0wcHg7IAotbWFyZ2luLWJvdHRvbTogLTJweDsKLX0KLQotcC5pbmRleGxldmVsMgotewotZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gZm9udC1zaXplOiBzbWFsbGVyOwotIG1hcmdpbi1sZWZ0OiArMTZweDsKLSBtYXJnaW4tdG9wOiAtMXB4OyAKLW1hcmdpbi1ib3R0b206IC0ycHg7Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbmRleC9pbmRleC5odG0gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW5kZXgvaW5kZXguaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMmU3YzRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbmRleC9pbmRleC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTxIVE1MPgotPHRpdGxlPkluZGV4IC0gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yazwvdGl0bGU+Ci08ZnJhbWVzZXQgcm93cz0iMjUsKiI+Ci08ZnJhbWUgbmFtZT0iaW5kZXhfdCIgdGl0bGU9Ik5hdmlnYXRpb24gYmFyIiBzcmM9Im5hdmlnLmh0bSIgc2Nyb2xsaW5nPSJubyIgbWFyZ2luaGVpZ2h0PSIyIiBtYXJnaW53aWR0aD0iMiI+Ci08ZnJhbWUgbmFtZT0ia2V5d29yZF90IiB0aXRsZT0iQ29udGVudHMiIHNyYz0iY29udGVudHMuaHRtIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIyIiBzY3JvbGxpbmc9ImF1dG8iPgotPC9mcmFtZXNldD4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbmRleC9sb2FkaW5nLmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbmRleC9sb2FkaW5nLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjg0ZGUxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW5kZXgvbG9hZGluZy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvRFREIEhUTUwgNC4wMS8vRU4iCi0gICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPGh0bWw+Ci0KLTxoZWFkPgotPG1ldGEgSFRUUC1FUVVJVj0icmVmcmVzaCIgQ09OVEVOVD0iMTsgdXJsPWNvbnRlbnRzLmh0bSI+Ci08dGl0bGU+PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLTwvaGVhZD4KLQotPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdGV4dD0iIzAwMDAwMCIgbGluaz0iIzAwNDA4MCIgdmxpbms9IiM2NjY2NjYiIGFsaW5rPSIjMDAwMEZGIj4KLQotCi08dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj48dHI+PHRkIHZhbGlnbj0idG9wIj4KLQotCi0KLQotCi0KLTxoMyBhbGlnbj0iY2VudGVyIj5JbmRleDwvaDM+Ci0KLTxwPjxicj4KLTwvcD4KLQotPGg0IGFsaWduPSJjZW50ZXIiPlBsZWFzZSB3YWl0IHdoaWxlIGluZGV4IHBhZ2UgaXMgbG9hZGluZy4uLjwvaDQ+Ci08cHJlIG1zbmF2aWdhdGlvbj4gPC9wcmU+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNCI+Ci0KLQotICAgICAgPHA+PGZvbnQgZmFjZT0iQXJpYWwiPiA8c21hbGw+PHNtYWxsPkNvcHlyaWdodCZuYnNwOwotICAgICAgICAmY29weTsgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVyczwvc21hbGw+PC9zbWFsbD4gPC9mb250PjwvcD4KLQotPC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNCI+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxJSI+Ci08cD4KLTxhIGhyZWY9Ii4uL2luZGV4Lmh0bSI+PC9hPgotPC9wPgotCi08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0KLWZ1bmN0aW9uIGxvYWRUb3AoKQotewotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiBwYXJlbnQuZnJhbWVzWzFdLm5hbWU9PSJvcnlfdG9jIikKLSAgewotICAgICBhbGVydCgiVGhlIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgaXMgYWxyZWFkeSBkaXNwbGF5ZWQgdXNpbmcgZnJhbWVzIik7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOwotICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7Ci0gICAgZG9jdW1lbnQuY29va2llID0gInJ1cF9vcnlfZG9jPSIgKyBlc2NhcGUgKGRvY3VtZW50LlVSTCkgKwotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOwotCi0gICAgdmFyIG5ld19vcnlfZG9jX2xvYyA9IG51bGw7Ci0KLSAgICBmb3IoaT1kb2N1bWVudC5saW5rcy5sZW5ndGgtMTtpPj0wO2ktLSkKLSAgICB7Ci0gICAgICAgaWYoZG9jdW1lbnQubGlua3NbaV0uaHJlZi5pbmRleE9mKCJpbmRleC5odG0iKSE9LTEpCi0gICAgICAgewotICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gZG9jdW1lbnQubGlua3NbaV0uaHJlZjsKLSAgICAgICAgIGJyZWFrOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpCi0gICAgewotCWlmKCBzZWxmLm5hbWUgPT0gIm9yeV9kb2MiICkKLQl7Ci0JCXdpbmRvdy5jbG9zZSgpOwotCQl3aW5kb3cub3BlbiggbmV3X29yeV9kb2NfbG9jICk7Ci0JfQotCWVsc2UKLQl7Ci0JICAgICAgIAl0b3AubG9jYXRpb24gPSBuZXdfb3J5X2RvY19sb2M7Ci0JfQotICAgIH0KLSAgIH0KLX0KLS8vIC0tPgotPC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0KLSAgZnVuY3Rpb24gZ2V0SW1hZ2VVcmwoaW1hZ2UpCi0gIHsKLSAgICB2YXIgbmV3X29yeV9kb2NfbG9jPW51bGw7Ci0gICAgZm9yKGk9ZG9jdW1lbnQubGlua3MubGVuZ3RoLTE7aT49MDtpLS0pCi0gICAgewotICAgICAgIGlmKGRvY3VtZW50LmxpbmtzW2ldLmhyZWYuaW5kZXhPZigiaW5kZXguaHRtIikhPS0xKQotICAgICAgIHsKLSAgICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IGRvY3VtZW50LmxpbmtzW2ldLmhyZWYuc3Vic3RyaW5nKDAsZG9jdW1lbnQubGlua3NbaV0uaHJlZi5sYXN0SW5kZXhPZigiLyIpKTsKLSAgICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IG5ld19vcnlfZG9jX2xvYyArICIiICsgaW1hZ2U7Ci0gICAgICAgICByZXR1cm4gbmV3X29yeV9kb2NfbG9jOwotICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLS8vIC0tPgotPC9zY3JpcHQ+Ci08c2NyaXB0Ci1sYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci08IS0tCi1NU0ZQaG92ZXIgPQotKCgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk5ldHNjYXBlIikgJiYKLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSAzICkpIHx8Ci0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gNCApKSk7Ci0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQotICB7Ci0gICAgIHZhciBhPW5ldyBJbWFnZSgpOwotICAgICBhLnNyYz1pbWc7Ci0gICAgIHJldHVybiBhOwotICB9Ci0vLyAtLT4KLTwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci08IS0tCi0gICAgaWYoTVNGUGhvdmVyKQotICAgIHsKLSAgICAgICAgUnVwR3JheT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzLmdpZicpKTsKLSAgICAgICAgUnVwQmx1ZT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzX2EuZ2lmJykpOwotICAgIH0KLS8vIC0tPgotPC9zY3JpcHQ+Ci0KLTxhIGhyZWY9IkphdmFTY3JpcHQ6bG9hZFRvcCgpOyIgb25tb3VzZW92ZXI9ImlmKE1TRlBob3ZlcikgZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwQmx1ZS5zcmM7IHNlbGYuc3RhdHVzPSdEaXNwbGF5IEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgdXNpbmcgZnJhbWVzJzsgcmV0dXJuIHRydWUiIG9ubW91c2VvdXQ9ImlmKE1TRlBob3ZlcikgZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwR3JheS5zcmM7IHNlbGYuc3RhdHVzPSAnICc7cmV0dXJuIHRydWUiPgotPHA+Ci08aW1nIHNyYz0iLi4vaW1hZ2VzL3J1cDEuZ2lmIiBib3JkZXI9IjAiIGFsdD0iRGlzcGxheSBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIHVzaW5nIGZyYW1lcyIgbmFtZT0iSG9tZSIgd2lkdGg9IjIwIiBoZWlnaHQ9IjExMCI+PC9wPjwvYT4KLTwvdGQ+PC90cj48L3RhYmxlPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPjx0cj48dGQ+Ci08cCBhbGlnbj0icmlnaHQiPjxmb250IGZhY2U9IkFyaWFsIj48c21hbGw+PHNtYWxsPkVjbGlwc2UgUHJvY2VzcwotRnJhbWV3b3JrJm5ic3A7Jm5ic3A7Ci08L3NtYWxsPjwvc21hbGw+PC9mb250PgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3MuanMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3cy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjljYmJmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3cy5qcworKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gamF2YXNjcmlwdCBmb3IgdGhlIGJvb2ttYXJrcyBmcmFtZSAoIHRoZSBvcnlfdG9jX2ZyYW1lIGZyYW1lKQotLy8gdGhpcyBmcmFtZSBjb250YWlucyBhIGNoaWxkIGlmcmFtZSAob3J5X3RvYykKLQotLy8gbWVzc2FnZXMgdG8gYmUgZXh0ZXJuaXplZAotLy8gaGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cwotdmFyIGJvb2ttYXJrdmlld3NfanNfTUVTU0FHRTEgPSAiVGhpcyBwYWdlIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiB0aGUgbmF2aWdhdGlvbiB0cmVlIHZpZXcuIjsKLQotZnVuY3Rpb24gZGlzcGxheVRyZWUodGFiKQotewotCXVybCA9IHRhYi5nZXRBdHRyaWJ1dGUoJ3VybCcpOwotCi0JaWYgKCBzZWxlY3RlZFRhYiAhPSBudWxsICkKLQl7Ci0JCXNlbGVjdGVkVGFiLmNsYXNzTmFtZSA9ICJ0YWIiCi0JfQotCXRhYi5jbGFzc05hbWUgPSAic2VsZWN0ZWRUYWIiCi0Jc2VsZWN0ZWRUYWIgPSB0YWI7Ci0KLQlsb2FkSWZyYW1lKCJvcnlfdG9jIiwgdXJsKTsKLX0KLQotZnVuY3Rpb24gbG9hZElmcmFtZShpZnJhbWVOYW1lLCB1cmwpCi17Ci0JaWYgKCB3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdICkKLQl7Ci0JCXdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0udG9jX2xvYWRlZCA9IGZhbHNlOwotCQl3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdLmxvY2F0aW9uID0gdXJsOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JZWxzZSByZXR1cm4gZmFsc2U7Ci19Ci0KLWZ1bmN0aW9uIHNob3dQYWdlKCkKLXsKLQotCXBhcmVudC5mcmFtZXNbIm9yeV9kb2MiXS5sb2NhdGlvbi5ocmVmID0gdW5lc2NhcGUodG9waWNUb0Rpc3BsYXkpOwotfQotCi0KLS8qKgotICogZmluZCBhIHRvcGljIGluIHRoZSB0cmVlOiB0aGUgdG9waWMgaXMgc2V0IGluIHRvcGljVG9EaXNwbGF5Ci0gKiByZXR1cm5zIHRydWUgaWYgc3VjY2VzcwotICovCi1mdW5jdGlvbiBmaW5kVG9jVG9waWMoKQotewotCXZhciB0b2Nfd2luZG93ID0gd2luZG93LmZyYW1lc1sib3J5X3RvYyJdOwotCi0JLy9hbGVydCh0b2Nfd2luZG93LnRvY19sb2FkZWQpOwotCS8vIGNoZWNrIGZvciBmYWxzZSBpcyBub3Qgc2FmZSBzaW5jZSB0aGUgdmFsdWUgbWlnaHQgYmUgdW5kZWZpbmVkIGlmIHRoZSBmcmFtZSBpcyBub3QgbG9hZGVkIHlldAotCS8vaWYgKHRvY193aW5kb3cudG9jX2xvYWRlZCA9PSBmYWxzZSApCi0JaWYgKCB0b2Nfd2luZG93LnRvY19sb2FkZWQgIT0gdHJ1ZSApCi0JewotCQkvL2lmICggdG9jX3dpbmRvdy50b2NfbG9hZGVkID09IHVuZGVmaW5lZCApCi0JCS8vewotCQkvLwlhbGVydCgiZ290IGl0ISIpOwotCQkvL30KLQkJd2luZG93LnNldFRpbWVvdXQoImZpbmRUb2NUb3BpYygpIiwgMjAwKTsKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKCB0b3BpY1RvRGlzcGxheSA9PSBudWxsICkKLQkJewotCQkJdG9waWNUb0Rpc3BsYXkgPSB0b2Nfd2luZG93LmdldEZpcnN0VG9waWNVcmwoKTsKLQkJfQotCQotCQl2YXIgdG9waWMgPSB0b3BpY1RvRGlzcGxheTsKLQotCQkvLyBmaW5kIHRoZSB0b3BpYyBpbiB0aGUgY3VycmVudCB2aWV3LCBpZiBub3QsIGxvb2sgZm9yIHRoZSBuZXh0IHZpZXcKLQkJaWYgKCB0b2Nfd2luZG93LnNlbGVjdFRvcGljKHRvcGljKSA9PSBmYWxzZSApCi0JCXsKLQkJCWlmICggbG9hZGluZ1RhYkluZGV4IDwgdmlld1RhYnMubGVuZ3RoIC0xICkKLQkJCXsKLQkJCQlkaXNwbGF5VHJlZSh2aWV3VGFic1tsb2FkaW5nVGFiSW5kZXgrK10pOwotCQkJCWZpbmRUb2NUb3BpYygpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIGVuZCBmaW5kaW5nIGFuZCBnb3Qgbm90aGluZwotCQkJCS8vIGRpc3BsYXkgdGhlIGRlZmF1bHQKLQkJCQlhbGVydChib29rbWFya3ZpZXdzX2pzX01FU1NBR0UxKTsKLQkJCQlsb2FkaW5nVGFiSW5kZXggPSAwOwotCQkJCXNob3dQYWdlKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlsb2FkaW5nVGFiSW5kZXggPSAwOwotCQkJLy8gZmluZCBzdWNjZXNzZnVsLCBkaXNwbGF5IHRoZSB0b3BpYyBwYWdlCi0JCQlzaG93UGFnZSgpOwotCQl9Ci0JfQotfQotCi0KLQotLy8gZmluZCB0aGUgdG9waWMgaW4gdGhlIGN1cnJlbnQgdGFiCi1mdW5jdGlvbiB3aGVyZUFtSSgpCi17Ci0JdmFyIHVybCA9IHBhcmVudC5mcmFtZXNbIm9yeV9kb2MiXS5kb2N1bWVudC5VUkw7Ci0JCi0JaWYgKCB1cmwgIT0gbnVsbCApCi0JewotCQl0b3BpY1RvRGlzcGxheSA9IHVybDsKLQkJZmluZFRvY1RvcGljKCk7Ci0JfQotfQotCi0KLWZ1bmN0aW9uIHRvZ1ZpZXdzKCkKLXsKLQkvLyBpZiBjdXJyZW50bHkgdmlzaWJsZSwgaGlkZSBhbGwgZXhjZXB0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKLQlpc1ZpZXdzVmlzaWJsZSA9ICghaXNWaWV3c1Zpc2libGUpOwotCQotCWZvciAoIHZhciBpID0gMDsgIGkgPCB2aWV3VGFicy5sZW5ndGg7IGkrKykKLQl7Ci0JCXZhciBzaG93ID0gaXNWaWV3c1Zpc2libGUgfHwgKHZpZXdUYWJzW2ldID09IHNlbGVjdGVkVGFiKTsKLQkJaWYgKCBzaG93ICkKLQkJewkJCi0JCQkvL3ZpZXdUYWJzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7Ci0JCQl2aWV3VGFic1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvL3ZpZXdUYWJzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKLQkJCXZpZXdUYWJzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0JCX0KLQl9Ci0JCQotCQkKLQotfQotCi0KLS8vIGRpc3BsYXkgdGhlIGRlZmF1bHQgcGFnZSBhbmQgbmF2aWdhdGUgdG8gdGhlIG5vZGUKLS8vIGlmIG5vIGRlZmF1bHQgcGFnZSBpcyBzZXQsIGRpc3BsYXkgdGhlIGZpcnN0IG5vZGUgb2YgdGhlIGZpcnN0IHZpZXcKLWZ1bmN0aW9uIGluaXQoKQotewotCWxvYWRpbmdUYWJJbmRleCA9IDA7Ci0JdmFyIHRhYnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3BhbiIpOwotCXZhciB0YWJjb3VudCA9IDA7Ci0JZm9yICh2YXIgaT0wOyBpPHRhYnMubGVuZ3RoOyBpKyspCi0JewotCQlpZiAoIHRhYnNbaV0uZ2V0QXR0cmlidXRlKCd1cmwnKSAhPSBudWxsICkKLQkJewkJCQotCQkJdmFyIGlzRGVmYXVsdFZpZXcgPSB0YWJzW2ldLmdldEF0dHJpYnV0ZSgnaXNEZWZhdWx0VmlldycpOwotCQkJaWYgKCBpc0RlZmF1bHRWaWV3ID09ICJ0cnVlIiApCi0JCQl7Ci0JCQkJbG9hZGluZ1RhYkluZGV4ID0gdGFiY291bnQ7Ci0JCQl9Ci0JCQkKLQkJCXZpZXdUYWJzW3RhYmNvdW50KytdID0gdGFic1tpXTsKLQkJfQotCX0KLQotCXRvcGljVG9EaXNwbGF5ID0gcGFyZW50LmdldENvb2tpZSgicnVwX29yeV9kb2MiKTsKLQlkaXNwbGF5VHJlZSh2aWV3VGFic1tsb2FkaW5nVGFiSW5kZXhdKTsKLQlmaW5kVG9jVG9waWMoKTsKLX0KLQotCi12YXIgc2VsZWN0ZWRUYWIgPSBudWxsOwotdmFyIHZpZXdUYWJzID0gbmV3IEFycmF5KCk7OwotdmFyIGxvYWRpbmdUYWJJbmRleCA9IDA7Ci12YXIgdG9waWNUb0Rpc3BsYXkgPSBudWxsOwotdmFyIGlzVmlld3NWaXNpYmxlID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvYWN0aW9uX2hpZGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9hY3Rpb25faGlkZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1ZmNkZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9hY3Rpb25faGlkZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL2FjdGlvbl91bmhpZGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9hY3Rpb25fdW5oaWRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODRhNGNmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL2FjdGlvbl91bmhpZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9maWxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlYTllNzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9maWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvZm9sZGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvZm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDY0MTlkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL2ZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL21pbnVzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvbWludXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MGQxZDM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvbWludXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9uaV93aGVyZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL25pX3doZXJlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDFhNGZkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL25pX3doZXJlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvbm9wbHVzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvbm9wbHVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGQ5ZTExNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL25vcGx1cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL3BsdXMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9wbHVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDE0NjcxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL3BsdXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L3RvYy5qcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC90b2MuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2N2Y3MmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L3RvYy5qcworKysgL2Rldi9udWxsCkBAIC0xLDg5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAKLS8vIENvbW1vbiBzY3JpcHRzIGZvciBJRSBhbmQgTW96aWxsYS4KLQotdmFyIGlzTW96aWxsYSA9IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignTW96aWxsYScpICE9IC0xICYmIHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uLnN1YnN0cmluZygwLDEpKSA+PSA1OwotdmFyIGlzSUUgPSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ01TSUUnKSAhPSAtMTsKLQotdmFyIG9sZEFjdGl2ZTsKLXZhciBvbGRBY3RpdmVDbGFzcyA9ICIiOwotdmFyIHRvY19sb2FkZWQgPSBmYWxzZTsKLWZ1bmN0aW9uIHNldExvYWRlZCgpCi17Ci0JdG9jX2xvYWRlZCA9IHRydWU7Ci19Ci0KLS8vIFByZWxvYWQgaW1hZ2VzCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBOb3RlOiBjb2RlIG1vdmVkIGludG8gdGhlIGpzcCwgZm9yIGR5bmFtaWMgaW1hZ2UgcHJlZmVyZW5jZXMKLQotLyoqCi0gKiBSZXR1cm5zIHRoZSB0YXJnZXQgbm9kZSBvZiBhbiBldmVudAotICovCi1mdW5jdGlvbiBnZXRUYXJnZXQoZSkgewotCXZhciB0YXJnZXQ7Ci0gIAlpZiAoaXNNb3ppbGxhKQotICAJCXRhcmdldCA9IGUudGFyZ2V0OwotICAJZWxzZSBpZiAoaXNJRSkKLSAgIAkJdGFyZ2V0ID0gd2luZG93LmV2ZW50LnNyY0VsZW1lbnQ7Ci0KLQlyZXR1cm4gdGFyZ2V0OwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIG5leHQgdHJlZSBub2RlICJkb3duIiBmcm9tIGN1cnJlbnQgb25lCi0gKi8KLWZ1bmN0aW9uIGdldE5leHREb3duKG5vZGUpCi17Ci0JdmFyIGEgPSBnZXRBbmNob3JOb2RlKG5vZGUpOwotCWlmICghYSkgcmV0dXJuIG51bGw7Ci0JCQotCS8vIFRyeSB2aXNpYmxlIGNoaWxkIGZpcnN0Ci0JdmFyIGxpID0gYS5wYXJlbnROb2RlOwotCXZhciB1bCA9IGdldENoaWxkTm9kZShsaSwgIlVMIik7Ci0JaWYgKHVsICYmIHVsLmNsYXNzTmFtZSA9PSAiZXhwYW5kZWQiKQotCQlyZXR1cm4gZ2V0RGVzY2VuZGFudE5vZGUodWwsICJBIik7Ci0JCi0JLy8gVHJ5IG5leHQgc2libGluZwotCXZhciBsaV9zaWIgPSBnZXROZXh0U2libGluZyhsaSk7Ci0JaWYgKGxpX3NpYiAhPSBudWxsKQotCQlyZXR1cm4gZ2V0RGVzY2VuZGFudE5vZGUobGlfc2liLCAiQSIpOwotCQkKLQkvLyBUcnkgbG9va2luZyB0byBwYXJlbnQncyBzaWJsaW5nCi0Jd2hpbGUobGlfc2liID09IG51bGwpIHsKLQkJdmFyIHVsID0gbGkucGFyZW50Tm9kZTsKLQkJbGkgPSB1bC5wYXJlbnROb2RlOwotCQlpZiAobGkudGFnTmFtZSAhPSAiTEkiKSAvLyByZWFjaGVkIHRoZSB0b3AsIG5vdGhpbmcgZWxzZSB0byBkbwotCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJbGlfc2liID0gZ2V0TmV4dFNpYmxpbmcobGkpOwkJCi0JfQotCQkKLQkvLyBmb3VuZCB0aGUgbmV4dCBkb3duIHNpYmxpbmcKLQlyZXR1cm4gZ2V0RGVzY2VuZGFudE5vZGUobGlfc2liLCAiQSIpOwkJCi19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgbmV4dCB0cmVlIG5vZGUgImRvd24iIGZyb20gY3VycmVudCBvbmUKLSAqLwotZnVuY3Rpb24gZ2V0TmV4dFVwKG5vZGUpCi17Ci0JdmFyIGEgPSBnZXRBbmNob3JOb2RlKG5vZGUpOwotCWlmICghYSkgcmV0dXJuIG51bGw7Ci0JCQotCS8vIEdldCBwcmV2aW91cyBzaWJsaW5nIGZpcnN0Ci0JdmFyIGxpID0gYS5wYXJlbnROb2RlOwotCXZhciBsaV9zaWIgPSBnZXRQcmV2U2libGluZyhsaSk7Ci0JaWYgKGxpX3NpYiAhPSBudWxsKSB7Ci0JCS8vIHRyeSB0byBnZXQgdGhlIGRlZXBlc3Qgbm9kZSB0aGF0IHByZWNlZWRzIHRoaXMgY3VycmVudCBub2RlCi0JCXZhciBjYW5kaWRhdGUgPSBnZXREZXNjZW5kYW50Tm9kZShsaV9zaWIsICJBIik7Ci0JCXZhciBuZXh0RG93biA9IGdldE5leHREb3duKGNhbmRpZGF0ZSk7Ci0JCXdoaWxlKG5leHREb3duICE9IG51bGwgJiYgbmV4dERvd24gIT0gbm9kZSl7Ci0JCQljYW5kaWRhdGUgPSBuZXh0RG93bjsKLQkJCW5leHREb3duID0gZ2V0TmV4dERvd24obmV4dERvd24pOwotCQl9Ci0JCXJldHVybiBnZXREZXNjZW5kYW50Tm9kZShjYW5kaWRhdGUsICJBIik7CTsKLQl9IGVsc2UgewotCQkvLyBnZXQgdGhlIHBhcmVudAotCQl2YXIgbGkgPSBsaS5wYXJlbnROb2RlLnBhcmVudE5vZGU7Ci0JCWlmIChsaSAmJiBsaS50YWdOYW1lID09ICJMSSIpCi0JCQlyZXR1cm4gZ2V0RGVzY2VuZGFudE5vZGUobGksICJBIik7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudAotICovCi1mdW5jdGlvbiBnZXROZXh0U2libGluZyhub2RlKSAKLXsKLQl2YXIgc2liID0gbm9kZS5uZXh0U2libGluZzsKLQl3aGlsZSAoc2liICYmIChzaWIubm9kZVR5cGUgPT0gMyB8fCBzaWIudGFnTmFtZT09IlNDUklQVCIpKSAvLyB0ZXh0IG9yIHNjcmlwdCBub2RlCi0JCXNpYiA9IHNpYi5uZXh0U2libGluZzsKLQlyZXR1cm4gc2liOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIG5leHQgc2libGluZyBlbGVtZW50Ci0gKi8KLWZ1bmN0aW9uIGdldFByZXZTaWJsaW5nKG5vZGUpIAotewotCXZhciBzaWIgPSBub2RlLnByZXZpb3VzU2libGluZzsKLQl3aGlsZSAoc2liICYmIChzaWIubm9kZVR5cGUgPT0gMyB8fCBzaWIudGFnTmFtZT09IlNDUklQVCIpKSAvLyB0ZXh0IG9yIHNjcmlwdCBub2RlCi0JCXNpYiA9IHNpYi5wcmV2aW91c1NpYmxpbmc7Ci0JcmV0dXJuIHNpYjsKLX0KLQotCi0vKioKLSAqIFJldHVybnMgdGhlIGNoaWxkIG5vZGUgd2l0aCBzcGVjaWZpZWQgdGFnCi0gKi8KLWZ1bmN0aW9uIGdldENoaWxkTm9kZShwYXJlbnQsIGNoaWxkVGFnKQotewotCXZhciBsaXN0ID0gcGFyZW50LmNoaWxkTm9kZXM7Ci0JaWYgKGxpc3QgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JZm9yICh2YXIgaT0wOyBpPGxpc3QubGVuZ3RoOyBpKyspCi0JCWlmIChsaXN0Lml0ZW0oaSkudGFnTmFtZSA9PSBjaGlsZFRhZykKLQkJCXJldHVybiBsaXN0Lml0ZW0oaSk7Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgZGVzY2VuZGF0IG5vZGUgd2l0aCBzcGVjaWZpZWQgdGFnIChkZXB0aC1maXJzdCBzZWFyY2hlcykKLSAqLwotZnVuY3Rpb24gZ2V0RGVzY2VuZGFudE5vZGUocGFyZW50LCBjaGlsZFRhZykKLXsJCi0JaWYgKHBhcmVudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkKLQlpZiAocGFyZW50LnRhZ05hbWUgPT0gY2hpbGRUYWcpCi0JCXJldHVybiBwYXJlbnQ7Ci0JCQotCXZhciBsaXN0ID0gcGFyZW50LmNoaWxkTm9kZXM7Ci0JaWYgKGxpc3QgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JZm9yICh2YXIgaT0wOyBpPGxpc3QubGVuZ3RoOyBpKyspIHsKLQkJdmFyIGNoaWxkID0gbGlzdC5pdGVtKGkpOwotCQlpZihjaGlsZC50YWdOYW1lID09IGNoaWxkVGFnKQotCQkJcmV0dXJuIGNoaWxkOwotCQkKLQkJY2hpbGQgPSBnZXREZXNjZW5kYW50Tm9kZShjaGlsZCwgY2hpbGRUYWcpOwotCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCXJldHVybiBjaGlsZDsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBhbmNob3Igb2YgdGhpcyBjbGljawotICogTk9URTogTU9aSUxMQSBCVUcgV0lUSCBBOmZvY3VzIGFuZCBBOmFjdGl2ZSBzdHlsZXMKLSAqLwotZnVuY3Rpb24gZ2V0QW5jaG9yTm9kZShub2RlKSB7Ci0gIGlmIChub2RlID09IG51bGwpIHJldHVybiBudWxsOwotICAgCi0gIGlmIChub2RlLm5vZGVUeXBlID09IDMpICAvLyJOb2RlLlRFWFRfTk9ERSIpIAotCXJldHVybiBub2RlLnBhcmVudE5vZGU7Ci0gIGVsc2UgaWYgKG5vZGUudGFnTmFtZSA9PSAiQSIpIAotICAgIHJldHVybiBub2RlOwotICBlbHNlIGlmIChub2RlLnRhZ05hbWUgPT0gIklNRyIpCi0gIAlyZXR1cm4gZ2V0Q2hpbGROb2RlKG5vZGUucGFyZW50Tm9kZSwgIkEiKTsKLSAgcmV0dXJuIG51bGw7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgcGx1cy9taW51cyBpY29uIGZvciB0aGlzIHRyZWUgbm9kZQotICovCi1mdW5jdGlvbiBnZXRQbHVzTWludXMobm9kZSkKLXsKLQlpZiAoaXNQbHVzTWludXMobm9kZSkpCi0JCXJldHVybiBub2RlOwotICAJZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSAgLy8iTm9kZS5URVhUX05PREUiKSAKLQkJcmV0dXJuIGdldENoaWxkTm9kZShub2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZSwgIklNRyIpOwotCWVsc2UgaWYgKG5vZGUudGFnTmFtZSA9PSAiSU1HIikKLSAgICAJcmV0dXJuIGdldENoaWxkTm9kZShub2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZSwgIklNRyIpOwotICAJZWxzZSBpZiAobm9kZS50YWdOYW1lID09ICJBIikgCi0gICAgCXJldHVybiBnZXRDaGlsZE5vZGUobm9kZS5wYXJlbnROb2RlLCAiSU1HIik7Ci0KLSAJcmV0dXJuIG51bGw7Ci19Ci0KLQotLyoqCi0gKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgbm9kZSBpcyB0aGUgcGx1cyBvciBtaW51cyBpY29uCi0gKi8KLWZ1bmN0aW9uIGlzUGx1c01pbnVzKG5vZGUpCi17Ci0JcmV0dXJuIChub2RlLm5vZGVUeXBlICE9IDMgJiYgbm9kZS50YWdOYW1lID09ICJJTUciICYmIChub2RlLmNsYXNzTmFtZSA9PSAiZXhwYW5kZWQiIHx8IG5vZGUuY2xhc3NOYW1lID09ICJjb2xsYXBzZWQiKSk7Ci19Ci0KLS8qKgotICogQ29sbGFwc2VzIGEgdHJlZSByb290ZWQgYXQgdGhlIHNwZWNpZmllZCBlbGVtZW50Ci0gKi8KLWZ1bmN0aW9uIGNvbGxhcHNlKG5vZGUpIHsKLSAgbm9kZS5jbGFzc05hbWUgPSAiY29sbGFwc2VkIjsKLSAgbm9kZS5zcmMgPSBwbHVzLnNyYzsKLSAgbm9kZS5hbHQgPSBhbHRUb3BpY0Nsb3NlZDsKLSAgLy8gc2V0IHRoZSBVTCBhcyB3ZWxsCi0gIHZhciB1bCA9IGdldENoaWxkTm9kZShub2RlLnBhcmVudE5vZGUsICJVTCIpOwotICBpZiAodWwgIT0gbnVsbCkgdWwuY2xhc3NOYW1lID0gImNvbGxhcHNlZCI7Ci19Ci0KLS8qKgotICogRXhwYW5kcyBhIHRyZWUgcm9vdGVkIGF0IHRoZSBzcGVjaWZpZWQgZWxlbWVudAotICovCi1mdW5jdGlvbiBleHBhbmQobm9kZSkgewotICAJbm9kZS5jbGFzc05hbWUgPSAiZXhwYW5kZWQiOwotICAJbm9kZS5zcmMgPSBtaW51cy5zcmM7Ci0gICAgbm9kZS5hbHQgPSBhbHRUb3BpY09wZW47Ci0gIAkvLyBzZXQgdGhlIFVMIGFzIHdlbGwKLSAgCXZhciB1bCA9IGdldENoaWxkTm9kZShub2RlLnBhcmVudE5vZGUsICJVTCIpOwotICAJaWYgKHVsICE9IG51bGwpewotICAJCXVsLmNsYXNzTmFtZSA9ICJleHBhbmRlZCI7Ci0gIAkJaWYgKHVsLmlkLmxlbmd0aCA+IDApewotICAJCQlpZiAoIWZyYW1lcy5keW5Mb2FkRnJhbWUpIHsKLSAgCQkJCXJldHVybjsKLSAgCQkJfQotICAJCQl2YXIgaXggPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCc/Jyk7Ci0gIAkJCWlmIChpeCA8IDApIHsKLSAgCQkJCXJldHVybjsKLSAgCQkJfQotICAJCQl2YXIgcXVlcnkgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zdWJzdHIoaXgpOwotICAJCQlmcmFtZXMuZHluTG9hZEZyYW1lLmxvY2F0aW9uID0gInRvY0ZyYWdtZW50LmpzcCIgKyBxdWVyeSArICImcGF0aD0iICsgdWwuaWQ7Ci0gIAkJfQotICAJfQotfQotCi0vKioKLSAqIEV4cGFuZHMgdGhlIG5vZGVzIGZyb20gcm9vdCB0byB0aGUgc3BlY2lmaWVkIG5vZGUKLSAqLwotZnVuY3Rpb24gZXhwYW5kUGF0aFRvKG5vZGUsIGluY2x1c2l2ZSkKLXsKLQotCS8vIHdoZW4gdGhlIG5vZGUgaXMgYSBsaW5rLCBnZXQgdGhlIHBsdXMvbWludXMgaW1hZ2UKLQlpZiAobm9kZS50YWdOYW1lID09ICJBIikgCi0JewotCQl2YXIgaW1nID0gZ2V0Q2hpbGROb2RlKG5vZGUucGFyZW50Tm9kZSwgIklNRyIpCi0JCWlmIChpbWcgIT0gbnVsbCkKLQkJewkJCQotCQkJZXhwYW5kUGF0aFRvKGltZywgaW5jbHVzaXZlKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQkKLQlpZiAoaW5jbHVzaXZlICYmIGlzQ29sbGFwc2VkKG5vZGUpKQotCQlleHBhbmQobm9kZSk7Ci0JCQotCXZhciBsaSA9IG5vZGUucGFyZW50Tm9kZTsKLQlpZiAobGkgPT0gbnVsbCkgcmV0dXJuOwotCXZhciB1bCA9IGxpLnBhcmVudE5vZGU7Ci0JaWYgKHVsID09IG51bGwpIHJldHVybjsKLQlsaSA9IHVsLnBhcmVudE5vZGU7Ci0JaWYgKGxpID09IG51bGwpIHJldHVybjsKLQl2YXIgaW1nID0gZ2V0Q2hpbGROb2RlKGxpLCAiSU1HIik7Ci0JaWYgKGltZyA9PSBudWxsKSByZXR1cm47Ci0JCQotCWV4cGFuZFBhdGhUbyhpbWcsIHRydWUpOwotfQotCi0vKioKLSAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoaXMgaXMgYW4gZXhwYW5kZWQgdHJlZSBub2RlCi0gKi8KLWZ1bmN0aW9uIGlzRXhwYW5kZWQobm9kZSkgewotICByZXR1cm4gbm9kZS5jbGFzc05hbWUgPT0gImV4cGFuZGVkIjsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRydWUgd2hlbiB0aGlzIGlzIGEgY29sbGFwc2VkIHRyZWUgbm9kZQotICovCi1mdW5jdGlvbiBpc0NvbGxhcHNlZChub2RlKSB7Ci0gIHJldHVybiAgbm9kZS5jbGFzc05hbWUgPT0gImNvbGxhcHNlZCI7Ci19Ci0KLS8qKgotICogSGlnaGxpZ2h0cyBsaW5rCi0gKi8KLWZ1bmN0aW9uIGhpZ2hsaWdodFRvcGljKHRvcGljKQotewotCWlmIChpc01vemlsbGEpCi0JCXdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTsKLQotICAJdmFyIGEgPSBnZXRBbmNob3JOb2RlKHRvcGljKTsgCi0gIAlpZiAoYSAhPSBudWxsKQotICAJewotICAJIC8vIAlwYXJlbnQucGFyZW50LnBhcmVudC5zZXRDb250ZW50VG9vbGJhclRpdGxlKHRvY1RpdGxlKTsKLSAgCSAgCWlmIChvbGRBY3RpdmUpIAotICAJICAJCW9sZEFjdGl2ZS5jbGFzc05hbWUgPSBvbGRBY3RpdmVDbGFzczsKLQotICAJCW9sZEFjdGl2ZSA9IGE7Ci0gIAkJb2xkQWN0aXZlQ2xhc3MgPSBhLmNsYXNzTmFtZTsKLSAgCQlhLmNsYXNzTmFtZSA9ICJhY3RpdmUiOwotICAJCS8vIGl0IGxvb2tzIGxpa2UgdGhlIG9uY2xpY2sgZXZlbnQgaXMgbm90IGhhbmRsZWQgaW4gbW96aWxsYQotICAJCS8vICoqKiBUTyBETzogaGFuZGxlIGZhaWxlZCBzeW5jaHJvbml6YXRpb24sIGRvIG5vdCBzZWxlY3QgaW4gdGhhdCBjYXNlCi0gIAkJaWYgKGlzTW96aWxsYSAmJiBhLm9uY2xpY2spIAotICAJCQlhLm9uY2xpY2soKQotICAJCS8vaWYgKGlzSUUpCi0gIAkJLy8JYS5oaWRlRm9jdXMgPSAidHJ1ZSI7Ci0gIAl9Ci19Ci0KLQotZnVuY3Rpb24gZ2V0Rmlyc3RUb3BpY1VybCgpCi17Ci0JdmFyIGxpbmtzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKTsKLQlpZiAoIGxpbmtzLmxlbmd0aCA+IDAgKQotCXsKLQkJcmV0dXJuIGxpbmtzWzBdLmhyZWY7Ci0JfQotCQotCXJldHVybiBudWxsOwotfQotCi0KLQotLyoqCi0gKiBTZWxlY3RzIGEgdG9waWMgaW4gdGhlIHRyZWU6IGV4cGFuZCB0cmVlIGFuZCBoaWdobGlnaHQgaXQKLSAqIHJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzCi0gKi8KLWZ1bmN0aW9uIHNlbGVjdFRvcGljKHRvcGljKQotewotCWlmICghdG9waWMpCi0JCXJldHVybiBmYWxzZTsKLQkJCi0JdG9waWMgPSBwYXJlbnQucGFyZW50LmZpeFVybCh0b3BpYyk7Ci0JCi0JLy8gcmVtb3ZlIHRoZSBxdWVyeSwgaWYgYW55Ci0JdmFyIGkgPSB0b3BpYy5pbmRleE9mKCc/Jyk7Ci0JaWYgKGkgIT0gLTEpCi0JCXRvcGljID0gdG9waWMuc3Vic3RyaW5nKDAsIGkpOwotCi0KLQl2YXIgbGlua3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpOwotCi0JZm9yICh2YXIgaT0wOyBpPGxpbmtzLmxlbmd0aDsgaSsrKQotCXsJCQkKLQkJdmFyIGZpeGVkX2hyZWYgPSBwYXJlbnQucGFyZW50LmZpeFVybChsaW5rc1tpXS5ocmVmKTsKLQkJCi0JCS8vIHJlbW92ZSB0aGUgcXVlcnksIGlmIGFueQotCQl2YXIgaW5keCA9IGZpeGVkX2hyZWYuaW5kZXhPZignPycpOwotCQlpZiAoaW5keCAhPSAtMSkgewotCQkJZml4ZWRfaHJlZiA9IGZpeGVkX2hyZWYuc3Vic3RyaW5nKDAsIGluZHgpOwotCQl9Ci0KLQkJLy9hbGVydCgiZml4ZWQgaHJlZj0iICsgZml4ZWRfaHJlZik7Ci0JCWlmICh0b3BpYyA9PSBmaXhlZF9ocmVmKQotCQl7Ci0JCQlleHBhbmRQYXRoVG8obGlua3NbaV0sIGZhbHNlKTsKLQkJCWhpZ2hsaWdodFRvcGljKGxpbmtzW2ldKTsKLQkJCXNjcm9sbEludG9WaWV3KGxpbmtzW2ldKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotLyoqCi0gKiBTZWxlY3RzIGEgdG9waWMgaW4gdGhlIHRyZWU6IGV4cGFuZCB0cmVlIGFuZCBoaWdobGlnaHQgaXQKLSAqIHJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzCi0gKi8KLWZ1bmN0aW9uIHNlbGVjdFRvcGljQnlJZChpZCkKLXsKLQl2YXIgdG9waWMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7Ci0JaWYgKHRvcGljKQotCXsKLQkJZXhwYW5kUGF0aFRvKHRvcGljLCBmYWxzZSk7Ci0JCWhpZ2hsaWdodFRvcGljKHRvcGljKTsKLQkJc2Nyb2xsSW50b1ZpZXcodG9waWMpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKioKLSAqIFNjcm9sbHMgdGhlIHBhZ2UgdG8gc2hvdyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKLSAqLwotZnVuY3Rpb24gc2Nyb2xsSW50b1ZpZXcobm9kZSkKLXsKLQl2YXIgc2Nyb2xsID0gZ2V0VmVydGljYWxTY3JvbGwobm9kZSk7Ci0JaWYgKHNjcm9sbCAhPSAwKQotCQl3aW5kb3cuc2Nyb2xsQnkoMCwgc2Nyb2xsKTsKLX0KLQotLyoqCi0gKiBTY3JvbGxzIHRoZSBwYWdlIHRvIHNob3cgdGhlIHNwZWNpZmllZCBlbGVtZW50Ci0gKi8KLWZ1bmN0aW9uIGdldFZlcnRpY2FsU2Nyb2xsKG5vZGUpCi17Ci0JdmFyIG5vZGVUb3AgPSBub2RlLm9mZnNldFRvcDsKLQl2YXIgbm9kZUJvdHRvbSA9IG5vZGVUb3AgKyBub2RlLm9mZnNldEhlaWdodDsKLQl2YXIgcGFnZVRvcCA9IDA7Ci0JdmFyIHBhZ2VCb3R0b20gPSAwOwotCQotCWlmIChpc0lFKQotCXsKLQkJcGFnZVRvcCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wOyAKLQkJcGFnZUJvdHRvbSA9IHBhZ2VUb3AgKyBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodDsKLQkKLQl9IAotCWVsc2UgaWYgKGlzTW96aWxsYSkKLQl7Ci0JCXBhZ2VUb3AgPSB3aW5kb3cucGFnZVlPZmZzZXQ7Ci0JCXBhZ2VCb3R0b20gPSBwYWdlVG9wICsgd2luZG93LmlubmVySGVpZ2h0IC0gbm9kZS5vZmZzZXRIZWlnaHQ7Ci0JfQotCQotCXZhciBzY3JvbGwgPSAwOwotCWlmIChub2RlVG9wID49IHBhZ2VUb3AgKQotCXsKLQkJaWYgKG5vZGVCb3R0b20gPD0gcGFnZUJvdHRvbSkKLQkJCXNjcm9sbCA9IDA7IC8vIGFscmVhZHkgaW4gdmlldwotCQllbHNlCi0JCQlzY3JvbGwgPSBub2RlQm90dG9tIC0gcGFnZUJvdHRvbTsKLQl9Ci0JZWxzZQotCXsKLQkJc2Nyb2xsID0gbm9kZVRvcCAtIHBhZ2VUb3A7Ci0JfQotCQotCXJldHVybiBzY3JvbGw7Ci19Ci0KLS8qCi0gKiBDdXJyZW50bHkgY2FsbGVkIG9uIElFIG9ubHkKLSAqLwotZnVuY3Rpb24gZm9jdXNIYW5kbGVyKGUpCi17Ci0JLyppZiAoaXNNb3ppbGxhKQotCQlyZXR1cm47Ci0JKi8KLQkJCi0JdHJ5ewotCQlpZiAob2xkQWN0aXZlKXsKLQkJCS8vIG9ubHkgZm9jdXMgd2hlbiB0aGUgZWxlbWVudCBpcyB2aXNpYmxlCi0JCQl2YXIgc2Nyb2xsID0gZ2V0VmVydGljYWxTY3JvbGwob2xkQWN0aXZlKTsKLQkJCWlmIChzY3JvbGwgPT0gMCkKLQkJCQlvbGRBY3RpdmUuZm9jdXMoKTsKLQkJfQkJCi0JfQotCWNhdGNoKGUpe30KLX0KLQotCi0vKioKLSAqIGRpc3BsYXkgdG9waWMgbGFiZWwgaW4gdGhlIHN0YXR1cyBsaW5lIG9uIG1vdXNlIG92ZXIgdG9waWMKLSAqLwotZnVuY3Rpb24gbW91c2VNb3ZlSGFuZGxlcihlKSB7Ci0JdmFyIG92ZXJOb2RlID0gZ2V0VGFyZ2V0KGUpOwotIAlpZiAoIW92ZXJOb2RlKSByZXR1cm47Ci0gIAkKLQlvdmVyTm9kZSA9IGdldEFuY2hvck5vZGUob3Zlck5vZGUpOwotCSAgaWYgKG92ZXJOb2RlID09IG51bGwpewotCSAgIHdpbmRvdy5zdGF0dXMgPSAiIjsKLQkgICByZXR1cm47Ci0JICB9Ci0gCi0JaWYgKGlzTW96aWxsYSkKLQkJZS5jYW5jZWxCdWJibGUgPSBmYWxzZTsKLSAgCSAKLQlpZiAob3Zlck5vZGUudGl0bGUgPT0gIiIpIHsKLQkJaWYgKG92ZXJOb2RlLmlubmVyVGV4dCkKLQkJCW92ZXJOb2RlLnRpdGxlID0gb3Zlck5vZGUuaW5uZXJUZXh0OwotCQllbHNlIGlmIChvdmVyTm9kZS50ZXh0KQotCQkJb3Zlck5vZGUudGl0bGUgPSBvdmVyTm9kZS50ZXh0OwotCX0KLQl3aW5kb3cuc3RhdHVzID0gb3Zlck5vZGUudGl0bGU7Ci19Ci0KLS8qKgotICogaGFuZGxlciBmb3IgZXhwYW5kaW5nIC8gY29sbGFwc2luZyB0b3BpYyB0cmVlCi0gKi8KLWZ1bmN0aW9uIG1vdXNlQ2xpY2tIYW5kbGVyKGUpIHsKLQotICAJdmFyIGNsaWNrZWROb2RlID0gZ2V0VGFyZ2V0KGUpOwotCi0gIAlpZiAoaXNQbHVzTWludXMoY2xpY2tlZE5vZGUpICkKLSAgCXsJCi0gICAgCWlmIChpc0NvbGxhcHNlZChjbGlja2VkTm9kZSkpIAotICAgCQkJZXhwYW5kKGNsaWNrZWROb2RlKTsKLSAgCQllbHNlIGlmIChpc0V4cGFuZGVkKGNsaWNrZWROb2RlKSkgCi0gIAkgIAkJY29sbGFwc2UoY2xpY2tlZE5vZGUpOwotICAJfQotICAJZWxzZQotICAJewotICAJCXZhciBwbHVzX21pbnVzID0gZ2V0UGx1c01pbnVzKGNsaWNrZWROb2RlKTsKLSAgCQlpZiAocGx1c19taW51cyAhPSBudWxsKQotICAJCQloaWdobGlnaHRUb3BpYyhwbHVzX21pbnVzKTsKLSAgCX0KLSAgCQotICAJaWYgKGlzTW96aWxsYSkKLSAgCQllLmNhbmNlbEJ1YmJsZSA9IHRydWU7Ci0gIAllbHNlIGlmIChpc0lFKQotICAJCXdpbmRvdy5ldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOwotfQotCi0vKioKLSAqIGhhbmRsZXIgZm9yIGV4cGFuZGluZyAvIGNvbGxhcHNpbmcgdG9waWMgdHJlZQotICovCi1mdW5jdGlvbiBtb3VzZURibENsaWNrSGFuZGxlcihlKSB7Ci0KLSAgCXZhciBjbGlja2VkTm9kZSA9IGdldFRhcmdldChlKTsKLSAgCWlmICghY2xpY2tlZE5vZGUpIHJldHVybjsKLQotICAJdmFyIHBsdXNfbWludXMgPSBnZXRQbHVzTWludXMoY2xpY2tlZE5vZGUpOwotICAJaWYgKHBsdXNfbWludXMgIT0gbnVsbCkKLSAgCXsJCi0gICAgCWlmIChjbGlja2VkTm9kZS50YWdOYW1lID09ICJBIiAmJiBnZXRDaGlsZE5vZGUoY2xpY2tlZE5vZGUucGFyZW50Tm9kZSwgIlVMIikgPT0gbnVsbCkgCi0gIAkJewotICAJCQloaWdobGlnaHRUb3BpYyhwbHVzX21pbnVzKTsKLSAgCQl9Ci0gIAkJZWxzZQotICAJCXsgIAkJCi0gICAgCQlpZiAoaXNDb2xsYXBzZWQocGx1c19taW51cykpIAotICAgCQkJCWV4cGFuZChwbHVzX21pbnVzKTsKLSAgCQkJZWxzZSBpZiAoaXNFeHBhbmRlZChwbHVzX21pbnVzKSkgCi0gIAkgIAkJCWNvbGxhcHNlKHBsdXNfbWludXMpOyAgCSAgCQkgIAkJICAKLSAgCSAgCQkJCi0gIAkJCWhpZ2hsaWdodFRvcGljKHBsdXNfbWludXMpOwotICAJCX0KLSAgCX0KLSAgCi0gIAlpZiAoaXNNb3ppbGxhKQotICAJCWUuY2FuY2VsQnViYmxlID0gdHJ1ZTsKLSAgCWVsc2UgaWYgKGlzSUUpCi0gIAkJd2luZG93LmV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7Ci19Ci0KLS8qKgotICogSGFuZGxlciBmb3Iga2V5IGRvd24gKGFycm93cykKLSAqLwotZnVuY3Rpb24ga2V5RG93bkhhbmRsZXIoZSkKLXsKLQl2YXIga2V5OwotCi0JaWYgKGlzSUUpIHsKLQkJa2V5ID0gd2luZG93LmV2ZW50LmtleUNvZGU7Ci0JfSBlbHNlIGlmIChpc01vemlsbGEpIHsKLQkJa2V5ID0gZS5rZXlDb2RlOwotCX0KLQkJCi0JaWYgKGtleSA8MzcgfHwga2V5ID4gNDApIAotCQlyZXR1cm4gdHJ1ZTsKLQkKLQlpZiAoaXNNb3ppbGxhKQotICAJCWUuY2FuY2VsQnViYmxlID0gdHJ1ZTsKLSAgCWVsc2UgaWYgKGlzSUUpCi0gIAkJd2luZG93LmV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7Ci0gIAkJCi0gIAlpZiAoa2V5ID09IDM5KSB7IC8vIFJpZ2h0IGFycm93LCBleHBhbmQKLQkJdmFyIGNsaWNrZWROb2RlID0gZ2V0VGFyZ2V0KGUpOwotICAJCWlmICghY2xpY2tlZE5vZGUpIHJldHVybjsKLSAgCQlpZiAoaXNJRSl7Ci0JCQlpZihjbGlja2VkTm9kZS5pZCE9bnVsbCl7Ci0JCQkJaWYoY2xpY2tlZE5vZGUuaWQuY2hhckF0KDApPT0nYicpewotCQkJCQlpZihjbGlja2VkTm9kZS5uYW1lIT0ib3BlbmVkIil7Ci0JCQkJCQlsb2FkVE9DKGNsaWNrZWROb2RlLm5hbWUpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotICAJCXZhciBwbHVzX21pbnVzID0gZ2V0UGx1c01pbnVzKGNsaWNrZWROb2RlKTsKLSAgCQlpZiAocGx1c19taW51cyAhPSBudWxsKQotICAJCXsJCi0gICAgCQlpZiAoaXNDb2xsYXBzZWQocGx1c19taW51cykpIAotICAgCQkJCWV4cGFuZChwbHVzX21pbnVzKTsKLSAgCQkJCi0gIAkJCWhpZ2hsaWdodFRvcGljKHBsdXNfbWludXMpOwotICAJCQlzY3JvbGxJbnRvVmlldyhjbGlja2VkTm9kZSk7Ci0gIAkJfQotICAJfSBlbHNlIGlmIChrZXkgPT0gMzcpIHsgLy8gTGVmdCBhcnJvdyxjb2xsYXBzZQotCQl2YXIgY2xpY2tlZE5vZGUgPSBnZXRUYXJnZXQoZSk7Ci0gIAkJaWYgKCFjbGlja2VkTm9kZSkgcmV0dXJuOwotICAJCQotICAJCWlmKGNsaWNrZWROb2RlLmlkIT1udWxsKXsKLSAgCQkJaWYoY2xpY2tlZE5vZGUuaWQuY2hhckF0KDApPT0nYicpewotCQkJCWlmKGNsaWNrZWROb2RlLm5hbWU9PSJvcGVuZWQiKXsKLQkJCQkJbG9hZFRPQygiICIpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZXsgCQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCi0gIAkJdmFyIHBsdXNfbWludXMgPSBnZXRQbHVzTWludXMoY2xpY2tlZE5vZGUpOwotICAJCWlmIChwbHVzX21pbnVzICE9IG51bGwpCi0gIAkJewkKLSAgICAJCWlmIChpc0V4cGFuZGVkKHBsdXNfbWludXMpKSAKLSAgIAkJCQljb2xsYXBzZShwbHVzX21pbnVzKTsKLSAgCQkJCi0gIAkJCWhpZ2hsaWdodFRvcGljKHBsdXNfbWludXMpOwotICAJCQlzY3JvbGxJbnRvVmlldyhjbGlja2VkTm9kZSk7Ci0gIAkJfQotICAJfSBlbHNlIGlmIChrZXkgPT0gNDAgKSB7IC8vIGRvd24gYXJyb3cKLSAgCQl2YXIgY2xpY2tlZE5vZGUgPSBnZXRUYXJnZXQoZSk7Ci0gIAkJaWYgKCFjbGlja2VkTm9kZSkgcmV0dXJuOwotCi0JCXZhciBuZXh0ID0gZ2V0TmV4dERvd24oY2xpY2tlZE5vZGUpOwotCQlpZiAobmV4dCkKLQkJCW5leHQuZm9jdXMoKTsKLQotICAJfSBlbHNlIGlmIChrZXkgPT0gMzggKSB7IC8vIHVwIGFycm93Ci0gIAkJdmFyIGNsaWNrZWROb2RlID0gZ2V0VGFyZ2V0KGUpOwotICAJCWlmICghY2xpY2tlZE5vZGUpIHJldHVybjsKLQotCQl2YXIgbmV4dCA9IGdldE5leHRVcChjbGlja2VkTm9kZSk7Ci0JCWlmIChuZXh0KQotCQkJbmV4dC5mb2N1cygpOwotICAJfQotICAJCi0gIAkgCQkJCi0gIAlyZXR1cm4gdHJ1ZTsKLX0KLQotaWYgKGlzTW96aWxsYSkgewotICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1vdXNlQ2xpY2tIYW5kbGVyLCB0cnVlKTsKLSAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCBtb3VzZURibENsaWNrSGFuZGxlciwgdHJ1ZSk7Ci0gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdXNlTW92ZUhhbmRsZXIsIHRydWUpOwotICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5RG93bkhhbmRsZXIsIHRydWUpOwotfQotZWxzZSBpZiAoaXNJRSl7Ci0gIGRvY3VtZW50Lm9uY2xpY2sgPSBtb3VzZUNsaWNrSGFuZGxlcjsKLSAgZG9jdW1lbnQub25kYmxjbGljayA9IG1vdXNlRGJsQ2xpY2tIYW5kbGVyOwotICBkb2N1bWVudC5vbm1vdXNlbW92ZSA9IG1vdXNlTW92ZUhhbmRsZXI7Ci0gIGRvY3VtZW50Lm9ua2V5ZG93biA9IGtleURvd25IYW5kbGVyOwotICAvL3dpbmRvdy5vbmZvY3VzID0gZm9jdXNIYW5kbGVyOwotfQotCi1mdW5jdGlvbiBzZXRDb29raWUoIG5hbWUsIHZhbHVlLCBleHBpcmVzLCBwYXRoLCBkb21haW4sIHNlY3VyZSApIAotewotCS8vIHNldCB0aW1lLCBpdCdzIGluIG1pbGxpc2Vjb25kcwotCXZhciB0b2RheSA9IG5ldyBEYXRlKCk7Ci0JdG9kYXkuc2V0VGltZSggdG9kYXkuZ2V0VGltZSgpICk7Ci0KLQkvKgotCWlmIHRoZSBleHBpcmVzIHZhcmlhYmxlIGlzIHNldCwgbWFrZSB0aGUgY29ycmVjdCAKLQlleHBpcmVzIHRpbWUsIHRoZSBjdXJyZW50IHNjcmlwdCBiZWxvdyB3aWxsIHNldCAKLQlpdCBmb3IgeCBudW1iZXIgb2YgZGF5cywgdG8gbWFrZSBpdCBmb3IgaG91cnMsIAotCWRlbGV0ZSAqIDI0LCBmb3IgbWludXRlcywgZGVsZXRlICogNjAgKiAyNAotCSovCi0JaWYgKCBleHBpcmVzICkKLQl7Ci0JZXhwaXJlcyA9IGV4cGlyZXMgKiAxMDAwICogNjAgKiA2MCAqIDI0OwotCX0KLQl2YXIgZXhwaXJlc19kYXRlID0gbmV3IERhdGUoIHRvZGF5LmdldFRpbWUoKSArIChleHBpcmVzKSApOwotCi0JZG9jdW1lbnQuY29va2llID0gbmFtZSArICI9IiArZXNjYXBlKCB2YWx1ZSApICsKLQkoICggZXhwaXJlcyApID8gIjtleHBpcmVzPSIgKyBleHBpcmVzX2RhdGUudG9HTVRTdHJpbmcoKSA6ICIiICkgKyAKLQkoICggcGF0aCApID8gIjtwYXRoPSIgKyBwYXRoIDogIiIgKSArIAotCSggKCBkb21haW4gKSA/ICI7ZG9tYWluPSIgKyBkb21haW4gOiAiIiApICsKLQkoICggc2VjdXJlICkgPyAiO3NlY3VyZSIgOiAiIiApOwotfQotCi0KLWZ1bmN0aW9uIGdldENvb2tpZSggbmFtZSApIHsJCi0JdmFyIHN0YXJ0ID0gZG9jdW1lbnQuY29va2llLmluZGV4T2YoIG5hbWUgKyAiPSIgKTsKLQl2YXIgbGVuID0gc3RhcnQgKyBuYW1lLmxlbmd0aCArIDE7Ci0JaWYgKCAoICFzdGFydCApICYmCi0JKCBuYW1lICE9IGRvY3VtZW50LmNvb2tpZS5zdWJzdHJpbmcoIDAsIG5hbWUubGVuZ3RoICkgKSApCi0JewotCXJldHVybiBudWxsOwotCX0KLQlpZiAoIHN0YXJ0ID09IC0xICkgcmV0dXJuIG51bGw7Ci0JdmFyIGVuZCA9IGRvY3VtZW50LmNvb2tpZS5pbmRleE9mKCAiOyIsIGxlbiApOwotCWlmICggZW5kID09IC0xICkgZW5kID0gZG9jdW1lbnQuY29va2llLmxlbmd0aDsKLQlyZXR1cm4gdW5lc2NhcGUoIGRvY3VtZW50LmNvb2tpZS5zdWJzdHJpbmcoIGxlbiwgZW5kICkgKTsKLX0KLQotCi1mdW5jdGlvbiBEZWxldGVfQ29va2llKCBuYW1lLCBwYXRoLCBkb21haW4gKSB7Ci0JaWYgKCBHZXRfQ29va2llKCBuYW1lICkgKSBkb2N1bWVudC5jb29raWUgPSBuYW1lICsgIj0iICsKLQkoICggcGF0aCApID8gIjtwYXRoPSIgKyBwYXRoIDogIiIpICsKLQkoICggZG9tYWluICkgPyAiO2RvbWFpbj0iICsgZG9tYWluIDogIiIgKSArCi0JIjtleHBpcmVzPVRodSwgMDEtSmFuLTE5NzAgMDA6MDA6MDEgR01UIjsKLX0KLQotZnVuY3Rpb24gZml4VG9waWNVcmwodXJsKSB7Ci0KLQl2YXIgZml4ZWRfaHJlZiA9IHBhcmVudC5wYXJlbnQuZml4VXJsKHVybCk7Ci0JLy8gcmVtb3ZlIHRoZSBxdWVyeSwgaWYgYW55Ci0JdmFyIGluZHggPSBmaXhlZF9ocmVmLmluZGV4T2YoJz8nKTsKLQlpZiAoaW5keCAhPSAtMSkgewotCQlmaXhlZF9ocmVmID0gZml4ZWRfaHJlZi5zdWJzdHJpbmcoMCwgaW5keCk7Ci0JfQotCi0JcmV0dXJuIGZpeGVkX2hyZWY7Ci19Ci0KLS8qIGZpbmQgdGhlIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gdXJsIGFuZCByZXR1cm4gdGhlIEEgZWxlbWVudCAqLwkKLWZ1bmN0aW9uIGZpbmROb2RlKHRvcGljKSB7Ci0JaWYgKCF0b3BpYykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JdG9waWMgPSBmaXhUb3BpY1VybCh0b3BpYyk7CQotCXZhciBsaW5rcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIik7Ci0JZm9yICh2YXIgaT0wOyBpPGxpbmtzLmxlbmd0aDsgaSsrKQotCXsJCQkKLQkJdmFyIGZpeGVkX2hyZWYgPSBmaXhUb3BpY1VybChsaW5rc1tpXS5ocmVmKTsJCQkKLQkJaWYgKHRvcGljID09IGZpeGVkX2hyZWYpCi0JCXsKLQkJCS8vYWxlcnQodG9waWMgKyAiXG4iICsgbGlua3NbaV0uaHJlZik7Ci0JCQlyZXR1cm4gbGlua3NbaV07Ci0JCX0KLQl9Ci0JCi0JcmV0dXJuIG51bGw7Ci19Ci0KLQotZnVuY3Rpb24gZ2V0Tm9kZUlkRnJvbVVybCh1cmwpIHsKLQotCXZhciBpbmR4ID0gdXJsLmluZGV4T2YoIj8iKTsKLQlpZiAoIGluZHggPCAwICkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcXVlcnlTdHIgPSB1cmwuc3Vic3RyaW5nKGluZHgrMSk7Ci0JdmFyIHBhaXJzID0gcXVlcnlTdHIuc3BsaXQoIiYiKTsKLSAgIAlmb3IgKHZhciBpID0gMDsgaSA8IHBhaXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgIAkJdmFyIHBvcyA9IHBhaXJzW2ldLmluZGV4T2YoJz0nKTsKLSAgICAgCQlpZiAocG9zID09IC0xKSBjb250aW51ZTsKLSAgICAgCQl2YXIgYXJnbmFtZSA9IHBhaXJzW2ldLnN1YnN0cmluZygwLHBvcyk7Ci0gICAgIAkJdmFyIHZhbHVlID0gcGFpcnNbaV0uc3Vic3RyaW5nKHBvcysxKTsgICAgCQotICAgICAJCWlmICggYXJnbmFtZSA9PSAibm9kZUlkIiApIHsKLSAgICAgCQkJcmV0dXJuIHZhbHVlOwotICAgICAJCX0KLQl9Ci0JCi0JcmV0dXJuIG51bGw7Ci19Ci0KLWZ1bmN0aW9uIGdldEJyZWFkY3J1bWJzQnlHdWlkKGd1aWQpIHsKLQotCXZhciBub2RlID0gZ2V0Tm9kZUJ5R3VpZChndWlkKTsKLQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCWlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JCXJldHVybiBnZXRCcmVhZGNydW1ic0J5Tm9kZUlkKGlkKTsKLQl9Ci0JCi0JcmV0dXJuICIiOwkKLX0KLQotZnVuY3Rpb24gZ2V0Tm9kZUJ5R3VpZChndWlkKSB7Ci0KLQl2YXIgbGlua3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpOwotCWZvciAodmFyIGk9MDsgaTxsaW5rcy5sZW5ndGg7IGkrKykKLQl7CQotCQl2YXIgbm9kZSA9IGxpbmtzW2ldOwotCQlpZiAoZ3VpZCA9PSBub2RlLmdldEF0dHJpYnV0ZSgiZ3VpZCIpICkgewotCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQl9Ci0JCi0JcmV0dXJuIG51bGw7CQotfQotCi1mdW5jdGlvbiBnZXRCcmVhZGNydW1icyh1cmwpIHsKLQotCXZhciBpZCA9IGdldE5vZGVJZEZyb21VcmwodXJsKTsKLQkvL2FsZXJ0KCJpZDogdXJsIDogIiArIGlkICsgIiwgIiArIHVybCk7Ci0KLQlpZiAoIGlkID09IG51bGwgfHwgaWQgPT0gIiIgKSB7Ci0JCS8qCi0JCS8vIGdldCB0aGUgcGFyZW50IG5vZGUsIGFzc3VtaW5nIHRoZSBjdXJyZW50IG5vZGUgaXMgbmF2aWdhdGVkIGZyb20gdGhlIHByZXZpb3VzIG5vZGUKLQkJdmFyIHByZXZpb3VzQnJlYWRDcnVtYklkID0gZ2V0Q29va2llKCJwcmV2aW91c0JyZWFkQ3J1bWJJZCIpOwotCQkKLQkJLy9hbGVydCgicHJldmlvdXNCcmVhZENydW1iSWQ9IiArIHByZXZpb3VzQnJlYWRDcnVtYklkKTsKLQkJdmFyIHBOb2RlID0gbnVsbDsKLQkJaWYgKCBwcmV2aW91c0JyZWFkQ3J1bWJJZCAhPSBudWxsICkgewotCQkJcE5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwcmV2aW91c0JyZWFkQ3J1bWJJZCk7Ci0JCQlpZiAoIHBOb2RlICE9IG51bGwgKSB7Ci0JCQkJLy8gZ2V0IHRoZSBwYXJlbnQgbm9kIG9mIHRoZSBsaW5rCi0JCQkJcE5vZGUgPSBwTm9kZS5wYXJlbnROb2RlOwotCQkJCS8vYWxlcnQocE5vZGUudGFnTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJKi8KLQkJCi0JCXZhciBub2RlID0gZmluZE5vZGUodXJsKTsJCQotCQlpZiAoIG5vZGUgIT0gbnVsbCApIHsKLQkJCWlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JCX0KLQkJCi0JCWlmICggaWQgPT0gbnVsbCApIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQkKLQkJLy8gc2F2ZSB0aGUgY3VycmVudCBpZAotCQkvLyBzZXRDb29raWUoInByZXZpb3VzQnJlYWRDcnVtYklkIiwgaWQpOwotCX0KLQkKLQlzZWxlY3RUb3BpY0J5SWQoaWQpOwotCi0JcmV0dXJuIGdldEJyZWFkY3J1bWJzQnlOb2RlSWQoaWQpOwotfQotCi0KLWZ1bmN0aW9uIGdldEJyZWFkY3J1bWJzQnlOb2RlSWQoaWQpIHsKLQotCXZhciBiY3MgPSBbXTsKLQl2YXIgY291bnQgPSAwOwotCXZhciBwSWQgPSBpZDsKLQl3aGlsZSAoIHBJZCAhPSAiIiApIHsKLQkJdmFyIHRvcGljID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocElkKTsKLQkJaWYgKCB0b3BpYyA9PSBudWxsICkgewotCQkJYnJlYWs7Ci0JCX0KLQotCQliY3NbY291bnQrK10gPSBfY29uc3RydWN0QnJlYWRjcnVtYih0b3BpYyk7Ci0JCQotCQlwSWQgPSB0b3BpYy5nZXRBdHRyaWJ1dGUoInBhcmVudElkIik7Ci0JfQotCQotCXJldHVybiBiY3MucmV2ZXJzZSgpOwotCi19Ci0KLWZ1bmN0aW9uIF9jb25zdHJ1Y3RCcmVhZGNydW1iKG5vZGUpIHsKLQotCi0JdmFyIHN0ciA9IG5vZGUuaW5uZXJIVE1MOwotCXZhciB1cmwgPSBub2RlLmhyZWY7Ci0JdmFyIGkgPSBzdHIuaW5kZXhPZigiPiIpOwotCWlmICggaSA+IDAgKSB7Ci0JCXN0ciA9IHN0ci5zdWJzdHJpbmcoaSsxKTsKLQl9Ci0KLQlyZXR1cm4ge3VybDogdXJsLCB0aXRsZTogc3RyfTsKLQotfQotCi0KLQotZnVuY3Rpb24gZ2V0QmFzZVVybCgpIHsKLQl2YXIgdXJsID0gcGFyZW50LnBhcmVudC5sb2NhdGlvbi5ocmVmOwotCXZhciBpID0gdXJsLmxhc3RJbmRleE9mKCIvIik7Ci0JcmV0dXJuIHVybC5zdWJzdHJpbmcoMCwgaSsxKTsKLX0KLQotLyogZ2l2ZSBhbiBhcnJheSBvZiBndWlkcywgcmV0dXJucyB0aGUgYnJlYWRjcnVtYnMqLwotCi1mdW5jdGlvbiBnZXRCcmVhZGNydW1ic0J5UGF0aChndWlkcykgewotCi0JdmFyIGd1aWRUb0JjcyA9IG5ldyBBcnJheSgpOwkKLQlpZiAoIGd1aWRzICE9IG51bGwgJiYgZ3VpZHMubGVuZ3RoICkgewkJCi0JCXZhciBsaW5rcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIik7Ci0JCWZvciAodmFyIGk9MDsgaTxsaW5rcy5sZW5ndGg7IGkrKykKLQkJewkKLQkJCXZhciBub2RlID0gbGlua3NbaV07Ci0JCQl2YXIgZ3VpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKCJndWlkIik7Ci0JCQlmb3IgKCB2YXIgaiA9IDA7IGogPCBndWlkcy5sZW5ndGg7IGorKyApIHsKLQkJCQlpZiAoZ3VpZCA9PSBndWlkc1tqXSApIHsKLQkJCQkJZ3VpZFRvQmNzW2d1aWRdID0gX2NvbnN0cnVjdEJyZWFkY3J1bWIobm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXZhciBiY3MgPSBbXTsKLQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBndWlkczsgaSsrICkgewotCQl2YXIgZ3VpZCA9IGd1aWRzW2ldOwotCQl2YXIgYmMgPSBndWlkVG9CY3NbZ3VpZF07Ci0JCWlmICggYmMgPT0gbnVsbCApIGJyZWFrOwotCQliY3MucHVzaChiYyk7Ci0JfQotCQotCXJldHVybiBiY3M7CQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC90cmVlLmpzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L3RyZWUuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEwZjJlM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L3RyZWUuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qKgotICogTG9hZHMgdGhlIHNwZWNpZmllZCB0YWJsZSBvZiBjb250ZW50cwotICovCi1mdW5jdGlvbiBsb2FkVE9DKHRvY0hyZWYpCi17Ci0JLy8gbmF2aWdhdGUgdG8gdGhpcyB0b2MsIGlmIG5vdCBhbHJlYWR5IGxvYWRlZAotCWlmICh3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJ0b2NWaWV3LmpzcD90b2M9Iit0b2NIcmVmKSAhPSAtMSkKLQkJcmV0dXJuOwotCXdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKCJ0b2NWaWV3LmpzcD90b2M9Iit0b2NIcmVmKTsKLX0KLQotdmFyIHRvY1RpdGxlID0gIiI7Ci12YXIgdG9jSWQgPSAiIjsKLQotZnVuY3Rpb24gb25sb2FkSGFuZGxlcigpCi17Ci0JcmV0dXJuOwotCXRvY1RpdGxlID0gJ1dvcmtiZW5jaFx1MDAyMFVzZXJcdTAwMjBHdWlkZSc7Ci0JdmFyIHRvY1RvcGljID0gImFib3V0OmJsYW5rIjsKLQotCS8vIHNldCB0aXRsZSBvbiB0aGUgY29udGVudCB0b29sYmFyCi0JcGFyZW50LnBhcmVudC5wYXJlbnQuc2V0Q29udGVudFRvb2xiYXJUaXRsZSh0b2NUaXRsZSk7Ci0KLQl2YXIgdG9waWNTZWxlY3RlZD1mYWxzZTsKLQkvLyBzZWxlY3Qgc3BlY2lmaWVkIHRvcGljLCBvciBlbHNlIHRoZSBib29rCi0JdmFyIHRvcGljID0gImFib3V0OmJsYW5rIjsKLQlpZiAodG9waWMgIT0gImFib3V0OmJsYW5rIiAmJiB0b3BpYyAhPSB0b2NUb3BpYykgewotCQlpZiAodG9waWMuaW5kZXhPZih3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wpICE9IDAgJiYgdG9waWMubGVuZ3RoID4gMikgewotCQkJLy8gcmVtb3ZlIHRoZSAuLiBmcm9tIHRvcGljCi0JCQl0b3BpYyA9IHRvcGljLnN1YnN0cmluZygyKTsKLQkJCS8vIHJlbW92ZSBhZHZhbmNlZC90b2NWaWV3LmpzcCBmcm9tIHBhdGggdG8gb2J0YWluIGNvbnRleHRQYXRoCi0JCQl2YXIgY29udGV4dFBhdGggPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7Ci0JCQl2YXIgc2xhc2ggPSBjb250ZXh0UGF0aC5sYXN0SW5kZXhPZignLycpOwotCQkJaWYoc2xhc2ggPiAwKSB7Ci0JCQkJc2xhc2ggPSBjb250ZXh0UGF0aC5sYXN0SW5kZXhPZignLycsIHNsYXNoLTEpOwotCQkJCWlmKHNsYXNoID49IDApIHsKLQkJCQkJY29udGV4dFBhdGggPSBjb250ZXh0UGF0aC5zdWJzdHIoMCwgc2xhc2gpOwotCQkJCQl0b3BpYyA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCArICIvLyIgK3dpbmRvdy5sb2NhdGlvbi5ob3N0ICsgY29udGV4dFBhdGggKyB0b3BpYzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdG9waWNTZWxlY3RlZCA9IHNlbGVjdFRvcGljKHRvcGljKTsKLQl9IGVsc2UgewotCQl0b3BpY1NlbGVjdGVkID0gc2VsZWN0VG9waWNCeUlkKHRvY0lkKTsKLQl9Ci0KLQlpZighdG9waWNTZWxlY3RlZCl7Ci0JCWlmKHBhcmVudC5wYXJlbnQuYWN0aXZpdHlGaWx0ZXJpbmcpewotCQkJYXNrU2hvd0FsbCgpOwotCQl9Ci0JfQotCi0KLQlmb2N1c0hhbmRsZXIoImUiKTsKLX0KLQotdmFyIGFza1Nob3dBbGxEaWFsb2c7Ci12YXIgdyA9IDQ3MDsKLXZhciBoID0gMjcwOwotCi1mdW5jdGlvbiBhc2tTaG93QWxsKCl7Ci0KLQl2YXIgbCA9IHRvcC5zY3JlZW5MZWZ0ICsgKHRvcC5kb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIC0gdykgLyAyOwotCXZhciB0ID0gdG9wLnNjcmVlblRvcCArICh0b3AuZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQgLSBoKSAvIDI7Ci0KLQkvLyBtb3ZlIHRoZSBkaWFsb2cganVzdCBhIGJpdCBoaWdoZXIgdGhhbiB0aGUgbWlkZGxlCi0JaWYgKHQtNTAgPiAwKSB0ID0gdC01MDsKLQotCXdpbmRvdy5sb2NhdGlvbj0iamF2YXNjcmlwdDovL25lZWRNb2RhbCI7Ci0JYXNrU2hvd0FsbERpYWxvZyA9IHdpbmRvdy5vcGVuKCJhc2tTaG93QWxsLmpzcCIsICJhc2tTaG93QWxsRGlhbG9nIiwgInJlc2l6ZWFibGU9bm8saGVpZ2h0PSIraCsiLHdpZHRoPSIrdysiLGxlZnQ9IitsKyIsdG9wPSIrdCApOwotCWFza1Nob3dBbGxEaWFsb2cuZm9jdXMoKTsKLX0KLQotZnVuY3Rpb24geWVzU2hvd0FsbCgpewotCXdpbmRvdy5wYXJlbnQucGFyZW50LnNob3dBbGwoKTsKLX0KLQotZnVuY3Rpb24gY2xvc2VBc2tTaG93QWxsRGlhbG9nKCl7Ci0JdHJ5IHsKLQkJaWYgKGFza1Nob3dBbGxEaWFsb2cpewotCQkJYXNrU2hvd0FsbERpYWxvZy5jbG9zZSgpOwotCQl9Ci0JfQotCWNhdGNoKGUpIHt9Ci19Ci0KLWZ1bmN0aW9uIG9udW5sb2FkSGFuZGxlcigpIHsKLQljbG9zZUFza1Nob3dBbGxEaWFsb2coKTsKLQotCWRvY3VtZW50LmJvZHkuaW5uZXJIVE1MID0gIiI7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4Lmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWE1YmY3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy9EVEQgSFRNTCA0LjAxLy9FTiIKLSAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08SFRNTD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08bWV0YSBuYW1lPSJtZXRhX3RhZ2dlZCIgY29udGVudD0idHJ1ZSI+Ci08dGl0bGU+R2xvc3NhcnkgLSBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrPC90aXRsZT4KLTwvaGVhZD4KLTxmcmFtZXNldCByb3dzPSIyNSwqIj4KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9uYXYiIHNyYz0ibmF2aWcuaHRtIiBzY3JvbGxpbmc9Im5vIiBtYXJnaW5oZWlnaHQ9IjIiIG1hcmdpbndpZHRoPSIyIiB0aXRsZT0iTmF2aWdhdGlvbiBBcmVhIj4KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9kb2MiIHNyYz0iLi4vZ2xvc3NhcnkuaHRtIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIyIiBzY3JvbGxpbmc9ImF1dG8iIHRpdGxlPSJDb250ZW50IEFyZWEiPgotPC9mcmFtZXNldD4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9yb3AuY3NzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3JvcC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY0MjIwZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3JvcC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotYm9keQotewotCWJhY2tncm91bmQtaW1hZ2U6IG5vbmU7Ci0JYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7Ci0gCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotIAlmb250LXNpemU6IDEwcHQKLX0KLQotYm9keS5uYXZidXR0b25zCi17Ci0JbWFyZ2luLWxlZnQ6IDBweDsKLQltYXJnaW4tdG9wOiAwcHg7Ci0JbWFyZ2luLXJpZ2h0OiAwcHgKLX0KLQotLmJnd2hpdGUKLXsgCi0JIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmYKLX0gCi0KLS5idXR0b25zCi17Ci0gICAJYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZQkKLX0KLQotLmJ1dHRvbm9uIAotewotCWJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JdmVydGljYWwtYWxpZ246IG1pZGRsZQotfSAKLQotdGQuYnV0dG9ucwotewotCXZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdAotfQotCi0uaWNvbmJvcmRlcgoteyAKLQkgYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZQotfQotCi1hLmJ1dHRvbnM6bGluayAKLXsgCi0JY29sb3I6ICMwMDAwMDAKLX0KLQotYS5idXR0b25zOnZpc2l0ZWQgCi17IAotCWNvbG9yOiAjMDAwMDAwCi19Ci0KLWEuYnV0dG9uczpob3ZlciAKLXsgCi0JY29sb3I6ICNjYzAwMDAKLX0KLQotYS5idXR0b25zOmFjdGl2ZQoteyAKLQljb2xvcjogI2NjMDAwMAotfQotCi0vKmZvciBwYWdlcyB3aXRoIGJ1dHRvbiBuYXZpZ2F0aW9uIG9uIHRvcCovICAKLWRpdi5tYXJnaW5zMjAgCi17IAkKLQltYXJnaW4tbGVmdDogN3B4OwotCW1hcmdpbi10b3A6IDIwcHg7Ci0JbWFyZ2luLXJpZ2h0OiA3cHgKLX0gICAKLQotCi1oMQotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IGxhcmdlCi19Ci0gICAgICAgIAotaDEuYmFubmVyCi17Ci0gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQkgIAlmb250LXNpemU6IGxhcmdlOwotCSAgCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lCi19Ci0KLWgyCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxNTAlCQotfQotICAgICAgICAKLWgyLmJhbm5lcgotewotICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTUwJTsKLSAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUKLX0KLQotaDMKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmCi19Ci0KLWg0LCBoNSwgaDYKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBtYXJnaW4tbGVmdDogMHB4Ci19Ci0gIAotICAgIAotYTpsaW5rCi17Ci0gICAgY29sb3I6ICMwMDMzOTkKLX0KLQotYTphY3RpdmUKLXsKLSAgICBjb2xvcjogIzAwMDBmZgotfQotCi1hOnZpc2l0ZWQKLXsKLSAgICBjb2xvcjogIzY2MDA2NgotfQotCi1kbAotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCSBmb250LXNpemU6IDEwcHQ7Ci19Ci0KLWR0Ci17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JIGZvbnQtc2l6ZTogMTBwdDsKLX0KLQotZGQKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQkgZm9udC1zaXplOiAxMHB0OwotfQotCi1wCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwcHgKLX0KLQotcC5ub2RlCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4Ci0gICAgICAgIAotfQotCi1wLmV4YW1wbGVoZWFkaW5nCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDE1cHgKLX0KLQotcC5leGFtcGxlCi17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JbWFyZ2luLWxlZnQ6IDcwcHg7Ci19Ci0KLXAucGljdHVyZXRleHQKLXsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci0JZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4MCU7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiA3MHB4OwotICAgICAgICBtYXJnaW4tcmlnaHQ6IDUwcHgKLX0KLQotcC5kZWZpbml0aW9uCi17Ci0JYmFja2dyb3VuZDogI2ZmZmZjYzsKLQlib3JkZXI6IHRoaW4gZG91YmxlIGJsYWNrCi19Ci0KLXAudGFibGVoZWFkaW5nCi17Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwCi19Ci0KLXAudGFibGV0ZXh0Ci17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwCi19Ci0KLXAucGFyYW1uYW1lCi17Ci0gICB0ZXh0LWFsaWduOiBsZWZ0Ci19Ci0KLXAucGFyYW1leGFtcGxlCi17Ci0gICB0ZXh0LWFsaWduOiBsZWZ0OwotICAgY29sb3I6IHJlZAotfQotCi1wLnBhcmFtZGVzY3JpcHRpb24KLXsKLSAgIHRleHQtYWxpZ246IGxlZnQKLX0KLQotb2wKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICs0NXB4Ci19Ci0KLW9sIG9sCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjNweAotfQotCi1vbCBvbCBvbAotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICBtYXJnaW4tbGVmdDogKzIzcHgKLX0KLQotb2wuYWxwaGEKLXsKLQlsaXN0LXN0eWxlLXR5cGU6IGxvd2VyLWFscGhhCi19Ci0KLXVsCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci19Ci0KLXVsIGxpCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIHRleHQtaW5kZW50OiArMjBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCBsaQotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgdWwgbGkKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIGxpLm5vZGUKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi11bCBsaS5jawotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgbGkuY2sKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIHVsIGxpLmNrCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweDsKLSAgICAJdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsLnBsdXMKLXsKLSAgICAgICAgbGlzdC1zdHlsZS1pbWFnZTogCi19Ci0KLXVsLm1pbnVzCi17Ci0gICAgICAgIGxpc3Qtc3R5bGUtaW1hZ2U6IAotfQotCi11bC5jawotewotCi19Ci0KLXRhYmxlCi17Ci0vKglib3JkZXI6IDE7Ki8KLS8qCXdpZHRoOiA4NSU7Ki8KLS8qCWNlbGxzcGFjaW5nOiAwOyovCi0vKgljZWxscGFkZGluZzogNDsqLwotLyoJc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIHJnYigxMjgsMTI4LDEyOCkiOyovCi0vKglib3JkZXJjb2xvcj0iIzgwODA4MCI7Ki8KLS8qCWJvcmRlcmNvbG9ybGlnaHQ6ICM4MDgwODA7Ki8KLS8qCWJvcmRlcmNvbG9yZGFyazogIzgwODA4MCovCi19Ci0KLXRib2R5Ci17Ci0JdmFsaWduOiBiYXNlbGluZTsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZgotfQotCi10aAotewotCWZvbnQtc2l6ZTogc21hbGxlcgotfQotCi10ZAotewotCXZlcnRpY2FsLWFsaWduOiB0b3A7Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdAotfQotCi10ZCB1bAotewotCW1hcmdpbi1sZWZ0OiArMjBweDsKLQlmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0Ci19Ci0KLWZvbnQucGFyYW1leGFtcGxlCi17Ci0gICBjb2xvcjogcmVkCi19Ci0KLWZvbnQuaW1hZ2VleGFtcGxlCi17Ci0gICBmb250LXNpemU6IHNtYWxsZXIKLX0KLQotLyogdXNlZCBmb3Igbm90LWluY2x1ZGVkIHBsdWdpbnMqLwotaDEubm90aW5jbHVkZWRiYW5uZXIKLXsKLSAgICAgICAgYmFja2dyb3VuZDogI0ZGRkZDQzsKLSAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0JICBmb250LXNpemU6IGxhcmdlOwotfQotCi0KLS8qdGhlIGZvbGxvd2luZyBpcyB1c2VkIGZvciBpYm0gY29udGVudCovCi0KLWgxLmlibQotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci19Ci0gICAgICAgIAotaDEuaWJtYmFubmVyCi17Ci0gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQkgIGZvbnQtc2l6ZTogbGFyZ2U7Ci0JIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lCi19Ci0KLQotICAgIAotCi1oMi5pYm0KLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotfQotICAgICAgICAKLWgyLmlibWJhbm5lcgotewotICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNTAlOyAKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotaDMuaWJtCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLX0KLQotaDQuaWJtLCBoNS5pYm0sIGg2LmlibQotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwcHgKLX0KLQotZGwuaWJtCi17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JIGZvbnQtc2l6ZTogMTBwdDsKLX0KLQotZHQuaWJtCi17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JIGZvbnQtc2l6ZTogMTBwdDsKLX0KLQotZGQuaWJtCi17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JIGZvbnQtc2l6ZTogMTBwdDsKLX0KLSAgIAotcC5pYm0KLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQkgZm9udC1zaXplOiAxMHB0OwotICAgICAgIAkgbWFyZ2luLWxlZnQ6IDBweAotfQotCi1wLmlibW5vZGUKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDE1cHgKLSAgICAgICAgbGVmdE1hcmdpbjogMTVweAotfQotCi1wLmlibWV4YW1wbGVoZWFkaW5nCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDE1cHgKLX0KLQotcC5pYm1leGFtcGxlCi17Ci0JbWFyZ2luLWxlZnQ6IDcwcHg7Ci19Ci0KLXAuaWJtcGljdHVyZXRleHQKLXsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci0JZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4MCU7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiA3MHB4OwotICAgICAgICBtYXJnaW4tcmlnaHQ6IDUwcHgKLX0KLQotcC5pYm1kZWZpbml0aW9uCi17Ci0JYmFja2dyb3VuZDogI2ZmZmZjYzsKLQlib3JkZXI6IHRoaW4gZG91YmxlIGJsYWNrCi19Ci0KLXAuaWJtdGFibGVoZWFkaW5nCi17Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwCi19Ci0KLXAuaWJtdGFibGV0ZXh0Ci17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwCi19Ci0KLXAuaWJtcGFyYW1uYW1lCi17Ci0gICB0ZXh0LWFsaWduOiBsZWZ0Ci19Ci0KLXAuaWJtcGFyYW1leGFtcGxlCi17Ci0gICB0ZXh0LWFsaWduOiBsZWZ0OwotICAgY29sb3I6IHJlZAotfQotCi1wLmlibXBhcmFtZGVzY3JpcHRpb24KLXsKLSAgIHRleHQtYWxpZ246IGxlZnQKLX0KLQotb2wuaWJtCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArNDVweAotfQotCi1vbCBvbC5pYm0KLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICsyM3B4Ci19Ci0KLW9sIG9sIG9sLmlibQotewotICAgICAgICBtYXJnaW4tbGVmdDogKzIzcHgKLX0KLQotb2wuaWJtYWxwaGEKLXsKLQlsaXN0LXN0eWxlLXR5cGU6IGxvd2VyLWFscGhhCi19Ci0KLQotCi11bCBsaS5pYm0KLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsyMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIGxpLmlibQotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQkgIHRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCB1bCBsaS5pYm0KLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsIGxpLmlibW5vZGUKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi11bCBsaS5pYm1jawotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgbGkuaWJtY2sKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIHVsIGxpLmlibWNrCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotdWwuaWJtcGx1cwotewotICAgICAgICBsaXN0LXN0eWxlLWltYWdlOiAKLX0KLQotdWwuaWJtbWludXMKLXsKLSAgICAgICAgbGlzdC1zdHlsZS1pbWFnZTogCi19Ci0KLQotdWwuaWJtY2sKLXsKLQotfQotCi10YWJsZS5pYm0KLXsKLX0KLQotdHIuaWJtCi17Ci19Ci0KLXRkLmlibQotewotICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wCi19Ci0KLXRkIHVsLmlibQotewotICAgICAgICBtYXJnaW4tbGVmdDogKzIwcHgKLX0KLQotZm9udC5pYm1wYXJhbWV4YW1wbGUKLXsKLSAgIGNvbG9yOiByZWQKLX0KLQotZm9udC5pYm1pbWFnZWV4YW1wbGUKLXsKLSAgIGZvbnQtc2l6ZTogc21hbGxlcgotfQotCi0vKnRoZSBmb2xsb3dpbmcgaXMgdXNlZCBmb3IgcmVhbCB0aW1lIGNvbnRlbnQqLwotCi1oMS5yZWFjdGl2ZQotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci19Ci0gICAgICAgIAotaDEucmVhY3RpdmViYW5uZXIKLXsKLSAgICAgICAgCi0gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IGxhcmdlOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1oMi5yZWFjdGl2ZQotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNTAlOwotfQotICAgICAgICAKLWgyLnJlYWN0aXZlYmFubmVyCi17Ci0gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxNTAlOwotICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotaDMucmVhY3RpdmUKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotfQotCi1oNC5yZWFjdGl2ZSwgaDUucmVhY3RpdmUsIGg2LnJlYWN0aXZlCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDBweAotfQotCi1kbC5yZWFjdGl2ZQotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCSBmb250LXNpemU6IDEwcHQ7Ci19Ci0KLWR0LnJlYWN0aXZlCi17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JIGZvbnQtc2l6ZTogMTBwdDsKLX0KLSAgICAgIAotZGQucmVhY3RpdmUKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQkgZm9udC1zaXplOiAxMHB0OwotfQotCi1wLnJlYWN0aXZlCi17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDBweAotfQotCi1wLnJlYWN0aXZlbm9kZQotewotICAgICAgICBtYXJnaW4tbGVmdDogMTVweAotICAgICAgICBsZWZ0TWFyZ2luOiAxNXB4Ci19Ci0KLXAucmVhY3RpdmVleGFtcGxlaGVhZGluZwotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4Ci19Ci0KLXAucmVhY3RpdmVleGFtcGxlCi17Ci0JbWFyZ2luLWxlZnQ6IDcwcHg7Ci19Ci0KLXAucmVhY3RpdmVwaWN0dXJldGV4dAotewotCXRleHQtYWxpZ246IGNlbnRlcjsKLQlmb250LWZhbWlseTogc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDgwJTsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDcwcHg7Ci0gICAgICAgIG1hcmdpbi1yaWdodDogNTBweAotfQotCi1wLnJlYWN0aXZlZGVmaW5pdGlvbgotewotCWJhY2tncm91bmQ6ICNmZmZmY2M7Ci0JYm9yZGVyOiB0aGluIGRvdWJsZSBibGFjawotfQotCi1wLnJlYWN0aXZldGFibGVoZWFkaW5nCi17Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwCi19Ci0KLXAucmVhY3RpdmV0YWJsZXRleHQKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDAKLX0KLQotcC5yZWFjdGl2ZXBhcmFtbmFtZQotewotICAgdGV4dC1hbGlnbjogbGVmdAotfQotCi1wLnJlYWN0aXZlcGFyYW1leGFtcGxlCi17Ci0gICB0ZXh0LWFsaWduOiBsZWZ0OwotICAgY29sb3I6IHJlZAotfQotCi1wLnJlYWN0aXZlcGFyYW1kZXNjcmlwdGlvbgotewotICAgdGV4dC1hbGlnbjogbGVmdAotfQotCi1vbC5yZWFjdGl2ZQotewotICAgICAgICBtYXJnaW4tbGVmdDogKzQ1cHgKLX0KLQotb2wgb2wucmVhY3RpdmUKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICsyM3B4Ci19Ci0KLW9sIG9sIG9sLnJlYWN0aXZlCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjNweAotfQotCi1vbC5yZWFjdGl2ZWFscGhhCi17Ci0JbGlzdC1zdHlsZS10eXBlOiBsb3dlci1hbHBoYQotfQotCi0KLQotdWwgbGkucmVhY3RpdmUKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICB0ZXh0LWluZGVudDogKzIwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgbGkucmVhY3RpdmUKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQkgIHRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCB1bCBsaS5yZWFjdGl2ZQotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCSAgdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi11bCBsaS5yZWFjdGl2ZW5vZGUKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi11bCBsaS5yZWFjdGl2ZWNrCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCBsaS5yZWFjdGl2ZWNrCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCB1bCBsaS5yZWFjdGl2ZWNrCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotdWwucmVhY3RpdmVwbHVzCi17Ci0gICAgICAgIGxpc3Qtc3R5bGUtaW1hZ2U6IAotfQotCi11bC5yZWFjdGl2ZW1pbnVzCi17Ci0gICAgICAgIGxpc3Qtc3R5bGUtaW1hZ2U6IAotfQotCi0KLXVsLnJlYWN0aXZlY2sKLXsKLX0KLQotdGFibGUucmVhY3RpdmUKLXsKLX0KLQotdHIucmVhY3RpdmUKLXsKLX0KLQotdGQucmVhY3RpdmUKLXsKLSAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcAotfQotCi10ZCB1bC5yZWFjdGl2ZQotewotICAgICAgICBtYXJnaW4tbGVmdDogKzIwcHgKLX0KLQotZm9udC5yZWFjdGl2ZXBhcmFtZXhhbXBsZQotewotICAgY29sb3I6IHJlZAotfQotCi1mb250LnJlYWN0aXZlaW1hZ2VleGFtcGxlCi17Ci0gICBmb250LXNpemU6IHNtYWxsZXIKLX0KLQotLyp0aGUgZm9sbG93aW5nIGlzIHVzZWQgZm9yIE1pY3Jvc29mdCBjb250ZW50Ki8KLQotaDEubXNmdAotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiBsYXJnZTsKLX0KLSAgICAgICAgCi1oMS5tc2Z0YmFubmVyCi17Ci0gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQkgIAkgZm9udC1zaXplOiBsYXJnZTsKLQkgIAkgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWgyLm1zZnQKLXsKLSAgICAgICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTUwJTsJCi19Ci0gICAgICAgIAotaDIubXNmdGJhbm5lcgotewotICAgICB0ZXh0LWFsaWduOiBsZWZ0OwotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0JIGZvbnQtc2l6ZTogMTUwJTsKLQkgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci0JICAJCi19Ci0KLWgzLm1zZnQKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotfQotCi1oNC5tc2Z0LCBoNS5tc2Z0LCBoNi5tc2Z0Ci17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDBweAotfQotCi1kbC5tc2Z0Ci17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JIGZvbnQtc2l6ZTogMTBwdDsKLX0KLQotZHQubXNmdAotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCSBmb250LXNpemU6IDEwcHQ7Ci19Ci0gICAgICAKLWRkLm1zZnQKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQkgZm9udC1zaXplOiAxMHB0OwotfQotCi1wLm1zZnQKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQkgZm9udC1zaXplOiAxMHB0OwotfQotCi1wLm1zZnRub2RlCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4Ci0gICAgICAgIGxlZnRNYXJnaW46IDE1cHgKLX0KLQotcC5tc2Z0ZXhhbXBsZWhlYWRpbmcKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICBtYXJnaW4tbGVmdDogMTVweAotfQotCi1wLm1zZnRleGFtcGxlCi17Ci0JbWFyZ2luLWxlZnQ6IDcwcHg7Ci19Ci0KLXAubXNmdHBpY3R1cmV0ZXh0Ci17Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotCWZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogODAlOwotICAgICAgICBtYXJnaW4tbGVmdDogNzBweDsKLSAgICAgICAgbWFyZ2luLXJpZ2h0OiA1MHB4Ci19Ci0KLXAubXNmdGRlZmluaXRpb24KLXsKLQliYWNrZ3JvdW5kOiAjZmZmZmNjOwotCWJvcmRlcjogdGhpbiBkb3VibGUgYmxhY2sKLX0KLQotcC5tc2Z0dGFibGVoZWFkaW5nCi17Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwCi19Ci0KLXAubXNmdHRhYmxldGV4dAotewotICAgICAgICBtYXJnaW4tbGVmdDogMAotfQotCi1wLm1zZnRwYXJhbW5hbWUKLXsKLSAgIHRleHQtYWxpZ246IGxlZnQKLX0KLQotcC5tc2Z0cGFyYW1leGFtcGxlCi17Ci0gICB0ZXh0LWFsaWduOiBsZWZ0OwotICAgY29sb3I6IHJlZAotfQotCi1wLm1zZnRwYXJhbWRlc2NyaXB0aW9uCi17Ci0gICB0ZXh0LWFsaWduOiBsZWZ0Ci19Ci0KLW9sLm1zZnQKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICs0NXB4Ci19Ci0KLW9sIG9sLm1zZnQKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICsyM3B4Ci19Ci0KLW9sIG9sIG9sLm1zZnQKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICsyM3B4Ci19Ci0KLW9sLm1zZnRhbHBoYQotewotCWxpc3Qtc3R5bGUtdHlwZTogbG93ZXItYWxwaGEKLX0KLQotCi0KLXVsIGxpLm1zZnQKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsyMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIGxpLm1zZnQKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgdWwgbGkubXNmdAotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQkgIHRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotdWwgbGkubXNmdG5vZGUKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi11bCBsaS5tc2Z0Y2sKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIGxpLm1zZnRjawotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgdWwgbGkubXNmdGNrCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotdWwubXNmdHBsdXMKLXsKLSAgICAgICAgbGlzdC1zdHlsZS1pbWFnZTogCi19Ci0KLXVsLm1zZnRtaW51cwotewotICAgICAgICBsaXN0LXN0eWxlLWltYWdlOiAKLX0KLQotCi11bC5tc2Z0Y2sKLXsKLX0KLQotdGFibGUubXNmdAotewotfQotCi10ci5tc2Z0Ci17Ci19Ci0KLXRkLm1zZnQKLXsKLSAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcAotfQotCi10ZCB1bC5tc2Z0Ci17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjBweAotfQotCi1mb250Lm1zZnRwYXJhbWV4YW1wbGUKLXsKLSAgIGNvbG9yOiByZWQKLX0KLQotZm9udC5tc2Z0aW1hZ2VleGFtcGxlCi17Ci0gICBmb250LXNpemU6IHNtYWxsZXIKLX0KLQotLyp0aGUgZm9sbG93aW5nIGlzIHVzZWQgZm9yIGRhdGFiYXNlIGNvbnRlbnQqLwotCi1oMS5kYm1zCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLX0KLSAgICAgICAgCi1oMS5kYm1zYmFubmVyCi17Ci0gICAgICAgIGJhY2tncm91bmQ6ICM2YThmYmQ7Ci0gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCSAgZm9udC1zaXplOiBsYXJnZTsKLX0KLQotaDIuZGJtcwotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci19Ci0gICAgICAgIAotaDIuZGJtc2Jhbm5lcgotewotICAgICAgICBiYWNrZ3JvdW5kOiAjNmE4ZmJkOwotICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLX0KLQotaDMuZGJtcwotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci19Ci0KLWg0LmRibXMsIGg1LmRibXMsIGg2LmRibXMKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBtYXJnaW4tbGVmdDogMHB4Ci19Ci0KLWRsLmRibXMKLXsKLX0KLQotZHQuZGJtcwotewotfQotICAgICAgCi1kZC5kYm1zCi17Ci19Ci0KLXAuZGJtcwotewotICAgICAgICBtYXJnaW4tbGVmdDogMHB4Ci19Ci0KLXAuZGJtc25vZGUKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDE1cHgKLSAgICAgICAgbGVmdE1hcmdpbjogMTVweAotfQotCi1wLmRibXNleGFtcGxlaGVhZGluZwotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4Ci19Ci0KLXAuZGJtc2V4YW1wbGUKLXsKLQltYXJnaW4tbGVmdDogNzBweDsKLX0KLQotcC5kYm1zcGljdHVyZXRleHQKLXsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci0JZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4MCU7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiA3MHB4OwotICAgICAgICBtYXJnaW4tcmlnaHQ6IDUwcHgKLX0KLQotcC5kYm1zZGVmaW5pdGlvbgotewotCWJhY2tncm91bmQ6ICNmZmZmY2M7Ci0JYm9yZGVyOiB0aGluIGRvdWJsZSBibGFjawotfQotCi1wLmRibXN0YWJsZWhlYWRpbmcKLXsKLQlmb250LXdlaWdodDogYm9sZDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDAKLX0KLQotcC5kYm1zdGFibGV0ZXh0Ci17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwCi19Ci0KLXAuZGJtc3BhcmFtbmFtZQotewotICAgdGV4dC1hbGlnbjogbGVmdAotfQotCi1wLmRibXNwYXJhbWV4YW1wbGUKLXsKLSAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICBjb2xvcjogcmVkCi19Ci0KLXAuZGJtc3BhcmFtZGVzY3JpcHRpb24KLXsKLSAgIHRleHQtYWxpZ246IGxlZnQKLX0KLQotb2wuZGJtcwotewotICAgICAgICBtYXJnaW4tbGVmdDogKzQ1cHgKLX0KLQotb2wgb2wuZGJtcwotewotICAgICAgICBtYXJnaW4tbGVmdDogKzIzcHgKLX0KLQotb2wgb2wgb2wuZGJtcwotewotICAgICAgICBtYXJnaW4tbGVmdDogKzIzcHgKLX0KLQotb2wuZGJtc2FscGhhCi17Ci0JbGlzdC1zdHlsZS10eXBlOiBsb3dlci1hbHBoYQotfQotCi0KLQotdWwgbGkuZGJtcwotewotICAgICAgICB0ZXh0LWluZGVudDogKzIwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgbGkuZGJtcwotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQkgIHRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCB1bCBsaS5kYm1zCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCSAgdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi11bCBsaS5kYm1zbm9kZQotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsIGxpLmRibXNjawotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgbGkuZGJtc2NrCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCB1bCBsaS5kYm1zY2sKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi11bC5kYm1zcGx1cwotewotICAgICAgICBsaXN0LXN0eWxlLWltYWdlOiAKLX0KLQotdWwuZGJtc21pbnVzCi17Ci0gICAgICAgIGxpc3Qtc3R5bGUtaW1hZ2U6IAotfQotCi0KLXVsLmRibXNjawotewotfQotCi10YWJsZS5kYm1zCi17Ci19Ci0KLXRyLmRibXMKLXsKLX0KLQotdGQuZGJtcwotewotICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wCi19Ci0KLXRkIHVsLmRibXMKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICsyMHB4Ci19Ci0KLWZvbnQuZGJtc3BhcmFtZXhhbXBsZQotewotICAgY29sb3I6IHJlZAotfQotCi1mb250LmRibXNpbWFnZWV4YW1wbGUKLXsKLSAgIGZvbnQtc2l6ZTogc21hbGxlcgotfQotCi0vKnRoZSBmb2xsb3dpbmcgaXMgdXNlZCBmb3IgbGFyZ2Utc2NhbGUgZGV2ZWxvcG1lbnQgY29udGVudCovCi0KLWgxLmxhcmdlCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLX0KLSAgICAgICAgCi1oMS5sYXJnZWJhbm5lcgotewotICAgICAgICBiYWNrZ3JvdW5kOiAjNmE4ZmJkOwotICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQkgIGZvbnQtc2l6ZTogbGFyZ2U7Ci19Ci0KLWgyLmxhcmdlCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLX0KLSAgICAgICAgCi1oMi5sYXJnZWJhbm5lcgotewotICAgICAgICBiYWNrZ3JvdW5kOiAjNmE4ZmJkOwotICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLX0KLQotaDMubGFyZ2UKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotfQotCi1oNC5sYXJnZSwgaDUubGFyZ2UsIGg2LmxhcmdlCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDBweAotfQotCi1kbC5sYXJnZQotewotfQotCi1kdC5sYXJnZQotewotfQotICAgICAgCi1kZC5sYXJnZQotewotfQotCi1wLmxhcmdlCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwcHgKLX0KLQotcC5sYXJnZW5vZGUKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDE1cHgKLSAgICAgICAgbGVmdE1hcmdpbjogMTVweAotfQotCi1wLmxhcmdlZXhhbXBsZWhlYWRpbmcKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICBtYXJnaW4tbGVmdDogMTVweAotfQotCi1wLmxhcmdlZXhhbXBsZQotewotCW1hcmdpbi1sZWZ0OiA3MHB4OwotfQotCi1wLmxhcmdlcGljdHVyZXRleHQKLXsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci0JZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4MCU7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiA3MHB4OwotICAgICAgICBtYXJnaW4tcmlnaHQ6IDUwcHgKLX0KLQotcC5sYXJnZWRlZmluaXRpb24KLXsKLQliYWNrZ3JvdW5kOiAjZmZmZmNjOwotCWJvcmRlcjogdGhpbiBkb3VibGUgYmxhY2sKLX0KLQotcC5sYXJnZXRhYmxlaGVhZGluZwotewotCWZvbnQtd2VpZ2h0OiBib2xkOwotICAgICAgICBtYXJnaW4tbGVmdDogMAotfQotCi1wLmxhcmdldGFibGV0ZXh0Ci17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwCi19Ci0KLXAubGFyZ2VwYXJhbW5hbWUKLXsKLSAgIHRleHQtYWxpZ246IGxlZnQKLX0KLQotcC5sYXJnZXBhcmFtZXhhbXBsZQotewotICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgIGNvbG9yOiByZWQKLX0KLQotcC5sYXJnZXBhcmFtZGVzY3JpcHRpb24KLXsKLSAgIHRleHQtYWxpZ246IGxlZnQKLX0KLQotb2wubGFyZ2UKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICs0NXB4Ci19Ci0KLW9sIG9sLmxhcmdlCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjNweAotfQotCi1vbCBvbCBvbC5sYXJnZQotewotICAgICAgICBtYXJnaW4tbGVmdDogKzIzcHgKLX0KLQotb2wubGFyZ2VhbHBoYQotewotCWxpc3Qtc3R5bGUtdHlwZTogbG93ZXItYWxwaGEKLX0KLQotCi0KLXVsIGxpLmxhcmdlCi17Ci0gICAgdGV4dC1pbmRlbnQ6ICsyMHB4OwotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCBsaS5sYXJnZQotewotICAgIHRleHQtaW5kZW50OiArMTBweDsKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgdWwgbGkubGFyZ2UKLXsKLSAgICB0ZXh0LWluZGVudDogKzEwcHg7Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi11bCBsaS5sYXJnZW5vZGUKLXsKLSAgICB0ZXh0LWluZGVudDogKzEwcHg7Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi11bCBsaS5sYXJnZWNrCi17Ci0gICAgdGV4dC1pbmRlbnQ6ICsxMHB4OwotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCBsaS5sYXJnZWNrCi17Ci0gICAgdGV4dC1pbmRlbnQ6ICsxMHB4OwotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCB1bCBsaS5sYXJnZWNrCi17Ci0gICAgdGV4dC1pbmRlbnQ6ICsxMHB4OwotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotdWwubGFyZ2VwbHVzCi17Ci0gICAgbGlzdC1zdHlsZS1pbWFnZTogCi19Ci0KLXVsLmxhcmdlbWludXMKLXsKLSAgICBsaXN0LXN0eWxlLWltYWdlOiAKLX0KLQotCi11bC5sYXJnZWNrCi17Ci19Ci0KLXRhYmxlLmxhcmdlCi17Ci19Ci0KLXRyLmxhcmdlCi17Ci19Ci0KLXRkLmxhcmdlCi17Ci0gICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3AKLX0KLQotdGQgdWwubGFyZ2UKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICsyMHB4Ci19Ci0KLWZvbnQubGFyZ2VwYXJhbWV4YW1wbGUKLXsKLSAgIGNvbG9yOiByZWQKLX0KLQotZm9udC5sYXJnZWltYWdlZXhhbXBsZQotewotICAgZm9udC1zaXplOiBzbWFsbGVyCi19Ci0KLXJwdwotewotICBjb2xvcjogIzAwMDA2NgotfQotCi1ycHcucHJvY2Vzc19jb21wb25lbnQKLXsKLSAgY29sb3I6IGdyZWVuCi19Ci0KLXJwdy5wcm9jZXNzX2NvbXBvbmVudC5yZW1vdmVfdGV4dAotewotICBjb2xvcjogZ3JlZW47Ci0gIGJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7Ci0gIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoCi19Ci0vKndhcyBjb2xvcjogI0ZGQ0M5OSovIAotCi1ycHcucmVtb3ZlX3RleHQKLXsKLSAgY29sb3I6IGdyZWVuOwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOwotICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaAotfQotCi1ycHcucGx1Z2luX3Byb2Nlc3NfY29tcG9uZW50Ci17Ci0gIGNvbG9yOiByZWQKLX0KLQotcnB3LnBsdWdpbl9yZW1vdmVfdGV4dAotewotICBjb2xvcjogcmVkOwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOwotICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaAotfQotCi1ycHcucnB3X2NvbW1lbnQKLXsKLSAgY29sb3I6IGdyYXk7Ci0gIGZvbnQtc3R5bGU6IG9ibGlxdWUKLX0KLQotCi1ycHcubXNmdAotewotICBjb2xvcjogYmx1ZQotfQotCi1ycHcuaWJtCi17Ci0gIGNvbG9yOiBibHVlCi19Ci0KLXJwdy5yZWFjdGl2ZQotewotICBjb2xvcjogcmVkCi19Ci0KLXJwdy5idXNtb2QKLXsKLSAgY29sb3I6IHJlZAotfQotCi1ycHcucnVwX3J0X2Rlc2lnbgotewotICBjb2xvcjogZ3JlZW4KLX0KLQotcnB3LnJ1cF9kYl9kZXNpZ24KLXsKLSAgY29sb3I6IGdyZWVuCi19Ci0KLXJwdy5ydXBfZ3VpX2Rlc2lnbgotewotICBjb2xvcjogZ3JlZW4KLX0KLQotLmhvdHRleHQKLXsJCi0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjpub25lOwotfQotYS5ob3R0ZXh0OmxpbmsgCi17IAotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjpub25lOyAKLX0KLQotYS5ob3R0ZXh0OnZpc2l0ZWQgCi17IAotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjpub25lOyAKLX0KLQotYS5ob3R0ZXh0OmhvdmVyIAoteyAKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246bm9uZTsgCi19Ci0KLWEuaG90dGV4dDphY3RpdmUKLXsgCi0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOm5vbmU7IAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NjcmlwdHMvY29tbW9uLmpzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NjcmlwdHMvY29tbW9uLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYzk0MzU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zY3JpcHRzL2NvbW1vbi5qcworKysgL2Rldi9udWxsCkBAIC0xLDUwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdmFyIGdsb2JhbExheWVyID0gIiI7Ci0KLS8vZm9yIHBvcHVwIHN1Ym1lbnUgd2l0aCByZWQgYXJyb3dzCi1hcnJvd09mZj1uZXcgSW1hZ2UoKTsKLWFycm93T2ZmLnNyYz0iaW1hZ2VzL3NoaW0uZ2lmIgotYXJyb3dPbj1uZXcgSW1hZ2UoKTsKLWFycm93T24uc3JjPSJpbWFnZXMvYXJyb3dfcmVkLmdpZiIgCi12YXIgY2hlY2tlZCA9IGZhbHNlOwotCi0KLQotLyogQnJvd3NlciBzZW5zaW5nICovCi0vKiBTZXQgdXAgYm9vbGlhbiB2YXJpYWJsZXMgdG8gcmVjb3JkIHRoZSBicm93c2VyIHR5cGUgKi8KLXZhciBpc05TNCA9IDA7Ci12YXIgaXNJRTQgPSAwOwotdmFyIGlzTmV3ID0gMDsKLXZhciBkb2NPYmosIHN0eWxlT2JqLCBjdXJyT2JqLCBsYXlPbiwgbGF5T2ZmLCBkb207Ci0vKiBEZXRlcm1pbmVzIHRoZSBicm93c2VyIG5hbWUgYW5kIGJyb3dzZXIgdmVyc2lvbiAqLwotdmFyIGJyb3cgPSAoKG5hdmlnYXRvci5hcHBOYW1lKSArIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikpKTsKLS8qIHJlYXNzaWduIHZhcmlhYmxlIGRlcGVuZGluZyBvbiB0aGUgYnJvd3NlciAqLwotCi0KLQotLy9jYXB0dXJlIGV2ZW50Ci1OUzQgPSAoZG9jdW1lbnQuY2FwdHVyZUV2ZW50cyk7Ci1pZiAoTlM0KSB7IGRvY3VtZW50LmNhcHR1cmVFdmVudHMoRXZlbnQuTU9VU0VET1dOKTsgfQotZG9jdW1lbnQub25tb3VzZWRvd24gPSBkb0FjY2Vzc0tleXM7CQotCi0KLQotaWYgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uID49IDUpKSB7aXNOZXcgPSAxfQotCWVsc2UgaWYgKGJyb3cgPT0gIk5ldHNjYXBlNCIpIAotCXtpc05TNCA9IDE7fQotCQllbHNlIGlmIChicm93ID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXI0IikgCi0JCXtpc0lFNCA9IDE7fQotCQkJCQotaWYgKGlzTlM0fHxpc0lFNHx8aXNOZXcpIHsKLQlkb2NPYmogPSAoaXNOUzQpID8gJ2RvY3VtZW50JyA6ICdkb2N1bWVudC5hbGwnOwotCXN0eWxlT2JqID0gKGlzTlM0KSA/ICcnIDogJy5zdHlsZSc7Ci0JfQotCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vU05JRkZFUiBCRUdJTlMgSEVSRS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdmFyIGM9Jy5jc3MiIC8+JzsKLXZhciBsPSc8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL3N0eWxlc2hlZXRzLyc7Ci0KLS8vU25pZmZlciB2YXJpYWJsZXMgYmVnaW5zCi0vL2NvbnZlcnRpbmcgdG8gbG93ZXJjYXNlCi12YXIgc25uID0gbmF2aWdhdG9yOwotdmFyIHNucGwgPSBzbm4ucGxhdGZvcm0udG9Mb3dlckNhc2UoKTsgLy8gbm90IHN1cHBvcnRlZCBpbiBOUzMuMAotdmFyIHNudWEgPSAnICcgKyBzbm4udXNlckFnZW50LnRvTG93ZXJDYXNlKCk7Ci12YXIgc251biA9IHNubi5hcHBOYW1lLnRvTG93ZXJDYXNlKCk7Ci0KLS8vIHBsYXRmb3JtCi12YXIgc252cGxfbWFjID0gc251YS5pbmRleE9mKCdtYWMnKSA+IDA7Ci12YXIgc252cGxfdW5peCA9IHNudWEuaW5kZXhPZigieDExIikgPiAwOwotdmFyIHNudnBsX3dpbiA9IHNudWEuaW5kZXhPZignd2luJykgPiAwOwotCi0vLyBicm93c2VyIHZlcnNpb24KLXZhciBzbnZ2X2llID0gc251YS5pbmRleE9mKCdtc2llJykgPiAwOwotdmFyIHNudnZfbm4gPSBzbnVhLmluZGV4T2YoJ21vemlsbGEnKSA+IDA7Ci12YXIgc252dmVyc2lvbiA9IHNubi5hcHBWZXJzaW9uOwotCi0KLS8vICdjb21wYXRpYmxlJyB2ZXJzaW9ucyBvZiAibW96aWxsYSIgYXJlbid0IG5hdmlnYXRvcgotaWYoc251YS5pbmRleE9mKCdjb21wYXRpYmxlJykgPiAwKSB7Ci0Jc25udnZfbm4gPSBmYWxzZTsKLX0KLS8vRW5kcyBzbmlmZmVyIHZhcmlhYmxlcyAKLQkKLQkJCi0vKiBUaGlzIGlzIGEgYmFzaWMgc25pZmZlciAqLwotICAKLWlmKHNudnBsX3dpbikvL3dpbmRvd3MKLQoteyAgCi0gIGlmKHNudnZfaWUpICAgIAotICB7Ci0gICAgaWYgKHNudWEuaW5kZXhPZignaWUgNScpIT0tMSlkb2N1bWVudC53cml0ZShsKydjb21tb25fYmFzZScrYyk7Ci0gICAgZWxzZSBpZihzbnVhLmluZGV4T2YoJ2llIDUuNScpIT0tMSlkb2N1bWVudC53cml0ZShsKydjb21tb25fYmFzZScrYyk7Ci0gICAgZWxzZSBpZihzbnVhLmluZGV4T2YoJ2llIDYnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdicrYyk7Ci0gICAgZWxzZQotCSAgewotCSAgICBkb2N1bWVudC53cml0ZShsKydjb21tb25fYWR2JytjKTsKLQkgIH0KLSAgfQotICBlbHNlIGlmIChzbnZ2X25uKSAKLSAgewotICAKLSAgaWYgKHNudWEuaW5kZXhPZigiLzQiKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2Jhc2UnK2MpOwotICBlbHNlIGlmKHNudWEuaW5kZXhPZigiLzUiKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdicrYyk7Ci0gIGVsc2UgaWYoc251YS5pbmRleE9mKCIvNiIpIT0tMSlkb2N1bWVudC53cml0ZShsKydjb21tb25fYWR2JytjKTsKLSAgZWxzZQotCSAgewotCSAgIGRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHYnK2MpOwotCSAgfQotICB9Ci0gIGVsc2UKLSAgewotICAgZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdicrYyk7Ci0gIH0KLX0KLWVsc2UgaWYoc252cGxfdW5peCkvL3VuaXgKLSAgeyAgCi0gIGlmKHNudnZfaWUpICAgIAotICB7Ci0gICAgaWYgKHNudWEuaW5kZXhPZignaWUgNScpIT0tMSlkb2N1bWVudC53cml0ZShsKydjb21tb25fYmFzZVVOWCcrYyk7Ci0gICAgZWxzZSBpZihzbnVhLmluZGV4T2YoJ2llIDUuNScpIT0tMSlkb2N1bWVudC53cml0ZShsKydjb21tb25fYmFzZVVOWCcrYyk7Ci0gICAgZWxzZSBpZihzbnVhLmluZGV4T2YoJ2llIDYnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdlVOWCcrYyk7Ci0gICAgZWxzZQotCSAgewotCSAgZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdicrYyk7Ci0JICB9Ci0gIH0KLQotICBlbHNlIGlmIChzbnZ2X25uKSAKLSAgewotICBpZiAoc251YS5pbmRleE9mKCIvNCIpIT0tMSlkb2N1bWVudC53cml0ZShsKydjb21tb25fYmFzZVVOWCcrYyk7Ci0gIGVsc2UgaWYoc251YS5pbmRleE9mKCIvNSIpIT0tMSlkb2N1bWVudC53cml0ZShsKydjb21tb25fYWR2VU5YJytjKTsKLSAgZWxzZSBpZihzbnVhLmluZGV4T2YoIi82IikhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHZVTlgnK2MpOwotICBlbHNlCi0JICB7Ci0JICBkb2N1bWVudC53cml0ZShsKydjb21tb25fYWR2VU5YJytjKTsKLQkgIH0KLSAgfSAKLSAgZWxzZQotICB7Ci0gIGRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHZVTlgnK2MpOwotICB9Ci19Ci0KLWVsc2UgaWYoc252cGxfbWFjKS8vbWFjCi0gIHsgIAotICBpZihzbnZ2X2llKSAgICAKLSAgewotICAgIGlmIChzbnVhLmluZGV4T2YoJ2llIDUnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2Jhc2UnK2MpOwotICAgIGVsc2UgaWYoc251YS5pbmRleE9mKCdpZSA1LjUnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2Jhc2UnK2MpOwotICAgIGVsc2UgaWYoc251YS5pbmRleE9mKCdpZSA2JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHYnK2MpOwotICAgIGVsc2UKLQkgIHsKLQkgICBkb2N1bWVudC53cml0ZShsKydjb21tb25fYWR2JytjKTsKLQkgIH0KLSAgfQotCi0gIGVsc2UgaWYgKHNudnZfbm4pIAotICB7Ci0gIGlmIChzbnVhLmluZGV4T2YoIi80IikhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9iYXNlJytjKTsKLSAgZWxzZSBpZihzbnVhLmluZGV4T2YoIi82IikhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHZNYWMnK2MpOwotICBlbHNlCi0JICB7Ci0JICAgZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdicrYyk7Ci0JICB9Ci0gIH0gCi0gIGVsc2UKLSAgewotIGRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHYnK2MpOwotICB9Ci19Ci0KLWVsc2UvL290aGVycyAKLXsKLSAgZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdicrYyk7Ci0KLX0KLQotLy9TTklGRkVSIEVORFMgSEVSRQotCi0KLWZ1bmN0aW9uIG5zX3JlbG9hZChpbml0KSB7ICAvL3JlbG9hZHMgdGhlIHdpbmRvdyBpZiBOYXY0IHJlc2l6ZWQKLSAgaWYgKGluaXQ9PXRydWUpIHdpdGggKG5hdmlnYXRvcikge2lmICgoYXBwTmFtZT09Ik5ldHNjYXBlIikmJihwYXJzZUludChhcHBWZXJzaW9uKT09NCkpIHsKLSAgICBkb2N1bWVudC5OU1c9aW5uZXJXaWR0aDsgZG9jdW1lbnQuTlNIPWlubmVySGVpZ2h0OyBvbnJlc2l6ZT1uc19yZWxvYWQ7IH19Ci0gIGVsc2UgaWYgKGlubmVyV2lkdGghPWRvY3VtZW50Lk5TVyB8fCBpbm5lckhlaWdodCE9ZG9jdW1lbnQuTlNIKSBsb2NhdGlvbi5yZWxvYWQoKTsKLX0KLW5zX3JlbG9hZCh0cnVlKTsKLQotCi0KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1NOSUZGRVIgRU5EUyBIRVJFLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQotLy9sb29wIHRvIGNoYW5nZSBiYWNrZ3JvdW5kIGNvbG9yIGZvciBpZQotZnVuY3Rpb24gYmNvbG9yKGJjb2wsZF9uYW1lKQotewotaWYgKGRvY3VtZW50LmFsbCkKLXsKLSB2YXIgdGhlc3R5bGU9IGV2YWwgKCdkb2N1bWVudC5hbGwuJytkX25hbWUrJy5zdHlsZScpOwotIHRoZXN0eWxlLmJhY2tncm91bmRDb2xvcj1iY29sOwotIH0KLX0KLQotLy8gbmV3IHBhZ2UgdG8gbG9hZCBpbiBmcmFtZQotZnVuY3Rpb24gY2hhbmdlZnJhbWUodXJsKSB7Ci10b3AuY2hlY2tpbmJvdHRvbS5sb2NhdGlvbi5ocmVmPSB1cmwgCi19Ci0KLS8vIGNoZWNrZWQgYWxsIGNoZWNrYm94ZXMKLWZ1bmN0aW9uIGNoZWNrQWxsKGZpZWxkKSB7Ci0gICAgIGlmICghY2hlY2tlZCkgeyAvLyBpZiBjaGVja2JveGVzIGFyZSBub3QgY2hlY2tlZCB0aGVuIGNoZWNrIHRoZW0KLSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmllbGQubGVuZ3RoOyBpKyspIHsgLy8gbG9vcCB0aHJvdWdoIHRoZSBhcnJheSBvZiBjaGVja2JveGVzICYgY2hlY2sgdGhlbQotICAgICAgICAgICAgICAgZmllbGRbaV0uY2hlY2tlZCA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNoZWNrZWQgPSB0cnVlOwotICAgICB9Ci19IAotCi1mdW5jdGlvbiBjaGVja2VkSW4oaWQpIHsKLSAgaWYgKGRvY3VtZW50LmFsbCkgewotICAgIHJldHVybiBkb2N1bWVudC5hbGxbaWRdLnN0eWxlOwotICB9IGVsc2UgaWYoZG9jdW1lbnQubGF5ZXJzKSB7Ci0gICAgcmV0dXJuIGRvY3VtZW50LmxheWVyc1tpZF07Ci0gIH0KLX0KLQotLy8gRm9yIElFIE9ubHk6IHRvIGVuYWJsZSBsaW5raW5nIGJlZm9yZSBwb3AtdXBzIGRpc3NhcHBlYXIgd2hlbiBjbGlja2VkLgotZnVuY3Rpb24gZGlzYWJsZWNhcHR1cmUoKSB7Ci1kb2N1bWVudC5vbm1vdXNlZG93biA9IG51bGw7Ci19Ci0KLQotLy8gaGlkZSBsYXllcnMgd2hlbiBjbGlja2VkCi1mdW5jdGlvbiBkb0FjY2Vzc0tleXMoZXYpIHsKLQlpZihnbG9iYWxMYXllciAhPSAiIikgewotCQlpZihkb2N1bWVudC5sYXllcnMpIHsgZG9jdW1lbnQubGF5ZXJzW2dsb2JhbExheWVyXS52aXNpYmlsaXR5ID0gImhpZGRlbiI7IH0JCi0JCWVsc2UgeyBkb2N1bWVudC5hbGxbZ2xvYmFsTGF5ZXJdLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsgfQotCX0KLX0KLQotCi0KLS8vYWxsb3dzIHR3byBib3R0b20gZnJhbWVzIHRvIGxpbmsgdG8gbmV3IHBhZ2VzIGF0IHRoZSBzYW1lIHRpbWUKLWZ1bmN0aW9uIGZyYW1lZGlyZWN0KCkgewotcGFnZSA9IGRvY3VtZW50LmZvcm1Ub3BmcmFtZS5uZXdMb2NhdGlvbi5vcHRpb25zW2RvY3VtZW50LmZvcm1Ub3BmcmFtZS5uZXdMb2NhdGlvbi5zZWxlY3RlZEluZGV4XS52YWx1ZTsKLXRlbXBJbmRleCA9IHBhZ2UuaW5kZXhPZignPycpOwotZmlyc3RVUkwgPSBwYWdlLnN1YnN0cmluZygwLHRlbXBJbmRleCk7Ci1zZWNvbmRVUkwgPSBwYWdlLnN1YnN0cmluZyh0ZW1wSW5kZXggKyAxLHBhZ2UubGVuZ3RoKTsKLQotdG9wLnRyZWVGcmFtZS5sb2NhdGlvbi5ocmVmID0gZmlyc3RVUkw7Ci10b3Audmlld0ZyYW1lLmxvY2F0aW9uLmhyZWYgPSBzZWNvbmRVUkw7Ci19Ci0KLQotZnVuY3Rpb24gTU1fcmVsb2FkUGFnZShpbml0KSB7ICAvL3JlbG9hZHMgdGhlIHdpbmRvdyBpZiBOYXY0IHJlc2l6ZWQKLSAgaWYgKGluaXQ9PXRydWUpIHdpdGggKG5hdmlnYXRvcikge2lmICgoYXBwTmFtZT09Ik5ldHNjYXBlIikmJihwYXJzZUludChhcHBWZXJzaW9uKT09NCkpIHsKLSAgICBkb2N1bWVudC5NTV9wZ1c9aW5uZXJXaWR0aDsgZG9jdW1lbnQuTU1fcGdIPWlubmVySGVpZ2h0OyBvbnJlc2l6ZT1NTV9yZWxvYWRQYWdlOyB9fQotICBlbHNlIGlmIChpbm5lcldpZHRoIT1kb2N1bWVudC5NTV9wZ1cgfHwgaW5uZXJIZWlnaHQhPWRvY3VtZW50Lk1NX3BnSCkgbG9jYXRpb24ucmVsb2FkKCk7Ci19Ci1NTV9yZWxvYWRQYWdlKHRydWUpOwotCi0KLWZ1bmN0aW9uIE1NX2ZpbmRPYmoobiwgZCkgeyAvL3Y0LjAxCi0gIHZhciBwLGkseDsgIGlmKCFkKSBkPWRvY3VtZW50OyBpZigocD1uLmluZGV4T2YoIj8iKSk+MCYmcGFyZW50LmZyYW1lcy5sZW5ndGgpIHsKLSAgICBkPXBhcmVudC5mcmFtZXNbbi5zdWJzdHJpbmcocCsxKV0uZG9jdW1lbnQ7IG49bi5zdWJzdHJpbmcoMCxwKTt9Ci0gIGlmKCEoeD1kW25dKSYmZC5hbGwpIHg9ZC5hbGxbbl07IGZvciAoaT0wOyF4JiZpPGQuZm9ybXMubGVuZ3RoO2krKykgeD1kLmZvcm1zW2ldW25dOwotICBmb3IoaT0wOyF4JiZkLmxheWVycyYmaTxkLmxheWVycy5sZW5ndGg7aSsrKSB4PU1NX2ZpbmRPYmoobixkLmxheWVyc1tpXS5kb2N1bWVudCk7Ci0gIGlmKCF4ICYmIGQuZ2V0RWxlbWVudEJ5SWQpIHg9ZC5nZXRFbGVtZW50QnlJZChuKTsgcmV0dXJuIHg7Ci19Ci0KLWZ1bmN0aW9uIE1NX2dvVG9VUkwoKSB7IC8vdjMuMAotICB2YXIgaSwgYXJncz1NTV9nb1RvVVJMLmFyZ3VtZW50czsgZG9jdW1lbnQuTU1fcmV0dXJuVmFsdWUgPSBmYWxzZTsKLSAgZm9yIChpPTA7IGk8KGFyZ3MubGVuZ3RoLTEpOyBpKz0yKSBldmFsKGFyZ3NbaV0rIi5sb2NhdGlvbj0nIithcmdzW2krMV0rIiciKTsKLX0KLQotCi1mdW5jdGlvbiBNTV9wcmVsb2FkSW1hZ2VzKCkgeyAvL3YzLjAKLSAgdmFyIGQ9ZG9jdW1lbnQ7IGlmKGQuaW1hZ2VzKXsgaWYoIWQuTU1fcCkgZC5NTV9wPW5ldyBBcnJheSgpOwotICAgIHZhciBpLGo9ZC5NTV9wLmxlbmd0aCxhPU1NX3ByZWxvYWRJbWFnZXMuYXJndW1lbnRzOyBmb3IoaT0wOyBpPGEubGVuZ3RoOyBpKyspCi0gICAgaWYgKGFbaV0uaW5kZXhPZigiIyIpIT0wKXsgZC5NTV9wW2pdPW5ldyBJbWFnZTsgZC5NTV9wW2orK10uc3JjPWFbaV07fX0KLX0KLQotCi1mdW5jdGlvbiBNTV9zd2FwSW1hZ2UoKSB7IC8vdjMuMAotICB2YXIgaSxqPTAseCxhPU1NX3N3YXBJbWFnZS5hcmd1bWVudHM7IGRvY3VtZW50Lk1NX3NyPW5ldyBBcnJheTsgZm9yKGk9MDtpPChhLmxlbmd0aC0yKTtpKz0zKQotICAgaWYgKCh4PU1NX2ZpbmRPYmooYVtpXSkpIT1udWxsKXtkb2N1bWVudC5NTV9zcltqKytdPXg7IGlmKCF4Lm9TcmMpIHgub1NyYz14LnNyYzsgeC5zcmM9YVtpKzJdO30KLX0KLQotCi1mdW5jdGlvbiBNTV9vcGVuQnJXaW5kb3codGhlVVJMLHdpbk5hbWUsZmVhdHVyZXMpIHsgLy92Mi4wCi0gIHdpbmRvdy5vcGVuKHRoZVVSTCx3aW5OYW1lLGZlYXR1cmVzKTsKLX0KLQotCi0KLWZ1bmN0aW9uIE1NX3Nob3dIaWRlTGF5ZXJzKCkgeyAvL3YzLjAKLSAgdmFyIGkscCx2LG9iaixhcmdzPU1NX3Nob3dIaWRlTGF5ZXJzLmFyZ3VtZW50czsKLSAgZm9yIChpPTA7IGk8KGFyZ3MubGVuZ3RoLTIpOyBpKz0zKSBpZiAoKG9iaj1NTV9maW5kT2JqKGFyZ3NbaV0pKSE9bnVsbCkgeyB2PWFyZ3NbaSsyXTsKLSAgICBpZiAob2JqLnN0eWxlKSB7IG9iaj1vYmouc3R5bGU7IHY9KHY9PSdzaG93Jyk/J3Zpc2libGUnOih2PSdoaWRlJyk/J2hpZGRlbic6djsgfQotICAgIG9iai52aXNpYmlsaXR5PXY7IH0KLX0KLQotCi1mdW5jdGlvbiBtc2NoYW5nZWZyYW1lKHVybCkgewotdG9wLmNvbnRlbnRGcmFtZS5sb2NhdGlvbi5ocmVmPSB1cmwgCi19Ci0KLS8vY2hhbmdlcyBtaWRkbGUgbmF2IGFuZCBjb250ZW50IGZyYW1lLCBjdXJyZW50bHkgdXNlZCBpbiBtdWx0aXNpdGUKLWZ1bmN0aW9uIE1TZnJhbWVDaGFuZ2UoKSB7Ci1wYWdlID0gZG9jdW1lbnQuZm9ybUJhbm5lckZyYW1lLm5ld0xvY2F0aW9uLm9wdGlvbnNbZG9jdW1lbnQuZm9ybUJhbm5lckZyYW1lLm5ld0xvY2F0aW9uLnNlbGVjdGVkSW5kZXhdLnZhbHVlOwotdGVtcEluZGV4ID0gcGFnZS5pbmRleE9mKCc/Jyk7Ci1maXJzdFVSTCA9IHBhZ2Uuc3Vic3RyaW5nKDAsdGVtcEluZGV4KTsKLXNlY29uZFVSTCA9IHBhZ2Uuc3Vic3RyaW5nKHRlbXBJbmRleCArIDEscGFnZS5sZW5ndGgpOwotCi10b3AubWlkZGxlTmF2LmxvY2F0aW9uLmhyZWYgPSBmaXJzdFVSTDsKLXRvcC5jb250ZW50RnJhbWUubG9jYXRpb24uaHJlZiA9IHNlY29uZFVSTDsKLX0KLQotCi0KLS8vb3BlbnMgdXAgYSBkeW5hbWljIHdpbmRvdwotZnVuY3Rpb24gb3Blbl9oZWxwKGhlbHBmaWxlKSB7Ci0gICAgdmFyIHdpbmxlZnQsIHdpbnRvcDsKLSAgICB2YXIgaGVscGxlZnQsIGhlbHB0b3A7Ci0gICAgdmFyIGhlbHB3aWR0aCwgaGVscGhlaWdodDsKLSAgICBpZiAoZG9jdW1lbnQubGF5ZXJzKSB7Ci0gICAgICAgIHdpbmxlZnQgPSB0b3Auc2NyZWVuWDsKLSAgICAgICAgd2ludG9wID0gdG9wLnNjcmVlblk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICB3aW5sZWZ0ID0gdG9wLnNjcmVlbkxlZnQ7Ci0gICAgICAgIHdpbnRvcCA9IHRvcC5zY3JlZW5Ub3A7Ci0gICAgfQotICAgIGhlbHB3aWR0aCA9IE1hdGgubWluKHNjcmVlbi5hdmFpbFdpZHRoKTsKLSAgICBoZWxwaGVpZ2h0ID0gTWF0aC5taW4oc2NyZWVuLmF2YWlsSGVpZ2h0KTsKLSAJaGVscHdpZHRoPWhlbHB3aWR0aCAqLjY7Ci0JaGVscGhlaWdodD1oZWxwaGVpZ2h0ICouODU7CQotCWhlbHB0b3AgPSAwOwotICAgIGlmICh3aW5sZWZ0ID4gMjApCi0gICAgICAgIGhlbHBsZWZ0ID0gMDsKLSAgICBlbHNlCi0gICAgICAgIGhlbHBsZWZ0ID0gc2NyZWVuLndpZHRoIC0gaGVscHdpZHRoIC0gMTA7Ci0gICAgdG9wLm9wZW4oaGVscGZpbGUsICdjY3dlYl9oZWxwJywKLSAgICAgICAgICAgICAnbGVmdD0nK2hlbHBsZWZ0KycsdG9wPScraGVscHRvcCsnLHdpZHRoPScraGVscHdpZHRoKycsaGVpZ2h0PScraGVscGhlaWdodCsnLHJlc2l6YWJsZT0xLHNjcm9sbGJhcnM9MScpOwotfQotCi0KLQotLy8gcmVndWxhciBwb3B1cCB1cCBsYXllciBhY2NvcmRpbmcgdG8gZXZlbnQKLWZ1bmN0aW9uIHBvcExlZnRNZW51KGV2dCxjdXJyRWxlbSx1cENoayl7Ci0JLy8gY2hlY2tzIHRvIHNlZSBpZiB0aGlzIGlzIGEgREhUTUwgYnJvd3NlciAKLQkvLyBhbmQgdGhhdCBjdXJyRWxlbSBpcyBub3Qgc2V0IHRvIDAgaW4gd2hpY2ggY2FzZSAKLQkvLyB0aGlzIHdhcyB0cmlnZ2VyZWQgYnkgdGhlIEhSRUYgYW5kIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGFuIGV2ZW50Ci0JLy91cENoayBzaG91bGQgYmUgc2V0IHRvIDEgZm9yIE5TIDQgZm9ybSBmaXggaWYgeW91IHdhbnQgdGhlIHBvcGRvd24gdG8gcG9wIHVwIGluc3RlYWQsIHNvIHRoYXQgaXQgZG9lc24ndCBhcHBlYXIgb3ZlciBmb3Jtcy4JCi0JZ2xvYmFsTGF5ZXIgPSBjdXJyRWxlbTsKLQkKLQlpZiAoKGlzTlM0ICYmIGN1cnJFbGVtICE9IDApIHx8IChpc0lFNCAmJiBjdXJyRWxlbSAhPSAwKSl7Ci0JCWRvbSA9IGV2YWwoZG9jT2JqICsgICcuJyArIGN1cnJFbGVtICsgc3R5bGVPYmopOwotCQlzdGF0ZSA9IGRvbS52aXNpYmlsaXR5OwotCQlpZiAoc3RhdGUgPT0gInZpc2libGUiIHx8IHN0YXRlID09ICJzaG93IikKLQkJCXtkb20udmlzaWJpbGl0eSA9ICJoaWRkZW4iO30KLQkJCWVsc2UgCi0JCQkvLyBmaW5kcyB0aGUgcG9zaXRpb24gb2YgdGhlIG1vdXNlIAotCQkJLy8gYW5kIHRoZW4gb2Zmc2V0cyB0aGUgY29vcmRpbmF0ZXMgc2xpZ2h0bHkKLQkJCQl7Ci0JCWlmIChpc05TNCl7Ci0JCQkJIGlmICgodXBDaGsgPT0gMSkgJiYgKHdpbmRvdy5pbm5lcldpZHRoIDwgNjcwKSkgewotCQkJdG9wVmFsID0gZXZhbChldnQucGFnZVkgLSA1MCk7Ci0JCQlsZWZ0VmFsID0gZXZhbChldnQucGFnZVggLSA5KTsKLQkJCX0JCQkJICAKLQkJCQllbHNlIHsKLQkJCQl0b3BWYWwgPSBldmFsKGV2dC5wYWdlWSAtIDApOwotCQkJCWxlZnRWYWwgPSBldmFsKGV2dC5wYWdlWCAtIDApOwotCQkJCX0KLQkJfQkJCi0JCQllbHNlIGlmIChpc0lFNCkgewotCQkJCXsKLQkJCQl0b3BWYWwgPSBldmFsKGV2ZW50LnkrZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgLSAwKTsKLQkJCQlsZWZ0VmFsID0gZXZhbChldmVudC54K2RvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCAtIDApOwotCQkJCS8vYm90dG9tVmFsID0gZXZhbChldmVudC55K2RvY3VtZW50LmJvZHkuc2Nyb2xsQm90dG9tICsgMik7Ci0JCQkJfQotCQkJICAgIH0KLQkJCS8vIGtlZXBzIHRoZSBlbGVtZW50IGZyb20gZ29pbmcgb2ZmIHNjcmVlbiB0byB0aGUgbGVmdAotCQkJaWYobGVmdFZhbCA8IDIpIHtsZWZ0VmFsID0gMjt9Ci0JCQlpZih0b3BWYWwgPCAyKSB7dG9wVmFsID0gLTU7fQkJCQkKLQkJCWRvbS50b3AgPSB0b3BWYWw7Ci0JCQlkb20ubGVmdCA9IGxlZnRWYWw7Ci0JCQlkb20udmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsJCQkJCQotCQkJCX0KLQl9IAotCi19Ci0KLQotCi0vLyBzcGVjaWFsIHB1cHVwIGxheWVyIHRvIGtlZXAgaXQgZnJvbSBnb2luZyBvZmYgdGhlIHBhZ2UKLQotZnVuY3Rpb24gcG9wTGVmdE1lbnVTcGVjaWFsKGV2dCxjdXJyRWxlbSl7Ci0JLy8gY2hlY2tzIHRvIHNlZSBpZiB0aGlzIGlzIGEgREhUTUwgYnJvd3NlciAKLQkvLyBhbmQgdGhhdCBjdXJyRWxlbSBpcyBub3Qgc2V0IHRvIDAgaW4gd2hpY2ggY2FzZSAKLQkvLyB0aGlzIHdhcyB0cmlnZ2VyZWQgYnkgdGhlIEhSRUYgYW5kIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGFuIGV2ZW50Ci0JLy91cENoayBzaG91bGQgYmUgc2V0IHRvIDEgZm9yIE5TIDQgZm9ybSBmaXggaWYgeW91IHdhbnQgdGhlIHBvcGRvd24gdG8gcG9wIHVwIGluc3RlYWQsIHNvIHRoYXQgaXQgZG9lc24ndCBhcHBlYXIgb3ZlciBmb3Jtcy4JCi0JZ2xvYmFsTGF5ZXIgPSBjdXJyRWxlbTsKLQkKLQlpZiAoKGlzTlM0ICYmIGN1cnJFbGVtICE9IDApIHx8IChpc0lFNCAmJiBjdXJyRWxlbSAhPSAwKSl7Ci0JCWRvbSA9IGV2YWwoZG9jT2JqICsgICcuJyArIGN1cnJFbGVtICsgc3R5bGVPYmopOwotCQlzdGF0ZSA9IGRvbS52aXNpYmlsaXR5OwotCQlpZiAoc3RhdGUgPT0gInZpc2libGUiIHx8IHN0YXRlID09ICJzaG93IikKLQkJCXtkb20udmlzaWJpbGl0eSA9ICJoaWRkZW4iO30KLQkJCWVsc2UgCi0JCQkvLyBmaW5kcyB0aGUgcG9zaXRpb24gb2YgdGhlIG1vdXNlIAotCQkJLy8gYW5kIHRoZW4gb2Zmc2V0cyB0aGUgY29vcmRpbmF0ZXMgc2xpZ2h0bHkKLQkJCQl7Ci0JCWlmIChpc05TNCl7Ci0JCQkgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDwgNjAwKSB7Ci0JCQl0b3BWYWwgPSBldmFsKGV2dC5wYWdlWSAtIDApOwotCQkJbGVmdFZhbCA9IGV2YWwoZXZ0LnBhZ2VYIC0gMTEwKTsKLQkJCX0JCQotCQkJCQotCQkJCWVsc2UgewotCQkJCXRvcFZhbCA9IGV2YWwoZXZ0LnBhZ2VZIC0gMCk7Ci0JCQkJbGVmdFZhbCA9IGV2YWwoZXZ0LnBhZ2VYIC0gMCk7Ci0JCQkJfQotCQl9CQkKLQkJCWVsc2UgaWYgKGlzSUU0KSB7Ci0JCQkJaWYgKGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggPCA2MDApIHsKLQkJCQkgIHRvcFZhbCA9IGV2YWwoZXZlbnQueStkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCAtIDApOwotCQkJCWxlZnRWYWwgPSBldmFsKGV2ZW50LngrZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0IC0gMTEwKTsKLQkJCQl9Ci0JCQkJCi0JCQkJZWxzZXsKLQkJCQl0b3BWYWwgPSBldmFsKGV2ZW50LnkrZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgLSAwKTsKLQkJCQlsZWZ0VmFsID0gZXZhbChldmVudC54K2RvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCAtIDApOwotCQkJCS8vYm90dG9tVmFsID0gZXZhbChldmVudC55K2RvY3VtZW50LmJvZHkuc2Nyb2xsQm90dG9tICsgMik7Ci0JCQkJfQotCQkJICAgIH0KLQkJCS8vIGtlZXBzIHRoZSBlbGVtZW50IGZyb20gZ29pbmcgb2ZmIHNjcmVlbiB0byB0aGUgbGVmdAotCQkJaWYobGVmdFZhbCA8IDIpIHtsZWZ0VmFsID0gMjt9Ci0JCQlpZih0b3BWYWwgPCAyKSB7dG9wVmFsID0gLTU7fQkJCQkKLQkJCWRvbS50b3AgPSB0b3BWYWw7Ci0JCQlkb20ubGVmdCA9IGxlZnRWYWw7Ci0JCQlkb20udmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsJCQkJCQotCQkJCX0KLQl9IAotCQkKLX0KLQotCi0KLQotZnVuY3Rpb24gc2VhcmNoT3B0aW9ucyhuZXdMb2MpIHsgLy9PcGVucyBuZXcgcGFnZSBpbiB0aGUgcmlnaHQgZnJhbWUgZGVwZW5kaW5nIG9uIHRoZSAiQWR2YW5jZWQgU2VhcmNoIGZvcjoiIHNlbGVjdGlvbgotCQkJbmV3UGFnZSA9IG5ld0xvYy5vcHRpb25zW25ld0xvYy5zZWxlY3RlZEluZGV4XS52YWx1ZQotCQotCQkJaWYgKG5ld1BhZ2UgIT0gIiIpIHsKLQkJCQlwYXJlbnQudmlld0ZyYW1lLmxvY2F0aW9uLmhyZWYgPSBuZXdQYWdlCi0JCQl9Ci0JCX0KLQotCi0vL3VuY2hlY2sgY2hlY2tib3hlcwotZnVuY3Rpb24gdW5jaGVja0FsbChmaWVsZCkgewotICAgICBpZiAoY2hlY2tlZCkgeyAvLyBpZiBjaGVja2JveGVzIGFyZSBjaGVja2VkIHRoZW4gY2hlY2sgdGhlbQotICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWVsZC5sZW5ndGg7IGkrKykgeyAvLyBsb29wIHRocm91Z2ggdGhlIGFycmF5IG9mIGNoZWNrYm94ZXMgJiB1bmNoZWNrIHRoZW0KLSAgICAgICAgICAgICAgIGZpZWxkW2ldLmNoZWNrZWQgPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2hlY2tlZCA9IGZhbHNlOwotICAgICB9Ci19IAotCi0vLyBzaG93IGhpZGUgbGF5ZXJzIGZvciBDUSBkZWZsZWN0X2xvZ2luX2VycgotbnM0ID0gKGRvY3VtZW50LmxheWVycyk/IHRydWU6ZmFsc2UKLWllNCA9IChkb2N1bWVudC5hbGwpPyB0cnVlOmZhbHNlCi0KLWZ1bmN0aW9uIHNob3coaWQpIHsKLWlmIChuczQpIGRvY3VtZW50LmxheWVyc1tpZF0udmlzaWJpbGl0eSA9ICJzaG93IgotaWYgKGllNCkgZG9jdW1lbnQuYWxsW2lkXS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiCi19Ci0KLWZ1bmN0aW9uIGhpZGUoaWQpIHsKLWlmIChuczQpIGRvY3VtZW50LmxheWVyc1tpZF0udmlzaWJpbGl0eSA9ICJoaWRlIgotaWYgKGllNCkgZG9jdW1lbnQuYWxsW2lkXS5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiIKLX0KLQotLy8gcG9wIHVwIHdpbmRvdyBhY2NvcmRpbmcgdG8gbW91c2UgZXZlbnQKLWZ1bmN0aW9uIHNob3dXaW5kb3coZSx1cmwpIHsKLSAgICB2YXIgeD15PTA7Ci0JCi0JaWYgKGUgIT0gJycpIHsKLSAgICAgICAgeCA9IGUuc2NyZWVuWDsKLSAgICAgICAgeSA9IGUuc2NyZWVuWTsKLSAgICB9Ci0KLSAgICBteVdpbmRvdz13aW5kb3cub3Blbih1cmwsJ3dpbmRvd05hbWUnLCd3aWR0aD0yMDAsaGVpZ2h0PTE1MCxzY3JlZW5YPScgKyB4ICsgJyxzY3JlZW5ZPScgKyB5ICsgJyxsZWZ0PScgKyB4ICsgJyx0b3A9JyArIHkpOwotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zY3JpcHRzL3NjcmlwdHMuanMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2NyaXB0cy9zY3JpcHRzLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ODZlZDM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zY3JpcHRzL3NjcmlwdHMuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZhciBjPScuY3NzIiAvPic7Ci12YXIgbD0nPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj1cIi4vc3R5bGVzaGVldHMvJzsKLQotLy9TbmlmZmVyIHZhcmlhYmxlcyBiZWdpbnMKLS8vY29udmVydGluZyB0byBsb3dlcmNhc2UKLXZhciBzbm4gPSBuYXZpZ2F0b3I7Ci12YXIgc25wbCA9IHNubi5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpOyAvLyBub3Qgc3VwcG9ydGVkIGluIE5TMy4wCi12YXIgc251YSA9ICcgJyArIHNubi51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsKLXZhciBzbnVuID0gc25uLmFwcE5hbWUudG9Mb3dlckNhc2UoKTsKLQotLy8gcGxhdGZvcm0KLXZhciBzbnZwbF9tYWMgPSBzbnVhLmluZGV4T2YoJ21hYycpID4gMDsKLXZhciBzbnZwbF91bml4ID0gc251YS5pbmRleE9mKCJ4MTEiKSA+IDA7Ci12YXIgc252cGxfd2luID0gc251YS5pbmRleE9mKCd3aW4nKSA+IDA7Ci0KLS8vIGJyb3dzZXIgdmVyc2lvbgotdmFyIHNudnZfaWUgPSBzbnVhLmluZGV4T2YoJ21zaWUnKSA+IDA7Ci12YXIgc252dl9ubiA9IHNudWEuaW5kZXhPZignbW96aWxsYScpID4gMDsKLXZhciBzbnZ2ZXJzaW9uID0gc25uLmFwcFZlcnNpb247Ci0KLQotLy8gJ2NvbXBhdGlibGUnIHZlcnNpb25zIG9mICJtb3ppbGxhIiBhcmVuJ3QgbmF2aWdhdG9yCi1pZihzbnVhLmluZGV4T2YoJ2NvbXBhdGlibGUnKSA+IDApIHsKLQlzbm52dl9ubiA9IGZhbHNlOwotfQotLy9FbmRzIHNuaWZmZXIgdmFyaWFibGVzIAotCQotCQkKLS8qIFRoaXMgaXMgYSBiYXNpYyBzbmlmZmVyICovCi0gIAotaWYoc252cGxfd2luKS8vd2luZG93cwotCi17ICAKLSAgaWYoc252dl9pZSkgICAgCi0gIHsKLSAgICBpZiAoc251YS5pbmRleE9mKCdpZSA1JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbicrYyk7Ci0gICAgZWxzZSBpZihzbnVhLmluZGV4T2YoJ2llIDUuNScpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ24nK2MpOwotICAgIGVsc2UgaWYoc251YS5pbmRleE9mKCdpZSA2JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbicrYyk7Ci0gICAgZWxzZQotCSAgewotCSAgIGRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbicrYyk7Ci0JICB9Ci0gIH0KLSAgZWxzZSBpZiAoc252dl9ubikgCi0gIHsKLSAgCi0gIGlmIChzbnVhLmluZGV4T2YoIi80IikhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbl9ucycrYyk7Ci0gIGVsc2UgaWYoc251YS5pbmRleE9mKCIvNSIpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ25fbnMnK2MpOwotICBlbHNlIGlmKHNudWEuaW5kZXhPZigiLzYiKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnZGVzaWduX25zJytjKTsKLSAgZWxzZQotCSAgewotCSAgIGRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbl9ucycrYyk7Ci0JICB9Ci0gIH0KLSAgZWxzZQotICB7Ci0gICBkb2N1bWVudC53cml0ZShsKydkZXNpZ24nK2MpOwotICB9Ci19Ci1lbHNlIGlmKHNudnBsX3VuaXgpLy91bml4Ci0gIHsgIAotICBpZihzbnZ2X2llKSAgICAKLSAgewotICAgIGlmIChzbnVhLmluZGV4T2YoJ2llIDUnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnZGVzaWduJytjKTsKLSAgICBlbHNlIGlmKHNudWEuaW5kZXhPZignaWUgNS41JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbicrYyk7Ci0gICAgZWxzZSBpZihzbnVhLmluZGV4T2YoJ2llIDYnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnZGVzaWduJytjKTsKLSAgICBlbHNlCi0JICB7Ci0JICBkb2N1bWVudC53cml0ZShsKydkZXNpZ24nK2MpOwotCSAgfQotICB9Ci0KLSAgZWxzZSBpZiAoc252dl9ubikgCi0gIHsKLSAgaWYgKHNudWEuaW5kZXhPZigiLzQiKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnZGVzaWduX25zJytjKTsKLSAgZWxzZSBpZihzbnVhLmluZGV4T2YoIi81IikhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbl9ucycrYyk7Ci0gIGVsc2UgaWYoc251YS5pbmRleE9mKCIvNiIpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ25fbnMnK2MpOwotICBlbHNlCi0JICB7Ci0JICBkb2N1bWVudC53cml0ZShsKydkZXNpZ25fbnMnK2MpOwotCSAgfQotICB9IAotICBlbHNlCi0gIHsKLSAgZG9jdW1lbnQud3JpdGUobCsnZGVzaWduX25zJytjKTsKLSAgfQotfQotCi1lbHNlIGlmKHNudnBsX21hYykvL21hYwotICB7ICAKLSAgaWYoc252dl9pZSkgICAgCi0gIHsKLSAgICBpZiAoc251YS5pbmRleE9mKCdpZSA1JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbicrYyk7Ci0gICAgZWxzZSBpZihzbnVhLmluZGV4T2YoJ2llIDUuNScpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ24nK2MpOwotICAgIGVsc2UgaWYoc251YS5pbmRleE9mKCdpZSA2JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbicrYyk7Ci0gICAgZWxzZQotCSAgewotCSAgIGRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbicrYyk7Ci0JICB9Ci0gIH0KLQotICBlbHNlIGlmIChzbnZ2X25uKSAKLSAgewotICBpZiAoc251YS5pbmRleE9mKCIvNCIpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ25fbnMnK2MpOwotICBlbHNlIGlmKHNudWEuaW5kZXhPZigiLzYiKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnZGVzaWduX25zJytjKTsKLSAgZWxzZQotCSAgewotCSAgIGRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbl9ucycrYyk7Ci0JICB9Ci0gIH0gCi0gIGVsc2UKLSAgewotIGRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbl9ucycrYyk7Ci0gIH0KLX0KLQotZWxzZS8vb3RoZXJzIAotewotICBkb2N1bWVudC53cml0ZShsKydkZXNpZ25fbnMnK2MpOwotCi19Ci0KLS8vU05JRkZFUiBFTkRTIEhFUkUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zY3JpcHRzL3NjcmlwdHNfdW5peEZyYW1lLmpzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NjcmlwdHMvc2NyaXB0c191bml4RnJhbWUuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRjNDA3NjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NjcmlwdHMvc2NyaXB0c191bml4RnJhbWUuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaWYoc25udnZfbm4gJiYgc252cGxfdW5peCkgewkgIHdpbmRvdy5sb2NhdGlvbiA9ICJ1bml4X2ZyYW1lcy5odG1sIgl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXYuanMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXYuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFmMDdlODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NjcmlwdHMvdG9wbmF2LmpzCisrKyAvZGV2L251bGwKQEAgLTEsNzg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBtZXNzYWdlcyB0byBiZSBleHRlcm5pemVkCi0vLyBoZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzCi0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTEgPSAiVGhlIFRyZWVCcm93c2UgaXMgbm90IHlldCBsb2FkZWQhXG5QbGVhc2Ugd2FpdCEiOwotdmFyIHRvcG5hdl9qc19NRVNTQUdFMiA9ICJUaGVyZSBpcyBubyAnezB9JyBwYWdlIGZvciB0aGlzIHBhZ2UuXG5Ucnkgb25lIG9mIHRoZSBvdGhlciBuYXZpZ2F0aW9uIGJ1dHRvbnMuIjsKLXZhciB0b3BuYXZfanNfTUVTU0FHRTMgPSAiVGhlcmUgaXMgbm8gezB9IHBhZ2UhIjsKLXZhciB0b3BuYXZfanNfTUVTU0FHRV9wcmV2ID0gInByZXZpb3VzIjsKLXZhciB0b3BuYXZfanNfTUVTU0FHRV9uZXh0ID0gIm5leHQiOwotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3VwID0gInVwIjsKLXZhciB0b3BuYXZfanNfTUVTU0FHRTQgPSAiVGhlIGN1cnJlbnQgZmlsZSBpcyBub3QgaW4gdGhlIHRyZWUgYnJvd3Nlci4iOwotdmFyIHRvcG5hdl9qc19NRVNTQUdFNSA9ICJUaGUgcHVibGlzaGVkIHNpdGUgaXMgYWxyZWFkeSBkaXNwbGF5ZWQgdXNpbmcgZnJhbWVzIjsKLQotZnVuY3Rpb24gZm9ybWF0U3RyaW5nKG1lc3NhZ2UsIHJlcGxhY2UwKQotewotICAgCXJldHVybiBtZXNzYWdlLnJlcGxhY2UoL1x7MFx9LywgcmVwbGFjZTApOwotfSAKLQotLy8gdGhpcyBzY3JpcHQgaXMgZm9yIHRoZSB0b3BuYXYuaHRtbAotLy8gdGhpcyBpcyBOT1QgZm9yIGdlbmVyYWwgdXNlCi1NU0ZQaG92ZXIgPQotKCgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk5ldHNjYXBlIikgJiYKLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSAzICkpIHx8Ci0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gNCApKSk7Ci0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQotICB7Ci0gICAgIHZhciBhPW5ldyBJbWFnZSgpOwotICAgICBhLnNyYz1pbWc7Ci0gICAgIHJldHVybiBhOwotICB9Ci0gIAotdmFyIHRvdXIgPSAwOwotCi1mdW5jdGlvbiBvcGVuRmlyc3RUb3VyICgpCi0vLyBvcGVuIHRoZSBndWlkZWQgdG91ciAvaGFha2FuIDk5MDMyNAotewotaWYoIXRvdXIgfHwgdG91cj09bnVsbCB8fCB0b3VyLmNsb3NlZCkKLSAgICB7Ci0gICAgICB0b3VyID0gb3BlbigiLi90b3VyL3RvdXIuaHRtIiwidG91cl9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM1MCxoZWlnaHQ9NzAwLHJlc2l6YWJsZT15ZXMiKTsKLSAgICAgIHRvdXIuZm9jdXMoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRvdXIuZm9jdXMoKTsKLSAgICB9Ci19Ci0KLWZ1bmN0aW9uIG9wZW5Ub3VyICgpCi0vLyBvcGVuIHRoZSBndWlkZWQgdG91ciAvaGFha2FuIDk5MDMyNAotewotaWYoIXRvdXIgfHwgdG91cj09bnVsbCB8fCB0b3VyLmNsb3NlZCkKLSAgICB7Ci0gICAgICB0b3VyID0gb3BlbigiLi90b3VyL3RvdXIuaHRtIiwidG91cl9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM1MCxoZWlnaHQ9NzAwLHJlc2l6YWJsZT15ZXMiKTsKLSAgICAgIHRvdXIuZm9jdXMoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRvdXIuZm9jdXMoKTsKLSAgICB9Ci19Ci0KLS8vQWRkaXRpb24gYnkgQ2hpbmggVm8gMDMvMjgvMDAKLSBmdW5jdGlvbiBkaXNwbGF5R2V0dGluZ1N0YXJ0ZWQoKQotIHsKLSAJdmFyIHBhZ2VQYXR0ZXJuID0gL292dV9wcm9jLzsKLSAJdmFyIG1haW5QYWdlID0gd2luZG93LnBhcmVudC5vcnlfZG9jLmxvY2F0aW9uOwotCi0gCWlmICggcGFnZVBhdHRlcm4udGVzdCggbWFpblBhZ2UgKSApIHsKLSAgICAJaWYgKGdldENvb2tpZSgiUlVQIikgIT0gImNoZWNrZWQiKSB7IG9wZW5GaXJzdFRvdXIoKTsgfQotCX0KLQllbHNlIHsKLQkJc2V0VGltZW91dCggImRpc3BsYXlHZXR0aW5nU3RhcnRlZCgpIiwgMTAwMCApOwotCX0KLX0KLQotZnVuY3Rpb24gZ2V0Q29va2llIChuYW1lKQotewotICB2YXIgZGNvb2tpZSA9IGRvY3VtZW50LmNvb2tpZTsKLSAgdmFyIGNuYW1lID0gbmFtZSArICI9IjsKLSAgdmFyIGNsZW4gPSBkY29va2llLmxlbmd0aDsKLSAgdmFyIGNiZWdpbiA9IDA7Ci0gIHdoaWxlIChjYmVnaW4gPCBjbGVuKQotICB7Ci0gICAgdmFyIHZiZWdpbiA9IGNiZWdpbiArIGNuYW1lLmxlbmd0aDsKLSAgICBpZiAoZGNvb2tpZS5zdWJzdHJpbmcoY2JlZ2luLCB2YmVnaW4pID09IGNuYW1lKQotICAgIHsKLSAgICAgIHZhciB2ZW5kID0gZGNvb2tpZS5pbmRleE9mICgiOyIsIHZiZWdpbik7Ci0gICAgICBpZiAodmVuZCA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgdmVuZCA9IGNsZW47Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdW5lc2NhcGUoZGNvb2tpZS5zdWJzdHJpbmcodmJlZ2luLCB2ZW5kKSk7Ci0gICAgfQotICAgIGNiZWdpbiA9IGRjb29raWUuaW5kZXhPZigiICIsIGNiZWdpbikgKyAxOwotICAgIGlmIChjYmVnaW4gPT0gMCkKLSAgICB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG51bGw7Ci0gfQotCi0KLSAgdmFyIGluZGV4PW51bGw7Ci0gIHZhciB0b3VyPW51bGw7Ci0gIHZhciBzZWFyY2g9bnVsbDsKLSAgdmFyIGdsb3NzYXJ5PW51bGw7Ci0gIHZhciBmZWVkYmFjaz1udWxsOwotICB2YXIgdHJlZUxvYWRlZD1mYWxzZTsKLSAgZnVuY3Rpb24gY2hlY2tUcmVlTG9hZGVkKCkKLSAgewotICAgIGlmKHRyZWVMb2FkZWQpCi0gICAgewotICAgICAgcmV0dXJuIHRyZWVMb2FkZWQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgaWYocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0ICE9IG51bGwKLSAgICAgICAgJiYgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHkoKSkKLSAgICAgewotICAgICAgIHRyZWVMb2FkZWQgPSB0cnVlOwotICAgICB9Ci0gICAgICovCi0gICAgIGlmKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldCAhPSBudWxsKQotICAgICB7Ci0gICAgICAJdmFyIG1ldGhvZCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeTsKLQkgaWYgKG1ldGhvZCAhPSAidW5kZWZpbmVkIikgewotCQlpZiAocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHkoKSkKLQkJewotICAgICAgIAkJCXRyZWVMb2FkZWQgPSB0cnVlOwotCQl9Ci0KLQkgIH0KLQotICAgICB9Ci0KLSAgICAgcmV0dXJuIHRyZWVMb2FkZWQ7Ci0gICB9Ci0KLQotICAgIGZ1bmN0aW9uIHNob3dBbGVydE5vdExvYWRlZCgpCi0gICAgewotICAgICAgYWxlcnQodG9wbmF2X2pzX01FU1NBR0UxKTsKLSAgICB9Ci0KLWZ1bmN0aW9uIHNob3dTdGF0dXNOb3RMb2FkZWQoKQotICB7Ci0gICAgLy9yZXR1cm4gIlRoZSBUcmVlQnJvd3NlIGlzIG5vdCB5ZXQgbG9hZGVkIVxuUGxlYXNlIHdhaXQhIjsKLSAgICByZXR1cm4gdG9wbmF2X2pzX01FU1NBR0UxOwotICB9Ci0KLSAgZnVuY3Rpb24gc2hvd0FsZXJ0Tm9QYWdlKHRleHQpCi0gIHsKLSAgICAgdmFyIHBhcmVudExhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7Ci0gICAgIGlmKHBhcmVudExhYmVsIT0iIiAmJiBwYXJlbnRMYWJlbCE9bnVsbCkKLSAgICAgewotICAgICAgICAgIC8vYWxlcnQoIlRoZXJlIGlzIG5vICciICsgdGV4dCArICInIHBhZ2UgZm9yIHRoaXMgcGFnZS5cblRyeSBvbmUgb2YgdGhlIG90aGVyIG5hdmlnYXRpb24gYnV0dG9ucy4iKTsKLSAgICAgICAgICBhbGVydChmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UyLCB0ZXh0KSk7Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgICAvL2FsZXJ0KCJUaGVyZSBpcyBubyAnIiArIHRleHQgKyAiJyBwYWdlIGZvciB0aGlzIHBhZ2UuXG5Ucnkgb25lIG9mIHRoZSBvdGhlciBuYXZpZ2F0aW9uIGJ1dHRvbnMiKTsKLSAgICAgICAgIGFsZXJ0KGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTIsIHRleHQpKTsKLSAgICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gc2hvd1N0YXR1c05vUGFnZSh0ZXh0KQotICB7Ci0KLSAgICAgdmFyIHBhcmVudExhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7Ci0gICAgIHZhciBtc2c7Ci0gICAgIGlmKHBhcmVudExhYmVsIT0iIiAmJiBwYXJlbnRMYWJlbCE9bnVsbCkKLSAgICAgewotICAgICAgICAvL21zZyA9ICJUaGVyZSBpcyBubyAiICsgdGV4dCArICIgcGFnZSEiOwotICAgICAgICBtc2cgPSBmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UzLCB0ZXh0KTsKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICAgLy9tc2cgPSAiVGhlcmUgaXMgbm8gIiArIHRleHQgKyAiIHBhZ2UhIjsKLSAgICAgICAgbXNnID0gZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMywgdGV4dCk7Ci0gICAgIH0KLQotICAgICByZXR1cm4gbXNnOwotICB9Ci0KLSAgZnVuY3Rpb24gc2hvd1BhcmVudExhYmVsKCkKLSAgewotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQotICAgIHsKLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOwotICAgICAgdmFyIHBhcmVudHVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsKLQotICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgcGFyZW50dXJsIT0iIiAmJiBwYXJlbnR1cmwhPW51bGwpCi0gICAgIHsKLSAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vUGFnZSgidXAiKTsKLSAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb3RMb2FkZWQoKTsKLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiBzaG93SG9tZUxhYmVsKCkKLSAgewotICAgIHNlbGYuc3RhdHVzID0gIkhvbWUiOwotICB9Ci0KLSAgZnVuY3Rpb24gc2hvd1ByZXZpb3VzTGFiZWwoKQotICB7Ci0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpCi0gICAgewotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzTGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsKLSAgICAgIHZhciBwcmV2dXJsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzVXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7Ci0KLSAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIHByZXZ1cmwhPSIiICYmIHByZXZ1cmwhPW51bGwpCi0gICAgIHsKLSAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb1BhZ2UoInByZXZpb3VzIik7Ci0gICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm90TG9hZGVkKCk7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gc2hvd05leHRMYWJlbCgpCi0gIHsKLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkKLSAgICB7Ci0gICAgICB2YXIgbGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7Ci0gICAgICB2YXIgbmV4dHVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7Ci0gICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgbmV4dHVybCE9IiIgJiYgbmV4dHVybCE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc2VsZi5zdGF0dXMgPSAgc2hvd1N0YXR1c05vUGFnZSgibmV4dCIpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb3RMb2FkZWQoKTsKLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiBsb2FkUHJldmlvdXMoKQotICB7Ci0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpCi0gICAgewotICAgICB2YXIgbmV3TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOwotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsKLQotICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpCi0gICAgIHsKLQotCWlmICgobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0Iik9PS0xKSAmJiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3Iik9PS0xKSkKLQl7Ci0JCXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247Ci0JfQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpIT0tMSkKLQl7Ci0JIAlwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0QXBwbGV0UGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwpOwotCX0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKSE9LTEpCi0JewotCQluZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRIdHRwUGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwsICJQcmV2aW91cyIpOwotCX0KLQkgICAgICAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV9wcmV2KTsKLSAgICAgfQotICAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7Ci0gICAgfQotICAgICByZXR1cm47Ci0gIH0KLQotICBmdW5jdGlvbiBsb2FkTmV4dCgpCi0gIHsKLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkKLSAgICB7Ci0gICAgIHZhciBuZXdMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsKLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsKLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQotICAgICB7Ci0KLQlpZiAoKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpPT0tMSkgJiYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpPT0tMSkpCi0JewotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOwotCX0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKSE9LTEpCi0JewotCSAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEFwcGxldFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsKTsKLQl9Ci0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQotCXsKLQkJbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0SHR0cFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsLCAiTmV4dCIpOwotCX0KLSAgICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7Ci0KLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX25leHQpOwotICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsKLSAgICB9Ci0KLSAgICAgcmV0dXJuOwotICB9Ci0KLSAgZnVuY3Rpb24gbG9hZFBhcmVudCgpCi0gIHsKLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkKLSAgICB7Ci0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsKLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQotICAgICB7Ci0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsKLSAgICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX3VwKTsKLSAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOwotICAgIH0KLQotICAgICByZXR1cm47Ci0gIH0KLQotZnVuY3Rpb24gd2hlcmVBbUkoKQotICB7Ci0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpCi0gICAgewotCXZhciBzdGF0dXMgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOwotICAgIAlpZiggc3RhdHVzID09IGZhbHNlICkKLQl7Ci0JCWFsZXJ0KCB0b3BuYXZfanNfTUVTU0FHRTQgKTsKLQl9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsKLSAgICB9Ci0gICAgIHJldHVybjsKLSAgfQotCi0gIGZ1bmN0aW9uIHVwQXJyb3coKQotICB7Ci0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpCi0gICAgewotICAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnVwQXJyb3coKTsKLSAgICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkKLSAgICAgIHsKLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7Ci0gICAgfQotICAgICByZXR1cm47Ci0gIH0KLQotICBmdW5jdGlvbiBkb3duQXJyb3coKQotICB7Ci0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpCi0gICAgewotICAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmRvd25BcnJvdygpOwotICAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQotICAgICAgewotICAgICAgIHBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOwotICAgIH0KLSAgICAgcmV0dXJuOwotICB9Ci0KLSAgICBmdW5jdGlvbiBsZWZ0QXJyb3coKQotICB7Ci0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpCi0gICAgewotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUubGVmdEFycm93KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsKLSAgICB9Ci0gICAgIHJldHVybjsKLSAgfQotCi0gICAgZnVuY3Rpb24gcmlnaHRBcnJvdygpCi0gIHsKLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkKLSAgICB7Ci0gICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5yaWdodEFycm93KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsKLSAgICB9Ci0gICAgIHJldHVybjsKLSAgfQotCi0KLWZ1bmN0aW9uIGxvYWRUb3AoKQotewotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiBwYXJlbnQuZnJhbWVzWzFdLm5hbWU9PSJvcnlfdG9jIikKLSAgewotICAgICBhbGVydCh0b3BuYXZfanNfTUVTU0FHRTUpOwotICB9Ci0gIGVsc2UKLSAgewotICAgIHZhciBleHBpcmVzID0gbmV3IERhdGUoKTsKLSAgICBleHBpcmVzLnNldFRpbWUgKGV4cGlyZXMuZ2V0VGltZSgpICsgKDEwMDAgKiAyMCkpOwotICAgIGRvY3VtZW50LmNvb2tpZSA9ICJydXBfb3J5X2RvYz0iICsgZXNjYXBlIChkb2N1bWVudC5VUkwpICsKLSAgICAiOyBleHBpcmVzPSIgKyBleHBpcmVzLnRvVVRDU3RyaW5nKCkgKyAgIjsgcGF0aD0vIjsKLQotICAgIHZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOwotCi0gICAgZm9yKGk9ZG9jdW1lbnQubGlua3MubGVuZ3RoLTE7aT49MDtpLS0pCi0gICAgewotICAgICAgIGlmKGRvY3VtZW50LmxpbmtzW2ldLmhyZWYuaW5kZXhPZigiaW5kZXguaHRtIikhPS0xKQotICAgICAgIHsKLSAgICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IGRvY3VtZW50LmxpbmtzW2ldLmhyZWY7Ci0gICAgICAgICBicmVhazsKLSAgICAgICB9Ci0gICAgfQotCi0gICAgaWYobmV3X29yeV9kb2NfbG9jIT1udWxsKQotICAgIHsKLQlpZiggc2VsZi5uYW1lID09ICJvcnlfZG9jIiApCi0JewotCQl3aW5kb3cuY2xvc2UoKTsKLQkJd2luZG93Lm9wZW4oIG5ld19vcnlfZG9jX2xvYyApOwotCX0KLQllbHNlCi0JewotCSAgICAgICAJdG9wLmxvY2F0aW9uID0gbmV3X29yeV9kb2NfbG9jOwotCX0KLSAgICB9Ci0gICB9Ci19Ci0KLQotZnVuY3Rpb24gb3Blbk9yeSAocGFnZSwgdGFyZ2V0KQotewotICAgIGlmKCFpbmRleCB8fCBpbmRleC5jbG9zZWQpCi0gICAgewotICAgICAgaW5kZXggPSBvcGVuKHBhZ2UsdGFyZ2V0LCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9Mzk1LGhlaWdodD01MDAscmVzaXphYmxlPXllcyIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaW5kZXguZm9jdXMoKTsKLSAgICB9Ci19Ci0KLWZ1bmN0aW9uIG9wZW5TZWFyY2goKQotewotICAgIGlmKCFzZWFyY2ggfHwgc2VhcmNoLmNsb3NlZCkKLSAgICB7Ci0gICAgICBzZWFyY2ggPSBvcGVuKCIuL2FwcGxldC9zZWFyY2guaHRtIiwic2VhcmNoX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz1ubyx3aWR0aD02MzAsaGVpZ2h0PTQ1MCxyZXNpemFibGU9eWVzIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZWFyY2guZm9jdXMoKTsKLSAgICB9Ci19Ci0KLWZ1bmN0aW9uIG9wZW5JbmRleCgpCi17Ci0gICBvcGVuT3J5KCIuL2luZGV4L2luZGV4Lmh0bSIsImluZGV4X3dpbiIpOwotfQotCi1mdW5jdGlvbiBvcGVuR2xvc3NhcnkoKQotewotIGlmKCFnbG9zc2FyeSB8fCBnbG9zc2FyeS5jbG9zZWQpCi0gICAgewotICAgICAgZ2xvc3NhcnkgPSBvcGVuKCIuL3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXguaHRtIiwiZ2xvc3Nhcnlfd2luIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM4NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGdsb3NzYXJ5LmZvY3VzKCk7Ci0gICAgfQotfQotCi1mdW5jdGlvbiBwcmludFBhZ2UoKQotewotIHBhcmVudC5vcnlfZG9jLmZvY3VzKCk7Ci0gcGFyZW50Lm9yeV9kb2MucHJpbnQoKTsKLX0KLQotCi1mdW5jdGlvbiBzZW5kRmVlZGJhY2sodXJsKQotewotCWlmICggdXJsID09IG51bGwgfHwgdXJsID09ICcnICkKLQl7Ci0JCXJldHVybjsKLQl9Ci0JCi0JaWYgKCB1cmwuaW5kZXhPZigibWFpbHRvOiIpID49IDAgKQotCXsKLQkJc2VuZG1haWwodXJsKTsKLQl9Ci0JZWxzZQotCXsKLQkJCi0gCSAgICBpZighZmVlZGJhY2sgfHwgZmVlZGJhY2suY2xvc2VkKQotCSAgICB7Ci0JICAgICAgZmVlZGJhY2sgPSBvcGVuKHVybCwiZmVlZGJhY2tfd2luIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTYwMCxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkgICAgICBmZWVkYmFjay5mb2N1cygpOwotCSAgICB9Ci0gICAgCX0KLSAgICAJCi19Ci0KLQotZnVuY3Rpb24gc2VuZG1haWwodXJsKQotewotCWlmICggdXJsLmluZGV4T2YoIj9zdWJqZWN0IikgPT0gLTEgKQotCXsKLQkJdmFyIGxpbms9cGFyZW50Lm9yeV9kb2MubG9jYXRpb247Ci0JCXVybCA9IHVybCArICc/c3ViamVjdD1GZWVkYmFjazogLSAnK2xpbms7Ci0JfQotCWxvY2F0aW9uLnJlcGxhY2UodXJsKTsKLX0KLQotLy9jYWxjdWxhdGVzIHJlbGF0aXZlIHBhdGgKLS8vcGF0aCBtdXN0IGJlIGFsbCByZWxhdGl2ZSBmcm9tIHdlYnNpdGUgYmFzZSBvciBjb250YWluIGZ1bGwgdXJscwotZnVuY3Rpb24gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHNvdXJjZVBhdGgsIHRhcmdldFBhdGgpCi17Ci0JaWYgKHRhcmdldFBhdGguaW5kZXhPZigiaHR0cDovIikgIT0gLTEpCi0JewotCQlyZXR1cm4gdGFyZ2V0UGF0aDsKLQl9Ci0KLQkvL3JlcGxhY2UgYWxsICdcJyB3aXRoICcvJwotCXNvdXJjZVBhdGggPSBzb3VyY2VQYXRoLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7Ci0JdGFyZ2V0UGF0aCA9IHRhcmdldFBhdGgucmVwbGFjZSgvXFwvZywiLyIpOwotCi0JLy9hbGVydCgiUmVwbGFjZShTb3VyY2UpPT4iICsgc291cmNlUGF0aCk7Ci0JLy9hbGVydCgiUmVwbGFjZSh0YXJnZXQpPT4iICsgdGFyZ2V0UGF0aCk7Ci0KLQotCXNvdXJjZUFycmF5ID0gc291cmNlUGF0aC5zcGxpdCgiLyIpOwotCXRhcmdldEFycmF5ID0gdGFyZ2V0UGF0aC5zcGxpdCgiLyIpOwotCi0JdmFyIHRoZVJlbFBhdGggPSAiIjsKLQotCS8vbG9vcCB1bnRpbCB3ZSBmaW5kIGEgZGlmZmVyZW5jZQotCXZhciBpZHggPSAwOwotCWZvcihpZHggPSAwOyBpZHggPCBzb3VyY2VBcnJheS5sZW5ndGg7IGlkeCsrKQotCXsKLQkJaWYgKGlkeCA+IHRhcmdldFBhdGgubGVuZ3RoKQotCQl7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChzb3VyY2VBcnJheVtpZHhdICE9IHRhcmdldEFycmF5W2lkeF0pCi0JCXsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLy9hcHBlbmQgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiAuLwotCXZhciBtYXhJZHggPSBzb3VyY2VBcnJheS5sZW5ndGggLSAxOwotCWZvciAodmFyIGkgPSBpZHg7IGkgPCBtYXhJZHg7IGkrKykKLQl7Ci0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoICsgIi4vIjsKLQotCQkvL2FsZXJ0KCJSZWxQYXRoPT4iICsgdGhlUmVsUGF0aCk7Ci0JfQotCi0JLy9hcHBlbmQgYW55IHJlbWFpbmluZyB0YXJnZXQgcGF0aAotCXdoaWxlKGlkeCA8IHRhcmdldEFycmF5Lmxlbmd0aCkKLQl7Ci0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoICsgdGFyZ2V0QXJyYXlbaWR4KytdICsgIi8iOwotCQkvL2FsZXJ0KCJSZWxQYXRoKGZpbmFsKT0+IiArIHRoZVJlbFBhdGgpOwotCX0KLQotCS8vcmVtb3ZlIHRoZSBsYXN0IHBhdGggc2VwYXJhdG9yCi0JaWYgKHRoZVJlbFBhdGgubGVuZ3RoID4gMCkKLQl7Ci0JCS8vYWxlcnQoIlJlbFBhdGgoVHJpbTEpPT4iICsgdGhlUmVsUGF0aCk7Ci0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoLnN1YnN0cmluZygwLCAodGhlUmVsUGF0aC5sZW5ndGggLSAxKSk7Ci0JCS8vYWxlcnQoIlJlbFBhdGgoVHJpbTEpPT4iICsgdGhlUmVsUGF0aCk7Ci0JfQotCi0JLy9hbGVydCgiUmV0dXJuIFJlbGF0aXZlIFBhdGggPT4gIiArIHRoZVJlbFBhdGgpOwotCi0JcmV0dXJuIHRoZVJlbFBhdGg7Ci19Ci0KLWZ1bmN0aW9uIGdldFRyZWVQYXRoKCkKLXsKLQlyZXR1cm4gYnVpbGRUcmVlUGF0aExvY2F0aW9uKCk7Ci19Ci0KLS8vVGhpcyBtZXRob2Qgd2lsbCByZW1vdmUgdGhlIHdlYnNpdGUgYmFzZSBmcm9tIHRoZSB1cmwKLWZ1bmN0aW9uIGNhbGN1bGF0Q3VycmVudFBhZ2UoY3VyclVSTCkgewotCi0JdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7Ci0JLy9yZXBsYWNlIGFsbCAnXCcgd2l0aCAnLycKLQl0aGVDdXJyZW50TG9jYXRpb24gPSB0aGVDdXJyZW50TG9jYXRpb24ucmVwbGFjZSgvXFwvZywiJDEvJDIiKTsKLQljdXJyVVJMID0gY3VyclVSTC5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOwotCi0JdmFyIHNvdXJjZUFycmF5ID0gdGhlQ3VycmVudExvY2F0aW9uLnNwbGl0KCIvIik7Ci0JdmFyIGN1cnJBcnJheSA9IGN1cnJVUkwuc3BsaXQoIi8iKTsKLQotCXZhciBudW1Ub1JlbW92ZSA9IHNvdXJjZUFycmF5Lmxlbmd0aCAtIDI7Ci0JdmFyIGlkeCA9IDA7Ci0JdmFyIHRoZVJldHVyblBhdGggPSAiIjsKLQlmb3IgKGlkeCA9IG51bVRvUmVtb3ZlOyBpZHggPCBjdXJyQXJyYXkubGVuZ3RoOyBpZHgrKykgewotCQlpZiAodGhlUmV0dXJuUGF0aCAhPSAiIikgewotCQkJdGhlUmV0dXJuUGF0aCA9IHRoZVJldHVyblBhdGggKyAiLyI7Ci0JCX0KLQkJdGhlUmV0dXJuUGF0aCA9IHRoZVJldHVyblBhdGggKyBjdXJyQXJyYXlbaWR4XTsKLQl9Ci0KLQkvL2FsZXJ0KCJBcnJheVRlc3Q9PiIgKyBjdXJyVVJMICsgIiwiICsgdGhlUmV0dXJuUGF0aCk7Ci0JcmV0dXJuIHRoZVJldHVyblBhdGg7Ci19Ci0KLS8vYnVpbGRzIHRyZWUgcGF0aAotZnVuY3Rpb24gYnVpbGRUcmVlUGF0aExvY2F0aW9uKCkKLXsKLQl2YXIgdGhlRGVsaW1pdGVyID0gIiMjKiI7Ci0JdmFyIHRoaXNQYWdlID0gImFwcGxldC9ydXBfdG9wbmF2Lmh0bSI7Ci0JdmFyIHRoZUxvYyA9ICIiOwotCi0KLQotCWlmKGNoZWNrVHJlZUxvYWRlZCgpKQotCXsKLQkJdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY7Ci0JCXRoaXNQYWdlID0gY2FsY3VsYXRDdXJyZW50UGFnZSh0aGVDdXJyZW50TG9jYXRpb24pOwotCi0JCS8vYWxlcnQoIlBhdGhOYW1lOiIgKyB0aGlzUGFnZSk7Ci0KLQkJLy9hbGVydCgiVHJ5aW5nIHRvIGZpbmQgdGhlIHBhdGggZm9yID0+IiArIHRoZUN1cnJlbnRMb2NhdGlvbik7Ci0KLQkJdmFyIHRoZVBhdGggPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuZ2V0VHJlZVBhdGhBcnJheSh0aGVDdXJyZW50TG9jYXRpb24pOwotCi0JCS8vYWxlcnQoIlRoZSBUcmVlIFBhdGg6ICIgKyB0aGVQYXRoKTsKLQotCQl0aGVQYXRoU3RyaW5nID0gdGhlUGF0aCArICIiOwotICAgIAkJYXJyYXlGcm9tU3RyaW5nID0gdGhlUGF0aFN0cmluZy5zcGxpdCh0aGVEZWxpbWl0ZXIpOwotCi0JCS8vYnVpbGQgdGhlIHBhdGggZnJvbSB0aGUgYXJyYXkKLQkJLy9wYXJhbSAxID0gcGF0aCB0byBpY29uLCBwYXJhbSAyIC0gbGFiZWwsIHBhcmFtIDMgLSBwYXRoIHRvIGZpbGUKLQkJdmFyIGNvdW50ZXIgPSAwOwotCQl2YXIgdGhlTGFiZWw7Ci0JCXZhciB0aGVSZWxQYXRoOwotCQlpZiAoYXJyYXlGcm9tU3RyaW5nLmxlbmd0aCA+IDIpCi0JCXsKLQkJICAgdGhlTG9jID0gIiI7Ci0JCSAgIGZvcih2YXIgaSA9IDA7IGkgPCAoYXJyYXlGcm9tU3RyaW5nLmxlbmd0aCAtIDEpIDsgaSsrKQotCQkgICB7Ci0JCQkvL2l0J3MgdGhlIGljb24gcGF0aAotCQkJaWYgKGNvdW50ZXIgPCAyKQotCQkJewotCQkJCWlmIChjb3VudGVyID4gMCkKLQkJCQl7Ci0JCQkJCXRoZUxvYyA9IHRoZUxvYyArICIgJmd0OyAiOwotCQkJCX0KLQotCQkJCS8vYWxlcnQoIkNhbGN1bGF0aW5nIHBhdGggZnJvbSgxKSAiICsgdGhpc1BhZ2UgKyAiID0+ICIgKyBhcnJheUZyb21TdHJpbmdbaV0pOwotCi0JCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXS5pbmRleE9mKCJcXCIpID09IC0xICYmIGFycmF5RnJvbVN0cmluZ1tpXS5pbmRleE9mKCIvIikgPT0gLTEpCi0JCQkJewotCQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldICE9ICJudWxsIikKLQkJCQkJewotCQkJCQkJdGhlUmVsUGF0aCA9ICJhcHBsZXQvaW1hZ2VzLyIgKyBhcnJheUZyb21TdHJpbmdbaV07Ci0JCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCB0aGVSZWxQYXRoKTsKLQkJCQkJfQotCQkJCQkvL2FsZXJ0KCJNb2RpZnlpbmcgUGF0aCA9PiAiICsgdGhlUmVsUGF0aCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCBhcnJheUZyb21TdHJpbmdbaV0pOwotCQkJCX0KLQotCQkJCWlmICh0aGVSZWxQYXRoICE9ICJudWxsIikKLQkJCQl7Ci0JCQkJCXRoZUxvYyA9IHRoZUxvYyArCi0JCQkJCQkgIjxpbWcgYm9yZGVyPTAgc3JjPVwiIiArCi0JCQkJCQkgdGhlUmVsUGF0aCAgKwotCQkJCQkJICJcIj4iOwotCQkJCX0KLQotCQkJCS8vYWxlcnQoInRoZSBjdXJyIHBhdGg9PiIgKyB0aGVMb2MpOwotCQkJCWNvdW50ZXIgPSAyOwotCQkJfQotCQkJLy8gaXQncyB0aGUgbGFiZWwKLQkJCWVsc2UgaWYgKGNvdW50ZXIgPT0gMikKLQkJCXsKLQkJCQl0aGVMYWJlbCA9IGFycmF5RnJvbVN0cmluZ1tpXTsKLQkJCQljb3VudGVyID0gMzsKLQkJCX0KLQkJCWVsc2UgaWYgKGNvdW50ZXIgPT0gMykKLQkJCXsKLQkJCQkvL2FsZXJ0KCJDYWxjdWxhdGluZyBwYXRoIGZyb20oMykgIiArIHRoaXNQYWdlICsgIiA9PiAiICsgYXJyYXlGcm9tU3RyaW5nW2ldKTsKLQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldICE9ICJudWxsIikKLQkJCQl7Ci0JCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIGFycmF5RnJvbVN0cmluZ1tpXSk7Ci0JCQkJCWlmICh0aGVSZWxQYXRoICE9ICIiKSB7Ci0JCQkJCQl0aGVMb2MgPSB0aGVMb2MgKwotCQkJCQkgCQkiPGEgY2xhc3M9XCJob3R0ZXh0XCIgdGFyZ2V0PVwib3J5X2RvY1wiIGhyZWY9XCIiICsKLQkJCQkJCQkgdGhlUmVsUGF0aCArCi0JCQkJCSAJCSJcIj4iICsKLQkJCQkJIAkJdGhlTGFiZWwgKwotCQkJCQkgCQkiPFwvYT5cbiI7Ci0JCQkJCSB9Ci0JCQkJCSBlbHNlIHsKLQkJCQkJIAl0aGVMb2MgPSB0aGVMb2MgKwotCQkJCQkgCQkiPGEgY2xhc3M9XCJob3R0ZXh0XCI+IiAgKwotCQkJCQkgCQl0aGVMYWJlbCArCi0JCQkJCSAJCSI8XC9hPlxuIjsKLQkJCQkJIH0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJdGhlTG9jID0gdGhlTG9jICsKLQkJCQkJIAkiPGEgY2xhc3M9XCJob3R0ZXh0XCI+IiAgKwotCQkJCQkgCXRoZUxhYmVsICsKLQkJCQkJIAkiPFwvYT5cbiI7Ci0JCQkJfQotCQkJCS8vYWxlcnQoInRoZSBjdXJyIHBhdGg9PiIgKyB0aGVMb2MpOwotCQkJCWNvdW50ZXIgPSAxOwotCQkJCXRoZVJlbFBhdGggPSAibnVsbCI7Ci0JCQkJdGhlTGFiZWwgPSAibnVsbCI7Ci0JCQl9Ci0JCSAgIH0KLQotCQkvL2FsZXJ0KCJGaW5pc2hlZCBCdWlsZGluZyA9PiAiICsgdGhlTG9jKTsKLQkJfQotCi0JfQotCi0JLy90aGVMb2MgPSAiQ3VycmVudCBMb2NhdGlvbiZuYnNwOyYjMDQ1OyZuYnNwOyIgKyB0aGVMb2M7Ci0KLQkvL2FsZXJ0KCJ0aGUgRmluYWwgU3RyaW5nPT4iICsgdGhlTG9jKTsKLQotCS8vZG9jdW1lbnQud3JpdGUodGhlTG9jKTsKLQlyZXR1cm4gdGhlTG9jOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2NyaXB0cy90cmVlYnJvd3Nlci5qcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zY3JpcHRzL3RyZWVicm93c2VyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NjI0NmVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zY3JpcHRzL3RyZWVicm93c2VyLmpzCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEhlcmUgZGVmaW5lcyBhbGwgdGhlIEkxOE4gc3BlY2lmaWMgbWVzc2FnZXMgdXNlZCBpbiB0aGUgamF2YXNjcmlwdHMKLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMSA9ICJUaGUgY29uZmlndXJhdGlvbiBpcyBhbHJlYWR5IGRpc3BsYXllZCB1c2luZyB2aWV3cyI7Ci12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTIgPSAiRGlzcGxheSB2aWV3cyI7Ci12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTMgPSAiSG9tZSI7Ci0KLWZ1bmN0aW9uIGxvYWRUb3AoKQotewotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiAocGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIgfHwgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvY19mcmFtZSIpICkKLSAgewotICAgICBhbGVydCh0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMSk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOwotICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7Ci0gICAgZG9jdW1lbnQuY29va2llID0gInJ1cF9vcnlfZG9jPSIgKyBlc2NhcGUgKGRvY3VtZW50LlVSTCkgKwotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOwotICAgIAkKLSAgICB2YXIgbWFpbkluZGV4X2EgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgibWFpbkluZGV4Iik7IAotCXZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOyAKLQlpZiAoICBtYWluSW5kZXhfYSAhPSBudWxsICkgeyAKLSAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gbWFpbkluZGV4X2EuaXRlbSgwKS5ocmVmOyAKLQl9IAotCi0gICAgaWYobmV3X29yeV9kb2NfbG9jIT1udWxsKQotICAgIHsKLQlpZiggc2VsZi5uYW1lID09ICJvcnlfZG9jIiApCi0JewotCQl3aW5kb3cuY2xvc2UoKTsKLQkJd2luZG93Lm9wZW4oIG5ld19vcnlfZG9jX2xvYyApOwkJCi0JfQotCWVsc2UKLQl7Ci0JICAgICAgIAl0b3AubG9jYXRpb24gPSBuZXdfb3J5X2RvY19sb2M7Ci0JfQotICAgIH0KLSAgIH0KLX0KLQotCi0gIGZ1bmN0aW9uIGdldEltYWdlVXJsKGltYWdlKQotICB7Ci0gICAgdmFyIG5ld19vcnlfZG9jX2xvYz1udWxsOyAgICAKLSAgICB2YXIgbWFpbkluZGV4X2EgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgibWFpbkluZGV4Iik7IAotICAgIG5ld19vcnlfZG9jX2xvYyA9IG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZi5zdWJzdHJpbmcoMCxtYWluSW5kZXhfYS5pdGVtKDApLmhyZWYubGFzdEluZGV4T2YoIi8iKSk7Ci0gICAgbmV3X29yeV9kb2NfbG9jID0gbmV3X29yeV9kb2NfbG9jICsgIiIgKyBpbWFnZTsKLSAgICByZXR1cm4gbmV3X29yeV9kb2NfbG9jOyAgICAKLSAgfQotCi1NU0ZQaG92ZXIgPQotKCgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk5ldHNjYXBlIikgJiYKLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSAzICkpIHx8Ci0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gNCApKSk7Ci0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQotICB7Ci0gICAgIHZhciBhPW5ldyBJbWFnZSgpOwotICAgICBhLnNyYz1pbWc7Ci0gICAgIHJldHVybiBhOwotICB9Ci0KLSAgICBpZihNU0ZQaG92ZXIpCi0gICAgewotICAgICAgICBSdXBHcmF5PU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmJykpOwotICAgICAgICBSdXBCbHVlPU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3NfYS5naWYnKSk7Ci0gICAgfQotCi0KLS8vbmV3IGNvZGUgdG8gZGlzcGxheSB0aGUgbG9hZCBidXR0b24gb3Igbm90Ci12YXIgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYzsKLWlmIChvcnlfdG9jX2V4aXN0ID09ICJ1bmRlZmluZWQiKSB7Ci0gICBvcnlfdG9jX2V4aXN0ID0gdHlwZW9mIHBhcmVudC5vcnlfdG9jX2ZyYW1lOwotfQotCi1pZiAob3J5X3RvY19leGlzdCA9PSAidW5kZWZpbmVkIikgewotCWRvY3VtZW50LndyaXRlKCI8YSBjbGFzcz1cImV4cGFuZENvbGxhcHNlTGlua1wiIGhyZWY9XCJKYXZhU2NyaXB0OmxvYWRUb3AoKTtcIiBvbm1vdXNlb3Zlcj1cImlmKE1TRlBob3ZlcikgZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwQmx1ZS5zcmM7IHNlbGYuc3RhdHVzPXRyZWVicm93c2VyX2pzX01FU1NBR0UyOyByZXR1cm4gdHJ1ZVwiIG9ubW91c2VvdXQ9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEdyYXkuc3JjOyBzZWxmLnN0YXR1cz0gJyAnO3JldHVybiB0cnVlXCI+IDxicj4gPGltZyBzcmM9XCIiICsgYmFja1BhdGggKyAiaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmIik7Ci0vL1NUQVJUIE5PTi1UUkFOU0xBVEFCTEUKLQlkb2N1bWVudC53cml0ZSgiXCIgIGJvcmRlcj1cIjBcIiBhbGlnbj1cImFic21pZGRsZVwiIGFsdD1cIiIgKyB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMiArICJcIiBuYW1lPVwiIiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UzICsgIlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPiIgKyB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMiArICI8XC9hPiIpOwotLy9FTkQgTk9OLVRSQU5TTEFUQUJMRQotfQotZWxzZSB7Ci0JZG9jdW1lbnQud3JpdGUoIiZuYnNwOyIpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3Nwc2NyZWVuLmh0bSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zcHNjcmVlbi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmZjU2ZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3Nwc2NyZWVuLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi0KLTwhLS0gUlBXIE1FVEEgREFUQSBTVEFSVCAtLQotIAotIAotLS0gUlBXIE1FVEEgREFUQSBFTkQgLS0+Ci0KLTxodG1sPgotCi08aGVhZD4KLTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0icm9wLmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiLz4KLTx0aXRsZT5TcGxhc2ggU2NyZWVuPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLQotCi08cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+Ci08aDIgYWxpZ249ImNlbnRlciI+UGxlYXNlIHdhaXQgd2hpbGUgdGhlIHRyZWUgYnJvd3NlciBpcyBiZWluZyBsb2FkZWQuLi48YnIvPjwvaDI+Ci08cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+Ci08IS0tIAotPHAgYWxpZ249ImNlbnRlciI+PGltZyBzcmM9ImltYWdlcy9zcGxhc2guZ2lmIiBhbHQ9IldlbGNvbWUgdG8gdGhlIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiLz48L3A+Ci0gLS0+Ci08YnIvPgotPGJyLz4KLQotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9jb21tb24uY3NzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2NvbW1vbi5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ5MGEwYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2NvbW1vbi5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw1OTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi1hCi17CQotCWNvbG9yOiAjMzM2Njk5OwotfQotCi1hLnRvcHJpZ2h0bmF2OmFjdGl2ZSB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19Ci0KLWEudG9wcmlnaHRuYXZncmV5OmFjdGl2ZSB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19Ci0KLQotYS5iYXNpYwoteyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci19Ci0JCi1hLnRvcHJpZ2h0bmF2Z3JleTpob3ZlciB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19IAotYS50b3ByaWdodG5hdjpob3ZlciB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19IC8qIGZvbnQgZm9yIGFjdGlvbiBvbiBjb250ZW50IHBhZ2UgdXN1YWxseSBsb2NhdGVkIG9uIHRvcCBvZiBwYWdlIDtpZS4sIHNlbGVjdCBhbGwqLwotYS5hY3Rpb24KLXsgIAotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTFweDsJCi19IAotCi1hLmNvcHlyaWdodAoteyAJCi0gICBjb2xvcjogIzMzNjY5OTsgICAgCi0JZm9udC1zaXplIDogMTBweDsKLSB9ICAKLSAKLWEubmF2dHJlZQoteyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTFweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0gCi0gCi0vKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byB0aGlzIGVsZW1lbnQgaW5zdGVhZCBvZiB0aGUgb3V0ZXJtb3N0IGNlbGwgKi8gCi1hLmFjdGl2ZXRhYgotIHsgCi0gCWNvbG9yOiAjMDAwMDAwOwotIAlmb250LXNpemU6IDEycHg7Ci0gIAl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gIH0KLSAKLSAvKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byB0aGlzIGVsZW1lbnQgaW5zdGVhZCBvZiB0aGUgb3V0ZXJtb3N0IGNlbGwgKi8KLSBhLm5vbmFjdGl2ZXRhYgotIHsKLQljb2xvcjogI2I0YjRiNDsKLQlmb250LXNpemU6IDEycHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotIAotIGEucmVkCi17Ci0JY29sb3I6ICNjYzMzMDA7Ci19Ci0KLWEudG9wYmFyCi17Ci0gIGNvbG9yOiAjNjY2NjY2OwotICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAxMXB4OwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLSAvKiBiZ2NvbG9yICBmb3IgYWN0aW9uIHRleHQgdXN1YWxseSBsb2NhdGVkIG9uIHRvcCBvZiBwYWdlO2llLiwgc2VsZWN0IGFsbCovCi0uYWN0aW9uYmcKLXsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotIH0KLSAKLS5iZ2JsYWNrCi17IAotIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7Ci0gfQotIAotLmJnd2hpdGUKLXsgCi0gYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLSB9IAotICAKLWJvZHkgCi17Ci0JYmFja2dyb3VuZC1jb2xvciA6ICNmZmZmZmY7ICAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsJCi19Ci0KLS5ib2xkCi17IAotICAgZm9udC13ZWlnaHQgOiA2MDA7Ci0gfQotCi0gLmJvdHRvbWJhcmRyawoteyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAzMzY2OwotIH0KLQotCi0uYm90dG9tYmFybGlnaHQKLXsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzMzOTljYzsKLSB9Ci0KLS5ib3R0b21iYXJzaGFkb3cKLXsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLSB9Ci0gCi0uYnV0dG9ucwotIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotICAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwkKLX0KLQotLmNvZGUKLXsgCi0gICBmb250LWZhbWlseTogQ291cmllciBOZXcsIENvdXJpZXIsIG1vbm87ICAgCi0gICBmb250LXNpemU6IDEycHg7Ci0gfQotCi0gLyptZWRpdW0gZ3JleSBjZWxsIGJhY2tncm91bmQqLwotLmNvbnRlbnRib3JkZXIKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLX0KLQotIC8qIGZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0ICovCi0uY29tbWVudHMKLXsgCQotCWZvbnQtc2l6ZTogMTFweDsJCi0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLmNvcHlyaWdodAoteyAKLQljb2xvciA6ICM5OTk5OTk7Ci0JZm9udC1zaXplIDogMTBweDsKLSB9Ci0gCi0gLmRpYWxnYnhzaGFkb3cyIAoteyAgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjODQ4NDg0OwotfQotCi0gLmRpYWxvZ3VlYm94Ym9yZGVyCi17IAotIGJhY2tncm91bmQtY29sb3I6ICMzMzMzMzMKLSB9Ci0gCi0gLmRpYWxvZ3VlYm94YmcgCi17ICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDJkMmQyCi19Ci0gCi0uZGlhbG9ndWVib3hoaWdobGlnaHQgCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLSAuZGlhbG9ndWVib3hNZWRpdW0KLXsgCi0gYmFja2dyb3VuZC1jb2xvcjogIzhiOGI4YgotIH0KLSAKLSAuZGlhbG9ndWVib3hUaXRsZQotIHsJICAgCi0JZm9udC1zaXplOiAxNHB4OwotCWZvbnQtd2VpZ2h0IDogYm9sZDsKLX0KLSAKLS5kaXZpZGVyCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNmNmY5ZjA7Ci19Ci0gCi1oMQoteyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxN3B4OwkKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKm1haW4gaGVhZGVyIGZvciBmcmFtZSBuYXZpZ2F0aW9uLCBpZSwgY2xlYXJjYXNlIG1lcmdlIGZpbGVzKi8KLS5oZWFkZXJtYWluCi17ICAKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE3cHg7CQotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qcmVwbGFjaW5nIHNpZGVtZW51X2JvbGRsZWZ0IG1vdmluZyBmb3J3YXJkKi8KLS5uYXZsZWZ0Ym9sZAotewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0vKmxlZnQgbmF2IHN1Ym1lbnUqLwotLm5hdmxlZnRzdWIKLXsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS8qLmxlZnRtZW51YWN0aXZlKi8KLS5zaWRlbWVudV9ib2xkbGVmdF9zZWxlY3RlZAotewotCWNvbG9yOiAjY2MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0vKnVzZSBuYXZsZWZ0Ym9sZCBpbnN0ZWFkIHRvIHdvcmsgaW4gTlM2Ki8KLS5zaWRlbWVudV9ib2xkbGVmdAotewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uc2lkZW1lbnVfYnVsbGV0X2NvbG9yZWQKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2NkMzMwMTsKLX0KLQotLmxlZnRtZW51Ci0gewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLS5zaWRlbWVudV9idWxsZXRfZ3JleQotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0uc2lkZW1lbnVfc3RhbmRhcmQKLXsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS5zaWRlbWVudV9zdGFuZGFyZF9zZWxlY3RlZAotewotCWNvbG9yOiAjY2MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLnRleHRncmF5Ci17ICAKLQljb2xvcjogIzk5OTk5OTsJCi19Ci0KLS5oMQoteyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMHB4OwkKLQlmb250LXdlaWdodDogNDAwOwotfQotCi0uaGVhZGVyYmx1ZQotewotCWNvbG9yOiAjMDA2Njk5OwkKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWkKLXsKLQlmb250LXN0eWxlIDogaXRhbGljOwotfQotCi0uaWNvbmJvcmRlcgoteyAKLSBiYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotfQotCi1pbnB1dAotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDEycHg7Ci19IAotCi1pbnB1dC5weDI1Ci17Ci0gICAgd2lkdGg6IDI1cHgKLX0KLQotaW5wdXQucHg0NQotewotICAgIHdpZHRoOiA0NXB4Ci19Ci0KLS8qCi0xLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRSwgYnV0IE5TCi0qLwotaW5wdXQubWF4NTAKLXsKLQl3aWR0aDogMzYwcHg7Ci19Ci0KLWlucHV0LnB4ODUKLXsKLSAgICB3aWR0aDogODVweAotfQotCi1pbnB1dC5weDEzNQotewotICAgIHdpZHRoOiAxMzVweAotfQotCi0KLWlucHV0LnB4MTU1Ci17Ci0gICAgd2lkdGg6IDE1NXB4Ci19Ci0KLWlucHV0LnB4MjMwCi17Ci0gICAgd2lkdGg6IDIzMHB4Ci19Ci0KLQotaW5wdXQucHgzMDUKLXsKLSAgICB3aWR0aDogMzA1cHg7Ci19Ci0KLS5sZWZ0bmF2aGVhZCAKLSB7Ci0gICBjb2xvcjogIzAwMDAwMDsKLQlmb250LXdlaWdodDogYm9sZDsJCi0JZm9udC1zaXplOiAxM3B4OwkKLX0gCi0KLS5sZWZ0bmF2bGFiZWwKLXsKLWNvbG9yOiAjMDAwMDAwOwotZm9udC13ZWlnaHQgOiA2MDA7Ci1mb250LXNpemU6IDExcHg7Ci0gfQotIAotLyp0b3BuYXYqLyAKLS5taWRiYXJsaWdodAoteyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMzM5OWNjOwotIH0KLQotLyp0b3BuYXYqLyAKLSAubWlkYmFybWVkCi17IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7Ci0gfQotICAKLS5wYWdlYm9sZAoteyAKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXdlaWdodCA6IDYwMDsJCi0gfQotCi0gLypmb250IGZvciBwcmV2aW91cyAmIG5leHQgaW4gcGFnaW5hdGlvbiovCi0ucGFnZXN0ZXBzCi17IAotCWNvbG9yOiAjNjc2NzY3OwkKLQlmb250LXNpemU6IDExcHg7Ci0JIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSB9Ci0KLSAvKnVzZSBmb3IgcG9wdXBtZW51cyBidXQgbm90IGluY2x1ZGluZyB0b3AgbmF2Ki8KLS5wb3B1cHRleHQKLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0gCi0gCi1zZWxlY3QKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxMnB4OwotfQotCi1zZWxlY3Quc2VscHgxNDQKLXsKLSAgICB3aWR0aDogMTQ0cHg7Ci19Ci0KLS5zbWFsbHRleHQKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWNvbG9yOiAjMDAwMDAwOwotfQotCi0udGFibGVoZWFkZXIKLXsgIAotCWNvbG9yOiAjMzMzMzMzOwkKLQlmb250LXNpemU6IDEzcHg7CQotICAgIGZvbnQtd2VpZ2h0OiBib2xkCi19Ci0KLS8qIGZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0ICovCi10ZAotewotICBjb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7CQotfQotCi10ZC5hY3RpdmV0YWIKLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIGEgc2ltaWxhciBlbGVtZW50IGZvciBsaW5rcyAqLwotIHsgCi0gCWJhY2tncm91bmQtY29sb3I6ICNjNGM0YzQ7Ci0gIH0KLSAKLSB0ZC5ub25hY3RpdmV0YWIKLSAvKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byBhIHNpbWlsYXIgZWxlbWVudCBmb3IgbGlua3MgKi8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLnRkTGlnaHQKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLypkYXJrIGdyZXkgY2VsbCBiYWNrZ3JvdW5kIGFuZCBib2xkIHRleHQgKi8KLSAudGREYXJrQm9sZAotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0udG9wZnJhbWViZyAKLXsgIGJhY2tncm91bmQtY29sb3I6ICNkMmQyZDI7Ci19Ci0KLS50b3BmcmFtZWJnR3JleWVkCi17ICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWRlZGVkOwotfQotCi0udG9wZnJhbWVoaWdobGlnaHQgCi17ICAKLWJhY2tncm91bmQtY29sb3I6ICNiNmI1YjU7Ci19Ci0KLS50b3BmcmFtZWhpZ2hsaWdodEdyZXllZAoteyAgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjZTFlMWUxOwotfQotCi0udG9wZnJhbWVzaGFkb3cgCi17ICAKLWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS50b3BmcmFtZXNoYWRvd0dyZXllZAoteyAgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjY2VjZWNlOwotfQotCi0udG9wZnJhbWVoaWdobGlnaHQyIAoteyAKLSBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotIH0KLSAKLSAudG9wZnJhbWVoaWdobGlnaHQyR3JleWVkCi17IAotIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7Ci0gfSAKLSAKLSAudG9wZnJhbWVsb2dvYmcgCi17ICAKLWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7Ci19Ci0KLS50b3BmcmFtZWxvZ29iZ0dyZXllZAoteyAgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjOTljMmQ2OwotfQotCi0udG9wbGVmdG5hdgotewkKLSAgICBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWNvbG9yOiAjMDAwMDAwOwotfQotCi0udG9wbGVmdG5hdkdyZXllZAotewkKLSAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQl9Ci0KLS50b3BsZWZ0bmF2Ym9sZCAKLXsgCi1mb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLWZvbnQtc2l6ZTogMTBweDsgCi10ZXh0LWRlY29yYXRpb246IG5vbmU7IAotZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS50b3BsZWZ0bmF2Ym9sZEdyZXllZAoteyAKLWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyAKLWZvbnQtc2l6ZTogMTBweDsgCi1jb2xvcjogIzk5OTk5OTsKLXRleHQtZGVjb3JhdGlvbjogbm9uZTsgCi1mb250LXdlaWdodDogYm9sZDsKLX0KLQotLnRvcHJpZ2h0bmF2Ci17Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCWNvbG9yOiAjZmZmZmZmOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnRvcHJpZ2h0bmF2Z3JleQotewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3BiYXJkaXZpZGVyCi0geyAKLSBiYWNrZ3JvdW5kLWNvbG9yOiAjMzM5OWNjIAotIH0KLQotIC50b3BiYXJkaXZpZGVyR3JleWVkCi0geyAKLSBiYWNrZ3JvdW5kLWNvbG9yOiAjYWRkNmViCi0gfSAgCi0KLSB0ci5iZ21pZGZyYW1lCi0gLyogdGhpcyB3YXMgaW5pdGlhbGx5IGRlY2xhcmVkIHRoZSBzYW1lIGNvbG91ciBhcyB0aGUgY2xhc3MgdG9wZnJhbWUgYmcgYnV0IGJlY2F1c2UgaXQgbGllcyBpbiBhIGRpZmZlcmVudCBmdW5jdGlvbmFsIGFyZWEsIGhhcyBiZWVuIHJlY3JlYXRlZCBoZXJlICAqLwotewotCWJhY2tncm91bmQtY29sb3I6ICNkMmQyZDI7Ci19Ci0gCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvY29tbW9uX2Fkdi5jc3MgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvY29tbW9uX2Fkdi5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0NTkyYTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2NvbW1vbl9hZHYuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNjEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotLyptdXN0IGFkZCBmb250IHR5cGUgaWYgY2xhc3MgaXMgYmVpbmcgdXNlZCBhcyBib3RoIGxpbmsgYW5kICBuby1saW5rIHRleHQqLwotCi1hIHsKLQljb2xvcjogIzMzNjY5OTsKLX0KLQotLyogYWN0aW9uIHRleHQgdXN1YWxseSBsb2NhdGVkIG9uIHRvcCBvZiBwYWdlO2llLiwgc2VsZWN0IGFsbCovCi1hLmFjdGlvbmxpbmsgewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtc2l6ZTogMTFweDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0vKiBmb250IGZvciBhY3Rpb247aWUuLCBzZWxlY3QgYWxsKi8KLWEuYWN0aW9uc2VsZWN0b3IgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotYS50b3ByaWdodG5hdjphY3RpdmUgewotCWNvbG9yOiAjOTlDQ0NDOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTphY3RpdmUgewotCWNvbG9yOiAjQ0MwMDAwOwotfQotCi0KLWEuYmFzaWMgewotCWNvbG9yOiAjMDAwMDAwOwotfQotCi1hLmJyZWFkY3J1bWJzIHsJCi0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b24gewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogRGVzY29wZWQsIEl0J3Mgbm90IHVzZWQgaW4gY3VycmVudCBwcm9qZWN0cywgdG8gYmUgYXJjaGl2ZWQgYWZ0ZXIgNiBtb250aHMuIEFsaSBSb2tuaSwgMDkvMDkvMDIgKi8KLS8qIGZvciBjb250ZXh0IHRvb2xiYXIgYnV0dG9ucyBpbiBNdWx0aXNpdGUsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b24yIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLWEuYnV0dG9uOmFjdGl2ZSB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b246aG92ZXIgewotCWNvbG9yOiAjMzMzMzMzOwotfQotCi1hLmNvcHlyaWdodCB7Ci0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1zaXplOiAxMHB4OwotfSAKLQotLyphY3Rpb25iYXIgb24gd2hpdGUgYmFja2dyb3VuZCovCi0uYWN0aW9uc2VsZWN0MiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKmFjdGlvbmJhciBhcHBlYXJzIG9uIHRvcCBhbmQvb3IgYm90dG9tIG9mIHBhZ2UqLwotLmFjdGlvbnNlbGVjdG9yIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTlFOUU5OwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLypjb2x1bW4gaGVhZGluZ3MqLwotYS5mb3JtdGJsaGVhZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLWEudG9wcmlnaHRuYXZncmV5OmhvdmVyIHsKLQljb2xvcjogI0NDMDAwMDsKLX0gCi1hLnRvcHJpZ2h0bmF2OmhvdmVyIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0gCi0KLS8qbmF2dHJlZSBpdGVtIG9yIGRvYyovCi1hLm5hdnRyZWVpdGVtIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0gCi0KLS8qc2l0ZW1hcCBoZWFkZXIqLwotYS5zaXRlbWFwaCB7Ci0JZm9udC1zaXplOiAxN3B4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qdXNlZCBpbiBmb3Jnb3QgcGFzc3dvcmQsIGFueSBvdGhlciBzbWFsbCB0ZXh0IGxpbmtzKi8KLWEuc21hbGwgewotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotYiB7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS8qc3RhbmRhcmQgdGV4dCovICAKLS5iYXNpYyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS5iZ2Jhc2ljIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSk7IHVzZSBiZ2Jhc2ljICovCi0uYmd3aGl0ZSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKLX0KLQotLyogc2l6ZSBpbnB1dCBmb3IgYmFzaWMgdGFncyBzdWNoIGFzIHAgYW5kIGxpIHRoYXQgZG8gbm90IGluaGVyaXQgZnJvbSB0ZCAqLyAgCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWNvbG9yIDogI0ZGRkZGRjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JbWFyZ2luLWxlZnQ6IDBweDsKLQltYXJnaW4tdG9wOiAwcHg7Ci0JbWFyZ2luLXJpZ2h0OiAwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uYm9sZCB7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLmJvcmRlcmRyayB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLX0KLQotLyp1c2UgaW4gcG9wdXBzIGFzIGJvcmRlcnMgaW4gTXVsdGlzaXRlKi8gCi0uYm9yZGVycG9wdXAgewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci19Ci0KLS8qYm9yZGVycyB1c2VkIGFyb3VuZCBkYXRhLCBzZWUgUlVQKi8gCi0uYm9yZGVydGJsIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTlFOUU5OwotfQotCi0vKmRlc2lnbiBlbGVtZW50IHNpbXVsYXRpbmcgYSBkaW1lbnNpb25hbCBib3VuZGFyeSB0byBhIHRhYmxlICovIAotLmJvcmRlcnRibDIgewotCWJhY2tncm91bmQtY29sb3I6ICNCREJEQkQ7Ci19Ci0KLS8qdXNlZCBpbiBjb250ZW50IGFyZWEgYXMgYSBob3Jpem9udGFsIGRpdiBpbiBNdWx0aXNpdGUqLwotLmJvcmRlcnRibDMgewotCWJhY2tncm91bmQtY29sb3I6ICNFREVERUQ7Ci19Ci0KLS5icmVhZGNydW1icyB7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKnVzZWQgaW4gdG9wbmF2ICwgc2ltaWxhciB0byBjb250ZXh0IHRvb2xiYXIqLwotLmJ1dHRvbiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypkZXNjb3BlZDsgdXNlIGJ1dHRvbiBpbnN0ZWFkOyB1c2VkIGluIHRvcG5hdiAsIHNpbWlsYXIgdG8gY29udGV4dCB0b29sYmFyKi8KLS5idXR0b24zIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmFjdGl2ZSBuYXZpZ2F0aW9uIGJ1dHRvbiwgbm90IGZvcm0gYnV0dG9ucyovIAotLmJ1dHRvbm9uIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREVERURFOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qbmF2aWdhdGlvbiBidXR0b25zLCBub3QgZm9ybSBidXR0b25zKi8gCi0uYnV0dG9ucyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSktLXVzZSBhLmJ1dHRvbjsgdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLS5idXR0b250eHQgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZGlzYWJsZWQgc3RhdGUgb2Ygbm9uLWltYWdlIGJ1dHRvbiovIAotLmJ1dHRvbnR4dGRzYmwgewotCWNvbG9yOiAjN0U3RTdFOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmNvcHlyaWdodCB7IAotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtc2l6ZTogMTBweDsKLX0KLQotLypibGFjayBjb3B5cmlnaHQgdXNlZCBpbiBSVVAqLwotLmNvcHlyaWdodGIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTBweDsKLX0KLQotZGQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLQltYXJnaW4tbGVmdDogLTFweDsKLX0KLQotLypkZWZlY3QgcGFnZSBzdWJoZWFkICwgdXNlZCBpbiBwcm9qZWN0IGNvbnNvbGUqLwotLmRlZmVjdHN1YmhkIHsKLQljb2xvcjogIzAwNjY5OTsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5kaWFsZ2J4c2hhZG93MiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NDsKLX0KLQotLmRpYWxvZ3VlYm94YmcgewotCWJhY2tncm91bmQtY29sb3I6ICNEMkQyRDI7Ci19Ci0KLS8qYmFja2dyb3VuZCBmb3IgbG9naW4gcGFnZXMqLwotLmRpYWxvZ3VlYm94YmcyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0uZGlhbG9ndWVib3hib3JkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICMzMzMzMzM7Ci19Ci0KLS5kaWFsb2d1ZWJveGhpZ2hsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLX0KLQotLmRpYWxvZ3VlYm94bWVkaXVtIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOEI4QjhCOwotfQotCi1kaXYgeyAKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLX0gCi0KLS8qdXNlZCB0byBhZmZlY3QgcmlnaHQgbWFyZ2luKi8gCi1kaXYubWFyZ2lucnQgewotCWNsZWFyOiByaWdodDsKLQlmbG9hdDogcmlnaHQ7Ci0Jd2lkdGg6IDdweDsKLX0KLQotZGl2Lm1hcmdpbnMgeyAKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogN3B4OwotCW1hcmdpbi10b3A6IDI1cHg7Ci0JbWFyZ2luLXJpZ2h0OiA3cHg7Ci19Ci0KLS8qZm9yIHBhZ2VzIHdpdGggYnV0dG9uIG5hdmlnYXRpb24gb24gdG9wKi8gIAotZGl2Lm1hcmdpbnMyMCB7Ci0JZmxvYXQ6IGxlZnQ7Ci0JbWFyZ2luLWxlZnQ6IDdweDsKLQltYXJnaW4tdG9wOiAyMHB4OwotCW1hcmdpbi1yaWdodDogN3B4OwotfQotCi0vKmFkZHMgMTAgcHggcGFkZGluZyBhcm91bmQgdGV4dCovCi1kaXYucGFkMTAgewotCXBhZGRpbmc6IDEwcHg7Ci19Ci0KLWRsIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci19Ci0KLS8qcmVtb3ZlcyBkZWZhdWx0IGJvdHRvbSBtYXJnaW4sIGRvZXNuJ3Qgd29yayBpbiBOUzQuN3ggKi8gIAotZGwuZGF0YSB7Ci0JbWFyZ2luLWJvdHRvbTogLTFweDsKLX0KLQotLyp0aXRsZSBmb3IgZXJyb3IgbWVzc2FnZXMqLwotLmVycm9yIHsKLQljb2xvcjogI0NDMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDI3cHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLmZvcm10YmxoZWFkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLypjdXJyZW50IHNvcnRlZCBjb2x1bW4qLwotLmZvcm10YmxoZWFkYyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U0RTRFNDsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS8qdG8gcmVwbGFjZSBoMSBhbmQgY29udGVudGhlYWRlciBsYXJnZSovCi0uaGVhZGVyMSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMnB4OwotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLS8qaGVhZGVycyB3aXRoaW4gcGFnZSovCi0uaGVhZGVyMiB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOXB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS8qdXN1YWxseSB1c2VkIG5leHQgdG8gaGVhZGVyMSwgZm9yIGRvY3VtZW50IHJvb3QgZm9sZGVyKi8KLS5oZWFkZXIzIHsKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDIycHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotaSB7Ci0JZm9udC1zdHlsZSA6IGl0YWxpYzsKLX0KLQotLmljb25ib3JkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci19Ci0KLS8qdXNlZCBpbiBjb250cm9sc3RyaXAqLwotLmljb25vZmYgewotCWZsb2F0OiByaWdodDsKLQlwb3NpdGlvbjogYWJzb2x1dGU7Ci0JdG9wOjFweDsKLQl2aXNpYmlsaXR5OmhpZGRlbjsKLQl3aWR0aDoxMDAlOwotfQotCi0vKnVzZWQgaW4gY29udHJvbHN0cmlwKi8KLS5pY29ub24gewotCWZsb2F0OiByaWdodDsKLQlwb3NpdGlvbjogYWJzb2x1dGU7Ci0JdG9wOjFweDsKLQl2aXNpYmlsaXR5OnNob3c7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS8qZm9udCBzaXplIHNldHVwIHNob3duIGluIHRoZSBpbnB1dCBib3ggd2hpY2ggaXMgaW5oZXJpdGVkIGJ5IGlucHV0WFgqLwotaW5wdXQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLyogMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUgKi8KLWlucHV0Lm1heDUwIHsKLQl3aWR0aDogMzYwcHg7Ci19Ci0KLS8qCi0xLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRQotKi8KLWlucHV0LnB4ODUgewotCXdpZHRoOiA4NXB4Ci19Ci0KLWlucHV0LnJhZGlvIHsKLQotfQotCi0vKnVzZWQgaW4gdHJlZXNjcmlwdHMsIGxlZnRuYXYqLwotLmxlZnRtZW51IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0ubm90ZXMgewotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLX0KLQotcCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotfQotCi0vKmZvbnQgZm9yIHRoZSBudW1iZXJzIGluIHBhZ2luYXRpb24gbGlicmFyeSovCi0ucGFnZW51bWJlciB7Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmZvbnQgZm9yIHByZXZpb3VzICYgbmV4dCBpbiBwYWdpbmF0aW9uKi8KLS5wYWdlc3RlcHMgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLypwb3B1cCBoZWFkZXIqLwotLnBvcGgxIHsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiBib2xkOwotfQotCi0vKnVzZWQgaW4gdHJlZXNjcmlwdHMqLwotLnBvcGxlZnRtZW51IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRjBGMEYwOwotCWJvcmRlcjogdGhpbiBzb2xpZCAjQ0NDQ0NDOwotCWxlZnQ6IDIxMHB4OwkvKiBpdCdzIG5vdCB3b3JraW5nIG9uIG5zIDYuMiwgaWUgNS41LCBpZSA2IGFuZCBucyA3LCBwb3NzaWJseSBjYW4gYmUgcmVtb3ZlZCBzYWZlbHksIEFsaSBSb2tuaSwgMDkvMTgvMDIqLwotCXBhZGRpbmc6IDJweDsKLQlwb3NpdGlvbjogYWJzb2x1dGU7Ci0JdG9wOiAyNXB4OwkvKiBpdCdzIG5vdCB3b3JraW5nIG9uIG5zIDYuMiwgaWUgNS41LCBpZSA2IGFuZCBucyA3LCBwb3NzaWJseSBjYW4gYmUgcmVtb3ZlZCBzYWZlbHksIEFsaSBSb2tuaSwgMDkvMTgvMDIqLwotCXZpc2liaWxpdHk6IGhpZGRlbjsKLQl3aWR0aDogYXV0bzsKLQl6LWluZGV4OiAxMDsKLX0KLQotLypwcm9ncmVzc2JhciBib3JkZXJzIGluIE11bHRpc2l0ZSovCi0ucHJvZ3Jlc3NiYXJicmQgewotCWJhY2tncm91bmQtY29sb3I6ICM2NjY2NjY7Ci19Ci0KLXNlbGVjdCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSktLXVzZSBidXR0b25zMzsgdXNlZCBpbiB0b3BuYXYqLwotLnNtYWxsdGV4dCB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZm9udCBmb3IgcmVndWxhciBjb250ZW50IHRleHQgKi8KLXRkIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci19Ci0KLS8qIHRoZXNlIGJ1dHRvbiBzdHlsZXMgYXJlIGZvciB0aGUgdGV4dHVhbCBidXR0b25zIGludGVuZGVkIHRvIHJlcGxhY2UgaW1hZ2UgY29uc3RydWN0cyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8gCi10ZC5idXR0b25ib2R5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRDRENEQ0OwotfQotCi0vKiBkaXNhYmxlZCB2ZXJzaW9uICovIAotdGQuYnV0dG9uYm9keWRzYmwgewotCWJhY2tncm91bmQtY29sb3I6ICNEQURBREE7Ci19Ci0KLS8qIGRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSk7IHVzZSBiZ2Jhc2ljICovCi10ZC5idXR0b25oaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci19Ci0KLS8qbm9uLWltYWdlIGJ1dHRvbiovCi10ZC5idXR0b25zaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM2RDZENkQ7Ci19Ci0KLS8qIG5vbi1pbWFnZSBidXR0b24tLWRpc2FibGVkIHZlcnNpb24gKi8KLXRkLmJ1dHRvbnNoYWRvd2RzYmwgewotCWJhY2tncm91bmQtY29sb3I6ICNBMkEyQTI7Ci19Ci0KLS8qIGRhdGEgd2l0aGluIGEgdGFibGUgaGlnaGxpZ2h0ZWQgaW4gbGlnaHQgZ3JheSovCi10ZC50YmxoaWdobHQzIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTlFOUU5OwotfSAgIAotCi0vKmdyYXkgZGF0YSBoaWdobGlnaHQgb3IgcGFnZSBiYWNrZ3JvdW5kKi8gCi0udGRsaWdodDEgewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLXRleHRhcmVhIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wYmFyZGl2aWRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzMzOTlDQzsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRDJEMkQyOwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSktLXVzZSBib3JkZXJ0YmwzOyB1c2VkIGluIGNvbnRlbnQgYXJlYSBhcyBhIGhvcml6b250YWwgZGl2IGluIE11bHRpc2l0ZSovCi0udG9wZnJhbWViZ2dyZXllZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VERURFRDsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWhpZ2hsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0I2QjVCNTsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWhpZ2hsaWdodDIgewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVsb2dvYmcgewotCWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVzaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS8qZ2xvYmFsIGljb24gb3BlcmF0aW9ucyB0b29sYmFyKi8KLS50b3BsZWZ0bmF2IHsJCi0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypnbG9iYWwgaW5wdXQgb3BlcmF0aW9ucyB0b29sYmFyKi8KLS50b3BsZWZ0bmF2Ym9sZCB7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnRleHQgb24gdG9wbmF2LCB0b3AgcmlnaHQgc2VjdGlvbiovCi0udG9wcmlnaHRuYXYgewotCWNvbG9yOiAjRkZGRkZGOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3ByaWdodG5hdmdyZXkgCi17Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypsaXN0LXN0eWxlLWltYWdlOiB1cmwoaW1hZ2VzL2Rvd25idXR0b24uZ2lmKTsqLwotdWwgewotCWxpc3Qtc3R5bGUtdHlwZTogc3F1YXJlOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2NvbW1vbl9hZHZVTlguY3NzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2NvbW1vbl9hZHZVTlguY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNTk1MGE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9jb21tb25fYWR2VU5YLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDYxMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLS8qbXVzdCBhZGQgZm9udCB0eXBlIGlmIGNsYXNzIGlzIGJlaW5nIHVzZWQgYXMgYSBsaW5rIGFzIHdlbGwgYXMgbm8tbGluayovCi0KLWEgewotCWNvbG9yOiAjMzM2Njk5OwotfQotCi1hLnRvcHJpZ2h0bmF2OmFjdGl2ZSB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19Ci0KLWEudG9wcmlnaHRuYXZncmV5OmFjdGl2ZSB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19Ci0KLQotLyogYWN0aW9uIHRleHQgdXN1YWxseSBsb2NhdGVkIG9uIHRvcCBvZiBwYWdlO2llLiwgc2VsZWN0IGFsbCovCi1hLmFjdGlvbmxpbmsgewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtc2l6ZTogMTZweDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotIAotLyogZm9udCBmb3IgYWN0aW9uO2llLiwgc2VsZWN0IGFsbCovCi1hLmFjdGlvbnNlbGVjdG9yIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLWEuYmFzaWMgewotCWNvbG9yOiAjMDAwMDAwOwotfQotCi1hLmJyZWFkY3J1bWJzIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucywgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbiB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBEZXNjb3BlZCwgSXQncyBub3QgdXNlZCBpbiBjdXJyZW50IHByb2plY3RzLCB0byBiZSBhcmNoaXZlZCBhZnRlciA2IG1vbnRocy4gQWxpIFJva25pLCAwOS8wOS8wMiAqLwotLyogZm9yIGNvbnRleHQgdG9vbGJhciBidXR0b25zIGluIE11bHRpc2l0ZSwgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbjIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuYnV0dG9uOmFjdGl2ZSB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b246aG92ZXIgewotCWNvbG9yOiAjMzMzMzMzOwotfQotCi1hLmNvcHlyaWdodCB7Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1zaXplOiAxNXB4OwotfQotCi0vKmFjdGlvbmJhciBvbiB3aGl0ZSBiYWNrZ3JvdW5kKi8KLS5hY3Rpb25zZWxlY3QyIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qYWN0aW9uYmFyIGFwcGVhcnMgb24gdG9wIGFuZC9vciBib3R0b20gb2YgcGFnZSovCi0uYWN0aW9uc2VsZWN0b3IgewotCWJhY2tncm91bmQtY29sb3I6ICNFOUU5RTk7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxNnB4OwotfQotCi0vKmNvbHVtbiBoZWFkaW5ncyovCi1hLmZvcm10YmxoZWFkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTpob3ZlciB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19IAotYS50b3ByaWdodG5hdjpob3ZlciB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19IC8qbmF2dHJlZSBpdGVtIG9yIGRvYyovCi1hLm5hdnRyZWVpdGVtIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnNpdGVtYXAgaGVhZGVyKi8KLWEuc2l0ZW1hcGggewotCWZvbnQtc2l6ZTogMjVweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKnVzZWQgaW4gZm9yZ290IHBhc3N3b3JkLCBhbnkgb3RoZXIgc21hbGwgdGV4dCBsaW5rcyovCi1hLnNtYWxsIHsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLWIgewotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qc3RhbmRhcmQgdGV4dCovCi0uYmFzaWMgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLQlmb250LXdlaWdodDogNDAwOwotfQotCi0uYmdiYXNpYyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKLX0KLQotLypkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpOyB1c2UgYmdiYXNpYyAqLwotLmJnd2hpdGUgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci19Ci0KLS8qIHNpemUgaW5wdXQgZm9yIGJhc2ljIHRhZ3Mgc3VjaCBhcyBwIGFuZCBsaSB0aGF0IGRvIG5vdCBpbmhlcml0IGZyb20gdGQgKi8gCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLQltYXJnaW4tbGVmdDogMHB4OwotCW1hcmdpbi1yaWdodDogMHB4OwotCW1hcmdpbi10b3A6IDBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5ib2xkIHsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0uYm9yZGVyZHJrIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotfQotCi0vKnVzZSBpbiBwb3B1cHMgYXMgYm9yZGVycyBpbiBNdWx0aXNpdGUqLyAKLS5ib3JkZXJwb3B1cCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RFREVERTsKLX0KLQotLypib3JkZXJzIHVzZWQgYXJvdW5kIGRhdGEsIHNlZSBSVVAqLwotLmJvcmRlcnRibCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U5RTlFOTsKLX0KLQotLypkZXNpZ24gZWxlbWVudCBzaW11bGF0aW5nIGEgZGltZW5zaW9uYWwgYm91bmRhcnkgdG8gYSB0YWJsZSAqLyAKLS5ib3JkZXJ0YmwyewotCWJhY2tncm91bmQtY29sb3I6ICNCREJEQkQ7Ci19Ci0KLS8qdXNlZCBpbiBjb250ZW50IGFyZWEgYXMgYSBob3Jpem9udGFsIGRpdiBpbiBNdWx0aXNpdGUqLwotLmJvcmRlcnRibDMgewotCWJhY2tncm91bmQtY29sb3I6ICNFREVERUQ7Ci19Ci0KLS5icmVhZGNydW1ic3sKLWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLyp1c2VkIGluIHRvcG5hdiAsIHNpbWlsYXIgdG8gY29udGV4dCB0b29sYmFyKi8KLS5idXR0b24gewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qZGVzY3BlZDsgdXNlIGJ1dHRvbiBpbnN0ZWFkOyB1c2VkIGluIHRvcG5hdiAsIHNpbWlsYXIgdG8gY29udGV4dCB0b29sYmFyKi8KLS5idXR0b24zIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmFjdGl2ZSBzdGF0ZSBvZiBuYXZpZ2F0aW9uIGJ1dHRvbiBpbiBjb250ZXh0IHRvb2xiYXIqLyAKLS5idXR0b25vbiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RFREVERTsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypuYXZpZ2F0aW9uIGJ1dHRvbnMgaW4gY29udGV4dCB0b29sYmFyKi8KLS5idXR0b25zIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDE1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwkKLX0KLQotLyogZGVzY29wZWQgKHJlbW92ZSBhZnRlciB3YS1sdCByZWxlYXNlKS0tdXNlIGEuYnV0dG9uOyB0aGVzZSBidXR0b24gc3R5bGVzIGFyZSBmb3IgdGhlIHRleHR1YWwgYnV0dG9ucyBpbnRlbmRlZCB0byByZXBsYWNlIGltYWdlIGNvbnN0cnVjdHMgZm9yIGludGVybmFsaXphdGlvbiovCi0uYnV0dG9udHh0IHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGRpc2FibGVkIHN0YXRlIG9mIG5vbi1pbWFnZSBidXR0b24qLyAKLS5idXR0b250eHRkc2JsIHsKLQljb2xvcjogIzdFN0U3RTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5jb3B5cmlnaHQgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtc2l6ZTogMTVweDsKLX0KLQotLypibGFjayBjb3B5cmlnaHQgdXNlZCBpbiBSVVAqLwotLmNvcHlyaWdodGIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTVweDsKLX0KLQotZGQgewotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OwotCW1hcmdpbi1sZWZ0OiAtMXB4OwotfQotCi0vKmRlZmVjdCBwYWdlIHN1YmhlYWQgLCB1c2VkIGluIHByb2plY3QgY29uc29sZSovCi0uZGVmZWN0c3ViaGQgewotCWNvbG9yOiAjMDA2Njk5OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uZGlhbGdieHNoYWRvdzIgewotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS5kaWFsb2d1ZWJveGJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRDJEMkQyOwotfQotCi0vKmJhY2tncm91bmQgZm9yIGxvZ2luIHBhZ2VzKi8KLS5kaWFsb2d1ZWJveGJnMiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLmRpYWxvZ3VlYm94Ym9yZGVyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMzMzMzMzOwotfQotCi0uZGlhbG9ndWVib3hoaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLS5kaWFsb2d1ZWJveG1lZGl1bSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzhCOEI4QjsKLX0KLQotZGl2IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLX0KLQotLyp1c2VkIHRvIGFmZmVjdCByaWdodCBtYXJnaW4qLwotZGl2Lm1hcmdpbnJ0IHsKLQljbGVhcjogcmlnaHQ7Ci0JZmxvYXQ6IHJpZ2h0OwotCXdpZHRoOiA3cHg7Ci19Ci0KLWRpdi5tYXJnaW5zIHsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogN3B4OwotCW1hcmdpbi1yaWdodDogN3B4OwotCW1hcmdpbi10b3A6IDI1cHg7Ci19Ci0KLS8qZm9yIHBhZ2VzIHdpdGggYnV0dG9uIG5hdmlnYXRpb24gb24gdG9wKi8gCi1kaXYubWFyZ2luczIwIHsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogN3B4OwotCW1hcmdpbi1yaWdodDogN3B4OwotCW1hcmdpbi10b3A6IDIwcHg7Ci19Ci0KLS8qYWRkcyAxMCBweCBwYWRkaW5nIGFyb3VuZCB0ZXh0Ki8KLWRpdi5wYWQxMCB7Ci0JcGFkZGluZzogMTBweDsKLX0KLQotZGwgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLX0KLQotLypyZW1vdmVzIGRlZmF1bHQgYm90dG9tIG1hcmdpbiwgZG9lc24ndCB3b3JrIGluIE5TNC43eCAqLyAKLWRsLmRhdGEgewotCW1hcmdpbi1ib3R0b206IC0xcHg7Ci19Ci0KLS8qdGl0bGUgZm9yIGVycm9yIG1lc3NhZ2VzKi8KLS5lcnJvciB7Ci0JY29sb3I6ICNDQzAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAzMHB4OwotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLS5mb3JtdGJsaGVhZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLypjdXJyZW50IHNvcnRlZCBjb2x1bW4qLwotLmZvcm10YmxoZWFkYyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U0RTRFNDsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLyp0byByZXBsYWNlIGgxIGFuZCBjb250ZW50aGVhZGVyIGxhcmdlKi8KLS5oZWFkZXIxIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDMzcHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLypoZWFkZXJzIHdpdGhpbiBwYWdlKi8KLS5oZWFkZXIyIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDI4cHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLX0KLQotLyp1c3VhbGx5IHVzZWQgbmV4dCB0byBoZWFkZXIxOyBmb3IgZG9jdW1lbnQgcm9vdCBmb2xkZXIqLwotLmhlYWRlcjMgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMzNweDsKLQlmb250LXdlaWdodDogODAwOwotfQotCi1pIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLS5pY29uYm9yZGVyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREVERURFOwotfQotCi0vKnVzZWQgaW4gY29udHJvbHN0cmlwKi8KLS5pY29ub2ZmIHsKLQlmbG9hdDogcmlnaHQ7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCXRvcDogMXB4OwotCXZpc2liaWxpdHk6IGhpZGRlbjsKLQl3aWR0aDogMTAwJTsKLX0KLQotLyp1c2VkIGluIGNvbnRyb2xzdHJpcCovCi0uaWNvbm9uIHsKLQlmbG9hdDogcmlnaHQ7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCXRvcDogMXB4OwotCXZpc2liaWxpdHk6c2hvdzsKLQl3aWR0aDogMTAwJTsKLX0KLQotCi0vKmZvbnQgc2l6ZSBzZXR1cCBzaG93biBpbiB0aGUgaW5wdXQgYm94IHdoaWNoIGlzIGluaGVyaXRlZCBieSBpbnB1dFhYKi8KLWlucHV0IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qIDEsYnVzaW5lc3Mgc3RhbmRhcmQgbXVsdGlsaW5lIGlucHV0IGJveCAKLTIsdGhpcyBzdHlsZSBvbmx5IGFjdGl2YXRlIGluIElFICovCi1pbnB1dC5tYXg1MCB7Ci0Jd2lkdGg6IDM2MHB4OwotfQotCi0vKgotMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUKLSovCi1pbnB1dC5weDg1IHsKLQl3aWR0aDogODVweDsKLX0KLQotaW5wdXQucmFkaW8geyAKLQotfQotCi0gLyp1c2VkIGluIHRyZWVzY3JpcHRzLCBsZWZ0bmF2Ki8KLS5sZWZ0bWVudSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLm5vdGVzIHsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci19Ci0KLXAgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLX0KLQotLypmb250IGZvciB0aGUgbnVtYmVycyBpbiBwYWdpbmF0aW9uIGxpYnJhcnkqLwotLnBhZ2VudW1iZXIgewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qZm9udCBmb3IgcHJldmlvdXMgJiBuZXh0IGluIHBhZ2luYXRpb24qLwotLnBhZ2VzdGVwcyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0vKnBvcHVwIGhlYWRlciovCi0ucG9waDEgewotCWZvbnQtc2l6ZTogMjRweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLyp1c2VkIGluIHRyZWVzY3JpcHRzKi8KLS5wb3BsZWZ0bWVudSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0YwRjBGMDsKLQlib3JkZXI6IHRoaW4gc29saWQgI0NDQ0NDQzsKLQlsZWZ0OiAyMTBweDsJLyogaXQncyBub3Qgd29ya2luZyBvbiBucyA2LjIsIGllIDUuNSwgaWUgNiBhbmQgbnMgNywgcG9zc2libHkgY2FuIGJlIHJlbW92ZWQgc2FmZWx5LCBBbGkgUm9rbmksIDA5LzE4LzAyKi8KLQlwYWRkaW5nOiAycHg7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCXRvcDogMjVweDsJLyogaXQncyBub3Qgd29ya2luZyBvbiBucyA2LjIsIGllIDUuNSwgaWUgNiBhbmQgbnMgNywgcG9zc2libHkgY2FuIGJlIHJlbW92ZWQgc2FmZWx5LCBBbGkgUm9rbmksIDA5LzE4LzAyKi8KLQl2aXNpYmlsaXR5OiBoaWRkZW47IAotCXdpZHRoOjc1cHg7Ci0Jei1pbmRleDoxMDsJCi19Ci0KLS8qcHJvZ3Jlc3NiYXIgYm9yZGVycyBpbiBNdWx0aXNpdGUqLwotLnByb2dyZXNzYmFyYnJkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNjY2NjY2OwotfQotCi1zZWxlY3QgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLypkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpLS11c2UgYnV0dG9uczM7IHVzZWQgaW4gdG9wbmF2Ki8KLS5zbWFsbHRleHQgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0ICovCi10ZCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNHB4OwotfQotCi0gLyogdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLXRkLmJ1dHRvbmJvZHkgewotCWJhY2tncm91bmQtY29sb3I6ICNENEQ0RDQ7Ci19Ci0KLS8qIGRpc2FibGVkIHZlcnNpb24gKi8KLXRkLmJ1dHRvbmJvZHlkc2JsIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREFEQURBOwotfQotCi0vKiBkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpOyB1c2UgYmdiYXNpYyAqLwotdGQuYnV0dG9uaGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotfQotCi0vKm5vbi1pbWFnZSBidXR0b24qLwotdGQuYnV0dG9uc2hhZG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNkQ2RDZEOwotfQotCi0vKiBub24taW1hZ2UgYnV0dG9uLS1kaXNhYmxlZCB2ZXJzaW9uICovCi10ZC5idXR0b25zaGFkb3dkc2JsIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQTJBMkEyOwotfQotCi0gLyogZGF0YSB3aXRoaW4gYSB0YWJsZSBoaWdobGlnaHRlZCBpbiBsaWdodCBncmF5Ki8KLXRkLnRibGhpZ2hsdDMgewotCWJhY2tncm91bmQtY29sb3I6ICNFOUU5RTk7Ci19Ci0KLS8qZ3JheSBkYXRhIGhpZ2hsaWdodCBvciBwYWdlIGJhY2tncm91bmQqLyAKLS50ZGxpZ2h0MSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLX0KLQotdGV4dGFyZWEgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BiYXJkaXZpZGVyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMzM5OUNDOwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGZyYW1lYmcgewotCWJhY2tncm91bmQtY29sb3I6ICNEMkQyRDI7Ci19Ci0KLS8qZGVzY29wZWQgKHJlbW92ZSBhZnRlciB3YS1sdCByZWxlYXNlKS11c2UgYm9yZGVydGJsMzsgdXNlZCBpbiBjb250ZW50IGFyZWEgYXMgYSBob3Jpem9udGFsIGRpdiBpbiBNdWx0aXNpdGUqLwotLnRvcGZyYW1lYmdncmV5ZWQgewotCWJhY2tncm91bmQtY29sb3I6ICNFREVERUQ7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVoaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNCNkI1QjU7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVoaWdobGlnaHQyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGZyYW1lbG9nb2JnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGZyYW1lc2hhZG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjODQ4NDg0OwotfQotCi0vKmdsb2JhbCBpY29uIG9wZXJhdGlvbnMgdG9vbGJhciovCi0udG9wbGVmdG5hdiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypnbG9iYWwgaW5wdXQgb3BlcmF0aW9ucyB0b29sYmFyKi8KLS50b3BsZWZ0bmF2Ym9sZCB7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGJyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnRleHQgb24gdG9wbmF2LCB0b3AgcmlnaHQgc2VjdGlvbiovCi0udG9wcmlnaHRuYXYgewotCWNvbG9yOiAjRkZGRkZGOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTRweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3ByaWdodG5hdmdyZXkKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmxpc3Qtc3R5bGUtaW1hZ2U6IHVybChpbWFnZXMvZG93bmJ1dHRvbi5naWYpOyBkb2Vzbid0IHdvcmsgZm9yIG5zNCovCi11bCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvY29tbW9uX2Jhc2UuY3NzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2NvbW1vbl9iYXNlLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjViYjUxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvY29tbW9uX2Jhc2UuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNjE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotLyptdXN0IGFkZCBmb250IHR5cGUgaWYgY2xhc3MgaXMgYmVpbmcgdXNlZCBhcyBhIGxpbmsgYXMgd2VsbCBhcyBuby1saW5rKi8KLQotYSB7Ci0JY29sb3I6ICMzMzY2OTk7Ci19Ci0KLWEudG9wcmlnaHRuYXY6YWN0aXZlIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0KLQotYS50b3ByaWdodG5hdmdyZXk6YWN0aXZlIHsKLQljb2xvcjogI0NDMDAwMDsKLX0KLQotCi1hLnRvcHJpZ2h0bmF2Z3JleTpob3ZlciB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19IAotYS50b3ByaWdodG5hdjpob3ZlciB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19IC8qIERlc2NvcGVkLCBJdCdzIG5vdCB1c2VkIGluIGN1cnJlbnQgcHJvamVjdHMsIHRvIGJlIGFyY2hpdmVkIGFmdGVyIDYgbW9udGhzLiBBbGkgUm9rbmksIDA5LzA5LzAyICovCi0vKiBhY3Rpb24gdGV4dCB1c3VhbGx5IGxvY2F0ZWQgb24gdG9wIG9mIHBhZ2U7aWUuLCBzZWxlY3QgYWxsKi8KLWEuYWN0aW9ubGluayB7Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1zaXplOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS8qIGZvbnQgZm9yIGFjdGlvbjtpZS4sIHNlbGVjdCBhbGwqLwotYS5hY3Rpb25zZWxlY3RvciB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi1hLmJhc2ljIHsKLQljb2xvcjogIzAwMDAwMDsKLX0KLQotYS5icmVhZGNydW1icyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b24gewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZm9yIGNvbnRleHQgdG9vbGJhciBidXR0b25zIGluIE11bHRpc2l0ZSwgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbjIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuYnV0dG9uOmFjdGl2ZSB7Ci0JY29sb3I6IDMzMzMzMzsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucywgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbjpob3ZlciB7Ci0JY29sb3I6IDMzMzMzMzsKLX0KLQotYS5jb3B5cmlnaHQgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtc2l6ZTogMTBweDsKLX0KLQotLyphY3Rpb25iYXIgb24gd2hpdGUgYmFja2dyb3VuZCovCi0uYWN0aW9uc2VsZWN0MiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKmFjdGlvbmJhciBhcHBlYXJzIG9uIHRvcCBhbmQvb3IgYm90dG9tIG9mIHBhZ2UqLwotLmFjdGlvbnNlbGVjdG9yIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTlFOUU5OwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLypjb2x1bW4gaGVhZGluZ3MqLwotYS5mb3JtdGJsaGVhZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS8qbmF2dHJlZSBpdGVtIG9yIGRvYyovCi1hLm5hdnRyZWVpdGVtIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnNpdGVtYXAgaGVhZGVyKi8KLWEuc2l0ZW1hcGggewotCWZvbnQtc2l6ZTogMTdweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKnVzZWQgaW4gZm9yZ290IHBhc3N3b3JkLCBhbnkgb3RoZXIgc21hbGwgdGV4dCBsaW5rcyovCi1hLnNtYWxsIHsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLWIgewotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0vKnN0YW5kYXJkIHRleHQqLwotLmJhc2ljIHsKLWNvbG9yOiAjMDAwMDAwOwotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci1mb250LXNpemU6IDEycHg7Ci1mb250LXdlaWdodDogNDAwOwotfQotCi0uYmdiYXNpYyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKLX0KLQotLypkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpOyB1c2UgYmdiYXNpYyAqLwotLmJnd2hpdGUgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci19Ci0KLS8qIHNpemUgaW5wdXQgZm9yIGJhc2ljIHRhZ3Mgc3VjaCBhcyBwIGFuZCBsaSB0aGF0IGRvIG5vdCBpbmhlcml0IGZyb20gdGQgKi8gCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLQltYXJnaW4tbGVmdDogMHB4OwotCW1hcmdpbi1yaWdodDogMHB4OwotCW1hcmdpbi10b3A6IDBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5ib2xkIHsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLmJvcmRlcmRyayB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLX0KLQotLyp1c2UgaW4gcG9wdXBzIGFzIGJvcmRlcnMgaW4gTXVsdGlzaXRlKi8gCi0uYm9yZGVycG9wdXAgewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci19Ci0KLS8qYm9yZGVycyB1c2VkIGFyb3VuZCBkYXRhLCBzZWUgUlVQKi8gCi0uYm9yZGVydGJsIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTlFOUU5OwotfQotCi0vKmRlc2lnbiBlbGVtZW50IHNpbXVsYXRpbmcgYSBkaW1lbnNpb25hbCBib3VuZGFyeSB0byBhIHRhYmxlICovIAotLmJvcmRlcnRibDJ7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0JEQkRCRDsKLX0KLQotLyp1c2VkIGluIGNvbnRlbnQgYXJlYSBhcyBhIGhvcml6b250YWwgZGl2IGluIE11bHRpc2l0ZSovCi0uYm9yZGVydGJsMyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VERURFRDsKLX0KLQotLmJyZWFkY3J1bWJzeyAKLWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLyp1c2VkIGluIHRvcG5hdiAsIHNpbWlsYXIgdG8gY29udGV4dCB0b29sYmFyKi8KLS5idXR0b24gewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qZGVzY29wZWQ7IHVzZSBidXR0b24gaW5zdGVhZDsgdXNlZCBpbiB0b3BuYXYgLCBzaW1pbGFyIHRvIGNvbnRleHQgdG9vbGJhciovCi0uYnV0dG9uMyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyphY3RpdmUgc3RhdGUgb2YgbmF2aWdhdGlvbiBidXR0b24gaW4gY29udGV4dCB0b29sYmFyKi8gCi0uYnV0dG9ub24gewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypuYXZpZ2F0aW9uIGJ1dHRvbnMgaW4gY29udGV4dCB0b29sYmFyKi8gCi0uYnV0dG9ucyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpLS11c2UgYS5idXR0b247IHRoZXNlIGJ1dHRvbiBzdHlsZXMgYXJlIGZvciB0aGUgdGV4dHVhbCBidXR0b25zIGludGVuZGVkIHRvIHJlcGxhY2UgaW1hZ2UgY29uc3RydWN0cyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8gCi0uYnV0dG9udHh0IHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGRpc2FibGVkIHN0YXRlIG9mIG5vbi1pbWFnZSBidXR0b24qLyAKLS5idXR0b250eHRkc2JsIHsKLQljb2xvcjogIzdFN0U3RTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5jb3B5cmlnaHQgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtc2l6ZTogMTBweDsKLX0KLQotLypibGFjayBjb3B5cmlnaHQgdXNlZCBpbiBSVVAqLwotLmNvcHlyaWdodGIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTBweDsKLX0KLQotZGQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLQltYXJnaW4tbGVmdDogLTFweDsKLX0KLSAKLS8qZGVmZWN0IHBhZ2Ugc3ViaGVhZCAsIHVzZWQgaW4gcHJvamVjdCBjb25zb2xlKi8KLS5kZWZlY3RzdWJoZCB7Ci0JY29sb3I6ICMwMDY2OTk7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0gCi0uZGlhbGdieHNoYWRvdzIgewotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS5kaWFsb2d1ZWJveGJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRDJEMkQyOwotfQotCi0vKmJhY2tncm91bmQgZm9yIGxvZ2luIHBhZ2VzKi8KLS5kaWFsb2d1ZWJveGJnMiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLmRpYWxvZ3VlYm94Ym9yZGVyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMzMzMzMzOwotfQotIAotLmRpYWxvZ3VlYm94aGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotfQotCi0gLmRpYWxvZ3VlYm94bWVkaXVtIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOEI4QjhCOwotfQotCi1kaXYgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotfQotCi0vKnVzZWQgdG8gYWZmZWN0IHJpZ2h0IG1hcmdpbiovIAotZGl2Lm1hcmdpbnJ0IHsKLQljbGVhcjogcmlnaHQ7Ci0JZmxvYXQ6IHJpZ2h0OwotCXdpZHRoOiA3cHg7Ci19Ci0KLWRpdi5tYXJnaW5zIHsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogN3B4OwotCW1hcmdpbi1yaWdodDogN3B4OwotCW1hcmdpbi10b3A6IDI1cHg7Ci19Ci0KLS8qZm9yIHBhZ2VzIHdpdGggYnV0dG9uIG5hdmlnYXRpb24gb24gdG9wKi8gCi1kaXYubWFyZ2luczIwIHsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogN3B4OwotCW1hcmdpbi1yaWdodDogN3B4OwotCW1hcmdpbi10b3A6IDIwcHg7Ci19Ci0KLS8qYWRkcyAxMCBweCBwYWRkaW5nIGFyb3VuZCB0ZXh0Ki8KLWRpdi5wYWQxMCB7Ci0JcGFkZGluZzogMTBweDsKLX0KLQotZGwgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLX0KLQotLypyZW1vdmVzIGRlZmF1bHQgYm90dG9tIG1hcmdpbiwgZG9lc24ndCB3b3JrIGluIE5TNC43eCAqLwotZGwuZGF0YSB7Ci0JbWFyZ2luLWJvdHRvbTogLTFweDsKLX0KLQotLyp0aXRsZSBmb3IgZXJyb3IgbWVzc2FnZXMqLwotLmVycm9yIHsKLQljb2xvcjogI0NDMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDI3cHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLSAKLS5mb3JtdGJsaGVhZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLypjdXJyZW50IHNvcnRlZCBjb2x1bW4qLwotLmZvcm10YmxoZWFkYyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U0RTRFNDsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLyp0byByZXBsYWNlIGgxIGFuZCBjb250ZW50aGVhZGVyIGxhcmdlKi8KLS5oZWFkZXIxIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDIycHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLypoZWFkZXJzIHdpdGhpbiBwYWdlKi8KLS5oZWFkZXIyIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE5cHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLX0KLQotLyp1c3VhbGx5IHVzZWQgbmV4dCB0byBoZWFkZXIxIGZvciBkb2N1bWVudCByb290IGZvbGRlciovCi0uaGVhZGVyMyB7Ci0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMnB4OwotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLWkgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLmljb25ib3JkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci19Ci0KLS8qdXNlZCBpbiBjb250cm9sc3RyaXAqLwotLmljb25vZmYgewotCXBvc2l0aW9uOiBhYnNvbHV0ZTsKLQl0b3A6IDFweDsKLQl2aXNpYmlsaXR5OiBoaWRkZW47Ci19Ci0KLS8qdXNlZCBpbiBjb250cm9sc3RyaXAqLwotLmljb25vbiB7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCXRvcDogMXB4OwotCXZpc2liaWxpdHk6IHNob3c7Ci19Ci0KLS8qZm9udCBzaXplIHNldHVwIHNob3duIGluIHRoZSBpbnB1dCBib3ggd2hpY2ggaXMgaW5oZXJpdGVkIGJ5IGlucHV0WFgqLwotaW5wdXQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLyogMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUgKi8KLWlucHV0Lm1heDUwIHsKLQl3aWR0aDogMzYwcHg7Ci19Ci0KLS8qCi0xLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRQotKi8KLWlucHV0LnB4ODUgewotCXdpZHRoOiA4NXB4OwotfQotCi1pbnB1dC5yYWRpb3sKLQltYXJnaW4tdG9wOiAtMnB4OwotfQotCi0gLyp1c2VkIGluIHRyZWVzY3JpcHRzLCBsZWZ0bmF2Ki8KLS5sZWZ0bWVudSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLyphZGRlZCBmb3IgeHNsX3Byb2Nlc3MtLXJlbW92ZSAxMi8wMiovCi0ubGVmdG5hdnRyZWUgewotCXBvc2l0aW9uOiBhYnNvbHV0ZTsKLQl3aWR0aDogMjAwcHg7Ci0JaGVpZ2h0OiAxMTVweDsKLQlsZWZ0OiA1OwotCXRvcDogMjU7Ci0JdmlzaWJpbGl0eTogdmlzaWJsZTsKLQl6LWluZGV4OiAwOwotfQotCi0ubm90ZXMgewotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogNDAwOwkKLX0KLQotcCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotfQotCi0vKmZvbnQgZm9yIHRoZSBudW1iZXJzIGluIHBhZ2luYXRpb24gbGlicmFyeSovCi0ucGFnZW51bWJlciB7Ci0JY29sb3I6ICM2NzY3Njc7CQotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogNDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotIC8qZm9udCBmb3IgcHJldmlvdXMgJiBuZXh0IGluIHBhZ2luYXRpb24qLwotLnBhZ2VzdGVwcyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0gfQotCi0vKnBvcHVwIGhlYWRlciovCi0ucG9waDEgewotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLyp1c2VkIGluIHRyZWVzY3JpcHRzKi8KLS5wb3BsZWZ0bWVudSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0YwRjBGMDsKLQlib3JkZXI6IHRoaW4gc29saWQgI0NDQ0NDQzsKLQlsZWZ0OiAyMTBweDsJLyogaXQncyBub3Qgd29ya2luZyBvbiBucyA2LjIsIGllIDUuNSwgaWUgNiBhbmQgbnMgNywgcG9zc2libHkgY2FuIGJlIHJlbW92ZWQgc2FmZWx5LCBBbGkgUm9rbmksIDA5LzE4LzAyKi8KLQlwYWRkaW5nOiAycHg7Ci0JcG9zaXRpb246YWJzb2x1dGU7IAotCXRvcDogMjVweDsJLyogaXQncyBub3Qgd29ya2luZyBvbiBucyA2LjIsIGllIDUuNSwgaWUgNiBhbmQgbnMgNywgcG9zc2libHkgY2FuIGJlIHJlbW92ZWQgc2FmZWx5LCBBbGkgUm9rbmksIDA5LzE4LzAyKi8KLQl2aXNpYmlsaXR5OiBoaWRkZW47Ci0Jd2lkdGg6YXV0bzsKLQl6LWluZGV4OjEwOwkKLX0KLQotLypwcm9ncmVzc2JhciBib3JkZXJzIGluIE11bHRpc2l0ZSovCi0ucHJvZ3Jlc3NiYXJicmR7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzY2NjY2NjsKLX0KLSAKLXNlbGVjdCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSktLXVzZSBidXR0b24zOyB1c2VkIGluIHRvcG5hdiovCi0uc21hbGx0ZXh0IHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBmb250IGZvciByZWd1bGFyIGNvbnRlbnQgdGV4dCAqLwotdGQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLX0KLQotLyogdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLXRkLmJ1dHRvbmJvZHkgewotCWJhY2tncm91bmQtY29sb3I6ICNENEQ0RDQ7Ci19Ci0KLSAvKiBkaXNhYmxlZCB2ZXJzaW9uICovIAotdGQuYnV0dG9uYm9keWRzYmwgewotCWJhY2tncm91bmQtY29sb3I6ICNEQURBREE7Ci19Ci0KLS8qIGRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSk7IHVzZSBiZ2Jhc2ljICovCi10ZC5idXR0b25oaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci19Ci0KLS8qbm9uLWltYWdlIGJ1dHRvbiovCi10ZC5idXR0b25zaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM2RDZENkQ7Ci19Ci0KLS8qIG5vbi1pbWFnZSBidXR0b24tLWRpc2FibGVkIHZlcnNpb24gKi8KLXRkLmJ1dHRvbnNoYWRvd2RzYmwgewotCWJhY2tncm91bmQtY29sb3I6ICNBMkEyQTI7Ci19Ci0KLS8qIGRhdGEgd2l0aGluIGEgdGFibGUgaGlnaGxpZ2h0ZWQgaW4gbGlnaHQgZ3JheSovCi10ZC50YmxoaWdobHQzIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTlFOUU5OwotfQotCi0gLypncmF5IGRhdGEgaGlnaGxpZ2h0IG9yIHBhZ2UgYmFja2dyb3VuZCovIAotLnRkbGlnaHQxIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotfQotCi10ZXh0YXJlYSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGJhcmRpdmlkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICMzMzk5Q0M7Ci19Ci0gCi0gLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRDJEMkQyOwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSktLXVzZWQgYm9yZGVydGJsMzsgdXNlZCBpbiBjb250ZW50IGFyZWEgYXMgYSBob3Jpem9udGFsIGRpdiBpbiBNdWx0aXNpdGUqLwotLnRvcGZyYW1lYmdncmV5ZWQgewotCWJhY2tncm91bmQtY29sb3I6ICNFREVERUQ7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVoaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNCNkI1QjU7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVoaWdobGlnaHQyIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWxvZ29iZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzAwNjY5OTsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZXNoYWRvdyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NDsKLX0KLQotLypnbG9iYWwgaWNvbiBvcGVyYXRpb25zIHRvb2xiYXIqLwotLnRvcGxlZnRuYXYgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qZ2xvYmFsIGlucHV0IG9wZXJhdGlvbnMgdG9vbGJhciovCi0udG9wbGVmdG5hdmJvbGQgewotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBicmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsgCi0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qdGV4dCBvbiB0b3BuYXYsIHRvcCByaWdodCBzZWN0aW9uKi8KLS50b3ByaWdodG5hdiB7Ci0JY29sb3I6ICNGRkZGRkY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnRvcHJpZ2h0bmF2Z3JleQotewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qbGlzdC1zdHlsZS1pbWFnZTogdXJsKGltYWdlcy9kb3duYnV0dG9uLmdpZik7IGRvZXNuJ3Qgd29yayBmb3IgbnM0Ki8KLXVsIHsKLQlsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9jb21tb25fYmFzZVVOWC5jc3MgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvY29tbW9uX2Jhc2VVTlguY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGVjOTFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9jb21tb25fYmFzZVVOWC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw2MTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi0vKm11c3QgYWRkIGZvbnQgdHlwZSBpZiBjbGFzcyBpcyBiZWluZyB1c2VkIGFzIGEgbGluayBhcyB3ZWxsIGFzIG5vLWxpbmsqLwotCi1hIHsKLQljb2xvcjogIzMzNjY5OTsKLX0KLQotYS50b3ByaWdodG5hdjphY3RpdmUgewotCWNvbG9yOiAjOTlDQ0NDOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTphY3RpdmUgewotCWNvbG9yOiAjQ0MwMDAwOwotfQotCi0KLS8qIGFjdGlvbiB0ZXh0IHVzdWFsbHkgbG9jYXRlZCBvbiB0b3Agb2YgcGFnZTtpZS4sIHNlbGVjdCBhbGwqLwotYS5hY3Rpb25saW5rIHsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LXNpemU6IDE2cHg7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsJCi19Ci0gCi0vKiBmb250IGZvciBhY3Rpb247aWUuLCBzZWxlY3QgYWxsKi8KLWEuYWN0aW9uc2VsZWN0b3IgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLWEuYmFzaWMgewotCWNvbG9yOiAjMDAwMDAwOwotfQotCi1hLmJyZWFkY3J1bWJzIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucywgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbiB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBEZXNjb3BlZCwgSXQncyBub3QgdXNlZCBpbiBjdXJyZW50IHByb2plY3RzLCB0byBiZSBhcmNoaXZlZCBhZnRlciA2IG1vbnRocy4gQWxpIFJva25pLCAwOS8wOS8wMiAqLwotLyogZm9yIGNvbnRleHQgdG9vbGJhciBidXR0b25zIGluIE11bHRpc2l0ZSwgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbjIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuYnV0dG9uOmFjdGl2ZSB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b246aG92ZXIgewotCWNvbG9yOiAjMzMzMzMzOwotfQotCi1hLmNvcHlyaWdodCB7Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotfQotCi0vKmFjdGlvbmJhciBvbiB3aGl0ZSBiYWNrZ3JvdW5kKi8KLS5hY3Rpb25zZWxlY3QyIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qYWN0aW9uYmFyIGFwcGVhcnMgb24gdG9wIGFuZC9vciBib3R0b20gb2YgcGFnZSovCi0uYWN0aW9uc2VsZWN0b3IgewotCWJhY2tncm91bmQtY29sb3I6ICNFOUU5RTk7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNnB4OwotfQotCi0vKmNvbHVtbiBoZWFkaW5ncyovCi1hLmZvcm10YmxoZWFkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotYS50b3ByaWdodG5hdmdyZXk6aG92ZXIgewotCWNvbG9yOiAjQ0MwMDAwOwotfSAKLWEudG9wcmlnaHRuYXY6aG92ZXIgewotCWNvbG9yOiAjOTlDQ0NDOwotfSAvKm5hdnRyZWUgaXRlbSBvciBkb2MqLwotYS5uYXZ0cmVlaXRlbSB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypzaXRlbWFwIGhlYWRlciovCi1hLnNpdGVtYXBoewotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMjVweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKnVzZWQgaW4gZm9yZ290IHBhc3N3b3JkLCBhbnkgb3RoZXIgc21hbGwgdGV4dCBsaW5rcyovCi1hLnNtYWxsIHsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLWIgewotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qc3RhbmRhcmQgdGV4dCovCi0uYmFzaWMgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLQlmb250LXdlaWdodDogNDAwOwotfQotCi0uYmdiYXNpYyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKLX0KLQotLypkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpOyB1c2UgYmdiYXNpYyAqLwotLmJnd2hpdGUgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci19Ci0KLS8qIHNpemUgaW5wdXQgZm9yIGJhc2ljIHRhZ3Mgc3VjaCBhcyBwIGFuZCBsaSB0aGF0IGRvIG5vdCBpbmhlcml0IGZyb20gdGQgKi8gCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWNvbG9yIDogI0ZGRkZGRjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE4cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCW1hcmdpbi1sZWZ0OiAwcHg7Ci0JbWFyZ2luLXJpZ2h0OiAwcHg7Ci0JbWFyZ2luLXRvcDogMHB4OwotfQotCi0uYm9sZCB7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLmJvcmRlcmRyayB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLX0KLQotLyp1c2UgaW4gcG9wdXBzIGFzIGJvcmRlcnMgaW4gTXVsdGlzaXRlKi8gCi0uYm9yZGVycG9wdXAgewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci19Ci0KLS8qYm9yZGVycyB1c2VkIGFyb3VuZCBkYXRhLCBzZWUgUlVQKi8KLS5ib3JkZXJ0YmwgewotCWJhY2tncm91bmQtY29sb3I6ICNFOUU5RTk7Ci19Ci0KLS8qZGVzaWduIGVsZW1lbnQgc2ltdWxhdGluZyBhIGRpbWVuc2lvbmFsIGJvdW5kYXJ5IHRvIGEgdGFibGUgKi8gCi0uYm9yZGVydGJsMiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0JEQkRCRDsKLX0KLQotLyp1c2VkIGluIGNvbnRlbnQgYXJlYSBhcyBhIGhvcml6b250YWwgZGl2IGluIE11bHRpc2l0ZSovCi0uYm9yZGVydGJsMyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VERURFRDsKLX0KLQotLmJyZWFkY3J1bWJzIHsKLWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLyp1c2VkIGluIHRvcG5hdiAsIHNpbWlsYXIgdG8gY29udGV4dCB0b29sYmFyKi8KLS5idXR0b24gewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qZGVzY29wZWQ7IHVzZSBidXR0b24gaW5zdGVhZDsgdXNlZCBpbiB0b3BuYXYgLCBzaW1pbGFyIHRvIGNvbnRleHQgdG9vbGJhciovCi0uYnV0dG9uMyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyphY3RpdmUgc3RhdGUgb2YgbmF2aWdhdGlvbiBidXR0b24gaW4gY29udGV4dCB0b29sYmFyKi8gCi0uYnV0dG9ub24gewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qbmF2aWdhdGlvbiBidXR0b25zIGluIGNvbnRleHQgdG9vbGJhciovCi0uYnV0dG9ucyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZGVzY29wZWQgKHJlbW92ZSBhZnRlciB3YS1sdCByZWxlYXNlKS0tdXNlIGEuYnV0dG9uOyB0aGVzZSBidXR0b24gc3R5bGVzIGFyZSBmb3IgdGhlIHRleHR1YWwgYnV0dG9ucyBpbnRlbmRlZCB0byByZXBsYWNlIGltYWdlIGNvbnN0cnVjdHMgZm9yIGludGVybmFsaXphdGlvbiovCi0uYnV0dG9udHh0IHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGRpc2FibGVkIHN0YXRlIG9mIG5vbi1pbWFnZSBidXR0b24qLyAKLS5idXR0b250eHRkc2JsIHsKLQljb2xvcjogIzdFN0U3RTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5jb3B5cmlnaHQgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtc2l6ZTogMTVweDsKLX0KLQotLypibGFjayBjb3B5cmlnaHQgdXNlZCBpbiBSVVAqLwotLmNvcHlyaWdodGIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTVweDsKLX0KLQotZGQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLQltYXJnaW4tbGVmdDogLTFweDsKLX0KLQotLypkZWZlY3QgcGFnZSBzdWJoZWFkICwgdXNlZCBpbiBwcm9qZWN0IGNvbnNvbGUqLwotLmRlZmVjdHN1YmhkIHsKLQljb2xvcjogIzAwNjY5OTsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmRpYWxnYnhzaGFkb3cyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjODQ4NDg0OwotfQotCi0uZGlhbG9ndWVib3hiZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0QyRDJEMjsKLX0KLQotLypiYWNrZ3JvdW5kIGZvciBsb2dpbiBwYWdlcyovCi0uZGlhbG9ndWVib3hiZzIgewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLS5kaWFsb2d1ZWJveGJvcmRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzMzMzMzMzsKLX0KLQotLmRpYWxvZ3VlYm94aGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotfQotCi0uZGlhbG9ndWVib3htZWRpdW0gewotCWJhY2tncm91bmQtY29sb3I6ICM4QjhCOEI7Ci19Ci0KLWRpdiB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci19Ci0KLS8qdXNlZCB0byBhZmZlY3QgcmlnaHQgbWFyZ2luKi8gCi1kaXYubWFyZ2lucnQgewotCWNsZWFyOiByaWdodDsKLQlmbG9hdDogcmlnaHQ7Ci0Jd2lkdGg6IDdweDsKLX0KLQotZGl2Lm1hcmdpbnMgewotCWZsb2F0OiBsZWZ0OwotCW1hcmdpbi1sZWZ0OiA3cHg7Ci0JbWFyZ2luLXJpZ2h0OiA3cHg7Ci0JbWFyZ2luLXRvcDogMjVweDsKLX0KLQotLypmb3IgcGFnZXMgd2l0aCBidXR0b24gbmF2aWdhdGlvbiBvbiB0b3AqLyAKLWRpdi5tYXJnaW5zMjAgewotCWZsb2F0OiBsZWZ0OwotCW1hcmdpbi1sZWZ0OiA3cHg7Ci0JbWFyZ2luLXJpZ2h0OiA3cHg7Ci0JbWFyZ2luLXRvcDogMjBweDsJCi19Ci0KLS8qYWRkcyAxMCBweCBwYWRkaW5nIGFyb3VuZCB0ZXh0Ki8KLWRpdi5wYWQxMCB7Ci0JcGFkZGluZzogMTBweDsKLX0KLQotZGwgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLX0KLQotLypyZW1vdmVzIGRlZmF1bHQgYm90dG9tIG1hcmdpbiwgZG9lc24ndCB3b3JrIGluIE5TNC43eCAqLyAKLWRsLmRhdGEgeyAKLQltYXJnaW4tYm90dG9tOiAtMXB4OwotfQotCi0vKnRpdGxlIGZvciBlcnJvciBtZXNzYWdlcyovCi0uZXJyb3IgewotCWNvbG9yOiAjQ0MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMzBweDsKLQlmb250LXdlaWdodDogODAwOwotfQotCi0uZm9ybXRibGhlYWQgewotCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qY3VycmVudCBzb3J0ZWQgY29sdW1uKi8KLS5mb3JtdGJsaGVhZGMgewotCWJhY2tncm91bmQtY29sb3I6ICNFNEU0RTQ7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qdG8gcmVwbGFjZSBoMSBhbmQgY29udGVudGhlYWRlciBsYXJnZSovCi0uaGVhZGVyMSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAzM3B4OwotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLS8qaGVhZGVycyB3aXRoaW4gcGFnZSovCi0uaGVhZGVyMiB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyOHB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS8qdXN1YWxseSB1c2VkIG5leHQgdG8gaGVhZGVyMTsgZm9yIGRvY3VtZW50IHJvb3QgZm9sZGVyKi8KLS5oZWFkZXIzIHsKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDMzcHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotaSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uaWNvbmJvcmRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RFREVERTsKLX0KLQotLyp1c2VkIGluIGNvbnRyb2xzdHJpcCovCi0uaWNvbm9mZiB7Ci0JcG9zaXRpb246IGFic29sdXRlOyAKLQl0b3A6IDFweDsKLQl2aXNpYmlsaXR5OiBoaWRkZW47Ci19Ci0KLS8qdXNlZCBpbiBjb250cm9sc3RyaXAqLwotLmljb25vbiB7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCXRvcDogMXB4OwotCXZpc2liaWxpdHk6IHNob3c7Ci19Ci0KLS8qZm9udCBzaXplIHNldHVwIHNob3duIGluIHRoZSBpbnB1dCBib3ggd2hpY2ggaXMgaW5oZXJpdGVkIGJ5IGlucHV0WFgqLwotaW5wdXQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLyogMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUgKi8KLWlucHV0Lm1heDUwIHsKLQl3aWR0aDogMzYwcHg7Ci19Ci0KLS8qCi0xLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRQotKi8KLWlucHV0LnB4ODUgewotCXdpZHRoOiA4NXB4OwotfQotCi1pbnB1dC5yYWRpbyB7Ci0KLX0KLQotIC8qdXNlZCBpbiB0cmVlc2NyaXB0cywgbGVmdG5hdiovCi0ubGVmdG1lbnUgewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLS5ub3RlcyB7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLXAgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLX0KLQotLypmb250IGZvciB0aGUgbnVtYmVycyBpbiBwYWdpbmF0aW9uIGxpYnJhcnkqLwotLnBhZ2VudW1iZXIgewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLSAvKmZvbnQgZm9yIHByZXZpb3VzICYgbmV4dCBpbiBwYWdpbmF0aW9uKi8KLS5wYWdlc3RlcHMgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKnBvcHVwIGhlYWRlciovCi0ucG9waDEgewotCWZvbnQtc2l6ZTogMjRweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLyp1c2VkIGluIHRyZWVzY3JpcHRzKi8KLS5wb3BsZWZ0bWVudSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0YwRjBGMDsKLQlib3JkZXI6IHRoaW4gc29saWQgI0NDQ0NDQzsgCi0JbGVmdDogMjEwcHg7CS8qIGl0J3Mgbm90IHdvcmtpbmcgb24gbnMgNi4yLCBpZSA1LjUsIGllIDYgYW5kIG5zIDcsIHBvc3NpYmx5IGNhbiBiZSByZW1vdmVkIHNhZmVseSwgQWxpIFJva25pLCAwOS8xOC8wMiovCi0JcGFkZGluZzogMnB4OwotCXBvc2l0aW9uOiBhYnNvbHV0ZTsgCi0JdG9wOiAyNXB4OwkvKiBpdCdzIG5vdCB3b3JraW5nIG9uIG5zIDYuMiwgaWUgNS41LCBpZSA2IGFuZCBucyA3LCBwb3NzaWJseSBjYW4gYmUgcmVtb3ZlZCBzYWZlbHksIEFsaSBSb2tuaSwgMDkvMTgvMDIqLwotCXZpc2liaWxpdHk6IGhpZGRlbjsgCi0Jd2lkdGg6NzVweDsKLQl6LWluZGV4OjEwOwotfQotCi0vKnByb2dyZXNzYmFyIGJvcmRlcnMgaW4gTXVsdGlzaXRlKi8KLS5wcm9ncmVzc2JhcmJyZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzY2NjY2NjsKLX0KLQotc2VsZWN0IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qZGVzY29wZWQgKHJlbW92ZSBhZnRlciB3YS1sdCByZWxlYXNlKS0tdXNlIGJ1dHRvbnMzOyB1c2VkIGluIHRvcG5hdiovCi0uc21hbGx0ZXh0IHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBmb250IGZvciByZWd1bGFyIGNvbnRlbnQgdGV4dCAqLwotdGQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLyogdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLXRkLmJ1dHRvbmJvZHkgewotCWJhY2tncm91bmQtY29sb3I6ICNENEQ0RDQ7Ci19Ci0KLS8qIGRpc2FibGVkIHZlcnNpb24gKi8KLXRkLmJ1dHRvbmJvZHlkc2JsIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREFEQURBOwotfQotCi0vKiBkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpOyB1c2UgYmdiYXNpYyAqLwotdGQuYnV0dG9uaGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotfQotCi0vKm5vbi1pbWFnZSBidXR0b24qLwotdGQuYnV0dG9uc2hhZG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNkQ2RDZEOwotfQotCi0vKiBub24taW1hZ2UgYnV0dG9uLS1kaXNhYmxlZCB2ZXJzaW9uICovCi10ZC5idXR0b25zaGFkb3dkc2JsIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQTJBMkEyOwotfQotCi0vKiBkYXRhIHdpdGhpbiBhIHRhYmxlIGhpZ2hsaWdodGVkIGluIGxpZ2h0IGdyYXkqLwotdGQudGJsaGlnaGx0MyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U5RTlFOTsKLX0KLQotLypncmF5IGRhdGEgaGlnaGxpZ2h0IG9yIHBhZ2UgYmFja2dyb3VuZCovIAotLnRkbGlnaHQxIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotfQotCi10ZXh0YXJlYSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNnB4OwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGJhcmRpdmlkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICMzMzk5Q0M7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWViZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0QyRDJEMjsKLX0KLQotLypkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpLXVzZSBib3JkZXJ0YmwzOyB1c2VkIGluIGNvbnRlbnQgYXJlYSBhcyBhIGhvcml6b250YWwgZGl2IGluIE11bHRpc2l0ZSovCi0udG9wZnJhbWViZ2dyZXllZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VERURFRDsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWhpZ2hsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0I2QjVCNTsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWhpZ2hsaWdodDIgewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVsb2dvYmcgewotCWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVzaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS8qZ2xvYmFsIGljb24gb3BlcmF0aW9ucyB0b29sYmFyKi8KLS50b3BsZWZ0bmF2IHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmdsb2JhbCBpbnB1dCBvcGVyYXRpb25zIHRvb2xiYXIqLwotLnRvcGxlZnRuYXZib2xkIHsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYnJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7IAotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOyAKLX0KLQotLyp0ZXh0IG9uIHRvcG5hdiwgdG9wIHJpZ2h0IHNlY3Rpb24qLwotLnRvcHJpZ2h0bmF2IHsKLQljb2xvcjogI0ZGRkZGRjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE0cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotLnRvcHJpZ2h0bmF2Z3JleQotewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qbGlzdC1zdHlsZS1pbWFnZTogdXJsKGltYWdlcy9kb3duYnV0dG9uLmdpZik7IGRvZXNuJ3Qgd29yayBmb3IgbnM0Ki8KLXVsIHsKLQlsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9kZXNpZ24uY3NzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2Rlc2lnbi5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ4ZDkyNDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2Rlc2lnbi5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLSAvKiB0aGlzIGlzIGEgYm9yZGVyIHN0eWxlIGZvciB0aGUgdG9wIG1lbnUgYm94ICovCi0gLmJveHRoaW4gewotCWJvcmRlci1jb2xvcjogI0U5RTlFOTsKLQlib3JkZXItc3R5bGU6IHNvbGlkOwotCWJvcmRlci13aWR0aDogdGhpbjsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JbWFyZ2luLXRvcDogMWVtOwotCXBhZGRpbmc6IDFlbTsKLQl3aWR0aDogMjc1cHg7Ci19Ci0KLSAvKiB0aGlzIGlzIGEgY29udGFpbmVyIHRvIGtlZXAgdGhlIHRvcCBtZW51IGlzb2xhdGVkIGZyb20gbWF0ZXJpYWwgYmVsb3cgaXQgKi8KLS5jb250YWluZXIgewotCWNsZWFyOiBib3RoOwotCXdpZHRoOiAxMDAlOwotfQotCi0gLyogYSBzaW1wbGUgaW5zZXQgZm9yIGJsb2NrZWQgZWxlbWVudHMgdG8gaW5kZW50ICovCi0uaW5zZXQgewotCWNsZWFyOiBib3RoOwotCW1hcmdpbi1sZWZ0OiAxM3B4OwotCW1hcmdpbi10b3A6IDRweDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLm1pZGFsaWduIHsKLQl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwotfQotCi0gLyogYW4gZW1wdHkgZWxlbWVudCBmb3IgdGhlIGJlbmVmaXQgb2YgSS5FLiA1KyBzbyB0aGF0IHRoZSB0b3AgbWVudSBpcyBjb25zdHJhaW5lZCB0byBsZWZ0ICovCi0uc3BhY2luZyB7Ci0JY2xlYXI6IHJpZ2h0OwotCWZsb2F0OiByaWdodDsKLQl3aWR0aDogMTAwcHg7Ci19Ci0KLSAvKiBUaGUgY2xhc3NlcyBiZWxvdyBhbGwgcmVsYXRlIHRvIHRoZSB1cHBlciByaWdodCBidXR0b24gb24gdGhlIG5hdiBmcmFtZSovCi0KLS53aHJidG4gewotCXBvc2l0aW9uOiBhYnNvbHV0ZTsKLQlyaWdodDogMDsKLQl0b3A6IDA7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS53aHJidXR0b25iZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZCRkJGQjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDlweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0ud2hyYnV0dG9uaGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0JDQkNCOwotfQotCi0ud2hyYnV0dG9uc2hhZG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNjg2ODY4OwotfQotCi0ud2hybWFyZ2luewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLS53aHJtYXJnaW5icmRyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREVERURFOwotfQotCi0gLyogVGhpcyBjbGFzcyBpcyBwcm92aWRlZCBmb3IgbmV0c2NhcGUgc28gdGhhdCB0aGUgc2Nyb2xsIGJhciBkb2Vzbid0IGNvdmVyIHRoZSBidXR0b24uIEFuIGltYWdlIGluc2lkZSBvZiBhIGRpdiBoZWxwcyBwdXNoIHRoZSBidXR0b24gdG8gdGhlIGxlZnQuIEhlcmUgdGhlIGRpdiBpcyBzaW1wbHkgdHVybmVkIG9mZiBzaW5jZSBpdCBpcyB1bm5lZWRlZCAqLwotLndocnNwYWNlciB7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCXZpc2liaWxpdHk6IGhpZGRlbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9kZXNpZ25fbnMuY3NzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2Rlc2lnbl9ucy5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4ZTYwZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2Rlc2lnbl9ucy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi3vu78vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLS5ib3h0aGluIHsKLQlib3JkZXItY29sb3I6ICNFOUU5RTk7Ci0JYm9yZGVyLXN0eWxlOiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IHRoaW47Ci0Jd2lkdGg6IDI3NXB4OwotfQotCi0uY29udGFpbmVyIHsKLQltYXJnaW4tbGVmdDogMTJweDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLmNvbnRlbnQgewotCW1hcmdpbi1sZWZ0OiAxMnB4OwotCXdpZHRoOiAxMDAlOwotfQotCi0gLyogYSBzaW1wbGUgaW5zZXQgZm9yIGJsb2NrZWQgZWxlbWVudHMgdG8gaW5kZW50ICovCi0uaW5zZXQgewotCWNsZWFyOiBib3RoOwotCW1hcmdpbi1sZWZ0OiAxM3B4OwotCW1hcmdpbi10b3A6IDRweDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLm1pZGFsaWduIHsKLQl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwotfQotCi0uc3BhY2luZyB7Ci19Ci0KLSAvKiBUaGUgY2xhc3NlcyBiZWxvdyBhbGwgcmVsYXRlIHRvIHRoZSB1cHBlciByaWdodCBidXR0b24gb24gdGhlIG5hdiBmcmFtZSovCi0KLS53aHJidG4gewotCXBvc2l0aW9uOiBhYnNvbHV0ZTsKLQl0b3A6IDA7Ci0Jd2lkdGg6IDkwJTsKLX0KLQotLndocmJ1dHRvbmJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkJGQkZCOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0ud2hyYnV0dG9uaGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0JDQkNCOwotfQotCi0ud2hyYnV0dG9uc2hhZG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNjg2ODY4OwotfQotCi0ud2hybWFyZ2luewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLS53aHJtYXJnaW5icmRyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREVERURFOwotfQotCi0gLyogVGhpcyBjbGFzcyBpcyBwcm92aWRlZCBmb3IgbmV0c2NhcGUgc28gdGhhdCB0aGUgc2Nyb2xsIGJhciBkb2Vzbid0IGNvdmVyIHRoZSBidXR0b24uIFRoZSBzcGFjaW5nIGlzIHByb3ZpZGVkIGJ5IGFuIGltYWdlIGluc2lkZSBhIGRpdi4gSW4gb3RoZXIgYnJvd3NlcnMsIGl0IGlzIHNpbXBseSB0dXJuZWQgb2ZmICovCi0ud2hyc3BhY2VyIHsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9zdHlsZXNfZXhwbG9yZXIuY3NzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL3N0eWxlc19leHBsb3Jlci5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc5ZDllYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL3N0eWxlc19leHBsb3Jlci5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotYQotewotICAgIGNvbG9yOiAjMzM2Njk5OwotfQotLmFjY2VudGNvbG9yCi0vKnVzZWQgYXMgaGlnaGxpZ2h0ZWQgZGVzY3JpcHRpb24gYWJvdmUgdGFibGVzKi8KLXsKLQljb2xvciA6ICNjYzMzMDA7Ci0JZm9udC1zaXplIDogMWVtOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLWEudG9wcmlnaHRuYXY6YWN0aXZlIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0KLQotYS50b3ByaWdodG5hdmdyZXk6YWN0aXZlIHsKLQljb2xvcjogI0NDMDAwMDsKLX0KLQotYS50b3ByaWdodG5hdmdyZXk6aG92ZXIgewotCWNvbG9yOiAjQ0MwMDAwOwotfSAKLWEudG9wcmlnaHRuYXY6aG92ZXIgewotCWNvbG9yOiAjOTlDQ0NDOwotfSBhLmJyZWFkY3J1bWJzCi0vKmxpbmtlZCBicmVhZGNydW1icyovCi17Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUKLQotYS5icmVhZGNydW1iczpob3ZlcgotewotICBjb2xvcjogI2ZmZmZmZgotfQotCi0KLWEubGlua19jb250YWluZXJfZWRpdG9yCi0vKkVESVQgbGluayB1bmRlciBjb250YWluZXIgYmFubmVyKi8KLXsKLQlmb250LXNpemU6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi1hLmxpbmtfYnlsaW5lCi0vKndyaXR0ZW4gYnkgWFggYXV0aG9yIGluIGNvbnRlbnQqLwotewotCWZvbnQtc2l6ZTogLjllbTsKLQljb2xvcjogIzMzNjY5OTsKLX0KLQotCi1hLmxpbmtfZnVuY19vcHRpb24KLS8qQWR2YW5jZWQgbGluayBpbiBzZWFyY2ggY29udGFpbmVyKi8KLXsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotCi1hLmxpbmt0eXBlZAotLyp2aWV3IGFsbCBsaW5rIHVuZGVyIGNvbnRhaW5lciovCi17Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0KLWEubWVudWJhcl9saW5rCi0vKgotd2hpdGUgZm9udCBmb3IgdGhlIHRleHQgaW4gdGhlIHRhYmxlIGhlYWRlciwgdXN1YWxseSBpbiB0aGUgMW5kIGxldmVsIG9mIHRoZSB0YWJsZSBoZWFkZXIgaWYgdGhlcmUgYXJlIDIKLTFzdCBsZXZlbDogcmVndWxhciAKLTJuZCBsZXZlbDogYm9sZAotKi8KLXsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZQotfQotCi0KLWEubWVudWJhcl9saW5rOmhvdmVyCi17Ci0JY29sb3I6ICNmZmZmZmY7Ci19Ci0KLWEubmF2dHJlZQoteyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTFweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0gCi0KLWEucHJvamVjdF9uYXYKLS8qcHJvamVjdCBleHBsb3JlciBtZW51YmFyIG9wdGlvbiBsaW5rcyBpbiBsZWZ0IG5hdiovCi17Ci0JY29sb3I6ICMwMDY2OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLWEucHJvamVjdF9uYXZ0cmVlCi0vKnRvcE5hdiB0cmVlIHN1Ym1lbnUqLwotewotICBjb2xvcjogIzAwMDAwMDsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogLjllbTsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotYS50b3BiYXIKLS8qdG9wTmF2Ki8KLXsKLSAgY29sb3I6ICM2NjY2NjY7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IC45ZW07Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotCi1ib2R5Ci0vKm9yaWdpbmFsIGJvZHkgYmFja2dyb3VuZCBzZXR1cCovCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA5cHg7Ci0JYmFja2dyb3VuZC1jb2xvciA6IGZmZmZmZjsKLX0KLQotCi0uYm9yZGVyX2RlY29yYXRpb24KLS8qZG90dGVkIGxpbmUgYm9yZGVyIG9mIHRhYmxlcyBpbiBjb250ZW50Ki8KLXsKLQlib3JkZXIgOiB0aGluIGRvdHRlZCAjNjY2NjY2OwotCWZsb2F0IDogcmlnaHQ7Ci0JbWFyZ2luLWJvdHRvbSA6IDE1cHg7Ci0JbWFyZ2luLWxlZnQgOiAxNXB4OwotCXBhZGRpbmc6IDVweDsKLX0KLQotCi0uYm90dG9tYmFyX2RhcmsKLS8qYmFja2dyb3VuZCBjb2xvciBiZWhpbmQgYnJlYWRjcnVtYnMqLwotewotCWJhY2tncm91bmQ6ICMwMDMzNjY7Ci19Ci0KLQotLmJvdHRvbWJhcl9saWdodAotLyp0aGluIGxpbmUgYmV0d2VlbiBkcm9wZG93biBtZW51ICYgYnJlYWRjcnVtYiBiYXIqLyAKLXsKLQliYWNrZ3JvdW5kOiAjMzM5OWNjOwotIH0KLQotCi0gLmJvdHRvbWJhcl9tZWRpdW0KLSAvKnRoaW4gbGluZSBiZXR3ZWVuIGRyb3Bkb3duIG1lbnUgJiBzaGFkb3cgY29sb3IgKi8KLXsgCi0JYmFja2dyb3VuZDogIzAwNjY5OTsKLSB9Ci0KLQotIC5ib3R0b21iYXJfc2hhZG93Ci0gIC8qZGFyayBsaW5lcyB1bmRlciBicmVhZGNydW1iYmFyICYgIGRyb3Bkb3dubWVudSBiYXIgKi8KLXsKLQliYWNrZ3JvdW5kOiAjMDAwMDAwOwotfQotCi0KLWNvZGUKLS8qY29kZSBhc3NldCBpbiBjb250ZW50Ki8KLXsKLQljb2xvcjogIzY3Njc2NzsKLX0KLQotLmNvZGUyCi0vKmluZGVudCBjb2RlIGFzc2V0IGluIGNvbnRlbnQqLwotewotICAgCW1hcmdpbi1sZWZ0IDogMTVweDsKLQltYXJnaW4tcmlnaHQgOiAxNXB4OwotfQotCi0uY29weXJpZ2h0Ci0vKmNvcHlyaWdodCBsaW5lIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhZ2UqLwoteyAKLQljb2xvciA6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZSA6IDg2JTsKLSB9Ci0gCi0uY29udGVudF9iYXNpYwotLyoKLWZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0cwotZm9udCBmb3IgcmVndWxhciBjb250YWluZXIgdGV4dHMKLWZvbnQgZm9yIHJlZ3VsYXIgZm9ybSB0ZXh0cwotKi8KLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDFlbTsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uY29udGVudF9iYXNpY19lbXBoYXNpcwotLyoKLWJvbGQgZm9udCBmb3IgcmVndWxhciBjb250ZW50IHRleHRzCi1ib2xkIGZvbnQgZm9yIHJlZ3VsYXIgY29udGFpbmVyIHRleHRzCi1ib2xkIGZvbnQgZm9yIHJlZ3VsYXIgZm9ybSB0ZXh0cwotKi8KLXsgCi0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAuOWVtOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotIH0KLQotCi0gLmNvbnRlbnRfY29sb3JlZAotIC8qY29udGVudCovCi17Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZSA6IDFlbTsKLX0KLQotCi0gLmNvbnRlbnRfY29udGFpbmVyCi0gLypib3R0b20gbWFyZ2luIHlpZWxkIHRoZSBzcGFjZSBiZXR3ZWVuIGJ5bGluZSAmIHBhcmFncmFwaCovCi0gewotCW1hcmdpbi1ib3R0b20gOiAxNXB4OwotfQotCi0gLmNvbnRlbnRfZGlhZ3JhbQotIC8qZGlhZ3JhbSBkZXNjcmlwdGlvbiwgZWcuIiBmaWd1cmUgMS4uLiIqLwotIHsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDkwJTsKLQlmb250LXN0eWxlIDogaXRhbGljOwkKLQl9Ci0KLS5oZWFkZXJfb2ZfYXJ0aWNsZV90YWJsZQotLypjb2xvcmVkIHRhYmxlIGhlYWRlciBpbiBjb250ZW50Ki8KLXsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC1zdHlsZSA6IGl0YWxpYzsKLX0KLQotIC5jb250ZW50X2VtcGhhc2lzCi0gLypib2xkIGZvbnQgaW4gY29udGVudCovCi0gewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0KLS5jb250ZW50X2dyZXlfbWlkCi0vKndlbGNvbWUgY29udGFpbmVyKi8KLXsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDFlbTsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLmNvbnRlbnRfZ3JleV9taWQyCi0vKmZvbnQgaW4gZmxvYXRpbmcgYm94Ki8KLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwMCU7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLSAuY29udGVudF9oZWFkZXIKLSAvKmhlYWRlciBvZiBjb250ZW50IHBhcmFncmFwaCovCi0gewotCWNvbG9yOiAjMDA2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLSAuY29udGVudF9oZWFkZXJfbGFyZ2UKLSAvKmZvbnQgZm9yIHBhZ2UgaGVhZGVyIGV4Y2VwdCBmb3IgYXJ0aWNsZSBwYWdlcywgKHNlZSBoZWFkZXJfb2ZfYXJ0aWNsZSkqLwotIHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxLjhlbTsKLQlmb250LXdlaWdodCA6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLQotIC5jb250ZW50X2hlYWRlcl9jb2xvcmVkCi0gIC8qY29sb3JlZCB0aXRsZSBvZiB0aGUgcGFnZSB1c2VkIHdpdGggY29udGVudF9oZWFkZXJfbGFyZ2UqLwotIHsKLQljb2xvcjogIzY3Njc2Nzt6Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0KLS5jb250ZW50X3JlZmVyZW5jZQotLypmb3JudCBmb3IgcmVmZXJlbmNlLCBlZy4gInNlZSAuLi4uIiovIAotewotCWZvbnQtc3R5bGUgOiBpdGFsaWM7Ci0JZm9udC1zaXplOiAxZW07Ci19Ci0KLSAuY29udGVudF9yaWdodAotICAvKmZsb2F0aW5nIHRhYmxlIG9uIHRoZSByaWdodCBvZiB0aGUgY29udGVudCovCi17Ci0JZmxvYXQgOiByaWdodDsKLQltYXJnaW4tbGVmdCA6IDVweDsKLQltYXJnaW4tcmlnaHQgOiAxMHB4OwotCW1hcmdpbi10b3AgOiAxMHB4OwotCXdpZHRoOiAxNzI7Ci19Ci0KLSAuY29udGVudF9yaWdodF90YWJsZQotIC8qaW5uZXIgdGFibGUgb2YgY29udGVudF9yaWdodCovCi17Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLQotIC5jb250ZW50X3NtYWxsCi0gLypzbWFsbGVyIGZvbnQgdGhhbiBjb250ZW50X2Jhc2ljKi8KLXsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplIDogLjllbTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLSAuY29udGVudF9zbWFsbF9jb2xvcmVkCi0gLypzbWFsbCBibHVlIGZvbnQqLwotewotCWNvbG9yIDogIzk5OTk5OTsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplIDogLjllbTsKLX0KLQotCi0gLmNvbnRlbnRfc21hbGxfY29sb3JlZF8yCi0gLypkYXRlIGluIHJhdGluZyBiYXIqLwotewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemUgOiAuOWVtOwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uY29udGVudF9zbWFsbF9jb2xvcmVkXzMKLS8qYXZlcmFnZSBpbiByYXRpbmcgYmFyKi8KLXsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplIDogLjllbTsKLX0KLQotCi0uY29udGVudF9lbXBoYXNpcwotLypib2xkIGZvbnQqLwotIHsKLQlmb250LXdlaWdodCA6IDYwMDsKLQlmb250LXNpemUgOiAuOWVtOwotfQotCi0KLS5jb250ZW50X3N1YmhlYWRlcgotLypib2xkIGZvbnQgYmlnZ2VyIHRoYW4gY29udGVudF9iYXNpYyovCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zaXplIDogMWVtOwotfQotCi0KLS5jb250ZW50X3N1YmhlYWRlcl8yCi0vKmJsYWNrIGNvbnRlbnQgdGl0bGUgaW4gY29udGFpbmVycyovCi17Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxZW07Ci0JZm9udC13ZWlnaHQ6IDUwMDsKLX0KLQotCi0uZGlzY3Vzc2lvbl9jb250ZW50Ci0vKmJsYWNrIHRleHRzIGluIHRhYmxlcyovCi17Ci0JY29sb3I6IDAwMDAwMDsKLQlmb250LXNpemU6IC45ZW07Ci0JbWFyZ2luLWxlZnQ6IDVweDsKLX0KLQotCi0KLS5kaXNjdXNzaW9uX2NvbnRlbnRfZW1waGFzaXMKLS8qYm9sZCB0ZXh0cyBpbiB0YWJsZXMqLwotewotCWNvbG9yOiAwMDAwMDA7Ci0JZm9udC1zaXplOiAuOWVtOwotCW1hcmdpbi1sZWZ0OiA1cHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLQotIC5kaXNjdXNzaW9uX2Rlc2NyaXB0aW9uCi0gLypibGFjayB0ZXh0cyBpbiB0YWJsZXMgZm9yIGRlc2NyaXB0aW9ucyovCi0geyAKLQljb2xvcjogNjY2NjY2OwotCWZvbnQtc2l6ZTogLjllbTsKLQltYXJnaW4tbGVmdDogNXB4OwotICB9Ci0KLQotLmVkaXRvcm5vdGUKLS8qbm90IHVzZWQqLwotIHsgCi0gIGZvbnQtc3R5bGU6IGl0YWxpYwotIH0KLSAKLSAvKnRoZSBmb2xsb3dpbmcgdHdvIGNsYXNzZXMgYXJlIHVzZWQgZXhwcmVzc2x5IGluIHRoZSBrbm93bGVkZ2VfYW5ub3VuY2VtZW50c192aWV3Ki8KLSAKLSAuZmxvYXRjbGVhcgotewotCXBhZGRpbmc6IDVweDsKLQlwYWRkaW5nLWJvdHRvbTogMHB4OwotCXBhZGRpbmctcmlnaHQ6IDAgcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5mbG9hdGdyZXkKLXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotCXBhZGRpbmc6IDVweDsKLQl3aWR0aDogNjVweDsKLX0KLQotCi0uZm9vdG5vdGUKLS8qZm9vdCBub3RlIGF0IHRoZSBib3R0b20gb2YgY29udGVudCAqLwoteyAKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IC45ZW07Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci0gfQotCi0KLS5mb290X3N0YXJpbmRleAotLyp0aGUgKiBzeW1ib2wgaW5kaWNhdGUgdGhlIHJlcXVpcmVkIGZpZWxkICovCi17Ci0JY29sb3IgOiBjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotLmZvb3RfZGVzY3JpcHRpb24KLS8qCi1jb2xvcmVkIGZvbnQKLWRlc2NyaXB0aW9uIGFib3V0IHRoZSB1c2VyIHN0YXR1cy4gZXEuICJzdWJzY3JpcHRpb25zIGFyZSB1cGRhdGVkIgotaXQncyB1c3VhbGx5IG9uIHRoZSB1cHBlciBwYXJ0IG9mIHRoZSBwYWdlcwotKi8KLXsKLQljb2xvciA6ICNmZjY1MDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotLmZvb3RfdGV4dAotLyp0aGUgZGVzY3JpcHRpb25zIGZvciAqIHN5bWJvbCAsIGVnLiByZXF1aXJlZCBmaWVsZCovCi17Ci0JY29sb3I6ICNiNGI0YjQ7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotLmZvb3RfdGl0bGUKLS8qZm9vdCBpbmRleCBhc2lkZSB0aGUgcGFnZSBoZWFkZXIsIGVnLiAqIHN5bWJvbCAqLwotewotCWNvbG9yIDogI2ZmNjUwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLX0KLS5mb3JtZmllbGRfZGVzYyAKLS8qZm9ybSBvYmplY3QgZGVzY3JpcHRpb24gb3IgaW5zdHJ1Y3Rpb24qLwotewotY29sb3I6ICMzMzMzMzM7IAotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IAotZm9udC1zaXplOiAxZW07IAotZm9udC13ZWlnaHQgOiA0MDA7IAotIGZvbnQtc3R5bGU6IGl0YWxpYwotfQotLmZvcm1maWVsZF90aXRsZQotLypmb3JtIG9iamVjdCB0aXRsZSovCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zaXplIDogMWVtOwotfQotLmZsb3djaGFydAotLypub3QgdXNlZCovCi17ICAKLQlmb250LXNpemU6IDhwdDsgY29sb3I6ICM2NjY2NjYKLX0KLQotLmdyZXlfZGFyawotLypkYXJrIGdyZXkgY2VsbCBiYWNrZ3JvdW5kKi8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKLX0KLQotLmdyZXlfbWVkaXVtCi0vKm1lZGl1bSBncmV5IGNlbGwgYmFja2dyb3VuZCovCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci19Ci0KLS5oZWFkZXJfZGlzY3Vzc2lvbl9saW5rCi0vKgotc2FtZSBhcyBtZW51YmFyX2xpbmsKLXdoaXRlIGZvbnQgZm9yIHRoZSB0ZXh0IGluIHRoZSB0YWJsZSBoZWFkZXIsIHVzdWFsbHkgaW4gdGhlIDFuZCBsZXZlbCBvZiB0aGUgdGFibGUgaGVhZGVyIGlmIHRoZXJlIGFyZSAyCi0xc3QgbGV2ZWw6IHJlZ3VsYXIgCi0ybmQgbGV2ZWw6IGJvbGQKLSovCi0gewotCWNvbG9yOiAJZmZmZmZmOwotCWZvbnQtc2l6ZTogMC45ZW07Ci19Ci0KLS5oZWFkZXJfZGlzY3Vzc2lvbl9saW5rZGsKLXsKLQljb2xvcjogCTAwMDAwMDsKLQlmb250LXNpemU6IDAuOWVtOwotfQotCi0uaGVhZGVyX2Rpc2N1c3Npb25fdGl0bGUKLS8qCi10YWJsZSB0aXRsZXMKLXdoaXRlIGJvbGQgZm9udCBmb3IgdGhlIHRleHQgaW4gdGhlIHRhYmxlIGhlYWRlciwgdXN1YWxseSBpbiB0aGUgMm5kIGxldmVsIG9mIHRoZSB0YWJsZSBoZWFkZXIgaWYgdGhlcmUgYXJlIDIKLTFzdCBsZXZlbDogcmVndWxhciAKLTJuZCBsZXZlbDogYm9sZAotKi8KLSB7Ci0JY29sb3I6IGZmZmZmZjsKLQlmb250LXNpemU6IC45ZW07Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQltYXJnaW4tbGVmdCA6IDVweDsKLX0KLQotCi0uaGVhZGVyYgotLypub3QgdXNlZCovCi17Ci0gICAgY29sb3I6ICNmZjY2MDA7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLHZlcmRhbmEsaGVsdmV0aWNhLHNhbnMtc2VyaWY7Ci0gICAgZm9udC1zaXplOiAxMnB0OwotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0KLS5oZWFkZXJfb2ZfY29udGFpbmVyCi0vKmNvbG9yZWQgZm9udCBmb3IgdGhlIHRpdGxlIG9mIHRoZSBjb250YWluZXIgZWcuIEZlYXR1cmUqLwotewotCWNvbG9yOiAjY2QzMzAxOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMWVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotLmhlYWRlcl9jb2xvcmVkCi0vKmNvbG9yZWQgaGVhZGVyIGluIGxvZ2luIHBhZ2UqLwotewotCWNvbG9yOiAjY2MzMzAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMWVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0KLS5oZWFkZXJfb2ZfYXJ0aWNsZQotLypjb2xvcmVkIGFydGljbGUgaGVhZGVyKi8KLXsKLQljb2xvcjogI2NkMzMwMTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEuMjNlbTsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmhlYWRlcl9vZl9hcnRpY2xlMgotLyphcnRpY2xlIGhlYWRlciovCi17Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OwotCWZvbnQtd2VpZ2h0OiA1MDA7Ci19Ci0KLS5zdWJoZWFkMV9vZl9hcnRpY2xlMgotLyphcnRpY2xlIHNlY29uZCBsZXZlbCBoZWFkKi8KLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEzcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5zdWJoZWFkMl9vZl9hcnRpY2xlMgotLyphcnRpY2xlIHRoaXJkIGxldmVsIGhlYWQqLwotewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTMgcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogNXB4OwotfQotCi0uc3ViaGVhZDNfb2ZfYXJ0aWNsZTIKLS8qYXJ0aWNsZSA0dGggbGV2ZWwgaGVhZCovCi0gewotCWZvbnQtd2VpZ2h0IDogNjAwOwotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLmhlYWRlcl9vZl9zdGVwcwotLypmb3JudCBmb3Igc3RlcHMgdGl0bGUgaW4gZm9ybXMqLwoteyAKLQljb2xvcjogI2E0YTRhNDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHQ7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotCi0uaGVhZGVyX29mX3NpdGVtYXAKLS8qaGVhZGVyIG9mIHNpdGVtYXAgcGFnZSovCi17Ci0JY29sb3I6ICM2Njk5Y2M7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB0OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uaGVhZGVyX29mX3NpdGVtYXA6aG92ZXIKLXsKLQljb2xvcjogI2NjMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHQ7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5oZWFkZXJfb2ZfdGFibGUKLS8qaGVhZGVyIG9mIHRhYmxlcyBpbiBjb250ZW50IHVzdWFsbHkgaGFzIGEgYmFja2dyb3VuZCBjb2xvciBhc3NpZ25lZCB0byB0aGUgY2VsbCovCi17Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNHB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaGVhZGVyX3JpZ2h0Ci17Ci0JY29sb3I6IDAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLmltYWdlY2FwdGlvbgotLyppbWFnZSBjYXB0aW9uIGluIGNvbnRlbnQgcGFnZSovCi17IAotIGZvbnQtc2l6ZTogOXB0OyBjb2xvcjogIzAwMzM2NgotIH0KLQotCi0uc2lkZWJhciAKLS8qbm90IHVzZWQqLwoteyAgCi0JYmFja2dyb3VuZC1jb2xvcjogI2Y0ZjRmNDsKLX0KLQotCi1pbnB1dAotLypmb250IHNpemUgc2V0dXAgc2hvd24gaW4gdGhlIGlucHV0IGJveCB3aGljaCBpcyBpbmhlcml0ZWQgYnkgaW5wdXRYWCovCi17Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtZmFtaWx5IDogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLX0KLQotCi1pbnB1dC5pbnB1dDI1Ci17Ci0gICAgd2lkdGg6IDI1cHgKLX0KLQotCi1pbnB1dC5pbnB1dDQ1Ci17Ci0gICAgd2lkdGg6IDQ1cHgKLX0KLQotCi1pbnB1dC5pbnB1dG1heDUwCi0vKgotMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUsIGJ1dCBOUwotKi8KLXsKLQl3aWR0aDogMzYwcHg7Ci19Ci0KLQotaW5wdXQuaW5wdXQ4NQotewotICAgIHdpZHRoOiA4NXB4Ci19Ci0KLQotaW5wdXQuaW5wdXQxMzUKLXsKLSAgICB3aWR0aDogMTM1cHgKLX0KLQotCi1pbnB1dC5pbnB1dDE1NQotewotICAgIHdpZHRoOiAxNTVweAotfQotCi0KLWlucHV0LmlucHV0MjMwCi17Ci0gICAgd2lkdGg6IDIzMHB4Ci19Ci0KLQotaW5wdXQuaW5wdXQzMDUKLXsKLSAgICB3aWR0aDogMzA1cHg7Ci19Ci0KLQotLm1lbnViYXIKLS8qCi13aGl0ZSBmb250IGZvciB0aGUgdGV4dCBpbiB0aGUgdGFibGUgaGVhZGVyLCB1c3VhbGx5IGluIHRoZSAxbmQgbGV2ZWwgb2YgdGhlIHRhYmxlIGhlYWRlciBpZiBodGVyZSBhcmUgMgotMXN0IGxldmVsOiByZWd1bGFyIAotMm5kIGxldmVsOiBib2xkCi0qLwotewotCWNvbG9yOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogNDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotCi0ubWVudWJhcjpob3ZlcgotewotICBjb2xvcjogI2ZmZmZmZgotfQotCi0KLS5tZW51YmFyX2JnCi0vKmJhY2tncm91bmQgb2YgdGFibGUgaGVhZGVyKi8KLXsgICAKLWJhY2tncm91bmQtY29sb3I6IzAwMzM2NjsgCi19Ci0KLQotLm1lbnViYXJfZW1waGFzaXMKLS8qCi0xLGJvbGQgZm9udCBmb3IgdGhlIGxhc3QgaXRlbSBvZiB0aGUgYnJlYWRjcnVtYnMKLTIsYm9sZCBmb250IG9mIHRhYmxlIGhlYWRlciB3aXRoIG1lbnViYXJfYmcoYmx1ZSkgYXMgYmFja2dyb3VuZCBjb2xvciAKLTMsYm9sZCB0ZXh0IG9uIGNvbG9yZWQgYmFja2dyb3VuZCBlZy4gTG9nZ2VkIEluCi0qLwotewotICBjb2xvcjogI2ZmZmZmZjsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTFweDsKLSAgZm9udC13ZWlnaHQ6IDYwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLS5tZW51YmFyX2VtcGhhc2lzZGsKLQotewotICBjb2xvcjogIzAwMDAwMDsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTFweDsKLSAgZm9udC13ZWlnaHQ6IDYwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLQotLm1pZGJhcl9iZwotLyp0aGUgbGlnaHQgcG9pbnQgYWJvdmUgdGhlIHRhYnMgKi8KLXsKLQliYWNrZ3JvdW5kOiAjZmZmZmZmOwotfQotCi0KLS5taWRiYXJfZGFyawotLypkYXJrIGNvbG9yIGJldHdlZW4gdGFicyovCi17IAotCWJhY2tncm91bmQ6ICMwMDMzNjY7Ci0gfQotCi0KLS5taWRiYXJfbGlnaHQKLS8qCi0xLGxpZ2h0IGNvbG9yIG9uIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGUgdGFicwotMixsaWdodCBjb2xvciBhYm92ZSB0YWJzCi0qLwoteyAKLQliYWNrZ3JvdW5kOiAjMzM5OWNjOwotIH0KLQotIAotIC5taWRiYXJfbWVkaXVtCi0gLypiYWNrZ3JvdW5kICBvZiAgdGFicyovCi17IAotCWJhY2tncm91bmQ6ICMwMDY2OTk7Ci0gfQotCi0vKnNoYWRvdyBjb2xvciBiZXR3ZWVuIHRhYnMqLwotIC5taWRiYXJfc2hhZG93Ci17Ci0JYmFja2dyb3VuZDogIzY2NjY2NjsKLX0KLQotCi0ucGFnZV9udW1iZXIKLS8qZm9udCBmb3IgdGhlIG51bWJlcnMgaW4gcGFnaW5hdGlvbiBsaWJyYXJ5Ki8KLXsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LXdlaWdodCA6IDQwMDsKLX0KLQotCi0ucGFnZV9zdGVwcwotLypmb250IGZvciBwcmV2aW91cyAmIG5leHQgaW4gcGFnaW5hdGlvbiovCi17IAotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogLjllbTsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotIH0KLQotCi0gLnBhZ2VoZWFkZXIKLSAvKnNhbWUgYXMgY29udGVudF9oZWFkZXJfbGFyZ2UqLwotewotCWNvbG9yOiAjMDA2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExNSU7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0KLSAucGFnZWhlYWRlcl9jb2xvcmVkCi0gLypjb2xvcmVkIHRpdGxlIG9mIHRoZSBwYWdlIHVzZWQgd2l0aCBjb250ZW50X2hlYWRlcl9sYXJnZSovCi17Ci0gICAgY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgZm9udC1zaXplOiAxNnB0OwotICAgIGZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS5wb3B1cF9ib3JkZXIKLXsKLQliYWNrZ3JvdW5kOiAjZjBmMGYwOwotCWJvcmRlciA6IHRoaW4gc29saWQgY2NjY2NjOwotCXBhZGRpbmcgOiAycHg7Ci19Ci0KLS5wb3B1cF90ZXh0Ci17Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udCA6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLnBvcHVwX3RleHQgOiBhY3RpdmUKLXsKLQljb2xvcjogI2NjMDAwMDsKLX0KLQotLnBvcHVwX3RleHQgOiBob3ZlcgotewotCWNvbG9yOiAjY2MwMDAwOwotfQotCi0ucHJvamVjdF9tZW51X2JvcmRlcjEKLS8qcHJvamVjdCBleHBsb3JlciBtZW51IG9wdGlvbnMgYmFja2dyb3VuZCBzdHlsZSBpbiBsZWZ0IG5hdiovCi0gewotCWJvcmRlci10b3AgOiAxcHggc29saWQgI2NjY2NjYzsKLQlib3JkZXItcmlnaHQgOiAxcHggc29saWQgI2NjY2NjYzsKLQliYWNrZ3JvdW5kIDogI2VmZWZlZjsKLX0KLS5wcm9qZWN0X21lbnVfdG9wYm9yZGVyCi0vKnByb2plY3QgZXhwbG9yZXIgbWVudSBvcHRpb25zIGJhY2tncm91bmQgc3R5bGUgaW4gbGVmdCBuYXYqLwotIHsKLQlib3JkZXItdG9wIDogMXB4IHNvbGlkICNjY2NjY2M7CQotCWJhY2tncm91bmQgOiAjZWZlZmVmOwotfQotLnByb2plY3RfbmF2Ci0vKmZpZWxkIHRpdGxlcyBmb3IgcHJvamVjdCBleHBsb3JlciBtZW51IGxvY2F0ZWQgaW4gbGVmdCBuYXYqLwotewotCWNvbG9yOiAjMDA2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLXNlbGVjdAotLypmb250IHNpemUgc2V0dXAgc2hvd24gaW4gdGhlIHNlbGVjdCBib3ggd2hpY2ggaXMgaW5oZXJpdGVkIGJ5IGlucHV0WFgqLwotewotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LWZhbWlseSA6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci19Ci0KLQotc2VsZWN0LmlucHV0MjUKLXsKLSAgICB3aWR0aDogMjVweAotfQotCi0KLXNlbGVjdC5pbnB1dDQ1Ci17Ci0gICAgd2lkdGg6IDQ1cHgKLX0KLQotCi1zZWxlY3QuaW5wdXQ4NQotewotICAgIHdpZHRoOiA4NXB4Ci19Ci0KLQotc2VsZWN0LmlucHV0MTU1Ci17Ci0gICAgd2lkdGg6IDE1NXB4Ci19Ci0KLQotc2VsZWN0LmlucHV0MjMwCi17Ci0gICAgd2lkdGg6IDIzMHB4Ci19Ci0KLQotc2VsZWN0LmlucHV0MzA1Ci17Ci0gICAgd2lkdGg6IDMwNXB4OwotfQotCi0vKiBBbGwgc2hpbSBjbGFzc2VzIGFyZSBmb3Igc3BhY2luZyBlbGVtZW50cyB1c2VkIHRvIGNvbnRyb2wgbGF5b3V0LCBlc3BlY2lhbGx5IGluIG9sZGVyIGJyb3dzZXJzIHRoYXQgZG9uJ3QgdW5kZXJzdGFuZCBtYXJnaW5zIGFuZCBwYWRkaW5nICovCi0KLS5zaGltM3gxcHgKLXsKLQlmb250LXNpemU6IDFweDsKLQloZWlnaHQgOiAxcHg7Ci19Ci0KLWEuc2lkZW1lbnVfaGVhZGVyCi0vKm5vdCB1c2VkPyovCi17Ci0gICAgY29sb3I6ICM2NjY2NjY7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0KLWEuc2lkZW1lbnVfaGVhZGVyOmhvdmVyCi0vKm5vdCB1c2VkPyovCi17Ci0gIGNvbG9yOiAjY2MwMDAwCi19Ci0KLQotLnNpZGVtZW51X2JvbGRsZWZ0Ci0vKgotMSxib2xkIGZvbnQgZm9yIHRoZSBpdGVtcyBpbiBzZWFyY2ggY29udGFpbmVyCi0yLGJvbGQgbGVmTmF2IHVuc2VsZWN0ZWQKLSovCi17Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAuOWVtOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotLnNpZGVtZW51X2JvbGRsZWZ0X3NlbGVjdGVkCi0vKmJvbGQgZm9udCBsZWZOYXYgc2VsZWN0ZWQqLwotewotCWNvbG9yOiAjQ0MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogLjllbTsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5zaWRlbWVudV9ib2xkcmlnaHQKLS8qCi0xLGJvbGQgZm9udCBmb3IgdGhlIGl0ZW1zIGluIHJpZ2h0IGhhbmQgc2lkZQotMixzYW1lIGFzIHNpZGVtZW51X2JvbGRyaWdodAotKi8KLXsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IC45ZW07Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uc2lkZW1lbnVfYm9sZHJpZ2h0OmhvdmVyCi17Ci0JY29sb3I6ICNjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAuOWVtOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotLnNpZGVtZW51X2JvbGRyaWdodF9jb3Vyc2VjYXRhbG9nCi0vKm5vdCB1c2VkKi8KLXsKLQljb2xvcjogIzYzOTYwMjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IC45ZW07Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLQotLnNpZGVtZW51X3N0YW5kYXJkCi0vKmxlZnROYXYgc3RhZGFyZCovCi17Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAuOWVtOwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5zaWRlbWVudV9zdGFuZGFyZF9zZWxlY3RlZAotLypsZWZ0TmF2IHNlbGVjdGVkKi8KLXsKLQljb2xvcjogI0NDMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IC45ZW07Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotCi10ZAotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogNzUlOwotfQotCi0KLQotIHRkLmJnX2Rpc2N1c3Npb25fMQotIC8qc2FtZSBhcyBncmV5X21lZGl1bSovCi17Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLX0KLQotCi10ZC5iZ19kaXNjdXNzaW9uXzIKLSAvKnNhbWUgYXMgZ3JleV9saWdodCovCi17IAotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfQotIAotdGQuY29udGVudF9jZWxsCi0vKmZvciBlbGltaW5hdGUgdGFibGUgc3RydWN0dXJlICYga2VlcCB0aGUgY2VsbHBhZGRpbmcgaW4gY29udGVudCovCi0gewotCXBhZGRpbmc6IDVweDsKLX0KLQotCi10ZC5kaXZpZGVyCi0vKnRoaW4gbGluZSBkaXZpZGUgdGhlIHBhZ2UgY29sdW1ucyovCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNmNmY5ZjA7Ci19Ci0KLXRkLmRpdmlkZXIyCi0vKnRoaW4gbGluZSBkaXZpZGUgdGhlIHBhZ2UgY29sdW1ucyAtIHVzZWQgaW4gdGhlIHZpZXdmcmFtZSBmcmFtZSBwYWdlKi8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKLX0KLQotCi0uZ3JleV9kYXJrCi0vKmRhcmsgZ3JleSBjZWxsIGJhY2tncm91bmQqLwotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotfQotCi10ZC5ncmV5X21lZGl1bTIKLS8qbWVkaXVtIGdyZXkgY2VsbCBiYWNrZ3JvdW5kIHcvIGNlbGwgcGFkZGluZyovCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0JcGFkZGluZzogNSBweDsKLX0KLQotdGQuZ3JleV9saWdodDIKLS8qbGlnaHQgZ3JleSBjZWxsIGJhY2tncm91bmQgdy8gY2VsbCBwYWRkaW5nKi8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLQlwYWRkaW5nOiA1cHg7Ci19Ci0KLS5ncmV5X2xpZ2h0Ci0vKmxpZ2h0IGdyZXkgY2VsbCBiYWNrZ3JvdW5kKi8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotCi10ZC5jZWxsY29sb3JfbGlnaHQKLS8qbGlnaHQgY2VsbCBiYWNrZ3JvdW5kIGNvbG9yIGZvciBzcGVjaWZpYyBjb2xvciBzY2hlbWUqLwotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTljYzAwOwotfQotCi0KLXRkLmNlbGxjb2xvcl9kYXJrCi0vKmRhcmsgY2VsbCBiYWNrZ3JvdW5kIGNvbG9yIGZvciBzcGVjaWZpYyBjb2xvciBzY2hlbWUqLwotewotCWJhY2tncm91bmQtY29sb3I6ICM2MzljMDA7Ci19Ci0KLQotdGQuY2VsbGNvbG9yX3doaXRlCi0vKndoaXRlIGNlbGwgYmFja2dyb3VuZCBjb2xvciovCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci19Ci0KLQotdGQuc2lkZW1lbnVfYnVsbGV0X2NvbG9yZWQKLS8qYnVsbGV0IGNvbG9yIGZvciB0aGUgbGVmdE5hdiovCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNjZDMzMDE7Ci19Ci0KLQotdGQuc2lkZW1lbnVfYnVsbGV0X2dyZXkKLS8qZ3JleSBidWxsZXQgY29sb3IgZm9yIHRoZSBsZWZ0TmF2Ki8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotCi10ZXh0YXJlYQotLypmb250IHNpemUgc2V0dXAgc2hvd24gaW4gdGhlIG11bHRpbGluZSB0ZXh0YXJlYSB3aGljaCBpcyBpbmhlcml0ZWQgYnkgaW5wdXRYWCovCi17Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtZmFtaWx5IDogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLX0KLQotCi10ZXh0YXJlYS50ZXh0YXJlYTQ1Ci17Ci0gICAgd2lkdGg6IDQ1cHgKLX0KLQotCi10ZXh0YXJlYS5pbnB1dG1heDUwCi0vKgotMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUsIGJ1dCBOUwotKi8KLXsKLQl3aWR0aDogMzYwcHgKLX0KLQotCi10ZXh0YXJlYS5pbnB1dDE5MAotewotICAgIHdpZHRoOiAxOTBweAotfQotCi0KLXRleHRhcmVhLmlucHV0MjMwCi17Ci0gICAgd2lkdGg6IDIzMHB4Ci19Ci0KLQotdGV4dGFyZWEuaW5wdXQzNTAKLXsKLSAgICB3aWR0aDogMzUwcHgKLX0KLQotCi0udG9wYmFyX3NlcGFyYXRvcgotLypzZXBhcmF0b3Igb2YgdGhlIHRvcE5hdiovCi17Ci0gIGNvbG9yOiAjY2MzMzAwOwotICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAuOWVtOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLQotLnRvcGxpbmVfY29sb3IKLS8qdGhlIHRoaW4gY29sb3IgbGluZSBvbiB0aGUgdG9wIG9mIHRoZSBicm93c2VyIHdpbmRvdyovCi17IAotCWJhY2tncm91bmQ6ICMwMDY2OTk7Ci0gfQotIAotIC8qIGJvcnJvd2VkIHN0eWxlcyBmcm9tIGNvbW1vbi5jc3MgdG8gYmUgdHJpbW1lZCBsYXRlciAqLwotIAotIC50b3BmcmFtZWJnIAoteyAgYmFja2dyb3VuZC1jb2xvcjogI2QyZDJkMgotfQotCi0udG9wZnJhbWViZ2xpZ2h0IAoteyAgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjYjZiNWI1Ci19Ci0KLS50b3BmcmFtZWJnZGFyayAKLXsgIAotYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NAotfQotCi0udG9wZnJhbWViZ2xpZ2h0MiAKLXsgCi0gYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZgotIH0KLSAgIAotIC50b3BmcmFtZWxvZ29iZyAKLXsgIAotYmFja2dyb3VuZC1jb2xvcjogIzAwNjY5OQotfQotCi0udG9wbGVmdG5hdgotewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3BsZWZ0bmF2Ym9sZCAKLXsgCi1mb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgCi1mb250LXNpemU6IDEwcHg7IAotdGV4dC1kZWNvcmF0aW9uOiBub25lOyAKLWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0udG9wcmlnaHRuYXYKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0udG9wcmlnaHRuYXZncmV5Ci17Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnZlcnRpY2FsYmx1ZQotIHsgCi0gYmFja2dyb3VuZDogIzMzOTljYyAKLSB9Ci0KLSAud2hpdGViZwoteyAKLSBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9zdHlsZXNfaWU1bnM0LmNzcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9zdHlsZXNfaWU1bnM0LmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWRjNTBmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvc3R5bGVzX2llNW5zNC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotLyptdXN0IGFkZCBmb250IHR5cGUgaWYgY2xhc3MgaXMgYmVpbmcgdXNlZCBhcyBhIGxpbmsgYXMgd2VsbCBhcyBuby1saW5rKi8KLQotYSB7CQotCWNvbG9yOiAjMzM2Njk5OwotfQotCi1hLnRvcHJpZ2h0bmF2OmFjdGl2ZSB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19Ci0KLWEudG9wcmlnaHRuYXZncmV5OmFjdGl2ZSB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19Ci0KLQotYS50b3ByaWdodG5hdmdyZXk6aG92ZXIgewotCWNvbG9yOiAjQ0MwMDAwOwotfSAKLWEudG9wcmlnaHRuYXY6aG92ZXIgewotCWNvbG9yOiAjOTlDQ0NDOwotfSAvKiBmb250IGZvciBhY3Rpb24gb24gY29udGVudCBwYWdlIHVzdWFsbHkgbG9jYXRlZCBvbiB0b3Agb2YgcGFnZSA7aWUuLCBzZWxlY3QgYWxsKi8KLWEuYWN0aW9uIHsgIAotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTFweDsJCi19IAotCi1hLmFjdGlvbnNlbGVjdG9yIHsKLSAgIAotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotIC8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudCBpbnN0ZWFkIG9mIHRoZSBvdXRlcm1vc3QgY2VsbCAqLwotYS5hY3RpdmV0YWIgeyAKLSAJY29sb3I6ICMwMDAwMDA7Ci0gCWZvbnQtc2l6ZTogMTJweDsKLSAgCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotIC8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudCBpbnN0ZWFkIG9mIHRoZSBvdXRlcm1vc3QgY2VsbCAqLwotYS5hY3RpdmV0YWJzZWxlY3RlZCB7IAotIAljb2xvcjogIzJjMmMyYzsKLSAJZm9udC1zaXplOiAxMnB4OwotICAJdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmJhc2ljIHsgCQotICAgIGNvbG9yOiAjMDAwMDAwOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b24gewotCWNvbG9yOiAjMzMzMzMzOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5idXR0b246YWN0aXZlIHsKLQljb2xvcjogMzMzMzMzOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZm9yIG5vbi1pbWFnZSBidXR0b25zLCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8KLWEuYnV0dG9uOmhvdmVyIHsKLQljb2xvcjogMzMzMzMzOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMgaW4gTXVsdGlzaXRlLCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8KLWEuYnV0dG9uMiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfQotCi0vKm1haW4gY29udGFpbmVyICBhY3Rpb25zL2xpbmtzIGZvciBlZGl0aW5nKi8KLWEuY29ubGlua2VkaXQgewotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci0JZm9udC1zaXplIDogMTFweDsKLX0KLQotYS5jb3B5cmlnaHQgeyAJCi0JY29sb3IgOiAjOTk5OTk5OwotCWZvbnQtc2l6ZSA6IDEwcHg7Ci19IAotCi1hLmZvcm10YmxoZWFkIHsKLSAgIGJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0vKiBsaWdodCBjb2xvdXJlZCBoZWFkaW5nIGxpbmsgZm9yIGRpc2N1c3Npb24gYW5kIHNpbWlsYXIgdXNlcyAtIHdhcyBoZWFkZXJfZGlzY3Vzc2lvbl9saW5rIGluIHByZXZpb3VzIHZlcnNpb25zICovCi0gYS5oZWFkZXJsaW5rbGlnaHQgewotCWNvbG9yOiAJZmZmZmZmOwotCWZvbnQtc2l6ZTogMC45ZW07Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQkKLQotLypib2xkIGxpbmssIGllLCBhZHZhbmNlZCBzZWFyY2ggbGluayBpbiBwZSovCi1hLmxpbmtmdW5jb3B0aW9uIHsgIAkKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotIGEubmF2dHJlZSB7IAkKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLQotLypuYXZ0cmVlIGl0ZW0gb3IgZG9jLCBub2RlcyB0aGF0IGRvbid0IGV4cGFuZCovCi1hLm5hdnRyZWVpdGVtIHsgCQotICAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZSA6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLSAKLSAvKiBzaW1wbGUgbWVjaGFuaXNtIHRvIHR1cm4gdGV4dCBkZWNvcmF0aW9uIG9mZiAqLyAgCi1hLm5vbGluZSB7Ci0gCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSB9Ci0KLWEucG9wdXB0ZXh0IHsJCi0gICBjb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDExcHg7CQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5wb3B0ZXh0IHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250IDogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEucG9wdXB0ZXh0OiBhY3RpdmUgewotCWNvbG9yOiAjY2MwMDAwOwotfQotCi0KLWEuc21hbGwgewkKLQlmb250LXNpemU6IDExcHg7CQotfQotCi1hLnNtYWxsYiB7CQotICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwkKLX0KLQotYS50b3BiYXIgewotICBjb2xvcjogIzY2NjY2NjsKLSAgZm9udC1zaXplOiAxMXB4OwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qdXNlZCBhcyBoaWdobGlnaHRlZCBkZXNjcmlwdGlvbiBhYm92ZSB0YWJsZXMqLwotLmFjY2VudGNvbG9yIHsKLQljb2xvciA6ICNjYzMzMDA7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLSAvKiBiZ2NvbG9yICBmb3IgYWN0aW9uIHRleHQgdXN1YWxseSBsb2NhdGVkIG9uIHRvcCBvZiBwYWdlO2llLiwgc2VsZWN0IGFsbCovCi0uYWN0aW9uYmcgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0uYWN0aW9uc2VsZWN0b3IgewotICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLS5hY3Rpb25zZWxlY3RvcmRpcyB7Ci1iYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5OwotCWNvbG9yOiAjY2NjY2NjOwotCWZvbnQtc2l6ZTogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWIgeyAKLSAgIGZvbnQtd2VpZ2h0IDogYm9sZDsKLSB9Ci0gIAotLmJhc2VsaW5laXRhbGljcyB7Ci0JY29sb3I6ICM2NjY2NjY7Ci0JZm9udC1zaXplOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmJnYmxhY2sgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotIH0KLSAKLSAvKiBiYXNpYyBjb2x1bW4gYmFja2dyb3VuZCBjb2xvdXIgZm9yIGRpc2N1c3Npb25zLCBmaWxlcywgb3RoZXIgc3VjaCB0YWJ1bGF0ZWQgZGF0YSAqLwotLmJnY29sdW1uYmFzaWMgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotIH0KLSAKLS5iZ3doaXRlIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLSB9IAotIAotLyogc2l6ZSBpbnB1dCBmb3IgYmFzaWMgdGFncyBzdWNoIGFzIHAgYW5kIGxpIHRoYXQgZG8gbm90IGluaGVyaXQgZnJvbSB0ZCAqLyAKLWJvZHkgewotCWJhY2tncm91bmQtY29sb3IgOiAjZmZmZmZmOyAgIAotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwkJCi0JbWFyZ2luLWxlZnQ6IDBweDsKLQltYXJnaW4tcmlnaHQ6IDBweDsKLQltYXJnaW4tdG9wOiAwcHg7CQotfQotCi0uYm9sZCB7IAotICAgZm9udC13ZWlnaHQgOiA2MDA7Ci0gfQotCi0uYm9yZGVyZ3JheSB7IAotCWJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7Ci0gfQotCi0uYm90dG9tYmFyZGFyayB7IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDMzNjY7Ci0gfQotICAKLS5ib3R0b21iYXJsaWdodCB7IAotCWJhY2tncm91bmQtY29sb3I6ICMzMzk5Y2M7Ci0gfQotCi0uYm90dG9tYmFyc2hhZG93IHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLSB9Ci0KLS5icmVhZGNydW1ic3sgCi1jb2xvcjogIzMzNjY5OTsKLWZvbnQtd2VpZ2h0OiA2MDA7Ci0gfQotCi0uYnJlYWRjcnVtYnMyeyAKLWNvbG9yOiAjZmZmZmZmOwotZm9udC1zaXplOiAxMXB4OwotIH0gCi0KLS8qbmF2aWdhdGlvbiBidXR0b25zLCBub3QgZm9ybSBidXR0b25zKi8gCi0uYnV0dG9ucyB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS8qYWN0aXZlIG5hdmlnYXRpb24gYnV0dG9uLCBub3QgZm9ybSBidXR0b25zKi8gCi0uYnV0dG9ub24gewotICAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfSAKLQotLyogdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLS5idXR0b250eHQgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmNvZGUgeyAKLSAgIGZvbnQtZmFtaWx5OiBDb3VyaWVyIE5ldywgQ291cmllciwgbW9ubzsgICAKLSAgIGZvbnQtc2l6ZTogMTJweDsKLSB9Ci0gCi0gIC8qIGZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0ICovCi0uY29tbWVudHMgeyAJCi0JZm9udC1zaXplOiAxMXB4OwkKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0vKm1haW4gY29udGFpbmVyIGhlYWRlciovCi0uY29uaGVhZCB7IAotY29sb3I6ICNjYzMzMDA7Ci1mb250LXdlaWdodDogNjAwOwotdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLSB9Ci0gCi0gLyptYWluIGNvbnRhaW5lciBkYXRhIGxhYmVscyovCi0uY29ubGFiZWwgeyAKLWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfSAKLSAKLS8qbWFpbiBjb250YWluZXIgZGF0YSBsYWJlbHMgaW4gYm9sZCovCi0uY29ubGFiZWxib2xkIHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjZTFlMWUxOwotZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gfSAgCi0gCi0vKnJlcGxhY2luZyBzaWRlbWVudV9ib2xkcmlnaHQgbW92aW5nIGZvcndhcmQqLwotLmNvbnJib2xkIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLypoZWFkZXIgZm9yIHJpZ2h0IGhhbmQgY29udGFpbmVyKi8KLS5jb25yaGVhZCB7Ci0JY29sb3I6IDAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLyptYWluIGNvbnRhaW5lciB0YWJsZSBoZWFkZXIqLwotLmNvbnRibGhlYWQgeyAgCi0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCWNvbG9yOiAjMzMzMzMzOwkKLQlmb250LXNpemU6IDExcHg7CQotICAgIGZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS5jb250ZW50eyAKLWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsJCi0gfQotCi0gLyptZWRpdW0gZ3JleSBjZWxsIGJhY2tncm91bmQqLwotLmNvbnRlbnRib3JkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci19Ci0KLS8qIGFkZGVkIGZvciB0ZXh0IHJlcHJlc2VudGluZyBkaXNhYmxlZCBmdW5jdGlvbnMuICovCi0uY29udGVudGRpc2FibGVkIHsKLQljb2xvcjogI2NjY2NjYzsKLX0KLQotLyogZm9udCBmb3IgYm9sZCB0ZXh0ICovCi0uY29udGVudGVtcGhhc2lzIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLyogdXNlZCB0ZXh0IHJlbWluZGluZyB1c2VyIHRoYXQgdGhlcmUgaXMgcmVxdWlyZWQgY29udGVudCAqLwotLmNvbnRlbnRyZXF1aXJlZCB7Ci0JY29sb3I6ICNiNGI0YjQ7Ci0JZm9udC13ZWlnaHQ6IDUwMDsKLX0KLQotLmNvcHlyaWdodCB7IAotY29sb3IgOiAjOTk5OTk5OwotCWZvbnQtc2l6ZSA6IDEwcHg7Ci19Ci0KLS8qYmxhY2sgY29weXJpZ2h0Ki8KLS5jb3B5cmlnaHRiIHsgCi1jb2xvciA6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTBweDsKLX0KLQotZGQgeyAKLWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsJCi1tYXJnaW4tbGVmdDogLTFweDsKLSB9Ci0gCi0uZGlhbGdieHNoYWRvdzIgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NDsKLX0KLQotLmRpYWxvZ3VlYm94YmcgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogI2QyZDJkMjsKLX0KLQotLypiYWNrZ3JvdW5kIGZvciBsb2dpbiBwYWdlcyovCi0uZGlhbG9ndWVib3hiZzIgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLmRpYWxvZ3VlYm94Ym9yZGVyIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzMzMzMzMzsKLSB9Ci0gCi0uZGlhbG9ndWVib3hoaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLSAuZGlhbG9ndWVib3htZWRpdW0geyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOGI4YjhiOwotIH0KLSAKLSAuZGlhbG9ndWVib3h0aXRsZSB7CSAgIAotCWZvbnQtc2l6ZTogMTRweDsKLQlmb250LXNpemU6IDExcHg7CQotCWZvbnQtd2VpZ2h0IDogYm9sZDsKLX0KLQotLyp0ZXh0IGZvciBkaXNhYmxlZCBidXR0b25zKi8KLS5kaXNhYmxleyAKLWNvbG9yOiAjOTk5OTk5OwotZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci1mb250LXNpemU6IDExcHg7ICAKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSB9Ci0gCi1kaXZ7IAotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gfSAKLSAKLS8qdXNlZCB0byBhZmZlY3QgcmlnaHQgbWFyZ2luKi8gCi1kaXYubWFyZ2lucnR7IAotCWNsZWFyOiByaWdodDsKLQlmbG9hdDogcmlnaHQ7Ci0Jd2lkdGg6IDdweDsKLSB9ICAKLSAKLWRpdi5tYXJnaW5zIHsgCi1mbG9hdDogbGVmdDsKLW1hcmdpbi1sZWZ0OiA3cHg7Ci1tYXJnaW4tdG9wOiAyNXB4OwkKLW1hcmdpbi1yaWdodDogN3B4OwotIH0gICAKLQotLypmb3IgcGFnZXMgd2l0aCBidXR0b24gbmF2aWdhdGlvbiBvbiB0b3AqLyAKLWRpdi5tYXJnaW5zMjAgeyAKLWZsb2F0OiBsZWZ0OwotbWFyZ2luLWxlZnQ6IDdweDsKLW1hcmdpbi10b3A6IDIwcHg7CQotbWFyZ2luLXJpZ2h0OiA3cHg7Ci0gfSAgICAKLSAKLSAvKmFkZHMgMTAgcHggcGFkZGluZyovCi0gZGl2LnBhZDEweyAKLSBwYWRkaW5nOiAxMHB4OyAKLSAgfQotCi0uZGl2aWRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjlmMDsKLX0KLQotZGx7ICAKLWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotZm9udC1zaXplOiAxMnB4OyAgIAotCX0KLQotLypyZW1vdmVzIGRlZmF1bHQgYm90dG9tIG1hcmdpbiwgZG9lc24ndCB3b3JrIGluIE5TNC43eCAqLyAKLWRsLmRhdGEgeyAKLW1hcmdpbi1ib3R0b206IC0xcHg7Ci0gfSAgCi0KLS5kb2Nib2xkIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7ICAgICAgIAotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0vKmZvciBhcHBsZXQgZG93bmxvYWQgc3BsYXNoIHBhZ2UqLwotLmRvd25sb2FkeyAKLWJhY2tncm91bmQtY29sb3I6ICNlZmVlZWU7Ci0gfQotCi0uZXJyb3Jtc2cgewotCWNvbG9yIDogI2NjMDAwMDsJCi19IAotIAotLyoKLWNvbG9yZWQgZm9udAotZGVzY3JpcHRpb24gYWJvdXQgdGhlIHVzZXIgc3RhdHVzLiBlcS4gInN1YnNjcmlwdGlvbnMgYXJlIHVwZGF0ZWQiCi1pdCdzIHVzdWFsbHkgb24gdGhlIHVwcGVyIHBhcnQgb2YgdGhlIHBhZ2VzCi0qLwotLmZvb3RlcmJvbGQgewotCWNvbG9yIDogI2E0YTRhNDsKLQlmb250LXNpemU6IDkwJTsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKnRoZSAqIHN5bWJvbCBpbmRpY2F0ZSB0aGUgcmVxdWlyZWQgZmllbGQgKi8KLS5mb290ZXJib2xkY29sb3JlZCB7Ci0JY29sb3IgOiAjZmY2NTAwOwotCWZvbnQtc2l6ZTogOTAlOwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS5mb290aW5kaWNhdG9yIHsKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7ICAgICAgIAotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyp0aGUgKiBzeW1ib2wgaW5kaWNhdGUgdGhlIHJlcXVpcmVkIGZpZWxkICovCi0uZm9vdHN0YXJpbmRleCB7Ci0JY29sb3IgOiAjY2MwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0vKm1vdmUgdG8gZGVzaWduX3BlKi8KLS5mb3JtbGFiZWwgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uZm9ybXRibGhlYWQgewotICAgYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS5ncmV5bWVkaXVtIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotfQotCi0uZ3JheWZvbGQgewotCWNvbG9yOiAjY2NjY2NjOwkKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JZm9udC1zaXplOiAxNXB4OwotfQotCi0vKk5vdGU6IHJlbW92ZSB0aGlzIG5vdGUgaWYgdXNpbmcgdGhpcyBzdHlsZSBvciB3aWxsIGJlIGRlbGV0ZWQqLwotCS8qIEN1cnJlbnRseSB1c2VkIGluIGNxX2RlZmxlY3RfbG9naW5fZXJyLmh0bWwgLSBzaG91bGQgYmUgcmVuYW1lZCB0byBzb21ldGhpbmcgdGhhdCBoYXMgbGVzcyBkZXNjcmlwdGl2ZSBuYW1lICovCi0uaGVhZGVyYmx1ZSB7Ci0JY29sb3I6ICMwMDY2OTk7CQotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyp1c2VkIGluIGNjIGZvciBmcmFtZXNldCBkaXNwbGF5Ki8gCi0uaGVhZGVyaW5mcmFtZXMgeyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwkKLQlmb250LXdlaWdodDogNjAwOwotCW1hcmdpbi1ib3R0b206IDJweDsKLQltYXJnaW4tdG9wOiAwcHg7Ci19Ci0KLSAvKmZvbnQgZm9yIHBhZ2UgaGVhZGVyIGV4Y2VwdCBmb3IgYXJ0aWNsZSBwYWdlcywgKHNlZSBoZWFkZXJfb2ZfYXJ0aWNsZSkqLwotLmhlYWRlcmxhcmdlIHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDE2MCU7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKm1haW4gaGVhZGVyIGZvciBmcmFtZSBuYXZpZ2F0aW9uLCBpZSwgY2xlYXJjYXNlIG1lcmdlIGZpbGVzKi8KLS5oZWFkZXJtYWluIHsgIAotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTdweDsJCi0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLyogaGVhZGVyIGVsZW1lbnQgZm9yIGZvcm0gdGFibGVzIGNvbnRhaW5pbmcgbWlkLXNpemUgZml4ZWQgaGVpZ2h0IHRleHQgKi8KLS5oZWFkZXJtZWRsaXN0IHsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLS8qZm9ybnQgZm9yIHN0ZXBzIHRpdGxlIGluIGZvcm1zKi8KLS5oZWFkZXJvZnN0ZXBzIHsgCi0JY29sb3I6ICM2NjY2NjY7Ci0JZm9udC1zaXplOiAxN3B4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaGVhZGVyb2ZzdGVwc25vbiB7IAotCWNvbG9yOiAjNjY2NjY2OwotCWZvbnQtc2l6ZTogMTdweDsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qdXNlIGhlYWRlcjEgaW5zdGVhZCovCi0uaDEgeyAgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMnB4OwkKLQlmb250LXdlaWdodDogODAwOwotfQotCi0vKnRvIHJlcGxhY2UgaDEgYW5kIGNvbnRlbnRoZWFkZXIgbGFyZ2UqLwotLmhlYWRlcjEgeyAgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMnB4OwkKLQlmb250LXdlaWdodDogODAwOwotfQotCi0vKmRvY3VtZW50IHJvb3QgZm9sZGVyKi8KLS5oMXJvb3R7ICAKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDIycHg7CQotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLQotLyp1c2VkIGluIGNjLCBjcSwgc2wqLyAKLWgxIHsgIAotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTdweDsJCi0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLy8qdXNlIGhlYWRlcjIgaW5zdGVhZCovCi0uaDIgeyAKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE5cHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsJIAkKLX0KLQotLypoZWFkZXJzIHdpdGhpbiBwYWdlKi8KLS5oZWFkZXIyIHsgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOXB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7CSAJCi19Ci0KLWkgewotCWZvbnQtc3R5bGUgOiBpdGFsaWM7Ci19Ci0KLS5pY29uYm9yZGVyIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLX0KLQotLypmb250IHNpemUgc2V0dXAgc2hvd24gaW4gdGhlIGlucHV0IGJveCB3aGljaCBpcyBpbmhlcml0ZWQgYnkgaW5wdXRYWCovCi1pbnB1dCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTFweDsKLX0gCi0KLWlucHV0LmlucHV0MTM1IHsKLQl3aWR0aDogMTM1cHgKLX0gCi0KLS8qIDEsYnVzaW5lc3Mgc3RhbmRhcmQgbXVsdGlsaW5lIGlucHV0IGJveCAKLTIsdGhpcyBzdHlsZSBvbmx5IGFjdGl2YXRlIGluIElFICovCi1pbnB1dC5tYXg1MCB7Ci0Jd2lkdGg6IDM2MHB4OwotfQotCi1pbnB1dC5weDI1IHsKLSAgICB3aWR0aDogMjVweDsKLX0KLQotaW5wdXQucHg0NSB7Ci0gICAgd2lkdGg6IDQ1cHg7Ci19Ci0KLS8qCi0xLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRQotKi8KLWlucHV0LnB4ODUgewotICAgIHdpZHRoOiA4NXB4OwotfQotCi1pbnB1dC5weDEzNSB7Ci0gICAgd2lkdGg6IDEzNXB4OwotfQotCi1pbnB1dC5weDE1NSB7Ci0gICAgd2lkdGg6IDE1NXB4OwotfQotCi1pbnB1dC5weDIzMCB7Ci0gICAgd2lkdGg6IDIzMHB4OwotfQotCi1pbnB1dC5weDMwNSB7Ci0gICAgd2lkdGg6IDMwNXB4OwotfQotCi0ubGVmdG1lbnUgewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLS5sZWZ0bWVudWJ1bGxldCB7IAotYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLSB9Ci0KLS5sZWZ0bWVudWJ1bGxldGFjdGl2ZSB7IAotYmFja2dyb3VuZC1jb2xvcjogI2NkMzMwMTsKLSB9Ci0JCi0KLS5sZWZ0bmF2aGVhZCB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxM3B4OwkKLQlmb250LXdlaWdodDogYm9sZDsJCi19IAotCi0ubGVmdG5hdmxhYmVsIHsKLWNvbG9yOiAjMDAwMDAwOwotZm9udC13ZWlnaHQgOiA2MDA7Ci1mb250LXNpemU6IDExcHg7Ci0gfQotCi0ubGlnaHRncmF5IHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjZTRlNGU0OwotIH0KLSAKLS5tZW51YmFyIHsKLSAgY29sb3I6ICNmZmZmZmY7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IDExcHg7Ci0gIGZvbnQtd2VpZ2h0OiA0MDA7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZQotfQotCi0vKm1lbnViYXIgd2l0aGluIHRvcCBvZiBjb250ZW50IHBhZ2UgICovCi0ubWVudWJhcm1pZHsgCi1mb250LXNpemU6IDExcHg7Ci0gIGZvbnQtd2VpZ2h0OiA2MDA7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZQotIH0KLQotLyoKLTEsYm9sZCBmb250IGZvciB0aGUgbGFzdCBpdGVtIG9mIHRoZSBicmVhZGNydW1icwotMixib2xkIGZvbnQgb2YgdGFibGUgaGVhZGVyIHdpdGggbWVudWJhcl9iZyhibHVlKSBhcyBiYWNrZ3JvdW5kIGNvbG9yIAotMyxib2xkIHRleHQgb24gY29sb3JlZCBiYWNrZ3JvdW5kIGVnLiBMb2dnZWQgSW4KLSovCi0ubWVudWJhcmVtcGhhc2lzIHsKLSAgY29sb3I6ICNmZmZmZmY7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IDExcHg7Ci0gIGZvbnQtd2VpZ2h0OiA2MDA7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZQotfQotCi0ubWVudWJhcjpob3ZlciB7Ci0gIGNvbG9yOiAjZmZmZmZmCi19IAotIAotLm1pZGJhcmJnIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLSB9IAotIAotLyp0b3BuYXYqLyAKLS5taWRiYXJsaWdodCB7IAotCWJhY2tncm91bmQtY29sb3I6ICMzMzk5Y2M7Ci0gfQotIAotLypkYXJrIGNvbG9yIGJldHdlZW4gdGFicyovCi0gLm1pZGJhcmRhcmsgeyAKLQliYWNrZ3JvdW5kOiAjMDAzMzY2OwotIH0KLSAKLSAvKnRvcG5hdiovIAotIC5taWRiYXJtZWQgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OwotIH0KLSAKLSAvKmJhY2tncm91bmQgIG9mICB0YWJzKi8gCi0gLm1pZGJhcm1lZGl1bSB7IAotCWJhY2tncm91bmQ6ICMwMDY2OTk7Ci0gfQotIAotIC5taWRiYXJzaGFkb3cgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNjY2NjY2OwotIH0gCi0gIAotLypyZXBsYWNpbmcgc2lkZW1lbnVfYm9sZGxlZnQgbW92aW5nIGZvcndhcmQqLwotLm5hdmxlZnRib2xkIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLypsZWZ0IG5hdiBzdWJtZW51Ki8KLS5uYXZsZWZ0c3ViIHsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0gCi0vKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byB0aGlzIGVsZW1lbnQgaW5zdGVhZCBvZiB0aGUgb3V0ZXJtb3N0IGNlbGwgKi8KLS5ub25hY3RpdmV0YWIgewotCWNvbG9yOiAjYjRiNGI0OwotCWZvbnQtc2l6ZTogMTJweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qbm90ZXMvIGRlc2NyaXB0aW9uIG9mIGljb24gKi8KLS5ub3Rlc3sgIAotIGZvbnQtc2l6ZTogMTFweDsKLSBmb250LXdlaWdodCA6IDQwMDsJCi19Ci0KLXAgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsJCi19Ci0KLS5wYWdlYm9sZCB7IAotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtd2VpZ2h0IDogNjAwOwkKLSB9Ci0gCi0vKmZvbnQgZm9yIHRoZSBudW1iZXJzIGluIHBhZ2luYXRpb24gbGlicmFyeSovCi0gLnBhZ2VudW1iZXIgewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotfQotCi0gLypmb250IGZvciBwcmV2aW91cyAmIG5leHQgaW4gcGFnaW5hdGlvbiovCi0ucGFnZXN0ZXBzIHsgCi0JY29sb3I6ICM2NzY3Njc7CQotCWZvbnQtc2l6ZTogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gfQotCi0ucG9wIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsgCi0JZm9udC1zaXplIDogMTJweDsKLQlmb250LXdlaWdodCA6IDIwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5wb3BiYWNrZ3JvdW5kIHsKLQotCWJhY2tncm91bmQ6ICNkNmQzY2U7Ci19Ci0KLS5wb3BoMSB7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0IDogYm9sZDsKLX0KLQotLnBvcGxlZnRtZW51IHsKLQliYWNrZ3JvdW5kOiAjZjBmMGYwOwotCWJvcmRlcjogdGhpbiBzb2xpZCBjY2NjY2M7IAotCWxlZnQ6IDIxMHB4OyAKLQlwYWRkaW5nOiAycHg7Ci0JcG9zaXRpb246YWJzb2x1dGU7IAotCXRvcDogMjVweDsKLQl2aXNpYmlsaXR5OiBoaWRkZW47IAotCXdpZHRoOjc1cHg7Ci0Jei1pbmRleDoxMDsJCi0gfQotCi0gLyogdXNlIHBvcGxlZnRtZW51IGluc3RlYWQgb2YgdGhpcyBvbmUqLwotLnBvcHVwYm9yZGVyIHsKLQliYWNrZ3JvdW5kOiAjZjBmMGYwOwotCWJvcmRlciA6IHRoaW4gc29saWQgY2NjY2NjOwotCXBhZGRpbmcgOiAycHg7Ci19Ci0KLS5wb3B1cHRleHQgewkKLSAgIGNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTFweDsJCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0ucHJvamVjdGF0dCB7IAotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsgCi0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7IAotCWNvbG9yOiAjY2QzMzAxOwotfQotCi0vKmRhdGUgYXNzb2NpYXRlZCB3aXRoIGFydGljbGUgcmF0aW5ncyovCi0ucmF0aW5nc2RhdGUKLXsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LXNpemUgOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLXNlbGVjdCB7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotc2VsZWN0LnNlbHB4MTQ0IHsKLSAgICB3aWR0aDogMTQ0cHg7Ci19Ci0KLS8qIC5zaWRlbWVudV9ib2xkbGVmdCByZXBsYWNlIHdpdGggLmxlZnRtZW51Ym9sZCovIAotCi0vKiAuc2lkZW1lbnVfYm9sZGxlZnRfc2VsZWN0ZWQgcmVwbGFjZSB3aXRoIC5sZWZ0bWVudWFjdGl2ZSovCi0KLS8qIC5zaWRlbWVudV9idWxsZXRfY29sb3JlZCByZXBsYWNlIHdpdGggLmxlZnRtZW51YnVsbGV0YWN0aXZlKi8KLSAKLS8qLnNpZGVtZW51X2J1bGxldF9ncmV5IHJlcGxhY2Ugd2l0aCBsZWZ0bWVudWJ1bGxldCovCi0KLS5zaWRlbWVudWJvbGRsZWZ0IHsKLQljb2xvcjogIzAwMDAwMDsJCi0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19IAotCi0uc2lkZW1lbnVib2xkbGVmdHNlbGVjdGVkIHsKLQljb2xvcjogI2NjMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLnNpZGVtZW51c3RhbmRhcmQgewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLnNpZGVtZW51c3RhbmRhcmRzZWxlY3RlZCB7Ci0JY29sb3I6ICNjYzAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uc21hbGx0ZXh0IHsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWNvbG9yOiAjMDAwMDAwOwotfQotCi0udGFibGVoZWFkZXIgeyAKLQotCWNvbG9yOiAjMDAwMDAwOwkKLQlmb250LXNpemU6IDEzcHg7CQotICAgIGZvbnQtd2VpZ2h0OiBib2xkCi19Ci0KLQotLyogZm9udCBmb3IgcmVndWxhciBjb250ZW50IHRleHQgKi8KLXRkIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7CQotfQotCi0vKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byBhIHNpbWlsYXIgZWxlbWVudCBmb3IgbGlua3MgKi8KLXRkLmFjdGl2ZXRhYiB7IAotIAliYWNrZ3JvdW5kLWNvbG9yOiAjYzRjNGM0OwotICB9Ci0gCi0vKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byBhIHNpbWlsYXIgZWxlbWVudCBmb3IgbGlua3MgKi8KLXRkLmFjdGl2ZXRhYnNlbGVjdGVkIHsgCi0gCWJhY2tncm91bmQtY29sb3I6ICNkZGRkZGQ7Ci0gIH0KLSAgCi0gLyogdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLXRkLmJ1dHRvbmJvZHkgewotCWJhY2tncm91bmQtY29sb3I6ICNkNGQ0ZDQ7Ci19Ci0KLXRkLmJ1dHRvbmhpZ2hsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLX0KLQotdGQuYnV0dG9uc2hhZG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNmQ2ZDZkOwotfQotIAotLyogZGVzaWduIGVsZW1lbnQgcmFyZWx5IHVzZWQgZm9yIGxpbmUgY29sb3VyIGluIGNlcnRhaW4gZGVjb3JhdGl2ZSB0YWJsZXMgKi8KLXRkLmRlc2lnbjEgewotCWJhY2tncm91bmQtY29sb3I6ICNkNGQ0ZDQ7Ci19Ci0gCi0vKmRlc2lnbiBlbGVtZW50IHNpbXVsYXRpbmcgYSBkaW1lbnNpb25hbCBib3VuZGFyeSB0byBhIHRhYmxlICovCi10ZC5kaXZpZGVyZGltZW5zIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjYmRiZGJkOwotfQotIAotIC8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIGEgc2ltaWxhciBlbGVtZW50IGZvciBsaW5rcyAqLwotdGQubm9uYWN0aXZldGFiIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0vKiBkYXRhIHdpdGhpbiBhIHRhYmxlIGhpZ2hsaWdodGVkIGluIGdyYXkqLwotdGQudGJsaGlnaGx0IHsgCi0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotICAgcGFkZGluZzogMnB4OwotIH0KLSAKLSB0ZC50YmxoaWdobHQxIHsgCi0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotIH0KLSAKLS8qIGRhdGEgd2l0aGluIGEgdGFibGUgaGlnaGxpZ2h0ZWQgaW4gbGlnaHQgZ3JheSovCi10ZC50YmxoaWdobHQyIHsgCi0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotIH0gCi0KLS8qZGFyayBncmV5IGNlbGwgYmFja2dyb3VuZCBhbmQgYm9sZCB0ZXh0ICovCi0udGRkYXJrYm9sZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsJCi0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS50ZGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotCXBhZGRpbmc6IDJweDsKLX0KLQotLnRkbGlnaHQxIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotIAotIAotdGV4dGFyZWEgewotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLXRleHRhcmVhLnB4MzgwewotIHdpZHRoOiAzODBweDsgCi0gfQotCi0udGV4dGVycm9ybXNnIHsKLQljb2xvciA6IGNjMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExMCU7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS50ZXh0Z3JheSB7ICAKLQljb2xvcjogIzk5OTk5OTsJCi19Ci0KLS50b3BiYXJkaXZpZGVyIHsgCi0JYmFja2dyb3VuZDogIzMzOTljYyAKLX0KLQotLnRvcGJhcmRpdmlkZXJncmV5ZWQgeyAKLQliYWNrZ3JvdW5kOiAjYWRkNmViCi0gfSAgCi0KLS50b3BiYXJzZXBhcmF0b3IgewotICBjb2xvcjogI2NjMzMwMDsgIAotICBmb250LXNpemU6IDExcHg7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0gCi0gCi0udG9wZnJhbWViZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2QyZDJkMjsKLX0KLQotLnRvcGZyYW1lYmdncmV5ZWQgewotCWJhY2tncm91bmQtY29sb3I6ICNlZGVkZWQ7Ci19Ci0KLS50b3BmcmFtZWhpZ2hsaWdodCB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjYjZiNWI1OwotfQotCi0udG9wZnJhbWVoaWdobGlnaHRncmV5ZWQgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogI2UxZTFlMTsKLX0KLQotLnRvcGZyYW1laGlnaGxpZ2h0MiB7IAotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLS50b3BmcmFtZWhpZ2hsaWdodDJncmV5ZWQgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5OwotIH0gCi0gCi0udG9wZnJhbWVsb2dvYmcgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwNjY5OTsKLX0KLQotLnRvcGZyYW1lbG9nb2JnZ3JleWVkIHsgIAotCWJhY2tncm91bmQtY29sb3I6ICM5OWMyZDY7Ci19Ci0KLS50b3BmcmFtZXNoYWRvdyB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjODQ4NDg0OwotfQotCi0udG9wZnJhbWVzaGFkb3dncmV5ZWQgeyAgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjY2VjZWNlOwotfQotCi0udG9wbGVmdG5hdiB7CQotICAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3BsZWZ0bmF2Ym9sZCB7IAotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBicmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsgCi0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7IAotfQotCi0udG9wbGVmdG5hdmJvbGRncmV5ZWQgeyAKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsgCi0JZm9udC1zaXplOiAxMHB4OyAKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7IAotfQotCi0udG9wbGVmdG5hdmdyZXllZCB7CQotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JfQotCi0udG9wbGluZWNvbG9yIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwNjY5OTsKLSB9CQotCQotLnRvcHJpZ2h0bmF2IHsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0KLS50b3ByaWdodG5hdmdyZXkKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0gLyogdGhpcyB3YXMgaW5pdGlhbGx5IGRlY2xhcmVkIHRoZSBzYW1lIGNvbG91ciBhcyB0aGUgY2xhc3MgdG9wZnJhbWUgYmcgYnV0IGJlY2F1c2UgaXQgbGllcyBpbiBhIGRpZmZlcmVudCBmdW5jdGlvbmFsIGFyZWEsIGhhcyBiZWVuIHJlY3JlYXRlZCBoZXJlICAqLwotdHIuYmdtaWRmcmFtZSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2QyZDJkMjsKLX0KLQotdGQuc2lkZW1lbnVidWxsZXRncmV5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0KLXRkLnNpZGVtZW51YnVsbGV0Y29sb3JlZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2NkMzMwMTsKLX0KLQotLypsaXN0LXN0eWxlLWltYWdlOiB1cmwoaW1hZ2VzL2Rvd25idXR0b24uZ2lmKTsqLwotdWwgewkKLQlsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsKLX0KLSAKLQotLnZvYiB7Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNTAlOwotCWNvbG9yOiAjMDA2Njk5OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQlmb250LXdlaWdodDogNDAwOwotfQotCi0udm9iYm90dG9tIHsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE0cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL3N0eWxlc19pZTZuczYuY3NzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL3N0eWxlc19pZTZuczYuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MGRjNDZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9zdHlsZXNfaWU2bnM2LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDExODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi0vKm11c3QgYWRkIGZvbnQgdHlwZSBpZiBjbGFzcyBpcyBiZWluZyB1c2VkIGFzIGEgbGluayBhcyB3ZWxsIGFzICBuby1saW5rICovCi0KLWEgewkKLQljb2xvcjogIzMzNjY5OTsKLX0KLQotYS50b3ByaWdodG5hdjphY3RpdmUgewotCWNvbG9yOiAjOTlDQ0NDOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTphY3RpdmUgewotCWNvbG9yOiAjQ0MwMDAwOwotfQotCi0KLWEudG9wcmlnaHRuYXZncmV5OmhvdmVyIHsKLQljb2xvcjogI0NDMDAwMDsKLX0gCi1hLnRvcHJpZ2h0bmF2OmhvdmVyIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0gLyogZm9udCBmb3IgYWN0aW9uIG9uIGNvbnRlbnQgcGFnZSB1c3VhbGx5IGxvY2F0ZWQgb24gdG9wIG9mIHBhZ2UgO2llLiwgc2VsZWN0IGFsbCovCi1hLmFjdGlvbiB7ICAKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDExcHg7CQotfSAKLQotYS5hY3Rpb25zZWxlY3RvciB7ICAKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7CQotfQotCi0vKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byB0aGlzIGVsZW1lbnQgaW5zdGVhZCBvZiB0aGUgb3V0ZXJtb3N0IGNlbGwgKi8KLWEuYWN0aXZldGFiIHsgCi0gCWNvbG9yOiAjMDAwMDAwOwotIAlmb250LXNpemU6IDEycHg7Ci0gIAl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudCBpbnN0ZWFkIG9mIHRoZSBvdXRlcm1vc3QgY2VsbCAqLwotYS5hY3RpdmV0YWJzZWxlY3RlZCB7IAotIAljb2xvcjogIzJjMmMyYzsKLSAJZm9udC1zaXplOiAxMnB4OwotICAJdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmJhc2ljIHsgCQotICAgIGNvbG9yOiAjMDAwMDAwOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b24gewotCWNvbG9yOiAjMzMzMzMzOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5idXR0b246YWN0aXZlIHsKLQljb2xvcjogMzMzMzMzOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZm9yIG5vbi1pbWFnZSBidXR0b25zLCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8KLWEuYnV0dG9uOmhvdmVyIHsKLQljb2xvcjogMzMzMzMzOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMgaW4gTXVsdGlzaXRlLCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8KLWEuYnV0dG9uMiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfQotCi0vKm1haW4gY29udGFpbmVyICBhY3Rpb25zL2xpbmtzIGZvciBlZGl0aW5nKi8KLWEuY29ubGlua2VkaXQKLXsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotCWZvbnQtc2l6ZSA6IDExcHg7Ci19Ci0KLWEuY29weXJpZ2h0IHsgCQotCWNvbG9yIDogIzk5OTk5OTsKLQlmb250LXNpemUgOiAxMHB4OwotfSAKLQotYS5mb3JtdGJsaGVhZCB7Ci0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLyogbGlnaHQgY29sb3VyZWQgaGVhZGluZyBsaW5rIGZvciBkaXNjdXNzaW9uIGFuZCBzaW1pbGFyIHVzZXMgLSB3YXMgaGVhZGVyX2Rpc2N1c3Npb25fbGluayBpbiBwcmV2aW91cyB2ZXJzaW9ucyAqLwotIGEuaGVhZGVybGlua2xpZ2h0IHsKLQljb2xvcjogCWZmZmZmZjsKLQlmb250LXNpemU6IDAuOWVtOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0JCi0KLS8qYm9sZCBsaW5rLCBpZSwgYWR2YW5jZWQgc2VhcmNoIGxpbmsgaW4gcGUqLwotYS5saW5rZnVuY29wdGlvbiB7ICAJCQotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCQotYS5uYXZ0cmVleyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTFweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0gCi0KLS8qbmF2dHJlZSBpdGVtIG9yIGRvYywgbm9kZXMgdGhhdCBkb24ndCBleHBhbmQqLwotYS5uYXZ0cmVlaXRlbXsgCQotICAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZSA6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLQotLyogc2ltcGxlIG1lY2hhbmlzbSB0byB0dXJuIHRleHQgZGVjb3JhdGlvbiBvZmYgKi8KLWEubm9saW5lIHsKLSAJdGV4dC1kZWNvcmF0aW9uOiBub25lOwotIH0KLQotYS5wb3B1cHRleHQgewkKLSAgIGNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTFweDsJCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnBvcHRleHQgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQgOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5wb3B1cHRleHQ6YWN0aXZlewkKLWNvbG9yOiAjY2MwMDAwOwotfQotCi1hLnNtYWxsIHsJCi0JZm9udC1zaXplOiAxMXB4OwkKLX0KLQotYS5zbWFsbGIgewkKLSAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsJCi19Ci0KLWEudG9wYmFyewotICBjb2xvcjogIzY2NjY2NjsKLSAgIGZvbnQtc2l6ZTogMTFweDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLQotLyp1c2VkIGFzIGhpZ2hsaWdodGVkIGRlc2NyaXB0aW9uIGFib3ZlIHRhYmxlcyovCi0uYWNjZW50Y29sb3IgewotCWNvbG9yIDogI2NjMzMwMDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotIC8qIGJnY29sb3IgIGZvciBhY3Rpb24gdGV4dCB1c3VhbGx5IGxvY2F0ZWQgb24gdG9wIG9mIHBhZ2U7aWUuLCBzZWxlY3QgYWxsKi8KLS5hY3Rpb25iZyB7IAotYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLmFjdGlvbnNlbGVjdG9yIHsKLSAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0uYWN0aW9uc2VsZWN0b3JkaXMgewotYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTsKLQljb2xvcjogI2NjY2NjYzsKLQlmb250LXNpemU6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1iIHsgCi0gICBmb250LXdlaWdodCA6IGJvbGQ7Ci0gfQotIAotLmJhc2VsaW5laXRhbGljcyB7Ci0JY29sb3I6ICM2NjY2NjY7Ci0JZm9udC1zaXplOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmJnYmxhY2sgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotfQotCi0gLyogYmFzaWMgY29sdW1uIGJhY2tncm91bmQgY29sb3VyIGZvciBkaXNjdXNzaW9ucywgZmlsZXMsIG90aGVyIHN1Y2ggdGFidWxhdGVkIGRhdGEgKi8KLS5iZ2NvbHVtbmJhc2ljIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLSB9Ci0gCi0uYmd3aGl0ZSB7IAotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0gfSAKLSAKLSAvKiBzaXplIGlucHV0IGZvciBiYXNpYyB0YWdzIHN1Y2ggYXMgcCBhbmQgbGkgdGhhdCBkbyBub3QgaW5oZXJpdCBmcm9tIHRkICovICAKLWJvZHkgewotCWJhY2tncm91bmQtY29sb3IgOiAjZmZmZmZmOyAgIAotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwkJCi0JbWFyZ2luLWxlZnQ6IDBweDsKLQltYXJnaW4tdG9wOiAwcHg7Ci19Ci0KLS5ib2xkIHsgCi0gICBmb250LXdlaWdodCA6IDYwMDsKLSB9Ci0KLSAuYm9yZGVyZ3JheSB7IAotCWJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7Ci0gfQotIAotIC5ib3R0b21iYXJkYXJreyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAzMzY2OwotIH0KLSAKLS5ib3R0b21iYXJsaWdodHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzMzOTljYzsKLSB9Ci0KLS5ib3R0b21iYXJzaGFkb3d7IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7Ci0gfQotCi0uYnJlYWRjcnVtYnN7IAotY29sb3I6ICMzMzY2OTk7Ci1mb250LXdlaWdodDogNjAwOwotIH0gCi0gCi0uYnJlYWRjcnVtYnMyeyAKLWNvbG9yOiAjZmZmZmZmOwotZm9udC1zaXplOiAxMXB4OwotIH0gCi0gIAotIC8qbmF2aWdhdGlvbiBidXR0b25zLCBub3QgZm9ybSBidXR0b25zKi8gCi0uYnV0dG9ucyB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS8qYWN0aXZlIG5hdmlnYXRpb24gYnV0dG9uLCBub3QgZm9ybSBidXR0b25zKi8gCi0uYnV0dG9ub24gewotICAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfSAKLQotLyogdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLS5idXR0b250eHQgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmNvZGUgeyAKLSAgIGZvbnQtZmFtaWx5OiBDb3VyaWVyIE5ldywgQ291cmllciwgbW9ubzsgICAKLSAgIGZvbnQtc2l6ZTogMTJweDsKLX0KLQotLyogZm9udCBmb3IgcmVndWxhciBjb250ZW50IHRleHQgKi8KLS5jb21tZW50cyB7IAkKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotCWZvbnQtc2l6ZTogMTFweDsJCi19Ci0KLS8qbWFpbiBjb250YWluZXIgaGVhZGVyKi8KLS5jb25oZWFkeyAKLWNvbG9yOiAjY2MzMzAwOwotZm9udC13ZWlnaHQ6IDYwMDsKLXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci0gfQotCi0gLyptYWluIGNvbnRhaW5lciBkYXRhIGxhYmVscyovCi0uY29ubGFiZWx7IAotYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLSB9IAotCi0vKm1haW4gY29udGFpbmVyIGRhdGEgbGFiZWxzIGluIGJvbGQqLwotLmNvbmxhYmVsYm9sZCB7IAotYmFja2dyb3VuZC1jb2xvcjogI2UxZTFlMTsKLWZvbnQtd2VpZ2h0OiBib2xkOwotIH0gIAotIAotLypyZXBsYWNpbmcgc2lkZW1lbnVfYm9sZHJpZ2h0IG1vdmluZyBmb3J3YXJkLCB1c2UgZm9yIGxpbmtzIGFuZCBub24tbGlua3MqLwotLmNvbnJib2xkCi17Ci0JY29sb3I6ICMwMDAwMDA7CQotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfSAKLSAKLSAKLS8qaGVhZGVyIGZvciByaWdodCBoYW5kIGNvbnRhaW5lciovCi0uY29ucmhlYWQgewotCWNvbG9yOiAwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLS8qbWFpbiBjb250YWluZXIgdGFibGUgaGVhZGVyKi8KLS5jb250YmxoZWFkIHsgCi0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCWNvbG9yOiAjMzMzMzMzOwkKLQlmb250LXNpemU6IDcwJTsJCi0gICAgZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLmNvbnRlbnR7IAotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwkKLSB9Ci0KLSAvKm1lZGl1bSBncmV5IGNlbGwgYmFja2dyb3VuZCovCi0uY29udGVudGJvcmRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLX0KLQotLyogYWRkZWQgZm9yIHRleHQgcmVwcmVzZW50aW5nIGRpc2FibGVkIGZ1bmN0aW9ucy4gKi8KLS5jb250ZW50ZGlzYWJsZWQgewotCWNvbG9yOiAjY2NjY2NjOwotfQotCi0vKiBmb250IGZvciBib2xkIHRleHQgKi8KLS5jb250ZW50ZW1waGFzaXMgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0vKiB1c2VkIHRleHQgcmVtaW5kaW5nIHVzZXIgdGhhdCB0aGVyZSBpcyByZXF1aXJlZCBjb250ZW50ICovCi0uY29udGVudHJlcXVpcmVkIHsKLQljb2xvcjogI2I0YjRiNDsKLQlmb250LXdlaWdodDogNTAwOwotfQotCi0uY29weXJpZ2h0IHsgCi0JY29sb3IgOiAjOTk5OTk5OwotCWZvbnQtc2l6ZSA6IDEwcHg7Ci19Ci0KLS8qYmxhY2sgY29weXJpZ2h0Ki8KLS5jb3B5cmlnaHRiIHsgCi1jb2xvciA6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTBweDsKLX0KLQotZGQgeyAKLWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsJCi1tYXJnaW4tbGVmdDogLTFweDsKLSB9Ci0gCi0uZGlhbGdieHNoYWRvdzIgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NDsKLX0KLQotLmRpYWxvZ3VlYm94YmcgewotIAliYWNrZ3JvdW5kLWNvbG9yOiAjZDJkMmQyCi19Ci0KLS8qYmFja2dyb3VuZCBmb3IgbG9naW4gcGFnZXMqLwotLmRpYWxvZ3VlYm94YmcyIHsgIAotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLS5kaWFsb2d1ZWJveGJvcmRlciB7IAotCWJhY2tncm91bmQtY29sb3I6ICMzMzMzMzMKLSB9Ci0gCi0uZGlhbG9ndWVib3hoaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLS5kaWFsb2d1ZWJveG1lZGl1bSB7IAotCWJhY2tncm91bmQtY29sb3I6ICM4YjhiOGIKLSB9Ci0gCi0uZGlhbG9ndWVib3h0aXRsZSB7CSAgIAotCWZvbnQtc2l6ZTogMTRweDsKLQlmb250LXdlaWdodCA6IGJvbGQ7Ci19Ci0KLS8qdGV4dCBmb3IgZGlzYWJsZWQgYnV0dG9ucyovCi0uZGlzYWJsZXsgCi1jb2xvcjogIzk5OTk5OTsKLWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotZm9udC1zaXplOiAxMXB4OyAgCi0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gfSAKLQotIGRpdnsgCi1mb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSB9IAotCi0vKnVzZWQgdG8gYWZmZWN0IHJpZ2h0IG1hcmdpbiovIAotZGl2Lm1hcmdpbnJ0eyAKLQljbGVhcjogcmlnaHQ7Ci0JZmxvYXQ6IHJpZ2h0OwotCXdpZHRoOiA3cHg7Ci0gfSAKLSAKLWRpdi5tYXJnaW5zIHsgCi1mbG9hdDogbGVmdDsKLW1hcmdpbi1sZWZ0OiA3cHg7Ci1tYXJnaW4tdG9wOiAyNXB4OwkKLW1hcmdpbi1yaWdodDogN3B4OwotIH0gICAKLQotLypmb3IgcGFnZXMgd2l0aCBidXR0b24gbmF2aWdhdGlvbiBvbiB0b3AqLyAgCi1kaXYubWFyZ2luczIwIHsgCi1mbG9hdDogbGVmdDsKLW1hcmdpbi1sZWZ0OiA3cHg7Ci1tYXJnaW4tdG9wOiAyMHB4OwkKLW1hcmdpbi1yaWdodDogN3B4OwotIH0gICAKLQotIC8qYWRkcyAxMCBweCBwYWRkaW5nKi8KLSBkaXYucGFkMTB7IAotIHBhZGRpbmc6IDEwcHg7IAotICB9Ci0gIAotLmRpdmlkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICNmNmY5ZjA7Ci19Ci0KLWRseyAgCi1mb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLWZvbnQtc2l6ZTogMTJweDsgICAKLQl9Ci0JCi0vKnJlbW92ZXMgZGVmYXVsdCBib3R0b20gbWFyZ2luLCBkb2Vzbid0IHdvcmsgaW4gTlM0Ljd4ICovICAKLSBkbC5kYXRhIHsgCi1tYXJnaW4tYm90dG9tOiAtMXB4OwotIH0gCi0gCi0uZG9jYm9sZCB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OyAgICAgICAKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLypmb3IgYXBwbGV0IGRvd25sb2FkIHNwbGFzaCBwYWdlKi8KLS5kb3dubG9hZHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZWVlOwotIH0KLSAKLS5lcnJvcm1zZyB7Ci0JY29sb3IgOiAjY2MwMDAwOwkKLX0gIAotCi0vKgotY29sb3JlZCBmb250Ci1kZXNjcmlwdGlvbiBhYm91dCB0aGUgdXNlciBzdGF0dXMuIGVxLiAic3Vic2NyaXB0aW9ucyBhcmUgdXBkYXRlZCIKLWl0J3MgdXN1YWxseSBvbiB0aGUgdXBwZXIgcGFydCBvZiB0aGUgcGFnZXMKLSovCi0uZm9vdGVyYm9sZCB7Ci0JY29sb3IgOiAjYTRhNGE0OwotCWZvbnQtc2l6ZTogOTAlOwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qdGhlICogc3ltYm9sIGluZGljYXRlIHRoZSByZXF1aXJlZCBmaWVsZCAqLwotLmZvb3RlcmJvbGRjb2xvcmVkIHsKLQljb2xvciA6ICNmZjY1MDA7Ci0JZm9udC1zaXplOiA5MCU7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLmZvb3RpbmRpY2F0b3IgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsgICAgICAgCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnRoZSAqIHN5bWJvbCBpbmRpY2F0ZSB0aGUgcmVxdWlyZWQgZmllbGQgKi8KLS5mb290c3RhcmluZGV4IHsKLQljb2xvciA6ICNjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5mb3JtbGFiZWwgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uZm9ybXRibGhlYWQgewotICAgYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS5ncmV5bWVkaXVtIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotfQotCi0uZ3JheWZvbGQgewotCWNvbG9yOiAjY2NjY2NjOwkKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JZm9udC1zaXplOiAxNXB4OwotfQotCi0vKk5vdGU6IHJlbW92ZSB0aGlzIG5vdGUgaWYgdXNpbmcgdGhpcyBzdHlsZSBvciB3aWxsIGJlIGRlbGV0ZWQqLwotCS8qIEN1cnJlbnRseSB1c2VkIGluIGNxX2RlZmxlY3RfbG9naW5fZXJyLmh0bWwgLSBzaG91bGQgYmUgcmVuYW1lZCB0byBzb21ldGhpbmcgdGhhdCBoYXMgbGVzcyBkZXNjcmlwdGl2ZSBuYW1lICovCi0uaGVhZGVyYmx1ZSB7Ci0JY29sb3I6ICMwMDY2OTk7CQotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyp1c2VkIGluIGNjIGZvciBmcmFtZXNldCBkaXNwbGF5Ki8gCi0uaGVhZGVyaW5mcmFtZXMgeyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1zaXplOiA5MCU7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQltYXJnaW4tYm90dG9tOiAycHg7Ci0JbWFyZ2luLXRvcDogMHB4OwotfQotCi0KLSAvKmZvbnQgZm9yIHBhZ2UgaGVhZGVyIGV4Y2VwdCBmb3IgYXJ0aWNsZSBwYWdlcywgKHNlZSBoZWFkZXJfb2ZfYXJ0aWNsZSkqLwotLmhlYWRlcmxhcmdlIHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDE2MCU7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKm1haW4gaGVhZGVyIGZvciBmcmFtZSBuYXZpZ2F0aW9uLCBpZSwgY2xlYXJjYXNlIG1lcmdlIGZpbGVzKi8KLS5oZWFkZXJtYWluIHsgIAotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTdweDsJCi0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLyogaGVhZGVyIGVsZW1lbnQgZm9yIGZvcm0gdGFibGVzIGNvbnRhaW5pbmcgbWlkLXNpemUgZml4ZWQgaGVpZ2h0IHRleHQgKi8KLS5oZWFkZXJtZWRsaXN0IHsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLS8qZm9ybnQgZm9yIHN0ZXBzIHRpdGxlIGluIGZvcm1zKi8KLS5oZWFkZXJvZnN0ZXBzIHsgCi0JY29sb3I6ICM2NjY2NjY7Ci0JZm9udC1zaXplOiAxN3B4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaGVhZGVyb2ZzdGVwc25vbiB7IAotCWNvbG9yOiAjNjY2NjY2OwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qdXNlIGhlYWRlcjEgaW5zdGVhZCovCi0uaDEgeyAgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMnB4OwkKLQlmb250LXdlaWdodDogODAwOwotfQotCi0vKnRvIHJlcGxhY2UgaDEgYW5kIGNvbnRlbnRoZWFkZXIgbGFyZ2UqLwotLmhlYWRlcjEgeyAgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMnB4OwkKLQlmb250LXdlaWdodDogODAwOwotfQotCi0vKmRvY3VtZW50IHJvb3QgZm9sZGVyKi8KLS5oMXJvb3R7ICAKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDIycHg7CQotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS8qdXNlZCBpbiBjYywgY3EsIHNsKi8gIAotaDEgeyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxN3B4OwkKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKnVzZSBoZWFkZXIyIGluc3RlYWQqLwotLmgyIHsgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOXB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7CSAJCi19Ci0KLS8qaGVhZGVycyB3aXRoaW4gcGFnZSovCi0uaGVhZGVyMiB7IAotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTlweDsKLQlmb250LXdlaWdodDogNDAwOwkgCQotfQotCi1pIHsKLQlmb250LXN0eWxlIDogaXRhbGljOwotfQotCi0uaWNvbmJvcmRlciB7IAotIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci19Ci0KLS8qZm9udCBzaXplIHNldHVwIHNob3duIGluIHRoZSBpbnB1dCBib3ggd2hpY2ggaXMgaW5oZXJpdGVkIGJ5IGlucHV0WFgqLwotaW5wdXQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDExcHg7Ci19IAotCi0vKiAxLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRSAqLwotaW5wdXQubWF4NTAgewotCXdpZHRoOiAzNjBweDsKLX0KLQotaW5wdXQucHgyNSB7Ci0gICAgd2lkdGg6IDI1cHgKLX0KLQotaW5wdXQucHg0NSB7Ci0KLSAgICB3aWR0aDogNDVweAotfQotCi0vKgotMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUKLSovCi1pbnB1dC5weDg1IHsKLSAgICB3aWR0aDogODVweAotfQotCi1pbnB1dC5pbnB1dDEzNSB7Ci0Jd2lkdGg6IDEzNXB4Ci19Ci0KLWlucHV0LnB4MTM1IHsKLSAgICB3aWR0aDogMTM1cHgKLX0KLQotaW5wdXQucHgxNTUgewotICAgIHdpZHRoOiAxNTVweAotfQotCi1pbnB1dC5weDIzMCB7Ci0gICAgd2lkdGg6IDIzMHB4Ci19Ci0KLWlucHV0LnB4MzA1IHsKLSAgICB3aWR0aDogMzA1cHg7Ci19Ci0KLQotLmxlZnRtZW51IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0ubGVmdG1lbnVidWxsZXQgeyAKLWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci0gfQotIAotLmxlZnRtZW51YnVsbGV0YWN0aXZlIHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjY2QzMzAxOwotIH0gCi0gCi0ubGVmdG5hdmhlYWQgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtd2VpZ2h0OiBib2xkOwkKLQlmb250LXNpemU6IDEzcHg7CQotfSAKLQotLmxlZnRuYXZsYWJlbCB7Ci1jb2xvcjogIzAwMDAwMDsKLWZvbnQtd2VpZ2h0IDogNjAwOwotZm9udC1zaXplOiAxMXB4OwotIH0KLQotIC5saWdodGdyYXkgeyAKLWJhY2tncm91bmQtY29sb3I6ICNlNGU0ZTQ7Ci0gfQotCi0ubWVudWJhciB7Ci0gIGNvbG9yOiAjZmZmZmZmOwotICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAxMXB4OwotICBmb250LXdlaWdodDogNDAwOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmUKLX0KLQotCi0ubWVudWJhcjpob3ZlciB7Ci0gIGNvbG9yOiAjZmZmZmZmCi19IAotCi0vKm1lbnViYXIgd2l0aGluIHRvcCBvZiBjb250ZW50IHBhZ2UgICovCi0ubWVudWJhcm1pZHsgCi1mb250LXNpemU6IDExcHg7Ci0gIGZvbnQtd2VpZ2h0OiA2MDA7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZQotIH0KLSAKLS8qCi0xLGJvbGQgZm9udCBmb3IgdGhlIGxhc3QgaXRlbSBvZiB0aGUgYnJlYWRjcnVtYnMKLTIsYm9sZCBmb250IG9mIHRhYmxlIGhlYWRlciB3aXRoIG1lbnViYXJfYmcoYmx1ZSkgYXMgYmFja2dyb3VuZCBjb2xvciAKLTMsYm9sZCB0ZXh0IG9uIGNvbG9yZWQgYmFja2dyb3VuZCBlZy4gTG9nZ2VkIEluCi0qLwotIC5tZW51YmFyZW1waGFzaXMgewotICBjb2xvcjogI2ZmZmZmZjsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTFweDsKLSAgZm9udC13ZWlnaHQ6IDYwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLS5tZW51YmFyOmhvdmVyIHsKLSAgY29sb3I6ICNmZmZmZmYKLX0gCi0KLS5taWRiYXJiZyB7IAotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0gfQotICAKLS8qdG9wbmF2Ki8gCi0ubWlkYmFybGlnaHQgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMzM5OWNjOwotIH0KLQotLypkYXJrIGNvbG9yIGJldHdlZW4gdGFicyovCi0ubWlkYmFyZGFyayB7IAotCWJhY2tncm91bmQ6ICMwMDMzNjY7Ci0gfQotIAotLyp0b3BuYXYqLyAKLSAubWlkYmFybWVkIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwNjY5OTsKLSB9Ci0gCi0gLypiYWNrZ3JvdW5kICBvZiAgdGFicyovCi0ubWlkYmFybWVkaXVtIHsgCi0JYmFja2dyb3VuZDogIzAwNjY5OTsKLSB9Ci0gCi0gLm1pZGJhcnNoYWRvdyB7IAotCWJhY2tncm91bmQtY29sb3I6ICM2NjY2NjY7Ci0gfQotIAotLypyZXBsYWNpbmcgc2lkZW1lbnVfYm9sZGxlZnQgbW92aW5nIGZvcndhcmQqLwotLm5hdmxlZnRib2xkIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLypsZWZ0IG5hdiBzdWJtZW51Ki8KLS5uYXZsZWZ0c3ViCi17Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotICAKLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudCBpbnN0ZWFkIG9mIHRoZSBvdXRlcm1vc3QgY2VsbCAqLwotLm5vbmFjdGl2ZXRhYiB7Ci0JY29sb3I6ICNiNGI0YjQ7Ci0JZm9udC1zaXplOiAxMnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypub3Rlcy8gZGVzY3JpcHRpb24gb2YgaWNvbiAqLwotLm5vdGVzeyAgCi0gZm9udC1zaXplOiAxMXB4OwotIGZvbnQtd2VpZ2h0IDogNDAwOwkKLX0KLQotcCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwkKLX0KLQotLnBhZ2Vib2xkIHsgCi0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC13ZWlnaHQgOiA2MDA7CQotIH0KLSAKLSAvKmZvbnQgZm9yIHRoZSBudW1iZXJzIGluIHBhZ2luYXRpb24gbGlicmFyeSovCi0gLnBhZ2VudW1iZXIgewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotfQotCi0gLypmb250IGZvciBwcmV2aW91cyAmIG5leHQgaW4gcGFnaW5hdGlvbiovCi0ucGFnZXN0ZXBzIHsgCi0JY29sb3I6ICM2NzY3Njc7CQotCWZvbnQtc2l6ZTogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gfQotCi0ucG9wIHsKLQlmb250LXNpemUgOiAxMnB4OwotCWZvbnQtd2VpZ2h0IDogMjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnBvcGJhY2tncm91bmQgewotCWJhY2tncm91bmQ6ICNkNmQzY2U7Ci19Ci0KLS5wb3BoMSB7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0IDogYm9sZDsKLX0KLQotLnBvcGxlZnRtZW51IHsKLQliYWNrZ3JvdW5kOiAjZjBmMGYwOwotCWJvcmRlcjogdGhpbiBzb2xpZCBjY2NjY2M7IAotCWxlZnQ6IDIxMHB4OyAKLQlwYWRkaW5nOiAycHg7Ci0JcG9zaXRpb246YWJzb2x1dGU7IAotCXRvcDogMjVweDsKLQl2aXNpYmlsaXR5OiBoaWRkZW47IAotCXdpZHRoOjc1cHg7Ci0Jei1pbmRleDoxMDsKLSB9Ci0KLSAvKiB1c2UgcG9wbGVmdG1lbnUgaW5zdGVhZCBvZiB0aGlzIG9uZSovCi0gLnBvcHVwYm9yZGVyIHsJCi0JYmFja2dyb3VuZDogI2YwZjBmMDsKLQlib3JkZXIgOiB0aGluIHNvbGlkIGNjY2NjYzsKLQlwYWRkaW5nIDogMnB4OwotfQotCi0ucG9wdXB0ZXh0IHsJCi0gICBjb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDExcHg7CQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotIAotLnByb2plY3RhdHQgeyAKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7IAotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOyAKLQljb2xvcjogI2NkMzMwMTsKLX0KLQotLypkYXRlIGFzc29jaWF0ZWQgd2l0aCBhcnRpY2xlIHJhdGluZ3MqLwotLnJhdGluZ3NkYXRlCi17Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1zaXplIDogMTFweDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotCXRleHQtYWxpZ246IHJpZ2h0OwotfQotCi1zZWxlY3QgewotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLXNlbGVjdC5zZWxweDE0NCB7Ci0gICAgd2lkdGg6IDE0NHB4OwotfQotCi0vKiAuc2lkZW1lbnVfYm9sZGxlZnQgcmVwbGFjZSB3aXRoIC5sZWZ0bWVudWJvbGQqLyAKLQotLyogLnNpZGVtZW51X2JvbGRsZWZ0X3NlbGVjdGVkIHJlcGxhY2Ugd2l0aCAubGVmdG1lbnVhY3RpdmUqLwotIAotLyogLnNpZGVtZW51X2J1bGxldF9jb2xvcmVkIHJlcGxhY2Ugd2l0aCAubGVmdG1lbnVidWxsZXRhY3RpdmUqLwotIAotLyouc2lkZW1lbnVfYnVsbGV0X2dyZXkgcmVwbGFjZSB3aXRoIGxlZnRtZW51YnVsbGV0Ki8KLSAKLS5zaWRlbWVudWJvbGRsZWZ0IHsKLQljb2xvcjogIzAwMDAwMDsJCi0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19IAotCi0uc2lkZW1lbnVib2xkbGVmdHNlbGVjdGVkIHsKLQljb2xvcjogI2NjMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLnNpZGVtZW51c3RhbmRhcmQgewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLnNpZGVtZW51c3RhbmRhcmRzZWxlY3RlZCB7Ci0JY29sb3I6ICNjYzAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uc21hbGx0ZXh0IHsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWNvbG9yOiAjMDAwMDAwOwotfQotCi0udGFibGVoZWFkZXIgeyAgCi0JY29sb3I6ICMwMDAwMDA7CQotCWZvbnQtc2l6ZTogMTNweDsJCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQKLX0KLQotLyogZm9udCBmb3IgcmVndWxhciBjb250ZW50IHRleHQgKi8KLS8qIGZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0ICovCi10ZCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwkKLX0JCi0KLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIGEgc2ltaWxhciBlbGVtZW50IGZvciBsaW5rcyAqLwotdGQuYWN0aXZldGFiIHsgCi0gCWJhY2tncm91bmQtY29sb3I6ICNjNGM0YzQ7Ci19Ci0KLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIGEgc2ltaWxhciBlbGVtZW50IGZvciBsaW5rcyAqLwotdGQuYWN0aXZldGFic2VsZWN0ZWQgeyAKLSAJYmFja2dyb3VuZC1jb2xvcjogI2RkZGRkZDsKLSAgfQotCi0vKiB0aGVzZSBidXR0b24gc3R5bGVzIGFyZSBmb3IgdGhlIHRleHR1YWwgYnV0dG9ucyBpbnRlbmRlZCB0byByZXBsYWNlIGltYWdlIGNvbnN0cnVjdHMgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovIAotdGQuYnV0dG9uYm9keSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2Q0ZDRkNDsKLX0KLQotdGQuYnV0dG9uaGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotfQotCi10ZC5idXR0b25zaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM2ZDZkNmQ7Ci19Ci0gIAotLyogZGVzaWduIGVsZW1lbnQgcmFyZWx5IHVzZWQgZm9yIGxpbmUgY29sb3VyIGluIGNlcnRhaW4gZGVjb3JhdGl2ZSB0YWJsZXMgKi8KLXRkLmRlc2lnbjEgewotCWJhY2tncm91bmQtY29sb3I6ICNkNGQ0ZDQ7Ci19Ci0KLS8qZGVzaWduIGVsZW1lbnQgc2ltdWxhdGluZyBhIGRpbWVuc2lvbmFsIGJvdW5kYXJ5IHRvIGEgdGFibGUgKi8KLXRkLmRpdmlkZXJkaW1lbnMgewotCWJhY2tncm91bmQtY29sb3I6ICNiZGJkYmQ7Ci19Ci0KLSAvKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byBhIHNpbWlsYXIgZWxlbWVudCBmb3IgbGlua3MgKi8KLSB0ZC5ub25hY3RpdmV0YWIgewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLS8qIGRhdGEgd2l0aGluIGEgdGFibGUgaGlnaGxpZ2h0ZWQgaW4gZ3JheSovCi10ZC50YmxoaWdobHQgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gICBwYWRkaW5nOiAycHg7Ci0gfQotIAotIHRkLnRibGhpZ2hsdDEgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gfQotIAotLyogZGF0YSB3aXRoaW4gYSB0YWJsZSBoaWdobGlnaHRlZCBpbiBsaWdodCBncmF5Ki8KLXRkLnRibGhpZ2hsdDIgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfSAKLQotLypkYXJrIGdyZXkgY2VsbCBiYWNrZ3JvdW5kIGFuZCBib2xkIHRleHQgKi8KLS50ZGRhcmtib2xkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0udGRsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLQlwYWRkaW5nOiAycHg7Ci19Ci0KLS50ZGxpZ2h0MSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotdGV4dGFyZWEgewotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLXRleHRhcmVhLnB4MzgwewotIHdpZHRoOiAzODBweDsgCi0gfQotCi0udGV4dGVycm9ybXNnIHsKLQljb2xvciA6IGNjMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExMCU7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS50ZXh0Z3JheSB7ICAKLQljb2xvcjogIzk5OTk5OTsJCi19Ci0KLS50b3BiYXJkaXZpZGVyIHsgCi0JYmFja2dyb3VuZDogIzMzOTljYyAKLX0KLQotLnRvcGJhcmRpdmlkZXJncmV5ZWQgeyAKLQliYWNrZ3JvdW5kOiAjYWRkNmViCi19ICAKLQotLnRvcGJhcnNlcGFyYXRvciB7Ci0gIGNvbG9yOiAjY2MzMzAwOyAgCi0gIGZvbnQtc2l6ZTogMTFweDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0udG9wZnJhbWViZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2QyZDJkMjsKLX0KLQotLnRvcGZyYW1lYmdncmV5ZWQgewotCWJhY2tncm91bmQtY29sb3I6ICNlZGVkZWQ7Ci19Ci0KLS50b3BmcmFtZWhpZ2hsaWdodCB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjYjZiNWI1OwotfQotCi0udG9wZnJhbWVoaWdobGlnaHRncmV5ZWQgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogI2UxZTFlMTsKLX0KLQotLnRvcGZyYW1laGlnaGxpZ2h0MiB7IAotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0gCi0udG9wZnJhbWVoaWdobGlnaHQyZ3JleWVkIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTsKLX0gCi0KLS50b3BmcmFtZWxvZ29iZyB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OwotfQotCi0udG9wZnJhbWVsb2dvYmdncmV5ZWQgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzk5YzJkNjsKLX0KLQotLnRvcGZyYW1lc2hhZG93IHsgIAotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS50b3BmcmFtZXNoYWRvd2dyZXllZCB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2VjZWNlOwotfQotCi0udG9wbGVmdG5hdiB7CQotICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JY29sb3I6ICMwMDAwMDA7Ci19Ci0KLS50b3BsZWZ0bmF2Ym9sZCB7IAotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsgCi0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7IAotfQotCi0udG9wbGVmdG5hdmJvbGRncmV5ZWQgeyAKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsgCi0JZm9udC1zaXplOiAxMHB4OyAKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7IAotfQotCi0udG9wbGVmdG5hdmdyZXllZCB7CQotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3BsaW5lY29sb3IgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OwotIH0KLQotLnRvcHJpZ2h0bmF2IHsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0udG9wcmlnaHRuYXZncmV5IAotewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIHRoaXMgd2FzIGluaXRpYWxseSBkZWNsYXJlZCB0aGUgc2FtZSBjb2xvdXIgYXMgdGhlIGNsYXNzIHRvcGZyYW1lIGJnIGJ1dCBiZWNhdXNlIGl0IGxpZXMgaW4gYSBkaWZmZXJlbnQgZnVuY3Rpb25hbCBhcmVhLCBoYXMgYmVlbiByZWNyZWF0ZWQgaGVyZSAgKi8KLXRyLmJnbWlkZnJhbWUgewotCWJhY2tncm91bmQtY29sb3I6ICNkMmQyZDI7Ci19Ci0KLXRkLnNpZGVtZW51X2J1bGxldF9ncmV5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0KLXRkLnNpZGVtZW51X2J1bGxldF9jb2xvcmVkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2QzMzAxOwotfQotCi0vKmxpc3Qtc3R5bGUtaW1hZ2U6IHVybChpbWFnZXMvZG93bmJ1dHRvbi5naWYpOyovCi11bCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Ci19Ci0KLS52b2IKLXsKLQlmb250LXNpemU6IDE1MCU7Ci0JY29sb3I6ICMwMDY2OTk7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS52b2Jib3R0b20KLXsKLQlmb250LXNpemU6IDE0cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL3N0eWxlc19uZXRzY2FwZTQuY3NzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL3N0eWxlc19uZXRzY2FwZTQuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNTc1ZDQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9zdHlsZXNfbmV0c2NhcGU0LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDExNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi10ZC5zcGFuLmNvbnRlbnRfYmFzaWMKLSB7Ci0JcGFkZGluZy1sZWZ0IDogNXB4OwotfQotCi1hCi17Ci0JY29sb3I6ICMzMzY2OTk7Ci19Ci0KLQotLmFjY2VudGNvbG9yCi17Ci0JY29sb3IgOiAjY2MzMzAwOwotCWZvbnQtc2l6ZSA6IDEycHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotYS50b3ByaWdodG5hdjphY3RpdmUgewotCWNvbG9yOiAjOTlDQ0NDOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTphY3RpdmUgewotCWNvbG9yOiAjQ0MwMDAwOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTpob3ZlciB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19IAotYS50b3ByaWdodG5hdjpob3ZlciB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19IGEuYnJlYWRjcnVtYnMKLXsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZQotfQotCi0KLWEuYnJlYWRjcnVtYnM6aG92ZXIKLXsKLSAgY29sb3I6ICNmZmZmZmYKLX0KLQotCi1hLmxpbmtfcmV2ZXJzZTpob3ZlcgotewotICAgIGJhY2tncm91bmQ6ICNkY2RjZGM7Ci19Ci0KLQotYS5saW5rX2NvbnRhaW5lcl9lZGl0b3IKLXsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotCWZvbnQtc2l6ZSA6IDExcHg7Ci19Ci0KLQotYS5saW5rX2J5bGluZQotewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtc2l6ZSA6IC45ZW07Ci19Ci0KLQotYS5saW5rX2Z1bmNfb3B0aW9uCi17Ci0gIAlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotYS5saW5rdHlwZWQKLXsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLWEubWVudWJhcl9saW5rCi17Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUKLX0KLQotYS5tZW51YmFyX2xpbms6aG92ZXIKLXsKLQljb2xvcjogI2ZmZmZmZjsKLX0KLQotYS5uYXZ0cmVlCi17IAkKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLQotYS5wcm9qZWN0X25hdgotewotCWNvbG9yOiAjMDA2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci1hLnByb2plY3RfbmF2dHJlZQotewotICBjb2xvcjogIzAwMDAwMDsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTFweDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotYS50b3BiYXIKLXsKLSAgY29sb3I6ICM2NjY2NjY7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IDExcHg7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYm9keSAKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDlweDsKLQliYWNrZ3JvdW5kLWNvbG9yIDogV2hpdGU7Ci19Ci0KLQotLmJvcmRlcl9kZWNvcmF0aW9uCi17Ci0JYm9yZGVyIDogdGhpbiBkb3R0ZWQgIzY2NjY2NjsKLX0KLQotCi0uYm90dG9tYmFyX2RhcmsKLXsgCi0JYmFja2dyb3VuZDogIzAwMzM2NjsKLSB9Ci0KLQotLmJvdHRvbWJhcl9saWdodAoteyAKLQliYWNrZ3JvdW5kOiAjMzM5OWNjOwotIH0KLQotCi0gLmJvdHRvbV9tZWRpdW0KLXsgCi0JYmFja2dyb3VuZDogIzAwNjY5OTsKLSB9Ci0KLQotIC5ib3R0b21iYXJfc2hhZG93Ci17IAotCWJhY2tncm91bmQ6ICMwMDAwMDA7Ci0gfQotCi0KLWNvZGUgCi17Ci0JY29sb3I6ICM2NzY3Njc7CQotfQotCi0uY29kZTIKLXsKLSAgIAltYXJnaW4tbGVmdCA6IDE1cHg7Ci0JbWFyZ2luLXJpZ2h0IDogMTVweDsKLX0KLQotLmNvcHlyaWdodAoteyAKLQljb2xvciA6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZSA6IDYwJTsKLSB9Ci0KLQotLmNvbnRlbnRfYmFzaWMKLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uY29udGVudF9iYXNpY19lbXBoYXNpcwotewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uY29udGVudF9jb2xvcmVkCi17Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZSA6IDEycHg7Ci19Ci0KLQotLmNvbnRlbnRfY29udGFpbmVyCi0gewotCW1hcmdpbi1ib3R0b20gOiAxNXB4OwotfQotCi0gLmNvbnRlbnRfZGlhZ3JhbQotIHsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6NjAlOwotCWZvbnQtc3R5bGUgOiBpdGFsaWM7Ci0JCi19Ci0KLS5jb250ZW50X2dyZXlfbWlkCi17Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uY29udGVudF9ncmV5X21pZDIKLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uY29udGVudF9lbXBoYXNpcwotIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQlmb250LXNpemUgOiAxMXB4OwotfQotCi0uY29udGVudF9oZWFkZXIKLXsKLQljb2xvcjogIzAwNjY5OTsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMTAlOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmNvbnRlbnRfaGVhZGVyX2xhcmdlCi17Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMS4yZW07Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0KLSAuY29udGVudF9oZWFkZXJfY29sb3JlZAotewotCWNvbG9yOiAjNjc2NzY3OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotCi0gLmNvbnRlbnRfcmVmZXJlbmNlCi0gewotCWZvbnQtc3R5bGUgOiBpdGFsaWM7Ci19Ci0KLSAuY29udGVudF9yaWdodAotewotCWZsb2F0OiByaWdodDsKLQltYXJnaW4tdG9wIDogNXB4OwotCXdpZHRoOiAxNjY7Ci19Ci0KLSAuY29udGVudF9yaWdodF90YWJsZQotewotCXdpZHRoOiAxMDAlOwotfQotCi0KLSAuY29udGVudF9zbWFsbAotewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemUgOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotIC5jb250ZW50X3NtYWxsX2NvbG9yZWQKLXsKLQljb2xvciA6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZSA6IDExcHg7Ci19Ci0KLQotIC5jb250ZW50X3NtYWxsX2NvbG9yZWRfMgotewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemUgOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotICAuY29udGVudF9zbWFsbF9jb2xvcmVkXzMKLXsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplIDogMTFweDsKLX0KLQotCi0uY29udGVudF9zbWFsbF9lbXBoYXNpcwotIHsKLSAJZm9udC1zaXplIDogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotCi0uY29udGVudF9zdWJoZWFkZXIKLXsKLSAgICBmb250LXNpemUgOiAxMnB4OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXdlaWdodDogIGJvbGQ7Ci19Ci0KLQotLmNvbnRlbnRfc3ViaGVhZGVyXzIKLXsgCi0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMnB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci0gfQotCi0KLSAuZGlzY3Vzc2lvbl9jb250ZW50Ci17IAotCWNvbG9yOiAwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotCW1hcmdpbi1sZWZ0OiA1cHg7Ci0gfQotCi0KLS5kaXNjdXNzaW9uX2NvbnRlbnRfZW1waGFzaXMKLXsKLQljb2xvcjogMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQltYXJnaW4tbGVmdDogNXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0KLSAuZGlzY3Vzc2lvbl9kZXNjcmlwdGlvbgotIHsgCi0JY29sb3I6IDY2NjY2NjsKLQlmb250LXNpemU6IDExcHg7Ci0JbWFyZ2luLWxlZnQ6IDVweDsKLSAgfQotCi0KLS5lZGl0b3Jub3RlIAoteyAgCi0JZm9udC1zdHlsZTogaXRhbGljCi19Ci0KLSAvKnRoZSBmb2xsb3dpbmcgdHdvIGNsYXNzZXMgYXJlIHVzZWQgZXhwcmVzc2x5IGluIHRoZSBrbm93bGVkZ2VfYW5ub3VuY2VtZW50c192aWV3Ki8KLSAKLSAuZmxvYXRjbGVhcgotewotCXBhZGRpbmc6IDVweDsKLQlwYWRkaW5nLWJvdHRvbTogMHB4OwotCXBhZGRpbmctcmlnaHQ6IDAgcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5mbG9hdGdyZXkKLXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotCXBhZGRpbmc6IDVweDsKLQl3aWR0aDogNjVweDsKLX0KLQotCi0uZm9vdG5vdGUKLXsgCi0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAuOWVtOwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotIH0KLS5mb3JtZmllbGRfZGVzYyAKLXsKLWNvbG9yOiAjMzMzMzMzOyAKLWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOyAKLWZvbnQtc2l6ZTogMWVtOyAKLWZvbnQtd2VpZ2h0IDogNDAwOyAKLSBmb250LXN0eWxlOiBpdGFsaWMKLX0KLS5mb3JtZmllbGRfdGl0bGUKLXsKLSAgICBmb250LXNpemUgOiAxMnB4OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXdlaWdodDogIGJvbGQ7Ci19Ci0uZm9vdF9zdGFyaW5kZXgKLXsKLQljb2xvciA6ICNjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotLmZvb3RfZGVzY3JpcHRpb24KLXsKLQljb2xvciA6ICNmZjY1MDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotLmZvb3RfdGV4dAotewotCWNvbG9yOiAjYjRiNGI0OwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0KLS5mb290X3RpdGxlCi17Ci0JY29sb3IgOiAjZmY2NTAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotfQotCi0KLS5mbG93Y2hhcnQgCi17ICAKLQlmb250LXNpemU6IDhwdDsgY29sb3I6ICM2NjY2NjYKLX0KLQotCi0uaGVhZGVyX2Rpc2N1c3Npb25fbGluawotIHsKLQljb2xvcjogZmZmZmZmOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLmhlYWRlcl9kaXNjdXNzaW9uX2xpbmtkawotIHsKLQljb2xvcjogMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotCi0uaGVhZGVyX2Rpc2N1c3Npb25fdGl0bGUKLSB7Ci0JY29sb3I6IGZmZmZmZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQltYXJnaW4tbGVmdCA6IDVweDsKLQltYXJnaW4tcmlnaHQ6IDVweDsKLX0KLQotCi0uaGVhZGVybGlua19vZl9jb250YWluZXIKLXsKLQljb2xvcjogIzY2OTljYzsKLQlmb250LWZhbWlseTogYXJpYWwsdmVyZGFuYSxoZWx2ZXRpY2Esc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE0cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uaGVhZGVyYgotewotICAgIGNvbG9yOiAjZmY2NjAwOwotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCx2ZXJkYW5hLGhlbHZldGljYSxzYW5zLXNlcmlmOwotICAgIGZvbnQtc2l6ZTogMTJwdDsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLX0KLQotCi0uaGVhZGVyX2NvbG9yZWQKLXsKLQljb2xvcjogI2NjMzMwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDFlbTsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotCi0uaGVhZGVyX29mX2FydGljbGUKLXsKLQljb2xvcjogI2NkMzMwMTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JfQotCi0uaGVhZGVyX29mX2FydGljbGVfdGFibGUKLXsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC1zdHlsZSA6IGl0YWxpYzsKLX0KLQkKLS5oZWFkZXJfb2ZfYXJ0aWNsZTIKLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE4cHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLmhlYWRlcl9yaWdodAotewotCWNvbG9yOiAwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLS5zdWJoZWFkMV9vZl9hcnRpY2xlMgotewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTRweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnN1YmhlYWQyX29mX2FydGljbGUyCi17Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNHB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDVweDsKLX0KLQotLnN1YmhlYWQzX29mX2FydGljbGUyCi0gewotCWZvbnQtd2VpZ2h0IDogNjAwOwotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogODAlOwotfQotCi0uaGVhZGVyX29mX3N0ZXBzCi17Ci0JY29sb3I6ICNBNEE0QTQ7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0KLQotLmhlYWRlcl9vZl9zaXRlbWFwCi17Ci0JY29sb3I6IyA2Njk5Y2M7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotLmhlYWRlcl9vZl9zaXRlbWFwOmhvdmVyCi17Ci0JY29sb3I6ICNjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotLmhlYWRlcl9vZl90YWJsZQotewotCWNvbG9yOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTRweDsKLQlmb250LXdlaWdodDogNDAwOwotfQotCi0KLS5pbWFnZV9jYXB0aW9uIAoteyAgCi0JZm9udC1zaXplOiA5cHQ7IGNvbG9yOiAjMDAzMzY2Ci19Ci0KLQotLnNpZGViYXIKLXsgIAotCWJhY2tncm91bmQtY29sb3I6ICNmNGY0ZjQ7Ci19Ci0KLWlucHV0Ci17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotCi1pbnB1dC5pbnB1dDI1Ci17Ci0gICAgd2lkdGg6IDI1cHgKLX0KLQotCi1pbnB1dC5pbnB1dDQ1Ci17IAotICAgIHdpZHRoOiA0NXB4Ci19Ci0KLQotaW5wdXQuaW5wdXQ4NQotewotICAgIHdpZHRoOiA4NXB4Ci19Ci0KLQotaW5wdXQuaW5wdXRtYXg1MAotewotCXdpZHRoOiAzNjBweAotfQotCi0KLWlucHV0LmlucHV0MTM1Ci17Ci0Jd2lkdGg6IDEzNXB4Ci19Ci0KLQotaW5wdXQuaW5wdXQxNTUKLXsKLSAgCSB3aWR0aDogMTU1cHgKLX0KLQotaW5wdXQuaW5wdXQyMzAKLXsKLSAgICB3aWR0aDogMjMwcHg7Ci19Ci0KLQotaW5wdXQuaW5wdXQzMDUKLXsgCi0gICAgd2lkdGg6IDMwNXB4Ci19Ci0KLQotLm1lbnViYXIKLXsKLSAgY29sb3I6ICNmZmZmZmY7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IDExcHg7Ci0gIGZvbnQtd2VpZ2h0OiA0MDA7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZQotfQotCi0KLS5tZW51YmFyOmhvdmVyCi17Ci0gIGNvbG9yOiAjZmZmZmZmCi19Ci0KLQotLm1lbnViYXJfYmcKLXsgICAKLWJhY2tncm91bmQtY29sb3I6IzAwMzM2NjsgCi19Ci0KLQotLm1lbnViYXJfZW1waGFzaXMKLXsgCi0gIGNvbG9yOiAjZmZmZmZmOwotICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAxMXB4OwotICBmb250LXdlaWdodDogNjAwOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmUKLX0KLQotLm1lbnViYXJfZW1waGFzaXNkawoteyAKLSAgY29sb3I6ICMwMDAwMDA7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IDExcHg7Ci0gIGZvbnQtd2VpZ2h0OiA2MDA7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZQotfQotCi0KLS5taWRiYXJfYmcKLXsgCi0JYmFja2dyb3VuZDogI2ZmZmZmZjsKLSB9Ci0KLQotLm1pZGJhcl9kYXJrCi17IAotCWJhY2tncm91bmQ6ICMwMDMzNjY7Ci0gfQotCi0KLS5taWRiYXJfbGlnaHQKLXsgCi0JYmFja2dyb3VuZDogIzMzOTljYzsKLSB9Ci0KLQotIC5taWRiYXJfbWVkaXVtCi17IAotCWJhY2tncm91bmQ6ICMwMDY2OTk7Ci0gfQotCi0KLSAubWlkYmFyX3NoYWRvdwoteyAKLQliYWNrZ3JvdW5kOiAjNjY2NjY2OwotIH0KLQotCi0ucGFnZV9udW1iZXIKLXsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LXdlaWdodCA6IDQwMDsKLX0KLQotCi0ucGFnZV9zdGVwcwoteyAKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSB9Ci0ucGFnZWhlYWRlcgotewotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgIGZvbnQtc2l6ZTogMTZwdDsKLSAgICBmb250LXdlaWdodDogYm9sZAotfQotIC5wYWdlaGVhZGVyX2NvbG9yZWQKLXsKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHQ7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLX0KLQotLnBvcHVwX3RleHQgOiBhY3RpdmUKLXsKLQljb2xvcjogI2NjMDAwMDsKLX0KLQotLnBvcHVwX3RleHQgOiBob3ZlcgotewotCWNvbG9yOiAjY2MwMDAwOwotfQotCi0ucHJvamVjdF9tZW51X2JvcmRlcjEKLSB7Ci0JYm9yZGVyLXRvcCA6IDFweCBzb2xpZCAjY2NjY2NjOwotCWJvcmRlci1yaWdodCA6IDFweCBzb2xpZCAjY2NjY2NjOwotCWJhY2tncm91bmQgOiAjZWZlZmVmOwotfQotLnByb2plY3RfbWVudV90b3Bib3JkZXIKLSB7Ci0JYm9yZGVyLXRvcCA6IDFweCBzb2xpZCAjY2NjY2NjOwkKLQliYWNrZ3JvdW5kIDogI2VmZWZlZjsKLX0KLS5wcm9qZWN0X25hdgotewotCWNvbG9yOiAjMDA2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci1zZWxlY3QKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxMXB4OwotfQotCi0KLXNlbGVjdC5pbnB1dDI1Ci17IAotICAgIHdpZHRoOiAyNXB4Ci19Ci0KLQotc2VsZWN0LmlucHV0NDUKLXsKLSAgICB3aWR0aDogNDVweAotfQotCi0KLXNlbGVjdC5pbnB1dDg1Ci17Ci0gICAgd2lkdGg6IDg1cHgKLX0KLQotCi1zZWxlY3QuaW5wdXQxNTUKLXsKLSAgIHdpZHRoOiAxNTVweAotfQotCi0KLXNlbGVjdC5pbnB1dDIzMAotewotICAgIHdpZHRoOiAyMzBweAotfQotCi0KLXNlbGVjdC5pbnB1dDMwNQotewotICAgIHdpZHRoOiAzMDVweDsKLX0KLQotLyogQWxsIHNoaW0gY2xhc3NlcyBhcmUgZm9yIHNwYWNpbmcgZWxlbWVudHMgdXNlZCB0byBjb250cm9sIGxheW91dCwgZXNwZWNpYWxseSBpbiBvbGRlciBicm93c2VycyB0aGF0IGRvbid0IHVuZGVyc3RhbmQgbWFyZ2lucyBhbmQgcGFkZGluZyAqLwotCi0uc2hpbTN4MXB4Ci17Ci0JaGVpZ2h0OiAxcHg7Ci0Jd2lkdGg6IDNweDsKLX0KLQotYS5zaWRlbWVudV9oZWFkZXIKLXsKLSAgICBjb2xvcjogIzY2NjY2NjsKLSAgICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotYS5zaWRlbWVudV9oZWFkZXI6aG92ZXIKLXsKLSAgY29sb3I6ICNjYzAwMDAKLX0KLQotCi0uc2lkZW1lbnVfYm9sZGxlZnQKLXsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uc2lkZW1lbnVfYm9sZGxlZnRfc2VsZWN0ZWQKLXsKLQljb2xvcjogI2NjMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uc2lkZW1lbnVfYm9sZHJpZ2h0Ci17Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotLnNpZGVtZW51X2JvbGRyaWdodDpob3ZlcgotewotCWNvbG9yOiAjY2MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5zaWRlbWVudV9zdGFuZGFyZAotewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uc2lkZW1lbnVfc3RhbmRhcmRfc2VsZWN0ZWQKLXsKLQljb2xvcjogI2NjMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLXRkCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogNzAlCi19Ci0KLXRkLnNlYXJjaGJveAotewotCWZvbnQtZmFtaWx5OiBjb3VyaWVyOwotfQotCi0KLSB0ZC5iZ19kaXNjdXNzaW9uXzEKLXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotCQotfQotCi0KLXRkLmJnX2Rpc2N1c3Npb25fMgoteyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotIH0KLSAKLSB0ZC5jb250ZW50X2NlbGwKLSB7Ci0gCi19Ci0KLQotdGQuZGl2aWRlcgotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZjZmOWYwOwotfQotCi0KLS5ncmV5X2RhcmsKLXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotfQotCi10ZC5ncmV5X21lZGl1bTIKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLX0KLQotdGQuZ3JleV9saWdodDIKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLmdyZXlfbGlnaHQKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLmdyZXlfbWVkaXVtCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci19Ci0KLQotdGQuY2VsbGNvbG9yX2xpZ2h0Ci0gewotCWJhY2tncm91bmQtY29sb3I6ICM5OWNjMDA7Ci19Ci0KLQotCi10ZC5jZWxsY29sb3JfZGFyawotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNjM5YzAwOwotfQotCi0KLXRkLmNlbGxjb2xvcl93aGl0ZQotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotfQotCi0KLXRkLnNpZGVtZW51X2J1bGxldF9ncmV5Ci0gewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLQotdGQuc2lkZW1lbnVfYnVsbGV0X2NvbG9yZWQKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2NkMzMwMTsKLX0KLQotCi10ZXh0YXJlYQotewotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LWZhbWlseSA6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci19Ci0KLQotdGV4dGFyZWEuaW5wdXQ0NQotewotICAgIHdpZHRoOiA0NXB4Ci19Ci0KLQotdGV4dGFyZWEuaW5wdXRtYXg1MAotewotCXdpZHRoOiAzNjBweAotfQotCi0KLXRleHRhcmVhLmlucHV0MTkwCi17Ci0gICAgd2lkdGg6IDE5MHB4Ci19Ci0KLQotdGV4dGFyZWEuaW5wdXQyMzAKLXsKLSAgICB3aWR0aDogMjMwcHgKLX0KLQotCi10ZXh0YXJlYS5pbnB1dDM1MAotewotICAgIHdpZHRoOiAzNTBweAotfQotCi0KLS50b3BiYXJfc2VwYXJhdG9yCi17Ci0gIGNvbG9yOiAjY2MzMzAwOwotICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAxMXB4OwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLQotLnRvcGxpbmVfY29sb3IKLXsgCi0JYmFja2dyb3VuZDogIzAwNjY5OTsKLSB9Ci0gCi0vKiBib3Jyb3dlZCBzdHlsZXMgZnJvbSBjb21tb24uY3NzIHRvIGJlIHRyaW1tZWQgbGF0ZXIgKi8KLSAKLSAudG9wZnJhbWViZyAKLXsgIGJhY2tncm91bmQtY29sb3I6ICNkMmQyZDIKLX0KLQotLnRvcGZyYW1lYmdsaWdodCAKLXsgIAotYmFja2dyb3VuZC1jb2xvcjogI2I2YjViNQotfQotCi0udG9wZnJhbWViZ2RhcmsgCi17ICAKLWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQKLX0KLQotLnRvcGZyYW1lYmdsaWdodDIgCi17IAotIGJhY2tncm91bmQtY29sb3I6ICNlZmVmZWYKLSB9Ci0gICAKLSAudG9wZnJhbWVsb2dvYmcgCi17ICAKLWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTkKLX0KLQotLnRvcGxlZnRuYXYKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0udG9wbGVmdG5hdmJvbGQgCi17IAotZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IAotZm9udC1zaXplOiAxMHB4OyAKLXRleHQtZGVjb3JhdGlvbjogbm9uZTsgCi1mb250LXdlaWdodDogYm9sZDsKLX0KLQotLnRvcHJpZ2h0bmF2Ci17Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCWNvbG9yOiAjZmZmZmZmOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLS50b3ByaWdodG5hdmdyZXkKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0udmVydGljYWxibHVlCi0geyAKLSBiYWNrZ3JvdW5kOiAjMzM5OWNjIAotIH0KLQotIC53aGl0ZWJnCi17IAotIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0gfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL3N0eWxlc191bml4LmNzcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9zdHlsZXNfdW5peC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxMDAwODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL3N0eWxlc191bml4LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDEyNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi0vKm11c3QgYWRkIGZvbnQgdHlwZSBpZiBjbGFzcyBpcyBiZWluZyB1c2VkIGFzIGEgbGluayBhcyB3ZWxsIGFzIG5vLWxpbmsqLwotCi1hIHsJCi0JY29sb3I6ICMzMzY2OTk7Ci19Ci0KLWEudG9wcmlnaHRuYXY6YWN0aXZlIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0KLQotYS50b3ByaWdodG5hdmdyZXk6YWN0aXZlIHsKLQljb2xvcjogI0NDMDAwMDsKLX0KLQotCi0vKiBhY3Rpb24gdGV4dCB1c3VhbGx5IGxvY2F0ZWQgb24gdG9wIG9mIHBhZ2U7aWUuLCBzZWxlY3QgYWxsKi8KLWEuYWN0aW9ubGluawoteyAKLWNvbG9yOiAjMzM2Njk5OwotZm9udC1zaXplOiAxMXB4OwotdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsJCi0gfQotIAotIGEuYWN0aW9ubGluazphY3RpdmUgeyAKLSBjb2xvcjogIzMzNjY5OTsKLSBmb250LXdlaWdodDogYm9sZDsKLSAgfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTpob3ZlciB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19IAotYS50b3ByaWdodG5hdjpob3ZlciB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19IC8qIGZvbnQgZm9yIGFjdGlvbiBvbiBjb250ZW50IHBhZ2UgdXN1YWxseSBsb2NhdGVkIG9uIHRvcCBvZiBwYWdlIDtpZS4sIHNlbGVjdCBhbGwqLwotYS5hY3Rpb24geyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1zaXplOiAxNnB4OwkKLX0gCi0KLWEuYWN0aW9uc2VsZWN0b3IgewotICAgCi0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxNnB4OwotfQotCi0gLyogYmVjYXVzZSBvZiBhbiBpbnRlcnZlbmluZyBsaW5rIHRhZywgdGV4dCBvcHRpb25zIHdlcmUgYXR0YWNoZWQgdG8gdGhpcyBlbGVtZW50IGluc3RlYWQgb2YgdGhlIG91dGVybW9zdCBjZWxsICovCi1hLmFjdGl2ZXRhYiB7IAotIAljb2xvcjogIzAwMDAwMDsKLSAJZm9udC1zaXplOiAxOHB4OwotICAJdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0gLyogYmVjYXVzZSBvZiBhbiBpbnRlcnZlbmluZyBsaW5rIHRhZywgdGV4dCBvcHRpb25zIHdlcmUgYXR0YWNoZWQgdG8gdGhpcyBlbGVtZW50IGluc3RlYWQgb2YgdGhlIG91dGVybW9zdCBjZWxsICovCi1hLmFjdGl2ZXRhYnNlbGVjdGVkIHsgCi0gCWNvbG9yOiAjMmMyYzJjOwotIAlmb250LXNpemU6IDE4cHg7Ci0gIAl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuYmFzaWMgeyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucywgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbiB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmJ1dHRvbjphY3RpdmUgewotCWNvbG9yOiAzMzMzMzM7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b246aG92ZXIgewotCWNvbG9yOiAzMzMzMzM7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucyBpbiBNdWx0aXNpdGUsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b24yIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxNnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS8qbWFpbiBjb250YWluZXIgIGFjdGlvbnMvbGlua3MgZm9yIGVkaXRpbmcqLwotYS5jb25saW5rZWRpdCB7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLQlmb250LXNpemUgOiAxNnB4OwotfQotCi1hLmNvcHlyaWdodCB7IAkKLQljb2xvcjogIzMzNjY5OTsgICAgCi0JZm9udC1zaXplIDogMTVweDsKLX0gCi0KLWEuZm9ybXRibGhlYWQgewotICAgYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS8qIGxpZ2h0IGNvbG91cmVkIGhlYWRpbmcgbGluayBmb3IgZGlzY3Vzc2lvbiBhbmQgc2ltaWxhciB1c2VzIC0gd2FzIGhlYWRlcl9kaXNjdXNzaW9uX2xpbmsgaW4gcHJldmlvdXMgdmVyc2lvbnMgKi8KLSBhLmhlYWRlcmxpbmtsaWdodCB7Ci0JY29sb3I6IAlmZmZmZmY7Ci0JZm9udC1zaXplOiAwLjllbTsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19CQotCi0vKmJvbGQgbGluaywgaWUsIGFkdmFuY2VkIHNlYXJjaCBsaW5rIGluIHBlKi8KLWEubGlua2Z1bmNvcHRpb24geyAgCQotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0gYS5uYXZ0cmVlIHsgCQotICAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZSA6IDE2cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19IAotCi0vKm5hdnRyZWUgaXRlbSBvciBkb2MsIG5vZGVzIHRoYXQgZG9uJ3QgZXhwYW5kKi8KLWEubmF2dHJlZWl0ZW0geyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTZweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19IAotIAotIC8qIHNpbXBsZSBtZWNoYW5pc20gdG8gdHVybiB0ZXh0IGRlY29yYXRpb24gb2ZmICovICAKLWEubm9saW5lIHsKLSAJdGV4dC1kZWNvcmF0aW9uOiBub25lOwotIH0KLQotYS5wb3B1cHRleHQgewkKLSAgIGNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTZweDsJCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnBvcHRleHQgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQgOiAxNnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5wb3B1cHRleHQ6IGFjdGl2ZSB7Ci0JY29sb3I6ICNjYzAwMDA7Ci19Ci0KLQotYS5zbWFsbCB7CQotCWZvbnQtc2l6ZTogMTZweDsJCi19Ci0KLWEuc21hbGxiIHsJCi0gICBjb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7CQotfQotCi1hLnRvcGJhciB7Ci0gIGNvbG9yOiAjNjY2NjY2OwotICBmb250LXNpemU6IDE2cHg7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyp1c2VkIGFzIGhpZ2hsaWdodGVkIGRlc2NyaXB0aW9uIGFib3ZlIHRhYmxlcyovCi0uYWNjZW50Y29sb3IgewotCWNvbG9yIDogI2NjMzMwMDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotIC8qIGJnY29sb3IgIGZvciBhY3Rpb24gdGV4dCB1c3VhbGx5IGxvY2F0ZWQgb24gdG9wIG9mIHBhZ2U7aWUuLCBzZWxlY3QgYWxsKi8KLS5hY3Rpb25iZyB7IAotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLS8qYWN0aW9uYmFyIGFwcGVhcnMgb24gdG9wIGFuZC9vciBib3R0b20gb2YgcGFnZSovCi0uYWN0aW9uc2VsZWN0b3IgewotICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qYWN0aW9uYmFyIG9uIHdoaXRlIGJhY2tncm91bmQqLwotLmFjdGlvbnNlbGVjdDIgeyAgIAotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLmFjdGlvbnNlbGVjdG9yZGlzIHsKLWJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7Ci0JY29sb3I6ICNjY2NjY2M7Ci0JZm9udC1zaXplOiAxNnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYiB7IAotICAgZm9udC13ZWlnaHQgOiBib2xkOwotIH0KLSAgCi0uYmFzZWxpbmVpdGFsaWNzIHsKLQljb2xvcjogIzY2NjY2NjsKLQlmb250LXNpemU6IDE2cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uYmdibGFjayB7IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7Ci0gfQotIAotIC8qIGJhc2ljIGNvbHVtbiBiYWNrZ3JvdW5kIGNvbG91ciBmb3IgZGlzY3Vzc2lvbnMsIGZpbGVzLCBvdGhlciBzdWNoIHRhYnVsYXRlZCBkYXRhICovCi0uYmdjb2x1bW5iYXNpYyB7IAotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfQotIAotLmJnd2hpdGUgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotIH0gCi0gCi0vKiBzaXplIGlucHV0IGZvciBiYXNpYyB0YWdzIHN1Y2ggYXMgcCBhbmQgbGkgdGhhdCBkbyBub3QgaW5oZXJpdCBmcm9tIHRkICovIAotYm9keSB7Ci0JYmFja2dyb3VuZC1jb2xvciA6ICNmZmZmZmY7ICAgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7CQkKLQltYXJnaW4tbGVmdDogMHB4OwotCW1hcmdpbi10b3A6IDBweDsJCi0JbWFyZ2luLXJpZ2h0OiAwcHg7Ci19Ci0KLS5ib2xkIHsgCi0gICBmb250LXdlaWdodCA6IDYwMDsKLSB9Ci0KLS5ib3JkZXJncmF5IHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTsKLSB9Ci0KLS5ib3R0b21iYXJkYXJrIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwMzM2NjsKLSB9Ci0gIAotLmJvdHRvbWJhcmxpZ2h0IHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzMzOTljYzsKLSB9Ci0KLS5ib3R0b21iYXJzaGFkb3cgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotIH0KLQotLmJyZWFkY3J1bWJzeyAKLWNvbG9yOiAjMzM2Njk5OwotZm9udC13ZWlnaHQ6IDYwMDsKLSB9Ci0KLS5icmVhZGNydW1iczJ7IAotY29sb3I6ICNmZmZmZmY7Ci1mb250LXNpemU6IDE2cHg7Ci0gfSAKLSAKLS8qYWN0aXZlIG5hdmlnYXRpb24gYnV0dG9uLCBub3QgZm9ybSBidXR0b25zKi8gCi0uYnV0dG9ub24gewotICAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfQotICAKLS8qbmF2aWdhdGlvbiBidXR0b25zLCBub3QgZm9ybSBidXR0b25zKi8gCi0uYnV0dG9ucyB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS8qIGRpc2FibGVkIHN0YXRlICovIAotLmJ1dHRvbnR4dCB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiB0aGVzZSBidXR0b24gc3R5bGVzIGFyZSBmb3IgdGhlIHRleHR1YWwgYnV0dG9ucyBpbnRlbmRlZCB0byByZXBsYWNlIGltYWdlIGNvbnN0cnVjdHMgZm9yIGludGVybmF0aW9uYWxpemF0aW9uIC0gdGhpcyBpcyBmb3IgdGhlIGRpc2FibGVkIHN0YXRlICovIAotLmJ1dHRvbnR4dGRzYmwgewotCWNvbG9yOiAjN0U3RTdFOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmNvZGUgeyAKLSAgIGZvbnQtZmFtaWx5OiBDb3VyaWVyIE5ldywgQ291cmllciwgbW9ubzsgICAKLSAgIGZvbnQtc2l6ZTogMThweDsKLSB9Ci0gCi0gIC8qIGZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0ICovCi0uY29tbWVudHMgeyAJCi0JZm9udC1zaXplOiAxNnB4OwkKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0vKm1haW4gY29udGFpbmVyIGhlYWRlciovCi0uY29uaGVhZCB7IAotY29sb3I6ICNjYzMzMDA7Ci1mb250LXdlaWdodDogNjAwOwotdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLSB9Ci0gCi0gLyptYWluIGNvbnRhaW5lciBkYXRhIGxhYmVscyovCi0uY29ubGFiZWwgeyAKLWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfSAKLSAKLS8qbWFpbiBjb250YWluZXIgZGF0YSBsYWJlbHMgaW4gYm9sZCovCi0uY29ubGFiZWxib2xkIHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjZTFlMWUxOwotZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gfSAgCi0gCi0vKnJlcGxhY2luZyBzaWRlbWVudV9ib2xkcmlnaHQgbW92aW5nIGZvcndhcmQqLwotLmNvbnJib2xkIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLypoZWFkZXIgZm9yIHJpZ2h0IGhhbmQgY29udGFpbmVyKi8KLS5jb25yaGVhZCB7Ci0JY29sb3I6IDAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE4cHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLyptYWluIGNvbnRhaW5lciB0YWJsZSBoZWFkZXIqLwotLmNvbnRibGhlYWQgeyAgCi0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCWNvbG9yOiAjMzMzMzMzOwkKLQlmb250LXNpemU6IDE2cHg7CQotICAgIGZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS5jb250ZW50eyAKLWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsJCi0gfQotCi0gLyptZWRpdW0gZ3JleSBjZWxsIGJhY2tncm91bmQqLwotLmNvbnRlbnRib3JkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci19Ci0KLS8qIGFkZGVkIGZvciB0ZXh0IHJlcHJlc2VudGluZyBkaXNhYmxlZCBmdW5jdGlvbnMuICovCi0uY29udGVudGRpc2FibGVkIHsKLQljb2xvcjogI2NjY2NjYzsKLX0KLQotLyogZm9udCBmb3IgYm9sZCB0ZXh0ICovCi0uY29udGVudGVtcGhhc2lzIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLyogdXNlZCB0ZXh0IHJlbWluZGluZyB1c2VyIHRoYXQgdGhlcmUgaXMgcmVxdWlyZWQgY29udGVudCAqLwotLmNvbnRlbnRyZXF1aXJlZCB7Ci0JY29sb3I6ICNiNGI0YjQ7Ci0JZm9udC13ZWlnaHQ6IDUwMDsKLX0KLQotLmNvcHlyaWdodCB7IAotCWNvbG9yIDogIzk5OTk5OTsKLQlmb250LXNpemUgOiAxNXB4OwotfQotCi0vKmJsYWNrIGNvcHlyaWdodCovCi0uY29weXJpZ2h0YiB7IAotY29sb3IgOiAjMDAwMDAwOwotCWZvbnQtc2l6ZSA6IDE1cHg7Ci19Ci0KLWRkIHsgCi1mb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE4cHg7CQotbWFyZ2luLWxlZnQ6IC0xcHg7Ci0gfQotIAotLmRpYWxnYnhzaGFkb3cyIHsgIAotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS5kaWFsb2d1ZWJveGJnIHsgIAotCWJhY2tncm91bmQtY29sb3I6ICNkMmQyZDI7Ci19Ci0KLS8qYmFja2dyb3VuZCBmb3IgbG9naW4gcGFnZXMqLwotLmRpYWxvZ3VlYm94YmcyIHsgIAotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLS5kaWFsb2d1ZWJveGJvcmRlciB7IAotCWJhY2tncm91bmQtY29sb3I6ICMzMzMzMzM7Ci0gfQotIAotLmRpYWxvZ3VlYm94aGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0gLmRpYWxvZ3VlYm94bWVkaXVtIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzhiOGI4YjsKLSB9Ci0gCi0gLmRpYWxvZ3VlYm94dGl0bGUgewkgICAKLQlmb250LXNpemU6IDIxcHg7Ci0JZm9udC13ZWlnaHQgOiBib2xkOwotfQotCi0vKnRleHQgZm9yIGRpc2FibGVkIGJ1dHRvbnMqLwotLmRpc2FibGV7IAotY29sb3I6ICM5OTk5OTk7Ci1mb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLWZvbnQtc2l6ZTogMTZweDsgIAotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotIH0KLSAKLWRpdnsgCi1mb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSB9IAotIAotLyp1c2VkIHRvIGFmZmVjdCByaWdodCBtYXJnaW4qLyAKLWRpdi5tYXJnaW5ydHsgCi0JY2xlYXI6IHJpZ2h0OwotCWZsb2F0OiByaWdodDsKLQl3aWR0aDogN3B4OwotIH0gIAotIAotZGl2Lm1hcmdpbnMgeyAKLWZsb2F0OiBsZWZ0OwotbWFyZ2luLWxlZnQ6IDdweDsKLW1hcmdpbi10b3A6IDI1cHg7CQotbWFyZ2luLXJpZ2h0OiA3cHg7Ci0gfSAgIAotCi0vKmZvciBwYWdlcyB3aXRoIGJ1dHRvbiBuYXZpZ2F0aW9uIG9uIHRvcCovIAotZGl2Lm1hcmdpbnMyMCB7IAotZmxvYXQ6IGxlZnQ7Ci1tYXJnaW4tbGVmdDogN3B4OwotbWFyZ2luLXRvcDogMjBweDsJCi1tYXJnaW4tcmlnaHQ6IDdweDsKLSB9ICAgIAotIAotIC8qYWRkcyAxMCBweCBwYWRkaW5nKi8KLSBkaXYucGFkMTB7IAotIHBhZGRpbmc6IDEwcHg7IAotICB9Ci0KLS5kaXZpZGVyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZjZmOWYwOwotfQotCi1kbHsgIAotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci1mb250LXNpemU6IDE4cHg7ICAgCi0JfQotCi0vKnJlbW92ZXMgZGVmYXVsdCBib3R0b20gbWFyZ2luLCBkb2Vzbid0IHdvcmsgaW4gTlM0Ljd4ICovIAotZGwuZGF0YSB7IAotbWFyZ2luLWJvdHRvbTogLTFweDsKLSB9ICAKLQotLmRvY2JvbGQgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsgICAgICAgCi0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS8qZm9yIGFwcGxldCBkb3dubG9hZCBzcGxhc2ggcGFnZSovCi0uZG93bmxvYWR7IAotYmFja2dyb3VuZC1jb2xvcjogI2VmZWVlZTsKLSB9Ci0KLSAuZXJyb3Jtc2cgewotCWNvbG9yIDogI2NjMDAwMDsJCi19IAotCi0vKgotY29sb3JlZCBmb250Ci1kZXNjcmlwdGlvbiBhYm91dCB0aGUgdXNlciBzdGF0dXMuIGVxLiAic3Vic2NyaXB0aW9ucyBhcmUgdXBkYXRlZCIKLWl0J3MgdXN1YWxseSBvbiB0aGUgdXBwZXIgcGFydCBvZiB0aGUgcGFnZXMKLSovCi0uZm9vdGVyYm9sZCB7Ci0JY29sb3IgOiAjYTRhNGE0OwotCWZvbnQtc2l6ZTogOTAlOwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qdGhlICogc3ltYm9sIGluZGljYXRlIHRoZSByZXF1aXJlZCBmaWVsZCAqLwotLmZvb3RlcmJvbGRjb2xvcmVkIHsKLQljb2xvciA6ICNmZjY1MDA7Ci0JZm9udC1zaXplOiA5MCU7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLmZvb3RpbmRpY2F0b3IgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsgICAgICAgCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnRoZSAqIHN5bWJvbCBpbmRpY2F0ZSB0aGUgcmVxdWlyZWQgZmllbGQgKi8KLS5mb290c3RhcmluZGV4IHsKLQljb2xvciA6ICNjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0vKm1vdmUgdG8gZGVzaWduX3BlKi8KLS5mb3JtbGFiZWwgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uZm9ybXRibGhlYWQgewotICAgYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS5ncmV5bWVkaXVtIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotfQotCi0uZ3JheWZvbGQgewotCWNvbG9yOiAjY2NjY2NjOwkKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JZm9udC1zaXplOiAyMnB4OwotfQotCi0vKk5vdGU6IHJlbW92ZSB0aGlzIG5vdGUgaWYgdXNpbmcgdGhpcyBzdHlsZSBvciB3aWxsIGJlIGRlbGV0ZWQqLwotCS8qIEN1cnJlbnRseSB1c2VkIGluIGNxX2RlZmxlY3RfbG9naW5fZXJyLmh0bWwgLSBzaG91bGQgYmUgcmVuYW1lZCB0byBzb21ldGhpbmcgdGhhdCBoYXMgbGVzcyBkZXNjcmlwdGl2ZSBuYW1lICovCi0uaGVhZGVyYmx1ZSB7Ci0JY29sb3I6ICMwMDY2OTk7CQotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyp1c2VkIGluIGNjIGZvciBmcmFtZXNldCBkaXNwbGF5Ki8gCi0uaGVhZGVyaW5mcmFtZXMgeyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwkKLQlmb250LXdlaWdodDogNjAwOwotCW1hcmdpbi1ib3R0b206IDJweDsKLQltYXJnaW4tdG9wOiAwcHg7Ci19Ci0KLSAvKmZvbnQgZm9yIHBhZ2UgaGVhZGVyIGV4Y2VwdCBmb3IgYXJ0aWNsZSBwYWdlcywgKHNlZSBoZWFkZXJfb2ZfYXJ0aWNsZSkqLwotLmhlYWRlcmxhcmdlIHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDE2MCU7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKm1haW4gaGVhZGVyIGZvciBmcmFtZSBuYXZpZ2F0aW9uLCBpZSwgY2xlYXJjYXNlIG1lcmdlIGZpbGVzKi8KLS5oZWFkZXJtYWluIHsgIAotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMjVweDsJCi0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLyogaGVhZGVyIGVsZW1lbnQgZm9yIGZvcm0gdGFibGVzIGNvbnRhaW5pbmcgbWlkLXNpemUgZml4ZWQgaGVpZ2h0IHRleHQgKi8KLS5oZWFkZXJtZWRsaXN0IHsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qZm9ybnQgZm9yIHN0ZXBzIHRpdGxlIGluIGZvcm1zKi8KLS5oZWFkZXJvZnN0ZXBzIHsgCi0JY29sb3I6ICM2NjY2NjY7Ci0JZm9udC1zaXplOiAyNXB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaGVhZGVyb2ZzdGVwc25vbiB7IAotCWNvbG9yOiAjNjY2NjY2OwotCWZvbnQtc2l6ZTogMjVweDsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLQotLyp1c2UgaGVhZGVyMSBpbnN0ZWFkKi8KLS5oMSB7ICAKLQotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMzNweDsJCi0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLyp0byByZXBsYWNlIGgxIGFuZCBjb250ZW50aGVhZGVyIGxhcmdlKi8KLS5oZWFkZXIxIHsgIAotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMzNweDsJCi0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLyp1c2Ugc3ViaGVhZDEgaW5zdGVhZCovCi0uaDFyb290eyAgCi0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAzM3B4OwkKLQlmb250LXdlaWdodDogNDAwOwotfQotCi0KLS8qdXNlZCBpbiBjYywgY3EsIHNsKi8gCi1oMSB7ICAKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDI1cHg7CQotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qdXNlIGhlYWRlcjIgaW5zdGVhZCovCi0uaDIgeyAKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDI4cHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsJIAkKLX0KLQotLypoZWFkZXJzIHdpdGhpbiBwYWdlKi8KLS5oZWFkZXIyIHsgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyOHB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7CSAJCi19Ci0KLQotaSB7Ci0JZm9udC1zdHlsZSA6IGl0YWxpYzsKLX0KLQotLmljb25ib3JkZXIgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotfQotCi0vKmZvbnQgc2l6ZSBzZXR1cCBzaG93biBpbiB0aGUgaW5wdXQgYm94IHdoaWNoIGlzIGluaGVyaXRlZCBieSBpbnB1dFhYKi8KLWlucHV0IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxNnB4OwotfSAKLQotaW5wdXQuaW5wdXQxMzUgewotCXdpZHRoOiAxMzVweAotfSAKLQotLyogMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUgKi8KLWlucHV0Lm1heDUwIHsKLQl3aWR0aDogMzYwcHg7Ci19Ci0KLWlucHV0LnB4MjUgewotICAgIHdpZHRoOiAyNXB4OwotfQotCi1pbnB1dC5weDQ1IHsKLSAgICB3aWR0aDogNDVweDsKLX0KLQotLyoKLTEsYnVzaW5lc3Mgc3RhbmRhcmQgbXVsdGlsaW5lIGlucHV0IGJveCAKLTIsdGhpcyBzdHlsZSBvbmx5IGFjdGl2YXRlIGluIElFCi0qLwotaW5wdXQucHg4NSB7Ci0gICAgd2lkdGg6IDg1cHg7Ci19Ci0KLWlucHV0LnB4MTM1IHsKLSAgICB3aWR0aDogMTM1cHg7Ci19Ci0KLWlucHV0LnB4MTU1IHsKLSAgICB3aWR0aDogMTU1cHg7Ci19Ci0KLWlucHV0LnB4MjMwIHsKLSAgICB3aWR0aDogMjMwcHg7Ci19Ci0KLWlucHV0LnB4MzA1IHsKLSAgICB3aWR0aDogMzA1cHg7Ci19Ci0KLS5sZWZ0bWVudSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLmxlZnRtZW51YnVsbGV0IHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotIH0KLQotLmxlZnRtZW51YnVsbGV0YWN0aXZlIHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjY2QzMzAxOwotIH0KLQkKLQotLmxlZnRuYXZoZWFkIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE5cHg7CQotCWZvbnQtd2VpZ2h0OiBib2xkOwkKLX0gCi0KLS5sZWZ0bmF2bGFiZWwgewotY29sb3I6ICMwMDAwMDA7Ci1mb250LXdlaWdodCA6IDYwMDsKLWZvbnQtc2l6ZTogMTZweDsKLSB9Ci0KLS5saWdodGdyYXkgeyAKLWJhY2tncm91bmQtY29sb3I6ICNlNGU0ZTQ7Ci0gfQotIAotLm1lbnViYXIgewotICBjb2xvcjogI2ZmZmZmZjsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTZweDsKLSAgZm9udC13ZWlnaHQ6IDQwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLS8qbWVudWJhciB3aXRoaW4gdG9wIG9mIGNvbnRlbnQgcGFnZSAgKi8KLS5tZW51YmFybWlkeyAKLWZvbnQtc2l6ZTogMTZweDsKLSAgZm9udC13ZWlnaHQ6IDYwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi0gfQotCi0vKgotMSxib2xkIGZvbnQgZm9yIHRoZSBsYXN0IGl0ZW0gb2YgdGhlIGJyZWFkY3J1bWJzCi0yLGJvbGQgZm9udCBvZiB0YWJsZSBoZWFkZXIgd2l0aCBtZW51YmFyX2JnKGJsdWUpIGFzIGJhY2tncm91bmQgY29sb3IgCi0zLGJvbGQgdGV4dCBvbiBjb2xvcmVkIGJhY2tncm91bmQgZWcuIExvZ2dlZCBJbgotKi8KLS5tZW51YmFyZW1waGFzaXMgewotICBjb2xvcjogI2ZmZmZmZjsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTZweDsKLSAgZm9udC13ZWlnaHQ6IDYwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLS5tZW51YmFyOmhvdmVyIHsKLSAgY29sb3I6ICNmZmZmZmYKLX0gCi0gCi0ubWlkYmFyYmcgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotIH0gCi0gCi0vKnRvcG5hdiovIAotLm1pZGJhcmxpZ2h0IHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzMzOTljYzsKLSB9Ci0gCi0vKmRhcmsgY29sb3IgYmV0d2VlbiB0YWJzKi8KLSAubWlkYmFyZGFyayB7IAotCWJhY2tncm91bmQ6ICMwMDMzNjY7Ci0gfQotIAotIC8qdG9wbmF2Ki8gCi0gLm1pZGJhcm1lZCB7IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7Ci0gfQotIAotIC8qYmFja2dyb3VuZCAgb2YgIHRhYnMqLyAKLSAubWlkYmFybWVkaXVtIHsgCi0JYmFja2dyb3VuZDogIzAwNjY5OTsKLSB9Ci0gCi0gLm1pZGJhcnNoYWRvdyB7IAotCWJhY2tncm91bmQtY29sb3I6ICM2NjY2NjY7Ci0gfSAKLSAgCi0vKnJlcGxhY2luZyBzaWRlbWVudV9ib2xkbGVmdCBtb3ZpbmcgZm9yd2FyZCovCi0ubmF2bGVmdGJvbGQgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0vKmxlZnQgbmF2IHN1Ym1lbnUqLwotLm5hdmxlZnRzdWIgewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLSAKLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudCBpbnN0ZWFkIG9mIHRoZSBvdXRlcm1vc3QgY2VsbCAqLwotLm5vbmFjdGl2ZXRhYiB7Ci0JY29sb3I6ICNiNGI0YjQ7Ci0JZm9udC1zaXplOiAxOHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypub3Rlcy8gZGVzY3JpcHRpb24gb2YgaWNvbiAqLwotLm5vdGVzeyAgCi0gZm9udC1zaXplOiAxNnB4OwotIGZvbnQtd2VpZ2h0IDogNDAwOwkKLX0KLQotcCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OwkKLX0KLQotLnBhZ2Vib2xkIHsgCi0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC13ZWlnaHQgOiA2MDA7CQotIH0KLSAKLS8qZm9udCBmb3IgdGhlIG51bWJlcnMgaW4gcGFnaW5hdGlvbiBsaWJyYXJ5Ki8KLSAucGFnZW51bWJlciB7Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci19Ci0KLSAvKmZvbnQgZm9yIHByZXZpb3VzICYgbmV4dCBpbiBwYWdpbmF0aW9uKi8KLS5wYWdlc3RlcHMgeyAKLQljb2xvcjogIzY3Njc2NzsJCi0JZm9udC1zaXplOiAxNnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSB9Ci0KLS5wb3AgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemUgOiAxOHB4OwotCWZvbnQtd2VpZ2h0IDogMjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnBvcGJhY2tncm91bmQgewotCi0JYmFja2dyb3VuZDogI2Q2ZDNjZTsKLX0KLQotLnBvcGgxIHsKLQlmb250LXNpemU6IDI0cHg7Ci0JZm9udC13ZWlnaHQgOiBib2xkOwotfQotCi0ucG9wbGVmdG1lbnUgewotCWJhY2tncm91bmQ6ICNmMGYwZjA7Ci0JYm9yZGVyOiB0aGluIHNvbGlkIGNjY2NjYzsgCi0JbGVmdDogMjEwcHg7IAotCXBhZGRpbmc6IDJweDsKLQlwb3NpdGlvbjphYnNvbHV0ZTsgCi0JdG9wOiAyNXB4OwotCXZpc2liaWxpdHk6IGhpZGRlbjsgCi0Jd2lkdGg6NzVweDsKLQl6LWluZGV4OjEwOwkKLSB9Ci0KLSAvKiB1c2UgcG9wbGVmdG1lbnUgaW5zdGVhZCBvZiB0aGlzIG9uZSovCi0ucG9wdXBib3JkZXIgewotCWJhY2tncm91bmQ6ICNmMGYwZjA7Ci0JYm9yZGVyIDogdGhpbiBzb2xpZCBjY2NjY2M7Ci0JcGFkZGluZyA6IDJweDsKLX0KLQotLnBvcHVwdGV4dCB7CQotICAgY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1zaXplOiAxNnB4OwkKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5wcm9qZWN0YXR0IHsgCi0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OyAKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsgCi0JY29sb3I6ICNjZDMzMDE7Ci19Ci0KLS8qZGF0ZSBhc3NvY2lhdGVkIHdpdGggYXJ0aWNsZSByYXRpbmdzKi8KLS5yYXRpbmdzZGF0ZQotewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtc2l6ZSA6IDE2cHg7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLQl0ZXh0LWFsaWduOiByaWdodDsKLX0KLQotc2VsZWN0IHsKLSAgICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxNnB4OwotfQotCi1zZWxlY3Quc2VscHgxNDQgewotICAgIHdpZHRoOiAxNDRweDsKLX0KLQotLyogLnNpZGVtZW51X2JvbGRsZWZ0IHJlcGxhY2Ugd2l0aCAubGVmdG1lbnVib2xkKi8gCi0KLS8qIC5zaWRlbWVudV9ib2xkbGVmdF9zZWxlY3RlZCByZXBsYWNlIHdpdGggLmxlZnRtZW51YWN0aXZlKi8KLQotLyogLnNpZGVtZW51X2J1bGxldF9jb2xvcmVkIHJlcGxhY2Ugd2l0aCAubGVmdG1lbnVidWxsZXRhY3RpdmUqLwotIAotLyouc2lkZW1lbnVfYnVsbGV0X2dyZXkgcmVwbGFjZSB3aXRoIGxlZnRtZW51YnVsbGV0Ki8KLQotLnNpZGVtZW51Ym9sZGxlZnQgewotCWNvbG9yOiAjMDAwMDAwOwkKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0gCi0KLS5zaWRlbWVudWJvbGRsZWZ0c2VsZWN0ZWQgewotCWNvbG9yOiAjY2MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uc2lkZW1lbnVzdGFuZGFyZCB7Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uc2lkZW1lbnVzdGFuZGFyZHNlbGVjdGVkIHsKLQljb2xvcjogI2NjMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS5zbWFsbHRleHQgewotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JY29sb3I6ICMwMDAwMDA7Ci19Ci0KLS8qdG8gcmVwbGFjZSBoMXJvb3QsICBmb3IgZG9jdW1lbnQgcm9vdCBmb2xkZXIqLwotLnN1YmhlYWQxIHsgIAotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMzNweDsJCi0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLnRhYmxlaGVhZGVyIHsgCi0KLQljb2xvcjogIzAwMDAwMDsJCi0JZm9udC1zaXplOiAxOXB4OwkKLSAgICBmb250LXdlaWdodDogYm9sZAotfQotCi0vKiBmb250IGZvciByZWd1bGFyIGNvbnRlbnQgdGV4dCAqLwotdGQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsJCi19Ci0KLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIGEgc2ltaWxhciBlbGVtZW50IGZvciBsaW5rcyAqLwotdGQuYWN0aXZldGFiIHsgCi0gCWJhY2tncm91bmQtY29sb3I6ICNjNGM0YzQ7Ci0gIH0KLSAKLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIGEgc2ltaWxhciBlbGVtZW50IGZvciBsaW5rcyAqLwotdGQuYWN0aXZldGFic2VsZWN0ZWQgeyAKLSAJYmFja2dyb3VuZC1jb2xvcjogI2RkZGRkZDsKLSAgfQotICAKLSAvKiB0aGVzZSBidXR0b24gc3R5bGVzIGFyZSBmb3IgdGhlIHRleHR1YWwgYnV0dG9ucyBpbnRlbmRlZCB0byByZXBsYWNlIGltYWdlIGNvbnN0cnVjdHMgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovIAotdGQuYnV0dG9uYm9keSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RBREFEQTsKLX0KLQotIC8qIGRpc2FibGVkIHZlcnNpb24gKi8gCi10ZC5idXR0b25ib2R5ZHNibCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RBREFEQTsKLX0KLQotLyogdGhpcyBzdHlsZSBpcyBkZXNjb3BlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSAqLwotdGQuYnV0dG9uaGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotfQotCi10ZC5idXR0b25zaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM2ZDZkNmQ7Ci19Ci0KLS8qIGRpc2FibGVkIHZlcnNpb24gKi8KLXRkLmJ1dHRvbnNoYWRvd2RzYmwgewotCWJhY2tncm91bmQtY29sb3I6ICNBMkEyQTI7Ci19Ci0gCi0vKiBkZXNpZ24gZWxlbWVudCByYXJlbHkgdXNlZCBmb3IgbGluZSBjb2xvdXIgaW4gY2VydGFpbiBkZWNvcmF0aXZlIHRhYmxlcyAqLwotdGQuZGVzaWduMSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2Q0ZDRkNDsKLX0KLSAKLS8qZGVzaWduIGVsZW1lbnQgc2ltdWxhdGluZyBhIGRpbWVuc2lvbmFsIGJvdW5kYXJ5IHRvIGEgdGFibGUgKi8KLXRkLmRpdmlkZXJkaW1lbnMgewotCWJhY2tncm91bmQtY29sb3I6ICNiZGJkYmQ7Ci19Ci0gCi0gLyogYmVjYXVzZSBvZiBhbiBpbnRlcnZlbmluZyBsaW5rIHRhZywgdGV4dCBvcHRpb25zIHdlcmUgYXR0YWNoZWQgdG8gYSBzaW1pbGFyIGVsZW1lbnQgZm9yIGxpbmtzICovCi10ZC5ub25hY3RpdmV0YWIgewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLS8qIGRhdGEgd2l0aGluIGEgdGFibGUgaGlnaGxpZ2h0ZWQgaW4gZ3JheSovCi10ZC50YmxoaWdobHQgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gICBwYWRkaW5nOiAycHg7Ci0gfQotIAotIHRkLnRibGhpZ2hsdDEgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gfQotIAotLyogZGF0YSB3aXRoaW4gYSB0YWJsZSBoaWdobGlnaHRlZCBpbiBsaWdodCBncmF5Ki8KLXRkLnRibGhpZ2hsdDIgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfSAKLQotIC8qIGRhdGEgd2l0aGluIGEgdGFibGUgaGlnaGxpZ2h0ZWQgaW4gbGlnaHQgZ3JheSovCi10ZC50YmxoaWdobHQzIHsgCi0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5OwotIH0gIAotIAotLypkYXJrIGdyZXkgY2VsbCBiYWNrZ3JvdW5kIGFuZCBib2xkIHRleHQgKi8KLS50ZGRhcmtib2xkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwkKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLnRkbGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0JcGFkZGluZzogMnB4OwotfQotCi0udGRsaWdodDEgewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0gCi0gCi10ZXh0YXJlYSB7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotdGV4dGFyZWEucHgzODB7Ci0gd2lkdGg6IDM4MHB4OyAKLSB9Ci0KLS50ZXh0ZXJyb3Jtc2cgewotCWNvbG9yIDogY2MwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTEwJTsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnRleHRncmF5IHsgIAotCWNvbG9yOiAjOTk5OTk5OwkKLX0KLQotLnRvcGJhcmRpdmlkZXIgeyAKLQliYWNrZ3JvdW5kOiAjMzM5OWNjIAotfQotCi0udG9wYmFyZGl2aWRlcmdyZXllZCB7IAotCWJhY2tncm91bmQ6ICNhZGQ2ZWIKLSB9ICAKLQotLnRvcGJhcnNlcGFyYXRvciB7Ci0gIGNvbG9yOiAjY2MzMzAwOyAgCi0gIGZvbnQtc2l6ZTogMTZweDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLSAKLS50b3BmcmFtZWJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZDJkMmQyOwotfQotCi0udG9wZnJhbWViZ2dyZXllZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VkZWRlZDsKLX0KLQotLnRvcGZyYW1laGlnaGxpZ2h0IHsgIAotCWJhY2tncm91bmQtY29sb3I6ICNiNmI1YjU7Ci19Ci0KLS50b3BmcmFtZWhpZ2hsaWdodGdyZXllZCB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZTFlMWUxOwotfQotCi0udG9wZnJhbWVoaWdobGlnaHQyIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLnRvcGZyYW1laGlnaGxpZ2h0MmdyZXllZCB7IAotCWJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7Ci0gfSAKLSAKLS50b3BmcmFtZWxvZ29iZyB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OwotfQotCi0udG9wZnJhbWVsb2dvYmdncmV5ZWQgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzk5YzJkNjsKLX0KLQotLnRvcGZyYW1lc2hhZG93IHsgIAotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS50b3BmcmFtZXNoYWRvd2dyZXllZCB7ICAKLWJhY2tncm91bmQtY29sb3I6ICNjZWNlY2U7Ci19Ci0KLS50b3BsZWZ0bmF2IHsJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnRvcGxlZnRuYXZib2xkIHsgCi0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGJyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OyAKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsgCi19Ci0KLS50b3BsZWZ0bmF2Ym9sZGdyZXllZCB7IAotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemU6IDE1cHg7IAotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsgCi19Ci0KLS50b3BsZWZ0bmF2Z3JleWVkIHsJCi0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQl9Ci0KLS50b3BsaW5lY29sb3IgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OwotIH0JCi0JCi0udG9wcmlnaHRuYXYgewotCWNvbG9yOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTRweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3ByaWdodG5hdmdyZXkKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0KLSAvKiB0aGlzIHdhcyBpbml0aWFsbHkgZGVjbGFyZWQgdGhlIHNhbWUgY29sb3VyIGFzIHRoZSBjbGFzcyB0b3BmcmFtZSBiZyBidXQgYmVjYXVzZSBpdCBsaWVzIGluIGEgZGlmZmVyZW50IGZ1bmN0aW9uYWwgYXJlYSwgaGFzIGJlZW4gcmVjcmVhdGVkIGhlcmUgICovCi10ci5iZ21pZGZyYW1lIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZDJkMmQyOwotfQotCi10ZC5zaWRlbWVudWJ1bGxldGdyZXkgewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLQotdGQuc2lkZW1lbnVidWxsZXRjb2xvcmVkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2QzMzAxOwotfQotCi0vKmxpc3Qtc3R5bGUtaW1hZ2U6IHVybChpbWFnZXMvZG93bmJ1dHRvbi5naWYpOyovCi11bCB7CQotCi0JbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Ci19Ci0gCi0KLS52b2IgewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTUwJTsKLQljb2xvcjogIzAwNjY5OTsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLX0KLQotLnZvYmJvdHRvbSB7Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvaWNvbnMvUHVibGlzaGluZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ljb25zL1B1Ymxpc2hpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MzFiYWYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvaWNvbnMvUHVibGlzaGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ltYWdlcy9BcnRpZmFjdC5qcGcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ltYWdlcy9BcnRpZmFjdC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3MzkxMjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9pbWFnZXMvQXJ0aWZhY3QuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9pbWFnZXMvUm9sZS5qcGcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ltYWdlcy9Sb2xlLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmYxODNhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ltYWdlcy9Sb2xlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvaW1hZ2VzL1Rhc2suanBnIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9pbWFnZXMvVGFzay5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY1YWMyYzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9pbWFnZXMvVGFzay5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ltYWdlcy90b3AuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9pbWFnZXMvdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjE1YWNmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ltYWdlcy90b3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9rZXl3b3JkaW5kZXhkZWYudHh0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9rZXl3b3JkaW5kZXhkZWYudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NDE3MThjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcva2V5d29yZGluZGV4ZGVmLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLXJlbGF0aXZlcGF0aAkuLgotd3d3cm9vdAkuLgotbWFpbnJlc3VsdGZpbGUJL2luZGV4L2luZGV4Lmh0bQotaW5kZXhyZXN1bHRmaWxlCS9pbmRleC9uYXZpZy5odG0KLWtleXdvcmRyZXN1bHRmaWxlCS9pbmRleC9jb250ZW50cy5odG0KLW1haW50aXRsZQlJbmRleCAtIEJhc2ljIFVuaWZpZWQgUHJvY2VzcwotdGFyZ2V0CW9yeV9kb2MKLWluZGV4dGFyZ2V0CWluZGV4X3QKLWtleXdvcmR0YXJnZXQJa2V5d29yZF90Ci1pbmRleGhlaWdodAkyNQotaGVhZGVyZmlsZQlrZXl3b3JkcHJlYW1ibGUudHh0Ci1mb290ZXJmaWxlCWtleXdvcmRwb3N0YW1ibGUudHh0Ci1rZXl3b3JkZmlsZQlrZXl3b3Jkcy50eHQKLWxlYXZlRGlyCV9ib3JkZXJzCi1tdWxpdGRvY3VtZW50a2V5d29yZAlmYWxzZQotc2hvd2RvY3VtZW50dGl0bGUJZmFsc2UKLXByZWZpeAlYRV8KLWxldmVsc2VwYXJhdG9yCV9fCi1zZWUJLCBTZWUKLXNlZWFsc28JLCBTZWUgYWxzbwotbGV2ZWxzdHlsZQlkZWZhdWx0c3R5bGUJaW5kZXhsZXZlbDIKLWxldmVsc3R5bGUJMQlpbmRleGxldmVsMQotbGV2ZWxzdHlsZQkyCWluZGV4bGV2ZWwyCi1sZXZlbHN0eWxlCWhlYWRsaW5lc3R5bGUJaW5kZXhoZWFkaW5nIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9rZXl3b3JkcG9zdGFtYmxlLnR4dCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcva2V5d29yZHBvc3RhbWJsZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExYTA5Y2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9rZXl3b3JkcG9zdGFtYmxlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2tleXdvcmRwcmVhbWJsZS50eHQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2tleXdvcmRwcmVhbWJsZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk2MmU3NTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9rZXl3b3JkcHJlYW1ibGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJpbmRleC5jc3MiIHR5cGU9InRleHQvY3NzIj4KLTx0aXRsZT5JbmRleCAtIEJhc2ljIFVuaWZpZWQgUHJvY2VzczwvdGl0bGU+Ci0KLTwvaGVhZD4KLTxib2R5IGJnY29sb3I9IiNGRkZGRkYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiMwMDQwODAiIHZsaW5rPSIjODAwMEZGIiBhbGluaz0iIzAwMDBGRiI+Ci0gIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcva2V5d29yZHMudHh0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9rZXl3b3Jkcy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkZDI1N2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9rZXl3b3Jkcy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVhFX0tleVdvcmRJbmRleF9fQ29weXJpZ2h0CVhFX0NvcHlyaWdodAotWEVfU2l0ZU1hcF9fQ29weXJpZ2h0CVhFX0NvcHlyaWdodAotWEVfU2VhcmNoRW5naW5lX19Db3B5cmlnaHQJWEVfQ29weXJpZ2h0Ci1YRV9UcmVlQnJvd3Nlcl9fQ29weXJpZ2h0CVhFX0NvcHlyaWdodAotWEVfVHJlZUJyb3dzZXJfX0V4YW1wbGUJWEVfU3lzdGVtX3JlcXVpcmVtZW50cwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvbGliL3Jwd2NvcmUuamFyIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9saWIvcnB3Y29yZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVmOTE0OTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9saWIvcnB3Y29yZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTM1OTdjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBQdWJsaXNoaW5nCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotCi0KLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1B1Ymxpc2hpbmdQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1B1Ymxpc2hpbmdQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDdlZTgzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9QdWJsaXNoaW5nUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBQdWJsaXNoaW5nIHBsdWctaW4gYWN0aXZhdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLyoqCi0JICogVGhlIHBsdWctaW4gSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gUHVibGlzaGluZ1BsdWdpbi5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgUHVibGlzaGluZ1BsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoaW5nUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0b3AoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBQdWJsaXNoaW5nUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9QdWJsaXNoaW5nUmVzb3VyY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9QdWJsaXNoaW5nUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NTkwOGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUHVibGlzaGluZ1Jlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgUHVibGlzaGluZyByZXNvdXJjZSBidW5kbGUuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQdWJsaXNoaW5nUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IFB1Ymxpc2hpbmdSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBQdWJsaXNoaW5nUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluaXRpYWxpemluZ0RpclRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlpbmdGaWxlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRpbmdCb29rbWFya3NUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0aW5nQm9va21hcmtUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0aW5nQm9va21hcmtJbmRleFRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hpbmdMaW5rZWRFbGVtZW50VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaGluZ0VsZW1lbnRUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0aW5nR2xvc3NhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0aW5nU2VhcmNoSW5kZXhUYXNrX25hbWU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGluZ1dBUkZpbGVUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZGluZ1Byb2Nlc3NDbG9zdXJlVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRpbmdFbGVtZW50Q2xvc3VyZVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRMaWJyYXJ5VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaEVsZW1lbnRFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkSHR0cFJlc3BvbnNlRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZEVsZW1lbnRXYXJuaW5nX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRNZXRob2RFbGVtZW50V2FybmluZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5RmlsZVdhcm5pbmdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWlzc2luZ0ljb25GaWxlV2FybmluZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtaXNzaW5nSWNvbk5hbWVXYXJuaW5nX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVybmFsVXJsX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVNlYXJjaEluZGV4RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmZXJlbmNlV29ya2Zsb3dzTm9kZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza05vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByaW1hcmlseVBlcmZvcm1zTm9kZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkaXRpb25hbGx5UGVyZm9ybXNOb2RlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwZXJmb3JtaW5nUm9sZXNOb2RlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnB1dFdvcmtQcm9kdWN0c05vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dHB1dFdvcmtQcm9kdWN0c05vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc3BvbnNpYmxlRm9yTm9kZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW9kaWZpZXNOb2RlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNwb25zaWJsZVJvbGVOb2RlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250YWluaW5nV29ya1Byb2R1Y3ROb2RlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250YWluZWRXb3JrUHJvZHVjdHNOb2RlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkYW5jZU5vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlucHV0VG9Ob2RlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRwdXRGcm9tTm9kZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5kZXhMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2FyZWRDYXRlZ29yeVdhcm5pbmdfbXNnOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgUHVibGlzaGluZ1Jlc291cmNlcy5jbGFzcyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWUyODA3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUFAwMDAwRSAtIElVUFAwMDk5RQotIwotCi0jIFByb2dyZXNzIE1lc3NhZ2VzCi1wdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZT1QdWJsaXNoaW5nIGNvbmZpZ3VyYXRpb24uLi4KLWluaXRpYWxpemluZ0RpclRhc2tfbmFtZT1Jbml0aWFsaXppbmcgZGVzdGluYXRpb24gZGlyZWN0b3J5Li4uCi1jb3B5aW5nRmlsZXNUYXNrX25hbWU9Q29weWluZyBmaWxlcy4uLgotZ2VuZXJhdGluZ0Jvb2ttYXJrc1Rhc2tfbmFtZT1HZW5lcmF0aW5nIGJvb2ttYXJrcy4uLgotZ2VuZXJhdGluZ0Jvb2ttYXJrVGFza19uYW1lPUdlbmVyYXRpbmcgYm9va21hcmsgJyd7MH0nJy4uLgotZ2VuZXJhdGluZ0Jvb2ttYXJrSW5kZXhUYXNrX25hbWU9R2VuZXJhdGluZyBib29rbWFyayBpbmRleC4uLgotcHVibGlzaGluZ0xpbmtlZEVsZW1lbnRUYXNrX25hbWU9UHVibGlzaGluZyBtZXRob2QgZWxlbWVudHM6IHswfSBwdWJsaXNoZWQsIHsxfSByZW1haW5pbmcKLXB1Ymxpc2hpbmdFbGVtZW50VGFza19uYW1lPVB1Ymxpc2hpbmcgbWV0aG9kIGVsZW1lbnQ6IHswfTp7MX0KLWdlbmVyYXRpbmdHbG9zc2FyeVRhc2tfbmFtZT1HZW5lcmF0aW5nIGdsb3NzYXJ5Li4uCi1nZW5lcmF0aW5nU2VhcmNoSW5kZXhUYXNrX25hbWU9R2VuZXJhdGluZyBzZWFyY2ggaW5kZXguLi4KLWdlbmVyYXRpbmdXQVJGaWxlVGFza19uYW1lPUdlbmVyYXRpbmcgV0FSIGZpbGUuLi4KLWJ1aWxkaW5nUHJvY2Vzc0Nsb3N1cmVUYXNrX25hbWU9QnVpbGRpbmcgcHJvY2VzcyBjbG9zdXJlLi4uCi1idWlsZGluZ0VsZW1lbnRDbG9zdXJlVGFza19uYW1lPUJ1aWxkaW5nIGVsZW1lbnQgY2xvc3VyZSBmb3IgJyd7MH0nJy4uLgotbG9hZExpYnJhcnlUYXNrX25hbWU9TG9hZGluZyBsaWJyYXJ5IGNvbnRlbnRzLi4uCi0KLSMgRXJyb3IgTWVzc2FnZXMgbG9nZ2VkIGluIHRoZSBQdWJsaXNoaW5nIFJlcG9ydAotcHVibGlzaEVsZW1lbnRFcnJvcl9tc2c9SVVQUDAwMDBFOiBFcnJvciBwdWJsaXNoaW5nIGVsZW1lbnQ6IHswfQotc2VydmVyRXJyb3JfbXNnPUlVUFAwMDAxRTogTm8gZGF0YSByZXR1cm5lZCBmcm9tIHNlcnZlci4KLWludmFsaWRIdHRwUmVzcG9uc2VFcnJvcl9tc2c9SVVQUDAwMDJFOiBJbnZhbGlkIHJlc3BvbnNlIGZyb20gaHR0cDovL3swfTp7MX06ezJ9Ci0KLSMgV2FybmluZyBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0Ci1pbnZhbGlkRWxlbWVudFdhcm5pbmdfbXNnPUlVUFAwMDAzVzogRWxlbWVudCB3YXMgbm90IHB1Ymxpc2hlZCBiZWNhdXNlIGl0IGlzIG5vdCBhIHZhbGlkIGVsZW1lbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uCi1pbnZhbGlkTWV0aG9kRWxlbWVudFdhcm5pbmdfbXNnPUlVUFAwMDA0VzogRWxlbWVudCB3YXMgbm90IHB1Ymxpc2hlZCBiZWNhdXNlIGl0IGlzIG5vdCBhIG1ldGhvZCBlbGVtZW50OiB7MH0KLWNvcHlGaWxlV2FybmluZ19tc2c9SVVQUDAwMDVXOiBVbmFibGUgdG8gY29weSBmaWxlIGZyb20gJyd7MH0nJyB0byAnJ3sxfScnLgotbWlzc2luZ0ljb25GaWxlV2FybmluZ19tc2c9SVVQUDAwMDZXOiBOb2RlIGljb24gZmlsZSAnJ3swfScnIGRvZXMgbm90IGV4aXN0cy4KLW1pc3NpbmdJY29uTmFtZVdhcm5pbmdfbXNnPUlVUFAwMDA3VzogVW5hYmxlIHRvIHJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSB0aGUgbm9kZSBpY29uLgotZXh0ZXJuYWxVcmxfbXNnPXJlZmVyZW5jaW5nIGV4dGVybmFsIHVybDogezB9Ci1kaXNjYXJlZENhdGVnb3J5V2FybmluZ19tc2c9RW1wdHkgY29udGVudCBjYXRlZ29yeSBlbGVtZW50IG5vdCBwdWJsaXNoZWQuCi0KLSMgRXJyb3IgRGV0YWlscwotY3JlYXRlU2VhcmNoSW5kZXhFcnJvcl9tc2c9SVVQUDAwMDhFOiBUaGUgc2VhcmNoIGluZGV4IGZpbGUgd2FzIG5vdCBjcmVhdGVkLgotCi0jIFByb2Nlc3MgVHJlZSBOb2RlcwotcmVmZXJlbmNlV29ya2Zsb3dzTm9kZV90ZXh0PVJlZmVyZW5jZSBXb3JrZmxvd3MKLXRhc2tOb2RlX3RleHQ9VGFza3MKLXByaW1hcmlseVBlcmZvcm1zTm9kZV90ZXh0PVByaW1hcmlseSBQZXJmb3JtcwotYWRkaXRpb25hbGx5UGVyZm9ybXNOb2RlX3RleHQ9QWRkaXRpb25hbGx5IFBlcmZvcm1zCi1wZXJmb3JtaW5nUm9sZXNOb2RlX3RleHQ9UGVyZm9ybWluZyBSb2xlcwotaW5wdXRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9SW5wdXQgV29yayBQcm9kdWN0cwotb3V0cHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0PU91dHB1dCBXb3JrIFByb2R1Y3RzCi1yZXNwb25zaWJsZUZvck5vZGVfdGV4dD1SZXNwb25zaWJsZSBGb3IKLW1vZGlmaWVzTm9kZV90ZXh0PU1vZGlmaWVzCi1yZXNwb25zaWJsZVJvbGVOb2RlX3RleHQ9UmVzcG9uc2libGUgUm9sZQotY29udGFpbmluZ1dvcmtQcm9kdWN0Tm9kZV90ZXh0PUNvbnRhaW5pbmcgV29yayBQcm9kdWN0Ci1jb250YWluZWRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9Q29udGFpbmVkIFdvcmsgUHJvZHVjdHMKLWd1aWRhbmNlTm9kZV90ZXh0PUd1aWRhbmNlCi1pbnB1dFRvTm9kZV90ZXh0PUlucHV0IHRvCi1vdXRwdXRGcm9tTm9kZV90ZXh0PU91dHB1dCBmcm9tCi0KLSMgSFRNTCBUaXRsZSBmb3IgSW5kZXggUGFnZQotaW5kZXhMYWJlbF90ZXh0PUluZGV4CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg3YzQyYzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGFjdGl2YXRvciBmb3IgbWFuYWdpbmcgdGhlIFB1Ymxpc2hpbmcgcGx1Zy1pbidzIGxpZmUgY3ljbGUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvQWJzdHJhY3RQdWJsaXNoTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvQWJzdHJhY3RQdWJsaXNoTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZmU1MDllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0Fic3RyYWN0UHVibGlzaE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuVGltZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuTmFtZUNhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIEFic3RyYWN0IHB1Ymxpc2hpbmcgbWFuYWdlciBjbGFzcy4gCi0gKiB1c2UgdGhlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnB1Ymxpc2hlcnMgZXh0ZW5zaW9uIHBvaW50IHRvIGV4dGVuZCB0aGlzIGNsYXNzIAotICogaWYgeW91IG5lZWQgdG8gY3VzdG9taXplIHRoZSBwdWJsaXNoaW5nLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHVibGlzaE1hbmFnZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGRlYnVnID0gUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCXByb3RlY3RlZCBTdHJpbmcgcHViRGlyOwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQlwcm90ZWN0ZWQgUHVibGlzaE9wdGlvbnMgb3B0aW9uczsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RWaWV3QnVpbGRlciB2aWV3QnVpbGRlcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdWNlc3MgPSBmYWxzZTsKLQotCi0JLyoqCi0JICogZGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqCi0JICovCi0JcHVibGljIEFic3RyYWN0UHVibGlzaE1hbmFnZXIoKSB7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBpbml0aWxpemUgdGhlIHB1Ymxpc2hpbmcgbWFuYWdlcgotCSAqIAotCSAqIEBwYXJhbSBwdWJEaXIgU3RyaW5nCi0JICogQHBhcmFtIGNvbmZpZyBNZXRob2RDb25maWd1cmF0aW9uCi0JICogQHBhcmFtIG9wdGlvbnMgUHVibGlzaE9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KFN0cmluZyBwdWJEaXIsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQdWJsaXNoT3B0aW9ucyBvcHRpb25zKSB7Ci0JCXRoaXMucHViRGlyID0gcHViRGlyOwotCQkKLQkJaWYgKCAhdGhpcy5wdWJEaXIuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpICkgewotCQkJdGhpcy5wdWJEaXIgKz0gRmlsZS5zZXBhcmF0b3I7Ci0JCX0KLQkJCi0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwotCQl0aGlzLnZpZXdCdWlsZGVyID0gY3JlYXRlVmlld0J1aWxkZXIoKTsKLQkJCi0JCS8vIGNsZWFyIHRoZSBmaWxlIG5hbWUgY2FjaGUKLQkJTmFtZUNhY2hlLmdldEluc3RhbmNlKCkuY2xlYXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBwdWJsaXNoaW5nIHZpZXcgYnVpbGRlci4gCi0JICogVGhlIHZpZXcgYnVpbGRlciBpcyByZXNwb25zaWJsZSB0byBidWlsZCB0aGUgcHVibGlzaGluZyB2aWV3cyBhbmQgY29udGVudHMuCi0JICogCi0JICogQHJldHVybiBBYnN0cmFjdFZpZXdCdWlsZGVyCi0JICovCi0JcHVibGljIEFic3RyYWN0Vmlld0J1aWxkZXIgZ2V0Vmlld0J1aWxkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnZpZXdCdWlsZGVyOwotCX0KLQotCXB1YmxpYyBJU2l0ZUdlbmVyYXRvciBnZXRTaXRlR2VuZXJhdG9yKCkgewotCQlyZXR1cm4gdmlld0J1aWxkZXIuZ2V0U2l0ZUdlbmVyYXRvcigpOwotCX0KLQkKLQkvKioKLQkgKiBkbyBwdWJsaXNoaW5nLiBUaGUgcHVibGlzaGluZyBwcm9jZXNzIGlzIGRlZmluZWQgaW4gdGhyZWUgc3RlcHMuIAotCSAqIHByZVB1Ymxpc2ggdG8gZG8gc29tZSBwcmVwYXJhdGlvbiBiZWZvcmUgdGhlIGFjdHVhbCBwdWJsaXNoaW5nCi0JICogZG9QdWJsaXNoIHRvIHB1Ymxpc2ggdGhlIHZpZXdzIGFuZCBjb250ZW50cwotCSAqIHBvc3RQdWJsaXNoIHRvIGRvIHNvbWUgY2xlYW51cCB3b3JrIGFmdGVyIHB1Ymxpc2guCi0JICogRXh0ZW5kZWQgY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhlc2UgbWV0aG9kcyB0byBhY2hpZXZlIGFkZGl0aW9uYWwgcHVibGlzaGluZyByZXN1bHRzLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIFB1Ymxpc2hpbmdTZXJ2aWNlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcHVibGlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQdWJsaXNoaW5nU2VydmljZUV4Y2VwdGlvbiB7Ci0JCQotCQlpZiAoIG9wdGlvbnMgIT0gbnVsbCApIHsKLQkJCW9wdGlvbnMudmFsaWRhdGUoKTsKLQkJfQotCQkKLQkJVGltZXIgdCA9IG51bGw7Ci0JCWlmICggZGVidWcgKSB7Ci0JCQl0ID0gbmV3IFRpbWVyKCk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQkKLQkJCXByZVB1Ymxpc2gobW9uaXRvcik7Ci0JCQlkb1B1Ymxpc2gobW9uaXRvcik7Ci0JCQlwb3N0UHVibGlzaChtb25pdG9yKTsKLQkJCQotCQkJc3VjZXNzID0gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQdWJsaXNoaW5nU2VydmljZUV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChkZWJ1ZyAmJiB0ICE9IG51bGwgKSB7Ci0JCQkJdC5zdG9wKCk7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oTWVzc2FnZUZvcm1hdAotCQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJCSJUaW1lIHRha2VuIHRvIHB1Ymxpc2ggY29uZmlndXJhdGlvbiAnJ3swfScnOiB7MX0gc2VjcyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyBjb25maWcuZ2V0TmFtZSgpLAotCQkJCQkJCQkJCQkJTG9uZy50b1N0cmluZyh0LmdldFRpbWUoKS8xMDAwKSB9KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogZGlzcG9zZSB0aGUgb2JqZWN0LiBPbmNlIGRpc3Bvc2VkLCB0aGUgb2JqZWN0IGlzIG5vdCB2YWxpZCBhbnkgbW9yZS4KLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICggdmlld0J1aWxkZXIgIT0gbnVsbCApIHsKLQkJCXZpZXdCdWlsZGVyLmRpc3Bvc2UoKTsKLQkJCXZpZXdCdWlsZGVyID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFic3RyYWN0IG1ldGhvZCB0byBnZXQgdGhlIHVybCB0byB0aGUgcHVibGlzaGVkIHNpdGUKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgdXJsCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQdWJsaXNoZWRVcmwoKTsKLQkKLQkvKioKLQkgKiBhYnN0cmFjdCBtZXRob2QgdG8gZ2V0IHRoZSB1cmwgdG8gdGhlIHB1Ymxpc2ggcmVwb3J0Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFB1Ymxpc2hSZXBvcnRVcmwoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQWJzdHJhY3RWaWV3QnVpbGRlciBjcmVhdGVWaWV3QnVpbGRlcigpOwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByZVB1Ymxpc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uOwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvUHVibGlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb247Ci0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcG9zdFB1Ymxpc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0Fic3RyYWN0Vmlld0J1aWxkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0Fic3RyYWN0Vmlld0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWZmZTk2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9BYnN0cmFjdFZpZXdCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuVGltZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5Cb29rbWFyazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0Lkh0bWxCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGF5b3V0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuSWNvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgc3VuLnNlY3VyaXR5LmFjdGlvbi5HZXRCb29sZWFuQWN0aW9uOwotCi0KLS8qKgotICogYWJzdHJhY3QgY2xhc3MgZm9yIHB1Ymxpc2hpbmcgdmlld3MKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Vmlld0J1aWxkZXIgewotCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTEVUX1BBVEggPSAiYXBwbGV0IiArIEZpbGUuc2VwYXJhdG9yQ2hhcjsgLy8kTk9OLU5MUy0xJAotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0FQUExFVF9QQVRIID0gIm5vYXBwbGV0IiArIEZpbGUuc2VwYXJhdG9yQ2hhcjsgLy8kTk9OLU5MUy0xJAotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUEFUSCA9ICJpbWFnZXMiICsgRmlsZS5zZXBhcmF0b3JDaGFyOyAvLyROT04tTkxTLTEkCi0JLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9aSVBfRklMRSA9ICJycHdfaW1nLnppcCI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLy8gaW5zdGVhZCBvZiBwdWJsaXNoaW5nIHRoZSB3aG9sZSBjb250ZW50IGxpYnJhcnksIHdlIGNvbGxlY3QgdGhlIGVsZW1lbnRzIHNob3cgdXAgaW4gdGhlIHZpZXcgdHJlZQotCS8vIG9ubHkgcHVibGlzaCB0aG9zZSBlbGVtZW50IHNob3cgdXAgaW4gdGhlIHZpZXcgYW5kIGl0J3MgcmVmZXJlbmNlZCAoaW5jbHVkaW5nIGNvbnRlbnQgcmVmZXJlbmNlKSBlbGVtZW50cwotCS8vcHJvdGVjdGVkIExpc3QgZWxlbWVudHNUb2JlUHVibGlzaGVkID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gbW92ZSB0aGlzIHRvIHZhbGlkYXRvciBhcyB3ZWxsCi0JLy9wcm90ZWN0ZWQgTGlzdCBwdWJsaXNoZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vcHJvdGVjdGVkIEh0bWxCdWlsZGVyIGJ1aWxkZXI7Ci0JcHJvdGVjdGVkIElTaXRlR2VuZXJhdG9yIHNpdGVHZW5lcmF0b3I7Ci0JCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJvdGVjdGVkIEJvb2ttYXJrIGRlZmF1bHRWaWV3ID0gbnVsbDsKLQotCXByb3RlY3RlZCBQdWJsaXNoT3B0aW9ucyBvcHRpb25zID0gbnVsbDsKLQotLy8JcHJvdGVjdGVkIEZpbGUgaWNvblBhdGg7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCB0aW1lb3V0X21pbGxpcyA9IDYwMDAwMDsgIC8vIDEwIG1pbnV0ZXM/Pz8KLQotCS8qKgotCSAqIGNvbnN0cnVjdCBhbiBBYnN0cmFjdFZpZXdCdWlsZGVyIG9iamVjdAotCSAqICAKLQkgKiBAcGFyYW0gYnVpbGRlciBIdG1sQnVpbGRlcgotCSAqIEBwYXJhbSBvcHRpb25zIFB1Ymxpc2hPcHRpb25zCi0JICovCi0JcHVibGljIEFic3RyYWN0Vmlld0J1aWxkZXIoSVNpdGVHZW5lcmF0b3IgZ2VuZXJhdG9yKQotCXsKLQkJdGhpcy5zaXRlR2VuZXJhdG9yID0gZ2VuZXJhdG9yOwotCQl0aGlzLm9wdGlvbnMgPSB0aGlzLnNpdGVHZW5lcmF0b3IuZ2V0UHVibGlzaE9wdGlvbnMoKTsKLQotCQl0aGlzLmNvbmZpZyA9IHRoaXMuc2l0ZUdlbmVyYXRvci5nZXRIdG1sQnVpbGRlcigpLmdldExheW91dE1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JfQotCi0JcHVibGljIElTaXRlR2VuZXJhdG9yIGdldFNpdGVHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnNpdGVHZW5lcmF0b3I7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgSHRtbEJ1aWxkZXIKLQkgKiBAcmV0dXJuIEh0bWxCdWlsZGVyCi0JICovCi0JcHVibGljIEh0bWxCdWlsZGVyIGdldEh0bWxCdWlsZGVyKCkKLQl7Ci0JCXJldHVybiB0aGlzLnNpdGVHZW5lcmF0b3IuZ2V0SHRtbEJ1aWxkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIFB1Ymxpc2hPcHRpb25zCi0JICogQHJldHVybiBQdWJsaXNoT3B0aW9ucwotCSAqLwotCXB1YmxpYyBQdWJsaXNoT3B0aW9ucyBnZXRPcHRpb25zKCkKLQl7Ci0JCXJldHVybiB0aGlzLnNpdGVHZW5lcmF0b3IuZ2V0UHVibGlzaE9wdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIEVsZW1lbnRMYXlvdXRNYW5hZ2VyCi0JICogQHJldHVybiBFbGVtZW50TGF5b3V0TWFuYWdlcgotCSAqLwotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlciBnZXRMYXlvdXRNZ3IoKQotCXsKLQkJcmV0dXJuIGdldEh0bWxCdWlsZGVyKCkuZ2V0TGF5b3V0TWFuYWdlcigpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgY29udGVudCB2YWxpZGF0b3IuCi0JICogQHJldHVybiBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvcgotCSAqLwotCXB1YmxpYyBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKQotCXsKLQkJcmV0dXJuIChQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvcilnZXRIdG1sQnVpbGRlcigpLmdldFZhbGlkYXRvcigpOwotCX0KLQkKLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBwdWJsaXNoYWJsZSBvciBub3QuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhblB1Ymxpc2goTWV0aG9kRWxlbWVudCBlbGVtZW50KQotCXsKLQkJcmV0dXJuIGNhblNob3coZWxlbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuU2hvdyhNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCBnZXRWYWxpZGF0b3IoKS5pc0Rpc2NhcmRlZChudWxsLCBudWxsLCBlbGVtZW50KSApCi0JCXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKCAhQ29uZmlndXJhdGlvbkhlbHBlci5jYW5TaG93KGVsZW1lbnQsIGNvbmZpZykgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmICggb3B0aW9ucy5pc1B1Ymxpc2hQcm9jZXNzKCkpIHsKLQkJCXJldHVybiBnZXRWYWxpZGF0b3IoKS5pbkNsb3N1cmUoZWxlbWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkaXNjYXJkRW1wdHlDYXRlZ29yeShDb250ZW50Q2F0ZWdvcnkgZWxlbWVudCwgYm9vbGVhbiBkaXNjYXJkKQotCXsKLQkJaWYgKCBkaXNjYXJkICkKLQkJewotCQkJZ2V0VmFsaWRhdG9yKCkuc2V0RGlzY2FyZGVkRWxlbWVudChlbGVtZW50KTsKLQkJCWdldFZhbGlkYXRvcigpLmxvZ1dhcm5pbmcoZWxlbWVudCwgUHVibGlzaGluZ1Jlc291cmNlcy5kaXNjYXJlZENhdGVnb3J5V2FybmluZ19tc2cpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJZ2V0VmFsaWRhdG9yKCkuYWRkVmFsaWRDYXRlZ29yeSggKENvbnRlbnRDYXRlZ29yeSllbGVtZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGNhbGMwMUZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLCBnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgY2FsYzBuRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsIGdldExheW91dE1ncigpLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBjYWxjMDFGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUoZWxlbWVudCwgZmVhdHVyZSwgZ2V0TGF5b3V0TWdyKCkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCBjYWxjMG5GZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgZmVhdHVyZSwgZ2V0TGF5b3V0TWdyKCkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldFB1Ymxpc2hlZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZ2V0VmFsaWRhdG9yKCkuZ2V0UHVibGlzaGVkRWxlbWVudHMoKTsKLQl9Ci0JCi0JLyoqCi0JICogcHVibGlzaCB0aGUgZWxlbWVudCwgY29sbGVjdCB0aGUgbGlua2VkIGVsZW1lbnRzIGluIHRoZSBwdWJsaXNoZWQgY29udGVudHMKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHJlY3Vyc2l2ZQotCSAqIEBwYXJhbSBsaW5rZWRFbGVtZW50cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1Ymxpc2goZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBmaW5hbCBNZXRob2RFbGVtZW50IGVsZW1lbnQpCi0JewotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiLS0tIEJlZ2luIHB1Ymxpc2hpbmcgZWxlbWVudCAiICsgZWxlbWVudC5nZXRHdWlkKCkgKyAiOiIgKyBlbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBlbGVtZW50LmdldE5hbWUoKSApOwotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQotCQl0cnkgewotCQkJTGlzdCBsaW5rZWRFbGVtZW50cyA9IGdldFZhbGlkYXRvcigpLmdldFJlZmVyZW5jZWRFbGVtZW50cygpOwotCQkJaWYgKCAhY2FuUHVibGlzaChlbGVtZW50KSApCi0JCQl7Ci0JCQkJZ2V0SHRtbEJ1aWxkZXIoKS5nZXRWYWxpZGF0b3IoKS5sb2dXYXJuaW5nKGVsZW1lbnQsIFB1Ymxpc2hpbmdSZXNvdXJjZXMuaW52YWxpZEVsZW1lbnRXYXJuaW5nX21zZyk7IAotCQkJfQotCQkJZWxzZSBpZiAoICFnZXRQdWJsaXNoZWRFbGVtZW50cygpLmNvbnRhaW5zKGVsZW1lbnQpICkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCWlmICggbW9uaXRvciAhPSBudWxsICkKLQkJCQkJewotCQkJCQkJU3RyaW5nIHN0cjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKCBsaW5rZWRFbGVtZW50cyAhPSBudWxsICkKLQkJCQkJCXsKLQkJCQkJCQlzdHIgPSBOTFMuYmluZChQdWJsaXNoaW5nUmVzb3VyY2VzLnB1Ymxpc2hpbmdMaW5rZWRFbGVtZW50VGFza19uYW1lLCBJbnRlZ2VyLnRvU3RyaW5nKGdldFB1Ymxpc2hlZEVsZW1lbnRzKCkuc2l6ZSgpKSwgSW50ZWdlci50b1N0cmluZyhsaW5rZWRFbGVtZW50cy5zaXplKCkpKTsgCi0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJc3RyID0gTkxTLmJpbmQoUHVibGlzaGluZ1Jlc291cmNlcy5wdWJsaXNoaW5nRWxlbWVudFRhc2tfbmFtZSwgZWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpLCBlbGVtZW50LmdldE5hbWUoKSk7IAotCQkJCQkJfQotCQkJCQkJbW9uaXRvci5zdWJUYXNrKHN0cik7Ci0KLQkJCQkJfQotCQkJCQkvL2J1aWxkZXIuZ2VuZXJhdGVIdG1sKGVsZW1lbnQpOwotCQkJCQlJRWxlbWVudExheW91dCBsYXlvdXQgPSBnZXRIdG1sQnVpbGRlcigpLmdldExheW91dE1hbmFnZXIoKS5nZXRMYXlvdXQoZWxlbWVudCwgdHJ1ZSk7Ci0JCQkJCVN0cmluZyBodG1sZmlsZSA9IGdldEh0bWxCdWlsZGVyKCkuZ2VuZXJhdGVIdG1sKGxheW91dCk7Ci0JCQkJCQotCQkJCQllbGVtZW50UHVibGlzaGVkKGxheW91dCwgaHRtbGZpbGUpOwotCi0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZXgpCi0JCQkJewotCQkJCQkvL2V4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQlnZXRIdG1sQnVpbGRlcigpLmdldFZhbGlkYXRvcigpLmxvZ0Vycm9yKGVsZW1lbnQsIE5MUy5iaW5kKFB1Ymxpc2hpbmdSZXNvdXJjZXMucHVibGlzaEVsZW1lbnRFcnJvcl9tc2csIGV4LmdldE1lc3NhZ2UoKSksIGV4KTsgCi0JCQkJfQotCQkJCWdldFB1Ymxpc2hlZEVsZW1lbnRzKCkuYWRkKGVsZW1lbnQpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJBbHJlYWR5IGdlbmVyYXRlZDogIiArIGdldFVSTChlbGVtZW50KSApOwotCQkJfQotCi0vLwkJCWlmICggcmVjdXJzaXZlICkKLS8vCQkJewotLy8JCQkJLy8gaXRlcmF0b3IgYWxsIGNvbnRhaW5lZCBhbmQgcmVmZXJlbmNlZCBlbGVtZW50cwotLy8JCQkJRUxpc3QgY2hpbGRyZW4gPSBlbGVtZW50LmVDb250ZW50cygpOwotLy8JCQkJaWYgKCBjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLnNpemUoKT4wICkKLS8vCQkJCXsKLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApCi0vLwkJCQkJewotLy8JCQkJCQlPYmplY3QgZSA9IGl0Lm5leHQoKTsKLS8vCQkJCQkJaWYgKCBlIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKQotLy8JCQkJCQl7Ci0vLwkJCQkJCQljb250aW51ZTsKLS8vCQkJCQkJfQotLy8KLS8vCQkJCQkJaWYgKCBlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApCi0vLwkJCQkJCXsKLS8vCQkJCQkJCXB1Ymxpc2gobW9uaXRvciwgKE1ldGhvZEVsZW1lbnQpZSwgdHJ1ZSk7Ci0vLwkJCQkJCX0KLS8vCQkJCQkJZWxzZQotLy8JCQkJCQl7Ci0vLwkJCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiTm90IG1ldGhvZCBlbGVtZW50LGNhbid0IHB1Ymxpc2g6ICIgKyBlKTsKLS8vCQkJCQkJCWJ1aWxkZXIuZ2V0VmFsaWRhdG9yKCkubG9nV2FybmluZyhlbGVtZW50LCBQdWJsaXNoaW5nUmVzb3VyY2VzLmZvcm1hdFN0cmluZygiUHVibGlzaGluZy5pbnZhbGlkTWV0aG9kRWxlbWVudFdhcm5pbmcubXNnIiwgZS50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCWdldEh0bWxCdWlsZGVyKCkuZ2V0VmFsaWRhdG9yKCkubG9nRXJyb3IoZWxlbWVudCwgTkxTLmJpbmQoUHVibGlzaGluZ1Jlc291cmNlcy5wdWJsaXNoRWxlbWVudEVycm9yX21zZywgZS5nZXRNZXNzYWdlKCkpLCBlKTsgCi0JCX0KLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIi0tLSBFbmQgcHVibGlzaGluZyBlbGVtZW50ICIgKyBlbGVtZW50LmdldEd1aWQoKSArICI6IiArIGVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGVsZW1lbnQuZ2V0TmFtZSgpICk7Ci0JCQotCQkJfX07Ci0KLQkJCi0JCVRpbWVyIHRpbWVyID0gbmV3IFRpbWVyKCk7Ci0JCXRyeSB7CQotCQkJLy8gc2V0IHRoZSB0YXJnZXQgZWxlbWVudCBmb3IgdGhyZSBjb250ZW50IHZhbGlkYXRvcgotCQkJZ2V0VmFsaWRhdG9yKCkuc2V0VGFyZ2V0RWxlbWVudChlbGVtZW50KTsKLQkJCQotCQkJLy8gcnVuIHRoZSBwdWJsaXNoaW5nIGFuZCBjaGVjayB0aGUgdGltZSwgaWYgdGltZW91dCwgdGVybWluYXRlIGl0Ci0JCQlUaHJlYWQgdCA9IG5ldyBUaHJlYWQocnVubmFibGUpOwotCQkJdC5zdGFydCgpOwotCQkJdC5qb2luKHRpbWVvdXRfbWlsbGlzKTsKLQkJCWlmICggdC5pc0FsaXZlKCkgKSB7CQkJCQotCQkJCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZGllIGFuZCBsb2cgYW4gZXJyb3IKLQkJCQl0aW1lci5zdG9wKCk7Ci0JCQkJZ2V0VmFsaWRhdG9yKCkubG9nSW5mbyhlbGVtZW50LCAicHVibGlzaGluZyBlbGVtZW50IHRha2VzICIgKyB0aW1lci5nZXRUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBhbHJlYWR5IGFuZCBpcyBzdGlsbCBub3QgZG9uZSB5ZXQgLi4uIik7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl0aW1lci5zdGFydCgpOwotCQkJCXQuam9pbigpOwotCQkJfQotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgewotCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlnZXRWYWxpZGF0b3IoKS5zZXRUYXJnZXRFbGVtZW50KG51bGwpOwotCQkJZ2V0VmFsaWRhdG9yKCkuZ2V0UmVmZXJlbmNlZEVsZW1lbnRzKCkucmVtb3ZlKGVsZW1lbnQpOwkKLQotCQkJdGltZXIuc3RvcCgpOwotCQkJZ2V0VmFsaWRhdG9yKCkubG9nSW5mbyhlbGVtZW50LCB0aW1lci5nZXRUb3RhbFRpbWUoKSArICIgbWluaSBzZWNvbmRzIHB1Ymxpc2hpbmcgZWxlbWVudCIgKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVsZW1lbnRQdWJsaXNoZWQoSUVsZW1lbnRMYXlvdXQgbGF5b3V0LCBTdHJpbmcgaHRtbGZpbGUpIHsKLQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjb3B5Tm9kZUljb24oRmlsZSBzb3VyY2UpCi0JewotCQlTdHJpbmcgbmFtZSA9IHNvdXJjZS5nZXROYW1lKCk7Ci0KLQkJRmlsZSBkZXN0ID0gbmV3IEZpbGUoc2l0ZUdlbmVyYXRvci5nZXROb2RlSWNvblBhdGgoKSwgbmFtZSk7Ci0JCWlmICggUmVzb3VyY2VIZWxwZXIuY29weUZpbGUoc291cmNlLCBkZXN0KSA9PSBmYWxzZSApCi0JCXsKLQkJCWdldEh0bWxCdWlsZGVyKCkuZ2V0VmFsaWRhdG9yKCkubG9nV2FybmluZyhOTFMuYmluZChQdWJsaXNoaW5nUmVzb3VyY2VzLmNvcHlGaWxlV2FybmluZ19tc2csIHNvdXJjZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZGVzdC5nZXRBYnNvbHV0ZVBhdGgoKSkpOwkgCi0JCX0KLQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE5vZGVJY29uTmFtZShPYmplY3Qgb2JqKQotCXsKLQkJRmlsZSBpY29uRmlsZSA9IG51bGw7Ci0JCVN0cmluZyBpY29uTmFtZSA9IG51bGw7Ci0KLQkJaWYgKCBvYmogaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQgKQotCQl7Ci0JCQlVUkkgdXJpID0gKChEZXNjcmliYWJsZUVsZW1lbnQpb2JqKS5nZXROb2RlaWNvbigpOwotCQkJCi0JCQlTdHJpbmcgZWxlbWVudE5hbWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudClvYmopLmdldFR5cGUoKS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKTsKLQkJCWlmIChEZWZhdWx0RWxlbWVudFR5cGVSZXNvdXJjZXMudXNlRGVmYXVsdEljb24oZWxlbWVudE5hbWUpKQotCQkJCXVyaSA9IG51bGw7Ci0JCQkJCi0JCQlpZiAoIHVyaSAhPSBudWxsICkKLQkJCXsKLQkJCQkvLyB0cnkgaWYgdGhpcyBpcyBhIHZhbGlkIFVSTCBvciBub3QKLQkJCQlib29sZWFuIGlzRnVsbFBhdGggPSBmYWxzZTsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCVVSTCB1cmwgPSB1cmkudG9VUkwoKTsKLQkJCQkJaWYgKCB1cmwgIT0gbnVsbCApCi0JCQkJCXsKLQkJCQkJCWljb25GaWxlID0gbmV3IEZpbGUoVVJMRGVjb2Rlci5kZWNvZGUodXJsLmdldEZpbGUoKSwgIlVURi04IikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpc0Z1bGxQYXRoID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4KQotCQkJCXsKLQkJCQkJOyAvLyBub3QgYSB2YWxpZCB1cmwsIG1heWJlIGEgcmVsYXRpdmUgcGF0aAotCQkJCX0KLQkJCQkKLQkJCQlpZiAoICFpc0Z1bGxQYXRoICkKLQkJCQl7Ci0JCQkJCS8vaWNvbkZpbGUgPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpLCBVUkxEZWNvZGVyLmRlY29kZSh1cmkudG9TdHJpbmcoKSkpOwotCQkJCQkvLyBUbyBoYW5kbGUgdGhlIG5vZGVJY29uIHVyaSwgRVBGIDEuMiwgaXRzIGNoYW5nZWQgbm93IGl0IGlzIHJlbGF0aXZlIHRvIHBsdWdpbiBwYXRoLiAKLQkJCQkJaWNvbkZpbGUgPSBuZXcgRmlsZShUbmdVdGlsLmdldEZ1bGxQYXRob2ZOb2Rlb3JTaGFwZUljb25VUkkoKEVPYmplY3Qpb2JqLCB1cmkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmICggKGljb25GaWxlICE9IG51bGwgKSAmJiAhaWNvbkZpbGUuZXhpc3RzKCkgKQotCQl7Ci0JCQlpY29uRmlsZSA9IG51bGw7Ci0JCX0KLQotCQlpZiAoIGljb25GaWxlID09IG51bGwgKQotCQl7Ci0JCQkvLyBnZXQgdGhlIGRlZmF1bHQgaWNvbiBuYW1lCi0JCQlpZiAoIG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgKQotCQkJewotCQkJCVN0cmluZyB0eXBlID0gKChNZXRob2RFbGVtZW50KW9iaikuZ2V0VHlwZSgpLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpOwotCQkJCWljb25GaWxlID0gSWNvblV0aWwuZ2V0Tm9kZUljb25GaWxlKHR5cGUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKCBpY29uRmlsZSAhPSBudWxsICkKLQkJewotCQkJCS8vIG5lZWQgdG8gY29weSB0aGUgZmlsZSB0b2dldGhlciBhbmQgemlwIGZvciB0aGUgYXBwbGV0Ci0JCQlpZiAoICFpY29uRmlsZS5leGlzdHMoKSApCi0JCQl7Ci0JCQkJaWYgKCBvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICkKLQkJCQl7Ci0JCQkJCWdldEh0bWxCdWlsZGVyKCkuZ2V0VmFsaWRhdG9yKCkubG9nV2FybmluZygoTWV0aG9kRWxlbWVudClvYmosIE5MUy5iaW5kKFB1Ymxpc2hpbmdSZXNvdXJjZXMubWlzc2luZ0ljb25GaWxlV2FybmluZ19tc2csIGljb25GaWxlLmdldEFic29sdXRlUGF0aCgpKSk7IAotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlnZXRIdG1sQnVpbGRlcigpLmdldFZhbGlkYXRvcigpLmxvZ1dhcm5pbmcoTkxTLmJpbmQoUHVibGlzaGluZ1Jlc291cmNlcy5taXNzaW5nSWNvbkZpbGVXYXJuaW5nX21zZywgaWNvbkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsgCi0JCQkJfQotCQkJfQotCQkJCQotCQkJY29weU5vZGVJY29uKGljb25GaWxlKTsKLQkJCWljb25OYW1lID0gaWNvbkZpbGUuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJaWYgKCBpY29uTmFtZSA9PSBudWxsIHx8IGljb25OYW1lLmxlbmd0aCgpID09IDAgKQotCQl7Ci0JCQlTdHJpbmcgbmFtZTsKLQkJCWlmICggb2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApCi0JCQl7Ci0JCQkJbmFtZSA9ICgoTWV0aG9kRWxlbWVudClvYmopLmdldE5hbWUoKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQluYW1lID0gb2JqLnRvU3RyaW5nKCk7Ci0JCQl9Ci0KLQkJCWdldEh0bWxCdWlsZGVyKCkuZ2V0VmFsaWRhdG9yKCkubG9nV2FybmluZyhOTFMuYmluZChQdWJsaXNoaW5nUmVzb3VyY2VzLm1pc3NpbmdJY29uTmFtZVdhcm5pbmdfbXNnLCBuYW1lKSk7IAotCQl9Ci0KLQkJcmV0dXJuIGljb25OYW1lOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE9wZW5JY29uTmFtZShPYmplY3Qgb2JqKQotCXsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IG5hbWUKLQkgKiBAcGFyYW0gb2JqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldE5hbWUoT2JqZWN0IG9iaikKLQl7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpCi0JCXsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KW9iajsKLQkJCQotCQkJLy8gY2FsY3VsYXRlIHRoZSBwcmVzZW50YXRpb24gbmFtZSwgZm9yIGV4dGVuZGVycywgZ2V0IGZyb20gYmFzZSBpZiBuZWVkZWQKLQkJCW5hbWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldFByZXNlbnRhdGlvbk5hbWUoZSwgY29uZmlnKTsJCQkJCQkJCi0JCQlpZiAoIG5hbWUgPT0gbnVsbCB8fCBuYW1lLmVxdWFscygiIikgKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJbmFtZSA9IGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQkJaW50IGluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZigiLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKCBpbmRleCA+PTAgKQotCQkJCXsKLQkJCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGluZGV4KzEpOwotCQkJCQlpZiAoIG5hbWUuZW5kc1dpdGgoIkltcGwiKSApIC8vJE5PTi1OTFMtMSQKLQkJCQkJewotCQkJCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCktNCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikKLQkJewotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBwcm92aWRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBvYmo7Ci0JCQluYW1lID0gcHJvdmlkZXIuZ2V0VGV4dChvYmopOwotCi0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0IGd1aWQKLQkgKiBAcGFyYW0gb2JqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEdVSUQoT2JqZWN0IG9iaikKLQl7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KQotCQl7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KSBvYmopLmdldEd1aWQoKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdXJsCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRVUkwoT2JqZWN0IG9iaikKLQl7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KQotCQl7Ci0JCQlyZXR1cm4gZ2V0TGF5b3V0TWdyKCkuZ2V0TGF5b3V0KChNZXRob2RFbGVtZW50KSBvYmosIHRydWUpLmdldFVybCgpOwotCQl9Ci0JCWVsc2UKLQkJewotLy8JCQkgVE9ETyAtIGxheW91dCBuZWVkcyB0byBiZSBwcm92aWRlZCBmb3IgdW5jYXRlZ29yaXplZCBhbmQgY2F0ZWdvcnkgb2JqZWN0Ci0JCQlyZXR1cm4gImFwcGxldC8vZW1wdHkuaHRtIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGJvb2ttYXJrCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIEJvb2ttYXJrCi0JICovCi0JcHJvdGVjdGVkIEJvb2ttYXJrIGNyZWF0ZUJvb2ttYXJrKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgT2JqZWN0IGVsZW1lbnQpCi0JewotCQkvLyBwdWJsaXNoIHRoaXMgZWxlbWVudCwKLQkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApCi0JCXsKLQkJCS8vIGRlbGF5IHRoZSBwdWJsaXNoaW5nIHRpbGwgdGhlIGJvb2ttYXJrcyBhcmUgY3JlYXRlZC4KLQkJCWdldEh0bWxCdWlsZGVyKCkuZ2V0VmFsaWRhdG9yKCkuYWRkUmVmZXJlbmNlZEVsZW1lbnQobnVsbCwgKE1ldGhvZEVsZW1lbnQpZWxlbWVudCk7Ci0KLQkJCS8vdGhpcy5wdWJsaXNoKG1vbml0b3IsIChNZXRob2RFbGVtZW50KWVsZW1lbnQsIGZhbHNlLCBlbGVtZW50c1RvYmVQdWJsaXNoZWQpOwotCQl9Ci0KLQkJLy8gY3JlYXRlIGEgYm9va21hcmsgZm9yIHRoaXMgZWxlbWVudAotCQlTdHJpbmcgbmFtZSA9IGdldE5hbWUoZWxlbWVudCk7Ci0JCVN0cmluZyBndWlkID0gZ2V0R1VJRChlbGVtZW50KTsKLQkJU3RyaW5nIHVybCA9IGdldFVSTChlbGVtZW50KTsKLQkJU3RyaW5nIG5vZGVJY29uID0gZ2V0Tm9kZUljb25OYW1lKGVsZW1lbnQpOwotCi0JCVN0cmluZyBtc2cgPSBOTFMuYmluZChQdWJsaXNoaW5nUmVzb3VyY2VzLmdlbmVyYXRpbmdCb29rbWFya1Rhc2tfbmFtZSwgbmFtZSk7IAotCQltb25pdG9yLnN1YlRhc2sobXNnKTsKLQkJcmV0dXJuIGNyZWF0ZUJvb2ttYXJrKG5hbWUsIGd1aWQsIHVybCwgbm9kZUljb24sIG5vZGVJY29uLCBlbGVtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9va21hcmsgY3JlYXRlQm9va21hcmsoU3RyaW5nIG5hbWUsIFN0cmluZyBndWlkLCBTdHJpbmcgdXJsLCBTdHJpbmcgY2xvc2VJY29uLCBTdHJpbmcgb3Blbkljb24sIE9iamVjdCBvd25lcikKLQl7Ci0KLQkJQm9va21hcmsgYiA9IG5ldyBCb29rbWFyayhuYW1lKTsKLQkJYi5zZXRQcmVzZW50YXRpb25OYW1lKG5hbWUpOwotCQliLnNldFVuaXF1ZUlkKGd1aWQpOwotCQliLnNldENsb3NlZEljb25OYW1lKGNsb3NlSWNvbik7Ci0JCWIuc2V0T3Blbkljb25OYW1lKG9wZW5JY29uKTsKLQkJYi5zZXRGaWxlTmFtZSh1cmwpOwotCQliLnNldEZyb21Db250ZW50TGlicmFyeSh0cnVlKTsKLQkJYi5zZXRFbmFibGVkKHRydWUpOwotCQliLnNldEV4aXN0KHRydWUpOwotCQliLnNldFZpc2libGUodHJ1ZSk7Ci0JCWIuc2V0VHJhbnNwYXJlbmN5KGZhbHNlKTsKLQkJYi5zZXREZWZhdWx0KHRydWUpOwotCQliLnNldEN1cnJlbnQoZmFsc2UpOwotCQliLnNldE93bmVyKG93bmVyKTsKLQkJcmV0dXJuIGI7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBkZWZhdWx0IHZpZXcKLQkgKiBAcmV0dXJuIEJvb2ttYXJrCi0JICovCi0JcHVibGljIEJvb2ttYXJrIGdldERlZmF1bHRWaWV3KCkKLQl7Ci0JCXJldHVybiBkZWZhdWx0VmlldzsKLQl9Ci0KLQotLy8JcHJvdGVjdGVkIHZvaWQgY29weUljb25zRm9yTm9uQXBwbGV0KCkKLS8vCXsKLS8vCQl0cnkKLS8vCQl7Ci0vLwkJCS8vIGRvbid0IGphciBpdC4gY29weSB0aGUgaWNvbnMgdG8gdGhlIGltYWdlcwotLy8vLwkJCUZpbGUgamFyRmlsZSA9IG5ldyBGaWxlKGJ1aWxkZXIuZ2V0UHVibGlzaERpcigpLCBBUFBMRVRfUEFUSCArIElDT05fWklQX0ZJTEUpOwotLy8vLwkJCVB1Ymxpc2hpbmdVdGlsLmphckZpbGVzKGljb25QYXRoLCBqYXJGaWxlKTsKLS8vCi0vLwkJCWlmICggb3B0aW9ucy51c2VEZWZhdWx0VHJlZUJyb3dzZXIgKQotLy8JCQl7Ci0vLwkJCQkvLyBhbHNvIGNvcHkgdGhlIGljb25zIHRvIHRoZSBuby1hcHBsZXQgZm9sZGVyCi0vLwkJCQlMYXlvdXRSZXNvdXJjZXMuY29weURpcihpY29uUGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSwgYnVpbGRlci5nZXRQdWJsaXNoRGlyKCkgKyBOT19BUFBMRVRfUEFUSCArIElDT05fUEFUSCk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLS8vCQl7Ci0vLwkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotLy8JCX0KLS8vCX0KLQotCS8qKgotCSAqIGJ1aWxkIHRoZSB2aWV3cyBhbmQgcmV0dXJucyBhIGxpc3Qgb2YgQm9vbG1hcmsgb2JqZWN0cwotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIEJvb2ttYXJrcwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBMaXN0IGJ1aWxkVmlld3MoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCi0JLyoqCi0JICogZGlzcG9zZSB0aGUgb2JqZWN0LgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JewotCQkvL3B1Ymxpc2hlZEVsZW1lbnRzLmNsZWFyKCk7Ci0JCUh0bWxCdWlsZGVyIGJ1aWxkZXIgPSBnZXRIdG1sQnVpbGRlcigpOwotCQkKLQkJaWYgKCBidWlsZGVyICE9IG51bGwgKQotCQl7Ci0JCQlidWlsZGVyLmdldExheW91dE1hbmFnZXIoKS5jbGVhcigpOwotCQkJYnVpbGRlci5kaXNwb3NlKCk7Ci0JCX0KLQkJY29uZmlnID0gbnVsbDsKLQkJYnVpbGRlciA9IG51bGw7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvQ29uZmlndXJhdGlvblZpZXdCdWlsZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9Db25maWd1cmF0aW9uVmlld0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODJkMTk5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9Db25maWd1cmF0aW9uVmlld0J1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlRpbWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5Cb29rbWFyazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkFjdGl2aXR5TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5Qcm9jZXNzRWxlbWVudEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLlByb2Nlc3NMYXlvdXREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5TdW1tYXJ5UGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuUHVibGlzaGluZ1Jlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51dGlsLlB1Ymxpc2hpbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblZpZXdCdWlsZGVyIGV4dGVuZHMgQWJzdHJhY3RWaWV3QnVpbGRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX1JlZmVyZW5jZV9Xb3JrZmxvd3MgPSAiUmVmZXJlbmNlX1dvcmtmbG93cyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfVGFza3MgPSAiVGFza3MiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX1Jlc3BvbnNpYmxlRm9yX1Rhc2tzID0gIlByaW1hcmlseV9QZXJmb3JtcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfUGFydGljaXBhdGVzSW5fVGFza3MgPSAiQWRkaXRpb25hbGx5X1BlcmZvcm1zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9QZXJmb3JtaW5nX1JvbGVzID0gIlBlcmZvcm1pbmdfUm9sZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0lucHV0X1dvcmtfUHJvZHVjdHMgPSAiSW5wdXRfV29ya19Qcm9kdWN0cyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfT3V0cHV0X1dvcmtfUHJvZHVjdHMgPSAiT3V0cHV0X1dvcmtfUHJvZHVjdHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX1dvcmtfUHJvZHVjdHNfQ3JlYXRlZCA9ICJSZXNwb25zaWJsZV9Gb3IiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX1dvcmtfUHJvZHVjdHNfTW9kaWZpZWQgPSAiTW9kaWZpZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX1Jlc3BvbnNpYmxlX1JvbGUgPSAiUmVzcG9uc2libGVfUm9sZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQ29udGFpbmluZ19Xb3JrX1Byb2R1Y3QgPSAiQ29udGFpbmluZ19Xb3JrX1Byb2R1Y3QiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0NvbnRhaW5lZF9Xb3JrX1Byb2R1Y3RzID0gIkNvbnRhaW5lZF9Xb3JrX1Byb2R1Y3RzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9HdWlkYW5jZXMgPSAiR3VpZGFuY2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0lucHV0VG9fVGFzayA9ICJJbnB1dF90byI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfT3V0cHV0T2ZfVGFzayA9ICJPdXRwdXRfZnJvbSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0ZPTERFUiA9IERlZmF1bHROb2RlSWNvblJlc291cmNlcwotCQkJLmdldEljb25OYW1lKCJmb2xkZXIiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfUmVmZXJlbmNlX1dvcmtmbG93cyA9IFB1Ymxpc2hpbmdSZXNvdXJjZXMucmVmZXJlbmNlV29ya2Zsb3dzTm9kZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9UYXNrcyA9IFB1Ymxpc2hpbmdSZXNvdXJjZXMudGFza05vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfUmVzcG9uc2libGVGb3JfVGFza3MgPSBQdWJsaXNoaW5nUmVzb3VyY2VzLnByaW1hcmlseVBlcmZvcm1zTm9kZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9QYXJ0aWNpcGF0ZXNJbl9UYXNrcyA9IFB1Ymxpc2hpbmdSZXNvdXJjZXMuYWRkaXRpb25hbGx5UGVyZm9ybXNOb2RlX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1BlcmZvcm1pbmdfUm9sZXMgPSBQdWJsaXNoaW5nUmVzb3VyY2VzLnBlcmZvcm1pbmdSb2xlc05vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfSW5wdXRfV29ya19Qcm9kdWN0cyA9IFB1Ymxpc2hpbmdSZXNvdXJjZXMuaW5wdXRXb3JrUHJvZHVjdHNOb2RlX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX091dHB1dF9Xb3JrX1Byb2R1Y3RzID0gUHVibGlzaGluZ1Jlc291cmNlcy5vdXRwdXRXb3JrUHJvZHVjdHNOb2RlX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1dvcmtfUHJvZHVjdHNfQ3JlYXRlZCA9IFB1Ymxpc2hpbmdSZXNvdXJjZXMucmVzcG9uc2libGVGb3JOb2RlX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1dvcmtfUHJvZHVjdHNfTW9kaWZpZWQgPSBQdWJsaXNoaW5nUmVzb3VyY2VzLm1vZGlmaWVzTm9kZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9SZXNwb25zaWJsZV9Sb2xlID0gUHVibGlzaGluZ1Jlc291cmNlcy5yZXNwb25zaWJsZVJvbGVOb2RlX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX0NvbnRhaW5pbmdfV29ya19Qcm9kdWN0ID0gUHVibGlzaGluZ1Jlc291cmNlcy5jb250YWluaW5nV29ya1Byb2R1Y3ROb2RlX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX0NvbnRhaW5lZF9Xb3JrX1Byb2R1Y3RzID0gUHVibGlzaGluZ1Jlc291cmNlcy5jb250YWluZWRXb3JrUHJvZHVjdHNOb2RlX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX0d1aWRhbmNlcyA9IFB1Ymxpc2hpbmdSZXNvdXJjZXMuZ3VpZGFuY2VOb2RlX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX0lucHV0VG9fVGFzayA9IFB1Ymxpc2hpbmdSZXNvdXJjZXMuaW5wdXRUb05vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfT3V0cHV0T2ZfVGFzayA9IFB1Ymxpc2hpbmdSZXNvdXJjZXMub3V0cHV0RnJvbU5vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NfTEFZT1VUX0RBVEFfRklMRSA9ICIvc2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMiOwotCi0JLy8gTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JTGlzdCBib29rbWFya3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlckNsYXNzID0gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzOwotCi0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgRU9iamVjdENvbXBhcmF0b3IgbmFtZUNvbXBhcmF0b3IgPSBuZXcgRU9iamVjdENvbXBhcmF0b3IoKTsKLQkKLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSBidWlsZGVyIEh0bWxCdWlsZGVyCi0JICogQHBhcmFtIG9wdGlvbnMgUHVibGlzaE9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblZpZXdCdWlsZGVyKElTaXRlR2VuZXJhdG9yIHNpdGVHZW5lcmF0b3IpIHsKLQkJc3VwZXIoc2l0ZUdlbmVyYXRvcik7Ci0JfQotCi0KLQkvKioKLQkgKiBidWlsZCB0aGUgdmlld3MgZGVmaW5lZCBpbiB0aGUgY29uZmlndXJhdGlvbiBhbmQgcHVibGlzaCB0aGUgcmVsYXRlZCBjb250ZW50cwotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIEJvb2ttYXJrcyBmb3IgdGhlIHZpZXdzCi0JICovCi0JcHVibGljIExpc3QgYnVpbGRWaWV3cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JewotCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQnVpbGRpbmcgdmlld3MuLi4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChjb25maWcgIT0gbnVsbCkKLQkJewotCQkJLy8gZmlyc3Qgb2YgYWxsLCB3ZSBuZWVkIHRvIGxvYWQgdGhlIGxpYnJheSwKLQkJCS8vIG90aGVyd2lzZSwgc29tZSByZWxhdGlvbnNoaXBzIGFuZCBvcHBvc2l0ZSBmZWF0dXJlcyBhcmUgbm90Ci0JCQkvLyBlc3RhYmxpc2hlZAotCQkJbW9uaXRvci5zdWJUYXNrKFB1Ymxpc2hpbmdSZXNvdXJjZXMubG9hZExpYnJhcnlUYXNrX25hbWUpOyAKLQkJCUxpYnJhcnlVdGlsLmxvYWRBbGwoKE1ldGhvZExpYnJhcnkpY29uZmlnLmVDb250YWluZXIoKSk7Ci0JCQkKLQkJCS8vIGNyZWF0ZSBhIGZpbHRlciB0aGF0IGRvZXMgbm90IGRpc2NhcmQgdGhlIGNvbnRyaWJ1dG9ycy4gCi0JCQkvLyBzbyB3ZSBnZXQgdGhlIGNvbnRyaWJ1dG9ycyBpbiB0byBzaG93IGluIHRoZSBuYXZpZ2F0aW9uIHRyZWUKLQkJICAgIElGaWx0ZXIgY29uZmlnRmlsdGVyID0gbmV3IENvbmZpZ3VyYXRpb25GaWx0ZXIoY29uZmlnLCBudWxsLCBmYWxzZSk7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldENvbmZpZ3VyYXRpb25WaWV3X0FkYXB0ZXJGYWN0b3J5KGNvbmZpZ0ZpbHRlcik7Ci0KLQkJCWlmICggb3B0aW9ucyAhPSBudWxsICYmIG9wdGlvbnMuaXNQdWJsaXNoUHJvY2VzcygpICkKLQkJCXsKLQkJCQltYWtlUHJvY2Vzc0Nsb3N1cmUoKTsKLQkJCX0gCi0KLQkJCS8vIHB1Ymxpc2ggYWxsIHRoZSB2aWV3cyBpbiB0aGUgY29uZmlndXJhdGlvbgotCQkJTGlzdCB2aWV3cyA9IExpYnJhcnlVdGlsLmdldFZhbGlkVmlld3MoY29uZmlnKTsKLQkJCWZvciAoIEl0ZXJhdG9yIGl0ID0gdmlld3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApCi0JCQl7Ci0JCQkJaWYgKCBtb25pdG9yLmlzQ2FuY2VsZWQoKSApCi0JCQkJewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJCi0JCQkJQ29udGVudENhdGVnb3J5IHYgPSAoQ29udGVudENhdGVnb3J5KWl0Lm5leHQoKTsKLQkJCQlpZiAoICFDb25maWd1cmF0aW9uSGVscGVyLmNhblNob3codiwgY29uZmlnKSApCi0JCQkJewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJT2JqZWN0IGVsZW1lbnQgPSBMaWJyYXJ5VXRpbC51bndyYXAodik7Ci0JCQkJQm9va21hcmsgYiA9IGNyZWF0ZUJvb2ttYXJrKHRoaXMubW9uaXRvciwgZWxlbWVudCk7Ci0KLQkJCQlpZiAoIHYgPT0gY29uZmlnLmdldERlZmF1bHRWaWV3KCkgKQotCQkJCXsKLQkJCQkJc3VwZXIuZGVmYXVsdFZpZXcgPSBiOwotCQkJCX0KLQotCQkJCS8vIGl0ZXJhdGUgdGhydSBjb25maWd1cmF0aW9uIHRvIGJ1aWxkIHRoZSB2aWV3Ci0JCQkJaXRlcmF0ZSh2LCBiKTsKLQkJCQlpZiAoIGIuZ2V0Q2hpbGRDb3VudCgpID4gMCApCi0JCQkJewotCQkJCQlib29rbWFya3MuYWRkKGIpOwkJCQkJCi0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoIG1vbml0b3IuaXNDYW5jZWxlZCgpICkKLQkJCXsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQkJCQotCi0KLQkJcHVibGlzaFJlZmVyZW5jZUVsZW1lbnRzKCk7Ci0JCQotLy8JCWNvcHlJY29uc0Zvck5vbkFwcGxldCgpOwotCQkKLQkJaWYgKCBtb25pdG9yLmlzQ2FuY2VsZWQoKSApCi0JCXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQkvLyBzYXZlIHB1Ymxpc2hlZCBlbGVtZW50IHVybHMKLQkJc2F2ZUVsZW1lbnRVcmxzKCk7Ci0JCQotCQlyZXR1cm4gYm9va21hcmtzOwotCX0JCi0JCi0JLyoqCi0JICogVGhlIHByb2Nlc3MgZWxlbWVudCBjbG9zdXJlIGlzIGdlbmVyYXRlZCBhcyBmb2xsb3dzOgotCSAqIAotCSAqIDEuIHB1Ymxpc2ggdGhlIHNlbGVjdGVkIHByb2Nlc3NzZXMsIHdoaWNoIGJyaW5ncyBpbiBhbGwgdGhlIHJlbGF0ZWQgcHJvY2VzcyBlbGVtZW50cwotCSAqIDIuIHB1Ymxpc2ggYWxsIHRoZSByZWZlcmVuY2VkIHByb2Nlc3MgZWxlbWVudHMgZnJvbSBzdGVwIDEsIHRoaXMgYnJpbmdzIGluIGFsbCB0aGUgZGlyZWN0bHkgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnRzLgotCSAqICAgIG1ha2UgYSBmaXJzdCBsZXZlbCBjbG9zdXJlIHRvIGluY2x1ZGUgdGhlIHB1Ymxpc2hlZCBlbGVtZW50cyBhbmQgdGhlIHJlZmVyZW5jZWQgZWxlbWVudHMuIAotCSAqICAgIEFueSBkaXJlY3QgcmVmZXJlbmNlcyB0byBhbnkgdHlwZSBvZiBndWlkYW5jZXMgYXJlIGFsc28gaW4gdGhpcyBjbG9zdXJlLgotCSAqIDMuIHB1Ymxpc2ggYWxsIHRoZSByZWZlcmVuZWQgbm9uLUNvbnRlbnRDYXRlZ29yeSBjb250ZW50IGVsZW1lbnRzIGZyb20gc3RlcCAyLiBiYXNlZCBvbiB0aGUgZmlyc3QgbGV2ZWwgY2xvc3VyZS4gCi0JICogVGhlIHB1cnBvc2Ugb2YgdGhlIGZpcnN0IGxldmVsIGNsb3N1cmUgaXMgdG8gYWxsb3cgYnJpbmcgaW4gZ3VpZGFuY2VzIHdpdGggdmFsaWQgZWxlbWVudCBsaW5rIAotCSAqIGFuZCBhbnkgb3RoZXIgcmVmZXJlbmNlcyBzdWNoIGFzIGEgVGFzayBvciBSb2xlLCBiZWluZyBsaW5rZWQgd2l0aCBhIG1pc3NpbmcgZWxlbWVudCBsaW5rLgotCSAqICBUaGlzIGFnYWluIGJyaW5ncyBpbiBhbGwgdGhlIGRpcmVjdCByZWZlcmVuY2VzCi0JICogNC4gTWFrZSB0aGUgZmluYWwgY2xvc3VyZSBieSBpbmNsdWRpbmcgdGhlIGZvbGxvd2luZyBlbGVtZW50czoKLQkgKiAgICAgYS4gYWxsIHB1Ymxpc2hlZCBlbGVtZW50cyBmcm9tIHN0ZXAgMSwyLDMuIAotCSAqICAgICBiLiBhbGwgcmVmZXJlbmNlZCBHdWlkYW5jZXMgZnJvbSBzdGVwIDMKLQkgKiAgICAgYy4gYWxsIEd1aWRhbmNlcyBvZiB0eXBlIFByYWN0aWNlLCBSb2FkTWFwLCBTdXBvcnRpbmcgTWF0ZXJpYWwsIGFuZCBUZXJtIERlZmluaXRpb24sIGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogICAgIGQuIGFsbCBDb250ZW50IENhdGVnb3JpZXMgdGhhdCBjb250YWlucyBhdCBsZWFzdCBvbmUgZWxlbWVudCBvZiB0eXBlIGEsIGIsIG9yIGMuIGFuZCB0aGVpciBwYXJlbnQgY2F0ZWdvcmllcwotCSAqCi0JICogVGhlIHNlbGVjdGVkIHZpZXcgaXMgcHVibGlzaGVkIGJhc2VkIG9uIHRoZSBlbGVtZW50IGNsb3N1cmUgZGVmaW5lZCBhYm92ZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbWFrZVByb2Nlc3NDbG9zdXJlKCkgewotCQltb25pdG9yLnN1YlRhc2soUHVibGlzaGluZ1Jlc291cmNlcy5idWlsZGluZ1Byb2Nlc3NDbG9zdXJlVGFza19uYW1lKTsgCi0KLQkJLy8gcHVibGlzaCB0aGUgc2VsZWN0ZWQgcHJvY2Vzc2VzCi0JCS8vIG5lZWQgdG8gYnVpbGQgYSBjbG9zdXJlIG9mIGFsbCB0aGUgZWxlbWVudHMgaW52b2x2ZWQgaW4gdGhlCi0JCS8vIHByb2Nlc3NlcwotCQlMaXN0IHByb2Nlc3NlcyA9IG9wdGlvbnMuZ2V0RGVsaXZlclByb2Nlc3NMaXN0KCk7Ci0JCWlmICggcHJvY2Vzc2VzICE9IG51bGwgJiYgcHJvY2Vzc2VzLnNpemUoKSA+IDAgKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvY2Vzc2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJbWFrZVByb2Nlc3NDbG9zdXJlKCAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKWl0Lm5leHQoKSk7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIG1ha2UgdGhlIGZpcnN0IGxldmVsIGNsb3N1cmUgdG8gaW5jbHVkZSBhbGwgdGhlIHByb2Nlc3MgZWxlbWVudHMgYW5kIGl0J3MgcmVmZXJlbmNlZCBlbGVtZW50cwotCQkvLyBhbnkgdGhpbmcgZXhjZXB0IEd1aWRhbmNlcyBhbmQgQ29udGVudENhdGVnb3JpZXMgb3V0c2lkZSB0aGUgY2xvc3VyZSBpcyBmaWx0ZXJlZCAKLQkJZ2V0VmFsaWRhdG9yKCkuYWRkQ2xvc3VyZUVsZW1lbnRzKGdldFZhbGlkYXRvcigpLmdldFB1Ymxpc2hlZEVsZW1lbnRzKCkpOwotCQlnZXRWYWxpZGF0b3IoKS5hZGRDbG9zdXJlRWxlbWVudHMoZ2V0VmFsaWRhdG9yKCkuZ2V0UmVmZXJlbmNlZEVsZW1lbnRzKCkpOwotCi0JCS8vIG5vdyBwdWJsaXNoIGFsbCByZWZlcmVuY2VkIGVsZW1lbnRzLCBhbnkgZGlyZWN0IHJlZmVyZW5jZXMgaW4gdGhlIHByb2Nlc3MgZWxlbWVudHMgYXJlIAotCQkvLyBwYXJ0IG9mIHRoZSBjbG9zdXJlCi0JCS8vIGRvbid0IHB1Ymxpc2ggY29udGVudCBjYXRlZ29yaWVzIGZvciBub3cgc2luY2UgdGhleSBtaWdodCBiZSBlbXB0eSBhbmQgZGlzY2FyZGVkIGxhdGVyIAotCQlMaXN0IHJlZnMgPSBuZXcgQXJyYXlMaXN0KGdldFZhbGlkYXRvcigpLmdldFJlZmVyZW5jZWRFbGVtZW50cygpKTsJCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVmcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotCQkJaWYgKCAhKGUgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpICkgewotCQkJCXN1cGVyLnB1Ymxpc2gobW9uaXRvciwgZSk7Ci0JCQkJCi0JCQkJLy8gY29sbGVjdCBwcm9jZXNzIHNwZWNpZmljIGxheW91dCBpbmZvIHdpdGggc3VwcHJlc3Npb24gc3RhdHVzCi0JCQkJLy8gdGhpcyB3aWxsIGluY2xkdWUgdGhlIGRpYWdyYW1zIGFuZCB0aGUgc3VwcmVzc2lvbiBzdGF0ZXMgb2YKLQkJCQkvLyBlYWNoIGl0ZW0gdW5kZXIgdGhlIGN1cnJlbnQgcHJvY2VlCi0JCQkJaWYgKCBMaWJyYXJ5VXRpbC5pc1Byb2Nlc3MoZSkpIHsKLQkJCQkJcHVibGlzaFByb2Nlc3NMYXlvdXQoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgZSk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJCi0JCQotCQkvLyBub3csIGFueSByZWZlcmVuY2VkIGd1aWRhbmNlIHNob3VsZCBiZSBpbiB0aGUgY2xvc3VyZSwgCi0JCS8vIHNvIGluY2x1ZGUgdGhlbSBhbmQgbWFrZSB0aGUgZmluYWwgY2xvc3VyZQotCQlyZWZzLmNsZWFyKCk7CQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0VmFsaWRhdG9yKCkuZ2V0UmVmZXJlbmNlZEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0Lm5leHQoKTsKLQkJCWlmICggZSBpbnN0YW5jZW9mIEd1aWRhbmNlICkgewotCQkJCXJlZnMuYWRkKGUpOwkJCQkKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCByZWZzLnNpemUoKSA+IDAgKSB7Ci0JCQlnZXRWYWxpZGF0b3IoKS5hZGRDbG9zdXJlRWxlbWVudHMocmVmcyk7Ci0JCX0KLQkJCi0JCS8vIG5vdyBhbGwgdGhlIHB1Ymxpc2hlZCBlbGVtZW50cyBhcmUgdGhlIGVsZW1lbnQgY2xvc3VyZSwgbWFrZSB0aGUgZmluYWwgY2xvc3VyZQotCQlnZXRWYWxpZGF0b3IoKS5tYWtlRWxlbWVudENsb3N1cmUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG1ha2VQcm9jZXNzQ2xvc3VyZShvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvYykgewotCQotCQlpZiAoIHByb2MgPT0gbnVsbCApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKCBDb25maWd1cmF0aW9uSGVscGVyLmNhblNob3cocHJvYywgY29uZmlnKSApCi0JCXsKLQkJCUFjdGl2aXR5TGF5b3V0IGwgPSBuZXcgQWN0aXZpdHlMYXlvdXQoKTsKLQkJCWwuaW5pdChnZXRMYXlvdXRNZ3IoKSwgcHJvYywgcHJvYywgbnVsbCk7Ci0JCQlsLmZpbmRBbGxMaW5rZWRFbGVtZW50cygpOwotCQl9Ci0JCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNFeHRlbmRlcihwcm9jKSApIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBiYXNlUHJvYyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpCi0JCQkJcHJvYy5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoIENvbmZpZ3VyYXRpb25IZWxwZXIuaW5Db25maWcoYmFzZVByb2MsIGNvbmZpZykgKSB7Ci0JCQkJbWFrZVByb2Nlc3NDbG9zdXJlKGJhc2VQcm9jKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBwdWJsaXNoUmVmZXJlbmNlRWxlbWVudHMoKSB7Ci0JCS8vIG5vdyBwcm9jZXNzIHRoZSByZWZlcmVuY2VkIGVsZW1lbnRzIGFuZCBwdWJsaXNoIHRoZSBjb250ZW50cwotCQl3aGlsZSAoZ2V0VmFsaWRhdG9yKCkuZ2V0UmVmZXJlbmNlZEVsZW1lbnRzKCkuc2l6ZSgpID4gMCkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGdldFZhbGlkYXRvcigpCi0JCQkJCS5nZXRSZWZlcmVuY2VkRWxlbWVudHMoKS5yZW1vdmUoMCk7Ci0KLQkJCXRyeSB7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQkvLyByZWZlcmVuY2VzIHRvIG1ldGhvZCBwbHVnaW5zIGFuZCBtZXRob2QgcGFja2FnZXMgY2FuIGJlCi0JCQkJLy8gaWdub3JlZAotCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGUgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkJCQkJCi0JCQkJc3VwZXIucHVibGlzaChtb25pdG9yLCBlKTsKLQotCQkJCS8vIGNvbGxlY3QgcHJvY2VzcyBzcGVjaWZpYyBsYXlvdXQgaW5mbyB3aXRoIHN1cHByZXNzaW9uIHN0YXR1cwotCQkJCS8vIHRoaXMgd2lsbCBpbmNsZHVlIHRoZSBkaWFncmFtcyBhbmQgdGhlIHN1cHJlc3Npb24gc3RhdGVzIG9mCi0JCQkJLy8gZWFjaCBpdGVtIHVuZGVyIHRoZSBjdXJyZW50IHByb2NlZQotCQkJCWlmICggTGlicmFyeVV0aWwuaXNQcm9jZXNzKGUpKSB7Ci0JCQkJCXB1Ymxpc2hQcm9jZXNzTGF5b3V0KChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIGUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCWdldFZhbGlkYXRvcigpLmxvZ0Vycm9yKGUsICJFcnJvciBwdWJsaXNoaW5nIGVsZW1lbnQiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwdWJsaXNoUHJvY2Vzc0xheW91dChmaW5hbCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgZSkgewotCi0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCUFjdGl2aXR5TGF5b3V0IGxheW91dCA9IG5ldyBBY3Rpdml0eUxheW91dCgpOwotCQkJCQlsYXlvdXQuaW5pdChnZXRMYXlvdXRNZ3IoKSwgKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgZSwgbnVsbCwKLQkJCQkJCQludWxsKTsKLQkJCQkJUHJvY2Vzc0xheW91dERhdGEgcGQgPSBuZXcgUHJvY2Vzc0xheW91dERhdGEoZS5nZXRHdWlkKCkpOwotCQkJCQlsYXlvdXQubG9hZExheW91dERhdGEocGQpOwotCQkJCQlwcmludExheW91dFNjcmlwdChwZCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCWdldFZhbGlkYXRvcigpCi0JCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJZSwKLQkJCQkJCQkJCSJFcnJvciBwdWJsaXNoaW5nIHByb2Nlc3Mgc3BlY2lmaWMgbGF5b3V0IGRhdGEiLCBlMSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCX0KLQkJfTsKLQotCQlUaW1lciB0aW1lciA9IG5ldyBUaW1lcigpOwotCQl0cnkgewotCi0JCQkvLyBydW4gdGhlIHB1Ymxpc2hpbmcgYW5kIGNoZWNrIHRoZSB0aW1lLCBpZiB0aW1lb3V0LCB0ZXJtaW5hdGUgaXQKLQkJCVRocmVhZCB0ID0gbmV3IFRocmVhZChydW5uYWJsZSk7Ci0JCQl0LnN0YXJ0KCk7Ci0JCQl0LmpvaW4odGltZW91dF9taWxsaXMpOwotCQkJaWYgKHQuaXNBbGl2ZSgpKSB7Ci0JCQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZCB0byBkaWUgYW5kIGxvZyBhbiBlcnJvcgotCQkJCXRpbWVyLnN0b3AoKTsKLQkJCQlnZXRWYWxpZGF0b3IoKQotCQkJCQkJLmxvZ0luZm8oCi0JCQkJCQkJCWUsCi0JCQkJCQkJCSJwdWJsaXNoaW5nIHByb2Nlc3Mgc3BlY2lmaWMgbGF5b3V0IGRhdGEgdGFrZXMgIiArIHRpbWVyLmdldFRpbWUoKSArICIgbWluaSBzZWNvbmRzIGFscmVhZHkgYW5kIGlzIHN0aWxsIG5vdCBkb25lIHlldCAuLi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJdGltZXIuc3RhcnQoKTsKLQkJCQl0LmpvaW4oKTsKLQkJCX0KLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsKLQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJdGltZXIuc3RvcCgpOwotCQkJZ2V0VmFsaWRhdG9yKCkKLQkJCQkJLmxvZ0luZm8oCi0JCQkJCQkJZSwKLQkJCQkJCQl0aW1lci5nZXRUb3RhbFRpbWUoKQotCQkJCQkJCQkJKyAiIG1pbmkgc2Vjb25kcyBwdWJsaXNoaW5nIHByb2Nlc3Mgc3BlY2lmaWMgbGF5b3V0IGRhdGEiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByaW50TGF5b3V0U2NyaXB0KFByb2Nlc3NMYXlvdXREYXRhIGRhdGEpIHsKLQkJRmlsZSBvdXRwdXRGaWxlID0gbmV3IEZpbGUoZ2V0TGF5b3V0TWdyKCkuZ2V0UHVibGlzaERpcigpLAotCQkJCVBST0NFU1NfTEFZT1VUX0RBVEFfRklMRSk7IC8vJE5PTi1OTFMtMSQKLQkJUHJpbnRXcml0ZXIgcHcgPSBudWxsOwotCQl0cnkgewotCQkJLy8gY3JlYXRlIGEgc3RyZWFtIHdpdGggYXBwZW5kIGVuYWJsZWQKLQkJCUZpbGVPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlLCB0cnVlKTsKLQkJCQotCQkJLy8gY3JlYXRlIGEgd3JpdGUgd2l0aCB1dGYtOCBlbmNvZGluZwotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3MsICJ1dGYtOCIpOwkvLyROT04tTkxTLTEkCi0JCQkKLQkJCS8vIGNyZWF0ZSBhIHByaW50IHdyaXRlciB3aXRoIGF1dG8gZmx1c2gKLQkJCXB3ID0gbmV3IFByaW50V3JpdGVyKHdyaXRlciwgdHJ1ZSk7Ci0JCQlkYXRhLnByaW50KHB3KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWdldFZhbGlkYXRvcigpCi0JCQkJLmxvZ0Vycm9yKCJ1bmFibGUgdG8gc2F2ZSBwcm9jZXNzIGxheW91dCBkYXRhIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHB3ICE9IG51bGwpIHsKLQkJCQlwdy5mbHVzaCgpOwotCQkJCXB3LmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogSXRlcmF0ZSB0aHJ1IHR1ZWUKLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByaXZhdGUgdm9pZCBpdGVyYXRlKE9iamVjdCBvYmosIEJvb2ttYXJrIHBhcmVudCkgewotCQl0cnkgewotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBHZXQgdGhlIGFkYXB0ZXIgZnJvbSB0aGUgZmFjdG9yeS4KLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB0cmVlSXRlbUNvbnRlbnRQcm92aWRlciA9IG51bGw7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJdHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBvYmo7Ci0JCQl9IGVsc2UgewotCQkJCXRyZWVJdGVtQ29udGVudFByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQl9Ci0KLQkJCS8vIEVpdGhlciBkZWxlZ2F0ZSB0aGUgY2FsbCBvciByZXR1cm4gbm90aGluZy4KLQkJCWlmICh0cmVlSXRlbUNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJQ29sbGVjdGlvbiBpdGVtcyA9IHRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQkvLyBjcmVhdGUgYm9va21hcmsKLQkJCQkJT2JqZWN0IGl0b3JPYmogPSBpdC5uZXh0KCk7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gTGlicmFyeVV0aWwudW53cmFwKGl0b3JPYmopOwotCi0JCQkJCWlmICgoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IG1lID0gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmNhblNob3cobWUsIGNvbmZpZykpIHsKLQkJCQkJCQkJbWUgPSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkJCQkJLmdldENhbGN1bGF0ZWRFbGVtZW50KG1lLAotCQkJCQkJCQkJCQkJZ2V0TGF5b3V0TWdyKCkKLQkJCQkJCQkJCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQkJCQkJaWYgKG1lICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmIChtZSBpbnN0YW5jZW9mIFRvb2wpIHsKLQkJCQkJCQkJCQlidWlsZFRvb2xTdWJUcmVlKChUb29sKSBtZSwgcGFyZW50KTsKLQkJCQkJCQkJCX0gZWxzZSBpZiAobWUgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJCQkJCQkJYnVpbGREaXNjaXBsaW5lU3ViVHJlZSgoRGlzY2lwbGluZSkgbWUsCi0JCQkJCQkJCQkJCQlwYXJlbnQpOwotCQkJCQkJCQkJfQotCi0JCQkJCQkJCQkvLyBlbHNlIGlmIChtZSBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZwotCQkJCQkJCQkJLy8gfHwgbWUgaW5zdGFuY2VvZiBEb21haW4gfHwgbWUgaW5zdGFuY2VvZgotCQkJCQkJCQkJLy8gV29ya1Byb2R1Y3RUeXBlCi0JCQkJCQkJCQkvLyB8fCBtZSBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZyB8fCBtZQotCQkJCQkJCQkJLy8gaW5zdGFuY2VvZiBSb2xlU2V0ICkKLQkJCQkJCQkJCWVsc2UgaWYgKG1lIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQkJCQkJCQkJCi0JCQkJCQkJCQkJQ29udGVudENhdGVnb3J5IGNjID0gKENvbnRlbnRDYXRlZ29yeSltZTsKLQkJCQkJCQkJCQkKLQkJCQkJCQkJCQkvLyBpZiB0aGUgY29udGVudCBjYXRlZ29yeSBpcyBlbXB0eSwKLQkJCQkJCQkJCQkvLyBkb24ndCBhZGQgdG8gdGhlIHBhcmVudAotCQkJCQkJCQkJCUJvb2ttYXJrIGIgPSBjcmVhdGVCb29rbWFyaygKLQkJCQkJCQkJCQkJCXRoaXMubW9uaXRvciwgY2MpOwotCQkJCQkJCQkJCWl0ZXJhdGUoaXRvck9iaiwgYik7Ci0JCQkJCQkJCQkJaWYgKCBvcHRpb25zLmluY2x1ZGVFbXB0eUNhdGVnb3JpZXMgfHwgCi0JCQkJCQkJCQkJCQliLmdldENoaWxkQ291bnQoKSA+IDApIHsKLQkJCQkJCQkJCQkJcGFyZW50LmFkZENoaWxkKGIpOwotCQkJCQkJCQkJCQlkaXNjYXJkRW1wdHlDYXRlZ29yeShjYywgZmFsc2UpOwotCQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJCWRpc2NhcmRFbXB0eUNhdGVnb3J5KGNjLCB0cnVlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCUJvb2ttYXJrIGIgPSBjcmVhdGVCb29rbWFyayhtZSwgcGFyZW50KTsKLQkJCQkJCQkJCQlpZiAoIWJ1aWxkU3ViVHJlZShpdG9yT2JqLCBtZSwgYikpIHsKLQkJCQkJCQkJCQkJaXRlcmF0ZShpdG9yT2JqLCBiKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCVN0cmluZyBtZXNzYWdlID0gIkVycm9yIGJ1aWxkaW5nIG5hdmlnYXRpb24gdHJlZSBmb3IgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWdldEh0bWxCdWlsZGVyKCkuZ2V0VmFsaWRhdG9yKCkubG9nRXJyb3IobWVzc2FnZSwgZSk7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWl0ZXJhdGUoaXRvck9iaiwgcGFyZW50KTsKLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSAiRXJyb3IgYnVpbGRpbmcgbmF2aWdhdGlvbiB0cmVlIjsgLy8kTk9OLU5MUy0xJAotCQkJZ2V0SHRtbEJ1aWxkZXIoKS5nZXRWYWxpZGF0b3IoKS5sb2dFcnJvcihtZXNzYWdlLCBlKTsKLQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBhIGJvb2ttYXJrIHVuZGVyIHRoZSBzcGVjaWZpZWQgcGFyZW50LiBJZiBubyBwYXJlbnQgaXMgc3BlY2lmaWVkLAotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBCb29rbWFyayBjcmVhdGVCb29rbWFyayhPYmplY3QgZWxlbWVudCwgQm9va21hcmsgcGFyZW50KSB7Ci0JCUJvb2ttYXJrIGIgPSBjcmVhdGVCb29rbWFyayh0aGlzLm1vbml0b3IsIGVsZW1lbnQpOwotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCWJvb2ttYXJrcy5hZGQoYik7Ci0JCX0gZWxzZSB7Ci0JCQlwYXJlbnQuYWRkQ2hpbGQoYik7Ci0JCX0KLQotCQlyZXR1cm4gYjsKLQl9Ci0KLQkvKioKLQkgKiBidWlsZCB0aGUgc3ViIHRyZWUgZm9yIHRoZSBnaXZlbiBlbGVtZW50LiByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcwotCSAqIGhhbmRsZWQsIGZhbHNlIG90aGVyd2lzZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGJtCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkU3ViVHJlZShPYmplY3Qgb2JqLCBNZXRob2RFbGVtZW50IGVsZW1lbnQsIEJvb2ttYXJrIGJtKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFzaykgewotCQkJYnVpbGRUYXNrU3ViVHJlZSgoVGFzaykgZWxlbWVudCwgYm0pOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQlidWlsZFJvbGVTdWJUcmVlKChSb2xlKSBlbGVtZW50LCBibSk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQlidWlsZFdvcmtQcm9kdWN0U3ViVHJlZSgoV29ya1Byb2R1Y3QpIGVsZW1lbnQsIGJtKTsKLQkJfSBlbHNlIGlmICggTGlicmFyeVV0aWwuaXNQcm9jZXNzKGVsZW1lbnQpKSB7Ci0JCQlidWlsZFByb2Nlc3NTdWJUcmVlKG9iaiwgKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgZWxlbWVudCwgYm0pOwotCQl9IGVsc2UgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJOb3QgaGFuZGxlZDogIiArIGVsZW1lbnQpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgYnVpbGRJdGVtcyhMaXN0IGVsZW1lbnRzLCBCb29rbWFyayBibSkgewotCQlidWlsZEl0ZW1zKGVsZW1lbnRzLCBibSwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEl0ZW1zKExpc3QgZWxlbWVudHMsIEJvb2ttYXJrIGJtLCBib29sZWFuIGJ1aWxkU3ViVHJlZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAgKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotCQkJCi0JCQkvLyBmaWx0ZXIgYXdheSB0aGUgY29udGFpbm1lbnQgY2hpbGQtZWxlbWVudCBpZiBhbnkgb2YgdGhlIHBhcmVudChzKSBhcmUgaW4gdGhlIGxpc3QKLQkJCS8vIDAwMzg0NjE5IC0gUHVibGlzaGVkIHNpdGU6IERpc3BsYXkgb2YgV1BzIHVuZGVyIHJlc3BvbnNpYmxlIHJvbGUKLQkJCS8vIGlmIHRoZSBjb250YWluZXIgb2YgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIGxpc3QsIGlnbm9yZSBpdAotCQkJaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuaXNDb250YWlubWVudEVsZW1lbnQoZWxlbWVudCkgJiYgCi0JCQkJCUNvbmZpZ3VyYXRpb25IZWxwZXIuaXNDb250YWluZXJJbkxpc3QoZWxlbWVudCwgZWxlbWVudHMsIGNvbmZpZykpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJYnVpbGRJdGVtKGVsZW1lbnQsIGJtLCBidWlsZFN1YlRyZWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBCb29rbWFyayBidWlsZEl0ZW0oTWV0aG9kRWxlbWVudCBlbGVtZW50LCBCb29rbWFyayBwYXJlbnQsCi0JCQlib29sZWFuIGJ1aWxkU3ViVHJlZSkgewotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQm9va21hcmsgYiA9IG51bGw7Ci0KLQkJLy8gbWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIHNob3dhYmxlCi0JCU1ldGhvZEVsZW1lbnQgZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoZWxlbWVudCwKLQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCWlmIChjYW5TaG93KGUpKSB7Ci0JCQliID0gY3JlYXRlQm9va21hcmsodGhpcy5tb25pdG9yLCBlKTsKLQkJCWlmIChiID09IG51bGwpIHsKLQkJCQlyZXR1cm4gYjsKLQkJCX0KLQotCQkJcGFyZW50LmFkZENoaWxkKGIpOwotCi0JCQlpZiAoYnVpbGRTdWJUcmVlKSB7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQlidWlsZENvbnRhaW5lZEFydGlmYWN0c1N1YlRyZWUoKEFydGlmYWN0KSBlLCBiLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYjsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgdGhlIGZvbGRlciBib29rbWFyayBhbmQgaXQncyBjaGlsZHJlbi4gZ2VuZXJhdGUgdGhlIGZvbGRlciBzdW1tYXJ5Ci0JICogcGFnZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGJtCi0JICogQHBhcmFtIG5vZGVOYW1lCi0JICogQHBhcmFtIGl0ZW1zCi0JICovCi0KLQlwcml2YXRlIEJvb2ttYXJrIGNyZWF0ZUZvbGRlckJvb2ttYXJrKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgQm9va21hcmsgYm0sCi0JCQlTdHJpbmcgbm9kZU5hbWUsIExpc3QgaXRlbXMsIGJvb2xlYW4gY3JlYXRlQ2hpbGRyZW4pIHsKLQkJQm9va21hcmsgYiA9IG51bGw7Ci0JCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlJRWxlbWVudExheW91dCBsID0gbmV3IFN1bW1hcnlQYWdlTGF5b3V0KAotCQkJCQlnZXRIdG1sQnVpbGRlcigpLmdldExheW91dE1hbmFnZXIoKSwgZWxlbWVudCwgbm9kZU5hbWUsIGl0ZW1zKTsKLQkJCVN0cmluZyB1cmwgPSBsLmdldFVybCgpOwotCQkJZ2V0SHRtbEJ1aWxkZXIoKS5nZW5lcmF0ZUh0bWwobCk7Ci0JCQliID0gY3JlYXRlQm9va21hcmsobm9kZU5hbWUsIEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSwgdXJsLCBJQ09OX0ZPTERFUiwKLQkJCQkJSUNPTl9GT0xERVIsIG51bGwpOwotCQkJYm0uYWRkQ2hpbGQoYik7Ci0JCQlpZiAoY3JlYXRlQ2hpbGRyZW4pIHsKLQkJCQlidWlsZEl0ZW1zKGl0ZW1zLCBiKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBiOwotCX0KLQotCXByaXZhdGUgQm9va21hcmsgY3JlYXRlRm9sZGVyQm9va21hcmsoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBCb29rbWFyayBibSwKLQkJCVN0cmluZyBwcmVmaXhOYW1lLCBTdHJpbmcgbm9kZU5hbWUsIExpc3QgaXRlbXMsCi0JCQlib29sZWFuIGNyZWF0ZUNoaWxkcmVuKSB7Ci0JCUJvb2ttYXJrIGIgPSBudWxsOwotCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJSUVsZW1lbnRMYXlvdXQgbCA9IG5ldyBTdW1tYXJ5UGFnZUxheW91dCgKLQkJCQkJZ2V0SHRtbEJ1aWxkZXIoKS5nZXRMYXlvdXRNYW5hZ2VyKCksIGVsZW1lbnQsIHByZWZpeE5hbWUsIG5vZGVOYW1lLAotCQkJCQlpdGVtcyk7Ci0JCQlTdHJpbmcgdXJsID0gbC5nZXRVcmwoKTsKLQkJCWdldEh0bWxCdWlsZGVyKCkuZ2VuZXJhdGVIdG1sKGwpOwotCQkJYiA9IGNyZWF0ZUJvb2ttYXJrKG5vZGVOYW1lLCBFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCksIHVybCwgSUNPTl9GT0xERVIsCi0JCQkJCUlDT05fRk9MREVSLCBudWxsKTsKLQkJCWJtLmFkZENoaWxkKGIpOwotCQkJaWYgKGNyZWF0ZUNoaWxkcmVuKSB7Ci0JCQkJYnVpbGRJdGVtcyhpdGVtcywgYik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYjsKLQl9Ci0KLQlwcml2YXRlIEJvb2ttYXJrIGJ1aWxkRGlzY2lwbGluZVN1YlRyZWUoRGlzY2lwbGluZSBlbGVtZW50LCBCb29rbWFyayBwYXJlbnQpIHsKLQkJU3RyaW5nIHVybCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUJvb2ttYXJrIGI7Ci0KLQkJLy8gbmVlZCB0byBjYWxjdWxhdGUgdGhlIHJlYWxpemVkIHZhbHVlIG9mIHRoZSBmZWF0dXJlCi0JCUxpc3QgaXRlbXNfd29ya2Zsb3cgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvd3MoKSk7Ci0KLQkJLy8gVGFza3MgaW4gcHVibGlzaGVkIHNpdGUgdW5kZXIgRGlzY2lwbGluZXMgYXJlIGluCi0JCS8vIHJhbmRvbSBvcmRlcgotCQkvLyB1c2UgdGhlIGFkYXB0b3IgZmFjdG9yeSB0byBnZXQgdGhlIGNoaWxkcmVucwotCQkvLyBMaXN0IGl0ZW1zX3Rhc2sgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LAotCQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1Rhc2tzKCksIGNvbmZpZyk7Ci0JCUxpc3QgaXRlbXNfdGFzayA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBpdGVtX3N1YkRpc2NpcGxpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB0cmVlSXRlbUNvbnRlbnRQcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmICh0cmVlSXRlbUNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGl0ZW1zID0gdHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQkvLyBjcmVhdGUgYm9va21hcmsKLQkJCQlPYmplY3QgaXRvck9iaiA9IGl0Lm5leHQoKTsKLQkJCQlPYmplY3QgZSA9IExpYnJhcnlVdGlsLnVud3JhcChpdG9yT2JqKTsKLQkJCQlpZiAoKGUgaW5zdGFuY2VvZiBUYXNrKSkgewotCQkJCQlNZXRob2RFbGVtZW50IHQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KAotCQkJCQkJCShNZXRob2RFbGVtZW50KSBlLCBnZXRMYXlvdXRNZ3IoKQotCQkJCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQkJaWYgKCB0ICE9IG51bGwgKSB7Ci0JCQkJCQlpdGVtc190YXNrLmFkZCh0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBEaXNjaXBsaW5lICkgewotCQkJCQlNZXRob2RFbGVtZW50IGQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KAotCQkJCQkJCShNZXRob2RFbGVtZW50KSBlLCBnZXRMYXlvdXRNZ3IoKQotCQkJCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQkJaWYgKCBkICE9IG51bGwgKSB7Ci0JCQkJCQlpdGVtX3N1YkRpc2NpcGxpZXMuYWRkKGQpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBhbGwgZ3VpZGFuY2VzCi0JCUxpc3QgaXRlbXNfZ3VpZGFuY2UgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWl0ZW1zX2d1aWRhbmNlLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCkpKTsKLQkJaXRlbXNfZ3VpZGFuY2UuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCkpKTsKLQkJaXRlbXNfZ3VpZGFuY2UuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpKSk7Ci0JCWl0ZW1zX2d1aWRhbmNlLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSkpOwotCQlpdGVtc19ndWlkYW5jZS5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSkpOwotCQlpdGVtc19ndWlkYW5jZS5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSkpOwotCi0JCWlmICghb3B0aW9ucy5pbmNsdWRlRW1wdHlDYXRlZ29yaWVzICYmIAotCQkJCWl0ZW1zX3dvcmtmbG93LnNpemUoKSArIGl0ZW1zX3Rhc2suc2l6ZSgpICsgaXRlbXNfZ3VpZGFuY2Uuc2l6ZSgpIAotCQkJCSsgaXRlbV9zdWJEaXNjaXBsaWVzLnNpemUoKSA9PSAwKSB7Ci0JCQkvLyBkbyBub3RoaW5nLCBkb24ndCBzaG93IHRoZSBmb2xkZXIKLQkJCWRpc2NhcmRFbXB0eUNhdGVnb3J5KGVsZW1lbnQsIHRydWUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gY3JlYXRlIHRoZSBpdGVtIGJvb2ttYXJrCi0JCS8vIGRvbid0IHNldCB0byB0aGUgcGFyZW50IHlldC4gbWFrZSBzdXJlIGl0J3Mgbm90IGVtcHR5Ci0JCS8vIG5lZWQgdG8gY2hlY2sgdGhlIHN1Yi1kaXNjaXBsaW5lcwotCQkvLyAxNTA5ODQgLSBQdWJsaXNoaW5nOiBOZXN0ZWQgZGlzY2lwbGluZSBpcyBub3QgZGlzcGxheSBpbiB0aGUgcHVibGlzaCBwYWdlIAotCQkvL0Jvb2ttYXJrIGJtID0gY3JlYXRlQm9va21hcmsoZWxlbWVudCwgcGFyZW50KTsKLQkJQm9va21hcmsgYm0gPSBjcmVhdGVCb29rbWFyayh0aGlzLm1vbml0b3IsIGVsZW1lbnQpOwotCi0JCS8vIHN1Yi1kaXNjaXBsaW5lcyBjb21lIGZpcnN0Ci0JCWlmICggaXRlbV9zdWJEaXNjaXBsaWVzLnNpemUoKSA+IDAgKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbV9zdWJEaXNjaXBsaWVzLml0ZXJhdG9yKCk7ICBpdC5oYXNOZXh0KCk7ICkgewotCQkJCURpc2NpcGxpbmUgZCA9IChEaXNjaXBsaW5lKWl0Lm5leHQoKTsKLQkJCQlidWlsZERpc2NpcGxpbmVTdWJUcmVlKGQsIGJtKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCBvcHRpb25zLmdlbmVyYXRlTGlnaHRXZWlnaHRUcmVlICkgewotCQkJCi0JCQlDb2xsZWN0aW9ucy5zb3J0KGl0ZW1zX3dvcmtmbG93LCBuYW1lQ29tcGFyYXRvcik7Ci0JCQlDb2xsZWN0aW9ucy5zb3J0KGl0ZW1zX3Rhc2ssIG5hbWVDb21wYXJhdG9yKTsKLQkJCUNvbGxlY3Rpb25zLnNvcnQoaXRlbXNfZ3VpZGFuY2UsIG5hbWVDb21wYXJhdG9yKTsKLQkJCQotCQkJYnVpbGRJdGVtcyhpdGVtc193b3JrZmxvdywgYm0pOwotCQkJYnVpbGRJdGVtcyhpdGVtc190YXNrLCBibSk7Ci0JCQlidWlsZEl0ZW1zKGl0ZW1zX2d1aWRhbmNlLCBibSk7CQkJCi0JCX0gZWxzZSB7Ci0JCQlpZiAoaXRlbXNfd29ya2Zsb3cuc2l6ZSgpID4gMCkgewotCQkJCUJvb2ttYXJrIHdmRm9sZGVyID0gY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sCi0JCQkJCQlQUkVGSVhfUmVmZXJlbmNlX1dvcmtmbG93cywgTk9ERV9SZWZlcmVuY2VfV29ya2Zsb3dzLAotCQkJCQkJaXRlbXNfd29ya2Zsb3csIGZhbHNlKTsKLQkKLQkJCQkvLyBDYXBhYmlsaXR5IFBhdHRlcm5zIGluIHRyZWVicm93c2VyIHVuZGVyCi0JCQkJLy8gZGlzY2lwbGluZXMtcmVmZXJlbmNlIHdvcmtmbG93cyBjYW5ub3QgYmUgZXhwYW5kZWQKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXNfd29ya2Zsb3cuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCi0JCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgaXQubmV4dCgpOwotCQkJCQlCb29rbWFyayBibVdvcmtmbG93ID0gYnVpbGRJdGVtKHByb2MsIHdmRm9sZGVyLCBmYWxzZSk7Ci0JCQkJCWJ1aWxkUHJvY2Vzc1N1YlRyZWUocHJvYywgcHJvYywgYm1Xb3JrZmxvdyk7Ci0JCQkJfQotCQkJfQotCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCi0JCQlpZiAoaXRlbXNfdGFzay5zaXplKCkgPiAwKSB7Ci0JCQkJY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sIFBSRUZJWF9UYXNrcywgTk9ERV9UYXNrcywKLQkJCQkJCWl0ZW1zX3Rhc2ssIHRydWUpOwotCQkJfQotCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCi0JCQlpZiAoaXRlbXNfZ3VpZGFuY2Uuc2l6ZSgpID4gMCkgewotCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLCBQUkVGSVhfR3VpZGFuY2VzLCBOT0RFX0d1aWRhbmNlcywKLQkJCQkJCWl0ZW1zX2d1aWRhbmNlLCB0cnVlKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKG9wdGlvbnMuaW5jbHVkZUVtcHR5Q2F0ZWdvcmllcyB8fCBibS5nZXRDaGlsZENvdW50KCkgPiAwKSB7Ci0JCQlwYXJlbnQuYWRkQ2hpbGQoYm0pOwotCQkJZGlzY2FyZEVtcHR5Q2F0ZWdvcnkoZWxlbWVudCwgZmFsc2UpOwotCQl9IGVsc2UgewotCQkJZGlzY2FyZEVtcHR5Q2F0ZWdvcnkoZWxlbWVudCwgdHJ1ZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBibTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRUb29sU3ViVHJlZShUb29sIGVsZW1lbnQsIEJvb2ttYXJrIHBhcmVudCkgewotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3QgaXRlbXMgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VG9vbF9Ub29sTWVudG9ycygpKTsKLQkJaWYgKG9wdGlvbnMuaW5jbHVkZUVtcHR5Q2F0ZWdvcmllcyB8fCBpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlCb29rbWFyayBiID0gY3JlYXRlQm9va21hcmsoZWxlbWVudCwgcGFyZW50KTsKLQkJCWJ1aWxkSXRlbXMoaXRlbXMsIGIpOwotCQkJZGlzY2FyZEVtcHR5Q2F0ZWdvcnkoZWxlbWVudCwgZmFsc2UpOwotCQl9IGVsc2UgewotCQkJZGlzY2FyZEVtcHR5Q2F0ZWdvcnkoZWxlbWVudCwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRUYXNrU3ViVHJlZShUYXNrIGVsZW1lbnQsIEJvb2ttYXJrIGJtKSB7Ci0JCQotCQlTdHJpbmcgdXJsOwotCQlCb29rbWFyayBiOwotCi0JCUxpc3QgYWxsSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQkvLyBwZXJmb3JtaW5nIHJvbGVzCi0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVJvbGUgciA9IChSb2xlKSBjYWxjMDFGZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza19QZXJmb3JtZWRCeSgpKTsKLQkJaWYgKHIgIT0gbnVsbCkgewotCQkJaXRlbXMuYWRkKHIpOwotCQl9Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKSk7Ci0KLQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCWlmICggb3B0aW9ucy5nZW5lcmF0ZUxpZ2h0V2VpZ2h0VHJlZSApIHsKLQkJCQlDb2xsZWN0aW9ucy5zb3J0KGl0ZW1zLCBuYW1lQ29tcGFyYXRvcik7Ci0JCQkJYWxsSXRlbXMuYWRkQWxsKGl0ZW1zKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sIFBSRUZJWF9QZXJmb3JtaW5nX1JvbGVzLAotCQkJCQkJTk9ERV9QZXJmb3JtaW5nX1JvbGVzLCBpdGVtcywgdHJ1ZSk7IAotCQkJfQotCQl9Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoICFvcHRpb25zLmdlbmVyYXRlTGlnaHRXZWlnaHRUcmVlICkgewotCQkJLy8gaW5wdXQgd29yayBwcm9kdWN0cywgbmVlZCBhIHN1bW1hcnkgcGFnZSwKLQkJCWl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpKSk7Ci0JCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSkpOwotCQotCQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQljcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwgUFJFRklYX0lucHV0X1dvcmtfUHJvZHVjdHMsCi0JCQkJCQlOT0RFX0lucHV0X1dvcmtfUHJvZHVjdHMsIGl0ZW1zLCB0cnVlKTsKLQkJCX0KLQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJLy8gb3V0cHV0IHdvcmsgcHJvZHVjdHMsIG5lZWQgYSBzdW1tYXJ5IHBhZ2UsIFRPRE8KLQkJaXRlbXMgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza19PdXRwdXQoKSk7Ci0KLQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCWlmICggb3B0aW9ucy5nZW5lcmF0ZUxpZ2h0V2VpZ2h0VHJlZSApIHsKLQkJCQlDb2xsZWN0aW9ucy5zb3J0KGl0ZW1zLCBuYW1lQ29tcGFyYXRvcik7Ci0JCQkJYWxsSXRlbXMuYWRkQWxsKGl0ZW1zKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sIFBSRUZJWF9PdXRwdXRfV29ya19Qcm9kdWN0cywKLQkJCQkJCU5PREVfT3V0cHV0X1dvcmtfUHJvZHVjdHMsIGl0ZW1zLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gYWxsIGd1aWRhbmNlcwotCQlpdGVtcy5jbGVhcigpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkpKTsKLS8vCQlPYmplY3QgZSA9IGNhbGMwMUZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotLy8JCQkJLmdldFRhc2tfRXN0aW1hdGUoKSk7Ci0vLwkJaWYgKGUgIT0gbnVsbCkgewotLy8JCQlpdGVtcy5hZGQoZSk7Ci0vLwkJfQotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tfVG9vbE1lbnRvcnMoKSkpOwotCi0JCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlpZiAoIG9wdGlvbnMuZ2VuZXJhdGVMaWdodFdlaWdodFRyZWUgKSB7Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChpdGVtcywgbmFtZUNvbXBhcmF0b3IpOwotCQkJCWFsbEl0ZW1zLmFkZEFsbChpdGVtcyk7Ci0JCQl9IGVsc2UgewotCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLCBQUkVGSVhfR3VpZGFuY2VzLCBOT0RFX0d1aWRhbmNlcywKLQkJCQkJCWl0ZW1zLCB0cnVlKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCBvcHRpb25zLmdlbmVyYXRlTGlnaHRXZWlnaHRUcmVlICkgewotCQkJYnVpbGRJdGVtcyhhbGxJdGVtcywgYm0pOwotCQl9IAotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUm9sZVN1YlRyZWUoUm9sZSBlbGVtZW50LCBCb29rbWFyayBibSkgewotCQlTdHJpbmcgdXJsOwotCQlCb29rbWFyayBiOwotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCBhbGxJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCS8vIHRhc2tzLCAvLyBuZWVkIGEgZ2VuZXJhbCBvdmVydmlldyBwYWdlLCBUT0RPCi0JCS8vIExpc3QgaXRlbXMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza3MoZWxlbWVudCk7Ci0JCUxpc3QgaXRlbXMgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwKLQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1ByaW1hcnlfVGFza3MpOwotCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCApIHsKLQkJCWlmICggb3B0aW9ucy5nZW5lcmF0ZUxpZ2h0V2VpZ2h0VHJlZSApIHsKLQkJCQlDb2xsZWN0aW9ucy5zb3J0KGl0ZW1zLCBuYW1lQ29tcGFyYXRvcik7Ci0JCQkJYWxsSXRlbXMuYWRkQWxsKGl0ZW1zKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sIFBSRUZJWF9SZXNwb25zaWJsZUZvcl9UYXNrcywKLQkJCQkJCU5PREVfUmVzcG9uc2libGVGb3JfVGFza3MsIGl0ZW1zLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCAhb3B0aW9ucy5nZW5lcmF0ZUxpZ2h0V2VpZ2h0VHJlZSApIHsKLQkJCS8vIHNlY29uZGFyeSB0YXNrcwotCQkJaXRlbXMgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9TZWNvbmRhcnlfVGFza3MpOwotCQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQljcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwgUFJFRklYX1BhcnRpY2lwYXRlc0luX1Rhc2tzLAotCQkJCQkJTk9ERV9QYXJ0aWNpcGF0ZXNJbl9UYXNrcywgaXRlbXMsIHRydWUpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIHJlc3BvbnNpYmxlIGZvciB3b3JrIHByb2R1Y3RzLCAKLQkJaXRlbXMgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpKTsKLQkJCi0JCWlmIChpdGVtcy5zaXplKCkgPiAwICkgewotCQkJaWYgKCBvcHRpb25zLmdlbmVyYXRlTGlnaHRXZWlnaHRUcmVlICkgewotCQkJCUNvbGxlY3Rpb25zLnNvcnQoaXRlbXMsIG5hbWVDb21wYXJhdG9yKTsKLQkJCQlhbGxJdGVtcy5hZGRBbGwoaXRlbXMpOwotCQkJfSBlbHNlIHsKLQkJCQliID0gY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sIFBSRUZJWF9Xb3JrX1Byb2R1Y3RzX0NyZWF0ZWQsCi0JCQkJCQlOT0RFX1dvcmtfUHJvZHVjdHNfQ3JlYXRlZCwgaXRlbXMsIGZhbHNlKTsKLQkJCQlidWlsZEl0ZW1zKGl0ZW1zLCBiLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCAhb3B0aW9ucy5nZW5lcmF0ZUxpZ2h0V2VpZ2h0VHJlZSApIHsKLQkJCS8vIG1vZGlmaWVzIHdvcmsgcHJvZHVjdHMsIG5lZWQgYSBzdW1tYXJ5IHBhZ2UsIFRPRE8KLQkJCWl0ZW1zID0gY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRSb2xlX01vZGlmaWVzKCkpOwotCQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQliID0gY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sCi0JCQkJCQlQUkVGSVhfV29ya19Qcm9kdWN0c19Nb2RpZmllZCwgTk9ERV9Xb3JrX1Byb2R1Y3RzX01vZGlmaWVkLAotCQkJCQkJaXRlbXMsIGZhbHNlKTsKLQkJCQlidWlsZEl0ZW1zKGl0ZW1zLCBiLCB0cnVlKTsKLQkJCX0KLQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJLy8gYWxsIGd1aWRhbmNlcwotCQlpdGVtcy5jbGVhcigpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkpKTsKLQotCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJaWYgKCBvcHRpb25zLmdlbmVyYXRlTGlnaHRXZWlnaHRUcmVlICkgewotCQkJCUNvbGxlY3Rpb25zLnNvcnQoaXRlbXMsIG5hbWVDb21wYXJhdG9yKTsKLQkJCQlhbGxJdGVtcy5hZGRBbGwoaXRlbXMpOwotCQkJfSBlbHNlIHsKLQkJCQljcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwgTk9ERV9HdWlkYW5jZXMsIGl0ZW1zLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JCWlmICggb3B0aW9ucy5nZW5lcmF0ZUxpZ2h0V2VpZ2h0VHJlZSApIHsKLQkJCS8vIGxpZ2h0IHdlaWdodCB0cmVlLCBubyBzdWIgZm9sZGVycwotCQkJYnVpbGRJdGVtcyhhbGxJdGVtcywgYm0pOwotCQl9IAotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFdvcmtQcm9kdWN0U3ViVHJlZShXb3JrUHJvZHVjdCBlbGVtZW50LCBCb29rbWFyayBibSkgewotCQlMaXN0IGl0ZW1zOwotCQlTdHJpbmcgdXJsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gQm9va21hcmsgYjsKLQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3QgYWxsSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQkvLyBwZXJmb3JtaW5nIHJvbGVzLCAwLjEgcmVmZXJlbmNlIGVsZW1lbnQgd2lsbCBiZSByZWFsaXplZCBpbiBidWlsZEl0ZW0KLS8vCQltdWx0aXBsaWNpdHkgY2hhbmdlIGZvciBvcHBvc2l0ZSBmZWF0dXJlcwotLy8JCVJvbGUgciA9IEFzc29jaWF0aW9uSGVscGVyLmdldFJlc3BvbnNpYmxlUm9sZShlbGVtZW50KTsKLQkJaXRlbXMgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfUmVzcG9uc2libGVSb2xlcyk7Ci0JCWlmICggaXRlbXMuc2l6ZSgpID4gMCApIHsKLQkJCWlmICggb3B0aW9ucy5nZW5lcmF0ZUxpZ2h0V2VpZ2h0VHJlZSApIHsKLQkJCQlDb2xsZWN0aW9ucy5zb3J0KGl0ZW1zLCBuYW1lQ29tcGFyYXRvcik7Ci0JCQkJYWxsSXRlbXMuYWRkQWxsKGl0ZW1zKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sIFBSRUZJWF9SZXNwb25zaWJsZV9Sb2xlLAotCQkJCQkJCU5PREVfUmVzcG9uc2libGVfUm9sZSwgaXRlbXMsIHRydWUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBjb250YWluaW5nIHdvcmsgcHJvZHVjdHMsIG5lZWQgYSBzdW1tYXJ5IHBhZ2UsIFRPRE8KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCi0JCQlpZiAoICFvcHRpb25zLmdlbmVyYXRlTGlnaHRXZWlnaHRUcmVlICkgewotCQkJCVdvcmtQcm9kdWN0IHdwID0gKChBcnRpZmFjdCkgZWxlbWVudCkuZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKTsKLS8vCQkJCWNyZWF0ZUJvb2ttYXJrKE5PREVfQ29udGFpbmluZ19Xb3JrX1Byb2R1Y3QsCi0vLwkJCQkJCU5PREVfQ29udGFpbmluZ19Xb3JrX1Byb2R1Y3QsIHVybCwgIiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJaWYgKHdwICE9IG51bGwpIHsKLQkJCQkJaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWl0ZW1zLmFkZCh3cCk7Ci0JCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLAotCQkJCQkJCVBSRUZJWF9Db250YWluaW5nX1dvcmtfUHJvZHVjdCwKLQkJCQkJCQlOT0RFX0NvbnRhaW5pbmdfV29ya19Qcm9kdWN0LCBpdGVtcywgdHJ1ZSk7Ci0JCQkJfQotCQotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBjb250YWluZWQgd29yayBwcm9kdWN0cywgbmVlZCBhIHN1bW1hcnkgcGFnZSwgVE9ETwotCQkJLy8gaXRlbXMgPSAoKEFydGlmYWN0KWVsZW1lbnQpLmdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCQkJaXRlbXMgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpKTsKLQotCQkJLy8gbWFrZSBzdXJlIHRoZSBjb250YWluZWQgZWxlbWVudHMgZG9lcyBub3QgY29udGFpbiB0aGUgY29udGFpbmVyLAotCQkJLy8gdGhpcyBpcyBwb3NzaWJsZSBkdWUgdG8gcmVhbGl6YXRpb24sIHNheSwgdGhlIGNvbnRhaW5pbmcgZWxlbWVudAotCQkJLy8gY29udHJpYnV0ZSB0byB0aGUgY29udGFpbmVyCi0JCQlpdGVtcy5yZW1vdmUoZWxlbWVudCk7Ci0KLQkJCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJaWYgKCBvcHRpb25zLmdlbmVyYXRlTGlnaHRXZWlnaHRUcmVlICkgewotCQkJCQlDb2xsZWN0aW9ucy5zb3J0KGl0ZW1zLCBuYW1lQ29tcGFyYXRvcik7Ci0JCQkJCWFsbEl0ZW1zLmFkZEFsbChpdGVtcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQm9va21hcmsgYiA9IGNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLAotCQkJCQkJCVBSRUZJWF9Db250YWluZWRfV29ya19Qcm9kdWN0cywKLQkJCQkJCQlOT0RFX0NvbnRhaW5lZF9Xb3JrX1Byb2R1Y3RzLCBpdGVtcywgZmFsc2UpOwotCQotCQkJCQkvLyBmb3IgZWFjaCBjb250YWluZWQgd29yayBwcm9kdWN0LCBjcmVhdGUgdGhlIG5lc3RlZCBzdWIgdHJlZQotCQkJCQlidWlsZEl0ZW1zKGl0ZW1zLCBiLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICggIW9wdGlvbnMuZ2VuZXJhdGVMaWdodFdlaWdodFRyZWUgKSB7Ci0JCQkvLyBpbnB1dCB0byB0YXNrcwotCQkJaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X01hbmRhdG9yeUlucHV0VG9fVGFza3MpKTsKLQkJCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfT3B0aW9uYWxJbnB1dFRvX1Rhc2tzKSk7Ci0JCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLCBQUkVGSVhfSW5wdXRUb19UYXNrLAotCQkJCQkJTk9ERV9JbnB1dFRvX1Rhc2ssIGl0ZW1zLCB0cnVlKTsKLQkJCX0KLQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkKLQkJCS8vIG91dHB1dCBmcm9tIHRhc2tzCi0JCQlpdGVtcyA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9PdXRwdXRGcm9tX1Rhc2tzKTsKLQkJCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sIFBSRUZJWF9PdXRwdXRPZl9UYXNrLAotCQkJCQkJTk9ERV9PdXRwdXRPZl9UYXNrLCBpdGVtcywgdHJ1ZSk7Ci0JCQl9Ci0JCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGFsbCBndWlkYW5jZXMKLQkJaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSkpOwotLy8JCU9iamVjdCBlID0gY2FsYzAxRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0vLwkJCQkuZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGUoKSk7Ci0vLwkJaWYgKGUgIT0gbnVsbCkgewotLy8JCQlpdGVtcy5hZGQoZSk7Ci0vLwkJfQotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcnMoKSkpOwotCi0JCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlpZiAoIG9wdGlvbnMuZ2VuZXJhdGVMaWdodFdlaWdodFRyZWUgKSB7Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChpdGVtcywgbmFtZUNvbXBhcmF0b3IpOwotCQkJCWFsbEl0ZW1zLmFkZEFsbChpdGVtcyk7Ci0JCQl9IGVsc2UgewotCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLCBQUkVGSVhfR3VpZGFuY2VzLCBOT0RFX0d1aWRhbmNlcywKLQkJCQkJCWl0ZW1zLCB0cnVlKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCBvcHRpb25zLmdlbmVyYXRlTGlnaHRXZWlnaHRUcmVlICkgewotCQkJYnVpbGRJdGVtcyhhbGxJdGVtcywgYm0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udGFpbmVkQXJ0aWZhY3RzU3ViVHJlZShBcnRpZmFjdCBlbGVtZW50LCBCb29rbWFyayBibSwKLQkJCWJvb2xlYW4gc2hvd0d1aWRhbmNlcykgewotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3QgaXRlbXM7Ci0JCVN0cmluZyB1cmwgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGNvbnRhaW5lZCB3b3JrIHByb2R1Y3RzLCBuZWVkIGEgc3VtbWFyeSBwYWdlLCBUT0RPCi0JCS8vIGl0ZW1zID0gKChBcnRpZmFjdCllbGVtZW50KS5nZXRDb250YWluZWRBcnRpZmFjdHMoKTsKLQkJaXRlbXMgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkpOwotCi0JCS8vIG1ha2Ugc3VyZSB0aGUgY29udGFpbmVkIGVsZW1lbnRzIGRvZXMgbm90IGNvbnRhaW4gdGhlIGNvbnRhaW5lciwKLQkJLy8gdGhpcyBpcyBwb3NzaWJsZSBkdWUgdG8gcmVhbGl6YXRpb24sIHNheSwgdGhlIGNvbnRhaW5pbmcgZWxlbWVudAotCQkvLyBjb250cmlidXRlIHRvIHRoZSBjb250YWluZXIKLQkJaXRlbXMucmVtb3ZlKGVsZW1lbnQpOwotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCS8vIEJvb2ttYXJrIGIgPSBjcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwKLQkJCS8vIE5PREVfQ29udGFpbmVkX1dvcmtfUHJvZHVjdHMsIGl0ZW1zLCBmYWxzZSk7Ci0KLQkJCS8vIGZvciBlYWNoIGNvbnRhaW5lZCB3b3JrIHByb2R1Y3QsIGNyZWF0ZSB0aGUgbmVzdGVkIHN1YiB0cmVlCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJQXJ0aWZhY3QgZSA9IChBcnRpZmFjdCkgaXQubmV4dCgpOwotCQkJCWJ1aWxkSXRlbShlLCBibSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCi0JCWlmICghc2hvd0d1aWRhbmNlcykgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBhbGwgZ3VpZGFuY2VzCi0JCWl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkpKTsKLS8vCQlPYmplY3QgZSA9IGNhbGMwMUZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotLy8JCQkJLmdldFdvcmtQcm9kdWN0X0VzdGltYXRlKCkpOwotLy8JCWlmIChlICE9IG51bGwpIHsKLS8vCQkJaXRlbXMuYWRkKGUpOwotLy8JCX0KLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdF9SZXBvcnRzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCkpKTsKLQotCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJLy8gY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sIE5PREVfR3VpZGFuY2VzLCBpdGVtcywgdHJ1ZSk7Ci0JCQlidWlsZEl0ZW1zKGl0ZW1zLCBibSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBpdGVyYXRlIHRoZSBicmVhayBkb3duIHN0cnVjdHVyZSBhbmQgYnVpbGQgdGhlIHhtbCBkb2N1bWVudAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRPYmoKLQkgKiAgICAgICAgICAgIFRoZSBvYmplY3QgdG8gaXRlcmF0ZS4gSXQgY2FuIGJlIGEgYnJlYWtkb3duIGVsZW1lbnQsIG9yIGl0J3MKLQkgKiAgICAgICAgICAgIGFkYXB0b3IKLQkgKiBAcGFyYW0gcGFyZW50WG1sCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGl0ZXJhdGVBY3Rpdml0eShQcm9jZXNzRWxlbWVudEl0ZW0gcGFyZW50SXRlbSwKLQkJCUJvb2ttYXJrIHBhcmVudEJtLCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJU3VwcHJlc3Npb24gc3VwKSB7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQkJT2JqZWN0IHBhcmVudE9iaiA9IHBhcmVudEl0ZW0ucmF3SXRlbTsKLQotCQlpZiAocGFyZW50T2JqIGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQlwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHBhcmVudE9iajsKLQkJfSBlbHNlIHsKLQkJCXByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCXBhcmVudE9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJfQotCi0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkvLyBTdHJpbmcgZGlzcGxheU5hbWUgPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUocGFyZW50T2JqLAotCQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSwgcHJvdmlkZXIpOwotCQkJLy8gcGFyZW50WG1sLnNldEF0dHJpYnV0ZSgiRGlzcGxheU5hbWUiLCBkaXNwbGF5TmFtZSk7Ci0KLQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBwcm92aWRlci5nZXRDaGlsZHJlbihwYXJlbnRPYmopOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCU9iamVjdCByYXdpdGVtID0gaXQubmV4dCgpOwotCQkJCWlmIChzdXAuaXNTdXBwcmVzc2VkKHJhd2l0ZW0pKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCU1ldGhvZEVsZW1lbnQgaXRlbSA9IChNZXRob2RFbGVtZW50KSBMaWJyYXJ5VXRpbAotCQkJCQkJLnVud3JhcChyYXdpdGVtKTsKLQkJCQlpZiAoIShpdGVtIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCVByb2Nlc3NFbGVtZW50SXRlbSBlbGVtZW50SXRlbSA9IG5ldyBQcm9jZXNzRWxlbWVudEl0ZW0oCi0JCQkJCQlyYXdpdGVtLCBpdGVtLCBwYXJlbnRJdGVtKTsKLQotCQkJCUJvb2ttYXJrIGNoaWxkID0gYnVpbGRJdGVtKGVsZW1lbnRJdGVtLmVsZW1lbnQsIHBhcmVudEJtLCBmYWxzZSk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJLy8gc2V0IHRoZSBxdWVyeSBzdHJpbmcKLQkJCQkJY2hpbGQuc2V0UXVlcnlTdHJpbmcoZWxlbWVudEl0ZW0uZ2V0UXVlcnlTdHJpbmcoKSk7Ci0KLQkJCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSBudWxsOwotCQkJCQlpZiAocmF3aXRlbSBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCQkJYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIHJhd2l0ZW07Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoaXRlbSwKLQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCTsKLQkJCQkJfQotCi0JCQkJCVN0cmluZyBkaXNwbGF5TmFtZSA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUsIGFkYXB0ZXIpOwotCQkJCQljaGlsZC5zZXRQcmVzZW50YXRpb25OYW1lKGRpc3BsYXlOYW1lKTsKLQotCQkJCQlpdGVyYXRlQWN0aXZpdHkoZWxlbWVudEl0ZW0sIGNoaWxkLCBhZGFwdGVyRmFjdG9yeSwgc3VwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRQcm9jZXNzU3ViVHJlZShPYmplY3Qgb2JqLCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgZWxlbWVudCwKLQkJCUJvb2ttYXJrIGJtKSB7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlQcm9jZXNzRWxlbWVudEl0ZW0gcHJvY0l0ZW0gPSBuZXcgUHJvY2Vzc0VsZW1lbnRJdGVtKG9iaiwgZWxlbWVudCwKLQkJCQllbGVtZW50LmdldEd1aWQoKSk7Ci0KLQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IHN1cGVyLmdldExheW91dE1ncigpCi0JCQkJLmdldFdCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCVN1cHByZXNzaW9uIHN1cCA9IG5ldyBTdXBwcmVzc2lvbihlbGVtZW50KTsKLQkJaXRlcmF0ZUFjdGl2aXR5KHByb2NJdGVtLCBibSwgYWRhcHRlckZhY3RvcnksIHN1cCk7Ci0KLQkJU3RyaW5nIHVybDsKLQkJQm9va21hcmsgYjsKLQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGFsbCBndWlkYW5jZXMKLQkJaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQ2hlY2tsaXN0cygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQ29uY2VwdHMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0V4YW1wbGVzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9HdWlkZWxpbmVzKCkpKTsKLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJRGVsaXZlcnlQcm9jZXNzIGRwID0gKERlbGl2ZXJ5UHJvY2VzcykgZWxlbWVudDsKLQkJCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFscygpKSk7Ci0JCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWxzKCkpKTsKLQkJfQotCi0JCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQljcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwgUFJFRklYX0d1aWRhbmNlcywgTk9ERV9HdWlkYW5jZXMsCi0JCQkJCWl0ZW1zLCB0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGRpc3Bvc2UgdGhlIG9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJCi0JCWVsZW1lbnRVcmxzLmNsZWFyKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTZXQgZWxlbWVudFVybHMgPSBuZXcgSGFzaFNldCgpOwotCXByb3RlY3RlZCB2b2lkIGVsZW1lbnRQdWJsaXNoZWQoSUVsZW1lbnRMYXlvdXQgbGF5b3V0LCBTdHJpbmcgaHRtbGZpbGUpIHsKLQkJLy8gb25seSBmb3IgcHJvY2VzcyBlbGVtZW50IGZvciBub3cKLQkJLy8gbWF5IGNvdmVyIGFsbCBtZXRob2QgZWxlbWVudHMgbGF0ZXIKLQkJaWYgKCBsYXlvdXQuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQgKSB7Ci0JCQlFbGVtZW50VXJsIHVybCA9IG5ldyBFbGVtZW50VXJsKGxheW91dC5nZXRFbGVtZW50KCkuZ2V0R3VpZCgpLCBsYXlvdXQuZ2V0VXJsKCksIGxheW91dC5nZXREaXNwbGF5TmFtZSgpICk7Ci0JCQllbGVtZW50VXJscy5hZGQodXJsKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2F2ZUVsZW1lbnRVcmxzKCkgewotCQkvLyBzYXZlIHB1Ymxpc2hlZCBlbGVtZW50IHVybHMKLQkJLy8gbmVlZCB0byBlc2NhcGUgdGhlIHVybCBhbmQgdGV4dCBzaW5jZSBpdCB3aWxsIGJlIGFzc2lnbmVkIHRvIGEgamF2YXNjcmlwdCB2YXJpYWJsZSBhcyBsaXRlcmFsCi0JCVhtbEVsZW1lbnQgeG1sID0gbmV3IFhtbEVsZW1lbnQoIkVsZW1lbnRVcmxzIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBlbGVtZW50VXJscy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJRWxlbWVudFVybCB1cmwgPSAoRWxlbWVudFVybClpdC5uZXh0KCk7Ci0JCQl4bWwubmV3Q2hpbGQoImVsZW1lbnRVcmwiLCB1cmwuZ3VpZCkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoInRleHQiLCBTdHJVdGlsLmVzY2FwZSh1cmwudGV4dCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJ1cmwiLCBTdHJVdGlsLmVzY2FwZSh1cmwudXJsKSk7CS8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLS8vCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotLy8JCWJ1ZmZlci5hcHBlbmQoWG1sSGVscGVyLlhNTF9IRUFERVIpLmFwcGVuZCh4bWwudG9YbWwoKSk7Ci0vLwkJRmlsZSBmID0gbmV3IEZpbGUoZ2V0TGF5b3V0TWdyKCkuZ2V0UHVibGlzaERpcigpLCAiRWxlbWVudFVybHMueG1sIik7IC8vJE5PTi1OTFMtMSQKLS8vCQlGaWxlVXRpbC53cml0ZVVURjhGaWxlKGYuZ2V0QWJzb2x1dGVQYXRoKCksIGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCi0JCVN0cmluZyBodG1sID0gUHVibGlzaGluZ1V0aWwuZ2V0SHRtbCh4bWwsICJ4c2wvZWxlbWVudFVybHMueHNsIik7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKGdldExheW91dE1ncigpLmdldFB1Ymxpc2hEaXIoKSwgUFJPQ0VTU19MQVlPVVRfREFUQV9GSUxFKTsgLy8kTk9OLU5MUy0xJAotCQlGaWxlVXRpbC53cml0ZVVURjhGaWxlKGYuZ2V0QWJzb2x1dGVQYXRoKCksIGh0bWwsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIGRhdGEgc3RydWN0dXJlIHRvIGRlZmluZSB1cmwgb2YgYW4gZWxlbWVudAotCSAqIAotCSAqIEBhdXRob3IgSmluaHVhIFhpCi0JICoKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRWxlbWVudFVybHsKLQotCQlTdHJpbmcgZ3VpZDsKLQkJU3RyaW5nIHVybDsgCi0JCVN0cmluZyB0ZXh0OwotCQkKLQkJLyoqCi0JCSAqIGNvbnN0cnVjdG9yCi0JCSAqIAotCQkgKiBAcGFyYW0gZ3VpZCBTdHJpbmcgdGhlIGd1aWQgb2YgdGhlIGVsZW1lbnQKLQkJICogQHBhcmFtIHVybCBTdHJpbmcgdGhlIHVybCBvZiB0aGUgZWxlbWVudAotCQkgKiBAcGFyYW0gdGV4dCBTdHJpbmcgdGhlIHRleHQgYWxvbmUgd2l0aCB0aGUgdXJsCi0JCSAqLwotCQlwdWJsaWMgRWxlbWVudFVybChTdHJpbmcgZ3VpZCwgU3RyaW5nIHVybCwgU3RyaW5nIHRleHQpIHsKLQkJCXRoaXMuZ3VpZCA9IGd1aWQ7Ci0JCQl0aGlzLnVybCA9IHVybDsKLQkJCXRoaXMudGV4dCA9IHRleHQ7Ci0JCX0KLQl9Ci0JCi0JY2xhc3MgRU9iamVjdENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQkJcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgcE5hbWUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpOwotCQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBuYW1lID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKTsKLQkJcHVibGljIEVPYmplY3RDb21wYXJhdG9yKCkgewotCQkJCi0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQkJaWYgKCBlMSBpbnN0YW5jZW9mIEVPYmplY3QgJiYgZTIgaW5zdGFuY2VvZiBFT2JqZWN0ICkgewotCQkJCU9iamVjdCB2MSA9IGdldFZhbHVlKGUxKTsKLQkJCQlPYmplY3QgdjIgPSBnZXRWYWx1ZShlMik7Ci0JCQkJCi0JCQkJaWYgKCB2MSA9PSBudWxsICYmIHYyID09IG51bGwgKSB7Ci0JCQkJCXJldHVybiBlMS50b1N0cmluZygpLmNvbXBhcmVUbyhlMi50b1N0cmluZygpKTsKLQkJCQl9IGVsc2UgaWYgKCB2MSA9PSBudWxsICkgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfSBlbHNlIGlmICggdjIgPT0gbnVsbCApIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHYxLnRvU3RyaW5nKCkuY29tcGFyZVRvKHYyLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGUxLnRvU3RyaW5nKCkuY29tcGFyZVRvKGUyLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZSkgewotCQkJT2JqZWN0IHYgPSBudWxsOwotCQkJdHJ5IHsgCi0JCQkJdiA9ICgoRU9iamVjdCllKS5lR2V0KHBOYW1lKTsgCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpewotCQkJCQotCQkJfTsKLQkJCQotCQkJaWYgKCB2ID09IG51bGwgfHwgdi50b1N0cmluZygpLmxlbmd0aCgpID09IDAgKSB7IAotCQkJCXRyeSB7IAotCQkJCQl2ID0gKChFT2JqZWN0KWUpLmVHZXQobmFtZSk7IAotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkKLQkJCQl9OwkJCQkJCi0JCQl9Ci0KLQkJCXJldHVybiB2OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdEVsZW1lbnRUeXBlUmVzb3VyY2VzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdEVsZW1lbnRUeXBlUmVzb3VyY2VzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOTc3Mjg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0RlZmF1bHRFbGVtZW50VHlwZVJlc291cmNlcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jCi0jIGRlZmluZXMgd2hpY2ggZWxlbWVudHMgd2lsbCB1c2UgdGhlIGRlZmF1bHQgaWNvbgotIwotZGlzY2lwbGluZT10cnVlCi1jYXBhYmlsaXR5UGF0dGVybj10cnVlCi1yb2xlPXRydWUKLXRhc2s9dHJ1ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0RlZmF1bHRFbGVtZW50VHlwZVJlc291cmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdEVsZW1lbnRUeXBlUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUwYzNmY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdEVsZW1lbnRUeXBlUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIERlZmF1bHRFbGVtZW50VHlwZVJlc291cmNlcyAKLXsKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQlzdGF0aWMKLQl7Ci0JCXRyeSAKLQkJewotCQkJU3RyaW5nIHJlc291cmNlID0gRGVmYXVsdEVsZW1lbnRUeXBlUmVzb3VyY2VzLmNsYXNzLmdldE5hbWUoKTsKLQkJICAgIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHJlc291cmNlKTsKLQkJCSAgICAJCSAgICAKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJICAgIHgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpCi0JewotCQl0cnkgCi0JCXsKLQkJCXJldHVybiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgPyByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IG51bGw7Ci0JCX0gCi0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgCi0JCXsKLQkJCXJldHVybiBudWxsOwotCQl9CQkKLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgaWYgYSBkZWZhdWx0IGljb24gaXMgaXNlZCBvciBub3QgZm9yIHRoZSBzcGVjaWZpZWQga2V5Ci0JICogCi0JICogQHBhcmFtIGtleSBTdHJpbmcKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXNlRGVmYXVsdEljb24oU3RyaW5nIGtleSkKLQl7Ci0JCVN0cmluZyBib29sZWFuUmVzdWx0ID0gZ2V0U3RyaW5nKGtleSk7Ci0JCWlmICggYm9vbGVhblJlc3VsdCA9PSBudWxsICkKLQkJewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gKGJvb2xlYW5SZXN1bHQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJ0cnVlIikgPiAtMSkgPyB0cnVlIDogZmFsc2U7IC8vJE5PTi1OTFMtMSQKLQl9CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0RlZmF1bHRFbGVtZW50VHlwZVJlc291cmNlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdEVsZW1lbnRUeXBlUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM5MjJmODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdEVsZW1lbnRUeXBlUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIwotIyBkZWZpbmVzIHdoaWNoIGVsZW1lbnRzIHdpbGwgdXNlIHRoZSBkZWZhdWx0IGljb24KLSMKLWRpc2NpcGxpbmU9dHJ1ZQotY2FwYWJpbGl0eVBhdHRlcm49dHJ1ZQotcm9sZT10cnVlCi10YXNrPXRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9EZWZhdWx0Tm9kZUljb25SZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0RlZmF1bHROb2RlSWNvblJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYjdkNjhiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0RlZmF1bHROb2RlSWNvblJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Tm9kZUljb25SZXNvdXJjZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9JQ09OX05BTUUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcmVzb3VyY2UgPSBEZWZhdWx0Tm9kZUljb25SZXNvdXJjZXMuY2xhc3MuZ2V0TmFtZSgpOwotCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocmVzb3VyY2UpOwotCQkJREVGQVVMVF9JQ09OX05BTUUgPSBnZXRTdHJpbmcoImZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0KLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgPyByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KQotCQkJCQk6IG51bGw7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgaWNvbiBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGtleQotCSAqIAotCSAqIEBwYXJhbSBrZXkgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGljb24gbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJY29uTmFtZShTdHJpbmcga2V5KSB7Ci0JCVN0cmluZyBpY29uTmFtZSA9IGdldFN0cmluZyhrZXkpOwotCQlpZiAoaWNvbk5hbWUgPT0gbnVsbCkgewotCQkJaWNvbk5hbWUgPSBERUZBVUxUX0lDT05fTkFNRTsKLQkJfQotCi0JCXJldHVybiBpY29uTmFtZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0RlZmF1bHROb2RlSWNvblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdE5vZGVJY29uUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBhZjFjZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdE5vZGVJY29uUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIwotIyBkZWZpbmVzIHRoZSBkZWZhdWx0IG5vZGUgaWNvbiBuYW1lcwotIwotYWN0aXZpdHk9YWN0aXZpdHkuZ2lmCi1hcnRpZmFjdD1hcnRpZmFjdC5naWYKLXJvbGU9d29ya2VyLmdpZgotdGFzaz1hY3Rpdml0eS5naWYKLWd1aWRlbGluZT1ndWlkZWxpbmUuZ2lmCi1jaGVja2xpc3Q9Y2hlY2tsaXN0LmdpZgotY29uY2VwdD1jb25jZXB0LmdpZgotZXhhbXBsZT1leGFtcGxlLmdpZgotcmVwb3J0PQotc3VwcG9ydGluZ21hdGVyaWFsPQotdGVjaG5pcXVlPQotdGVtcGxhdGU9Ci10ZXJtZGVmaW5pdGlvbj0KLXRvb2xtZW50b3I9Ci10cmFpbmluZ21vZHVsZT0KLXdoaXRlcGFwZXI9Ci13b3JrcHJvZHVjdGd1aWRlbGluZT0KLWdlbmVyYWw9Ci1wcm9jZXNzPQotY2FwYWJpbGl0eXBhdHRlcm49Ci1kZWxpdmVyeXByb2Nlc3M9Ci1mb2xkZXI9Zm9sZGVyLmdpZgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdFNpdGVHZW5lcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0RlZmF1bHRTaXRlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4YTdiZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdFNpdGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5Cb29rbWFyazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuQm9va21hcmtMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5IdG1sQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGF5b3V0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuUHVibGlzaGluZ1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51dGlsLlB1Ymxpc2hpbmdVdGlsOwotCi0vKioKLSAqIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNpdGUgZ2VuZXJhdG9yLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRTaXRlR2VuZXJhdG9yIGltcGxlbWVudHMgSVNpdGVHZW5lcmF0b3IgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DX1JPT1QgPSAiZG9jcm9vdC8iOyAvLyROT04tTkxTLTEkOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fQVBQTEVUX0RJUkVDVE9SWSA9ICJub2FwcGxldCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0tNQVJLX1NVRkZJWCA9ICIuYmttIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0tNQVJLX1NVRkZJWF9YTUwgPSAiLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0tNQVJLX1NVRkZJWF9IVE1MID0gIi5odG1sIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBQ0VfUkVQTEFDRU1FTlQgPSAiXyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQQUNFX1NUUklORyA9ICIgIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9CT09LTUFSS19DRkdfTkFNRSA9Ci0JLy8gIkRlZmF1bHRCb29rbWFyay5jZmciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSEVEX0JPT0tNQVJLU19DRkdfTkFNRSA9ICJQdWJsaXNoZWRCb29rbWFya3MueG1sIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSEVEX0JPT0tNQVJLU19ERUxJTUlURVIgPSAiKiI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0tNQVJLX1hTTF9GSUxFID0gInhzbC9ib29rbWFyay54c2wiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCT09LTUFSS1NfWFNMX0ZJTEUgPSAieHNsL1B1Ymxpc2hlZEJvb2ttYXJrcy54c2wiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFWF9YU0xfRklMRSA9ICJ4c2wvaW5kZXgueHNsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QTkFWX1hTTF9GSUxFID0gInhzbC90b3BuYXYueHNsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExFVF9QQVRIID0gImFwcGxldCIgKyBGaWxlLnNlcGFyYXRvckNoYXI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fQVBQTEVUX1BBVEggPSAibm9hcHBsZXQiICsgRmlsZS5zZXBhcmF0b3JDaGFyOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUEFUSCA9ICJpbWFnZXMiICsgRmlsZS5zZXBhcmF0b3JDaGFyOyAvLyROT04tTkxTLTEkCi0KLQotCXByb3RlY3RlZCBTdHJpbmcgcHViRGlyOwotCXByb3RlY3RlZCBQdWJsaXNoT3B0aW9ucyBvcHRpb25zOwotCXByb3RlY3RlZCBIdG1sQnVpbGRlciBidWlsZGVyOwotCQotCXByb3RlY3RlZCAJRmlsZSBpY29uUGF0aDsKLQotCXB1YmxpYyBEZWZhdWx0U2l0ZUdlbmVyYXRvcihIdG1sQnVpbGRlciBidWlsZGVyLCBQdWJsaXNoT3B0aW9ucyBvcHRpb25zKSB7Ci0JCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7Ci0JCXRoaXMuYnVpbGRlciA9IGJ1aWxkZXI7Ci0JCXRoaXMucHViRGlyID0gYnVpbGRlci5nZXRQdWJsaXNoRGlyKCk7Ci0KLQkJaWNvblBhdGggPSBuZXcgRmlsZShwdWJEaXIsIEFQUExFVF9QQVRIICsgSUNPTl9QQVRIKTsKLQotCX0KLQkKLQlwdWJsaWMgSHRtbEJ1aWxkZXIgZ2V0SHRtbEJ1aWxkZXIoKSB7Ci0JCXJldHVybiBidWlsZGVyOwotCX0KLQkKLQlwdWJsaWMgUHVibGlzaE9wdGlvbnMgZ2V0UHVibGlzaE9wdGlvbnMoKSB7Ci0JCXJldHVybiBvcHRpb25zOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZUljb25QYXRoKCkgewotCQlyZXR1cm4gaWNvblBhdGguZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHByZVB1Ymxpc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY29weUZpbGVzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHBvc3RQdWJsaXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvcHlJY29uc0Zvck5vbkFwcGxldCgpOwotCQl3cml0ZUluZGV4QW5kVG9wTmF2SHRtbCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjb3B5RmlsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQljb3B5RG9jUm9vdEZpbGVzKCk7Ci0KLQkJLy8gY29weSBsb2NhbGl6ZWQgZmlsZXMKLQkJY29weUxvY2FsaXplZEZpbGVzKCk7Ci0KLQkJLy8gY29weSB1c2VyIGN1c3RvbWl6ZWQgZmlsZXMgbGFzdAotCQljb3B5Q3VzdG9taXplZEZpbGVzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29weURvY1Jvb3RGaWxlcygpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVVSTCBwbHVnaW5fdXJsID0gUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW5zdGFsbFVSTCgpOwotCQlVUkwgdXJsID0gbmV3IFVSTChwbHVnaW5fdXJsLCBET0NfUk9PVCk7Ci0JCVN0cmluZyBmcm9tUGF0aCA9IFBsYXRmb3JtLnJlc29sdmUodXJsKS5nZXRQYXRoKCk7Ci0KLQkJLy8gZm9sZGVycyB0aGF0IGFwcGx5IHRvIGFsbAotCQkvLyBOT1RFOiBhcHBsZXQgaW1hZ2VzIHNob3VsZCBhbHdheXMgYmUgaW5jbHVkZWQgc2luY2UgaXQncyB1c2VkIGluCi0JCS8vIEF0bGFudGljIGNvbmZpZ3VyYXRpb24KLQkJLy8gYXBwbGV0L2hlbHAuaHRtIGlzIHVzZWQgaW4gUlNBIHRvIGNoZWNrIGNoYXJhY3RlciBlbmNvZGluZywgc28KLQkJLy8gbmVlZCB0byBpbmNsdWRlIHRoaXMgZmlsZQotCQkvLyBQcm9jZXNzIEFkdmlzb3I6IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpbiBSU0EgbG9nCi0JCS8vIHdoZW4gaW5kZXhpbmcgc3RhcnQgb24gYSBub24tYXBwbGV0IHB1Ymxpc2hlZCBzaXRlCi0JCVN0cmluZyBpbmNsdWRlcyA9ICIqLiosIHByb2Nlc3MvKiosIGltYWdlcy8qKiwgaW5kZXgvKiosIHNjcmlwdHMvKiosIHN0eWxlc2hlZXRzLyoqIjsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBleGNsdWRlcyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gYmFzZWQgb24gdGhlIHNlbGVjdGlvbiwgY29weSB0aGUgb3RoZXIgZm9sZGVycwotCQlpZiAob3B0aW9ucy51c2VEZWZhdWx0VHJlZUJyb3dzZXIpIHsKLQkJCWluY2x1ZGVzICs9ICIsIG5vYXBwbGV0LyoqIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gU3RyaW5nIHB1Ymxpc2hEaXIgPSB2aWV3QnVpbGRlci5nZXRIdG1sQnVpbGRlcigpLmdldFB1Ymxpc2hEaXIoKTsKLQotCQlMYXlvdXRSZXNvdXJjZXMuY29weURpcihmcm9tUGF0aCwgcHViRGlyLCBpbmNsdWRlcywgZXhjbHVkZXMpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29weUN1c3RvbWl6ZWRGaWxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAob3B0aW9ucy5iYW5uZXJJbWFnZSAhPSBudWxsICYmIG9wdGlvbnMuYmFubmVySW1hZ2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQlGaWxlVXRpbC5jb3B5RmlsZShvcHRpb25zLmJhbm5lckltYWdlLCBwdWJEaXIgKyAiaW1hZ2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW9wdGlvbnMuYmFubmVySW1hZ2UgPSBGaWxlVXRpbC5nZXRGaWxlTmFtZShvcHRpb25zLmJhbm5lckltYWdlKTsKLQkJfSBlbHNlIHsKLQkJCW9wdGlvbnMuYmFubmVySW1hZ2UgPSAiYmFubmVyLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChvcHRpb25zLmFib3V0SFRNTCAhPSBudWxsICYmIG9wdGlvbnMuYWJvdXRIVE1MLmxlbmd0aCgpID4gMCkgewotCQkJRmlsZVV0aWwuY29weUZpbGUob3B0aW9ucy5hYm91dEhUTUwsIHB1YkRpciArICJhYm91dC5odG0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29weUxvY2FsaXplZEZpbGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gY29weSBzY3JpcHRzLCByZW5hbWUgdGhlIGxvY2Fsc2Ugc3BlY2lmaWMgbmFtZSB0byB0aGUgZGVmYXVsdAotCQkvLyBuYW1lCi0JCVB1Ymxpc2hpbmdQbHVnaW4KLQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJLmNvcHlMb2NhbGl6ZWRGaWxlcygKLQkJCQkJCURPQ19ST09UICsgInNjcmlwdHMvIiwgbmV3IEZpbGUocHViRGlyLCAic2NyaXB0cy8iKSwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5jb3B5TG9jYWxpemVkRmlsZXMoCi0JCQkJRE9DX1JPT1QgKyAiaW1hZ2VzLyIsIG5ldyBGaWxlKHB1YkRpciwgImltYWdlcy8iKSwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5jb3B5TG9jYWxpemVkRmlsZXMoRE9DX1JPT1QsCi0JCQkJbmV3IEZpbGUocHViRGlyLCAiLyIpLCBmYWxzZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpZiAob3B0aW9ucy51c2VEZWZhdWx0VHJlZUJyb3dzZXIpIHsKLQkJCS8vIGNvcHkgdGhlIGFwcGxldCBodG1sIGZpbGVzLCByZW5hbWUgbG9jYWxlIHNwZWNpZmljIG5hbWVzCi0JCQlQdWJsaXNoaW5nUGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmNvcHlMb2NhbGl6ZWRGaWxlcygKLQkJCQkJCQlET0NfUk9PVCArICJub2FwcGxldC8iLCBuZXcgRmlsZShwdWJEaXIsICJub2FwcGxldC8iKSwgZmFsc2UsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjb3B5SWNvbnNGb3JOb25BcHBsZXQoKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCS8vIGRvbid0IGphciBpdC4gY29weSB0aGUgaWNvbnMgdG8gdGhlIGltYWdlcwotLy8JCQlGaWxlIGphckZpbGUgPSBuZXcgRmlsZShidWlsZGVyLmdldFB1Ymxpc2hEaXIoKSwgQVBQTEVUX1BBVEggKyBJQ09OX1pJUF9GSUxFKTsKLS8vCQkJUHVibGlzaGluZ1V0aWwuamFyRmlsZXMoaWNvblBhdGgsIGphckZpbGUpOwotCi0JCQlpZiAoIG9wdGlvbnMudXNlRGVmYXVsdFRyZWVCcm93c2VyICkKLQkJCXsKLQkJCQkvLyBhbHNvIGNvcHkgdGhlIGljb25zIHRvIHRoZSBuby1hcHBsZXQgZm9sZGVyCi0JCQkJTGF5b3V0UmVzb3VyY2VzLmNvcHlEaXIoaWNvblBhdGguZ2V0QWJzb2x1dGVQYXRoKCksIHB1YkRpciArIE5PX0FQUExFVF9QQVRIICsgSUNPTl9QQVRIKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KQotCQl7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIG1ha2VCb29rbWFya0ZpbGVOYW1lKFN0cmluZyBib29rbWFya05hbWUpIHsKLQkJcmV0dXJuIGJvb2ttYXJrTmFtZS5yZXBsYWNlKFNQQUNFX1NUUklORy5jaGFyQXQoMCksIFNQQUNFX1JFUExBQ0VNRU5UCi0JCQkJLmNoYXJBdCgwKSkKLQkJCQkrIEJPT0tNQVJLX1NVRkZJWF9YTUw7Ci0JfQotCi0KLQlwcml2YXRlIFN0cmluZyB3cml0ZUJvb2ttYXJrKEJvb2ttYXJrIGIpIHsKLQotCQkvLyBnZXQgdGhlIGJvb2ttYXJrIG5hbWUgZnJvbSB0aGUgYm9va21hcmsgdXJsCi0JCVN0cmluZyBib29rbWFya0ZpbGVOYW1lID0gbWFrZUJvb2ttYXJrRmlsZU5hbWUoU3RyVXRpbAotCQkJCS5yZW1vdmVTcGVjaWFsQ2hhcmFjdGVycyhiLmdldFByZXNlbnRhdGlvbk5hbWUoKSkpOwotCQlYbWxFbGVtZW50IHhtbCA9IGIuZ2V0WG1sRWxlbWVudCgpOwotCi0JCVN0cmluZyBidWZmZXIgPSBQdWJsaXNoaW5nVXRpbC5nZXRIdG1sKHhtbCwgQk9PS01BUktfWFNMX0ZJTEUpOwotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCVN0cmluZyBodG1sUGF0aCA9IGdldEJvb2ttYXJrSHRtbFBhdGgoYm9va21hcmtGaWxlTmFtZSk7Ci0JCQlGaWxlVXRpbC53cml0ZVVURjhGaWxlKGh0bWxQYXRoLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlyZXR1cm4gYm9va21hcmtGaWxlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZVB1Ymxpc2hlZEJvb2ttYXJrcyhMaXN0IGJvb2ttYXJrcywgQm9va21hcmsgZGVmYXVsdFZpZXcpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJLy8gZmlyc3Qgd3JpdGUgeG1sIGZvciBlYWNoIGluZGl2aWR1YWwgdmlldyAKLQkJQm9va21hcmtMaXN0IGxpc3QgPSBuZXcgQm9va21hcmtMaXN0KCk7Ci0KLQkJaWYgKChkZWZhdWx0VmlldyA9PSBudWxsKSAmJiAoYm9va21hcmtzLnNpemUoKSA+IDApKSB7Ci0JCQlkZWZhdWx0VmlldyA9IChCb29rbWFyaykgYm9va21hcmtzLmdldCgwKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBib29rbWFya3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJQm9va21hcmsgYiA9IChCb29rbWFyaykgaXQubmV4dCgpOwotCQkJU3RyaW5nIGZpbGVOYW1lID0gd3JpdGVCb29rbWFyayhiKTsKLQkJCWxpc3QuYWRkQm9va21hcmsoYi5nZXRQcmVzZW50YXRpb25OYW1lKCksIGZpbGVOYW1lLAotCQkJCQkoZGVmYXVsdFZpZXcgPT0gYikpOwotCQl9Ci0JCQotCQkvLyB0aGVuIHdyaXRlIHRoZSB0b3AgbGV2ZWwgYm9va21hcmsgeG1sCi0JCVhtbEVsZW1lbnQgeG1sID0gbGlzdC5nZXRYbWxFbGVtZW50KCk7Ci0KLQkJU3RyaW5nIGJ1ZmZlciA9IFB1Ymxpc2hpbmdVdGlsLmdldEh0bWwoeG1sLCBCT09LTUFSS1NfWFNMX0ZJTEUpOwotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCVN0cmluZyBodG1sUGF0aCA9IGdldEJvb2ttYXJrSHRtbFBhdGgoUFVCTElTSEVEX0JPT0tNQVJLU19DRkdfTkFNRSk7Ci0JCQlGaWxlVXRpbC53cml0ZVVURjhGaWxlKGh0bWxQYXRoLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGVJbmRleEFuZFRvcE5hdkh0bWwoKSB7Ci0KLQkJWG1sRWxlbWVudCBvcHRpb25YbWwgPSBnZXRPcHRpb25YbWwoKTsKLQkJCi0JCVN0cmluZyBidWZmZXIgPSBQdWJsaXNoaW5nVXRpbC5nZXRIdG1sKG9wdGlvblhtbCwgSU5ERVhfWFNMX0ZJTEUpOwotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCVN0cmluZyBodG1sUGF0aCA9IGdldEluZGV4RmlsZVBhdGgoKTsKLQkJCUZpbGVVdGlsLndyaXRlVVRGOEZpbGUoaHRtbFBhdGgsIGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQotCi0JCWJ1ZmZlciA9IFB1Ymxpc2hpbmdVdGlsLmdldEh0bWwob3B0aW9uWG1sLCBUT1BOQVZfWFNMX0ZJTEUpOwotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCVN0cmluZyBodG1sUGF0aCA9IHB1YkRpciArICJ0b3BuYXYuaHRtIjsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZVV0aWwud3JpdGVVVEY4RmlsZShodG1sUGF0aCwgYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Qm9va21hcmtIdG1sUGF0aChTdHJpbmcgYm9vbWthcmtGaWxlKSB7Ci0JCWludCBpbmR4ID0gYm9vbWthcmtGaWxlLmxhc3RJbmRleE9mKEJPT0tNQVJLX1NVRkZJWF9YTUwpOwotCQlyZXR1cm4gcHViRGlyCi0JCQkJKyBOT19BUFBMRVRfRElSRUNUT1JZICsgRmlsZS5zZXBhcmF0b3JDaGFyCi0JCQkJKyBib29ta2Fya0ZpbGUuc3Vic3RyaW5nKDAsIGluZHgpICsgQk9PS01BUktfU1VGRklYX0hUTUw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5kZXhGaWxlUGF0aCgpIHsKLQkJcmV0dXJuIHB1YkRpciArICJpbmRleC5odG0iOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFhtbEVsZW1lbnQgZ2V0T3B0aW9uWG1sKCkgewotCQlib29sZWFuIHNob3dHbG9zc2FyeSA9IChvcHRpb25zID09IG51bGwpIHx8IG9wdGlvbnMuZ2VuZXJhdGVHbG9zc2FyeTsKLQkJYm9vbGVhbiBzaG93SW5kZXggPSAob3B0aW9ucyA9PSBudWxsKSB8fCBvcHRpb25zLmdlbmVyYXRlSW5kZXg7Ci0KLQkJWG1sRWxlbWVudCBvcHRpb25YbWwgPSBuZXcgWG1sRWxlbWVudCgiUHVibGlzaGluZ09wdGlvbiIpIC8vJE5PTi1OTFMtMSQKLQkJLnNldEF0dHJpYnV0ZSgidGl0bGUiLCAob3B0aW9ucyA9PSBudWxsKSA/ICIiIDogb3B0aW9ucy50aXRsZSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCS5zZXRBdHRyaWJ1dGUoCi0JCQkJImJhbm5lckltYWdlIiwgKG9wdGlvbnMgPT0gbnVsbCkgPyAiIiA6IG9wdGlvbnMuYmFubmVySW1hZ2UpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkuc2V0QXR0cmlidXRlKAotCQkJCSJmZWVkYmFja1VybCIsIChvcHRpb25zID09IG51bGwpID8gIiIgOiBvcHRpb25zLmZlZWRiYWNrVVJMKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJLnNldEF0dHJpYnV0ZSgic2hvd0dsb3NzYXJ5IiwgKHNob3dHbG9zc2FyeSA/ICJ0cnVlIiA6ICJmYWxzZSIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkuc2V0QXR0cmlidXRlKCJzaG93SW5kZXgiLCAoc2hvd0luZGV4ID8gInRydWUiIDogImZhbHNlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCXJldHVybiBvcHRpb25YbWw7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9HbG9zc2FyeUJ1aWxkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0dsb3NzYXJ5QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MWU5Y2MyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0dsb3NzYXJ5QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi54bWwuWFNMVFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5HdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5HdWlkYW5jZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuUHVibGlzaGluZ1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci0KLS8qKgotICogQnVpbGQgdGhlIGdsb3NzYXJ5IGZpbGUgZm9yIHRoZSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdsb3NzYXJ5QnVpbGRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHTE9TU0FSWV9CQUNLUEFUSCA9ICIuLy4uLyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJDbGFzcyA9IElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzczsKLQotCS8vIGdlbmVyYXRlZCBnbG9zc2FyeSBodG1sIGZpbGUgcmVsYXRpdmUgdG8gdGhlIHB1Ymxpc2hpbmcgZGlyCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdMT1NTQVJZX0hUTUxfRklMRSA9ICJwcm9jZXNzL2dsb3NzYXJ5Lmh0bSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHTE9TU0FSWV9JTkRFWF9IVE1MX0ZJTEUgPSAicHJvY2Vzcy9nbG9zc2FyeS9pbmRleC5odG0iOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdMT1NTQVJZX05BVklHX0hUTUxfRklMRSA9ICJwcm9jZXNzL2dsb3NzYXJ5L25hdmlnLmh0bSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHhzbCB0ZW1wbGF0ZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHTE9TU0FSWV9YU0xfRklMRSA9ICJ4c2wvZ2xvc3NhcnkueHNsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdMT1NTQVJZX0lOREVYX1hTTF9GSUxFID0gInhzbC9nbG9zc2FyeV9pbmRleC54c2wiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdMT1NTQVJZX05BVklHX1hTTF9GSUxFID0gInhzbC9nbG9zc2FyeV9uYXZpZy54c2wiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBsaXN0IHRvIGhvbGQgYWxsIGdsb3NzYXJ5IGl0ZW1zLgotCXByaXZhdGUgR2xvc3NhcnlMaXN0IGdsb3NzYXJ5SXRlbXMgPSBuZXcgR2xvc3NhcnlMaXN0KCk7Ci0KLQkvKioKLQkgKiBkZWZhdWx0IGNvbnN0cnVjdG9yCi0JICoKLQkgKi8KLQlwdWJsaWMgR2xvc3NhcnlCdWlsZGVyKCkgewotCi0JfQotCi0JLyoqCi0JICogYnVpbGQgdGhlIGdsb3NzYXJ5IGFuZCBnZW5lcmF0ZSB0aGUgcmVsYXRlZCBmaWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gcHViRGlyIFN0cmluZwotCSAqIEBwYXJhbSB0aXRsZSBTdHJpbmcgdGhlIHRpdGxlIG9mIHRoZSBnbG9zc2FyeSBwYWdlCi0JICogQHBhcmFtIG1vbml0b3IgSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBwdWJEaXIsCi0JCQlTdHJpbmcgdGl0bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWdsb3NzYXJ5SXRlbXMuY2xlYXIoKTsKLQkJSUZpbHRlciBjb25maWdGaWx0ZXIgPSBuZXcgQ29uZmlndXJhdGlvbkZpbHRlcihjb25maWcsIG51bGwpOwotCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldENvbmZpZ3VyYXRpb25WaWV3X0FkYXB0ZXJGYWN0b3J5KGNvbmZpZ0ZpbHRlcik7Ci0JCS8vIGl0ZXJhdGUgdGhydSBjb25maWd1cmF0aW9uIHRvIGdldCBhbGwgZ2xvc3NhcnkgaXRlbXMKLQkJaXRlcmF0ZShjb25maWcsIG1vbml0b3IpOwotCi0JCS8vIGNyZWF0ZSB0aGUgZ2xvc3NhcnkgZmlsZQotCQljcmVhdGVHbG9zc2FyeShwdWJEaXIsIHRpdGxlKTsKLQotCX0KLQotCS8qKgotCSAqIEl0ZXJhdGUgdGhydSB0aGUgY29uZmlndXJhdGlvbiB0cmVlIGFuZCBmaW5kIGFsbCB0ZXJtIGRlZmluaXRpb24gZWxlbWVudHMKLQkgKiBpbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGl0ZXJhdGUoT2JqZWN0IG9iaiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gR2V0IHRoZSBhZGFwdGVyIGZyb20gdGhlIGZhY3RvcnkuCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB0cmVlSXRlbUNvbnRlbnRQcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KG9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyQ2xhc3MpOwotCi0JCS8vIEVpdGhlciBkZWxlZ2F0ZSB0aGUgY2FsbCBvciByZXR1cm4gbm90aGluZy4KLQkJaWYgKHRyZWVJdGVtQ29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gaXRlbXMgPSB0cmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbihvYmopOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIGNyZWF0ZSBib29rbWFyawotCQkJCU9iamVjdCBpdG9yT2JqID0gTGlicmFyeVV0aWwudW53cmFwKGl0Lm5leHQoKSk7Ci0JCQkJaWYgKGl0b3JPYmogaW5zdGFuY2VvZiBHdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWl0ZXJhdGUoaXRvck9iaiwgbW9uaXRvcik7Ci0JCQkJfSBlbHNlIGlmIChpdG9yT2JqIGluc3RhbmNlb2YgR3VpZGFuY2VJdGVtUHJvdmlkZXIpIHsKLQkJCQkJaXRlcmF0ZShpdG9yT2JqLCBtb25pdG9yKTsKLQkJCQl9IGVsc2UgaWYgKGl0b3JPYmogaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbikgewotCQkJCQkvLyBjcmVhdGUgYSBnbG9zc2FyeSBlbnRyeSBmb3IgdGhlIFRlcm1EZWZpbml0aW9uCi0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihpdG9yT2JqKTsKLQkJCQkJZ2xvc3NhcnlJdGVtcy5hZGQoKFRlcm1EZWZpbml0aW9uKSBpdG9yT2JqKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVHbG9zc2FyeShTdHJpbmcgcHViRGlyLCBTdHJpbmcgdGl0bGUpIHsKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKFB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEluc3RhbGxVUkwoKSwKLQkJCQkJR0xPU1NBUllfWFNMX0ZJTEUpOwotCQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIlVuYWJsZSB0byBnZXQgZ2xvc3NhcnkgeHNsIHRlbXBsYXRlICIgKyBHTE9TU0FSWV9YU0xfRklMRSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCVN0cmluZyB4c2xfdXJpID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpLmdldFBhdGgoKTsKLQkJCVN0cmluZ0J1ZmZlciB4bWwgPSBnbG9zc2FyeUl0ZW1zLmdldFhtbCgpOwotCi0JCQlGaWxlIGYgPSBuZXcgRmlsZShwdWJEaXIsIEdMT1NTQVJZX0hUTUxfRklMRSk7Ci0JCQlGaWxlIHBhcmVudCA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQkJaWYgKCFwYXJlbnQuZXhpc3RzKCkpIHsKLQkJCQlwYXJlbnQubWtkaXJzKCk7Ci0JCQl9Ci0KLQkJCS8vIGdlZW5yYXRlIHRoZSBodG1sCi0JCQlQcm9wZXJ0aWVzIHhzbFBhcmFtcyA9IFB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByb3BlcnRpZXMoCi0JCQkJCSIveHNsL3Jlc291cmNlcy5wcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIFByb3BlcnRpZXMgeHNsUGFyYW1zID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCXhzbFBhcmFtcy5zZXRQcm9wZXJ0eSgidGl0bGUiLCB0aXRsZSk7IC8vJE5PTi1OTFMtMSQJCQkKLQkJCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCVhTTFRQcm9jZXNzb3IudHJhbnNmb3JtKHhzbF91cmksIHhtbC50b1N0cmluZygpLCB4c2xQYXJhbXMsIHN3KTsKLQkJCXN3LmZsdXNoKCk7Ci0JCQkvLyBTdHJpbmcgY29udGVudCA9IHN3LmdldEJ1ZmZlcigpLnRvU3RyaW5nKCk7Ci0KLQkJCS8vIG5lZWQgdG8gZGVjb2RlIHRoZSB1cmxzCi0JCQlTdHJpbmcgY29udGVudCA9IFJlc291cmNlSGVscGVyLmRlY29kZVVybHNJbkNvbnRlbnQoc3cuZ2V0QnVmZmVyKCkKLQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJRmlsZVV0aWwud3JpdGVVVEY4RmlsZShmLmdldEFic29sdXRlUGF0aCgpLCBmaXhDb250ZW50KGNvbnRlbnQpKTsKLQotCQkJLy8gLy8gZml4IHRoZSBlbGVtZW50IGxpbmtzCi0JCQkvLyBGaWxlV3JpdGVyIG91dHB1dCA9IG5ldyBGaWxlV3JpdGVyKGYpOwotCQkJLy8gb3V0cHV0LndyaXRlKGZpeENvbnRlbnQoY29udGVudCkpOwotCQkJLy8gb3V0cHV0LmZsdXNoKCk7Ci0JCQkvLyBvdXRwdXQuY2xvc2UoKTsKLQkJCXN3LmNsb3NlKCk7Ci0KLQkJCS8vIGFsc28gc2F2ZSB0aGUgZ2xvc3NhcnkgbmF2aWdhdGlvbiBoZWFkZXIgaHRtbCBmaWxlCi0JCQl1cmwgPSBuZXcgVVJMKFB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEluc3RhbGxVUkwoKSwKLQkJCQkJR0xPU1NBUllfSU5ERVhfWFNMX0ZJTEUpOwotCQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIlVuYWJsZSB0byBnZXQgZ2xvc3NhcnkgeHNsIHRlbXBsYXRlICIgKyBHTE9TU0FSWV9JTkRFWF9YU0xfRklMRSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXhzbF91cmkgPSBQbGF0Zm9ybS5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCQkJZiA9IG5ldyBGaWxlKHB1YkRpciwgR0xPU1NBUllfSU5ERVhfSFRNTF9GSUxFKTsKLQkJCXN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJWFNMVFByb2Nlc3Nvci50cmFuc2Zvcm0oeHNsX3VyaSwgeG1sLnRvU3RyaW5nKCksIHhzbFBhcmFtcywgc3cpOwotCQkJc3cuZmx1c2goKTsKLQotCQkJRmlsZVV0aWwud3JpdGVVVEY4RmlsZShmLmdldEFic29sdXRlUGF0aCgpLCBzdy50b1N0cmluZygpKTsKLQotCQkJc3cuY2xvc2UoKTsKLQotCQkJLy8gYWxzbyBzYXZlIHRoZSBnbG9zc2FyeSBuYXZpZ2F0aW9uIGhlYWRlciBodG1sIGZpbGUKLQkJCXVybCA9IG5ldyBVUkwoUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW5zdGFsbFVSTCgpLAotCQkJCQlHTE9TU0FSWV9OQVZJR19YU0xfRklMRSk7Ci0JCQlpZiAodXJsID09IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiVW5hYmxlIHRvIGdldCBnbG9zc2FyeSB4c2wgdGVtcGxhdGUgIiArIEdMT1NTQVJZX05BVklHX1hTTF9GSUxFKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJeHNsX3VyaSA9IFBsYXRmb3JtLnJlc29sdmUodXJsKS5nZXRQYXRoKCk7Ci0JCQlmID0gbmV3IEZpbGUocHViRGlyLCBHTE9TU0FSWV9OQVZJR19IVE1MX0ZJTEUpOwotCQkJc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQlYU0xUUHJvY2Vzc29yLnRyYW5zZm9ybSh4c2xfdXJpLCB4bWwudG9TdHJpbmcoKSwgeHNsUGFyYW1zLCBzdyk7Ci0JCQlzdy5mbHVzaCgpOwotCi0JCQlGaWxlVXRpbC53cml0ZVVURjhGaWxlKGYuZ2V0QWJzb2x1dGVQYXRoKCksIHN3LnRvU3RyaW5nKCkpOwotCi0JCQlzdy5jbG9zZSgpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBmaXhDb250ZW50KFN0cmluZyBzb3VyY2UpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlNYXRjaGVyIG0gPSBSZXNvdXJjZUhlbHBlci5wX2xpbmtfcmVmLm1hdGNoZXIoc291cmNlKTsKLQotCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCVN0cmluZyB1cmx0ZXh0ID0gbS5ncm91cCgxKTsKLQkJCVN0cmluZyBsaW5rZWRUZXh0ID0gbS5ncm91cCgyKTsKLQotCQkJdXJsdGV4dCA9IGZpeFVybFRleHQodXJsdGV4dCk7Ci0KLQkJCS8vIHVwZGF0ZSB0aGUgdXJsIHRleHQKLQkJCVN0cmluZyB0ZXh0ID0gIjxhICIgKyB1cmx0ZXh0ICsgIj4iICsgbGlua2VkVGV4dCArICI8L2E+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgdGV4dCk7Ci0JCX0KLQotCQltLmFwcGVuZFRhaWwoc2IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBmaXhVcmxUZXh0KFN0cmluZyB1cmx0ZXh0KSB7Ci0JCVN0cmluZyBndWlkID0gUmVzb3VyY2VIZWxwZXIuZ2V0R3VpZEZyb21VcmwodXJsdGV4dCk7Ci0JCWlmIChndWlkID09IG51bGwpIHsKLQkJCXJldHVybiB1cmx0ZXh0OwotCQl9Ci0KLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlNZXRob2RFbGVtZW50IGUgPSBtYW5hZ2VyICE9IG51bGwgPyBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCkKLQkJCQk6IG51bGw7Ci0JCWlmIChlID09IG51bGwpIHsKLQkJCXJldHVybiB1cmx0ZXh0OwotCQl9Ci0KLQkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgYSBUZXJtRGVmaW5pdGlvbiwgdXNlIHRoZSBib29rbWFyayBpbiB0aGUgZmlsZQotCQkvLyBvdGhlcndpc2UsIGZpbmQgdGhlIHBhdGggdG8gdGhlIGVsZW1lbnQKLQkJU3RyaW5nIGhyZWYgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZSBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKSB7Ci0JCQlocmVmID0gIiMiICsgZS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCS8vIG9uZSBsZXZlbCBiYWNrCi0JCQlocmVmID0gIi4uLyIgKyBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChlKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKSArIFJlc291cmNlSGVscGVyLmdldEZpbGVOYW1lKGUsICIuaHRtbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfbGlua19ocmVmX3BpY2tlcgotCQkJCS5tYXRjaGVyKCIgIiArIHVybHRleHQgKyAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKG0uZmluZCgpKSB7Ci0JCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCAiIGhyZWY9XCIiICsgaHJlZiArICJcIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQltLmFwcGVuZFRhaWwoc2IpOwotCi0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCi0JCXJldHVybiB1cmx0ZXh0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0dsb3NzYXJ5TGlzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvR2xvc3NhcnlMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYxNmI0OTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvR2xvc3NhcnlMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci0KLQotLyoqCi0gKiBIb2xkcyBhbGwgZ2xvc3NhcnkgaXRlbXMgYW5kIHNvcnQgdGhlbSBpbiBkZXNpcmVkIG9yZGVyIGdyb3VwZWQgYnkgZmlyc3QKLSAqIGxldHRlciBvZiB0aGUgZ2xvc3NhcnkgbmFtZSBUT0RPOiBBZGQgYSBicmllZiBkZXNjcmlwdGlvbiBmb3IgdGhpcyBjbGFzcy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdsb3NzYXJ5TGlzdCB7Ci0KLQkvLyB1c2luZyB0aGUgZGVmYXVsdCBvcmRlciBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGV4cGxvcmVyLgotCS8vIG1heWJlIGEgc3BlY2lhbCBzb3J0ZWQgbGlzdCBsYXRlciwKLQkvLyBUcmVlTWFwIG9mIHRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlIGdsb3NzYXJ5IG1hcCB0byBhIChTb3J0ZWQpIExpc3Qgb2YKLQkvLyBnbG9zc2FyeSBJdGVtcwotCXByaXZhdGUgVHJlZU1hcCBpdGVtTWFwID0gbmV3IFRyZWVNYXAoKTsKLQotCS8qKgotCSAqIGRlZmF1bHQgY29uc3RydWN0b3IKLQkgKgotCSAqLwotCXB1YmxpYyBHbG9zc2FyeUxpc3QoKSB7Ci0JfQotCi0JLyoqCi0JICogaW5pdGlhbGl6ZSB0aGUgbGlzdAotCSAqCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWl0ZW1NYXAuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgYSBUZXJtRGVmaW5pdGlvbiBpbnRvIHRoZSBnbG9zc2FyeSBsaXN0Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgVGVybURlZmluaXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoVGVybURlZmluaXRpb24gZWxlbWVudCkgewotCQlTdHJpbmcgbmFtZSA9IFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShlbGVtZW50KTsKLQkJU3RyaW5nIGdyb3VwID0gIiIgKyBuYW1lLmNoYXJBdCgwKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRJdGVtTGlzdChncm91cCkuYWRkKGVsZW1lbnQpOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRJdGVtTGlzdChTdHJpbmcgZ3JvdXApIHsKLQkJZ3JvdXAgPSBncm91cC50b1VwcGVyQ2FzZSgpOwotCQlMaXN0IGwgPSAoTGlzdCkgaXRlbU1hcC5nZXQoZ3JvdXApOwotCQlpZiAobCA9PSBudWxsKSB7Ci0JCQlsID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaXRlbU1hcC5wdXQoZ3JvdXAsIGwpOwotCQl9Ci0KLQkJcmV0dXJuIGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB4bWwgZG9jdW1lbnQgZm9yIHRoZSBsaXN0Ci0JICogCi0JICogQHJldHVybiBTdHJpbmdCdWZmZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGdldFhtbCgpIHsKLQkJWG1sRWxlbWVudCB4ZSA9IG5ldyBYbWxFbGVtZW50KCJHbG9zc2FyeSIpOyAvLyROT04tTkxTLTEkCi0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1NYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgZ3JvdXAgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCUxpc3QgaXRlbXMgPSAoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKTsKLQotCQkJLy8gY3JlYXRlIGEgYm9va21hcmsgZm9yIHRoZSBncm91cAotCQkJeGUubmV3Q2hpbGQoIml0ZW0iKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBncm91cCkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJwcmVzZW50YXRpb25OYW1lIiwgZ3JvdXApIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgibmF2aWdhdGlvbi1tYXJrIiwgInRydWUiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJLnNldEF0dHJpYnV0ZSgiY29udGVudCIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCS8vIHRoZW4gY3JlYXRlIGVudHJ5IGZvciBlYWNoIGl0ZW0KLQkJCWZvciAoSXRlcmF0b3IgaXRJdGVtID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRJdGVtLmhhc05leHQoKTspIHsKLQkJCQlUZXJtRGVmaW5pdGlvbiBlbGVtZW50ID0gKFRlcm1EZWZpbml0aW9uKSBpdEl0ZW0ubmV4dCgpOwotCQkJCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZWxlbWVudCk7Ci0JCQkJU3RyaW5nIGNvbnRlbnQgPSBlbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldE1haW5EZXNjcmlwdGlvbigpOwotCi0JCQkJLy8gZml4IHRoZSBsaW5rcyBpbiB0aGUgY29udGVudAotCQkJCWNvbnRlbnQgPSBSZXNvdXJjZUhlbHBlci5maXhDb250ZW50VXJsUGF0aChjb250ZW50LAotCQkJCQkJUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoZWxlbWVudCksCi0JCQkJCQlHbG9zc2FyeUJ1aWxkZXIuR0xPU1NBUllfQkFDS1BBVEgpOwotCi0JCQkJeGUubmV3Q2hpbGQoIml0ZW0iKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgicHJlc2VudGF0aW9uTmFtZSIsIHByZXNlbnRhdGlvbk5hbWUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoImNvbnRlbnQiLCBjb250ZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHhlLnRvWG1sKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9JU2l0ZUdlbmVyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvSVNpdGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGY3Zjg2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9JU2l0ZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5Cb29rbWFyazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSHRtbEJ1aWxkZXI7Ci0KLS8qKgotICogZGVmaW5lIHRoZSBpbnRlcmZhY2UgZm9yIHNpdGUgZ2VuZXJhdG9yLiAKLSAqIEVhY2ggcHVibGlzaGVyIHNob3VsZCBpbXBsZW1lbnQgYSBzaXRlIGdlbmVyYXRvciB0byBoYW5kbGUgdGhlIHNpdGUgZ2VuZXJhdGlvbiBwcm9wZXJseS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNpdGVHZW5lcmF0b3IgewotCQkJCi0JcHVibGljIHZvaWQgcHJlUHVibGlzaCgpIHRocm93cyBFeGNlcHRpb247Ci0JcHVibGljIHZvaWQgcG9zdFB1Ymxpc2goKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JcHVibGljIHZvaWQgd3JpdGVQdWJsaXNoZWRCb29rbWFya3MoTGlzdCBib29rbWFya3MsIEJvb2ttYXJrIGRlZmF1bHRWaWV3KSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JcHVibGljIEh0bWxCdWlsZGVyIGdldEh0bWxCdWlsZGVyKCk7Ci0JcHVibGljIFB1Ymxpc2hPcHRpb25zIGdldFB1Ymxpc2hPcHRpb25zKCk7Ci0JcHVibGljIFN0cmluZyBnZXRJbmRleEZpbGVQYXRoKCk7Ci0JcHVibGljIFN0cmluZyBnZXROb2RlSWNvblBhdGgoKTsgCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9JbmRleEJ1aWxkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0luZGV4QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Y2VlOWU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0luZGV4QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnhtbC5YU0xUUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotCi0KLS8qKgotICogQnVpbGQgdGhlIGdsb3NzYXJ5IGZpbGUgZm9yIHRoZSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEluZGV4QnVpbGRlciB7Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyQ2xhc3MgPSBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3M7Ci0KLQkvLyBnZW5lcmF0ZWQgZ2xvc3NhcnkgaHRtbCBmaWxlIHJlbGF0aXZlIHRvIHRoZSBwdWJsaXNoaW5nIGRpcgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFWF9IVE1MX0ZJTEUgPSAiaW5kZXgvY29udGVudHMuaHRtIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVYX05BVklHX0hUTUxfRklMRSA9ICJpbmRleC9uYXZpZy5odG0iOyAvLyROT04tTkxTLTEkCi0KLQkvLyB4c2wgdGVtcGxhdGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVhfWFNMX0ZJTEUgPSAieHNsL2luZGV4X2NvbnRlbnRzLnhzbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFWF9OQVZJR19YU0xfRklMRSA9ICJ4c2wvaW5kZXhfbmF2aWcueHNsIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gbGlzdCB0byBob2xkIGFsbCBnbG9zc2FyeSBpdGVtcy4KLQlwcml2YXRlIEluZGV4TGlzdCBpbmRleEl0ZW1zID0gbmV3IEluZGV4TGlzdCgpOwotCi0JLyoqCi0JICogZGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqCi0JICovCi0JcHVibGljIEluZGV4QnVpbGRlcigpIHsKLQotCX0KLQotCS8qKgotCSAqIGJ1aWxkIHRoZSBpbmRleCBmb3IgdGhlIHB1Ymxpc2hlZCBzaXRlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBwdWJEaXIgU3RyaW5nCi0JICogQHBhcmFtIHRpdGxlIFN0cmluZyB0aGUgdGl0bGUgZm9yIHRoZSBnbG9zc2FyeSBpbmRleCBwYWdlCi0JICogQHBhcmFtIG1vbml0b3IgSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBwdWJEaXIsCi0JCQlTdHJpbmcgdGl0bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpbmRleEl0ZW1zLmNsZWFyKCk7Ci0JCUlGaWx0ZXIgY29uZmlnRmlsdGVyID0gbmV3IENvbmZpZ3VyYXRpb25GaWx0ZXIoY29uZmlnLCBudWxsKTsKLQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRDb25maWd1cmF0aW9uVmlld19BZGFwdGVyRmFjdG9yeShjb25maWdGaWx0ZXIpOwotCQkvLyBpdGVyYXRlIHRocnUgY29uZmlndXJhdGlvbiB0byBnZXQgYWxsIGdsb3NzYXJ5IGl0ZW1zCi0JCWl0ZXJhdGUoY29uZmlnKTsKLQotCQkvLyBjcmVhdGUgdGhlIGdsb3NzYXJ5IGZpbGUKLQkJY3JlYXRlSW5kZXgocHViRGlyLCB0aXRsZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBJdGVyYXRlIHRocnUgdGhlIGNvbmZpZ3VyYXRpb24gdHJlZSBhbmQgZmluZCBhbGwgdGVybSBkZWZpbml0aW9uIGVsZW1lbnRzCi0JICogaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByaXZhdGUgdm9pZCBpdGVyYXRlKE9iamVjdCBvYmopIHsKLQkJLy8gR2V0IHRoZSBhZGFwdGVyIGZyb20gdGhlIGZhY3RvcnkuCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB0cmVlSXRlbUNvbnRlbnRQcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KG9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyQ2xhc3MpOwotCi0JCS8vIEVpdGhlciBkZWxlZ2F0ZSB0aGUgY2FsbCBvciByZXR1cm4gbm90aGluZy4KLQkJaWYgKHRyZWVJdGVtQ29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gaXRlbXMgPSB0cmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbihvYmopOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkvLyBjcmVhdGUgYm9va21hcmsKLQkJCQlPYmplY3QgaXRvck9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChpdC5uZXh0KCkpOwotCQkJCWlmIChpdG9yT2JqIGluc3RhbmNlb2YgR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcikgewotCQkJCQlpdGVyYXRlKGl0b3JPYmopOwotCQkJCX0gZWxzZSBpZiAoaXRvck9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWl0ZXJhdGUoaXRvck9iaik7Ci0JCQkJfSBlbHNlIGlmIChpdG9yT2JqIGluc3RhbmNlb2YgVGVybURlZmluaXRpb24pIHsKLQkJCQkJLy8gaW5kZXggdGhlIHRlcm0gZGVmaW5pdGlvbiBvYmplY3RzCi0JCQkJCVRlcm1EZWZpbml0aW9uIHRlcm0gPSAoVGVybURlZmluaXRpb24pIGl0b3JPYmo7Ci0JCQkJCVN0cmluZyBuYW1lID0gdGVybS5nZXROYW1lKCk7Ci0JCQkJCVN0cmluZyBjb250ZW50ID0gImRlZmluaXRpb24gaW4gZ2xvc3NhcnkiOyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyB1cmwgPSAiLi4vZ2xvc3NhcnkvZ2xvc3NhcnkuaHRtIyIgKyB0ZXJtLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpbmRleEl0ZW1zLmFkZChuYW1lLCBjb250ZW50LCB1cmwpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUluZGV4KFN0cmluZyBwdWJEaXIsIFN0cmluZyB0aXRsZSkgewotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwoUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW5zdGFsbFVSTCgpLAotCQkJCQlJTkRFWF9YU0xfRklMRSk7Ci0JCQlpZiAodXJsID09IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiVW5hYmxlIHRvIGdldCBpbmRleCB4c2wgdGVtcGxhdGUgIiArIElOREVYX1hTTF9GSUxFKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJU3RyaW5nIHhzbF91cmkgPSBQbGF0Zm9ybS5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCQkJU3RyaW5nQnVmZmVyIHhtbCA9IGluZGV4SXRlbXMuZ2V0WG1sKCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oeG1sKTsKLQotCQkJRmlsZSBmID0gbmV3IEZpbGUocHViRGlyLCBJTkRFWF9IVE1MX0ZJTEUpOwotCQkJRmlsZSBwYXJlbnQgPSBmLmdldFBhcmVudEZpbGUoKTsKLQkJCWlmICghcGFyZW50LmV4aXN0cygpKSB7Ci0JCQkJcGFyZW50Lm1rZGlycygpOwotCQkJfQotCi0JCQkvLyBnZWVucmF0ZSB0aGUgaHRtbAotCQkJUHJvcGVydGllcyB4c2xQYXJhbXMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJeHNsUGFyYW1zLnNldFByb3BlcnR5KCJ0aXRsZSIsIHRpdGxlKTsgLy8kTk9OLU5MUy0xJAkJCQotCQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJWFNMVFByb2Nlc3Nvci50cmFuc2Zvcm0oeHNsX3VyaSwgeG1sLnRvU3RyaW5nKCksIHhzbFBhcmFtcywgc3cpOwotCQkJc3cuZmx1c2goKTsKLQkJCVN0cmluZyBjb250ZW50ID0gc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsKLQotCQkJLy8gZml4IHRoZSBlbGVtZW50IGxpbmtzCi0JCQlGaWxlV3JpdGVyIG91dHB1dCA9IG5ldyBGaWxlV3JpdGVyKGYpOwotCQkJb3V0cHV0LndyaXRlKGNvbnRlbnQpOwotCQkJb3V0cHV0LmZsdXNoKCk7Ci0JCQlvdXRwdXQuY2xvc2UoKTsKLQotCQkJLy8gYWxzbyBzYXZlIHRoZSBnbG9zc2FyeSBuYXZpZ2F0aW9uIGhlYWRlciBodG1sIGZpbGUKLQkJCXVybCA9IG5ldyBVUkwoUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW5zdGFsbFVSTCgpLAotCQkJCQlJTkRFWF9OQVZJR19YU0xfRklMRSk7Ci0JCQlpZiAodXJsID09IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiVW5hYmxlIHRvIGdldCBnbG9zc2FyeSB4c2wgdGVtcGxhdGUgIiArIElOREVYX05BVklHX1hTTF9GSUxFKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJeHNsX3VyaSA9IFBsYXRmb3JtLnJlc29sdmUodXJsKS5nZXRQYXRoKCk7Ci0JCQlmID0gbmV3IEZpbGUocHViRGlyLCBJTkRFWF9OQVZJR19IVE1MX0ZJTEUpOwotCQkJb3V0cHV0ID0gbmV3IEZpbGVXcml0ZXIoZik7Ci0JCQlYU0xUUHJvY2Vzc29yLnRyYW5zZm9ybSh4c2xfdXJpLCB4bWwudG9TdHJpbmcoKSwgeHNsUGFyYW1zLCBvdXRwdXQpOwotCQkJb3V0cHV0LmZsdXNoKCk7Ci0JCQlvdXRwdXQuY2xvc2UoKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9JbmRleExpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0luZGV4TGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZTdiMThjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0luZGV4TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci0KLS8qKgotICogSG9sZHMgYWxsIGdsb3NzYXJ5IGl0ZW1zIGFuZCBzb3J0IHRoZW0gaW4gZGVzaXJlZCBvcmRlciBncm91cGVkIGJ5IGZpcnN0Ci0gKiBsZXR0ZXIgb2YgdGhlIGdsb3NzYXJ5IG5hbWUgVE9ETzogQWRkIGEgYnJpZWYgZGVzY3JpcHRpb24gZm9yIHRoaXMgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmRleExpc3QgewotCi0JLy8gdXNpbmcgdGhlIGRlZmF1bHQgb3JkZXIgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBleHBsb3Jlci4KLQkvLyBtYXliZSBhIHNwZWNpYWwgc29ydGVkIGxpc3QgbGF0ZXIsCi0JLy8gVHJlZU1hcCBvZiB0aGUgZmlyc3QgbGV0dGVyIG9mIHRoZSBnbG9zc2FyeSBtYXAgdG8gYSAoU29ydGVkKSBMaXN0IG9mCi0JLy8gZ2xvc3NhcnkgSXRlbXMKLQlwcml2YXRlIFRyZWVNYXAgaXRlbU1hcCA9IG5ldyBUcmVlTWFwKCk7Ci0KLQkvKioKLQkgKiBkZWZhdWx0IGNvbnN0cnVjdG9yCi0JICoKLQkgKi8KLQlwdWJsaWMgSW5kZXhMaXN0KCkgewotCX0KLQotCS8qKgotCSAqIGluaXNsaXplIHRoZSBsaXN0Ci0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaXRlbU1hcC5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIGFkZCBhbiBlbnRyeSB0byB0aGUgbGlzdAotCSAqIAotCSAqIEBwYXJhbSB0ZXJtIFN0cmluZwotCSAqIEBwYXJhbSBjb250ZW50IFN0cmluZwotCSAqIEBwYXJhbSB1cmwgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgYWRkKFN0cmluZyB0ZXJtLCBTdHJpbmcgY29udGVudCwgU3RyaW5nIHVybCkgewotCQlJbmRleEl0ZW0gaXRlbSA9IG5ldyBJbmRleEl0ZW0odGVybSwgY29udGVudCwgdXJsKTsKLQkJU3RyaW5nIGdyb3VwID0gIiIgKyBpdGVtLnRlcm1OYW1lLmNoYXJBdCgwKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRJdGVtTGlzdChncm91cCkuYWRkKGl0ZW0pOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRJdGVtTGlzdChTdHJpbmcgZ3JvdXApIHsKLQkJZ3JvdXAgPSBncm91cC50b1VwcGVyQ2FzZSgpOwotCQlMaXN0IGwgPSAoTGlzdCkgaXRlbU1hcC5nZXQoZ3JvdXApOwotCQlpZiAobCA9PSBudWxsKSB7Ci0JCQlsID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaXRlbU1hcC5wdXQoZ3JvdXAsIGwpOwotCQl9Ci0KLQkJcmV0dXJuIGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB4bWwgZG9jdW1lbnQgZm9yIHRoZSBsaXN0Ci0JICogCi0JICogQHJldHVybiBTdHJpbmdCdWZmZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGdldFhtbCgpIHsKLQkJWG1sRWxlbWVudCB4ZSA9IG5ldyBYbWxFbGVtZW50KCJJbmRleCIpOyAvLyROT04tTkxTLTEkCi0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1NYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgZ3JvdXAgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCUxpc3QgaXRlbXMgPSAoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKTsKLQotCQkJLy8gY3JlYXRlIGEgYm9va21hcmsgZm9yIHRoZSBncm91cAotCQkJeGUubmV3Q2hpbGQoIml0ZW0iKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBncm91cCkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJwcmVzZW50YXRpb25OYW1lIiwgZ3JvdXApIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgibmF2aWdhdGlvbi1tYXJrIiwgInRydWUiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJLnNldEF0dHJpYnV0ZSgiY29udGVudCIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCS8vIHRoZW4gY3JlYXRlIGVudHJ5IGZvciBlYWNoIGl0ZW0KLQkJCWZvciAoSXRlcmF0b3IgaXRJdGVtID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRJdGVtLmhhc05leHQoKTspIHsKLQkJCQlJbmRleEl0ZW0gaXRlbSA9IChJbmRleEl0ZW0pIGl0SXRlbS5uZXh0KCk7Ci0JCQkJeGUubmV3Q2hpbGQoIml0ZW0iKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgaXRlbS50ZXJtTmFtZSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgicHJlc2VudGF0aW9uTmFtZSIsIGl0ZW0udGVybU5hbWUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoImNvbnRlbnQiLCBpdGVtLmNvbnRlbnQpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoInVybCIsIGl0ZW0udXJsKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHhlLnRvWG1sKCk7Ci0JfQotCi0JY2xhc3MgSW5kZXhJdGVtIHsKLQkJcHVibGljIFN0cmluZyB0ZXJtTmFtZTsKLQotCQlwdWJsaWMgU3RyaW5nIGNvbnRlbnQ7Ci0KLQkJcHVibGljIFN0cmluZyB1cmw7Ci0KLQkJcHVibGljIEluZGV4SXRlbShTdHJpbmcgdGVybU5hbWUsIFN0cmluZyBjb250ZW50LCBTdHJpbmcgdXJsKSB7Ci0JCQl0aGlzLnRlcm1OYW1lID0gdGVybU5hbWU7Ci0JCQl0aGlzLmNvbnRlbnQgPSBjb250ZW50OwotCQkJdGhpcy51cmwgPSB1cmw7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1Byb2Nlc3NQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHJvY2Vzc1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc2ODZjNzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHJvY2Vzc1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGNvbnRlbnQgdmFsaWRhdG9yIGZvciBwdWJsaXNoaW5nIGEgcHJvY2VzcyBjbG9zdXJlLiAKLSAqIFRoZSB2YWxpZGF0b3Igd2lsbCBjaGVjayBlbGVtZW50cyBhZ2FpbnN0IHRoZSBwcm9jZXNzIGNsb3N1cmUgYW5kIGRldGVybWluZSBpZiAKLSAqIGFuIGVsZW1lbnQgc2hvdWxkIGJlIHB1Ymxpc2hlZCBvciBub3QuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yIGV4dGVuZHMgUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPU1VSRV9MT0dfRklMRU5BTUUgPSAicHJvY2Vzc0Nsb3N1cmUuaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGNsb3N1cmUgZWxlbWVudHMgZm9yIHByb2Nlc3MgcHVibGlzaGluZywgbnVsbCBmb3IgY29uZmlnIHB1Ymxpc2hpbmcKLQlMaXN0IGNsb3N1cmVFbGVtZW50cyA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGlzRmluYWxDbG9zdXJlID0gZmFsc2U7Ci0JCi0vLwkvLyBtYWludGFpbiB0aGUgb2JqZWN0IHJlZmVyZW5jZXMgZ2VuZXJhdGVkIGZyb20gVGFza0Rlc2NyaXB0b3JzCi0vLwkvLyBtYXAgb2Ygb3duZXIgZWxlbWVudCB0byBhIGxpc3Qgb2YgcmVmZXJlbmNlZCBlbGVtZW50cwotLy8JTWFwIG9ialJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZyA9IFB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCi0JcHJvdGVjdGVkIFByaW50U3RyZWFtIGNsb3N1cmVMb2cgPSBudWxsOwotCQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHB1YkRpciBTdHJpbmcKLQkgKiBAcGFyYW0gdmFsaWRhdGVFeHRlcm5hbExpbmtzIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yKFN0cmluZyBwdWJEaXIsIGJvb2xlYW4gdmFsaWRhdGVFeHRlcm5hbExpbmtzKSB7Ci0JCXN1cGVyKHB1YkRpciwgdmFsaWRhdGVFeHRlcm5hbExpbmtzKTsKLQkJCi0JCWNsb3N1cmVMb2cgPSBnZXRTdHJlYW0oQ0xPU1VSRV9MT0dfRklMRU5BTUUpOwotCQliZWdpbkNsb3N1cmVMb2coKTsKLQotCX0KLQotCS8qKgotCSAqIGFkZCB0aGUgZWxlbWVudHMgdG8gdGhlIHByb2Nlc3MgY2xvc3VyZS4KLQkgKiBAcGFyYW0gaXRlbXMgTGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENsb3N1cmVFbGVtZW50cyhMaXN0IGl0ZW1zKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQkJaWYgKCBjbG9zdXJlRWxlbWVudHMgPT0gbnVsbCApIHsKLQkJCWNsb3N1cmVFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQkKLQkJY2xvc3VyZUVsZW1lbnRzLmFkZEFsbChpdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogCW1ha2UgZWxlbWVudCBjbG9zdXJlIAotCSAqICBhbGwgdGhlIHB1Ymxpc2hlZCBhbmQgcmVmZXJlbmNlZCBlbGVtZW50cyBhcmUgdGhlIGVsZW1lbnQgY2xvc3VyZS4gCi0JICogIHNpbmNlIHRoZXkgYXJlIGFsbCB0aGUgZWxlbWVudHMgcmVmZXJlbmNlZCBieSB0aGUgcHJvY2Vzc2VzIGFuZCB0aGVpciByZWxhdGVkIHByb2Nlc3MgZWxlbWVudHMuIAotCSAqLwotCXB1YmxpYyB2b2lkIG1ha2VFbGVtZW50Q2xvc3VyZSgpIHsKLQkJdGhpcy5pc0ZpbmFsQ2xvc3VyZSA9IHRydWU7Ci0JCQotCQllbmRDbG9zdXJlTG9nKCk7Ci0JCQotCQkvLyB0ZXN0Ci0JCWlmICggZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PSBDbG9zdXJlIGVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjbG9zdXJlRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpKSk7Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT0gQ2xvc3VyZSBlbGVtZW50cyBlbmQgPT09PT09PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCS8qKgotCSAqIGNoZWNrIGlmIGEgY2xvc3VyZSBpcyBjcmVhdGVkIG9yIG5vdC4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDbG9zdXJlKCkgewotCQlyZXR1cm4gKGNsb3N1cmVFbGVtZW50cyAhPSBudWxsKSAmJiAoY2xvc3VyZUVsZW1lbnRzLnNpemUoKSA+IDApOwotCX0KLQkKLQkvKioKLQkgKiBkZXRlcm1pbmUgaWYgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIHByb2Nlc3MgZWxlbWVudCBjbG9zdXJlIG9yIG5vdAotCSAqIFRoZSBwcm9jZXNzIGVsZW1lbnQgY2xvc3VyZSBjb250YWlucyBhbGwgdGhlIHByb2Nlc3MgZWxlbWVudHMgb2YgdGhlIHNlbGVjdGVkIHByb2Nlc3NlcywgCi0JICogcGx1cyBhbGwgdGhlIGNvbnRlbnQgZWxlbWVudHMgdGhvc2UgZWxlbWVudHMgcmVmZXJlbmNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZSBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW5DbG9zdXJlKE1ldGhvZEVsZW1lbnQgZSkgewotCQkKLQkJaWYgKCBlID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmICggIWhhc0Nsb3N1cmUoKSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlpZiAoIGUgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJLy8gMTY2MDQ4IC0gY2hlY2staXRlbXMsIHRhc2stc3RlcHMgZG9uJ3QgYXBwZWFyIHdoZW4gdXNpbmcgdGhlIHB1Ymxpc2hpbmcgdHlwZSAicHVibGlzaCB0aGUgcHJvY2Vzc2VzIHNlbGVjdGVkIGJlbG93IgotCQlpZiAoIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNEZXNjcmlwdGlvbkVsZW1lbnQoZSkgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKCBjbG9zdXJlRWxlbWVudHMuY29udGFpbnMoZSkgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKCAhKGUgaW5zdGFuY2VvZiBHdWlkYW5jZSkgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmICggZSBpbnN0YW5jZW9mIFByYWN0aWNlIAotCQkJCXx8IGUgaW5zdGFuY2VvZiBSb2FkbWFwIAotCQkJCXx8IGUgaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwgCi0JCQkJfHwgZSBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uICkKLQkJewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgZGlzY2FyZGVkIG9yIG5vdAotCSAqIGRpc2NhcmRlZCBlbGVtZW50cyB3aWxsIGJlIHRyZWF0ZWQgYXMgb3V0IHNpZGUgdGhlIGNvbmZpZ3Vyc2F0aW9uCi0JICogCi0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQgdGhlIG93bmVyIG9mIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUgT2JqZWN0IEVTdHJ1Y3R1cmFsRmVhdHVyZSBvciBPcHBvc2l0ZUZlYXR1cmUKLQkgKiBAcGFyYW0gZSBNZXRob2RFbGVtZW50IHRoZSBlbGVtZW50IHRvIGJlIGNoZWNrZWQKLQkgKi8KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLnJtYy5saWJyYXJ5LmxheW91dC5JQ29udGVudFZhbGlkYXRvciNpc0Rpc2NhcmRlZChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQsIGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc2NhcmRlZChNZXRob2RFbGVtZW50IG93bmVyLCBPYmplY3QgZmVhdHVyZSwgTWV0aG9kRWxlbWVudCBlKSB7Ci0JCi0JCWlmICggb3duZXIgPT0gbnVsbCApIHsKLQkJCW93bmVyID0gZGVmYXVsdFRhcmdldDsKLQkJfSBlbHNlIGlmICggZGVmYXVsdFRhcmdldCAhPSBudWxsICYmIG93bmVyICE9IGRlZmF1bHRUYXJnZXQgKSB7Ci0JCQkKLQkJCXN1cGVyLmxvZ1dhcm5pbmcoIlRhcmdldCBtaXNtYXRjaCIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShvd25lcikgKyAiPC0tLT4iICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZGVmYXVsdFRhcmdldCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQkKLQkJaWYgKCBzdXBlci5pc0Rpc2NhcmRlZChvd25lciwgZmVhdHVyZSwgZSkgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJYm9vbGVhbiBpbkNscyA9IGluQ2xvc3VyZShlKTsKLQkJaWYgKCFpbkNscyAmJiAhaXNGaW5hbENsb3N1cmUgKSB7Ci0JCQkvLyBpZiB0aGUgY2xvc3VyZSBpcyBub3QgZmluYWwsIHRoZW4gaWYgdGhlIG93bmVyIGlzIGluIGNsb3N1cmUgYW5kIHRoZSBlbGVtZW50IGlzIGEgR3VpZGFuY2UsIAotCQkJLy8gdGhpcyBlbGVtZW50IGlzIGFsc28gaW4gY2xvc3VyZQotCQkJaW5DbHMgPSBpbkNsb3N1cmUob3duZXIpICYmIChlIGluc3RhbmNlb2YgR3VpZGFuY2UpOwotCQl9Ci0JCQotCQlpZiAoICFpbkNscyApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotLy8JCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIFRhc2tzCi0vLwkJaWYgKCBvd25lciBpbnN0YW5jZW9mIFRhc2sgKSB7Ci0vLwkJCWlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgfHwgCi0vLwkJCQkJZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCkgfHwKLS8vCQkJCQlmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpIHx8IAotLy8JCQkJCWZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKSApIHsKLS8vCQkJCUxpc3QgcmVmcyA9IChMaXN0KW9ialJlZmVyZW5jZXMuZ2V0KG93bmVyKTsKLS8vCQkJCWlmICggcmVmcyAhPSBudWxsICYmICFyZWZzLmNvbnRhaW5zKGUpICkgewotLy8JCQkJCXJldHVybiB0cnVlOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkKLQkvKioKLQkgKiBkaXNwb3NlIHRoZSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkKLQkJaWYgKCBjbG9zdXJlRWxlbWVudHMgIT0gbnVsbCApIHsKLQkJCWNsb3N1cmVFbGVtZW50cy5jbGVhcigpOwotCQl9Ci0JCQotLy8JCWlmICggb2JqUmVmZXJlbmNlcyAhPSBudWxsICkgewotLy8JCQlvYmpSZWZlcmVuY2VzLmNsZWFyKCk7Ci0vLwkJfQotCQkKLQkJaWYgKCBjbG9zdXJlTG9nICE9IG51bGwgKSB7Ci0JCQljbG9zdXJlTG9nLmNsb3NlKCk7Ci0JCQljbG9zdXJlTG9nID0gbnVsbDsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJlZ2luQ2xvc3VyZUxvZygpIHsKLQkJY2xvc3VyZUxvZy5wcmludGxuKCI8dGFibGU+Iik7Ci0JCWFkZExvZ0VudHJ5KCI8Yj5FbGVtZW50PC9iPiIsICI8Yj5SZWZlcmVuY2VkIEJ5PC9iPiIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZW5kQ2xvc3VyZUxvZygpIHsKLQkJY2xvc3VyZUxvZy5wcmludGxuKCI8L3RhYmxlPiIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkTG9nRW50cnkoU3RyaW5nIHN0cjEsIFN0cmluZyBzdHIyKSB7Ci0JCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQliLmFwcGVuZCgiPHRyPjx0ZD4iKS5hcHBlbmQoc3RyMSkuYXBwZW5kKCI8L3RkPjx0ZD4iKS5hcHBlbmQoc3RyMikuYXBwZW5kKCI8L3RkPjwvdHI+Iik7Ci0JCWNsb3N1cmVMb2cucHJpbnRsbihiKTsKLQl9Ci0JCi0JLyoqCi0JICogbG9nIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQgdGhlIHJlZmVyZW5jaW5nIGVsZW1lbnQKLQkgKiBAcGFyYW0gZSBNZXRob2RFbGVtZW50IHRoZSByZWZlcmVuY2VkIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBvd25lciwgTWV0aG9kRWxlbWVudCBlKQotCXsKLQkJc3VwZXIubG9nUmVmZXJlbmNlKG93bmVyLCBlKTsKLQkJaWYgKCBlIGluc3RhbmNlb2YgRGVzY3JpcHRvciApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKCAhaXNGaW5hbENsb3N1cmUgJiYgY2xvc3VyZUxvZyAhPSBudWxsKSB7Ci0JCQkKLQkJCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJaWYgKCBvd25lciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQgKSB7Ci0JCQkJYi5hcHBlbmQoZ2V0QnJlYWtkb3duRWxlbWVudExhYmVsKChCcmVha2Rvd25FbGVtZW50KW93bmVyKSk7Ci0JCQl9IGVsc2UgaWYgKCBvd25lciAhPSBudWxsICkgewotCQkJCWIuYXBwZW5kKExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG93bmVyKSk7Ci0JCQl9Ci0JCQkKLQkJCWFkZExvZ0VudHJ5KExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGUpLCBiLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGdldEJyZWFrZG93bkVsZW1lbnRMYWJlbChCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWIuYXBwZW5kKExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGUpKTsKLQotCQl3aGlsZSAoIChlPWUuZ2V0U3VwZXJBY3Rpdml0aWVzKCkpICE9IG51bGwgKSB7Ci0JCQliLmluc2VydCgwLCBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlKSArICIvIik7Ci0JCX0KLQkJCi0JCXJldHVybiBiOwotCX0KLQkJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9Qcm9jZXNzUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHJvY2Vzc1B1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDgxZjlhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9Qcm9jZXNzUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBFbGVtZW50UmVhbGl6ZXIgZm9yIHByb2Nlc3MgcHVibGlzaGluZy4KLSAqIFJlYWxpemVzIHRoZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uLCByZWFsaXplIG9wdGlvbnMsIGFuZCB0aGUgcHJvY2VzcyBjbG9zdXJlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1B1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIgZXh0ZW5kcyBQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyIHsKLQkKLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSB2YWxpZGF0b3IgUHJvY2Vzc1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yCi0JICovCi0JcHVibGljIFByb2Nlc3NQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQcm9jZXNzUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXN1cGVyKGNvbmZpZywgdmFsaWRhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiByZWFsaXplIHRoZSBlbGVtZW50LiAKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBNZXRob2RFbGVtZW50IHRoZSByZWFsaXplZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IHJlYWxpemUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCQotCQlyZXR1cm4gc3VwZXIucmVhbGl6ZShlbGVtZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogcmVhbGl6ZSB0aGUgbGlzdCBvZiBmZWF0dXJlIHZhbHVlcyBhbmQgcmV0dXJucyBhIG5ldyBsaXN0IG9mIHZhbHVlcwotCSAqIFRoZSBuZXcgbWlnaHQgYmUgYSByZS1zb3J0aW5nIG9mIHRoZSBvcmlnaW5hbCBsaXN0IAotCSAqIG9yIHNvbWUgb2YgdGhlIHZhbHVlcyBjYW4gYmUgZmlsdGVyZWQgb3V0LCBkZXBlbmRpbmcgb24gdGhlIGRldGFpbCBpbXBsZW1lbnRhdGlvbgotCSAqIE5vdGU6IHRoZSBsaXN0IHZhbHVlIHBhc3NlZCBpbiBtaWdodCBiZSB1cGRhdGVkIGFzIHdlbGwuCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlIEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIEBwYXJhbSB2YWx1ZXMgTGlzdAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IHJlYWxpemUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCAKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBMaXN0IHZhbHVlcykKLQl7CQkKLQkJTGlzdCBpdGVtcyA9IHN1cGVyLnJlYWxpemUoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWVzKTsKLQkKLS8vCQkvLyBhZGQgdGhlIGZlYXR1cmUgcmVmZXJlbmNlcyBpbiBjYXNlIHRoZSB2YWxpZGF0b3IgbmVlZCBmZWF0dXJlLWJhc2VkIHJlZmVyZW5jZSBpbmZvcm1hdGlvbiwKLS8vCQkvLyBmb3IgZXhhbXBsZSwgd2hlbiBwdWJsaXNoaW5nIHByb2Nlc3MsIHRoZSBvdXRwdXQgV1BzIGluIGEgVGFzayBzaG91bGQgbm90IGJlIHB1Ymxpc2hlZCAKLS8vCQkvLyBpdCBub25lIG9mIHRoZSBUYXNrRGVzY3JpcHRvcnMgZm9yIHRoaXMgdGFzayBoYXMgcmVmZXJlbmNlIHRvIHRoYXQgV1AuCi0vLwkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IgKSB7Ci0vLwkJCVRhc2sgdCA9IChUYXNrKXJlYWxpemUoKChUYXNrRGVzY3JpcHRvcillbGVtZW50KS5nZXRUYXNrKCkpOwotLy8JCQkKLS8vCQkJKChQcm9jZXNzUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IpdmFsaWRhdG9yKS5zZXRFbGVtZW50UmVmZXJlbmNlcyh0LCBpdGVtcyk7Ci0vLwkJCQotLy8JCX0KLQkJCi0JCXJldHVybiBpdGVtczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9QdWJsaXNoTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZTk1OTJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkJvb2ttYXJrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSHRtbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXguRGVmaW5pdGlvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleC5LZXlXb3JkSW5kZXhIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbC5QdWJsaXNoaW5nVXRpbDsKLQotCi0vKioKLSAqIE1hbmFnZXMgdGhlIHB1Ymxpc2hpbmcgb2YgYSBDb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaE1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVdPUkRfREVGX0ZJTEUgPSAia2V5d29yZGluZGV4ZGVmLnR4dCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hJTkdfUkVQT1JUX1hTTF9GSUxFID0gInhzbC9QdWJsaXNoaW5nUmVwb3J0LnhzbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hJTkdfUkVQT1JUX0hUTUxfRklMRSA9ICJQdWJsaXNoaW5nUmVwb3J0Lmh0bWwiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogZGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqCi0JICovCi0JcHVibGljIFB1Ymxpc2hNYW5hZ2VyKCkgewotCi0JfQotCi0JcHJvdGVjdGVkIEFic3RyYWN0Vmlld0J1aWxkZXIgY3JlYXRlVmlld0J1aWxkZXIoKSB7Ci0JCWJvb2xlYW4gdmFsaWRhdGVFeHRlcm5hbExpbmtzID0gKG9wdGlvbnMgIT0gbnVsbCkKLQkJCQkmJiBvcHRpb25zLmNoZWNrRXh0TGlua3M7Ci0KLQkJUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yID0gbnVsbDsKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gbnVsbDsKLQkJaWYgKChvcHRpb25zICE9IG51bGwpICYmIG9wdGlvbnMucHVibGlzaFByb2Nlc3MpIHsKLQkJCXZhbGlkYXRvciA9IG5ldyBQcm9jZXNzUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IocHViRGlyLAotCQkJCQl2YWxpZGF0ZUV4dGVybmFsTGlua3MpOwotCQkJcmVhbGl6ZXIgPSBuZXcgUHJvY2Vzc1B1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIoY29uZmlnLCAKLQkJCQkJKFByb2Nlc3NQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvcil2YWxpZGF0b3IpOwotCQl9IGVsc2UgewotCQkJdmFsaWRhdG9yID0gbmV3IFB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yKHB1YkRpciwKLQkJCQkJdmFsaWRhdGVFeHRlcm5hbExpbmtzKTsKLQkJCXJlYWxpemVyID0gbmV3IFB1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIoY29uZmlnLCB2YWxpZGF0b3IpOwotCQl9Ci0KLQkJdmFsaWRhdG9yLnNldFNob3dCcm9rZW5MaW5rcyhvcHRpb25zLmNvbnZlcnRCcm9rZW5MaW5rcyA9PSBmYWxzZSk7Ci0JCXZhbGlkYXRvci5zZXRTaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMob3B0aW9ucy5zaG93RXh0cmFEZXNjcmlwdG9ySW5mbyk7Ci0JCQotCQlFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNZ3IgPSBuZXcgRWxlbWVudExheW91dE1hbmFnZXIoY29uZmlnLAotCQkJCXB1YkRpciwgdmFsaWRhdG9yLCB0cnVlKTsKLQkJbGF5b3V0TWdyLnNldEVsZW1lbnRSZWFsaXplcihyZWFsaXplcik7Ci0JCUh0bWxCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSHRtbEJ1aWxkZXIobGF5b3V0TWdyKTsKLQkJCi0JCWJ1aWxkZXIuZW5hYmxlQ29udGVudFNjYW4odHJ1ZSk7Ci0JCWJ1aWxkZXIuZW5hYmxlVHJlZUJyb3dzZXIodHJ1ZSk7Ci0KLQkJSVNpdGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IERlZmF1bHRTaXRlR2VuZXJhdG9yKGJ1aWxkZXIsIG9wdGlvbnMpOwotCQlyZXR1cm4gbmV3IENvbmZpZ3VyYXRpb25WaWV3QnVpbGRlcihnZW5lcmF0b3IpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwcmVQdWJsaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQkvL2ZpeE9wdGlvbnMob3B0aW9ucyk7Ci0KLQkJbW9uaXRvci5zdWJUYXNrKFB1Ymxpc2hpbmdSZXNvdXJjZXMuaW5pdGlhbGl6aW5nRGlyVGFza19uYW1lKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIG1ha2Ugc3VyZSB0aGUgcHVibGlzaCBkaXJlY3RvcnkgaXMgY3JlYXRlZAotCQlGaWxlIGYgPSBuZXcgRmlsZSh2aWV3QnVpbGRlci5nZXRIdG1sQnVpbGRlcigpLmdldFB1Ymxpc2hEaXIoKSk7Ci0JCWlmICghZi5leGlzdHMoKSkgewotCQkJZi5ta2RpcnMoKTsKLQkJfQotCi0JCS8vIGNvcHkgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMKLQkJbW9uaXRvci5zdWJUYXNrKFB1Ymxpc2hpbmdSZXNvdXJjZXMuY29weWluZ0ZpbGVzVGFza19uYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkvKgotCQljb3B5RG9jUm9vdEZpbGVzKCk7CQotCQkKLQkJLy8gY29weSBsb2NhbGl6ZWQgZmlsZXMKLQkJY29weUxvY2FsaXplZEZpbGVzKCk7Ci0KLQkJLy8gY29weSB1c2VyIGN1c3RvbWl6ZWQgZmlsZXMgbGFzdAotCQljb3B5Q3VzdG9taXplZEZpbGVzKCk7Ci0JCSovCi0JCWdldFNpdGVHZW5lcmF0b3IoKS5wcmVQdWJsaXNoKCk7Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkb1B1Ymxpc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gZG9uJ3QgY29weSBhbGwgdGhlIGNvbnRlbnQgcmVzb3VyY2VzCi0JCS8vIGxldCB0aGUgc3lzdGVtIHNjYW4gdGhlIGNvbnRlbnQgYW5kIGNvcHkgb25seSB0aGUgcmVxdWlyZWQKLQkJLy8gcmVzb3VyY2UKLS8vCQl2aWV3QnVpbGRlci5nZXRIdG1sQnVpbGRlcigpLmVuYWJsZUNvbnRlbnRTY2FuKHRydWUpOwotLy8JCXZpZXdCdWlsZGVyLmdldEh0bWxCdWlsZGVyKCkuZW5hYmxlVHJlZUJyb3dzZXIodHJ1ZSk7Ci0KLQkJLy8gZ2VuZXJhdGUgYm9va21hcmtzIGFuZCBwdWJsaXNoZWQgdGhlIGNvbnRlbnRzIGFzIG5lZWRlZAotCQltb25pdG9yLnN1YlRhc2soUHVibGlzaGluZ1Jlc291cmNlcy5nZW5lcmF0aW5nQm9va21hcmtzVGFza19uYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlnZW5lcmF0ZUJvb2ttYXJrcyhtb25pdG9yKTsKLQkJCi0JCVN0cmluZyB0aXRsZSA9IG9wdGlvbnMgPT0gbnVsbCA/ICIiIDogb3B0aW9ucy5nZXRUaXRsZSgpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBjcmVhdGluZyBnbG9zc2FyeQotCQlpZiAob3B0aW9ucyA9PSBudWxsIHx8IG9wdGlvbnMuaXNHZW5lcmF0ZUdsb3NzYXJ5KCkpIHsKLQkJCW1vbml0b3Iuc3ViVGFzayhQdWJsaXNoaW5nUmVzb3VyY2VzLmdlbmVyYXRpbmdHbG9zc2FyeVRhc2tfbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCW5ldyBHbG9zc2FyeUJ1aWxkZXIoKS5leGVjdXRlKGNvbmZpZywgcHViRGlyLCB0aXRsZSwKLQkJCQkJbW9uaXRvcik7Ci0JCX0KLQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGNyZWF0aW5nIGNvbnRlbnQgaW5kZXgKLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCB8fCBvcHRpb25zLmlzR2VuZXJhdGVJbmRleCgpKSB7Ci0JCQltb25pdG9yCi0JCQkJCS5zdWJUYXNrKFB1Ymxpc2hpbmdSZXNvdXJjZXMuZ2VuZXJhdGluZ0Jvb2ttYXJrSW5kZXhUYXNrX25hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkvLyBuZXcgSW5kZXhCdWlsZGVyKCkuZXhlY3V0ZShjb25maWcsIHB1Ymxpc2hEaXIsIG1vbml0b3IpOwotCQkJZ2VuZXJhdGVCb29rbWFya0luZGV4KHB1YkRpciwgdGl0bGUsIG1vbml0b3IpOwotCQl9Ci0KLS8vCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLS8vCQkJcmV0dXJuOwotLy8JCX0KLS8vCi0vLwkJLy8gZW5hYmxlIHNlYXJjaGluZwotLy8JCWlmIChvcHRpb25zID09IG51bGwgfHwgb3B0aW9ucy5nZW5lcmF0ZVNlYXJjaERCKSB7Ci0vLwkJCWlmICggZ2V0QXBwbGV0U2VhcmNoUGF0aCgpICE9IG51bGwgKSB7Ci0vLwkJCQkvLyBnZW5lcmF0aW5nIHRoZSBzZWFyY2ggaW5kZXgKLS8vCQkJCW1vbml0b3IKLS8vCQkJCQkJLnN1YlRhc2soUHVibGlzaGluZ1Jlc291cmNlcwotLy8JCQkJCQkJCS5nZXRTdHJpbmcoIlB1Ymxpc2hpbmcuZ2VuZXJhdGluZ1NlYXJjaEluZGV4VGFzay5uYW1lIikpOyAvLyROT04tTkxTLTEkCi0vLwkJCQlJbmRleE1hbmFnZXIuY3JlYXRlSW5kZXgocHViRGlyLCBtb25pdG9yKTsKLS8vCQkJfQotLy8JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcG9zdFB1Ymxpc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gZmluYWxseSwgZ2VuZXJhdGUgYSByZXBvcnQKLQkJZ2V0U2l0ZUdlbmVyYXRvcigpLnBvc3RQdWJsaXNoKCk7Ci0JCQotCQlnZXRQdWJsaXNoUmVwb3J0VXJsKCk7CQkKLQl9Ci0JCi0JCi0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVCb29rbWFya3MoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlqYXZhLnV0aWwuTGlzdCBib29rbWFya3MgPSB2aWV3QnVpbGRlci5idWlsZFZpZXdzKG1vbml0b3IpOwotCQlCb29rbWFyayBkZWZhdWx0VmlldyA9IHZpZXdCdWlsZGVyLmdldERlZmF1bHRWaWV3KCk7Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyAzLiBmaW5hbGx5LCB3cml0ZSB0aGUgcHVibGlzaGVkIGJvb2ttYXJrcyBmaWxlCi0JCWdldFNpdGVHZW5lcmF0b3IoKS53cml0ZVB1Ymxpc2hlZEJvb2ttYXJrcyhib29rbWFya3MsIGRlZmF1bHRWaWV3KTsJCi0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB1cmwgZm9yIHRoZSBwdWJsaXNoZWQgc2l0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaGVkVXJsKCkgewotCQlpZiAoc3VjZXNzKSB7Ci0JCQlTdHJpbmcgdXJsID0gZ2V0U2l0ZUdlbmVyYXRvcigpLmdldEluZGV4RmlsZVBhdGgoKTsKLQkJCUZpbGUgZiA9IG5ldyBGaWxlKHVybCk7Ci0JCQlpZiAoZi5leGlzdHMoKSkgewotCQkJCXJldHVybiB1cmw7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUJvb2ttYXJrSW5kZXgoU3RyaW5nIHB1Ymxpc2hEaXIsIFN0cmluZyB0aXRsZSwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCi0JCQlVUkwgdXJsID0gbmV3IFVSTChQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbnN0YWxsVVJMKCksCi0JCQkJCUtFWVdPUkRfREVGX0ZJTEUpOwotCQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gZ2V0IGluZGV4IGRlZmluaXRpb24gZmlsZSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJU3RyaW5nIGRlZmZpbGUgPSBQbGF0Zm9ybS5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCQkJU3RyaW5nIGNoYXJTZXQgPSAidXRmLTgiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgaGVscEZpbGUgPSBudWxsOwotCQkJS2V5V29yZEluZGV4SGVscGVyIGluZGV4SGVscGVyID0gbmV3IEtleVdvcmRJbmRleEhlbHBlcihkZWZmaWxlLAotCQkJCQljaGFyU2V0LCBoZWxwRmlsZSk7Ci0JCQlEZWZpbml0aW9uT2JqZWN0IGRlZk9iaiA9IGluZGV4SGVscGVyLmxvYWREZWZpbml0aW9uKHB1Ymxpc2hEaXIpOwotCQkJaWYgKGRlZk9iaiAhPSBudWxsKSB7Ci0JCQkJZGVmT2JqLnNldHd3d1Jvb3QocHVibGlzaERpcik7Ci0JCQkJZGVmT2JqCi0JCQkJCQkuc2V0SW5kZXhUaXRsZShQdWJsaXNoaW5nUmVzb3VyY2VzLmluZGV4TGFiZWxfdGV4dCArICIgLSAiICsgdGl0bGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJaW5kZXhIZWxwZXIuZXhlY3V0ZShtb25pdG9yKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZSB0aGUgcHVibGlzaGluZyByZXBvcnQgYW5kIHJldHVybiB0aGUgdXJsCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHJlcG9ydCB1cmwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hSZXBvcnRVcmwoKSB7Ci0JCVN0cmluZyBwdWJsaXNoRGlyID0gdmlld0J1aWxkZXIuZ2V0SHRtbEJ1aWxkZXIoKS5nZXRQdWJsaXNoRGlyKCk7Ci0JCVN0cmluZyBmaWxlX3BhdGhuYW1lID0gUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IuTE9HU19GT0xERVIKLQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgUFVCTElTSElOR19SRVBPUlRfSFRNTF9GSUxFOwotCQlGaWxlIGYgPSBuZXcgRmlsZShwdWJsaXNoRGlyLCBmaWxlX3BhdGhuYW1lKTsKLQkJU3RyaW5nIHJlcG9ydF9maWxlID0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJaWYgKCFmLmV4aXN0cygpKSB7Ci0JCQlGaWxlIGVycm9yTG9nID0gbmV3IEZpbGUocHVibGlzaERpciwKLQkJCQkJUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IuTE9HU19GT0xERVIgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJCSsgUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IuRVJST1JfTE9HX0ZJTEVOQU1FKTsKLQkJCUZpbGUgd2FybmluZ0xvZyA9IG5ldyBGaWxlKHB1Ymxpc2hEaXIsCi0JCQkJCVB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLkxPR1NfRk9MREVSICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCQkrIFB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLldBUk5JTkdfTE9HX0ZJTEVOQU1FKTsKLQkJCUZpbGUgaW5mb0xvZyA9IG5ldyBGaWxlKHB1Ymxpc2hEaXIsCi0JCQkJCVB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLkxPR1NfRk9MREVSICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCQkrIFB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLklORk9fTE9HX0ZJTEVOQU1FKTsKLQotCQkJLy8gZ2VlbnJhdGUgdGhlIGluZGV4Lmh0bQotCQkJWG1sRWxlbWVudCByZXBvcnRYbWwgPSBuZXcgWG1sRWxlbWVudCgiUHVibGlzaGluZ1JlcG9ydCIpOyAvLyROT04tTkxTLTEkCi0KLQkJCXJlcG9ydFhtbC5uZXdDaGlsZCgicHViRGlyIikuc2V0QXR0cmlidXRlKCJwYXRoIiwgcHVibGlzaERpcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmVwb3J0WG1sCi0JCQkJCS5uZXdDaGlsZCgiZXJyb3JMb2ciKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoCi0JCQkJCQkJIm5hbWUiLCBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvci5FUlJPUl9MT0dfRklMRU5BTUUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgicGF0aCIsICIuLyIgKyBlcnJvckxvZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJcmVwb3J0WG1sCi0JCQkJCS5uZXdDaGlsZCgid2FybmluZ0xvZyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkibmFtZSIsIFB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLldBUk5JTkdfTE9HX0ZJTEVOQU1FKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoInBhdGgiLCAiLi8iICsgd2FybmluZ0xvZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJcmVwb3J0WG1sCi0JCQkJCS5uZXdDaGlsZCgiaW5mb0xvZyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkibmFtZSIsIFB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLklORk9fTE9HX0ZJTEVOQU1FKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoInBhdGgiLCAiLi8iICsgaW5mb0xvZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJLy8gZGV0YWlsIGluZm9ybWF0aW9uCi0JCQlQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IgPSAoUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IpIHZpZXdCdWlsZGVyCi0JCQkJCS5nZXRIdG1sQnVpbGRlcigpLmdldFZhbGlkYXRvcigpOwotCQkJcmVwb3J0WG1sLmFkZENoaWxkKHZhbGlkYXRvci5nZXRSZXBvcnQoKSk7Ci0KLQkJCVN0cmluZyBidWZmZXIgPSBQdWJsaXNoaW5nVXRpbC5nZXRIdG1sKHJlcG9ydFhtbCwKLQkJCQkJUFVCTElTSElOR19SRVBPUlRfWFNMX0ZJTEUpOwotCQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQkJRmlsZVV0aWwud3JpdGVVVEY4RmlsZShyZXBvcnRfZmlsZSwgYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlcG9ydF9maWxlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaE9wdGlvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hPcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ3YjY3MmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaE9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRoZSBQdWJsaXNoaW5nIE9wdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoT3B0aW9ucyB7Ci0JCi0JLy8gZGVmaW5lIHRoZSBvcHRpb24gbmFtZXMuIHdpbGwgYmUgdXNlZCBhcyBwcmVmZXJlbmNlIGtleXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX1BBVEggPSAicHVibGlzaFBhdGgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9QQVRIX0RFRkFVTFQgPSAicHVibGlzaFBhdGhEZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gInRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBTk5FUl9JTUFHRSA9ICJiYW5uZXJJbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQk9VVF9IVE1MID0gImFib3V0SFRNTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUVEQkFDS19VUkwgPSAiZmVlZGJhY2tVUkwiOyAvLyROT04tTkxTLTEkCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFRURCQUNLX1VSTF9ERUZBVUxUID0gImZlZWRiYWNrVVJMRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX0dMT1NTQVJZID0gImluY2x1ZGVHbG9zc2FyeSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX0lOREVYID0gImluY2x1ZGVJbmRleCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX1NFQVJDSCA9ICJpbmNsdWRlU2VhcmNoIjsgLy8kTk9OLU5MUy0xJAotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9QUk9DRVNTX0NVU1RPTUlaQVRJT04gPSAiaW5jbHVkZVByb2Nlc3NDdXN0b21pemF0aW9uIjsgLy8kTk9OLU5MUy0xJAkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19FWFRFUk5BTF9MSU5LUyA9ICJjaGVja0V4dGVybmFsTGlua3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVkVSVF9CUk9LRU5fTElOS1MgPSAiY29udmVydEJyb2tlbkxpbmtzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJR0hUX1dFSUdIVF9UUkVFID0gImxpZ2h0V2VpZ2h0VHJlZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9ERVNDUklQVE9SX0lORk8gPSAiZXh0cmFEZXNjcmlwdG9ySW5mbyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJBUFBfTkFNRSA9ICJ3ZWJBcHBOYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfU0VSVkVSU0lERV9TRUFSQ0ggPSAic2VydmVyU2lkZVNlYXJjaCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfSU5QVVRfV1AgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BTkRBVE9SWV9JTlBVVF9XUCA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFOREFUT1JZX0FORF9FWFRFUk5BTF9JTlBVVF9XUCA9IDM7Ci0KLQlwdWJsaWMgU3RyaW5nIHB1YmxpY2F0aW9uUGF0aDsKLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbmlzaFByZXNzZWQ7Ci0JcHVibGljIFN0cmluZyBsYXN0UHVibGljYXRpb25QYXRoOwotCXB1YmxpYyBTdHJpbmcgc2VsZWN0ZWRDb25maWc7CQotCXB1YmxpYyBib29sZWFuIHB1Ymxpc2hDb25maWd1cmF0aW9uOwotCXB1YmxpYyBib29sZWFuIHB1Ymxpc2hQcm9jZXNzOwotCXB1YmxpYyBTdHJpbmcgdGl0bGU7Ci0JcHVibGljIFN0cmluZyBiYW5uZXJJbWFnZTsKLQlwdWJsaWMgU3RyaW5nIGFib3V0SFRNTDsJCi0JcHVibGljIFN0cmluZyBmZWVkYmFja1VSTDsKLQlwdWJsaWMgU3RyaW5nIHdlYkFwcE5hbWU7Ci0JcHVibGljIGJvb2xlYW4gZ2VuZXJhdGVHbG9zc2FyeTsKLQlwdWJsaWMgYm9vbGVhbiBnZW5lcmF0ZUluZGV4OwotCXB1YmxpYyBib29sZWFuIGdlbmVyYXRlU2VhcmNoREI7Ci0JcHVibGljIGJvb2xlYW4gc2VydmVyU2lkZVNlYXJjaDsKLS8vCXB1YmxpYyBib29sZWFuIHVzZUFwcGxldDsKLQlwdWJsaWMgYm9vbGVhbiB1c2VEZWZhdWx0VHJlZUJyb3dzZXIgPSB0cnVlOyAvLyB0aGlzIGlzIHRoZSBkZWZhdWx0IGphdmFzY3JpcHQgbmF2aWdhdGlvbiB0cmVlCi0JcHVibGljIGJvb2xlYW4gY2hlY2tFeHRMaW5rcyA9IGZhbHNlOwotCXB1YmxpYyBpbnQgaW5wdXRXUFNob3duOwotCXB1YmxpYyBib29sZWFuIG9ubHlVc2VkOwotCXB1YmxpYyBib29sZWFuIGF1dG9HZW5lcmF0ZUFjdGl2aXR5RGlhZ3JhbXMgPSBmYWxzZTsKLQlwdWJsaWMgYm9vbGVhbiBwdWJsaXNoVW5PcGVuRXh0ZW5kZWRBY3Rpdml0eURpYWdyYW0gPSBmYWxzZTsKLQkKLQlwdWJsaWMgTGlzdCBkZWxpdmVyUHJvY2Vzc0xpc3Q7Ci0JcHVibGljIGJvb2xlYW4gY29udmVydEJyb2tlbkxpbmtzID0gZmFsc2U7IC8vIGNvbnZlcnQgYnJva2VuIGxpbmtzIHRvIHBsYWluIHRleHQKLQlwdWJsaWMgYm9vbGVhbiBzaG93RXh0cmFEZXNjcmlwdG9ySW5mbyA9IGZhbHNlOwotCXB1YmxpYyBib29sZWFuIGdlbmVyYXRlTGlnaHRXZWlnaHRUcmVlID0gZmFsc2U7Ci0JCi0JLy8gdGhpcyBvcHRpb24gaXMgbm90IGFwcHJvdmVkLCBzbyBzaG91bGQgYmUgQUxXQVlTIGZhbHNlCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZUVtcHR5Q2F0ZWdvcmllcyA9IGZhbHNlOwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljYXRpb25QYXRoKCkgewotCQlyZXR1cm4gcHVibGljYXRpb25QYXRoOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWNhdGlvblBhdGgoU3RyaW5nIHB1YmxpY2F0aW9uUGF0aCkgewotCQl0aGlzLnB1YmxpY2F0aW9uUGF0aCA9IHB1YmxpY2F0aW9uUGF0aDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNGaW5pc2hQcmVzc2VkKCkgewotCQlyZXR1cm4gaXNGaW5pc2hQcmVzc2VkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2hQcmVzc2VkKGJvb2xlYW4gaXNGaW5pc2hQcmVzc2VkKSB7Ci0JCXRoaXMuaXNGaW5pc2hQcmVzc2VkID0gaXNGaW5pc2hQcmVzc2VkOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhc3RQdWJsaWNhdGlvblBhdGgoKSB7Ci0JCXJldHVybiBsYXN0UHVibGljYXRpb25QYXRoOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRMYXN0UHVibGljYXRpb25QYXRoKFN0cmluZyBsYXN0UHVibGljYXRpb25QYXRoKSB7Ci0JCXRoaXMubGFzdFB1YmxpY2F0aW9uUGF0aCA9IGxhc3RQdWJsaWNhdGlvblBhdGg7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWRDb25maWcoKSB7Ci0JCXJldHVybiBzZWxlY3RlZENvbmZpZzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRDb25maWcoU3RyaW5nIHNlbGVjdGVkQ29uZmlnKSB7Ci0JCXRoaXMuc2VsZWN0ZWRDb25maWcgPSBzZWxlY3RlZENvbmZpZzsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaXNoQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIHB1Ymxpc2hDb25maWd1cmF0aW9uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoQ29uZmlndXJhdGlvbihib29sZWFuIHB1Ymxpc2hDb25maWd1cmF0aW9uKSB7Ci0JCXRoaXMucHVibGlzaENvbmZpZ3VyYXRpb24gPSBwdWJsaXNoQ29uZmlndXJhdGlvbjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaXNoUHJvY2VzcygpIHsKLQkJcmV0dXJuIHB1Ymxpc2hQcm9jZXNzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoUHJvY2Vzcyhib29sZWFuIHB1Ymxpc2hQcm9jZXNzKSB7Ci0JCXRoaXMucHVibGlzaFByb2Nlc3MgPSBwdWJsaXNoUHJvY2VzczsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEJhbm5lckltYWdlKCkgewotCQlyZXR1cm4gYmFubmVySW1hZ2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEJhbm5lckltYWdlKFN0cmluZyBiYW5uZXJJbWFnZSkgewotCQl0aGlzLmJhbm5lckltYWdlID0gYmFubmVySW1hZ2U7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QWJvdXRIVE1MKCkgewotCQlyZXR1cm4gYWJvdXRIVE1MOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBYm91dEhUTUwoU3RyaW5nIGFib3V0SFRNTCkgewotCQl0aGlzLmFib3V0SFRNTCA9IGFib3V0SFRNTDsKLQl9CQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RmVlZGJhY2tVUkwoKSB7Ci0JCXJldHVybiBmZWVkYmFja1VSTDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RmVlZGJhY2tVUkwoU3RyaW5nIGZlZWRiYWNrVVJMKSB7Ci0JCXRoaXMuZmVlZGJhY2tVUkwgPSBmZWVkYmFja1VSTDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZUdsb3NzYXJ5KCkgewotCQlyZXR1cm4gZ2VuZXJhdGVHbG9zc2FyeTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdGVHbG9zc2FyeShib29sZWFuIGdlbmVyYXRlR2xvc3NhcnkpIHsKLQkJdGhpcy5nZW5lcmF0ZUdsb3NzYXJ5ID0gZ2VuZXJhdGVHbG9zc2FyeTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZUluZGV4KCkgewotCQlyZXR1cm4gZ2VuZXJhdGVJbmRleDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdGVJbmRleChib29sZWFuIGdlbmVyYXRlSW5kZXgpIHsKLQkJdGhpcy5nZW5lcmF0ZUluZGV4ID0gZ2VuZXJhdGVJbmRleDsKLQl9Ci0JCi0vLwlwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlU2VhcmNoREIoKSB7Ci0vLwkJcmV0dXJuIGdlbmVyYXRlU2VhcmNoREI7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlU2VhcmNoREIoYm9vbGVhbiBnZW5lcmF0ZVNlYXJjaERCKSB7Ci0vLwkJdGhpcy5nZW5lcmF0ZVNlYXJjaERCID0gZ2VuZXJhdGVTZWFyY2hEQjsKLS8vCX0KLS8vCQotLy8JcHVibGljIGJvb2xlYW4gaXNVc2VBcHBsZXQoKSB7Ci0vLwkJcmV0dXJuIHVzZUFwcGxldDsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgc2V0VXNlQXBwbGV0KGJvb2xlYW4gdXNlQXBwbGV0KSB7Ci0vLwkJdGhpcy51c2VBcHBsZXQgPSB1c2VBcHBsZXQ7Ci0vLwl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDaGVja0V4dExpbmtzKCkgewotCQlyZXR1cm4gY2hlY2tFeHRMaW5rczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2hlY2tFeHRMaW5rcyhib29sZWFuIGNoZWNrRXh0TGlua3MpIHsKLQkJdGhpcy5jaGVja0V4dExpbmtzID0gY2hlY2tFeHRMaW5rczsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldElucHV0V1BTaG93bigpIHsKLQkJcmV0dXJuIGlucHV0V1BTaG93bjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW5wdXRXUFNob3duKGludCBpbnB1dFdQU2hvd24pIHsKLQkJdGhpcy5pbnB1dFdQU2hvd24gPSBpbnB1dFdQU2hvd247Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzT25seVVzZWQoKSB7Ci0JCXJldHVybiBvbmx5VXNlZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0T25seVVzZWQoYm9vbGVhbiBvbmx5VXNlZCkgewotCQl0aGlzLm9ubHlVc2VkID0gb25seVVzZWQ7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldERlbGl2ZXJQcm9jZXNzTGlzdCgpIHsKLQkJcmV0dXJuIGRlbGl2ZXJQcm9jZXNzTGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWxpdmVyUHJvY2Vzc0xpc3QoTGlzdCBkZWxpdmVyUHJvY2Vzc0xpc3QpIHsKLQkJdGhpcy5kZWxpdmVyUHJvY2Vzc0xpc3QgPSBkZWxpdmVyUHJvY2Vzc0xpc3Q7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBdXRvR2VuZXJhdGVBY3Rpdml0eURpYWdyYW1zKCkgewotCQlyZXR1cm4gYXV0b0dlbmVyYXRlQWN0aXZpdHlEaWFncmFtczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdXRvR2VuZXJhdGVBY3Rpdml0eURpYWdyYW1zKGJvb2xlYW4gYXV0b0dlbmVyYXRlQWN0aXZpdHlEaWFncmFtcykgewotCQl0aGlzLmF1dG9HZW5lcmF0ZUFjdGl2aXR5RGlhZ3JhbXMgPSBhdXRvR2VuZXJhdGVBY3Rpdml0eURpYWdyYW1zOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB1bm9wZW5FeHRlbmRlZEFjdGl2aXR5RGlhZ3JhbQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVW5vcGVuRXh0ZW5kZWRBY3Rpdml0eURpYWdyYW0oKSB7Ci0JCXJldHVybiBwdWJsaXNoVW5PcGVuRXh0ZW5kZWRBY3Rpdml0eURpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHVub3BlbkV4dGVuZGVkQWN0aXZpdHlEaWFncmFtIHRoZSB1bm9wZW5FeHRlbmRlZEFjdGl2aXR5RGlhZ3JhbSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbm9wZW5FeHRlbmRlZEFjdGl2aXR5RGlhZ3JhbSgKLQkJCWJvb2xlYW4gZmxhZykgewotCQl0aGlzLnB1Ymxpc2hVbk9wZW5FeHRlbmRlZEFjdGl2aXR5RGlhZ3JhbSA9IGZsYWc7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb252ZXJ0QnJva2VuTGlua3MoKSB7Ci0JCXJldHVybiBjb252ZXJ0QnJva2VuTGlua3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udmVydEJyb2tlbkxpbmtzKGJvb2xlYW4gY29udmVydEJyb2tlbkxpbmtzKSB7Ci0JCXRoaXMuY29udmVydEJyb2tlbkxpbmtzID0gY29udmVydEJyb2tlbkxpbmtzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVMaWdodFdlaWdodFRyZWUoKSB7Ci0JCXJldHVybiBnZW5lcmF0ZUxpZ2h0V2VpZ2h0VHJlZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUxpZ2h0V2VpZ2h0VHJlZShib29sZWFuIGdlbmVyYXRlTGlnaHRXZWlnaHRUcmVlKSB7Ci0JCXRoaXMuZ2VuZXJhdGVMaWdodFdlaWdodFRyZWUgPSBnZW5lcmF0ZUxpZ2h0V2VpZ2h0VHJlZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3dFeHRyYURlc2NyaXB0b3JJbmZvKCkgewotCQlyZXR1cm4gc2hvd0V4dHJhRGVzY3JpcHRvckluZm87Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2hvd0V4dHJhRGVzY3JpcHRvckluZm8oYm9vbGVhbiBzaG93RXh0cmFEZXNjcmlwdG9ySW5mbykgewotCQl0aGlzLnNob3dFeHRyYURlc2NyaXB0b3JJbmZvID0gc2hvd0V4dHJhRGVzY3JpcHRvckluZm87Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9QdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNzhlNWU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlRpbWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5EZWZhdWx0Q29udGVudFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGlua0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuUHVibGlzaGluZ1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnV0aWwuaHR0cC5IdHRwUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbC5odHRwLkh0dHBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuQ2FsZW5kYXI7Ci0KLS8qKgotICogY29udGVudCB2YWxpZGF0b3IgdXNlZCBmb3IgcHVibGlzaGluZy4gVGhpcyBjbGFzcyB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciB2YWxpZGF0aW5nIHRoZSBjb250ZW50IHRvIGJlIHB1Ymxpc2hlZCwgCi0gKiBmaXhpbmcgcHJvYmxlbXMgc3VjaCBhcyBsaW5rcyBpbiB0aGUgY29udGVudCwgCi0gKiBhbmQgbG9nZ2luZyBpbmZvcm1hdGlvbiBhYm91dCBtaXNzaW5nIGVsZW1lbnRzLCBtaXNzaW5nIHJlc291cmNlcywgZXRjLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvciBleHRlbmRzIERlZmF1bHRDb250ZW50VmFsaWRhdG9yIHsKLQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZyA9IFB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzID0gZmFsc2U7Ci0JCi0JY2xhc3MgSW52YWxpZEV4dGVybmFsTGlua0luZm8gewotCQlwdWJsaWMgTWV0aG9kRWxlbWVudCBvd25lcjsKLQotCQlwdWJsaWMgU3RyaW5nIHVybDsKLQotCQlwdWJsaWMgU3RyaW5nIG1lc3NhZ2U7Ci0KLQkJcHVibGljIEludmFsaWRFeHRlcm5hbExpbmtJbmZvKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyB1cmwsCi0JCQkJU3RyaW5nIG1lc3NhZ2UpIHsKLQkJCXRoaXMub3duZXIgPSBvd25lcjsKLQkJCXRoaXMudXJsID0gdXJsOwotCQkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLQkJfQotCX0KLQotCWNsYXNzIE1pc3NpbmdSZWZlcmVuY2UgewotCQlwdWJsaWMgTWV0aG9kRWxlbWVudCBvd25lcjsKLQotCQlwdWJsaWMgTWV0aG9kRWxlbWVudCByZWZFbGVtZW50OwotCi0JCXB1YmxpYyBTdHJpbmcgZ3VpZDsKLQotCQlwdWJsaWMgU3RyaW5nIGxpbmtlZFRleHQ7Ci0KLQkJcHVibGljIE1pc3NpbmdSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBvd25lciwgTWV0aG9kRWxlbWVudCByZWZFbGVtZW50KSB7Ci0JCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCQl0aGlzLnJlZkVsZW1lbnQgPSByZWZFbGVtZW50OwotCQl9Ci0KLQkJcHVibGljIE1pc3NpbmdSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIGd1aWQsCi0JCQkJU3RyaW5nIGxpbmtlZFRleHQpIHsKLQkJCXRoaXMub3duZXIgPSBvd25lcjsKLQkJCXRoaXMuZ3VpZCA9IGd1aWQ7Ci0JCQl0aGlzLmxpbmtlZFRleHQgPSBsaW5rZWRUZXh0OwotCQl9Ci0JfQotCi0JY2xhc3MgTWlzc2luZ1Jlc291cmNlIHsKLQkJcHVibGljIE1ldGhvZEVsZW1lbnQgb3duZXI7Ci0KLQkJcHVibGljIEZpbGUgcmVzb3VyY2VGaWxlOwotCi0JCXB1YmxpYyBTdHJpbmcgdXJsOwotCi0JCXB1YmxpYyBNaXNzaW5nUmVzb3VyY2UoTWV0aG9kRWxlbWVudCBvd25lciwgRmlsZSByZXNvdXJjZUZpbGUsCi0JCQkJU3RyaW5nIHVybCkgewotCQkJdGhpcy5vd25lciA9IG93bmVyOwotCQkJdGhpcy5yZXNvdXJjZUZpbGUgPSByZXNvdXJjZUZpbGU7Ci0JCQl0aGlzLnVybCA9IHVybDsKLQkJfQotCX0KLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HU19GT0xERVIgPSAibG9ncyI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTE9HX0ZJTEVOQU1FID0gImVycm9yLmxvZyI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSTklOR19MT0dfRklMRU5BTUUgPSAid2FybmluZy5sb2ciOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIElORk9fTE9HX0ZJTEVOQU1FID0gImluZm8ubG9nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIEZpbGUgbG9nUGF0aDsKLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlRXh0ZXJuYWxMaW5rcyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIExpc3QgaW52YWxpZEV4dGVybmFsTGlua3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBjYWNoZSB0aGUgdmFsaWRlZCBleHRlcm5hbCBsaW5rcyB0byBhdm9pZCBtdWx0aXBsZSBjaGVja2luZwotCXByb3RlY3RlZCBMaXN0IHZhbGlkYXRlZEV4dGVybmFsTGlua3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBtaXNzaW5nUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBMaXN0IG1pc3NpbmdSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBkaXNjYXJkZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBMaXN0IHZhbGlkQ2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBsb25nIHB1Ymxpc2hpbmdfc3RhcnQgPSAwOwotCi0JcHJvdGVjdGVkIGxvbmcgdGltZV9mb3JfZXh0ZXJuYWxfbGlua19jaGVja2luZyA9IDA7Ci0KLQkvLyBjb2xsZWN0IHRoZSBlbGVtZW50cyByZWZlcmVuY2VkIGJ5IHRoZSBwdWJsaXNoZWQgY29udGVudHMgc28gd2UgY2FuCi0JLy8gcHVibGlzaCB0aGVtCi0JLy8gdGhpcyB3aWxsIGJlIHRoZSBlbGVtZW50cyB0byBiZSBwdWJsaXNoZWQKLQlwcm90ZWN0ZWQgTGlzdCByZWZlcmVuY2VkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBwdWJsaXNoZWQgZWxlbWVudHMKLQlwcm90ZWN0ZWQgTGlzdCBwdWJsaXNoZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIHRoaXMgaXMgdGhlIGRlZmF1bHQgdGFyZ2V0IGVsZW1lbnQgZm9yIHRoZSBjb250ZW50IHZhbGlkYXRvcgotCS8vIHNldCB0aGlzIGJlZm9yZSBwdWJsaXNoaW5nIHRoZSBlbGVtZW50IGFuZCBzZXQgdG8gbnVsbCBhZnRlciB0aGUKLQkvLyBwdWJsaXNoaWduIGlzIGRvbmUKLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBkZWZhdWx0VGFyZ2V0ID0gbnVsbDsKLQotCS8qKgotCSAqIGNvbnNydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gcHViRGlyIFN0cmluZwotCSAqIEBwYXJhbSB2YWxpZGF0ZUV4dGVybmFsTGlua3MgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvcihTdHJpbmcgcHViRGlyLAotCQkJYm9vbGVhbiB2YWxpZGF0ZUV4dGVybmFsTGlua3MpIHsKLQkJc3VwZXIocHViRGlyKTsKLQkJdGhpcy52YWxpZGF0ZUV4dGVybmFsTGlua3MgPSB2YWxpZGF0ZUV4dGVybmFsTGlua3M7Ci0KLQkJdGhpcy5sb2dQYXRoID0gbmV3IEZpbGUocHViRGlyLCBMT0dTX0ZPTERFUik7Ci0JCXN1cGVyLmluZm8gPSBnZXRTdHJlYW0oSU5GT19MT0dfRklMRU5BTUUpOwotCQlzdXBlci53YXJuaW5nID0gZ2V0U3RyZWFtKFdBUk5JTkdfTE9HX0ZJTEVOQU1FKTsKLQkJc3VwZXIuZXJyb3IgPSBnZXRTdHJlYW0oRVJST1JfTE9HX0ZJTEVOQU1FKTsKLQotCQkvLyBzZXQgdGhlIHN0YXJ0IHRpbWUKLQkJcHVibGlzaGluZ19zdGFydCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZUluTWlsbGlzKCk7Ci0JfQotCi0JLyoqCi0JICogZGlzcG9zZSB0aGUgb2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaW52YWxpZEV4dGVybmFsTGlua3MuY2xlYXIoKTsKLQkJdmFsaWRhdGVkRXh0ZXJuYWxMaW5rcy5jbGVhcigpOwotCQltaXNzaW5nUmVmZXJlbmNlcy5jbGVhcigpOwotCQltaXNzaW5nUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCWRpc2NhcmRlZEVsZW1lbnRzLmNsZWFyKCk7Ci0JCXZhbGlkQ2F0ZWdvcmllcy5jbGVhcigpOwotCi0JCXJlZmVyZW5jZWRFbGVtZW50cy5jbGVhcigpOwotCQlwdWJsaXNoZWRFbGVtZW50cy5jbGVhcigpOwotCi0JCWluZm8uY2xvc2UoKTsKLQkJd2FybmluZy5jbG9zZSgpOwotCQllcnJvci5jbG9zZSgpOwotCi0JfQotCi0JcHJvdGVjdGVkIFByaW50U3RyZWFtIGdldFN0cmVhbShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJdHJ5IHsKLQkJCUZpbGUgZiA9IG5ldyBGaWxlKGxvZ1BhdGgsIGZpbGVOYW1lKTsKLQkJCUZpbGUgZGlyID0gZi5nZXRQYXJlbnRGaWxlKCk7Ci0JCQlkaXIubWtkaXJzKCk7Ci0KLQkJCWlmICghZi5leGlzdHMoKSkgewotCQkJCWYuY3JlYXRlTmV3RmlsZSgpOwotCQkJfQotCi0JCQlyZXR1cm4gbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpLCB0cnVlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogdmFsaWRhdGUgdGhlIGxpbmsgYXR0cmlidXRlcyBmcm8gdGhlIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQgdGhlIG93bmVyIGVsZW1lbnQKLQkgKiBAcGFyYW0gYXR0cmlidXRlcyBTdHJpbmcgdGhlIGF0dHJpYnV0ZXMgaW4gdGhlIGxpbmsKLQkgKiBAcGFyYW0gdGV4dCBTdHJpbmcgdGhlIHRleHQgYWxsb3cgd2l0aCB0aGUgbGluawotCSAqIEBwYXJhbSBjb25maWcgTWV0aG9kQ29uZmlndXJhdGlvbiAKLQkgKiAKLQkgKiBAcmV0dXJuIExpbmtJbmZvCi0JICovCi0JcHVibGljIExpbmtJbmZvIHZhbGlkYXRlTGluayhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgYXR0cmlidXRlcywKLQkJCVN0cmluZyB0ZXh0LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaW5rSW5mbyBpbmZvID0gc3VwZXIudmFsaWRhdGVMaW5rKG93bmVyLCBhdHRyaWJ1dGVzLCB0ZXh0LCBjb25maWcpOwotCi0JCWlmICh2YWxpZGF0ZUV4dGVybmFsTGlua3MpIHsKLQkJCQotCQkJU3RyaW5nIHVybCA9IGluZm8uZ2V0VXJsKCk7Ci0JCQlpZiAoKHVybCAhPSBudWxsKSAmJiBSZXNvdXJjZUhlbHBlci5pc0V4dGVybmFsTGluayh1cmwpCi0JCQkJCSYmICF1cmwuc3RhcnRzV2l0aCgiZnRwOi8vIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlpZiAoIXZhbGlkYXRlZEV4dGVybmFsTGlua3MuY29udGFpbnModXJsKSkgewotCQkJCQlUaW1lciB0ID0gbmV3IFRpbWVyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlIdHRwUmVzcG9uc2UgcmVzcCA9IEh0dHBVdGlsLmRvR2V0KHVybCwgbnVsbCwgNjAwMCk7IC8vIHRpbWVvdXQKLQkJCQkJCS8vIFN5c3RlbS5vdXQKLQkJCQkJCS8vIC5wcmludGxuKHRpbWUKLQkJCQkJCS8vICsgIiBtaW5pLXNlY29uZHMgcXVlcnlpbmcgVXJsICciICsgdXJsICsgIicsIHJldHVybgotCQkJCQkJLy8gc3RhdHVzPSIgKyByZXNwLmdldFN0YXR1cygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8gLy8kTk9OLU5MUy0yJAotCQkJCQl9IGNhdGNoIChqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlsb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKG93bmVyLCB1cmwsIG51bGwpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJbG9nSW52YWxpZEV4dGVybmFsTGluayhvd25lciwgdXJsLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCX0KLQotCQkJCQl0LnN0b3AoKTsKLQkJCQkJdGltZV9mb3JfZXh0ZXJuYWxfbGlua19jaGVja2luZyArPSB0LmdldFRpbWUoKTsKLQkJCQkJCi0JCQkJCS8vIGNhY2hlIGl0Ci0JCQkJCXZhbGlkYXRlZEV4dGVybmFsTGlua3MuYWRkKHVybCk7Ci0JCQkJCQotCQkJCQkvLyBkbyB3ZSBuZWVkIHRvIGxvZyB0aGUgaW5mbyBzbyB0aGF0IHVzZXIga25vdyB3aGF0IGV4dGVybmFsCi0JCQkJCS8vIHVybHMgYXJlIHJlZmVyZW5jZWQgaW4gdGhlIGNvbnRlbnQ/Ci0JCQkJCWxvZ0luZm8ob3duZXIsIHQuZ2V0VGltZSgpICsgIiBtaW5pLXNlY29uZHMgIiArIE5MUy5iaW5kKFB1Ymxpc2hpbmdSZXNvdXJjZXMuZXh0ZXJuYWxVcmxfbXNnLAotCQkJCQkJCXVybCkpOwotCQkJCX0KLQotCQkJfQkJCQotCQl9Ci0JCXJldHVybiBpbmZvOwotCX0KLQotCS8qKgotCSAqIGxvZyBtaXNzaW5nIHJlZmVyZW5jZS4KLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSByZWZFbGVtZW50IE1ldGhvZEVsZW1lbnQgdGhlIG1pc3NpbmcgZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ01pc3NpbmdSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBvd25lciwKLQkJCU1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCkgewotCQlzdXBlci5sb2dNaXNzaW5nUmVmZXJlbmNlKG93bmVyLCByZWZFbGVtZW50KTsKLQkJbWlzc2luZ1JlZmVyZW5jZXMuYWRkKG5ldyBNaXNzaW5nUmVmZXJlbmNlKG93bmVyLCByZWZFbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogbG9nIG1pc3NpbmcgcmVmZXJlbmNlCi0JICogQHBhcmFtIG93bmVyIE08ZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGd1aWQgU3RyaW5nIHRoZSBndWlkIG9mIHRoZSBtaXNzaW5nIGVsZW1lbnQKLQkgKiBAcGFyYW0gbGlua2VkVGV4dCBTdHJpbmcgdGhlIGxpbmtlZCB0ZXh0LiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dNaXNzaW5nUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBndWlkLAotCQkJU3RyaW5nIGxpbmtlZFRleHQpIHsKLQkJc3VwZXIubG9nTWlzc2luZ1JlZmVyZW5jZShvd25lciwgZ3VpZCwgbGlua2VkVGV4dCk7Ci0JCW1pc3NpbmdSZWZlcmVuY2VzLmFkZChuZXcgTWlzc2luZ1JlZmVyZW5jZShvd25lciwgZ3VpZCwgbGlua2VkVGV4dCkpOwotCX0KLQotCS8qKgotCSAqIGxvZyBtaXNzaW5nIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIHJlc291cmNlRmlsZSBGaWxlCi0JICogQHBhcmFtIHVybCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dNaXNzaW5nUmVzb3VyY2UoTWV0aG9kRWxlbWVudCBvd25lciwgRmlsZSByZXNvdXJjZUZpbGUsCi0JCQlTdHJpbmcgdXJsKSB7Ci0JCXN1cGVyLmxvZ01pc3NpbmdSZXNvdXJjZShvd25lciwgcmVzb3VyY2VGaWxlLCB1cmwpOwotCQltaXNzaW5nUmVzb3VyY2VzLmFkZChuZXcgTWlzc2luZ1Jlc291cmNlKG93bmVyLCByZXNvdXJjZUZpbGUsIHVybCkpOwotCX0KLQotCS8qKgotCSAqIGxvZyBpbnZhbGlkIGV4dGVybmFsIGxpbmsKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gdXJsIFN0cmluZwotCSAqIEBwYXJhbSBtZXNzYWdlIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0ludmFsaWRFeHRlcm5hbExpbmsoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIHVybCwKLQkJCVN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyLmxvZ0ludmFsaWRFeHRlcm5hbExpbmsob3duZXIsIHVybCwgbWVzc2FnZSk7Ci0JCWludmFsaWRFeHRlcm5hbExpbmtzLmFkZChuZXcgSW52YWxpZEV4dGVybmFsTGlua0luZm8ob3duZXIsIHVybCwKLQkJCQltZXNzYWdlKSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHJlcG9ydCBhYm91dCB0aGUgY29udGVudCB2YWxpZGF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gWG1sRWxlbWVudAotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFJlcG9ydCgpIHsKLQkJWG1sRWxlbWVudCByZXBvcnRYbWwgPSBuZXcgWG1sRWxlbWVudCgidmFsaWRhdG9ySW5mbyIpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGludmFsaWRFeHRlcm5hbExpbmtzLnNpemUoKSA+IDApIHsKLQkJCVN0cmluZyBtc2cgPSB0aW1lX2Zvcl9leHRlcm5hbF9saW5rX2NoZWNraW5nIC8gMTAwMAotCQkJKyAiIHNlY29uZHMgdmFsaWRhdGluZyBleHRlcm5hbCBsaW5rcyI7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJbG9nSW5mbyhtc2cpOwotCi0JCQlYbWxFbGVtZW50IGludmFsaWRFeHRlcm5hbExpbmtzWG1sID0gcmVwb3J0WG1sCi0JCQkJCS5uZXdDaGlsZCgiaW52YWxpZEV4dGVybmFsTGlua3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChJdGVyYXRvciBpdCA9IGludmFsaWRFeHRlcm5hbExpbmtzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlJbnZhbGlkRXh0ZXJuYWxMaW5rSW5mbyBpbmZvID0gKEludmFsaWRFeHRlcm5hbExpbmtJbmZvKSBpdAotCQkJCQkJLm5leHQoKTsKLQkJCQlpbnZhbGlkRXh0ZXJuYWxMaW5rc1htbC5uZXdDaGlsZCgiZW50cnkiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJ1cmwiLCBpbmZvLnVybCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkJIm93bmVyIiwgKGluZm8ub3duZXIgPT0gbnVsbCkgPyAiIiA6IExpYnJhcnlVdGlsLmdldExvY2FsaXplVHlwZU5hbWUoaW5mby5vd25lcikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoIm1lc3NhZ2UiLCBpbmZvLm1lc3NhZ2UpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpZiAobWlzc2luZ1JlZmVyZW5jZXMuc2l6ZSgpID4gMCkgewotCQkJWG1sRWxlbWVudCBpbnZhbGlkUmVmZXJlbmNlc1htbCA9IHJlcG9ydFhtbAotCQkJCQkubmV3Q2hpbGQoImludmFsaWRSZWZlcmVuY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJCVhtbEVsZW1lbnQgbWlzc2luZ1JlZmVyZW5jZXNYbWwgPSByZXBvcnRYbWwKLQkJCQkJLm5ld0NoaWxkKCJtaXNzaW5nUmVmZXJlbmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbWlzc2luZ1JlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1pc3NpbmdSZWZlcmVuY2UgaW5mbyA9IChNaXNzaW5nUmVmZXJlbmNlKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGluZm8ucmVmRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJCWludmFsaWRSZWZlcmVuY2VzWG1sCi0JCQkJCQkJLm5ld0NoaWxkKCJlbnRyeSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkuc2V0QXR0cmlidXRlKCJlbGVtZW50IiwgaW5mby5saW5rZWRUZXh0KSAvLyROT04tTkxTLTEkCi0JCQkJCQkJLnNldEF0dHJpYnV0ZSgiZ3VpZCIsIGluZm8uZ3VpZCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS5zZXRBdHRyaWJ1dGUoCi0JCQkJCQkJCQkib3duZXIiLCAoaW5mby5vd25lciA9PSBudWxsKSA/ICIiIDogTGlicmFyeVV0aWwuZ2V0TG9jYWxpemVUeXBlTmFtZShpbmZvLm93bmVyKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgewotCQkJCQltaXNzaW5nUmVmZXJlbmNlc1htbAotCQkJCQkJCS5uZXdDaGlsZCgiZW50cnkiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkJCSJlbGVtZW50IiwgKGluZm8ucmVmRWxlbWVudCA9PSBudWxsICkgPyAiIiA6IExpYnJhcnlVdGlsLmdldExvY2FsaXplVHlwZU5hbWUoaW5mby5yZWZFbGVtZW50KSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS5zZXRBdHRyaWJ1dGUoImd1aWQiLCBpbmZvLnJlZkVsZW1lbnQuZ2V0R3VpZCgpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkJCSJvd25lciIsIChpbmZvLm93bmVyID09IG51bGwpID8gIiIgOiBMaWJyYXJ5VXRpbC5nZXRMb2NhbGl6ZVR5cGVOYW1lKGluZm8ub3duZXIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChtaXNzaW5nUmVzb3VyY2VzLnNpemUoKSA+IDApIHsKLQkJCVhtbEVsZW1lbnQgbWlzc2luZ1Jlc291cmNlc1htbCA9IHJlcG9ydFhtbAotCQkJCQkubmV3Q2hpbGQoIm1pc3NpbmdSZXNvdXJjZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChJdGVyYXRvciBpdCA9IG1pc3NpbmdSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1pc3NpbmdSZXNvdXJjZSBpbmZvID0gKE1pc3NpbmdSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCW1pc3NpbmdSZXNvdXJjZXNYbWwKLQkJCQkJCS5uZXdDaGlsZCgiZW50cnkiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJ1cmwiLCBpbmZvLnVybCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkJInJlc291cmNlIiwgKGluZm8ucmVzb3VyY2VGaWxlID09IG51bGwpID8gIiIgOiBpbmZvLnJlc291cmNlRmlsZS5nZXRQYXRoKCkpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkJIm93bmVyIiwgKGluZm8ub3duZXIgPT0gbnVsbCkgPyAiIiA6IExpYnJhcnlVdGlsLmdldExvY2FsaXplVHlwZU5hbWUoaW5mby5vd25lcikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJfQotCQl9Ci0KLQkJbG9uZyBwdWJsaXNoaW5nX3RpbWUgPSAoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lSW5NaWxsaXMoKSAtIHB1Ymxpc2hpbmdfc3RhcnQpIC8gMTAwMDsKLQkJaW50IG1pbnV0ZXMgPSAoaW50KSBwdWJsaXNoaW5nX3RpbWUgLyA2MDsKLQkJaW50IHNlY29uZHMgPSAoaW50KSBwdWJsaXNoaW5nX3RpbWUgLSBtaW51dGVzICogNjA7Ci0KLQkJbG9nSW5mbygiUHVibGlzaGluZyB0aW1lOiAiICsgbWludXRlcyArICIgbWludXRlcyAiICsgc2Vjb25kcyArICIgc2Vjb25kcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCXJldHVybiByZXBvcnRYbWw7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgY2F0ZWdvcnkgdGhhdCBzaG91bGQgYmUgcHVibGlzaGVkLgotCSAqIAotCSAqIEBwYXJhbSBlIENvbnRlbnRDYXRlZ29yeQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFZhbGlkQ2F0ZWdvcnkoQ29udGVudENhdGVnb3J5IGUpIHsKLQkJaWYgKCF2YWxpZENhdGVnb3JpZXMuY29udGFpbnMoZSkpIHsKLQkJCXZhbGlkQ2F0ZWdvcmllcy5hZGQoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBkaXNjYXJkZWQgb3Igbm90IGRpc2NhcmRlZCBlbGVtZW50cyB3aWxsIGJlCi0JICogdHJlYXRlZCBhcyBvdXQgc2lkZSB0aGUgY29uZmlndXJzYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQgdGhlIG93bmVyIG9mIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUgCi0JICogCQkJICBPYmplY3QgRVN0cnVjdHVyYWxGZWF0dXJlIG9yIE9wcG9zaXRlRmVhdHVyZQotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50IHRoZSBlbGVtZW50IHRvIGJlIGNoZWNrZWQKLQkgKiAgICAgICAgICAgIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlzY2FyZGVkKE1ldGhvZEVsZW1lbnQgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmIChkaXNjYXJkZWRFbGVtZW50cy5jb250YWlucyhlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBhIENvbnRlbnRDYXRlZ29yeSBhbmQgaXMgbm90IGRpc2NhcmRlZAotCQlpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCQkJaWYgKHZhbGlkQ2F0ZWdvcmllcy5jb250YWlucyhlKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJLy8gb3RoZXJ3aXNlLCBjaGVjayBpZiBpdCBzaG91bGQgYmUgZGlzY2FyZGVkIG9yIG5vdAotCQkJLy8gVE9ETwotCQkJLy8gZm9yIG5vdywgZGlzY2FyZCBhbGwgcmVmZXJlbmNlZCBjb250ZW50IGNhdGVnb3JpZXMgaWYgdGhleSBhcmUKLQkJCS8vIG5vdCBpbmNsdWRlZCBpbiB0aGUgcHVibGlzaGluZyB2aWV3LgotCQkJLy8gTk8hISEhISEhISEhISEgVGhpcyB3aWxsIGxlYWQgdG8gYSBsb3Qgb2YgYnJva2VuIGxpbmtzIGFuZAotCQkJLy8gbWlzc2luZyBlbGVtZW50Ci0JCQkvLyBUT08gc3Ryb25nIGxpbWl0YXRpb24uIExldCBvcGVuIGl0IGZvciBub3cKLQkJCS8vIFB1Ymxpc2hpbmc6T3ZlcnZpZXcgcGFnZSBpbiBwdWJsaXNoZWQgd2Vic2l0ZQotCQkJLy8gaGF2ZSBicm9rZW4gbGlua3MgdG8gQk0KLQkJCS8vIHJldHVybiB0cnVlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgYSByZWZlcmVuY2VkIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBlIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZWZlcmVuY2VkRWxlbWVudChNZXRob2RFbGVtZW50IG93bmVyLCBNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZG9uJ3QgYWRkIGRpc2NhcmRlZCBlbGVtZW50cwotCQlpZiAoaXNEaXNjYXJkZWQob3duZXIsIG51bGwsIGUpKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiRWxlbWVudCBpcyBkaXNjYXJkZWQ6ICIgKyBMaWJyYXJ5VXRpbC5nZXRMb2NhbGl6ZVR5cGVOYW1lKGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGUgIT0gbnVsbCAmJiAhcmVmZXJlbmNlZEVsZW1lbnRzLmNvbnRhaW5zKGUpCi0JCQkJJiYgIXB1Ymxpc2hlZEVsZW1lbnRzLmNvbnRhaW5zKGUpKSB7Ci0JCQlyZWZlcmVuY2VkRWxlbWVudHMuYWRkKGUpOwotCQkJbG9nUmVmZXJlbmNlKG93bmVyLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGxvZyBhIHJlZmVybmVjZQotCSAqIAotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGUgTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ1JlZmVyZW5jZShNZXRob2RFbGVtZW50IG93bmVyLCBNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCItLS0gUmVmZXJlbmVjZSBFbGVtZW50IEFkZGVkOiAiICsgTGlicmFyeVV0aWwuZ2V0TG9jYWxpemVUeXBlTmFtZShlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIHJlbW92ZSBlbGVtZW50IGZyb20gcmVmZXJlbmNlZCBsaXN0Ci0JICogCi0JICogQHBhcmFtIGUgTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVJlZmVyZW5jZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAocmVmZXJlbmNlZEVsZW1lbnRzLmNvbnRhaW5zKGUpKSB7Ci0JCQlyZWZlcmVuY2VkRWxlbWVudHMucmVtb3ZlKGUpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIi0tLSBSZWZlcmVuY2UgRWxlbWVudCBSZW1vdmVkOiAiICsgTGlicmFyeVV0aWwuZ2V0TG9jYWxpemVUeXBlTmFtZShlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCBhbGwgdGhlIHJlZmVyZW5jZWQgZWxlbWVudHMKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWZlcmVuY2VkRWxlbWVudHMoKSB7Ci0JCXJldHVybiByZWZlcmVuY2VkRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogYWV0IHRoZSBkaXNjYXJkZWQgZWxlbWVudCBmb3IgdGhpcyBwdWJsaWNhdGlvbi4gSWYgYW4gZWxlbWVudCBpcwotCSAqIGRpc2NhcmRlZCwgaXQgc2hvdWxkIG5vdCBiZSBwdWJsaXNoZWQgYW5kIGxpbmsgdG8gaXQgc2hvdWxkIGJlIGxpbmsgdG8KLQkgKiBtaXNpbmcgZWxlbWVudCBwYWdlCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNjYXJkZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZSkgewotCi0JCWlmIChlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICghZGlzY2FyZGVkRWxlbWVudHMuY29udGFpbnMoZSkpIHsKLQkJCWRpc2NhcmRlZEVsZW1lbnRzLmFkZChlKTsKLQkJfQotCi0JCS8vIGlmIHRoIGZkaXNjYXJkZWQgZWxlbWVudCBpcyBpbiB0aGUgcmVmZXJlbmNlIGxpc3QsIHJlbW92ZSBpdCBhcyB3ZWxsCi0JCXJlbW92ZVJlZmVyZW5jZWRFbGVtZW50KGUpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIGFuIGVsZW5tZW50IGlzIHJlZmVyZW5jZWQgb3Igbm90LgotCSAqIAotCSAqIEBwYXJhbSBlIE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW5jZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gKGUgIT0gbnVsbCkgJiYgcmVmZXJlbmNlZEVsZW1lbnRzLmNvbnRhaW5zKGUpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgcHVibGlzaGVkIGVsZW1lbnRzCi0JICogCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0UHVibGlzaGVkRWxlbWVudHMoKSB7Ci0JCXJldHVybiBwdWJsaXNoZWRFbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIGRlZmF1bHQgdGFyZ2V0IGZvciB0aGUgcmVmZXJlbmNlZCBlbGVtZW50cwotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXQgTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldEVsZW1lbnQoTWV0aG9kRWxlbWVudCB0YXJnZXQpIHsKLQkJdGhpcy5kZWZhdWx0VGFyZ2V0ID0gdGFyZ2V0OwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZXJlIGlzIGEgY2xvc3VyZSBvciBub3QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDbG9zdXJlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgYW4gZWxlbWVudCBpcyBpbiBjbG9zdXJlIG9yIG5vdC4KLQkgKiAKLQkgKiBAcGFyYW0gZSBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW5DbG9zdXJlKE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgZWxlbWVudHMgdG8gY2xvc3VyZQotCSAqIAotCSAqIEBwYXJhbSBpdGVtcyBMaXN0Ci0JICovCi0JcHVibGljIHZvaWQgYWRkQ2xvc3VyZUVsZW1lbnRzKExpc3QgaXRlbXMpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIG1ha2UgYSBjbG9zdXJlCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBtYWtlRWxlbWVudENsb3N1cmUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGZsYWcgb24gd2hldGhlciB0byBzaG93IGV4dHJhIGRlc2NyaXB0b3IgaW5mby4gCi0JICogSWYgdHJ1ZSwgaW5mb3JtYXRpb24gZnJvbSBsaW5rZWQgZWxlbWVudCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkZXNjcmlwdG9yIHBhZ2UuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgZmxhZwotCSAqIAotCSAqIEBwYXJhbSBzaG93IGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoYm9vbGVhbiBzaG93KSB7Ci0JCXNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycyA9IHNob3c7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNWU5Yzk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRGVmYXVsdEVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogUmVhbGl6ZXIgZm9yIHB1Ymxpc2hpbmcuCi0gKiBSZWFsaXplcyB0aGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiBhbmQgcmVhbGl6ZSBvcHRpb25zLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplciBleHRlbmRzIERlZmF1bHRFbGVtZW50UmVhbGl6ZXIgewotCi0JUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yOwotCQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIGNvbmZpZyBNZXRob2RDb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHZhbGlkYXRvciBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvcgotCSAqLwotCXB1YmxpYyBQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJc3VwZXIoY29uZmlnKTsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCi0JLyoqCi0JICogcmVhbGl6ZSB0aGUgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCByZWFsaXplKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQkKLQkJZWxlbWVudCA9IHN1cGVyLnJlYWxpemUoZWxlbWVudCk7Ci0JCQotCQlpZiAoIGVsZW1lbnQgPT0gbnVsbCApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQkvLyBQdWJsaXNoaW5nIHNob3VsZCBub3QgZ2VuZXJhdGUgbGlua3MgdG8gdW5wdWJsaXNoZWQgY2F0ZWdvcmllcwotCQlpZiAoIHZhbGlkYXRvci5pc0Rpc2NhcmRlZChudWxsLCBudWxsLCBlbGVtZW50KSApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JCi0JLyoqCi0JICogcmVhbGl6ZSB0aGUgbGlzdCBvZiBmZWF0dXJlIHZhbHVlcyBhbmQgcmV0dXJucyBhIG5ldyBsaXN0IG9mIHZhbHVlcwotCSAqIFRoZSBuZXcgbWlnaHQgYmUgYSByZS1zb3J0aW5nIG9mIHRoZSBvcmlnaW5hbCBsaXN0IAotCSAqIG9yIHNvbWUgb2YgdGhlIHZhbHVlcyBjYW4gYmUgZmlsdGVyZWQgb3V0LCBkZXBlbmRpbmcgb24gdGhlIGRldGFpbCBpbXBsZW1lbnRhdGlvbgotCSAqIE5vdGU6IHRoZSBsaXN0IHZhbHVlIHBhc3NlZCBpbiBtaWdodCBiZSB1cGRhdGVkIGFzIHdlbGwuCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlIEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIEBwYXJhbSB2YWx1ZXMgTGlzdAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IHJlYWxpemUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCAKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBMaXN0IHZhbHVlcykKLQl7Ci0JCWlmICggdmFsdWVzID09IG51bGwgfHwgdmFsdWVzLnNpemUoKSA9PSAwICkgewotCQkJcmV0dXJuIHZhbHVlczsKLQkJfQotCQkKLQkJTGlzdCBpdGVtcyA9IHN1cGVyLnJlYWxpemUoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWVzKTsKLQkJaWYgKCB2YWxpZGF0b3IuaGFzQ2xvc3VyZSgpICkgewotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKCBpIDwgaXRlbXMuc2l6ZSgpICkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0ZW1zLmdldChpKTsKLQkJCQlpZiAoIHZhbGlkYXRvci5pc0Rpc2NhcmRlZChudWxsLCBmZWF0dXJlLCBlKSApIHsKLQkJCQkJaXRlbXMucmVtb3ZlKGkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hpbmdTZXJ2aWNlRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9QdWJsaXNoaW5nU2VydmljZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZjVjMGZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hpbmdTZXJ2aWNlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYSBQdWJsaXNoaW5nIFNlcnZpY2Ugb3BlcmF0aW9uIGhhcyBmYWlsZWQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hpbmdTZXJ2aWNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjA2OTE3NTE4ODU5ODYxMzUxM0w7Ci0KLQkvKioKLQkgKiBUaGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCBUaHJvd2FibGUgcm9vdENhdXNlOwotCQotCS8qKgotCSAqIFRoZSBlcnJvciBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXJyb3JNc2c7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaGluZ1NlcnZpY2VFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0Jcm9vdENhdXNlCVRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHVibGljIFB1Ymxpc2hpbmdTZXJ2aWNlRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJdGhpcyhyb290Q2F1c2UsIHJvb3RDYXVzZS5nZXRNZXNzYWdlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbQllcnJvck1zZwlUaGUgZXJyb3IgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaGluZ1NlcnZpY2VFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXRoaXMobnVsbCwgZXJyb3JNc2cpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24gYW5kIHRoZSBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbQlyb290Q2F1c2UJVGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiBAcGFyYW0JZXJyb3JNc2cJVGhlIGVycm9yIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hpbmdTZXJ2aWNlRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UsIFN0cmluZyBlcnJvck1zZykgewotCQlzdXBlcihlcnJvck1zZyk7Ci0JCXRoaXMucm9vdENhdXNlID0gcm9vdENhdXNlOwotCQl0aGlzLmVycm9yTXNnID0gZXJyb3JNc2c7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuCVRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHVibGljIFRocm93YWJsZSBnZXRSb290Q2F1c2UoKSB7Ci0JCXJldHVybiByb290Q2F1c2U7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0FuY2hvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvQW5jaG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIwYjY1OGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvQW5jaG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotcHVibGljIGNsYXNzIEFuY2hvcgotewotICAgcHJpdmF0ZSBTdHJpbmcgdGV4dD1udWxsOwotICAgcHJpdmF0ZSBTdHJpbmcgYW5jaG9yPW51bGw7Ci0KLSAgIEFuY2hvcihTdHJpbmcgdGV4dCwgU3RyaW5nIGFuY2hvcikKLSAgIHsKLSAgICAgIHRoaXMudGV4dCA9IHRleHQ7Ci0gICAgICB0aGlzLmFuY2hvciA9IGFuY2hvcjsKLSAgIH0KLQotICAgU3RyaW5nIGdldEFuY2hvcigpCi0gICB7Ci0gICAgICByZXR1cm4gYW5jaG9yOwotICAgfQotCi0gICBTdHJpbmcgZ2V0VGV4dCgpCi0gICB7Ci0gICAgICByZXR1cm4gdGV4dDsKLSAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9EZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0RlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyN2Y0MjNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0RlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4OwotCi0KLXB1YmxpYyBjbGFzcyBEZWYKLXsKLQotICAgIC8vIEFyZ3VtZW50IHBhcmFtZXRlcgotICAgIHN0YXRpYyBTdHJpbmcgQXJndW1lbnRQcmVmaXggPSAiLSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFByaW50VGVtcEZpbGVBcmcgPSBEZWYuQXJndW1lbnRQcmVmaXggKyAidGYiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBSZXNwb25zZUZpbGVBcmcgPSBEZWYuQXJndW1lbnRQcmVmaXggKyAiciI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIENoYXJhY3RlclNldEFyZyA9IERlZi5Bcmd1bWVudFByZWZpeCArICJjIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTGFuZ3VhZ2VGaWxlQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgImwiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBUcmltQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgInQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBUb3BEaXJBcmcgPSBEZWYuQXJndW1lbnRQcmVmaXggKyAiZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFJlc3VsdEZpbGVBcmcgPSBEZWYuQXJndW1lbnRQcmVmaXggKyAicmYiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBTaG93VXNhZ2VBcmcgPSBEZWYuQXJndW1lbnRQcmVmaXggKyAiaCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEZpbGVBcmcgPSBEZWYuQXJndW1lbnRQcmVmaXggKyAiZiI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFByaW50RGVidWdBcmcgPSBEZWYuQXJndW1lbnRQcmVmaXggKyAiZGVidWciOyAvLyROT04tTkxTLTEkCi0gICAgLy9LZXl3b3JkaW5kZXhlclBhcmFtCi0gICAgc3RhdGljIFN0cmluZyBJbmRleFRpdGxlID0gIm1haW50aXRsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFNlZUFsc28gPSAic2VlYWxzbyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFNlZSA9ICJzZWUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWxpbWV0ZXJzID0gImRlbGltZXRlcnMiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBDaGFyYWN0ZXJTZXQgPSAiY2hhcmFjdGVyc2V0IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgS2V5V29yZFByZWZpeCA9ICJwcmVmaXgiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBLZXlXb3JkTGV2ZWxTZXBhcmF0b3IgPSAibGV2ZWxzZXBhcmF0b3IiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0S2V5V29yZFByZWZpeCA9ICJYRV8iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0S2V5V29yZExldmVsU2VwYXJhdG9yID0gIl9fIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTGVhdmVEaXIgPSAibGVhdmVEaXIiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBTdGFydERpciA9ICJzdGFydERpciI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEtleVdvcmRGaWxlID0gImtleXdvcmRmaWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTWFpblJlc3VsdEZpbGUgPSAibWFpbnJlc3VsdGZpbGUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBJbmRleFJlc3VsdEZpbGUgPSAiaW5kZXhyZXN1bHRmaWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgSW5kZXhIZWlnaHQgPSAiaW5kZXhoZWlnaHQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBLZXlXb3JkUmVzdWx0RmlsZSA9ICJrZXl3b3JkcmVzdWx0ZmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEtleVdvcmRUYXJnZXQgPSAia2V5d29yZHRhcmdldCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEluZGV4VGFyZ2V0ID0gImluZGV4dGFyZ2V0IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTXVsdGlEb2NLZXlXb3JkID0gIm11bGl0ZG9jdW1lbnRrZXl3b3JkIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgU2hvd0RvY1RpdGxlID0gInNob3dkb2N1bWVudHRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgc3RhdGljIFN0cmluZyBIZWFkZXJGaWxlID0gImhlYWRlcmZpbGUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBGb290ZXJGaWxlID0gImZvb3RlcmZpbGUiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvL1NpdG1hcCBwYXJhbWV0ZXIKLSAgICBzdGF0aWMgU3RyaW5nIFRydW5jYXRlTGFiZWwgPSAidHJ1bmNhdGVsYWJlbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIENvbnZlcnRBbXBlcnNhbmQgPSAiY29udmVydGFtcGVyc2FuZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFRhYmxlV2lkdGggPSAidGFibGV3aWR0aCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgaW50IERlZmF1bHRSb3dTcGFuID0gMTsKLSAgICBzdGF0aWMgaW50IERlZmF1bHRDb2xTcGFuID0gMTsKLSAgICBzdGF0aWMgU3RyaW5nIE1vZGUgPSAibW9kZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIE5vZGVTdGFydCA9ICI8LS0iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBOb2RlRW5kID0gIi0tPiI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIE5vZGVUZXh0ID0gImxhYmVsIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTm9kZUxldmVsID0gImxldmVsIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgQ29sdW1uV2lkdGggPSAiY29sd2lkdGgiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBDb2x1bW4gPSAiY29sIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgUm93ID0gInJvdyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIENvbFNwYW4gPSAiY29sc3BhbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFJvd1NwYW4gPSAicm93c3BhbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIENlbGxDb2xvciA9ICJjZWxsY29sb3IiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBMaW5rcyA9ICJsaW5rcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFZpc2l0T25jZSA9ICJ2aXNpdG9uY2UiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBPbmx5VGhpcyA9ICJvbmx5dGhpcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFRpdGxlTGVuZ3RoID0gInRpdGxlbGVuZ3RoIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFRpdGxlTGVuZ3RoID0gImRlZmF1bHR0aXRsZWxlbmd0aCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHN0YXRpYyBTdHJpbmcgUmVtb3ZlRGF0RmlsZSA9ICJyZW1vdmVkYXRmaWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgU3lub255bUZpbGUgPSAic3lub255bWZpbGUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBTdWJUcmVlID0gImluY2x1ZGVzdWJ0cmVlIjsgLy8kTk9OLU5MUy0xJAotIC8vICAgc3RhdGljIFN0cmluZyBEYXRUb3AgPSAiZGF0YXRvcCI7Ci0gICAgc3RhdGljIFN0cmluZyBSZXNGaWxlID0gInJlc3VsdGZpbGUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBSZWxQYXRoID0gInJlbGF0aXZlcGF0aCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIE1heExldmVscyA9ICJtYXhsZXZlbHMiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBMZXZlbFN0eWxlID0gImxldmVsc3R5bGUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0U3R5bGUgPSAiZGVmYXVsdHN0eWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgSGVhZExpbmVTdHlsZSA9ICJoZWFkbGluZXN0eWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTGV2ZWxGb250ID0gImxldmVsZm9udCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIERlZmF1bHRGb250ID0gImRlZmF1bHRmb250IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgSGVhZExpbmVGb250ID0gImhlYWRsaW5lZm9udCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEJvbGQgPSAiYm9sZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEl0YWxpYyA9ICJpdGFsaWMiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBQbGFpbiA9ICJwbGFpbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHN0YXRpYyBTdHJpbmcgTWF4T3Blbk5vZGVzUGFyYW0gPSAibWF4dmlzaWJsZW5vZGVzIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBpbnQgRGVmYXVsdE1heE9wZW5Ob2RlcyA9IDEwMDsKLSAgICBzdGF0aWMgU3RyaW5nIEdhcmJhZ2VDb2xsZWN0b3JQYXJhbSA9ICJnYyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIERlZmF1bHRHYXJiYWdlQ29sbGVjdG9yID0gIjEwIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgVmVydGljYWxJbmNyZW1lbnRQYXJhbSA9ICJ2ZXJ0aWNhbGluY3JlbWVudCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEhvcml6b250YWxJbmNyZW1lbnRQYXJhbSA9ICJob3Jpem9udGFsaW5jcmVtZW50IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTWFpbHRvID0gIm1haWx0bzoiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWJ1Z1BhcmFtID0gImRlYnVnIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgV1dXUm9vdFBhcmFtID0gInd3d3Jvb3QiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBJbWFnZURpciA9ICJpbWFnZXMiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBJbWFnZUljb25QYXJhbSA9ICJmcmFtZWltYWdlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgQmdJbWFnZVBhcmFtID0gImJnaW1hZ2UiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBWaXNpdE9uY2VNYXJrQWxsUGFyYW0gPSJ2aXNpdG9uY2VtYXJrYWxsIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgU2hhZG93UGFyYW0gPSJtb3VzZW92ZXJzaGFkb3ciOyAvLyROT04tTkxTLTEkCi0KLSAgICBzdGF0aWMgU3RyaW5nIExvYWRpbmdUcmVlUGFyYW0gPSAibG9hZGluZ2xhYmVsIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTG9hZGluZ1RyZWVCcm93c2VyID0gIlRyZWVCcm93c2VyIGlzIGxvYWRpbmc6OiI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIExvYWRpbmdUcmVlID0gIkxvYWRpbmcgdHJlZS4gUGxlYXNlIHdhaXQuLi4iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBMb2FkaW5nU3ViVHJlZSA9ICJMb2FkaW5nIHN1YiB0cmVlLiBQbGVhc2Ugd2FpdC4uLiI7IC8vJE5PTi1OTFMtMSQKLQotCi0gICAgc3RhdGljIFN0cmluZyBDaGFyYWN0ZXJzZXRQYXJhbSA9ICJjaGFyYWN0ZXJzZXQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWxpbVBhcmFtID0gImRlbGltZXRlcnMiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBMT0FEX1BBR0UgPSAibG9hZHBhZ2UiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBGSU5JU0hfUEFHRSA9ICJmaW5pc2hwYWdlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGF0YUZpbGVQYXJhbSA9ICJkYXRhZmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIERhdGFGaWxlID0gInRyZWUuZGF0IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTm9uZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBIdHRwID0gImh0dHA6Ly8iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBIdHRwcyA9ICJodHRwczovLyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEZ0cCA9ICJmdHA6Ly8iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBGaWxlID0gImZpbGU6LyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFNsYXNoID0gIi8iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBTcGFjZSA9ICIgIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgWmlwRmlsZSA9ICIuemlwIjsgLy8kTk9OLU5MUy0xJAotICAgIC8vQ29sb3IgcGFyYW1ldGVycwotICAgIHN0YXRpYyBTdHJpbmcgQmdDb2xvclBhcmFtID0gImJnY29sb3IiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBCZ0NvbG9yID0gIjI1NSwyNTUsMjU1IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRmdDb2xvclBhcmFtID0gImZnY29sb3IiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBGZ0NvbG9yID0gIjAsMCwwIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgU2VsQmdDb2xvclBhcmFtID0gInNlbGJnY29sb3IiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBTZWxCZ0NvbG9yID0gIjAsMCwyNTUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBTZWxGZ0NvbG9yUGFyYW0gPSAic2VsZmdjb2xvciI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFNlbEZnQ29sb3IgPSAiMjU1LDI1NSwyNTUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBWaXNpdENvbG9yUGFyYW0gPSAidmlzaXRjb2xvciI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFZpc2l0Q29sb3IgPSAiMjU1LDUxLDUxIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTW91c2VPdmVyQ29sb3JQYXJhbSA9ICJtb3VzZW92ZXJjb2xvciI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIE1vdXNlT3ZlckNvbG9yID0gImJsdWUiOyAvLyROT04tTkxTLTEkCi0KLQotICAgIC8vRnJhbWUgcGFyYW1ldGVycwotICAgIHN0YXRpYyBTdHJpbmcgTGFiZWxQb3NQYXJhbSA9ICJsYWJlbHBvcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIExhYmVsUG9zID0gImJlbG93IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRnJhbWVUaXRsZVBhcmFtID0gImZyYW1ldGl0bGUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBGcmFtZVRpdGxlID0gIlRyZWUgQnJvd3NlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEZyYW1lV2lkdGhQYXJhbSA9ICJmcmFtZXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRnJhbWVIZWlnaHRQYXJhbSA9ICJmcmFtZWhlaWdodCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEZyYW1lV2lkdGggPSAiMjUwIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRnJhbWVIZWlnaHQgPSAiNDAwIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRnJhbWVQYXJhbSA9ICJmcmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIERlZmF1bHRGcmFtZSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEZhbHNlID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgVHJ1ZSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgc3RhdGljIFN0cmluZyBMYWJlbFBhcmFtID0gImZyYW1lbGFiZWwiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0TGFiZWwgPSAiVHJlZSBCcm93c2VyIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTGFiZWxCZ0NvbG9yUGFyYW09ICJmcmFtZWxhYmVsYmdjb2xvciI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIERlZmF1bHRMYWJlbEJnQ29sb3I9ICIyNTUsMjU1LDI1NSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEJvcmRlclBhcmFtID0gImJvcmRlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIERlZmF1bHRCb3JkZXIgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvL1RyZWUgY29uc3RhbnRzCi0gICAgc3RhdGljIFN0cmluZyBDZWxsU2l6ZVBhcmFtID0gImNlbGxzaXplIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENlbGxTaXplID0gIjE2IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBpbnQgSW1hZ2VJbnNldCA9IDM7Ci0gICAgc3RhdGljIGludCBUZXh0SW5zZXQgPSA2OwotICAgIHN0YXRpYyBpbnQgVGV4dEJhc2VMaW5lID0gMzsKLSAgICBzdGF0aWMgaW50IERvdWJsZUNsaWNrUmVzb2x1dGlvbiA9IDMzMzsKLSAgICBzdGF0aWMgaW50IFNjcm9sbFdpZHRoID0gMTY7Ci0gICAgc3RhdGljIFN0cmluZyBTY3JvbGxCYXJMZWZ0UGFyYW0gPSAic2Nyb2xsYmFydG9sZWZ0IjsgLy8kTk9OLU5MUy0xJAotCi0KLSAgICBzdGF0aWMgU3RyaW5nIERlZmF1bHRUYXJnZXRQYXJhbSA9ICJ0YXJnZXQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0VGFyZ2V0ID0gIl90b3AiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBUcmVlRm9udFBhcmFtID0gInRyZWVmb250IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFRyZWVGb250ID0gIkFyaWFsLFBMQUlOLDEyIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTGFiZWxGb250UGFyYW0gPSAiZnJhbWVsYWJlbGZvbnQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0TGFiZWxGb250ID0gIkFyaWFsLEJPTEQsMTIiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvRGVmaW5pdGlvbk9iamVjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvRGVmaW5pdGlvbk9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OGZkYzg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0RlZmluaXRpb25PYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vL09iamVjdCBob2xkaW5nIGRlZmluaXRpb25maWxlIGluZm9ybWF0aW9uCi1wdWJsaWMgY2xhc3MgRGVmaW5pdGlvbk9iamVjdAotewotICBwcml2YXRlIFN0cmluZyBpbmRleHRpdGxlID0gIkluZGV4IC0gQmFzaWMgVW5pZmllZCBQcm9jZXNzIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIFN0cmluZyBzZWUgPSAiLCBTZWUgIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIFN0cmluZyBzZWVhbHNvICA9ICIsIFNlZSBhbHNvICI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBTdHJpbmcgY2hhcmFjdGVyc2V0ID0gInV0Zi04IjsKLSAgU3RyaW5nIGtleVdvcmRTZXBhcmF0b3IgPSAifCI7IC8vJE5PTi1OTFMtMSQKLSAgU3RyaW5nIGxldmVsU2VwYXJhdG9yUmVwbGFjZSA9ICI6IjsgLy8kTk9OLU5MUy0xJAotICBTdHJpbmcgd3d3Um9vdCA9IG51bGw7Ci0gIGludCBzdGlwTGVuZ3RoPTA7Ci0gIFN0cmluZyByZWxhdGl2ZXBhdGggPSBudWxsOwotICBTdHJpbmcgdGFyZ2V0PW51bGw7Ci0gIFN0cmluZyBzcGVjS2V5V29yZEZpbGU9bnVsbDsKLSAgU3RyaW5nIG1haW5SZXN1bHRGaWxlPW51bGw7Ci0gIFN0cmluZyBpbmRleFJlc3VsdEZpbGU9bnVsbDsKLSAgU3RyaW5nIGluZGV4VGFyZ2V0PW51bGw7Ci0gIFN0cmluZyBpbmRleEhlaWdodD1udWxsOwotICBTdHJpbmcga2V5d29yZFRhcmdldD1udWxsOwotICBTdHJpbmcga2V5d29yZFJlc3VsdEZpbGU9bnVsbDsKLSAgU3RyaW5nIGhlYWRlckZpbGU9bnVsbDsKLSAgU3RyaW5nIGZvb3RlckZpbGU9bnVsbDsKLSAgU3RyaW5nIGtleVdvcmRQcmVmaXg9RGVmLkRlZmF1bHRLZXlXb3JkUHJlZml4OwotICBTdHJpbmcga2V5V29yZExldmVsU2VwYXJhdG9yPURlZi5EZWZhdWx0S2V5V29yZExldmVsU2VwYXJhdG9yOwotCi0gIGJvb2xlYW4gbXVsdGlkb2N1bWVudGtleXdvcmQ9ZmFsc2U7Ci0gIGJvb2xlYW4gc2hvd2RvY3VtZW50dGl0bGU9ZmFsc2U7Ci0gIFZlY3RvciBzdG9wRGlyc1Y9bnVsbDsKLSAgIEhhc2h0YWJsZSBmb250RGVmaW5pdGlvbnM9bnVsbDsKLSAgSGFzaHRhYmxlIHN0eWxlRGVmaW5pdGlvbnM9bnVsbDsKLQotICBwcml2YXRlIEZpbGUgZGVmRmlsZVJvb3Q7Ci0KLSAgLy9Db25zdHJ1Y3RvciB0aGF0IHBhcnNlcyB0aGUgZGVmaW5pdGlvbmZpbGUKLSAgRGVmaW5pdGlvbk9iamVjdChTdHJpbmcgcHViRGlyLCBTdHJpbmcgZGVmZmlsZSwgU3RyaW5nIGNoYXJTZXQpCi0gIHsKLQkgIHNldHd3d1Jvb3QocHViRGlyKTsKLQkgIGRlZkZpbGVSb290ID0gbmV3IEZpbGUoZGVmZmlsZSkuZ2V0UGFyZW50RmlsZSgpOwotCi0gICAgIC8vIFJlYWQgdGhlIGRlZmluaXRpb24gZmlsZSBhbmQgc3BsaXQgdGhlIGRlZmZpbGUgaW50byBpdCdzIGluZGl2aWR1YWwgbGluZXMuCi0JU3RyaW5nIGluZmlsZSA9IE1pc2NTdGF0aWMubG9hZEZpbGUoZGVmZmlsZSxjaGFyU2V0KTsKLSAgICBTdHJpbmdUb2tlbml6ZXIgcGFyc2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbmZpbGUsICJcdFxuIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICBzdG9wRGlyc1YgPSBuZXcgVmVjdG9yKCk7Ci0gICAgIGZvbnREZWZpbml0aW9ucyA9IG5ldyBIYXNodGFibGUoMTApOwotICAgICBzdHlsZURlZmluaXRpb25zID0gbmV3IEhhc2h0YWJsZSgxMCk7Ci0gICAgIHdoaWxlKHBhcnNlci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgIHsKLSAgICAgICAgU3RyaW5nIHBhcmFtID0gcGFyc2VyLm5leHRUb2tlbigpLnRyaW0oKTsKLQotICAgICAgICBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5MZXZlbEZvbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgIGFzaWduRm9udChwYXJzZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuTGV2ZWxTdHlsZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgYXNpZ25TdHlsZShwYXJzZXIpOwotICAgICAgICB9ICAgICAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpOwotICAgICAgICAgICBpZih2YWx1ZT09bnVsbCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRGVmaW5pdGlvbk9iamVjdDphZGRWYWx1ZVxuIiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICBIZWxwTWVzc2FnZXMuUEFSQU1FVEVSX01JU1NJTkdfVkFMVUUgKyBwYXJhbSk7Ci0gICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGFzaWduVmFsdWUocGFyYW0sIHZhbHVlKTsKLSAgICAgICAgfQotICAgICB9Ci0KLSAgfQotCi0gIC8vQ2hlY2sgaWYgZW5vdWdoIGlucHV0IGlzIHJlYWQKLSAgYm9vbGVhbiBlbm91Z2hJbnB1dCgpCi0gIHsKLSAgICAgYm9vbGVhbiBlbm91Z2g9dHJ1ZTsKLSAgICAgU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgIGJ1ZmYuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgIGlmKHd3d1Jvb3Q9PW51bGwpCi0gICAgIHsKLSAgICAgICAgYnVmZi5hcHBlbmQoSGVscE1lc3NhZ2VzLlBBUkFNRVRFUl9NSVNTSU5HICsgRGVmLldXV1Jvb3RQYXJhbSk7Ci0gICAgICAgIGVub3VnaD1mYWxzZTsKLSAgICAgfQotCi0gICAgIGlmKGtleXdvcmRSZXN1bHRGaWxlPT1udWxsKQotICAgICB7Ci0gICAgICAgIGJ1ZmYuYXBwZW5kKEhlbHBNZXNzYWdlcy5QQVJBTUVURVJfTUlTU0lORyArIERlZi5LZXlXb3JkUmVzdWx0RmlsZSk7Ci0gICAgICAgIGVub3VnaD1mYWxzZTsKLSAgICAgfQotCi0gICAgIGlmKGluZGV4UmVzdWx0RmlsZSE9bnVsbCAmJiBtYWluUmVzdWx0RmlsZT09bnVsbCkKLSAgICAgewotICAgICAgICBidWZmLmFwcGVuZChIZWxwTWVzc2FnZXMuUEFSQU1FVEVSX01JU1NJTkcgKyBEZWYuTWFpblJlc3VsdEZpbGUpOwotICAgICAgICBlbm91Z2g9ZmFsc2U7Ci0gICAgIH0KLQotICAgICBpZihpbmRleFJlc3VsdEZpbGUhPW51bGwgJiYgaW5kZXhUYXJnZXQ9PW51bGwpCi0gICAgIHsKLSAgICAgICAgYnVmZi5hcHBlbmQoSGVscE1lc3NhZ2VzLlBBUkFNRVRFUl9NSVNTSU5HICsgRGVmLkluZGV4VGFyZ2V0KTsKLSAgICAgICAgZW5vdWdoPWZhbHNlOwotICAgICB9Ci0KLSAgICAgaWYoaW5kZXhSZXN1bHRGaWxlIT1udWxsICYmIGtleXdvcmRUYXJnZXQ9PW51bGwpCi0gICAgIHsKLSAgICAgICAgYnVmZi5hcHBlbmQoSGVscE1lc3NhZ2VzLlBBUkFNRVRFUl9NSVNTSU5HICsgRGVmLktleVdvcmRUYXJnZXQpOwotICAgICAgICBlbm91Z2g9ZmFsc2U7Ci0gICAgIH0KLQotICAgICBpZihpbmRleFJlc3VsdEZpbGUhPW51bGwgJiYgaW5kZXhIZWlnaHQ9PW51bGwpCi0gICAgIHsKLSAgICAgICAgYnVmZi5hcHBlbmQoSGVscE1lc3NhZ2VzLlBBUkFNRVRFUl9NSVNTSU5HICsgRGVmLkluZGV4SGVpZ2h0KTsKLSAgICAgICAgZW5vdWdoPWZhbHNlOwotICAgICB9Ci0KLSAgICAgaWYocmVsYXRpdmVwYXRoPT1udWxsKQotICAgICB7Ci0gICAgICAgIGJ1ZmYuYXBwZW5kKEhlbHBNZXNzYWdlcy5QQVJBTUVURVJfTUlTU0lORyArIERlZi5SZWxQYXRoKTsKLSAgICAgICAgZW5vdWdoPWZhbHNlOwotICAgICB9Ci0KLSAgICAgaWYoaGVhZGVyRmlsZT09bnVsbCkKLSAgICAgewotICAgICAgICBidWZmLmFwcGVuZChIZWxwTWVzc2FnZXMuUEFSQU1FVEVSX01JU1NJTkcgKyBEZWYuSGVhZGVyRmlsZSk7Ci0gICAgICAgIGVub3VnaD1mYWxzZTsKLSAgICAgfQotCi0gICAgIGlmKGZvb3RlckZpbGU9PW51bGwpCi0gICAgIHsKLSAgICAgICAgYnVmZi5hcHBlbmQoSGVscE1lc3NhZ2VzLlBBUkFNRVRFUl9NSVNTSU5HICsgRGVmLkZvb3RlckZpbGUpOwotICAgICAgICBlbm91Z2g9ZmFsc2U7Ci0gICAgIH0KLQotICAgICBGb250T2JqZWN0IGYgPSAoRm9udE9iamVjdClmb250RGVmaW5pdGlvbnMuZ2V0KERlZi5EZWZhdWx0Rm9udCk7Ci0gICAgIEZvbnRPYmplY3QgZnMgPSAoRm9udE9iamVjdClzdHlsZURlZmluaXRpb25zLmdldChEZWYuRGVmYXVsdFN0eWxlKTsKLSAgICAgaWYoZj09bnVsbCAmJiBmcz09bnVsbCkKLSAgICAgewotICAgICAgICBidWZmLmFwcGVuZChIZWxwTWVzc2FnZXMuRk9OVF9BTkRfU1RZTEVfTUlTU0lORyArIERlZi5EZWZhdWx0Rm9udCArICIgIiArIERlZi5EZWZhdWx0U3R5bGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGVub3VnaD1mYWxzZTsKLSAgICAgfQotICAgICBpZighZW5vdWdoKQotICAgICB7Ci0gICAgICAgIGJ1ZmYuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihidWZmKTsKLSAgICAgfQotICAgICByZXR1cm4gZW5vdWdoOwotICB9Ci0KLQotICAvL0FzaWducyB2YWx1ZXMgdG8gdGhlIGRpZmZlcmVudCBhdHRyaWJ1dGVzCi0gIHByaXZhdGUgdm9pZCBhc2lnblZhbHVlKFN0cmluZyBwYXJhbSwgU3RyaW5nIHZhbHVlKQotICB7Ci0KLSAgICBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5NYWluUmVzdWx0RmlsZSkpCi0gICAgewotICAgICAgIG1haW5SZXN1bHRGaWxlID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuQ2hhcmFjdGVyU2V0KSkKLSAgICB7Ci0gICAgICAgY2hhcmFjdGVyc2V0ID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuU2VlKSkKLSAgICB7Ci0gICAgICAgc2VlID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuU2VlQWxzbykpCi0gICAgewotICAgICAgIHNlZWFsc28gPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5JbmRleFJlc3VsdEZpbGUpKQotICAgIHsKLSAgICAgICBpbmRleFJlc3VsdEZpbGUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5LZXlXb3JkUmVzdWx0RmlsZSkpCi0gICAgewotICAgICAgIGtleXdvcmRSZXN1bHRGaWxlID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuSGVhZGVyRmlsZSkpCi0gICAgewotICAgICAgIGhlYWRlckZpbGUgPSBuZXcgRmlsZShkZWZGaWxlUm9vdCwgdmFsdWUpLmdldEFic29sdXRlUGF0aCgpOzsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5Gb290ZXJGaWxlKSkKLSAgICB7Ci0gICAgICAgZm9vdGVyRmlsZSA9IG5ldyBGaWxlKGRlZkZpbGVSb290LCB2YWx1ZSkuZ2V0QWJzb2x1dGVQYXRoKCk7OwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoRGVmLlJlbFBhdGgpKQotICAgIHsKLSAgICAgICByZWxhdGl2ZXBhdGggPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5EZWZhdWx0VGFyZ2V0UGFyYW0pKQotICAgIHsKLSAgICAgICB0YXJnZXQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5LZXlXb3JkRmlsZSkpCi0gICAgewotICAgICAgIHNwZWNLZXlXb3JkRmlsZSA9IG5ldyBGaWxlKGRlZkZpbGVSb290LCB2YWx1ZSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuSW5kZXhUaXRsZSkpCi0gICAgewotICAgICAgIGluZGV4dGl0bGUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5LZXlXb3JkVGFyZ2V0KSkKLSAgICB7Ci0gICAgICAga2V5d29yZFRhcmdldCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoRGVmLkluZGV4VGFyZ2V0KSkKLSAgICB7Ci0gICAgICAgaW5kZXhUYXJnZXQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5JbmRleEhlaWdodCkpCi0gICAgewotICAgICAgIGluZGV4SGVpZ2h0ID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuTXVsdGlEb2NLZXlXb3JkKSkKLSAgICB7Ci0gICAgICAgbXVsdGlkb2N1bWVudGtleXdvcmQgPSB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKERlZi5UcnVlKTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5TaG93RG9jVGl0bGUpKQotICAgIHsKLSAgICAgICBzaG93ZG9jdW1lbnR0aXRsZSA9IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoRGVmLlRydWUpOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoRGVmLkxlYXZlRGlyKSkKLSAgICB7Ci0gICAgICAgc3RvcERpcnNWLmFkZEVsZW1lbnQodmFsdWUpOwotICAgIH0KLSAgICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuS2V5V29yZFByZWZpeCkpCi0gICAgewotICAgICAgIGtleVdvcmRQcmVmaXggPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5LZXlXb3JkTGV2ZWxTZXBhcmF0b3IpKQotICAgIHsKLSAgICAgICBrZXlXb3JkTGV2ZWxTZXBhcmF0b3IgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQotICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihIZWxwTWVzc2FnZXMuSU5WQUxJRF9QQVJBTUVURVJfTkFNRSArIHBhcmFtKTsKLSAgICB9Ci0KLSAgfQotCi0gIC8vUGFyc2VzIGEgZm9udGRlZmluaXRpb24KLSAgcHJpdmF0ZSB2b2lkIGFzaWduRm9udChTdHJpbmdUb2tlbml6ZXIgcGFyc2VyKQotICB7Ci0gICAgU3RyaW5nIHN0cmluZ0xldmVsID0gcGFyc2VyLm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICBPYmplY3Qga2V5ID0gc3RyaW5nTGV2ZWw7Ci0gICAgaWYoIXN0cmluZ0xldmVsLmVxdWFsc0lnbm9yZUNhc2UoRGVmLkRlZmF1bHRGb250KSAmJiAhc3RyaW5nTGV2ZWwuZXF1YWxzSWdub3JlQ2FzZShEZWYuSGVhZExpbmVGb250KSkKLSAgICB7Ci0gICAgICAga2V5ID0gIG5ldyBJbnRlZ2VyKHN0cmluZ0xldmVsKTsKLSAgICB9Ci0gICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpOwotICAgIFN0cmluZyBzdHlsZSA9IHBhcnNlci5uZXh0VG9rZW4oKS50cmltKCk7Ci0gICAgU3RyaW5nIHNpemUgPSBwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpOwotCi0gICAgZm9udERlZmluaXRpb25zLnB1dChrZXksbmV3IEZvbnRPYmplY3QobmFtZSwgc3R5bGUsIHNpemUpKTsKLSAgfQotCi0gIC8vUGFyc2VzIGEgc3R5bGVkZWZpbml0aW9uCi0gIHByaXZhdGUgdm9pZCBhc2lnblN0eWxlKFN0cmluZ1Rva2VuaXplciBwYXJzZXIpCi0gIHsKLSAgICBTdHJpbmcgc3RyaW5nTGV2ZWwgPSBwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpOwotICAgIE9iamVjdCBrZXkgPSBzdHJpbmdMZXZlbDsKLSAgICBpZighc3RyaW5nTGV2ZWwuZXF1YWxzSWdub3JlQ2FzZShEZWYuRGVmYXVsdFN0eWxlKSAmJiAhc3RyaW5nTGV2ZWwuZXF1YWxzSWdub3JlQ2FzZShEZWYuSGVhZExpbmVTdHlsZSkpCi0gICAgewotICAgICAgIGtleSA9ICBuZXcgSW50ZWdlcihzdHJpbmdMZXZlbCk7Ci0gICAgfQotCi0gICAgU3RyaW5nIHN0eWxlID0gcGFyc2VyLm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICBzdHlsZURlZmluaXRpb25zLnB1dChrZXksbmV3IEZvbnRPYmplY3Qoc3R5bGUpKTsKLSAgfQotICAKLSAgLy9DaGVjayBpZiB0aGUgcmVhY2hlZCBkaXJlY3RvcnkgaXMgd2hpdGhpbiB0aGUgc3RvcGRpcmxpc3QKLSAgICBib29sZWFuIGlzSW5TdG9wZGlyKFN0cmluZyBzdHIpCi0gICB7Ci0gICAgICBmb3IoaW50IGk9MDtpPHN0b3BEaXJzVi5zaXplKCk7aSsrKQotICAgICAgewotICAgICAgICAgU3RyaW5nIHRtcFN0ciA9IChTdHJpbmcpIHN0b3BEaXJzVi5lbGVtZW50QXQoaSk7Ci0gICAgICAgICBpZihzdHIuc3Vic3RyaW5nKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0V3d3Um9vdCgpLmxlbmd0aCgpKzEpLmNvbXBhcmVUbyh0bXBTdHIpPT0wKQotICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvL0FjY2Vzc21ldGhvZHMKLSAgU3RyaW5nIGdldEluZGV4VGl0bGUoKQotICB7Ci0gICAgcmV0dXJuIGluZGV4dGl0bGU7Ci0gIH0KLQotICBTdHJpbmcgZ2V0U2VlKCkKLSAgewotICAgIHJldHVybiBzZWU7Ci0gIH0KLQotICBTdHJpbmcgZ2V0U2VlQWxzbygpCi0gIHsKLSAgICByZXR1cm4gc2VlYWxzbzsKLSAgfQotCi0gIFN0cmluZyBnZXRDaGFyYWN0ZXJTZXQoKQotICB7Ci0gICAgcmV0dXJuIGNoYXJhY3RlcnNldDsKLSAgfQotICBib29sZWFuIGdldE11bGl0RG9jdW1lbnRLZXl3b3JkKCkKLSAgewotICAgIHJldHVybiBtdWx0aWRvY3VtZW50a2V5d29yZDsKLSAgfQotCi0gIGJvb2xlYW4gZ2V0U2hvd0RvY3VtZW50VGl0bGUoKQotICB7Ci0gICAgcmV0dXJuIHNob3dkb2N1bWVudHRpdGxlOwotICB9Ci0KLSAgU3RyaW5nIGdldEtleVdvcmRUYXJnZXQoKQotICB7Ci0gICAgcmV0dXJuIGtleXdvcmRUYXJnZXQ7Ci0gIH0KLQotICBTdHJpbmcgZ2V0SW5kZXhUYXJnZXQoKQotICB7Ci0gICAgcmV0dXJuIGluZGV4VGFyZ2V0OwotICB9Ci0KLSAgU3RyaW5nIGdldEluZGV4SGVpZ2h0KCkKLSAgewotICAgIHJldHVybiBpbmRleEhlaWdodDsKLSAgfQotCi0gIFN0cmluZyBnZXRXd3dSb290KCkKLSAgewotICAgIHJldHVybiB3d3dSb290OwotICB9Ci0KLSAgaW50IGdldFd3d1Jvb3RMZW5ndGgoKQotICB7Ci0gICAgcmV0dXJuIHN0aXBMZW5ndGg7Ci0gIH0KLQotICBTdHJpbmcgZ2V0VGFyZ2V0KCkKLSAgewotICAgIHJldHVybiB0YXJnZXQ7Ci0gIH0KLQotICBTdHJpbmcgZ2V0S2V5V29yZEZpbGUoKQotICB7Ci0gICAgcmV0dXJuIHNwZWNLZXlXb3JkRmlsZTsKLSAgfQotCi0gIFN0cmluZyBnZXRNYWluUmVzdWx0RmlsZSgpCi0gIHsKLSAgICByZXR1cm4gbWFpblJlc3VsdEZpbGU7Ci0gIH0KLQotICBTdHJpbmcgZ2V0SW5kZXhSZXN1bHRGaWxlKCkKLSAgewotICAgIHJldHVybiBpbmRleFJlc3VsdEZpbGU7Ci0gIH0KLQotICBTdHJpbmcgZ2V0S2V5d29yZFJlc3VsdEZpbGUoKQotICB7Ci0gICAgcmV0dXJuIGtleXdvcmRSZXN1bHRGaWxlOwotICB9Ci0KLQotICBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKCkKLSAgewotICAgIHJldHVybiByZWxhdGl2ZXBhdGg7Ci0gIH0KLQotICBTdHJpbmcgZ2V0SGVhZGVyRmlsZSgpCi0gIHsKLSAgICByZXR1cm4gaGVhZGVyRmlsZTsKLSAgfQotCi0gICBTdHJpbmcgZ2V0Rm9vdGVyRmlsZSgpCi0gIHsKLSAgICByZXR1cm4gZm9vdGVyRmlsZTsKLSAgfQotCi0gU3RyaW5nIGdldEtleVdvcmRQcmVmaXgoKQotIHsKLSAgIHJldHVybiBrZXlXb3JkUHJlZml4OwotIH0KLQotIFN0cmluZyBnZXRLZXlXb3JkTGV2ZWxTZXBhcmF0b3IoKQotIHsKLSAgIHJldHVybiBrZXlXb3JkTGV2ZWxTZXBhcmF0b3I7Ci0gfQotCi0gRm9udE9iamVjdCBnZXRGb250KGludCBsZXZlbCkKLSAgewotICAgICBGb250T2JqZWN0IGYgPSAoRm9udE9iamVjdClmb250RGVmaW5pdGlvbnMuZ2V0KG5ldyBJbnRlZ2VyKGxldmVsKSk7Ci0gICAgIGlmKGY9PW51bGwpCi0gICAgIHsKLSAgICAgICAgZiA9IChGb250T2JqZWN0KWZvbnREZWZpbml0aW9ucy5nZXQoRGVmLkRlZmF1bHRGb250KTsKLSAgICAgfQotICAgICByZXR1cm4gZjsKLSAgfQotCi0gIEZvbnRPYmplY3QgZ2V0Rm9udChPYmplY3Qga2V5KQotICB7Ci0gICAgIHJldHVybiAoRm9udE9iamVjdClmb250RGVmaW5pdGlvbnMuZ2V0KGtleSk7Ci0KLSAgfQotCi0gIEZvbnRPYmplY3QgZ2V0U3R5bGVTaGVldChpbnQgbGV2ZWwpCi0gIHsKLSAgICAgRm9udE9iamVjdCBmID0gKEZvbnRPYmplY3Qpc3R5bGVEZWZpbml0aW9ucy5nZXQobmV3IEludGVnZXIobGV2ZWwpKTsKLSAgICAgaWYoZj09bnVsbCkKLSAgICAgewotICAgICAgICBmID0gKEZvbnRPYmplY3Qpc3R5bGVEZWZpbml0aW9ucy5nZXQoRGVmLkRlZmF1bHRTdHlsZSk7Ci0gICAgIH0KLSAgICAgcmV0dXJuIGY7Ci0gIH0KLQotICBGb250T2JqZWN0IGdldFN0eWxlU2hlZXQoT2JqZWN0IGtleSkKLSAgewotICAgIHJldHVybiAoRm9udE9iamVjdClzdHlsZURlZmluaXRpb25zLmdldChrZXkpOwotICB9Ci0KLSAgdm9pZCBwcmludFN0YXJ0KE91dHB1dFN0cmVhbVdyaXRlciBvdXRQLGludCBsZXZlbCkKLSAgewotICAgIGlmKGdldFN0eWxlU2hlZXQoRGVmLkRlZmF1bHRTdHlsZSk9PW51bGwpCi0gICAgewotICAgICAgRm9udE9iamVjdCBmID0gZ2V0Rm9udChsZXZlbCk7Ci0gICAgICBpZihmPT1udWxsKQotICAgICAgewotICAgICAgICBmID0gZ2V0Rm9udChEZWYuRGVmYXVsdEZvbnQpOwotICAgICAgfQotICAgICAgcHJpbnRTdGFydChvdXRQLCBmKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgRm9udE9iamVjdCBmID0gZ2V0U3R5bGVTaGVldChsZXZlbCk7Ci0gICAgICAgIGlmKGY9PW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgZiA9IGdldFN0eWxlU2hlZXQoRGVmLkRlZmF1bHRTdHlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRTdGFydChvdXRQLCBmKTsKLSAgICB9Ci0gIH0KLSAgdm9pZCBwcmludFN0YXJ0KE91dHB1dFN0cmVhbVdyaXRlciBvdXRQLEZvbnRPYmplY3QgZikKLSAgewotCi0gICAgaWYob3V0UD09bnVsbCkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVmaW5pdGlvbk9iamVjdDpwcmludFN0YXJ0XG4iICsgSGVscE1lc3NhZ2VzLkJBRF9PVVRQVVRfU1RSRUFNKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0KLSAgICBpZihmIT1udWxsICYmIGYuZ2V0U3R5bGVTaGVldCgpPT1udWxsKQotICAgIHsKLSAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwiPEZPTlQgRkFDRT1cIiIgKyBmLmdldE5hbWUoKSArICJcIiBTSVpFPVwiIiArIGYuZ2V0U2l6ZSgpICsgIlwiID5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgaWYoZi5pc0l0YWxpYygpKQotICAgICAgewotICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsIjxJPiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0KLSAgICAgIGlmKGYuaXNCb2xkKCkpCi0gICAgICB7Ci0gICAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwiPEI+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPFAgQ0xBU1M9XCIiICsgZi5nZXRTdHlsZVNoZWV0KCkgKyAiXCI+XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICB9Ci0KLSAgdm9pZCBwcmludEVuZChPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UCwgaW50IGxldmVsKQotICB7Ci0KLSAgICBpZihvdXRQPT1udWxsKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZWZpbml0aW9uT2JqZWN0OnByaW50RW5kXG4iICsgSGVscE1lc3NhZ2VzLkJBRF9PVVRQVVRfU1RSRUFNKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYoZ2V0U3R5bGVTaGVldChEZWYuRGVmYXVsdFN0eWxlKT09bnVsbCkKLSAgICB7Ci0gICAgICBGb250T2JqZWN0IGYgPSBnZXRGb250KGxldmVsKTsKLSAgICAgIGlmKGY9PW51bGwpCi0gICAgICB7Ci0gICAgICAgIGYgPSBnZXRGb250KERlZi5EZWZhdWx0Rm9udCk7Ci0gICAgICB9Ci0gICAgICBwcmludEVuZChvdXRQLCBmKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcHJpbnRFbmQob3V0UCwgbnVsbCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBwcmludEVuZChPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UCwgRm9udE9iamVjdCBmKQotICB7Ci0gICAgICAgIGlmKG91dFA9PW51bGwpCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmluaXRpb25PYmplY3Q6cHJpbnRFbmRcbiIgKyBIZWxwTWVzc2FnZXMuQkFEX09VVFBVVF9TVFJFQU0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZihmIT1udWxsICYmIGYuZ2V0U3R5bGVTaGVldCgpPT1udWxsKQotICAgIHsKLSAgICAgIGlmKGYuaXNCb2xkKCkpCi0gICAgICB7Ci0gICAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwiPC9CPiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0KLSAgICAgIGlmKGYuaXNJdGFsaWMoKSkKLSAgICAgIHsKLSAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCI8L0k+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwiPC9GT05UPlxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCI8L1A+XG4iKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLwotICAvLwlSUFcgMi4wIEludGVncmF0aW9uIC0tIERvIG5vdCBtb2RpZnkgdGhpcyBjb2RlIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCi0gIC8vCSAgLy8JQmVjYXVzZSBSUFcgY2FsbHMgdGhlc2UgYXBwbGljYXRpb25zIGZyb20gYSBkaWZmZXJlbnQgbG9jYXRpb24gdGhhbiB0aGUgYmF0Y2ggZmlsZQotICAvLwlpdCBpcyBuZWNjZXNzYXJ5IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cyBpbiB0aGUgY29uZmlnIGZpbGUuCi0gIC8vCi0gIC8vCVRoZSBmb2xsb3dpbmcgbWV0aG9kcyBzaW1wbHkgYWxsb3cgdGhlIHZhbHVlcyB0byBiZSBvdmVyLXJpZGRlbi4KLSAgLy8KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIHB1YmxpYyB2b2lkIHNldHd3d1Jvb3QoU3RyaW5nIG5ld1Jvb3QpCi0gIHsKLSAgICAgIHRyeSB7Ci0JCUZpbGUgd3d3RGlyID0gbmV3IEZpbGUobmV3Um9vdCk7Ci0JCXd3d1Jvb3QgPSB3d3dEaXIuZ2V0Q2Fub25pY2FsUGF0aCgpICsgIi8iOyAvLyROT04tTkxTLTEkCi0JCXd3d1Jvb3QgPSB3d3dSb290LnJlcGxhY2UoJ1xcJyAsICcvJyk7Ci0JCXN0aXBMZW5ndGggPSB3d3dSb290Lmxlbmd0aCgpLTE7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCX0KLSAgfQotCi0gIHZvaWQgc2V0UmVsYXRpdmVQYXRoKFN0cmluZyBuZXdQYXRoKQotICB7Ci0JcmVsYXRpdmVwYXRoID0gbmV3UGF0aDsKLSAgfQotICAKLSAgLyoqCi0gICAqIHNldCB0aGUgaW5kZXggdGl0bGUKLSAgICogCi0gICAqIEBwYXJhbSB0aXRsZSBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEluZGV4VGl0bGUoU3RyaW5nIHRpdGxlKQotICB7Ci0JICBpbmRleHRpdGxlID0gdGl0bGU7Ci0gIH0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0RvY3VtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9Eb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNWI4M2Y2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0RvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotCi1jbGFzcyBEb2N1bWVudAotewotICAgIC8vVGhlIHRpdGxlIG9mIHRoZSBkb2N1bWVudAotICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlPW51bGw7Ci0KLSAgICAvL1RoZSB1cmwgdG8gdGhlIGRvY3VtZW50Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdXJsPW51bGw7Ci0gICAvLyBwcml2YXRlIEFuY2hvciBhbmNob3I9bnVsbDsKLQotICAgIC8vVGhlIHBhcmVudCBLZXlXb3JkCi0gICAgcHJpdmF0ZSBLZXlXb3JkIHBhcmVudE09bnVsbDsKLQotICAgIERvY3VtZW50KFN0cmluZyB0aXRsZSwgU3RyaW5nIHVybCkKLSAgICB7Ci0gICAgICAgdGhpcy50aXRsZSA9IHRpdGxlOwotICAgICAgIHRoaXMudXJsID0gIHVybC5yZXBsYWNlKCdcXCcsJy8nKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldEtleVdvcmQoS2V5V29yZCBrZXkpCi0gICAgewotICAgICAgIHBhcmVudE0gPSBrZXk7Ci0gICAgfQotICAgIFN0cmluZyBnZXRUaXRsZSgpCi0gICAgewotICAgICAgIHJldHVybiB0aXRsZTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0VXJsKCkKLSAgICB7Ci0gICAgCWludCBmaXJzdCA9IHVybC5pbmRleE9mKCIjIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBpZihwYXJlbnRNIT1udWxsICYmIGZpcnN0IDwgMCkKLSAgICAgICAgewotICAgICAgICAgICByZXR1cm4gdXJsICs9IiMiICsgcGFyZW50TS5nZXRBbmNob3IoKTsgLy8kTk9OLU5MUy0xJCAKLSAgICAgICAgfQotCi0JCWlmIChmaXJzdCA+IDAgJiYgdXJsLmluZGV4T2YoIiMiLCBmaXJzdCkgPiAwKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCXJldHVybiB1cmwuc3Vic3RyaW5nKDAsIGZpcnN0ICsgdXJsLmluZGV4T2YoIiMiLCBmaXJzdCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludChPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UCkKLSAgICB7Ci0gICAgICAgIGlmKG91dFA9PW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvY3VtZW50LnByaW50XG4iICsgSGVscE1lc3NhZ2VzLkJBRF9PVVRQVVRfU1RSRUFNKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdG90YWxVcmwgPSB1cmw7Ci0gICAgICAgIFN0cmluZyB0bXBUaXRsZT1udWxsOwotCi0gICAgICAgICAgIHRtcFRpdGxlICA9IHRpdGxlOwotICAgICAgICAgICBpZihwYXJlbnRNIT1udWxsKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgdG90YWxVcmwrPSIjIiArIHBhcmVudE0uZ2V0QW5jaG9yKCk7IC8vJE5PTi1OTFMtMSQgCi0gICAgICAgICAgIH0KLQotCi0gICAgICAgIGlmKHRtcFRpdGxlPT1udWxsIHx8IHRtcFRpdGxlLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIHRtcFRpdGxlID0gIjxGT05UIENPTE9SPVwiIzAwOTkzM1wiPkhlbHBNZXNzYWdlcy5USVRMRV9BTkNIT1JfTUlTU0lORzwvRk9OVD4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdGFyZ2V0PW51bGw7Ci0gICAgICAgIGlmKCFLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldFRhcmdldCgpLmVxdWFscygiICIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICAgdGFyZ2V0ID0gIiBUQVJHRVQ9XCIiICsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRUYXJnZXQoKSArICJcIiAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotCi0gICAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwgIjxBIEhSRUY9XCIiICsgdG90YWxVcmwgKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBpZih0YXJnZXQhPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCB0YXJnZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPiIgKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgdG1wVGl0bGUgKyAiPC9BPiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0ZvbnRPYmplY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0ZvbnRPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmMzMDRlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9Gb250T2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotCi0KLWNsYXNzIEZvbnRPYmplY3QKLXsKLSAgU3RyaW5nIG5hbWUgPSBudWxsOwotICBTdHJpbmcgc3R5bGUgPSBudWxsOwotICBTdHJpbmcgc2l6ZSA9IG51bGw7Ci0gIFN0cmluZyBzdHlsZVNoZWV0ID0gbnVsbDsKLQotICBGb250T2JqZWN0KFN0cmluZyBuYW1lLCBTdHJpbmcgc3R5bGUsIFN0cmluZyBzaXplKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLnN0eWxlID0gc3R5bGU7Ci0gICAgdGhpcy5zaXplID0gc2l6ZTsKLSAgfQotCi0gIEZvbnRPYmplY3QoU3RyaW5nIHN0eWxlU2hlZXQpCi0gIHsKLSAgICB0aGlzLnN0eWxlU2hlZXQgPSBzdHlsZVNoZWV0OwotICB9Ci0KLSAgU3RyaW5nIGdldFN0eWxlU2hlZXQoKQotICB7Ci0gICAgcmV0dXJuIHN0eWxlU2hlZXQ7Ci0gIH0KLQotICBib29sZWFuIGlzQm9sZCgpCi0gIHsKLSAgICByZXR1cm4gc3R5bGUuZXF1YWxzSWdub3JlQ2FzZShEZWYuQm9sZCk7Ci0gIH0KLQotICBib29sZWFuIGlzSXRhbGljKCkKLSAgewotICAgIHJldHVybiBzdHlsZS5lcXVhbHNJZ25vcmVDYXNlKERlZi5JdGFsaWMpOwotICB9Ci0KLSAgU3RyaW5nIGdldFNpemUoKQotICB7Ci0gICAgcmV0dXJuIHNpemU7Ci0gIH0KLQotICBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIHZvaWQgcHJpbnQoU3RyaW5nQnVmZmVyIG91dFApCi0gIHsKLSAgICBpZihzdHlsZVNoZWV0IT1udWxsKQotICAgIHsKLSAgICAgICAgb3V0UC5hcHBlbmQoc3R5bGVTaGVldCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgb3V0UC5hcHBlbmQobmFtZSArICJcdCIgKyBzdHlsZSArICJcdCIgKyBzaXplKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICAgIG91dFAuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9IZWxwTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0hlbHBNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NzMxZDQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0hlbHBNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4OwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotY2xhc3MgSGVscE1lc3NhZ2VzCi17Ci0KLSAgc3RhdGljIFN0cmluZyBFWENFUFRJT04gPSAiRXhjZXB0aW9uOiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgQkFEX09VVFBVVF9TVFJFQU0gPSAiQmFkIG91dHB1dCBzdHJlYW0hIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIEJBRF9QQVJTRVIgPSAiQmFkIHBhcnNlciBvYmplY3QhIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIElOUFVUX1BBUkFNRVRFUl9OVUxMID0gIklucHV0IHBhcmFtZXRlciBpcyBudWxsISI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBJTlZBTElEX1BBUkFNRVRFUl9OQU1FID0gIk5vIHZhbGlkIHBhcmFtZXRlciBuYW1lZCAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgV1JJVEVfRVhDRVBUSU9OID0gIkV4Y2VwdGlvbiB3cml0aW5nIHRvIGZpbGUgIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE1JU1NJTkdfVVJMID0gIk1pc3NpbmcgdXJsICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBNSVNTSU5HX0xBQkVMID0gIk1pc3NpbmcgbGFiZWwgIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE1JU1NJTkdfTk9ERSA9ICJNaXNzaW5nIG5vZGUgIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE9QRU5fRklMRV9GQUlMRUQgPSAiRXJyb3IgcmVhZGluZyBmaWxlICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBXUklURV9GSUxFID0gIldyaXRlcyBmaWxlOiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgV1JJVEVfRVJST1IgPSAiRXJyb3Igd3JpdGluZyBmaWxlOiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgUEFSQU1FVEVSX01JU1NJTkcgPSAiUGFyYW1ldGVyIG1pc3Npbmc6ICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBQQVJBTUVURVJfTk9UX05VTUJFUiA9ICIgaGF2ZSB0byBiZSBhIG51bWJlciwgdGhlIHZhbHVlIGlzIG5vdCBhIG51bWJlciAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgUEFSQU1FVEVSX01JU1NJTkdfVkFMVUUgPSAiVmFsdWUgbWlzc2luZyBmb3IgcGFyYW1ldGVyICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBGT05UX0FORF9TVFlMRV9NSVNTSU5HID0gIkJvdGggb2YgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBtaXNzaW5nICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBOT19ESVJFQ1RPUlkgPSAiIGlzIG5vdCBhIHJlYWRhYmxlIGRpcmVjdG9yeSEiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgRElSRUNUT1JZX05PVF9QQVJTRUQgPSAiRG9lcyBub3QgcGFyc2UgZGlyZWN0b3J5ICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBOT1RfRU5PVUdIX0lOUFVUID0gIk5vdCBlbm91Z2ggaW5wdXQsIG9wZXJhdGlvbiBjYW5jZWxlZCEiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgSU5DT1JSRUNUX0hFQURFUkZJTEUgPSAiSGVhZGVyIGZpbGUgcHJvYmFibHkgaW5jb3JyZWN0ISI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBJTkNPUlJFQ1RfRk9PVEVSRklMRSA9ICJGb290ZXIgZmlsZSBwcm9iYWJseSBpbmNvcnJlY3QhIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIEtFWVdPUkRfU1lOVEFYX0VSUk9SID0gIiBpcyBub3QgYSB2YWxpZCBrZXkgd29yZCEgSGF2ZSB0byBiZWdpbiB3aXRoICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBLRVlXT1JEX0ZJTEVfU1lOVEFYX0VSUk9SID0gIiBjb250YWluaW5nIGtleXdvcmRzIGNvbnRhaW5zIHN5bnRheCBlcnJvcnMhIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIFJFTEFURURfS0VZV09SRF9OT1RfRk9VTkQgPSAiIHJlZmZlcmVkIGJ5IHRoZSBmb2xsb3dpbmcga2V5d29yZCBkb2VzIG5vdCBleGlzdCAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgUEFSU0VfRElSRUNUT1JZID0gIlBhcnNlcyBkaXJlY3Rvcnk6ICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBUQUtFX0FfV0hJTEUgPSAiSXQgbWF5IHRha2UgYSB3aGlsZSAuLi4iOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgVElUTEVfQU5DSE9SX01JU1NJTkcgPSAiVGl0bGUgYW5kL29yIGFuY2hvciB0ZXh0IGlzIG1pc3NpbmchIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE1JU1NJTkdfUkVTUE9OU0VfRklMRSA9ICJFcnJvcjogTWlzc2luZyAtciByZXNwb25zZSBmaWxlIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE5PX09GX0NIQVJBQ1RFUlNfUkVBRCA9ICIgY2hhcnMgcmVhZCBpbiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgTk9fT0ZfRklMRVNfQ0hFQ0tFRCA9ICIgZmlsZXMgY2hlY2tlZCBpbiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgU0VDT05EID0gIiBzICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBXT1JEUyA9ICIgd29yZHMiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgQ09NUElMRUQgPSAiQ29tcGlsZWQgIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIERPQ1VNRU5UU19DT05BVElOSU5HID0gIiBkb2N1bWVudHMsIGNvbnRhaW5pbmcgIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIEJZVEVTX1NUT1JFRCA9ICIgYnl0ZXMsIHN0b3JlZCBpbiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgV0VCX0RBVEFCQVNFID0gIldlYiBkYXRhYmFzZSBvZiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgQ0RST01fREFUQUJBU0UgPSAiQ0QtUk9NIGRhdGFiYXNlIG9mICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBCWVRFUyA9ICAiYnl0ZXMiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgQllURVNfQU5EID0gICJieXRlcywgYW5kICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBGQVRBTF9FUlJPUiA9ICJGYXRhbCBFcnJvcjogIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIEZJTEVfRE9FU19OT1RfRVhJU1QgPSAiRXJyb3I6IENvdWxkbid0IGZpbmQgZmlsZTogIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE1JU1NJTkdfRl9GSUxFID0gIkVycm9yOiBNaXNzaW5nIC1mIGZpbGVuYW1lIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIENBTk9OSUNBTF9GSUxFX1BBVEhfRkFJTEVEID0gIkVycm9yOiBjb3VsZG4ndCBjcmVhdGUgY2Fub25pY2FsIGZpbGVwYXRoIGZvciAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgRE9DVU1FTlRfREVQRU5ERU5DWV9MSVNUID0gICJEb2N1bWVudCBkZXBlbmRhbmN5IGxpc3QgZm9yICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBEQVRBX0RFUEVOREVOQ1lfTElTVCA9ICAiRGF0YSBkZXBlbmRhbmN5IGxpc3QgZm9yICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBFWFRFUk5BTF9MSU5LX0xJU1QgPSAgIkV4dGVybmFsIGxpbmtzIGxpc3QgZm9yICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBNSVNTSU5HX0xJTktfTElTVCA9ICAiTWlzc2luZyBsaW5rcyBsaXN0IGZvciAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgTk9USElOR19UT19ETyA9ICAiRXJyb3I6IG5vdGhpbmcgdG8gZG86IC1uYiAtbmggLW5sIC1udCI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBJTlRFUk1FRElBVEVfREFUQV9GSUxFID0gICJJbnRlcm1lZGlhdGUgZGF0YTogZmlsZTovLyI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBUT09fTUFOWV9GSUxFUyA9ICAiRXJyb3I6IFRvbyBtYW55IGZpbGVzIGZvciB0aGUgc2VhcmNoIGFwcGxldCBkYXRhYmFzZSI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBJTExFR0FMX05VTUVSSUNfVkFMVUUgPSAiRXJyb3I6IElsbGVnYWwgbnVtZXJpYyB2YWx1ZSAtaW0gIjsgLy8kTk9OLU5MUy0xJAotCi0gIHN0YXRpYyB2b2lkIGxvYWRIZWxwTWVzc2FnZXMoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgY2hhcmFjdGVyc2V0KQotICB7Ci0gICAgICAgU3RyaW5nIGhlbHBUZXh0cyA9IE1pc2NTdGF0aWMubG9hZEZpbGUoZmlsZU5hbWUsY2hhcmFjdGVyc2V0KTsKLSAgICAgICBTdHJpbmdUb2tlbml6ZXIgcGFyc2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcigKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscFRleHRzLCAiXG5cdCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICB3aGlsZShwYXJzZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgcGFyYW0gPSBwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpOwotICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHBhcnNlci5uZXh0VG9rZW4oKS50cmltKCk7Ci0gICAgICAgICAgSGVscE1lc3NhZ2VzLmFkZFZhbHVlKHBhcmFtLCAiICIgKyB2YWx1ZSArICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgIH0KLSAgfQotCi0gIHN0YXRpYyB2b2lkIGFkZFZhbHVlKFN0cmluZyBwYXJhbSwgU3RyaW5nIHZhbHVlKQotICB7Ci0KLSAgICBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJJTlBVVF9QQVJBTUVURVJfTlVMTCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiSUxMRUdBTF9OVU1FUklDX1ZBTFVFIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuSUxMRUdBTF9OVU1FUklDX1ZBTFVFID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiRVhDRVBUSU9OIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuRVhDRVBUSU9OID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiSU5URVJNRURJQVRFX0RBVEFfRklMRSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLklOVEVSTUVESUFURV9EQVRBX0ZJTEUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJUT09fTUFOWV9GSUxFUyIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLlRPT19NQU5ZX0ZJTEVTID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiTk9fT0ZfRklMRVNfQ0hFQ0tFRCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLk5PX09GX0ZJTEVTX0NIRUNLRUQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJOT1RISU5HX1RPX0RPIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTk9USElOR19UT19ETyA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIklOVEVSTUVESUFURV9EQVRBX0ZJTEUiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5JTlRFUk1FRElBVEVfREFUQV9GSUxFID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiRE9DVU1FTlRfREVQRU5ERU5DWV9MSVNUIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuRE9DVU1FTlRfREVQRU5ERU5DWV9MSVNUID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiREFUQV9ERVBFTkRFTkNZX0xJU1QiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5EQVRBX0RFUEVOREVOQ1lfTElTVCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIkVYVEVSTkFMX0xJTktfTElTVCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkVYVEVSTkFMX0xJTktfTElTVCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIk1JU1NJTkdfTElOS19MSVNUIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTUlTU0lOR19MSU5LX0xJU1QgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJXT1JEUyIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLldPUkRTID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiQ09NUElMRUQiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5DT01QSUxFRCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIkRPQ1VNRU5UU19DT05BVElOSU5HIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuRE9DVU1FTlRTX0NPTkFUSU5JTkcgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJCWVRFU19TVE9SRUQiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5CWVRFU19TVE9SRUQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJXRUJfREFUQUJBU0UiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5XRUJfREFUQUJBU0UgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJDRFJPTV9EQVRBQkFTRSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkNEUk9NX0RBVEFCQVNFID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiQllURVMiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5CWVRFUyA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIkJZVEVTX0FORCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkJZVEVTX0FORCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIk1JU1NJTkdfRl9GSUxFIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTUlTU0lOR19GX0ZJTEUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJDQU5PTklDQUxfRklMRV9QQVRIX0ZBSUxFRCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkNBTk9OSUNBTF9GSUxFX1BBVEhfRkFJTEVEID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiTk9fT0ZfQ0hBUkFDVEVSU19SRUFEIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTk9fT0ZfQ0hBUkFDVEVSU19SRUFEID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiRklMRV9ET0VTX05PVF9FWElTVCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkZJTEVfRE9FU19OT1RfRVhJU1QgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJGQVRBTF9FUlJPUiIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkZBVEFMX0VSUk9SID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiU0VDT05EIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuU0VDT05EID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiQkFEX1BBUlNFUiIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkJBRF9QQVJTRVIgPSB2YWx1ZTsKLSAgICB9Ci0gICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiTUlTU0lOR19SRVNQT05TRV9GSUxFIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTUlTU0lOR19SRVNQT05TRV9GSUxFID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiVElUTEVfQU5DSE9SX01JU1NJTkciKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5USVRMRV9BTkNIT1JfTUlTU0lORyA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIktFWVdPUkRfRklMRV9TWU5UQVhfRVJST1IiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5LRVlXT1JEX0ZJTEVfU1lOVEFYX0VSUk9SID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiS0VZV09SRF9TWU5UQVhfRVJST1IiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5LRVlXT1JEX1NZTlRBWF9FUlJPUiA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIlBBUlNFX0RJUkVDVE9SWSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLlBBUlNFX0RJUkVDVE9SWSA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIlRBS0VfQV9XSElMRSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLlRBS0VfQV9XSElMRSA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIklOQ09SUkVDVF9IRUFERVJGSUxFIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuSU5DT1JSRUNUX0hFQURFUkZJTEUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJSRUxBVEVEX0tFWVdPUkRfTk9UX0ZPVU5EIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuUkVMQVRFRF9LRVlXT1JEX05PVF9GT1VORCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIklOQ09SUkVDVF9GT09URVJGSUxFIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuSU5DT1JSRUNUX0ZPT1RFUkZJTEUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJOT1RfRU5PVUdIX0lOUFVUIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTk9UX0VOT1VHSF9JTlBVVCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIk5PX0RJUkVDVE9SWSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLk5PX0RJUkVDVE9SWSA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIkRJUkVDVE9SWV9OT1RfUEFSU0VEIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuRElSRUNUT1JZX05PVF9QQVJTRUQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJCQURfT1VUUFVUX1NUUkVBTSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkJBRF9PVVRQVVRfU1RSRUFNID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiV1JJVEVfRVhDRVBUSU9OIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuV1JJVEVfRVhDRVBUSU9OID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiT1BFTl9GSUxFX0ZBSUxFRCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLk9QRU5fRklMRV9GQUlMRUQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJXUklURV9FUlJPUiIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLldSSVRFX0VSUk9SID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiV1JJVEVfRklMRSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLldSSVRFX0ZJTEUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJNSVNTSU5HX0xBQkVMIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTUlTU0lOR19MQUJFTCAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiTUlTU0lOR19VUkwiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5NSVNTSU5HX1VSTCAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJNSVNTSU5HX0xBQkVMIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTUlTU0lOR19MQUJFTCAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJNSVNTSU5HX05PREUiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5NSVNTSU5HX05PREUgID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiUEFSQU1FVEVSX01JU1NJTkciKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5QQVJBTUVURVJfTUlTU0lORyAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiUEFSQU1FVEVSX01JU1NJTkdfVkFMVUUiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5QQVJBTUVURVJfTUlTU0lOR19WQUxVRSAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJGT05UX0FORF9TVFlMRV9NSVNTSU5HIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuRk9OVF9BTkRfU1RZTEVfTUlTU0lORyAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiUEFSQU1FVEVSX05PVF9OVU1CRVIiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5QQVJBTUVURVJfTk9UX05VTUJFUiAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJJTlZBTElEX1BBUkFNRVRFUl9OQU1FIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuSU5WQUxJRF9QQVJBTUVURVJfTkFNRSAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5rbm93biBwYXJhbWV0ZXIgIiArIHBhcmFtKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvSU8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0lPLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwZTcwMjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvSU8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotaW1wb3J0IGphdmEuYXd0LkZvbnQ7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgQ2xhc3Mgd2l0aCBvbmx5IGNsYXNzIG1ldGhvZHMgdGhhdCBzaW1wbGlmaWVzIHNvbWUgY29tbXVuaWNhdGlvbnMKLSogIHdpdGggYSB3d3ctc2VydmVyIGFuZCBhbHNvIG91dHB1dCB0byB0aGUgSmF2YSBDb25zb2xlIFdpbmRvdy4KLSoKLSogIER1ZSB0byBzZWN1cml0eSBsaW1pdGF0aW9ucywgdGhlIG9ubHkgd3d3LXNlcnZlciByZWFjaGFibGUsCi0qICBpcyB0aGUgc2VydmVyIGZyb20gd2hpY2ggdGhlIGN1cnJlbnQgYXBwbGV0IGlzIGxvYWRlZCBmcm9tLgotKgotKiAgVGhpcyBjbGFzcyB1c2VzIHRoZSBFcnJvcldpbmRvdyBjbGFzcyBmb3Igc2hvd2luZyBlcnJvciBtZXNzYWdlcy4KLSoKLSogQHNlZSBydXB0b29scy5pby5FcnJvcldpbmRvdwotKgotKiBAdmVyc2lvbiAxLjAKLSogQGF1dGhvciBSYXRpb25hbCBTb2Z0d2FyZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2xhc3MgSU8KLXsKLSAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWdPbj1mYWxzZTsKLQotICAgLyoqCi0gICAqICBDbGFzcyBtZXRob2QgdGhhdCByZXR1cm5zIGEgc2V0IG9mIHN0cmluZyBkZWxpbWl0ZXJzIHRoYXQgY2FuIGJlCi0gICAqICB1c2VkIHdoZW4gdG9rZW5pemluZyBhIHRleHQgc3RyaW5nLgotICAgKgotICAgKi8KLSAgIHN0YXRpYyBTdHJpbmcgZ2V0RGVsaW0oKQotICAgewotICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoIioiKTsgLy8kTk9OLU5MUy0xJAotICAgfQotCi0gICAvKioKLSAgICogIENsYXNzIG1ldGhvZCB0aGF0IGNvbnRyb2xzIGlmIGRlYnVnIGluZm8gc2hhbGwgYmUgc2hvd2VkIG9yIG5vdAotICAgKiAgaW4gdGhlIEphdmEgQ29uc29sZSBXaW5kb3cuCi0gICAqCi0gICAqIEBwYXJhbSBpc09uIElmIDxiPnRydWU8L2I+IHRoZW4gZGVidWcgaW5mbyB3aWxsIGJlIHNob3dlZC4KLSAgICoKLSAgICovCi0gICBzdGF0aWMgdm9pZCBkZWJ1Zyhib29sZWFuIGlzT24pCi0gICB7Ci0gICAgICAgIGRlYnVnT24gPSBpc09uOwotICAgfQotCi0KLSAgIC8qKgotICAgKiAgUHJpbnQgRXJyb3IgbWVzc2FnZXMgaW4gdGhlIEphdmEgQ29uc29sZSBXaW5kb3cKLSAgICoKLSAgICogQHBhcmFtIHN0ciBTdHJpbmcgdG8gcHJpbnQKLSAgICoKLSAgICovCi0gICBzdGF0aWMgdm9pZCBwcmludEVycm9yKCBTdHJpbmcgc3RyICkKLSAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiRXJyb3I6IiArIHN0ciApOyAvLyROT04tTkxTLTEkCi0gICB9Ci0KLSAgIC8qKgotICAgKiAgUHJpbnQgRGVidWcgbWVzc2FnZXMgaW4gdGhlIEphdmEgQ29uc29sZSBXaW5kb3cgaWYgdGhlIGRlYnVnIGZsYWcKLSAgICogIGlzIHNldCAoc2V0RGVidWcgbWV0aG9kKQotICAgKgotICAgKiBAcGFyYW0gc3RyIFN0cmluZyB0byBwcmludAotICAgKgotICAgKi8KLSAgIHN0YXRpYyB2b2lkIHByaW50RGVidWcoIFN0cmluZyBzdHIgKQotICAgewotICAgICAgICBpZiAoZGVidWdPbikKLSAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJEZWJ1ZzoiICsgc3RyICk7IC8vJE5PTi1OTFMtMSQKLSAgIH0KLQotICAgc3RhdGljIENvbG9yIGdldENvbG9yKFN0cmluZyBzUEJHKQotICAgewotICAgICAgICAgLy8gQ2hlY2sgaWYgYSBwcmUtZGVmaW5lZCBjb2xvciBpcyBzcGVjaWZpZWQuCi0gICAgICBzUEJHID0gc1BCRy50cmltKCk7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJibGFjayIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybihDb2xvci5ibGFjayk7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJibHVlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuKENvbG9yLmJsdWUpOwotICAgICAgaWYgKHNQQkcuZXF1YWxzSWdub3JlQ2FzZSgiY3lhbiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybihDb2xvci5jeWFuKTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoImRhcmtHcmF5IikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuKENvbG9yLmRhcmtHcmF5KTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoImdyYXkiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3IuZ3JheSk7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJncmVlbiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybihDb2xvci5ncmVlbik7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJsaWdodEdyYXkiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3IubGlnaHRHcmF5KTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoIm1hZ2VudGEiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3IubWFnZW50YSk7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJvcmFuZ2UiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3Iub3JhbmdlKTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoInBpbmsiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3IucGluayk7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJyZWQiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3IucmVkKTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoIndoaXRlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuKENvbG9yLndoaXRlKTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoInllbGxvdyIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybihDb2xvci55ZWxsb3cpOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgIC8vIElmIHRoZSBjb2xvciBpcyBzcGVjaWZpZWQgaW4gSFRNTCBmb3JtYXQsIGJ1aWxkIGl0IGZyb20gdGhlIHJlZCwgZ3JlZW4gYW5kIGJsdWUgdmFsdWVzCi0gICAgICBpbnQgaVJlZCA9IDI1NTsKLSAgICAgIGludCBpQmx1ZSA9IDI1NTsKLSAgICAgIGludCBpR3JlZW4gPSAyNTU7Ci0gICAgICBpZiAoc1BCRy5sZW5ndGgoKSA9PSA3ICYmIHNQQkcuY2hhckF0KDApID09ICcjJykKLSAgICAgIHsKLSAgICAgICAgaVJlZCA9IEludGVnZXIucGFyc2VJbnQoc1BCRy5zdWJzdHJpbmcoMSwzKSwxNik7Ci0gICAgICAgIGlHcmVlbiA9IEludGVnZXIucGFyc2VJbnQoc1BCRy5zdWJzdHJpbmcoNSw3KSwxNik7Ci0gICAgICAgIGlCbHVlID0gSW50ZWdlci5wYXJzZUludChzUEJHLnN1YnN0cmluZygzLDUpLDE2KTsKLSAgICAgICAgcmV0dXJuKG5ldyBDb2xvcihpUmVkLCBpR3JlZW4sIGlCbHVlKSk7Ci0gICAgICB9Ci0KLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHBhcnNlciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc1BCRywgIiwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHNSZWQgPSBwYXJzZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBTdHJpbmcgc0dyZWVuID0gcGFyc2VyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgU3RyaW5nIHNCbHVlID0gcGFyc2VyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgaVJlZCA9IEludGVnZXIucGFyc2VJbnQoc1JlZC50cmltKCkpOwotICAgICAgICAgICAgaUdyZWVuID0gSW50ZWdlci5wYXJzZUludChzR3JlZW4udHJpbSgpKTsKLSAgICAgICAgICAgIGlCbHVlID0gSW50ZWdlci5wYXJzZUludChzQmx1ZS50cmltKCkpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvcihpUmVkLCBpR3JlZW4sIGlCbHVlKTsKLQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUxKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklPLmdldENvbG9yXG5FeGNlcHRpb24gMToiICsgZTEudG9TdHJpbmcoKSArIHNQQkcpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlMikKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJTy5nZXRDb2xvclxuRXhjZXB0aW9uIDI6IiArIGUyLnRvU3RyaW5nKCkgKyBzUEJHKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgcmV0dXJuIENvbG9yLmJsYWNrOwotICAgIH0KLQotICAgIHN0YXRpYyBGb250IGdldEZvbnQoU3RyaW5nIHNQQkcpCi0gICAgIHsKLSAgICAgICAgU3RyaW5nIGZvbnQgPSAiQXJpYWwiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBzdHlsZSA9ICJQTEFJTiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW50IHNpemUgPSAxMjsKLSAgICAgICAgaW50IHJlYWxTdHlsZT1Gb250LlBMQUlOOwotICAgICAgICBzUEJHID0gc1BCRy50cmltKCk7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBwYXJzZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNQQkcsICIsIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgZm9udCA9IHBhcnNlci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgZm9udCA9IGZvbnQudHJpbSgpOwotICAgICAgICAgICBpZiAoZm9udC5lcXVhbHNJZ25vcmVDYXNlKCJBcmlhbCIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGZvbnQgPSAiQXJpYWwiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIGVsc2UgaWYgKGZvbnQuZXF1YWxzSWdub3JlQ2FzZSgiQ291cmllciIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGZvbnQgPSAiQ291cmllciI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgZWxzZSBpZiAoZm9udC5lcXVhbHNJZ25vcmVDYXNlKCJEaWFsb2ciKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIGZvbnQgPSAiRGlhbG9nIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICBlbHNlIGlmIChmb250LmVxdWFsc0lnbm9yZUNhc2UoIkhlbHZldGljYSIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgZm9udCA9ICJIZWx2ZXRpY2EiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIGVsc2UgaWYgKGZvbnQuZXF1YWxzSWdub3JlQ2FzZSgiU3ltYm9sIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICBmb250ID0gIlN5bWJvbCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgZWxzZSBpZiAoZm9udC5lcXVhbHNJZ25vcmVDYXNlKCJUaW1lc1JvbWFuIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICBmb250ID0gIlRpbWVzUm9tYW4iOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgc3R5bGUgPSBwYXJzZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgIHN0eWxlID0gc3R5bGUudHJpbSgpOwotICAgICAgICAgICBpZihzdHlsZS5lcXVhbHNJZ25vcmVDYXNlKCJJVEFMSUMiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgcmVhbFN0eWxlPUZvbnQuSVRBTElDOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UgaWYoc3R5bGUuZXF1YWxzSWdub3JlQ2FzZSgiQk9MRCIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICByZWFsU3R5bGU9Rm9udC5CT0xEOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UgaWYoc3R5bGUuZXF1YWxzSWdub3JlQ2FzZSgiQk9MRElUQUxJQyIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICByZWFsU3R5bGU9Rm9udC5CT0xEICsgRm9udC5CT0xEOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHNpemUgPSBuZXcgSW50ZWdlcihwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpKS5pbnRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUxKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklPLmdldEZvbnRcbkV4Y2VwdGlvbiAxOiIgKyBlMS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSU8uZ2V0Rm9udFxuRXhjZXB0aW9uIDI6IiArIGUyLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICByZXR1cm4gbmV3IEZvbnQoZm9udCwgcmVhbFN0eWxlLCBzaXplKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9JbmRleFRlc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0luZGV4VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NjgwNjAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0luZGV4VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdSZXNvdXJjZXM7Ci0KLS8qKgotICogVGVzdCBjbGFzcyBmb3IgQm9va21hcmsgaW5kZXgKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqCi0gKi8KLWNsYXNzIEluZGV4VGVzdCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYXJncwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJCi0JCXRlc3QoKTsKLQl9Ci0JCi0Jc3RhdGljIHZvaWQgdGVzdCgpIHsKLQotCQl0cnkgewotCi0JCQkvL1NoZWxsIHMgPSBuZXcgU2hlbGwoKTsKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQkKLQkJCVN0cmluZyBwdWJsaXNoRGlyID0gCi0JCQkJIkM6XFxEb2N1bWVudHMgYW5kIFNldHRpbmdzXFxqeGlcXEVQRlxcUHVibGlzaFxcMDkyNi43MWxpYl9jbGFzc2ljIHJ1cCI7Ci0KLS8vCQkJU3RyaW5nIHB1Ymxpc2hEaXIgPSAKLS8vCQkJCSJDOlxcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xcanhpXFxFUEZcXFB1Ymxpc2hcXFJVUF9BTEwiOwotCQkJCi0JCQkKLQkJCVN0cmluZyB0aXRsZSA9ICJSVVAiOwotCQkJU3RyaW5nIGRlZmZpbGUgPSAiRDpcXEVQRiBXb3Jrc3BhY2VzXFxlcGYtaGVhZFxcb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmdcXGtleXdvcmRpbmRleGRlZi50eHQiOwotCQkJCi0vLwkJCVVSTCB1cmwgPSBuZXcgVVJMKFB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEluc3RhbGxVUkwoKSwKLS8vCQkJCQlQdWJsaXNoTWFuYWdlci5LRVlXT1JEX0RFRl9GSUxFKTsKLS8vCQkJaWYgKHVybCA9PSBudWxsKSB7Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBnZXQgaW5kZXggZGVmaW5pdGlvbiBmaWxlICIpOyAvLyROT04tTkxTLTEkCi0vLwkJCQlyZXR1cm47Ci0vLwkJCX0KLQotLy8JCQlTdHJpbmcgZGVmZmlsZSA9IFBsYXRmb3JtLnJlc29sdmUodXJsKS5nZXRQYXRoKCk7Ci0JCQkKLQotCQkJU3RyaW5nIGNoYXJTZXQgPSAidXRmLTgiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgaGVscEZpbGUgPSBudWxsOwotCQkJS2V5V29yZEluZGV4SGVscGVyIGluZGV4SGVscGVyID0gbmV3IEtleVdvcmRJbmRleEhlbHBlcihkZWZmaWxlLAotCQkJCQljaGFyU2V0LCBoZWxwRmlsZSk7Ci0JCQlEZWZpbml0aW9uT2JqZWN0IGRlZk9iaiA9IGluZGV4SGVscGVyLmxvYWREZWZpbml0aW9uKHB1Ymxpc2hEaXIpOwotCQkJaWYgKGRlZk9iaiAhPSBudWxsKSB7Ci0JCQkJZGVmT2JqLnNldHd3d1Jvb3QocHVibGlzaERpcik7Ci0JCQkJZGVmT2JqCi0JCQkJCQkuc2V0SW5kZXhUaXRsZShQdWJsaXNoaW5nUmVzb3VyY2VzLmluZGV4TGFiZWxfdGV4dCArICIgLSAiICsgdGl0bGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJaW5kZXhIZWxwZXIuZXhlY3V0ZShtb25pdG9yKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0phclJlc291cmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvSmFyUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1MWIyMTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvSmFyUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotLyoqCi0gKiBKYXJSZXNvdXJjZXM6IEphclJlc291cmNlcyBtYXBzIGFsbCByZXNvdXJjZXMgaW5jbHVkZWQgaW4gYQotICogWmlwIG9yIEphciBmaWxlLiBBZGRpdGlvbmFseSwgaXQgcHJvdmlkZXMgYSBtZXRob2QgdG8gZXh0cmFjdCBvbmUKLSAqIGFzIGEgYmxvYi4KLSAqLwotZmluYWwgY2xhc3MgSmFyUmVzb3VyY2VzIHsKLQotICAgLy8gZXh0ZXJuYWwgZGVidWcgZmxhZwotICAgYm9vbGVhbiBkZWJ1Z09uPWZhbHNlOwotCi0gICAvLyBqYXIgcmVzb3VyY2UgbWFwcGluZyB0YWJsZXMKLSAgIHByaXZhdGUgSGFzaHRhYmxlIGh0SmFyQ29udGVudHM9bmV3IEhhc2h0YWJsZSgpOwotCi0gICAvLyBhIGphciBmaWxlCi0gICBwcml2YXRlIFN0cmluZyBqYXJGaWxlTmFtZTsKLQotICAgLyoqCi0gICAgKiBjcmVhdGVzIGEgSmFyUmVzb3VyY2VzLiBJdCBleHRyYWN0cyBhbGwgcmVzb3VyY2VzIGZyb20gYSBKYXIKLSAgICAqIGludG8gYW4gaW50ZXJuYWwgaGFzaHRhYmxlLCBrZXllZCBieSByZXNvdXJjZSBuYW1lcy4KLSAgICAqIEBwYXJhbSBqYXJGaWxlTmFtZSBhIGphciBvciB6aXAgZmlsZQotICAgICovCi0gICBKYXJSZXNvdXJjZXMoU3RyaW5nIGphckZpbGVOYW1lKSB7Ci0gICAgICB0aGlzLmphckZpbGVOYW1lPWphckZpbGVOYW1lOwotICAgICAgaW5pdCgpOwotICAgfQotCi0gICAvKioKLSAgICAqIEV4dHJhY3RzIGEgamFyIHJlc291cmNlIGFzIGEgYmxvYi4KLSAgICAqIEBwYXJhbSBuYW1lIGEgcmVzb3VyY2UgbmFtZS4KLSAgICAqLwotICAgYnl0ZVtdIGdldFJlc291cmNlKFN0cmluZyBuYW1lKSB7Ci0gICAgICByZXR1cm4gKGJ5dGVbXSlodEphckNvbnRlbnRzLmdldChuYW1lKTsKLSAgIH0KLQotICAgYnl0ZVtdIGdldFJlc291cmNlKCkKLSAgIHsKLSAgICAgIEVudW1lcmF0aW9uIGtleXMgPSBodEphckNvbnRlbnRzLmtleXMoKTsKLSAgICAgIHJldHVybiAoYnl0ZVtdKWh0SmFyQ29udGVudHMuZ2V0KGtleXMubmV4dEVsZW1lbnQoKSk7Ci0gICB9Ci0KLS8qKgotICAqIGluaXRpYWxpemVzIGludGVybmFsIGhhc2ggdGFibGVzIHdpdGggSmFyIGZpbGUgcmVzb3VyY2VzLgotICAqLwotcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0gIHRyeSB7Ci0gICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3NpbmcgSmFyIEFyY2hpdmUgIiArIGphckZpbGVOYW1lKTsKLQkgIERhdGFJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0gICAgICBpZihqYXJGaWxlTmFtZS5zdGFydHNXaXRoKERlZi5IdHRwKSB8fCBqYXJGaWxlTmFtZS5zdGFydHNXaXRoKERlZi5IdHRwcyl8fCBqYXJGaWxlTmFtZS5zdGFydHNXaXRoKERlZi5GaWxlKSkKLSAgICAgIHsKLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJPcGVuaW5nIHRoZSBKYXIgRmlsZSBhcyBhIFVSTCBzdHJlYW0iKTsKLQkJaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKCBuZXcgVVJMKGphckZpbGVOYW1lKS5vcGVuU3RyZWFtKCkgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJPcGVuaW5nIHRoZSBKYXIgRmlsZSBhcyBhIGxvY2FsIGZpbGUgc3RyZWFtIik7Ci0gICAgICAgIGluID0gbmV3IERhdGFJbnB1dFN0cmVhbSggbmV3IEZpbGVJbnB1dFN0cmVhbShqYXJGaWxlTmFtZSkpOwotICAgICAgfQotICAgICAgLy8gZXh0cmFjdCByZXNvdXJjZXMgYW5kIHB1dCB0aGVtIGludG8gdGhlIGhhc2h0YWJsZS4KLSAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYmlzPW5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGluKTsKLSAgICAgIFppcElucHV0U3RyZWFtIHppcz1uZXcgWmlwSW5wdXRTdHJlYW0oYmlzKTsKLSAgICAgIFppcEVudHJ5IHplPW51bGw7Ci0gICAgICB3aGlsZSAoKHplPXppcy5nZXROZXh0RW50cnkoKSkhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICh6ZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZWJ1Z09uKSB7Ci0gICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgInplLmdldE5hbWUoKT0iK3plLmdldE5hbWUoKSsiLCIrImdldFNpemUoKT0iK3plLmdldFNpemUoKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgICAgIGludCBzaXplPShpbnQpemUuZ2V0U2l6ZSgpOwotICAgICAgICAvLyAtMSBtZWFucyB1bmtub3duIHNpemUuCi0JCWlmICggc2l6ZSA9PSAtMSApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRVJST1I6IFJldHVybmVkIHNpemUgb2YgemlwIGZpbGUgaXMgLTEuIEZpbGVuYW1lOiAiICsgemUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLSAgICAgICAgYnl0ZVtdIGI9bmV3IGJ5dGVbKGludClzaXplXTsKLSAgICAgICAgaW50IHJiPTA7Ci0gICAgICAgIGludCBjaHVuaz0wOwotICAgICAgICB3aGlsZSAoKChpbnQpc2l6ZSAtIHJiKSA+IDApIHsKLSAgICAgICAgICAgY2h1bms9emlzLnJlYWQoYixyYiwoaW50KXNpemUgLSByYik7Ci0gICAgICAgICAgIGlmIChjaHVuaz09LTEpIHsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHJiKz1jaHVuazsKLSAgICAgICAgfQotICAgICAgICAvLyBhZGQgdG8gaW50ZXJuYWwgcmVzb3VyY2UgaGFzaHRhYmxlCi0gICAgICAgIGh0SmFyQ29udGVudHMucHV0KHplLmdldE5hbWUoKSxiKTsKLSAgICAgICAgaWYgKGRlYnVnT24pIHsKLSAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgemUuZ2V0TmFtZSgpKyIgIHJiPSIrcmIrIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICIsc2l6ZT0iK3NpemUrIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICIsY3NpemU9Iit6ZS5nZXRDb21wcmVzc2VkU2l6ZSgpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLSAgICAgfQotICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZG9uZS4iKTsgLy8kTk9OLU5MUy0xJAotICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gIH0KLX0KLQotICAgLyoqCi0gICAgKiBEdW1wcyBhIHppcCBlbnRyeSBpbnRvIGEgc3RyaW5nLgotICAgICogQHBhcmFtIHplIGEgWmlwRW50cnkKLSAgICAqLwotICAgcHJpdmF0ZSBTdHJpbmcgZHVtcFppcEVudHJ5KFppcEVudHJ5IHplKSB7Ci0gICAgICAgU3RyaW5nQnVmZmVyIHNiPW5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICBpZiAoemUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgIHNiLmFwcGVuZCgiZCAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc2IuYXBwZW5kKCJmICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgfQotICAgICAgIGlmICh6ZS5nZXRNZXRob2QoKT09WmlwRW50cnkuU1RPUkVEKSB7Ci0gICAgICAgICAgc2IuYXBwZW5kKCJzdG9yZWQgICAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc2IuYXBwZW5kKCJkZWZhbHRlZCAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIH0KLSAgICAgICBzYi5hcHBlbmQoemUuZ2V0TmFtZSgpKTsKLSAgICAgICBzYi5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICBzYi5hcHBlbmQoIiIremUuZ2V0U2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIGlmICh6ZS5nZXRNZXRob2QoKT09WmlwRW50cnkuREVGTEFURUQpIHsKLSAgICAgICAgICBzYi5hcHBlbmQoIi8iK3plLmdldENvbXByZXNzZWRTaXplKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgfQotICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7Ci0gICB9Ci0KLX0JLy8gRW5kIG9mIEphclJlc291cmNlcyBjbGFzcy4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2QzZTAwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1jbGFzcyBLZXlXb3JkCi17Ci0gICBwcml2YXRlIFN0cmluZyBrZXlXb3JkPW51bGw7Ci0gICBwcml2YXRlIFZlY3RvciBteUtleVdvcmRzPW51bGw7Ci0gICBwcml2YXRlIFZlY3RvciBteURvY3VtZW50cz1udWxsOwotICAgcHJpdmF0ZSBTcGVjS2V5V29yZCBteVNwZWNLZXlXb3JkPW51bGw7Ci0gICBwcml2YXRlIEtleVdvcmQgcGFyZW50TT1udWxsOwotICAgS2V5V29yZERlZiBkZWYgPSBudWxsOwotICAgCi0gICBLZXlXb3JkKEtleVdvcmREZWYgZGVmKQotICAgewotCSAgIHRoaXMuZGVmID0gZGVmOwotCSAgIGtleVdvcmQgPSBkZWYuZ2V0S2V5KCk7Ci0gICB9Ci0KLSAgIHByaXZhdGUgS2V5V29yZChLZXlXb3JkRGVmIGRlZiwgU3RyaW5nIGtleVdvcmQsIEtleVdvcmQga2V5KQotICAgewotCSAgIHRoaXMuZGVmID0gZGVmOwotCSAgIHRoaXMua2V5V29yZCA9IGtleVdvcmQ7Ci0JICAgdGhpcy5wYXJlbnRNID0ga2V5OwotCSAgIAotICAgfQotCi0gICBTdHJpbmcgZ2V0S2V5V29yZCgpCi0gICB7Ci0gICAgIHJldHVybiBrZXlXb3JkOwotICAgfQotCi0gICB2b2lkIGFkZEtleVdvcmQoS2V5V29yZERlZiBkZWYsIFN0cmluZyBrZXksIERvY3VtZW50IGRvYykKLSAgIHsJICAgCi0gICAgIGludCBpbmRleCA9IE1pc2NTdGF0aWMuZ2V0SW5kZXgoa2V5LCBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmxldmVsU2VwYXJhdG9yUmVwbGFjZSwgMCk7Ci0gICAgIC8vSWYgdGhlIGJvdHRvbSBvZiB0aGUga2V5d29yZCBpcyByZWFjaGVkCi0gICAgIGlmKGluZGV4PT0tMSkKLSAgICAgewotICAgICAgICBhZGREb2N1bWVudChkb2MpOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgICBpbnQgaW5kZXgyID0gIE1pc2NTdGF0aWMuZ2V0SW5kZXgoa2V5LCBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmxldmVsU2VwYXJhdG9yUmVwbGFjZSwgaW5kZXgrMSk7Ci0gICAgICAgIFN0cmluZyBuZXh0S2V5V29yZD1udWxsOwotICAgICAgICBpZihpbmRleDIhPS0xKQotICAgICAgICB7Ci0gICAgICAgICAgIG5leHRLZXlXb3JkID0ga2V5LnN1YnN0cmluZyhpbmRleCsxLGluZGV4Mik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmV4dEtleVdvcmQgPSBrZXkuc3Vic3RyaW5nKGluZGV4KzEpOwotICAgICAgICB9Ci0KLSAgICAgICAgS2V5V29yZCB0bXBLZXkgPSBjcmVhdGVLZXlXb3JkKGRlZiwgbmV4dEtleVdvcmQpOwotICAgICAgICBpZih0bXBLZXkhPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0bXBLZXkuYWRkS2V5V29yZChkZWYsIGtleS5zdWJzdHJpbmcoaW5kZXgrMSksIGRvYyk7Ci0gICAgICAgIH0KLSAgICAgfQotICAgfQotCi0gICB2b2lkIHNldFNwZWNLZXlXb3JkKFN0cmluZyByZWxhdGVkS2V5LCBib29sZWFuIHNlZSkKLSAgIHsKLSAgICAgSU8ucHJpbnREZWJ1Zygic2V0U3BlY0tleVdvcmQgIiArIHJlbGF0ZWRLZXkpOyAvLyROT04tTkxTLTEkCi0gICAgIG15U3BlY0tleVdvcmQgPSBuZXcgU3BlY0tleVdvcmQocmVsYXRlZEtleSwgc2VlKTsKLSAgIH0KLQotICAgdm9pZCBpbnNlcnRTcGVjS2V5V29yZChTdHJpbmcgc3BlY0tleVdvcmRTdHJpbmcsIFN0cmluZyByZWxhdGVkS2V5V29yZCkKLSAgIHsKLQotICAgICAgYm9vbGVhbiBmb3VuZD1mYWxzZTsKLSAgICAgIGludCBpPTA7Ci0gICAgICBTdHJpbmcgZmlyc3RLZXlXb3JkID0gc3BlY0tleVdvcmRTdHJpbmc7Ci0gICAgICBpbnQgcG9zID0gc3BlY0tleVdvcmRTdHJpbmcuaW5kZXhPZihLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmxldmVsU2VwYXJhdG9yUmVwbGFjZSwwKTsKLSAgICAgIGlmKHBvcyE9LTEpCi0gICAgICB7Ci0gICAgICAgIGZpcnN0S2V5V29yZCA9IHNwZWNLZXlXb3JkU3RyaW5nLnN1YnN0cmluZygwLHBvcyk7Ci0gICAgICB9Ci0KLSAgICAgIHdoaWxlKCFmb3VuZCAmJiBteUtleVdvcmRzIT1udWxsICYmIGk8bXlLZXlXb3Jkcy5zaXplKCkpCi0gICAgICB7Ci0gICAgICAgICBLZXlXb3JkIHRtcEsgPSAgKEtleVdvcmQpbXlLZXlXb3Jkcy5lbGVtZW50QXQoaSk7Ci0gICAgICAgICBpZihmaXJzdEtleVdvcmQuZXF1YWxzKHRtcEsuZ2V0S2V5V29yZCgpKSkKLSAgICAgICAgIHsKLQotICAgICAgICAgZm91bmQ9dHJ1ZTsKLSAgICAgICAgIGlmKHBvcyE9LTEpCi0gICAgICAgICAgewotICAgICAgICAgICAgdG1wSy5pbnNlcnRTcGVjS2V5V29yZChzcGVjS2V5V29yZFN0cmluZy5zdWJzdHJpbmcocG9zKzEpLCByZWxhdGVkS2V5V29yZCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0bXBLLnNldFNwZWNLZXlXb3JkKHJlbGF0ZWRLZXlXb3JkLCBmYWxzZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgIGkrKzsKLSAgICAgIH0KLSAgICAgIGlmKCFmb3VuZCkKLSAgICAgIHsKLSAgICAgICAgIGludCBpbmRleD0tMTsKLSAgICAgICAgIGk9MDsKLSAgICAgICAgIEtleVdvcmQgbmV3S2V5V29yZDIgPSBuZXcgS2V5V29yZChudWxsLCBmaXJzdEtleVdvcmQsIHRoaXMpOwotICAgICAgICAgSU8ucHJpbnREZWJ1ZygibmV3IGtleXdvcmQgIiArIGZpcnN0S2V5V29yZCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgIGlmKHBvcz09LTEpCi0gICAgICAgICB7Ci0gICAgICAgICAgIG5ld0tleVdvcmQyLnNldFNwZWNLZXlXb3JkKHJlbGF0ZWRLZXlXb3JkLCB0cnVlKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgICBuZXdLZXlXb3JkMi5pbnNlcnRTcGVjS2V5V29yZChzcGVjS2V5V29yZFN0cmluZy5zdWJzdHJpbmcocG9zKzEpLCByZWxhdGVkS2V5V29yZCk7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZihteUtleVdvcmRzPT1udWxsKQotICAgICAgICAgewotICAgICAgICAgICAgSU8ucHJpbnREZWJ1ZygibXlLZXlXb3JkcyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBteUtleVdvcmRzID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgfQotICAgICAgICAgd2hpbGUoaW5kZXg9PS0xICYmIGk8bXlLZXlXb3Jkcy5zaXplKCkpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBLZXlXb3JkIHRtcEsgPSAgKEtleVdvcmQpbXlLZXlXb3Jkcy5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICBpZihuZXdLZXlXb3JkMi5nZXRLZXlXb3JkKCkudG9VcHBlckNhc2UoKS4KLSAgICAgICAgICAgICAgICAgIGNvbXBhcmVUbyh0bXBLLmdldEtleVdvcmQoKS50b1VwcGVyQ2FzZSgpKTwwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLnRvVXBwZXJDYXNlKCkuCi0gICAgICAgICAgICAgICAgICBjb21wYXJlVG8odG1wSy5nZXRLZXlXb3JkKCkudG9VcHBlckNhc2UoKSk9PTApCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBpZihuZXdLZXlXb3JkMi5nZXRLZXlXb3JkKCkuY29tcGFyZVRvKHRtcEsuZ2V0S2V5V29yZCgpKSE9MCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgaWYobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLmNvbXBhcmVUbyh0bXBLLmdldEtleVdvcmQoKSk+MCkKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpLTE7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgIH0KLQotICAgICAgICAgaWYoaW5kZXghPS0xKQotICAgICAgICAgewotICAgICAgICAgICAgICBteUtleVdvcmRzLmluc2VydEVsZW1lbnRBdChuZXdLZXlXb3JkMiwgaW5kZXgpOwotICAgICAgICAgfQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgbXlLZXlXb3Jkcy5pbnNlcnRFbGVtZW50QXQobmV3S2V5V29yZDIsIG15S2V5V29yZHMuc2l6ZSgpKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLQotICAgcHJpdmF0ZSBLZXlXb3JkIGNyZWF0ZUtleVdvcmQoS2V5V29yZERlZiBkZWYsIFN0cmluZyBrZXkpCi0gICB7Ci0KLSAgICAgaWYobXlLZXlXb3Jkcz09bnVsbCkKLSAgICAgewotICAgICAgICBteUtleVdvcmRzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBLZXlXb3JkIG5ld0tleVdvcmQgPSBuZXcgS2V5V29yZChkZWYsIGtleSwgdGhpcyk7Ci0gICAgICAgIG15S2V5V29yZHMuYWRkRWxlbWVudChuZXdLZXlXb3JkKTsKLSAgICAgICAgcmV0dXJuIG5ld0tleVdvcmQ7Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgIGludCBpbmRleD0tMTsKLSAgICAgICAgIGludCBpPTA7Ci0gICAgICAgICAgS2V5V29yZCBuZXdLZXlXb3JkMiA9IG5ldyBLZXlXb3JkKGRlZiwga2V5LCB0aGlzKTsKLSAgICAgICAgIHdoaWxlKGluZGV4PT0tMSAmJiBpPG15S2V5V29yZHMuc2l6ZSgpKQotICAgICAgICAgewotICAgICAgICAgICAgS2V5V29yZCB0bXBLID0gIChLZXlXb3JkKW15S2V5V29yZHMuZWxlbWVudEF0KGkpOwotCi0KLSAgICAgICAgICAgIGlmKG5ld0tleVdvcmQyLmdldEtleVdvcmQoKS50b1VwcGVyQ2FzZSgpLgotICAgICAgICAgICAgICAgIGNvbXBhcmVUbyh0bXBLLmdldEtleVdvcmQoKS50b1VwcGVyQ2FzZSgpKTwwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihuZXdLZXlXb3JkMi5nZXRLZXlXb3JkKCkudG9VcHBlckNhc2UoKS4KLSAgICAgICAgICAgICAgICBjb21wYXJlVG8odG1wSy5nZXRLZXlXb3JkKCkudG9VcHBlckNhc2UoKSk9PTApCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBpZihuZXdLZXlXb3JkMi5nZXRLZXlXb3JkKCkuY29tcGFyZVRvKHRtcEsuZ2V0S2V5V29yZCgpKSE9MCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgaWYobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLmNvbXBhcmVUbyh0bXBLLmdldEtleVdvcmQoKSk8MCkKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpKzE7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIHRtcEs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaSsrOwotICAgICAgICAgfQotCi0gICAgICAgICBpZihpbmRleCE9LTEpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAgIG15S2V5V29yZHMuaW5zZXJ0RWxlbWVudEF0KG5ld0tleVdvcmQyLCBpbmRleCk7Ci0gICAgICAgICAgICAgIHJldHVybiBuZXdLZXlXb3JkMjsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIG15S2V5V29yZHMuaW5zZXJ0RWxlbWVudEF0KG5ld0tleVdvcmQyLCBteUtleVdvcmRzLnNpemUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3S2V5V29yZDI7Ci0gICAgICAgICB9Ci0KLSAgICAgfQotICAgfQotCi0gICBwcml2YXRlIHZvaWQgYWRkRG9jdW1lbnQoRG9jdW1lbnQgZG9jKQotICAgewotICAgIGRvYy5zZXRLZXlXb3JkKHRoaXMpOwotICAgICAgaWYobXlEb2N1bWVudHM9PW51bGwpCi0gICAgICB7Ci0gICAgICAgICBteURvY3VtZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgIG15RG9jdW1lbnRzLmFkZEVsZW1lbnQoZG9jKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGludCBpbmRleD0tMTsKLSAgICAgICAgIGludCBpPTA7Ci0gICAgICAgICB3aGlsZShpbmRleD09LTEgJiYgaTxteURvY3VtZW50cy5zaXplKCkpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBEb2N1bWVudCB0bXBEID0gIChEb2N1bWVudClteURvY3VtZW50cy5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICBpZihkb2MuZ2V0VGl0bGUoKS5jb21wYXJlVG8odG1wRC5nZXRUaXRsZSgpKTwwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgIH0KLQotICAgICAgICAgaWYoaW5kZXghPS0xKQotICAgICAgICAgewotICAgICAgICAgICAgICBteURvY3VtZW50cy5pbnNlcnRFbGVtZW50QXQoZG9jLCBpbmRleCk7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBteURvY3VtZW50cy5pbnNlcnRFbGVtZW50QXQoZG9jLCBteURvY3VtZW50cy5zaXplKCkpOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotCi0gICB2b2lkIHByaW50KE91dHB1dFN0cmVhbVdyaXRlciBvdXRQLCBpbnQgbGV2ZWwpCi0gICB7Ci0gICAgIGlmKG91dFA9PW51bGwpCi0gICAgICB7Ci0gICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIktleVdvcmQ6cHJpbnRcbiIgKyBIZWxwTWVzc2FnZXMuQkFEX09VVFBVVF9TVFJFQU0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLnByaW50U3RhcnQob3V0UCxsZXZlbCsxKTsKLSAgICAgIGlmKGxldmVsPT0wKQotICAgICAgewotICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsICI8QSBOQU1FPVwiIiArIGtleVdvcmQrICJcIj4gPC9BPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIH0KLSAgICAgIE1pc2NTdGF0aWMucHJpbnRTcGFjZShvdXRQLCBsZXZlbCo0KTsKLSAgICAgIGlmKGxldmVsIT0wKQotICAgICAgewotICAgICAgICBNaXNjU3RhdGljLnByaW50U3BhY2Uob3V0UCwyKTsKLSAgICAgIH0KLSAgICAgIGlmKG15RG9jdW1lbnRzIT1udWxsKQotICAgICAgewotICAgICAgICBpZighS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRTaG93RG9jdW1lbnRUaXRsZSgpICYmICFLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldE11bGl0RG9jdW1lbnRLZXl3b3JkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBEb2N1bWVudCB0bXBEID0gKERvY3VtZW50KSAgbXlEb2N1bWVudHMuZWxlbWVudEF0KDApOwotICAgICAgICAgIHRtcEQuc2V0S2V5V29yZCh0aGlzKTsKLSAgICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsICI8QSBIUkVGPVwiIiArIHRtcEQuZ2V0VXJsKCkgKyAiXCIgVEFSR0VUPVwiIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICArIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0VGFyZ2V0KCkgKyJcIj4iICsga2V5V29yZCArICI8L0E+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZighS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRNdWxpdERvY3VtZW50S2V5d29yZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwga2V5V29yZCk7Ci0gICAgICAgICAgIERvY3VtZW50IHRtcEQgPSAoRG9jdW1lbnQpICBteURvY3VtZW50cy5lbGVtZW50QXQoMCk7Ci0gICAgICAgICAgIHRtcEQuc2V0S2V5V29yZCh0aGlzKTsKLSAgICAgICAgICAgdG1wRC5wcmludChvdXRQKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwga2V5V29yZCk7Ci0gICAgICAgICBNaXNjU3RhdGljLnByaW50U3BhY2Uob3V0UCwgMSk7Ci0KLSAgICAgICAgIGZvcihpbnQgaT0wO2k8bXlEb2N1bWVudHMuc2l6ZSgpO2krKykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIERvY3VtZW50IHRtcEQgPSAoRG9jdW1lbnQpICBteURvY3VtZW50cy5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICAgdG1wRC5zZXRLZXlXb3JkKHRoaXMpOwotICAgICAgICAgICAgdG1wRC5wcmludChvdXRQKTsKLSAgICAgICAgICAgIGlmKGkhPW15RG9jdW1lbnRzLnNpemUoKS0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsICIsICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsICJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwga2V5V29yZCk7Ci0gICAgICB9Ci0gICAgICBpZihteVNwZWNLZXlXb3JkIT1udWxsKQotICAgICAgewotICAgICAgICBteVNwZWNLZXlXb3JkLnByaW50KG91dFApOwotICAgICAgfQotCi0gICAgICBpZihLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldFN0eWxlU2hlZXQoRGVmLkRlZmF1bHRTdHlsZSk9PW51bGwpCi0gICAgICB7Ci0gICAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwgIjxCUj4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5wcmludEVuZChvdXRQLGxldmVsKzEpOwotICAgICAgaWYobXlLZXlXb3JkcyE9bnVsbCkKLSAgICAgIHsKLQotICAgICAgICAgaW50IHRtcEwgPSBsZXZlbCsxOwotICAgICAgICAgZm9yKGludCBpPTA7aTxteUtleVdvcmRzLnNpemUoKTtpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICBLZXlXb3JkIHRtcEsgPSAoS2V5V29yZCkgIG15S2V5V29yZHMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgdG1wSy5wcmludChvdXRQLCB0bXBMKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgfQotCi0gICBTdHJpbmcgZ2V0QW5jaG9yKCkKLSAgIHsKLQkgICBpZiAoIHRoaXMuZGVmICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgICByZXR1cm4gdGhpcy5kZWYuZ2V0QW5jaG9yKCk7Ci0gICAgICB9Ci0JICAgCi0gICAgICBpZihwYXJlbnRNIT1udWxsKQotICAgICAgewotICAgICAgICAgcmV0dXJuIHBhcmVudE0uZ2V0QW5jaG9yKCk7Ci0gICAgICB9Ci0gICAgICAgCi0gICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgIH0KLSAgIAotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZERlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZERlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNDc0M2YwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmREZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4OwotCi0vKioKLSAqIHRoaXMgY2xhc3MgZGVmaW5lcyBhIGtleSB3b3JkCi0gKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLWNsYXNzIEtleVdvcmREZWYgewotCi0JcHJpdmF0ZSBTdHJpbmcgYW5jaG9yOwotCXByaXZhdGUgU3RyaW5nIGtleTsKLQlwcml2YXRlIFN0cmluZyB0ZXh0OwotCi0JcHJpdmF0ZSBTdHJpbmcga2V5V29yZFN0cmluZzsKLQotCUtleVdvcmREZWYoU3RyaW5nIGFuY2hvcikKLQl7Ci0JCXRoaXMoYW5jaG9yLCBudWxsLCBudWxsKTsKLQl9Ci0KLQlLZXlXb3JkRGVmKFN0cmluZyBhbmNob3IsIFN0cmluZyBrZXksIFN0cmluZyB0ZXh0KQotCXsKLQkJdGhpcy5hbmNob3IgPSBhbmNob3I7Ci0JCXRoaXMua2V5ID0ga2V5OwotCQl0aGlzLnRleHQgPSB0ZXh0OwotCQkKLQkJaWYgKCB0aGlzLnRleHQgPT0gbnVsbCApCi0JCXsKLQkJCXRoaXMudGV4dCA9ICIiOwotCQl9Ci0KLQkJdGhpcy5rZXlXb3JkU3RyaW5nID0gS2V5V29yZFN0YXRpYy5jb252ZXJ0S2V5V29yZCh0aGlzLmFuY2hvciwgdGhpcy5rZXksIHRoaXMudGV4dCk7Ci0JCWlmICggdGhpcy5rZXkgPT0gbnVsbCB8fCB0aGlzLmtleS5lcXVhbHMoIiIpICkKLQkJewotCQkJaW50IGluZGV4ID0gdGhpcy5rZXlXb3JkU3RyaW5nLmluZGV4T2YoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5sZXZlbFNlcGFyYXRvclJlcGxhY2UpOwotCQkJaWYgKCBpbmRleCA8IDAgKQotCQkJewotCQkJCXRoaXMua2V5ID0gdGhpcy5rZXlXb3JkU3RyaW5nOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXRoaXMua2V5ID0gdGhpcy5rZXlXb3JkU3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JU3RyaW5nIGdldEFuY2hvcigpCi0JewotCQlyZXR1cm4gYW5jaG9yOwotCX0KLQkKLQlTdHJpbmcgZ2V0S2V5KCkKLQl7Ci0JCXJldHVybiBrZXk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGtleVdvcmRTdHJpbmc7Ci0JfQotCi0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkRmlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZEZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzU2YWQ1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLy9SZXByZXNlbnRzIGEgaHRtbCBmaWxlIHRoYXQgY29udGFpbnMga2V5d29yZHMKLWNsYXNzIEtleVdvcmRGaWxlCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdGl0bGU9bnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyB1cmw9bnVsbDsKLQotICAgIHByaXZhdGUgaW50IG5leHRLZXlXb3JkPTA7Ci0gICAgcHJpdmF0ZSBMaXN0IGtleVdvcmRWZWN0b3I9bnVsbDsKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBDb25zdHJ1Y3Rvci4KLSAgICBLZXlXb3JkRmlsZShTdHJpbmcgdGl0bGUsIFN0cmluZyB1cmwsIExpc3Qga2V5V29yZHMpIC8vIGxpc3Qgb2YgS2V5V29yZERlZiBvYmplY3QKLSAgICB7Ci0gICAgICAgdGhpcy50aXRsZSA9IHRpdGxlOwotICAgICAgIHRoaXMudXJsID0gdXJsOwotICAgICAgIHRoaXMua2V5V29yZFZlY3RvciA9ICBrZXlXb3JkczsKLSAgICB9Ci0gICAgCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgS2V5V29yZERlZiBnZXROZXh0S2V5V29yZCgpCi0gICAgewotICAgICAgIGlmKG5leHRLZXlXb3JkPGtleVdvcmRWZWN0b3Iuc2l6ZSgpKQotICAgICAgIHsKLSAgICAJICAgS2V5V29yZERlZiBuZXh0ID0gKEtleVdvcmREZWYpa2V5V29yZFZlY3Rvci5nZXQobmV4dEtleVdvcmQpOwotICAgICAgICBuZXh0S2V5V29yZCsrOwotICAgICAgICBpZihuZXh0IT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBEb2N1bWVudCBnZXREb2N1bWVudChTdHJpbmcga2V5V29yZCwgaW50IG5vT2ZEb2MpCi0gICAgewotCi0gICAgICAgIGlmKG5vT2ZEb2M+MSkKLSAgICAgICAgewotICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgRG9jdW1lbnQodGl0bGUsIHVybCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRIb2xkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDM2YzZlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotY2xhc3MgS2V5V29yZEhvbGRlciB7Ci0JcHJpdmF0ZSBWZWN0b3Iga2V5V29yZEZpbGVzID0gbnVsbDsKLQotCXByaXZhdGUgVmVjdG9yIGtleVdvcmRzID0gbnVsbDsKLQotCUtleVdvcmRIb2xkZXIoKSB7Ci0JCWtleVdvcmRGaWxlcyA9IG5ldyBWZWN0b3IoKTsKLQl9Ci0KLQl2b2lkIGFkZChLZXlXb3JkRmlsZSBrZXkpIHsKLQkJa2V5V29yZEZpbGVzLmFkZEVsZW1lbnQoa2V5KTsKLQl9Ci0KLQl2b2lkIGRpdmlkZSgpIHsKLQkJaWYgKGtleVdvcmRGaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGtleVdvcmRGaWxlcy5zaXplKCk7IGkrKykgewotCQkJCVN0cmluZyBuZXh0S2V5V29yZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJS2V5V29yZEZpbGUgdG1wID0gKEtleVdvcmRGaWxlKSBrZXlXb3JkRmlsZXMuZWxlbWVudEF0KGkpOwotCQkJCXdoaWxlIChuZXh0S2V5V29yZCAhPSBudWxsKSB7Ci0JCQkJCW5leHRLZXlXb3JkID0gbnVsbDsKLQkJCQkJS2V5V29yZERlZiBkZWYgPSB0bXAuZ2V0TmV4dEtleVdvcmQoKTsKLQkJCQkJaWYgKGRlZiAhPSBudWxsKSB7Ci0JCQkJCQluZXh0S2V5V29yZCA9IGRlZi50b1N0cmluZygpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKG5leHRLZXlXb3JkICE9IG51bGwpIHsKLQotCQkJCQkJaW50IG5vT2ZEb2MgPSAxOwotCQkJCQkJRG9jdW1lbnQgdG1wRCA9IHRtcC5nZXREb2N1bWVudChuZXh0S2V5V29yZCwgbm9PZkRvYyk7Ci0KLQkJCQkJCXdoaWxlICh0bXBEICE9IG51bGwpIHsKLQkJCQkJCQlpbnQgaW5kZXggPSBNaXNjU3RhdGljCi0JCQkJCQkJCQkuZ2V0SW5kZXgoCi0JCQkJCQkJCQkJCW5leHRLZXlXb3JkLAotCQkJCQkJCQkJCQlLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmxldmVsU2VwYXJhdG9yUmVwbGFjZSwKLQkJCQkJCQkJCQkJMCk7Ci0JCQkJCQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkJCQkJCWluZGV4ID0gbmV4dEtleVdvcmQubGVuZ3RoKCk7Ci0JCQkJCQkJfQotCi0JCQkJCQkJS2V5V29yZCB0bXBLID0gY3JlYXRlS2V5V29yZChkZWYpOwotCQkJCQkJCWlmICh0bXBLICE9IG51bGwgJiYgdG1wRCAhPSBudWxsKSB7Ci0JCQkJCQkJCXRtcEsuYWRkS2V5V29yZChkZWYsIG5leHRLZXlXb3JkLCB0bXBEKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlub09mRG9jKys7Ci0JCQkJCQkJdG1wRCA9IHRtcC5nZXREb2N1bWVudChuZXh0S2V5V29yZCwgbm9PZkRvYyk7Ci0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgS2V5V29yZCBjcmVhdGVLZXlXb3JkKEtleVdvcmREZWYgZGVmKSB7Ci0KLQkJaWYgKGtleVdvcmRzID09IG51bGwpIHsKLQkJCWtleVdvcmRzID0gbmV3IFZlY3RvcigpOwotCQkJS2V5V29yZCBuZXdLZXlXb3JkID0gbmV3IEtleVdvcmQoZGVmKTsKLQkJCWtleVdvcmRzLmFkZEVsZW1lbnQobmV3S2V5V29yZCk7Ci0JCQlyZXR1cm4gbmV3S2V5V29yZDsKLQkJfSBlbHNlIHsKLQkJCWludCBpbmRleCA9IC0xOwotCQkJaW50IGkgPSAwOwotCQkJS2V5V29yZCBuZXdLZXlXb3JkMiA9IG5ldyBLZXlXb3JkKGRlZik7Ci0JCQlTdHJpbmcgc3RyMiA9IG5ld0tleVdvcmQyLmdldEtleVdvcmQoKTsKLQotCQkJd2hpbGUgKGluZGV4ID09IC0xICYmIGkgPCBrZXlXb3Jkcy5zaXplKCkpIHsKLQkJCQlLZXlXb3JkIHRtcEsgPSAoS2V5V29yZCkga2V5V29yZHMuZWxlbWVudEF0KGkpOwotCQkJCVN0cmluZyBzdHIgPSB0bXBLLmdldEtleVdvcmQoKTsKLQkJCQlpbnQgY21wID0gc3RyMi50b1VwcGVyQ2FzZSgpLmNvbXBhcmVUbyhzdHIudG9VcHBlckNhc2UoKSk7Ci0JCQkJaWYgKGNtcCA8IDApIHsKLQkJCQkJaW5kZXggPSBpOwotCQkJCX0gZWxzZSBpZiAoY21wID09IDApIHsKLQkJCQkJaW50IGNtcDIgPSBzdHIyLmNvbXBhcmVUbyhzdHIpOwotCQkJCQlpZiAoY21wMiAhPSAwKSB7Ci0JCQkJCQkKLQkJCQkJCS8vIHRoaXMgaXMgd3JvbmcsIHdpbGwgcHV0IHRoZSBlbnRyeSB0byB0aGUgcHJldmlvdXMgaXRlbQotLy8JCQkJCQlpZiAoY21wMiA+IDApIHsKLS8vCQkJCQkJCWluZGV4ID0gaTsKLS8vCQkJCQkJfSBlbHNlIHsKLS8vCQkJCQkJCWluZGV4ID0gaSAtIDE7Ci0vLwkJCQkJCX0KLQkJCQkJCWlmIChjbXAyIDwgMCkgewotCQkJCQkJCWluZGV4ID0gaTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiB0bXBLOwotCQkJCQl9Ci0JCQkJfQotCQkJCWkrKzsKLQkJCX0KLQotCQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkJaW5kZXggPSBrZXlXb3Jkcy5zaXplKCk7Ci0JCQl9Ci0JCQlrZXlXb3Jkcy5pbnNlcnRFbGVtZW50QXQobmV3S2V5V29yZDIsIGluZGV4KTsKLQkJCQotCQkJcmV0dXJuIG5ld0tleVdvcmQyOwotCi0JCX0KLQl9Ci0KLQl2b2lkIHJlYWRTcGVjS2V5V29yZHMoU3RyaW5nVG9rZW5pemVyIHBhcnNlcikgewotCQl3aGlsZSAocGFyc2VyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHNwZWNLZXlXb3JkU3RyaW5nID0gcGFyc2VyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCVN0cmluZyByZWxhdGVkS2V5V29yZCA9IHBhcnNlci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlLZXlXb3JkRGVmIHNwZWNLZXlEZWYgPSBuZXcgS2V5V29yZERlZihzcGVjS2V5V29yZFN0cmluZyk7Ci0JCQlLZXlXb3JkRGVmIHJlbGF0ZWRLZXlEZWYgPSBuZXcgS2V5V29yZERlZihyZWxhdGVkS2V5V29yZCk7Ci0KLQkJCXNwZWNLZXlXb3JkU3RyaW5nID0gc3BlY0tleURlZi50b1N0cmluZygpOwotCQkJcmVsYXRlZEtleVdvcmQgPSByZWxhdGVkS2V5V29yZC50b1N0cmluZygpOwotCi0JCQlpZiAoc3BlY0tleVdvcmRTdHJpbmcgIT0gbnVsbCAmJiByZWxhdGVkS2V5V29yZCAhPSBudWxsCi0JCQkJCSYmIHJlbGF0ZWRLZXlXb3JkRXhpc3RzKHNwZWNLZXlXb3JkU3RyaW5nLCByZWxhdGVkS2V5V29yZCkpIHsKLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJaW50IGkgPSAwOwotCQkJCVN0cmluZyBmaXJzdEtleVdvcmQgPSBzcGVjS2V5V29yZFN0cmluZzsKLQkJCQlpbnQgcG9zID0gc3BlY0tleVdvcmRTdHJpbmcuaW5kZXhPZigKLQkJCQkJCUtleVdvcmRJbmRleEhlbHBlci5kZWZPYmoubGV2ZWxTZXBhcmF0b3JSZXBsYWNlLCAwKTsKLQkJCQlpZiAocG9zICE9IC0xKSB7Ci0JCQkJCWZpcnN0S2V5V29yZCA9IHNwZWNLZXlXb3JkU3RyaW5nLnN1YnN0cmluZygwLCBwb3MpOwotCQkJCX0KLQkJCQlJTy5wcmludERlYnVnKCJmaXJzdEtleVdvcmQgIiArIGZpcnN0S2V5V29yZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl3aGlsZSAoIWZvdW5kICYmIGkgPCBrZXlXb3Jkcy5zaXplKCkpIHsKLQkJCQkJSU8ucHJpbnREZWJ1ZygiaG9sZGVyIGluIGZpcnN0IHdoaWxlICIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlLZXlXb3JkIHRtcEsgPSAoS2V5V29yZCkga2V5V29yZHMuZWxlbWVudEF0KGkpOwotCQkJCQlpZiAoZmlyc3RLZXlXb3JkLmVxdWFscyh0bXBLLmdldEtleVdvcmQoKSkpIHsKLQotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJaWYgKHBvcyAhPSAtMSkgewotCQkJCQkJCXRtcEsuaW5zZXJ0U3BlY0tleVdvcmQoc3BlY0tleVdvcmRTdHJpbmcKLQkJCQkJCQkJCS5zdWJzdHJpbmcocG9zICsgMSksIHJlbGF0ZWRLZXlXb3JkKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdG1wSy5zZXRTcGVjS2V5V29yZChyZWxhdGVkS2V5V29yZCwgZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQkJaWYgKCFmb3VuZCkgewotCQkJCQlJTy5wcmludERlYnVnKCIhZm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpbnQgaW5kZXggPSAtMTsKLQkJCQkJaSA9IDA7Ci0JCQkJCUtleVdvcmQgbmV3S2V5V29yZDIgPSBuZXcgS2V5V29yZChzcGVjS2V5RGVmKTsKLQkJCQkJaWYgKHBvcyA9PSAtMSkgewotCQkJCQkJbmV3S2V5V29yZDIuc2V0U3BlY0tleVdvcmQocmVsYXRlZEtleVdvcmQsIHRydWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbmV3S2V5V29yZDIuaW5zZXJ0U3BlY0tleVdvcmQoc3BlY0tleVdvcmRTdHJpbmcKLQkJCQkJCQkJLnN1YnN0cmluZyhwb3MgKyAxKSwgcmVsYXRlZEtleVdvcmQpOwotCQkJCQl9Ci0JCQkJCXdoaWxlIChpbmRleCA9PSAtMSAmJiBpIDwga2V5V29yZHMuc2l6ZSgpKSB7Ci0JCQkJCQlJTy5wcmludERlYnVnKCJob2xkZXIgaW4gc2Vjb25kIHdoaWxlICIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJS2V5V29yZCB0bXBLID0gKEtleVdvcmQpIGtleVdvcmRzLmVsZW1lbnRBdChpKTsKLQkJCQkJCWlmIChuZXdLZXlXb3JkMi5nZXRLZXlXb3JkKCkudG9VcHBlckNhc2UoKS5jb21wYXJlVG8oCi0JCQkJCQkJCXRtcEsuZ2V0S2V5V29yZCgpLnRvVXBwZXJDYXNlKCkpIDwgMCkgewotCQkJCQkJCWluZGV4ID0gaTsKLQkJCQkJCX0gZWxzZSBpZiAobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLnRvVXBwZXJDYXNlKCkKLQkJCQkJCQkJLmNvbXBhcmVUbyh0bXBLLmdldEtleVdvcmQoKS50b1VwcGVyQ2FzZSgpKSA9PSAwKSB7Ci0KLQkJCQkJCQlpZiAobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLmNvbXBhcmVUbygKLQkJCQkJCQkJCXRtcEsuZ2V0S2V5V29yZCgpKSAhPSAwKSB7Ci0JCQkJCQkJCWlmIChuZXdLZXlXb3JkMi5nZXRLZXlXb3JkKCkuY29tcGFyZVRvKAotCQkJCQkJCQkJCXRtcEsuZ2V0S2V5V29yZCgpKSA+IDApIHsKLQkJCQkJCQkJCWluZGV4ID0gaTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWluZGV4ID0gaSAtIDE7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpKys7Ci0JCQkJCX0KLQotCQkJCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQkJCWtleVdvcmRzLmluc2VydEVsZW1lbnRBdChuZXdLZXlXb3JkMiwgaW5kZXgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJa2V5V29yZHMuaW5zZXJ0RWxlbWVudEF0KG5ld0tleVdvcmQyLCBrZXlXb3Jkcy5zaXplKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHJlbGF0ZWRLZXlXb3JkRXhpc3RzKFN0cmluZyBzcGVjS2V5V29yZFN0cmluZywKLQkJCVN0cmluZyByZWxhdGVkS2V5V29yZCkgewotCQlpZiAoa2V5V29yZHMgIT0gbnVsbCkgewotCQkJaW50IGkgPSAwOwotCi0JCQl3aGlsZSAoaSA8IGtleVdvcmRzLnNpemUoKSkgewotCQkJCUtleVdvcmQgdG1wSyA9IChLZXlXb3JkKSBrZXlXb3Jkcy5lbGVtZW50QXQoaSk7Ci0JCQkJaWYgKHRtcEsuZ2V0S2V5V29yZCgpLmVxdWFscyhyZWxhdGVkS2V5V29yZCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWkrKzsKLQkJCX0KLQkJfQotCQlTeXN0ZW0uZXJyLnByaW50bG4ocmVsYXRlZEtleVdvcmQKLQkJCQkrIEhlbHBNZXNzYWdlcy5SRUxBVEVEX0tFWVdPUkRfTk9UX0ZPVU5EICsgc3BlY0tleVdvcmRTdHJpbmcpOwotCQlyZXR1cm4gZmFsc2U7Ci0KLQl9Ci0KLQl2b2lkIHByaW50KCkgewotCi0JCWlmIChLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEluZGV4UmVzdWx0RmlsZSgpICE9IG51bGwpIHsKLQkJCXByaW50RnJhbWVzZXQoKTsKLQkJCXByaW50SW5kZXgoKTsKLQkJfQotCQlwcmludEtleVdvcmRzKCk7Ci0JfQotCi0JLy8gUHJpbnRzIHRoZSBodG1sZmlsZSBjb250YWluaW5nIHRoZSBmcmFtZXNldAotCXByaXZhdGUgdm9pZCBwcmludEZyYW1lc2V0KCkgewotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRXd3dSb290KCkKLQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldE1haW5SZXN1bHRGaWxlKCkpOwotCQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQkJZmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQkJZmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCQl9Ci0KLQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRQOwotCQkJaWYgKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0Q2hhcmFjdGVyU2V0KCkgIT0gbnVsbCkgewotCQkJCW91dFAgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpLAotCQkJCQkJS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRDaGFyYWN0ZXJTZXQoKSk7Ci0JCQl9IGVsc2UgewotCQkJCW91dFAgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpKTsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihIZWxwTWVzc2FnZXMuV1JJVEVfRklMRQotCQkJCQkrIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0V3d3Um9vdCgpCi0JCQkJCSsgIiIgKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldE1haW5SZXN1bHRGaWxlKCkpOyAvLyROT04tTkxTLTEkCi0JCQlNaXNjU3RhdGljLnByaW50KG91dFAsICI8SFRNTD5cbiIpOyAvLyROT04tTkxTLTEkCi0JCQlNaXNjU3RhdGljLnByaW50KG91dFAsICI8aGVhZD5cbiIpOyAvLyROT04tTkxTLTEkCi0JCQlNaXNjU3RhdGljCi0JCQkJCS5wcmludChvdXRQLAotCQkJCQkJCSI8TUVUQSBodHRwLWVxdWl2PVwiQ29udGVudC1UeXBlXCIgY29udGVudD1cInRleHQvaHRtbDsgY2hhcnNldD11dGYtOFwiPlxuIik7IC8vJE5PTi1OTFMtMSQgICAgICAgICAgCi0JCQlNaXNjU3RhdGljCi0JCQkJCS5wcmludCgKLQkJCQkJCQlvdXRQLAotCQkJCQkJCSI8dGl0bGU+IiArIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0SW5kZXhUaXRsZSgpICsgIjwvdGl0bGU+XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlNaXNjU3RhdGljLnByaW50KG91dFAsICI8L2hlYWQ+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZSBrZXlXb3Jkc0ZpbGUgPSBuZXcgRmlsZShLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldFd3d1Jvb3QoKQotCQkJCQkrIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0S2V5d29yZFJlc3VsdEZpbGUoKSk7Ci0JCQlTdHJpbmcga2V5V29yZFBhdGggPSBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldFJlbGF0aXZlUGF0aCgpCi0JCQkJCSsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRLZXl3b3JkUmVzdWx0RmlsZSgpOwotCi0JCQlGaWxlIGluZHhlRmlsZSA9IG5ldyBGaWxlKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0V3d3Um9vdCgpCi0JCQkJCSsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRJbmRleFJlc3VsdEZpbGUoKSk7Ci0JCQlTdHJpbmcgaW5kZXhQYXRoID0gS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRSZWxhdGl2ZVBhdGgoKQotCQkJCQkrIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0SW5kZXhSZXN1bHRGaWxlKCk7Ci0JCQlNaXNjU3RhdGljCi0JCQkJCS5wcmludCgKLQkJCQkJCQlvdXRQLAotCQkJCQkJCSI8ZnJhbWVzZXQgcm93cz1cIiIgKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEluZGV4SGVpZ2h0KCkgKyAiLCpcIj5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJTWlzY1N0YXRpYwotCQkJCQkucHJpbnQoCi0JCQkJCQkJb3V0UCwKLQkJCQkJCQkiPGZyYW1lIG5hbWU9XCIiICsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRJbmRleFRhcmdldCgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSsgIlwiIHRpdGxlPVwiTmF2aWdhdGlvbiBiYXJcIiBzcmM9XCIiICsgaW5kZXhQYXRoIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSsgIlwiIG1hcmdpbmhlaWdodD1cIjJcIiBtYXJnaW53aWR0aD1cIjJcIiBzY3JvbGxpbmc9XCJhdXRvXCI+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJTWlzY1N0YXRpYwotCQkJCQkucHJpbnQoCi0JCQkJCQkJb3V0UCwKLQkJCQkJCQkiPGZyYW1lIG5hbWU9XCIiICsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRLZXlXb3JkVGFyZ2V0KCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJKyAiXCIgdGl0bGU9XCJDb250ZW50c1wiIHNyYz1cIiIgKyBrZXlXb3JkUGF0aCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkrICJcIiBtYXJnaW5oZWlnaHQ9XCIwXCIgbWFyZ2lud2lkdGg9XCIyXCIgc2Nyb2xsaW5nPVwiYXV0b1wiPlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCU1pc2NTdGF0aWMucHJpbnQob3V0UCwgIjwvZnJhbWVzZXQ+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPC9IVE1MPiIpOyAvLyROT04tTkxTLTEkCi0JCQlvdXRQLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyCi0JCQkJCS5wcmludGxuKCJLZXlXb3JkSG9sZGVyOnByaW50RnJhbWVzZXRcbiIgKyBIZWxwTWVzc2FnZXMuRVhDRVBUSU9OICsgZS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLy8gUHJpbnRzIHRoZSBodG1sIGZpbGUgd2l0aCB0aGUgc2hvcnRjdXRzIHRvIGVhY2ggYW5jaG9yIGluIHRoZSBrZXl3b3JkZmlsZQotCXByaXZhdGUgdm9pZCBwcmludEluZGV4KCkgewotCQl0cnkgewotCi0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldFd3d1Jvb3QoKQotCQkJCQkrIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0SW5kZXhSZXN1bHRGaWxlKCkpOwotCQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQkJZmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQkJZmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCQl9Ci0KLQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRQOwotCQkJaWYgKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0Q2hhcmFjdGVyU2V0KCkgIT0gbnVsbCkgewotCQkJCW91dFAgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpLAotCQkJCQkJS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRDaGFyYWN0ZXJTZXQoKSk7Ci0JCQl9IGVsc2UgewotCQkJCW91dFAgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpKTsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihIZWxwTWVzc2FnZXMuV1JJVEVfRklMRQotCQkJCQkrIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0V3d3Um9vdCgpCi0JCQkJCSsgIiIgKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEluZGV4UmVzdWx0RmlsZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlNaXNjU3RhdGljLnByaW50KG91dFAsICI8SFRNTD5cbiIpOyAvLyROT04tTkxTLTEkCi0JCQlNaXNjU3RhdGljLnByaW50KG91dFAsICI8aGVhZD5cbiIpOyAvLyROT04tTkxTLTEkCi0JCQlNaXNjU3RhdGljCi0JCQkJCS5wcmludChvdXRQLAotCQkJCQkJCSI8TUVUQSBodHRwLWVxdWl2PVwiQ29udGVudC1UeXBlXCIgY29udGVudD1cInRleHQvaHRtbDsgY2hhcnNldD11dGYtOFwiPlxuIik7IC8vJE5PTi1OTFMtMSQgICAgICAgICAgCi0JCQlNaXNjU3RhdGljLnByaW50KG91dFAsICI8L2hlYWQ+PEJPRFk+XG4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlTdHJpbmcgYmVnaW5DaGFyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChrZXlXb3JkcyAhPSBudWxsKSB7Ci0JCQkJRmlsZSBrZXlXb3Jkc0ZpbGUgPSBuZXcgRmlsZShLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqCi0JCQkJCQkuZ2V0V3d3Um9vdCgpCi0JCQkJCQkrIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0S2V5d29yZFJlc3VsdEZpbGUoKSk7Ci0JCQkJU3RyaW5nIHBhdGggPSBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldFJlbGF0aXZlUGF0aCgpCi0JCQkJCQkrIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0S2V5d29yZFJlc3VsdEZpbGUoKTsKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwga2V5V29yZHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJS2V5V29yZCB0bXAgPSAoS2V5V29yZCkga2V5V29yZHMuZWxlbWVudEF0KGkpOwotCQkJCQlTdHJpbmcgZmlyc3RMID0gdG1wLmdldEtleVdvcmQoKS5zdWJzdHJpbmcoMCwgMSkKLQkJCQkJCQkudG9VcHBlckNhc2UoKTsKLQotCQkJCQlpZiAoZmlyc3RMLmNvbXBhcmVUbyhiZWdpbkNoYXIpICE9IDApIHsKLQkJCQkJCWJlZ2luQ2hhciA9IGZpcnN0TDsKLQkJCQkJCU1pc2NTdGF0aWMucHJpbnQob3V0UCwgIjxBIEhSRUY9XCIiICsgcGF0aCArICIjIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJTWlzY1N0YXRpYy5wcmludChvdXRQLCBiZWdpbkNoYXIpOwotCQkJCQkJTWlzY1N0YXRpYwotCQkJCQkJCQkucHJpbnQoCi0JCQkJCQkJCQkJb3V0UCwKLQkJCQkJCQkJCQkiXCIgVEFSR0VUPVwiIiArIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0S2V5V29yZFRhcmdldCgpICsgIlwiPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCU1pc2NTdGF0aWMucHJpbnQob3V0UCwgYmVnaW5DaGFyKTsKLQkJCQkJCU1pc2NTdGF0aWMucHJpbnQob3V0UCwgIjwvQT5cbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlNaXNjU3RhdGljLnByaW50KG91dFAsICI8L0JPRFk+PC9IVE1MPiIpOyAvLyROT04tTkxTLTEkCi0JCQlvdXRQLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyCi0JCQkJCS5wcmludGxuKCJLZXlXb3JkSG9sZGVyOnByaW50SW5kZXhcbiIgKyBIZWxwTWVzc2FnZXMuRVhDRVBUSU9OICsgZS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLy8gUHJpbnRzIHRoZSBrZXl3b3JkZmlsZQotCXByaXZhdGUgdm9pZCBwcmludEtleVdvcmRzKCkgewotCi0JCXRyeSB7Ci0JCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UDsKLQotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRXd3dSb290KCkKLQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEtleXdvcmRSZXN1bHRGaWxlKCkpOwotCQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQkJZmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQkJZmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCQl9Ci0KLQkJCWlmIChLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldENoYXJhY3RlclNldCgpICE9IG51bGwpIHsKLQkJCQlvdXRQID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKSwKLQkJCQkJCUtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0Q2hhcmFjdGVyU2V0KCkpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRQID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKSk7Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oSGVscE1lc3NhZ2VzLldSSVRFX0ZJTEUKLQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldFd3d1Jvb3QoKSArICIiICsgLy8kTk9OLU5MUy0xJAotCQkJCQlLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEtleXdvcmRSZXN1bHRGaWxlKCkpOwotCQkJU3RyaW5nIGhlYWRlckZpbGUgPSBNaXNjU3RhdGljLmxvYWRGaWxlKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmoKLQkJCQkJLmdldEhlYWRlckZpbGUoKSwgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iagotCQkJCQkuZ2V0Q2hhcmFjdGVyU2V0KCkpOwotCQkJaWYgKGhlYWRlckZpbGUuZXF1YWxzSWdub3JlQ2FzZShEZWYuTm9uZSkpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oSGVscE1lc3NhZ2VzLklOQ09SUkVDVF9IRUFERVJGSUxFCi0JCQkJCQkrIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0SGVhZGVyRmlsZSgpKTsKLQkJCX0KLQkJCU1pc2NTdGF0aWMucHJpbnQob3V0UCwgaGVhZGVyRmlsZSk7Ci0KLQkJCVN0cmluZyBiZWdpbkNoYXIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGtleVdvcmRzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGtleVdvcmRzLnNpemUoKTsgaSsrKSB7Ci0KLQkJCQkJS2V5V29yZCB0bXAgPSAoS2V5V29yZCkga2V5V29yZHMuZWxlbWVudEF0KGkpOwotCQkJCQlTdHJpbmcgZmlyc3RMID0gdG1wLmdldEtleVdvcmQoKS5zdWJzdHJpbmcoMCwgMSkKLQkJCQkJCQkudG9VcHBlckNhc2UoKTsKLQotCQkJCQlpZiAoZmlyc3RMLmNvbXBhcmVUbyhiZWdpbkNoYXIpICE9IDApIHsKLQkJCQkJCWJlZ2luQ2hhciA9IGZpcnN0TDsKLQkJCQkJCUZvbnRPYmplY3QgZnMgPSBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqCi0JCQkJCQkJCS5nZXRTdHlsZVNoZWV0KERlZi5IZWFkTGluZVN0eWxlKTsKLQkJCQkJCWlmIChmcyA9PSBudWxsKSB7Ci0JCQkJCQkJZnMgPSBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqCi0JCQkJCQkJCQkuZ2V0U3R5bGVTaGVldChEZWYuRGVmYXVsdFN0eWxlKTsKLQkJCQkJCX0KLQkJCQkJCUZvbnRPYmplY3QgZiA9IG51bGw7Ci0JCQkJCQlGb250T2JqZWN0IGZyID0gZnM7Ci0JCQkJCQlpZiAoZnMgPT0gbnVsbCkgewotCQkJCQkJCWYgPSBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqCi0JCQkJCQkJCQkuZ2V0Rm9udChEZWYuSGVhZExpbmVGb250KTsKLQkJCQkJCQlpZiAoZiA9PSBudWxsKSB7Ci0JCQkJCQkJCWYgPSBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqCi0JCQkJCQkJCQkJLmdldEZvbnQoRGVmLkRlZmF1bHRGb250KTsKLQkJCQkJCQl9Ci0JCQkJCQkJZnIgPSBmOwotCQkJCQkJfQotCQkJCQkJS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5wcmludFN0YXJ0KG91dFAsIGZyKTsKLQkJCQkJCWlmIChmcyA9PSBudWxsKSB7Ci0JCQkJCQkJTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPEJSPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlNaXNjU3RhdGljCi0JCQkJCQkJCS5wcmludCgKLQkJCQkJCQkJCQlvdXRQLAotCQkJCQkJCQkJCSI8QSBOQU1FPVwiIiArIGJlZ2luQ2hhciArICJcIj4iICsgYmVnaW5DaGFyICsgIjwvQT4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCWlmIChmcyA9PSBudWxsKSB7Ci0JCQkJCQkJTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPEJSPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLnByaW50RW5kKG91dFAsIGZyKTsKLQkJCQkJfQotCQkJCQl0bXAucHJpbnQob3V0UCwgMCk7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIGZvb3RlckZpbGUgPSBNaXNjU3RhdGljLmxvYWRGaWxlKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmoKLQkJCQkJLmdldEZvb3RlckZpbGUoKSwgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iagotCQkJCQkuZ2V0Q2hhcmFjdGVyU2V0KCkpOwotCQkJaWYgKGZvb3RlckZpbGUuZXF1YWxzSWdub3JlQ2FzZShEZWYuTm9uZSkpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oSGVscE1lc3NhZ2VzLklOQ09SUkVDVF9GT09URVJGSUxFCi0JCQkJCQkrIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0Rm9vdGVyRmlsZSgpKTsKLQkJCX0KLQkJCU1pc2NTdGF0aWMucHJpbnQob3V0UCwgZm9vdGVyRmlsZSk7Ci0JCQlvdXRQLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyCi0JCQkJCS5wcmludGxuKCJLZXlXb3JkSG9sZGVyOnByaW50S2V5V29yZHNcbiIgKyBIZWxwTWVzc2FnZXMuRVhDRVBUSU9OICsgZS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkSW5kZXguamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRJbmRleC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZTYyMTkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRJbmRleC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLS8vIERlYnVnLi8vIGltcG9ydCBqYXZheC5zd2luZy4qOwotCi1jbGFzcyBLZXlXb3JkSW5kZXgKLXsKLS8vIHByaXZhdGUgc3RhdGljIEtleVdvcmRIb2xkZXIgaG9sZGVyID0gbmV3IEtleVdvcmRIb2xkZXIoKTsKLQotCi0vLyAgcHJpdmF0ZSBzdGF0aWMgRGVmaW5pdGlvbk9iamVjdCBkZWZPYmo9bnVsbDsKLS8vICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmZmlsZSA9IG51bGw7Ci0vLyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoYXJTZXQgPSBudWxsOyAKLS8vICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgaGVscEZpbGUgPSBudWxsOwotLy8gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2hvd1VzYWdlID0gZmFsc2U7Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRJbmRleEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZEluZGV4RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM5YjQzMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZEluZGV4RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotLyoqCi0gKgotICogVGhpcyBleGNlcHRpb24gaXMgdXNlZCBieSBhbGwgY2xhc3NlcyB0aGF0IGFyZSBpbnZvbHZlZCB3aXRoIHRoZSBrZXl3b3JkaW5kZXgKLSAqCi0gKi8KLQotCi1jbGFzcyBLZXlXb3JkSW5kZXhFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIHJlYXNvbjsKLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIENsYXNzIENvbnN0cnVjdG9yLgotCUtleVdvcmRJbmRleEV4Y2VwdGlvbihTdHJpbmcgZXhjZXB0aW9uTmFtZSwgU3RyaW5nIGV4Y2VwdGlvblJlYXNvbikKLQl7Ci0JCXN1cGVyKCBleGNlcHRpb25SZWFzb24gKTsKLQkJbmFtZQk9IGV4Y2VwdGlvbk5hbWU7Ci0JCXJlYXNvbgk9IGV4Y2VwdGlvblJlYXNvbjsKLQl9Ci0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGV4Y2VwdGlvbi4KLQlTdHJpbmcgZ2V0RXhjZXB0aW9uTmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBSZXR1cm4gdGhlIHJlYXNvbiBmb3IgdGhlIGV4Y2VwdGlvbi4KLQlTdHJpbmcgZ2V0RXhjZXB0aW9uUmVhc29uKCkKLQl7Ci0JCXJldHVybiByZWFzb247Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQotCQlyZXR1cm4gbmFtZSArICI6IiArIHJlYXNvbjsgLy8kTk9OLU5MUy0xJAotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZEluZGV4SGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkSW5kZXhIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTQ5YjU3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkSW5kZXhIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLXB1YmxpYyBjbGFzcyBLZXlXb3JkSW5kZXhIZWxwZXIgewotCUtleVdvcmRIb2xkZXIgaG9sZGVyID0gbmV3IEtleVdvcmRIb2xkZXIoKTsKLQotCXN0YXRpYyBEZWZpbml0aW9uT2JqZWN0IGRlZk9iaiA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmZmlsZSA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2hhclNldCA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgaGVscEZpbGUgPSBudWxsOwotCi0JLy8gQ29uc3RydWN0b3IKLQlLZXlXb3JkSW5kZXhIZWxwZXIoKSB7Ci0KLQkJZGVmZmlsZSA9IG51bGw7Ci0JCS8vIGRvIG5vdGhpbmcKLQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHBEZWZmaWxlCi0JICogQHBhcmFtIHBDaGFyU2V0Ci0JICogQHBhcmFtIHBIZWxwRmlsZQotCSAqLwotCXB1YmxpYyBLZXlXb3JkSW5kZXhIZWxwZXIoU3RyaW5nIHBEZWZmaWxlLCBTdHJpbmcgcENoYXJTZXQsIFN0cmluZyBwSGVscEZpbGUpIHsKLQkJZGVmZmlsZSA9IHBEZWZmaWxlOwotCQljaGFyU2V0ID0gcENoYXJTZXQ7Ci0JCWhlbHBGaWxlID0gcEhlbHBGaWxlOwotCX0KLQotCXZvaWQgc2V0RGVmZmlsZShTdHJpbmcgcEZpbGUpIHsKLQotCQlkZWZmaWxlID0gcEZpbGU7Ci0KLQl9Ci0KLQl2b2lkIHNldENoYXJTZXQoU3RyaW5nIHBDaGFyU2V0KSB7Ci0KLQkJY2hhclNldCA9IHBDaGFyU2V0OwotCi0JfQotCi0Jdm9pZCBzZXRIZWxwRmlsZShTdHJpbmcgcEhlbHBGaWxlKSB7Ci0KLQkJaGVscEZpbGUgPSBwSGVscEZpbGU7Ci0KLQl9Ci0KLQkvKioKLQkgKiBsb2FkIHRoZSBkZWZpbml0aW9uIG9iamVjdCAKLQkgKiAKLQkgKiBAcGFyYW0gcHViRGlyIFN0cmluZwotCSAqIEByZXR1cm4gRGVmaW5pdGlvbk9iamVjdAotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIERlZmluaXRpb25PYmplY3QgbG9hZERlZmluaXRpb24oU3RyaW5nIHB1YkRpcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChkZWZmaWxlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBLZXlXb3JkSW5kZXhFeGNlcHRpb24oCi0JCQkJCSJLZXlXb3JkSW5kZXhIZWxwZXI6ZXhlY3V0ZSgpIiwgU3RyaW5nRGVmaW5pdGlvbnMuRVJST1JfREVGSU5JVElPTl9GSUxFX05PVF9GT1VORCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChoZWxwRmlsZSAhPSBudWxsKSB7Ci0JCQlIZWxwTWVzc2FnZXMubG9hZEhlbHBNZXNzYWdlcyhoZWxwRmlsZSwgY2hhclNldCk7Ci0JCX0KLQotCQlkZWZPYmogPSBuZXcgRGVmaW5pdGlvbk9iamVjdChwdWJEaXIsIGRlZmZpbGUsIGNoYXJTZXQpOwotCi0JCXJldHVybiBkZWZPYmo7Ci0JfQotCi0JLyoqCi0JICogZXhlY3V0ZSB0aGUga2V5d29yZCBpbmRleCBnZW5lcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIEtleVdvcmRJbmRleEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgS2V5V29yZEluZGV4RXhjZXB0aW9uIHsKLQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIENoZWNrIGlmIGVub3VnaCBpbnB1dCBpbiBkZWZpbml0aW9uZmlsZQotCQlpZiAoZGVmT2JqLmVub3VnaElucHV0KCkpIHsKLQkJCUZpbGUgdG9wRGlyID0gbmV3IEZpbGUoZGVmT2JqLmdldFd3d1Jvb3QoKSk7Ci0KLQkJCS8vIFRoZSB3d3dSb290IGhhdmUgdG8gYmUgYSBkaXJlY3RvcnkKLQkJCWlmICh0b3BEaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihIZWxwTWVzc2FnZXMuUEFSU0VfRElSRUNUT1JZCi0JCQkJCQkrIGRlZk9iai5nZXRXd3dSb290KCkpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihIZWxwTWVzc2FnZXMuVEFLRV9BX1dISUxFKTsKLQkJCQlyZWFkRGlyKHRvcERpciwgbW9uaXRvcik7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBLZXlXb3JkSW5kZXhFeGNlcHRpb24oCi0JCQkJCQkiS2V5V29yZEluZGV4SGVscGVyOmV4ZWN1dGUoKSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCURlZi5TdGFydERpcgotCQkJCQkJCQkrICI6ICIgKyBkZWZPYmouZ2V0V3d3Um9vdCgpICsgSGVscE1lc3NhZ2VzLk5PX0RJUkVDVE9SWSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBTcGxpdHMgYW5kIHNvcnRzIHRoZSBrZXl3b3JkcwotCQkJaG9sZGVyLmRpdmlkZSgpOwotCi0JCQlTdHJpbmcgc3BlY0tleVdvcmRzRmlsZSA9IGRlZk9iai5nZXRLZXlXb3JkRmlsZSgpOwotCQkJaWYgKHNwZWNLZXlXb3Jkc0ZpbGUgIT0gbnVsbCkgewotCQkJCS8vIFJlYWRzIHRoZSBzcGVja2V5d29yZGZpbGUKLQkJCQlTdHJpbmcgc3BlY0tleVdvcmRzID0gTWlzY1N0YXRpYy5sb2FkRmlsZShzcGVjS2V5V29yZHNGaWxlLAotCQkJCQkJZGVmT2JqLmdldENoYXJhY3RlclNldCgpKTsKLQkJCQlpZiAoIXNwZWNLZXlXb3Jkcy5lcXVhbHMoRGVmLk5vbmUpKSB7Ci0JCQkJCVN0cmluZ1Rva2VuaXplciBwYXJzZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNwZWNLZXlXb3JkcywKLQkJCQkJCQkiXHRcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWhvbGRlci5yZWFkU3BlY0tleVdvcmRzKHBhcnNlcik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IEtleVdvcmRJbmRleEV4Y2VwdGlvbigKLQkJCQkJCQkiS2V5V29yZEluZGV4SGVscGVyOmV4ZWN1dGUoKSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlzcGVjS2V5V29yZHNGaWxlCi0JCQkJCQkJCQkrIEhlbHBNZXNzYWdlcy5LRVlXT1JEX0ZJTEVfU1lOVEFYX0VSUk9SKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFByaW50IHRoZSBLZXlXb3JkSW5kZXhIZWxwZXIKLQkJCWhvbGRlci5wcmludCgpOwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IEtleVdvcmRJbmRleEV4Y2VwdGlvbigiS2V5V29yZEluZGV4SGVscGVyOmV4ZWN1dGUoKSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJSGVscE1lc3NhZ2VzLk5PVF9FTk9VR0hfSU5QVVQpOwotCQl9Ci0KLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBSZWN1cnNpdmVseSBwcm9jZXNzIGVhY2ggZGlyZWN0b3J5IGluIHRoZSBkaXJlY3RvcnkgaGVpcmFyY2h5LgotCXByaXZhdGUgdm9pZCByZWFkRGlyKEZpbGUgZmlsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVN0cmluZyBmaWxlc1tdID0gZmlsZS5saXN0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlTdHJpbmcgZmlsZVBhdGggPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotCi0JCQl0cnkgewotCQkJCWZpbGVQYXRoID0gZmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiS2V5V29yZEluZGV4SGVscGVyOnJlYWREaXJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlIZWxwTWVzc2FnZXMuRVhDRVBUSU9OICsgZS50b1N0cmluZygpKTsKLQkJCX0KLQkJCWZpbGVQYXRoID0gZmlsZVBhdGgucmVwbGFjZSgnXFwnLCAnLycpOwotCQkJRmlsZSB0bXAgPSBuZXcgRmlsZShmaWxlUGF0aCArICIvIiArIGZpbGVzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlpZiAodG1wLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkvLyBJZiB0aGUgZmlsZSBpcyBhIGRpcmVjdG9yeQotCQkJCVN0cmluZyB0bXBQYXRoID0gdG1wLmdldEFic29sdXRlUGF0aCgpOwotCQkJCXRyeSB7Ci0JCQkJCXRtcFBhdGggPSB0bXAuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiS2V5V29yZEluZGV4SGVscGVyOnJlYWREaXJcbiIgKyBIZWxwTWVzc2FnZXMuRVhDRVBUSU9OICsgZS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQkvLyBPbiBwYyB0aGUgc2VwYXJhdG9yIG1heSBiZSBcIGFuZCBub3QgLwotCQkJCXRtcFBhdGggPSB0bXBQYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJCQlpZiAoIWRlZk9iai5pc0luU3RvcGRpcih0bXBQYXRoKSkgewotCQkJCQkvLyBJZiBub3QgaW4gc3RvcGRpcgotCQkJCQlyZWFkRGlyKHRtcCwgbW9uaXRvcik7Ci0JCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQl9IGVsc2UgewotCQkJCQl0cnkgewotCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oSGVscE1lc3NhZ2VzLkRJUkVDVE9SWV9OT1RfUEFSU0VECi0JCQkJCQkJCSsgdG1wLmdldENhbm9uaWNhbFBhdGgoKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJLZXlXb3JkSW5kZXhIZWxwZXI6cmVhZERpclxuIiArIEhlbHBNZXNzYWdlcy5FWENFUFRJT04gKyBlLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJCS8vIFBhcnNlIGFsbCB0aGUgZmlsZXMgd2hpY2ggaGF2ZSBvbmUgb2YgdGhlIGV4dGVuc2lvbnMgd2UgYXJlCi0JCQkvLyBpbnRlcmVzdGVkIGluLgotCQkJZWxzZSBpZiAoZmlsZXNbaV0uZW5kc1dpdGgoIi5odG0iKSB8fCBmaWxlc1tpXS5lbmRzV2l0aCgiLmh0bWwiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfHwgZmlsZXNbaV0uZW5kc1dpdGgoIi5zaHRtbCIpIHx8IGZpbGVzW2ldLmVuZHNXaXRoKCIuc2h0bSIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXsKLQkJCQlsb2FkRmlsZShmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIi8iICsgZmlsZXNbaV0pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJfQotCX0KLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIFBhcnNlIGVhY2ggb2YgdGhlIGZvdW5kIGZpbGVzIGFuZCBleHRyYWN0IHRoZSBrZXl3b3JkcyBmcm9tIHRoZW0uCi0JcHJpdmF0ZSB2b2lkIGxvYWRGaWxlKFN0cmluZyBmaWxlTmFtZSkgewotCQlTdHJpbmcgaHRtbEZpbGUgPSBNaXNjU3RhdGljLmxvYWRGaWxlKGZpbGVOYW1lLCBkZWZPYmoKLQkJCQkuZ2V0Q2hhcmFjdGVyU2V0KCkpOwotCQlpZiAoaHRtbEZpbGUgIT0gbnVsbCAmJiBodG1sRmlsZS5sZW5ndGgoKSA+IDApIAotCQl7Ci0JCQlMaXN0IGtleVdvcmQgPSBLZXlXb3JkU3RhdGljLmdldEtleVdvcmRzKGh0bWxGaWxlKTsKLQkJCWlmIChrZXlXb3JkICE9IG51bGwgJiYga2V5V29yZC5zaXplKCkgPiAwICkgewotCQkJCUlPLnByaW50RGVidWcoImtleXdvcmQgIiArIGtleVdvcmQpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHRpdGxlID0gTWlzY1N0YXRpYy5nZXRUaXRsZShodG1sRmlsZSk7Ci0KLQkJCQkvLyBBZGRzIGEgZmlsZSB3aXRoIGtleXdvcmRzIHRvIHRoZSBob2xkZXIgb2JqZWN0Ci0JCQkJaG9sZGVyLmFkZChuZXcgS2V5V29yZEZpbGUodGl0bGUsIGRlZk9iai5nZXRSZWxhdGl2ZVBhdGgoKQotCQkJCQkJKyAiIiArIGZpbGVOYW1lLnN1YnN0cmluZyhkZWZPYmouZ2V0V3d3Um9vdExlbmd0aCgpKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJa2V5V29yZCkpOwotCQkJCQotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJrZXl3b3Jkcz0iICsga2V5V29yZC5zaXplKCkgICsgIiBmaWxlOiAiICsgZmlsZU5hbWUpOwotCQkJfQotCQkJCi0JCX0KLQkJCi0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkU3RhdGljLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkU3RhdGljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVkZjVhZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZFN0YXRpYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLQotCi1jbGFzcyBLZXlXb3JkU3RhdGljIHsKLQotCS8vIG5vdGU6IHBhdHRlcm4gd2l0aCBbXj5dIGRvZXMgbm90IG1hdGNoIHdoZW4gdGhlcmUgYXJlIG5vbi1lbmdsaXNoCi0JLy8gY2hhcmFjdGVycywgbWF5YmUgaXQncyBhIGpyZSBidWc/Ci0Jc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9pbmRleF9yZWYgPSBQYXR0ZXJuLmNvbXBpbGUoCi0JCQkiPGFcXHMrPyguKj8pPiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCS8vICI8YVxccys/KFtePl0qPyhuYW1lXFxzKj1cXHMqXCJYRV98Y2xhc3NcXHMqPVxccypcImluZGV4KS4qPyk+IiwKLQkvLyBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGdldCB0aGUga2V5IHdvcmRzIHdpdGgga2V5IGFuZCB0ZXh0IGRlc2NyaXB0aW9uLiBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mCi0JICogaW5kZXggZm9ybWF0OiAxLiBvbGQgZm9ybWF0OiA8YSBuYW1lPSJLRVlfX1RFWFQiIC4uLj4gMi4gbmV3IGZvcm1hdDogPGEKLQkgKiBjbGFzcz0iaW5kZXgiIG5hbWU9ImJvb2ttYXJrIiBrZXk9IktFWSIgdGV4dD0iVEVYVCIgLi4uPiBURVhUIHBhcnQgaXMKLQkgKiBvcHRpb25hbAotCSAqLwotCXN0YXRpYyBMaXN0IGdldEtleVdvcmRzKFN0cmluZyByZWFsU3RyaW5nKSB7Ci0JCWlmIChyZWFsU3RyaW5nID09IG51bGwpIHsKLQkJCVN5c3RlbS5lcnIKLQkJCQkJLnByaW50bG4oIktleVdvcmRTdGF0aWM6Z2V0S2V5V29yZHNcbiIgKyBIZWxwTWVzc2FnZXMuSU5QVVRfUEFSQU1FVEVSX05VTEwpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUxpc3QgYW5jaG9ycyA9IG5ldyBBcnJheUxpc3QoMik7IC8vJE5PTi1OTFMtMSQKLQotCQlNYXRjaGVyIG0gPSBwX2luZGV4X3JlZi5tYXRjaGVyKHJlYWxTdHJpbmcpOwotCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCVN0cmluZyBhdHRyaWJ1dGVzID0gbS5ncm91cCgxKTsKLQkJCWlmIChhdHRyaWJ1dGVzLmxlbmd0aCgpID09IDApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJTWFwIGF0dHJNYXAgPSBSZXNvdXJjZUhlbHBlci5nZXRUYWdBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotCQkJU3RyaW5nIGtleVdvcmQgPSAoU3RyaW5nKSBhdHRyTWFwLmdldChSZXNvdXJjZUhlbHBlci5UQUdfQVRUUl9OQU1FKTsKLQkJCWlmIChrZXlXb3JkID09IG51bGwgfHwga2V5V29yZC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCVN0cmluZyBjbHMgPSAoU3RyaW5nKSBhdHRyTWFwLmdldChSZXNvdXJjZUhlbHBlci5UQUdfQVRUUl9DTEFTUyk7Ci0JCQlTdHJpbmcga2V5ID0gbnVsbDsKLQkJCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJCWlmICgoY2xzICE9IG51bGwpCi0JCQkJCSYmIGNscy5lcXVhbHMoUmVzb3VyY2VIZWxwZXIuVEFHX0FUVFJfVkFMVUVfSU5ERVgpKSB7Ci0JCQkJa2V5ID0gKFN0cmluZykgYXR0ck1hcC5nZXQoUmVzb3VyY2VIZWxwZXIuVEFHX0FUVFJfS0VZKTsKLQkJCQl0ZXh0ID0gKFN0cmluZykgYXR0ck1hcC5nZXQoUmVzb3VyY2VIZWxwZXIuVEFHX0FUVFJfVEVYVCk7Ci0JCQl9Ci0JCQkvLyBUaGUgZ2V0S2V5V29yZFByZWZpeCgpIHJldHVybnMgdGhlIHRhZyB3aGljaCBpcyB1c2VkIHRvIGRlbGltaXQKLQkJCS8vIGtleXdvcmRzLgotCQkJLy8gQ3VycmVudGx5IHRoaXMgdGFnIGlzIFhFIGFuZCBpcyBkZWZpbmVkIGluIGtleXdvcmRjb25maWcudHh0Ci0JCQlpZiAoKGtleSAhPSBudWxsKQotCQkJCQl8fCBrZXlXb3JkLnN0YXJ0c1dpdGgoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iagotCQkJCQkJCS5nZXRLZXlXb3JkUHJlZml4KCkpKSB7Ci0JCQkJYW5jaG9ycy5hZGQobmV3IEtleVdvcmREZWYoa2V5V29yZCwga2V5LCB0ZXh0KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFuY2hvcnM7Ci0KLQl9Ci0KLQlzdGF0aWMgU3RyaW5nIGNvbnZlcnRLZXlXb3JkKFN0cmluZyBrZXlXb3JkKSB7Ci0JCXJldHVybiBjb252ZXJ0S2V5V29yZChrZXlXb3JkLCBudWxsLCBudWxsKTsKLQl9Ci0KLQlzdGF0aWMgU3RyaW5nIGNvbnZlcnRLZXlXb3JkKFN0cmluZyBrZXlXb3JkLCBTdHJpbmcga2V5LCBTdHJpbmcgdGV4dCkgewotCi0JCWlmIChrZXlXb3JkID09IG51bGwpIHsKLQkJCVN5c3RlbS5lcnIKLQkJCQkJLnByaW50bG4oIktleVdvcmRTdGF0aWM6Y29udmVydEtleVdvcmRcbiIgKyBIZWxwTWVzc2FnZXMuSU5QVVRfUEFSQU1FVEVSX05VTEwpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJTy5wcmludERlYnVnKCJjb252ZXJ0S2V5V29yZCAiICsga2V5V29yZCk7IC8vIEVycm9yIGlmIHdlIGdldCBhIGtleXdvcmQKLQkJLy8gdGhhdCBkb2VzIG5vdCBjb250YWluIHRoZQotCQkvLyB0YWcuIC8vJE5PTi1OTFMtMSQKLQkJaWYgKChrZXkgIT0gbnVsbCkgJiYgKGtleS5sZW5ndGgoKSA+IDApKSB7Ci0JCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJCXJldHVybiBrZXk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBrZXkgKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmxldmVsU2VwYXJhdG9yUmVwbGFjZQotCQkJCQkJKyB0ZXh0OwotCQkJfQotCQl9Ci0KLQkJaWYgKCFrZXlXb3JkLnN0YXJ0c1dpdGgoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRLZXlXb3JkUHJlZml4KCkpKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJLZXlXb3JkU3RhdGljOmNvbnZlcnRLZXlXb3JkXG4iICsga2V5V29yZCArIEhlbHBNZXNzYWdlcy5LRVlXT1JEX1NZTlRBWF9FUlJPUiArIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0S2V5V29yZFByZWZpeCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBSZW1vdmUgdGhlIGZpcnN0IHRocmVlIGNoYXJhY3RlcnMgZnJvbSB0aGUga2V5V29yZCAobmFtZWx5IFhFXykuCi0JCVN0cmluZyB0bXBLID0ga2V5V29yZC5zdWJzdHJpbmcoMyk7Ci0JCVN0cmluZyB0bXAgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgaSA9IDA7Ci0JCWludCBwb3MgPSAwOwotCQl3aGlsZSAoaSAhPSAtMSkgewotCQkJLy8gZ2V0S2V5V29yZExldmVsU2VwYXJhdG9yKCkgaXMgaGFyZC1jb2RlZCBhcyBfXwotCQkJaSA9IHRtcEsuaW5kZXhPZihLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqCi0JCQkJCS5nZXRLZXlXb3JkTGV2ZWxTZXBhcmF0b3IoKSwgcG9zKTsKLQkJCWlmIChpICE9IC0xKSB7Ci0JCQkJLy8gSW5zZXJ0IGEgc2VwYXJhdG9yIGJldHdlZW4ga2V5d29yZHMsIHdoaWNoIGluIHRoaXMgY2FzZSBpcwotCQkJCS8vIHRoZSAiOiIKLQkJCQl0bXAgKz0gdG1wSy5zdWJzdHJpbmcocG9zLCBpKTsKLQkJCQl0bXAgKz0gS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5sZXZlbFNlcGFyYXRvclJlcGxhY2U7Ci0JCQkJcG9zID0gaSArIDI7Ci0JCQl9IGVsc2UgewotCQkJCXRtcCArPSB0bXBLLnN1YnN0cmluZyhwb3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0bXAucmVwbGFjZSgnXycsICcgJyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvTWlzY1N0YXRpYy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvTWlzY1N0YXRpYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OGI2NGI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L01pc2NTdGF0aWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWNsYXNzIE1pc2NTdGF0aWMKLXsKLSAgc3RhdGljIEhhc2h0YWJsZSB0d29WYWx1ZUZpbGU9bnVsbDsKLSAgc3RhdGljIFN0cmluZyB0b3BEaXI9bnVsbDsKLSAgc3RhdGljIGludCB0b3BEaXJMPTA7Ci0KLSAgc3RhdGljIGJvb2xlYW4gc3BlY2NoYXJmb3VuZD1mYWxzZTsKLSAgc3RhdGljIGJvb2xlYW4gdG1wc3BlY2NoYXJmb3VuZD1mYWxzZTsKLQotICBzdGF0aWMgbG9uZyBkaWZmOwotCi0gIC8vUmVhZHMgYSBmaWxlIHdoZXJlIGVhY2ggcm93IGNvbnRhaW5zIHR3byB2YWx1ZXMgc2VwYXJhdGVkIHdpdGggXHQgc2lnbgotICAvLyBUaGUgc3ludGF4IG9mIGVhY2ggbGluZSBjYW4gYmUgZWlnaHRlcgotICAvLyB2YWx1ZSAgdmFsdWUKLSAgLy8gb3IKLSAgLy8gInZhbHVlIiAgICAidmFsdWUiCi0gIC8vCi0gIC8vIFRoZSBzeW50YXggbXVzdCBiZSB0aGUgc2FtZSBmb3IgZWFjaCByb3cgaW4gdGhlIGZpbGUuCi0gIHN0YXRpYyBib29sZWFuIHJlYWRUd29WYWx1ZUZpbGUoU3RyaW5nIGZpbGUsIFN0cmluZyBjaGFyYWN0ZXJTZXQpCi0gIHsKLSAgICAgICBJTy5wcmludERlYnVnKCJyZWFkVHdvVmFsdWVGaWxlICIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBpZihmaWxlPT1udWxsKQotICAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTWlzY1N0YXRpYzpyZWFkVHdvVmFsdWVGaWxlIiArIEhlbHBNZXNzYWdlcy5JTlBVVF9QQVJBTUVURVJfTlVMTCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICB9Ci0gICAgICAgSU8ucHJpbnREZWJ1ZygiYmVmb3JlIGxvYWRmaWxlICIgICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgU3RyaW5nIGluZmlsZSA9IGxvYWRGaWxlKGZpbGUsY2hhcmFjdGVyU2V0KTsKLSAgICBJTy5wcmludERlYnVnKCJhZnRlciBsb2FkZmlsZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZighaW5maWxlLmVxdWFscyhEZWYuTm9uZSkpCi0gICAgICB7Ci0gICAgICAgaWYoaW5maWxlLmNoYXJBdCgwKT09JyInKQotICAgICAgIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHBhcnNlciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgIGluZmlsZSwgIlxuIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICB0d29WYWx1ZUZpbGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIHdoaWxlKHBhcnNlci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgIHsKLQotICAgICAgICAgICBTdHJpbmcgbGluZSA9IHBhcnNlci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgaW50IGZpcnN0Rm51dHQgPSBnZXRJbmRleChsaW5lLCJcIiIsMCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgaW50IHNlY29uZEZudXR0ID0gZ2V0SW5kZXgobGluZSwiXCIiLCBmaXJzdEZudXR0KzEpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgaW50IHRoaXJkRm51dHQgPSBnZXRJbmRleChsaW5lLCJcIiIsIHNlY29uZEZudXR0KzEpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIGludCBmb3J0aEZudXR0ID0gZ2V0SW5kZXgobGluZSwiXCIiLCB0aGlyZEZudXR0KzEpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgaWYoZmlyc3RGbnV0dD09LTEgfHwgc2Vjb25kRm51dHQ9PS0xIHx8Ci0gICAgICAgICAgICAgICB0aGlyZEZudXR0PT0tMSB8fCBmb3J0aEZudXR0PT0tMSkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgU3RyaW5nIGRlZiA9IGxpbmUuc3Vic3RyaW5nKGZpcnN0Rm51dHQrMSwgc2Vjb25kRm51dHQpOwotICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGxpbmUuc3Vic3RyaW5nKHRoaXJkRm51dHQrMSwgZm9ydGhGbnV0dCk7Ci0gICAgICAgICAgIHR3b1ZhbHVlRmlsZS5wdXQoZGVmLHRleHQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBTdHJpbmdUb2tlbml6ZXIgcGFyc2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcigKLSAgICAgICAgICAgICAgICAgICAgICAgaW5maWxlLCAiXHRcbiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgIHR3b1ZhbHVlRmlsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgIHdoaWxlKHBhcnNlci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgICB7Ci0gICAgICAgICAgICB0d29WYWx1ZUZpbGUucHV0KHBhcnNlci5uZXh0VG9rZW4oKS50cmltKCkscGFyc2VyLm5leHRUb2tlbigpLnRyaW0oKSk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICB9Ci0gICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy9SZXR1cm5zIHRoZSB0ZXh0IHdpdGhpbiB0aGUgdGl0bGUgdGFncyBpbiB0aGUgaW5wdXQgc3RyaW5nCi0gIHN0YXRpYyBTdHJpbmcgZ2V0VGl0bGUoU3RyaW5nIHJlYWxTdHJpbmcpCi0gIHsKLSAgICAgIGlmKHJlYWxTdHJpbmc9PW51bGwpCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTWlzY1N0YXRpYzpnZXRUaXRsZSIgKyBIZWxwTWVzc2FnZXMuSU5QVVRfUEFSQU1FVEVSX05VTEwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgICBTdHJpbmcgdXBwZXJTdHJpbmcgPSByZWFsU3RyaW5nLnRvVXBwZXJDYXNlKCk7Ci0gICAgIGludCB0aXRsZVN0YXJ0ID0gZ2V0SW5kZXgodXBwZXJTdHJpbmcsICJUSVRMRSIsMCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgaWYodGl0bGVTdGFydCE9LTEpCi0gICAgIHsKLSAgICAgICAgaW50IHRpdGxlU3RhcnRFbmRUID0gZ2V0SW5kZXgodXBwZXJTdHJpbmcsICI+Iix0aXRsZVN0YXJ0KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZih0aXRsZVN0YXJ0RW5kVCE9LTEpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgdGl0bGVFbmQgPSBnZXRJbmRleCh1cHBlclN0cmluZywgIjwvVElUTEUiLHRpdGxlU3RhcnRFbmRUKzEpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYodGl0bGVFbmQhPS0xKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9IHJlYWxTdHJpbmcuc3Vic3RyaW5nKHRpdGxlU3RhcnRFbmRUKzEsdGl0bGVFbmQpLnRyaW0oKTsKLSAgICAgICAgICAgIHJldHVybiB0aXRsZTsKLSAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgIH0KLSAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy9SZXR1cm4gdGhlIGluZGV4IHdpdGhpbiB0aGUgaW5wdXQgc3RyaW5nIHdoZXJlIHRoZSBmaXJzdCBvY2N1cmFuY2Ugb2YgdGhlIHN0aW5nIG1hdGNoCi0gIC8vIHN0YXJ0cy4gU2VhcmNoZXMgZnJvbSB0aGUgaW5kZXggZGVmaW5lZCBieSB0aGUgcGFyYW1ldGVyIHN0YXJ0Ci0gIHN0YXRpYyBpbnQgZ2V0SW5kZXgoU3RyaW5nIHN0ciwgU3RyaW5nIG1hdGNoLCBpbnQgc3RhcnQpCi0gIHsKLSAgICAgaWYoc3RyPT1udWxsKQotICAgICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6Z2V0SW5kZXhcbiIgKyBIZWxwTWVzc2FnZXMuSU5QVVRfUEFSQU1FVEVSX05VTEwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiAtMTsKLSAgICAgfQotCi0gICAgICBpZihtYXRjaD09bnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNjU3RhdGljOmdldEluZGV4XG4iICsgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gLTE7Ci0gICAgIH0KLSAgICAgaW50IGZvdW5kID0gc3RyLmluZGV4T2YobWF0Y2gudG9VcHBlckNhc2UoKSwgc3RhcnQpOwotICAgICBpZihmb3VuZD09LTEpCi0gICAgIHsKLSAgICAgICAgZm91bmQgPSBzdHIuaW5kZXhPZihtYXRjaC50b0xvd2VyQ2FzZSgpLCBzdGFydCk7Ci0gICAgIH0KLQotICAgICBpZihmb3VuZD09LTEpCi0gICAgIHsKLSAgICAgICAgZm91bmQgPSBzdHIuaW5kZXhPZihtYXRjaCwgc3RhcnQpOwotICAgICB9Ci0gICAgIHJldHVybiBmb3VuZDsKLSAgfQotICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgLy8gUHJpbnRzIHRoZSBhIHN0cmluZyB0byBhIERhdGFPdXRwdXRTdHJlYW0KLSAgIHN0YXRpYyBib29sZWFuIHByaW50KE91dHB1dFN0cmVhbVdyaXRlciBvdXRQLCBTdHJpbmcgc3RyKQotICAgewotICAgIGlmKG91dFA9PW51bGwpCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6cHJpbnRcbiIgKyBIZWxwTWVzc2FnZXMuQkFEX09VVFBVVF9TVFJFQU0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgfQotICAgICBpZihzdHI9PW51bGwpCi0gICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNjU3RhdGljOnByaW50XG4iICsgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgIH0KLSAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICBvdXRQLndyaXRlKHN0ciwwLHN0ci5sZW5ndGgoKSk7Ci0gICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6cHJpbnQiICsgSGVscE1lc3NhZ2VzLldSSVRFX0VYQ0VQVElPTiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgIH0KLQotICAgLy8gUHJpbnRzIHRoZSBhIHN0cmluZyB0byBhIERhdGFPdXRwdXRTdHJlYW0gaW4gVVRGIGZvcm1hdAotICAgc3RhdGljIGJvb2xlYW4gcHJpbnRVVEYoRGF0YU91dHB1dFN0cmVhbSBvdXRQLCBTdHJpbmcgc3RyKQotICAgewotICAgIGlmKG91dFA9PW51bGwpCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6cHJpbnRVVEZcbiIgKyBIZWxwTWVzc2FnZXMuQkFEX09VVFBVVF9TVFJFQU0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgfQotICAgICBpZihzdHI9PW51bGwpCi0gICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNjU3RhdGljOnByaW50VVRGXG4iICsgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgIH0KLSAgICAgICB0cnkKLSAgICAgICAgewotCi0gICAgICAgICBvdXRQLndyaXRlVVRGKHN0cik7Ci0gICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNjU3RhdGljOnByaW50VVRGIiArIEhlbHBNZXNzYWdlcy5XUklURV9FWENFUFRJT04gKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgfQotCi0KLSAgc3RhdGljIHZvaWQgcHJpbnRTcGFjZShPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UCwgaW50IG5vT2ZTcGFjZSkKLSAgIHsKLSAgICAgIGZvcihpbnQgaT0wO2k8bm9PZlNwYWNlO2krKykKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgIG91dFAud3JpdGUoIiZuYnNwOyIsMCw2KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTWlzY1N0YXRpYzpwcmludFNwYWNlIiArIEhlbHBNZXNzYWdlcy5XUklURV9FWENFUFRJT04gKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgfQotCi0gICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgLy8gUmVhZCBhIGZpbGUgYW5kIHJldHVybiBpdCBhcyBhIGNvbmNhdGVuYXRlZCBzdHJpbmcuCi0gICBzdGF0aWMgU3RyaW5nIGxvYWRGaWxlKFN0cmluZyBmaWxlTmFtZSxTdHJpbmcgY2hhcmFjdGVyc2V0KQotICAgewkgIAotCSAgIHRyeQotCSAgIHsKLQkJICAgcmV0dXJuIEZpbGVVdGlsLnJlYWRGaWxlKG5ldyBGaWxlKGZpbGVOYW1lKSwgY2hhcmFjdGVyc2V0KS50b1N0cmluZygpOyAgIAotCSAgIH0KLQkgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotCSAgIHsKLQkJICAgOwotCSAgIH0KLQkgICAKLQkgICByZXR1cm4gIiI7Ci0JfQotCi0gICAvLyBDb252ZXJ0cyBhbGwgbGV0dGVycyBsaWtlIFx1ZmZmZCxcdWZmZmQsXHVmZmZkIHRvIHNwZWNpYWwgY29kZXMKLSAgIHN0YXRpYyB2b2lkIHNwZWNDaGFyKFN0cmluZyBpbiwgU3RyaW5nIG91dCwgU3RyaW5nIGNoYXJhY3RlcnNldCkKLSAgIHsKLSAgICAgaWYoaW49PW51bGwpCi0gICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNjU3RhdGljOnNwZWNDaGFyXG4iICsgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm47Ci0gICAgIH0KLQotICAgICBpZihvdXQ9PW51bGwpCi0gICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNjU3RhdGljOnNwZWNDaGFyXG4iICsgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm47Ci0gICAgIH0KLSAgICAgICAgU3RyaW5nIHRtcEZpbGUgPSAiMTNkODQuaHdyIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgaW5maWxlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHRtcEluZmlsZSA9IE1pc2NTdGF0aWMubG9hZEZpbGUoaW4sY2hhcmFjdGVyc2V0KTsKLSAgICAgICAgYm9vbGVhbiB3cml0ZVJlc3VsdCA9IHRydWU7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0KLSAgICAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIG91dFA7Ci0gICAgICAgICAgIGlmKGNoYXJhY3RlcnNldCE9bnVsbCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIG91dFAgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAotICAgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0odG1wRmlsZSksY2hhcmFjdGVyc2V0KTsKLSAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgb3V0UCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0gICAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXBGaWxlKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgd3JpdGVSZXN1bHQgID0gTWlzY1N0YXRpYy5wcmludChvdXRQLHRtcEluZmlsZSk7Ci0gICAgICAgICAgIGlmKCF3cml0ZVJlc3VsdCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6c3BlY0NoYXIiICsgSGVscE1lc3NhZ2VzLldSSVRFX0VYQ0VQVElPTiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgaW4pOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIG91dFAuY2xvc2UoKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgICAgICAgewotICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTWlzY1N0YXRpYzpzcGVjQ2hhciIgKyBIZWxwTWVzc2FnZXMuV1JJVEVfRVhDRVBUSU9OICsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICBlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgICBpZih3cml0ZVJlc3VsdCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIGluZmlsZSA9IE1pc2NTdGF0aWMubG9hZEZpbGUodG1wRmlsZSxjaGFyYWN0ZXJzZXQpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgewotICAgICAgICAgICAgIGluZmlsZT1udWxsOwotICAgICAgICAgICB9Ci0KLQotCi0KLSAgICAgICAgaWYoaW5maWxlIT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHRmaWxlPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgICAgICBmb3IoaW50IGk9MDtpPGluZmlsZS5sZW5ndGgoKTtpKyspCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcHNwZWNjaGFyZm91bmQ9ZmFsc2U7Ci0gICAgICAgICAgICAgICAgY2hhciB0ID0gaW5maWxlLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICBpZih0IT0nJicpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZigodD4nYScgJiYgdDwneicpIHx8ICh0PidBJyAmJiB0PCdaJykgfHwgKHQ+JzAnICYmIHQ8JzknKSB8fAotICAgICAgICAgICAgICAgICAgICAgICB0PT0nPCcgfHwgdD09Jz4nIHx8IHQ9PScvJyB8fCB0PT0nLicgfHwgdD09Jz0nIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIHQ9PSctJyB8fCB0PT0nJScgfHwgdD09J0AnKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRmaWxlLmFwcGVuZCh0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICByZXN1bHRmaWxlLmFwcGVuZChNaXNjU3RhdGljLnRvU3BlY0NoYXIodCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgY2hhciB0MiA9IGluZmlsZS5jaGFyQXQoaSsxKTsKLSAgICAgICAgICAgICAgICAgICBpZih0Mj09JyAnIHx8IHQyPT0nXG4nKQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGZpbGUuYXBwZW5kKCImYW1wOyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICB0bXBzcGVjY2hhcmZvdW5kPXRydWU7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ZmlsZS5hcHBlbmQoTWlzY1N0YXRpYy50b1NwZWNDaGFyKHQpKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHRtcHNwZWNjaGFyZm91bmQ9PXRydWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIHNwZWNjaGFyZm91bmQ9dHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgaWYoc3BlY2NoYXJmb3VuZCkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKEhlbHBNZXNzYWdlcy5XUklURV9GSUxFICsgb3V0KTsKLSAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UDsKLSAgICAgICAgICAgICAgICBpZihjaGFyYWN0ZXJzZXQhPW51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgb3V0UCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0KSxjaGFyYWN0ZXJzZXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIG91dFAgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAotICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsIHJlc3VsdGZpbGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgb3V0UC5jbG9zZSgpOwotICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgIHNwZWNjaGFyZm91bmQ9ZmFsc2U7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNjU3RhdGljOnNwZWNDaGFyIiArIEhlbHBNZXNzYWdlcy5XUklURV9FWENFUFRJT04gKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgIGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIEZpbGUgdG1wID0gbmV3IEZpbGUodG1wRmlsZSk7Ci0gICAgICAgICAgICAgIHRtcC5kZWxldGUoKTsKLQotICAgICB9Ci0gICB9Ci0KLSAgIC8vY29udmVydHMgYSBjaGFyYWN0ZXIgdG8gYSBzcGVjaWFsIGNvZGUgaWYgbmVlZGVkCi0gICBzdGF0aWMgU3RyaW5nIHRvU3BlY0NoYXIoY2hhciB0b2tlbikKLSAgIHsKLSAgICAgICAgdG1wc3BlY2NoYXJmb3VuZD10cnVlOwotICAgICAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJICAgIHJldHVybiAiJmFyaW5nOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkgICAgICByZXR1cm4gIiZBcmluZzsiOyAvLyROT04tTkxTLTEkCi0JICAgIH0KLQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJkF1bWw7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JICAgIGlmKHRva2VuPT0nXHVmZmZkJykKLQkgICAgewotCQkgcmV0dXJuICImYXVtbDsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkgICAgaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCSAgcmV0dXJuICImT3VtbDsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkgICAgaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCSAgcmV0dXJuICImb3VtbDsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkgICAgaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZFYWN1dGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImRWdyYXZlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJICAgcmV0dXJuICImVXVtbDsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCSByZXR1cm4gIiZhYWN1dGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQkgcmV0dXJuICImQWFjdXRlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJmFncmF2ZTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZlYWN1dGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImZWdyYXZlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJmlhY3V0ZTsiOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJmlncmF2ZTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZldW1sOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCSAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJm9hY3V0ZTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQkgcmV0dXJuICImb2dyYXZlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImdWFjdXRlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJnVncmF2ZTsiOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCSAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCSB7Ci0JCQlyZXR1cm4gIiZ1dW1sOyI7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJIGlmKHRva2VuPT0nXHVmZmZkJykKLQkJIHsKLQkJCXJldHVybiAiJnl1bWw7IjsgLy8kTk9OLU5MUy0xJAotCQkgfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJmFjaXJjOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCSByZXR1cm4gIiZBY2lyYzsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZlY2lyYzsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkgICAgaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCXJldHVybiAiJkVjaXJjOyI7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkgICByZXR1cm4gIiZ1Y2lyYzsiOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJlVjaXJjOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJm9jaXJjOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkgaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZPY2lyYzsiOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJmljaXJjOyI7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQkgcmV0dXJuICImQUVsaWc7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkgICAgaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQkgcmV0dXJuICImYWVsaWc7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJIHJldHVybiAiJkljaXJjOyI7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImQWdyYXZlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0gICAgICAgIHsKLQkgICAgICAgcmV0dXJuICImQXRpbGRlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCSByZXR1cm4gIiZhdGlsZGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQkgcmV0dXJuICImRVRIOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJIHJldHVybiAiJmV0aDsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCSByZXR1cm4gIiZJZ3JhdmU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JICAgIGlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkgICAgcmV0dXJuICImTnRpbGRlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JICAgIGlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImbnRpbGRlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJk90aWxkZTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZvdGlsZGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImc3psaWc7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkgICAgaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZUSE9STjsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZ0aG9ybjsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotICAgICAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJICByZXR1cm4gIiZPc2xhc2g7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkgIHJldHVybiAiJm9zbGFzaDsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCSAgcmV0dXJuICImT2dyYXZlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCSAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCSAgcmV0dXJuICImVWdyYXZlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJICAgcmV0dXJuICImaXVtbDsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCSAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCSAgcmV0dXJuICImWWFjdXRlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJICAgcmV0dXJuICImeWFjdXRlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZDY2VkaWw7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZjY2VkaWw7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLyppZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJmZyYWMxMjsiOwotCQl9Ki8KLQotICAgICAgICB0bXBzcGVjY2hhcmZvdW5kID0gZmFsc2U7Ci0JCXJldHVybiBuZXcgQ2hhcmFjdGVyKHRva2VuKS50b1N0cmluZygpOwotCi0gICAgIH0KLQotICAgICAgLyoqCi0gICogVHJpbXMgZG91YmxlIHF1b3RlcyBmcm9tIGFuIGFyZ3VtZW50LgotICAqIEBwYXJhbSBzdHIJdGhlIHN0cmluZyB0byB0cmltLgotICAqIEByZXR1cm4gdGhlIHRyaW1tZWQgc3RyaW5nLgotICoqLwotCi0gc3RhdGljIFN0cmluZyB0cmltUXVvdGVzKFN0cmluZyBzdHIpIHsKLQotICBpbnQgbGVuID0gc3RyLmxlbmd0aCgpOwotICBpZihsZW4gPD0gMCkgcmV0dXJuIHN0cjsKLQotICBpZihzdHIuY2hhckF0KGxlbiAtIDEpID09ICciJykgc3RyID0gc3RyLnN1YnN0cmluZygwLCBsZW4gLSAxKTsKLSAgaWYoc3RyLmNoYXJBdCgwKSA9PSAnIicpIHN0ciA9IHN0ci5zdWJzdHJpbmcoMSk7Ci0KLSAgcmV0dXJuIHN0cjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvT1MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L09TLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5NTU0MTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvT1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4OwotCi0KLWZpbmFsIGNsYXNzIE9TCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1dpbmRvd3M5OCA9IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNXaW5kb3dzOTUgPSBmYWxzZTsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzV2luZG93c05UID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01hY2ludG9zaCA9IGZhbHNlOwotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBTdHJpbmcgczsKLQotICAgICAgICBzID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBpZihzLmVxdWFscygiV2luZG93cyBOVCIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlzV2luZG93c05UID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKHMuZXF1YWxzKCJXaW5kb3dzIDk1IikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgICAgaXNXaW5kb3dzOTUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYocy5lcXVhbHMoIldpbmRvd3MgOTgiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgICBpc1dpbmRvd3M5OCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocy5lcXVhbHMoIk1hY2ludG9zaCIpIHx8IC8vJE5PTi1OTFMtMSQKLQkJCQkgcy5lcXVhbHMoIm1hY29zIikgfHwJCS8vQXBwbGV0IFZpZXdlciAvLyROT04tTkxTLTEkCi0JCQkJIHMuZXF1YWxzKCJNYWMgT1MiKSB8fAkJLy9OZXRzY2FwZSAvLyROT04tTkxTLTEkCi0JCQkJIHMuZXF1YWxzKCJNYWNPUyIpKQkJCS8vSW50ZXJuZXQgRXhwbG9kZXIgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgICBpc01hY2ludG9zaCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE9TKCkKLSAgICB7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4gaXNXaW5kb3dzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoaXNXaW5kb3dzOTUoKSB8fCBpc1dpbmRvd3NOVCgpIHx8IGlzV2luZG93czk4KTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBpc1dpbmRvd3M5NSgpCi0gICAgewotICAgICAgICByZXR1cm4gKGlzV2luZG93czk1KTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBpc1dpbmRvd3NOVCgpCi0gICAgewotICAgICAgICByZXR1cm4gKGlzV2luZG93c05UKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBpc01hY2ludG9zaCgpCi0gICAgewotICAgICAgICByZXR1cm4gKGlzTWFjaW50b3NoKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvU3BlY0tleVdvcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L1NwZWNLZXlXb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViNDFmZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvU3BlY0tleVdvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4OwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci0KLS8vQSBrZXl3b3JkIGRlZmluZWQgaW4gYSBzZXBhcmF0ZSBmaWxlCi0vL1RoaXMga2V5d29yZCByZWZmZXJzIHRvIGEga2V5d29yZCBkZWZpbmVkIGluIGEgaHRtbCBmaWxlCi1jbGFzcyBTcGVjS2V5V29yZAotewotICAgIHByaXZhdGUgU3RyaW5nIHJlbGF0ZWRLZXlXb3JkPW51bGw7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNlZT10cnVlOwotCi0gICAgU3BlY0tleVdvcmQoU3RyaW5nIHJlbGF0ZWRLZXlXb3JkLCBib29sZWFuIG1vZGUpCi0gICAgewotICAgICAgICBpZihyZWxhdGVkS2V5V29yZD09bnVsbCkKLSAgICAgICAgewotICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlNwZWNLZXlXb3JkOlNwZWNLZXlXb3JkXG4iICsgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgdGhpcy5yZWxhdGVkS2V5V29yZCA9IHJlbGF0ZWRLZXlXb3JkOwotICAgICAgIHRoaXMuc2VlID0gbW9kZTsKLSAgICB9Ci0KLSAgICAvL1ByaW50cyB0aGUga2V5d29yZAotICAgIHZvaWQgcHJpbnQoT3V0cHV0U3RyZWFtV3JpdGVyIG91dFApCi0gICAgewotICAgICAgaWYob3V0UD09bnVsbCkKLSAgICAgIHsKLSAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiU3BlY0tleVdvcmQ6cHJpbnRcbiIgKyBIZWxwTWVzc2FnZXMuQkFEX09VVFBVVF9TVFJFQU0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZihyZWxhdGVkS2V5V29yZCE9bnVsbCkKLSAgICAgIHsKLSAgICAgICBpZihzZWUpCi0gICAgICAgewotICAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldFNlZSgpKTsKLSAgICAgICB9Ci0gICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRTZWVBbHNvKCkpOwotICAgICAgIH0KLSAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPEEgSFJFRj1cIiMiICsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHJlbGF0ZWRLZXlXb3JkICsgIlwiPiIgKyByZWxhdGVkS2V5V29yZCArICI8L0E+XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICB9Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc1NlZSgpCi0gICAgewotICAgICAgIHJldHVybiBzZWU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L1N0cmluZ0RlZmluaXRpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9TdHJpbmdEZWZpbml0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZmM2ZDgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L1N0cmluZ0RlZmluaXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotLyoqQ2xhc3NlcyB1c2VkIGZvciBhbGwgc3RyaW5nIG1lc3NhZ2VzIHRoYXQgbWF5IG5lZWQgdG8gYmUgbG9jYWxpemVkCi0gKi8KLWNsYXNzIFN0cmluZ0RlZmluaXRpb25zCi17Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfREVGSU5JVElPTl9GSUxFX05PVF9GT1VORCA9ICJUaGUgY29uZmlndXJhdGlvbi9kZWZpbml0aW9uIGZpbGVzIGhhcyBub3QgYmVlbiBkZWZpbmVkIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYjQ3MWQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgdGhlIGluZGV4IGFuZCBnbG9zc2FyeSBwYWdlcyBpbiBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGYxYzZkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBhbmQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBwdWJsaXNoaW5nIHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvc2VhcmNoL1N0b3BXb3JkUmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9zZWFyY2gvU3RvcFdvcmRSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjA2NGM1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9zZWFyY2gvU3RvcFdvcmRSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyBpbiBhIGNvbmZpZ3VyYXRpb24gZmlsZSBvZiBzdG9wIHdvcmRzCi0gKiBhbmQgcHJvdmlkZXMgdGhlIHN0b3Agd29yZHMgYXMgYSBsaXN0LiA8YnI+Ci0gKi8KLWNsYXNzIFN0b3BXb3JkUmVhZGVyCi17Ci0JcHJpdmF0ZSBzdGF0aWMgVmVjdG9yIF9zdG9wd29yZHMgPSBudWxsOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcml2YXRlIFN0b3BXb3JkUmVhZGVyKCkKLQl7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmUgdGhlIHNldCBvZiBzdG9wd29yZHMgZnJvbSB0aGUgZ2l2ZW4gZmlsZS4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nW10gZ2V0U3RvcHdvcmRzKCBTdHJpbmcgZmlsZXBhdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSApCi0JewotCQlpZiggbnVsbCA9PSBfc3RvcHdvcmRzICkKLQkJewotCQkJX3N0b3B3b3JkcyA9IG5ldyBWZWN0b3IoKTsKLQotCSAgICAJdHJ5Ci0gCSAgIAkJewotCQkJCS8vIHJlYWQgaW4gdGhlIGZpbGUKLQkJCQlTdHJpbmcgZnVsbEZpbGVuYW1lID0gZmlsZXBhdGggKwotCQkJCQkJCQkJICBGaWxlLnNlcGFyYXRvciArCi0JCSAJCQkJCQkJICBmaWxlbmFtZTsKLQkJICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKCBmdWxsRmlsZW5hbWUgKTsKLQkJCQlJbnB1dFN0cmVhbVJlYWRlciBzdHJlYW1SZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoIGluU3RyZWFtICk7Ci0JCQkJQnVmZmVyZWRSZWFkZXIgcmVhZCA9IG5ldyBCdWZmZXJlZFJlYWRlcihzdHJlYW1SZWFkZXIpOwotLyoJICAJICAgIAljaGFyW10gY2hhclJlYWQgPSBuZXcgY2hhclsgaW5TdHJlYW0uYXZhaWxhYmxlKCkgXTsKLQkgICAgICAgIAlzdHJlYW1SZWFkZXIucmVhZCggY2hhclJlYWQgKTsKLQkgICAgICAgIAlTdHJpbmcgY29udGVudCA9IG5ldyBTdHJpbmcoIGNoYXJSZWFkICk7Ci0qLwotCi0JCQkJU3RyaW5nIHdvcmQgPSByZWFkLnJlYWRMaW5lKCk7Ci0JCQkJd2hpbGUgKHdvcmQgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCV9zdG9wd29yZHMuYWRkKHdvcmQpOwotCQkJCQl3b3JkID0gcmVhZC5yZWFkTGluZSgpOwotCQkJCX0KLQotCSAgICAgICAgCS8vIGNsb3NlIHN0cmVhbQotCSAgICAgICAgCXJlYWQuY2xvc2UoKTsKLQkgICAgICAgIAlzdHJlYW1SZWFkZXIuY2xvc2UoKTsKLQkgICAgICAgIAlpblN0cmVhbS5jbG9zZSgpOwotCi0JICAgICAgICAJLy8gcGFyc2VDb250ZW50Ci0vLwkgICAgICAgIAlwYXJzZUNvbnRlbnQoIGNvbnRlbnQsIF9zdG9wd29yZHMgKTsKLQkJCX0KLQkJCWNhdGNoKCBFeGNlcHRpb24gZSApCi0JCQl7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCU9iamVjdFtdIHN0b3BPYmplY3RzID0gX3N0b3B3b3Jkcy50b0FycmF5KCk7Ci0JCVN0cmluZ1tdIHN0b3BTdHJpbmdzID0gbmV3IFN0cmluZ1sgc3RvcE9iamVjdHMubGVuZ3RoIF07Ci0JCWZvciggaW50IGkgPSAwOyBpIDwgc3RvcE9iamVjdHMubGVuZ3RoOyBpKysgKQotCQl7Ci0JCQlzdG9wU3RyaW5nc1sgaSBdID0gKFN0cmluZylzdG9wT2JqZWN0c1sgaSBdOwotCQl9Ci0JCXJldHVybiggc3RvcFN0cmluZ3MgKTsKLQotCX0KLQotCS8qKgotCSAqIFBhcnNlcyB0aGUgY29udGVudCBpbnRvIHN0b3B3b3Jkcy4KLQkgKi8KLS8qCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYXJzZUNvbnRlbnQoIFN0cmluZyBjb250ZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3IgX3N0b3B3b3JkcyApCi0JewotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplciggY29udGVudCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSggImxpbmUuc2VwYXJhdG9yIiApICk7Ci0JCXdoaWxlKCB0b2tlbml6ZXIuaGFzTW9yZUVsZW1lbnRzKCkgKQotCQl7Ci0JCQlfc3RvcHdvcmRzLmFkZEVsZW1lbnQoIHRva2VuaXplci5uZXh0RWxlbWVudCgpICk7Ci0JCX0KLQl9Ci0qLwotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9zZWFyY2gvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvc2VhcmNoL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTNiYjY3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9zZWFyY2gvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgaW5kZXhpbmcgYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL1B1Ymxpc2hpbmdVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL1B1Ymxpc2hpbmdVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlmMWRjNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9QdWJsaXNoaW5nVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi54bWwuWFNMVFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdQbHVnaW47Ci0KLS8qKgotICogdXRpbGl0eSBjbGFzcyBmb3IgcHVibGlzaGluZyBzZXJ2aWNlCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaGluZ1V0aWwgewotCi0JLyoqCi0JICogbWV0aG9kIHRvIGphciB0aGUgc3BlY2lmaWVkIGRpciBpbnRvIGEgamFyIGZpbGUuIG5vbi1zdWItZm9sZGVycyB3aWxsIGJlIGphcmVkLgotCSAqIEBwYXJhbSBqYXJEaXIKLQkgKiBAcGFyYW0gamFyRmlsZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgamFyRmlsZXMoRmlsZSBqYXJEaXIsIEZpbGUgamFyRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQlGaWxlW10gZmlsZXMgPSBqYXJEaXIubGlzdEZpbGVzKCk7Ci0JCWlmIChqYXJGaWxlLmV4aXN0cygpKQotCQl7Ci0JCQlqYXJGaWxlLmRlbGV0ZSgpOwotCQl9Ci0JCUJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJTdHJlYW0gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oamFyRmlsZSkpOwotCQlaaXBPdXRwdXRTdHJlYW0gemlwcGVyU3RyZWFtID0gbmV3IFppcE91dHB1dFN0cmVhbShiU3RyZWFtKTsKLQotCQlTdHJpbmcgY3VycmVudE5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVs0MDk2XTsKLQkJZm9yIChpbnQgaT0wOyBpPGZpbGVzLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlGaWxlIGN1cnJlbnRGaWxlID0gZmlsZXNbaV07Ci0JCQlpZiAoIGN1cnJlbnRGaWxlLmlzRGlyZWN0b3J5KCkgKQotCQkJewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJWmlwRW50cnkgY3VyckVudHJ5ID0gbmV3IFppcEVudHJ5KGN1cnJlbnRGaWxlLmdldE5hbWUoKSk7Ci0JCQl6aXBwZXJTdHJlYW0ucHV0TmV4dEVudHJ5KGN1cnJFbnRyeSk7Ci0JCQlCdWZmZXJlZElucHV0U3RyZWFtIGJpU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShjdXJyZW50RmlsZSkpOwotCQkJd2hpbGUgKGJpU3RyZWFtLmF2YWlsYWJsZSgpID4gMCkKLQkJCXsKLQkJCQlpbnQgbnVtID0gYmlTdHJlYW0ucmVhZChieXRlcyk7Ci0JCQkJemlwcGVyU3RyZWFtLndyaXRlKGJ5dGVzLCAwLCBudW0pOwotCQkJfQotCQkJYmlTdHJlYW0uY2xvc2UoKTsKLQkJCXppcHBlclN0cmVhbS5jbG9zZUVudHJ5KCk7Ci0JCX0KLQkJemlwcGVyU3RyZWFtLmNsb3NlKCk7Ci0JCWJTdHJlYW0uY2xvc2UoKTsKLQotCX0KLQotCi0JLyoqCi0JICogZ2VuZXJhdGUgdGhlIGh0bWwgY29udGVudCBmb3IgdGhlIGdpdmVuIHhtbCBkb2N1ZW1udCBhbmQgdGhlIHhzbHQgcGF0aAotCSAqIEBwYXJhbSB4bWxFbGVtZW50IFhtbEVsZW1lbnQKLQkgKiBAcGFyYW0geHNsUGF0aCBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEh0bWwoWG1sRWxlbWVudCB4bWxFbGVtZW50LCBTdHJpbmcgeHNsUGF0aCkKLQl7Ci0JCXRyeQotCQl7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTChQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbnN0YWxsVVJMKCksIHhzbFBhdGgpOwotCQkJaWYgKCB1cmwgPT0gbnVsbCApCi0JCQl7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gZ2V0IHhzbCB0ZW1wbGF0ZSAiICsgeHNsUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJU3RyaW5nIHhzbF91cmkgPSBQbGF0Zm9ybS5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCi0JCQlTdHJpbmdCdWZmZXIgeG1sID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJeG1sLmFwcGVuZChYbWxIZWxwZXIuWE1MX0hFQURFUikuYXBwZW5kKHhtbEVsZW1lbnQudG9YbWwoKSk7Ci0KLQkJCVByb3BlcnRpZXMgeHNsUGFyYW1zID0gUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvcGVydGllcygiL3hzbC9yZXNvdXJjZXMucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCS8vIGdlZW5yYXRlIHRoZSBodG1sCi0JCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQlYU0xUUHJvY2Vzc29yLnRyYW5zZm9ybSh4c2xfdXJpLCB4bWwudG9TdHJpbmcoKSwgeHNsUGFyYW1zLCBzdyk7Ci0JCQlzdy5mbHVzaCgpOwotCQkJCi0JCQkvLyB1cmxzIGFyZSBlbmNvZGVkIGluIHhzbHQgb3V0cHV0LCBkZWNvZGUgaXQKLQkJCXJldHVybiBSZXNvdXJjZUhlbHBlci5kZWNvZGVVcmxzSW5Db250ZW50KHN3LmdldEJ1ZmZlcigpLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpCi0JCXsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvSHR0cENsaWVudFRpbWVvdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwQ2xpZW50VGltZW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMmU0MzZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwQ2xpZW50VGltZW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbC5odHRwOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IHN1bi5uZXQud3d3Lmh0dHAuSHR0cENsaWVudDsKLS8vaW1wb3J0IHN1bi5uZXQuKjsKLS8vaW1wb3J0IHN1bi5uZXQud3d3Lio7Ci1jbGFzcyBIdHRwQ2xpZW50VGltZW91dCBleHRlbmRzIEh0dHBDbGllbnQKLXsKLQlwcml2YXRlIGludCB0aW1lb3V0ID0gMCA7Ci0KLSAgICBIdHRwQ2xpZW50VGltZW91dChVUkwgdXJsLCBTdHJpbmcgcHJveHksIGludCBwcm94eVBvcnQsIGludCB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCXN1cGVyKHVybCwgcHJveHksIHByb3h5UG9ydCk7Ci0JCV9zZXRUaW1lb3V0KHRpbWVvdXQpOwotCi0JfQotCi0gICAgSHR0cENsaWVudFRpbWVvdXQoVVJMIHVybCwgaW50IHRpbWVvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJc3VwZXIodXJsLCAoU3RyaW5nKW51bGwsIC0xKTsKLQkJc2V0VGltZW91dCh0aW1lb3V0KTsKLSAgICB9Ci0KLQlwcml2YXRlIHZvaWQgX3NldFRpbWVvdXQoaW50IGkpCi0gICAgCXRocm93cyBTb2NrZXRFeGNlcHRpb24KLQl7Ci0gICAgCXRoaXMudGltZW91dCA9IGk7Ci0gICAgCXNlcnZlclNvY2tldC5zZXRTb1RpbWVvdXQoaSkgOwotIAl9Ci0KLSAgICAvKiBUaGlzIGNsYXNzIGhhcyBubyBwdWJsaWMgY29uc3RydWN0b3IgZm9yIEhUVFAuICBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvCi0gICAgICogZ2V0IGFuIEh0dHBDbGllbnQgdG8gdGhlIHNwZWNpZmVkIFVSTC4gIElmIHRoZXJlJ3MgY3VycmVudGx5IGFuCi0gICAgICogYWN0aXZlIEh0dHBDbGllbnQgdG8gdGhhdCBzZXJ2ZXIvcG9ydCwgeW91J2xsIGdldCB0aGF0IG9uZS4KLQkgKgotCSAqIG5vIGxvbmdlciBzeW5jcmhvbml6ZWQgLS0gaXQgc2xvd3MgdGhpbmdzIGRvd24gdG9vIG11Y2gKLQkgKiBzeW5jaHJvbml6ZSBhdCBhIGhpZ2hlciBsZXZlbAotICAgICAqLwotICAgIHN0YXRpYyBIdHRwQ2xpZW50VGltZW91dCBHZXROZXcoVVJMIHVybCwgaW50IHRpbWVvdXQpCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLyogc2VlIGlmIG9uZSdzIGFscmVhZHkgYXJvdW5kICovCi0JCUh0dHBDbGllbnRUaW1lb3V0IHJldCA9IChIdHRwQ2xpZW50VGltZW91dCkga2FjLmdldCh1cmwpOwotCQlpZiAocmV0ID09IG51bGwpIHsKLQkgICAgCXJldCA9IG5ldyBIdHRwQ2xpZW50VGltZW91dCAodXJsLCB0aW1lb3V0KTsgIC8vIENUT1IgY2FsbGVkIG9wZW5TZXJ2ZXIoKQotCQl9IGVsc2UgewotCSAgICAJcmV0LnVybCA9IHVybDsKLQkJfQotCQkvLyBkb24ndCBrbm93IGlmIHdlJ3JlIGtlZXBpbmcgYWxpdmUgdW50aWwgd2UgcGFyc2UgdGhlIGhlYWRlcnMKLQkJLy8gZm9yIG5vdywga2VlcGluZ0FsaXZlIGlzIGZhbHNlCi0JCXJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb3BlblNlcnZlcihTdHJpbmcgcywgaW50IGkpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc2VydmVyU29ja2V0ID0gZG9Db25uZWN0KHMsIGkpOwotICAgICAgICBzZXJ2ZXJPdXRwdXQgPSBuZXcgUHJpbnRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKHNlcnZlclNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSkpOwotICAgICAgICBzZXJ2ZXJTb2NrZXQuc2V0VGNwTm9EZWxheSh0cnVlKTsKLSAgICAgICAgc2VydmVyU29ja2V0LnNldFNvVGltZW91dCh0aW1lb3V0KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwUmVzcG9uc2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwUmVzcG9uc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGIxM2YyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvSHR0cFJlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbC5odHRwOwotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgMDkvMjEvMjAwMQotICovCi1wdWJsaWMgY2xhc3MgSHR0cFJlc3BvbnNlIHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fQ09PS0lFX05BTUUgPSAiU01TRVNTSU9OIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGNsYXNzIENvb2tpZSBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCQlwcml2YXRlIFN0cmluZyBkb21haW47Ci0JCXByaXZhdGUgU3RyaW5nIHBhdGg7Ci0KLQkJQ29va2llKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0KLQkJU3RyaW5nIGdldFZhbHVlKCkgewotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0KLQkJdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJfQotCi0JCVN0cmluZyBnZXREb21haW4oKSB7Ci0JCQlyZXR1cm4gZG9tYWluOwotCQl9Ci0KLQkJdm9pZCBzZXREb21haW4oU3RyaW5nIGRvbWFpbikgewotCQkJdGhpcy5kb21haW4gPSBkb21haW47Ci0JCX0KLQotCQlTdHJpbmcgZ2V0UGF0aCgpIHsKLQkJCXJldHVybiBwYXRoOwotCQl9Ci0KLQkJdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCQl0aGlzLnBhdGggPSBwYXRoOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkgICAgCXRyeSB7Ci0JICAgICAgICAJcmV0dXJuIHN1cGVyLmNsb25lKCk7Ci0JICAgIAl9Ci0JICAgIAljYXRjaChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0JICAgICAgICAJcmV0dXJuIG51bGw7Ci0JICAgIAl9Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpKyIobmFtZT0iK25hbWUrIiwgdmFsdWU9Iit2YWx1ZSsiLCBkb21haW49Iitkb21haW4rIiwgcGF0aD0iK3BhdGgrIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJfQotCX0KLQkJcHJpdmF0ZSBpbnQgc3RhdHVzOwotCQlwcml2YXRlIFByb3BlcnRpZXMgaGVhZGVyczsKLQkJcHJpdmF0ZSBWZWN0b3IgY29va2llczsKLQotCQlwcml2YXRlIFN0cmluZyBkYXRhOwotCi0JCUh0dHBSZXNwb25zZShpbnQgc3RhdHVzLCBQcm9wZXJ0aWVzIGhlYWRlcnMsIFZlY3RvciBjb29raWVzLCBTdHJpbmcgZGF0YSkgewotCQkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0JCQl0aGlzLmhlYWRlcnMgPSBoZWFkZXJzOwotCQkJdGhpcy5jb29raWVzID0gY29va2llczsKLQkJCXRoaXMuZGF0YSA9IGRhdGE7Ci0JCX0KLQotCQlpbnQgZ2V0U3RhdHVzKCkgewotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCi0JCVByb3BlcnRpZXMgZ2V0SGVhZGVycygpIHsKLQkJCXJldHVybiBoZWFkZXJzOwotCQl9Ci0KLQkJVmVjdG9yIGdldENvb2tpZXMoKSB7Ci0JCQlyZXR1cm4gY29va2llczsKLQkJfQotCi0JCVN0cmluZyBnZXREYXRhKCkgewotCQkJcmV0dXJuIGRhdGE7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIihzdGF0dXM9IitzdGF0dXMrIiwgaGVhZGVycz0iK2hlYWRlcnMrIiwgY29va2llcz0iK2Nvb2tpZXMrIiwgZGF0YT0iK2RhdGErIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBUaW1lb3V0RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBUaW1lb3V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMTI0MDljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwVGltZW91dEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnV0aWwuaHR0cDsKLWltcG9ydCBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyOwotaW1wb3J0IGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5OwotCi1jbGFzcyBIdHRwVGltZW91dEZhY3RvcnkgaW1wbGVtZW50cyBVUkxTdHJlYW1IYW5kbGVyRmFjdG9yeQotewotCXByaXZhdGUgaW50IHRpbWVvdXQ7Ci0JSHR0cFRpbWVvdXRGYWN0b3J5KGludCB0aW1lb3V0KSB7IHRoaXMudGltZW91dCA9IHRpbWVvdXQ7IH0KLQlwdWJsaWMgVVJMU3RyZWFtSGFuZGxlciBjcmVhdGVVUkxTdHJlYW1IYW5kbGVyKFN0cmluZyBzdHIpCi0JewotCQlIdHRwVGltZW91dEhhbmRsZXIgaGFuZGxlciA9IG5ldyBIdHRwVGltZW91dEhhbmRsZXIoKTsKLQkJaGFuZGxlci5zZXRUaW1lb3V0KHRpbWVvdXQpOwotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwVGltZW91dEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwVGltZW91dEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTQ1M2ExYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvSHR0cFRpbWVvdXRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51dGlsLmh0dHA7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotY2xhc3MgSHR0cFRpbWVvdXRIYW5kbGVyIGV4dGVuZHMgc3VuLm5ldC53d3cucHJvdG9jb2wuaHR0cC5IYW5kbGVyIGltcGxlbWVudHMgVGltZW91dEhhbmRsZXIKLXsKLQlwcml2YXRlIGludCB0aW1lb3V0ID0gMDsKLQotCUh0dHBUaW1lb3V0SGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlIdHRwVGltZW91dEhhbmRsZXIoaW50IHRpbWVvdXQpIHsKLQkJdGhpcygpOwotCQl0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OwotCX0KLQotICAgIHByb3RlY3RlZCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uIG9wZW5Db25uZWN0aW9uKFVSTCB1KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEh0dHBVUkxDb25uZWN0aW9uVGltZW91dCh1LCB0aGlzLCB0aW1lb3V0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCB0aW1lb3V0KSB7Ci0gICAgCXRoaXMudGltZW91dCA9IHRpbWVvdXQ7Ci0gICAgfQotCi0gICAgU3RyaW5nIGdldFByb3h5KCkgeyByZXR1cm4gcHJveHk7IH0JCS8vIGJyZWFraW5nIGVuY2Fwc3VsYXRpb24KLSAgICBpbnQgZ2V0UHJveHlQb3J0KCkgeyByZXR1cm4gcHJveHlQb3J0OyB9ICAgIC8vIGJyZWFraW5nIGVuY2Fwc3VsYXRpb24KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBVUkxDb25uZWN0aW9uVGltZW91dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBVUkxDb25uZWN0aW9uVGltZW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4Yzg2NjE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwVVJMQ29ubmVjdGlvblRpbWVvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnV0aWwuaHR0cDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBzdW4ubmV0Lnd3dy5odHRwLkh0dHBDbGllbnQ7Ci0KLWNsYXNzIEh0dHBVUkxDb25uZWN0aW9uVGltZW91dCBleHRlbmRzIHN1bi5uZXQud3d3LnByb3RvY29sLmh0dHAuSHR0cFVSTENvbm5lY3Rpb24KLXsKLQlwcml2YXRlIGludCB0aW1lb3V0OwotCXByaXZhdGUgSHR0cFRpbWVvdXRIYW5kbGVyIHRpbWVvdXRIYW5kbGVyOwotCi0gIAlIdHRwVVJMQ29ubmVjdGlvblRpbWVvdXQoVVJMIHUsIEh0dHBUaW1lb3V0SGFuZGxlciBoYW5kbGVyLCBpbnQgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0JewotICAgIAlzdXBlcih1LCBoYW5kbGVyKTsKLQkJdGhpcy50aW1lb3V0ID0gdGltZW91dDsKLQkJdGltZW91dEhhbmRsZXIgPSBoYW5kbGVyOwotCX0KLQotCUh0dHBVUkxDb25uZWN0aW9uVGltZW91dChVUkwgdSwgIFN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgotCXsKLSAgICAJc3VwZXIodSwgaG9zdCwgcG9ydCk7Ci0gICAgCXRoaXMudGltZW91dCA9IHRpbWVvdXQ7Ci0JfQotCi0gICAgcHVibGljIHZvaWQgY29ubmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChjb25uZWN0ZWQpIHsKLQkgICAgCXJldHVybjsKLQkJfQotCQl0cnkgewotCSAgICAJaWYgKCJodHRwIi5lcXVhbHModXJsLmdldFByb3RvY29sKCkpIC8qICYmICFmYWlsZWRPbmNlIDwtIFBSSVZBVEUgKi8gKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBmb3Igc2FmZXR5J3Mgc2FrZSwgYXMgcmVwb3J0ZWQgYnkgS0xHcm91cAotCQkJCXN5bmNocm9uaXplZCAodXJsKSB7Ci0JCQkJCWh0dHAgPSBIdHRwQ2xpZW50VGltZW91dC5HZXROZXcodXJsLCB0aW1lb3V0KTsKLQkJCQl9Ci0JICAgIAl9Ci0JICAgIAllbHNlIHsKLQkJCQkvLyBtYWtlIHN1cmUgdG8gY29uc3RydWN0IG5ldyBjb25uZWN0aW9uIGlmIGZpcnN0Ci0JCQkJLy8gYXR0ZW1wdCBmYWlsZWQKLQkJCQlodHRwID0gbmV3IEh0dHBDbGllbnRUaW1lb3V0KHVybCwgdGltZW91dEhhbmRsZXIuZ2V0UHJveHkoKSwgdGltZW91dEhhbmRsZXIuZ2V0UHJveHlQb3J0KCksIHRpbWVvdXQpOwotCSAgICAJfQotCSAgICAJcHMgPSAoUHJpbnRTdHJlYW0paHR0cC5nZXRPdXRwdXRTdHJlYW0oKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCSAgICAJdGhyb3cgZTsKLQkJfQotCQkvLyB0aGlzIHdhcyBtaXNzaW5nIGZyb20gdGhlIG9yaWdpbmFsIHZlcnNpb24KLQkJY29ubmVjdGVkID0gdHJ1ZTsKLQl9Ci0KLSAgICBwcm90ZWN0ZWQgSHR0cENsaWVudCBnZXRQcm94aWVkQ2xpZW50KFVSTCB1cmwsIFN0cmluZyBzLCBpbnQgaSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gKEh0dHBDbGllbnQpbmV3IEh0dHBDbGllbnRUaW1lb3V0KHVybCwgcywgaSwgdGltZW91dCk7Ci0gICAgfQotCi0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBIdHRwQ2xpZW50IG9iamVjdCwgYnlwYXNzaW5nIHRoZSBjYWNoZSBvZgotICAgICAqIEhUVFAgY2xpZW50IG9iamVjdHMvY29ubmVjdGlvbnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJsCXRoZSBVUkwgYmVpbmcgYWNjZXNzZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSHR0cENsaWVudCBnZXROZXdDbGllbnQoVVJMIHVybCkKLSAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gKEh0dHBDbGllbnQpKG5ldyBIdHRwQ2xpZW50VGltZW91dCAodXJsLCAoU3RyaW5nKW51bGwsIC0xLCB0aW1lb3V0KSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvSHR0cFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODE0NzJlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvSHR0cFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51dGlsLmh0dHA7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIDA5LzIxLzIwMDEKLSAqLwotcHVibGljIGNsYXNzIEh0dHBVdGlsIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JLyoqCi0JICogRG8gYSBHRVQgdXNpbmcgbG93IGxldmVsIHNvY2tldCB0byBoYXZlIGNvbnRyb2wgb3ZlciB0aW1lb3V0Ci0JICoKLQkgKiBAcmV0dXJuIHJlc3BvbnNlCi0JICogQGV4Y2VwdGlvbiA8bGk+IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb24gY291bGQgbm90IGNvbm5lY3QgdG8gaG9zdDpwb3J0Ci0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiB0aW1lb3V0IGV4Y2VlZGVkCi0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSU9FeGNlcHRpb24gSS9PIGVycm9yCi0JICogICAgICAgICAgICA8bGk+IENhdGFIdHRwRXhjZXB0aW9uIGludmFsaWQgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIKLQkgKi8KLQlzdGF0aWMgSHR0cFJlc3BvbnNlIGRvR2V0KFNvY2tldCBzb2NrLCBTdHJpbmcgdXJsLCBQcm9wZXJ0aWVzIGhlYWRlcnMpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCWludCByZXNwU3RhdHVzOwotCQlQcm9wZXJ0aWVzIHJlc3BIZWFkZXJzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJVmVjdG9yIHJlc3BDb29raWVzID0gbmV3IFZlY3RvcigpOwotCQlTdHJpbmcgcmVzcCA9IG51bGw7Ci0JCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLQkJRGF0YUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVN0cmluZyBob3N0ID0gc29jay5nZXRJbmV0QWRkcmVzcygpLmdldEhvc3ROYW1lKCk7Ci0JCQlpbnQgcG9ydCA9IHNvY2suZ2V0UG9ydCgpOwotCQkJb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oc29jay5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0JCQlpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc29jay5nZXRJbnB1dFN0cmVhbSgpKSk7Ci0JCQlvdXQud3JpdGVCeXRlcygiR0VUICIgKyB1cmwgKyAiIEhUVFAvMS4xXHJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCW91dC53cml0ZUJ5dGVzKCJIb3N0OiAiICsgaG9zdCArICI6IiArIHBvcnQgKyAiXHJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJb3V0LndyaXRlQnl0ZXMoIlVzZXItQWdlbnQ6IE1vemlsbGEvNC4wXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlvdXQud3JpdGVCeXRlcygiQ29udGVudC1MZW5ndGg6IDBcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIHNlbmQgYWRkaW9uYWwgaGVhZGVycyBpZiBhbnkKLQkJCWlmKGhlYWRlcnMgIT0gbnVsbCAmJiBoZWFkZXJzLnNpemUoKSA+IDApIHsKLQkJCQlFbnVtZXJhdGlvbiBuYW1lcyA9IGhlYWRlcnMua2V5cygpOwotCQkJCXdoaWxlKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZyluYW1lcy5uZXh0RWxlbWVudCgpOwotCQkJCQlpZihuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkhvc3QiKSB8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlVzZXItQWdlbnQiKSB8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkNvbnRlbnQtTGVuZ3RoIikpIGNvbnRpbnVlOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlvdXQud3JpdGVCeXRlcyhuYW1lICsgIjogIiArIGhlYWRlcnMuZ2V0UHJvcGVydHkobmFtZSkgKyAiXHJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCQlvdXQud3JpdGVCeXRlcygiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlvdXQuZmx1c2goKTsKLQkJCVN0cmluZyBsaW5lOwotCQkJYm9vbGVhbiBlbmRGb3VuZCA9IGZhbHNlOwotCQkJaW50IGNvbnRlbnRMZW4gPSAtMTsKLQkJCWZpbmFsIFN0cmluZyBjb250ZW50TGVuSGVhZGVyID0gImNvbnRlbnQtbGVuZ3RoOiAiOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgY29udGVudExlbkhlYWRlckxlbiA9IGNvbnRlbnRMZW5IZWFkZXIubGVuZ3RoKCk7Ci0JCQlTdHJpbmcgaHR0cFJlc3AgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyByZWFkIHRoZSBmaXJzdCBsaW5lCi0JCQlsaW5lID0gaW4ucmVhZExpbmUoKTsKLQkJCS8vbG9nZ2VyLmRlYnVnKCJsaW5lPSIrbGluZSk7Ci0JCQlpZihsaW5lID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKFB1Ymxpc2hpbmdSZXNvdXJjZXMuc2VydmVyRXJyb3JfbXNnKTsgCi0JCQl9Ci0JCQlodHRwUmVzcCArPSBsaW5lICsgIlxuIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobGluZSk7Ci0JCQl0cnkgewotCQkJCS8vIHNraXAgdGhlIGZpcnN0IHRva2VuIHdoaWNoIGlzICJIVFRQLzEuMSIgb3IgIkhUVFAvMS4wIgotCQkJCXRva2Vucy5uZXh0VG9rZW4oKTsKLQkJCQlyZXNwU3RhdHVzID0gSW50ZWdlci5wYXJzZUludCh0b2tlbnMubmV4dFRva2VuKCkpOwotCQkJfQotCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oTkxTLmJpbmQoUHVibGlzaGluZ1Jlc291cmNlcy5pbnZhbGlkSHR0cFJlc3BvbnNlRXJyb3JfbXNnLCAobmV3IE9iamVjdFtde2hvc3QsIEludGVnZXIudG9TdHJpbmcocG9ydCksIGxpbmV9KSkpOyAKLQkJCX0KLQotCQkJLy8gcmVhZCB0aGUgaGVhZGVycwotCQkJd2hpbGUoKGxpbmUgPSBpbi5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJLy9sb2dnZXIuZGVidWcoImxpbmU9IitsaW5lKTsKLQkJCQlodHRwUmVzcCArPSBsaW5lICsgIlxuIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmKGxpbmUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQllbmRGb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpbnQgaWQgPSBsaW5lLmluZGV4T2YoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZihpZCA+IDApIHsKLQkJCQkJU3RyaW5nIGhlYWRlciA9IGxpbmUuc3Vic3RyaW5nKDAsIGlkKS50b0xvd2VyQ2FzZSgpOwotCQkJCQlTdHJpbmcgdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZihsaW5lLmxlbmd0aCgpID4gaWQgKyAyKSB7Ci0JCQkJCQl2YWx1ZSA9IGxpbmUuc3Vic3RyaW5nKGlkICsgMik7Ci0JCQkJCX0KLQotCQkJCQlpZihoZWFkZXIuZXF1YWxzSWdub3JlQ2FzZSgic2V0LWNvb2tpZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCUh0dHBSZXNwb25zZS5Db29raWUgY29va2llID0gcGFyc2VDb29raWUodmFsdWUpOwotCQkJCQkJaWYoY29va2llICE9IG51bGwpIHsKLQkJCQkJCQlyZXNwQ29va2llcy5hZGRFbGVtZW50KGNvb2tpZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXNwSGVhZGVycy5wdXQoaGVhZGVyLCB2YWx1ZSk7Ci0JCQkJCX0KLQotCQkJCQkvL3Jlc3BIZWFkZXJzLnB1dChoZWFkZXIsIHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlTdHJpbmcgY29udGVudExlblN0ciA9IHJlc3BIZWFkZXJzLmdldFByb3BlcnR5KCJjb250ZW50LWxlbmd0aCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZihjb250ZW50TGVuU3RyID09IG51bGwpIHsKLQkJCQljb250ZW50TGVuID0gLTE7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljb250ZW50TGVuID0gSW50ZWdlci5wYXJzZUludChjb250ZW50TGVuU3RyKTsKLQkJCX0KLQkJCWlmKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIisrKytCRUdJTiBIRUFERVJTKysrKyIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oaHR0cFJlc3ApOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIrKysrRU5EIEhFQURFUlMrKysrIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmKCFlbmRGb3VuZCkgewotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oTkxTLmJpbmQoUHVibGlzaGluZ1Jlc291cmNlcy5pbnZhbGlkSHR0cFJlc3BvbnNlRXJyb3JfbXNnLCAobmV3IE9iamVjdFtde2hvc3QsIEludGVnZXIudG9TdHJpbmcocG9ydCksIGh0dHBSZXNwfSkpKTsgCi0JCQl9Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiY29udGVudExlbj0iK2NvbnRlbnRMZW4pOwotCQkJaWYoY29udGVudExlbiA+IDApIHsKLQkJCQkvKgotCQkJCWJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbY29udGVudExlbl07Ci0JCQkJaW4ucmVhZEZ1bGx5KGJ1ZmYpOwotCQkJCXJlc3AgPSBuZXcgU3RyaW5nKGJ1ZmYpOwotCQkJCSovCi0JCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQlieXRlW10gYnVmZiA9IG5ldyBieXRlW01hdGgubWluKDIwNDgsIGNvbnRlbnRMZW4pXTsKLQkJCQlpbnQgbnVtOwotCQkJCXdoaWxlKChudW0gPSBpbi5yZWFkKGJ1ZmYpKSAhPSAtMSkgewotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibnVtPSIrbnVtKTsKLQkJCQkJaW50IG4gPSBjb250ZW50TGVuIC0gYm9zLnNpemUoKTsKLQkJCQkJaWYobiA8PSBudW0pIHsKLQkJCQkJCWJvcy53cml0ZShidWZmLCAwLCBuKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWJvcy53cml0ZShidWZmLCAwLCBudW0pOwotCQkJCX0KLQkJCQlyZXNwID0gYm9zLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQllbHNlIGlmKGNvbnRlbnRMZW4gPCAwKSB7Ci0JCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQlieXRlW10gYnVmZiA9IG5ldyBieXRlWzIwNDhdOwotCQkJCWludCBudW07Ci0JCQkJd2hpbGUoKG51bSA9IGluLnJlYWQoYnVmZikpICE9IC0xKSB7Ci0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJudW09IitudW0pOwotCQkJCQlib3Mud3JpdGUoYnVmZiwgMCwgbnVtKTsKLQkJCQl9Ci0JCQkJcmVzcCA9IGJvcy50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJdHJ5IHsgaW4uY2xvc2UoKTsgfSBjYXRjaChFeGNlcHRpb24gZSkgeyAgfQotCQkJdHJ5IHsgb3V0LmNsb3NlKCk7IH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsgIH0KLQkJfQotCQlyZXR1cm4gbmV3IEh0dHBSZXNwb25zZShyZXNwU3RhdHVzLCByZXNwSGVhZGVycywgcmVzcENvb2tpZXMsIHJlc3ApOwotCX0KLQotCi0JLyoqCi0JICogRG8gYSBHRVQgdXNpbmcgbG93IGxldmVsIHNvY2tldCB0byBoYXZlIGNvbnRyb2wgb3ZlciB0aW1lb3V0Ci0JICoKLQkgKiBAcmV0dXJuIHJlc3BvbnNlCi0JICogQGV4Y2VwdGlvbiA8bGk+IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb24gY291bGQgbm90IGNvbm5lY3QgdG8gaG9zdDpwb3J0Ci0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiB0aW1lb3V0IGV4Y2VlZGVkCi0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSU9FeGNlcHRpb24gSS9PIGVycm9yCi0JICogICAgICAgICAgICA8bGk+IENhdGFIdHRwRXhjZXB0aW9uIGludmFsaWQgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEh0dHBSZXNwb25zZSBkb0dldChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyB1cmwsIGludCB0aW1lb3V0LCBQcm9wZXJ0aWVzIGhlYWRlcnMpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCVNvY2tldCBzb2NrID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNvY2sgPSBuZXcgU29ja2V0KGhvc3QsIHBvcnQpOwotCQkJc29jay5zZXRTb1RpbWVvdXQodGltZW91dCk7Ci0JCQlyZXR1cm4gZG9HZXQoc29jaywgdXJsLCBoZWFkZXJzKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRyeSB7IHNvY2suY2xvc2UoKTsgfSBjYXRjaChFeGNlcHRpb24gZSkge30KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIE1hcCBoYW5kbGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIHN0YXRpYyBVUkxTdHJlYW1IYW5kbGVyIGdldEhhbmRsZXIoaW50IHRpbWVvdXQpIHsKLQkJSW50ZWdlciBrZXkgPSBuZXcgSW50ZWdlcih0aW1lb3V0KTsKLQkJVVJMU3RyZWFtSGFuZGxlciBoYW5kbGVyID0gKFVSTFN0cmVhbUhhbmRsZXIpaGFuZGxlck1hcC5nZXQoa2V5KTsKLQkJaWYoaGFuZGxlciA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQoaGFuZGxlck1hcCkgewotCQkJCWlmKChoYW5kbGVyID0gKFVSTFN0cmVhbUhhbmRsZXIpaGFuZGxlck1hcC5nZXQoa2V5KSkgPT0gbnVsbCkgewotCQkJCQloYW5kbGVyID0gbmV3IEh0dHBUaW1lb3V0SGFuZGxlcih0aW1lb3V0KTsKLQkJCQkJaGFuZGxlck1hcC5wdXQoa2V5LCBoYW5kbGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogRG8gYSBHRVQKLQkgKgotCSAqIEByZXR1cm4gcmVzcG9uc2UKLQkgKiBAZXhjZXB0aW9uIDxsaT4gamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbiBjb3VsZCBub3QgY29ubmVjdCB0byBob3N0OnBvcnQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uIHRpbWVvdXQgZXhjZWVkZWQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JT0V4Y2VwdGlvbiBJL08gZXJyb3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEh0dHBSZXNwb25zZSBkb0dldChTdHJpbmcgdXJsLCBQcm9wZXJ0aWVzIGhlYWRlcnMsIGludCB0aW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZG9HZXQobmV3IFVSTCgoVVJMKW51bGwsIHVybCwgZ2V0SGFuZGxlcih0aW1lb3V0KSksIGhlYWRlcnMpOwotCX0KLQotCS8qKgotCSAqIERvIGEgR0VUCi0JICoKLQkgKiBAcmV0dXJuIHJlc3BvbnNlCi0JICogQGV4Y2VwdGlvbiA8bGk+IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb24gY291bGQgbm90IGNvbm5lY3QgdG8gaG9zdDpwb3J0Ci0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiB0aW1lb3V0IGV4Y2VlZGVkCi0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSU9FeGNlcHRpb24gSS9PIGVycm9yCi0JICovCi0Jc3RhdGljIEh0dHBSZXNwb25zZSBkb0dldChVUkwgdXJsLCBQcm9wZXJ0aWVzIGhlYWRlcnMpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCVByb3BlcnRpZXMgcmVzcEhlYWRlcnMgPSBuZXcgUHJvcGVydGllcygpOwotCQlWZWN0b3IgcmVzcENvb2tpZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCUh0dHBVUkxDb25uZWN0aW9uLnNldEZvbGxvd1JlZGlyZWN0cyhmYWxzZSk7Ci0JCUh0dHBVUkxDb25uZWN0aW9uIGNvbm4gPSAoSHR0cFVSTENvbm5lY3Rpb24pdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCS8vY29ubi5zZXRJbnN0YW5jZUZvbGxvd1JlZGlyZWN0cyhmYWxzZSk7IC8vSkRLMS4zCi0JCWNvbm4uc2V0UmVxdWVzdE1ldGhvZCgiR0VUIik7IC8vJE5PTi1OTFMtMSQKLQkJY29ubi5zZXRVc2VDYWNoZXMoZmFsc2UpOwotCQkvLyBzZW5kIGFkZGlvbmFsIGhlYWRlcnMgaWYgYW55Ci0JCWlmKGhlYWRlcnMgIT0gbnVsbCAmJiBoZWFkZXJzLnNpemUoKSA+IDApIHsKLQkJCUVudW1lcmF0aW9uIG5hbWVzID0gaGVhZGVycy5rZXlzKCk7Ci0JCQl3aGlsZShuYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZyluYW1lcy5uZXh0RWxlbWVudCgpOwotCQkJCWlmKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiSG9zdCIpIHx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiVXNlci1BZ2VudCIpIHx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiQ29udGVudC1MZW5ndGgiKSkgY29udGludWU7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJY29ubi5zZXRSZXF1ZXN0UHJvcGVydHkobmFtZSwgaGVhZGVycy5nZXRQcm9wZXJ0eShuYW1lKSk7Ci0JCQl9Ci0JCX0KLQkJaW50IHJlc3BTdGF0dXMgPSBjb25uLmdldFJlc3BvbnNlQ29kZSgpOwotCQlTdHJpbmcgbmFtZTsKLQkJZm9yKGludCBpID0gMTsgKG5hbWUgPSBjb25uLmdldEhlYWRlckZpZWxkS2V5KGkpKSAhPSBudWxsOyBpKyspIHsKLQkJCVN0cmluZyB2YWx1ZSA9IGNvbm4uZ2V0SGVhZGVyRmllbGQobmFtZSk7Ci0JCQlpZihuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInNldC1jb29raWUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJSHR0cFJlc3BvbnNlLkNvb2tpZSBjb29raWUgPSBwYXJzZUNvb2tpZSh2YWx1ZSk7Ci0JCQkJaWYoY29va2llICE9IG51bGwpIHsKLQkJCQkJcmVzcENvb2tpZXMuYWRkRWxlbWVudChjb29raWUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlc3BIZWFkZXJzLnB1dChuYW1lLnRvTG93ZXJDYXNlKCksIHZhbHVlKTsKLQkJCX0KLQkJfQotCQlpbnQgY29udGVudExlbiA9IGNvbm4uZ2V0Q29udGVudExlbmd0aCgpOwotCQlCdWZmZXJlZElucHV0U3RyZWFtIGluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oY29ubi5nZXRJbnB1dFN0cmVhbSgpKTsKLQkJU3RyaW5nIHJlc3AgPSBudWxsOwotCQlpZihjb250ZW50TGVuID4gMCkgewotCQkJLyoKLQkJCWJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbY29udGVudExlbl07Ci0JCQlpbi5yZWFkRnVsbHkoYnVmZik7Ci0JCQlyZXNwID0gbmV3IFN0cmluZyhidWZmKTsKLQkJCSovCi0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtNYXRoLm1pbigyMDQ4LCBjb250ZW50TGVuKV07Ci0JCQlpbnQgbnVtOwotCQkJd2hpbGUoKG51bSA9IGluLnJlYWQoYnVmZikpICE9IC0xKSB7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIm51bT0iK251bSk7Ci0JCQkJaW50IG4gPSBjb250ZW50TGVuIC0gYm9zLnNpemUoKTsKLQkJCQlpZihuIDw9IG51bSkgewotCQkJCQlib3Mud3JpdGUoYnVmZiwgMCwgbik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlib3Mud3JpdGUoYnVmZiwgMCwgbnVtKTsKLQkJCX0KLQkJCXJlc3AgPSBib3MudG9TdHJpbmcoKTsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRMZW4gPCAwKSB7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVsyMDQ4XTsKLQkJCWludCBudW07Ci0JCQl3aGlsZSgobnVtID0gaW4ucmVhZChidWZmKSkgIT0gLTEpIHsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibnVtPSIrbnVtKTsKLQkJCQlib3Mud3JpdGUoYnVmZiwgMCwgbnVtKTsKLQkJCX0KLQkJCXJlc3AgPSBib3MudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gbmV3IEh0dHBSZXNwb25zZShyZXNwU3RhdHVzLCByZXNwSGVhZGVycywgcmVzcENvb2tpZXMsIHJlc3ApOwotCX0KLQotCS8qKgotCSAqIERvIGEgUE9TVAotCSAqCi0JICogQHJldHVybiByZXNwb25zZQotCSAqIEBleGNlcHRpb24gPGxpPiBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uIGNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3Q6cG9ydAotCSAqICAgICAgICAgICAgPGxpPiBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb24gdGltZW91dCBleGNlZWRlZAotCSAqICAgICAgICAgICAgPGxpPiBqYXZhLmlvLklPRXhjZXB0aW9uIEkvTyBlcnJvcgotCSAqLwotCXN0YXRpYyBIdHRwUmVzcG9uc2UgZG9Qb3N0KFN0cmluZyB1cmwsIFByb3BlcnRpZXMgaGVhZGVycywgUHJvcGVydGllcyBkYXRhLCBpbnQgdGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGRvUG9zdChuZXcgVVJMKChVUkwpbnVsbCwgdXJsLCBnZXRIYW5kbGVyKHRpbWVvdXQpKSwgaGVhZGVycywgZGF0YSk7Ci0JfQotCi0JLyoqCi0JICogRG8gYSBQT1NUCi0JICoKLQkgKiBAcmV0dXJuIHJlc3BvbnNlCi0JICogQGV4Y2VwdGlvbiA8bGk+IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb24gY291bGQgbm90IGNvbm5lY3QgdG8gaG9zdDpwb3J0Ci0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiB0aW1lb3V0IGV4Y2VlZGVkCi0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSU9FeGNlcHRpb24gSS9PIGVycm9yCi0JICovCi0Jc3RhdGljIEh0dHBSZXNwb25zZSBkb1Bvc3QoVVJMIHVybCwgUHJvcGVydGllcyBoZWFkZXJzLCBQcm9wZXJ0aWVzIGRhdGEpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCVByb3BlcnRpZXMgcmVzcEhlYWRlcnMgPSBuZXcgUHJvcGVydGllcygpOwotCQlWZWN0b3IgcmVzcENvb2tpZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCUh0dHBVUkxDb25uZWN0aW9uLnNldEZvbGxvd1JlZGlyZWN0cyhmYWxzZSk7Ci0JCUh0dHBVUkxDb25uZWN0aW9uIGNvbm4gPSAoSHR0cFVSTENvbm5lY3Rpb24pdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCS8vY29ubi5zZXRJbnN0YW5jZUZvbGxvd1JlZGlyZWN0cyhmYWxzZSk7IC8vSkRLMS4zCi0JCWNvbm4uc2V0UmVxdWVzdE1ldGhvZCgiUE9TVCIpOyAvLyROT04tTkxTLTEkCi0JCWNvbm4uc2V0VXNlQ2FjaGVzKGZhbHNlKTsKLQkJY29ubi5zZXREb091dHB1dCh0cnVlKTsKLQkJY29ubi5zZXREb0lucHV0KHRydWUpOwotCQkvLyBzZW5kIGFkZGlvbmFsIGhlYWRlcnMgaWYgYW55Ci0JCWlmKGhlYWRlcnMgIT0gbnVsbCAmJiBoZWFkZXJzLnNpemUoKSA+IDApIHsKLQkJCUVudW1lcmF0aW9uIG5hbWVzID0gaGVhZGVycy5rZXlzKCk7Ci0JCQl3aGlsZShuYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZyluYW1lcy5uZXh0RWxlbWVudCgpOwotCQkJCWlmKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiSG9zdCIpIHx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiVXNlci1BZ2VudCIpIHx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiQ29udGVudC1MZW5ndGgiKSkgY29udGludWU7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJY29ubi5zZXRSZXF1ZXN0UHJvcGVydHkobmFtZSwgaGVhZGVycy5nZXRQcm9wZXJ0eShuYW1lKSk7Ci0JCQl9Ci0JCX0KLQkJRGF0YU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShjb25uLmdldE91dHB1dFN0cmVhbSgpKTsKLQotCQlTdHJpbmcgY29udGVudCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUVudW1lcmF0aW9uIGVudSA9IGRhdGEucHJvcGVydHlOYW1lcygpOwotCQl3aGlsZShlbnUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVN0cmluZyBuYW1lID0gKFN0cmluZyllbnUubmV4dEVsZW1lbnQoKTsKLQkJCWNvbnRlbnQgKz0gKG5hbWUgKyAiPSIgKyBVUkxFbmNvZGVyLmVuY29kZShkYXRhLmdldFByb3BlcnR5KG5hbWUpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKGVudS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCWNvbnRlbnQgKz0gIiYiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJaWYoY29udGVudC5sZW5ndGgoKSA+IDApIHsKLQkJCW91dC53cml0ZUJ5dGVzKGNvbnRlbnQpOwotCQl9Ci0KLQkJaW50IHJlc3BTdGF0dXMgPSBjb25uLmdldFJlc3BvbnNlQ29kZSgpOwotCQlTdHJpbmcgbmFtZTsKLQkJZm9yKGludCBpID0gMTsgKG5hbWUgPSBjb25uLmdldEhlYWRlckZpZWxkS2V5KGkpKSAhPSBudWxsOyBpKyspIHsKLQkJCVN0cmluZyB2YWx1ZSA9IGNvbm4uZ2V0SGVhZGVyRmllbGQobmFtZSk7Ci0JCQlpZihuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInNldC1jb29raWUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJSHR0cFJlc3BvbnNlLkNvb2tpZSBjb29raWUgPSBwYXJzZUNvb2tpZSh2YWx1ZSk7Ci0JCQkJaWYoY29va2llICE9IG51bGwpIHsKLQkJCQkJcmVzcENvb2tpZXMuYWRkRWxlbWVudChjb29raWUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlc3BIZWFkZXJzLnB1dChuYW1lLnRvTG93ZXJDYXNlKCksIHZhbHVlKTsKLQkJCX0KLQkJfQotCQlpbnQgY29udGVudExlbiA9IGNvbm4uZ2V0Q29udGVudExlbmd0aCgpOwotCQlCdWZmZXJlZElucHV0U3RyZWFtIGluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oY29ubi5nZXRJbnB1dFN0cmVhbSgpKTsKLQkJU3RyaW5nIHJlc3AgPSBudWxsOwotCQlpZihjb250ZW50TGVuID4gMCkgewotCQkJLyoKLQkJCWJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbY29udGVudExlbl07Ci0JCQlpbi5yZWFkRnVsbHkoYnVmZik7Ci0JCQlyZXNwID0gbmV3IFN0cmluZyhidWZmKTsKLQkJCSovCi0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtNYXRoLm1pbigyMDQ4LCBjb250ZW50TGVuKV07Ci0JCQlpbnQgbnVtOwotCQkJd2hpbGUoKG51bSA9IGluLnJlYWQoYnVmZikpICE9IC0xKSB7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIm51bT0iK251bSk7Ci0JCQkJaW50IG4gPSBjb250ZW50TGVuIC0gYm9zLnNpemUoKTsKLQkJCQlpZihuIDw9IG51bSkgewotCQkJCQlib3Mud3JpdGUoYnVmZiwgMCwgbik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlib3Mud3JpdGUoYnVmZiwgMCwgbnVtKTsKLQkJCX0KLQkJCXJlc3AgPSBib3MudG9TdHJpbmcoKTsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRMZW4gPCAwKSB7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVsyMDQ4XTsKLQkJCWludCBudW07Ci0JCQl3aGlsZSgobnVtID0gaW4ucmVhZChidWZmKSkgIT0gLTEpIHsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibnVtPSIrbnVtKTsKLQkJCQlib3Mud3JpdGUoYnVmZiwgMCwgbnVtKTsKLQkJCX0KLQkJCXJlc3AgPSBib3MudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gbmV3IEh0dHBSZXNwb25zZShyZXNwU3RhdHVzLCByZXNwSGVhZGVycywgcmVzcENvb2tpZXMsIHJlc3ApOwotCX0KLQotCS8qKgotCSAqIERvIGEgUE9TVCB1c2luZyBsb3cgbGV2ZWwgc29ja2V0IHRvIGhhdmUgY29udHJvbCBvdmVyIHRpbWVvdXQKLQkgKgotCSAqIEByZXR1cm4gcmVzcG9uc2UKLQkgKiBAZXhjZXB0aW9uIDxsaT4gamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbiBjb3VsZCBub3QgY29ubmVjdCB0byBob3N0OnBvcnQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uIHRpbWVvdXQgZXhjZWVkZWQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JT0V4Y2VwdGlvbiBJL08gZXJyb3IKLQkgKiAgICAgICAgICAgIDxsaT4gQ2F0YUh0dHBFeGNlcHRpb24gaW52YWxpZCByZXNwb25zZSBmcm9tIHNlcnZlcgotCSAqLwotCXN0YXRpYyBIdHRwUmVzcG9uc2UgZG9Qb3N0KFNvY2tldCBzb2NrLCBTdHJpbmcgdXJsLCBQcm9wZXJ0aWVzIGhlYWRlcnMsIFByb3BlcnRpZXMgZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJaW50IHJlc3BTdGF0dXM7Ci0JCVByb3BlcnRpZXMgcmVzcEhlYWRlcnMgPSBuZXcgUHJvcGVydGllcygpOwotCQlWZWN0b3IgcmVzcENvb2tpZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCVN0cmluZyByZXNwID0gbnVsbDsKLQkJRGF0YU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotCQlEYXRhSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQl0cnkgewotCQkJU3RyaW5nIGhvc3QgPSBzb2NrLmdldEluZXRBZGRyZXNzKCkuZ2V0SG9zdE5hbWUoKTsKLQkJCWludCBwb3J0ID0gc29jay5nZXRQb3J0KCk7Ci0JCQlvdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShzb2NrLmdldE91dHB1dFN0cmVhbSgpKTsKLQkJCWluID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzb2NrLmdldElucHV0U3RyZWFtKCkpKTsKLQkJCVN0cmluZyBjb250ZW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCUVudW1lcmF0aW9uIGVudSA9IGRhdGEucHJvcGVydHlOYW1lcygpOwotCQkJd2hpbGUoZW51Lmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWVudS5uZXh0RWxlbWVudCgpOwotCQkJCWNvbnRlbnQgKz0gKG5hbWUgKyAiPSIgKyBVUkxFbmNvZGVyLmVuY29kZShkYXRhLmdldFByb3BlcnR5KG5hbWUpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZihlbnUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQkJY29udGVudCArPSAiJiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQkvL2xvZ2dlci5kZWJ1ZygicG9zdGRhdGE9Iitjb250ZW50KTsKLQkJCW91dC53cml0ZUJ5dGVzKCJQT1NUICIgKyB1cmwgKyAiIEhUVFAvMS4xXHJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCW91dC53cml0ZUJ5dGVzKCJIb3N0OiAiICsgaG9zdCArICI6IiArIHBvcnQgKyAiXHJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJb3V0LndyaXRlQnl0ZXMoIlVzZXItQWdlbnQ6IE1vemlsbGEvNC4wXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkvL291dC53cml0ZUJ5dGVzKCJBY2NlcHQ6IHRleHQvaHRtbCIpOwotCQkJb3V0LndyaXRlQnl0ZXMoIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlvdXQud3JpdGVCeXRlcygiQ29udGVudC1MZW5ndGg6ICIgKyBjb250ZW50Lmxlbmd0aCgpICsgIlxyXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkvLyBzZW5kIGFkZGlvbmFsIGhlYWRlcnMgaWYgYW55Ci0JCQlpZihoZWFkZXJzICE9IG51bGwgJiYgaGVhZGVycy5zaXplKCkgPiAwKSB7Ci0JCQkJRW51bWVyYXRpb24gbmFtZXMgPSBoZWFkZXJzLmtleXMoKTsKLQkJCQl3aGlsZShuYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpbmFtZXMubmV4dEVsZW1lbnQoKTsKLQkJCQkJaWYobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJIb3N0IikgfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJVc2VyLUFnZW50IikgfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJDb250ZW50LUxlbmd0aCIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQl8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkNvbnRlbnQtVHlwZSIpKSBjb250aW51ZTsgLy8kTk9OLU5MUy0xJAotCQkJCQlvdXQud3JpdGVCeXRlcyhuYW1lICsgIjogIiArIGhlYWRlcnMuZ2V0UHJvcGVydHkobmFtZSkgKyAiXHJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCQlvdXQud3JpdGVCeXRlcygiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZihjb250ZW50Lmxlbmd0aCgpID4gMCkgewotCQkJCW91dC53cml0ZUJ5dGVzKGNvbnRlbnQpOwotCQkJfQotCQkJb3V0LmZsdXNoKCk7Ci0JCQlTdHJpbmcgbGluZTsKLQkJCWJvb2xlYW4gZW5kRm91bmQgPSBmYWxzZTsKLQkJCWludCBjb250ZW50TGVuID0gLTE7Ci0JCQlmaW5hbCBTdHJpbmcgY29udGVudExlbkhlYWRlciA9ICJjb250ZW50LWxlbmd0aDogIjsgLy8kTk9OLU5MUy0xJAotCQkJaW50IGNvbnRlbnRMZW5IZWFkZXJMZW4gPSBjb250ZW50TGVuSGVhZGVyLmxlbmd0aCgpOwotCQkJU3RyaW5nIGh0dHBSZXNwID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gcmVhZCB0aGUgZmlyc3QgbGluZQotCQkJbGluZSA9IGluLnJlYWRMaW5lKCk7Ci0JCQkvL2xvZ2dlci5kZWJ1ZygibGluZT0iK2xpbmUpOwotCQkJaWYobGluZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihQdWJsaXNoaW5nUmVzb3VyY2VzLnNlcnZlckVycm9yX21zZyk7IAotCQkJfQotCQkJaHR0cFJlc3AgKz0gbGluZSArICJcbiI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGxpbmUpOwotCQkJdHJ5IHsKLQkJCQkvLyBza2lwIHRoZSBmaXJzdCB0b2tlbiB3aGljaCBpcyAiSFRUUC8xLjEiIG9yICJIVFRQLzEuMCIKLQkJCQl0b2tlbnMubmV4dFRva2VuKCk7Ci0JCQkJcmVzcFN0YXR1cyA9IEludGVnZXIucGFyc2VJbnQodG9rZW5zLm5leHRUb2tlbigpKTsKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKE5MUy5iaW5kKFB1Ymxpc2hpbmdSZXNvdXJjZXMuaW52YWxpZEh0dHBSZXNwb25zZUVycm9yX21zZywgKG5ldyBPYmplY3RbXXtob3N0LCBJbnRlZ2VyLnRvU3RyaW5nKHBvcnQpLCBsaW5lfSkpKTsgCi0JCQl9Ci0KLQkJCS8vIHJlYWQgdGhlIGhlYWRlcnMKLQkJCXdoaWxlKChsaW5lID0gaW4ucmVhZExpbmUoKSkgIT0gbnVsbCkgewotCQkJCS8vbG9nZ2VyLmRlYnVnKCJsaW5lPSIrbGluZSk7Ci0JCQkJaHR0cFJlc3AgKz0gbGluZSArICJcbiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZihsaW5lLmxlbmd0aCgpID09IDApIHsKLQkJCQkJZW5kRm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaW50IGlkID0gbGluZS5pbmRleE9mKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYoaWQgPiAwKSB7Ci0JCQkJCVN0cmluZyBoZWFkZXIgPSBsaW5lLnN1YnN0cmluZygwLCBpZCkudG9Mb3dlckNhc2UoKTsKLQkJCQkJU3RyaW5nIHZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYobGluZS5sZW5ndGgoKSA+IGlkICsgMikgewotCQkJCQkJdmFsdWUgPSBsaW5lLnN1YnN0cmluZyhpZCArIDIpOwotCQkJCQl9Ci0KLQkJCQkJaWYoaGVhZGVyLmVxdWFscygic2V0LWNvb2tpZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCUh0dHBSZXNwb25zZS5Db29raWUgY29va2llID0gcGFyc2VDb29raWUodmFsdWUpOwotCQkJCQkJaWYoY29va2llICE9IG51bGwpIHsKLQkJCQkJCQlyZXNwQ29va2llcy5hZGRFbGVtZW50KGNvb2tpZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXNwSGVhZGVycy5wdXQoaGVhZGVyLCB2YWx1ZSk7Ci0JCQkJCX0KLQotCQkJCQkvL3Jlc3BIZWFkZXJzLnB1dChoZWFkZXIsIHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlTdHJpbmcgY29udGVudExlblN0ciA9IHJlc3BIZWFkZXJzLmdldFByb3BlcnR5KCJjb250ZW50LWxlbmd0aCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZihjb250ZW50TGVuU3RyID09IG51bGwpIHsKLQkJCQljb250ZW50TGVuID0gMDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNvbnRlbnRMZW4gPSBJbnRlZ2VyLnBhcnNlSW50KGNvbnRlbnRMZW5TdHIpOwotCQkJfQotCQkJaWYoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKysrK0JFR0lOIEhFQURFUlMrKysrIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihodHRwUmVzcCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIisrKytFTkQgSEVBREVSUysrKysiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYoIWVuZEZvdW5kIHx8IGNvbnRlbnRMZW4gPT0gLTEpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKE5MUy5iaW5kKFB1Ymxpc2hpbmdSZXNvdXJjZXMuaW52YWxpZEh0dHBSZXNwb25zZUVycm9yX21zZywgKG5ldyBPYmplY3RbXXtob3N0LCBJbnRlZ2VyLnRvU3RyaW5nKHBvcnQpLCBodHRwUmVzcH0pKSk7IAotCQkJfQotCQkJaWYoY29udGVudExlbiA+IDApIHsKLQkJCQlieXRlW10gYnVmZiA9IG5ldyBieXRlW2NvbnRlbnRMZW5dOwotCQkJCWluLnJlYWRGdWxseShidWZmKTsKLQkJCQlyZXNwID0gbmV3IFN0cmluZyhidWZmKTsKLQkJCX0KLQkJCWVsc2UgaWYoY29udGVudExlblN0ciA9PSBudWxsKSB7Ci0JCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQlieXRlW10gYnVmZiA9IG5ldyBieXRlWzIwNDhdOwotCQkJCWludCBudW07Ci0JCQkJd2hpbGUoKG51bSA9IGluLnJlYWQoYnVmZikpICE9IC0xKSB7Ci0JCQkJCWJvcy53cml0ZShidWZmLCAwLCBudW0pOwotCQkJCX0KLQkJCQlyZXNwID0gYm9zLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0cnkgeyBpbi5jbG9zZSgpOyB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7fQotCQkJdHJ5IHsgb3V0LmNsb3NlKCk7IH0gY2F0Y2goRXhjZXB0aW9uIGUpIHt9Ci0JCX0KLQkJcmV0dXJuIG5ldyBIdHRwUmVzcG9uc2UocmVzcFN0YXR1cywgcmVzcEhlYWRlcnMsIHJlc3BDb29raWVzLCByZXNwKTsKLQl9Ci0KLQkvKioKLQkgKiBEbyBhIFBPU1QgdXNpbmcgbG93IGxldmVsIHNvY2tldCB0byBoYXZlIGNvbnRyb2wgb3ZlciB0aW1lb3V0Ci0JICoKLQkgKiBAcmV0dXJuIHJlc3BvbnNlCi0JICogQGV4Y2VwdGlvbiA8bGk+IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb24gY291bGQgbm90IGNvbm5lY3QgdG8gaG9zdDpwb3J0Ci0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiB0aW1lb3V0IGV4Y2VlZGVkCi0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSU9FeGNlcHRpb24gSS9PIGVycm9yCi0JICogICAgICAgICAgICA8bGk+IENhdGFIdHRwRXhjZXB0aW9uIGludmFsaWQgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEh0dHBSZXNwb25zZSBkb1Bvc3QoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgdXJsLCBpbnQgdGltZW91dCwKLQkJUHJvcGVydGllcyBoZWFkZXJzLCBQcm9wZXJ0aWVzIGRhdGEpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCVNvY2tldCBzb2NrID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNvY2sgPSBuZXcgU29ja2V0KGhvc3QsIHBvcnQpOwotCQkJc29jay5zZXRTb1RpbWVvdXQodGltZW91dCk7Ci0JCQlyZXR1cm4gZG9Qb3N0KHNvY2ssIHVybCwgaGVhZGVycywgZGF0YSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0cnkgeyBzb2NrLmNsb3NlKCk7IH0gY2F0Y2goRXhjZXB0aW9uIGUpIHt9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgYSBxdWVyeSBzdHJpbmcgYW5kIFVSTC1kZWNvZGVzIHRoZSBwYXJhbWV0ZXIgdmFsdWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgcGFyc2VRdWVyeVN0cmluZyhTdHJpbmcgc3RyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCAiJiIpOyAvLyROT04tTkxTLTEkCi0JCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlpbnQgbWF4SWQgPSBzdHIubGVuZ3RoKCkgLSAxOwotCQl3aGlsZSh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCk7Ci0JCQlpbnQgaWQgPSB0b2tlbi5pbmRleE9mKCc9Jyk7Ci0JCQlpZihpZCA9PSAtMSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZSBpZihpZCA9PSAwIHx8IGlkID09IG1heElkKSB7Ci0JCQkJbWFwLnB1dCh0b2tlbiwgbnVsbCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltYXAucHV0KHRva2VuLnN1YnN0cmluZygwLCBpZCksIHVybERlY29kZSh0b2tlbi5zdWJzdHJpbmcoaWQgKyAxKSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIHRoZSBjb29raWUgZnJvbSB0aGUgdmFsdWUgb2YgcmVzcG9uc2UgaGVhZGVyIFNldC1Db29raWUKLQkgKi8KLSAgICBwdWJsaWMgc3RhdGljIEh0dHBSZXNwb25zZS5Db29raWUgcGFyc2VDb29raWUoU3RyaW5nIHN0cikgewotICAgIAkvL2xvZ2dlci5kZWJ1ZyhzdHIpOwotICAgIAlpbnQgaWQgPSBzdHIuaW5kZXhPZignPScpOwotICAgIAlpZihpZCA8PSAwKSByZXR1cm4gbnVsbDsKLSAgICAJU3RyaW5nIG5hbWUgPSBzdHIuc3Vic3RyaW5nKDAsIGlkKTsKLSAgICAJaW50IGZyb21JZCA9bmFtZS5sZW5ndGgoKSArIDE7Ci0gICAgCWludCB0b0lkID0gc3RyLmluZGV4T2YoIjsiKTsgLy8kTk9OLU5MUy0xJAotICAgIAlTdHJpbmcgdmFsdWU7Ci0gICAgCVN0cmluZyB0aGVSZXN0ID0gbnVsbDsKLSAgICAJaWYodG9JZCA9PSAtMSkgewotICAgIAkJdmFsdWUgPSBzdHIuc3Vic3RyaW5nKGZyb21JZCk7Ci0gICAgCX0KLSAgICAJZWxzZSB7Ci0gICAgCQl2YWx1ZSA9IHN0ci5zdWJzdHJpbmcoZnJvbUlkLCB0b0lkKTsKLSAgICAJCWlmKHRvSWQgPCBzdHIubGVuZ3RoKCkgLSAxKSB7Ci0gICAgCQkJdGhlUmVzdCA9IHN0ci5zdWJzdHJpbmcodG9JZCArIDEpOwotICAgIAkJfQotICAgIAl9Ci0gICAgCUh0dHBSZXNwb25zZS5Db29raWUgY29va2llID0gbmV3IEh0dHBSZXNwb25zZS5Db29raWUobmFtZSwgdmFsdWUpOwotICAgIAlpZih0aGVSZXN0ICE9IG51bGwpIHsKLSAgICAJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRoZVJlc3QsICI7Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAJCXdoaWxlKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAJCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCkudHJpbSgpOwotICAgIAkJCWlkID0gdG9rZW4uaW5kZXhPZignPScpOwotICAgIAkJCWlmKGlkIDw9IDApIGNvbnRpbnVlOwotICAgIAkJCW5hbWUgPSB0b2tlbi5zdWJzdHJpbmcoMCwgaWQpOwotICAgIAkJCWlmKGlkID09IHRva2VuLmxlbmd0aCgpIC0gMSkgewotICAgIAkJCQl2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgCQkJfQotICAgIAkJCWVsc2UgewotICAgIAkJCQl2YWx1ZSA9IHRva2VuLnN1YnN0cmluZyhpZCArIDEpOwotICAgIAkJCX0KLSAgICAJCQlpZihuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImRvbWFpbiIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAJCQkJY29va2llLnNldERvbWFpbih2YWx1ZSk7Ci0gICAgCQkJfQotICAgIAkJCWVsc2UgaWYobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJwYXRoIikpIHsgLy8kTk9OLU5MUy0xJAotICAgIAkJCQljb29raWUuc2V0UGF0aCh2YWx1ZSk7Ci0JCQkJfQotCQkJfQotICAgICAgICB9Ci0KLSAgICAJcmV0dXJuIGNvb2tpZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIGNvb2tpZXMgZnJvbSB0aGUgdmFsdWUgb2YgcmVxdWVzdCBoZWFkZXIgQ29va2llCi0gICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiBIdHRwUmVzcG9uc2UuQ29va2llIG9iamVjdHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVudW1lcmF0aW9uIHBhcnNlQ29va2llcyhTdHJpbmcgc3RyKSB7Ci0gICAgCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0ciwgIjsiKTsgLy8kTk9OLU5MUy0xJAotICAgIAlWZWN0b3IgY29va2llcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAJd2hpbGUodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotICAgIAkJU3RyaW5nIHRva2VuID0gdG9rZW5zLm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICAJCWludCBpZCA9IHRva2VuLmluZGV4T2YoJz0nKTsKLSAgICAJCWlmKGlkID09IC0xKSBjb250aW51ZTsKLSAgICAJCVN0cmluZyBuYW1lID0gdG9rZW4uc3Vic3RyaW5nKDAsIGlkKTsKLSAgICAJCVN0cmluZyB2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgCQlpZihpZCA8IHRva2VuLmxlbmd0aCgpIC0gMSkgewotICAgIAkJCXZhbHVlID0gdG9rZW4uc3Vic3RyaW5nKGlkICsgMSk7Ci0gICAgCQl9Ci0gICAgCQlpZihERUJVRykgU3lzdGVtLm91dC5wcmludGxuKG5hbWUrIj0iK3ZhbHVlKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJY29va2llcy5hZGRFbGVtZW50KG5ldyBIdHRwUmVzcG9uc2UuQ29va2llKG5hbWUsIHZhbHVlKSk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIGNvb2tpZXMuZWxlbWVudHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0Nvb2tpZVN0cmluZyhFbnVtZXJhdGlvbiBjb29raWVzKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXdoaWxlKGNvb2tpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCUh0dHBSZXNwb25zZS5Db29raWUgY29va2llID0gKEh0dHBSZXNwb25zZS5Db29raWUpY29va2llcy5uZXh0RWxlbWVudCgpOwotCQkJc3RyQnVmLmFwcGVuZChjb29raWUuZ2V0TmFtZSgpKS5hcHBlbmQoJz0nKS5hcHBlbmQoY29va2llLmdldFZhbHVlKCkpLmFwcGVuZCgiOyAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLSAgICB9Ci0KLQkvKioKLQkqIFRoaXMgdXRpbGl0eSBtZXRob2QgaXMgZm9yIGNvbnZlcnRpbmcgZnJvbQotCSogYSBNSU1FIGZvcm1hdCBjYWxsZWQgIjxjb2RlPngtd3d3LWZvcm0tdXJsZW5jb2RlZDwvY29kZT4iCi0JKiB0byBhIDxjb2RlPlN0cmluZzwvY29kZT4KLQkqIDxwPgotCSogVG8gY29udmVydCB0byBhIDxjb2RlPlN0cmluZzwvY29kZT4sIGVhY2ggY2hhcmFjdGVyIGlzIGV4YW1pbmVkIGluIHR1cm46Ci0JKiA8dWw+Ci0JKiA8bGk+VGhlIEFTQ0lJIGNoYXJhY3RlcnMgJzxjb2RlPmE8L2NvZGU+JyB0aHJvdWdoICc8Y29kZT56PC9jb2RlPicsCi0JKiAnPGNvZGU+QTwvY29kZT4nIHRocm91Z2ggJzxjb2RlPlo8L2NvZGU+JywgYW5kICc8Y29kZT4wPC9jb2RlPicKLQkqIHRocm91Z2ggJzxjb2RlPjk8L2NvZGU+JyByZW1haW4gdGhlIHNhbWUuCi0JKiA8bGk+VGhlIHBsdXMgc2lnbiAnPGNvZGU+KzwvY29kZT4naXMgY29udmVydGVkIGludG8gYQotCSogc3BhY2UgY2hhcmFjdGVyICc8Y29kZT4mbmJzcDs8L2NvZGU+Jy4KLQkqIDxsaT5UaGUgcmVtYWluaW5nIGNoYXJhY3RlcnMgYXJlIHJlcHJlc2VudGVkIGJ5IDMtY2hhcmFjdGVyCi0JKiBzdHJpbmdzIHdoaWNoIGJlZ2luIHdpdGggdGhlIHBlcmNlbnQgc2lnbiwKLQkqICI8Y29kZT4lPGk+eHk8L2k+PC9jb2RlPiIsIHdoZXJlIDxpPnh5PC9pPiBpcyB0aGUgdHdvLWRpZ2l0Ci0JKiBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbG93ZXIgOC1iaXRzIG9mIHRoZSBjaGFyYWN0ZXIuCi0JKiA8L3VsPgotCSoKLQkqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVybERlY29kZShTdHJpbmcgcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8cy5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKLSAgICAgICAgICAgIHN3aXRjaCAoYykgewotICAgICAgICAgICAgICAgIGNhc2UgJysnOgotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnJSc6Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpSW50ZWdlci5wYXJzZUludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnN1YnN0cmluZyhpKzEsaSszKSwxNikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBVbmRvIGNvbnZlcnNpb24gdG8gZXh0ZXJuYWwgZW5jb2RpbmcKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgIGJ5dGVbXSBpbnB1dEJ5dGVzID0gcmVzdWx0LmdldEJ5dGVzKCI4ODU5XzEiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhpbnB1dEJ5dGVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJLy9TeXN0ZW0ub3V0LnByaW50bG4oZG9HZXQoYXJnc1swXSwgbnVsbCwgMCkpOwotICAgIAlTdHJpbmcgdXJsID0gYXJnc1swXTsKLSAgICAJU3RyaW5nIHVpZCA9IGFyZ3NbMV07Ci0gICAgCVN0cmluZyBlbWFpbCA9IGFyZ3NbMl07Ci0gICAgCVByb3BlcnRpZXMgZGF0YSA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgCWRhdGEucHV0KCJ1aWQiLCB1aWQpOyAvLyROT04tTkxTLTEkCi0gICAgCWRhdGEucHV0KCJlbWFpbCIsIGVtYWlsKTsgLy8kTk9OLU5MUy0xJAotICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oZG9Qb3N0KHVybCwgbnVsbCwgZGF0YSwgMCkpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL1RpbWVvdXRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvVGltZW91dEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmZjZGViNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvVGltZW91dEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnV0aWwuaHR0cDsKLQotaW50ZXJmYWNlIFRpbWVvdXRIYW5kbGVyIHsKLSAgICB2b2lkIHNldFRpbWVvdXQoaW50IHRpbWVvdXQpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0ZGNmODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIGNoZWNraW5nIGV4dGVybmFsIGxpbmtzIGluIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDRhNWUyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIHRoZSBwdWJsaXNoaW5nIHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvUHVibGlzaGVkQm9va21hcmtzLnhzbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL1B1Ymxpc2hlZEJvb2ttYXJrcy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhiZjcyZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvUHVibGlzaGVkQm9va21hcmtzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB4bWxuczpmbz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvRm9ybWF0Ij4KLQk8eHNsOnBhcmFtIG5hbWU9IndoZXJlQW1JVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idHJlZVNldHNUZXh0Ii8+Ci0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQm9va21hcmtzIj4KLQkJPGh0bWw+Ci0JCQk8aGVhZD4KLQkJCQk8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotYm9keSB7Ci0gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwcHg7Ci0gICAgICAgIG1hcmdpbi1yaWdodDogMHB4OwotICAgICAgICBtYXJnaW4tdG9wOiAwcHg7Ci0gICAgICAgIG1hcmdpbi1ib3R0b206IDBweDsKLSAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi10ZC5tZW51IHsKLSAgICAgICAgYmFja2dyb3VuZDojMDA2Njk5OwotfQotCi1zcGFuLm1lbnUgewotICAgICAgICBjdXJzb3IgOiBoYW5kOwotICAgICAgICBmb250LXNpemU6IDhwdDsKLSAgICAgICAgY29sb3I6ICNmZmZmZmY7Ci0gICAgICAgIHdoaXRlLXNwYWNlOm5vd3JhcDsKLSAgICAgICAgcGFkZGluZy1yaWdodDogMC41ZW07Ci0gICAgICAgIGJvcmRlci1yaWdodDogMnB4IHNvbGlkICNmZmZmZmY7Ci19Ci0KLXNwYW4ubWVudSBpbWcgewotICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwotfQotCi10ZC50YWIgewotICAgICAgICBiYWNrZ3JvdW5kOiNmZmZmZmY7Ci0gICAgICAgIHBhZGRpbmctdG9wOiAxcHg7Ci0gICAgICAgIHBhZGRpbmctYm90dG9tOiAxcHg7Ci19Ci0KLXNwYW4udGFiLCBzcGFuLnNlbGVjdGVkVGFiIHsKLQljdXJzb3I6IHBvaW50ZXI7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgd2hpdGUtc3BhY2U6bm93cmFwOwotICAgICAgICBsaW5lLWhlaWdodDogMS40ZW07Ci19Ci0KLXNwYW4udGFiIHsKLSAgICAgICAgYmFja2dyb3VuZDojYzBjMGMwOwotICAgICAgICBib3JkZXItdG9wOiAgIDFweCBzb2xpZCAjNjY2NjY2OwotICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjNjY2NjY2OwotICAgICAgICBib3JkZXItbGVmdDogIDFweCBzb2xpZCAjNjY2NjY2OwotfQotCi1zcGFuLnNlbGVjdGVkVGFiIHsKLSAgICAgICAgYmFja2dyb3VuZDojZTBlMGUwOwotICAgICAgICBib3JkZXItdG9wOiAgIDFweCBzb2xpZCAjYTBhMGEwOwotICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjYTBhMGEwOwotICAgICAgICBib3JkZXItbGVmdDogIDFweCBzb2xpZCAjYTBhMGEwOwotfQotCi10ZC50cmVlIHsKLSAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICM5OTk5OTk7Ci19Ci08L3N0eWxlPgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJvb2ttYXJrdmlld3MuanMiPgotPC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdD4KLWZ1bmN0aW9uIGNoZWNrS2V5KGUsIGZ1bmMpIHsKLSAgICAgICAgaWYgKHdpbmRvdy5ldmVudCkgewotICAgICAgICAgICAgICAgIGtleSA9IHdpbmRvdy5ldmVudC5rZXlDb2RlOwotICAgICAgICAgICAgICAgIHRhcmdldCA9IHdpbmRvdy5ldmVudC5zcmNFbGVtZW50OwotICAgICAgICB9IGVsc2UgaWYgKGUpIHsKLSAgICAgICAgICAgICAgICBrZXkgPSBlLndoaWNoOwotICAgICAgICAgICAgICAgIHRhcmdldCA9IGUudGFyZ2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGtleT09MTMgfHwga2V5PT0zMikgewotICAgICAgICAgICAgICAgIGZ1bmModGFyZ2V0KTsKLSAgICAgICAgfQotfQotPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keSBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIwIiBvbmxvYWQ9ImluaXQoKTsiPgotCQkJCTx0YWJsZSBjZWxsc3BhY2luZz0iMXB4IiBjZWxscGFkZGluZz0iMHB4IiBib3JkZXI9IjAiIGhlaWdodD0iMTAwJSIgd2lkdGg9IjEwMCUiPgotCQkJCQk8IS0tIGFkZCB0aGUgdGFiIG1lbnVzIC0tPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgY2xhc3M9Im1lbnUiPgotCQkJCQkJCTx4c2w6dGV4dD4KLTwveHNsOnRleHQ+Ci0JCQkJCQkJPHNwYW4gY2xhc3M9Im1lbnUiIHRhYmluZGV4PSIxIiBvbmNsaWNrPSJ3aGVyZUFtSSgpOyIgb25rZXlwcmVzcz0iY2hlY2tLZXkoZXZlbnQsIHdoZXJlQW1JKTsiPgotCQkJCQkJCQk8aW1nIGFsdD0iIiB0aXRsZT0iIiBzcmM9ImltYWdlcy9uaV93aGVyZS5naWYiLz4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3aGVyZUFtSVRleHQiLz4KLQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJPHhzbDp0ZXh0PgotPC94c2w6dGV4dD4KLQkJCQkJCQk8c3BhbiBjbGFzcz0ibWVudSIgdGFiaW5kZXg9IjEiIG9uY2xpY2s9InRvZ1ZpZXdzKCk7IiBvbmtleXByZXNzPSJjaGVja0tleShldmVudCwgdG9nVmlld3MpOyI+Ci0JCQkJCQkJCTxpbWcgYWx0PSIiIHRpdGxlPSIiIHNyYz0iaW1hZ2VzL2FjdGlvbl91bmhpZGUuZ2lmIi8+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdHJlZVNldHNUZXh0Ii8+Ci0JCQkJCQkJPC9zcGFuPgotCQkJCQkJCTx4c2w6dGV4dD4KLTwveHNsOnRleHQ+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCQk8IS0tIGxvYWQgdGhlIHRhYnMgLS0+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCBjbGFzcz0idGFiIj4KLQkJCQkJCQk8eHNsOnRleHQ+Ci08L3hzbDp0ZXh0PgotCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJCb29rbWFyayI+Ci0JCQkJCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0icG9zIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwb3NpdGlvbigpLTEiLz4KLQkJCQkJCQkJPC94c2w6dmFyaWFibGU+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJ0YWIiIGlkPSJ0YWJ7JHBvc30iIHRhYmluZGV4PSIxIiBvbmtleXByZXNzPSJjaGVja0tleShldmVudCwgZGlzcGxheVRyZWUpOyIgb25jbGljaz0iZGlzcGxheVRyZWUodGhpcyk7Ij4KLQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InVybCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB1cmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpc0RlZmF1bHRWaWV3Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGRlZmF1bHQiLz48L3hzbDphdHRyaWJ1dGU+JiMxNjA7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0YWJOYW1lIi8+JiMxNjA7PC9zcGFuPgotCQkJCQkJCQk8eHNsOnRleHQ+Ci08L3hzbDp0ZXh0PgotCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQkJPCEtLSBwbGFjZWhvbGRlciBmb3IgdGhlIGNvbnRlbnQgdHJlZSAtLT4KLQkJCQkJPHRyIGhlaWdodD0iMTAwJSI+Ci0JCQkJCQk8dGQgY2xhc3M9InRyZWUiPgotCQkJCQkJCTxpZnJhbWUgbmFtZT0ib3J5X3RvYyIgdGl0bGU9IiIgc3R5bGU9InZpc2liaWxpdHk6dmlzaWJsZSIgdGFiaW5kZXg9IjEiIGZyYW1lYm9yZGVyPSJubyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgc2Nyb2xsaW5nPSJhdXRvIi8+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9QdWJsaXNoaW5nUmVwb3J0LnhzbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL1B1Ymxpc2hpbmdSZXBvcnQueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNWJhMmFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL1B1Ymxpc2hpbmdSZXBvcnQueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOmZvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiPgotCi08eHNsOnBhcmFtIG5hbWU9InNlbGVjdGVkQ29uZmlndXJhdGlvblRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iZGV0YWlsSW5mb1RleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ic2hvd0Vycm9yVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJsb2dzV2FybmluZ1RleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0icGFnZXNOb3RJbnN0YWxsZWRUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImludmFsaWRFeHRlcm5hbFRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ibm9uRXhpc3RpbmdUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9Im1pc3NpbmdSZWZlcmVuY2VzVGl0bGVUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9Im1pc3NpbmdSZWZlcmVuY2VzVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJtaXNzaW5nUmVzb3VyY2VGaWxlc1RpdGxlVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJtaXNzaW5nUmVzb3VyY2VGaWxlc1RleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ibWlzc2luZ1Jlc291cmNlVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJvd25lclJlc291cmNlVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJvd25lckVsZW1lbnRUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9Im1pc3NpbmdFbGVtZW50VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJpbnZhbGlkRWxlbWVudFRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iaW52YWxpZEVsZW1lbnRMaW5rc1RleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0icGxlYXNlQ2hlY2tUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InBsZWFzZUZpbmRUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InB1Ymxpc2hpbmdSZXBvcnRUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InN1bW1hcnlUZXh0Ii8+Ci0KLQotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJQdWJsaXNoaW5nUmVwb3J0Ij4KLTxodG1sPgotPGhlYWQ+Ci08bGluayB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi8uLi9jc3MvZGVmYXVsdC5jc3MiIHJlbD0iU3R5bGVTaGVldCIvPgotPHNjcmlwdCBzcmM9Ii4vLi4vc2NyaXB0cy9jb250ZW50cGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+PHNjcmlwdCBzcmM9Ii4vLi4vc2NyaXB0cy9zdGVwcy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQliYWNrUGF0aCA9ICcuLi8nOwotCQkJCQlpbWdQYXRoID0gJy4uL2ltYWdlcy8nOwotCQkJCTwvc2NyaXB0PgotPC9oZWFkPgotCi08Ym9keSBvbmxvYWQ9ImNyZWF0ZVNlY3Rpb25MaW5rcygnZGl2JywgJ3NlY3Rpb25IZWFkaW5nJywgJy4vLi4vaW1hZ2VzLycpOyAiPgotPGgyPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHVibGlzaGluZ1JlcG9ydFRleHQiLz48L2gyPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdW1tYXJ5VGV4dCIvPjwvZGl2PgotPGRpdiBhbGlnbj0ibGVmdCI+Ci08cC8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZWxlY3RlZENvbmZpZ3VyYXRpb25UZXh0Ii8+OjxwLz4KLQotPGI+Ci08eHNsOnZhbHVlLW9mIHNlbGVjdD0icHViRGlyL0BwYXRoIi8+Ci08L2I+Ci0KLTxwLz4KLQotPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZXRhaWxJbmZvVGV4dCIvPjoKLTx1bD4KLTxsaT4KLTxhPgotPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+Ci08eHNsOnZhbHVlLW9mIHNlbGVjdD0iZXJyb3JMb2cvQHBhdGgiLz4KLTwveHNsOmF0dHJpYnV0ZT4KLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJlcnJvckxvZy9AbmFtZSIvPgotPC9hPgotIC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzaG93RXJyb3JUZXh0Ii8+IDwvbGk+Ci08bGk+Ci08YT4KLTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPgotPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Indhcm5pbmdMb2cvQHBhdGgiLz4KLTwveHNsOmF0dHJpYnV0ZT4KLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ3YXJuaW5nTG9nL0BuYW1lIi8+Ci08L2E+Ci0gLSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxvZ3NXYXJuaW5nVGV4dCIvPiA8L2xpPgotPC91bD4KLQotPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWdlc05vdEluc3RhbGxlZFRleHQiLz4KLQotPC9kaXY+Ci0KLQotPHhzbDppZiB0ZXN0PSJ2YWxpZGF0b3JJbmZvL2ludmFsaWRFeHRlcm5hbExpbmtzIj4KLTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGludmFsaWRFeHRlcm5hbFRleHQiLz46PC9kaXY+Ci08ZGl2IGFsaWduPSJsZWZ0Ij4KLTxwLz4KLTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIj4KLQk8dGJvZHk+Ci0JCTx0cj4KLQkJCTx0aD5Vcmw8L3RoPjx0aD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG93bmVyRWxlbWVudFRleHQiLz48L3RoPjx0aD5JbmZvPC90aD4KLQkJPC90cj4KLQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InZhbGlkYXRvckluZm8vaW52YWxpZEV4dGVybmFsTGlua3MvZW50cnkiPgotCQk8dHI+Ci0JCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB1cmwiLz48L3RkPgotCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAb3duZXIiLz48L3RkPgotCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWVzc2FnZSIvPiYjMTYwOzwvdGQ+Ci0JCTwvdHI+Ci0JPC94c2w6Zm9yLWVhY2g+Ci0JPC90Ym9keT4KLTwvdGFibGU+Ci08L2Rpdj4KLTwveHNsOmlmPgotCi08eHNsOmlmIHRlc3Q9InZhbGlkYXRvckluZm8vaW52YWxpZFJlZmVyZW5jZXMgYW5kIGNvdW50KHZhbGlkYXRvckluZm8vaW52YWxpZFJlZmVyZW5jZXMvZW50cnkpID4gMCI+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGludmFsaWRFbGVtZW50TGlua3NUZXh0Ii8+OjwvZGl2PgotPGRpdiBhbGlnbj0ibGVmdCI+Ci08cC8+Ci08eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5vbkV4aXN0aW5nVGV4dCIvPjxici8+Ci08eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBsZWFzZUZpbmRUZXh0Ii8+Ci08cC8+Ci08dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSI+Ci0JPHRib2R5PgotCQk8dHI+Ci0JCQk8dGg+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnZhbGlkRWxlbWVudFRleHQiLz48L3RoPjx0aD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG93bmVyRWxlbWVudFRleHQiLz48L3RoPgotCQk8L3RyPgotCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0idmFsaWRhdG9ySW5mby9pbnZhbGlkUmVmZXJlbmNlcy9lbnRyeSI+Ci0JCTx0cj4KLQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGVsZW1lbnQiLz4gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZ3VpZCIvPik8L3RkPgotCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAb3duZXIiLz48L3RkPgotCQk8L3RyPgotCTwveHNsOmZvci1lYWNoPgotCTwvdGJvZHk+Ci08L3RhYmxlPgotPC9kaXY+Ci08L3hzbDppZj4KLQotCi08eHNsOmlmIHRlc3Q9InZhbGlkYXRvckluZm8vbWlzc2luZ1JlZmVyZW5jZXMgYW5kIGNvdW50KHZhbGlkYXRvckluZm8vbWlzc2luZ1JlZmVyZW5jZXMvZW50cnkpID4gMCI+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtaXNzaW5nUmVmZXJlbmNlc1RpdGxlVGV4dCIvPjo8L2Rpdj4KLTxkaXYgYWxpZ249ImxlZnQiPgotPHAvPgotPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtaXNzaW5nUmVmZXJlbmNlc1RleHQiLz48YnIvPgotPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwbGVhc2VDaGVja1RleHQiLz4KLTxwLz4KLTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIj4KLQk8dGJvZHk+Ci0JCTx0cj4KLQkJCTx0aD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1pc3NpbmdFbGVtZW50VGV4dCIvPjwvdGg+PHRoPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3duZXJFbGVtZW50VGV4dCIvPjwvdGg+Ci0JCTwvdHI+Ci0JCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJ2YWxpZGF0b3JJbmZvL21pc3NpbmdSZWZlcmVuY2VzL2VudHJ5Ij4KLQkJPHRyPgotCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZWxlbWVudCIvPjwvdGQ+Ci0JCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBvd25lciIvPjwvdGQ+Ci0JCTwvdHI+Ci0JPC94c2w6Zm9yLWVhY2g+Ci0JPC90Ym9keT4KLTwvdGFibGU+Ci08L2Rpdj4KLTwveHNsOmlmPgotCi08eHNsOmlmIHRlc3Q9InZhbGlkYXRvckluZm8vbWlzc2luZ1Jlc291cmNlcyBhbmQgY291bnQodmFsaWRhdG9ySW5mby9taXNzaW5nUmVzb3VyY2VzL2VudHJ5KSA+IDAiPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtaXNzaW5nUmVzb3VyY2VGaWxlc1RpdGxlVGV4dCIvPjo8L2Rpdj4KLTxkaXYgYWxpZ249ImxlZnQiPgotPHAvPgotPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtaXNzaW5nUmVzb3VyY2VGaWxlc1RleHQiLz48YnIvPgotPHAvPgotPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiPgotCTx0Ym9keT4KLQkJPHRyPgotCQkJPHRoPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWlzc2luZ1Jlc291cmNlVGV4dCIvPjwvdGg+PHRoPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3duZXJSZXNvdXJjZVRleHQiLz48L3RoPjx0aD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG93bmVyRWxlbWVudFRleHQiLz48L3RoPgotCQk8L3RyPgotCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0idmFsaWRhdG9ySW5mby9taXNzaW5nUmVzb3VyY2VzL2VudHJ5Ij4KLQkJPHRyPgotCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdXJsIi8+PC90ZD4KLQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHJlc291cmNlIi8+PC90ZD4KLQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG93bmVyIi8+PC90ZD4KLQkJPC90cj4KLQk8L3hzbDpmb3ItZWFjaD4KLQk8L3Rib2R5PgotPC90YWJsZT4KLTwvZGl2PgotPC94c2w6aWY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgotCi0KLTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2Jvb2ttYXJrLnhzbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2Jvb2ttYXJrLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTYwY2ExNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9ib29rbWFyay54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOmZvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiPgotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPGh0bWw+Ci0JCQk8aGVhZD4KLQkJCQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIvPgotCQkJCTx0aXRsZT5Db250ZW50czwvdGl0bGU+Ci0JCQkJPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotKiB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA5cHQ7Ci0JbWFyZ2luOiAwOwotCXBhZGRpbmc6IDA7Ci19Ci0KLUJPRFkgewotCWJhY2tncm91bmQtY29sb3I6IFdpbmRvdzsKLQlmb250OiBpY29uOwotCW1hcmdpbjowOwotCXBhZGRpbmc6MDsKLQlib3JkZXI6MDsKLX0KLQotVUwgewotCWJvcmRlci13aWR0aDowOwotCW1hcmdpbi1sZWZ0OjE1cHg7Ci19Ci0KLSNyb290IHsKLQltYXJnaW4tdG9wOjVweDsKLQltYXJnaW4tbGVmdDo1cHg7Ci19Ci0KLVVMLmV4cGFuZGVkIHsKLQlkaXNwbGF5OmJsb2NrOwotfQotCi1VTC5jb2xsYXBzZWQgewotCWRpc3BsYXk6IG5vbmU7Ci19Ci0KLUxJIHsKLQltYXJnaW4tdG9wOjNweDsKLQlsaXN0LXN0eWxlLWltYWdlOm5vbmU7Ci0JbGlzdC1zdHlsZS10eXBlOm5vbmU7Ci0JCXdoaXRlLXNwYWNlOiBub3dyYXA7Ci19Ci0KLUlNRyB7Ci0JdmVydGljYWwtYWxpZ246IHRvcDsKLQlib3JkZXI6MHB4OwotCW1hcmdpbjowcHg7Ci0JcGFkZGluZzowcHg7Ci0JbWFyZ2luLXJpZ2h0OjRweDsKLX0KLQotCi1BIHsKLQl0ZXh0LWRlY29yYXRpb246bm9uZTsKLQljb2xvcjojMjU4Ci0JcGFkZGluZy1yaWdodDoycHg7Ci0JLyogdGhpcyB3b3JrcyBpbiBpZTUuNSwgYnV0IG5vdCBpbiBpZTUuMCAgKi8KLQl3aGl0ZS1zcGFjZTogbm93cmFwOwotfQotCi1BOmhvdmVyewotCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Ci19Ci0KLUEuYWN0aXZlewotCWJhY2tncm91bmQ6SGlnaGxpZ2h0OwotCWNvbG9yOkhpZ2hsaWdodFRleHQ7Ci0Jd2lkdGg6MTAwJTsKLX0KLQotQS5hY3RpdmU6aG92ZXJ7Ci0JdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsKLQliYWNrZ3JvdW5kOkhpZ2hsaWdodDsKLQljb2xvcjpIaWdobGlnaHRUZXh0OwotCXdpZHRoOjEwMCU7Ci19Ci0KLQotCi0uaCB7Ci0JdmlzaWJpbGl0eTpoaWRkZW47Ci19Ci0KLTwvc3R5bGU+Ci0JCQkJPGJhc2UgdGFyZ2V0PSJvcnlfZG9jIi8+Ci0JCQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0KLS8vIFByZWxvYWQgaW1hZ2VzCi1taW51cyA9IG5ldyBJbWFnZSgpOwotbWludXMuc3JjID0gImltYWdlcyIrIi9taW51cy5naWYiOwotcGx1cyA9IG5ldyBJbWFnZSgpOwotcGx1cy5zcmMgPSAiaW1hZ2VzIisiL3BsdXMuZ2lmIjsKLXRvY19vcGVuX2ltZyA9IG5ldyBJbWFnZSgpOwotdG9jX29wZW5faW1nLnNyYyA9ICJpbWFnZXMiKyIvdG9jX29wZW4uZ2lmIjsKLXRvY19jbG9zZWRfaW1nID0gbmV3IEltYWdlKCk7Ci10b2NfY2xvc2VkX2ltZy5zcmMgPSAiaW1hZ2VzIisiL3RvY19jbG9zZWQuZ2lmIjsKLWZvbGRlcl9pbWcgPSBuZXcgSW1hZ2UoKTsKLWZvbGRlcl9pbWcuc3JjID0gImltYWdlcyIrIi9jb250YWluZXJfb2JqLmdpZiI7Ci10b3BpY19pbWcgPSBuZXcgSW1hZ2UoKTsKLXRvcGljX2ltZy5zcmMgPSAiaW1hZ2VzIisiL3RvcGljLmdpZiI7Ci1hbHRUb3BpY0Nsb3NlZCA9ICJUb3BpY1x1MDAyMGNsb3NlZCI7Ci1hbHRUb3BpY09wZW4gPSAiVG9waWNcdTAwMjBvcGVuIjsKLTwvc2NyaXB0PgotCQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0idG9jLmpzIi8+Ci0JCQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSJ0cmVlLmpzIi8+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keSBkaXI9Imx0ciIgb25sb2FkPSJzZXRMb2FkZWQoKTsiPgotCQkJCTx1bCBkaXI9Imx0ciIgY2xhc3M9ImV4cGFuZGVkIiBpZD0icm9vdCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9jZXNzTm9kZSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ibm9kZSIgc2VsZWN0PSJFbGVtZW50Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFyZW50SWQiIHNlbGVjdD0iJyciLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3VsPgotCQkJPC9ib2R5PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9jZXNzTm9kZSI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0ibm9kZSIvPgotCQk8eHNsOnBhcmFtIG5hbWU9InBhcmVudElkIi8+Ci0JCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkbm9kZSI+Ci0JCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im5hbWUiPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotCQkJPC94c2w6dmFyaWFibGU+Ci0JCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImlkIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5vZGVJZCIvPgotCQkJPC94c2w6dmFyaWFibGU+Ci0JCQk8eHNsOnZhcmlhYmxlIG5hbWU9Imd1aWQiPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZ3VpZCIvPgotCQkJPC94c2w6dmFyaWFibGU+Ci0JCQk8eHNsOnZhcmlhYmxlIG5hbWU9Imljb251cmwiPi4vaW1hZ2VzLzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY2xvc2VkSWNvbk5hbWUiLz4KLQkJCTwveHNsOnZhcmlhYmxlPgotCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ1cmwiPi4vLi4vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB1cmwiLz4KLQkJCTwveHNsOnZhcmlhYmxlPgotCQkJPGxpPgotCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQk8eHNsOndoZW4gdGVzdD0iY291bnQoRWxlbWVudCkgPiAwICI+Ci0JCQkJCQk8aW1nIHNyYz0iaW1hZ2VzL3BsdXMuZ2lmIiBjbGFzcz0iY29sbGFwc2VkIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCQk8L3hzbDp3aGVuPgotCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCTwhLS0gPHNwYW4gc3R5bGU9IndpZHRoOjEyIj48L3NwYW4+IC0tPgotCQkJCQkJPGltZyBzcmM9ImltYWdlcy9ub3BsdXMuZ2lmIiBjbGFzcz0iY29sbGFwc2VkIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJPC94c2w6Y2hvb3NlPgotCQkJCTxhIGlkPSJ7JGlkfSIgcGFyZW50SWQ9InskcGFyZW50SWR9IiBndWlkPSJ7JGd1aWR9IiBocmVmPSJ7JHVybH0iPgotCQkJCQk8aW1nIHNyYz0ieyRpY29udXJsfSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+Ci0JCQkJPC9hPgotCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoRWxlbWVudCkgPiAwICI+Ci0JCQkJCTx1bCBjbGFzcz0iY29sbGFwc2VkIj4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9jZXNzTm9kZSI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGUiIHNlbGVjdD0iRWxlbWVudCIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXJlbnRJZCIgc2VsZWN0PSIkaWQiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTwvdWw+Ci0JCQkJPC94c2w6aWY+Ci0JCQk8L2xpPgotCQk8L3hzbDpmb3ItZWFjaD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9lbGVtZW50VXJscy54c2wgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9lbGVtZW50VXJscy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0ZDI4NTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvZWxlbWVudFVybHMueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM6Zm89Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML0Zvcm1hdCI+Ci08eHNsOm91dHB1dCBvbWl0LXhtbC1kZWNsYXJhdGlvbj0ieWVzIi8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50VXJscyI+Ci08eHNsOmZvci1lYWNoIHNlbGVjdD0iZWxlbWVudFVybCI+Y29udGVudFBhZ2UucHJvY2Vzc1BhZ2UuZWxlbWVudFVybHNbIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbm9kZUlkIi8+Il0gPSBbIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdGV4dCIvPiIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdXJsIi8+Il07Ci08L3hzbDpmb3ItZWFjaD4JCQotPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvZ2xvc3NhcnkueHNsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvZ2xvc3NhcnkueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NjA4OTBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2dsb3NzYXJ5LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOnBhcmFtIG5hbWU9InRpdGxlIi8+Ci08eHNsOnBhcmFtIG5hbWU9Imdsb3NzYXJ5VGV4dCIvPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJHbG9zc2FyeSI+Ci0KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIvPgotPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZ2xvc3NhcnlUZXh0Ii8+IC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSB0ZXh0PSIjMDAwMDAwIiBiZ2NvbG9yPSIjZmZmZmZmIj4KLTxmb250IGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiPgotPGRsPgotCi08eHNsOmZvci1lYWNoIHNlbGVjdD0iaXRlbSI+Ci08ZHQ+Ci08Yj4KLTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByZXNlbnRhdGlvbk5hbWUiLz48L2E+Ci08L2I+Ci08L2R0PgotCi08ZGQ+Ci08eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iQGNvbnRlbnQiLz4JCi08L2RkPgotPC94c2w6Zm9yLWVhY2g+Ci0KLTwvZGw+Ci08L2ZvbnQ+Ci08L2JvZHk+Ci08L2h0bWw+Ci0KLTwveHNsOnRlbXBsYXRlPgotCQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2dsb3NzYXJ5X2luZGV4LnhzbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2dsb3NzYXJ5X2luZGV4LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWRkYTZmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9nbG9zc2FyeV9pbmRleC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpwYXJhbSBuYW1lPSJ0aXRsZSIvPgotPHhzbDpwYXJhbSBuYW1lPSJnbG9zc2FyeVRleHQiLz4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iR2xvc3NhcnkiPgotCi08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLz4KLTxtZXRhIG5hbWU9Im1ldGFfdGFnZ2VkIiBjb250ZW50PSJ0cnVlIi8+Ci08dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRnbG9zc2FyeVRleHQiLz4gLSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC90aXRsZT4KLTwvaGVhZD4KLTxmcmFtZXNldCByb3dzPSIyNSwqIj4KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9uYXYiIHNyYz0ibmF2aWcuaHRtIiBzY3JvbGxpbmc9ImF1dG8iIG1hcmdpbmhlaWdodD0iMiIgbWFyZ2lud2lkdGg9IjIiIHRpdGxlPSJOYXZpZ2F0aW9uIEFyZWEiLz4KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9kb2MiIHNyYz0iLi4vZ2xvc3NhcnkuaHRtIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIyIiBzY3JvbGxpbmc9ImF1dG8iIHRpdGxlPSJDb250ZW50IEFyZWEiLz4KLTwvZnJhbWVzZXQ+Ci08L2h0bWw+Ci0KLTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvZ2xvc3NhcnlfbmF2aWcueHNsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvZ2xvc3NhcnlfbmF2aWcueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMmJhOWRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2dsb3NzYXJ5X25hdmlnLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOnBhcmFtIG5hbWU9InRpdGxlIi8+Ci08eHNsOnBhcmFtIG5hbWU9Imdsb3NzYXJ5VGV4dCIvPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJHbG9zc2FyeSI+Ci0KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIvPgotPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZ2xvc3NhcnlUZXh0Ii8+IC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSB0ZXh0PSIjMDAwMDAwIiBiZ2NvbG9yPSIjZmZmZmZmIj4KLTxmb250IGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiPjx4c2w6dGV4dD4KLTwveHNsOnRleHQ+Ci08eHNsOmZvci1lYWNoIHNlbGVjdD0iaXRlbVtAbmF2aWdhdGlvbi1tYXJrPSd0cnVlJ10iPgotPGEgIHRhcmdldD0iZ2xvc3NhcnlfZG9jIj4KLTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPi4uL2dsb3NzYXJ5Lmh0bSM8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwcmVzZW50YXRpb25OYW1lIi8+PC9hPjx4c2w6dGV4dD4KLTwveHNsOnRleHQ+Ci08L3hzbDpmb3ItZWFjaD4KLTwvZm9udD4KLTwvYm9keT4KLTwvaHRtbD4KLQotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9pbmRleC54c2wgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9pbmRleC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdlZDRiODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvaW5kZXgueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOmZvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvUHVibGlzaGluZ09wdGlvbiI+Ci0KLTx4c2w6dmFyaWFibGUgbmFtZT0idGl0bGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdGl0bGUiLz48L3hzbDp2YXJpYWJsZT4KLQotPGh0bWw+Ci0KLTxoZWFkPgotPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz48L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLz4KLTxtZXRhIG5hbWU9Im1ldGFfdGFnZ2VkIiBjb250ZW50PSJ0cnVlIi8+Ci0KLTwhLS0gaW5jbHVkZSBhZGRpdGlvbmFsIG1ldGEgdGFncyBpZiBhbnkgLS0+Ci08eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0YVRhZ3MvbWV0YVRhZyI+Ci08bWV0YT4KLTx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY29udGVudCIvPjwveHNsOmF0dHJpYnV0ZT4KLTwvbWV0YT4KLTwveHNsOmZvci1lYWNoPgotCi08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhW0NEQVRBWwotPCEtLQotdmFyIHRvdXIgPSAwOwotCi1mdW5jdGlvbiBnZXRDb29raWUgKG5hbWUpIAotewotICB2YXIgZGNvb2tpZSA9IGRvY3VtZW50LmNvb2tpZTsgCi0gIHZhciBjbmFtZSA9IG5hbWUgKyAiPSI7Ci0gIHZhciBjbGVuID0gZGNvb2tpZS5sZW5ndGg7Ci0gIHZhciBjYmVnaW4gPSAwOwotICB3aGlsZSAoY2JlZ2luIDwgY2xlbikgCi0gIHsKLSAgICB2YXIgdmJlZ2luID0gY2JlZ2luICsgY25hbWUubGVuZ3RoOwotICAgIGlmIChkY29va2llLnN1YnN0cmluZyhjYmVnaW4sIHZiZWdpbikgPT0gY25hbWUpIAotICAgIHsgCi0gICAgICB2YXIgdmVuZCA9IGRjb29raWUuaW5kZXhPZiAoIjsiLCB2YmVnaW4pOwotICAgICAgaWYgKHZlbmQgPT0gLTEpIAotICAgICAgewotICAgICAgICB2ZW5kID0gY2xlbjsKLSAgICAgIH0KLSAgICAgIHJldHVybiB1bmVzY2FwZShkY29va2llLnN1YnN0cmluZyh2YmVnaW4sIHZlbmQpKTsKLSAgICB9Ci0KLSAgICBjYmVnaW4gPSBkY29va2llLmluZGV4T2YoIiAiLCBjYmVnaW4pICsgMTsKLSAgICBpZiAoY2JlZ2luID09IDApIAotICAgIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gbnVsbDsKLSB9Ci0KLWZ1bmN0aW9uIGZpeFVybCh1cmwpCi17Ci0JaWYgKCB1cmwgPT0gbnVsbCApCi0JewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQl2YXIgaW5keCA9IHVybC5pbmRleE9mKCJmaWxlOi8vLyIpOwotCWlmICggaW5keCA+PTAgKQotCXsKLQkJdXJsID0gdXJsLnN1YnN0cmluZyhpbmR4KzgsIHVybC5sZW5ndGgpOwotCX0KLQllbHNlCi0JewotCQlpbmR4ID0gdXJsLmluZGV4T2YoImZpbGU6Ly8iKTsKLQkJaWYgKCBpbmR4ID49MCApCi0JCXsKLQkJCXVybCA9IHVybC5zdWJzdHJpbmcoaW5keCs3LCB1cmwubGVuZ3RoKTsKLQkJfQotCX0KLQotCXVybCA9IHVybC5yZXBsYWNlKC9cXC9nLCAiLyIpOwotCi0gICByZXR1cm4gdW5lc2NhcGUodXJsKTsKLX0KLQotLy8gLS0+Ci1dXT4KLTwvc2NyaXB0PgotPC9oZWFkPgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci08eHNsOmNob29zZT4KLQk8eHNsOndoZW4gdGVzdD0iQHVzZUFwcGxldD0ndHJ1ZSciPgotdmFyIHRvY19mcmFtZSA9ICJvcnlfdG9jIjsKLXZhciB0b2NfdXJsID0gImFwcGxldC9teXJ1cHRyZWUuaHRtIjsKLXZhciBkZWZhdWx0X3BhZ2VfdXJsID0gInNwc2NyZWVuLmh0bSI7Ci0JPC94c2w6d2hlbj4KLQk8eHNsOm90aGVyd2lzZT4KLXZhciB0b2NfZnJhbWUgPSAib3J5X3RvY19mcmFtZSI7Ci12YXIgdG9jX3VybCA9ICJub2FwcGxldC9QdWJsaXNoZWRCb29rbWFya3MuaHRtbCI7Ci12YXIgZGVmYXVsdF9wYWdlX3VybCA9IGZpeFVybChnZXRDb29raWUoInJ1cF9vcnlfZG9jIikpOwotaWYgKCBkZWZhdWx0X3BhZ2VfdXJsID09IG51bGwgKQotewotCWRlZmF1bHRfcGFnZV91cmwgPSAiYWJvdXQ6YmxhbmsiOwotfQotCTwveHNsOm90aGVyd2lzZT4KLTwveHNsOmNob29zZT4KLTwhW0NEQVRBWwotICBpZigobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk5ldHNjYXBlIiAmJiBwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gNCApIHx8IAotICAgICAgKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiICYmIHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpCi0gIHsKLSAgICBkb2N1bWVudC53cml0ZSgiICA8ZnJhbWVzZXQgIGZyYW1lYm9yZGVyPVwiMFwiIGZyYW1lc3BhY2luZz1cIjFcIiBib3JkZXI9XCIxXCIgcm93cz1cIjYwLCpcIj5cbiIpOwotICAgIGRvY3VtZW50LndyaXRlKCIgICAgPGZyYW1lIHNyYz1cInRvcG5hdi5odG1cIiBub3Jlc2l6ZSBuYW1lPVwib3J5X2J1dHRvblwiIGZyYW1lYm9yZGVyPVwiMFwiIHNjcm9sbGluZz1cIm5vXCIgbWFyZ2luaGVpZ2h0PVwiMFwiIG1hcmdpbndpZHRoPVwiMFwiPlxuIik7Ci0gICAgZG9jdW1lbnQud3JpdGVsbigiPGZyYW1lc2V0IGNvbHM9XCIyMDUsKlwiIGZyYW1lYm9yZGVyPVwiMVwiIGZyYW1lc3BhY2luZz1cIjFcIiBib3JkZXI9XCIxXCIgPlxuIik7Ci0gICAgZG9jdW1lbnQud3JpdGUoIiAgICAgIDxmcmFtZSBzcmM9XCIiICsgdG9jX3VybCArICJcIiBuYW1lPVwiIiArIHRvY19mcmFtZSArICJcIiBmcmFtZWJvcmRlcj1cIjFcIiBzY3JvbGxpbmc9XCJub1wiPlxuIik7Ci0gICAgZG9jdW1lbnQud3JpdGVsbigiPGZyYW1lIG5hbWU9XCJvcnlfZG9jXCIgc3JjPVwiIiArIGRlZmF1bHRfcGFnZV91cmwgKyAiXCIgIGZyYW1lYm9yZGVyPVwiMFwiIHNjcm9sbGluZz1cInllc1wiPlxuIik7Ci0gICAgZG9jdW1lbnQud3JpdGVsbigiICAgPC9mcmFtZXNldD4iKTsKLSAgICBkb2N1bWVudC53cml0ZWxuKCIgICA8L2ZyYW1lc2V0PiIpOwotCi0gIH0KLSAgZWxzZQotICB7Ci0gICAgcGFyZW50LmxvY2F0aW9uID0gImFwcGxldC9icm93c2VyLmh0bSI7Ci0gIH0KLV1dPgotCi0gIDwvc2NyaXB0PgotCi08Ym9keT4KLTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIDxici8+Ci0gICAgICA8YnIvPgotCTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQiPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMSUiPgotICAgICAgPHA+JiMxNjA7PC9wPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi0KLTwvYm9keT4KLQotPC9odG1sPgotCi0KLTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2luZGV4X2NvbnRlbnRzLnhzbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2luZGV4X2NvbnRlbnRzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDVjNDczNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9pbmRleF9jb250ZW50cy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpwYXJhbSBuYW1lPSJ0aXRsZSIvPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJJbmRleCI+Ci0JCQotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+Ci08bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9ImluZGV4LmNzcyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08dGl0bGU+SW5kZXggLSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGJnY29sb3I9IiNGRkZGRkYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiMwMDQwODAiIHZsaW5rPSIjODAwMEZGIiBhbGluaz0iIzAwMDBGRiI+Ci08eHNsOmZvci1lYWNoIHNlbGVjdD0iaXRlbSI+Ci08eHNsOmNob29zZT4KLQk8eHNsOndoZW4gdGVzdD0iQG5hdmlnYXRpb24tbWFyaz0ndHJ1ZScgIj4KLQk8UCBDTEFTUz0iaW5kZXhoZWFkaW5nIj4KLQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwcmVzZW50YXRpb25OYW1lIi8+PC9hPgotICAgPC9QPgotCTwveHNsOndoZW4+Ci0JPHhzbDpvdGhlcndpc2U+Ci0JPFAgQ0xBU1M9ImluZGV4bGV2ZWwxIj4KLQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwcmVzZW50YXRpb25OYW1lIi8+PC9hPgotICAgPC9QPgotICAgPFAgQ0xBU1M9ImluZGV4bGV2ZWwyIj4mIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsKLSAgIDxhIFRBUkdFVD0ib3J5X2RvYyI+Ci0gICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHVybCIgLz48L3hzbDphdHRyaWJ1dGU+Ci0JPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IkBjb250ZW50Ii8+PC9hPjwvUD4KLQk8L3hzbDpvdGhlcndpc2U+Ci08L3hzbDpjaG9vc2U+Ci08L3hzbDpmb3ItZWFjaD4KLTwvYm9keT4KLTwvaHRtbD4KLQotPC94c2w6dGVtcGxhdGU+Ci0JCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvaW5kZXhfbmF2aWcueHNsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvaW5kZXhfbmF2aWcueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOTcwYzkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2luZGV4X25hdmlnLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOnBhcmFtIG5hbWU9InRpdGxlIi8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkluZGV4Ij4KLQotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+Ci08dGl0bGU+R2xvc3NhcnkgLSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IHRleHQ9IiMwMDAwMDAiIGJnY29sb3I9IiNmZmZmZmYiPgotPGZvbnQgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiI+PHhzbDp0ZXh0PgotPC94c2w6dGV4dD4KLTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpdGVtW0BuYXZpZ2F0aW9uLW1hcms9J3RydWUnXSI+Ci08YSAgdGFyZ2V0PSJrZXl3b3JkX3QiPgotPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+Y29udGVudHMuaHRtIzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByZXNlbnRhdGlvbk5hbWUiLz48L2E+PHhzbDp0ZXh0PgotPC94c2w6dGV4dD4KLTwveHNsOmZvci1lYWNoPgotPC9mb250PgotPC9ib2R5PgotPC9odG1sPgotCi08L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL3Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiY2NjYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyBUaGUgVUkgdGV4dCBpbiB0aGUgWFNMIHN0eWxlc2hlZXRzLgotCi1zZWxlY3RlZENvbmZpZ3VyYXRpb25UZXh0PVRoZSBTZWxlY3RlZCBjb25maWd1cmF0aW9uIGlzIHB1Ymxpc2hlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uCi1kZXRhaWxJbmZvVGV4dD1EZXRhaWwgaW5mb3JtYXRpb24gaXMgbG9nZ2VkIGludG8gdGhlIGZvbGxvd2luZyBmaWxlcyBpbiB0aGUgbG9ncyBmb2xkZXIKLXNob3dFcnJvclRleHQ9c2hvdyBhbnkgZXJyb3Igb2NjdXJlZCBkdXJpbmcgcHVibGlzaGluZy4KLWxvZ3NXYXJuaW5nVGV4dD1sb2dzIGFsbCB3YXJuaW5nIG1lc3NhZ2VzIHN1Y2ggYXMgbWlzc2luZyByZWZlcmVuY2VzLCBicm9rZW4gbGlua3MsIGFuZCB1bi1wdWJsaXNoZWQgY2F0ZWdvcmllcyB3aXRoIG5vIGNhdGVnb3JpemVkIGVsZW1lbnRzLgotcGFnZXNOb3RJbnN0YWxsZWRUZXh0PUluIHRoZSBwYWdlc19ub3RfaW5zdGFsbGVkIGZvbGRlciwgeW91IHdpbGwgZmluZCBhbGwgb2YgdGhlIG1pc3NpbmcgcmVmZXJlbmNlcyBpbiB0aGlzIGNvbmZpZ3VyYXRpb24uCi1pbnZhbGlkRXh0ZXJuYWxUZXh0PUludmFsaWQgZXh0ZXJuYWwgbGlua3MgaWRlbnRpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbgotb3duZXJFbGVtZW50VGV4dD1Pd25lciBFbGVtZW50Ci1ub25FeGlzdGluZ1RleHQ9VGhlIG93bmVyIGVsZW1lbnRzIHJlZmVyIHRvIG5vbi1leGlzdGluZyBlbGVtZW50cy4gTWF5YmUgdGhlIGVsZW1lbnRzIHdlcmUgZGVsZXRlZCBmcm9tIHRoZSBsaWJyYXJ5IGFmdGVyIHRoZSBlbGVtZW50IGxpbmtzIHdlcmUgY3JlYXRlZC4gUGxlYXNlIGZpbmQgdGhlIG93bmVyIGVsZW1lbnRzIGFuZCBmaXggdGhlc2UgaW52YWxpZCByZWZlcmVuY2VzLgotbWlzc2luZ1JlZmVyZW5jZXNUaXRsZVRleHQ9TWlzc2luZyBSZWZlcmVuY2VzCi1taXNzaW5nUmVmZXJlbmNlc1RleHQ9VGhlIG93bmVyIGVsZW1lbnRzIHJlZmVyIHRvICBtaXNzaW5nIGVsZW1lbnRzICBpbiB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbi4gUGxlYXNlIGNoZWNrIHRoZSBjb25maWd1cmF0aW9uIGNsb3N1cmUgYW5kIGZpeCB0aGUgbWlzc2luZyByZWZlcmVuY2VzLiAgICAgICAgICAgICAgICAgICAKLW1pc3NpbmdSZXNvdXJjZUZpbGVzVGl0bGVUZXh0PU1pc3NpbmcgUmVzb3VyY2UgRmlsZXMKLW1pc3NpbmdSZXNvdXJjZUZpbGVzVGV4dD1UaGUgb3duZXIgZWxlbWVudHMgcmVmZXIgdG8gbWlzc2luZyByZXNvdXJjZSBmaWxlcy4gVGhvc2UgcmVzb3VyY2UgZmlsZXMgYXJlIHJlZmVyZW5jZWQgaW4gdGhlIGVsZW1lbnRzJyBjb250ZW50IG9yIGluIHRoZSBhc3NvY2lhdGVkIGF0dGFjaG1lbnRzLgotbWlzc2luZ1Jlc291cmNlVGV4dD1NaXNzaW5nIFJlc291cmNlCi1vd25lclJlc291cmNlVGV4dD1Pd25lciBSZXNvdXJjZQotbWlzc2luZ0VsZW1lbnRUZXh0PU1pc3NpbmcgRWxlbWVudAotaW52YWxpZEVsZW1lbnRUZXh0PUludmFsaWQgRWxlbWVudAotaW52YWxpZEVsZW1lbnRMaW5rc1RleHQ9SW52YWxpZCBFbGVtZW50IExpbmtzCi1wbGVhc2VDaGVja1RleHQ9UGxlYXNlIGNoZWNrIHRoZSBjb25maWd1cmF0aW9uIGNsb3N1cmUgYW5kIGZpeCB0aGUgbWlzc2luZyByZWZlcmVuY2VzLgotcGxlYXNlRmluZFRleHQ9UGxlYXNlIGZpbmQgdGhlIG93bmVyIGVsZW1lbnRzIGFuZCBmaXggdGhlc2UgaW52YWxpZCByZWZlcmVuY2VzLgotZ2xvc3NhcnlUZXh0PUdsb3NzYXJ5Ci1pbmRleFRleHQ9SW5kZXgKLWZlZWRiYWNrVGV4dD1GZWVkYmFjawotYWJvdXRUZXh0PUFib3V0Ci1zZWFyY2hUZXh0PVNlYXJjaAotcHJpbnRUZXh0PVByaW50Ci1zdW1tYXJ5VGV4dD1TdW1tYXJ5Ci1wdWJsaXNoaW5nUmVwb3J0VGV4dD1QdWJsaXNoaW5nIFJlcG9ydDoKLXdoZXJlQW1JVGV4dD1XaGVyZSBhbSBJCi10cmVlU2V0c1RleHQ9VHJlZSBTZXRzCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL3RvcG5hdi54c2wgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC90b3BuYXYueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNWZjZWNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL3RvcG5hdi54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM6Zm89Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML0Zvcm1hdCI+Ci0KLTx4c2w6cGFyYW0gbmFtZT0iZ2xvc3NhcnlUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImluZGV4VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJmZWVkYmFja1RleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iYWJvdXRUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InNlYXJjaFRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0icHJpbnRUZXh0Ii8+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL1B1Ymxpc2hpbmdPcHRpb24iPgotCi08eHNsOnZhcmlhYmxlIG5hbWU9InRpdGxlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHRpdGxlIi8+PC94c2w6dmFyaWFibGU+Ci08eHNsOnZhcmlhYmxlIG5hbWU9ImJhbm5lckltYWdlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGJhbm5lckltYWdlIi8+PC94c2w6dmFyaWFibGU+Ci08eHNsOnZhcmlhYmxlIG5hbWU9ImFsbG93QXBwbGV0U2VhcmNoIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGFsbG93QXBwbGV0U2VhcmNoIi8+PC94c2w6dmFyaWFibGU+Ci08eHNsOnZhcmlhYmxlIG5hbWU9InNob3dHbG9zc2FyeSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzaG93R2xvc3NhcnkiLz48L3hzbDp2YXJpYWJsZT4KLTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd0luZGV4Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNob3dJbmRleCIvPjwveHNsOnZhcmlhYmxlPgotPHhzbDp2YXJpYWJsZSBuYW1lPSJmZWVkYmFja1VybCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBmZWVkYmFja1VybCIvPjwveHNsOnZhcmlhYmxlPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz48L3RpdGxlPgotCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9InNjcmlwdHMvY29tbW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSJzY3JpcHRzL3NjcmlwdHMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9InNjcmlwdHMvdG9wbmF2LmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLXZhciBmZWVkYmFja191cmw9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZlZWRiYWNrVXJsIi8+JzsKLTwvc2NyaXB0PgotCi08L2hlYWQ+Ci0KLTxib2R5IG1hcmdpbmhlaWdodD0iMCIgbWFyZ2lud2lkdGg9IjAiPgotCi0gPGZvcm0gYWN0aW9uPSIjIiBuYW1lPSJmb3JtVG9wZnJhbWUiPgotICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBjbGFzcz0idG9wZnJhbWVsb2dvYmciIHN1bW1hcnk9ImJyZWFkY3J1bWJzIj4KLSAgICA8dHI+Ci0gICAgICA8dGQgcm93c3Bhbj0iNSIgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuL2ltYWdlcy97JGJhbm5lckltYWdlfSIgYWx0PSJ7JHRpdGxlfSIgdGl0bGU9InskdGl0bGV9IiB3aWR0aD0iMjk5IiBoZWlnaHQ9IjM2IiAvPjwvdGQ+Ci0gICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMjUwIiBoZWlnaHQ9IjEiIGFsdD0iIiB0aXRsZT0iIiAvPjwvdGQ+Ci0gICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjEiIGFsdD0iIiB0aXRsZT0iIiAvPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgY29sc3Bhbj0iMiIgYWxpZ249InJpZ2h0IiBub3dyYXA9Im5vd3JhcCI+Ci0gICAgICA8IS0tCi0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQobnVsbCk7IiBvbmNsaWNrPSJNTV9zaG93SGlkZUxheWVycygnSWNvbnNPbicsJycsJ3Nob3cnKTsiPgotICAgICAgPGltZyAgc3JjPSIuL2ltYWdlcy9uaV9oYW5kbGUuZ2lmIiBpZD0iaGFuZGxlIiBuYW1lPSJoYW5kbGUiIHdpZHRoPSIxMyIgaGVpZ2h0PSIxOCIgYm9yZGVyPSIwIiBhbHQ9IiIgdGl0bGU9IiIvPgotICAgICAgPC9hPgotICAgICAgLS0+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjEiIGhlaWdodD0iMyIgYWx0PSIiICB0aXRsZT0iIi8+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KLSAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBhbGlnbj0icmlnaHQiIHN1bW1hcnk9IiI+Ci0gICAgICAgICAgPHRyPgotCQkJICA8eHNsOmlmIHRlc3Q9IiRzaG93R2xvc3Nhcnk9J3RydWUnICI+Ci0gICAJCQk8dGQ+PGEgaHJlZj0iSmF2YVNjcmlwdDpvcGVuR2xvc3NhcnkoKTsiIGNsYXNzPSJ0b3ByaWdodG5hdiI+PGltZyBzcmM9Ii4vaW1hZ2VzL25pX2dsb3NzYXJ5LmdpZiIgd2lkdGg9IjE4IiBoZWlnaHQ9IjEwIiBib3JkZXI9IjAiIGFsdD0ieyRnbG9zc2FyeVRleHR9IiB0aXRsZT0ieyRnbG9zc2FyeVRleHR9IiAvPjwvYT48L3RkPgotCQkJPHRkIG5vd3JhcD0ibm93cmFwIj48YSBocmVmPSJKYXZhU2NyaXB0Om9wZW5HbG9zc2FyeSgpOyIgY2xhc3M9InRvcHJpZ2h0bmF2Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGdsb3NzYXJ5VGV4dCIvPjwvYT48L3RkPgotICAgICAgICAgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjUiIGhlaWdodD0iMTEiIGFsdD0iIiB0aXRsZT0iIiAvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9InRvcGJhcmRpdmlkZXIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjEiIGhlaWdodD0iMTEiIGFsdD0iIiB0aXRsZT0iIiAvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iNSIgaGVpZ2h0PSIxMSIgYWx0PSIiIHRpdGxlPSIiIC8+PC90ZD4gICAgICAgICAgICAgICAgICAKLQkJCTwveHNsOmlmPgotCQkJPHhzbDppZiB0ZXN0PSIkc2hvd0luZGV4PSd0cnVlJyAiPgotICAJCQk8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpvcGVuSW5kZXgoKTsiIGNsYXNzPSJ0b3ByaWdodG5hdiI+Ci0JCQk8aW1nIHNyYz0iLi9pbWFnZXMvbmlfaW5kZXguZ2lmIiB3aWR0aD0iMTciIGhlaWdodD0iOSIgYm9yZGVyPSIwIiBhbHQ9InskaW5kZXhUZXh0fSIgdGl0bGU9InskaW5kZXhUZXh0fSIgLz48L2E+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+PGEgaHJlZj0iamF2YXNjcmlwdDpvcGVuSW5kZXgoKTsiIGNsYXNzPSJ0b3ByaWdodG5hdiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbmRleFRleHQiLz48L2E+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSI1IiBoZWlnaHQ9IjExIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9InRvcGJhcmRpdmlkZXIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjEiIGhlaWdodD0iMTEiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSI1IiBoZWlnaHQ9IjExIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgPC94c2w6aWY+Ci0KLQkJCTx0ZD48YSBocmVmPSJKYXZhU2NyaXB0OnNlbmRGZWVkYmFjayhmZWVkYmFja191cmwpOyIgY2xhc3M9InRvcHJpZ2h0bmF2Ij4KLQkJCTxpbWcgc3JjPSIuL2ltYWdlcy9uaV9mZWVkYmFjay5naWYiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxMCIgYm9yZGVyPSIwIiBhbHQ9InskZmVlZGJhY2tUZXh0fSIgdGl0bGU9InskZmVlZGJhY2tUZXh0fSIvPjwvYT48L3RkPgotICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KLQkJCQk8YSBocmVmPSJKYXZhU2NyaXB0OnNlbmRGZWVkYmFjayhmZWVkYmFja191cmwpOyIgY2xhc3M9InRvcHJpZ2h0bmF2Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZlZWRiYWNrVGV4dCIvPjwvYT48L3RkPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iNSIgaGVpZ2h0PSIxMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJ0b3BiYXJkaXZpZGVyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjExIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iNSIgaGVpZ2h0PSIxMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotCQkJPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZChudWxsKSIgY2xhc3M9InRvcHJpZ2h0bmF2IiBvbmNsaWNrPSJqYXZhc2NyaXB0OndpbmRvdy5vcGVuKCdhYm91dC5odG0nLCdhYm91dCcsJ2hlaWdodD0yNTAsd2lkdGg9MjUwLHN0YXR1cz1ubyxyZXNpemFibGU9eWVzJyk7Ij4KLSAgICAgICAgICAgICAgPGltZyBzcmM9Ii4vaW1hZ2VzL25pX2Fib3V0LmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjEwIiBib3JkZXI9IjAiIGFsdD0ieyRhYm91dFRleHR9IiB0aXRsZT0ieyRhYm91dFRleHR9Ii8+PC9hPjwvdGQ+Ci0gICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPjxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZChudWxsKSIgY2xhc3M9InRvcHJpZ2h0bmF2IiBvbmNsaWNrPSJqYXZhc2NyaXB0OndpbmRvdy5vcGVuKCdhYm91dC5odG0nLCdhYm91dCcsJ2hlaWdodD0yNTAsd2lkdGg9MjUwLHN0YXR1cz1ubyxyZXNpemFibGU9eWVzJyk7Ij4mIzE2MDs8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFib3V0VGV4dCIvPjwvYT48L3RkPgotICAgICAgICAgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjUiIGhlaWdodD0iMTEiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjIiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0idG9wZnJhbWVoaWdobGlnaHQiIGNvbHNwYW49IjMiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWx0PSIiIHRpdGxlPSIiIC8+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0idG9wZnJhbWVoaWdobGlnaHQyIiBjb2xzcGFuPSIzIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0idG9wZnJhbWViZyIgY29sc3Bhbj0iMyI+Ci0JICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGFsaWduPSJyaWdodCIgIHN1bW1hcnk9IiI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjUiIGhlaWdodD0iMjAiIGFsdD0iaW1hZ2UiIHRpdGxlPSJpbWFnZSIvPjwvdGQ+Ci0JCQk8dGQ+Ci0gICAgICAgICAgICA8Zm9udCBzaXplPSIxIj4KLQkJCTwvZm9udD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gPHhzbDppZiB0ZXN0PSIkYWxsb3dBcHBsZXRTZWFyY2g9J3RydWUnICI+Ci0JCQk8dGQ+JiMxNjA7PC90ZD4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9ImhlYWRlcm1lZGxpc3QiPiYjMTYwOzwvdGQ+Ci0JCQk8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iNSIgaGVpZ2h0PSIyMCIgYWx0PSJpbWFnZSIgdGl0bGU9ImltYWdlIi8+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9ImhlYWRlcm1lZGxpc3QiPiYjMTYwOzwvdGQ+Ci0JCQk8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iOCIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJ0b3BmcmFtZXNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9InRvcGZyYW1laGlnaGxpZ2h0MiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotCQkgICAgPHRkPjxhIGhyZWY9IkphdmFTY3JpcHQ6b3BlblNlYXJjaCgpOyIgY2xhc3M9InRvcHJpZ2h0bmF2Ij48aW1nIHNyYz0iLi9pbWFnZXMvbmlfc2VhcmNoLmdpZiIgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBib3JkZXI9IjAiIGFsdD0ieyRzZWFyY2hUZXh0fSIgdGl0bGU9Inskc2VhcmNoVGV4dH0iLz48L2E+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+PGEgaHJlZj0iSmF2YVNjcmlwdDpvcGVuU2VhcmNoKCk7IiAgY2xhc3M9InRvcHJpZ2h0bmF2Z3JleSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZWFyY2hUZXh0Ii8+PC9hPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iNSIgaGVpZ2h0PSIxMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjEiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLSAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJ0b3BmcmFtZXNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9InRvcGZyYW1laGlnaGxpZ2h0MiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgICAgPHRkPjxhIGhyZWY9IkphdmFTY3JpcHQ6cHJpbnRQYWdlKCk7IiBjbGFzcz0idG9wcmlnaHRuYXYiPjxpbWcgc3JjPSIuL2ltYWdlcy9uaV9wcmludC5naWYiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNyIgYm9yZGVyPSIwIiBhbHQ9InskcHJpbnRUZXh0fSIgdGl0bGU9InskcHJpbnRUZXh0fSIvPjwvYT48L3RkPgotICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj48YSBocmVmPSJKYXZhU2NyaXB0OnByaW50UGFnZSgpOyIgIGNsYXNzPSJ0b3ByaWdodG5hdmdyZXkiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJpbnRUZXh0Ii8+PC9hPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0JICA8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJ0b3BmcmFtZXNoYWRvdyIgY29sc3Bhbj0iMyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9ImJnYmxhY2siIGNvbHNwYW49IjMiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gPC9mb3JtPgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KLQotCi08L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZGYwZjQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNDUxODNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5yY3A8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Yzk5MDg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQuaW5pIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjA0ZjRmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWZlYXR1cmVUZXh0Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1hcHBsaWNhdGlvbl8zMi5naWYKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi1hcHBOYW1lPSVmZWF0dXJlTmFtZQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLXdlbGNvbWVQYWdlPSRubCQvd2VsY29tZS54bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5tYXBwaW5ncyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWNhOTUyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLSMgVXN1YWxseSBnZW5lcmF0ZWQgYXQgYnVpbGQgdGltZS4KLQotMD1AYnVpbGRJZEAKLTE9MS4yLjAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1MjkwOTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIFJDUAotCi1mZWF0dXJlVGV4dD1FUEYgUkNQXG5cCi1cblwKLVZlcnNpb246IHsxfSBcblwKLUJ1aWxkIExhYmVsOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDQsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG5cCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2FwcGxpY2F0aW9uXzMyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hcHBsaWNhdGlvbl8zMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2FwcGxpY2F0aW9uXzMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjY2VjNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYXBwbGljYXRpb25fMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHdlbGNvbWUueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViOWZlMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1mZWF0dXJlUGx1Z2luTmFtZT1FUEYgUkNQIEZlYXR1cmUKLWZlYXR1cmVQbHVnaW5OYW1lTkw9RVBGIFJDUCBGZWF0dXJlIChOTDEpCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3Avd2VsY29tZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3Avd2VsY29tZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI2NDBkMDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL3dlbGNvbWUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08d2VsY29tZVBhZ2UgCi0JdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiPgotCi08aW50cm8+V2VsY29tZSB0byBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrCi08L2ludHJvPgotCi08aXRlbT48Yj5XaGF0IGlzIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms/PC9iPgotCQotPC9pdGVtPgotCi08aXRlbT48Yj5MZWFybiBNb3JlPC9iPgotCi08L2l0ZW0+Ci0KLTwvd2VsY29tZVBhZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGM0ZjIwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIj4KLQkJPGF0dHJpYnV0ZXM+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhdHRyaWJ1dGVzPgotCQk8L2F0dHJpYnV0ZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Ly5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Ly5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwZGQ4OTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIFJpY2ggVGV4dCBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGI3OWE3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjBlYTkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dAotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogcmljaHRleHQuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5jb21tb24sCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LAotIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLAotIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sLAotIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5wcmVmZXJlbmNlcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmZmJmOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXNvdXJjZS5yaWNodGV4dC5qYXIgPSBzcmMvCi1vdXRwdXQucmljaHRleHQuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gcmljaHRleHQuamFyLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcnRlLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRJbWFnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkSW1hZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MzA4YThhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRJbWFnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkTGluay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkTGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiMTExOTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZExpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZE9yZGVyZWRMaXN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRPcmRlcmVkTGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY5YWU0MTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZE9yZGVyZWRMaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRUYWJsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkVGFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMDg4NDYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRUYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkVW5vcmRlcmVkTGlzdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkVW5vcmRlcmVkTGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljNDRlYzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZFVub3JkZXJlZExpc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0JvbGQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0JvbGQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZGM1OTg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9Cb2xkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9DbGVhckNvbnRlbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0NsZWFyQ29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlmZjY0MTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0NsZWFyQ29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQ29weS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQ29weS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5YmM2NWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0NvcHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0N1dC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQ3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmQ0MzE0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQ3V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9GaW5kUmVwbGFjZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvRmluZFJlcGxhY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOGY4ODcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9GaW5kUmVwbGFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvSW5kZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9JbmRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MzZlMTUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9JbmRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0l0YWxpYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvSXRhbGljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzliNWE0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvSXRhbGljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9PdXRkZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9PdXRkZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWRjZGEzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvT3V0ZGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvUGFzdGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1Bhc3RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWM3NjY4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvUGFzdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1N1YnNjcmlwdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvU3Vic2NyaXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTdiMzFhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvU3Vic2NyaXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9TdXBlcnNjcmlwdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvU3VwZXJzY3JpcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNGIyNjZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9TdXBlcnNjcmlwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvVW5kZXJsaW5lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9VbmRlcmxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMmE5NjQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9VbmRlcmxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZEltYWdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRJbWFnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA1NDUyMTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZEltYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRMaW5lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRMaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2YwOGRjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkTGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkTGluay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkTGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5OTE5NGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZExpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZE9yZGVyZWRMaXN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRPcmRlcmVkTGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI2ODE0YzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZE9yZGVyZWRMaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRUYWJsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkVGFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMzY4ODU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRUYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkVW5vcmRlcmVkTGlzdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkVW5vcmRlcmVkTGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0ZmRmYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZFVub3JkZXJlZExpc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0JvbGQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0JvbGQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMGRmOWU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9Cb2xkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9DbGVhckNvbnRlbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0NsZWFyQ29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1NTgzMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0NsZWFyQ29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQ29weS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQ29weS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzMmFjZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0NvcHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0N1dC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQ3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2U4NjM1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQ3V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9GaW5kUmVwbGFjZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvRmluZFJlcGxhY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMTI1N2VjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9GaW5kUmVwbGFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSW5kZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9JbmRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ODE5NWQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9JbmRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0l0YWxpYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSXRhbGljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWQwY2QxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSXRhbGljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9KdXN0aWZ5Q2VudGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9KdXN0aWZ5Q2VudGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWVhYmYwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeUNlbnRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeUZ1bGwuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0p1c3RpZnlGdWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTkwYTNiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeUZ1bGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0p1c3RpZnlMZWZ0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9KdXN0aWZ5TGVmdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU4NTQ2OWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0p1c3RpZnlMZWZ0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9KdXN0aWZ5UmlnaHQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0p1c3RpZnlSaWdodC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDVhZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0p1c3RpZnlSaWdodC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvT3V0ZGVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvT3V0ZGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwNmI5NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L091dGRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1Bhc3RlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9QYXN0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0ZDM5YTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1Bhc3RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdHJpa2VUaHJvdWdoLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdHJpa2VUaHJvdWdoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTEwMzU0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvU3RyaWtlVGhyb3VnaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvU3Vic2NyaXB0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdWJzY3JpcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYzBmNzEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdWJzY3JpcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1N1cGVyc2NyaXB0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdXBlcnNjcmlwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyODY2MzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1N1cGVyc2NyaXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9VbmRlcmxpbmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1VuZGVybGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2NDc2ZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1VuZGVybGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MzczMjZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBSaWNoIFRleHQKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUSEUgRk9MTE9XSU5HIFBST1BFUlRJRVMgU0hPVUxEIE5PVCBCRSBUUkFOU0xBVEVEISEhCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRoZSBIVE1MIGZpbGUgdXNlZCB0byByZW5kZXIgdGhlIFJpY2ggVGV4dCBFZGl0b3IuCi1SaWNoVGV4dC5lZGl0b3JIVE1MPXJ0ZS5odG0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGU0OWI1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvYmxhbmsuaHRtIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL2JsYW5rLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2Q5NzI3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvYmxhbmsuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLQotPGh0bWw+Ci08aGVhZD4KLQk8dGl0bGU+PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS5jc3MgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvcnRlLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjI4OGRmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvcnRlLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDUxNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLWJvZHkKLXsKLQliYWNrZ3JvdW5kLWltYWdlOiBub25lOwotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0gCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotIAlmb250LXNpemU6IDEwcHQ7Ci0JbWFyZ2luOiAzcHg7Ci0JcGFkZGluZzogMHB4OyAJCi19Ci0KLXAKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci19Ci0KLWgxCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiBsYXJnZTsKLX0KLQotaDIKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1MCU7Ci19Ci0KLWgzCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci19Ci0KLWg0LCBoNSwgaDYKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLX0KLQotYTpsaW5rCi17Ci0JY29sb3I6ICMwMDMzOTk7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYTphY3RpdmUKLXsKLQljb2xvcjogIzAwMzM5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWE6dmlzaXRlZAotewotCWNvbG9yOiAjMDAzMzk5OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWE6aG92ZXIKLXsKLQljb2xvcjogI2ZmMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLW9sCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCWxpc3Qtc3R5bGUtdHlwZTogZGVjaW1hbDsKLQltYXJnaW4tbGVmdDogMzBweDsKLX0KLQotb2wgbGkKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1hbGlnbjogbGVmdAotfQotCi11bAotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlsaXN0LXN0eWxlLXR5cGU6IGRpc2M7Ci0JbWFyZ2luLWxlZnQ6IDMwcHg7Ci0JbWFyZ2luLXRvcDogNXB4OwotfQotCi11bCBsaQotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi10YWJsZQotewotCWJhY2tncm91bmQtaW1hZ2U6IG5vbmU7Ci0JYmFja2dyb3VuZDogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7CQotfQotCi10Ym9keQotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl2YWxpZ246IGJhc2VsaW5lOwotfQotCi10aAotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi10ZAotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLX0KLQotdGQgdWwKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JbWFyZ2luLWJvdHRvbTogMHB4OwotCW1hcmdpbi1sZWZ0OiAzMHB4OwotfQotCi0ucGFnZVRpdGxlCi17Ci0JYmFja2dyb3VuZDogIzk5OTljYzsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LXNpemU6IDEycHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JcGFkZGluZy1ib3R0b206IDVweDsKLQlwYWRkaW5nLWxlZnQ6IDEwcHg7Ci0JcGFkZGluZy1yaWdodDogMTBweDsKLQlwYWRkaW5nLXRvcDogNXB4OwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLS5wYWdlVGl0bGVTZXBhcmF0b3IKLXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotCXBhZGRpbmc6IDBweDsKLX0KLQotLnRhYgotewotCWJhY2tncm91bmQtY29sb3I6ICM1YzgxYTc7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5hY3RpdmVUYWIKLXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjYzhkN2UzOwotCWNvbG9yOiAjMjkzZDZiOwkKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7IAotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotYS50YWI6bGluaywgYS50YWI6YWN0aXZlLCBhLnRhYjp2aXNpdGVkCi17Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWEudGFiOmhvdmVyCi17Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CQotfQotCi0ub3ZlcnZpZXcKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQlwYWRkaW5nLWJvdHRvbTogMTBweDsKLQlwYWRkaW5nLWxlZnQ6IDIwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAxMHB4OwotfQotCi0ub3ZlcnZpZXdUYWJsZQotewotCWJhY2tncm91bmQ6ICNmZmZmZmY7Ci0Jd2lkdGg6IDEwMCU7CQotfQotCi0ub3ZlcnZpZXdUYWJsZSB0ZAotewotCXBhZGRpbmctYm90dG9tOiA1cHg7Ci0JcGFkZGluZy1sZWZ0OiA1cHg7Ci0JcGFkZGluZy1yaWdodDogNXB4OwotCXBhZGRpbmctdG9wOiA1cHg7Ci19Ci0KLS5vdmVydmlld1NlcGFyYXRvcgotewotCWJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7Ci0JcGFkZGluZzogMHB4OwotfQotCi0uZXhwYW5kQ29sbGFwc2VUZXh0Ci17Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotCXBhZGRpbmctbGVmdDogNXB4OwotCXBhZGRpbmctcmlnaHQ6IDVweDsKLX0KLQotLmV4cGFuZENvbGxhcHNlTGluawotewotCWNvbG9yOiAjMzMzMzMzOwotCXBhZGRpbmctYm90dG9tOiA1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uZXhwYW5kQ29sbGFwc2VMaW5rOmhvdmVyCi17Ci0JY29sb3I6ICMwMDAwZmY7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5leHBhbmRDb2xsYXBzZUxpbms6dmlzaXRlZAotewotCWNvbG9yOiAjMzMzMzMzOwotfQotCi0uc2VjdGlvbkhlYWRpbmcKLXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOThiMWM0OwotCWNvbG9yOiAjZmZmZmZmOwotCWN1cnNvcjogaGFuZDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JcGFkZGluZy1ib3R0b206IDJweDsKLQlwYWRkaW5nLWxlZnQ6IDJweDsKLQlwYWRkaW5nLXRvcDogMnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnNlY3Rpb25Db250ZW50Ci17Ci0JcGFkZGluZy1ib3R0b206IDBweDsKLQlwYWRkaW5nLWxlZnQ6IDBweDsKLQlwYWRkaW5nLXJpZ2h0OiAwcHg7Ci0JcGFkZGluZy10b3A6IDBweDsKLQl0ZXh0LWFsaWduOiByaWdodDsKLX0KLQotLnNlY3Rpb25UYWJsZQotewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMXB4OwotCXBhZGRpbmctYm90dG9tOiAxMHB4OwotCXBhZGRpbmctbGVmdDogMTBweDsKLQlwYWRkaW5nLXJpZ2h0OiAxMHB4OwotCXBhZGRpbmctdG9wOiAxMHB4OwotCXdpZHRoOiAxMDAlOwotfQotCi0uc2VjdGlvblRhYmxlSGVhZGluZwotewotCWJhY2tncm91bmQ6ICNlZWU7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JaGVpZ2h0OiAyMDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCXdpZHRoOiAyMCU7Ci19Ci0KLS5zZWN0aW9uVGFibGVDZWxsCi17Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci19Ci0KLS5icmVha2Rvd25UYWJsZQotewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMXB4OwotCXBhZGRpbmctYm90dG9tOiAwcHg7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAwcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5icmVha2Rvd25UYWJsZSB0aAotewotCWJhY2tncm91bmQ6ICNlZWU7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JaGVpZ2h0OiAyMDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi0uYnJlYWtkb3duVGFibGUgdGQKLXsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDBweDsKLX0KLQotLmRlZmF1bHRUYWJsZQotewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCXBhZGRpbmctYm90dG9tOiAwcHg7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAwcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5kZWZhdWx0VGFibGUgdGQKLXsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDBweDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi0uc3ViU2VjdGlvbkhlYWRpbmcKLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uc3ViU2VjdGlvbkNvbnRlbnQKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwkKLX0KLQotLnN0ZXBIZWFkaW5nCi17Ci0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLQljb2xvcjogIzI5M2Q2YjsKLQljdXJzb3I6IGhhbmQ7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXBhZGRpbmctYm90dG9tOiAycHg7Ci0JcGFkZGluZy1sZWZ0OiAycHg7Ci0JcGFkZGluZy10b3A6IDJweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5zdGVwQ29udGVudAotewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCXBhZGRpbmctYm90dG9tOiA1cHg7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAwcHg7Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLS5zdGVwVGFibGUKLXsKLQlib3JkZXItYm90dG9tOiAjOTk5OTk5IHNvbGlkIDFweDsKLQlib3JkZXItbGVmdDogIzk5OTk5OSBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjOTk5OTk5IHNvbGlkIDBweDsKLQlib3JkZXItdG9wOiAjOTk5OTk5IHNvbGlkIDBweDsKLQlwYWRkaW5nLWJvdHRvbTogMjBweDsKLQlwYWRkaW5nLWxlZnQ6IDEwcHg7Ci0JcGFkZGluZy1yaWdodDogMTBweDsKLQlwYWRkaW5nLXRvcDogMTBweDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLnN0ZXBUYWJsZSB0ZAotewotCWJvcmRlcjogI2NjYyBzb2xpZCAwcHg7Ci19Ci0KLS5zdGVwU2VwYXJhdG9yCi17Ci0JYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKLQlwYWRkaW5nOiAwcHg7Ci19Ci0KLS5iYWNrVG9Ub3BMaW5rCi17Ci0JY29sb3I6ICNmZmZmZjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsJCi0JbWFyZ2luOiAwcHg7Ci0JcGFkZGluZy1ib3R0b206IDEwcHg7Ci0JdGV4dC1hbGlnbjogbWlkZGxlOwkKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5iYWNrVG9Ub3BMaW5rOmhvdmVyCi17Ci0JY29sb3I6ICM5Njk7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5iYWNrVG9Ub3BMaW5rOnZpc2l0ZWQKLXsKLQljb2xvcjogIzVjODFhNzsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfQotCi0uY29weXJpZ2h0Ci17Ci0JY29sb3I6ICM3MDgwYjA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMTBweDsKLQlwYWRkaW5nLXRvcDogMjVweDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCXdpZHRoOiAxMDAlOwotfQotCi0udmVyc2lvbkluZm8KLXsKLQljb2xvcjogIzcwODBiMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQlwYWRkaW5nLWxlZnQ6IDEwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAyNXB4OwotCXRleHQtYWxpZ246IHJpZ2h0OwotfQotCi0ucXVvdGUKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uY29kZVNhbXBsZQotewotCWZvbnQtZmFtaWx5OiBjb3VyaWVyOwotCWZvbnQtc2l6ZTogMTBwdDsJCQotfQotCi0uZWxlbWVudExpbmsKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7CQotCWNvbG9yOiAjMDAwMGZmOwotfQotCi0uZWxlbWVudExpbmtXaXRoVHlwZQotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQljb2xvcjogIzAwMDBmZjsKLX0KLQotLmVsZW1lbnRMaW5rV2l0aFVzZXJUZXh0Ci17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCWNvbG9yOiAjMDAwMGZmOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NDUxY2I3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTxodG1sPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0JPGhlYWQ+Ci0JCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJydGUuanMiPjwvc2NyaXB0PgkJCi0JPC9oZWFkPgotCTxib2R5IGxlZnRNYXJnaW49IjAiIHRvcE1hcmdpbj0iMCIgbWFyZ2luaGVpZ2h0PSIwIiBtYXJnaW53aWR0aD0iMCIgc2Nyb2xsPSJubyIgc3R5bGU9Im92ZXJmbG93OiBoaWRkZW4iPgotCQk8aWZyYW1lIGlkPSJydGUiIG5hbWU9InJ0ZSIgc3R5bGU9ImJvcmRlcjogbm9uZTsiIGZyYW1lYm9yZGVyPSIwIiBzY3JvbGxpbmc9ImF1dG8iIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiPjwvaWZyYW1lPgotCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JCQlpbml0RWRpdG9yKCdydGUnLCAncnRlLmNzcycsIG51bGwpOwotCQk8L3NjcmlwdD4KLQk8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvcnRlLmpzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzI2ZThkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvcnRlLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTEyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBAYXV0aG9yIEtlbHZpbiBMb3cKLS8vIEBzaW5jZSAxLjAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBOb3RlOiBNb3ppbGxhL0ZpcmVmb3ggZG9lcyBub3QgYWxsb3cgdW5wcml2aWxlZ2VkIHNjcmlwdHMgdG8gaW52b2tlIHRoZSBjdXQsCi0vLyBjb3B5IGFuZCBwYXN0ZSBjb21tYW5kcy4gVGhlIEphdmFzY3JpcHQgbXVzdCBlaXRoZXIgYmUgc2lnbmVkCi0vLyAoc2VlIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvcHJvamVjdHMvc2VjdXJpdHkvY29tcG9uZW50cy9zaWduZWQtc2NyaXB0cy5odG1sKSwKLS8vIG9yIHRoZSB1c2VycyBtdXN0IGNoYW5nZSB0aGVpciBwcmVmZXJlbmNlcwotLy8gKHNlZSBodHRwOi8vd3d3Lm1vemlsbGEub3JnL2VkaXRvci9taWRhc2RlbW8vc2VjdXJpdHlwcmVmcy5odG1sKS4KLS8vIEFsdGVybmF0aXZlbHksIHRoZSB1c2VycyBjYW4gdXNlIHRoZSBjdHJsLXgsIGN0cmwtYyBhbmQgY3RybC12IGtleXMuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12YXIgU1RBVFVTX05PUCA9IDA7Ci12YXIgU1RBVFVTX0lOSVRJQUxJWkVEID0gMTsKLXZhciBTVEFUVVNfTU9ESUZJRUQgPSAyOwotdmFyIFNUQVRVU19HRVRfVEVYVCA9IDM7Ci12YXIgU1RBVFVTX0tFWV9ET1dOID0gNDsKLXZhciBTVEFUVVNfS0VZX1VQID0gNTsKLXZhciBTVEFUVVNfU0VMRUNUX1RFWFQgPSA2OwotdmFyIFNUQVRVU19TRUxFQ1RfQ09OVFJPTCA9IDc7Ci12YXIgU1RBVFVTX1NFTEVDVF9OT05FID0gODsKLXZhciBTVEFUVVNfRVhFQ19DTUQgPSA5OwotCi12YXIgS0VZX0FSUk9XX0RPV04gPSA0MDsKLXZhciBLRVlfQVJST1dfTEVGVCA9IDM3OwotdmFyIEtFWV9BUlJPV19SSUdIVCA9IDM5OwotdmFyIEtFWV9BUlJPV19VUCA9IDM4OwotdmFyIEtFWV9CQUNLU1BBQ0UgPSA4OwotdmFyIEtFWV9FTkQgPSAzNTsKLXZhciBLRVlfSE9NRSA9IDM2OwotdmFyIEtFWV9QQUdFX0RPV04gPSAzNDsKLXZhciBLRVlfUEFHRV9VUCA9IDMzOwotdmFyIEtFWV9UQUIgPSA5OwotdmFyIEtFWV9DID0gNjc7Ci12YXIgS0VZX0YgPSA3MDsKLXZhciBLRVlfUyA9IDgzOwotdmFyIEtFWV9WID0gODY7Ci12YXIgS0VZX1ggPSA4ODsKLXZhciBLRVlfWiA9IDkwOwotCi12YXIgQ01EX0NPUFkgPSAiY29weSI7Ci12YXIgQ01EX0NVVCA9ICJjdXQiOwotdmFyIENNRF9GSU5EX1RFWFQgPSAiZmluZFRleHQiOwotdmFyIENNRF9QQVNURSA9ICJwYXN0ZSI7Ci12YXIgQ01EX1NBVkUgPSAic2F2ZSI7Ci12YXIgQ01EX1NBVkVfQUxMID0gInNhdmVBbGwiOwotCi12YXIgVEFCTEVfSEVBREVSU19OT05FID0gMDsKLXZhciBUQUJMRV9IRUFERVJTX0NPTFMgPSAxOwotdmFyIFRBQkxFX0hFQURFUlNfUk9XUyA9IDI7Ci12YXIgVEFCTEVfSEVBREVSU19CT1RIID0gMzsKLQotdmFyIEJPTEQgPSAxOwotdmFyIElUQUxJQyA9IEJPTEQgPDwgMTsKLXZhciBVTkRFUkxJTkUgPSBJVEFMSUMgPDwgMTsKLXZhciBTVUJTQ1JJUFQgPSBVTkRFUkxJTkUgPDwgMTsKLXZhciBTVVBFUlNDUklQVCA9IFNVQlNDUklQVCA8PCAxOwotCi0KLXZhciBlZGl0b3JJZDsKLXZhciBlZGl0b3JDU1M7Ci12YXIgYmFzZUhSRUY7Ci12YXIgc3VwcG9ydFJpY2hUZXh0RWRpdGluZyA9IHRydWU7Ci12YXIgZWRpdG9yRG9jOwotdmFyIHNlbGVjdGlvbjsKLXZhciBzZWxlY3Rpb25SYW5nZTsKLXZhciByZWFkT25seSA9IGZhbHNlOwotdmFyIGluaXRpYWxpemVkID0gZmFsc2U7Ci12YXIgbW9kaWZpZWQgPSBmYWxzZTsKLQotLy8gSW5pdGlhbGl6ZXMgdGhlIGVkaXRvci4KLWZ1bmN0aW9uIGluaXRFZGl0b3IoaWQsIGNzcywgYmFzZVVSTCkgewotCWVkaXRvcklkID0gaWQ7Ci0JZWRpdG9yQ1NTID0gY3NzOwotCWJhc2VIUkVGID0gYmFzZVVSTDsKLQl0cnkgewotCQllbmFibGVSaWNoVGV4dEVkaXRpbmcoJycpOwotCQlpbml0aWFsaXplZCA9IHRydWU7Ci0JCXNldFN0YXR1cyhTVEFUVVNfSU5JVElBTElaRUQsIG51bGwpOwotCX0KLQljYXRjaCAoZSkgewotCQlzdXBwb3J0UmljaFRleHRFZGl0aW5nID0gZmFsc2U7Ci0JfQotfQotCi0vLyBIYW5kbGVzIHRoZSBrZXkgZXZlbnRzLgotZnVuY3Rpb24ga2V5UHJlc3NlZChldmVudCkgewotCXZhciBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTsKLQlpZiAoa2V5Q29kZSA9PSAwICYmICFkb2N1bWVudC5hbGwpIHsKLQkJa2V5Q29kZSA9IGV2ZW50LmNoYXJDb2RlOwotCQlzd2l0Y2ggKGtleUNvZGUpIHsKLQkJCWNhc2UgOTk6Ci0JCQkJa2V5Q29kZSA9IEtFWV9DOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxMDI6Ci0JCQkJa2V5Q29kZSA9IEtFWV9GOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxMTU6Ci0JCQkJa2V5Q29kZSA9IEtFWV9TOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxMTg6Ci0JCQkJa2V5Q29kZSA9IEtFWV9WOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxMjA6Ci0JCQkJa2V5Q29kZSA9IEtFWV9YOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxMjI6Ci0JCQkJa2V5Q29kZSA9IEtFWV9aOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCXZhciBjdHJsS2V5ID0gZXZlbnQuY3RybEtleTsKLQl2YXIgc2hpZnRLZXkgPSBldmVudC5zaGlmdEtleTsKLQkKLQlzd2l0Y2goa2V5Q29kZSkgewotCQljYXNlIEtFWV9BUlJPV19ET1dOOgotCQljYXNlIEtFWV9BUlJPV19MRUZUOgotCQljYXNlIEtFWV9BUlJPV19SSUdIVDoKLQkJY2FzZSBLRVlfQVJST1dfVVA6Ci0JCWNhc2UgS0VZX0VORDoKLQkJY2FzZSBLRVlfSE9NRToKLQkJY2FzZSBLRVlfUEFHRV9ET1dOOgotCQljYXNlIEtFWV9QQUdFX1VQOgotCQljYXNlIEtFWV9UQUI6Ci0JCQlicmVhazsKLQkJY2FzZSBLRVlfQkFDS1NQQUNFOgotCQkJaWYgKCFyZWFkT25seSkgewotCQkJCXNldFRpbWVvdXQoInNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOyIsIDEwKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEtFWV9DOgotCQkJaWYgKGN0cmxLZXkpIHsKLQkJCQlzZXRTdGF0dXMoU1RBVFVTX0tFWV9ET1dOLCBDTURfQ09QWSk7Ci0JCQl9Ci0JCQllbHNlIGlmICghZG9jdW1lbnQuYWxsICYmIHJlYWRPbmx5KSB7Ci0JCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJCX0KLQkJCWJyZWFrOwkJCQotCQljYXNlIEtFWV9GOgotCQkJaWYgKGN0cmxLZXkpIHsKLQkJCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJCWV2ZW50LmtleUNvZGUgPSAtMTsKLQkJCQkJZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQkJfQotCQkJCXNldFN0YXR1cyhTVEFUVVNfS0VZX0RPV04sIENNRF9GSU5EX1RFWFQpOwotCQkJfQotCQkJZWxzZSBpZiAoIWRvY3VtZW50LmFsbCAmJiByZWFkT25seSkgewotCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBLRVlfUzoKLQkJCWlmICghcmVhZE9ubHkgJiYgY3RybEtleSkgewotCQkJCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCQkJZXZlbnQua2V5Q29kZSA9IC0xOwotCQkJCQlldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJCQl9Ci0JCQkJaWYgKHNoaWZ0S2V5KSB7Ci0JCQkJCXNldFN0YXR1cyhTVEFUVVNfS0VZX0RPV04sIENNRF9TQVZFX0FMTCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzZXRTdGF0dXMoU1RBVFVTX0tFWV9ET1dOLCBDTURfU0FWRSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoIWRvY3VtZW50LmFsbCAmJiByZWFkT25seSkgewotCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQl9CQkJCi0JCQlicmVhazsKLQkJY2FzZSBLRVlfVjoKLQkJCWlmIChjdHJsS2V5KSB7CQkKLQkJCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJCWV2ZW50LmtleUNvZGUgPSAtMTsKLQkJCQkJZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTsKLQkJCQkJaWYgKCFyZWFkT25seSkgewotCQkJCQkJc2V0U3RhdHVzKFNUQVRVU19LRVlfRE9XTiwgQ01EX1BBU1RFKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKCFyZWFkT25seSkgewotCQkJCQkJLy8gV29ya2Fyb3VuZCBNb3ppbGxhL0ZpcmVmb3ggcGFzdGUgaXNzdWVzLgotCQkJCQkJc2V0VGltZW91dCgic2V0U3RhdHVzKFNUQVRVU19LRVlfRE9XTiwgQ01EX1BBU1RFKTsiLCAxMCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoIWRvY3VtZW50LmFsbCAmJiByZWFkT25seSkgewotCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBLRVlfWDoKLQkJCWlmIChjdHJsS2V5KSB7Ci0JCQkJc2V0U3RhdHVzKFNUQVRVU19LRVlfRE9XTiwgQ01EX0NVVCk7Ci0JCQl9Ci0JCQllbHNlIGlmICghZG9jdW1lbnQuYWxsICYmIHJlYWRPbmx5KSB7Ci0JCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEtFWV9aOgotCQkJaWYgKCFyZWFkT25seSAmJiBjdHJsS2V5KSB7Ci0JCQkJc2V0VGltZW91dCgic2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7IiwgMTApOwotCQkJfQotCQkJZWxzZSBpZiAoIWRvY3VtZW50LmFsbCAmJiByZWFkT25seSkgewotCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQl9CQkJCi0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWlmICghZG9jdW1lbnQuYWxsICYmIHJlYWRPbmx5KSB7Ci0JCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJCX0KLQl9Ci19Ci0KLWZ1bmN0aW9uIHNlbENoYW5nZWQoZXZlbnQpIHsKLQl1cGRhdGVTZWxlY3Rpb24oKTsKLX0KLQotZnVuY3Rpb24gZW5hYmxlUmljaFRleHRFZGl0aW5nKGh0bWwpIHsKLQl2YXIgZG9jID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7Ci0JZG9jLmRlc2lnbk1vZGUgPSAib24iOwotCQotCXZhciBodG1sU3JjID0gJzxodG1sPjxoZWFkPjx0aXRsZT48L3RpdGxlPic7Ci0JCi0JaWYgKGVkaXRvckNTUyAhPSBudWxsICYmIGVkaXRvckNTUyAhPSAnJykgewotCQlodG1sU3JjICs9ICc8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9IicgKyBlZGl0b3JDU1MgKyAnIiB0eXBlPSJ0ZXh0L2NzcyIvPic7Ci0JfQotCQotCWlmIChiYXNlSFJFRiAhPSBudWxsICYmIGJhc2VIUkVGICE9ICcnKSB7CQotCQlodG1sU3JjICs9ICc8YmFzZSBocmVmPSInICsgYmFzZUhSRUYgKyAnIi8+JzsKLQl9Ci0JCi0JaWYgKCFkb2N1bWVudC5hbGwgJiYgaHRtbCA9PSAnJykgewotCQkvLyBNb3ppbGxhL0ZpcmVmb3ggd2lsbCBvbmx5IGRpc3BsYXkgdGhlIGNhcmV0IGlmIDxici8+IGlzIGFkZGVkIHRvIHRoZSBIVE1MIGJvZHkuCi0JCS8vIEFkZGluZyA8YnIvPiBhbHNvIGVuYWJsZXMgdGhlIGJhY2tzcGFjZSBhbmQgZGVsZXRlIGtleSBieSBkZWZhdWx0LiBPdGhlcndpc2UsIHRoZQotCQkvLyB1c2VyIG5lZWQgdG8gZW50ZXIgc29tZSB0ZXh0IGJlZm9yZSB0aGVzZSAyIGtleXMgc3RhcnQgdG8gZnVuY3Rpb24uCi0JCWh0bWwgPSAiPGJyLz4iOwotCX0KLQkKLQlodG1sU3JjICs9ICc8L2hlYWQ+PGJvZHk+JyArIGh0bWwgKyAnPC9ib2R5PjwvaHRtbD4nOwotCQotCWRvYy5vcGVuKCk7Ci0JZG9jLndyaXRlKGh0bWxTcmMpOwotCWRvYy5jbG9zZSgpOwotCQotCW1vZGlmaWVkID0gZmFsc2U7Ci0KLQlpZiAoImF0dGFjaEV2ZW50IiBpbiBkb2MpIHsKLQkJZG9jLmF0dGFjaEV2ZW50KCJvbmtleWRvd24iLCBrZXlQcmVzc2VkKTsKLQkJZG9jLmF0dGFjaEV2ZW50KCJvbnNlbGVjdGlvbmNoYW5nZSIsIHNlbENoYW5nZWQpOwotCX0JCi0JaWYgKCJhZGRFdmVudExpc3RlbmVyIiBpbiBkb2MpIHsKLQkJZG9jLmFkZEV2ZW50TGlzdGVuZXIoImtleXByZXNzIiwga2V5UHJlc3NlZCwgdHJ1ZSk7Ci0JCWRvYy5hZGRFdmVudExpc3RlbmVyKCJrZXlwcmVzcyIsIHNlbENoYW5nZWQsIGZhbHNlKTsKLQkJZG9jLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCBzZWxDaGFuZ2VkLCBmYWxzZSk7Ci0JfQotCi0KLQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLX0KLQotLy8gU2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBlZGl0b3IuCi1mdW5jdGlvbiBzZXRIZWlnaHQoaGVpZ2h0KSB7Ci0JaWYgKGluaXRpYWxpemVkKSB7Ci0JCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVkaXRvcklkKS5oZWlnaHQgPSBoZWlnaHQgKyAicHgiOwotCX0KLX0KLQotLy8gU2V0cyB0aGUgc3RhdHVzLgotLy8gTm90ZTogQnkgZGVmYXVsdCwgRmlyZWZveCBkaXNhYmxlcyBjaGFuZ2VzIHRvIHRoZSBzdGF0dXMgYmFyLiBGb3IgdGhpcyB0byB3b3JrLCB0aGUgdXNlcgotLy8gbXVzdCBzZXQgdGhlIGdsb2JhbCBwcmVmZXJlbmNlICJkb20uZGlzYWJsZV93aW5kb3dfc3RhdHVzX2NoYW5nZSIgdG8gZmFsc2UuCi0vLyBGb3IgRmlyZWZveCAxLjAueCwgdGhpcyBzZXR0aW5nIGNhbiBiZSBtYWRlIGluIC91c3IvZmlyZWZveC0xLjAuNy9kZWZhdWx0cy9wcmVmL2ZpcmVmb3guanMuCi1mdW5jdGlvbiBzZXRTdGF0dXModHlwZSwgdmFsdWUpIHsKLQl2YXIgc3RhdHVzID0gJyQkJCcgKyB0eXBlOwotCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9ICcnKSB7Ci0JCXN0YXR1cyArPSAoJyQnICsgdmFsdWUpOwkJCi0JfQotCXdpbmRvdy5zdGF0dXMgPSBzdGF0dXM7Ci0Jd2luZG93LnN0YXR1cyA9ICckJCQnICsgU1RBVFVTX05PUDsKLX0KLQotLy8gUmV0dXJucyB0aGUgSFRNTCBzb3VyY2UuCi1mdW5jdGlvbiBnZXRIVE1MKCkgewotCXZhciBodG1sID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw7Ci0JaWYgKGh0bWwgPT0gIjxQPiZuYnNwOzwvUD4iKSB7Ci0JCWh0bWwgPSAiIjsKLQl9Ci0JaWYgKGh0bWwgIT0gbnVsbCAmJiBodG1sICE9ICcnKSB7Ci0JCXZhciByZWdFeCA9IG5ldyBSZWdFeHAoIlwiZmlsZVw6KFtePV0qKSgvcmVzb3VyY2VzLykoLispXCIiLCAnZycpOwotCQlodG1sID0gaHRtbC5yZXBsYWNlKHJlZ0V4LCAiXCIuL3Jlc291cmNlcy8kM1wiIik7Ci0JCXJlZ0V4ID0gbmV3IFJlZ0V4cCgiXCJmaWxlXDooW149XSopLyMoLispXCIiLCAnZycpOwotCQlodG1sID0gaHRtbC5yZXBsYWNlKHJlZ0V4LCAiXCIjJDJcIiIpOwotCX0KLQlyZXR1cm4gaHRtbDsKLX0KLQotLy9SZXR1cm5zIHRoZSBIVE1MIHNvdXJjZSB0byB0aGUgSmF2YSBsYXllcgotZnVuY3Rpb24gZ2V0VGV4dCgpIHsKLQl2YXIgaHRtbCA9IGdldEhUTUwoKTsKLQlzZXRTdGF0dXMoU1RBVFVTX0dFVF9URVhULCBodG1sKTsKLQlyZXR1cm4gaHRtbDsKLX0KLQotZnVuY3Rpb24gc2V0SW5uZXJIVE1MKGh0bWwpIHsKLQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCS8vIElFIGhhcyBwcm9ibGVtIHNldHRpbmcgY29tcGxleCBIVE1MIHNldCB2aWEgZG9jLmJvZHkuaW5uZXJIVE1MLgotCQllbmFibGVSaWNoVGV4dEVkaXRpbmcoaHRtbCk7Ci0JfQotCWVsc2UgewotCQlpZiAoaHRtbCA9PSAnJykgewotCQkJLy8gTW96aWxsYS9GaXJlZm94IHdpbGwgb25seSBkaXNwbGF5IHRoZSBjYXJldCBpZiA8YnIvPiBpcyBhZGRlZCB0byB0aGUgSFRNTCBib2R5LgotCQkJaHRtbCA9ICI8YnIvPiI7Ci0JCX0KLQkJdmFyIGRvYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVkaXRvcklkKS5jb250ZW50V2luZG93LmRvY3VtZW50OwotCQlpZiAoZG9jLmJvZHkgIT0gbnVsbCkgewotCQkJZG9jLmJvZHkuaW5uZXJIVE1MID0gaHRtbDsKLQkJfQotCQllbHNlIHsKLQkJCS8vIE1vemlsbGEvRmlyZWZveCBjYW4gdGFrZSBhIHdoaWxlIHRvIGluaXRpYWxpemUgZG9jdW1lbnQuYm9keQotCQkJLy8gYWZ0ZXIgZG9jdW1lbnQud3JpdGUoKS4KLQkJCXRyeSB7Ci0JCQkJc2V0VGltZW91dCgic2V0SW5uZXJIVE1MKCciICsgaHRtbCArICInKTsiLCAxMCk7Ci0JCQl9Ci0JCQljYXRjaCAoZSkgewotCQkJfQotCQl9Ci0JfQotfQotCi0vLyBTZXRzIHRoZSBIVE1MIHNvdXJjZS4KLWZ1bmN0aW9uIHNldFRleHQoaHRtbCkgewotCWlmIChzdXBwb3J0UmljaFRleHRFZGl0aW5nKSB7Ci0JCWh0bWwgPSBkZWNvZGVTdHJpbmcoaHRtbCk7Ci0JCXNldElubmVySFRNTChodG1sKTsKLQkJbW9kaWZpZWQgPSBmYWxzZTsKLQkJc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7Ci0JfQotfQotCi0vLyBEZWNvZGVzIHRoZSBIVE1MIHBhc3NlZCBmcm9tIHRoZSBKYXZhIGxheWVyLgotZnVuY3Rpb24gZGVjb2RlU3RyaW5nKHN0cikgewotCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIgIT0gJycpIHsKLQkJaWYgKGRvY3VtZW50LmFsbCkgewotCQkJc3RyID0gc3RyLnJlcGxhY2UoLyVzcSUvZywgIiciKTsKLQkJCXN0ciA9IHN0ci5yZXBsYWNlKC8lRU9MJS9nLCAiXG4iKTsKLQkJfQotCQllbHNlIHsKLQkJCXN0ciA9IHN0ci5yZXBsYWNlKC8lc3ElL2csICImYXBvczsiKTsKLQkJCXN0ciA9IHN0ci5yZXBsYWNlKC8lRU9MJS9nLCAiIik7Ci0JCQlzdHIgPSBzdHIucmVwbGFjZSgvXG4vZywgIiIpOwotCQl9Ci0JfQotCXJldHVybiBzdHI7Ci19Ci0KLS8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGFuZCBzZWxlY3Rpb24gcmFuZ2UuCi1mdW5jdGlvbiB1cGRhdGVTZWxlY3Rpb24oKSB7Ci0JaWYgKCFzdXBwb3J0UmljaFRleHRFZGl0aW5nKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9CQotCQotCWNvbnRlbnRXaW5kb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlZGl0b3JJZCkuY29udGVudFdpbmRvdzsKLQllZGl0b3JEb2MgPSBjb250ZW50V2luZG93LmRvY3VtZW50OwotCQotLy8JY29udGVudFdpbmRvdy5mb2N1cygpOwotCQotCXZhciB0ZW1wU2VsUmFuZ2U7Ci0JdmFyIHNlbE9mZnNldFN0YXJ0ID0gMDsKLQl2YXIgc2VsZWN0ZWRUZXh0ID0gIiI7Ci0JdmFyIGZvbnROYW1lID0gIiI7Ci0JdmFyIGZvbnRTaXplID0gIiI7Ci0JdmFyIGJsb2NrU3R5bGUgPSAiIjsKLQl2YXIgdGV4dEZsYWdzID0gMDsKLQkKLQkKLQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCXNlbGVjdGlvbiA9IGVkaXRvckRvYy5zZWxlY3Rpb247Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uUmFuZ2UgPSBzZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTsKLQkJCXRlbXBTZWxSYW5nZSA9IHNlbGVjdGlvblJhbmdlLmR1cGxpY2F0ZSgpOwotCQkJcmVmb3JtYXRFbGVtZW50TGlua3MoKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJc2VsZWN0aW9uID0gY29udGVudFdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25SYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KHNlbGVjdGlvbi5yYW5nZUNvdW50IC0gMSkuY2xvbmVSYW5nZSgpOwotCQkJdGVtcFNlbFJhbmdlID0gc2VsZWN0aW9uUmFuZ2UuY2xvbmVSYW5nZSgpOwotCQl9Ci0JfQotCi0JLy9UT0RPOiB0aGlzIGlzIHByb2JhYmx5IElFIG9ubHkKLQlpZiAodGVtcFNlbFJhbmdlICE9IG51bGwpIHsKLQkJaWYgKGRvY3VtZW50LmFsbCkgewotCQkJc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uUmFuZ2UudGV4dDsKLQkJCS8qIGZvciBnZXR0aW5nIHNlbGVjdGlvbiBvZmZzZXQgLSBjb21tZW50ZWQgYmVjYXVzZSB3ZSBjYW4ndCBzZWxlY3QgdGhlCi0JCQkgKiBwcm9wZXIgbG9jYXRpb24gaW4gdGhlIEhUTUwgc291cmNlIHRhYiBiZWNhdXNlIEpUaWR5J3MgcmVmb3JtYXR0aW5nIG9mIHRoZSBIVE1MCi0JCQl2YXIgaHRtbCA9IGdldEhUTUwoKTsKLSAgICAgICAgICAgIHZhciB0ZW1wU2VsTGVuID0gdGVtcFNlbFJhbmdlLmh0bWxUZXh0Lmxlbmd0aDsJCQkKLSAgICAgICAgICAgIHRlbXBTZWxSYW5nZS5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIC1odG1sLmxlbmd0aCk7Ci0gICAgICAgICAgICBzZWxPZmZzZXRTdGFydCA9IHRlbXBTZWxSYW5nZS5odG1sVGV4dC5sZW5ndGggLSB0ZW1wU2VsTGVuOwotICAgICAgICAgICAgKi8KLQkJCXZhciBzZWxQYXJlbnQgPSB0ZW1wU2VsUmFuZ2UucGFyZW50RWxlbWVudCgpOwotCQkJZm9udE5hbWUgPSB0ZW1wU2VsUmFuZ2UucXVlcnlDb21tYW5kVmFsdWUoJ2ZvbnROYW1lJyk7Ci0JCQlmb250U2l6ZSA9IHRlbXBTZWxSYW5nZS5xdWVyeUNvbW1hbmRWYWx1ZSgnZm9udFNpemUnKTsKLQkJCWJsb2NrU3R5bGUgPSB0ZW1wU2VsUmFuZ2UucXVlcnlDb21tYW5kVmFsdWUoJ2Zvcm1hdEJsb2NrJyk7Ci0JCQlpZiAoYmxvY2tTdHlsZSA9PSAiTm9ybWFsIikgewotCQkJCWlmIChzZWxQYXJlbnQuY2xhc3NOYW1lID09ICJxdW90ZSIpIHsKLQkJCQkJYmxvY2tTdHlsZSA9ICI8cXVvdGU+IjsKLQkJCQl9IGVsc2UgaWYgKHNlbFBhcmVudC5jbGFzc05hbWUgPT0gImNvZGVTYW1wbGUiKSB7Ci0JCQkJCWJsb2NrU3R5bGUgPSAiPGNvZGU+IjsKLQkJCQl9IGVsc2UgewotCQkJCQlibG9ja1N0eWxlID0gIjxwPiI7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChibG9ja1N0eWxlID09ICJIZWFkaW5nIDMiKSB7Ci0JCQkJYmxvY2tTdHlsZSA9ICI8aDM+IjsKLQkJCX0gZWxzZSBpZiAoYmxvY2tTdHlsZSA9PSAiSGVhZGluZyA0IikgewotCQkJCWJsb2NrU3R5bGUgPSAiPGg0PiI7Ci0JCQl9IGVsc2UgaWYgKGJsb2NrU3R5bGUgPT0gIkhlYWRpbmcgNSIpIHsKLQkJCQlibG9ja1N0eWxlID0gIjxoNT4iOwotCQkJfQotCQkJaWYgKHRlbXBTZWxSYW5nZS5xdWVyeUNvbW1hbmRWYWx1ZSgnYm9sZCcpID09IHRydWUpIHsKLQkJCQl0ZXh0RmxhZ3MgfD0gQk9MRDsKLQkJCX0KLQkJCWlmICh0ZW1wU2VsUmFuZ2UucXVlcnlDb21tYW5kVmFsdWUoJ2l0YWxpYycpID09IHRydWUpIHsKLQkJCQl0ZXh0RmxhZ3MgfD0gSVRBTElDOwotCQkJfQotCQkJaWYgKHRlbXBTZWxSYW5nZS5xdWVyeUNvbW1hbmRWYWx1ZSgndW5kZXJsaW5lJykgPT0gdHJ1ZSkgewotCQkJCXRleHRGbGFncyB8PSBVTkRFUkxJTkU7Ci0JCQl9Ci0JCQlpZiAodGVtcFNlbFJhbmdlLnF1ZXJ5Q29tbWFuZFZhbHVlKCdzdWJzY3JpcHQnKSA9PSB0cnVlKSB7Ci0JCQkJdGV4dEZsYWdzIHw9IFNVQlNDUklQVDsKLQkJCX0KLQkJCWlmICh0ZW1wU2VsUmFuZ2UucXVlcnlDb21tYW5kVmFsdWUoJ3N1cGVyc2NyaXB0JykgPT0gdHJ1ZSkgewotCQkJCXRleHRGbGFncyB8PSBTVVBFUlNDUklQVDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHNlbGVjdGlvblJhbmdlICE9IG51bGwpIHsKLQkJCQkJc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uUmFuZ2UudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQkJdmFyIHNlbFBhcmVudCA9IHNlbGVjdGlvbi5mb2N1c05vZGU7Ci0JCQkJZm9udE5hbWUgPSBlZGl0b3JEb2MucXVlcnlDb21tYW5kVmFsdWUoJ2ZvbnROYW1lJyk7Ci0JCQkJaWYgKGZvbnROYW1lID09ICIiKSB7Ci0JCQkJCWZvbnROYW1lID0gImRlZmF1bHQiOwotCQkJCX0KLQkJCQlmb250U2l6ZSA9IGVkaXRvckRvYy5xdWVyeUNvbW1hbmRWYWx1ZSgnZm9udFNpemUnKTsKLQkJCQlpZiAoZm9udFNpemUgPT0gIiIpIHsKLQkJCQkJZm9udFNpemUgPSAiZGVmYXVsdCI7Ci0JCQkJfQotCQkJCWJsb2NrU3R5bGUgPSBlZGl0b3JEb2MucXVlcnlDb21tYW5kVmFsdWUoJ2Zvcm1hdEJsb2NrJyk7Ci0JCQkJaWYgKGJsb2NrU3R5bGUgPT0gInAiKSB7Ci0JCQkJCWlmIChzZWxQYXJlbnQucGFyZW50Tm9kZS5jbGFzc05hbWUgPT0gInF1b3RlIikgewotCQkJCQkJYmxvY2tTdHlsZSA9ICI8cXVvdGU+IjsKLQkJCQkJfSBlbHNlIGlmIChzZWxQYXJlbnQucGFyZW50Tm9kZS5jbGFzc05hbWUgPT0gImNvZGVTYW1wbGUiKSB7Ci0JCQkJCQlibG9ja1N0eWxlID0gIjxjb2RlPiI7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlibG9ja1N0eWxlID0gIjxwPiI7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGJsb2NrU3R5bGUgPT0gImgzIikgewotCQkJCQlibG9ja1N0eWxlID0gIjxoMz4iOwotCQkJCX0gZWxzZSBpZiAoYmxvY2tTdHlsZSA9PSAiaDQiKSB7Ci0JCQkJCWJsb2NrU3R5bGUgPSAiPGg0PiI7Ci0JCQkJfSBlbHNlIGlmIChibG9ja1N0eWxlID09ICJoNSIpIHsKLQkJCQkJYmxvY2tTdHlsZSA9ICI8aDU+IjsKLQkJCQl9IGVsc2UgaWYgKGJsb2NrU3R5bGUgPT0gIiIpIHsKLQkJCQkJYmxvY2tTdHlsZSA9ICI8cD4iOwotCQkJCX0KLQkJCQlpZiAoZWRpdG9yRG9jLnF1ZXJ5Q29tbWFuZFN0YXRlKCdib2xkJykgPT0gdHJ1ZSkgewotCQkJCQl0ZXh0RmxhZ3MgfD0gQk9MRDsKLQkJCQl9Ci0JCQkJaWYgKGVkaXRvckRvYy5xdWVyeUNvbW1hbmRTdGF0ZSgnaXRhbGljJykgPT0gdHJ1ZSkgewotCQkJCQl0ZXh0RmxhZ3MgfD0gSVRBTElDOwotCQkJCX0KLQkJCQlpZiAoZWRpdG9yRG9jLnF1ZXJ5Q29tbWFuZFN0YXRlKCd1bmRlcmxpbmUnKSA9PSB0cnVlKSB7Ci0JCQkJCXRleHRGbGFncyB8PSBVTkRFUkxJTkU7Ci0JCQkJfQotCQkJCWlmIChlZGl0b3JEb2MucXVlcnlDb21tYW5kU3RhdGUoJ3N1YnNjcmlwdCcpID09IHRydWUpIHsKLQkJCQkJdGV4dEZsYWdzIHw9IFNVQlNDUklQVDsKLQkJCQl9Ci0JCQkJaWYgKGVkaXRvckRvYy5xdWVyeUNvbW1hbmRTdGF0ZSgnc3VwZXJzY3JpcHQnKSA9PSB0cnVlKSB7Ci0JCQkJCXRleHRGbGFncyB8PSBTVVBFUlNDUklQVDsKLQkJCQl9Ci0JCQl9IGNhdGNoIChlKSB7ICB9Ci0JCQkKLQkJfQotCQkJCQkJCi0JCXNldFN0YXR1cyhTVEFUVVNfU0VMRUNUX1RFWFQsIC8qIHNlbE9mZnNldFN0YXJ0ICsgIiQiICsgKi8KLQkJCQlmb250TmFtZSArICIkIiArIGZvbnRTaXplICsgIiQiICsgYmxvY2tTdHlsZSArICIkIiArIHRleHRGbGFncyArICIkIiArIHNlbGVjdGVkVGV4dCk7Ci0JfQkKLQotCXJldHVybiB0cnVlOwotfQotCi0vLyBTZXRzIGZvY3VzIHRvIHRoaXMgZWRpdG9yLgotZnVuY3Rpb24gc2V0Rm9jdXMoKSB7Ci0JaWYgKHVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwkKLQl9Ci19Ci0KLS8vIFJlZm9ybWF0cyBlbGVtZW50IGxpbmtzIGNyZWF0ZWQgdmlhIGRyYWcgJiBkcm9wLgotZnVuY3Rpb24gcmVmb3JtYXRFbGVtZW50TGlua3MoKSB7Ci0JdmFyIGxpbmtzUmVmb3JtYXR0ZWQgPSAwOwotCXZhciBlbGVtZW50cyA9IGVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnQScpOwotCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJaWYgKGVsZW1lbnQuY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2VsZW1lbnRsaW5rd2l0aHR5cGUnKSB7Ci0gCQkJaWYgKGVsZW1lbnQuZmlyc3RDaGlsZCAhPSBudWxsICYmIGVsZW1lbnQuZmlyc3RDaGlsZC5maXJzdENoaWxkICE9IG51bGwgJiYKLSAJCQkJZWxlbWVudC5maXJzdENoaWxkLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZCAhPSBudWxsKSB7Ci0gCQkJCXZhciBsaW5rVGV4dCA9IGVsZW1lbnQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQubm9kZVZhbHVlOwotIAkJCQllbGVtZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQuZmlyc3RDaGlsZCk7Ci0gCQkJCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZWRpdG9yRG9jLmNyZWF0ZVRleHROb2RlKGxpbmtUZXh0KSk7Ci0gCQkJCWxpbmtzUmVmb3JtYXR0ZWQrKzsKLSAJCQl9Ci0JCX0KLQl9Ci0JaWYgKGxpbmtzUmVmb3JtYXR0ZWQgPiAwKSB7Ci0JCXNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOwotCX0KLX0KLQotLy8gRm9ybWF0cyB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGZvcm1hdFRleHQoY29tbWFuZCwgb3B0aW9uKSB7Ci0JaWYgKCFyZWFkT25seSAmJiB1cGRhdGVTZWxlY3Rpb24oKSkgewotCQlpZiAoZWRpdG9yRG9jLmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCBvcHRpb24pKSB7Ci0JCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsJCQotCQkJc2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7Ci0JCX0KLQl9Ci19Ci0KLS8vIEFkZHMgSFRNTC4KLWZ1bmN0aW9uIGFkZEhUTUwoaHRtbCkgewotCWlmICghcmVhZE9ubHkgJiYgaHRtbCAhPSAiIikgIHsKLQkJaHRtbCA9IGRlY29kZVN0cmluZyhodG1sKTsKLQkJaWYgKHVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJaWYgKHNlbGVjdGlvblJhbmdlLnRleHQgIT0gbnVsbCkgewotCQkJCQlzZWxlY3Rpb25SYW5nZS5wYXN0ZUhUTUwoaHRtbCk7Ci0JCQkJCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCQkJCQlzZXRTdGF0dXMoU1RBVFVTX01PRElGSUVELCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZWxlY3Rpb25SYW5nZS5kZWxldGVDb250ZW50cygpOwotCQkJCXZhciBkb2N1bWVudEZyYWdtZW50ID0gc2VsZWN0aW9uUmFuZ2UuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGh0bWwpOwotCQkJCXNlbGVjdGlvblJhbmdlLmluc2VydE5vZGUoZG9jdW1lbnRGcmFnbWVudCk7Ci0JCQkJc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7Ci0JCQkJc2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLS8vIEFkZHMgYW4gaW1hZ2UuCi1mdW5jdGlvbiBhZGRJbWFnZSh1cmwsIGhlaWdodCwgd2lkdGgsIGFsdCkgewotCWlmICh1cmwgIT0gbnVsbCAmJiB1cmwgIT0gJycpIHsKLQkJZm9ybWF0VGV4dCgnaW5zZXJ0aW1hZ2UnLCB1cmwpOwotCX0KLQlpZiAodXBkYXRlU2VsZWN0aW9uKCkpIHsJCi0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24udHlwZSA9PSAnQ29udHJvbCcgJiYgc2VsZWN0aW9uUmFuZ2UgIT0gbnVsbCkgewotCQkJaWYgKGhlaWdodCAhPSBudWxsICYmIGhlaWdodCAhPSAnJykgc2VsZWN0aW9uUmFuZ2UuaXRlbSgpLmhlaWdodCA9IGhlaWdodDsKLQkJCWlmICh3aWR0aCAhPSBudWxsICYmIHdpZHRoICE9ICcnKSBzZWxlY3Rpb25SYW5nZS5pdGVtKCkud2lkdGggPSB3aWR0aDsKLQkJCWlmIChhbHQgIT0gbnVsbCkgc2VsZWN0aW9uUmFuZ2UuaXRlbSgpLmFsdCA9IGFsdDsJCQotCQl9Ci0JfQotfQotCi0vLyBBZGRzIGEgaG9yaXpvbnRhbCBsaW5lLgotZnVuY3Rpb24gYWRkTGluZSgpIHsKLQlmb3JtYXRUZXh0KCdpbnNlcnRob3Jpem9udGFscnVsZScsIG51bGwpOwotfQotCi0vLyBBZGRzIGEgbGluay4KLWZ1bmN0aW9uIGFkZExpbmsodXJsKSB7Ci0JaWYgKCFyZWFkT25seSAmJiB1cmwgIT0gbnVsbCAmJiB1cmwgIT0gJycgJiYgdXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJaWYgKGRvY3VtZW50LmFsbCkgewotCQkJaWYgKHNlbGVjdGlvblJhbmdlLnRleHQgPT0gbnVsbCB8fCBzZWxlY3Rpb25SYW5nZS50ZXh0ID09ICcnKSB7Ci0JCQkJc2VsZWN0aW9uUmFuZ2UudGV4dCA9IHVybDsKLQkJCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJCQlzZXRTdGF0dXMoU1RBVFVTX01PRElGSUVELCBudWxsKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHNlbGVjdGlvblJhbmdlLmV4ZWNDb21tYW5kKCdjcmVhdGVsaW5rJywgZmFsc2UsIHVybCkpIHsKLQkJCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJCQlzZXRTdGF0dXMoU1RBVFVTX01PRElGSUVELCBudWxsKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24gPT0gIiIpIHsJCQotCQkJCXZhciB1cmxUZXh0Tm9kZSA9IGVkaXRvckRvYy5jcmVhdGVUZXh0Tm9kZSh1cmwpOwotCQkJCWluc2VydE5vZGVBdFNlbGVjdGlvbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlZGl0b3JGcmFtZUlkKS5jb250ZW50V2luZG93LCB1cmxUZXh0Tm9kZSk7Ci0JCQl9CQkJCi0JCQlpZiAoZWRpdG9yRG9jLmV4ZWNDb21tYW5kKCdjcmVhdGVsaW5rJywgZmFsc2UsIHVybCkpIHsKLQkJCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJCQlzZXRTdGF0dXMoU1RBVFVTX01PRElGSUVELCBudWxsKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLy8gQWRkcyBhbiBvcmRlcmVkIGxpc3QuCi1mdW5jdGlvbiBhZGRPcmRlcmVkTGlzdCgpIHsKLQlmb3JtYXRUZXh0KCdpbnNlcnRvcmRlcmVkbGlzdCcsIG51bGwpOwotfQotCi0vLyBBZGRzIGEgdGFibGUuCi1mdW5jdGlvbiBhZGRUYWJsZShyb3dzLCBjb2xzLCB3aWR0aCwgc3VtbWFyeSwgY2FwdGlvbiwgdGFibGVoZWFkZXJzKSB7Ci0JaWYgKHJlYWRPbmx5KSByZXR1cm47Ci0JaWYgKHJvd3MgPT0gMCkgcm93cyA9IDI7Ci0JaWYgKGNvbHMgPT0gMCkgY29scyA9IDI7Ci0JaWYgKHdpZHRoID09IDApIHdpZHRoID0gIjg1JSI7Ci0JaWYgKHVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCXZhciB0YWJsZSA9IGVkaXRvckRvYy5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpOwotCQl0YWJsZS5jZWxsUGFkZGluZyA9ICIyIjsKLQkJdGFibGUuY2VsbFNwYWNpbmcgPSAiMCI7Ci0JCXRhYmxlLmJvcmRlciA9ICIxIjsKLQkJdGFibGUud2lkdGggPSB3aWR0aDsKLQkJaWYgKHN1bW1hcnkgIT0gbnVsbCAmJiBzdW1tYXJ5ICE9ICcnKSB7Ci0JCQl0YWJsZS5zdW1tYXJ5ID0gc3VtbWFyeTsKLQkJfQotCQlpZiAoY2FwdGlvbiAhPSBudWxsICYmIGNhcHRpb24gIT0gJycpIHsKLQkJCXRhYmxlLmNyZWF0ZUNhcHRpb24oKTsKLQkJCXZhciBjYXB0aW9uTm9kZSA9IGVkaXRvckRvYy5jcmVhdGVUZXh0Tm9kZShjYXB0aW9uKTsKLQkJCXRhYmxlLmNhcHRpb24uYXBwZW5kQ2hpbGQoY2FwdGlvbk5vZGUpOwotCQl9Ci0JCXRib2R5ID0gZWRpdG9yRG9jLmNyZWF0ZUVsZW1lbnQoInRib2R5Iik7Ci0JCWZvciAodmFyIGkgPSAwOyBpIDwgcm93czsgaSsrKSB7Ci0JCQl0ciA9IGVkaXRvckRvYy5jcmVhdGVFbGVtZW50KCJ0ciIpOwotCQkJCWZvciAodmFyIGogPSAwOyBqIDwgY29sczsgaisrKSB7Ci0JCQkJCWlmIChpID09IDAgJiYgKHRhYmxlaGVhZGVycyA9PSBUQUJMRV9IRUFERVJTX0NPTFMgfHwgdGFibGVoZWFkZXJzID09IFRBQkxFX0hFQURFUlNfQk9USCkpIHsKLQkJCQkJdGggPSBlZGl0b3JEb2MuY3JlYXRlRWxlbWVudCgidGgiKTsKLQkJCQkJdGguc2NvcGUgPSAiY29sIjsKLQkJCQkJaWYgKCFkb2N1bWVudC5hbGwpIHsKLQkJCQkJCWJyID0gZWRpdG9yRG9jLmNyZWF0ZUVsZW1lbnQoImJyIik7Ci0JCQkJCQl0aC5hcHBlbmRDaGlsZChicik7Ci0JCQkJCX0KLQkJCQkJdHIuYXBwZW5kQ2hpbGQodGgpOwotCQkJCX0KLQkJCQllbHNlIGlmIChqID09IDAgJiYgKHRhYmxlaGVhZGVycyA9PSBUQUJMRV9IRUFERVJTX1JPV1MgfHwgdGFibGVoZWFkZXJzID09IFRBQkxFX0hFQURFUlNfQk9USCkpIHsKLQkJCQkJdGggPSBlZGl0b3JEb2MuY3JlYXRlRWxlbWVudCgidGgiKTsKLQkJCQkJdGguc2NvcGUgPSAicm93IjsKLQkJCQkJaWYgKCFkb2N1bWVudC5hbGwpIHsKLQkJCQkJCWJyID0gZWRpdG9yRG9jLmNyZWF0ZUVsZW1lbnQoImJyIik7Ci0JCQkJCQl0aC5hcHBlbmRDaGlsZChicik7Ci0JCQkJCX0KLQkJCQkJdHIuYXBwZW5kQ2hpbGQodGgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGQgPSBlZGl0b3JEb2MuY3JlYXRlRWxlbWVudCgidGQiKTsKLQkJCQkJaWYgKCFkb2N1bWVudC5hbGwpIHsKLQkJCQkJCWJyID0gZWRpdG9yRG9jLmNyZWF0ZUVsZW1lbnQoImJyIik7Ci0JCQkJCQl0ZC5hcHBlbmRDaGlsZChicik7Ci0JCQkJCX0KLQkJCQkJdHIuYXBwZW5kQ2hpbGQodGQpOwotCQkJCX0KLQkJCX0KLQkJCXRib2R5LmFwcGVuZENoaWxkKHRyKTsKLSAgICAJfQotCQl0YWJsZS5hcHBlbmRDaGlsZCh0Ym9keSk7Ci0JCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCXNlbGVjdGlvblJhbmdlLnBhcmVudEVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0YWJsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZWxlY3Rpb25SYW5nZS5pbnNlcnROb2RlKHRhYmxlKTsKLQkJfQotCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJc2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7CQkJCi0JfQotfQotCi0vLyBBZGRzIGFuIHVub3JkZXJlZCBsaXN0LgotZnVuY3Rpb24gYWRkVW5vcmRlcmVkTGlzdCgpIHsKLQlmb3JtYXRUZXh0KCdpbnNlcnR1bm9yZGVyZWRsaXN0JywgbnVsbCk7Ci19Ci0KLS8vIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBiYWNrQ29sb3IoY29sb3IpIHsKLQlpZiAoY29sb3IgIT0gbnVsbCAmJiBjb2xvciAhPSAnJykgewotCQlmb3JtYXRUZXh0KCdiYWNrY29sb3InLCBjb2xvcik7Ci0JfQotfQotCi0vLyBUb2dnbGVzIHRoZSAnYm9sZCcgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gYm9sZCgpIHsKLQlmb3JtYXRUZXh0KCdib2xkJywgbnVsbCk7Ci19Ci0KLS8vIENvcGllcyB0aGUgc2VsZWN0ZWQgdGV4dCB0byB0aGUgY2xpcGJvYXJkLgotZnVuY3Rpb24gY29weSgpIHsKLQlpZiAodXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJaWYgKGVkaXRvckRvYy5leGVjQ29tbWFuZCgnY29weScsIGZhbHNlLCBudWxsKSkgewotCQkJc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7Ci0JCX0KLQl9Ci19Ci0KLS8vIEN1dHMgdGhlIHNlbGVjdGVkIHRleHQgdG8gdGhlIGNsaXBib2FyZC4KLWZ1bmN0aW9uIGN1dCgpIHsKLQlmb3JtYXRUZXh0KCdjdXQnLCBudWxsKTsKLX0KLQotLy8gRGVsZXRlcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGRlbGV0ZVRleHQoKSB7Ci0JZm9ybWF0VGV4dCgnZGVsZXRlJywgbnVsbCk7Ci19Ci0KLS8vIEZpbmRzIHRleHQuCi1mdW5jdGlvbiBmaW5kVGV4dCh0ZXh0LCBkaXIsIG9wdGlvbnMpIHsKLQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQgPT0gIiIpIHsKLQkJcmV0dXJuOwotCX0KLQllbHNlIHsKLQkJdGV4dCA9IGRlY29kZVN0cmluZyh0ZXh0KTsKLQl9Ci0JCi0JaWYgKHVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCXNlbGVjdGlvblJhbmdlLmNvbGxhcHNlKGRpciA8IDApOwotCQkJaWYgKHNlbGVjdGlvblJhbmdlLmZpbmRUZXh0KHRleHQsIGRpciwgb3B0aW9ucykpIHsKLQkJCQlzZWxlY3Rpb25SYW5nZS5zY3JvbGxJbnRvVmlldygpOwotCQkJCXNlbGVjdGlvblJhbmdlLnNlbGVjdCgpOwotCQkJCXNlbGVjdGlvblJhbmdlLmNvbGxhcHNlKGRpciA8IDApOwotCQkJCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCQkJfQotCQl9Ci0JCWVsc2UgewkKLQkJCS8vIGZpbmQodGV4dCwgY2FzZVNlbnNpdGl2ZSwgYmFja3dhcmRzLCB3cmFwQXJvdW5kLCB3aG9sZVdvcmQsIHNlYXJjaEluRnJhbWVzLCBzaG93RGlhbG9nKQotCQkJdmFyIGNhc2VTZW5zaXRpdmUgPSB0cnVlOwotCQkJdmFyIGJhY2t3YXJkcyA9IGZhbHNlOwotCQkJdmFyIHdob2xlV29yZCA9IHRydWU7Ci0JCQlpZiAoKG9wdGlvbnMgJiA0KSA9PSAwKSBjYXNlU2Vuc2l0aXZlID0gZmFsc2U7Ci0JCQlpZiAoZGlyID09IC0xKSBiYWNrd2FyZHMgPSB0cnVlOwotCQkJaWYgKChvcHRpb25zICYgMikgPT0gMCkgd2hvbGVXb3JkID0gZmFsc2U7Ci0JCQlpZiAoY29udGVudFdpbmRvdy5maW5kKHRleHQsIGNhc2VTZW5zaXRpdmUsIGJhY2t3YXJkcywgZmFsc2UsIHdob2xlV29yZCwgZmFsc2UsIGZhbHNlKSkgewotCQkJCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vLyBTZXRzIHRoZSBmb3JlZ3JvdW5kIGNvbG9yIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gZm9yZUNvbG9yKGNvbG9yKSB7Ci0JaWYgKGNvbG9yICE9IG51bGwgJiYgY29sb3IgIT0gJycpIHsKLQkJZm9ybWF0VGV4dCgnZm9yZWNvbG9yJywgY29sb3IpOwotCX0KLX0KLQotLy8gRm9ybWF0cyB0aGUgc2VsZWN0ZWQgdGV4dCB1c2luZyB0aGUgZ2l2ZW4gSFRNTCBoZWFkaW5nIHRhZy4KLWZ1bmN0aW9uIGZvcm1hdEJsb2NrKHRhZykgewotCWlmICh0YWcgIT0gbnVsbCAmJiB0YWcgIT0gJycpIHsKLQkJZm9ybWF0VGV4dCgnZm9ybWF0YmxvY2snLCB0YWcpOwotCX0KLX0KLQotLy8gSW5kZW50cyB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGluZGVudCgpIHsKLQlmb3JtYXRUZXh0KCdpbmRlbnQnLCBudWxsKTsKLX0KLQotLy8gVG9nZ2xlcyB0aGUgJ2l0YWxpYycgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gaXRhbGljKCkgewotCWZvcm1hdFRleHQoJ2l0YWxpYycsIG51bGwpOwotfQotCi0vLyBDZW50ZXIganVzdGlmaWVzIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24ganVzdGlmeUNlbnRlcigpIHsKLQlmb3JtYXRUZXh0KCdqdXN0aWZ5Y2VudGVyJywgbnVsbCk7Ci19Ci0KLS8vIEZ1bGx5IGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGp1c3RpZnlGdWxsKCkgewotCWZvcm1hdFRleHQoJ2p1c3RpZnlmdWxsJywgbnVsbCk7Ci19Ci0KLS8vIExlZnQganVzdGlmaWVzIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24ganVzdGlmeUxlZnQoKSB7Ci0JZm9ybWF0VGV4dCgnanVzdGlmeWxlZnQnLCBudWxsKTsKLX0KLQotLy8gUmlnaHQganVzdGlmaWVzIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24ganVzdGlmeVJpZ2h0KCkgewotCWZvcm1hdFRleHQoJ2p1c3RpZnlyaWdodCcsIG51bGwpOwotfQotCi0vLyBPdXRkZW50cyB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIG91dGRlbnQoKSB7Ci0JZm9ybWF0VGV4dCgnb3V0ZGVudCcsIG51bGwpOwotfQotCi0vLyBQYXN0ZXMgdGV4dCBmcm9tIHRoZSBjbGlwYm9hcmQuCi1mdW5jdGlvbiBwYXN0ZShzb3VyY2VVUkwpIHsKLQlpZiAoc291cmNlVVJMID09IG51bGwpIHsKLQkJc291cmNlVVJMID0gIiI7Ci0JfQotCWVsc2UgewotCQlzb3VyY2VVUkwgPSBkZWNvZGVTdHJpbmcoc291cmNlVVJMKTsKLQl9Ci0JaWYgKGRvY3VtZW50LmFsbCkgewotCQl2YXIgU1RBUlRfTUFSS0VSID0gIkFfLV8tXyI7Ci0JCXZhciBFTkRfTUFSS0VSID0gIjouOi46IjsKLQkJLy8gbWFyayBpbWcgYW5kIDxhIC8+IGxpbmtzIHdpdGggU1RBUlRfTUFSS0VSICsgc3JjL2hyZWYgKyBFTkRfTUFSS0VSIGluIHRoZSBpZCwgZm9yIGxhdGVyIHJlY292ZXJ5Ci0JCXZhciBlbGVtZW50cyA9IGVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyk7Ci0JCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQl2YXIgaWQgPSBlbGVtZW50LmlkOwotCQkJZWxlbWVudC5pZCA9IFNUQVJUX01BUktFUiArIGVsZW1lbnQuc3JjICsgRU5EX01BUktFUiArIGlkOwotCQl9Ci0JCXZhciBlbGVtZW50cyA9IGVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYScpOwotCQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJdmFyIGlkID0gZWxlbWVudC5pZDsKLQkJCWVsZW1lbnQuaWQgPSBTVEFSVF9NQVJLRVIgKyBlbGVtZW50LmhyZWYgKyBFTkRfTUFSS0VSICsgaWQ7Ci0JCX0KLQotCQkvLyBjaGFuZ2UgdGhlIDxiYXNlPiBvZiB0aGUgZG9jdW1lbnQKLQkJdmFyIG9sZEJhc2VIUkVGID0gZWRpdG9yRG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdiYXNlJylbMF0uaHJlZjsKLQkJZWRpdG9yRG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdiYXNlJylbMF0uaHJlZiA9IHNvdXJjZVVSTDsKLQotCQlmb3JtYXRUZXh0KCdwYXN0ZScsIG51bGwpOwotCQkKLQkJLy8gcmVzdG9yZSA8YmFzZT4KLQkJZWRpdG9yRG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdiYXNlJylbMF0uaHJlZiA9IG9sZEJhc2VIUkVGOwotCX0KLQllbHNlIHsKLQkJc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7Ci0JCXNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOwotCX0KLQlpZiAodXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJdHJ5IHsKLQkJCXZhciByZWdFeFJlcyA9IG5ldyBSZWdFeHAoImZpbGVcOihbXj1dKykoL3Jlc291cmNlcy8pKC4rKSIsICdnJyk7Ci0JCQl2YXIgcmVnRXggPSBuZXcgUmVnRXhwKCJmaWxlXDooW149XSspLyhbXi9dKykiLCAnZycpOwkKLQkJCXZhciByZWdFeElEID0gbmV3IFJlZ0V4cChTVEFSVF9NQVJLRVIgKyAiKC4qPykiICsgRU5EX01BUktFUiArICIoLio/KSIpOwotCQkJdmFyIGVsZW1lbnRzID0gZWRpdG9yRG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKTsKLQkJCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCXZhciBpZCA9IGVsZW1lbnQuaWQ7Ci0JCQkJaWYgKGlkICE9IG51bGwgJiYgaWQgIT0gJycpIHsKLQkJCQkJUmVnRXhwLmxhc3RJbmRleD0wOwotCQkJCQl2YXIgbWF0Y2hBcnJheSA9IGlkLm1hdGNoKHJlZ0V4SUQpOwotCQkJCQlpZiAobWF0Y2hBcnJheSAhPSBudWxsICYmIG1hdGNoQXJyYXkubGVuZ3RoID4gMSkgewotCQkJCQkJZWxlbWVudC5zcmMgPSBtYXRjaEFycmF5WzFdOwotCQkJCQkJaWYgKG1hdGNoQXJyYXkubGVuZ3RoID4gMiAmJiBtYXRjaEFycmF5WzJdLmxlbmd0aCA+IDApIHsKLQkJCQkJCQllbGVtZW50LmlkID0gbWF0Y2hBcnJheVsyXTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdpZCcpOwotCQkJCQkJfQotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdmFyIHNyYyA9IGVsZW1lbnQuc3JjOwotCQkJCWlmIChzcmMgIT0gbnVsbCAmJiBzcmMgIT0gJycpIHsKLQkJCQkJaWYgKHNyYy5pbmRleE9mKCdyZXNvdXJjZXMnKSAhPSAtMSkgewotCQkJCQkJZWxlbWVudC5zcmMgPSBzcmMucmVwbGFjZShyZWdFeFJlcywgIi4vcmVzb3VyY2VzLyQzIik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQllbGVtZW50LnNyYyA9IHNyYy5yZXBsYWNlKHJlZ0V4LCAiLi9yZXNvdXJjZXMvJDIiKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXZhciBlbGVtZW50cyA9IGVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYScpOwotCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQkJdmFyIGlkID0gZWxlbWVudC5pZDsKLQkJCQlpZiAoaWQgIT0gbnVsbCAmJiBpZCAhPSAnJykgewotCQkJCQlSZWdFeHAubGFzdEluZGV4PTA7Ci0JCQkJCXZhciBtYXRjaEFycmF5ID0gaWQubWF0Y2gocmVnRXhJRCk7Ci0JCQkJCWlmIChtYXRjaEFycmF5ICE9IG51bGwgJiYgbWF0Y2hBcnJheS5sZW5ndGggPiAxKSB7Ci0JCQkJCQllbGVtZW50LmhyZWYgPSBtYXRjaEFycmF5WzFdOwotCQkJCQkJaWYgKG1hdGNoQXJyYXkubGVuZ3RoID4gMiAmJiBtYXRjaEFycmF5WzJdLmxlbmd0aCA+IDApIHsKLQkJCQkJCQllbGVtZW50LmlkID0gbWF0Y2hBcnJheVsyXTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdpZCcpOwotCQkJCQkJfQotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdmFyIGhyZWYgPSBlbGVtZW50LmhyZWY7Ci0JCQkJaWYgKGhyZWYgIT0gbnVsbCAmJiBocmVmICE9ICcnKSB7Ci0JCQkJCWlmIChocmVmLmluZGV4T2YoJ3Jlc291cmNlcycpICE9IC0xKSB7Ci0JCQkJCQllbGVtZW50LmhyZWYgPSBocmVmLnJlcGxhY2UocmVnRXhSZXMsICIuL3Jlc291cmNlcy8kMyIpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZWxlbWVudC5ocmVmID0gaHJlZi5yZXBsYWNlKHJlZ0V4LCAiLi9yZXNvdXJjZXMvJDIiKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoZSkgewotCQl9Ci0JfQotfQotCi0vLyBSZWRvIHRoZSBwcmV2aW91cyBjb21tYW5kLgotZnVuY3Rpb24gcmVkbygpIHsKLQlmb3JtYXRUZXh0KCdyZWRvJywgbnVsbCk7Ci19Ci0KLS8vIFJlZG8gdGhlIHByZXZpb3VzIGNvbW1hbmQuCi1mdW5jdGlvbiByZW1vdmVGb3JtYXQoKSB7Ci0JZm9ybWF0VGV4dCgncmVtb3ZlZm9ybWF0JywgbnVsbCk7Ci19Ci0KLQotCi1mdW5jdGlvbiBfcmVwbGFjZUFsbFRleHQoZmluZFRleHQsIHJlcGxhY2VUZXh0LCBvcHRpb25zKSB7Ci0JLy8gdGhpcyBpcyBJRSBvbmx5Ci0JaWYgKGRvY3VtZW50LmFsbCkgewotCQl2YXIgdGVtcFJhbmdlID0gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVkaXRvcklkKS5jb250ZW50V2luZG93LmRvY3VtZW50LmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7Ci0JCXRlbXBSYW5nZS5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIC0xMDAwMDAwMDAwMCk7Ci0JCXRlbXBSYW5nZS5jb2xsYXBzZSgpOwotCQlkbyB7Ci0JCQlpZiAodGVtcFJhbmdlLmZpbmRUZXh0KGZpbmRUZXh0LCAxMDAwMDAwMDAwMCwgb3B0aW9ucykpIHsKLQkJCQl0ZW1wUmFuZ2UudGV4dCA9IHJlcGxhY2VUZXh0OwotCQkJCXRlbXBSYW5nZS5zZWxlY3QoKTsKLQkJCX0gZWxzZSB7CQkKLQkJCQlicmVhazsKLQkJCX0KLQkJfSB3aGlsZSAodHJ1ZSk7Ci0JfQotfQotCi0vLyBSZXBsYWNlcyBhbGwgdGV4dC4KLWZ1bmN0aW9uIHJlcGxhY2VBbGxUZXh0KGZpbmRUZXh0LCByZXBsYWNlVGV4dCwgb3B0aW9ucykgewotCWlmIChyZWFkT25seSB8fCBmaW5kVGV4dCA9PSBudWxsIHx8IGZpbmRUZXh0ID09ICIiKSB7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZSB7Ci0JCWZpbmRUZXh0ID0gZGVjb2RlU3RyaW5nKGZpbmRUZXh0KTsKLQl9Ci0JaWYgKHJlcGxhY2VUZXh0ID09IG51bGwpIHsKLQkJcmVwbGFjZVRleHQgPSAiIjsKLQl9Ci0JZWxzZSB7Ci0JCXJlcGxhY2VUZXh0ID0gZGVjb2RlU3RyaW5nKHJlcGxhY2VUZXh0KTsKLQl9Ci0JCi0JaWYgKGRvY3VtZW50LmFsbCkgewotCQkvLyBUT0RPOiBNb3ZlIHRoZSBpbnNlcnRpb24gcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBIVE1MCi0JCS8vIGFuZCBwZXJmb3JtIGEgc2VhcmNoIGFuZCByZXBsYWNlIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbi4gCi0JCV9yZXBsYWNlQWxsVGV4dChmaW5kVGV4dCwgcmVwbGFjZVRleHQsIG9wdGlvbnMpOwotCX0KLQllbHNlIHsKLQkJLy8gVE9ETzogRW11bGF0ZSB0aGUgSUUgaW1wbGVtZW50YXRpb24uCi0JCXZhciBodG1sID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw7Ci0JCXZhciBvcHRpb25TdHIgPSAiL2ciOwotCQlpZiAoKG9wdGlvbnMgJiA0KSA9PSAwKSB7Ci0JCQlvcHRpb25TdHIgKz0gImkiOwotCQl9Ci0JCXZhciByZWdFeHAgPSBldmFsKCIvIiArIGZpbmRUZXh0ICsgb3B0aW9uU3RyKTsKLQkJaHRtbCA9IGh0bWwucmVwbGFjZShyZWdFeHAsIHJlcGxhY2VUZXh0KTsKLQkJc2V0VGV4dChodG1sKTsKLQl9Ci0JCi0Jc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7Ci0Jc2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7Ci19Ci0KLS8vIFJlcGxhY2VzIHRleHQuCi1mdW5jdGlvbiByZXBsYWNlVGV4dChyZXBsYWNlVGV4dCwgZGlyLCBvcHRpb25zKSB7Ci0JaWYgKHJlYWRPbmx5IHx8ICF1cGRhdGVTZWxlY3Rpb24oKSkgewotCQlyZXR1cm47Ci0JfQotCWlmIChyZXBsYWNlVGV4dCA9PSBudWxsKSB7Ci0JCXJlcGxhY2VUZXh0ID0gIiI7Ci0JfQotCWVsc2UgewotCQlyZXBsYWNlVGV4dCA9IGRlY29kZVN0cmluZyhyZXBsYWNlVGV4dCk7Ci0JfQotCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJc2VsZWN0aW9uUmFuZ2UudGV4dCA9IHJlcGxhY2VUZXh0OwotCQlpZiAocmVwbGFjZVRleHQgIT0gIiIpIHsKLQkJCXNlbGVjdGlvblJhbmdlLm1vdmVTdGFydCgid29yZCIsIC0xKTsKLQkJCXNlbGVjdGlvblJhbmdlLnNlbGVjdCgpOwotCQkJc2VsZWN0aW9uUmFuZ2UuY29sbGFwc2UoZGlyIDwgMCk7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCXNlbGVjdGlvblJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7Ci0JCXNlbGVjdGlvblJhbmdlLmluc2VydE5vZGUoZWRpdG9yRG9jLmNyZWF0ZVRleHROb2RlKHJlcGxhY2VUZXh0KSk7Ci0JfQotCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCXNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOwotfQotCi0vLyBTZWxlY3RzIGFsbCB0ZXh0LgotZnVuY3Rpb24gc2VsZWN0QWxsKCkgewotCWlmICh1cGRhdGVTZWxlY3Rpb24oKSkgewotCQlpZiAoZWRpdG9yRG9jLmV4ZWNDb21tYW5kKCdzZWxlY3RhbGwnLCBmYWxzZSwgbnVsbCkpIHsKLQkJCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCQl9Ci0JfQotfQotCi0vLyBTZXRzIHRoZSBmb250IG5hbWUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gc2V0Rm9udE5hbWUobmFtZSkgewotCWlmICh1cGRhdGVTZWxlY3Rpb24oKSkgewotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAobmFtZSA9PSAnJykgewotCQkJCWZvcm1hdFRleHQoJ3JlbW92ZUZvcm1hdCcpOwotCQkJfSBlbHNlIHsKLQkJCQlmb3JtYXRUZXh0KCdmb250bmFtZScsIG5hbWUpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vLyBTZXRzIHRoZSBmb250IHNpemUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gc2V0Rm9udFNpemUoc2l6ZSkgewotCWlmICh1cGRhdGVTZWxlY3Rpb24oKSkgewotCQlpZiAoc2l6ZSAhPSBudWxsKSB7Ci0JCQlpZiAoc2l6ZSA9PSAnJykgewotCQkJCWZvcm1hdFRleHQoJ3JlbW92ZUZvcm1hdCcpOwotCQkJfSBlbHNlIHsKLQkJCQlmb3JtYXRUZXh0KCdmb250c2l6ZScsIHNpemUpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vLyBTZXRzIHRoZSBmb250IHN0eWxlIGZvciB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIHNldEZvbnRTdHlsZShzdHlsZSkgeyAKLQlpZiAoIXJlYWRPbmx5ICYmIHN0eWxlICE9IG51bGwgJiYgc3R5bGUgIT0gJycgJiYgdXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJdHJ5IHsKLQkJCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCQlzZWxlY3Rpb25SYW5nZS5leGVjQ29tbWFuZCgicmVtb3ZlZm9ybWF0Iik7Ci0JCQkJc2VsZWN0aW9uUmFuZ2UucGFyZW50RWxlbWVudCgpLnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3NOYW1lIik7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKGUpIHsKLQkJfQotCQlpZiAoc3R5bGUgPT0gIjxxdW90ZT4iKSB7Ci0JCQlmb3JtYXRUZXh0KCdmb3JtYXRibG9jaycsICc8cD4nKTsKLQkJCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCQlzZWxlY3Rpb25SYW5nZS5wYXJlbnRFbGVtZW50KCkuY2xhc3NOYW1lID0gInF1b3RlIjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNlbGVjdGlvbi5mb2N1c05vZGUucGFyZW50Tm9kZS5jbGFzc05hbWUgPSAicXVvdGUiOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHN0eWxlID09ICI8Y29kZT4iKSB7Ci0JCQlmb3JtYXRUZXh0KCdmb3JtYXRibG9jaycsICc8cD4nKTsKLQkJCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCQlzZWxlY3Rpb25SYW5nZS5wYXJlbnRFbGVtZW50KCkuY2xhc3NOYW1lID0gImNvZGVTYW1wbGUiOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2VsZWN0aW9uLmZvY3VzTm9kZS5wYXJlbnROb2RlLmNsYXNzTmFtZSA9ICJjb2RlU2FtcGxlIjsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmICghZG9jdW1lbnQuYWxsICYmIHN0eWxlID09ICI8cD4iKSB7Ci0JCQkJLy8gQSBoYWNrIHRvIGdldCByaWQgb2YgdGhlICJjbGFzc05hbWUiIGF0dHJpYnV0ZSBpbiBNb3ppbGxhL0ZpcmVmb3guCi0JCQkJZm9ybWF0VGV4dCgnZm9ybWF0YmxvY2snLCAnPGg0PicpOwotCQkJfQotCQkJZm9ybWF0VGV4dCgnZm9ybWF0YmxvY2snLCBzdHlsZSk7Ci0JCX0KLQl9Ci19Ci0KLS8vIFNldHMgd2hldGhlciB0aGUgY29udGVudCBjYW4gYmUgZWRpdGVkLgotZnVuY3Rpb24gc2V0RWRpdGFibGUoZWRpdGFibGUpIHsKLQl2YXIgZG9jID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7Ci0gICAgaWYgKGVkaXRhYmxlICE9IG51bGwgJiYgZWRpdGFibGUgPT0gJ3RydWUnKSB7Ci0JCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCWRvYy5ib2R5LmNvbnRlbnRFZGl0YWJsZSA9ICJ0cnVlIjsKLQkJfQotCQllbHNlIHsKLQkJCWRvYy5kZXNpZ25Nb2RlID0gIm9uIjsKLQkJfQotCQlyZWFkT25seSA9IGZhbHNlOwotCX0KLQllbHNlIHsKLQkJaWYgKGRvY3VtZW50LmFsbCkgewkJCi0JCQlkb2MuYm9keS5jb250ZW50RWRpdGFibGUgPSAiZmFsc2UiOwotCQl9Ci0JCWVsc2UgewotCQkJZG9jLmRlc2lnbk1vZGUgPSAib2ZmIjsKLQkJfQotCQlyZWFkT25seSA9IHRydWU7Ci0JfQotCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwkKLX0KLQotLy8gVG9nZ2xlcyB0aGUgJ3N0cmlrZS10aHJvdWdoJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBzdHJpa2VUaHJvdWdoKCkgewotCWZvcm1hdFRleHQoJ3N0cmlrZXRocm91Z2gnLCBzaXplKTsKLX0KLQotLy8gVG9nZ2xlcyB0aGUgJ3N1YnNjcmlwdCcgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gc3Vic2NyaXB0KCkgewotCWZvcm1hdFRleHQoJ3N1YnNjcmlwdCcsIG51bGwpOwotfQotCi0vLyBUb2dnbGVzIHRoZSAnc3VwZXJzY3JpcHQnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIHN1cGVyc2NyaXB0KCkgewotCWZvcm1hdFRleHQoJ3N1cGVyc2NyaXB0JywgbnVsbCk7Ci19Ci0KLS8vIFRvZ2dsZXMgdGhlICd1bmRlcmxpbmUnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIHVuZGVybGluZSgpIHsKLQlmb3JtYXRUZXh0KCd1bmRlcmxpbmUnLCBudWxsKTsKLX0KLQotLy8gQ29udmVydHMgYSBsaW5rIHRvIG5vcm1hbCB0ZXh0LgotZnVuY3Rpb24gdW5saW5rKCkgewotCWZvcm1hdFRleHQoJ3VubGluaycsIG51bGwpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS54c2wgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvcnRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDg5MTRmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvcnRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL3J0ZSI+Ci0JPHhzbDp2YXJpYWJsZSBuYW1lPSJydGVfaWQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz48L3hzbDp2YXJpYWJsZT4KLQk8eHNsOnZhcmlhYmxlIG5hbWU9InJ0ZV9qcyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqcyIvPjwveHNsOnZhcmlhYmxlPgotCTxodG1sPgotCQk8aGVhZD4KLQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7JHJ0ZV9qc30iPjwvc2NyaXB0PgotCQk8L2hlYWQ+Ci0JCTxib2R5IGxlZnRNYXJnaW49IjAiIHRvcE1hcmdpbj0iMCIgbWFyZ2luaGVpZ2h0PSIwIiBtYXJnaW53aWR0aD0iMCIgc2Nyb2xsPSJubyIgc3R5bGU9Im92ZXJmbG93OiBoaWRkZW4iPgotCQkJPGlmcmFtZSBpZD0ieyRydGVfaWR9IiBuYW1lPSJ7JHJ0ZV9pZH0iIHN0eWxlPSJib3JkZXI6IG5vbmU7IiBmcmFtZWJvcmRlcj0iMCIgc2Nyb2xsaW5nPSJhdXRvIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj48L2lmcmFtZT4KLQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JCQkJaW5pdEVkaXRvcignPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPicsICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNzcyIvPicsICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGJhc2VVUkwiLz4nKTsKLQkJCTwvc2NyaXB0PgotCQk8L2JvZHk+Ci0JPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9JUmljaFRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTQ4MjgzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5GaW5kUmVwbGFjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIHJpY2ggdGV4dCBjb250cm9sLgotICogPHA+Ci0gKiBBIHJpY2ggdGV4dCBjb250cm9sIGlzIGFuIGVkaXRhYmxlIHVzZXIgaW50ZXJmYWNlIG9iamVjdCB0aGF0IGRpc3BsYXlzIHJpY2gKLSAqIHRleHQgYW5kIGltYWdlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmljaFRleHQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTkFNRSA9ICJyaWNoVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYXlvdXQgZGF0YS4KLQkgKiAKLQkgKiBAcGFyYW0gbGF5b3V0RGF0YQotCSAqICAgICAgICAgICAgdGhlIGxheW91dCBkYXRhIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExheW91dERhdGEoT2JqZWN0IGxheW91dERhdGEpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGF5b3V0IGRhdGEuCi0JICogCi0JICogQHJldHVybiB0aGlzIGNvbnRyb2wncyBsYXlvdXQgZGF0YQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TGF5b3V0RGF0YSgpOwotCi0JLyoqCi0JICogU2V0cyBmb2N1cyB0byB0aGlzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKTsKLQotCS8qKgotCSAqIFRlbGxzIHRoZSBjb250cm9sIGl0IGRvZXMgbm90IGhhdmUgZm9jdXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qmx1cigpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBjb250cm9sIGhhcyBmb2N1cy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY29udHJvbCBoYXMgdGhlIHVzZXItaW50ZXJmYWNlIGZvY3VzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgdGV4dCBhbmQgaW1hZ2UgbGlua3MuCi0JICogCi0JICogQHJldHVybiB0aGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBsaW5rcyBpbiB0aGlzIGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhc2VQYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlZGl0YWJsZSBzdGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50IGlzIGVkaWF0YmxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RWRpdGFibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGVkaXRhYmxlIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0YWJsZQotCSAqICAgICAgICAgICAgdGhlIGVkaXRhYmxlIHN0YXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgY29udGVudCBoYXMgYmVlbiBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50IGhhcyBiZWVuIG1vZGlmaWVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0TW9kaWZpZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGlmaWVkIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBtb2RpZmllZAotCSAqICAgICAgICAgICAgdGhlIG1vZGlmaWVkIHN0YXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kaWZpZWQoYm9vbGVhbiBtb2RpZmllZCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByaWNoIHRleHQgY29udGVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByaWNoIHRleHQgY29udGVudCBmb3JtYXR0ZWQgaW4gYSBtYXJrdXAgbGFuZ3VhZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHJpY2ggdGV4dCBjb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgcmljaCB0ZXh0IGNvbnRlbnQgZm9ybWF0dGVkIGluIGEgbWFya3VwIGxhbmd1YWdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCk7Ci0KLQkvKioKLQkgKiBSZXN0b3JlcyB0aGUgcmljaCB0ZXh0IGNvbnRlbnQgYmFjayB0byB0aGUgaW5pdGlhbCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0b3JlVGV4dCgpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGVkaXRvciBjb250ZW50IGhhcyBiZWVuIG1vZGlmaWVkLiBJZiBpdCBoYXMgYmVlbgotCSAqIG1vZGlmaWVkLCBub3RpZnkgdGhlIG1vZGlmeSBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tNb2RpZnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgZGVzY3JpYmVzIHRoZSBjdXJyZW50IHNlbGVjdGlvbgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5SaWNoVGV4dFNlbGVjdGlvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIFJpY2hUZXh0U2VsZWN0aW9uIGdldFNlbGVjdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFwcGxpY2F0aW9uIHNwZWNpZmljIHByb3BlcnR5IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBoYXMgbm90Ci0JICogICAgICAgICBiZWVuIHNldAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGF0YShTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIFNldHMgYW4gYXBwbGljYXRpb24gc3BlY2lmaWMgcHJvcGVydHkgbmFtZSBhbmQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gcmljaCB0ZXh0IGNvbW1hbmQuIFRoZSBzdXBwb3J0ZWQgY29tbWFuZCBzdHJpbmdzIGFyZQotCSAqIGRlZmluZWQgaW4gPGNvZGU+UmljaFRleHRDb21tYW5kPGNvZGU+LgotCSAqIAotCSAqIEBwYXJhbQljb21tYW5kCQlhIHJpY2ggdGV4dCBjb21tYW5kIHN0cmluZwotCSAqIEByZXR1cm4JYSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgZXhlY3V0ZWQgY29tbWFuZAotCSAqLwotCXB1YmxpYyBpbnQgZXhlY3V0ZUNvbW1hbmQoU3RyaW5nIGNvbW1hbmQpOwotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIHJpY2ggdGV4dCBjb21tYW5kIHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyLiBUaGUKLQkgKiBzdXBwb3J0ZWQgY29tbWFuZCBzdHJpbmdzIGFyZSBkZWZpbmVkIGluIDxjb2RlPlJpY2hUZXh0Q29tbWFuZDxjb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0JY29tbWFuZAkJYSByaWNoIHRleHQgY29tbWFuZCBzdHJpbmcKLQkgKiBAcGFyYW0JcGFyYW0JCWEgcGFyYW1ldGVyIGZvciB0aGUgY29tbWFuZCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4JYSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgZXhlY3V0ZWQgY29tbWFuZAotCSAqLwotCXB1YmxpYyBpbnQgZXhlY3V0ZUNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIFN0cmluZyBwYXJhbSk7Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gcmljaCB0ZXh0IGNvbW1hbmQgd2l0aCBhbiBhcnJheSBvZiBwYXJhbWV0ZXJzLiBUaGUKLQkgKiBzdXBwb3J0ZWQgY29tbWFuZCBzdHJpbmdzIGFyZSBkZWZpbmVkIGluIDxjb2RlPlJpY2hUZXh0Q29tbWFuZDxjb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0JY29tbWFuZAkJYSByaWNoIHRleHQgY29tbWFuZCBzdHJpbmcKLQkgKiBAcGFyYW0JcGFyYW1zCQlhbiBhcnJheSBvZiBwYXJhbWV0ZXJzIGZvciB0aGUgY29tbWFuZCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4JYSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgZXhlY3V0ZWQgY29tbWFuZAotCSAqLwotCXB1YmxpYyBpbnQgZXhlY3V0ZUNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIFN0cmluZ1tdIHBhcmFtcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RpZnkgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIGZvciByZXRyaWV2aW5nIHRoZSBtb2RpZnkgbGlzdGVuZXJzCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGdldE1vZGlmeUxpc3RlbmVycygpOwotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZCB3aGVuCi0JICoga2V5cyBhcmUgcHJlc3NlZCBhbmQgcmVsZWFzZWQgd2l0aGluIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRLZXlMaXN0ZW5lcihLZXlMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIGtleXMgYXJlIHByZXNzZWQgYW5kIHJlbGVhc2VkIHdpdGhpbiB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUtleUxpc3RlbmVyKEtleUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQgd2hlbgotCSAqIHRoZSBjb250ZW50IG9mIHRoaXMgY29udHJvbCBpcyBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIHRoZSBjb250ZW50IG9mIHRoaXMgY29udHJvbCBpcyBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQWRkcyB0aGUgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmZWQgd2hlbgotCSAqIHRoaXMgY29udHJvbCBpcyBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4gdGhpcyBjb250cm9sIGlzIGRpc3Bvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVEaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQgd2hlbgotCSAqIGhlbHAgZXZlbnRzIGFyZSBnZW5lcmF0ZWQgZm9yIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRIZWxwTGlzdGVuZXIoSGVscExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4gaGVscCBldmVudHMgYXJlIGdlbmVyYXRlZCBmb3IgdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVIZWxwTGlzdGVuZXIoSGVscExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmVkIHdoZW4KLQkgKiBhbiBldmVudCBvZiB0aGUgZ2l2ZW4gdHlwZSBvY2N1cnMgd2l0aGluIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGV2ZW50IG9jY3VycwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKGludCBldmVudFR5cGUsIExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmZWQKLQkgKiB3aGVuIGFuIGV2ZW50IG9mIHRoZSBnaXZlbiB0eXBlIG9jY3VycyB3aXRoaW4gdGhpcyBlY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gdG8KLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGV2ZW50Ci0JICogICAgICAgICAgICBvY2N1cnMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihpbnQgZXZlbnRUeXBlLCBMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIG1vZGlmeSBsaXN0ZW5lcnMKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeU1vZGlmeUxpc3RlbmVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIGZvciByZXRyaWV2aW5nIHRoZSBldmVudCBsaXN0ZW5lcnMgYXR0YWNoZWQgdG8gdGhpcwotCSAqICAgICAgICAgY29udHJvbAotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRMaXN0ZW5lcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJhc2UgVVJMIG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aG9zZSBjb250ZW50IHdhcyBsYXN0Ci0JICogY29waWVkIHRvIHRoZSBjbGlwYm9hcmQuCi0JICogCi0JICogQHJldHVybiB0aGUgYmFzZSBVUkwgb2YgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBVUkwgZ2V0Q29weVVSTCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFzZSBVUkwgb2YgdGhlIHJpY2ggdGV4dCBjb250cm9sIHdob3NlIGNvbnRlbnQgd2FzIGxhc3QgY29waWVkCi0JICogdG8gdGhlIGNsaXBib2FyZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3B5VVJMKCk7Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGlzIGNvbnRyb2wgaGFzIGJlZW4gZGlzcG9zZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNvbnRyb2wgaXMgZGlzcG9zZWQgc3VjY2Vzc2Z1bGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCgpOwotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbnRyb2wncyBGaW5kUmVwbGFjZUFjdGlvbgotCSAqLwotCXB1YmxpYyBGaW5kUmVwbGFjZUFjdGlvbiBnZXRGaW5kUmVwbGFjZUFjdGlvbigpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIEZpbmRSZXBsYWNlQWN0aW9uIHRvIHVzZQotCSAqIEBwYXJhbSBmaW5kUmVwbGFjZUFjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmRSZXBsYWNlQWN0aW9uKEZpbmRSZXBsYWNlQWN0aW9uIGZpbmRSZXBsYWNlQWN0aW9uKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBpbml0aWFsVGV4dCB2YXJpYWJsZSwgd2hpY2ggc3RvcmVzIHdoYXQgaXMgc2F2ZWQgb24gZGlzawotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFRleHQoU3RyaW5nIHRleHQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvSVJpY2hUZXh0RWRpdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNTVlYWE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvSVJpY2hUZXh0RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5GaW5kUmVwbGFjZUFjdGlvbjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIHJpY2ggdGV4dCBlZGl0b3IuCi0gKiA8cD4KLSAqIEEgcmljaCB0ZXh0IGVkaXRvciBpcyBhIGNvbXBvc2l0ZSB1c2VyIGludGVyZmFjZSBvYmplY3QgdGhhdCBpbmNsdWRlcyBhIHRvb2wKLSAqIGJhciwgYSB0YWIgZm9sZGVyIGZvciBlbnRlcmluZyB0aGUgcmljaCB0ZXh0IGNvbnRlbnQsIGFuZCBhIHRhYiBmb2xkZXIgZm9yCi0gKiB2aWV3aW5nIGFuZCBtb2RpZnlpbmcgdGhlIHJpY2ggdGV4dCBjb250ZW50IGluIGEgbWFya3VwIGxhbmd1YWdlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmljaFRleHRFZGl0b3IgZXh0ZW5kcyBJUmljaFRleHQgewotCi0JLyoqCi0JICogRmlsbHMgdGhlIHRvb2wgYmFyIHdpdGggcmljaCB0ZXh0IGFjdGlvbiBpdGVtcy4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbEJhcgotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgZWRpdG9yIHRvb2wgYmFyCi0JICovCi0JcHVibGljIHZvaWQgZmlsbFRvb2xCYXIoSVJpY2hUZXh0VG9vbEJhciB0b29sQmFyKTsKLQotCS8qKgotCSAqIFNlbGVjdHMgdGhlIHJpY2ggdGV4dCBvciB0aGUgbWFya3VwIGxhbmd1YWdlIHRhYi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIDxjb2RlPjA8L2NvZGU+IGZvciB0aGUgcmljaCB0ZXh0IHRhYiwgPGNvZGU+MTwvY29kZT4gZm9yCi0JICogICAgICAgICAgICB0aGUgbWFya3VwIGxhbmd1YWdlIHRhYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIEZpbmRSZXBsYWNlQWN0aW9uIHRvIHVzZQotCSAqIEBwYXJhbSBmaW5kUmVwbGFjZUFjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmRSZXBsYWNlQWN0aW9uKEZpbmRSZXBsYWNlQWN0aW9uIGZpbmRSZXBsYWNlQWN0aW9uKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9JUmljaFRleHRUb29sQmFyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dFRvb2xCYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzYyOTNmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dFRvb2xCYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLklSaWNoVGV4dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5JUmljaFRleHRDb21ib0FjdGlvbjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIHJpY2ggdGV4dCBlZGl0b3IgdG9vbGJhci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJpY2hUZXh0VG9vbEJhciB7Ci0KLQkvKioKLQkgKiBBZGRzIGEgYnV0dG9uIGFjdGlvbiB0byB0aGUgdG9vbCBiYXIuCi0JICogCi0JICogQHBhcmFtIGFjdGlvbgotCSAqICAgICAgICAgICAgdGhlIGJ1dHRvbiBhY3Rpb24gdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWN0aW9uKElSaWNoVGV4dEFjdGlvbiBhY3Rpb24pOwotCi0JLyoqCi0JICogQWRkcyBhIGNvbWJvIGFjdGlvbiB0byB0aGUgdG9vbCBiYXIuCi0JICogCi0JICogQHBhcmFtIGFjdGlvbgotCSAqICAgICAgICAgICAgdGhlIGNvbWJvIGFjdGlvbiB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBY3Rpb24oSVJpY2hUZXh0Q29tYm9BY3Rpb24gYWN0aW9uKTsKLQotCS8qKgotCSAqIEFkZHMgYSBzZXBhcmF0b3IgdG8gdGhlIHRvb2wgYmFyLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlcGFyYXRvcigpOwotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgdG9vbGJhciBzdGF0ZS4KLQkgKiA8cD4KLQkgKiBFbmFibGVzL2Rpc2FibGVzIGFjdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKLQkgKiBSaWNoVGV4dEVkaXRvciB0YWIgKFJpY2hUZXh0IHZzLiBIVE1MKQotCSAqIAotCSAqIEBwYXJhbSBlZGl0YWJsZSBzcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgbm9uLVJlYWRPbmx5IGNvbW1hbmRzCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlVG9vbEJhcihib29sZWFuIGVuYWJsZWQpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjNjY2RjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgRm9udCBTdHlsZSBOYW1lcwotZm9udFN0eWxlX25vcm1hbD1Ob3JtYWwKLWZvbnRTdHlsZV9zZWN0aW9uSGVhZGluZz1TZWN0aW9uIEhlYWRpbmcKLWZvbnRTdHlsZV9zdWJzZWN0aW9uSGVhZGluZz1TdWJzZWN0aW9uIEhlYWRpbmcKLWZvbnRTdHlsZV9zdWJTdWJzZWN0aW9uSGVhZGluZz1TdWIgU3Vic2VjdGlvbiBIZWFkaW5nCi1mb250U3R5bGVfcXVvdGU9UXVvdGUKLWZvbnRTdHlsZV9jb2RlU2FtcGxlPUNvZGUgU2FtcGxlCi0KLSMgSFRNTCBCbG9jayBUYWdzCi1ibG9ja1RhZ19wYXJhZ3JhcGg9UGFyYWdyYXBoCi1ibG9ja1RhZ19oZWFkaW5nMT1IZWFkaW5nIDEKLWJsb2NrVGFnX2hlYWRpbmcyPUhlYWRpbmcgMgotYmxvY2tUYWdfaGVhZGluZzM9SGVhZGluZyAzCi1ibG9ja1RhZ19oZWFkaW5nND1IZWFkaW5nIDQKLWJsb2NrVGFnX2hlYWRpbmc1PUhlYWRpbmcgNQotYmxvY2tUYWdfaGVhZGluZzY9SGVhZGluZyA2Ci1ibG9ja1RhZ19hZGRyZXNzPUFkZHJlc3MKLWJsb2NrVGFnX3ByZWZvcm1hdHRlZFRleHQ9UHJlZm9ybWF0dGVkIFRleHQKLQotIyBIVE1MIEZvbnQgTmFtZXMKLWZvbnROYW1lX2RlZmF1bHQ9RGVmYXVsdAotZm9udE5hbWVfYXJpYWw9QXJpYWwKLWZvbnROYW1lX2NvdXJpZXJOZXc9Q291cmllciBOZXcKLWZvbnROYW1lX3RpbWVzTmV3Um9tYW49VGltZXMgTmV3IFJvbWFuCi1mb250TmFtZV92ZXJkYW5hPVZlcmRhbmEKLQotIyBSaWNoIFRleHQgRWRpdG9yIFRvb2wgQnV0dG9ucwotYWRkSG9yaXpvbnRhbEJhckFjdGlvbl90b29sVGlwVGV4dD1BZGQgSG9yaXpvbnRhbCBCYXIKLWFkZEltYWdlQWN0aW9uX3Rvb2xUaXBUZXh0PUFkZCBJbWFnZQotYWRkTGluZUFjdGlvbl90b29sVGlwVGV4dD1BZGQgTGluZQotYWRkTGlua0FjdGlvbl90b29sVGlwVGV4dD1BZGQgTGluawotYWRkT3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQ9QWRkIE9yZGVyZWQgTGlzdAotYWRkVGFibGVBY3Rpb25fdG9vbFRpcFRleHQ9QWRkIFRhYmxlCi1hZGRVbm9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PUFkZCBVbm9yZGVyZWQgTGlzdAotYm9sZEFjdGlvbl90b29sVGlwVGV4dD1Cb2xkCi1jbGVhckNvbnRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9Q2xlYXIgQ29udGVudAotY29weUFjdGlvbl90b29sVGlwVGV4dD1Db3B5Ci1jdXRBY3Rpb25fdG9vbFRpcFRleHQ9Q3V0Ci1maW5kUmVwbGFjZUFjdGlvbl90b29sVGlwVGV4dD1GaW5kL1JlcGxhY2UKLWluZGVudEFjdGlvbl90b29sVGlwVGV4dD1JbmRlbnQKLWl0YWxpY0FjdGlvbl90b29sVGlwVGV4dD1JdGFsaWMKLWp1c3RpZnlDZW50ZXJBY3Rpb25fdG9vbFRpcFRleHQ9SnVzdGlmeSBDZW50ZXIKLWp1c3RpZnlGdWxsQWN0aW9uX3Rvb2xUaXBUZXh0PUp1c3RpZnkgRnVsbAotanVzdGlmeUxlZnRBY3Rpb25fdG9vbFRpcFRleHQ9SnVzdGlmeSBMZWZ0Ci1qdXN0aWZ5UmlnaHRBY3Rpb25fdG9vbFRpcFRleHQ9SnVzdGlmeSBSaWdodAotb3V0ZGVudEFjdGlvbl90b29sVGlwVGV4dD1PdXRkZW50Ci1wYXN0ZUFjdGlvbl90b29sVGlwVGV4dD1QYXN0ZQotcGFzdGVQbGFpblRleHRBY3Rpb25fdG9vbFRpcFRleHQ9UGFzdGUgYXMgcGxhaW4gdGV4dAotc3Vic2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0PVN1YnNjcmlwdAotc3VwZXJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQ9U3VwZXJzY3JpcHQKLXVuZGVybGluZUFjdGlvbl90b29sVGlwVGV4dD1VbmRlcmxpbmUKLQotIyBSaWNoIFRleHQgRWRpdG9yIENvbWJvYm94ZXMKLWZvbnRTdHlsZUFjdGlvbl90b29sVGlwVGV4dD1TZXQgRm9udCBTdHlsZQotYmxvY2tUYWdBY3Rpb25fdG9vbFRpcFRleHQ9U2V0IEJsb2NrIFRhZwotZm9udE5hbWVBY3Rpb25fdG9vbFRpcFRleHQ9Ci1mb250TmFtZUFjdGlvbl9EZWZhdWx0Rm9udE5hbWU9RGVmYXVsdCBmb250Ci1mb250U2l6ZUFjdGlvbl90b29sVGlwVGV4dD1TZXQgRm9udCBTaXplCi0KLSMgUmljaCBUZXh0IEVkaXRvciBDb250ZXh0IE1lbnUgSXRlbXMKLWN1dEFjdGlvbl90ZXh0PSZDdXQKLWNvcHlBY3Rpb25fdGV4dD1DJm9weQotcGFzdGVBY3Rpb25fdGV4dD0mUGFzdGUKLXBhc3RlUGxhaW5UZXh0QWN0aW9uX3RleHQ9UGFzdGUgJmFzIHBsYWluIHRleHQKLQotIyBSaWNoIFRleHQgRWRpdG9yIFRhYnMKLXJpY2hUZXh0VGFiX3RleHQ9UmljaCBUZXh0Ci1yaWNoVGV4dFRhYl90b29sVGlwVGV4dD1FZGl0IGNvbnRlbnQgaW4gcmljaCB0ZXh0Ci1odG1sVGFiX3RleHQ9SFRNTAotaHRtbFRhYl90b29sVGlwVGV4dD1FZGl0IGNvbnRlbnQgaW4gSFRNTAotCi0jIEFkZCBEaWFsb2dzCi1hZGRJbWFnZURpYWxvZ190aXRsZT1BZGQgSW1hZ2UKLWFkZExpbmtEaWFsb2dfdGl0bGU9QWRkIExpbmsKLWFkZFRhYmxlRGlhbG9nX3RpdGxlPUFkZCBUYWJsZQotZmluZFJlcGxhY2VEaWFsb2dfdGl0bGU9RmluZC9SZXBsYWNlCi11cmxMYWJlbF90ZXh0PVVSTDoKLXN1bW1hcnlMYWJlbF90ZXh0PVN1bW1hcnk6Ci1jYXB0aW9uTGFiZWxfdGV4dD1DYXB0aW9uOgotcm93c0xhYmVsX3RleHQ9Um93czoKLWNvbHVtbnNMYWJlbF90ZXh0PUNvbHVtbnM6Ci13aWR0aExhYmVsX3RleHQ9V2lkdGg6Ci10YWJsZVN0eWxlTGFiZWxfdGV4dD1TdHlsZToKLXRhYmxlSGVhZGVyTm9uZV90ZXh0PVRhYmxlIHdpdGggbm8gaGVhZGVycwotdGFibGVIZWFkZXJDb2xzX3RleHQ9VGFibGUgd2l0aCBjb2x1bW4gaGVhZGVycwotdGFibGVIZWFkZXJSb3dzX3RleHQ9VGFibGUgd2l0aCByb3cgaGVhZGVycwotdGFibGVIZWFkZXJCb3RoX3RleHQ9VGFibGUgd2l0aCBjb2x1bW4gYW5kIHJvdyBoZWFkZXJzCi1icm93c2VCdXR0b25fdGV4dD1Ccm93c2UuLi4KLQotIyBDbGVhciBFZGl0b3IgQ29udGVudCBEaWFsb2cKLWNsZWFyQ29udGVudERpYWxvZ190aXRsZT1DbGVhciBFZGl0b3IgQ29udGVudCBDb25maXJtYXRpb24KLWNsZWFyQ29udGVudERpYWxvZ190ZXh0PURvIHlvdSByZWFsbHkgd2FudCB0byBjbGVhciB0aGUgY29udGVudCBvZiB0aGlzIHJpY2ggdGV4dCBlZGl0b3I/Ci0KLSMgRmluZC9SZXBsYWNlIERpYWxvZwotZmluZExhYmVsX3RleHQ9RmluZDoKLXJlcGxhY2VMYWJlbF90ZXh0PVJlcGxhY2Ugd2l0aDoKLW9wdGlvbnNHcm91cF90ZXh0PU9wdGlvbnMKLWNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0PUNhc2Ugc2Vuc2l0aXZlCi13aG9sZVdvcmRDaGVja2JveF90ZXh0PVdob2xlIHdvcmQKLWRpcmVjdGlvbkdyb3VwX3RleHQ9RGlyZWN0aW9uCi1mb3J3YXJkUmFkaW9CdXR0b25fdGV4dD1Gb3J3YXJkCi1iYWNrd2FyZFJhZGlvQnV0dG9uX3RleHQ9QmFja3dhcmQKLWZpbmRCdXR0b25fdGV4dD1GaW5kCi1yZXBsYWNlQnV0dG9uX3RleHQ9UmVwbGFjZQotcmVwbGFjZUZpbmRCdXR0b25fdGV4dD1SZXBsYWNlL0ZpbmQKLXJlcGxhY2VhbGxCdXR0b25fdGV4dD1SZXBsYWNlIEFsbAotIyB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yCi1GaW5kUmVwbGFjZV9TdGF0dXNfbm9NYXRjaF9sYWJlbD1TdHJpbmcgTm90IEZvdW5kCi0KLSMgUHJlZmVyZW5jZSBQYWdlCi1tYXhDaGFyc1BlckxpbmVMYWJlbF90ZXh0PU1heGltdW0gY2hhcmFjdGVycyBwZXIgbGluZToKLWluZGVudEhUTUxDaGVja2JveF90ZXh0PUluZGVudCBIVE1MIHRhZ3MKLWluZGVudFNpemVMYWJlbF90ZXh0PUluZGVudCBTaXplOgotdXJsRGlzcGxheU5hbWVMYWJlbF90ZXh0PVVSTCBEaXNwbGF5IE5hbWU6Ci0KLSMgRE8gTk9UIFRSQU5TTEFURSBCRUxPVyBUSElTIExJTkUKLSMgU1RBUlQgTk8tVFJBTlNMQVRFCi1mb250TmFtZUFjdGlvbl9DU1NfRGVmYXVsdD1hcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmCi1mb250TmFtZUFjdGlvbl9DU1NfRGVmYXVsdF9Nb3ppbGxhPWFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmCi0jIEVORCBOTy1UUkFOU0xBVEUKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZDZlMzAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uaHRtbC5IVE1MRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ueG1sLlhTTFRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQ29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5DdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRmluZFJlcGxhY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuUGFzdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuUGFzdGVQbGFpblRleHRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlN0YXR1c1RleHRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5TdGF0dXNUZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IHJpY2ggdGV4dCBjb250cm9sIGltcGxlbWVudGF0aW9uLgotICogPHA+Ci0gKiBUaGUgZGVmYXVsdCByaWNoIHRleHQgZWRpdG9yIHVzZXMgWEhUTUwgYXMgdGhlIHVuZGVybHlpbmcgbWFya3VwIGxhbmd1YWdlIGZvcgotICogdGhlIHJpY2ggdGV4dCBjb250ZW50LiBJdCBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIFNXVCA8Y29kZT5Ccm93c2VyPC9jb2RlPgotICogY29udHJvbCBhbmQgREhUTUwgKEhUTUwsIENTUyBhbmQgSmF2YVNjcmlwdCkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dCBpbXBsZW1lbnRzIElSaWNoVGV4dCB7Ci0KLQkvLyBFbmNvZGVkIHNpbmdsZSBxdW90ZS4gQWxsIHNpbmdsZSBxdW90ZXMgbmVlZCB0byBiZSBzcGVjaWFsbHkgZW5jb2RlZCB0bwotCS8vIGF2b2lkIEphdmFTY3JpcHQgZXJyb3Igd2hlbiBjYWxsaW5nIEJyb3dzZS5leGVjdXRlQ29tbWFuZCgpLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNPREVEX1NJTkdMRV9RVU9URSA9ICIlc3ElIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ERURfTkVXTElORSA9ICIlRU9MJSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUVVNfUFJFRklYID0gIiQkJCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfUFJFRklYX0xFTkdUSCA9IFNUQVRVU19QUkVGSVgubGVuZ3RoKCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19OT1AgPSAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19JTklUSUFMSVpFRCA9IDE7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX01PRElGSUVEID0gMjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfR0VUX1RFWFQgPSAzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19LRVlfRE9XTiA9IDQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0tFWV9VUCA9IDU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX1NFTEVDVF9URVhUID0gNjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfU0VMRUNUX0NPTlRST0wgPSA3OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19TRUxFQ1RfTk9ORSA9IDg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0VYRUNfQ01EID0gOTsKLQotCS8vIFRoZSBkZWZhdWx0IGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3MgKDxocmVmPiwgPGltZz4sIGV0Yy4pCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQkFTRV9QQVRIID0gU3lzdGVtCi0JCQkuZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpIC8vJE5PTi1OTFMtMSQKLQkJCSsgU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpICsgInJ0ZSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLy8gSWYgdHJ1ZSwgbG9nIGRlYnVnZ2luZyBpbmZvLgotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnOwotCi0JLy8gVGhlIHBsdWctaW4gbG9nZ2VyLgotCXByb3RlY3RlZCBMb2dnZXIgbG9nZ2VyOwotCi0JLy8gVGhlIHVuZGVybHlpbmcgU1dUIEJyb3dzZXIgdXNlZCBmb3IgbG9hZGluZyB0aGUgSmF2YVNjcmlwdC9ESFRNTCBlZGl0b3IuCi0JcHJvdGVjdGVkIEJyb3dzZXIgZWRpdG9yOwotCi0JLy8gVGhlIHVuZGVybHlpbmcgT2xlQ29udHJvbFNpdGUgZm9yIHRoZSBTV1QgQnJvd3NlciAoV2luMzIgb25seSkuCi0JcHJvdGVjdGVkIENvbnRyb2wgZWRpdG9yQ29udHJvbDsKLQotCS8vIFRoZSBiYXNlIFVSTCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgd2hvc2UgY29udGVudCB3YXMgbGFzdAotCS8vIGNvcGllZCB0byB0aGUgY2xpcGJvYXJkLgotCXByb3RlY3RlZCBzdGF0aWMgVVJMIGNvcHlVUkw7Ci0KLQkvLyBUaGUgY29udGV4dCBtZW51IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRyb2wuCi0JcHJvdGVjdGVkIE1lbnUgY29udGV4dE1lbnU7Ci0KLQkvLyBUaGUgZm9sZGVyIHRoYXQgY29udGFpbnMgdGhlIHN1cHBvcnRpbmcgQ1NTIGFuZCBKYXZhU2NyaXB0IGZpbGVzCi0JcHJvdGVjdGVkIFN0cmluZyBydGVGb2xkZXI7Ci0KLQkvLyBUaGUgVVJMIHRoYXQgcG9pbnRzIHRvIHRoZSBzdXBwb3J0aW5nIENTUyBhbmQgSmF2YVNjcmlwdCBmaWxlcy4KLQlwcm90ZWN0ZWQgU3RyaW5nIHJ0ZVVSTDsKLQotCS8vIFRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGxpbmtzICg8aHJlZj4sIDxpbWc+LCBldGMuKQotCXByb3RlY3RlZCBTdHJpbmcgYmFzZVBhdGg7Ci0KLQkvLyBUaGUgREhUTUwgaW5pdGlhbGl6YXRpb24gZmxhZy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplZDsKLQotCS8vIFRoZSBpbml0aWFsIGZvY3VzLgotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemVkV2l0aEZvY3VzOwotCi0JLy8gVGhlIGNvbnRyb2wncyBpbml0aWFsIHRleHQuIFRoaXMgaXMgdXNlZCB0byBjYWNoZSB0aGUgSFRNTCBzb3VyY2UgcGFzc2VkCi0JLy8gaW4gdmlhIHNldFRleHQoKXdoaWxlIHRoZSBESFRNTCBpbml0aWFsaXphdGlvbiBpcyBoYXBwZW5pbmcuCi0JcHJvdGVjdGVkIFN0cmluZyBpbml0aWFsVGV4dDsKLQotCS8vIFRoZSBjb250cm9sJ3MgY3VycmVudCB0ZXh0LgotCXByb3RlY3RlZCBTdHJpbmcgY3VycmVudFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIGNvbnRyb2wncyBlZGl0YWJsZSBmbGFnLgotCXByb3RlY3RlZCBib29sZWFuIGVkaXRhYmxlID0gdHJ1ZTsKLQotCS8vIFRoZSBjb250cm9sJ3MgbW9kaWZpY2F0aW9uIGZsYWcuCi0JcHJvdGVjdGVkIGJvb2xlYW4gbW9kaWZpZWQ7Ci0KLQkvLyBUaGUgY29udHJvbCdzIHRleHQgYW5kIG9iamVjdCBzZWxlY3Rpb24gZmxhZy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNTZWxlY3Rpb247Ci0KLQkvLyBUaGUgY29udHJvbCdzIHRleHQgc2VsZWN0aW9uCi0JcHJvdGVjdGVkIFJpY2hUZXh0U2VsZWN0aW9uIHJpY2hUZXh0U2VsZWN0aW9uID0gbmV3IFJpY2hUZXh0U2VsZWN0aW9uKCk7Ci0KLQkvLyBKYXZhU2NyaXB0IGNvbW1hbmQgZXhlY3V0aW9uIHN0YXR1cyBjb2RlLgotCXByb3RlY3RlZCBpbnQgc3RhdHVzID0gMDsKLQotCS8vIFRoZSBIVE1MIHNvdXJjZSBmb3JtYXR0ZXIuCi0JcHJvdGVjdGVkIEhUTUxGb3JtYXR0ZXIgaHRtbEZvcm1hdHRlcjsKLQotCS8vIFRoZSBTV1QgZXZlbnQgbGlzdGVuZXJzLgotCXByb3RlY3RlZCBNYXA8TGlzdGVuZXIsIFJpY2hUZXh0TGlzdGVuZXI+IGxpc3RlbmVyczsKLQotCS8vIFRoZSBtb2RpZnkgbGlzdGVuZXJzLgotCXByb3RlY3RlZCBMaXN0PE1vZGlmeUxpc3RlbmVyPiBtb2RpZnlMaXN0ZW5lcnM7Ci0KLQkvLyBUaGUgY29udHJvbCdzIGVkaXQgZmxhZy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBub3RpZnlpbmdNb2RpZnlMaXN0ZW5lcnMgPSBmYWxzZTsKLQotCS8vIFRoZSBjb250cm9scydzIGZvY3VzIGZsYWcuCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzRm9jdXMgPSBmYWxzZTsKLQotCS8vIFRoZSBjb250cm9sJ3MgZmluZC9yZXBsYWNlIHRleHQgYWN0aW9uCi0JcHJvdGVjdGVkIEZpbmRSZXBsYWNlQWN0aW9uIGZpbmRSZXBsYWNlQWN0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHN0eWxlIGZvciB0aGlzIGNvbnRyb2wKLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBsaW5rcwotCSAqLwotCXB1YmxpYyBSaWNoVGV4dChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFN0cmluZyBiYXNlUGF0aCkgewotCQlkZWJ1ZyA9IFJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQlsb2dnZXIgPSBSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0JCWZpbmRSZXBsYWNlQWN0aW9uID0gbmV3IEZpbmRSZXBsYWNlQWN0aW9uKCk7Ci0JCXJ0ZUZvbGRlciA9IFJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbnN0YWxsUGF0aCgpICsgInJ0ZS8iOyAvLyROT04tTkxTLTEkCQkKLQkJcnRlVVJMID0gWE1MVXRpbC5lc2NhcGUoImZpbGU6Ly8iICsgcnRlRm9sZGVyKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRCYXNlUGF0aChiYXNlUGF0aCk7Ci0KLQkJdHJ5IHsKLQkJCWVkaXRvciA9IG5ldyBCcm93c2VyKHBhcmVudCwgU1dULk5PTkUpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoIlJpY2hUZXh0IiwgImJhc2VQYXRoPSIgKyBiYXNlUGF0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJZWRpdG9yLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkJZWRpdG9yLnNldERhdGEoUFJPUEVSVFlfTkFNRSwgdGhpcyk7Ci0JCQlpbml0KHBhcmVudCwgc3R5bGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZWRpdG9yID0gbnVsbDsKLQkJCVN0cmluZyBtc2cgPSAiRmFpbGVkIHRvIGNyZWF0ZSBSaWNoVGV4dCB3aXRoIGJhc2VQYXRoPSIgKyBiYXNlUGF0aDsgLy8kTk9OLU5MUy0xJAotCQkJbG9nZ2VyLmxvZ0Vycm9yKG1zZywgZSk7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHN0eWxlIGZvciB0aGlzIGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgUmljaFRleHQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXRoaXMocGFyZW50LCBzdHlsZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFzZSBwYXRoIGZvciByZXNvbHZpbmcgbGlua3MuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0QmFzZVBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoLmxlbmd0aCgpID4gMCkgewotCQkJaWYgKHBhdGguc3RhcnRzV2l0aChGaWxlVXRpbC5VTkNfUEFUSF9QUkVGSVgpKSB7Ci0JCQkJYmFzZVBhdGggPSBGaWxlVXRpbC5VTkNfUEFUSF9QUkVGSVgKLQkJCQkJCSsgRmlsZVV0aWwuYXBwZW5kU2VwYXJhdG9yKHBhdGguc3Vic3RyaW5nKAotCQkJCQkJCQlGaWxlVXRpbC5VTkNfUEFUSF9QUkVGSVhfTEVOR1RIKS5yZXBsYWNlKCdcXCcsCi0JCQkJCQkJCScvJyksICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJYmFzZVBhdGggPSBGaWxlVXRpbC5hcHBlbmRTZXBhcmF0b3IocGF0aCkucmVwbGFjZSgnXFwnLCAnLycpOwotCQkJfQotCQl9IGVsc2UgewotCQkJYmFzZVBhdGggPSBGaWxlVXRpbC5hcHBlbmRTZXBhcmF0b3IoREVGQVVMVF9CQVNFX1BBVEgpLnJlcGxhY2UoCi0JCQkJCSdcXCcsICcvJyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBzdHlsZSBmb3IgdGhpcyBjb250cm9sCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICB3aGVuIGFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSBpbml0aWFsemluZyB0aGlzIGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlhZGRTdGF0dXNUZXh0TGlzdGVuZXIoKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKCJpbml0IiwgImFkZGVkIHN0YXR1cyB0ZXh0IGxpc3RlbmVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQlTdHJpbmcgZWRpdG9ySFRNTCA9IGdlbmVyYXRlRWRpdG9ySFRNTCgpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImluaXQiLCAiZ2VuZXJhdGVkIGVkaXRvciBIVE1MIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQllZGl0b3Iuc2V0VGV4dChlZGl0b3JIVE1MKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKCJpbml0IiwgImxvYWRlZCBlZGl0b3IgSFRNTCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJY29udGV4dE1lbnUgPSBuZXcgTWVudShwYXJlbnQuZ2V0U2hlbGwoKSwgU1dULlBPUF9VUCk7Ci0JCQllZGl0b3Iuc2V0TWVudShjb250ZXh0TWVudSk7Ci0JCQlmaWxsQ29udGV4dE1lbnUoY29udGV4dE1lbnUpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImluaXQiLCAiYWRkZWQgY29udGV4dCBtZW51Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQlhZGRMaXN0ZW5lcnMoKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKCJpbml0IiwgImFkZGVkIGxpc3RlbmVycyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJaHRtbEZvcm1hdHRlciA9IG5ldyBIVE1MRm9ybWF0dGVyKCk7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlwcmludERlYnVnTWVzc2FnZSgiaW5pdCIsICJpbnN0YW50aWF0ZWQgSFRNTEZvcm1hdHRlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWVkaXRvciA9IG51bGw7Ci0JCQlkaXNwb3NlKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEByZXR1cm4gdGhpcyByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBlZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGF5b3V0IGRhdGEuCi0JICogCi0JICogQHBhcmFtIGxheW91dERhdGEKLQkgKiAgICAgICAgICAgIHRoZSBsYXlvdXQgZGF0YSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXlvdXREYXRhKE9iamVjdCBsYXlvdXREYXRhKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXlvdXQgZGF0YS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoaXMgY29udHJvbCdzIGxheW91dCBkYXRhCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRMYXlvdXREYXRhKCkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCXJldHVybiBlZGl0b3IuZ2V0TGF5b3V0RGF0YSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldHMgZm9jdXMgdG8gdGhpcyBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpZiAoZGVidWcpIHsKLQkJCXByaW50RGVidWdNZXNzYWdlKCJzZXRGb2N1cywgZWRpdGFibGU9IiArIGVkaXRhYmxlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJaWYgKGluaXRpYWxpemVkKSB7Ci0JCQkJaWYgKCFQbGF0Zm9ybS5nZXRPUygpLmVxdWFscygid2luMzIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIFdvcmthcm91bmQgZm9yIE1vemlsbGEgYW5kIEZpcmVmb3ggcmljaCB0ZXh0IGVkaXRvciBmb2N1cwotCQkJCQkvLyBpc3N1ZS4KLQkJCQkJZWRpdG9yLnNldEZvY3VzKCk7Ci0JCQkJfQotCQkJCWV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRk9DVVMpOwotCQkJCWhhc0ZvY3VzID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5pdGlhbGl6ZWRXaXRoRm9jdXMgPSB0cnVlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVsbHMgdGhlIGNvbnRyb2wgaXQgZG9lcyBub3QgaGF2ZSBmb2N1cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCbHVyKCkgewotCQlpZiAoZGVidWcpIHsKLQkJCXByaW50RGVidWdNZXNzYWdlKCJzZXRCbHVyLCBlZGl0YWJsZT0iICsgZWRpdGFibGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQlpZiAoaW5pdGlhbGl6ZWQpIHsKLQkJCQloYXNGb2N1cyA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQlpbml0aWFsaXplZFdpdGhGb2N1cyA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBjb250cm9sIGhhcyBmb2N1cy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY29udHJvbCBoYXMgdGhlIHVzZXItaW50ZXJmYWNlIGZvY3VzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJcmV0dXJuIGhhc0ZvY3VzOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIHRleHQgYW5kIGltYWdlIGxpbmtzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3MgaW4gdGhpcyBjb250cm9sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYXNlUGF0aCgpIHsKLQkJcmV0dXJuIGJhc2VQYXRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJhc2UgVVJMIG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aG9zZSBjb250ZW50IHdhcyBsYXN0Ci0JICogY29waWVkIHRvIHRoZSBjbGlwYm9hcmQuCi0JICogCi0JICogQHJldHVybiB0aGUgYmFzZSBVUkwgb2YgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBVUkwgZ2V0Q29weVVSTCgpIHsKLQkJcmV0dXJuIGNvcHlVUkw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFzZSBVUkwgb2YgdGhlIHJpY2ggdGV4dCBjb250cm9sIHdob3NlIGNvbnRlbnQgd2FzIGxhc3QgY29waWVkCi0JICogdG8gdGhlIGNsaXBib2FyZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3B5VVJMKCkgewotCQl0cnkgewotCQkJY29weVVSTCA9IG5ldyBGaWxlKGJhc2VQYXRoKS50b1VSTCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJY29weVVSTCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlZGl0YWJsZSBzdGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50IGlzIGVkaWF0YmxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RWRpdGFibGUoKSB7Ci0JCXJldHVybiBlZGl0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBlZGl0YWJsZSBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdGFibGUKLQkgKiAgICAgICAgICAgIHRoZSBlZGl0YWJsZSBzdGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJdGhpcy5lZGl0YWJsZSA9IGVkaXRhYmxlOwotCQlpZiAoaW5pdGlhbGl6ZWQpIHsKLQkJCWV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRURJVEFCTEUsICIiICsgZWRpdGFibGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgY29udGVudCBoYXMgYmVlbiBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50IGhhcyBiZWVuIG1vZGlmaWVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0TW9kaWZpZWQoKSB7Ci0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2RpZmllZCBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kaWZpZWQKLQkgKiAgICAgICAgICAgIHRoZSBtb2RpZmllZCBzdGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVkKGJvb2xlYW4gbW9kaWZpZWQpIHsKLQkJdGhpcy5tb2RpZmllZCA9IG1vZGlmaWVkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJpY2ggdGV4dCBjb250ZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJpY2ggdGV4dCBjb250ZW50IGZvcm1hdHRlZCBpbiBhIG1hcmt1cCBsYW5ndWFnZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsICYmIGluaXRpYWxpemVkKSB7Ci0JCQl0cnkgewotCQkJCWV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5HRVRfVEVYVCk7Ci0JCQkJaWYgKGN1cnJlbnRUZXh0ICE9IG51bGwgJiYgY3VycmVudFRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWN1cnJlbnRUZXh0ID0gY3VycmVudFRleHQucmVwbGFjZUFsbCgKLQkJCQkJCQkiPFA+Jm5ic3A7PC9QPiIsICI8YnIvPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkKLQkJCQkJY3VycmVudFRleHQgPSBmb3JtYXRIVE1MKGN1cnJlbnRUZXh0LCB0cnVlKTsKLQkJCQkJY3VycmVudFRleHQgPSB0aWR5VGV4dChjdXJyZW50VGV4dCk7Ci0JCQkJCS8vIENhbGwgSlRpZHkgdG8gcmVmb3JtYXQgdGhlIHNvdXJjZSBhZ2FpbiBqdXN0IGluIGNhc2UKLQkJCQkJLy8gdGlkeVRleHQoKSBkZXN0cm95cyB0aGUgZm9ybWF0dGluZy4KLQkJCQkJY3VycmVudFRleHQgPSBmb3JtYXRIVE1MKGN1cnJlbnRUZXh0LCBmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3VycmVudFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImdldFRleHQiLCAidGV4dD0iLCBjdXJyZW50VGV4dCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlyZXR1cm4gY3VycmVudFRleHQ7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdEhUTUwoU3RyaW5nIHRleHQsIGJvb2xlYW4gaWdub3JlRXJyb3JzKSB7Ci0JCVN0cmluZyBmb3JtYXR0ZWRUZXh0OwotCQl0cnkgewotCQkJLy8gQ2FsbCBKVGlkeSB0byBmb3JtYXQgdGhlIHNvdXJjZSB0byBYSFRNTC4KLQkJCWZvcm1hdHRlZFRleHQgPSBodG1sRm9ybWF0dGVyLmZvcm1hdEhUTUwodGV4dCk7Ci0JCQlpZiAoaHRtbEZvcm1hdHRlci5nZXRMYXN0RXJyb3JTdHIoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKCFpZ25vcmVFcnJvcnMpIHsKLQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKGh0bWxGb3JtYXR0ZXIuZ2V0TGFzdEVycm9yU3RyKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmb3JtYXR0ZWRUZXh0OwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByaWNoIHRleHQgY29udGVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHJpY2ggdGV4dCBjb250ZW50IGZvcm1hdHRlZCBpbiBhIG1hcmt1cCBsYW5ndWFnZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlwcmludERlYnVnTWVzc2FnZSgic2V0VGV4dCIsICJ0ZXh0PSIsIHRleHQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJU3RyaW5nIG5ld1RleHQgPSB0ZXh0OwotCQkJaWYgKG5ld1RleHQgIT0gbnVsbCAmJiBuZXdUZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJCS8vIENhbGwgSlRpZHkgdG8gZm9ybWF0IHRoZSBzb3VyY2UgdG8gWEhUTUwuCi0JCQkJbmV3VGV4dCA9IGZvcm1hdEhUTUwobmV3VGV4dCwgdHJ1ZSk7Ci0JCQkJbmV3VGV4dCA9IHRpZHlUZXh0KG5ld1RleHQpOwotCQkJCS8vIENhbGwgSlRpZHkgdG8gcmVmb3JtYXQgdGhlIHNvdXJjZSBhZ2FpbiBqdXN0IGluIGNhc2UKLQkJCQkvLyB0aWR5VGV4dCgpIGRlc3Ryb3lzIHRoZSBmb3JtYXR0aW5nLgotCQkJCW5ld1RleHQgPSBmb3JtYXRIVE1MKG5ld1RleHQsIGZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmV3VGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmIChpbml0aWFsaXplZCkgewotCQkJCW1vZGlmaWVkID0gIW5ld1RleHQuZXF1YWxzKGN1cnJlbnRUZXh0KTsKLQkJCX0KLQkJCWluaXRpYWxUZXh0ID0gbmV3VGV4dDsKLQotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkic2V0VGV4dCIsICJtb2RpZmllZD0iICsgbW9kaWZpZWQgKyAiLCBuZXdUZXh0PSIsIG5ld1RleHQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCi0JCQlpZiAoaW5pdGlhbGl6ZWQpIHsKLQkJCQl0cnkgewotCQkJCQlleGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX1RFWFQsIG5ld1RleHQpOwotCQkJCQlleGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX0VESVRBQkxFLCAiIiArIGVkaXRhYmxlKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCi0JCQljdXJyZW50VGV4dCA9IG5ld1RleHQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlcyB0aGUgcmljaCB0ZXh0IGNvbnRlbnQgYmFjayB0byB0aGUgaW5pdGlhbCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0b3JlVGV4dCgpIHsKLQkJc2V0VGV4dChpbml0aWFsVGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRleHQuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VsZWN0ZWQgdGV4dCBvciA8Y29kZT4iIjwvY29kZT4gaWYgdGhlcmUgaXMgbm8KLQkgKiAgICAgICAgIGhhc1NlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWRUZXh0KCkgewotCQkvLyBleGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuR0VUX1NFTEVDVEVEX1RFWFQpOwotCQlyZXR1cm4gcmljaFRleHRTZWxlY3Rpb24uZ2V0VGV4dCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dCNnZXRTZWxlY3RlZCgpCi0JICovCi0JcHVibGljIFJpY2hUZXh0U2VsZWN0aW9uIGdldFNlbGVjdGVkKCkgewotCQlyZXR1cm4gcmljaFRleHRTZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcHBsaWNhdGlvbiBzcGVjaWZpYyBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaGFzIG5vdAotCSAqICAgICAgICAgYmVlbiBzZXQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERhdGEoU3RyaW5nIGtleSkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5nZXREYXRhKGtleSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhbiBhcHBsaWNhdGlvbiBzcGVjaWZpYyBwcm9wZXJ0eSBuYW1lIGFuZCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGEoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLnNldERhdGEoa2V5LCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gSmF2YVNjcmlwdC4KLQkgKiAKLQkgKiBAcGFyYW0gc2NyaXB0Ci0JICogICAgICAgICAgICB0aGUgSmF2YVNjcmlwdCB0byBleGVjdXRlCi0JICogQHJldHVybiBhIHN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHRoZSBleGVjdXRlZCBzY3JpcHQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGV4ZWN1dGUoU3RyaW5nIHNjcmlwdCkgewotCQlzdGF0dXMgPSAwOwotCQlpZiAoZWRpdG9yICE9IG51bGwgJiYgc2NyaXB0ICE9IG51bGwgJiYgc2NyaXB0Lmxlbmd0aCgpID4gMCkgewotCQkJdHJ5IHsKLQkJCQllZGl0b3IuZXhlY3V0ZShzY3JpcHQpOwotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlwcmludERlYnVnTWVzc2FnZSgiZXhlY3V0ZSIsIHNjcmlwdCk7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgbXNnID0gIkZhaWxlZCB0byBleGVjdXRlICIgKyBzY3JpcHQ7IC8vJE5PTi1OTFMtMSQKLQkJCQlsb2dnZXIubG9nRXJyb3IobXNnLCBlKTsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImV4ZWN1dGUiLCBtc2cpOyAvLyROT04tTkxTLTEkCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIHJpY2ggdGV4dCBjb21tYW5kLiBUaGUgc3VwcG9ydGVkIGNvbW1hbmQgc3RyaW5ncyBhcmUKLQkgKiBkZWZpbmVkIGluIDxjb2RlPlJpY2hUZXh0Q29tbWFuZDxjb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0JY29tbWFuZAkJYSByaWNoIHRleHQgY29tbWFuZCBzdHJpbmcuCi0JICogQHJldHVybglhIHN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHRoZSBleGVjdXRlZCBjb21tYW5kCi0JICovCi0JcHVibGljIGludCBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgewotCQlzdGF0dXMgPSAwOwotCQlpZiAoY29tbWFuZCAhPSBudWxsICYmIGNvbW1hbmQuZXF1YWxzKFJpY2hUZXh0Q29tbWFuZC5DTEVBUl9DT05URU5UKSkgewotCQkJU3RyaW5nIG9sZEluaXRpYWxUZXh0ID0gaW5pdGlhbFRleHQ7Ci0JCQlzZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJaW5pdGlhbFRleHQgPSBvbGRJbml0aWFsVGV4dDsKLQkJCXN0YXR1cyA9IDE7Ci0JCQltb2RpZmllZCA9IHRydWU7Ci0JCQlub3RpZnlNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IGV4ZWN1dGUoY29tbWFuZCArICIoKTsiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIHJpY2ggdGV4dCBjb21tYW5kIHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyLiBUaGUKLQkgKiBzdXBwb3J0ZWQgY29tbWFuZCBzdHJpbmdzIGFyZSBkZWZpbmVkIGluIDxjb2RlPlJpY2hUZXh0Q29tbWFuZDxjb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0JY29tbWFuZAkJYSByaWNoIHRleHQgY29tbWFuZCBzdHJpbmcKLQkgKiBAcGFyYW0JcGFyYW0JCWEgcGFyYW1ldGVyIGZvciB0aGUgY29tbWFuZCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4JYSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgZXhlY3V0ZWQgY29tbWFuZAotCSAqLwotCXB1YmxpYyBpbnQgZXhlY3V0ZUNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIFN0cmluZyBwYXJhbSkgewotCQlpZiAocGFyYW0gPT0gbnVsbCkgewotCQkJcmV0dXJuIGV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpOwotCQl9Ci0JCXJldHVybiBleGVjdXRlKGNvbW1hbmQgKyAiKCciICsgZm9ybWF0VGV4dChwYXJhbSkgKyAiJyk7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiByaWNoIHRleHQgY29tbWFuZCB3aXRoIGFuIGFycmF5IG9mIHBhcmFtZXRlcnMuIFRoZQotCSAqIHN1cHBvcnRlZCBjb21tYW5kIHN0cmluZ3MgYXJlIGRlZmluZWQgaW4gPGNvZGU+UmljaFRleHRDb21tYW5kPGNvZGU+LgotCSAqIAotCSAqIEBwYXJhbQljb21tYW5kCQlhIHJpY2ggdGV4dCBjb21tYW5kIHN0cmluZwotCSAqIEBwYXJhbQlwYXJhbXMJCWFuIGFycmF5IG9mIHBhcmFtZXRlcnMgZm9yIHRoZSBjb21tYW5kIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybglhIHN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHRoZSBleGVjdXRlZCBjb21tYW5kCi0JICovCi0JcHVibGljIGludCBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCwgU3RyaW5nW10gcGFyYW1zKSB7Ci0JCWlmIChwYXJhbXMgPT0gbnVsbCB8fCBwYXJhbXMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBleGVjdXRlQ29tbWFuZChjb21tYW5kKTsKLQkJfQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBwYXJhbXNMZW5ndGggPSBwYXJhbXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtc0xlbmd0aDsgaSsrKSB7Ci0JCQlzYi5hcHBlbmQoJ1wnJykuYXBwZW5kKGZvcm1hdFRleHQocGFyYW1zW2ldKSkuYXBwZW5kKCdcJycpOwotCQkJaWYgKGkgPCBwYXJhbXNMZW5ndGggLSAxKSB7Ci0JCQkJc2IuYXBwZW5kKCcsJyk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIHBhcmFtID0gc2IudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGV4ZWN1dGUoY29tbWFuZCArICIoIiArIHBhcmFtICsgIik7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhlIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGNvbnRleHRNZW51ICE9IG51bGwgJiYgIWNvbnRleHRNZW51LmlzRGlzcG9zZWQoKSkgewotCQkJY29udGV4dE1lbnUuZGlzcG9zZSgpOwotCQkJY29udGV4dE1lbnUgPSBudWxsOwotCQl9Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJbGlzdGVuZXJzLmNsZWFyKCk7Ci0JCQlsaXN0ZW5lcnMgPSBudWxsOwotCQl9Ci0JCWlmIChtb2RpZnlMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJbW9kaWZ5TGlzdGVuZXJzLmNsZWFyKCk7Ci0JCQltb2RpZnlMaXN0ZW5lcnMgPSBudWxsOwotCQl9Ci0JCWlmIChodG1sRm9ybWF0dGVyICE9IG51bGwpIHsKLQkJCWh0bWxGb3JtYXR0ZXIgPSBudWxsOwotCQl9Ci0JCWlmICh0aGlzLmZpbmRSZXBsYWNlQWN0aW9uICE9IG51bGwpIHsKLQkJCXRoaXMuZmluZFJlcGxhY2VBY3Rpb24uZGlzcG9zZSgpOwotCQkJdGhpcy5maW5kUmVwbGFjZUFjdGlvbiA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGlzIGNvbnRyb2wgaGFzIGJlZW4gZGlzcG9zZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNvbnRyb2wgaXMgZGlzcG9zZWQgc3VjY2Vzc2Z1bGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCgpIHsKLQkJcmV0dXJuIGVkaXRvci5pc0Rpc3Bvc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kaWZ5IGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiBhbiBpdGVyYXRvciBmb3IgcmV0cmlldmluZyB0aGUgbW9kaWZ5IGxpc3RlbmVycwotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRNb2RpZnlMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBtb2RpZnlMaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4KLQkgKiBrZXlzIGFyZSBwcmVzc2VkIGFuZCByZWxlYXNlZCB3aXRoaW4gdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEtleUxpc3RlbmVyKEtleUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLmFkZEtleUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4ga2V5cyBhcmUgcHJlc3NlZCBhbmQgcmVsZWFzZWQgd2l0aGluIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlS2V5TGlzdGVuZXIoS2V5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3IucmVtb3ZlS2V5TGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZCB3aGVuCi0JICogdGhlIGNvbnRlbnQgb2YgdGhpcyBjb250cm9sIGlzIG1vZGlmaWVkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCAmJiBsaXN0ZW5lciAhPSBudWxsCi0JCQkJJiYgIW1vZGlmeUxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCW1vZGlmeUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkCi0JICogd2hlbiB0aGUgY29udGVudCBvZiB0aGlzIGNvbnRyb2wgaXMgbW9kaWZpZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCAmJiBsaXN0ZW5lciAhPSBudWxsCi0JCQkJJiYgbW9kaWZ5TGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJbW9kaWZ5TGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZlZCB3aGVuCi0JICogdGhpcyBjb250cm9sIGlzIGRpc3Bvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3IuYWRkRGlzcG9zZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4gdGhpcyBjb250cm9sIGlzIGRpc3Bvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVEaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4KLQkgKiBoZWxwIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGZvciB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkSGVscExpc3RlbmVyKEhlbHBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5hZGRIZWxwTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkCi0JICogd2hlbiBoZWxwIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGZvciB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUhlbHBMaXN0ZW5lcihIZWxwTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3IucmVtb3ZlSGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmVkIHdoZW4KLQkgKiBhbiBldmVudCBvZiB0aGUgZ2l2ZW4gdHlwZSBvY2N1cnMgd2l0aGluIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGV2ZW50IG9jY3VycwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKGludCBldmVudFR5cGUsIExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCAmJiAhbGlzdGVuZXJzLmNvbnRhaW5zS2V5KGxpc3RlbmVyKSkgewotCQkJaWYgKGV2ZW50VHlwZSAhPSBTV1QuU0VMRUNURUQpIHsKLQkJCQlpZiAoZWRpdG9yQ29udHJvbCA9PSBudWxsCi0JCQkJCQl8fCAoZXZlbnRUeXBlICE9IFNXVC5BY3RpdmF0ZQotCQkJCQkJCQkmJiBldmVudFR5cGUgIT0gU1dULkRlYWN0aXZhdGUKLQkJCQkJCQkJJiYgZXZlbnRUeXBlICE9IFNXVC5Gb2N1c0luICYmIGV2ZW50VHlwZSAhPSBTV1QuRm9jdXNPdXQpKSB7Ci0JCQkJCWVkaXRvci5hZGRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTsKLQkJCQl9Ci0JCQl9Ci0JCQlsaXN0ZW5lcnMucHV0KGxpc3RlbmVyLCBuZXcgUmljaFRleHRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmVkCi0JICogd2hlbiBhbiBldmVudCBvZiB0aGUgZ2l2ZW4gdHlwZSBvY2N1cnMgd2l0aGluIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZCB3aGVuIHRoZSBldmVudAotCSAqICAgICAgICAgICAgb2NjdXJzCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoaW50IGV2ZW50VHlwZSwgTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsICYmIGxpc3RlbmVycy5jb250YWluc0tleShsaXN0ZW5lcikpIHsKLQkJCWlmIChlZGl0b3JDb250cm9sID09IG51bGwKLQkJCQkJfHwgKGV2ZW50VHlwZSAhPSBTV1QuQWN0aXZhdGUKLQkJCQkJCQkmJiBldmVudFR5cGUgIT0gU1dULkRlYWN0aXZhdGUKLQkJCQkJCQkmJiBldmVudFR5cGUgIT0gU1dULkZvY3VzSW4gJiYgZXZlbnRUeXBlICE9IFNXVC5Gb2N1c091dCkpIHsKLQkJCQllZGl0b3IucmVtb3ZlTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7Ci0JCQl9Ci0JCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV2ZW50IGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiBhbiBpdGVyYXRvciBmb3IgcmV0cmlldmluZyB0aGUgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMKLQkgKiAgICAgICAgIGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gbGlzdGVuZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbGlzdGVuZXIgdG8gbW9uaXRvciBldmVudHMgYW5kIHN0YXR1cyBzZW50IGJ5IHRoZSB1bmRlcmx5aW5nCi0JICogREhUTUwgZWRpdG9yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQkJZWRpdG9yLmFkZFN0YXR1c1RleHRMaXN0ZW5lcihuZXcgU3RhdHVzVGV4dExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChTdGF0dXNUZXh0RXZlbnQgZXZlbnQpIHsKLQkJCQlTdHJpbmcgZXZlbnRUZXh0ID0gZXZlbnQudGV4dDsKLQkJCQlpbnQgZXZlbnRUZXh0TGVuZ3RoID0gZXZlbnRUZXh0Lmxlbmd0aCgpOwotCQkJCWlmIChldmVudFRleHQuc3RhcnRzV2l0aChTVEFUVVNfUFJFRklYKQotCQkJCQkJJiYgZXZlbnRUZXh0TGVuZ3RoID4gU1RBVFVTX1BSRUZJWF9MRU5HVEgpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWludCBlbmRTdGF0dXNJbmRleCA9IFNUQVRVU19QUkVGSVhfTEVOR1RIICsgMTsKLQkJCQkJCWlmIChldmVudFRleHQubGVuZ3RoKCkgPiBTVEFUVVNfUFJFRklYX0xFTkdUSCArIDEKLQkJCQkJCQkJJiYgQ2hhcmFjdGVyLmlzRGlnaXQoZXZlbnRUZXh0Ci0JCQkJCQkJCQkJLmNoYXJBdChlbmRTdGF0dXNJbmRleCkpKSB7Ci0JCQkJCQkJZW5kU3RhdHVzSW5kZXgrKzsKLQkJCQkJCX0KLQkJCQkJCWludCBzdGF0dXNUeXBlID0gSW50ZWdlci5wYXJzZUludChldmVudFRleHQuc3Vic3RyaW5nKAotCQkJCQkJCQlTVEFUVVNfUFJFRklYX0xFTkdUSCwgZW5kU3RhdHVzSW5kZXgpKTsKLQkJCQkJCXN3aXRjaCAoc3RhdHVzVHlwZSkgewotCQkJCQkJY2FzZSBTVEFUVVNfTk9QOgotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTVEFUVVNfSU5JVElBTElaRUQ6Ci0JCQkJCQkJaWYgKCFpbml0aWFsaXplZCkgewotCQkJCQkJCQlpbml0aWFsaXplZCA9IHRydWU7Ci0JCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkJCQkJCSJzdGF0dXNUZXh0TGlzdGVuZXIiLCAiU1RBVFVTX0lOSVRJQUxJWkVEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmICghUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJLy8gV29ya2Fyb3VuZCBNb3ppbGxhJ2EgSUZSQU1FIGhlaWdodCBpc3N1ZS4KLQkJCQkJCQkJCWV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfSEVJR0hULAotCQkJCQkJCQkJCQkiIiArIGVkaXRvci5nZXRCb3VuZHMoKS5oZWlnaHQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlNFVF9URVhULAotCQkJCQkJCQkJCWN1cnJlbnRUZXh0KTsKLQkJCQkJCQkJaWYgKGluaXRpYWxpemVkV2l0aEZvY3VzKSB7Ci0JCQkJCQkJCQlzZXRGb2N1cygpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmICghZWRpdGFibGUpIHsKLQkJCQkJCQkJCWV4ZWN1dGVDb21tYW5kKAotCQkJCQkJCQkJCQlSaWNoVGV4dENvbW1hbmQuU0VUX0VESVRBQkxFLAotCQkJCQkJCQkJCQkiIiArIGVkaXRhYmxlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTVEFUVVNfTU9ESUZJRUQ6Ci0JCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJCQkJCSJzdGF0dXNUZXh0TGlzdGVuZXIiLCAiU1RBVFVTX01PRElGSUVEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCX0KLQkJCQkJCQljaGVja01vZGlmeSgpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTVEFUVVNfR0VUX1RFWFQ6Ci0JCQkJCQkJaWYgKGV2ZW50VGV4dExlbmd0aCA+PSBTVEFUVVNfUFJFRklYX0xFTkdUSCArIDIpIHsKLQkJCQkJCQkJY3VycmVudFRleHQgPSBldmVudFRleHQKLQkJCQkJCQkJCQkuc3Vic3RyaW5nKFNUQVRVU19QUkVGSVhfTEVOR1RIICsgMik7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJY3VycmVudFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkJCQkJInN0YXR1c1RleHRMaXN0ZW5lciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkiU1RBVFVTX0dFVF9URVhULCBjdXJyZW50VGV4dD0iLCBjdXJyZW50VGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFNUQVRVU19LRVlfRE9XTjoKLQkJCQkJCQlpZiAoZXZlbnRUZXh0TGVuZ3RoID49IFNUQVRVU19QUkVGSVhfTEVOR1RIICsgMikgewotCQkJCQkJCQlTdHJpbmcgY21kID0gZXZlbnRUZXh0Ci0JCQkJCQkJCQkJLnN1YnN0cmluZyhTVEFUVVNfUFJFRklYX0xFTkdUSCArIDIpOwotCQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJCXByaW50RGVidWdNZXNzYWdlKCJzdGF0dXNUZXh0TGlzdGVuZXIiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSJTVEFUVVNfS0VZX0RPV04sIGNtZD0iICsgY21kKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChjbWQuZXF1YWxzKFJpY2hUZXh0Q29tbWFuZC5DT1BZKSkgewotCQkJCQkJCQkJc2V0Q29weVVSTCgpOwotCQkJCQkJCQl9IGVsc2UgaWYgKGNtZC5lcXVhbHMoUmljaFRleHRDb21tYW5kLkNVVCkpIHsKLQkJCQkJCQkJCXNldENvcHlVUkwoKTsKLQkJCQkJCQkJCUN1dEFjdGlvbiBhY3Rpb24gPSBuZXcgQ3V0QWN0aW9uKCk7Ci0JCQkJCQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dC50aGlzKTsKLQkJCQkJCQkJfSBlbHNlIGlmIChjbWQKLQkJCQkJCQkJCQkuZXF1YWxzKFJpY2hUZXh0Q29tbWFuZC5GSU5EX1RFWFQpKSB7Ci0JCQkJCQkJCQlnZXRGaW5kUmVwbGFjZUFjdGlvbigpLmV4ZWN1dGUoUmljaFRleHQudGhpcyk7Ci0JCQkJCQkJCX0gZWxzZSBpZiAoY21kLmVxdWFscyhSaWNoVGV4dENvbW1hbmQuUEFTVEUpKSB7Ci0JCQkJCQkJCQlQYXN0ZUFjdGlvbiBhY3Rpb24gPSBuZXcgUGFzdGVBY3Rpb24oKTsKLQkJCQkJCQkJCWFjdGlvbi5leGVjdXRlKFJpY2hUZXh0LnRoaXMpOwotCQkJCQkJCQl9IGVsc2UgaWYgKGNtZC5lcXVhbHMoUmljaFRleHRDb21tYW5kLlNBVkUpKSB7Ci0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpCi0JCQkJCQkJCQkJCS5kb1NhdmUobnVsbCk7Ci0JCQkJCQkJCX0gZWxzZSBpZiAoY21kLmVxdWFscyhSaWNoVGV4dENvbW1hbmQuU0FWRV9BTEwpKSB7Ci0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlUGFnZSgpLnNhdmVBbGxFZGl0b3JzKAotCQkJCQkJCQkJCQkJCWZhbHNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX0tFWV9VUDoKLQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoInN0YXR1c1RleHRMaXN0ZW5lciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkiU1RBVFVTX0tFWV9VUCwgbW9kaWZpZWQ9IiArIG1vZGlmaWVkKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQljaGVja01vZGlmeSgpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTVEFUVVNfU0VMRUNUX1RFWFQ6Ci0JCQkJCQkJaWYgKGV2ZW50VGV4dExlbmd0aCA+PSBTVEFUVVNfUFJFRklYX0xFTkdUSCArIDIpIHsKLQkJCQkJCQkJU3RyaW5nW10gc3RyaW5ncyA9IGV2ZW50VGV4dC5zdWJzdHJpbmcoCi0JCQkJCQkJCQkJU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAyKS5zcGxpdCgKLQkJCQkJCQkJCQkiXFwkIiwgNSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCS8vIHJpY2hUZXh0U2VsZWN0aW9uLnNldE9mZnNldFN0YXJ0KEludGVnZXIucGFyc2VJbnQoc3RyaW5nc1swXSkpOwotCi0JCQkJCQkJCQlyaWNoVGV4dFNlbGVjdGlvbi5zZXRGb250TmFtZShzdHJpbmdzWzBdKTsKLQkJCQkJCQkJCXJpY2hUZXh0U2VsZWN0aW9uLnNldEZvbnRTaXplKHN0cmluZ3NbMV0pOwotCQkJCQkJCQkJcmljaFRleHRTZWxlY3Rpb24uc2V0QmxvY2tTdHlsZShzdHJpbmdzWzJdKTsKLQkJCQkJCQkJCXJpY2hUZXh0U2VsZWN0aW9uLnNldEZsYWdzKEludGVnZXIKLQkJCQkJCQkJCQkJLnBhcnNlSW50KHN0cmluZ3NbM10pKTsKLQkJCQkJCQkJCXJpY2hUZXh0U2VsZWN0aW9uLnNldFRleHQoc3RyaW5nc1s0XSk7Ci0JCQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkJCQkJInNlbGVjdGlvblN0YXR1c0xpc3RlbmVyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkiY3VycmVudCBzZWxlY3Rpb24gaXM9IiArIHJpY2hUZXh0U2VsZWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJaGFzU2VsZWN0aW9uID0gdHJ1ZTsKLQkJCQkJCQkJaWYgKGhhc0ZvY3VzKCkpCi0JCQkJCQkJCQlub3RpZnlMaXN0ZW5lcnMoU1dULlNFTEVDVEVELCBuZXcgRXZlbnQoKSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcmljaFRleHRTZWxlY3Rpb24uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJaGFzU2VsZWN0aW9uID0gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkJCQkic3RhdHVzVGV4dExpc3RlbmVyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSJTVEFUVVNfU0VMRUNUX1RFWFQsIHNlbGVjdGVkVGV4dD0iLCByaWNoVGV4dFNlbGVjdGlvbi5nZXRUZXh0KCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTVEFUVVNfU0VMRUNUX0NPTlRST0w6Ci0JCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCXByaW50RGVidWdNZXNzYWdlKCJzdGF0dXNUZXh0TGlzdGVuZXIiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJIlNUQVRVU19TRUxFQ1RfQ09OVFJPTCwgY29udHJvbCBzZWxlY3RlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWhhc1NlbGVjdGlvbiA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFNUQVRVU19TRUxFQ1RfTk9ORToKLQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoInN0YXR1c1RleHRMaXN0ZW5lciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkiU1RBVFVTX1NFTEVDVF9OT05FLCBubyBzZWxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQloYXNTZWxlY3Rpb24gPSBmYWxzZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX0VYRUNfQ01EOgotCQkJCQkJCWlmIChldmVudFRleHRMZW5ndGggPj0gU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAzKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlzdGF0dXMgPSBJbnRlZ2VyLnBhcnNlSW50KGV2ZW50VGV4dAotCQkJCQkJCQkJCQkuc3Vic3RyaW5nKAotCQkJCQkJCQkJCQkJCVNUQVRVU19QUkVGSVhfTEVOR1RIICsgMiwKLQkJCQkJCQkJCQkJCQlTVEFUVVNfUFJFRklYX0xFTkdUSCArIDMpKTsKLQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCXN0YXR1cyA9IC0xOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChkZWJ1ZyAmJiBzdGF0dXMgIT0gMSkgewotCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgic3RhdHVzVGV4dExpc3RlbmVyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSJTVEFUVVNfRVhFQ19DTUQsIHN0YXR1cz0iICsgc3RhdHVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIHRoZSBIVE1MIHNvdXJjZSBmb3IgdGhlIGVkaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBIVE1MIHNvdXJjZSBmb3IgdGhlIGVkaXRvcgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2VuZXJhdGVFZGl0b3JIVE1MKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBlc2NhcGVkQmFzZVBhdGggPSBiYXNlUGF0aDsKLQkJaWYgKGVzY2FwZWRCYXNlUGF0aC5zdGFydHNXaXRoKEZpbGVVdGlsLlVOQ19QQVRIX1BSRUZJWCkpCi0JCQllc2NhcGVkQmFzZVBhdGggPSBlc2NhcGVkQmFzZVBhdGgucmVwbGFjZUZpcnN0KAotCQkJCQkiXlxcXFxcXFxcIiwgIlxcXFxcXFxcXFxcXFxcXFwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWVzY2FwZWRCYXNlUGF0aCA9IFhNTFV0aWwKLQkJCQkuZXNjYXBlKCJmaWxlOi8vIiArIGVzY2FwZWRCYXNlUGF0aC5yZXBsYWNlQWxsKCInIiwgIlxcXFwnIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlTdHJpbmcgZXNjYXBlZFJ0ZVVUTCA9IHJ0ZVVSTC5yZXBsYWNlQWxsKCImYXBvczsiLCAiJTI3Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCVN0cmluZ0J1ZmZlciBydGVYTUwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXJ0ZVhNTC5hcHBlbmQoIjxydGUgaWQ9XCIiKS5hcHBlbmQoInJ0ZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCS5hcHBlbmQoIlwiIGNzcz1cIiIpLmFwcGVuZChlc2NhcGVkUnRlVVRMICsgInJ0ZS5jc3MiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkuYXBwZW5kKCJcIiBqcz1cIiIpLmFwcGVuZChlc2NhcGVkUnRlVVRMICsgInJ0ZS5qcyIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCS5hcHBlbmQoIlwiIGJhc2VVUkw9XCIiKS5hcHBlbmQoZXNjYXBlZEJhc2VQYXRoKSAvLyROT04tTkxTLTEkCi0JCQkJLmFwcGVuZCgiXCIvPiIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1dyaXRlciByZXN1bHQgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVhTTFRQcm9jZXNzb3IudHJhbnNmb3JtKAotCQkJCXJ0ZUZvbGRlciArICJydGUueHNsIiwgcnRlWE1MLnRvU3RyaW5nKCksIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEZpbGxzIHRoZSBjb250ZXh0IG1lbnUgd2l0aCBtZW51IGl0ZW1zLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0TWVudQotCSAqICAgICAgICAgICAgYSBjb250ZXh0IG1lbnUgY29udGFpbmluZyByaWNoIHRleHQgYWN0aW9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxDb250ZXh0TWVudShNZW51IGNvbnRleHRNZW51KSB7Ci0JCWZpbmFsIE1lbnVJdGVtIGN1dEl0ZW0gPSBuZXcgTWVudUl0ZW0oY29udGV4dE1lbnUsIFNXVC5QVVNIKTsKLQkJY3V0SXRlbS5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmN1dEFjdGlvbl90ZXh0KTsKLQkJY3V0SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ3V0QWN0aW9uIGFjdGlvbiA9IG5ldyBDdXRBY3Rpb24oKTsKLQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dC50aGlzKTsKLQkJCX0KLQkJfSk7Ci0JCWZpbmFsIE1lbnVJdGVtIGNvcHlJdGVtID0gbmV3IE1lbnVJdGVtKGNvbnRleHRNZW51LCBTV1QuUFVTSCk7Ci0JCWNvcHlJdGVtLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuY29weUFjdGlvbl90ZXh0KTsKLQkJY29weUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvcHlBY3Rpb24gYWN0aW9uID0gbmV3IENvcHlBY3Rpb24oKTsKLQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dC50aGlzKTsKLQkJCX0KLQkJfSk7Ci0JCWZpbmFsIE1lbnVJdGVtIHBhc3RlSXRlbSA9IG5ldyBNZW51SXRlbShjb250ZXh0TWVudSwgU1dULlBVU0gpOwotCQlwYXN0ZUl0ZW0uc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5wYXN0ZUFjdGlvbl90ZXh0KTsKLQkJcGFzdGVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlQYXN0ZUFjdGlvbiBhY3Rpb24gPSBuZXcgUGFzdGVBY3Rpb24oKTsKLQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dC50aGlzKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZmluYWwgTWVudUl0ZW0gcGFzdGVQbGFpblRleHRJdGVtID0gbmV3IE1lbnVJdGVtKGNvbnRleHRNZW51LCBTV1QuUFVTSCk7Ci0JCXBhc3RlUGxhaW5UZXh0SXRlbS5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnBhc3RlUGxhaW5UZXh0QWN0aW9uX3RleHQpOwotCQlwYXN0ZVBsYWluVGV4dEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCVBhc3RlUGxhaW5UZXh0QWN0aW9uIGFjdGlvbiA9IG5ldyBQYXN0ZVBsYWluVGV4dEFjdGlvbigpOwotCQkJCWFjdGlvbi5leGVjdXRlKFJpY2hUZXh0LnRoaXMpOwotCQkJfQotCQl9KTsKLQotCQljb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1lbnVIaWRkZW4oTWVudUV2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbWVudVNob3duKE1lbnVFdmVudCBlKSB7Ci0JCQkJZ2V0U2VsZWN0ZWRUZXh0KCk7Ci0JCQkJY3V0SXRlbS5zZXRFbmFibGVkKGVkaXRhYmxlICYmIGhhc1NlbGVjdGlvbik7Ci0JCQkJY29weUl0ZW0uc2V0RW5hYmxlZChoYXNTZWxlY3Rpb24pOwotCQkJCXBhc3RlSXRlbS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCQlwYXN0ZVBsYWluVGV4dEl0ZW0uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEFkZHMgbGlzdGVuZXJzIHRvIG1hbmFnZSB0aGUgYWN0aXZhdGlvbiBhbmQgZm9jdXMgZXZlbnRzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJZWRpdG9yQ29udHJvbCA9IGdldENvbnRyb2xTaXRlKGVkaXRvcik7Ci0JCWlmIChlZGl0b3JDb250cm9sICE9IG51bGwpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJImluaXQiLCAiZWRpdG9yQ29udHJvbD0iICsgZWRpdG9yQ29udHJvbC5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQllZGl0b3JDb250cm9sLmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImFjdGl2YXRlTGlzdGVuZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXNldEZvY3VzKCk7Ci0JCQkJCW5vdGlmeUxpc3RlbmVycyhTV1QuQWN0aXZhdGUsIGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJZWRpdG9yQ29udHJvbC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImRlYWN0aXZhdGVMaXN0ZW5lciIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJc2V0Qmx1cigpOwotCQkJCQlub3RpZnlMaXN0ZW5lcnMoU1dULkRlYWN0aXZhdGUsIGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJZWRpdG9yQ29udHJvbC5hZGRMaXN0ZW5lcihTV1QuRm9jdXNJbiwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImZvY3VzSW5MaXN0ZW5lciIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZXhlY3V0ZUNvbW1hbmQoInVwZGF0ZVNlbGVjdGlvbiIpOyAvLyROT04tTkxTLTEkCQkJCQkKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKFNXVC5Gb2N1c0luLCBldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWVkaXRvckNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULktleVVwLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkJaW50IGtleUNvZGUgPSBldmVudC5rZXlDb2RlOwotCQkJCQlpbnQgc3RhdGVNYXNrID0gZXZlbnQuc3RhdGVNYXNrOwotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJCQkia2V5VXBMaXN0ZW5lciIsICJrZXlDb2RlPSIgKyBrZXlDb2RlIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCSsgIiwgc3RhdGVNYXNrPSIgKyBzdGF0ZU1hc2sgKyAiLCBlZGl0YWJsZT0iICsgZWRpdGFibGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlpZiAoKHN0YXRlTWFzayAmIFNXVC5DVFJMKSA+IDAKLQkJCQkJCQl8fCAoc3RhdGVNYXNrICYgU1dULkFMVCkgPiAwCi0JCQkJCQkJfHwgKChzdGF0ZU1hc2sgJiBTV1QuU0hJRlQpID4gMCAmJiBrZXlDb2RlID09IHN0YXRlTWFzaykpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlpZiAoZWRpdGFibGUpIHsKLQkJCQkJCXN3aXRjaCAoZXZlbnQua2V5Q29kZSkgewotCQkJCQkJY2FzZSBTV1QuQVJST1dfRE9XTjoKLQkJCQkJCWNhc2UgU1dULkFSUk9XX0xFRlQ6Ci0JCQkJCQljYXNlIFNXVC5BUlJPV19SSUdIVDoKLQkJCQkJCWNhc2UgU1dULkFSUk9XX1VQOgotCQkJCQkJY2FzZSBTV1QuRU5EOgotCQkJCQkJY2FzZSBTV1QuSE9NRToKLQkJCQkJCWNhc2UgU1dULlBBR0VfRE9XTjoKLQkJCQkJCWNhc2UgU1dULlBBR0VfVVA6Ci0JCQkJCQljYXNlIFNXVC5UQUI6Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQljaGVja01vZGlmeSgpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWVkaXRvci5hZGRMb2NhdGlvbkxpc3RlbmVyKG5ldyBMb2NhdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCQkvLyBEZWFjdGl2YXRlIHRoZSBsaW5rcyBpbiB0aGUgY29udGVudCBwYWdlIGluIHJlYWRvbmx5Ci0JCQkJCS8vIG1vZGUuCi0JCQkJCWV2ZW50LmRvaXQgPSBlZGl0YWJsZTsKLQkJCQl9Ci0JCQl9KTsKLQkJfSBlbHNlIHsKLQkJCWVkaXRvci5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCXByaW50RGVidWdNZXNzYWdlKCJhY3RpdmF0ZUxpc3RlbmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlzZXRGb2N1cygpOwotCQkJCX0KLQkJCX0pOwotCi0JCQllZGl0b3IuYWRkS2V5TGlzdGVuZXIobmV3IEtleUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJCQlpZiAoZS5rZXlDb2RlID09IFNXVC5UQUIpIHsKLQkJCQkJCWlmICgoZS5zdGF0ZU1hc2sgJiBTV1QuU0hJRlQpICE9IDApIHsKLQkJCQkJCQllZGl0b3IudHJhdmVyc2UoU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUyk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWVkaXRvci50cmF2ZXJzZShTV1QuVFJBVkVSU0VfVEFCX05FWFQpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWlmICghZWRpdGFibGUpIHsKLQkJCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkJCQlpZiAoKGUuc3RhdGVNYXNrICYgU1dULkNUUkwpID4gMAotCQkJCQkJCXx8IChlLnN0YXRlTWFzayAmIFNXVC5BTFQpID4gMCkKLQkJCQkJCXJldHVybjsKLQkJCQkJaWYgKGVkaXRhYmxlKSB7Ci0JCQkJCQlzd2l0Y2ggKGUua2V5Q29kZSkgewotCQkJCQkJY2FzZSBTV1QuQVJST1dfRE9XTjoKLQkJCQkJCWNhc2UgU1dULkFSUk9XX0xFRlQ6Ci0JCQkJCQljYXNlIFNXVC5BUlJPV19SSUdIVDoKLQkJCQkJCWNhc2UgU1dULkFSUk9XX1VQOgotCQkJCQkJY2FzZSBTV1QuRU5EOgotCQkJCQkJY2FzZSBTV1QuSE9NRToKLQkJCQkJCWNhc2UgU1dULlBBR0VfRE9XTjoKLQkJCQkJCWNhc2UgU1dULlBBR0VfVVA6Ci0JCQkJCQljYXNlIFNXVC5TSElGVDoKLQkJCQkJCWNhc2UgU1dULlRBQjoKLQkJCQkJCQlicmVhazsKLQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJY2hlY2tNb2RpZnkoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJZWRpdG9yLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImRpc3Bvc2VMaXN0ZW5lciIpOyAvLyROT04tTkxTLTEkCQkJCQkJCi0JCQkJfQotCQkJCWRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbGlzdGVuZXJzID0gbmV3IEhhc2h0YWJsZTxMaXN0ZW5lciwgUmljaFRleHRMaXN0ZW5lcj4oKTsKLQkJbW9kaWZ5TGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxNb2RpZnlMaXN0ZW5lcj4oKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgcmljaCB0ZXh0IGV2ZW50IGxpc3RlbmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgZXZlbnQgdHlwZQotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgdGhlIFNXVCBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhpbnQgZXZlbnRUeXBlLCBFdmVudCBldmVudCkgewotCQlpZiAobm90aWZ5aW5nTW9kaWZ5TGlzdGVuZXJzKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlldmVudC5kaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWV2ZW50LndpZGdldCA9IGVkaXRvcjsKLQotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0ZW5lcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlSaWNoVGV4dExpc3RlbmVyIGxpc3RlbmVyID0gKFJpY2hUZXh0TGlzdGVuZXIpIGkubmV4dCgpOwotCQkJaWYgKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpID09IGV2ZW50VHlwZSkgewotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkibm90aWZ5TGlzdGVuZXJzIiwgIm5vdGlmeWluZyBsaXN0ZW5lciwgIiArIGxpc3RlbmVyICsgIiwgZXZlbnRUeXBlPSIgKyBldmVudFR5cGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJLy8kTk9OLU5MUy0zJAkKLQkJCQl9Ci0JCQkJbGlzdGVuZXIuZ2V0TGlzdGVuZXIoKS5oYW5kbGVFdmVudChldmVudCk7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJCSJub3RpZnlMaXN0ZW5lcnMiLCAibm90aWZpZWQgbGlzdGVuZXIsICIgKyBsaXN0ZW5lciArICIsIGV2ZW50VHlwZT0iICsgZXZlbnRUeXBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCS8vJE5PTi1OTFMtMyQJCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIG1vZGlmeSBsaXN0ZW5lcnMgdGhhdCB0aGUgcmljaCB0ZXh0IGVkaXRvciBjb250ZW50IGhhcwotCSAqIGNoYW5nZWQuCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5TW9kaWZ5TGlzdGVuZXJzKCkgewotCQlub3RpZnlpbmdNb2RpZnlMaXN0ZW5lcnMgPSB0cnVlOwotCi0JCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCWV2ZW50LmRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJZXZlbnQud2lkZ2V0ID0gZWRpdG9yOwotCi0JCWZvciAoSXRlcmF0b3IgaSA9IG1vZGlmeUxpc3RlbmVycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyID0gKE1vZGlmeUxpc3RlbmVyKSBpLm5leHQoKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJIm5vdGlmeU1vZGlmeUxpc3RlbmVycyIsICJub3RpZnlpbmcgbGlzdGVuZXIsICIgKyBsaXN0ZW5lcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkKLQkJCX0KLQkJCWxpc3RlbmVyLm1vZGlmeVRleHQobmV3IE1vZGlmeUV2ZW50KGV2ZW50KSk7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCSJub3RpZnlNb2RpZnlMaXN0ZW5lcnMiLCAibm90aWZpZWQgbGlzdGVuZXIsICIgKyBsaXN0ZW5lcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkKLQkJCX0KLQkJfQotCi0JCW5vdGlmeWluZ01vZGlmeUxpc3RlbmVycyA9IGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dCNjaGVja01vZGlmeSgpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tNb2RpZnkoKSB7Ci0JCWlmIChtb2RpZmllZCkgewotCQkJbm90aWZ5TW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIWdldFRleHQoKS5lcXVhbHMoaW5pdGlhbFRleHQpKSB7Ci0JCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCW5vdGlmeU1vZGlmeUxpc3RlbmVycygpOwotCQkJfQotCQl9Ci0JCWlmIChkZWJ1ZykgewotCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImNoZWNrTW9kaWZ5IiwgIm1vZGlmaWVkPSIgKyBtb2RpZmllZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgcHJvdmlkZXMgYW4gb3Bwb3J0dW5pdHkgZm9yIGEgc3ViIGNsYXNzIHRvIHRpZHkgdXAgdGhlIHJpY2ggdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgcmljaCB0ZXh0IGVuY29kZWQgaW4gSFRNTCBmb3JtYXQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRpZHlUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEZvcm1hdHMgdGhlIHRleHQgZm9yIGNvbnN1bXB0aW9uIGJ5IHRoZSBKYXZhU2NyaXB0L0RIVE1MIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgcmljaCB0ZXh0IGVuY29kZWQgaW4gSFRNTCBmb3JtYXQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCB0ZXh0U2l6ZSA9IHRleHQubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dFNpemU7IGkrKykgewotCQkJY2hhciBjaCA9IHRleHQuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnXHInOgotCQkJCWJyZWFrOwotCQkJY2FzZSAnXHQnOgotCQkJCXJlc3VsdC5hcHBlbmQoJyAnKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xuJzoKLQkJCQlyZXN1bHQuYXBwZW5kKEVOQ09ERURfTkVXTElORSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcJyc6Ci0JCQkJcmVzdWx0LmFwcGVuZChFTkNPREVEX1NJTkdMRV9RVU9URSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcXCc6Ci0JCQkJcmVzdWx0LmFwcGVuZCgiXFxcXCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJlc3VsdC5hcHBlbmQoY2gpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGlsZCA8Y29kZT5PbGVDb250cm9sU2l0ZTwvY29kZT4gY29udGFpbmVkIHdpdGhpbiB0aGUKLQkgKiBnaXZlbiA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBvYmplY3QsIHByZXN1bWFibHkgYQotCSAqICAgICAgICAgICAgPGNvZGU+QnJvd3NlcjwvY29kZT4KLQkgKiBAcmV0dXJuIGFuIDxjb2RlPk9sZUNvbnRyb2xTaXRlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBnZXRDb250cm9sU2l0ZShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWlmIChQbGF0Zm9ybS5nZXRPUygpLmVxdWFscygid2luMzIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlDb250cm9sW10gY29udHJvbHMgPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgY29udHJvbENsYXNzID0gY29udHJvbHNbaV0uZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQkJaWYgKGNvbnRyb2xDbGFzcy5lcXVhbHMoIm9yZy5lY2xpcHNlLnN3dC5icm93c2VyLldlYlNpdGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBjb250cm9sc1tpXTsKLQkJCQl9IGVsc2UgaWYgKGNvbnRyb2xzW2ldIGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7Ci0JCQkJCXJldHVybiBnZXRDb250cm9sU2l0ZSgoQ29tcG9zaXRlKSBjb250cm9sc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBkZWJ1ZyBtZXNzYWdlIHRvIHRoZSBjb25zb2xlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50RGVidWdNZXNzYWdlKFN0cmluZyBtZXRob2QsIFN0cmluZyBtc2csIFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXN0ckJ1Zi5hcHBlbmQoIlJpY2hUZXh0WyIpLmFwcGVuZChlZGl0b3IuaGFuZGxlKS5hcHBlbmQoJ10nKSAvLyROT04tTkxTLTEkCi0JCQkJLmFwcGVuZCgnLicpLmFwcGVuZChtZXRob2QpOwotCQlpZiAobXNnICE9IG51bGwgJiYgbXNnLmxlbmd0aCgpID4gMCkgewotCQkJc3RyQnVmLmFwcGVuZCgiOiAiKS5hcHBlbmQobXNnKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCXN0ckJ1Zi5hcHBlbmQoJ1xuJykuYXBwZW5kKHRleHQpOwotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihzdHJCdWYpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBkZWJ1ZyBtZXNzYWdlIHRvIHRoZSBjb25zb2xlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50RGVidWdNZXNzYWdlKFN0cmluZyBtZXRob2QsIFN0cmluZyBtc2cpIHsKLQkJcHJpbnREZWJ1Z01lc3NhZ2UobWV0aG9kLCBtc2csIG51bGwpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBkZWJ1ZyBtZXNzYWdlIHRvIHRoZSBjb25zb2xlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50RGVidWdNZXNzYWdlKFN0cmluZyBtZXRob2QpIHsKLQkJcHJpbnREZWJ1Z01lc3NhZ2UobWV0aG9kLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgRmluZFJlcGxhY2VBY3Rpb24gZ2V0RmluZFJlcGxhY2VBY3Rpb24oKSB7Ci0JCXJldHVybiBmaW5kUmVwbGFjZUFjdGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RmluZFJlcGxhY2VBY3Rpb24oRmluZFJlcGxhY2VBY3Rpb24gZmluZFJlcGxhY2VBY3Rpb24pIHsKLQkJaWYgKGZpbmRSZXBsYWNlQWN0aW9uICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLmZpbmRSZXBsYWNlQWN0aW9uICE9IG51bGwgJiYgdGhpcy5maW5kUmVwbGFjZUFjdGlvbiAhPSBmaW5kUmVwbGFjZUFjdGlvbikgewotCQkJCXRoaXMuZmluZFJlcGxhY2VBY3Rpb24uZGlzcG9zZSgpOwotCQkJfQotCQkJdGhpcy5maW5kUmVwbGFjZUFjdGlvbiA9IGZpbmRSZXBsYWNlQWN0aW9uOwotCQkJdGhpcy5maW5kUmVwbGFjZUFjdGlvbi5zZXRSaWNoVGV4dCh0aGlzKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsVGV4dChTdHJpbmcgdGV4dCkgewotCQlpbml0aWFsVGV4dCA9IHRleHQgPT0gbnVsbCA/ICIiIDogdGV4dDsKLQkJbW9kaWZpZWQgPSBmYWxzZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzY5ZjdmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBlZGl0aW5nIGNvbW1hbmRzIHN1cHBvcnRlZCBieSB0aGUgZGVmYXVsdCByaWNoIHRleHQgY29udHJvbCBhbmQKLSAqIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dENvbW1hbmQgewotCi0JLyoqCi0JICogQWRkcyBhIEhUTUwgZnJhZ21lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0hUTUwgPSAiYWRkSFRNTCI7IC8vJE5PTi1OTFMtMSQJCi0KLQkvKioKLQkgKiBBZGRzIGFuIGltYWdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9JTUFHRSA9ICJhZGRJbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFkZHMgYSBob3Jpem9udGFsIGxpbmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0xJTkUgPSAiYWRkTGluZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFkZHMgYSBsaW5rLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9MSU5LID0gImFkZExpbmsiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbnNlcnRzIHRleHQgb3ZlciB0aGUgY3VycmVudCBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TRVJUX1RFWFQgPSAiaW5zZXJ0VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFkZHMgYW4gb3JkZXJlZCBsaXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9PUkRFUkVEX0xJU1QgPSAiYWRkT3JkZXJlZExpc3QiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBZGRzIGEgdGFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX1RBQkxFID0gImFkZFRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQWRkcyBhbiB1bm9yZGVyZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfVU5PUkRFUkVEX0xJU1QgPSAiYWRkVW5vcmRlcmVkTGlzdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS0dST1VORF9DT0xPUiA9ICJiYWNrQ29sb3IiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUb2dnbGVzIHRoZSAnYm9sZCcgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPTEQgPSAiYm9sZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENsZWFycyB0aGUgcmljaCB0ZXh0IGNvbnRlbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVJfQ09OVEVOVCA9ICJjbGVhckNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIHNlbGVjdGVkIHRleHQgdG8gdGhlIGNsaXBib2FyZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1BZID0gImNvcHkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDdXRzIHRoZSBzZWxlY3RlZCB0ZXh0IHRvIHRoZSBjbGlwYm9hcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VUID0gImN1dCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFID0gImRlbGV0ZVRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBGaW5kcyB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTkRfVEVYVCA9ICJmaW5kVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEdldHMgdGhlIEhUTUwgc291cmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVF9URVhUID0gImdldFRleHQiOyAvLyROT04tTkxTLTEkCQotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9yZWdyb3VuZCBjb2xvciBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JHUk9VTkRfQ09MT1IgPSAiZm9yZUNvbG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRm9ybWF0cyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfQkxPQ0sgPSAiZm9ybWF0QmxvY2siOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVF9TRUxFQ1RFRF9URVhUID0gImdldFNlbGVjdGVkVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGVudHMgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERU5UID0gImluZGVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRvZ2dsZXMgdGhlICdpdGFsaWMnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVEFMSUMgPSAiaXRhbGljIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ2VudGVyIGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKVVNUSUZZX0NFTlRFUiA9ICJqdXN0aWZ5Q2VudGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRnVsbHkganVzdGlmaWVzIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpVU1RJRllfRlVMTCA9ICJqdXN0aWZ5RnVsbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIExlZnQganVzdGlmaWVzIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpVU1RJRllfTEVGVCA9ICJqdXN0aWZ5TGVmdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJpZ2h0IGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKVVNUSUZZX1JJR0hUID0gImp1c3RpZnlSaWdodCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE91dGRlbnRzIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVERFTlQgPSAib3V0ZGVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBhc3RlcyB0ZXh0IGZyb20gdGhlIGNsaXBib2FyZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNURSA9ICJwYXN0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJlcGxhY2VzIGFsbCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0VfQUxMX1RFWFQgPSAicmVwbGFjZUFsbFRleHQiOyAvLyROT04tTkxTLTEkCQkKLQotCS8qKgotCSAqIFJlcGxhY2VzIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0VfVEVYVCA9ICJyZXBsYWNlVGV4dCI7IC8vJE5PTi1OTFMtMSQJCQotCi0JLyoqCi0JICogUmVkb2VzIHRoZSBwcmV2aW91cyBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRE8gPSAicmVkbyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGN1cnJlbnQgZm9ybWF0dGluZyBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkVfRk9STUFUID0gInJlbW92ZUZvcm1hdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNhdmVzIHRoZSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFID0gInNhdmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTYXZlcyBhbGwgZWRpdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfQUxMID0gInNhdmVBbGwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZWxlY3RzIGFsbCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9BTEwgPSAic2VsZWN0QWxsIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9udCBuYW1lIGZvciB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfRk9OVF9OQU1FID0gInNldEZvbnROYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9udCBzaXplIGZvciB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfRk9OVF9TSVpFID0gInNldEZvbnRTaXplIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9udCBzdHlsZSBmb3IgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0ZPTlRfU1RZTEUgPSAic2V0Rm9udFN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2V0cyB3aGV0aGVyIHRoZSBjb250ZW50IGNhbiBiZSBlZGl0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0VESVRBQkxFID0gInNldEVkaXRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2V0cyBmb2N1cyB0byB0aGlzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0ZPQ1VTID0gInNldEZvY3VzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2V0cyB0aGUgaGVpZ2h0IG9mIHRoaXMgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfSEVJR0hUID0gInNldEhlaWdodCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldHMgdGhlIEhUTUwgc291cmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9URVhUID0gInNldFRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUb2dnbGVzIHRoZSAnc3RyaWtlLXRocm91Z2gnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJS0VfVEhST1VHSCA9ICJzdHJpa2VUaHJvdWdoIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgc3Vic2NyaXB0IGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJTQ1JJUFQgPSAic3Vic2NyaXB0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgc3VwZXJzY3JpcHQgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUEVSU0NSSVBUID0gInN1cGVyc2NyaXB0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgdW5kZXJsaW5lIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRFUkxJTkUgPSAidW5kZXJsaW5lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVW5kb2VzIHRoZSBwcmV2aW91cyBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVORE8gPSAidW5kbyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnZlcnRzIGEgbGluayB0byBub3JtYWwgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkxJTksgPSAidW5saW5rIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0RWRpdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4OGM5MzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuUGFyYW1ldGVyaXplZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklPcGVyYXRpb25IaXN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLk9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkNvcHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQ3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkZpbmRSZXBsYWNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlBhc3RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlBhc3RlUGxhaW5UZXh0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlTZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLktleVN0cm9rZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLlNXVEtleVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXJFeHRlbnNpb242OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVVuZG9NYW5hZ2VyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRWaWV3ZXJVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlZlcmlmeUtleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVmlld0Zvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuSFRNTFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklLZXlCaW5kaW5nU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmtleXMuSUJpbmRpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm9wZXJhdGlvbnMuT3BlcmF0aW9uSGlzdG9yeUFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkub3BlcmF0aW9ucy5SZWRvQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5vcGVyYXRpb25zLlVuZG9BY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSUFic3RyYWN0VGV4dEVkaXRvckhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVJlYWRPbmx5RGVwZW5kZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHM7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgcmljaCB0ZXh0IGVkaXRvciBpbXBsZW1lbnRhdGlvbi4KLSAqIDxwPgotICogVGhlIGRlZmF1bHQgcmljaCB0ZXh0IGVkaXRvciB1c2VzIFhIVE1MIGFzIHRoZSB1bmRlcmx5aW5nIG1hcmt1cCBsYW5ndWFnZSBmb3IKLSAqIHRoZSByaWNoIHRleHQgY29udGVudC4gSXQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgYSA8Y29kZT5WaWV3Rm9ybTwvY29kZT4KLSAqIGNvbnRyb2wgd2l0aCBhIHRvb2wgYmFyIGF0IHRoZSB0b3AsIGEgdGFiIGZvbGRlciB0aGF0IGNvbnRhaW5zIGEKLSAqIDxjb2RlPlJpY2hUZXh0PC9jb2RlPiBjb250cm9sIGZvciBlbnRlcmluZyB0aGUgcmljaCB0ZXh0IGNvbnRlbnQsIGFuZCBhIHRhYgotICogZm9sZXIgdGhhdCBjb250YWlucyBhIDxjb2RlPlN0eWxlVGV4dDwvY29kZT4gY29udHJvbCBmb3Igdmlld2luZyBhbmQKLSAqIG1vZGlmeWluZyB0aGUgWEhUTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJpY2ggdGV4dCBjb250ZW50LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRFZGl0b3IgaW1wbGVtZW50cyBJUmljaFRleHRFZGl0b3IgewotCi0JLy8gVGhlIEhUTUwgdGFiIG5hbWUuCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9UQUJfTkFNRSA9IFJpY2hUZXh0UmVzb3VyY2VzLmh0bWxUYWJfdGV4dDsKLQotCS8vIElmIHRydWUsIGxvZyBkZWJ1Z2dpbmcgaW5mby4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1ZzsKLQotCS8vIFRoZSBwbHVnLWluIGxvZ2dlci4KLQlwcm90ZWN0ZWQgTG9nZ2VyIGxvZ2dlcjsKLQotCS8vIFRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGxpbmtzICg8aHJlZj4sIDxpbWc+LCBldGMuKS4KLQlwcm90ZWN0ZWQgU3RyaW5nIGJhc2VQYXRoOwotCi0JLy8gVGhlIGVkaXRvciBmb3JtLgotCXByb3RlY3RlZCBWaWV3Rm9ybSBmb3JtOwotCi0JLy8gVGhlIGVkaXRvciB0b29sIGJhci4KLQlwcm90ZWN0ZWQgSVJpY2hUZXh0VG9vbEJhciB0b29sQmFyOwotCi0JLy8gVGhlIGVkaXRvciBjb250ZW50LgotCXByb3RlY3RlZCBDb21wb3NpdGUgY29udGVudDsKLQotCS8vIFRoZSBlZGl0b3IgdGFiIGZvbGRlci4KLQlwcm90ZWN0ZWQgQ1RhYkZvbGRlciB0YWJGb2xkZXI7Ci0KLQkvLyBUaGUgcmljaCB0ZXh0IHRhYgotCXByb3RlY3RlZCBDVGFiSXRlbSByaWNoVGV4dFRhYjsKLQotCS8vIFRoZSBIVE1MIHNvdXJjZSB0YWIKLQlwcm90ZWN0ZWQgQ1RhYkl0ZW0gaHRtbFRhYjsKLQotCS8vIFRoZSBlbWJlZGRlZCByaWNoIHRleHQgY29udHJvbC4KLQlwcm90ZWN0ZWQgSVJpY2hUZXh0IHJpY2hUZXh0OwotCi0JLy8gVGhlIHVuZGVybHlpbmcgSFRNTCB0ZXh0IGVkaXRvci4KLQlwcm90ZWN0ZWQgVGV4dFZpZXdlciBzb3VyY2VWaWV3ZXI7Ci0JCi0JLy8gRHJvcCBzdXBwb3J0Ci0JRHJvcFRhcmdldCBzb3VyY2VFZGl0RHJvcFRhcmdldDsKLQotCS8vIEhUTUwgZWRpdG9yJ3MgY29udGV4dCBtZW51Ci0JcHJvdGVjdGVkIE1lbnUgY29udGV4dE1lbnU7Ci0KLQkvLyBIYXMgdGhlIEhUTUwgc291cmNlIGJlZW4gbW9kaWZpZWQ/Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc291cmNlTW9kaWZpZWQgPSBmYWxzZTsKLQotCS8vIFRoZSBlZGl0b3IncyBlZGl0YWJsZSBmbGFnLgotCXByb3RlY3RlZCBib29sZWFuIGVkaXRhYmxlID0gdHJ1ZTsKLQkKLQlwcml2YXRlIE9wZXJhdGlvbkhpc3RvcnlBY3Rpb25IYW5kbGVyIHVuZG9BY3Rpb247Ci0JCi0JcHJpdmF0ZSBPcGVyYXRpb25IaXN0b3J5QWN0aW9uSGFuZGxlciByZWRvQWN0aW9uOwotCQotCXByaXZhdGUgSUVkaXRvclNpdGUgZWRpdG9yU2l0ZTsKLQotCS8qKiBUaGUgYWN0aW9ucyByZWdpc3RlcmVkIHdpdGggdGhlIGVkaXRvci4gKi8KLQlwcml2YXRlIE1hcCBmQWN0aW9ucz0gbmV3IEhhc2hNYXAoMTApOwotCQotCS8qKiBUaGUgdmVyaWZ5IGtleSBsaXN0ZW5lciBmb3IgYWN0aXZhdGlvbiBjb2RlIHRyaWdnZXJpbmcuICovCi0JcHJpdmF0ZSBBY3RpdmF0aW9uQ29kZVRyaWdnZXIgZkFjdGl2YXRpb25Db2RlVHJpZ2dlcj0gbmV3IEFjdGl2YXRpb25Db2RlVHJpZ2dlcigpOwotCQotCS8qKiBUaGUgZWRpdG9yJ3MgYWN0aW9uIGFjdGl2YXRpb24gY29kZXMuICovCi0JcHJpdmF0ZSBMaXN0IGZBY3RpdmF0aW9uQ29kZXM9IG5ldyBBcnJheUxpc3QoMik7Ci0JCi0JZmluYWwgSVVuZG9NYW5hZ2VyIHVuZG9NYW5hZ2VyPSBuZXcgVGV4dFZpZXdlclVuZG9NYW5hZ2VyKDEwKTsKLQkKLQkvKioKLQkgKiBUaGUga2V5IGJpbmRpbmcgc2NvcGVzIG9mIHRoaXMgZWRpdG9yLgotCSAqIEBzaW5jZSAyLjEKLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGZLZXlCaW5kaW5nU2NvcGVzOwotCi0JCi0JLy8gVGhlIG1vZGlmeSBsaXN0ZW5lciBmb3IgdGhlIHNvdXJjZUVkaXQgY29udHJvbC4KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgc291cmNlRWRpdE1vZGlmeUxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCXNvdXJjZU1vZGlmaWVkID0gdHJ1ZTsKLQkJCWlmIChyaWNoVGV4dCAhPSBudWxsICYmIHJpY2hUZXh0IGluc3RhbmNlb2YgUmljaFRleHQpIHsKLQkJCQlyaWNoVGV4dC5ub3RpZnlNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCX0KLQkJfQotCX07Ci0JCi0JcHJvdGVjdGVkIElEb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyPSBuZXcgSURvY3VtZW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCXNvdXJjZU1vZGlmaWVkID0gdHJ1ZTsKLQkJCWlmIChyaWNoVGV4dCAhPSBudWxsICYmIHJpY2hUZXh0IGluc3RhbmNlb2YgUmljaFRleHQpIHsKLQkJCQlyaWNoVGV4dC5ub3RpZnlNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCX0KLQkJfQotCX07Ci0KLQotCS8vIFRoZSBkZWFjdGl2YXRlIGxpc3RlbmVyIGZvciB0aGUgc291cmNlRWRpdCBjb250cm9sLgotCXByb3RlY3RlZCBMaXN0ZW5lciBzb3VyY2VFZGl0RGVhY3RpdmF0ZUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaWYgKHNvdXJjZU1vZGlmaWVkKSB7Ci0JCQkJdXBkYXRlUmljaFRleHQoc291cmNlVmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXRUZXh0KCkpOwotCQkJCXNldE1vZGlmaWVkKHRydWUpOwotCQkJCXNvdXJjZU1vZGlmaWVkID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLy8gVGhlIGtleSBsaXN0ZW5lciBmb3IgdGhlIHNvdXJjZUVkaXQgY29udHJvbC4KLQlwcm90ZWN0ZWQgS2V5TGlzdGVuZXIgc291cmNlRWRpdEtleUxpc3RlbmVyID0gbmV3IEtleUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBZGFwdGVyKAotCQkJCQlJQmluZGluZ1NlcnZpY2UuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyIGluc3RhbmNlb2YgSUJpbmRpbmdTZXJ2aWNlKSB7Ci0JCQkJaW50IGFjY2VsID0gU1dUS2V5U3VwcG9ydAotCQkJCQkJLmNvbnZlcnRFdmVudFRvVW5tb2RpZmllZEFjY2VsZXJhdG9yKGUpOwotCQkJCUtleVN0cm9rZSBzdHJva2UgPSBTV1RLZXlTdXBwb3J0Ci0JCQkJCQkuY29udmVydEFjY2VsZXJhdG9yVG9LZXlTdHJva2UoYWNjZWwpOwotCQkJCUtleVNlcXVlbmNlIHNlcSA9IEtleVNlcXVlbmNlLmdldEluc3RhbmNlKHN0cm9rZSk7Ci0JCQkJQmluZGluZyBiaW5kID0gKChJQmluZGluZ1NlcnZpY2UpIGFkYXB0ZXIpLmdldFBlcmZlY3RNYXRjaChzZXEpOwotCQkJCWlmIChiaW5kICE9IG51bGwpIHsKLQkJCQkJUGFyYW1ldGVyaXplZENvbW1hbmQgY29tbWFuZCA9IGJpbmQKLQkJCQkJCQkuZ2V0UGFyYW1ldGVyaXplZENvbW1hbmQoKTsKLQkJCQkJaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGNtZElkID0gY29tbWFuZC5nZXRJZCgpOwotCQkJCQkJaWYgKGNtZElkICE9IG51bGwKLQkJCQkJCQkJJiYgY21kSWQKLQkJCQkJCQkJCQkuZXF1YWxzKCJvcmcuZWNsaXBzZS51aS5lZGl0LmZpbmRSZXBsYWNlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXJpY2hUZXh0LmdldEZpbmRSZXBsYWNlQWN0aW9uKCkuZXhlY3V0ZShSaWNoVGV4dEVkaXRvci50aGlzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgZWRpdG9yIHN0eWxlCi0JICovCi0JcHVibGljIFJpY2hUZXh0RWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgSUVkaXRvclNpdGUgZWRpdG9yU2l0ZSkgewotCQl0aGlzKHBhcmVudCwgc3R5bGUsIGVkaXRvclNpdGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBlZGl0b3Igc3R5bGUKLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGxpbmtzCi0JICovCi0JcHVibGljIFJpY2hUZXh0RWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgSUVkaXRvclNpdGUgZWRpdG9yU2l0ZSwgU3RyaW5nIGJhc2VQYXRoKSB7Ci0JCXRoaXMuYmFzZVBhdGggPSBiYXNlUGF0aDsKLQkJdGhpcy5lZGl0b3JTaXRlID0gZWRpdG9yU2l0ZTsKLQkJZGVidWcgPSBSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQkJbG9nZ2VyID0gUmljaFRleHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpOwotCQlpbml0KHBhcmVudCwgc3R5bGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgZWRpdG9yIHN0eWxlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJdHJ5IHsKLQkJCWZvcm0gPSBuZXcgVmlld0Zvcm0ocGFyZW50LCBzdHlsZSk7Ci0JCQlmb3JtLm1hcmdpbkhlaWdodCA9IDA7Ci0JCQlmb3JtLm1hcmdpbldpZHRoID0gMDsKLQotCQkJdG9vbEJhciA9IG5ldyBSaWNoVGV4dFRvb2xCYXIoZm9ybSwgU1dULkZMQVQsIHRoaXMpOwotCi0JCQljb250ZW50ID0gbmV3IENvbXBvc2l0ZShmb3JtLCBTV1QuRkxBVCk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQljb250ZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCQl0YWJGb2xkZXIgPSBjcmVhdGVFZGl0b3JUYWJGb2xkZXIoY29udGVudCwgc3R5bGUpOwotCi0JCQlmb3JtLnNldFRvcExlZnQoKENvbnRyb2wpIHRvb2xCYXIpOwotCQkJZm9ybS5zZXRDb250ZW50KGNvbnRlbnQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZm9ybSBjb250cm9sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvcm0gY29udHJvbAotCSAqLwotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBmb3JtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJpY2ggdGV4dCBjb250cm9sIGVtYmVkZGVkIHdpdGhpbiB0aGlzIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgSVJpY2hUZXh0IGdldFJpY2hUZXh0Q29udHJvbCgpIHsKLQkJcmV0dXJuIHJpY2hUZXh0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxheW91dCBkYXRhLgotCSAqIAotCSAqIEBwYXJhbSBsYXlvdXREYXRhCi0JICogICAgICAgICAgICB0aGUgbGF5b3V0IGRhdGEgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGF5b3V0RGF0YShPYmplY3QgbGF5b3V0RGF0YSkgewotCQlpZiAoZm9ybSAhPSBudWxsKSB7Ci0JCQlmb3JtLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXlvdXQgZGF0YS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlZGl0b3IncyBsYXlvdXQgZGF0YQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TGF5b3V0RGF0YSgpIHsKLQkJaWYgKGZvcm0gIT0gbnVsbCkgewotCQkJcmV0dXJuIGZvcm0uZ2V0TGF5b3V0RGF0YSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldHMgZm9jdXMgdG8gdGhpcyBlZGl0b3IuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRGb2N1cygpOwotCQl9Ci0JCXNldFNlbGVjdGlvbigwKTsKLQl9Ci0KLQkvKioKLQkgKiBUZWxscyB0aGUgY29udHJvbCBpdCBkb2VzIG5vdCBoYXZlIGZvY3VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJsdXIoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRCbHVyKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBlZGl0b3IgaGFzIGZvY3VzLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBlZGl0b3IgaGFzIHRoZSB1c2VyLWludGVyZmFjZSBmb2N1cwotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJpY2hUZXh0Lmhhc0ZvY3VzKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdHMgdGhlIFJpY2ggVGV4dCBvciBIVE1MIHRhYi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIDxjb2RlPjA8L2NvZGU+IGZvciB0aGUgUmljaCBUZXh0IHRhYiwgPGNvZGU+MTwvY29kZT4gZm9yCi0JICogICAgICAgICAgICB0aGUgSFRNTCB0YWIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKGludCBpbmRleCkgewotCQlpZiAodGFiRm9sZGVyICE9IG51bGwpIHsKLQkJCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyB0ZXh0IGFuZCBpbWFnZSBsaW5rcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGxpbmtzIHNwZWNpZmllZCB3aXRoIDxocmVmPiwKLQkgKiAgICAgICAgIDxpbWc+LCBldGMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYXNlUGF0aCgpIHsKLQkJcmV0dXJuIGJhc2VQYXRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJhc2UgVVJMIG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aG9zZSBjb250ZW50IHdhcyBsYXN0Ci0JICogY29waWVkIHRvIHRoZSBjbGlwYm9hcmQuCi0JICogCi0JICogQHJldHVybiB0aGUgYmFzZSBVUkwgb2YgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBVUkwgZ2V0Q29weVVSTCgpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJldHVybiByaWNoVGV4dC5nZXRDb3B5VVJMKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFzZSBVUkwgb2YgdGhlIHJpY2ggdGV4dCBjb250cm9sIHdob3NlIGNvbnRlbnQgd2FzIGxhc3QgY29waWVkCi0JICogdG8gdGhlIGNsaXBib2FyZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3B5VVJMKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0Q29weVVSTCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdGFibGUgc3RhdGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29udGVudCBjYW4gYmUgZWRpdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RWRpdGFibGUoKSB7Ci0JCXJldHVybiBlZGl0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBlZGl0YWJsZSBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdGFibGUKLQkgKiAgICAgICAgICAgIHRoZSBlZGl0YWJsZSBzdGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJdGhpcy5lZGl0YWJsZSA9IGVkaXRhYmxlOwotCQlpZiAodG9vbEJhciAhPSBudWxsICYmIHRhYkZvbGRlciAhPSBudWxsKSB7Ci0JCQlpZiAodGFiRm9sZGVyLmdldFNlbGVjdGlvbigpID09IHJpY2hUZXh0VGFiKSB7Ci0JCQkJdG9vbEJhci51cGRhdGVUb29sQmFyKGVkaXRhYmxlKTsKLQkJCX0KLQkJfQotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJc291cmNlVmlld2VyLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBjb250ZW50IGhhcyBiZWVuIG1vZGlmaWVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRlbnQgaGFzIGJlZW4gbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRNb2RpZmllZCgpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJldHVybiByaWNoVGV4dC5nZXRNb2RpZmllZCgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2RpZmllZCBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kaWZpZWQKLQkgKiAgICAgICAgICAgIHRoZSBtb2RpZmllZCBzdGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVkKGJvb2xlYW4gbW9kaWZpZWQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldE1vZGlmaWVkKG1vZGlmaWVkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJpY2ggdGV4dCBjb250ZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJpY2ggdGV4dCBjb250ZW50IGZvcm1hdHRlZCBpbiBYSFRNTAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJaWYgKHNvdXJjZU1vZGlmaWVkKSB7Ci0JCQlzZXRUZXh0KGdldFNvdXJjZUVkaXQoKS5nZXRUZXh0KCkpOwotCQkJc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQlzb3VyY2VNb2RpZmllZCA9IGZhbHNlOwotCQl9Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmljaFRleHQuZ2V0VGV4dCgpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJpY2ggdGV4dCBjb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgcmljaCB0ZXh0IGNvbnRlbnQgaW4gWEhUTUwgZm9ybWF0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCQlzb3VyY2VNb2RpZmllZCA9IGZhbHNlOwotCQlpZiAodGFiRm9sZGVyICE9IG51bGwpIHsKLQkJCWlmICh0b29sQmFyICE9IG51bGwpIHsKLQkJCQl0b29sQmFyLnVwZGF0ZVRvb2xCYXIoZWRpdGFibGUpOwotCQkJfQotCQkJaWYgKGdldFNvdXJjZUVkaXQoKSAhPSBudWxsKSB7Ci0JCQkJZ2V0U291cmNlRWRpdCgpLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHNvdXJjZUVkaXRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJc2V0RG9jdW1lbnQobmV3IERvY3VtZW50KHRleHQpKTsKLQkJCQlnZXRTb3VyY2VFZGl0KCkuYWRkTW9kaWZ5TGlzdGVuZXIoc291cmNlRWRpdE1vZGlmeUxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dCNjaGVja01vZGlmeSgpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tNb2RpZnkoKSB7Ci0JCXJpY2hUZXh0LmNoZWNrTW9kaWZ5KCk7Ci0JCWlmIChzb3VyY2VNb2RpZmllZCkgewotCQkJbm90aWZ5TW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCX0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlwcmludERlYnVnTWVzc2FnZSgiY2hlY2tNb2RpZnkiLCAibW9kaWZpZWQ9IiArIHNvdXJjZU1vZGlmaWVkKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVzdG9yZXMgdGhlIHJpY2ggdGV4dCBjb250ZW50IGJhY2sgdG8gdGhlIGluaXRpYWwgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgcmVzdG9yZVRleHQoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5yZXN0b3JlVGV4dCgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0I2dldFNlbGVjdGVkKCkKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRTZWxlY3Rpb24gZ2V0U2VsZWN0ZWQoKSB7Ci0JCWlmICh0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkgPT0gaHRtbFRhYikgewotCQkJU3RyaW5nIEhUTUxzb3VyY2UgPSBnZXRTb3VyY2VFZGl0KCkuZ2V0VGV4dCgpOwotCQkJUG9pbnQgc2VsID0gc291cmNlVmlld2VyLmdldFNlbGVjdGVkUmFuZ2UoKTsKLQkJCWludCBzZWxTdGFydEluZGV4ID0gc2VsLng7Ci0JCQlpbnQgc2VsRW5kSW5kZXggPSBzZWwueCArIHNlbC55IC0gMTsKLQkJCXJpY2hUZXh0LmdldFNlbGVjdGVkKCkuY2xlYXIoKTsKLQkJCXJpY2hUZXh0LmdldFNlbGVjdGVkKCkuc2V0VGV4dChIVE1Mc291cmNlLnN1YnN0cmluZyhzZWxTdGFydEluZGV4LCBzZWxFbmRJbmRleCArIDEpKTsKLQkJfQotCQlyZXR1cm4gcmljaFRleHQuZ2V0U2VsZWN0ZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFwcGxpY2F0aW9uIHNwZWNpZmljIHByb3BlcnR5IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBoYXMgbm90Ci0JICogICAgICAgICBiZWVuIHNldAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGF0YShTdHJpbmcga2V5KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5nZXREYXRhKGtleSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhbiBhcHBsaWNhdGlvbiBzcGVjaWZpYyBwcm9wZXJ0eSBuYW1lIGFuZCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGEoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXREYXRhKGtleSwgdmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIHJpY2ggdGV4dCBjb21tYW5kLiBUaGUgc3VwcG9ydGVkIGNvbW1hbmQgc3RyaW5ncyBhcmUKLQkgKiBkZWZpbmVkIGluIDxjb2RlPlJpY2hUZXh0Q29tbWFuZDxjb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0JY29tbWFuZAkJYSByaWNoIHRleHQgY29tbWFuZCBzdHJpbmcKLQkgKiBAcmV0dXJuCWEgc3RhdHVzIGNvZGUgcmV0dXJuZWQgYnkgdGhlIGV4ZWN1dGVkIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgaW50IGV4ZWN1dGVDb21tYW5kKFN0cmluZyBjb21tYW5kKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIHJpY2ggdGV4dCBjb21tYW5kIHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyLiBUaGUKLQkgKiBzdXBwb3J0ZWQgY29tbWFuZCBzdHJpbmdzIGFyZSBkZWZpbmVkIGluIDxjb2RlPlJpY2hUZXh0Q29tbWFuZDxjb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0JY29tbWFuZAkJYSByaWNoIHRleHQgY29tbWFuZCBzdHJpbmcKLQkgKiBAcGFyYW0JcGFyYW0JCWEgcGFyYW1ldGVyIGZvciB0aGUgY29tbWFuZCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4JYSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgZXhlY3V0ZWQgY29tbWFuZAotCSAqLwotCXB1YmxpYyBpbnQgZXhlY3V0ZUNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIFN0cmluZyBwYXJhbSkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKGNvbW1hbmQsIHBhcmFtKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gcmljaCB0ZXh0IGNvbW1hbmQgd2l0aCBhbiBhcnJheSBvZiBwYXJhbWV0ZXJzLiBUaGUKLQkgKiBzdXBwb3J0ZWQgY29tbWFuZCBzdHJpbmdzIGFyZSBkZWZpbmVkIGluIDxjb2RlPlJpY2hUZXh0Q29tbWFuZDxjb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0JY29tbWFuZAkJYSByaWNoIHRleHQgY29tbWFuZCBzdHJpbmcKLQkgKiBAcGFyYW0JcGFyYW1zCQlhbiBhcnJheSBvZiBwYXJhbWV0ZXJzIGZvciB0aGUgY29tbWFuZCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4JYSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgZXhlY3V0ZWQgY29tbWFuZAotCSAqLwotCXB1YmxpYyBpbnQgZXhlY3V0ZUNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIFN0cmluZ1tdIHBhcmFtcykgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKGNvbW1hbmQsIHBhcmFtcyk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgdGhlIG9wZXJhdGluZyBzeXN0ZW0gcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoY29udGV4dE1lbnUgIT0gbnVsbCAmJiAhY29udGV4dE1lbnUuaXNEaXNwb3NlZCgpKSB7Ci0JCQljb250ZXh0TWVudS5kaXNwb3NlKCk7Ci0JCQljb250ZXh0TWVudSA9IG51bGw7Ci0JCX0KLQkJaWYgKHNvdXJjZUVkaXREcm9wVGFyZ2V0ICE9IG51bGwpIHsKLQkJCXNvdXJjZUVkaXREcm9wVGFyZ2V0LmRpc3Bvc2UoKTsKLQkJCXNvdXJjZUVkaXREcm9wVGFyZ2V0ID0gbnVsbDsKLQkJfQotCQlpZiAoZ2V0U291cmNlRWRpdCgpICE9IG51bGwpIHsKLQkJCWdldFNvdXJjZUVkaXQoKS5yZW1vdmVNb2RpZnlMaXN0ZW5lcihzb3VyY2VFZGl0TW9kaWZ5TGlzdGVuZXIpOwotCQkJZ2V0U291cmNlRWRpdCgpLnJlbW92ZUxpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCQlzb3VyY2VFZGl0RGVhY3RpdmF0ZUxpc3RlbmVyKTsKLQkJCWdldFNvdXJjZUVkaXQoKS5yZW1vdmVLZXlMaXN0ZW5lcihzb3VyY2VFZGl0S2V5TGlzdGVuZXIpOwotCQkJc291cmNlRWRpdE1vZGlmeUxpc3RlbmVyID0gbnVsbDsKLQkJCXNvdXJjZUVkaXREZWFjdGl2YXRlTGlzdGVuZXIgPSBudWxsOwotCQkJc291cmNlRWRpdEtleUxpc3RlbmVyID0gbnVsbDsKLQkJfQotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZGlzcG9zZSgpOwotCQkJcmljaFRleHQgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBjb250cm9sIGhhcyBiZWVuIGRpc3Bvc2VkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjb250cm9sIGlzIGRpc3Bvc2VkIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmljaFRleHQuaXNEaXNwb3NlZCgpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGlmeSBsaXN0ZW5lcnMgYXR0YWNoZWQgdG8gdGhpcyBlZGl0b3IuCi0JICogCi0JICogQHJldHVybiBhbiBpdGVyYXRvciBmb3IgcmV0cmlldmluZyB0aGUgbW9kaWZ5IGxpc3RlbmVycwotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRNb2RpZnlMaXN0ZW5lcnMoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5nZXRNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4KLQkgKiBrZXlzIGFyZSBwcmVzc2VkIGFuZCByZWxlYXNlZCB3aXRoaW4gdGhpcyBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkS2V5TGlzdGVuZXIoS2V5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmFkZEtleUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4ga2V5cyBhcmUgcHJlc3NlZCBhbmQgcmVsZWFzZWQgd2l0aGluIHRoaXMgZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVLZXlMaXN0ZW5lcihLZXlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQucmVtb3ZlS2V5TGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZCB3aGVuCi0JICogdGhlIGNvbnRlbnQgb2YgdGhpcyBlZGl0b3IgaXMgbW9kaWZpZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4gdGhlIGNvbnRlbnQgb2YgdGhpcyBlZGl0b3IgaXMgbW9kaWZpZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZlZCB3aGVuCi0JICogdGhpcyBlZGl0b3IgaXMgZGlzcG9zZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuYWRkRGlzcG9zZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4gdGhpcyBlZGl0b3IgaXMgZGlzcG9zZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnJlbW92ZURpc3Bvc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4KLQkgKiBoZWxwIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGZvciB0aGlzIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRIZWxwTGlzdGVuZXIoSGVscExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5hZGRIZWxwTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkCi0JICogd2hlbiBoZWxwIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGZvciB0aGlzIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlSGVscExpc3RlbmVyKEhlbHBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQucmVtb3ZlSGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmVkIHdoZW4KLQkgKiBhbiBldmVudCBvZiB0aGUgZ2l2ZW4gdHlwZSBvY2N1cnMgd2l0aGluIHRoaXMgZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBldmVudFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGV2ZW50IHRvIGxpc3RlbiBmb3IKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQgd2hlbiB0aGUgZXZlbnQgb2NjdXJzCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoaW50IGV2ZW50VHlwZSwgTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmFkZExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZlZAotCSAqIHdoZW4gYW4gZXZlbnQgb2YgdGhlIGdpdmVuIHR5cGUgb2NjdXJzIHdpdGhpbiB0aGlzIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZCB3aGVuIHRoZSBldmVudAotCSAqICAgICAgICAgICAgb2NjdXJzCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoaW50IGV2ZW50VHlwZSwgTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnJlbW92ZUxpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMgZWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gYW4gaXRlcmF0b3IgZm9yIHJldHJpZXZpbmcgdGhlIGV2ZW50IGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGlzCi0JICogICAgICAgICBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0TGlzdGVuZXJzKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJpY2hUZXh0LmdldExpc3RlbmVycygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBtb2RpZnkgbGlzdGVuZXJzIHRoYXQgdGhlIHJpY2ggdGV4dCBlZGl0b3IgY29udGVudCBoYXMKLQkgKiBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeU1vZGlmeUxpc3RlbmVycygpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCQlldmVudC5kaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCQlldmVudC53aWRnZXQgPSByaWNoVGV4dC5nZXRDb250cm9sKCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaSA9IGdldE1vZGlmeUxpc3RlbmVycygpOyBpICE9IG51bGwgJiYgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIgPSAoTW9kaWZ5TGlzdGVuZXIpIGkubmV4dCgpOwotCQkJCWxpc3RlbmVyLm1vZGlmeVRleHQobmV3IE1vZGlmeUV2ZW50KGV2ZW50KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaWxscyB0aGUgdG9vbCBiYXIgd2l0aCBhY3Rpb24gaXRlbXMuCi0JICogCi0JICogQHBhcmFtIHRvb2xCYXIKLQkgKiAgICAgICAgICAgIGEgdG9vbCBiYXIgY29udGFpbiByaWNoIHRleHQgYWN0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxUb29sQmFyKElSaWNoVGV4dFRvb2xCYXIgdG9vbEJhcikgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHVuZGVybHlpbmcgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBzdHlsZSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBsaW5rcwotCSAqLwotCXByb3RlY3RlZCBJUmljaFRleHQgY3JlYXRlUmljaFRleHRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwKLQkJCVN0cmluZyBiYXNlUGF0aCkgewotCQlyZXR1cm4gbmV3IFJpY2hUZXh0KHBhcmVudCwgc3R5bGUsIGJhc2VQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBlZGl0b3IgdGFiIGZvbGRlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBzdHlsZSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgbmV3IGVkaXRvciB0b29sYmFyCi0JICovCi0JcHJvdGVjdGVkIENUYWJGb2xkZXIgY3JlYXRlRWRpdG9yVGFiRm9sZGVyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlDVGFiRm9sZGVyIGZvbGRlciA9IG5ldyBDVGFiRm9sZGVyKHBhcmVudCwgU1dULkZMQVQgfCBTV1QuQk9UVE9NKTsKLQkJZm9sZGVyLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCB0cnVlKSk7Ci0JCWZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlDb21wb3NpdGUgcmljaFRleHRDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGZvbGRlciwgU1dULkZMQVQpOwotCQlHcmlkTGF5b3V0IHJpY2hUZXh0Q29tcG9zaXRlTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlyaWNoVGV4dENvbXBvc2l0ZUxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlyaWNoVGV4dENvbXBvc2l0ZUxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXJpY2hUZXh0Q29tcG9zaXRlLnNldExheW91dChyaWNoVGV4dENvbXBvc2l0ZUxheW91dCk7Ci0JCXJpY2hUZXh0Q29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCXJpY2hUZXh0ID0gY3JlYXRlUmljaFRleHRDb250cm9sKHJpY2hUZXh0Q29tcG9zaXRlLCBzdHlsZSwgYmFzZVBhdGgpOwotCQlyaWNoVGV4dC5zZXREYXRhKFBST1BFUlRZX05BTUUsIHRoaXMpOwotCQlyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpLnNldFJpY2hUZXh0KHRoaXMpOwotCi0JCXJpY2hUZXh0VGFiID0gbmV3IENUYWJJdGVtKGZvbGRlciwgU1dULkZMQVQpOwotCQlyaWNoVGV4dFRhYi5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnJpY2hUZXh0VGFiX3RleHQpOwotCQlyaWNoVGV4dFRhYi5zZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5yaWNoVGV4dFRhYl90b29sVGlwVGV4dCk7Ci0JCXJpY2hUZXh0VGFiLnNldENvbnRyb2wocmljaFRleHRDb21wb3NpdGUpOwotCi0JCUNvbXBvc2l0ZSBodG1sQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShmb2xkZXIsIFNXVC5GTEFUKTsKLQkJaHRtbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0KLQkJc291cmNlVmlld2VyID0gbmV3IFRleHRWaWV3ZXIoaHRtbENvbXBvc2l0ZSwgU1dULkZMQVQgfCBTV1QuTVVMVEkKLQkJCQl8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMKTsKLQkJc291cmNlVmlld2VyLnNldFVuZG9NYW5hZ2VyKHVuZG9NYW5hZ2VyKTsKLQkJc2V0RG9jdW1lbnQobnVsbCk7Ci0JCWdldFNvdXJjZUVkaXQoKS5hZGRNb2RpZnlMaXN0ZW5lcihzb3VyY2VFZGl0TW9kaWZ5TGlzdGVuZXIpOwotCQlnZXRTb3VyY2VFZGl0KCkuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIHNvdXJjZUVkaXREZWFjdGl2YXRlTGlzdGVuZXIpOwotCQlnZXRTb3VyY2VFZGl0KCkuYWRkS2V5TGlzdGVuZXIoc291cmNlRWRpdEtleUxpc3RlbmVyKTsKLQkJY29udGV4dE1lbnUgPSBuZXcgTWVudShwYXJlbnQuZ2V0U2hlbGwoKSwgU1dULlBPUF9VUCk7Ci0JCWdldFNvdXJjZUVkaXQoKS5zZXRNZW51KGNvbnRleHRNZW51KTsKLQkJYWRkRHJvcFN1cHBvcnRUb1N0eWxlZFRleHQoKTsKLQkJZmlsbENvbnRleHRNZW51KGNvbnRleHRNZW51KTsKLQkJCi0JCQotCQlodG1sVGFiID0gbmV3IENUYWJJdGVtKGZvbGRlciwgU1dULk5PTkUpOwotCQlodG1sVGFiLnNldFRleHQoSFRNTF9UQUJfTkFNRSk7Ci0JCWh0bWxUYWIuc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuaHRtbFRhYl90b29sVGlwVGV4dCk7IAotCQlodG1sVGFiLnNldENvbnRyb2woaHRtbENvbXBvc2l0ZSk7Ci0KLQkJZm9sZGVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDVGFiSXRlbSBpdGVtID0gKENUYWJJdGVtKSBldmVudC5pdGVtOwotCQkJCWlmIChpdGVtLmdldFRleHQoKS5lcXVhbHMoSFRNTF9UQUJfTkFNRSkpIHsKLQkJCQkJZ2V0U291cmNlRWRpdCgpLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHNvdXJjZUVkaXRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCXNldERvY3VtZW50KG5ldyBEb2N1bWVudChnZXRUZXh0KCkpKTsKLQkJCQkJc291cmNlTW9kaWZpZWQgPSBmYWxzZTsKLQkJCQkJZ2V0U291cmNlRWRpdCgpLmFkZE1vZGlmeUxpc3RlbmVyKHNvdXJjZUVkaXRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCWlmICh0b29sQmFyICE9IG51bGwpIHsKLQkJCQkJCXRvb2xCYXIudXBkYXRlVG9vbEJhcihlZGl0YWJsZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl1cGRhdGVSaWNoVGV4dChnZXRTb3VyY2VFZGl0KCkuZ2V0VGV4dCgpKTsKLQkJCQkJc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQkJCWlmICh0b29sQmFyICE9IG51bGwpIHsKLQkJCQkJCXRvb2xCYXIudXBkYXRlVG9vbEJhcihlZGl0YWJsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlmaWxsVG9vbEJhcih0b29sQmFyKTsKLQkJCi0JCWluaXRpYWxpemVBY3RpdmF0aW9uQ29kZVRyaWdnZXIoKTsKLQkJY3JlYXRlVW5kb1JlZG9BY3Rpb25zKCk7Ci0JCQotCQlmb2xkZXIuc2V0U2VsZWN0aW9uKDApOwotCi0JCXJldHVybiBmb2xkZXI7Ci0JfQotCi0JCi0JcHJpdmF0ZSB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2MpIHsKLQkJaWYgKGRvYyA9PSBudWxsKSB7Ci0JCQlkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLQkJfQotCQkvLyBjbGVhbiB1cCBvbGQgZG9jCi0JCXVuZG9NYW5hZ2VyLmRpc2Nvbm5lY3QoKTsKLQkJSURvY3VtZW50IG9sZERvYyA9IHNvdXJjZVZpZXdlci5nZXREb2N1bWVudCgpOwotCQlpZiAob2xkRG9jICE9IG51bGwpIHsKLQkJCW9sZERvYy5yZW1vdmVEb2N1bWVudExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCi0JCS8vIGhvb2sgdXAgbmV3IGRvYwotCQlzb3VyY2VWaWV3ZXIuc2V0RG9jdW1lbnQoZG9jKTsKLQkJZG9jLmFkZERvY3VtZW50TGlzdGVuZXIobGlzdGVuZXIpOwotCQl1bmRvTWFuYWdlci5jb25uZWN0KHNvdXJjZVZpZXdlcik7Ci0JCWlmICh1bmRvQWN0aW9uICE9IG51bGwpIHsKLQkJCXVuZG9BY3Rpb24uc2V0Q29udGV4dChnZXRVbmRvQ29udGV4dCgpKTsKLQkJfQotCQlpZiAocmVkb0FjdGlvbiAhPSBudWxsKSB7Ci0JCQlyZWRvQWN0aW9uLnNldENvbnRleHQoZ2V0VW5kb0NvbnRleHQoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSFRNTCBzb3VyY2UgZWRpdCBjb250cm9sLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5TdHlsZVRleHQ8L2NvZGU+IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgU3R5bGVkVGV4dCBnZXRTb3VyY2VFZGl0KCkgewotCQlpZiAoc291cmNlVmlld2VyICE9IG51bGwpIHsKLQkJCXJldHVybiBzb3VyY2VWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEluc2VydHMgdGV4dCBhdCB0aGUgc2VsZWN0aW9uIChvdmVyd3JpdGluZyB0aGUgc2VsZWN0aW9uKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRIVE1MKFN0cmluZyB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSAKLQkJCXJldHVybjsKLQkJaWYgKHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSA9PSByaWNoVGV4dFRhYikgewotCQkJZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9IVE1MLCB0ZXh0KTsKLQkJfSBlbHNlIGlmICh0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkgPT0gaHRtbFRhYikgewotCQkJU3RyaW5nIG9sZEhUTUwgPSBnZXRTb3VyY2VFZGl0KCkuZ2V0VGV4dCgpOwotCQkJUG9pbnQgc2VsID0gc291cmNlVmlld2VyLmdldFNlbGVjdGVkUmFuZ2UoKTsKLQkJCWludCBzZWxTdGFydEluZGV4ID0gc2VsLng7Ci0JCQlpbnQgc2VsRW5kSW5kZXggPSBzZWwueCArIHNlbC55IC0gMTsKLQkJCVN0cmluZyBuZXdIVE1MID0gb2xkSFRNTC5zdWJzdHJpbmcoMCwgc2VsU3RhcnRJbmRleCkgKyB0ZXh0Ci0JCQkJCSsgb2xkSFRNTC5zdWJzdHJpbmcoc2VsRW5kSW5kZXggKyAxKTsKLQkJCWdldFNvdXJjZUVkaXQoKS5yZW1vdmVNb2RpZnlMaXN0ZW5lcihzb3VyY2VFZGl0TW9kaWZ5TGlzdGVuZXIpOwotCQkJZ2V0U291cmNlRWRpdCgpLnNldFRleHQobmV3SFRNTCk7Ci0JCQlnZXRTb3VyY2VFZGl0KCkuYWRkTW9kaWZ5TGlzdGVuZXIoc291cmNlRWRpdE1vZGlmeUxpc3RlbmVyKTsKLQkJCXVwZGF0ZVJpY2hUZXh0KG5ld0hUTUwpOwotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogSW5zZXJ0cyBhbiBpbWFnZSBhdCB0aGUgc2VsZWN0aW9uIChvdmVyd3JpdGluZyB0aGUgc2VsZWN0aW9uKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRJbWFnZShTdHJpbmcgaW1hZ2VVUkwsIFN0cmluZyBoZWlnaHQsIFN0cmluZyB3aWR0aCwgU3RyaW5nIGFsdFRhZykgewotCQlpZiAodGFiRm9sZGVyLmdldFNlbGVjdGlvbigpID09IHJpY2hUZXh0VGFiKSB7Ci0JCQlleGVjdXRlQ29tbWFuZCgKLQkJCQkJUmljaFRleHRDb21tYW5kLkFERF9JTUFHRSwKLQkJCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJCQlpbWFnZVVSTCwKLQkJCQkJCQloZWlnaHQsIHdpZHRoLCBhbHRUYWcgfSk7Ci0JCX0gZWxzZSBpZiAodGFiRm9sZGVyLmdldFNlbGVjdGlvbigpID09IGh0bWxUYWIpIHsKLQkJCVN0cmluZ0J1ZmZlciBpbWFnZUxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkvLyBvcmRlciBvZiB0aGVzZSBhdHRyaWJ1dGVzIGlzIHRoZSBzYW1lIGFzIEpUaWR5J2VkIEhUTUwKLQkJCWltYWdlTGluay5hcHBlbmQoIjxpbWciKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGhlaWdodC5sZW5ndGgoKSA+IDApIHsKLQkJCQlpbWFnZUxpbmsuYXBwZW5kKCIgaGVpZ2h0PVwiIiArIGhlaWdodCArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWlmIChhbHRUYWcubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJaW1hZ2VMaW5rLmFwcGVuZCgiIGFsdD1cIiIgKyBhbHRUYWcgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlpbWFnZUxpbmsuYXBwZW5kKCIgc3JjPVwiIiArIGltYWdlVVJMICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaWYgKHdpZHRoLmxlbmd0aCgpID4gMCkgewotCQkJCWltYWdlTGluay5hcHBlbmQoIiB3aWR0aD1cIiIgKyB3aWR0aCArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWltYWdlTGluay5hcHBlbmQoIiAvPiIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgb2xkSFRNTCA9IGdldFNvdXJjZUVkaXQoKS5nZXRUZXh0KCk7Ci0JCQlQb2ludCBzZWwgPSBzb3VyY2VWaWV3ZXIuZ2V0U2VsZWN0ZWRSYW5nZSgpOwotCQkJaW50IHNlbFN0YXJ0SW5kZXggPSBzZWwueDsKLQkJCWludCBzZWxFbmRJbmRleCA9IHNlbC54ICsgc2VsLnkgLSAxOwotCQkJU3RyaW5nIG5ld0hUTUwgPSBvbGRIVE1MLnN1YnN0cmluZygwLCBzZWxTdGFydEluZGV4KSArIGltYWdlTGluay50b1N0cmluZygpCi0JCQkJCSsgb2xkSFRNTC5zdWJzdHJpbmcoc2VsRW5kSW5kZXggKyAxKTsKLQkJCWdldFNvdXJjZUVkaXQoKS5yZW1vdmVNb2RpZnlMaXN0ZW5lcihzb3VyY2VFZGl0TW9kaWZ5TGlzdGVuZXIpOwotCQkJZ2V0U291cmNlRWRpdCgpLnNldFRleHQobmV3SFRNTCk7Ci0JCQlnZXRTb3VyY2VFZGl0KCkuYWRkTW9kaWZ5TGlzdGVuZXIoc291cmNlRWRpdE1vZGlmeUxpc3RlbmVyKTsKLQkJCXVwZGF0ZVJpY2hUZXh0KG5ld0hUTUwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIEhUTUwgdGFiIGlzIHNlbGVjdGVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEhUTUwgdGFiIGlzIHNlbGVjdGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSFRNTFRhYlNlbGVjdGVkKCkgewotCQlyZXR1cm4gKHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSA9PSBodG1sVGFiKTsKLQl9Ci0KLQkvKioKLQkgKiBGaWxscyB0aGUgY29udGV4dCBtZW51IHdpdGggbWVudSBpdGVtcy4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dE1lbnUKLQkgKiAgICAgICAgICAgIGEgY29udGV4dCBtZW51IGNvbnRhaW5pbmcgcmljaCB0ZXh0IGFjdGlvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoTWVudSBjb250ZXh0TWVudSkgewotCQlmaW5hbCBNZW51SXRlbSBjdXRJdGVtID0gbmV3IE1lbnVJdGVtKGNvbnRleHRNZW51LCBTV1QuUFVTSCk7Ci0JCWN1dEl0ZW0uc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5jdXRBY3Rpb25fdGV4dCk7Ci0JCWN1dEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUN1dEFjdGlvbiBhY3Rpb24gPSBuZXcgQ3V0QWN0aW9uKCk7Ci0JCQkJYWN0aW9uLmV4ZWN1dGUoUmljaFRleHRFZGl0b3IudGhpcyk7Ci0JCQl9Ci0JCX0pOwotCQlmaW5hbCBNZW51SXRlbSBjb3B5SXRlbSA9IG5ldyBNZW51SXRlbShjb250ZXh0TWVudSwgU1dULlBVU0gpOwotCQljb3B5SXRlbS5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmNvcHlBY3Rpb25fdGV4dCk7IAotCQljb3B5SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29weUFjdGlvbiBhY3Rpb24gPSBuZXcgQ29weUFjdGlvbigpOwotCQkJCWFjdGlvbi5leGVjdXRlKFJpY2hUZXh0RWRpdG9yLnRoaXMpOwotCQkJfQotCQl9KTsKLQkJZmluYWwgTWVudUl0ZW0gcGFzdGVJdGVtID0gbmV3IE1lbnVJdGVtKGNvbnRleHRNZW51LCBTV1QuUFVTSCk7Ci0JCXBhc3RlSXRlbS5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnBhc3RlQWN0aW9uX3RleHQpOyAKLQkJcGFzdGVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlQYXN0ZUFjdGlvbiBhY3Rpb24gPSBuZXcgUGFzdGVBY3Rpb24oKTsKLQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dEVkaXRvci50aGlzKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlmaW5hbCBNZW51SXRlbSBwYXN0ZVBsYWluVGV4dEl0ZW0gPSBuZXcgTWVudUl0ZW0oY29udGV4dE1lbnUsIFNXVC5QVVNIKTsKLQkJcGFzdGVQbGFpblRleHRJdGVtLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMucGFzdGVQbGFpblRleHRBY3Rpb25fdGV4dCk7Ci0JCXBhc3RlUGxhaW5UZXh0SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUGFzdGVQbGFpblRleHRBY3Rpb24gYWN0aW9uID0gbmV3IFBhc3RlUGxhaW5UZXh0QWN0aW9uKCk7Ci0JCQkJYWN0aW9uLmV4ZWN1dGUoUmljaFRleHRFZGl0b3IudGhpcyk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudUhpZGRlbihNZW51RXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgc2VsZWN0ZWRUZXh0ID0gZ2V0U2VsZWN0ZWQoKS5nZXRUZXh0KCk7Ci0JCQkJYm9vbGVhbiBzZWxlY3Rpb24gPSBzZWxlY3RlZFRleHQubGVuZ3RoKCkgPiAwOwotCQkJCWN1dEl0ZW0uc2V0RW5hYmxlZChlZGl0YWJsZSAmJiBzZWxlY3Rpb24pOwotCQkJCWNvcHlJdGVtLnNldEVuYWJsZWQoc2VsZWN0aW9uKTsKLQkJCQlwYXN0ZUl0ZW0uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQkJcGFzdGVQbGFpblRleHRJdGVtLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBjb250ZW50IG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aXRob3V0IHVwZGF0aW5nIHRoZSBIVE1MCi0JICogc291cmNlIGVkaXRvci4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBIVE1MIHNvdXJjZSBlZGl0b3IgdG8gc3luYyB1cCBpdHMKLQkgKiBjb250ZW50IHdpdGggdGhlIHJpY2ggdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgcmljaCB0ZXh0IGNvbnRlbnQgaW4gWEhUTUwgZm9ybWF0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVJpY2hUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRUZXh0KHRleHQpOwotCQkJcmljaFRleHQuY2hlY2tNb2RpZnkoKTsKLQkJfQotCQlzb3VyY2VNb2RpZmllZCA9IGZhbHNlOwotCQlpZiAodGFiRm9sZGVyICE9IG51bGwpIHsKLQkJCWlmICh0b29sQmFyICE9IG51bGwpIHsKLQkJCQl0b29sQmFyLnVwZGF0ZVRvb2xCYXIoZWRpdGFibGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGREcm9wU3VwcG9ydFRvU3R5bGVkVGV4dCgpIHsKLQkJLy8gdGhpcyBmdW5jdGlvbiBiYXNlZCBoZWF2aWx5IG9uIHRoZSBleGFtcGxlIGF0OgotCQkvLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FydGljbGVzL0FydGljbGUtU1dULURORC9ETkQtaW4tU1dULmh0bWwKLQkJCi0JCSAJLy8gQWxsb3cgZGF0YSB0byBiZSBjb3BpZWQgdG8gdGhlIGRyb3AgdGFyZ2V0Ci0JCQlpbnQgb3BlcmF0aW9ucyA9IERORC5EUk9QX01PVkUgfCAgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0RFRkFVTFQ7Ci0JCQlzb3VyY2VFZGl0RHJvcFRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KGdldFNvdXJjZUVkaXQoKSwgb3BlcmF0aW9ucyk7Ci0JCSAKLQkJCS8vIFJlY2VpdmUgZGF0YSBpbiBUZXh0IG9yIEhUTUwgZm9ybWF0Ci0JCQlmaW5hbCBUZXh0VHJhbnNmZXIgdGV4dFRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCQlmaW5hbCBIVE1MVHJhbnNmZXIgaHRtbFRyYW5zZmVyID0gSFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCQlUcmFuc2ZlcltdIHR5cGVzID0gbmV3IFRyYW5zZmVyW10ge2h0bWxUcmFuc2ZlciwgdGV4dFRyYW5zZmVyfTsKLQkJCXNvdXJjZUVkaXREcm9wVGFyZ2V0LnNldFRyYW5zZmVyKHR5cGVzKTsKLQkJCSAKLQkJCXNvdXJjZUVkaXREcm9wVGFyZ2V0LmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldExpc3RlbmVyKCkgewotCQkJICBwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkgICAgIGlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgewotCQkJICAgICAgICAgaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfQ09QWSkgIT0gMCkgewotCQkJICAgICAgICAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQkgICAgICAgICB9IGVsc2UgewotCQkJICAgICAgICAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQkgICAgICAgICB9Ci0JCQkgICAgIH0KLQkJCSAgICAgaWYgKCFnZXRFZGl0YWJsZSgpKSB7Ci0JCSAgICAgICAgICAgICBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJICAgICB9Ci0JCQkgICAgIC8vIHdpbGwgYWNjZXB0IHRleHQgYnV0IHByZWZlciB0byBoYXZlIEhUTUwgZHJvcHBlZAotCQkJICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50LmRhdGFUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJICAgICAgICAgaWYgKGh0bWxUcmFuc2Zlci5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGVzW2ldKSl7Ci0JCQkgICAgICAgICAgICAgZXZlbnQuY3VycmVudERhdGFUeXBlID0gZXZlbnQuZGF0YVR5cGVzW2ldOwotCQkJICAgICAgICAgICAgIGJyZWFrOwotCQkJICAgICAgICAgfQotCQkJICAgICB9Ci0JCQkgICB9Ci0JCQkgICBwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCSAgICAgICAgZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfU0VMRUNUIHwgRE5ELkZFRURCQUNLX0lOU0VSVF9BRlRFUiB8IERORC5GRUVEQkFDS19TQ1JPTEw7Ci0JCQkgICAgfQotCQkJICAgIHB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJICAgICAgICBpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIHsKLQkJCSAgICAgICAgICAgIGlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX0NPUFkpICE9IDApIHsKLQkJCSAgICAgICAgICAgICAgICBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQkJICAgICAgICAgICAgfSBlbHNlIHsKLQkJCSAgICAgICAgICAgICAgICBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJICAgICAgICAgICAgfQotCQkJICAgICAgICB9Ci0JCQkgICAgfQotCQkJICAgIHB1YmxpYyB2b2lkIGRyYWdMZWF2ZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCSAgICB9Ci0JCQkgICAgcHVibGljIHZvaWQgZHJvcEFjY2VwdChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCSAgICB9Ci0JCQkgICAgcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCSAgICAgICAgaWYgKHRleHRUcmFuc2Zlci5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKSB8fCAKLQkJCSAgICAgICAgCQlodG1sVHJhbnNmZXIuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmN1cnJlbnREYXRhVHlwZSkpIHsKLQkJCSAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gKFN0cmluZylldmVudC5kYXRhOwotCQkJICAgICAgICAgICAgYWRkSFRNTCh0ZXh0KTsKLQkJCSAgICAgICAgfQotCQkJICAgIH0KLQkJCX0pOwotCX0KLQkKLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZGVidWcgbWVzc2FnZSB0byB0aGUgY29uc29sZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJpbnREZWJ1Z01lc3NhZ2UoU3RyaW5nIG1ldGhvZCwgU3RyaW5nIG1zZywgU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc3RyQnVmLmFwcGVuZCgiUmljaFRleHRFZGl0b3JbIikuYXBwZW5kKHJpY2hUZXh0LmdldENvbnRyb2woKS5oYW5kbGUpLmFwcGVuZCgnXScpIC8vJE5PTi1OTFMtMSQKLQkJCQkuYXBwZW5kKCcuJykuYXBwZW5kKG1ldGhvZCk7Ci0JCWlmIChtc2cgIT0gbnVsbCAmJiBtc2cubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzdHJCdWYuYXBwZW5kKCI6ICIpLmFwcGVuZChtc2cpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJc3RyQnVmLmFwcGVuZCgnXG4nKS5hcHBlbmQodGV4dCk7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKHN0ckJ1Zik7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIGRlYnVnIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByaW50RGVidWdNZXNzYWdlKFN0cmluZyBtZXRob2QsIFN0cmluZyBtc2cpIHsKLQkJcHJpbnREZWJ1Z01lc3NhZ2UobWV0aG9kLCBtc2csIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgRmluZFJlcGxhY2VBY3Rpb24gZ2V0RmluZFJlcGxhY2VBY3Rpb24oKSB7Ci0JCXJldHVybiByaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbmRSZXBsYWNlQWN0aW9uKEZpbmRSZXBsYWNlQWN0aW9uIGZpbmRSZXBsYWNlQWN0aW9uKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRGaW5kUmVwbGFjZUFjdGlvbihmaW5kUmVwbGFjZUFjdGlvbik7Ci0JCQlyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpLnNldFJpY2hUZXh0KHRoaXMpOwotCi0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldEluaXRpYWxUZXh0KHRleHQpOwotCQl9Ci0JfQotCQotCQotCS8qKgotCSAqIGZyb20gb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3IjZ2V0VW5kb0NvbnRleHQoKQotCSAqIFJldHVybnMgdGhpcyBlZGl0b3IncyB2aWV3ZXIncyB1bmRvIG1hbmFnZXIgdW5kbyBjb250ZXh0LgotCSAqCi0JICogQHJldHVybiB0aGUgdW5kbyBjb250ZXh0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBhdmFpbGFibGUKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJpdmF0ZSBJVW5kb0NvbnRleHQgZ2V0VW5kb0NvbnRleHQoKSB7Ci0JCWlmIChzb3VyY2VWaWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjYpIHsKLQkJCUlVbmRvTWFuYWdlciB1bmRvTWFuYWdlcj0gKChJVGV4dFZpZXdlckV4dGVuc2lvbjYpc291cmNlVmlld2VyKS5nZXRVbmRvTWFuYWdlcigpOwotCQkJaWYgKHVuZG9NYW5hZ2VyIGluc3RhbmNlb2YgSVVuZG9NYW5hZ2VyRXh0ZW5zaW9uKQotCQkJCXJldHVybiAoKElVbmRvTWFuYWdlckV4dGVuc2lvbil1bmRvTWFuYWdlcikuZ2V0VW5kb0NvbnRleHQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIGZyb20gb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3IjY3JlYXRlVW5kb1JlZG9BY3Rpb25zKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVVbmRvUmVkb0FjdGlvbnMoKSB7Ci0JCUlVbmRvQ29udGV4dCB1bmRvQ29udGV4dD0gZ2V0VW5kb0NvbnRleHQoKTsKLQkJaWYgKHVuZG9Db250ZXh0ICE9IG51bGwpIHsKLQkJCS8vIFVzZSBhY3Rpb25zIHByb3ZpZGVkIGJ5IGdsb2JhbCB1bmRvL3JlZG8KLQkJCQotCQkJLy8gQ3JlYXRlIHRoZSB1bmRvIGFjdGlvbgotCQkJdW5kb0FjdGlvbj0gbmV3IFVuZG9BY3Rpb25IYW5kbGVyKGdldEVkaXRvclNpdGUoKSwgdW5kb0NvbnRleHQpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1bmRvQWN0aW9uLCBJQWJzdHJhY3RUZXh0RWRpdG9ySGVscENvbnRleHRJZHMuVU5ET19BQ1RJT04pOwotCQkJdW5kb0FjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHMuVU5ETyk7Ci0JCQlyZWdpc3RlclVuZG9SZWRvQWN0aW9uKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVORE8sIHVuZG9BY3Rpb24pOwotCi0JCQkvLyBDcmVhdGUgdGhlIHJlZG8gYWN0aW9uLgotCQkJcmVkb0FjdGlvbj0gbmV3IFJlZG9BY3Rpb25IYW5kbGVyKGdldEVkaXRvclNpdGUoKSwgdW5kb0NvbnRleHQpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyZWRvQWN0aW9uLCBJQWJzdHJhY3RUZXh0RWRpdG9ySGVscENvbnRleHRJZHMuUkVET19BQ1RJT04pOwotCQkJcmVkb0FjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHMuUkVETyk7Ci0JCQlyZWdpc3RlclVuZG9SZWRvQWN0aW9uKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJFRE8sIHJlZG9BY3Rpb24pOwotCi0JCQkvLyBJbnN0YWxsIG9wZXJhdGlvbiBhcHByb3ZlcnMKLQkJCUlPcGVyYXRpb25IaXN0b3J5IGhpc3Rvcnk9IE9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5LmdldE9wZXJhdGlvbkhpc3RvcnkoKTsKLQotLy8JCQkvLyBUaGUgZmlyc3QgYXBwcm92ZXIgd2lsbCBwcm9tcHQgd2hlbiBvcGVyYXRpb25zIGFmZmVjdGluZyBvdXRzaWRlIGVsZW1lbnRzIGFyZSB0byBiZSB1bmRvbmUgb3IgcmVkb25lLgotLy8JCQlpZiAoZk5vbkxvY2FsT3BlcmF0aW9uQXBwcm92ZXIgIT0gbnVsbCkKLS8vCQkJCWhpc3RvcnkucmVtb3ZlT3BlcmF0aW9uQXBwcm92ZXIoZk5vbkxvY2FsT3BlcmF0aW9uQXBwcm92ZXIpOwotLy8JCQlmTm9uTG9jYWxPcGVyYXRpb25BcHByb3Zlcj0gZ2V0VW5kb1JlZG9PcGVyYXRpb25BcHByb3Zlcih1bmRvQ29udGV4dCk7Ci0vLwkJCWhpc3RvcnkuYWRkT3BlcmF0aW9uQXBwcm92ZXIoZk5vbkxvY2FsT3BlcmF0aW9uQXBwcm92ZXIpOwotLy8KLS8vCQkJLy8gVGhlIHNlY29uZCBhcHByb3ZlciB3aWxsIHByb21wdCBmcm9tIHRoaXMgZWRpdG9yIHdoZW4gYW4gdW5kbyBpcyBhdHRlbXB0ZWQgb24gYW4gb3BlcmF0aW9uCi0vLwkJCS8vIGFuZCBpdCBpcyBub3QgdGhlIG1vc3QgcmVjZW50IG9wZXJhdGlvbiBpbiB0aGUgZWRpdG9yLgotLy8JCQlpZiAoZkxpbmVhclVuZG9WaW9sYXRpb25BcHByb3ZlciAhPSBudWxsKQotLy8JCQkJaGlzdG9yeS5yZW1vdmVPcGVyYXRpb25BcHByb3ZlcihmTGluZWFyVW5kb1Zpb2xhdGlvbkFwcHJvdmVyKTsKLS8vCQkJZkxpbmVhclVuZG9WaW9sYXRpb25BcHByb3Zlcj0gbmV3IExpbmVhclVuZG9WaW9sYXRpb25Vc2VyQXBwcm92ZXIodW5kb0NvbnRleHQsIHRoaXMpOwotLy8JCQloaXN0b3J5LmFkZE9wZXJhdGlvbkFwcHJvdmVyKGZMaW5lYXJVbmRvVmlvbGF0aW9uQXBwcm92ZXIpOwotCi0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJRWRpdG9yU2l0ZSBnZXRFZGl0b3JTaXRlKCkgewotCQlyZXR1cm4gZWRpdG9yU2l0ZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyB0aGUgZ2l2ZW4gdW5kby9yZWRvIGFjdGlvbiB1bmRlciB0aGUgZ2l2ZW4gSUQgYW5kCi0JICogZW5zdXJlcyB0aGF0IHByZXZpb3VzbHkgaW5zdGFsbGVkIGFjdGlvbnMgZ2V0IGRpc3Bvc2VkLiBJdAotCSAqIGFsc28gdGFrZXMgY2FyZSBvZiByZS1yZWdpc3RlcmluZyB0aGUgbmV3IGFjdGlvbiB3aXRoIHRoZQotCSAqIGdsb2JhbCBhY3Rpb24gaGFuZGxlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uSWQJdGhlIGFjdGlvbiBpZCB1bmRlciB3aGljaCB0byByZWdpc3RlciB0aGUgYWN0aW9uCi0JICogQHBhcmFtIGFjdGlvbgl0aGUgYWN0aW9uIHRvIHJlZ2lzdGVyCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByaXZhdGUgdm9pZCByZWdpc3RlclVuZG9SZWRvQWN0aW9uKFN0cmluZyBhY3Rpb25JZCwgT3BlcmF0aW9uSGlzdG9yeUFjdGlvbkhhbmRsZXIgYWN0aW9uKSB7Ci0JCUlBY3Rpb24gb2xkQWN0aW9uPSBnZXRBY3Rpb24oYWN0aW9uSWQpOwotCQlpZiAob2xkQWN0aW9uIGluc3RhbmNlb2YgT3BlcmF0aW9uSGlzdG9yeUFjdGlvbkhhbmRsZXIpCi0JCQkoKE9wZXJhdGlvbkhpc3RvcnlBY3Rpb25IYW5kbGVyKW9sZEFjdGlvbikuZGlzcG9zZSgpOwotCi0JCXNldEFjdGlvbihhY3Rpb25JZCwgYWN0aW9uKTsKLQkJCi0JCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnM9IGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCWlmIChhY3Rpb25CYXJzICE9IG51bGwpCi0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoYWN0aW9uSWQsIGFjdGlvbik7Ci0JfQotCi0JCi0JLyoKLQkgKiBAc2VlIElUZXh0RWRpdG9yI2dldEFjdGlvbihTdHJpbmcpCi0JICovCi0JcHVibGljIElBY3Rpb24gZ2V0QWN0aW9uKFN0cmluZyBhY3Rpb25JRCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGFjdGlvbklEKTsKLQkJSUFjdGlvbiBhY3Rpb249IChJQWN0aW9uKSBmQWN0aW9ucy5nZXQoYWN0aW9uSUQpOwotCi0vLwkJaWYgKGFjdGlvbiA9PSBudWxsKSB7Ci0vLwkJCWFjdGlvbj0gZmluZENvbnRyaWJ1dGVkQWN0aW9uKGFjdGlvbklEKTsKLS8vCQkJaWYgKGFjdGlvbiAhPSBudWxsKQotLy8JCQkJc2V0QWN0aW9uKGFjdGlvbklELCBhY3Rpb24pOwotLy8JCX0KLQotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCS8qCi0JICogQHNlZSBJVGV4dEVkaXRvciNzZXRBY3Rpb24oU3RyaW5nLCBJQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGlvbihTdHJpbmcgYWN0aW9uSUQsIElBY3Rpb24gYWN0aW9uKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoYWN0aW9uSUQpOwotCQlpZiAoYWN0aW9uID09IG51bGwpIHsKLQkJCWFjdGlvbj0gKElBY3Rpb24pIGZBY3Rpb25zLnJlbW92ZShhY3Rpb25JRCk7Ci0JCQlpZiAoYWN0aW9uICE9IG51bGwpCi0JCQkJZkFjdGl2YXRpb25Db2RlVHJpZ2dlci51bnJlZ2lzdGVyQWN0aW9uRnJvbUtleUFjdGl2YXRpb24oYWN0aW9uKTsKLQkJfSBlbHNlIHsKLQkJCWZBY3Rpb25zLnB1dChhY3Rpb25JRCwgYWN0aW9uKTsKLQkJCWZBY3RpdmF0aW9uQ29kZVRyaWdnZXIucmVnaXN0ZXJBY3Rpb25Gb3JLZXlBY3RpdmF0aW9uKGFjdGlvbik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFjdGl2YXRpb24gY29kZSB0cmlnZ2VyLgotCSAqCi0JICogQHNpbmNlIDIuMQotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQWN0aXZhdGlvbkNvZGVUcmlnZ2VyKCkgewotCQlmQWN0aXZhdGlvbkNvZGVUcmlnZ2VyLmluc3RhbGwoKTsKLQkJZkFjdGl2YXRpb25Db2RlVHJpZ2dlci5zZXRTY29wZXMoZktleUJpbmRpbmdTY29wZXMpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsIGtleSB2ZXJpZnkgbGlzdGVuZXIgZm9yIHRyaWdnZXJpbmcgYWN0aW9uIGFjdGl2YXRpb24gY29kZXMuCi0JICovCi0JY2xhc3MgQWN0aXZhdGlvbkNvZGVUcmlnZ2VyIGltcGxlbWVudHMgVmVyaWZ5S2V5TGlzdGVuZXIgewotCi0JCS8qKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHRyaWdnZXIgaGFzIGJlZW4gaW5zdGFsbGVkLiAqLwotCQlwcml2YXRlIGJvb2xlYW4gZklzSW5zdGFsbGVkPSBmYWxzZTsKLQkJLyoqCi0JCSAqIFRoZSBrZXkgYmluZGluZyBzZXJ2aWNlIHRvIHVzZS4KLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJcHJpdmF0ZSBJS2V5QmluZGluZ1NlcnZpY2UgZktleUJpbmRpbmdTZXJ2aWNlOwotCi0JCS8qCi0JCSAqIEBzZWUgVmVyaWZ5S2V5TGlzdGVuZXIjdmVyaWZ5S2V5KG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB2ZXJpZnlLZXkoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQotCQkJQWN0aW9uQWN0aXZhdGlvbkNvZGUgY29kZT0gbnVsbDsKLQkJCWludCBzaXplPSBmQWN0aXZhdGlvbkNvZGVzLnNpemUoKTsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQljb2RlPSAoQWN0aW9uQWN0aXZhdGlvbkNvZGUpIGZBY3RpdmF0aW9uQ29kZXMuZ2V0KGkpOwotCQkJCWlmIChjb2RlLm1hdGNoZXMoZXZlbnQpKSB7Ci0JCQkJCUlBY3Rpb24gYWN0aW9uPSBnZXRBY3Rpb24oY29kZS5mQWN0aW9uSWQpOwotCQkJCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQotCQkJCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIElVcGRhdGUpCi0JCQkJCQkJKChJVXBkYXRlKSBhY3Rpb24pLnVwZGF0ZSgpOwotCi0JCQkJCQlpZiAoIWFjdGlvbi5pc0VuYWJsZWQoKSAmJiBhY3Rpb24gaW5zdGFuY2VvZiBJUmVhZE9ubHlEZXBlbmRlbnQpIHsKLQkJCQkJCQlJUmVhZE9ubHlEZXBlbmRlbnQgZGVwZW5kZW50PSAoSVJlYWRPbmx5RGVwZW5kZW50KSBhY3Rpb247Ci0JCQkJCQkJYm9vbGVhbiB3cml0YWJsZT0gZGVwZW5kZW50LmlzRW5hYmxlZCh0cnVlKTsKLQkJCQkJCQlpZiAod3JpdGFibGUpIHsKLQkJCQkJCQkJZXZlbnQuZG9pdD0gZmFsc2U7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJCQkJCWV2ZW50LmRvaXQ9IGZhbHNlOwotCQkJCQkJCWFjdGlvbi5ydW4oKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogSW5zdGFsbHMgdGhpcyB0cmlnZ2VyIG9uIHRoZSBlZGl0b3IncyB0ZXh0IHdpZGdldC4KLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5zdGFsbCgpIHsKLQkJCWlmICghZklzSW5zdGFsbGVkKSB7Ci0KLQkJCQlpZiAoc291cmNlVmlld2VyIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb24pIHsKLQkJCQkJSVRleHRWaWV3ZXJFeHRlbnNpb24gZT0gKElUZXh0Vmlld2VyRXh0ZW5zaW9uKSBzb3VyY2VWaWV3ZXI7Ci0JCQkJCWUucHJlcGVuZFZlcmlmeUtleUxpc3RlbmVyKHRoaXMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0eWxlZFRleHQgdGV4dD0gc291cmNlVmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJCQkJdGV4dC5hZGRWZXJpZnlLZXlMaXN0ZW5lcih0aGlzKTsKLQkJCQl9Ci0KLQkJCQlmS2V5QmluZGluZ1NlcnZpY2U9IGdldEVkaXRvclNpdGUoKS5nZXRLZXlCaW5kaW5nU2VydmljZSgpOwotCQkJCWZJc0luc3RhbGxlZD0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBVbmluc3RhbGxzIHRoaXMgdHJpZ2dlciBmcm9tIHRoZSBlZGl0b3IncyB0ZXh0IHdpZGdldC4KLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgdW5pbnN0YWxsKCkgewotCQkJaWYgKGZJc0luc3RhbGxlZCkgewotCi0JCQkJaWYgKHNvdXJjZVZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uKSB7Ci0JCQkJCUlUZXh0Vmlld2VyRXh0ZW5zaW9uIGU9IChJVGV4dFZpZXdlckV4dGVuc2lvbikgc291cmNlVmlld2VyOwotCQkJCQllLnJlbW92ZVZlcmlmeUtleUxpc3RlbmVyKHRoaXMpOwotCQkJCX0gZWxzZSBpZiAoc291cmNlVmlld2VyICE9IG51bGwpIHsKLQkJCQkJU3R5bGVkVGV4dCB0ZXh0PSBzb3VyY2VWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQkJCQlpZiAodGV4dCAhPSBudWxsICYmICF0ZXh0LmlzRGlzcG9zZWQoKSkKLQkJCQkJCXRleHQucmVtb3ZlVmVyaWZ5S2V5TGlzdGVuZXIoZkFjdGl2YXRpb25Db2RlVHJpZ2dlcik7Ci0JCQkJfQotCi0JCQkJZklzSW5zdGFsbGVkPSBmYWxzZTsKLQkJCQlmS2V5QmluZGluZ1NlcnZpY2U9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUmVnaXN0ZXJzIHRoZSBnaXZlbiBhY3Rpb24gZm9yIGtleSBhY3RpdmF0aW9uLgotCQkgKiBAcGFyYW0gYWN0aW9uIHRoZSBhY3Rpb24gdG8gYmUgcmVnaXN0ZXJlZAotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWdpc3RlckFjdGlvbkZvcktleUFjdGl2YXRpb24oSUFjdGlvbiBhY3Rpb24pIHsKLQkJCWlmIChhY3Rpb24uZ2V0QWN0aW9uRGVmaW5pdGlvbklkKCkgIT0gbnVsbCkKLQkJCQlmS2V5QmluZGluZ1NlcnZpY2UucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgZ2l2ZW4gYWN0aW9uIGlzIG5vIGxvbmdlciBhdmFpbGFibGUgZm9yIGtleSBhY3RpdmF0aW9uCi0JCSAqIEBwYXJhbSBhY3Rpb24gdGhlIGFjdGlvbiB0byBiZSB1bnJlZ2lzdGVyZWQKLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgdW5yZWdpc3RlckFjdGlvbkZyb21LZXlBY3RpdmF0aW9uKElBY3Rpb24gYWN0aW9uKSB7Ci0JCQlpZiAoYWN0aW9uLmdldEFjdGlvbkRlZmluaXRpb25JZCgpICE9IG51bGwpCi0JCQkJZktleUJpbmRpbmdTZXJ2aWNlLnVucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJfQotCi0JCS8qKgotCQkgKiBTZXRzIHRoZSBrZXkgYmluZGluZyBzY29wZXMgZm9yIHRoaXMgZWRpdG9yLgotCQkgKiBAcGFyYW0ga2V5QmluZGluZ1Njb3BlcyB0aGUga2V5IGJpbmRpbmcgc2NvcGVzCi0JCSAqIEBzaW5jZSAyLjEKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFNjb3BlcyhTdHJpbmdbXSBrZXlCaW5kaW5nU2NvcGVzKSB7Ci0JCQlpZiAoa2V5QmluZGluZ1Njb3BlcyAhPSBudWxsICYmIGtleUJpbmRpbmdTY29wZXMubGVuZ3RoID4gMCkKLQkJCQlmS2V5QmluZGluZ1NlcnZpY2Uuc2V0U2NvcGVzKGtleUJpbmRpbmdTY29wZXMpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlcHJlc2VudGF0aW9uIG9mIGFjdGlvbiBhY3RpdmF0aW9uIGNvZGVzLgotCSAqLwotCXN0YXRpYyBjbGFzcyBBY3Rpb25BY3RpdmF0aW9uQ29kZSB7Ci0KLQkJLyoqIFRoZSBhY3Rpb24gaWQuICovCi0JCXB1YmxpYyBTdHJpbmcgZkFjdGlvbklkOwotCQkvKiogVGhlIGNoYXJhY3Rlci4gKi8KLQkJcHVibGljIGNoYXIgZkNoYXJhY3RlcjsKLQkJLyoqIFRoZSBrZXkgY29kZS4gKi8KLQkJcHVibGljIGludCBmS2V5Q29kZT0gLTE7Ci0JCS8qKiBUaGUgc3RhdGUgbWFzay4gKi8KLQkJcHVibGljIGludCBmU3RhdGVNYXNrPSBTV1QuREVGQVVMVDsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBhY3Rpb24gYWN0aXZhdGlvbiBjb2RlIGZvciB0aGUgZ2l2ZW4gYWN0aW9uIGlkLgotCQkgKiBAcGFyYW0gYWN0aW9uSWQgdGhlIGFjdGlvbiBpZAotCQkgKi8KLQkJcHVibGljIEFjdGlvbkFjdGl2YXRpb25Db2RlKFN0cmluZyBhY3Rpb25JZCkgewotCQkJZkFjdGlvbklkPSBhY3Rpb25JZDsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgYWN0aXZhdGlvbiBjb2RlIG1hdGNoZXMgdGhlIGdpdmVuIHZlcmlmeSBldmVudC4KLQkJICogQHBhcmFtIGV2ZW50IHRoZSBldmVudCB0byB0ZXN0IGZvciBtYXRjaGluZwotCQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBhY3RpdmF0aW9uIGNvZGUgbWF0Y2hlcyA8Y29kZT5ldmVudDwvY29kZT4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCXJldHVybiAoZXZlbnQuY2hhcmFjdGVyID09IGZDaGFyYWN0ZXIgJiYKLQkJCQkJCShmS2V5Q29kZSA9PSAtMSB8fCBldmVudC5rZXlDb2RlID09IGZLZXlDb2RlKSAmJgotCQkJCQkJKGZTdGF0ZU1hc2sgPT0gU1dULkRFRkFVTFQgfHwgZXZlbnQuc3RhdGVNYXNrID09IGZTdGF0ZU1hc2spKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEVkaXRvckZvcm0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRFZGl0b3JGb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE4NTFhMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEVkaXRvckZvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVmlld0Zvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLS8qKgotICogQSBjb21wb3NpdGUgZm9yIGxheWluZyBvdXQgdGhlIGRlZmF1bHQgcmljaCB0ZXh0IGVkaXRvciBpbiBhbiBFY2xpcHNlIGZvcm0uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRFZGl0b3JGb3JtIGV4dGVuZHMgVmlld0Zvcm0gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBzdHlsZSBmb3IgdGhpcyBjb250cm9sCi0JICovCi0JcHVibGljIFJpY2hUZXh0RWRpdG9yRm9ybShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cyNnZXREYXRhKFN0cmluZyBrZXkpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXREYXRhKFN0cmluZyBrZXkpIHsKLQkJaWYgKGtleSAhPSBudWxsICYmIGtleS5lcXVhbHMoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSKSkgewotCQkJLy8gUmV0dXJuIGEgdGV4dCBib3JkZXIgdG8gZ2V0IHRoZSBGb3JtVG9vbGtpdCdzIEJvcmRlclBhaW50ZXIgdG8KLQkJCS8vIHBhaW50IGEgYm9yZGVyIGZvciB0aGUgcmljaCB0ZXh0IGVkaXRvci4KLQkJCXJldHVybiBGb3JtVG9vbGtpdC5URVhUX0JPUkRFUjsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGF0YSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEZvcm1Ub29sa2l0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0Rm9ybVRvb2xraXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2UxMTJjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0Rm9ybVRvb2xraXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotCi0vKioKLSAqIEEgaGVscGVyIHRvb2xraXQgZm9yIGNyZWF0aW5nIGEgcmljaCB0ZXh0IGNvbnRyb2wgYW5kIGVkaXRvciB0aGF0IGNhbiBiZQotICogYWRkZWQgdG8gYW4gRWNsaXBzZSBmb3JtLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0Rm9ybVRvb2xraXQgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJpY2ggdGV4dCBjb250cm9sIGFuZCBhZGFwdHMgaXQgdG8gYmUgdXNlZCBpbiBhIGZvcm0uCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIHRoZSBmb3JtIHRvb2xraXQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIGluaXRpYWwgdGV4dCBmb3IgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIGluaXRpYWwgc3R5bGUgZm9yIHRoZSB2aWV3ZXIKLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGhyZWZzCi0JICogQHJldHVybiBhIG5ldyA8Y29kZT5JUmljaFRleHQ8L2NvZGU+IGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBJUmljaFRleHQgY3JlYXRlUmljaFRleHQoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUpIHsKLQkJSVJpY2hUZXh0IHJpY2hUZXh0ID0gbmV3IFJpY2hUZXh0KHBhcmVudCwgdG9vbGtpdC5nZXRCb3JkZXJTdHlsZSgpCi0JCQkJfCBzdHlsZSB8IHRvb2xraXQuZ2V0T3JpZW50YXRpb24oKSk7Ci0JCXJpY2hUZXh0LmdldENvbnRyb2woKS5zZXREYXRhKEZvcm1Ub29sa2l0LktFWV9EUkFXX0JPUkRFUiwKLQkJCQlGb3JtVG9vbGtpdC5URVhUX0JPUkRFUik7Ci0JCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldFRleHQodGV4dCk7Ci0JCX0KLQkJcmV0dXJuIHJpY2hUZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSByaWNoIHRleHQgZWRpdG9yIGFuZCBhZGFwdHMgaXQgdG8gYmUgdXNlZCBpbiBhIGZvcm0uCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIHRoZSBmb3JtIHRvb2xraXQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIGluaXRpYWwgdGV4dCBmb3IgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIGluaXRpYWwgc3R5bGUgZm9yIHRoZSB2aWV3ZXIKLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGhyZWZzCi0JICogQHJldHVybiBhIG5ldyA8Y29kZT5JUmljaFRleHQ8L2NvZGU+IGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBJUmljaFRleHRFZGl0b3IgY3JlYXRlUmljaFRleHRFZGl0b3IoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUsIElFZGl0b3JTaXRlIGVkaXRvclNpdGUpIHsKLQkJSVJpY2hUZXh0RWRpdG9yIHJpY2hUZXh0RWRpdG9yID0gbmV3IFJpY2hUZXh0RWRpdG9yKHBhcmVudCwgdG9vbGtpdAotCQkJCS5nZXRCb3JkZXJTdHlsZSgpCi0JCQkJfCBzdHlsZSB8IHRvb2xraXQuZ2V0T3JpZW50YXRpb24oKSwgZWRpdG9yU2l0ZSk7Ci0JCXJpY2hUZXh0RWRpdG9yLmdldENvbnRyb2woKS5zZXREYXRhKEZvcm1Ub29sa2l0LktFWV9EUkFXX0JPUkRFUiwKLQkJCQlGb3JtVG9vbGtpdC5URVhUX0JPUkRFUik7Ci0JCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0RWRpdG9yLnNldFRleHQodGV4dCk7Ci0JCX0KLQkJcmV0dXJuIHJpY2hUZXh0RWRpdG9yOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEltYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYzFiYjIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRJbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFNoYXJlZCBpbWFnZXMgdXNlZCBieSB0aGUgZGVmYXVsdCByaWNoIHRleHQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0SW1hZ2VzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFVE9PTDE2ID0gImZ1bGwvZXRvb2wxNi8iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRPT0wxNiA9ICJmdWxsL2R0b29sMTYvIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJpY2hUZXh0UGx1Z2luIHJpY2hUZXh0UGx1Z2luID0gUmljaFRleHRQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9BRERfSU1BR0UgPSBFVE9PTDE2ICsgIkFkZEltYWdlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0FERF9MSU5FID0gRVRPT0wxNiArICJBZGRMaW5lLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0FERF9MSU5LID0gRVRPT0wxNiArICJBZGRMaW5rLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0FERF9PUkRFUkVEX0xJU1QgPSBFVE9PTDE2Ci0JCQkrICJBZGRPcmRlcmVkTGlzdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9BRERfVEFCTEUgPSBFVE9PTDE2ICsgIkFkZFRhYmxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0FERF9VTk9SREVSRURfTElTVCA9IEVUT09MMTYKLQkJCSsgIkFkZFVub3JkZXJlZExpc3QuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfQk9MRCA9IEVUT09MMTYgKyAiQm9sZC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9DTEVBUl9DT05URU5UID0gRVRPT0wxNgotCQkJKyAiQ2xlYXJDb250ZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9DT1BZID0gRVRPT0wxNiArICJDb3B5LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0NVVCA9IEVUT09MMTYgKyAiQ3V0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0ZJTkRfUkVQTEFDRSA9IEVUT09MMTYKLQkJCSsgIkZpbmRSZXBsYWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0lOREVOVCA9IEVUT09MMTYgKyAiSW5kZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0lUQUxJQyA9IEVUT09MMTYgKyAiSXRhbGljLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0pVU1RJRllfQ0VOVEVSID0gRVRPT0wxNgotCQkJKyAiSnVzdGlmeUNlbnRlci5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9KVVNUSUZZX0ZVTEwgPSBFVE9PTDE2Ci0JCQkrICJKdXN0aWZ5RnVsbC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9KVVNUSUZZX0xFRlQgPSBFVE9PTDE2Ci0JCQkrICJKdXN0aWZ5TGVmdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9KVVNUSUZZX1JJR0hUID0gRVRPT0wxNgotCQkJKyAiSnVzdGlmeVJpZ2h0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX09VVERFTlQgPSBFVE9PTDE2ICsgIk91dGRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfUEFTVEUgPSBFVE9PTDE2ICsgIlBhc3RlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX1NUUklLRV9USFJPVUdIID0gRVRPT0wxNgotCQkJKyAiU3RyaWtlVGhyb3VnaC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9TVUJTQ1JJUFQgPSBFVE9PTDE2ICsgIlN1YnNjcmlwdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9TVVBFUlNDUklQVCA9IEVUT09MMTYKLQkJCSsgIlN1cGVyc2NyaXB0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX1VOREVSTElORSA9IEVUT09MMTYgKyAiVW5kZXJsaW5lLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0FERF9JTUFHRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfQUREX0lNQUdFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0FERF9MSU5FID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9BRERfTElORSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19BRERfTElOSyA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfQUREX0xJTkspOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQUREX09SREVSRURfTElTVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfQUREX09SREVSRURfTElTVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19BRERfVEFCTEUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0FERF9UQUJMRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19BRERfVU5PUkRFUkVEX0xJU1QgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0FERF9VTk9SREVSRURfTElTVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19CT0xEID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9CT0xEKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0NMRUFSX0NPTlRFTlQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0NMRUFSX0NPTlRFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ09QWSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfQ09QWSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19DVVQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0NVVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19GSU5EX1JFUExBQ0UgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0ZJTkRfUkVQTEFDRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19JTkRFTlQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0lOREVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19JVEFMSUMgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0lUQUxJQyk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19KVVNUSUZZX0NFTlRFUiA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfSlVTVElGWV9DRU5URVIpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfSlVTVElGWV9GVUxMID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9KVVNUSUZZX0ZVTEwpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfSlVTVElGWV9MRUZUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9KVVNUSUZZX0xFRlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfSlVTVElGWV9SSUdIVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfSlVTVElGWV9SSUdIVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19PVVRERU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9PVVRERU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1BBU1RFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9QQVNURSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19TVFJJS0VfVEhST1VHSCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfU1RSSUtFX1RIUk9VR0gpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfU1VCU0NSSVBUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9TVUJTQ1JJUFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfU1VQRVJTQ1JJUFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX1NVUEVSU0NSSVBUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1VOREVSTElORSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfVU5ERVJMSU5FKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0FERF9JTUFHRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0FERF9JTUFHRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19BRERfTElORSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0FERF9MSU5FKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0FERF9MSU5LID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQUREX0xJTkspOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfQUREX09SREVSRURfTElTVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0FERF9PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfQUREX1RBQkxFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQUREX1RBQkxFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0FERF9VTk9SREVSRURfTElTVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0FERF9VTk9SREVSRURfTElTVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19CT0xEID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQk9MRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19DTEVBUl9DT05URU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQ0xFQVJfQ09OVEVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19DT1BZID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQ09QWSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19DVVQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9DVVQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfRklORF9SRVBMQUNFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfRklORF9SRVBMQUNFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0lOREVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0lOREVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19JVEFMSUMgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9JVEFMSUMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfSlVTVElGWV9DRU5URVIgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9KVVNUSUZZX0NFTlRFUik7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19KVVNUSUZZX0ZVTEwgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9KVVNUSUZZX0ZVTEwpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfSlVTVElGWV9MRUZUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfSlVTVElGWV9MRUZUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0pVU1RJRllfUklHSFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9KVVNUSUZZX1JJR0hUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX09VVERFTlQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9PVVRERU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX1BBU1RFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfUEFTVEUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfU1RSSUtFX1RIUk9VR0ggPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9TVFJJS0VfVEhST1VHSCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19TVUJTQ1JJUFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9TVUJTQ1JJUFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfU1VQRVJTQ1JJUFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9TVVBFUlNDUklQVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19VTkRFUkxJTkUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9VTkRFUkxJTkUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQUREX0lNQUdFID0gRFRPT0wxNgotCQkJKyAiQWRkSW1hZ2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQUREX0xJTkUgPSBEVE9PTDE2Ci0JCQkrICJBZGRMaW5lLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0FERF9MSU5LID0gRFRPT0wxNgotCQkJKyAiQWRkTGluay5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9BRERfT1JERVJFRF9MSVNUID0gRFRPT0wxNgotCQkJKyAiQWRkT3JkZXJlZExpc3QuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQUREX1RBQkxFID0gRFRPT0wxNgotCQkJKyAiQWRkVGFibGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQUREX1VOT1JERVJFRF9MSVNUID0gRFRPT0wxNgotCQkJKyAiQWRkVW5vcmRlcmVkTGlzdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9CT0xEID0gRFRPT0wxNiArICJCb2xkLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0NMRUFSX0NPTlRFTlQgPSBEVE9PTDE2Ci0JCQkrICJDbGVhckNvbnRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0NPUFkgPSBEVE9PTDE2ICsgIkNvcHkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQ1VUID0gRFRPT0wxNiArICJDdXQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfRklORF9SRVBMQUNFID0gRFRPT0wxNgotCQkJKyAiRmluZFJlcGxhY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfSU5ERU5UID0gRFRPT0wxNgotCQkJKyAiSW5kZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0lUQUxJQyA9IERUT09MMTYKLQkJCSsgIkl0YWxpYy5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9KVVNUSUZZX0NFTlRFUiA9IERUT09MMTYKLQkJCSsgIkp1c3RpZnlDZW50ZXIuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9GVUxMID0gRFRPT0wxNgotCQkJKyAiSnVzdGlmeUZ1bGwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9MRUZUID0gRFRPT0wxNgotCQkJKyAiSnVzdGlmeUxlZnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9SSUdIVCA9IERUT09MMTYKLQkJCSsgIkp1c3RpZnlSaWdodC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9PVVRERU5UID0gRFRPT0wxNgotCQkJKyAiT3V0ZGVudC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9QQVNURSA9IERUT09MMTYgKyAiUGFzdGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfU1RSSUtFX1RIUk9VR0ggPSBEVE9PTDE2Ci0JCQkrICJTdHJpa2VUaHJvdWdoLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX1NVQlNDUklQVCA9IERUT09MMTYKLQkJCSsgIlN1YnNjcmlwdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9TVVBFUlNDUklQVCA9IERUT09MMTYKLQkJCSsgIlN1cGVyc2NyaXB0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX1VOREVSTElORSA9IERUT09MMTYKLQkJCSsgIlVuZGVybGluZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19BRERfSU1BR0UgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0FERF9JTUFHRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19BRERfTElORSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfQUREX0xJTkUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQUREX0xJTksgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0FERF9MSU5LKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0FERF9PUkRFUkVEX0xJU1QgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0FERF9PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQUREX1RBQkxFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9BRERfVEFCTEUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQUREX1VOT1JERVJFRF9MSVNUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9BRERfVU5PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQk9MRCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfQk9MRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19DTEVBUl9DT05URU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9DTEVBUl9DT05URU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0NPUFkgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0NPUFkpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQ1VUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9DVVQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfRklORF9SRVBMQUNFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9GSU5EX1JFUExBQ0UpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfSU5ERU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9JTkRFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfSVRBTElDID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9JVEFMSUMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfSlVTVElGWV9DRU5URVIgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0pVU1RJRllfQ0VOVEVSKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0pVU1RJRllfRlVMTCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9GVUxMKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0pVU1RJRllfTEVGVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9MRUZUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0pVU1RJRllfUklHSFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0pVU1RJRllfUklHSFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfT1VUREVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfT1VUREVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19QQVNURSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfUEFTVEUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfU1RSSUtFX1RIUk9VR0ggPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX1NUUklLRV9USFJPVUdIKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX1NVQlNDUklQVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfU1VCU0NSSVBUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX1NVUEVSU0NSSVBUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9TVVBFUlNDUklQVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19VTkRFUkxJTkUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX1VOREVSTElORSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19BRERfSU1BR0UgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9BRERfSU1BR0UpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQUREX0xJTkUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9BRERfTElORSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19BRERfTElOSyA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0FERF9MSU5LKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0FERF9PUkRFUkVEX0xJU1QgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9BRERfT1JERVJFRF9MSVNUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0FERF9UQUJMRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0FERF9UQUJMRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19BRERfVU5PUkRFUkVEX0xJU1QgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9BRERfVU5PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQk9MRCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0JPTEQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQ0xFQVJfQ09OVEVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0NMRUFSX0NPTlRFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQ09QWSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0NPUFkpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQ1VUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfQ1VUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0ZJTkRfUkVQTEFDRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0ZJTkRfUkVQTEFDRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19JTkRFTlQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9JTkRFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfSVRBTElDID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfSVRBTElDKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0pVU1RJRllfQ0VOVEVSID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9DRU5URVIpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfSlVTVElGWV9GVUxMID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9GVUxMKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0pVU1RJRllfTEVGVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0pVU1RJRllfTEVGVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19KVVNUSUZZX1JJR0hUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9SSUdIVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19PVVRERU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfT1VUREVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19QQVNURSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX1BBU1RFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX1NUUklLRV9USFJPVUdIID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfU1RSSUtFX1RIUk9VR0gpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfU1VCU0NSSVBUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfU1VCU0NSSVBUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX1NVUEVSU0NSSVBUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfU1VQRVJTQ1JJUFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfVU5ERVJMSU5FID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfVU5ERVJMSU5FKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWYyMjA0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIExpc3RlbnMgdG8gYSByaWNoIHRleHQgZWRpdGluZyBldmVudC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dExpc3RlbmVyIHsKLQotCXByaXZhdGUgaW50IGV2ZW50VHlwZTsKLQotCXByaXZhdGUgTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBldmVudFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBldmVudCB0eXBlCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgZXZlbnQgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRMaXN0ZW5lcihpbnQgZXZlbnRUeXBlLCBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmV2ZW50VHlwZSA9IGV2ZW50VHlwZTsKLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV2ZW50IHR5cGUuCi0JICogCi0JICogQHJldHVybiB0aGUgZXZlbnQgdHlwZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkgewotCQlyZXR1cm4gZXZlbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV2ZW50IGxpc3RlbmVyLgotCSAqLwotCXB1YmxpYyBMaXN0ZW5lciBnZXRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIGxpc3RlbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2OGUwNTdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIFJpY2ggVGV4dCBwbHVnLWluIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFJpY2hUZXh0UGx1Z2luIHBsdWdpbjsKLQotCS8vIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhpcyBwbHVnLWluIHdhcyBzdGFydGVkLgotCXByaXZhdGUgRGF0ZSBzdGFydFRpbWU7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBSaWNoVGV4dFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdG9wKEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmljaFRleHRQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhpcyBwbHVnLWluIHdhcyBzdGFydGVkLgotCSAqLwotCXB1YmxpYyBEYXRlIGdldFN0YXJ0VGltZSgpIHsKLQkJcmV0dXJuIHN0YXJ0VGltZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRSZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGRmN2M1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0UmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgUmljaFRleHQgcmVzb3VyY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUmljaFRleHRSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gUmljaFRleHRSZXNvdXJjZXMuY2xhc3MKLQkJLmdldFBhY2thZ2UoKS5nZXROYW1lKCkgKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIFJpY2hUZXh0UmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUuCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udE5hbWVBY3Rpb25fQ1NTX0RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udE5hbWVBY3Rpb25fQ1NTX0RlZmF1bHRfTW96aWxsYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250TmFtZUFjdGlvbl9EZWZhdWx0Rm9udE5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udFN0eWxlX25vcm1hbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250U3R5bGVfc2VjdGlvbkhlYWRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udFN0eWxlX3N1YnNlY3Rpb25IZWFkaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnRTdHlsZV9zdWJTdWJzZWN0aW9uSGVhZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250U3R5bGVfcXVvdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udFN0eWxlX2NvZGVTYW1wbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfcGFyYWdyYXBoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJsb2NrVGFnX2hlYWRpbmcxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJsb2NrVGFnX2hlYWRpbmcyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJsb2NrVGFnX2hlYWRpbmczOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJsb2NrVGFnX2hlYWRpbmc0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJsb2NrVGFnX2hlYWRpbmc1OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJsb2NrVGFnX2hlYWRpbmc2OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJsb2NrVGFnX2FkZHJlc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfcHJlZm9ybWF0dGVkVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250TmFtZV9kZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnROYW1lX2FyaWFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnROYW1lX2NvdXJpZXJOZXc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udE5hbWVfdGltZXNOZXdSb21hbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250TmFtZV92ZXJkYW5hOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZEhvcml6b250YWxCYXJBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkSW1hZ2VBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkTGluZUFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRMaW5rQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZE9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZFRhYmxlQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZFVub3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYm9sZEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGVhckNvbnRlbnRBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weUFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXRBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmluZFJlcGxhY2VBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5kZW50QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGl0YWxpY0FjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBqdXN0aWZ5Q2VudGVyQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGp1c3RpZnlGdWxsQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGp1c3RpZnlMZWZ0QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGp1c3RpZnlSaWdodEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRkZW50QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhc3RlQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhc3RlUGxhaW5UZXh0QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1YnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdXBlcnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmRlcmxpbmVBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udFN0eWxlQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJsb2NrVGFnQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnROYW1lQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnRTaXplQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1dEFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXN0ZUFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhc3RlUGxhaW5UZXh0QWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmljaFRleHRUYWJfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByaWNoVGV4dFRhYl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBodG1sVGFiX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaHRtbFRhYl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRJbWFnZURpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRMaW5rRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZFRhYmxlRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbmRSZXBsYWNlRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVybERpc3BsYXlOYW1lTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cmxMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1bW1hcnlMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhcHRpb25MYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvd3NMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbHVtbnNMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpZHRoTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YWJsZVN0eWxlTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YWJsZUhlYWRlck5vbmVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YWJsZUhlYWRlckNvbHNfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YWJsZUhlYWRlclJvd3NfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YWJsZUhlYWRlckJvdGhfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2VCdXR0b25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGVhckNvbnRlbnREaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xlYXJDb250ZW50RGlhbG9nX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmluZExhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZUxhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3B0aW9uc0dyb3VwX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FzZVNlbnNpdGl2ZUNoZWNrYm94X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2hvbGVXb3JkQ2hlY2tib3hfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXJlY3Rpb25Hcm91cF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcndhcmRSYWRpb0J1dHRvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhY2t3YXJkUmFkaW9CdXR0b25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaW5kQnV0dG9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZUJ1dHRvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VGaW5kQnV0dG9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZWFsbEJ1dHRvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbmRSZXBsYWNlX1N0YXR1c19ub01hdGNoX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1heENoYXJzUGVyTGluZUxhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5kZW50SFRNTENoZWNrYm94X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5kZW50U2l6ZUxhYmVsX3RleHQ7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBSaWNoVGV4dFJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRTZWxlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRTZWxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzRiN2Y0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0U2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi0vKioKLSAqIE1vZGVscyBhIHRleHQgc2VsZWN0aW9uIGluIGEgcmljaCB0ZXh0IGNvbnRyb2wgYW5kIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dFNlbGVjdGlvbiB7Ci0KLQkvLyBUaGUgY29udHJvbCdzIHRleHQgc2VsZWN0aW9uLgotCXByb3RlY3RlZCBTdHJpbmcgdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgY29udHJvbCdzIHRleHQgc2VsZWN0aW9uIG9mZnNldAotCXByb3RlY3RlZCBpbnQgb2Zmc2V0U3RhcnQgPSAwOwotCi0JLy8gVGhlIGNvbnRyb2wncyB0ZXh0IHNlbGVjdGlvbiBmb250Ci0JcHJvdGVjdGVkIFN0cmluZyBmb250TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgY29udHJvbCdzIHRleHQgc2VsZWN0aW9uIGZvbnQgc2l6ZQotCS8vIGNvdWxkIGJlIGluIHBvaW50IHNpemUgKDEycHQpLCBvciBIVE1MIHNpemUgKDEtNykKLQlwcm90ZWN0ZWQgU3RyaW5nIGZvbnRTaXplID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBjb250cm9sJ3MgdGV4dCBjdXJyZW50IHN0eWxlCi0JcHJvdGVjdGVkIFN0cmluZyBibG9ja1N0eWxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBjb250cm9sJ3MgdGV4dCBjdXJyZW50IGZsYWdzCi0JcHJvdGVjdGVkIGludCBmbGFncyA9IDA7Ci0KLQkvLyBUZXh0IHN0YXR1cyBmbGFncwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPTEQgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVRBTElDID0gQk9MRCA8PCAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERVJMSU5FID0gSVRBTElDIDw8IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVUJTQ1JJUFQgPSBVTkRFUkxJTkUgPDwgMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVUEVSU0NSSVBUID0gU1VCU0NSSVBUIDw8IDE7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJsb2NrU3R5bGUoKSB7Ci0JCXJldHVybiBibG9ja1N0eWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJsb2NrU3R5bGUoU3RyaW5nIGJsb2NrU3R5bGUpIHsKLQkJdGhpcy5ibG9ja1N0eWxlID0gYmxvY2tTdHlsZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEZsYWdzKCkgewotCQlyZXR1cm4gZmxhZ3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmxhZ3MoaW50IGZsYWdzKSB7Ci0JCXRoaXMuZmxhZ3MgPSBmbGFnczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnROYW1lKCkgewotCQlyZXR1cm4gZm9udE5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9udE5hbWUoU3RyaW5nIGZvbnROYW1lKSB7Ci0JCXRoaXMuZm9udE5hbWUgPSBmb250TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnRTaXplKCkgewotCQlyZXR1cm4gZm9udFNpemU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9udFNpemUoU3RyaW5nIGZvbnRTaXplKSB7Ci0JCXRoaXMuZm9udFNpemUgPSBmb250U2l6ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9mZnNldFN0YXJ0KCkgewotCQlyZXR1cm4gb2Zmc2V0U3RhcnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2Zmc2V0U3RhcnQoaW50IG9mZnNldFN0YXJ0KSB7Ci0JCXRoaXMub2Zmc2V0U3RhcnQgPSBvZmZzZXRTdGFydDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJdGhpcy50ZXh0ID0gdGV4dDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0JvbGQoKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBCT0xEKSAhPSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSXRhbGljKCkgewotCQlyZXR1cm4gKGZsYWdzICYgSVRBTElDKSAhPSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVW5kZXJMaW5lKCkgewotCQlyZXR1cm4gKGZsYWdzICYgVU5ERVJMSU5FKSAhPSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3Vic2NyaXB0KCkgewotCQlyZXR1cm4gKGZsYWdzICYgU1VCU0NSSVBUKSAhPSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3VwZXJzY3JpcHQoKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBTVVBFUlNDUklQVCkgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIHNlbGVjdGlvbiBpbmZvCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlvZmZzZXRTdGFydCA9IDA7Ci0JCWZvbnROYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZm9udFNpemUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlibG9ja1N0eWxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZmxhZ3MgPSAwOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyBzdHIgPSAiVGV4dDogIiArIHRleHQgKyAiXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc3RyICs9ICJmb250TmFtZTogIiArIGZvbnROYW1lICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXN0ciArPSAiZm9udFNpemU6ICIgKyBmb250U2l6ZSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzdHIgKz0gImJsb2NrU3R5bGU6ICIgKyBibG9ja1N0eWxlICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXN0ciArPSAiZmxhZ3M6ICIgKyBmbGFncyArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gc3RyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dFRvb2xCYXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRUb29sQmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1ZmNhMmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dFRvb2xCYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLklSaWNoVGV4dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5JUmljaFRleHRDb21ib0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgcmljaCB0ZXh0IHRvb2wgYmFyIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRUb29sQmFyIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgSVJpY2hUZXh0VG9vbEJhciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1RfS0VZX0NPREUgPSAibGFzdEtleUNvZGUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgcGFyZW50IHJpY2ggdGV4dCBjb250cm9sLgotCXByaXZhdGUgSVJpY2hUZXh0IHJpY2hUZXh0OwotCi0JLy8gSWYgdHJ1ZSwgYWRkIGEgbmV3IHRvb2wgYmFyLgotCXByaXZhdGUgYm9vbGVhbiBhZGRUb29sQmFyID0gdHJ1ZTsKLQotCS8vIFRoZSBjdXJyZW50IHRvb2wgYmFyIHVzZWQgdG8gcG9wdWxhdGUgdGhlIHRvb2wgYWN0aW9ucy4KLQlwcml2YXRlIFRvb2xCYXIgY3VycmVudFRvb2xCYXI7Ci0KLQkvLyBUaGUgYWN0aW9uIGl0ZW1zIGluIHRoZSB0b29sIGJhcihzKS4KLQlwcml2YXRlIExpc3QgYWN0aW9uSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGxhc3RXaWR0aCA9IC0xOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHRvb2wgYmFyIHN0eWxlCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIFJpY2hUZXh0VG9vbEJhcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJdGhpcy5yaWNoVGV4dCA9IHJpY2hUZXh0OwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMTAsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXN1cGVyLnNldExheW91dChsYXlvdXQpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBidXR0b24gYWN0aW9uIHRvIHRoZSB0b29sIGJhci4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uCi0JICogICAgICAgICAgICB0aGUgYWN0aW9uIHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFjdGlvbihmaW5hbCBJUmljaFRleHRBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWRkVG9vbEJhcigpOwotCQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbShjdXJyZW50VG9vbEJhciwgYWN0aW9uLmdldFN0eWxlKCkpOwotCQkJaXRlbS5zZXRJbWFnZShhY3Rpb24uZ2V0SW1hZ2UoKSk7Ci0JCQlpdGVtLnNldERpc2FibGVkSW1hZ2UoYWN0aW9uLmdldERpc2FibGVkSW1hZ2UoKSk7Ci0JCQlpdGVtLnNldFRvb2xUaXBUZXh0KGFjdGlvbi5nZXRUb29sVGlwVGV4dCgpKTsKLQkJCWl0ZW0uc2V0RW5hYmxlZChhY3Rpb24uZ2V0RW5hYmxlZCgpKTsKLQkJCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJLy8gcmljaFRleHQuc2V0Qmx1cigpOwotCQkJCQlhY3Rpb24uZXhlY3V0ZShyaWNoVGV4dCk7Ci0JCQkJfTsKLQkJCX0pOwotCQkJaXRlbS5zZXREYXRhKGFjdGlvbik7Ci0JCQlhY3Rpb24uc2V0VG9vbEl0ZW0oaXRlbSk7Ci0JCQlhY3Rpb25JdGVtcy5hZGQoaXRlbSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgY29tYm8gYWN0aW9uIHRvIHRoZSB0b29sIGJhci4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uCi0JICogICAgICAgICAgICB0aGUgYWN0aW9uIHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFjdGlvbihmaW5hbCBJUmljaFRleHRDb21ib0FjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlDQ29tYm8gY29tYm8gPSBuZXcgQ0NvbWJvKHRoaXMsIFNXVC5SRUFEX09OTFkgfCBTV1QuRkxBVAotCQkJCQl8IFNXVC5CT1JERVIpOwotCQkJU3RyaW5nW10gaXRlbXMgPSBhY3Rpb24uZ2V0SXRlbXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQljb21iby5hZGQoaXRlbXNbaV0pOwotCQkJfQotCQkJY29tYm8uc2V0VmlzaWJsZUl0ZW1Db3VudCg4KTsKLQkJCWNvbWJvLnNlbGVjdCgwKTsKLQkJCWNvbWJvLnNldFRvb2xUaXBUZXh0KGFjdGlvbi5nZXRUb29sVGlwVGV4dCgpKTsKLQkJCWNvbWJvLnNldEVuYWJsZWQoYWN0aW9uLmdldEVuYWJsZWQoKSk7Ci0JCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlTdHJpbmcgbGFzdEtleUNvZGUgPSAoU3RyaW5nKSBnZXREYXRhKExBU1RfS0VZX0NPREUpOwotCQkJCQlpZiAobGFzdEtleUNvZGUgPT0gbnVsbCB8fCBsYXN0S2V5Q29kZS5lcXVhbHMoIiIgKyBTV1QuQ1IpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCU9iamVjdCBldmVudFNyYyA9IGV2ZW50LmdldFNvdXJjZSgpOwotCQkJCQkJaWYgKGV2ZW50U3JjIGluc3RhbmNlb2YgQ0NvbWJvKSB7Ci0JCQkJCQkJYWN0aW9uLmV4ZWN1dGUocmljaFRleHQsICgoQ0NvbWJvKSBldmVudFNyYykKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlzZXREYXRhKExBU1RfS0VZX0NPREUsIG51bGwpOwotCQkJCX07Ci0JCQl9KTsKLQkJCWNvbWJvLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKGV2ZW50LmtleUNvZGUgPT0gU1dULkNSKSB7Ci0JCQkJCQlPYmplY3QgZXZlbnRTcmMgPSBldmVudC5nZXRTb3VyY2UoKTsKLQkJCQkJCWlmIChldmVudFNyYyBpbnN0YW5jZW9mIENDb21ibykgewotCQkJCQkJCWFjdGlvbi5leGVjdXRlKHJpY2hUZXh0LCAoKENDb21ibykgZXZlbnRTcmMpCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJc2V0RGF0YShMQVNUX0tFWV9DT0RFLCAiIiArIGV2ZW50LmtleUNvZGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfTsKLQkJCX0pOwotCQkJYWN0aW9uLnNldENvbWJvKGNvbWJvKTsKLQkJCWFjdGlvbkl0ZW1zLmFkZChjb21ibyk7Ci0JCQlhZGRUb29sQmFyID0gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBzZXBhcmF0b3IgdG8gdGhlIHRvb2wgYmFyLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlcGFyYXRvcigpIHsKLQkJYWRkVG9vbEJhcigpOwotCQluZXcgVG9vbEl0ZW0oY3VycmVudFRvb2xCYXIsIFNXVC5TRVBBUkFUT1IpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHRvb2xiYXIgc3RhdGUuCi0JICogPHA+Ci0JICogRW5hYmxlcy9kaXNhYmxlcyBhY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0JICogUmljaFRleHRFZGl0b3IgdGFiIChSaWNoVGV4dCB2cy4gSFRNTCkKLQkgKiAKLQkgKiBAcGFyYW0gZWRpdGFibGUKLQkgKiAgICAgICAgICAgIHNwZWNpZmllcyB3aGV0aGVyIHRvIGVuYWJsZSBub24tUmVhZE9ubHkgY29tbWFuZHMKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVUb29sQmFyKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJYm9vbGVhbiByaWNoVGV4dE1vZGUgPSB0cnVlOwotCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBSaWNoVGV4dEVkaXRvcgotCQkJCSYmICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KS5pc0hUTUxUYWJTZWxlY3RlZCgpKSB7Ci0JCQlyaWNoVGV4dE1vZGUgPSBmYWxzZTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGkgPSBhY3Rpb25JdGVtcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBpdGVtID0gaS5uZXh0KCk7Ci0JCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFRvb2xJdGVtKSB7Ci0JCQkJYm9vbGVhbiBlbmFibGVkVG9vbEl0ZW0gPSB0cnVlOwotCQkJCVRvb2xJdGVtIHRvb2xJdGVtID0gKFRvb2xJdGVtKSBpdGVtOwotCQkJCUlSaWNoVGV4dEFjdGlvbiBhY3Rpb24gPSAoSVJpY2hUZXh0QWN0aW9uKSB0b29sSXRlbS5nZXREYXRhKCk7Ci0JCQkJaWYgKGFjdGlvbiAhPSBudWxsICYmICFlZGl0YWJsZQotCQkJCQkJJiYgYWN0aW9uLmRpc2FibGVJblJlYWRPbmx5TW9kZSgpKSB7Ci0JCQkJCWVuYWJsZWRUb29sSXRlbSA9IGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoYWN0aW9uICE9IG51bGwgJiYgIXJpY2hUZXh0TW9kZQotCQkJCQkJJiYgYWN0aW9uLmRpc2FibGVJblNvdXJjZU1vZGUoKSkgewotCQkJCQllbmFibGVkVG9vbEl0ZW0gPSBmYWxzZTsKLQkJCQl9Ci0JCQkJdG9vbEl0ZW0uc2V0RW5hYmxlZChlbmFibGVkVG9vbEl0ZW0pOwotCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29tYm8pIHsKLQkJCQlpZiAocmljaFRleHRNb2RlICYmIGVkaXRhYmxlKSB7Ci0JCQkJCSgoQ29tYm8pIGl0ZW0pLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJKChDb21ibykgaXRlbSkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWxhc3RXaWR0aCA9IGdldFNpemUoKS54OwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSB0b29sIGJhciwgaWYgbmVjZXNzYXJ5LCB0byBjb250YWluIGEgYnV0dG9uIGFjdGlvbiBvciBzZXBhcmF0b3IuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9vbEJhcigpIHsKLQkJaWYgKGFkZFRvb2xCYXIpIHsKLQkJCWN1cnJlbnRUb29sQmFyID0gbmV3IFRvb2xCYXIodGhpcywgZ2V0U3R5bGUoKSk7Ci0JCQljdXJyZW50VG9vbEJhci5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQlhZGRUb29sQmFyID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRMYXN0V2lkdGgoKSB7Ci0JCXJldHVybiBsYXN0V2lkdGg7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkSW1hZ2VBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRJbWFnZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyOTQ4MDQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRJbWFnZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9ncy5BZGRJbWFnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQWRkcyBhbiBpbWFnZSB0byBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFkZEltYWdlQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQWRkSW1hZ2VBY3Rpb24oKSB7Ci0JCXNldEltYWdlKFJpY2hUZXh0SW1hZ2VzLklNR19BRERfSU1BR0UpOwotCQlzZXREaXNhYmxlZEltYWdlKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19BRERfSU1BR0UpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5hZGRJbWFnZUFjdGlvbl90b29sVGlwVGV4dCk7IAotCQlzZXRFbmFibGVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCUFkZEltYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRJbWFnZURpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJU3RyaW5nIGltYWdlVVJMID0gZGlhbG9nLmdldEltYWdlKCkuZ2V0VVJMKCk7Ci0JCQkJaWYgKGltYWdlVVJMLmxlbmd0aCgpID4gMCkgewotCQkJCQlyaWNoVGV4dAotCQkJCQkJCS5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX0lNQUdFLCBpbWFnZVVSTCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRMaW5lQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkTGluZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNTRlMTM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRMaW5lQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotCi0vKioKLSAqIEFkZHMgYSBob3Jpem9udGFsIGJhciB0byBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFkZExpbmVBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBZGRMaW5lQWN0aW9uKCkgewotCQlzZXRJbWFnZShSaWNoVGV4dEltYWdlcy5JTUdfQUREX0xJTkUpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5hZGRMaW5lQWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JCXNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9MSU5FKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRMaW5rQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkTGlua0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZmU0YzhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRMaW5rQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkFkZExpbmtEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEFkZHMgYSBsaW5rIHRvIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkTGlua0FjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFkZExpbmtBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldEltYWdlKFJpY2hUZXh0SW1hZ2VzLklNR19BRERfTElOSyk7Ci0JCXNldERpc2FibGVkSW1hZ2UoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0FERF9MSU5LKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuYWRkTGlua0FjdGlvbl90b29sVGlwVGV4dCk7IAotCQlzZXRFbmFibGVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCUFkZExpbmtEaWFsb2cgZGlhbG9nID0gbmV3IEFkZExpbmtEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJLmdldEFjdGl2ZVNoZWxsKCksIHJpY2hUZXh0LmdldEJhc2VQYXRoKCkpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJCVN0cmluZyBsaW5rVVJMID0gZGlhbG9nLmdldExpbmsoKS5nZXRVUkwoKTsKLQkJCQlpZiAobGlua1VSTC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9MSU5LLCBsaW5rVVJMKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluU291cmNlTW9kZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRPcmRlcmVkTGlzdEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZE9yZGVyZWRMaXN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1NWJjMGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZE9yZGVyZWRMaXN0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotCi0vKioKLSAqIEFkZHMgYW4gb3JkZXJlZCBsaXN0IHRvIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkT3JkZXJlZExpc3RBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBZGRPcmRlcmVkTGlzdEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0SW1hZ2UoUmljaFRleHRJbWFnZXMuSU1HX0FERF9PUkRFUkVEX0xJU1QpOwotCQlzZXREaXNhYmxlZEltYWdlKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19BRERfT1JERVJFRF9MSVNUKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuYWRkT3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQpOwotCQkKLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX09SREVSRURfTElTVCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRUYWJsZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZFRhYmxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiMmIzZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZFRhYmxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkFkZFRhYmxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBZGRzIGEgdGFibGUgdG8gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRUYWJsZUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFkZFRhYmxlQWN0aW9uKCkgewotCQlzdXBlcigpOwotCQlzZXRJbWFnZShSaWNoVGV4dEltYWdlcy5JTUdfQUREX1RBQkxFKTsKLQkJc2V0RGlzYWJsZWRJbWFnZShSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfQUREX1RBQkxFKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuYWRkVGFibGVBY3Rpb25fdG9vbFRpcFRleHQpOwotCQlzZXRFbmFibGVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCUFkZFRhYmxlRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRUYWJsZURpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJVGFibGUgdGFibGUgPSBkaWFsb2cuZ2V0VGFibGUoKTsKLQkJCQlpbnQgcm93cyA9IHRhYmxlLmdldFJvd3MoKTsKLQkJCQlpbnQgY29scyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQkJCQlTdHJpbmcgd2lkdGggPSB0YWJsZS5nZXRXaWR0aCgpOwotCQkJCWludCB0YWJsZWhlYWRlcnMgPSB0YWJsZS5nZXRUYWJsZUhlYWRlcnMoKTsKLQkJCQlTdHJpbmcgc3VtbWFyeSA9IHRhYmxlLmdldFN1bW1hcnkoKTsKLQkJCQlTdHJpbmcgY2FwdGlvbiA9IHRhYmxlLmdldENhcHRpb24oKTsKLQkJCQlpZiAocm93cyA+IDAgJiYgY29scyA+IDApIHsKLQkJCQkJcmljaFRleHQKLQkJCQkJCQkuZXhlY3V0ZUNvbW1hbmQoCi0JCQkJCQkJCQlSaWNoVGV4dENvbW1hbmQuQUREX1RBQkxFLAotCQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJCQkJCQkJIiIgKyByb3dzLCAiIiArIGNvbHMsICIiICsgd2lkdGgsIHN1bW1hcnksIGNhcHRpb24sICIiICsgdGFibGVoZWFkZXJzIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZFVub3JkZXJlZExpc3RBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRVbm9yZGVyZWRMaXN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM5ZjU1YmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZFVub3JkZXJlZExpc3RBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci0KLS8qKgotICogQWRkcyBhbiB1bm9yZGVyZWQgbGlzdCB0byBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFkZFVub3JkZXJlZExpc3RBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBZGRVbm9yZGVyZWRMaXN0QWN0aW9uKCkgewotCQlzdXBlcigpOwotCQlzZXRJbWFnZShSaWNoVGV4dEltYWdlcy5JTUdfQUREX1VOT1JERVJFRF9MSVNUKTsKLQkJc2V0RGlzYWJsZWRJbWFnZShSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfQUREX1VOT1JERVJFRF9MSVNUKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuYWRkVW5vcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dCk7Ci0JCXNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9VTk9SREVSRURfTElTVCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9CYXNlUmljaFRleHRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9CYXNlUmljaFRleHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjY5YTYxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQmFzZVJpY2hUZXh0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIHJpY2ggdGV4dCBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVJpY2hUZXh0QWN0aW9uIGltcGxlbWVudHMgSUJhc2VSaWNoVGV4dEFjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvb2xUaXBUZXh0OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlZDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIEJhc2VSaWNoVGV4dEFjdGlvbigpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0b29sIHRpcCBmb3IgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0b29sIHRpcCB0ZXh0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJcmV0dXJuIHRvb2xUaXBUZXh0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRvb2wgdGlwIGZvciB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB0b29sVGlwVGV4dAotCSAqICAgICAgICAgICAgdGhlIHRvb2wgdGlwIHRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb29sVGlwVGV4dChTdHJpbmcgdG9vbFRpcFRleHQpIHsKLQkJdGhpcy50b29sVGlwVGV4dCA9IHRvb2xUaXBUZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuYWJsZWQgc3RhdHVzIG9mIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlbmFibGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RW5hYmxlZCgpIHsKLQkJcmV0dXJuIGVuYWJsZWQ7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlbmFibGVkCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZW5hYmxlIHRoZSBhY3Rpb24uIGlmCi0JICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4sIGRpc2FibGUgaXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9CbG9ja1RhZ0FjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0Jsb2NrVGFnQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIxODkzMzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0Jsb2NrVGFnQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWwuQmxvY2tUYWc7Ci0KLS8qKgotICogU2V0cyB0aGUgZm9udCBuYW1lIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJsb2NrVGFnQWN0aW9uIGV4dGVuZHMgUmljaFRleHRDb21ib0FjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBCbG9ja1RhZ0FjdGlvbigpIHsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuYmxvY2tUYWdBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQkJYWRkSXRlbShCbG9ja1RhZy5QQVJBR1JBUEguZ2V0TmFtZSgpKTsKLQkJYWRkSXRlbShCbG9ja1RhZy5IRUFESU5HXzEuZ2V0TmFtZSgpKTsKLQkJYWRkSXRlbShCbG9ja1RhZy5IRUFESU5HXzIuZ2V0TmFtZSgpKTsKLQkJYWRkSXRlbShCbG9ja1RhZy5IRUFESU5HXzMuZ2V0TmFtZSgpKTsKLQkJYWRkSXRlbShCbG9ja1RhZy5IRUFESU5HXzQuZ2V0TmFtZSgpKTsKLQkJYWRkSXRlbShCbG9ja1RhZy5IRUFESU5HXzUuZ2V0TmFtZSgpKTsKLQkJYWRkSXRlbShCbG9ja1RhZy5IRUFESU5HXzYuZ2V0TmFtZSgpKTsKLQkJYWRkSXRlbShCbG9ja1RhZy5BRERSRVNTLmdldE5hbWUoKSk7Ci0JCWFkZEl0ZW0oQmxvY2tUYWcuUFJFRk9STUFUVEVEX1RFWFQuZ2V0TmFtZSgpKTsKLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQsIGludCBpbmRleCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHZhbHVlID0gQmxvY2tUYWcuZ2V0QmxvY2tUYWcoaW5kZXgpLmdldFZhbHVlKCk7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuRk9STUFUX0JMT0NLLCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQm9sZEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0JvbGRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQ3YjQxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQm9sZEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIFRvZ2dsZXMgdGhlICdib2xkJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCb2xkQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQm9sZEFjdGlvbihmaW5hbCBJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIoKTsKLQkJc2V0SW1hZ2UoUmljaFRleHRJbWFnZXMuSU1HX0JPTEQpOwotCQlzZXREaXNhYmxlZEltYWdlKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19CT0xEKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuYm9sZEFjdGlvbl90b29sVGlwVGV4dCk7IAotCQlzZXRFbmFibGVkKHRydWUpOwotCQkvLyBhZGQgbGlzdGVuZXIKLQkJcmljaFRleHQuYWRkTGlzdGVuZXIoU1dULlNFTEVDVEVELCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCXRvb2xJdGVtLnNldFNlbGVjdGlvbihyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmlzQm9sZCgpKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkJPTEQpOwotCQl9Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuUmljaFRleHRBY3Rpb24jZ2V0U3R5bGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3R5bGUoKSB7Ci0JCXJldHVybiBTV1QuQ0hFQ0s7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ2xlYXJDb250ZW50QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ2xlYXJDb250ZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiYmJkZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0NsZWFyQ29udGVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci0KLS8qKgotICogQ2xlYXJzIHRoZSBjb250ZW50IG9mIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2xlYXJDb250ZW50QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ2xlYXJDb250ZW50QWN0aW9uKCkgewotCQlzdXBlcigpOwotCQlzZXRJbWFnZShSaWNoVGV4dEltYWdlcy5JTUdfQ0xFQVJfQ09OVEVOVCk7Ci0JCXNldERpc2FibGVkSW1hZ2UoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0NMRUFSX0NPTlRFTlQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5jbGVhckNvbnRlbnRBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgcyByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAoUmljaFRleHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlQcm9tcHQoCi0JCQkJCVJpY2hUZXh0UmVzb3VyY2VzLmNsZWFyQ29udGVudERpYWxvZ190aXRsZSwKLQkJCQkJUmljaFRleHRSZXNvdXJjZXMuY2xlYXJDb250ZW50RGlhbG9nX3RleHQpKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkNMRUFSX0NPTlRFTlQpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ29weUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0NvcHlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2U2YTJkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ29weUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotCi0vKioKLSAqIENvcGllcyB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sIHRvIHRoZSBjbGlwYm9hcmQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29weUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvcHlBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldEltYWdlKFJpY2hUZXh0SW1hZ2VzLklNR19DT1BZKTsKLQkJc2V0RGlzYWJsZWRJbWFnZShSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfQ09QWSk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmNvcHlBY3Rpb25fdG9vbFRpcFRleHQpOwotCQlzZXRFbmFibGVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiByZWFkb25seSBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblJlYWRPbmx5TW9kZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgYWN0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHRoZQotCSAqIHJpY2ggdGV4dCBlZGl0b3IgaXMgaW4gc291cmNlIGVkaXQgbW9kZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5Tb3VyY2VNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJaWYgKHJpY2hUZXh0IGluc3RhbmNlb2YgUmljaFRleHRFZGl0b3IKLQkJCQkJJiYgKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpLmlzSFRNTFRhYlNlbGVjdGVkKCkpIHsKLQkJCQlTdHlsZWRUZXh0IHN0eWxlZFRleHQgPSAoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkuZ2V0U291cmNlRWRpdCgpOwotCQkJCXN0eWxlZFRleHQuY29weSgpOwotCQkJfSBlbHNlIHsKLQkJCQlyaWNoVGV4dC5zZXRDb3B5VVJMKCk7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkNPUFkpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ3V0QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ3V0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4YjAwOTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0N1dEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotCi0vKioKLSAqIEN1dHMgdGhlIHNlbGVjdGVkIHRleHQgaW4gdGhlIHJpY2ggdGV4dCBjb250cm9sIHRvIHRoZSBjbGlwYm9hcmQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3V0QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ3V0QWN0aW9uKCkgewotCQlzdXBlcigpOwotCQlzZXRJbWFnZShSaWNoVGV4dEltYWdlcy5JTUdfQ1VUKTsKLQkJc2V0RGlzYWJsZWRJbWFnZShSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfQ1VUKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuY3V0QWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JCXNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHNvdXJjZSBlZGl0IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluU291cmNlTW9kZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0RWRpdG9yCi0JCQkJCSYmICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KS5pc0hUTUxUYWJTZWxlY3RlZCgpKSB7Ci0JCQkJU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpCi0JCQkJCQkuZ2V0U291cmNlRWRpdCgpOwotCQkJCXN0eWxlZFRleHQuY3V0KCk7Ci0JCQl9IGVsc2UgewotCQkJCXJpY2hUZXh0LnNldENvcHlVUkwoKTsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQ1VUKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZpbmRSZXBsYWNlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvRmluZFJlcGxhY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjY3MWJjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvRmluZFJlcGxhY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkZpbmRSZXBsYWNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBGaW5kcyBhbmQgcmVwbGFjZXMgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZpbmRSZXBsYWNlQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogRmluZHMgdGV4dCBzdWIgYWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTkRfVEVYVCA9IDE7Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyB0ZXh0IHN1YiBhY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQTEFDRV9URVhUID0gMjsKLQotCS8qKgotCSAqIFJlcGxhY2VzIGFuZCBmaW5kcyB0ZXh0IHN1YiBhY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQTEFDRV9GSU5EX1RFWFQgPSAzOwotCi0JLyoqCi0JICogUmVwbGFjZXMgYWxsIHN1YiBhY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQTEFDRV9BTExfVEVYVCA9IDQ7Ci0KLQkvKioKLQkgKiBGaW5kIG1hdGNoIGluIGEgZm9yd2FyZCBkaXJlY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9SV0FSRF9NQVRDSCA9IDE7Ci0KLQkvKioKLQkgKiBGaW5kIG1hdGNoIGluIGEgYmFja3dhcmQgZGlyZWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBQ0tXQVJEX01BVENIID0gLTE7Ci0KLQkvKioKLQkgKiBXaG9sZSB3b3JkIG1hdGNoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdIT0xFX1dPUkRfTUFUQ0ggPSAyOwotCi0JLyoqCi0JICogQ2FzZSBzZW5zaXRpdmUgbWF0Y2guCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FTRV9TRU5TSVRJVkVfTUFUQ0ggPSA0OwotCi0JLy8gRW5jb2RlZCBzaW5nbGUgcXVvdGUuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ERURfU0lOR0xFX1FVT1RFID0gIiVzcSUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIElSaWNoVGV4dCByaWNoVGV4dDsKLQotCXByaXZhdGUgU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZm91bmRNYXRjaCA9IGZhbHNlOwotCQotCS8vIHRoZSBkaWFsb2cgaW5zdGFuY2UKLQlwcm90ZWN0ZWQgRmluZFJlcGxhY2VEaWFsb2cgZGlhbG9nOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRmluZFJlcGxhY2VBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldEltYWdlKFJpY2hUZXh0SW1hZ2VzLklNR19GSU5EX1JFUExBQ0UpOwotCQlzZXREaXNhYmxlZEltYWdlKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19GSU5EX1JFUExBQ0UpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5maW5kUmVwbGFjZUFjdGlvbl90b29sVGlwVGV4dCk7Ci0JCXNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHJlYWRvbmx5IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluUmVhZE9ubHlNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHNvdXJjZSBlZGl0IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluU291cmNlTW9kZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHRoaXMucmljaFRleHQgPT0gbnVsbCkKLQkJCXRoaXMucmljaFRleHQgPSByaWNoVGV4dDsKLQkJaWYgKHRoaXMucmljaFRleHQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZGlhbG9nICE9IG51bGwpIHsKLQkJCQkJZGlhbG9nLnNldEZpbmRPbmx5KCF0aGlzLnJpY2hUZXh0LmdldEVkaXRhYmxlKCkpOwotCQkJCQlkaWFsb2cub3BlbigpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRpYWxvZyA9IG5ldyBGaW5kUmVwbGFjZURpYWxvZyhEaXNwbGF5Ci0JCQkJCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCB0aGlzLCAhdGhpcy5yaWNoVGV4dAotCQkJCQkJCS5nZXRFZGl0YWJsZSgpKTsKLQkJCQkJZGlhbG9nLm9wZW4oKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBtYXRjaCBpcyBmb3VuZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgbWF0Y2ggaXMgZm91bmQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0Rm91bmRNYXRjaCgpIHsKLQkJcmV0dXJuIGZvdW5kTWF0Y2g7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc3ViQWN0aW9uCi0JICogICAgICAgICAgICB0aGUgc3ViIGFjdGlvbiB0byBleGVjdXRlCi0JICogQHBhcmFtIGZpbmRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZmluZCB0ZXh0Ci0JICogQHBhcmFtIHJlcGxhY2VUZXh0Ci0JICogICAgICAgICAgICB0aGUgcmVwbGFjZSB0ZXh0Ci0JICogQHBhcmFtIG1hdGNoRGlyCi0JICogICAgICAgICAgICB0aGUgbWF0Y2ggZGlyZWN0aW9uOyB0aGUgdmFsdWUgY2FuIGVpdGhlciBiZQotCSAqICAgICAgICAgICAgPGNvZGU+RklORF9GT1JXQVJEPC9jb2RlPiBvciA8Y29kZT5GSU5EX0JBQ0tXQVJEPC9jb2RlPi4KLQkgKiBAcGFyYW0gbWF0Y2hPcHRpb25zCi0JICogICAgICAgICAgICB0aGUgbWF0Y2ggb3B0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihpbnQgc3ViQWN0aW9uLCBTdHJpbmcgZmluZFRleHQsIFN0cmluZyByZXBsYWNlVGV4dCwKLQkJCWludCBtYXRjaERpciwgaW50IG1hdGNoT3B0aW9ucykgewotCQlzdHlsZWRUZXh0ID0gbnVsbDsKLQkJaWYgKHJpY2hUZXh0IGluc3RhbmNlb2YgUmljaFRleHRFZGl0b3IKLQkJCQkmJiAoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkuaXNIVE1MVGFiU2VsZWN0ZWQoKSkgewotCQkJc3R5bGVkVGV4dCA9ICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KS5nZXRTb3VyY2VFZGl0KCk7Ci0JCX0KLQkJaWYgKHN0eWxlZFRleHQgPT0gbnVsbCkgewotCQkJaWYgKGZpbmRUZXh0LmluZGV4T2YoIiciKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJZmluZFRleHQgPSBmaW5kVGV4dC5yZXBsYWNlQWxsKCInIiwgRU5DT0RFRF9TSU5HTEVfUVVPVEUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAocmVwbGFjZVRleHQuaW5kZXhPZigiJyIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXBsYWNlVGV4dCA9IHJlcGxhY2VUZXh0LnJlcGxhY2VBbGwoIiciLCBFTkNPREVEX1NJTkdMRV9RVU9URSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJZm91bmRNYXRjaCA9IGZhbHNlOwotCQkJaW50IHN0YXR1cyA9IDA7Ci0JCQlzd2l0Y2ggKHN1YkFjdGlvbikgewotCQkJY2FzZSBGSU5EX1RFWFQ6Ci0JCQkJc3RhdHVzID0gZmluZFRleHQoZmluZFRleHQsIG1hdGNoRGlyLCBtYXRjaE9wdGlvbnMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRVBMQUNFX1RFWFQ6Ci0JCQkJc3RhdHVzID0gcmVwbGFjZVRleHQocmVwbGFjZVRleHQsIG1hdGNoRGlyLCBtYXRjaE9wdGlvbnMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRVBMQUNFX0ZJTkRfVEVYVDoKLQkJCQlzdGF0dXMgPSByZXBsYWNlRmluZFRleHQoZmluZFRleHQsIHJlcGxhY2VUZXh0LCBtYXRjaERpciwKLQkJCQkJCW1hdGNoT3B0aW9ucyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFUExBQ0VfQUxMX1RFWFQ6Ci0JCQkJcmVwbGFjZUFsbChmaW5kVGV4dCwgcmVwbGFjZVRleHQsIG1hdGNoT3B0aW9ucyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoc3RhdHVzID4gMCkKLQkJCQlmb3VuZE1hdGNoID0gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEVzY2FwZXMgdGhlIGdpdmVuIHRleHQuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYmUgZXNjYXBlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgdGV4dFNpemUgPSB0ZXh0Lmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHRTaXplOyBpKyspIHsKLQkJCWNoYXIgY2ggPSB0ZXh0LmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJzwnOgotCQkJCXNiLmFwcGVuZChYTUxVdGlsLlhNTF9MVCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICc+JzoKLQkJCQlzYi5hcHBlbmQoWE1MVXRpbC5YTUxfR1QpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnJic6Ci0JCQkJc2IuYXBwZW5kKFhNTFV0aWwuWE1MX0FNUCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXNiLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZmluZFRleHQoU3RyaW5nIGZpbmRUZXh0LCBpbnQgbWF0Y2hEaXIsIGludCBtYXRjaE9wdGlvbnMpIHsKLQkJaW50IHN0YXR1cyA9IDA7Ci0JCWlmIChzdHlsZWRUZXh0ICE9IG51bGwpIHsKLQkJCXN0YXR1cyA9IHN0eWxlZFRleHRGaW5kVGV4dEFuZFNlbGVjdChmaW5kVGV4dCwgbWF0Y2hEaXIsCi0JCQkJCW1hdGNoT3B0aW9ucyk7Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0dXMgPSByaWNoVGV4dAotCQkJCQkuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkZJTkRfVEVYVCwgbmV3IFN0cmluZ1tdIHsKLQkJCQkJCQlmaW5kVGV4dCwgIiIgKyBtYXRjaERpciwgIiIgKyBtYXRjaE9wdGlvbnMgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkJCQkKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByaXZhdGUgaW50IHJlcGxhY2VUZXh0KFN0cmluZyByZXBsYWNlVGV4dCwgaW50IG1hdGNoRGlyLCBpbnQgbWF0Y2hPcHRpb25zKSB7Ci0JCWludCBzdGF0dXMgPSAwOwotCQlpZiAoc3R5bGVkVGV4dCAhPSBudWxsKSB7Ci0JCQlzdGF0dXMgPSBzdHlsZWRUZXh0UmVwbGFjZVRleHRBbmRTZWxlY3QocmVwbGFjZVRleHQpOwotCQl9IGVsc2UgewotCQkJc3RhdHVzID0gcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlJFUExBQ0VfVEVYVCwKLQkJCQkJbmV3IFN0cmluZ1tdIHsgcmVwbGFjZVRleHQsCi0JCQkJCQkJIiIgKyBtYXRjaERpciwgIiIgKyBtYXRjaE9wdGlvbnMgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkJCQkJCi0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIGludCByZXBsYWNlRmluZFRleHQoU3RyaW5nIGZpbmRUZXh0LCBTdHJpbmcgcmVwbGFjZVRleHQsCi0JCQlpbnQgbWF0Y2hEaXIsIGludCBtYXRjaE9wdGlvbnMpIHsKLQkJaW50IHN0YXR1cyA9IDA7Ci0JCWlmIChzdHlsZWRUZXh0ICE9IG51bGwpIHsKLQkJCXN0eWxlZFRleHRSZXBsYWNlVGV4dEFuZFNlbGVjdChyZXBsYWNlVGV4dCk7Ci0JCQlzdGF0dXMgPSBzdHlsZWRUZXh0RmluZFRleHRBbmRTZWxlY3QoZmluZFRleHQsIG1hdGNoRGlyLAotCQkJCQltYXRjaE9wdGlvbnMpOwotCQl9IGVsc2UgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlJFUExBQ0VfVEVYVCwgbmV3IFN0cmluZ1tdIHsKLQkJCQkJcmVwbGFjZVRleHQsICIiICsgbWF0Y2hEaXIsICIiICsgbWF0Y2hPcHRpb25zIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXN0YXR1cyA9IHJpY2hUZXh0Ci0JCQkJCS5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuRklORF9URVhULCBuZXcgU3RyaW5nW10gewotCQkJCQkJCWZpbmRUZXh0LCAiIiArIG1hdGNoRGlyLCAiIiArIG1hdGNoT3B0aW9ucyB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVwbGFjZUFsbChTdHJpbmcgZmluZFRleHQsIFN0cmluZyByZXBsYWNlVGV4dCwKLQkJCWludCBtYXRjaE9wdGlvbnMpIHsKLQkJaWYgKHN0eWxlZFRleHQgIT0gbnVsbCkgewotCQkJc3R5bGVkVGV4dFJlcGxhY2VBbGwoZmluZFRleHQsIHJlcGxhY2VUZXh0LCBtYXRjaE9wdGlvbnMpOwotCQl9IGVsc2UgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlJFUExBQ0VfQUxMX1RFWFQsCi0JCQkJCW5ldyBTdHJpbmdbXSB7IGVzY2FwZShmaW5kVGV4dCksIGVzY2FwZShyZXBsYWNlVGV4dCksCi0JCQkJCQkJIiIgKyBtYXRjaE9wdGlvbnMgfSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IHN0eWxlZFRleHRGaW5kVGV4dEFuZFNlbGVjdChTdHJpbmcgZmluZFRleHQsIGludCBtYXRjaERpciwKLQkJCWludCBtYXRjaE9wdGlvbnMpIHsKLQkJUG9pbnQgc2VsZWN0aW9uT2Zmc2V0ID0gc3R5bGVkVGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpOwotCQlpbnQgZmlyc3RTZWxlY3RlZE9mZnNldCA9IHNlbGVjdGlvbk9mZnNldC54OwotCQlpbnQgbGFzdFNlbGVjdGVkT2Zmc2V0ID0gc2VsZWN0aW9uT2Zmc2V0LnggKyBzZWxlY3Rpb25PZmZzZXQueSAtIDE7Ci0JCVN0cmluZyBodG1sVGV4dCA9IHN0eWxlZFRleHQuZ2V0VGV4dCgpOwotCQlpbnQgaW5kZXhPZk1hdGNoID0gLTE7Ci0JCWlmICgobWF0Y2hPcHRpb25zICYgQ0FTRV9TRU5TSVRJVkVfTUFUQ0gpID09IDApIHsKLQkJCS8vIFRPRE86IHVzZSB0b1VwcGVyQ2FzZShMb2NhbGUpIG9uY2UgbGlicmFyeSBoYXMgbG9jYWxlIGF0dHJpYnV0ZQotCQkJaHRtbFRleHQgPSBodG1sVGV4dC50b1VwcGVyQ2FzZSgpOwotCQkJZmluZFRleHQgPSBmaW5kVGV4dC50b1VwcGVyQ2FzZSgpOwotCQl9Ci0JCWRvIHsKLQkJCWlmIChpbmRleE9mTWF0Y2ggIT0gLTEpIHsKLQkJCQlsYXN0U2VsZWN0ZWRPZmZzZXQgPSBpbmRleE9mTWF0Y2ggKyAxOwotCQkJCWZpcnN0U2VsZWN0ZWRPZmZzZXQgPSBpbmRleE9mTWF0Y2ggLSAxOwotCQkJfQotCQkJaWYgKG1hdGNoRGlyID09IEZPUldBUkRfTUFUQ0gpIHsKLQkJCQlpbmRleE9mTWF0Y2ggPSBodG1sVGV4dC5pbmRleE9mKGZpbmRUZXh0LAotCQkJCQkJbGFzdFNlbGVjdGVkT2Zmc2V0ICsgMSk7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4T2ZNYXRjaCA9IGh0bWxUZXh0Lmxhc3RJbmRleE9mKGZpbmRUZXh0LAotCQkJCQkJZmlyc3RTZWxlY3RlZE9mZnNldCAtIDEpOwotCQkJfQotCQl9IHdoaWxlIChpbmRleE9mTWF0Y2ggIT0gLTEKLQkJCQkmJiAoKG1hdGNoT3B0aW9ucyAmIFdIT0xFX1dPUkRfTUFUQ0gpID09IFdIT0xFX1dPUkRfTUFUQ0gpCi0JCQkJJiYgaXNQYXJ0T2ZXb3JkKGh0bWxUZXh0LCBpbmRleE9mTWF0Y2gsIGZpbmRUZXh0Lmxlbmd0aCgpKSk7Ci0JCWlmIChpbmRleE9mTWF0Y2ggIT0gLTEpIHsKLQkJCXN0eWxlZFRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoaW5kZXhPZk1hdGNoLCBmaW5kVGV4dC5sZW5ndGgoKSk7Ci0JCQlzdHlsZWRUZXh0LnNob3dTZWxlY3Rpb24oKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBzZWxlY3RlZFRleHQgPSBzdHlsZWRUZXh0LmdldFNlbGVjdGlvblRleHQoKTsKLQkJCWlmICgobWF0Y2hPcHRpb25zICYgQ0FTRV9TRU5TSVRJVkVfTUFUQ0gpID09IDApIHsKLQkJCQlzZWxlY3RlZFRleHQgPSBzZWxlY3RlZFRleHQudG9VcHBlckNhc2UoKTsKLQkJCX0KLQkJCWlmIChzZWxlY3RlZFRleHQuZXF1YWxzKGZpbmRUZXh0KSkgewotCQkJCWluZGV4T2ZNYXRjaCA9IHN0eWxlZFRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54OwotCQkJfQotCQl9Ci0JCXJldHVybiBpbmRleE9mTWF0Y2g7Ci0KLQl9Ci0KLQlwcml2YXRlIGludCBzdHlsZWRUZXh0UmVwbGFjZVRleHRBbmRTZWxlY3QoU3RyaW5nIHJlcGxhY2VUZXh0KSB7Ci0JCVBvaW50IHNlbGVjdGlvbk9mZnNldCA9IHN0eWxlZFRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKLQkJc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKHNlbGVjdGlvbk9mZnNldC54LCBzZWxlY3Rpb25PZmZzZXQueSwKLQkJCQlyZXBsYWNlVGV4dCk7Ci0JCXN0eWxlZFRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uT2Zmc2V0LngsIHJlcGxhY2VUZXh0Lmxlbmd0aCgpKTsKLQotCQlyZXR1cm4gMTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3R5bGVkVGV4dFJlcGxhY2VBbGwoU3RyaW5nIGZpbmRUZXh0LCBTdHJpbmcgcmVwbGFjZVRleHQsCi0JCQlpbnQgbWF0Y2hPcHRpb25zKSB7Ci0JCXN0eWxlZFRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMCk7Ci0JCXdoaWxlIChzdHlsZWRUZXh0RmluZFRleHRBbmRTZWxlY3QoZmluZFRleHQsIEZPUldBUkRfTUFUQ0gsCi0JCQkJbWF0Y2hPcHRpb25zKSAhPSAtMSkgewotCQkJc3R5bGVkVGV4dFJlcGxhY2VUZXh0QW5kU2VsZWN0KHJlcGxhY2VUZXh0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1dvcmRDaGFyKGNoYXIgYykgewotCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUGFydE9mV29yZChTdHJpbmcgdGV4dCwgaW50IGluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmIChpbmRleCA+IDApCi0JCQlpZiAoaXNXb3JkQ2hhcih0ZXh0LmNoYXJBdChpbmRleCAtIDEpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHRleHQubGVuZ3RoKCkgPj0gaW5kZXggKyBsZW5ndGgpCi0JCQlpZiAoaXNXb3JkQ2hhcih0ZXh0LmNoYXJBdChpbmRleCArIGxlbmd0aCkpKQotCQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElSaWNoVGV4dCBnZXRSaWNoVGV4dCgpIHsKLQkJcmV0dXJuIHJpY2hUZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJpY2hUZXh0KElSaWNoVGV4dCByaWNoVGV4dCkgewotCQl0aGlzLnJpY2hUZXh0ID0gcmljaFRleHQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChkaWFsb2cgIT0gbnVsbCkgewotCQkJZGlhbG9nLmNsb3NlKCk7Ci0JCQlkaWFsb2cgPSBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvRm9udE5hbWVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250TmFtZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMDk4MzMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250TmFtZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogU2V0cyB0aGUgZm9udCBuYW1lIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRm9udE5hbWVBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dENvbWJvQWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEZvbnROYW1lQWN0aW9uKGZpbmFsIElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5mb250TmFtZUFjdGlvbl90b29sVGlwVGV4dCk7Ci0JCS8vIGdldCBzeXN0ZW0gZm9udHMKLQkJU29ydGVkU2V0IGZvbnRTZXQgPSBuZXcgVHJlZVNldCgpOwotCQlGb250RGF0YVtdIGZvbnRzID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Rm9udExpc3QobnVsbCwgdHJ1ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZm9udHMubGVuZ3RoOyBpKyspIHsKLQkJCWZvbnRTZXQuYWRkKCgoRm9udERhdGEpIGZvbnRzW2ldKS5nZXROYW1lKCkpOwotCQl9Ci0JCWFkZEl0ZW0oUmljaFRleHRSZXNvdXJjZXMuZm9udE5hbWVBY3Rpb25fRGVmYXVsdEZvbnROYW1lKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZm9udFNldC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBmb250TmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJYWRkSXRlbShmb250TmFtZSk7Ci0JCX0KLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQkJLy8gYWRkIGxpc3RlbmVyCi0JCXJpY2hUZXh0LmFkZExpc3RlbmVyKFNXVC5TRUxFQ1RFRCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlTdHJpbmcgZm9udE5hbWUgPSByaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmdldEZvbnROYW1lKCk7Ci0JCQkJaWYgKGZvbnROYW1lCi0JCQkJCQkuZXF1YWxzKFJpY2hUZXh0UmVzb3VyY2VzLmZvbnROYW1lQWN0aW9uX0NTU19EZWZhdWx0KQotCQkJCQkJfHwgZm9udE5hbWUKLQkJCQkJCQkJLmVxdWFscyhSaWNoVGV4dFJlc291cmNlcy5mb250TmFtZUFjdGlvbl9DU1NfRGVmYXVsdF9Nb3ppbGxhKQotCQkJCQkJfHwgZm9udE5hbWUuZXF1YWxzKCJkZWZhdWx0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlmb250TmFtZSA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnROYW1lQWN0aW9uX0RlZmF1bHRGb250TmFtZTsKLQkJCQl9Ci0JCQkJaW50IGluZGV4ID0gZmluZEZvbnROYW1lSW5JdGVtcyhmb250TmFtZSk7Ci0JCQkJY29tYm8uc2VsZWN0KGluZGV4KTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZmluZEZvbnROYW1lSW5JdGVtcyhTdHJpbmcgZm9udE5hbWUpIHsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGZvbnQgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCWluZGV4Kys7Ci0JCQlpZiAoZm9udC5lcXVhbHNJZ25vcmVDYXNlKGZvbnROYW1lKSkgewotCQkJCXJldHVybiBpbmRleDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGl0ZW1zLmdldChpbmRleCk7Ci0JCQlpZiAodmFsdWUuZXF1YWxzKFJpY2hUZXh0UmVzb3VyY2VzLmZvbnROYW1lQWN0aW9uX0RlZmF1bHRGb250TmFtZSkpIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX0ZPTlRfTkFNRSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRk9OVF9OQU1FLCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvRm9udFNpemVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250U2l6ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MGJjYWMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250U2l6ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogU2V0cyB0aGUgZm9udCBzaXplIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRm9udFNpemVBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dENvbWJvQWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEZvbnRTaXplQWN0aW9uKGZpbmFsIElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5mb250U2l6ZUFjdGlvbl90b29sVGlwVGV4dCk7Ci0JCWFkZEl0ZW0oIkRlZmF1bHQiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRJdGVtKCIxIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkSXRlbSgiMiIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEl0ZW0oIjMiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRJdGVtKCI0Iik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkSXRlbSgiNSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEl0ZW0oIjYiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRJdGVtKCI3Iik7IC8vJE5PTi1OTFMtMSQJCQotCQlzZXRFbmFibGVkKHRydWUpOwotCQkvLyBhZGQgbGlzdGVuZXIKLQkJcmljaFRleHQuYWRkTGlzdGVuZXIoU1dULlNFTEVDVEVELCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCS8vIG1vemlsbGEgcmV0dXJucyAiZGVmYXVsdCIgaWYgbm8gc2l6ZSBpcyBhcHBsaWVkCi0JCQkJLy8gSUUgcmV0dXJucyAyIGlmIG5vIHNpemUgaXMgYXBwbGllZAotCQkJCVN0cmluZyBmb250U2l6ZSA9IHJpY2hUZXh0LmdldFNlbGVjdGVkKCkuZ2V0Rm9udFNpemUoKTsKLQkJCQlpbnQgaW5kZXggPSAtMTsKLQkJCQlpZiAoZm9udFNpemUuZXF1YWxzKCJkZWZhdWx0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlpbmRleCA9IDA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWluZGV4ID0gSW50ZWdlci5wYXJzZUludChmb250U2l6ZSk7Ci0JCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBsZWF2ZSBpbmRleCBhdCAtMSBzbyBub3RoaW5nIGlzIHNlbGVjdGVkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJY29tYm8uc2VsZWN0KGluZGV4KTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlNFVF9GT05UX1NJWkUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX0ZPTlRfU0laRSwKLQkJCQkJCSIiICsgKGluZGV4KSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250U3R5bGVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250U3R5bGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTdlNjYxNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvRm9udFN0eWxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIFNldHMgdGhlIGZvbnQgc3R5bGUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGb250U3R5bGVBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dENvbWJvQWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEZvbnRTdHlsZUFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuZm9udFN0eWxlQWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQkJYWRkSXRlbShGb250U3R5bGUuTk9STUFMLmdldE5hbWUoKSk7Ci0JCWFkZEl0ZW0oRm9udFN0eWxlLlNFQ1RJT05fSEVBRElORy5nZXROYW1lKCkpOwotCQlhZGRJdGVtKEZvbnRTdHlsZS5TVUJTRUNUSU9OX0hFQURJTkcuZ2V0TmFtZSgpKTsKLQkJYWRkSXRlbShGb250U3R5bGUuU1VCX1NVQlNFQ1RJT05fSEVBRElORy5nZXROYW1lKCkpOwotCQlhZGRJdGVtKEZvbnRTdHlsZS5RVU9URS5nZXROYW1lKCkpOwotCQlhZGRJdGVtKEZvbnRTdHlsZS5DT0RFX1NBTVBMRS5nZXROYW1lKCkpOwotCQlzZXRFbmFibGVkKHRydWUpOwotCQkvLyBhZGQgbGlzdGVuZXIKLQkJaWYgKHJpY2hUZXh0IGluc3RhbmNlb2YgUmljaFRleHQpIHsKLQkJCWZpbmFsIFJpY2hUZXh0IHJ0ZSA9IChSaWNoVGV4dCkgcmljaFRleHQ7Ci0JCQlydGUuYWRkTGlzdGVuZXIoU1dULlNFTEVDVEVELCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkJU3RyaW5nIGJsb2NrU3R5bGUgPSBydGUuZ2V0U2VsZWN0ZWQoKS5nZXRCbG9ja1N0eWxlKCk7Ci0JCQkJCVN0cmluZyBuYW1lID0gRm9udFN0eWxlLmdldEZvbnRTdHlsZU5hbWUoYmxvY2tTdHlsZSk7Ci0JCQkJCWludCBpbmRleCA9IGl0ZW1zLmluZGV4T2YobmFtZSk7Ci0JCQkJCWNvbWJvLnNlbGVjdChpbmRleCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQsIGludCBpbmRleCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHZhbHVlID0gRm9udFN0eWxlLmdldEZvbnRTdHlsZShpbmRleCkuZ2V0VmFsdWUoKTsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRk9OVF9TVFlMRSwgdmFsdWUpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0lCYXNlUmljaFRleHRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JQmFzZVJpY2hUZXh0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5YmIwNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0lCYXNlUmljaFRleHRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi0vKioKLSAqIFRoZSBiYXNlIGludGVyZmFjZSBmb3IgYSByaWNoIHRleHQgYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQmFzZVJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRvb2wgdGlwIGZvciB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRvb2wgdGlwIHRleHQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sIHRpcCBmb3IgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFRpcFRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0b29sIHRpcCB0ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VG9vbFRpcFRleHQoU3RyaW5nIHRvb2xUaXBUZXh0KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuYWJsZWQgc3RhdHVzIG9mIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlbmFibGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RW5hYmxlZCgpOwotCi0JLyoqCi0JICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlbmFibGVkCi0JICogICAgICAgICAgICBJZiA8Y29kZT50cnVlPC9jb2RlPiwgZW5hYmxlIHRoZSBhY3Rpb24uIGlmCi0JICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4sIGRpc2FibGUgaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JUmljaFRleHRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JUmljaFRleHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGMwYTUxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSVJpY2hUZXh0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgcmljaCB0ZXh0IGJ1dHRvbiBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJpY2hUZXh0QWN0aW9uIGV4dGVuZHMgSUJhc2VSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmb3IgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBmb3IgdGhlIGFjdGlvbgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1hZ2UgZm9yIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgZm9yIHRoZSBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNhYmxlZCBpbWFnZSBmb3IgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkaXNhYmxlZCBpbWFnZSBmb3IgdGhlIGFjdGlvbgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXREaXNhYmxlZEltYWdlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkaXNhYmxlZCBpbWFnZSBmb3IgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiAgICAgICAgICAgIHRoZSBkaXNhYmxlZCBpbWFnZSBmb3IgdGhlIGFjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc2FibGVkSW1hZ2UoSW1hZ2UgaW1hZ2UpOwotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHJlYWRvbmx5IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluUmVhZE9ubHlNb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgYWN0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHRoZQotCSAqIHJpY2ggdGV4dCBlZGl0b3IgaXMgaW4gc291cmNlIGVkaXQgbW9kZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5Tb3VyY2VNb2RlKCk7Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBhY3Rpb24ncyBUb29sSXRlbQotCSAqIEBwYXJhbSB0b29sSXRlbQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvb2xJdGVtKFRvb2xJdGVtIHRvb2xJdGVtKTsKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBTV1QgVG9vbEl0ZW0gU3R5bGUgdG8gYmUgdXNlZCBmb3IgdGhpcyBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0eWxlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JUmljaFRleHRDb21ib0FjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0lSaWNoVGV4dENvbWJvQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4ZTgzYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0lSaWNoVGV4dENvbWJvQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSByaWNoIHRleHQgY29tYm8gYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSaWNoVGV4dENvbWJvQWN0aW9uIGV4dGVuZHMgSUJhc2VSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBBZGRzIGFuIGl0ZW0uCi0JICogCi0JICogQHBhcmFtIGl0ZW0KLQkgKiAgICAgICAgICAgIHRoZSBpdGVtIHRvIGJlIGFkZGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkSXRlbShTdHJpbmcgaXRlbSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBpdGVtcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGl0ZW1zCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEl0ZW1zKCk7Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQsIGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhY3Rpb24ncyBDQ29tYm8gd2lkZ2V0Ci0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tYm8oQ0NvbWJvIGNvbWJvKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0luZGVudEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0luZGVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNjdmMGU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JbmRlbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci0KLS8qKgotICogSW5kZW50cyB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEluZGVudEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEluZGVudEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0SW1hZ2UoUmljaFRleHRJbWFnZXMuSU1HX0lOREVOVCk7Ci0JCXNldERpc2FibGVkSW1hZ2UoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0lOREVOVCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmluZGVudEFjdGlvbl90b29sVGlwVGV4dCk7IAotCQlzZXRFbmFibGVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5JTkRFTlQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSXRhbGljQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSXRhbGljQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFmNGJhZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0l0YWxpY0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIFRvZ2dsZXMgdGhlICdpdGFsaWMnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSXRhbGljQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSXRhbGljQWN0aW9uKGZpbmFsIElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcigpOwotCQlzZXRJbWFnZShSaWNoVGV4dEltYWdlcy5JTUdfSVRBTElDKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuaXRhbGljQWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQkJLy8gYWRkIGxpc3RlbmVyCi0JCXJpY2hUZXh0LmFkZExpc3RlbmVyKFNXVC5TRUxFQ1RFRCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQl0b29sSXRlbS5zZXRTZWxlY3Rpb24ocmljaFRleHQuZ2V0U2VsZWN0ZWQoKS5pc0l0YWxpYygpKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLklUQUxJQyk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlJpY2hUZXh0QWN0aW9uI2dldFN0eWxlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0eWxlKCkgewotCQlyZXR1cm4gU1dULkNIRUNLOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0p1c3RpZnlDZW50ZXJBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5Q2VudGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE4OTUzOTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0p1c3RpZnlDZW50ZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci0KLS8qKgotICogQ2VudGVyIGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEp1c3RpZnlDZW50ZXJBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBKdXN0aWZ5Q2VudGVyQWN0aW9uKCkgewotCQlzdXBlcigpOwotCQlzZXRJbWFnZShSaWNoVGV4dEltYWdlcy5JTUdfSlVTVElGWV9DRU5URVIpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5qdXN0aWZ5Q2VudGVyQWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JCXNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkpVU1RJRllfQ0VOVEVSKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0p1c3RpZnlGdWxsQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeUZ1bGxBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2E0NWM5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeUZ1bGxBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci0KLS8qKgotICogRnVsbHkganVzdGlmaWVzIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSnVzdGlmeUZ1bGxBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBKdXN0aWZ5RnVsbEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0SW1hZ2UoUmljaFRleHRJbWFnZXMuSU1HX0pVU1RJRllfRlVMTCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmp1c3RpZnlGdWxsQWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JCXNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkpVU1RJRllfRlVMTCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5TGVmdEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0p1c3RpZnlMZWZ0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyNjhlMzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0p1c3RpZnlMZWZ0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotCi0vKioKLSAqIExlZnQganVzdGlmaWVzIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSnVzdGlmeUxlZnRBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBKdXN0aWZ5TGVmdEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0SW1hZ2UoUmljaFRleHRJbWFnZXMuSU1HX0pVU1RJRllfTEVGVCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmp1c3RpZnlMZWZ0QWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JCXNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkpVU1RJRllfTEVGVCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5UmlnaHRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5UmlnaHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOThlZTEzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeVJpZ2h0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotCi0vKioKLSAqIFJpZ2h0IGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEp1c3RpZnlSaWdodEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEp1c3RpZnlSaWdodEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0SW1hZ2UoUmljaFRleHRJbWFnZXMuSU1HX0pVU1RJRllfUklHSFQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5qdXN0aWZ5UmlnaHRBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSlVTVElGWV9SSUdIVCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9PdXRkZW50QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvT3V0ZGVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYmEzZGRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9PdXRkZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotCi0vKioKLSAqIEluZGVudHMgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRkZW50QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgT3V0ZGVudEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0SW1hZ2UoUmljaFRleHRJbWFnZXMuSU1HX09VVERFTlQpOwotCQlzZXREaXNhYmxlZEltYWdlKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19PVVRERU5UKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMub3V0ZGVudEFjdGlvbl90b29sVGlwVGV4dCk7IAotCQlzZXRFbmFibGVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5PVVRERU5UKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1Bhc3RlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUGFzdGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGNjOTI4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUGFzdGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5DbGlwYm9hcmRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuSFRNTFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogUGFzdGVzIHRleHQgZnJvbSB0aGUgY2xpcGJvYXJkIG9udG8gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXN0ZUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfVVJMID0gIlNvdXJjZVVSTDoiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNX0VYVCA9ICIuaHRtIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfRVhUID0gIi5odG1sIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBIUkVGX1JFRkVSRU5DRVMgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJImhyZWZcXHMqPVxccypcIiguKj8pXCIiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2ltYWdlX3JlZiA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiKDwoaW1nfGlmcmFtZSkuKj9zcmNcXHMqPVxccypcIikoLio/KShcIikiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHNvdXJjZVVSTFN0ciA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIExvZ2dlciBsb2dnZXI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFJFU09VUkNFUyA9ICJyZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQYXN0ZUFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0SW1hZ2UoUmljaFRleHRJbWFnZXMuSU1HX1BBU1RFKTsKLQkJc2V0RGlzYWJsZWRJbWFnZShSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfUEFTVEUpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5wYXN0ZUFjdGlvbl90b29sVGlwVGV4dCk7Ci0JCXNldEVuYWJsZWQodHJ1ZSk7Ci0JCWxvZ2dlciA9IFJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgYWN0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHRoZQotCSAqIHJpY2ggdGV4dCBlZGl0b3IgaXMgaW4gc291cmNlIGVkaXQgbW9kZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5Tb3VyY2VNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJY29weUxpbmtSZXNvdXJjZXMocmljaFRleHQpOwotCQkJaWYgKHJpY2hUZXh0IGluc3RhbmNlb2YgUmljaFRleHRFZGl0b3IKLQkJCQkJJiYgKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpLmlzSFRNTFRhYlNlbGVjdGVkKCkpIHsKLQkJCQlTdHlsZWRUZXh0IHN0eWxlZFRleHQgPSAoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkKLQkJCQkJCS5nZXRTb3VyY2VFZGl0KCk7Ci0JCQkJc3R5bGVkVGV4dC5wYXN0ZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuUEFTVEUsIHNvdXJjZVVSTFN0cik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIGxpbmsgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvcHlMaW5rUmVzb3VyY2VzKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQl0cnkgewotCQkJc291cmNlVVJMU3RyID0gQ2xpcGJvYXJkVXRpbC5nZXRIVE1MU291cmNlVVJMKCk7Ci0JCQlDbGlwYm9hcmQgY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZChEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCQlTdHJpbmcgaHRtbCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyhIVE1MVHJhbnNmZXIKLQkJCQkJLmdldEluc3RhbmNlKCkpOwotCQkJaWYgKGh0bWwgIT0gbnVsbCAmJiBodG1sLmxlbmd0aCgpID4gMCkgewotCQkJCVN0cmluZyBiYXNlUGF0aCA9IHJpY2hUZXh0LmdldEJhc2VQYXRoKCk7Ci0JCQkJVVJMIHNvdXJjZVVSTCA9IG51bGw7Ci0JCQkJaWYgKHNvdXJjZVVSTFN0ciA9PSBudWxsIHx8IHNvdXJjZVVSTFN0ci5sZW5ndGgoKSA9PSAwCi0JCQkJCQl8fCBzb3VyY2VVUkxTdHIuZXF1YWxzKCJhYm91dDpibGFuayIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc291cmNlVVJMID0gcmljaFRleHQuZ2V0Q29weVVSTCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNvdXJjZVVSTCA9IG5ldyBVUkwoc291cmNlVVJMU3RyKTsKLQkJCQl9Ci0KLQkJCQlNYXRjaGVyIG1hdGNoZXIgPSBIUkVGX1JFRkVSRU5DRVMubWF0Y2hlcihodG1sKTsKLQkJCQl3aGlsZSAobWF0Y2hlci5maW5kKCkpIHsKLQkJCQkJU3RyaW5nIGhyZWYgPSBOZXRVdGlsLmRlY29kZVVSTChtYXRjaGVyLmdyb3VwKDEpKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVVSTCBocmVmVVJMID0gbmV3IFVSTChzb3VyY2VVUkwsIGhyZWYpOwotCQkJCQkJU3RyaW5nIHNjaGVtZSA9IGhyZWZVUkwuZ2V0UHJvdG9jb2woKTsKLQkJCQkJCWlmIChzY2hlbWUgIT0gbnVsbAotCQkJCQkJCQkmJiBzY2hlbWUKLQkJCQkJCQkJCQkuZXF1YWxzSWdub3JlQ2FzZShOZXRVdGlsLkZJTEVfU0NIRU1FKSkgewotCQkJCQkJCVN0cmluZyB1cmwgPSBocmVmVVJMLmdldFBhdGgoKTsKLQkJCQkJCQlGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZSh1cmwpOwotCQkJCQkJCUZpbGUgdGd0RmlsZSA9IG51bGw7Ci0JCQkJCQkJRmlsZSB0Z3REaXIgPSBudWxsOwotCQkJCQkJCWlmIChocmVmLnN0YXJ0c1dpdGgoUkVTT1VSQ0VTKSB8fCBocmVmLnN0YXJ0c1dpdGgoIi4vIiArIFJFU09VUkNFUykpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl0Z3RGaWxlID0gbmV3IEZpbGUoYmFzZVBhdGgsIGhyZWYpOwotCQkJCQkJCQl0Z3REaXIgPSB0Z3RGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlTdHJpbmcgcmVzUGF0aCA9IGdldFN1YmRpcmVjdG9yeU9mUmVzb3VyY2VzKGhyZWYpOwotCQkJCQkJCQl0Z3RGaWxlID0gbmV3IEZpbGUoYmFzZVBhdGggKyBSRVNPVVJDRVMsIHJlc1BhdGgpOwotCQkJCQkJCQl0Z3REaXIgPSB0Z3RGaWxlOwotCQkJCQkJCX0KLQkJCQkJCQl0Z3REaXIubWtkaXJzKCk7Ci0JCQkJCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjRmlsZSwgdGd0RGlyKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCW1hdGNoZXIgPSBwX2ltYWdlX3JlZi5tYXRjaGVyKGh0bWwpOwotCQkJCXdoaWxlIChtYXRjaGVyLmZpbmQoKSkgewotCQkJCQlTdHJpbmcgc3JjID0gTmV0VXRpbC5kZWNvZGVVUkwobWF0Y2hlci5ncm91cCgzKSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlVUkwgc3JjVVJMID0gbmV3IFVSTChzb3VyY2VVUkwsIHNyYyk7Ci0JCQkJCQlTdHJpbmcgc2NoZW1lID0gc3JjVVJMLmdldFByb3RvY29sKCk7Ci0JCQkJCQlpZiAoc2NoZW1lICE9IG51bGwKLQkJCQkJCQkJJiYgc2NoZW1lLmVxdWFsc0lnbm9yZUNhc2UoTmV0VXRpbC5GSUxFX1NDSEVNRSkpIHsKLQkJCQkJCQlGaWxlIHNyY0ZpbGUgPSBudWxsOwotCQkJCQkJCVN0cmluZyBhdXRob3JpdHkgPSBzcmNVUkwuZ2V0QXV0aG9yaXR5KCk7Ci0JCQkJCQkJaWYgKGF1dGhvcml0eSAhPSBudWxsKSB7Ci0JCQkJCQkJCXNyY0ZpbGUgPSBuZXcgRmlsZShhdXRob3JpdHkgKyBzcmNVUkwuZ2V0UGF0aCgpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlzcmNGaWxlID0gbmV3IEZpbGUoc3JjVVJMLmdldFBhdGgoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCUZpbGUgdGd0RmlsZSA9IG51bGw7Ci0JCQkJCQkJRmlsZSB0Z3REaXIgPSBudWxsOwotCQkJCQkJCWlmIChzcmMuc3RhcnRzV2l0aChSRVNPVVJDRVMpIHx8IHNyYy5zdGFydHNXaXRoKCIuLyIgKyBSRVNPVVJDRVMpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJdGd0RmlsZSA9IG5ldyBGaWxlKGJhc2VQYXRoLCBzcmMpOwotCQkJCQkJCQl0Z3REaXIgPSB0Z3RGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlTdHJpbmcgcmVzUGF0aCA9IGdldFN1YmRpcmVjdG9yeU9mUmVzb3VyY2VzKHNyYyk7Ci0JCQkJCQkJCXRndEZpbGUgPSBuZXcgRmlsZShiYXNlUGF0aCArIFJFU09VUkNFUywgcmVzUGF0aCk7Ci0JCQkJCQkJCXRndERpciA9IHRndEZpbGU7Ci0JCQkJCQkJfQotCQkJCQkJCXRndERpci5ta2RpcnMoKTsKLQkJCQkJCQlGaWxlVXRpbC5jb3B5RmlsZShzcmNGaWxlLCB0Z3REaXIpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIHRoZSBnaXZlbiBIVE1MIGNvbnRlbnQgZnJvbSB0aGUgY2xpcGJvYXJkIGFuZCByZXR1cm5zIHRoZSBzb3VyY2UKLQkgKiBVUkwuCi0JICogCi0JICogQHBhcmFtIGh0bWxDb250ZW50Ci0JICogICAgICAgICAgICB0aGUgSFRNTCBjb250ZW50IGZyb20gdGhlIGNsaXBib2FyZAotCSAqIEByZXR1cm4gdGhlIHNvdXJjZSBVUkwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNvdXJjZVVSTChTdHJpbmcgaHRtbENvbnRlbnQpIHsKLQkJU3RyaW5nIHNvdXJjZVVSTCA9IG51bGw7Ci0JCWludCBzb3VyY2VVUkxJbmRleCA9IGh0bWxDb250ZW50LmluZGV4T2YoU09VUkNFX1VSTCk7Ci0JCWlmIChzb3VyY2VVUkxJbmRleCA+IDApIHsKLQkJCXNvdXJjZVVSTCA9IGh0bWxDb250ZW50LnN1YnN0cmluZyhzb3VyY2VVUkxJbmRleAotCQkJCQkrIFNPVVJDRV9VUkwubGVuZ3RoKCkpOwotCQkJc291cmNlVVJMID0gc291cmNlVVJMLnN1YnN0cmluZygwLCBzb3VyY2VVUkwKLQkJCQkJLmluZGV4T2YoRmlsZVV0aWwuTElORV9TRVApKTsKLQkJCWlmIChzb3VyY2VVUkwudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChIVE1fRVhUKQotCQkJCQl8fCBzb3VyY2VVUkwudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChIVE1MX0VYVCkpIHsKLQkJCQlzb3VyY2VVUkwgPSBzb3VyY2VVUkwuc3Vic3RyaW5nKDAsIHNvdXJjZVVSTC5pbmRleE9mKEZpbGVVdGlsCi0JCQkJCQkuZ2V0RmlsZU5hbWUoc291cmNlVVJMKSkgLSAxKTsKLQkJCQlzb3VyY2VVUkwgPSBzb3VyY2VVUkwucmVwbGFjZSgnXFwnLCAnLycpOwotCQkJfQotCQkJc291cmNlVVJMID0gRmlsZVV0aWwuYXBwZW5kU2VwYXJhdG9yKHNvdXJjZVVSTCwgIi8iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzb3VyY2VVUkw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdWJkaXJlY3RvcnlPZlJlc291cmNlcyhTdHJpbmcgcGF0aCkgewotCQlTdHJpbmcgcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IHJlc19pZHggPSBwYXRoLmluZGV4T2YoUkVTT1VSQ0VTKTsKLQkJaWYgKHJlc19pZHggIT0gLTEpIHsKLQkJCVN0YWNrIHN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JCQlGaWxlIHJlbGF0aXZlID0gbmV3IEZpbGUocGF0aCkuZ2V0UGFyZW50RmlsZSgpOwotCQkJd2hpbGUgKCFyZWxhdGl2ZS5nZXROYW1lKCkuZXF1YWxzKFJFU09VUkNFUykpIHsKLQkJCQlzdGFjay5wdXNoKHJlbGF0aXZlLmdldE5hbWUoKSk7Ci0JCQkJcmVsYXRpdmUgPSByZWxhdGl2ZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQl9Ci0JCQl3aGlsZSAoIXN0YWNrLmlzRW1wdHkoKSkgewotCQkJCXJlc3VsdCA9IHJlc3VsdCArIChTdHJpbmcpc3RhY2sucG9wKCkgKyBGaWxlLnNlcGFyYXRvcjsKLQkJCX0KLQkJfSAKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUGFzdGVQbGFpblRleHRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9QYXN0ZVBsYWluVGV4dEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNWZiOGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9QYXN0ZVBsYWluVGV4dEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotcHVibGljIGNsYXNzIFBhc3RlUGxhaW5UZXh0QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFBhc3RlUGxhaW5UZXh0QWN0aW9uKCkgewotCQlzdXBlcigpOwotCQkvLyBUT0RPIG5lZWQgaW1hZ2UKLQkJc2V0SW1hZ2UoUmljaFRleHRJbWFnZXMuSU1HX1BBU1RFKTsKLQkJLy8gVE9ETyBuZWVkIGltYWdlCi0JCXNldERpc2FibGVkSW1hZ2UoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX1BBU1RFKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMucGFzdGVQbGFpblRleHRBY3Rpb25fdG9vbFRpcFRleHQpOwotCQlzZXRFbmFibGVkKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgYWN0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHRoZQotCSAqIHJpY2ggdGV4dCBlZGl0b3IgaXMgaW4gc291cmNlIGVkaXQgbW9kZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5Tb3VyY2VNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQkvLyBnZXQgdGV4dCBmcm9tIGNsaXBib2FyZAotCQkJQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQkJU3RyaW5nIHRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHMoVGV4dFRyYW5zZmVyCi0JCQkJCS5nZXRJbnN0YW5jZSgpKTsKLQkJCWlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQl0ZXh0ID0gU3RyVXRpbC5jb252ZXJ0TmV3bGluZXNUb0hUTUwodGV4dCk7Ci0JCQkJaWYgKHJpY2hUZXh0IGluc3RhbmNlb2YgUmljaFRleHRFZGl0b3IpIHsKLQkJCQkJKChSaWNoVGV4dEVkaXRvcilyaWNoVGV4dCkuYWRkSFRNTCh0ZXh0KTsKLQkJCQl9IGVsc2UgewotCQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX0hUTUwsIHRleHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1JpY2hUZXh0QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUmljaFRleHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODIxZGQ2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUmljaFRleHRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIGEgcmljaCB0ZXh0IGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJpY2hUZXh0QWN0aW9uIGV4dGVuZHMgQmFzZVJpY2hUZXh0QWN0aW9uIGltcGxlbWVudHMKLQkJSVJpY2hUZXh0QWN0aW9uIHsKLQotCXByb3RlY3RlZCBJbWFnZSBpbWFnZTsKLQotCXByb3RlY3RlZCBJbWFnZSBkaXNhYmxlZEltYWdlOwotCi0JcHJvdGVjdGVkIFRvb2xJdGVtIHRvb2xJdGVtOwotCi0JcHVibGljIFJpY2hUZXh0QWN0aW9uKCkgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIFJpY2hUZXh0QWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGZvciB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGZvciB0aGUgYWN0aW9uCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1hZ2UgZm9yIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgZm9yIHRoZSBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSkgewotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzYWJsZWQgaW1hZ2UgZm9yIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgZGlzYWJsZWQgaW1hZ2UgZm9yIHRoZSBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0RGlzYWJsZWRJbWFnZSgpIHsKLQkJcmV0dXJuIGRpc2FibGVkSW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGlzYWJsZWQgaW1hZ2UgZm9yIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGRpc2FibGVkSW1hZ2UKLQkgKiAgICAgICAgICAgIHRoZSBkaXNhYmxlZCBpbWFnZSBmb3IgdGhlIGFjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc2FibGVkSW1hZ2UoSW1hZ2UgZGlzYWJsZWRJbWFnZSkgewotCQl0aGlzLmRpc2FibGVkSW1hZ2UgPSBkaXNhYmxlZEltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiByZWFkb25seSBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblJlYWRPbmx5TW9kZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHNvdXJjZSBlZGl0IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluU291cmNlTW9kZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRUb29sSXRlbShUb29sSXRlbSB0b29sSXRlbSkgewotCQl0aGlzLnRvb2xJdGVtID0gdG9vbEl0ZW07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5JUmljaFRleHRBY3Rpb24jZ2V0U3R5bGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3R5bGUoKSB7Ci0JCXJldHVybiBTV1QuTk9ORTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9SaWNoVGV4dENvbWJvQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUmljaFRleHRDb21ib0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NTA4M2NiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9SaWNoVGV4dENvbWJvQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiBhIHJpY2ggdGV4dCBjb21ibyBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSaWNoVGV4dENvbWJvQWN0aW9uIGV4dGVuZHMgQmFzZVJpY2hUZXh0QWN0aW9uIGltcGxlbWVudHMKLQkJSVJpY2hUZXh0Q29tYm9BY3Rpb24gewotCi0JcHJvdGVjdGVkIExpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgQ0NvbWJvIGNvbWJvOwotCi0JLyoqCi0JICogQWRkcyBhIGNvbWJvIGl0ZW0uCi0JICogCi0JICogQHBhcmFtIGl0ZW1UZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgYSBjb21ibyBpdGVtCi0JICovCi0JcHVibGljIHZvaWQgYWRkSXRlbShTdHJpbmcgaXRlbVRleHQpIHsKLQkJaXRlbXMuYWRkKGl0ZW1UZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGNvbWJvIGl0ZW1zLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY29tYm8gaXRlbXMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0SXRlbXMoKSB7Ci0JCXJldHVybiAoU3RyaW5nW10pIGl0ZW1zLnRvQXJyYXkobmV3IFN0cmluZ1tpdGVtcy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQsIGludCBpbmRleCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLklSaWNoVGV4dENvbWJvQWN0aW9uI3NldENvbWJvKG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbWJvKENDb21ibyBjb21ibykgewotCQl0aGlzLmNvbWJvID0gY29tYm87Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1N1YnNjcmlwdEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1N1YnNjcmlwdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNjM0ODA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9TdWJzY3JpcHRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBUb2dnbGVzIHRoZSBzdWJzY3JpcHQgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJzY3JpcHRBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTdWJzY3JpcHRBY3Rpb24oZmluYWwgSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKCk7Ci0JCXNldEltYWdlKFJpY2hUZXh0SW1hZ2VzLklNR19TVUJTQ1JJUFQpOwotCQlzZXREaXNhYmxlZEltYWdlKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19TVUJTQ1JJUFQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5zdWJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQpOwotCQlzZXRFbmFibGVkKHRydWUpOwotCQkvLyBhZGQgbGlzdGVuZXIKLQkJcmljaFRleHQuYWRkTGlzdGVuZXIoU1dULlNFTEVDVEVELCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCXRvb2xJdGVtLnNldFNlbGVjdGlvbihyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmlzU3Vic2NyaXB0KCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU1VCU0NSSVBUKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuUmljaFRleHRBY3Rpb24jZ2V0U3R5bGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3R5bGUoKSB7Ci0JCXJldHVybiBTV1QuQ0hFQ0s7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvU3VwZXJzY3JpcHRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9TdXBlcnNjcmlwdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzN2RmNGI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9TdXBlcnNjcmlwdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIFRvZ2dsZXMgdGhlIHN1cGVyc2NyaXB0IGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dAotICogY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN1cGVyc2NyaXB0QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU3VwZXJzY3JpcHRBY3Rpb24oZmluYWwgSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKCk7Ci0JCXNldEltYWdlKFJpY2hUZXh0SW1hZ2VzLklNR19TVVBFUlNDUklQVCk7Ci0JCXNldERpc2FibGVkSW1hZ2UoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX1NVUEVSU0NSSVBUKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuc3VwZXJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQpOwotCQlzZXRFbmFibGVkKHRydWUpOwotCQkvLyBhZGQgbGlzdGVuZXIKLQkJcmljaFRleHQuYWRkTGlzdGVuZXIoU1dULlNFTEVDVEVELCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCXRvb2xJdGVtLnNldFNlbGVjdGlvbihyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmlzU3VwZXJzY3JpcHQoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TVVBFUlNDUklQVCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlJpY2hUZXh0QWN0aW9uI2dldFN0eWxlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0eWxlKCkgewotCQlyZXR1cm4gU1dULkNIRUNLOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1VuZGVybGluZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1VuZGVybGluZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MDQ2OTBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9VbmRlcmxpbmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBUb2dnbGVzIHRoZSB1bmRlcmxpbmUgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmRlcmxpbmVBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBVbmRlcmxpbmVBY3Rpb24oZmluYWwgSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKCk7Ci0JCXNldEltYWdlKFJpY2hUZXh0SW1hZ2VzLklNR19VTkRFUkxJTkUpOwotCQlzZXREaXNhYmxlZEltYWdlKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19VTkRFUkxJTkUpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy51bmRlcmxpbmVBY3Rpb25fdG9vbFRpcFRleHQpOwotCQlzZXRFbmFibGVkKHRydWUpOwotCQkvLyBhZGQgbGlzdGVuZXIKLQkJcmljaFRleHQuYWRkTGlzdGVuZXIoU1dULlNFTEVDVEVELCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCXRvb2xJdGVtLnNldFNlbGVjdGlvbihyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmlzVW5kZXJMaW5lKCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuVU5ERVJMSU5FKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuUmljaFRleHRBY3Rpb24jZ2V0U3R5bGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3R5bGUoKSB7Ci0JCXJldHVybiBTV1QuQ0hFQ0s7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjNkOWU2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZWRpdGluZyBhY3Rpb25zIGZvciB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgYW5kIGVkaXRvci4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvQWRkSW1hZ2VEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9BZGRJbWFnZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmM2UxYjFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9BZGRJbWFnZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIGltYWdlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIEhUTUwKLSAqIDxpbWc+IHRhZyBpbiB0aGUgcmljaCB0ZXh0IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRJbWFnZURpYWxvZyBleHRlbmRzIEJhc2VEaWFsb2cgewotCi0JcHJvdGVjdGVkIEltYWdlIGltYWdlID0gbmV3IEltYWdlKCk7Ci0KLQlwcm90ZWN0ZWQgVGV4dCB1cmxUZXh0OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0aW9uQWRhcHRlciBicm93c2VTZWxlY3Rpb25BZGFwdGVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuT1BFTik7Ci0JCQlkaWFsb2cKLQkJCQkJLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsKLQkJCQkJCQkiKi5naWYiLCAiKi5qcGciLCAiKi5ibXAiIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJU3RyaW5nIGltYWdlRmlsZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAoaW1hZ2VGaWxlICE9IG51bGwgJiYgaW1hZ2VGaWxlLmxlbmd0aCgpID4gMCkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGltYWdlRmlsZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIHVybCA9IGZpbGUudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQkJCQl1cmxUZXh0LnNldFRleHQodXJsKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciB1cmxUZXh0TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJaWYgKG9rQnV0dG9uICE9IG51bGwpIHsKLQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKHVybFRleHQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHBhcmVudCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqLwotCXB1YmxpYyBBZGRJbWFnZURpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEJhc2VEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQotCQlMYWJlbCB1cmxMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdXJsTGFiZWwuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy51cmxMYWJlbF90ZXh0KTsgCi0JCXVybFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCXVybFRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXVybFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIodXJsVGV4dExpc3RlbmVyKTsKLQotCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5icm93c2VCdXR0b25fdGV4dCk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihicm93c2VTZWxlY3Rpb25BZGFwdGVyKTsKLQotCQlzdXBlci5nZXRTaGVsbCgpLnNldFRleHQoCi0JCQkJUmljaFRleHRSZXNvdXJjZXMuYWRkSW1hZ2VEaWFsb2dfdGl0bGUpOyAKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQmFzZURpYWxvZyNjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCVN0cmluZyB1cmwgPSB1cmxUZXh0LmdldFRleHQoKTsKLQkJaWYgKHVybCAhPSBudWxsICYmIHVybC5sZW5ndGgoKSA+IDApIHsKLQkJCWltYWdlLnNldFVSTCh1cmwpOwotCQl9Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPkltYWdlPC9jb2RlPiBvYmplY3QuCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9BZGRMaW5rRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvQWRkTGlua0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDNlNGUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9BZGRMaW5rRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogUHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBmaWxlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIEhUTUwgPGE+Ci0gKiB0YWcgaW4gdGhlIHJpY2ggdGV4dCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkTGlua0RpYWxvZyBleHRlbmRzIEJhc2VEaWFsb2cgewotCi0JcHJvdGVjdGVkIExpbmsgbGluayA9IG5ldyBMaW5rKCk7Ci0KLQlwcm90ZWN0ZWQgVGV4dCB1cmxUZXh0OwotCi0JcHJvdGVjdGVkIFN0cmluZyBiYXNlUGF0aDsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIExhYmVsIHVybExhYmVsOwotCi0JcHJvdGVjdGVkIFRleHQgdXJsRGlzcGxheU5hbWVUZXh0OwotCi0JcHJvdGVjdGVkIExhYmVsIHVybERpc3BsYXlOYW1lTGFiZWw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBwYXJlbnQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgQWRkTGlua0RpYWxvZyhTaGVsbCBwYXJlbnQsIFN0cmluZyBiYXNlUGF0aCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmJhc2VQYXRoID0gYmFzZVBhdGg7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBCYXNlRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCXVybExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl1cmxMYWJlbC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnVybExhYmVsX3RleHQpOyAKLQkJdXJsVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJdXJsVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJdXJsVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAob2tCdXR0b24gIT0gbnVsbCkgewotCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKHVybFRleHQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQl1cmxEaXNwbGF5TmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl1cmxEaXNwbGF5TmFtZUxhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMudXJsRGlzcGxheU5hbWVMYWJlbF90ZXh0KTsgCi0JCXVybERpc3BsYXlOYW1lVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdyaWREYXRhMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YTIud2lkdGhIaW50ID0gMzAwOwotCQl1cmxEaXNwbGF5TmFtZVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YTIpOwotCi0JCXN1cGVyLmdldFNoZWxsKCkuc2V0VGV4dCgKLQkJCQlSaWNoVGV4dFJlc291cmNlcy5hZGRMaW5rRGlhbG9nX3RpdGxlKTsgCi0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEJhc2VEaWFsb2cjY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKHBhcmVudCk7Ci0JCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlTdHJpbmcgdXJsID0gdXJsVGV4dC5nZXRUZXh0KCk7Ci0JCWlmICh1cmwgIT0gbnVsbCAmJiB1cmwubGVuZ3RoKCkgPiAwKSB7Ci0JCQlsaW5rLnNldFVSTCh1cmwpOwotCQkJbGluay5zZXROYW1lKHVybERpc3BsYXlOYW1lVGV4dC5nZXRUZXh0KCkpOwotCQl9Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPkxpbms8L2NvZGU+IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgTGluayBnZXRMaW5rKCkgewotCQlyZXR1cm4gbGluazsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL0FkZFRhYmxlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvQWRkVGFibGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjljYzE1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvQWRkVGFibGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogUHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBhdHRyaWJ1dGVzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIEhUTUwKLSAqIDx0YWJsZT4gdGFnIGluIHRoZSByaWNoIHRleHQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFkZFRhYmxlRGlhbG9nIGV4dGVuZHMgQmFzZURpYWxvZyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ST1dTID0gMjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NPTFVNTlMgPSAyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfV0lEVEggPSAiODUlIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRBQkxFX1NUWUxFX0xBQkVMUyA9IHsKLQkJCVJpY2hUZXh0UmVzb3VyY2VzLnRhYmxlSGVhZGVyTm9uZV90ZXh0LCAKLQkJCVJpY2hUZXh0UmVzb3VyY2VzLnRhYmxlSGVhZGVyQ29sc190ZXh0LCAKLQkJCVJpY2hUZXh0UmVzb3VyY2VzLnRhYmxlSGVhZGVyUm93c190ZXh0LCAKLQkJCVJpY2hUZXh0UmVzb3VyY2VzLnRhYmxlSGVhZGVyQm90aF90ZXh0LCAKLQl9OwotCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSgpOwotCi0JcHJpdmF0ZSBUZXh0IHJvd3NUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IGNvbHNUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IHdpZHRoVGV4dDsKLQotCXByaXZhdGUgQ29tYm8gdGFibGVUeXBlQ29tYm87Ci0KLQlwcml2YXRlIFRleHQgc3VtbWFyeVRleHQ7Ci0KLQlwcml2YXRlIFRleHQgY2FwdGlvblRleHQ7Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAob2tCdXR0b24gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWludCByb3dzID0gSW50ZWdlci5wYXJzZUludChyb3dzVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJCQkJaW50IGNvbHMgPSBJbnRlZ2VyLnBhcnNlSW50KGNvbHNUZXh0LmdldFRleHQoKS50cmltKCkpOwotCQkJCQlTdHJpbmcgd2lkdGggPSB3aWR0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZChyb3dzID4gMCAmJiBjb2xzID4gMCAmJiB3aWR0aC5sZW5ndGgoKSA+IDApOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBwYXJlbnQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgQWRkVGFibGVEaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBCYXNlRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlMYWJlbCByb3dzTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXJvd3NMYWJlbC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnJvd3NMYWJlbF90ZXh0KTsgCi0KLQkJcm93c1RleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlyb3dzVGV4dC5zZXRUZXh0TGltaXQoMik7Ci0JCXJvd3NUZXh0LnNldFRleHQoIiIgKyBERUZBVUxUX1JPV1MpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQlyb3dzVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlyb3dzVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJTGFiZWwgY29sc0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljb2xzTGFiZWwuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5jb2x1bW5zTGFiZWxfdGV4dCk7IAotCi0JCWNvbHNUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJY29sc1RleHQuc2V0VGV4dExpbWl0KDIpOwotCQljb2xzVGV4dC5zZXRUZXh0KCIiICsgREVGQVVMVF9DT0xVTU5TKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJY29sc1RleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY29sc1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCi0JCUxhYmVsIHdpZHRoTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXdpZHRoTGFiZWwuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy53aWR0aExhYmVsX3RleHQpOyAKLQotCQl3aWR0aFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl3aWR0aFRleHQuc2V0VGV4dCgiIiArIERFRkFVTFRfV0lEVEgpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQl3aWR0aFRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJd2lkdGhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCQlMYWJlbCBoZWFkZXJUeXBlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWhlYWRlclR5cGVMYWJlbC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnRhYmxlU3R5bGVMYWJlbF90ZXh0KTsgCi0KLQkJdGFibGVUeXBlQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCXRhYmxlVHlwZUNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl0YWJsZVR5cGVDb21iby5zZXRJdGVtcyhUQUJMRV9TVFlMRV9MQUJFTFMpOwotCQl0YWJsZVR5cGVDb21iby5zZXRUZXh0KFRBQkxFX1NUWUxFX0xBQkVMU1swXSk7Ci0KLQkJTGFiZWwgc3VtbWFyeUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzdW1tYXJ5TGFiZWwuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5zdW1tYXJ5TGFiZWxfdGV4dCk7IAotCQlzdW1tYXJ5VGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQlzdW1tYXJ5VGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCUxhYmVsIGNhcHRpb25MYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJY2FwdGlvbkxhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuY2FwdGlvbkxhYmVsX3RleHQpOyAKLQkJY2FwdGlvblRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJY2FwdGlvblRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlzdXBlci5nZXRTaGVsbCgpLnNldFRleHQoCi0JCQkJUmljaFRleHRSZXNvdXJjZXMuYWRkVGFibGVEaWFsb2dfdGl0bGUpOyAKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQmFzZURpYWxvZyNjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJU3RyaW5nIHJvd3NWYWx1ZSA9IHJvd3NUZXh0LmdldFRleHQoKTsKLQkJaWYgKHJvd3NWYWx1ZSAhPSBudWxsICYmIHJvd3NWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJaW50IHJvd3MgPSBJbnRlZ2VyLnBhcnNlSW50KHJvd3NWYWx1ZSk7Ci0JCQkJdGFibGUuc2V0Um93cyhyb3dzKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGFibGUuc2V0Um93cyhERUZBVUxUX1JPV1MpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGNvbHNWYWx1ZSA9IGNvbHNUZXh0LmdldFRleHQoKTsKLQkJaWYgKGNvbHNWYWx1ZSAhPSBudWxsICYmIGNvbHNWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJaW50IGNvbHMgPSBJbnRlZ2VyLnBhcnNlSW50KGNvbHNWYWx1ZSk7Ci0JCQkJdGFibGUuc2V0Q29sdW1ucyhjb2xzKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGFibGUuc2V0Q29sdW1ucyhERUZBVUxUX0NPTFVNTlMpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIHdpZHRoVmFsdWUgPSB3aWR0aFRleHQuZ2V0VGV4dCgpOwotCQlpZiAod2lkdGhWYWx1ZSAhPSBudWxsICYmIHdpZHRoVmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0YWJsZS5zZXRXaWR0aCh3aWR0aFZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCXRhYmxlLnNldFdpZHRoKERFRkFVTFRfV0lEVEgpOwotCQl9Ci0KLQkJdGFibGUuc2V0U3VtbWFyeShzdW1tYXJ5VGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJdGFibGUuc2V0Q2FwdGlvbihjYXB0aW9uVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJdGFibGUuc2V0VGFibGVIZWFkZXJzKHRhYmxlVHlwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCi0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPlRhYmxlPC9jb2RlPiBvYmplY3QuCi0JICovCi0JcHVibGljIFRhYmxlIGdldFRhYmxlKCkgewotCQlyZXR1cm4gdGFibGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9CYXNlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvQmFzZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZjFmMGQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9CYXNlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgZGlhbG9ncyB1c2VkIGJ5IHRoZSByaWNoIHRleHQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJhc2VEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JLy8gVGhlIHBsdWctaW4gbG9nZ2VyLgotCXByb3RlY3RlZCBMb2dnZXIgbG9nZ2VyOwotCi0JLyoqCi0JICogVGhlIE9LIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCi0JLyoqCi0JICogVGhlIENhbmNlbCBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjYW5jZWxCdXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgPGNvZGU+QmFzZURpYWxvZzwvY29kZT4gZ2l2ZW4gdGhlIHBhcmVudCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqLwotCXB1YmxpYyBCYXNlRGlhbG9nKFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQlsb2dnZXIgPSBSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSAoR3JpZERhdGEpIGNvbXBvc2l0ZS5nZXRMYXlvdXREYXRhKCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gMTA7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGlhbG9nIGJ1dHRvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgT0sgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCi0JCS8vIENyZWF0ZSB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgT0sgYnV0dG9uLgotCQlva0J1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY2FuY2VsQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9GaW5kUmVwbGFjZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL0ZpbmRSZXBsYWNlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhODliY2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL0ZpbmRSZXBsYWNlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRmluZFJlcGxhY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIHNlYXJjaCBhbmQgcmVwbGFjZSBzdHJpbmdzL29wdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmluZFJlcGxhY2VEaWFsb2cgZXh0ZW5kcyBCYXNlRGlhbG9nIHsKLQotCXByaXZhdGUgRmluZFJlcGxhY2VBY3Rpb24gZmluZFJlcGxhY2VBY3Rpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gZmluZE9ubHk7Ci0KLQlwcml2YXRlIFRleHQgZmluZFRleHQ7Ci0KLQlwcml2YXRlIFRleHQgcmVwbGFjZVRleHQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBzZWFyY2hGb3J3YXJkUmFkaW9CdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBzZWFyY2hCYWNrd2FyZFJhZGlvQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY2FzZVNlbnNpdGl2ZUNoZWNrYm94OwotCi0JcHJpdmF0ZSBCdXR0b24gd2hvbGVXb3JkQ2hlY2tib3g7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmaW5kQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gcmVwbGFjZUJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIHJlcGxhY2VGaW5kQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gcmVwbGFjZUFsbEJ1dHRvbjsKLQotCXByaXZhdGUgTGFiZWwgc3RhdHVzTGFiZWw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBwYXJlbnQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcGFyYW0gZmluZFJlcGxhY2VBY3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBGaW5kIGFuZCBSZXBsYWNlIGFjdGlvbgotCSAqIEBwYXJhbSBmaW5kT25seQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGRpc2FibGUgdGhlIHJlcGxhY2UgYW5kIHJlcGxhY2UgYWxsCi0JICogICAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMKLQkgKi8KLQlwdWJsaWMgRmluZFJlcGxhY2VEaWFsb2coU2hlbGwgcGFyZW50LCBGaW5kUmVwbGFjZUFjdGlvbiBmaW5kUmVwbGFjZUFjdGlvbiwKLQkJCWJvb2xlYW4gZmluZE9ubHkpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJc2V0U2hlbGxTdHlsZShTV1QuRElBTE9HX1RSSU0gfCBTV1QuTU9ERUxFU1MKLQkJCQl8IGdldERlZmF1bHRPcmllbnRhdGlvbigpKTsKLQkJc2V0QmxvY2tPbk9wZW4oZmFsc2UpOwotCQl0aGlzLmZpbmRSZXBsYWNlQWN0aW9uID0gZmluZFJlcGxhY2VBY3Rpb247Ci0JCXRoaXMuZmluZE9ubHkgPSBmaW5kT25seTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEJhc2VEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQotCQlDb21wb3NpdGUgdGV4dENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXRleHRDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCXRleHRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgZmluZExhYmVsID0gbmV3IExhYmVsKHRleHRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZmluZExhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuZmluZExhYmVsX3RleHQpOyAKLQkJZmluZFRleHQgPSBuZXcgVGV4dCh0ZXh0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMjAwOwotCQlmaW5kVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJZmluZFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKGZpbmRCdXR0b24gIT0gbnVsbCkgewotCQkJCQlmaW5kQnV0dG9uCi0JCQkJCQkJLnNldEVuYWJsZWQoZmluZFRleHQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApOwotCQkJCX0KLQkJCQlpZiAocmVwbGFjZUFsbEJ1dHRvbiAhPSBudWxsICYmICFmaW5kT25seSkgewotCQkJCQlyZXBsYWNlQWxsQnV0dG9uLnNldEVuYWJsZWQoZmluZFRleHQuZ2V0VGV4dCgpLnRyaW0oKQotCQkJCQkJCS5sZW5ndGgoKSA+IDApOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJTGFiZWwgcmVwbGFjZUxhYmVsID0gbmV3IExhYmVsKHRleHRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcmVwbGFjZUxhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMucmVwbGFjZUxhYmVsX3RleHQpOyAKLQkJcmVwbGFjZVRleHQgPSBuZXcgVGV4dCh0ZXh0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJcmVwbGFjZVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWlmIChmaW5kT25seSkgewotCQkJcmVwbGFjZVRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCXJlcGxhY2VUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChyZXBsYWNlQnV0dG9uICE9IG51bGwpIHsKLQkJCQkJCXJlcGxhY2VCdXR0b24uc2V0RW5hYmxlZChmaW5kUmVwbGFjZUFjdGlvbgotCQkJCQkJCQkuZ2V0Rm91bmRNYXRjaCgpKTsKLQkJCQl9Ci0JCQkJaWYgKHJlcGxhY2VGaW5kQnV0dG9uICE9IG51bGwpIHsKLQkJCQkJcmVwbGFjZUZpbmRCdXR0b24uc2V0RW5hYmxlZChmaW5kUmVwbGFjZUFjdGlvbgotCQkJCQkJCS5nZXRGb3VuZE1hdGNoKCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCX0KLQotCQlDb21wb3NpdGUgb3B0aW9uc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW9wdGlvbnNDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQkJb3B0aW9uc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlHcm91cCBkaXJlY3Rpb25Hcm91cCA9IG5ldyBHcm91cChvcHRpb25zQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWRpcmVjdGlvbkdyb3VwLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuZGlyZWN0aW9uR3JvdXBfdGV4dCk7IAotCQlkaXJlY3Rpb25Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJZGlyZWN0aW9uR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXNlYXJjaEZvcndhcmRSYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24oZGlyZWN0aW9uR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNlYXJjaEZvcndhcmRSYWRpb0J1dHRvbi5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmZvcndhcmRSYWRpb0J1dHRvbl90ZXh0KTsgCi0JCXNlYXJjaEZvcndhcmRSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXNlYXJjaEJhY2t3YXJkUmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uKGRpcmVjdGlvbkdyb3VwLCBTV1QuUkFESU8pOwotCQlzZWFyY2hCYWNrd2FyZFJhZGlvQnV0dG9uLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuYmFja3dhcmRSYWRpb0J1dHRvbl90ZXh0KTsgCi0KLQkJR3JvdXAgb3B0aW9uc0dyb3VwID0gbmV3IEdyb3VwKG9wdGlvbnNDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJb3B0aW9uc0dyb3VwLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMub3B0aW9uc0dyb3VwX3RleHQpOyAKLQkJb3B0aW9uc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlvcHRpb25zR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWNhc2VTZW5zaXRpdmVDaGVja2JveCA9IG5ldyBCdXR0b24ob3B0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotCQljYXNlU2Vuc2l0aXZlQ2hlY2tib3guc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dCk7IAotCQl3aG9sZVdvcmRDaGVja2JveCA9IG5ldyBCdXR0b24ob3B0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotCQl3aG9sZVdvcmRDaGVja2JveC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLndob2xlV29yZENoZWNrYm94X3RleHQpOyAKLQotCQlzdGF0dXNMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJc3RhdHVzTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJc3VwZXIuZ2V0U2hlbGwoKQotCQkJCS5zZXRUZXh0KAotCQkJCQkJUmljaFRleHRSZXNvdXJjZXMuZmluZFJlcGxhY2VEaWFsb2dfdGl0bGUpOyAKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQmFzZURpYWxvZyNjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyAxLCBSaWNoVGV4dFJlc291cmNlcy5maW5kQnV0dG9uX3RleHQsIHRydWUpOyAKLQkJZmluZEJ1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLkNMSUVOVF9JRCArIDEpOwotCQlmaW5kQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJZmluZFJlcGxhY2VBY3Rpb24ucnVuKEZpbmRSZXBsYWNlQWN0aW9uLkZJTkRfVEVYVCwKLQkJCQkJCWdldEZpbmRUZXh0KCksIGdldFJlcGxhY2VUZXh0KCksIGdldE1hdGNoRGlyZWN0aW9uKCksCi0JCQkJCQlnZXRNYXRjaE9wdGlvbnMoKSk7Ci0JCQkJaWYgKCFmaW5kT25seSkgewotCQkJCXJlcGxhY2VCdXR0b24uc2V0RW5hYmxlZChmaW5kUmVwbGFjZUFjdGlvbi5nZXRGb3VuZE1hdGNoKCkpOwotCQkJCQlyZXBsYWNlRmluZEJ1dHRvbi5zZXRFbmFibGVkKGZpbmRSZXBsYWNlQWN0aW9uCi0JCQkJCQkJLmdldEZvdW5kTWF0Y2goKSk7Ci0JCQkJfQotCQkJCWlmIChmaW5kUmVwbGFjZUFjdGlvbi5nZXRGb3VuZE1hdGNoKCkpIHsKLQkJCQkJc3RhdHVzTGFiZWwuc2V0VGV4dCgiIik7ICAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzdGF0dXNMYWJlbC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLkZpbmRSZXBsYWNlX1N0YXR1c19ub01hdGNoX2xhYmVsKTsgCi0JCQkJfQotCQkJCWZpbmRCdXR0b24uc2V0Rm9jdXMoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyAyLCBSaWNoVGV4dFJlc291cmNlcy5yZXBsYWNlQnV0dG9uX3RleHQsIGZhbHNlKTsgCi0JCXJlcGxhY2VCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyAyKTsKLQkJaWYgKCFmaW5kT25seSkgewotCQkJcmVwbGFjZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJZmluZFJlcGxhY2VBY3Rpb24ucnVuKEZpbmRSZXBsYWNlQWN0aW9uLlJFUExBQ0VfVEVYVCwKLQkJCQkJCQlnZXRGaW5kVGV4dCgpLCBnZXRSZXBsYWNlVGV4dCgpLAotCQkJCQkJCWdldE1hdGNoRGlyZWN0aW9uKCksIGdldE1hdGNoT3B0aW9ucygpKTsKLQkJCQkJcmVwbGFjZUJ1dHRvbi5zZXRGb2N1cygpOwotCQkJCX0KLQkKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyAzLCBSaWNoVGV4dFJlc291cmNlcy5yZXBsYWNlRmluZEJ1dHRvbl90ZXh0LCBmYWxzZSk7IAotCQlyZXBsYWNlRmluZEJ1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLkNMSUVOVF9JRCArIDMpOwotCQlpZiAoIWZpbmRPbmx5KSB7Ci0JCQlyZXBsYWNlRmluZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJZmluZFJlcGxhY2VBY3Rpb24ucnVuKEZpbmRSZXBsYWNlQWN0aW9uLlJFUExBQ0VfRklORF9URVhULAotCQkJCQkJCWdldEZpbmRUZXh0KCksIGdldFJlcGxhY2VUZXh0KCksCi0JCQkJCQkJZ2V0TWF0Y2hEaXJlY3Rpb24oKSwgZ2V0TWF0Y2hPcHRpb25zKCkpOwotCQkJCQlyZXBsYWNlQnV0dG9uLnNldEVuYWJsZWQoZmluZFJlcGxhY2VBY3Rpb24uZ2V0Rm91bmRNYXRjaCgpKTsKLQkJCQkJcmVwbGFjZUZpbmRCdXR0b24uc2V0RW5hYmxlZChmaW5kUmVwbGFjZUFjdGlvbgotCQkJCQkJCS5nZXRGb3VuZE1hdGNoKCkpOwotCQkJCQlyZXBsYWNlRmluZEJ1dHRvbi5zZXRGb2N1cygpOwotCQkJCX0KLQkKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyA0LCBSaWNoVGV4dFJlc291cmNlcy5yZXBsYWNlYWxsQnV0dG9uX3RleHQsIGZhbHNlKTsgCi0JCXJlcGxhY2VBbGxCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyA0KTsKLQkJaWYgKCFmaW5kT25seSkgewotCQkJcmVwbGFjZUFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJZmluZFJlcGxhY2VBY3Rpb24ucnVuKEZpbmRSZXBsYWNlQWN0aW9uLlJFUExBQ0VfQUxMX1RFWFQsCi0JCQkJCQkJZ2V0RmluZFRleHQoKSwgZ2V0UmVwbGFjZVRleHQoKSwKLQkJCQkJCQlnZXRNYXRjaERpcmVjdGlvbigpLCBnZXRNYXRjaE9wdGlvbnMoKSk7Ci0JCQkJCXJlcGxhY2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXJlcGxhY2VGaW5kQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlyZXBsYWNlQWxsQnV0dG9uLnNldEZvY3VzKCk7Ci0JCQkJfQotCQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQkvLyBDcmVhdGUgdGhlIENhbmNlbCBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JCWNhbmNlbEJ1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCk7Ci0KLQkJZmluZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVwbGFjZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVwbGFjZUZpbmRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJlcGxhY2VBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmluZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmluZFRleHQoKSB7Ci0JCXJldHVybiBmaW5kVGV4dC5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVwbGFjZSB0ZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVwbGFjZVRleHQoKSB7Ci0JCXJldHVybiByZXBsYWNlVGV4dC5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWF0Y2ggZGlyZWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+RklORF9GT1JXQVJEPC9jb2RlPiBvciA8Y29kZT5GSU5EX0JBQ0tXQVJEPC9jb2RlPgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF0Y2hEaXJlY3Rpb24oKSB7Ci0JCXJldHVybiBzZWFyY2hGb3J3YXJkUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkgPyBGaW5kUmVwbGFjZUFjdGlvbi5GT1JXQVJEX01BVENICi0JCQkJOiBGaW5kUmVwbGFjZUFjdGlvbi5CQUNLV0FSRF9NQVRDSDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtYXRjaCBvcHRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1hdGNoIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1hdGNoT3B0aW9ucygpIHsKLQkJaW50IG9wdGlvbnMgPSAwOwotCQlpZiAod2hvbGVXb3JkQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkgPT0gdHJ1ZSkgewotCQkJb3B0aW9ucyB8PSBGaW5kUmVwbGFjZUFjdGlvbi5XSE9MRV9XT1JEX01BVENIOwotCQl9Ci0JCWlmIChjYXNlU2Vuc2l0aXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkgPT0gdHJ1ZSkgewotCQkJb3B0aW9ucyB8PSBGaW5kUmVwbGFjZUFjdGlvbi5DQVNFX1NFTlNJVElWRV9NQVRDSDsKLQkJfQotCQlyZXR1cm4gb3B0aW9uczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbmRPbmx5KCkgewotCQlyZXR1cm4gZmluZE9ubHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmluZE9ubHkoYm9vbGVhbiBmaW5kT25seSkgewotCQl0aGlzLmZpbmRPbmx5ID0gZmluZE9ubHk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJmNWRkMTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGVkaXRpbmcgZGlhbG9ncyBmb3IgdGhlIHJpY2ggdGV4dCBjb250cm9sIGFuZCBlZGl0b3IuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0Jsb2NrVGFnLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvQmxvY2tUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTA5MDJmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvQmxvY2tUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci0KLS8qKgotICogTW9kZWxzIGEgSFRNTCBibG9jayB0YWcuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQmxvY2tUYWcgewotCi0JLy8gVGhlIHVzZXIgZnJpZW5kbHkgbmFtZXMuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUEFSQUdSQVBIID0gUmljaFRleHRSZXNvdXJjZXMuYmxvY2tUYWdfcGFyYWdyYXBoOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0hFQURJTkdfMSA9IFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnX2hlYWRpbmcxOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0hFQURJTkdfMiA9IFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnX2hlYWRpbmcyOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0hFQURJTkdfMyA9IFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnX2hlYWRpbmczOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0hFQURJTkdfNCA9IFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnX2hlYWRpbmc0OyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0hFQURJTkdfNSA9IFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnX2hlYWRpbmc1OyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0hFQURJTkdfNiA9IFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnX2hlYWRpbmc2OyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0FERFJFU1MgPSBSaWNoVGV4dFJlc291cmNlcy5ibG9ja1RhZ19hZGRyZXNzOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BSRUZPUk1BVFRFRF9URVhUID0gUmljaFRleHRSZXNvdXJjZXMuYmxvY2tUYWdfcHJlZm9ybWF0dGVkVGV4dDsgCi0KLQkvLyBUaGUgaW50ZXJuYWwgdmFsdWVzLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9QQVJBR1JBUEggPSAiPHA+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0hFQURJTkdfMSA9ICI8aDE+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0hFQURJTkdfMiA9ICI8aDI+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0hFQURJTkdfMyA9ICI8aDM+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0hFQURJTkdfNCA9ICI8aDQ+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0hFQURJTkdfNSA9ICI8aDU+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0hFQURJTkdfNiA9ICI8aDY+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0FERFJFU1MgPSAiPGFkZHJlc3M+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1BSRUZPUk1BVFRFRF9URVhUID0gIjxwcmU+IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRW51bWVyYXRpb24gb2YgYWxsIHN1cHBvcnRlZCA8Y29kZT5CbG9ja1RhZzwvY29kZT4uCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBQQVJBR1JBUEggPSBuZXcgQmxvY2tUYWcoTkFNRV9QQVJBR1JBUEgsCi0JCQlWQUxVRV9QQVJBR1JBUEgpOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBIRUFESU5HXzEgPSBuZXcgQmxvY2tUYWcoTkFNRV9IRUFESU5HXzEsCi0JCQlWQUxVRV9IRUFESU5HXzEpOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBIRUFESU5HXzIgPSBuZXcgQmxvY2tUYWcoTkFNRV9IRUFESU5HXzIsCi0JCQlWQUxVRV9IRUFESU5HXzIpOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBIRUFESU5HXzMgPSBuZXcgQmxvY2tUYWcoTkFNRV9IRUFESU5HXzMsCi0JCQlWQUxVRV9IRUFESU5HXzMpOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBIRUFESU5HXzQgPSBuZXcgQmxvY2tUYWcoTkFNRV9IRUFESU5HXzQsCi0JCQlWQUxVRV9IRUFESU5HXzQpOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBIRUFESU5HXzUgPSBuZXcgQmxvY2tUYWcoTkFNRV9IRUFESU5HXzUsCi0JCQlWQUxVRV9IRUFESU5HXzUpOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBIRUFESU5HXzYgPSBuZXcgQmxvY2tUYWcoTkFNRV9IRUFESU5HXzYsCi0JCQlWQUxVRV9IRUFESU5HXzYpOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBBRERSRVNTID0gbmV3IEJsb2NrVGFnKE5BTUVfQUREUkVTUywKLQkJCVZBTFVFX0FERFJFU1MpOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBQUkVGT1JNQVRURURfVEVYVCA9IG5ldyBCbG9ja1RhZygKLQkJCU5BTUVfUFJFRk9STUFUVEVEX1RFWFQsIFZBTFVFX1BSRUZPUk1BVFRFRF9URVhUKTsKLQotCS8vIEEgbGlzdCBvZiA8Y29kZT5CbG9ja1RhZzwvY29kZT4gb2JqZWN0cy4KLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBMaXN0IEJMT0NLX1RBR1MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0Jc3RhdGljIHsKLQkJQkxPQ0tfVEFHUy5hZGQoUEFSQUdSQVBIKTsKLQkJQkxPQ0tfVEFHUy5hZGQoSEVBRElOR18xKTsKLQkJQkxPQ0tfVEFHUy5hZGQoSEVBRElOR18yKTsKLQkJQkxPQ0tfVEFHUy5hZGQoSEVBRElOR18zKTsKLQkJQkxPQ0tfVEFHUy5hZGQoSEVBRElOR180KTsKLQkJQkxPQ0tfVEFHUy5hZGQoSEVBRElOR181KTsKLQkJQkxPQ0tfVEFHUy5hZGQoSEVBRElOR182KTsKLQkJQkxPQ0tfVEFHUy5hZGQoQUREUkVTUyk7Ci0JCUJMT0NLX1RBR1MuYWRkKFBSRUZPUk1BVFRFRF9URVhUKTsKLQl9Ci0KLQkvLyBUaGUgYmxvY2sgdGFnIG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCS8vIFRoZSBibG9jayB0YWcgdmFsdWUuCi0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgYmxvY2sgdGFnIG5hbWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBibG9jayB0YWcgdmFsdWUKLQkgKi8KLQlwdWJsaWMgQmxvY2tUYWcoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYmxvY2sgdGFnIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgYmxvY2sgdGFnIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJsb2NrIHRhZyB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBibG9jayB0YWcgdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+QmxvY2tUYWc8L2NvZGU+IG9iamVjdCB0aGF0IGlzIG1hcHBlZCB0byB0aGUgZ2l2ZW4KLQkgKiBpbmRleC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGFuIGluZGV4IGludG8gdGhlIDxjb2RlPkJsb2NrVGFnPC9jb2RlPiBsaXN0Ci0JICogQHJldHVybiBhIDxjb2RlPkJsb2NrVGFnPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJsb2NrVGFnIGdldEJsb2NrVGFnKGludCBpbmRleCkgewotCQlCbG9ja1RhZyByZXN1bHQgPSAoQmxvY2tUYWcpIEJMT0NLX1RBR1MuZ2V0KGluZGV4KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBQQVJBR1JBUEg7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0ZvbnROYW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvRm9udE5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTcxNjdkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvRm9udE5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci0KLS8qKgotICogTW9kZWxzIGEgSFRNTCBmb250IG5hbWUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRm9udE5hbWUgewotCi0JLy8gVGhlIHVzZXIgZnJpZW5kbHkgbmFtZXMuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfREVGQVVMVCA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnROYW1lX2RlZmF1bHQ7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfQVJJQUwgPSBSaWNoVGV4dFJlc291cmNlcy5mb250TmFtZV9hcmlhbDsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9DT1VSSUVSX05FVyA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnROYW1lX2NvdXJpZXJOZXc7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfVElNRVNfTkVXX1JPTUFOID0gUmljaFRleHRSZXNvdXJjZXMuZm9udE5hbWVfdGltZXNOZXdSb21hbjsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9WRVJEQU5BID0gUmljaFRleHRSZXNvdXJjZXMuZm9udE5hbWVfdmVyZGFuYTsgCi0KLQkvLyBUaGUgaW50ZXJuYWwgdmFsdWVzLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9ERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9BUklBTCA9ICJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0NPVVJJRVJfTkVXID0gIkNvdXJpZXIgTmV3LCBDb3VyaWVyLCBtb25vIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1RJTUVTX05FV19ST01BTiA9ICJUaW1lcyBOZXcgUm9tYW4sIFRpbWVzLCBzZXJpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9WRVJEQU5BID0gIlZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgcHVibGljIGZpbmFsIEZvbnROYW1lIERFRkFVTFQgPSBuZXcgRm9udE5hbWUoTkFNRV9ERUZBVUxULAotCQkJVkFMVUVfREVGQVVMVCk7Ci0KLQkvKioKLQkgKiBFbnVtZXJhdGlvbiBvZiBhbGwgc3VwcG9ydGVkIDxjb2RlPkhUTUxCbG9ja1RhZzwvY29kZT4uCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBGb250TmFtZSBBUklBTCA9IG5ldyBGb250TmFtZShOQU1FX0FSSUFMLCBWQUxVRV9BUklBTCk7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIEZvbnROYW1lIENPVVJJRVJfTkVXID0gbmV3IEZvbnROYW1lKE5BTUVfQ09VUklFUl9ORVcsCi0JCQlWQUxVRV9DT1VSSUVSX05FVyk7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIEZvbnROYW1lIFRJTUVTX05FV19ST01BTiA9IG5ldyBGb250TmFtZSgKLQkJCU5BTUVfVElNRVNfTkVXX1JPTUFOLCBWQUxVRV9USU1FU19ORVdfUk9NQU4pOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBGb250TmFtZSBWRVJEQU5BID0gbmV3IEZvbnROYW1lKE5BTUVfVkVSREFOQSwKLQkJCVZBTFVFX1ZFUkRBTkEpOwotCi0JLy8gQSBsaXN0IG9mIDxjb2RlPkZvbnROYW1lPC9jb2RlPiBvYmplY3RzLgotCXN0YXRpYyBwcml2YXRlIGZpbmFsIExpc3QgRk9OVF9OQU1FUyA9IG5ldyBBcnJheUxpc3QoKTsKLQlzdGF0aWMgewotCQlGT05UX05BTUVTLmFkZChERUZBVUxUKTsKLQkJRk9OVF9OQU1FUy5hZGQoQVJJQUwpOwotCQlGT05UX05BTUVTLmFkZChDT1VSSUVSX05FVyk7Ci0JCUZPTlRfTkFNRVMuYWRkKFRJTUVTX05FV19ST01BTik7Ci0JCUZPTlRfTkFNRVMuYWRkKFZFUkRBTkEpOwotCX0KLQotCS8vIFRoZSBmb250IG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCS8vIFRoZSBmb250IHZhbHVlLgotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIGZvbnQgbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIGZvbnQgdmFsdWUKLQkgKi8KLQlwdWJsaWMgRm9udE5hbWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZm9udCBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvbnQgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZm9udCB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmb250IHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPkZvbnROYW1lPC9jb2RlPiBvYmplY3QgdGhhdCBpcyBtYXBwZWQgdG8gdGhlIGdpdmVuCi0JICogaW5kZXguCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBhbiBpbmRleCBpbnRvIHRoZSA8Y29kZT5Gb250TmFtZTwvY29kZT4gbGlzdAotCSAqIEByZXR1cm4gYSA8Y29kZT5Gb250TmFtZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBGb250TmFtZSBnZXRGb250TmFtZShpbnQgaW5kZXgpIHsKLQkJRm9udE5hbWUgcmVzdWx0ID0gKEZvbnROYW1lKSBGT05UX05BTUVTLmdldChpbmRleCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gREVGQVVMVDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvRm9udFN0eWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvRm9udFN0eWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxZmIzMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0ZvbnRTdHlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci0KLS8qKgotICogTW9kZWxzIGEgSFRNTCBmb250IHN0eWxlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZvbnRTdHlsZSB7Ci0KLQkvLyBUaGUgdXNlciBmcmllbmRseSBuYW1lcy4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9OT1JNQUwgPSBSaWNoVGV4dFJlc291cmNlcy5mb250U3R5bGVfbm9ybWFsOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1NFQ1RJT05fSEVBRElORyA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnRTdHlsZV9zZWN0aW9uSGVhZGluZzsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9TVUJTRUNUSU9OX0hFQURJTkcgPSBSaWNoVGV4dFJlc291cmNlcy5mb250U3R5bGVfc3Vic2VjdGlvbkhlYWRpbmc7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfU1VCX1NVQlNFQ1RJT05fSEVBRElORyA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnRTdHlsZV9zdWJTdWJzZWN0aW9uSGVhZGluZzsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9RVU9URSA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnRTdHlsZV9xdW90ZTsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9DT0RFX1NBTVBMRSA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnRTdHlsZV9jb2RlU2FtcGxlOyAKLQotCS8vIFRoZSBpbnRlcm5hbCB2YWx1ZXMuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX05PUk1BTCA9ICI8cD4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfU0VDVElPTl9IRUFESU5HID0gIjxoMz4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfU1VCU0VDVElPTl9IRUFESU5HID0gIjxoND4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfU1VCX1NVQlNFQ1RJT05fSEVBRElORyA9ICI8aDU+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1FVT1RFID0gIjxxdW90ZT4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfQ09ERV9TQU1QTEUgPSAiPGNvZGU+IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEVudW1lcmF0aW9uIG9mIGFsbCBzdXBwb3J0ZWQgPGNvZGU+Rm9udFN0eWxlPC9jb2RlPi4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGZpbmFsIEZvbnRTdHlsZSBOT1JNQUwgPSBuZXcgRm9udFN0eWxlKE5BTUVfTk9STUFMLAotCQkJVkFMVUVfTk9STUFMKTsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgRm9udFN0eWxlIFNFQ1RJT05fSEVBRElORyA9IG5ldyBGb250U3R5bGUoCi0JCQlOQU1FX1NFQ1RJT05fSEVBRElORywgVkFMVUVfU0VDVElPTl9IRUFESU5HKTsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgRm9udFN0eWxlIFNVQlNFQ1RJT05fSEVBRElORyA9IG5ldyBGb250U3R5bGUoCi0JCQlOQU1FX1NVQlNFQ1RJT05fSEVBRElORywgVkFMVUVfU1VCU0VDVElPTl9IRUFESU5HKTsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgRm9udFN0eWxlIFNVQl9TVUJTRUNUSU9OX0hFQURJTkcgPSBuZXcgRm9udFN0eWxlKAotCQkJTkFNRV9TVUJfU1VCU0VDVElPTl9IRUFESU5HLCBWQUxVRV9TVUJfU1VCU0VDVElPTl9IRUFESU5HKTsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgRm9udFN0eWxlIFFVT1RFID0gbmV3IEZvbnRTdHlsZShOQU1FX1FVT1RFLCBWQUxVRV9RVU9URSk7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIEZvbnRTdHlsZSBDT0RFX1NBTVBMRSA9IG5ldyBGb250U3R5bGUoTkFNRV9DT0RFX1NBTVBMRSwKLQkJCVZBTFVFX0NPREVfU0FNUExFKTsKLQotCS8vIEEgbGlzdCBvZiA8Y29kZT5Gb250U3R5bGU8L2NvZGU+IG9iamVjdHMuCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgTGlzdCBGT05UX1NUWUxFUyA9IG5ldyBBcnJheUxpc3QoKTsKLQlzdGF0aWMgewotCQlGT05UX1NUWUxFUy5hZGQoTk9STUFMKTsKLQkJRk9OVF9TVFlMRVMuYWRkKFNFQ1RJT05fSEVBRElORyk7Ci0JCUZPTlRfU1RZTEVTLmFkZChTVUJTRUNUSU9OX0hFQURJTkcpOwotCQlGT05UX1NUWUxFUy5hZGQoU1VCX1NVQlNFQ1RJT05fSEVBRElORyk7Ci0JCUZPTlRfU1RZTEVTLmFkZChRVU9URSk7Ci0JCUZPTlRfU1RZTEVTLmFkZChDT0RFX1NBTVBMRSk7Ci0JfQotCi0JLy8gVGhlIGZvbnQgc3R5bGUgbmFtZS4KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JLy8gVGhlIGZvbnQgc3R5bGUgdmFsdWUuCi0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgZm9udCBzdHlsZSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgZm9udCBzdHlsZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBGb250U3R5bGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZm9udCBzdHlsZSBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvbnQgc3R5bGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZm9udCBzdHlsZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmb250IHN0eWxlIHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPkZvbnRTdHlsZTwvY29kZT4gb2JqZWN0IHRoYXQgaXMgbWFwcGVkIHRvIHRoZSBnaXZlbgotCSAqIGluZGV4LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgYW4gaW5kZXggaW50byB0aGUgPGNvZGU+Rm9udFN0eWxlPC9jb2RlPiBsaXN0Ci0JICogQHJldHVybiBhIDxjb2RlPkZvbnRTdHlsZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBGb250U3R5bGUgZ2V0Rm9udFN0eWxlKGludCBpbmRleCkgewotCQlGb250U3R5bGUgcmVzdWx0ID0gKEZvbnRTdHlsZSkgRk9OVF9TVFlMRVMuZ2V0KGluZGV4KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBOT1JNQUw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheSBuYW1lIG9mIHRoZSA8Y29kZT5Gb250U3R5bGU8L2NvZGU+IG9iamVjdCB3aXRoIHRoZSBnaXZlbgotCSAqIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgb25lIG9mIHRoZSBGb250U3R5bGVzCi0JICogQHJldHVybiBhIGRpc3BsYXkgbmFtZSBvZiBhIEZvbnRTdHlsZSwgb3IgbnVsbCBpZiBub25lIGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rm9udFN0eWxlTmFtZShTdHJpbmcgdmFsdWUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gRk9OVF9TVFlMRVMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspeyAKLQkJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpaXRlci5uZXh0KCk7Ci0JCQlpZiAoc3R5bGUuZ2V0VmFsdWUoKS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJcmV0dXJuIHN0eWxlLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvSW1hZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9JbWFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMzBkODg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9JbWFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWw7Ci0KLS8qKgotICogTW9kZWxzIGEgc2ltcGxpZmllZCBIVE1MIEltYWdlIHRhZyAoPGltZz4pLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEltYWdlIHsKLQotCS8vIFRoZSBpbWFnZSBVUkwuCi0JcHJpdmF0ZSBTdHJpbmcgdXJsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SW1hZ2U8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBJbWFnZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBVUkwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1hZ2UgVVJMLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVSTChTdHJpbmcgdXJsKSB7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0xpbmsuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9MaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVkMDYyODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0xpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sOwotCi0vKioKLSAqIE1vZGVscyBhIHNpbXBsaWZpZWQgSFRNTCBMaW5rIHRhZyAoPGE+KS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rIHsKLQotCS8vIFRoZSBsaW5rIG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgbGluayBVUkwuCi0JcHJpdmF0ZSBTdHJpbmcgdXJsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TGluazwvY29kZT4uCi0JICovCi0JcHVibGljIExpbmsoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGluayBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGluayBuYW1lLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaW5rIFVSTC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVSTCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBoeXBlcmxpbmsgVVJMLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVSTChTdHJpbmcgdXJsKSB7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGh5cGVybGluay4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvSFRNTCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL1RhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjhlOWYwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbDsKLQotLyoqCi0gKiBNb2RlbHMgYSBzaW1wbGlmaWVkIEhUTUwgVGFibGUgdGFnICg8YT4pLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhYmxlIHsKLQotCS8vIFRoZSBudW1iZXIgb2Ygcm93cy4KLQlwcml2YXRlIGludCByb3dzID0gMjsKLQotCS8vIFRoZSBudW1iZXIgb2YgY29sdW1ucy4KLQlwcml2YXRlIGludCBjb2xzID0gMjsKLQotCS8vIFRoZSB0YWJsZSB3aWR0aC4KLQlwcml2YXRlIFN0cmluZyB3aWR0aCA9ICI4NSUiOwotCi0JLy8gVGhlIHR5cGUgb2YgdGFibGVoZWFkZXJzIGZvciB0aGlzIHRhYmxlLgotCXByaXZhdGUgaW50IHRhYmxlSGVhZGVycyA9IDA7Ci0KLQkvLyBUaGUgdGFibGUgc3VtbWFyeS4KLQlwcml2YXRlIFN0cmluZyBzdW1tYXJ5OwotCi0JLy8gVGhlIHRhYmxlIGNhcHRpb24uCi0JcHJpdmF0ZSBTdHJpbmcgY2FwdGlvbjsKLQotCS8vIEphdmFzY3JpcHQgY29uc3RhbnRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFCTEVfSEVBREVSU19OT05FID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBQkxFX0hFQURFUlNfQ09MUyA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUJMRV9IRUFERVJTX1JPV1MgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFCTEVfSEVBREVSU19CT1RIID0gMzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGFibGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBUYWJsZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cy4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFJvd3MoKSB7Ci0JCXJldHVybiByb3dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG51bWJlciBvZiByb3dzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvd3MoaW50IHJvd3MpIHsKLQkJdGhpcy5yb3dzID0gcm93czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29sdW1ucy4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbHVtbnMoKSB7Ci0JCXJldHVybiBjb2xzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG51bWJlciBvZiBjb2x1bW5zLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbnMoaW50IGNvbHMpIHsKLQkJdGhpcy5jb2xzID0gY29sczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YWJsZSB3aWR0aC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpZHRoKCkgewotCQlyZXR1cm4gd2lkdGg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGFibGUgd2lkdGguCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2lkdGgoU3RyaW5nIHdpZHRoKSB7Ci0JCXRoaXMud2lkdGggPSB3aWR0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YWJsZSBjYXB0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2FwdGlvbigpIHsKLQkJcmV0dXJuIGNhcHRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGFibGUgY2FwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXB0aW9uKFN0cmluZyBjYXB0aW9uKSB7Ci0JCXRoaXMuY2FwdGlvbiA9IGNhcHRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGFibGUgc3VtbWFyeS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN1bW1hcnkoKSB7Ci0JCXJldHVybiBzdW1tYXJ5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRhYmxlIHN1bW1hcnkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3VtbWFyeShTdHJpbmcgc3VtbWFyeSkgewotCQl0aGlzLnN1bW1hcnkgPSBzdW1tYXJ5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRhYmxlIGhlYWRlcnMgdHlwZS4gPGJyIC8+Ci0JICogT25lIG9mOiAJVEFCTEVfSEVBREVSU19OT05FLHYgVEFCTEVfSEVBREVSU19DT0xTLCBUQUJMRV9IRUFERVJTX1JPV1MsIFRBQkxFX0hFQURFUlNfQk9USAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFibGVIZWFkZXJzKCkgewotCQlyZXR1cm4gdGFibGVIZWFkZXJzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRhYmxlIGhlYWRlcnMgdHlwZS4gPGJyIC8+Ci0JICogT25lIG9mOiAJVEFCTEVfSEVBREVSU19OT05FLHYgVEFCTEVfSEVBREVSU19DT0xTLCBUQUJMRV9IRUFERVJTX1JPV1MsIFRBQkxFX0hFQURFUlNfQk9USAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYmxlSGVhZGVycyhpbnQgdGFibGVIZWFkZXJzKSB7Ci0JCXRoaXMudGFibGVIZWFkZXJzID0gdGFibGVIZWFkZXJzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDliZDcwN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIHRoZSByaWNoIHRleHQgY29udHJvbCBhbmQgZWRpdG9yLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYwNGRkYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBhbmQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSByaWNoIHRleHQgY29udHJvbCBhbmQgZWRpdG9yLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcHJlZmVyZW5jZXMvUmljaFRleHRQcmVmZXJlbmNlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9SaWNoVGV4dFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVmOTFiMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9SaWNoVGV4dFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogVGhlIFByZWZlcmVuY2UgcGFnZSBmb3IgdGhlIHJpY2ggdGV4dCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlLCBTZWxlY3Rpb25MaXN0ZW5lciwgTW9kaWZ5TGlzdGVuZXIgewotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlOwotCi0JcHJpdmF0ZSBUZXh0IGxpbmVXaWR0aFRleHQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBpbmRlbnRDaGVja2JveDsKLQotCXByaXZhdGUgVGV4dCBpbmRlbnRTaXplVGV4dDsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCXN0b3JlID0gUmljaFRleHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQ29tcG9zaXRlIHdpZHRoQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJd2lkdGhDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCXdpZHRoQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxpbmVXaWR0aExhYmVsID0gbmV3IExhYmVsKHdpZHRoQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxpbmVXaWR0aExhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMubWF4Q2hhcnNQZXJMaW5lTGFiZWxfdGV4dCk7IAotCi0JCWxpbmVXaWR0aFRleHQgPSBuZXcgVGV4dCh3aWR0aENvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWxpbmVXaWR0aFRleHQuc2V0VGV4dChzdG9yZS5nZXRTdHJpbmcoUmljaFRleHRQcmVmZXJlbmNlcy5MSU5FX1dJRFRIKSk7Ci0JCWxpbmVXaWR0aFRleHQuc2V0VGV4dExpbWl0KDMpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAyNTsKLQkJbGluZVdpZHRoVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJbGluZVdpZHRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJQ29tcG9zaXRlIGluZGVudENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWluZGVudENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJaW5kZW50Q29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWluZGVudENoZWNrYm94ID0gbmV3IEJ1dHRvbihpbmRlbnRDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWluZGVudENoZWNrYm94LnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuaW5kZW50SFRNTENoZWNrYm94X3RleHQpOyAKLQkJaW5kZW50Q2hlY2tib3guc2V0U2VsZWN0aW9uKHN0b3JlCi0JCQkJLmdldEJvb2xlYW4oUmljaFRleHRQcmVmZXJlbmNlcy5JTkRFTlQpKTsKLQotCQluZXcgTGFiZWwoaW5kZW50Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLQkJTGFiZWwgaW5kZW50U2l6ZUxhYmVsID0gbmV3IExhYmVsKGluZGVudENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCWluZGVudFNpemVMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaW5kZW50U2l6ZUxhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuaW5kZW50U2l6ZUxhYmVsX3RleHQpOyAKLQotCQlpbmRlbnRTaXplVGV4dCA9IG5ldyBUZXh0KGluZGVudENvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWluZGVudFNpemVUZXh0Ci0JCQkJLnNldFRleHQoc3RvcmUuZ2V0U3RyaW5nKFJpY2hUZXh0UHJlZmVyZW5jZXMuSU5ERU5UX1NJWkUpKTsKLQkJaW5kZW50U2l6ZVRleHQuc2V0VGV4dExpbWl0KDEpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAxMDsKLQkJaW5kZW50U2l6ZVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWluZGVudFNpemVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZS5wZXJmb3JtRGVmYXVsdHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlsaW5lV2lkdGhUZXh0LnNldFRleHQoc3RvcmUKLQkJCQkuZ2V0RGVmYXVsdFN0cmluZyhSaWNoVGV4dFByZWZlcmVuY2VzLkxJTkVfV0lEVEgpKTsKLQkJaW5kZW50Q2hlY2tib3guc2V0U2VsZWN0aW9uKHN0b3JlCi0JCQkJLmdldERlZmF1bHRCb29sZWFuKFJpY2hUZXh0UHJlZmVyZW5jZXMuSU5ERU5UKSk7Ci0JCWluZGVudFNpemVUZXh0LnNldFRleHQoc3RvcmUKLQkJCQkuZ2V0RGVmYXVsdFN0cmluZyhSaWNoVGV4dFByZWZlcmVuY2VzLklOREVOVF9TSVpFKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlLnBlcmZvcm1PawotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJU3RyaW5nIGxpbmVXaWR0aFZhbHVlID0gbGluZVdpZHRoVGV4dC5nZXRUZXh0KCk7Ci0JCWlmIChsaW5lV2lkdGhWYWx1ZSAhPSBudWxsICYmIGxpbmVXaWR0aFZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJdHJ5IHsKLQkJCQlpbnQgbGluZVdpZHRoID0gSW50ZWdlci5wYXJzZUludChsaW5lV2lkdGhWYWx1ZSk7Ci0JCQkJc3RvcmUuc2V0VmFsdWUoUmljaFRleHRQcmVmZXJlbmNlcy5MSU5FX1dJRFRILCBsaW5lV2lkdGgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCi0JCWJvb2xlYW4gaW5kZW50VmFsdWUgPSBpbmRlbnRDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQkJc3RvcmUuc2V0VmFsdWUoUmljaFRleHRQcmVmZXJlbmNlcy5JTkRFTlQsIGluZGVudFZhbHVlKTsKLQotCQlTdHJpbmcgaW5kZW50U2l6ZVZhbHVlID0gaW5kZW50U2l6ZVRleHQuZ2V0VGV4dCgpOwotCQlpZiAoaW5kZW50U2l6ZVZhbHVlICE9IG51bGwgJiYgaW5kZW50U2l6ZVZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJdHJ5IHsKLQkJCQlpbnQgaW5kZW50U2l6ZSA9IEludGVnZXIucGFyc2VJbnQoaW5kZW50U2l6ZVZhbHVlKTsKLQkJCQlzdG9yZS5zZXRWYWx1ZShSaWNoVGV4dFByZWZlcmVuY2VzLklOREVOVF9TSVpFLCBpbmRlbnRTaXplKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXIjbW9kaWZ5VGV4dChNb2RpZnlFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcHJlZmVyZW5jZXMvUmljaFRleHRQcmVmZXJlbmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9SaWNoVGV4dFByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0MmVhZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9SaWNoVGV4dFByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogUHJlZmVyZW5jZXMgZm9yIHRoZSByaWNoIHRleHQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0UHJlZmVyZW5jZXMgewotCi0JLyoqCi0JICogcmljaCB0ZXh0IEVkaXRvciBwcmVmZXJlbmNlIGtleXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9XSURUSCA9ICJodG1sRWRpdG9yLmxpbmVXaWR0aCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVCA9ICJodG1sRWRpdG9yLmluZGVudCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVF9TSVpFID0gImh0bWxFZGl0b3IuaW5kZW50U2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBkZWZhdWx0IHByZWZlcmVuY2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUpIHsKLQkJc3RvcmUuc2V0RGVmYXVsdChMSU5FX1dJRFRILCAxMjApOwotCQlzdG9yZS5zZXREZWZhdWx0KElOREVOVCwgdHJ1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSU5ERU5UX1NJWkUsIDQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9SaWNoVGV4dFByZWZlcmVuY2VzSW5pdGlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcHJlZmVyZW5jZXMvUmljaFRleHRQcmVmZXJlbmNlc0luaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1OTU2ZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9SaWNoVGV4dFByZWZlcmVuY2VzSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIFRoZSByaWNoIHRleHQgcHJlZmVyZW5jZXMgaW5pdGlhbGl6ZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRQcmVmZXJlbmNlc0luaXRpYWxpemVyIGV4dGVuZHMKLQkJQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJUmljaFRleHRQcmVmZXJlbmNlcy5pbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKHN0b3JlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1YTc1ZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBwcmVmZXJlbmNlIHN1cHBvcnQgZm9yIHRoZSByaWNoIHRleHQgY29udHJvbCBhbmQgZWRpdG9yLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhYzk2YzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSBTZWFyY2ggVUkgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVmYTU1MjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiMWMzOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5TZWFyY2hVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dCwKLSBvcmcuZWNsaXBzZS5zZWFyY2gKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzIxZGM2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZFNlYXJjaC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RTZWFyY2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4M2MwZjQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZFNlYXJjaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlhOWE2MDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBTZWFyY2ggVUkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIE1ldGhvZCBTZWFyY2ggRGlhbG9nCi1tZXRob2RTZWFyY2hEaWFsb2dMYWJlbD1NZXRob2QgU2VhcmNoCi0KLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY0ZGVlNGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uuc2VhcmNoLnNlYXJjaFBhZ2VzIj4KLSAgICAgIDxwYWdlIGlkPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLk1ldGhvZFNlYXJjaFBhZ2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5NZXRob2RTZWFyY2hQYWdlIiAgICAgIAotICAgICAgICAgICAgbGFiZWw9IiVtZXRob2RTZWFyY2hEaWFsb2dMYWJlbCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kU2VhcmNoLmdpZiIKLSAgICAgICAgICAgIHNpemVIaW50PSIyNTAsMTYwIgotICAgICAgICAgICAgdGFiUG9zaXRpb249IjAiCi0gICAgICAgICAgICBleHRlbnNpb25zPSIqOjEiCi0gICAgICAgICAgICBzaG93U2NvcGVTZWN0aW9uPSJmYWxzZSIJCQotICAgICAgICAgICAgY2FuU2VhcmNoRW5jbG9zaW5nUHJvamVjdHM9ImZhbHNlIj4KLSAgICAgIDwvcGFnZT4gICAgCi0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Ik1ldGhvZFNlYXJjaFBhZ2UiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc2VhcmNoLnNlYXJjaFJlc3VsdFZpZXdQYWdlcyI+Ci0gICAgICA8dmlld1BhZ2UKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLk1ldGhvZFNlYXJjaFJlc3VsdFBhZ2UiCi0JCQlzZWFyY2hSZXN1bHRDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5NZXRob2RTZWFyY2hSZXN1bHQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5NZXRob2RTZWFyY2hSZXN1bHRQYWdlIj4KLSAgICAgIDwvdmlld1BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4gICAKLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvTWV0aG9kU2VhcmNoUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL01ldGhvZFNlYXJjaFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTRmMTk1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvTWV0aG9kU2VhcmNoUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLk1ldGhvZFNlYXJjaElucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWwuTWV0aG9kU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5NZXRob2RTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLk1ldGhvZFNlYXJjaFNjb3BlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkucHJlZmVyZW5jZXMuU2VhcmNoVUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFBhZ2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLk5ld1NlYXJjaFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLS8qKgotICogRGlzcGxheXMgdGhlIE1ldGhvZCBTZWFyY2ggcGFnZSBpbiB0aGUgU2VhcmNoIGRpYWxvZy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTZWFyY2hQYWdlIGV4dGVuZHMgRGlhbG9nUGFnZSBpbXBsZW1lbnRzIElTZWFyY2hQYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQVJDSF9QQUdFX0lEID0gTWV0aG9kU2VhcmNoUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgQ29tYm8gc2VhcmNoU3RyaW5nQ29tYm87Ci0KLQlwcml2YXRlIENvbWJvIG5hbWVQYXR0ZXJuQ29tYm87Ci0KLQlwcml2YXRlIEJ1dHRvbiBjYXNlU2Vuc2l0aXZlQ2hlY2tib3g7Ci0KLQlwcml2YXRlIE1ldGhvZFNlYXJjaFNjb3BlVmlld2VyIHNlYXJjaFNjb3BlVmlld2VyOwotCi0JcHJpdmF0ZSBJU2VhcmNoUGFnZUNvbnRhaW5lciBjb250YWluZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RTZWFyY2hQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAxMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgc2VhcmNoU3RyaW5nTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXNlYXJjaFN0cmluZ0xhYmVsLnNldFRleHQoU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoU3RyaW5nTGFiZWxfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLQkJc2VhcmNoU3RyaW5nQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXNlYXJjaFN0cmluZ0NvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlTdHJpbmcgc2F2ZWRTZWFyY2hTdHJpbmcgPSBTZWFyY2hVSVByZWZlcmVuY2VzLmdldFNlYXJjaFN0cmluZygpOwotCQlpZiAoc2F2ZWRTZWFyY2hTdHJpbmcgIT0gbnVsbCAmJiBzYXZlZFNlYXJjaFN0cmluZy5sZW5ndGgoKSA+IDApIHsKLQkJCXNlYXJjaFN0cmluZ0NvbWJvLnNldFRleHQoc2F2ZWRTZWFyY2hTdHJpbmcpOwotCQl9Ci0KLQkJY2FzZVNlbnNpdGl2ZUNoZWNrYm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWNhc2VTZW5zaXRpdmVDaGVja2JveC5zZXRUZXh0KFNlYXJjaFVJUmVzb3VyY2VzLmNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQljYXNlU2Vuc2l0aXZlQ2hlY2tib3guc2V0U2VsZWN0aW9uKFNlYXJjaFVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0Q2FzZVNlbnNpdGl2ZSgpKTsKLQotCQlMYWJlbCBlbGVtZW50TmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQllbGVtZW50TmFtZUxhYmVsLnNldFRleHQoU2VhcmNoVUlSZXNvdXJjZXMuZWxlbWVudE5hbWVMYWJlbF90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQotCQluYW1lUGF0dGVybkNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQluYW1lUGF0dGVybkNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlTdHJpbmcgc2F2ZWROYW1lUGF0dGVybiA9IFNlYXJjaFVJUHJlZmVyZW5jZXMuZ2V0TmFtZVBhdHRlcm4oKTsKLQkJaWYgKHNhdmVkTmFtZVBhdHRlcm4gIT0gbnVsbCAmJiBzYXZlZE5hbWVQYXR0ZXJuLmxlbmd0aCgpID4gMCkgewotCQkJbmFtZVBhdHRlcm5Db21iby5zZXRUZXh0KHNhdmVkTmFtZVBhdHRlcm4pOwotCQl9IGVsc2UgewotCQkJbmFtZVBhdHRlcm5Db21iby5zZXRUZXh0KCIqIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCW5hbWVQYXR0ZXJuQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY29udGFpbmVyLnNldFBlcmZvcm1BY3Rpb25FbmFibGVkKGdldFNlYXJjaEJ1dHRvbkVuYWJsZWQoKSk7Ci0JCQl9Ci0JCX0pOwotCQluYW1lUGF0dGVybkNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCQljb250YWluZXIuc2V0UGVyZm9ybUFjdGlvbkVuYWJsZWQoZ2V0U2VhcmNoQnV0dG9uRW5hYmxlZCgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0JCUdyb3VwIHNlYXJjaFNjb3BlR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXNlYXJjaFNjb3BlR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCUdyaWREYXRhIHNlYXJjaFNjb3BlR3JvdXBHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlzZWFyY2hTY29wZUdyb3VwR3JpZERhdGEuaGVpZ2h0SGludCA9IDIwMDsKLQkJc2VhcmNoU2NvcGVHcm91cC5zZXRMYXlvdXREYXRhKHNlYXJjaFNjb3BlR3JvdXBHcmlkRGF0YSk7Ci0JCXNlYXJjaFNjb3BlR3JvdXAuc2V0VGV4dChTZWFyY2hVSVJlc291cmNlcy5zY29wZUdyb3VwX3RleHQpOyAvLyROT04tTkxTLTEkCi0KLQkJc2VhcmNoU2NvcGVWaWV3ZXIgPSBuZXcgTWV0aG9kU2VhcmNoU2NvcGVWaWV3ZXIoc2VhcmNoU2NvcGVHcm91cCwKLQkJCQlTV1QuTk9ORSk7Ci0KLQkJY29udGFpbmVyLnNldFBlcmZvcm1BY3Rpb25FbmFibGVkKGdldFNlYXJjaEJ1dHRvbkVuYWJsZWQoKSk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFBhZ2UjcGVyZm9ybUFjdGlvbigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUFjdGlvbigpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQlTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hFcnJvcl90aXRsZSwgCi0JCQkJCVNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaEVycm9yX21zZywgCi0JCQkJCVNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaEVycm9yX3JlYXNvbik7IAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBzZWFyY2hTdHJpbmcgPSBzZWFyY2hTdHJpbmdDb21iby5nZXRUZXh0KCk7Ci0JCVN0cmluZyBuYW1lUGF0dGVybiA9IG5hbWVQYXR0ZXJuQ29tYm8uZ2V0VGV4dCgpOwotCQlNZXRob2RTZWFyY2hTY29wZSBzZWFyY2hTY29wZSA9IHNlYXJjaFNjb3BlVmlld2VyLmdldFNlYXJjaFNjb3BlKCk7Ci0JCU1ldGhvZFNlYXJjaElucHV0IHNlYXJjaElucHV0ID0gbmV3IE1ldGhvZFNlYXJjaElucHV0KHNlYXJjaFN0cmluZywKLQkJCQluYW1lUGF0dGVybiwgY2FzZVNlbnNpdGl2ZUNoZWNrYm94LmdldFNlbGVjdGlvbigpLCBmYWxzZSwKLQkJCQlmYWxzZSwgc2VhcmNoU2NvcGUpOwotCQlNZXRob2RTZWFyY2hRdWVyeSBzZWFyY2hRdWVyeSA9IG5ldyBNZXRob2RTZWFyY2hRdWVyeShzZWFyY2hJbnB1dCk7Ci0JCU5ld1NlYXJjaFVJLmFjdGl2YXRlU2VhcmNoUmVzdWx0VmlldygpOwotCQlOZXdTZWFyY2hVSS5ydW5RdWVyeUluQmFja2dyb3VuZChzZWFyY2hRdWVyeSk7Ci0JCVNlYXJjaFVJUHJlZmVyZW5jZXMuc2V0U2VhcmNoU3RyaW5nKHNlYXJjaFN0cmluZ0NvbWJvLmdldFRleHQoKSk7Ci0JCVNlYXJjaFVJUHJlZmVyZW5jZXMuc2V0TmFtZVBhdHRlcm4obmFtZVBhdHRlcm5Db21iby5nZXRUZXh0KCkpOwotCQlTZWFyY2hVSVByZWZlcmVuY2VzLnNldENhc2VTZW5zaXRpdmUoY2FzZVNlbnNpdGl2ZUNoZWNrYm94Ci0JCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFBhZ2Ujc2V0Q29udGFpbmVyKElTZWFyY2hQYWdlQ29udGFpbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihJU2VhcmNoUGFnZUNvbnRhaW5lciBjb250YWluZXIpIHsKLQkJdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVJlcGxhY2VQYWdlI3BlcmZvcm1SZXBsYWNlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtUmVwbGFjZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGVuYWJsZWQgc3RhdHVzIG9mIHRoZSBTZWFyY2ggYnV0dG9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTxjb2RlPiBpZiB0aGUgU2VhcmNoIGJ1dHRvbiBzaG91bGQgYmUgZW5hYmxlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBnZXRTZWFyY2hCdXR0b25FbmFibGVkKCkgewotCQlyZXR1cm4gbmFtZVBhdHRlcm5Db21iby5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9NZXRob2RTZWFyY2hSZXN1bHRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvTWV0aG9kU2VhcmNoUmVzdWx0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NWRlOTYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9NZXRob2RTZWFyY2hSZXN1bHRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5Ccm93c2luZ1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29udGVudFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5QZXJzcGVjdGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5NZXRob2RFbGVtZW50Vmlld1NvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLlNlYXJjaFJlc3VsdExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5TZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLlNlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuTmV3U2VhcmNoVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogRGlzcGxheXMgdGhlIE1ldGhvZCBTZWFyY2ggcmVzdWx0IGluIHRoZSBTZWFyY2ggdmlldy4gVGhlIHNlYXJjaCByZXN1bHQKLSAqIGNhbiBiZSBkaXNwbGF5ZWQgaW4gYSBoaWVyYXJjaGljYWwgb3IgZmxhdCB2aWV3LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFNlYXJjaFJlc3VsdFBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZQotCQlpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIFNlYXJjaFJlc3VsdExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaFJlc3VsdFBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgU2VhcmNoUmVzdWx0TGFiZWxQcm92aWRlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UjaXNMYXlvdXRTdXBwb3J0ZWQoaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGF5b3V0U3VwcG9ydGVkKGludCBsYXlvdXQpIHsKLQkJcmV0dXJuICgobGF5b3V0ICYgRkxBR19MQVlPVVRfRkxBVCkgIT0gMCB8fCAobGF5b3V0ICYgRkxBR19MQVlPVVRfVFJFRSkgIT0gMCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSNjb25maWd1cmVUcmVlVmlld2VyKFRyZWVWaWV3ZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlVHJlZVZpZXdlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlcigpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQl2aWV3ZXIuc2V0U29ydGVyKG5ldyBNZXRob2RFbGVtZW50Vmlld1NvcnRlcigpKTsKLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlI2NvbmZpZ3VyZVRhYmxlVmlld2VyKFRhYmxlVmlld2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVRhYmxlVmlld2VyKFRhYmxlVmlld2VyIHZpZXdlcikgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIoKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJdmlld2VyLnNldFNvcnRlcihuZXcgTWV0aG9kRWxlbWVudFZpZXdTb3J0ZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSNlbGVtZW50c0NoYW5nZWQoT2JqZWN0W10pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZWxlbWVudHNDaGFuZ2VkKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlpZiAoY29udGVudFByb3ZpZGVyIGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlcikgewotCQkJCSgoU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlcikgY29udGVudFByb3ZpZGVyKQotCQkJCQkJLmVsZW1lbnRzQ2hhbmdlZChvYmplY3RzKTsKLQkJCX0gZWxzZSBpZiAoY29udGVudFByb3ZpZGVyIGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIpIHsKLQkJCQkoKFNlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyKSBjb250ZW50UHJvdmlkZXIpCi0JCQkJCQkuZWxlbWVudHNDaGFuZ2VkKG9iamVjdHMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSNjbGVhcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXIoKSB7Ci0JCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJaWYgKGNvbnRlbnRQcm92aWRlciBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIpIHsKLQkJCQkoKFNlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIpIGNvbnRlbnRQcm92aWRlcikuY2xlYXIoKTsKLQkJCX0gZWxzZSBpZiAoY29udGVudFByb3ZpZGVyIGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIpIHsKLQkJCQkoKFNlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyKSBjb250ZW50UHJvdmlkZXIpLmNsZWFyKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlI3Nob3dNYXRjaChNYXRjaCwKLQkgKiAgICAgIGludCwgaW50LCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dNYXRjaChNYXRjaCBtYXRjaCwgaW50IGN1cnJlbnRPZmZzZXQsIGludCBjdXJyZW50TGVuZ3RoLAotCQkJYm9vbGVhbiBhY3RpdmF0ZSkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJaWYgKG1hdGNoLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgYWN0aXZhdGUpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBtYXRjaC5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoUGVyc3BlY3RpdmVVdGlsCi0JCQkJCS5pc0FjdGl2ZVBlcnNwZWN0aXZlKEJyb3dzaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpKSB7Ci0JCQkJUGVyc3BlY3RpdmVVdGlsCi0JCQkJCQkub3BlblBlcnNwZWN0aXZlKEF1dGhvcmluZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKTsKLQkJCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQkJCUlWaWV3UGFydCB2aWV3ID0gYWN0aXZlUGFnZQotCQkJCQkJCS5maW5kVmlldyhOZXdTZWFyY2hVSS5TRUFSQ0hfVklFV19JRCk7Ci0JCQkJCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCQkJCWFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoTmV3U2VhcmNoVUkuU0VBUkNIX1ZJRVdfSUQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZGlzcGxheUVkaXRvcihlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBNZXRob2QgZWRpdG9yIGZvciB0aGUgc2VsZWN0ZWQgTWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcGxheUVkaXRvcihNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLm9wZW5FZGl0b3IoCi0JCQkJCVVtYVV0aWwuZ2V0UHJvY2Vzc0NvbXBvbmVudChlbGVtZW50KSk7Ci0JCX0gZWxzZSB7Ci0JCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkub3BlbkVkaXRvcihlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChQZXJzcGVjdGl2ZVV0aWwKLQkJCQkuaXNBY3RpdmVQZXJzcGVjdGl2ZShCcm93c2luZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKSkgewotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCU9iamVjdFtdIHNlbGVjdGVkRWxlbWVudHMgPSBzZWwudG9BcnJheSgpOwotCQkJCWlmIChzZWxlY3RlZEVsZW1lbnRzICE9IG51bGwgJiYgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQkJCWlmIChzZWxlY3RlZEVsZW1lbnRzWzBdIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlkaXNwbGF5SFRNTFBhZ2UoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGVkRWxlbWVudHNbMF0pOwotCQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIEhUTUwgY29udGVudCBwYWdlIGZvciB0aGUgc2VsZWN0ZWQgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIENvbnRlbnQgdmlldyBjYW5ub3QgYmUgZGlzcGxheWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcGxheUhUTUxQYWdlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkKLQkJCXRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luCi0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQlJVmlld1BhcnQgdmlldyA9IGFjdGl2ZVBhZ2UuZmluZFZpZXcoQ29udGVudFZpZXcuVklFV19JRCk7Ci0JCQlpZiAodmlldyA9PSBudWxsKSB7Ci0JCQkJdmlldyA9IGFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoQ29udGVudFZpZXcuVklFV19JRCk7Ci0JCQl9Ci0JCQlpZiAodmlldyAhPSBudWxsKSB7Ci0JCQkJKChDb250ZW50VmlldykgdmlldykuZGlzcGxheUhUTUxDb250ZW50UGFnZShlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MzMzOWJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgTWV0aG9kIFNlYXJjaCBQYWdlCi1zZWFyY2hTdHJpbmdMYWJlbF90ZXh0PVRleHQgKCogPSBhbnkgc3RyaW5nLCA/ID0gYW55IGNoYXJhY3Rlcik6Ci1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1DYXNlIHNlbnNpdGl2ZQotZWxlbWVudE5hbWVMYWJlbF90ZXh0PU1ldGhvZCBlbGVtZW50IG5hbWUgb3IgcHJlc2VudGF0aW9uIG5hbWUgcGF0dGVybjoKLXNjb3BlR3JvdXBfdGV4dD1TY29wZQotcm9sZUNoZWNrYm94X3RleHQ9Um9sZQotdGFza0NoZWNrYm94X3RleHQ9VGFzawotd29ya1Byb2R1Y3RDaGVja2JveF90ZXh0PVdvcmsgUHJvZHVjdAotCi0jIE1ldGhvZCBTZWFyY2ggUXVlcnkKLXNlYXJjaFF1ZXJ5X3RleHQ9TWV0aG9kIFNlYXJjaAotCi0jIE1ldGhvZCBTZWFyY2ggUHJvZ3Jlc3MgRGlhbG9nCi1zY2FuTGlicmFyeVRhc2tfbmFtZT1TY2FubmluZyBtZXRob2QgbGlicmFyeS4uLgotc2NhbkVsZW1lbnRUYXNrX25hbWU9U2Nhbm5pbmcgbWV0aG9kIGVsZW1lbnQgJyd7MH0nJy4uLgotCi0jIE1ldGhvZCBTZWFyY2ggRXJyb3IgRGlhbG9nCi1zZWFyY2hFcnJvcl90aXRsZT1NZXRob2QgU2VhcmNoCi1zZWFyY2hFcnJvcl9tc2c9SVVQUzAxMDBFOiBTZWFyY2ggb3BlcmF0aW9uIGNhbm5vdCBwcm9jZWVkLgotc2VhcmNoRXJyb3JfcmVhc29uPU5vIG1ldGhvZCBsaWJyYXJ5IGlzIGN1cnJlbnRseSBvcGVuZWQuXG5cbk9wZW4gYSBtZXRob2QgbGlicmFyeSBhbmQgdHJ5IGFnYWluLgotCi0jIE1ldGhvZCBTZWFyY2ggUmVzdWx0Ci1zZWFyY2hSZXN1bHRfbWV0aG9kQ29udGVudD1NZXRob2QgQ29udGVudAotc2VhcmNoUmVzdWx0X2NvbnRlbnRQYWNrYWdlcz1Db250ZW50IFBhY2thZ2VzCi1zZWFyY2hSZXN1bHRfc3RhbmRhcmRDYXRlZ29yaWVzPVN0YW5kYXJkIENhdGVnb3JpZXMKLXNlYXJjaFJlc3VsdF9kaXNjaXBsaW5lcz1EaXNjaXBsaW5lcwotc2VhcmNoUmVzdWx0X2RvbWFpbnM9RG9tYWlucwotc2VhcmNoUmVzdWx0X3dvcmtQcm9kdWN0VHlwZXM9V29yayBQcm9kdWN0IFR5cGVzCi1zZWFyY2hSZXN1bHRfcm9sZVNldHM9Um9sZSBTZXRzCi1zZWFyY2hSZXN1bHRfdG9vbHM9VG9vbHMKLXNlYXJjaFJlc3VsdF9jdXN0b21DYXRlZ29yaWVzPUN1c3RvbSBDYXRlZ29yaWVzCi1zZWFyY2hSZXN1bHRfcHJvY2Vzc2VzPVByb2Nlc3Nlcwotc2VhcmNoUmVzdWx0X2NhcGFiaWxpdHlQYXR0ZXJucz1DYXBhYmlsaXR5IFBhdHRlcm5zCi1zZWFyY2hSZXN1bHRfZGVsaXZlcnlQcm9jZXNzZXM9RGVsaXZlcnkgUHJvY2Vzc2VzCi1zZWFyY2hSZXN1bHRfbWF0Y2g9Jyd7MH0nJyAtIDEgbWF0Y2gKLXNlYXJjaFJlc3VsdF9tYXRjaGVzPScnezB9JycgLSB7MX0gbWF0Y2hlcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1NlYXJjaFVJUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvU2VhcmNoVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmZlNDY4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvU2VhcmNoVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgU2VhcmNoIFVJIHBsdWctaW4gYWN0aXZhdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFNlYXJjaFVJUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlYXJjaFVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VhcmNoVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9TZWFyY2hVSVJlc291cmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1NlYXJjaFVJUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQzMGQzMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1NlYXJjaFVJUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgU2VhcmNoIFVJIHJlc291cmNlIGJ1bmRsZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTZWFyY2hVSVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBTZWFyY2hVSVJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hTdHJpbmdMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FzZVNlbnNpdGl2ZUNoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50TmFtZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzY29wZUdyb3VwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlQ2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tDaGVja2JveF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RDaGVja2JveF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUXVlcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNjYW5MaWJyYXJ5VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2NhbkVsZW1lbnRUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hFcnJvcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9tZXRob2RDb250ZW50OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X2NvbnRlbnRQYWNrYWdlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9zdGFuZGFyZENhdGVnb3JpZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfZGlzY2lwbGluZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfZG9tYWluczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF93b3JrUHJvZHVjdFR5cGVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X3JvbGVTZXRzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X3Rvb2xzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X2N1c3RvbUNhdGVnb3JpZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfcHJvY2Vzc2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X2NhcGFiaWxpdHlQYXR0ZXJuczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9kZWxpdmVyeVByb2Nlc3NlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9tYXRjaDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9tYXRjaGVzOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgU2VhcmNoVUlSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgU2VhcmNoVUlSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZS4KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSU1ldGhvZFNlYXJjaFF1ZXJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSU1ldGhvZFNlYXJjaFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNjOGVkYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lNZXRob2RTZWFyY2hRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnk7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBtZXRob2Qgc2VhcmNoIHF1ZXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZFNlYXJjaFF1ZXJ5IGV4dGVuZHMgSVNlYXJjaFF1ZXJ5IHsKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JU2VhcmNoUmVzdWx0Q29sbGVjdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSVNlYXJjaFJlc3VsdENvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDBiNTAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JU2VhcmNoUmVzdWx0Q29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgbWV0aG9kIHNlYXJjaCByZXN1bHQgY29sbGVjdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHsKLQotCS8qKgotCSAqIEV2YWx1YXRlcyB0aGUgZ2l2ZW4gb2JqZWN0IHRvIHNlZSBpZiB0aGVyZSBpcyBhIG1hdGNoIGluIHRoZSBzZWFyY2gKLQkgKiBjcml0ZXJpYS4KLQkgKiAKLQkgKiBAcGFyYW0gbWF0Y2gKLQkgKiAgICAgICAgICAgIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBtZXRob2QgZWxlbWVudCB0byBtYXRjaAotCSAqLwotCXZvaWQgYWNjZXB0KE9iamVjdCBtYXRjaCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RFbGVtZW50Vmlld1NvcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZEVsZW1lbnRWaWV3U29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDViYzQxY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZEVsZW1lbnRWaWV3U29ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci0KLS8qKgotICogU29ydHMgdGhlIG1ldGhvZCBlbGVtZW50cyBpbiBhIHNwZWNpZmljIG9yZGVyIGZvciBkaXNwbGF5IGluIHRoZSBTZWFyY2gKLSAqIHZpZXcuCi0gKiA8cD4KLSAqIFRoZSBtZXRob2QgZWxlbWVudHMgYXJlIHNvcnRlZCBieSB0eXBlcy4gV2l0aGluIGVhY2ggdHlwZSwgdGhlIGVsZW1lbnRzIGFyZQotICogc29ydGVkIGFscGhhYmV0aWNhbGx5IGJ5IG5hbWVzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRWaWV3U29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRWaWV3U29ydGVyKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXIjY29tcGFyZShWaWV3ZXIsIE9iamVjdCwKLQkgKiAgICAgIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJaWYgKGUxIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlpZiAoIShlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJaWYgKGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgaWYgKCEoZTIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQlpZiAoZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgZTIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmICghKGUyIGluc3RhbmNlb2YgUm9sZSkpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQlpZiAoZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgZTIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZQotCQkJCQl8fCBlMiBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoIShlMiBpbnN0YW5jZW9mIFRhc2spKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCWlmIChlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBlMiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlCi0JCQkJCXx8IGUyIGluc3RhbmNlb2YgUm9sZSB8fCBlMiBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoIShlMiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQlpZiAoZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgZTIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZQotCQkJCQl8fCBlMiBpbnN0YW5jZW9mIFJvbGUgfHwgZTIgaW5zdGFuY2VvZiBUYXNrCi0JCQkJCXx8IGUyIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoZTIgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCVN0cmluZyBuYW1lMSA9IGUxLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyBuYW1lMiA9IGUyLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCWlmICghbmFtZTEuZXF1YWxzKG5hbWUyKSkgewotCQkJCQlyZXR1cm4gY29sbGF0b3IuY29tcGFyZShuYW1lMSwgbmFtZTIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQlpZiAoZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgZTIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZQotCQkJCQl8fCBlMiBpbnN0YW5jZW9mIFJvbGUgfHwgZTIgaW5zdGFuY2VvZiBUYXNrCi0JCQkJCXx8IGUyIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QgfHwgZTIgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5Ci0JCQkJCSYmICEoZTIgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoIShlMSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KQotCQkJCQkmJiBlMiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfSBlbHNlIGlmIChlMiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCQkJCVN0cmluZyBuYW1lMSA9IGUxLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyBuYW1lMiA9IGUyLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCWlmICghbmFtZTEuZXF1YWxzKG5hbWUyKSkgewotCQkJCQlyZXR1cm4gY29sbGF0b3IuY29tcGFyZShuYW1lMSwgbmFtZTIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJaWYgKGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGUyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UKLQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmIChlMiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlICYmICEoZTIgaW5zdGFuY2VvZiBQcm9jZXNzKSkgewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmICghKGUyIGluc3RhbmNlb2YgUHJvY2VzcykpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJaWYgKGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGUyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UKLQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmIChlMiBpbnN0YW5jZW9mIFByb2Nlc3MgJiYgIShlMSBpbnN0YW5jZW9mIFByb2Nlc3MpKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfSBlbHNlIGlmICghKGUyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQpIHsKLQkJCWlmIChlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBlMiBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UKLQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCB8fCBlMiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBQaGFzZSkgewotCQkJCWlmICghKGUyIGluc3RhbmNlb2YgUGhhc2UpKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgSXRlcmF0aW9uKSB7Ci0JCQkJaWYgKGUyIGluc3RhbmNlb2YgUGhhc2UpIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJCWlmICghKGUyIGluc3RhbmNlb2YgSXRlcmF0aW9uKSkgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJaWYgKGUyIGluc3RhbmNlb2YgUGhhc2UgfHwgZTIgaW5zdGFuY2VvZiBJdGVyYXRpb24pIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJCWlmICghKGUyIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQkJaWYgKGUyIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJCWlmICghKGUyIGluc3RhbmNlb2YgTWlsZXN0b25lKSkgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKGUyIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgZTIgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJCWlmICghKGUyIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQlpZiAoZTIgaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBlMiBpbnN0YW5jZW9mIE1pbGVzdG9uZQotCQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQlyZXR1cm4gMTsKLQkJCQl9Ci0JCQkJaWYgKCEoZTIgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlpZiAoZTIgaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBlMiBpbnN0YW5jZW9mIE1pbGVzdG9uZQotCQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcgotCQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQlyZXR1cm4gMTsKLQkJCQl9Ci0JCQkJaWYgKCEoZTIgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBlMSwgZTIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaElucHV0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoSW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTE0ZDA3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoSW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyB0aGUgc2VhcmNoIHN0cmluZ3MgYW5kIG9wdGlvbnMgdGhhdCBhcmUgdXNlZCBhcyBpbnB1dHMgdG8gYQotICogbWV0aG9kIHNlYXJjaC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTZWFyY2hJbnB1dCB7Ci0KLQlwcml2YXRlIFN0cmluZyBzZWFyY2hTdHJpbmc7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lUGF0dGVybjsKLQotCXByaXZhdGUgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlOwotCi0JcHJpdmF0ZSBib29sZWFuIHdob2xlV29yZDsKLQotCXByaXZhdGUgYm9vbGVhbiByZWdFeHA7Ci0KLQlwcml2YXRlIE1ldGhvZFNlYXJjaFNjb3BlIHNlYXJjaFNjb3BlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VhcmNoU3RyaW5nCi0JICogICAgICAgICAgICBhIHNlYXJjaCBzdHJpbmcKLQkgKiBAcGFyYW0gbmFtZVBhdHRlcm4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQgbmFtZSBwYXR0ZXJuCi0JICogQHBhcmFtIGNhc2VTZW5zaXRpdmUKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBtYWtlIHRoZSBzZWFyY2ggY2FzZSBzZW5zaXRpdmUKLQkgKiBAcGFyYW0gd2hvbGVXb3JkCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgc2VhcmNoIGZvciB3aG9sZSB3b3JkIG9ubHkKLQkgKiBAcGFyYW0gcmVnRXhwCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgc2VhcmNoIHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbgotCSAqIEBwYXJhbSBzZWFyY2hTY29wZQotCSAqICAgICAgICAgICAgYSBzZWFyY2ggc2NvcGUKLQkgKi8KLQlwdWJsaWMgTWV0aG9kU2VhcmNoSW5wdXQoU3RyaW5nIHNlYXJjaFN0cmluZywgU3RyaW5nIG5hbWVQYXR0ZXJuLAotCQkJYm9vbGVhbiBjYXNlU2Vuc2l0aXZlLCBib29sZWFuIHdob2xlV29yZCwgYm9vbGVhbiByZWdFeHAsCi0JCQlNZXRob2RTZWFyY2hTY29wZSBzZWFyY2hTY29wZSkgewotCQl0aGlzLnNlYXJjaFN0cmluZyA9IHNlYXJjaFN0cmluZzsKLQkJdGhpcy5uYW1lUGF0dGVybiA9IG5hbWVQYXR0ZXJuOwotCQl0aGlzLmNhc2VTZW5zaXRpdmUgPSBjYXNlU2Vuc2l0aXZlOwotCQl0aGlzLndob2xlV29yZCA9IHdob2xlV29yZDsKLQkJdGhpcy5yZWdFeHAgPSByZWdFeHA7Ci0JCXRoaXMuc2VhcmNoU2NvcGUgPSBzZWFyY2hTY29wZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWFyY2ggc3RyaW5nLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlYXJjaCBzdHJpbmcgdG8gbG9vayBmb3IgdGhlIE1ldGhvZCBlbGVtZW50IGNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlYXJjaFN0cmluZygpIHsKLQkJcmV0dXJuIHNlYXJjaFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIHBhdHRlcm4uCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBwYXR0ZXJuIHVzZWQgdG8gbWF0Y2ggdGhlIE1ldGhvZCBlbGVtZW50IG5hbWVzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lUGF0dGVybigpIHsKLQkJcmV0dXJuIG5hbWVQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNhc2Ugc2Vuc2l0aXZpdHkgb2YgdGhlIHNlYXJjaC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZWFyY2ggaXMgY2FzZSBzZW5zaXRpdmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRDYXNlU2Vuc2l0aXZlKCkgewotCQlyZXR1cm4gY2FzZVNlbnNpdGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aG9sZSB3b3JkIG9wdGlvbiBvZiB0aGUgc2VhcmNoLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlYXJjaCBpcyBiYXNlZCBvbiB3aG9sZSB3b3JkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0V2hvbGVXb3JkKCkgewotCQlyZXR1cm4gd2hvbGVXb3JkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBvcHRpb24gb2YgdGhlIHNlYXJjaC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZWFyY2ggaXMgYmFzZWQgb24gcmVndWxhciBleHByZXNzaW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0UmVndWxhckV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiByZWdFeHA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VhcmNoIHNjb3BlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlYXJjaCBzY29wZQotCSAqLwotCXB1YmxpYyBNZXRob2RTZWFyY2hTY29wZSBnZXRTZWFyY2hTY29wZSgpIHsKLQkJcmV0dXJuIHNlYXJjaFNjb3BlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMzM5MzljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnhtbC5BYnN0cmFjdFNBWFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLlNlYXJjaFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuU2VhcmNoVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci0KLS8qKgotICogUGVyZm9ybXMgYSBtZXRob2Qgc2VhcmNoIGJ5IGl0ZXJhdGluZyB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeSBhbmQgcGFyc2luZwotICogdGhlIGNvbnRlbnQgZWxlbWVudCBYTUkgZmlsZXMgd2hlcmUgbmVjZXNzYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFNlYXJjaE9wZXJhdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NBTl9MSUJSQVJZX1RFWFQgPSBTZWFyY2hVSVJlc291cmNlcy5zY2FuTGlicmFyeVRhc2tfbmFtZTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDQU5fRUxFTUVOVF9URVhUID0gU2VhcmNoVUlSZXNvdXJjZXMuc2NhbkVsZW1lbnRUYXNrX25hbWU7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZzsKLQotCXByaXZhdGUgTWV0aG9kU2VhcmNoSW5wdXQgc2VhcmNoSW5wdXQ7Ci0KLQlwcml2YXRlIElTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0OwotCi0JcHJpdmF0ZSBTdHJpbmcgc2VhcmNoU3RyaW5nOwotCi0JcHJpdmF0ZSBib29sZWFuIGNhc2VTZW5zaXRpdmU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVnRXhwOwotCi0JcHJpdmF0ZSBQYXR0ZXJuIHNlYXJjaFN0cmluZ1BhdHRlcm47Ci0KLQlwcml2YXRlIFBhdHRlcm4gZWxlbWVudE5hbWVQYXR0ZXJuOwotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50U2Nhbm5lciBlbGVtZW50U2Nhbm5lcjsKLQotCXByaXZhdGUgTGlzdCBwYXJzZWRGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3I7Ci0KLQkvLyBTY2FucyB0aGUgY29udGVudCBlbGVtZW50IFhNSSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhIE1ldGhvZCBlbGVtZW50IHRvCi0JLy8gbG9vayBmb3IgdGhlIHNlYXJjaCBzdHJpbmcuCi0JcHJpdmF0ZSBjbGFzcyBNZXRob2RFbGVtZW50U2Nhbm5lciBleHRlbmRzIEFic3RyYWN0U0FYUGFyc2VyIHsKLQotCQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkJICovCi0JCXB1YmxpYyBNZXRob2RFbGVtZW50U2Nhbm5lcigpIHsKLQkJCXN1cGVyKG51bGwsIGZhbHNlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBQYXJzZXMgdGhlIGNvbnRlbnQgWE1JIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBNZXRob2QgZWxlbWVudC4KLQkJICogCi0JCSAqIEBwYXJhbSBlbGVtZW50Ci0JCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFyc2UoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQkJU3RyaW5nIGVsZW1lbnRDb250ZW50UGF0aCA9IGdldEVsZW1lbnRQYXRoKGVsZW1lbnQpOwotCQkJU3RyaW5nIGJyaWVmRGVzY3JpcHRpb24gPSBlbGVtZW50LmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCWlmIChzZWFyY2hTdHJpbmdQYXR0ZXJuLm1hdGNoZXIoYnJpZWZEZXNjcmlwdGlvbikuZmluZCgpKSB7Ci0JCQkJcmVzdWx0LmFjY2VwdChlbGVtZW50KTsKLQkJCX0KLQkJCWlmIChlbGVtZW50Q29udGVudFBhdGggIT0gbnVsbAotCQkJCQkmJiAhcGFyc2VkRmlsZXMuY29udGFpbnMoZWxlbWVudENvbnRlbnRQYXRoKSkgewotCQkJCXN1cGVyLnBhcnNlKGVsZW1lbnRDb250ZW50UGF0aCk7Ci0JCQkJcGFyc2VkRmlsZXMuYWRkKGVsZW1lbnRDb250ZW50UGF0aCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBBYnN0cmFjdFNBWFBhcnNlciNzdGFydEVsZW1lbnQoU3RyaW5nLCBTdHJpbmcsIFN0cmluZywKLQkJICogICAgICBBdHRyaWJ1dGVzKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkwsIFN0cmluZyBsb2NhbE5hbWUsCi0JCQkJU3RyaW5nIHFuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGVzLmdldFFOYW1lKGkpOwotCQkJCWlmICghbmFtZS5lcXVhbHMoImJyaWVmRGVzY3JpcHRpb24iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyB2YWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSk7Ci0JCQkJCWlmIChzZWFyY2hTdHJpbmdQYXR0ZXJuLm1hdGNoZXIodmFsdWUpLmZpbmQoKSkgewotCQkJCQkJcmVzdWx0LmFjY2VwdChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIEFic3RyYWN0U0FYUGFyc2VyI2VuZEVsZW1lbnQoU3RyaW5nLCBTdHJpbmcsIFN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSTCwgU3RyaW5nIGxvY2FsTmFtZSwKLQkJCQlTdHJpbmcgcW5hbWUpIHsKLQkJCVN0cmluZyB2YWx1ZSA9IHN0ckJ1Zi50b1N0cmluZygpOwotCQkJaWYgKHNlYXJjaFN0cmluZ1BhdHRlcm4ubWF0Y2hlcih2YWx1ZSkuZmluZCgpKSB7Ci0JCQkJcmVzdWx0LmFjY2VwdChlbGVtZW50KTsKLQkJCX0KLQkJCXN0ckJ1Zi5zZXRMZW5ndGgoMCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHNlYXJjaFN0cmluZwotCSAqICAgICAgICAgICAgYSBzZWFyY2ggc3RyaW5nCi0JICogQHBhcmFtIG5hbWVQYXR0ZXJuCi0JICogICAgICAgICAgICBhIG5hbWUgcGF0dGVybgotCSAqIEBwYXJhbSByZXN1bHQKLQkgKiAgICAgICAgICAgIGEgc2VhcmNoIHJlc3VsdCBjb2xsZWN0b3IKLQkgKi8KLQlwdWJsaWMgTWV0aG9kU2VhcmNoT3BlcmF0aW9uKE1ldGhvZFNlYXJjaElucHV0IHNlYXJjaElucHV0LAotCQkJSVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHQpIHsKLQkJdGhpcy5zZWFyY2hJbnB1dCA9IHNlYXJjaElucHV0OwotCQl0aGlzLnJlc3VsdCA9IHJlc3VsdDsKLQotCQljYXNlU2Vuc2l0aXZlID0gc2VhcmNoSW5wdXQuZ2V0Q2FzZVNlbnNpdGl2ZSgpOwotCQlyZWdFeHAgPSBzZWFyY2hJbnB1dC5nZXRSZWd1bGFyRXhwcmVzc2lvbigpOwotCQllbGVtZW50TmFtZVBhdHRlcm4gPSBNZXRob2RTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4oc2VhcmNoSW5wdXQKLQkJCQkuZ2V0TmFtZVBhdHRlcm4oKSwgZmFsc2UsIGZhbHNlKTsKLQotCQlkZWJ1ZyA9IFNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JCXNlYXJjaFN0cmluZyA9IHNlYXJjaElucHV0LmdldFNlYXJjaFN0cmluZygpOwotCQlpZiAoc2VhcmNoU3RyaW5nID09IG51bGwpCi0JCQlzZWFyY2hTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc2VhcmNoU3RyaW5nLmxlbmd0aCgpID4gMCkgewotCQkJZWxlbWVudFNjYW5uZXIgPSBuZXcgTWV0aG9kRWxlbWVudFNjYW5uZXIoKTsKLQkJCXNlYXJjaFN0cmluZ1BhdHRlcm4gPSBNZXRob2RTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4oCi0JCQkJCXNlYXJjaFN0cmluZywgY2FzZVNlbnNpdGl2ZSwgcmVnRXhwKTsKLQkJfQotCi0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiTWV0aG9kU2VhcmNoT3BlcmF0aW9uIGNvbnN0cnVjdG9yOiBzZWFyY2hTdHJpbmc9IiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBzZWFyY2hTdHJpbmcKLQkJCQkJCQkrICIsIGVsZW1lbnROYW1lUGF0dGVybj0iIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIHNlYXJjaElucHV0LmdldE5hbWVQYXR0ZXJuKCkKLQkJCQkJCQkrICIsIGNhc2VTZW5zaXRpdmU9IiArIGNhc2VTZW5zaXRpdmUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgc2VhcmNoIG9wZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogICAgICAgICAgICBhIHByb2dyZXNzIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCXRoaXMucHJvZ3Jlc3NNb25pdG9yID0gcHJvZ3Jlc3NNb25pdG9yOwotCQl0aGlzLnByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soU0NBTl9MSUJSQVJZX1RFWFQsIDc1MDApOwotCi0JCS8vIEl0ZXJhdGUgdGhlIE1ldGhvZCBMaWJyYXJ5IHRvIGxvb2sgZm9yIGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIG5hbWUKLQkJLy8gcGF0dGVybi4KLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlMaXN0IG1ldGhvZFBsdWdpbnMgPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW5zKGxpYnJhcnkpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBtZXRob2RQbHVnaW5zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpCi0JCQkJJiYgIXByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaS5uZXh0KCk7Ci0JCQltYXRjaFBhdHRlcm4obWV0aG9kUGx1Z2luKTsKLQotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlOwotCQkJaWYgKHNlYXJjaElucHV0LmdldFNlYXJjaFNjb3BlKCkuaW5jbHVkZUNvcmVDb250ZW50KCkpIHsKLQkJCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sCi0JCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0JCQkJc2VhcmNoTWV0aG9kUGFja2FnZXMobWV0aG9kUGFja2FnZSk7Ci0JCQl9Ci0KLQkJCWlmIChzZWFyY2hJbnB1dC5nZXRTZWFyY2hTY29wZSgpLmluY2x1ZGUoCi0JCQkJCU1ldGhvZFNlYXJjaFNjb3BlLlNUQU5EQVJEX0NBVEVHT1JZKSkgewotCQkJCW1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwKLQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKTsKLQkJCQlzZWFyY2hNZXRob2RQYWNrYWdlcyhtZXRob2RQYWNrYWdlKTsKLQkJCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sCi0JCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGgpOwotCQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKG1ldGhvZFBhY2thZ2UpOwotCQkJCW1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwKLQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCk7Ci0JCQkJc2VhcmNoTWV0aG9kUGFja2FnZXMobWV0aG9kUGFja2FnZSk7Ci0JCQkJbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLAotCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aCk7Ci0JCQkJc2VhcmNoTWV0aG9kUGFja2FnZXMobWV0aG9kUGFja2FnZSk7Ci0JCQkJbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLAotCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCk7Ci0JCQkJc2VhcmNoTWV0aG9kUGFja2FnZXMobWV0aG9kUGFja2FnZSk7Ci0JCQl9Ci0KLQkJCWlmIChzZWFyY2hJbnB1dC5nZXRTZWFyY2hTY29wZSgpLmluY2x1ZGUoCi0JCQkJCU1ldGhvZFNlYXJjaFNjb3BlLkNVU1RPTV9DQVRFR09SWSkpIHsKLQkJCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sCi0JCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCQkJc2VhcmNoTWV0aG9kUGFja2FnZXMobWV0aG9kUGFja2FnZSk7Ci0JCQl9Ci0KLQkJCWlmIChzZWFyY2hJbnB1dC5nZXRTZWFyY2hTY29wZSgpLmluY2x1ZGUoCi0JCQkJCU1ldGhvZFNlYXJjaFNjb3BlLkNBUEFCSUxJVFlfUEFUVEVSTikpIHsKLQkJCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sCi0JCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCk7Ci0JCQkJc2VhcmNoTWV0aG9kUGFja2FnZXMobWV0aG9kUGFja2FnZSk7Ci0JCQl9Ci0KLQkJCWlmIChzZWFyY2hJbnB1dC5nZXRTZWFyY2hTY29wZSgpLmluY2x1ZGUoCi0JCQkJCU1ldGhvZFNlYXJjaFNjb3BlLkRFTElWRVJZX1BST0NFU1MpKSB7Ci0JCQkJbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLAotCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoKTsKLQkJCQlzZWFyY2hNZXRob2RQYWNrYWdlcyhtZXRob2RQYWNrYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNlYXJjaGVzIGEgTWV0aG9kIFBhY2thZ2UuCi0JICogCi0JICogQHBhcmFtIG1ldGhvZFBhY2thZ2UKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBhY2thZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZWFyY2hNZXRob2RQYWNrYWdlcyhNZXRob2RQYWNrYWdlIG1ldGhvZFBhY2thZ2UpIHsKLQkJaWYgKG1ldGhvZFBhY2thZ2UgPT0gbnVsbAotCQkJCXx8IG1ldGhvZFBhY2thZ2UuZ2V0TmFtZSgpLmVxdWFscygKLQkJCQkJCU1vZGVsU3RydWN0dXJlLkhJRERFTl9QQUNLQUdFX05BTUUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkvLyBBZGQgdGhlIGFzc29jaWF0ZWQgQ2FwYWJpbGl0eVBhdHRlcm4gb3IgRGVsaXZlcnlQcm9jZXNzIHRvIHRoZQotCQkJLy8gc2VhcmNoIHJlc3VsdC4KLQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KSBtZXRob2RQYWNrYWdlOwotCQkJbWF0Y2hQYXR0ZXJuKHByb2Nlc3NDb21wb25lbnQuZ2V0UHJvY2VzcygpKTsKLQkJfSBlbHNlIGlmICghaXNJbnRlcm5hbFByb2Nlc3NQYWNrYWdlKG1ldGhvZFBhY2thZ2UpKSB7Ci0JCQltYXRjaFBhdHRlcm4obWV0aG9kUGFja2FnZSk7Ci0JCX0KLQotCQlMaXN0IGNoaWxkUGFja2FnZXMgPSBtZXRob2RQYWNrYWdlLmdldENoaWxkUGFja2FnZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gY2hpbGRQYWNrYWdlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKQotCQkJCSYmICFwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOykgewotCQkJc2VhcmNoTWV0aG9kUGFja2FnZXMoKE1ldGhvZFBhY2thZ2UpIGkubmV4dCgpKTsKLQkJfQotCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQlDb250ZW50UGFja2FnZSBjb250ZW50UGFja2FnZSA9IChDb250ZW50UGFja2FnZSkgbWV0aG9kUGFja2FnZTsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gY29udGVudFBhY2thZ2UuZ2V0Q29udGVudEVsZW1lbnRzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGogPSBjb250ZW50RWxlbWVudHMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCkKLQkJCQkJJiYgIXByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk7KSB7Ci0JCQkJQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQgPSAoQ29udGVudEVsZW1lbnQpIGoubmV4dCgpOwotCQkJCW1hdGNoUGF0dGVybihjb250ZW50RWxlbWVudCk7Ci0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJc2VhcmNoQ29udGFpbmVkQXJ0aWZhY3RzKChBcnRpZmFjdCkgY29udGVudEVsZW1lbnQpOwotCQkJCX0gZWxzZSBpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJCXNlYXJjaFN1YkRpc2NpcGxpbmVzKChEaXNjaXBsaW5lKSBjb250ZW50RWxlbWVudCk7Ci0JCQkJfSBlbHNlIGlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQkJCXNlYXJjaFN1YlByYWN0aWNlcygoUHJhY3RpY2UpIGNvbnRlbnRFbGVtZW50KTsKLQkJCQl9IGVsc2UgaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQkJCXNlYXJjaFN1YkRvbWFpbnMoKERvbWFpbikgY29udGVudEVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCVByb2Nlc3NQYWNrYWdlIHByb2Nlc3NQYWNrYWdlID0gKFByb2Nlc3NQYWNrYWdlKSBtZXRob2RQYWNrYWdlOwotCQkJTGlzdCBwcm9jZXNzRWxlbWVudHMgPSBwcm9jZXNzUGFja2FnZS5nZXRQcm9jZXNzRWxlbWVudHMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaiA9IHByb2Nlc3NFbGVtZW50cy5pdGVyYXRvcigpOyBqLmhhc05leHQoKQotCQkJCQkmJiAhcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTspIHsKLQkJCQlQcm9jZXNzRWxlbWVudCBwcm9jZXNzRWxlbWVudCA9IChQcm9jZXNzRWxlbWVudCkgai5uZXh0KCk7Ci0JCQkJaWYgKCEocHJvY2Vzc0VsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCQkJbWF0Y2hQYXR0ZXJuKHByb2Nlc3NFbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBwYWNrYWdlIGlzIGFuIGludGVybmFsIFByb2Nlc3MKLQkgKiBQYWNrYWdlLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RQYWNrYWdlCi0JICogICAgICAgICAgICBhIG1ldGhvZCBvciBwcm9jZXNzIHBhY2thZ2UKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBwYWNrYWdlIGlzIGFuIGludGVybmFsIHByb2Nlc3MKLQkgKiAgICAgICAgIHBhY2thZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ludGVybmFsUHJvY2Vzc1BhY2thZ2UoTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlKSB7Ci0JCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCWlmIChVbWFVdGlsLmdldFByb2Nlc3NDb21wb25lbnQobWV0aG9kUGFja2FnZSkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyB0aGUgY29udGFpbmVkIGFydGlmYWN0cyBvZiBhbiBhcnRpZmFjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYXJ0aWZhY3QKLQkgKiAgICAgICAgICAgIGFuIGFydGlmYWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2VhcmNoQ29udGFpbmVkQXJ0aWZhY3RzKEFydGlmYWN0IGFydGlmYWN0KSB7Ci0JCWlmIChhcnRpZmFjdCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBhcnRpZmFjdC5nZXRDb250YWluZWRBcnRpZmFjdHMoKS5pdGVyYXRvcigpOyBpCi0JCQkJCS5oYXNOZXh0KCkKLQkJCQkJJiYgIXByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk7KSB7Ci0JCQkJQXJ0aWZhY3QgY29udGFpbmVkQXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGkubmV4dCgpOwotCQkJCW1hdGNoUGF0dGVybihjb250YWluZWRBcnRpZmFjdCk7Ci0JCQkJc2VhcmNoQ29udGFpbmVkQXJ0aWZhY3RzKGNvbnRhaW5lZEFydGlmYWN0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNlYXJjaGVzIHRoZSBzdWIgZGlzY2lwbGluZXMgb2YgYSBkaXNjaXBsaW5lLgotCSAqIAotCSAqIEBwYXJhbSBkaXNjaXBsaW5lCi0JICogICAgICAgICAgICBhIGRpc2NpcGxpbmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZWFyY2hTdWJEaXNjaXBsaW5lcyhEaXNjaXBsaW5lIGRpc2NpcGxpbmUpIHsKLQkJaWYgKGRpc2NpcGxpbmUgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gZGlzY2lwbGluZS5nZXRTdWJkaXNjaXBsaW5lKCkuaXRlcmF0b3IoKTsgaQotCQkJCQkuaGFzTmV4dCgpCi0JCQkJCSYmICFwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOykgewotCQkJCURpc2NpcGxpbmUgc3ViRGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKSBpLm5leHQoKTsKLQkJCQltYXRjaFBhdHRlcm4oc3ViRGlzY2lwbGluZSk7Ci0JCQkJc2VhcmNoU3ViRGlzY2lwbGluZXMoc3ViRGlzY2lwbGluZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyB0aGUgc3ViIHByYWN0aWNlcyBvZiBhIHByYWN0aWNlLgotCSAqIAotCSAqIEBwYXJhbSBwcmFjdGljZQotCSAqICAgICAgICAgICAgYSBwcmFjdGljZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNlYXJjaFN1YlByYWN0aWNlcyhQcmFjdGljZSBwcmFjdGljZSkgewotCQlpZiAocHJhY3RpY2UgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gcHJhY3RpY2UuZ2V0U3ViUHJhY3RpY2VzKCkuaXRlcmF0b3IoKTsgaQotCQkJCQkuaGFzTmV4dCgpCi0JCQkJCSYmICFwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOykgewotCQkJCVByYWN0aWNlIHN1YlByYWN0aWNlID0gKFByYWN0aWNlKSBpLm5leHQoKTsKLQkJCQltYXRjaFBhdHRlcm4oc3ViUHJhY3RpY2UpOwotCQkJCXNlYXJjaFN1YlByYWN0aWNlcyhzdWJQcmFjdGljZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyB0aGUgc3ViIGRvbWFpbnMgb2YgYSBkb21haW4uCi0JICogCi0JICogQHBhcmFtIGRvbWFpbgotCSAqICAgICAgICAgICAgYSBkb21haW4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZWFyY2hTdWJEb21haW5zKERvbWFpbiBkb21haW4pIHsKLQkJaWYgKGRvbWFpbiAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBkb21haW4uZ2V0U3ViZG9tYWlucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpCi0JCQkJCSYmICFwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOykgewotCQkJCURvbWFpbiBzdWJEb21haW4gPSAoRG9tYWluKSBpLm5leHQoKTsKLQkJCQltYXRjaFBhdHRlcm4oc3ViRG9tYWluKTsKLQkJCQlzZWFyY2hTdWJEb21haW5zKHN1YkRvbWFpbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCB0byB0aGUgc2VhcmNoIHJlc3VsdCBjb2xsZWN0aW9uIGlmIGl0cyBuYW1lCi0JICogb3IgcHJlc2VudGF0aW9uIG5hbWUgbWF0Y2hlcyB0aGUgbmFtZSBwYXR0ZXJuLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgbWF0Y2hQYXR0ZXJuKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQl0cnkgewotCQkJaWYgKHNlYXJjaElucHV0LmdldFNlYXJjaFNjb3BlKCkuaW5jbHVkZShlbGVtZW50KSkgewotCQkJCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nIHRhc2tOYW1lID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoU0NBTl9FTEVNRU5UX1RFWFQsCi0JCQkJCQluZXcgU3RyaW5nW10geyBuYW1lIH0pOwotCQkJCXByb2dyZXNzTW9uaXRvci5zZXRUYXNrTmFtZSh0YXNrTmFtZSk7Ci0JCQkJYm9vbGVhbiBmb3VuZE1hdGNoID0gZmFsc2U7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQkJU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCkKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJCQlmb3VuZE1hdGNoID0gKG5hbWUgIT0gbnVsbCAmJiBlbGVtZW50TmFtZVBhdHRlcm4ubWF0Y2hlcigKLQkJCQkJCQluYW1lKS5tYXRjaGVzKCkpCi0JCQkJCQkJfHwgKHByZXNlbnRhdGlvbk5hbWUgIT0gbnVsbCAmJiBlbGVtZW50TmFtZVBhdHRlcm4KLQkJCQkJCQkJCS5tYXRjaGVyKHByZXNlbnRhdGlvbk5hbWUpLm1hdGNoZXMoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZm91bmRNYXRjaCA9IChuYW1lICE9IG51bGwgJiYgZWxlbWVudE5hbWVQYXR0ZXJuLm1hdGNoZXIoCi0JCQkJCQkJbmFtZSkubWF0Y2hlcygpKTsKLQkJCQl9Ci0JCQkJaWYgKGZvdW5kTWF0Y2gpIHsKLQkJCQkJaWYgKHNlYXJjaFN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlyZXN1bHQuYWNjZXB0KGVsZW1lbnQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQllbGVtZW50U2Nhbm5lci5wYXJzZShlbGVtZW50KTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlwcm9ncmVzc01vbml0b3Iud29ya2VkKDEpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgY29udGVudCBYTUwgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBtZXRob2QKLQkgKiBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWxlbWVudFBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBkZXNjcmliYWJsZUVsZW1lbnQgPSAoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50OwotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGRlc2NyaWJhYmxlRWxlbWVudAotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQlpZiAoY29udGVudERlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJlc291cmNlID0gY29udGVudERlc2NyaXB0aW9uLmVSZXNvdXJjZSgpOwotCQl9IGVsc2UgewotCQkJcmVzb3VyY2UgPSBlbGVtZW50LmVSZXNvdXJjZSgpOwotCQl9Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlVUkkgcmVzb3VyY2VVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCWlmIChyZXNvdXJjZVVSSSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc291cmNlVVJJLnRvRmlsZVN0cmluZygpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hQYXR0ZXJuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOTc2MTExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hQYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuU3ludGF4RXhjZXB0aW9uOwotCi0vKioKLSAqIFBhdHRlcm4gY29udHJ1Y3RvciBmb3IgYSBtZXRob2Qgc2VhcmNoLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFNlYXJjaFBhdHRlcm4gewotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQuIEFsbAotCSAqIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBzaG91bGQgYmUgc3RhdGljLgotCSAqLwotCXByaXZhdGUgTWV0aG9kU2VhcmNoUGF0dGVybigpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEKLQkgKiA8Y29kZT5QYXR0ZXJuPGNvZGU+IG9iamVjdCBmcm9tIHRoZSBwYXR0ZXJuIHN0cmluZyB1c2VkIGluIE1ldGhvZCBTZWFyY2guCi0JICogCi0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiAgICAgICAgICAgIGEgc2VhcmNoIHBhdHRlcm4gc3RyaW5nCi0JICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGNyZWF0ZSBhIGNhc2UgaW5zZW5zaXR2ZSBwYXR0ZXJuCi0JICogQHBhcmFtIGlzUmVnZXhTZWFyY2gKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCB0cmVhdCB0aGUgcGF0dGVybiBhcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuCi0JICogQHJldHVybiBhIG5ldyA8Y29kZT5QYXR0ZXJuPGNvZGU+IG9iamVjdAotCSAqIEB0aHJvd3MgPGNvZGU+UGF0dGVyblN5bnRheEV4Y2VwdGlvbjwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBwYXR0ZXJuIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGF0dGVybiBjcmVhdGVQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuLAotCQkJYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIGJvb2xlYW4gaXNSZWdleFNlYXJjaCkKLQkJCXRocm93cyBQYXR0ZXJuU3ludGF4RXhjZXB0aW9uIHsKLQkJaWYgKCFpc1JlZ2V4U2VhcmNoKSB7Ci0JCQlwYXR0ZXJuID0gdG9SZWdleFBhdHRlcm4ocGF0dGVybik7Ci0JCX0KLQotCQlpZiAoIWlzQ2FzZVNlbnNpdGl2ZSkgewotCQkJcmV0dXJuIFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUKLQkJCQkJfCBQYXR0ZXJuLlVOSUNPREVfQ0FTRSB8IFBhdHRlcm4uTVVMVElMSU5FKTsKLQkJfQotCi0JCXJldHVybiBQYXR0ZXJuLmNvbXBpbGUocGF0dGVybiwgUGF0dGVybi5NVUxUSUxJTkUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGEgcGF0dGVybiBzdHJpbmcgd2l0aCAnKicgYW5kICc/JyBpbnRvIGEgcmVndWxhciBleHByZXNzaW9uCi0JICogcGF0dGVybiBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiAgICAgICAgICAgIGEgcGF0dGVybiBzdHJpbmcKLQkgKiBAcmV0dXJuIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gc3RyaW5nCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvUmVnZXhQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB7Ci0JCWludCBwYXR0ZXJuTGVuZ3RoID0gcGF0dGVybi5sZW5ndGgoKTsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIocGF0dGVybkxlbmd0aCk7Ci0KLQkJYm9vbGVhbiBlc2NhcGVkID0gZmFsc2U7Ci0JCWJvb2xlYW4gcXVvdGluZyA9IGZhbHNlOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0dGVybkxlbmd0aDsgaSsrKSB7Ci0JCQljaGFyIGNoID0gcGF0dGVybi5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICcqJzoKLQkJCQlpZiAoIWVzY2FwZWQpIHsKLQkJCQkJaWYgKHF1b3RpbmcpIHsKLQkJCQkJCXJlc3VsdC5hcHBlbmQoIlxcRSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlxdW90aW5nID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmVzdWx0LmFwcGVuZCgiLioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVzY2FwZWQgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJz8nOgotCQkJCWlmICghZXNjYXBlZCkgewotCQkJCQlpZiAocXVvdGluZykgewotCQkJCQkJcmVzdWx0LmFwcGVuZCgiXFxFIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXF1b3RpbmcgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXN1bHQuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllc2NhcGVkID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcXCc6Ci0JCQkJaWYgKCFlc2NhcGVkKSB7Ci0JCQkJCWVzY2FwZWQgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVzY2FwZWQgPSBmYWxzZTsKLQkJCQkJaWYgKHF1b3RpbmcpIHsKLQkJCQkJCXJlc3VsdC5hcHBlbmQoIlxcRSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlxdW90aW5nID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJcmVzdWx0LmFwcGVuZCgiXFxcXCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlpZiAoIXF1b3RpbmcpIHsKLQkJCQkJcmVzdWx0LmFwcGVuZCgiXFxRIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcXVvdGluZyA9IHRydWU7Ci0JCQkJfQotCQkJCWlmIChlc2NhcGVkICYmIGNoICE9ICcqJyAmJiBjaCAhPSAnPycgJiYgY2ggIT0gJ1xcJykgewotCQkJCQlyZXN1bHQuYXBwZW5kKCdcXCcpOwotCQkJCX0KLQkJCQlyZXN1bHQuYXBwZW5kKGNoKTsKLQkJCQllc2NhcGVkID0gKGNoID09ICdcXCcpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHF1b3RpbmcpIHsKLQkJCXJlc3VsdC5hcHBlbmQoIlxcRSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoUXVlcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNDEwMDQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuU2VhcmNoVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci0KLS8qKgotICogRW5jYXBzdWxhdGVzIHRoZSBzZWFyY2ggc3RyaW5ncyBhbmQgb3B0aW9ucyBmb3IgYSBtZXRob2Qgc2VhcmNoLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFNlYXJjaFF1ZXJ5IGltcGxlbWVudHMgSVNlYXJjaFF1ZXJ5IHsKLQotCXByaXZhdGUgTWV0aG9kU2VhcmNoSW5wdXQgc2VhcmNoSW5wdXQ7Ci0KLQlwcml2YXRlIE1ldGhvZFNlYXJjaFJlc3VsdCBzZWFyY2hSZXN1bHQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBzZWFyY2hTdHJpbmcKLQkgKiAgICAgICAgICAgIGEgc2VhcmNoIHN0cmluZwotCSAqIEBwYXJhbSBuYW1lUGF0dGVybgotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudCBuYW1lIHBhdHRlcm4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kU2VhcmNoUXVlcnkoTWV0aG9kU2VhcmNoSW5wdXQgc2VhcmNoSW5wdXQpIHsKLQkJdGhpcy5zZWFyY2hJbnB1dCA9IHNlYXJjaElucHV0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeSNydW4oSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBwcm9jZXNzTW9uaXRvcikgewotCQlmaW5hbCBNZXRob2RTZWFyY2hSZXN1bHQgc2VhcmNoUmVzdWx0ID0gKE1ldGhvZFNlYXJjaFJlc3VsdCkgZ2V0U2VhcmNoUmVzdWx0KCk7Ci0JCXNlYXJjaFJlc3VsdC5yZW1vdmVBbGwoKTsKLQkJSVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHQgPSBuZXcgSVNlYXJjaFJlc3VsdENvbGxlY3RvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFjY2VwdChPYmplY3QgbWF0Y2gpIHsKLQkJCQlpZiAobWF0Y2ggaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCQkmJiAhVG5nVXRpbC5pc1ByZWRlZmluZWQoKE1ldGhvZEVsZW1lbnQpIG1hdGNoKSkgewotCQkJCQlzZWFyY2hSZXN1bHQuYWRkTWF0Y2gobmV3IE1hdGNoKG1hdGNoLCBNYXRjaC5VTklUX0xJTkUsIDEsCi0JCQkJCQkJMSkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJTWV0aG9kU2VhcmNoT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBNZXRob2RTZWFyY2hPcGVyYXRpb24oCi0JCQkJc2VhcmNoSW5wdXQsIHJlc3VsdCk7Ci0JCW9wZXJhdGlvbi5leGVjdXRlKHByb2Nlc3NNb25pdG9yKTsKLQkJcHJvY2Vzc01vbml0b3IuZG9uZSgpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjZ2V0TGFiZWwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hRdWVyeV90ZXh0OyAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjY2FuUmVydW4oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJlcnVuKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjY2FuUnVuSW5CYWNrZ3JvdW5kKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SdW5JbkJhY2tncm91bmQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeSNnZXRTZWFyY2hSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBJU2VhcmNoUmVzdWx0IGdldFNlYXJjaFJlc3VsdCgpIHsKLQkJaWYgKHNlYXJjaFJlc3VsdCA9PSBudWxsKSB7Ci0JCQlzZWFyY2hSZXN1bHQgPSBuZXcgTWV0aG9kU2VhcmNoUmVzdWx0KHRoaXMpOwotCQl9Ci0JCXJldHVybiBzZWFyY2hSZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldFNlYXJjaFJlc3VsdCgpCi0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaElucHV0IGdldFNlYXJjaElucHV0KCkgewotCQlyZXR1cm4gc2VhcmNoSW5wdXQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoUmVzdWx0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3ZmUyZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuU2VhcmNoVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5TZWFyY2hVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUVkaXRvck1hdGNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5JRmlsZU1hdGNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKiBUaGUgbWV0aG9kIHNlYXJjaCByZXN1bHQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2VhcmNoUmVzdWx0IGV4dGVuZHMgQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IGltcGxlbWVudHMKLQkJSUVkaXRvck1hdGNoQWRhcHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFUQ0hfTEFCRUwgPSBTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hSZXN1bHRfbWF0Y2g7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVRDSEVTX0xBQkVMID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X21hdGNoZXM7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzZWFyY2ggcXVlcnkuCi0JcHJpdmF0ZSBNZXRob2RTZWFyY2hRdWVyeSBzZWFyY2hRdWVyeTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHNlYXJjaFF1ZXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBzZWFyY2ggcXVlcnkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kU2VhcmNoUmVzdWx0KE1ldGhvZFNlYXJjaFF1ZXJ5IHNlYXJjaFF1ZXJ5KSB7Ci0JCXRoaXMuc2VhcmNoUXVlcnkgPSBzZWFyY2hRdWVyeTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUmVzdWx0I2dldFF1ZXJ5KCkKLQkgKi8KLQlwdWJsaWMgSVNlYXJjaFF1ZXJ5IGdldFF1ZXJ5KCkgewotCQlyZXR1cm4gc2VhcmNoUXVlcnk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFJlc3VsdCNnZXRJbWFnZURlc2NyaXB0b3IoKQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC9vYmoxNi9NZXRob2RTZWFyY2guZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUmVzdWx0I2dldExhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkvLyBUT0RPOiBEaXNwbGF5IHNlYXJjaCByZXN1bHQgaW4gdGhlIGZvcm06Ci0JCS8vICAgICdjYW5kaWRhdGUnIC0gNiBtYXRjaGVzIGluIDQgZWxlbWVudHMuCi0JCVN0cmluZyBzZWFyY2hTdHJpbmcgPSBzZWFyY2hRdWVyeS5nZXRTZWFyY2hJbnB1dCgpLmdldFNlYXJjaFN0cmluZygpOwotCQlpbnQgbWF0Y2hDb3VudCA9IGdldE1hdGNoQ291bnQoKTsKLQkJaWYgKG1hdGNoQ291bnQgPT0gMSkgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KE1BVENIX0xBQkVMLAotCQkJCQluZXcgT2JqZWN0W10geyBzZWFyY2hTdHJpbmcgfSk7CQkKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChNQVRDSEVTX0xBQkVMLCBuZXcgT2JqZWN0W10gewotCQkJCQlzZWFyY2hTdHJpbmcsICIiICsgbWF0Y2hDb3VudCB9KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFJlc3VsdCNnZXRUb29sdGlwKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2x0aXAoKSB7Ci0JCXJldHVybiBnZXRMYWJlbCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0I2dldEVkaXRvck1hdGNoQWRhcHRlcigpCi0JICovCi0JcHVibGljIElFZGl0b3JNYXRjaEFkYXB0ZXIgZ2V0RWRpdG9yTWF0Y2hBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCNnZXRGaWxlTWF0Y2hBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgSUZpbGVNYXRjaEFkYXB0ZXIgZ2V0RmlsZU1hdGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5JRWRpdG9yTWF0Y2hBZGFwdGVyI2lzU2hvd25JbkVkaXRvcihNYXRjaCwKLQkgKiAgICAgIElFZGl0b3JQYXJ0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hvd25JbkVkaXRvcihNYXRjaCBtYXRjaCwgSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LklFZGl0b3JNYXRjaEFkYXB0ZXIjY29tcHV0ZUNvbnRhaW5lZE1hdGNoZXMoQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0LAotCSAqICAgICAgSUVkaXRvclBhcnQpCi0JICovCi0JcHVibGljIE1hdGNoW10gY29tcHV0ZUNvbnRhaW5lZE1hdGNoZXMoQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdCwKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hTY29wZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFNjb3BlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ0NzU1YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2FwYWJpbGl0eVBhdHRlcm5JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DaGVja2xpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db25jZXB0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudENhdGVnb3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRvbWFpbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkV4YW1wbGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkYW5jZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRlbGluZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkl0ZXJhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1pbGVzdG9uZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk91dGNvbWVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QaGFzZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVwb3J0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmV1c2FibGVBc3NldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvYWRtYXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3VwcG9ydGluZ01hdGVyaWFsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVtcGxhdGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZXJtRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRvb2xJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Ub29sTWVudG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV2hpdGVwYXBlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGw7Ci0KLS8qKgotICogVGhlIG1ldGhvZCBzZWFyY2ggc2NvcGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2VhcmNoU2NvcGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVCA9ICJSb290IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0NPTlRFTlQgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfTUVUSE9EX0NPTlRFTlQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFID0gTGlicmFyeVVJVGV4dC5URVhUX1JPTEU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLID0gTGlicmFyeVVJVGV4dC5URVhUX1RBU0s7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX1BST0RVQ1QgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfV09SS19QUk9EVUNUOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJREFOQ0UgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfR1VJREFOQ0U7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS0xJU1QgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfQ0hFQ0tMSVNUOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OQ0VQVCA9IExpYnJhcnlVSVRleHQuVEVYVF9DT05DRVBUOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IExpYnJhcnlVSVRleHQuVEVYVF9FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhBTVBMRSA9IExpYnJhcnlVSVRleHQuVEVYVF9FWEFNUExFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJREVMSU5FID0gTGlicmFyeVVJVGV4dC5URVhUX0dVSURFTElORTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSQUNUSUNFID0gTGlicmFyeVVJVGV4dC5URVhUX1BSQUNUSUNFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1JUID0gTGlicmFyeVVJVGV4dC5URVhUX1JFUE9SVDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVVNBQkxFX0FTU0VUID0gTGlicmFyeVVJVGV4dC5URVhUX1JFVVNBQkxFX0FTU0VUOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9BRE1BUCA9IExpYnJhcnlVSVRleHQuVEVYVF9ST0FETUFQOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQUE9SVElOR19NQVRFUklBTCA9IExpYnJhcnlVSVRleHQuVEVYVF9TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEUgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfVEVNUExBVEU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVJNX0RFRklOSVRJT04gPSBMaWJyYXJ5VUlUZXh0LlRFWFRfVEVSTV9ERUZJTklUSU9OOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTF9NRU5UT1IgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfVE9PTF9NRU5UT1I7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSElURVBBUEVSID0gTGlicmFyeVVJVGV4dC5URVhUX1dISVRFUEFQRVI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFOREFSRF9DQVRFR09SWSA9IExpYnJhcnlVSVRleHQuVEVYVF9TVEFOREFSRF9DQVRFR09SWTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DQVRFR09SWSA9IExpYnJhcnlVSVRleHQuVEVYVF9DVVNUT01fQ0FURUdPUlk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTID0gTGlicmFyeVVJVGV4dC5URVhUX1BST0NFU1M7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBBQklMSVRZX1BBVFRFUk4gPSBMaWJyYXJ5VUlUZXh0LlRFWFRfQ0FQQUJJTElUWV9QQVRURVJOOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSVZFUllfUFJPQ0VTUyA9IExpYnJhcnlVSVRleHQuVEVYVF9ERUxJVkVSWV9QUk9DRVNTOwotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGVsZW1lbnRTZWFyY2hTY29wZSA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlzdGF0aWMgewotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KE1ldGhvZFBsdWdpbkltcGwuY2xhc3MsIFJPT1QpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KENvbnRlbnRQYWNrYWdlSW1wbC5jbGFzcywgTUVUSE9EX0NPTlRFTlQpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFJvbGVJbXBsLmNsYXNzLCBST0xFKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChUYXNrSW1wbC5jbGFzcywgVEFTSyk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoQXJ0aWZhY3RJbXBsLmNsYXNzLCBXT1JLX1BST0RVQ1QpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KERlbGl2ZXJhYmxlSW1wbC5jbGFzcywgV09SS19QUk9EVUNUKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChPdXRjb21lSW1wbC5jbGFzcywgV09SS19QUk9EVUNUKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChHdWlkYW5jZUltcGwuY2xhc3MsIEdVSURBTkNFKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChDaGVja2xpc3RJbXBsLmNsYXNzLCBDSEVDS0xJU1QpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KENvbmNlcHRJbXBsLmNsYXNzLCBDT05DRVBUKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsLmNsYXNzLAotCQkJCUVTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KEV4YW1wbGVJbXBsLmNsYXNzLCBFWEFNUExFKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChHdWlkZWxpbmVJbXBsLmNsYXNzLCBHVUlERUxJTkUpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFByYWN0aWNlSW1wbC5jbGFzcywgUFJBQ1RJQ0UpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFJlcG9ydEltcGwuY2xhc3MsIFJFUE9SVCk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoUmV1c2FibGVBc3NldEltcGwuY2xhc3MsIFJFVVNBQkxFX0FTU0VUKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChSb2FkbWFwSW1wbC5jbGFzcywgUk9BRE1BUCk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoU3VwcG9ydGluZ01hdGVyaWFsSW1wbC5jbGFzcywKLQkJCQlTVVBQT1JUSU5HX01BVEVSSUFMKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChUZW1wbGF0ZUltcGwuY2xhc3MsIFRFTVBMQVRFKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChUZXJtRGVmaW5pdGlvbkltcGwuY2xhc3MsIFRFUk1fREVGSU5JVElPTik7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVG9vbE1lbnRvckltcGwuY2xhc3MsIFRPT0xfTUVOVE9SKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChXaGl0ZXBhcGVySW1wbC5jbGFzcywgV0hJVEVQQVBFUik7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoQ29udGVudENhdGVnb3J5SW1wbC5jbGFzcywgU1RBTkRBUkRfQ0FURUdPUlkpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KERpc2NpcGxpbmVJbXBsLmNsYXNzLCBTVEFOREFSRF9DQVRFR09SWSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoRGlzY2lwbGluZUdyb3VwaW5nSW1wbC5jbGFzcywgU1RBTkRBUkRfQ0FURUdPUlkpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KERvbWFpbkltcGwuY2xhc3MsIFNUQU5EQVJEX0NBVEVHT1JZKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChXb3JrUHJvZHVjdFR5cGVJbXBsLmNsYXNzLCBTVEFOREFSRF9DQVRFR09SWSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoUm9sZVNldEltcGwuY2xhc3MsIFNUQU5EQVJEX0NBVEVHT1JZKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChSb2xlU2V0R3JvdXBpbmdJbXBsLmNsYXNzLCBTVEFOREFSRF9DQVRFR09SWSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVG9vbEltcGwuY2xhc3MsIFNUQU5EQVJEX0NBVEVHT1JZKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChDdXN0b21DYXRlZ29yeUltcGwuY2xhc3MsIENVU1RPTV9DQVRFR09SWSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoUHJvY2Vzc1BhY2thZ2VJbXBsLmNsYXNzLCBQUk9DRVNTKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChQcm9jZXNzQ29tcG9uZW50SW1wbC5jbGFzcywgUFJPQ0VTUyk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoUGhhc2VJbXBsLmNsYXNzLCBQUk9DRVNTKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChJdGVyYXRpb25JbXBsLmNsYXNzLCBQUk9DRVNTKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChNaWxlc3RvbmVJbXBsLmNsYXNzLCBQUk9DRVNTKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChBY3Rpdml0eUltcGwuY2xhc3MsIFBST0NFU1MpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFJvbGVEZXNjcmlwdG9ySW1wbC5jbGFzcywgUFJPQ0VTUyk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVGFza0Rlc2NyaXB0b3JJbXBsLmNsYXNzLCBQUk9DRVNTKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChXb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsLmNsYXNzLCBQUk9DRVNTKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChDYXBhYmlsaXR5UGF0dGVybkltcGwuY2xhc3MsIENBUEFCSUxJVFlfUEFUVEVSTik7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoRGVsaXZlcnlQcm9jZXNzSW1wbC5jbGFzcywgREVMSVZFUllfUFJPQ0VTUyk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IHNlYXJjaFNjb3BlID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kU2VhcmNoU2NvcGUoT2JqZWN0W10gZWxlbWVudFR5cGVzKSB7Ci0JCXNlYXJjaFNjb3BlLmFkZChST09UKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCBlbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlc1tpXTsKLQkJCXNlYXJjaFNjb3BlLmFkZChlbGVtZW50VHlwZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIGNvcmUgbWV0aG9kIGVsZW1lbnQgaXMgaW5jbHVkZWQgaW4gdGhlIHNlYXJjaCBzY29wZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgY29yZSBtZXRob2QgZWxlbWVudCBpcyBpbmNsdWRlZCBpbiB0aGUKLQkgKiAgICAgICAgIHNlYXJjaCBzY29wZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGluY2x1ZGVDb3JlQ29udGVudCgpIHsKLQkJcmV0dXJuIHNlYXJjaFNjb3BlLmNvbnRhaW5zKFJPTEUpIHx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFRBU0spCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoV09SS19QUk9EVUNUKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKEdVSURBTkNFKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKENIRUNLTElTVCkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhDT05DRVBUKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKEVTVElNQVRJT05fQ09OU0lERVJBVElPTlMpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoRVhBTVBMRSkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhHVUlERUxJTkUpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoUFJBQ1RJQ0UpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoUkVQT1JUKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFJFVVNBQkxFX0FTU0VUKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFJPQURNQVApCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoU1VQUE9SVElOR19NQVRFUklBTCkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhURU1QTEFURSkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhURVJNX0RFRklOSVRJT04pCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoVE9PTF9NRU5UT1IpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoV0hJVEVQQVBFUik7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIE1ldGhvZCBlbGVtZW50IGlzIGluY2x1ZGVkIGluIHRoZSBzZWFyY2ggc2NvcGUuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgZWxlbWVudCBpcyBpbmNsdWRlZCBpbiB0aGUKLQkgKiAgICAgICAgIHNlYXJjaCBzY29wZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBzZWFyY2hTY29wZU5hbWUgPSAoU3RyaW5nKSBlbGVtZW50U2VhcmNoU2NvcGUuZ2V0KGVsZW1lbnQKLQkJCQkuZ2V0Q2xhc3MoKSk7Ci0JCXJldHVybiBzZWFyY2hTY29wZS5jb250YWlucyhzZWFyY2hTY29wZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCB0eXBlIGlzIGluY2x1ZGVkIGluIHRoZSBzZWFyY2gKLQkgKiBzY29wZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCB0eXBlIGlzIGluY2x1ZGVkCi0JICogICAgICAgICBpbiB0aGUgc2VhcmNoIHNjb3BlLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZShTdHJpbmcgc2VhcmNoU2NvcGVOYW1lKSB7Ci0JCXJldHVybiBzZWFyY2hTY29wZS5jb250YWlucyhzZWFyY2hTY29wZU5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFNjb3BlVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoU2NvcGVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjFkOTk1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoU2NvcGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgc2VhcmNoYWJsZSBtZXRob2QgZWxlbWVudHMsIG9yZ2FuaXplZCBieSB0eXBlcywgaW4gYSB0cmVlIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2VhcmNoU2NvcGVWaWV3ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1QgPSBNZXRob2RTZWFyY2hTY29wZS5ST09UOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9DT05URU5UID0gTWV0aG9kU2VhcmNoU2NvcGUuTUVUSE9EX0NPTlRFTlQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRSA9IE1ldGhvZFNlYXJjaFNjb3BlLlJPTEU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTSyA9IE1ldGhvZFNlYXJjaFNjb3BlLlRBU0s7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19QUk9EVUNUID0gTWV0aG9kU2VhcmNoU2NvcGUuV09SS19QUk9EVUNUOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURBTkNFID0gTWV0aG9kU2VhcmNoU2NvcGUuR1VJREFOQ0U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tMSVNUID0gTWV0aG9kU2VhcmNoU2NvcGUuQ0hFQ0tMSVNUOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkNFUFQgPSBNZXRob2RTZWFyY2hTY29wZS5DT05DRVBUOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBNZXRob2RTZWFyY2hTY29wZS5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQU1QTEUgPSBNZXRob2RTZWFyY2hTY29wZS5FWEFNUExFOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURFTElORSA9IE1ldGhvZFNlYXJjaFNjb3BlLkdVSURFTElORTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkFDVElDRSA9IE1ldGhvZFNlYXJjaFNjb3BlLlBSQUNUSUNFOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9SVCA9IE1ldGhvZFNlYXJjaFNjb3BlLlJFUE9SVDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVVTQUJMRV9BU1NFVCA9IE1ldGhvZFNlYXJjaFNjb3BlLlJFVVNBQkxFX0FTU0VUOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPQURNQVAgPSBNZXRob2RTZWFyY2hTY29wZS5ST0FETUFQOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUFBPUlRJTkdfTUFURVJJQUwgPSBNZXRob2RTZWFyY2hTY29wZS5TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFID0gTWV0aG9kU2VhcmNoU2NvcGUuVEVNUExBVEU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVSTV9ERUZJTklUSU9OID0gTWV0aG9kU2VhcmNoU2NvcGUuVEVSTV9ERUZJTklUSU9OOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xfTUVOVE9SID0gTWV0aG9kU2VhcmNoU2NvcGUuVE9PTF9NRU5UT1I7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0hJVEVQQVBFUiA9IE1ldGhvZFNlYXJjaFNjb3BlLldISVRFUEFQRVI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBTkRBUkRfQ0FURUdPUlkgPSBNZXRob2RTZWFyY2hTY29wZS5TVEFOREFSRF9DQVRFR09SWTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ0FURUdPUlkgPSBNZXRob2RTZWFyY2hTY29wZS5DVVNUT01fQ0FURUdPUlk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTUyA9IE1ldGhvZFNlYXJjaFNjb3BlLlBST0NFU1M7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FQQUJJTElUWV9QQVRURVJOID0gTWV0aG9kU2VhcmNoU2NvcGUuQ0FQQUJJTElUWV9QQVRURVJOOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElWRVJZX1BST0NFU1MgPSBNZXRob2RTZWFyY2hTY29wZS5ERUxJVkVSWV9QUk9DRVNTOwotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCByb290TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlzdGF0aWMgewotCQlyb290TGlzdC5hZGQoTUVUSE9EX0NPTlRFTlQpOwotCQlyb290TGlzdC5hZGQoUFJPQ0VTUyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBtZXRob2RDb250ZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlzdGF0aWMgewotCQltZXRob2RDb250ZW50TGlzdC5hZGQoUk9MRSk7Ci0JCW1ldGhvZENvbnRlbnRMaXN0LmFkZChUQVNLKTsKLQkJbWV0aG9kQ29udGVudExpc3QuYWRkKFdPUktfUFJPRFVDVCk7Ci0JCW1ldGhvZENvbnRlbnRMaXN0LmFkZChHVUlEQU5DRSk7Ci0JCW1ldGhvZENvbnRlbnRMaXN0LmFkZChTVEFOREFSRF9DQVRFR09SWSk7Ci0JCW1ldGhvZENvbnRlbnRMaXN0LmFkZChDVVNUT01fQ0FURUdPUlkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3QgZ3VpZGFuY2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXN0YXRpYyB7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoQ0hFQ0tMSVNUKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChDT05DRVBUKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChFWEFNUExFKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChHVUlERUxJTkUpOwotCQlndWlkYW5jZUxpc3QuYWRkKFBSQUNUSUNFKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChSRVBPUlQpOwotCQlndWlkYW5jZUxpc3QuYWRkKFJFVVNBQkxFX0FTU0VUKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChST0FETUFQKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChTVVBQT1JUSU5HX01BVEVSSUFMKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChURU1QTEFURSk7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoVEVSTV9ERUZJTklUSU9OKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChUT09MX01FTlRPUik7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoV0hJVEVQQVBFUik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBwcm9jZXNzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlzdGF0aWMgewotCQlwcm9jZXNzTGlzdC5hZGQoQ0FQQUJJTElUWV9QQVRURVJOKTsKLQkJcHJvY2Vzc0xpc3QuYWRkKERFTElWRVJZX1BST0NFU1MpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3QgaGFzQ2hpbGRyZW5MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXN0YXRpYyB7Ci0JCWhhc0NoaWxkcmVuTGlzdC5hZGQoUk9PVCk7Ci0JCWhhc0NoaWxkcmVuTGlzdC5hZGQoTUVUSE9EX0NPTlRFTlQpOwotCQloYXNDaGlsZHJlbkxpc3QuYWRkKEdVSURBTkNFKTsKLQkJaGFzQ2hpbGRyZW5MaXN0LmFkZChQUk9DRVNTKTsKLQl9Ci0KLQlwcml2YXRlIENoZWNrYm94VHJlZVZpZXdlciB2aWV3ZXI7Ci0KLQkvKioKLQkgKiBUaGUgY29udGVudCBwcm92aWRlciBmb3IgdGhlIHZpZXdlci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBWaWV3ZXJDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBFTVBUWV9MSVNUID0gbmV3IE9iamVjdFswXTsKLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudCkgewotCQkJaWYgKHBhcmVudCA9PSBST09UKSB7Ci0JCQkJcmV0dXJuIGdldENoaWxkcmVuKFJPT1QpOwotCQkJfQotCQkJcmV0dXJuIGdldENoaWxkcmVuKHBhcmVudCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgewotCQkJaWYgKHBhcmVudCA9PSBST09UKSB7Ci0JCQkJcmV0dXJuIHJvb3RMaXN0LnRvQXJyYXkoKTsKLQkJCX0gZWxzZSBpZiAocGFyZW50ID09IE1FVEhPRF9DT05URU5UKSB7Ci0JCQkJcmV0dXJuIG1ldGhvZENvbnRlbnRMaXN0LnRvQXJyYXkoKTsKLQkJCX0gZWxzZSBpZiAocGFyZW50ID09IEdVSURBTkNFKSB7Ci0JCQkJcmV0dXJuIGd1aWRhbmNlTGlzdC50b0FycmF5KCk7Ci0JCQl9IGVsc2UgaWYgKHBhcmVudCA9PSBQUk9DRVNTKSB7Ci0JCQkJcmV0dXJuIHByb2Nlc3NMaXN0LnRvQXJyYXkoKTsKLQkJCX0KLQkJCXJldHVybiBFTVBUWV9MSVNUOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGNoaWxkKSB7Ci0JCQlpZiAocm9vdExpc3QuY29udGFpbnMoY2hpbGQpKSB7Ci0JCQkJcmV0dXJuIFJPT1Q7Ci0JCQl9Ci0JCQlpZiAobWV0aG9kQ29udGVudExpc3QuY29udGFpbnMoY2hpbGQpKSB7Ci0JCQkJcmV0dXJuIE1FVEhPRF9DT05URU5UOwotCQkJfSBlbHNlIGlmIChndWlkYW5jZUxpc3QuY29udGFpbnMoY2hpbGQpKSB7Ci0JCQkJcmV0dXJuIEdVSURBTkNFOwotCQkJfSBlbHNlIGlmIChwcm9jZXNzTGlzdC5jb250YWlucyhjaGlsZCkpIHsKLQkJCQlyZXR1cm4gUFJPQ0VTUzsKLQkJCX0KLQkJCXJldHVybiBFTVBUWV9MSVNUOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgewotCQkJcmV0dXJuIGhhc0NoaWxkcmVuTGlzdC5jb250YWlucyhwYXJlbnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRoZSBsYWJlbCBwcm92aWRlciBmb3IgdGhlIHZpZXdlci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBWaWV3ZXJMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmoudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaFNjb3BlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQl2aWV3ZXIgPSBuZXcgQ2hlY2tib3hUcmVlVmlld2VyKHBhcmVudCwgc3R5bGUpOwotCQl2aWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQl2aWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBWaWV3ZXJDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBWaWV3ZXJMYWJlbFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuc2V0SW5wdXQoUk9PVCk7Ci0JCXZpZXdlci5leHBhbmRUb0xldmVsKDIpOwotCQl2aWV3ZXIuc2V0U3VidHJlZUNoZWNrZWQoTUVUSE9EX0NPTlRFTlQsIHRydWUpOwotCQl2aWV3ZXIuc2V0U3VidHJlZUNoZWNrZWQoUFJPQ0VTUywgdHJ1ZSk7Ci0JCXZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQkJCQl2aWV3ZXIuc2V0U3VidHJlZUNoZWNrZWQoc2VsZWN0ZWRFbGVtZW50LCBldmVudC5nZXRDaGVja2VkKCkpOwotCQkJCWlmICghZXZlbnQuZ2V0Q2hlY2tlZCgpKSB7Ci0JCQkJCXZpZXdlci5zZXRQYXJlbnRzR3JheWVkKHNlbGVjdGVkRWxlbWVudCwgdHJ1ZSk7Ci0JCQkJCXZpZXdlci5zZXRHcmF5Q2hlY2tlZChzZWxlY3RlZEVsZW1lbnQsIGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQl2aWV3ZXIuc2V0UGFyZW50c0dyYXllZChzZWxlY3RlZEVsZW1lbnQsIGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlbGVjdGVkIG1ldGhvZCBlbGVtZW50IHR5cGVzLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygc2VsZWN0ZWQgbWV0aG9kIGVsZW1lbnQgdHlwZXMKLQkgKi8KLQlwdWJsaWMgTWV0aG9kU2VhcmNoU2NvcGUgZ2V0U2VhcmNoU2NvcGUoKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kU2VhcmNoU2NvcGUodmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9TZWFyY2hSZXN1bHRMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0TGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NGZiMmNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9TZWFyY2hSZXN1bHRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBUaGUgbGFiZWwgcHJvdmlkZXIgZm9yIHRoZSBtZXRob2Qgc2VhcmNoIHJlc3VsdCB0cmVlIGFuZCB0YWJsZSB2aWV3ZXJzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaFJlc3VsdExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJbmV3IFVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VhcmNoUmVzdWx0TGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIExhYmVsUHJvdmlkZXIjZ2V0VGV4dChPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdFVJRm9sZGVyKSB7Ci0JCQlyZXR1cm4gKChTZWFyY2hSZXN1bHRVSUZvbGRlcikgb2JqKS5nZXROYW1lKCk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudCkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChvYmopOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTGFiZWxQcm92aWRlciNnZXRJbWFnZShPYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdFVJRm9sZGVyKSB7Ci0JCQlyZXR1cm4gKChTZWFyY2hSZXN1bHRVSUZvbGRlcikgb2JqKS5nZXRJbWFnZSgpOwotCQl9Ci0JCXJldHVybiBsYWJlbFByb3ZpZGVyLmdldEltYWdlKG9iaik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9TZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYzEwMzQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9TZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotLyoqCi0gKiBUaGUgY29udGVudCBwcm92aWRlciBmb3IgdGhlIG1ldGhvZCBzZWFyY2ggcmVzdWx0IHRhYmxlIHZpZXdlci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX0xJU1QgPSBuZXcgT2JqZWN0WzBdOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKLQotCXByaXZhdGUgTWV0aG9kU2VhcmNoUmVzdWx0IHNlYXJjaFJlc3VsdDsKLQotCS8qKgotCSAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RTZWFyY2hSZXN1bHQpIHsKLQkJCXJldHVybiAoKE1ldGhvZFNlYXJjaFJlc3VsdCkgaW5wdXRFbGVtZW50KS5nZXRFbGVtZW50cygpOwotCQl9Ci0JCXJldHVybiBFTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlpZiAobmV3SW5wdXQgIT0gbnVsbCAmJiBuZXdJbnB1dCBpbnN0YW5jZW9mIE1ldGhvZFNlYXJjaFJlc3VsdCkgewotCQkJdGFibGVWaWV3ZXIgPSAoVGFibGVWaWV3ZXIpIHZpZXdlcjsKLQkJCXNlYXJjaFJlc3VsdCA9IChNZXRob2RTZWFyY2hSZXN1bHQpIG5ld0lucHV0OwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZWxlbWVudHNDaGFuZ2VkKE9iamVjdFtdIHVwZGF0ZWRFbGVtZW50cykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHVwZGF0ZWRFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHNlYXJjaFJlc3VsdC5nZXRNYXRjaENvdW50KHVwZGF0ZWRFbGVtZW50c1tpXSkgPiAwKSB7Ci0JCQkJaWYgKHRhYmxlVmlld2VyLnRlc3RGaW5kSXRlbSh1cGRhdGVkRWxlbWVudHNbaV0pICE9IG51bGwpIHsKLQkJCQkJdGFibGVWaWV3ZXIucmVmcmVzaCh1cGRhdGVkRWxlbWVudHNbaV0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRhYmxlVmlld2VyLmFkZCh1cGRhdGVkRWxlbWVudHNbaV0pOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdGFibGVWaWV3ZXIucmVtb3ZlKHVwZGF0ZWRFbGVtZW50c1tpXSk7Ci0JCQl9Ci0JCX0KLQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9TZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZWU1YTRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9TZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuU2VhcmNoVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBtZXRob2Qgc2VhcmNoIHJlc3VsdCB0cmVlIHZpZXdlci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLR19OQU1FX0NPTlRFTlQgPSAiQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9DT1JFX0NPTlRFTlQgPSAiQ29yZUNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfQ0FURUdPUklFUyA9ICJDYXRlZ29yaWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLR19OQU1FX0RJU0NJUExJTkVTID0gIkRpc2NpcGxpbmVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLR19OQU1FX0RPTUFJTlMgPSAiRG9tYWlucyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9XT1JLX1BST0RVQ1RfVFlQRVMgPSAiV1AgVHlwZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfUk9MRVNFVFMgPSAiUm9sZVNldHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfVE9PTFMgPSAiVG9vbHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfQ1VTVE9NX0NBVEVHT1JJRVMgPSAiQ3VzdG9tQ2F0ZWdvcmllcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9DQVBBQklMSVRZX1BBVFRFUk5TID0gIkNhcGFiaWxpdHlQYXR0ZXJucyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9ERUxJVkVSWV9QUk9DRVNTRVMgPSAiRGVsaXZlcnlQcm9jZXNzZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0NPTlRFTlQgPSBTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hSZXN1bHRfbWV0aG9kQ29udGVudDsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1BBQ0tBR0VTID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X2NvbnRlbnRQYWNrYWdlczsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQU5EQVJEX0NBVEVHT1JJRVMgPSBTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hSZXN1bHRfc3RhbmRhcmRDYXRlZ29yaWVzOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ0lQTElORVMgPSBTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hSZXN1bHRfZGlzY2lwbGluZXM7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET01BSU5TID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X2RvbWFpbnM7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX1BST0RVQ1RfVFlQRVMgPSBTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hSZXN1bHRfd29ya1Byb2R1Y3RUeXBlczsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVTRVRTID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X3JvbGVTZXRzOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTFMgPSBTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hSZXN1bHRfdG9vbHM7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ0FURUdPUklFUyA9IFNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaFJlc3VsdF9jdXN0b21DYXRlZ29yaWVzOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU0VTID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X3Byb2Nlc3NlczsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfUEFUVEVSTlMgPSBTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hSZXN1bHRfY2FwYWJpbGl0eVBhdHRlcm5zOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSVZFUllfUFJPQ0VTU0VTID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X2RlbGl2ZXJ5UHJvY2Vzc2VzOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9MSVNUID0gbmV3IE9iamVjdFswXTsKLQotCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCi0JcHJpdmF0ZSBNZXRob2RTZWFyY2hSZXN1bHQgc2VhcmNoUmVzdWx0OwotCi0JcHJpdmF0ZSBNYXAgZWxlbWVudE1hcDsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFNlYXJjaFJlc3VsdCkgewotCQkJT2JqZWN0W10gZWxlbWVudHMgPSAoKE1ldGhvZFNlYXJjaFJlc3VsdCkgaW5wdXRFbGVtZW50KQotCQkJCQkuZ2V0RWxlbWVudHMoKTsKLQkJCWlmIChlbGVtZW50cy5sZW5ndGggPT0gMCkgewotCQkJCXJldHVybiBFTVBUWV9MSVNUOwotCQkJfQotCQkJZWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaW5zZXJ0KGVsZW1lbnRzW2ldLCBmYWxzZSk7Ci0JCQl9Ci0KLQkJCWluc2VydFVJRm9sZGVycyhpbnB1dEVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlpZiAobmV3SW5wdXQgIT0gbnVsbCAmJiBuZXdJbnB1dCBpbnN0YW5jZW9mIE1ldGhvZFNlYXJjaFJlc3VsdCkgewotCQkJdHJlZVZpZXdlciA9IChUcmVlVmlld2VyKSB2aWV3ZXI7Ci0JCQlzZWFyY2hSZXN1bHQgPSAoTWV0aG9kU2VhcmNoUmVzdWx0KSBuZXdJbnB1dDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGVsZW1lbnRzQ2hhbmdlZChPYmplY3RbXSB1cGRhdGVkRWxlbWVudHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cGRhdGVkRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChzZWFyY2hSZXN1bHQuZ2V0TWF0Y2hDb3VudCh1cGRhdGVkRWxlbWVudHNbaV0pID4gMCkgewotCQkJCWlmICh0cmVlVmlld2VyLnRlc3RGaW5kSXRlbSh1cGRhdGVkRWxlbWVudHNbaV0pICE9IG51bGwpIHsKLQkJCQkJaW5zZXJ0KHVwZGF0ZWRFbGVtZW50c1tpXSwgdHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVtb3ZlKHVwZGF0ZWRFbGVtZW50c1tpXSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0cmVlVmlld2VyLnJlbW92ZSh1cGRhdGVkRWxlbWVudHNbaV0pOwotCQkJfQotCQl9Ci0JCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50TWFwID09IG51bGwpIHsKLQkJCXJldHVybiBFTVBUWV9MSVNUOwotCQl9Ci0JCVNldCBjaGlsZHJlbiA9IChTZXQpIGVsZW1lbnRNYXAuZ2V0KHBhcmVudEVsZW1lbnQpOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIEVNUFRZX0xJU1Q7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdFVJRm9sZGVyKSB7Ci0JCQlyZXR1cm4gKChTZWFyY2hSZXN1bHRVSUZvbGRlcikgZWxlbWVudCkuZ2V0UGFyZW50KCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwcm9jZXNzUGFja2FnZSA9IChQcm9jZXNzUGFja2FnZSkgZWxlbWVudDsKLQkJCU9iamVjdCBwYXJlbnQgPSBwcm9jZXNzUGFja2FnZS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KSBwYXJlbnQ7Ci0JCQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnQuZ2V0UHJvY2VzcygpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQlNZXRob2RQYWNrYWdlIG1ldGhvZFBhY2thZ2UgPSAoTWV0aG9kUGFja2FnZSkgZWxlbWVudDsKLQkJCU9iamVjdCBwYXJlbnQgPSBtZXRob2RQYWNrYWdlLmVDb250YWluZXIoKTsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCQkJTWV0aG9kUGFja2FnZSBwYXJlbnRQYWNrYWdlID0gbWV0aG9kUGFja2FnZS5nZXRQYXJlbnRQYWNrYWdlKCk7Ci0JCQlyZXR1cm4gcGFyZW50UGFja2FnZTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBlbGVtZW50OwotCQkJQXJ0aWZhY3QgY29udGFpbmVyQXJ0aWZhY3QgPSBhcnRpZmFjdC5nZXRDb250YWluZXJBcnRpZmFjdCgpOwotCQkJaWYgKGNvbnRhaW5lckFydGlmYWN0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gY29udGFpbmVyQXJ0aWZhY3Q7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBVbWFVdGlsLmdldENvbnRlbnRQYWNrYWdlKGFydGlmYWN0KTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCVByYWN0aWNlIHByYWN0aWNlID0gKFByYWN0aWNlKSBlbGVtZW50OwotCQkJcmV0dXJuIHByYWN0aWNlLmdldENvbnRhaW5lcigpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgZWxlbWVudDsKLQkJCXJldHVybiBkaXNjaXBsaW5lLmdldENvbnRhaW5lcigpOwkJCQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCURvbWFpbiBkb21haW4gPSAoRG9tYWluKSBlbGVtZW50OwotCQkJcmV0dXJuIGRvbWFpbi5nZXRDb250YWluZXIoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCXJldHVybiBVbWFVdGlsLmdldENvbnRlbnRQYWNrYWdlKChDb250ZW50RWxlbWVudCkgZWxlbWVudCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCVByb2Nlc3MgcHJvY2VzcyA9IChQcm9jZXNzKSBlbGVtZW50OwotCQkJUHJvY2Vzc1BhY2thZ2UgcGFyZW50ID0gKFByb2Nlc3NQYWNrYWdlKSBwcm9jZXNzLmVDb250YWluZXIoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCXJldHVybiBwYXJlbnQuZUNvbnRhaW5lcigpOwotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJUHJvY2Vzc1BhY2thZ2UgcHJvY2Vzc1BhY2thZ2UgPSBVbWFVdGlsCi0JCQkJCS5nZXRQcm9jZXNzUGFja2FnZSgoUHJvY2Vzc0VsZW1lbnQpIGVsZW1lbnQpOwotCQkJaWYgKHByb2Nlc3NQYWNrYWdlICE9IG51bGwpIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwYXJlbnRQYWNrYWdlID0gKFByb2Nlc3NQYWNrYWdlKSBwcm9jZXNzUGFja2FnZQotCQkJCQkJLmdldFBhcmVudFBhY2thZ2UoKTsKLQkJCQlpZiAocGFyZW50UGFja2FnZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChwYXJlbnRQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpIHBhcmVudFBhY2thZ2U7Ci0JCQkJCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudC5nZXRQcm9jZXNzKCk7Ci0JCQkJCX0KLQkJCQkJTGlzdCBwcm9jZXNzRWxlbWVudHMgPSBwYXJlbnRQYWNrYWdlLmdldFByb2Nlc3NFbGVtZW50cygpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBwcm9jZXNzRWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlQcm9jZXNzRWxlbWVudCBwcm9jZXNzRWxlbWVudCA9IChQcm9jZXNzRWxlbWVudCkgaQotCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJaWYgKHByb2Nlc3NFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCQkJJiYgcHJvY2Vzc0VsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscygKLQkJCQkJCQkJCQlwYXJlbnRQYWNrYWdlLmdldE5hbWUoKSkpIHsKLQkJCQkJCQlyZXR1cm4gcHJvY2Vzc0VsZW1lbnQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50KSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwcm9jZXNzUGFja2FnZSA9IFVtYVV0aWwKLQkJCQkJLmdldFByb2Nlc3NQYWNrYWdlKChQcm9jZXNzRWxlbWVudCkgZWxlbWVudCk7Ci0JCQlpZiAocHJvY2Vzc1BhY2thZ2UgIT0gbnVsbCkgewotCQkJCWlmIChwcm9jZXNzUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpIHByb2Nlc3NQYWNrYWdlOwotCQkJCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudC5nZXRQcm9jZXNzKCk7Ci0JCQkJfQotCQkJCUxpc3QgcHJvY2Vzc0VsZW1lbnRzID0gcHJvY2Vzc1BhY2thZ2UuZ2V0UHJvY2Vzc0VsZW1lbnRzKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpID0gcHJvY2Vzc0VsZW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCQlQcm9jZXNzRWxlbWVudCBwcm9jZXNzRWxlbWVudCA9IChQcm9jZXNzRWxlbWVudCkgaS5uZXh0KCk7Ci0JCQkJCWlmIChwcm9jZXNzRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkJJiYgcHJvY2Vzc0VsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscygKLQkJCQkJCQkJCXByb2Nlc3NQYWNrYWdlLmdldE5hbWUoKSkpIHsKLQkJCQkJCXJldHVybiBwcm9jZXNzRWxlbWVudDsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gcHJvY2Vzc1BhY2thZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnQoT2JqZWN0IGNoaWxkLCBib29sZWFuIHJlZnJlc2hWaWV3ZXIpIHsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChjaGlsZCk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJaWYgKGluc2VydENoaWxkKHBhcmVudCwgY2hpbGQpKSB7Ci0JCQkJaWYgKHJlZnJlc2hWaWV3ZXIpIHsKLQkJCQkJdHJlZVZpZXdlci5hZGQocGFyZW50LCBjaGlsZCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAocmVmcmVzaFZpZXdlcikgewotCQkJCQl0cmVlVmlld2VyLnJlZnJlc2gocGFyZW50KTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJY2hpbGQgPSBwYXJlbnQ7Ci0JCQlwYXJlbnQgPSBnZXRQYXJlbnQoY2hpbGQpOwotCQl9Ci0JCWlmIChpbnNlcnRDaGlsZChzZWFyY2hSZXN1bHQsIGNoaWxkKSkgewotCQkJaWYgKHJlZnJlc2hWaWV3ZXIpIHsKLQkJCQl0cmVlVmlld2VyLmFkZChzZWFyY2hSZXN1bHQsIGNoaWxkKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGluc2VydENoaWxkKE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCkgewotCQlTZXQgY2hpbGRyZW4gPSAoU2V0KSBlbGVtZW50TWFwLmdldChwYXJlbnQpOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgSGFzaFNldCgpOwotCQkJZWxlbWVudE1hcC5wdXQocGFyZW50LCBjaGlsZHJlbik7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVwbGFjZShPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQsIE9iamVjdCBuZXdDaGlsZCkgewotCQlpbnNlcnQobmV3Q2hpbGQsIGZhbHNlKTsKLQkJZWxlbWVudE1hcC5wdXQobmV3Q2hpbGQsIChTZXQpIGVsZW1lbnRNYXAuZ2V0KGNoaWxkKSk7Ci0JCWVsZW1lbnRNYXAucmVtb3ZlKGNoaWxkKTsKLQkJU2V0IGNoaWxkcmVuID0gKFNldCkgZWxlbWVudE1hcC5nZXQocGFyZW50KTsKLQkJY2hpbGRyZW4ucmVtb3ZlKGNoaWxkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gcmVmcmVzaFZpZXdlcikgewotCQlpZiAoaGFzQ2hpbGRyZW4oZWxlbWVudCkpIHsKLQkJCWlmIChyZWZyZXNoVmlld2VyKSB7Ci0JCQkJdHJlZVZpZXdlci5yZWZyZXNoKGVsZW1lbnQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHNlYXJjaFJlc3VsdC5nZXRNYXRjaENvdW50KGVsZW1lbnQpID09IDApIHsKLQkJCQllbGVtZW50TWFwLnJlbW92ZShlbGVtZW50KTsKLQkJCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KGVsZW1lbnQpOwotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlyZW1vdmVGcm9tU2libGluZ3MoZWxlbWVudCwgcGFyZW50KTsKLQkJCQkJcmVtb3ZlKHBhcmVudCwgcmVmcmVzaFZpZXdlcik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVtb3ZlRnJvbVNpYmxpbmdzKGVsZW1lbnQsIHNlYXJjaFJlc3VsdCk7Ci0JCQkJCWlmIChyZWZyZXNoVmlld2VyKSB7Ci0JCQkJCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHJlZnJlc2hWaWV3ZXIpIHsKLQkJCQkJdHJlZVZpZXdlci5yZWZyZXNoKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21TaWJsaW5ncyhPYmplY3QgZWxlbWVudCwgT2JqZWN0IHBhcmVudCkgewotCQlTZXQgc2libGluZ3MgPSAoU2V0KSBlbGVtZW50TWFwLmdldChwYXJlbnQpOwotCQlpZiAoc2libGluZ3MgIT0gbnVsbCkgewotCQkJc2libGluZ3MucmVtb3ZlKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0cyB0aGUgVUkgZm9sZGVycyBpbnRvIHRoZSBzZWFyY2ggcmVzdWx0IHRyZWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0VUlGb2xkZXJzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJT2JqZWN0W10gZWxlbWVudHMgPSBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlTZWFyY2hSZXN1bHRVSUZvbGRlciBtZXRob2RDb250ZW50Rm9sZGVyID0gbmV3IFNlYXJjaFJlc3VsdFVJRm9sZGVyKAotCQkJCQkJTUVUSE9EX0NPTlRFTlQsIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Db250ZW50IiksIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJU2VhcmNoUmVzdWx0VUlGb2xkZXIgcHJvY2Vzc2VzRm9sZGVyID0gbmV3IFNlYXJjaFJlc3VsdFVJRm9sZGVyKAotCQkJCQkJUFJPQ0VTU0VTLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUHJvY2Vzc2VzIiksIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJT2JqZWN0W10gbWV0aG9kUGFja2FnZXMgPSBnZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1ldGhvZFBhY2thZ2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCU9iamVjdCBtZXRob2RQYWNrYWdlID0gbWV0aG9kUGFja2FnZXNbal07Ci0JCQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UKLQkJCQkJCQkmJiAoKENvbnRlbnRQYWNrYWdlKSBtZXRob2RQYWNrYWdlKS5nZXROYW1lKCkKLQkJCQkJCQkJCS5lcXVhbHMoUEtHX05BTUVfQ09OVEVOVCkpIHsKLQkJCQkJCU9iamVjdFtdIHBhY2thZ2VzID0gZ2V0Q2hpbGRyZW4obWV0aG9kUGFja2FnZSk7Ci0JCQkJCQlmb3IgKGludCBrID0gMDsgayA8IHBhY2thZ2VzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkJT2JqZWN0IHBrZyA9IHBhY2thZ2VzW2tdOwotCQkJCQkJCWlmIChwa2cgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCQkJCQlpZiAoKChDb250ZW50UGFja2FnZSkgcGtnKS5nZXROYW1lKCkuZXF1YWxzKAotCQkJCQkJCQkJCVBLR19OQU1FX0NPUkVfQ09OVEVOVCkpIHsKLQkJCQkJCQkJCXJlcGxhY2UoCi0JCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJCXBrZywKLQkJCQkJCQkJCQkJbmV3IFNlYXJjaFJlc3VsdFVJRm9sZGVyKAotCQkJCQkJCQkJCQkJCUNPTlRFTlRfUEFDS0FHRVMsCi0JCQkJCQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlcyIpLCBtZXRob2RDb250ZW50Rm9sZGVyKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfSBlbHNlIGlmICgoKENvbnRlbnRQYWNrYWdlKSBwa2cpLmdldE5hbWUoKQotCQkJCQkJCQkJCS5lcXVhbHMoUEtHX05BTUVfQ0FURUdPUklFUykpIHsKLQkJCQkJCQkJCVNlYXJjaFJlc3VsdFVJRm9sZGVyIHN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlciA9IG5ldyBTZWFyY2hSZXN1bHRVSUZvbGRlcigKLQkJCQkJCQkJCQkJU1RBTkRBUkRfQ0FURUdPUklFUywKLQkJCQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvU3RhbmRhcmRDYXRlZ29yaWVzIiksIG1ldGhvZENvbnRlbnRGb2xkZXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQlTZWFyY2hSZXN1bHRVSUZvbGRlciBjdXN0b21DYXRlZ29yaWVzRm9sZGVyID0gbmV3IFNlYXJjaFJlc3VsdFVJRm9sZGVyKAotCQkJCQkJCQkJCQlDVVNUT01fQ0FURUdPUklFUywKLQkJCQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ3VzdG9tQ2F0ZWdvcmllcyIpLCBtZXRob2RDb250ZW50Rm9sZGVyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJT2JqZWN0W10gY29udGVudFBhY2thZ2VzID0gZ2V0Q2hpbGRyZW4ocGtnKTsKLQkJCQkJCQkJCWZvciAoaW50IGwgPSAwOyBsIDwgY29udGVudFBhY2thZ2VzLmxlbmd0aDsgbCsrKSB7Ci0JCQkJCQkJCQkJT2JqZWN0IGNvbnRlbnRQYWNrYWdlID0gY29udGVudFBhY2thZ2VzW2xdOwotCQkJCQkJCQkJCWlmIChjb250ZW50UGFja2FnZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJCQkJCQkJCVN0cmluZyBwa2dOYW1lID0gKChDb250ZW50UGFja2FnZSkgY29udGVudFBhY2thZ2UpCi0JCQkJCQkJCQkJCQkJLmdldE5hbWUoKTsKLQkJCQkJCQkJCQkJaWYgKHBrZ05hbWUKLQkJCQkJCQkJCQkJCQkuZXF1YWxzKFBLR19OQU1FX0NVU1RPTV9DQVRFR09SSUVTKSkgewotCQkJCQkJCQkJCQkJaW5zZXJ0KGN1c3RvbUNhdGVnb3JpZXNGb2xkZXIsCi0JCQkJCQkJCQkJCQkJCWZhbHNlKTsKLQkJCQkJCQkJCQkJCWVsZW1lbnRNYXAKLQkJCQkJCQkJCQkJCQkJLnB1dCgKLQkJCQkJCQkJCQkJCQkJCQljdXN0b21DYXRlZ29yaWVzRm9sZGVyLAotCQkJCQkJCQkJCQkJCQkJCShTZXQpIGVsZW1lbnRNYXAKLQkJCQkJCQkJCQkJCQkJCQkJCS5nZXQoY29udGVudFBhY2thZ2UpKTsKLQkJCQkJCQkJCQkJfSBlbHNlIGlmIChwa2dOYW1lCi0JCQkJCQkJCQkJCQkJLmVxdWFscyhQS0dfTkFNRV9ESVNDSVBMSU5FUykpIHsKLQkJCQkJCQkJCQkJCWluc2VydCgKLQkJCQkJCQkJCQkJCQkJc3RhbmRhcmRDYXRlZ29yaWVzRm9sZGVyLAotCQkJCQkJCQkJCQkJCQlmYWxzZSk7Ci0JCQkJCQkJCQkJCQlyZXBsYWNlKAotCQkJCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQkJCQljb250ZW50UGFja2FnZSwKLQkJCQkJCQkJCQkJCQkJbmV3IFNlYXJjaFJlc3VsdFVJRm9sZGVyKAotCQkJCQkJCQkJCQkJCQkJCURJU0NJUExJTkVTLAotCQkJCQkJCQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGlzY2lwbGluZXMiKSwgc3RhbmRhcmRDYXRlZ29yaWVzRm9sZGVyKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJfSBlbHNlIGlmIChwa2dOYW1lCi0JCQkJCQkJCQkJCQkJLmVxdWFscyhQS0dfTkFNRV9ET01BSU5TKSkgewotCQkJCQkJCQkJCQkJaW5zZXJ0KAotCQkJCQkJCQkJCQkJCQlzdGFuZGFyZENhdGVnb3JpZXNGb2xkZXIsCi0JCQkJCQkJCQkJCQkJCWZhbHNlKTsKLQkJCQkJCQkJCQkJCXJlcGxhY2UoCi0JCQkJCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJCQkJCWNvbnRlbnRQYWNrYWdlLAotCQkJCQkJCQkJCQkJCQluZXcgU2VhcmNoUmVzdWx0VUlGb2xkZXIoCi0JCQkJCQkJCQkJCQkJCQkJRE9NQUlOUywKLQkJCQkJCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0RvbWFpbnMiKSwgc3RhbmRhcmRDYXRlZ29yaWVzRm9sZGVyKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJfSBlbHNlIGlmIChwa2dOYW1lCi0JCQkJCQkJCQkJCQkJLmVxdWFscyhQS0dfTkFNRV9XT1JLX1BST0RVQ1RfVFlQRVMpKSB7Ci0JCQkJCQkJCQkJCQlpbnNlcnQoCi0JCQkJCQkJCQkJCQkJCXN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlciwKLQkJCQkJCQkJCQkJCQkJZmFsc2UpOwotCQkJCQkJCQkJCQkJcmVwbGFjZSgKLQkJCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCQkJY29udGVudFBhY2thZ2UsCi0JCQkJCQkJCQkJCQkJCW5ldyBTZWFyY2hSZXN1bHRVSUZvbGRlcigKLQkJCQkJCQkJCQkJCQkJCQlXT1JLX1BST0RVQ1RfVFlQRVMsCi0JCQkJCQkJCQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGVzIiksIHN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlcikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCX0gZWxzZSBpZiAocGtnTmFtZQotCQkJCQkJCQkJCQkJCS5lcXVhbHMoUEtHX05BTUVfUk9MRVNFVFMpKSB7Ci0JCQkJCQkJCQkJCQlpbnNlcnQoCi0JCQkJCQkJCQkJCQkJCXN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlciwKLQkJCQkJCQkJCQkJCQkJZmFsc2UpOwotCQkJCQkJCQkJCQkJcmVwbGFjZSgKLQkJCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCQkJY29udGVudFBhY2thZ2UsCi0JCQkJCQkJCQkJCQkJCW5ldyBTZWFyY2hSZXN1bHRVSUZvbGRlcigKLQkJCQkJCQkJCQkJCQkJCQlST0xFU0VUUywKLQkJCQkJCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1JvbGVzIiksIHN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlcikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCX0gZWxzZSBpZiAocGtnTmFtZQotCQkJCQkJCQkJCQkJCS5lcXVhbHMoUEtHX05BTUVfVE9PTFMpKSB7Ci0JCQkJCQkJCQkJCQlpbnNlcnQoCi0JCQkJCQkJCQkJCQkJCXN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlciwKLQkJCQkJCQkJCQkJCQkJZmFsc2UpOwotCQkJCQkJCQkJCQkJcmVwbGFjZSgKLQkJCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCQkJY29udGVudFBhY2thZ2UsCi0JCQkJCQkJCQkJCQkJCW5ldyBTZWFyY2hSZXN1bHRVSUZvbGRlcigKLQkJCQkJCQkJCQkJCQkJCQlUT09MUywKLQkJCQkJCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1Rvb2xzIiksIHN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlcikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbGVtZW50TWFwLnJlbW92ZShwa2cpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIGlmIChwa2cgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZQotCQkJCQkJCQkJJiYgKChQcm9jZXNzUGFja2FnZSkgcGtnKS5nZXROYW1lKCkuZXF1YWxzKAotCQkJCQkJCQkJCQlQS0dfTkFNRV9DQVBBQklMSVRZX1BBVFRFUk5TKSkgewotCQkJCQkJCQlyZXBsYWNlKAotCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJcGtnLAotCQkJCQkJCQkJCW5ldyBTZWFyY2hSZXN1bHRVSUZvbGRlcigKLQkJCQkJCQkJCQkJCUNBUEFCSUxJVFlfUEFUVEVSTlMsCi0JCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm5zIiksIHByb2Nlc3Nlc0ZvbGRlcikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJU2V0IGNoaWxkcmVuID0gKFNldCkgZWxlbWVudE1hcC5nZXQoZWxlbWVudCk7Ci0JCQkJCQljaGlsZHJlbi5yZW1vdmUobWV0aG9kUGFja2FnZSk7Ci0JCQkJCX0gZWxzZSBpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlCi0JCQkJCQkJJiYgKChQcm9jZXNzUGFja2FnZSkgbWV0aG9kUGFja2FnZSkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkuZXF1YWxzKFBLR19OQU1FX0RFTElWRVJZX1BST0NFU1NFUykpIHsKLQkJCQkJCXJlcGxhY2UoCi0JCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCW1ldGhvZFBhY2thZ2UsCi0JCQkJCQkJCW5ldyBTZWFyY2hSZXN1bHRVSUZvbGRlcigKLQkJCQkJCQkJCQlERUxJVkVSWV9QUk9DRVNTRVMsCi0JCQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3NlcyIpLCBwcm9jZXNzZXNGb2xkZXIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL1NlYXJjaFJlc3VsdFVJRm9sZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0VUlGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWNjOTBiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0VUlGb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogTW9kZWxzIGEgVUkgZm9sZGVyIGluIHRoZSBtZXRob2Qgc2VhcmNoIHJlc3VsdCB0cmVlIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoUmVzdWx0VUlGb2xkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2UgREVGQVVMVF9JTUFHRSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRm9sZGVyIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQlwcml2YXRlIEltYWdlIGltYWdlOwotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgZm9yIHRoZSBmb2xkZXIuCi0JICovCi0JcHVibGljIFNlYXJjaFJlc3VsdFVJRm9sZGVyKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMobmFtZSwgREVGQVVMVF9JTUFHRSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgZm9sZGVyCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBvYmplY3QKLQkgKi8KLQlwdWJsaWMgU2VhcmNoUmVzdWx0VUlGb2xkZXIoU3RyaW5nIG5hbWUsIE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcyhuYW1lLCBERUZBVUxUX0lNQUdFLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIGZvbGRlcgotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgYW4gaW1hZ2UgZm9yIHRoZSBmb2xkZXIKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IG9iamVjdAotCSAqLwotCXB1YmxpYyBTZWFyY2hSZXN1bHRVSUZvbGRlcihTdHJpbmcgbmFtZSwgSW1hZ2UgaW1hZ2UsIE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5pbWFnZSA9IGltYWdlOwotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvbGRlciBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBmb3IgYSBVSSBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBvYmplY3QgZm9yIHRoZSBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwYXJlbnQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgb2JqZWN0Ci0JICogQHJldHVybiB0aGUgZ2l2ZW4gcGFyZW50IG9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3Qgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmb2xkZXIgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmY2JjMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIHNlYXJjaGluZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZDU2MTIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHNlYXJjaGluZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9wcmVmZXJlbmNlcy9TZWFyY2hVSVByZWZlcmVuY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvcHJlZmVyZW5jZXMvU2VhcmNoVUlQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NTU2MTQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9wcmVmZXJlbmNlcy9TZWFyY2hVSVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5TZWFyY2hVSVBsdWdpbjsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBTZWFyY2ggVUkgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoVUlQcmVmZXJlbmNlcyB7Ci0KLQkvKioKLQkgKiBUaGUgU2VhcmNoIFVJIHByZWZlcmVuY2Uga2V5cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUFSQ0hfU1RSSU5HID0gInNlYXJjaFN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUEFUVEVSTiA9ICJuYW1lUGF0dGVybiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU0VfU0VOU0lUSVZFID0gImNhc2VTZW5zaXRpdmUiOyAvLyROT04tTkxTLTEkCQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2F2ZWQgc2VhcmNoIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZWFyY2hTdHJpbmcoKSB7Ci0JCXJldHVybiBTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCVNFQVJDSF9TVFJJTkcpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBjdXJyZW50IHNlYXJjaCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNlYXJjaFN0cmluZyhTdHJpbmcgc2VhcmNoU3RyaW5nKSB7Ci0JCVNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQlTRUFSQ0hfU1RSSU5HLCBzZWFyY2hTdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNhdmVkIG5hbWUgcGF0dGVybiBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZVBhdHRlcm4oKSB7Ci0JCXJldHVybiBTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCU5BTUVfUEFUVEVSTik7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGN1cnJlbnQgbmFtZSBwYXR0ZXJuIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TmFtZVBhdHRlcm4oU3RyaW5nIG5hbWVQYXR0ZXJuKSB7Ci0JCVNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShOQU1FX1BBVFRFUk4sCi0JCQkJbmFtZVBhdHRlcm4pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNhdmVkIGFzZSBzZW5zaXRpdmUgb3B0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRDYXNlU2Vuc2l0aXZlKCkgewotCQlyZXR1cm4gU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oCi0JCQkJQ0FTRV9TRU5TSVRJVkUpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBjdXJyZW50IGNhc2Ugc2Vuc2l0aXZlIG9wdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZShib29sZWFuIGNhc2VTZW5zaXRpdmUpIHsKLQkJU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKAotCQkJCUNBU0VfU0VOU0lUSVZFLCBjYXNlU2Vuc2l0aXZlKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTEwMzllZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcHJlZmVyZW5jZSBzdXBwb3J0IGZvciBzZWFyY2hpbmcgYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZGE1M2FkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5zZWFyY2g8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMjBkNmM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLlNlYXJjaFBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogY29tLmlibS5pY3UsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5hcGFjaGUubHVjZW5lO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLnNlYXJjaCwKLSBvcmcuZWNsaXBzZS51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLAotIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guYW5hbHlzaXMsCi0gb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5jb25maWd1cmF0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5N2Q2ZjU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZmM3MDMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgU2VhcmNoCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9HZW5lcmF0ZVNlYXJjaEluZGV4RXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvR2VuZXJhdGVTZWFyY2hJbmRleEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZjZlN2MxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9HZW5lcmF0ZVNlYXJjaEluZGV4RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoOwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIHNlYXJjaCBpbmRleCBnZW5lcmF0aW9uIG9wZXJhdGlvbiBoYXMgZmFpbGVkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlU2VhcmNoSW5kZXhFeGNlcHRpb24gZXh0ZW5kcyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY1Mzc0MDUyMTE0NTExNzcxMTBMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgR2VuZXJhdGVTZWFyY2hJbmRleEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBHZW5lcmF0ZVNlYXJjaEluZGV4RXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIocm9vdENhdXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgR2VuZXJhdGVTZWFyY2hJbmRleEV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbiBhbmQgdGhlCi0JICogZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBHZW5lcmF0ZVNlYXJjaEluZGV4RXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UsIFN0cmluZyBlcnJvck1zZykgewotCQlzdXBlcihyb290Q2F1c2UsIGVycm9yTXNnKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvSVNlYXJjaFNlcnZpY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9JU2VhcmNoU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMDlhMjE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9JU2VhcmNoU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGl0RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25TZWFyY2hRdWVyeTsKLQotLyoqCi0gKiBUaGUgU2VhcmNoIFNlcnZpY2UgQVBJLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VhcmNoU2VydmljZSB7Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gc2VhcmNoUXVlcnkKLQkgKiAgICAgICAgICAgIGEgY29uZmlndXJhdGlvbiBzZWFyY2ggcXVlcnkKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPkNvbmZpZ3VyYXRpb25IaXRFbnRyeTwvY29kZT4gb2JqZWN0cwotCSAqIEB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uSGl0RW50cnlbXSBzZWFyY2hDb25maWd1cmF0aW9uKFN0cmluZyBwYXRoLAotCQkJQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5IHNlYXJjaFF1ZXJ5KSB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL0luZGV4QnVpbGRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL0luZGV4QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZTgyZmYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9JbmRleEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguSW5kZXhXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuRGlyZWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkZTRGlyZWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLlJBTURpcmVjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmFuYWx5c2lzLlRleHRBbmFseXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnV0aWxzLkxIVE1MUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudXRpbHMuSmFyQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnV0aWxzLlVOQ1V0aWw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0aGUgbWFpbiBjbGFzcyB0aGF0IGNyZWF0ZXMgdGhlIEluZGV4IGZyb20gdGhlIGZpbGUKLSAqIGFzc29jaWF0aW9ucyBpbiB0aGUgcHJvY2VzcyBsYXlvdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmRleEJ1aWxkZXIgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9GSUxFX05BTUUgPSAidmVyc2lvbi50eHQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0RFTElNSVRFUiA9ICIqIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRG9jdW1lbnQgZmllbGRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSSUVGX0RFU0NSSVBUSU9OX0ZJRUxEID0gImJyaWVmRGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9GSUVMRCA9ICJjb250ZW50cyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9GSUVMRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RJRklFRF9GSUVMRCA9ICJtb2RpZmllZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0ZJRUxEID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9GSUVMRCA9ICJyb2xlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVTU1BUllfRklFTEQgPSAic3VtbWFyeSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0ZJRUxEID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0ZJRUxEID0gInVybCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEVfRklFTEQgPSAidGl0bGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVNQV9FTEVNRU5UX1RZUEVfRklFTEQgPSAidW1hLnR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9DT05URU5UID0gImdlbmVyYWxfY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIExpc3Qgb2YgVU1BIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBzZWFyY2ggaW5kZXguCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBOT19TRUFSQ0hFQUJMRV9VTUFfRUxFTUVOVFMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0Jc3RhdGljIHsKLQkJTk9fU0VBUkNIRUFCTEVfVU1BX0VMRU1FTlRTLmFkZCgic3VtbWFyeSIpOwotCQlOT19TRUFSQ0hFQUJMRV9VTUFfRUxFTUVOVFMuYWRkKCJ3b3JrcHJvZHVjdGRlc2NyaXB0b3IiKTsKLQkJTk9fU0VBUkNIRUFCTEVfVU1BX0VMRU1FTlRTLmFkZCgidGFza2Rlc2NyaXB0b3IiKTsKLQkJTk9fU0VBUkNIRUFCTEVfVU1BX0VMRU1FTlRTLmFkZCgicm9sZWRlc2NyaXB0b3IiKTsKLQl9Ci0KLQkvLyBBIGxpc3Qgb2YgdG9wIGxldmVsIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIHNlYXJjaAotCS8vIGluZGV4LgotCXByaXZhdGUgamF2YS51dGlsLkxpc3QgZGlyc1RvU2tpcCA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIFN0cmluZyBwRGlyZWN0b3J5ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBpbmRleEZvbGRlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvZHVjdE5hbWUgPSBudWxsOwotCi0JcHVibGljIEluZGV4QnVpbGRlcihTdHJpbmcgcHVibGlzaERpcikgewotCQlpbnQgYXBwbGV0SW5kZXggPSAtMTsKLQkJaWYgKHB1Ymxpc2hEaXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlhcHBsZXRJbmRleCA9IHB1Ymxpc2hEaXIuaW5kZXhPZihGaWxlLnNlcGFyYXRvciArICJhcHBsZXQiKTsKLQotCQlwRGlyZWN0b3J5ID0gVU5DVXRpbC5jb252ZXJ0RmlsZW5hbWUoKGFwcGxldEluZGV4ID4gLTEpID8gcHVibGlzaERpcgotCQkJCS5zdWJzdHJpbmcoMCwgYXBwbGV0SW5kZXggKyAxKSA6IHB1Ymxpc2hEaXIpOwotCQlTdHJpbmcgc2l0ZU5hbWUgPSBwRGlyZWN0b3J5LnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQlpbnQgaW5kZXggPSBzaXRlTmFtZS5sZW5ndGgoKTsKLQkJaWYgKHNpdGVOYW1lLmVuZHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJaW5kZXggPSBpbmRleCAtIDE7Ci0JCX0KLQotCQlpbnQgaW5kZXgyID0gc2l0ZU5hbWUubGFzdEluZGV4T2YoIi8iLCBpbmRleCAtIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJcHJvZHVjdE5hbWUgPSBzaXRlTmFtZS5zdWJzdHJpbmcoaW5kZXgyICsgMSwgaW5kZXgpOwotCi0JCS8vIGNyZWF0ZSB0aGUgaW5kZXgKLQkJU3RyaW5nQnVmZmVyIHNlYXJjaEZvbGRlciA9IG5ldyBTdHJpbmdCdWZmZXIocERpcmVjdG9yeSk7Ci0JCWlmICghc2VhcmNoRm9sZGVyLnRvU3RyaW5nKCkuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0JCQlzZWFyY2hGb2xkZXIuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKTsKLQkJfQotCQlzZWFyY2hGb2xkZXIuYXBwZW5kKCJzZWFyY2giKTsgLy8kTk9OLU5MUy0yJAotCi0JCWluZGV4Rm9sZGVyID0gbmV3IFN0cmluZ0J1ZmZlcihzZWFyY2hGb2xkZXIudG9TdHJpbmcoKSk7Ci0JCWluZGV4Rm9sZGVyLmFwcGVuZChGaWxlLnNlcGFyYXRvcikuYXBwZW5kKCJpbmRleCIpOyAvLyROT04tTkxTLTEkCi0KLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJhcHBsZXQiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgImNzcyIpOyAvLyROT04tTkxTLTEkCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAiZXh0X2hlbHAiKTsgLy8kTk9OLU5MUy0xJAkJCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAiaWNvbnMiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgImltYWdlcyIpOyAvLyROT04tTkxTLTEkCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAiaW5kZXgiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgImxvZ3MiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgIm1hbnVhbHMiKTsgLy8kTk9OLU5MUy0xJAkJCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAibm9hcHBsZXQiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgInBhZ2VzX25vdF9pbnN0YWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgInByb2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAkJCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAic2NyaXB0cyIpOyAvLyROT04tTkxTLTEkCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAic3R5bGVzaGVldHMiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgInhtbCIpOyAvLyROT04tTkxTLTEkCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAic2VhcmNoIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjcmVhdGVJbmRleChib29sZWFuIGphckl0KSB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAoSW5kZXhCdWlsZGVyLmNsYXNzKSB7Ci0KLQkJCWlmIChpbmRleEZvbGRlciA9PSBudWxsIHx8IHBEaXJlY3RvcnkgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0JCQkJCQkiSW52YWxpZCBpbmRleEZvbGRlciBvciBwRGlyZWN0b3J5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlSQU1EaXJlY3RvcnkgcmFtRGlyID0gbmV3IFJBTURpcmVjdG9yeSgpOwotCi0JCQkJSW5kZXhXcml0ZXIgZnNXcml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoRlNEaXJlY3RvcnkKLQkJCQkJCS5nZXREaXJlY3RvcnkoaW5kZXhGb2xkZXIudG9TdHJpbmcoKSwgdHJ1ZSksCi0JCQkJCQluZXcgVGV4dEFuYWx5emVyKCksIHRydWUpOwotCi0JCQkJSW5kZXhXcml0ZXIgcmFtV3JpdGVyID0gbmV3IEluZGV4V3JpdGVyKHJhbURpciwKLQkJCQkJCW5ldyBUZXh0QW5hbHl6ZXIoKSwgdHJ1ZSk7Ci0KLQkJCQlpZiAoKGZzV3JpdGVyICE9IG51bGwpKSB7Ci0JCQkJCS8vIGZzV3JpdGVyLm1lcmdlRmFjdG9yID0gMTAwMDsKLQkJCQkJLy8gZnNXcml0ZXIubWF4TWVyZ2VEb2NzID0gMTAwMDA7Ci0JCQkJCWZzV3JpdGVyLm1heEZpZWxkTGVuZ3RoID0gMTAwMDAwMDsKLQotCQkJCQlpbmRleERvY3MobmV3IEZpbGUocERpcmVjdG9yeSksIHJhbVdyaXRlcik7Ci0KLQkJCQkJZnNXcml0ZXIuYWRkSW5kZXhlcyhuZXcgRGlyZWN0b3J5W10geyByYW1EaXIgfSk7Ci0JCQkJCWZzV3JpdGVyLm9wdGltaXplKCk7Ci0JCQkJCXJhbVdyaXRlci5jbG9zZSgpOwotCQkJCQlmc1dyaXRlci5jbG9zZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZUluZGV4Iik7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJpbmRleCBjcmVhdGVkIHN1Y2Nlc3NmdWxseSIpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCS8vIGNyZWF0ZSB0aGUgdmVyc2lvbiBmaWxlLgotCQkJRGF0ZSB0b2RheSA9IG5ldyBEYXRlKCk7Ci0JCQlsb25nIG1pbGxpc2Vjb25kcyA9IHRvZGF5LmdldFRpbWUoKTsKLQkJCQotCQkJaWYgKCFqYXJJdCkgewotCQkJCXRyeSB7Ci0JCQkJCUZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcihpbmRleEZvbGRlciArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkJKyBWRVJTSU9OX0ZJTEVfTkFNRSk7Ci0JCQkJCUJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKGZ3KTsKLQkJCQkJYncud3JpdGUocHJvZHVjdE5hbWUgKyBWRVJTSU9OX0RFTElNSVRFUiArIG1pbGxpc2Vjb25kcyArCi0JCQkJCQkJIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYncuY2xvc2UoKTsKLQkJCQkJZncuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkJdGhyb3cgbmV3IFNlYXJjaFNlcnZpY2VFeGNlcHRpb24oCi0JCQkJCQkJU2VhcmNoUmVzb3VyY2VzLmNyZWF0ZVNlYXJjaEluZGV4RXJyb3IpOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLy8gamFyIHVwIHRoZSBjcmVhdGVkIGluZGV4LgotCQkJSmFyQ3JlYXRvci5qYXJGb2xkZXIoaW5kZXhGb2xkZXIudG9TdHJpbmcoKSk7Ci0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaW5kZXggSmFycmVkIHN1Y2Nlc3NmdWxseSIpOyAvLyROT04tTkxTLTEkCi0KLQkJCXRyeSB7Ci0JCQkJLy8gZGVsZXRlIHRoZSBmaWxlcyBub3cgdGhhdCB0aGV5J3ZlIGJlZW4gamFycmVkLgotCQkJCUZpbGUgaW5kZXhEaXIgPSBuZXcgRmlsZShpbmRleEZvbGRlci50b1N0cmluZygpKTsKLQkJCQlGaWxlW10gZmlsZXMgPSBpbmRleERpci5saXN0RmlsZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUZpbGUgdGVtcEZpbGUgPSBmaWxlc1tpXTsKLQkJCQkJaWYgKCF0ZW1wRmlsZS5nZXROYW1lKCkuZXF1YWxzKEphckNyZWF0b3IuSU5ERVhfSkFSKSkgewotCQkJCQkJdGVtcEZpbGUuZGVsZXRlKCk7Ci0JCQkJCX0KLQkJCQl9CQotCi0JCQkJLy8gU3RyaW5nIHJ1cE5hbWUgPSBwdWJsaXNoRGlyLnN1YnN0cmluZyhpbmRleCk7Ci0JCQkJRmlsZSBuZXdJbmRleEphciA9IG5ldyBGaWxlKGluZGV4Rm9sZGVyICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCSsgSmFyQ3JlYXRvci5JTkRFWF9KQVIpOwotCQkJCWlmIChuZXdJbmRleEphci5leGlzdHMoKSkgewotCQkJCQlTdHJpbmcgZmlsZVNpemUgPSAiIiArIG5ld0luZGV4SmFyLmxlbmd0aCgpOyAvLyROT04tTkxTLTEkCi0JCQkJCUZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcihpbmRleEZvbGRlciArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkJKyBWRVJTSU9OX0ZJTEVfTkFNRSk7Ci0JCQkJCUJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKGZ3KTsKLQkJCQkJYncud3JpdGUocHJvZHVjdE5hbWUgKyBWRVJTSU9OX0RFTElNSVRFUiArIG1pbGxpc2Vjb25kcwotCQkJCQkJCSsgVkVSU0lPTl9ERUxJTUlURVIgKyBmaWxlU2l6ZSArICJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJ3LmNsb3NlKCk7Ci0JCQkJCWZ3LmNsb3NlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IFNlYXJjaFNlcnZpY2VFeGNlcHRpb24oCi0JCQkJCQkJU2VhcmNoUmVzb3VyY2VzLmNyZWF0ZVNlYXJjaEluZGV4RXJyb3IpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCXRocm93IG5ldyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uKAotCQkJCQkJU2VhcmNoUmVzb3VyY2VzLmNyZWF0ZVNlYXJjaEluZGV4RXJyb3IpOwotCQkJfQotCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluZGV4IHRoZSBhY3R1YWwgZG9jdW1lbnRzIHNwZWNpZmllZCBieSB0aGUgZmlsZXMgYW5kIHJlY3Vyc2l2ZWx5IGdldCBhbGwKLQkgKiBmaWxlIGluIHRoZSBzcGVjaWZpZWQgZm9sZGVyIGZpbGUKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5kZXhEb2NzKEZpbGUgZmlsZSwgSW5kZXhXcml0ZXIgd3JpdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGRpcnNUb1NraXAuY29udGFpbnMoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlTdHJpbmdbXSBmaWxlcyA9IGZpbGUubGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWluZGV4RG9jcyhuZXcgRmlsZShmaWxlLCBmaWxlc1tpXSksIHdyaXRlcik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaXNIdG1sRG9jKGZpbGUpKSB7Ci0JCQlpZiAoc2hvdWxkQmVFeGNsdWRlZChmaWxlKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJRG9jdW1lbnQgZG9jID0gZ2V0SFRNTERvY3VtZW50KGZpbGUpOwotCi0JCQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQkJCXdyaXRlci5hZGREb2N1bWVudChkb2MpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihmaWxlLmdldE5hbWUoKSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJpbmRleERvY3MiKTsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBmaWxlIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZSBzZWFyY2ggaW5kZXguCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBmaWxlIHRvIGJlIHZlcmlmaWVkLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGZpbGUgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlCi0JICogICAgICAgICBzZWFyY2ggaW5kZXguCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZEJlRXhjbHVkZWQoRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBwYXRoID0gZmlsZS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCWlmIChwRGlyZWN0b3J5LnN0YXJ0c1dpdGgocGF0aCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNIdG1sRG9jKEZpbGUgZmlsZSkgewotCQlTdHJpbmcgcGF0aCA9IGZpbGUuZ2V0UGF0aCgpOwotCQlyZXR1cm4gcGF0aC5lbmRzV2l0aCgiLmh0bWwiKSB8fCBwYXRoLmVuZHNXaXRoKCIuaHRtIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCXByaXZhdGUgRG9jdW1lbnQgZ2V0SFRNTERvY3VtZW50KEZpbGUgZmlsZSkgewotCQlEb2N1bWVudCBsdWNlbmVEb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpOwotCi0JCVN0cmluZyB1cmwgPSBmaWxlLmdldFBhdGgoKS5yZXBsYWNlKEZpbGUucGF0aFNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCWx1Y2VuZURvY3VtZW50LmFkZChGaWVsZC5VbkluZGV4ZWQoVVJMX0ZJRUxELCB1cmwpKTsKLQotCQl0cnkgewotCQkJTEhUTUxQYXJzZXIgcGFyc2VyID0gbmV3IExIVE1MUGFyc2VyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcigKLQkJCQkJbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSwgIlVURi04IikpOyAvLyROT04tTkxTLTEkCi0KLQkJCVJlYWRlciByZWFkZXIgPSBwYXJzZXIuZ2V0UmVhZGVyKCk7Ci0JCQlpZiAocmVhZGVyICE9IG51bGwpIHsKLQkJCQlsdWNlbmVEb2N1bWVudC5hZGQoRmllbGQuVGV4dChDT05URU5UX0ZJRUxELCByZWFkZXIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCVN0cmluZyB0aXRsZSA9IHBhcnNlci5nZXRUaXRsZSgpOwotCQkJaWYgKHRpdGxlICE9IG51bGwgJiYgdGl0bGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJLy8gV29ya2Fyb3VuZCBhIExpbnV4IHNwZWNpZmljIGlzc3VlLgotCQkJCXRpdGxlID0gdGl0bGUucmVwbGFjZUFsbCgiXFx4YTAiLCAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlsdWNlbmVEb2N1bWVudC5hZGQoRmllbGQuVGV4dChUSVRMRV9GSUVMRCwgdGl0bGUpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCVN0cmluZyBzdW1tYXJ5ID0gcGFyc2VyLmdldFN1bW1hcnkoKTsKLQkJCWlmIChzdW1tYXJ5LnN0YXJ0c1dpdGgodGl0bGUpKSB7Ci0JCQkJbHVjZW5lRG9jdW1lbnQuYWRkKEZpZWxkLlVuSW5kZXhlZChTVU1NQVJZX0ZJRUxELCBzdW1tYXJ5Ci0JCQkJCQkuc3Vic3RyaW5nKHRpdGxlLmxlbmd0aCgpICsgMSkpKTsKLQkJCX0gZWxzZQotCQkJCWx1Y2VuZURvY3VtZW50LmFkZChGaWVsZC5VbkluZGV4ZWQoU1VNTUFSWV9GSUVMRCwgcGFyc2VyCi0JCQkJCQkuZ2V0U3VtbWFyeSgpKSk7Ci0KLQkJCVByb3BlcnRpZXMgbWV0YVRhZ3MgPSBwYXJzZXIuZ2V0TWV0YVRhZ3MoKTsKLQkJCWZvciAoRW51bWVyYXRpb24gbmFtZXMgPSBtZXRhVGFncy5wcm9wZXJ0eU5hbWVzKCk7IG5hbWVzCi0JCQkJCS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCQlTdHJpbmcgdGFnTmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkgewotCQkJCQlpZiAodGFnTmFtZS5lcXVhbHMoUk9MRV9GSUVMRCkpIHsKLQkJCQkJCVN0cmluZyByb2xlTmFtZSA9IG1ldGFUYWdzLmdldFByb3BlcnR5KHRhZ05hbWUpOwotCQkJCQkJaWYgKHJvbGVOYW1lICE9IG51bGwpIHsKLQkJCQkJCQlsdWNlbmVEb2N1bWVudC5hZGQoRmllbGQuVGV4dCh0YWdOYW1lLCByb2xlTmFtZSkpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJU3RyaW5nIHRhZ1ZhbHVlID0gbWV0YVRhZ3MuZ2V0UHJvcGVydHkodGFnTmFtZSk7Ci0JCQkJCQlpZiAodGFnVmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCWx1Y2VuZURvY3VtZW50LmFkZChGaWVsZC5UZXh0KHRhZ05hbWUsIHRhZ1ZhbHVlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChsdWNlbmVEb2N1bWVudC5nZXRGaWVsZChST0xFX0ZJRUxEKSA9PSBudWxsKSB7Ci0JCQkJLy8gRGVmYXVsdCB0byAibmEiIHRvIHN1cHBvcnQgc2VhcmNoaW5nIGZvciBmaWxlcyB3aXRob3V0Ci0JCQkJLy8gcm9sZSBtZXRhIHRhZ3MuCi0JCQkJbHVjZW5lRG9jdW1lbnQuYWRkKEZpZWxkLlRleHQoUk9MRV9GSUVMRCwgIk5PUlVQUk9MRSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlGaWVsZCB1bWFUeXBlRmllbGQgPSBsdWNlbmVEb2N1bWVudAotCQkJCQkuZ2V0RmllbGQoVU1BX0VMRU1FTlRfVFlQRV9GSUVMRCk7Ci0JCQlpZiAodW1hVHlwZUZpZWxkID09IG51bGwpIHsKLQkJCQkvLyBEZWZhdWx0IHRvIGdlbmVyYWwgY29udGVudC4KLQkJCQlsdWNlbmVEb2N1bWVudC5hZGQoRmllbGQuVGV4dChVTUFfRUxFTUVOVF9UWVBFX0ZJRUxELAotCQkJCQkJR0VORVJBTF9DT05URU5UKSk7Ci0JCQl9IGVsc2UgaWYgKE5PX1NFQVJDSEVBQkxFX1VNQV9FTEVNRU5UUy5jb250YWlucyh1bWFUeXBlRmllbGQKLQkJCQkJLnN0cmluZ1ZhbHVlKCkpKSB7Ci0JCQkJLy8gRXhjbHVkZSBub24tc2VhcmNoZWFibGUgZWxlbWVudHMgZnJvbSB0aGUgc2VhcmNoCi0JCQkJLy8gaW5kZXguCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXBhcnNlciA9IG51bGw7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWx1Y2VuZURvY3VtZW50ID0gbnVsbDsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZ2V0SFRNTERvY3VtZW50Iik7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGx1Y2VuZURvY3VtZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmU2YWI2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgSW5kZXhpbmcgcHJvZ3Jlc3MgbW9uaXRvcgotaW5kZXhDb25maWdGaWxlc1Rhc2tfbmFtZT1JbmRleGluZyBjb25maWd1cmF0aW9uIGZpbGVzLi4uCi0KLSMgRXJyb3IgRGV0YWlscwotY3JlYXRlU2VhcmNoSW5kZXhFcnJvcj1UaGUgc2VhcmNoIGluZGV4IGZpbGUgd2FzIG5vdCBjcmVhdGVkLgotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hDb25maWd1cmF0aW9uRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2OTJhOTFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hDb25maWd1cmF0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoOwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIHNlYXJjaCBjb25maWd1cmF0aW9uIG9wZXJhdGlvbiBoYXMgZmFpbGVkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY1Mzc0MDUyMTE0NTExNzcxMTBMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VhcmNoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTZWFyY2hDb25maWd1cmF0aW9uRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIocm9vdENhdXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgU2VhcmNoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbiBhbmQgdGhlCi0JICogZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBTZWFyY2hDb25maWd1cmF0aW9uRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UsIFN0cmluZyBlcnJvck1zZykgewotCQlzdXBlcihyb290Q2F1c2UsIGVycm9yTXNnKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDliNmVhYjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBTZWFyY2ggcGx1Zy1pbiBhY3RpdmF0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2VhcmNoUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFNlYXJjaFBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWFyY2hQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTZWFyY2hQbHVnaW4gZ2V0RGVmYXVsdCgpIHsJCi0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoUmVzb3VyY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxYjdiNzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIFNlYXJjaCByZXNvdXJjZSBidW5kbGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2VhcmNoUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IFNlYXJjaFJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmRleENvbmZpZ0ZpbGVzVGFza19uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVNlYXJjaEluZGV4RXJyb3I7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBTZWFyY2hSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgU2VhcmNoUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoU2VydmljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTA2YmUyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuV2FyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlppcFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IaXRFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uU2VhcmNoU2VydmljZTsKLQotCi0vKioKLSAqIFRoZSBTZWFyY2ggU2VydmljZSBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hTZXJ2aWNlIGltcGxlbWVudHMgSVNlYXJjaFNlcnZpY2UgewotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBTZWFyY2hTZXJ2aWNlIGluc3RhbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlYXJjaFNlcnZpY2UgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKFNlYXJjaFNlcnZpY2UuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBTZWFyY2hTZXJ2aWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4KLQkgKi8KLQlwcml2YXRlIFNlYXJjaFNlcnZpY2UoKSB7Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoZXMgYSBwdWJsaXNoZWQgQ29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHNlYXJjaFF1ZXJ5Ci0JICogICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBzZWFyY2ggcXVlcnkKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPkNvbmZpZ3VyYXRpb25IaXRFbnRyeTwvY29kZT4gb2JqZWN0cwotCSAqIEB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uSGl0RW50cnlbXSBzZWFyY2hDb25maWd1cmF0aW9uKFN0cmluZyBwYXRoLAotCQkJQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5IHNlYXJjaFF1ZXJ5KSB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0JCUNvbmZpZ3VyYXRpb25TZWFyY2hTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQ29uZmlndXJhdGlvblNlYXJjaFNlcnZpY2UoCi0JCQkJcGF0aCk7Ci0JCXNlcnZpY2UuaW5kZXgoKTsKLQkJcmV0dXJuIHNlcnZpY2Uuc2VhcmNoKHNlYXJjaFF1ZXJ5KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY3JlYXRlSW5kZXgoU3RyaW5nIHB1Ymxpc2hEaXIpIHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJSW5kZXhCdWlsZGVyIHNlcnZpY2UgPSBuZXcgSW5kZXhCdWlsZGVyKHB1Ymxpc2hEaXIpOwotCQlyZXR1cm4gc2VydmljZS5jcmVhdGVJbmRleCh0cnVlKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY3JlYXRlSW5kZXgoU3RyaW5nIHB1Ymxpc2hEaXIsIGJvb2xlYW4gamFySXQpIHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJSW5kZXhCdWlsZGVyIHNlcnZpY2UgPSBuZXcgSW5kZXhCdWlsZGVyKHB1Ymxpc2hEaXIpOwotCQlyZXR1cm4gc2VydmljZS5jcmVhdGVJbmRleChqYXJJdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZVdBUihTdHJpbmcgcHVibGlzaERpciwgU3RyaW5nIHdlYkFwcE5hbWUpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZ0J1ZmZlciBkaXIyd2FyID0gbmV3IFN0cmluZ0J1ZmZlcigocHVibGlzaERpci5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpID8gCi0JCQkJCXB1Ymxpc2hEaXIuc3Vic3RyaW5nKDAsIHB1Ymxpc2hEaXIubGVuZ3RoKCktMSkgOgotCQkJCQkJcHVibGlzaERpcik7Ci0JCQkKLQkJCWRpcjJ3YXIuYXBwZW5kKCJfV0FSIikuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKTsKLQkJCUZpbGUgd2FyRGlyID0gbmV3IEZpbGUoZGlyMndhci50b1N0cmluZygpKTsKLQkJCWlmICghd2FyRGlyLmV4aXN0cygpKSB7Ci0JCQkJd2FyRGlyLm1rZGlycygpOwotCQkJfSBlbHNlIHsKLQkJCQlGaWxlVXRpbC5kZWxldGVBbGxGaWxlcyh3YXJEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJfQotCQkJCi0JCQlTdHJpbmcgd2FyRmlsZSA9IGRpcjJ3YXIuYXBwZW5kKHdlYkFwcE5hbWUpLmFwcGVuZCgiLndhciIpLnRvU3RyaW5nKCk7Ci0JCQkJCi0JCQlXYXJVdGlsLmJ1aWxkV2FyRmlsZSh3YXJGaWxlLCBwdWJsaXNoRGlyLCBudWxsKTsKLQkJfSBjYXRjaChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoU2VydmljZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFNlcnZpY2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTI1YTJjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoU2VydmljZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaDsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYSBTZWFyY2ggU2VydmljZSBvcGVyYXRpb24gaGFzIGZhaWxlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC05MDYzMzAyMTgwODY5MTU3MzE2TDsKLQotCS8qKgotCSAqIFRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIFRocm93YWJsZSByb290Q2F1c2U7Ci0KLQkvKioKLQkgKiBUaGUgZXJyb3IgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTXNnOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VhcmNoU2VydmljZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJdGhpcyhyb290Q2F1c2UsIHJvb3RDYXVzZS5nZXRNZXNzYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZykgewotCQl0aGlzKG51bGwsIGVycm9yTXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24gYW5kIHRoZQotCSAqIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgU2VhcmNoU2VydmljZUV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlLCBTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yb290Q2F1c2UgPSByb290Q2F1c2U7Ci0JCXRoaXMuZXJyb3JNc2cgPSBlcnJvck1zZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIFRocm93YWJsZSBnZXRSb290Q2F1c2UoKSB7Ci0JCXJldHVybiByb290Q2F1c2U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1N0b3BXb3Jkcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1N0b3BXb3Jkcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDVmYTJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBTZWFyY2ggU3RvcCBXb3JkcwotU2VhcmNoLnN0b3BXb3Jkcz1cCi1hLCBhYm91dCwgYW4sIGFuZCwgYXJlLCBhcywgYXQsIGJlLCBidXQsIGJ5LCBmb3IsIGZyb20sIGhvdywgXAotaSwgaWYsIGluLCBpbnRvLCBpcywgaXQsIG5vLCBub3QsIG9mLCBvbiwgb3IsIHMsIHN1Y2gsIFwKLXQsIHRoYXQsIHRoZSwgdGhlaXIsIHRoZW4sIHRoZXJlLCB0aGVzZSwgdGhleSwgdGhpcywgdG8sIFwKLXdhcywgd2hhdCwgd2hlbiwgd2hlcmUsIHdobywgd2lsbCwgd2l0aAotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9UZXh0QW5hbHl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9UZXh0QW5hbHl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWU4MDNlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvVGV4dEFuYWx5emVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmFuYWx5c2lzOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5BbmFseXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlblN0cmVhbTsKLQotLyoqCi0gKiBBIHRleHQgYW5hbHl6ZXIgdGhhdCBoYW5kbGVzIFVuaWNvZGUgNC4xIGNoYXJhY3RlcnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGV4dEFuYWx5emVyIGV4dGVuZHMgQW5hbHl6ZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGV4dEFuYWx5emVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuQW5hbHl6ZXIjdG9rZW5TdHJlYW0oU3RyaW5nLCBSZWFkZXIpCi0JICovCi0JcHVibGljIGZpbmFsIFRva2VuU3RyZWFtIHRva2VuU3RyZWFtKFN0cmluZyBmaWVsZE5hbWUsIFJlYWRlciByZWFkZXIpIHsKLQkJVG9rZW5TdHJlYW0gcmVzdWx0ID0gbmV3IFRleHRUb2tlbml6ZXIocmVhZGVyKTsKLQkJcmV0dXJuIG5ldyBUZXh0RmlsdGVyKHJlc3VsdCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1RleHRGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9UZXh0RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxOWRkZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1RleHRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guYW5hbHlzaXM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuU3RvcEFuYWx5emVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlN0b3BGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuVG9rZW5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuVG9rZW5TdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotCi0vKioKLSAqIEEgdGV4dCBmaWx0ZXIgdGhhdCBoYW5kbGVzIFVuaWNvZGUgNC4xIGNoYXJhY3RlcnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGV4dEZpbHRlciBleHRlbmRzIFRva2VuRmlsdGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFNldCBzdG9wV29yZHMgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGV4dEZpbHRlcihUb2tlblN0cmVhbSBpbikgewotCQlzdXBlcihpbik7Ci0JCWlmIChzdG9wV29yZHMgPT0gbnVsbCkgewotCQkJbG9hZFN0b3BXb3JkcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlblN0cmVhbSNuZXh0KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgVG9rZW4gbmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZvciAoVG9rZW4gdG9rZW4gPSBpbnB1dC5uZXh0KCk7IHRva2VuICE9IG51bGw7IHRva2VuID0gaW5wdXQubmV4dCgpKSB7Ci0JCQlTdHJpbmcgdG9rZW5UZXh0ID0gdG9rZW4udGVybVRleHQoKTsKLQkJCWlmICghc3RvcFdvcmRzLmNvbnRhaW5zKHRva2VuVGV4dCkpIHsKLQkJCQlyZXR1cm4gdG9rZW47Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgdGhlIHN0b3Agd29yZHMgZGVmaW5lZCBpbiB0aGUgU3RvcFdvcmRzLnByb3BlcnRpZXMgZmlsZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFN0b3BXb3JkcygpIHsKLQkJU3RyaW5nW10gd29yZHMgPSBudWxsOwotCQl0cnkgewotCQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFRleHRGaWx0ZXIuY2xhc3MKLQkJCQkJLmdldFBhY2thZ2UoKS5nZXROYW1lKCkKLQkJCQkJKyAiLlN0b3BXb3JkcyIpOyAvLyROT04tTkxTLTEkCQkJCQotCQkJU3RyaW5nIHByb3BlcnR5ID0gYnVuZGxlLmdldFN0cmluZygiU2VhcmNoLnN0b3BXb3JkcyIpOyAvLyROT04tTkxTLTEkCi0JCQl3b3JkcyA9IFN0clV0aWwuc3BsaXQocHJvcGVydHksICIgLCIpOyAvLyROT04tTkxTLTEkCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXdvcmRzID0gU3RvcEFuYWx5emVyLkVOR0xJU0hfU1RPUF9XT1JEUzsKLQkJfQotCQlzdG9wV29yZHMgPSBTdG9wRmlsdGVyLm1ha2VTdG9wU2V0KHdvcmRzKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvVGV4dFRva2VuaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1RleHRUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTVmMzM1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvVGV4dFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5hbmFseXNpczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlbml6ZXI7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkJyZWFrSXRlcmF0b3I7Ci0KLS8qKgotICogQSB0ZXh0IHRva2VuaXplciB0aGF0IHVzZXMgSUNVNEogdG8gc2VnbWVudCB0ZXh0IGludG8gd29yZHMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGV4dFRva2VuaXplciBleHRlbmRzIFRva2VuaXplciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkUgPSA0MDk2OwotCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQotCXByaXZhdGUgQnJlYWtJdGVyYXRvciBpdGVyYXRvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHJlYWRlcgotCSAqICAgICAgICAgICAgdGhlIHRleHQgc291cmNlCi0JICovCi0JcHVibGljIFRleHRUb2tlbml6ZXIoUmVhZGVyIHJlYWRlcikgewotCQlzdXBlcihyZWFkZXIpOwotCQlTdHJpbmdCdWZmZXIgdGV4dEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoQlVGRkVSX1NJWkUpOwotCQljaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbQlVGRkVSX1NJWkVdOwotCQlpbnQgY2hhcnNSZWFkOwotCQl0cnkgewotCQkJd2hpbGUgKChjaGFyc1JlYWQgPSByZWFkZXIucmVhZChidWZmZXIsIDAsIEJVRkZFUl9TSVpFKSkgPiAwKSB7Ci0JCQkJdGV4dEJ1ZmZlci5hcHBlbmQoYnVmZmVyLCAwLCBjaGFyc1JlYWQpOwotCQkJfQotCQkJdGV4dCA9IHRleHRCdWZmZXIudG9TdHJpbmcoKTsKLQkJCWl0ZXJhdG9yID0gQnJlYWtJdGVyYXRvci5nZXRXb3JkSW5zdGFuY2UoKTsKLQkJCWl0ZXJhdG9yLnNldFRleHQodGV4dCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWl0ZXJhdG9yID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuVG9rZW5TdHJlYW0jbmV4dCgpCi0JICovCi0JcHVibGljIGZpbmFsIFRva2VuIG5leHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXRlcmF0b3IgIT0gbnVsbCkgewotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlpbnQgc3RhcnQgPSBpdGVyYXRvci5jdXJyZW50KCk7Ci0JCQkJaW50IGVuZCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoZW5kICE9IEJyZWFrSXRlcmF0b3IuRE9ORSkgewotCQkJCQlTdHJpbmcgdG9rZW5UZXh0ID0gdGV4dC5zdWJzdHJpbmcoc3RhcnQsIGVuZCkudG9Mb3dlckNhc2UoKTsKLQkJCQkJaWYgKCF0b2tlblRleHQuZXF1YWxzKCIgIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKHRva2VuVGV4dC5lbmRzV2l0aCgiJ3MiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJdG9rZW5UZXh0ID0gdG9rZW5UZXh0LnN1YnN0cmluZygwLCB0b2tlblRleHQKLQkJCQkJCQkJCS5sZW5ndGgoKSAtIDIpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIG5ldyBUb2tlbih0b2tlblRleHQsIDAsIHRva2VuVGV4dC5sZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ0ZjQyZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSB0ZXh0IGFuYWx5c2VyLCB0b2tlbml6ZXIgYW5kIGZpbHRlciBmb3IgaW5kZXhpbmcgYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uSGl0RW50cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25IaXRFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNzQ4MTUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25IaXRFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBBIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIHNlYXJjaCBoaXQgZW50cnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkhpdEVudHJ5IHsKLQotCXByaXZhdGUgU3RyaW5nIGlkOwotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgU3RyaW5nIHR5cGU7Ci0KLQlwcml2YXRlIFN0cmluZyBicmllZkRlc2M7Ci0KLQlwcml2YXRlIFN0cmluZyB1cmw7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJRC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBJRC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIHRoZSBpZCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUuCi0JICogCi0JICogQHJldHVybiB0aGUgdHlwZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHR5cGUuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBicmVpZiBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBicmllZiBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QnJpZWZEZXNjKCkgewotCQlyZXR1cm4gYnJpZWZEZXNjOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBicmllZkRlc2MKLQkgKiAgICAgICAgICAgIHRoZSBicmllZiBkZXNjcmlwdGlvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCcmllZkRlc2MoU3RyaW5nIGJyaWVmRGVzYykgewotCQl0aGlzLmJyaWVmRGVzYyA9IGJyaWVmRGVzYzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkwuCi0JICogCi0JICogQHJldHVybiB0aGUgVVJMCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVcmwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgVVJMLgotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIHRoZSBVUkwgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyB1cmwpIHsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uU2VhcmNoUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2ZmZjRkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uU2VhcmNoUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi0vKioKLSAqIFRoZSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiBzZWFyY2ggcXVlcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5IHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDQVRFR09SWV9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FURUdPUllfQlJJRUZfREVTQyA9ICJicmllZkRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENBVEVHT1JZX0ZVTExfREVTQyA9ICJmdWxsRGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FURUdPUllfVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBIYXNodGFibGUgcXVlcnk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uU2VhcmNoUXVlcnkoKSB7Ci0JCXF1ZXJ5ID0gbmV3IEhhc2h0YWJsZSgpOwotCQlxdWVyeS5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlYXJjaCBxdWVyeSBzdHJpbmcuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VhcmNoIHF1ZXJ5IHN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlTdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJRW51bWVyYXRpb24ga2V5cyA9IHF1ZXJ5LmtleXMoKTsKLQotCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGtleXMubmV4dEVsZW1lbnQoKTsKLQkJCXNiLmFwcGVuZChrZXkgKyAiOigiICsgcXVlcnkuZ2V0KGtleSkgKyAiKSAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpZiAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCXNiLmFwcGVuZCgiQU5EICIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VGVybShTdHJpbmcgdGVybSwgU3RyaW5nIGNyaXQpIHsKLQkJcXVlcnkucHV0KGNyaXQsIHRlcm0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJc2V0VGVybSh0eXBlLCBDQVRFR09SWV9UWVBFKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXNldFRlcm0obmFtZSwgQ0FURUdPUllfTkFNRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QnJpZWZEZXNjKFN0cmluZyBkZXNjKSB7Ci0JCXNldFRlcm0oZGVzYywgQ0FURUdPUllfQlJJRUZfREVTQyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RnVsbERlc2MoU3RyaW5nIGRlc2MpIHsKLQkJc2V0VGVybShkZXNjLCBDQVRFR09SWV9GVUxMX0RFU0MpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL2ludGVybmFsL0NvbmZpZ3VyYXRpb25TZWFyY2hTZXJ2aWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9pbnRlcm5hbC9Db25maWd1cmF0aW9uU2VhcmNoU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZGIxZmRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL2ludGVybmFsL0NvbmZpZ3VyYXRpb25TZWFyY2hTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5jb25maWd1cmF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRGF0ZUZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJ5UGFyc2VyLlF1ZXJ5UGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5IaXRzOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5JbmRleFNlYXJjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5RdWVyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guU2VhcmNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5odG1sLkhUTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5HZW5lcmF0ZVNlYXJjaEluZGV4RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guU2VhcmNoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLlNlYXJjaFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLlNlYXJjaFNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5hbmFseXNpcy5UZXh0QW5hbHl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IaXRFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5OwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBzZWFyY2hpbmcgYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uU2VhcmNoU2VydmljZSB7Ci0KLQkvKioKLQkgKiBEb2N1bWVudCBmaWVsZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJRUZfREVTQ1JJUFRJT05fRklFTEQgPSAiYnJpZWZEZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRklFTEQgPSAiY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0ZJRUxEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ESUZJRURfRklFTEQgPSAibW9kaWZpZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0ZJRUxEID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX0ZJRUxEID0gInJvbGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVU1NQVJZX0ZJRUxEID0gInN1bW1hcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0ZJRUxEID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRklFTEQgPSAidXJsIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIEhUTUwgcGFyc2VyLgotCXByaXZhdGUgSFRNTFBhcnNlciBwYXJzZXI7Ci0KLQkvLyBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGRvY3VtZW50cyB0byBiZSBpbmRleGVkLgotCXByaXZhdGUgU3RyaW5nIGRvY0RpciA9IG51bGw7Ci0KLQkvLyBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBpbmRleCBmaWxlcyB3aWxsIGJlIGdlbmVyYXRlZC4KLQlwcml2YXRlIFN0cmluZyBpbmRleERpciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBkb2NEaXIKLQkgKiAgICAgICAgICAgIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblNlYXJjaFNlcnZpY2UoU3RyaW5nIGRvY0RpcikgewotCQlTdHJpbmcgdXNlckhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpOyAvLyROT04tTkxTLTEkCi0JCWludCBoYXNoQ29kZSA9IE1hdGguYWJzKGRvY0Rpci5oYXNoQ29kZSgpKTsKLQkJU3RyaW5nIGluZGV4UGF0aCA9IHVzZXJIb21lICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkrICJydXAiICsgRmlsZS5zZXBhcmF0b3IgKyBoYXNoQ29kZSArIEZpbGUuc2VwYXJhdG9yICsgImluZGV4IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNldERpcnMoZG9jRGlyLCBpbmRleFBhdGgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGRvY0RpcgotCSAqICAgICAgICAgICAgdGhlIGFic29sdXRlIHBhdGggdG8gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBpbmRleERpcgotCSAqICAgICAgICAgICAgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGluZGV4ZXMKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblNlYXJjaFNlcnZpY2UoU3RyaW5nIGRvY0RpciwgU3RyaW5nIGluZGV4RGlyKSB7Ci0JCXNldERpcnMoZG9jRGlyLCBpbmRleERpcik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgY29uZmlndXJhdGlvbiBhbmQgaW5kZXggZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBkb2NEaXIKLQkgKiAgICAgICAgICAgIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gaW5kZXhEaXIKLQkgKiAgICAgICAgICAgIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBpbmRleGVzCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlycyhTdHJpbmcgZG9jRGlyLCBTdHJpbmcgaW5kZXhEaXIpIHsKLQkJdGhpcy5kb2NEaXIgPSBkb2NEaXI7Ci0JCXRoaXMuaW5kZXhEaXIgPSBpbmRleERpcjsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyBhIHNlYXJjaCBiYXNlZCBvbiB0aGUgZ2l2ZW4gc2VhcmNoIHF1ZXJ5LgotCSAqIAotCSAqIEBwYXJhbSBxdWVyeQotCSAqICAgICAgICAgICAgdGhlIHNlYXJjaCBxdWVyeSBzdHJpbmcKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPkNvbmZpZ3VyYXRpb25IaXRFbnRyeTwvY29kZT4gb2JqZWN0cwotCSAqIEB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uSGl0RW50cnlbXSBzZWFyY2goQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5IHF1ZXJ5KQotCQkJdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gewotCQlyZXR1cm4gc2VhcmNoKHF1ZXJ5LmdldFF1ZXJ5U3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIGEgc2VhcmNoIG9uIHRoZSBnaXZlbiBxdWVyeSBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHFzdHIKLQkgKiAgICAgICAgICAgIGEgTHVjZW5lIGNvbXBhdGlibGUgcXVlcnkgc3RyaW5nCi0JICogQHJldHVybiBhbiBhcnJheSBvZiA8Y29kZT5Db25maWd1cmF0aW9uSGl0RW50cnk8L2NvZGU+IG9iamVjdHMKLQkgKiBAdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkhpdEVudHJ5W10gc2VhcmNoKFN0cmluZyBxc3RyKQotCQkJdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gewotCQlTZWFyY2hlciBzZWFyY2hlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzZWFyY2hlciA9IG5ldyBJbmRleFNlYXJjaGVyKGluZGV4RGlyKTsKLQkJCVF1ZXJ5IHF1ZXJ5ID0gUXVlcnlQYXJzZXIucGFyc2UocXN0ciwgQ09OVEVOVF9GSUVMRCwKLQkJCQkJbmV3IFRleHRBbmFseXplcigpKTsKLQotCQkJSGl0cyBsaGl0cyA9IHNlYXJjaGVyLnNlYXJjaChxdWVyeSk7Ci0JCQlDb25maWd1cmF0aW9uSGl0RW50cnlbXSBoaXRzID0gbmV3IENvbmZpZ3VyYXRpb25IaXRFbnRyeVtsaGl0cwotCQkJCQkubGVuZ3RoKCldOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhpdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlEb2N1bWVudCBkb2MgPSBsaGl0cy5kb2MoaSk7Ci0JCQkJaGl0c1tpXSA9IG5ldyBDb25maWd1cmF0aW9uSGl0RW50cnkoKTsKLQkJCQloaXRzW2ldLnNldE5hbWUoZG9jLmdldChOQU1FX0ZJRUxEKSk7Ci0JCQkJaGl0c1tpXS5zZXRVcmwoZG9jLmdldChVUkxfRklFTEQpKTsKLQkJCQloaXRzW2ldLnNldEJyaWVmRGVzYyhkb2MuZ2V0KEJSSUVGX0RFU0NSSVBUSU9OX0ZJRUxEKSk7Ci0JCQkJaGl0c1tpXS5zZXRJZChkb2MuZ2V0KElEX0ZJRUxEKSk7Ci0JCQkJaGl0c1tpXS5zZXRUeXBlKGRvYy5nZXQoVFlQRV9GSUVMRCkpOwotCQkJfQotCQkJcmV0dXJuIGhpdHM7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgU2VhcmNoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChzZWFyY2hlciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc2VhcmNoZXIuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIG9mIHRoZSBpbmRleCBkYXRhYmFzZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBpbmRleCBkYXRhYmFzZSBhbHJlYWR5IGV4aXN0cwotCSAqLwotCXB1YmxpYyBib29sZWFuIGluZGV4RXhpc3RzKCkgewotCQlGaWxlW10gZmlsZXMgPSBuZXcgRmlsZShpbmRleERpcikubGlzdEZpbGVzKCk7Ci0JCXJldHVybiAoZmlsZXMgIT0gbnVsbCAmJiBmaWxlcy5sZW5ndGggIT0gMCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgc2VhcmNoIGluZGV4LgotCSAqIAotCSAqIEB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGluZGV4KCkgdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gewotCQlpbmRleChudWxsLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgc2VhcmNoIGluZGV4LgotCSAqIAotCSAqIEBwYXJhbSByZWluZGV4Ci0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcGVyZm9ybXMgYSByZWluZGV4Ci0JICogQHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgaW5kZXgoYm9vbGVhbiByZWluZGV4KSB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0JCWluZGV4KG51bGwsIHJlaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGluZGV4IGRhdGFiYXNlLgotCSAqIAotCSAqIEBwYXJhbSBwbQotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHBhcmFtIHJlaW5kZXgKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwZXJmb3JtcyBhIHJlaW5kZXgKLQkgKiBAdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbmRleChJUHJvZ3Jlc3NNb25pdG9yIHBtLCBib29sZWFuIHJlaW5kZXgpCi0JCQl0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAoQ29uZmlndXJhdGlvblNlYXJjaFNlcnZpY2UuY2xhc3MpIHsKLQkJCWlmIChpbmRleERpciA9PSBudWxsIHx8IGRvY0RpciA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW52YWxpZCBpbmRleERpciBvciBkb2NEaXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAoIXJlaW5kZXggJiYgaW5kZXhFeGlzdHMoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKHBtICE9IG51bGwpIHsKLQkJCQlwbS5iZWdpblRhc2soU2VhcmNoUmVzb3VyY2VzLmluZGV4Q29uZmlnRmlsZXNUYXNrX25hbWUsCi0JCQkJCQlnZXRUb3RhbERvY3NUb0luZGV4KGRvY0RpcikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJZGVsZXRlQWxsSW5kZXhEaXJzKCk7Ci0JCQkJbmV3IEZpbGUoaW5kZXhEaXIpLm1rZGlycygpOwotCQkJCUluZGV4V3JpdGVyIHdyaXRlciA9IG5ldyBJbmRleFdyaXRlcihpbmRleERpciwKLQkJCQkJCW5ldyBUZXh0QW5hbHl6ZXIoKSwgdHJ1ZSk7Ci0JCQkJd3JpdGVyLm1heEZpZWxkTGVuZ3RoID0gMTAwMDAwMDsKLQkJCQlwYXJzZXIgPSBuZXcgSFRNTFBhcnNlcigpOwotCQkJCWluZGV4RG9jcyhuZXcgRmlsZShkb2NEaXIpLCB3cml0ZXIsIHBtKTsKLQkJCQl3cml0ZXIub3B0aW1pemUoKTsKLQkJCQl3cml0ZXIuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IEdlbmVyYXRlU2VhcmNoSW5kZXhFeGNlcHRpb24oZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChwbSAhPSBudWxsKSB7Ci0JCQkJCXBtLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWxldGVzIGFsbCBleGlzdGluZyBpbmRleCBkYXRhYmFzZXMuCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlQWxsSW5kZXhEaXJzKCkgewotCQlGaWxlIHBhcmVudCA9IG5ldyBGaWxlKGluZGV4RGlyKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCUZpbGVbXSBmaWxlcyA9IHBhcmVudC5saXN0RmlsZXMoKTsKLQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZmlsZXNbaV0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImluZGV4IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlGaWxlW10gZmlsZSA9IGZpbGVzW2ldLmxpc3RGaWxlcygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGZpbGUubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWZpbGVbal0uZGVsZXRlKCk7Ci0JCQkJCX0KLQkJCQkJZmlsZXNbaV0uZGVsZXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGZpbGVzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgc2VhcmNoIGluZGV4LgotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiAgICAgICAgICAgIHRoZSBkaXJlY3RvcnkgbmFtZQotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlcyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNlYXJjaCBpbmRleCwKLQkgKiAgICAgICAgIGluY2x1ZGluZyBhbGwgc3ViLWRpcmVjdG9yaWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VG90YWxEb2NzVG9JbmRleChTdHJpbmcgZGlyKSB7Ci0JCWludCB0b3RhbCA9IDA7Ci0JCUZpbGUgZGlyRmlsZSA9IG5ldyBGaWxlKGRpcik7Ci0JCUZpbGUgZmlsZXNbXSA9IGRpckZpbGUubGlzdEZpbGVzKCk7Ci0JCWlmIChmaWxlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdG90YWw7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGlzWE1JRG9jKGZpbGVzW2ldKSkgewotCQkJCXRvdGFsKys7Ci0JCQl9IGVsc2UgaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQl0b3RhbCArPSBnZXRUb3RhbERvY3NUb0luZGV4KGZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdG90YWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIG5lZWRzIHRvIGJlIGluZGV4ZWQuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIGJlIHZlcmlmaWVkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmlsZSBuZWVkcyB0byBiZSBpbmRleGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1hNSURvYyhGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGZpbGUuZ2V0UGF0aCgpLmVuZHNXaXRoKCIueG1pIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgbmVlZHMgdG8gYmUgaW5kZXhlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gYmUgdmVyaWZpZWQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmaWxlIG5lZWRzIHRvIGJlIGluZGV4ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSHRtbE9yVGV4dERvYyhGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIHBhdGggPSBmaWxlLmdldFBhdGgoKTsKLQkJcmV0dXJuIHBhdGguZW5kc1dpdGgoIi5odG1sIikgfHwgcGF0aC5lbmRzV2l0aCgiLmh0bSIpIHx8IHBhdGguZW5kc1dpdGgoIi50eHQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQkvKioKLQkgKiBBIHJlY3Vyc2l2ZSBmdW5jdGlvbiB0byBpbmRleCBmaWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgYSBkaXJlY3Rvcnkgb3IgZmlsZSB0byBiZSBpbmRleGVkCi0JICogQHBhcmFtIHdyaXRlcgotCSAqICAgICAgICAgICAgdGhlIGluZGV4IHdyaXRlcgotCSAqIEBwYXJhbSBwbQotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5kZXhEb2NzKEZpbGUgZmlsZSwgSW5kZXhXcml0ZXIgd3JpdGVyLCBJUHJvZ3Jlc3NNb25pdG9yIHBtKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCWlmIChmaWxlLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJhcHBsZXQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nW10gZmlsZXMgPSBmaWxlLmxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbmRleERvY3MobmV3IEZpbGUoZmlsZSwgZmlsZXNbaV0pLCB3cml0ZXIsIHBtKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChpc0h0bWxPclRleHREb2MoZmlsZSkpIHsKLQkJCWlmIChwbSAhPSBudWxsKSB7Ci0JCQkJcG0uc3ViVGFzayhmaWxlLmdldE5hbWUoKSk7Ci0JCQkJcG0ud29ya2VkKDEpOwotCQkJfQotCQkJaWYgKHNob3VsZEJlRXhjbHVkZWQoZmlsZSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlEb2N1bWVudCBkb2MgPSBnZXRIVE1MRG9jdW1lbnQoZmlsZSk7Ci0JCQl3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPG9jZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbGUgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gaW5kZXhpbmcuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIGEgZmlsZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbGUgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gaW5kZXhpbmcKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRCZUV4Y2x1ZGVkKEZpbGUgZmlsZSkgewotCQlTdHJpbmcgcCA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQlyZXR1cm4gZG9jRGlyLnN0YXJ0c1dpdGgocCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZG9jdW1lbnQgb2JqZWN0IG9mIGEgSFRNTCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICB0aGUgSFRNTCBmaWxlIHRvIGJlIGluZGV4ZWQKLQkgKiBAcmV0dXJuIGEgZG9jdW1lbnQgb2JqZWN0Ci0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgcGFyc2luZyB0aGUgSFRNTCBmaWxlCi0JICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBvcGVyYXRpb24gaXMgaW50ZXJydXB0ZWQgYnkgYSB1c2VyCi0JICovCi0JcHVibGljIERvY3VtZW50IGdldEhUTUxEb2N1bWVudChGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwKLQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0JCWRvYy5hZGQoRmllbGQuVW5JbmRleGVkKFVSTF9GSUVMRCwgZmlsZS5nZXRQYXRoKCkucmVwbGFjZSgKLQkJCQlGaWxlLnBhdGhTZXBhcmF0b3JDaGFyLCAnLycpKSk7Ci0JCWRvYy5hZGQoRmllbGQuS2V5d29yZChNT0RJRklFRF9GSUVMRCwgRGF0ZUZpZWxkLnRpbWVUb1N0cmluZyhmaWxlCi0JCQkJLmxhc3RNb2RpZmllZCgpKSkpOwotCi0JCXRyeSB7Ci0JCQlwYXJzZXIucGFyc2UoZmlsZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlkb2MuYWRkKEZpZWxkLlRleHQoQ09OVEVOVF9GSUVMRCwgcGFyc2VyLmdldFRleHQoKSkpOwotCQlkb2MuYWRkKEZpZWxkLlVuSW5kZXhlZChTVU1NQVJZX0ZJRUxELCBwYXJzZXIuZ2V0U3VtbWFyeSgpKSk7Ci0KLQkJUHJvcGVydGllcyBtZXRhVGFncyA9IHBhcnNlci5nZXRNZXRhVGFncygpOwotCQlmb3IgKEVudW1lcmF0aW9uIGUgPSBtZXRhVGFncy5wcm9wZXJ0eU5hbWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLQkJCWRvYy5hZGQoRmllbGQuVGV4dCh0YWdOYW1lLCBtZXRhVGFncy5nZXRQcm9wZXJ0eSh0YWdOYW1lKSkpOwotCQl9Ci0KLQkJaWYgKGRvYy5nZXRGaWVsZChST0xFX0ZJRUxEKSA9PSBudWxsKSB7Ci0JCQlkb2MuYWRkKEZpZWxkLlRleHQoUk9MRV9GSUVMRCwgIk5PUlVQUk9MRSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJlMDdhYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vaW50ZXJuYWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBzZWFyY2hpbmcgYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFkN2M0YjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3Igc2VhcmNoaW5nIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwZmNhOTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciB0aGUgc2VhcmNoIHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3V0aWxzL0phckNyZWF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91dGlscy9KYXJDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiMTU3ZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3V0aWxzL0phckNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL0NvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy9hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vL0NvbnRyaWJ1dG9yczoKLS8vSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgSmFyQ3JlYXRvciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFWF9KQVIgPSAiaW5kZXguamFyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlqYXJGb2xkZXIoYXJnc1swXSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGphckZvbGRlcihTdHJpbmcgZm9sZGVybmFtZSkgewotCQl0cnkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJhdHRlbXB0aW5nIHRvIGphciBzdHVmZiIpOyAvLyROT04tTkxTLTEkCi0JCQlGaWxlIGphckRpciA9IG5ldyBGaWxlKGZvbGRlcm5hbWUpOwotCQkJRmlsZSBqYXJGaWxlID0gbmV3IEZpbGUoZm9sZGVybmFtZSArIEZpbGUuc2VwYXJhdG9yICsgSU5ERVhfSkFSKTsKLQotCQkJamFyRmlsZXMoamFyRGlyLCBqYXJGaWxlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiBpbiB0aGUgamFyIHRoaW5neSIpOyAvLyROT04tTkxTLTEkCi0JCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIG1ldGhvZCB0byBqYXIgdGhlIHNwZWNpZmllZCBkaXIgaW50byBhIGphciBmaWxlLiBub24tc3ViLWZvbGRlcnMgd2lsbCBiZQotCSAqIGphcmVkLgotCSAqIAotCSAqIEBwYXJhbSBqYXJEaXIKLQkgKiBAcGFyYW0gamFyRmlsZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgamFyRmlsZXMoRmlsZSBqYXJEaXIsIEZpbGUgamFyRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZVtdIGZpbGVzID0gamFyRGlyLmxpc3RGaWxlcygpOwotCQlpZiAoamFyRmlsZS5leGlzdHMoKSkgewotCQkJamFyRmlsZS5kZWxldGUoKTsKLQkJfQotCQlCdWZmZXJlZE91dHB1dFN0cmVhbSBiU3RyZWFtID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKAotCQkJCWphckZpbGUpKTsKLQkJWmlwT3V0cHV0U3RyZWFtIHppcHBlclN0cmVhbSA9IG5ldyBaaXBPdXRwdXRTdHJlYW0oYlN0cmVhbSk7Ci0KLQkJYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbNDA5Nl07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGUgY3VycmVudEZpbGUgPSBmaWxlc1tpXTsKLQkJCWlmIChjdXJyZW50RmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlaaXBFbnRyeSBjdXJyRW50cnkgPSBuZXcgWmlwRW50cnkoY3VycmVudEZpbGUuZ2V0TmFtZSgpKTsKLQkJCXppcHBlclN0cmVhbS5wdXROZXh0RW50cnkoY3VyckVudHJ5KTsKLQkJCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gYmlTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKAotCQkJCQljdXJyZW50RmlsZSkpOwotCQkJd2hpbGUgKGJpU3RyZWFtLmF2YWlsYWJsZSgpID4gMCkgewotCQkJCWludCBudW0gPSBiaVN0cmVhbS5yZWFkKGJ5dGVzKTsKLQkJCQl6aXBwZXJTdHJlYW0ud3JpdGUoYnl0ZXMsIDAsIG51bSk7Ci0JCQl9Ci0JCQliaVN0cmVhbS5jbG9zZSgpOwotCQkJemlwcGVyU3RyZWFtLmNsb3NlRW50cnkoKTsKLQkJfQotCQl6aXBwZXJTdHJlYW0uY2xvc2UoKTsKLQkJYlN0cmVhbS5jbG9zZSgpOwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdXRpbHMvTEhUTUxQYXJzZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91dGlscy9MSFRNTFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NjY5YjE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91dGlscy9MSFRNTFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotLyoqCi0gKiBBIEhUTUwgcGFyc2VyIHVzZWQgZm9yIGV4dHJhY3RpbmcgdGhlIG1ldGEgdGFncyBhbmQgdGV4dCBmcm9tIGEgSFRNTAotICogZG9jdW1lbnQuCi0gKiAKLSAqIFRPRE86IEltcGxlbWVudCBvdXIgb3duIEhUTUwgcGFyc2VyLgotICovCi1wdWJsaWMgY2xhc3MgTEhUTUxQYXJzZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmx1Y2VuZS5kZW1vLmh0bWwuSFRNTFBhcnNlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMSFRNTFBhcnNlcihGaWxlIGZpbGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlzdXBlcihmaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMSFRNTFBhcnNlcihJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlzdXBlcihzdHJlYW0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExIVE1MUGFyc2VyKFJlYWRlciBzdHJlYW0pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlzdXBlcihzdHJlYW0pOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIEhUTUwgbWV0YSB0YWdzLgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldE1ldGFUYWdzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5nZXRNZXRhVGFncygpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJlYWRlciBmb3IgdGhlIEhUTUwgY29udGVudC4KLQkgKi8KLQlwdWJsaWMgUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5nZXRSZWFkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBIVE1MIHRpdGxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN1cGVyLmdldFRpdGxlKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgYSBzdW1tYXJ5IG9mIHRoZSBIVEwgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdW1tYXJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5nZXRTdW1tYXJ5KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91dGlscy9VTkNVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdXRpbHMvVU5DVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YTk0OWVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91dGlscy9VTkNVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotCi1wdWJsaWMgY2xhc3MgVU5DVXRpbCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5DX0ZJTEVfUFJFRklYID0gImZpbGU6LyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxURVJOQVRFX1VOQ19GSUxFX1BSRUZJWCA9ICJmaWxlOi8vIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVRTQ0FQRV9VTkNfRklMRV9QUkVGSVggPSAiZmlsZTovLy8iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOQ19GSUxFX09OTFkgPSAiZmlsZToiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOQ19TRVBBUkFUT1IgPSAiLyI7Ci0KLQotCS8qKgotCSAqIEFjY291bnRzIGZvciBuZXRzY2FwZSB1bmMgZmlsZSBwcmVmaXguIENvbnZlcnRzIHRvIHN0YW5kYXJkIG9uZS4KLQkgKiBJZiBub3QgTmV0c2NhcGUsIG5vdGhpbmcgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBoYW5kbGVOZXRzY2FwZUZpbGVQcmVmaXgoU3RyaW5nIGZpbGVuYW1lKQotCXsKLQkJU3RyaW5nIGNvbnZlcnRlZE5hbWUgPSBudWxsOwotCi0JCWlmIChmaWxlbmFtZS5zdGFydHNXaXRoKE5FVFNDQVBFX1VOQ19GSUxFX1BSRUZJWCkpCi0JCXsKLQkJCWNvbnZlcnRlZE5hbWUgPQotCQkJCUFMVEVSTkFURV9VTkNfRklMRV9QUkVGSVgKLQkJCQkJKyBmaWxlbmFtZS5zdWJzdHJpbmcoCi0JCQkJCQlORVRTQ0FQRV9VTkNfRklMRV9QUkVGSVgubGVuZ3RoKCksCi0JCQkJCQlmaWxlbmFtZS5sZW5ndGgoKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQljb252ZXJ0ZWROYW1lID0gZmlsZW5hbWU7Ci0JCX0KLQotCQlyZXR1cm4gKGNvbnZlcnRlZE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgVVJMIHBhdGhzIGZvciBNb3ppbGxhIChhbmQgb3RoZXIgYnJvd3NlcnMpIG92ZXIgVU5DLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMIGhhbmRsZVVSTEZvclVOQyhVUkwgb3JpZ2luYWxVcmwpCi0JewotCQkvLyBoYW5kbGUgc3BlY2lhbCBjYXNlIGZvciBNb3ppbGxhIG92ZXIgVU5DCi0JCVVSTCBuZXdVcmwgPSBudWxsOwotCQl0cnkKLQkJewotCQkJaWYgKG9yaWdpbmFsVXJsLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiZmlsZTovLyIpKQotCQkJewotCQkJCS8vIGNoYW5nZSAiZmlsZTovLyIgdG8gImZpbGU6Ly8vLy8iCi0JCQkJU3RyaW5nIGV4dHJhY3RlZFN0cmluZyA9IG9yaWdpbmFsVXJsLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDUpOwotCQkJCW5ld1VybCA9IG5ldyBVUkwoImZpbGUiLCAiIiwgIi8vLyIgKyBleHRyYWN0ZWRTdHJpbmcpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCW5ld1VybCA9IG9yaWdpbmFsVXJsOwotCQkJfQotCQl9Ci0JCWNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKQotCQl7Ci0JCQluZXdVcmwgPSBvcmlnaW5hbFVybDsKLQkJfQotCi0JCXJldHVybiAobmV3VXJsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyB0aGUgVU5DIGZpbGUgdG8gYSByZWd1bGFyLCBwbGF0Zm9ybS1kZXBlbmRlbnQgb25lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRGaWxlbmFtZShTdHJpbmcgZmlsZW5hbWUpCi0JewotCQlTdHJpbmcgY29udmVydGVkTmFtZSA9IG51bGw7Ci0KLQkJLy8gcmVtb3ZlIGFueSBVUkwgcHJlZml4ZXMKLQkJU3RyaW5nIHRlbXBOYW1lID0gbnVsbDsKLQkJaWYgKGZpbGVuYW1lLnN0YXJ0c1dpdGgoVU5DX0ZJTEVfUFJFRklYKSkKLQkJewotCQkJdGVtcE5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoVU5DX0ZJTEVfUFJFRklYLmxlbmd0aCgpLCBmaWxlbmFtZS5sZW5ndGgoKSk7Ci0JCQlpbnQgaW5kZXggPSB0ZW1wTmFtZS5pbmRleE9mKCI6Iik7Ci0JCQlpZiAoaW5kZXggPT0gLTEpCi0JCQl7Ci0JCQkJLy8gb24gVW5peCwgYWRkIHNlcGFyYXRvciBiYWNrIHRvIGZpcnN0IGNoYXJhY3RlcgotCQkJCXRlbXBOYW1lID0gVU5DX1NFUEFSQVRPUiArIHRlbXBOYW1lOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJdGVtcE5hbWUgPSBmaWxlbmFtZTsKLQkJfQotCi0JCS8vIGNvbnZlcnQgYW55IFVOQyBzZXBhcmF0b3JzIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBvbmUKLQkJY29udmVydGVkTmFtZSA9Ci0JCQl0ZW1wTmFtZS5yZXBsYWNlKFVOQ19TRVBBUkFUT1IuY2hhckF0KDApLCBGaWxlLnNlcGFyYXRvci5jaGFyQXQoMCkpOwotCi0JCXJldHVybiAoY29udmVydGVkTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgdGhlIGZpbGVuYW1lIHRvIGEgVU5DIGZpbGVuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRGaWxlbmFtZVRvVU5DKFN0cmluZyBmaWxlbmFtZSkKLQl7Ci0JCS8vIGNvbnZlcnQgYW55IFVOQyBzZXBhcmF0b3JzIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBvbmUKLQkJU3RyaW5nIGNvbnZlcnRlZE5hbWUgPQotCQkJZmlsZW5hbWUucmVwbGFjZShGaWxlLnNlcGFyYXRvci5jaGFyQXQoMCksIFVOQ19TRVBBUkFUT1IuY2hhckF0KDApKTsKLQkJU3RyaW5nIGZpbmFsTmFtZSA9IGNvbnZlcnRGaWxlU2VwYXJhdG9yKGNvbnZlcnRlZE5hbWUpOwotCQlyZXR1cm4gKGZpbmFsTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgdGhlIFVSTCB0byBvbmUgd2hpY2ggY2FuIHRoYXQgbWF0Y2hlcyBhIFVOQyBjb252ZW50aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1VOQyhTdHJpbmcgdXJsKQotCXsKLQkJU3RyaW5nIGNvbnZlcnRlZFVybCA9IG51bGw7Ci0JCWlmICh1cmwuc3RhcnRzV2l0aChBTFRFUk5BVEVfVU5DX0ZJTEVfUFJFRklYKSkKLQkJewotCQkJY29udmVydGVkVXJsID0KLQkJCQlVTkNfRklMRV9QUkVGSVgKLQkJCQkJKyB1cmwuc3Vic3RyaW5nKEFMVEVSTkFURV9VTkNfRklMRV9QUkVGSVgubGVuZ3RoKCksIHVybC5sZW5ndGgoKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQljb252ZXJ0ZWRVcmwgPSB1cmw7Ci0JCX0KLQkJcmV0dXJuIChjb252ZXJ0ZWRVcmwpOwotCi0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgIiUyMCIgdGhhdCBpcyB1c2VkIGJ5IHNvbWUgYnJvd3NlcnMgZm9yIHNwYWNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRGaWxlU3BhY2luZyhTdHJpbmcgZmlsZW5hbWUpCi0JewotCQkvLyBub3cgcmVtb3ZlIGFueSAiJTIwIgotCQlpbnQgc3RhcnQgPSAwOwotCQlTdHJpbmcgbmV3RmlsZW5hbWUgPSAiIjsKLQkJd2hpbGUgKHN0YXJ0IDwgZmlsZW5hbWUubGVuZ3RoKCkpCi0JCXsKLQkJCWludCBpbmRleCA9IGZpbGVuYW1lLmluZGV4T2YoIiUyMCIsIHN0YXJ0KTsKLQkJCWlmIChpbmRleCA9PSAtMSkKLQkJCXsKLQkJCQlpbmRleCA9IGZpbGVuYW1lLmxlbmd0aCgpOwotCQkJfQotCQkJbmV3RmlsZW5hbWUgKz0gZmlsZW5hbWUuc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCk7Ci0JCQluZXdGaWxlbmFtZSArPSAiICI7Ci0JCQlzdGFydCA9IGluZGV4ICsgMzsKLQkJfQotCi0JCW5ld0ZpbGVuYW1lID0gbmV3RmlsZW5hbWUudHJpbSgpOwotCi0JCXJldHVybiAobmV3RmlsZW5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlICIlNUMiIHRoYXQgaXMgdXNlZCBieSBzb21lIGJyb3dzZXJzIGZvciBmaWxlIHNlcGFyYXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0RmlsZVNlcGFyYXRvcihTdHJpbmcgZmlsZW5hbWUpCi0JewotCQkvLyByZW1vdmUgYW55ICIlNUMiCi0JCWludCBzdGFydCA9IDA7Ci0JCVN0cmluZyBuZXdGaWxlbmFtZSA9ICIiOwotCQl3aGlsZSAoc3RhcnQgPCBmaWxlbmFtZS5sZW5ndGgoKSkKLQkJewotCQkJaW50IGluZGV4ID0gZmlsZW5hbWUuaW5kZXhPZigiJTVDIiwgc3RhcnQpOwotCQkJaWYgKGluZGV4ID09IC0xKQotCQkJewotCQkJCS8vaW5kZXggPSBmaWxlbmFtZS5sZW5ndGgoKTsKLQkJCQluZXdGaWxlbmFtZSA9IGZpbGVuYW1lLnRyaW0oKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCW5ld0ZpbGVuYW1lICs9IGZpbGVuYW1lLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpOwotCQkJbmV3RmlsZW5hbWUgKz0gVU5DX1NFUEFSQVRPUjsKLQkJCXN0YXJ0ID0gaW5kZXggKyAzOwotCQl9Ci0KLQkJbmV3RmlsZW5hbWUgPSBuZXdGaWxlbmFtZS50cmltKCk7Ci0KLQkJLy8gYWxzbyBpZiBmaWxlIHNlcGFyYXRvciBlcXVhbHMgdW5jIHNlcGFyYXRvciwgcmVtb3ZlIGFueSBXaW5kb3dzCi0JCS8vIHNwZWNpZmljICJcIgotCQlTdHJpbmcgd2luZG93c0ZpbGVTZXBhcmF0b3IgPSAiXFwiOwotCQlpZiAoIUZpbGUuc2VwYXJhdG9yLmVxdWFscyh3aW5kb3dzRmlsZVNlcGFyYXRvcikKLQkJCSYmIEZpbGUuc2VwYXJhdG9yLmVxdWFscyhVTkNfU0VQQVJBVE9SKSkKLQkJewotCQkJLy8gb24gVW5peAotCQkJbmV3RmlsZW5hbWUgPQotCQkJCW5ld0ZpbGVuYW1lLnJlcGxhY2UoCi0JCQkJCXdpbmRvd3NGaWxlU2VwYXJhdG9yLmNoYXJBdCgwKSwKLQkJCQkJVU5DX1NFUEFSQVRPUi5jaGFyQXQoMCkpOwotCQl9Ci0JCXJldHVybiAobmV3RmlsZW5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZmlsZSBuYW1lcyBmcm9tIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5Ci0JICogdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBzdWZmaXguICBBbiBleGFtcGxlIG9mIGEgCi0JICogc3VmZml4IGlzICIuZGF0Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlY3RvciBnZXRGaWxlTGlzdChTdHJpbmcgZGlyZWN0b3J5LCBTdHJpbmcgc3VmZml4KQotCXsKLQkJaWYgKGRpcmVjdG9yeS5zdGFydHNXaXRoKCJodHRwIikpCi0JCXsKLQkJCS8vIHJlbW90ZSBkaXJlY3RvcnksIHVzZSB0aGlzIGluc3RlYWQKLQkJCXJldHVybiAoZ2V0RmlsZUxpc3RGcm9tUmVtb3RlKGRpcmVjdG9yeSwgc3VmZml4KSk7Ci0JCX0KLQotCQlTdHJpbmcgdGVtcERpciA9IFVOQ1V0aWwuY29udmVydEZpbGVuYW1lKGRpcmVjdG9yeSk7Ci0JCUZpbGUgZG9jdW1lbnREaXJlY3RvcnkgPSBuZXcgRmlsZShVTkNVdGlsLmNvbnZlcnRGaWxlU3BhY2luZyh0ZW1wRGlyKSk7Ci0JCVN0cmluZ1tdIGZpbGVOYW1lTGlzdCA9IGRvY3VtZW50RGlyZWN0b3J5Lmxpc3QoKTsKLQotCQkvLyBub3cgcGFyc2UgYW5kIG9ubHkgdGFrZSB0aG9zZSB0aGF0IGVuZCB3aXRoIHRoZSBwcm9wZXIgc3VmZml4Ci0JCVZlY3RvciBmaW5hbExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZU5hbWVMaXN0Lmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlpZiAoZmlsZU5hbWVMaXN0W2ldLmVuZHNXaXRoKHN1ZmZpeCkpCi0JCQl7Ci0JCQkJZmluYWxMaXN0LmFkZEVsZW1lbnQoZmlsZU5hbWVMaXN0W2ldKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAoZmluYWxMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGFwcGxpY2FibGUgZGVmYXVsdCBydXAgZmlsZXMgZnJvbSByZW1vdGUgZGlyZWN0b3J5LgotCSAqLwotCXByaXZhdGUgc3RhdGljIFZlY3RvciBnZXRGaWxlTGlzdEZyb21SZW1vdGUoU3RyaW5nIGRpcmVjdG9yeSwgU3RyaW5nIHN1ZmZpeCkKLQl7Ci0JCVZlY3RvciBmaWxlbmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCXRyeQotCQl7Ci0JCQkvLyBnZXQgdGhlIGxpc3RpbmcgdXNpbmcgYSBVUkwKLQkJCVVSTCByZW1vdGVVcmwgPSBuZXcgVVJMKGRpcmVjdG9yeSk7Ci0JCQlJbnB1dFN0cmVhbSBpblN0cmVhbSA9IHJlbW90ZVVybC5vcGVuU3RyZWFtKCk7Ci0JCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJaW50IGM7Ci0JCQl3aGlsZSAoKGMgPSBpblN0cmVhbS5yZWFkKCkpICE9IC0xKQotCQkJewotCQkJCXJlc3VsdC5hcHBlbmQoKGNoYXIpIGMpOwotCQkJfQotCQkJaW5TdHJlYW0uY2xvc2UoKTsKLQotCQkJLy8gY29udmVydCBzdHJpbmcgdG8gdXBwZXIgY2FzZSB0byBoYW5kbGUgbXVsdGlwbGUgc2VydmVyIHR5cGVzIHN1Y2ggYXMgQXBhY2hlCi0JCQlTdHJpbmcgZGlyZWN0b3J5UmVzdWx0ID0gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JCQlkaXJlY3RvcnlSZXN1bHQgPSBkaXJlY3RvcnlSZXN1bHQucmVwbGFjZUFsbCgiaHJlZiIsICJIUkVGIik7Ci0JCQlkaXJlY3RvcnlSZXN1bHQgPSBkaXJlY3RvcnlSZXN1bHQucmVwbGFjZUFsbCgiPC9hIiwgIjwvQSIpOwotCQkJZGlyZWN0b3J5UmVzdWx0ID0gZGlyZWN0b3J5UmVzdWx0LnJlcGxhY2VBbGwoIjx0dD4iLCAiIik7Ci0JCQlkaXJlY3RvcnlSZXN1bHQgPSBkaXJlY3RvcnlSZXN1bHQucmVwbGFjZUFsbCgiPC90dD4iLCAiIik7Ci0JCQlkaXJlY3RvcnlSZXN1bHQgPSBkaXJlY3RvcnlSZXN1bHQucmVwbGFjZUFsbCgiPFRUPiIsICIiKTsKLQkJCWRpcmVjdG9yeVJlc3VsdCA9IGRpcmVjdG9yeVJlc3VsdC5yZXBsYWNlQWxsKCI8L1RUPiIsICIiKTsKLQotCQkJLy8gcGFyc2UgdGhlIGNvbnRlbnQKLQkJCS8vU3RyaW5nVG9rZW5pemVyIGxpbmVUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKCByZXN1bHQudG9TdHJpbmcoKSApOwotCQkJU3RyaW5nVG9rZW5pemVyIGxpbmVUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGRpcmVjdG9yeVJlc3VsdCk7Ci0JCQlWZWN0b3IgbGluZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCQl0cnkKLQkJCXsKLQkJCQl3aGlsZSAodHJ1ZSkKLQkJCQl7Ci0JCQkJCWxpbmVUb2tlbml6ZXIubmV4dFRva2VuKCJSRUYiKTsKLQkJCQkJbGluZVRva2VuaXplci5uZXh0VG9rZW4oIlwiIik7Ci0JCQkJCVN0cmluZyBsaW5lID0gbGluZVRva2VuaXplci5uZXh0VG9rZW4oIlwiIik7Ci0KLQkJCQkJLy8gc3RyaXAgb3V0ICI8L0EiOyBuZWVkZWQgdGhpcyBiZWNhdXNlIFN0cmluZ1Rva2VuaXplcgotCQkJCQkvLyBoYXMgcHJvYmxlbXMgcGFyc2luZyBmaWxlbmFtZXMgdGhhdCBiZWluZyB3aXRoICJBIgotCQkJCQlpbnQgaW5kZXggPSBsaW5lLmluZGV4T2YoIjwvQSIpOwotCQkJCQlpZiAoaW5kZXggIT0gLTEgJiYgaW5kZXggIT0gMCkKLQkJCQkJewotCQkJCQkJU3RyaW5nIGZpbGVuYW1lID0gbGluZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCQkJbGluZXMuYWRkRWxlbWVudChmaWxlbmFtZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlsaW5lcy5hZGRFbGVtZW50KGxpbmUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbmUpCi0JCQl7Ci0JCQkJLy8gZG8gbm90aGluZywgZW5kIG9mIGNvbnRlbnQKLQkJCX0KLQotCQkJLy8gcGFyc2UgZWFjaCBsaW5lCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmVzLnNpemUoKTsgaSsrKQotCQkJewotCQkJCVN0cmluZyBsaW5lID0gKFN0cmluZykgbGluZXMuZWxlbWVudEF0KGkpOwotCi0JCQkJaWYgKGxpbmUuZW5kc1dpdGgoc3VmZml4KSkKLQkJCQl7Ci0JCQkJCS8vIHdlIHdhbnQgdGhpcwotCQkJCQlmaWxlbmFtZXMuYWRkRWxlbWVudChsaW5lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiAoZmlsZW5hbWVzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTg1OWE3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmU0N2RhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvO3Zpc2liaWxpdHk6PXJlZXhwb3J0Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLAotIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzdkOTg0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlkNGY0YzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBVTUEgRWNvcmUgRXh0ZW5zaW9uCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL0lNb2RlbE9iamVjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL0lNb2RlbE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NTA4ZGQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9JTW9kZWxPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5FRGF0YU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgYWxsIFVNQSBtb2RlbCBvYmplY3RzLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBkeW5hbWljIGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyBzdXBwb3J0IGJldHdlZW4KLSAqIG1vZGVsIG9iamVjdHMgdGhyb3VnaCB0aGUgdXNlIG9mIG9wcG9zaXRlIGZlYXR1cmVzLiBJdCBhbHNvIGFsbG93cyB0aGUKLSAqIGRlZmF1bHQgdmFsdWUgb2YgYSBmZWF0dXJlLCBhcyBkZWZpbmVkIGluIGEgbWV0YWwgbW9kZWwsIHRvIGJlIG92ZXJ3cml0dGVuLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbE9iamVjdCBleHRlbmRzIEVEYXRhT2JqZWN0IHsKLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYSBmZWF0dXJlLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGEgd2F5IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZhbHVlIGRlZmluZWQgaW4gdGhlCi0JICogbWV0YS1tb2RlbCBmb3IgYSBVTUEgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIGEgZmVhdHVyZQotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHZhbHVlIG9mIGFuIG9wcG9zaXRlIGZlYXR1cmUuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIGFuIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBvcHBvc2l0ZSBmZWF0dXJlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSk7Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgb3Bwb3NpdGUgZmVhdHVyZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbW9kZWwgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIG9wcG9zaXRlIGZlYXR1cmVzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0T3Bwb3NpdGVGZWF0dXJlcygpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIwYjA3ZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL0lQcm94eVJlc29sdXRpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZTsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIHByb3h5IHJlc29sdXRpb24gbGlzdGVuZXIgYXR0YWNoZWQgdG8gYSBVTUEgcmVzb3VyY2Ugc2V0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eVJlc29sdXRpb25MaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gb2YgYW4gZXhjZXB0aW9uIHRoYXQgaGFzIG9jY3VycmVkIHdoaWxlIHJlc29sdmluZyBhCi0JICogcHJveHkgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICB0aGUgZXhjZXB0aW9uIHRoYXQgaGFzIG9jY3VycmVkCi0JICovCi0Jdm9pZCBub3RpZnlFeGNlcHRpb24oRXhjZXB0aW9uIGUpOwotCi0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIHRoYXQgYSBwcm94eSBoYXMgYmVlbiByZXNvbHZlZCBzdWNjZXNzZnVsbHkuCi0JICogCi0JICogQHBhcmFtIHByb3h5Ci0JICogICAgICAgICAgICBhIHByb3h5IG9iamVjdAotCSAqIEBwYXJhbSByZXNvbHZlZAotCSAqICAgICAgICAgICAgdGhlIHJlc29sdmVkIG9iamVjdAotCSAqLwotCXZvaWQgcHJveHlSZXNvbHZlZChPYmplY3QgcHJveHksIE9iamVjdCByZXNvbHZlZCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9JVW1hUmVzb3VyY2VTZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9JVW1hUmVzb3VyY2VTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTcwNzVhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvSVVtYVJlc291cmNlU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBVTUEgcmVzb3VyY2Ugc2V0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVbWFSZXNvdXJjZVNldCBleHRlbmRzIFJlc291cmNlU2V0IHsKLQotCS8qKgotCSAqIEdldHMgdGhlIG1vZGVsIG9iamVjdCByZXNvbHZlZCBieSBhIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb2x2ZXIKLQkgKiAgICAgICAgICAgIHRoZSBwcm94eSByZXNvbHZlcgotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIHRoZSBVUkkgdXNlZCB0byByZXNvbHZlIHRoZSBwcm94eQotCSAqIEBwYXJhbSBsb2FkT25EZW1hbmQKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBjcmVhdGUgYW5kIGxvYWQgdGhlIHJlc291cmNlIGlmIGl0Ci0JICogICAgICAgICAgICBkb2VzIG5vdCBleGlzdHMKLQkgKiBAcmV0dXJuIHRoZSBtb2RlbCBvYmplY3QgcmVzb2x2ZWQgYnkgdGhlIFVSSQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0I2dldEVPYmplY3QoRU9iamVjdCwgVVJJLCBib29sZWFuKQotCSAqLwotCUVPYmplY3QgZ2V0RU9iamVjdChFT2JqZWN0IHJlc29sdmVyLCBVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9SZXNvbHZlRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvUmVzb2x2ZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MWFjNzJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9SZXNvbHZlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIHJlc29sdmluZyBhIHByb3h5IG9iamVjdC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlc29sdmVFeGNlcHRpb24gZXh0ZW5kcyBXcmFwcGVkRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTg0MTI4MTU4MTQ2MzYwODFMOwotCi0JcHJpdmF0ZSBFT2JqZWN0IHByb3h5OwotCi0JcHJpdmF0ZSBFT2JqZWN0IHJlc29sdmVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJveHkKLQkgKiAgICAgICAgICAgIGEgcHJveHkgb2JqZWN0Ci0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgYW4gZXJyb3IgbWVzc2FnZQotCSAqIEBwYXJhbSByZXNvbHZlcgotCSAqICAgICAgICAgICAgdGhlIHByb3h5IHJlc29sdmVyCi0JICovCi0JcHVibGljIFJlc29sdmVFeGNlcHRpb24oRU9iamVjdCBwcm94eSwgU3RyaW5nIG1zZywgRU9iamVjdCByZXNvbHZlcikgewotCQlzdXBlcihtc2csIG51bGwpOwotCQl0aGlzLnByb3h5ID0gcHJveHk7Ci0JCXRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwcm94eQotCSAqICAgICAgICAgICAgYSBwcm94eSBvYmplY3QKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICB0aGUgZXhjZXB0aW9uIHRoYXQgd2FzIHRocm93bgotCSAqLwotCXB1YmxpYyBSZXNvbHZlRXhjZXB0aW9uKEVPYmplY3QgcHJveHksIEV4Y2VwdGlvbiBleGNlcHRpb24sIEVPYmplY3QgcmVzb2x2ZXIpIHsKLQkJc3VwZXIoZXhjZXB0aW9uKTsKLQkJdGhpcy5wcm94eSA9IHByb3h5OwotCQl0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJveHkgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb3h5IG9iamVjdAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFByb3h5KCkgewotCQlyZXR1cm4gcHJveHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJveHkgcmVzb2x2ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJveHkgcmVzb2x2ZXIKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRSZXNvbHZlcigpIHsKLQkJcmV0dXJuIHJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgUmVzb2x2ZUV4Y2VwdGlvbikgewotCQkJUmVzb2x2ZUV4Y2VwdGlvbiByZSA9IChSZXNvbHZlRXhjZXB0aW9uKSBvYmo7Ci0JCQlpZiAocmVzb2x2ZXIgPT0gcmUucmVzb2x2ZXIpIHsKLQkJCQlpZiAocHJveHkgPT0gcmUucHJveHkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWlmIChwcm94eSBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotCQkJCQlVUkkgdXJpID0gKChJbnRlcm5hbEVPYmplY3QpIHByb3h5KS5lUHJveHlVUkkoKTsKLQkJCQkJaWYgKHVyaSAhPSBudWxsICYmIHJlLnByb3h5IGluc3RhbmNlb2YgSW50ZXJuYWxFT2JqZWN0KSB7Ci0JCQkJCQlyZXR1cm4gdXJpLmVxdWFscygoKEludGVybmFsRU9iamVjdCkgcmUucHJveHkpCi0JCQkJCQkJCS5lUHJveHlVUkkoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL2ltcGwvTXVsdGlSZXNvdXJjZUVPYmplY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9pbXBsL011bHRpUmVzb3VyY2VFT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI2MDM3OWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL2ltcGwvTXVsdGlSZXNvdXJjZUVPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlLkludGVybmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uaW1wbC5FRGF0YU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JTW9kZWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JUHJveHlSZXNvbHV0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JVW1hUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5SZXNvbHZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZVJlc29sdmluZ0VMaXN0OwotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgVU1BIG1vZGVsIG9iamVjdHMuCi0gKiA8cD4KLSAqIEJ5IGRlZmF1bHQsIEVNRiBzdG9yZXMgbW9kZWwgb2JqZWN0cyByZWxhdGVkIHZpYSBhIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcAotICogaW4gYSBzaW5nbGUgWE1JIGZpbGUuIFRoaXMgY2xhc3MgZXh0ZW5kcyB0aGUgZGVmYXVsdCBFTUYgcGVyc2lzdGVuY2UgYmVoYXZpb3IKLSAqIGJ5IHByb3ZpZGluZyBhIG1lY2hhbmlzbSBmb3IgdGhlIGNvbnRhaW5pbmcgYW5kIGNvbnRhaW5lZCBvYmplY3RzIHRvIGJlCi0gKiBzdG9yZWQgaW4gc2VwYXJhdGUgWE1JIGZpbGVzLiBDb250YWluZWQgb2JqZWN0cyBhcmUgbGF6eSBsb2FkZWQsIHdoZW4KLSAqIHJlcXVpcmVkLCBzaW1pbGFyIHRvIHRoZSBwcm94eSBvYmplY3QgYmVoYXZpb3Igb2YgRU1GJ3Mgc3RhbmRhcmQgcmVzb3VyY2UKLSAqIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlSZXNvdXJjZUVPYmplY3QgZXh0ZW5kcyBFRGF0YU9iamVjdEltcGwgaW1wbGVtZW50cwotCQlJTW9kZWxPYmplY3QgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1ODEyNjk0NzE1MzA5NzI3M0w7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhIGZlYXR1cmUuCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZGVzaWduZWQgZm9yIG1pZ3JhdGlvbiB1c2Ugb25seS4gRG8gbm90IGNhbGwgdGhpcwotCSAqIG1ldGhvZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIGZlYXR1cmUgc2luY2UgaXQgd2lsbCBzbG93IGRvd24KLQkgKiB0aGUgbG9hZGluZyBvZiBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBhIGZlYXR1cmUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCi0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2V0RGVmYXVsdFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IGRlZmF1bHRWYWx1ZSkgewotCQlmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAucHV0KGZlYXR1cmUsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGEgZmVhdHVyZS4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBkZXNpZ25lZCBmb3IgbWlncmF0aW9uIHVzZSBvbmx5LiBEbyBub3QgY2FsbCB0aGlzCi0JICogbWV0aG9kIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGEgZmVhdHVyZSBzaW5jZSBpdCB3aWxsIHNsb3cgZG93bgotCSAqIHRoZSBsb2FkaW5nIG9mIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIGEgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCByZW1vdmVEZWZhdWx0VmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwLnJlbW92ZShmZWF0dXJlKTsKLQl9Ci0JCi0JLyoqCi0JICogQSBtYXAgb2YgZW50cmllcyBvZiBPcHBvc2l0ZUZlYXR1cmUgLyBPcHBvc2l0ZUZlYXR1cmUncyB2YWx1ZQotCSAqLwotCXByaXZhdGUgTWFwIG9wcG9zaXRlRmVhdHVyZU1hcDsKLQotCXByaXZhdGUgYm9vbGVhbiBoYXNPcHBvc2l0ZUZlYXR1cmUgPSB0cnVlOwotCi0JcHJpdmF0ZSBCb29sZWFuIG5vdGlmeU9wcG9zaXRlID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiB2YWxpZCA9IHRydWU7Ci0KLQlwcml2YXRlIExpc3QgZmVhdHVyZXNXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlOwotCi0JLyoqCi0JICogQ2hlY2tzIHRoZSB2YWxpZGl0eSBvZiB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgb2JqZWN0IGlzIHZhbGlkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcmV0dXJuIHZhbGlkOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcHBvc2l0ZUFkZChPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgbGlzdCA9IChMaXN0KSBnZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5nZXQob3Bwb3NpdGVGZWF0dXJlKTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJbGlzdCA9IG5ldyBPcHBvc2l0ZUZlYXR1cmVSZXNvbHZpbmdFTGlzdCh0aGlzLCBvcHBvc2l0ZUZlYXR1cmUpOwotCQkJZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KG9wcG9zaXRlRmVhdHVyZSwgbGlzdCk7Ci0JCX0KLQkJaWYgKCFsaXN0LmNvbnRhaW5zKG9iamVjdCkpIHsKLQkJCWxpc3QuYWRkKG9iamVjdCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3Bwb3NpdGVSZW1vdmUoT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSwgT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IGxpc3QgPSAoTGlzdCkgZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZ2V0KG9wcG9zaXRlRmVhdHVyZSk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlUmVzb2x2aW5nRUxpc3QodGhpcywgb3Bwb3NpdGVGZWF0dXJlKTsKLQkJCWdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dChvcHBvc2l0ZUZlYXR1cmUsIGxpc3QpOwotCQl9Ci0JCWxpc3QucmVtb3ZlKG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmVzb2x2ZXMgdGhlIGdpdmVuIHByb3h5IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICBhIHByb3h5IG9iamVjdCB0byByZXNvbHZlCi0JICogQHJldHVybiB0aGUgcmVzb2x2ZWQgb2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCByZXNvbHZlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdAotCQkJCSYmICgoSW50ZXJuYWxFT2JqZWN0KSBvYmplY3QpLmVJc1Byb3h5KCkpIHsKLQkJCXJldHVybiBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG9iamVjdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVwbGFjZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLAotCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWlmIChuZXdWYWx1ZSAhPSBudWxsICYmICFuZXdWYWx1ZS5lSXNQcm94eSgpICYmIG5ld1ZhbHVlICE9IG9sZFZhbHVlKSB7Ci0JCQlib29sZWFuIG5vdGlmeSA9IGVEZWxpdmVyKCk7Ci0JCQl0cnkgewotCQkJCWVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQlFY29yZVV0aWwucmVwbGFjZSh0aGlzLCBmZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aVJlc291cmNlRU9iamVjdC5yZXBsYWNlKCk6Iik7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIG9iamVjdDogIiArIHRoaXMpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICBmZWF0dXJlOiAiICsgZmVhdHVyZSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIHByb3h5OiAiICsgb2xkVmFsdWUpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICByZXNvbHZlZDogIiArIG5ld1ZhbHVlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJZVNldERlbGl2ZXIobm90aWZ5KTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkJhc2ljTm90aWZpZXJJbXBsI2VOb3RpZnkob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVOb3RpZnkoTm90aWZpY2F0aW9uIG1zZykgewotCQkvKgotCQkgKiBpZighT3Bwb3NpdGVGZWF0dXJlLmlzRGVsaXZlck9uUmVzb2x2ZSgpICYmIG1zZy5nZXRFdmVudFR5cGUoKSA9PQotCQkgKiBOb3RpZmljYXRpb24uUkVTT0xWRSkgeyByZXR1cm47IH0KLQkJICovCi0KLQkJaWYgKG1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVTT0xWRSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlPYmplY3QgZiA9IG1zZy5nZXRGZWF0dXJlKCk7Ci0JCWlmIChmIGluc3RhbmNlb2YgRVN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGY7Ci0JCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gT3Bwb3NpdGVGZWF0dXJlCi0JCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmUoZmVhdHVyZSk7Ci0JCQlpZiAob3Bwb3NpdGVGZWF0dXJlICE9IG51bGwpIHsKLQkJCQlNdWx0aVJlc291cmNlRU9iamVjdCBvbGRPdGhlckVuZDsKLQkJCQlNdWx0aVJlc291cmNlRU9iamVjdCBvdGhlckVuZDsKLQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLQkJCQkJCW9sZE90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUucmVzb2x2ZU93bmVyKCkpIHsKLQkJCQkJCQlvbGRPdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb2x2ZShvbGRPdGhlckVuZCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAob2xkT3RoZXJFbmQgIT0gbnVsbCkgewotCQkJCQkJCW9sZE90aGVyRW5kLm9wcG9zaXRlUmVtb3ZlKG9wcG9zaXRlRmVhdHVyZSwgbXNnCi0JCQkJCQkJCQkuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCQl9Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUucmVzb2x2ZU93bmVyKCkpIHsKLQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb2x2ZShvdGhlckVuZCk7Ci0JCQkJCQkJcmVwbGFjZShmZWF0dXJlLCBtc2cuZ2V0TmV3VmFsdWUoKSwgb3RoZXJFbmQpOwotCQkJCQkJfQotCQkJCQkJaWYgKG90aGVyRW5kICE9IG51bGwpIHsKLQkJCQkJCQlvdGhlckVuZC5vcHBvc2l0ZUFkZChvcHBvc2l0ZUZlYXR1cmUsIG1zZwotCQkJCQkJCQkJLmdldE5vdGlmaWVyKCkpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgb2JqOwotCQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUucmVzb2x2ZU93bmVyKCkpIHsKLQkJCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc29sdmUob3RoZXJFbmQpOwotCQkJCQkJCQlyZXBsYWNlKGZlYXR1cmUsIG9iaiwgb3RoZXJFbmQpOwotCQkJCQkJCX0KLQkJCQkJCQlvdGhlckVuZC5vcHBvc2l0ZUFkZChvcHBvc2l0ZUZlYXR1cmUsIG1zZwotCQkJCQkJCQkJLmdldE5vdGlmaWVyKCkpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUucmVzb2x2ZU93bmVyKCkpIHsKLQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb2x2ZShvdGhlckVuZCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAob3RoZXJFbmQgIT0gbnVsbCkKLQkJCQkJCQlvdGhlckVuZC5vcHBvc2l0ZVJlbW92ZShvcHBvc2l0ZUZlYXR1cmUsIG1zZwotCQkJCQkJCQkJLmdldE5vdGlmaWVyKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG90aGVyRW5kKTsKLQkJCQkJCQl9Ci0JCQkJCQkJb3RoZXJFbmQub3Bwb3NpdGVSZW1vdmUob3Bwb3NpdGVGZWF0dXJlLCBtc2cKLQkJCQkJCQkJCS5nZXROb3RpZmllcigpKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBvYmo7Ci0JCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb2x2ZShvdGhlckVuZCk7Ci0JCQkJCQkJCXJlcGxhY2UoZmVhdHVyZSwgb2JqLCBvdGhlckVuZCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChvdGhlckVuZCAhPSBudWxsKSB7Ci0JCQkJCQkJCUVPYmplY3Qgb2xkVmFsdWUgPSAoRU9iamVjdCkgb3RoZXJFbmQKLQkJCQkJCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZ2V0KAotCQkJCQkJCQkJCQkJb3Bwb3NpdGVGZWF0dXJlKTsKLQkJCQkJCQkJaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQkJCS8vIHJlbW92ZSBvdGhlckVuZCBmcm9tIHRhcmdldCBmZWF0dXJlIG9mCi0JCQkJCQkJCQkvLyBvbGRWYWx1ZQotCQkJCQkJCQkJKChDb2xsZWN0aW9uKSBvbGRWYWx1ZQotCQkJCQkJCQkJCQkuZUdldCgoRVN0cnVjdHVyYWxGZWF0dXJlKSBmKSkKLQkJCQkJCQkJCQkJLnJlbW92ZShvdGhlckVuZCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJb3RoZXJFbmQuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KAotCQkJCQkJCQkJCW9wcG9zaXRlRmVhdHVyZSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCkpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb2x2ZShvdGhlckVuZCk7Ci0JCQkJCQkJfQotCQkJCQkJCW90aGVyRW5kLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dCgKLQkJCQkJCQkJCW9wcG9zaXRlRmVhdHVyZSwgbnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG90aGVyRW5kKTsKLQkJCQkJCQlyZXBsYWNlKGZlYXR1cmUsIG1zZy5nZXROZXdWYWx1ZSgpLCBvdGhlckVuZCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAob3RoZXJFbmQgIT0gbnVsbCkgewotCQkJCQkJCUVPYmplY3Qgb2xkVmFsdWUgPSAoRU9iamVjdCkgb3RoZXJFbmQKLQkJCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5nZXQoCi0JCQkJCQkJCQkJCW9wcG9zaXRlRmVhdHVyZSk7Ci0JCQkJCQkJaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQkJLy8gcmVtb3ZlIG90aGVyRW5kIGZyb20gdGFyZ2V0IGZlYXR1cmUgb2YKLQkJCQkJCQkJLy8gb2xkVmFsdWUKLQkJCQkJCQkJKChDb2xsZWN0aW9uKSBvbGRWYWx1ZQotCQkJCQkJCQkJCS5lR2V0KChFU3RydWN0dXJhbEZlYXR1cmUpIGYpKQotCQkJCQkJCQkJCS5yZW1vdmUob3RoZXJFbmQpOwotCQkJCQkJCX0KLQkJCQkJCQlvdGhlckVuZC5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5wdXQoCi0JCQkJCQkJCQlvcHBvc2l0ZUZlYXR1cmUsIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQ6Ci0JCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc29sdmUob3RoZXJFbmQpOwotCQkJCQkJCXJlcGxhY2UoZmVhdHVyZSwgbXNnLmdldE5ld1ZhbHVlKCksIG90aGVyRW5kKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChvdGhlckVuZCAhPSBudWxsKSB7Ci0JCQkJCQkJRU9iamVjdCBvbGRWYWx1ZSA9IChFT2JqZWN0KSBvdGhlckVuZAotCQkJCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmdldCgKLQkJCQkJCQkJCQkJb3Bwb3NpdGVGZWF0dXJlKTsKLQkJCQkJCQlpZiAob2xkVmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCQkvLyBzZXQgdGhlIHRhcmdldCBmZWF0dXJlIG9mIG9sZFZhbHVlIHRvIG51bGwKLQkJCQkJCQkJb2xkVmFsdWUuZVNldCgoRVN0cnVjdHVyYWxGZWF0dXJlKSBmLCBudWxsKTsKLQkJCQkJCQl9Ci0JCQkJCQkJb3RoZXJFbmQuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KAotCQkJCQkJCQkJb3Bwb3NpdGVGZWF0dXJlLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgdGFyZ2V0RmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGY7Ci0JCQkJCQkJaWYoIXRhcmdldEZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkJb2xkT3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJCQlpZihvbGRPdGhlckVuZCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlvbGRPdGhlckVuZC5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5wdXQob3Bwb3NpdGVGZWF0dXJlLCBudWxsKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5VTlNFVDoKLQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUucmVzb2x2ZU93bmVyKCkpIHsKLQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb2x2ZShvdGhlckVuZCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAob3RoZXJFbmQgIT0gbnVsbCkKLQkJCQkJCQlvdGhlckVuZC5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5wdXQoCi0JCQkJCQkJCQlvcHBvc2l0ZUZlYXR1cmUsIG51bGwpOwotCQkJCQkJYnJlYWs7Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXN1cGVyLmVOb3RpZnkobXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQmFzaWNOb3RpZmllckltcGwjZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSB7Ci0JCWlmICghZURlbGl2ZXIoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiAhcmVzb3VyY2UuZURlbGl2ZXIoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAobm90aWZ5T3Bwb3NpdGUgPT0gbnVsbCkgewotCQkJaWYgKE9wcG9zaXRlRmVhdHVyZS5mZWF0dXJlT3Bwb3NpdGVGZWF0dXJlTWFwLmlzRW1wdHkoKSkgewotCQkJCW5vdGlmeU9wcG9zaXRlID0gQm9vbGVhbi5GQUxTRTsKLQkJCX0gZWxzZSB7Ci0JCQkJQ29sbGVjdGlvbiBmZWF0dXJlcyA9IE9wcG9zaXRlRmVhdHVyZS5mZWF0dXJlT3Bwb3NpdGVGZWF0dXJlTWFwCi0JCQkJCQkua2V5U2V0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlpZiAoZmVhdHVyZXMuY29udGFpbnMoaXRlci5uZXh0KCkpKSB7Ci0JCQkJCQlub3RpZnlPcHBvc2l0ZSA9IEJvb2xlYW4uVFJVRTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChub3RpZnlPcHBvc2l0ZSA9PSBudWxsKSB7Ci0JCQkJCW5vdGlmeU9wcG9zaXRlID0gQm9vbGVhbi5GQUxTRTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG5vdGlmeU9wcG9zaXRlLmJvb2xlYW5WYWx1ZSgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBzdXBlci5lTm90aWZpY2F0aW9uUmVxdWlyZWQoKTsKLQl9Ci0KLQkvKgotCSAqIHByaXZhdGUgdm9pZCByZW1vdmVDaGlsZFJlc291cmNlcygpIHsgTGlzdCBjaGlsZHJlbiA9IGVDb250ZW50cygpOyBpbnQKLQkgKiBzaXplID0gY2hpbGRyZW4uc2l6ZSgpOyBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCSAqIE11bHRpUmVzb3VyY2VFT2JqZWN0IGNoaWxkID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBjaGlsZHJlbi5nZXQoaSk7Ci0JICogUmVzb3VyY2UgcmVzb3VyY2UgPSBjaGlsZC5lUmVzb3VyY2UoKTsgaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UgIT0KLQkgKiBlUmVzb3VyY2UoKSkgeyBjaGlsZC5yZW1vdmVDaGlsZFJlc291cmNlcygpOyB9ICgoSW50ZXJuYWxFTGlzdCkKLQkgKiByZXNvdXJjZS5nZXRDb250ZW50cygpKS5iYXNpY1JlbW92ZSh0aGlzLCBudWxsKTsKLQkgKiBjaGlsZC5lUHJvcGVydGllcygpLnNldEVSZXNvdXJjZShudWxsKTsgfSB9Ci0JKi8KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCNlQmFzaWNTZXRDb250YWluZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCwKLQkgKiAgICAgIGludCwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4pCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1NldENvbnRhaW5lcihJbnRlcm5hbEVPYmplY3QgbmV3Q29udGFpbmVyLAotCQkJaW50IG5ld0NvbnRhaW5lckZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlSZXNvdXJjZS5JbnRlcm5hbCBvbGRSZXNvdXJjZSA9IHRoaXMuZURpcmVjdFJlc291cmNlKCk7Ci0JCVJlc291cmNlLkludGVybmFsIG5ld1Jlc291cmNlID0gbmV3Q29udGFpbmVyID09IG51bGwgPyBudWxsCi0JCQkJOiBuZXdDb250YWluZXIuZUludGVybmFsUmVzb3VyY2UoKTsKLQkJLy8gaWYgKG9sZFJlc291cmNlICE9IG5ld1Jlc291cmNlICYmIG9sZFJlc291cmNlICE9IG51bGwpIHsKLQkJLy8gcmVtb3ZlQ2hpbGRSZXNvdXJjZXMoKTsKLQkJLy8gfQotCi0JCWludCBvbGRJbmRleCA9IC0xOwotCQlpbnQgb2xkU2l6ZSA9IC0xOwotCQlpZiAob2xkUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJb2xkSW5kZXggPSBvbGRSZXNvdXJjZS5nZXRDb250ZW50cygpLmluZGV4T2YodGhpcyk7Ci0JCQlvbGRTaXplID0gb2xkUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5zaXplKCk7Ci0JCX0KLQotCQlOb3RpZmljYXRpb25DaGFpbiBtZXNzYWdlcyA9IHN1cGVyLmVCYXNpY1NldENvbnRhaW5lcihuZXdDb250YWluZXIsCi0JCQkJbmV3Q29udGFpbmVyRmVhdHVyZUlELCBtc2dzKTsKLQkJaWYgKG9sZFJlc291cmNlICE9IG5ld1Jlc291cmNlICYmIG9sZFJlc291cmNlICE9IG51bGwpIHsKLQkJCS8vIHJlbW92ZSBhbnkgbmV3bHkgYWRkZWQgTW9kaWZpY2F0aW9uVHJhY2tpbmdBZGFwdGVycyBmcm9tIHRoaXMKLQkJCS8vIG9iamVjdCdzIGFkYXB0ZXIgbGlzdAotCQkJLy8KLQkJCWlmIChuZXdSZXNvdXJjZSAhPSBudWxsKQotCQkJCW5ld1Jlc291cmNlLmRldGFjaGVkKHRoaXMpOwotCi0JCQkvLyBPdmVycmlkZSB0aGUgZGVmYXVsdCBzZW1hbnRpYzogTXVsdGlSZXNvdXJjZUVPYmplY3QgaXMgYWxsb3dlZCB0bwotCQkJLy8gYmUgb3duZWQgYnkgYm90aCBjb250YWluZXIgYW5kIHJlc291cmNlLgotCQkJLy8gQWRkIHRoaXMgb2JqZWN0IGJhY2sgdG8gdGhlIG9sZCByZXNvdXJjZS4KLQkJCS8vCi0JCQlCYXNpY0VMaXN0IGNvbnRlbnRzID0gKChCYXNpY0VMaXN0KSBvbGRSZXNvdXJjZS5nZXRDb250ZW50cygpKTsKLQkJCWlmIChvbGRTaXplICE9IGNvbnRlbnRzLnNpemUoKSkgewotCQkJCS8vIHRoaXMgb2JqZWN0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcmVzb3VyY2UncyBjb250ZW50cwotCQkJCS8vIGFkZCBpdCBiYWNrCi0JCQkJLy8KLQkJCQlpZiAoY29udGVudHMuaXNFbXB0eSgpKSB7Ci0JCQkJCS8vIHRoaXMgd2lsbCBmbGFnIHJlc291cmNlIGFzIGxvYWRlZAotCQkJCQkvLwotCQkJCQljb250ZW50cy5jbGVhcigpOwotCQkJCQljb250ZW50cy5zZXREYXRhKDEsIG5ldyBPYmplY3RbXSB7IHRoaXMgfSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJT2JqZWN0W10gZGF0YSA9IGNvbnRlbnRzLnRvQXJyYXkoKTsKLQkJCQkJT2JqZWN0W10gbmV3RGF0YSA9IG5ldyBPYmplY3RbZGF0YS5sZW5ndGggKyAxXTsKLQkJCQkJaWYgKG9sZEluZGV4ID4gMCkgewotCQkJCQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCBuZXdEYXRhLCAwLCBvbGRJbmRleCk7Ci0JCQkJCX0KLQkJCQkJbmV3RGF0YVtvbGRJbmRleF0gPSB0aGlzOwotCQkJCQlpZiAob2xkSW5kZXggPCBkYXRhLmxlbmd0aCkgewotCQkJCQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCBvbGRJbmRleCwgbmV3RGF0YSwgb2xkSW5kZXggKyAxLAotCQkJCQkJCQlkYXRhLmxlbmd0aCAtIG9sZEluZGV4KTsKLQkJCQkJfQotCQkJCQljb250ZW50cy5zZXREYXRhKG5ld0RhdGEubGVuZ3RoLCBuZXdEYXRhKTsKLQkJCQl9Ci0JCQl9Ci0JCQllU2V0UmVzb3VyY2Uob2xkUmVzb3VyY2UpOwotCQkJLy8gZG9uJ3QgaGF2ZSB0byByZS1hdHRhY2ggdGhpcyBvYmplY3QgdG8gb2xkUmVzb3VyY2Ugc2luY2UgaXQgd2FzCi0JCQkvLyBub3QgZGV0dGFjaGVkIGluIHN1cGVyIG1ldGhvZAotCQkJLy8KLQkJCS8vIG9sZFJlc291cmNlLmF0dGFjaGVkKHRoaXMpOwotCi0JCQkvLyBpZihuZXdSZXNvdXJjZSAhPSBudWxsKSBuZXdSZXNvdXJjZS5hdHRhY2hlZCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZXM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29udGFpbmVyIGFuZCBjb250YWluZXIgZmVhdHVyZSBJRCBmb3IgdGhpcyBvYmplY3Qgb25seSBpZiBpdCBpcwotCSAqIG5vdCBjb250YWluZWQgYnkgYW55IGNvbnRhaW5lci4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkJhc2ljRU9iamVjdEltcGwjZUJhc2ljU2V0Q29udGFpbmVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgZVNldENvbnRhaW5lcihJbnRlcm5hbEVPYmplY3QgbmV3Q29udGFpbmVyLAotCQkJaW50IG5ld0NvbnRhaW5lckZlYXR1cmVJRCkgewotCQlpZiAoZUNvbnRhaW5lcigpICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCXN1cGVyLmVCYXNpY1NldENvbnRhaW5lcihuZXdDb250YWluZXIsIG5ld0NvbnRhaW5lckZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5CYXNpY0VPYmplY3RJbXBsI2VCYXNpY1NldENvbnRhaW5lcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVCYXNpY1NldENvbnRhaW5lcihJbnRlcm5hbEVPYmplY3QgbmV3Q29udGFpbmVyLAotCQkJaW50IG5ld0NvbnRhaW5lckZlYXR1cmVJRCkgewotCQlzdXBlci5lQmFzaWNTZXRDb250YWluZXIobmV3Q29udGFpbmVyLCBuZXdDb250YWluZXJGZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbnRhaW5pbmcgcmVzb3VyY2UgZm9yIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSByZXMKLQkgKiAgICAgICAgICAgIGEgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0UmVzb3VyY2UoUmVzb3VyY2UuSW50ZXJuYWwgcmVzKSB7Ci0JCWVQcm9wZXJ0aWVzKCkuc2V0RVJlc291cmNlKHJlcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5CYXNpY0VPYmplY3RJbXBsI2VEaXJlY3RSZXNvdXJjZSgpCi0JICovCi0JcHVibGljIEludGVybmFsIGVEaXJlY3RSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmVEaXJlY3RSZXNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc29sdmVkIG9iamVjdCByZXByZXNlbnRlZCBieSBwcm94eS4gUHJveHkgY2hhaW5zIGFyZQotCSAqIGZvbGxvd2VkLiBJZiByZXNvdXJjZVNldCBpcyBudWxsLCB0aGUgZ2xvYmFsIHBhY2thZ2UgcmVnaXN0cnkgaXMKLQkgKiBjb25zdWx0ZWQgdG8gb2J0YWluIGEgcGFja2FnZSByZWdpc3RlcmVkIGFnYWluc3QgdGhlIHByb3h5IFVSSSwgbGVzcyBpdHMKLQkgKiBmcmFnbWVudCwgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHRoZSBkZWZhdWx0IHJlc291cmNlIHNldCBpbXBsZW1lbnRhdGlvbidzCi0JICogZmFsbGJhY2sgYmVoYXZpb3VyLgotCSAqIAotCSAqIEBwYXJhbSBwcm94eQotCSAqICAgICAgICAgICAgdGhlIHByb3h5IHRvIGJlIHJlc29sdmVkLgotCSAqIEBwYXJhbSByZXNvdXJjZVNldAotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIHNldCBpbiB3aGljaCB0byByZXNvbHZlLgotCSAqIEByZXR1cm4gdGhlIHJlc29sdmVkIG9iamVjdCwgb3IgdGhlIHByb3h5IGlmIHVuYWJsZSB0byByZXNvbHZlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsI3Jlc29sdmUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQpCi0JICovCi0JcHJpdmF0ZSBFT2JqZWN0IHJlc29sdmVQcm94eShFT2JqZWN0IHByb3h5KSB7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZVJlc291cmNlKCkgIT0gbnVsbCA/IGVSZXNvdXJjZSgpCi0JCQkJLmdldFJlc291cmNlU2V0KCkgOiBudWxsOwotCi0JCVVSSSBwcm94eVVSSSA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcm94eSkuZVByb3h5VVJJKCk7Ci0JCWlmIChwcm94eVVSSSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUVPYmplY3QgcmVzb2x2ZWRPYmplY3QgPSBudWxsOwotCi0JCQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgSVVtYVJlc291cmNlU2V0KSB7Ci0JCQkJCQlyZXNvbHZlZE9iamVjdCA9ICgoSVVtYVJlc291cmNlU2V0KSByZXNvdXJjZVNldCkKLQkJCQkJCQkJLmdldEVPYmplY3QodGhpcywgcHJveHlVUkksIHRydWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVzb2x2ZWRPYmplY3QgPSByZXNvdXJjZVNldC5nZXRFT2JqZWN0KHByb3h5VVJJLCB0cnVlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUVQYWNrYWdlIGVQYWNrYWdlID0gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0RVBhY2thZ2UocHJveHlVUkkudHJpbUZyYWdtZW50KCkudG9TdHJpbmcoKSk7Ci0JCQkJCWlmIChlUGFja2FnZSAhPSBudWxsKSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVQYWNrYWdlLmVSZXNvdXJjZSgpOwotCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQlyZXNvbHZlZE9iamVjdCA9IHJlc291cmNlLmdldEVPYmplY3QocHJveHlVUkkKLQkJCQkJCQkJCS5mcmFnbWVudCgpLnRvU3RyaW5nKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKHJlc29sdmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCQkJaWYocmVzb2x2ZWRPYmplY3QgIT0gcHJveHkpIHsKLS8vCQkJCQkJcmV0dXJuIHJlc29sdmVQcm94eShyZXNvbHZlZE9iamVjdCk7Ci0JCQkJCQlyZXR1cm4gcmVzb2x2ZWRPYmplY3Q7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIpIHsKLQkJCQkJCSgoSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyKSByZXNvdXJjZVNldCkKLQkJCQkJCQkJLm5vdGlmeUV4Y2VwdGlvbihuZXcgUmVzb2x2ZUV4Y2VwdGlvbihwcm94eSwKLQkJCQkJCQkJCQkoU3RyaW5nKSBudWxsLCB0aGlzKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIElQcm94eVJlc29sdXRpb25MaXN0ZW5lcikgewotCQkJCQkoKElQcm94eVJlc29sdXRpb25MaXN0ZW5lcikgcmVzb3VyY2VTZXQpCi0JCQkJCQkJLm5vdGlmeUV4Y2VwdGlvbihuZXcgUmVzb2x2ZUV4Y2VwdGlvbihwcm94eSwKLQkJCQkJCQkJCWV4Y2VwdGlvbiwgdGhpcykpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJveHk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0I2VSZXNvbHZlUHJveHkob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBlUmVzb2x2ZVByb3h5KEludGVybmFsRU9iamVjdCBwcm94eSkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9IHByb3h5LmVDb250YWluZXIoKTsKLQkJaW50IGZlYXR1cmVJRCA9IHByb3h5LmVDb250YWluZXJGZWF0dXJlSUQoKTsKLQkJRU9iamVjdCByZXN1bHQgPSBudWxsOwotCi0JCXJlc3VsdCA9IHJlc29sdmVQcm94eShwcm94eSk7Ci0KLQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdCBpbnN0YW5jZW9mIE11bHRpUmVzb3VyY2VFT2JqZWN0KSB7Ci0JCQlpZiAocHJveHkuZUlzUHJveHkoKSAmJiByZXN1bHQgPT0gcHJveHkpIHsKLQkJCQkvLyBwcm94eSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQKLQkJCQkvLwotCQkJCSgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc3VsdCkudmFsaWQgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJKChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzdWx0KS52YWxpZCA9IHRydWU7Ci0KLQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQkJKChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzdWx0KS5lU2V0Q29udGFpbmVyKAotCQkJCQkJCShJbnRlcm5hbEVPYmplY3QpIGNvbnRhaW5lciwgZmVhdHVyZUlEKTsKLQkJCQl9Ci0KLQkJCQkvLyBtZXJnZSB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBtYXAKLQkJCQkvLwotCQkJCWlmIChyZXN1bHQgIT0gcHJveHkpIHsKLQkJCQkJaWYocHJveHkgaW5zdGFuY2VvZiBNdWx0aVJlc291cmNlRU9iamVjdCkgewotCQkJCQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXlPYmogPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHByb3h5OwotCi0JCQkJCQlpZiAobXlPYmoub3Bwb3NpdGVGZWF0dXJlTWFwICE9IG51bGwKLQkJCQkJCQkJJiYgIW15T2JqLm9wcG9zaXRlRmVhdHVyZU1hcC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlNYXAgbmV3TWFwID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzdWx0KQotCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBteU9iai5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKQotCQkJCQkJCQkJLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQkJCQlpZiAoZW50cnkuZ2V0VmFsdWUoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gKE9wcG9zaXRlRmVhdHVyZSkgZW50cnkKLQkJCQkJCQkJCS5nZXRLZXkoKTsKLQkJCQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkJCQlMaXN0IHZhbHVlcyA9IChMaXN0KSBuZXdNYXAKLQkJCQkJCQkJCQkuZ2V0KG9wcG9zaXRlRmVhdHVyZSk7Ci0JCQkJCQkJCQkJaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJCW5ld01hcC5wdXQob3Bwb3NpdGVGZWF0dXJlLCBlbnRyeQotCQkJCQkJCQkJCQkJCS5nZXRWYWx1ZSgpKTsKLQkJCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCQl2YWx1ZXMuYWRkQWxsKChDb2xsZWN0aW9uKSBlbnRyeQotCQkJCQkJCQkJCQkJCS5nZXRWYWx1ZSgpKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCW5ld01hcC5wdXQob3Bwb3NpdGVGZWF0dXJlLCBlbnRyeQotCQkJCQkJCQkJCQkJLmdldFZhbHVlKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCW15T2JqLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmNsZWFyKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZVJlc291cmNlKCkgIT0gbnVsbCA/IGVSZXNvdXJjZSgpCi0JCQkJCQkJLmdldFJlc291cmNlU2V0KCkgOiBudWxsOwotCQkJCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIpIHsKLQkJCQkJCSgoSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyKSByZXNvdXJjZVNldCkucHJveHlSZXNvbHZlZCgKLQkJCQkJCQkJcHJveHksIHJlc3VsdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgY3JlYXRlT3Bwb3NpdGVGZWF0dXJlTWFwKCkgewotCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gT3Bwb3NpdGVGZWF0dXJlLmNsYXNzT3Bwb3NpdGVGZWF0dXJlc01hcAotCQkJCS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlDbGFzcyBjbHMgPSAoQ2xhc3MpIGVudHJ5LmdldEtleSgpOwotCQkJaWYgKGNscy5pc0luc3RhbmNlKHRoaXMpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKSkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCW1hcC5wdXQoaXRlcmF0b3IubmV4dCgpLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG1hcC5pc0VtcHR5KCkpIHsKLQkJCWhhc09wcG9zaXRlRmVhdHVyZSA9IGZhbHNlOwotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wcG9zaXRlIGZlYXR1cmUgbWFwLgotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgY29udGFpbmluZyB0aGUgb3Bwb3NpdGUgZmVhdHVyZXMgbWFwcGVkIHRvIHRoZWlyIHZhbHVlcwotCSAqLwotCXB1YmxpYyBNYXAgZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkgewotCQlpZiAob3Bwb3NpdGVGZWF0dXJlTWFwID09IG51bGwgJiYgaGFzT3Bwb3NpdGVGZWF0dXJlKSB7Ci0JCQlvcHBvc2l0ZUZlYXR1cmVNYXAgPSBjcmVhdGVPcHBvc2l0ZUZlYXR1cmVNYXAoKTsKLQkJfQotCQlpZihvcHBvc2l0ZUZlYXR1cmVNYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJfQotCQlyZXR1cm4gb3Bwb3NpdGVGZWF0dXJlTWFwOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wcG9zaXRlIGZlYXR1cmUgbWFwLgotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgY29udGFpbmluZyB0aGUgb3Bwb3NpdGUgZmVhdHVyZXMgbWFwcGVkIHRvIHRoZWlyIHZhbHVlcyBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBvYmplY3QgZG9lcyBub3QgaGF2ZSBhbnkgb3Bwb3NpdGUKLQkgKiAgICAgICAgIGZlYXR1cmUgb3IgdGhlIG1hcCBoYXMgbm90IGJlZW4gY3JlYXRlZAotCSAqLwotCXB1YmxpYyBNYXAgYmFzaWNHZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKSB7Ci0JCXJldHVybiBvcHBvc2l0ZUZlYXR1cmVNYXA7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdmFsdWUgb2YgYW4gb3Bwb3NpdGUgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgYW4gb3Bwb3NpdGUgZmVhdHVyZQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgb3Bwb3NpdGUgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUpIHsKLQkJT2JqZWN0IHZhbHVlID0gZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZ2V0KGZlYXR1cmUpOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGlSZXNvdXJjZUVPYmplY3QuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoKToiKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgZmVhdHVyZTogIiArIGZlYXR1cmUpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiB2YWx1ZTogIiArIHZhbHVlKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgdGhpczogIiArIHRoaXMpOwotCi0JCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJfQotCi0JCQlyZXR1cm4gKChPcHBvc2l0ZUZlYXR1cmVSZXNvbHZpbmdFTGlzdCkgdmFsdWUpCi0JCQkJCS5nZXRVbm1vZGlmaWFibGVMaXN0KCk7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJJiYgKChFT2JqZWN0KSB2YWx1ZSkuZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KGZlYXR1cmUsIG51bGwpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QKLQkJCQkmJiAoKEludGVybmFsRU9iamVjdCkgdmFsdWUpLmVJc1Byb3h5KCkpIHsKLQkJCUVPYmplY3QgcmVzb2x2ZWQgPSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHZhbHVlKTsKLQkJCWlmIChyZXNvbHZlZCAhPSB2YWx1ZSkgewotCQkJCWdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dChmZWF0dXJlLCByZXNvbHZlZCk7Ci0JCQkJdmFsdWUgPSByZXNvbHZlZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVzb3VyY2UgYXQgYSBnaXZlbiBsb2NhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZSBsb2NhdGlvbgotCSAqIEByZXR1cm4gYSByZXNvdXJjZSBpbiB0aGUgd29ya3NwYWNlCi0JICovCi0JcHVibGljIHN0YXRpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKLQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChsb2NhdGlvbik7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZTsKLQkJRmlsZSBmaWxlID0gIG5ldyBGaWxlKGxvY2F0aW9uKTsKLQkJaWYgKGZpbGUuaXNGaWxlKCkpIHsKLQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIHBhcmVudFJlc291cmNlID0gZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihmaWxlCi0JCQkJCQkuZ2V0UGFyZW50KCkpOwotCQkJCWlmKHBhcmVudFJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBhcmVudFJlc291cmNlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl9Ci0JCQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldENvbnRhaW5lckZvckxvY2F0aW9uKHBhdGgpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLS8vCS8qIChub24tSmF2YWRvYykKLS8vCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0vLwkgKi8KLS8vCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0vLwkJaWYoYWRhcHRlciA9PSBJUmVzb3VyY2UuY2xhc3MpIHsKLS8vCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlUmVzb3VyY2UoKTsKLS8vCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotLy8JCQkJcmV0dXJuIGdldFJlc291cmNlRm9yTG9jYXRpb24ocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiBudWxsOwotLy8JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIG9wcG9zaXRlIGZlYXR1cmVzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc3lzdGVtLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21BbGxPcHBvc2l0ZUZlYXR1cmVzKCkgewotCQkvLyBmaW5kIGFsbCBmZWF0dXJlcyB0aGF0IGhhdmUgb3Bwb3NpdGUgZmVhdHVyZXMgYW5kIGNsZWFyIHRob3NlCi0JCS8vIGZlYXR1cmVzLiBUaGlzIHdpbGwgcmVtb3ZlIHRoZSByZWZlcmVuY2VzIHRvCi0JCS8vIHVubG9hZGVkIG9iamVjdCBieSB0aG9zZSBvcHBvc2l0ZSBmZWF0dXJlcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gT3Bwb3NpdGVGZWF0dXJlLmdldE9wcG9zaXRlRmVhdHVyZShyZWYpOwotCQkJaWYob3Bwb3NpdGVGZWF0dXJlICE9IG51bGwpIHsKLQkJCQlpZihyZWYuaXNNYW55KCkpIHsKLQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpIGVHZXQocmVmLCBmYWxzZSk7CQkJCQkKLQkJCQkJaWYoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQlpZighb3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJCQkJbGlzdC5jbGVhcigpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZihsaXN0IGluc3RhbmNlb2YgSW50ZXJuYWxFTGlzdCkgewotCQkJCQkJCUxpc3QgYmFzaWNMaXN0ID0gKChJbnRlcm5hbEVMaXN0KWxpc3QpLmJhc2ljTGlzdCgpOwotCQkJCQkJCWZvcihpbnQgaSA9IGJhc2ljTGlzdC5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCQkJCQlFT2JqZWN0IGUgPSAoRU9iamVjdCkgYmFzaWNMaXN0LmdldChpKTsKLQkJCQkJCQkJaWYoIWUuZUlzUHJveHkoKSkgewotCQkJCQkJCQkJbGlzdC5yZW1vdmUoZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBlR2V0KHJlZiwgZmFsc2UpOwotCQkJCQlpZihlICE9IG51bGwgJiYgIWUuZUlzUHJveHkoKSkgewotCQkJCQkJZVNldChyZWYsIG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSU1vZGVsT2JqZWN0I2dldE9wcG9zaXRlRmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE9wcG9zaXRlRmVhdHVyZXMoKSB7Ci0JCXJldHVybiBnZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5rZXlTZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSU1vZGVsT2JqZWN0I2dldERlZmF1bHRWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAuZ2V0KGZlYXR1cmUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRGZWF0dXJlc1dpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoKSB7Ci0JCWlmIChmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAuaXNFbXB0eSgpKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCQotCQlpZihmZWF0dXJlc1dpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUgPT0gbnVsbCkgewotCQkJZmVhdHVyZXNXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJCWlmKGVDbGFzcygpLmdldEZlYXR1cmVJRChmZWF0dXJlKSAhPSAtMSkgewotCQkJCQlmZWF0dXJlc1dpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUuYWRkKGZlYXR1cmUpOwotCQkJCX0KLQkJCX0KLQkJCWlmKGZlYXR1cmVzV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZS5pc0VtcHR5KCkpIHsKLQkJCQlmZWF0dXJlc1dpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJfQotCQl9Ci0JCXJldHVybiBmZWF0dXJlc1dpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWU7Ci0JfQotCQotCS8qKgotCSAqIFVucmVnaXN0ZXJzIGEgZmVhdHVyZSB3aG9zZSBkZWZhdWx0IHZhbHVlIGhhcyBiZWVuIG92ZXJyaWRlbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgYSBmZWF0dXJlCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlpZihmZWF0dXJlc1dpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlmZWF0dXJlc1dpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUucmVtb3ZlKGZlYXR1cmUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgYWxsIGZlYXR1cmVzIGlmIAotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCkgewotCQlDb2xsZWN0aW9uIGZlYXR1cmVzID0gZ2V0RmVhdHVyZXNXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKCk7Ci0JCWlmKGZlYXR1cmVzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQllU2V0KGZlYXR1cmUsIGdldERlZmF1bHRWYWx1ZShmZWF0dXJlKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZSgKLQkJCWludCBmZWF0dXJlSUQpIHsKLQkJQ29sbGVjdGlvbiBmZWF0dXJlcyA9IGdldEZlYXR1cmVzV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZSgpOwotCQlpZighZmVhdHVyZXMuaXNFbXB0eSgpKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgKLQkJCQkJZmVhdHVyZUlEKTsKLQkJCWlmKGZlYXR1cmUgIT0gbnVsbCAmJiBmZWF0dXJlcy5jb250YWlucyhmZWF0dXJlKSkgewotCQkJCXJldHVybiBmZWF0dXJlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJT2JqZWN0IGRlZmF1bHRWYWx1ZSA9IGdldERlZmF1bHRWYWx1ZShmZWF0dXJlKTsKLQkJT2JqZWN0IHZhbHVlID0gZUdldChmZWF0dXJlLCBmYWxzZSk7Ci0JCWlmKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCXJldHVybiB2YWx1ZSAhPSBudWxsICYmICEoKENvbGxlY3Rpb24pIHZhbHVlKS5pc0VtcHR5KCkKLQkJCQkJJiYgdmFsdWUgIT0gZGVmYXVsdFZhbHVlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGRlZmF1bHRWYWx1ZSA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFkZWZhdWx0VmFsdWUKLQkJCQkJLmVxdWFscyh2YWx1ZSk7Ci0JCX0KLQkJfQotCX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvaW1wbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvaW1wbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAyZTYyMjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL2ltcGwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgVU1BIEVjb3JlIGV4dGVuc2lvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzVjYTkwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRoZSBVTUEgRWNvcmUgZXh0ZW5zaW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL0VPYmplY3RDb250YWlubWVudFJlc29sdmluZ0VMaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9FT2JqZWN0Q29udGFpbm1lbnRSZXNvbHZpbmdFTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmY2JlNmRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL0VPYmplY3RDb250YWlubWVudFJlc29sdmluZ0VMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFT2JqZWN0Q29udGFpbm1lbnRSZXNvbHZpbmdFTGlzdCBleHRlbmRzIEVPYmplY3RDb250YWlubWVudEVMaXN0IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUzNDk4MzM2MzA1NTE5NzY0ODhMOwotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBVbnNldHRhYmxlIGV4dGVuZHMgRU9iamVjdENvbnRhaW5tZW50UmVzb2x2aW5nRUxpc3QgewotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MTE3MDA0MTUxNDc2NTIyNzE5TDsKLQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NldDsKLQotCQlwdWJsaWMgVW5zZXR0YWJsZShDbGFzcyBkYXRhQ2xhc3MsIEludGVybmFsRU9iamVjdCBvd25lciwgaW50IGZlYXR1cmVJRCkgewotCQkJc3VwZXIoZGF0YUNsYXNzLCBvd25lciwgZmVhdHVyZUlEKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGRpZENoYW5nZSgpIHsKLQkJCWlzU2V0ID0gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzU2V0KCkgewotCQkJcmV0dXJuIGlzU2V0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdW5zZXQoKSB7Ci0JCQlzdXBlci51bnNldCgpOwotCQkJaWYgKGlzTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJCWJvb2xlYW4gb2xkSXNTZXQgPSBpc1NldDsKLQkJCQlpc1NldCA9IGZhbHNlOwotCQkJCW93bmVyLmVOb3RpZnkoY3JlYXRlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbi5VTlNFVCwgb2xkSXNTZXQsCi0JCQkJCQlmYWxzZSkpOwotCQkJfSBlbHNlIHsKLQkJCQlpc1NldCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIEVPYmplY3RDb250YWlubWVudFJlc29sdmluZ0VMaXN0KENsYXNzIGRhdGFDbGFzcywKLQkJCUludGVybmFsRU9iamVjdCBvd25lciwgaW50IGZlYXR1cmVJRCkgewotCQlzdXBlcihkYXRhQ2xhc3MsIG93bmVyLCBmZWF0dXJlSUQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGhhc1Byb3hpZXMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QjcmVzb2x2ZShpbnQsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVzb2x2ZShpbnQgaW5kZXgsIE9iamVjdCBvYmplY3QpIHsKLQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgZU9iaiA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb2x2ZShpbmRleCwKLQkJCQkoRU9iamVjdCkgb2JqZWN0KTsKLQkJZU9iai5lU2V0Q29udGFpbmVyKG93bmVyLCBJbnRlcm5hbEVPYmplY3QuRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCS0gZ2V0RmVhdHVyZUlEKCkpOwotCQlyZXR1cm4gZU9iajsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlRUxpc3QjY29udGFpbnMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpc0VPYmplY3QoKSkgewotCQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5jb250YWlucyhvYmplY3QpOwotCQkJaWYgKGhhc1Byb3hpZXMoKSAmJiAhcmVzdWx0KSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLQkJCQkJRU9iamVjdCBlT2JqZWN0ID0gcmVzb2x2ZVByb3h5KChFT2JqZWN0KSBkYXRhW2ldKTsKLQkJCQkJaWYgKGVPYmplY3QgPT0gb2JqZWN0KSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNvbnRhaW5zKG9iamVjdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9FT2JqZWN0Q29udGFpbm1lbnRSZXNvbHZpbmdXaXRoSW52ZXJzZUVMaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9FT2JqZWN0Q29udGFpbm1lbnRSZXNvbHZpbmdXaXRoSW52ZXJzZUVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJiMDNkMTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvRU9iamVjdENvbnRhaW5tZW50UmVzb2x2aW5nV2l0aEludmVyc2VFTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFT2JqZWN0Q29udGFpbm1lbnRSZXNvbHZpbmdXaXRoSW52ZXJzZUVMaXN0IGV4dGVuZHMKLQkJRU9iamVjdENvbnRhaW5tZW50UmVzb2x2aW5nRUxpc3QgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTEyMjE3NzA4MTY1NzE3MTg1N0w7Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFVuc2V0dGFibGUgZXh0ZW5kcwotCQkJRU9iamVjdENvbnRhaW5tZW50UmVzb2x2aW5nV2l0aEludmVyc2VFTGlzdCB7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgyMzkyOTQ1Njg2NzYyNzAwNzhMOwotCi0JCXByb3RlY3RlZCBib29sZWFuIGlzU2V0OwotCi0JCXB1YmxpYyBVbnNldHRhYmxlKENsYXNzIGRhdGFDbGFzcywgSW50ZXJuYWxFT2JqZWN0IG93bmVyLAotCQkJCWludCBmZWF0dXJlSUQsIGludCBpbnZlcnNlRmVhdHVyZUlEKSB7Ci0JCQlzdXBlcihkYXRhQ2xhc3MsIG93bmVyLCBmZWF0dXJlSUQsIGludmVyc2VGZWF0dXJlSUQpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgZGlkQ2hhbmdlKCkgewotCQkJaXNTZXQgPSB0cnVlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNTZXQoKSB7Ci0JCQlyZXR1cm4gaXNTZXQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB1bnNldCgpIHsKLQkJCXN1cGVyLnVuc2V0KCk7Ci0JCQlpZiAoaXNOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQkJYm9vbGVhbiBvbGRJc1NldCA9IGlzU2V0OwotCQkJCWlzU2V0ID0gZmFsc2U7Ci0JCQkJb3duZXIuZU5vdGlmeShjcmVhdGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uLlVOU0VULCBvbGRJc1NldCwKLQkJCQkJCWZhbHNlKSk7Ci0JCQl9IGVsc2UgewotCQkJCWlzU2V0ID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgaW50IGludmVyc2VGZWF0dXJlSUQ7Ci0KLQlwdWJsaWMgRU9iamVjdENvbnRhaW5tZW50UmVzb2x2aW5nV2l0aEludmVyc2VFTGlzdChDbGFzcyBkYXRhQ2xhc3MsCi0JCQlJbnRlcm5hbEVPYmplY3Qgb3duZXIsIGludCBmZWF0dXJlSUQsIGludCBpbnZlcnNlRmVhdHVyZUlEKSB7Ci0JCXN1cGVyKGRhdGFDbGFzcywgb3duZXIsIGZlYXR1cmVJRCk7Ci0JCXRoaXMuaW52ZXJzZUZlYXR1cmVJRCA9IGludmVyc2VGZWF0dXJlSUQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTmF2aWdhYmxlSW52ZXJzZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGludCBnZXRJbnZlcnNlRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gaW52ZXJzZUZlYXR1cmVJRDsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0SW52ZXJzZUZlYXR1cmVDbGFzcygpIHsKLQkJcmV0dXJuIGRhdGFDbGFzczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL0V2ZW50VHlwZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL0V2ZW50VHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjYyMTUzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9FdmVudFR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLS8qKgotICogRGVmaW5lcyBhZGRpdGlvbmFsIG5vdGlmaWNhdGlvbiBldmVudCB0eXBlcy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFdmVudFR5cGVzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BS0VfUFJPWFkgPSBOb3RpZmljYXRpb24uRVZFTlRfVFlQRV9DT1VOVCArIDE7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL09wcG9zaXRlRmVhdHVyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvT3Bwb3NpdGVGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxNDYyYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvT3Bwb3NpdGVGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiBTdXBwb3J0cyB0aGUgcmV2ZXJzZSB0cmF2ZXJzYWwgb2YgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiB0d28gbW9kZWwgb2JqZWN0cy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3Bwb3NpdGVGZWF0dXJlIHsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSB0YXJnZXRGZWF0dXJlOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzTWFueTsKLQotCXByaXZhdGUgYm9vbGVhbiByZXNvbHZlT3duZXIgPSB0cnVlOwotCi0JcHJpdmF0ZSBDbGFzcyBvd25lckNsYXNzOwotCi0JLy9wcml2YXRlIHN0YXRpYyBib29sZWFuIGRlbGl2ZXJPblJlc29sdmU7Ci0KLQkvKioKLQkgKiBNYXBzIHNvdXJjZSBtb2RlbCBvYmplY3RzIHRvIE9wcG9zaXRlRmVhdHVyZSBvYmplY3RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWFwIGNsYXNzT3Bwb3NpdGVGZWF0dXJlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBNYXBzIEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3RzIHRvIE9wcG9zaXRlRmVhdHVyZSBvYmplY3RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWFwIGZlYXR1cmVPcHBvc2l0ZUZlYXR1cmVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXJDbGFzcwotCSAqICAgICAgICAgICAgdGhlIG1vZGVsIGNsYXNzIHRoYXQgb3ducyB0aGlzIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhpcyBvcHBvc2l0ZSBmZWF0dXJlCi0JICogQHBhcmFtIHRhcmdldEZlYXR1cmUKLQkgKiAgICAgICAgICAgIHRoZSBmZWF0dXJlIHdoaWNoIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZSBpcyBiYXNlZCBvbgotCSAqIEBwYXJhbSBpc01hbnkKLQkgKiAgICAgICAgICAgIGlmIDx0cnVlPiwgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgYXNzb2NpYXRpb24gaXMgdW5ib3VuZGVkCi0JICogQHBhcmFtIHJlc29sdmVPd25lcgotCSAqICAgICAgICAgICAgaWYgPHRydWU+LCByZXNvbHZlIHRoZSBvd25lciBjbGFzcyBpZiBpdCBpcyBhIHByb3h5Ci0JICovCi0JcHVibGljIE9wcG9zaXRlRmVhdHVyZShDbGFzcyBvd25lckNsYXNzLCBTdHJpbmcgbmFtZSwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSB0YXJnZXRGZWF0dXJlLCBib29sZWFuIGlzTWFueSwKLQkJCWJvb2xlYW4gcmVzb2x2ZU93bmVyKSB7Ci0JCXRoaXMub3duZXJDbGFzcyA9IG93bmVyQ2xhc3M7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMudGFyZ2V0RmVhdHVyZSA9IHRhcmdldEZlYXR1cmU7Ci0JCXRoaXMuaXNNYW55ID0gaXNNYW55OwotCQl0aGlzLnJlc29sdmVPd25lciA9IHJlc29sdmVPd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBvd25lckNsYXNzCi0JICogICAgICAgICAgICB0aGUgbW9kZWwgY2xhc3MgdGhhdCBvd25zIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGlzIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiBAcGFyYW0gdGFyZ2V0RmVhdHVyZQotCSAqICAgICAgICAgICAgdGhlIGZlYXR1cmUgd2hpY2ggdGhpcyBvcHBvc2l0ZSBmZWF0dXJlIGlzIGJhc2VkIG9uCi0JICogQHBhcmFtIGlzTWFueQotCSAqICAgICAgICAgICAgaWYgPHRydWU+LCB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSBhc3NvY2lhdGlvbiBpcyB1bmJvdW5kZWQKLQkgKi8KLQlwdWJsaWMgT3Bwb3NpdGVGZWF0dXJlKENsYXNzIG93bmVyQ2xhc3MsIFN0cmluZyBuYW1lLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHRhcmdldEZlYXR1cmUsIGJvb2xlYW4gaXNNYW55KSB7Ci0JCXRoaXMob3duZXJDbGFzcywgbmFtZSwgdGFyZ2V0RmVhdHVyZSwgaXNNYW55LCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtb2RhbCBjbGFzcyB0aGF0IG93bnMgdGhpcyBvcHBvc2l0ZSBmZWF0dXJlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZGFsIGNsYXNzIHRoYXQgb3ducyB0aGlzIG9wcG9zaXRlIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0T3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIG93bmVyQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGFzc29jaWF0aW9uIGlzIHVuYm91bmRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhc3NvY2lhdGlvbiBpcyB1bmJvdW5kZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01hbnkoKSB7Ci0JCXJldHVybiBpc01hbnk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmFtZSBvZiB0aGlzIG9wcG9zaXRlIGZlYXR1cmUuCi0JICogCi0JICogQHJldHVybiB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBmZWF0dXJlIHdoaWNoIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZSBpcyBiYXNlZCBvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvcmlnaW5hbCBmZWF0dXJlIGdlbmVyYXRlZCBieSBFTUYKLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldFRhcmdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiB0YXJnZXRGZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIElEIG9mIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIElECi0JICovCi0JcHVibGljIGludCBnZXRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiAtMSAtIHRhcmdldEZlYXR1cmUuZ2V0RmVhdHVyZUlEKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIG93bmVyIGNsYXNzIG9mIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZSwgaWYgcHJveGllZCwKLQkgKiBzaG91bGQgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgdGFyZ2V0IGZlYXR1cmUgaXMgc2V0LgotCSAqIAotCSAqIEByZXR1cm4gPHRydWU+IGlmIHRoZSBvd25lciBjbGFzcywgaWYgcHJveGllZCwgc2hvdWxkIGJlIHJlc29sdmVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVzb2x2ZU93bmVyKCkgewotCQlyZXR1cm4gcmVzb2x2ZU93bmVyOwotCX0KLQotCS8qKgotCSAqIEdldHMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvcHBvc2l0ZSBmZWF0dXJlLgotCSAqIAotCSAqIEByZXR1cm4gQSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGtleSBhdHRyaWJ1dGVzIG9mIHRoaXMKLQkgKiAgICAgICAgIG9wcG9zaXRlIGZlYXR1cmUuCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIG5hbWUgKyAiW3RhcmdldEZlYXR1cmU9IiArIHRhcmdldEZlYXR1cmUgLy8kTk9OLU5MUy0xJAotCQkJCSsgIiwgaXNNYW55PSIgKyBpc01hbnkgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyB0aGUgZ2l2ZW4gb3Bwb3NpdGUgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gb3Bwb3NpdGVGZWF0dXJlCi0JICogICAgICAgICAgICB0aGUgb3Bwb3NpdGUgZmVhdHVyZSB0byByZWdpc3RlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCByZWdpc3Rlck9wcG9zaXRlRmVhdHVyZSgKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUpIHsKLQkJQ2xhc3MgY2xzID0gb3Bwb3NpdGVGZWF0dXJlLmdldE93bmVyQ2xhc3MoKTsKLQkJU2V0IGZlYXR1cmVzID0gKFNldCkgY2xhc3NPcHBvc2l0ZUZlYXR1cmVzTWFwLmdldChjbHMpOwotCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCkgewotCQkJZmVhdHVyZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJY2xhc3NPcHBvc2l0ZUZlYXR1cmVzTWFwLnB1dChjbHMsIGZlYXR1cmVzKTsKLQkJfQotCQlmZWF0dXJlcy5hZGQob3Bwb3NpdGVGZWF0dXJlKTsKLQotCQlmZWF0dXJlT3Bwb3NpdGVGZWF0dXJlTWFwLnB1dChvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpLAotCQkJCW9wcG9zaXRlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiBhIHByb3h5IG93bmVyIGNsYXNzIGlzIHJlc29sdmVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgbm90aWZpY2F0aW9uIGlzIGJlaW5nIHNlbnQgd2hlbiBhIHByb3h5Ci0JICogICAgICAgICBvd25lciBjbGFzcyBpcyByZXNvbHZlZAotCSAqLwotCS8qCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzRGVsaXZlck9uUmVzb2x2ZSgpIHsKLQkJcmV0dXJuIGRlbGl2ZXJPblJlc29sdmU7Ci0JfQotCSovCi0KLQkvKioKLQkgKiBFbmFibGVzIG5vdGlmaWNhdGlvbiB3aGVuIGEgcHJveHkgb3duZXIgY2xhc3MgaXMgcmVzb2x2ZWQuCi0JICogCi0JICogQHBhcmFtIGVuYWJsZU5vdGlmaWNhdGlvbgotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHNlbmQgbm90aWZpY2F0aW9uIHdoZW4gYSBwcm94eSBvd25lcgotCSAqICAgICAgICAgICAgY2xhc3MgaXMgcmVzb2x2ZWQKLQkgKi8KLQkvKgotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZXREZWxpdmVyT25SZXNvbHZlKGJvb2xlYW4gZW5hYmxlTm90aWZpY2F0aW9uKSB7Ci0JCWRlbGl2ZXJPblJlc29sdmUgPSBlbmFibGVOb3RpZmljYXRpb247Ci0JfQotCSovCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIGZvciB0aGUgZ2l2ZW4gZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgYW4gRU1GIDxjb2RlPkVTdHJ1Y3R1cmFsRmVhdHVyZTwvY29kZT4gZmVhdHVyZQotCSAqIEByZXR1cm4gYW4gb3Bwb3NpdGUgZmVhdHVyZSB0aGF0IGlzIGJhc2VkIG9uIHRoZSBnaXZlbiBmZWF0dXJlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgZ2V0T3Bwb3NpdGVGZWF0dXJlKAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIChPcHBvc2l0ZUZlYXR1cmUpIGZlYXR1cmVPcHBvc2l0ZUZlYXR1cmVNYXAuZ2V0KGZlYXR1cmUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9PcHBvc2l0ZUZlYXR1cmVOb3RpZmljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjIyMWJlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9PcHBvc2l0ZUZlYXR1cmVOb3RpZmljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKLQotLyoqCi0gKiBOb3RpZmljYXRpb24gYXNzb2NpYXRlZCB3aXRoIGFuIG9wcG9zaXRlIGZlYXR1cmUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcHBvc2l0ZUZlYXR1cmVOb3RpZmljYXRpb24gZXh0ZW5kcyBOb3RpZmljYXRpb25JbXBsIHsKLQotCXByaXZhdGUgT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZTsKLQotCXByaXZhdGUgT2JqZWN0IG5vdGlmaWVyOwotCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgZXZlbnQKLQkgKiBAcGFyYW0gb3Bwb3NpdGVGZWF0dXJlCi0JICogICAgICAgICAgICB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBub3RpZmljYXRpb24KLQkgKiBAcGFyYW0gb2xkVmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBvbGQgdmFsdWUKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBwb3NpdGl0aW9uIGF0IHdoaWNoIHRoZSBjaGFuZ2Ugb2NjdXJyZWQKLQkgKiBAcGFyYW0gd2FzU2V0Ci0JICovCi0JcHVibGljIE9wcG9zaXRlRmVhdHVyZU5vdGlmaWNhdGlvbihPYmplY3Qgbm90aWZpZXIsIGludCBldmVudFR5cGUsCi0JCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwKLQkJCWludCBwb3NpdGlvbiwgYm9vbGVhbiB3YXNTZXQpIHsKLQkJc3VwZXIoZXZlbnRUeXBlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvc2l0aW9uLCB3YXNTZXQpOwotCQl0aGlzLm5vdGlmaWVyID0gbm90aWZpZXI7Ci0JCXRoaXMub3Bwb3NpdGVGZWF0dXJlID0gb3Bwb3NpdGVGZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wcG9zaXRlIGZlYXR1cmUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBub3RpZmljYXRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBub3RpZmljYXRpb24KLQkgKi8KLQlwdWJsaWMgT3Bwb3NpdGVGZWF0dXJlIGdldE9wcHNpdGVGZWF0dXJlKCkgewotCQlyZXR1cm4gb3Bwb3NpdGVGZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsI2dldE5vdGlmaWVyKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE5vdGlmaWVyKCkgewotCQlyZXR1cm4gbm90aWZpZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9PcHBvc2l0ZUZlYXR1cmVSZXNvbHZpbmdFTGlzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvT3Bwb3NpdGVGZWF0dXJlUmVzb2x2aW5nRUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGI1MzRmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9PcHBvc2l0ZUZlYXR1cmVSZXNvbHZpbmdFTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmeWluZ0xpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotCi0vKioKLSAqIEEgbGlzdCBmb3IgcmVzb2x2aW5nIG11bHRpLXZhbHVlZCBvcHBvc2l0ZSBmZWF0dXJlcy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9wcG9zaXRlRmVhdHVyZVJlc29sdmluZ0VMaXN0IGV4dGVuZHMgTm90aWZ5aW5nTGlzdEltcGwgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzY5MDE5ODc2MzAwMDA1MTc2OEw7Ci0KLQlwcml2YXRlIE11bHRpUmVzb3VyY2VFT2JqZWN0IG93bmVyOwotCi0JcHJpdmF0ZSBPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIHRoZSBvd25lciBvZiBhbiBvcHBvc2l0ZSBmZWF0dXJlCi0JICogQHBhcmFtIG9wcG9zaXRlRmVhdHVyZQotCSAqICAgICAgICAgICAgYW4gb3Bwb3NpdGUgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBPcHBvc2l0ZUZlYXR1cmVSZXNvbHZpbmdFTGlzdChNdWx0aVJlc291cmNlRU9iamVjdCBvd25lciwKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLm9wcG9zaXRlRmVhdHVyZSA9IG9wcG9zaXRlRmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZ5aW5nTGlzdEltcGwjZ2V0Tm90aWZpZXIoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Tm90aWZpZXIoKSB7Ci0JCXJldHVybiBvd25lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgRU9iamVjdCByZXNvbHZlUHJveHkoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCXJldHVybiBlT2JqZWN0LmVJc1Byb3h5KCkgPyBvd25lcgotCQkJCS5lUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIGVPYmplY3QpIDogZU9iamVjdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm90aWZpY2F0aW9uSW1wbCBjcmVhdGVOb3RpZmljYXRpb24oaW50IGV2ZW50VHlwZSwKLQkJCU9iamVjdCBvbGRPYmplY3QsIE9iamVjdCBuZXdPYmplY3QsIGludCBpbmRleCwgYm9vbGVhbiB3YXNTZXQpIHsKLQkJcmV0dXJuIG5ldyBPcHBvc2l0ZUZlYXR1cmVOb3RpZmljYXRpb24ob3duZXIsIGV2ZW50VHlwZSwKLQkJCQlvcHBvc2l0ZUZlYXR1cmUsIG9sZE9iamVjdCwgbmV3T2JqZWN0LCBpbmRleCwgd2FzU2V0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdGlmaWNhdGlvblJlcXVpcmVkKCkgewotCQlyZXR1cm4gb3duZXIuZU5vdGlmaWNhdGlvblJlcXVpcmVkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCByZXNvbHZlKGludCBpbmRleCwgT2JqZWN0IG9iamVjdCkgewotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSkKLQkJCXJldHVybiBvYmplY3Q7Ci0JCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCUVPYmplY3QgcmVzb2x2ZWQgPSByZXNvbHZlUHJveHkoZU9iamVjdCk7Ci0JCWlmIChyZXNvbHZlZCAhPSBlT2JqZWN0KSB7Ci0JCQlPYmplY3Qgb2xkT2JqZWN0ID0gZGF0YVtpbmRleF07Ci0JCQlhc3NpZ24oaW5kZXgsIHZhbGlkYXRlKGluZGV4LCByZXNvbHZlZCkpOwotCi0JCQlkaWRTZXQoaW5kZXgsIHJlc29sdmVkLCBvbGRPYmplY3QpOwotCi0JCQkvLyBpZiAoaXNOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJLy8gewotCQkJLy8gb3duZXIuZU5vdGlmeShjcmVhdGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uLlJFU09MVkUsIGVPYmplY3QsCi0JCQkvLyByZXNvbHZlZCwgaW5kZXgsIGZhbHNlKSk7Ci0JCQkvLyB9Ci0KLQkJCXJldHVybiByZXNvbHZlZDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBlT2JqZWN0OwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlRGFuZ2xpbmdPYmplY3RzKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iai5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gdW5tb2RpZmlhYmxlIGxpc3QgdGhhdCBzdG9yZXMgdGhlIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWVzLgotCSAqIAotCSAqIEByZXR1cm4gYW4gdW5tb2RpZmlhYmxlIGxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRVbm1vZGlmaWFibGVMaXN0KCkgewotCQlyZW1vdmVEYW5nbGluZ09iamVjdHMoKTsKLQkJcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVFTGlzdChzaXplLCBkYXRhKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGFlZmU1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciB0aGUgVU1BIEVjb3JlIGV4dGVuc2lvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzL0hlYWRlci5qYXZhamV0aW5jIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcy9IZWFkZXIuamF2YWpldGluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDEwNTY5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzL0hlYWRlci5qYXZhamV0aW5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMvbW9kZWwvQ2xhc3MuamF2YWpldCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMvbW9kZWwvQ2xhc3MuamF2YWpldApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODdlOTU1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzL21vZGVsL0NsYXNzLmphdmFqZXQKKysrIC9kZXYvbnVsbApAQCAtMSwxODIxICswLDAgQEAKLTwlQCBqZXQgcGFja2FnZT0ib3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uZWNvcmUudGVtcGxhdGVzLm1vZGVsIiBpbXBvcnRzPSJqYXZhLnV0aWwuKiBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5lY29yZS5nZW5tb2RlbC4qIiBjbGFzcz0iQ2xhc3MiIHZlcnNpb249IiRJZDogQ2xhc3MuamF2YWpldCx2IDEuNCAyMDA2LzA3LzE4IDAwOjU2OjA5IGJ4dSBFeHAgJCIgJT4KLTwlCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqLwotJT4KLTwlZmluYWwgR2VuQ2xhc3MgZ2VuQ2xhc3MgPSAoR2VuQ2xhc3MpKChPYmplY3RbXSlhcmd1bWVudClbMF07IGZpbmFsIEdlblBhY2thZ2UgZ2VuUGFja2FnZSA9IGdlbkNsYXNzLmdldEdlblBhY2thZ2UoKTsgZmluYWwgR2VuTW9kZWwgZ2VuTW9kZWw9Z2VuUGFja2FnZS5nZXRHZW5Nb2RlbCgpOyU+Ci08JWZpbmFsIGJvb2xlYW4gaXNJbnRlcmZhY2UgPSBCb29sZWFuLlRSVUUuZXF1YWxzKCgoT2JqZWN0W10pYXJndW1lbnQpWzFdKTsgZmluYWwgYm9vbGVhbiBpc0ltcGxlbWVudGF0aW9uID0gQm9vbGVhbi5UUlVFLmVxdWFscygoKE9iamVjdFtdKWFyZ3VtZW50KVsyXSk7JT4KLTwlZmluYWwgU3RyaW5nIHB1YmxpY1N0YXRpY0ZpbmFsRmxhZyA9IGlzSW1wbGVtZW50YXRpb24gPyAicHVibGljIHN0YXRpYyBmaW5hbCAiIDogIiI7JT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii4uL0hlYWRlci5qYXZhamV0aW5jIiU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyU+Ci1wYWNrYWdlIDwlPWdlblBhY2thZ2UuZ2V0SW50ZXJmYWNlUGFja2FnZU5hbWUoKSU+OwotPCV9IGVsc2UgeyU+Ci1wYWNrYWdlIDwlPWdlblBhY2thZ2UuZ2V0Q2xhc3NQYWNrYWdlTmFtZSgpJT47Ci08JX0lPgotCi08JWdlbk1vZGVsLm1hcmtJbXBvcnRMb2NhdGlvbihzdHJpbmdCdWZmZXIsIGdlblBhY2thZ2UpOyU+Ci0KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPjwlPWdlbkNsYXNzLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPCVpZiAoZ2VuQ2xhc3MuaGFzRG9jdW1lbnRhdGlvbigpKSB7JT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIDwlPWdlbkNsYXNzLmdldERvY3VtZW50YXRpb24oZ2VuTW9kZWwuZ2V0SW5kZW50YXRpb24oc3RyaW5nQnVmZmVyKSklPgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotPCV9JT4KLSAqCi08JWlmICghZ2VuQ2xhc3MuZ2V0R2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci08JWZvciAoSXRlcmF0b3IgaT1nZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlpLm5leHQoKTslPgotICA8JWlmICghZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRHZXRWaXNpYmlsaXR5KCkpIHslPgotICogICA8bGk+e0BsaW5rIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59PC9saT4KLSAgPCV9JT4KLTwlfSU+Ci0gKiA8L3VsPgotICogPC9wPgotPCV9JT4KLSAqCi08JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc0VNRk1ldGFEYXRhKCkpIHslPgotICogQHNlZSA8JT1nZW5QYWNrYWdlLmdldFF1YWxpZmllZFBhY2thZ2VJbnRlcmZhY2VOYW1lKCklPiNnZXQ8JT1nZW5DbGFzcy5nZXRDbGFzc2lmaWVyQWNjZXNzb3JOYW1lKCklPigpCi08JX0lPgotPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNb2RlbFRhZ3MoKSkgeyBib29sZWFuIGZpcnN0ID0gdHJ1ZTsgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihnZW5DbGFzcy5nZXRNb2RlbEluZm8oKSwgIlxuXHIiKTsgc3RyaW5nVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTsgKSB7IFN0cmluZyBtb2RlbEluZm8gPSBzdHJpbmdUb2tlbml6ZXIubmV4dFRva2VuKCk7IGlmIChmaXJzdCkgeyBmaXJzdCA9IGZhbHNlOyU+Ci0gKiBAbW9kZWwgPCU9bW9kZWxJbmZvJT4KLTwlfSBlbHNlIHslPgotICogICAgICAgIDwlPW1vZGVsSW5mbyU+Ci08JX19IGlmIChmaXJzdCkgeyU+Ci0gKiBAbW9kZWwKLTwlfX0lPgotPCVpZiAoZ2VuQ2xhc3MubmVlZHNSb290RXh0ZW5kc0ludGVyZmFjZUV4dGVuZHNUYWcoKSkgeyU+Ci0gKiBAZXh0ZW5kcyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoZ2VuTW9kZWwuZ2V0Um9vdEV4dGVuZHNJbnRlcmZhY2UoKSklPgotPCV9JT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotPCV9IGVsc2UgeyU+Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+PCU9Z2VuQ2xhc3MuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLTwlaWYgKCFnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSB7JT4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotPCVmb3IgKEl0ZXJhdG9yIGk9Z2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlpLm5leHQoKTslPgotICogICA8bGk+e0BsaW5rIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZENsYXNzTmFtZSgpJT4jPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn08L2xpPgotPCV9JT4KLSAqIDwvdWw+Ci08JX0lPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24pIHslPgotcHVibGljPCVpZiAoZ2VuQ2xhc3MuaXNBYnN0cmFjdCgpKSB7JT4gYWJzdHJhY3Q8JX0lPiBjbGFzcyA8JT1nZW5DbGFzcy5nZXRDbGFzc05hbWUoKSU+PCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NFeHRlbmRzKCklPjwlPWdlbkNsYXNzLmdldENsYXNzSW1wbGVtZW50cygpJT4KLTwlfSBlbHNlIHslPgotcHVibGljIGludGVyZmFjZSA8JT1nZW5DbGFzcy5nZXRJbnRlcmZhY2VOYW1lKCklPjwlPWdlbkNsYXNzLmdldEludGVyZmFjZUV4dGVuZHMoKSU+Ci08JX0lPgotewotPCVpZiAoZ2VuTW9kZWwuZ2V0Q29weXJpZ2h0VGV4dCgpICE9IG51bGwpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCTwlPXB1YmxpY1N0YXRpY0ZpbmFsRmxhZyU+PCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLmxhbmcuU3RyaW5nIiklPiBjb3B5cmlnaHQgPSAiPCU9Z2VuTW9kZWwuZ2V0Q29weXJpZ2h0VGV4dCgpJT4iOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuTW9kZWwuZ2V0RHJpdmVyTnVtYmVyKCkgIT0gbnVsbCkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoImphdmEubGFuZy5TdHJpbmciKSU+IG1vZkRyaXZlck51bWJlciA9ICI8JT1nZW5Nb2RlbC5nZXREcml2ZXJOdW1iZXIoKSU+Ijs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbkNsYXNzLmlzSmF2YUlPU2VyaWFsaXphYmxlKCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHsgU3RyaW5nIGVWaXJ0dWFsVmFsdWVzRmllbGQgPSBnZW5DbGFzcy5nZXRFVmlydHVhbFZhbHVlc0ZpZWxkKCk7JT4KLSAgPCVpZiAoZVZpcnR1YWxWYWx1ZXNGaWVsZCAhPSBudWxsKSB7JT4KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzIG9mIG5vbi1wcmltaXRpdmUgZmVhdHVyZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdFtdIDwlPWVWaXJ0dWFsVmFsdWVzRmllbGQlPiA9IG51bGw7Ci0KLSAgPCV9JT4KLSAgPCV7IExpc3QgZVZpcnR1YWxJbmRleEJpdEZpZWxkcyA9IGdlbkNsYXNzLmdldEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMobmV3IEFycmF5TGlzdCgpKTslPgotICAgIDwlaWYgKCFlVmlydHVhbEluZGV4Qml0RmllbGRzLmlzRW1wdHkoKSkgeyU+Ci0gICAgICA8JWZvciAoSXRlcmF0b3IgaSA9IGVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7IFN0cmluZyBlVmlydHVhbEluZGV4Qml0RmllbGQgPSAoU3RyaW5nKWkubmV4dCgpOyU+Ci0JLyoqCi0JICogQSBiaXQgZmllbGQgcmVwcmVzZW50aW5nIHRoZSBpbmRpY2VzIG9mIG5vbi1wcmltaXRpdmUgZmVhdHVyZSB2YWx1ZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGludCA8JT1lVmlydHVhbEluZGV4Qml0RmllbGQlPiA9IDA7Ci0KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbkNsYXNzLmlzTW9kZWxSb290KCkgJiYgZ2VuTW9kZWwuaXNCb29sZWFuRmxhZ3NFbmFibGVkKCkgJiYgZ2VuTW9kZWwuZ2V0Qm9vbGVhbkZsYWdzUmVzZXJ2ZWRCaXRzKCkgPT0gLTEpIHslPgotCS8qKgotCSAqIEEgc2V0IG9mIGJpdCBmbGFncyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBvZiBib29sZWFuIGF0dHJpYnV0ZXMgYW5kIHdoZXRoZXIgdW5zZXR0YWJsZSBmZWF0dXJlcyBoYXZlIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCA8JT1nZW5Nb2RlbC5nZXRCb29sZWFuRmxhZ3NGaWVsZCgpJT4gPSAwOwotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpKSB7JT4KLSAgPCVmb3IgKEl0ZXJhdG9yIGk9Z2VuQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZEdlbkZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7IEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA9IChHZW5GZWF0dXJlKWkubmV4dCgpOyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9kZWNsYXJlZEZpZWxkR2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpIHx8IGdlbkZlYXR1cmUuaXNSZWZlcmVuY2VUeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRJbnRlcm5hbFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbnVsbDsKLQotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLmlzQXJyYXlBY2Nlc3NvcnMoKSAmJiAhZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHslPgotCS8qKgotCSAqIFRoZSBlbXB0eSB2YWx1ZSBmb3IgdGhlICd7QGxpbmsgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QXJyYXlBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgYXJyYXkgYWNjZXNzb3IuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFycmF5QWNjZXNzb3IoKSU+KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKCklPltdIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRU1QVFlfQVJSQVkgPSBuZXcgPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoKSU+IFswXTsKLQotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSB8fCAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmICghZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSB8fCAhZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkpIHslPgotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpIDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQgPSA8JT1nZW5GZWF0dXJlLmdldFN0YXRpY0RlZmF1bHRWYWx1ZSgpJT47PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKGdlbkZlYXR1cmUuZ2V0U3RhdGljRGVmYXVsdFZhbHVlKCkpJT4KLQotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmdldEZsYWdJbmRleChnZW5GZWF0dXJlKSA+IDMxICYmIGdlbkNsYXNzLmdldEZsYWdJbmRleChnZW5GZWF0dXJlKSAlIDMyID09IDApIHslPgotCS8qKgotCSAqIEFuIGFkZGl0aW9uYWwgc2V0IG9mIGJpdCBmbGFncyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBvZiBib29sZWFuIGF0dHJpYnV0ZXMgYW5kIHdoZXRoZXIgdW5zZXR0YWJsZSBmZWF0dXJlcyBoYXZlIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCA8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gPSAwOwotCi0gICAgICAgICAgPCV9JT4KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpIDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcgPSAxIDwlPSI8PCAiICsgZ2VuQ2xhc3MuZ2V0RmxhZ0luZGV4KGdlbkZlYXR1cmUpICUgMzIgJT47Ci0KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVDsKLQotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkNsYXNzLmlzRVNldEZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICA8JWlmIChnZW5DbGFzcy5nZXRFU2V0RmxhZ0luZGV4KGdlbkZlYXR1cmUpID4gMzEgJiYgZ2VuQ2xhc3MuZ2V0RVNldEZsYWdJbmRleChnZW5GZWF0dXJlKSAlIDMyID09IDApIHslPgotCS8qKgotCSAqIEFuIGFkZGl0aW9uYWwgc2V0IG9mIGJpdCBmbGFncyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBvZiBib29sZWFuIGF0dHJpYnV0ZXMgYW5kIHdoZXRoZXIgdW5zZXR0YWJsZSBmZWF0dXJlcyBoYXZlIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCA8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ID0gMDsKLQotICAgICAgICA8JX0lPgotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB3aGV0aGVyIHRoZSA8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRyA9IDEgPCU9Ijw8ICIgKyBnZW5DbGFzcy5nZXRFU2V0RmxhZ0luZGV4KGdlbkZlYXR1cmUpICUgMzIgJT47Ci0KLSAgICAgIDwlfSBlbHNlIHslPgotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPiA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gZmFsc2U7Ci0KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2RlY2xhcmVkRmllbGRHZW5GZWF0dXJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL2RlY2xhcmVkRmllbGRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24pIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCA8JT1nZW5DbGFzcy5nZXRDbGFzc05hbWUoKSU+KCkKLQl7Ci0JCXN1cGVyKCk7Ci0gIDwlZm9yIChJdGVyYXRvciBpPWdlbkNsYXNzLmdldEZsYWdHZW5GZWF0dXJlcygidHJ1ZSIpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlpLm5leHQoKTslPgotCQk8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOwotICA8JX0lPgotICAKLSAvL1VNQS0tPgotIAkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0gLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzIiklPiBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZENsYXNzaWZpZXJBY2Nlc3NvcigpJT47Ci0JfQotCi08JX0lPgotPCVuZXcgUnVubmFibGUoKSB7IHB1YmxpYyB2b2lkIHJ1bigpIHslPgotPCVmb3IgKEl0ZXJhdG9yIGk9KGlzSW1wbGVtZW50YXRpb24gPyBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkgOiBnZW5DbGFzcy5nZXREZWNsYXJlZEdlbkZlYXR1cmVzKCkpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlpLm5leHQoKTslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotICA8JWlmIChnZW5Nb2RlbC5pc0FycmF5QWNjZXNzb3JzKCkgJiYgZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpICYmICFnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICA8JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoKSU+W10gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBcnJheUFjY2Vzc29yKCklPigpOwotCi0gICAgPCV9IGVsc2UgeyU+Ci0JcHVibGljIDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKCklPltdIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QXJyYXlBY2Nlc3NvcigpJT4oKQotCXsKLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCIpJT4gbGlzdCA9ICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0IiklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotCQlpZiAobGlzdC5pc0VtcHR5KCkpIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUVNUFRZX0FSUkFZOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9PSBudWxsIHx8IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+LmlzRW1wdHkoKSkgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRU1QVFlfQVJSQVk7Ci0JCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QiKSU+IGxpc3QgPSAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICA8JX0lPgotCQlsaXN0LnNocmluaygpOwotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKCklPltdKWxpc3QuZGF0YSgpOwotCX0KLQotICAgIDwlfSU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCTwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKCklPiBnZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oaW50IGluZGV4KTsKLQotICAgIDwlfSBlbHNlIHslPgotCXB1YmxpYyA8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZSgpJT4gZ2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KGludCBpbmRleCkKLQl7Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoKSU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuZ2V0KGluZGV4KTsKLQl9Ci0KLSAgICA8JX0lPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIDwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQlpbnQgZ2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+TGVuZ3RoKCk7Ci0KLSAgICA8JX0gZWxzZSB7JT4KLQlwdWJsaWMgaW50IGdldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPkxlbmd0aCgpCi0JewotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5zaXplKCk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID09IG51bGwgPyAwIDogPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uc2l6ZSgpOwotICAgICAgPCV9JT4KLQl9Ci0KLSAgICA8JX0lPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIDwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQl2b2lkIHNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZSgpJT5bXSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KTsKLQotICAgIDwlfSBlbHNlIHslPgotCXB1YmxpYyB2b2lkIHNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZSgpJT5bXSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KQotCXsKLQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0IiklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5zZXREYXRhKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4ubGVuZ3RoLCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KTsKLQl9Ci0KLSAgICA8JX0lPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIDwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQl2b2lkIHNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihpbnQgaW5kZXgsIDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKCklPiBlbGVtZW50KTsKLQotICAgIDwlfSBlbHNlIHslPgotCXB1YmxpYyB2b2lkIHNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihpbnQgaW5kZXgsIDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKCklPiBlbGVtZW50KQotCXsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5zZXQoaW5kZXgsIGVsZW1lbnQpOwotCX0KLQotICAgIDwlfSU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNHZXQoKSAmJiAoaXNJbXBsZW1lbnRhdGlvbiB8fCAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRHZXRWaXNpYmlsaXR5KCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9iPjwvZW0+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7IEdlbkZlYXR1cmUga2V5RmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0TWFwRW50cnlUeXBlR2VuQ2xhc3MoKS5nZXRNYXBFbnRyeUtleUZlYXR1cmUoKTsgR2VuRmVhdHVyZSB2YWx1ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldE1hcEVudHJ5VHlwZUdlbkNsYXNzKCkuZ2V0TWFwRW50cnlWYWx1ZUZlYXR1cmUoKTsgJT4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUgPCVpZiAoa2V5RmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPmxpc3Qgb2Yge0BsaW5rIDwlPWtleUZlYXR1cmUuZ2V0UXVhbGlmaWVkTGlzdEl0ZW1UeXBlKCklPn08JX0gZWxzZSB7JT57QGxpbmsgPCU9a2V5RmVhdHVyZS5nZXRUeXBlKCklPn08JX0lPiwKLQkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUgPCVpZiAodmFsdWVGZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+bGlzdCBvZiB7QGxpbmsgPCU9dmFsdWVGZWF0dXJlLmdldFF1YWxpZmllZExpc3RJdGVtVHlwZSgpJT59PCV9IGVsc2UgeyU+e0BsaW5rIDwlPXZhbHVlRmVhdHVyZS5nZXRUeXBlKCklPn08JX0lPiwKLSAgICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpICYmICEoZ2VuTW9kZWwuaXNTdXBwcmVzc0VNRk1ldGFEYXRhKCkgJiYgIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ii5lcXVhbHMoZ2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRMaXN0SXRlbVR5cGUoKSkpKSB7JT4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRMaXN0SXRlbVR5cGUoKSU+fS4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNTZXREZWZhdWx0VmFsdWUoKSkgeyU+Ci0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+PCU9Z2VuRmVhdHVyZS5nZXREZWZhdWx0VmFsdWUoKSU+PC9jb2RlPi4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKSAhPSBudWxsKSB7JT4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayA8JT1nZW5GZWF0dXJlLmdldFR5cGVHZW5FbnVtKCkuZ2V0UXVhbGlmaWVkTmFtZSgpJT59LgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSAmJiAhZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCkuZ2V0R2VuQ2xhc3MoKS5pc01hcEVudHJ5KCkpIHsgR2VuRmVhdHVyZSByZXZlcnNlR2VuRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyAlPgotICAgICAgPCVpZiAoIXJldmVyc2VHZW5GZWF0dXJlLmlzU3VwcHJlc3NlZEdldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgPCU9cmV2ZXJzZUdlbkZlYXR1cmUuZ2V0R2VuQ2xhc3MoKS5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1yZXZlcnNlR2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPXJldmVyc2VHZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59Jy4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgIDwlaWYgKCFnZW5GZWF0dXJlLmhhc0RvY3VtZW50YXRpb24oKSkgeyU+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotICAgIDwlfSU+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5oYXNEb2N1bWVudGF0aW9uKCkpIHslPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIDwlPWdlbkZlYXR1cmUuZ2V0RG9jdW1lbnRhdGlvbihnZW5Nb2RlbC5nZXRJbmRlbnRhdGlvbihzdHJpbmdCdWZmZXIpKSU+Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICAgIDwlfSU+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmdldFR5cGVHZW5FbnVtKCkgIT0gbnVsbCkgeyU+Ci0JICogQHNlZSA8JT1nZW5GZWF0dXJlLmdldFR5cGVHZW5FbnVtKCkuZ2V0UXVhbGlmaWVkTmFtZSgpJT4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkSXNTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI2lzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ2hhbmdlYWJsZSgpICYmICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFVuc2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICN1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NoYW5nZWFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICNzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KQotICAgIDwlfSU+Ci0gICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNZXRhRGF0YSgpKSB7JT4KLQkgKiBAc2VlIDwlPWdlblBhY2thZ2UuZ2V0UXVhbGlmaWVkUGFja2FnZUludGVyZmFjZU5hbWUoKSU+I2dldDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUFjY2Vzc29yTmFtZSgpJT4oKQotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSAmJiAhZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCkuZ2V0R2VuQ2xhc3MoKS5pc01hcEVudHJ5KCkpIHsgR2VuRmVhdHVyZSByZXZlcnNlR2VuRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyAlPgotICAgICAgPCVpZiAoIXJldmVyc2VHZW5GZWF0dXJlLmlzU3VwcHJlc3NlZEdldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSA8JT1yZXZlcnNlR2VuRmVhdHVyZS5nZXRHZW5DbGFzcygpLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPXJldmVyc2VHZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTW9kZWxUYWdzKCkpIHsgYm9vbGVhbiBmaXJzdCA9IHRydWU7IGZvciAoU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZ2VuRmVhdHVyZS5nZXRNb2RlbEluZm8oKSwgIlxuXHIiKTsgc3RyaW5nVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTsgKSB7IFN0cmluZyBtb2RlbEluZm8gPSBzdHJpbmdUb2tlbml6ZXIubmV4dFRva2VuKCk7IGlmIChmaXJzdCkgeyBmaXJzdCA9IGZhbHNlOyU+Ci0JICogQG1vZGVsIDwlPW1vZGVsSW5mbyU+Ci0gICAgPCV9IGVsc2UgeyU+Ci0JICogICAgICAgIDwlPW1vZGVsSW5mbyU+Ci0gICAgPCV9fSBpZiAoZmlyc3QpIHslPgotCSAqIEBtb2RlbAotICAgIDwlfX0lPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlfSBlbHNlIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCV9JT4KLTwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLQotPCV9IGVsc2UgeyU+Ci0JcHVibGljIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JewotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2V0R2VuRmVhdHVyZS5wcmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLSAgICA8JWlmIChnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkpIHslPgotCQlyZXR1cm4gPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KDwlfSU+KDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZSgpJT4pZUdldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIHRydWUpPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KS48JT1nZW5GZWF0dXJlLmdldFByaW1pdGl2ZVZhbHVlRnVuY3Rpb24oKSU+KCk8JX0lPjsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPik7Ci0gICAgICAgIDwlfSU+Ci0JCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9PSBudWxsKQotCQl7Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQllVmlydHVhbFNldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBuZXcgPCU9Z2VuQ2xhc3MuZ2V0TGlzdENvbnN0cnVjdG9yKGdlbkZlYXR1cmUpJT4pOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbmV3IDwlPWdlbkNsYXNzLmdldExpc3RDb25zdHJ1Y3RvcihnZW5GZWF0dXJlKSU+OwotICAgICAgICA8JX0lPgotCQl9Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjwlPWdlbkZlYXR1cmUuaXNNYXBUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSA/ICIubWFwKCkiIDogIiIlPjsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkpIHslPgotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KWVDb250YWluZXIoKTsKLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzUmVzb2x2ZVByb3hpZXMoKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlaWYgKCFnZW5GZWF0dXJlLmlzUmVmZXJlbmNlVHlwZSgpKSB7JT4sIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVDwlfSU+KTsKLSAgICAgICAgICA8JX0lPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lQXNFT2JqZWN0KCklPi5lSXNQcm94eSgpKQotCQl7Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLQkJCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXROb25FT2JqZWN0SW50ZXJuYWxUeXBlQ2FzdCgpJT5lUmVzb2x2ZVByb3h5KG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pOwotCQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pCi0JCQl7Ci0gICAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZUNvbnRhaW5zKCkpIHslPgotCQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9ICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpKSB7JT4KLQkJCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIG51bGwsIG51bGwpOwotICAgICAgICAgIDwlfSBlbHNlIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7JT4KLQkJCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4uZUludmVyc2VSZW1vdmUodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBudWxsKTsKLSAgICAgICAgICA8JX0lPgotCQkJCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpCi0JCQkJewotICAgICAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpKSB7JT4KLQkJCQkJbXNncyA9IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4uZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCBudWxsLCBtc2dzKTsKLSAgICAgICAgICA8JX0gZWxzZSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyU+Ci0JCQkJCW1zZ3MgPSAgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5lSW52ZXJzZUFkZCh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotICAgICAgICAgIDwlfSU+Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLSAgICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQllVmlydHVhbFNldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uUkVTT0xWRSwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLQkJCX0KLQkJfQotICAgICAgICA8JX0lPgotICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkgJiYgZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JWlmICghZ2VuRmVhdHVyZS5pc1JlZmVyZW5jZVR5cGUoKSkgeyU+LCA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQ8JX0lPik7Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlyZXR1cm4gKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMDsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2Ugey8vdm9sYXRpbGUlPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkgJiYgIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gYmFzaWNHZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKTsKLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uZUlzUHJveHkoKSA/IDwlPWdlbkZlYXR1cmUuZ2V0Tm9uRU9iamVjdEludGVybmFsVHlwZUNhc3QoKSU+ZVJlc29sdmVQcm94eSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikgOiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gbmV3IDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRFZmZlY3RpdmVGZWF0dXJlTWFwV3JhcHBlckNsYXNzKCklPigoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkubGlzdCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pKTsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+KSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5saXN0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkubGlzdCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+KWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmxpc3QoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4oPCV9JT4oPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKCklPikoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkuZ2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgdHJ1ZSk8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pLjwlPWdlbkZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKTwlfSU+OwotICAgICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KDwlfSU+KDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZSgpJT4pZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKS5nZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCB0cnVlKTwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPikuPCU9Z2VuRmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpPCV9JT47Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0JCS8vIFRoZSBsaXN0IGlzIGV4cGVjdGVkIHRvIGltcGxlbWVudCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IGFuZCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcKLQkJLy8gc28gaXQncyBsaWtlbHkgdGhhdCBhbiBhcHByb3ByaWF0ZSBzdWJjbGFzcyBvZiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC48JWlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT5FY29yZUVNYXA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkpIHslPkJhc2ljRmVhdHVyZU1hcDwlfSBlbHNlIHslPkVjb3JlRUxpc3Q8JX0lPiBzaG91bGQgYmUgdXNlZC4KLSAgICAgICAgPCV9JT4KLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL2dldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL2dldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5GZWF0dXJlLmlzQmFzaWNHZXQoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IGJhc2ljR2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLQl7Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUucHJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpKSB7JT4KLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pIHJldHVybiBudWxsOwotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPillSW50ZXJuYWxDb250YWluZXIoKTsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPikoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkuZ2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgZmFsc2UpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkuZ2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgZmFsc2UpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyAtPiBkbyBub3QgcGVyZm9ybSBwcm94eSByZXNvbHV0aW9uCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCVAIGVuZCAlPjwlLy9DbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5GZWF0dXJlLmlzQmFzaWNTZXQoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZEludGVybmFsVHlwZSgpJT4gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncykKLQl7Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5wcmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiluZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgbXNncyk7Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUucG9zdC5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCQlyZXR1cm4gbXNnczsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5wcmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCU9iamVjdCBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gZVZpcnR1YWxTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjsKLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJYm9vbGVhbiBpc1NldENoYW5nZSA9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gRVZJUlRVQUxfTk9fVkFMVUU7Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9ICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gdHJ1ZTsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4gbm90aWZpY2F0aW9uID0gbmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlID8gbnVsbCA6IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2U8JX0gZWxzZSB7JT4hb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPik7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4gbm90aWZpY2F0aW9uID0gbmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gRVZJUlRVQUxfTk9fVkFMVUUgPyBudWxsIDogb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPik7Ci0gICAgICAgIDwlfSU+Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLSAgICAgIDwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUucG9zdC5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCQlyZXR1cm4gbXNnczsKLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkgeyBHZW5GZWF0dXJlIGRlbGVnYXRlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0RGVsZWdhdGVGZWF0dXJlKCk7JT4KLSAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkpLmJhc2ljQWRkKDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbXNncyk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbClnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5iYXNpY0FkZCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG1zZ3MpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlIGNvbnRhaW5lZCAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gLT4gdGhpcyBtZXRob2QgaXMgYXV0b21hdGljYWxseSBpbnZva2VkIHRvIGtlZXAgdGhlIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcCBpbiBzeW5jaAotCQkvLyAtPiBkbyBub3QgbW9kaWZ5IG90aGVyIGZlYXR1cmVzCi0JCS8vIC0+IHJldHVybiBtc2dzLCBhZnRlciBhZGRpbmcgYW55IGdlbmVyYXRlZCBOb3RpZmljYXRpb24gdG8gaXQgKGlmIGl0IGlzIG51bGwsIGEgTm90aWZpY2F0aW9uQ2hhaW4gb2JqZWN0IG11c3QgYmUgY3JlYXRlZCBmaXJzdCkKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgIDwlfSU+Ci0JfQotCi08JUAgZW5kICU+PCUvL0NsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc1NldCgpICYmIChpc0ltcGxlbWVudGF0aW9uIHx8ICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFNldFZpc2liaWxpdHkoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHsgJT4KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPiA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFbnVtVHlwZSgpKSB7JT4KLQkgKiBAc2VlIDwlPWdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKS5nZXRRdWFsaWZpZWROYW1lKCklPgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRJc1NldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFVuc2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICN1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlfSBlbHNlIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCV9JT4KLTwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7ICU+Ci0Jdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IHZhbHVlKTsKLQotPCV9IGVsc2UgeyU+Ci0JcHVibGljIHZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KQotCXsKLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUucHJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0gICAgPCVpZiAoZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpKSB7JT4KLQkJZVNldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPm5ldyA8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoKSU+KDwlfSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPik8JX0lPik7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkpIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7JT4KLQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4gJiYgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBudWxsKSkKLQkJewotCQkJaWYgKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsIiklPi5pc0FuY2VzdG9yKHRoaXMsIDwlPWdlbkZlYXR1cmUuZ2V0RU9iamVjdENhc3QoKSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikpCi0JCQkJdGhyb3cgbmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpJT4oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikuZUludmVyc2VBZGQodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEludGVybmFsVHlwZUNhc3QoKSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLSAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pKTsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpIHx8IGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVDb250YWlucygpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPik7Ci0gICAgICAgIDwlfSU+Ci0JCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KQotCQl7Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gbnVsbDsKLQkJCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsKQotICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSkgeyU+Ci0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiluZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIG51bGwsIG1zZ3MpOwotICAgICAgICA8JX0gZWxzZSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyU+Ci0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiluZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KS5lSW52ZXJzZUFkZCh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotICAgICAgICA8JX0lPgotCQkJbXNncyA9IGJhc2ljU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0SW50ZXJuYWxUeXBlQ2FzdCgpJT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLQkJZWxzZQotICAgIAl7Ci0gICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSBlVmlydHVhbElzU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KTsKLSAgICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgICAgIDwlfSU+Ci0JCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0gICAgICAgICAgICA8JX0lPgotCQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IHRydWU7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgIW9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAJfQotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikpOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSAoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwOwotICAgICAgICAgIDwlfSU+Ci0JCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KSA8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOyBlbHNlIDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpIHx8IGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VudW1UeXBlKCkpIHslPgotICAgICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBudWxsID8gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUIDogbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVCA6IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT47Ci0gICAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRJbnRlcm5hbFR5cGVDYXN0KCklPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT47Ci0gICAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldEludGVybmFsVHlwZUNhc3QoKSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlPYmplY3Qgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IGVWaXJ0dWFsU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJYm9vbGVhbiBpc1NldENoYW5nZSA9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gRVZJUlRVQUxfTk9fVkFMVUU7Ci0gICAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgICAgIDwlfSU+Ci0JCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotICAgICAgICAgICAgPCV9JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IHRydWU7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+aXNTZXRDaGFuZ2UgPyA8JWlmIChnZW5GZWF0dXJlLmlzUmVmZXJlbmNlVHlwZSgpKSB7JT5udWxsPCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUPCV9JT4gOiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT48JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjwlfSU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPmlzU2V0Q2hhbmdlPCV9IGVsc2UgeyU+IW9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0PCV9JT4pKTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBFVklSVFVBTF9OT19WQUxVRSA/IDwlaWYgKGdlbkZlYXR1cmUuaXNSZWZlcmVuY2VUeXBlKCkpIHslPm51bGw8JX0gZWxzZSB7JT48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQ8JX0lPiA6IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPjwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+PCV9JT4pKTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUucG9zdC5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpKS5zZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5uZXcgPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKCklPig8JX0lPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pPCV9JT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbClnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5zZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5uZXcgPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKCklPig8JX0lPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pPCV9JT4pOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL3NldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3Mvc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkZlYXR1cmUuaXNCYXNpY1Vuc2V0KCkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNVbnNldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gYmFzaWNVbnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzKQotCXsKLSAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJT2JqZWN0IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSBlVmlydHVhbFVuc2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG51bGw7Ci0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJYm9vbGVhbiBpc1NldENoYW5nZSA9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gRVZJUlRVQUxfTk9fVkFMVUU7Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gZmFsc2U7Ci0gICAgICA8JX0lPgotICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPiBub3RpZmljYXRpb24gPSBuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlVOU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5pc1NldENoYW5nZSA/IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gOiBudWxsPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCBudWxsLCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0gICAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1Vuc2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byB1bnNldCB0aGUgY29udGFpbmVkICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyAtPiB0aGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGludm9rZWQgdG8ga2VlcCB0aGUgY29udGFpbm1lbnQgcmVsYXRpb25zaGlwIGluIHN5bmNoCi0JCS8vIC0+IGRvIG5vdCBtb2RpZnkgb3RoZXIgZmVhdHVyZXMKLQkJLy8gLT4gcmV0dXJuIG1zZ3MsIGFmdGVyIGFkZGluZyBhbnkgZ2VuZXJhdGVkIE5vdGlmaWNhdGlvbiB0byBpdCAoaWYgaXQgaXMgbnVsbCwgYSBOb3RpZmljYXRpb25DaGFpbiBvYmplY3QgbXVzdCBiZSBjcmVhdGVkIGZpcnN0KQotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvYmFzaWNVbnNldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCVAIGVuZCAlPjwlLy9DbGFzcy5iYXNpY1Vuc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0KCkgJiYgKGlzSW1wbGVtZW50YXRpb24gfHwgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5KCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3Vuc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkSW50ZXJmYWNlTmFtZSgpJT4jPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gIDwlaWYgKCFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZElzU2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICNpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gIDwlfSU+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotICA8JWlmICghZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICNzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KQotICA8JX0lPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlfSBlbHNlIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCV9JT4KLTwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQl2b2lkIHVuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0KLTwlfSBlbHNlIHslPgotCXB1YmxpYyB2b2lkIHVuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLQl7Ci0gICAgPCVpZiAoZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpKSB7JT4KLQkJZVVuc2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pOwotICAgICAgICA8JX0lPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCkgKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSU+LlVuc2V0dGFibGUpPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLnVuc2V0KCk7Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSB8fCBnZW5GZWF0dXJlLmlzRWZmZWN0aXZlQ29udGFpbnMoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pOwotICAgICAgICA8JX0lPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCkKLQkJewotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncyA9IG51bGw7Ci0gICAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpKSB7JT4KLQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgbnVsbCwgbXNncyk7Ci0gICAgICAgIDwlfSBlbHNlIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7JT4KLQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0gICAgICAgIDwlfSU+Ci0JCQltc2dzID0gYmFzaWNVbnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlCi0gICAgCXsKLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSBlVmlydHVhbElzU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KTsKLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9ICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotICAgICAgICAgIDwlfSU+Ci0JCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICY9IH48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0gICAgICAgICAgPCV9JT4KLQkJCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSBmYWxzZTsKLSAgICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlVOU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgbnVsbCwgbnVsbCwgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQpKTsKLSAgICAgICAgPCV9JT4KLSAgICAJfQotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMDsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJT2JqZWN0IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSBlVmlydHVhbFVuc2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJYm9vbGVhbiBpc1NldENoYW5nZSA9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gRVZJUlRVQUxfTk9fVkFMVUU7Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9ICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1JlZmVyZW5jZVR5cGUoKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbnVsbDsKLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLSAgICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICY9IH48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IGZhbHNlOwotICAgICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uVU5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlID8gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA6IG51bGw8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIG51bGwsIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2U8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldDwlfSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVCkgPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRzsgZWxzZSA8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRzsKLSAgICAgICAgICA8JX0gZWxzZSBpZiAoIWdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSB8fCBnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQ7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpIHx8IGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotICAgICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5VTlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+aXNTZXRDaGFuZ2UgPyBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+IDogPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQsIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+aXNTZXRDaGFuZ2U8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldDwlfSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkpLmNsZWFyKDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmNsZWFyKDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHVuc2V0IHRoZSAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL3Vuc2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgIDwlfSU+Ci0JfQotCi08JX0lPgotPCVAIGVuZCAlPjwlLy9DbGFzcy91bnNldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNJc1NldCgpICYmIChpc0ltcGxlbWVudGF0aW9uIHx8ICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZElzU2V0VmlzaWJpbGl0eSgpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pc1NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaXMgc2V0LgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICA8JX0lPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLSAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0NoYW5nZWFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pCi0gICAgPCV9JT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JX0gZWxzZSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlfSU+Ci08JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JYm9vbGVhbiBpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotCi08JX0gZWxzZSB7JT4KLQlwdWJsaWMgYm9vbGVhbiBpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0JewotICAgIDwlaWYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0JCXJldHVybiBlSXNTZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPik7Ci0gICAgICAgIDwlfSU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsICYmICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPi5VbnNldHRhYmxlKTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5pc1NldCgpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXJldHVybiBlVmlydHVhbElzU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KTsKLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlyZXR1cm4gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiAhKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKSkuaXNFbXB0eSg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiAhKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmlzRW1wdHkoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pc1NldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHdoZXRoZXIgdGhlICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBpcyBzZXQKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL2lzU2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgIDwlfSU+Ci0JfQotCi08JX0lPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9pc1NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5GZWF0dXJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL2dlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0vL2ZvciU+Ci08JX19LnJ1bigpOyU+Ci08JWZvciAoSXRlcmF0b3IgaT0gKGlzSW1wbGVtZW50YXRpb24gPyBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbk9wZXJhdGlvbnMoKSA6IGdlbkNsYXNzLmdldERlY2xhcmVkR2VuT3BlcmF0aW9ucygpKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsgR2VuT3BlcmF0aW9uIGdlbk9wZXJhdGlvbiA9IChHZW5PcGVyYXRpb24paS5uZXh0KCk7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbk9wZXJhdGlvbi5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gIDwlaWYgKGdlbk9wZXJhdGlvbi5oYXNEb2N1bWVudGF0aW9uKCkpIHslPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIDwlPWdlbk9wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uKGdlbk1vZGVsLmdldEluZGVudGF0aW9uKHN0cmluZ0J1ZmZlcikpJT4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gIDwlfSU+Ci0gIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTW9kZWxUYWdzKCkpIHsgYm9vbGVhbiBmaXJzdCA9IHRydWU7IGZvciAoU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZ2VuT3BlcmF0aW9uLmdldE1vZGVsSW5mbygpLCAiXG5cciIpOyBzdHJpbmdUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpOyApIHsgU3RyaW5nIG1vZGVsSW5mbyA9IHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKTsgaWYgKGZpcnN0KSB7IGZpcnN0ID0gZmFsc2U7JT4KLQkgKiBAbW9kZWwgPCU9bW9kZWxJbmZvJT4KLSAgPCV9IGVsc2UgeyU+Ci0JICogICAgICAgIDwlPW1vZGVsSW5mbyU+Ci0gIDwlfX0gaWYgKGZpcnN0KSB7JT4KLQkgKiBAbW9kZWwKLSAgPCV9fSU+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JX0lPgotPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCTwlPWdlbk9wZXJhdGlvbi5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbk9wZXJhdGlvbi5nZXROYW1lKCklPig8JT1nZW5PcGVyYXRpb24uZ2V0UGFyYW1ldGVycygpJT4pPCU9Z2VuT3BlcmF0aW9uLmdldFRocm93cygpJT47Ci0KLTwlfSBlbHNlIHslPgotCXB1YmxpYyA8JT1nZW5PcGVyYXRpb24uZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5PcGVyYXRpb24uZ2V0TmFtZSgpJT4oPCU9Z2VuT3BlcmF0aW9uLmdldFBhcmFtZXRlcnMoKSU+KTwlPWdlbk9wZXJhdGlvbi5nZXRUaHJvd3MoKSU+Ci0JewotICA8JWlmIChnZW5PcGVyYXRpb24uaGFzQm9keSgpKSB7JT4KLQkJPCU9Z2VuT3BlcmF0aW9uLmdldEJvZHkoZ2VuTW9kZWwuZ2V0SW5kZW50YXRpb24oc3RyaW5nQnVmZmVyKSklPgotICA8JX0gZWxzZSBpZiAoZ2VuT3BlcmF0aW9uLmlzSW52YXJpYW50KCkpIHtHZW5DbGFzcyBvcENsYXNzID0gZ2VuT3BlcmF0aW9uLmdldEdlbkNsYXNzKCk7IFN0cmluZyBkaWFnbm9zdGljcyA9ICgoR2VuUGFyYW1ldGVyKWdlbk9wZXJhdGlvbi5nZXRHZW5QYXJhbWV0ZXJzKCkuZ2V0KDApKS5nZXROYW1lKCk7IFN0cmluZyBjb250ZXh0ID0gKChHZW5QYXJhbWV0ZXIpZ2VuT3BlcmF0aW9uLmdldEdlblBhcmFtZXRlcnMoKS5nZXQoMSkpLmdldE5hbWUoKTslPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJLy8gLT4gc3BlY2lmeSB0aGUgY29uZGl0aW9uIHRoYXQgdmlvbGF0ZXMgdGhlIGludmFyaWFudAotCQkvLyAtPiB2ZXJpZnkgdGhlIGRldGFpbHMgb2YgdGhlIGRpYWdub3N0aWMsIGluY2x1ZGluZyBzZXZlcml0eSBhbmQgbWVzc2FnZQotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQlpZiAoZmFsc2UpCi0JCXsKLQkJCWlmICg8JT1kaWFnbm9zdGljcyU+ICE9IG51bGwpCi0JCQl7Ci0JCQkJPCU9ZGlhZ25vc3RpY3MlPi5hZGQKLQkJCQkJKG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0RpYWdub3N0aWMiKSU+Ci0JCQkJCQkoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYyIpJT4uRVJST1IsCi0JCQkJCQkgPCU9b3BDbGFzcy5nZXRHZW5QYWNrYWdlKCkuZ2V0SW1wb3J0ZWRWYWxpZGF0b3JDbGFzc05hbWUoKSU+LkRJQUdOT1NUSUNfU09VUkNFLAotCQkJCQkJIDwlPW9wQ2xhc3MuZ2V0R2VuUGFja2FnZSgpLmdldEltcG9ydGVkVmFsaWRhdG9yQ2xhc3NOYW1lKCklPi48JT1vcENsYXNzLmdldE9wZXJhdGlvbklEKGdlbk9wZXJhdGlvbiklPiwKLQkJCQkJCSA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW4iKSU+LklOU1RBTkNFLmdldFN0cmluZygiX1VJX0dlbmVyaWNJbnZhcmlhbnRfZGlhZ25vc3RpYyIsIG5ldyBPYmplY3RbXSB7ICI8JT1nZW5PcGVyYXRpb24uZ2V0TmFtZSgpJT4iLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RWYWxpZGF0b3IiKSU+LmdldE9iamVjdExhYmVsKHRoaXMsIDwlPWNvbnRleHQlPikgfSksPCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPjwlPWdlbk1vZGVsLmdldE5vbk5MUygyKSU+Ci0JCQkJCQkgbmV3IE9iamVjdCBbXSB7IHRoaXMgfSkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2ltcGxlbWVudGVkR2VuT3BlcmF0aW9uLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9pbXBsZW1lbnRlZEdlbk9wZXJhdGlvbi50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbk9wZXJhdGlvbi5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9pbXBsZW1lbnRlZEdlbk9wZXJhdGlvbi5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfS8vZm9yJT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVJbnZlcnNlQWRkR2VuRmVhdHVyZXMoKSkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBlSW52ZXJzZUFkZCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLTwlZm9yIChJdGVyYXRvciBpPWdlbkNsYXNzLmdldEVJbnZlcnNlQWRkR2VuRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsgR2VuRmVhdHVyZSBnZW5GZWF0dXJlID0gKEdlbkZlYXR1cmUpaS5uZXh0KCk7JT4KLSAgPCVpZiAoIWdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkgfHwgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmNvbnRhaW5zKGdlbkZlYXR1cmUpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSAmJiBnZW5GZWF0dXJlLmlzRWZmZWN0aXZlU3VwcHJlc3NFTUZUeXBlcygpKSB7JT4KLQkJCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSU+KSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcCIpJT4uSW50ZXJuYWxNYXBWaWV3KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmVNYXAoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkpIHslPgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNCYXNpY1NldCgpKSB7JT4KLQkJCQlyZXR1cm4gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPilvdGhlckVuZCwgbXNncyk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgbXNncyk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KTsKLSAgICAgIDwlfSU+Ci0JCQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwpCi0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRWZmZWN0aXZlQ29udGFpbnMoKSkgeyU+Ci0JCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgbnVsbCwgbXNncyk7Ci0gICAgICA8JX0gZWxzZSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyU+Ci0JCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0gICAgICA8JX0lPgotCQkJCXJldHVybiBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KW90aGVyRW5kLCBtc2dzKTsKLSAgICA8JX0lPgotICA8JX0lPgotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLTwlfSBlbHNlIHslPgotCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFSW52ZXJzZVJlbW92ZUdlbkZlYXR1cmVzKCkpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gZUludmVyc2VSZW1vdmUoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci08JWZvciAoSXRlcmF0b3IgaT1nZW5DbGFzcy5nZXRFSW52ZXJzZVJlbW92ZUdlbkZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7IEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA9IChHZW5GZWF0dXJlKWkubmV4dCgpOyU+Ci0gIDwlaWYgKCFnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpIHx8IGdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5jb250YWlucyhnZW5GZWF0dXJlKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSkgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPikoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+LkludGVybmFsTWFwVmlldyk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5lTWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpJT4pKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZmVhdHVyZU1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSAmJiAhZ2VuRmVhdHVyZS5pc0Jhc2ljU2V0KCkpIHslPgotCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIG1zZ3MpOwotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLQkJCQlyZXR1cm4gYmFzaWNVbnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihtc2dzKTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4obnVsbCwgbXNncyk7Ci0gICAgPCV9JT4KLSAgPCV9JT4KLTwlfSU+Ci0JCX0KLTwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci08JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLTwlfSU+Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckdlbkZlYXR1cmVzKCkpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkKLQkJewotPCVmb3IgKEl0ZXJhdG9yIGk9Z2VuQ2xhc3MuZ2V0RUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckdlbkZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7IEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA9IChHZW5GZWF0dXJlKWkubmV4dCgpOyU+Ci0gIDwlR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7JT4KLSAgPCVpZiAoIWdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkgfHwgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmNvbnRhaW5zKGdlbkZlYXR1cmUpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0gIDwlfSU+Ci08JX0lPgotCQl9Ci08JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLTwlfSU+Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmICFnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLTwlZm9yIChJdGVyYXRvciBpPWdlbkNsYXNzLmdldEFsbEdlbkZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7IEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA9IChHZW5GZWF0dXJlKWkubmV4dCgpOyU+Ci0gIDwlaWYgKCFnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpIHx8IGdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5jb250YWlucyhnZW5GZWF0dXJlKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0Jvb2xlYW5UeXBlKCkpIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiBuZXcgPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKCklPig8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpICYmICFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotCQkJCXJldHVybiBiYXNpY0dldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVTdXBwcmVzc0VNRlR5cGVzKCkpIHslPgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcCIpJT4uSW50ZXJuYWxNYXBWaWV3KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmVNYXAoKTsKLQkJCQllbHNlIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLQkJCQllbHNlIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLm1hcCgpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5mZWF0dXJlTWFwKCk7Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotCQkJCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZ2V0V3JhcHBlcigpOwotICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JX0lPgotCQl9Ci08JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci08JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFU2V0R2VuRmVhdHVyZXMoKSkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLTwlZm9yIChJdGVyYXRvciBpPWdlbkNsYXNzLmdldEVTZXRHZW5GZWF0dXJlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlpLm5leHQoKTslPgotICA8JWlmICghZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSB8fCBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuY29udGFpbnMoZ2VuRmVhdHVyZSkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5mZWF0dXJlTWFwKCkpLnNldChuZXdWYWx1ZSk7Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5zZXQobmV3VmFsdWUpOwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRWZmZWN0aXZlU3VwcHJlc3NFTUZUeXBlcygpKSB7JT4KLQkJCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSIpJT4uU2V0dGluZykoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+LkludGVybmFsTWFwVmlldyk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5lTWFwKCkpLnNldChuZXdWYWx1ZSk7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlIiklPi5TZXR0aW5nKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLnNldChuZXdWYWx1ZSk7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLmNsZWFyKCk7Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5hZGRBbGwoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS51dGlsLkNvbGxlY3Rpb24iKSU+KW5ld1ZhbHVlKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQkJCXNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigoKDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZSgpJT4pbmV3VmFsdWUpLjwlPWdlbkZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKSk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pbmV3VmFsdWUpOwotICAgIDwlfSU+Ci0JCQkJcmV0dXJuOwotICA8JX0lPgotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci08JX0gZWxzZSB7JT4KLQkJZUR5bmFtaWNTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci08JX0lPgotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLTwlZm9yIChJdGVyYXRvciBpPWdlbkNsYXNzLmdldEVTZXRHZW5GZWF0dXJlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlpLm5leHQoKTslPgotICA8JWlmICghZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSB8fCBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuY29udGFpbnMoZ2VuRmVhdHVyZSkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmZlYXR1cmVNYXAoKS5jbGVhcigpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5jbGVhcigpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0JCQkJdW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKTsKLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1JlZmVyZW5jZVR5cGUoKSkgeyU+Ci0JCQkJc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pbnVsbCk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVCk7Ci0gICAgPCV9JT4KLQkJCQlyZXR1cm47Ci0gIDwlfSU+Ci08JX0lPgotCQl9Ci08JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci08JX0gZWxzZSB7JT4KLQkJZUR5bmFtaWNVbnNldChmZWF0dXJlSUQpOwotPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgIWdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZUlzU2V0Lm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewkKLS8vVU1BLS0+Ci0JCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSIpJT4gZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLTwlZm9yIChJdGVyYXRvciBpPWdlbkNsYXNzLmdldEFsbEdlbkZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7IEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA9IChHZW5GZWF0dXJlKWkubmV4dCgpOyU+Ci0gIDwlaWYgKCFnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpIHx8IGdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5jb250YWlucyhnZW5GZWF0dXJlKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLQkJCQlyZXR1cm4gISgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmZlYXR1cmVNYXAoKS5pc0VtcHR5KCk7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsICYmICE8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPi5mZWF0dXJlTWFwKCkuaXNFbXB0eSgpOwotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsICYmICE8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPi5pc0VtcHR5KCk7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPik7Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgITwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+LmlzRW1wdHkoKTsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gITwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuaXNFbXB0eSgpOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLQkJCQlyZXR1cm4gaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKTsKLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkpIHslPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGw7Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQlyZXR1cm4gZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pICE9IG51bGw7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiBiYXNpY0dldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpICE9IG51bGw7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzUmVmZXJlbmNlVHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsOwotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJcmV0dXJuIGVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KSAhPSBudWxsOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSAhPSBudWxsOwotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSB8fCBnZW5GZWF0dXJlLmlzRW51bVR5cGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gKCg8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcpICE9IDApICE9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVDsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVDsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRW51bVR5cGUoKSAmJiBnZW5GZWF0dXJlLmlzRmllbGQoKSAmJiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCXJldHVybiBlVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUKSAhPSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQ7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpICE9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVDsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2Ugey8vZGF0YXR5cGUlPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVCA9PSBudWxsID8gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCA6ICE8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQuZXF1YWxzKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRmllbGQoKSAmJiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVCA9PSBudWxsID8gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCA6ICE8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQuZXF1YWxzKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVCA9PSBudWxsID8gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSAhPSBudWxsIDogITwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVC5lcXVhbHMoPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSk7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JX0lPgotCQl9Ci08JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGZlYXR1cmVJRCk7Ci08JX0lPgotCX0KLQotPCVAIGVuZCAlPjwlLy9DbGFzcy9lSXNTZXQub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuQ2xhc3MuZ2V0TWl4aW5HZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcykKLQl7Ci0gIDwlZm9yIChJdGVyYXRvciBtPWdlbkNsYXNzLmdldE1peGluR2VuQ2xhc3NlcygpLml0ZXJhdG9yKCk7IG0uaGFzTmV4dCgpOykgeyBHZW5DbGFzcyBtaXhpbkdlbkNsYXNzID0gKEdlbkNsYXNzKW0ubmV4dCgpOyAlPgotCQlpZiAoYmFzZUNsYXNzID09IDwlPW1peGluR2VuQ2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotICAgIDwlZm9yIChJdGVyYXRvciBmPW1peGluR2VuQ2xhc3MuZ2V0R2VuRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBmLmhhc05leHQoKTspIHsgR2VuRmVhdHVyZSBnZW5GZWF0dXJlID0gKEdlbkZlYXR1cmUpZi5uZXh0KCk7ICU+Ci0JCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjogcmV0dXJuIDwlPW1peGluR2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT47Ci0gICAgPCV9JT4KLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLSAgPCV9JT4KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MpCi0JewotICA8JWZvciAoSXRlcmF0b3IgbT1nZW5DbGFzcy5nZXRNaXhpbkdlbkNsYXNzZXMoKS5pdGVyYXRvcigpOyBtLmhhc05leHQoKTspIHsgR2VuQ2xhc3MgbWl4aW5HZW5DbGFzcyA9IChHZW5DbGFzcyltLm5leHQoKTsgJT4KLQkJaWYgKGJhc2VDbGFzcyA9PSA8JT1taXhpbkdlbkNsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLSAgICA8JWZvciAoSXRlcmF0b3IgZj1taXhpbkdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgZi5oYXNOZXh0KCk7KSB7IEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA9IChHZW5GZWF0dXJlKWYubmV4dCgpOyAlPgotCQkJCWNhc2UgPCU9bWl4aW5HZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjogcmV0dXJuIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OwotICAgIDwlfSU+Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0gIDwlfSU+Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyBTdHJpbmcgZVZpcnR1YWxWYWx1ZXNGaWVsZCA9IGdlbkNsYXNzLmdldEVWaXJ0dWFsVmFsdWVzRmllbGQoKTslPgotICA8JWlmIChlVmlydHVhbFZhbHVlc0ZpZWxkICE9IG51bGwpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3RbXSBlVmlydHVhbFZhbHVlcygpCi0JewotCQlyZXR1cm4gPCU9ZVZpcnR1YWxWYWx1ZXNGaWVsZCU+OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVTZXRWaXJ0dWFsVmFsdWVzKE9iamVjdFtdIG5ld1ZhbHVlcykKLQl7Ci0JCTwlPWVWaXJ0dWFsVmFsdWVzRmllbGQlPiA9IG5ld1ZhbHVlczsKLQl9Ci0KLSAgPCV9JT4KLSAgPCV7IExpc3QgZVZpcnR1YWxJbmRleEJpdEZpZWxkcyA9IGdlbkNsYXNzLmdldEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMobmV3IEFycmF5TGlzdCgpKTslPgotICAgIDwlaWYgKCFlVmlydHVhbEluZGV4Qml0RmllbGRzLmlzRW1wdHkoKSkgeyBMaXN0IGFsbEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMgPSBnZW5DbGFzcy5nZXRBbGxFVmlydHVhbEluZGV4Qml0RmllbGRzKG5ldyBBcnJheUxpc3QoKSk7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGVWaXJ0dWFsSW5kZXhCaXRzKGludCBvZmZzZXQpCi0JewotCQlzd2l0Y2ggKG9mZnNldCkKLQkJewotICAgICAgPCVmb3IgKGludCBpID0gMDsgaSA8IGFsbEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMuc2l6ZSgpOyBpKyspIHslPgotCQkJY2FzZSA8JT1pJT4gOgotCQkJCXJldHVybiA8JT1hbGxFVmlydHVhbEluZGV4Qml0RmllbGRzLmdldChpKSU+OwotICAgICAgPCV9JT4KLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlU2V0VmlydHVhbEluZGV4Qml0cyhpbnQgb2Zmc2V0LCBpbnQgbmV3SW5kZXhCaXRzKQotCXsKLQkJc3dpdGNoIChvZmZzZXQpCi0JCXsKLSAgICAgIDwlZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFVmlydHVhbEluZGV4Qml0RmllbGRzLnNpemUoKTsgaSsrKSB7JT4KLQkJCWNhc2UgPCU9aSU+IDoKLQkJCQk8JT1hbGxFVmlydHVhbEluZGV4Qml0RmllbGRzLmdldChpKSU+ID0gbmV3SW5kZXhCaXRzOwotCQkJCWJyZWFrOwotICAgICAgPCV9JT4KLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLSAgICA8JX0lPgotICA8JX0lPgotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiAhZ2VuQ2xhc3MuZ2V0VG9TdHJpbmdHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gIDwleyBib29sZWFuIGZpcnN0ID0gdHJ1ZTslPgotICAgIDwlZm9yIChJdGVyYXRvciBpPWdlbkNsYXNzLmdldFRvU3RyaW5nR2VuRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7IEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA9IChHZW5GZWF0dXJlKWkubmV4dCgpOyU+Ci0gICAgICA8JWlmIChmaXJzdCkgeyBmaXJzdCA9IGZhbHNlOyU+Ci0JCXJlc3VsdC5hcHBlbmQoIiAoPCU9Z2VuRmVhdHVyZS5nZXROYW1lKCklPjogIik7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJlc3VsdC5hcHBlbmQoIiwgPCU9Z2VuRmVhdHVyZS5nZXROYW1lKCklPjogIik7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJaWYgKGVWaXJ0dWFsSXNTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pKSByZXN1bHQuYXBwZW5kKGVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJaWYgKDwlaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPig8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwPCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDwlfSU+KSByZXN1bHQuYXBwZW5kKCg8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcpICE9IDApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCWlmICg8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4oPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDwlfSBlbHNlIHslPjwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ8JX0lPikgcmVzdWx0LmFwcGVuZCg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXJlc3VsdC5hcHBlbmQoZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JWlmICghZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNSZWZlcmVuY2VUeXBlKCkpeyU+LCA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQ8JX0lPikpOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlyZXN1bHQuYXBwZW5kKCg8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcpICE9IDApOwotICAgICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXN1bHQuYXBwZW5kKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0lPgotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbkNsYXNzLmlzTWFwRW50cnkoKSkgeyBHZW5GZWF0dXJlIGtleUZlYXR1cmUgPSBnZW5DbGFzcy5nZXRNYXBFbnRyeUtleUZlYXR1cmUoKTsgR2VuRmVhdHVyZSB2YWx1ZUZlYXR1cmUgPSBnZW5DbGFzcy5nZXRNYXBFbnRyeVZhbHVlRmVhdHVyZSgpOyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGludCBoYXNoID0gLTE7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEhhc2goKQotCXsKLQkJaWYgKGhhc2ggPT0gLTEpCi0JCXsKLQkJCU9iamVjdCB0aGVLZXkgPSBnZXRLZXkoKTsKLQkJCWhhc2ggPSAodGhlS2V5ID09IG51bGwgPyAwIDogdGhlS2V5Lmhhc2hDb2RlKCkpOwotCQl9Ci0JCXJldHVybiBoYXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc2goaW50IGhhc2gpCi0JewotCQl0aGlzLmhhc2ggPSBoYXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkKLQl7Ci0gIDwlaWYgKGtleUZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlyZXR1cm4gbmV3IDwlPWtleUZlYXR1cmUuZ2V0T2JqZWN0VHlwZSgpJT4oZ2V0VHlwZWRLZXkoKSk7Ci0gIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gZ2V0VHlwZWRLZXkoKTsKLSAgPCV9JT4KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLZXkoT2JqZWN0IGtleSkKLQl7Ci0gIDwlaWYgKGtleUZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLQkJZ2V0VHlwZWRLZXkoKS5hZGRBbGwoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS51dGlsLkNvbGxlY3Rpb24iKSU+KWtleSk7Ci0gIDwlfSBlbHNlIGlmIChrZXlGZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJc2V0VHlwZWRLZXkoKCg8JT1rZXlGZWF0dXJlLmdldE9iamVjdFR5cGUoKSU+KWtleSkuPCU9a2V5RmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCXNldFR5cGVkS2V5KCg8JT1rZXlGZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pa2V5KTsKLSAgPCV9JT4KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkKLQl7Ci0gIDwlaWYgKHZhbHVlRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXJldHVybiBuZXcgPCU9dmFsdWVGZWF0dXJlLmdldE9iamVjdFR5cGUoKSU+KGdldFR5cGVkVmFsdWUoKSk7Ci0gIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gZ2V0VHlwZWRWYWx1ZSgpOwotICA8JX0lPgotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3Qgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKQotCXsKLQkJT2JqZWN0IG9sZFZhbHVlID0gZ2V0VmFsdWUoKTsKLSAgPCVpZiAodmFsdWVGZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0JCWdldFR5cGVkVmFsdWUoKS5jbGVhcigpOwotCQlnZXRUeXBlZFZhbHVlKCkuYWRkQWxsKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoImphdmEudXRpbC5Db2xsZWN0aW9uIiklPil2YWx1ZSk7Ci0gIDwlfSBlbHNlIGlmICh2YWx1ZUZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlzZXRUeXBlZFZhbHVlKCgoPCU9dmFsdWVGZWF0dXJlLmdldE9iamVjdFR5cGUoKSU+KXZhbHVlKS48JT12YWx1ZUZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKSk7Ci0gIDwlfSBlbHNlIHslPgotCQlzZXRUeXBlZFZhbHVlKCg8JT12YWx1ZUZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPil2YWx1ZSk7Ci0gIDwlfSU+Ci0JCXJldHVybiBvbGRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcCIpJT4gZ2V0RU1hcCgpCi0JewotCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IiklPiBjb250YWluZXIgPSBlQ29udGFpbmVyKCk7Ci0JCXJldHVybiBjb250YWluZXIgPT0gbnVsbCA/IG51bGwgOiAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcCIpJT4pY29udGFpbmVyLmVHZXQoZUNvbnRhaW5tZW50RmVhdHVyZSgpKTsKLQl9Ci0KLTwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotfSAvLzwlPWlzSW50ZXJmYWNlID8gIiAiICsgZ2VuQ2xhc3MuZ2V0SW50ZXJmYWNlTmFtZSgpIDogZ2VuQ2xhc3MuZ2V0Q2xhc3NOYW1lKCklPgotPCUvLyBUT0RPIGZpeCB0aGUgc3BhY2UgYWJvdmUlPgotPCVnZW5Nb2RlbC5lbWl0U29ydGVkSW1wb3J0cygpOyU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcy9tb2RlbC9DbGFzcy5qYXZhamV0Lm9yZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMvbW9kZWwvQ2xhc3MuamF2YWpldC5vcmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM5ZjZmMDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcy9tb2RlbC9DbGFzcy5qYXZhamV0Lm9yZworKysgL2Rldi9udWxsCkBAIC0xLDE4MTEgKzAsMCBAQAotPCVAIGpldCBwYWNrYWdlPSJvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5lY29yZS50ZW1wbGF0ZXMubW9kZWwiIGltcG9ydHM9ImphdmEudXRpbC4qIG9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLmVjb3JlLmdlbm1vZGVsLioiIGNsYXNzPSJDbGFzcyIgdmVyc2lvbj0iJElkJCIgJT4KLTwlCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqLwotJT4KLTwlZmluYWwgR2VuQ2xhc3MgZ2VuQ2xhc3MgPSAoR2VuQ2xhc3MpKChPYmplY3RbXSlhcmd1bWVudClbMF07IGZpbmFsIEdlblBhY2thZ2UgZ2VuUGFja2FnZSA9IGdlbkNsYXNzLmdldEdlblBhY2thZ2UoKTsgZmluYWwgR2VuTW9kZWwgZ2VuTW9kZWw9Z2VuUGFja2FnZS5nZXRHZW5Nb2RlbCgpOyU+Ci08JWZpbmFsIGJvb2xlYW4gaXNJbnRlcmZhY2UgPSBCb29sZWFuLlRSVUUuZXF1YWxzKCgoT2JqZWN0W10pYXJndW1lbnQpWzFdKTsgZmluYWwgYm9vbGVhbiBpc0ltcGxlbWVudGF0aW9uID0gQm9vbGVhbi5UUlVFLmVxdWFscygoKE9iamVjdFtdKWFyZ3VtZW50KVsyXSk7JT4KLTwlZmluYWwgU3RyaW5nIHB1YmxpY1N0YXRpY0ZpbmFsRmxhZyA9IGlzSW1wbGVtZW50YXRpb24gPyAicHVibGljIHN0YXRpYyBmaW5hbCAiIDogIiI7JT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii4uL0hlYWRlci5qYXZhamV0aW5jIiU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyU+Ci1wYWNrYWdlIDwlPWdlblBhY2thZ2UuZ2V0SW50ZXJmYWNlUGFja2FnZU5hbWUoKSU+OwotPCV9IGVsc2UgeyU+Ci1wYWNrYWdlIDwlPWdlblBhY2thZ2UuZ2V0Q2xhc3NQYWNrYWdlTmFtZSgpJT47Ci08JX0lPgotCi08JWdlbk1vZGVsLm1hcmtJbXBvcnRMb2NhdGlvbihzdHJpbmdCdWZmZXIsIGdlblBhY2thZ2UpOyU+Ci0KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPjwlPWdlbkNsYXNzLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotPCVpZiAoZ2VuQ2xhc3MuaGFzRG9jdW1lbnRhdGlvbigpKSB7JT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIDwlPWdlbkNsYXNzLmdldERvY3VtZW50YXRpb24oZ2VuTW9kZWwuZ2V0SW5kZW50YXRpb24oc3RyaW5nQnVmZmVyKSklPgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotPCV9JT4KLSAqCi08JWlmICghZ2VuQ2xhc3MuZ2V0R2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci08JWZvciAoSXRlcmF0b3IgaT1nZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlpLm5leHQoKTslPgotICA8JWlmICghZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRHZXRWaXNpYmlsaXR5KCkpIHslPgotICogICA8bGk+e0BsaW5rIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59PC9saT4KLSAgPCV9JT4KLTwlfSU+Ci0gKiA8L3VsPgotICogPC9wPgotPCV9JT4KLSAqCi08JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc0VNRk1ldGFEYXRhKCkpIHslPgotICogQHNlZSA8JT1nZW5QYWNrYWdlLmdldFF1YWxpZmllZFBhY2thZ2VJbnRlcmZhY2VOYW1lKCklPiNnZXQ8JT1nZW5DbGFzcy5nZXRDbGFzc2lmaWVyQWNjZXNzb3JOYW1lKCklPigpCi08JX0lPgotPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNb2RlbFRhZ3MoKSkgeyBib29sZWFuIGZpcnN0ID0gdHJ1ZTsgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihnZW5DbGFzcy5nZXRNb2RlbEluZm8oKSwgIlxuXHIiKTsgc3RyaW5nVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTsgKSB7IFN0cmluZyBtb2RlbEluZm8gPSBzdHJpbmdUb2tlbml6ZXIubmV4dFRva2VuKCk7IGlmIChmaXJzdCkgeyBmaXJzdCA9IGZhbHNlOyU+Ci0gKiBAbW9kZWwgPCU9bW9kZWxJbmZvJT4KLTwlfSBlbHNlIHslPgotICogICAgICAgIDwlPW1vZGVsSW5mbyU+Ci08JX19IGlmIChmaXJzdCkgeyU+Ci0gKiBAbW9kZWwKLTwlfX0lPgotPCVpZiAoZ2VuQ2xhc3MubmVlZHNSb290RXh0ZW5kc0ludGVyZmFjZUV4dGVuZHNUYWcoKSkgeyU+Ci0gKiBAZXh0ZW5kcyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoZ2VuTW9kZWwuZ2V0Um9vdEV4dGVuZHNJbnRlcmZhY2UoKSklPgotPCV9JT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotPCV9IGVsc2UgeyU+Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+PCU9Z2VuQ2xhc3MuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLTwlaWYgKCFnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSB7JT4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotPCVmb3IgKEl0ZXJhdG9yIGk9Z2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlpLm5leHQoKTslPgotICogICA8bGk+e0BsaW5rIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZENsYXNzTmFtZSgpJT4jPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn08L2xpPgotPCV9JT4KLSAqIDwvdWw+Ci08JX0lPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24pIHslPgotcHVibGljPCVpZiAoZ2VuQ2xhc3MuaXNBYnN0cmFjdCgpKSB7JT4gYWJzdHJhY3Q8JX0lPiBjbGFzcyA8JT1nZW5DbGFzcy5nZXRDbGFzc05hbWUoKSU+PCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NFeHRlbmRzKCklPjwlPWdlbkNsYXNzLmdldENsYXNzSW1wbGVtZW50cygpJT4KLTwlfSBlbHNlIHslPgotcHVibGljIGludGVyZmFjZSA8JT1nZW5DbGFzcy5nZXRJbnRlcmZhY2VOYW1lKCklPjwlPWdlbkNsYXNzLmdldEludGVyZmFjZUV4dGVuZHMoKSU+Ci08JX0lPgotewotPCVpZiAoZ2VuTW9kZWwuZ2V0Q29weXJpZ2h0VGV4dCgpICE9IG51bGwpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCTwlPXB1YmxpY1N0YXRpY0ZpbmFsRmxhZyU+PCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLmxhbmcuU3RyaW5nIiklPiBjb3B5cmlnaHQgPSAiPCU9Z2VuTW9kZWwuZ2V0Q29weXJpZ2h0VGV4dCgpJT4iOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuTW9kZWwuZ2V0RHJpdmVyTnVtYmVyKCkgIT0gbnVsbCkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoImphdmEubGFuZy5TdHJpbmciKSU+IG1vZkRyaXZlck51bWJlciA9ICI8JT1nZW5Nb2RlbC5nZXREcml2ZXJOdW1iZXIoKSU+Ijs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbkNsYXNzLmlzSmF2YUlPU2VyaWFsaXphYmxlKCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHsgU3RyaW5nIGVWaXJ0dWFsVmFsdWVzRmllbGQgPSBnZW5DbGFzcy5nZXRFVmlydHVhbFZhbHVlc0ZpZWxkKCk7JT4KLSAgPCVpZiAoZVZpcnR1YWxWYWx1ZXNGaWVsZCAhPSBudWxsKSB7JT4KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzIG9mIG5vbi1wcmltaXRpdmUgZmVhdHVyZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdFtdIDwlPWVWaXJ0dWFsVmFsdWVzRmllbGQlPiA9IG51bGw7Ci0KLSAgPCV9JT4KLSAgPCV7IExpc3QgZVZpcnR1YWxJbmRleEJpdEZpZWxkcyA9IGdlbkNsYXNzLmdldEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMobmV3IEFycmF5TGlzdCgpKTslPgotICAgIDwlaWYgKCFlVmlydHVhbEluZGV4Qml0RmllbGRzLmlzRW1wdHkoKSkgeyU+Ci0gICAgICA8JWZvciAoSXRlcmF0b3IgaSA9IGVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7IFN0cmluZyBlVmlydHVhbEluZGV4Qml0RmllbGQgPSAoU3RyaW5nKWkubmV4dCgpOyU+Ci0JLyoqCi0JICogQSBiaXQgZmllbGQgcmVwcmVzZW50aW5nIHRoZSBpbmRpY2VzIG9mIG5vbi1wcmltaXRpdmUgZmVhdHVyZSB2YWx1ZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGludCA8JT1lVmlydHVhbEluZGV4Qml0RmllbGQlPiA9IDA7Ci0KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbkNsYXNzLmlzTW9kZWxSb290KCkgJiYgZ2VuTW9kZWwuaXNCb29sZWFuRmxhZ3NFbmFibGVkKCkgJiYgZ2VuTW9kZWwuZ2V0Qm9vbGVhbkZsYWdzUmVzZXJ2ZWRCaXRzKCkgPT0gLTEpIHslPgotCS8qKgotCSAqIEEgc2V0IG9mIGJpdCBmbGFncyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBvZiBib29sZWFuIGF0dHJpYnV0ZXMgYW5kIHdoZXRoZXIgdW5zZXR0YWJsZSBmZWF0dXJlcyBoYXZlIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCA8JT1nZW5Nb2RlbC5nZXRCb29sZWFuRmxhZ3NGaWVsZCgpJT4gPSAwOwotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpKSB7JT4KLSAgPCVmb3IgKEl0ZXJhdG9yIGk9Z2VuQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZEdlbkZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7IEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA9IChHZW5GZWF0dXJlKWkubmV4dCgpOyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9kZWNsYXJlZEZpZWxkR2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpIHx8IGdlbkZlYXR1cmUuaXNSZWZlcmVuY2VUeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRJbnRlcm5hbFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbnVsbDsKLQotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLmlzQXJyYXlBY2Nlc3NvcnMoKSAmJiAhZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHslPgotCS8qKgotCSAqIFRoZSBlbXB0eSB2YWx1ZSBmb3IgdGhlICd7QGxpbmsgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QXJyYXlBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgYXJyYXkgYWNjZXNzb3IuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFycmF5QWNjZXNzb3IoKSU+KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKCklPltdIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRU1QVFlfQVJSQVkgPSBuZXcgPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoKSU+IFswXTsKLQotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSB8fCAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmICghZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSB8fCAhZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkpIHslPgotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpIDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQgPSA8JT1nZW5GZWF0dXJlLmdldFN0YXRpY0RlZmF1bHRWYWx1ZSgpJT47PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKGdlbkZlYXR1cmUuZ2V0U3RhdGljRGVmYXVsdFZhbHVlKCkpJT4KLQotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmdldEZsYWdJbmRleChnZW5GZWF0dXJlKSA+IDMxICYmIGdlbkNsYXNzLmdldEZsYWdJbmRleChnZW5GZWF0dXJlKSAlIDMyID09IDApIHslPgotCS8qKgotCSAqIEFuIGFkZGl0aW9uYWwgc2V0IG9mIGJpdCBmbGFncyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBvZiBib29sZWFuIGF0dHJpYnV0ZXMgYW5kIHdoZXRoZXIgdW5zZXR0YWJsZSBmZWF0dXJlcyBoYXZlIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCA8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gPSAwOwotCi0gICAgICAgICAgPCV9JT4KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpIDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcgPSAxIDwlPSI8PCAiICsgZ2VuQ2xhc3MuZ2V0RmxhZ0luZGV4KGdlbkZlYXR1cmUpICUgMzIgJT47Ci0KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVDsKLQotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkNsYXNzLmlzRVNldEZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICA8JWlmIChnZW5DbGFzcy5nZXRFU2V0RmxhZ0luZGV4KGdlbkZlYXR1cmUpID4gMzEgJiYgZ2VuQ2xhc3MuZ2V0RVNldEZsYWdJbmRleChnZW5GZWF0dXJlKSAlIDMyID09IDApIHslPgotCS8qKgotCSAqIEFuIGFkZGl0aW9uYWwgc2V0IG9mIGJpdCBmbGFncyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBvZiBib29sZWFuIGF0dHJpYnV0ZXMgYW5kIHdoZXRoZXIgdW5zZXR0YWJsZSBmZWF0dXJlcyBoYXZlIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCA8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ID0gMDsKLQotICAgICAgICA8JX0lPgotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB3aGV0aGVyIHRoZSA8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRyA9IDEgPCU9Ijw8ICIgKyBnZW5DbGFzcy5nZXRFU2V0RmxhZ0luZGV4KGdlbkZlYXR1cmUpICUgMzIgJT47Ci0KLSAgICAgIDwlfSBlbHNlIHslPgotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPiA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gZmFsc2U7Ci0KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2RlY2xhcmVkRmllbGRHZW5GZWF0dXJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL2RlY2xhcmVkRmllbGRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24pIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCA8JT1nZW5DbGFzcy5nZXRDbGFzc05hbWUoKSU+KCkKLQl7Ci0JCXN1cGVyKCk7Ci0gIDwlZm9yIChJdGVyYXRvciBpPWdlbkNsYXNzLmdldEZsYWdHZW5GZWF0dXJlcygidHJ1ZSIpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlpLm5leHQoKTslPgotCQk8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOwotICA8JX0lPgotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3MiKSU+IGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkQ2xhc3NpZmllckFjY2Vzc29yKCklPjsKLQl9Ci0KLTwlfSU+Ci08JW5ldyBSdW5uYWJsZSgpIHsgcHVibGljIHZvaWQgcnVuKCkgeyU+Ci08JWZvciAoSXRlcmF0b3IgaT0oaXNJbXBsZW1lbnRhdGlvbiA/IGdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKSA6IGdlbkNsYXNzLmdldERlY2xhcmVkR2VuRmVhdHVyZXMoKSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7IEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA9IChHZW5GZWF0dXJlKWkubmV4dCgpOyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0gIDwlaWYgKGdlbk1vZGVsLmlzQXJyYXlBY2Nlc3NvcnMoKSAmJiBnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIDwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQk8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZSgpJT5bXSA8JT1nZW5GZWF0dXJlLmdldEdldEFycmF5QWNjZXNzb3IoKSU+KCk7Ci0KLSAgICA8JX0gZWxzZSB7JT4KLQlwdWJsaWMgPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoKSU+W10gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBcnJheUFjY2Vzc29yKCklPigpCi0JewotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0IiklPiBsaXN0ID0gKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSkgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRU1QVFlfQVJSQVk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID09IG51bGwgfHwgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uaXNFbXB0eSgpKSByZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VFTVBUWV9BUlJBWTsKLQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCIpJT4gbGlzdCA9ICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgIDwlfSU+Ci0JCWxpc3Quc2hyaW5rKCk7Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoKSU+W10pbGlzdC5kYXRhKCk7Ci0JfQotCi0gICAgPCV9JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICA8JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoKSU+IGdldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihpbnQgaW5kZXgpOwotCi0gICAgPCV9IGVsc2UgeyU+Ci0JcHVibGljIDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKCklPiBnZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oaW50IGluZGV4KQotCXsKLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZSgpJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5nZXQoaW5kZXgpOwotCX0KLQotICAgIDwlfSU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCWludCBnZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT5MZW5ndGgoKTsKLQotICAgIDwlfSBlbHNlIHslPgotCXB1YmxpYyBpbnQgZ2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+TGVuZ3RoKCkKLQl7Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLnNpemUoKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPT0gbnVsbCA/IDAgOiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPi5zaXplKCk7Ci0gICAgICA8JX0lPgotCX0KLQotICAgIDwlfSU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCXZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKCklPltdIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pOwotCi0gICAgPCV9IGVsc2UgeyU+Ci0JcHVibGljIHZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKCklPltdIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pCi0JewotCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLnNldERhdGEobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5sZW5ndGgsIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pOwotCX0KLQotICAgIDwlfSU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCXZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KGludCBpbmRleCwgPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoKSU+IGVsZW1lbnQpOwotCi0gICAgPCV9IGVsc2UgeyU+Ci0JcHVibGljIHZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KGludCBpbmRleCwgPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoKSU+IGVsZW1lbnQpCi0JewotCQk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLnNldChpbmRleCwgZWxlbWVudCk7Ci0JfQotCi0gICAgPCV9JT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc0dldCgpICYmIChpc0ltcGxlbWVudGF0aW9uIHx8ICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZEdldFZpc2liaWxpdHkoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2I+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHsgR2VuRmVhdHVyZSBrZXlGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRNYXBFbnRyeVR5cGVHZW5DbGFzcygpLmdldE1hcEVudHJ5S2V5RmVhdHVyZSgpOyBHZW5GZWF0dXJlIHZhbHVlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0TWFwRW50cnlUeXBlR2VuQ2xhc3MoKS5nZXRNYXBFbnRyeVZhbHVlRmVhdHVyZSgpOyAlPgotCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSA8JWlmIChrZXlGZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+bGlzdCBvZiB7QGxpbmsgPCU9a2V5RmVhdHVyZS5nZXRRdWFsaWZpZWRMaXN0SXRlbVR5cGUoKSU+fTwlfSBlbHNlIHslPntAbGluayA8JT1rZXlGZWF0dXJlLmdldFR5cGUoKSU+fTwlfSU+LAotCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSA8JWlmICh2YWx1ZUZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT5saXN0IG9mIHtAbGluayA8JT12YWx1ZUZlYXR1cmUuZ2V0UXVhbGlmaWVkTGlzdEl0ZW1UeXBlKCklPn08JX0gZWxzZSB7JT57QGxpbmsgPCU9dmFsdWVGZWF0dXJlLmdldFR5cGUoKSU+fTwlfSU+LAotICAgICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkgJiYgIShnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTWV0YURhdGEoKSAmJiAib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiLmVxdWFscyhnZW5GZWF0dXJlLmdldFF1YWxpZmllZExpc3RJdGVtVHlwZSgpKSkpIHslPgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayA8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZExpc3RJdGVtVHlwZSgpJT59LgotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1NldERlZmF1bHRWYWx1ZSgpKSB7JT4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT48JT1nZW5GZWF0dXJlLmdldERlZmF1bHRWYWx1ZSgpJT48L2NvZGU+LgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5nZXRUeXBlR2VuRW51bSgpICE9IG51bGwpIHslPgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIDwlPWdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKS5nZXRRdWFsaWZpZWROYW1lKCklPn0uCi0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpICYmICFnZW5GZWF0dXJlLmdldFJldmVyc2UoKS5nZXRHZW5DbGFzcygpLmlzTWFwRW50cnkoKSkgeyBHZW5GZWF0dXJlIHJldmVyc2VHZW5GZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7ICU+Ci0gICAgICA8JWlmICghcmV2ZXJzZUdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkR2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayA8JT1yZXZlcnNlR2VuRmVhdHVyZS5nZXRHZW5DbGFzcygpLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPXJldmVyc2VHZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPiA8ZW0+PCU9cmV2ZXJzZUdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nLgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgPCVpZiAoIWdlbkZlYXR1cmUuaGFzRG9jdW1lbnRhdGlvbigpKSB7JT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0gICAgPCV9JT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmhhc0RvY3VtZW50YXRpb24oKSkgeyU+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogPCU9Z2VuRmVhdHVyZS5nZXREb2N1bWVudGF0aW9uKGdlbk1vZGVsLmdldEluZGVudGF0aW9uKHN0cmluZ0J1ZmZlcikpJT4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gICAgPCV9JT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotICAgIDwlaWYgKGdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKSAhPSBudWxsKSB7JT4KLQkgKiBAc2VlIDwlPWdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKS5nZXRRdWFsaWZpZWROYW1lKCklPgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRJc1NldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ2hhbmdlYWJsZSgpICYmICFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pCi0gICAgPCV9JT4KLSAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc0VNRk1ldGFEYXRhKCkpIHslPgotCSAqIEBzZWUgPCU9Z2VuUGFja2FnZS5nZXRRdWFsaWZpZWRQYWNrYWdlSW50ZXJmYWNlTmFtZSgpJT4jZ2V0PCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlQWNjZXNzb3JOYW1lKCklPigpCi0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpICYmICFnZW5GZWF0dXJlLmdldFJldmVyc2UoKS5nZXRHZW5DbGFzcygpLmlzTWFwRW50cnkoKSkgeyBHZW5GZWF0dXJlIHJldmVyc2VHZW5GZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7ICU+Ci0gICAgICA8JWlmICghcmV2ZXJzZUdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkR2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlIDwlPXJldmVyc2VHZW5GZWF0dXJlLmdldEdlbkNsYXNzKCkuZ2V0UXVhbGlmaWVkSW50ZXJmYWNlTmFtZSgpJT4jPCU9cmV2ZXJzZUdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNb2RlbFRhZ3MoKSkgeyBib29sZWFuIGZpcnN0ID0gdHJ1ZTsgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihnZW5GZWF0dXJlLmdldE1vZGVsSW5mbygpLCAiXG5cciIpOyBzdHJpbmdUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpOyApIHsgU3RyaW5nIG1vZGVsSW5mbyA9IHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKTsgaWYgKGZpcnN0KSB7IGZpcnN0ID0gZmFsc2U7JT4KLQkgKiBAbW9kZWwgPCU9bW9kZWxJbmZvJT4KLSAgICA8JX0gZWxzZSB7JT4KLQkgKiAgICAgICAgPCU9bW9kZWxJbmZvJT4KLSAgICA8JX19IGlmIChmaXJzdCkgeyU+Ci0JICogQG1vZGVsCi0gICAgPCV9fSU+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JX0lPgotPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotCi08JX0gZWxzZSB7JT4KLQlwdWJsaWMgPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLQl7Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZXRHZW5GZWF0dXJlLnByZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotICAgIDwlaWYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0JCXJldHVybiA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4oPCV9JT4oPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKCklPillR2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgdHJ1ZSk8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pLjwlPWdlbkZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKTwlfSU+OwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KTsKLSAgICAgICAgPCV9JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID09IG51bGwpCi0JCXsKLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCWVWaXJ0dWFsU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG5ldyA8JT1nZW5DbGFzcy5nZXRMaXN0Q29uc3RydWN0b3IoZ2VuRmVhdHVyZSklPik7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBuZXcgPCU9Z2VuQ2xhc3MuZ2V0TGlzdENvbnN0cnVjdG9yKGdlbkZlYXR1cmUpJT47Ci0gICAgICAgIDwlfSU+Ci0JCX0KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+PCU9Z2VuRmVhdHVyZS5pc01hcFR5cGUoKSAmJiBnZW5GZWF0dXJlLmlzRWZmZWN0aXZlU3VwcHJlc3NFTUZUeXBlcygpID8gIi5tYXAoKSIgOiAiIiU+OwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSkgeyU+Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pZUNvbnRhaW5lcigpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpKSB7JT4KLSAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCVpZiAoIWdlbkZlYXR1cmUuaXNSZWZlcmVuY2VUeXBlKCkpIHslPiwgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUPCV9JT4pOwotICAgICAgICAgIDwlfSU+Ci0JCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsICYmIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWVBc0VPYmplY3QoKSU+LmVJc1Byb3h5KCkpCi0JCXsKLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9ICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotCQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldE5vbkVPYmplY3RJbnRlcm5hbFR5cGVDYXN0KCklPmVSZXNvbHZlUHJveHkob2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPik7Ci0JCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikKLQkJCXsKLSAgICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRWZmZWN0aXZlQ29udGFpbnMoKSkgeyU+Ci0JCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkpIHslPgotCQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MgPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgPCV9IGVsc2UgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTslPgotCQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MgPSAgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5lSW52ZXJzZVJlbW92ZSh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG51bGwpOwotICAgICAgICAgIDwlfSU+Ci0JCQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkKLQkJCQl7Ci0gICAgICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkpIHslPgotCQkJCQltc2dzID0gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIG51bGwsIG1zZ3MpOwotICAgICAgICAgIDwlfSBlbHNlIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7JT4KLQkJCQkJbXNncyA9ICBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LmVJbnZlcnNlQWRkKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0gICAgICAgICAgPCV9JT4KLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotICAgICAgICAgIDwlfSBlbHNlIGlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCWVWaXJ0dWFsU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5SRVNPTFZFLCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pKTsKLSAgICAgICAgICA8JX0lPgotCQkJfQotCQl9Ci0gICAgICAgIDwlfSU+Ci0gICAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzUmVzb2x2ZVByb3hpZXMoKSAmJiBnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlaWYgKCFnZW5GZWF0dXJlLmlzUmVmZXJlbmNlVHlwZSgpKSB7JT4sIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVDwlfSU+KTsKLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCXJldHVybiAoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7Ly92b2xhdGlsZSU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzUmVzb2x2ZVByb3hpZXMoKSAmJiAhZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBiYXNpY0dldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPi5lSXNQcm94eSgpID8gPCU9Z2VuRmVhdHVyZS5nZXROb25FT2JqZWN0SW50ZXJuYWxUeXBlQ2FzdCgpJT5lUmVzb2x2ZVByb3h5KCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KSA6IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLSAgICAgICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiBuZXcgPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZEVmZmVjdGl2ZUZlYXR1cmVNYXBXcmFwcGVyQ2xhc3MoKSU+KCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKS5saXN0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPikpOwotICAgICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4pKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+KWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmxpc3QoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKS5saXN0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4pZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkubGlzdCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPig8JX0lPig8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoKSU+KSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKS5nZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCB0cnVlKTwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPikuPCU9Z2VuRmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpPCV9JT47Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4oPCV9JT4oPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKCklPilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpLmdldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIHRydWUpPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KS48JT1nZW5GZWF0dXJlLmdldFByaW1pdGl2ZVZhbHVlRnVuY3Rpb24oKSU+KCk8JX0lPjsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+Ci0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLQkJLy8gVGhlIGxpc3QgaXMgZXhwZWN0ZWQgdG8gaW1wbGVtZW50IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QgYW5kIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZwotCQkvLyBzbyBpdCdzIGxpa2VseSB0aGF0IGFuIGFwcHJvcHJpYXRlIHN1YmNsYXNzIG9mIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLjwlaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHslPkVjb3JlRU1hcDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSkgeyU+QmFzaWNGZWF0dXJlTWFwPCV9IGVsc2UgeyU+RWNvcmVFTGlzdDwlfSU+IHNob3VsZCBiZSB1c2VkLgotICAgICAgICA8JX0lPgotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvZ2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZ2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkZlYXR1cmUuaXNCYXNpY0dldCgpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gYmFzaWNHZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotCXsKLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5wcmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkpIHslPgotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KWVJbnRlcm5hbENvbnRhaW5lcigpOwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKS5nZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCBmYWxzZSk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKS5nZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCBmYWxzZSk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNHZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+Ci0JCS8vIC0+IGRvIG5vdCBwZXJmb3JtIHByb3h5IHJlc29sdXRpb24KLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgIDwlfSU+Ci0JfQotCi08JUAgZW5kICU+PCUvL0NsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkZlYXR1cmUuaXNCYXNpY1NldCgpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkSW50ZXJuYWxUeXBlKCklPiBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzKQotCXsKLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLnByZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KW5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCBtc2dzKTsKLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5wb3N0Lmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JCXJldHVybiBtc2dzOwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLnByZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJT2JqZWN0IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSBlVmlydHVhbFNldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+OwotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQlib29sZWFuIGlzU2V0Q2hhbmdlID0gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBFVklSVFVBTF9OT19WQUxVRTsKLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0JCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSB0cnVlOwotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPiBub3RpZmljYXRpb24gPSBuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2UgPyBudWxsIDogb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5pc1NldENoYW5nZTwlfSBlbHNlIHslPiFvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldDwlfSU+KTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPiBub3RpZmljYXRpb24gPSBuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBFVklSVFVBTF9OT19WQUxVRSA/IG51bGwgOiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KTsKLSAgICAgICAgPCV9JT4KLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotICAgICAgPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5wb3N0Lmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JCXJldHVybiBtc2dzOwotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKSkuYmFzaWNBZGQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBtc2dzKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmJhc2ljQWRkKDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbXNncyk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgY29udGFpbmVkICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyAtPiB0aGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGludm9rZWQgdG8ga2VlcCB0aGUgY29udGFpbm1lbnQgcmVsYXRpb25zaGlwIGluIHN5bmNoCi0JCS8vIC0+IGRvIG5vdCBtb2RpZnkgb3RoZXIgZmVhdHVyZXMKLQkJLy8gLT4gcmV0dXJuIG1zZ3MsIGFmdGVyIGFkZGluZyBhbnkgZ2VuZXJhdGVkIE5vdGlmaWNhdGlvbiB0byBpdCAoaWYgaXQgaXMgbnVsbCwgYSBOb3RpZmljYXRpb25DaGFpbiBvYmplY3QgbXVzdCBiZSBjcmVhdGVkIGZpcnN0KQotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlQCBlbmQgJT48JS8vQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotICA8JWlmIChnZW5GZWF0dXJlLmlzU2V0KCkgJiYgKGlzSW1wbGVtZW50YXRpb24gfHwgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSgpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyAlPgotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VudW1UeXBlKCkpIHslPgotCSAqIEBzZWUgPCU9Z2VuRmVhdHVyZS5nZXRUeXBlR2VuRW51bSgpLmdldFF1YWxpZmllZE5hbWUoKSU+Ci0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLSAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZElzU2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICNpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gICAgICA8JX0lPgotICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JX0lPgotPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHsgJT4KLQl2b2lkIHNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gdmFsdWUpOwotCi08JX0gZWxzZSB7JT4KLQlwdWJsaWMgdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pCi0JewotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5wcmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLSAgICA8JWlmIChnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkpIHslPgotCQllU2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+bmV3IDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZSgpJT4oPCV9JT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KTwlfSU+KTsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSkgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTslPgotCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiAmJiBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IG51bGwpKQotCQl7Ci0JCQlpZiAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWwiKSU+LmlzQW5jZXN0b3IodGhpcywgPCU9Z2VuRmVhdHVyZS5nZXRFT2JqZWN0Q2FzdCgpJT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KSkKLQkJCQl0aHJvdyBuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiklPigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiluZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KS5lSW52ZXJzZUFkZCh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0SW50ZXJuYWxUeXBlQ2FzdCgpJT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikpOwotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkgfHwgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZUNvbnRhaW5zKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KTsKLSAgICAgICAgPCV9JT4KLQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pCi0JCXsKLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MgPSBudWxsOwotCQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwpCi0gICAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpKSB7JT4KLQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gbnVsbCkKLQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KW5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgbnVsbCwgbXNncyk7Ci0gICAgICAgIDwlfSBlbHNlIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7JT4KLQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gbnVsbCkKLQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KW5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pLmVJbnZlcnNlQWRkKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0gICAgICAgIDwlfSU+Ci0JCQltc2dzID0gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbnRlcm5hbFR5cGVDYXN0KCklPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotCQllbHNlCi0gICAgCXsKLSAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IGVWaXJ0dWFsSXNTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pOwotICAgICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9ICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotICAgICAgICAgICAgPCV9JT4KLQkJCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLSAgICAgICAgICAgIDwlfSU+Ci0JCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gdHJ1ZTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCAhb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQpKTsKLSAgICAgICAgICA8JX0lPgotICAgIAl9Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9ICg8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcpICE9IDA7Ci0gICAgICAgICAgPCV9JT4KLQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pIDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiB8PSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUc7IGVsc2UgPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICY9IH48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUc7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgfHwgZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0gICAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRW51bVR5cGUoKSkgeyU+Ci0gICAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID09IG51bGwgPyA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQgOiBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+OwotICAgICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBudWxsID8gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUIDogbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldEludGVybmFsVHlwZUNhc3QoKSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0SW50ZXJuYWxUeXBlQ2FzdCgpJT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+OwotICAgICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCU9iamVjdCBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gZVZpcnR1YWxTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLSAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlib29sZWFuIGlzU2V0Q2hhbmdlID0gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBFVklSVFVBTF9OT19WQUxVRTsKLSAgICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9ICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotICAgICAgICAgICAgPCV9JT4KLQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiB8PSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0gICAgICAgICAgICA8JX0lPgotCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gdHJ1ZTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5pc1NldENoYW5nZSA/IDwlaWYgKGdlbkZlYXR1cmUuaXNSZWZlcmVuY2VUeXBlKCkpIHslPm51bGw8JX0gZWxzZSB7JT48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQ8JX0lPiA6IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPjwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+PCV9JT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+aXNTZXRDaGFuZ2U8JX0gZWxzZSB7JT4hb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPikpOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID09IEVWSVJUVUFMX05PX1ZBTFVFID8gPCVpZiAoZ2VuRmVhdHVyZS5pc1JlZmVyZW5jZVR5cGUoKSkgeyU+bnVsbDwlfSBlbHNlIHslPjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVDwlfSU+IDogb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT48JX0lPikpOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5wb3N0Lmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkpLnNldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPm5ldyA8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoKSU+KDwlfSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPik8JX0lPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLnNldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPm5ldyA8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoKSU+KDwlfSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPik8JX0lPik7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3Mvc2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgIDwlfSU+Ci0JfQotCi08JX0lPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9zZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotICA8JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuRmVhdHVyZS5pc0Jhc2ljVW5zZXQoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1Vuc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBiYXNpY1Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MpCi0JewotICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQlPYmplY3Qgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IGVWaXJ0dWFsVW5zZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbnVsbDsKLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQlib29sZWFuIGlzU2V0Q2hhbmdlID0gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBFVklSVFVBTF9OT19WQUxVRTsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9ICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICY9IH48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSBmYWxzZTsKLSAgICAgIDwlfSU+Ci0gICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+IG5vdGlmaWNhdGlvbiA9IG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uVU5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlID8gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA6IG51bGw8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIG51bGwsIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2U8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldDwlfSU+KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLSAgICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljVW5zZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHVuc2V0IHRoZSBjb250YWluZWQgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+Ci0JCS8vIC0+IHRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgaW52b2tlZCB0byBrZWVwIHRoZSBjb250YWlubWVudCByZWxhdGlvbnNoaXAgaW4gc3luY2gKLQkJLy8gLT4gZG8gbm90IG1vZGlmeSBvdGhlciBmZWF0dXJlcwotCQkvLyAtPiByZXR1cm4gbXNncywgYWZ0ZXIgYWRkaW5nIGFueSBnZW5lcmF0ZWQgTm90aWZpY2F0aW9uIHRvIGl0IChpZiBpdCBpcyBudWxsLCBhIE5vdGlmaWNhdGlvbkNoYWluIG9iamVjdCBtdXN0IGJlIGNyZWF0ZWQgZmlyc3QpCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9iYXNpY1Vuc2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgIDwlfSU+Ci0JfQotCi08JUAgZW5kICU+PCUvL0NsYXNzLmJhc2ljVW5zZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXQoKSAmJiAoaXNJbXBsZW1lbnRhdGlvbiB8fCAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRVbnNldFZpc2liaWxpdHkoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyU+Ci0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPiA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgPCVpZiAoIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkSXNTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI2lzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgPCV9JT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0gIDwlaWYgKCFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pCi0gIDwlfSU+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JX0lPgotPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCXZvaWQgdW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKTsKLQotPCV9IGVsc2UgeyU+Ci0JcHVibGljIHZvaWQgdW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotCXsKLSAgICA8JWlmIChnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkpIHslPgotCQllVW5zZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPik7Ci0gICAgICAgIDwlfSU+Ci0JCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsKSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpJT4uVW5zZXR0YWJsZSk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikudW5zZXQoKTsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpIHx8IGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVDb250YWlucygpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPik7Ci0gICAgICAgIDwlfSU+Ci0JCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsKQotCQl7Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gbnVsbDsKLSAgICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkpIHslPgotCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCBudWxsLCBtc2dzKTsKLSAgICAgICAgPCV9IGVsc2UgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTslPgotCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLSAgICAgICAgPCV9JT4KLQkJCW1zZ3MgPSBiYXNpY1Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UKLSAgICAJewotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IGVWaXJ0dWFsSXNTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0gICAgICAgICAgPCV9JT4KLQkJCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLSAgICAgICAgICA8JX0lPgotCQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IGZhbHNlOwotICAgICAgICA8JX0lPgotICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uVU5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCBudWxsLCBudWxsLCBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCkpOwotICAgICAgICA8JX0lPgotICAgIAl9Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSAoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlPYmplY3Qgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IGVWaXJ0dWFsVW5zZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlib29sZWFuIGlzU2V0Q2hhbmdlID0gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBFVklSVFVBTF9OT19WQUxVRTsKLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzUmVmZXJlbmNlVHlwZSgpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBudWxsOwotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotICAgICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5VTlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2UgPyBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+IDogbnVsbDwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgbnVsbCwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5pc1NldENoYW5nZTwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0PCV9JT4pKTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUKSA8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOyBlbHNlIDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOwotICAgICAgICAgIDwlfSBlbHNlIGlmICghZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpIHx8IGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVDsKLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgfHwgZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0gICAgICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSBmYWxzZTsKLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlVOU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5pc1NldENoYW5nZSA/IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gOiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQ8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVCwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5pc1NldENoYW5nZTwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0PCV9JT4pKTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkgeyBHZW5GZWF0dXJlIGRlbGVnYXRlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0RGVsZWdhdGVGZWF0dXJlKCk7JT4KLSAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKSkuY2xlYXIoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuY2xlYXIoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy91bnNldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gdW5zZXQgdGhlICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL3Vuc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc0lzU2V0KCkgJiYgKGlzSW1wbGVtZW50YXRpb24gfHwgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkSXNTZXRWaXNpYmlsaXR5KCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2lzU2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkSW50ZXJmYWNlTmFtZSgpJT4jPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBpcyBzZXQuCi0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NoYW5nZWFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRVbnNldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjdW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICAgIDwlfSU+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiBnZW5GZWF0dXJlLmlzQ2hhbmdlYWJsZSgpICYmICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFNldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPikKLSAgICA8JX0lPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlfSBlbHNlIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCV9JT4KLTwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQlib29sZWFuIGlzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0KLTwlfSBlbHNlIHslPgotCXB1YmxpYyBib29sZWFuIGlzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLQl7Ci0gICAgPCVpZiAoZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpKSB7JT4KLQkJcmV0dXJuIGVJc1NldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KTsKLSAgICAgICAgPCV9JT4KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSU+LlVuc2V0dGFibGUpPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmlzU2V0KCk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJcmV0dXJuIGVWaXJ0dWFsSXNTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCXJldHVybiAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkgeyBHZW5GZWF0dXJlIGRlbGVnYXRlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0RGVsZWdhdGVGZWF0dXJlKCk7JT4KLSAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuICEoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpKS5pc0VtcHR5KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuICEoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuaXNFbXB0eSg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2lzU2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gd2hldGhlciB0aGUgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGlzIHNldAotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL2lzU2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbkZlYXR1cmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZ2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfS8vZm9yJT4KLTwlfX0ucnVuKCk7JT4KLTwlZm9yIChJdGVyYXRvciBpPSAoaXNJbXBsZW1lbnRhdGlvbiA/IGdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuT3BlcmF0aW9ucygpIDogZ2VuQ2xhc3MuZ2V0RGVjbGFyZWRHZW5PcGVyYXRpb25zKCkpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBHZW5PcGVyYXRpb24gZ2VuT3BlcmF0aW9uID0gKEdlbk9wZXJhdGlvbilpLm5leHQoKTslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2VuT3BlcmF0aW9uLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgPCVpZiAoZ2VuT3BlcmF0aW9uLmhhc0RvY3VtZW50YXRpb24oKSkgeyU+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogPCU9Z2VuT3BlcmF0aW9uLmdldERvY3VtZW50YXRpb24oZ2VuTW9kZWwuZ2V0SW5kZW50YXRpb24oc3RyaW5nQnVmZmVyKSklPgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAgPCV9JT4KLSAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNb2RlbFRhZ3MoKSkgeyBib29sZWFuIGZpcnN0ID0gdHJ1ZTsgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihnZW5PcGVyYXRpb24uZ2V0TW9kZWxJbmZvKCksICJcblxyIik7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgeyBTdHJpbmcgbW9kZWxJbmZvID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOyBpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZTslPgotCSAqIEBtb2RlbCA8JT1tb2RlbEluZm8lPgotICA8JX0gZWxzZSB7JT4KLQkgKiAgICAgICAgPCU9bW9kZWxJbmZvJT4KLSAgPCV9fSBpZiAoZmlyc3QpIHslPgotCSAqIEBtb2RlbAotICA8JX19JT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JX0gZWxzZSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlfSU+Ci08JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JPCU9Z2VuT3BlcmF0aW9uLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuT3BlcmF0aW9uLmdldE5hbWUoKSU+KDwlPWdlbk9wZXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCklPik8JT1nZW5PcGVyYXRpb24uZ2V0VGhyb3dzKCklPjsKLQotPCV9IGVsc2UgeyU+Ci0JcHVibGljIDwlPWdlbk9wZXJhdGlvbi5nZXRJbXBvcnRlZFR5cGUoKSU+IDwlPWdlbk9wZXJhdGlvbi5nZXROYW1lKCklPig8JT1nZW5PcGVyYXRpb24uZ2V0UGFyYW1ldGVycygpJT4pPCU9Z2VuT3BlcmF0aW9uLmdldFRocm93cygpJT4KLQl7Ci0gIDwlaWYgKGdlbk9wZXJhdGlvbi5oYXNCb2R5KCkpIHslPgotCQk8JT1nZW5PcGVyYXRpb24uZ2V0Qm9keShnZW5Nb2RlbC5nZXRJbmRlbnRhdGlvbihzdHJpbmdCdWZmZXIpKSU+Ci0gIDwlfSBlbHNlIGlmIChnZW5PcGVyYXRpb24uaXNJbnZhcmlhbnQoKSkge0dlbkNsYXNzIG9wQ2xhc3MgPSBnZW5PcGVyYXRpb24uZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIGRpYWdub3N0aWNzID0gKChHZW5QYXJhbWV0ZXIpZ2VuT3BlcmF0aW9uLmdldEdlblBhcmFtZXRlcnMoKS5nZXQoMCkpLmdldE5hbWUoKTsgU3RyaW5nIGNvbnRleHQgPSAoKEdlblBhcmFtZXRlcilnZW5PcGVyYXRpb24uZ2V0R2VuUGFyYW1ldGVycygpLmdldCgxKSkuZ2V0TmFtZSgpOyU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCQkvLyAtPiBzcGVjaWZ5IHRoZSBjb25kaXRpb24gdGhhdCB2aW9sYXRlcyB0aGUgaW52YXJpYW50Ci0JCS8vIC0+IHZlcmlmeSB0aGUgZGV0YWlscyBvZiB0aGUgZGlhZ25vc3RpYywgaW5jbHVkaW5nIHNldmVyaXR5IGFuZCBtZXNzYWdlCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCWlmIChmYWxzZSkKLQkJewotCQkJaWYgKDwlPWRpYWdub3N0aWNzJT4gIT0gbnVsbCkKLQkJCXsKLQkJCQk8JT1kaWFnbm9zdGljcyU+LmFkZAotCQkJCQkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRGlhZ25vc3RpYyIpJT4KLQkJCQkJCSg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljIiklPi5FUlJPUiwKLQkJCQkJCSA8JT1vcENsYXNzLmdldEdlblBhY2thZ2UoKS5nZXRJbXBvcnRlZFZhbGlkYXRvckNsYXNzTmFtZSgpJT4uRElBR05PU1RJQ19TT1VSQ0UsCi0JCQkJCQkgPCU9b3BDbGFzcy5nZXRHZW5QYWNrYWdlKCkuZ2V0SW1wb3J0ZWRWYWxpZGF0b3JDbGFzc05hbWUoKSU+LjwlPW9wQ2xhc3MuZ2V0T3BlcmF0aW9uSUQoZ2VuT3BlcmF0aW9uKSU+LAotCQkJCQkJIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbiIpJT4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfR2VuZXJpY0ludmFyaWFudF9kaWFnbm9zdGljIiwgbmV3IE9iamVjdFtdIHsgIjwlPWdlbk9wZXJhdGlvbi5nZXROYW1lKCklPiIsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFZhbGlkYXRvciIpJT4uZ2V0T2JqZWN0TGFiZWwodGhpcywgPCU9Y29udGV4dCU+KSB9KSw8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKDIpJT4KLQkJCQkJCSBuZXcgT2JqZWN0IFtdIHsgdGhpcyB9KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0gIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaW1wbGVtZW50ZWRHZW5PcGVyYXRpb24uVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL2ltcGxlbWVudGVkR2VuT3BlcmF0aW9uLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0JfQotCi08JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2VuT3BlcmF0aW9uLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL2ltcGxlbWVudGVkR2VuT3BlcmF0aW9uLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9Ly9mb3IlPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RUludmVyc2VBZGRHZW5GZWF0dXJlcygpKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IGVJbnZlcnNlQWRkKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4gb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotPCVmb3IgKEl0ZXJhdG9yIGk9Z2VuQ2xhc3MuZ2V0RUludmVyc2VBZGRHZW5GZWF0dXJlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlpLm5leHQoKTslPgotICA8JWlmICghZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSB8fCBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuY29udGFpbnMoZ2VuRmVhdHVyZSkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpICYmIGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVTdXBwcmVzc0VNRlR5cGVzKCkpIHslPgotCQkJCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpJT4pKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwIiklPi5JbnRlcm5hbE1hcFZpZXcpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZU1hcCgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSkgeyU+Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0Jhc2ljU2V0KCkpIHslPgotCQkJCXJldHVybiBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KW90aGVyRW5kLCBtc2dzKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCBtc2dzKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pOwotICAgICAgPCV9JT4KLQkJCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCkKLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVDb250YWlucygpKSB7JT4KLQkJCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCBudWxsLCBtc2dzKTsKLSAgICAgIDwlfSBlbHNlIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7JT4KLQkJCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLSAgICAgIDwlfSU+Ci0JCQkJcmV0dXJuIGJhc2ljU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pb3RoZXJFbmQsIG1zZ3MpOwotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JX0lPgotCQl9Ci08JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci08JX0lPgotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVJbnZlcnNlUmVtb3ZlR2VuRmVhdHVyZXMoKSkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBlSW52ZXJzZVJlbW92ZSg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLTwlZm9yIChJdGVyYXRvciBpPWdlbkNsYXNzLmdldEVJbnZlcnNlUmVtb3ZlR2VuRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsgR2VuRmVhdHVyZSBnZW5GZWF0dXJlID0gKEdlbkZlYXR1cmUpaS5uZXh0KCk7JT4KLSAgPCVpZiAoIWdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkgfHwgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmNvbnRhaW5zKGdlbkZlYXR1cmUpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSAmJiBnZW5GZWF0dXJlLmlzRWZmZWN0aXZlU3VwcHJlc3NFTUZUeXBlcygpKSB7JT4KLQkJCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSU+KSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcCIpJT4uSW50ZXJuYWxNYXBWaWV3KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmVNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPikoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5mZWF0dXJlTWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpICYmICFnZW5GZWF0dXJlLmlzQmFzaWNTZXQoKSkgeyU+Ci0JCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPiwgbXNncyk7Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotCQkJCXJldHVybiBiYXNpY1Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KG1zZ3MpOwotICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihudWxsLCBtc2dzKTsKLSAgICA8JX0lPgotICA8JX0lPgotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLTwlfSBlbHNlIHslPgotCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyR2VuRmVhdHVyZXMoKSkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZSg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzKQotCXsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKQotCQl7Ci08JWZvciAoSXRlcmF0b3IgaT1nZW5DbGFzcy5nZXRFQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyR2VuRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsgR2VuRmVhdHVyZSBnZW5GZWF0dXJlID0gKEdlbkZlYXR1cmUpaS5uZXh0KCk7JT4KLSAgPCVHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTslPgotICA8JWlmICghZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSB8fCBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuY29udGFpbnMoZ2VuRmVhdHVyZSkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLSAgPCV9JT4KLTwlfSU+Ci0JCX0KLTwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci08JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgIWdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotPCVmb3IgKEl0ZXJhdG9yIGk9Z2VuQ2xhc3MuZ2V0QWxsR2VuRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsgR2VuRmVhdHVyZSBnZW5GZWF0dXJlID0gKEdlbkZlYXR1cmUpaS5uZXh0KCk7JT4KLSAgPCVpZiAoIWdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkgfHwgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmNvbnRhaW5zKGdlbkZlYXR1cmUpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzQm9vbGVhblR5cGUoKSkgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIG5ldyA8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkgJiYgIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSkgeyU+Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwIiklPi5JbnRlcm5hbE1hcFZpZXcpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZU1hcCgpOwotCQkJCWVsc2UgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotCQkJCWVsc2UgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkubWFwKCk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmZlYXR1cmVNYXAoKTsKLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5nZXRXcmFwcGVyKCk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0gICAgPCV9JT4KLSAgPCV9JT4KLTwlfSU+Ci0JCX0KLTwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLTwlfSBlbHNlIHslPgotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci08JX0lPgotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVTZXRHZW5GZWF0dXJlcygpKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotPCVmb3IgKEl0ZXJhdG9yIGk9Z2VuQ2xhc3MuZ2V0RVNldEdlbkZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7IEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA9IChHZW5GZWF0dXJlKWkubmV4dCgpOyU+Ci0gIDwlaWYgKCFnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpIHx8IGdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5jb250YWlucyhnZW5GZWF0dXJlKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmZlYXR1cmVNYXAoKSkuc2V0KG5ld1ZhbHVlKTsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLnNldChuZXdWYWx1ZSk7Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVTdXBwcmVzc0VNRlR5cGVzKCkpIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlIiklPi5TZXR0aW5nKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcCIpJT4uSW50ZXJuYWxNYXBWaWV3KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmVNYXAoKSkuc2V0KG5ld1ZhbHVlKTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUiKSU+LlNldHRpbmcpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuc2V0KG5ld1ZhbHVlKTsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuY2xlYXIoKTsKLQkJCQk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLmFkZEFsbCgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpJT4pbmV3VmFsdWUpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCQkJc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCgoPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKCklPiluZXdWYWx1ZSkuPCU9Z2VuRmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpKTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiluZXdWYWx1ZSk7Ci0gICAgPCV9JT4KLQkJCQlyZXR1cm47Ci0gIDwlfSU+Ci08JX0lPgotCQl9Ci08JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLTwlfSBlbHNlIHslPgotCQllRHluYW1pY1NldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLTwlfSU+Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotPCVmb3IgKEl0ZXJhdG9yIGk9Z2VuQ2xhc3MuZ2V0RVNldEdlbkZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7IEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA9IChHZW5GZWF0dXJlKWkubmV4dCgpOyU+Ci0gIDwlaWYgKCFnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpIHx8IGdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5jb250YWlucyhnZW5GZWF0dXJlKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZmVhdHVyZU1hcCgpLmNsZWFyKCk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLmNsZWFyKCk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLQkJCQl1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzUmVmZXJlbmNlVHlwZSgpKSB7JT4KLQkJCQlzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiludWxsKTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUKTsKLSAgICA8JX0lPgotCQkJCXJldHVybjsKLSAgPCV9JT4KLTwlfSU+Ci0JCX0KLTwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLTwlfSBlbHNlIHslPgotCQllRHluYW1pY1Vuc2V0KGZlYXR1cmVJRCk7Ci08JX0lPgotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiAhZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9lSXNTZXQub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci08JWZvciAoSXRlcmF0b3IgaT1nZW5DbGFzcy5nZXRBbGxHZW5GZWF0dXJlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlpLm5leHQoKTslPgotICA8JWlmICghZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSB8fCBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuY29udGFpbnMoZ2VuRmVhdHVyZSkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0JCQkJcmV0dXJuICEoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5mZWF0dXJlTWFwKCkuaXNFbXB0eSgpOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiAhPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uZmVhdHVyZU1hcCgpLmlzRW1wdHkoKTsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiAhPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uaXNFbXB0eSgpOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRmllbGQoKSAmJiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKCklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4pOwotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsICYmICE8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPi5pc0VtcHR5KCk7Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuICE8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLmlzRW1wdHkoKTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0JCQkJcmV0dXJuIGlzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsOwotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJcmV0dXJuIGVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KSAhPSBudWxsOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gYmFzaWNHZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSAhPSBudWxsOwotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1JlZmVyZW5jZVR5cGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbDsKLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRmllbGQoKSAmJiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCXJldHVybiBlVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPikgIT0gbnVsbDsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgIT0gbnVsbDsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkgfHwgZ2VuRmVhdHVyZS5pc0VudW1UeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwKSAhPSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQ7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQ7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VudW1UeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQlyZXR1cm4gZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT4sIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FREVGQVVMVCkgIT0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSAhPSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQ7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHsvL2RhdGF0eXBlJT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQgPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgOiAhPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxULmVxdWFscyg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+LCA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQpOwotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQgPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgOiAhPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxULmVxdWFscyg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQgPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgIT0gbnVsbCA6ICE8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRURFRkFVTFQuZXF1YWxzKDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpOwotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0lPgotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLTwlfSBlbHNlIHslPgotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChmZWF0dXJlSUQpOwotPCV9JT4KLQl9Ci0KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZUlzU2V0Lm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbkNsYXNzLmdldE1peGluR2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MpCi0JewotICA8JWZvciAoSXRlcmF0b3IgbT1nZW5DbGFzcy5nZXRNaXhpbkdlbkNsYXNzZXMoKS5pdGVyYXRvcigpOyBtLmhhc05leHQoKTspIHsgR2VuQ2xhc3MgbWl4aW5HZW5DbGFzcyA9IChHZW5DbGFzcyltLm5leHQoKTsgJT4KLQkJaWYgKGJhc2VDbGFzcyA9PSA8JT1taXhpbkdlbkNsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLSAgICA8JWZvciAoSXRlcmF0b3IgZj1taXhpbkdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgZi5oYXNOZXh0KCk7KSB7IEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA9IChHZW5GZWF0dXJlKWYubmV4dCgpOyAlPgotCQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46IHJldHVybiA8JT1taXhpbkdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OwotICAgIDwlfSU+Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0gIDwlfSU+Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzKQotCXsKLSAgPCVmb3IgKEl0ZXJhdG9yIG09Z2VuQ2xhc3MuZ2V0TWl4aW5HZW5DbGFzc2VzKCkuaXRlcmF0b3IoKTsgbS5oYXNOZXh0KCk7KSB7IEdlbkNsYXNzIG1peGluR2VuQ2xhc3MgPSAoR2VuQ2xhc3MpbS5uZXh0KCk7ICU+Ci0JCWlmIChiYXNlQ2xhc3MgPT0gPCU9bWl4aW5HZW5DbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0gICAgPCVmb3IgKEl0ZXJhdG9yIGY9bWl4aW5HZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpLml0ZXJhdG9yKCk7IGYuaGFzTmV4dCgpOykgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlmLm5leHQoKTsgJT4KLQkJCQljYXNlIDwlPW1peGluR2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46IHJldHVybiA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjsKLSAgICA8JX0lPgotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotICA8JX0lPgotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHsgU3RyaW5nIGVWaXJ0dWFsVmFsdWVzRmllbGQgPSBnZW5DbGFzcy5nZXRFVmlydHVhbFZhbHVlc0ZpZWxkKCk7JT4KLSAgPCVpZiAoZVZpcnR1YWxWYWx1ZXNGaWVsZCAhPSBudWxsKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZVZpcnR1YWxWYWx1ZXMoKQotCXsKLQkJcmV0dXJuIDwlPWVWaXJ0dWFsVmFsdWVzRmllbGQlPjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlU2V0VmlydHVhbFZhbHVlcyhPYmplY3RbXSBuZXdWYWx1ZXMpCi0JewotCQk8JT1lVmlydHVhbFZhbHVlc0ZpZWxkJT4gPSBuZXdWYWx1ZXM7Ci0JfQotCi0gIDwlfSU+Ci0gIDwleyBMaXN0IGVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMgPSBnZW5DbGFzcy5nZXRFVmlydHVhbEluZGV4Qml0RmllbGRzKG5ldyBBcnJheUxpc3QoKSk7JT4KLSAgICA8JWlmICghZVZpcnR1YWxJbmRleEJpdEZpZWxkcy5pc0VtcHR5KCkpIHsgTGlzdCBhbGxFVmlydHVhbEluZGV4Qml0RmllbGRzID0gZ2VuQ2xhc3MuZ2V0QWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcyhuZXcgQXJyYXlMaXN0KCkpOyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGludCBlVmlydHVhbEluZGV4Qml0cyhpbnQgb2Zmc2V0KQotCXsKLQkJc3dpdGNoIChvZmZzZXQpCi0JCXsKLSAgICAgIDwlZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFVmlydHVhbEluZGV4Qml0RmllbGRzLnNpemUoKTsgaSsrKSB7JT4KLQkJCWNhc2UgPCU9aSU+IDoKLQkJCQlyZXR1cm4gPCU9YWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcy5nZXQoaSklPjsKLSAgICAgIDwlfSU+Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZVNldFZpcnR1YWxJbmRleEJpdHMoaW50IG9mZnNldCwgaW50IG5ld0luZGV4Qml0cykKLQl7Ci0JCXN3aXRjaCAob2Zmc2V0KQotCQl7Ci0gICAgICA8JWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcy5zaXplKCk7IGkrKykgeyU+Ci0JCQljYXNlIDwlPWklPiA6Ci0JCQkJPCU9YWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcy5nZXQoaSklPiA9IG5ld0luZGV4Qml0czsKLQkJCQlicmVhazsKLSAgICAgIDwlfSU+Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0gICAgPCV9JT4KLSAgPCV9JT4KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgIWdlbkNsYXNzLmdldFRvU3RyaW5nR2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICA8JXsgYm9vbGVhbiBmaXJzdCA9IHRydWU7JT4KLSAgICA8JWZvciAoSXRlcmF0b3IgaT1nZW5DbGFzcy5nZXRUb1N0cmluZ0dlbkZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeyBHZW5GZWF0dXJlIGdlbkZlYXR1cmUgPSAoR2VuRmVhdHVyZSlpLm5leHQoKTslPgotICAgICAgPCVpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZTslPgotCQlyZXN1bHQuYXBwZW5kKCIgKDwlPWdlbkZlYXR1cmUuZ2V0TmFtZSgpJT46ICIpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXN1bHQuYXBwZW5kKCIsIDwlPWdlbkZlYXR1cmUuZ2V0TmFtZSgpJT46ICIpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpICYmICFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCWlmIChlVmlydHVhbElzU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+KSkgcmVzdWx0LmFwcGVuZChlVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPikpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCWlmICg8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4oPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDwlfSBlbHNlIHslPjwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ8JX0lPikgcmVzdWx0LmFwcGVuZCgoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotICAgICAgICAgIDwlfSBlbHNlIHslPgotCQlpZiAoPCVpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+KDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA8JX0gZWxzZSB7JT48JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0PCV9JT4pIHJlc3VsdC5hcHBlbmQoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlyZXN1bHQuYXBwZW5kKGVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCVpZiAoIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzUmVmZXJlbmNlVHlwZSgpKXslPiwgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VERUZBVUxUPCV9JT4pKTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJcmVzdWx0LmFwcGVuZCgoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwKTsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmVzdWx0LmFwcGVuZCg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5pc01hcEVudHJ5KCkpIHsgR2VuRmVhdHVyZSBrZXlGZWF0dXJlID0gZ2VuQ2xhc3MuZ2V0TWFwRW50cnlLZXlGZWF0dXJlKCk7IEdlbkZlYXR1cmUgdmFsdWVGZWF0dXJlID0gZ2VuQ2xhc3MuZ2V0TWFwRW50cnlWYWx1ZUZlYXR1cmUoKTslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgaGFzaCA9IC0xOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRIYXNoKCkKLQl7Ci0JCWlmIChoYXNoID09IC0xKQotCQl7Ci0JCQlPYmplY3QgdGhlS2V5ID0gZ2V0S2V5KCk7Ci0JCQloYXNoID0gKHRoZUtleSA9PSBudWxsID8gMCA6IHRoZUtleS5oYXNoQ29kZSgpKTsKLQkJfQotCQlyZXR1cm4gaGFzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIYXNoKGludCBoYXNoKQotCXsKLQkJdGhpcy5oYXNoID0gaGFzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEtleSgpCi0JewotICA8JWlmIChrZXlGZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJcmV0dXJuIG5ldyA8JT1rZXlGZWF0dXJlLmdldE9iamVjdFR5cGUoKSU+KGdldFR5cGVkS2V5KCkpOwotICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGdldFR5cGVkS2V5KCk7Ci0gIDwlfSU+Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2V5KE9iamVjdCBrZXkpCi0JewotICA8JWlmIChrZXlGZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0JCWdldFR5cGVkS2V5KCkuYWRkQWxsKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoImphdmEudXRpbC5Db2xsZWN0aW9uIiklPilrZXkpOwotICA8JX0gZWxzZSBpZiAoa2V5RmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXNldFR5cGVkS2V5KCgoPCU9a2V5RmVhdHVyZS5nZXRPYmplY3RUeXBlKCklPilrZXkpLjwlPWtleUZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKSk7Ci0gIDwlfSBlbHNlIHslPgotCQlzZXRUeXBlZEtleSgoPCU9a2V5RmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoKSU+KWtleSk7Ci0gIDwlfSU+Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpCi0JewotICA8JWlmICh2YWx1ZUZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlyZXR1cm4gbmV3IDwlPXZhbHVlRmVhdHVyZS5nZXRPYmplY3RUeXBlKCklPihnZXRUeXBlZFZhbHVlKCkpOwotICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGdldFR5cGVkVmFsdWUoKTsKLSAgPCV9JT4KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHNldFZhbHVlKE9iamVjdCB2YWx1ZSkKLQl7Ci0JCU9iamVjdCBvbGRWYWx1ZSA9IGdldFZhbHVlKCk7Ci0gIDwlaWYgKHZhbHVlRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotCQlnZXRUeXBlZFZhbHVlKCkuY2xlYXIoKTsKLQkJZ2V0VHlwZWRWYWx1ZSgpLmFkZEFsbCgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpJT4pdmFsdWUpOwotICA8JX0gZWxzZSBpZiAodmFsdWVGZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJc2V0VHlwZWRWYWx1ZSgoKDwlPXZhbHVlRmVhdHVyZS5nZXRPYmplY3RUeXBlKCklPil2YWx1ZSkuPCU9dmFsdWVGZWF0dXJlLmdldFByaW1pdGl2ZVZhbHVlRnVuY3Rpb24oKSU+KCkpOwotICA8JX0gZWxzZSB7JT4KLQkJc2V0VHlwZWRWYWx1ZSgoPCU9dmFsdWVGZWF0dXJlLmdldEltcG9ydGVkVHlwZSgpJT4pdmFsdWUpOwotICA8JX0lPgotCQlyZXR1cm4gb2xkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+IGdldEVNYXAoKQotCXsKLQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIpJT4gY29udGFpbmVyID0gZUNvbnRhaW5lcigpOwotCQlyZXR1cm4gY29udGFpbmVyID09IG51bGwgPyBudWxsIDogKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+KWNvbnRhaW5lci5lR2V0KGVDb250YWlubWVudEZlYXR1cmUoKSk7Ci0JfQotCi08JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLX0gLy88JT1pc0ludGVyZmFjZSA/ICIgIiArIGdlbkNsYXNzLmdldEludGVyZmFjZU5hbWUoKSA6IGdlbkNsYXNzLmdldENsYXNzTmFtZSgpJT4KLTwlLy8gVE9ETyBmaXggdGhlIHNwYWNlIGFib3ZlJT4KLTwlZ2VuTW9kZWwuZW1pdFNvcnRlZEltcG9ydHMoKTslPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Ly5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MjU5ZWZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY5YjYzN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0O3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLUNsYXNzUGF0aDogdW1hZWRpdC5qYXIKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYudW1hO3Zpc2liaWxpdHk6PXJlZXhwb3J0Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLAotIG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5kb21haW4sCi0gb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luJEltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODI4MmUwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zb3VyY2UudW1hZWRpdC5qYXIgPSBzcmMvCi1vdXRwdXQudW1hZWRpdC5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSB1bWFlZGl0LmphcixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQXJ0aWZhY3RfY29udGFpbmVkQXJ0aWZhY3RzX0FydGlmYWN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBcnRpZmFjdF9jb250YWluZWRBcnRpZmFjdHNfQXJ0aWZhY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDFkMjE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBcnRpZmFjdF9jb250YWluZWRBcnRpZmFjdHNfQXJ0aWZhY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUJyZWFrZG93bkVsZW1lbnRfcGxhbm5pbmdEYXRhX1BsYW5uaW5nRGF0YS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQnJlYWtkb3duRWxlbWVudF9wbGFubmluZ0RhdGFfUGxhbm5pbmdEYXRhLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTAyOWUyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQnJlYWtkb3duRWxlbWVudF9wbGFubmluZ0RhdGFfUGxhbm5pbmdEYXRhLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RGVzY3JpcHRpb25fc2VjdGlvbnNfU2VjdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudERlc2NyaXB0aW9uX3NlY3Rpb25zX1NlY3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MjA2YzJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RGVzY3JpcHRpb25fc2VjdGlvbnNfU2VjdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudERlc2NyaXB0aW9uX3NlY3Rpb25zX1N0ZXAuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19TdGVwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjc4Y2Q4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudERlc2NyaXB0aW9uX3NlY3Rpb25zX1N0ZXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDFkMjE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0NvbnRlbnREZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0NvbnRlbnREZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEwNmIwZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9Db250ZW50RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhMTA1NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiNDAzNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9HdWlkYW5jZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjZmNDRmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9QcmFjdGljZURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3MjA5Y2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9QcmFjdGljZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fUm9sZURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fUm9sZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzZlODg5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX1JvbGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX1Rhc2tEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX1Rhc2tEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjM2IyYjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9UYXNrRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1NDBmM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19EaXNjaXBsaW5lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19EaXNjaXBsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzViZDQ3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRGlzY2lwbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRGlzY2lwbGluZUNhdGVnb3J5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19EaXNjaXBsaW5lQ2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NTUzYzFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19EaXNjaXBsaW5lQ2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0Rpc2NpcGxpbmVHcm91cGluZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRGlzY2lwbGluZUdyb3VwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTU1M2MxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRGlzY2lwbGluZUdyb3VwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Eb21haW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0RvbWFpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmMjg5MjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0RvbWFpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfUm9sZVNldC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfUm9sZVNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwOTlmZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1JvbGVTZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1JvbGVTZXRDYXRlZ29yeS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfUm9sZVNldENhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTRhM2Y2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfUm9sZVNldENhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Sb2xlU2V0R3JvdXBpbmcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1JvbGVTZXRHcm91cGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU0YTNmNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1JvbGVTZXRHcm91cGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfVG9vbC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfVG9vbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmMWI4NWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1Rvb2wuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1VzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1VzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMzllOWYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Vc2VyRGVmaW5lZENhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Xb3JrUHJvZHVjdFR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1dvcmtQcm9kdWN0VHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3ZWNhYzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1dvcmtQcm9kdWN0VHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0FjdGl2aXR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19BcnRpZmFjdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0FydGlmYWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTAxZDIxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0FydGlmYWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQXR0YWNobWVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0F0dGFjaG1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNzU2ODVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQXR0YWNobWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNWZmYmIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19DaGVja2xpc3QuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19DaGVja2xpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYTY1ZjIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ2hlY2tsaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ29uY2VwdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0NvbmNlcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZGY4NGRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ29uY2VwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0N1c3RvbUNhdGVnb3J5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZjQ3OTgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EZWxpdmVyYWJsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0RlbGl2ZXJhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2ExMDU2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0RlbGl2ZXJhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGVsaXZlcnlQcm9jZXNzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGVsaXZlcnlQcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2I0MDM2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0Rpc2NpcGxpbmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EaXNjaXBsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzViZDQ3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0Rpc2NpcGxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EaXNjaXBsaW5lR3JvdXBpbmcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EaXNjaXBsaW5lR3JvdXBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NTUzYzFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGlzY2lwbGluZUdyb3VwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRG9tYWluLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRG9tYWluLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2YyODkyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0RvbWFpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMjU1NGMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0aW5nQ29uc2lkZXJhdGlvbnMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0aW5nQ29uc2lkZXJhdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YWIzNGM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGluZ0NvbnNpZGVyYXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGluZ01ldHJpYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRpbmdNZXRyaWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MzFmODNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGluZ01ldHJpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRpbmdNb2RlbC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRpbmdNb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1OGRhZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0aW5nTW9kZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZmM4NGU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXhhbXBsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0V4YW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYjk0NGZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXhhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0d1aWRlbGluZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0d1aWRlbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2ZjQ0ZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19HdWlkZWxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19JdGVyYXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19JdGVyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MzExZTQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfSXRlcmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfT3V0Y29tZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX091dGNvbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNzAzNTE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfT3V0Y29tZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1BoYXNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUGhhc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZDYwYmQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUGhhc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19QcmFjdGljZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1ByYWN0aWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1ByYWN0aWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjA5NWQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNzYzMjUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19SZXBvcnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19SZXBvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NWYzZTBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUmVwb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUmV1c2FibGVBc3NldC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JldXNhYmxlQXNzZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNTJjZmZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUmV1c2FibGVBc3NldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvYWRtYXAuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2FkbWFwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjExYmM1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvYWRtYXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2xlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc2ZTg4OTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9sZVNldC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvbGVTZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDk5ZmVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9sZVNldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvbGVTZXRHcm91cGluZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvbGVTZXRHcm91cGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU0YTNmNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2xlU2V0R3JvdXBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19TdGVwLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfU3RlcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRlNDc2MjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19TdGVwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfU3VwcG9ydGluZ01hdGVyaWFsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfU3VwcG9ydGluZ01hdGVyaWFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDVhMjFlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1N1cHBvcnRpbmdNYXRlcmlhbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rhc2suZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UYXNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWMzYjJiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rhc2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UZWNobmlxdWUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UZWNobmlxdWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZWRjNWI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGVjaG5pcXVlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGVtcGxhdGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3NjMyNTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rlcm1EZWZpbml0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGVybURlZmluaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjFiZmUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGVybURlZmluaXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Ub29sLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVG9vbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmMWI4NWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Ub29sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVG9vbE1lbnRvci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rvb2xNZW50b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZjFiODVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVG9vbE1lbnRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1RyYWluaW5nQ2xhc3MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UcmFpbmluZ0NsYXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDEzMjk1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1RyYWluaW5nQ2xhc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UcmFpbmluZ01vZHVsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1RyYWluaW5nTW9kdWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjRmNzE1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1RyYWluaW5nTW9kdWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVXNlckRlZmluZWRDYXRlZ29yeS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1VzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZjQ3OTgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVXNlckRlZmluZWRDYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1doaXRlcGFwZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19XaGl0ZXBhcGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTViNDgwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1doaXRlcGFwZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Xb3JrUHJvZHVjdEd1aWRlbGluZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1dvcmtQcm9kdWN0R3VpZGVsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjZmNDRmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1dvcmtQcm9kdWN0R3VpZGVsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfV29ya1Byb2R1Y3RUeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfV29ya1Byb2R1Y3RUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTdlY2FjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1dvcmtQcm9kdWN0VHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19DdXN0b21DYXRlZ29yeS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19DdXN0b21DYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmNDc5ODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUN1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGQxOGVjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQ29udGVudERlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0NvbnRlbnREZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEwNmIwZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQ29udGVudERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhMTA1NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiNDAzNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fRGVzY3JpcHRvckRlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg5ZWQyYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fRGVzY3JpcHRvckRlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2ZjQ0ZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9QcmFjdGljZURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1ByYWN0aWNlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NzIwOWNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1ByYWN0aWNlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fUHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1Byb2Nlc3NEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fUHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1JvbGVEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Sb2xlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NmU4ODk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1JvbGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9UYXNrRGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fVGFza0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWMzYjJiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9UYXNrRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTU0MGYzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtRWxlbWVudF9wcm9wZXJ0eV9Qcm9wZXJ0eS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbUVsZW1lbnRfcHJvcGVydHlfUHJvcGVydHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMzJhN2I1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtRWxlbWVudF9wcm9wZXJ0eV9Qcm9wZXJ0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbUxpbmtfdmlld3BvcnRfUG9pbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1MaW5rX3ZpZXdwb3J0X1BvaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmU3MzRjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbUxpbmtfdmlld3BvcnRfUG9pbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fbmFtZXNwYWNlX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtX25hbWVzcGFjZV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0NWU5ZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fbmFtZXNwYWNlX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtX25hbWVzcGFjZV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV9uYW1lc3BhY2VfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkODJmMjI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtX25hbWVzcGFjZV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV9uYW1lc3BhY2VfVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV9uYW1lc3BhY2VfVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4OWYzYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fbmFtZXNwYWNlX1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fdmlld3BvaW50X1BvaW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtX3ZpZXdwb2ludF9Qb2ludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFkZDU4ZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fdmlld3BvaW50X1BvaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaXNjaXBsaW5lX3N1YmRpc2NpcGxpbmVfRGlzY2lwbGluZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlzY2lwbGluZV9zdWJkaXNjaXBsaW5lX0Rpc2NpcGxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjliMzEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaXNjaXBsaW5lX3N1YmRpc2NpcGxpbmVfRGlzY2lwbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRG9tYWluX3N1YmRvbWFpbl9Eb21haW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURvbWFpbl9zdWJkb21haW5fRG9tYWluLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2YyODkyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRG9tYWluX3N1YmRvbWFpbl9Eb21haW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURvbWFpbl9zdWJkb21haW5zX0RvbWFpbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRG9tYWluX3N1YmRvbWFpbnNfRG9tYWluLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2YyODkyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRG9tYWluX3N1YmRvbWFpbnNfRG9tYWluLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFbGxpcHNlX2NlbnRlcl9Qb2ludC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRWxsaXBzZV9jZW50ZXJfUG9pbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYTRlOWFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFbGxpcHNlX2NlbnRlcl9Qb2ludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfZXN0aW1hdGlvbkNvbmRlcmF0aW9uc19Fc3RpbWF0aW5nQ29uc2lkZXJhdGlvbnMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX2VzdGltYXRpb25Db25kZXJhdGlvbnNfRXN0aW1hdGluZ0NvbnNpZGVyYXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTk1MTY4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfZXN0aW1hdGlvbkNvbmRlcmF0aW9uc19Fc3RpbWF0aW5nQ29uc2lkZXJhdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX2VzdGltYXRpb25Db25kZXJhdGlvbnNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV9lc3RpbWF0aW9uQ29uZGVyYXRpb25zX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmYzg0ZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX2VzdGltYXRpb25Db25kZXJhdGlvbnNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV9lc3RpbWF0aW9uTWV0cmljX0VzdGltYXRpbmdNZXRyaWMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX2VzdGltYXRpb25NZXRyaWNfRXN0aW1hdGluZ01ldHJpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhZDMwYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX2VzdGltYXRpb25NZXRyaWNfRXN0aW1hdGluZ01ldHJpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfdXNlZEVzdGltYXRpbmdQYXJhbWV0ZXJfU3VtbWl0RXN0aW1hdGluZ1BhcmFtZXRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfdXNlZEVzdGltYXRpbmdQYXJhbWV0ZXJfU3VtbWl0RXN0aW1hdGluZ1BhcmFtZXRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM5MWQwYjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX3VzZWRFc3RpbWF0aW5nUGFyYW1ldGVyX1N1bW1pdEVzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlZE1ldGhvZEVsZW1lbnRfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlZE1ldGhvZEVsZW1lbnRfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ODQ0YmY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZWRNZXRob2RFbGVtZW50X2VzdGltYXRlX0VzdGltYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0aW5nTW9kZWxfb3duZWRFc3RpbWF0aW5nUGFyYW1ldGVyX1N1bW1pdEVzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRpbmdNb2RlbF9vd25lZEVzdGltYXRpbmdQYXJhbWV0ZXJfU3VtbWl0RXN0aW1hdGluZ1BhcmFtZXRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlM2I5OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRpbmdNb2RlbF9vd25lZEVzdGltYXRpbmdQYXJhbWV0ZXJfU3VtbWl0RXN0aW1hdGluZ1BhcmFtZXRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGluZ1BhcmFtZXRlck93bmVyX293bmVkRXN0aW1hdGluZ1BhcmFtZXRlcl9Fc3RpbWF0aW5nUGFyYW1ldGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0aW5nUGFyYW1ldGVyT3duZXJfb3duZWRFc3RpbWF0aW5nUGFyYW1ldGVyX0VzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MDcyMjBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0aW5nUGFyYW1ldGVyT3duZXJfb3duZWRFc3RpbWF0aW5nUGFyYW1ldGVyX0VzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoQ29ubmVjdG9yX3Bvc2l0aW9uX1BvaW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaENvbm5lY3Rvcl9wb3NpdGlvbl9Qb2ludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFjNzM2MmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoQ29ubmVjdG9yX3Bvc2l0aW9uX1BvaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVkZ2Vfd2F5cG9pbnRzX1BvaW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVkZ2Vfd2F5cG9pbnRzX1BvaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDE1NGU1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFZGdlX3dheXBvaW50c19Qb2ludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2FuY2hvcmFnZV9HcmFwaENvbm5lY3Rvci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2FuY2hvcmFnZV9HcmFwaENvbm5lY3Rvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzMDM3NjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9hbmNob3JhZ2VfR3JhcGhDb25uZWN0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZmU0MGM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0RpYWdyYW0uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfRGlhZ3JhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI5Y2Q4NzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfRGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9EaWFncmFtTGluay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9EaWFncmFtTGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmN2VlNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfRGlhZ3JhbUxpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfRWxsaXBzZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9FbGxpcHNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU2ZTYyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9FbGxpcHNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0dyYXBoQ29ubmVjdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0dyYXBoQ29ubmVjdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTMwMzc2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9HcmFwaENvbm5lY3Rvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9HcmFwaEVkZ2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfR3JhcGhFZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzg5MTg4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9HcmFwaEVkZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfR3JhcGhOb2RlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0dyYXBoTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQwNjUyMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfR3JhcGhOb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0ltYWdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0ltYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODRmOTllNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9JbWFnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9Qb2x5bGluZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9Qb2x5bGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4ZjE1YzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfUG9seWxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfUHJvcGVydHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfUHJvcGVydHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMzJhN2I1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1Byb3BlcnR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1JlZmVyZW5jZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9SZWZlcmVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMzAzNzYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1JlZmVyZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY0MjA2MDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfVGV4dEVsZW1lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfVGV4dEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMDY1MjAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1RleHRFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBjZjI3YjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2xpbmtfRGlhZ3JhbUxpbmsuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9saW5rX0RpYWdyYW1MaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGY3ZWU1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2xpbmtfRGlhZ3JhbUxpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9wb3NpdGlvbl9Qb2ludC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X3Bvc2l0aW9uX1BvaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTJkNDA3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X3Bvc2l0aW9uX1BvaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfc2VtYW50aWNNb2RlbF9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZmU0MGM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfc2VtYW50aWNNb2RlbF9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjQyMDYwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwY2YyN2IyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfc2VtYW50aWNNb2RlbF9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaE5vZGVfc2l6ZV9EaW1lbnNpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoTm9kZV9zaXplX0RpbWVuc2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNjZDkyODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoTm9kZV9zaXplX0RpbWVuc2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kRWxlbWVudF9tZXRob2RFbGVtZW50UHJvcGVydHlfTWV0aG9kRWxlbWVudFByb3BlcnR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RFbGVtZW50X21ldGhvZEVsZW1lbnRQcm9wZXJ0eV9NZXRob2RFbGVtZW50UHJvcGVydHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YjJjM2ViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RFbGVtZW50X21ldGhvZEVsZW1lbnRQcm9wZXJ0eV9NZXRob2RFbGVtZW50UHJvcGVydHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZEVsZW1lbnRfb3duZWRSdWxlc19Db25zdHJhaW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RFbGVtZW50X293bmVkUnVsZXNfQ29uc3RyYWludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJjZDMyZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZEVsZW1lbnRfb3duZWRSdWxlc19Db25zdHJhaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X21ldGhvZE1vZGVsc19NZXRob2RNb2RlbC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9tZXRob2RNb2RlbHNfTWV0aG9kTW9kZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYjgyYzM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X21ldGhvZE1vZGVsc19NZXRob2RNb2RlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9tZXRob2RQbHVnaW5zX01ldGhvZFBsdWdpbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9tZXRob2RQbHVnaW5zX01ldGhvZFBsdWdpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJiODJjMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZExpYnJhcnlfbWV0aG9kUGx1Z2luc19NZXRob2RQbHVnaW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZExpYnJhcnlfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zX01ldGhvZENvbmZpZ3VyYXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZExpYnJhcnlfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zX01ldGhvZENvbmZpZ3VyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZTg5NjAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19NZXRob2RDb25maWd1cmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19Qcm9jZXNzRmFtaWx5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19Qcm9jZXNzRmFtaWx5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjQ2N2Q0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnNfUHJvY2Vzc0ZhbWlseS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTW9kZWxfbWV0aG9kUGFja2FnZXNfQ29udGVudFBhY2thZ2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZE1vZGVsX21ldGhvZFBhY2thZ2VzX0NvbnRlbnRQYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDBhMzExZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTW9kZWxfbWV0aG9kUGFja2FnZXNfQ29udGVudFBhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZE1vZGVsX21ldGhvZFBhY2thZ2VzX1Byb2Nlc3NDb21wb25lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZE1vZGVsX21ldGhvZFBhY2thZ2VzX1Byb2Nlc3NDb21wb25lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RNb2RlbF9tZXRob2RQYWNrYWdlc19Qcm9jZXNzQ29tcG9uZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RNb2RlbF9tZXRob2RQYWNrYWdlc19Qcm9jZXNzUGFja2FnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTW9kZWxfbWV0aG9kUGFja2FnZXNfUHJvY2Vzc1BhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOGQ4YzJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RNb2RlbF9tZXRob2RQYWNrYWdlc19Qcm9jZXNzUGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX0NvbnRlbnRQYWNrYWdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfQ29udGVudFBhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfQ29udGVudFBhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19Qcm9jZXNzQ29tcG9uZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfUHJvY2Vzc0NvbXBvbmVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19Qcm9jZXNzQ29tcG9uZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfUHJvY2Vzc1BhY2thZ2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19Qcm9jZXNzUGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4ZDhjMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19Qcm9jZXNzUGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX0NvbnRlbnRQYWNrYWdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfQ29udGVudFBhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfQ29udGVudFBhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19Qcm9jZXNzQ29tcG9uZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfUHJvY2Vzc0NvbXBvbmVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19Qcm9jZXNzQ29tcG9uZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfUHJvY2Vzc1BhY2thZ2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19Qcm9jZXNzUGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4ZDhjMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19Qcm9jZXNzUGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9seWxpbmVfd2F5cG9pbnRzX1BvaW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb2x5bGluZV93YXlwb2ludHNfUG9pbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MzcwM2RiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb2x5bGluZV93YXlwb2ludHNfUG9pbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByYWN0aWNlX3N1YlByYWN0aWNlX1ByYWN0aWNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmFjdGljZV9zdWJQcmFjdGljZV9QcmFjdGljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3MjA5Y2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByYWN0aWNlX3N1YlByYWN0aWNlX1ByYWN0aWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmFjdGljZV9zdWJQcmFjdGljZXNfUHJhY3RpY2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByYWN0aWNlX3N1YlByYWN0aWNlc19QcmFjdGljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3MjA5Y2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByYWN0aWNlX3N1YlByYWN0aWNlc19QcmFjdGljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VJT19Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlSU9fV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjIxODIyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VJT19Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnNfVGFza0Rlc2NyaXB0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnNfVGFza0Rlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NTRlMjZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZVNwZWNpZmljYXRpb25zX1Rhc2tEZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19DYXBhYmlsaXR5UGF0dGVybi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1ZmZiYjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19DYXBhYmlsaXR5UGF0dGVybi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiNDAzNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19EZWxpdmVyeVByb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiMDk1ZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5YzFhMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0FjdGl2aXR5RGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0FjdGl2aXR5RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9BcnRpZmFjdERlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9BcnRpZmFjdERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fQ29udGVudERlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fQ29udGVudERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWZmMjM0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0NvbnRlbnREZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2ExMDU2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2I0MDM2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NmY0NGY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1ByYWN0aWNlRGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9QcmFjdGljZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1ByYWN0aWNlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9Sb2xlRGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9Sb2xlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NmU4ODk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fUm9sZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fVGFza0Rlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fVGFza0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWMzYjJiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1Rhc2tEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTU0MGYzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX09CU19PQlMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX09CU19PQlMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzM2U4YTYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9PQlNfT0JTLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9QQlNfUEJTLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9QQlNfUEJTLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWEzYWI0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfUEJTX1BCUy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfV0JTX1dCUy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfV0JTX1dCUy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBhMmNjNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX1dCU19XQlMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX1dvcmtPcmRlcl9Xb3JrT3JkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX1dvcmtPcmRlcl9Xb3JrT3JkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzY2ZhYzMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9Xb3JrT3JkZXJfV29ya09yZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19BY3Rpdml0eS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfQWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19BY3Rpdml0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTVmZmJiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfRGVsaXZlcnlQcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2I0MDM2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfRGVsaXZlcnlQcm9jZXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19JdGVyYXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0l0ZXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQzMTFlNDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0l0ZXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfTWlsZXN0b25lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19NaWxlc3RvbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOTYxNWViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19NaWxlc3RvbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX01pbGVzdG9uZXMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX01pbGVzdG9uZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOTYxNWViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19NaWxlc3RvbmVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19QaGFzZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUGhhc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZDYwYmQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19QaGFzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmIwOTVkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmY5Yjc4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Jlc291cmNlRGVmaW5pdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUmVzb3VyY2VEZWZpbml0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzdhODZkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUmVzb3VyY2VEZWZpbml0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Sb2xlRGVzY3JpcHRvci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUm9sZURlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNjhjN2I4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Sb2xlRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfVGFza0Rlc2NyaXB0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Rhc2tEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTU0ZTI2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfVGFza0Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1RlYW0uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1RlYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDk5ZmVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19UZWFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19UZWFtUHJvZmlsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfVGVhbVByb2ZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDk5ZmVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19UZWFtUHJvZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MjE4MjI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2RpYWdyYW1zX0RpYWdyYW0uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2RpYWdyYW1zX0RpYWdyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNmQ4NTU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9kaWFncmFtc19EaWFncmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfQWN0aXZpdHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19BY3Rpdml0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19BY3Rpdml0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNWZmYmIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Db21wb3NpdGVSb2xlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfQ29tcG9zaXRlUm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmMDI5MTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Db21wb3NpdGVSb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfRGVsaXZlcnlQcm9jZXNzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfRGVsaXZlcnlQcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2I0MDM2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0l0ZXJhdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0l0ZXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQzMTFlNDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19JdGVyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19NaWxlc3RvbmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19NaWxlc3RvbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOTYxNWViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfTWlsZXN0b25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUGhhc2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19QaGFzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFkNjBiZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19QaGFzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1BsYW5uaW5nRGF0YS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1BsYW5uaW5nRGF0YS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcyY2UyNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19QbGFubmluZ0RhdGEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmIwOTVkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTljMWEwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUm9sZURlc2NyaXB0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Sb2xlRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2OGM3YjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Sb2xlRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Rhc2tEZXNjcmlwdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfVGFza0Rlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NTRlMjZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfVGFza0Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19UZWFtUHJvZmlsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1RlYW1Qcm9maWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA5OWZlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1RlYW1Qcm9maWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfV29ya09yZGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfV29ya09yZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGI0MWYzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1dvcmtPcmRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyMTgyMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNWZmYmIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19EZWxpdmVyeVByb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjQwMzYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjA5NWQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfUHJvY2Vzc1BsYW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfUHJvY2Vzc1BsYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZmRhNTVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX1Byb2Nlc3NQbGFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmY5Yjc4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1RyYW5zaXRpb25fVHJhbnNpdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1RyYW5zaXRpb25fVHJhbnNpdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM0MzFjNTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9UcmFuc2l0aW9uX1RyYW5zaXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9WZXJ0ZXhfUHNldWRvU3RhdGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9WZXJ0ZXhfUHNldWRvU3RhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MzY4ZTZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZWdpb25fVmVydGV4X1BzZXVkb1N0YXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZWdpb25fVmVydGV4X1N0YXRlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZWdpb25fVmVydGV4X1N0YXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWNmNTA2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1ZlcnRleF9TdGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1ZlcnRleF9WZXJ0ZXguZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9WZXJ0ZXhfVmVydGV4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmNhMzc2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1ZlcnRleF9WZXJ0ZXguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlY3Rpb25fc3ViU2VjdGlvbnNfU2VjdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VjdGlvbl9zdWJTZWN0aW9uc19TZWN0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODgzY2U5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VjdGlvbl9zdWJTZWN0aW9uc19TZWN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZWN0aW9uX3N1YlNlY3Rpb25zX1N0ZXAuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlY3Rpb25fc3ViU2VjdGlvbnNfU3RlcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljN2VmYzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlY3Rpb25fc3ViU2VjdGlvbnNfU3RlcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU3RhdGVNYWNoaW5lX1JlZ2lvbl9SZWdpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVN0YXRlTWFjaGluZV9SZWdpb25fUmVnaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjZhYjdlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU3RhdGVNYWNoaW5lX1JlZ2lvbl9SZWdpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVN0YXRlX1JlZ2lvbl9SZWdpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVN0YXRlX1JlZ2lvbl9SZWdpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNjc2ZGI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTdGF0ZV9SZWdpb25fUmVnaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUYXNrX2VzdGltYXRlX0VzdGltYXRlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUYXNrX2VzdGltYXRlX0VzdGltYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjg0NGJmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVGFza19lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVGFza19zdGVwc19TdGVwLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUYXNrX3N0ZXBzX1N0ZXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZGE0OWQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUYXNrX3N0ZXBzX1N0ZXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVRlYW1Qcm9maWxlX3N1YlRlYW1fVGVhbVByb2ZpbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVRlYW1Qcm9maWxlX3N1YlRlYW1fVGVhbVByb2ZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDk5ZmVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUZWFtUHJvZmlsZV9zdWJUZWFtX1RlYW1Qcm9maWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUcmFpbmluZ0NsYXNzX3RyYWluaW5nTW9kdWxlc19UcmFpbmluZ01vZHVsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVHJhaW5pbmdDbGFzc190cmFpbmluZ01vZHVsZXNfVHJhaW5pbmdNb2R1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZWY1ZWZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUcmFpbmluZ0NsYXNzX3RyYWluaW5nTW9kdWxlc19UcmFpbmluZ01vZHVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya0RlZmluaXRpb25fcG9zdGNvbmRpdGlvbl9Db25zdHJhaW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrRGVmaW5pdGlvbl9wb3N0Y29uZGl0aW9uX0NvbnN0cmFpbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZDk0NGQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrRGVmaW5pdGlvbl9wb3N0Y29uZGl0aW9uX0NvbnN0cmFpbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdvcmtEZWZpbml0aW9uX3ByZWNvbmRpdGlvbl9Db25zdHJhaW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrRGVmaW5pdGlvbl9wcmVjb25kaXRpb25fQ29uc3RyYWludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkOTQ0ZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdvcmtEZWZpbml0aW9uX3ByZWNvbmRpdGlvbl9Db25zdHJhaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrUHJvZHVjdF9lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya1Byb2R1Y3RfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NzZlYjFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrUHJvZHVjdF9lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWdncmVnYXRlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWdncmVnYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDNkYzVhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FnZ3JlZ2F0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FydGlmYWN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXJ0aWZhY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDFkMjE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXJ0aWZhY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BcnRpZmFjdERlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BcnRpZmFjdERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXR0YWNobWVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0F0dGFjaG1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNGE4YWY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXR0YWNobWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0JyZWFrZG93bkVsZW1lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9CcmVha2Rvd25FbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmFkYWFiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0JyZWFrZG93bkVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNWVmODRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1ZmZiYjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NoZWNrbGlzdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NoZWNrbGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4ZjZkOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DaGVja2xpc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DbGFzc2lmaWVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2xhc3NpZmllci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExN2RjN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DbGFzc2lmaWVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29tcG9zaXRlUm9sZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbXBvc2l0ZVJvbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NmU4ODk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29tcG9zaXRlUm9sZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbmNlcHQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25jZXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWRmODRkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbmNlcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25zdHJhaW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uc3RyYWludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiNzQxNGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25zdHJhaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudENhdGVnb3J5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudENhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDU3MzFmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnRDYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnREZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnREZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJlMjI0NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50RWxlbWVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnRFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTkxNTU5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnRFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudFBhY2thZ2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50UGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50UGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvcmVFbGVtZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29yZUVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzM3MGM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29yZUVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTE3ZGM3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ3VzdG9tQ2F0ZWdvcnkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmNDc5ODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJhYmxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcmFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTEwNTYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcmFibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhMTA1NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2I0MDM2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjQwMzYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZXNjcmliYWJsZUVsZW1lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZXNjcmliYWJsZUVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNGFmOGFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVzY3JpYmFibGVFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVzY3JpcHRvci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMzZlM2IyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiNjkyNTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZXNjcmlwdG9yRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaWFncmFtLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM0YThhZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaWFncmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbUVsZW1lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaWFncmFtRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1NzMxZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaWFncmFtRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RpYWdyYW1MaW5rLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbUxpbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNjczYTUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbUxpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaW1lbnNpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaW1lbnNpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZGQzYjc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGltZW5zaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlzY2lwbGluZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rpc2NpcGxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNWJkNDc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlzY2lwbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rpc2NpcGxpbmVHcm91cGluZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rpc2NpcGxpbmVHcm91cGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1NTNjMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaXNjaXBsaW5lR3JvdXBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Eb21haW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Eb21haW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZjI4OTI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRG9tYWluLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRWxlbWVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmODA0MWQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VsbGlwc2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FbGxpcHNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTA2ODgxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VsbGlwc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTgyZDIxYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGVkTWV0aG9kRWxlbWVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRlZE1ldGhvZEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNGFmOGFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGVkTWV0aG9kRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdDb25zaWRlcmF0aW9ucy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdDb25zaWRlcmF0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmYzg0ZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nQ29uc2lkZXJhdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nTWV0cmljLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ01ldHJpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5NDA5NzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nTWV0cmljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ01vZGVsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ01vZGVsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2FmMjgwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdNb2RlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nUGFyYW1ldGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTRjOTUzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nUGFyYW1ldGVyT3duZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nUGFyYW1ldGVyT3duZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OTE1NTkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ1BhcmFtZXRlck93bmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGZjODRlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0V4YW1wbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FeGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWI5NDRmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaENvbm5lY3Rvci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoQ29ubmVjdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzM5ZWJiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoQ29ubmVjdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhFZGdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhFZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWE5YmM3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoRWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoRWxlbWVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMzOGZiOGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaE5vZGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaE5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMzQ1NTFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhOb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhpY1ByaW1pdGl2ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoaWNQcmltaXRpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMGQyMjI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhpY1ByaW1pdGl2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRhbmNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGFuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NmY0NGY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGFuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HdWlkYW5jZURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2ZjQ0ZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HdWlkYW5jZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGVsaW5lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGVsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjZmNDRmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRlbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0ltYWdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvSW1hZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZjU2YzE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvSW1hZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9JdGVyYXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9JdGVyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MzExZTQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTGVhZkVsZW1lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9MZWFmRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwNjg4MWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9MZWFmRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU4OTYwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RFbGVtZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM0ZmIzMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudFByb3BlcnR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudFByb3BlcnR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzQxNGZlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZEVsZW1lbnRQcm9wZXJ0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDBhMzExZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGx1Z2luLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGx1Z2luLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmI4MmMzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbl9ncmV5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGx1Z2luX2dyZXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZTYzYWRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGx1Z2luX2dyZXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RVbml0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kVW5pdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhOWJjNzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RVbml0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWlsZXN0b25lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWlsZXN0b25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDk2MTVlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZXMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NaWxlc3RvbmVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDk2MTVlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9OYW1lZEVsZW1lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9OYW1lZEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNGFmOGFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTmFtZWRFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTmFtZXNwYWNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTmFtZXNwYWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDk4MzY0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L05hbWVzcGFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L09CUy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L09CUy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmYjgyZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9PQlMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9PdXRjb21lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvT3V0Y29tZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU3MDM1MTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9PdXRjb21lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUEJTLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUEJTLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDk4MzY0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BCUy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BhY2thZ2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzAwYWVkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QYWNrYWdlYWJsZUVsZW1lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QYWNrYWdlYWJsZUVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDY4ODFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGFja2FnZWFibGVFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGhhc2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QaGFzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFkNjBiZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QaGFzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BsYW5uaW5nRGF0YS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BsYW5uaW5nRGF0YS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0Yzk1M2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QbGFubmluZ0RhdGEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qb2ludC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BvaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTM1MDBkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BvaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUG9seWxpbmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qb2x5bGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjMmFhYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qb2x5bGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1ByYWN0aWNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJhY3RpY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NzIwOWNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJhY3RpY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QcmFjdGljZURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3MjA5Y2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QcmFjdGljZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29tcG9uZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb250ZXh0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbnRleHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbnRleHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiMDk1ZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NFbGVtZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0VsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0VsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRmFtaWx5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlseS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiNjkyNTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRmFtaWx5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc1BhY2thZ2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzUGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4ZDhjMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzUGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NQbGFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc1BsYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMWY4YWZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc1BsYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTM2ZTNiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvcGVydHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9wZXJ0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEzNmUzYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9wZXJ0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BzZXVkb1N0YXRlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHNldWRvU3RhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNGZiMzBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHNldWRvU3RhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZWZlcmVuY2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZWZlcmVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MzllYmJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVmZXJlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVnaW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVnaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDM2NTk2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlZ2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlcG9ydC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlcG9ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyMmM4NWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXBvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXNvdXJjZURlZmluaXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXNvdXJjZURlZmluaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OGIzNTFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVzb3VyY2VEZWZpbml0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmV1c2FibGVBc3NldC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JldXNhYmxlQXNzZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNTJjZmZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmV1c2FibGVBc3NldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvYWRtYXAuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2FkbWFwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjExYmM1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvYWRtYXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc2ZTg4OTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzZlODg5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVEZXNjcmlwdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZURlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNjhjN2I4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZURlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlU2V0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZVNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwOTlmZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlU2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZVNldENhdGVnb3J5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZVNldENhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTRhM2Y2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVTZXRDYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVTZXRHcm91cGluZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVTZXRHcm91cGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU0YTNmNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlU2V0R3JvdXBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TZWN0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2VjdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczOWViYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TZWN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2VtYW50aWNNb2RlbEJyaWRnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1NlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMzg1NGU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYjE3NTVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGF0ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0YXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2IxNzU1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0YXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RhdGVNYWNoaW5lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RhdGVNYWNoaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmFkYWFiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0YXRlTWFjaGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0ZXAuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGVwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzVlZjg0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0ZXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdW1taXRFc3RpbWF0aW5nUGFyYW1ldGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3VtbWl0RXN0aW1hdGluZ1BhcmFtZXRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1NzMxZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdW1taXRFc3RpbWF0aW5nUGFyYW1ldGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3VwcG9ydGluZ01hdGVyaWFsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3VwcG9ydGluZ01hdGVyaWFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDVhMjFlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2suZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWMzYjJiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YzNiMmI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1NGUyNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlYW0uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA5OWZlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWFtUHJvZmlsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlYW1Qcm9maWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA5OWZlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlYW1Qcm9maWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVjaG5pcXVlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVjaG5pcXVlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzY4NjZkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlY2huaXF1ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlbXBsYXRlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNzYzMjUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZW1wbGF0ZURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVtcGxhdGVEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3NjMyNTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZW1wbGF0ZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVybURlZmluaXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZXJtRGVmaW5pdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyMWJmZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZXJtRGVmaW5pdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RleHRFbGVtZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGV4dEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMzQ1NTFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGV4dEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29sLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmMWI4NWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbE1lbnRvci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2xNZW50b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZjFiODVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbE1lbnRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RyYWluaW5nQ2xhc3MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UcmFpbmluZ0NsYXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTBkMTBmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RyYWluaW5nQ2xhc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UcmFpbmluZ01vZHVsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RyYWluaW5nTW9kdWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWY1NmMxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RyYWluaW5nTW9kdWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHJhbnNpdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RyYW5zaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YmFjNGZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHJhbnNpdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1R5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjFmOGFmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1R5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg5YWQ1ZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVXNlckRlZmluZWRDYXRlZ29yeS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1VzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZjQ3OTgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVXNlckRlZmluZWRDYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1ZhcmlhYmlsaXR5RWxlbWVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1ZhcmlhYmlsaXR5RWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiNzQxNGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9WYXJpYWJpbGl0eUVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9WZXJ0ZXguZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9WZXJ0ZXguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YTVjNzBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVmVydGV4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV0JTLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV0JTLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWY1NmMxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dCUy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1doaXRlcGFwZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9XaGl0ZXBhcGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTViNDgwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1doaXRlcGFwZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrQnJlYWtkb3duRWxlbWVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtCcmVha2Rvd25FbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2JhYzRmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtCcmVha2Rvd25FbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya0RlZmluaXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrRGVmaW5pdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxMjRmM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrRGVmaW5pdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtPcmRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtPcmRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhZGFhYjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrT3JkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTU0MGYzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNTQwZjNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyMTgyMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdEd1aWRlbGluZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0R3VpZGVsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTU3ZmE2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0R3VpZGVsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RTaGFwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0U2hhcGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNTQwZjNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RTaGFwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3ZWNhYzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjc5NmRlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQyMyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBFTUYgVU1BIEVkaXQgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLQotX1VJX0NyZWF0ZUNoaWxkX3RleHQgPSB7MH0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MiA9IHsxfSB7MH0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MyA9IHsxfQotX1VJX0NyZWF0ZUNoaWxkX3Rvb2x0aXAgPSBDcmVhdGUgTmV3IHswfSBVbmRlciB7MX0gRmVhdHVyZQotX1VJX0NyZWF0ZUNoaWxkX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IGNoaWxkIG9mIHR5cGUgezB9IGZvciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlIHNlbGVjdGVkIHsyfS4KLV9VSV9DcmVhdGVTaWJsaW5nX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IHNpYmxpbmcgb2YgdHlwZSB7MH0gZm9yIHRoZSBzZWxlY3RlZCB7Mn0sIHVuZGVyIHRoZSB7MX0gZmVhdHVyZSBvZiB0aGVpciBwYXJlbnQuCi0KLV9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24gPSBUaGUgezB9IG9mIHRoZSB7MX0KLQotX1VJX0NsYXNzaWZpZXJfdHlwZSA9IENsYXNzaWZpZXIKLV9VSV9UeXBlX3R5cGUgPSBUeXBlCi1fVUlfRWxlbWVudF90eXBlID0gRWxlbWVudAotX1VJX05hbWVkRWxlbWVudF90eXBlID0gTmFtZWQgRWxlbWVudAotX1VJX1BhY2thZ2VhYmxlRWxlbWVudF90eXBlID0gUGFja2FnZWFibGUgRWxlbWVudAotX1VJX1BhY2thZ2VfdHlwZSA9IFBhY2thZ2UKLV9VSV9OYW1lc3BhY2VfdHlwZSA9IE5hbWVzcGFjZQotX1VJX01ldGhvZEVsZW1lbnRfdHlwZSA9IE1ldGhvZCBFbGVtZW50Ci1fVUlfQ29uc3RyYWludF90eXBlID0gQ29uc3RyYWludAotX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUgPSBDb250ZW50IEVsZW1lbnQKLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSA9IERlc2NyaWJhYmxlIEVsZW1lbnQKLV9VSV9Db250ZW50RGVzY3JpcHRpb25fdHlwZSA9IENvbnRlbnQgRGVzY3JpcHRpb24KLV9VSV9TZWN0aW9uX3R5cGUgPSBTZWN0aW9uCi1fVUlfUm9sZV90eXBlID0gUm9sZQotX1VJX1dvcmtQcm9kdWN0X3R5cGUgPSBXb3JrIFByb2R1Y3QKLV9VSV9UYXNrX3R5cGUgPSBUYXNrCi1fVUlfV29ya0RlZmluaXRpb25fdHlwZSA9IFdvcmsgRGVmaW5pdGlvbgotX1VJX1N0ZXBfdHlwZSA9IFN0ZXAKLV9VSV9HdWlkYW5jZV90eXBlID0gR3VpZGFuY2UKLV9VSV9BcnRpZmFjdF90eXBlID0gQXJ0aWZhY3QKLV9VSV9EZWxpdmVyYWJsZV90eXBlID0gRGVsaXZlcmFibGUKLV9VSV9PdXRjb21lX3R5cGUgPSBPdXRjb21lCi1fVUlfTWV0aG9kUGFja2FnZV90eXBlID0gTWV0aG9kIFBhY2thZ2UKLV9VSV9Db250ZW50UGFja2FnZV90eXBlID0gQ29udGVudCBQYWNrYWdlCi1fVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl90eXBlID0gQXJ0aWZhY3QgRGVzY3JpcHRpb24KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3R5cGUgPSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3R5cGUgPSBEZWxpdmVyYWJsZSBEZXNjcmlwdGlvbgotX1VJX1JvbGVEZXNjcmlwdGlvbl90eXBlID0gUm9sZSBEZXNjcmlwdGlvbgotX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlID0gVGFzayBEZXNjcmlwdGlvbgotX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fdHlwZSA9IEd1aWRhbmNlIERlc2NyaXB0aW9uCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl90eXBlID0gUHJhY3RpY2UgRGVzY3JpcHRpb24KLV9VSV9Qb2ludF90eXBlID0gUG9pbnQKLV9VSV9HcmFwaEVsZW1lbnRfdHlwZSA9IEdyYXBoIEVsZW1lbnQKLV9VSV9EaWFncmFtRWxlbWVudF90eXBlID0gRGlhZ3JhbSBFbGVtZW50Ci1fVUlfRGlhZ3JhbUxpbmtfdHlwZSA9IERpYWdyYW0gTGluawotX1VJX0dyYXBoQ29ubmVjdG9yX3R5cGUgPSBHcmFwaCBDb25uZWN0b3IKLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2UKLV9VSV9EaW1lbnNpb25fdHlwZSA9IERpbWVuc2lvbgotX1VJX1JlZmVyZW5jZV90eXBlID0gUmVmZXJlbmNlCi1fVUlfUHJvcGVydHlfdHlwZSA9IFByb3BlcnR5Ci1fVUlfR3JhcGhFZGdlX3R5cGUgPSBHcmFwaCBFZGdlCi1fVUlfRGlhZ3JhbV90eXBlID0gRGlhZ3JhbQotX1VJX0dyYXBoTm9kZV90eXBlID0gR3JhcGggTm9kZQotX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGUgPSBTaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudAotX1VJX1VNQVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSA9IFVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2UKLV9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gQ29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2UKLV9VSV9MZWFmRWxlbWVudF90eXBlID0gTGVhZiBFbGVtZW50Ci1fVUlfVGV4dEVsZW1lbnRfdHlwZSA9IFRleHQgRWxlbWVudAotX1VJX0ltYWdlX3R5cGUgPSBJbWFnZQotX1VJX0dyYXBoaWNQcmltaXRpdmVfdHlwZSA9IEdyYXBoaWMgUHJpbWl0aXZlCi1fVUlfUG9seWxpbmVfdHlwZSA9IFBvbHlsaW5lCi1fVUlfRWxsaXBzZV90eXBlID0gRWxsaXBzZQotX1VJX0FjdGl2aXR5X3R5cGUgPSBBY3Rpdml0eQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X3R5cGUgPSBXb3JrIEJyZWFrZG93biBFbGVtZW50Ci1fVUlfQnJlYWtkb3duRWxlbWVudF90eXBlID0gQnJlYWtkb3duIEVsZW1lbnQKLV9VSV9NaWxlc3RvbmVfdHlwZSA9IE1pbGVzdG9uZQotX1VJX0l0ZXJhdGlvbl90eXBlID0gSXRlcmF0aW9uCi1fVUlfUGhhc2VfdHlwZSA9IFBoYXNlCi1fVUlfVGVhbVByb2ZpbGVfdHlwZSA9IFRlYW0gUHJvZmlsZQotX1VJX1JvbGVEZXNjcmlwdG9yX3R5cGUgPSBSb2xlIERlc2NyaXB0b3IKLV9VSV9Xb3JrT3JkZXJfdHlwZSA9IFdvcmsgT3JkZXIKLV9VSV9Qcm9jZXNzRWxlbWVudF90eXBlID0gUHJvY2VzcyBFbGVtZW50Ci1fVUlfUGxhbm5pbmdEYXRhX3R5cGUgPSBQbGFubmluZyBEYXRhCi1fVUlfRGVzY3JpcHRvcl90eXBlID0gRGVzY3JpcHRvcgotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlID0gV29yayBQcm9kdWN0IERlc2NyaXB0b3IKLV9VSV9UYXNrRGVzY3JpcHRvcl90eXBlID0gVGFzayBEZXNjcmlwdG9yCi1fVUlfQ29tcG9zaXRlUm9sZV90eXBlID0gQ29tcG9zaXRlIFJvbGUKLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdHlwZSA9IEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl90eXBlID0gQWN0aXZpdHkgRGVzY3JpcHRpb24KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gRGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbgotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gUHJvY2VzcyBEZXNjcmlwdGlvbgotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpcHRvciBEZXNjcmlwdGlvbgotX1VJX0NvbmNlcHRfdHlwZSA9IENvbmNlcHQKLV9VSV9DaGVja2xpc3RfdHlwZSA9IENoZWNrbGlzdAotX1VJX0V4YW1wbGVfdHlwZSA9IEV4YW1wbGUKLV9VSV9HdWlkZWxpbmVfdHlwZSA9IEd1aWRlbGluZQotX1VJX1JlcG9ydF90eXBlID0gUmVwb3J0Ci1fVUlfVGVtcGxhdGVfdHlwZSA9IFRlbXBsYXRlCi1fVUlfU3VwcG9ydGluZ01hdGVyaWFsX3R5cGUgPSBTdXBwb3J0aW5nIE1hdGVyaWFsCi1fVUlfVG9vbE1lbnRvcl90eXBlID0gVG9vbCBNZW50b3IKLV9VSV9XaGl0ZXBhcGVyX3R5cGUgPSBXaGl0ZXBhcGVyCi1fVUlfVGVybURlZmluaXRpb25fdHlwZSA9IFRlcm0gRGVmaW5pdGlvbgotX1VJX1ByYWN0aWNlX3R5cGUgPSBQcmFjdGljZQotX1VJX0VzdGltYXRpb25Db25zaWRlcmF0aW9uc190eXBlID0gRXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucwotX1VJX1JldXNhYmxlQXNzZXRfdHlwZSA9IFJldXNhYmxlIEFzc2V0Ci1fVUlfU3RhdGVfdHlwZSA9IFN0YXRlCi1fVUlfVmVydGV4X3R5cGUgPSBWZXJ0ZXgKLV9VSV9SZWdpb25fdHlwZSA9IFJlZ2lvbgotX1VJX1N0YXRlTWFjaGluZV90eXBlID0gU3RhdGUgTWFjaGluZQotX1VJX1RyYW5zaXRpb25fdHlwZSA9IFRyYW5zaXRpb24KLV9VSV9Qc2V1ZG9TdGF0ZV90eXBlID0gUHNldWRvIFN0YXRlCi1fVUlfRGlzY2lwbGluZV90eXBlID0gRGlzY2lwbGluZQotX1VJX0NvbnRlbnRDYXRlZ29yeV90eXBlID0gQ29udGVudCBDYXRlZ29yeQotX1VJX1JvbGVTZXRfdHlwZSA9IFJvbGUgU2V0Ci1fVUlfRG9tYWluX3R5cGUgPSBEb21haW4KLV9VSV9Xb3JrUHJvZHVjdFR5cGVfdHlwZSA9IFdvcmsgUHJvZHVjdCBLaW5kCi1fVUlfRGlzY2lwbGluZUdyb3VwaW5nX3R5cGUgPSBEaXNjaXBsaW5lIEdyb3VwaW5nCi1fVUlfVG9vbF90eXBlID0gVG9vbAotX1VJX1JvbGVTZXRHcm91cGluZ190eXBlID0gUm9sZSBTZXQgR3JvdXBpbmcKLV9VSV9DdXN0b21DYXRlZ29yeV90eXBlID0gQ3VzdG9tIENhdGVnb3J5Ci1fVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUgPSBEZWxpdmVyeSBQcm9jZXNzCi1fVUlfUHJvY2Vzc190eXBlID0gUHJvY2VzcwotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuX3R5cGUgPSBDYXBhYmlsaXR5IFBhdHRlcm4KLV9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV90eXBlID0gUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZQotX1VJX1JvYWRtYXBfdHlwZSA9IFJvYWRtYXAKLV9VSV9Qcm9jZXNzQ29tcG9uZW50X3R5cGUgPSBQcm9jZXNzIENvbXBvbmVudAotX1VJX1Byb2Nlc3NQYWNrYWdlX3R5cGUgPSBQcm9jZXNzIFBhY2thZ2UKLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX3R5cGUgPSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UKLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl90eXBlID0gUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvcgotX1VJX01ldGhvZFBsdWdpbl90eXBlID0gTWV0aG9kIFBsdWctaW4KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSA9IFZhcmlhYmlsaXR5IEVsZW1lbnQKLV9VSV9NZXRob2RVbml0X3R5cGUgPSBNZXRob2QgVW5pdAotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSA9IE1ldGhvZCBDb25maWd1cmF0aW9uCi1fVUlfUHJvY2Vzc0ZhbWlseV90eXBlID0gUHJvY2VzcyBGYW1pbHkKLV9VSV9NZXRob2RMaWJyYXJ5X3R5cGUgPSBNZXRob2QgTGlicmFyeQotX1VJX1Vua25vd25fdHlwZSA9IE9iamVjdAotCi1fVUlfVW5rbm93bl9kYXRhdHlwZT0gVmFsdWUKLQotX1VJX05hbWVkRWxlbWVudF9uYW1lX2ZlYXR1cmUgPSBOYW1lCi1fVUlfTWV0aG9kRWxlbWVudF9ndWlkX2ZlYXR1cmUgPSBHdWlkCi1fVUlfTWV0aG9kRWxlbWVudF9icmllZkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBCcmllZiBEZXNjcmlwdGlvbgotX1VJX01ldGhvZEVsZW1lbnRfb3duZWRSdWxlc19mZWF0dXJlID0gT3duZWQgUnVsZXMKLV9VSV9NZXRob2RFbGVtZW50X3N1cHByZXNzZWRfZmVhdHVyZSA9IFN1cHByZXNzZWQKLV9VSV9NZXRob2RFbGVtZW50X29yZGVyaW5nR3VpZGVfZmVhdHVyZSA9IE9yZGVyaW5nIEd1aWRlCi1fVUlfQ29uc3RyYWludF9ib2R5X2ZlYXR1cmUgPSBCb2R5Ci1fVUlfQ29udGVudEVsZW1lbnRfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gU3VwcG9ydGluZyBNYXRlcmlhbHMKLV9VSV9Db250ZW50RWxlbWVudF9jb25jZXB0c0FuZFBhcGVyc19mZWF0dXJlID0gQ29uY2VwdHMgQW5kIFBhcGVycwotX1VJX0NvbnRlbnRFbGVtZW50X2NoZWNrbGlzdHNfZmVhdHVyZSA9IENoZWNrbGlzdHMKLV9VSV9Db250ZW50RWxlbWVudF9ndWlkZWxpbmVzX2ZlYXR1cmUgPSBHdWlkZWxpbmVzCi1fVUlfQ29udGVudEVsZW1lbnRfZXhhbXBsZXNfZmVhdHVyZSA9IEV4YW1wbGVzCi1fVUlfQ29udGVudEVsZW1lbnRfYXNzZXRzX2ZlYXR1cmUgPSBBc3NldHMKLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uTmFtZV9mZWF0dXJlID0gUHJlc2VudGF0aW9uIE5hbWUKLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBQcmVzZW50YXRpb24KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfc2hhcGVpY29uX2ZlYXR1cmUgPSBTaGFwZWljb24KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfbm9kZWljb25fZmVhdHVyZSA9IE5vZGVpY29uCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX21haW5EZXNjcmlwdGlvbl9mZWF0dXJlID0gTWFpbiBEZXNjcmlwdGlvbgotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19mZWF0dXJlID0gU2VjdGlvbnMKLV9VSV9Db250ZW50RGVzY3JpcHRpb25fa2V5Q29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IEtleSBDb25zaWRlcmF0aW9ucwotX1VJX1NlY3Rpb25fc2VjdGlvbk5hbWVfZmVhdHVyZSA9IFNlY3Rpb24gTmFtZQotX1VJX1NlY3Rpb25fc2VjdGlvbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBTZWN0aW9uIERlc2NyaXB0aW9uCi1fVUlfU2VjdGlvbl9zdWJTZWN0aW9uc19mZWF0dXJlID0gU3ViIFNlY3Rpb25zCi1fVUlfU2VjdGlvbl9wcmVkZWNlc3Nvcl9mZWF0dXJlID0gUHJlZGVjZXNzb3IKLV9VSV9Sb2xlX21vZGlmaWVzX2ZlYXR1cmUgPSBNb2RpZmllcwotX1VJX1JvbGVfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFJlc3BvbnNpYmxlIEZvcgotX1VJX1dvcmtQcm9kdWN0X3JlcG9ydHNfZmVhdHVyZSA9IFJlcG9ydHMKLV9VSV9Xb3JrUHJvZHVjdF90ZW1wbGF0ZXNfZmVhdHVyZSA9IFRlbXBsYXRlcwotX1VJX1dvcmtQcm9kdWN0X3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBUb29sIE1lbnRvcnMKLV9VSV9Xb3JrUHJvZHVjdF9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IEVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMKLV9VSV9UYXNrX3BlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBQZXJmb3JtZWQgQnkKLV9VSV9UYXNrX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUgPSBNYW5kYXRvcnkgSW5wdXQKLV9VSV9UYXNrX291dHB1dF9mZWF0dXJlID0gT3V0cHV0Ci1fVUlfVGFza19hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeV9mZWF0dXJlID0gQWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeQotX1VJX1Rhc2tfb3B0aW9uYWxJbnB1dF9mZWF0dXJlID0gT3B0aW9uYWwgSW5wdXQKLV9VSV9UYXNrX3N0ZXBzX2ZlYXR1cmUgPSBTdGVwcwotX1VJX1Rhc2tfdG9vbE1lbnRvcnNfZmVhdHVyZSA9IFRvb2wgTWVudG9ycwotX1VJX1Rhc2tfZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBFc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zCi1fVUlfV29ya0RlZmluaXRpb25fcHJlY29uZGl0aW9uX2ZlYXR1cmUgPSBQcmVjb25kaXRpb24KLV9VSV9Xb3JrRGVmaW5pdGlvbl9wb3N0Y29uZGl0aW9uX2ZlYXR1cmUgPSBQb3N0Y29uZGl0aW9uCi1fVUlfQXJ0aWZhY3RfY29udGFpbmVyQXJ0aWZhY3RfZmVhdHVyZSA9IENvbnRhaW5lciBBcnRpZmFjdAotX1VJX0FydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0c19mZWF0dXJlID0gQ29udGFpbmVkIEFydGlmYWN0cwotX1VJX0RlbGl2ZXJhYmxlX2RlbGl2ZXJlZFdvcmtQcm9kdWN0c19mZWF0dXJlID0gRGVsaXZlcmVkIFdvcmsgUHJvZHVjdHMKLV9VSV9NZXRob2RQYWNrYWdlX2dsb2JhbF9mZWF0dXJlID0gR2xvYmFsCi1fVUlfTWV0aG9kUGFja2FnZV9yZXVzZWRQYWNrYWdlc19mZWF0dXJlID0gUmV1c2VkIFBhY2thZ2VzCi1fVUlfTWV0aG9kUGFja2FnZV9wYXJlbnRQYWNrYWdlX2ZlYXR1cmUgPSBQYXJlbnQgUGFja2FnZQotX1VJX01ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19mZWF0dXJlID0gQ2hpbGQgUGFja2FnZXMKLV9VSV9Db250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfZmVhdHVyZSA9IENvbnRlbnQgRWxlbWVudHMKLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX2JyaWVmT3V0bGluZV9mZWF0dXJlID0gQnJpZWYgT3V0bGluZQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25PcHRpb25zX2ZlYXR1cmUgPSBSZXByZXNlbnRhdGlvbiBPcHRpb25zCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBFeHRlcm5hbCBJZAotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gUHVycG9zZQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25faW1wYWN0T2ZOb3RIYXZpbmdfZmVhdHVyZSA9IEltcGFjdCBPZiBOb3QgSGF2aW5nCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9yZWFzb25zRm9yTm90TmVlZGluZ19mZWF0dXJlID0gUmVhc29ucyBGb3IgTm90IE5lZWRpbmcKLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX2V4dGVybmFsRGVzY3JpcHRpb25fZmVhdHVyZSA9IEV4dGVybmFsIERlc2NyaXB0aW9uCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9wYWNrYWdpbmdHdWlkYW5jZV9mZWF0dXJlID0gUGFja2FnaW5nIEd1aWRhbmNlCi1fVUlfUm9sZURlc2NyaXB0aW9uX3NraWxsc19mZWF0dXJlID0gU2tpbGxzCi1fVUlfUm9sZURlc2NyaXB0aW9uX2Fzc2lnbm1lbnRBcHByb2FjaGVzX2ZlYXR1cmUgPSBBc3NpZ25tZW50IEFwcHJvYWNoZXMKLV9VSV9Sb2xlRGVzY3JpcHRpb25fc3lub255bXNfZmVhdHVyZSA9IFN5bm9ueW1zCi1fVUlfVGFza0Rlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IFB1cnBvc2UKLV9VSV9UYXNrRGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBBbHRlcm5hdGl2ZXMKLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX2F0dGFjaG1lbnRzX2ZlYXR1cmUgPSBBdHRhY2htZW50cwotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYWRkaXRpb25hbEluZm9fZmVhdHVyZSA9IEFkZGl0aW9uYWwgSW5mbwotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fcHJvYmxlbV9mZWF0dXJlID0gUHJvYmxlbQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYmFja2dyb3VuZF9mZWF0dXJlID0gQmFja2dyb3VuZAotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fZ29hbHNfZmVhdHVyZSA9IEdvYWxzCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hcHBsaWNhdGlvbl9mZWF0dXJlID0gQXBwbGljYXRpb24KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2xldmVsc09mQWRvcHRpb25fZmVhdHVyZSA9IExldmVscyBPZiBBZG9wdGlvbgotX1VJX1BvaW50X3hfZmVhdHVyZSA9IFgKLV9VSV9Qb2ludF95X2ZlYXR1cmUgPSBZCi1fVUlfR3JhcGhFbGVtZW50X3Bvc2l0aW9uX2ZlYXR1cmUgPSBQb3NpdGlvbgotX1VJX0dyYXBoRWxlbWVudF9jb250YWluZWRfZmVhdHVyZSA9IENvbnRhaW5lZAotX1VJX0dyYXBoRWxlbWVudF9saW5rX2ZlYXR1cmUgPSBMaW5rCi1fVUlfR3JhcGhFbGVtZW50X2FuY2hvcmFnZV9mZWF0dXJlID0gQW5jaG9yYWdlCi1fVUlfR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfZmVhdHVyZSA9IFNlbWFudGljIE1vZGVsCi1fVUlfRGlhZ3JhbUVsZW1lbnRfaXNWaXNpYmxlX2ZlYXR1cmUgPSBJcyBWaXNpYmxlCi1fVUlfRGlhZ3JhbUVsZW1lbnRfY29udGFpbmVyX2ZlYXR1cmUgPSBDb250YWluZXIKLV9VSV9EaWFncmFtRWxlbWVudF9yZWZlcmVuY2VfZmVhdHVyZSA9IFJlZmVyZW5jZQotX1VJX0RpYWdyYW1FbGVtZW50X3Byb3BlcnR5X2ZlYXR1cmUgPSBQcm9wZXJ0eQotX1VJX0RpYWdyYW1MaW5rX3pvb21fZmVhdHVyZSA9IFpvb20KLV9VSV9EaWFncmFtTGlua192aWV3cG9ydF9mZWF0dXJlID0gVmlld3BvcnQKLV9VSV9EaWFncmFtTGlua19ncmFwaEVsZW1lbnRfZmVhdHVyZSA9IEdyYXBoIEVsZW1lbnQKLV9VSV9EaWFncmFtTGlua19kaWFncmFtX2ZlYXR1cmUgPSBEaWFncmFtCi1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBHcmFwaCBFbGVtZW50Ci1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFZGdlX2ZlYXR1cmUgPSBHcmFwaCBFZGdlCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9wcmVzZW50YXRpb25fZmVhdHVyZSA9IFByZXNlbnRhdGlvbgotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBHcmFwaCBFbGVtZW50Ci1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9kaWFncmFtX2ZlYXR1cmUgPSBEaWFncmFtCi1fVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUgPSBXaWR0aAotX1VJX0RpbWVuc2lvbl9oZWlnaHRfZmVhdHVyZSA9IEhlaWdodAotX1VJX1JlZmVyZW5jZV9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbl9mZWF0dXJlID0gSXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbgotX1VJX1JlZmVyZW5jZV9yZWZlcmVuY2VkX2ZlYXR1cmUgPSBSZWZlcmVuY2VkCi1fVUlfUHJvcGVydHlfa2V5X2ZlYXR1cmUgPSBLZXkKLV9VSV9Qcm9wZXJ0eV92YWx1ZV9mZWF0dXJlID0gVmFsdWUKLV9VSV9HcmFwaEVkZ2VfYW5jaG9yX2ZlYXR1cmUgPSBBbmNob3IKLV9VSV9HcmFwaEVkZ2Vfd2F5cG9pbnRzX2ZlYXR1cmUgPSBXYXlwb2ludHMKLV9VSV9EaWFncmFtX3pvb21fZmVhdHVyZSA9IFpvb20KLV9VSV9EaWFncmFtX3ZpZXdwb2ludF9mZWF0dXJlID0gVmlld3BvaW50Ci1fVUlfRGlhZ3JhbV9kaWFncmFtTGlua19mZWF0dXJlID0gRGlhZ3JhbSBMaW5rCi1fVUlfRGlhZ3JhbV9uYW1lc3BhY2VfZmVhdHVyZSA9IE5hbWVzcGFjZQotX1VJX0dyYXBoTm9kZV9zaXplX2ZlYXR1cmUgPSBTaXplCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZUluZm9fZmVhdHVyZSA9IFR5cGUgSW5mbwotX1VJX1VNQVNlbWFudGljTW9kZWxCcmlkZ2VfZWxlbWVudF9mZWF0dXJlID0gRWxlbWVudAotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IEVsZW1lbnQKLV9VSV9UZXh0RWxlbWVudF90ZXh0X2ZlYXR1cmUgPSBUZXh0Ci1fVUlfSW1hZ2VfdXJpX2ZlYXR1cmUgPSBVcmkKLV9VSV9JbWFnZV9taW1lVHlwZV9mZWF0dXJlID0gTWltZSBUeXBlCi1fVUlfUG9seWxpbmVfY2xvc2VkX2ZlYXR1cmUgPSBDbG9zZWQKLV9VSV9Qb2x5bGluZV93YXlwb2ludHNfZmVhdHVyZSA9IFdheXBvaW50cwotX1VJX0VsbGlwc2VfcmFkaXVzWF9mZWF0dXJlID0gUmFkaXVzIFgKLV9VSV9FbGxpcHNlX3JhZGl1c1lfZmVhdHVyZSA9IFJhZGl1cyBZCi1fVUlfRWxsaXBzZV9yb3RhdGlvbl9mZWF0dXJlID0gUm90YXRpb24KLV9VSV9FbGxpcHNlX3N0YXJ0QW5nbGVfZmVhdHVyZSA9IFN0YXJ0IEFuZ2xlCi1fVUlfRWxsaXBzZV9lbmRBbmdsZV9mZWF0dXJlID0gRW5kIEFuZ2xlCi1fVUlfRWxsaXBzZV9jZW50ZXJfZmVhdHVyZSA9IENlbnRlcgotX1VJX0FjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX2ZlYXR1cmUgPSBCcmVha2Rvd24gRWxlbWVudHMKLV9VSV9BY3Rpdml0eV9yb2FkbWFwc19mZWF0dXJlID0gUm9hZG1hcHMKLV9VSV9BY3Rpdml0eV9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUgPSBTdXBwb3J0aW5nIE1hdGVyaWFscwotX1VJX0FjdGl2aXR5X2NoZWNrbGlzdHNfZmVhdHVyZSA9IENoZWNrbGlzdHMKLV9VSV9BY3Rpdml0eV9jb25jZXB0c19mZWF0dXJlID0gQ29uY2VwdHMKLV9VSV9BY3Rpdml0eV9leGFtcGxlc19mZWF0dXJlID0gRXhhbXBsZXMKLV9VSV9BY3Rpdml0eV9ndWlkZWxpbmVzX2ZlYXR1cmUgPSBHdWlkZWxpbmVzCi1fVUlfQWN0aXZpdHlfcmV1c2FibGVBc3NldHNfZmVhdHVyZSA9IFJldXNhYmxlIEFzc2V0cwotX1VJX0FjdGl2aXR5X2lzRW5hY3RhYmxlX2ZlYXR1cmUgPSBJcyBFbmFjdGFibGUKLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc1JlcGVhdGFibGVfZmVhdHVyZSA9IElzIFJlcGVhdGFibGUKLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc09uZ29pbmdfZmVhdHVyZSA9IElzIE9uZ29pbmcKLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc0V2ZW50RHJpdmVuX2ZlYXR1cmUgPSBJcyBFdmVudCBEcml2ZW4KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9saW5rVG9QcmVkZWNlc3Nvcl9mZWF0dXJlID0gTGluayBUbyBQcmVkZWNlc3NvcgotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlZml4X2ZlYXR1cmUgPSBQcmVmaXgKLV9VSV9CcmVha2Rvd25FbGVtZW50X2lzUGxhbm5lZF9mZWF0dXJlID0gSXMgUGxhbm5lZAotX1VJX0JyZWFrZG93bkVsZW1lbnRfaGFzTXVsdGlwbGVPY2N1cnJlbmNlc19mZWF0dXJlID0gSGFzIE11bHRpcGxlIE9jY3VycmVuY2VzCi1fVUlfQnJlYWtkb3duRWxlbWVudF9pc09wdGlvbmFsX2ZlYXR1cmUgPSBJcyBPcHRpb25hbAotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQWZ0ZXJfZmVhdHVyZSA9IFByZXNlbnRlZCBBZnRlcgotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQmVmb3JlX2ZlYXR1cmUgPSBQcmVzZW50ZWQgQmVmb3JlCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wbGFubmluZ0RhdGFfZmVhdHVyZSA9IFBsYW5uaW5nIERhdGEKLV9VSV9CcmVha2Rvd25FbGVtZW50X3N1cGVyQWN0aXZpdGllc19mZWF0dXJlID0gU3VwZXIgQWN0aXZpdHkKLV9VSV9UZWFtUHJvZmlsZV90ZWFtUm9sZXNfZmVhdHVyZSA9IFRlYW0gUm9sZXMKLV9VSV9UZWFtUHJvZmlsZV9zdXBlclRlYW1fZmVhdHVyZSA9IFN1cGVyIFRlYW0KLV9VSV9UZWFtUHJvZmlsZV9zdWJUZWFtX2ZlYXR1cmUgPSBTdWIgVGVhbQotX1VJX1JvbGVEZXNjcmlwdG9yX1JvbGVfZmVhdHVyZSA9IFJvbGUKLV9VSV9Sb2xlRGVzY3JpcHRvcl9tb2RpZmllc19mZWF0dXJlID0gTW9kaWZpZXMKLV9VSV9Sb2xlRGVzY3JpcHRvcl9yZXNwb25zaWJsZUZvcl9mZWF0dXJlID0gUmVzcG9uc2libGUgRm9yCi1fVUlfV29ya09yZGVyX2xpbmtUeXBlX2ZlYXR1cmUgPSBMaW5rIFR5cGUKLV9VSV9Xb3JrT3JkZXJfcHJlZF9mZWF0dXJlID0gUHJlZAotX1VJX1BsYW5uaW5nRGF0YV9zdGFydERhdGVfZmVhdHVyZSA9IFN0YXJ0IERhdGUKLV9VSV9QbGFubmluZ0RhdGFfZmluaXNoRGF0ZV9mZWF0dXJlID0gRmluaXNoIERhdGUKLV9VSV9QbGFubmluZ0RhdGFfcmFua19mZWF0dXJlID0gUmFuawotX1VJX0Rlc2NyaXB0b3JfaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlX2ZlYXR1cmUgPSBJcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2UKLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFbnRyeVN0YXRlX2ZlYXR1cmUgPSBBY3Rpdml0eSBFbnRyeSBTdGF0ZQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUV4aXRTdGF0ZV9mZWF0dXJlID0gQWN0aXZpdHkgRXhpdCBTdGF0ZQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdF9mZWF0dXJlID0gV29yayBQcm9kdWN0Ci1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdGVkQnlfZmVhdHVyZSA9IEltcGFjdGVkIEJ5Ci1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdHNfZmVhdHVyZSA9IEltcGFjdHMKLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfZGVsaXZlcmFibGVQYXJ0c19mZWF0dXJlID0gRGVsaXZlcmFibGUgUGFydHMKLV9VSV9UYXNrRGVzY3JpcHRvcl9UYXNrX2ZlYXR1cmUgPSBUYXNrCi1fVUlfVGFza0Rlc2NyaXB0b3JfYWRkaXRpb25hbGx5UGVyZm9ybWVkQnlfZmVhdHVyZSA9IFNlY29uZGFyeSBQZXJmb3JtZXIKLV9VSV9UYXNrRGVzY3JpcHRvcl9hc3Npc3RlZEJ5X2ZlYXR1cmUgPSBBc3Npc3RlZCBCeQotX1VJX1Rhc2tEZXNjcmlwdG9yX2V4dGVybmFsSW5wdXRfZmVhdHVyZSA9IEV4dGVybmFsIElucHV0Ci1fVUlfVGFza0Rlc2NyaXB0b3JfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSA9IE1hbmRhdG9yeSBJbnB1dAotX1VJX1Rhc2tEZXNjcmlwdG9yX29wdGlvbmFsSW5wdXRfZmVhdHVyZSA9IE9wdGlvbmFsIElucHV0Ci1fVUlfVGFza0Rlc2NyaXB0b3Jfb3V0cHV0X2ZlYXR1cmUgPSBPdXRwdXQKLV9VSV9UYXNrRGVzY3JpcHRvcl9wZXJmb3JtZWRQcmltYXJpbHlCeV9mZWF0dXJlID0gUHJpbWFyeSBQZXJmb3JtZXIKLV9VSV9UYXNrRGVzY3JpcHRvcl9zZWxlY3RlZFN0ZXBzX2ZlYXR1cmUgPSBTZWxlY3RlZCBTdGVwcwotX1VJX0NvbXBvc2l0ZVJvbGVfYWdncmVnYXRlZFJvbGVzX2ZlYXR1cmUgPSBBZ2dyZWdhdGVkIFJvbGVzCi1fVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3VzYWdlR3VpZGFuY2VfZmVhdHVyZSA9IFVzYWdlIEd1aWRhbmNlCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBQdXJwb3NlCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9hbHRlcm5hdGl2ZXNfZmVhdHVyZSA9IEFsdGVybmF0aXZlcwotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25faG93dG9TdGFmZl9mZWF0dXJlID0gSG93dG8gU3RhZmYKLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9zY2FsZV9mZWF0dXJlID0gU2NhbGUKLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzX2ZlYXR1cmUgPSBQcm9qZWN0IENoYXJhY3RlcmlzdGljcwotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Jpc2tMZXZlbF9mZWF0dXJlID0gUmlzayBMZXZlbAotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX2VzdGltYXRpbmdUZWNobmlxdWVfZmVhdHVyZSA9IEVzdGltYXRpbmcgVGVjaG5pcXVlCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdE1lbWJlckV4cGVydGlzZV9mZWF0dXJlID0gUHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZU9mQ29udHJhY3RfZmVhdHVyZSA9IFR5cGUgT2YgQ29udHJhY3QKLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlID0gRXh0ZXJuYWwgSWQKLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fc2NvcGVfZmVhdHVyZSA9IFNjb3BlCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3VzYWdlTm90ZXNfZmVhdHVyZSA9IFVzYWdlIE5vdGVzCi1fVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3JlZmluZWREZXNjcmlwdGlvbl9mZWF0dXJlID0gUmVmaW5lZCBEZXNjcmlwdGlvbgotX1VJX1ByYWN0aWNlX3N1YlByYWN0aWNlc19mZWF0dXJlID0gU3ViIFByYWN0aWNlcwotX1VJX1ByYWN0aWNlX2NvbnRlbnRSZWZlcmVuY2VzX2ZlYXR1cmUgPSBDb250ZW50IFJlZmVyZW5jZXMKLV9VSV9QcmFjdGljZV9hY3Rpdml0eVJlZmVyZW5jZXNfZmVhdHVyZSA9IEFjdGl2aXR5IFJlZmVyZW5jZXMKLV9VSV9TdGF0ZV9Xb3JrUHJvZHVjdF9mZWF0dXJlID0gV29yayBQcm9kdWN0Ci1fVUlfU3RhdGVfUmVnaW9uX2ZlYXR1cmUgPSBSZWdpb24KLV9VSV9TdGF0ZV9zdWJtYWNoaW5lX2ZlYXR1cmUgPSBTdWJtYWNoaW5lCi1fVUlfVmVydGV4X2NvbnRhaW5lcl9mZWF0dXJlID0gQ29udGFpbmVyCi1fVUlfVmVydGV4X291dGdvaW5nX2ZlYXR1cmUgPSBPdXRnb2luZwotX1VJX1ZlcnRleF9pbmNvbWluZ19mZWF0dXJlID0gSW5jb21pbmcKLV9VSV9SZWdpb25fVmVydGV4X2ZlYXR1cmUgPSBWZXJ0ZXgKLV9VSV9SZWdpb25fVHJhbnNpdGlvbl9mZWF0dXJlID0gVHJhbnNpdGlvbgotX1VJX1JlZ2lvbl9TdGF0ZV9mZWF0dXJlID0gU3RhdGUKLV9VSV9SZWdpb25fU3RhdGVNYWNoaW5lX2ZlYXR1cmUgPSBTdGF0ZSBNYWNoaW5lCi1fVUlfU3RhdGVNYWNoaW5lX1JlZ2lvbl9mZWF0dXJlID0gUmVnaW9uCi1fVUlfVHJhbnNpdGlvbl9Xb3JrRGVmaW5pdGlvbl9mZWF0dXJlID0gV29yayBEZWZpbml0aW9uCi1fVUlfVHJhbnNpdGlvbl9jb250YWluZXJfZmVhdHVyZSA9IENvbnRhaW5lcgotX1VJX1RyYW5zaXRpb25fc291cmNlX2ZlYXR1cmUgPSBTb3VyY2UKLV9VSV9UcmFuc2l0aW9uX3RhcmdldF9mZWF0dXJlID0gVGFyZ2V0Ci1fVUlfRGlzY2lwbGluZV90YXNrc19mZWF0dXJlID0gVGFza3MKLV9VSV9EaXNjaXBsaW5lX3N1YmRpc2NpcGxpbmVfZmVhdHVyZSA9IFN1YmRpc2NpcGxpbmUKLV9VSV9EaXNjaXBsaW5lX3JlZmVyZW5jZVdvcmtmbG93c19mZWF0dXJlID0gUmVmZXJlbmNlIFdvcmtmbG93cwotX1VJX1JvbGVTZXRfcm9sZXNfZmVhdHVyZSA9IFJvbGVzCi1fVUlfRG9tYWluX3dvcmtQcm9kdWN0c19mZWF0dXJlID0gV29yayBQcm9kdWN0cwotX1VJX0RvbWFpbl9zdWJkb21haW5zX2ZlYXR1cmUgPSBTdWJkb21haW5zCi1fVUlfV29ya1Byb2R1Y3RUeXBlX3dvcmtQcm9kdWN0c19mZWF0dXJlID0gV29yayBQcm9kdWN0cwotX1VJX0Rpc2NpcGxpbmVHcm91cGluZ19kaXNjaXBsaW5lc19mZWF0dXJlID0gRGlzY2lwbGluZXMKLV9VSV9Ub29sX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBUb29sIE1lbnRvcnMKLV9VSV9Sb2xlU2V0R3JvdXBpbmdfcm9sZVNldHNfZmVhdHVyZSA9IFJvbGUgU2V0cwotX1VJX0N1c3RvbUNhdGVnb3J5X2NhdGVnb3JpemVkRWxlbWVudHNfZmVhdHVyZSA9IENhdGVnb3JpemVkIEVsZW1lbnRzCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19mZWF0dXJlID0gU3ViIENhdGVnb3JpZXMKLV9VSV9EZWxpdmVyeVByb2Nlc3NfZWR1Y2F0aW9uTWF0ZXJpYWxzX2ZlYXR1cmUgPSBFZHVjYXRpb24gTWF0ZXJpYWxzCi1fVUlfRGVsaXZlcnlQcm9jZXNzX2NvbW11bmljYXRpb25zTWF0ZXJpYWxzX2ZlYXR1cmUgPSBDb21tdW5pY2F0aW9ucyBNYXRlcmlhbHMKLV9VSV9Qcm9jZXNzX2luY2x1ZGVzUGF0dGVybnNfZmVhdHVyZSA9IEluY2x1ZGVzIFBhdHRlcm5zCi1fVUlfUHJvY2Vzc19kZWZhdWx0Q29udGV4dF9mZWF0dXJlID0gRGVmYXVsdCBDb250ZXh0Ci1fVUlfUHJvY2Vzc192YWxpZENvbnRleHRfZmVhdHVyZSA9IFZhbGlkIENvbnRleHQKLV9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9iYXNlZE9uUHJvY2Vzc2VzX2ZlYXR1cmUgPSBCYXNlZCBPbiBQcm9jZXNzZXMKLV9VSV9Qcm9jZXNzQ29tcG9uZW50X2ludGVyZmFjZXNfZmVhdHVyZSA9IEludGVyZmFjZXMKLV9VSV9Qcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfZmVhdHVyZSA9IFByb2Nlc3MKLV9VSV9Qcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfZmVhdHVyZSA9IFByb2Nlc3MgRWxlbWVudHMKLV9VSV9Qcm9jZXNzUGFja2FnZV9kaWFncmFtc19mZWF0dXJlID0gRGlhZ3JhbXMKLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZVNwZWNpZmljYXRpb25zX2ZlYXR1cmUgPSBJbnRlcmZhY2UgU3BlY2lmaWNhdGlvbnMKLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZUlPX2ZlYXR1cmUgPSBJbnRlcmZhY2UgSU8KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9Qcm9jZXNzQ29tcG9uZW50X2ZlYXR1cmUgPSBQcm9jZXNzIENvbXBvbmVudAotX1VJX01ldGhvZFBsdWdpbl91c2VyQ2hhbmdlYWJsZV9mZWF0dXJlID0gVXNlciBDaGFuZ2VhYmxlCi1fVUlfTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX2ZlYXR1cmUgPSBNZXRob2QgUGFja2FnZXMKLV9VSV9NZXRob2RQbHVnaW5fYmFzZXNfZmVhdHVyZSA9IEJhc2VzCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5VHlwZV9mZWF0dXJlID0gVmFyaWFiaWxpdHkgVHlwZQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUgPSBWYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50Ci1fVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUgPSBBdXRob3JzCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUgPSBDaGFuZ2UgRGF0ZQotX1VJX01ldGhvZFVuaXRfY2hhbmdlRGVzY3JpcHRpb25fZmVhdHVyZSA9IENoYW5nZSBEZXNjcmlwdGlvbgotX1VJX01ldGhvZFVuaXRfdmVyc2lvbl9mZWF0dXJlID0gVmVyc2lvbgotX1VJX01ldGhvZFVuaXRfY29weXJpZ2h0U3RhdGVtZW50X2ZlYXR1cmUgPSBDb3B5cmlnaHQgU3RhdGVtZW50Ci1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQbHVnaW5TZWxlY3Rpb25fZmVhdHVyZSA9IE1ldGhvZCBQbHVnLWluIFNlbGVjdGlvbgotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fbWV0aG9kUGFja2FnZVNlbGVjdGlvbl9mZWF0dXJlID0gTWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9wcm9jZXNzVmlld3NfZmVhdHVyZSA9IFByb2Nlc3MgVmlld3MKLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2RlZmF1bHRWaWV3X2ZlYXR1cmUgPSBEZWZhdWx0IFZpZXcKLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2Jhc2VDb25maWd1cmF0aW9uc19mZWF0dXJlID0gQmFzZSBDb25maWd1cmF0aW9ucwotX1VJX1Byb2Nlc3NGYW1pbHlfZGVsaXZlcnlQcm9jZXNzZXNfZmVhdHVyZSA9IERlbGl2ZXJ5IFByb2Nlc3NlcwotX1VJX01ldGhvZExpYnJhcnlfbWV0aG9kUGx1Z2luc19mZWF0dXJlID0gTWV0aG9kIFBsdWctaW5zCi1fVUlfTWV0aG9kTGlicmFyeV9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnNfZmVhdHVyZSA9IFByZWRlZmluZWQgQ29uZmlndXJhdGlvbnMKLV9VSV9Vbmtub3duX2ZlYXR1cmUgPSBVbnNwZWNpZmllZAotCi1fVUlfV29ya09yZGVyVHlwZV9maW5pc2hUb1N0YXJ0X2xpdGVyYWwgPSBmaW5pc2hUb1N0YXJ0Ci1fVUlfV29ya09yZGVyVHlwZV9maW5pc2hUb0ZpbmlzaF9saXRlcmFsID0gZmluaXNoVG9GaW5pc2gKLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9TdGFydF9saXRlcmFsID0gc3RhcnRUb1N0YXJ0Ci1fVUlfV29ya09yZGVyVHlwZV9zdGFydFRvRmluaXNoX2xpdGVyYWwgPSBzdGFydFRvRmluaXNoCi1fVUlfUHNldWRvU3RhdGVLaW5kX2luaXRpYWxfbGl0ZXJhbCA9IGluaXRpYWwKLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfam9pbl9saXRlcmFsID0gam9pbgotX1VJX1BzZXVkb1N0YXRlS2luZF9mb3JrX2xpdGVyYWwgPSBmb3JrCi1fVUlfUHNldWRvU3RhdGVLaW5kX2p1bmN0aW9uX2xpdGVyYWwgPSBqdW5jdGlvbgotX1VJX1BzZXVkb1N0YXRlS2luZF9jaG9pY2VfbGl0ZXJhbCA9IGNob2ljZQotX1VJX1BzZXVkb1N0YXRlS2luZF9lbnRyeVBvaW50X2xpdGVyYWwgPSBlbnRyeVBvaW50Ci1fVUlfUHNldWRvU3RhdGVLaW5kX2V4aXRQb2ludF9saXRlcmFsID0gZXhpdFBvaW50Ci1fVUlfUHNldWRvU3RhdGVLaW5kX3Rlcm1pbmF0ZV9saXRlcmFsID0gdGVybWluYXRlCi1fVUlfVmFyaWFiaWxpdHlUeXBlX25hX2xpdGVyYWwgPSBuYQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9jb250cmlidXRlc19saXRlcmFsID0gY29udHJpYnV0ZXMKLV9VSV9WYXJpYWJpbGl0eVR5cGVfZXh0ZW5kc19saXRlcmFsID0gZXh0ZW5kcwotX1VJX1ZhcmlhYmlsaXR5VHlwZV9yZXBsYWNlc19saXRlcmFsID0gcmVwbGFjZXMKLV9VSV9WYXJpYWJpbGl0eVR5cGVfbG9jYWxDb250cmlidXRpb25fbGl0ZXJhbCA9IGxvY2FsQ29udHJpYnV0aW9uCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsUmVwbGFjZW1lbnRfbGl0ZXJhbCA9IGxvY2FsUmVwbGFjZW1lbnQKLV9VSV9BcnRpZmFjdERlc2NyaXB0b3JfdHlwZSA9IEFydGlmYWN0IERlc2NyaXB0b3IKLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0b3JfdHlwZSA9IERlbGl2ZXJhYmxlIERlc2NyaXB0b3IKLV9VSV9PdXRjb21lRGVzY3JpcHRvcl90eXBlID0gT3V0Y29tZSBEZXNjcmlwdG9yCi1fVUlfTWV0aG9kRWxlbWVudFByb3BlcnR5X3R5cGUgPSBNZXRob2QgRWxlbWVudCBQcm9wZXJ0eQotX1VJX01ldGhvZEVsZW1lbnRfbWV0aG9kRWxlbWVudFByb3BlcnR5X2ZlYXR1cmUgPSBNZXRob2QgRWxlbWVudCBQcm9wZXJ0eQotX1VJX01ldGhvZEVsZW1lbnRQcm9wZXJ0eV92YWx1ZV9mZWF0dXJlID0gVmFsdWUKLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3N1YnRyYWN0ZWRDYXRlZ29yeV9mZWF0dXJlID0gU3VidHJhY3RlZCBDYXRlZ29yeQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fYWRkZWRDYXRlZ29yeV9mZWF0dXJlID0gQWRkZWQgQ2F0ZWdvcnkKLV9VSV9WYXJpYWJpbGl0eVR5cGVfZXh0ZW5kc1JlcGxhY2VzX2xpdGVyYWwgPSBleHRlbmRzUmVwbGFjZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNGY3Njg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08IS0tCi0gPGNvcHlyaWdodD4KLSA8L2NvcHlyaWdodD4KLQotICRJZCQKLS0tPgotCi08cGx1Z2luPgotICAgIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWRpdC5pdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yaWVzIj4KLSAgICA8ZmFjdG9yeSAKLSAgICAgICB1cmkgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zL3VtYS5lY29yZSIgCi0gICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIgCi0gICAgICAgc3VwcG9ydGVkVHlwZXMgPSAKLSAgICAgICAgICJvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcgotICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcgotICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcgotICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcgotICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UiIC8+Ci0gIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZDc5ZWUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5kb21haW4uVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotCi0vKioKLSAqIEEgY29tbWFuZCB0aGF0IGNyZWF0ZXMgYW4gdW5pbml0aWFsaXplZCBjb3B5IG9mIGEgbWV0aG9kIGVsZW1lbnQuIFRoZQotICogbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uIHdpbGwgYmUgZXhlY3V0ZWQgdXNpbmcKLSAqIHtAbGluayBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kfS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZCBleHRlbmRzIENyZWF0ZUNvcHlDb21tYW5kIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGRvbWFpbgotCSAqICAgICAgICAgICAgdGhlIGVkaXRpbmcgZG9tYWluCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICB0aGUgb2JqZWN0IGJlaW5nIGNvcGllZAotCSAqIEBwYXJhbSBjb3B5SGVscGVyCi0JICogICAgICAgICAgICBhIGhlbHBlciBjbGFzcyB0aGF0IGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBjb3BpZWQgb2JqZWN0cwotCSAqICAgICAgICAgICAgYW5kIHRoZWlyIGFzc29jaWF0ZWQgY29waWVzCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUhlbHBlciBjb3B5SGVscGVyKSB7Ci0JCXN1cGVyKGRvbWFpbiwgb3duZXIsIGNvcHlIZWxwZXIpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJlc3VsdCBvZiB0aGUgY29weSBvcGVyYXRpb24uCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gY29udGFpbmluZyB0aGUgY29waWVkIG1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGRvR2V0UmVzdWx0KCkgewotCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBzdXBlci5kb0dldFJlc3VsdCgpOwotCi0JCWlmIChkb21haW4gaW5zdGFuY2VvZiBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCSgoVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBkb21haW4pLmFkZENvcHlJbmZvKAotCQkJCQljb2xsZWN0aW9uLCBjb3B5SGVscGVyKTsKLQkJfQotCi0JCXJldHVybiBjb2xsZWN0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxYTMyMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogQSBjb21tYW5kIHRoYXQgdGFrZXMgYW4gdW5pbml0aWFsaXplZCBjb3B5IG9mIGEgbWV0aG9kIGVsZW1lbnQgYW5kIHNldHMgYSBuZXcKLSAqIEdVSUQuIElmIHRoZSBvcmlnaW5hbCBlbGVtZW50IGlzIGEgPGNvZGU+Q29udGVudEVsZW1lbnQ8L2NvZGU+IHdpdGggYSB2YWxpZAotICogPGNvZGU+Q29udGVudERlc2NyaXB0aW9uPC9jb2RlPiwgYSBjb3B5IG9mIHRoZQotICogPGNvZGU+Q29udGVudERlc2NyaXB0aW9uPC9jb2RlPiBpcyBhbHNvIGNyZWF0ZWQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kIGV4dGVuZHMgSW5pdGlhbGl6ZUNvcHlDb21tYW5kIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGRvbWFpbgotCSAqICAgICAgICAgICAgdGhlIGVkaXRpbmcgZG9tYWluCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICB0aGUgb2JqZWN0IGJlaW5nIGNvcGllZAotCSAqIEBwYXJhbSBjb3B5SGVscGVyCi0JICogICAgICAgICAgICBhIGhlbHBlciBjbGFzcyB0aGF0IGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBjb3BpZWQgb2JqZWN0cwotCSAqICAgICAgICAgICAgYW5kIHRoZWlyIGFzc29jaWF0ZWQgY29waWVzCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgY29weUhlbHBlcikgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBjb3B5SGVscGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuSW5pdGlhbGl6ZUNvcHlDb21tYW5kI2RvRXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZG9FeGVjdXRlKCkgewotCQlzdXBlci5kb0V4ZWN1dGUoKTsKLQotCQkvLyBnZW5lcmF0ZSBuZXcgR1VJRCBmb3IgdGhlIGNvcHkKLQkJLy8KLQkJaWYgKGNvcHkgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoKE1ldGhvZEVsZW1lbnQpIGNvcHkpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCQlFT2JqZWN0IGVDb250YWluZXIgPSBlLmVDb250YWluZXIoKTsKLQkJCQlpZiAoZUNvbnRhaW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJZS5zZXRHdWlkKFVtYVV0aWwuZ2VuZXJhdGVHVUlEKCgoTWV0aG9kRWxlbWVudCkgZUNvbnRhaW5lcikKLQkJCQkJCQkuZ2V0R3VpZCgpKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZS5zZXRHdWlkKFVtYVV0aWwuZ2VuZXJhdGVHVUlEKCkpOwotCQkJCQlVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmxvZygiTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDogZUNvbnRhaW5lciBub3QgaW5pdGlhbGl6ZWQgZm9yICIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZS5zZXRHdWlkKFVtYVV0aWwuZ2VuZXJhdGVHVUlEKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSXRlcmF0ZXMgb3ZlciB0aGUgcmVmZXJlbmNlcyBvZiB0aGUgb3duZXIgb2JqZWN0IGFuZCBzZXRzIHRoZW0KLQkgKiBhY2NvcmRpbmdseSBpbiB0aGUgY29weS4gSW5jbHVkZXMgY29waW5nIG9mIG9wcG9zaXRlIGZlYXR1cmVzLgotCSAqLwotCXByaXZhdGUgdm9pZCBkb0NvcHlSZWZlcmVuY2VzKCkgewotCQlpZiAob3duZXIgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCXN1cGVyLmNvcHlSZWZlcmVuY2VzKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChJdGVyYXRvciByZWZlcmVuY2VzID0gZ2V0UmVmZXJlbmNlc1RvQ29weSgpLml0ZXJhdG9yKCk7IHJlZmVyZW5jZXMKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRVJlZmVyZW5jZSByZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgcmVmZXJlbmNlcy5uZXh0KCk7Ci0JCQlpZiAoIXJlZmVyZW5jZS5pc0NoYW5nZWFibGUoKSB8fCByZWZlcmVuY2UuaXNEZXJpdmVkKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJRVJlZmVyZW5jZSByZXZlcnNlUmVmZXJlbmNlID0gcmVmZXJlbmNlLmdldEVPcHBvc2l0ZSgpOwotCi0JCQlPYmplY3QgdmFsdWUgPSBvd25lci5lR2V0KHJlZmVyZW5jZSk7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gT3Bwb3NpdGVGZWF0dXJlCi0JCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmUocmVmZXJlbmNlKTsKLQkJCWJvb2xlYW4gY29waWVkVGFyZ2V0UmVxdWlyZWQgPSByZXZlcnNlUmVmZXJlbmNlICE9IG51bGwKLQkJCQkJfHwgcmVmZXJlbmNlLmlzQ29udGFpbm1lbnQoKQotCQkJCQl8fCAob3Bwb3NpdGVGZWF0dXJlICE9IG51bGwgJiYgIW9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSk7Ci0JCQkvLyAibWFueSIgb3Bwb3NpdGUgZmVhdHVyZSBkb2VzIG5vdCByZXF1aXJlIGNvcGllZCB0YXJnZXQsIGl0IGlzCi0JCQkvLyB0cmVhdGVkIGFzIGEgcmVndWxhciBub24tY29udGFpbm1lbnQgcmVmZXJlbmNlCi0JCQkvLyBUT0RPOiBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IGNvcGllZCBpbgotCQkJLy8gRU1GIGltcGxlbWVudGF0aW9uCi0JCQlpZiAocmVmZXJlbmNlLmlzTWFueSgpKSB7Ci0JCQkJTGlzdCB2YWx1ZUxpc3QgPSAoTGlzdCkgdmFsdWU7Ci0JCQkJaWYgKCF2YWx1ZUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCUVMaXN0IGNvcHlMaXN0ID0gKEVMaXN0KSBjb3B5LmVHZXQocmVmZXJlbmNlKTsKLQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJZm9yIChJdGVyYXRvciB2YWx1ZUl0ZXIgPSB2YWx1ZUxpc3QuaXRlcmF0b3IoKTsgdmFsdWVJdGVyCi0JCQkJCQkJLmhhc05leHQoKTsgKytpbmRleCkgewotCQkJCQkJRU9iamVjdCBvYmplY3QgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlvYmplY3QgPSAoRU9iamVjdCkgdmFsdWVJdGVyLm5leHQoKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJVW1hRWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQl9Ci0JCQkJCQlFT2JqZWN0IHRhcmdldCA9IGNvcHlIZWxwZXIuZ2V0Q29weVRhcmdldChvYmplY3QsCi0JCQkJCQkJCWNvcGllZFRhcmdldFJlcXVpcmVkKTsKLQkJCQkJCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCQkJCQlicmVhazsgLy8gaWYgb25lIGlzIG51bGwsIHRoZXknbGwgYWxsIGJlIG51bGwKLQkJCQkJCWlmIChyZXZlcnNlUmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCQkJCQlpbnQgcG9zaXRpb24gPSBjb3B5TGlzdC5pbmRleE9mKHRhcmdldCk7Ci0JCQkJCQkJaWYgKHBvc2l0aW9uID09IC0xKSB7Ci0JCQkJCQkJCWNvcHlMaXN0LmFkZChpbmRleCwgdGFyZ2V0KTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQljb3B5TGlzdC5tb3ZlKGluZGV4LCB0YXJnZXQpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY29weUxpc3QuYWRkKHRhcmdldCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUVPYmplY3QgdGFyZ2V0ID0gY29weUhlbHBlci5nZXRDb3B5VGFyZ2V0KChFT2JqZWN0KSB2YWx1ZSwKLQkJCQkJCWNvcGllZFRhcmdldFJlcXVpcmVkKTsKLQkJCQlpZiAodGFyZ2V0ICE9IG51bGwpIHsKLQkJCQkJY29weS5lU2V0KHJlZmVyZW5jZSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5UmVmZXJlbmNlcygpIHsKLQkJZG9Db3B5UmVmZXJlbmNlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9jb21tYW5kL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvY29tbWFuZC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcwMWViOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9jb21tYW5kL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGNvbW1hbmRzIGZvciBjb3B5aW5nIHRoZSBVTUEgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2RvbWFpbi9UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvZG9tYWluL1RyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkODYxYzdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvZG9tYWluL1RyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5kb21haW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIEEgdHJhY2VhYmxlIGFkYXB0ZXIgZmFjdG9yeSBlZGl0aW5nIGRvbWFpbiB1c2VkIGZvciBjb3B5aW5nIG1ldGhvZCBlbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBleHRlbmRzCi0JCUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiB7Ci0KLQkvLyBNYXBzIGNvcGllZCBtZXRob2QgZWxlbWVudHMgdG8gdGhlaXIgb3JpZ2luYWwgY291bnRlcnBhcnRzLgotCS8vIE5vdGU6IENvcGllZCBlbGVtZW50cyBhcmUgY29waWVzIG9mIHRoZSBjbGlwYm9hcmQgY29waWVzLgotCXByaXZhdGUgSGFzaE1hcCBjb3B5VG9PcmlnaW5hbE1hcCA9IG51bGw7Ci0KLQkvLyBNYXBzIG9yaWdpbmFsIGVsZW1lbnRzIHRvIHRoZWlyIGNsaXBib2FyZCBjb3BpZXMuCi0JcHJpdmF0ZSBNYXAgb3JpZ2luYWxUb0NsaXBib2FyZE1hcCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqICAgICAgICAgICAgYW4gYWRhcHRlciBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSBhZGFwdGVyIHRvIHdoaWNoIGNhbGxzCi0JICogICAgICAgICAgICBhcmUgZGVsZWdhdGVkCi0JICogQHBhcmFtIGNvbW1hbmRTdGFjawotCSAqICAgICAgICAgICAgYSBjb21tYW5kIHN0YWNrCi0JICovCi0JcHVibGljIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbW1hbmRTdGFjayBjb21tYW5kU3RhY2spIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjayk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFuIGFkYXB0ZXIgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgYWRhcHRlciB0byB3aGljaCBjYWxscwotCSAqICAgICAgICAgICAgYXJlIGRlbGVnYXRlZAotCSAqIEBwYXJhbSBjb21tYW5kU3RhY2sKLQkgKiAgICAgICAgICAgIGEgY29tbWFuZCBzdGFjawotCSAqIEBwYXJhbSByZXNvdXJjZVRvUmVhZE9ubHlNYXAKLQkgKiAgICAgICAgICAgIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGRvbWFpbiBpcyByZWFkIG9ubHkKLQkgKi8KLQlwdWJsaWMgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgTWFwIHJlc291cmNlVG9SZWFkT25seU1hcCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrLCByZXNvdXJjZVRvUmVhZE9ubHlNYXApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhbiBhZGFwdGVyIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgdG8gd2hpY2ggY2FsbHMKLQkgKiAgICAgICAgICAgIGFyZSBkZWxlZ2F0ZWQKLQkgKiBAcGFyYW0gY29tbWFuZFN0YWNrCi0JICogICAgICAgICAgICBhIGNvbW1hbmQgc3RhY2sKLQkgKiBAcGFyYW0gcmVzb3VyY2VTZXQKLQkgKiAgICAgICAgICAgIGEgcmVzb3VyY2Ugc2V0Ci0JICovCi0JcHVibGljIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjb21tYW5kU3RhY2ssIHJlc291cmNlU2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIGNvbnRhaW5pbmcgdGhlIGNvcGllZCBlbGVtZW50cyBtYXBwZWQgdG8gdGhlaXIgb3JpZ2luYWwKLQkgKiBjb3VudGVycGFydHMuCi0JICogCi0JICogQHJldHVybiBhIG1hcCBjb250YWluaW5nIHRoZSBjb3BpZWQgZWxlbWVudHMgbWFwcGVkIHRvIHRoZWlyIG9yaWdpbmFsCi0JICogICAgICAgICBjb3VudGVycGFydHMKLQkgKi8KLQlwdWJsaWMgTWFwIGdldENvcHlUb09yaWdpbmFsTWFwKCkgewotCQlpZiAoY29weVRvT3JpZ2luYWxNYXAgPT0gbnVsbCkgewotCQkJY29weVRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXJldHVybiBjb3B5VG9PcmlnaW5hbE1hcDsKLQl9Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJucyBhIG1hcCBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBlbGVtZW50cyBtYXBwZWQgdG8gdGhlaXIgY29waWVkIAotCSAqIGNvdW50ZXJwYXJ0cyBvbiBjbGlwYm9hcmQKLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIGVsZW1lbnRzIG1hcHBlZCB0byB0aGVpciBjb3BpZWQgCi0JICogICAgICAgICBjb3VudGVycGFydHMKLQkgKi8KLQlwdWJsaWMgTWFwIGdldE9yaWdpbmFsVG9DbGlwYm9hcmRNYXAoKSB7Ci0JCWlmIChvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwID09IG51bGwpIHsKLQkJCW9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXJldHVybiBvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwOwotCX0KLQotCS8qKgotCSAqIFVzZWQgYnkgdGhlIENyZWF0ZUNvcHlDb21tYW5kLiBBZGRzIGluZm9tYXRpb24gdG8gY29uc3RydWN0IG1hcHMgdGhhdAotCSAqIGtlZXAgdHJhY2sgb2YgdGhlIG9yaWdpbmFsIG1ldGhvZCBlbGVtZW50cyBhbmQgdGhlaXIgY29waWVzLgotCSAqIAotCSAqIEBwYXJhbSBjCi0JICogICAgICAgICAgICBhIGNvbGxlY3Rpb24gdG8gc3RvcmUgdGhlIG1hcHBpbmcgaW5mbwotCSAqIEBwYXJhbSBjb3B5SGVscGVyCi0JICogICAgICAgICAgICBhIGhlbHBlciBjbGFzcyB0aGF0IGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBjb3BpZWQgb2JqZWN0cwotCSAqICAgICAgICAgICAgYW5kIHRoZWlyIGFzc29jaWF0ZWQgY29waWVzCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29weUluZm8oQ29sbGVjdGlvbiBjLCBIZWxwZXIgY29weUhlbHBlcikgewotCQlpZiAoaXNOZXdDb3B5KGMsIGNvcHlIZWxwZXIpKSB7Ci0JCQlhZGROZXdDb3B5KGMsIGNvcHlIZWxwZXIpOwotCQkJcmV0dXJuOwotCQl9IGVsc2UgewotCQkJY2hhaW5Db3B5KGMsIGNvcHlIZWxwZXIpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG5ldyBlbGVtZW50IHRoYXQgaXMgYmVpbmcgY29waWVkIHRvIHRoZSBjbGlwYm9hcmQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE5ld0NvcHkoQ29sbGVjdGlvbiBjLCBIZWxwZXIgY29weUhlbHBlcikgewotCQkvLyB0aGlzIG1lYW5zIHdlIGFyZSBjb3B5aW5nIHRoZSBDb2xsZWN0aW9uIGMgdG8gdGhlIGNsaXBib2FyZAotCQlpZiAob3JpZ2luYWxUb0NsaXBib2FyZE1hcCA9PSBudWxsKQotCQkJb3JpZ2luYWxUb0NsaXBib2FyZE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBjb3B5SGVscGVyLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGtleSA9IGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IHZhbHVlID0gY29weUhlbHBlci5nZXQoa2V5KTsKLQkJCW9yaWdpbmFsVG9DbGlwYm9hcmRNYXAucHV0KGtleSwgdmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG1hcCBmcm9tIHRoZSBjb3BpZWQgZWxlbWVudHMgdG8gdGhlaXIgb3JpZ2luYWwgY291bnRlcnBhcnRzLgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFpbkNvcHkoQ29sbGVjdGlvbiBjLCBIZWxwZXIgY29weUhlbHBlcikgewotCQkvLyBjaGFpbiB0aGUgbWFwcyAtIGNoYW5nZSB0aGUgY29weVRvT3JpZ2luYWxNYXAKLQkJaWYgKG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgIT0gbnVsbCkgewotCQkJaWYgKGNvcHlUb09yaWdpbmFsTWFwID09IG51bGwpCi0JCQkJY29weVRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJSXRlcmF0b3IgaXRlciA9IG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvMkNLZXkgPSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3QgbzJDVmFsdWUgPSBvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwLmdldChvMkNLZXkpOwotCQkJCU9iamVjdCBjb3B5VmFsdWUgPSBjb3B5SGVscGVyLmdldChvMkNWYWx1ZSk7Ci0JCQkJaWYgKGNvcHlWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCS8vIGVycm9yCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAobzJDS2V5IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkKLQkJCQkJY29weVRvT3JpZ2luYWxNYXAucHV0KGNvcHlWYWx1ZSwgbzJDS2V5KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc05ld0NvcHkoQ29sbGVjdGlvbiBjLCBIZWxwZXIgY29weUhlbHBlcikgewotCQkvLyBvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwIHdhcyBzZXQgdG8gbnVsbCBhdCBzdGFydCBvZiBjb3B5IGNvbW1hbmQKLQkJaWYgKG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vIGl0ZXJhdGUgdGhyb3VnaCBjb3B5SGVscGVyIG1hcCwgc2VlIGlmIGFueSBjb3B5SGVscGVyIGtleXMgYXJlIG8yQwotCQkvLyB2YWx1ZXMsIHdoaWNoIG1lYW5zIHdlIGFyZSBjb3B5aW5nIGNsaXBib2FyZAotCQlJdGVyYXRvciBpdGVyID0gY29weUhlbHBlci5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBjbGlwS2V5ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIW9yaWdpbmFsVG9DbGlwYm9hcmRNYXAuY29udGFpbnNWYWx1ZShjbGlwS2V5KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgY29weSBtYXBzLiBJdCBzaG91bGQgYmUgY2FsbGVkIHdpdGhpbiB0aGUgY29weSBhY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXRDb3B5TWFwcygpIHsKLQkJaWYgKG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgIT0gbnVsbCkgewotCQkJb3JpZ2luYWxUb0NsaXBib2FyZE1hcC5jbGVhcigpOwotCQkJb3JpZ2luYWxUb0NsaXBib2FyZE1hcCA9IG51bGw7Ci0JCX0KLQkJaWYgKGNvcHlUb09yaWdpbmFsTWFwICE9IG51bGwpIHsKLQkJCWNvcHlUb09yaWdpbmFsTWFwLmNsZWFyKCk7Ci0JCQljb3B5VG9PcmlnaW5hbE1hcCA9IG51bGw7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvZG9tYWluL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvZG9tYWluL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI5ZWE3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2RvbWFpbi9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgZGVmYXVsdCBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIFVNQSBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWMxNTlhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUHVycG9zZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQWx0ZXJuYXRpdmVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRIb3d0b1N0YWZmUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQdXJwb3NlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHVycG9zZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSIsICJfVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFsdGVybmF0aXZlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFsdGVybmF0aXZlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUiLCAiX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEhvd3RvIFN0YWZmIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSG93dG9TdGFmZlByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2hvd3RvU3RhZmZfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2hvd3RvU3RhZmZfZmVhdHVyZSIsICJfVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBBY3Rpdml0eURlc2NyaXB0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0FjdGl2aXR5RGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQWN0aXZpdHlEZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBY3Rpdml0eURlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGI1Y2Q4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHl9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFZhcmlhYmlsaXR5VHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQnJlYWtkb3duRWxlbWVudHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJvYWRtYXBzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDaGVja2xpc3RzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDb25jZXB0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRXhhbXBsZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEd1aWRlbGluZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJldXNhYmxlQXNzZXRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRJc0VuYWN0YWJsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFyaWFiaWxpdHkgVHlwZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZhcmlhYmlsaXR5VHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5VHlwZV9mZWF0dXJlIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRfZmVhdHVyZSIsICJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDaGVja2xpc3RzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hlY2tsaXN0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eV9jaGVja2xpc3RzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQWN0aXZpdHlfY2hlY2tsaXN0c19mZWF0dXJlIiwgIl9VSV9BY3Rpdml0eV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX19DSEVDS0xJU1RTLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbmNlcHRzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29uY2VwdHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlfY29uY2VwdHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BY3Rpdml0eV9jb25jZXB0c19mZWF0dXJlIiwgIl9VSV9BY3Rpdml0eV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX19DT05DRVBUUywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFeGFtcGxlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4YW1wbGVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0FjdGl2aXR5X2V4YW1wbGVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQWN0aXZpdHlfZXhhbXBsZXNfZmVhdHVyZSIsICJfVUlfQWN0aXZpdHlfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fRVhBTVBMRVMsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgR3VpZGVsaW5lcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEd1aWRlbGluZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlfZ3VpZGVsaW5lc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FjdGl2aXR5X2d1aWRlbGluZXNfZmVhdHVyZSIsICJfVUlfQWN0aXZpdHlfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fR1VJREVMSU5FUywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZXVzYWJsZSBBc3NldHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXVzYWJsZUFzc2V0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eV9yZXVzYWJsZUFzc2V0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FjdGl2aXR5X3JldXNhYmxlQXNzZXRzX2ZlYXR1cmUiLCAiX1VJX0FjdGl2aXR5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJcyBFbmFjdGFibGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc0VuYWN0YWJsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eV9pc0VuYWN0YWJsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FjdGl2aXR5X2lzRW5hY3RhYmxlX2ZlYXR1cmUiLCAiX1VJX0FjdGl2aXR5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX0lTX0VOQUNUQUJMRSwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTik7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJyZWFrZG93bkVsZW1lbnRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0FjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfZmVhdHVyZSIsICJfVUlfQWN0aXZpdHlfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJvYWRtYXBzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUm9hZG1hcHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlfcm9hZG1hcHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BY3Rpdml0eV9yb2FkbWFwc19mZWF0dXJlIiwgIl9VSV9BY3Rpdml0eV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX19ST0FETUFQUywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdXBwb3J0aW5nIE1hdGVyaWFscyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1cHBvcnRpbmdNYXRlcmlhbHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FjdGl2aXR5X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSIsICJfVUlfQWN0aXZpdHlfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQWN0aXZpdHkuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQWN0aXZpdHkiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQWN0aXZpdHkpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0FjdGl2aXR5X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBY3Rpdml0eS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0lTX0VOQUNUQUJMRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OOgotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT046Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTgotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTJlNDc0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BcnRpZmFjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlXb3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEJyaWVmT3V0bGluZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmVwcmVzZW50YXRpb25PcHRpb25zUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBCcmllZiBPdXRsaW5lIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQnJpZWZPdXRsaW5lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fYnJpZWZPdXRsaW5lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9icmllZk91dGxpbmVfZmVhdHVyZSIsICJfVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlcHJlc2VudGF0aW9uIE9wdGlvbnMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXByZXNlbnRhdGlvbk9wdGlvbnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9yZXByZXNlbnRhdGlvbk9wdGlvbnNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3JlcHJlc2VudGF0aW9uT3B0aW9uc19mZWF0dXJlIiwgIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9BcnRpZmFjdERlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEFydGlmYWN0RGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQXJ0aWZhY3REZXNjcmlwdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FOgotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FydGlmYWN0SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BcnRpZmFjdEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3Mzg5ZmE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FydGlmYWN0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFydGlmYWN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEFydGlmYWN0LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0FydGlmYWN0IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEFydGlmYWN0KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0FydGlmYWN0X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9BcnRpZmFjdF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQXJ0aWZhY3QuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcnRpZmFjdCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjBhNzgyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFVzYWdlR3VpZGFuY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFVzYWdlIEd1aWRhbmNlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVXNhZ2VHdWlkYW5jZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdXNhZ2VHdWlkYW5jZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl91c2FnZUd1aWRhbmNlX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVlYTBmMWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIFByb2Nlc3NFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFByZWZpeFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSXNQbGFubmVkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRIYXNNdWx0aXBsZU9jY3VycmVuY2VzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRJc09wdGlvbmFsUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQcmVzZW50ZWRBZnRlclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUHJlc2VudGVkQmVmb3JlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTdXBlckFjdGl2aXRpZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFByZWZpeCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFByZWZpeFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X3ByZWZpeF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlZml4X2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElzIFBsYW5uZWQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc1BsYW5uZWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9pc1BsYW5uZWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X2lzUGxhbm5lZF9mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSGFzIE11bHRpcGxlIE9jY3VycmVuY2VzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSGFzTXVsdGlwbGVPY2N1cnJlbmNlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X2hhc011bHRpcGxlT2NjdXJyZW5jZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X2hhc011bHRpcGxlT2NjdXJyZW5jZXNfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgT3B0aW9uYWwgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc09wdGlvbmFsUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNPcHRpb25hbF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNPcHRpb25hbF9mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFByZXNlbnRlZCBBZnRlciBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFByZXNlbnRlZEFmdGVyUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQWZ0ZXJfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEFmdGVyX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFByZXNlbnRlZCBCZWZvcmUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcmVzZW50ZWRCZWZvcmVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRCZWZvcmVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3ByZXNlbnRlZEJlZm9yZV9mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3VwZXIgQWN0aXZpdGllcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1cGVyQWN0aXZpdGllc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X3N1cGVyQWN0aXZpdGllc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfc3VwZXJBY3Rpdml0aWVzX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQnJlYWtkb3duRWxlbWVudC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9CcmVha2Rvd25FbGVtZW50IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEJyZWFrZG93bkVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQnJlYWtkb3duRWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg6Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDoKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM6Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGxhbm5pbmdEYXRhKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDAxYmQ2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciBleHRlbmRzIFByb2Nlc3NJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENhcGFiaWxpdHlQYXR0ZXJuLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJuIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENhcGFiaWxpdHlQYXR0ZXJuKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0NhcGFiaWxpdHlQYXR0ZXJuX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9DYXBhYmlsaXR5UGF0dGVybl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTgotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NoZWNrbGlzdEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2hlY2tsaXN0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVlMzM5MjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2hlY2tsaXN0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGVja2xpc3RJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENoZWNrbGlzdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENoZWNrbGlzdC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9DaGVja2xpc3QiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ2hlY2tsaXN0KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0NoZWNrbGlzdF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ2hlY2tsaXN0X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DbGFzc2lmaWVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DbGFzc2lmaWVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM0ZGNhNTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2xhc3NpZmllckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc2lmaWVySXRlbVByb3ZpZGVyIGV4dGVuZHMgVHlwZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENsYXNzaWZpZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDbGFzc2lmaWVyLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0NsYXNzaWZpZXIiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ2xhc3NpZmllcikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9DbGFzc2lmaWVyX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9DbGFzc2lmaWVyX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVjMzJmMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyIGV4dGVuZHMgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQWdncmVnYXRlZFJvbGVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBZ2dyZWdhdGVkIFJvbGVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWdncmVnYXRlZFJvbGVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NvbXBvc2l0ZVJvbGVfYWdncmVnYXRlZFJvbGVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29tcG9zaXRlUm9sZV9hZ2dyZWdhdGVkUm9sZXNfZmVhdHVyZSIsICJfVUlfQ29tcG9zaXRlUm9sZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvbXBvc2l0ZVJvbGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQ29tcG9zaXRlUm9sZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDb21wb3NpdGVSb2xlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0NvbXBvc2l0ZVJvbGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0NvbXBvc2l0ZVJvbGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbmNlcHRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbmNlcHRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2MxODQyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db25jZXB0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbmNlcHRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbmNlcHRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDb25jZXB0LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0NvbmNlcHQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ29uY2VwdCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Db25jZXB0X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Db25jZXB0X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db25zdHJhaW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db25zdHJhaW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkZTQ2YzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zdHJhaW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRCb2R5UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBCb2R5IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQm9keVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db25zdHJhaW50X2JvZHlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25zdHJhaW50X2JvZHlfZmVhdHVyZSIsICJfVUlfQ29uc3RyYWludF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlNUUkFJTlRfX0JPRFksIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ29uc3RyYWludC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Db25zdHJhaW50IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvbnN0cmFpbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ29uc3RyYWludF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ29uc3RyYWludF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ29uc3RyYWludC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX0JPRFk6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3M2YzOGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50RWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvbnRlbnRDYXRlZ29yeS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Db250ZW50Q2F0ZWdvcnkiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ29udGVudENhdGVnb3J5KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0NvbnRlbnRDYXRlZ29yeV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudENhdGVnb3J5X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDZmZTNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZFVuaXRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRNYWluRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEtleUNvbnNpZGVyYXRpb25zUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBNYWluIERlc2NyaXB0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWFpbkRlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9tYWluRGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RGVzY3JpcHRpb25fbWFpbkRlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX0NvbnRlbnREZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgS2V5IENvbnNpZGVyYXRpb25zIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkS2V5Q29uc2lkZXJhdGlvbnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudERlc2NyaXB0aW9uX2tleUNvbnNpZGVyYXRpb25zX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29udGVudERlc2NyaXB0aW9uX2tleUNvbnNpZGVyYXRpb25zX2ZlYXR1cmUiLCAiX1VJX0NvbnRlbnREZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ29udGVudERlc2NyaXB0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0NvbnRlbnREZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDb250ZW50RGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VjdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTdGVwKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50RWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzBkMDk2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50RWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgRGVzY3JpYmFibGVFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudEVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRWYXJpYWJpbGl0eVR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFN1cHBvcnRpbmdNYXRlcmlhbHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENvbmNlcHRzQW5kUGFwZXJzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDaGVja2xpc3RzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRHdWlkZWxpbmVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFeGFtcGxlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQXNzZXRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFyaWFiaWxpdHlUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eVR5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUiLCAiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudF9mZWF0dXJlIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbmNlcHRzIEFuZCBQYXBlcnMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb25jZXB0c0FuZFBhcGVyc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RWxlbWVudF9jb25jZXB0c0FuZFBhcGVyc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbnRlbnRFbGVtZW50X2NvbmNlcHRzQW5kUGFwZXJzX2ZlYXR1cmUiLCAiX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENoZWNrbGlzdHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGVja2xpc3RzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnRFbGVtZW50X2NoZWNrbGlzdHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RWxlbWVudF9jaGVja2xpc3RzX2ZlYXR1cmUiLCAiX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEd1aWRlbGluZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRHdWlkZWxpbmVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnRFbGVtZW50X2d1aWRlbGluZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RWxlbWVudF9ndWlkZWxpbmVzX2ZlYXR1cmUiLCAiX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEV4YW1wbGVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXhhbXBsZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudEVsZW1lbnRfZXhhbXBsZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RWxlbWVudF9leGFtcGxlc19mZWF0dXJlIiwgIl9VSV9Db250ZW50RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRVMsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXNzZXRzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXNzZXRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnRFbGVtZW50X2Fzc2V0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbnRlbnRFbGVtZW50X2Fzc2V0c19mZWF0dXJlIiwgIl9VSV9Db250ZW50RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fQVNTRVRTLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFN1cHBvcnRpbmcgTWF0ZXJpYWxzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3VwcG9ydGluZ01hdGVyaWFsc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RWxlbWVudF9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29udGVudEVsZW1lbnRfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlIiwgIl9VSV9Db250ZW50RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ29udGVudEVsZW1lbnQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQ29udGVudEVsZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ29udGVudEVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ29udGVudEVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDb250ZW50RWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRkYzI1NzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZFBhY2thZ2VJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ29udGVudFBhY2thZ2UuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQ29udGVudFBhY2thZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ29udGVudFBhY2thZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ29udGVudFBhY2thZ2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnRQYWNrYWdlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDb250ZW50UGFja2FnZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFzaygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXJ0aWZhY3QoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJhYmxlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVPdXRjb21lKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25jZXB0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDaGVja2xpc3QoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUV4YW1wbGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUd1aWRlbGluZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVwb3J0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZW1wbGF0ZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUb29sTWVudG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXaGl0ZXBhcGVyKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZXJtRGVmaW5pdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJhY3RpY2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmV1c2FibGVBc3NldCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzY2lwbGluZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZVNldCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRG9tYWluKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdFR5cGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVG9vbCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZVNldEdyb3VwaW5nKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDdXN0b21DYXRlZ29yeSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9hZG1hcCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxNDllMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEVsZW1lbnQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUiLCAiX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmE3ODZlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnl9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRDYXRlZ29yaXplZEVsZW1lbnRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTdWJDYXRlZ29yaWVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDYXRlZ29yaXplZCBFbGVtZW50cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENhdGVnb3JpemVkRWxlbWVudHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tQ2F0ZWdvcnlfY2F0ZWdvcml6ZWRFbGVtZW50c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0N1c3RvbUNhdGVnb3J5X2NhdGVnb3JpemVkRWxlbWVudHNfZmVhdHVyZSIsICJfVUlfQ3VzdG9tQ2F0ZWdvcnlfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlRTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFN1YiBDYXRlZ29yaWVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3ViQ2F0ZWdvcmllc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9DdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19mZWF0dXJlIiwgIl9VSV9DdXN0b21DYXRlZ29yeV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JJRVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ3VzdG9tQ2F0ZWdvcnkuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQ3VzdG9tQ2F0ZWdvcnkiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tQ2F0ZWdvcnlfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0N1c3RvbUNhdGVnb3J5X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwOTRmNTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcmFibGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJV29ya1Byb2R1Y3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRFeHRlcm5hbERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQYWNrYWdpbmdHdWlkYW5jZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXh0ZXJuYWwgRGVzY3JpcHRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeHRlcm5hbERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fZXh0ZXJuYWxEZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fZXh0ZXJuYWxEZXNjcmlwdGlvbl9mZWF0dXJlIiwgIl9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBhY2thZ2luZyBHdWlkYW5jZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhY2thZ2luZ0d1aWRhbmNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fcGFja2FnaW5nR3VpZGFuY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3BhY2thZ2luZ0d1aWRhbmNlX2ZlYXR1cmUiLCAiX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGVsaXZlcmFibGVEZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEZWxpdmVyYWJsZURlc2NyaXB0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZWxpdmVyYWJsZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcmFibGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTZlNGQwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZWxpdmVyYWJsZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyIGV4dGVuZHMgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZERlbGl2ZXJlZFdvcmtQcm9kdWN0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVsaXZlcmVkIFdvcmsgUHJvZHVjdHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWxpdmVyZWRXb3JrUHJvZHVjdHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcmFibGVfZGVsaXZlcmVkV29ya1Byb2R1Y3RzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVsaXZlcmFibGVfZGVsaXZlcmVkV29ya1Byb2R1Y3RzX2ZlYXR1cmUiLCAiX1VJX0RlbGl2ZXJhYmxlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1RTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERlbGl2ZXJhYmxlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0RlbGl2ZXJhYmxlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERlbGl2ZXJhYmxlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0RlbGl2ZXJhYmxlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9EZWxpdmVyYWJsZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhZDA3YjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkU2NhbGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFByb2plY3RDaGFyYWN0ZXJpc3RpY3NQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJpc2tMZXZlbFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRXN0aW1hdGluZ1RlY2huaXF1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUHJvamVjdE1lbWJlckV4cGVydGlzZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVHlwZU9mQ29udHJhY3RQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNjYWxlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2NhbGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fc2NhbGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9zY2FsZV9mZWF0dXJlIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFByb2plY3QgQ2hhcmFjdGVyaXN0aWNzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvamVjdENoYXJhY3RlcmlzdGljc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdENoYXJhY3RlcmlzdGljc19mZWF0dXJlIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJpc2sgTGV2ZWwgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSaXNrTGV2ZWxQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcmlza0xldmVsX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcmlza0xldmVsX2ZlYXR1cmUiLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTCwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFc3RpbWF0aW5nIFRlY2huaXF1ZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVzdGltYXRpbmdUZWNobmlxdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fZXN0aW1hdGluZ1RlY2huaXF1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX2VzdGltYXRpbmdUZWNobmlxdWVfZmVhdHVyZSIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcm9qZWN0IE1lbWJlciBFeHBlcnRpc2UgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RNZW1iZXJFeHBlcnRpc2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlX2ZlYXR1cmUiLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFR5cGUgT2YgQ29udHJhY3QgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlT2ZDb250cmFjdFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlT2ZDb250cmFjdF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGVPZkNvbnRyYWN0X2ZlYXR1cmUiLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVCwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEU6Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUzoKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUw6Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRToKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1Q6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA1MjRiZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQcm9jZXNzSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRWR1Y2F0aW9uTWF0ZXJpYWxzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDb21tdW5pY2F0aW9uc01hdGVyaWFsc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRWR1Y2F0aW9uIE1hdGVyaWFscyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVkdWNhdGlvbk1hdGVyaWFsc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3NfZWR1Y2F0aW9uTWF0ZXJpYWxzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVsaXZlcnlQcm9jZXNzX2VkdWNhdGlvbk1hdGVyaWFsc19mZWF0dXJlIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUxTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbW11bmljYXRpb25zIE1hdGVyaWFscyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbW11bmljYXRpb25zTWF0ZXJpYWxzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc19jb21tdW5pY2F0aW9uc01hdGVyaWFsc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc19jb21tdW5pY2F0aW9uc01hdGVyaWFsc19mZWF0dXJlIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGVsaXZlcnlQcm9jZXNzLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2VzcyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEZWxpdmVyeVByb2Nlc3MpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3NfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04KLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rlc2NyaWJhYmxlRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMTUwYjhiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rlc2NyaWJhYmxlRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaWJhYmxlRWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRQcmVzZW50YXRpb25OYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTaGFwZWljb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZE5vZGVpY29uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcmVzZW50YXRpb24gTmFtZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFByZXNlbnRhdGlvbk5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbk5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uTmFtZV9mZWF0dXJlIiwgIl9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTaGFwZWljb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTaGFwZWljb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVzY3JpYmFibGVFbGVtZW50X3NoYXBlaWNvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9zaGFwZWljb25fZmVhdHVyZSIsICJfVUlfRGVzY3JpYmFibGVFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5vZGVpY29uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9kZWljb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVzY3JpYmFibGVFbGVtZW50X25vZGVpY29uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVzY3JpYmFibGVFbGVtZW50X25vZGVpY29uX2ZlYXR1cmUiLCAiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGVzY3JpYmFibGVFbGVtZW50LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0Rlc2NyaWJhYmxlRWxlbWVudCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGVzY3JpYmFibGVFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOgotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT046Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza0Rlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVzY3JpcHRvckRlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGI2YmRiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFJlZmluZWREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVmaW5lZCBEZXNjcmlwdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlZmluZWREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fcmVmaW5lZERlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3JlZmluZWREZXNjcmlwdGlvbl9mZWF0dXJlIiwgIl9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERlc2NyaXB0b3JEZXNjcmlwdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9EZXNjcmlwdG9yRGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGVzY3JpcHRvckRlc2NyaXB0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEZXNjcmlwdG9yRGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ3NTJjYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElzU3luY2hyb25pemVkV2l0aFNvdXJjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EZXNjcmlwdG9yX2lzU3luY2hyb25pemVkV2l0aFNvdXJjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Rlc2NyaXB0b3JfaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlX2ZlYXR1cmUiLCAiX1VJX0Rlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGVzY3JpcHRvci5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9EZXNjcmlwdG9yIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERlc2NyaXB0b3IpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGVzY3JpcHRvcl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGVzY3JpcHRvcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGVzY3JpcHRvci5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RpYWdyYW1FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJlYjM1YTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJc1Zpc2libGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlZmVyZW5jZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgVmlzaWJsZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElzVmlzaWJsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaWFncmFtRWxlbWVudF9pc1Zpc2libGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaWFncmFtRWxlbWVudF9pc1Zpc2libGVfZmVhdHVyZSIsICJfVUlfRGlhZ3JhbUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEUsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVmZXJlbmNlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVmZXJlbmNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1FbGVtZW50X3JlZmVyZW5jZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RpYWdyYW1FbGVtZW50X3JlZmVyZW5jZV9mZWF0dXJlIiwgIl9VSV9EaWFncmFtRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGlhZ3JhbUVsZW1lbnQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGlhZ3JhbUVsZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGlhZ3JhbUVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbUVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1FbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaWFncmFtRWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFksCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHkoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RpYWdyYW1JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RpYWdyYW1JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmE3MTEwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW19IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1JdGVtUHJvdmlkZXIgZXh0ZW5kcyBHcmFwaE5vZGVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkWm9vbVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRGlhZ3JhbUxpbmtQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFpvb20gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRab29tUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1fem9vbV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RpYWdyYW1fem9vbV9mZWF0dXJlIiwgIl9VSV9EaWFncmFtX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9fWk9PTSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERpYWdyYW0gTGluayBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERpYWdyYW1MaW5rUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1fZGlhZ3JhbUxpbmtfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaWFncmFtX2RpYWdyYW1MaW5rX2ZlYXR1cmUiLCAiX1VJX0RpYWdyYW1fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19ESUFHUkFNX0xJTkssIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fX1ZJRVdQT0lOVCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fX05BTUVTUEFDRSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERpYWdyYW0uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGlhZ3JhbSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEaWFncmFtKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0RpYWdyYW1fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERpYWdyYW0uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19aT09NOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX1ZJRVdQT0lOVDoKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX05BTUVTUEFDRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19WSUVXUE9JTlQsIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlUG9pbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9fTkFNRVNQQUNFLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fX05BTUVTUEFDRSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fX05BTUVTUEFDRSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVECi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fUE9TSVRJT04KLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19WSUVXUE9JTlQKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19MSU5LCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19OQU1FU1BBQ0U7Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtTGlua0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlhZ3JhbUxpbmtJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmZlZjdlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtTGlua0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTGlua0l0ZW1Qcm92aWRlciBleHRlbmRzIERpYWdyYW1FbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUxpbmtJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRab29tUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGREaWFncmFtUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBab29tIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkWm9vbVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaWFncmFtTGlua196b29tX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlhZ3JhbUxpbmtfem9vbV9mZWF0dXJlIiwgIl9VSV9EaWFncmFtTGlua190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fTElOS19fWk9PTSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEaWFncmFtIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGlhZ3JhbVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaWFncmFtTGlua19kaWFncmFtX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlhZ3JhbUxpbmtfZGlhZ3JhbV9mZWF0dXJlIiwgIl9VSV9EaWFncmFtTGlua190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fTElOS19fRElBR1JBTSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9MSU5LX19WSUVXUE9SVCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERpYWdyYW1MaW5rLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0RpYWdyYW1MaW5rIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERpYWdyYW1MaW5rKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0RpYWdyYW1MaW5rX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9EaWFncmFtTGlua190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGlhZ3JhbUxpbmsuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1pPT006Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19WSUVXUE9SVDoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0xJTktfX1ZJRVdQT1JULAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvaW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaW1lbnNpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RpbWVuc2lvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YTM3ZTQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RpbWVuc2lvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaW1lbnNpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGltZW5zaW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkV2lkdGhQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEhlaWdodFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV2lkdGggZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXaWR0aFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaW1lbnNpb25fd2lkdGhfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaW1lbnNpb25fd2lkdGhfZmVhdHVyZSIsICJfVUlfRGltZW5zaW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElNRU5TSU9OX19XSURUSCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBIZWlnaHQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIZWlnaHRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGltZW5zaW9uX2hlaWdodF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RpbWVuc2lvbl9oZWlnaHRfZmVhdHVyZSIsICJfVUlfRGltZW5zaW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElNRU5TSU9OX19IRUlHSFQsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGltZW5zaW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0RpbWVuc2lvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJRG91YmxlIGxhYmVsVmFsdWUgPSAoKERpbWVuc2lvbikgb2JqZWN0KS5nZXRXaWR0aCgpOwotCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGltZW5zaW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9EaW1lbnNpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERpbWVuc2lvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTl9fV0lEVEg6Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT05fX0hFSUdIVDoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDc5MWUzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmd9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZERpc2NpcGxpbmVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEaXNjaXBsaW5lcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERpc2NpcGxpbmVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVHcm91cGluZ19kaXNjaXBsaW5lc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Rpc2NpcGxpbmVHcm91cGluZ19kaXNjaXBsaW5lc19mZWF0dXJlIiwgIl9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEaXNjaXBsaW5lR3JvdXBpbmcuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGlzY2lwbGluZUdyb3VwaW5nIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERpc2NpcGxpbmVHcm91cGluZykgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVHcm91cGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzM2Q5ZmUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFRhc2tzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSZWZlcmVuY2VXb3JrZmxvd3NQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRhc2tzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFza3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZV90YXNrc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Rpc2NpcGxpbmVfdGFza3NfZmVhdHVyZSIsICJfVUlfRGlzY2lwbGluZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfX1RBU0tTLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlZmVyZW5jZSBXb3JrZmxvd3MgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWZlcmVuY2VXb3JrZmxvd3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZV9yZWZlcmVuY2VXb3JrZmxvd3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaXNjaXBsaW5lX3JlZmVyZW5jZVdvcmtmbG93c19mZWF0dXJlIiwgIl9VSV9EaXNjaXBsaW5lX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9fU1VCRElTQ0lQTElORSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERpc2NpcGxpbmUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGlzY2lwbGluZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEaXNjaXBsaW5lKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERpc2NpcGxpbmUuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfX1NVQkRJU0NJUExJTkUsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzY2lwbGluZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRG9tYWluSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Eb21haW5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjIyNDA1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Eb21haW5JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG9tYWluSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkV29ya1Byb2R1Y3RzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXb3JrIFByb2R1Y3RzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV29ya1Byb2R1Y3RzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RvbWFpbl93b3JrUHJvZHVjdHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Eb21haW5fd29ya1Byb2R1Y3RzX2ZlYXR1cmUiLCAiX1VJX0RvbWFpbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRPTUFJTl9fV09SS19QUk9EVUNUUywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9NQUlOX19TVUJET01BSU5TKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRG9tYWluLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0RvbWFpbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEb21haW4pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRG9tYWluX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Eb21haW5fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERvbWFpbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ET01BSU5fX1NVQkRPTUFJTlMsIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlRG9tYWluKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjNzA0MDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRWxlbWVudC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9FbGVtZW50IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfRWxlbWVudF90eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9FbGxpcHNlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9FbGxpcHNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjNjQ5NWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRWxsaXBzZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWxsaXBzZUl0ZW1Qcm92aWRlciBleHRlbmRzIEdyYXBoaWNQcmltaXRpdmVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbGxpcHNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUmFkaXVzWFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmFkaXVzWVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUm90YXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFN0YXJ0QW5nbGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEVuZEFuZ2xlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSYWRpdXMgWCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJhZGl1c1hQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRWxsaXBzZV9yYWRpdXNYX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWxsaXBzZV9yYWRpdXNYX2ZlYXR1cmUiLCAiX1VJX0VsbGlwc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFX19SQURJVVNfWCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSYWRpdXMgWSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJhZGl1c1lQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRWxsaXBzZV9yYWRpdXNZX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWxsaXBzZV9yYWRpdXNZX2ZlYXR1cmUiLCAiX1VJX0VsbGlwc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFX19SQURJVVNfWSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSb3RhdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJvdGF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0VsbGlwc2Vfcm90YXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FbGxpcHNlX3JvdGF0aW9uX2ZlYXR1cmUiLCAiX1VJX0VsbGlwc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFX19ST1RBVElPTiwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdGFydCBBbmdsZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN0YXJ0QW5nbGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRWxsaXBzZV9zdGFydEFuZ2xlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWxsaXBzZV9zdGFydEFuZ2xlX2ZlYXR1cmUiLCAiX1VJX0VsbGlwc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFX19TVEFSVF9BTkdMRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFbmQgQW5nbGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbmRBbmdsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9FbGxpcHNlX2VuZEFuZ2xlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWxsaXBzZV9lbmRBbmdsZV9mZWF0dXJlIiwgIl9VSV9FbGxpcHNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRUxMSVBTRV9fRU5EX0FOR0xFLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFX19DRU5URVIpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBFbGxpcHNlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0VsbGlwc2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRWxsaXBzZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9FbGxpcHNlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9FbGxpcHNlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChFbGxpcHNlLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUkFESVVTX1g6Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWToKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JPVEFUSU9OOgotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fU1RBUlRfQU5HTEU6Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19FTkRfQU5HTEU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fQ0VOVEVSOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkVMTElQU0VfX0NFTlRFUiwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVQb2ludCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTBkODI5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnN9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlciBleHRlbmRzIEd1aWRhbmNlSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0V4YW1wbGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0V4YW1wbGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODJlZjQ0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9FeGFtcGxlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4YW1wbGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4YW1wbGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBFeGFtcGxlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0V4YW1wbGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRXhhbXBsZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9FeGFtcGxlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9FeGFtcGxlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjY4YjViMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3J9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoQ29ubmVjdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMgR3JhcGhFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRHcmFwaEVkZ2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEdyYXBoIEVkZ2UgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRHcmFwaEVkZ2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFZGdlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFZGdlX2ZlYXR1cmUiLCAiX1VJX0dyYXBoQ29ubmVjdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEdyYXBoQ29ubmVjdG9yLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0dyYXBoQ29ubmVjdG9yIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEdyYXBoQ29ubmVjdG9yKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0dyYXBoQ29ubmVjdG9yX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9HcmFwaENvbm5lY3Rvcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVECi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fTElOSwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhFZGdlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaEVkZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDEyODUyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaEVkZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhFZGdlSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3JhcGhFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhFZGdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQW5jaG9yUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBbmNob3IgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbmNob3JQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfR3JhcGhFZGdlX2FuY2hvcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0dyYXBoRWRnZV9hbmNob3JfZmVhdHVyZSIsICJfVUlfR3JhcGhFZGdlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRURHRV9fQU5DSE9SLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FREdFX19XQVlQT0lOVFMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBHcmFwaEVkZ2UuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvR3JhcGhFZGdlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEdyYXBoRWRnZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9HcmFwaEVkZ2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0dyYXBoRWRnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoR3JhcGhFZGdlLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fV0FZUE9JTlRTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VER0VfX1dBWVBPSU5UUywgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVQb2ludCgpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVECi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fUE9TSVRJT04KLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FREdFX19XQVlQT0lOVFMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19MSU5LCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw7Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZGQ4YmY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaEVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19QT1NJVElPTik7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0xJTkspOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0UpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBHcmFwaEVsZW1lbnQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvR3JhcGhFbGVtZW50IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEdyYXBoRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9HcmFwaEVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0dyYXBoRWxlbWVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoR3JhcGhFbGVtZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fUE9TSVRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19MSU5LOgotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOgotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fUE9TSVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9pbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpYWdyYW1MaW5rKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHcmFwaENvbm5lY3RvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVmZXJlbmNlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9wZXJ0eSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGhFZGdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHcmFwaE5vZGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpYWdyYW0oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGV4dEVsZW1lbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUltYWdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb2x5bGluZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRWxsaXBzZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19MSU5LLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZURpYWdyYW1MaW5rKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRSwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHcmFwaENvbm5lY3RvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFkKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19MSU5LCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw7Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaE5vZGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoTm9kZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MTM2OWI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoTm9kZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhOb2RlSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3JhcGhFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhOb2RlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX05PREVfX1NJWkUpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBHcmFwaE5vZGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvR3JhcGhOb2RlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEdyYXBoTm9kZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9HcmFwaE5vZGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0dyYXBoTm9kZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoR3JhcGhOb2RlLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fU0laRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9OT0RFX19TSVpFLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZURpbWVuc2lvbigpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVECi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fTElOSwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhpY1ByaW1pdGl2ZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhpY1ByaW1pdGl2ZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNDNhNWViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoaWNQcmltaXRpdmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhpY1ByaW1pdGl2ZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhpY1ByaW1pdGl2ZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhpY1ByaW1pdGl2ZUl0ZW1Qcm92aWRlciBleHRlbmRzIExlYWZFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhpY1ByaW1pdGl2ZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEdyYXBoaWNQcmltaXRpdmUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvR3JhcGhpY1ByaW1pdGl2ZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChHcmFwaGljUHJpbWl0aXZlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0dyYXBoaWNQcmltaXRpdmVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0dyYXBoaWNQcmltaXRpdmVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0d1aWRhbmNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0d1aWRhbmNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzdmMGZhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHdWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQXR0YWNobWVudHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEF0dGFjaG1lbnRzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0YWNobWVudHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VEZXNjcmlwdGlvbl9hdHRhY2htZW50c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fYXR0YWNobWVudHNfZmVhdHVyZSIsICJfVUlfR3VpZGFuY2VEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBHdWlkYW5jZURlc2NyaXB0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0d1aWRhbmNlRGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoR3VpZGFuY2VEZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChHdWlkYW5jZURlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlRTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkYW5jZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3VpZGFuY2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2JjMTZlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkYW5jZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEd1aWRhbmNlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0d1aWRhbmNlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEd1aWRhbmNlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0d1aWRhbmNlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9HdWlkYW5jZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3VpZGVsaW5lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkZWxpbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmQ0ZjMzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkZWxpbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRlbGluZUl0ZW1Qcm92aWRlciBleHRlbmRzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3VpZGVsaW5lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgR3VpZGVsaW5lLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0d1aWRlbGluZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChHdWlkZWxpbmUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfR3VpZGVsaW5lX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9HdWlkZWxpbmVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0ltYWdlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9JbWFnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NmU3ODFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0ltYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBMZWFmRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEltYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVXJpUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRNaW1lVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVXJpIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVXJpUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0ltYWdlX3VyaV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0ltYWdlX3VyaV9mZWF0dXJlIiwgIl9VSV9JbWFnZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLklNQUdFX19VUkksIHRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBNaW1lIFR5cGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNaW1lVHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9JbWFnZV9taW1lVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0ltYWdlX21pbWVUeXBlX2ZlYXR1cmUiLCAiX1VJX0ltYWdlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuSU1BR0VfX01JTUVfVFlQRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBJbWFnZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9JbWFnZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChJbWFnZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9JbWFnZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfSW1hZ2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEltYWdlLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuSU1BR0VfX1VSSToKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19NSU1FX1RZUEU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0l0ZXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvSXRlcmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFhMGRiNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvSXRlcmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSXRlcmF0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWN0aXZpdHlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJdGVyYXRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBJdGVyYXRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvSXRlcmF0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEl0ZXJhdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9JdGVyYXRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0l0ZXJhdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTgotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0xlYWZFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9MZWFmRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOGM2YWI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0xlYWZFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkxlYWZFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGVhZkVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExlYWZFbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgTGVhZkVsZW1lbnQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvTGVhZkVsZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTGVhZkVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfTGVhZkVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0xlYWZFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4MjVkZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgTWV0aG9kVW5pdEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRNZXRob2RQbHVnaW5TZWxlY3Rpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZE1ldGhvZFBhY2thZ2VTZWxlY3Rpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFByb2Nlc3NWaWV3c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRGVmYXVsdFZpZXdQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEJhc2VDb25maWd1cmF0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3VidHJhY3RlZENhdGVnb3J5UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRBZGRlZENhdGVnb3J5UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBNZXRob2QgUGx1Z2luIFNlbGVjdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1ldGhvZFBsdWdpblNlbGVjdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBsdWdpblNlbGVjdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fbWV0aG9kUGx1Z2luU2VsZWN0aW9uX2ZlYXR1cmUiLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWV0aG9kUGFja2FnZVNlbGVjdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBhY2thZ2VTZWxlY3Rpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBhY2thZ2VTZWxlY3Rpb25fZmVhdHVyZSIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJvY2VzcyBWaWV3cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFByb2Nlc3NWaWV3c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3Byb2Nlc3NWaWV3c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fcHJvY2Vzc1ZpZXdzX2ZlYXR1cmUiLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZWZhdWx0IFZpZXcgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0Vmlld1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX2RlZmF1bHRWaWV3X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9kZWZhdWx0Vmlld19mZWF0dXJlIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBCYXNlIENvbmZpZ3VyYXRpb25zIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQmFzZUNvbmZpZ3VyYXRpb25zUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fYmFzZUNvbmZpZ3VyYXRpb25zX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9iYXNlQ29uZmlndXJhdGlvbnNfZmVhdHVyZSIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT05TLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFN1YnRyYWN0ZWQgQ2F0ZWdvcnkgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdWJ0cmFjdGVkQ2F0ZWdvcnlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9zdWJ0cmFjdGVkQ2F0ZWdvcnlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3N1YnRyYWN0ZWRDYXRlZ29yeV9mZWF0dXJlIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlksCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQWRkZWQgQ2F0ZWdvcnkgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBZGRlZENhdGVnb3J5UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fYWRkZWRDYXRlZ29yeV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fYWRkZWRDYXRlZ29yeV9mZWF0dXJlIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIE1ldGhvZENvbmZpZ3VyYXRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChNZXRob2RDb25maWd1cmF0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDMwNTM4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRHdWlkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRCcmllZkRlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTdXBwcmVzc2VkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRPcmRlcmluZ0d1aWRlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBHdWlkIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkR3VpZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50X2d1aWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RFbGVtZW50X2d1aWRfZmVhdHVyZSIsICJfVUlfTWV0aG9kRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19HVUlELCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEJyaWVmIERlc2NyaXB0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQnJpZWZEZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50X2JyaWVmRGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RFbGVtZW50X2JyaWVmRGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfTWV0aG9kRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdXBwcmVzc2VkIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3VwcHJlc3NlZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50X3N1cHByZXNzZWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RFbGVtZW50X3N1cHByZXNzZWRfZmVhdHVyZSIsICJfVUlfTWV0aG9kRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VELCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE9yZGVyaW5nIEd1aWRlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JkZXJpbmdHdWlkZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50X29yZGVyaW5nR3VpZGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RFbGVtZW50X29yZGVyaW5nR3VpZGVfZmVhdHVyZSIsICJfVUlfTWV0aG9kRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUyk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNZXRob2RFbGVtZW50LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L01ldGhvZEVsZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXRob2RFbGVtZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0dVSUQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDoKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM6Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0JLy8gU3RhcnQgY3VzdG9tIGNvZGUgLy8KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZEVsZW1lbnRQcm9wZXJ0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNmNiNThkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZEVsZW1lbnRQcm9wZXJ0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudFByb3BlcnR5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJUGFja2FnZWFibGVFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudFByb3BlcnR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZhbHVlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kRWxlbWVudFByb3BlcnR5X3ZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kRWxlbWVudFByb3BlcnR5X3ZhbHVlX2ZlYXR1cmUiLCAiX1VJX01ldGhvZEVsZW1lbnRQcm9wZXJ0eV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNZXRob2RFbGVtZW50UHJvcGVydHkuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvTWV0aG9kRWxlbWVudFByb3BlcnR5IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50UHJvcGVydHlfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX01ldGhvZEVsZW1lbnRQcm9wZXJ0eV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kRWxlbWVudFByb3BlcnR5LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE4OTUzMzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnl9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RVbml0SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgTWV0aG9kTGlicmFyeS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE1ldGhvZExpYnJhcnkpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfTWV0aG9kTGlicmFyeV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kTGlicmFyeV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kTGlicmFyeS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUzoKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RQbHVnaW4oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzRmFtaWx5KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwMjJkMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGFja2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkR2xvYmFsUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSZXVzZWRQYWNrYWdlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgR2xvYmFsIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkR2xvYmFsUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFBhY2thZ2VfZ2xvYmFsX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kUGFja2FnZV9nbG9iYWxfZmVhdHVyZSIsICJfVUlfTWV0aG9kUGFja2FnZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFX19HTE9CQUwsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmV1c2VkIFBhY2thZ2VzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmV1c2VkUGFja2FnZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGFja2FnZV9yZXVzZWRQYWNrYWdlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFBhY2thZ2VfcmV1c2VkUGFja2FnZXNfZmVhdHVyZSIsICJfVUlfTWV0aG9kUGFja2FnZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNZXRob2RQYWNrYWdlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L01ldGhvZFBhY2thZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTWV0aG9kUGFja2FnZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9NZXRob2RQYWNrYWdlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RQYWNrYWdlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXRob2RQYWNrYWdlLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDk5NjAxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2lufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RVbml0SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVXNlckNoYW5nZWFibGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEJhc2VzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBVc2VyIENoYW5nZWFibGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRVc2VyQ2hhbmdlYWJsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RQbHVnaW5fdXNlckNoYW5nZWFibGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RQbHVnaW5fdXNlckNoYW5nZWFibGVfZmVhdHVyZSIsICJfVUlfTWV0aG9kUGx1Z2luX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEJhc2VzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQmFzZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFBsdWdpbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU5fX0JBU0VTLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgTWV0aG9kUGx1Z2luLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L01ldGhvZFBsdWdpbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChNZXRob2RQbHVnaW4pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGx1Z2luX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RQbHVnaW5fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE1ldGhvZFBsdWdpbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kVW5pdEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kVW5pdEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NDBiMmU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFVuaXRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kVW5pdEl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RVbml0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQXV0aG9yc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ2hhbmdlRGF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ2hhbmdlRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZlcnNpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENvcHlyaWdodFN0YXRlbWVudFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXV0aG9ycyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEF1dGhvcnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFVuaXRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVF9fQVVUSE9SUywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDaGFuZ2UgRGF0ZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoYW5nZURhdGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFVuaXRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ2hhbmdlIERlc2NyaXB0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hhbmdlRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF9jaGFuZ2VEZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFVuaXRfY2hhbmdlRGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfTWV0aG9kVW5pdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmVyc2lvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZlcnNpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF92ZXJzaW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kVW5pdF92ZXJzaW9uX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFVuaXRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVF9fVkVSU0lPTiwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb3B5cmlnaHQgU3RhdGVtZW50IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29weXJpZ2h0U3RhdGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFVuaXRfY29weXJpZ2h0U3RhdGVtZW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kVW5pdF9jb3B5cmlnaHRTdGF0ZW1lbnRfZmVhdHVyZSIsICJfVUlfTWV0aG9kVW5pdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5ULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIE1ldGhvZFVuaXQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvTWV0aG9kVW5pdCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChNZXRob2RVbml0KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX01ldGhvZFVuaXRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFVuaXRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE1ldGhvZFVuaXQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzoKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURToKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fVkVSU0lPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTRjMDczYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1pbGVzdG9uZUl0ZW1Qcm92aWRlciBleHRlbmRzIFdvcmtCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWlsZXN0b25lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgTWlsZXN0b25lLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L01pbGVzdG9uZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChNaWxlc3RvbmUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfTWlsZXN0b25lX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9NaWxlc3RvbmVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL05hbWVkRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTmFtZWRFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFiNGZjZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTmFtZWRFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lZEVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTmFtZWRFbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTmFtZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTmFtZWRFbGVtZW50X25hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9OYW1lZEVsZW1lbnRfbmFtZV9mZWF0dXJlIiwgIl9VSV9OYW1lZEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIE5hbWVkRWxlbWVudC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9OYW1lZEVsZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTmFtZWRFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX05hbWVkRWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfTmFtZWRFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChOYW1lZEVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9OYW1lc3BhY2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL05hbWVzcGFjZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzM2VmMTY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL05hbWVzcGFjZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lc3BhY2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlSXRlbVByb3ZpZGVyIGV4dGVuZHMgTmFtZWRFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTmFtZXNwYWNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgTmFtZXNwYWNlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L05hbWVzcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChOYW1lc3BhY2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfTmFtZXNwYWNlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9OYW1lc3BhY2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL091dGNvbWVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL091dGNvbWVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzk2NWUzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9PdXRjb21lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE91dGNvbWVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGNvbWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBPdXRjb21lLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L091dGNvbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoT3V0Y29tZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9PdXRjb21lX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9PdXRjb21lX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmMjI1ZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBOYW1lc3BhY2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUGFja2FnZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9QYWNrYWdlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9QYWNrYWdlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9QYWNrYWdlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QYWNrYWdlYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BhY2thZ2VhYmxlRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNmI0MDhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BhY2thZ2VhYmxlRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2VhYmxlRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZWFibGVFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgTmFtZWRFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFja2FnZWFibGVFbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUGFja2FnZWFibGVFbGVtZW50LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1BhY2thZ2VhYmxlRWxlbWVudCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQYWNrYWdlYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUGFja2FnZWFibGVFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9QYWNrYWdlYWJsZUVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BoYXNlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QaGFzZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NDVmMDkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BoYXNlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBoYXNlSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWN0aXZpdHlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQaGFzZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFBoYXNlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1BoYXNlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFBoYXNlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1BoYXNlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9QaGFzZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTgotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUGxhbm5pbmdEYXRhSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRjMmU2ZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUGxhbm5pbmdEYXRhSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQbGFubmluZ0RhdGFJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFN0YXJ0RGF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRmluaXNoRGF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmFua1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3RhcnQgRGF0ZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN0YXJ0RGF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QbGFubmluZ0RhdGFfc3RhcnREYXRlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUGxhbm5pbmdEYXRhX3N0YXJ0RGF0ZV9mZWF0dXJlIiwgIl9VSV9QbGFubmluZ0RhdGFfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QTEFOTklOR19EQVRBX19TVEFSVF9EQVRFLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEZpbmlzaCBEYXRlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRmluaXNoRGF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QbGFubmluZ0RhdGFfZmluaXNoRGF0ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BsYW5uaW5nRGF0YV9maW5pc2hEYXRlX2ZlYXR1cmUiLCAiX1VJX1BsYW5uaW5nRGF0YV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJhbmsgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSYW5rUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1BsYW5uaW5nRGF0YV9yYW5rX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUGxhbm5pbmdEYXRhX3JhbmtfZmVhdHVyZSIsICJfVUlfUGxhbm5pbmdEYXRhX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUExBTk5JTkdfREFUQV9fUkFOSywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUGxhbm5pbmdEYXRhLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1BsYW5uaW5nRGF0YSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQbGFubmluZ0RhdGEpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUGxhbm5pbmdEYXRhX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9QbGFubmluZ0RhdGFfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBsYW5uaW5nRGF0YS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEU6Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURToKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTks6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BvaW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qb2ludEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MDE1M2VmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BvaW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb2ludEl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFhQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFggZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1BvaW50X3hfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb2ludF94X2ZlYXR1cmUiLCAiX1VJX1BvaW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUE9JTlRfX1gsIHRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBZIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkWVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Qb2ludF95X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9pbnRfeV9mZWF0dXJlIiwgIl9VSV9Qb2ludF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBPSU5UX19ZLCB0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUG9pbnQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUG9pbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCURvdWJsZSBsYWJlbFZhbHVlID0gKChQb2ludCkgb2JqZWN0KS5nZXRYKCk7Ci0JCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qb2ludF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUG9pbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBvaW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUE9JTlRfX1g6Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVF9fWToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUG9seWxpbmVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BvbHlsaW5lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmYTk1ZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUG9seWxpbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUG9seWxpbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHcmFwaGljUHJpbWl0aXZlSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9seWxpbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRDbG9zZWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENsb3NlZCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENsb3NlZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Qb2x5bGluZV9jbG9zZWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb2x5bGluZV9jbG9zZWRfZmVhdHVyZSIsICJfVUlfUG9seWxpbmVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QT0xZTElORV9fQ0xPU0VELCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5QT0xZTElORV9fV0FZUE9JTlRTKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUG9seWxpbmUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUG9seWxpbmUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUG9seWxpbmUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUG9seWxpbmVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1BvbHlsaW5lX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQb2x5bGluZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPTFlMSU5FX19DTE9TRUQ6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkVfX1dBWVBPSU5UUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QT0xZTElORV9fV0FZUE9JTlRTLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZVBvaW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0MGQ0OTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJhY3RpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJhY3RpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEFkZGl0aW9uYWxJbmZvUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQcm9ibGVtUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRCYWNrZ3JvdW5kUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRHb2Fsc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQXBwbGljYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZExldmVsc09mQWRvcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFkZGl0aW9uYWwgSW5mbyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFkZGl0aW9uYWxJbmZvUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYWRkaXRpb25hbEluZm9fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FkZGl0aW9uYWxJbmZvX2ZlYXR1cmUiLCAiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFByb2JsZW0gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9ibGVtUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fcHJvYmxlbV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fcHJvYmxlbV9mZWF0dXJlIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU0sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQmFja2dyb3VuZCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJhY2tncm91bmRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9iYWNrZ3JvdW5kX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9iYWNrZ3JvdW5kX2ZlYXR1cmUiLCAiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORCwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBHb2FscyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEdvYWxzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fZ29hbHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2dvYWxzX2ZlYXR1cmUiLCAiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFMsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXBwbGljYXRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBcHBsaWNhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FwcGxpY2F0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hcHBsaWNhdGlvbl9mZWF0dXJlIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExldmVscyBPZiBBZG9wdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExldmVsc09mQWRvcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9sZXZlbHNPZkFkb3B0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9sZXZlbHNPZkFkb3B0aW9uX2ZlYXR1cmUiLCAiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFByYWN0aWNlRGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUHJhY3RpY2VEZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQcmFjdGljZURlc2NyaXB0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPOgotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU06Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORDoKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUzoKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT046Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1ByYWN0aWNlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QcmFjdGljZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMTA5MDI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1ByYWN0aWNlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmFjdGljZUl0ZW1Qcm92aWRlciBleHRlbmRzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJhY3RpY2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRDb250ZW50UmVmZXJlbmNlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQWN0aXZpdHlSZWZlcmVuY2VzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb250ZW50IFJlZmVyZW5jZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZW50UmVmZXJlbmNlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QcmFjdGljZV9jb250ZW50UmVmZXJlbmNlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ByYWN0aWNlX2NvbnRlbnRSZWZlcmVuY2VzX2ZlYXR1cmUiLCAiX1VJX1ByYWN0aWNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBY3Rpdml0eSBSZWZlcmVuY2VzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWN0aXZpdHlSZWZlcmVuY2VzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ByYWN0aWNlX2FjdGl2aXR5UmVmZXJlbmNlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ByYWN0aWNlX2FjdGl2aXR5UmVmZXJlbmNlc19mZWF0dXJlIiwgIl9VSV9QcmFjdGljZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0VTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9fU1VCX1BSQUNUSUNFUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFByYWN0aWNlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1ByYWN0aWNlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFByYWN0aWNlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1ByYWN0aWNlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9QcmFjdGljZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJhY3RpY2UuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9fU1VCX1BSQUNUSUNFUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmFjdGljZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhMmJmMWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFByb2Nlc3NDb21wb25lbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFByb2Nlc3MgQ29tcG9uZW50IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvY2Vzc0NvbXBvbmVudFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9Qcm9jZXNzQ29tcG9uZW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfUHJvY2Vzc0NvbXBvbmVudF9mZWF0dXJlIiwgIl9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BST0NFU1NfQ09NUE9ORU5ULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2OWZhMGNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TOgotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU86Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUywKLQkJCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMGIyMWUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRBdXRob3JzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDaGFuZ2VEYXRlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDaGFuZ2VEZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVmVyc2lvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ29weXJpZ2h0U3RhdGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRJbnRlcmZhY2VzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBdXRob3JzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXV0aG9yc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RVbml0X2F1dGhvcnNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RVbml0X2F1dGhvcnNfZmVhdHVyZSIsICJfVUlfTWV0aG9kVW5pdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9VTklUX19BVVRIT1JTLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENoYW5nZSBEYXRlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hhbmdlRGF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RVbml0X2NoYW5nZURhdGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RVbml0X2NoYW5nZURhdGVfZmVhdHVyZSIsICJfVUlfTWV0aG9kVW5pdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9VTklUX19DSEFOR0VfREFURSwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDaGFuZ2UgRGVzY3JpcHRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGFuZ2VEZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RVbml0X2NoYW5nZURlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kVW5pdF9jaGFuZ2VEZXNjcmlwdGlvbl9mZWF0dXJlIiwgIl9VSV9NZXRob2RVbml0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWZXJzaW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmVyc2lvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RVbml0X3ZlcnNpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RVbml0X3ZlcnNpb25fZmVhdHVyZSIsICJfVUlfTWV0aG9kVW5pdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9VTklUX19WRVJTSU9OLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvcHlyaWdodCBTdGF0ZW1lbnQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb3B5cmlnaHRTdGF0ZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF9jb3B5cmlnaHRTdGF0ZW1lbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RVbml0X2NvcHlyaWdodFN0YXRlbWVudF9mZWF0dXJlIiwgIl9VSV9NZXRob2RVbml0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSW50ZXJmYWNlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEludGVyZmFjZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0NvbXBvbmVudF9pbnRlcmZhY2VzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJvY2Vzc0NvbXBvbmVudF9pbnRlcmZhY2VzX2ZlYXR1cmUiLCAiX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUHJvY2Vzc0NvbXBvbmVudC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Qcm9jZXNzQ29tcG9uZW50IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFByb2Nlc3NDb21wb25lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0NvbXBvbmVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0NvbXBvbmVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJvY2Vzc0NvbXBvbmVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOgotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJ5UHJvY2VzcygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhZDA5MjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlBY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRXh0ZXJuYWxJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU2NvcGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFVzYWdlTm90ZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEV4dGVybmFsIElkIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXh0ZXJuYWxJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUiLCAiX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lELAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNjb3BlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2NvcGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3Njb3BlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3Njb3BlX2ZlYXR1cmUiLCAiX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFVzYWdlIE5vdGVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVXNhZ2VOb3Rlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fdXNhZ2VOb3Rlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl91c2FnZU5vdGVzX2ZlYXR1cmUiLCAiX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFByb2Nlc3NEZXNjcmlwdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Qcm9jZXNzRGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUHJvY2Vzc0Rlc2NyaXB0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NmRjMWQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0VsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFByb2Nlc3NFbGVtZW50LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1Byb2Nlc3NFbGVtZW50IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFByb2Nlc3NFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Byb2Nlc3NFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzRWxlbWVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjODZhYmM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRGVsaXZlcnlQcm9jZXNzZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlbGl2ZXJ5IFByb2Nlc3NlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlbGl2ZXJ5UHJvY2Vzc2VzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NGYW1pbHlfZGVsaXZlcnlQcm9jZXNzZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qcm9jZXNzRmFtaWx5X2RlbGl2ZXJ5UHJvY2Vzc2VzX2ZlYXR1cmUiLCAiX1VJX1Byb2Nlc3NGYW1pbHlfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0ZBTUlMWV9fREVMSVZFUllfUFJPQ0VTU0VTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFByb2Nlc3NGYW1pbHkuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlseSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQcm9jZXNzRmFtaWx5KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Byb2Nlc3NGYW1pbHlfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NGYW1pbHlfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWMyMjg1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc30gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzIEFjdGl2aXR5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEluY2x1ZGVzUGF0dGVybnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZERlZmF1bHRDb250ZXh0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRWYWxpZENvbnRleHRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEluY2x1ZGVzIFBhdHRlcm5zIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW5jbHVkZXNQYXR0ZXJuc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzX2luY2x1ZGVzUGF0dGVybnNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qcm9jZXNzX2luY2x1ZGVzUGF0dGVybnNfZmVhdHVyZSIsICJfVUlfUHJvY2Vzc190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlZmF1bHQgQ29udGV4dCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRDb250ZXh0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NfZGVmYXVsdENvbnRleHRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qcm9jZXNzX2RlZmF1bHRDb250ZXh0X2ZlYXR1cmUiLCAiX1VJX1Byb2Nlc3NfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFsaWQgQ29udGV4dCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZhbGlkQ29udGV4dFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzX3ZhbGlkQ29udGV4dF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Byb2Nlc3NfdmFsaWRDb250ZXh0X2ZlYXR1cmUiLCAiX1VJX1Byb2Nlc3NfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX19WQUxJRF9DT05URVhULCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFByb2Nlc3MuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUHJvY2VzcyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTgotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMTc2YTRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZFBhY2thZ2VJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFByb2Nlc3NQYWNrYWdlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1Byb2Nlc3NQYWNrYWdlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFByb2Nlc3NQYWNrYWdlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Byb2Nlc3NQYWNrYWdlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzUGFja2FnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJvY2Vzc1BhY2thZ2UuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFM6Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0RJQUdSQU1TOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWlsZXN0b25lKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJdGVyYXRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBoYXNlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZWFtUHJvZmlsZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZURlc2NyaXB0b3IoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtPcmRlcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGxhbm5pbmdEYXRhKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb21wb3NpdGVSb2xlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyeVByb2Nlc3MoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaWFncmFtKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNThjNDQyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSXRlbVByb3ZpZGVyIGV4dGVuZHMgUHJvY2Vzc0l0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQmFzZWRPblByb2Nlc3Nlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQmFzZWQgT24gUHJvY2Vzc2VzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQmFzZWRPblByb2Nlc3Nlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9iYXNlZE9uUHJvY2Vzc2VzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfYmFzZWRPblByb2Nlc3Nlc19mZWF0dXJlIiwgIl9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VEX09OX1BST0NFU1NFUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04KLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9wZXJ0eUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvcGVydHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjMxODkyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9wZXJ0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHl9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEtleVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEtleSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEtleVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eV9rZXlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qcm9wZXJ0eV9rZXlfZmVhdHVyZSIsICJfVUlfUHJvcGVydHlfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9QRVJUWV9fS0VZLCB0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFsdWUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eV92YWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Byb3BlcnR5X3ZhbHVlX2ZlYXR1cmUiLCAiX1VJX1Byb3BlcnR5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPUEVSVFlfX1ZBTFVFLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFByb3BlcnR5LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1Byb3BlcnR5IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFByb3BlcnR5KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Byb3BlcnR5X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJvcGVydHkuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWV9fS0VZOgotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qc2V1ZG9TdGF0ZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHNldWRvU3RhdGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTVkNDI0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qc2V1ZG9TdGF0ZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHNldWRvU3RhdGVJdGVtUHJvdmlkZXIuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjM5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qc2V1ZG9TdGF0ZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHNldWRvU3RhdGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBWZXJ0ZXhJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQc2V1ZG9TdGF0ZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFBzZXVkb1N0YXRlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1BzZXVkb1N0YXRlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfUHNldWRvU3RhdGVfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUmVmZXJlbmNlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9SZWZlcmVuY2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjJhODNlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9SZWZlcmVuY2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlZmVyZW5jZUl0ZW1Qcm92aWRlciBleHRlbmRzIERpYWdyYW1FbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVmZXJlbmNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlZmVyZW5jZWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9SZWZlcmVuY2VfaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZWZlcmVuY2VfaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb25fZmVhdHVyZSIsICJfVUlfUmVmZXJlbmNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlZmVyZW5jZWQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWZlcmVuY2VkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1JlZmVyZW5jZV9yZWZlcmVuY2VkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUmVmZXJlbmNlX3JlZmVyZW5jZWRfZmVhdHVyZSIsICJfVUlfUmVmZXJlbmNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVGRVJFTkNFX19SRUZFUkVOQ0VELCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJlZmVyZW5jZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9SZWZlcmVuY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUmVmZXJlbmNlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1JlZmVyZW5jZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUmVmZXJlbmNlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSZWZlcmVuY2UuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX0lTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT046Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JlZ2lvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUmVnaW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAzMTIxZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUmVnaW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZWdpb25JdGVtUHJvdmlkZXIuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjM5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWdpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVnaW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLlJFR0lPTl9fVkVSVEVYKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVHSU9OX19UUkFOU0lUSU9OKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUmVnaW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1JlZ2lvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFN0cmluZygiX1VJX1JlZ2lvbl90eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSZWdpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUdJT05fX1ZFUlRFWDoKLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTl9fVFJBTlNJVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5SRUdJT05fX1ZFUlRFWCwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVWZXJ0ZXgoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVHSU9OX19WRVJURVgsIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlU3RhdGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVHSU9OX19WRVJURVgsIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlUHNldWRvU3RhdGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVHSU9OX19UUkFOU0lUSU9OLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZVRyYW5zaXRpb24oKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JlcG9ydEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUmVwb3J0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIwNWU4MDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUmVwb3J0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvcnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlcG9ydEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJlcG9ydC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9SZXBvcnQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUmVwb3J0KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1JlcG9ydF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUmVwb3J0X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9SZXVzYWJsZUFzc2V0SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9SZXVzYWJsZUFzc2V0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2MDAxZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXVzYWJsZUFzc2V0SXRlbVByb3ZpZGVyIGV4dGVuZHMgR3VpZGFuY2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXVzYWJsZUFzc2V0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUmV1c2FibGVBc3NldC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9SZXVzYWJsZUFzc2V0IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJldXNhYmxlQXNzZXQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUmV1c2FibGVBc3NldF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUmV1c2FibGVBc3NldF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9hZG1hcEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9hZG1hcEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOTFkNzdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvYWRtYXBJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9hZG1hcEl0ZW1Qcm92aWRlciBleHRlbmRzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9hZG1hcEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJvYWRtYXAuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUm9hZG1hcCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChSb2FkbWFwKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1JvYWRtYXBfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1JvYWRtYXBfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlMjliNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRTa2lsbHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEFzc2lnbm1lbnRBcHByb2FjaGVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTeW5vbnltc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2tpbGxzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2tpbGxzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1JvbGVEZXNjcmlwdGlvbl9za2lsbHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Sb2xlRGVzY3JpcHRpb25fc2tpbGxzX2ZlYXR1cmUiLCAiX1VJX1JvbGVEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBc3NpZ25tZW50IEFwcHJvYWNoZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBc3NpZ25tZW50QXBwcm9hY2hlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlRGVzY3JpcHRpb25fYXNzaWdubWVudEFwcHJvYWNoZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Sb2xlRGVzY3JpcHRpb25fYXNzaWdubWVudEFwcHJvYWNoZXNfZmVhdHVyZSIsICJfVUlfUm9sZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFN5bm9ueW1zIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3lub255bXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZURlc2NyaXB0aW9uX3N5bm9ueW1zX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUm9sZURlc2NyaXB0aW9uX3N5bm9ueW1zX2ZlYXR1cmUiLCAiX1VJX1JvbGVEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJvbGVEZXNjcmlwdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Sb2xlRGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUm9sZURlc2NyaXB0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1JvbGVEZXNjcmlwdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZURlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSb2xlRGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFM6Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVM6Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI1OWViMWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzIERlc2NyaXB0b3JJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFJvbGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZE1vZGlmaWVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSZXNwb25zaWJsZUZvclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUm9sZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJvbGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZURlc2NyaXB0b3JfUm9sZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JvbGVEZXNjcmlwdG9yX1JvbGVfZmVhdHVyZSIsICJfVUlfUm9sZURlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX0RFU0NSSVBUT1JfX1JPTEUsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTW9kaWZpZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNb2RpZmllc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlRGVzY3JpcHRvcl9tb2RpZmllc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JvbGVEZXNjcmlwdG9yX21vZGlmaWVzX2ZlYXR1cmUiLCAiX1VJX1JvbGVEZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9ERVNDUklQVE9SX19NT0RJRklFUywgZmFsc2UsCi0JCQkJCQlmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVzcG9uc2libGUgRm9yIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzcG9uc2libGVGb3JQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZURlc2NyaXB0b3JfcmVzcG9uc2libGVGb3JfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Sb2xlRGVzY3JpcHRvcl9yZXNwb25zaWJsZUZvcl9mZWF0dXJlIiwgIl9VSV9Sb2xlRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJvbGVEZXNjcmlwdG9yLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1JvbGVEZXNjcmlwdG9yIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJvbGVEZXNjcmlwdG9yKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1JvbGVEZXNjcmlwdG9yX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlRGVzY3JpcHRvcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZjI1MDE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZUl0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZE1vZGlmaWVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSZXNwb25zaWJsZUZvclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTW9kaWZpZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNb2RpZmllc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlX21vZGlmaWVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUm9sZV9tb2RpZmllc19mZWF0dXJlIiwgIl9VSV9Sb2xlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9fTU9ESUZJRVMsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlc3BvbnNpYmxlIEZvciBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlc3BvbnNpYmxlRm9yUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1JvbGVfcmVzcG9uc2libGVGb3JfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Sb2xlX3Jlc3BvbnNpYmxlRm9yX2ZlYXR1cmUiLCAiX1VJX1JvbGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX19SRVNQT05TSUJMRV9GT1IsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUm9sZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Sb2xlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJvbGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUm9sZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmIxMDRjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmd9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFJvbGVTZXRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSb2xlIFNldHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSb2xlU2V0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlU2V0R3JvdXBpbmdfcm9sZVNldHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Sb2xlU2V0R3JvdXBpbmdfcm9sZVNldHNfZmVhdHVyZSIsICJfVUlfUm9sZVNldEdyb3VwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSb2xlU2V0R3JvdXBpbmcuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUm9sZVNldEdyb3VwaW5nIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJvbGVTZXRHcm91cGluZykgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1JvbGVTZXRHcm91cGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NjE3MmQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVTZXRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEl0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVTZXRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRSb2xlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUm9sZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSb2xlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlU2V0X3JvbGVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUm9sZVNldF9yb2xlc19mZWF0dXJlIiwgIl9VSV9Sb2xlU2V0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVRfX1JPTEVTLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJvbGVTZXQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUm9sZVNldCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChSb2xlU2V0KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1JvbGVTZXRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1JvbGVTZXRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1NlY3Rpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1NlY3Rpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTZlMDBiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TZWN0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgVmFyaWFiaWxpdHlFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFNlY3Rpb25OYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTZWN0aW9uRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFByZWRlY2Vzc29yUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZWN0aW9uIE5hbWUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZWN0aW9uTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9TZWN0aW9uX3NlY3Rpb25OYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VjdGlvbl9zZWN0aW9uTmFtZV9mZWF0dXJlIiwgIl9VSV9TZWN0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuU0VDVElPTl9fU0VDVElPTl9OQU1FLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlY3Rpb24gRGVzY3JpcHRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZWN0aW9uRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfU2VjdGlvbl9zZWN0aW9uRGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZWN0aW9uX3NlY3Rpb25EZXNjcmlwdGlvbl9mZWF0dXJlIiwgIl9VSV9TZWN0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuU0VDVElPTl9fU0VDVElPTl9ERVNDUklQVElPTiwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcmVkZWNlc3NvciBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFByZWRlY2Vzc29yUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1NlY3Rpb25fcHJlZGVjZXNzb3JfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZWN0aW9uX3ByZWRlY2Vzc29yX2ZlYXR1cmUiLCAiX1VJX1NlY3Rpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5TRUNUSU9OX19QUkVERUNFU1NPUiwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuU0VDVElPTl9fU1VCX1NFQ1RJT05TKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgU2VjdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9TZWN0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFNlY3Rpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfU2VjdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfU2VjdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VjdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fTkFNRToKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT046Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT05TOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlNFQ1RJT05fX1NVQl9TRUNUSU9OUywgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVTZWN0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlNFQ1RJT05fX1NVQl9TRUNUSU9OUywgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVTdGVwKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRjMmQ4MDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUHJlc2VudGF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcmVzZW50YXRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcmVzZW50YXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9wcmVzZW50YXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3ByZXNlbnRhdGlvbl9mZWF0dXJlIiwgIl9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgU2VtYW50aWNNb2RlbEJyaWRnZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9TZW1hbnRpY01vZGVsQnJpZGdlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFNlbWFudGljTW9kZWxCcmlkZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzFkZDMxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVHlwZUluZm9Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFR5cGUgSW5mbyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVJbmZvUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGVJbmZvX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZUluZm9fZmVhdHVyZSIsICJfVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fVFlQRV9JTkZPLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fVFlQRV9JTkZPOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TdGF0ZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU3RhdGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzJmZjIxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TdGF0ZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogU3RhdGVJdGVtUHJvdmlkZXIuamF2YSx2IDEuNCAyMDA2LzA5LzA3IDAwOjA2OjM5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0YXRlSXRlbVByb3ZpZGVyIGV4dGVuZHMgVmVydGV4SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RhdGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRXb3JrUHJvZHVjdFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3VibWFjaGluZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV29yayBQcm9kdWN0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV29ya1Byb2R1Y3RQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfU3RhdGVfV29ya1Byb2R1Y3RfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TdGF0ZV9Xb3JrUHJvZHVjdF9mZWF0dXJlIiwgIl9VSV9TdGF0ZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlNUQVRFX19XT1JLX1BST0RVQ1QsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3VibWFjaGluZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1Ym1hY2hpbmVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfU3RhdGVfc3VibWFjaGluZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1N0YXRlX3N1Ym1hY2hpbmVfZmVhdHVyZSIsICJfVUlfU3RhdGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5TVEFURV9fU1VCTUFDSElORSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuU1RBVEVfX1JFR0lPTik7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFN0YXRlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1N0YXRlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfU3RhdGVfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU3RhdGUuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEFURV9fUkVHSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlNUQVRFX19SRUdJT04sIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlUmVnaW9uKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TdGF0ZU1hY2hpbmVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1N0YXRlTWFjaGluZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NDI1ODY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1N0YXRlTWFjaGluZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogU3RhdGVNYWNoaW5lSXRlbVByb3ZpZGVyLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjozOSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZU1hY2hpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGVNYWNoaW5lfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0ZU1hY2hpbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXb3JrRGVmaW5pdGlvbkl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0YXRlTWFjaGluZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5TVEFURV9NQUNISU5FX19SRUdJT04pOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTdGF0ZU1hY2hpbmUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvU3RhdGVNYWNoaW5lIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFN0YXRlTWFjaGluZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9TdGF0ZU1hY2hpbmVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1N0YXRlTWFjaGluZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU3RhdGVNYWNoaW5lLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuU1RBVEVfTUFDSElORV9fUkVHSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlNUQVRFX01BQ0hJTkVfX1JFR0lPTiwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVSZWdpb24oKSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04KLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TdGVwSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TdGVwSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVkODZjNWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU3RlcEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXB9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0ZXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBTZWN0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RlcEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04pOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgU3RlcC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9TdGVwIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFN0ZXApIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfU3RlcF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfU3RlcF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU3RlcC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT046Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTgotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1N1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU3VwcG9ydGluZ01hdGVyaWFsSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3YzlhNGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU3VwcG9ydGluZ01hdGVyaWFsSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdXBwb3J0aW5nTWF0ZXJpYWxJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFN1cHBvcnRpbmdNYXRlcmlhbC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9TdXBwb3J0aW5nTWF0ZXJpYWwiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoU3VwcG9ydGluZ01hdGVyaWFsKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1N1cHBvcnRpbmdNYXRlcmlhbF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfU3VwcG9ydGluZ01hdGVyaWFsX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UYXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rhc2tEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiOWIyYzRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rhc2tEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFza0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUHVycG9zZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQWx0ZXJuYXRpdmVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQdXJwb3NlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHVycG9zZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUiLCAiX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0UsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQWx0ZXJuYXRpdmVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWx0ZXJuYXRpdmVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdGlvbl9hbHRlcm5hdGl2ZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrRGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUiLCAiX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBUYXNrRGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVGFza0Rlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFRhc2tEZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoVGFza0Rlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI2ZWEzODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVdvcmtCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFRhc2tQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRBc3Npc3RlZEJ5UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFeHRlcm5hbElucHV0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRNYW5kYXRvcnlJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkT3B0aW9uYWxJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkT3V0cHV0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQZXJmb3JtZWRQcmltYXJpbHlCeVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU2VsZWN0ZWRTdGVwc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgU3luY2hyb25pemVkIFdpdGggU291cmNlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaXB0b3JfaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVzY3JpcHRvcl9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2VfZmVhdHVyZSIsICJfVUlfRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUYXNrIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFza1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl9UYXNrX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza0Rlc2NyaXB0b3JfVGFza19mZWF0dXJlIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fVEFTSywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWRkaXRpb25hbGx5UGVyZm9ybWVkQnlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3JfYWRkaXRpb25hbGx5UGVyZm9ybWVkQnlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeV9mZWF0dXJlIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBc3Npc3RlZCBCeSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFzc2lzdGVkQnlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3JfYXNzaXN0ZWRCeV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX2Fzc2lzdGVkQnlfZmVhdHVyZSIsICJfVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEV4dGVybmFsIElucHV0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXh0ZXJuYWxJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl9leHRlcm5hbElucHV0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza0Rlc2NyaXB0b3JfZXh0ZXJuYWxJbnB1dF9mZWF0dXJlIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWFuZGF0b3J5IElucHV0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWFuZGF0b3J5SW5wdXRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3JfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl9tYW5kYXRvcnlJbnB1dF9mZWF0dXJlIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE9wdGlvbmFsIElucHV0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3B0aW9uYWxJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl9vcHRpb25hbElucHV0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza0Rlc2NyaXB0b3Jfb3B0aW9uYWxJbnB1dF9mZWF0dXJlIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgT3V0cHV0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3V0cHV0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX291dHB1dF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX291dHB1dF9mZWF0dXJlIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVULCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBlcmZvcm1lZCBQcmltYXJpbHkgQnkgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQZXJmb3JtZWRQcmltYXJpbHlCeVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl9wZXJmb3JtZWRQcmltYXJpbHlCeV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX3BlcmZvcm1lZFByaW1hcmlseUJ5X2ZlYXR1cmUiLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlbGVjdGVkIFN0ZXBzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VsZWN0ZWRTdGVwc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl9zZWxlY3RlZFN0ZXBzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza0Rlc2NyaXB0b3Jfc2VsZWN0ZWRTdGVwc19mZWF0dXJlIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fU0VMRUNURURfU1RFUFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVGFza0Rlc2NyaXB0b3IuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVGFza0Rlc2NyaXB0b3IpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChUYXNrRGVzY3JpcHRvci5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UYXNrSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UYXNrSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmNWZkNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGFza0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza30gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza0l0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFza0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFBlcmZvcm1lZEJ5UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRNYW5kYXRvcnlJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkT3V0cHV0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkT3B0aW9uYWxJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3RlcHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFRvb2xNZW50b3JzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBlcmZvcm1lZCBCeSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBlcmZvcm1lZEJ5UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tfcGVyZm9ybWVkQnlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrX3BlcmZvcm1lZEJ5X2ZlYXR1cmUiLCAiX1VJX1Rhc2tfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19QRVJGT1JNRURfQlksIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWFuZGF0b3J5IElucHV0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWFuZGF0b3J5SW5wdXRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza19tYW5kYXRvcnlJbnB1dF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSIsICJfVUlfVGFza190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX01BTkRBVE9SWV9JTlBVVCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBPdXRwdXQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRPdXRwdXRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza19vdXRwdXRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrX291dHB1dF9mZWF0dXJlIiwgIl9VSV9UYXNrX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fT1VUUFVULCB0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQludWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnkgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza19hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeV9mZWF0dXJlIiwgIl9VSV9UYXNrX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBPcHRpb25hbCBJbnB1dCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE9wdGlvbmFsSW5wdXRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza19vcHRpb25hbElucHV0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza19vcHRpb25hbElucHV0X2ZlYXR1cmUiLCAiX1VJX1Rhc2tfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19PUFRJT05BTF9JTlBVVCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdGVwcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN0ZXBzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tfc3RlcHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrX3N0ZXBzX2ZlYXR1cmUiLCAiX1VJX1Rhc2tfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19TVEVQUywgZmFsc2UsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCW51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVG9vbCBNZW50b3JzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9vbE1lbnRvcnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza190b29sTWVudG9yc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tfdG9vbE1lbnRvcnNfZmVhdHVyZSIsICJfVUlfVGFza190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX1RPT0xfTUVOVE9SUywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tfZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza19lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfZmVhdHVyZSIsICJfVUlfVGFza190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTik7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04pOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBUYXNrLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1Rhc2siKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVGFzaykgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9UYXNrX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChUYXNrLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OOgotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1RlYW1Qcm9maWxlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ1YmI1NmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZWFtUHJvZmlsZUl0ZW1Qcm92aWRlciBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZWFtUHJvZmlsZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFRlYW1Sb2xlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3VwZXJUZWFtUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTdWJUZWFtUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUZWFtIFJvbGVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGVhbVJvbGVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1RlYW1Qcm9maWxlX3RlYW1Sb2xlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1RlYW1Qcm9maWxlX3RlYW1Sb2xlc19mZWF0dXJlIiwgIl9VSV9UZWFtUHJvZmlsZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRFQU1fUFJPRklMRV9fVEVBTV9ST0xFUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdXBlciBUZWFtIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3VwZXJUZWFtUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1RlYW1Qcm9maWxlX3N1cGVyVGVhbV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1RlYW1Qcm9maWxlX3N1cGVyVGVhbV9mZWF0dXJlIiwgIl9VSV9UZWFtUHJvZmlsZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdWIgVGVhbSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1YlRlYW1Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGVhbVByb2ZpbGVfc3ViVGVhbV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1RlYW1Qcm9maWxlX3N1YlRlYW1fZmVhdHVyZSIsICJfVUlfVGVhbVByb2ZpbGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5URUFNX1BST0ZJTEVfX1NVQl9URUFNLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFRlYW1Qcm9maWxlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1RlYW1Qcm9maWxlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFRlYW1Qcm9maWxlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1RlYW1Qcm9maWxlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9UZWFtUHJvZmlsZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGVtcGxhdGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1RlbXBsYXRlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4NjFkZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGVtcGxhdGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUl0ZW1Qcm92aWRlciBleHRlbmRzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGVtcGxhdGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBUZW1wbGF0ZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9UZW1wbGF0ZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChUZW1wbGF0ZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9UZW1wbGF0ZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVGVtcGxhdGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rlcm1EZWZpbml0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5Yzk4MTBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rlcm1EZWZpbml0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGVybURlZmluaXRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlcm1EZWZpbml0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVGVybURlZmluaXRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVGVybURlZmluaXRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVGVybURlZmluaXRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVGVybURlZmluaXRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Rlcm1EZWZpbml0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UZXh0RWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTAwYzM3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UZXh0RWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRleHRFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgTGVhZkVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZXh0RWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFRleHRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRleHQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUZXh0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1RleHRFbGVtZW50X3RleHRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UZXh0RWxlbWVudF90ZXh0X2ZlYXR1cmUiLCAiX1VJX1RleHRFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVYVF9FTEVNRU5UX19URVhULCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFRleHRFbGVtZW50LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1RleHRFbGVtZW50IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFRleHRFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1RleHRFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9UZXh0RWxlbWVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoVGV4dEVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URVhUX0VMRU1FTlRfX1RFWFQ6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rvb2xJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rvb2xJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmUyMGJjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Ub29sSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2x9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRvb2xJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUb29sSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVG9vbE1lbnRvcnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRvb2wgTWVudG9ycyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRvb2xNZW50b3JzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rvb2xfdG9vbE1lbnRvcnNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Ub29sX3Rvb2xNZW50b3JzX2ZlYXR1cmUiLCAiX1VJX1Rvb2xfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UT09MX19UT09MX01FTlRPUlMsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVG9vbC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Ub29sIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFRvb2wpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVG9vbF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVG9vbF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVG9vbE1lbnRvckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVG9vbE1lbnRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNzcyOTA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rvb2xNZW50b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVG9vbE1lbnRvckl0ZW1Qcm92aWRlciBleHRlbmRzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVG9vbE1lbnRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFRvb2xNZW50b3IuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVG9vbE1lbnRvciIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChUb29sTWVudG9yKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Rvb2xNZW50b3JfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Rvb2xNZW50b3JfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1RyYW5zaXRpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1RyYW5zaXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzYyNGJiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UcmFuc2l0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUcmFuc2l0aW9uSXRlbVByb3ZpZGVyLmphdmEsdiAxLjQgMjAwNi8wOS8wNyAwMDowNjozOCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2l0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRyYW5zaXRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRXb3JrRGVmaW5pdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU291cmNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRUYXJnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdvcmsgRGVmaW5pdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdvcmtEZWZpbml0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1RyYW5zaXRpb25fV29ya0RlZmluaXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UcmFuc2l0aW9uX1dvcmtEZWZpbml0aW9uX2ZlYXR1cmUiLCAiX1VJX1RyYW5zaXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UUkFOU0lUSU9OX19XT1JLX0RFRklOSVRJT04sIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU291cmNlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU291cmNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1RyYW5zaXRpb25fc291cmNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVHJhbnNpdGlvbl9zb3VyY2VfZmVhdHVyZSIsICJfVUlfVHJhbnNpdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRSQU5TSVRJT05fX1NPVVJDRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUYXJnZXQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYXJnZXRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVHJhbnNpdGlvbl90YXJnZXRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UcmFuc2l0aW9uX3RhcmdldF9mZWF0dXJlIiwgIl9VSV9UcmFuc2l0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVFJBTlNJVElPTl9fVEFSR0VULCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFRyYW5zaXRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVHJhbnNpdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFN0cmluZygiX1VJX1RyYW5zaXRpb25fdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVHlwZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YzNkODBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1R5cGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVHlwZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHlwZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVHlwZUl0ZW1Qcm92aWRlciBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFR5cGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBUeXBlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVHlwZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9UeXBlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9UeXBlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9VTUFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9VTUFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlhZjMwNjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVU1BU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVNQVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRFbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFbGVtZW50IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSIsICJfVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9VTUFTZW1hbnRpY01vZGVsQnJpZGdlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVW1hRWRpdFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVW1hRWRpdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZjI1OWJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1VtYUVkaXRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkVNRlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgc2luZ2xldG9uIGZvciB0aGUgVW1hIGVkaXQgcGx1Z2luLgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVW1hRWRpdFBsdWdpbiBleHRlbmRzIEVNRlBsdWdpbiB7Ci0JLyoqCi0JICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVW1hRWRpdFBsdWdpbiBJTlNUQU5DRSA9IG5ldyBVbWFFZGl0UGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hRWRpdFBsdWdpbigpIHsKLQkJc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlBsdWdpbjwvYj4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbiBleHRlbmRzIEVjbGlwc2VQbHVnaW4gewotCQkvKioKLQkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0KLQkJCS8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgaW5zdGFuY2UuCi0JCQkvLwotCQkJcGx1Z2luID0gdGhpczsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1VtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViMzRmYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hQWRhcHRlckZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLgotICogVGhlIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uCi0gKiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLgotICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBVbWFBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzCi0JCUNvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciwgSURpc3Bvc2FibGUgewotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIHN1cHBvcnRlZFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBhY2thZ2VJdGVtUHJvdmlkZXIgcGFja2FnZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhY2thZ2VBZGFwdGVyKCkgewotCQlpZiAocGFja2FnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwYWNrYWdlSXRlbVByb3ZpZGVyID0gbmV3IFBhY2thZ2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcGFja2FnZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50SXRlbVByb3ZpZGVyIGNvbnN0cmFpbnRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25zdHJhaW50QWRhcHRlcigpIHsKLQkJaWYgKGNvbnN0cmFpbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29uc3RyYWludEl0ZW1Qcm92aWRlciA9IG5ldyBDb25zdHJhaW50SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbnN0cmFpbnRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIgbWV0aG9kRWxlbWVudFByb3BlcnR5SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHlBZGFwdGVyKCkgewotCQlpZiAobWV0aG9kRWxlbWVudFByb3BlcnR5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW1ldGhvZEVsZW1lbnRQcm9wZXJ0eUl0ZW1Qcm92aWRlciA9IG5ldyBNZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlSXRlbVByb3ZpZGVyIHJvbGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlQWRhcHRlcigpIHsKLQkJaWYgKHJvbGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcm9sZUl0ZW1Qcm92aWRlciA9IG5ldyBSb2xlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJvbGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2t9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza0l0ZW1Qcm92aWRlciB0YXNrSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0FkYXB0ZXIoKSB7Ci0JCWlmICh0YXNrSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRhc2tJdGVtUHJvdmlkZXIgPSBuZXcgVGFza0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB0YXNrSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0ZXBJdGVtUHJvdmlkZXIgc3RlcEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXB9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0ZXBBZGFwdGVyKCkgewotCQlpZiAoc3RlcEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzdGVwSXRlbVByb3ZpZGVyID0gbmV3IFN0ZXBJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc3RlcEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3R9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXJ0aWZhY3RJdGVtUHJvdmlkZXIgYXJ0aWZhY3RJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJ0aWZhY3RBZGFwdGVyKCkgewotCQlpZiAoYXJ0aWZhY3RJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJYXJ0aWZhY3RJdGVtUHJvdmlkZXIgPSBuZXcgQXJ0aWZhY3RJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gYXJ0aWZhY3RJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyIGRlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJhYmxlQWRhcHRlcigpIHsKLQkJaWYgKGRlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyID0gbmV3IERlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE91dGNvbWVJdGVtUHJvdmlkZXIgb3V0Y29tZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU91dGNvbWVBZGFwdGVyKCkgewotCQlpZiAob3V0Y29tZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlvdXRjb21lSXRlbVByb3ZpZGVyID0gbmV3IE91dGNvbWVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gb3V0Y29tZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnR9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnRJdGVtUHJvdmlkZXIgcG9pbnRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9pbnRBZGFwdGVyKCkgewotCQlpZiAocG9pbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcG9pbnRJdGVtUHJvdmlkZXIgPSBuZXcgUG9pbnRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcG9pbnRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1MaW5rSXRlbVByb3ZpZGVyIGRpYWdyYW1MaW5rSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmt9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpYWdyYW1MaW5rQWRhcHRlcigpIHsKLQkJaWYgKGRpYWdyYW1MaW5rSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRpYWdyYW1MaW5rSXRlbVByb3ZpZGVyID0gbmV3IERpYWdyYW1MaW5rSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRpYWdyYW1MaW5rSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3Rvcn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHcmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlciBncmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHcmFwaENvbm5lY3RvckFkYXB0ZXIoKSB7Ci0JCWlmIChncmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlncmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlciA9IG5ldyBHcmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBncmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9ufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpbWVuc2lvbkl0ZW1Qcm92aWRlciBkaW1lbnNpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpbWVuc2lvbkFkYXB0ZXIoKSB7Ci0JCWlmIChkaW1lbnNpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGltZW5zaW9uSXRlbVByb3ZpZGVyID0gbmV3IERpbWVuc2lvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkaW1lbnNpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZWZlcmVuY2VJdGVtUHJvdmlkZXIgcmVmZXJlbmNlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZWZlcmVuY2VBZGFwdGVyKCkgewotCQlpZiAocmVmZXJlbmNlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJlZmVyZW5jZUl0ZW1Qcm92aWRlciA9IG5ldyBSZWZlcmVuY2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVmZXJlbmNlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUl0ZW1Qcm92aWRlciBwcm9wZXJ0eUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9wZXJ0eUFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9wZXJ0eUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0eUl0ZW1Qcm92aWRlciA9IG5ldyBQcm9wZXJ0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9wZXJ0eUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEdyYXBoRWRnZUl0ZW1Qcm92aWRlciBncmFwaEVkZ2VJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdyYXBoRWRnZUFkYXB0ZXIoKSB7Ci0JCWlmIChncmFwaEVkZ2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZ3JhcGhFZGdlSXRlbVByb3ZpZGVyID0gbmV3IEdyYXBoRWRnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBncmFwaEVkZ2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW19IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ3JhbUl0ZW1Qcm92aWRlciBkaWFncmFtSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlhZ3JhbUFkYXB0ZXIoKSB7Ci0JCWlmIChkaWFncmFtSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRpYWdyYW1JdGVtUHJvdmlkZXIgPSBuZXcgRGlhZ3JhbUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkaWFncmFtSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3JhcGhOb2RlSXRlbVByb3ZpZGVyIGdyYXBoTm9kZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3JhcGhOb2RlQWRhcHRlcigpIHsKLQkJaWYgKGdyYXBoTm9kZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlncmFwaE5vZGVJdGVtUHJvdmlkZXIgPSBuZXcgR3JhcGhOb2RlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGdyYXBoTm9kZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnR9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJdGVtUHJvdmlkZXIgc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRBZGFwdGVyKCkgewotCQlpZiAoc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJdGVtUHJvdmlkZXIgPSBuZXcgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFVNQVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIgdW1hU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2VBZGFwdGVyKCkgewotCQlpZiAodW1hU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl1bWFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyID0gbmV3IFVNQVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHVtYVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyIGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlQWRhcHRlcigpIHsKLQkJaWYgKGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyID0gbmV3IENvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnR9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIgdGV4dEVsZW1lbnRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGV4dEVsZW1lbnRBZGFwdGVyKCkgewotCQlpZiAodGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIgPSBuZXcgVGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdGV4dEVsZW1lbnRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlSXRlbVByb3ZpZGVyIGltYWdlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUltYWdlQWRhcHRlcigpIHsKLQkJaWYgKGltYWdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWltYWdlSXRlbVByb3ZpZGVyID0gbmV3IEltYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb2x5bGluZUl0ZW1Qcm92aWRlciBwb2x5bGluZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb2x5bGluZUFkYXB0ZXIoKSB7Ci0JCWlmIChwb2x5bGluZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwb2x5bGluZUl0ZW1Qcm92aWRlciA9IG5ldyBQb2x5bGluZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwb2x5bGluZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFbGxpcHNlSXRlbVByb3ZpZGVyIGVsbGlwc2VJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFbGxpcHNlQWRhcHRlcigpIHsKLQkJaWYgKGVsbGlwc2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZWxsaXBzZUl0ZW1Qcm92aWRlciA9IG5ldyBFbGxpcHNlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGVsbGlwc2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5SXRlbVByb3ZpZGVyIGFjdGl2aXR5SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJaWYgKGFjdGl2aXR5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWFjdGl2aXR5SXRlbVByb3ZpZGVyID0gbmV3IEFjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGFjdGl2aXR5SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWlsZXN0b25lSXRlbVByb3ZpZGVyIG1pbGVzdG9uZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpIHsKLQkJaWYgKG1pbGVzdG9uZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQltaWxlc3RvbmVJdGVtUHJvdmlkZXIgPSBuZXcgTWlsZXN0b25lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG1pbGVzdG9uZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9ufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdGlvbkl0ZW1Qcm92aWRlciBpdGVyYXRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChpdGVyYXRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJaXRlcmF0aW9uSXRlbVByb3ZpZGVyID0gbmV3IEl0ZXJhdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBpdGVyYXRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBoYXNlSXRlbVByb3ZpZGVyIHBoYXNlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBoYXNlQWRhcHRlcigpIHsKLQkJaWYgKHBoYXNlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXBoYXNlSXRlbVByb3ZpZGVyID0gbmV3IFBoYXNlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHBoYXNlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUZWFtUHJvZmlsZUl0ZW1Qcm92aWRlciB0ZWFtUHJvZmlsZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKSB7Ci0JCWlmICh0ZWFtUHJvZmlsZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl0ZWFtUHJvZmlsZUl0ZW1Qcm92aWRlciA9IG5ldyBUZWFtUHJvZmlsZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB0ZWFtUHJvZmlsZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3J9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgcm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlpZiAocm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgPSBuZXcgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrT3JkZXJJdGVtUHJvdmlkZXIgd29ya09yZGVySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrT3JkZXJBZGFwdGVyKCkgewotCQlpZiAod29ya09yZGVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdvcmtPcmRlckl0ZW1Qcm92aWRlciA9IG5ldyBXb3JrT3JkZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd29ya09yZGVySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGF9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGxhbm5pbmdEYXRhSXRlbVByb3ZpZGVyIHBsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGxhbm5pbmdEYXRhQWRhcHRlcigpIHsKLQkJaWYgKHBsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwbGFubmluZ0RhdGFJdGVtUHJvdmlkZXIgPSBuZXcgUGxhbm5pbmdEYXRhSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHBsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3J9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgdGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlpZiAodGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgPSBuZXcgVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgd29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlpZiAod29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciA9IG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyIGNvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wb3NpdGVSb2xlQWRhcHRlcigpIHsKLQkJaWYgKGNvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlciA9IG5ldyBDb21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGFjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKGFjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJYWN0aXZpdHlEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBBY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBhY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgcHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAocHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9ufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBkZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChkZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRvckRlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID0gbmV3IERlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGVzY3JpcHRvckRlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbmNlcHRJdGVtUHJvdmlkZXIgY29uY2VwdEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbmNlcHRBZGFwdGVyKCkgewotCQlpZiAoY29uY2VwdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb25jZXB0SXRlbVByb3ZpZGVyID0gbmV3IENvbmNlcHRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29uY2VwdEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENoZWNrbGlzdEl0ZW1Qcm92aWRlciBjaGVja2xpc3RJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNoZWNrbGlzdEFkYXB0ZXIoKSB7Ci0JCWlmIChjaGVja2xpc3RJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY2hlY2tsaXN0SXRlbVByb3ZpZGVyID0gbmV3IENoZWNrbGlzdEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjaGVja2xpc3RJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXhhbXBsZUl0ZW1Qcm92aWRlciBleGFtcGxlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXhhbXBsZUFkYXB0ZXIoKSB7Ci0JCWlmIChleGFtcGxlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWV4YW1wbGVJdGVtUHJvdmlkZXIgPSBuZXcgRXhhbXBsZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBleGFtcGxlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3VpZGVsaW5lSXRlbVByb3ZpZGVyIGd1aWRlbGluZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGVsaW5lQWRhcHRlcigpIHsKLQkJaWYgKGd1aWRlbGluZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlndWlkZWxpbmVJdGVtUHJvdmlkZXIgPSBuZXcgR3VpZGVsaW5lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGd1aWRlbGluZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlciBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9uc0FkYXB0ZXIoKSB7Ci0JCWlmIChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyID0gbmV3IEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnR9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVwb3J0SXRlbVByb3ZpZGVyIHJlcG9ydEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVwb3J0QWRhcHRlcigpIHsKLQkJaWYgKHJlcG9ydEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyZXBvcnRJdGVtUHJvdmlkZXIgPSBuZXcgUmVwb3J0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJlcG9ydEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVtcGxhdGVJdGVtUHJvdmlkZXIgdGVtcGxhdGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVtcGxhdGVBZGFwdGVyKCkgewotCQlpZiAodGVtcGxhdGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGVtcGxhdGVJdGVtUHJvdmlkZXIgPSBuZXcgVGVtcGxhdGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdGVtcGxhdGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdXBwb3J0aW5nTWF0ZXJpYWxJdGVtUHJvdmlkZXIgc3VwcG9ydGluZ01hdGVyaWFsSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWxBZGFwdGVyKCkgewotCQlpZiAoc3VwcG9ydGluZ01hdGVyaWFsSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXN1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlciA9IG5ldyBTdXBwb3J0aW5nTWF0ZXJpYWxJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUb29sTWVudG9ySXRlbVByb3ZpZGVyIHRvb2xNZW50b3JJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUb29sTWVudG9yQWRhcHRlcigpIHsKLQkJaWYgKHRvb2xNZW50b3JJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdG9vbE1lbnRvckl0ZW1Qcm92aWRlciA9IG5ldyBUb29sTWVudG9ySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHRvb2xNZW50b3JJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXJ9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2hpdGVwYXBlckl0ZW1Qcm92aWRlciB3aGl0ZXBhcGVySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2hpdGVwYXBlckFkYXB0ZXIoKSB7Ci0JCWlmICh3aGl0ZXBhcGVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdoaXRlcGFwZXJJdGVtUHJvdmlkZXIgPSBuZXcgV2hpdGVwYXBlckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3aGl0ZXBhcGVySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlciB0ZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZXJtRGVmaW5pdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmICh0ZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl0ZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBUZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB0ZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2V9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJhY3RpY2VJdGVtUHJvdmlkZXIgcHJhY3RpY2VJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJhY3RpY2VBZGFwdGVyKCkgewotCQlpZiAocHJhY3RpY2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJhY3RpY2VJdGVtUHJvdmlkZXIgPSBuZXcgUHJhY3RpY2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJhY3RpY2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXR9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlciByZXVzYWJsZUFzc2V0SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmV1c2FibGVBc3NldEFkYXB0ZXIoKSB7Ci0JCWlmIChyZXVzYWJsZUFzc2V0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJldXNhYmxlQXNzZXRJdGVtUHJvdmlkZXIgPSBuZXcgUmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiByZXVzYWJsZUFzc2V0SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdGF0ZUl0ZW1Qcm92aWRlciBzdGF0ZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGF0ZUFkYXB0ZXIoKSB7Ci0JCWlmIChzdGF0ZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzdGF0ZUl0ZW1Qcm92aWRlciA9IG5ldyBTdGF0ZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzdGF0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmVydGV4fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFZlcnRleEl0ZW1Qcm92aWRlciB2ZXJ0ZXhJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXh9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVZlcnRleEFkYXB0ZXIoKSB7Ci0JCWlmICh2ZXJ0ZXhJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdmVydGV4SXRlbVByb3ZpZGVyID0gbmV3IFZlcnRleEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB2ZXJ0ZXhJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZWdpb25JdGVtUHJvdmlkZXIgcmVnaW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZWdpb25BZGFwdGVyKCkgewotCQlpZiAocmVnaW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJlZ2lvbkl0ZW1Qcm92aWRlciA9IG5ldyBSZWdpb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVnaW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZU1hY2hpbmV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RhdGVNYWNoaW5lSXRlbVByb3ZpZGVyIHN0YXRlTWFjaGluZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlTWFjaGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RhdGVNYWNoaW5lQWRhcHRlcigpIHsKLQkJaWYgKHN0YXRlTWFjaGluZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzdGF0ZU1hY2hpbmVJdGVtUHJvdmlkZXIgPSBuZXcgU3RhdGVNYWNoaW5lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHN0YXRlTWFjaGluZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUcmFuc2l0aW9uSXRlbVByb3ZpZGVyIHRyYW5zaXRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUcmFuc2l0aW9uQWRhcHRlcigpIHsKLQkJaWYgKHRyYW5zaXRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdHJhbnNpdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBUcmFuc2l0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHRyYW5zaXRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBzZXVkb1N0YXRlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBzZXVkb1N0YXRlSXRlbVByb3ZpZGVyIHBzZXVkb1N0YXRlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHNldWRvU3RhdGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBzZXVkb1N0YXRlQWRhcHRlcigpIHsKLQkJaWYgKHBzZXVkb1N0YXRlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXBzZXVkb1N0YXRlSXRlbVByb3ZpZGVyID0gbmV3IFBzZXVkb1N0YXRlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHBzZXVkb1N0YXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIgZGlzY2lwbGluZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVBZGFwdGVyKCkgewotCQlpZiAoZGlzY2lwbGluZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkaXNjaXBsaW5lSXRlbVByb3ZpZGVyID0gbmV3IERpc2NpcGxpbmVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGlzY2lwbGluZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlU2V0SXRlbVByb3ZpZGVyIHJvbGVTZXRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0QWRhcHRlcigpIHsKLQkJaWYgKHJvbGVTZXRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcm9sZVNldEl0ZW1Qcm92aWRlciA9IG5ldyBSb2xlU2V0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJvbGVTZXRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEb21haW5JdGVtUHJvdmlkZXIgZG9tYWluSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWlufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEb21haW5BZGFwdGVyKCkgewotCQlpZiAoZG9tYWluSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRvbWFpbkl0ZW1Qcm92aWRlciA9IG5ldyBEb21haW5JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZG9tYWluSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyIHdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3RUeXBlQWRhcHRlcigpIHsKLQkJaWYgKHdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciBkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyID0gbmV3IERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRvb2xJdGVtUHJvdmlkZXIgdG9vbEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2x9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRvb2xBZGFwdGVyKCkgewotCQlpZiAodG9vbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl0b29sSXRlbVByb3ZpZGVyID0gbmV3IFRvb2xJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdG9vbEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlciByb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTZXRHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChyb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyID0gbmV3IFJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiByb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyIGN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUN1c3RvbUNhdGVnb3J5QWRhcHRlcigpIHsKLQkJaWYgKGN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyID0gbmV3IEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciBjYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCWlmIChjYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciA9IG5ldyBDYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc30gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgZGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlpZiAoZGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlciA9IG5ldyBEZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlciBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXB9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9hZG1hcEl0ZW1Qcm92aWRlciByb2FkbWFwSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9hZG1hcEFkYXB0ZXIoKSB7Ci0JCWlmIChyb2FkbWFwSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJvYWRtYXBJdGVtUHJvdmlkZXIgPSBuZXcgUm9hZG1hcEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiByb2FkbWFwSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBjb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50UGFja2FnZUFkYXB0ZXIoKSB7Ci0JCWlmIChjb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciA9IG5ldyBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyIHByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50QWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciBwcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlQWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlciBwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgbWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2lufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RQbHVnaW5BZGFwdGVyKCkgewotCQlpZiAobWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciA9IG5ldyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdGlvbkl0ZW1Qcm92aWRlciBzZWN0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChzZWN0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlY3Rpb25JdGVtUHJvdmlkZXIgPSBuZXcgU2VjdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzZWN0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9ufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgYXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAoYXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlhcnRpZmFjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID0gbmV3IEFydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGFydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciB3b3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGVsaXZlcmFibGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIHJvbGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKHJvbGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyb2xlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgUm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJvbGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9ufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciB0YXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmICh0YXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGFza0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID0gbmV3IFRhc2tEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB0YXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBndWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChndWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWd1aWRhbmNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgR3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZ3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIHByYWN0aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKHByYWN0aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJhY3RpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBQcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9ufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIgbWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25BZGFwdGVyKCkgewotCQlpZiAobWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQltZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyID0gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHl9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlciBwcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0ZhbWlseUFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgbWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZExpYnJhcnlBZGFwdGVyKCkgewotCQlpZiAobWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQltZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyID0gbmV3IE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkKLQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoCi0JCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKSB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3Vic3RpdHV0ZXMgdGhlIGZhY3RvcnkgaXRzZWxmIGFzIHRoZSBrZXkgZm9yIHRoZSBhZGFwdGVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwZXIuYWRhcHQobm90aWZpZXIsIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykKLQkJCQkJfHwgKCgoQ2xhc3MpIHR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn0gYW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQotCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgZGlzcG9zZXMgYWxsIG9mIHRoZSBpdGVtIHByb3ZpZGVycyBjcmVhdGVkIGJ5IHRoaXMgZmFjdG9yeS4gCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHBhY2thZ2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXBhY2thZ2VJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoY29uc3RyYWludEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJY29uc3RyYWludEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChtZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCW1ldGhvZEVsZW1lbnRQcm9wZXJ0eUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChjb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChzZWN0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlzZWN0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJvbGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJvbGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodGFza0l0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJdGFza0l0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChzdGVwSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlzdGVwSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGFydGlmYWN0SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlhcnRpZmFjdEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChkZWxpdmVyYWJsZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZGVsaXZlcmFibGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAob3V0Y29tZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJb3V0Y29tZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChjb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJY29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoYXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJYXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh3b3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl3b3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlyb2xlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodGFza0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl0YXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZ3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZ3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHBvaW50SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwb2ludEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChkaWFncmFtTGlua0l0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZGlhZ3JhbUxpbmtJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZ3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWdyYXBoQ29ubmVjdG9ySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRpbWVuc2lvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZGltZW5zaW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJlZmVyZW5jZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcmVmZXJlbmNlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHByb3BlcnR5SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwcm9wZXJ0eUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChncmFwaEVkZ2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWdyYXBoRWRnZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChkaWFncmFtSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkaWFncmFtSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGdyYXBoTm9kZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZ3JhcGhOb2RlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh1bWFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl1bWFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQljb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh0ZXh0RWxlbWVudEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJdGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoaW1hZ2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWltYWdlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHBvbHlsaW5lSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwb2x5bGluZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChlbGxpcHNlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQllbGxpcHNlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGFjdGl2aXR5SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlhY3Rpdml0eUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChtaWxlc3RvbmVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCW1pbGVzdG9uZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChpdGVyYXRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWl0ZXJhdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwaGFzZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcGhhc2VJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXRlYW1Qcm9maWxlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlyb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh3b3JrT3JkZXJJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXdvcmtPcmRlckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwbGFubmluZ0RhdGFJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXBsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh3b3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh0YXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJdGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoY29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJY29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChhY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlhY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChkZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChjb25jZXB0SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQljb25jZXB0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGNoZWNrbGlzdEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJY2hlY2tsaXN0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGV4YW1wbGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWV4YW1wbGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZ3VpZGVsaW5lSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlndWlkZWxpbmVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocmVwb3J0SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXBvcnRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodGVtcGxhdGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXRlbXBsYXRlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHN1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJc3VwcG9ydGluZ01hdGVyaWFsSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHRvb2xNZW50b3JJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXRvb2xNZW50b3JJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAod2hpdGVwYXBlckl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJd2hpdGVwYXBlckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh0ZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJdGVybURlZmluaXRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocHJhY3RpY2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXByYWN0aWNlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGVzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJldXNhYmxlQXNzZXRJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJldXNhYmxlQXNzZXRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoc3RhdGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXN0YXRlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHZlcnRleEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJdmVydGV4SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJlZ2lvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcmVnaW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHN0YXRlTWFjaGluZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJc3RhdGVNYWNoaW5lSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHRyYW5zaXRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXRyYW5zaXRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocHNldWRvU3RhdGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXBzZXVkb1N0YXRlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRpc2NpcGxpbmVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRpc2NpcGxpbmVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocm9sZVNldEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcm9sZVNldEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChkb21haW5JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRvbWFpbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh3b3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh0b29sSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl0b29sSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQljdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChkZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChjYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJY2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJvYWRtYXBJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJvYWRtYXBJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAobWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQltZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAobWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJbWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKG1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCW1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVmFyaWFiaWxpdHlFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9WYXJpYWJpbGl0eUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmYzYTEwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9WYXJpYWJpbGl0eUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFZhcmlhYmlsaXR5RWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eUVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRWYXJpYWJpbGl0eVR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZhcmlhYmlsaXR5IFR5cGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWYXJpYWJpbGl0eVR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5VHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eVR5cGVfZmVhdHVyZSIsICJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUiLCAiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVmFyaWFiaWxpdHlFbGVtZW50LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1ZhcmlhYmlsaXR5RWxlbWVudCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFZhcmlhYmlsaXR5RWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1ZlcnRleEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVmVydGV4SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVkMjMyOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVmVydGV4SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBWZXJ0ZXhJdGVtUHJvdmlkZXIuamF2YSx2IDEuNCAyMDA2LzA5LzA3IDAwOjA2OjM5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZlcnRleH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVmVydGV4SXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZlcnRleEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZE91dGdvaW5nUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRJbmNvbWluZ1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgT3V0Z29pbmcgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRPdXRnb2luZ1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9WZXJ0ZXhfb3V0Z29pbmdfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WZXJ0ZXhfb3V0Z29pbmdfZmVhdHVyZSIsICJfVUlfVmVydGV4X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVkVSVEVYX19PVVRHT0lORywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbmNvbWluZyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEluY29taW5nUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ZlcnRleF9pbmNvbWluZ19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ZlcnRleF9pbmNvbWluZ19mZWF0dXJlIiwgIl9VSV9WZXJ0ZXhfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5WRVJURVhfX0lOQ09NSU5HLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFZlcnRleC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9WZXJ0ZXgiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRTdHJpbmcoIl9VSV9WZXJ0ZXhfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV2hpdGVwYXBlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV2hpdGVwYXBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMjE3Y2YzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1doaXRlcGFwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2hpdGVwYXBlckl0ZW1Qcm92aWRlciBleHRlbmRzIENvbmNlcHRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXaGl0ZXBhcGVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV2hpdGVwYXBlci5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9XaGl0ZXBhcGVyIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdoaXRlcGFwZXIpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV2hpdGVwYXBlcl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfV2hpdGVwYXBlcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwYmQxYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElzUmVwZWF0YWJsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSXNPbmdvaW5nUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRJc0V2ZW50RHJpdmVuUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRMaW5rVG9QcmVkZWNlc3NvclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgUmVwZWF0YWJsZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElzUmVwZWF0YWJsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc1JlcGVhdGFibGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc1JlcGVhdGFibGVfZmVhdHVyZSIsICJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElzIE9uZ29pbmcgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc09uZ29pbmdQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNPbmdvaW5nX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNPbmdvaW5nX2ZlYXR1cmUiLCAiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJcyBFdmVudCBEcml2ZW4gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc0V2ZW50RHJpdmVuUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzRXZlbnREcml2ZW5fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc0V2ZW50RHJpdmVuX2ZlYXR1cmUiLCAiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExpbmsgVG8gUHJlZGVjZXNzb3IgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaW5rVG9QcmVkZWNlc3NvclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9saW5rVG9QcmVkZWNlc3Nvcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2xpbmtUb1ByZWRlY2Vzc29yX2ZlYXR1cmUiLCAiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXb3JrQnJlYWtkb3duRWxlbWVudC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Xb3JrQnJlYWtkb3duRWxlbWVudCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXb3JrQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRToKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc6Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtEZWZpbml0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrRGVmaW5pdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOTczZTYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtEZWZpbml0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb247Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrRGVmaW5pdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrRGVmaW5pdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04pOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV29ya0RlZmluaXRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvV29ya0RlZmluaXRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV29ya0RlZmluaXRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV29ya0RlZmluaXRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1dvcmtEZWZpbml0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXb3JrRGVmaW5pdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04KLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrT3JkZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtPcmRlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZDBmNmFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtPcmRlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya09yZGVySXRlbVByb3ZpZGVyIGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrT3JkZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRMaW5rVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUHJlZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTGluayBUeXBlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlua1R5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya09yZGVyX2xpbmtUeXBlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya09yZGVyX2xpbmtUeXBlX2ZlYXR1cmUiLCAiX1VJX1dvcmtPcmRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfT1JERVJfX0xJTktfVFlQRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcmVkIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJlZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrT3JkZXJfcHJlZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtPcmRlcl9wcmVkX2ZlYXR1cmUiLCAiX1VJX1dvcmtPcmRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfT1JERVJfX1BSRUQsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV29ya09yZGVyLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1dvcmtPcmRlciIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXb3JrT3JkZXIpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV29ya09yZGVyX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrT3JkZXJfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdvcmtPcmRlci5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya1Byb2R1Y3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya1Byb2R1Y3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyOTRiOWE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRFeHRlcm5hbElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQdXJwb3NlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRJbXBhY3RPZk5vdEhhdmluZ1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmVhc29uc0Zvck5vdE5lZWRpbmdQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEV4dGVybmFsIElkIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXh0ZXJuYWxJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX2V4dGVybmFsSWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX2V4dGVybmFsSWRfZmVhdHVyZSIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHVycG9zZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFB1cnBvc2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0UsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSW1wYWN0IE9mIE5vdCBIYXZpbmcgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbXBhY3RPZk5vdEhhdmluZ1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX2ltcGFjdE9mTm90SGF2aW5nX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9pbXBhY3RPZk5vdEhhdmluZ19mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZWFzb25zIEZvciBOb3QgTmVlZGluZyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlYXNvbnNGb3JOb3ROZWVkaW5nUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcmVhc29uc0Zvck5vdE5lZWRpbmdfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3JlYXNvbnNGb3JOb3ROZWVkaW5nX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXb3JrUHJvZHVjdERlc2NyaXB0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzoKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIxY2VmODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQWN0aXZpdHlFbnRyeVN0YXRlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRBY3Rpdml0eUV4aXRTdGF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkV29ya1Byb2R1Y3RQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEltcGFjdGVkQnlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEltcGFjdHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZERlbGl2ZXJhYmxlUGFydHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWN0aXZpdHlFbnRyeVN0YXRlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUVudHJ5U3RhdGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFbnRyeVN0YXRlX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBY3Rpdml0eSBFeGl0IFN0YXRlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWN0aXZpdHlFeGl0U3RhdGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RXhpdFN0YXRlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RXhpdFN0YXRlX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdvcmsgUHJvZHVjdCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdvcmtQcm9kdWN0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdF9mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEltcGFjdGVkIEJ5IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW1wYWN0ZWRCeVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0ZWRCeV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RlZEJ5X2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbXBhY3RzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW1wYWN0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RzX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlbGl2ZXJhYmxlIFBhcnRzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVsaXZlcmFibGVQYXJ0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfZGVsaXZlcmFibGVQYXJ0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9kZWxpdmVyYWJsZVBhcnRzX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtQcm9kdWN0SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrUHJvZHVjdEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOGFhYjYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtQcm9kdWN0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50RWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUmVwb3J0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVGVtcGxhdGVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRUb29sTWVudG9yc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZXBvcnRzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVwb3J0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdF9yZXBvcnRzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3RfcmVwb3J0c19mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9fUkVQT1JUUywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUZW1wbGF0ZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUZW1wbGF0ZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RfdGVtcGxhdGVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3RfdGVtcGxhdGVzX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX19URU1QTEFURVMsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVG9vbCBNZW50b3JzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9vbE1lbnRvcnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RfdG9vbE1lbnRvcnNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdF90b29sTWVudG9yc19mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RfZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3RfZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdvcmtQcm9kdWN0LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1dvcmtQcm9kdWN0IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdvcmtQcm9kdWN0KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmUxYzVjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFdvcmtQcm9kdWN0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV29yayBQcm9kdWN0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdvcmtQcm9kdWN0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVfd29ya1Byb2R1Y3RzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3RUeXBlX3dvcmtQcm9kdWN0c19mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdFR5cGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXb3JrUHJvZHVjdFR5cGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RUeXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdvcmtQcm9kdWN0VHlwZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkM2Y4ZWJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGl0ZW0gcHJvdmlkZXJzIGZvciBkaXNwbGF5aW5nIGFuZCBlZGl0aW5nIHRoZSBVTUEgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NmUyN2ZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi51bWE8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MzQ2MmU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYudW1hO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnVtYSwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMmJhZmQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4yL3VtYS5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMi91bWEuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRhNTgwOTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4yL3VtYS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDEyMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0idW1hIgotICAgIG5zVVJJPSJodHRwOi8vd3d3LmlibS5jb20vdW1hLzEuMC4yL3VtYS5lY29yZSIgbnNQcmVmaXg9ImNvbS5pYm0udW1hIj4KLSAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IjAzIi8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRhdGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuRGF0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIG9mIHRoZSB0eXBlIERhdGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVyaSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubmV0LlVSSSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIHRoYXQgcG9pbnQgdG8gcmVzb3VyY2VzIHN1Y2ggYXMgZmlsZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVubGltaXRlZE5hdHVyYWwiIGluc3RhbmNlQ2xhc3NOYW1lPSJpbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTdHJpbmciIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU2V0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLlNldCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlNlcXVlbmNlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkxpc3QiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJJbnRlZ2VyIiBpbnN0YW5jZUNsYXNzTmFtZT0iaW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2xhc3NpZmllciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9UeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgQ2xhc3NpZmllci4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVHlwZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5hbWVkRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC4gIERlZmluZWQgdGhhdCBldmVyeSBlbGVtZW50IGhhcyBhIG5hbWUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQYWNrYWdlYWJsZUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL05hbWVkRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2FibGUgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVzcGFjZSAjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOYW1lc3BhY2UiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZXNwYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgY2xhc3MgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gaXMgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMgTWV0aG9kIEVsZW1lbnQgaXMgdGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgY2xhc3NlcyBhbmQgZGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgZXZlcnkgb3RoZXIgZWxlbWVudCB0eXBlIG9mIHRoaXMgbW9kZWwuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS4gIE1ldGhvZCBFbGVtZW50IGluaGVyaXRzIHRoZSBOYW1lIGF0dHJpYnV0ZSBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQncyBzdXBlciBjbGFzcy4gIEV2ZXJ5IGVsZW1lbnQgZGVmaW5lZCBhcyBhIFVNQSBpbnN0YW5jZSBpcyBkZXJpdmVkIGZyb20gTW9kZWwgRWxlbWVudC4gIEV2ZXJ5IE1ldGhvZCBFbGVtZW50IGluLXN0YW5jZSBpcyBhdCBsZWFzdCBkZWZpbmVkIGJ5IGEgdW5pcXVlIGlkLCBhIG5hbWUsIGFzIHdlbGwgYXMgYnJpZWYgZGVzY3JpcHRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imd1aWQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IGhhcyBhIGdsb2JhbCB1bmlxdWUgaWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im93bmVkUnVsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnN0cmFpbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cHByZXNzZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSBFeHRlbmRzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHRoZW4gdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgaW5oZXJpdGVkIE1ldGhvZCBFbGVtZW50cyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCwgd2hpY2ggY2FuIGJlIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIG9uIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0aGFuIGFuIGluaGVyaXRlZCBtZXRob2QgZWxlbWVudCB0aGVuIGl0IHdpbGwgbm90IGJlIHJlZ2FyZGVkIGFzIGluaGVyaXRlZCBhdCBhbGwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9yZGVyaW5nR3VpZGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnN0cmFpbnQiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbnN0cmFpbnQgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYm9keSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgc3RvcmVzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJhaW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50RWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmliYWJsZUVsZW1lbnQgIy8vVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250ZW50IEVsZW1lbnQgaXMgYSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuJiN4RDsmI3hBO0NvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uY2VwdHNBbmRQYXBlcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbmNlcHQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hlY2tsaXN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2hlY2tsaXN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imd1aWRlbGluZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0d1aWRlbGluZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleGFtcGxlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRXhhbXBsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3NldHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JldXNhYmxlQXNzZXQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50ICMvL0NsYXNzaWZpZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJhYmxlIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgTWV0aG9kIEVsZW1lbnRzIGZvciB3aGljaCBleHRlcm5hbCBwcmVzZW50YXRpb24gbmFtZXMgYXMgd2VsbCBhcyBjb250ZW50IGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCwgc3VjaCBhcyBSb2xlcyBvciBXb3JrIFByb2R1Y3RzLiAgUHJlc2VudGF0aW9uIE5hbWUgYW5kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFyZSB0eXBpY2FsbHkgbG9jYWxpemVkIHVzaW5nIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIGl0cyBTdHJpbmcgdHlwZSBhdHRyaWJ1dGVzLiYjeEQ7JiN4QTtUaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UgKHNlZSBTZWN0aW9uIDQuMS40KS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAmcXVvdDtydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50JnF1b3Q7IHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICZxdW90O2oyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQmcXVvdDsgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAmcXVvdDtBcmNoaXRlY3R1cmUgRG9jdW1lbnQmcXVvdDsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRhdGlvbiIgZVR5cGU9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2hhcGVpY29uIiBlVHlwZT0iIy8vVXJpIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub2RlaWNvbiIgZVR5cGU9IiMvL1VyaSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgRGVzY3JpcHRpb24gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQ29udGVudCBFbGVtZW50LiAgSXQgZGVmaW5lcyBzdGFuZGFyZCBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgZm9yIGFsbCBDb250ZW50IEVsZW1lbnQgdHlwZXMuICBTcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgc3ViLXR5cGVzIGNhbiBkZWZpbmUgdGhlaXIgb3duIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gc3ViLXR5cGVzLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBzdG9yZSB0aGUgbWFpbiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgQ29udGVudCBFbGVtZW50LiAgQWxsIHRleHQgdGhhdCBpcyBub3QgcGFydCBvZiBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlcyBzaGFsbCBiZSBzdG9yZWQgaGVyZS4gIElmIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGlzIGRpdmlkZWQgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgU2VjdGlvbiBjbGFzcywgdGhlbiBvbmx5IHRoZSB0ZXh0IGZyb20gdGhlICdzdGFydCcgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBzdG9yZWQgaGVyZSAoc2ltaWxhciB0byBhIG5vcm1hbCBkb2N1bWVudCB3aGVyZSB5b3UgY2FuIHBsYWNlIHRleHQgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIHRvIGl0cyBmaXJzdCBkaWN0aW9uIGhlYWRpbmcpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWN0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IktleSBDb25zaWRlcmF0aW9ucyBwcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VjdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1ZhcmlhYmlsaXR5RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBTZWN0aW9uIGlzIGEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWN0aW9uTmFtZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWN0aW9uRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlcyBzdG9yZSB0aGUgZGVzY3JpcHRpb24gdGV4dCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uJ3MgU2VjdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViU2VjdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlY2Vzc29yIiBlVHlwZT0iIy8vU2VjdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9sZSBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAmI3hEOyYjeEE7QSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibW9kaWZpZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0IiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3QiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgUHJvZHVjdCBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4mI3hEOyYjeEE7QSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVzdGltYXRlIiBlVHlwZT0iIy8vRXN0aW1hdGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlcG9ydHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlcG9ydCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZW1wbGF0ZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RlbXBsYXRlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRvb2xNZW50b3JzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Ub29sTWVudG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2siIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCAjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUYXNrIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uJiN4RDsmI3hBO0EgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuICYjeEQ7JiN4QTtBIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiAmI3hEOyYjeEE7Rm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICZxdW90O0RldmVsb3AgVXNlIENhc2UgTW9kZWwmcXVvdDsgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gZGV2ZWxvcCBhIGNvbXBsZXRlIHVzZSBjYXNlIG1vZGVsLiBUaGlzIHdvdWxkIGNvbXByaXNlIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBhbmQgbmFtaW5nIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLCB0aGUgd3JpdGluZyBvZiBhIGJyaWVmIGRlc2NyaXB0aW9uLCB0aGUgbW9kZWxpbmcgb2YgdXNlIGNhc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGluIGRpYWdyYW1zLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYSBiYXNpYyBmbG93LCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWx0ZXJuYXRpdmVzIGZsb3dzLCBwZXJmb3JtaW5nIG9mIHdhbGt0aHJvdWdocyB3b3Jrc2hvcHMgYW5kIHJldmlld3MsIGV0Yy4gIEFsbCBvZiB0aGVzZSBwYXJ0cyBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBnb2FsIG9mIGRldmVsb3BpbmcgdGhlIHVzZSBjYXNlIG1vZGVsLCBidXQgdGhlIHBhcnRzIHdpbGwgYmUgcGVyZm9ybWVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSBpbiBhIHByb2Nlc3MuICBJZGVudGlmaWNhdGlvbiwgbmFtaW5nLCBhbmQgYnJpZWYgZGVzY3JpcHRpb25zIHdvdWxkIGJlIHBlcmZvcm1lZCBlYXJseSBpbiBhIHR5cGljYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyB2ZXJzdXMgdGhlIHdyaXRpbmcgb2YgZGV0YWlsZWQgYWx0ZXJuYXRpdmUgZmxvd3Mgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkIG11Y2ggbGF0ZXIuICBBbGwgdGhlc2UgcGFydHMgb3Igc3RlcHMgd2l0aGluIHRoZSBzYW1lIFRhc2sgZGVmaW5lIHRoZSAmcXVvdDttZXRob2QmcXVvdDsgb2YgRGV2ZWxvcGluZyBhIFVzZSBDYXNlIE1vZGVsLiAgQXBwbHlpbmcgc3VjaCBhIG1ldGhvZCBpbiBhIGxpZmVjeWNsZSAoaS5lLiBpbiBhIHByb2Nlc3MpIGlzIGRlZmluaW5nIHdoaWNoIHN0ZXBzIGFyZSBkb25lIHdoZW4gZ29pbmcgZnJvbSBvbmUgaXRlcmF0aW9uIHRvIHRoZSBuZXh0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJmb3JtZWRCeSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dHB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3RlcHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N0ZXAiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIgotICAgICAgICBkZXJpdmVkPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRvb2xNZW50b3JzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Ub29sTWVudG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVzdGltYXRlIiBlVHlwZT0iIy8vRXN0aW1hdGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtEZWZpbml0aW9uIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgRGVmaW5pdGlvbiBpcyBhbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLiYjeEQ7JiN4QTtXb3JrIERlZmluaXRpb25zIHJlcHJlc2VudCBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgZG9pbmcgd29yay4gIFRoZXNlIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGFyZSBub3QgYm91bmQgdG8gb25lIHNwZWNpZmljIGNsYXNzaWZpZXIsIGJ1dCByZXByZXNlbnQgYW4gYXJiaXRyYXJ5IGRlZmluaXRpb24gb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZCBieSBhIHNwZWNpZmljIFJvbGUgKGUuZy4gYSBSb2xlIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBUYXNrIG9yIFN0ZXBzIG9mIGEgVGFzayksIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjbG9zZSBjb2xsYWJvcmF0aW9uIChtYW55IFJvbGVzIGFsbCB3b3JraW5nIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIGludGVyZGlzY2lwbGluYXJ5IFRhc2spLCBvciBjb21wbGV4IHdvcmsgdGhhdCBpcyBwZXJmb3JtZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIChlLmcuIGEgcHJvY2VzcyBkZWZpbmluZyBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgZm9yIG9yZ2FuaXppbmcgbGFyZ2VyIGNvbXBvc2l0ZSB1bml0cyBvZiB3b3JrIHBlcmZvcm1lZCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY29sbGFib3JhdGlvbikuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWNvbmRpdGlvbiIgZVR5cGU9IiMvL0NvbnN0cmFpbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBvc3Rjb25kaXRpb24iIGVUeXBlPSIjLy9Db25zdHJhaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdGVwIiBlU3VwZXJUeXBlcz0iIy8vU2VjdGlvbiAjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBTdGVwIGlzIGEgU2VjdGlvbiBhbmQgV29yayBEZWZpbml0aW9uIHRoYXQgaXMgdXNlZCB0byBvcmdhbml6ZSBUYXNrcyBpbnRvIHBhcnRzIG9yIHN1YnVuaXRzIG9mIHdvcmsuICBTdGVwcyBpbmhlcml0IHRoZSBzdWJTZWN0aW9ucyBkZWNvbXBvc2l0aW9uIGZyb20gU2VjdGlvbiBhbmQgY2FuIHRoZXJlZm9yZSBkZXNjcmliZSBTdWItU3RlcHMgbmVzdGVkIGludG8gU3RlcHMuJiN4RDsmI3hBO0EgU3RlcCBkZXNjcmliZXMgYSBtZWFuaW5nZnVsIGFuZCBjb25zaXN0IHBhcnQgb2YgdGhlIG92ZXJhbGwgd29yayBkZXNjcmliZWQgZm9yIGEgVGFzay4gIFRoZSBjb2xsZWN0aW9uIG9mIFN0ZXBzIGRlZmluZWQgZm9yIGEgVGFzayByZXByZXNlbnRzIGFsbCB0aGUgd29yayB0aGF0IHNob3VsZCBiZSBkb25lIHRvIGFjaGlldmUgdGhlIG92ZXJhbGwgZGV2ZWxvcG1lbnQgZ29hbCBvZiB0aGUgVGFzay4gIE5vdCBhbGwgc3RlcHMgYXJlIG5lY2Vzc2FyaWx5IHBlcmZvcm1lZCBlYWNoIHRpbWUgYSBUYXNrIGlzIGludm9rZWQgaW4gYSBQcm9jZXNzIChzZWUgVGFzayBEZXNjcmlwdG9yKSwgc28gdGhleSBjYW4gYWxzbyBiZSBleHByZXNzZWQgaW4gdGhlIGZvcm0gb2YgYWx0ZXJuYXRlICdmbG93cycgb2Ygd29yay4gIERpZmZlcmVudCB3YXlzIG9mIGFjaGlldmluZyB0aGUgc2FtZSBkZXZlbG9wbWVudCBnb2FsIGNhbiB0aGVuIGJlICdhc3NlbWJsZWQnIGJ5IHNlbGVjdGluZyBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIHN0ZXBzIHdoZW4gYXBwbHlpbmcgdGhlIFRhc2sgaW4gYSBQcm9jZXNzLiAgVHlwaWNhbCBraW5kcyBvZiBzdGVwcyBhIFRhc2sgYXV0aG9yIHNob3VsZCBjb25zaWRlciBhcmU6IFRoaW5raW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyB1bmRlcnN0YW5kIHRoZSBuYXR1cmUgb2YgdGhlIHRhc2ssIGdhdGhlcnMgYW5kIGV4YW1pbmVzIHRoZSBpbnB1dCBhcnRpZmFjdHMsIGFuZCBmb3JtdWxhdGVzIHRoZSBvdXRjb21lLiBQZXJmb3JtaW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBjcmVhdGUgb3IgdXBkYXRlIHNvbWUgYXJ0aWZhY3RzLiBSZXZpZXdpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGluc3BlY3RzIHRoZSByZXN1bHRzIGFnYWluc3Qgc29tZSBjcml0ZXJpYS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGFuY2UiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcnRpZmFjdCIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBcnRpZmFjdCBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLiYjeEQ7JiN4QTtBcnRpZmFjdHMgYXJlIHRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBUYXNrcy4gIEl0IG1heSBzZXJ2ZSBhcyBhIGJhc2lzIGZvciBkZWZpbmluZyByZXVzYWJsZSBhc3NldHMuICBSb2xlcyB1c2UgQXJ0aWZhY3RzIHRvIHBlcmZvcm0gVGFza3MgYW5kIHByb2R1Y2UgQXJ0aWZhY3RzIGluIHRoZSBjb3Vyc2Ugb2YgcGVyZm9ybWluZyBUYXNrcy4gIEFydGlmYWN0cyBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIFJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5IHRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQgaW4gdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25lIHJvbGUgbWlnaHQgJnF1b3Q7b3duJnF1b3Q7IGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lckFydGlmYWN0IiBlVHlwZT0iIy8vQXJ0aWZhY3QiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9BcnRpZmFjdC9jb250YWluZWRBcnRpZmFjdHMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVkQXJ0aWZhY3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BcnRpZmFjdCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vQXJ0aWZhY3QvY29udGFpbmVyQXJ0aWZhY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcmFibGUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBkZWxpdmVyYWJsZSBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlbGl2ZXJlZFdvcmtQcm9kdWN0cyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0Y29tZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBvdXRjb21lIGRlc2NyaWJlcyBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYSByZXN1bHQgb3Igc3RhdGUuIE91dGNvbWVzIG1heSBhbHNvIGJlIHVzZWQgdG8gZGVzY3JpYmUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBub3QgZm9ybWFsbHkgZGVmaW5lZC4gIEEga2V5IGRpZmZlcmVudGlhdG9yIGZvciBvdXRjb21lcyBhZ2FpbnN0IGFydGlmYWN0cyBpcyB0aGF0IG91dGNvbWVzIGFyZSBub3QgY2FuZGlkYXRlcyBmb3IgaGFydmVzdGluZyBhcyByZXVzYWJsZSBhc3NldHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFBhY2thZ2UiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCAjLy9QYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBQYWNrYWdlIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdsb2JhbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTWV0aG9kIFBhY2thZ2VzIGNhbiBoYXZlIGEgZ2xvYmFsIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgZXZlcnkgb3RoZXIgTWV0aG9kIFBhY2thZ2UgY2FuIHNlZSB0aGUgZ2xvYmFsIHBhY2thZ2UncyBjb250ZW50cy4gIEdsb2JhbCBNZXRob2QgUGFja2FnZXMgYXJlIHByaW1hcmlseSB1c2VkIHRvIHN0b3JlIGNvbW1vbmx5IHVzZWQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgc3VjaCBhcyBmb3IgRGlzY2lwbGluZXMgb3IgRG9tYWlucywgd2hpY2ggYXJlIHVzZWQgYnkgbWFueSBUYXNrIGFuZCBXb3JrIFByb2R1Y3RzIHJlc3BlY3RpdmVseS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmV1c2VkUGFja2FnZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGFyZW50UGFja2FnZSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9NZXRob2RQYWNrYWdlL2NoaWxkUGFja2FnZXMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hpbGRQYWNrYWdlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vTWV0aG9kUGFja2FnZS9wYXJlbnRQYWNrYWdlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb250ZW50IFBhY2thZ2UgaXMgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMgYW5kIENvbnRlbnQgRWxlbWVudHMsIG9ubHkuICBFeGFtcGxlcyBmb3IgQ29udGVudCBFbGVtZW50IGFyZSBBcnRpZmFjdHMsIFRhc2tzLCBSb2xlcywgZXRjLiAgQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudEVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50RWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJicmllZk91dGxpbmUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlcHJlc2VudGF0aW9uT3B0aW9ucyIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxJZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBhY3RPZk5vdEhhdmluZyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhc29uc0Zvck5vdE5lZWRpbmciIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJza2lsbHMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXNzaWdubWVudEFwcHJvYWNoZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3lub255bXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdGVybmF0aXZlcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXR0YWNobWVudHMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFkZGl0aW9uYWxJbmZvIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvYmxlbSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiYWNrZ3JvdW5kIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdvYWxzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXBwbGljYXRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbHNPZkFkb3B0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb2ludCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IngiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3NpdGlvbiIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZWQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW1FbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtRWxlbWVudC9jb250YWluZXIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGluayIgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbUxpbmsiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1MaW5rL2dyYXBoRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhbmNob3JhZ2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0dyYXBoQ29ubmVjdG9yIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VtYW50aWNNb2RlbCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZ3JhcGhFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW1FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1Zpc2libGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lciIgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9jb250YWluZWQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZWZlcmVuY2UiIGVPcHBvc2l0ZT0iIy8vUmVmZXJlbmNlL3JlZmVyZW5jZWQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvcGVydHkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtTGluayIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iem9vbSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2aWV3cG9ydCIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvbGluayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtL2RpYWdyYW1MaW5rIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoQ29ubmVjdG9yIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L2FuY2hvcmFnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVkZ2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0dyYXBoRWRnZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVkZ2UvYW5jaG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlbWFudGljTW9kZWxCcmlkZ2UiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlc2VudGF0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L3NlbWFudGljTW9kZWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbSIgZVR5cGU9IiMvL0RpYWdyYW0iCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtL25hbWVzcGFjZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaW1lbnNpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3aWR0aCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoZWlnaHQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVmZXJlbmNlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlZCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW1FbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1FbGVtZW50L3JlZmVyZW5jZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9wZXJ0eSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2V5IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaEVkZ2UiIGVTdXBlclR5cGVzPSIjLy9HcmFwaEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhbmNob3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIyIiB1cHBlckJvdW5kPSIyIiBlVHlwZT0iIy8vR3JhcGhDb25uZWN0b3IiIGVPcHBvc2l0ZT0iIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFZGdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndheXBvaW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjIiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUG9pbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW0iIGVTdXBlclR5cGVzPSIjLy9HcmFwaE5vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ6b29tIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZpZXdwb2ludCIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtTGluayIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlhZ3JhbUxpbmsiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUxpbmsvZGlhZ3JhbSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lc3BhY2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2RpYWdyYW0iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhOb2RlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2l6ZSIgZVR5cGU9IiMvL0RpbWVuc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZUluZm8iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9FbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxlYWZFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGV4dEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRleHQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbWFnZSIgZVN1cGVyVHlwZXM9IiMvL0xlYWZFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJpIiBlVHlwZT0iIy8vVXJpIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbWVUeXBlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhpY1ByaW1pdGl2ZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvbHlsaW5lIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhpY1ByaW1pdGl2ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsb3NlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2F5cG9pbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMiIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qb2ludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWxsaXBzZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoaWNQcmltaXRpdmUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYWRpdXNYIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhZGl1c1kiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm90YXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnRBbmdsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbmRBbmdsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjZW50ZXIiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZpdHkiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCAjLy9WYXJpYWJpbGl0eUVsZW1lbnQgIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEFjdGl2aXR5IGlzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4mI3hEOyYjeEE7QWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJyZWFrZG93bkVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0JyZWFrZG93bkVsZW1lbnQvc3VwZXJBY3Rpdml0aWVzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvYWRtYXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2FkbWFwIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGVja2xpc3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DaGVja2xpc3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uY2VwdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbmNlcHQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhhbXBsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0V4YW1wbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3VpZGVsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJldXNhYmxlQXNzZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaXMgYSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNSZXBlYXRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNPbmdvaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiB0aGUgaXNPbmdvaW5nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBpbnN0YW5jZSwgdGhlbiB0aGUgZWxlbWVudCBkZXNjcmliZXMgYW4gb25nb2luZyBwaWVjZSBvZiB3b3JrIHdpdGhvdXQgYSBmaXhlZCBkdXJhdGlvbiBvciBlbmQgc3RhdGUuICBGb3IgZXhhbXBsZSwgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIG9mIGFuIGFkbWluaXN0cmF0b3IgY29udGludW91c2x5IChlLmcuIDNoIGEgZGF5KSB3b3JraW5nIHRvIGVuc3VyZSB0aGF0IHN5c3RlbXMgYXJlIGtlcHQgaW4gYSBjZXJ0YWluIHN0YXRlLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHByb2dyYW0gbWFuYWdlbWVudCB3b3JrIG92ZXJzZWVpbmcgbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYmVpbmcgc2NoZWR1bGVkIGZvciBvbmUgcGFydGljdWxhciBwcm9qZWN0IGF0IHNwZWNpZmljIHJlb2NjdXJyaW5nIGludGVydmFscyBkdXJpbmcgdGhlIHdob2xlIGxpZmVjeWNsZSBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNFdmVudERyaXZlbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxpbmtUb1ByZWRlY2Vzc29yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrT3JkZXIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQnJlYWtkb3duRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQnJlYWtkb3duIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVmaXgiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByZWZpeCByZXByZXNlbnRzIGFuIGFkZGl0aW9uYWwgbGFiZWwgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhIHByZWZpeCB0byBhbnkgQnJlYWtkb3duIEVsZW1lbnQgdG8gaW5kaWNhdGUgYSB1c2VyLWRlZmluZWQgc3ViLXR5cGUgZm9yIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdvdWxkIGxpa2UgdG8gZGlzdGluZ3Vpc2ggaGlzIEFjdGl2aXRpZXMgYnkgJ01vZHVsZScgKGFzIGRvbmUgaW4gdGhlIElCTSBSYXRpb25hbCBTdW1taXQgQXNjZW5kYW50IE1ldGhvZCksIGhlIGNhbiBkZWZpbmUgYSBkaWZmZXJlbnQgcHJlZml4IGZvciBldmVyeSBtb2RlbCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG5hbWluZyBBY3Rpdml0aWVzLCBlLmcuICZxdW90O1NSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzJnF1b3Q7IHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICZxdW90O1NvZnR3YXJlIFJlcXVpcmVtZW50cyBBbmFseXNpcyZxdW90OyBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAmcXVvdDtDdXN0b21lci5BcmNoaXRlY3QmcXVvdDsgd291bGQgZGVmaW5lIGEgJnF1b3Q7Q3VzdG9tZXImcXVvdDsgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICZxdW90O0FyY2hpdGVjdCZxdW90OyBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1BsYW5uZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LiYjeEQ7JiN4QTsmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhhc011bHRpcGxlT2NjdXJyZW5jZXMiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikp1c3QgYXMgdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgdGhlIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBhbiBpbXBhY3Qgb24gZ2VuZXJhdGluZyBwbGFucyBmcm9tIGEgUHJvY2Vzcy4gIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhlbiBpdCB3aWxsIHR5cGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUgQWN0aXZpdHkuICBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV0YWlsIFVzZSBDYXNlJnF1b3Q7IHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09wdGlvbmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaXNPcHRpb25hbCBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIEJyZWFrZG93biBFbGVtZW50IGRlc2NyaWJlcyB3b3JrLCBhIHdvcmsgcmVzdWx0LCBvciBldmVuIHdvcmsgcmVzb3VyY2VzLCB3aGljaCBpbmNsdXNpb24gaXMgbm90IG1hbmRhdG9yeSB3aGVuIHBlcmZvcm1pbmcgYSBwcm9qZWN0IHRoYXQgaXMgcGxhbm5lZCBiYXNlZCBvbiBhIHByb2Nlc3MgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRlZEFmdGVyIiBlVHlwZT0iIy8vQnJlYWtkb3duRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50ZWRCZWZvcmUiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBsYW5uaW5nRGF0YSIgZVR5cGU9IiMvL1BsYW5uaW5nRGF0YSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwZXJBY3Rpdml0aWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BY3Rpdml0eSIgZU9wcG9zaXRlPSIjLy9BY3Rpdml0eS9icmVha2Rvd25FbGVtZW50cyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNaWxlc3RvbmUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNaWxlc3RvbmUgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJdGVyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSXRlcmF0aW9uIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuJiN4RDsmI3hBO0l0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQaGFzZSIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQaGFzZSBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLiYjeEQ7JiN4QTtQaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVhbVByb2ZpbGUiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRlYW0gUHJvZmlsZSBpcyBhIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuJiN4RDsmI3hBO1dvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4mI3hEOyYjeEE7SGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZWFtUm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cGVyVGVhbSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1RlYW1Qcm9maWxlIiBlT3Bwb3NpdGU9IiMvL1RlYW1Qcm9maWxlL3N1YlRlYW0iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViVGVhbSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGVhbVByb2ZpbGUiIGVPcHBvc2l0ZT0iIy8vVGVhbVByb2ZpbGUvc3VwZXJUZWFtIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJSb2xlIiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJmb3Jtc0FkZGl0aW9uYWxseSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFza0Rlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vVGFza0Rlc2NyaXB0b3IvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzaXN0c0luIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9UYXNrRGVzY3JpcHRvci9hc3Npc3RlZEJ5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZGlmaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci93b3JrZWRPbkJ5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBlcmZvcm1zQXNPd25lciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFza0Rlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vVGFza0Rlc2NyaXB0b3IvcGVyZm9ybWVkUHJpbWFyaWx5QnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzcG9uc2libGVGb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvcmVzcG9uc2libGVSb2xlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBPcmRlciByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEIpIGJlbG93KSBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEEpIGJlbG93KSBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9TdGFydCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9GaW5pc2giIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvU3RhcnQiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvRmluaXNoIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrT3JkZXIiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBPcmRlciBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgJiN4RDsmI3hBOyhOb3RlLCBXb3JrIE9yZGVyIGlzIG5vdCBtb2RlbGVkIGFzIGFuIEFzc29jaWF0aW9uIENsYXNzIHRvIHByb3ZpZGUgYSBzdHJhaWdodGZvcndhcmQgbWFwcGluZyAgdG8gWE1JIGFuZCBFTUYuKSYjeEQ7JiN4QTtUaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rVHlwZSIgZVR5cGU9IiMvL1dvcmtPcmRlclR5cGUiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZpbmlzaFRvU3RhcnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZCIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvY2VzcyBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuJiN4RDsmI3hBO1Byb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGxhbm5pbmdEYXRhIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlBsYW5uaW5nIERhdGEgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4mI3hEOyYjeEE7UGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LiYjeEQ7JiN4QTsoTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydERhdGUiIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoRGF0ZSIgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFuayIgZVR5cGU9IiMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVzY3JpcHRvciBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuJiN4RDsmI3hBO0Rlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50ICMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGFzayBEZXNjcmlwdG9yIGlzIGEgRGVzY3JpcHRvciBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiYjeEQ7JiN4QTtBIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlRhc2siIGVUeXBlPSIjLy9UYXNrIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Sb2xlRGVzY3JpcHRvci9wZXJmb3Jtc0FkZGl0aW9uYWxseSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3Npc3RlZEJ5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Sb2xlRGVzY3JpcHRvci9hc3Npc3RzSW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZXJuYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9leHRlcm5hbElucHV0VG8iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvbWFuZGF0b3J5SW5wdXRUbyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvcHRpb25hbElucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL09wdGlvbmFsSW5wdXRUbyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRwdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3Ivb3V0cHV0RnJvbSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJmb3JtZWRQcmltYXJpbHlCeSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIgotICAgICAgICBlT3Bwb3NpdGU9IiMvL1JvbGVEZXNjcmlwdG9yL3BlcmZvcm1zQXNPd25lciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWxlY3RlZFN0ZXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TZWN0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFdvcmsgUHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICAmI3hEOyYjeEE7Rm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3Rpdml0eUV4aXRTdGF0ZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuJiN4RDsmI3hBO0ZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iV29ya1Byb2R1Y3QiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlcm5hbElucHV0VG8iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1Rhc2tEZXNjcmlwdG9yL2V4dGVybmFsSW5wdXQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW1wYWN0ZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGFjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0ZWRCeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYW5kYXRvcnlJbnB1dFRvIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9UYXNrRGVzY3JpcHRvci9tYW5kYXRvcnlJbnB1dCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JrZWRPbkJ5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUm9sZURlc2NyaXB0b3IvbW9kaWZpZXMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iT3B0aW9uYWxJbnB1dFRvIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9UYXNrRGVzY3JpcHRvci9vcHRpb25hbElucHV0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dHB1dEZyb20iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1Rhc2tEZXNjcmlwdG9yL291dHB1dCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyYWJsZVBhcnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzcG9uc2libGVSb2xlIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiCi0gICAgICAgIGVPcHBvc2l0ZT0iIy8vUm9sZURlc2NyaXB0b3IvcmVzcG9uc2libGVGb3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29tcG9zaXRlUm9sZSIgZVN1cGVyVHlwZXM9IiMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbXBvc2l0ZSBSb2xlIGlzIGEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLiYjeEQ7JiN4QTtBIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWdncmVnYXRlZFJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlR3VpZGFuY2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx0ZXJuYXRpdmVzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJob3d0b1N0YWZmIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjYWxlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3RDaGFyYWN0ZXJpc3RpY3MiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3MiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmlza0xldmVsIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyB0eXBpY2FsIHByb2plY3Qgcmlza3MgdGhhdCBhcmUgYWRkcmVzc2VkIHdpdGggdGhpcyBwcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0aW5nVGVjaG5pcXVlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZU9mQ29udHJhY3QiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsSWQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBkZWxpdmVyeSBwYXR0ZXJucyBhbmQgbW9kZWxzLiBJdCBpcyB1c2VkIGxpa2UgYSBzeW5vbnltLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY29wZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlTm90ZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFueSBhZGRpdGlvbmFsIG5vdGVzIG9uIGhvdyB0byBhcHBseSBhbmQgaW5zdGFudGlhdGUgdGhpcyBwcm9jZXNzIGZvciBhIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaXB0b3JEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZmluZWREZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29uY2VwdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbmNlcHQgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gR3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2LWVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcy9hY3Rpdml0aWVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDaGVja2xpc3QiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDaGVja2xpc3QgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmktZmllZC4gIENoZWNrbGlzdHMgYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4YW1wbGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gRXhhbXBsZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGVsaW5lIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgR3VpZGVsaW5lIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVzdGltYXRlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEVzdGltYXRlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHByb3ZpZGVzIHNpemluZyBtZWFzdXJlcywgb3Igc3RhbmRhcmRzIGZvciBzaXppbmcgdGhlIHdvcmsgZWZmb3J0IGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIGEgcGFydGljdWxhciBwaWVjZSBvZiB3b3JrIGFuZCBpbnN0cnVjdGlvbnMgZm9yIHRoZWlyIHN1Y2Nlc3NmdWwgdXNlLiBJdCBtYXkgYmUgY29tcHJpc2VkIG9mIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbnMgYW5kIGVzdGltYXRpb24gbWV0cmljcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXN0aW1hdGlvbk1ldHJpYyIgZVR5cGU9IiMvL0VzdGltYXRpbmdNZXRyaWMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVzdGltYXRpb25Db25kZXJhdGlvbnMiCi0gICAgICAgIGVUeXBlPSIjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVzdGltYXRpbmdNZXRyaWMiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXN0aW1hdGlvbiBNZXRyaWMgZGVzY3JpYmVzIGEgbWV0cmljIG9yIG1lYXN1cmUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCBhbmQgd2hpY2ggaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHdvcmsgZWZmb3J0IGFzIHdlbGwgYXMgYSByYW5nZSBvZiBwb3RlbnRpYWwgbGFib3IuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zIHF1YWxpZnkgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVwb3J0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUmVwb3J0IGlzIGEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVtcGxhdGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUZW1wbGF0ZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1cHBvcnRpbmcgTWF0ZXJpYWxzIGlzIGNhdGNoYWxsIGZvciBvdGhlciB0eXBlcyBvZiBndWlkYW5jZSBub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgQ29udGVudCBFbGVtZW50cywgaS5lLiBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRvb2xNZW50b3IiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUb29sIE1lbnRvciBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yayBhIFdvcmsgUHJvZHVjdCBlaXRoZXIgaW4gdGhlIGNvbnRleHQgb2Ygb3IgaW5kZXBlbmRlbnQgZnJvbSBhIFRhc2sgb3IgQWN0aXZpdHkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldoaXRlcGFwZXIiIGVTdXBlclR5cGVzPSIjLy9Db25jZXB0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGl0ZXBhcGVycyBhcmUgYSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVybURlZmluaXRpb24iIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGVybURlZmluaXRpb25zIGRlZmluZSBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUaGV5IGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcmFjdGljZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByYWN0aWNlIHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAmcXVvdDtNYW5hZ2UgUmlza3MmcXVvdDssICZxdW90O0NvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSZxdW90OywgJnF1b3Q7QXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCZxdW90OywgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJQcmFjdGljZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1ByYWN0aWNlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250ZW50UmVmZXJlbmNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWN0aXZpdHlSZWZlcmVuY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BY3Rpdml0eSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXVzYWJsZUFzc2V0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUmV1c2FibGUgQXNzZXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZyYjeEQ7JiN4QTtob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaXNjaXBsaW5lIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuJiN4RDsmI3hBO0EgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFza3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2siLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlV29ya2Zsb3dzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BY3Rpdml0eSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgQ2F0ZWdvcnkgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVTZXQiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9sZSBTZXQgb3JnYW5pemVzIFJvbGVzIGludG8gY2F0ZWdvcmllcy4gIEl0IGlzIHVzZWQgdG8gZ3JvdXAgcm9sZXMgdG9nZXRoZXIgdGhhdCBoYXZlIGNlcnRhaW4gY29tbW9uYWxpdGllcy4gIEZvciBleGFtcGxlLCB0aGUgJnF1b3Q7QW5hbHlzdHMmcXVvdDsgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICZxdW90O0J1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCZxdW90OywgJnF1b3Q7U3lzdGVtIEFuYWx5c3QmcXVvdDssIGFzIHdlbGwgYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIFNwZWNpZmllciZxdW90OyByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRvbWFpbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRG9tYWluIGlzIGEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LiYjeEQ7JiN4QTtEb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JrUHJvZHVjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YmRvbWFpbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RvbWFpbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIFByb2R1Y3QgVHlwZSBpcyBhIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgJnF1b3Q7Q2xhc3MgRGlhZ3JhbSZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICZxdW90O1NwZWNpZmljYXRpb24mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtQcm9kdWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzY2lwbGluZUdyb3VwaW5nIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEaXNjaXBsaW5lIEdyb3VwaW5ncyBhcmUgdXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAmcXVvdDtTb2Z0d2FyZSBEaXNjaXBsaW5lcyZxdW90OyB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICZxdW90O1JlcXVpcmVtZW50cyBNYW5hZ2VtZW50JnF1b3Q7IG9yICZxdW90O1Rlc3RpbmcmcXVvdDs7ICZxdW90O0lUIEluZnJhc3RydWN0dXJlIE1hbmFnZW1lbnQmcXVvdDsgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAmcXVvdDtJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyZxdW90OywgJnF1b3Q7SVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyZxdW90Oywgb3IgJnF1b3Q7SVQgRW5hYmxpbmcgU2VydmljZXMmcXVvdDsuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpc2NpcGxpbmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaXNjaXBsaW5lIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRvb2wiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVG9vbCBpcyBhIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sTWVudG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlU2V0R3JvdXBpbmciIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9sZVNldHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVTZXQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ3VzdG9tIENhdGVnb3J5IGlzIGEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAmcXVvdDtUZXN0aW5nJnF1b3Q7IGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhdGVnb3JpemVkRWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJDYXRlZ29yaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZWxpdmVyeSBQcm9jZXNzZXMgaXMgYSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuJiN4RDsmI3hBO0EgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlZHVjYXRpb25NYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb21tdW5pY2F0aW9uc01hdGVyaWFscyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3MiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBpcyBhIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuJiN4RDsmI3hBO0NvcmUgTWV0aG9kIENvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgdmVyeSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVGh1cywgYSBwcm9jZXNzIGlzIGEgc2V0IG9mIHBhcnRpYWxseSBvcmRlcmVkIHdvcmsgZGVzY3JpcHRpb25zIGludGVuZGVkIHRvIHJlYWNoIGEgaGlnaGVyIGRldmVsb3BtZW50IGdvYWwsIHN1Y2ggYXMgdGhlIHJlbGVhc2Ugb2YgYSBzcGVjaWZpYyBzb2Z0d2FyZSBzeXN0ZW0uICBBIHByb2Nlc3MgYW5kIHRoZSBwcm9jZXNzIG1ldGEtbW9kZWwgc3RydWN0dXJlIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGZvY3VzZXMgb24gdGhlIGxpZmVjeWNsZSBhbmQgdGhlIHNlcXVlbmNpbmcgb2Ygd29yayBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRvIGFjaGlldmUgdGhpcyBpdCB1c2VzIHRoZSBEZXNjcmlwdG9yIGNvbmNlcHQgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIGFsbG93aW5nIGRlZmluaW5nIHRpbWUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgY29udGVudCAoZS5nLiBkZWZpbmluZyBhIGZvY3VzIG9uIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUgc2FtZSBUYXNrIGFuZCBwcm92aWRpbmcgaW5wdXQgV29yayBQcm9kdWN0cyBpbiBkaWZmZXJlbnQgc3RhdGVzIHdpdGhpbiB0aGUgZGlmZmVyZW50IFBoYXNlcyBvZiBhIHByb2Nlc3MgbGlmZWN5Y2xlIGluIHdoaWNoIHRoZSBzYW1lIFRhc2sgaXMgcGVyZm9ybWVkKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5jbHVkZXNQYXR0ZXJucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVmYXVsdENvbnRleHQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbGlkQ29udGV4dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4mI3hEOyYjeEE7QSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6JiN4RDsmI3hBOy0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuJiN4RDsmI3hBOy0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuJiN4RDsmI3hBOy0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4mI3hEOyYjeEE7QSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VkT25Qcm9jZXNzZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb2Nlc3MiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9hZG1hcCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvYWRtYXAgaXMgYSBzcGVjaWFsIEd1aWRhbmNlIFR5cGUgd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4mI3hEOyYjeEE7QW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50IiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc1BhY2thZ2UgIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBpcyBhIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuJiN4RDsmI3hBO1VNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAmcXVvdDtibGFjayBib3gmcXVvdDsuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICZxdW90O3JlYWxpemF0aW9uJnF1b3Q7IGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUHJvY2VzcyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm9jZXNzIFBhY2thZ2UgaXMgYSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4mI3hEOyYjeEE7QSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvY2Vzc0VsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9jZXNzRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW0iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZSBjb21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFza0Rlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZUlPIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBQcm9jZXNzIENvbXBvbmVudCBhcHBsaWNhdGlvbiBpbiBhIFByb2Nlc3MsIGkuZS4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIFByb2Nlc3MuICBUaGUgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIHRoZSBkZXRhaWxzIG9mIHRoZSBjb21wb25lbnQgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCB0byBwcm92aWRlIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMgc3VjaCBhcyBpdCBvd24gcHJlZGVjZXNzb3JzIGFuZCBzdWNjZXNzb3JzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUHJvY2Vzc0NvbXBvbmVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RQbHVnaW4iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFBsdWdpbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4mI3hEOyYjeEE7TWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuJiN4RDsmI3hBO1NwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGFja2FnZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmFyaWFiaWxpdHlFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGNsYXNzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudCB0aGF0IHByb3ZpZGVzIG5ldyBjYXBhYmlsaXRpZXMgZm9yIGNvbnRlbnQgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gQ29udGVudCBFbGVtZW50cyBvciBhbnkgb3RoZXIgTWV0aG9kIEVsZW1lbnQgdGhhdCBkZXJpdmVzIGZyb20gaXQuICBJdCBoYXMgYmVlbiBwbGFjZWQgaW4tYmV0d2VlbiB0aGUgY2xhc3NlcyBNZXRob2QgRWxlbWVudCBhbmQgQ29udGVudCBFbGVtZW50IGluIHRoZSBvdmVyYWxsIFVNQSB0YXhvbm9teSBvZiBjbGFzc2VzIHVzaW5nIHRoZSBVTUwgMi4wIHBhY2thZ2UgbWVyZ2UgbWVjaGFuaXNtLiAgVGhlIGFzc29jaWF0aW9uIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHNoYWxsIG9ubHkgYmUgaW5zdGFudGlhdGVkIGJldHdlZW4gdHdvIHN1YmNsYXNzZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgc2FtZSB0eXBlLiAgVGhlIGVsZW1lbnQgb24gdmFyYWliaWxpdHlTcGVjaWFsRWxlbWVudCBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgZGVmaW5lcyBhIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZSBkZWZpbmluZyB0aGUgbmF0dXJlIG9mIHRoZSByZWxhdGlvbnNoaXAgdXNpbmcgYSBsaXRlcmFsIGZyb20gdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuJiN4RDsmI3hBO1ZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIG1ldGEtbW9kZWwgcGFja2FnZSBNZXRob2QgUGx1Z2lucyBhZGRzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gTWV0aG9kIEVsZW1lbnRzIHRoYXQgZGVyaXZlIGZyb20gaXQuICBCeSBkZWZhdWx0IGFsbCBDb250ZW50IEVsZW1lbnRzIHN1Y2ggYXMgUm9sZSwgVGFzaywgR3VpZGFuY2UgVHlwZXMsIG9yIEFjdGl2aXRpZXMgYXJlIGRlZmluZWQgdG8gYmUgVmFyaWFiaWxpdHkgRWxlbWVudHMuJiN4RDsmI3hBO1ZhcmlhYmlsaXR5IGFuZCBleHRlbnNpb24gcHJvdmlkZXMgdW5pcXVlIG1lY2hhbmlzbXMgZm9yIGN1c3RvbWl6aW5nIG1ldGhvZCBjb250ZW50IHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LCBidXQgYnkganVzdCBiZSBhYmxlIHRvIGRlc2NyaWJlIHdpdGggc2VwYXJhdGUgb2JqZWN0cyB0aGUgZGlmZmVyZW5jZXMgKGFkZGl0aW9ucywgY2hhbmdlcywgb21pc3Npb25zKSByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwuICBUaGlzIHBsdWctaW4gY29uY2VwdCBhbGxvd3MgdXNlcnMgdG8gZmFjdG9yIHRoZWlyIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gaW50ZXJyZWxhdGVkIHVuaXRzIGFuZCBldmVuIHRvIGFyY2hpdGVjdCBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGxheWVycyB0aGF0IGV4dGVuZCBlYWNoIG90aGVyIHdpdGggbmV3IGNhcGFiaWxpdGllcy4gIFRoZSByZXN1bHRpbmcgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2lnbiBjYW4gYmUgZHluYW1pY2FsbHkgY29tYmluZWQgYW5kIGFwcGxpZWQgb24gZGVtYW5kIHVzaW5nIHRoZSBpbnRlcnByZXRhdGlvbiBydWxlcyBkZWZpbmVkIGZvciBWYXJpYWJpbGl0eSBFbGVtZW50IFNwZWNpYWxpemF0aW9ucyBhc3NlbWJsaW5nIHRvIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0aGUgbW9zdCBhY2N1cmF0ZSBtZXRob2QgYW5kIHByb2Nlc3MgZGVzY3JpcHRpb25zIHBvc3NpYmxlLiAgSXQgYWxzbyBhbGxvd3MgcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRvIGV4dGVuZHMgYW5kIHRhaWxvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIHRoZXkgZG8gbm90IG93biBhbmQgdG8gZWFzaWx5IHVwZ3JhZGUgdG8gbmV3ZXIgdmVyc2lvbnMgYnkgc2ltcGx5IHJlYXBwbHkgdGhlaXIgcGVyc29uYWwgY2hhbmdlcyB0byB0aGVzZSB1cGdyYWRlcy4mI3hEOyYjeEE7VmFyaWFiaWxpdHkgRWxlbWVudCBkZWZpbmVzIHR3byB0eXBlcyBvZiB2YXJpYWJpbGl0eSBhbmQgb25lIHR5cGUgb2YgZXh0ZW5zaW9uIHdoaWNoIGFyZSBmb3JtYWxseSBkZWZpbmVkIGZvciB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiBlVHlwZT0iIy8vVmFyaWFiaWxpdHlUeXBlIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJuYSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIGluIGluc3RhbmNlIG9mIHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxpemF0aW9uIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIFZhcmlhYmlsaXR5IEVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgZXhpc3RzLCB0aGVuIHRoZSB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHNwZWNpZmllcyBob3cgdGhlIGVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbEVsZW1lbnQgZW5kIG9mIHRoZSBhc3NvY2lhdGlvbiBjaGFuZ2VzIHRoZSBDb250ZW50IEVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgZW5kLiBTZWUgdGhlIFZhcmlhYmlsaXR5IFR5cGUgZW51bWVyYXRpb24gY2xhc3MgZm9yIGRlZmluaXRpb25zIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHZhcmlhYmlsaXR5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vVmFyaWFiaWxpdHlFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJWYXJpYWJpbGl0eSBUeXBlIGlzIGFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Im5hIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJjb250cmlidXRlcyIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImV4dGVuZHMiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJyZXBsYWNlcyIgdmFsdWU9IjMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBDb250cmlidXRpb24gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBleHRlcm5hbGx5IGRlZmluZXMgYWRkaXRpb25zIGFuZCBjaGFuZ2VzIHRvIGFuIGV4aXN0aW5nIFByb2Nlc3Mgd2l0aG91dCBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIGV4aXN0aW5nIFByb2Nlc3MuICBJdCBhY2hpZXZlcyB0aGlzIGJ5IGRlc2NyaWJpbmcgdGhlc2UgYWRkaXRpb25zIGFuZCBjaGFuZ2VzIGluIGEgc2VwYXJhdGUgUHJvY2VzcyBzdHJ1Y3R1cmUuICBUaGlzIHN0cnVjdHVyZSdzIGVsZW1lbnRzIHJlbGF0ZSB0byB0aGUgb3RoZXIgUHJvY2VzcycgZWxlbWVudHMgdXNpbmcgQ29udHJpYnV0ZXMgYW5kIFJlcGxhY2UgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb25zLiAgUHJvY2VzcyBDb250cmlidXRpb25zIGFyZSBub3JtYWxseSBwYWNrYWdlZCB3aXRoIE1ldGhvZCBQbHVnaW5zIHRoYXQgZXh0ZW5kIGV4aXN0aW5nIE1ldGhvZCBQbHVnaW4gd2l0aCBuZXcgY2FwYWJpbGl0aWVzLiYjeEQ7JiN4QTtBIFByb2Nlc3MgQ29udHJpYnV0aW9uIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgYXBwbGllcyB0aGUgc2VtYW50aWNzIG9mIHRoZSBDb250cmlidXRlcyBhbmQgUmVwbGFjZXMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gb24gUHJvY2Vzc2VzLiAgQSBQcm9jZXNzIENvbnRyaWJ1dGlvbiBpcyBhIGtpbmQgb2YgJ3Byb2Nlc3MgcGx1Zy1pbicgdGhhdCAncGx1Z3MnIGFkZGl0aW9uYWwgYnJlYWtkb3duIHN0cnVjdHVyZXMgaW50byBhbiBleGl0aW5nIHByb2Nlc3MgYW5kIHRoZXJlZm9yZSB1cGRhdGVzIGl0IGEtcG9zdGVyaW9yaSB3aXRoIG5ldyBvciBjaGFuZ2VkIGNhcGFiaWxpdGllcy4gIFR5cGljYWwgYXBwbGljYXRpb25zIG9mIFByb2Nlc3MgQ29udHJpYnV0aW9ucyBhcmUgTWV0aG9kIFBsdWdpbnMgdGhhdCBhZGQgY29udGVudCBmcm9tIHNwZWNpZmljIGFyZWFzIHRvIGFuIGV4aXN0aW5nIGRvbWFpbi4gIEluIGFkZGl0aW9uIHRvIGp1c3QgY29udHJpYnV0aW5nIG5ldyBtZXRob2QgY29udGVudCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgVGFzayBhbmQgV29yayBQcm9kdWN0cywgUHJvY2VzcyBDb250cmlidXRpb25zIGNhbiBhbHNvIGRlZmluZSB3aGVyZSBpbiB0aGUgUHJvY2Vzc2VzIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgd2l0aCB0aGlzIG1ldGhvZCBjb250ZW50IHRob3NlIG5ldyBhZGRpdGlvbnMgc2hvdWxkIGJlIGFwcGxpZWQuICBNb3Jlb3ZlciwgaXQgYWxsb3dzIGRlZmluaW5nIHdob2xlIG5ldyBvciBjaGFuZ2VkIEFjdGl2aXRpZXMgd2l0aGluIHRoZXNlIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZVByb2Nlc3MiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFVuaXQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgVW5pdCBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dGhvcnMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhbmdlRGF0ZSIgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29weXJpZ2h0U3RhdGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBDb25maWd1cmF0aW9uIGlzIGEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQbHVnaW5TZWxlY3Rpb24iCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQYWNrYWdlU2VsZWN0aW9uIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3NWaWV3cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlZmF1bHRWaWV3IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VDb25maWd1cmF0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRmFtaWx5IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZWxpdmVyeSBNb2RlbCBGYW1pbHkgaXMgYSBjb252ZW5pZW50IGdyb3VwaW5nIG9mIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyBvZiBpbnRlcmVzdCB0byBzb21lIHNwZWNpZmljIHVzZXIgY29tbXVuaXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyeVByb2Nlc3NlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGVsaXZlcnlQcm9jZXNzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZExpYnJhcnkiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQbHVnaW5zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlZmluZWRDb25maWd1cmF0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4yL3VtYS5nZW5tb2RlbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMi91bWEuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhNjkwNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4yL3VtYS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgY29weXJpZ2h0VGV4dD0iSUJNIFJhdGlvbmFsIFNvZnR3YXJlIgotICAgIG1vZGVsRGlyZWN0b3J5PSIvY29tLmlibS51bWEvc3JjIiBlZGl0RGlyZWN0b3J5PSIvY29tLmlibS51bWEuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL2NvbS5pYm0udW1hLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0iY29tLmlibS51bWEiIHRlbXBsYXRlRGlyZWN0b3J5PSIvY29tLmlibS51bWEuZWNvcmUvdGVtcGxhdGVzIiBydW50aW1lSmFyPSJ0cnVlIgotICAgIGR5bmFtaWNUZW1wbGF0ZXM9InRydWUiIG1vZGVsTmFtZT0iVW1hIiBlZGl0UGx1Z2luQ2xhc3M9ImNvbS5pYm0udW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW4iCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9ImNvbS5pYm0udW1hLnByZXNlbnRhdGlvbi5VbWFFZGl0b3JQbHVnaW4iIG5vbk5MU01hcmtlcnM9InRydWUiCi0gICAgcm9vdEV4dGVuZHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3QiIHJvb3RFeHRlbmRzQ2xhc3M9ImNvbS5pYm0udW1hZi5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0IgotICAgIHJvb3RJbXBsZW1lbnRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkludGVybmFsRURhdGFPYmplY3QiIHN1cHByZXNzRU1GVHlwZXM9InRydWUiCi0gICAgZmVhdHVyZU1hcFdyYXBwZXJJbnRlcmZhY2U9ImNvbW1vbmouc2RvLlNlcXVlbmNlIiBmZWF0dXJlTWFwV3JhcHBlckludGVybmFsSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnV0aWwuRVNlcXVlbmNlIgotICAgIGZlYXR1cmVNYXBXcmFwcGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8udXRpbC5CYXNpY0VTZXF1ZW5jZSI+Ci0gIDxmb3JlaWduTW9kZWw+QzpcSG9tZVxwaFROR1xUTkdfZG9jc1xPT0FEXENvbnRlbnRBcmNoaXRlY3R1cmVcTW9kZWxzXFVNQTAyXFVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmUubWRsPC9mb3JlaWduTW9kZWw+Ci0gIDxzdGF0aWNQYWNrYWdlcz5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1NETzwvc3RhdGljUGFja2FnZXM+Ci0gIDxtb2RlbFBsdWdpblZhcmlhYmxlcz5FTUZfQ09NTU9OSl9TRE89b3JnLmVjbGlwc2UuZW1mLmNvbW1vbmouc2RvPC9tb2RlbFBsdWdpblZhcmlhYmxlcz4KLSAgPG1vZGVsUGx1Z2luVmFyaWFibGVzPkVNRl9FQ09SRV9TRE89b3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkbzwvbW9kZWxQbHVnaW5WYXJpYWJsZXM+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IlVtYSIgYmFzZVBhY2thZ2U9ImNvbS5pYm0iIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBlY29yZVBhY2thZ2U9InVtYS5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9maW5pc2hUb1N0YXJ0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvZmluaXNoVG9GaW5pc2giLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvU3RhcnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvRmluaXNoIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbmEiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2NvbnRyaWJ1dGVzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9leHRlbmRzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9yZXBsYWNlcyIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9EYXRlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9VcmkiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1N0cmluZyIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU2V0Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9TZXF1ZW5jZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vSW50ZWdlciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NsYXNzaWZpZXIiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UeXBlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL05hbWVkRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGFja2FnZWFibGVFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGFja2FnZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL05hbWVzcGFjZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvZ3VpZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvYnJpZWZEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L293bmVkUnVsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L3N1cHByZXNzZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L29yZGVyaW5nR3VpZGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29uc3RyYWludCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29uc3RyYWludC9ib2R5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9zdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY29uY2VwdHNBbmRQYXBlcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9jaGVja2xpc3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvZ3VpZGVsaW5lcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2V4YW1wbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvYXNzZXRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3ByZXNlbnRhdGlvbk5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3ByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9zaGFwZWljb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvbm9kZWljb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vbWFpbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9zZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9rZXlDb25zaWRlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TZWN0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3NlY3Rpb25OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2VjdGlvbi9zZWN0aW9uRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VjdGlvbi9zdWJTZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlY3Rpb24vcHJlZGVjZXNzb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlL21vZGlmaWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZS9yZXNwb25zaWJsZUZvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L2VzdGltYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QvcmVwb3J0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L3RlbXBsYXRlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L3Rvb2xNZW50b3JzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rhc2siPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svcGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL21hbmRhdG9yeUlucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9vdXRwdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9vcHRpb25hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3N0ZXBzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay90b29sTWVudG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL2VzdGltYXRlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya0RlZmluaXRpb24vcHJlY29uZGl0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtEZWZpbml0aW9uL3Bvc3Rjb25kaXRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU3RlcCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0d1aWRhbmNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQXJ0aWZhY3QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BcnRpZmFjdC9jb250YWluZXJBcnRpZmFjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BcnRpZmFjdC9jb250YWluZWRBcnRpZmFjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcmFibGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlL2RlbGl2ZXJlZFdvcmtQcm9kdWN0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9PdXRjb21lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9nbG9iYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL3JldXNlZFBhY2thZ2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvcGFyZW50UGFja2FnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL2NoaWxkUGFja2FnZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudFBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50UGFja2FnZS9jb250ZW50RWxlbWVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9icmllZk91dGxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL3JlcHJlc2VudGF0aW9uT3B0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL2V4dGVybmFsSWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL2ltcGFjdE9mTm90SGF2aW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9yZWFzb25zRm9yTm90TmVlZGluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZURlc2NyaXB0aW9uL2V4dGVybmFsRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZURlc2NyaXB0aW9uL3BhY2thZ2luZ0d1aWRhbmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL3NraWxscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbi9hc3NpZ25tZW50QXBwcm9hY2hlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbi9zeW5vbnltcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uL2FsdGVybmF0aXZlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HdWlkYW5jZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9HdWlkYW5jZURlc2NyaXB0aW9uL2F0dGFjaG1lbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYWRkaXRpb25hbEluZm8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL3Byb2JsZW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2JhY2tncm91bmQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2dvYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9hcHBsaWNhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vbGV2ZWxzT2ZBZG9wdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qb2ludCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUG9pbnQveCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BvaW50L3kiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L3Bvc2l0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9jb250YWluZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L2xpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L2FuY2hvcmFnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvc2VtYW50aWNNb2RlbCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvaXNWaXNpYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L2NvbnRhaW5lciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L3JlZmVyZW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9wcm9wZXJ0eSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaWFncmFtTGluayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvem9vbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay92aWV3cG9ydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay9ncmFwaEVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay9kaWFncmFtIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFZGdlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NlbWFudGljTW9kZWxCcmlkZ2UvcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZGlhZ3JhbSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaW1lbnNpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpbWVuc2lvbi93aWR0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpbWVuc2lvbi9oZWlnaHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUmVmZXJlbmNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9SZWZlcmVuY2UvaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWZlcmVuY2UvcmVmZXJlbmNlZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9wZXJ0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvcGVydHkva2V5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvcGVydHkvdmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhFZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVkZ2UvYW5jaG9yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWRnZS93YXlwb2ludHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlhZ3JhbSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGlhZ3JhbS96b29tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW0vdmlld3BvaW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbS9kaWFncmFtTGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtL25hbWVzcGFjZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaE5vZGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaE5vZGUvc2l6ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQvdHlwZUluZm8iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVU1BU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVU1BU2VtYW50aWNNb2RlbEJyaWRnZS9lbGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS9lbGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0xlYWZFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGV4dEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1RleHRFbGVtZW50L3RleHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vSW1hZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0ltYWdlL3VyaSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0ltYWdlL21pbWVUeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoaWNQcmltaXRpdmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qb2x5bGluZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUG9seWxpbmUvY2xvc2VkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1BvbHlsaW5lL3dheXBvaW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9FbGxpcHNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL3JhZGl1c1giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL3JhZGl1c1kiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL3JvdGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9zdGFydEFuZ2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9lbmRBbmdsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9FbGxpcHNlL2NlbnRlciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BY3Rpdml0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvYnJlYWtkb3duRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9yb2FkbWFwcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L3N1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9jaGVja2xpc3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvY29uY2VwdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9leGFtcGxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2d1aWRlbGluZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9yZXVzYWJsZUFzc2V0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNSZXBlYXRhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNPbmdvaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNFdmVudERyaXZlbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2xpbmtUb1ByZWRlY2Vzc29yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlZml4Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9pc1BsYW5uZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2hhc011bHRpcGxlT2NjdXJyZW5jZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2lzT3B0aW9uYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZXNlbnRlZEFmdGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVzZW50ZWRCZWZvcmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wbGFubmluZ0RhdGEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3N1cGVyQWN0aXZpdGllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NaWxlc3RvbmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9JdGVyYXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QaGFzZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RlYW1Qcm9maWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS90ZWFtUm9sZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS9zdXBlclRlYW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS9zdWJUZWFtIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9Sb2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvcGVyZm9ybXNBZGRpdGlvbmFsbHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9hc3Npc3RzSW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL21vZGlmaWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvcGVyZm9ybXNBc093bmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya09yZGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrT3JkZXIvbGlua1R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrT3JkZXIvcHJlZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhL3N0YXJ0RGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YS9maW5pc2hEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhL3JhbmsiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpcHRvci9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL1Rhc2siLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2Fzc2lzdGVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9leHRlcm5hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvbWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9vcHRpb25hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivb3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvcGVyZm9ybWVkUHJpbWFyaWx5QnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9zZWxlY3RlZFN0ZXBzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2FjdGl2aXR5RW50cnlTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9hY3Rpdml0eUV4aXRTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9Xb3JrUHJvZHVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9leHRlcm5hbElucHV0VG8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0ZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL21hbmRhdG9yeUlucHV0VG8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci93b3JrZWRPbkJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL09wdGlvbmFsSW5wdXRUbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9vdXRwdXRGcm9tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2RlbGl2ZXJhYmxlUGFydHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvcmVzcG9uc2libGVSb2xlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbXBvc2l0ZVJvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbXBvc2l0ZVJvbGUvYWdncmVnYXRlZFJvbGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uL3VzYWdlR3VpZGFuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9hbHRlcm5hdGl2ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL2hvd3RvU3RhZmYiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3NjYWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcHJvamVjdENoYXJhY3RlcmlzdGljcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Jpc2tMZXZlbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL2VzdGltYXRpbmdUZWNobmlxdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vdHlwZU9mQ29udHJhY3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vZXh0ZXJuYWxJZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi9zY29wZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi91c2FnZU5vdGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpcHRvckRlc2NyaXB0aW9uL3JlZmluZWREZXNjcmlwdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db25jZXB0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2hlY2tsaXN0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRXhhbXBsZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0d1aWRlbGluZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VzdGltYXRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRXN0aW1hdGUvZXN0aW1hdGlvbk1ldHJpYyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Fc3RpbWF0ZS9lc3RpbWF0aW9uQ29uZGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VzdGltYXRpbmdNZXRyaWMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZXBvcnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZW1wbGF0ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rvb2xNZW50b3IiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9XaGl0ZXBhcGVyIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVybURlZmluaXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QcmFjdGljZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ByYWN0aWNlL3N1YlByYWN0aWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ByYWN0aWNlL2NvbnRlbnRSZWZlcmVuY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJhY3RpY2UvYWN0aXZpdHlSZWZlcmVuY2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JldXNhYmxlQXNzZXQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaXNjaXBsaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaXNjaXBsaW5lL3Rhc2tzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZS9yZWZlcmVuY2VXb3JrZmxvd3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZVNldCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZVNldC9yb2xlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Eb21haW4iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RvbWFpbi93b3JrUHJvZHVjdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRG9tYWluL3N1YmRvbWFpbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdFR5cGUvd29ya1Byb2R1Y3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZUdyb3VwaW5nL2Rpc2NpcGxpbmVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rvb2wiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rvb2wvdG9vbE1lbnRvcnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZVNldEdyb3VwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlU2V0R3JvdXBpbmcvcm9sZVNldHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5L2NhdGVnb3JpemVkRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9zdWJDYXRlZ29yaWVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2VzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzL2VkdWNhdGlvbk1hdGVyaWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzcy9jb21tdW5pY2F0aW9uc01hdGVyaWFscyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzL2luY2x1ZGVzUGF0dGVybnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzL2RlZmF1bHRDb250ZXh0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy92YWxpZENvbnRleHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUvYmFzZWRPblByb2Nlc3NlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2FkbWFwIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9pbnRlcmZhY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQvcHJvY2VzcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NQYWNrYWdlL3Byb2Nlc3NFbGVtZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZS9kaWFncmFtcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9pbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlL2ludGVyZmFjZUlPIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci9Qcm9jZXNzQ29tcG9uZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFBsdWdpbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luL3VzZXJDaGFuZ2VhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBsdWdpbi9tZXRob2RQYWNrYWdlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBsdWdpbi9iYXNlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5RWxlbWVudC92YXJpYWJpbGl0eVR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29udHJpYnV0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29udHJpYnV0aW9uL2Jhc2VQcm9jZXNzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFVuaXQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvYXV0aG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY2hhbmdlRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY2hhbmdlRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L3ZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L2NvcHlyaWdodFN0YXRlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL21ldGhvZFBsdWdpblNlbGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vbWV0aG9kUGFja2FnZVNlbGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vcHJvY2Vzc1ZpZXdzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9kZWZhdWx0VmlldyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vYmFzZUNvbmZpZ3VyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NGYW1pbHkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NGYW1pbHkvZGVsaXZlcnlQcm9jZXNzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kTGlicmFyeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZExpYnJhcnkvbWV0aG9kUGx1Z2lucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L3ByZWRlZmluZWRDb25maWd1cmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjMvcHJvcGVydGllcy50eHQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjMvcHJvcGVydGllcy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZmYjNmOWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3Byb3BlcnRpZXMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1Ob24tTkxTIE1hcmtlcnM6CXRydWUKLUNvbnRhaW5tZW50IFByb3hpZXM6CXRydWUKLVN1cHByZXNzIEVNRiBNZXRhZGF0YToJZmFsc2UKLVJvb3QgRXh0ZW5kcyBDbGFzczoJb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0Ci1Sb290IEV4dGVuZHMgSW50ZXJmYWNlOglvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdAotQ29kZSBGb3JtYXR0aW5nOgl0cnVlCi1EeW5hbWljIFRlbXBsYXRlczoJdHJ1ZQotVGVtcGxhdGUgRGlyZWN0b3J5Ogkvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMy91bWEuZWNvcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjMvdW1hLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZGM1NzcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMy91bWEuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxMjI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InVtYSIKLSAgICBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zL3VtYS5lY29yZSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmVwZi51bWEiPgotICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iMDMiLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGF0ZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5EYXRlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEYXRhIHR5cGUgdXNlZCBmb3IgYXR0cmlidXRlcyBvZiBtZXRhLW1vZGVsIGNsYXNzZXMgb2YgdGhlIHR5cGUgRGF0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVXJpIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5uZXQuVVJJIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEYXRhIHR5cGUgdXNlZCBmb3IgYXR0cmlidXRlcyBvZiBtZXRhLW1vZGVsIGNsYXNzZXMgdGhhdCBwb2ludCB0byByZXNvdXJjZXMgc3VjaCBhcyBmaWxlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVW5saW1pdGVkTmF0dXJhbCIgaW5zdGFuY2VDbGFzc05hbWU9ImludCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN0cmluZyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTZXQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuU2V0Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU2VxdWVuY2UiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuTGlzdCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkludGVnZXIiIGluc3RhbmNlQ2xhc3NOYW1lPSJpbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJGbG9hdCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5GbG9hdCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNsYXNzaWZpZXIiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIENsYXNzaWZpZXIuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlR5cGUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOYW1lZEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuICBEZWZpbmVkIHRoYXQgZXZlcnkgZWxlbWVudCBoYXMgYSBuYW1lLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9OYW1lZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9OYW1lc3BhY2UgIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZXNwYWNlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVzcGFjZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IGNsYXNzIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGlzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzIE1ldGhvZCBFbGVtZW50IGlzIHRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIGNsYXNzZXMgYW5kIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGV2ZXJ5IG90aGVyIGVsZW1lbnQgdHlwZSBvZiB0aGlzIG1vZGVsLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuICBNZXRob2QgRWxlbWVudCBpbmhlcml0cyB0aGUgTmFtZSBhdHRyaWJ1dGUgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50J3Mgc3VwZXIgY2xhc3MuICBFdmVyeSBlbGVtZW50IGRlZmluZWQgYXMgYSBVTUEgaW5zdGFuY2UgaXMgZGVyaXZlZCBmcm9tIE1vZGVsIEVsZW1lbnQuICBFdmVyeSBNZXRob2QgRWxlbWVudCBpbi1zdGFuY2UgaXMgYXQgbGVhc3QgZGVmaW5lZCBieSBhIHVuaXF1ZSBpZCwgYSBuYW1lLCBhcyB3ZWxsIGFzIGJyaWVmIGRlc2NyaXB0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJndWlkIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvd25lZFJ1bGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25zdHJhaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdXBwcmVzc2VkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgRXh0ZW5kcyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcmRlcmluZ0d1aWRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBDQVNFIHRvb2wgcmVhbGl6YXRpb25zIG9mIHRoaXMgbW9kZWwgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBsYXlvdXQgYW5kIG9yZGVyaW5nIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhbmQgaXRzIHBhcnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25zdHJhaW50IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb25zdHJhaW50IGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGEgTWV0aG9kIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJvZHkiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIHN0b3JlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpYmFibGVFbGVtZW50ICMvL1ZhcmlhYmlsaXR5RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGVudCBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LiYjeEQ7JiN4QTtDb250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbmNlcHRzQW5kUGFwZXJzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25jZXB0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNoZWNrbGlzdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NoZWNrbGlzdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJndWlkZWxpbmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HdWlkZWxpbmUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhhbXBsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0V4YW1wbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCAjLy9DbGFzc2lmaWVyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliYWJsZSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4mI3hEOyYjeEE7VGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlIChzZWUgU2VjdGlvbiA0LjEuNCkuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gJnF1b3Q7cnVwX2FyY2hpdGVjdHVyZV9kb2N1bWVudCZxdW90OyB0byBkaWZmZXJlbnRpYXRlIGZyb20gYSAmcXVvdDtqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50JnF1b3Q7IHdoZXJlYXMgdGhlIGV4dGVybmFsIHByZXNlbnRhdGlvbiB3b3VsZCBhbHdheXMgYmUgJnF1b3Q7QXJjaGl0ZWN0dXJlIERvY3VtZW50JnF1b3Q7LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50YXRpb24iIGVUeXBlPSIjLy9Db250ZW50RGVzY3JpcHRpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNoYXBlaWNvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1VyaSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm9kZWljb24iIGVUeXBlPSIjLy9VcmkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250ZW50IERlc2NyaXB0aW9uIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgc3RvcmUgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJLZXkgQ29uc2lkZXJhdGlvbnMgcHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlY3Rpb24iIGVTdXBlclR5cGVzPSIjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgU2VjdGlvbiBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VjdGlvbk5hbWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VjdGlvbkRlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlNlY3Rpb25zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TZWN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkZWNlc3NvciIgZVR5cGU9IiMvL1NlY3Rpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvbGUgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgJiN4RDsmI3hBO0EgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZGlmaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzcG9uc2libGVGb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIFByb2R1Y3QgaXMgYW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuJiN4RDsmI3hBO0Egd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXBvcnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXBvcnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGVtcGxhdGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UZW1wbGF0ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sTWVudG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQgIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGFzayBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLiYjeEQ7JiN4QTtBIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAmI3hEOyYjeEE7QSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gJiN4RDsmI3hBO0ZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXZlbG9wIFVzZSBDYXNlIE1vZGVsJnF1b3Q7IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgJnF1b3Q7bWV0aG9kJnF1b3Q7IG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyZm9ybWVkQnkiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRwdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN0ZXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdGVwIiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIKLSAgICAgICAgZGVyaXZlZD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sTWVudG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrRGVmaW5pdGlvbiIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIERlZmluaXRpb24gaXMgYW4gYWJzdHJhY3QgTWV0aG9kIEVsZW1lbnQgdGhhdCBnZW5lcmFsaXplcyBhbGwgZGVzY3JpcHRpb25zIG9mIHdvcmsgd2l0aGluIHRoZSBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUuICBUaGlzIHBhY2thZ2UgaW50cm9kdWNlcyB0d28gY29uY3JldGUgdHlwZXMgb2YgV29yayBEZWZpbml0aW9uczogVGFzayBhbmQgU3RlcC4gIFdvcmsgRGVmaW5pdGlvbnMgY2FuIGNvbnRhaW4gc2V0cyBvZiBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbnMgZGVmaW5pbmcgY29uc3RyYWludHMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkIGJlZm9yZSB0aGUgZGVzY3JpYmVkIHdvcmsgY2FuIGJlZ2luIG9yIGJlZm9yZSBpdCBjYW4gYmUgZGVjbGFyZWQgYXMgZmluaXNoZWQuICBOb3RlIHRoYXQgZ2VuZXJhbCBvd25lZFJ1bGVzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFuZCBydWxlcyBmb3IgV29yayBEZWZpbml0aW9ucy4mI3hEOyYjeEE7V29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVjb25kaXRpb24iIGVUeXBlPSIjLy9Db25zdHJhaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3N0Y29uZGl0aW9uIiBlVHlwZT0iIy8vQ29uc3RyYWludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RlcCIgZVN1cGVyVHlwZXM9IiMvL1NlY3Rpb24gIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgU3RlcCBpcyBhIFNlY3Rpb24gYW5kIFdvcmsgRGVmaW5pdGlvbiB0aGF0IGlzIHVzZWQgdG8gb3JnYW5pemUgVGFza3MgaW50byBwYXJ0cyBvciBzdWJ1bml0cyBvZiB3b3JrLiAgU3RlcHMgaW5oZXJpdCB0aGUgc3ViU2VjdGlvbnMgZGVjb21wb3NpdGlvbiBmcm9tIFNlY3Rpb24gYW5kIGNhbiB0aGVyZWZvcmUgZGVzY3JpYmUgU3ViLVN0ZXBzIG5lc3RlZCBpbnRvIFN0ZXBzLiYjeEQ7JiN4QTtBIFN0ZXAgZGVzY3JpYmVzIGEgbWVhbmluZ2Z1bCBhbmQgY29uc2lzdCBwYXJ0IG9mIHRoZSBvdmVyYWxsIHdvcmsgZGVzY3JpYmVkIGZvciBhIFRhc2suICBUaGUgY29sbGVjdGlvbiBvZiBTdGVwcyBkZWZpbmVkIGZvciBhIFRhc2sgcmVwcmVzZW50cyBhbGwgdGhlIHdvcmsgdGhhdCBzaG91bGQgYmUgZG9uZSB0byBhY2hpZXZlIHRoZSBvdmVyYWxsIGRldmVsb3BtZW50IGdvYWwgb2YgdGhlIFRhc2suICBOb3QgYWxsIHN0ZXBzIGFyZSBuZWNlc3NhcmlseSBwZXJmb3JtZWQgZWFjaCB0aW1lIGEgVGFzayBpcyBpbnZva2VkIGluIGEgUHJvY2VzcyAoc2VlIFRhc2sgRGVzY3JpcHRvciksIHNvIHRoZXkgY2FuIGFsc28gYmUgZXhwcmVzc2VkIGluIHRoZSBmb3JtIG9mIGFsdGVybmF0ZSAnZmxvd3MnIG9mIHdvcmsuICBEaWZmZXJlbnQgd2F5cyBvZiBhY2hpZXZpbmcgdGhlIHNhbWUgZGV2ZWxvcG1lbnQgZ29hbCBjYW4gdGhlbiBiZSAnYXNzZW1ibGVkJyBieSBzZWxlY3RpbmcgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBzdGVwcyB3aGVuIGFwcGx5aW5nIHRoZSBUYXNrIGluIGEgUHJvY2Vzcy4gIFR5cGljYWwga2luZHMgb2Ygc3RlcHMgYSBUYXNrIGF1dGhvciBzaG91bGQgY29uc2lkZXIgYXJlOiBUaGlua2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgdW5kZXJzdGFuZCB0aGUgbmF0dXJlIG9mIHRoZSB0YXNrLCBnYXRoZXJzIGFuZCBleGFtaW5lcyB0aGUgaW5wdXQgYXJ0aWZhY3RzLCBhbmQgZm9ybXVsYXRlcyB0aGUgb3V0Y29tZS4gUGVyZm9ybWluZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgY3JlYXRlIG9yIHVwZGF0ZSBzb21lIGFydGlmYWN0cy4gUmV2aWV3aW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBpbnNwZWN0cyB0aGUgcmVzdWx0cyBhZ2FpbnN0IHNvbWUgY3JpdGVyaWEuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRhbmNlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJ0aWZhY3QiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQXJ0aWZhY3QgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4mI3hEOyYjeEE7QXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICZxdW90O293biZxdW90OyBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZXJBcnRpZmFjdCIgZVR5cGU9IiMvL0FydGlmYWN0IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vQXJ0aWZhY3QvY29udGFpbmVkQXJ0aWZhY3RzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lZEFydGlmYWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQXJ0aWZhY3QiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0FydGlmYWN0L2NvbnRhaW5lckFydGlmYWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJhYmxlIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVsaXZlcmFibGUgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyZWRXb3JrUHJvZHVjdHMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGNvbWUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gb3V0Y29tZSBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RQYWNrYWdlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQgIy8vUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgUGFja2FnZSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnbG9iYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJldXNlZFBhY2thZ2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNoaWxkUGFja2FnZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb250ZW50IFBhY2thZ2UgaXMgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMgYW5kIENvbnRlbnQgRWxlbWVudHMsIG9ubHkuICBFeGFtcGxlcyBmb3IgQ29udGVudCBFbGVtZW50IGFyZSBBcnRpZmFjdHMsIFRhc2tzLCBSb2xlcywgZXRjLiAgQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudEVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50RWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJicmllZk91dGxpbmUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlcHJlc2VudGF0aW9uT3B0aW9ucyIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxJZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBhY3RPZk5vdEhhdmluZyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhc29uc0Zvck5vdE5lZWRpbmciIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJza2lsbHMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXNzaWdubWVudEFwcHJvYWNoZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3lub255bXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdGVybmF0aXZlcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXR0YWNobWVudHMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFkZGl0aW9uYWxJbmZvIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvYmxlbSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiYWNrZ3JvdW5kIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdvYWxzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXBwbGljYXRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbHNPZkFkb3B0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb2ludCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IngiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3NpdGlvbiIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZWQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW1FbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtRWxlbWVudC9jb250YWluZXIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGluayIgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbUxpbmsiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1MaW5rL2dyYXBoRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhbmNob3JhZ2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0dyYXBoQ29ubmVjdG9yIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VtYW50aWNNb2RlbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZ3JhcGhFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW1FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1Zpc2libGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lciIgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9jb250YWluZWQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZWZlcmVuY2UiIGVPcHBvc2l0ZT0iIy8vUmVmZXJlbmNlL3JlZmVyZW5jZWQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvcGVydHkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtTGluayIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iem9vbSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2aWV3cG9ydCIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvbGluayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtL2RpYWdyYW1MaW5rIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoQ29ubmVjdG9yIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L2FuY2hvcmFnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVkZ2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0dyYXBoRWRnZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVkZ2UvYW5jaG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlbWFudGljTW9kZWxCcmlkZ2UiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlc2VudGF0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L3NlbWFudGljTW9kZWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbSIgZVR5cGU9IiMvL0RpYWdyYW0iCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtL25hbWVzcGFjZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaW1lbnNpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3aWR0aCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoZWlnaHQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVmZXJlbmNlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlZCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW1FbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1FbGVtZW50L3JlZmVyZW5jZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9wZXJ0eSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2V5IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaEVkZ2UiIGVTdXBlclR5cGVzPSIjLy9HcmFwaEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhbmNob3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSIyIiBlVHlwZT0iIy8vR3JhcGhDb25uZWN0b3IiIGVPcHBvc2l0ZT0iIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFZGdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndheXBvaW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUG9pbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW0iIGVTdXBlclR5cGVzPSIjLy9HcmFwaE5vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ6b29tIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZpZXdwb2ludCIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtTGluayIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlhZ3JhbUxpbmsiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUxpbmsvZGlhZ3JhbSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lc3BhY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2RpYWdyYW0iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhOb2RlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2l6ZSIgZVR5cGU9IiMvL0RpbWVuc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZUluZm8iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnQiIGVUeXBlPSIjLy9NZXRob2RFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9FbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxlYWZFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGV4dEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRleHQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbWFnZSIgZVN1cGVyVHlwZXM9IiMvL0xlYWZFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJpIiBlVHlwZT0iIy8vVXJpIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbWVUeXBlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhpY1ByaW1pdGl2ZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvbHlsaW5lIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhpY1ByaW1pdGl2ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsb3NlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2F5cG9pbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMiIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qb2ludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWxsaXBzZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoaWNQcmltaXRpdmUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYWRpdXNYIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhZGl1c1kiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm90YXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnRBbmdsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbmRBbmdsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjZW50ZXIiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZpdHkiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCAjLy9WYXJpYWJpbGl0eUVsZW1lbnQgIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEFjdGl2aXR5IGlzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4mI3hEOyYjeEE7QWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJyZWFrZG93bkVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0JyZWFrZG93bkVsZW1lbnQvc3VwZXJBY3Rpdml0aWVzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvYWRtYXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2FkbWFwIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGVja2xpc3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DaGVja2xpc3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uY2VwdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbmNlcHQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhhbXBsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0V4YW1wbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3VpZGVsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJldXNhYmxlQXNzZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzRW5hY3RhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgV29yayBCcmVha2Rvd24gRWxlbWVudCBpcyBhIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1JlcGVhdGFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09uZ29pbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0V2ZW50RHJpdmVuIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGlua1RvUHJlZGVjZXNzb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtPcmRlciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJCcmVha2Rvd24gRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWZpeCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gJnF1b3Q7U1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMmcXVvdDsgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgJnF1b3Q7U29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzJnF1b3Q7IG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICZxdW90O0N1c3RvbWVyLkFyY2hpdGVjdCZxdW90OyB3b3VsZCBkZWZpbmUgYSAmcXVvdDtDdXN0b21lciZxdW90OyBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgJnF1b3Q7QXJjaGl0ZWN0JnF1b3Q7IGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzUGxhbm5lZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuJiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXRhaWwgVXNlIENhc2UmcXVvdDsgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzT3B0aW9uYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpc09wdGlvbmFsIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlc2VudGVkQWZ0ZXIiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRlZEJlZm9yZSIgZVR5cGU9IiMvL0JyZWFrZG93bkVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGxhbm5pbmdEYXRhIiBlVHlwZT0iIy8vUGxhbm5pbmdEYXRhIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBlckFjdGl2aXRpZXMiIGVUeXBlPSIjLy9BY3Rpdml0eSIKLSAgICAgICAgZU9wcG9zaXRlPSIjLy9BY3Rpdml0eS9icmVha2Rvd25FbGVtZW50cyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNaWxlc3RvbmUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNaWxlc3RvbmUgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJdGVyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSXRlcmF0aW9uIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuJiN4RDsmI3hBO0l0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQaGFzZSIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQaGFzZSBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLiYjeEQ7JiN4QTtQaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVhbVByb2ZpbGUiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRlYW0gUHJvZmlsZSBpcyBhIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuJiN4RDsmI3hBO1dvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4mI3hEOyYjeEE7SGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZWFtUm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cGVyVGVhbSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1RlYW1Qcm9maWxlIiBlT3Bwb3NpdGU9IiMvL1RlYW1Qcm9maWxlL3N1YlRlYW0iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViVGVhbSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGVhbVByb2ZpbGUiIGVPcHBvc2l0ZT0iIy8vVGVhbVByb2ZpbGUvc3VwZXJUZWFtIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJSb2xlIiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2RpZmllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBPcmRlciByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEIpIGJlbG93KSBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEEpIGJlbG93KSBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9TdGFydCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9GaW5pc2giIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvU3RhcnQiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvRmluaXNoIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrT3JkZXIiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBPcmRlciBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgJiN4RDsmI3hBOyhOb3RlLCBXb3JrIE9yZGVyIGlzIG5vdCBtb2RlbGVkIGFzIGFuIEFzc29jaWF0aW9uIENsYXNzIHRvIHByb3ZpZGUgYSBzdHJhaWdodGZvcndhcmQgbWFwcGluZyAgdG8gWE1JIGFuZCBFTUYuKSYjeEQ7JiN4QTtUaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rVHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtPcmRlclR5cGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZpbmlzaFRvU3RhcnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZCIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvY2VzcyBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuJiN4RDsmI3hBO1Byb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGxhbm5pbmdEYXRhIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlBsYW5uaW5nIERhdGEgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4mI3hEOyYjeEE7UGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LiYjeEQ7JiN4QTsoTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFuayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVzY3JpcHRvciBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuJiN4RDsmI3hBO0Rlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgJiN4RDsmI3hBO0ZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLiYjeEQ7JiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IldvcmtQcm9kdWN0IiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW1wYWN0ZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGFjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0ZWRCeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyYWJsZVBhcnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza0Rlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCAjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRhc2sgRGVzY3JpcHRvciBpcyBhIERlc2NyaXB0b3IgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4mI3hEOyYjeEE7QSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJUYXNrIiBlVHlwZT0iIy8vVGFzayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzaXN0ZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZXJuYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dHB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBlcmZvcm1lZFByaW1hcmlseUJ5IiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VsZWN0ZWRTdGVwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb21wb3NpdGVSb2xlIiBlU3VwZXJUeXBlcz0iIy8vUm9sZURlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29tcG9zaXRlIFJvbGUgaXMgYSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuJiN4RDsmI3hBO0EgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZ2dyZWdhdGVkUm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNhZ2VHdWlkYW5jZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIEFjdGl2aXR5LCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0aXZpdHkgYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhY2hpZXZlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbHRlcm5hdGl2ZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIHRoaXMgQWN0aXZpdHkgbm90IGNvdmVyZWQgYnkgdGhlIEFjdGl2aXR5J3MgVGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhvd3RvU3RhZmYiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGJhY2tncm91bmQgb24gd2hvIHNob3VsZCBiZSBpbnZvbHZlZCBpbiB0aGlzIGFjdGl2aXR5IHdoYXQgYXJlIHRoZSByZXF1aXJlZCBza2lsbHMsIGV4cGVyaWVuY2UsICBhbmQgcGVyaGFwcyBhdHRpdHVkZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NhbGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik91dGxpbmVzIGNoYXJhY3RlcmlzdGljcyBhYm91dCB0aGUgc2l6ZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvamVjdCBleHByZXNzZWQgaW4gdGVhbSBzaXplLCBtYW4geWVhcnMsIGV0Yy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdENoYXJhY3RlcmlzdGljcyIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyaXNrTGV2ZWwiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRpbmdUZWNobmlxdWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgRXN0aW1hdGlvbiBUZWNobmlxdWVzIHByb3ZpZGVkIGZvciB0aGlzIFByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3RNZW1iZXJFeHBlcnRpc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGEgcHJvZmlsZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0ZWFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHJvbGVzLCBza2lsbHMgcmVxdWlyZWQgZm9yIGEgdGVhbSBwZXJmb3JtcyBhIHByb2plY3QgYmFzZWQgb24gdGhpcyBwcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlT2ZDb250cmFjdCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udHJhY3RzIHRoYXQgbmVlZCB0byBiZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIGEgcHJvamVjdCB0ZWFtIHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9jZXNzIGFuZCBhIGNsaWVudCAoZS5nLiBmb3IgYW4gSUdTIGVuZ2FnZW1lbnQpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxJZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGRlbGl2ZXJ5IHBhdHRlcm5zIGFuZCBtb2RlbHMuIEl0IGlzIHVzZWQgbGlrZSBhIHN5bm9ueW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjb3BlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNhZ2VOb3RlcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpcHRvckRlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVmaW5lZERlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25jZXB0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29uY2VwdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNoZWNrbGlzdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENoZWNrbGlzdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXhhbXBsZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBFeGFtcGxlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSB0eXBpY2FsLCBwYXJ0aWFsbHkgY29tcGxldGVkLCBzYW1wbGUgaW5zdGFuY2Ugb2Ygb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBvciBzY2VuYXJpbyBsaWtlIGRlc2NyaXB0aW9ucyBvZiBob3cgVGFzayBtYXkgYmUgcGVyZm9ybWVkLiBFeGFtcGxlcyBjYW4gYmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3RzIGFzIHdlbGwgYXMgVGFza3MgdGhhdCBwcm9kdWNlIHRoZW0gYXMgd2VsbCBhcyBhbnkgb3RoZXIgQ29udGVudCBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkZWxpbmUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBHdWlkZWxpbmUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVwb3J0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUmVwb3J0IGlzIGEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVtcGxhdGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUZW1wbGF0ZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1cHBvcnRpbmcgTWF0ZXJpYWxzIGlzIGNhdGNoYWxsIGZvciBvdGhlciB0eXBlcyBvZiBndWlkYW5jZSBub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgQ29udGVudCBFbGVtZW50cywgaS5lLiBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRvb2xNZW50b3IiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUb29sIE1lbnRvciBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yayBhIFdvcmsgUHJvZHVjdCBlaXRoZXIgaW4gdGhlIGNvbnRleHQgb2Ygb3IgaW5kZXBlbmRlbnQgZnJvbSBhIFRhc2sgb3IgQWN0aXZpdHkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldoaXRlcGFwZXIiIGVTdXBlclR5cGVzPSIjLy9Db25jZXB0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGl0ZXBhcGVycyBhcmUgYSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVybURlZmluaXRpb24iIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGVybURlZmluaXRpb25zIGRlZmluZSBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUaGV5IGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcmFjdGljZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByYWN0aWNlIHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAmcXVvdDtNYW5hZ2UgUmlza3MmcXVvdDssICZxdW90O0NvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSZxdW90OywgJnF1b3Q7QXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCZxdW90OywgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJQcmFjdGljZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1ByYWN0aWNlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250ZW50UmVmZXJlbmNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWN0aXZpdHlSZWZlcmVuY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BY3Rpdml0eSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucyBxdWFsaWZ5IHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJldXNhYmxlQXNzZXQiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSZXVzYWJsZSBBc3NldCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LiBUaGUgYXNzZXQgbWF5IGhhdmUgYSB2YXJpYWJpbGl0eSBwb2ludCwgd2hpY2ggaXMgYSBsb2NhdGlvbiBpbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLiBUaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nJiN4RDsmI3hBO2hvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0YXRlIiBlU3VwZXJUeXBlcz0iIy8vVmVydGV4Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iV29ya1Byb2R1Y3QiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlJlZ2lvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVnaW9uIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9SZWdpb24vU3RhdGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VibWFjaGluZSIgZVR5cGU9IiMvL1N0YXRlTWFjaGluZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWZXJ0ZXgiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZXIiIGVUeXBlPSIjLy9SZWdpb24iCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9SZWdpb24vVmVydGV4Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGdvaW5nIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UcmFuc2l0aW9uIiBlT3Bwb3NpdGU9IiMvL1RyYW5zaXRpb24vc291cmNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluY29taW5nIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UcmFuc2l0aW9uIiBlT3Bwb3NpdGU9IiMvL1RyYW5zaXRpb24vdGFyZ2V0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlZ2lvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlZlcnRleCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVmVydGV4IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9WZXJ0ZXgvY29udGFpbmVyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlRyYW5zaXRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RyYW5zaXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1RyYW5zaXRpb24vY29udGFpbmVyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlN0YXRlIiBlVHlwZT0iIy8vU3RhdGUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TdGF0ZS9SZWdpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iU3RhdGVNYWNoaW5lIiBlVHlwZT0iIy8vU3RhdGVNYWNoaW5lIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU3RhdGVNYWNoaW5lL1JlZ2lvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdGF0ZU1hY2hpbmUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlJlZ2lvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVnaW9uIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9SZWdpb24vU3RhdGVNYWNoaW5lIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRyYW5zaXRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJXb3JrRGVmaW5pdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya0RlZmluaXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVyIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUmVnaW9uIiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUmVnaW9uL1RyYW5zaXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic291cmNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vVmVydGV4IiBlT3Bwb3NpdGU9IiMvL1ZlcnRleC9vdXRnb2luZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXJnZXQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9WZXJ0ZXgiIGVPcHBvc2l0ZT0iIy8vVmVydGV4L2luY29taW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBzZXVkb1N0YXRlIiBlU3VwZXJUeXBlcz0iIy8vVmVydGV4Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJQc2V1ZG9TdGF0ZUtpbmQiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iaW5pdGlhbCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iam9pbiIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZvcmsiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJqdW5jdGlvbiIgdmFsdWU9IjMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImNob2ljZSIgdmFsdWU9IjQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImVudHJ5UG9pbnQiIHZhbHVlPSI1Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJleGl0UG9pbnQiIHZhbHVlPSI2Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJ0ZXJtaW5hdGUiIHZhbHVlPSI3Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpc2NpcGxpbmUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGlzY2lwbGluZSBpcyBhIGNhdGVnb3JpemF0aW9uIG9mIHdvcmsgKGkuZS4gVGFza3MgZm9yIE1ldGhvZCBDb250ZW50KSwgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4mI3hEOyYjeEE7QSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXNrcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFzayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJkaXNjaXBsaW5lIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaXNjaXBsaW5lIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWZlcmVuY2VXb3JrZmxvd3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0FjdGl2aXR5Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRDYXRlZ29yeSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGVudCBDYXRlZ29yeSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBnZW5lcmFsaXppbmcgY29udGVudCBjYXRlZ29yeSB0eXBlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZVNldCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIFNldCBvcmdhbml6ZXMgUm9sZXMgaW50byBjYXRlZ29yaWVzLiAgSXQgaXMgdXNlZCB0byBncm91cCByb2xlcyB0b2dldGhlciB0aGF0IGhhdmUgY2VydGFpbiBjb21tb25hbGl0aWVzLiAgRm9yIGV4YW1wbGUsIHRoZSAmcXVvdDtBbmFseXN0cyZxdW90OyBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgJnF1b3Q7QnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0JnF1b3Q7LCAmcXVvdDtTeXN0ZW0gQW5hbHlzdCZxdW90OywgYXMgd2VsbCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgU3BlY2lmaWVyJnF1b3Q7IHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRG9tYWluIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEb21haW4gaXMgYSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuJiN4RDsmI3hBO0RvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtQcm9kdWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViZG9tYWlucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRG9tYWluIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdFR5cGUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgUHJvZHVjdCBUeXBlIGlzIGEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAmcXVvdDtDbGFzcyBEaWFncmFtJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyB0aGUgQXJ0aWZhY3RzIEFuYWx5c2lzIE1vZGVsLCBEZXNpZ24gTW9kZWwsIFVzZXIgRXhwZXJpZW5jZSBNb2RlbCwgb3IgJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya1Byb2R1Y3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaXNjaXBsaW5lR3JvdXBpbmciIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRpc2NpcGxpbmUgR3JvdXBpbmdzIGFyZSB1c2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICZxdW90O1NvZnR3YXJlIERpc2NpcGxpbmVzJnF1b3Q7IHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQmcXVvdDsgb3IgJnF1b3Q7VGVzdGluZyZxdW90OzsgJnF1b3Q7SVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCZxdW90OyB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICZxdW90O0lUIE9wZXJhdGlvbmFsIFNlcnZpY2VzJnF1b3Q7LCAmcXVvdDtJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzJnF1b3Q7LCBvciAmcXVvdDtJVCBFbmFibGluZyBTZXJ2aWNlcyZxdW90Oy4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlzY2lwbGluZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Rpc2NpcGxpbmUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVG9vbCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUb29sIGlzIGEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRvb2xNZW50b3JzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Ub29sTWVudG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVTZXRHcm91cGluZyIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUm9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb2xlU2V0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZVNldCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDdXN0b21DYXRlZ29yeSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDdXN0b20gQ2F0ZWdvcnkgaXMgYSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICZxdW90O1Rlc3RpbmcmcXVvdDsgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2F0ZWdvcml6ZWRFbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGVzY3JpYmFibGVFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YkNhdGVnb3JpZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3MiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlbGl2ZXJ5IFByb2Nlc3NlcyBpcyBhIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4mI3hEOyYjeEE7QSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVkdWNhdGlvbk1hdGVyaWFscyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbW11bmljYXRpb25zTWF0ZXJpYWxzIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2VzcyIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4mI3hEOyYjeEE7Q29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmNsdWRlc1BhdHRlcm5zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DYXBhYmlsaXR5UGF0dGVybiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWZhdWx0Q29udGV4dCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsaWRDb250ZXh0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJuIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgUGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIERpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLiYjeEQ7JiN4QTtBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZTomI3hEOyYjeEE7LSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4mI3hEOyYjeEE7LSBUbyBzdXBwb3J0IGRpcmVjdCBleGVjdXRpb24gaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgd29yayBmb2xsb3dpbmcgYSB3ZWxsLWRlZmluZWQgcHJvY2VzcywgYnV0IHdvcmtzIGJhc2VkIG9uIGxvb3NlbHkgY29ubmVjdGVkIHByb2Nlc3MgZnJhZ21lbnRzIG9mIGJlc3QgcHJhY3RpY2VzIGluIGEgZmxleGlibGUgbWFubmVyIChlLmcuIEFnaWxlIERldmVsb3BtZW50KS4mI3hEOyYjeEE7LSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgaXMgcHJlcGFyZWQgZm9yIGluc3RhbnRpYXRpb24gYnkgYSBwcm9qZWN0IHBsYW5uaW5nIHRvb2wuICBUeXBpY2FsbHksIGl0IGlzIGNyZWF0ZWQgYmFzZWQgb24gYSBQcm9jZXNzIHN1Y2ggYXMgYSBEZWxpdmVyeSBQcm9jZXNzIGFzIGEgd2hvbGUgKGUuZy4gaW4gY2FzZSBvZiBhIHdhdGVyZmFsbC1iYXNlZCBkZXZlbG9wbWVudCBhcHByb2FjaCkgb3IgaW4gcGFydHMgKGUuZy4gaW4gY2FzZSBvZiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpLiYjeEQ7JiN4QTtBIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZWRPblByb2Nlc3NlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2VzcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2FkbWFwIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9hZG1hcCBpcyBhIHNwZWNpYWwgR3VpZGFuY2UgVHlwZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLiYjeEQ7JiN4QTtBbiBpbnN0YW5jZSBvZiBhIFJvYWRtYXAgcmVwcmVzZW50cyBpbXBvcnRhbnQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEFjdGl2aXR5IG9yIFByb2Nlc3MgaXQgaXMgcmVsYXRlZCB0by4gIE9mdGVuIGEgY29tcGxleCBBY3Rpdml0eSBzdWNoIGFzIGEgUHJvY2VzcyBjYW4gYmUgbXVjaCBlYXNpZXIgdW5kZXJzdG9vZCBieSBwcm92aWRpbmcgYSB3YWxrdGhyb3VnaCB3aXRoIGEgbGluZWFyIHRocmVhZCBvZiBhIHR5cGljYWwgaW5zdGFudGlhdGlvbiBvZiB0aGlzIEFjdGl2aXR5LiAgSW4gYWRkaXRpb24gdG8gbWFraW5nIHRoZSBwcm9jZXNzIHByYWN0aXRpb25lciB1bmRlcnN0YW5kIGhvdyB3b3JrIGluIHRoZSBwcm9jZXNzIGlzIGJlaW5nIHBlcmZvcm1lZCwgYSBSb2FkbWFwIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IEFjdGl2aXRpZXMgYW5kIFRhc2tzIHJlbGF0ZSB0byBlYWNoIG90aGVyIG92ZXIgdGltZS4gIFJvYWRtYXBzIGFyZSBhbHNvIHVzZWQgdG8gc2hvdyBob3cgc3BlY2lmaWMgYXNwZWN0cyBhcmUgZGlzdHJpYnV0ZWQgb3ZlciBhIHdob2xlIHByb2Nlc3MgcHJvdmlkaW5nIGEga2luZCBvZiBmaWx0ZXIgb24gdGhlIHByb2Nlc3MgZm9yIHRoaXMgaW5mb3JtYXRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzUGFja2FnZSAjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29tcG9uZW50IGlzIGEgc3BlY2lhbCBQcm9jZXNzIFBhY2thZ2UgdGhhdCBhcHBsaWVzIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uICBBIFByb2Nlc3MgQ29tcG9uZW50IHJlYWxpemVzIG9uZSBvciBtb3JlIEludGVyZmFjZXMgd2hpY2ggc3BlY2lmeSBpbnB1dHMgYW5kIG91dHB1dHMgb2YgdGhlIGNvbXBvbmVudC4gVGhlcmUgbWlnaHQgYmUgbWFueSBjb21wb25lbnRzIHJlYWxpemluZyB0aGUgc2FtZSBpbnRlcmZhY2VzLCBidXQgdXNpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgdG8gYWNoaWV2ZSBzaW1pbGFyIG91dHB1dHMgZm9yIHNpbWlsYXIgaW5wdXRzLiAgV2hlcmVhcyB0aGUgQ29tcG9uZW50IEludGVyZmFjZXMgcmVwcmVzZW50IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyAoYmxhY2sgYm94IGRlc2NyaXB0aW9ucyBvZiB0aGUgY29tcG9uZW50KSwgZ29vZCBjYW5kaWRhdGVzIGZvciBjb21wb25lbnQgcmVhbGl6YXRpb25zIGNhbiBiZSBmb3VuZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zICh3aGl0ZSBib3ggZGVzY3JpcHRpb25zIGZvciB0aGUgY29tcG9uZW50KS4mI3hEOyYjeEE7VU1BIHN1cHBvcnRzIHJlcGxhY2VhYmxlIGFuZCByZXVzYWJsZSBQcm9jZXNzIENvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uIENlcnRhaW4gc2l0dWF0aW9ucyBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgbWlnaHQgcmVxdWlyZSB0aGF0IGNvbmNyZXRlIHJlYWxpemF0aW9ucyBvZiBwYXJ0cyBvZiB0aGUgcHJvY2VzcyByZW1haW4gdW5kZWNpZGVkIG9yIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgZXhlY3V0aW5nIHRlYW0gaXRzZWxmIChlLmcuIGluIG91dHNvdXJjaW5nIHNpdHVhdGlvbnMpLiAgVU1BIHByb3ZpZGVzIGEgdW5pcXVlIGNvbXBvbmVudCBjb25jZXB0IGRlZmluaW5nIGludGVyZmFjZXMgZm9yIHdvcmsgcHJvZHVjdCBpbnB1dCBhbmQgb3V0cHV0LCBhbGxvd2luZyB0cmVhdGluZyB0aGUgYWN0dWFsIGRlZmluaXRpb24gb2YgdGhlIHdvcmsgdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0cyBhcyBhICZxdW90O2JsYWNrIGJveCZxdW90Oy4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgJnF1b3Q7cmVhbGl6YXRpb24mcXVvdDsgZGV0YWlsaW5nIHRoZSB3b3JrIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJvY2Vzcy4gIFRoZSBjb21wb25lbnQgYXBwcm9hY2ggYWxzbyBhbGxvd3MgdGhhdCBkaWZmZXJlbnQgc3R5bGVzIG9yIHRlY2huaXF1ZXMgb2YgZG9pbmcgd29yayBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvbmUgYW5vdGhlci4gIEZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGNvZGUgb3V0cHV0IG9mIGEgY29tcG9uZW50IGNvdWxkIGJlIHByb2R1Y2VkIHdpdGggYSBtb2RlbC1kcml2ZW4gZGV2ZWxvcG1lbnQgb3IgYSBjb2RlLWNlbnRyaWMgdGVjaG5pcXVlLiAgVGhlIGNvbXBvbmVudCBjb25jZXB0IGVuY2Fwc3VsYXRlcyB0aGUgYWN0dWFsIHdvcmsgYW5kIGxldHMgdGhlIGRldmVsb3BtZW50IHRlYW0gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB0ZWNobmlxdWUgYW5kIGZpbGwgdGhlIGNvbXBvbmVudCdzIHJlYWxpemF0aW9uIHdpdGggdGhlaXIgY2hvaWNlIG9mIEFjdGl2aXRpZXMgdGhhdCBwcm9kdWNlIHRoZSByZXF1aXJlZCBvdXRwdXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3MiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzUGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFBhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb2Nlc3MgUGFja2FnZSBpcyBhIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LiYjeEQ7JiN4QTtBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzRWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb2Nlc3NFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlhZ3JhbSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlIGNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZVNwZWNpZmljYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlSU8iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFByb2Nlc3MgQ29tcG9uZW50IGFwcGxpY2F0aW9uIGluIGEgUHJvY2VzcywgaS5lLiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmluZyB0aGUgUHJvY2Vzcy4gIFRoZSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIGRldGFpbHMgb2YgdGhlIGNvbXBvbmVudCBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIHRvIHByb3ZpZGUgaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcyBzdWNoIGFzIGl0IG93biBwcmVkZWNlc3NvcnMgYW5kIHN1Y2Nlc3NvcnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzQ29tcG9uZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFBsdWdpbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQgIy8vUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgUGx1Z2luIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLiYjeEQ7JiN4QTtNZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4mI3hEOyYjeEE7U3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNlckNoYW5nZWFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBhY2thZ2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGx1Z2luIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhcmlhYmlsaXR5RWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBjbGFzcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBuZXcgY2FwYWJpbGl0aWVzIGZvciBjb250ZW50IHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIENvbnRlbnQgRWxlbWVudHMgb3IgYW55IG90aGVyIE1ldGhvZCBFbGVtZW50IHRoYXQgZGVyaXZlcyBmcm9tIGl0LiAgSXQgaGFzIGJlZW4gcGxhY2VkIGluLWJldHdlZW4gdGhlIGNsYXNzZXMgTWV0aG9kIEVsZW1lbnQgYW5kIENvbnRlbnQgRWxlbWVudCBpbiB0aGUgb3ZlcmFsbCBVTUEgdGF4b25vbXkgb2YgY2xhc3NlcyB1c2luZyB0aGUgVU1MIDIuMCBwYWNrYWdlIG1lcmdlIG1lY2hhbmlzbS4gIFRoZSBhc3NvY2lhdGlvbiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiBzaGFsbCBvbmx5IGJlIGluc3RhbnRpYXRlZCBiZXR3ZWVuIHR3byBzdWJjbGFzc2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIHNhbWUgdHlwZS4gIFRoZSBlbGVtZW50IG9uIHZhcmFpYmlsaXR5U3BlY2lhbEVsZW1lbnQgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGRlZmluZXMgYSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUgZGVmaW5pbmcgdGhlIG5hdHVyZSBvZiB0aGUgcmVsYXRpb25zaGlwIHVzaW5nIGEgbGl0ZXJhbCBmcm9tIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLiYjeEQ7JiN4QTtWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBtZXRhLW1vZGVsIHBhY2thZ2UgTWV0aG9kIFBsdWdpbnMgYWRkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIE1ldGhvZCBFbGVtZW50cyB0aGF0IGRlcml2ZSBmcm9tIGl0LiAgQnkgZGVmYXVsdCBhbGwgQ29udGVudCBFbGVtZW50cyBzdWNoIGFzIFJvbGUsIFRhc2ssIEd1aWRhbmNlIFR5cGVzLCBvciBBY3Rpdml0aWVzIGFyZSBkZWZpbmVkIHRvIGJlIFZhcmlhYmlsaXR5IEVsZW1lbnRzLiYjeEQ7JiN4QTtWYXJpYWJpbGl0eSBhbmQgZXh0ZW5zaW9uIHByb3ZpZGVzIHVuaXF1ZSBtZWNoYW5pc21zIGZvciBjdXN0b21pemluZyBtZXRob2QgY29udGVudCB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudCwgYnV0IGJ5IGp1c3QgYmUgYWJsZSB0byBkZXNjcmliZSB3aXRoIHNlcGFyYXRlIG9iamVjdHMgdGhlIGRpZmZlcmVuY2VzIChhZGRpdGlvbnMsIGNoYW5nZXMsIG9taXNzaW9ucykgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsLiAgVGhpcyBwbHVnLWluIGNvbmNlcHQgYWxsb3dzIHVzZXJzIHRvIGZhY3RvciB0aGVpciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGludGVycmVsYXRlZCB1bml0cyBhbmQgZXZlbiB0byBhcmNoaXRlY3QgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBsYXllcnMgdGhhdCBleHRlbmQgZWFjaCBvdGhlciB3aXRoIG5ldyBjYXBhYmlsaXRpZXMuICBUaGUgcmVzdWx0aW5nIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNpZ24gY2FuIGJlIGR5bmFtaWNhbGx5IGNvbWJpbmVkIGFuZCBhcHBsaWVkIG9uIGRlbWFuZCB1c2luZyB0aGUgaW50ZXJwcmV0YXRpb24gcnVsZXMgZGVmaW5lZCBmb3IgVmFyaWFiaWxpdHkgRWxlbWVudCBTcGVjaWFsaXphdGlvbnMgYXNzZW1ibGluZyB0byBwcm9jZXNzIHByYWN0aXRpb25lcnMgdGhlIG1vc3QgYWNjdXJhdGUgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2NyaXB0aW9ucyBwb3NzaWJsZS4gIEl0IGFsc28gYWxsb3dzIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0byBleHRlbmRzIGFuZCB0YWlsb3IgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyB0aGV5IGRvIG5vdCBvd24gYW5kIHRvIGVhc2lseSB1cGdyYWRlIHRvIG5ld2VyIHZlcnNpb25zIGJ5IHNpbXBseSByZWFwcGx5IHRoZWlyIHBlcnNvbmFsIGNoYW5nZXMgdG8gdGhlc2UgdXBncmFkZXMuJiN4RDsmI3hBO1ZhcmlhYmlsaXR5IEVsZW1lbnQgZGVmaW5lcyB0d28gdHlwZXMgb2YgdmFyaWFiaWxpdHkgYW5kIG9uZSB0eXBlIG9mIGV4dGVuc2lvbiB3aGljaCBhcmUgZm9ybWFsbHkgZGVmaW5lZCBmb3IgdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5VHlwZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0ibmEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBpbiBpbnN0YW5jZSBvZiB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsaXphdGlvbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byBWYXJpYWJpbGl0eSBFbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlIGV4aXN0cywgdGhlbiB0aGUgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgaG93IHRoZSBlbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxFbGVtZW50IGVuZCBvZiB0aGUgYXNzb2NpYXRpb24gY2hhbmdlcyB0aGUgQ29udGVudCBFbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IGVuZC4gU2VlIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGVudW1lcmF0aW9uIGNsYXNzIGZvciBkZWZpbml0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiB2YXJpYWJpbGl0eS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5RWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlZhcmlhYmlsaXR5VHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVmFyaWFiaWxpdHkgVHlwZSBpcyBhbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJuYSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iY29udHJpYnV0ZXMiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJleHRlbmRzIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0icmVwbGFjZXMiIHZhbHVlPSIzIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJsb2NhbENvbnRyaWJ1dGlvbiIgdmFsdWU9IjQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImxvY2FsUmVwbGFjZW1lbnQiIHZhbHVlPSI1Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFVuaXQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgVW5pdCBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dGhvcnMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhbmdlRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29weXJpZ2h0U3RhdGVtZW50IiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBDb25maWd1cmF0aW9uIGlzIGEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQbHVnaW5TZWxlY3Rpb24iCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQYWNrYWdlU2VsZWN0aW9uIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3NWaWV3cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlZmF1bHRWaWV3IiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VDb25maWd1cmF0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRmFtaWx5IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZWxpdmVyeSBNb2RlbCBGYW1pbHkgaXMgYSBjb252ZW5pZW50IGdyb3VwaW5nIG9mIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyBvZiBpbnRlcmVzdCB0byBzb21lIHNwZWNpZmljIHVzZXIgY29tbXVuaXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyeVByb2Nlc3NlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGVsaXZlcnlQcm9jZXNzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZExpYnJhcnkiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQbHVnaW5zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlZmluZWRDb25maWd1cmF0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3VtYS5nZW5tb2RlbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMy91bWEuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI5NzBlNTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3VtYS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmVwZi51bWEiIHRlbXBsYXRlRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMiCi0gICAgcnVudGltZUphcj0idHJ1ZSIgZHluYW1pY1RlbXBsYXRlcz0idHJ1ZSIgbW9kZWxOYW1lPSJVbWEiIGVkaXRQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luIgotICAgIGVkaXRvclBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudW1hLnByZXNlbnRhdGlvbi5VbWFFZGl0b3JQbHVnaW4iIG5vbk5MU01hcmtlcnM9InRydWUiCi0gICAgcm9vdEV4dGVuZHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSU1vZGVsT2JqZWN0IiByb290RXh0ZW5kc0NsYXNzPSJvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3QiCi0gICAgcm9vdEltcGxlbWVudHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uSW50ZXJuYWxFRGF0YU9iamVjdCIgc3VwcHJlc3NFTUZUeXBlcz0idHJ1ZSIKLSAgICBmZWF0dXJlTWFwV3JhcHBlckludGVyZmFjZT0iY29tbW9uai5zZG8uU2VxdWVuY2UiIGZlYXR1cmVNYXBXcmFwcGVySW50ZXJuYWxJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8udXRpbC5FU2VxdWVuY2UiCi0gICAgZmVhdHVyZU1hcFdyYXBwZXJDbGFzcz0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby51dGlsLkJhc2ljRVNlcXVlbmNlIiBjb2RlRm9ybWF0dGluZz0idHJ1ZSIKLSAgICBjb250YWlubWVudFByb3hpZXM9InRydWUiPgotICA8Zm9yZWlnbk1vZGVsPkM6XEhvbWVccGhUTkdcVE5HX2RvY3NcT09BRFxDb250ZW50QXJjaGl0ZWN0dXJlXE1vZGVsc1xVTUEwM1xVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8c3RhdGljUGFja2FnZXM+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9TRE88L3N0YXRpY1BhY2thZ2VzPgotICA8bW9kZWxQbHVnaW5WYXJpYWJsZXM+RU1GX0NPTU1PTkpfU0RPPW9yZy5lY2xpcHNlLmVtZi5jb21tb25qLnNkbzwvbW9kZWxQbHVnaW5WYXJpYWJsZXM+Ci0gIDxtb2RlbFBsdWdpblZhcmlhYmxlcz5FTUZfRUNPUkVfU0RPPW9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG88L21vZGVsUGx1Z2luVmFyaWFibGVzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJVbWEiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5lcGYiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBlY29yZVBhY2thZ2U9InVtYS5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9maW5pc2hUb1N0YXJ0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvZmluaXNoVG9GaW5pc2giLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvU3RhcnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvRmluaXNoIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvaW5pdGlhbCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvam9pbiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvZm9yayIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvanVuY3Rpb24iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2Nob2ljZSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvZW50cnlQb2ludCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvZXhpdFBvaW50Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC90ZXJtaW5hdGUiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9uYSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvY29udHJpYnV0ZXMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2V4dGVuZHMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL3JlcGxhY2VzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9sb2NhbENvbnRyaWJ1dGlvbiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbG9jYWxSZXBsYWNlbWVudCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9EYXRlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9VcmkiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1N0cmluZyIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU2V0Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9TZXF1ZW5jZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vSW50ZWdlciIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vRmxvYXQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DbGFzc2lmaWVyIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVHlwZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9OYW1lZEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BhY2thZ2VhYmxlRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BhY2thZ2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9OYW1lc3BhY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2d1aWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2JyaWVmRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vd25lZFJ1bGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9zdXBwcmVzc2VkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vcmRlcmluZ0d1aWRlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnN0cmFpbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnN0cmFpbnQvYm9keSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvc3VwcG9ydGluZ01hdGVyaWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2NvbmNlcHRzQW5kUGFwZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY2hlY2tsaXN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2d1aWRlbGluZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9leGFtcGxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2Fzc2V0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9wcmVzZW50YXRpb25OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9wcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvc2hhcGVpY29uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L25vZGVpY29uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL21haW5EZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vc2VjdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24va2V5Q29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2VjdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2VjdGlvbi9zZWN0aW9uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NlY3Rpb24vc2VjdGlvbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlY3Rpb24vc3ViU2VjdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3ByZWRlY2Vzc29yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZS9tb2RpZmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGUvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L3JlcG9ydHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90ZW1wbGF0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90b29sTWVudG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L2VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3BlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9tYW5kYXRvcnlJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svb3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svb3B0aW9uYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9zdGVwcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svdG9vbE1lbnRvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL2VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtEZWZpbml0aW9uL3ByZWNvbmRpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbi9wb3N0Y29uZGl0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N0ZXAiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HdWlkYW5jZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FydGlmYWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQXJ0aWZhY3QvY29udGFpbmVyQXJ0aWZhY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQXJ0aWZhY3QvY29udGFpbmVkQXJ0aWZhY3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZS9kZWxpdmVyZWRXb3JrUHJvZHVjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vT3V0Y29tZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvZ2xvYmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9yZXVzZWRQYWNrYWdlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL3BhcmVudFBhY2thZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9jaGlsZFBhY2thZ2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnRQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudFBhY2thZ2UvY29udGVudEVsZW1lbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vYnJpZWZPdXRsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9yZXByZXNlbnRhdGlvbk9wdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9leHRlcm5hbElkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9pbXBhY3RPZk5vdEhhdmluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vcmVhc29uc0Zvck5vdE5lZWRpbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbi9leHRlcm5hbERlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbi9wYWNrYWdpbmdHdWlkYW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbi9za2lsbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vYXNzaWdubWVudEFwcHJvYWNoZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vc3lub255bXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbi9hbHRlcm5hdGl2ZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGFuY2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vR3VpZGFuY2VEZXNjcmlwdGlvbi9hdHRhY2htZW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2FkZGl0aW9uYWxJbmZvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9wcm9ibGVtIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9iYWNrZ3JvdW5kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9nb2FscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYXBwbGljYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2xldmVsc09mQWRvcHRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUG9pbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BvaW50L3giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qb2ludC95Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9wb3NpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvY29udGFpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9saW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9hbmNob3JhZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L3NlbWFudGljTW9kZWwiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L2lzVmlzaWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9jb250YWluZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9yZWZlcmVuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvcHJvcGVydHkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL3pvb20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvdmlld3BvcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvZGlhZ3JhbSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaENvbm5lY3RvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWRnZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL3ByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2dyYXBoRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2RpYWdyYW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGltZW5zaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaW1lbnNpb24vd2lkdGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaW1lbnNpb24vaGVpZ2h0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JlZmVyZW5jZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUmVmZXJlbmNlL2lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUmVmZXJlbmNlL3JlZmVyZW5jZWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvcGVydHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb3BlcnR5L2tleSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb3BlcnR5L3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoRWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFZGdlL2FuY2hvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVkZ2Uvd2F5cG9pbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpYWdyYW0iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW0vem9vbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtL3ZpZXdwb2ludCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW0vZGlhZ3JhbUxpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbS9uYW1lc3BhY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhOb2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhOb2RlL3NpemUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50L3R5cGVJbmZvIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UvZWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UvZWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9MZWFmRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RleHRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9UZXh0RWxlbWVudC90ZXh0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0ltYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9JbWFnZS91cmkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9JbWFnZS9taW1lVHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaGljUHJpbWl0aXZlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUG9seWxpbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BvbHlsaW5lL2Nsb3NlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qb2x5bGluZS93YXlwb2ludHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRWxsaXBzZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yYWRpdXNYIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yYWRpdXNZIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yb3RhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2Uvc3RhcnRBbmdsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2UvZW5kQW5nbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRWxsaXBzZS9jZW50ZXIiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQWN0aXZpdHkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2JyZWFrZG93bkVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvcm9hZG1hcHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9zdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvY2hlY2tsaXN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2NvbmNlcHRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvZXhhbXBsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9ndWlkZWxpbmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvcmV1c2FibGVBc3NldHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9pc0VuYWN0YWJsZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNSZXBlYXRhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNPbmdvaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNFdmVudERyaXZlbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2xpbmtUb1ByZWRlY2Vzc29yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlZml4Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9pc1BsYW5uZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2hhc011bHRpcGxlT2NjdXJyZW5jZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2lzT3B0aW9uYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZXNlbnRlZEFmdGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVzZW50ZWRCZWZvcmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wbGFubmluZ0RhdGEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3N1cGVyQWN0aXZpdGllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NaWxlc3RvbmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9JdGVyYXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QaGFzZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RlYW1Qcm9maWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS90ZWFtUm9sZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS9zdXBlclRlYW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS9zdWJUZWFtIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9Sb2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9tb2RpZmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtPcmRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya09yZGVyL2xpbmtUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya09yZGVyL3ByZWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0VsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YS9zdGFydERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEvZmluaXNoRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YS9yYW5rIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaXB0b3IvaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2FjdGl2aXR5RW50cnlTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9hY3Rpdml0eUV4aXRTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9Xb3JrUHJvZHVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RlZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvZGVsaXZlcmFibGVQYXJ0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvVGFzayIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvYXNzaXN0ZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2V4dGVybmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9tYW5kYXRvcnlJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL29wdGlvbmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9vdXRwdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9wZXJmb3JtZWRQcmltYXJpbHlCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL3NlbGVjdGVkU3RlcHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29tcG9zaXRlUm9sZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29tcG9zaXRlUm9sZS9hZ2dyZWdhdGVkUm9sZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24vdXNhZ2VHdWlkYW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL2FsdGVybmF0aXZlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vaG93dG9TdGFmZiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vc2NhbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcmlza0xldmVsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vZXN0aW1hdGluZ1RlY2huaXF1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Byb2plY3RNZW1iZXJFeHBlcnRpc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi90eXBlT2ZDb250cmFjdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi9leHRlcm5hbElkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uL3Njb3BlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uL3VzYWdlTm90ZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVzY3JpcHRvckRlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmlwdG9yRGVzY3JpcHRpb24vcmVmaW5lZERlc2NyaXB0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbmNlcHQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DaGVja2xpc3QiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9FeGFtcGxlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUmVwb3J0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVtcGxhdGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Ub29sTWVudG9yIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV2hpdGVwYXBlciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rlcm1EZWZpbml0aW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJhY3RpY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9zdWJQcmFjdGljZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9jb250ZW50UmVmZXJlbmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ByYWN0aWNlL2FjdGl2aXR5UmVmZXJlbmNlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU3RhdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlL1dvcmtQcm9kdWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlL1JlZ2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlL3N1Ym1hY2hpbmUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVmVydGV4Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVmVydGV4L2NvbnRhaW5lciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ZlcnRleC9vdXRnb2luZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ZlcnRleC9pbmNvbWluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZWdpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWdpb24vVmVydGV4Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZ2lvbi9UcmFuc2l0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZ2lvbi9TdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWdpb24vU3RhdGVNYWNoaW5lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N0YXRlTWFjaGluZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlTWFjaGluZS9SZWdpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVHJhbnNpdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVHJhbnNpdGlvbi9Xb3JrRGVmaW5pdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UcmFuc2l0aW9uL2NvbnRhaW5lciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RyYW5zaXRpb24vc291cmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVHJhbnNpdGlvbi90YXJnZXQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaXNjaXBsaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaXNjaXBsaW5lL3Rhc2tzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvc3ViZGlzY2lwbGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvcmVmZXJlbmNlV29ya2Zsb3dzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVTZXQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVTZXQvcm9sZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRG9tYWluIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Eb21haW4vd29ya1Byb2R1Y3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RvbWFpbi9zdWJkb21haW5zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0VHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlL3dvcmtQcm9kdWN0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaXNjaXBsaW5lR3JvdXBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZy9kaXNjaXBsaW5lcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Ub29sIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Ub29sL3Rvb2xNZW50b3JzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVTZXRHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZVNldEdyb3VwaW5nL3JvbGVTZXRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9jYXRlZ29yaXplZEVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkvc3ViQ2F0ZWdvcmllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzcy9lZHVjYXRpb25NYXRlcmlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MvY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2VzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy9pbmNsdWRlc1BhdHRlcm5zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy9kZWZhdWx0Q29udGV4dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3MvdmFsaWRDb250ZXh0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NhcGFiaWxpdHlQYXR0ZXJuIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlL2Jhc2VkT25Qcm9jZXNzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9hZG1hcCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQvaW50ZXJmYWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L3Byb2Nlc3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZS9wcm9jZXNzRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UvZGlhZ3JhbXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UvaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9pbnRlcmZhY2VJTyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IvUHJvY2Vzc0NvbXBvbmVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFBsdWdpbi91c2VyQ2hhbmdlYWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vbWV0aG9kUGFja2FnZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vYmFzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQvdmFyaWFiaWxpdHlUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlFbGVtZW50L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kVW5pdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9hdXRob3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jaGFuZ2VEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jaGFuZ2VEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvdmVyc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY29weXJpZ2h0U3RhdGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vbWV0aG9kUGx1Z2luU2VsZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9tZXRob2RQYWNrYWdlU2VsZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9wcm9jZXNzVmlld3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL2RlZmF1bHRWaWV3Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9iYXNlQ29uZmlndXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0ZhbWlseSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0ZhbWlseS9kZWxpdmVyeVByb2Nlc3NlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kTGlicmFyeS9tZXRob2RQbHVnaW5zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZExpYnJhcnkvcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC91bWEuZWNvcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvdW1hLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YWNkMzNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC91bWEuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxMjM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InVtYSIKLSAgICBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmVwZi51bWEiPgotICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iMDMiLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGF0ZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5EYXRlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEYXRhIHR5cGUgdXNlZCBmb3IgYXR0cmlidXRlcyBvZiBtZXRhLW1vZGVsIGNsYXNzZXMgb2YgdGhlIHR5cGUgRGF0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVXJpIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5uZXQuVVJJIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEYXRhIHR5cGUgdXNlZCBmb3IgYXR0cmlidXRlcyBvZiBtZXRhLW1vZGVsIGNsYXNzZXMgdGhhdCBwb2ludCB0byByZXNvdXJjZXMgc3VjaCBhcyBmaWxlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVW5saW1pdGVkTmF0dXJhbCIgaW5zdGFuY2VDbGFzc05hbWU9ImludCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN0cmluZyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTZXQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuU2V0Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU2VxdWVuY2UiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuTGlzdCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkludGVnZXIiIGluc3RhbmNlQ2xhc3NOYW1lPSJpbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJGbG9hdCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5GbG9hdCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNsYXNzaWZpZXIiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIENsYXNzaWZpZXIuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlR5cGUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOYW1lZEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuICBEZWZpbmVkIHRoYXQgZXZlcnkgZWxlbWVudCBoYXMgYSBuYW1lLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9OYW1lZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9OYW1lc3BhY2UgIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZXNwYWNlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVzcGFjZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IGNsYXNzIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGlzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzIE1ldGhvZCBFbGVtZW50IGlzIHRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIGNsYXNzZXMgYW5kIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGV2ZXJ5IG90aGVyIGVsZW1lbnQgdHlwZSBvZiB0aGlzIG1vZGVsLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuICBNZXRob2QgRWxlbWVudCBpbmhlcml0cyB0aGUgTmFtZSBhdHRyaWJ1dGUgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50J3Mgc3VwZXIgY2xhc3MuICBFdmVyeSBlbGVtZW50IGRlZmluZWQgYXMgYSBVTUEgaW5zdGFuY2UgaXMgZGVyaXZlZCBmcm9tIE1vZGVsIEVsZW1lbnQuICBFdmVyeSBNZXRob2QgRWxlbWVudCBpbi1zdGFuY2UgaXMgYXQgbGVhc3QgZGVmaW5lZCBieSBhIHVuaXF1ZSBpZCwgYSBuYW1lLCBhcyB3ZWxsIGFzIGJyaWVmIGRlc2NyaXB0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJndWlkIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvd25lZFJ1bGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25zdHJhaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RFbGVtZW50UHJvcGVydHkiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZEVsZW1lbnRQcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3VwcHJlc3NlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlIEV4dGVuZHMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3JkZXJpbmdHdWlkZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgQ0FTRSB0b29sIHJlYWxpemF0aW9ucyBvZiB0aGlzIG1vZGVsIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgbGF5b3V0IGFuZCBvcmRlcmluZyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYW5kIGl0cyBwYXJ0cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29uc3RyYWludCIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29uc3RyYWludCBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJib2R5IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBzdG9yZXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIgZVN1cGVyVHlwZXM9IiMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpYmFibGVFbGVtZW50ICMvL1ZhcmlhYmlsaXR5RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGVudCBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LiYjeEQ7JiN4QTtDb250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbmNlcHRzQW5kUGFwZXJzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25jZXB0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNoZWNrbGlzdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NoZWNrbGlzdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJndWlkZWxpbmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HdWlkZWxpbmUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhhbXBsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0V4YW1wbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCAjLy9DbGFzc2lmaWVyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliYWJsZSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4mI3hEOyYjeEE7VGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlIChzZWUgU2VjdGlvbiA0LjEuNCkuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gJnF1b3Q7cnVwX2FyY2hpdGVjdHVyZV9kb2N1bWVudCZxdW90OyB0byBkaWZmZXJlbnRpYXRlIGZyb20gYSAmcXVvdDtqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50JnF1b3Q7IHdoZXJlYXMgdGhlIGV4dGVybmFsIHByZXNlbnRhdGlvbiB3b3VsZCBhbHdheXMgYmUgJnF1b3Q7QXJjaGl0ZWN0dXJlIERvY3VtZW50JnF1b3Q7LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50YXRpb24iIGVUeXBlPSIjLy9Db250ZW50RGVzY3JpcHRpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNoYXBlaWNvbiIgZVR5cGU9IiMvL1VyaSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm9kZWljb24iIGVUeXBlPSIjLy9VcmkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250ZW50IERlc2NyaXB0aW9uIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgc3RvcmUgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJLZXkgQ29uc2lkZXJhdGlvbnMgcHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlY3Rpb24iIGVTdXBlclR5cGVzPSIjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgU2VjdGlvbiBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VjdGlvbk5hbWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VjdGlvbkRlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlNlY3Rpb25zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TZWN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkZWNlc3NvciIgZVR5cGU9IiMvL1NlY3Rpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvbGUgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgJiN4RDsmI3hBO0EgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZGlmaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzcG9uc2libGVGb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIFByb2R1Y3QgaXMgYW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuJiN4RDsmI3hBO0Egd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXBvcnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXBvcnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGVtcGxhdGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UZW1wbGF0ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sTWVudG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQgIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGFzayBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLiYjeEQ7JiN4QTtBIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAmI3hEOyYjeEE7QSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gJiN4RDsmI3hBO0ZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXZlbG9wIFVzZSBDYXNlIE1vZGVsJnF1b3Q7IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgJnF1b3Q7bWV0aG9kJnF1b3Q7IG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyZm9ybWVkQnkiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRwdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN0ZXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdGVwIiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIKLSAgICAgICAgZGVyaXZlZD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sTWVudG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrRGVmaW5pdGlvbiIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIERlZmluaXRpb24gaXMgYW4gYWJzdHJhY3QgTWV0aG9kIEVsZW1lbnQgdGhhdCBnZW5lcmFsaXplcyBhbGwgZGVzY3JpcHRpb25zIG9mIHdvcmsgd2l0aGluIHRoZSBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUuICBUaGlzIHBhY2thZ2UgaW50cm9kdWNlcyB0d28gY29uY3JldGUgdHlwZXMgb2YgV29yayBEZWZpbml0aW9uczogVGFzayBhbmQgU3RlcC4gIFdvcmsgRGVmaW5pdGlvbnMgY2FuIGNvbnRhaW4gc2V0cyBvZiBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbnMgZGVmaW5pbmcgY29uc3RyYWludHMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkIGJlZm9yZSB0aGUgZGVzY3JpYmVkIHdvcmsgY2FuIGJlZ2luIG9yIGJlZm9yZSBpdCBjYW4gYmUgZGVjbGFyZWQgYXMgZmluaXNoZWQuICBOb3RlIHRoYXQgZ2VuZXJhbCBvd25lZFJ1bGVzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFuZCBydWxlcyBmb3IgV29yayBEZWZpbml0aW9ucy4mI3hEOyYjeEE7V29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVjb25kaXRpb24iIGVUeXBlPSIjLy9Db25zdHJhaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3N0Y29uZGl0aW9uIiBlVHlwZT0iIy8vQ29uc3RyYWludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RlcCIgZVN1cGVyVHlwZXM9IiMvL1NlY3Rpb24gIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgU3RlcCBpcyBhIFNlY3Rpb24gYW5kIFdvcmsgRGVmaW5pdGlvbiB0aGF0IGlzIHVzZWQgdG8gb3JnYW5pemUgVGFza3MgaW50byBwYXJ0cyBvciBzdWJ1bml0cyBvZiB3b3JrLiAgU3RlcHMgaW5oZXJpdCB0aGUgc3ViU2VjdGlvbnMgZGVjb21wb3NpdGlvbiBmcm9tIFNlY3Rpb24gYW5kIGNhbiB0aGVyZWZvcmUgZGVzY3JpYmUgU3ViLVN0ZXBzIG5lc3RlZCBpbnRvIFN0ZXBzLiYjeEQ7JiN4QTtBIFN0ZXAgZGVzY3JpYmVzIGEgbWVhbmluZ2Z1bCBhbmQgY29uc2lzdCBwYXJ0IG9mIHRoZSBvdmVyYWxsIHdvcmsgZGVzY3JpYmVkIGZvciBhIFRhc2suICBUaGUgY29sbGVjdGlvbiBvZiBTdGVwcyBkZWZpbmVkIGZvciBhIFRhc2sgcmVwcmVzZW50cyBhbGwgdGhlIHdvcmsgdGhhdCBzaG91bGQgYmUgZG9uZSB0byBhY2hpZXZlIHRoZSBvdmVyYWxsIGRldmVsb3BtZW50IGdvYWwgb2YgdGhlIFRhc2suICBOb3QgYWxsIHN0ZXBzIGFyZSBuZWNlc3NhcmlseSBwZXJmb3JtZWQgZWFjaCB0aW1lIGEgVGFzayBpcyBpbnZva2VkIGluIGEgUHJvY2VzcyAoc2VlIFRhc2sgRGVzY3JpcHRvciksIHNvIHRoZXkgY2FuIGFsc28gYmUgZXhwcmVzc2VkIGluIHRoZSBmb3JtIG9mIGFsdGVybmF0ZSAnZmxvd3MnIG9mIHdvcmsuICBEaWZmZXJlbnQgd2F5cyBvZiBhY2hpZXZpbmcgdGhlIHNhbWUgZGV2ZWxvcG1lbnQgZ29hbCBjYW4gdGhlbiBiZSAnYXNzZW1ibGVkJyBieSBzZWxlY3RpbmcgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBzdGVwcyB3aGVuIGFwcGx5aW5nIHRoZSBUYXNrIGluIGEgUHJvY2Vzcy4gIFR5cGljYWwga2luZHMgb2Ygc3RlcHMgYSBUYXNrIGF1dGhvciBzaG91bGQgY29uc2lkZXIgYXJlOiBUaGlua2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgdW5kZXJzdGFuZCB0aGUgbmF0dXJlIG9mIHRoZSB0YXNrLCBnYXRoZXJzIGFuZCBleGFtaW5lcyB0aGUgaW5wdXQgYXJ0aWZhY3RzLCBhbmQgZm9ybXVsYXRlcyB0aGUgb3V0Y29tZS4gUGVyZm9ybWluZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgY3JlYXRlIG9yIHVwZGF0ZSBzb21lIGFydGlmYWN0cy4gUmV2aWV3aW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBpbnNwZWN0cyB0aGUgcmVzdWx0cyBhZ2FpbnN0IHNvbWUgY3JpdGVyaWEuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRhbmNlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJ0aWZhY3QiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQXJ0aWZhY3QgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4mI3hEOyYjeEE7QXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICZxdW90O293biZxdW90OyBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZXJBcnRpZmFjdCIgZVR5cGU9IiMvL0FydGlmYWN0IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vQXJ0aWZhY3QvY29udGFpbmVkQXJ0aWZhY3RzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lZEFydGlmYWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQXJ0aWZhY3QiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0FydGlmYWN0L2NvbnRhaW5lckFydGlmYWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJhYmxlIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVsaXZlcmFibGUgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyZWRXb3JrUHJvZHVjdHMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGNvbWUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gb3V0Y29tZSBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RQYWNrYWdlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQgIy8vUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgUGFja2FnZSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnbG9iYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJldXNlZFBhY2thZ2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNoaWxkUGFja2FnZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb250ZW50IFBhY2thZ2UgaXMgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMgYW5kIENvbnRlbnQgRWxlbWVudHMsIG9ubHkuICBFeGFtcGxlcyBmb3IgQ29udGVudCBFbGVtZW50IGFyZSBBcnRpZmFjdHMsIFRhc2tzLCBSb2xlcywgZXRjLiAgQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudEVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50RWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJicmllZk91dGxpbmUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlcHJlc2VudGF0aW9uT3B0aW9ucyIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxJZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBhY3RPZk5vdEhhdmluZyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhc29uc0Zvck5vdE5lZWRpbmciIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJza2lsbHMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXNzaWdubWVudEFwcHJvYWNoZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3lub255bXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdGVybmF0aXZlcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXR0YWNobWVudHMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFkZGl0aW9uYWxJbmZvIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvYmxlbSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiYWNrZ3JvdW5kIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdvYWxzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXBwbGljYXRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbHNPZkFkb3B0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb2ludCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IngiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3NpdGlvbiIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZWQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW1FbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtRWxlbWVudC9jb250YWluZXIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGluayIgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbUxpbmsiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1MaW5rL2dyYXBoRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhbmNob3JhZ2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0dyYXBoQ29ubmVjdG9yIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VtYW50aWNNb2RlbCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZ3JhcGhFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW1FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1Zpc2libGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lciIgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9jb250YWluZWQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZWZlcmVuY2UiIGVPcHBvc2l0ZT0iIy8vUmVmZXJlbmNlL3JlZmVyZW5jZWQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvcGVydHkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtTGluayIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iem9vbSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2aWV3cG9ydCIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvbGluayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtL2RpYWdyYW1MaW5rIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoQ29ubmVjdG9yIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L2FuY2hvcmFnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVkZ2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0dyYXBoRWRnZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVkZ2UvYW5jaG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlbWFudGljTW9kZWxCcmlkZ2UiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlc2VudGF0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L3NlbWFudGljTW9kZWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbSIgZVR5cGU9IiMvL0RpYWdyYW0iCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtL25hbWVzcGFjZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaW1lbnNpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3aWR0aCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoZWlnaHQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVmZXJlbmNlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlZCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW1FbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1FbGVtZW50L3JlZmVyZW5jZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9wZXJ0eSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2V5IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaEVkZ2UiIGVTdXBlclR5cGVzPSIjLy9HcmFwaEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhbmNob3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIyIiB1cHBlckJvdW5kPSIyIiBlVHlwZT0iIy8vR3JhcGhDb25uZWN0b3IiIGVPcHBvc2l0ZT0iIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFZGdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndheXBvaW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjIiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUG9pbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW0iIGVTdXBlclR5cGVzPSIjLy9HcmFwaE5vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ6b29tIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZpZXdwb2ludCIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtTGluayIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlhZ3JhbUxpbmsiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUxpbmsvZGlhZ3JhbSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lc3BhY2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2RpYWdyYW0iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhOb2RlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2l6ZSIgZVR5cGU9IiMvL0RpbWVuc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZUluZm8iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9FbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxlYWZFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGV4dEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRleHQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbWFnZSIgZVN1cGVyVHlwZXM9IiMvL0xlYWZFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJpIiBlVHlwZT0iIy8vVXJpIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbWVUeXBlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhpY1ByaW1pdGl2ZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvbHlsaW5lIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhpY1ByaW1pdGl2ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsb3NlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2F5cG9pbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMiIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qb2ludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWxsaXBzZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoaWNQcmltaXRpdmUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYWRpdXNYIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhZGl1c1kiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm90YXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnRBbmdsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbmRBbmdsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjZW50ZXIiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZpdHkiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCAjLy9WYXJpYWJpbGl0eUVsZW1lbnQgIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEFjdGl2aXR5IGlzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4mI3hEOyYjeEE7QWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJyZWFrZG93bkVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0JyZWFrZG93bkVsZW1lbnQvc3VwZXJBY3Rpdml0aWVzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvYWRtYXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2FkbWFwIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGVja2xpc3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DaGVja2xpc3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uY2VwdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbmNlcHQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhhbXBsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0V4YW1wbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3VpZGVsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJldXNhYmxlQXNzZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzRW5hY3RhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgV29yayBCcmVha2Rvd24gRWxlbWVudCBpcyBhIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1JlcGVhdGFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09uZ29pbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0V2ZW50RHJpdmVuIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGlua1RvUHJlZGVjZXNzb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtPcmRlciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJCcmVha2Rvd24gRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWZpeCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gJnF1b3Q7U1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMmcXVvdDsgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgJnF1b3Q7U29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzJnF1b3Q7IG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICZxdW90O0N1c3RvbWVyLkFyY2hpdGVjdCZxdW90OyB3b3VsZCBkZWZpbmUgYSAmcXVvdDtDdXN0b21lciZxdW90OyBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgJnF1b3Q7QXJjaGl0ZWN0JnF1b3Q7IGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzUGxhbm5lZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuJiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXRhaWwgVXNlIENhc2UmcXVvdDsgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzT3B0aW9uYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpc09wdGlvbmFsIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlc2VudGVkQWZ0ZXIiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRlZEJlZm9yZSIgZVR5cGU9IiMvL0JyZWFrZG93bkVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGxhbm5pbmdEYXRhIiBlVHlwZT0iIy8vUGxhbm5pbmdEYXRhIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBlckFjdGl2aXRpZXMiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9BY3Rpdml0eSIgZU9wcG9zaXRlPSIjLy9BY3Rpdml0eS9icmVha2Rvd25FbGVtZW50cyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNaWxlc3RvbmUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNaWxlc3RvbmUgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJdGVyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSXRlcmF0aW9uIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuJiN4RDsmI3hBO0l0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQaGFzZSIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQaGFzZSBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLiYjeEQ7JiN4QTtQaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVhbVByb2ZpbGUiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRlYW0gUHJvZmlsZSBpcyBhIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuJiN4RDsmI3hBO1dvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4mI3hEOyYjeEE7SGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZWFtUm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cGVyVGVhbSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1RlYW1Qcm9maWxlIiBlT3Bwb3NpdGU9IiMvL1RlYW1Qcm9maWxlL3N1YlRlYW0iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViVGVhbSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGVhbVByb2ZpbGUiIGVPcHBvc2l0ZT0iIy8vVGVhbVByb2ZpbGUvc3VwZXJUZWFtIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJSb2xlIiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2RpZmllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBPcmRlciByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEIpIGJlbG93KSBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEEpIGJlbG93KSBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9TdGFydCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9GaW5pc2giIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvU3RhcnQiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvRmluaXNoIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrT3JkZXIiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBPcmRlciBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgJiN4RDsmI3hBOyhOb3RlLCBXb3JrIE9yZGVyIGlzIG5vdCBtb2RlbGVkIGFzIGFuIEFzc29jaWF0aW9uIENsYXNzIHRvIHByb3ZpZGUgYSBzdHJhaWdodGZvcndhcmQgbWFwcGluZyAgdG8gWE1JIGFuZCBFTUYuKSYjeEQ7JiN4QTtUaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rVHlwZSIgZVR5cGU9IiMvL1dvcmtPcmRlclR5cGUiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZpbmlzaFRvU3RhcnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZCIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvY2VzcyBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuJiN4RDsmI3hBO1Byb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGxhbm5pbmdEYXRhIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlBsYW5uaW5nIERhdGEgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4mI3hEOyYjeEE7UGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LiYjeEQ7JiN4QTsoTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydERhdGUiIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoRGF0ZSIgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFuayIgZVR5cGU9IiMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVzY3JpcHRvciBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuJiN4RDsmI3hBO0Rlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgJiN4RDsmI3hBO0ZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLiYjeEQ7JiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IldvcmtQcm9kdWN0IiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW1wYWN0ZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGFjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0ZWRCeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyYWJsZVBhcnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza0Rlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCAjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRhc2sgRGVzY3JpcHRvciBpcyBhIERlc2NyaXB0b3IgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4mI3hEOyYjeEE7QSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJUYXNrIiBlVHlwZT0iIy8vVGFzayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzaXN0ZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZXJuYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dHB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBlcmZvcm1lZFByaW1hcmlseUJ5IiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VsZWN0ZWRTdGVwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb21wb3NpdGVSb2xlIiBlU3VwZXJUeXBlcz0iIy8vUm9sZURlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29tcG9zaXRlIFJvbGUgaXMgYSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuJiN4RDsmI3hBO0EgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZ2dyZWdhdGVkUm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNhZ2VHdWlkYW5jZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIEFjdGl2aXR5LCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0aXZpdHkgYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhY2hpZXZlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbHRlcm5hdGl2ZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIHRoaXMgQWN0aXZpdHkgbm90IGNvdmVyZWQgYnkgdGhlIEFjdGl2aXR5J3MgVGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhvd3RvU3RhZmYiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGJhY2tncm91bmQgb24gd2hvIHNob3VsZCBiZSBpbnZvbHZlZCBpbiB0aGlzIGFjdGl2aXR5IHdoYXQgYXJlIHRoZSByZXF1aXJlZCBza2lsbHMsIGV4cGVyaWVuY2UsICBhbmQgcGVyaGFwcyBhdHRpdHVkZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NhbGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik91dGxpbmVzIGNoYXJhY3RlcmlzdGljcyBhYm91dCB0aGUgc2l6ZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvamVjdCBleHByZXNzZWQgaW4gdGVhbSBzaXplLCBtYW4geWVhcnMsIGV0Yy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdENoYXJhY3RlcmlzdGljcyIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyaXNrTGV2ZWwiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRpbmdUZWNobmlxdWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgRXN0aW1hdGlvbiBUZWNobmlxdWVzIHByb3ZpZGVkIGZvciB0aGlzIFByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3RNZW1iZXJFeHBlcnRpc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGEgcHJvZmlsZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0ZWFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHJvbGVzLCBza2lsbHMgcmVxdWlyZWQgZm9yIGEgdGVhbSBwZXJmb3JtcyBhIHByb2plY3QgYmFzZWQgb24gdGhpcyBwcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlT2ZDb250cmFjdCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udHJhY3RzIHRoYXQgbmVlZCB0byBiZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIGEgcHJvamVjdCB0ZWFtIHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9jZXNzIGFuZCBhIGNsaWVudCAoZS5nLiBmb3IgYW4gSUdTIGVuZ2FnZW1lbnQpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxJZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGRlbGl2ZXJ5IHBhdHRlcm5zIGFuZCBtb2RlbHMuIEl0IGlzIHVzZWQgbGlrZSBhIHN5bm9ueW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjb3BlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNhZ2VOb3RlcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpcHRvckRlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVmaW5lZERlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25jZXB0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29uY2VwdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNoZWNrbGlzdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENoZWNrbGlzdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXhhbXBsZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBFeGFtcGxlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSB0eXBpY2FsLCBwYXJ0aWFsbHkgY29tcGxldGVkLCBzYW1wbGUgaW5zdGFuY2Ugb2Ygb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBvciBzY2VuYXJpbyBsaWtlIGRlc2NyaXB0aW9ucyBvZiBob3cgVGFzayBtYXkgYmUgcGVyZm9ybWVkLiBFeGFtcGxlcyBjYW4gYmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3RzIGFzIHdlbGwgYXMgVGFza3MgdGhhdCBwcm9kdWNlIHRoZW0gYXMgd2VsbCBhcyBhbnkgb3RoZXIgQ29udGVudCBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkZWxpbmUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBHdWlkZWxpbmUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVwb3J0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUmVwb3J0IGlzIGEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVtcGxhdGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUZW1wbGF0ZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1cHBvcnRpbmcgTWF0ZXJpYWxzIGlzIGNhdGNoYWxsIGZvciBvdGhlciB0eXBlcyBvZiBndWlkYW5jZSBub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgQ29udGVudCBFbGVtZW50cywgaS5lLiBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRvb2xNZW50b3IiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUb29sIE1lbnRvciBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yayBhIFdvcmsgUHJvZHVjdCBlaXRoZXIgaW4gdGhlIGNvbnRleHQgb2Ygb3IgaW5kZXBlbmRlbnQgZnJvbSBhIFRhc2sgb3IgQWN0aXZpdHkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldoaXRlcGFwZXIiIGVTdXBlclR5cGVzPSIjLy9Db25jZXB0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGl0ZXBhcGVycyBhcmUgYSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVybURlZmluaXRpb24iIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGVybURlZmluaXRpb25zIGRlZmluZSBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUaGV5IGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcmFjdGljZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByYWN0aWNlIHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAmcXVvdDtNYW5hZ2UgUmlza3MmcXVvdDssICZxdW90O0NvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSZxdW90OywgJnF1b3Q7QXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCZxdW90OywgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJQcmFjdGljZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1ByYWN0aWNlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250ZW50UmVmZXJlbmNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWN0aXZpdHlSZWZlcmVuY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BY3Rpdml0eSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucyBxdWFsaWZ5IHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJldXNhYmxlQXNzZXQiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSZXVzYWJsZSBBc3NldCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LiBUaGUgYXNzZXQgbWF5IGhhdmUgYSB2YXJpYWJpbGl0eSBwb2ludCwgd2hpY2ggaXMgYSBsb2NhdGlvbiBpbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLiBUaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nJiN4RDsmI3hBO2hvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0YXRlIiBlU3VwZXJUeXBlcz0iIy8vVmVydGV4Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iV29ya1Byb2R1Y3QiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlJlZ2lvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVnaW9uIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9SZWdpb24vU3RhdGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VibWFjaGluZSIgZVR5cGU9IiMvL1N0YXRlTWFjaGluZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWZXJ0ZXgiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZXIiIGVUeXBlPSIjLy9SZWdpb24iCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9SZWdpb24vVmVydGV4Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGdvaW5nIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UcmFuc2l0aW9uIiBlT3Bwb3NpdGU9IiMvL1RyYW5zaXRpb24vc291cmNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluY29taW5nIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UcmFuc2l0aW9uIiBlT3Bwb3NpdGU9IiMvL1RyYW5zaXRpb24vdGFyZ2V0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlZ2lvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlZlcnRleCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVmVydGV4IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9WZXJ0ZXgvY29udGFpbmVyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlRyYW5zaXRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RyYW5zaXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1RyYW5zaXRpb24vY29udGFpbmVyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlN0YXRlIiBlVHlwZT0iIy8vU3RhdGUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TdGF0ZS9SZWdpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iU3RhdGVNYWNoaW5lIiBlVHlwZT0iIy8vU3RhdGVNYWNoaW5lIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU3RhdGVNYWNoaW5lL1JlZ2lvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdGF0ZU1hY2hpbmUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlJlZ2lvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVnaW9uIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9SZWdpb24vU3RhdGVNYWNoaW5lIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRyYW5zaXRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJXb3JrRGVmaW5pdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya0RlZmluaXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVyIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUmVnaW9uIiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUmVnaW9uL1RyYW5zaXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic291cmNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vVmVydGV4IiBlT3Bwb3NpdGU9IiMvL1ZlcnRleC9vdXRnb2luZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXJnZXQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9WZXJ0ZXgiIGVPcHBvc2l0ZT0iIy8vVmVydGV4L2luY29taW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBzZXVkb1N0YXRlIiBlU3VwZXJUeXBlcz0iIy8vVmVydGV4Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJQc2V1ZG9TdGF0ZUtpbmQiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iaW5pdGlhbCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iam9pbiIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZvcmsiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJqdW5jdGlvbiIgdmFsdWU9IjMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImNob2ljZSIgdmFsdWU9IjQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImVudHJ5UG9pbnQiIHZhbHVlPSI1Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJleGl0UG9pbnQiIHZhbHVlPSI2Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJ0ZXJtaW5hdGUiIHZhbHVlPSI3Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpc2NpcGxpbmUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGlzY2lwbGluZSBpcyBhIGNhdGVnb3JpemF0aW9uIG9mIHdvcmsgKGkuZS4gVGFza3MgZm9yIE1ldGhvZCBDb250ZW50KSwgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4mI3hEOyYjeEE7QSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXNrcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFzayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJkaXNjaXBsaW5lIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaXNjaXBsaW5lIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWZlcmVuY2VXb3JrZmxvd3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0FjdGl2aXR5Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRDYXRlZ29yeSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGVudCBDYXRlZ29yeSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBnZW5lcmFsaXppbmcgY29udGVudCBjYXRlZ29yeSB0eXBlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZVNldCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIFNldCBvcmdhbml6ZXMgUm9sZXMgaW50byBjYXRlZ29yaWVzLiAgSXQgaXMgdXNlZCB0byBncm91cCByb2xlcyB0b2dldGhlciB0aGF0IGhhdmUgY2VydGFpbiBjb21tb25hbGl0aWVzLiAgRm9yIGV4YW1wbGUsIHRoZSAmcXVvdDtBbmFseXN0cyZxdW90OyBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgJnF1b3Q7QnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0JnF1b3Q7LCAmcXVvdDtTeXN0ZW0gQW5hbHlzdCZxdW90OywgYXMgd2VsbCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgU3BlY2lmaWVyJnF1b3Q7IHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRG9tYWluIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEb21haW4gaXMgYSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuJiN4RDsmI3hBO0RvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtQcm9kdWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViZG9tYWlucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRG9tYWluIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdFR5cGUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgUHJvZHVjdCBUeXBlIGlzIGEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAmcXVvdDtDbGFzcyBEaWFncmFtJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyB0aGUgQXJ0aWZhY3RzIEFuYWx5c2lzIE1vZGVsLCBEZXNpZ24gTW9kZWwsIFVzZXIgRXhwZXJpZW5jZSBNb2RlbCwgb3IgJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya1Byb2R1Y3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaXNjaXBsaW5lR3JvdXBpbmciIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRpc2NpcGxpbmUgR3JvdXBpbmdzIGFyZSB1c2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICZxdW90O1NvZnR3YXJlIERpc2NpcGxpbmVzJnF1b3Q7IHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQmcXVvdDsgb3IgJnF1b3Q7VGVzdGluZyZxdW90OzsgJnF1b3Q7SVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCZxdW90OyB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICZxdW90O0lUIE9wZXJhdGlvbmFsIFNlcnZpY2VzJnF1b3Q7LCAmcXVvdDtJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzJnF1b3Q7LCBvciAmcXVvdDtJVCBFbmFibGluZyBTZXJ2aWNlcyZxdW90Oy4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlzY2lwbGluZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Rpc2NpcGxpbmUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVG9vbCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUb29sIGlzIGEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRvb2xNZW50b3JzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Ub29sTWVudG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVTZXRHcm91cGluZyIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUm9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb2xlU2V0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZVNldCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDdXN0b21DYXRlZ29yeSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDdXN0b20gQ2F0ZWdvcnkgaXMgYSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICZxdW90O1Rlc3RpbmcmcXVvdDsgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2F0ZWdvcml6ZWRFbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGVzY3JpYmFibGVFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YkNhdGVnb3JpZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3MiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlbGl2ZXJ5IFByb2Nlc3NlcyBpcyBhIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4mI3hEOyYjeEE7QSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVkdWNhdGlvbk1hdGVyaWFscyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbW11bmljYXRpb25zTWF0ZXJpYWxzIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2VzcyIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4mI3hEOyYjeEE7Q29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmNsdWRlc1BhdHRlcm5zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DYXBhYmlsaXR5UGF0dGVybiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWZhdWx0Q29udGV4dCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsaWRDb250ZXh0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJuIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgUGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIERpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLiYjeEQ7JiN4QTtBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZTomI3hEOyYjeEE7LSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4mI3hEOyYjeEE7LSBUbyBzdXBwb3J0IGRpcmVjdCBleGVjdXRpb24gaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgd29yayBmb2xsb3dpbmcgYSB3ZWxsLWRlZmluZWQgcHJvY2VzcywgYnV0IHdvcmtzIGJhc2VkIG9uIGxvb3NlbHkgY29ubmVjdGVkIHByb2Nlc3MgZnJhZ21lbnRzIG9mIGJlc3QgcHJhY3RpY2VzIGluIGEgZmxleGlibGUgbWFubmVyIChlLmcuIEFnaWxlIERldmVsb3BtZW50KS4mI3hEOyYjeEE7LSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgaXMgcHJlcGFyZWQgZm9yIGluc3RhbnRpYXRpb24gYnkgYSBwcm9qZWN0IHBsYW5uaW5nIHRvb2wuICBUeXBpY2FsbHksIGl0IGlzIGNyZWF0ZWQgYmFzZWQgb24gYSBQcm9jZXNzIHN1Y2ggYXMgYSBEZWxpdmVyeSBQcm9jZXNzIGFzIGEgd2hvbGUgKGUuZy4gaW4gY2FzZSBvZiBhIHdhdGVyZmFsbC1iYXNlZCBkZXZlbG9wbWVudCBhcHByb2FjaCkgb3IgaW4gcGFydHMgKGUuZy4gaW4gY2FzZSBvZiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpLiYjeEQ7JiN4QTtBIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZWRPblByb2Nlc3NlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2VzcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2FkbWFwIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9hZG1hcCBpcyBhIHNwZWNpYWwgR3VpZGFuY2UgVHlwZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLiYjeEQ7JiN4QTtBbiBpbnN0YW5jZSBvZiBhIFJvYWRtYXAgcmVwcmVzZW50cyBpbXBvcnRhbnQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEFjdGl2aXR5IG9yIFByb2Nlc3MgaXQgaXMgcmVsYXRlZCB0by4gIE9mdGVuIGEgY29tcGxleCBBY3Rpdml0eSBzdWNoIGFzIGEgUHJvY2VzcyBjYW4gYmUgbXVjaCBlYXNpZXIgdW5kZXJzdG9vZCBieSBwcm92aWRpbmcgYSB3YWxrdGhyb3VnaCB3aXRoIGEgbGluZWFyIHRocmVhZCBvZiBhIHR5cGljYWwgaW5zdGFudGlhdGlvbiBvZiB0aGlzIEFjdGl2aXR5LiAgSW4gYWRkaXRpb24gdG8gbWFraW5nIHRoZSBwcm9jZXNzIHByYWN0aXRpb25lciB1bmRlcnN0YW5kIGhvdyB3b3JrIGluIHRoZSBwcm9jZXNzIGlzIGJlaW5nIHBlcmZvcm1lZCwgYSBSb2FkbWFwIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IEFjdGl2aXRpZXMgYW5kIFRhc2tzIHJlbGF0ZSB0byBlYWNoIG90aGVyIG92ZXIgdGltZS4gIFJvYWRtYXBzIGFyZSBhbHNvIHVzZWQgdG8gc2hvdyBob3cgc3BlY2lmaWMgYXNwZWN0cyBhcmUgZGlzdHJpYnV0ZWQgb3ZlciBhIHdob2xlIHByb2Nlc3MgcHJvdmlkaW5nIGEga2luZCBvZiBmaWx0ZXIgb24gdGhlIHByb2Nlc3MgZm9yIHRoaXMgaW5mb3JtYXRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzUGFja2FnZSAjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29tcG9uZW50IGlzIGEgc3BlY2lhbCBQcm9jZXNzIFBhY2thZ2UgdGhhdCBhcHBsaWVzIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uICBBIFByb2Nlc3MgQ29tcG9uZW50IHJlYWxpemVzIG9uZSBvciBtb3JlIEludGVyZmFjZXMgd2hpY2ggc3BlY2lmeSBpbnB1dHMgYW5kIG91dHB1dHMgb2YgdGhlIGNvbXBvbmVudC4gVGhlcmUgbWlnaHQgYmUgbWFueSBjb21wb25lbnRzIHJlYWxpemluZyB0aGUgc2FtZSBpbnRlcmZhY2VzLCBidXQgdXNpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgdG8gYWNoaWV2ZSBzaW1pbGFyIG91dHB1dHMgZm9yIHNpbWlsYXIgaW5wdXRzLiAgV2hlcmVhcyB0aGUgQ29tcG9uZW50IEludGVyZmFjZXMgcmVwcmVzZW50IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyAoYmxhY2sgYm94IGRlc2NyaXB0aW9ucyBvZiB0aGUgY29tcG9uZW50KSwgZ29vZCBjYW5kaWRhdGVzIGZvciBjb21wb25lbnQgcmVhbGl6YXRpb25zIGNhbiBiZSBmb3VuZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zICh3aGl0ZSBib3ggZGVzY3JpcHRpb25zIGZvciB0aGUgY29tcG9uZW50KS4mI3hEOyYjeEE7VU1BIHN1cHBvcnRzIHJlcGxhY2VhYmxlIGFuZCByZXVzYWJsZSBQcm9jZXNzIENvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uIENlcnRhaW4gc2l0dWF0aW9ucyBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgbWlnaHQgcmVxdWlyZSB0aGF0IGNvbmNyZXRlIHJlYWxpemF0aW9ucyBvZiBwYXJ0cyBvZiB0aGUgcHJvY2VzcyByZW1haW4gdW5kZWNpZGVkIG9yIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgZXhlY3V0aW5nIHRlYW0gaXRzZWxmIChlLmcuIGluIG91dHNvdXJjaW5nIHNpdHVhdGlvbnMpLiAgVU1BIHByb3ZpZGVzIGEgdW5pcXVlIGNvbXBvbmVudCBjb25jZXB0IGRlZmluaW5nIGludGVyZmFjZXMgZm9yIHdvcmsgcHJvZHVjdCBpbnB1dCBhbmQgb3V0cHV0LCBhbGxvd2luZyB0cmVhdGluZyB0aGUgYWN0dWFsIGRlZmluaXRpb24gb2YgdGhlIHdvcmsgdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0cyBhcyBhICZxdW90O2JsYWNrIGJveCZxdW90Oy4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgJnF1b3Q7cmVhbGl6YXRpb24mcXVvdDsgZGV0YWlsaW5nIHRoZSB3b3JrIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJvY2Vzcy4gIFRoZSBjb21wb25lbnQgYXBwcm9hY2ggYWxzbyBhbGxvd3MgdGhhdCBkaWZmZXJlbnQgc3R5bGVzIG9yIHRlY2huaXF1ZXMgb2YgZG9pbmcgd29yayBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvbmUgYW5vdGhlci4gIEZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGNvZGUgb3V0cHV0IG9mIGEgY29tcG9uZW50IGNvdWxkIGJlIHByb2R1Y2VkIHdpdGggYSBtb2RlbC1kcml2ZW4gZGV2ZWxvcG1lbnQgb3IgYSBjb2RlLWNlbnRyaWMgdGVjaG5pcXVlLiAgVGhlIGNvbXBvbmVudCBjb25jZXB0IGVuY2Fwc3VsYXRlcyB0aGUgYWN0dWFsIHdvcmsgYW5kIGxldHMgdGhlIGRldmVsb3BtZW50IHRlYW0gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB0ZWNobmlxdWUgYW5kIGZpbGwgdGhlIGNvbXBvbmVudCdzIHJlYWxpemF0aW9uIHdpdGggdGhlaXIgY2hvaWNlIG9mIEFjdGl2aXRpZXMgdGhhdCBwcm9kdWNlIHRoZSByZXF1aXJlZCBvdXRwdXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3MiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzUGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFBhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb2Nlc3MgUGFja2FnZSBpcyBhIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LiYjeEQ7JiN4QTtBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzRWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb2Nlc3NFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlhZ3JhbSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlIGNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZVNwZWNpZmljYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlSU8iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFByb2Nlc3MgQ29tcG9uZW50IGFwcGxpY2F0aW9uIGluIGEgUHJvY2VzcywgaS5lLiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmluZyB0aGUgUHJvY2Vzcy4gIFRoZSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIGRldGFpbHMgb2YgdGhlIGNvbXBvbmVudCBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIHRvIHByb3ZpZGUgaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcyBzdWNoIGFzIGl0IG93biBwcmVkZWNlc3NvcnMgYW5kIHN1Y2Nlc3NvcnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzQ29tcG9uZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFBsdWdpbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQgIy8vUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgUGx1Z2luIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLiYjeEQ7JiN4QTtNZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4mI3hEOyYjeEE7U3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNlckNoYW5nZWFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBhY2thZ2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGx1Z2luIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhcmlhYmlsaXR5RWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBjbGFzcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBuZXcgY2FwYWJpbGl0aWVzIGZvciBjb250ZW50IHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIENvbnRlbnQgRWxlbWVudHMgb3IgYW55IG90aGVyIE1ldGhvZCBFbGVtZW50IHRoYXQgZGVyaXZlcyBmcm9tIGl0LiAgSXQgaGFzIGJlZW4gcGxhY2VkIGluLWJldHdlZW4gdGhlIGNsYXNzZXMgTWV0aG9kIEVsZW1lbnQgYW5kIENvbnRlbnQgRWxlbWVudCBpbiB0aGUgb3ZlcmFsbCBVTUEgdGF4b25vbXkgb2YgY2xhc3NlcyB1c2luZyB0aGUgVU1MIDIuMCBwYWNrYWdlIG1lcmdlIG1lY2hhbmlzbS4gIFRoZSBhc3NvY2lhdGlvbiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiBzaGFsbCBvbmx5IGJlIGluc3RhbnRpYXRlZCBiZXR3ZWVuIHR3byBzdWJjbGFzc2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIHNhbWUgdHlwZS4gIFRoZSBlbGVtZW50IG9uIHZhcmFpYmlsaXR5U3BlY2lhbEVsZW1lbnQgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGRlZmluZXMgYSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUgZGVmaW5pbmcgdGhlIG5hdHVyZSBvZiB0aGUgcmVsYXRpb25zaGlwIHVzaW5nIGEgbGl0ZXJhbCBmcm9tIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLiYjeEQ7JiN4QTtWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBtZXRhLW1vZGVsIHBhY2thZ2UgTWV0aG9kIFBsdWdpbnMgYWRkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIE1ldGhvZCBFbGVtZW50cyB0aGF0IGRlcml2ZSBmcm9tIGl0LiAgQnkgZGVmYXVsdCBhbGwgQ29udGVudCBFbGVtZW50cyBzdWNoIGFzIFJvbGUsIFRhc2ssIEd1aWRhbmNlIFR5cGVzLCBvciBBY3Rpdml0aWVzIGFyZSBkZWZpbmVkIHRvIGJlIFZhcmlhYmlsaXR5IEVsZW1lbnRzLiYjeEQ7JiN4QTtWYXJpYWJpbGl0eSBhbmQgZXh0ZW5zaW9uIHByb3ZpZGVzIHVuaXF1ZSBtZWNoYW5pc21zIGZvciBjdXN0b21pemluZyBtZXRob2QgY29udGVudCB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudCwgYnV0IGJ5IGp1c3QgYmUgYWJsZSB0byBkZXNjcmliZSB3aXRoIHNlcGFyYXRlIG9iamVjdHMgdGhlIGRpZmZlcmVuY2VzIChhZGRpdGlvbnMsIGNoYW5nZXMsIG9taXNzaW9ucykgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsLiAgVGhpcyBwbHVnLWluIGNvbmNlcHQgYWxsb3dzIHVzZXJzIHRvIGZhY3RvciB0aGVpciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGludGVycmVsYXRlZCB1bml0cyBhbmQgZXZlbiB0byBhcmNoaXRlY3QgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBsYXllcnMgdGhhdCBleHRlbmQgZWFjaCBvdGhlciB3aXRoIG5ldyBjYXBhYmlsaXRpZXMuICBUaGUgcmVzdWx0aW5nIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNpZ24gY2FuIGJlIGR5bmFtaWNhbGx5IGNvbWJpbmVkIGFuZCBhcHBsaWVkIG9uIGRlbWFuZCB1c2luZyB0aGUgaW50ZXJwcmV0YXRpb24gcnVsZXMgZGVmaW5lZCBmb3IgVmFyaWFiaWxpdHkgRWxlbWVudCBTcGVjaWFsaXphdGlvbnMgYXNzZW1ibGluZyB0byBwcm9jZXNzIHByYWN0aXRpb25lcnMgdGhlIG1vc3QgYWNjdXJhdGUgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2NyaXB0aW9ucyBwb3NzaWJsZS4gIEl0IGFsc28gYWxsb3dzIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0byBleHRlbmRzIGFuZCB0YWlsb3IgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyB0aGV5IGRvIG5vdCBvd24gYW5kIHRvIGVhc2lseSB1cGdyYWRlIHRvIG5ld2VyIHZlcnNpb25zIGJ5IHNpbXBseSByZWFwcGx5IHRoZWlyIHBlcnNvbmFsIGNoYW5nZXMgdG8gdGhlc2UgdXBncmFkZXMuJiN4RDsmI3hBO1ZhcmlhYmlsaXR5IEVsZW1lbnQgZGVmaW5lcyB0d28gdHlwZXMgb2YgdmFyaWFiaWxpdHkgYW5kIG9uZSB0eXBlIG9mIGV4dGVuc2lvbiB3aGljaCBhcmUgZm9ybWFsbHkgZGVmaW5lZCBmb3IgdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5VHlwZSIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0ibmEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBpbiBpbnN0YW5jZSBvZiB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsaXphdGlvbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byBWYXJpYWJpbGl0eSBFbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlIGV4aXN0cywgdGhlbiB0aGUgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgaG93IHRoZSBlbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxFbGVtZW50IGVuZCBvZiB0aGUgYXNzb2NpYXRpb24gY2hhbmdlcyB0aGUgQ29udGVudCBFbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IGVuZC4gU2VlIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGVudW1lcmF0aW9uIGNsYXNzIGZvciBkZWZpbml0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiB2YXJpYWJpbGl0eS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5RWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlZhcmlhYmlsaXR5VHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVmFyaWFiaWxpdHkgVHlwZSBpcyBhbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJuYSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iY29udHJpYnV0ZXMiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJleHRlbmRzIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0icmVwbGFjZXMiIHZhbHVlPSIzIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJsb2NhbENvbnRyaWJ1dGlvbiIgdmFsdWU9IjQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImxvY2FsUmVwbGFjZW1lbnQiIHZhbHVlPSI1Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJleHRlbmRzUmVwbGFjZXMiIHZhbHVlPSI2Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFVuaXQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgVW5pdCBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dGhvcnMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhbmdlRGF0ZSIgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29weXJpZ2h0U3RhdGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBDb25maWd1cmF0aW9uIGlzIGEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQbHVnaW5TZWxlY3Rpb24iCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQYWNrYWdlU2VsZWN0aW9uIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3NWaWV3cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlZmF1bHRWaWV3IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VDb25maWd1cmF0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJ0cmFjdGVkQ2F0ZWdvcnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZGRlZENhdGVnb3J5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0ZhbWlseSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVsaXZlcnkgTW9kZWwgRmFtaWx5IGlzIGEgY29udmVuaWVudCBncm91cGluZyBvZiBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgb2YgaW50ZXJlc3QgdG8gc29tZSBzcGVjaWZpYyB1c2VyIGNvbW11bml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RlbGl2ZXJ5UHJvY2VzcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RMaWJyYXJ5IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCAjLy9QYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGx1Z2lucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGx1Z2luIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC91bWEuZ2VubW9kZWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvdW1hLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MGQ0M2YzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC91bWEuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMiCi0gICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS5lcGYudW1hIiB0ZW1wbGF0ZURpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzIgotICAgIHJ1bnRpbWVKYXI9InRydWUiIGR5bmFtaWNUZW1wbGF0ZXM9InRydWUiIG1vZGVsTmFtZT0iVW1hIiBlZGl0UGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnVtYS5wcmVzZW50YXRpb24uVW1hRWRpdG9yUGx1Z2luIiBub25OTFNNYXJrZXJzPSJ0cnVlIgotICAgIHJvb3RFeHRlbmRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdCIgcm9vdEV4dGVuZHNDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0IgotICAgIHJvb3RJbXBsZW1lbnRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkludGVybmFsRURhdGFPYmplY3QiIHN1cHByZXNzRU1GVHlwZXM9InRydWUiCi0gICAgZmVhdHVyZU1hcFdyYXBwZXJJbnRlcmZhY2U9ImNvbW1vbmouc2RvLlNlcXVlbmNlIiBmZWF0dXJlTWFwV3JhcHBlckludGVybmFsSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnV0aWwuRVNlcXVlbmNlIgotICAgIGZlYXR1cmVNYXBXcmFwcGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8udXRpbC5CYXNpY0VTZXF1ZW5jZSIgY29kZUZvcm1hdHRpbmc9InRydWUiCi0gICAgY29udGFpbm1lbnRQcm94aWVzPSJ0cnVlIj4KLSAgPGZvcmVpZ25Nb2RlbD5DOlxIb21lXHBoVE5HXFROR19kb2NzXE9PQURcQ29udGVudEFyY2hpdGVjdHVyZVxNb2RlbHNcVU1BMDRcVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZS5tZGw8L2ZvcmVpZ25Nb2RlbD4KLSAgPHN0YXRpY1BhY2thZ2VzPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvU0RPPC9zdGF0aWNQYWNrYWdlcz4KLSAgPG1vZGVsUGx1Z2luVmFyaWFibGVzPkVNRl9DT01NT05KX1NETz1vcmcuZWNsaXBzZS5lbWYuY29tbW9uai5zZG88L21vZGVsUGx1Z2luVmFyaWFibGVzPgotICA8bW9kZWxQbHVnaW5WYXJpYWJsZXM+RU1GX0VDT1JFX1NETz1vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvPC9tb2RlbFBsdWdpblZhcmlhYmxlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iVW1hIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuZXBmIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgZWNvcmVQYWNrYWdlPSJ1bWEuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvZmluaXNoVG9TdGFydCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL2ZpbmlzaFRvRmluaXNoIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvc3RhcnRUb1N0YXJ0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvc3RhcnRUb0ZpbmlzaCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2luaXRpYWwiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2pvaW4iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2ZvcmsiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2p1bmN0aW9uIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9jaG9pY2UiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2VudHJ5UG9pbnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2V4aXRQb2ludCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvdGVybWluYXRlIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbmEiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2NvbnRyaWJ1dGVzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9leHRlbmRzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9yZXBsYWNlcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbG9jYWxDb250cmlidXRpb24iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2xvY2FsUmVwbGFjZW1lbnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2V4dGVuZHNSZXBsYWNlcyIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9EYXRlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9VcmkiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1N0cmluZyIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU2V0Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9TZXF1ZW5jZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vSW50ZWdlciIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vRmxvYXQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DbGFzc2lmaWVyIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVHlwZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9OYW1lZEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BhY2thZ2VhYmxlRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BhY2thZ2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9OYW1lc3BhY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2d1aWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2JyaWVmRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vd25lZFJ1bGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvbWV0aG9kRWxlbWVudFByb3BlcnR5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9zdXBwcmVzc2VkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vcmRlcmluZ0d1aWRlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnN0cmFpbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnN0cmFpbnQvYm9keSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50UHJvcGVydHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnRQcm9wZXJ0eS92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvc3VwcG9ydGluZ01hdGVyaWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2NvbmNlcHRzQW5kUGFwZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY2hlY2tsaXN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2d1aWRlbGluZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9leGFtcGxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2Fzc2V0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9wcmVzZW50YXRpb25OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9wcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvc2hhcGVpY29uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L25vZGVpY29uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL21haW5EZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vc2VjdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24va2V5Q29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2VjdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2VjdGlvbi9zZWN0aW9uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NlY3Rpb24vc2VjdGlvbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlY3Rpb24vc3ViU2VjdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3ByZWRlY2Vzc29yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZS9tb2RpZmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGUvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L3JlcG9ydHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90ZW1wbGF0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90b29sTWVudG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L2VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3BlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9tYW5kYXRvcnlJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svb3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svb3B0aW9uYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9zdGVwcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svdG9vbE1lbnRvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL2VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtEZWZpbml0aW9uL3ByZWNvbmRpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbi9wb3N0Y29uZGl0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N0ZXAiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HdWlkYW5jZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FydGlmYWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQXJ0aWZhY3QvY29udGFpbmVyQXJ0aWZhY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQXJ0aWZhY3QvY29udGFpbmVkQXJ0aWZhY3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZS9kZWxpdmVyZWRXb3JrUHJvZHVjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vT3V0Y29tZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvZ2xvYmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9yZXVzZWRQYWNrYWdlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL2NoaWxkUGFja2FnZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudFBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50UGFja2FnZS9jb250ZW50RWxlbWVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9icmllZk91dGxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL3JlcHJlc2VudGF0aW9uT3B0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL2V4dGVybmFsSWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL2ltcGFjdE9mTm90SGF2aW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9yZWFzb25zRm9yTm90TmVlZGluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZURlc2NyaXB0aW9uL2V4dGVybmFsRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZURlc2NyaXB0aW9uL3BhY2thZ2luZ0d1aWRhbmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL3NraWxscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbi9hc3NpZ25tZW50QXBwcm9hY2hlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbi9zeW5vbnltcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uL2FsdGVybmF0aXZlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HdWlkYW5jZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9HdWlkYW5jZURlc2NyaXB0aW9uL2F0dGFjaG1lbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYWRkaXRpb25hbEluZm8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL3Byb2JsZW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2JhY2tncm91bmQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2dvYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9hcHBsaWNhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vbGV2ZWxzT2ZBZG9wdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qb2ludCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUG9pbnQveCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BvaW50L3kiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L3Bvc2l0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9jb250YWluZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L2xpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L2FuY2hvcmFnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvc2VtYW50aWNNb2RlbCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvaXNWaXNpYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L2NvbnRhaW5lciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L3JlZmVyZW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9wcm9wZXJ0eSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaWFncmFtTGluayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvem9vbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay92aWV3cG9ydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay9ncmFwaEVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay9kaWFncmFtIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFZGdlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NlbWFudGljTW9kZWxCcmlkZ2UvcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZGlhZ3JhbSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaW1lbnNpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpbWVuc2lvbi93aWR0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpbWVuc2lvbi9oZWlnaHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUmVmZXJlbmNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9SZWZlcmVuY2UvaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWZlcmVuY2UvcmVmZXJlbmNlZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9wZXJ0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvcGVydHkva2V5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvcGVydHkvdmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhFZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVkZ2UvYW5jaG9yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWRnZS93YXlwb2ludHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlhZ3JhbSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGlhZ3JhbS96b29tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW0vdmlld3BvaW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbS9kaWFncmFtTGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtL25hbWVzcGFjZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaE5vZGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaE5vZGUvc2l6ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQvdHlwZUluZm8iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVU1BU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVU1BU2VtYW50aWNNb2RlbEJyaWRnZS9lbGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS9lbGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0xlYWZFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGV4dEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1RleHRFbGVtZW50L3RleHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vSW1hZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0ltYWdlL3VyaSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0ltYWdlL21pbWVUeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoaWNQcmltaXRpdmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qb2x5bGluZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUG9seWxpbmUvY2xvc2VkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1BvbHlsaW5lL3dheXBvaW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9FbGxpcHNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL3JhZGl1c1giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL3JhZGl1c1kiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL3JvdGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9zdGFydEFuZ2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9lbmRBbmdsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9FbGxpcHNlL2NlbnRlciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BY3Rpdml0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvYnJlYWtkb3duRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9yb2FkbWFwcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L3N1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9jaGVja2xpc3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvY29uY2VwdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9leGFtcGxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2d1aWRlbGluZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9yZXVzYWJsZUFzc2V0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2lzRW5hY3RhYmxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9pc1JlcGVhdGFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9pc09uZ29pbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9pc0V2ZW50RHJpdmVuIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvbGlua1RvUHJlZGVjZXNzb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVmaXgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2lzUGxhbm5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaXNPcHRpb25hbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlc2VudGVkQWZ0ZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZXNlbnRlZEJlZm9yZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3BsYW5uaW5nRGF0YSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvc3VwZXJBY3Rpdml0aWVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01pbGVzdG9uZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0l0ZXJhdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BoYXNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVhbVByb2ZpbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RlYW1Qcm9maWxlL3RlYW1Sb2xlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RlYW1Qcm9maWxlL3N1cGVyVGVhbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RlYW1Qcm9maWxlL3N1YlRlYW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL1JvbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL21vZGlmaWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya09yZGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrT3JkZXIvbGlua1R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrT3JkZXIvcHJlZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhL3N0YXJ0RGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YS9maW5pc2hEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhL3JhbmsiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpcHRvci9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvYWN0aXZpdHlFbnRyeVN0YXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2FjdGl2aXR5RXhpdFN0YXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL1dvcmtQcm9kdWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdGVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9kZWxpdmVyYWJsZVBhcnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9UYXNrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9hc3Npc3RlZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvZXh0ZXJuYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL21hbmRhdG9yeUlucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivb3B0aW9uYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL291dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL3BlcmZvcm1lZFByaW1hcmlseUJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivc2VsZWN0ZWRTdGVwcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db21wb3NpdGVSb2xlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db21wb3NpdGVSb2xlL2FnZ3JlZ2F0ZWRSb2xlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi91c2FnZUd1aWRhbmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vYWx0ZXJuYXRpdmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9ob3d0b1N0YWZmIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9zY2FsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Byb2plY3RDaGFyYWN0ZXJpc3RpY3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9yaXNrTGV2ZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9lc3RpbWF0aW5nVGVjaG5pcXVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcHJvamVjdE1lbWJlckV4cGVydGlzZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3R5cGVPZkNvbnRyYWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uL2V4dGVybmFsSWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vc2NvcGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vdXNhZ2VOb3RlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZXNjcmlwdG9yRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi9yZWZpbmVkRGVzY3JpcHRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29uY2VwdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NoZWNrbGlzdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0V4YW1wbGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HdWlkZWxpbmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZXBvcnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZW1wbGF0ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rvb2xNZW50b3IiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9XaGl0ZXBhcGVyIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVybURlZmluaXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QcmFjdGljZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ByYWN0aWNlL3N1YlByYWN0aWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ByYWN0aWNlL2NvbnRlbnRSZWZlcmVuY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJhY3RpY2UvYWN0aXZpdHlSZWZlcmVuY2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JldXNhYmxlQXNzZXQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdGF0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU3RhdGUvV29ya1Byb2R1Y3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU3RhdGUvUmVnaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU3RhdGUvc3VibWFjaGluZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9WZXJ0ZXgiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9WZXJ0ZXgvY29udGFpbmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVmVydGV4L291dGdvaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVmVydGV4L2luY29taW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JlZ2lvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZ2lvbi9WZXJ0ZXgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUmVnaW9uL1RyYW5zaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUmVnaW9uL1N0YXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZ2lvbi9TdGF0ZU1hY2hpbmUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU3RhdGVNYWNoaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU3RhdGVNYWNoaW5lL1JlZ2lvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UcmFuc2l0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UcmFuc2l0aW9uL1dvcmtEZWZpbml0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RyYW5zaXRpb24vY29udGFpbmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVHJhbnNpdGlvbi9zb3VyY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UcmFuc2l0aW9uL3RhcmdldCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rpc2NpcGxpbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvdGFza3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZS9zdWJkaXNjaXBsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZS9yZWZlcmVuY2VXb3JrZmxvd3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZVNldCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZVNldC9yb2xlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Eb21haW4iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RvbWFpbi93b3JrUHJvZHVjdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRG9tYWluL3N1YmRvbWFpbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdFR5cGUvd29ya1Byb2R1Y3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZUdyb3VwaW5nL2Rpc2NpcGxpbmVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rvb2wiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rvb2wvdG9vbE1lbnRvcnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZVNldEdyb3VwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlU2V0R3JvdXBpbmcvcm9sZVNldHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5L2NhdGVnb3JpemVkRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9zdWJDYXRlZ29yaWVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2VzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzL2VkdWNhdGlvbk1hdGVyaWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzcy9jb21tdW5pY2F0aW9uc01hdGVyaWFscyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzL2luY2x1ZGVzUGF0dGVybnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzL2RlZmF1bHRDb250ZXh0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy92YWxpZENvbnRleHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUvYmFzZWRPblByb2Nlc3NlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2FkbWFwIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9pbnRlcmZhY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQvcHJvY2VzcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NQYWNrYWdlL3Byb2Nlc3NFbGVtZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZS9kaWFncmFtcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9pbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlL2ludGVyZmFjZUlPIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci9Qcm9jZXNzQ29tcG9uZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFBsdWdpbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luL3VzZXJDaGFuZ2VhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBsdWdpbi9tZXRob2RQYWNrYWdlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBsdWdpbi9iYXNlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5RWxlbWVudC92YXJpYWJpbGl0eVR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RVbml0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L2F1dGhvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L2NoYW5nZURhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L2NoYW5nZURlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC92ZXJzaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jb3B5cmlnaHRTdGF0ZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9tZXRob2RQbHVnaW5TZWxlY3Rpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL21ldGhvZFBhY2thZ2VTZWxlY3Rpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL3Byb2Nlc3NWaWV3cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vZGVmYXVsdFZpZXciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL2Jhc2VDb25maWd1cmF0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vc3VidHJhY3RlZENhdGVnb3J5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9hZGRlZENhdGVnb3J5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NGYW1pbHkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NGYW1pbHkvZGVsaXZlcnlQcm9jZXNzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kTGlicmFyeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZExpYnJhcnkvbWV0aG9kUGx1Z2lucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L3ByZWRlZmluZWRDb25maWd1cmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3NTM5ZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBVTUEKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZWIyZGQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlIAotICAgICAgICAgICAgdXJpID0gImh0dHA6Ly93d3cuaWJtLmNvbS91bWEvMS4wLjIvdW1hLmVjb3JlIiAKLSAgICAgICAgICAgIGNsYXNzID0gIm9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSIgLz4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlIgotICAgICAgICAgICAgdXJpPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FjdGl2aXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjQ2ZDhhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2aXR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gQWN0aXZpdHkgaXMgYSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBXb3JrIERlZmluaXRpb24gd2hpY2ggc3VwcG9ydHMgdGhlIG5lc3RpbmcgYW5kIGxvZ2ljYWwgZ3JvdXBpbmcgb2YgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudHMgZm9ybWluZyBicmVha2Rvd24gc3RydWN0dXJlcy4gIEFsdGhvdWdoIEFjdGl2aXR5IGlzIGEgY29uY3JldGUgbWV0YS1jbGFzcywgb3RoZXIgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVyaXZlIGZyb20gaXQ7IHN1Y2ggYXMgUGhhc2UsIEl0ZXJhdGlvbiwgRGVsaXZlcnkgUHJvY2Vzcywgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuLgotICogQWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRCcmVha2Rvd25FbGVtZW50cyA8ZW0+QnJlYWtkb3duIEVsZW1lbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldFJvYWRtYXBzIDxlbT5Sb2FkbWFwczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRDaGVja2xpc3RzIDxlbT5DaGVja2xpc3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldENvbmNlcHRzIDxlbT5Db25jZXB0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRFeGFtcGxlcyA8ZW0+RXhhbXBsZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0R3VpZGVsaW5lcyA8ZW0+R3VpZGVsaW5lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRSZXVzYWJsZUFzc2V0cyA8ZW0+UmV1c2FibGUgQXNzZXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldElzRW5hY3RhYmxlIDxlbT5JcyBFbmFjdGFibGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBY3Rpdml0eSBleHRlbmRzIFdvcmtCcmVha2Rvd25FbGVtZW50LCBWYXJpYWJpbGl0eUVsZW1lbnQsCi0JCVdvcmtEZWZpbml0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnR9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXRpZXMgPGVtPlN1cGVyIEFjdGl2aXRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QnJlYWtkb3duIEVsZW1lbnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QnJlYWtkb3duIEVsZW1lbnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXRpZXMKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50IiBvcHBvc2l0ZT0ic3VwZXJBY3Rpdml0aWVzIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRCcmVha2Rvd25FbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9hZG1hcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXB9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um9hZG1hcHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2FkbWFwczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9Sb2FkbWFwcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcCIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0Um9hZG1hcHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWx9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWwiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DaGVja2xpc3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hlY2tsaXN0czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9DaGVja2xpc3RzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3QiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldENoZWNrbGlzdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbmNlcHRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uY2VwdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfQ29uY2VwdHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldENvbmNlcHRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGFtcGxlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4YW1wbGVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X0V4YW1wbGVzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRFeGFtcGxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkd1aWRlbGluZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HdWlkZWxpbmVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X0d1aWRlbGluZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0R3VpZGVsaW5lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJldXNhYmxlIEFzc2V0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldXNhYmxlIEFzc2V0czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9SZXVzYWJsZUFzc2V0cygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldCIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UmV1c2FibGVBc3NldHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SXMgRW5hY3RhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEVuYWN0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SXNFbmFjdGFibGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9Jc0VuYWN0YWJsZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzRW5hY3RhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldElzRW5hY3RhYmxlIDxlbT5JcyBFbmFjdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIEVuYWN0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SXNFbmFjdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzRW5hY3RhYmxlKEJvb2xlYW4gdmFsdWUpOwotCi19IC8vIEFjdGl2aXR5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQWN0aXZpdHlEZXNjcmlwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FjdGl2aXR5RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmRiNjEzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQWN0aXZpdHlEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRIb3d0b1N0YWZmIDxlbT5Ib3d0byBTdGFmZjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aXZpdHlEZXNjcmlwdGlvbiBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFB1cnBvc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHVycG9zZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFB1cnBvc2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIENvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIHRoaXMgQWN0aXZpdHkgbm90IGNvdmVyZWQgYnkgdGhlIEFjdGl2aXR5J3MgVGFza3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsdGVybmF0aXZlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWx0ZXJuYXRpdmVzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFsdGVybmF0aXZlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBbHRlcm5hdGl2ZXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhvd3RvIFN0YWZmPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgYmFja2dyb3VuZCBvbiB3aG8gc2hvdWxkIGJlIGludm9sdmVkIGluIHRoaXMgYWN0aXZpdHkgd2hhdCBhcmUgdGhlIHJlcXVpcmVkIHNraWxscywgZXhwZXJpZW5jZSwgIGFuZCBwZXJoYXBzIGF0dGl0dWRlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SG93dG8gU3RhZmY8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEhvd3RvU3RhZmYoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93dG9TdGFmZigpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SG93dG9TdGFmZigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEhvd3RvU3RhZmYgPGVtPkhvd3RvIFN0YWZmPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ib3d0byBTdGFmZjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SG93dG9TdGFmZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SG93dG9TdGFmZihTdHJpbmcgdmFsdWUpOwotCi19IC8vIEFjdGl2aXR5RGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9BcnRpZmFjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FydGlmYWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0MTJhZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FydGlmYWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFydGlmYWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQXJ0aWZhY3QgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4KLSAqIEFydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAib3duIiBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVyQXJ0aWZhY3QgPGVtPkNvbnRhaW5lciBBcnRpZmFjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZWRBcnRpZmFjdHMgPGVtPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBcnRpZmFjdCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcnRpZmFjdCBleHRlbmRzIFdvcmtQcm9kdWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250YWluZXIgQXJ0aWZhY3Q8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZWRBcnRpZmFjdHMgPGVtPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGFpbmVyIEFydGlmYWN0PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWluZXIgQXJ0aWZhY3Q8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb250YWluZXJBcnRpZmFjdChBcnRpZmFjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBcnRpZmFjdF9Db250YWluZXJBcnRpZmFjdCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0I2dldENvbnRhaW5lZEFydGlmYWN0cwotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iY29udGFpbmVkQXJ0aWZhY3RzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcnRpZmFjdCBnZXRDb250YWluZXJBcnRpZmFjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZXJBcnRpZmFjdCA8ZW0+Q29udGFpbmVyIEFydGlmYWN0PC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFpbmVyIEFydGlmYWN0PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnRhaW5lckFydGlmYWN0KEFydGlmYWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0fS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0I2dldENvbnRhaW5lckFydGlmYWN0IDxlbT5Db250YWluZXIgQXJ0aWZhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGFpbmVkIEFydGlmYWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVyQXJ0aWZhY3QKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCIgb3Bwb3NpdGU9ImNvbnRhaW5lckFydGlmYWN0IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCi19IC8vIEFydGlmYWN0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQXJ0aWZhY3REZXNjcmlwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FydGlmYWN0RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDAzYTNiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQXJ0aWZhY3REZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldEJyaWVmT3V0bGluZSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucyA8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXJ0aWZhY3REZXNjcmlwdGlvbiBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJyaWVmIE91dGxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CcmllZiBPdXRsaW5lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRCcmllZk91dGxpbmUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0RGVzY3JpcHRpb25fQnJpZWZPdXRsaW5lKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRCcmllZk91dGxpbmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRCcmllZk91dGxpbmUgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJyaWVmIE91dGxpbmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJyaWVmT3V0bGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QnJpZWZPdXRsaW5lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQXJ0aWZhY3REZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0JyZWFrZG93bkVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9CcmVha2Rvd25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY4OTc2ZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0JyZWFrZG93bkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEJyZWFrZG93biBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRJc1BsYW5uZWQgPGVtPklzIFBsYW5uZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEFmdGVyIDxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRCZWZvcmUgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXRpZXMgPGVtPlN1cGVyIEFjdGl2aXRpZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCcmVha2Rvd25FbGVtZW50IGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByZWZpeCByZXByZXNlbnRzIGFuIGFkZGl0aW9uYWwgbGFiZWwgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhIHByZWZpeCB0byBhbnkgQnJlYWtkb3duIEVsZW1lbnQgdG8gaW5kaWNhdGUgYSB1c2VyLWRlZmluZWQgc3ViLXR5cGUgZm9yIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdvdWxkIGxpa2UgdG8gZGlzdGluZ3Vpc2ggaGlzIEFjdGl2aXRpZXMgYnkgJ01vZHVsZScgKGFzIGRvbmUgaW4gdGhlIElCTSBSYXRpb25hbCBTdW1taXQgQXNjZW5kYW50IE1ldGhvZCksIGhlIGNhbiBkZWZpbmUgYSBkaWZmZXJlbnQgcHJlZml4IGZvciBldmVyeSBtb2RlbCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG5hbWluZyBBY3Rpdml0aWVzLCBlLmcuICJTUkEuRXN0YWJsaXNoIFJlcXVpcmVtZW50cyIgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgIlNvZnR3YXJlIFJlcXVpcmVtZW50cyBBbmFseXNpcyIgbW9kdWxlLiAgQW5vdGhlciBjb21tb24gYXBwbGljYXRpb24gZm9yIHByZWZpeCBpcyB0byBxdWFsaWZ5IHJvbGVzIGluIFJvbGUgRGVzY3JpcHRvcnMuICBGb3IgZXhhbXBsZSwgIkN1c3RvbWVyLkFyY2hpdGVjdCIgd291bGQgZGVmaW5lIGEgIkN1c3RvbWVyIiBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgIkFyY2hpdGVjdCIgZXhwcmVzc2luZyB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0IG9uIHRoZSBjdXN0b21lciBzaWRlIGFuZCBub3QgdGhlIGRldmVsb3BtZW50IHRlYW0gc2lkZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVmaXgoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfUHJlZml4KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVmaXgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWZpeChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuCi0JICogCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFBsYW5uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzUGxhbm5lZChCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJc1BsYW5uZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRJc1BsYW5uZWQgPGVtPklzIFBsYW5uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIFBsYW5uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElzUGxhbm5lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNQbGFubmVkKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBKdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXRhaWwgVXNlIENhc2UiIHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGlzT3B0aW9uYWwgYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBCcmVha2Rvd24gRWxlbWVudCBkZXNjcmliZXMgd29yaywgYSB3b3JrIHJlc3VsdCwgb3IgZXZlbiB3b3JrIHJlc291cmNlcywgd2hpY2ggaW5jbHVzaW9uIGlzIG5vdCBtYW5kYXRvcnkgd2hlbiBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGlzIHBsYW5uZWQgYmFzZWQgb24gYSBwcm9jZXNzIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBPcHRpb25hbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SXNPcHRpb25hbChCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzT3B0aW9uYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElzT3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzT3B0aW9uYWwoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByZXNlbnRlZEFmdGVyKEJyZWFrZG93bkVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJyZWFrZG93bkVsZW1lbnQgZ2V0UHJlc2VudGVkQWZ0ZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRBZnRlciA8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByZXNlbnRlZEFmdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVzZW50ZWRBZnRlcihCcmVha2Rvd25FbGVtZW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJlc2VudGVkQmVmb3JlKEJyZWFrZG93bkVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCcmVha2Rvd25FbGVtZW50IGdldFByZXNlbnRlZEJlZm9yZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEJlZm9yZSA8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJlc2VudGVkQmVmb3JlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVzZW50ZWRCZWZvcmUoQnJlYWtkb3duRWxlbWVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBsYW5uaW5nRGF0YShQbGFubmluZ0RhdGEpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9QbGFubmluZ0RhdGEoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBsYW5uaW5nRGF0YSBnZXRQbGFubmluZ0RhdGEoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGxhbm5pbmdEYXRhKFBsYW5uaW5nRGF0YSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRCcmVha2Rvd25FbGVtZW50cyA8ZW0+QnJlYWtkb3duIEVsZW1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1cGVyIEFjdGl2aXRpZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBlciBBY3Rpdml0aWVzPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTdXBlckFjdGl2aXRpZXMoQWN0aXZpdHkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXRpZXMoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRCcmVha2Rvd25FbGVtZW50cwotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iYnJlYWtkb3duRWxlbWVudHMiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFjdGl2aXR5IGdldFN1cGVyQWN0aXZpdGllcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFN1cGVyQWN0aXZpdGllcyA8ZW0+U3VwZXIgQWN0aXZpdGllczwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3VwZXIgQWN0aXZpdGllczwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U3VwZXJBY3Rpdml0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdXBlckFjdGl2aXRpZXMoQWN0aXZpdHkgdmFsdWUpOwotCi19IC8vIEJyZWFrZG93bkVsZW1lbnQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWE5OGU5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiNnZXRVc2FnZUd1aWRhbmNlIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVzYWdlIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVc2FnZUd1aWRhbmNlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VXNhZ2VHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24jZ2V0VXNhZ2VHdWlkYW5jZSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVc2FnZUd1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVc2FnZUd1aWRhbmNlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ2FwYWJpbGl0eVBhdHRlcm4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9DYXBhYmlsaXR5UGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMzBmZDg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9DYXBhYmlsaXR5UGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgUGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIERpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLgotICogQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6Ci0gKiAtIFRvIHNlcnZlIGFzIGJ1aWxkaW5nIGJsb2NrcyBmb3IgYXNzZW1ibGluZyBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMuICBOb3JtYWxseSBkZXZlbG9waW5nIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBub3QgZG9uZSBmcm9tIHNjcmF0Y2ggYnV0IGJ5IHN5c3RlbWF0aWNhbGx5IGFwcGx5aW5nIGFuZCBiaW5kaW5nIHBhdHRlcm5zLiAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIHBhdHRlcm4gYXBwbGljYXRpb24gb2YgJ2NvcHktYW5kLW1vZGlmeScsIHdoaWNoIGFsbG93cyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBpbmRpdmlkdWFsbHkgY3VzdG9taXplIHRoZSBwYXR0ZXJuJ3MgY29udGVudCB0byB0aGUgcGFydGljdWxhciBzaXR1YXRpb24gaXQgaXMgYXBwbGllZCBmb3IsIHRoZSBQbHVnaW4gbWV0YS1tb2RlbCBwYWNrYWdlIChTZWN0aW9uIDYuMSkgaW50cm9kdWNlcyBldmVuIG1vcmUgc29waGlzdGljYXRlZCBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIHRoYXQgc3VwcG9ydCBkeW5hbWljIGJpbmRpbmcgb2YgcGF0dGVybnMgKGkuZS4gdGhlIHBhdHRlcm4gaXMgcmVmZXJlbmNlZCBhbmQgbm90IGNvcGllZCkuICBUaGlzIHVuaXF1ZSBuZXcgd2F5IG9mIHJldXNpbmcgcHJvY2VzcyBrbm93bGVkZ2UgYWxsb3dzIHRvIGZhY3RvciBvdXQgY29tbW9ubHkgcmVvY2N1cnJpbmcgQWN0aXZpdGllcyBpbnRvIHBhdHRlcm5zIGFuZCB0byBhcHBseSB0aGVtIG92ZXIgYW5kIG92ZXIgYWdhaW4gZm9yIGEgcHJvY2Vzcy4gIFdoZW4gdGhlIHBhdHRlcm4gaXMgYmVpbmcgcmV2aXNlZCBvciB1cGRhdGVkLCBhbGwgY2hhbmdlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkIGluIGFsbCBwYXR0ZXJuIGFwcGxpY2F0aW9uIGluIGFsbCBwcm9jZXNzZXMgYmVjYXVzZSBvZiB0aGUgZHluYW1pYyBiaW5kaW5nLgotICogLSBUbyBzdXBwb3J0IGRpcmVjdCBleGVjdXRpb24gaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgd29yayBmb2xsb3dpbmcgYSB3ZWxsLWRlZmluZWQgcHJvY2VzcywgYnV0IHdvcmtzIGJhc2VkIG9uIGxvb3NlbHkgY29ubmVjdGVkIHByb2Nlc3MgZnJhZ21lbnRzIG9mIGJlc3QgcHJhY3RpY2VzIGluIGEgZmxleGlibGUgbWFubmVyIChlLmcuIEFnaWxlIERldmVsb3BtZW50KS4KLSAqIC0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDYXBhYmlsaXR5UGF0dGVybigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDYXBhYmlsaXR5UGF0dGVybiBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyB7Ci19IC8vIENhcGFiaWxpdHlQYXR0ZXJuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ2hlY2tsaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ2hlY2tsaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyZjhlMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NoZWNrbGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBDaGVja2xpc3QgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmktZmllZC4gIENoZWNrbGlzdHMgYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENoZWNrbGlzdCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDaGVja2xpc3QgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIENoZWNrbGlzdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NsYXNzaWZpZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9DbGFzc2lmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIxNTRiOTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NsYXNzaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNsYXNzaWZpZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBVTUwgMi4wIG1ldGEtY2xhc3MgQ2xhc3NpZmllci4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q2xhc3NpZmllcigpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2xhc3NpZmllciBleHRlbmRzIFR5cGUgewotfSAvLyBDbGFzc2lmaWVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29tcG9zaXRlUm9sZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbXBvc2l0ZVJvbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDZiZGE3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29tcG9zaXRlUm9sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db21wb3NpdGUgUm9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ29tcG9zaXRlIFJvbGUgaXMgYSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuCi0gKiBBIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGUjZ2V0QWdncmVnYXRlZFJvbGVzIDxlbT5BZ2dyZWdhdGVkIFJvbGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29tcG9zaXRlUm9sZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21wb3NpdGVSb2xlIGV4dGVuZHMgUm9sZURlc2NyaXB0b3IgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFnZ3JlZ2F0ZWQgUm9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWdncmVnYXRlZCBSb2xlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFnZ3JlZ2F0ZWQgUm9sZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEFnZ3JlZ2F0ZWRSb2xlcygpOwotCi19IC8vIENvbXBvc2l0ZVJvbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db25jZXB0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29uY2VwdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MDkyMTM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db25jZXB0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBDb25jZXB0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29uY2VwdCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25jZXB0IGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBDb25jZXB0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29uc3RyYWludC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmEzYzlhYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uc3RyYWludDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ29uc3RyYWludCBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludCNnZXRCb2R5IDxlbT5Cb2R5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29uc3RyYWludCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25zdHJhaW50IGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Qm9keTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlIHN0b3JlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Qm9keTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Qm9keShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29uc3RyYWludF9Cb2R5KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRCb2R5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQjZ2V0Qm9keSA8ZW0+Qm9keTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Qm9keTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Qm9keSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Qm9keShTdHJpbmcgdmFsdWUpOwotCi19IC8vIENvbnN0cmFpbnQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50Q2F0ZWdvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50Q2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzViMTNhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29udGVudENhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IENhdGVnb3J5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQ29udGVudCBDYXRlZ29yeSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBnZW5lcmFsaXppbmcgY29udGVudCBjYXRlZ29yeSB0eXBlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudENhdGVnb3J5KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZW50Q2F0ZWdvcnkgZXh0ZW5kcyBDb250ZW50RWxlbWVudCB7Ci19IC8vIENvbnRlbnRDYXRlZ29yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnREZXNjcmlwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnREZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZGM4YjM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50RGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBDb250ZW50IERlc2NyaXB0aW9uIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRTZWN0aW9ucyA8ZW0+U2VjdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEtleUNvbnNpZGVyYXRpb25zIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudERlc2NyaXB0aW9uIGV4dGVuZHMgTWV0aG9kVW5pdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlIHN0b3JlIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1haW5EZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRNYWluRGVzY3JpcHRpb24gPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFpbkRlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWN0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY3Rpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTZWN0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogS2V5IENvbnNpZGVyYXRpb25zIHByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEtleUNvbnNpZGVyYXRpb25zKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEtleUNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRLZXlDb25zaWRlcmF0aW9ucyA8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEtleUNvbnNpZGVyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRLZXlDb25zaWRlcmF0aW9ucyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIENvbnRlbnREZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29udGVudEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2M0MGNlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29udGVudEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIENvbnRlbnQgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4KLSAqIENvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0U3VwcG9ydGluZ01hdGVyaWFscyA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q29uY2VwdHNBbmRQYXBlcnMgPGVtPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q2hlY2tsaXN0cyA8ZW0+Q2hlY2tsaXN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRHdWlkZWxpbmVzIDxlbT5HdWlkZWxpbmVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldEV4YW1wbGVzIDxlbT5FeGFtcGxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRBc3NldHMgPGVtPkFzc2V0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZW50RWxlbWVudCBleHRlbmRzIERlc2NyaWJhYmxlRWxlbWVudCwgVmFyaWFiaWxpdHlFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25jZXB0cyBBbmQgUGFwZXJzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0IiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRDb25jZXB0c0FuZFBhcGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoZWNrbGlzdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGVja2xpc3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdCIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0Q2hlY2tsaXN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkd1aWRlbGluZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HdWlkZWxpbmVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0R3VpZGVsaW5lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhhbXBsZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGFtcGxlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RXhhbXBsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Bc3NldHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NldHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0IiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRBc3NldHMoKTsKLQotfSAvLyBDb250ZW50RWxlbWVudApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29udGVudFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTdhM2YyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29udGVudFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBQYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBDb250ZW50IFBhY2thZ2UgaXMgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMgYW5kIENvbnRlbnQgRWxlbWVudHMsIG9ubHkuICBFeGFtcGxlcyBmb3IgQ29udGVudCBFbGVtZW50IGFyZSBBcnRpZmFjdHMsIFRhc2tzLCBSb2xlcywgZXRjLiAgQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50cyA8ZW0+Q29udGVudCBFbGVtZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRQYWNrYWdlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRQYWNrYWdlIGV4dGVuZHMgTWV0aG9kUGFja2FnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGVudCBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGVudCBFbGVtZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRlbnQgRWxlbWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRDb250ZW50RWxlbWVudHMoKTsKLQotfSAvLyBDb250ZW50UGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTg1ZmZjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlIGV4dGVuZHMgU2VtYW50aWNNb2RlbEJyaWRnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFbGVtZW50KEVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFbGVtZW50IGdldEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWxlbWVudChFbGVtZW50IHZhbHVlKTsKLQotfSAvLyBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0N1c3RvbUNhdGVnb3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ3VzdG9tQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTIyMjc5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ3VzdG9tQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q3VzdG9tIENhdGVnb3J5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBDdXN0b20gQ2F0ZWdvcnkgaXMgYSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICJUZXN0aW5nIiBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cyA8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0U3ViQ2F0ZWdvcmllcyA8ZW0+U3ViIENhdGVnb3JpZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDdXN0b21DYXRlZ29yeSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDdXN0b21DYXRlZ29yeSBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXRlZ29yaXplZCBFbGVtZW50czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhdGVnb3JpemVkIEVsZW1lbnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIENhdGVnb3JpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWIgQ2F0ZWdvcmllczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YiBDYXRlZ29yaWVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3JpZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U3ViQ2F0ZWdvcmllcygpOwotCi19IC8vIEN1c3RvbUNhdGVnb3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcmFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZWxpdmVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMTIwYzM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZWxpdmVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyYWJsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZGVsaXZlcmFibGUgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGUjZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzIDxlbT5EZWxpdmVyZWQgV29yayBQcm9kdWN0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlbGl2ZXJhYmxlIGV4dGVuZHMgV29ya1Byb2R1Y3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWxpdmVyZWQgV29yayBQcm9kdWN0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpOwotCi19IC8vIERlbGl2ZXJhYmxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDA5NGRkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldEV4dGVybmFsRGVzY3JpcHRpb24gPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0UGFja2FnaW5nR3VpZGFuY2UgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVybmFsIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeHRlcm5hbERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEV4dGVybmFsRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbERlc2NyaXB0aW9uIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4dGVybmFsRGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhY2thZ2luZyBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGd1aWRhbmNlIG9uIGhvdyB0byBhc3NlbWJsZSB0aGUgZGVsaXZlcmFibGUgZnJvbSBhbGwgaXRzIHJlcXVpcmVkIGlucHV0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgY29tbW9uIGNvbnRlbnQgbWVkaXVtIGFuZCBmb3JtYXQuICBEaXN0cmlidXRpb24gb2YgdGhlIGRlbGl2ZXJhYmxlIGlzIGFkZHJlc3NlZCBpbiB0aGlzIHNlY3Rpb24sIGlmIG5lY2Vzc2FyeS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYWNrYWdpbmdHdWlkYW5jZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGFja2FnaW5nR3VpZGFuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRQYWNrYWdpbmdHdWlkYW5jZSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQYWNrYWdpbmdHdWlkYW5jZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZWxpdmVyeVByb2Nlc3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZWxpdmVyeVByb2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzg5M2VhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcnlQcm9jZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJ5IFByb2Nlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIERlbGl2ZXJ5IFByb2Nlc3NlcyBpcyBhIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4KLSAqIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzI2dldEVkdWNhdGlvbk1hdGVyaWFscyA8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3MjZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMgPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2VzcygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZWxpdmVyeVByb2Nlc3MgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVkdWNhdGlvbiBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FZHVjYXRpb24gTWF0ZXJpYWxzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWxzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWwiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVkdWNhdGlvbk1hdGVyaWFscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWx9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWxzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWxzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFscygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpOwotCi19IC8vIERlbGl2ZXJ5UHJvY2VzcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDlhMTY5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NhbGUgPGVtPlNjYWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFJpc2tMZXZlbCA8ZW0+UmlzayBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0VHlwZU9mQ29udHJhY3QgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBleHRlbmRzIFByb2Nlc3NEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBPdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTY2FsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fU2NhbGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNjYWxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjYWxlIDxlbT5TY2FsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NhbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNjYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTY2FsZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBDaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmlzayBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIE91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJpc2sgTGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJpc2tMZXZlbChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSaXNrTGV2ZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0Umlza0xldmVsIDxlbT5SaXNrIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SaXNrIExldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSaXNrTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJpc2tMZXZlbChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXN0aW1hdGluZyBUZWNobmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXN0aW1hdGluZ1RlY2huaXF1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVzdGltYXRpbmdUZWNobmlxdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGEgcHJvZmlsZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0ZWFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHJvbGVzLCBza2lsbHMgcmVxdWlyZWQgZm9yIGEgdGVhbSBwZXJmb3JtcyBhIHByb2plY3QgYmFzZWQgb24gdGhpcyBwcm9jZXNzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSA8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgT2YgQ29udHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGVPZkNvbnRyYWN0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZU9mQ29udHJhY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0VHlwZU9mQ29udHJhY3QgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGVPZkNvbnRyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlT2ZDb250cmFjdChTdHJpbmcgdmFsdWUpOwotCi19IC8vIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVzY3JpYmFibGVFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVzY3JpYmFibGVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcwZjgwYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rlc2NyaWJhYmxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBEZXNjcmliYWJsZSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4KLSAqIFRoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZSAoc2VlIFNlY3Rpb24gNC4xLjQpLiAgRGVzY3JpYmFibGUgRWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHB1Ymxpc2hlZCBpbiBtZXRob2Qgb3IgcHJvY2VzcyBwdWJsaWNhdGlvbnMgKHNpbWlsYXIgdG8gdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3Mgd2ViKS4gIERlc2NyaWJhYmxlIEVsZW1lbnQgZGVmaW5lcyB0aGF0IHRoZSBlbGVtZW50IGl0IHJlcHJlc2VudHMgd2lsbCBoYXZlIGNvbnRlbnQgJ2F0dGFjaGVkJyB0byBpdC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgdGhlIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHBsYWNlcyBpbiB3aGljaCB0aGUgY29udGVudCBpcyBiZWluZyByZXByZXNlbnRlZC4gIFRoaXMgc2VwYXJhdGlvbiBhbGxvd3MgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvcmUgbWV0aG9kIG1vZGVsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgZnJvbSB0aGUgYWN0dWFsIGRlc2NyaXB0aW9uIGNvbnRhaW5lciBwcm92aWRpbmcsIGZvciBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29udGVudCBlbGVtZW50IGluIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMgbGFuZ3VhZ2VzLCBhdWRpZW5jZXMsIGxpY2Vuc2luZyBsZXZlbHMsIGV0Yy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb25OYW1lIDxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFNoYXBlaWNvbiA8ZW0+U2hhcGVpY29uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXROb2RlaWNvbiA8ZW0+Tm9kZWljb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlc2NyaWJhYmxlRWxlbWVudCBleHRlbmRzIE1ldGhvZEVsZW1lbnQsIENsYXNzaWZpZXIgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgRGVzY3JpYmFibGUgRWxlbWVudCBoYXMgYSBwcmVzZW50YXRpb24gbmFtZSwgd2hpY2ggaXMgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIG5hbWUgKHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbikgbWlnaHQgYmUgc2V0IHRvICJydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50IiB0byBkaWZmZXJlbnRpYXRlIGZyb20gYSAiajJlZV9hcmNoaXRjdHVyZV9kb2N1bWVudCIgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAiQXJjaGl0ZWN0dXJlIERvY3VtZW50Ii4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZXNlbnRhdGlvbk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb25OYW1lIDxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRhdGlvbk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRhdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJlc2VudGF0aW9uKENvbnRlbnREZXNjcmlwdGlvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50RGVzY3JpcHRpb24gZ2V0UHJlc2VudGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNoYXBlaWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2hhcGVpY29uKFVSSSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVXJpIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVUkkgZ2V0U2hhcGVpY29uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRTaGFwZWljb24gPGVtPlNoYXBlaWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2hhcGVpY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTaGFwZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNoYXBlaWNvbihVUkkgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5vZGVpY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROb2RlaWNvbihVUkkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVXJpIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVUkkgZ2V0Tm9kZWljb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldE5vZGVpY29uIDxlbT5Ob2RlaWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm9kZWljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5vZGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROb2RlaWNvbihVUkkgdmFsdWUpOwotCi19IC8vIERlc2NyaWJhYmxlRWxlbWVudApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwOTFmOWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIERlc2NyaXB0b3IgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLgotICogRGVzY3JpcHRvcnMgYXJlIHRoZSBrZXkgY29uY2VwdCBmb3IgcmVhbGl6aW5nIHRoZSBzZXBhcmF0aW9uIG9mIHByb2Nlc3NlcyBmcm9tIG1ldGhvZCBjb250ZW50LiAgQSBEZXNjcmlwdG9yIGNhbiBiZSBjaGFyYWN0ZXJpemVkIGFzIGEgcmVmZXJlbmNlIG9iamVjdCBmb3Igb25lIHBhcnRpY3VsYXIgQ29udGVudCBFbGVtZW50LCB3aGljaCBoYXMgaXRzIG93biByZWxhdGlvbnNoaXBzIGFuZCBwcm9wZXJ0aWVzLiAgV2hlbiBhIERlc2NyaXB0b3IgaXMgY3JlYXRlZCBpdCBzaGFsbCBiZSBwcm92aWRlZCB3aXRoIGNvbmdydWVudCBjb3BpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgdGhlIHJlZmVyZW5jZWQgY29udGVudCBlbGVtZW50LiAgSG93ZXZlciwgYSB1c2VyIGNhbiBtb2RpZnkgdGhlc2UgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBzaXR1YXRpb24gZm9yIHdoaWNoIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQuIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvciNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3IoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlc2NyaXB0b3IgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKEJvb2xlYW4gdmFsdWUpOwotCi19IC8vIERlc2NyaXB0b3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZXNjcmlwdG9yRGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZXNjcmlwdG9yRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjU2Njg3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uI2dldFJlZmluZWREZXNjcmlwdGlvbiA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXNjcmlwdG9yRGVzY3JpcHRpb24gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmluZWQgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWZpbmVkRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlZmluZWREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24jZ2V0UmVmaW5lZERlc2NyaXB0aW9uIDxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWZpbmVkRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlZmluZWREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIERlc2NyaXB0b3JEZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RpYWdyYW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaWFncmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0MDRkOTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RpYWdyYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpYWdyYW08L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldFpvb20gPGVtPlpvb208L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXRWaWV3cG9pbnQgPGVtPlZpZXdwb2ludDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldERpYWdyYW1MaW5rIDxlbT5EaWFncmFtIExpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXROYW1lc3BhY2UgPGVtPk5hbWVzcGFjZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW0oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGlhZ3JhbSBleHRlbmRzIEdyYXBoTm9kZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Wm9vbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Wm9vbTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5ab29tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRab29tKERvdWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtX1pvb20oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb3VibGUgZ2V0Wm9vbSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldFpvb20gPGVtPlpvb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlpvb208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFpvb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFpvb20oRG91YmxlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZpZXdwb2ludDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Vmlld3BvaW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZpZXdwb2ludDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Vmlld3BvaW50KFBvaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW1fVmlld3BvaW50KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQb2ludCBnZXRWaWV3cG9pbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXRWaWV3cG9pbnQgPGVtPlZpZXdwb2ludDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Vmlld3BvaW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRWaWV3cG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZpZXdwb2ludChQb2ludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaWFncmFtIExpbms8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rfS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldERpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlhZ3JhbSBMaW5rPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlhZ3JhbSBMaW5rPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW1fRGlhZ3JhbUxpbmsoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXREaWFncmFtCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsiIG9wcG9zaXRlPSJkaWFncmFtIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREaWFncmFtTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZXNwYWNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldERpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZXNwYWNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TmFtZXNwYWNlKFNlbWFudGljTW9kZWxCcmlkZ2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbV9OYW1lc3BhY2UoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldERpYWdyYW0KLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImRpYWdyYW0iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2VtYW50aWNNb2RlbEJyaWRnZSBnZXROYW1lc3BhY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXROYW1lc3BhY2UgPGVtPk5hbWVzcGFjZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZXNwYWNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXROYW1lc3BhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWVzcGFjZShTZW1hbnRpY01vZGVsQnJpZGdlIHZhbHVlKTsKLQotfSAvLyBEaWFncmFtCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlhZ3JhbUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaWFncmFtRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhODg4YTU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaWFncmFtRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlhZ3JhbSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0SXNWaXNpYmxlIDxlbT5JcyBWaXNpYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldENvbnRhaW5lcl8gPGVtPkNvbnRhaW5lcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRSZWZlcmVuY2UgPGVtPlJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRQcm9wZXJ0eSA8ZW0+UHJvcGVydHk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGlhZ3JhbUVsZW1lbnQgZXh0ZW5kcyBNZXRob2RFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklzIFZpc2libGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgVmlzaWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SXNWaXNpYmxlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbUVsZW1lbnRfSXNWaXNpYmxlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJc1Zpc2libGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0SXNWaXNpYmxlIDxlbT5JcyBWaXNpYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBWaXNpYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJc1Zpc2libGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzVmlzaWJsZShCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRDb250YWluZWQgPGVtPkNvbnRhaW5lZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250YWluZXI8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhaW5lcjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbnRhaW5lcihHcmFwaEVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbUVsZW1lbnRfQ29udGFpbmVyKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldENvbnRhaW5lZAotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iY29udGFpbmVkIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlHcmFwaEVsZW1lbnQgZ2V0Q29udGFpbmVyXygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRDb250YWluZXJfIDxlbT5Db250YWluZXI8L2VtPn0nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWluZXI8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb250YWluZXJfKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb250YWluZXIoR3JhcGhFbGVtZW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlfS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSNnZXRSZWZlcmVuY2VkIDxlbT5SZWZlcmVuY2VkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZmVyZW5jZTwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZTwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtRWxlbWVudF9SZWZlcmVuY2UoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UjZ2V0UmVmZXJlbmNlZAotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSIgb3Bwb3NpdGU9InJlZmVyZW5jZWQiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnR5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydHk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbUVsZW1lbnRfUHJvcGVydHkoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFByb3BlcnR5KCk7Ci0KLX0gLy8gRGlhZ3JhbUVsZW1lbnQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaWFncmFtTGluay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RpYWdyYW1MaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ2N2I1ODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RpYWdyYW1MaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlhZ3JhbSBMaW5rPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Wm9vbSA8ZW0+Wm9vbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRWaWV3cG9ydCA8ZW0+Vmlld3BvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldERpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtTGluaygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEaWFncmFtTGluayBleHRlbmRzIERpYWdyYW1FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5ab29tPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5ab29tPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlpvb208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFpvb20oRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW1MaW5rX1pvb20oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb3VibGUgZ2V0Wm9vbSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRab29tIDxlbT5ab29tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5ab29tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRab29tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRab29tKERvdWJsZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WaWV3cG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Vmlld3BvcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Vmlld3BvcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFZpZXdwb3J0KFBvaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW1MaW5rX1ZpZXdwb3J0KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQb2ludCBnZXRWaWV3cG9ydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRWaWV3cG9ydCA8ZW0+Vmlld3BvcnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZpZXdwb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRWaWV3cG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Vmlld3BvcnQoUG9pbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRMaW5rIDxlbT5MaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW1MaW5rX0dyYXBoRWxlbWVudCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRMaW5rCi0JICogQG1vZGVsIG9wcG9zaXRlPSJsaW5rIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3JhcGhFbGVtZW50IGdldEdyYXBoRWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0R3JhcGhFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpYWdyYW08L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0RGlhZ3JhbUxpbmsgPGVtPkRpYWdyYW0gTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaWFncmFtPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpYWdyYW08L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERpYWdyYW0oRGlhZ3JhbSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtTGlua19EaWFncmFtKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXREaWFncmFtTGluawotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iZGlhZ3JhbUxpbmsiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaWFncmFtIGdldERpYWdyYW0oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlhZ3JhbTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGlhZ3JhbShEaWFncmFtIHZhbHVlKTsKLQotfSAvLyBEaWFncmFtTGluawpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RpbWVuc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RpbWVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MWFjYmNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaW1lbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGltZW5zaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uI2dldFdpZHRoIDxlbT5XaWR0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24jZ2V0SGVpZ2h0IDxlbT5IZWlnaHQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaW1lbnNpb24oKQotICogQG1vZGVsCi0gKiBAZXh0ZW5kcyBJTW9kZWxPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEaW1lbnNpb24gZXh0ZW5kcyBJTW9kZWxPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5XaWR0aDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XaWR0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V2lkdGgoRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpbWVuc2lvbl9XaWR0aCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvdWJsZSBnZXRXaWR0aCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24jZ2V0V2lkdGggPGVtPldpZHRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5XaWR0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V2lkdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdpZHRoKERvdWJsZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhlaWdodDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IZWlnaHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEhlaWdodChEb3VibGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGltZW5zaW9uX0hlaWdodCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvdWJsZSBnZXRIZWlnaHQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uI2dldEhlaWdodCA8ZW0+SGVpZ2h0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IZWlnaHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEhlaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGVpZ2h0KERvdWJsZSB2YWx1ZSk7Ci0KLX0gLy8gRGltZW5zaW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlzY2lwbGluZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rpc2NpcGxpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTE2NTJkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlzY2lwbGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNjaXBsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBEaXNjaXBsaW5lIGlzIGEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LgotICogQSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSNnZXRUYXNrcyA8ZW0+VGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSNnZXRTdWJkaXNjaXBsaW5lIDxlbT5TdWJkaXNjaXBsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUjZ2V0UmVmZXJlbmNlV29ya2Zsb3dzIDxlbT5SZWZlcmVuY2UgV29ya2Zsb3dzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEaXNjaXBsaW5lIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXNrczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYXNrczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhc2tzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVfVGFza3MoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2siIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFRhc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWJkaXNjaXBsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YmRpc2NpcGxpbmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWJkaXNjaXBsaW5lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVfU3ViZGlzY2lwbGluZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTdWJkaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZlcmVuY2UgV29ya2Zsb3dzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWZlcmVuY2UgV29ya2Zsb3dzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlIFdvcmtmbG93czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93cygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFJlZmVyZW5jZVdvcmtmbG93cygpOwotCi19IC8vIERpc2NpcGxpbmUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaXNjaXBsaW5lR3JvdXBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaXNjaXBsaW5lR3JvdXBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDYyM2YyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlzY2lwbGluZUdyb3VwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBEaXNjaXBsaW5lIEdyb3VwaW5ncyBhcmUgdXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAiU29mdHdhcmUgRGlzY2lwbGluZXMiIHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgIlJlcXVpcmVtZW50cyBNYW5hZ2VtZW50IiBvciAiVGVzdGluZyI7ICJJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50IiB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICJJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyIsICJJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzIiwgb3IgIklUIEVuYWJsaW5nIFNlcnZpY2VzIi4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZyNnZXREaXNjaXBsaW5lcyA8ZW0+RGlzY2lwbGluZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lR3JvdXBpbmcoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGlzY2lwbGluZUdyb3VwaW5nIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNjaXBsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNjaXBsaW5lczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc2NpcGxpbmVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGlzY2lwbGluZXMoKTsKLQotfSAvLyBEaXNjaXBsaW5lR3JvdXBpbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Eb21haW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Eb21haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTY4OTAwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRG9tYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvbWFpbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIERvbWFpbiBpcyBhIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4KLSAqIERvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW4jZ2V0V29ya1Byb2R1Y3RzIDxlbT5Xb3JrIFByb2R1Y3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbiNnZXRTdWJkb21haW5zIDxlbT5TdWJkb21haW5zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RG9tYWluKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvbWFpbiBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFdvcmtQcm9kdWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViZG9tYWluczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWlufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YmRvbWFpbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWJkb21haW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERvbWFpbl9TdWJkb21haW5zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW4iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U3ViZG9tYWlucygpOwotCi19IC8vIERvbWFpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0VsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2MTRhZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRFbGVtZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIElNb2RlbE9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVsZW1lbnQgZXh0ZW5kcyBJTW9kZWxPYmplY3QgewotfSAvLyBFbGVtZW50CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRWxsaXBzZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0VsbGlwc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTljYWRjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRWxsaXBzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsbGlwc2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJhZGl1c1ggPGVtPlJhZGl1cyBYPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0UmFkaXVzWSA8ZW0+UmFkaXVzIFk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSb3RhdGlvbiA8ZW0+Um90YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRTdGFydEFuZ2xlIDxlbT5TdGFydCBBbmdsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldEVuZEFuZ2xlIDxlbT5FbmQgQW5nbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRDZW50ZXIgPGVtPkNlbnRlcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEVsbGlwc2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWxsaXBzZSBleHRlbmRzIEdyYXBoaWNQcmltaXRpdmUgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJhZGl1cyBYPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SYWRpdXMgWDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYWRpdXMgWDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmFkaXVzWChEb3VibGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RWxsaXBzZV9SYWRpdXNYKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFJhZGl1c1goKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSYWRpdXNYIDxlbT5SYWRpdXMgWDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmFkaXVzIFg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJhZGl1c1goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJhZGl1c1goRG91YmxlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJhZGl1cyBZPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SYWRpdXMgWTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYWRpdXMgWTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmFkaXVzWShEb3VibGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RWxsaXBzZV9SYWRpdXNZKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFJhZGl1c1koKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSYWRpdXNZIDxlbT5SYWRpdXMgWTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmFkaXVzIFk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJhZGl1c1koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJhZGl1c1koRG91YmxlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Um90YXRpb24oRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEVsbGlwc2VfUm90YXRpb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb3VibGUgZ2V0Um90YXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSb3RhdGlvbiA8ZW0+Um90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvdGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSb3RhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Um90YXRpb24oRG91YmxlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YXJ0IEFuZ2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdGFydCBBbmdsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBBbmdsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnRBbmdsZShEb3VibGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RWxsaXBzZV9TdGFydEFuZ2xlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFN0YXJ0QW5nbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRTdGFydEFuZ2xlIDxlbT5TdGFydCBBbmdsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgQW5nbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXJ0QW5nbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXJ0QW5nbGUoRG91YmxlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVuZCBBbmdsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW5kIEFuZ2xlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVuZCBBbmdsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RW5kQW5nbGUoRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEVsbGlwc2VfRW5kQW5nbGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb3VibGUgZ2V0RW5kQW5nbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRFbmRBbmdsZSA8ZW0+RW5kIEFuZ2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbmQgQW5nbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVuZEFuZ2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbmRBbmdsZShEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2VudGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DZW50ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2VudGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDZW50ZXIoUG9pbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RWxsaXBzZV9DZW50ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBvaW50IGdldENlbnRlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldENlbnRlciA8ZW0+Q2VudGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DZW50ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENlbnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2VudGVyKFBvaW50IHZhbHVlKTsKLQotfSAvLyBFbGxpcHNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcxMjE1ZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMgcXVhbGlmeSB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FeGFtcGxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRXhhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNmI4NzRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FeGFtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gRXhhbXBsZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RXhhbXBsZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFeGFtcGxlIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBFeGFtcGxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhDb25uZWN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaENvbm5lY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ODEzNzc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaENvbm5lY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HcmFwaCBDb25uZWN0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFZGdlIDxlbT5HcmFwaCBFZGdlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhDb25uZWN0b3IoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JhcGhDb25uZWN0b3IgZXh0ZW5kcyBHcmFwaEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0QW5jaG9yYWdlIDxlbT5BbmNob3JhZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFbGVtZW50KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldEFuY2hvcmFnZQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iYW5jaG9yYWdlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3JhcGhFbGVtZW50IGdldEdyYXBoRWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0R3JhcGhFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyYXBoIEVkZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZX0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UjZ2V0QW5jaG9yIDxlbT5BbmNob3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JhcGggRWRnZTwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyYXBoIEVkZ2U8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFZGdlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlI2dldEFuY2hvcgotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZSIgb3Bwb3NpdGU9ImFuY2hvciIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0R3JhcGhFZGdlKCk7Ci0KLX0gLy8gR3JhcGhDb25uZWN0b3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaEVkZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaEVkZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWE2NzUyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhFZGdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyYXBoIEVkZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UjZ2V0QW5jaG9yIDxlbT5BbmNob3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlI2dldFdheXBvaW50cyA8ZW0+V2F5cG9pbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhFZGdlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdyYXBoRWRnZSBleHRlbmRzIEdyYXBoRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QW5jaG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3Rvcn0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciNnZXRHcmFwaEVkZ2UgPGVtPkdyYXBoIEVkZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QW5jaG9yPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QW5jaG9yPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoRWRnZV9BbmNob3IoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciNnZXRHcmFwaEVkZ2UKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciIgb3Bwb3NpdGU9ImdyYXBoRWRnZSIgdXBwZXI9IjIiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEFuY2hvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2F5cG9pbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5XYXlwb2ludHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XYXlwb2ludHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhFZGdlX1dheXBvaW50cygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0V2F5cG9pbnRzKCk7Ci0KLX0gLy8gR3JhcGhFZGdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNlZWM4MWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRQb3NpdGlvbiA8ZW0+UG9zaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldENvbnRhaW5lZCA8ZW0+Q29udGFpbmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRMaW5rIDxlbT5MaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRBbmNob3JhZ2UgPGVtPkFuY2hvcmFnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0U2VtYW50aWNNb2RlbCA8ZW0+U2VtYW50aWMgTW9kZWw8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaEVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdyYXBoRWxlbWVudCBleHRlbmRzIERpYWdyYW1FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3NpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBvc2l0aW9uKFBvaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoRWxlbWVudF9Qb3NpdGlvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9pbnQgZ2V0UG9zaXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldFBvc2l0aW9uIDxlbT5Qb3NpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9zaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBvc2l0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQb3NpdGlvbihQb2ludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250YWluZWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50fS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldENvbnRhaW5lcl8gPGVtPkNvbnRhaW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250YWluZWQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWluZWQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhFbGVtZW50X0NvbnRhaW5lZCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldENvbnRhaW5lcl8KLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCIgb3Bwb3NpdGU9ImNvbnRhaW5lciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRDb250YWluZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rfS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MaW5rPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGluazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaEVsZW1lbnRfTGluaygpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldEdyYXBoRWxlbWVudAotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rIiBvcHBvc2l0ZT0iZ3JhcGhFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldExpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFuY2hvcmFnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3J9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFuY2hvcmFnZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFuY2hvcmFnZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaEVsZW1lbnRfQW5jaG9yYWdlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFbGVtZW50Ci0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IiIG9wcG9zaXRlPSJncmFwaEVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0QW5jaG9yYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZW1hbnRpYyBNb2RlbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VtYW50aWMgTW9kZWw8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VtYW50aWMgTW9kZWw8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFNlbWFudGljTW9kZWwoU2VtYW50aWNNb2RlbEJyaWRnZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaEVsZW1lbnRfU2VtYW50aWNNb2RlbCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0R3JhcGhFbGVtZW50Ci0JICogQG1vZGVsIG9wcG9zaXRlPSJncmFwaEVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2VtYW50aWNNb2RlbEJyaWRnZSBnZXRTZW1hbnRpY01vZGVsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRTZW1hbnRpY01vZGVsIDxlbT5TZW1hbnRpYyBNb2RlbDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VtYW50aWMgTW9kZWw8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFNlbWFudGljTW9kZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlbWFudGljTW9kZWwoU2VtYW50aWNNb2RlbEJyaWRnZSB2YWx1ZSk7Ci0KLX0gLy8gR3JhcGhFbGVtZW50CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhOb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM5NzhkNDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGggTm9kZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZSNnZXRTaXplIDxlbT5TaXplPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhOb2RlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdyYXBoTm9kZSBleHRlbmRzIEdyYXBoRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2l6ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2l6ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TaXplPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTaXplKERpbWVuc2lvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaE5vZGVfU2l6ZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGltZW5zaW9uIGdldFNpemUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlI2dldFNpemUgPGVtPlNpemU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFNpemUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNpemUoRGltZW5zaW9uIHZhbHVlKTsKLQotfSAvLyBHcmFwaE5vZGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaGljUHJpbWl0aXZlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhpY1ByaW1pdGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDBjOGNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaGljUHJpbWl0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HcmFwaGljIFByaW1pdGl2ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhpY1ByaW1pdGl2ZSgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JhcGhpY1ByaW1pdGl2ZSBleHRlbmRzIExlYWZFbGVtZW50IHsKLX0gLy8gR3JhcGhpY1ByaW1pdGl2ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0d1aWRhbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3VpZGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmY2YzQ2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3VpZGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRhbmNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogR3VpZGFuY2UgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFza3MsIGFuZCBXb3JrIFByb2R1Y3RzLiAgRXhhbXBsZXMgZm9yIEd1aWRhbmNlIGFyZSBHdWlkZWxpbmVzLCBUZW1wbGF0ZXMsIENoZWNrbGlzdHMsIFRvb2wgTWVudG9ycywgRXN0aW1hdGVzLCBTdXBwb3J0aW5nIE1hdGVyaWFscywgUmVwb3J0cywgQ29uY2VwdHMsIGV0Yy4gIFRoaXMgcGFja2FnZSBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhYnN0cmFjdCBHdWlkYW5jZSBjbGFzcy4gIFRoZSBwYWNrYWdlIEd1aWRhbmNlIFR5cGVzIGRlZmluZXMgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEd1aWRhbmNlKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBHdWlkYW5jZSBleHRlbmRzIENvbnRlbnRFbGVtZW50IHsKLX0gLy8gR3VpZGFuY2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HdWlkYW5jZURlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3VpZGFuY2VEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MzE0Mjk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HdWlkYW5jZURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24jZ2V0QXR0YWNobWVudHMgPGVtPkF0dGFjaG1lbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBHdWlkYW5jZURlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRhY2htZW50czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0YWNobWVudHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dGFjaG1lbnRzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBdHRhY2htZW50cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uI2dldEF0dGFjaG1lbnRzIDxlbT5BdHRhY2htZW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0YWNobWVudHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF0dGFjaG1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdHRhY2htZW50cyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIEd1aWRhbmNlRGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HdWlkZWxpbmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HdWlkZWxpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2RiMThkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3VpZGVsaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIEd1aWRlbGluZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcyAoZS5nLiBncm91cGVkIHRvZ2V0aGVyIGFzIGFjdGl2aXRpZXMpIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuICBBbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZSB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkIGFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eSwgZXRjLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHdWlkZWxpbmUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3VpZGVsaW5lIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBHdWlkZWxpbmUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9JbWFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0ltYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzNjJlNjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0ltYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbWFnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlI2dldFVyaSA8ZW0+VXJpPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlI2dldE1pbWVUeXBlIDxlbT5NaW1lIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRJbWFnZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbWFnZSBleHRlbmRzIExlYWZFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVyaTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vcmk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVyaShVUkkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0SW1hZ2VfVXJpKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVXJpIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVUkkgZ2V0VXJpKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlI2dldFVyaSA8ZW0+VXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vcmk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVyaSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXJpKFVSSSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaW1lIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NaW1lIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWltZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNaW1lVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0SW1hZ2VfTWltZVR5cGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1pbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlI2dldE1pbWVUeXBlIDxlbT5NaW1lIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1pbWUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWltZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1pbWVUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSW1hZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9JdGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9JdGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODViYzY3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvSXRlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JdGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBJdGVyYXRpb24gaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLSAqIEl0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKQotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRJdGVyYXRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSXRlcmF0aW9uIGV4dGVuZHMgQWN0aXZpdHkgewotfSAvLyBJdGVyYXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9MZWFmRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0xlYWZFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDliOGY5ZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0xlYWZFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5MZWFmIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldExlYWZFbGVtZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBMZWFmRWxlbWVudCBleHRlbmRzIERpYWdyYW1FbGVtZW50IHsKLX0gLy8gTGVhZkVsZW1lbnQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RDb25maWd1cmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTUyZmRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgQ29uZmlndXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgTWV0aG9kIENvbmZpZ3VyYXRpb24gaXMgYSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBsdWdpblNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uIDxlbT5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRQcm9jZXNzVmlld3MgPGVtPlByb2Nlc3MgVmlld3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXREZWZhdWx0VmlldyA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0QmFzZUNvbmZpZ3VyYXRpb25zIDxlbT5CYXNlIENvbmZpZ3VyYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0U3VidHJhY3RlZENhdGVnb3J5IDxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0QWRkZWRDYXRlZ29yeSA8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBNZXRob2RVbml0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2lufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvY2VzcyBWaWV3czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb2Nlc3MgVmlld3M8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9jZXNzIFZpZXdzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXdzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnkiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFByb2Nlc3NWaWV3cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBWaWV3PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWZhdWx0IFZpZXc8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBWaWV3PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0VmlldyhDb250ZW50Q2F0ZWdvcnkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnRlbnRDYXRlZ29yeSBnZXREZWZhdWx0VmlldygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldERlZmF1bHRWaWV3IDxlbT5EZWZhdWx0IFZpZXc8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVmlldzwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RGVmYXVsdFZpZXcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRWaWV3KENvbnRlbnRDYXRlZ29yeSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIENvbmZpZ3VyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgQ29uZmlndXJhdGlvbnM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIENvbmZpZ3VyYXRpb25zPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fQmFzZUNvbmZpZ3VyYXRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRCYXNlQ29uZmlndXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VidHJhY3RlZCBDYXRlZ29yeTwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5IiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkZGVkIENhdGVnb3J5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0QWRkZWRDYXRlZ29yeSgpOwotCi19IC8vIE1ldGhvZENvbmZpZ3VyYXRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDgzMDllZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBFdmVyeSBjbGFzcyBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcyBNZXRob2QgRWxlbWVudCBpcyB0aGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBjbGFzc2VzIGFuZCBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBldmVyeSBvdGhlciBlbGVtZW50IHR5cGUgb2YgdGhpcyBtb2RlbC4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLiAgTWV0aG9kIEVsZW1lbnQgaW5oZXJpdHMgdGhlIE5hbWUgYXR0cmlidXRlIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCdzIHN1cGVyIGNsYXNzLiAgRXZlcnkgZWxlbWVudCBkZWZpbmVkIGFzIGEgVU1BIGluc3RhbmNlIGlzIGRlcml2ZWQgZnJvbSBNb2RlbCBFbGVtZW50LiAgRXZlcnkgTWV0aG9kIEVsZW1lbnQgaW4tc3RhbmNlIGlzIGF0IGxlYXN0IGRlZmluZWQgYnkgYSB1bmlxdWUgaWQsIGEgbmFtZSwgYXMgd2VsbCBhcyBicmllZiBkZXNjcmlwdGlvbi4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0R3VpZCA8ZW0+R3VpZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldEJyaWVmRGVzY3JpcHRpb24gPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3duZWRSdWxlcyA8ZW0+T3duZWQgUnVsZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0U3VwcHJlc3NlZCA8ZW0+U3VwcHJlc3NlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldE9yZGVyaW5nR3VpZGUgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kRWxlbWVudCBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IGhhcyBhIGdsb2JhbCB1bmlxdWUgaWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkd1aWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEd1aWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfR3VpZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0R3VpZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldEd1aWQgPGVtPkd1aWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkd1aWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEd1aWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEd1aWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJyaWVmRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldEJyaWVmRGVzY3JpcHRpb24gPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QnJpZWZEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QnJpZWZEZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3duZWQgUnVsZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Pd25lZCBSdWxlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X093bmVkUnVsZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0T3duZWRSdWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfTWV0aG9kRWxlbWVudFByb3BlcnR5KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBJZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgRXh0ZW5kcyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBwcmVzc2VkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdXBwcmVzc2VkKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9TdXBwcmVzc2VkKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0U3VwcHJlc3NlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldFN1cHByZXNzZWQgPGVtPlN1cHByZXNzZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1cHByZXNzZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN1cHByZXNzZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1cHByZXNzZWQoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPcmRlcmluZ0d1aWRlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X09yZGVyaW5nR3VpZGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE9yZGVyaW5nR3VpZGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRPcmRlcmluZ0d1aWRlIDxlbT5PcmRlcmluZyBHdWlkZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE9yZGVyaW5nR3VpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE9yZGVyaW5nR3VpZGUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBNZXRob2RFbGVtZW50CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kRWxlbWVudFByb3BlcnR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kRWxlbWVudFByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYyNmFkN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZEVsZW1lbnRQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eV9WYWx1ZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZExpYnJhcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzNGY2YzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZExpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIExpYnJhcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkjZ2V0TWV0aG9kUGx1Z2lucyA8ZW0+TWV0aG9kIFBsdWdpbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSNnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMgPGVtPlByZWRlZmluZWQgQ29uZmlndXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RMaWJyYXJ5KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZExpYnJhcnkgZXh0ZW5kcyBNZXRob2RVbml0LCBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBsdWdpbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRNZXRob2RQbHVnaW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZWRlZmluZWQgQ29uZmlndXJhdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZExpYnJhcnlfUHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCi19IC8vIE1ldGhvZExpYnJhcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OGU0ZDdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBNZXRob2QgUGFja2FnZSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRHbG9iYWwgPGVtPkdsb2JhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlI2dldFJldXNlZFBhY2thZ2VzIDxlbT5SZXVzZWQgUGFja2FnZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRDaGlsZFBhY2thZ2VzIDxlbT5DaGlsZCBQYWNrYWdlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBhY2thZ2UoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZFBhY2thZ2UgZXh0ZW5kcyBNZXRob2RFbGVtZW50LAotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogTWV0aG9kIFBhY2thZ2VzIGNhbiBoYXZlIGEgZ2xvYmFsIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgZXZlcnkgb3RoZXIgTWV0aG9kIFBhY2thZ2UgY2FuIHNlZSB0aGUgZ2xvYmFsIHBhY2thZ2UncyBjb250ZW50cy4gIEdsb2JhbCBNZXRob2QgUGFja2FnZXMgYXJlIHByaW1hcmlseSB1c2VkIHRvIHN0b3JlIGNvbW1vbmx5IHVzZWQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgc3VjaCBhcyBmb3IgRGlzY2lwbGluZXMgb3IgRG9tYWlucywgd2hpY2ggYXJlIHVzZWQgYnkgbWFueSBUYXNrIGFuZCBXb3JrIFByb2R1Y3RzIHJlc3BlY3RpdmVseS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R2xvYmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRHbG9iYWwoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldEdsb2JhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlI2dldEdsb2JhbCA8ZW0+R2xvYmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HbG9iYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEdsb2JhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R2xvYmFsKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV1c2VkIFBhY2thZ2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJldXNlZCBQYWNrYWdlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldXNlZCBQYWNrYWdlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlX1JldXNlZFBhY2thZ2VzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRSZXVzZWRQYWNrYWdlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hpbGQgUGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2hpbGQgUGFja2FnZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGlsZCBQYWNrYWdlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0Q2hpbGRQYWNrYWdlcygpOwotCi0JTWV0aG9kUGFja2FnZSBnZXRQYXJlbnRQYWNrYWdlKCk7Ci0KLX0gLy8gTWV0aG9kUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMjNmNmJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFBsdWdpbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgTWV0aG9kIFBsdWdpbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLSAqIE1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotICogU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiNnZXRVc2VyQ2hhbmdlYWJsZSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiNnZXRNZXRob2RQYWNrYWdlcyA8ZW0+TWV0aG9kIFBhY2thZ2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiNnZXRCYXNlcyA8ZW0+QmFzZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQbHVnaW4oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kUGx1Z2luIGV4dGVuZHMgTWV0aG9kVW5pdCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vc2VyIENoYW5nZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VXNlckNoYW5nZWFibGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldFVzZXJDaGFuZ2VhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiNnZXRVc2VyQ2hhbmdlYWJsZSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVc2VyQ2hhbmdlYWJsZShCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGFja2FnZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGFja2FnZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2VzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1ldGhvZFBhY2thZ2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2lufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2VzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4iIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEJhc2VzKCk7Ci0KLX0gLy8gTWV0aG9kUGx1Z2luCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kVW5pdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFVuaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjNhN2NmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kVW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFVuaXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIE1ldGhvZCBVbml0IGlzIGEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQgPGVtPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RVbml0IGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aG9yczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXV0aG9ycyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBdXRob3JzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aG9yczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXV0aG9ycyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDaGFuZ2VEYXRlKERhdGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRGF0ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGF0ZSBnZXRDaGFuZ2VEYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDaGFuZ2VEYXRlKERhdGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENoYW5nZURlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURlc2NyaXB0aW9uIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENoYW5nZURlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFVuaXRfVmVyc2lvbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmVyc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvcHlyaWdodFN0YXRlbWVudChTdXBwb3J0aW5nTWF0ZXJpYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHRTdGF0ZW1lbnQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdXBwb3J0aW5nTWF0ZXJpYWwgZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0Q29weXJpZ2h0U3RhdGVtZW50IDxlbT5Db3B5cmlnaHQgU3RhdGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3B5cmlnaHQgU3RhdGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvcHlyaWdodFN0YXRlbWVudChTdXBwb3J0aW5nTWF0ZXJpYWwgdmFsdWUpOwotCi19IC8vIE1ldGhvZFVuaXQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NaWxlc3RvbmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NaWxlc3RvbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTBlZmEyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWlsZXN0b25lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NaWxlc3RvbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIE1pbGVzdG9uZSBkZXNjcmliZXMgYSBzaWduaWZpY2FudCBldmVudCBpbiBhIGRldmVsb3BtZW50IHByb2plY3QsIHN1Y2ggYXMgYSBtYWpvciBkZWNpc2lvbiwgY29tcGxldGlvbiBvZiBhIGRlbGl2ZXJhYmxlLCBvciBtZWV0aW5nIG9mIGEgbWFqb3IgZGVwZW5kZW5jeSAobGlrZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZSkuICBCZWNhdXNlLCBNaWxlc3RvbmUgaXMgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byBib3RoIHRoZSBldmVudCBpdHNlbGYgYW5kIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRoZSBldmVudCBpcyBzY2hlZHVsZWQgdG8gaGFwcGVuLCBpdCBpcyBtb2RlbGVkIGFzIGEgQnJlYWtkb3duIEVsZW1lbnQgKGkuZS4gaXQgYXBwZWFycyBhcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZSkuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1pbGVzdG9uZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNaWxlc3RvbmUgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudCB7Ci19IC8vIE1pbGVzdG9uZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL05hbWVkRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL05hbWVkRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MWUzMzRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9OYW1lZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hbWVkIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC4gIERlZmluZWQgdGhhdCBldmVyeSBlbGVtZW50IGhhcyBhIG5hbWUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE5hbWVkRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZWRFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TmFtZWRFbGVtZW50X05hbWUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBOYW1lZEVsZW1lbnQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9OYW1lc3BhY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9OYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2NlYWEyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lc3BhY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZXNwYWNlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXROYW1lc3BhY2UoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVzcGFjZSBleHRlbmRzIE5hbWVkRWxlbWVudCB7Ci19IC8vIE5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL091dGNvbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9PdXRjb21lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxMzU5NmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL091dGNvbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGNvbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBvdXRjb21lIGRlc2NyaWJlcyBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYSByZXN1bHQgb3Igc3RhdGUuIE91dGNvbWVzIG1heSBhbHNvIGJlIHVzZWQgdG8gZGVzY3JpYmUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBub3QgZm9ybWFsbHkgZGVmaW5lZC4gIEEga2V5IGRpZmZlcmVudGlhdG9yIGZvciBvdXRjb21lcyBhZ2FpbnN0IGFydGlmYWN0cyBpcyB0aGF0IG91dGNvbWVzIGFyZSBub3QgY2FuZGlkYXRlcyBmb3IgaGFydmVzdGluZyBhcyByZXVzYWJsZSBhc3NldHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE91dGNvbWUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3V0Y29tZSBleHRlbmRzIFdvcmtQcm9kdWN0IHsKLX0gLy8gT3V0Y29tZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3NDQ2M2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UGFja2FnZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQYWNrYWdlIGV4dGVuZHMgTmFtZXNwYWNlLCBQYWNrYWdlYWJsZUVsZW1lbnQgewotfSAvLyBQYWNrYWdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGFja2FnZWFibGVFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGFja2FnZWFibGVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRjOTQ3ZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BhY2thZ2VhYmxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFja2FnZWFibGUgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBhY2thZ2VhYmxlRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGFja2FnZWFibGVFbGVtZW50IGV4dGVuZHMgTmFtZWRFbGVtZW50IHsKLX0gLy8gUGFja2FnZWFibGVFbGVtZW50CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGhhc2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QaGFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzODE3NWViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QaGFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGhhc2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBQaGFzZSBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotICogUGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBoYXNlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBoYXNlIGV4dGVuZHMgQWN0aXZpdHkgewotfSAvLyBQaGFzZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BsYW5uaW5nRGF0YS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BsYW5uaW5nRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlN2VjNThkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QbGFubmluZ0RhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBQbGFubmluZyBEYXRhIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBhZGRzIHBsYW5uaW5nIGRhdGEgdG8gQnJlYWtkb3duIEVsZW1lbnRzIHdoZW4gaXQgaXMgdXNlZCBmb3IgYSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlLiAgRm9yIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0aGlzIGNsYXNzIGNhbiBlaXRoZXIgbm90IGJlIGluc3RhbnRpYXRlZCBvciBwb3B1bGF0ZWQgd2l0aCBkZWZhdWx0IGRhdGEuCi0gKiBQbGFubmluZyBEYXRhIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuCi0gKiAoTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKQotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEjZ2V0RmluaXNoRGF0ZSA8ZW0+RmluaXNoIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldFJhbmsgPGVtPlJhbms8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQbGFubmluZ0RhdGEoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGxhbm5pbmdEYXRhIGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0RGF0ZShEYXRlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBsYW5uaW5nRGF0YV9TdGFydERhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5EYXRlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEYXRlIGdldFN0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEjZ2V0U3RhcnREYXRlIDxlbT5TdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXJ0RGF0ZShEYXRlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbmlzaCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaERhdGUoRGF0ZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQbGFubmluZ0RhdGFfRmluaXNoRGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRhdGUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURhdGUgZ2V0RmluaXNoRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEjZ2V0RmluaXNoRGF0ZSA8ZW0+RmluaXNoIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5pc2hEYXRlKERhdGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFuazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFuazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmFuayhpbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5JbnRlZ2VyIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgZ2V0UmFuaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEjZ2V0UmFuayA8ZW0+UmFuazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmFuazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmFuaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmFuayhpbnQgdmFsdWUpOwotCi19IC8vIFBsYW5uaW5nRGF0YQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BvaW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWYwOTI2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9pbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCNnZXRYIDxlbT5YPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50I2dldFkgPGVtPlk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQb2ludCgpCi0gKiBAbW9kZWwKLSAqIEBleHRlbmRzIElNb2RlbE9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBvaW50IGV4dGVuZHMgSU1vZGVsT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFgoRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBvaW50X1goKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb3VibGUgZ2V0WCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCNnZXRYIDxlbT5YPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5YPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRYKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRYKERvdWJsZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5ZPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5ZPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFkoRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBvaW50X1koKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb3VibGUgZ2V0WSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCNnZXRZIDxlbT5ZPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5ZPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRZKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRZKERvdWJsZSB2YWx1ZSk7Ci0KLX0gLy8gUG9pbnQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qb2x5bGluZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BvbHlsaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc2ODI4MTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BvbHlsaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvbHlsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmUjZ2V0Q2xvc2VkIDxlbT5DbG9zZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmUjZ2V0V2F5cG9pbnRzIDxlbT5XYXlwb2ludHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQb2x5bGluZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQb2x5bGluZSBleHRlbmRzIEdyYXBoaWNQcmltaXRpdmUgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNsb3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbG9zZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xvc2VkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDbG9zZWQoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQb2x5bGluZV9DbG9zZWQoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldENsb3NlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZSNnZXRDbG9zZWQgPGVtPkNsb3NlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2xvc2VkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDbG9zZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENsb3NlZChCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldheXBvaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V2F5cG9pbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2F5cG9pbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBvbHlsaW5lX1dheXBvaW50cygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgbG93ZXI9IjIiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFdheXBvaW50cygpOwotCi19IC8vIFBvbHlsaW5lCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJhY3RpY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QcmFjdGljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOGJlNDg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QcmFjdGljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmFjdGljZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgUHJhY3RpY2UgcmVwcmVzZW50cyBhIHByb3ZlbiB3YXkgb3Igc3RyYXRlZ3kgb2YgZG9pbmcgd29yayB0byBhY2hpZXZlIGEgZ29hbCB0aGF0IGhhcyBhIHBvc2l0aXZlIGltcGFjdCBvbiB3b3JrIHByb2R1Y3Qgb3IgcHJvY2VzcyBxdWFsaXR5LiAgUHJhY3RpY2VzIGFyZSBkZWZpbmVkIG9ydGhvZ29uYWwgdG8gbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLiAgVGhleSBjb3VsZCBzdW1tYXJpemUgYXNwZWN0cyB0aGF0IGltcGFjdCBtYW55IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1ldGhvZCBvciBzcGVjaWZpYyBwcm9jZXNzZXMuICBFeGFtcGxlcyBmb3IgcHJhY3RpY2VzIHdvdWxkIGJlICJNYW5hZ2UgUmlza3MiLCAiQ29udGludW91c2x5IHZlcmlmeSBxdWFsaXR5IiwgIkFyY2hpdGVjdHVyZS1jZW50cmljIGFuZCBjb21wb25lbnQtYmFzZWQgZGV2ZWxvcG1lbnQiLCBldGMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZSNnZXRTdWJQcmFjdGljZXMgPGVtPlN1YiBQcmFjdGljZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UjZ2V0Q29udGVudFJlZmVyZW5jZXMgPGVtPkNvbnRlbnQgUmVmZXJlbmNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZSNnZXRBY3Rpdml0eVJlZmVyZW5jZXMgPGVtPkFjdGl2aXR5IFJlZmVyZW5jZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcmFjdGljZSBleHRlbmRzIEd1aWRhbmNlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWIgUHJhY3RpY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWIgUHJhY3RpY2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIFByYWN0aWNlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZV9TdWJQcmFjdGljZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFN1YlByYWN0aWNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGVudCBSZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250ZW50IFJlZmVyZW5jZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZW50IFJlZmVyZW5jZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50IiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRDb250ZW50UmVmZXJlbmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZpdHkgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2aXR5IFJlZmVyZW5jZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2VzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0QWN0aXZpdHlSZWZlcmVuY2VzKCk7Ci0KLX0gLy8gUHJhY3RpY2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QcmFjdGljZURlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJhY3RpY2VEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmM2Y2MDk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QcmFjdGljZURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJhY3RpY2UgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFkZGl0aW9uYWxJbmZvIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRQcm9ibGVtIDxlbT5Qcm9ibGVtPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QmFja2dyb3VuZCA8ZW0+QmFja2dyb3VuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEdvYWxzIDxlbT5Hb2FsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFwcGxpY2F0aW9uIDxlbT5BcHBsaWNhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldExldmVsc09mQWRvcHRpb24gPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJhY3RpY2VEZXNjcmlwdGlvbiBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWRkaXRpb25hbCBJbmZvPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQW55IGFkZGl0aW9uYWwgSW5mb3JtYXRpb24gbm90IGNvdmVyZWQgYnkgdGhlIG90aGVyIGF0dHJpYnV0ZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWRkaXRpb25hbEluZm8oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFkZGl0aW9uYWxJbmZvKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QWRkaXRpb25hbEluZm8gPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWRkaXRpb25hbEluZm8oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2JsZW08L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRoZSBQcmFjdGljZSBhZGRyZXNzZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2JsZW08L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByb2JsZW0oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJvYmxlbSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldFByb2JsZW0gPGVtPlByb2JsZW08L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2JsZW08L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByb2JsZW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb2JsZW0oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhY2tncm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhY2tncm91bmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJhY2tncm91bmQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QmFja2dyb3VuZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEJhY2tncm91bmQgPGVtPkJhY2tncm91bmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhY2tncm91bmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJhY2tncm91bmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJhY2tncm91bmQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdvYWxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdvYWxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRHb2FscyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0R29hbHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRHb2FscyA8ZW0+R29hbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdvYWxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRHb2FscygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R29hbHMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVzY3JpYmVzIGhvdyB0aGUgUHJhY3RpY2UgaXMgYmVpbmcgYXBwbGllZCBvciBpbnRyb2R1Y2VkIGludG8gdGhlIGNvbnRleHQgZGVzY3JpYmVkIGluIGJhY2tncm91bmQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFwcGxpY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBcHBsaWNhdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BcHBsaWNhdGlvbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXBwbGljYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBcHBsaWNhdGlvbiA8ZW0+QXBwbGljYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFwcGxpY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXBwbGljYXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVscyBPZiBBZG9wdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIE91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGV2ZWxzT2ZBZG9wdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMZXZlbHNPZkFkb3B0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0TGV2ZWxzT2ZBZG9wdGlvbiA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExldmVsc09mQWRvcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsc09mQWRvcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQcmFjdGljZURlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWRmNjMyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBQcm9jZXNzIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4KLSAqIENvcmUgTWV0aG9kIENvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgdmVyeSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVGh1cywgYSBwcm9jZXNzIGlzIGEgc2V0IG9mIHBhcnRpYWxseSBvcmRlcmVkIHdvcmsgZGVzY3JpcHRpb25zIGludGVuZGVkIHRvIHJlYWNoIGEgaGlnaGVyIGRldmVsb3BtZW50IGdvYWwsIHN1Y2ggYXMgdGhlIHJlbGVhc2Ugb2YgYSBzcGVjaWZpYyBzb2Z0d2FyZSBzeXN0ZW0uICBBIHByb2Nlc3MgYW5kIHRoZSBwcm9jZXNzIG1ldGEtbW9kZWwgc3RydWN0dXJlIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGZvY3VzZXMgb24gdGhlIGxpZmVjeWNsZSBhbmQgdGhlIHNlcXVlbmNpbmcgb2Ygd29yayBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRvIGFjaGlldmUgdGhpcyBpdCB1c2VzIHRoZSBEZXNjcmlwdG9yIGNvbmNlcHQgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIGFsbG93aW5nIGRlZmluaW5nIHRpbWUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgY29udGVudCAoZS5nLiBkZWZpbmluZyBhIGZvY3VzIG9uIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUgc2FtZSBUYXNrIGFuZCBwcm92aWRpbmcgaW5wdXQgV29yayBQcm9kdWN0cyBpbiBkaWZmZXJlbnQgc3RhdGVzIHdpdGhpbiB0aGUgZGlmZmVyZW50IFBoYXNlcyBvZiBhIHByb2Nlc3MgbGlmZWN5Y2xlIGluIHdoaWNoIHRoZSBzYW1lIFRhc2sgaXMgcGVyZm9ybWVkKS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MjZ2V0SW5jbHVkZXNQYXR0ZXJucyA8ZW0+SW5jbHVkZXMgUGF0dGVybnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyNnZXREZWZhdWx0Q29udGV4dCA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MjZ2V0VmFsaWRDb250ZXh0IDxlbT5WYWxpZCBDb250ZXh0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2VzcygpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2VzcyBleHRlbmRzIEFjdGl2aXR5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5jbHVkZXMgUGF0dGVybnM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmNsdWRlcyBQYXR0ZXJuczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJbmNsdWRlc1BhdHRlcm5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRleHQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERlZmF1bHRDb250ZXh0KE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RDb25maWd1cmF0aW9uIGdldERlZmF1bHRDb250ZXh0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MjZ2V0RGVmYXVsdENvbnRleHQgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0Q29udGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdENvbnRleHQoTWV0aG9kQ29uZmlndXJhdGlvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbGlkIENvbnRleHQ8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWxpZCBDb250ZXh0PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NfVmFsaWRDb250ZXh0KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRWYWxpZENvbnRleHQoKTsKLQotfSAvLyBQcm9jZXNzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0NvbXBvbmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NDb21wb25lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTc0NzBkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0NvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIENvbXBvbmVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgUHJvY2VzcyBDb21wb25lbnQgaXMgYSBzcGVjaWFsIFByb2Nlc3MgUGFja2FnZSB0aGF0IGFwcGxpZXMgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gIEEgUHJvY2VzcyBDb21wb25lbnQgcmVhbGl6ZXMgb25lIG9yIG1vcmUgSW50ZXJmYWNlcyB3aGljaCBzcGVjaWZ5IGlucHV0cyBhbmQgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LiBUaGVyZSBtaWdodCBiZSBtYW55IGNvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBzYW1lIGludGVyZmFjZXMsIGJ1dCB1c2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyB0byBhY2hpZXZlIHNpbWlsYXIgb3V0cHV0cyBmb3Igc2ltaWxhciBpbnB1dHMuICBXaGVyZWFzIHRoZSBDb21wb25lbnQgSW50ZXJmYWNlcyByZXByZXNlbnQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIChibGFjayBib3ggZGVzY3JpcHRpb25zIG9mIHRoZSBjb21wb25lbnQpLCBnb29kIGNhbmRpZGF0ZXMgZm9yIGNvbXBvbmVudCByZWFsaXphdGlvbnMgY2FuIGJlIGZvdW5kIGluIENhcGFiaWxpdHkgUGF0dGVybnMgKHdoaXRlIGJveCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb21wb25lbnQpLgotICogVU1BIHN1cHBvcnRzIHJlcGxhY2VhYmxlIGFuZCByZXVzYWJsZSBQcm9jZXNzIENvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uIENlcnRhaW4gc2l0dWF0aW9ucyBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgbWlnaHQgcmVxdWlyZSB0aGF0IGNvbmNyZXRlIHJlYWxpemF0aW9ucyBvZiBwYXJ0cyBvZiB0aGUgcHJvY2VzcyByZW1haW4gdW5kZWNpZGVkIG9yIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgZXhlY3V0aW5nIHRlYW0gaXRzZWxmIChlLmcuIGluIG91dHNvdXJjaW5nIHNpdHVhdGlvbnMpLiAgVU1BIHByb3ZpZGVzIGEgdW5pcXVlIGNvbXBvbmVudCBjb25jZXB0IGRlZmluaW5nIGludGVyZmFjZXMgZm9yIHdvcmsgcHJvZHVjdCBpbnB1dCBhbmQgb3V0cHV0LCBhbGxvd2luZyB0cmVhdGluZyB0aGUgYWN0dWFsIGRlZmluaXRpb24gb2YgdGhlIHdvcmsgdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0cyBhcyBhICJibGFjayBib3giLiAgQXQgYW55IHBvaW50IGR1cmluZyBhIHByb2plY3QgdGhlIGNvbXBvbmVudCAicmVhbGl6YXRpb24iIGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0SW50ZXJmYWNlcyA8ZW0+SW50ZXJmYWNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldFByb2Nlc3MgPGVtPlByb2Nlc3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NDb21wb25lbnQgZXh0ZW5kcyBQcm9jZXNzUGFja2FnZSwgTWV0aG9kVW5pdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50ZXJmYWNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnRlcmZhY2VzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJmYWNlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50X0ludGVyZmFjZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEludGVyZmFjZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb2Nlc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIGdldFByb2Nlc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRQcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9jZXNzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyB2YWx1ZSk7Ci0KLX0gLy8gUHJvY2Vzc0NvbXBvbmVudApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzU0ODFjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFByb2Nlc3MgQ29tcG9uZW50IGFwcGxpY2F0aW9uIGluIGEgUHJvY2VzcywgaS5lLiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmluZyB0aGUgUHJvY2Vzcy4gIFRoZSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIGRldGFpbHMgb2YgdGhlIGNvbXBvbmVudCBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIHRvIHByb3ZpZGUgaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcyBzdWNoIGFzIGl0IG93biBwcmVkZWNlc3NvcnMgYW5kIHN1Y2Nlc3NvcnMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciNnZXRQcm9jZXNzQ29tcG9uZW50IDxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIGV4dGVuZHMgRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvY2VzcyBDb21wb25lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcm9jZXNzQ29tcG9uZW50KFByb2Nlc3NDb21wb25lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfUHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9jZXNzQ29tcG9uZW50IGdldFByb2Nlc3NDb21wb25lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IjZ2V0UHJvY2Vzc0NvbXBvbmVudCA8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcm9jZXNzQ29tcG9uZW50KFByb2Nlc3NDb21wb25lbnQgdmFsdWUpOwotCi19IC8vIFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWI5ZTY3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZSBjb21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyA8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlSU8gPGVtPkludGVyZmFjZSBJTzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEludGVyZmFjZVNwZWNpZmljYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgSU88L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnRlcmZhY2UgSU88L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmZhY2UgSU88L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VJTygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEludGVyZmFjZUlPKCk7Ci0KLX0gLy8gUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NEZXNjcmlwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MjFiNWIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldEV4dGVybmFsSWQgPGVtPkV4dGVybmFsIElkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFVzYWdlTm90ZXMgPGVtPlVzYWdlIE5vdGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NEZXNjcmlwdGlvbiBleHRlbmRzIEFjdGl2aXR5RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGRlbGl2ZXJ5IHBhdHRlcm5zIGFuZCBtb2RlbHMuIEl0IGlzIHVzZWQgbGlrZSBhIHN5bm9ueW0uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIElkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeHRlcm5hbElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RXh0ZXJuYWxJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxJZCA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIElkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHRlcm5hbElkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TY29wZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlZmluZXMgdGhlIHNjb3BlIG9mIHRoZSBQcm9jZXNzLCBpLmUuIHdoaWNoIHR5cGVzIG9mIHByb2plY3RzIGRvZXMgaXQgYWRkcmVzcyBhbmQgd2hpY2ggbm90LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY29wZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2NvcGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2NvcGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjb3BlIDxlbT5TY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NvcGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNjb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTY29wZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXNhZ2UgTm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZSBOb3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VXNhZ2VOb3RlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1VzYWdlTm90ZXMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFVzYWdlTm90ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFVzYWdlTm90ZXMgPGVtPlVzYWdlIE5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZSBOb3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VXNhZ2VOb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXNhZ2VOb3RlcyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIFByb2Nlc3NEZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDdkMzNiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFByb2Nlc3MgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLgotICogUHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc0VsZW1lbnQgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnQgewotfSAvLyBQcm9jZXNzRWxlbWVudApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NGYW1pbHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzRmFtaWx5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUwZjE5ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NGYW1pbHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBGYW1pbHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIERlbGl2ZXJ5IE1vZGVsIEZhbWlseSBpcyBhIGNvbnZlbmllbnQgZ3JvdXBpbmcgb2YgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIG9mIGludGVyZXN0IHRvIHNvbWUgc3BlY2lmaWMgdXNlciBjb21tdW5pdHkuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5I2dldERlbGl2ZXJ5UHJvY2Vzc2VzIDxlbT5EZWxpdmVyeSBQcm9jZXNzZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRmFtaWx5KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NGYW1pbHkgZXh0ZW5kcyBNZXRob2RDb25maWd1cmF0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWxpdmVyeSBQcm9jZXNzZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWxpdmVyeSBQcm9jZXNzZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0ZhbWlseV9EZWxpdmVyeVByb2Nlc3NlcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZWxpdmVyeVByb2Nlc3NlcygpOwotCi19IC8vIFByb2Nlc3NGYW1pbHkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ2M2ZiNWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFByb2Nlc3MgUGFja2FnZSBpcyBhIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LgotICogQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlI2dldFByb2Nlc3NFbGVtZW50cyA8ZW0+UHJvY2VzcyBFbGVtZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXREaWFncmFtcyA8ZW0+RGlhZ3JhbXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGFja2FnZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzUGFja2FnZSBleHRlbmRzIE1ldGhvZFBhY2thZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2Nlc3MgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb2Nlc3MgRWxlbWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9jZXNzIEVsZW1lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50cygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UHJvY2Vzc0VsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaWFncmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaWFncmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpYWdyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NQYWNrYWdlX0RpYWdyYW1zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERpYWdyYW1zKCk7Ci0KLX0gLy8gUHJvY2Vzc1BhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxZjQyOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuCi0gKiBBIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlI2dldEJhc2VkT25Qcm9jZXNzZXMgPGVtPkJhc2VkIE9uIFByb2Nlc3NlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlZCBPbiBQcm9jZXNzZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3N9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZWQgT24gUHJvY2Vzc2VzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZWQgT24gUHJvY2Vzc2VzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0Jhc2VkT25Qcm9jZXNzZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEJhc2VkT25Qcm9jZXNzZXMoKTsKLQotfSAvLyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb3BlcnR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzkyNzFmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHkjZ2V0S2V5IDxlbT5LZXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvcGVydHkoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHkgZXh0ZW5kcyBEaWFncmFtRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+S2V5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+S2V5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPktleTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0S2V5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9wZXJ0eV9LZXkoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEtleSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eSNnZXRLZXkgPGVtPktleTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+S2V5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRLZXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEtleShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb3BlcnR5X1ZhbHVlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQcm9wZXJ0eQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BzZXVkb1N0YXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHNldWRvU3RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTMxNGRkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHNldWRvU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHNldWRvU3RhdGUuamF2YSx2IDEuMyAyMDA2LzA3LzI0IDIzOjM0OjA5IGJ4dSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBzZXVkbyBTdGF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHNldWRvU3RhdGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHNldWRvU3RhdGUgZXh0ZW5kcyBWZXJ0ZXggewotfSAvLyBQc2V1ZG9TdGF0ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qc2V1ZG9TdGF0ZUtpbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qc2V1ZG9TdGF0ZUtpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODNlODI0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHNldWRvU3RhdGVLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQc2V1ZG9TdGF0ZUtpbmQuamF2YSx2IDEuMyAyMDA2LzA3LzI0IDIzOjM0OjA4IGJ4dSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlBzZXVkbyBTdGF0ZSBLaW5kPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQc2V1ZG9TdGF0ZUtpbmQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQc2V1ZG9TdGF0ZUtpbmQgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkluaXRpYWw8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkluaXRpYWw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5JVElBTF9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9ImluaXRpYWwiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Kb2luPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Kb2luPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0pPSU5fTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJqb2luIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpPSU4gPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Rm9yazwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Rm9yazwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGT1JLX0xJVEVSQUwKLQkgKiBAbW9kZWwgbmFtZT0iZm9yayIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JLID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkp1bmN0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KdW5jdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKVU5DVElPTl9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9Imp1bmN0aW9uIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpVTkNUSU9OID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNob2ljZTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q2hvaWNlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NIT0lDRV9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9ImNob2ljZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0UgPSA0OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RW50cnkgUG9pbnQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkVudHJ5IFBvaW50PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VOVFJZX1BPSU5UX0xJVEVSQUwKLQkgKiBAbW9kZWwgbmFtZT0iZW50cnlQb2ludCIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRSWV9QT0lOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FeGl0IFBvaW50PC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FeGl0IFBvaW50PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYSVRfUE9JTlRfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJleGl0UG9pbnQiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhJVF9QT0lOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5UZXJtaW5hdGU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlRlcm1pbmF0ZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNURVJNSU5BVEVfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJ0ZXJtaW5hdGUiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVSTUlOQVRFID0gNzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkluaXRpYWw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5JVElBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHNldWRvU3RhdGVLaW5kIElOSVRJQUxfTElURVJBTCA9IG5ldyBQc2V1ZG9TdGF0ZUtpbmQoCi0JCQlJTklUSUFMLCAiaW5pdGlhbCIsICJpbml0aWFsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Sm9pbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKT0lOCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQc2V1ZG9TdGF0ZUtpbmQgSk9JTl9MSVRFUkFMID0gbmV3IFBzZXVkb1N0YXRlS2luZCgKLQkJCUpPSU4sICJqb2luIiwgImpvaW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Gb3JrPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0ZPUksKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBzZXVkb1N0YXRlS2luZCBGT1JLX0xJVEVSQUwgPSBuZXcgUHNldWRvU3RhdGVLaW5kKAotCQkJRk9SSywgImZvcmsiLCAiZm9yayIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkp1bmN0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0pVTkNUSU9OCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQc2V1ZG9TdGF0ZUtpbmQgSlVOQ1RJT05fTElURVJBTCA9IG5ldyBQc2V1ZG9TdGF0ZUtpbmQoCi0JCQlKVU5DVElPTiwgImp1bmN0aW9uIiwgImp1bmN0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q2hvaWNlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NIT0lDRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHNldWRvU3RhdGVLaW5kIENIT0lDRV9MSVRFUkFMID0gbmV3IFBzZXVkb1N0YXRlS2luZCgKLQkJCUNIT0lDRSwgImNob2ljZSIsICJjaG9pY2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FbnRyeSBQb2ludDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFTlRSWV9QT0lOVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHNldWRvU3RhdGVLaW5kIEVOVFJZX1BPSU5UX0xJVEVSQUwgPSBuZXcgUHNldWRvU3RhdGVLaW5kKAotCQkJRU5UUllfUE9JTlQsICJlbnRyeVBvaW50IiwgImVudHJ5UG9pbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FeGl0IFBvaW50PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYSVRfUE9JTlQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBzZXVkb1N0YXRlS2luZCBFWElUX1BPSU5UX0xJVEVSQUwgPSBuZXcgUHNldWRvU3RhdGVLaW5kKAotCQkJRVhJVF9QT0lOVCwgImV4aXRQb2ludCIsICJleGl0UG9pbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5UZXJtaW5hdGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVEVSTUlOQVRFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQc2V1ZG9TdGF0ZUtpbmQgVEVSTUlOQVRFX0xJVEVSQUwgPSBuZXcgUHNldWRvU3RhdGVLaW5kKAotCQkJVEVSTUlOQVRFLCAidGVybWluYXRlIiwgInRlcm1pbmF0ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5Qc2V1ZG8gU3RhdGUgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHNldWRvU3RhdGVLaW5kW10gVkFMVUVTX0FSUkFZID0gbmV3IFBzZXVkb1N0YXRlS2luZFtdIHsKLQkJCUlOSVRJQUxfTElURVJBTCwgSk9JTl9MSVRFUkFMLCBGT1JLX0xJVEVSQUwsIEpVTkNUSU9OX0xJVEVSQUwsCi0JCQlDSE9JQ0VfTElURVJBTCwgRU5UUllfUE9JTlRfTElURVJBTCwgRVhJVF9QT0lOVF9MSVRFUkFMLAotCQkJVEVSTUlOQVRFX0xJVEVSQUwsIH07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+UHNldWRvIFN0YXRlIEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cwotCQkJLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UHNldWRvIFN0YXRlIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBQc2V1ZG9TdGF0ZUtpbmQgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlQc2V1ZG9TdGF0ZUtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Qc2V1ZG8gU3RhdGUgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBzZXVkb1N0YXRlS2luZCBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVBzZXVkb1N0YXRlS2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UHNldWRvIFN0YXRlIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBQc2V1ZG9TdGF0ZUtpbmQgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCWNhc2UgSU5JVElBTDoKLQkJCXJldHVybiBJTklUSUFMX0xJVEVSQUw7Ci0JCWNhc2UgSk9JTjoKLQkJCXJldHVybiBKT0lOX0xJVEVSQUw7Ci0JCWNhc2UgRk9SSzoKLQkJCXJldHVybiBGT1JLX0xJVEVSQUw7Ci0JCWNhc2UgSlVOQ1RJT046Ci0JCQlyZXR1cm4gSlVOQ1RJT05fTElURVJBTDsKLQkJY2FzZSBDSE9JQ0U6Ci0JCQlyZXR1cm4gQ0hPSUNFX0xJVEVSQUw7Ci0JCWNhc2UgRU5UUllfUE9JTlQ6Ci0JCQlyZXR1cm4gRU5UUllfUE9JTlRfTElURVJBTDsKLQkJY2FzZSBFWElUX1BPSU5UOgotCQkJcmV0dXJuIEVYSVRfUE9JTlRfTElURVJBTDsKLQkJY2FzZSBURVJNSU5BVEU6Ci0JCQlyZXR1cm4gVEVSTUlOQVRFX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUHNldWRvU3RhdGVLaW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9Qc2V1ZG9TdGF0ZUtpbmQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9SZWZlcmVuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9SZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWQwNWEzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UjZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24gPGVtPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlI2dldFJlZmVyZW5jZWQgPGVtPlJlZmVyZW5jZWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSZWZlcmVuY2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVmZXJlbmNlIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSZWZlcmVuY2VfSXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSNnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiA8ZW0+SXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0UmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2VkPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSZWZlcmVuY2VkKERpYWdyYW1FbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJlZmVyZW5jZV9SZWZlcmVuY2VkKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0UmVmZXJlbmNlCi0JICogQG1vZGVsIG9wcG9zaXRlPSJyZWZlcmVuY2UiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaWFncmFtRWxlbWVudCBnZXRSZWZlcmVuY2VkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSNnZXRSZWZlcmVuY2VkIDxlbT5SZWZlcmVuY2VkPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2VkPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWZlcmVuY2VkKERpYWdyYW1FbGVtZW50IHZhbHVlKTsKLQotfSAvLyBSZWZlcmVuY2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9SZWdpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9SZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTNkNmY3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZWdpb24uamF2YSx2IDEuNCAyMDA2LzA3LzI0IDIzOjM0OjA5IGJ4dSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSU1vZGVsT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZWdpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb24jZ2V0VmVydGV4IDxlbT5WZXJ0ZXg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uI2dldFRyYW5zaXRpb24gPGVtPlRyYW5zaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uI2dldFN0YXRlIDxlbT5TdGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb24jZ2V0U3RhdGVNYWNoaW5lIDxlbT5TdGF0ZSBNYWNoaW5lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UmVnaW9uKCkKLSAqIEBtb2RlbAotICogQGV4dGVuZHMgSU1vZGVsT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVnaW9uIGV4dGVuZHMgSU1vZGVsT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJ0ZXg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZlcnRleH0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXgjZ2V0Q29udGFpbmVyXyA8ZW0+Q29udGFpbmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZlcnRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSZWdpb25fVmVydGV4KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmVydGV4I2dldENvbnRhaW5lcl8KLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXgiIG9wcG9zaXRlPSJjb250YWluZXIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0VmVydGV4KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UcmFuc2l0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9ufS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRyYW5zaXRpb24jZ2V0Q29udGFpbmVyXyA8ZW0+Q29udGFpbmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRyYW5zaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2l0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJlZ2lvbl9UcmFuc2l0aW9uKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbiNnZXRDb250YWluZXJfCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbiIgb3Bwb3NpdGU9ImNvbnRhaW5lciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRUcmFuc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGF0ZTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlI2dldFJlZ2lvbiA8ZW0+UmVnaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0YXRlPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGF0ZTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFN0YXRlKFN0YXRlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJlZ2lvbl9TdGF0ZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlI2dldFJlZ2lvbgotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iUmVnaW9uIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdGF0ZSBnZXRTdGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb24jZ2V0U3RhdGUgPGVtPlN0YXRlPC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhdGU8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhdGUoU3RhdGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhdGUgTWFjaGluZTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlTWFjaGluZSNnZXRSZWdpb24gPGVtPlJlZ2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdGF0ZSBNYWNoaW5lPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGF0ZSBNYWNoaW5lPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U3RhdGVNYWNoaW5lKFN0YXRlTWFjaGluZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSZWdpb25fU3RhdGVNYWNoaW5lKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGVNYWNoaW5lI2dldFJlZ2lvbgotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iUmVnaW9uIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdGF0ZU1hY2hpbmUgZ2V0U3RhdGVNYWNoaW5lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbiNnZXRTdGF0ZU1hY2hpbmUgPGVtPlN0YXRlIE1hY2hpbmU8L2VtPn0nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGF0ZSBNYWNoaW5lPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U3RhdGVNYWNoaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGF0ZU1hY2hpbmUoU3RhdGVNYWNoaW5lIHZhbHVlKTsKLQotfSAvLyBSZWdpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUmVwb3J0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUmVwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4ODdkNDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JlcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBSZXBvcnQgaXMgYSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSZXBvcnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVwb3J0IGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBSZXBvcnQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9SZXVzYWJsZUFzc2V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUmV1c2FibGVBc3NldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMDhiNjQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9SZXVzYWJsZUFzc2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgUmV1c2FibGUgQXNzZXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZwotICogaG93IHRoZSBhc3NldCBzaG91bGQgYmUgdXNlZC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UmV1c2FibGVBc3NldCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXVzYWJsZUFzc2V0IGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBSZXVzYWJsZUFzc2V0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9hZG1hcC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvYWRtYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmNlOWI0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9hZG1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgUm9hZG1hcCBpcyBhIHNwZWNpYWwgR3VpZGFuY2UgVHlwZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLgotICogQW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2FkbWFwKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvYWRtYXAgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFJvYWRtYXAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9sZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMTU3NzY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFJvbGUgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgCi0gKiBBIFJvbGUgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcyBvZiBhbiBpbmRpdmlkdWFsIG9yIGEgc2V0IG9mIGluZGl2aWR1YWxzLiAgUm9sZXMgYXJlIG5vdCBpbmRpdmlkdWFscyBvciByZXNvdXJjZXMuICBJbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhlIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiB3aWxsIHdlYXIgZGlmZmVyZW50IGhhdHMsIG9yIHBlcmZvcm0gZGlmZmVyZW50IHJvbGVzLiBUaGUgbWFwcGluZyBmcm9tIGluZGl2aWR1YWwgdG8gcm9sZSwgcGVyZm9ybWVkIGJ5IHRoZSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhbmQgc3RhZmZpbmcgZm9yIGEgcHJvamVjdCwgYWxsb3dzIGRpZmZlcmVudCBpbmRpdmlkdWFscyB0byBhY3QgYXMgc2V2ZXJhbCBkaWZmZXJlbnQgcm9sZXMsIGFuZCBmb3IgYSByb2xlIHRvIGJlIHBsYXllZCBieSBzZXZlcmFsIGluZGl2aWR1YWxzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZSNnZXRNb2RpZmllcyA8ZW0+TW9kaWZpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZSNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlIGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vZGlmaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Nb2RpZmllczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vZGlmaWVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVfTW9kaWZpZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0IiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TW9kaWZpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIEZvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVfUmVzcG9uc2libGVGb3IoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0IiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRSZXNwb25zaWJsZUZvcigpOwotCi19IC8vIFJvbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlRGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTZmOWIzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9sZURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTa2lsbHMgPGVtPlNraWxsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U3lub255bXMgPGVtPlN5bm9ueW1zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvbGVEZXNjcmlwdGlvbiBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2tpbGxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogTGlzdHMgb2Ygc2V0IG9mIHJlcXVpcmVkIHNraWxscyBhIHBlcnNvbiBuZWVkcyB0byBwb3NzZXNzIHRvIGZ1bGZpbGwgdGhhdCBSb2xlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ta2lsbHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNraWxscyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2tpbGxzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTa2lsbHMgPGVtPlNraWxsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2tpbGxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTa2lsbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNraWxscyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXNzaWdubWVudCBBcHByb2FjaGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFzc2lnbm1lbnRBcHByb2FjaGVzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFzc2lnbm1lbnRBcHByb2FjaGVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcyA8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBc3NpZ25tZW50QXBwcm9hY2hlcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3lub255bXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBMaXN0cyBzeW5vbnltcywgaS5lLiBvdGhlciBuYW1lcyB0aGUgUm9sZSBtaWdodCBiZSByZWZlcnJlZCBieS4gIFRvb2wgc3VwcG9ydCBmb3IgdGhlIG1ldGEtbW9kZWwgbWlnaHQgc3VwcG9ydCB0aGF0IGEgUm9sZSBuYW1lIGNhbiBiZSBjb25zaXN0ZW50bHkgYmUgcmVwbGFjZWQgd2l0aCBvbmUgb2YgaXRzIHN5bm9ueW1zIHRocm91Z2h0IGEgUHJvY2Vzcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3lub255bXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN5bm9ueW1zKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFN5bm9ueW1zKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTeW5vbnltcyA8ZW0+U3lub255bXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN5bm9ueW1zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTeW5vbnltcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3lub255bXMoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBSb2xlRGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlRGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvbGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJiODI5NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvbGVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgUm9sZSBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBSb2xlIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBSb2xlIERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJvbGUgPGVtPlJvbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IjZ2V0TW9kaWZpZXMgPGVtPk1vZGlmaWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJlc3BvbnNpYmxlRm9yIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRvcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlRGVzY3JpcHRvciBleHRlbmRzIERlc2NyaXB0b3IgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvbGU8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Um9sZShSb2xlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdG9yX1JvbGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlIGdldFJvbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IjZ2V0Um9sZSA8ZW0+Um9sZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Um9sZShSb2xlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vZGlmaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TW9kaWZpZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb2RpZmllczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRvcl9Nb2RpZmllcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TW9kaWZpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIEZvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRSZXNwb25zaWJsZUZvcigpOwotCi19IC8vIFJvbGVEZXNjcmlwdG9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9sZVNldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvbGVTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmU2YTk0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9sZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIFNldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgUm9sZSBTZXQgb3JnYW5pemVzIFJvbGVzIGludG8gY2F0ZWdvcmllcy4gIEl0IGlzIHVzZWQgdG8gZ3JvdXAgcm9sZXMgdG9nZXRoZXIgdGhhdCBoYXZlIGNlcnRhaW4gY29tbW9uYWxpdGllcy4gIEZvciBleGFtcGxlLCB0aGUgIkFuYWx5c3RzIiBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgIkJ1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCIsICJTeXN0ZW0gQW5hbHlzdCIsIGFzIHdlbGwgYXMgIlJlcXVpcmVtZW50cyBTcGVjaWZpZXIiIHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQjZ2V0Um9sZXMgPGVtPlJvbGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZVNldCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlU2V0IGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2xlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvbGVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVTZXRfUm9sZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFJvbGVzKCk7Ci0KLX0gLy8gUm9sZVNldApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvbGVTZXRHcm91cGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvbGVTZXRHcm91cGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZmUyOWE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlU2V0R3JvdXBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBTZXQgR3JvdXBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBSb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmcjZ2V0Um9sZVNldHMgPGVtPlJvbGUgU2V0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVTZXRHcm91cGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlU2V0R3JvdXBpbmcgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvbGUgU2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2xlIFNldHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlIFNldHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0IiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRSb2xlU2V0cygpOwotCi19IC8vIFJvbGVTZXRHcm91cGluZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1NlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVlN2NiNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1NlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFNlY3Rpb24gaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFNlY3Rpb25OYW1lIDxlbT5TZWN0aW9uIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRTZWN0aW9uRGVzY3JpcHRpb24gPGVtPlNlY3Rpb24gRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRTdWJTZWN0aW9ucyA8ZW0+U3ViIFNlY3Rpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZWN0aW9uIGV4dGVuZHMgVmFyaWFiaWxpdHlFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWN0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY3Rpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2VjdGlvbk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFNlY3Rpb25fU2VjdGlvbk5hbWUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNlY3Rpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbk5hbWUgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZWN0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VjdGlvbk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY3Rpb24gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY3Rpb24gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlY3Rpb25EZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbl9TZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFNlY3Rpb25EZXNjcmlwdGlvbiA8ZW0+U2VjdGlvbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdGlvbiBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZWN0aW9uRGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YiBTZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWIgU2VjdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWIgU2VjdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbl9TdWJTZWN0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTdWJTZWN0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZWRlY2Vzc29yPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWRlY2Vzc29yPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmVkZWNlc3NvcihTZWN0aW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFNlY3Rpb25fUHJlZGVjZXNzb3IoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZWN0aW9uIGdldFByZWRlY2Vzc29yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvcjwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWRlY2Vzc29yKFNlY3Rpb24gdmFsdWUpOwotCi19IC8vIFNlY3Rpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TZW1hbnRpY01vZGVsQnJpZGdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU2VtYW50aWNNb2RlbEJyaWRnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNDE2MGU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TZW1hbnRpY01vZGVsQnJpZGdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VtYW50aWMgTW9kZWwgQnJpZGdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldERpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTZW1hbnRpY01vZGVsQnJpZGdlKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZW1hbnRpY01vZGVsQnJpZGdlIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZXNlbnRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZXNlbnRhdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9QcmVzZW50YXRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldFByZXNlbnRhdGlvbiA8ZW0+UHJlc2VudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlc2VudGF0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldFNlbWFudGljTW9kZWwgPGVtPlNlbWFudGljIE1vZGVsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFNlbWFudGljTW9kZWxCcmlkZ2VfR3JhcGhFbGVtZW50KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldFNlbWFudGljTW9kZWwKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9InNlbWFudGljTW9kZWwiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUdyYXBoRWxlbWVudCBnZXRHcmFwaEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0R3JhcGhFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpYWdyYW08L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldE5hbWVzcGFjZSA8ZW0+TmFtZXNwYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpYWdyYW08L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpYWdyYW08L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREaWFncmFtKERpYWdyYW0pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9EaWFncmFtKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXROYW1lc3BhY2UKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9Im5hbWVzcGFjZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGlhZ3JhbSBnZXREaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRpYWdyYW08L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREaWFncmFtKERpYWdyYW0gdmFsdWUpOwotCi19IC8vIFNlbWFudGljTW9kZWxCcmlkZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNjN2IzMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50I2dldFR5cGVJbmZvIDxlbT5UeXBlIEluZm88L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCBleHRlbmRzIFNlbWFudGljTW9kZWxCcmlkZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGUgSW5mbzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIEluZm88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGVJbmZvKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF9UeXBlSW5mbygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZUluZm8oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQjZ2V0VHlwZUluZm8gPGVtPlR5cGUgSW5mbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBJbmZvPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZUluZm8oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1N0YXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU3RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjJkZjg4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogU3RhdGUuamF2YSx2IDEuMyAyMDA2LzA3LzI0IDIzOjM0OjA4IGJ4dSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZSNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlI2dldFJlZ2lvbiA8ZW0+UmVnaW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlI2dldFN1Ym1hY2hpbmUgPGVtPlN1Ym1hY2hpbmU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTdGF0ZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTdGF0ZSBleHRlbmRzIFZlcnRleCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U3RhdGVfV29ya1Byb2R1Y3QoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0IiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0V29ya1Byb2R1Y3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZ2lvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9ufS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbiNnZXRTdGF0ZSA8ZW0+U3RhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVnaW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVnaW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFN0YXRlX1JlZ2lvbigpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbiNnZXRTdGF0ZQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbiIgb3Bwb3NpdGU9IlN0YXRlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFJlZ2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VibWFjaGluZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3VibWFjaGluZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWJtYWNoaW5lPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTdWJtYWNoaW5lKFN0YXRlTWFjaGluZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTdGF0ZV9TdWJtYWNoaW5lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RhdGVNYWNoaW5lIGdldFN1Ym1hY2hpbmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGUjZ2V0U3VibWFjaGluZSA8ZW0+U3VibWFjaGluZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3VibWFjaGluZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U3VibWFjaGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3VibWFjaGluZShTdGF0ZU1hY2hpbmUgdmFsdWUpOwotCi19IC8vIFN0YXRlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1N0YXRlTWFjaGluZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1N0YXRlTWFjaGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MjY1MGI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TdGF0ZU1hY2hpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RhdGUgTWFjaGluZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlTWFjaGluZSNnZXRSZWdpb24gPGVtPlJlZ2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFN0YXRlTWFjaGluZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTdGF0ZU1hY2hpbmUgZXh0ZW5kcyBXb3JrRGVmaW5pdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVnaW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb259LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uI2dldFN0YXRlTWFjaGluZSA8ZW0+U3RhdGUgTWFjaGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWdpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWdpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U3RhdGVNYWNoaW5lX1JlZ2lvbigpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbiNnZXRTdGF0ZU1hY2hpbmUKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb24iIG9wcG9zaXRlPSJTdGF0ZU1hY2hpbmUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFJlZ2lvbigpOwotCi19IC8vIFN0YXRlTWFjaGluZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TdGVwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU3RlcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlM2I1YTI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TdGVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdGVwPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBTdGVwIGlzIGEgU2VjdGlvbiBhbmQgV29yayBEZWZpbml0aW9uIHRoYXQgaXMgdXNlZCB0byBvcmdhbml6ZSBUYXNrcyBpbnRvIHBhcnRzIG9yIHN1YnVuaXRzIG9mIHdvcmsuICBTdGVwcyBpbmhlcml0IHRoZSBzdWJTZWN0aW9ucyBkZWNvbXBvc2l0aW9uIGZyb20gU2VjdGlvbiBhbmQgY2FuIHRoZXJlZm9yZSBkZXNjcmliZSBTdWItU3RlcHMgbmVzdGVkIGludG8gU3RlcHMuCi0gKiBBIFN0ZXAgZGVzY3JpYmVzIGEgbWVhbmluZ2Z1bCBhbmQgY29uc2lzdCBwYXJ0IG9mIHRoZSBvdmVyYWxsIHdvcmsgZGVzY3JpYmVkIGZvciBhIFRhc2suICBUaGUgY29sbGVjdGlvbiBvZiBTdGVwcyBkZWZpbmVkIGZvciBhIFRhc2sgcmVwcmVzZW50cyBhbGwgdGhlIHdvcmsgdGhhdCBzaG91bGQgYmUgZG9uZSB0byBhY2hpZXZlIHRoZSBvdmVyYWxsIGRldmVsb3BtZW50IGdvYWwgb2YgdGhlIFRhc2suICBOb3QgYWxsIHN0ZXBzIGFyZSBuZWNlc3NhcmlseSBwZXJmb3JtZWQgZWFjaCB0aW1lIGEgVGFzayBpcyBpbnZva2VkIGluIGEgUHJvY2VzcyAoc2VlIFRhc2sgRGVzY3JpcHRvciksIHNvIHRoZXkgY2FuIGFsc28gYmUgZXhwcmVzc2VkIGluIHRoZSBmb3JtIG9mIGFsdGVybmF0ZSAnZmxvd3MnIG9mIHdvcmsuICBEaWZmZXJlbnQgd2F5cyBvZiBhY2hpZXZpbmcgdGhlIHNhbWUgZGV2ZWxvcG1lbnQgZ29hbCBjYW4gdGhlbiBiZSAnYXNzZW1ibGVkJyBieSBzZWxlY3RpbmcgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBzdGVwcyB3aGVuIGFwcGx5aW5nIHRoZSBUYXNrIGluIGEgUHJvY2Vzcy4gIFR5cGljYWwga2luZHMgb2Ygc3RlcHMgYSBUYXNrIGF1dGhvciBzaG91bGQgY29uc2lkZXIgYXJlOiBUaGlua2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgdW5kZXJzdGFuZCB0aGUgbmF0dXJlIG9mIHRoZSB0YXNrLCBnYXRoZXJzIGFuZCBleGFtaW5lcyB0aGUgaW5wdXQgYXJ0aWZhY3RzLCBhbmQgZm9ybXVsYXRlcyB0aGUgb3V0Y29tZS4gUGVyZm9ybWluZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgY3JlYXRlIG9yIHVwZGF0ZSBzb21lIGFydGlmYWN0cy4gUmV2aWV3aW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBpbnNwZWN0cyB0aGUgcmVzdWx0cyBhZ2FpbnN0IHNvbWUgY3JpdGVyaWEuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFN0ZXAoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RlcCBleHRlbmRzIFNlY3Rpb24sIFdvcmtEZWZpbml0aW9uIHsKLX0gLy8gU3RlcApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1N1cHBvcnRpbmdNYXRlcmlhbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1N1cHBvcnRpbmdNYXRlcmlhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NjEyYTNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TdXBwb3J0aW5nTWF0ZXJpYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBTdXBwb3J0aW5nIE1hdGVyaWFscyBpcyBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3VwcG9ydGluZ01hdGVyaWFsIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBTdXBwb3J0aW5nTWF0ZXJpYWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UYXNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOTM0YWQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBUYXNrIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uCi0gKiBBIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAKLSAqIEEgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uIAotICogRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXZlbG9wIFVzZSBDYXNlIE1vZGVsIiBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICJtZXRob2QiIG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0UGVyZm9ybWVkQnkgPGVtPlBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldE1hbmRhdG9yeUlucHV0IDxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0T3B0aW9uYWxJbnB1dCA8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRTdGVwcyA8ZW0+U3RlcHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRUb29sTWVudG9ycyA8ZW0+VG9vbCBNZW50b3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFzaygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUYXNrIGV4dGVuZHMgQ29udGVudEVsZW1lbnQsIFdvcmtEZWZpbml0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgQnk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBlcmZvcm1lZCBCeTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJmb3JtZWQgQnk8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBlcmZvcm1lZEJ5KFJvbGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19QZXJmb3JtZWRCeSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvbGUgZ2V0UGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRQZXJmb3JtZWRCeSA8ZW0+UGVyZm9ybWVkIEJ5PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJmb3JtZWQgQnk8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBlcmZvcm1lZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZXJmb3JtZWRCeShSb2xlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hbmRhdG9yeSBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfTWFuZGF0b3J5SW5wdXQoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0IiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRNYW5kYXRvcnlJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0cHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PdXRwdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRwdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19PdXRwdXQoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0IiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRPdXRwdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9wdGlvbmFsIElucHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfT3B0aW9uYWxJbnB1dCgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE9wdGlvbmFsSW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0ZXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0ZXBzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RlcHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19TdGVwcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcCIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFN0ZXBzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VG9vbCBNZW50b3JzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VG9vbCBNZW50b3JzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfVG9vbE1lbnRvcnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3IiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFRvb2xNZW50b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLX0gLy8gVGFzawpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rhc2tEZXNjcmlwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rhc2tEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYzM1NjMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UYXNrRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2sgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFza0Rlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QdXJwb3NlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQdXJwb3NlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHVycG9zZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHVycG9zZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsdGVybmF0aXZlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIFRhc2tEZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rhc2tEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGFza0Rlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGI0MDFhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGFza0Rlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2sgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgVGFzayBEZXNjcmlwdG9yIGlzIGEgRGVzY3JpcHRvciBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotICogQSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldFRhc2sgPGVtPlRhc2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QXNzaXN0ZWRCeSA8ZW0+QXNzaXN0ZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0RXh0ZXJuYWxJbnB1dCA8ZW0+RXh0ZXJuYWwgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSA8ZW0+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRTZWxlY3RlZFN0ZXBzIDxlbT5TZWxlY3RlZCBTdGVwczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2tEZXNjcmlwdG9yIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnQsIERlc2NyaXB0b3IgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFzazwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VGFzayhUYXNrKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX1Rhc2soKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXNrIGdldFRhc2soKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0VGFzayA8ZW0+VGFzazwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFzazwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGFzayhUYXNrIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzc2lzdGVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Bc3Npc3RlZCBCeTwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFzc2lzdGVkIEJ5PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRBc3Npc3RlZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4dGVybmFsIElucHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgSW5wdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRFeHRlcm5hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TWFuZGF0b3J5SW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE9wdGlvbmFsSW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk91dHB1dDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dHB1dDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0T3V0cHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBlcmZvcm1lZFByaW1hcmlseUJ5KFJvbGVEZXNjcmlwdG9yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZURlc2NyaXB0b3IgZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkgPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZXJmb3JtZWRQcmltYXJpbHlCeShSb2xlRGVzY3JpcHRvciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWxlY3RlZCBTdGVwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWxlY3RlZCBTdGVwczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlbGVjdGVkIFN0ZXBzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24iIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFNlbGVjdGVkU3RlcHMoKTsKLQotfSAvLyBUYXNrRGVzY3JpcHRvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1RlYW1Qcm9maWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGVhbVByb2ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTg4MzNkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGVhbVByb2ZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlYW0gUHJvZmlsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgVGVhbSBQcm9maWxlIGlzIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBncm91cHMgUm9sZSBEZXNjcmlwdG9ycyBvciBSZXNvdXJjZSBEZWZpbml0aW9ucyBkZWZpbmluZyBhIG5lc3RlZCBoaWVyYXJjaHkgb2YgdGVhbXMgYW5kIHRlYW0gbWVtYmVycy4KLSAqIFdvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4KLSAqIEhlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFRlYW1Sb2xlcyA8ZW0+VGVhbSBSb2xlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSNnZXRTdXBlclRlYW0gPGVtPlN1cGVyIFRlYW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0U3ViVGVhbSA8ZW0+U3ViIFRlYW08L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUZWFtUHJvZmlsZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUZWFtUHJvZmlsZSBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRlYW0gUm9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRlYW0gUm9sZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZWFtIFJvbGVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFRlYW1Sb2xlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwZXIgVGVhbTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0U3ViVGVhbSA8ZW0+U3ViIFRlYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3VwZXIgVGVhbTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBlciBUZWFtPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTdXBlclRlYW0oVGVhbVByb2ZpbGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0U3ViVGVhbQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0ic3ViVGVhbSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRlYW1Qcm9maWxlIGdldFN1cGVyVGVhbSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSNnZXRTdXBlclRlYW0gPGVtPlN1cGVyIFRlYW08L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1cGVyIFRlYW08L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFN1cGVyVGVhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3VwZXJUZWFtKFRlYW1Qcm9maWxlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YiBUZWFtPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZX0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSNnZXRTdXBlclRlYW0gPGVtPlN1cGVyIFRlYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIFRlYW08L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWIgVGVhbTwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0U3VwZXJUZWFtCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUiIG9wcG9zaXRlPSJzdXBlclRlYW0iIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFN1YlRlYW0oKTsKLQotfSAvLyBUZWFtUHJvZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1RlbXBsYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGVtcGxhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDBhZGM0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGVtcGxhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBUZW1wbGF0ZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGVtcGxhdGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVtcGxhdGUgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFRlbXBsYXRlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGVybURlZmluaXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UZXJtRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNzNlZGNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UZXJtRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVybSBEZWZpbml0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGVybURlZmluaXRpb25zIGRlZmluZSBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUaGV5IGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUZXJtRGVmaW5pdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUZXJtRGVmaW5pdGlvbiBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gVGVybURlZmluaXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UZXh0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1RleHRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEwNDE4MzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1RleHRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXh0IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudCNnZXRUZXh0IDxlbT5UZXh0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGV4dEVsZW1lbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGV4dEVsZW1lbnQgZXh0ZW5kcyBMZWFmRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRleHQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGV4dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGV4dChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGV4dEVsZW1lbnRfVGV4dCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VGV4dCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudCNnZXRUZXh0IDxlbT5UZXh0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UZXh0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUZXh0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUZXh0KFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gVGV4dEVsZW1lbnQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Ub29sLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNzVhMDljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Ub29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRvb2w8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFRvb2wgaXMgYSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2wjZ2V0VG9vbE1lbnRvcnMgPGVtPlRvb2wgTWVudG9yczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRvb2woKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVG9vbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUb29sX1Rvb2xNZW50b3JzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRUb29sTWVudG9ycygpOwotCi19IC8vIFRvb2wKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Ub29sTWVudG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVG9vbE1lbnRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZjZlOTU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Ub29sTWVudG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgVG9vbCBNZW50b3IgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUb29sTWVudG9yKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRvb2xNZW50b3IgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFRvb2xNZW50b3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UcmFuc2l0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVHJhbnNpdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZThmMWViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UcmFuc2l0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUcmFuc2l0aW9uLmphdmEsdiAxLjMgMjAwNi8wNy8yNCAyMzozNDowOCBieHUgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VHJhbnNpdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRyYW5zaXRpb24jZ2V0V29ya0RlZmluaXRpb24gPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uI2dldENvbnRhaW5lcl8gPGVtPkNvbnRhaW5lcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRyYW5zaXRpb24jZ2V0VGFyZ2V0IDxlbT5UYXJnZXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUcmFuc2l0aW9uKCkKLSAqIEBtb2RlbAotICogQGV4dGVuZHMgSU1vZGVsT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHJhbnNpdGlvbiBleHRlbmRzIElNb2RlbE9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yayBEZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xb3JrIERlZmluaXRpb248L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIERlZmluaXRpb248L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VHJhbnNpdGlvbl9Xb3JrRGVmaW5pdGlvbigpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRXb3JrRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uI2dldFRyYW5zaXRpb24gPGVtPlRyYW5zaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGFpbmVyPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWluZXI8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb250YWluZXIoUmVnaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRyYW5zaXRpb25fQ29udGFpbmVyKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uI2dldFRyYW5zaXRpb24KLQkgKiBAbW9kZWwgb3Bwb3NpdGU9IlRyYW5zaXRpb24iIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZWdpb24gZ2V0Q29udGFpbmVyXygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uI2dldENvbnRhaW5lcl8gPGVtPkNvbnRhaW5lcjwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhaW5lcjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbnRhaW5lcl8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnRhaW5lcihSZWdpb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U291cmNlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXgjZ2V0T3V0Z29pbmcgPGVtPk91dGdvaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNvdXJjZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb3VyY2U8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFNvdXJjZShWZXJ0ZXgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VHJhbnNpdGlvbl9Tb3VyY2UoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXgjZ2V0T3V0Z29pbmcKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9Im91dGdvaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmVydGV4IGdldFNvdXJjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb3VyY2U8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U291cmNlKFZlcnRleCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXJnZXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZlcnRleCNnZXRJbmNvbWluZyA8ZW0+SW5jb21pbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFyZ2V0PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VGFyZ2V0KFZlcnRleCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUcmFuc2l0aW9uX1RhcmdldCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlZlcnRleCNnZXRJbmNvbWluZwotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iaW5jb21pbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlWZXJ0ZXggZ2V0VGFyZ2V0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRyYW5zaXRpb24jZ2V0VGFyZ2V0IDxlbT5UYXJnZXQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VGFyZ2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUYXJnZXQoVmVydGV4IHZhbHVlKTsKLQotfSAvLyBUcmFuc2l0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1R5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBhM2NlYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBVTUwgMi4wIG1ldGEtY2xhc3MgVHlwZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VHlwZSgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHlwZSBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudCB7Ci19IC8vIFR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMWE4OTU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBVTUFTZW1hbnRpY01vZGVsQnJpZGdlIGV4dGVuZHMgU2VtYW50aWNNb2RlbEJyaWRnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFbGVtZW50KE1ldGhvZEVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kRWxlbWVudCBnZXRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWxlbWVudChNZXRob2RFbGVtZW50IHZhbHVlKTsKLQotfSAvLyBVTUFTZW1hbnRpY01vZGVsQnJpZGdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVW1hRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1VtYUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDQ4OGNlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVW1hRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVW1hRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVVtYUZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYUZhY3RvcnlJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFja2FnZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlIGNyZWF0ZVBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29uc3RyYWludDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29uc3RyYWludDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29uc3RyYWludCBjcmVhdGVDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kRWxlbWVudFByb3BlcnR5IGNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50RGVzY3JpcHRpb24gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlY3Rpb24gY3JlYXRlU2VjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlIGNyZWF0ZVJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFzayBjcmVhdGVUYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlN0ZXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlN0ZXA8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0ZXAgY3JlYXRlU3RlcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcnRpZmFjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXJ0aWZhY3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVsaXZlcmFibGUgY3JlYXRlRGVsaXZlcmFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3V0Y29tZSBjcmVhdGVPdXRjb21lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50UGFja2FnZSBjcmVhdGVDb250ZW50UGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFydGlmYWN0RGVzY3JpcHRpb24gY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvbGVEZXNjcmlwdGlvbiBjcmVhdGVSb2xlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFza0Rlc2NyaXB0aW9uIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUd1aWRhbmNlRGVzY3JpcHRpb24gY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByYWN0aWNlRGVzY3JpcHRpb24gY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb2ludDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9pbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBvaW50IGNyZWF0ZVBvaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpYWdyYW0gTGluazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlhZ3JhbSBMaW5rPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaWFncmFtTGluayBjcmVhdGVEaWFncmFtTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HcmFwaCBDb25uZWN0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdyYXBoIENvbm5lY3RvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3JhcGhDb25uZWN0b3IgY3JlYXRlR3JhcGhDb25uZWN0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGltZW5zaW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaW1lbnNpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURpbWVuc2lvbiBjcmVhdGVEaW1lbnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVmZXJlbmNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZWZlcmVuY2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlZmVyZW5jZSBjcmVhdGVSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvcGVydHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb3BlcnR5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9wZXJ0eSBjcmVhdGVQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HcmFwaCBFZGdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HcmFwaCBFZGdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlHcmFwaEVkZ2UgY3JlYXRlR3JhcGhFZGdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURpYWdyYW0gY3JlYXRlRGlhZ3JhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HcmFwaCBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HcmFwaCBOb2RlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlHcmFwaE5vZGUgY3JlYXRlR3JhcGhOb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNpbXBsZSBTZW1hbnRpYyBNb2RlbCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgY3JlYXRlU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VU1BIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VU1BIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBjcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UgY3JlYXRlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGV4dCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZXh0IEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRleHRFbGVtZW50IGNyZWF0ZVRleHRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkltYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbWFnZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW1hZ2UgY3JlYXRlSW1hZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9seWxpbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvbHlsaW5lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQb2x5bGluZSBjcmVhdGVQb2x5bGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbGxpcHNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbGxpcHNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFbGxpcHNlIGNyZWF0ZUVsbGlwc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZpdHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBY3Rpdml0eSBjcmVhdGVBY3Rpdml0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NaWxlc3RvbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWlsZXN0b25lIGNyZWF0ZU1pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JdGVyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkl0ZXJhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSXRlcmF0aW9uIGNyZWF0ZUl0ZXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QaGFzZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGhhc2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBoYXNlIGNyZWF0ZVBoYXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlYW0gUHJvZmlsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVhbSBQcm9maWxlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUZWFtUHJvZmlsZSBjcmVhdGVUZWFtUHJvZmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZURlc2NyaXB0b3IgY3JlYXRlUm9sZURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBPcmRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBPcmRlcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya09yZGVyIGNyZWF0ZVdvcmtPcmRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQbGFubmluZ0RhdGEgY3JlYXRlUGxhbm5pbmdEYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXNrRGVzY3JpcHRvciBjcmVhdGVUYXNrRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb21wb3NpdGVSb2xlIGNyZWF0ZUNvbXBvc2l0ZVJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZpdHlEZXNjcmlwdGlvbiBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NEZXNjcmlwdGlvbiBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVzY3JpcHRvckRlc2NyaXB0aW9uIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb25jZXB0IGNyZWF0ZUNvbmNlcHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNoZWNrbGlzdCBjcmVhdGVDaGVja2xpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXhhbXBsZSBjcmVhdGVFeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlHdWlkZWxpbmUgY3JlYXRlR3VpZGVsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXBvcnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlcG9ydCBjcmVhdGVSZXBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVtcGxhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUZW1wbGF0ZSBjcmVhdGVUZW1wbGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdXBwb3J0aW5nTWF0ZXJpYWwgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRvb2wgTWVudG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVG9vbE1lbnRvciBjcmVhdGVUb29sTWVudG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdoaXRlcGFwZXIgY3JlYXRlV2hpdGVwYXBlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGVybURlZmluaXRpb24gY3JlYXRlVGVybURlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJhY3RpY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByYWN0aWNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcmFjdGljZSBjcmVhdGVQcmFjdGljZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJldXNhYmxlQXNzZXQgY3JlYXRlUmV1c2FibGVBc3NldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdGF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3RhdGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0YXRlIGNyZWF0ZVN0YXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlZlcnRleDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VmVydGV4PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlWZXJ0ZXggY3JlYXRlVmVydGV4KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlZ2lvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVnaW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZWdpb24gY3JlYXRlUmVnaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlN0YXRlIE1hY2hpbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlN0YXRlIE1hY2hpbmU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0YXRlTWFjaGluZSBjcmVhdGVTdGF0ZU1hY2hpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VHJhbnNpdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VHJhbnNpdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVHJhbnNpdGlvbiBjcmVhdGVUcmFuc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBzZXVkbyBTdGF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHNldWRvIFN0YXRlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQc2V1ZG9TdGF0ZSBjcmVhdGVQc2V1ZG9TdGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaXNjaXBsaW5lIGNyZWF0ZURpc2NpcGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBTZXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlU2V0IGNyZWF0ZVJvbGVTZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RG9tYWluPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Eb21haW48L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvbWFpbiBjcmVhdGVEb21haW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdFR5cGUgY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURpc2NpcGxpbmVHcm91cGluZyBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVG9vbCBjcmVhdGVUb29sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZVNldEdyb3VwaW5nIGNyZWF0ZVJvbGVTZXRHcm91cGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ3VzdG9tQ2F0ZWdvcnkgY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVsaXZlcnlQcm9jZXNzIGNyZWF0ZURlbGl2ZXJ5UHJvY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ2FwYWJpbGl0eVBhdHRlcm4gY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9hZG1hcDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9hZG1hcDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9hZG1hcCBjcmVhdGVSb2FkbWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0NvbXBvbmVudCBjcmVhdGVQcm9jZXNzQ29tcG9uZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9jZXNzUGFja2FnZSBjcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBjcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIGNyZWF0ZVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZFBsdWdpbiBjcmVhdGVNZXRob2RQbHVnaW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RDb25maWd1cmF0aW9uIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBGYW1pbHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9jZXNzRmFtaWx5IGNyZWF0ZVByb2Nlc3NGYW1pbHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RMaWJyYXJ5IGNyZWF0ZU1ldGhvZExpYnJhcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVW1hUGFja2FnZSBnZXRVbWFQYWNrYWdlKCk7Ci0KLX0gLy9VbWFGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVW1hUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1VtYVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQ5NTA0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVW1hUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0NDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIDAzCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVW1hUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJ1bWEiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmVwZi51bWEiOwotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVbWFQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGVtZW50SW1wbCA8ZW0+RWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRUxFTUVOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZWRFbGVtZW50SW1wbCA8ZW0+TmFtZWQgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5OYW1lZEVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TmFtZWRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5BTUVEX0VMRU1FTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FRF9FTEVNRU5UX19OQU1FID0gRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5OYW1lZCBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5BTUVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IEVMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QYWNrYWdlYWJsZUVsZW1lbnRJbXBsIDxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBhY2thZ2VhYmxlRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEFDS0FHRUFCTEVfRUxFTUVOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBQ0tBR0VBQkxFX0VMRU1FTlRfX05BTUUgPSBOQU1FRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gTkFNRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlR5cGVJbXBsIDxlbT5UeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUWVBFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVFlQRV9fTkFNRSA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUWVBFX0ZFQVRVUkVfQ09VTlQgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2xhc3NpZmllckltcGwgPGVtPkNsYXNzaWZpZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2xhc3NpZmllckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDbGFzc2lmaWVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENMQVNTSUZJRVIgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTEFTU0lGSUVSX19OQU1FID0gVFlQRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5DbGFzc2lmaWVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENMQVNTSUZJRVJfRkVBVFVSRV9DT1VOVCA9IFRZUEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5OYW1lc3BhY2VJbXBsIDxlbT5OYW1lc3BhY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZXNwYWNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE5hbWVzcGFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOQU1FU1BBQ0UgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FU1BBQ0VfX05BTUUgPSBOQU1FRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk5hbWVzcGFjZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FU1BBQ0VfRkVBVFVSRV9DT1VOVCA9IE5BTUVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QYWNrYWdlSW1wbCA8ZW0+UGFja2FnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QYWNrYWdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEFDS0FHRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBQ0tBR0VfX05BTUUgPSBOQU1FU1BBQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGFja2FnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBOQU1FU1BBQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCA8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX05BTUUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fR1VJRCA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uc3RyYWludEltcGwgPGVtPkNvbnN0cmFpbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uc3RyYWludEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlNUUkFJTlQgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX0dVSUQgPSBNRVRIT0RfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19PV05FRF9SVUxFUyA9IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX1NVUFBSRVNTRUQgPSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJvZHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19CT0RZID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29uc3RyYWludDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fTkFNRSA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX0ZFQVRVUkVfQ09VTlQgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCA8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlQgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19HVUlEID0gTUVUSE9EX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fT1dORURfUlVMRVMgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19TVVBQUkVTU0VEID0gTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5WYXJpYWJpbGl0eUVsZW1lbnRJbXBsIDxlbT5WYXJpYWJpbGl0eSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlZhcmlhYmlsaXR5RWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRWYXJpYWJpbGl0eUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVCA9IDExMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCA8ZW0+Q29udGVudCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVCA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX05BTUUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0dVSUQgPSBERVNDUklCQUJMRV9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBERVNDUklCQUJMRV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFMgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUyA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRVMgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19BU1NFVFMgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RVbml0SW1wbCA8ZW0+TWV0aG9kIFVuaXQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kVW5pdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUID0gMTEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fR1VJRCA9IE1FVEhPRF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fT1dORURfUlVMRVMgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX1NVUFBSRVNTRUQgPSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX0FVVEhPUlMgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19DSEFOR0VfREFURSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX1ZFUlNJT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgVW5pdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsIDxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTiA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FID0gTUVUSE9EX1VOSVRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0dVSUQgPSBNRVRIT0RfVU5JVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX1VOSVRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IE1FVEhPRF9VTklUX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfVU5JVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBNRVRIT0RfVU5JVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1VOSVRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IE1FVEhPRF9VTklUX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX0VMRU1FTlRfX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9fR1VJRCA9IE1FVEhPRF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQVJJQUJJTElUWV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZWN0aW9uSW1wbCA8ZW0+U2VjdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZWN0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VDVElPTiA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19OQU1FID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fR1VJRCA9IFZBUklBQklMSVRZX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IFZBUklBQklMSVRZX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19PV05FRF9SVUxFUyA9IFZBUklBQklMSVRZX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFZBUklBQklMSVRZX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19TVVBQUkVTU0VEID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX09SREVSSU5HX0dVSURFID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEUgPSBWQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19TRUNUSU9OX05BTUUgPSBWQVJJQUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb24gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19TRUNUSU9OX0RFU0NSSVBUSU9OID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWIgU2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1NVQl9TRUNUSU9OUyA9IFZBUklBQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19QUkVERUNFU1NPUiA9IFZBUklBQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VjdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX0ZFQVRVUkVfQ09VTlQgPSBWQVJJQUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZUltcGwgPGVtPlJvbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEUgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fR1VJRCA9IENPTlRFTlRfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fT1dORURfUlVMRVMgPSBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1NVUFBSRVNTRUQgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fU0hBUEVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0NIRUNLTElTVFMgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fR1VJREVMSU5FUyA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fRVhBTVBMRVMgPSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fQVNTRVRTID0gQ09OVEVOVF9FTEVNRU5UX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW9kaWZpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX01PRElGSUVTID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIEZvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fUkVTUE9OU0lCTEVfRk9SID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsIDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19HVUlEID0gQ09OVEVOVF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fT1dORURfUlVMRVMgPSBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fU0hBUEVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX05PREVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0NIRUNLTElTVFMgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19HVUlERUxJTkVTID0gQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0VYQU1QTEVTID0gQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fQVNTRVRTID0gQ09OVEVOVF9FTEVNRU5UX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19SRVBPUlRTID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19URU1QTEFURVMgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SUyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwgPGVtPlRhc2s8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRBU0sgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fR1VJRCA9IENPTlRFTlRfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1dORURfUlVMRVMgPSBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1NVUFBSRVNTRUQgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU0hBUEVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0NIRUNLTElTVFMgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fR1VJREVMSU5FUyA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVhBTVBMRVMgPSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQVNTRVRTID0gQ09OVEVOVF9FTEVNRU5UX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUFJFQ09ORElUSU9OID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QT1NUQ09ORElUSU9OID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcmZvcm1lZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BFUkZPUk1FRF9CWSA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX01BTkRBVE9SWV9JTlBVVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09VVFBVVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PUFRJT05BTF9JTlBVVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGVwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU1RFUFMgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19UT09MX01FTlRPUlMgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYXNrPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrRGVmaW5pdGlvbkltcGwgPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrRGVmaW5pdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT04gPSAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fR1VJRCA9IE1FVEhPRF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19PV05FRF9SVUxFUyA9IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19TVVBQUkVTU0VEID0gTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RlcEltcGwgPGVtPlN0ZXA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RlcEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTdGVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNURVAgPSAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9fTkFNRSA9IFNFQ1RJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX0dVSUQgPSBTRUNUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9fQlJJRUZfREVTQ1JJUFRJT04gPSBTRUNUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9fT1dORURfUlVMRVMgPSBTRUNUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBTRUNUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9fU1VQUFJFU1NFRCA9IFNFQ1RJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19PUkRFUklOR19HVUlERSA9IFNFQ1RJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19WQVJJQUJJTElUWV9UWVBFID0gU0VDVElPTl9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFNFQ1RJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9fU0VDVElPTl9OQU1FID0gU0VDVElPTl9fU0VDVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb24gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19TRUNUSU9OX0RFU0NSSVBUSU9OID0gU0VDVElPTl9fU0VDVElPTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWIgU2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX1NVQl9TRUNUSU9OUyA9IFNFQ1RJT05fX1NVQl9TRUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX1BSRURFQ0VTU09SID0gU0VDVElPTl9fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9fUFJFQ09ORElUSU9OID0gU0VDVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9fUE9TVENPTkRJVElPTiA9IFNFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U3RlcDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX0ZFQVRVUkVfQ09VTlQgPSBTRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGFuY2VJbXBsIDxlbT5HdWlkYW5jZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkYW5jZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBHVUlEQU5DRSA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0dVSUQgPSBDT05URU5UX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fT1dORURfUlVMRVMgPSBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fU1VQUFJFU1NFRCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fU0hBUEVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fTk9ERUlDT04gPSBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBDT05URU5UX0VMRU1FTlRfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0NIRUNLTElTVFMgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0dVSURFTElORVMgPSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19FWEFNUExFUyA9IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fQVNTRVRTID0gQ09OVEVOVF9FTEVNRU5UX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3VpZGFuY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0SW1wbCA8ZW0+QXJ0aWZhY3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QXJ0aWZhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1QgPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX05BTUUgPSBXT1JLX1BST0RVQ1RfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19HVUlEID0gV09SS19QUk9EVUNUX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX09XTkVEX1JVTEVTID0gV09SS19QUk9EVUNUX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19QUk9EVUNUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1NVUFBSRVNTRUQgPSBXT1JLX1BST0RVQ1RfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fT1JERVJJTkdfR1VJREUgPSBXT1JLX1BST0RVQ1RfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fUFJFU0VOVEFUSU9OID0gV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1NIQVBFSUNPTiA9IFdPUktfUFJPRFVDVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX05PREVJQ09OID0gV09SS19QUk9EVUNUX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1ZBUklBQklMSVRZX1RZUEUgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBXT1JLX1BST0RVQ1RfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19DT05DRVBUU19BTkRfUEFQRVJTID0gV09SS19QUk9EVUNUX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19DSEVDS0xJU1RTID0gV09SS19QUk9EVUNUX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19HVUlERUxJTkVTID0gV09SS19QUk9EVUNUX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fRVhBTVBMRVMgPSBXT1JLX1BST0RVQ1RfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0FTU0VUUyA9IFdPUktfUFJPRFVDVF9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19SRVBPUlRTID0gV09SS19QUk9EVUNUX19SRVBPUlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1RFTVBMQVRFUyA9IFdPUktfUFJPRFVDVF9fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1RPT0xfTUVOVE9SUyA9IFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lciBBcnRpZmFjdDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFydGlmYWN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwgPGVtPkRlbGl2ZXJhYmxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFTElWRVJBQkxFID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19OQU1FID0gV09SS19QUk9EVUNUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fR1VJRCA9IFdPUktfUFJPRFVDVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19PV05FRF9SVUxFUyA9IFdPUktfUFJPRFVDVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfUFJPRFVDVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19TVVBQUkVTU0VEID0gV09SS19QUk9EVUNUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1BSRVNFTlRBVElPTiA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19TSEFQRUlDT04gPSBXT1JLX1BST0RVQ1RfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19OT0RFSUNPTiA9IFdPUktfUFJPRFVDVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19WQVJJQUJJTElUWV9UWVBFID0gV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gV09SS19QUk9EVUNUX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IFdPUktfUFJPRFVDVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fQ0hFQ0tMSVNUUyA9IFdPUktfUFJPRFVDVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fR1VJREVMSU5FUyA9IFdPUktfUFJPRFVDVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0VYQU1QTEVTID0gV09SS19QUk9EVUNUX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19BU1NFVFMgPSBXT1JLX1BST0RVQ1RfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fUkVQT1JUUyA9IFdPUktfUFJPRFVDVF9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19URU1QTEFURVMgPSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19UT09MX01FTlRPUlMgPSBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IFdPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyZWQgV29yayBQcm9kdWN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1RTID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5PdXRjb21lSW1wbCA8ZW0+T3V0Y29tZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5PdXRjb21lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE91dGNvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1VUQ09NRSA9IDIyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19OQU1FID0gV09SS19QUk9EVUNUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19HVUlEID0gV09SS19QUk9EVUNUX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19PV05FRF9SVUxFUyA9IFdPUktfUFJPRFVDVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19QUk9EVUNUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fU1VQUFJFU1NFRCA9IFdPUktfUFJPRFVDVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19QUkVTRU5UQVRJT04gPSBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19TSEFQRUlDT04gPSBXT1JLX1BST0RVQ1RfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX05PREVJQ09OID0gV09SS19QUk9EVUNUX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fVkFSSUFCSUxJVFlfVFlQRSA9IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBXT1JLX1BST0RVQ1RfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBXT1JLX1BST0RVQ1RfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fQ0hFQ0tMSVNUUyA9IFdPUktfUFJPRFVDVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19HVUlERUxJTkVTID0gV09SS19QUk9EVUNUX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19FWEFNUExFUyA9IFdPUktfUFJPRFVDVF9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19BU1NFVFMgPSBXT1JLX1BST0RVQ1RfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19SRVBPUlRTID0gV09SS19QUk9EVUNUX19SRVBPUlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fVEVNUExBVEVTID0gV09SS19QUk9EVUNUX19URU1QTEFURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19UT09MX01FTlRPUlMgPSBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk91dGNvbWU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRSA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fR1VJRCA9IE1FVEhPRF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fT1dORURfUlVMRVMgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX1NVUFBSRVNTRUQgPSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fR0xPQkFMID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2VkIFBhY2thZ2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hpbGQgUGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUyA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRQYWNrYWdlSW1wbCA8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRQYWNrYWdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRSA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19HVUlEID0gTUVUSE9EX1BBQ0tBR0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX09XTkVEX1JVTEVTID0gTUVUSE9EX1BBQ0tBR0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX1NVUFBSRVNTRUQgPSBNRVRIT0RfUEFDS0FHRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfUEFDS0FHRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19HTE9CQUwgPSBNRVRIT0RfUEFDS0FHRV9fR0xPQkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRVMgPSBNRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoaWxkIFBhY2thZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTID0gTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUyA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OID0gMjY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fR1VJRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBhY3QgT2YgTm90IEhhdmluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsIDxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT04gPSAyNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05BTUUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19HVUlEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fQVVUSE9SUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fVkVSU0lPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fU0VDVElPTlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgT3V0bGluZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwgPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTiA9IDI3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fTkFNRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0dVSUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYWNrYWdpbmcgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsIDxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTiA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fR1VJRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNraWxsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzaWdubWVudCBBcHByb2FjaGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TeW5vbnltczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTiA9IDI5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fR1VJRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRhbmNlRGVzY3JpcHRpb25JbXBsIDxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEd1aWRhbmNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT04gPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fR1VJRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRhY2htZW50czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCA8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OID0gMzE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dVSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbCBJbmZvPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvYmxlbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdvYWxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGV2ZWxzIE9mIEFkb3B0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2ludEltcGwgPGVtPlBvaW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvaW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBPSU5UID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPSU5UX19YID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5ZPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9JTlRfX1kgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBvaW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPSU5UX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUVsZW1lbnRJbXBsIDxlbT5EaWFncmFtIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlhZ3JhbUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UID0gMzQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX0dVSUQgPSBNRVRIT0RfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fT1dORURfUlVMRVMgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlhZ3JhbSBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVsZW1lbnRJbXBsIDxlbT5HcmFwaCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVCA9IDMzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19OQU1FID0gRElBR1JBTV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19HVUlEID0gRElBR1JBTV9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBESUFHUkFNX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19PV05FRF9SVUxFUyA9IERJQUdSQU1fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IERJQUdSQU1fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gRElBR1JBTV9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fSVNfVklTSUJMRSA9IERJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVSID0gRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19SRUZFUkVOQ0UgPSBESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fUFJPUEVSVFkgPSBESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc2l0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fUE9TSVRJT04gPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19DT05UQUlORUQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fTElOSyA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbmNob3JhZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRSA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZW1hbnRpYyBNb2RlbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUxpbmtJbXBsIDxlbT5EaWFncmFtIExpbms8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUxpbmtJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlhZ3JhbUxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LID0gMzU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fTkFNRSA9IERJQUdSQU1fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19HVUlEID0gRElBR1JBTV9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19CUklFRl9ERVNDUklQVElPTiA9IERJQUdSQU1fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fT1dORURfUlVMRVMgPSBESUFHUkFNX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19TVVBQUkVTU0VEID0gRElBR1JBTV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19PUkRFUklOR19HVUlERSA9IERJQUdSQU1fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fSVNfVklTSUJMRSA9IERJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19DT05UQUlORVIgPSBESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fUkVGRVJFTkNFID0gRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fUFJPUEVSVFkgPSBESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlpvb208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX1pPT00gPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Vmlld3BvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX1ZJRVdQT1JUID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW08L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX0RJQUdSQU0gPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlhZ3JhbSBMaW5rPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19GRUFUVVJFX0NPVU5UID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhDb25uZWN0b3JJbXBsIDxlbT5HcmFwaCBDb25uZWN0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhDb25uZWN0b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3JhcGhDb25uZWN0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SID0gMzY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fTkFNRSA9IEdSQVBIX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fR1VJRCA9IEdSQVBIX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1JBUEhfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fT1dORURfUlVMRVMgPSBHUkFQSF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdSQVBIX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX1NVUFBSRVNTRUQgPSBHUkFQSF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19PUkRFUklOR19HVUlERSA9IEdSQVBIX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0lTX1ZJU0lCTEUgPSBHUkFQSF9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0NPTlRBSU5FUiA9IEdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fUkVGRVJFTkNFID0gR1JBUEhfRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX1BST1BFUlRZID0gR1JBUEhfRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX1BPU0lUSU9OID0gR1JBUEhfRUxFTUVOVF9fUE9TSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0NPTlRBSU5FRCA9IEdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0xJTksgPSBHUkFQSF9FTEVNRU5UX19MSU5LOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFuY2hvcmFnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19BTkNIT1JBR0UgPSBHUkFQSF9FTEVNRU5UX19BTkNIT1JBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VtYW50aWMgTW9kZWw8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX1NFTUFOVElDX01PREVMID0gR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQgPSBHUkFQSF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIEVkZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRSA9IEdSQVBIX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3JhcGggQ29ubmVjdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9GRUFUVVJFX0NPVU5UID0gR1JBUEhfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIDxlbT5TZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VtYW50aWNNb2RlbEJyaWRnZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTZW1hbnRpY01vZGVsQnJpZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRSA9IDM3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX05BTUUgPSBESUFHUkFNX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fR1VJRCA9IERJQUdSQU1fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBESUFHUkFNX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX09XTkVEX1JVTEVTID0gRElBR1JBTV9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fU1VQUFJFU1NFRCA9IERJQUdSQU1fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fT1JERVJJTkdfR1VJREUgPSBESUFHUkFNX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0lTX1ZJU0lCTEUgPSBESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fQ09OVEFJTkVSID0gRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1JFRkVSRU5DRSA9IERJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTiA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX0ZFQVRVUkVfQ09VTlQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaW1lbnNpb25JbXBsIDxlbT5EaW1lbnNpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGltZW5zaW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpbWVuc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESU1FTlNJT04gPSAzODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJTUVOU0lPTl9fV0lEVEggPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJTUVOU0lPTl9fSEVJR0hUID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EaW1lbnNpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElNRU5TSU9OX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVmZXJlbmNlSW1wbCA8ZW0+UmVmZXJlbmNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlZmVyZW5jZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFID0gMzk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fTkFNRSA9IERJQUdSQU1fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19HVUlEID0gRElBR1JBTV9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19CUklFRl9ERVNDUklQVElPTiA9IERJQUdSQU1fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fT1dORURfUlVMRVMgPSBESUFHUkFNX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19TVVBQUkVTU0VEID0gRElBR1JBTV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19PUkRFUklOR19HVUlERSA9IERJQUdSQU1fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fSVNfVklTSUJMRSA9IERJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19DT05UQUlORVIgPSBESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fUkVGRVJFTkNFID0gRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fUFJPUEVSVFkgPSBESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX0lTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT04gPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fUkVGRVJFTkNFRCA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZWZlcmVuY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX0ZFQVRVUkVfQ09VTlQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9wZXJ0eUltcGwgPGVtPlByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb3BlcnR5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST1BFUlRZID0gNDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19OQU1FID0gRElBR1JBTV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fR1VJRCA9IERJQUdSQU1fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19CUklFRl9ERVNDUklQVElPTiA9IERJQUdSQU1fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19PV05FRF9SVUxFUyA9IERJQUdSQU1fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19TVVBQUkVTU0VEID0gRElBR1JBTV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX09SREVSSU5HX0dVSURFID0gRElBR1JBTV9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX0lTX1ZJU0lCTEUgPSBESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19DT05UQUlORVIgPSBESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19SRUZFUkVOQ0UgPSBESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fS0VZID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX1ZBTFVFID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb3BlcnR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0ZFQVRVUkVfQ09VTlQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVkZ2VJbXBsIDxlbT5HcmFwaCBFZGdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWRnZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaEVkZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRSA9IDQxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19OQU1FID0gR1JBUEhfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fR1VJRCA9IEdSQVBIX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19CUklFRl9ERVNDUklQVElPTiA9IEdSQVBIX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19PV05FRF9SVUxFUyA9IEdSQVBIX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdSQVBIX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19TVVBQUkVTU0VEID0gR1JBUEhfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX09SREVSSU5HX0dVSURFID0gR1JBUEhfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX0lTX1ZJU0lCTEUgPSBHUkFQSF9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19DT05UQUlORVIgPSBHUkFQSF9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19SRUZFUkVOQ0UgPSBHUkFQSF9FTEVNRU5UX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX1BST1BFUlRZID0gR1JBUEhfRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19QT1NJVElPTiA9IEdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fQ09OVEFJTkVEID0gR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX0xJTksgPSBHUkFQSF9FTEVNRU5UX19MSU5LOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFuY2hvcmFnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fQU5DSE9SQUdFID0gR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlbWFudGljIE1vZGVsPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fU0VNQU5USUNfTU9ERUwgPSBHUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbmNob3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX0FOQ0hPUiA9IEdSQVBIX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2F5cG9pbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19XQVlQT0lOVFMgPSBHUkFQSF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkdyYXBoIEVkZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9GRUFUVVJFX0NPVU5UID0gR1JBUEhfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoTm9kZUltcGwgPGVtPkdyYXBoIE5vZGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhOb2RlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEdyYXBoTm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBHUkFQSF9OT0RFID0gNDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX05BTUUgPSBHUkFQSF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19HVUlEID0gR1JBUEhfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1JBUEhfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX09XTkVEX1JVTEVTID0gR1JBUEhfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1JBUEhfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX1NVUFBSRVNTRUQgPSBHUkFQSF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fT1JERVJJTkdfR1VJREUgPSBHUkFQSF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fSVNfVklTSUJMRSA9IEdSQVBIX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX0NPTlRBSU5FUiA9IEdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX1JFRkVSRU5DRSA9IEdSQVBIX0VMRU1FTlRfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fUFJPUEVSVFkgPSBHUkFQSF9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3NpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX1BPU0lUSU9OID0gR1JBUEhfRUxFTUVOVF9fUE9TSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19DT05UQUlORUQgPSBHUkFQSF9FTEVNRU5UX19DT05UQUlORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fTElOSyA9IEdSQVBIX0VMRU1FTlRfX0xJTks7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QW5jaG9yYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19BTkNIT1JBR0UgPSBHUkFQSF9FTEVNRU5UX19BTkNIT1JBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VtYW50aWMgTW9kZWw8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19TRU1BTlRJQ19NT0RFTCA9IEdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNpemU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19TSVpFID0gR1JBUEhfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5HcmFwaCBOb2RlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfRkVBVFVSRV9DT1VOVCA9IEdSQVBIX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtSW1wbCA8ZW0+RGlhZ3JhbTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpYWdyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRElBR1JBTSA9IDQyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19OQU1FID0gR1JBUEhfTk9ERV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fR1VJRCA9IEdSQVBIX05PREVfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19CUklFRl9ERVNDUklQVElPTiA9IEdSQVBIX05PREVfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19PV05FRF9SVUxFUyA9IEdSQVBIX05PREVfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdSQVBIX05PREVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19TVVBQUkVTU0VEID0gR1JBUEhfTk9ERV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX09SREVSSU5HX0dVSURFID0gR1JBUEhfTk9ERV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0lTX1ZJU0lCTEUgPSBHUkFQSF9OT0RFX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19DT05UQUlORVIgPSBHUkFQSF9OT0RFX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19SRUZFUkVOQ0UgPSBHUkFQSF9OT0RFX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1BST1BFUlRZID0gR1JBUEhfTk9ERV9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19QT1NJVElPTiA9IEdSQVBIX05PREVfX1BPU0lUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fQ09OVEFJTkVEID0gR1JBUEhfTk9ERV9fQ09OVEFJTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0xJTksgPSBHUkFQSF9OT0RFX19MSU5LOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFuY2hvcmFnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fQU5DSE9SQUdFID0gR1JBUEhfTk9ERV9fQU5DSE9SQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlbWFudGljIE1vZGVsPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fU0VNQU5USUNfTU9ERUwgPSBHUkFQSF9OT0RFX19TRU1BTlRJQ19NT0RFTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaXplPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fU0laRSA9IEdSQVBIX05PREVfX1NJWkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Wm9vbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1pPT00gPSBHUkFQSF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZpZXdwb2ludDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1ZJRVdQT0lOVCA9IEdSQVBIX05PREVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbSBMaW5rPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19ESUFHUkFNX0xJTksgPSBHUkFQSF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX05BTUVTUEFDRSA9IEdSQVBIX05PREVfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlhZ3JhbTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0ZFQVRVUkVfQ09VTlQgPSBHUkFQSF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsIDxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVCA9IDQ0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fTkFNRSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX0dVSUQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fT1dORURfUlVMRVMgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19JU19WSVNJQkxFID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fQ09OVEFJTkVSID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fUkVGRVJFTkNFID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19QUk9QRVJUWSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1BSRVNFTlRBVElPTiA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX0dSQVBIX0VMRU1FTlQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fRElBR1JBTSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIEluZm88L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fVFlQRV9JTkZPID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNpbXBsZSBTZW1hbnRpYyBNb2RlbCBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCA8ZW0+VU1BIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRSA9IDQ1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19OQU1FID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19HVUlEID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19PV05FRF9SVUxFUyA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fU1VQUFJFU1NFRCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX09SREVSSU5HX0dVSURFID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fSVNfVklTSUJMRSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fQ09OVEFJTkVSID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19SRUZFUkVOQ0UgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fUFJPUEVSVFkgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTiA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0gPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU07Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VU1BIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX0ZFQVRVUkVfQ09VTlQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZUltcGwgPGVtPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFID0gNDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19OQU1FID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fR1VJRCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19CUklFRl9ERVNDUklQVElPTiA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19PV05FRF9SVUxFUyA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19TVVBQUkVTU0VEID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX09SREVSSU5HX0dVSURFID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0lTX1ZJU0lCTEUgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19DT05UQUlORVIgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19SRUZFUkVOQ0UgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BST1BFUlRZID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9GRUFUVVJFX0NPVU5UID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTGVhZkVsZW1lbnRJbXBsIDxlbT5MZWFmIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTGVhZkVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TGVhZkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UID0gNDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fTkFNRSA9IERJQUdSQU1fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19HVUlEID0gRElBR1JBTV9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IERJQUdSQU1fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fT1dORURfUlVMRVMgPSBESUFHUkFNX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19TVVBQUkVTU0VEID0gRElBR1JBTV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IERJQUdSQU1fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fSVNfVklTSUJMRSA9IERJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19DT05UQUlORVIgPSBESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fUkVGRVJFTkNFID0gRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fUFJPUEVSVFkgPSBESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxlYWYgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRleHRFbGVtZW50SW1wbCA8ZW0+VGV4dCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRleHRFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRleHRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVCA9IDQ4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX05BTUUgPSBMRUFGX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fR1VJRCA9IExFQUZfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBMRUFGX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gTEVBRl9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IExFQUZfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IExFQUZfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBMRUFGX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX0lTX1ZJU0lCTEUgPSBMRUFGX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fQ09OVEFJTkVSID0gTEVBRl9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX1JFRkVSRU5DRSA9IExFQUZfRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX1BST1BFUlRZID0gTEVBRl9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19URVhUID0gTEVBRl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRleHQgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IExFQUZfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkltYWdlSW1wbCA8ZW0+SW1hZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuSW1hZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0SW1hZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSU1BR0UgPSA0OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX05BTUUgPSBMRUFGX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19HVUlEID0gTEVBRl9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gTEVBRl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX09XTkVEX1JVTEVTID0gTEVBRl9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTEVBRl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX1NVUFBSRVNTRUQgPSBMRUFGX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fT1JERVJJTkdfR1VJREUgPSBMRUFGX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fSVNfVklTSUJMRSA9IExFQUZfRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX0NPTlRBSU5FUiA9IExFQUZfRUxFTUVOVF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX1JFRkVSRU5DRSA9IExFQUZfRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fUFJPUEVSVFkgPSBMRUFGX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVyaTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19VUkkgPSBMRUFGX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWltZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX01JTUVfVFlQRSA9IExFQUZfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JbWFnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9GRUFUVVJFX0NPVU5UID0gTEVBRl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhpY1ByaW1pdGl2ZUltcGwgPGVtPkdyYXBoaWMgUHJpbWl0aXZlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoaWNQcmltaXRpdmVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3JhcGhpY1ByaW1pdGl2ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRSA9IDUwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fTkFNRSA9IExFQUZfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX0dVSUQgPSBMRUFGX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBMRUFGX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fT1dORURfUlVMRVMgPSBMRUFGX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBMRUFGX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fU1VQUFJFU1NFRCA9IExFQUZfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBISUNfUFJJTUlUSVZFX19PUkRFUklOR19HVUlERSA9IExFQUZfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBISUNfUFJJTUlUSVZFX19JU19WSVNJQkxFID0gTEVBRl9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fQ09OVEFJTkVSID0gTEVBRl9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fUkVGRVJFTkNFID0gTEVBRl9FTEVNRU5UX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBISUNfUFJJTUlUSVZFX19QUk9QRVJUWSA9IExFQUZfRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3JhcGhpYyBQcmltaXRpdmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfRkVBVFVSRV9DT1VOVCA9IExFQUZfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvbHlsaW5lSW1wbCA8ZW0+UG9seWxpbmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUG9seWxpbmVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UG9seWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkUgPSA1MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX05BTUUgPSBHUkFQSElDX1BSSU1JVElWRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX0dVSUQgPSBHUkFQSElDX1BSSU1JVElWRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19CUklFRl9ERVNDUklQVElPTiA9IEdSQVBISUNfUFJJTUlUSVZFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX09XTkVEX1JVTEVTID0gR1JBUEhJQ19QUklNSVRJVkVfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHUkFQSElDX1BSSU1JVElWRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19TVVBQUkVTU0VEID0gR1JBUEhJQ19QUklNSVRJVkVfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fT1JERVJJTkdfR1VJREUgPSBHUkFQSElDX1BSSU1JVElWRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19JU19WSVNJQkxFID0gR1JBUEhJQ19QUklNSVRJVkVfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19DT05UQUlORVIgPSBHUkFQSElDX1BSSU1JVElWRV9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX1JFRkVSRU5DRSA9IEdSQVBISUNfUFJJTUlUSVZFX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19QUk9QRVJUWSA9IEdSQVBISUNfUFJJTUlUSVZFX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbG9zZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fQ0xPU0VEID0gR1JBUEhJQ19QUklNSVRJVkVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2F5cG9pbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fV0FZUE9JTlRTID0gR1JBUEhJQ19QUklNSVRJVkVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UG9seWxpbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfRkVBVFVSRV9DT1VOVCA9IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxsaXBzZUltcGwgPGVtPkVsbGlwc2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxsaXBzZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFbGxpcHNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVMTElQU0UgPSA1MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fTkFNRSA9IEdSQVBISUNfUFJJTUlUSVZFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19HVUlEID0gR1JBUEhJQ19QUklNSVRJVkVfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19CUklFRl9ERVNDUklQVElPTiA9IEdSQVBISUNfUFJJTUlUSVZFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fT1dORURfUlVMRVMgPSBHUkFQSElDX1BSSU1JVElWRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1JBUEhJQ19QUklNSVRJVkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19TVVBQUkVTU0VEID0gR1JBUEhJQ19QUklNSVRJVkVfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19PUkRFUklOR19HVUlERSA9IEdSQVBISUNfUFJJTUlUSVZFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fSVNfVklTSUJMRSA9IEdSQVBISUNfUFJJTUlUSVZFX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19DT05UQUlORVIgPSBHUkFQSElDX1BSSU1JVElWRV9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fUkVGRVJFTkNFID0gR1JBUEhJQ19QUklNSVRJVkVfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fUFJPUEVSVFkgPSBHUkFQSElDX1BSSU1JVElWRV9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFkaXVzIFg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19SQURJVVNfWCA9IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhZGl1cyBZPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fUkFESVVTX1kgPSBHUkFQSElDX1BSSU1JVElWRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX1JPVEFUSU9OID0gR1JBUEhJQ19QUklNSVRJVkVfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgQW5nbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19TVEFSVF9BTkdMRSA9IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuZCBBbmdsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX0VORF9BTkdMRSA9IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNlbnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX0NFTlRFUiA9IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVsbGlwc2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9GRUFUVVJFX0NPVU5UID0gR1JBUEhJQ19QUklNSVRJVkVfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGwgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlQgPSA2MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19OQU1FID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19HVUlEID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19PV05FRF9SVUxFUyA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19TSEFQRUlDT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX05PREVJQ09OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsIDxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlQgPSA1NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19HVUlEID0gUFJPQ0VTU19FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gUFJPQ0VTU19FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBQUk9DRVNTX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gUFJPQ0VTU19FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTiA9IFBST0NFU1NfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OID0gUFJPQ0VTU19FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVIgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UID0gNTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1VJRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVggPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORyA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1IgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsIDxlbT5BY3Rpdml0eTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBQ1RJVklUWSA9IDUzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fTkFNRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19HVUlEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fT1dORURfUlVMRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19TVVBQUkVTU0VEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19PUkRFUklOR19HVUlERSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRVNFTlRBVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fU0hBUEVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX05PREVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRUZJWCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0lTX1BMQU5ORUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfT1BUSU9OQUwgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFU0VOVEVEX0FGVEVSID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFU0VOVEVEX0JFRk9SRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QTEFOTklOR19EQVRBID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1NVUEVSX0FDVElWSVRJRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfUkVQRUFUQUJMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19JU19PTkdPSU5HID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfRVZFTlRfRFJJVkVOID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19MSU5LX1RPX1BSRURFQ0VTU09SID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRUNPTkRJVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QT1NUQ09ORElUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUk9BRE1BUFMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19DSEVDS0xJU1RTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0NPTkNFUFRTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0VYQU1QTEVTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fR1VJREVMSU5FUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19JU19FTkFDVEFCTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BY3Rpdml0eTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9GRUFUVVJFX0NPVU5UID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NaWxlc3RvbmVJbXBsIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWlsZXN0b25lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1pbGVzdG9uZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNSUxFU1RPTkUgPSA1NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19HVUlEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19PV05FRF9SVUxFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fU1VQUFJFU1NFRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX09SREVSSU5HX0dVSURFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVTRU5UQVRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19TSEFQRUlDT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX05PREVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVGSVggPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfUExBTk5FRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lTX09QVElPTkFMID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVTRU5URURfQUZURVIgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fUFJFU0VOVEVEX0JFRk9SRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fUExBTk5JTkdfREFUQSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fU1VQRVJfQUNUSVZJVElFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfUkVQRUFUQUJMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfT05HT0lORyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19JU19FVkVOVF9EUklWRU4gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluayBUbyBQcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19MSU5LX1RPX1BSRURFQ0VTU09SID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NaWxlc3RvbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuSXRlcmF0aW9uSW1wbCA8ZW0+SXRlcmF0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkl0ZXJhdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRJdGVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OID0gNTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fTkFNRSA9IEFDVElWSVRZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0dVSUQgPSBBQ1RJVklUWV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBBQ1RJVklUWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fT1dORURfUlVMRVMgPSBBQ1RJVklUWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBBQ1RJVklUWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fU1VQUFJFU1NFRCA9IEFDVElWSVRZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19PUkRFUklOR19HVUlERSA9IEFDVElWSVRZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QUkVTRU5UQVRJT04gPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fU0hBUEVJQ09OID0gQUNUSVZJVFlfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fTk9ERUlDT04gPSBBQ1RJVklUWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QUkVGSVggPSBBQ1RJVklUWV9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0lTX1BMQU5ORUQgPSBBQ1RJVklUWV9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEFDVElWSVRZX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0lTX09QVElPTkFMID0gQUNUSVZJVFlfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFU0VOVEVEX0FGVEVSID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QUkVTRU5URURfQkVGT1JFID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUExBTk5JTkdfREFUQSA9IEFDVElWSVRZX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1NVUEVSX0FDVElWSVRJRVMgPSBBQ1RJVklUWV9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19SRVBFQVRBQkxFID0gQUNUSVZJVFlfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfT05HT0lORyA9IEFDVElWSVRZX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfRVZFTlRfRFJJVkVOID0gQUNUSVZJVFlfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIFRvIFByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0xJTktfVE9fUFJFREVDRVNTT1IgPSBBQ1RJVklUWV9fTElOS19UT19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19WQVJJQUJJTElUWV9UWVBFID0gQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFQ09ORElUSU9OID0gQUNUSVZJVFlfX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QT1NUQ09ORElUSU9OID0gQUNUSVZJVFlfX1BPU1RDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0JSRUFLRE9XTl9FTEVNRU5UUyA9IEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUk9BRE1BUFMgPSBBQ1RJVklUWV9fUk9BRE1BUFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBBQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19DSEVDS0xJU1RTID0gQUNUSVZJVFlfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fQ09OQ0VQVFMgPSBBQ1RJVklUWV9fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fRVhBTVBMRVMgPSBBQ1RJVklUWV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19HVUlERUxJTkVTID0gQUNUSVZJVFlfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1JFVVNBQkxFX0FTU0VUUyA9IEFDVElWSVRZX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRW5hY3RhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19FTkFDVEFCTEUgPSBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkl0ZXJhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fRkVBVFVSRV9DT1VOVCA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGhhc2VJbXBsIDxlbT5QaGFzZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QaGFzZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQaGFzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQSEFTRSA9IDU4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fTkFNRSA9IEFDVElWSVRZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fR1VJRCA9IEFDVElWSVRZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fT1dORURfUlVMRVMgPSBBQ1RJVklUWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEFDVElWSVRZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1NVUFBSRVNTRUQgPSBBQ1RJVklUWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19PUkRFUklOR19HVUlERSA9IEFDVElWSVRZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVTRU5UQVRJT05fTkFNRSA9IEFDVElWSVRZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUFJFU0VOVEFUSU9OID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fU0hBUEVJQ09OID0gQUNUSVZJVFlfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19OT0RFSUNPTiA9IEFDVElWSVRZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUFJFRklYID0gQUNUSVZJVFlfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lTX1BMQU5ORUQgPSBBQ1RJVklUWV9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQUNUSVZJVFlfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19JU19PUFRJT05BTCA9IEFDVElWSVRZX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUFJFU0VOVEVEX0FGVEVSID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRVNFTlRFRF9CRUZPUkUgPSBBQ1RJVklUWV9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BMQU5OSU5HX0RBVEEgPSBBQ1RJVklUWV9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1NVUEVSX0FDVElWSVRJRVMgPSBBQ1RJVklUWV9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lTX1JFUEVBVEFCTEUgPSBBQ1RJVklUWV9fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lTX09OR09JTkcgPSBBQ1RJVklUWV9fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfRVZFTlRfRFJJVkVOID0gQUNUSVZJVFlfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIFRvIFByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fTElOS19UT19QUkVERUNFU1NPUiA9IEFDVElWSVRZX19MSU5LX1RPX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fVkFSSUFCSUxJVFlfVFlQRSA9IEFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVDT05ESVRJT04gPSBBQ1RJVklUWV9fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUE9TVENPTkRJVElPTiA9IEFDVElWSVRZX19QT1NUQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0JSRUFLRE9XTl9FTEVNRU5UUyA9IEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19ST0FETUFQUyA9IEFDVElWSVRZX19ST0FETUFQUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19DSEVDS0xJU1RTID0gQUNUSVZJVFlfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19DT05DRVBUUyA9IEFDVElWSVRZX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0VYQU1QTEVTID0gQUNUSVZJVFlfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19HVUlERUxJTkVTID0gQUNUSVZJVFlfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUkVVU0FCTEVfQVNTRVRTID0gQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfRU5BQ1RBQkxFID0gQUNUSVZJVFlfX0lTX0VOQUNUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QaGFzZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9GRUFUVVJFX0NPVU5UID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwgPGVtPlRlYW0gUHJvZmlsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZWFtUHJvZmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEUgPSA1OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fR1VJRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19CUklFRl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19PV05FRF9SVUxFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TVVBQUkVTU0VEID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1BSRVNFTlRBVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TSEFQRUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19OT0RFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1BSRUZJWCA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fSVNfUExBTk5FRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fSVNfT1BUSU9OQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5URURfQUZURVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1BSRVNFTlRFRF9CRUZPUkUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QTEFOTklOR19EQVRBID0gQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fU1VQRVJfQUNUSVZJVElFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlYW0gUm9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fVEVBTV9ST0xFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIFRlYW08L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0gPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWIgVGVhbTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TVUJfVEVBTSA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRlYW0gUHJvZmlsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpcHRvckltcGwgPGVtPkRlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFU0NSSVBUT1IgPSA2NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19HVUlEID0gQlJFQUtET1dOX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fT1dORURfUlVMRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19TVVBQUkVTU0VEID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fU0hBUEVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX05PREVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BSRUZJWCA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0lTX1BMQU5ORUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QTEFOTklOR19EQVRBID0gQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRJRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsIDxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SID0gNjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fTkFNRSA9IERFU0NSSVBUT1JfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fR1VJRCA9IERFU0NSSVBUT1JfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0JSSUVGX0RFU0NSSVBUSU9OID0gREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fT1dORURfUlVMRVMgPSBERVNDUklQVE9SX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1NVUFBSRVNTRUQgPSBERVNDUklQVE9SX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19PUkRFUklOR19HVUlERSA9IERFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRSA9IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OID0gREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fU0hBUEVJQ09OID0gREVTQ1JJUFRPUl9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19OT0RFSUNPTiA9IERFU0NSSVBUT1JfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUFJFRklYID0gREVTQ1JJUFRPUl9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0lTX1BMQU5ORUQgPSBERVNDUklQVE9SX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19JU19PUFRJT05BTCA9IERFU0NSSVBUT1JfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkUgPSBERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEEgPSBERVNDUklQVE9SX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRJRVMgPSBERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1JPTEUgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZGlmaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX01PRElGSUVTID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya09yZGVySW1wbCA8ZW0+V29yayBPcmRlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya09yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfT1JERVIgPSA2MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fTkFNRSA9IFBST0NFU1NfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fR1VJRCA9IFBST0NFU1NfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fT1dORURfUlVMRVMgPSBQUk9DRVNTX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBST0NFU1NfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX1NVUFBSRVNTRUQgPSBQUk9DRVNTX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fUFJFU0VOVEFUSU9OID0gUFJPQ0VTU19FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fU0hBUEVJQ09OID0gUFJPQ0VTU19FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19OT0RFSUNPTiA9IFBST0NFU1NfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluayBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fTElOS19UWVBFID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19QUkVEID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgT3JkZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbCA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEEgPSA2MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fTkFNRSA9IFBST0NFU1NfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fR1VJRCA9IFBST0NFU1NfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fT1dORURfUlVMRVMgPSBQUk9DRVNTX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBST0NFU1NfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX1NVUFBSRVNTRUQgPSBQUk9DRVNTX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fUFJFU0VOVEFUSU9OID0gUFJPQ0VTU19FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fU0hBUEVJQ09OID0gUFJPQ0VTU19FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19OT0RFSUNPTiA9IFBST0NFU1NfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEUgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19GSU5JU0hfREFURSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fUkFOSyA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCA8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUiA9IDY2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUiA9IDY1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTkFNRSA9IERFU0NSSVBUT1JfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HVUlEID0gREVTQ1JJUFRPUl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTiA9IERFU0NSSVBUT1JfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1dORURfUlVMRVMgPSBERVNDUklQVE9SX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19TVVBQUkVTU0VEID0gREVTQ1JJUFRPUl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PUkRFUklOR19HVUlERSA9IERFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTiA9IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fU0hBUEVJQ09OID0gREVTQ1JJUFRPUl9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX05PREVJQ09OID0gREVTQ1JJUFRPUl9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1BSRUZJWCA9IERFU0NSSVBUT1JfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lTX1BMQU5ORUQgPSBERVNDUklQVE9SX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUwgPSBERVNDUklQVE9SX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRSA9IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19QTEFOTklOR19EQVRBID0gREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRJRVMgPSBERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEUgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURSA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVCA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0ZWQgQnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWSA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFMgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlbGl2ZXJhYmxlIFBhcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFMgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX05BTUUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0dVSUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX09XTkVEX1JVTEVTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19TVVBQUkVTU0VEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1NIQVBFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fTk9ERUlDT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BSRUZJWCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19QTEFOTkVEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUwgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QTEFOTklOR19EQVRBID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUSUVTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19SRVBFQVRBQkxFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19PTkdPSU5HID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lTX0VWRU5UX0RSSVZFTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIFRvIFByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0xJTktfVE9fUFJFREVDRVNTT1IgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXNrPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19UQVNLID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2lzdGVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWwgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19PVVRQVVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlbGVjdGVkIFN0ZXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1NFTEVDVEVEX1NURVBTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsIDxlbT5Db21wb3NpdGUgUm9sZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbXBvc2l0ZVJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEUgPSA2NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX05BTUUgPSBST0xFX0RFU0NSSVBUT1JfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19HVUlEID0gUk9MRV9ERVNDUklQVE9SX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gUk9MRV9ERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX09XTkVEX1JVTEVTID0gUk9MRV9ERVNDUklQVE9SX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUk9MRV9ERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1NVUFBSRVNTRUQgPSBST0xFX0RFU0NSSVBUT1JfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fT1JERVJJTkdfR1VJREUgPSBST0xFX0RFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRVNFTlRBVElPTl9OQU1FID0gUk9MRV9ERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUFJFU0VOVEFUSU9OID0gUk9MRV9ERVNDUklQVE9SX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1NIQVBFSUNPTiA9IFJPTEVfREVTQ1JJUFRPUl9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX05PREVJQ09OID0gUk9MRV9ERVNDUklQVE9SX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUFJFRklYID0gUk9MRV9ERVNDUklQVE9SX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19JU19QTEFOTkVEID0gUk9MRV9ERVNDUklQVE9SX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBST0xFX0RFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19JU19PUFRJT05BTCA9IFJPTEVfREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRVNFTlRFRF9BRlRFUiA9IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUFJFU0VOVEVEX0JFRk9SRSA9IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BMQU5OSU5HX0RBVEEgPSBST0xFX0RFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19TVVBFUl9BQ1RJVklUSUVTID0gUk9MRV9ERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBST0xFX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1JPTEUgPSBST0xFX0RFU0NSSVBUT1JfX1JPTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW9kaWZpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19NT0RJRklFUyA9IFJPTEVfREVTQ1JJUFRPUl9fTU9ESUZJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUkVTUE9OU0lCTEVfRk9SID0gUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWdncmVnYXRlZCBSb2xlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRVMgPSBST0xFX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfRkVBVFVSRV9DT1VOVCA9IFJPTEVfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwgPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT04gPSA2ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fR1VJRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCA8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OID0gNjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19HVUlEID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQVVUSE9SUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fVkVSU0lPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fU0VDVElPTlMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhvd3RvIFN0YWZmPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCA8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT04gPSA3MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fTkFNRSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19HVUlEID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQVVUSE9SUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fVkVSU0lPTiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fU0VDVElPTlMgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ib3d0byBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY29wZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgTm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTiA9IDcwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19OQU1FID0gUFJPQ0VTU19ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fR1VJRCA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gUFJPQ0VTU19ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gUFJPQ0VTU19ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gUFJPQ0VTU19ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFVSUE9TRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1BVUlBPU0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhvd3RvIFN0YWZmPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fSE9XVE9fU1RBRkYgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIE5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVMgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2FsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SaXNrIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTCA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGluZyBUZWNobmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIE9mIENvbnRyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVCA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCA8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT04gPSA3MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19HVUlEID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQVVUSE9SUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fVkVSU0lPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fU0VDVElPTlMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmluZWQgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbmNlcHRJbXBsIDxlbT5Db25jZXB0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbmNlcHRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29uY2VwdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT05DRVBUID0gNzM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fR1VJRCA9IEdVSURBTkNFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBHVUlEQU5DRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19DSEVDS0xJU1RTID0gR1VJREFOQ0VfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19FWEFNUExFUyA9IEdVSURBTkNFX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0FTU0VUUyA9IEdVSURBTkNFX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29uY2VwdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNoZWNrbGlzdEltcGwgPGVtPkNoZWNrbGlzdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DaGVja2xpc3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q2hlY2tsaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENIRUNLTElTVCA9IDc0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19HVUlEID0gR1VJREFOQ0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19DSEVDS0xJU1RTID0gR1VJREFOQ0VfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19HVUlERUxJTkVTID0gR1VJREFOQ0VfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0FTU0VUUyA9IEdVSURBTkNFX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2hlY2tsaXN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FeGFtcGxlSW1wbCA8ZW0+RXhhbXBsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FeGFtcGxlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEV4YW1wbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVhBTVBMRSA9IDc1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0dVSUQgPSBHVUlEQU5DRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0dVSURFTElORVMgPSBHVUlEQU5DRV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkZWxpbmVJbXBsIDxlbT5HdWlkZWxpbmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGVsaW5lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEd1aWRlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBHVUlERUxJTkUgPSA3NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fR1VJRCA9IEdVSURBTkNFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IEdVSURBTkNFX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0VYQU1QTEVTID0gR1VJREFOQ0VfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkd1aWRlbGluZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbCA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSA4NDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlcG9ydEltcGwgPGVtPlJlcG9ydDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZXBvcnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UmVwb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFUE9SVCA9IDc3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19HVUlEID0gR1VJREFOQ0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19DSEVDS0xJU1RTID0gR1VJREFOQ0VfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19HVUlERUxJTkVTID0gR1VJREFOQ0VfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0FTU0VUUyA9IEdVSURBTkNFX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVwb3J0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZW1wbGF0ZUltcGwgPGVtPlRlbXBsYXRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlbXBsYXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRlbXBsYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRFTVBMQVRFID0gNzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19HVUlEID0gR1VJREFOQ0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBHVUlEQU5DRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19HVUlERUxJTkVTID0gR1VJREFOQ0VfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19FWEFNUExFUyA9IEdVSURBTkNFX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRlbXBsYXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN1cHBvcnRpbmdNYXRlcmlhbEltcGwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3VwcG9ydGluZ01hdGVyaWFsSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFN1cHBvcnRpbmdNYXRlcmlhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMID0gNzk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fR1VJRCA9IEdVSURBTkNFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBHVUlEQU5DRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19DSEVDS0xJU1RTID0gR1VJREFOQ0VfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19FWEFNUExFUyA9IEdVSURBTkNFX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0FTU0VUUyA9IEdVSURBTkNFX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRvb2xNZW50b3JJbXBsIDxlbT5Ub29sIE1lbnRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Ub29sTWVudG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRvb2xNZW50b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1IgPSA4MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0dVSUQgPSBHVUlEQU5DRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IEdVSURBTkNFX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19DSEVDS0xJU1RTID0gR1VJREFOQ0VfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0dVSURFTElORVMgPSBHVUlEQU5DRV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0VYQU1QTEVTID0gR1VJREFOQ0VfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0FTU0VUUyA9IEdVSURBTkNFX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VG9vbCBNZW50b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV2hpdGVwYXBlckltcGwgPGVtPldoaXRlcGFwZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV2hpdGVwYXBlckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXaGl0ZXBhcGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdISVRFUEFQRVIgPSA4MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fTkFNRSA9IENPTkNFUFRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0dVSUQgPSBDT05DRVBUX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05DRVBUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fT1dORURfUlVMRVMgPSBDT05DRVBUX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05DRVBUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fU1VQUFJFU1NFRCA9IENPTkNFUFRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19PUkRFUklOR19HVUlERSA9IENPTkNFUFRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05DRVBUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19QUkVTRU5UQVRJT04gPSBDT05DRVBUX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fU0hBUEVJQ09OID0gQ09OQ0VQVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fTk9ERUlDT04gPSBDT05DRVBUX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTkNFUFRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05DRVBUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTkNFUFRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBDT05DRVBUX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0NIRUNLTElTVFMgPSBDT05DRVBUX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0dVSURFTElORVMgPSBDT05DRVBUX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19FWEFNUExFUyA9IENPTkNFUFRfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fQVNTRVRTID0gQ09OQ0VQVF9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldoaXRlcGFwZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9GRUFUVVJFX0NPVU5UID0gQ09OQ0VQVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlcm1EZWZpbml0aW9uSW1wbCA8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlcm1EZWZpbml0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRlcm1EZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTiA9IDgyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19HVUlEID0gR1VJREFOQ0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19DSEVDS0xJU1RTID0gR1VJREFOQ0VfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19HVUlERUxJTkVTID0gR1VJREFOQ0VfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0FTU0VUUyA9IEdVSURBTkNFX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZUltcGwgPGVtPlByYWN0aWNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByYWN0aWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBSQUNUSUNFID0gODM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19HVUlEID0gR1VJREFOQ0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBHVUlEQU5DRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19HVUlERUxJTkVTID0gR1VJREFOQ0VfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19FWEFNUExFUyA9IEdVSURBTkNFX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBQcmFjdGljZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19TVUJfUFJBQ1RJQ0VTID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudCBSZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0VTID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZpdHkgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVMgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QcmFjdGljZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZXVzYWJsZUFzc2V0SW1wbCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmV1c2FibGVBc3NldEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSZXVzYWJsZUFzc2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUID0gODU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5WZXJ0ZXhJbXBsIDxlbT5WZXJ0ZXg8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVmVydGV4SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFZlcnRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBWRVJURVggPSA4NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0YXRlSW1wbCA8ZW0+U3RhdGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RhdGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU1RBVEUgPSA4NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlZ2lvbkltcGwgPGVtPlJlZ2lvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZWdpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UmVnaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFR0lPTiA9IDg4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RhdGVNYWNoaW5lSW1wbCA8ZW0+U3RhdGUgTWFjaGluZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdGF0ZU1hY2hpbmVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3RhdGVNYWNoaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNUQVRFX01BQ0hJTkUgPSA4OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRyYW5zaXRpb25JbXBsIDxlbT5UcmFuc2l0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRyYW5zaXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VHJhbnNpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUUkFOU0lUSU9OID0gOTA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qc2V1ZG9TdGF0ZUltcGwgPGVtPlBzZXVkbyBTdGF0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qc2V1ZG9TdGF0ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQc2V1ZG9TdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQU0VVRE9fU1RBVEUgPSA5MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRDYXRlZ29yeUltcGwgPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudENhdGVnb3J5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRDYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZID0gOTM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbCA8ZW0+RGlzY2lwbGluZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpc2NpcGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORSA9IDkyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEltcGwgPGVtPlJvbGUgU2V0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVTZXRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZVNldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xFX1NFVCA9IDk0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRG9tYWluSW1wbCA8ZW0+RG9tYWluPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRvbWFpbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREb21haW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRE9NQUlOID0gOTU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFID0gOTY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsIDxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVHcm91cGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaXNjaXBsaW5lR3JvdXBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElORyA9IDk3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbEltcGwgPGVtPlRvb2w8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUb29sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRPT0wgPSA5ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVTZXRHcm91cGluZ0ltcGwgPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVTZXRHcm91cGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlU2V0R3JvdXBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkcgPSA5OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkN1c3RvbUNhdGVnb3J5SW1wbCA8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkN1c3RvbUNhdGVnb3J5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEN1c3RvbUNhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWSA9IDEwMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NJbXBsIDxlbT5Qcm9jZXNzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTID0gMTAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbCA8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1MgPSAxMDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGwgPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDYXBhYmlsaXR5UGF0dGVybigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk4gPSAxMDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwgPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURSA9IDEwNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvYWRtYXBJbXBsIDxlbT5Sb2FkbWFwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvYWRtYXBJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9hZG1hcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0FETUFQID0gMTA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsIDxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc1BhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFID0gMTA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwgPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVCA9IDEwNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRSA9IDEwODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySW1wbCA8ZW0+UHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SID0gMTA5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbCA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU4gPSAxMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fR1VJRCA9IEdVSURBTkNFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBHVUlEQU5DRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19DSEVDS0xJU1RTID0gR1VJREFOQ0VfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19FWEFNUExFUyA9IEdVSURBTkNFX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0FTU0VUUyA9IEdVSURBTkNFX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0dVSUQgPSBHVUlEQU5DRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IEdVSURBTkNFX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19DSEVDS0xJU1RTID0gR1VJREFOQ0VfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0dVSURFTElORVMgPSBHVUlEQU5DRV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0VYQU1QTEVTID0gR1VJREFOQ0VfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0FTU0VUUyA9IEdVSURBTkNFX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWRVJURVhfX0NPTlRBSU5FUiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmc8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZFUlRFWF9fT1VUR09JTkcgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWRVJURVhfX0lOQ09NSU5HID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5WZXJ0ZXg8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkVSVEVYX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEFURV9fQ09OVEFJTkVSID0gVkVSVEVYX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmc8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNUQVRFX19PVVRHT0lORyA9IFZFUlRFWF9fT1VUR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmc8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNUQVRFX19JTkNPTUlORyA9IFZFUlRFWF9fSU5DT01JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEFURV9fV09SS19QUk9EVUNUID0gVkVSVEVYX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZ2lvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RBVEVfX1JFR0lPTiA9IFZFUlRFWF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWJtYWNoaW5lPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RBVEVfX1NVQk1BQ0hJTkUgPSBWRVJURVhfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U3RhdGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RBVEVfRkVBVFVSRV9DT1VOVCA9IFZFUlRFWF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJ0ZXg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFR0lPTl9fVkVSVEVYID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc2l0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUdJT05fX1RSQU5TSVRJT04gPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXRlPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFR0lPTl9fU1RBVEUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXRlIE1hY2hpbmU8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVHSU9OX19TVEFURV9NQUNISU5FID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZWdpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVHSU9OX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEFURV9NQUNISU5FX19OQU1FID0gV09SS19ERUZJTklUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEFURV9NQUNISU5FX19HVUlEID0gV09SS19ERUZJTklUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RBVEVfTUFDSElORV9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX0RFRklOSVRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEFURV9NQUNISU5FX19PV05FRF9SVUxFUyA9IFdPUktfREVGSU5JVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNUQVRFX01BQ0hJTkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19ERUZJTklUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RBVEVfTUFDSElORV9fU1VQUFJFU1NFRCA9IFdPUktfREVGSU5JVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNUQVRFX01BQ0hJTkVfX09SREVSSU5HX0dVSURFID0gV09SS19ERUZJTklUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEFURV9NQUNISU5FX19QUkVDT05ESVRJT04gPSBXT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RBVEVfTUFDSElORV9fUE9TVENPTkRJVElPTiA9IFdPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWdpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNUQVRFX01BQ0hJTkVfX1JFR0lPTiA9IFdPUktfREVGSU5JVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TdGF0ZSBNYWNoaW5lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNUQVRFX01BQ0hJTkVfRkVBVFVSRV9DT1VOVCA9IFdPUktfREVGSU5JVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrIERlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRSQU5TSVRJT05fX1dPUktfREVGSU5JVElPTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRSQU5TSVRJT05fX0NPTlRBSU5FUiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U291cmNlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVFJBTlNJVElPTl9fU09VUkNFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUUkFOU0lUSU9OX19UQVJHRVQgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRyYW5zaXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVFJBTlNJVElPTl9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFNFVURPX1NUQVRFX19DT05UQUlORVIgPSBWRVJURVhfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZzwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFNFVURPX1NUQVRFX19PVVRHT0lORyA9IFZFUlRFWF9fT1VUR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmc8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBTRVVET19TVEFURV9fSU5DT01JTkcgPSBWRVJURVhfX0lOQ09NSU5HOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBzZXVkbyBTdGF0ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQU0VVRE9fU1RBVEVfRkVBVFVSRV9DT1VOVCA9IFZFUlRFWF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fR1VJRCA9IENPTlRFTlRfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRVMgPSBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVFMgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FUyA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRVMgPSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fQVNTRVRTID0gQ09OVEVOVF9FTEVNRU5UX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19HVUlEID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19DSEVDS0xJU1RTID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19HVUlERUxJTkVTID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fRVhBTVBMRVMgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0FTU0VUUyA9IENPTlRFTlRfQ0FURUdPUllfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXNrczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fVEFTS1MgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YmRpc2NpcGxpbmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1NVQkRJU0NJUExJTkUgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBXb3JrZmxvd3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1MgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpc2NpcGxpbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fR1VJRCA9IENPTlRFTlRfQ0FURUdPUllfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19DSEVDS0xJU1RTID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fR1VJREVMSU5FUyA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19FWEFNUExFUyA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0FTU0VUUyA9IENPTlRFTlRfQ0FURUdPUllfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2xlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1JPTEVTID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIFNldDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19HVUlEID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19PV05FRF9SVUxFUyA9IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fQ0hFQ0tMSVNUUyA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19HVUlERUxJTkVTID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19FWEFNUExFUyA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19BU1NFVFMgPSBDT05URU5UX0NBVEVHT1JZX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19XT1JLX1BST0RVQ1RTID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWJkb21haW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1NVQkRPTUFJTlMgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRvbWFpbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0dVSUQgPSBDT05URU5UX0NBVEVHT1JZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19PV05FRF9SVUxFUyA9IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fQ0hFQ0tMSVNUUyA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0dVSURFTElORVMgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fRVhBTVBMRVMgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19BU1NFVFMgPSBDT05URU5UX0NBVEVHT1JZX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFMgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fR1VJRCA9IENPTlRFTlRfQ0FURUdPUllfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19PV05FRF9SVUxFUyA9IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19TVVBQUkVTU0VEID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fQ0hFQ0tMSVNUUyA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fR1VJREVMSU5FUyA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0VYQU1QTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19BU1NFVFMgPSBDT05URU5UX0NBVEVHT1JZX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzY2lwbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkVTID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19HVUlEID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19DSEVDS0xJU1RTID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19HVUlERUxJTkVTID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fRVhBTVBMRVMgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0FTU0VUUyA9IENPTlRFTlRfQ0FURUdPUllfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1RPT0xfTUVOVE9SUyA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VG9vbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19HVUlEID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fT1dORURfUlVMRVMgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19TVVBQUkVTU0VEID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0NIRUNLTElTVFMgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19HVUlERUxJTkVTID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0VYQU1QTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fQVNTRVRTID0gQ09OVEVOVF9DQVRFR09SWV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGUgU2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUyA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fR1VJRCA9IENPTlRFTlRfQ0FURUdPUllfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fT1dORURfUlVMRVMgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0NIRUNLTElTVFMgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fR1VJREVMSU5FUyA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fRVhBTVBMRVMgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fQVNTRVRTID0gQ09OVEVOVF9DQVRFR09SWV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGVnb3JpemVkIEVsZW1lbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlRTID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWIgQ2F0ZWdvcmllczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUyA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fTkFNRSA9IEFDVElWSVRZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19HVUlEID0gQUNUSVZJVFlfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19CUklFRl9ERVNDUklQVElPTiA9IEFDVElWSVRZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fT1dORURfUlVMRVMgPSBBQ1RJVklUWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQUNUSVZJVFlfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19TVVBQUkVTU0VEID0gQUNUSVZJVFlfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19PUkRFUklOR19HVUlERSA9IEFDVElWSVRZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRVNFTlRBVElPTl9OQU1FID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRVNFTlRBVElPTiA9IEFDVElWSVRZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fU0hBUEVJQ09OID0gQUNUSVZJVFlfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX05PREVJQ09OID0gQUNUSVZJVFlfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRUZJWCA9IEFDVElWSVRZX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX1BMQU5ORUQgPSBBQ1RJVklUWV9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBBQ1RJVklUWV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSVNfT1BUSU9OQUwgPSBBQ1RJVklUWV9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFU0VOVEVEX0FGVEVSID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRSA9IEFDVElWSVRZX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QTEFOTklOR19EQVRBID0gQUNUSVZJVFlfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1NVUEVSX0FDVElWSVRJRVMgPSBBQ1RJVklUWV9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSVNfUkVQRUFUQUJMRSA9IEFDVElWSVRZX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19PTkdPSU5HID0gQUNUSVZJVFlfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOID0gQUNUSVZJVFlfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIFRvIFByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19MSU5LX1RPX1BSRURFQ0VTU09SID0gQUNUSVZJVFlfX0xJTktfVE9fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1ZBUklBQklMSVRZX1RZUEUgPSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRUNPTkRJVElPTiA9IEFDVElWSVRZX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BPU1RDT05ESVRJT04gPSBBQ1RJVklUWV9fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0JSRUFLRE9XTl9FTEVNRU5UUyA9IEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1JPQURNQVBTID0gQUNUSVZJVFlfX1JPQURNQVBTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19DSEVDS0xJU1RTID0gQUNUSVZJVFlfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0NPTkNFUFRTID0gQUNUSVZJVFlfX0NPTkNFUFRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19FWEFNUExFUyA9IEFDVElWSVRZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19HVUlERUxJTkVTID0gQUNUSVZJVFlfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19SRVVTQUJMRV9BU1NFVFMgPSBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX0VOQUNUQUJMRSA9IEFDVElWSVRZX19JU19FTkFDVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZXMgUGF0dGVybnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBDb250ZXh0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fREVGQVVMVF9DT05URVhUID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fVkFMSURfQ09OVEVYVCA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GRUFUVVJFX0NPVU5UID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX05BTUUgPSBQUk9DRVNTX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19HVUlEID0gUFJPQ0VTU19fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX09XTkVEX1JVTEVTID0gUFJPQ0VTU19fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1NVUFBSRVNTRUQgPSBQUk9DRVNTX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFU0VOVEFUSU9OID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1NIQVBFSUNPTiA9IFBST0NFU1NfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX05PREVJQ09OID0gUFJPQ0VTU19fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFRklYID0gUFJPQ0VTU19fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19QTEFOTkVEID0gUFJPQ0VTU19fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBQUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19PUFRJT05BTCA9IFBST0NFU1NfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BSRVNFTlRFRF9BRlRFUiA9IFBST0NFU1NfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRSA9IFBST0NFU1NfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BMQU5OSU5HX0RBVEEgPSBQUk9DRVNTX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19TVVBFUl9BQ1RJVklUSUVTID0gUFJPQ0VTU19fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSVNfUkVQRUFUQUJMRSA9IFBST0NFU1NfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0lTX09OR09JTkcgPSBQUk9DRVNTX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0lTX0VWRU5UX0RSSVZFTiA9IFBST0NFU1NfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIFRvIFByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19MSU5LX1RPX1BSRURFQ0VTU09SID0gUFJPQ0VTU19fTElOS19UT19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fVkFSSUFCSUxJVFlfVFlQRSA9IFBST0NFU1NfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BSRUNPTkRJVElPTiA9IFBST0NFU1NfX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUE9TVENPTkRJVElPTiA9IFBST0NFU1NfX1BPU1RDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19CUkVBS0RPV05fRUxFTUVOVFMgPSBQUk9DRVNTX19CUkVBS0RPV05fRUxFTUVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1JPQURNQVBTID0gUFJPQ0VTU19fUk9BRE1BUFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gUFJPQ0VTU19fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fQ0hFQ0tMSVNUUyA9IFBST0NFU1NfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0NPTkNFUFRTID0gUFJPQ0VTU19fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0VYQU1QTEVTID0gUFJPQ0VTU19fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fR1VJREVMSU5FUyA9IFBST0NFU1NfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19SRVVTQUJMRV9BU1NFVFMgPSBQUk9DRVNTX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRW5hY3RhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSVNfRU5BQ1RBQkxFID0gUFJPQ0VTU19fSVNfRU5BQ1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm5zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JTkNMVURFU19QQVRURVJOUyA9IFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCA9IFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19WQUxJRF9DT05URVhUID0gUFJPQ0VTU19fVkFMSURfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FZHVjYXRpb24gTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUxTID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUyA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX05BTUUgPSBQUk9DRVNTX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0dVSUQgPSBQUk9DRVNTX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX09XTkVEX1JVTEVTID0gUFJPQ0VTU19fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQUk9DRVNTX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19TVVBQUkVTU0VEID0gUFJPQ0VTU19fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1NIQVBFSUNPTiA9IFBST0NFU1NfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fTk9ERUlDT04gPSBQUk9DRVNTX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRUZJWCA9IFBST0NFU1NfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JU19QTEFOTkVEID0gUFJPQ0VTU19fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFBST0NFU1NfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfT1BUSU9OQUwgPSBQUk9DRVNTX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRVNFTlRFRF9BRlRFUiA9IFBST0NFU1NfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QUkVTRU5URURfQkVGT1JFID0gUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QTEFOTklOR19EQVRBID0gUFJPQ0VTU19fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19TVVBFUl9BQ1RJVklUSUVTID0gUFJPQ0VTU19fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JU19SRVBFQVRBQkxFID0gUFJPQ0VTU19fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JU19PTkdPSU5HID0gUFJPQ0VTU19fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0lTX0VWRU5UX0RSSVZFTiA9IFBST0NFU1NfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIFRvIFByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0xJTktfVE9fUFJFREVDRVNTT1IgPSBQUk9DRVNTX19MSU5LX1RPX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1ZBUklBQklMSVRZX1RZUEUgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUFJFQ09ORElUSU9OID0gUFJPQ0VTU19fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BPU1RDT05ESVRJT04gPSBQUk9DRVNTX19QT1NUQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19CUkVBS0RPV05fRUxFTUVOVFMgPSBQUk9DRVNTX19CUkVBS0RPV05fRUxFTUVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUk9BRE1BUFMgPSBQUk9DRVNTX19ST0FETUFQUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IFBST0NFU1NfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fQ0hFQ0tMSVNUUyA9IFBST0NFU1NfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fQ09OQ0VQVFMgPSBQUk9DRVNTX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19FWEFNUExFUyA9IFBST0NFU1NfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fR1VJREVMSU5FUyA9IFBST0NFU1NfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1JFVVNBQkxFX0FTU0VUUyA9IFBST0NFU1NfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0lTX0VOQUNUQUJMRSA9IFBST0NFU1NfX0lTX0VOQUNUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JTkNMVURFU19QQVRURVJOUyA9IFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fREVGQVVMVF9DT05URVhUID0gUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbGlkIENvbnRleHQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fVkFMSURfQ09OVEVYVCA9IFBST0NFU1NfX1ZBTElEX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fTkFNRSA9IFBST0NFU1NfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dVSUQgPSBQUk9DRVNTX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fT1dORURfUlVMRVMgPSBQUk9DRVNTX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQUk9DRVNTX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fU1VQUFJFU1NFRCA9IFBST0NFU1NfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVTRU5UQVRJT04gPSBQUk9DRVNTX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fU0hBUEVJQ09OID0gUFJPQ0VTU19fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fTk9ERUlDT04gPSBQUk9DRVNTX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVGSVggPSBQUk9DRVNTX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lTX1BMQU5ORUQgPSBQUk9DRVNTX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFBST0NFU1NfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lTX09QVElPTkFMID0gUFJPQ0VTU19fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFU0VOVEVEX0FGVEVSID0gUFJPQ0VTU19fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVTRU5URURfQkVGT1JFID0gUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUExBTk5JTkdfREFUQSA9IFBST0NFU1NfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1NVUEVSX0FDVElWSVRJRVMgPSBQUk9DRVNTX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19SRVBFQVRBQkxFID0gUFJPQ0VTU19fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSVNfT05HT0lORyA9IFBST0NFU1NfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSVNfRVZFTlRfRFJJVkVOID0gUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0xJTktfVE9fUFJFREVDRVNTT1IgPSBQUk9DRVNTX19MSU5LX1RPX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19WQVJJQUJJTElUWV9UWVBFID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFBST0NFU1NfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFQ09ORElUSU9OID0gUFJPQ0VTU19fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QT1NUQ09ORElUSU9OID0gUFJPQ0VTU19fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JSRUFLRE9XTl9FTEVNRU5UUyA9IFBST0NFU1NfX0JSRUFLRE9XTl9FTEVNRU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUk9BRE1BUFMgPSBQUk9DRVNTX19ST0FETUFQUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBQUk9DRVNTX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19DSEVDS0xJU1RTID0gUFJPQ0VTU19fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQ09OQ0VQVFMgPSBQUk9DRVNTX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fRVhBTVBMRVMgPSBQUk9DRVNTX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HVUlERUxJTkVTID0gUFJPQ0VTU19fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1JFVVNBQkxFX0FTU0VUUyA9IFBST0NFU1NfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19FTkFDVEFCTEUgPSBQUk9DRVNTX19JU19FTkFDVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZXMgUGF0dGVybnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lOQ0xVREVTX1BBVFRFUk5TID0gUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBDb250ZXh0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fREVGQVVMVF9DT05URVhUID0gUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbGlkIENvbnRleHQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1ZBTElEX0NPTlRFWFQgPSBQUk9DRVNTX19WQUxJRF9DT05URVhUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2VkIE9uIFByb2Nlc3NlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRURfT05fUFJPQ0VTU0VTID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fR1VJRCA9IEdVSURBTkNFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBHVUlEQU5DRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19DSEVDS0xJU1RTID0gR1VJREFOQ0VfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19FWEFNUExFUyA9IEdVSURBTkNFX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0FTU0VUUyA9IEdVSURBTkNFX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9hZG1hcDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19OQU1FID0gTUVUSE9EX1BBQ0tBR0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fR1VJRCA9IE1FVEhPRF9QQUNLQUdFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19PV05FRF9SVUxFUyA9IE1FVEhPRF9QQUNLQUdFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19TVVBQUkVTU0VEID0gTUVUSE9EX1BBQ0tBR0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fR0xPQkFMID0gTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTID0gTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGlsZCBQYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19DSElMRF9QQUNLQUdFUyA9IE1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUyA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fTkFNRSA9IFBST0NFU1NfUEFDS0FHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0dVSUQgPSBQUk9DRVNTX1BBQ0tBR0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fT1dORURfUlVMRVMgPSBQUk9DRVNTX1BBQ0tBR0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQUk9DRVNTX1BBQ0tBR0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fU1VQUFJFU1NFRCA9IFBST0NFU1NfUEFDS0FHRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfUEFDS0FHRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0dMT0JBTCA9IFBST0NFU1NfUEFDS0FHRV9fR0xPQkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX1JFVVNFRF9QQUNLQUdFUyA9IFBST0NFU1NfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoaWxkIFBhY2thZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQ0hJTERfUEFDS0FHRVMgPSBQUk9DRVNTX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTX0VMRU1FTlRTID0gUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fRElBR1JBTVMgPSBQUk9DRVNTX1BBQ0tBR0VfX0RJQUdSQU1TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUyA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURSA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTiA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRVMgPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dVSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fT1dORURfUlVMRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVTRU5UQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fU0hBUEVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fTk9ERUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVGSVggPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lTX1BMQU5ORUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lTX09QVElPTkFMID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUFJFU0VOVEVEX0FGVEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVTRU5URURfQkVGT1JFID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUExBTk5JTkdfREFUQSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1NVUEVSX0FDVElWSVRJRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIElPPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTyA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19OQU1FID0gREVTQ1JJUFRPUl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fR1VJRCA9IERFU0NSSVBUT1JfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTiA9IERFU0NSSVBUT1JfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19PV05FRF9SVUxFUyA9IERFU0NSSVBUT1JfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19TVVBQUkVTU0VEID0gREVTQ1JJUFRPUl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFID0gREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRSA9IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTiA9IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19TSEFQRUlDT04gPSBERVNDUklQVE9SX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19OT0RFSUNPTiA9IERFU0NSSVBUT1JfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BSRUZJWCA9IERFU0NSSVBUT1JfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fSVNfUExBTk5FRCA9IERFU0NSSVBUT1JfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUwgPSBERVNDUklQVE9SX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUkVTRU5URURfQUZURVIgPSBERVNDUklQVE9SX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkUgPSBERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QTEFOTklOR19EQVRBID0gREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVElFUyA9IERFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgQ29tcG9uZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJPQ0VTU19DT01QT05FTlQgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fTkFNRSA9IE1FVEhPRF9VTklUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19HVUlEID0gTUVUSE9EX1VOSVRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fT1dORURfUlVMRVMgPSBNRVRIT0RfVU5JVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX1VOSVRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19TVVBQUkVTU0VEID0gTUVUSE9EX1VOSVRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9VTklUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fQVVUSE9SUyA9IE1FVEhPRF9VTklUX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fVkVSU0lPTiA9IE1FVEhPRF9VTklUX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19DT1BZUklHSFRfU1RBVEVNRU5UID0gTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlciBDaGFuZ2VhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVMgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fQkFTRVMgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwgPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTiA9IDExMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX05BTUUgPSBNRVRIT0RfVU5JVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0dVSUQgPSBNRVRIT0RfVU5JVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX09XTkVEX1JVTEVTID0gTUVUSE9EX1VOSVRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfVU5JVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19TVVBQUkVTU0VEID0gTUVUSE9EX1VOSVRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfVU5JVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19BVVRIT1JTID0gTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19WRVJTSU9OID0gTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgVmlld3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWaWV3PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgQ29uZmlndXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT05TID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VidHJhY3RlZCBDYXRlZ29yeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlkgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZGRlZCBDYXRlZ29yeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0ZhbWlseUltcGwgPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NGYW1pbHlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0ZhbWlseSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWSA9IDExNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX05BTUUgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX0dVSUQgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX09XTkVEX1JVTEVTID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19TVVBQUkVTU0VEID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19BVVRIT1JTID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX0NIQU5HRV9ERVNDUklQVElPTiA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19WRVJTSU9OID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19DT1BZUklHSFRfU1RBVEVNRU5UID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTiA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT04gPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgVmlld3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19QUk9DRVNTX1ZJRVdTID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFV1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWaWV3PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX0RFRkFVTFRfVklFVyA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBDb25maWd1cmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX0JBU0VfQ09ORklHVVJBVElPTlMgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWJ0cmFjdGVkIENhdGVnb3J5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fU1VCVFJBQ1RFRF9DQVRFR09SWSA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkZGVkIENhdGVnb3J5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fQURERURfQ0FURUdPUlkgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2Vzc2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fREVMSVZFUllfUFJPQ0VTU0VTID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBGYW1pbHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWSA9IDExNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX05BTUUgPSBNRVRIT0RfVU5JVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX0dVSUQgPSBNRVRIT0RfVU5JVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX09XTkVEX1JVTEVTID0gTUVUSE9EX1VOSVRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfVU5JVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19TVVBQUkVTU0VEID0gTUVUSE9EX1VOSVRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfVU5JVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19BVVRIT1JTID0gTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX0NIQU5HRV9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19WRVJTSU9OID0gTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19DT1BZUklHSFRfU1RBVEVNRU5UID0gTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlZmluZWQgQ29uZmlndXJhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGUgPGVtPldvcmsgT3JkZXIgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya09yZGVyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX09SREVSX1RZUEUgPSAxMTY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHNldWRvU3RhdGVLaW5kIDxlbT5Qc2V1ZG8gU3RhdGUgS2luZDwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qc2V1ZG9TdGF0ZUtpbmQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQc2V1ZG9TdGF0ZUtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFNFVURPX1NUQVRFX0tJTkQgPSAxMTc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBWQVJJQUJJTElUWV9UWVBFID0gMTE4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EYXRlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS51dGlsLkRhdGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERBVEUgPSAxMTk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlVyaTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubmV0LlVSSQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFVyaSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBVUkkgPSAxMjA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlVubGltaXRlZCBOYXR1cmFsPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFVubGltaXRlZE5hdHVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVU5MSU1JVEVEX05BVFVSQUwgPSAxMjE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlN0cmluZzwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTdHJpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU1RSSU5HID0gMTIyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5TZXQ8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLnV0aWwuU2V0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNFVCA9IDEyMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+U2VxdWVuY2U8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLnV0aWwuTGlzdAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNlcXVlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNFUVVFTkNFID0gMTI0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5JbnRlZ2VyPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEludGVnZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSU5URUdFUiA9IDEyNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RmxvYXQ8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuRmxvYXQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRGbG9hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBGTE9BVCA9IDEyNjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllciA8ZW0+Q2xhc3NpZmllcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DbGFzc2lmaWVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDbGFzc2lmaWVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50IDxlbT5OYW1lZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TmFtZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0TmFtZWRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXROYW1lZEVsZW1lbnRfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQgPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZWFibGVFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSA8ZW0+UGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZSA8ZW0+TmFtZXNwYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk5hbWVzcGFjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZXNwYWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXROYW1lc3BhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCA8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldEd1aWQgPGVtPkd1aWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HdWlkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldEd1aWQoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfR3VpZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0QnJpZWZEZXNjcmlwdGlvbiA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRCcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3duZWRSdWxlcyA8ZW0+T3duZWQgUnVsZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk93bmVkIFJ1bGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldE93bmVkUnVsZXMoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZEVsZW1lbnRfT3duZWRSdWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZEVsZW1lbnRfTWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRTdXBwcmVzc2VkIDxlbT5TdXBwcmVzc2VkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3VwcHJlc3NlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRTdXBwcmVzc2VkKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldE9yZGVyaW5nR3VpZGUgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3JkZXJpbmdHdWlkZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQgPGVtPkNvbnN0cmFpbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29uc3RyYWludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29uc3RyYWludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQjZ2V0Qm9keSA8ZW0+Qm9keTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJvZHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQjZ2V0Qm9keSgpCi0JICogQHNlZSAjZ2V0Q29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29uc3RyYWludF9Cb2R5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50IDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29udGVudEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldFN1cHBvcnRpbmdNYXRlcmlhbHMgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldENvbmNlcHRzQW5kUGFwZXJzIDxlbT5Db25jZXB0cyBBbmQgUGFwZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db25jZXB0cyBBbmQgUGFwZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRDb25jZXB0c0FuZFBhcGVycygpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRDaGVja2xpc3RzIDxlbT5DaGVja2xpc3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5DaGVja2xpc3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRDaGVja2xpc3RzKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0R3VpZGVsaW5lcyA8ZW0+R3VpZGVsaW5lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+R3VpZGVsaW5lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0R3VpZGVsaW5lcygpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldEV4YW1wbGVzIDxlbT5FeGFtcGxlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXhhbXBsZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldEV4YW1wbGVzKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldEFzc2V0cyA8ZW0+QXNzZXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Bc3NldHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldEFzc2V0cygpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQgPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZXNjcmliYWJsZUVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uTmFtZSA8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBzZWUgI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5QcmVzZW50YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBzZWUgI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRTaGFwZWljb24gPGVtPlNoYXBlaWNvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNoYXBlaWNvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFNoYXBlaWNvbigpCi0JICogQHNlZSAjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldE5vZGVpY29uIDxlbT5Ob2RlaWNvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vZGVpY29uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0Tm9kZWljb24oKQotCSAqIEBzZWUgI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiA8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRNYWluRGVzY3JpcHRpb24gPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRTZWN0aW9ucyA8ZW0+U2VjdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlY3Rpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0U2VjdGlvbnMoKQotCSAqIEBzZWUgI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEtleUNvbnNpZGVyYXRpb25zIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRLZXlDb25zaWRlcmF0aW9ucygpCi0JICogQHNlZSAjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiA8ZW0+U2VjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRTZWN0aW9uTmFtZSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VjdGlvbiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFNlY3Rpb25OYW1lKCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRTZWN0aW9uRGVzY3JpcHRpb24gPGVtPlNlY3Rpb24gRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZWN0aW9uIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9TZWN0aW9uRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0U3ViU2VjdGlvbnMgPGVtPlN1YiBTZWN0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3ViIFNlY3Rpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFN1YlNlY3Rpb25zKCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZWN0aW9uX1N1YlNlY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRQcmVkZWNlc3NvciA8ZW0+UHJlZGVjZXNzb3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5QcmVkZWNlc3NvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRQcmVkZWNlc3NvcigpCi0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VjdGlvbl9QcmVkZWNlc3NvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlIDxlbT5Sb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUjZ2V0TW9kaWZpZXMgPGVtPk1vZGlmaWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Nb2RpZmllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZSNnZXRNb2RpZmllcygpCi0JICogQHNlZSAjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Um9sZV9Nb2RpZmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZSNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUjZ2V0UmVzcG9uc2libGVGb3IoKQotCSAqIEBzZWUgI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJvbGVfUmVzcG9uc2libGVGb3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0UmVwb3J0cyA8ZW0+UmVwb3J0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVwb3J0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0UmVwb3J0cygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldFRlbXBsYXRlcyA8ZW0+VGVtcGxhdGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5UZW1wbGF0ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldFRlbXBsYXRlcygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0VG9vbE1lbnRvcnMgPGVtPlRvb2wgTWVudG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+VG9vbCBNZW50b3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRUb29sTWVudG9ycygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhc2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldFBlcmZvcm1lZEJ5IDxlbT5QZXJmb3JtZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5QZXJmb3JtZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0UGVyZm9ybWVkQnkoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfUGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldE1hbmRhdG9yeUlucHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5PdXRwdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0T3V0cHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX091dHB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0T3B0aW9uYWxJbnB1dCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19PcHRpb25hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldFN0ZXBzIDxlbT5TdGVwczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3RlcHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0U3RlcHMoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfU3RlcHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0VG9vbE1lbnRvcnMgPGVtPlRvb2wgTWVudG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+VG9vbCBNZW50b3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldFRvb2xNZW50b3JzKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX1Rvb2xNZW50b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uIDxlbT5Xb3JrIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24jZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAc2VlICNnZXRXb3JrRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya0RlZmluaXRpb25fUHJlY29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24jZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBzZWUgI2dldFdvcmtEZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrRGVmaW5pdGlvbl9Qb3N0Y29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXAgPGVtPlN0ZXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U3RlcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U3RlcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZSA8ZW0+R3VpZGFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3VpZGFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCA8ZW0+QXJ0aWZhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXJ0aWZhY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBcnRpZmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZXJBcnRpZmFjdCA8ZW0+Q29udGFpbmVyIEFydGlmYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkNvbnRhaW5lciBBcnRpZmFjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKQotCSAqIEBzZWUgI2dldEFydGlmYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcnRpZmFjdF9Db250YWluZXJBcnRpZmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVkQXJ0aWZhY3RzIDxlbT5Db250YWluZWQgQXJ0aWZhY3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250YWluZWQgQXJ0aWZhY3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZWRBcnRpZmFjdHMoKQotCSAqIEBzZWUgI2dldEFydGlmYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGUgPGVtPkRlbGl2ZXJhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVsaXZlcmFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlI2dldERlbGl2ZXJlZFdvcmtQcm9kdWN0cyA8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZSNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZSA8ZW0+T3V0Y29tZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PdXRjb21lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRPdXRjb21lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRHbG9iYWwgPGVtPkdsb2JhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdsb2JhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRHbG9iYWwoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlI2dldFJldXNlZFBhY2thZ2VzIDxlbT5SZXVzZWQgUGFja2FnZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJldXNlZCBQYWNrYWdlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRSZXVzZWRQYWNrYWdlcygpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRDaGlsZFBhY2thZ2VzIDxlbT5DaGlsZCBQYWNrYWdlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q2hpbGQgUGFja2FnZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0Q2hpbGRQYWNrYWdlcygpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlIDxlbT5Db250ZW50IFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29udGVudFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50cyA8ZW0+Q29udGVudCBFbGVtZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udGVudCBFbGVtZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRzKCkKLQkgKiBAc2VlICNnZXRDb250ZW50UGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24gPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRCcmllZk91dGxpbmUgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CcmllZiBPdXRsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldEJyaWVmT3V0bGluZSgpCi0JICogQHNlZSAjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucyA8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uT3B0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIElkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldEV4dGVybmFsSWQoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlB1cnBvc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UHVycG9zZSgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRJbXBhY3RPZk5vdEhhdmluZyA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRJbXBhY3RPZk5vdEhhdmluZygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcgPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiA8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldEV4dGVybmFsRGVzY3JpcHRpb24gPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRQYWNrYWdpbmdHdWlkYW5jZSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiA8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGVEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTa2lsbHMgPGVtPlNraWxsczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNraWxsczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uI2dldFNraWxscygpCi0JICogQHNlZSAjZ2V0Um9sZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzIDxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQHNlZSAjZ2V0Um9sZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U3lub255bXMgPGVtPlN5bm9ueW1zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3lub255bXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTeW5vbnltcygpCi0JICogQHNlZSAjZ2V0Um9sZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGFza0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdXJwb3NlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0UHVycG9zZSgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFsdGVybmF0aXZlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcygpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24gPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiNnZXRBdHRhY2htZW50cyA8ZW0+QXR0YWNobWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdHRhY2htZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiNnZXRBdHRhY2htZW50cygpCi0JICogQHNlZSAjZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uIDxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QWRkaXRpb25hbEluZm8gPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBZGRpdGlvbmFsSW5mbygpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BZGRpdGlvbmFsSW5mbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0UHJvYmxlbSA8ZW0+UHJvYmxlbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb2JsZW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0UHJvYmxlbSgpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRCYWNrZ3JvdW5kIDxlbT5CYWNrZ3JvdW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QmFja2dyb3VuZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRCYWNrZ3JvdW5kKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEdvYWxzIDxlbT5Hb2FsczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdvYWxzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEdvYWxzKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBcHBsaWNhdGlvbiA8ZW0+QXBwbGljYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BcHBsaWNhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBcHBsaWNhdGlvbigpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BcHBsaWNhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0TGV2ZWxzT2ZBZG9wdGlvbiA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldExldmVsc09mQWRvcHRpb24oKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fTGV2ZWxzT2ZBZG9wdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCA8ZW0+UG9pbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UG9pbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQb2ludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50I2dldFggPGVtPlg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5YPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCNnZXRYKCkKLQkgKiBAc2VlICNnZXRQb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UG9pbnRfWCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50I2dldFkgPGVtPlk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5ZPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCNnZXRZKCkKLQkgKiBAc2VlICNnZXRQb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UG9pbnRfWSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRHcmFwaEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0UG9zaXRpb24gPGVtPlBvc2l0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UG9zaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRQb3NpdGlvbigpCi0JICogQHNlZSAjZ2V0R3JhcGhFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfUG9zaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRDb250YWluZWQgPGVtPkNvbnRhaW5lZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udGFpbmVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0Q29udGFpbmVkKCkKLQkgKiBAc2VlICNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEdyYXBoRWxlbWVudF9Db250YWluZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRMaW5rIDxlbT5MaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5MaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0TGluaygpCi0JICogQHNlZSAjZ2V0R3JhcGhFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldEFuY2hvcmFnZSA8ZW0+QW5jaG9yYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5BbmNob3JhZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRBbmNob3JhZ2UoKQotCSAqIEBzZWUgI2dldEdyYXBoRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0R3JhcGhFbGVtZW50X0FuY2hvcmFnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRTZW1hbnRpY01vZGVsIDxlbT5TZW1hbnRpYyBNb2RlbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlNlbWFudGljIE1vZGVsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0U2VtYW50aWNNb2RlbCgpCi0JICogQHNlZSAjZ2V0R3JhcGhFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfU2VtYW50aWNNb2RlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCA8ZW0+RGlhZ3JhbSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpYWdyYW0gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERpYWdyYW1FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0SXNWaXNpYmxlIDxlbT5JcyBWaXNpYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgVmlzaWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0SXNWaXNpYmxlKCkKLQkgKiBAc2VlICNnZXREaWFncmFtRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGlhZ3JhbUVsZW1lbnRfSXNWaXNpYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldENvbnRhaW5lcl8gPGVtPkNvbnRhaW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5Db250YWluZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldENvbnRhaW5lcl8oKQotCSAqIEBzZWUgI2dldERpYWdyYW1FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaWFncmFtRWxlbWVudF9Db250YWluZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldFJlZmVyZW5jZSA8ZW0+UmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldFJlZmVyZW5jZSgpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpYWdyYW1FbGVtZW50X1JlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0UHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0UHJvcGVydHkoKQotCSAqIEBzZWUgI2dldERpYWdyYW1FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaWFncmFtRWxlbWVudF9Qcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpYWdyYW0gTGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERpYWdyYW1MaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Wm9vbSA8ZW0+Wm9vbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlpvb208L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldFpvb20oKQotCSAqIEBzZWUgI2dldERpYWdyYW1MaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREaWFncmFtTGlua19ab29tKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Vmlld3BvcnQgPGVtPlZpZXdwb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Vmlld3BvcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldFZpZXdwb3J0KCkKLQkgKiBAc2VlICNnZXREaWFncmFtTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUxpbmtfVmlld3BvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldEdyYXBoRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbUxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpYWdyYW1MaW5rX0dyYXBoRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldERpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXREaWFncmFtKCkKLQkgKiBAc2VlICNnZXREaWFncmFtTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUxpbmtfRGlhZ3JhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciA8ZW0+R3JhcGggQ29ubmVjdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkdyYXBoIENvbm5lY3RvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEdyYXBoQ29ubmVjdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBzZWUgI2dldEdyYXBoQ29ubmVjdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaENvbm5lY3Rvcl9HcmFwaEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yI2dldEdyYXBoRWRnZSA8ZW0+R3JhcGggRWRnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+R3JhcGggRWRnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFZGdlKCkKLQkgKiBAc2VlICNnZXRHcmFwaENvbm5lY3RvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFZGdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UgPGVtPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldFByZXNlbnRhdGlvbiA8ZW0+UHJlc2VudGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldFByZXNlbnRhdGlvbigpCi0JICogQHNlZSAjZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9QcmVzZW50YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBzZWUgI2dldFNlbWFudGljTW9kZWxCcmlkZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlbWFudGljTW9kZWxCcmlkZ2VfR3JhcGhFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldERpYWdyYW0oKQotCSAqIEBzZWUgI2dldFNlbWFudGljTW9kZWxCcmlkZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlbWFudGljTW9kZWxCcmlkZ2VfRGlhZ3JhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24gPGVtPkRpbWVuc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EaW1lbnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGltZW5zaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uI2dldFdpZHRoIDxlbT5XaWR0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldpZHRoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24jZ2V0V2lkdGgoKQotCSAqIEBzZWUgI2dldERpbWVuc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGltZW5zaW9uX1dpZHRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uI2dldEhlaWdodCA8ZW0+SGVpZ2h0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGVpZ2h0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24jZ2V0SGVpZ2h0KCkKLQkgKiBAc2VlICNnZXREaW1lbnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpbWVuc2lvbl9IZWlnaHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSNnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiA8ZW0+SXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSNnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpCi0JICogQHNlZSAjZ2V0UmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZWZlcmVuY2VfSXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UjZ2V0UmVmZXJlbmNlZCA8ZW0+UmVmZXJlbmNlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlJlZmVyZW5jZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSNnZXRSZWZlcmVuY2VkKCkKLQkgKiBAc2VlICNnZXRSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlZmVyZW5jZV9SZWZlcmVuY2VkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5IDxlbT5Qcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHkjZ2V0S2V5IDxlbT5LZXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5LZXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5I2dldEtleSgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb3BlcnR5X0tleSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb3BlcnR5X1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZSA8ZW0+R3JhcGggRWRnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5HcmFwaCBFZGdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEdyYXBoRWRnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlI2dldEFuY2hvciA8ZW0+QW5jaG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5BbmNob3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZSNnZXRBbmNob3IoKQotCSAqIEBzZWUgI2dldEdyYXBoRWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0R3JhcGhFZGdlX0FuY2hvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlI2dldFdheXBvaW50cyA8ZW0+V2F5cG9pbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5XYXlwb2ludHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZSNnZXRXYXlwb2ludHMoKQotCSAqIEBzZWUgI2dldEdyYXBoRWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0R3JhcGhFZGdlX1dheXBvaW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIDxlbT5EaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERpYWdyYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldFpvb20gPGVtPlpvb208L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5ab29tPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldFpvb20oKQotCSAqIEBzZWUgI2dldERpYWdyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpYWdyYW1fWm9vbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0Vmlld3BvaW50IDxlbT5WaWV3cG9pbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5WaWV3cG9pbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0Vmlld3BvaW50KCkKLQkgKiBAc2VlICNnZXREaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaWFncmFtX1ZpZXdwb2ludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXREaWFncmFtTGluayA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5EaWFncmFtIExpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0RGlhZ3JhbUxpbmsoKQotCSAqIEBzZWUgI2dldERpYWdyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpYWdyYW1fRGlhZ3JhbUxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldE5hbWVzcGFjZSA8ZW0+TmFtZXNwYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TmFtZXNwYWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldE5hbWVzcGFjZSgpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlhZ3JhbV9OYW1lc3BhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlIDxlbT5HcmFwaCBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkdyYXBoIE5vZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3JhcGhOb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlI2dldFNpemUgPGVtPlNpemU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5TaXplPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGUjZ2V0U2l6ZSgpCi0JICogQHNlZSAjZ2V0R3JhcGhOb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaE5vZGVfU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCA8ZW0+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50I2dldFR5cGVJbmZvIDxlbT5UeXBlIEluZm88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlIEluZm88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50I2dldFR5cGVJbmZvKCkKLQkgKiBAc2VlICNnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfVHlwZUluZm8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZSA8ZW0+VU1BIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRFbGVtZW50KCkKLQkgKiBAc2VlICNnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UgPGVtPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RWxlbWVudCgpCi0JICogQHNlZSAjZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvcmVTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTGVhZkVsZW1lbnQgPGVtPkxlYWYgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5MZWFmIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkxlYWZFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRMZWFmRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudCA8ZW0+VGV4dCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRleHQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRleHRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnQjZ2V0VGV4dCA8ZW0+VGV4dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRleHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50I2dldFRleHQoKQotCSAqIEBzZWUgI2dldFRleHRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUZXh0RWxlbWVudF9UZXh0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlIDxlbT5JbWFnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbWFnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEltYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UjZ2V0VXJpIDxlbT5Vcmk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vcmk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlI2dldFVyaSgpCi0JICogQHNlZSAjZ2V0SW1hZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEltYWdlX1VyaSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlI2dldE1pbWVUeXBlIDxlbT5NaW1lIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NaW1lIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlI2dldE1pbWVUeXBlKCkKLQkgKiBAc2VlICNnZXRJbWFnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SW1hZ2VfTWltZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhpY1ByaW1pdGl2ZSA8ZW0+R3JhcGhpYyBQcmltaXRpdmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3JhcGhpYyBQcmltaXRpdmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEdyYXBoaWNQcmltaXRpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmUgPGVtPlBvbHlsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBvbHlsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UG9seWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZSNnZXRDbG9zZWQgPGVtPkNsb3NlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNsb3NlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmUjZ2V0Q2xvc2VkKCkKLQkgKiBAc2VlICNnZXRQb2x5bGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UG9seWxpbmVfQ2xvc2VkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZSNnZXRXYXlwb2ludHMgPGVtPldheXBvaW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+V2F5cG9pbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZSNnZXRXYXlwb2ludHMoKQotCSAqIEBzZWUgI2dldFBvbHlsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQb2x5bGluZV9XYXlwb2ludHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSA8ZW0+RWxsaXBzZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbGxpcHNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFbGxpcHNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSYWRpdXNYIDxlbT5SYWRpdXMgWDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJhZGl1cyBYPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJhZGl1c1goKQotCSAqIEBzZWUgI2dldEVsbGlwc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVsbGlwc2VfUmFkaXVzWCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0UmFkaXVzWSA8ZW0+UmFkaXVzIFk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SYWRpdXMgWTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSYWRpdXNZKCkKLQkgKiBAc2VlICNnZXRFbGxpcHNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbGxpcHNlX1JhZGl1c1koKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJvdGF0aW9uIDxlbT5Sb3RhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJvdGF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJvdGF0aW9uKCkKLQkgKiBAc2VlICNnZXRFbGxpcHNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbGxpcHNlX1JvdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRTdGFydEFuZ2xlIDxlbT5TdGFydCBBbmdsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0IEFuZ2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFN0YXJ0QW5nbGUoKQotCSAqIEBzZWUgI2dldEVsbGlwc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVsbGlwc2VfU3RhcnRBbmdsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0RW5kQW5nbGUgPGVtPkVuZCBBbmdsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVuZCBBbmdsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRFbmRBbmdsZSgpCi0JICogQHNlZSAjZ2V0RWxsaXBzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWxsaXBzZV9FbmRBbmdsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0Q2VudGVyIDxlbT5DZW50ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5DZW50ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0Q2VudGVyKCkKLQkgKiBAc2VlICNnZXRFbGxpcHNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbGxpcHNlX0NlbnRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSA8ZW0+QWN0aXZpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWN0aXZpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBY3Rpdml0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0QnJlYWtkb3duRWxlbWVudHMgPGVtPkJyZWFrZG93biBFbGVtZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QnJlYWtkb3duIEVsZW1lbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRCcmVha2Rvd25FbGVtZW50cygpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRSb2FkbWFwcyA8ZW0+Um9hZG1hcHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJvYWRtYXBzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRSb2FkbWFwcygpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFjdGl2aXR5X1JvYWRtYXBzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldFN1cHBvcnRpbmdNYXRlcmlhbHMoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9TdXBwb3J0aW5nTWF0ZXJpYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRDaGVja2xpc3RzIDxlbT5DaGVja2xpc3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5DaGVja2xpc3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRDaGVja2xpc3RzKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QWN0aXZpdHlfQ2hlY2tsaXN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0Q29uY2VwdHMgPGVtPkNvbmNlcHRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db25jZXB0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0Q29uY2VwdHMoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9Db25jZXB0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0RXhhbXBsZXMgPGVtPkV4YW1wbGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5FeGFtcGxlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0RXhhbXBsZXMoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9FeGFtcGxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0R3VpZGVsaW5lcyA8ZW0+R3VpZGVsaW5lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+R3VpZGVsaW5lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0R3VpZGVsaW5lcygpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFjdGl2aXR5X0d1aWRlbGluZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldFJldXNhYmxlQXNzZXRzIDxlbT5SZXVzYWJsZSBBc3NldHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJldXNhYmxlIEFzc2V0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0UmV1c2FibGVBc3NldHMoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9SZXVzYWJsZUFzc2V0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldElzRW5hY3RhYmxlIDxlbT5JcyBFbmFjdGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBFbmFjdGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldElzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfSXNFbmFjdGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQgPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtCcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0SXNSZXBlYXRhYmxlIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0SXNSZXBlYXRhYmxlKCkKLQkgKiBAc2VlICNnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0SXNPbmdvaW5nIDxlbT5JcyBPbmdvaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgT25nb2luZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0SXNPbmdvaW5nKCkKLQkgKiBAc2VlICNnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0SXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc0V2ZW50RHJpdmVuKCkKLQkgKiBAc2VlICNnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0TGlua1RvUHJlZGVjZXNzb3IgPGVtPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldExpbmtUb1ByZWRlY2Vzc29yKCkKLQkgKiBAc2VlICNnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEJyZWFrZG93bkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlZml4PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZWZpeCgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldElzUGxhbm5lZCA8ZW0+SXMgUGxhbm5lZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFBsYW5uZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0SXNQbGFubmVkKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0SXNPcHRpb25hbCA8ZW0+SXMgT3B0aW9uYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBPcHRpb25hbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRJc09wdGlvbmFsKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEFmdGVyIDxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQWZ0ZXIoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEJlZm9yZSA8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQmVmb3JlKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UGxhbm5pbmdEYXRhIDxlbT5QbGFubmluZyBEYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfUGxhbm5pbmdEYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXRpZXMgPGVtPlN1cGVyIEFjdGl2aXRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TdXBlciBBY3Rpdml0aWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFN1cGVyQWN0aXZpdGllcygpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb24gPGVtPkl0ZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JdGVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SXRlcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlIDxlbT5QaGFzZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QaGFzZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBoYXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlIDxlbT5UZWFtIFByb2ZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVhbSBQcm9maWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGVhbVByb2ZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFRlYW1Sb2xlcyA8ZW0+VGVhbSBSb2xlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGVhbSBSb2xlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0VGVhbVJvbGVzKCkKLQkgKiBAc2VlICNnZXRUZWFtUHJvZmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0U3VwZXJUZWFtIDxlbT5TdXBlciBUZWFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U3VwZXIgVGVhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0U3VwZXJUZWFtKCkKLQkgKiBAc2VlICNnZXRUZWFtUHJvZmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSNnZXRTdWJUZWFtIDxlbT5TdWIgVGVhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3ViIFRlYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1YlRlYW0oKQotCSAqIEBzZWUgI2dldFRlYW1Qcm9maWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yIDxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9sZURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IjZ2V0Um9sZSgpCi0JICogQHNlZSAjZ2V0Um9sZURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yI2dldE1vZGlmaWVzIDxlbT5Nb2RpZmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+TW9kaWZpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yI2dldE1vZGlmaWVzKCkKLQkgKiBAc2VlICNnZXRSb2xlRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Um9sZURlc2NyaXB0b3JfTW9kaWZpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJlc3BvbnNpYmxlRm9yIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IjZ2V0UmVzcG9uc2libGVGb3IoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXIgPGVtPldvcmsgT3JkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBPcmRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrT3JkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXIjZ2V0TGlua1R5cGUgPGVtPkxpbmsgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxpbmsgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyI2dldExpbmtUeXBlKCkKLQkgKiBAc2VlICNnZXRXb3JrT3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtPcmRlcl9MaW5rVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlciNnZXRQcmVkIDxlbT5QcmVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UHJlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyI2dldFByZWQoKQotCSAqIEBzZWUgI2dldFdvcmtPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya09yZGVyX1ByZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQbGFubmluZ0RhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEjZ2V0U3RhcnREYXRlIDxlbT5TdGFydCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldFN0YXJ0RGF0ZSgpCi0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfU3RhcnREYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAc2VlICNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBsYW5uaW5nRGF0YV9GaW5pc2hEYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldFJhbmsgPGVtPlJhbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SYW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEjZ2V0UmFuaygpCi0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfUmFuaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yIDxlbT5EZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IgPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUYXNrRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldFRhc2sgPGVtPlRhc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRUYXNrKCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldEFzc2lzdGVkQnkgPGVtPkFzc2lzdGVkIEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Bc3Npc3RlZCBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QXNzaXN0ZWRCeSgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldEV4dGVybmFsSW5wdXQgPGVtPkV4dGVybmFsIElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0RXh0ZXJuYWxJbnB1dCgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldE1hbmRhdG9yeUlucHV0IDxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0T3B0aW9uYWxJbnB1dCA8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPk9wdGlvbmFsIElucHV0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRPcHRpb25hbElucHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0T3V0cHV0IDxlbT5PdXRwdXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPk91dHB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0T3V0cHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkgPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRTZWxlY3RlZFN0ZXBzIDxlbT5TZWxlY3RlZCBTdGVwczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VsZWN0ZWQgU3RlcHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldFNlbGVjdGVkU3RlcHMoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RW50cnlTdGF0ZSA8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RXhpdFN0YXRlIDxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0ZWRCeSA8ZW0+SW1wYWN0ZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkltcGFjdGVkIEJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0ZWRCeSgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdHMgPGVtPkltcGFjdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkltcGFjdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RzKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0RGVsaXZlcmFibGVQYXJ0cyA8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0RGVsaXZlcmFibGVQYXJ0cygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlIDxlbT5Db21wb3NpdGUgUm9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29tcG9zaXRlUm9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZSNnZXRBZ2dyZWdhdGVkUm9sZXMgPGVtPkFnZ3JlZ2F0ZWQgUm9sZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkFnZ3JlZ2F0ZWQgUm9sZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGUjZ2V0QWdncmVnYXRlZFJvbGVzKCkKLQkgKiBAc2VlICNnZXRDb21wb3NpdGVSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiNnZXRVc2FnZUd1aWRhbmNlIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24jZ2V0VXNhZ2VHdWlkYW5jZSgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uIDxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlB1cnBvc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0UHVycG9zZSgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFsdGVybmF0aXZlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRIb3d0b1N0YWZmIDxlbT5Ib3d0byBTdGFmZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhvd3RvIFN0YWZmPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEhvd3RvU3RhZmYoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93dG9TdGFmZigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiA8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TY2FsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NhbGUoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0Umlza0xldmVsIDxlbT5SaXNrIExldmVsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmlzayBMZXZlbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0Umlza0xldmVsKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0VHlwZU9mQ29udHJhY3QgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRUeXBlT2ZDb250cmFjdCgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiA8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIElkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxJZCgpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzRGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TY29wZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjb3BlKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRVc2FnZU5vdGVzIDxlbT5Vc2FnZSBOb3RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVzYWdlIE5vdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0VXNhZ2VOb3RlcygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24jZ2V0UmVmaW5lZERlc2NyaXB0aW9uIDxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uI2dldFJlZmluZWREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQgPGVtPkNvbmNlcHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29uY2VwdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3QgPGVtPkNoZWNrbGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q2hlY2tsaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXhhbXBsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5HdWlkZWxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3VpZGVsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQgPGVtPlJlcG9ydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXBvcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlIDxlbT5UZW1wbGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UZW1wbGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRlbXBsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yIDxlbT5Ub29sIE1lbnRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VG9vbE1lbnRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdoaXRlcGFwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb24gPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUZXJtRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZSA8ZW0+UHJhY3RpY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJhY3RpY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcmFjdGljZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UjZ2V0U3ViUHJhY3RpY2VzIDxlbT5TdWIgUHJhY3RpY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWIgUHJhY3RpY2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZSNnZXRTdWJQcmFjdGljZXMoKQotCSAqIEBzZWUgI2dldFByYWN0aWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcmFjdGljZV9TdWJQcmFjdGljZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlI2dldENvbnRlbnRSZWZlcmVuY2VzIDxlbT5Db250ZW50IFJlZmVyZW5jZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbnRlbnQgUmVmZXJlbmNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UjZ2V0Q29udGVudFJlZmVyZW5jZXMoKQotCSAqIEBzZWUgI2dldFByYWN0aWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UjZ2V0QWN0aXZpdHlSZWZlcmVuY2VzIDxlbT5BY3Rpdml0eSBSZWZlcmVuY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5BY3Rpdml0eSBSZWZlcmVuY2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZSNnZXRBY3Rpdml0eVJlZmVyZW5jZXMoKQotCSAqIEBzZWUgI2dldFByYWN0aWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJldXNhYmxlQXNzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGUgPGVtPlN0YXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlN0YXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U3RhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGUjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBzZWUgI2dldFN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTdGF0ZV9Xb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGUjZ2V0UmVnaW9uIDxlbT5SZWdpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJlZ2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGUjZ2V0UmVnaW9uKCkKLQkgKiBAc2VlICNnZXRTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U3RhdGVfUmVnaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGUjZ2V0U3VibWFjaGluZSA8ZW0+U3VibWFjaGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlN1Ym1hY2hpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlI2dldFN1Ym1hY2hpbmUoKQotCSAqIEBzZWUgI2dldFN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTdGF0ZV9TdWJtYWNoaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZlcnRleCA8ZW0+VmVydGV4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlZlcnRleDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmVydGV4Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRWZXJ0ZXgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmVydGV4I2dldENvbnRhaW5lcl8gPGVtPkNvbnRhaW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5Db250YWluZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlZlcnRleCNnZXRDb250YWluZXJfKCkKLQkgKiBAc2VlICNnZXRWZXJ0ZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFZlcnRleF9Db250YWluZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZlcnRleCNnZXRPdXRnb2luZyA8ZW0+T3V0Z29pbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPk91dGdvaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXgjZ2V0T3V0Z29pbmcoKQotCSAqIEBzZWUgI2dldFZlcnRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VmVydGV4X091dGdvaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXgjZ2V0SW5jb21pbmcgPGVtPkluY29taW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbmNvbWluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmVydGV4I2dldEluY29taW5nKCkKLQkgKiBAc2VlICNnZXRWZXJ0ZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFZlcnRleF9JbmNvbWluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb24gPGVtPlJlZ2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZWdpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVnaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb24jZ2V0VmVydGV4IDxlbT5WZXJ0ZXg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlZlcnRleDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uI2dldFZlcnRleCgpCi0JICogQHNlZSAjZ2V0UmVnaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZWdpb25fVmVydGV4KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb24jZ2V0VHJhbnNpdGlvbiA8ZW0+VHJhbnNpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VHJhbnNpdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uI2dldFRyYW5zaXRpb24oKQotCSAqIEBzZWUgI2dldFJlZ2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVnaW9uX1RyYW5zaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uI2dldFN0YXRlIDxlbT5TdGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5TdGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uI2dldFN0YXRlKCkKLQkgKiBAc2VlICNnZXRSZWdpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlZ2lvbl9TdGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb24jZ2V0U3RhdGVNYWNoaW5lIDxlbT5TdGF0ZSBNYWNoaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPlN0YXRlIE1hY2hpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbiNnZXRTdGF0ZU1hY2hpbmUoKQotCSAqIEBzZWUgI2dldFJlZ2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVnaW9uX1N0YXRlTWFjaGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZU1hY2hpbmUgPGVtPlN0YXRlIE1hY2hpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U3RhdGUgTWFjaGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGVNYWNoaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTdGF0ZU1hY2hpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlTWFjaGluZSNnZXRSZWdpb24gPGVtPlJlZ2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVnaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZU1hY2hpbmUjZ2V0UmVnaW9uKCkKLQkgKiBAc2VlICNnZXRTdGF0ZU1hY2hpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFN0YXRlTWFjaGluZV9SZWdpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbiA8ZW0+VHJhbnNpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UcmFuc2l0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUcmFuc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uI2dldFdvcmtEZWZpbml0aW9uIDxlbT5Xb3JrIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbiNnZXRXb3JrRGVmaW5pdGlvbigpCi0JICogQHNlZSAjZ2V0VHJhbnNpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VHJhbnNpdGlvbl9Xb3JrRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uI2dldENvbnRhaW5lcl8gPGVtPkNvbnRhaW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5Db250YWluZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRyYW5zaXRpb24jZ2V0Q29udGFpbmVyXygpCi0JICogQHNlZSAjZ2V0VHJhbnNpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VHJhbnNpdGlvbl9Db250YWluZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U291cmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uI2dldFNvdXJjZSgpCi0JICogQHNlZSAjZ2V0VHJhbnNpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VHJhbnNpdGlvbl9Tb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uI2dldFRhcmdldCA8ZW0+VGFyZ2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+VGFyZ2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uI2dldFRhcmdldCgpCi0JICogQHNlZSAjZ2V0VHJhbnNpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VHJhbnNpdGlvbl9UYXJnZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHNldWRvU3RhdGUgPGVtPlBzZXVkbyBTdGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qc2V1ZG8gU3RhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBzZXVkb1N0YXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQc2V1ZG9TdGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lIDxlbT5EaXNjaXBsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpc2NpcGxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERpc2NpcGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUjZ2V0VGFza3MgPGVtPlRhc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5UYXNrczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSNnZXRUYXNrcygpCi0JICogQHNlZSAjZ2V0RGlzY2lwbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZV9UYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSNnZXRTdWJkaXNjaXBsaW5lIDxlbT5TdWJkaXNjaXBsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWJkaXNjaXBsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lI2dldFN1YmRpc2NpcGxpbmUoKQotCSAqIEBzZWUgI2dldERpc2NpcGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpc2NpcGxpbmVfU3ViZGlzY2lwbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSNnZXRSZWZlcmVuY2VXb3JrZmxvd3MgPGVtPlJlZmVyZW5jZSBXb3JrZmxvd3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJlZmVyZW5jZSBXb3JrZmxvd3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUjZ2V0UmVmZXJlbmNlV29ya2Zsb3dzKCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnkgPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb250ZW50Q2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldCA8ZW0+Um9sZSBTZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBTZXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGVTZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQjZ2V0Um9sZXMgPGVtPlJvbGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Sb2xlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldCNnZXRSb2xlcygpCi0JICogQHNlZSAjZ2V0Um9sZVNldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Um9sZVNldF9Sb2xlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW4gPGVtPkRvbWFpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Eb21haW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RG9tYWluKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW4jZ2V0V29ya1Byb2R1Y3RzIDxlbT5Xb3JrIFByb2R1Y3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Xb3JrIFByb2R1Y3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW4jZ2V0V29ya1Byb2R1Y3RzKCkKLQkgKiBAc2VlICNnZXREb21haW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbiNnZXRTdWJkb21haW5zIDxlbT5TdWJkb21haW5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWJkb21haW5zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW4jZ2V0U3ViZG9tYWlucygpCi0JICogQHNlZSAjZ2V0RG9tYWluKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb21haW5fU3ViZG9tYWlucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGUgPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtQcm9kdWN0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlI2dldFdvcmtQcm9kdWN0cyA8ZW0+V29yayBQcm9kdWN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+V29yayBQcm9kdWN0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlI2dldFdvcmtQcm9kdWN0cygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZyA8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERpc2NpcGxpbmVHcm91cGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nI2dldERpc2NpcGxpbmVzIDxlbT5EaXNjaXBsaW5lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGlzY2lwbGluZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZyNnZXREaXNjaXBsaW5lcygpCi0JICogQHNlZSAjZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbCA8ZW0+VG9vbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Ub29sPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUb29sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sI2dldFRvb2xNZW50b3JzIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlRvb2wgTWVudG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbCNnZXRUb29sTWVudG9ycygpCi0JICogQHNlZSAjZ2V0VG9vbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VG9vbF9Ub29sTWVudG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmcgPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGVTZXRHcm91cGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nI2dldFJvbGVTZXRzIDxlbT5Sb2xlIFNldHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJvbGUgU2V0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nI2dldFJvbGVTZXRzKCkKLQkgKiBAc2VlICNnZXRSb2xlU2V0R3JvdXBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeSA8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEN1c3RvbUNhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRDYXRlZ29yaXplZEVsZW1lbnRzIDxlbT5DYXRlZ29yaXplZCBFbGVtZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5I2dldENhdGVnb3JpemVkRWxlbWVudHMoKQotCSAqIEBzZWUgI2dldEN1c3RvbUNhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRTdWJDYXRlZ29yaWVzIDxlbT5TdWIgQ2F0ZWdvcmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3ViIENhdGVnb3JpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5I2dldFN1YkNhdGVnb3JpZXMoKQotCSAqIEBzZWUgI2dldEN1c3RvbUNhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcyA8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlbGl2ZXJ5UHJvY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzI2dldEVkdWNhdGlvbk1hdGVyaWFscyA8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzI2dldEVkdWNhdGlvbk1hdGVyaWFscygpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3MjZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMgPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWxzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3MjZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgPGVtPlByb2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyNnZXRJbmNsdWRlc1BhdHRlcm5zIDxlbT5JbmNsdWRlcyBQYXR0ZXJuczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW5jbHVkZXMgUGF0dGVybnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MjZ2V0SW5jbHVkZXNQYXR0ZXJucygpCi0JICogQHNlZSAjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyNnZXREZWZhdWx0Q29udGV4dCA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzI2dldERlZmF1bHRDb250ZXh0KCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzI2dldFZhbGlkQ29udGV4dCA8ZW0+VmFsaWQgQ29udGV4dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+VmFsaWQgQ29udGV4dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyNnZXRWYWxpZENvbnRleHQoKQotCSAqIEBzZWUgI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuIDxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSNnZXRCYXNlZE9uUHJvY2Vzc2VzIDxlbT5CYXNlZCBPbiBQcm9jZXNzZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkJhc2VkIE9uIFByb2Nlc3NlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUjZ2V0QmFzZWRPblByb2Nlc3NlcygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0Jhc2VkT25Qcm9jZXNzZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcCA8ZW0+Um9hZG1hcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2FkbWFwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2FkbWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQgPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzQ29tcG9uZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldEludGVyZmFjZXMgPGVtPkludGVyZmFjZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkludGVyZmFjZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0SW50ZXJmYWNlcygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudF9JbnRlcmZhY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRQcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRQcm9jZXNzKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UgPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UjZ2V0UHJvY2Vzc0VsZW1lbnRzIDxlbT5Qcm9jZXNzIEVsZW1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qcm9jZXNzIEVsZW1lbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXRQcm9jZXNzRWxlbWVudHMoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzUGFja2FnZV9Qcm9jZXNzRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlI2dldERpYWdyYW1zIDxlbT5EaWFncmFtczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGlhZ3JhbXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlI2dldERpYWdyYW1zKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc1BhY2thZ2VfRGlhZ3JhbXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSA8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyA8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlSU8gPGVtPkludGVyZmFjZSBJTzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW50ZXJmYWNlIElPPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZUlPKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZUlPKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yI2dldFByb2Nlc3NDb21wb25lbnQgPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9Qcm9jZXNzQ29tcG9uZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiNnZXRVc2VyQ2hhbmdlYWJsZSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jZ2V0VXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBsdWdpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jZ2V0TWV0aG9kUGFja2FnZXMgPGVtPk1ldGhvZCBQYWNrYWdlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kIFBhY2thZ2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jZ2V0TWV0aG9kUGFja2FnZXMoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBsdWdpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jZ2V0QmFzZXMgPGVtPkJhc2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5CYXNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2dldEJhc2VzKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFBsdWdpbl9CYXNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VmFyaWFiaWxpdHkgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRWYXJpYWJpbGl0eUVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50I2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50I2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0IDxlbT5NZXRob2QgVW5pdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgVW5pdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kVW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF1dGhvcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0QXV0aG9ycygpCi0JICogQHNlZSAjZ2V0TWV0aG9kVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEYXRlIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURhdGUoKQotCSAqIEBzZWUgI2dldE1ldGhvZFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQgPGVtPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5Db3B5cmlnaHQgU3RhdGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENvcHlyaWdodFN0YXRlbWVudCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHRTdGF0ZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uIDxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uIDxlbT5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0UHJvY2Vzc1ZpZXdzIDxlbT5Qcm9jZXNzIFZpZXdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qcm9jZXNzIFZpZXdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldFByb2Nlc3NWaWV3cygpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlld3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldERlZmF1bHRWaWV3IDxlbT5EZWZhdWx0IFZpZXc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5EZWZhdWx0IFZpZXc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0RGVmYXVsdFZpZXcoKQotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0QmFzZUNvbmZpZ3VyYXRpb25zIDxlbT5CYXNlIENvbmZpZ3VyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5CYXNlIENvbmZpZ3VyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEJhc2VDb25maWd1cmF0aW9ucygpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0U3VidHJhY3RlZENhdGVnb3J5IDxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9TdWJ0cmFjdGVkQ2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0QWRkZWRDYXRlZ29yeSA8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkFkZGVkIENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEFkZGVkQ2F0ZWdvcnkoKQotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fQWRkZWRDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5IDxlbT5Qcm9jZXNzIEZhbWlseTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIEZhbWlseTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc0ZhbWlseSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseSNnZXREZWxpdmVyeVByb2Nlc3NlcyA8ZW0+RGVsaXZlcnkgUHJvY2Vzc2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZWxpdmVyeSBQcm9jZXNzZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHkjZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NGYW1pbHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NGYW1pbHlfRGVsaXZlcnlQcm9jZXNzZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZExpYnJhcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkjZ2V0TWV0aG9kUGx1Z2lucyA8ZW0+TWV0aG9kIFBsdWdpbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZCBQbHVnaW5zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5I2dldE1ldGhvZFBsdWdpbnMoKQotCSAqIEBzZWUgI2dldE1ldGhvZExpYnJhcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2lucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSNnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMgPGVtPlByZWRlZmluZWQgQ29uZmlndXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByZWRlZmluZWQgQ29uZmlndXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkjZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkKLQkgKiBAc2VlICNnZXRNZXRob2RMaWJyYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGUgPGVtPldvcmsgT3JkZXIgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPldvcmsgT3JkZXIgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRXb3JrT3JkZXJUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHNldWRvU3RhdGVLaW5kIDxlbT5Qc2V1ZG8gU3RhdGUgS2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlBzZXVkbyBTdGF0ZSBLaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qc2V1ZG9TdGF0ZUtpbmQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0UHNldWRvU3RhdGVLaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEudXRpbC5EYXRlIDxlbT5EYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EYXRlPC9lbT4nLgotCSAqIEBzZWUgamF2YS51dGlsLkRhdGUKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS51dGlsLkRhdGUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5uZXQuVVJJIDxlbT5Vcmk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlVyaTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubmV0LlVSSQotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm5ldC5VUkkiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRVcmkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5VbmxpbWl0ZWQgTmF0dXJhbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5VbmxpbWl0ZWQgTmF0dXJhbDwvZW0+Jy4KLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iaW50IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VW5saW1pdGVkTmF0dXJhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlN0cmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+U3RyaW5nPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0U3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS51dGlsLlNldCA8ZW0+U2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5TZXQ8L2VtPicuCi0JICogQHNlZSBqYXZhLnV0aWwuU2V0Ci0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEudXRpbC5TZXQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRTZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLnV0aWwuTGlzdCA8ZW0+U2VxdWVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlNlcXVlbmNlPC9lbT4nLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS51dGlsLkxpc3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRTZXF1ZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkludGVnZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SW50ZWdlcjwvZW0+Jy4KLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iaW50IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SW50ZWdlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5GbG9hdCA8ZW0+RmxvYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkZsb2F0PC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLkZsb2F0Ci0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5GbG9hdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEZsb2F0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVbWFGYWN0b3J5IGdldFVtYUZhY3RvcnkoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludGVyZmFjZSBMaXRlcmFscyB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNsYXNzaWZpZXJJbXBsIDxlbT5DbGFzc2lmaWVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNsYXNzaWZpZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENsYXNzaWZpZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ0xBU1NJRklFUiA9IGVJTlNUQU5DRS5nZXRDbGFzc2lmaWVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVHlwZUltcGwgPGVtPlR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUWVBFID0gZUlOU1RBTkNFLmdldFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGVtZW50SW1wbCA8ZW0+RWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0RWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwgPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZWRFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXROYW1lZEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTkFNRURfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBOQU1FRF9FTEVNRU5UX19OQU1FID0gZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGFja2FnZWFibGVFbGVtZW50SW1wbCA8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QYWNrYWdlYWJsZUVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBhY2thZ2VhYmxlRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQQUNLQUdFQUJMRV9FTEVNRU5UID0gZUlOU1RBTkNFLmdldFBhY2thZ2VhYmxlRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBhY2thZ2VJbXBsIDxlbT5QYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBhY2thZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBhY2thZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZXNwYWNlSW1wbCA8ZW0+TmFtZXNwYWNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk5hbWVzcGFjZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TmFtZXNwYWNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE5BTUVTUEFDRSA9IGVJTlNUQU5DRS5nZXROYW1lc3BhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCA8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfX0dVSUQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZEVsZW1lbnRfTWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9TdXBwcmVzc2VkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RFbGVtZW50X09yZGVyaW5nR3VpZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db25zdHJhaW50SW1wbCA8ZW0+Q29uc3RyYWludDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db25zdHJhaW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb25zdHJhaW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTlNUUkFJTlQgPSBlSU5TVEFOQ0UuZ2V0Q29uc3RyYWludCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Qm9keTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlNUUkFJTlRfX0JPRFkgPSBlSU5TVEFOQ0UuZ2V0Q29uc3RyYWludF9Cb2R5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbCA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwgPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05URU5UX0VMRU1FTlRfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVOVF9FTEVNRU5UX19BU1NFVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCA8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERVNDUklCQUJMRV9FTEVNRU5UID0gZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IGVJTlNUQU5DRQotCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OID0gZUlOU1RBTkNFCi0JCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwgPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZWN0aW9uSW1wbCA8ZW0+U2VjdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZWN0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTZWN0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0U2VjdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVElPTl9fU0VDVElPTl9OQU1FID0gZUlOU1RBTkNFLmdldFNlY3Rpb25fU2VjdGlvbk5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb24gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRUNUSU9OX19TRUNUSU9OX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldFNlY3Rpb25fU2VjdGlvbkRlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgU2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFQ1RJT05fX1NVQl9TRUNUSU9OUyA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uX1N1YlNlY3Rpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFQ1RJT05fX1BSRURFQ0VTU09SID0gZUlOU1RBTkNFLmdldFNlY3Rpb25fUHJlZGVjZXNzb3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlSW1wbCA8ZW0+Um9sZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPTEUgPSBlSU5TVEFOQ0UuZ2V0Um9sZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TW9kaWZpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJPTEVfX01PRElGSUVTID0gZUlOU1RBTkNFLmdldFJvbGVfTW9kaWZpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIEZvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUk9MRV9fUkVTUE9OU0lCTEVfRk9SID0gZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX1BST0RVQ1RfX1JFUE9SVFMgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS19QUk9EVUNUX19UT09MX01FTlRPUlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbCA8ZW0+VGFzazwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRBU0sgPSBlSU5TVEFOQ0UuZ2V0VGFzaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19fUEVSRk9STUVEX0JZID0gZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hbmRhdG9yeSBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19fTUFOREFUT1JZX0lOUFVUID0gZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19fT1VUUFVUID0gZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX19PUFRJT05BTF9JTlBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0ZXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX19TVEVQUyA9IGVJTlNUQU5DRS5nZXRUYXNrX1N0ZXBzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfX1RPT0xfTUVOVE9SUyA9IGVJTlNUQU5DRS5nZXRUYXNrX1Rvb2xNZW50b3JzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsIDxlbT5Xb3JrIERlZmluaXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtEZWZpbml0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfREVGSU5JVElPTiA9IGVJTlNUQU5DRS5nZXRXb3JrRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya0RlZmluaXRpb25fUHJlY29uZGl0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdGVwSW1wbCA8ZW0+U3RlcDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdGVwSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTdGVwKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNURVAgPSBlSU5TVEFOQ0UuZ2V0U3RlcCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRhbmNlSW1wbCA8ZW0+R3VpZGFuY2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGFuY2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEd1aWRhbmNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdVSURBTkNFID0gZUlOU1RBTkNFLmdldEd1aWRhbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3RJbXBsIDxlbT5BcnRpZmFjdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QXJ0aWZhY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVJUSUZBQ1QgPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lciBBcnRpZmFjdDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUID0gZUlOU1RBTkNFCi0JCQkJLmdldEFydGlmYWN0X0NvbnRhaW5lckFydGlmYWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250YWluZWQgQXJ0aWZhY3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwgPGVtPkRlbGl2ZXJhYmxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZWxpdmVyYWJsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERUxJVkVSQUJMRSA9IGVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5PdXRjb21lSW1wbCA8ZW0+T3V0Y29tZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5PdXRjb21lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRPdXRjb21lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE9VVENPTUUgPSBlSU5TVEFOQ0UuZ2V0T3V0Y29tZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RQYWNrYWdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9QQUNLQUdFID0gZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9QQUNLQUdFX19HTE9CQUwgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZV9HbG9iYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQYWNrYWdlX1JldXNlZFBhY2thZ2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGlsZCBQYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRQYWNrYWdlSW1wbCA8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRQYWNrYWdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50UGFja2FnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05URU5UX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudFBhY2thZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbCA8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBUlRJRkFDVF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CcmllZiBPdXRsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uT3B0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORyA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0ltcGFjdE9mTm90SGF2aW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9SZWFzb25zRm9yTm90TmVlZGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsIDxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFTElWRVJBQkxFX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFja2FnaW5nIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRSA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbCA8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2tpbGxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9ERVNDUklQVElPTl9fU0tJTExTID0gZUlOU1RBTkNFCi0JCQkJLmdldFJvbGVEZXNjcmlwdGlvbl9Ta2lsbHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN5bm9ueW1zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0aW9uSW1wbCA8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRhc2tEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUQVNLX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwgPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRhbmNlRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEd1aWRhbmNlRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgR1VJREFOQ0VfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXR0YWNobWVudHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBHVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsIDxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBSQUNUSUNFX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFByYWN0aWNlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWwgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk8gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BZGRpdGlvbmFsSW5mbygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvYmxlbTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNID0gZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EID0gZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R29hbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXBwbGljYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BcHBsaWNhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGV2ZWxzIE9mIEFkb3B0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2ludEltcGwgPGVtPlBvaW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvaW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQb2ludCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQT0lOVCA9IGVJTlNUQU5DRS5nZXRQb2ludCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBPSU5UX19YID0gZUlOU1RBTkNFLmdldFBvaW50X1goKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT0lOVF9fWSA9IGVJTlNUQU5DRS5nZXRQb2ludF9ZKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFbGVtZW50SW1wbCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEdyYXBoRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBHUkFQSF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEdyYXBoRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBHUkFQSF9FTEVNRU5UX19QT1NJVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRHcmFwaEVsZW1lbnRfUG9zaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEID0gZUlOU1RBTkNFCi0JCQkJLmdldEdyYXBoRWxlbWVudF9Db250YWluZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEdSQVBIX0VMRU1FTlRfX0xJTksgPSBlSU5TVEFOQ0UuZ2V0R3JhcGhFbGVtZW50X0xpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFuY2hvcmFnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFID0gZUlOU1RBTkNFCi0JCQkJLmdldEdyYXBoRWxlbWVudF9BbmNob3JhZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlbWFudGljIE1vZGVsPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0R3JhcGhFbGVtZW50X1NlbWFudGljTW9kZWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtRWxlbWVudEltcGwgPGVtPkRpYWdyYW0gRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlhZ3JhbUVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRElBR1JBTV9FTEVNRU5UID0gZUlOU1RBTkNFLmdldERpYWdyYW1FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFID0gZUlOU1RBTkNFCi0JCQkJLmdldERpYWdyYW1FbGVtZW50X0lzVmlzaWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSID0gZUlOU1RBTkNFCi0JCQkJLmdldERpYWdyYW1FbGVtZW50X0NvbnRhaW5lcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRSA9IGVJTlNUQU5DRQotCQkJCS5nZXREaWFncmFtRWxlbWVudF9SZWZlcmVuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZID0gZUlOU1RBTkNFCi0JCQkJLmdldERpYWdyYW1FbGVtZW50X1Byb3BlcnR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUxpbmtJbXBsIDxlbT5EaWFncmFtIExpbms8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUxpbmtJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpYWdyYW1MaW5rKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERJQUdSQU1fTElOSyA9IGVJTlNUQU5DRS5nZXREaWFncmFtTGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Wm9vbTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJQUdSQU1fTElOS19fWk9PTSA9IGVJTlNUQU5DRS5nZXREaWFncmFtTGlua19ab29tKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WaWV3cG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJQUdSQU1fTElOS19fVklFV1BPUlQgPSBlSU5TVEFOQ0UuZ2V0RGlhZ3JhbUxpbmtfVmlld3BvcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UID0gZUlOU1RBTkNFCi0JCQkJLmdldERpYWdyYW1MaW5rX0dyYXBoRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJQUdSQU1fTElOS19fRElBR1JBTSA9IGVJTlNUQU5DRS5nZXREaWFncmFtTGlua19EaWFncmFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhDb25uZWN0b3JJbXBsIDxlbT5HcmFwaCBDb25uZWN0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhDb25uZWN0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEdyYXBoQ29ubmVjdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdSQVBIX0NPTk5FQ1RPUiA9IGVJTlNUQU5DRS5nZXRHcmFwaENvbm5lY3RvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBHUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBFZGdlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBHUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VER0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFZGdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VtYW50aWNNb2RlbEJyaWRnZUltcGwgPGVtPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZW1hbnRpY01vZGVsQnJpZGdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTZW1hbnRpY01vZGVsQnJpZGdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFTUFOVElDX01PREVMX0JSSURHRSA9IGVJTlNUQU5DRS5nZXRTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRTZW1hbnRpY01vZGVsQnJpZGdlX1ByZXNlbnRhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9HcmFwaEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW08L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNID0gZUlOU1RBTkNFCi0JCQkJLmdldFNlbWFudGljTW9kZWxCcmlkZ2VfRGlhZ3JhbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpbWVuc2lvbkltcGwgPGVtPkRpbWVuc2lvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaW1lbnNpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpbWVuc2lvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBESU1FTlNJT04gPSBlSU5TVEFOQ0UuZ2V0RGltZW5zaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJTUVOU0lPTl9fV0lEVEggPSBlSU5TVEFOQ0UuZ2V0RGltZW5zaW9uX1dpZHRoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESU1FTlNJT05fX0hFSUdIVCA9IGVJTlNUQU5DRS5nZXREaW1lbnNpb25fSGVpZ2h0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVmZXJlbmNlSW1wbCA8ZW0+UmVmZXJlbmNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlZmVyZW5jZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UmVmZXJlbmNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFRkVSRU5DRSA9IGVJTlNUQU5DRS5nZXRSZWZlcmVuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRUZFUkVOQ0VfX0lTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UmVmZXJlbmNlX0lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVGRVJFTkNFX19SRUZFUkVOQ0VEID0gZUlOU1RBTkNFLmdldFJlZmVyZW5jZV9SZWZlcmVuY2VkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvcGVydHlJbXBsIDxlbT5Qcm9wZXJ0eTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9wZXJ0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvcGVydHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPktleTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST1BFUlRZX19LRVkgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHlfS2V5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST1BFUlRZX19WQUxVRSA9IGVJTlNUQU5DRS5nZXRQcm9wZXJ0eV9WYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWRnZUltcGwgPGVtPkdyYXBoIEVkZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFZGdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaEVkZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgR1JBUEhfRURHRSA9IGVJTlNUQU5DRS5nZXRHcmFwaEVkZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFuY2hvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfRURHRV9fQU5DSE9SID0gZUlOU1RBTkNFLmdldEdyYXBoRWRnZV9BbmNob3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldheXBvaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfRURHRV9fV0FZUE9JTlRTID0gZUlOU1RBTkNFLmdldEdyYXBoRWRnZV9XYXlwb2ludHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtSW1wbCA8ZW0+RGlhZ3JhbTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaWFncmFtKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERJQUdSQU0gPSBlSU5TVEFOQ0UuZ2V0RGlhZ3JhbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Wm9vbTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJQUdSQU1fX1pPT00gPSBlSU5TVEFOQ0UuZ2V0RGlhZ3JhbV9ab29tKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WaWV3cG9pbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESUFHUkFNX19WSUVXUE9JTlQgPSBlSU5TVEFOQ0UuZ2V0RGlhZ3JhbV9WaWV3cG9pbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW0gTGluazwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElBR1JBTV9fRElBR1JBTV9MSU5LID0gZUlOU1RBTkNFLmdldERpYWdyYW1fRGlhZ3JhbUxpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJQUdSQU1fX05BTUVTUEFDRSA9IGVJTlNUQU5DRS5nZXREaWFncmFtX05hbWVzcGFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoTm9kZUltcGwgPGVtPkdyYXBoIE5vZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhOb2RlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaE5vZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgR1JBUEhfTk9ERSA9IGVJTlNUQU5DRS5nZXRHcmFwaE5vZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNpemU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBHUkFQSF9OT0RFX19TSVpFID0gZUlOU1RBTkNFLmdldEdyYXBoTm9kZV9TaXplKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsIDxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0U2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGUgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19UWVBFX0lORk8gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0U2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfVHlwZUluZm8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCA8ZW0+VU1BIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIDxlbT5Db3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRDb3JlU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTGVhZkVsZW1lbnRJbXBsIDxlbT5MZWFmIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTGVhZkVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldExlYWZFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIExFQUZfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRMZWFmRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRleHRFbGVtZW50SW1wbCA8ZW0+VGV4dCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRleHRFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZXh0RWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBURVhUX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0VGV4dEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBURVhUX0VMRU1FTlRfX1RFWFQgPSBlSU5TVEFOQ0UuZ2V0VGV4dEVsZW1lbnRfVGV4dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkltYWdlSW1wbCA8ZW0+SW1hZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuSW1hZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEltYWdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIElNQUdFID0gZUlOU1RBTkNFLmdldEltYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJTUFHRV9fVVJJID0gZUlOU1RBTkNFLmdldEltYWdlX1VyaSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWltZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSU1BR0VfX01JTUVfVFlQRSA9IGVJTlNUQU5DRS5nZXRJbWFnZV9NaW1lVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoaWNQcmltaXRpdmVJbXBsIDxlbT5HcmFwaGljIFByaW1pdGl2ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaGljUHJpbWl0aXZlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaGljUHJpbWl0aXZlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdSQVBISUNfUFJJTUlUSVZFID0gZUlOU1RBTkNFLmdldEdyYXBoaWNQcmltaXRpdmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2x5bGluZUltcGwgPGVtPlBvbHlsaW5lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvbHlsaW5lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQb2x5bGluZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQT0xZTElORSA9IGVJTlNUQU5DRS5nZXRQb2x5bGluZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2xvc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUE9MWUxJTkVfX0NMT1NFRCA9IGVJTlNUQU5DRS5nZXRQb2x5bGluZV9DbG9zZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldheXBvaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUE9MWUxJTkVfX1dBWVBPSU5UUyA9IGVJTlNUQU5DRS5nZXRQb2x5bGluZV9XYXlwb2ludHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGxpcHNlSW1wbCA8ZW0+RWxsaXBzZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGxpcHNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFbGxpcHNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVMTElQU0UgPSBlSU5TVEFOQ0UuZ2V0RWxsaXBzZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmFkaXVzIFg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTExJUFNFX19SQURJVVNfWCA9IGVJTlNUQU5DRS5nZXRFbGxpcHNlX1JhZGl1c1goKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJhZGl1cyBZPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUxMSVBTRV9fUkFESVVTX1kgPSBlSU5TVEFOQ0UuZ2V0RWxsaXBzZV9SYWRpdXNZKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVMTElQU0VfX1JPVEFUSU9OID0gZUlOU1RBTkNFLmdldEVsbGlwc2VfUm90YXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IEFuZ2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUxMSVBTRV9fU1RBUlRfQU5HTEUgPSBlSU5TVEFOQ0UuZ2V0RWxsaXBzZV9TdGFydEFuZ2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbmQgQW5nbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTExJUFNFX19FTkRfQU5HTEUgPSBlSU5TVEFOQ0UuZ2V0RWxsaXBzZV9FbmRBbmdsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2VudGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUxMSVBTRV9fQ0VOVEVSID0gZUlOU1RBTkNFLmdldEVsbGlwc2VfQ2VudGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsIDxlbT5BY3Rpdml0eTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QWN0aXZpdHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQUNUSVZJVFkgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFDVElWSVRZX19ST0FETUFQUyA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Sb2FkbWFwcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9TdXBwb3J0aW5nTWF0ZXJpYWxzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBQ1RJVklUWV9fQ0hFQ0tMSVNUUyA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9DaGVja2xpc3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQUNUSVZJVFlfX0NPTkNFUFRTID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X0NvbmNlcHRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQUNUSVZJVFlfX0VYQU1QTEVTID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X0V4YW1wbGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBQ1RJVklUWV9fR1VJREVMSU5FUyA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9HdWlkZWxpbmVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFDVElWSVRZX19SRVVTQUJMRV9BU1NFVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfUmV1c2FibGVBc3NldHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX19JU19FTkFDVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfSXNFbmFjdGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwgPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfQlJFQUtET1dOX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzUmVwZWF0YWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkcgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGluayBUbyBQcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUiA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsIDxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEJSRUFLRE9XTl9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVggPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUiA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0aWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWlsZXN0b25lSW1wbCA8ZW0+TWlsZXN0b25lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1pbGVzdG9uZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWlsZXN0b25lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1JTEVTVE9ORSA9IGVJTlNUQU5DRS5nZXRNaWxlc3RvbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JdGVyYXRpb25JbXBsIDxlbT5JdGVyYXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuSXRlcmF0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRJdGVyYXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSVRFUkFUSU9OID0gZUlOU1RBTkNFLmdldEl0ZXJhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBoYXNlSW1wbCA8ZW0+UGhhc2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGhhc2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBoYXNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBIQVNFID0gZUlOU1RBTkNFLmdldFBoYXNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsIDxlbT5UZWFtIFByb2ZpbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRlYW1Qcm9maWxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRFQU1fUFJPRklMRSA9IGVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGVhbSBSb2xlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTID0gZUlOU1RBTkNFCi0JCQkJLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgVGVhbTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSA9IGVJTlNUQU5DRQotCQkJCS5nZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YiBUZWFtPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBURUFNX1BST0ZJTEVfX1NVQl9URUFNID0gZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwgPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZURlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUk9MRV9ERVNDUklQVE9SX19ST0xFID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1vZGlmaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBST0xFX0RFU0NSSVBUT1JfX01PRElGSUVTID0gZUlOU1RBTkNFCi0JCQkJLmdldFJvbGVEZXNjcmlwdG9yX01vZGlmaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SID0gZUlOU1RBTkNFCi0JCQkJLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya09yZGVySW1wbCA8ZW0+V29yayBPcmRlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtPcmRlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX09SREVSID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGluayBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19PUkRFUl9fTElOS19UWVBFID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlcl9MaW5rVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfT1JERVJfX1BSRUQgPSBlSU5TVEFOQ0UuZ2V0V29ya09yZGVyX1ByZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGwgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0VsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19FTEVNRU5UID0gZUlOU1RBTkNFLmdldFByb2Nlc3NFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbCA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBsYW5uaW5nRGF0YSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQTEFOTklOR19EQVRBID0gZUlOU1RBTkNFLmdldFBsYW5uaW5nRGF0YSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQTEFOTklOR19EQVRBX19GSU5JU0hfREFURSA9IGVJTlNUQU5DRQotCQkJCS5nZXRQbGFubmluZ0RhdGFfRmluaXNoRGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmFuazwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBMQU5OSU5HX0RBVEFfX1JBTksgPSBlSU5TVEFOQ0UuZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9ySW1wbCA8ZW0+RGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gZUlOU1RBTkNFCi0JCQkJLmdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsIDxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRBU0tfREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFzazwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfREVTQ1JJUFRPUl9fVEFTSyA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFzc2lzdGVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hbmRhdG9yeSBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19ERVNDUklQVE9SX19PVVRQVVQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWxlY3RlZCBTdGVwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19ERVNDUklQVE9SX19TRUxFQ1RFRF9TVEVQUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURSA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBFeGl0IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0ZWQgQnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWSA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlbGl2ZXJhYmxlIFBhcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbCA8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29tcG9zaXRlUm9sZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29tcG9zaXRlUm9sZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT01QT1NJVEVfUk9MRSA9IGVJTlNUQU5DRS5nZXRDb21wb3NpdGVSb2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZ2dyZWdhdGVkIFJvbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwgPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCA8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBQ1RJVklUWV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ib3d0byBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRiA9IGVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fU2NhbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1MgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmlzayBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFID0gZUlOU1RBTkNFCi0JCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRSA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlIE9mIENvbnRyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVCA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NEZXNjcmlwdGlvbkltcGwgPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX0V4dGVybmFsSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBOb3RlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCA8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERVNDUklQVE9SX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmaW5lZCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbmNlcHRJbXBsIDxlbT5Db25jZXB0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbmNlcHRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbmNlcHQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OQ0VQVCA9IGVJTlNUQU5DRS5nZXRDb25jZXB0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2hlY2tsaXN0SW1wbCA8ZW0+Q2hlY2tsaXN0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNoZWNrbGlzdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q2hlY2tsaXN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENIRUNLTElTVCA9IGVJTlNUQU5DRS5nZXRDaGVja2xpc3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FeGFtcGxlSW1wbCA8ZW0+RXhhbXBsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FeGFtcGxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFeGFtcGxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVYQU1QTEUgPSBlSU5TVEFOQ0UuZ2V0RXhhbXBsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRlbGluZUltcGwgPGVtPkd1aWRlbGluZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkZWxpbmVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEd1aWRlbGluZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBHVUlERUxJTkUgPSBlSU5TVEFOQ0UuZ2V0R3VpZGVsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbCA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gZUlOU1RBTkNFCi0JCQkJLmdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlcG9ydEltcGwgPGVtPlJlcG9ydDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZXBvcnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJlcG9ydCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBSRVBPUlQgPSBlSU5TVEFOQ0UuZ2V0UmVwb3J0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVtcGxhdGVJbXBsIDxlbT5UZW1wbGF0ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZW1wbGF0ZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVtcGxhdGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEVNUExBVEUgPSBlSU5TVEFOQ0UuZ2V0VGVtcGxhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN1cHBvcnRpbmdNYXRlcmlhbEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNVUFBPUlRJTkdfTUFURVJJQUwgPSBlSU5TVEFOQ0UuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbE1lbnRvckltcGwgPGVtPlRvb2wgTWVudG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRvb2xNZW50b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRvb2xNZW50b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVE9PTF9NRU5UT1IgPSBlSU5TVEFOQ0UuZ2V0VG9vbE1lbnRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldoaXRlcGFwZXJJbXBsIDxlbT5XaGl0ZXBhcGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldoaXRlcGFwZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdoaXRlcGFwZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV0hJVEVQQVBFUiA9IGVJTlNUQU5DRS5nZXRXaGl0ZXBhcGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVybURlZmluaXRpb25JbXBsIDxlbT5UZXJtIERlZmluaXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVybURlZmluaXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRlcm1EZWZpbml0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRFUk1fREVGSU5JVElPTiA9IGVJTlNUQU5DRS5nZXRUZXJtRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlSW1wbCA8ZW0+UHJhY3RpY2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByYWN0aWNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBSQUNUSUNFID0gZUlOU1RBTkNFLmdldFByYWN0aWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgUHJhY3RpY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUkFDVElDRV9fU1VCX1BSQUNUSUNFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZV9TdWJQcmFjdGljZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZpdHkgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmV1c2FibGVBc3NldEltcGwgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJldXNhYmxlQXNzZXRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJldXNhYmxlQXNzZXQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVVU0FCTEVfQVNTRVQgPSBlSU5TVEFOQ0UuZ2V0UmV1c2FibGVBc3NldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0YXRlSW1wbCA8ZW0+U3RhdGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RhdGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFN0YXRlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNUQVRFID0gZUlOU1RBTkNFLmdldFN0YXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNUQVRFX19XT1JLX1BST0RVQ1QgPSBlSU5TVEFOQ0UuZ2V0U3RhdGVfV29ya1Byb2R1Y3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZ2lvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU1RBVEVfX1JFR0lPTiA9IGVJTlNUQU5DRS5nZXRTdGF0ZV9SZWdpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1Ym1hY2hpbmU8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTVEFURV9fU1VCTUFDSElORSA9IGVJTlNUQU5DRS5nZXRTdGF0ZV9TdWJtYWNoaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVmVydGV4SW1wbCA8ZW0+VmVydGV4PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlZlcnRleEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VmVydGV4KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFZFUlRFWCA9IGVJTlNUQU5DRS5nZXRWZXJ0ZXgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBWRVJURVhfX0NPTlRBSU5FUiA9IGVJTlNUQU5DRS5nZXRWZXJ0ZXhfQ29udGFpbmVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZzwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVkVSVEVYX19PVVRHT0lORyA9IGVJTlNUQU5DRS5nZXRWZXJ0ZXhfT3V0Z29pbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBWRVJURVhfX0lOQ09NSU5HID0gZUlOU1RBTkNFLmdldFZlcnRleF9JbmNvbWluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlZ2lvbkltcGwgPGVtPlJlZ2lvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZWdpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJlZ2lvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBSRUdJT04gPSBlSU5TVEFOQ0UuZ2V0UmVnaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJ0ZXg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFR0lPTl9fVkVSVEVYID0gZUlOU1RBTkNFLmdldFJlZ2lvbl9WZXJ0ZXgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRyYW5zaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFR0lPTl9fVFJBTlNJVElPTiA9IGVJTlNUQU5DRS5nZXRSZWdpb25fVHJhbnNpdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3RhdGU8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVHSU9OX19TVEFURSA9IGVJTlNUQU5DRS5nZXRSZWdpb25fU3RhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0YXRlIE1hY2hpbmU8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVHSU9OX19TVEFURV9NQUNISU5FID0gZUlOU1RBTkNFLmdldFJlZ2lvbl9TdGF0ZU1hY2hpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdGF0ZU1hY2hpbmVJbXBsIDxlbT5TdGF0ZSBNYWNoaW5lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0YXRlTWFjaGluZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3RhdGVNYWNoaW5lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNUQVRFX01BQ0hJTkUgPSBlSU5TVEFOQ0UuZ2V0U3RhdGVNYWNoaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWdpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNUQVRFX01BQ0hJTkVfX1JFR0lPTiA9IGVJTlNUQU5DRS5nZXRTdGF0ZU1hY2hpbmVfUmVnaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVHJhbnNpdGlvbkltcGwgPGVtPlRyYW5zaXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVHJhbnNpdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VHJhbnNpdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUUkFOU0lUSU9OID0gZUlOU1RBTkNFLmdldFRyYW5zaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldvcmsgRGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVFJBTlNJVElPTl9fV09SS19ERUZJTklUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldFRyYW5zaXRpb25fV29ya0RlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUUkFOU0lUSU9OX19DT05UQUlORVIgPSBlSU5TVEFOQ0UuZ2V0VHJhbnNpdGlvbl9Db250YWluZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvdXJjZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRSQU5TSVRJT05fX1NPVVJDRSA9IGVJTlNUQU5DRS5nZXRUcmFuc2l0aW9uX1NvdXJjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVFJBTlNJVElPTl9fVEFSR0VUID0gZUlOU1RBTkNFLmdldFRyYW5zaXRpb25fVGFyZ2V0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHNldWRvU3RhdGVJbXBsIDxlbT5Qc2V1ZG8gU3RhdGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHNldWRvU3RhdGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBzZXVkb1N0YXRlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBTRVVET19TVEFURSA9IGVJTlNUQU5DRS5nZXRQc2V1ZG9TdGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsIDxlbT5EaXNjaXBsaW5lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpc2NpcGxpbmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRElTQ0lQTElORSA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXNrczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElTQ0lQTElORV9fVEFTS1MgPSBlSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9UYXNrcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViZGlzY2lwbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElTQ0lQTElORV9fU1VCRElTQ0lQTElORSA9IGVJTlNUQU5DRQotCQkJCS5nZXREaXNjaXBsaW5lX1N1YmRpc2NpcGxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBXb3JrZmxvd3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1MgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvd3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsIDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRDYXRlZ29yeUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudENhdGVnb3J5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTlRFTlRfQ0FURUdPUlkgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudENhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEltcGwgPGVtPlJvbGUgU2V0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVTZXRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVTZXQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9TRVQgPSBlSU5TVEFOQ0UuZ2V0Um9sZVNldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJPTEVfU0VUX19ST0xFUyA9IGVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRG9tYWluSW1wbCA8ZW0+RG9tYWluPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRvbWFpbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RG9tYWluKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERPTUFJTiA9IGVJTlNUQU5DRS5nZXREb21haW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERPTUFJTl9fV09SS19QUk9EVUNUUyA9IGVJTlNUQU5DRS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWJkb21haW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBET01BSU5fX1NVQkRPTUFJTlMgPSBlSU5TVEFOQ0UuZ2V0RG9tYWluX1N1YmRvbWFpbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1RfVFlQRSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1RTID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsIDxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVHcm91cGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERJU0NJUExJTkVfR1JPVVBJTkcgPSBlSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNjaXBsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbEltcGwgPGVtPlRvb2w8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VG9vbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUT09MID0gZUlOU1RBTkNFLmdldFRvb2woKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVE9PTF9fVE9PTF9NRU5UT1JTID0gZUlOU1RBTkNFLmdldFRvb2xfVG9vbE1lbnRvcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsIDxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVTZXRHcm91cGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFX1NFVF9HUk9VUElORyA9IGVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGUgU2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwgPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ1VTVE9NX0NBVEVHT1JZID0gZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXRlZ29yaXplZCBFbGVtZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgQ2F0ZWdvcmllczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbCA8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJ5UHJvY2VzcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERUxJVkVSWV9QUk9DRVNTID0gZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2VzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWR1Y2F0aW9uIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUyA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWxzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUyA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzSW1wbCA8ZW0+UHJvY2VzczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1MgPSBlSU5TVEFOQ0UuZ2V0UHJvY2VzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZXMgUGF0dGVybnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NfSW5jbHVkZXNQYXR0ZXJucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBDb250ZXh0PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19fREVGQVVMVF9DT05URVhUID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NfRGVmYXVsdENvbnRleHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbGlkIENvbnRleHQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfX1ZBTElEX0NPTlRFWFQgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGwgPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ0FQQUJJTElUWV9QQVRURVJOID0gZUlOU1RBTkNFLmdldENhcGFiaWxpdHlQYXR0ZXJuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsIDxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNlZCBPbiBQcm9jZXNzZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VEX09OX1BST0NFU1NFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlZE9uUHJvY2Vzc2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9hZG1hcEltcGwgPGVtPlJvYWRtYXA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9hZG1hcEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9hZG1hcCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0FETUFQID0gZUlOU1RBTkNFLmdldFJvYWRtYXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCA8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0NPTVBPTkVOVCA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50X0ludGVyZmFjZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwgPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc1BhY2thZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19QQUNLQUdFID0gZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzUGFja2FnZV9EaWFncmFtcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZVNwZWNpZmljYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgSU88L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwgPGVtPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgQ29tcG9uZW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJPQ0VTU19DT01QT05FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfUHJvY2Vzc0NvbXBvbmVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwgPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RQbHVnaW4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EX1BMVUdJTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVzZXIgQ2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9QTFVHSU5fX0JBU0VTID0gZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9CYXNlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlZhcmlhYmlsaXR5RWxlbWVudEltcGwgPGVtPlZhcmlhYmlsaXR5IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVmFyaWFiaWxpdHlFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRWYXJpYWJpbGl0eUVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVkFSSUFCSUxJVFlfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRWYXJpYWJpbGl0eUVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBWQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFID0gZUlOU1RBTkNFCi0JCQkJLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBWQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gZUlOU1RBTkNFCi0JCQkJLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kVW5pdEltcGwgPGVtPk1ldGhvZCBVbml0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZFVuaXQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EX1VOSVQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9VTklUX19BVVRIT1JTID0gZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfQXV0aG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfVU5JVF9fVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RVbml0X1ZlcnNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9DT05GSUdVUkFUSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgVmlld3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZpZXc8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgQ29uZmlndXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT05TID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fQmFzZUNvbmZpZ3VyYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWJ0cmFjdGVkIENhdGVnb3J5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWSA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRkZWQgQ2F0ZWdvcnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWSA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRmFtaWx5SW1wbCA8ZW0+UHJvY2VzcyBGYW1pbHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0ZhbWlseUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0ZhbWlseSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0ZBTUlMWSA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzRmFtaWx5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfRkFNSUxZX19ERUxJVkVSWV9QUk9DRVNTRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0ZhbWlseV9EZWxpdmVyeVByb2Nlc3NlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsIDxlbT5NZXRob2QgTGlicmFyeTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RMaWJyYXJ5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9MSUJSQVJZID0gZUlOU1RBTkNFLmdldE1ldGhvZExpYnJhcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlIDxlbT5Xb3JrIE9yZGVyIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrT3JkZXJUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gV09SS19PUkRFUl9UWVBFID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlclR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHNldWRvU3RhdGVLaW5kIDxlbT5Qc2V1ZG8gU3RhdGUgS2luZDwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qc2V1ZG9TdGF0ZUtpbmQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHNldWRvU3RhdGVLaW5kKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gUFNFVURPX1NUQVRFX0tJTkQgPSBlSU5TVEFOQ0UuZ2V0UHNldWRvU3RhdGVLaW5kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gVkFSSUFCSUxJVFlfVFlQRSA9IGVJTlNUQU5DRS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkRhdGU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLnV0aWwuRGF0ZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREYXRlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIERBVEUgPSBlSU5TVEFOQ0UuZ2V0RGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+VXJpPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5uZXQuVVJJCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFVyaSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBVUkkgPSBlSU5TVEFOQ0UuZ2V0VXJpKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5VbmxpbWl0ZWQgTmF0dXJhbDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRVbmxpbWl0ZWROYXR1cmFsKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFVOTElNSVRFRF9OQVRVUkFMID0gZUlOU1RBTkNFLmdldFVubGltaXRlZE5hdHVyYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlN0cmluZzwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3RyaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFNUUklORyA9IGVJTlNUQU5DRS5nZXRTdHJpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlNldDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEudXRpbC5TZXQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2V0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFNFVCA9IGVJTlNUQU5DRS5nZXRTZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlNlcXVlbmNlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS51dGlsLkxpc3QKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2VxdWVuY2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgU0VRVUVOQ0UgPSBlSU5TVEFOQ0UuZ2V0U2VxdWVuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkludGVnZXI8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0SW50ZWdlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBJTlRFR0VSID0gZUlOU1RBTkNFLmdldEludGVnZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkZsb2F0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLkZsb2F0Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEZsb2F0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIEZMT0FUID0gZUlOU1RBTkNFLmdldEZsb2F0KCk7Ci0KLQl9Ci0KLX0gLy9VbWFQYWNrYWdlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1ZhcmlhYmlsaXR5RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1ZhcmlhYmlsaXR5RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZWRkYTkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9WYXJpYWJpbGl0eUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlZhcmlhYmlsaXR5IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGNsYXNzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudCB0aGF0IHByb3ZpZGVzIG5ldyBjYXBhYmlsaXRpZXMgZm9yIGNvbnRlbnQgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gQ29udGVudCBFbGVtZW50cyBvciBhbnkgb3RoZXIgTWV0aG9kIEVsZW1lbnQgdGhhdCBkZXJpdmVzIGZyb20gaXQuICBJdCBoYXMgYmVlbiBwbGFjZWQgaW4tYmV0d2VlbiB0aGUgY2xhc3NlcyBNZXRob2QgRWxlbWVudCBhbmQgQ29udGVudCBFbGVtZW50IGluIHRoZSBvdmVyYWxsIFVNQSB0YXhvbm9teSBvZiBjbGFzc2VzIHVzaW5nIHRoZSBVTUwgMi4wIHBhY2thZ2UgbWVyZ2UgbWVjaGFuaXNtLiAgVGhlIGFzc29jaWF0aW9uIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHNoYWxsIG9ubHkgYmUgaW5zdGFudGlhdGVkIGJldHdlZW4gdHdvIHN1YmNsYXNzZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgc2FtZSB0eXBlLiAgVGhlIGVsZW1lbnQgb24gdmFyYWliaWxpdHlTcGVjaWFsRWxlbWVudCBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgZGVmaW5lcyBhIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZSBkZWZpbmluZyB0aGUgbmF0dXJlIG9mIHRoZSByZWxhdGlvbnNoaXAgdXNpbmcgYSBsaXRlcmFsIGZyb20gdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuCi0gKiBWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBtZXRhLW1vZGVsIHBhY2thZ2UgTWV0aG9kIFBsdWdpbnMgYWRkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIE1ldGhvZCBFbGVtZW50cyB0aGF0IGRlcml2ZSBmcm9tIGl0LiAgQnkgZGVmYXVsdCBhbGwgQ29udGVudCBFbGVtZW50cyBzdWNoIGFzIFJvbGUsIFRhc2ssIEd1aWRhbmNlIFR5cGVzLCBvciBBY3Rpdml0aWVzIGFyZSBkZWZpbmVkIHRvIGJlIFZhcmlhYmlsaXR5IEVsZW1lbnRzLgotICogVmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBwcm92aWRlcyB1bmlxdWUgbWVjaGFuaXNtcyBmb3IgY3VzdG9taXppbmcgbWV0aG9kIGNvbnRlbnQgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQsIGJ1dCBieSBqdXN0IGJlIGFibGUgdG8gZGVzY3JpYmUgd2l0aCBzZXBhcmF0ZSBvYmplY3RzIHRoZSBkaWZmZXJlbmNlcyAoYWRkaXRpb25zLCBjaGFuZ2VzLCBvbWlzc2lvbnMpIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbC4gIFRoaXMgcGx1Zy1pbiBjb25jZXB0IGFsbG93cyB1c2VycyB0byBmYWN0b3IgdGhlaXIgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBpbnRlcnJlbGF0ZWQgdW5pdHMgYW5kIGV2ZW4gdG8gYXJjaGl0ZWN0IG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gbGF5ZXJzIHRoYXQgZXh0ZW5kIGVhY2ggb3RoZXIgd2l0aCBuZXcgY2FwYWJpbGl0aWVzLiAgVGhlIHJlc3VsdGluZyBtZXRob2QgYW5kIHByb2Nlc3MgZGVzaWduIGNhbiBiZSBkeW5hbWljYWxseSBjb21iaW5lZCBhbmQgYXBwbGllZCBvbiBkZW1hbmQgdXNpbmcgdGhlIGludGVycHJldGF0aW9uIHJ1bGVzIGRlZmluZWQgZm9yIFZhcmlhYmlsaXR5IEVsZW1lbnQgU3BlY2lhbGl6YXRpb25zIGFzc2VtYmxpbmcgdG8gcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRoZSBtb3N0IGFjY3VyYXRlIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNjcmlwdGlvbnMgcG9zc2libGUuICBJdCBhbHNvIGFsbG93cyBwcm9jZXNzIHByYWN0aXRpb25lcnMgdG8gZXh0ZW5kcyBhbmQgdGFpbG9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgdGhleSBkbyBub3Qgb3duIGFuZCB0byBlYXNpbHkgdXBncmFkZSB0byBuZXdlciB2ZXJzaW9ucyBieSBzaW1wbHkgcmVhcHBseSB0aGVpciBwZXJzb25hbCBjaGFuZ2VzIHRvIHRoZXNlIHVwZ3JhZGVzLgotICogVmFyaWFiaWxpdHkgRWxlbWVudCBkZWZpbmVzIHR3byB0eXBlcyBvZiB2YXJpYWJpbGl0eSBhbmQgb25lIHR5cGUgb2YgZXh0ZW5zaW9uIHdoaWNoIGFyZSBmb3JtYWxseSBkZWZpbmVkIGZvciB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50I2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRWYXJpYWJpbGl0eUVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhcmlhYmlsaXR5RWxlbWVudCBleHRlbmRzIE1ldGhvZEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4ibmEiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBJZiBpbiBpbnN0YW5jZSBvZiB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsaXphdGlvbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byBWYXJpYWJpbGl0eSBFbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlIGV4aXN0cywgdGhlbiB0aGUgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgaG93IHRoZSBlbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxFbGVtZW50IGVuZCBvZiB0aGUgYXNzb2NpYXRpb24gY2hhbmdlcyB0aGUgQ29udGVudCBFbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IGVuZC4gU2VlIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGVudW1lcmF0aW9uIGNsYXNzIGZvciBkZWZpbml0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiB2YXJpYWJpbGl0eS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5VHlwZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9Im5hIiB1bmlxdWU9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlWYXJpYWJpbGl0eVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVZhcmlhYmlsaXR5RWxlbWVudCBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCB2YWx1ZSk7Ci0KLX0gLy8gVmFyaWFiaWxpdHlFbGVtZW50CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVmFyaWFiaWxpdHlUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVmFyaWFiaWxpdHlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY5YTA0YzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1ZhcmlhYmlsaXR5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVmFyaWFiaWxpdHkgVHlwZSBpcyBhbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRWYXJpYWJpbGl0eVR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWYXJpYWJpbGl0eVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5hPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OYTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOQV9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9Im5hIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnRyaWJ1dGVzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Db250cmlidXRlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05UUklCVVRFU19MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9ImNvbnRyaWJ1dGVzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRSSUJVVEVTID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkV4dGVuZHM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkV4dGVuZHM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVhURU5EU19MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9ImV4dGVuZHMiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhURU5EUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UmVwbGFjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVQTEFDRVNfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJyZXBsYWNlcyIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBMQUNFUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Mb2NhbCBDb250cmlidXRpb248L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkxvY2FsIENvbnRyaWJ1dGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMT0NBTF9DT05UUklCVVRJT05fTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJsb2NhbENvbnRyaWJ1dGlvbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTF9DT05UUklCVVRJT04gPSA0OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWwgUmVwbGFjZW1lbnQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkxvY2FsIFJlcGxhY2VtZW50PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMX1JFUExBQ0VNRU5UX0xJVEVSQUwKLQkgKiBAbW9kZWwgbmFtZT0ibG9jYWxSZXBsYWNlbWVudCIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTF9SRVBMQUNFTUVOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FeHRlbmRzIFJlcGxhY2VzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FeHRlbmRzIFJlcGxhY2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYVEVORFNfUkVQTEFDRVNfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJleHRlbmRzUmVwbGFjZXMiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhURU5EU19SRVBMQUNFUyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OYTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOQQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFyaWFiaWxpdHlUeXBlIE5BX0xJVEVSQUwgPSBuZXcgVmFyaWFiaWxpdHlUeXBlKE5BLAotCQkJIm5hIiwgIm5hIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db250cmlidXRlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05UUklCVVRFUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFyaWFiaWxpdHlUeXBlIENPTlRSSUJVVEVTX0xJVEVSQUwgPSBuZXcgVmFyaWFiaWxpdHlUeXBlKAotCQkJQ09OVFJJQlVURVMsICJjb250cmlidXRlcyIsICJjb250cmlidXRlcyIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RXh0ZW5kczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWFRFTkRTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGUgRVhURU5EU19MSVRFUkFMID0gbmV3IFZhcmlhYmlsaXR5VHlwZSgKLQkJCUVYVEVORFMsICJleHRlbmRzIiwgImV4dGVuZHMiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJlcGxhY2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFUExBQ0VTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGUgUkVQTEFDRVNfTElURVJBTCA9IG5ldyBWYXJpYWJpbGl0eVR5cGUoCi0JCQlSRVBMQUNFUywgInJlcGxhY2VzIiwgInJlcGxhY2VzIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Mb2NhbCBDb250cmlidXRpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfQ09OVFJJQlVUSU9OCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGUgTE9DQUxfQ09OVFJJQlVUSU9OX0xJVEVSQUwgPSBuZXcgVmFyaWFiaWxpdHlUeXBlKAotCQkJTE9DQUxfQ09OVFJJQlVUSU9OLCAibG9jYWxDb250cmlidXRpb24iLCAibG9jYWxDb250cmlidXRpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Mb2NhbCBSZXBsYWNlbWVudDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMT0NBTF9SRVBMQUNFTUVOVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFyaWFiaWxpdHlUeXBlIExPQ0FMX1JFUExBQ0VNRU5UX0xJVEVSQUwgPSBuZXcgVmFyaWFiaWxpdHlUeXBlKAotCQkJTE9DQUxfUkVQTEFDRU1FTlQsICJsb2NhbFJlcGxhY2VtZW50IiwgImxvY2FsUmVwbGFjZW1lbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FeHRlbmRzIFJlcGxhY2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYVEVORFNfUkVQTEFDRVMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBFWFRFTkRTX1JFUExBQ0VTX0xJVEVSQUwgPSBuZXcgVmFyaWFiaWxpdHlUeXBlKAotCQkJRVhURU5EU19SRVBMQUNFUywgImV4dGVuZHNSZXBsYWNlcyIsICJleHRlbmRzUmVwbGFjZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmFyaWFiaWxpdHlUeXBlW10gVkFMVUVTX0FSUkFZID0gbmV3IFZhcmlhYmlsaXR5VHlwZVtdIHsKLQkJCU5BX0xJVEVSQUwsIENPTlRSSUJVVEVTX0xJVEVSQUwsIEVYVEVORFNfTElURVJBTCwgUkVQTEFDRVNfTElURVJBTCwKLQkJCUxPQ0FMX0NPTlRSSUJVVElPTl9MSVRFUkFMLCBMT0NBTF9SRVBMQUNFTUVOVF9MSVRFUkFMLAotCQkJRVhURU5EU19SRVBMQUNFU19MSVRFUkFMLCB9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cwotCQkJLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhcmlhYmlsaXR5VHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVZhcmlhYmlsaXR5VHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCWNhc2UgTkE6Ci0JCQlyZXR1cm4gTkFfTElURVJBTDsKLQkJY2FzZSBDT05UUklCVVRFUzoKLQkJCXJldHVybiBDT05UUklCVVRFU19MSVRFUkFMOwotCQljYXNlIEVYVEVORFM6Ci0JCQlyZXR1cm4gRVhURU5EU19MSVRFUkFMOwotCQljYXNlIFJFUExBQ0VTOgotCQkJcmV0dXJuIFJFUExBQ0VTX0xJVEVSQUw7Ci0JCWNhc2UgTE9DQUxfQ09OVFJJQlVUSU9OOgotCQkJcmV0dXJuIExPQ0FMX0NPTlRSSUJVVElPTl9MSVRFUkFMOwotCQljYXNlIExPQ0FMX1JFUExBQ0VNRU5UOgotCQkJcmV0dXJuIExPQ0FMX1JFUExBQ0VNRU5UX0xJVEVSQUw7Ci0JCWNhc2UgRVhURU5EU19SRVBMQUNFUzoKLQkJCXJldHVybiBFWFRFTkRTX1JFUExBQ0VTX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmFyaWFiaWxpdHlUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9WYXJpYWJpbGl0eVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9WZXJ0ZXguamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9WZXJ0ZXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmNiMmI1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVmVydGV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JTW9kZWxPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlZlcnRleDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZlcnRleCNnZXRDb250YWluZXJfIDxlbT5Db250YWluZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmVydGV4I2dldE91dGdvaW5nIDxlbT5PdXRnb2luZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXgjZ2V0SW5jb21pbmcgPGVtPkluY29taW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VmVydGV4KCkKLSAqIEBtb2RlbAotICogQGV4dGVuZHMgSU1vZGVsT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmVydGV4IGV4dGVuZHMgSU1vZGVsT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb24jZ2V0VmVydGV4IDxlbT5WZXJ0ZXg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGFpbmVyPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWluZXI8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb250YWluZXIoUmVnaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFZlcnRleF9Db250YWluZXIoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb24jZ2V0VmVydGV4Ci0JICogQG1vZGVsIG9wcG9zaXRlPSJWZXJ0ZXgiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlZ2lvbiBnZXRDb250YWluZXJfKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZlcnRleCNnZXRDb250YWluZXJfIDxlbT5Db250YWluZXI8L2VtPn0nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWluZXI8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb250YWluZXJfKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb250YWluZXIoUmVnaW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dGdvaW5nPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9ufS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRyYW5zaXRpb24jZ2V0U291cmNlIDxlbT5Tb3VyY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3V0Z29pbmc8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRnb2luZzwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRWZXJ0ZXhfT3V0Z29pbmcoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uI2dldFNvdXJjZQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlRyYW5zaXRpb24iIG9wcG9zaXRlPSJzb3VyY2UiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE91dGdvaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmNvbWluZzwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbn0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uI2dldFRhcmdldCA8ZW0+VGFyZ2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluY29taW5nPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5jb21pbmc8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VmVydGV4X0luY29taW5nKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbiNnZXRUYXJnZXQKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uIiBvcHBvc2l0ZT0idGFyZ2V0IiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJbmNvbWluZygpOwotCi19IC8vIFZlcnRleApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9XaGl0ZXBhcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV2hpdGVwYXBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMWU2ZDI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9XaGl0ZXBhcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogV2hpdGVwYXBlcnMgYXJlIGEgc3BlY2lhbCBDb25jZXB0IGd1aWRhbmNlIHRoYXQgaGF2ZSBiZWVuIGV4dGVybmFsbHkgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbiBpc29sYXRpb24gb2Ygb3RoZXIgY29udGVudCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdoaXRlcGFwZXIoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2hpdGVwYXBlciBleHRlbmRzIENvbmNlcHQgewotfSAvLyBXaGl0ZXBhcGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya0JyZWFrZG93bkVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrQnJlYWtkb3duRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZDFhOTk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrQnJlYWtkb3duRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBCcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgV29yayBCcmVha2Rvd24gRWxlbWVudCBpcyBhIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0SXNSZXBlYXRhYmxlIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc0V2ZW50RHJpdmVuIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0TGlua1RvUHJlZGVjZXNzb3IgPGVtPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya0JyZWFrZG93bkVsZW1lbnQgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SXNSZXBlYXRhYmxlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0SXNSZXBlYXRhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzUmVwZWF0YWJsZSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SXNSZXBlYXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1JlcGVhdGFibGUoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBJZiB0aGUgaXNPbmdvaW5nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBpbnN0YW5jZSwgdGhlbiB0aGUgZWxlbWVudCBkZXNjcmliZXMgYW4gb25nb2luZyBwaWVjZSBvZiB3b3JrIHdpdGhvdXQgYSBmaXhlZCBkdXJhdGlvbiBvciBlbmQgc3RhdGUuICBGb3IgZXhhbXBsZSwgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIG9mIGFuIGFkbWluaXN0cmF0b3IgY29udGludW91c2x5IChlLmcuIDNoIGEgZGF5KSB3b3JraW5nIHRvIGVuc3VyZSB0aGF0IHN5c3RlbXMgYXJlIGtlcHQgaW4gYSBjZXJ0YWluIHN0YXRlLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHByb2dyYW0gbWFuYWdlbWVudCB3b3JrIG92ZXJzZWVpbmcgbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYmVpbmcgc2NoZWR1bGVkIGZvciBvbmUgcGFydGljdWxhciBwcm9qZWN0IGF0IHNwZWNpZmljIHJlb2NjdXJyaW5nIGludGVydmFscyBkdXJpbmcgdGhlIHdob2xlIGxpZmVjeWNsZSBvZiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT25nb2luZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SXNPbmdvaW5nKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0SXNPbmdvaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT25nb2luZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SXNPbmdvaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc09uZ29pbmcoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4KLQkgKiAKLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJc0V2ZW50RHJpdmVuKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzRXZlbnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0SXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFdmVudCBEcml2ZW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElzRXZlbnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzRXZlbnREcml2ZW4oQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaW5rIFRvIFByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGluayBUbyBQcmVkZWNlc3NvcjwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlciIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TGlua1RvUHJlZGVjZXNzb3IoKTsKLQotfSAvLyBXb3JrQnJlYWtkb3duRWxlbWVudApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtEZWZpbml0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmNiOTg3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgRGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFdvcmsgRGVmaW5pdGlvbiBpcyBhbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLgotICogV29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24jZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24jZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtEZWZpbml0aW9uKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrRGVmaW5pdGlvbiBleHRlbmRzIE1ldGhvZEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJlY29uZGl0aW9uKENvbnN0cmFpbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0RlZmluaXRpb25fUHJlY29uZGl0aW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb25zdHJhaW50IGdldFByZWNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWNvbmRpdGlvbihDb25zdHJhaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnN0cmFpbnQgZ2V0UG9zdGNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQb3N0Y29uZGl0aW9uKENvbnN0cmFpbnQgdmFsdWUpOwotCi19IC8vIFdvcmtEZWZpbml0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya09yZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya09yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEyYjlhYzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtPcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBPcmRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFdvcmsgT3JkZXIgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gIAotICogKE5vdGUsIFdvcmsgT3JkZXIgaXMgbm90IG1vZGVsZWQgYXMgYW4gQXNzb2NpYXRpb24gQ2xhc3MgdG8gcHJvdmlkZSBhIHN0cmFpZ2h0Zm9yd2FyZCBtYXBwaW5nICB0byBYTUkgYW5kIEVNRi4pCi0gKiBUaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyI2dldExpbmtUeXBlIDxlbT5MaW5rIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyI2dldFByZWQgPGVtPlByZWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrT3JkZXIoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya09yZGVyIGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpbmsgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmaW5pc2hUb1N0YXJ0IjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQHNlZSAjc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrT3JkZXJfTGlua1R5cGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmaW5pc2hUb1N0YXJ0IiB1bmlxdWU9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrT3JkZXJUeXBlIGdldExpbmtUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlciNnZXRMaW5rVHlwZSA8ZW0+TGluayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExpbmtUeXBlKFdvcmtPcmRlclR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlZDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmVkKFdvcmtCcmVha2Rvd25FbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtPcmRlcl9QcmVkKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtCcmVha2Rvd25FbGVtZW50IGdldFByZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyI2dldFByZWQgPGVtPlByZWQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWQoV29ya0JyZWFrZG93bkVsZW1lbnQgdmFsdWUpOwotCi19IC8vIFdvcmtPcmRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtPcmRlclR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrT3JkZXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0MWQzOTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtPcmRlclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogV29yayBPcmRlciByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEIpIGJlbG93KSBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEEpIGJlbG93KSBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya09yZGVyVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFdvcmtPcmRlclR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZpbmlzaCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RmluaXNoIFRvIFN0YXJ0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0ZJTklTSF9UT19TVEFSVF9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9ImZpbmlzaFRvU3RhcnQiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklOSVNIX1RPX1NUQVJUID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZpbmlzaCBUbyBGaW5pc2g8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkZpbmlzaCBUbyBGaW5pc2g8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRklOSVNIX1RPX0ZJTklTSF9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9ImZpbmlzaFRvRmluaXNoIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTklTSF9UT19GSU5JU0ggPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U3RhcnQgVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlN0YXJ0IFRvIFN0YXJ0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVJUX1RPX1NUQVJUX0xJVEVSQUwKLQkgKiBAbW9kZWwgbmFtZT0ic3RhcnRUb1N0YXJ0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1RPX1NUQVJUID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXJ0IFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U3RhcnQgVG8gRmluaXNoPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVJUX1RPX0ZJTklTSF9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9InN0YXJ0VG9GaW5pc2giCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfVE9fRklOSVNIID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZpbmlzaCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGSU5JU0hfVE9fU1RBUlQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFdvcmtPcmRlclR5cGUgRklOSVNIX1RPX1NUQVJUX0xJVEVSQUwgPSBuZXcgV29ya09yZGVyVHlwZSgKLQkJCUZJTklTSF9UT19TVEFSVCwgImZpbmlzaFRvU3RhcnQiLCAiZmluaXNoVG9TdGFydCIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RmluaXNoIFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGSU5JU0hfVE9fRklOSVNICi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBXb3JrT3JkZXJUeXBlIEZJTklTSF9UT19GSU5JU0hfTElURVJBTCA9IG5ldyBXb3JrT3JkZXJUeXBlKAotCQkJRklOSVNIX1RPX0ZJTklTSCwgImZpbmlzaFRvRmluaXNoIiwgImZpbmlzaFRvRmluaXNoIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGFydCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVEFSVF9UT19TVEFSVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgV29ya09yZGVyVHlwZSBTVEFSVF9UT19TVEFSVF9MSVRFUkFMID0gbmV3IFdvcmtPcmRlclR5cGUoCi0JCQlTVEFSVF9UT19TVEFSVCwgInN0YXJ0VG9TdGFydCIsICJzdGFydFRvU3RhcnQiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXJ0IFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVEFSVF9UT19GSU5JU0gKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFdvcmtPcmRlclR5cGUgU1RBUlRfVE9fRklOSVNIX0xJVEVSQUwgPSBuZXcgV29ya09yZGVyVHlwZSgKLQkJCVNUQVJUX1RPX0ZJTklTSCwgInN0YXJ0VG9GaW5pc2giLCAic3RhcnRUb0ZpbmlzaCIpOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgV29ya09yZGVyVHlwZVtdIFZBTFVFU19BUlJBWSA9IG5ldyBXb3JrT3JkZXJUeXBlW10gewotCQkJRklOSVNIX1RPX1NUQVJUX0xJVEVSQUwsIEZJTklTSF9UT19GSU5JU0hfTElURVJBTCwKLQkJCVNUQVJUX1RPX1NUQVJUX0xJVEVSQUwsIFNUQVJUX1RPX0ZJTklTSF9MSVRFUkFMLCB9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzCi0JCQkuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXJUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJV29ya09yZGVyVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtPcmRlclR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlXb3JrT3JkZXJUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXJUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQljYXNlIEZJTklTSF9UT19TVEFSVDoKLQkJCXJldHVybiBGSU5JU0hfVE9fU1RBUlRfTElURVJBTDsKLQkJY2FzZSBGSU5JU0hfVE9fRklOSVNIOgotCQkJcmV0dXJuIEZJTklTSF9UT19GSU5JU0hfTElURVJBTDsKLQkJY2FzZSBTVEFSVF9UT19TVEFSVDoKLQkJCXJldHVybiBTVEFSVF9UT19TVEFSVF9MSVRFUkFMOwotCQljYXNlIFNUQVJUX1RPX0ZJTklTSDoKLQkJCXJldHVybiBTVEFSVF9UT19GSU5JU0hfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBXb3JrT3JkZXJUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9Xb3JrT3JkZXJUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya1Byb2R1Y3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxODY4M2E5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogV29yayBQcm9kdWN0IGlzIGFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLgotICogQSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRSZXBvcnRzIDxlbT5SZXBvcnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldFRlbXBsYXRlcyA8ZW0+VGVtcGxhdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldFRvb2xNZW50b3JzIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3QoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtQcm9kdWN0IGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXBvcnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwb3J0czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9SZXBvcnRzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFJlcG9ydHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGVtcGxhdGVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGVtcGxhdGVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFRlbXBsYXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvciIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0VG9vbE1lbnRvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLX0gLy8gV29ya1Byb2R1Y3QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MzIyNTFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRJbXBhY3RPZk5vdEhhdmluZyA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRSZWFzb25zRm9yTm90TmVlZGluZyA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBJZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXh0ZXJuYWxJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9FeHRlcm5hbElkKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFeHRlcm5hbElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxJZCA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIElkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHRlcm5hbElkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHVycG9zZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHVycG9zZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW1wYWN0T2ZOb3RIYXZpbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEltcGFjdE9mTm90SGF2aW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0SW1wYWN0T2ZOb3RIYXZpbmcgPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEltcGFjdE9mTm90SGF2aW5nKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcgPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlYXNvbnNGb3JOb3ROZWVkaW5nKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gV29ya1Byb2R1Y3REZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzODNkZDI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFeGl0U3RhdGUgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdGVkQnkgPGVtPkltcGFjdGVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RzIDxlbT5JbXBhY3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXREZWxpdmVyYWJsZVBhcnRzIDxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdERlc2NyaXB0b3IgZXh0ZW5kcyBEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICAKLQkgKiBGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3Rpdml0eUVudHJ5U3RhdGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFjdGl2aXR5RW50cnlTdGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0aXZpdHlFbnRyeVN0YXRlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3Rpdml0eSBFeGl0IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuCi0JICogRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3Rpdml0eUV4aXRTdGF0ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFeGl0U3RhdGUgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3Rpdml0eUV4aXRTdGF0ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRXb3JrUHJvZHVjdChXb3JrUHJvZHVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdCBnZXRXb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29ya1Byb2R1Y3QoV29ya1Byb2R1Y3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW1wYWN0ZWQgQnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0cyA8ZW0+SW1wYWN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbXBhY3RlZCBCeTwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkltcGFjdGVkIEJ5PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdHMKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIG9wcG9zaXRlPSJpbXBhY3RzIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJbXBhY3RlZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbXBhY3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3J9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdGVkQnkgPGVtPkltcGFjdGVkIEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkltcGFjdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBhY3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdGVkQnkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIG9wcG9zaXRlPSJpbXBhY3RlZEJ5IiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJbXBhY3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWxpdmVyYWJsZSBQYXJ0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVsaXZlcmFibGVQYXJ0cygpOwotCi19IC8vIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYTQ1OWQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBXb3JrIFByb2R1Y3QgVHlwZSBpcyBhIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgIkNsYXNzIERpYWdyYW0iLCB3aGljaCBjYXRlZ29yaXplcyB0aGUgQXJ0aWZhY3RzIEFuYWx5c2lzIE1vZGVsLCBEZXNpZ24gTW9kZWwsIFVzZXIgRXhwZXJpZW5jZSBNb2RlbCwgb3IgIlNwZWNpZmljYXRpb24iLCB3aGljaCBjYXRlZ29yaXplcyByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbnMgdGhhdCBkZWZpbmUgYSBzeXN0ZW0gd2l0aCBhIHdlbGwtZGVmaW5lZCBzeXN0ZW0gYm91bmRhcnksIHN1Y2ggYXMgdXNlIGNhc2Ugb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbi4gIEEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGNhbiBiZSBjYXRlZ29yaXplZCBhcyBhIFNwZWNpZmljYXRpb24gYXMgd2VsbCBhcyBEaWFncmFtIFdvcmsgUHJvZHVjdCBUeXBlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlI2dldFdvcmtQcm9kdWN0cyA8ZW0+V29yayBQcm9kdWN0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdFR5cGUgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0IiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRXb3JrUHJvZHVjdHMoKTsKLQotfSAvLyBXb3JrUHJvZHVjdFR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FjdGl2aXR5RGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9BY3Rpdml0eURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjVmY2VjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FjdGl2aXR5RGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZpdHkgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwjZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCNnZXRIb3d0b1N0YWZmIDxlbT5Ib3d0byBTdGFmZjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbAotCQlpbXBsZW1lbnRzIEFjdGl2aXR5RGVzY3JpcHRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVSUE9TRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1cnBvc2UgPSBQVVJQT1NFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdGVybmF0aXZlcygpIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxURVJOQVRJVkVTX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHRlcm5hdGl2ZXMoKSA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWx0ZXJuYXRpdmVzID0gQUxURVJOQVRJVkVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhvd3RvU3RhZmYoKSA8ZW0+SG93dG8gU3RhZmY8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhvd3RvU3RhZmYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhPV1RPX1NUQUZGX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIb3d0b1N0YWZmKCkgPGVtPkhvd3RvIFN0YWZmPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIb3d0b1N0YWZmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGhvd3RvU3RhZmYgPSBIT1dUT19TVEFGRl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eURlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdXJwb3NlKCkgewotCQlyZXR1cm4gcHVycG9zZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXJwb3NlKFN0cmluZyBuZXdQdXJwb3NlKSB7Ci0JCVN0cmluZyBvbGRQdXJwb3NlID0gcHVycG9zZTsKLQkJcHVycG9zZSA9IG5ld1B1cnBvc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0UsIG9sZFB1cnBvc2UsCi0JCQkJCXB1cnBvc2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFsdGVybmF0aXZlcygpIHsKLQkJcmV0dXJuIGFsdGVybmF0aXZlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbHRlcm5hdGl2ZXMoU3RyaW5nIG5ld0FsdGVybmF0aXZlcykgewotCQlTdHJpbmcgb2xkQWx0ZXJuYXRpdmVzID0gYWx0ZXJuYXRpdmVzOwotCQlhbHRlcm5hdGl2ZXMgPSBuZXdBbHRlcm5hdGl2ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUywKLQkJCQkJb2xkQWx0ZXJuYXRpdmVzLCBhbHRlcm5hdGl2ZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhvd3RvU3RhZmYoKSB7Ci0JCXJldHVybiBob3d0b1N0YWZmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhvd3RvU3RhZmYoU3RyaW5nIG5ld0hvd3RvU3RhZmYpIHsKLQkJU3RyaW5nIG9sZEhvd3RvU3RhZmYgPSBob3d0b1N0YWZmOwotCQlob3d0b1N0YWZmID0gbmV3SG93dG9TdGFmZjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XVE9fU1RBRkYsCi0JCQkJCW9sZEhvd3RvU3RhZmYsIGhvd3RvU3RhZmYpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXJldHVybiBnZXRQdXJwb3NlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJcmV0dXJuIGdldEFsdGVybmF0aXZlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGOgotCQkJcmV0dXJuIGdldEhvd3RvU3RhZmYoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlzZXRQdXJwb3NlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQlzZXRBbHRlcm5hdGl2ZXMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGOgotCQkJc2V0SG93dG9TdGFmZigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlzZXRQdXJwb3NlKFBVUlBPU0VfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCXNldEFsdGVybmF0aXZlcyhBTFRFUk5BVElWRVNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGOgotCQkJc2V0SG93dG9TdGFmZihIT1dUT19TVEFGRl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXJldHVybiBQVVJQT1NFX0VERUZBVUxUID09IG51bGwgPyBwdXJwb3NlICE9IG51bGwKLQkJCQkJOiAhUFVSUE9TRV9FREVGQVVMVC5lcXVhbHMocHVycG9zZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJcmV0dXJuIEFMVEVSTkFUSVZFU19FREVGQVVMVCA9PSBudWxsID8gYWx0ZXJuYXRpdmVzICE9IG51bGwKLQkJCQkJOiAhQUxURVJOQVRJVkVTX0VERUZBVUxULmVxdWFscyhhbHRlcm5hdGl2ZXMpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGOgotCQkJcmV0dXJuIEhPV1RPX1NUQUZGX0VERUZBVUxUID09IG51bGwgPyBob3d0b1N0YWZmICE9IG51bGwKLQkJCQkJOiAhSE9XVE9fU1RBRkZfRURFRkFVTFQuZXF1YWxzKGhvd3RvU3RhZmYpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHB1cnBvc2U6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocHVycG9zZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWx0ZXJuYXRpdmVzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGFsdGVybmF0aXZlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaG93dG9TdGFmZjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChob3d0b1N0YWZmKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FjdGl2aXR5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQWN0aXZpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkZmY5MTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQWN0aXZpdHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldEJyZWFrZG93bkVsZW1lbnRzIDxlbT5CcmVha2Rvd24gRWxlbWVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0Um9hZG1hcHMgPGVtPlJvYWRtYXBzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFN1cHBvcnRpbmdNYXRlcmlhbHMgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldENoZWNrbGlzdHMgPGVtPkNoZWNrbGlzdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0Q29uY2VwdHMgPGVtPkNvbmNlcHRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldEV4YW1wbGVzIDxlbT5FeGFtcGxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRHdWlkZWxpbmVzIDxlbT5HdWlkZWxpbmVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFJldXNhYmxlQXNzZXRzIDxlbT5SZXVzYWJsZSBBc3NldHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0SXNFbmFjdGFibGUgPGVtPklzIEVuYWN0YWJsZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5SW1wbCBleHRlbmRzIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIEFjdGl2aXR5IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUID0gVmFyaWFiaWxpdHlUeXBlLk5BX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJpbGl0eUVsZW1lbnQgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVjb25kaXRpb24oKSA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50IHByZWNvbmRpdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Y29uZGl0aW9uKCkgPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50IHBvc3Rjb25kaXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnJlYWtkb3duRWxlbWVudHMoKSA8ZW0+QnJlYWtkb3duIEVsZW1lbnRzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYnJlYWtkb3duRWxlbWVudHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9hZG1hcHMoKSA8ZW0+Um9hZG1hcHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9hZG1hcHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByb2FkbWFwcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1cHBvcnRpbmdNYXRlcmlhbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzdXBwb3J0aW5nTWF0ZXJpYWxzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoZWNrbGlzdHMoKSA8ZW0+Q2hlY2tsaXN0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGVja2xpc3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY2hlY2tsaXN0cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25jZXB0cygpIDxlbT5Db25jZXB0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25jZXB0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNvbmNlcHRzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4YW1wbGVzKCkgPGVtPkV4YW1wbGVzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4YW1wbGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXhhbXBsZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3VpZGVsaW5lcygpIDxlbT5HdWlkZWxpbmVzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEd1aWRlbGluZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBndWlkZWxpbmVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJldXNhYmxlQXNzZXRzKCkgPGVtPlJldXNhYmxlIEFzc2V0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXVzYWJsZUFzc2V0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJldXNhYmxlQXNzZXRzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc0VuYWN0YWJsZSgpIDxlbT5JcyBFbmFjdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzRW5hY3RhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSVNfRU5BQ1RBQkxFX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzRW5hY3RhYmxlKCkgPGVtPklzIEVuYWN0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNFbmFjdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzRW5hY3RhYmxlID0gSVNfRU5BQ1RBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q2hlY2tsaXN0cygpIHsKLQkJaWYgKGNoZWNrbGlzdHMgPT0gbnVsbCkgewotCQkJY2hlY2tsaXN0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoQ2hlY2tsaXN0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX19DSEVDS0xJU1RTKTsKLQkJfQotCQlyZXR1cm4gY2hlY2tsaXN0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDb25jZXB0cygpIHsKLQkJaWYgKGNvbmNlcHRzID09IG51bGwpIHsKLQkJCWNvbmNlcHRzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChDb25jZXB0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX19DT05DRVBUUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbmNlcHRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUgbmV3VmFyaWFiaWxpdHlUeXBlKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSBvbGRWYXJpYWJpbGl0eVR5cGUgPSB2YXJpYWJpbGl0eVR5cGU7Ci0JCXZhcmlhYmlsaXR5VHlwZSA9IG5ld1ZhcmlhYmlsaXR5VHlwZSA9PSBudWxsID8gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVAotCQkJCTogbmV3VmFyaWFiaWxpdHlUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFLCBvbGRWYXJpYWJpbGl0eVR5cGUsCi0JCQkJCXZhcmlhYmlsaXR5VHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eUVsZW1lbnQgZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJaWYgKHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgIT0gbnVsbAotCQkJCSYmICgoRU9iamVjdCkgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQkJdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGVSZXNvbHZlUHJveHkob2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCk7Ci0JCQlpZiAodmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCAhPSBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULAotCQkJCQkJCW9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQsCi0JCQkJCQkJdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eUVsZW1lbnQgYmFzaWNHZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpIHsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwKLQkJCQkJb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFByZWNvbmRpdGlvbigpIHsKLQkJaWYgKHByZWNvbmRpdGlvbiAhPSBudWxsICYmICgoRU9iamVjdCkgcHJlY29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJlY29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcHJlY29uZGl0aW9uOwotCQkJcHJlY29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUHJlY29uZGl0aW9uKTsKLQkJCWlmIChwcmVjb25kaXRpb24gIT0gb2xkUHJlY29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1ByZWNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbjsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkUHJlY29uZGl0aW9uCi0JCQkJCQkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTiwgbnVsbCwgbnVsbCk7Ci0JCQkJaWYgKG5ld1ByZWNvbmRpdGlvbi5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdQcmVjb25kaXRpb24uZUludmVyc2VBZGQodGhpcywKLQkJCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCQktIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTiwgbnVsbCwKLQkJCQkJCQltc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OLCBvbGRQcmVjb25kaXRpb24sCi0JCQkJCQkJcHJlY29uZGl0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBiYXNpY0dldFByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcmVjb25kaXRpb24oQ29uc3RyYWludCBuZXdQcmVjb25kaXRpb24sCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnN0cmFpbnQgb2xkUHJlY29uZGl0aW9uID0gcHJlY29uZGl0aW9uOwotCQlwcmVjb25kaXRpb24gPSBuZXdQcmVjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTiwKLQkJCQkJb2xkUHJlY29uZGl0aW9uLCBuZXdQcmVjb25kaXRpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlY29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UHJlY29uZGl0aW9uKSB7Ci0JCWlmIChuZXdQcmVjb25kaXRpb24gIT0gcHJlY29uZGl0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcmVjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbikKLQkJCQkJCS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcmVjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1ByZWNvbmRpdGlvbikKLQkJCQkJCS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFByZWNvbmRpdGlvbihuZXdQcmVjb25kaXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT04sIG5ld1ByZWNvbmRpdGlvbiwKLQkJCQkJbmV3UHJlY29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgZ2V0UG9zdGNvbmRpdGlvbigpIHsKLQkJaWYgKHBvc3Rjb25kaXRpb24gIT0gbnVsbCAmJiAoKEVPYmplY3QpIHBvc3Rjb25kaXRpb24pLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQb3N0Y29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcG9zdGNvbmRpdGlvbjsKLQkJCXBvc3Rjb25kaXRpb24gPSAoQ29uc3RyYWludCkgZVJlc29sdmVQcm94eShvbGRQb3N0Y29uZGl0aW9uKTsKLQkJCWlmIChwb3N0Y29uZGl0aW9uICE9IG9sZFBvc3Rjb25kaXRpb24pIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3UG9zdGNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb247Ci0JCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFBvc3Rjb25kaXRpb24uZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OLCBudWxsLAotCQkJCQkJbnVsbCk7Ci0JCQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3UG9zdGNvbmRpdGlvbi5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJCS0gVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTiwgbnVsbCwKLQkJCQkJCQltc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTiwKLQkJCQkJCQlvbGRQb3N0Y29uZGl0aW9uLCBwb3N0Y29uZGl0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBvc3Rjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgYmFzaWNHZXRQb3N0Y29uZGl0aW9uKCkgewotCQlyZXR1cm4gcG9zdGNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UG9zdGNvbmRpdGlvbiwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ29uc3RyYWludCBvbGRQb3N0Y29uZGl0aW9uID0gcG9zdGNvbmRpdGlvbjsKLQkJcG9zdGNvbmRpdGlvbiA9IG5ld1Bvc3Rjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT04sCi0JCQkJCW9sZFBvc3Rjb25kaXRpb24sIG5ld1Bvc3Rjb25kaXRpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50IG5ld1Bvc3Rjb25kaXRpb24pIHsKLQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24gIT0gcG9zdGNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgcG9zdGNvbmRpdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OLCBudWxsLAotCQkJCQkJbXNncyk7Ci0JCQlpZiAobmV3UG9zdGNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UG9zdGNvbmRpdGlvbikuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OLCBudWxsLAotCQkJCQkJbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKG5ld1Bvc3Rjb25kaXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OLCBuZXdQb3N0Y29uZGl0aW9uLAotCQkJCQluZXdQb3N0Y29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0QnJlYWtkb3duRWxlbWVudHMoKSB7Ci0JCWlmIChicmVha2Rvd25FbGVtZW50cyA9PSBudWxsKSB7Ci0JCQlicmVha2Rvd25FbGVtZW50cyA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdCgKLQkJCQkJQnJlYWtkb3duRWxlbWVudC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTLAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTKTsKLQkJfQotCQlyZXR1cm4gYnJlYWtkb3duRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0Um9hZG1hcHMoKSB7Ci0JCWlmIChyb2FkbWFwcyA9PSBudWxsKSB7Ci0JCQlyb2FkbWFwcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoUm9hZG1hcC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fUk9BRE1BUFMpOwotCQl9Ci0JCXJldHVybiByb2FkbWFwczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkgewotCQlpZiAoc3VwcG9ydGluZ01hdGVyaWFscyA9PSBudWxsKSB7Ci0JCQlzdXBwb3J0aW5nTWF0ZXJpYWxzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdCgKLQkJCQkJU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMUyk7Ci0JCX0KLQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RXhhbXBsZXMoKSB7Ci0JCWlmIChleGFtcGxlcyA9PSBudWxsKSB7Ci0JCQlleGFtcGxlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoRXhhbXBsZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fRVhBTVBMRVMpOwotCQl9Ci0JCXJldHVybiBleGFtcGxlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRHdWlkZWxpbmVzKCkgewotCQlpZiAoZ3VpZGVsaW5lcyA9PSBudWxsKSB7Ci0JCQlndWlkZWxpbmVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChHdWlkZWxpbmUuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX0dVSURFTElORVMpOwotCQl9Ci0JCXJldHVybiBndWlkZWxpbmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJldXNhYmxlQXNzZXRzKCkgewotCQlpZiAocmV1c2FibGVBc3NldHMgPT0gbnVsbCkgewotCQkJcmV1c2FibGVBc3NldHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KFJldXNhYmxlQXNzZXQuY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUUyk7Ci0JCX0KLQkJcmV0dXJuIHJldXNhYmxlQXNzZXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzRW5hY3RhYmxlKCkgewotCQlyZXR1cm4gaXNFbmFjdGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNFbmFjdGFibGUoQm9vbGVhbiBuZXdJc0VuYWN0YWJsZSkgewotCQlCb29sZWFuIG9sZElzRW5hY3RhYmxlID0gaXNFbmFjdGFibGU7Ci0JCWlzRW5hY3RhYmxlID0gbmV3SXNFbmFjdGFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX0lTX0VOQUNUQUJMRSwgb2xkSXNFbmFjdGFibGUsCi0JCQkJCWlzRW5hY3RhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRCcmVha2Rvd25FbGVtZW50cygpKS5iYXNpY0FkZChvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OOgotCQkJcmV0dXJuIGJhc2ljU2V0UHJlY29uZGl0aW9uKG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT046Ci0JCQlyZXR1cm4gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEJyZWFrZG93bkVsZW1lbnRzKCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQcmVjb25kaXRpb24oKTsKLQkJCXJldHVybiBiYXNpY0dldFByZWNvbmRpdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UG9zdGNvbmRpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCXJldHVybiBnZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVBTOgotCQkJcmV0dXJuIGdldFJvYWRtYXBzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTFM6Ci0JCQlyZXR1cm4gZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0NIRUNLTElTVFM6Ci0JCQlyZXR1cm4gZ2V0Q2hlY2tsaXN0cygpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0NPTkNFUFRTOgotCQkJcmV0dXJuIGdldENvbmNlcHRzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fRVhBTVBMRVM6Ci0JCQlyZXR1cm4gZ2V0RXhhbXBsZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19HVUlERUxJTkVTOgotCQkJcmV0dXJuIGdldEd1aWRlbGluZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19SRVVTQUJMRV9BU1NFVFM6Ci0JCQlyZXR1cm4gZ2V0UmV1c2FibGVBc3NldHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19JU19FTkFDVEFCTEU6Ci0JCQlyZXR1cm4gZ2V0SXNFbmFjdGFibGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlzZXRWYXJpYWJpbGl0eVR5cGUoKFZhcmlhYmlsaXR5VHlwZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KChWYXJpYWJpbGl0eUVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQlzZXRQcmVjb25kaXRpb24oKENvbnN0cmFpbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJc2V0UG9zdGNvbmRpdGlvbigoQ29uc3RyYWludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCWdldEJyZWFrZG93bkVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCWdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUk9BRE1BUFM6Ci0JCQlnZXRSb2FkbWFwcygpLmNsZWFyKCk7Ci0JCQlnZXRSb2FkbWFwcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUxTOgotCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLmNsZWFyKCk7Ci0JCQlnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQ0hFQ0tMSVNUUzoKLQkJCWdldENoZWNrbGlzdHMoKS5jbGVhcigpOwotCQkJZ2V0Q2hlY2tsaXN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0NPTkNFUFRTOgotCQkJZ2V0Q29uY2VwdHMoKS5jbGVhcigpOwotCQkJZ2V0Q29uY2VwdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19FWEFNUExFUzoKLQkJCWdldEV4YW1wbGVzKCkuY2xlYXIoKTsKLQkJCWdldEV4YW1wbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fR1VJREVMSU5FUzoKLQkJCWdldEd1aWRlbGluZXMoKS5jbGVhcigpOwotCQkJZ2V0R3VpZGVsaW5lcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUUzoKLQkJCWdldFJldXNhYmxlQXNzZXRzKCkuY2xlYXIoKTsKLQkJCWdldFJldXNhYmxlQXNzZXRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOgotCQkJc2V0SXNFbmFjdGFibGUoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXNldFZhcmlhYmlsaXR5VHlwZShWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgoVmFyaWFiaWxpdHlFbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQlzZXRQcmVjb25kaXRpb24oKENvbnN0cmFpbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT046Ci0JCQlzZXRQb3N0Y29uZGl0aW9uKChDb25zdHJhaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQlnZXRCcmVha2Rvd25FbGVtZW50cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUk9BRE1BUFM6Ci0JCQlnZXRSb2FkbWFwcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTFM6Ci0JCQlnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19DSEVDS0xJU1RTOgotCQkJZ2V0Q2hlY2tsaXN0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQ09OQ0VQVFM6Ci0JCQlnZXRDb25jZXB0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fRVhBTVBMRVM6Ci0JCQlnZXRFeGFtcGxlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fR1VJREVMSU5FUzoKLQkJCWdldEd1aWRlbGluZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUUzoKLQkJCWdldFJldXNhYmxlQXNzZXRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19JU19FTkFDVEFCTEU6Ci0JCQlzZXRJc0VuYWN0YWJsZShJU19FTkFDVEFCTEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlICE9IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQ7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OOgotCQkJcmV0dXJuIHByZWNvbmRpdGlvbiAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT046Ci0JCQlyZXR1cm4gcG9zdGNvbmRpdGlvbiAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCXJldHVybiBicmVha2Rvd25FbGVtZW50cyAhPSBudWxsICYmICFicmVha2Rvd25FbGVtZW50cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUk9BRE1BUFM6Ci0JCQlyZXR1cm4gcm9hZG1hcHMgIT0gbnVsbCAmJiAhcm9hZG1hcHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUxTOgotCQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbHMgIT0gbnVsbAotCQkJCQkmJiAhc3VwcG9ydGluZ01hdGVyaWFscy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQ0hFQ0tMSVNUUzoKLQkJCXJldHVybiBjaGVja2xpc3RzICE9IG51bGwgJiYgIWNoZWNrbGlzdHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0NPTkNFUFRTOgotCQkJcmV0dXJuIGNvbmNlcHRzICE9IG51bGwgJiYgIWNvbmNlcHRzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19FWEFNUExFUzoKLQkJCXJldHVybiBleGFtcGxlcyAhPSBudWxsICYmICFleGFtcGxlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fR1VJREVMSU5FUzoKLQkJCXJldHVybiBndWlkZWxpbmVzICE9IG51bGwgJiYgIWd1aWRlbGluZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUUzoKLQkJCXJldHVybiByZXVzYWJsZUFzc2V0cyAhPSBudWxsICYmICFyZXVzYWJsZUFzc2V0cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOgotCQkJcmV0dXJuIElTX0VOQUNUQUJMRV9FREVGQVVMVCA9PSBudWxsID8gaXNFbmFjdGFibGUgIT0gbnVsbAotCQkJCQk6ICFJU19FTkFDVEFCTEVfRURFRkFVTFQuZXF1YWxzKGlzRW5hY3RhYmxlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IFZhcmlhYmlsaXR5RWxlbWVudC5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBXb3JrRGVmaW5pdGlvbi5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IFZhcmlhYmlsaXR5RWxlbWVudC5jbGFzcykgewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBXb3JrRGVmaW5pdGlvbi5jbGFzcykgewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT047Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YXJpYWJpbGl0eVR5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodmFyaWFiaWxpdHlUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc0VuYWN0YWJsZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpc0VuYWN0YWJsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FjdGl2aXR5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1MWIzODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsI2dldEJyaWVmT3V0bGluZSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucyA8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFydGlmYWN0RGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwKLQkJaW1wbGVtZW50cyBBcnRpZmFjdERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZk91dGxpbmUoKSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QnJpZWZPdXRsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCUklFRl9PVVRMSU5FX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZk91dGxpbmUoKSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QnJpZWZPdXRsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJyaWVmT3V0bGluZSA9IEJSSUVGX09VVExJTkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQUkVTRU5UQVRJT05fT1BUSU9OU19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXByZXNlbnRhdGlvbk9wdGlvbnMgPSBSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFydGlmYWN0RGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVF9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJyaWVmT3V0bGluZSgpIHsKLQkJcmV0dXJuIGJyaWVmT3V0bGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCcmllZk91dGxpbmUoU3RyaW5nIG5ld0JyaWVmT3V0bGluZSkgewotCQlTdHJpbmcgb2xkQnJpZWZPdXRsaW5lID0gYnJpZWZPdXRsaW5lOwotCQlicmllZk91dGxpbmUgPSBuZXdCcmllZk91dGxpbmU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkUsCi0JCQkJCW9sZEJyaWVmT3V0bGluZSwgYnJpZWZPdXRsaW5lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKSB7Ci0JCXJldHVybiByZXByZXNlbnRhdGlvbk9wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKFN0cmluZyBuZXdSZXByZXNlbnRhdGlvbk9wdGlvbnMpIHsKLQkJU3RyaW5nIG9sZFJlcHJlc2VudGF0aW9uT3B0aW9ucyA9IHJlcHJlc2VudGF0aW9uT3B0aW9uczsKLQkJcmVwcmVzZW50YXRpb25PcHRpb25zID0gbmV3UmVwcmVzZW50YXRpb25PcHRpb25zOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TLAotCQkJCQlvbGRSZXByZXNlbnRhdGlvbk9wdGlvbnMsIHJlcHJlc2VudGF0aW9uT3B0aW9ucykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FOgotCQkJcmV0dXJuIGdldEJyaWVmT3V0bGluZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlM6Ci0JCQlyZXR1cm4gZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FOgotCQkJc2V0QnJpZWZPdXRsaW5lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TOgotCQkJc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJCXNldEJyaWVmT3V0bGluZShCUklFRl9PVVRMSU5FX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TOgotCQkJc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKFJFUFJFU0VOVEFUSU9OX09QVElPTlNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkU6Ci0JCQlyZXR1cm4gQlJJRUZfT1VUTElORV9FREVGQVVMVCA9PSBudWxsID8gYnJpZWZPdXRsaW5lICE9IG51bGwKLQkJCQkJOiAhQlJJRUZfT1VUTElORV9FREVGQVVMVC5lcXVhbHMoYnJpZWZPdXRsaW5lKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TOgotCQkJcmV0dXJuIFJFUFJFU0VOVEFUSU9OX09QVElPTlNfRURFRkFVTFQgPT0gbnVsbCA/IHJlcHJlc2VudGF0aW9uT3B0aW9ucyAhPSBudWxsCi0JCQkJCTogIVJFUFJFU0VOVEFUSU9OX09QVElPTlNfRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKHJlcHJlc2VudGF0aW9uT3B0aW9ucyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYnJpZWZPdXRsaW5lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGJyaWVmT3V0bGluZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVwcmVzZW50YXRpb25PcHRpb25zOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJlcHJlc2VudGF0aW9uT3B0aW9ucyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9BcnRpZmFjdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FydGlmYWN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4N2UwYWFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FydGlmYWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJ0aWZhY3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdEltcGwjZ2V0Q29udGFpbmVyQXJ0aWZhY3QgPGVtPkNvbnRhaW5lciBBcnRpZmFjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0SW1wbCNnZXRDb250YWluZWRBcnRpZmFjdHMgPGVtPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEltcGwgZXh0ZW5kcyBXb3JrUHJvZHVjdEltcGwgaW1wbGVtZW50cyBBcnRpZmFjdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250YWluZWRBcnRpZmFjdHMoKSA8ZW0+Q29udGFpbmVkIEFydGlmYWN0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb250YWluZWRBcnRpZmFjdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjb250YWluZWRBcnRpZmFjdHMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFydGlmYWN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFydGlmYWN0IGdldENvbnRhaW5lckFydGlmYWN0KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1QpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChBcnRpZmFjdCkgZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcnRpZmFjdCBiYXNpY0dldENvbnRhaW5lckFydGlmYWN0KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1QpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChBcnRpZmFjdCkgZUludGVybmFsQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29udGFpbmVyQXJ0aWZhY3QoCi0JCQlBcnRpZmFjdCBuZXdDb250YWluZXJBcnRpZmFjdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0NvbnRhaW5lckFydGlmYWN0LAotCQkJCVVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lckFydGlmYWN0KEFydGlmYWN0IG5ld0NvbnRhaW5lckFydGlmYWN0KSB7Ci0JCWlmIChuZXdDb250YWluZXJBcnRpZmFjdCAhPSBlSW50ZXJuYWxDb250YWluZXIoKQotCQkJCXx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVCAmJiBuZXdDb250YWluZXJBcnRpZmFjdCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIChFT2JqZWN0KSBuZXdDb250YWluZXJBcnRpZmFjdCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdDb250YWluZXJBcnRpZmFjdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3Q29udGFpbmVyQXJ0aWZhY3QpLmVJbnZlcnNlQWRkKAotCQkJCQkJdGhpcywgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUywKLQkJCQkJCUFydGlmYWN0LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvbnRhaW5lckFydGlmYWN0KG5ld0NvbnRhaW5lckFydGlmYWN0LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNULAotCQkJCQluZXdDb250YWluZXJBcnRpZmFjdCwgbmV3Q29udGFpbmVyQXJ0aWZhY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDb250YWluZWRBcnRpZmFjdHMoKSB7Ci0JCWlmIChjb250YWluZWRBcnRpZmFjdHMgPT0gbnVsbCkgewotCQkJY29udGFpbmVkQXJ0aWZhY3RzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QuUmVzb2x2aW5nKAotCQkJCQlBcnRpZmFjdC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUywKLQkJCQkJVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVkQXJ0aWZhY3RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUOgotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXRDb250YWluZXJBcnRpZmFjdCgoQXJ0aWZhY3QpIG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkpLmJhc2ljQWRkKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1Q6Ci0JCQlyZXR1cm4gYmFzaWNTZXRDb250YWluZXJBcnRpZmFjdChudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZSgKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUOgotCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFMsIEFydGlmYWN0LmNsYXNzLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRDb250YWluZXJBcnRpZmFjdCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0Q29udGFpbmVyQXJ0aWZhY3QoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOgotCQkJcmV0dXJuIGdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUOgotCQkJc2V0Q29udGFpbmVyQXJ0aWZhY3QoKEFydGlmYWN0KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUzoKLQkJCWdldENvbnRhaW5lZEFydGlmYWN0cygpLmNsZWFyKCk7Ci0JCQlnZXRDb250YWluZWRBcnRpZmFjdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUOgotCQkJc2V0Q29udGFpbmVyQXJ0aWZhY3QoKEFydGlmYWN0KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOgotCQkJZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1Q6Ci0JCQlyZXR1cm4gYmFzaWNHZXRDb250YWluZXJBcnRpZmFjdCgpICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUzoKLQkJCXJldHVybiBjb250YWluZWRBcnRpZmFjdHMgIT0gbnVsbCAmJiAhY29udGFpbmVkQXJ0aWZhY3RzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vQXJ0aWZhY3RJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0OTc4MTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsI2dldFVzYWdlR3VpZGFuY2UgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwKLQkJaW1wbGVtZW50cyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzYWdlR3VpZGFuY2UoKSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVzYWdlR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVTQUdFX0dVSURBTkNFX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2FnZUd1aWRhbmNlKCkgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVc2FnZUd1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVzYWdlR3VpZGFuY2UgPSBVU0FHRV9HVUlEQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVzYWdlR3VpZGFuY2UoKSB7Ci0JCXJldHVybiB1c2FnZUd1aWRhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzYWdlR3VpZGFuY2UoU3RyaW5nIG5ld1VzYWdlR3VpZGFuY2UpIHsKLQkJU3RyaW5nIG9sZFVzYWdlR3VpZGFuY2UgPSB1c2FnZUd1aWRhbmNlOwotCQl1c2FnZUd1aWRhbmNlID0gbmV3VXNhZ2VHdWlkYW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UsCi0JCQkJCW9sZFVzYWdlR3VpZGFuY2UsIHVzYWdlR3VpZGFuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U6Ci0JCQlyZXR1cm4gZ2V0VXNhZ2VHdWlkYW5jZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U6Ci0JCQlzZXRVc2FnZUd1aWRhbmNlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U6Ci0JCQlzZXRVc2FnZUd1aWRhbmNlKFVTQUdFX0dVSURBTkNFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRToKLQkJCXJldHVybiBVU0FHRV9HVUlEQU5DRV9FREVGQVVMVCA9PSBudWxsID8gdXNhZ2VHdWlkYW5jZSAhPSBudWxsCi0JCQkJCTogIVVTQUdFX0dVSURBTkNFX0VERUZBVUxULmVxdWFscyh1c2FnZUd1aWRhbmNlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1c2FnZUd1aWRhbmNlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHVzYWdlR3VpZGFuY2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9CcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmRjOTU3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9CcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0SXNQbGFubmVkIDxlbT5JcyBQbGFubmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0SXNPcHRpb25hbCA8ZW0+SXMgT3B0aW9uYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRQcmVzZW50ZWRBZnRlciA8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UHJlc2VudGVkQmVmb3JlIDxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UGxhbm5pbmdEYXRhIDxlbT5QbGFubmluZyBEYXRhPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0U3VwZXJBY3Rpdml0aWVzIDxlbT5TdXBlciBBY3Rpdml0aWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQnJlYWtkb3duRWxlbWVudEltcGwgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVmaXgoKSA8ZW0+UHJlZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeCA9IFBSRUZJWF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1BsYW5uZWQoKSA8ZW0+SXMgUGxhbm5lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNQbGFubmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSVNfUExBTk5FRF9FREVGQVVMVCA9IEJvb2xlYW4uVFJVRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzUGxhbm5lZCgpIDxlbT5JcyBQbGFubmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1BsYW5uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzUGxhbm5lZCA9IElTX1BMQU5ORURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBIQVNfTVVMVElQTEVfT0NDVVJSRU5DRVNfRURFRkFVTFQgPSBCb29sZWFuLkZBTFNFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgPSBIQVNfTVVMVElQTEVfT0NDVVJSRU5DRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNPcHRpb25hbCgpIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNPcHRpb25hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX09QVElPTkFMX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzT3B0aW9uYWwoKSA8ZW0+SXMgT3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzT3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzT3B0aW9uYWwgPSBJU19PUFRJT05BTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRlZEFmdGVyKCkgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGVkQWZ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50IHByZXNlbnRlZEFmdGVyID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRlZEJlZm9yZSgpIDxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRCZWZvcmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50IHByZXNlbnRlZEJlZm9yZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQbGFubmluZ0RhdGEoKSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGxhbm5pbmdEYXRhIHBsYW5uaW5nRGF0YSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBlckFjdGl2aXRpZXMoKSA8ZW0+U3VwZXIgQWN0aXZpdGllczwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3VwZXJBY3Rpdml0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHkgc3VwZXJBY3Rpdml0aWVzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiBwcmVmaXg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBuZXdQcmVmaXgpIHsKLQkJU3RyaW5nIG9sZFByZWZpeCA9IHByZWZpeDsKLQkJcHJlZml4ID0gbmV3UHJlZml4OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVgsIG9sZFByZWZpeCwgcHJlZml4KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0SXNQbGFubmVkKCkgewotCQlyZXR1cm4gaXNQbGFubmVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzUGxhbm5lZChCb29sZWFuIG5ld0lzUGxhbm5lZCkgewotCQlCb29sZWFuIG9sZElzUGxhbm5lZCA9IGlzUGxhbm5lZDsKLQkJaXNQbGFubmVkID0gbmV3SXNQbGFubmVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVELCBvbGRJc1BsYW5uZWQsCi0JCQkJCWlzUGxhbm5lZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKSB7Ci0JCXJldHVybiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoQm9vbGVhbiBuZXdIYXNNdWx0aXBsZU9jY3VycmVuY2VzKSB7Ci0JCUJvb2xlYW4gb2xkSGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA9IGhhc011bHRpcGxlT2NjdXJyZW5jZXM7Ci0JCWhhc011bHRpcGxlT2NjdXJyZW5jZXMgPSBuZXdIYXNNdWx0aXBsZU9jY3VycmVuY2VzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMsCi0JCQkJCW9sZEhhc011bHRpcGxlT2NjdXJyZW5jZXMsIGhhc011bHRpcGxlT2NjdXJyZW5jZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc09wdGlvbmFsKCkgewotCQlyZXR1cm4gaXNPcHRpb25hbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc09wdGlvbmFsKEJvb2xlYW4gbmV3SXNPcHRpb25hbCkgewotCQlCb29sZWFuIG9sZElzT3B0aW9uYWwgPSBpc09wdGlvbmFsOwotCQlpc09wdGlvbmFsID0gbmV3SXNPcHRpb25hbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwsIG9sZElzT3B0aW9uYWwsCi0JCQkJCWlzT3B0aW9uYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudCBnZXRQcmVzZW50ZWRBZnRlcigpIHsKLQkJaWYgKHByZXNlbnRlZEFmdGVyICE9IG51bGwgJiYgKChFT2JqZWN0KSBwcmVzZW50ZWRBZnRlcikuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFByZXNlbnRlZEFmdGVyID0gKEludGVybmFsRU9iamVjdCkgcHJlc2VudGVkQWZ0ZXI7Ci0JCQlwcmVzZW50ZWRBZnRlciA9IChCcmVha2Rvd25FbGVtZW50KSBlUmVzb2x2ZVByb3h5KG9sZFByZXNlbnRlZEFmdGVyKTsKLQkJCWlmIChwcmVzZW50ZWRBZnRlciAhPSBvbGRQcmVzZW50ZWRBZnRlcikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSLAotCQkJCQkJCW9sZFByZXNlbnRlZEFmdGVyLCBwcmVzZW50ZWRBZnRlcikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcmVzZW50ZWRBZnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudCBiYXNpY0dldFByZXNlbnRlZEFmdGVyKCkgewotCQlyZXR1cm4gcHJlc2VudGVkQWZ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlc2VudGVkQWZ0ZXIoQnJlYWtkb3duRWxlbWVudCBuZXdQcmVzZW50ZWRBZnRlcikgewotCQlCcmVha2Rvd25FbGVtZW50IG9sZFByZXNlbnRlZEFmdGVyID0gcHJlc2VudGVkQWZ0ZXI7Ci0JCXByZXNlbnRlZEFmdGVyID0gbmV3UHJlc2VudGVkQWZ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUiwKLQkJCQkJb2xkUHJlc2VudGVkQWZ0ZXIsIHByZXNlbnRlZEFmdGVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnQgZ2V0UHJlc2VudGVkQmVmb3JlKCkgewotCQlpZiAocHJlc2VudGVkQmVmb3JlICE9IG51bGwgJiYgKChFT2JqZWN0KSBwcmVzZW50ZWRCZWZvcmUpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQcmVzZW50ZWRCZWZvcmUgPSAoSW50ZXJuYWxFT2JqZWN0KSBwcmVzZW50ZWRCZWZvcmU7Ci0JCQlwcmVzZW50ZWRCZWZvcmUgPSAoQnJlYWtkb3duRWxlbWVudCkgZVJlc29sdmVQcm94eShvbGRQcmVzZW50ZWRCZWZvcmUpOwotCQkJaWYgKHByZXNlbnRlZEJlZm9yZSAhPSBvbGRQcmVzZW50ZWRCZWZvcmUpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkUsCi0JCQkJCQkJb2xkUHJlc2VudGVkQmVmb3JlLCBwcmVzZW50ZWRCZWZvcmUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlc2VudGVkQmVmb3JlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50IGJhc2ljR2V0UHJlc2VudGVkQmVmb3JlKCkgewotCQlyZXR1cm4gcHJlc2VudGVkQmVmb3JlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlbnRlZEJlZm9yZShCcmVha2Rvd25FbGVtZW50IG5ld1ByZXNlbnRlZEJlZm9yZSkgewotCQlCcmVha2Rvd25FbGVtZW50IG9sZFByZXNlbnRlZEJlZm9yZSA9IHByZXNlbnRlZEJlZm9yZTsKLQkJcHJlc2VudGVkQmVmb3JlID0gbmV3UHJlc2VudGVkQmVmb3JlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFLAotCQkJCQlvbGRQcmVzZW50ZWRCZWZvcmUsIHByZXNlbnRlZEJlZm9yZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQbGFubmluZ0RhdGEgZ2V0UGxhbm5pbmdEYXRhKCkgewotCQlpZiAocGxhbm5pbmdEYXRhICE9IG51bGwgJiYgKChFT2JqZWN0KSBwbGFubmluZ0RhdGEpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQbGFubmluZ0RhdGEgPSAoSW50ZXJuYWxFT2JqZWN0KSBwbGFubmluZ0RhdGE7Ci0JCQlwbGFubmluZ0RhdGEgPSAoUGxhbm5pbmdEYXRhKSBlUmVzb2x2ZVByb3h5KG9sZFBsYW5uaW5nRGF0YSk7Ci0JCQlpZiAocGxhbm5pbmdEYXRhICE9IG9sZFBsYW5uaW5nRGF0YSkgewotCQkJCUludGVybmFsRU9iamVjdCBuZXdQbGFubmluZ0RhdGEgPSAoSW50ZXJuYWxFT2JqZWN0KSBwbGFubmluZ0RhdGE7Ci0JCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFBsYW5uaW5nRGF0YS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEsCi0JCQkJCQludWxsLCBudWxsKTsKLQkJCQlpZiAobmV3UGxhbm5pbmdEYXRhLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1BsYW5uaW5nRGF0YQotCQkJCQkJCS5lSW52ZXJzZUFkZCgKLQkJCQkJCQkJCXRoaXMsCi0JCQkJCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCQkJCS0gVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSwKLQkJCQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBLAotCQkJCQkJCW9sZFBsYW5uaW5nRGF0YSwgcGxhbm5pbmdEYXRhKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBsYW5uaW5nRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGxhbm5pbmdEYXRhIGJhc2ljR2V0UGxhbm5pbmdEYXRhKCkgewotCQlyZXR1cm4gcGxhbm5pbmdEYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBsYW5uaW5nRGF0YShQbGFubmluZ0RhdGEgbmV3UGxhbm5pbmdEYXRhLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQbGFubmluZ0RhdGEgb2xkUGxhbm5pbmdEYXRhID0gcGxhbm5pbmdEYXRhOwotCQlwbGFubmluZ0RhdGEgPSBuZXdQbGFubmluZ0RhdGE7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEsCi0JCQkJCW9sZFBsYW5uaW5nRGF0YSwgbmV3UGxhbm5pbmdEYXRhKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBsYW5uaW5nRGF0YShQbGFubmluZ0RhdGEgbmV3UGxhbm5pbmdEYXRhKSB7Ci0JCWlmIChuZXdQbGFubmluZ0RhdGEgIT0gcGxhbm5pbmdEYXRhKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwbGFubmluZ0RhdGEgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHBsYW5uaW5nRGF0YSkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UGxhbm5pbmdEYXRhICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQbGFubmluZ0RhdGEpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UGxhbm5pbmdEYXRhKG5ld1BsYW5uaW5nRGF0YSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEsCi0JCQkJCW5ld1BsYW5uaW5nRGF0YSwgbmV3UGxhbm5pbmdEYXRhKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5IGdldFN1cGVyQWN0aXZpdGllcygpIHsKLQkJaWYgKHN1cGVyQWN0aXZpdGllcyAhPSBudWxsICYmICgoRU9iamVjdCkgc3VwZXJBY3Rpdml0aWVzKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkU3VwZXJBY3Rpdml0aWVzID0gKEludGVybmFsRU9iamVjdCkgc3VwZXJBY3Rpdml0aWVzOwotCQkJc3VwZXJBY3Rpdml0aWVzID0gKEFjdGl2aXR5KSBlUmVzb2x2ZVByb3h5KG9sZFN1cGVyQWN0aXZpdGllcyk7Ci0JCQlpZiAoc3VwZXJBY3Rpdml0aWVzICE9IG9sZFN1cGVyQWN0aXZpdGllcykgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUywKLQkJCQkJCQlvbGRTdXBlckFjdGl2aXRpZXMsIHN1cGVyQWN0aXZpdGllcykpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlckFjdGl2aXRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5IGJhc2ljR2V0U3VwZXJBY3Rpdml0aWVzKCkgewotCQlyZXR1cm4gc3VwZXJBY3Rpdml0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFN1cGVyQWN0aXZpdGllcygKLQkJCUFjdGl2aXR5IG5ld1N1cGVyQWN0aXZpdGllcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlBY3Rpdml0eSBvbGRTdXBlckFjdGl2aXRpZXMgPSBzdXBlckFjdGl2aXRpZXM7Ci0JCXN1cGVyQWN0aXZpdGllcyA9IG5ld1N1cGVyQWN0aXZpdGllczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUywKLQkJCQkJb2xkU3VwZXJBY3Rpdml0aWVzLCBuZXdTdXBlckFjdGl2aXRpZXMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3VwZXJBY3Rpdml0aWVzKEFjdGl2aXR5IG5ld1N1cGVyQWN0aXZpdGllcykgewotCQlpZiAobmV3U3VwZXJBY3Rpdml0aWVzICE9IHN1cGVyQWN0aXZpdGllcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc3VwZXJBY3Rpdml0aWVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBzdXBlckFjdGl2aXRpZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFMsCi0JCQkJCQlBY3Rpdml0eS5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3U3VwZXJBY3Rpdml0aWVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdTdXBlckFjdGl2aXRpZXMpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFMsCi0JCQkJCQlBY3Rpdml0eS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTdXBlckFjdGl2aXRpZXMobmV3U3VwZXJBY3Rpdml0aWVzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUywKLQkJCQkJbmV3U3VwZXJBY3Rpdml0aWVzLCBuZXdTdXBlckFjdGl2aXRpZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVM6Ci0JCQlpZiAoc3VwZXJBY3Rpdml0aWVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBzdXBlckFjdGl2aXRpZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFMsCi0JCQkJCQlBY3Rpdml0eS5jbGFzcywgbXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXRTdXBlckFjdGl2aXRpZXMoKEFjdGl2aXR5KSBvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQToKLQkJCXJldHVybiBiYXNpY1NldFBsYW5uaW5nRGF0YShudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOgotCQkJcmV0dXJuIGJhc2ljU2V0U3VwZXJBY3Rpdml0aWVzKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOgotCQkJcmV0dXJuIGdldFByZWZpeCgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ6Ci0JCQlyZXR1cm4gZ2V0SXNQbGFubmVkKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOgotCQkJcmV0dXJuIGdldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDoKLQkJCXJldHVybiBnZXRJc09wdGlvbmFsKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFByZXNlbnRlZEFmdGVyKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQcmVzZW50ZWRBZnRlcigpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJlc2VudGVkQmVmb3JlKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQcmVzZW50ZWRCZWZvcmUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFBsYW5uaW5nRGF0YSgpOwotCQkJcmV0dXJuIGJhc2ljR2V0UGxhbm5pbmdEYXRhKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUzoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCXJldHVybiBiYXNpY0dldFN1cGVyQWN0aXZpdGllcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOgotCQkJc2V0UHJlZml4KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOgotCQkJc2V0SXNQbGFubmVkKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOgotCQkJc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOgotCQkJc2V0SXNPcHRpb25hbCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjoKLQkJCXNldFByZXNlbnRlZEFmdGVyKChCcmVha2Rvd25FbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRToKLQkJCXNldFByZXNlbnRlZEJlZm9yZSgoQnJlYWtkb3duRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE6Ci0JCQlzZXRQbGFubmluZ0RhdGEoKFBsYW5uaW5nRGF0YSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVM6Ci0JCQlzZXRTdXBlckFjdGl2aXRpZXMoKEFjdGl2aXR5KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDoKLQkJCXNldFByZWZpeChQUkVGSVhfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ6Ci0JCQlzZXRJc1BsYW5uZWQoSVNfUExBTk5FRF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOgotCQkJc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcyhIQVNfTVVMVElQTEVfT0NDVVJSRU5DRVNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOgotCQkJc2V0SXNPcHRpb25hbChJU19PUFRJT05BTF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOgotCQkJc2V0UHJlc2VudGVkQWZ0ZXIoKEJyZWFrZG93bkVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU6Ci0JCQlzZXRQcmVzZW50ZWRCZWZvcmUoKEJyZWFrZG93bkVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE6Ci0JCQlzZXRQbGFubmluZ0RhdGEoKFBsYW5uaW5nRGF0YSkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUzoKLQkJCXNldFN1cGVyQWN0aXZpdGllcygoQWN0aXZpdHkpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDoKLQkJCXJldHVybiBQUkVGSVhfRURFRkFVTFQgPT0gbnVsbCA/IHByZWZpeCAhPSBudWxsIDogIVBSRUZJWF9FREVGQVVMVAotCQkJCQkuZXF1YWxzKHByZWZpeCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDoKLQkJCXJldHVybiBJU19QTEFOTkVEX0VERUZBVUxUID09IG51bGwgPyBpc1BsYW5uZWQgIT0gbnVsbAotCQkJCQk6ICFJU19QTEFOTkVEX0VERUZBVUxULmVxdWFscyhpc1BsYW5uZWQpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzoKLQkJCXJldHVybiBIQVNfTVVMVElQTEVfT0NDVVJSRU5DRVNfRURFRkFVTFQgPT0gbnVsbCA/IGhhc011bHRpcGxlT2NjdXJyZW5jZXMgIT0gbnVsbAotCQkJCQk6ICFIQVNfTVVMVElQTEVfT0NDVVJSRU5DRVNfRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKGhhc011bHRpcGxlT2NjdXJyZW5jZXMpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOgotCQkJcmV0dXJuIElTX09QVElPTkFMX0VERUZBVUxUID09IG51bGwgPyBpc09wdGlvbmFsICE9IG51bGwKLQkJCQkJOiAhSVNfT1BUSU9OQUxfRURFRkFVTFQuZXF1YWxzKGlzT3B0aW9uYWwpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjoKLQkJCXJldHVybiBwcmVzZW50ZWRBZnRlciAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU6Ci0JCQlyZXR1cm4gcHJlc2VudGVkQmVmb3JlICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQToKLQkJCXJldHVybiBwbGFubmluZ0RhdGEgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOgotCQkJcmV0dXJuIHN1cGVyQWN0aXZpdGllcyAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHByZWZpeDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwcmVmaXgpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzUGxhbm5lZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpc1BsYW5uZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGhhc011bHRpcGxlT2NjdXJyZW5jZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNPcHRpb25hbDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpc09wdGlvbmFsKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQnJlYWtkb3duRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NhcGFiaWxpdHlQYXR0ZXJuSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ2FwYWJpbGl0eVBhdHRlcm5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVmNTczOWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ2FwYWJpbGl0eVBhdHRlcm5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2FwYWJpbGl0eVBhdHRlcm5JbXBsIGV4dGVuZHMgUHJvY2Vzc0ltcGwgaW1wbGVtZW50cwotCQlDYXBhYmlsaXR5UGF0dGVybiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FwYWJpbGl0eVBhdHRlcm5JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DQVBBQklMSVRZX1BBVFRFUk47Ci0JfQotCi19IC8vQ2FwYWJpbGl0eVBhdHRlcm5JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DaGVja2xpc3RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DaGVja2xpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcyNjU0MjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ2hlY2tsaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGVja2xpc3RJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgQ2hlY2tsaXN0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDaGVja2xpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DSEVDS0xJU1Q7Ci0JfQotCi19IC8vQ2hlY2tsaXN0SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ2xhc3NpZmllckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NsYXNzaWZpZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjMDMzZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ2xhc3NpZmllckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNsYXNzaWZpZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGFzc2lmaWVySW1wbCBleHRlbmRzIFR5cGVJbXBsIGltcGxlbWVudHMgQ2xhc3NpZmllciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3NpZmllckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNMQVNTSUZJRVI7Ci0JfQotCi19IC8vQ2xhc3NpZmllckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbXBvc2l0ZVJvbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db21wb3NpdGVSb2xlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMmJiMTNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbXBvc2l0ZVJvbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbXBvc2l0ZSBSb2xlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29tcG9zaXRlUm9sZUltcGwjZ2V0QWdncmVnYXRlZFJvbGVzIDxlbT5BZ2dyZWdhdGVkIFJvbGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlUm9sZUltcGwgZXh0ZW5kcyBSb2xlRGVzY3JpcHRvckltcGwgaW1wbGVtZW50cwotCQlDb21wb3NpdGVSb2xlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFnZ3JlZ2F0ZWRSb2xlcygpIDxlbT5BZ2dyZWdhdGVkIFJvbGVzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFnZ3JlZ2F0ZWRSb2xlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGFnZ3JlZ2F0ZWRSb2xlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlUm9sZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTVBPU0lURV9ST0xFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFnZ3JlZ2F0ZWRSb2xlcygpIHsKLQkJaWYgKGFnZ3JlZ2F0ZWRSb2xlcyA9PSBudWxsKSB7Ci0JCQlhZ2dyZWdhdGVkUm9sZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KFJvbGUuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRVMpOwotCQl9Ci0JCXJldHVybiBhZ2dyZWdhdGVkUm9sZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRVM6Ci0JCQlyZXR1cm4gZ2V0QWdncmVnYXRlZFJvbGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTOgotCQkJZ2V0QWdncmVnYXRlZFJvbGVzKCkuY2xlYXIoKTsKLQkJCWdldEFnZ3JlZ2F0ZWRSb2xlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTOgotCQkJZ2V0QWdncmVnYXRlZFJvbGVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTOgotCQkJcmV0dXJuIGFnZ3JlZ2F0ZWRSb2xlcyAhPSBudWxsICYmICFhZ2dyZWdhdGVkUm9sZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Db21wb3NpdGVSb2xlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29uY2VwdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbmNlcHRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwMzUzZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29uY2VwdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25jZXB0SW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIENvbmNlcHQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbmNlcHRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05DRVBUOwotCX0KLQotfSAvL0NvbmNlcHRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db25zdHJhaW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29uc3RyYWludEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU4ZDY5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db25zdHJhaW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnN0cmFpbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db25zdHJhaW50SW1wbCNnZXRCb2R5IDxlbT5Cb2R5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludEltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzIENvbnN0cmFpbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJvZHkoKSA8ZW0+Qm9keTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Qm9keSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9EWV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Qm9keSgpIDxlbT5Cb2R5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCb2R5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJvZHkgPSBCT0RZX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05TVFJBSU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9keSgpIHsKLQkJcmV0dXJuIGJvZHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9keShTdHJpbmcgbmV3Qm9keSkgewotCQlTdHJpbmcgb2xkQm9keSA9IGJvZHk7Ci0JCWJvZHkgPSBuZXdCb2R5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX0JPRFksIG9sZEJvZHksIGJvZHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UX19CT0RZOgotCQkJcmV0dXJuIGdldEJvZHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVF9fQk9EWToKLQkJCXNldEJvZHkoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX0JPRFk6Ci0JCQlzZXRCb2R5KEJPRFlfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVF9fQk9EWToKLQkJCXJldHVybiBCT0RZX0VERUZBVUxUID09IG51bGwgPyBib2R5ICE9IG51bGwgOiAhQk9EWV9FREVGQVVMVAotCQkJCQkuZXF1YWxzKGJvZHkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGJvZHk6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYm9keSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NvbnN0cmFpbnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50Q2F0ZWdvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50Q2F0ZWdvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NThhNzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudENhdGVnb3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IENhdGVnb3J5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudENhdGVnb3J5SW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUNvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudENhdGVnb3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9DQVRFR09SWTsKLQl9Ci0KLX0gLy9Db250ZW50Q2F0ZWdvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50RGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50RGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxOWYxYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudERlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCNnZXRNYWluRGVzY3JpcHRpb24gPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsI2dldFNlY3Rpb25zIDxlbT5TZWN0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwjZ2V0S2V5Q29uc2lkZXJhdGlvbnMgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBNZXRob2RVbml0SW1wbCBpbXBsZW1lbnRzCi0JCUNvbnRlbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkgPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkgPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYWluRGVzY3JpcHRpb24gPSBNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VjdGlvbnMoKSA8ZW0+U2VjdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZWN0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKSA8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRLZXlDb25zaWRlcmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLZXlDb25zaWRlcmF0aW9ucygpIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEtleUNvbnNpZGVyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGtleUNvbnNpZGVyYXRpb25zID0gS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnREZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYWluRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBtYWluRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFpbkRlc2NyaXB0aW9uKFN0cmluZyBuZXdNYWluRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZE1haW5EZXNjcmlwdGlvbiA9IG1haW5EZXNjcmlwdGlvbjsKLQkJbWFpbkRlc2NyaXB0aW9uID0gbmV3TWFpbkRlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04sCi0JCQkJCW9sZE1haW5EZXNjcmlwdGlvbiwgbWFpbkRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VjdGlvbnMoKSB7Ci0JCWlmIChzZWN0aW9ucyA9PSBudWxsKSB7Ci0JCQlzZWN0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmcoU2VjdGlvbi5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIHNlY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiBrZXlDb25zaWRlcmF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLZXlDb25zaWRlcmF0aW9ucyhTdHJpbmcgbmV3S2V5Q29uc2lkZXJhdGlvbnMpIHsKLQkJU3RyaW5nIG9sZEtleUNvbnNpZGVyYXRpb25zID0ga2V5Q29uc2lkZXJhdGlvbnM7Ci0JCWtleUNvbnNpZGVyYXRpb25zID0gbmV3S2V5Q29uc2lkZXJhdGlvbnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TLAotCQkJCQlvbGRLZXlDb25zaWRlcmF0aW9ucywga2V5Q29uc2lkZXJhdGlvbnMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRTZWN0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzoKLQkJCXJldHVybiBnZXRTZWN0aW9ucygpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOgotCQkJcmV0dXJuIGdldEtleUNvbnNpZGVyYXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT046Ci0JCQlzZXRNYWluRGVzY3JpcHRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM6Ci0JCQlnZXRTZWN0aW9ucygpLmNsZWFyKCk7Ci0JCQlnZXRTZWN0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOgotCQkJc2V0S2V5Q29uc2lkZXJhdGlvbnMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT046Ci0JCQlzZXRNYWluRGVzY3JpcHRpb24oTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzoKLQkJCWdldFNlY3Rpb25zKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzoKLQkJCXNldEtleUNvbnNpZGVyYXRpb25zKEtFWV9DT05TSURFUkFUSU9OU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IG1haW5EZXNjcmlwdGlvbiAhPSBudWxsCi0JCQkJCTogIU1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKG1haW5EZXNjcmlwdGlvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzoKLQkJCXJldHVybiBzZWN0aW9ucyAhPSBudWxsICYmICFzZWN0aW9ucy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM6Ci0JCQlyZXR1cm4gS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxUID09IG51bGwgPyBrZXlDb25zaWRlcmF0aW9ucyAhPSBudWxsCi0JCQkJCTogIUtFWV9DT05TSURFUkFUSU9OU19FREVGQVVMVC5lcXVhbHMoa2V5Q29uc2lkZXJhdGlvbnMpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG1haW5EZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtYWluRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGtleUNvbnNpZGVyYXRpb25zOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGtleUNvbnNpZGVyYXRpb25zKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ29udGVudERlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2ZiYTYwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldFN1cHBvcnRpbmdNYXRlcmlhbHMgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldENvbmNlcHRzQW5kUGFwZXJzIDxlbT5Db25jZXB0cyBBbmQgUGFwZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldENoZWNrbGlzdHMgPGVtPkNoZWNrbGlzdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0R3VpZGVsaW5lcyA8ZW0+R3VpZGVsaW5lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRFeGFtcGxlcyA8ZW0+RXhhbXBsZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0QXNzZXRzIDxlbT5Bc3NldHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250ZW50RWxlbWVudEltcGwgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnRJbXBsCi0JCWltcGxlbWVudHMgQ29udGVudEVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5VHlwZSgpIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVmFyaWFiaWxpdHlUeXBlIFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQgPSBWYXJpYWJpbGl0eVR5cGUuTkFfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5VHlwZSgpIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhcmlhYmlsaXR5RWxlbWVudCB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1cHBvcnRpbmdNYXRlcmlhbHMoKSA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHN1cHBvcnRpbmdNYXRlcmlhbHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uY2VwdHNBbmRQYXBlcnMoKSA8ZW0+Q29uY2VwdHMgQW5kIFBhcGVyczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25jZXB0c0FuZFBhcGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNvbmNlcHRzQW5kUGFwZXJzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoZWNrbGlzdHMoKSA8ZW0+Q2hlY2tsaXN0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGVja2xpc3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY2hlY2tsaXN0cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHdWlkZWxpbmVzKCkgPGVtPkd1aWRlbGluZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3VpZGVsaW5lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGd1aWRlbGluZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhhbXBsZXMoKSA8ZW0+RXhhbXBsZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhhbXBsZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBleGFtcGxlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBc3NldHMoKSA8ZW0+QXNzZXRzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFzc2V0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGFzc2V0cyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5VHlwZSBnZXRWYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSBuZXdWYXJpYWJpbGl0eVR5cGUpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIG9sZFZhcmlhYmlsaXR5VHlwZSA9IHZhcmlhYmlsaXR5VHlwZTsKLQkJdmFyaWFiaWxpdHlUeXBlID0gbmV3VmFyaWFiaWxpdHlUeXBlID09IG51bGwgPyBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUCi0JCQkJOiBuZXdWYXJpYWJpbGl0eVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFLAotCQkJCQlvbGRWYXJpYWJpbGl0eVR5cGUsIHZhcmlhYmlsaXR5VHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eUVsZW1lbnQgZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJaWYgKHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgIT0gbnVsbAotCQkJCSYmICgoRU9iamVjdCkgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQkJdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGVSZXNvbHZlUHJveHkob2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCk7Ci0JCQlpZiAodmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCAhPSBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLQkJCQkJCQl0aGlzLAotCQkJCQkJCU5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULAotCQkJCQkJCW9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQsCi0JCQkJCQkJdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eUVsZW1lbnQgYmFzaWNHZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpIHsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQsCi0JCQkJCW9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQsIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDb25jZXB0c0FuZFBhcGVycygpIHsKLQkJaWYgKGNvbmNlcHRzQW5kUGFwZXJzID09IG51bGwpIHsKLQkJCWNvbmNlcHRzQW5kUGFwZXJzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChDb25jZXB0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbmNlcHRzQW5kUGFwZXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldENoZWNrbGlzdHMoKSB7Ci0JCWlmIChjaGVja2xpc3RzID09IG51bGwpIHsKLQkJCWNoZWNrbGlzdHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KENoZWNrbGlzdC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFMpOwotCQl9Ci0JCXJldHVybiBjaGVja2xpc3RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEd1aWRlbGluZXMoKSB7Ci0JCWlmIChndWlkZWxpbmVzID09IG51bGwpIHsKLQkJCWd1aWRlbGluZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KEd1aWRlbGluZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dVSURFTElORVMpOwotCQl9Ci0JCXJldHVybiBndWlkZWxpbmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEV4YW1wbGVzKCkgewotCQlpZiAoZXhhbXBsZXMgPT0gbnVsbCkgewotCQkJZXhhbXBsZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KEV4YW1wbGUuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUyk7Ci0JCX0KLQkJcmV0dXJuIGV4YW1wbGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFzc2V0cygpIHsKLQkJaWYgKGFzc2V0cyA9PSBudWxsKSB7Ci0JCQlhc3NldHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KFJldXNhYmxlQXNzZXQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19BU1NFVFMpOwotCQl9Ci0JCXJldHVybiBhc3NldHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM6Ci0JCQlyZXR1cm4gZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTOgotCQkJcmV0dXJuIGdldENvbmNlcHRzQW5kUGFwZXJzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFM6Ci0JCQlyZXR1cm4gZ2V0Q2hlY2tsaXN0cygpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTOgotCQkJcmV0dXJuIGdldEd1aWRlbGluZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRVM6Ci0JCQlyZXR1cm4gZ2V0RXhhbXBsZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQVNTRVRTOgotCQkJcmV0dXJuIGdldEFzc2V0cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlzZXRWYXJpYWJpbGl0eVR5cGUoKFZhcmlhYmlsaXR5VHlwZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgoVmFyaWFiaWxpdHlFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOgotCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLmNsZWFyKCk7Ci0JCQlnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NPTkNFUFRTX0FORF9QQVBFUlM6Ci0JCQlnZXRDb25jZXB0c0FuZFBhcGVycygpLmNsZWFyKCk7Ci0JCQlnZXRDb25jZXB0c0FuZFBhcGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTOgotCQkJZ2V0Q2hlY2tsaXN0cygpLmNsZWFyKCk7Ci0JCQlnZXRDaGVja2xpc3RzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dVSURFTElORVM6Ci0JCQlnZXRHdWlkZWxpbmVzKCkuY2xlYXIoKTsKLQkJCWdldEd1aWRlbGluZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRVM6Ci0JCQlnZXRFeGFtcGxlcygpLmNsZWFyKCk7Ci0JCQlnZXRFeGFtcGxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19BU1NFVFM6Ci0JCQlnZXRBc3NldHMoKS5jbGVhcigpOwotCQkJZ2V0QXNzZXRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJc2V0VmFyaWFiaWxpdHlUeXBlKFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgoVmFyaWFiaWxpdHlFbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM6Ci0JCQlnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzoKLQkJCWdldENvbmNlcHRzQW5kUGFwZXJzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUUzoKLQkJCWdldENoZWNrbGlzdHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTOgotCQkJZ2V0R3VpZGVsaW5lcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTOgotCQkJZ2V0RXhhbXBsZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19BU1NFVFM6Ci0JCQlnZXRBc3NldHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZSAhPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJcmV0dXJuIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM6Ci0JCQlyZXR1cm4gc3VwcG9ydGluZ01hdGVyaWFscyAhPSBudWxsCi0JCQkJCSYmICFzdXBwb3J0aW5nTWF0ZXJpYWxzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzoKLQkJCXJldHVybiBjb25jZXB0c0FuZFBhcGVycyAhPSBudWxsICYmICFjb25jZXB0c0FuZFBhcGVycy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFM6Ci0JCQlyZXR1cm4gY2hlY2tsaXN0cyAhPSBudWxsICYmICFjaGVja2xpc3RzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUzoKLQkJCXJldHVybiBndWlkZWxpbmVzICE9IG51bGwgJiYgIWd1aWRlbGluZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUzoKLQkJCXJldHVybiBleGFtcGxlcyAhPSBudWxsICYmICFleGFtcGxlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0FTU0VUUzoKLQkJCXJldHVybiBhc3NldHMgIT0gbnVsbCAmJiAhYXNzZXRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpIHsKLQkJaWYgKHN1cHBvcnRpbmdNYXRlcmlhbHMgPT0gbnVsbCkgewotCQkJc3VwcG9ydGluZ01hdGVyaWFscyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoCi0JCQkJCVN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTKTsKLQkJfQotCQlyZXR1cm4gc3VwcG9ydGluZ01hdGVyaWFsczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZhcmlhYmlsaXR5VHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh2YXJpYWJpbGl0eVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLwotCS8vIFN0YXJ0IGN1c3RvbSBjb2RlCi0JLy8KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5OYW1lZEVsZW1lbnRJbXBsI3NldE5hbWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmIChwcmVzZW50YXRpb24gPT0gbnVsbCkgewotCQkJc3VwZXIuc2V0TmFtZShuZXdOYW1lKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJc3VwZXIuc2V0TmFtZShuZXdOYW1lKTsKLQkJaWYgKG5ld05hbWUgIT0gbnVsbCAmJiAhbmV3TmFtZS5lcXVhbHMob2xkTmFtZSkpIHsKLQkJCXByZXNlbnRhdGlvbi5zZXROYW1lKFVtYVV0aWwuY3JlYXRlQ29udGVudERlc2NyaXB0aW9uTmFtZSh0aGlzKSk7Ci0JCX0KLQl9Ci0KLX0gLy9Db250ZW50RWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnRlbnRQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhlNzBjMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBQYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsI2dldENvbnRlbnRFbGVtZW50cyA8ZW0+Q29udGVudCBFbGVtZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRQYWNrYWdlSW1wbCBleHRlbmRzIE1ldGhvZFBhY2thZ2VJbXBsIGltcGxlbWVudHMKLQkJQ29udGVudFBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udGVudEVsZW1lbnRzKCkgPGVtPkNvbnRlbnQgRWxlbWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY29udGVudEVsZW1lbnRzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50UGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDb250ZW50RWxlbWVudHMoKSB7Ci0JCWlmIChjb250ZW50RWxlbWVudHMgPT0gbnVsbCkgewotCQkJY29udGVudEVsZW1lbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZygKLQkJCQkJQ29udGVudEVsZW1lbnQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTKTsKLQkJfQotCQlyZXR1cm4gY29udGVudEVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRDb250ZW50RWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFM6Ci0JCQlyZXR1cm4gZ2V0Q29udGVudEVsZW1lbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzoKLQkJCWdldENvbnRlbnRFbGVtZW50cygpLmNsZWFyKCk7Ci0JCQlnZXRDb250ZW50RWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFM6Ci0JCQlnZXRDb250ZW50RWxlbWVudHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTOgotCQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50cyAhPSBudWxsICYmICFjb250ZW50RWxlbWVudHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Db250ZW50UGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiM2Y2MTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsI2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZUltcGwgZXh0ZW5kcyBTZW1hbnRpY01vZGVsQnJpZGdlSW1wbAotCQlpbXBsZW1lbnRzIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVsZW1lbnQoKSA8ZW0+RWxlbWVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT1JFX1NFTUFOVElDX01PREVMX0JSSURHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlpZiAoZWxlbWVudCAhPSBudWxsICYmICgoRU9iamVjdCkgZWxlbWVudCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEVsZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBlbGVtZW50OwotCQkJZWxlbWVudCA9IChFbGVtZW50KSBlUmVzb2x2ZVByb3h5KG9sZEVsZW1lbnQpOwotCQkJaWYgKGVsZW1lbnQgIT0gb2xkRWxlbWVudCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5DT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCwKLQkJCQkJCQlvbGRFbGVtZW50LCBlbGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVsZW1lbnQgYmFzaWNHZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50KEVsZW1lbnQgbmV3RWxlbWVudCkgewotCQlFbGVtZW50IG9sZEVsZW1lbnQgPSBlbGVtZW50OwotCQllbGVtZW50ID0gbmV3RWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5DT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCwgb2xkRWxlbWVudCwKLQkJCQkJZWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQ6Ci0JCQlzZXRFbGVtZW50KChFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQ6Ci0JCQlzZXRFbGVtZW50KChFbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UOgotCQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DdXN0b21DYXRlZ29yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0N1c3RvbUNhdGVnb3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYTQ3OGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0N1c3RvbUNhdGVnb3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DdXN0b20gQ2F0ZWdvcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cyA8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwjZ2V0U3ViQ2F0ZWdvcmllcyA8ZW0+U3ViIENhdGVnb3JpZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yeUltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMKLQkJQ3VzdG9tQ2F0ZWdvcnkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpIDxlbT5DYXRlZ29yaXplZCBFbGVtZW50czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY2F0ZWdvcml6ZWRFbGVtZW50cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJDYXRlZ29yaWVzKCkgPGVtPlN1YiBDYXRlZ29yaWVzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YkNhdGVnb3JpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzdWJDYXRlZ29yaWVzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDdXN0b21DYXRlZ29yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkgewotCQlpZiAoY2F0ZWdvcml6ZWRFbGVtZW50cyA9PSBudWxsKSB7Ci0JCQljYXRlZ29yaXplZEVsZW1lbnRzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdCgKLQkJCQkJRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFMpOwotCQl9Ci0JCXJldHVybiBjYXRlZ29yaXplZEVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFN1YkNhdGVnb3JpZXMoKSB7Ci0JCWlmIChzdWJDYXRlZ29yaWVzID09IG51bGwpIHsKLQkJCXN1YkNhdGVnb3JpZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KENvbnRlbnRDYXRlZ29yeS5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SSUVTKTsKLQkJfQotCQlyZXR1cm4gc3ViQ2F0ZWdvcmllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlRTOgotCQkJcmV0dXJuIGdldENhdGVnb3JpemVkRWxlbWVudHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JJRVM6Ci0JCQlyZXR1cm4gZ2V0U3ViQ2F0ZWdvcmllcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlRTOgotCQkJZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLmNsZWFyKCk7Ci0JCQlnZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SSUVTOgotCQkJZ2V0U3ViQ2F0ZWdvcmllcygpLmNsZWFyKCk7Ci0JCQlnZXRTdWJDYXRlZ29yaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUzoKLQkJCWdldENhdGVnb3JpemVkRWxlbWVudHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUzoKLQkJCWdldFN1YkNhdGVnb3JpZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUzoKLQkJCXJldHVybiBjYXRlZ29yaXplZEVsZW1lbnRzICE9IG51bGwKLQkJCQkJJiYgIWNhdGVnb3JpemVkRWxlbWVudHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUzoKLQkJCXJldHVybiBzdWJDYXRlZ29yaWVzICE9IG51bGwgJiYgIXN1YkNhdGVnb3JpZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9DdXN0b21DYXRlZ29yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxN2QyZGM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCNnZXRFeHRlcm5hbERlc2NyaXB0aW9uIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsI2dldFBhY2thZ2luZ0d1aWRhbmNlIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsCi0JCWltcGxlbWVudHMgRGVsaXZlcmFibGVEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfREVTQ1JJUFRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKSA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXh0ZXJuYWxEZXNjcmlwdGlvbiA9IEVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFja2FnaW5nR3VpZGFuY2UoKSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYWNrYWdpbmdHdWlkYW5jZSA9IFBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUkFCTEVfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbERlc2NyaXB0aW9uKFN0cmluZyBuZXdFeHRlcm5hbERlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRFeHRlcm5hbERlc2NyaXB0aW9uID0gZXh0ZXJuYWxEZXNjcmlwdGlvbjsKLQkJZXh0ZXJuYWxEZXNjcmlwdGlvbiA9IG5ld0V4dGVybmFsRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OLAotCQkJCQlvbGRFeHRlcm5hbERlc2NyaXB0aW9uLCBleHRlcm5hbERlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdpbmdHdWlkYW5jZSgpIHsKLQkJcmV0dXJuIHBhY2thZ2luZ0d1aWRhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhY2thZ2luZ0d1aWRhbmNlKFN0cmluZyBuZXdQYWNrYWdpbmdHdWlkYW5jZSkgewotCQlTdHJpbmcgb2xkUGFja2FnaW5nR3VpZGFuY2UgPSBwYWNrYWdpbmdHdWlkYW5jZTsKLQkJcGFja2FnaW5nR3VpZGFuY2UgPSBuZXdQYWNrYWdpbmdHdWlkYW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFLAotCQkJCQlvbGRQYWNrYWdpbmdHdWlkYW5jZSwgcGFja2FnaW5nR3VpZGFuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRToKLQkJCXJldHVybiBnZXRQYWNrYWdpbmdHdWlkYW5jZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT046Ci0JCQlzZXRFeHRlcm5hbERlc2NyaXB0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0U6Ci0JCQlzZXRQYWNrYWdpbmdHdWlkYW5jZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OOgotCQkJc2V0RXh0ZXJuYWxEZXNjcmlwdGlvbihFWFRFUk5BTF9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFOgotCQkJc2V0UGFja2FnaW5nR3VpZGFuY2UoUEFDS0FHSU5HX0dVSURBTkNFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTjoKLQkJCXJldHVybiBFWFRFUk5BTF9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZXh0ZXJuYWxEZXNjcmlwdGlvbiAhPSBudWxsCi0JCQkJCTogIUVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhleHRlcm5hbERlc2NyaXB0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0U6Ci0JCQlyZXR1cm4gUEFDS0FHSU5HX0dVSURBTkNFX0VERUZBVUxUID09IG51bGwgPyBwYWNrYWdpbmdHdWlkYW5jZSAhPSBudWxsCi0JCQkJCTogIVBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVC5lcXVhbHMocGFja2FnaW5nR3VpZGFuY2UpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGV4dGVybmFsRGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZXh0ZXJuYWxEZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFja2FnaW5nR3VpZGFuY2U6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocGFja2FnaW5nR3VpZGFuY2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVsaXZlcmFibGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyYWJsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGEwMGY0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyYWJsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyYWJsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbCNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMgPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcmFibGVJbXBsIGV4dGVuZHMgV29ya1Byb2R1Y3RJbXBsIGltcGxlbWVudHMgRGVsaXZlcmFibGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCkgPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVsaXZlcmFibGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSQUJMRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSB7Ci0JCWlmIChkZWxpdmVyZWRXb3JrUHJvZHVjdHMgPT0gbnVsbCkgewotCQkJZGVsaXZlcmVkV29ya1Byb2R1Y3RzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdCgKLQkJCQkJV29ya1Byb2R1Y3QuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1RTKTsKLQkJfQotCQlyZXR1cm4gZGVsaXZlcmVkV29ya1Byb2R1Y3RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUUzoKLQkJCXJldHVybiBnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1RTOgotCQkJZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCkuY2xlYXIoKTsKLQkJCWdldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUUzoKLQkJCWdldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFM6Ci0JCQlyZXR1cm4gZGVsaXZlcmVkV29ya1Byb2R1Y3RzICE9IG51bGwKLQkJCQkJJiYgIWRlbGl2ZXJlZFdvcmtQcm9kdWN0cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0RlbGl2ZXJhYmxlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjZiMGU2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0Umlza0xldmVsIDxlbT5SaXNrIExldmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldEVzdGltYXRpbmdUZWNobmlxdWUgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UgPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRUeXBlT2ZDb250cmFjdCA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCBleHRlbmRzIFByb2Nlc3NEZXNjcmlwdGlvbkltcGwKLQkJaW1wbGVtZW50cyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NhbGUoKSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0FMRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NhbGUoKSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNjYWxlID0gU0NBTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpIDxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1NfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvamVjdENoYXJhY3RlcmlzdGljcyA9IFBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJpc2tMZXZlbCgpIDxlbT5SaXNrIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSaXNrTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJJU0tfTEVWRUxfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJpc2tMZXZlbCgpIDxlbT5SaXNrIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSaXNrTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmlza0xldmVsID0gUklTS19MRVZFTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFU1RJTUFUSU5HX1RFQ0hOSVFVRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlc3RpbWF0aW5nVGVjaG5pcXVlID0gRVNUSU1BVElOR19URUNITklRVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvamVjdE1lbWJlckV4cGVydGlzZSA9IFBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlT2ZDb250cmFjdCgpIDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlT2ZDb250cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9PRl9DT05UUkFDVF9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZU9mQ29udHJhY3QoKSA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZU9mQ29udHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZU9mQ29udHJhY3QgPSBUWVBFX09GX0NPTlRSQUNUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNjYWxlKCkgewotCQlyZXR1cm4gc2NhbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NhbGUoU3RyaW5nIG5ld1NjYWxlKSB7Ci0JCVN0cmluZyBvbGRTY2FsZSA9IHNjYWxlOwotCQlzY2FsZSA9IG5ld1NjYWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFLCBvbGRTY2FsZSwKLQkJCQkJc2NhbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSB7Ci0JCXJldHVybiBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoU3RyaW5nIG5ld1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MpIHsKLQkJU3RyaW5nIG9sZFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPSBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzOwotCQlwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzID0gbmV3UHJvamVjdENoYXJhY3RlcmlzdGljczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCXRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1MsCi0JCQkJCW9sZFByb2plY3RDaGFyYWN0ZXJpc3RpY3MsIHByb2plY3RDaGFyYWN0ZXJpc3RpY3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJpc2tMZXZlbCgpIHsKLQkJcmV0dXJuIHJpc2tMZXZlbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSaXNrTGV2ZWwoU3RyaW5nIG5ld1Jpc2tMZXZlbCkgewotCQlTdHJpbmcgb2xkUmlza0xldmVsID0gcmlza0xldmVsOwotCQlyaXNrTGV2ZWwgPSBuZXdSaXNrTGV2ZWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTCwKLQkJCQkJb2xkUmlza0xldmVsLCByaXNrTGV2ZWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVzdGltYXRpbmdUZWNobmlxdWUoKSB7Ci0JCXJldHVybiBlc3RpbWF0aW5nVGVjaG5pcXVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVzdGltYXRpbmdUZWNobmlxdWUoU3RyaW5nIG5ld0VzdGltYXRpbmdUZWNobmlxdWUpIHsKLQkJU3RyaW5nIG9sZEVzdGltYXRpbmdUZWNobmlxdWUgPSBlc3RpbWF0aW5nVGVjaG5pcXVlOwotCQllc3RpbWF0aW5nVGVjaG5pcXVlID0gbmV3RXN0aW1hdGluZ1RlY2huaXF1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCXRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUsCi0JCQkJCW9sZEVzdGltYXRpbmdUZWNobmlxdWUsIGVzdGltYXRpbmdUZWNobmlxdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKSB7Ci0JCXJldHVybiBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoU3RyaW5nIG5ld1Byb2plY3RNZW1iZXJFeHBlcnRpc2UpIHsKLQkJU3RyaW5nIG9sZFByb2plY3RNZW1iZXJFeHBlcnRpc2UgPSBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlOwotCQlwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlID0gbmV3UHJvamVjdE1lbWJlckV4cGVydGlzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCXRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFLAotCQkJCQlvbGRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlLCBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlT2ZDb250cmFjdCgpIHsKLQkJcmV0dXJuIHR5cGVPZkNvbnRyYWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVPZkNvbnRyYWN0KFN0cmluZyBuZXdUeXBlT2ZDb250cmFjdCkgewotCQlTdHJpbmcgb2xkVHlwZU9mQ29udHJhY3QgPSB0eXBlT2ZDb250cmFjdDsKLQkJdHlwZU9mQ29udHJhY3QgPSBuZXdUeXBlT2ZDb250cmFjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNULAotCQkJCQlvbGRUeXBlT2ZDb250cmFjdCwgdHlwZU9mQ29udHJhY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRToKLQkJCXJldHVybiBnZXRTY2FsZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCQlyZXR1cm4gZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTDoKLQkJCXJldHVybiBnZXRSaXNrTGV2ZWwoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFOgotCQkJcmV0dXJuIGdldEVzdGltYXRpbmdUZWNobmlxdWUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCXJldHVybiBnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUOgotCQkJcmV0dXJuIGdldFR5cGVPZkNvbnRyYWN0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFOgotCQkJc2V0U2NhbGUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCQlzZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUw6Ci0JCQlzZXRSaXNrTGV2ZWwoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCQlzZXRFc3RpbWF0aW5nVGVjaG5pcXVlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCXNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVDoKLQkJCXNldFR5cGVPZkNvbnRyYWN0KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRToKLQkJCXNldFNjYWxlKFNDQUxFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTOgotCQkJc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyhQUk9KRUNUX0NIQVJBQ1RFUklTVElDU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMOgotCQkJc2V0Umlza0xldmVsKFJJU0tfTEVWRUxfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCQlzZXRFc3RpbWF0aW5nVGVjaG5pcXVlKEVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCXNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1Q6Ci0JCQlzZXRUeXBlT2ZDb250cmFjdChUWVBFX09GX0NPTlRSQUNUX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFOgotCQkJcmV0dXJuIFNDQUxFX0VERUZBVUxUID09IG51bGwgPyBzY2FsZSAhPSBudWxsIDogIVNDQUxFX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoc2NhbGUpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCQlyZXR1cm4gUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1NfRURFRkFVTFQgPT0gbnVsbCA/IHByb2plY3RDaGFyYWN0ZXJpc3RpY3MgIT0gbnVsbAotCQkJCQk6ICFQUk9KRUNUX0NIQVJBQ1RFUklTVElDU19FREVGQVVMVAotCQkJCQkJCS5lcXVhbHMocHJvamVjdENoYXJhY3RlcmlzdGljcyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMOgotCQkJcmV0dXJuIFJJU0tfTEVWRUxfRURFRkFVTFQgPT0gbnVsbCA/IHJpc2tMZXZlbCAhPSBudWxsCi0JCQkJCTogIVJJU0tfTEVWRUxfRURFRkFVTFQuZXF1YWxzKHJpc2tMZXZlbCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRToKLQkJCXJldHVybiBFU1RJTUFUSU5HX1RFQ0hOSVFVRV9FREVGQVVMVCA9PSBudWxsID8gZXN0aW1hdGluZ1RlY2huaXF1ZSAhPSBudWxsCi0JCQkJCTogIUVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhlc3RpbWF0aW5nVGVjaG5pcXVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCXJldHVybiBQUk9KRUNUX01FTUJFUl9FWFBFUlRJU0VfRURFRkFVTFQgPT0gbnVsbCA/IHByb2plY3RNZW1iZXJFeHBlcnRpc2UgIT0gbnVsbAotCQkJCQk6ICFQUk9KRUNUX01FTUJFUl9FWFBFUlRJU0VfRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKHByb2plY3RNZW1iZXJFeHBlcnRpc2UpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVDoKLQkJCXJldHVybiBUWVBFX09GX0NPTlRSQUNUX0VERUZBVUxUID09IG51bGwgPyB0eXBlT2ZDb250cmFjdCAhPSBudWxsCi0JCQkJCTogIVRZUEVfT0ZfQ09OVFJBQ1RfRURFRkFVTFQuZXF1YWxzKHR5cGVPZkNvbnRyYWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzY2FsZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzY2FsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJvamVjdENoYXJhY3RlcmlzdGljczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByaXNrTGV2ZWw6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocmlza0xldmVsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlc3RpbWF0aW5nVGVjaG5pcXVlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGVzdGltYXRpbmdUZWNobmlxdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByb2plY3RNZW1iZXJFeHBlcnRpc2U6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocHJvamVjdE1lbWJlckV4cGVydGlzZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZU9mQ29udHJhY3Q6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodHlwZU9mQ29udHJhY3QpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDNlYmVmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbCNnZXRFZHVjYXRpb25NYXRlcmlhbHMgPGVtPkVkdWNhdGlvbiBNYXRlcmlhbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsI2dldENvbW11bmljYXRpb25zTWF0ZXJpYWxzIDxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NJbXBsIGV4dGVuZHMgUHJvY2Vzc0ltcGwgaW1wbGVtZW50cyBEZWxpdmVyeVByb2Nlc3MgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCkgPGVtPkVkdWNhdGlvbiBNYXRlcmlhbHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZWR1Y2F0aW9uTWF0ZXJpYWxzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkgPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNvbW11bmljYXRpb25zTWF0ZXJpYWxzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyeVByb2Nlc3NJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEVkdWNhdGlvbk1hdGVyaWFscygpIHsKLQkJaWYgKGVkdWNhdGlvbk1hdGVyaWFscyA9PSBudWxsKSB7Ci0JCQllZHVjYXRpb25NYXRlcmlhbHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KAotCQkJCQlTdXBwb3J0aW5nTWF0ZXJpYWwuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUyk7Ci0JCX0KLQkJcmV0dXJuIGVkdWNhdGlvbk1hdGVyaWFsczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpIHsKLQkJaWYgKGNvbW11bmljYXRpb25zTWF0ZXJpYWxzID09IG51bGwpIHsKLQkJCWNvbW11bmljYXRpb25zTWF0ZXJpYWxzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdCgKLQkJCQkJU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbW11bmljYXRpb25zTWF0ZXJpYWxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTFM6Ci0JCQlyZXR1cm4gZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFM6Ci0JCQlyZXR1cm4gZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUzoKLQkJCWdldEVkdWNhdGlvbk1hdGVyaWFscygpLmNsZWFyKCk7Ci0JCQlnZXRFZHVjYXRpb25NYXRlcmlhbHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUzoKLQkJCWdldENvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkuY2xlYXIoKTsKLQkJCWdldENvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUzoKLQkJCWdldEVkdWNhdGlvbk1hdGVyaWFscygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFM6Ci0JCQlnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUxTOgotCQkJcmV0dXJuIGVkdWNhdGlvbk1hdGVyaWFscyAhPSBudWxsICYmICFlZHVjYXRpb25NYXRlcmlhbHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUxTOgotCQkJcmV0dXJuIGNvbW11bmljYXRpb25zTWF0ZXJpYWxzICE9IG51bGwKLQkJCQkJJiYgIWNvbW11bmljYXRpb25zTWF0ZXJpYWxzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vRGVsaXZlcnlQcm9jZXNzSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVzY3JpYmFibGVFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVzY3JpYmFibGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZGFmMjliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rlc2NyaWJhYmxlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsI2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwjZ2V0U2hhcGVpY29uIDxlbT5TaGFwZWljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsI2dldE5vZGVpY29uIDxlbT5Ob2RlaWNvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERlc2NyaWJhYmxlRWxlbWVudEltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbAotCQlpbXBsZW1lbnRzIERlc2NyaWJhYmxlRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlc2VudGF0aW9uTmFtZSgpIDxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGF0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlc2VudGF0aW9uTmFtZSgpIDxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGF0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVzZW50YXRpb25OYW1lID0gUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50YXRpb24oKSA8ZW0+UHJlc2VudGF0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50RGVzY3JpcHRpb24gcHJlc2VudGF0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaGFwZWljb24oKSA8ZW0+U2hhcGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTaGFwZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVVJJIFNIQVBFSUNPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaGFwZWljb24oKSA8ZW0+U2hhcGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTaGFwZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBVUkkgc2hhcGVpY29uID0gU0hBUEVJQ09OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vZGVpY29uKCkgPGVtPk5vZGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb2RlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkkgTk9ERUlDT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm9kZWljb24oKSA8ZW0+Tm9kZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vZGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVVJJIG5vZGVpY29uID0gTk9ERUlDT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVzY3JpYmFibGVFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZXNlbnRhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBwcmVzZW50YXRpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlbnRhdGlvbk5hbWUoU3RyaW5nIG5ld1ByZXNlbnRhdGlvbk5hbWUpIHsKLQkJU3RyaW5nIG9sZFByZXNlbnRhdGlvbk5hbWUgPSBwcmVzZW50YXRpb25OYW1lOwotCQlwcmVzZW50YXRpb25OYW1lID0gbmV3UHJlc2VudGF0aW9uTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSwKLQkJCQkJb2xkUHJlc2VudGF0aW9uTmFtZSwgcHJlc2VudGF0aW9uTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByZXNlbnRhdGlvbigKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBuZXdQcmVzZW50YXRpb24sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ29udGVudERlc2NyaXB0aW9uIG9sZFByZXNlbnRhdGlvbiA9IHByZXNlbnRhdGlvbjsKLQkJcHJlc2VudGF0aW9uID0gbmV3UHJlc2VudGF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQkJb2xkUHJlc2VudGF0aW9uLCBuZXdQcmVzZW50YXRpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVSSSBnZXRTaGFwZWljb24oKSB7Ci0JCXJldHVybiBzaGFwZWljb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2hhcGVpY29uKFVSSSBuZXdTaGFwZWljb24pIHsKLQkJVVJJIG9sZFNoYXBlaWNvbiA9IHNoYXBlaWNvbjsKLQkJc2hhcGVpY29uID0gbmV3U2hhcGVpY29uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTiwgb2xkU2hhcGVpY29uLAotCQkJCQlzaGFwZWljb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVVJJIGdldE5vZGVpY29uKCkgewotCQlyZXR1cm4gbm9kZWljb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9kZWljb24oVVJJIG5ld05vZGVpY29uKSB7Ci0JCVVSSSBvbGROb2RlaWNvbiA9IG5vZGVpY29uOwotCQlub2RlaWNvbiA9IG5ld05vZGVpY29uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OLCBvbGROb2RlaWNvbiwKLQkJCQkJbm9kZWljb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOgotCQkJcmV0dXJuIGJhc2ljU2V0UHJlc2VudGF0aW9uKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCXJldHVybiBnZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQcmVzZW50YXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjoKLQkJCXJldHVybiBnZXRTaGFwZWljb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJcmV0dXJuIGdldE5vZGVpY29uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJc2V0UHJlc2VudGF0aW9uTmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQlzZXRQcmVzZW50YXRpb24oKENvbnRlbnREZXNjcmlwdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOgotCQkJc2V0U2hhcGVpY29uKChVUkkpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJc2V0Tm9kZWljb24oKFVSSSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJc2V0UHJlc2VudGF0aW9uTmFtZShQUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQlzZXRQcmVzZW50YXRpb24oKENvbnRlbnREZXNjcmlwdGlvbikgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT046Ci0JCQlzZXRTaGFwZWljb24oU0hBUEVJQ09OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJc2V0Tm9kZWljb24oTk9ERUlDT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQlyZXR1cm4gUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHByZXNlbnRhdGlvbk5hbWUgIT0gbnVsbAotCQkJCQk6ICFQUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVC5lcXVhbHMocHJlc2VudGF0aW9uTmFtZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQlyZXR1cm4gcHJlc2VudGF0aW9uICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT046Ci0JCQlyZXR1cm4gU0hBUEVJQ09OX0VERUZBVUxUID09IG51bGwgPyBzaGFwZWljb24gIT0gbnVsbAotCQkJCQk6ICFTSEFQRUlDT05fRURFRkFVTFQuZXF1YWxzKHNoYXBlaWNvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjoKLQkJCXJldHVybiBOT0RFSUNPTl9FREVGQVVMVCA9PSBudWxsID8gbm9kZWljb24gIT0gbnVsbAotCQkJCQk6ICFOT0RFSUNPTl9FREVGQVVMVC5lcXVhbHMobm9kZWljb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHByZXNlbnRhdGlvbk5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocHJlc2VudGF0aW9uTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2hhcGVpY29uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNoYXBlaWNvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbm9kZWljb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobm9kZWljb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLwotCS8vIFN0YXJ0IGN1c3RvbSBjb2RlCi0JLy8KLQotCXB1YmxpYyBDb250ZW50RGVzY3JpcHRpb24gYmFzaWNHZXRQcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiBwcmVzZW50YXRpb247Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwjZ2V0UHJlc2VudGF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgQ29udGVudERlc2NyaXB0aW9uIGdldFByZXNlbnRhdGlvbigpIHsKLQkJaWYgKHByZXNlbnRhdGlvbiBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkmJiAoKEVPYmplY3QpIHByZXNlbnRhdGlvbikuZUlzUHJveHkoKSkgewotCQkJQ29udGVudERlc2NyaXB0aW9uIG9sZFByZXNlbnRhdGlvbiA9IHByZXNlbnRhdGlvbjsKLQkJCXByZXNlbnRhdGlvbiA9IChDb250ZW50RGVzY3JpcHRpb24pIGVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCkgcHJlc2VudGF0aW9uKTsKLQkJCWlmIChwcmVzZW50YXRpb24gIT0gb2xkUHJlc2VudGF0aW9uKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQkJCQlvbGRQcmVzZW50YXRpb24sIHByZXNlbnRhdGlvbikpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByZXNlbnRhdGlvbiA9PSBudWxsKSB7Ci0JCQkvLwkJCXNldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbih0aGlzKSk7Ci0JCQlpZiAoZW1wdHlQcmVzZW50YXRpb24gPT0gbnVsbCkgewotCQkJCWVtcHR5UHJlc2VudGF0aW9uID0gQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotCQkJCQkJLmNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbih0aGlzKTsKLQkJCQllbXB0eVByZXNlbnRhdGlvbi5lQWRhcHRlcnMoKS5hZGQoY2hhbmdlTGlzdGVuZXIpOwotCQkJfQotCQkJcmV0dXJuIGVtcHR5UHJlc2VudGF0aW9uOwotCQl9Ci0KLQkJcmV0dXJuIHByZXNlbnRhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb24gbmV3UHJlc2VudGF0aW9uKSB7Ci0JCWlmIChuZXdQcmVzZW50YXRpb24gIT0gcHJlc2VudGF0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcmVzZW50YXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHByZXNlbnRhdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByZXNlbnRhdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UHJlc2VudGF0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcmVzZW50YXRpb24obmV3UHJlc2VudGF0aW9uLCBtc2dzKTsKLQotCQkJLy8gY3VzdG9tIGNvZGUKLQkJCS8vCi0JCQllbXB0eVByZXNlbnRhdGlvbiA9IG51bGw7Ci0KLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJCW5ld1ByZXNlbnRhdGlvbiwgbmV3UHJlc2VudGF0aW9uKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb250ZW50RGVzY3JpcHRpb24gZW1wdHlQcmVzZW50YXRpb247Ci0KLQlwcml2YXRlIEFkYXB0ZXIgY2hhbmdlTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgZ2V0VGFyZ2V0KCk7Ci0JCQkJY29udGVudC5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0KLQkJCQkvLyBlbXB0eVByZXNlbnRhdGlvbiBpcyBtb2RpZmllZCwgY29udmVydCBpdCB0byByZWFsIHByZXNlbnRhdGlvbiBpZiBubyBwcmVzZW50YXRpb24gaXMgc2V0IHlldCAKLQkJCQkvLyBmb3IgdGhlIFByb2Nlc3NFbGVtZW50Ci0JCQkJLy8KLQkJCQlpZiAocHJlc2VudGF0aW9uID09IG51bGwpIHsKLQkJCQkJc2V0UHJlc2VudGF0aW9uKGNvbnRlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci19IC8vRGVzY3JpYmFibGVFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MDg5ODJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsI2dldFJlZmluZWREZXNjcmlwdGlvbiA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsCi0JCWltcGxlbWVudHMgRGVzY3JpcHRvckRlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZpbmVkRGVzY3JpcHRpb24oKSA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZJTkVEX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZpbmVkRGVzY3JpcHRpb24oKSA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlZmluZWREZXNjcmlwdGlvbiA9IFJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJUFRPUl9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmluZWREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHJlZmluZWREZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZpbmVkRGVzY3JpcHRpb24oU3RyaW5nIG5ld1JlZmluZWREZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkUmVmaW5lZERlc2NyaXB0aW9uID0gcmVmaW5lZERlc2NyaXB0aW9uOwotCQlyZWZpbmVkRGVzY3JpcHRpb24gPSBuZXdSZWZpbmVkRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTiwKLQkJCQkJb2xkUmVmaW5lZERlc2NyaXB0aW9uLCByZWZpbmVkRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIGdldFJlZmluZWREZXNjcmlwdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OOgotCQkJc2V0UmVmaW5lZERlc2NyaXB0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OOgotCQkJc2V0UmVmaW5lZERlc2NyaXB0aW9uKFJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTjoKLQkJCXJldHVybiBSRUZJTkVEX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyByZWZpbmVkRGVzY3JpcHRpb24gIT0gbnVsbAotCQkJCQk6ICFSRUZJTkVEX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhyZWZpbmVkRGVzY3JpcHRpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJlZmluZWREZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyZWZpbmVkRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZXNjcmlwdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGZjM2JlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9ySW1wbCNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERlc2NyaXB0b3JJbXBsIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQgPSBCb29sZWFuLlRSVUU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmlwdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSB7Ci0JCXJldHVybiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKEJvb2xlYW4gbmV3SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKSB7Ci0JCUJvb2xlYW4gb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCQlpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBuZXdJc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFLAotCQkJCQlvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UsIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCXJldHVybiBnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQlyZXR1cm4gSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUID09IG51bGwgPyBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgIT0gbnVsbAotCQkJCQk6ICFJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Rlc2NyaXB0b3JJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaWFncmFtRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpYWdyYW1FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OWMwYWE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpYWdyYW1FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlhZ3JhbSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUVsZW1lbnRJbXBsI2dldElzVmlzaWJsZSA8ZW0+SXMgVmlzaWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1FbGVtZW50SW1wbCNnZXRDb250YWluZXJfIDxlbT5Db250YWluZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtRWxlbWVudEltcGwjZ2V0UmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtRWxlbWVudEltcGwjZ2V0UHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlhZ3JhbUVsZW1lbnRJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlEaWFncmFtRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNWaXNpYmxlKCkgPGVtPklzIFZpc2libGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzVmlzaWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX1ZJU0lCTEVfRURFRkFVTFQgPSBCb29sZWFuLlRSVUU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1Zpc2libGUoKSA8ZW0+SXMgVmlzaWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNWaXNpYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc1Zpc2libGUgPSBJU19WSVNJQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmZXJlbmNlKCkgPGVtPlJlZmVyZW5jZTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZWZlcmVuY2UgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydHkoKSA8ZW0+UHJvcGVydHk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwcm9wZXJ0eSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ3JhbUVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0SXNWaXNpYmxlKCkgewotCQlyZXR1cm4gaXNWaXNpYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzVmlzaWJsZShCb29sZWFuIG5ld0lzVmlzaWJsZSkgewotCQlCb29sZWFuIG9sZElzVmlzaWJsZSA9IGlzVmlzaWJsZTsKLQkJaXNWaXNpYmxlID0gbmV3SXNWaXNpYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRSwgb2xkSXNWaXNpYmxlLAotCQkJCQlpc1Zpc2libGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhFbGVtZW50IGdldENvbnRhaW5lcl8oKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVIpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChHcmFwaEVsZW1lbnQpIGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhFbGVtZW50IGJhc2ljR2V0Q29udGFpbmVyKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoR3JhcGhFbGVtZW50KSBlSW50ZXJuYWxDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb250YWluZXIoR3JhcGhFbGVtZW50IG5ld0NvbnRhaW5lciwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdDb250YWluZXIsCi0JCQkJVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUiwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihHcmFwaEVsZW1lbnQgbmV3Q29udGFpbmVyKSB7Ci0JCWlmIChuZXdDb250YWluZXIgIT0gZUludGVybmFsQ29udGFpbmVyKCkKLQkJCQl8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSICYmIG5ld0NvbnRhaW5lciAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIChFT2JqZWN0KSBuZXdDb250YWluZXIpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3Q29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdDb250YWluZXIpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQkJCUdyYXBoRWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb250YWluZXIobmV3Q29udGFpbmVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUiwgbmV3Q29udGFpbmVyLAotCQkJCQluZXdDb250YWluZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWZlcmVuY2UoKSB7Ci0JCWlmIChyZWZlcmVuY2UgPT0gbnVsbCkgewotCQkJcmVmZXJlbmNlID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0KFJlZmVyZW5jZS5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRSwKLQkJCQkJVW1hUGFja2FnZS5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQpOwotCQl9Ci0JCXJldHVybiByZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHkoKSB7Ci0JCWlmIChwcm9wZXJ0eSA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0eSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmcoUHJvcGVydHkuY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWSk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjoKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0Q29udGFpbmVyKChHcmFwaEVsZW1lbnQpIG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0UmVmZXJlbmNlKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOgotCQkJcmV0dXJuIGJhc2ljU2V0Q29udGFpbmVyKG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0U6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRSZWZlcmVuY2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldFByb3BlcnR5KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOgotCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELCBHcmFwaEVsZW1lbnQuY2xhc3MsCi0JCQkJCW1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU6Ci0JCQlyZXR1cm4gZ2V0SXNWaXNpYmxlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRDb250YWluZXJfKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRDb250YWluZXIoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOgotCQkJcmV0dXJuIGdldFJlZmVyZW5jZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWToKLQkJCXJldHVybiBnZXRQcm9wZXJ0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU6Ci0JCQlzZXRJc1Zpc2libGUoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOgotCQkJc2V0Q29udGFpbmVyKChHcmFwaEVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOgotCQkJZ2V0UmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCWdldFJlZmVyZW5jZSgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWToKLQkJCWdldFByb3BlcnR5KCkuY2xlYXIoKTsKLQkJCWdldFByb3BlcnR5KCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFOgotCQkJc2V0SXNWaXNpYmxlKElTX1ZJU0lCTEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI6Ci0JCQlzZXRDb250YWluZXIoKEdyYXBoRWxlbWVudCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRToKLQkJCWdldFJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOgotCQkJZ2V0UHJvcGVydHkoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFOgotCQkJcmV0dXJuIElTX1ZJU0lCTEVfRURFRkFVTFQgPT0gbnVsbCA/IGlzVmlzaWJsZSAhPSBudWxsCi0JCQkJCTogIUlTX1ZJU0lCTEVfRURFRkFVTFQuZXF1YWxzKGlzVmlzaWJsZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjoKLQkJCXJldHVybiBiYXNpY0dldENvbnRhaW5lcigpICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRToKLQkJCXJldHVybiByZWZlcmVuY2UgIT0gbnVsbCAmJiAhcmVmZXJlbmNlLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFk6Ci0JCQlyZXR1cm4gcHJvcGVydHkgIT0gbnVsbCAmJiAhcHJvcGVydHkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzVmlzaWJsZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpc1Zpc2libGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EaWFncmFtRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpYWdyYW1JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaWFncmFtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YTZhNGNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpYWdyYW1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1JbXBsI2dldFpvb20gPGVtPlpvb208L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtSW1wbCNnZXRWaWV3cG9pbnQgPGVtPlZpZXdwb2ludDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1JbXBsI2dldERpYWdyYW1MaW5rIDxlbT5EaWFncmFtIExpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtSW1wbCNnZXROYW1lc3BhY2UgPGVtPk5hbWVzcGFjZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1JbXBsIGV4dGVuZHMgR3JhcGhOb2RlSW1wbCBpbXBsZW1lbnRzIERpYWdyYW0gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFpvb20oKSA8ZW0+Wm9vbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Wm9vbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgWk9PTV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRab29tKCkgPGVtPlpvb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFpvb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEb3VibGUgem9vbSA9IFpPT01fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWaWV3cG9pbnQoKSA8ZW0+Vmlld3BvaW50PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWaWV3cG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCB2aWV3cG9pbnQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlhZ3JhbUxpbmsoKSA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpYWdyYW1MaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGlhZ3JhbUxpbmsgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZXNwYWNlKCkgPGVtPk5hbWVzcGFjZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZXNwYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lc3BhY2UgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0Wm9vbSgpIHsKLQkJcmV0dXJuIHpvb207Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Wm9vbShEb3VibGUgbmV3Wm9vbSkgewotCQlEb3VibGUgb2xkWm9vbSA9IHpvb207Ci0JCXpvb20gPSBuZXdab29tOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fX1pPT00sIG9sZFpvb20sIHpvb20pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0Vmlld3BvaW50KCkgewotCQlpZiAodmlld3BvaW50ICE9IG51bGwgJiYgKChFT2JqZWN0KSB2aWV3cG9pbnQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRWaWV3cG9pbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSB2aWV3cG9pbnQ7Ci0JCQl2aWV3cG9pbnQgPSAoUG9pbnQpIGVSZXNvbHZlUHJveHkob2xkVmlld3BvaW50KTsKLQkJCWlmICh2aWV3cG9pbnQgIT0gb2xkVmlld3BvaW50KSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1ZpZXdwb2ludCA9IChJbnRlcm5hbEVPYmplY3QpIHZpZXdwb2ludDsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkVmlld3BvaW50LmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5ESUFHUkFNX19WSUVXUE9JTlQsCi0JCQkJCQludWxsLCBudWxsKTsKLQkJCQlpZiAobmV3Vmlld3BvaW50LmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1ZpZXdwb2ludAotCQkJCQkJCS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCQktIFVtYVBhY2thZ2UuRElBR1JBTV9fVklFV1BPSU5ULCBudWxsLCBtc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19WSUVXUE9JTlQsIG9sZFZpZXdwb2ludCwKLQkJCQkJCQl2aWV3cG9pbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmlld3BvaW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBiYXNpY0dldFZpZXdwb2ludCgpIHsKLQkJcmV0dXJuIHZpZXdwb2ludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRWaWV3cG9pbnQoUG9pbnQgbmV3Vmlld3BvaW50LAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQb2ludCBvbGRWaWV3cG9pbnQgPSB2aWV3cG9pbnQ7Ci0JCXZpZXdwb2ludCA9IG5ld1ZpZXdwb2ludDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ESUFHUkFNX19WSUVXUE9JTlQsCi0JCQkJCW9sZFZpZXdwb2ludCwgbmV3Vmlld3BvaW50KTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpZXdwb2ludChQb2ludCBuZXdWaWV3cG9pbnQpIHsKLQkJaWYgKG5ld1ZpZXdwb2ludCAhPSB2aWV3cG9pbnQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHZpZXdwb2ludCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgdmlld3BvaW50KS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuRElBR1JBTV9fVklFV1BPSU5ULAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Vmlld3BvaW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdWaWV3cG9pbnQpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5ESUFHUkFNX19WSUVXUE9JTlQsCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFZpZXdwb2ludChuZXdWaWV3cG9pbnQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fX1ZJRVdQT0lOVCwgbmV3Vmlld3BvaW50LCBuZXdWaWV3cG9pbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREaWFncmFtTGluaygpIHsKLQkJaWYgKGRpYWdyYW1MaW5rID09IG51bGwpIHsKLQkJCWRpYWdyYW1MaW5rID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0KAotCQkJCQlEaWFncmFtTGluay5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTkssCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19ESUFHUkFNKTsKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbUxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlbWFudGljTW9kZWxCcmlkZ2UgZ2V0TmFtZXNwYWNlKCkgewotCQlpZiAobmFtZXNwYWNlICE9IG51bGwgJiYgKChFT2JqZWN0KSBuYW1lc3BhY2UpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGROYW1lc3BhY2UgPSAoSW50ZXJuYWxFT2JqZWN0KSBuYW1lc3BhY2U7Ci0JCQluYW1lc3BhY2UgPSAoU2VtYW50aWNNb2RlbEJyaWRnZSkgZVJlc29sdmVQcm94eShvbGROYW1lc3BhY2UpOwotCQkJaWYgKG5hbWVzcGFjZSAhPSBvbGROYW1lc3BhY2UpIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3TmFtZXNwYWNlID0gKEludGVybmFsRU9iamVjdCkgbmFtZXNwYWNlOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGROYW1lc3BhY2UuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNLAotCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbnVsbCk7Ci0JCQkJaWYgKG5ld05hbWVzcGFjZS5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdOYW1lc3BhY2UuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCQlVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSwKLQkJCQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCBtc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0UsIG9sZE5hbWVzcGFjZSwKLQkJCQkJCQluYW1lc3BhY2UpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZW1hbnRpY01vZGVsQnJpZGdlIGJhc2ljR2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE5hbWVzcGFjZSgKLQkJCVNlbWFudGljTW9kZWxCcmlkZ2UgbmV3TmFtZXNwYWNlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVNlbWFudGljTW9kZWxCcmlkZ2Ugb2xkTmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQluYW1lc3BhY2UgPSBuZXdOYW1lc3BhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFLAotCQkJCQlvbGROYW1lc3BhY2UsIG5ld05hbWVzcGFjZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU2VtYW50aWNNb2RlbEJyaWRnZSBuZXdOYW1lc3BhY2UpIHsKLQkJaWYgKG5ld05hbWVzcGFjZSAhPSBuYW1lc3BhY2UpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmFtZXNwYWNlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0sCi0JCQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdOYW1lc3BhY2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld05hbWVzcGFjZSkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNLAotCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXROYW1lc3BhY2UobmV3TmFtZXNwYWNlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0UsIG5ld05hbWVzcGFjZSwgbmV3TmFtZXNwYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX0RJQUdSQU1fTElOSzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldERpYWdyYW1MaW5rKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX05BTUVTUEFDRToKLQkJCWlmIChuYW1lc3BhY2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5hbWVzcGFjZSkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLkRJQUdSQU1fX05BTUVTUEFDRSwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0TmFtZXNwYWNlKChTZW1hbnRpY01vZGVsQnJpZGdlKSBvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19WSUVXUE9JTlQ6Ci0JCQlyZXR1cm4gYmFzaWNTZXRWaWV3cG9pbnQobnVsbCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTks6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXREaWFncmFtTGluaygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0U6Ci0JCQlyZXR1cm4gYmFzaWNTZXROYW1lc3BhY2UobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX1pPT006Ci0JCQlyZXR1cm4gZ2V0Wm9vbSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fVklFV1BPSU5UOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFZpZXdwb2ludCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0Vmlld3BvaW50KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTks6Ci0JCQlyZXR1cm4gZ2V0RGlhZ3JhbUxpbmsoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX05BTUVTUEFDRToKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXROYW1lc3BhY2UoKTsKLQkJCXJldHVybiBiYXNpY0dldE5hbWVzcGFjZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19aT09NOgotCQkJc2V0Wm9vbSgoRG91YmxlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19WSUVXUE9JTlQ6Ci0JCQlzZXRWaWV3cG9pbnQoKFBvaW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTks6Ci0JCQlnZXREaWFncmFtTGluaygpLmNsZWFyKCk7Ci0JCQlnZXREaWFncmFtTGluaygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFOgotCQkJc2V0TmFtZXNwYWNlKChTZW1hbnRpY01vZGVsQnJpZGdlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fWk9PTToKLQkJCXNldFpvb20oWk9PTV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19WSUVXUE9JTlQ6Ci0JCQlzZXRWaWV3cG9pbnQoKFBvaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX0RJQUdSQU1fTElOSzoKLQkJCWdldERpYWdyYW1MaW5rKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX05BTUVTUEFDRToKLQkJCXNldE5hbWVzcGFjZSgoU2VtYW50aWNNb2RlbEJyaWRnZSkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19aT09NOgotCQkJcmV0dXJuIFpPT01fRURFRkFVTFQgPT0gbnVsbCA/IHpvb20gIT0gbnVsbCA6ICFaT09NX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoem9vbSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19WSUVXUE9JTlQ6Ci0JCQlyZXR1cm4gdmlld3BvaW50ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTks6Ci0JCQlyZXR1cm4gZGlhZ3JhbUxpbmsgIT0gbnVsbCAmJiAhZGlhZ3JhbUxpbmsuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFOgotCQkJcmV0dXJuIG5hbWVzcGFjZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHpvb206ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoem9vbSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RpYWdyYW1JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaWFncmFtTGlua0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpYWdyYW1MaW5rSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYmFhZDMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpYWdyYW1MaW5rSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaWFncmFtIExpbms8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtTGlua0ltcGwjZ2V0Wm9vbSA8ZW0+Wm9vbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1MaW5rSW1wbCNnZXRWaWV3cG9ydCA8ZW0+Vmlld3BvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtTGlua0ltcGwjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUxpbmtJbXBsI2dldERpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTGlua0ltcGwgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEltcGwgaW1wbGVtZW50cyBEaWFncmFtTGluayB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Wm9vbSgpIDxlbT5ab29tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRab29tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvdWJsZSBaT09NX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFpvb20oKSA8ZW0+Wm9vbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Wm9vbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSB6b29tID0gWk9PTV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZpZXdwb3J0KCkgPGVtPlZpZXdwb3J0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWaWV3cG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IHZpZXdwb3J0ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpYWdyYW0oKSA8ZW0+RGlhZ3JhbTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW0gZGlhZ3JhbSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ3JhbUxpbmtJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0xJTks7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRab29tKCkgewotCQlyZXR1cm4gem9vbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRab29tKERvdWJsZSBuZXdab29tKSB7Ci0JCURvdWJsZSBvbGRab29tID0gem9vbTsKLQkJem9vbSA9IG5ld1pvb207Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19aT09NLCBvbGRab29tLCB6b29tKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGdldFZpZXdwb3J0KCkgewotCQlpZiAodmlld3BvcnQgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHZpZXdwb3J0KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkVmlld3BvcnQgPSAoSW50ZXJuYWxFT2JqZWN0KSB2aWV3cG9ydDsKLQkJCXZpZXdwb3J0ID0gKFBvaW50KSBlUmVzb2x2ZVByb3h5KG9sZFZpZXdwb3J0KTsKLQkJCWlmICh2aWV3cG9ydCAhPSBvbGRWaWV3cG9ydCkgewotCQkJCUludGVybmFsRU9iamVjdCBuZXdWaWV3cG9ydCA9IChJbnRlcm5hbEVPYmplY3QpIHZpZXdwb3J0OwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRWaWV3cG9ydAotCQkJCQkJLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fVklFV1BPUlQsIG51bGwsIG51bGwpOwotCQkJCWlmIChuZXdWaWV3cG9ydC5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdWaWV3cG9ydC5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJLSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fVklFV1BPUlQsIG51bGwsIG1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fVklFV1BPUlQsIG9sZFZpZXdwb3J0LAotCQkJCQkJCXZpZXdwb3J0KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZpZXdwb3J0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBiYXNpY0dldFZpZXdwb3J0KCkgewotCQlyZXR1cm4gdmlld3BvcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Vmlld3BvcnQoUG9pbnQgbmV3Vmlld3BvcnQsCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBvaW50IG9sZFZpZXdwb3J0ID0gdmlld3BvcnQ7Ci0JCXZpZXdwb3J0ID0gbmV3Vmlld3BvcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19WSUVXUE9SVCwKLQkJCQkJb2xkVmlld3BvcnQsIG5ld1ZpZXdwb3J0KTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpZXdwb3J0KFBvaW50IG5ld1ZpZXdwb3J0KSB7Ci0JCWlmIChuZXdWaWV3cG9ydCAhPSB2aWV3cG9ydCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodmlld3BvcnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHZpZXdwb3J0KQotCQkJCQkJLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fVklFV1BPUlQsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ZpZXdwb3J0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdWaWV3cG9ydCkKLQkJCQkJCS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1ZJRVdQT1JULCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFZpZXdwb3J0KG5ld1ZpZXdwb3J0LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1ZJRVdQT1JULCBuZXdWaWV3cG9ydCwgbmV3Vmlld3BvcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhFbGVtZW50IGdldEdyYXBoRWxlbWVudCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChHcmFwaEVsZW1lbnQpIGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhFbGVtZW50IGJhc2ljR2V0R3JhcGhFbGVtZW50KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEdyYXBoRWxlbWVudCkgZUludGVybmFsQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0R3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCBuZXdHcmFwaEVsZW1lbnQsCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3R3JhcGhFbGVtZW50LAotCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5ULCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCBuZXdHcmFwaEVsZW1lbnQpIHsKLQkJaWYgKG5ld0dyYXBoRWxlbWVudCAhPSBlSW50ZXJuYWxDb250YWluZXIoKQotCQkJCXx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UICYmIG5ld0dyYXBoRWxlbWVudCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIChFT2JqZWN0KSBuZXdHcmFwaEVsZW1lbnQpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3R3JhcGhFbGVtZW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdHcmFwaEVsZW1lbnQpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0xJTkssIEdyYXBoRWxlbWVudC5jbGFzcywKLQkJCQkJCW1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0R3JhcGhFbGVtZW50KG5ld0dyYXBoRWxlbWVudCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5ULCBuZXdHcmFwaEVsZW1lbnQsCi0JCQkJCW5ld0dyYXBoRWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtIGdldERpYWdyYW0oKSB7Ci0JCWlmIChkaWFncmFtICE9IG51bGwgJiYgKChFT2JqZWN0KSBkaWFncmFtKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkRGlhZ3JhbSA9IChJbnRlcm5hbEVPYmplY3QpIGRpYWdyYW07Ci0JCQlkaWFncmFtID0gKERpYWdyYW0pIGVSZXNvbHZlUHJveHkob2xkRGlhZ3JhbSk7Ci0JCQlpZiAoZGlhZ3JhbSAhPSBvbGREaWFncmFtKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fRElBR1JBTSwgb2xkRGlhZ3JhbSwKLQkJCQkJCQlkaWFncmFtKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW0gYmFzaWNHZXREaWFncmFtKCkgewotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXREaWFncmFtKERpYWdyYW0gbmV3RGlhZ3JhbSwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRGlhZ3JhbSBvbGREaWFncmFtID0gZGlhZ3JhbTsKLQkJZGlhZ3JhbSA9IG5ld0RpYWdyYW07Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19ESUFHUkFNLAotCQkJCQlvbGREaWFncmFtLCBuZXdEaWFncmFtKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpYWdyYW0oRGlhZ3JhbSBuZXdEaWFncmFtKSB7Ci0JCWlmIChuZXdEaWFncmFtICE9IGRpYWdyYW0pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGRpYWdyYW0pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fX0RJQUdSQU1fTElOSywgRGlhZ3JhbS5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3RGlhZ3JhbSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3RGlhZ3JhbSkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fRElBR1JBTV9MSU5LLCBEaWFncmFtLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldERpYWdyYW0obmV3RGlhZ3JhbSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19ESUFHUkFNLCBuZXdEaWFncmFtLCBuZXdEaWFncmFtKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVDoKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0R3JhcGhFbGVtZW50KChHcmFwaEVsZW1lbnQpIG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fRElBR1JBTToKLQkJCWlmIChkaWFncmFtICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBkaWFncmFtKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTkssIERpYWdyYW0uY2xhc3MsIG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0RGlhZ3JhbSgoRGlhZ3JhbSkgb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19WSUVXUE9SVDoKLQkJCXJldHVybiBiYXNpY1NldFZpZXdwb3J0KG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UOgotCQkJcmV0dXJuIGJhc2ljU2V0R3JhcGhFbGVtZW50KG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19ESUFHUkFNOgotCQkJcmV0dXJuIGJhc2ljU2V0RGlhZ3JhbShudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVDoKLQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0xJTkssIEdyYXBoRWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fWk9PTToKLQkJCXJldHVybiBnZXRab29tKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1ZJRVdQT1JUOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFZpZXdwb3J0KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRWaWV3cG9ydCgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldEdyYXBoRWxlbWVudCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0R3JhcGhFbGVtZW50KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU06Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0RGlhZ3JhbSgpOwotCQkJcmV0dXJuIGJhc2ljR2V0RGlhZ3JhbSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1pPT006Ci0JCQlzZXRab29tKChEb3VibGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fVklFV1BPUlQ6Ci0JCQlzZXRWaWV3cG9ydCgoUG9pbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVDoKLQkJCXNldEdyYXBoRWxlbWVudCgoR3JhcGhFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU06Ci0JCQlzZXREaWFncmFtKChEaWFncmFtKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19aT09NOgotCQkJc2V0Wm9vbShaT09NX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fVklFV1BPUlQ6Ci0JCQlzZXRWaWV3cG9ydCgoUG9pbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UOgotCQkJc2V0R3JhcGhFbGVtZW50KChHcmFwaEVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19ESUFHUkFNOgotCQkJc2V0RGlhZ3JhbSgoRGlhZ3JhbSkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1pPT006Ci0JCQlyZXR1cm4gWk9PTV9FREVGQVVMVCA9PSBudWxsID8gem9vbSAhPSBudWxsIDogIVpPT01fRURFRkFVTFQKLQkJCQkJLmVxdWFscyh6b29tKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fVklFV1BPUlQ6Ci0JCQlyZXR1cm4gdmlld3BvcnQgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVDoKLQkJCXJldHVybiBiYXNpY0dldEdyYXBoRWxlbWVudCgpICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU06Ci0JCQlyZXR1cm4gZGlhZ3JhbSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHpvb206ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoem9vbSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RpYWdyYW1MaW5rSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGltZW5zaW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGltZW5zaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZGI0ZTFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpbWVuc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaW1lbnNpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaW1lbnNpb25JbXBsI2dldFdpZHRoIDxlbT5XaWR0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpbWVuc2lvbkltcGwjZ2V0SGVpZ2h0IDxlbT5IZWlnaHQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaW1lbnNpb25JbXBsIGV4dGVuZHMgTXVsdGlSZXNvdXJjZUVPYmplY3QgaW1wbGVtZW50cyBEaW1lbnNpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdpZHRoKCkgPGVtPldpZHRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXaWR0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgV0lEVEhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2lkdGgoKSA8ZW0+V2lkdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdpZHRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRG91YmxlIHdpZHRoID0gV0lEVEhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGVpZ2h0KCkgPGVtPkhlaWdodDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGVpZ2h0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvdWJsZSBIRUlHSFRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGVpZ2h0KCkgPGVtPkhlaWdodDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGVpZ2h0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRG91YmxlIGhlaWdodCA9IEhFSUdIVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaW1lbnNpb25JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ESU1FTlNJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIHdpZHRoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdpZHRoKERvdWJsZSBuZXdXaWR0aCkgewotCQlEb3VibGUgb2xkV2lkdGggPSB3aWR0aDsKLQkJd2lkdGggPSBuZXdXaWR0aDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESU1FTlNJT05fX1dJRFRILCBvbGRXaWR0aCwgd2lkdGgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG91YmxlIGdldEhlaWdodCgpIHsKLQkJcmV0dXJuIGhlaWdodDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIZWlnaHQoRG91YmxlIG5ld0hlaWdodCkgewotCQlEb3VibGUgb2xkSGVpZ2h0ID0gaGVpZ2h0OwotCQloZWlnaHQgPSBuZXdIZWlnaHQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRElNRU5TSU9OX19IRUlHSFQsIG9sZEhlaWdodCwgaGVpZ2h0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OX19XSURUSDoKLQkJCXJldHVybiBnZXRXaWR0aCgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OX19IRUlHSFQ6Ci0JCQlyZXR1cm4gZ2V0SGVpZ2h0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTl9fV0lEVEg6Ci0JCQlzZXRXaWR0aCgoRG91YmxlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT05fX0hFSUdIVDoKLQkJCXNldEhlaWdodCgoRG91YmxlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OX19XSURUSDoKLQkJCXNldFdpZHRoKFdJRFRIX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTl9fSEVJR0hUOgotCQkJc2V0SGVpZ2h0KEhFSUdIVF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT05fX1dJRFRIOgotCQkJcmV0dXJuIFdJRFRIX0VERUZBVUxUID09IG51bGwgPyB3aWR0aCAhPSBudWxsIDogIVdJRFRIX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMod2lkdGgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OX19IRUlHSFQ6Ci0JCQlyZXR1cm4gSEVJR0hUX0VERUZBVUxUID09IG51bGwgPyBoZWlnaHQgIT0gbnVsbCA6ICFIRUlHSFRfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhoZWlnaHQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHdpZHRoOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHdpZHRoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoZWlnaHQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaGVpZ2h0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGltZW5zaW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlzY2lwbGluZUdyb3VwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlzY2lwbGluZUdyb3VwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYWE3N2U0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rpc2NpcGxpbmVHcm91cGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNjaXBsaW5lIEdyb3VwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbCNnZXREaXNjaXBsaW5lcyA8ZW0+RGlzY2lwbGluZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lR3JvdXBpbmdJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzCi0JCURpc2NpcGxpbmVHcm91cGluZyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNjaXBsaW5lcygpIDxlbT5EaXNjaXBsaW5lczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpc2NpcGxpbmVzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXNjaXBsaW5lR3JvdXBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX0dST1VQSU5HOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERpc2NpcGxpbmVzKCkgewotCQlpZiAoZGlzY2lwbGluZXMgPT0gbnVsbCkgewotCQkJZGlzY2lwbGluZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KERpc2NpcGxpbmUuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMpOwotCQl9Ci0JCXJldHVybiBkaXNjaXBsaW5lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUzoKLQkJCXJldHVybiBnZXREaXNjaXBsaW5lcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUzoKLQkJCWdldERpc2NpcGxpbmVzKCkuY2xlYXIoKTsKLQkJCWdldERpc2NpcGxpbmVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVM6Ci0JCQlnZXREaXNjaXBsaW5lcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUzoKLQkJCXJldHVybiBkaXNjaXBsaW5lcyAhPSBudWxsICYmICFkaXNjaXBsaW5lcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0Rpc2NpcGxpbmVHcm91cGluZ0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rpc2NpcGxpbmVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaXNjaXBsaW5lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZjNjYTk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rpc2NpcGxpbmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2NpcGxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbCNnZXRUYXNrcyA8ZW0+VGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbCNnZXRTdWJkaXNjaXBsaW5lIDxlbT5TdWJkaXNjaXBsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUltcGwjZ2V0UmVmZXJlbmNlV29ya2Zsb3dzIDxlbT5SZWZlcmVuY2UgV29ya2Zsb3dzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgRGlzY2lwbGluZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXNrcygpIDxlbT5UYXNrczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRhc2tzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YmRpc2NpcGxpbmUoKSA8ZW0+U3ViZGlzY2lwbGluZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJkaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc3ViZGlzY2lwbGluZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZlcmVuY2VXb3JrZmxvd3MoKSA8ZW0+UmVmZXJlbmNlIFdvcmtmbG93czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2VXb3JrZmxvd3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZWZlcmVuY2VXb3JrZmxvd3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpc2NpcGxpbmVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFRhc2tzKCkgewotCQlpZiAodGFza3MgPT0gbnVsbCkgewotCQkJdGFza3MgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KFRhc2suY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuRElTQ0lQTElORV9fVEFTS1MpOwotCQl9Ci0JCXJldHVybiB0YXNrczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTdWJkaXNjaXBsaW5lKCkgewotCQlpZiAoc3ViZGlzY2lwbGluZSA9PSBudWxsKSB7Ci0JCQlzdWJkaXNjaXBsaW5lID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZygKLQkJCQkJRGlzY2lwbGluZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FKTsKLQkJfQotCQlyZXR1cm4gc3ViZGlzY2lwbGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWZlcmVuY2VXb3JrZmxvd3MoKSB7Ci0JCWlmIChyZWZlcmVuY2VXb3JrZmxvd3MgPT0gbnVsbCkgewotCQkJcmVmZXJlbmNlV29ya2Zsb3dzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChBY3Rpdml0eS5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1dTKTsKLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlV29ya2Zsb3dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0U3ViZGlzY2lwbGluZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0tTOgotCQkJcmV0dXJuIGdldFRhc2tzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FOgotCQkJcmV0dXJuIGdldFN1YmRpc2NpcGxpbmUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1M6Ci0JCQlyZXR1cm4gZ2V0UmVmZXJlbmNlV29ya2Zsb3dzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0tTOgotCQkJZ2V0VGFza3MoKS5jbGVhcigpOwotCQkJZ2V0VGFza3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQkRJU0NJUExJTkU6Ci0JCQlnZXRTdWJkaXNjaXBsaW5lKCkuY2xlYXIoKTsKLQkJCWdldFN1YmRpc2NpcGxpbmUoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1M6Ci0JCQlnZXRSZWZlcmVuY2VXb3JrZmxvd3MoKS5jbGVhcigpOwotCQkJZ2V0UmVmZXJlbmNlV29ya2Zsb3dzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fVEFTS1M6Ci0JCQlnZXRUYXNrcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FOgotCQkJZ2V0U3ViZGlzY2lwbGluZSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1dTOgotCQkJZ2V0UmVmZXJlbmNlV29ya2Zsb3dzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0tTOgotCQkJcmV0dXJuIHRhc2tzICE9IG51bGwgJiYgIXRhc2tzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQkRJU0NJUExJTkU6Ci0JCQlyZXR1cm4gc3ViZGlzY2lwbGluZSAhPSBudWxsICYmICFzdWJkaXNjaXBsaW5lLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1M6Ci0JCQlyZXR1cm4gcmVmZXJlbmNlV29ya2Zsb3dzICE9IG51bGwgJiYgIXJlZmVyZW5jZVdvcmtmbG93cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0Rpc2NpcGxpbmVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Eb21haW5JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Eb21haW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzZGFkNGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRG9tYWluSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RG9tYWluPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRG9tYWluSW1wbCNnZXRXb3JrUHJvZHVjdHMgPGVtPldvcmsgUHJvZHVjdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Eb21haW5JbXBsI2dldFN1YmRvbWFpbnMgPGVtPlN1YmRvbWFpbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21haW5JbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIERvbWFpbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrUHJvZHVjdHMoKSA8ZW0+V29yayBQcm9kdWN0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB3b3JrUHJvZHVjdHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3ViZG9tYWlucygpIDxlbT5TdWJkb21haW5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YmRvbWFpbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzdWJkb21haW5zID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEb21haW5JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ET01BSU47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0V29ya1Byb2R1Y3RzKCkgewotCQlpZiAod29ya1Byb2R1Y3RzID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoV29ya1Byb2R1Y3QuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuRE9NQUlOX19XT1JLX1BST0RVQ1RTKTsKLQkJfQotCQlyZXR1cm4gd29ya1Byb2R1Y3RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFN1YmRvbWFpbnMoKSB7Ci0JCWlmIChzdWJkb21haW5zID09IG51bGwpIHsKLQkJCXN1YmRvbWFpbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nKERvbWFpbi5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTlMpOwotCQl9Ci0JCXJldHVybiBzdWJkb21haW5zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTlM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRTdWJkb21haW5zKCkpCi0JCQkJCS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fV09SS19QUk9EVUNUUzoKLQkJCXJldHVybiBnZXRXb3JrUHJvZHVjdHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOUzoKLQkJCXJldHVybiBnZXRTdWJkb21haW5zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fV09SS19QUk9EVUNUUzoKLQkJCWdldFdvcmtQcm9kdWN0cygpLmNsZWFyKCk7Ci0JCQlnZXRXb3JrUHJvZHVjdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOUzoKLQkJCWdldFN1YmRvbWFpbnMoKS5jbGVhcigpOwotCQkJZ2V0U3ViZG9tYWlucygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fV09SS19QUk9EVUNUUzoKLQkJCWdldFdvcmtQcm9kdWN0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTlM6Ci0JCQlnZXRTdWJkb21haW5zKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fV09SS19QUk9EVUNUUzoKLQkJCXJldHVybiB3b3JrUHJvZHVjdHMgIT0gbnVsbCAmJiAhd29ya1Byb2R1Y3RzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOUzoKLQkJCXJldHVybiBzdWJkb21haW5zICE9IG51bGwgJiYgIXN1YmRvbWFpbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Eb21haW5JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9FbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTA2NzEzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbGVtZW50SW1wbCBleHRlbmRzIE11bHRpUmVzb3VyY2VFT2JqZWN0IGltcGxlbWVudHMKLQkJRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVMRU1FTlQ7Ci0JfQotCi19IC8vRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0VsbGlwc2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9FbGxpcHNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YTdlZTkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0VsbGlwc2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsbGlwc2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGxpcHNlSW1wbCNnZXRSYWRpdXNYIDxlbT5SYWRpdXMgWDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVsbGlwc2VJbXBsI2dldFJhZGl1c1kgPGVtPlJhZGl1cyBZPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxsaXBzZUltcGwjZ2V0Um90YXRpb24gPGVtPlJvdGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxsaXBzZUltcGwjZ2V0U3RhcnRBbmdsZSA8ZW0+U3RhcnQgQW5nbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGxpcHNlSW1wbCNnZXRFbmRBbmdsZSA8ZW0+RW5kIEFuZ2xlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxsaXBzZUltcGwjZ2V0Q2VudGVyIDxlbT5DZW50ZXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGxpcHNlSW1wbCBleHRlbmRzIEdyYXBoaWNQcmltaXRpdmVJbXBsIGltcGxlbWVudHMgRWxsaXBzZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFkaXVzWCgpIDxlbT5SYWRpdXMgWDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFkaXVzWCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgUkFESVVTX1hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFkaXVzWCgpIDxlbT5SYWRpdXMgWDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFkaXVzWCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSByYWRpdXNYID0gUkFESVVTX1hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFkaXVzWSgpIDxlbT5SYWRpdXMgWTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFkaXVzWSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgUkFESVVTX1lfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFkaXVzWSgpIDxlbT5SYWRpdXMgWTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFkaXVzWSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSByYWRpdXNZID0gUkFESVVTX1lfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um90YXRpb24oKSA8ZW0+Um90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvdWJsZSBST1RBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb3RhdGlvbigpIDxlbT5Sb3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEb3VibGUgcm90YXRpb24gPSBST1RBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydEFuZ2xlKCkgPGVtPlN0YXJ0IEFuZ2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydEFuZ2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvdWJsZSBTVEFSVF9BTkdMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydEFuZ2xlKCkgPGVtPlN0YXJ0IEFuZ2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydEFuZ2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRG91YmxlIHN0YXJ0QW5nbGUgPSBTVEFSVF9BTkdMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbmRBbmdsZSgpIDxlbT5FbmQgQW5nbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVuZEFuZ2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvdWJsZSBFTkRfQU5HTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW5kQW5nbGUoKSA8ZW0+RW5kIEFuZ2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbmRBbmdsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSBlbmRBbmdsZSA9IEVORF9BTkdMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENlbnRlcigpIDxlbT5DZW50ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENlbnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGNlbnRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWxsaXBzZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVMTElQU0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRSYWRpdXNYKCkgewotCQlyZXR1cm4gcmFkaXVzWDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSYWRpdXNYKERvdWJsZSBuZXdSYWRpdXNYKSB7Ci0JCURvdWJsZSBvbGRSYWRpdXNYID0gcmFkaXVzWDsKLQkJcmFkaXVzWCA9IG5ld1JhZGl1c1g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRUxMSVBTRV9fUkFESVVTX1gsIG9sZFJhZGl1c1gsIHJhZGl1c1gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG91YmxlIGdldFJhZGl1c1koKSB7Ci0JCXJldHVybiByYWRpdXNZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhZGl1c1koRG91YmxlIG5ld1JhZGl1c1kpIHsKLQkJRG91YmxlIG9sZFJhZGl1c1kgPSByYWRpdXNZOwotCQlyYWRpdXNZID0gbmV3UmFkaXVzWTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWSwgb2xkUmFkaXVzWSwgcmFkaXVzWSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0Um90YXRpb24oKSB7Ci0JCXJldHVybiByb3RhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb3RhdGlvbihEb3VibGUgbmV3Um90YXRpb24pIHsKLQkJRG91YmxlIG9sZFJvdGF0aW9uID0gcm90YXRpb247Ci0JCXJvdGF0aW9uID0gbmV3Um90YXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRUxMSVBTRV9fUk9UQVRJT04sIG9sZFJvdGF0aW9uLCByb3RhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0U3RhcnRBbmdsZSgpIHsKLQkJcmV0dXJuIHN0YXJ0QW5nbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRBbmdsZShEb3VibGUgbmV3U3RhcnRBbmdsZSkgewotCQlEb3VibGUgb2xkU3RhcnRBbmdsZSA9IHN0YXJ0QW5nbGU7Ci0JCXN0YXJ0QW5nbGUgPSBuZXdTdGFydEFuZ2xlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkVMTElQU0VfX1NUQVJUX0FOR0xFLCBvbGRTdGFydEFuZ2xlLCBzdGFydEFuZ2xlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRFbmRBbmdsZSgpIHsKLQkJcmV0dXJuIGVuZEFuZ2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZEFuZ2xlKERvdWJsZSBuZXdFbmRBbmdsZSkgewotCQlEb3VibGUgb2xkRW5kQW5nbGUgPSBlbmRBbmdsZTsKLQkJZW5kQW5nbGUgPSBuZXdFbmRBbmdsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5FTExJUFNFX19FTkRfQU5HTEUsIG9sZEVuZEFuZ2xlLCBlbmRBbmdsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRDZW50ZXIoKSB7Ci0JCWlmIChjZW50ZXIgIT0gbnVsbCAmJiAoKEVPYmplY3QpIGNlbnRlcikuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZENlbnRlciA9IChJbnRlcm5hbEVPYmplY3QpIGNlbnRlcjsKLQkJCWNlbnRlciA9IChQb2ludCkgZVJlc29sdmVQcm94eShvbGRDZW50ZXIpOwotCQkJaWYgKGNlbnRlciAhPSBvbGRDZW50ZXIpIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3Q2VudGVyID0gKEludGVybmFsRU9iamVjdCkgY2VudGVyOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRDZW50ZXIuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLkVMTElQU0VfX0NFTlRFUiwKLQkJCQkJCW51bGwsIG51bGwpOwotCQkJCWlmIChuZXdDZW50ZXIuZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3Q2VudGVyLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQktIFVtYVBhY2thZ2UuRUxMSVBTRV9fQ0VOVEVSLCBudWxsLCBtc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5FTExJUFNFX19DRU5URVIsIG9sZENlbnRlciwgY2VudGVyKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNlbnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgYmFzaWNHZXRDZW50ZXIoKSB7Ci0JCXJldHVybiBjZW50ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2VudGVyKFBvaW50IG5ld0NlbnRlciwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUG9pbnQgb2xkQ2VudGVyID0gY2VudGVyOwotCQljZW50ZXIgPSBuZXdDZW50ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuRUxMSVBTRV9fQ0VOVEVSLCBvbGRDZW50ZXIsCi0JCQkJCW5ld0NlbnRlcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDZW50ZXIoUG9pbnQgbmV3Q2VudGVyKSB7Ci0JCWlmIChuZXdDZW50ZXIgIT0gY2VudGVyKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjZW50ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGNlbnRlcikuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLkVMTElQU0VfX0NFTlRFUiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NlbnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3Q2VudGVyKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuRUxMSVBTRV9fQ0VOVEVSLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDZW50ZXIobmV3Q2VudGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5FTExJUFNFX19DRU5URVIsIG5ld0NlbnRlciwgbmV3Q2VudGVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX0NFTlRFUjoKLQkJCXJldHVybiBiYXNpY1NldENlbnRlcihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUkFESVVTX1g6Ci0JCQlyZXR1cm4gZ2V0UmFkaXVzWCgpOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUkFESVVTX1k6Ci0JCQlyZXR1cm4gZ2V0UmFkaXVzWSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUk9UQVRJT046Ci0JCQlyZXR1cm4gZ2V0Um90YXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1NUQVJUX0FOR0xFOgotCQkJcmV0dXJuIGdldFN0YXJ0QW5nbGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX0VORF9BTkdMRToKLQkJCXJldHVybiBnZXRFbmRBbmdsZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fQ0VOVEVSOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldENlbnRlcigpOwotCQkJcmV0dXJuIGJhc2ljR2V0Q2VudGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19YOgotCQkJc2V0UmFkaXVzWCgoRG91YmxlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWToKLQkJCXNldFJhZGl1c1koKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUk9UQVRJT046Ci0JCQlzZXRSb3RhdGlvbigoRG91YmxlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19TVEFSVF9BTkdMRToKLQkJCXNldFN0YXJ0QW5nbGUoKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fRU5EX0FOR0xFOgotCQkJc2V0RW5kQW5nbGUoKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fQ0VOVEVSOgotCQkJc2V0Q2VudGVyKChQb2ludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19YOgotCQkJc2V0UmFkaXVzWChSQURJVVNfWF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWToKLQkJCXNldFJhZGl1c1koUkFESVVTX1lfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUk9UQVRJT046Ci0JCQlzZXRSb3RhdGlvbihST1RBVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19TVEFSVF9BTkdMRToKLQkJCXNldFN0YXJ0QW5nbGUoU1RBUlRfQU5HTEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fRU5EX0FOR0xFOgotCQkJc2V0RW5kQW5nbGUoRU5EX0FOR0xFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX0NFTlRFUjoKLQkJCXNldENlbnRlcigoUG9pbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUkFESVVTX1g6Ci0JCQlyZXR1cm4gUkFESVVTX1hfRURFRkFVTFQgPT0gbnVsbCA/IHJhZGl1c1ggIT0gbnVsbAotCQkJCQk6ICFSQURJVVNfWF9FREVGQVVMVC5lcXVhbHMocmFkaXVzWCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWToKLQkJCXJldHVybiBSQURJVVNfWV9FREVGQVVMVCA9PSBudWxsID8gcmFkaXVzWSAhPSBudWxsCi0JCQkJCTogIVJBRElVU19ZX0VERUZBVUxULmVxdWFscyhyYWRpdXNZKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JPVEFUSU9OOgotCQkJcmV0dXJuIFJPVEFUSU9OX0VERUZBVUxUID09IG51bGwgPyByb3RhdGlvbiAhPSBudWxsCi0JCQkJCTogIVJPVEFUSU9OX0VERUZBVUxULmVxdWFscyhyb3RhdGlvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19TVEFSVF9BTkdMRToKLQkJCXJldHVybiBTVEFSVF9BTkdMRV9FREVGQVVMVCA9PSBudWxsID8gc3RhcnRBbmdsZSAhPSBudWxsCi0JCQkJCTogIVNUQVJUX0FOR0xFX0VERUZBVUxULmVxdWFscyhzdGFydEFuZ2xlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX0VORF9BTkdMRToKLQkJCXJldHVybiBFTkRfQU5HTEVfRURFRkFVTFQgPT0gbnVsbCA/IGVuZEFuZ2xlICE9IG51bGwKLQkJCQkJOiAhRU5EX0FOR0xFX0VERUZBVUxULmVxdWFscyhlbmRBbmdsZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19DRU5URVI6Ci0JCQlyZXR1cm4gY2VudGVyICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocmFkaXVzWDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyYWRpdXNYKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByYWRpdXNZOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJhZGl1c1kpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJvdGF0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJvdGF0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydEFuZ2xlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHN0YXJ0QW5nbGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVuZEFuZ2xlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGVuZEFuZ2xlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRWxsaXBzZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzFhZWJlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMKLQkJRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCX0KLQotfSAvL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0V4YW1wbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9FeGFtcGxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNzQ3NmFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0V4YW1wbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXhhbXBsZUltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBFeGFtcGxlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeGFtcGxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRVhBTVBMRTsKLQl9Ci0KLX0gLy9FeGFtcGxlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhDb25uZWN0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaENvbm5lY3RvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjk3NGM5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaENvbm5lY3RvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HcmFwaCBDb25uZWN0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaENvbm5lY3RvckltcGwjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhDb25uZWN0b3JJbXBsI2dldEdyYXBoRWRnZSA8ZW0+R3JhcGggRWRnZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoQ29ubmVjdG9ySW1wbCBleHRlbmRzIEdyYXBoRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlHcmFwaENvbm5lY3RvciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcmFwaEVkZ2UoKSA8ZW0+R3JhcGggRWRnZTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcmFwaEVkZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBncmFwaEVkZ2UgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEdyYXBoQ29ubmVjdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfQ09OTkVDVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVsZW1lbnQgZ2V0R3JhcGhFbGVtZW50KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEdyYXBoRWxlbWVudCkgZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVsZW1lbnQgYmFzaWNHZXRHcmFwaEVsZW1lbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoR3JhcGhFbGVtZW50KSBlSW50ZXJuYWxDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IG5ld0dyYXBoRWxlbWVudCwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdHcmFwaEVsZW1lbnQsCi0JCQkJVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IG5ld0dyYXBoRWxlbWVudCkgewotCQlpZiAobmV3R3JhcGhFbGVtZW50ICE9IGVJbnRlcm5hbENvbnRhaW5lcigpCi0JCQkJfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQgJiYgbmV3R3JhcGhFbGVtZW50ICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgKEVPYmplY3QpIG5ld0dyYXBoRWxlbWVudCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdHcmFwaEVsZW1lbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0dyYXBoRWxlbWVudCkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFLAotCQkJCQkJR3JhcGhFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEdyYXBoRWxlbWVudChuZXdHcmFwaEVsZW1lbnQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVCwgbmV3R3JhcGhFbGVtZW50LAotCQkJCQluZXdHcmFwaEVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRHcmFwaEVkZ2UoKSB7Ci0JCWlmIChncmFwaEVkZ2UgPT0gbnVsbCkgewotCQkJZ3JhcGhFZGdlID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0Lk1hbnlJbnZlcnNlKAotCQkJCQlHcmFwaEVkZ2UuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VER0VfX0FOQ0hPUik7Ci0JCX0KLQkJcmV0dXJuIGdyYXBoRWRnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UOgotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXRHcmFwaEVsZW1lbnQoKEdyYXBoRWxlbWVudCkgb3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0R3JhcGhFZGdlKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVDoKLQkJCXJldHVybiBiYXNpY1NldEdyYXBoRWxlbWVudChudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEdyYXBoRWRnZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZSgKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0UsIEdyYXBoRWxlbWVudC5jbGFzcywKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRHcmFwaEVsZW1lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldEdyYXBoRWxlbWVudCgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFOgotCQkJcmV0dXJuIGdldEdyYXBoRWRnZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlzZXRHcmFwaEVsZW1lbnQoKEdyYXBoRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFOgotCQkJZ2V0R3JhcGhFZGdlKCkuY2xlYXIoKTsKLQkJCWdldEdyYXBoRWRnZSgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVDoKLQkJCXNldEdyYXBoRWxlbWVudCgoR3JhcGhFbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRToKLQkJCWdldEdyYXBoRWRnZSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gYmFzaWNHZXRHcmFwaEVsZW1lbnQoKSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFOgotCQkJcmV0dXJuIGdyYXBoRWRnZSAhPSBudWxsICYmICFncmFwaEVkZ2UuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9HcmFwaENvbm5lY3RvckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoRWRnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoRWRnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2IyYzkwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaEVkZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGggRWRnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWRnZUltcGwjZ2V0QW5jaG9yIDxlbT5BbmNob3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVkZ2VJbXBsI2dldFdheXBvaW50cyA8ZW0+V2F5cG9pbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhFZGdlSW1wbCBleHRlbmRzIEdyYXBoRWxlbWVudEltcGwgaW1wbGVtZW50cyBHcmFwaEVkZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QW5jaG9yKCkgPGVtPkFuY2hvcjwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbmNob3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhbmNob3IgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2F5cG9pbnRzKCkgPGVtPldheXBvaW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXYXlwb2ludHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB3YXlwb2ludHMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEdyYXBoRWRnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VER0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0QW5jaG9yKCkgewotCQlpZiAoYW5jaG9yID09IG51bGwpIHsKLQkJCWFuY2hvciA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdC5NYW55SW52ZXJzZSgKLQkJCQkJR3JhcGhDb25uZWN0b3IuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fQU5DSE9SLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRSk7Ci0JCX0KLQkJcmV0dXJuIGFuY2hvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXYXlwb2ludHMoKSB7Ci0JCWlmICh3YXlwb2ludHMgPT0gbnVsbCkgewotCQkJd2F5cG9pbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZyhQb2ludC5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5HUkFQSF9FREdFX19XQVlQT0lOVFMpOwotCQl9Ci0JCXJldHVybiB3YXlwb2ludHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX0FOQ0hPUjoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEFuY2hvcigpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFX19BTkNIT1I6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRBbmNob3IoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fV0FZUE9JTlRTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0V2F5cG9pbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fQU5DSE9SOgotCQkJcmV0dXJuIGdldEFuY2hvcigpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fV0FZUE9JTlRTOgotCQkJcmV0dXJuIGdldFdheXBvaW50cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFX19BTkNIT1I6Ci0JCQlnZXRBbmNob3IoKS5jbGVhcigpOwotCQkJZ2V0QW5jaG9yKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFX19XQVlQT0lOVFM6Ci0JCQlnZXRXYXlwb2ludHMoKS5jbGVhcigpOwotCQkJZ2V0V2F5cG9pbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fQU5DSE9SOgotCQkJZ2V0QW5jaG9yKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX1dBWVBPSU5UUzoKLQkJCWdldFdheXBvaW50cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFX19BTkNIT1I6Ci0JCQlyZXR1cm4gYW5jaG9yICE9IG51bGwgJiYgIWFuY2hvci5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFX19XQVlQT0lOVFM6Ci0JCQlyZXR1cm4gd2F5cG9pbnRzICE9IG51bGwgJiYgIXdheXBvaW50cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0dyYXBoRWRnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTZlMzZlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFbGVtZW50SW1wbCNnZXRQb3NpdGlvbiA8ZW0+UG9zaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVsZW1lbnRJbXBsI2dldENvbnRhaW5lZCA8ZW0+Q29udGFpbmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFbGVtZW50SW1wbCNnZXRMaW5rIDxlbT5MaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFbGVtZW50SW1wbCNnZXRBbmNob3JhZ2UgPGVtPkFuY2hvcmFnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWxlbWVudEltcGwjZ2V0U2VtYW50aWNNb2RlbCA8ZW0+U2VtYW50aWMgTW9kZWw8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcmFwaEVsZW1lbnRJbXBsIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJR3JhcGhFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc2l0aW9uKCkgPGVtPlBvc2l0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3NpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IHBvc2l0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRhaW5lZCgpIDxlbT5Db250YWluZWQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udGFpbmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY29udGFpbmVkID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmsoKSA8ZW0+TGluazwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbGluayA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbmNob3JhZ2UoKSA8ZW0+QW5jaG9yYWdlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFuY2hvcmFnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGFuY2hvcmFnZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZW1hbnRpY01vZGVsKCkgPGVtPlNlbWFudGljIE1vZGVsPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZW1hbnRpY01vZGVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VtYW50aWNNb2RlbEJyaWRnZSBzZW1hbnRpY01vZGVsID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHcmFwaEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRQb3NpdGlvbigpIHsKLQkJaWYgKHBvc2l0aW9uICE9IG51bGwgJiYgKChFT2JqZWN0KSBwb3NpdGlvbikuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFBvc2l0aW9uID0gKEludGVybmFsRU9iamVjdCkgcG9zaXRpb247Ci0JCQlwb3NpdGlvbiA9IChQb2ludCkgZVJlc29sdmVQcm94eShvbGRQb3NpdGlvbik7Ci0JCQlpZiAocG9zaXRpb24gIT0gb2xkUG9zaXRpb24pIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3UG9zaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwb3NpdGlvbjsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkUG9zaXRpb24uZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OLCBudWxsLAotCQkJCQkJbnVsbCk7Ci0JCQkJaWYgKG5ld1Bvc2l0aW9uLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1Bvc2l0aW9uLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQktIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fUE9TSVRJT04sIG51bGwsIG1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OLCBvbGRQb3NpdGlvbiwKLQkJCQkJCQlwb3NpdGlvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgYmFzaWNHZXRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIHBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBvc2l0aW9uKFBvaW50IG5ld1Bvc2l0aW9uLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQb2ludCBvbGRQb3NpdGlvbiA9IHBvc2l0aW9uOwotCQlwb3NpdGlvbiA9IG5ld1Bvc2l0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OLAotCQkJCQlvbGRQb3NpdGlvbiwgbmV3UG9zaXRpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zaXRpb24oUG9pbnQgbmV3UG9zaXRpb24pIHsKLQkJaWYgKG5ld1Bvc2l0aW9uICE9IHBvc2l0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwb3NpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgcG9zaXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19QT1NJVElPTiwgbnVsbCwKLQkJCQkJCW1zZ3MpOwotCQkJaWYgKG5ld1Bvc2l0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQb3NpdGlvbikuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OLCBudWxsLAotCQkJCQkJbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQb3NpdGlvbihuZXdQb3NpdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fUE9TSVRJT04sIG5ld1Bvc2l0aW9uLAotCQkJCQluZXdQb3NpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldENvbnRhaW5lZCgpIHsKLQkJaWYgKGNvbnRhaW5lZCA9PSBudWxsKSB7Ci0JCQljb250YWluZWQgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdC5SZXNvbHZpbmcoCi0JCQkJCURpYWdyYW1FbGVtZW50LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUik7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRMaW5rKCkgewotCQlpZiAobGluayA9PSBudWxsKSB7Ci0JCQlsaW5rID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QuUmVzb2x2aW5nKAotCQkJCQlEaWFncmFtTGluay5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19MSU5LLAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVCk7Ci0JCX0KLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0QW5jaG9yYWdlKCkgewotCQlpZiAoYW5jaG9yYWdlID09IG51bGwpIHsKLQkJCWFuY2hvcmFnZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0LlJlc29sdmluZygKLQkJCQkJR3JhcGhDb25uZWN0b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVCk7Ci0JCX0KLQkJcmV0dXJuIGFuY2hvcmFnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VtYW50aWNNb2RlbEJyaWRnZSBnZXRTZW1hbnRpY01vZGVsKCkgewotCQlpZiAoc2VtYW50aWNNb2RlbCAhPSBudWxsICYmICgoRU9iamVjdCkgc2VtYW50aWNNb2RlbCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFNlbWFudGljTW9kZWwgPSAoSW50ZXJuYWxFT2JqZWN0KSBzZW1hbnRpY01vZGVsOwotCQkJc2VtYW50aWNNb2RlbCA9IChTZW1hbnRpY01vZGVsQnJpZGdlKSBlUmVzb2x2ZVByb3h5KG9sZFNlbWFudGljTW9kZWwpOwotCQkJaWYgKHNlbWFudGljTW9kZWwgIT0gb2xkU2VtYW50aWNNb2RlbCkgewotCQkJCUludGVybmFsRU9iamVjdCBuZXdTZW1hbnRpY01vZGVsID0gKEludGVybmFsRU9iamVjdCkgc2VtYW50aWNNb2RlbDsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkU2VtYW50aWNNb2RlbC5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQsCi0JCQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCBudWxsKTsKLQkJCQlpZiAobmV3U2VtYW50aWNNb2RlbC5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdTZW1hbnRpY01vZGVsLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQsCi0JCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwsCi0JCQkJCQkJb2xkU2VtYW50aWNNb2RlbCwgc2VtYW50aWNNb2RlbCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzZW1hbnRpY01vZGVsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZW1hbnRpY01vZGVsQnJpZGdlIGJhc2ljR2V0U2VtYW50aWNNb2RlbCgpIHsKLQkJcmV0dXJuIHNlbWFudGljTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U2VtYW50aWNNb2RlbCgKLQkJCVNlbWFudGljTW9kZWxCcmlkZ2UgbmV3U2VtYW50aWNNb2RlbCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlTZW1hbnRpY01vZGVsQnJpZGdlIG9sZFNlbWFudGljTW9kZWwgPSBzZW1hbnRpY01vZGVsOwotCQlzZW1hbnRpY01vZGVsID0gbmV3U2VtYW50aWNNb2RlbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTCwKLQkJCQkJb2xkU2VtYW50aWNNb2RlbCwgbmV3U2VtYW50aWNNb2RlbCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZW1hbnRpY01vZGVsKFNlbWFudGljTW9kZWxCcmlkZ2UgbmV3U2VtYW50aWNNb2RlbCkgewotCQlpZiAobmV3U2VtYW50aWNNb2RlbCAhPSBzZW1hbnRpY01vZGVsKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChzZW1hbnRpY01vZGVsICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBzZW1hbnRpY01vZGVsKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQsCi0JCQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdTZW1hbnRpY01vZGVsICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdTZW1hbnRpY01vZGVsKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQsCi0JCQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFNlbWFudGljTW9kZWwobmV3U2VtYW50aWNNb2RlbCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwsIG5ld1NlbWFudGljTW9kZWwsCi0JCQkJCW5ld1NlbWFudGljTW9kZWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0Q29udGFpbmVkKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0xJTks6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRMaW5rKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEFuY2hvcmFnZSgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDoKLQkJCWlmIChzZW1hbnRpY01vZGVsICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBzZW1hbnRpY01vZGVsKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwsCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldFNlbWFudGljTW9kZWwoKFNlbWFudGljTW9kZWxCcmlkZ2UpIG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OOgotCQkJcmV0dXJuIGJhc2ljU2V0UG9zaXRpb24obnVsbCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQ6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRDb250YWluZWQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldExpbmsoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0QW5jaG9yYWdlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOgotCQkJcmV0dXJuIGJhc2ljU2V0U2VtYW50aWNNb2RlbChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fUE9TSVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UG9zaXRpb24oKTsKLQkJCXJldHVybiBiYXNpY0dldFBvc2l0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQ6Ci0JCQlyZXR1cm4gZ2V0Q29udGFpbmVkKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19MSU5LOgotCQkJcmV0dXJuIGdldExpbmsoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRToKLQkJCXJldHVybiBnZXRBbmNob3JhZ2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFNlbWFudGljTW9kZWwoKTsKLQkJCXJldHVybiBiYXNpY0dldFNlbWFudGljTW9kZWwoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fUE9TSVRJT046Ci0JCQlzZXRQb3NpdGlvbigoUG9pbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRDoKLQkJCWdldENvbnRhaW5lZCgpLmNsZWFyKCk7Ci0JCQlnZXRDb250YWluZWQoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0xJTks6Ci0JCQlnZXRMaW5rKCkuY2xlYXIoKTsKLQkJCWdldExpbmsoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRToKLQkJCWdldEFuY2hvcmFnZSgpLmNsZWFyKCk7Ci0JCQlnZXRBbmNob3JhZ2UoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOgotCQkJc2V0U2VtYW50aWNNb2RlbCgoU2VtYW50aWNNb2RlbEJyaWRnZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OOgotCQkJc2V0UG9zaXRpb24oKFBvaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRDoKLQkJCWdldENvbnRhaW5lZCgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19MSU5LOgotCQkJZ2V0TGluaygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0U6Ci0JCQlnZXRBbmNob3JhZ2UoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw6Ci0JCQlzZXRTZW1hbnRpY01vZGVsKChTZW1hbnRpY01vZGVsQnJpZGdlKSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OOgotCQkJcmV0dXJuIHBvc2l0aW9uICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQ6Ci0JCQlyZXR1cm4gY29udGFpbmVkICE9IG51bGwgJiYgIWNvbnRhaW5lZC5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19MSU5LOgotCQkJcmV0dXJuIGxpbmsgIT0gbnVsbCAmJiAhbGluay5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0U6Ci0JCQlyZXR1cm4gYW5jaG9yYWdlICE9IG51bGwgJiYgIWFuY2hvcmFnZS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDoKLQkJCXJldHVybiBzZW1hbnRpY01vZGVsICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0dyYXBoRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoTm9kZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOThhMGE4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaE5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyYXBoIE5vZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaE5vZGVJbXBsI2dldFNpemUgPGVtPlNpemU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaE5vZGVJbXBsIGV4dGVuZHMgR3JhcGhFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEdyYXBoTm9kZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaXplKCkgPGVtPlNpemU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNpemUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEaW1lbnNpb24gc2l6ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3JhcGhOb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGltZW5zaW9uIGdldFNpemUoKSB7Ci0JCWlmIChzaXplICE9IG51bGwgJiYgKChFT2JqZWN0KSBzaXplKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkU2l6ZSA9IChJbnRlcm5hbEVPYmplY3QpIHNpemU7Ci0JCQlzaXplID0gKERpbWVuc2lvbikgZVJlc29sdmVQcm94eShvbGRTaXplKTsKLQkJCWlmIChzaXplICE9IG9sZFNpemUpIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3U2l6ZSA9IChJbnRlcm5hbEVPYmplY3QpIHNpemU7Ci0JCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFNpemUuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLkdSQVBIX05PREVfX1NJWkUsCi0JCQkJCQludWxsLCBudWxsKTsKLQkJCQlpZiAobmV3U2l6ZS5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdTaXplLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQktIFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fU0laRSwgbnVsbCwgbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fU0laRSwgb2xkU2l6ZSwgc2l6ZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzaXplOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaW1lbnNpb24gYmFzaWNHZXRTaXplKCkgewotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTaXplKERpbWVuc2lvbiBuZXdTaXplLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEaW1lbnNpb24gb2xkU2l6ZSA9IHNpemU7Ci0JCXNpemUgPSBuZXdTaXplOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkdSQVBIX05PREVfX1NJWkUsIG9sZFNpemUsCi0JCQkJCW5ld1NpemUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2l6ZShEaW1lbnNpb24gbmV3U2l6ZSkgewotCQlpZiAobmV3U2l6ZSAhPSBzaXplKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChzaXplICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBzaXplKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fU0laRSwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1NpemUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1NpemUpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5HUkFQSF9OT0RFX19TSVpFLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTaXplKG5ld1NpemUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX05PREVfX1NJWkUsIG5ld1NpemUsIG5ld1NpemUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fU0laRToKLQkJCXJldHVybiBiYXNpY1NldFNpemUobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX05PREVfX1NJWkU6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0U2l6ZSgpOwotCQkJcmV0dXJuIGJhc2ljR2V0U2l6ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9OT0RFX19TSVpFOgotCQkJc2V0U2l6ZSgoRGltZW5zaW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fU0laRToKLQkJCXNldFNpemUoKERpbWVuc2lvbikgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9OT0RFX19TSVpFOgotCQkJcmV0dXJuIHNpemUgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vR3JhcGhOb2RlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhpY1ByaW1pdGl2ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoaWNQcmltaXRpdmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1YTEyZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhpY1ByaW1pdGl2ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaGljUHJpbWl0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyYXBoaWMgUHJpbWl0aXZlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR3JhcGhpY1ByaW1pdGl2ZUltcGwgZXh0ZW5kcyBMZWFmRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlHcmFwaGljUHJpbWl0aXZlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHcmFwaGljUHJpbWl0aXZlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhJQ19QUklNSVRJVkU7Ci0JfQotCi19IC8vR3JhcGhpY1ByaW1pdGl2ZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0d1aWRhbmNlRGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HdWlkYW5jZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOGQ2MTIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0d1aWRhbmNlRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGFuY2UgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbCNnZXRBdHRhY2htZW50cyA8ZW0+QXR0YWNobWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZURlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cwotCQlHdWlkYW5jZURlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRhY2htZW50cygpIDxlbT5BdHRhY2htZW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0YWNobWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVEFDSE1FTlRTX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRhY2htZW50cygpIDxlbT5BdHRhY2htZW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0YWNobWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXR0YWNobWVudHMgPSBBVFRBQ0hNRU5UU19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHdWlkYW5jZURlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1VJREFOQ0VfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRhY2htZW50cygpIHsKLQkJcmV0dXJuIGF0dGFjaG1lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dGFjaG1lbnRzKFN0cmluZyBuZXdBdHRhY2htZW50cykgewotCQlTdHJpbmcgb2xkQXR0YWNobWVudHMgPSBhdHRhY2htZW50czsKLQkJYXR0YWNobWVudHMgPSBuZXdBdHRhY2htZW50czsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVFMsCi0JCQkJCW9sZEF0dGFjaG1lbnRzLCBhdHRhY2htZW50cykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUzoKLQkJCXJldHVybiBnZXRBdHRhY2htZW50cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVFM6Ci0JCQlzZXRBdHRhY2htZW50cygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlRTOgotCQkJc2V0QXR0YWNobWVudHMoQVRUQUNITUVOVFNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlRTOgotCQkJcmV0dXJuIEFUVEFDSE1FTlRTX0VERUZBVUxUID09IG51bGwgPyBhdHRhY2htZW50cyAhPSBudWxsCi0JCQkJCTogIUFUVEFDSE1FTlRTX0VERUZBVUxULmVxdWFscyhhdHRhY2htZW50cyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYXR0YWNobWVudHM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYXR0YWNobWVudHMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9HdWlkYW5jZURlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3VpZGFuY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HdWlkYW5jZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTVhYmJmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HdWlkYW5jZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkYW5jZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEd1aWRhbmNlSW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUd1aWRhbmNlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHdWlkYW5jZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdVSURBTkNFOwotCX0KLQotfSAvL0d1aWRhbmNlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3VpZGVsaW5lSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3VpZGVsaW5lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZWUxOWE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0d1aWRlbGluZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGVsaW5lSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIEd1aWRlbGluZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3VpZGVsaW5lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1VJREVMSU5FOwotCX0KLQotfSAvL0d1aWRlbGluZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0ltYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvSW1hZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExZTExOWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvSW1hZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkltYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuSW1hZ2VJbXBsI2dldFVyaSA8ZW0+VXJpPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuSW1hZ2VJbXBsI2dldE1pbWVUeXBlIDxlbT5NaW1lIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbWFnZUltcGwgZXh0ZW5kcyBMZWFmRWxlbWVudEltcGwgaW1wbGVtZW50cyBJbWFnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXJpKCkgPGVtPlVyaTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXJpKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVSSSBVUklfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXJpKCkgPGVtPlVyaTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXJpKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVVJJIHVyaSA9IFVSSV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaW1lVHlwZSgpIDxlbT5NaW1lIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1pbWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX1RZUEVfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbWVUeXBlKCkgPGVtPk1pbWUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWltZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWltZVR5cGUgPSBNSU1FX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5JTUFHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVVJJIGdldFVyaSgpIHsKLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcmkoVVJJIG5ld1VyaSkgewotCQlVUkkgb2xkVXJpID0gdXJpOwotCQl1cmkgPSBuZXdVcmk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuSU1BR0VfX1VSSSwgb2xkVXJpLCB1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKCkgewotCQlyZXR1cm4gbWltZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWltZVR5cGUoU3RyaW5nIG5ld01pbWVUeXBlKSB7Ci0JCVN0cmluZyBvbGRNaW1lVHlwZSA9IG1pbWVUeXBlOwotCQltaW1lVHlwZSA9IG5ld01pbWVUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLklNQUdFX19NSU1FX1RZUEUsIG9sZE1pbWVUeXBlLCBtaW1lVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19VUkk6Ci0JCQlyZXR1cm4gZ2V0VXJpKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRV9fTUlNRV9UWVBFOgotCQkJcmV0dXJuIGdldE1pbWVUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19VUkk6Ci0JCQlzZXRVcmkoKFVSSSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuSU1BR0VfX01JTUVfVFlQRToKLQkJCXNldE1pbWVUeXBlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRV9fVVJJOgotCQkJc2V0VXJpKFVSSV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRV9fTUlNRV9UWVBFOgotCQkJc2V0TWltZVR5cGUoTUlNRV9UWVBFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19VUkk6Ci0JCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQKLQkJCQkJLmVxdWFscyh1cmkpOwotCQljYXNlIFVtYVBhY2thZ2UuSU1BR0VfX01JTUVfVFlQRToKLQkJCXJldHVybiBNSU1FX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IG1pbWVUeXBlICE9IG51bGwKLQkJCQkJOiAhTUlNRV9UWVBFX0VERUZBVUxULmVxdWFscyhtaW1lVHlwZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodXJpOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHVyaSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWltZVR5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWltZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9JbWFnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0l0ZXJhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0l0ZXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2QyMjM4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9JdGVyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkl0ZXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEl0ZXJhdGlvbkltcGwgZXh0ZW5kcyBBY3Rpdml0eUltcGwgaW1wbGVtZW50cyBJdGVyYXRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLklURVJBVElPTjsKLQl9Ci0KLX0gLy9JdGVyYXRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9MZWFmRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0xlYWZFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NzU3YTI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0xlYWZFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkxlYWZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxlYWYgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIExlYWZFbGVtZW50SW1wbCBleHRlbmRzIERpYWdyYW1FbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUxlYWZFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMZWFmRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkxFQUZfRUxFTUVOVDsKLQl9Ci0KLX0gLy9MZWFmRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZENvbmZpZ3VyYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RDb25maWd1cmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOGE4NTJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZENvbmZpZ3VyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uIDxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldFByb2Nlc3NWaWV3cyA8ZW0+UHJvY2VzcyBWaWV3czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldERlZmF1bHRWaWV3IDxlbT5EZWZhdWx0IFZpZXc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRCYXNlQ29uZmlndXJhdGlvbnMgPGVtPkJhc2UgQ29uZmlndXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkgPGVtPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRBZGRlZENhdGVnb3J5IDxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZENvbmZpZ3VyYXRpb25JbXBsIGV4dGVuZHMgTWV0aG9kVW5pdEltcGwgaW1wbGVtZW50cwotCQlNZXRob2RDb25maWd1cmF0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpIDxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXRob2RQbHVnaW5TZWxlY3Rpb24gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpIDxlbT5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvY2Vzc1ZpZXdzKCkgPGVtPlByb2Nlc3MgVmlld3M8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvY2Vzc1ZpZXdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcHJvY2Vzc1ZpZXdzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRWaWV3KCkgPGVtPkRlZmF1bHQgVmlldzwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdFZpZXcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50Q2F0ZWdvcnkgZGVmYXVsdFZpZXcgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZUNvbmZpZ3VyYXRpb25zKCkgPGVtPkJhc2UgQ29uZmlndXJhdGlvbnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZUNvbmZpZ3VyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYmFzZUNvbmZpZ3VyYXRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSgpIDxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHN1YnRyYWN0ZWRDYXRlZ29yeSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZGRlZENhdGVnb3J5KCkgPGVtPkFkZGVkIENhdGVnb3J5PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFkZGVkQ2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhZGRlZENhdGVnb3J5ID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0NPTkZJR1VSQVRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkgewotCQlpZiAobWV0aG9kUGx1Z2luU2VsZWN0aW9uID09IG51bGwpIHsKLQkJCW1ldGhvZFBsdWdpblNlbGVjdGlvbiA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoCi0JCQkJCU1ldGhvZFBsdWdpbi5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT04pOwotCQl9Ci0JCXJldHVybiBtZXRob2RQbHVnaW5TZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpIHsKLQkJaWYgKG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJbWV0aG9kUGFja2FnZVNlbGVjdGlvbiA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoCi0JCQkJCU1ldGhvZFBhY2thZ2UuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTik7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFBhY2thZ2VTZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvY2Vzc1ZpZXdzKCkgewotCQlpZiAocHJvY2Vzc1ZpZXdzID09IG51bGwpIHsKLQkJCXByb2Nlc3NWaWV3cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoQ29udGVudENhdGVnb3J5LmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTKTsKLQkJfQotCQlyZXR1cm4gcHJvY2Vzc1ZpZXdzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50Q2F0ZWdvcnkgZ2V0RGVmYXVsdFZpZXcoKSB7Ci0JCWlmIChkZWZhdWx0VmlldyAhPSBudWxsICYmICgoRU9iamVjdCkgZGVmYXVsdFZpZXcpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGREZWZhdWx0VmlldyA9IChJbnRlcm5hbEVPYmplY3QpIGRlZmF1bHRWaWV3OwotCQkJZGVmYXVsdFZpZXcgPSAoQ29udGVudENhdGVnb3J5KSBlUmVzb2x2ZVByb3h5KG9sZERlZmF1bHRWaWV3KTsKLQkJCWlmIChkZWZhdWx0VmlldyAhPSBvbGREZWZhdWx0VmlldykgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXLAotCQkJCQkJCW9sZERlZmF1bHRWaWV3LCBkZWZhdWx0VmlldykpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZhdWx0VmlldzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudENhdGVnb3J5IGJhc2ljR2V0RGVmYXVsdFZpZXcoKSB7Ci0JCXJldHVybiBkZWZhdWx0VmlldzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmlldyhDb250ZW50Q2F0ZWdvcnkgbmV3RGVmYXVsdFZpZXcpIHsKLQkJQ29udGVudENhdGVnb3J5IG9sZERlZmF1bHRWaWV3ID0gZGVmYXVsdFZpZXc7Ci0JCWRlZmF1bHRWaWV3ID0gbmV3RGVmYXVsdFZpZXc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVywKLQkJCQkJb2xkRGVmYXVsdFZpZXcsIGRlZmF1bHRWaWV3KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0QmFzZUNvbmZpZ3VyYXRpb25zKCkgewotCQlpZiAoYmFzZUNvbmZpZ3VyYXRpb25zID09IG51bGwpIHsKLQkJCWJhc2VDb25maWd1cmF0aW9ucyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoCi0JCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTlMpOwotCQl9Ci0JCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkgewotCQlpZiAoc3VidHJhY3RlZENhdGVnb3J5ID09IG51bGwpIHsKLQkJCXN1YnRyYWN0ZWRDYXRlZ29yeSA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoCi0JCQkJCUNvbnRlbnRDYXRlZ29yeS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWSk7Ci0JCX0KLQkJcmV0dXJuIHN1YnRyYWN0ZWRDYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZGRlZENhdGVnb3J5KCkgewotCQlpZiAoYWRkZWRDYXRlZ29yeSA9PSBudWxsKSB7Ci0JCQlhZGRlZENhdGVnb3J5ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChDb250ZW50Q2F0ZWdvcnkuY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZKTsKLQkJfQotCQlyZXR1cm4gYWRkZWRDYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT046Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJcmV0dXJuIGdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTOgotCQkJcmV0dXJuIGdldFByb2Nlc3NWaWV3cygpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVzoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXREZWZhdWx0VmlldygpOwotCQkJcmV0dXJuIGJhc2ljR2V0RGVmYXVsdFZpZXcoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT05TOgotCQkJcmV0dXJuIGdldEJhc2VDb25maWd1cmF0aW9ucygpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlk6Ci0JCQlyZXR1cm4gZ2V0U3VidHJhY3RlZENhdGVnb3J5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlk6Ci0JCQlyZXR1cm4gZ2V0QWRkZWRDYXRlZ29yeSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT046Ci0JCQlnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5jbGVhcigpOwotCQkJZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNsZWFyKCk7Ci0JCQlnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXUzoKLQkJCWdldFByb2Nlc3NWaWV3cygpLmNsZWFyKCk7Ci0JCQlnZXRQcm9jZXNzVmlld3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVc6Ci0JCQlzZXREZWZhdWx0VmlldygoQ29udGVudENhdGVnb3J5KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OUzoKLQkJCWdldEJhc2VDb25maWd1cmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlnZXRCYXNlQ29uZmlndXJhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZOgotCQkJZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkuY2xlYXIoKTsKLQkJCWdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZOgotCQkJZ2V0QWRkZWRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQlnZXRBZGRlZENhdGVnb3J5KCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OOgotCQkJZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT046Ci0JCQlnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTOgotCQkJZ2V0UHJvY2Vzc1ZpZXdzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVc6Ci0JCQlzZXREZWZhdWx0VmlldygoQ29udGVudENhdGVnb3J5KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT05TOgotCQkJZ2V0QmFzZUNvbmZpZ3VyYXRpb25zKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZOgotCQkJZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWToKLQkJCWdldEFkZGVkQ2F0ZWdvcnkoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OOgotCQkJcmV0dXJuIG1ldGhvZFBsdWdpblNlbGVjdGlvbiAhPSBudWxsCi0JCQkJCSYmICFtZXRob2RQbHVnaW5TZWxlY3Rpb24uaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTjoKLQkJCXJldHVybiBtZXRob2RQYWNrYWdlU2VsZWN0aW9uICE9IG51bGwKLQkJCQkJJiYgIW1ldGhvZFBhY2thZ2VTZWxlY3Rpb24uaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFV1M6Ci0JCQlyZXR1cm4gcHJvY2Vzc1ZpZXdzICE9IG51bGwgJiYgIXByb2Nlc3NWaWV3cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXOgotCQkJcmV0dXJuIGRlZmF1bHRWaWV3ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OUzoKLQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbnMgIT0gbnVsbCAmJiAhYmFzZUNvbmZpZ3VyYXRpb25zLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZOgotCQkJcmV0dXJuIHN1YnRyYWN0ZWRDYXRlZ29yeSAhPSBudWxsICYmICFzdWJ0cmFjdGVkQ2F0ZWdvcnkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZOgotCQkJcmV0dXJuIGFkZGVkQ2F0ZWdvcnkgIT0gbnVsbCAmJiAhYWRkZWRDYXRlZ29yeS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL01ldGhvZENvbmZpZ3VyYXRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2NhNTFlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldEd1aWQgPGVtPkd1aWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRCcmllZkRlc2NyaXB0aW9uIDxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldE93bmVkUnVsZXMgPGVtPk93bmVkIFJ1bGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5IDxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldFN1cHByZXNzZWQgPGVtPlN1cHByZXNzZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRPcmRlcmluZ0d1aWRlIDxlbT5PcmRlcmluZyBHdWlkZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1ldGhvZEVsZW1lbnRJbXBsIGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50SW1wbAotCQlpbXBsZW1lbnRzIE1ldGhvZEVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEd1aWQoKSA8ZW0+R3VpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3VpZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJRF9FREVGQVVMVCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHdWlkKCkgPGVtPkd1aWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEd1aWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ3VpZCA9IEdVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnJpZWZEZXNjcmlwdGlvbigpIDxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QnJpZWZEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJRUZfREVTQ1JJUFRJT05fRURFRkFVTFQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnJpZWZEZXNjcmlwdGlvbigpIDxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QnJpZWZEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBicmllZkRlc2NyaXB0aW9uID0gQlJJRUZfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPd25lZFJ1bGVzKCkgPGVtPk93bmVkIFJ1bGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE93bmVkUnVsZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBvd25lZFJ1bGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpIDxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXRob2RFbGVtZW50UHJvcGVydHkgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1cHByZXNzZWQoKSA8ZW0+U3VwcHJlc3NlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3VwcHJlc3NlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIFNVUFBSRVNTRURfRURFRkFVTFQgPSBCb29sZWFuLkZBTFNFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3VwcHJlc3NlZCgpIDxlbT5TdXBwcmVzc2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdXBwcmVzc2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBzdXBwcmVzc2VkID0gU1VQUFJFU1NFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcmRlcmluZ0d1aWRlKCkgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcmRlcmluZ0d1aWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPUkRFUklOR19HVUlERV9FREVGQVVMVCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcmRlcmluZ0d1aWRlKCkgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcmRlcmluZ0d1aWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG9yZGVyaW5nR3VpZGUgPSBPUkRFUklOR19HVUlERV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEd1aWQoKSB7Ci0JCWlmIChndWlkID09IG51bGwgfHwgZ3VpZC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlndWlkID0gVW1hVXRpbC5nZW5lcmF0ZUdVSUQoKTsKLQkJfQotCQlyZXR1cm4gZ3VpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEd1aWQoU3RyaW5nIG5ld0d1aWQpIHsKLQkJU3RyaW5nIG9sZEd1aWQgPSBndWlkOwotCQlndWlkID0gbmV3R3VpZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1VJRCwgb2xkR3VpZCwgZ3VpZCkpOwotCi0JCS8vIHN5bmNoIHVwIHRoZSByZXNvdXJjZSdzIElEVG9FT2JqZWN0TWFwIGFuZCBFT2JqZWN0VG9JRE1hcCB3aXRoIG5ld0d1aWQKLQkJLy8KLQkJaWYgKGVSZXNvdXJjZSgpIGluc3RhbmNlb2YgWE1MUmVzb3VyY2UpIHsKLQkJCVhNTFJlc291cmNlIHJlc291cmNlID0gKChYTUxSZXNvdXJjZSkgZVJlc291cmNlKCkpOwotCQkJcmVzb3VyY2Uuc2V0SUQodGhpcywgbmV3R3VpZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJyaWVmRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBicmllZkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJyaWVmRGVzY3JpcHRpb24oU3RyaW5nIG5ld0JyaWVmRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZEJyaWVmRGVzY3JpcHRpb24gPSBicmllZkRlc2NyaXB0aW9uOwotCQlicmllZkRlc2NyaXB0aW9uID0gbmV3QnJpZWZEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04sCi0JCQkJCW9sZEJyaWVmRGVzY3JpcHRpb24sIGJyaWVmRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRPd25lZFJ1bGVzKCkgewotCQlpZiAob3duZWRSdWxlcyA9PSBudWxsKSB7Ci0JCQlvd25lZFJ1bGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZygKLQkJCQkJQ29uc3RyYWludC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMpOwotCQl9Ci0JCXJldHVybiBvd25lZFJ1bGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpIHsKLQkJaWYgKG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA9PSBudWxsKSB7Ci0JCQltZXRob2RFbGVtZW50UHJvcGVydHkgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nKAotCQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kRWxlbWVudFByb3BlcnR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldFN1cHByZXNzZWQoKSB7Ci0JCXJldHVybiBzdXBwcmVzc2VkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cHByZXNzZWQoQm9vbGVhbiBuZXdTdXBwcmVzc2VkKSB7Ci0JCUJvb2xlYW4gb2xkU3VwcHJlc3NlZCA9IHN1cHByZXNzZWQ7Ci0JCXN1cHByZXNzZWQgPSBuZXdTdXBwcmVzc2VkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VELCBvbGRTdXBwcmVzc2VkLAotCQkJCQlzdXBwcmVzc2VkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPcmRlcmluZ0d1aWRlKCkgewotCQlyZXR1cm4gb3JkZXJpbmdHdWlkZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPcmRlcmluZ0d1aWRlKFN0cmluZyBuZXdPcmRlcmluZ0d1aWRlKSB7Ci0JCVN0cmluZyBvbGRPcmRlcmluZ0d1aWRlID0gb3JkZXJpbmdHdWlkZTsKLQkJb3JkZXJpbmdHdWlkZSA9IG5ld09yZGVyaW5nR3VpZGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFLAotCQkJCQlvbGRPcmRlcmluZ0d1aWRlLCBvcmRlcmluZ0d1aWRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldE93bmVkUnVsZXMoKSkKLQkJCQkJLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpKS5iYXNpY1JlbW92ZSgKLQkJCQkJb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1VJRDoKLQkJCXJldHVybiBnZXRHdWlkKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOgotCQkJcmV0dXJuIGdldE93bmVkUnVsZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWToKLQkJCXJldHVybiBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOgotCQkJcmV0dXJuIGdldFN1cHByZXNzZWQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERToKLQkJCXJldHVybiBnZXRPcmRlcmluZ0d1aWRlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HVUlEOgotCQkJc2V0R3VpZCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCQlzZXRCcmllZkRlc2NyaXB0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUzoKLQkJCWdldE93bmVkUnVsZXMoKS5jbGVhcigpOwotCQkJZ2V0T3duZWRSdWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkuY2xlYXIoKTsKLQkJCWdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ6Ci0JCQlzZXRTdXBwcmVzc2VkKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU6Ci0JCQlzZXRPcmRlcmluZ0d1aWRlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1VJRDoKLQkJCXNldEd1aWQoR1VJRF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCQlzZXRCcmllZkRlc2NyaXB0aW9uKEJSSUVGX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUzoKLQkJCWdldE93bmVkUnVsZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOgotCQkJc2V0U3VwcHJlc3NlZChTVVBQUkVTU0VEX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERToKLQkJCXNldE9yZGVyaW5nR3VpZGUoT1JERVJJTkdfR1VJREVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0dVSUQ6Ci0JCQlyZXR1cm4gR1VJRF9FREVGQVVMVCA9PSBudWxsID8gZ3VpZCAhPSBudWxsIDogIUdVSURfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhndWlkKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjoKLQkJCXJldHVybiBCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gYnJpZWZEZXNjcmlwdGlvbiAhPSBudWxsCi0JCQkJCTogIUJSSUVGX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhicmllZkRlc2NyaXB0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUzoKLQkJCXJldHVybiBvd25lZFJ1bGVzICE9IG51bGwgJiYgIW93bmVkUnVsZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSAhPSBudWxsCi0JCQkJCSYmICFtZXRob2RFbGVtZW50UHJvcGVydHkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ6Ci0JCQlyZXR1cm4gU1VQUFJFU1NFRF9FREVGQVVMVCA9PSBudWxsID8gc3VwcHJlc3NlZCAhPSBudWxsCi0JCQkJCTogIVNVUFBSRVNTRURfRURFRkFVTFQuZXF1YWxzKHN1cHByZXNzZWQpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOgotCQkJcmV0dXJuIE9SREVSSU5HX0dVSURFX0VERUZBVUxUID09IG51bGwgPyBvcmRlcmluZ0d1aWRlICE9IG51bGwKLQkJCQkJOiAhT1JERVJJTkdfR1VJREVfRURFRkFVTFQuZXF1YWxzKG9yZGVyaW5nR3VpZGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGd1aWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZ3VpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYnJpZWZEZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChicmllZkRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdXBwcmVzc2VkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHN1cHByZXNzZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG9yZGVyaW5nR3VpZGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQob3JkZXJpbmdHdWlkZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZEVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY0YWQzYjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFOgotCQkJc2V0VmFsdWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRToKLQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRToKLQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVAotCQkJCQkuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZExpYnJhcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RMaWJyYXJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzQ2MjZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZExpYnJhcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBMaWJyYXJ5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwjZ2V0TWV0aG9kUGx1Z2lucyA8ZW0+TWV0aG9kIFBsdWdpbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbCNnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMgPGVtPlByZWRlZmluZWQgQ29uZmlndXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5SW1wbCBleHRlbmRzIE1ldGhvZFVuaXRJbXBsIGltcGxlbWVudHMgTWV0aG9kTGlicmFyeSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQbHVnaW5zKCkgPGVtPk1ldGhvZCBQbHVnaW5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZFBsdWdpbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXRob2RQbHVnaW5zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpIDxlbT5QcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHByZWRlZmluZWRDb25maWd1cmF0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kTGlicmFyeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1ldGhvZFBsdWdpbnMoKSB7Ci0JCWlmIChtZXRob2RQbHVnaW5zID09IG51bGwpIHsKLQkJCW1ldGhvZFBsdWdpbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nKAotCQkJCQlNZXRob2RQbHVnaW4uY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUGx1Z2luczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSB7Ci0JCWlmIChwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMgPT0gbnVsbCkgewotCQkJcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZygKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIHByZWRlZmluZWRDb25maWd1cmF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0TWV0aG9kUGx1Z2lucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpKS5iYXNpY1JlbW92ZSgKLQkJCQkJb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlM6Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kUGx1Z2lucygpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlM6Ci0JCQlyZXR1cm4gZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUzoKLQkJCWdldE1ldGhvZFBsdWdpbnMoKS5jbGVhcigpOwotCQkJZ2V0TWV0aG9kUGx1Z2lucygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlM6Ci0JCQlnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5jbGVhcigpOwotCQkJZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TOgotCQkJZ2V0TWV0aG9kUGx1Z2lucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUzoKLQkJCWdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlM6Ci0JCQlyZXR1cm4gbWV0aG9kUGx1Z2lucyAhPSBudWxsICYmICFtZXRob2RQbHVnaW5zLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TOgotCQkJcmV0dXJuIHByZWRlZmluZWRDb25maWd1cmF0aW9ucyAhPSBudWxsCi0JCQkJCSYmICFwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9NZXRob2RMaWJyYXJ5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwODg0N2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwjZ2V0R2xvYmFsIDxlbT5HbG9iYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbCNnZXRSZXVzZWRQYWNrYWdlcyA8ZW0+UmV1c2VkIFBhY2thZ2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwjZ2V0Q2hpbGRQYWNrYWdlcyA8ZW0+Q2hpbGQgUGFja2FnZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXRob2RQYWNrYWdlSW1wbCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJTWV0aG9kUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R2xvYmFsKCkgPGVtPkdsb2JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R2xvYmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gR0xPQkFMX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdsb2JhbCgpIDxlbT5HbG9iYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdsb2JhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gZ2xvYmFsID0gR0xPQkFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmV1c2VkUGFja2FnZXMoKSA8ZW0+UmV1c2VkIFBhY2thZ2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJldXNlZFBhY2thZ2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmV1c2VkUGFja2FnZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hpbGRQYWNrYWdlcygpIDxlbT5DaGlsZCBQYWNrYWdlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGlsZFBhY2thZ2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY2hpbGRQYWNrYWdlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldEdsb2JhbCgpIHsKLQkJcmV0dXJuIGdsb2JhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHbG9iYWwoQm9vbGVhbiBuZXdHbG9iYWwpIHsKLQkJQm9vbGVhbiBvbGRHbG9iYWwgPSBnbG9iYWw7Ci0JCWdsb2JhbCA9IG5ld0dsb2JhbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMLCBvbGRHbG9iYWwsIGdsb2JhbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJldXNlZFBhY2thZ2VzKCkgewotCQlpZiAocmV1c2VkUGFja2FnZXMgPT0gbnVsbCkgewotCQkJcmV1c2VkUGFja2FnZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KE1ldGhvZFBhY2thZ2UuY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUyk7Ci0JCX0KLQkJcmV0dXJuIHJldXNlZFBhY2thZ2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldENoaWxkUGFja2FnZXMoKSB7Ci0JCWlmIChjaGlsZFBhY2thZ2VzID09IG51bGwpIHsKLQkJCWNoaWxkUGFja2FnZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nKAotCQkJCQlNZXRob2RQYWNrYWdlLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkUGFja2FnZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldENoaWxkUGFja2FnZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMOgotCQkJcmV0dXJuIGdldEdsb2JhbCgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUzoKLQkJCXJldHVybiBnZXRSZXVzZWRQYWNrYWdlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOgotCQkJcmV0dXJuIGdldENoaWxkUGFja2FnZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDoKLQkJCXNldEdsb2JhbCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUzoKLQkJCWdldFJldXNlZFBhY2thZ2VzKCkuY2xlYXIoKTsKLQkJCWdldFJldXNlZFBhY2thZ2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVM6Ci0JCQlnZXRDaGlsZFBhY2thZ2VzKCkuY2xlYXIoKTsKLQkJCWdldENoaWxkUGFja2FnZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMOgotCQkJc2V0R2xvYmFsKEdMT0JBTF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTOgotCQkJZ2V0UmV1c2VkUGFja2FnZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOgotCQkJZ2V0Q2hpbGRQYWNrYWdlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMOgotCQkJcmV0dXJuIEdMT0JBTF9FREVGQVVMVCA9PSBudWxsID8gZ2xvYmFsICE9IG51bGwgOiAhR0xPQkFMX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoZ2xvYmFsKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRVM6Ci0JCQlyZXR1cm4gcmV1c2VkUGFja2FnZXMgIT0gbnVsbCAmJiAhcmV1c2VkUGFja2FnZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOgotCQkJcmV0dXJuIGNoaWxkUGFja2FnZXMgIT0gbnVsbCAmJiAhY2hpbGRQYWNrYWdlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ2xvYmFsOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGdsb2JhbCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRQYXJlbnRQYWNrYWdlKCkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGFja2FnZSBnZXRQYXJlbnRQYWNrYWdlKCkgewotCQlFT2JqZWN0IHBhcmVudCA9IGVDb250YWluZXIoKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCXJldHVybiAoTWV0aG9kUGFja2FnZSkgcGFyZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL01ldGhvZFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RQbHVnaW5JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RQbHVnaW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiODZjNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kUGx1Z2luSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFBsdWdpbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwjZ2V0VXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwjZ2V0TWV0aG9kUGFja2FnZXMgPGVtPk1ldGhvZCBQYWNrYWdlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwjZ2V0QmFzZXMgPGVtPkJhc2VzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGx1Z2luSW1wbCBleHRlbmRzIE1ldGhvZFVuaXRJbXBsIGltcGxlbWVudHMgTWV0aG9kUGx1Z2luIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2VyQ2hhbmdlYWJsZSgpIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gVVNFUl9DSEFOR0VBQkxFX0VERUZBVUxUID0gQm9vbGVhbi5UUlVFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNlckNoYW5nZWFibGUoKSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVc2VyQ2hhbmdlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gdXNlckNoYW5nZWFibGUgPSBVU0VSX0NIQU5HRUFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQYWNrYWdlcygpIDxlbT5NZXRob2QgUGFja2FnZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kUGFja2FnZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXRob2RQYWNrYWdlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlcygpIDxlbT5CYXNlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGJhc2VzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RQbHVnaW5JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldFVzZXJDaGFuZ2VhYmxlKCkgewotCQlyZXR1cm4gdXNlckNoYW5nZWFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlckNoYW5nZWFibGUoQm9vbGVhbiBuZXdVc2VyQ2hhbmdlYWJsZSkgewotCQlCb29sZWFuIG9sZFVzZXJDaGFuZ2VhYmxlID0gdXNlckNoYW5nZWFibGU7Ci0JCXVzZXJDaGFuZ2VhYmxlID0gbmV3VXNlckNoYW5nZWFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFLAotCQkJCQlvbGRVc2VyQ2hhbmdlYWJsZSwgdXNlckNoYW5nZWFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RQYWNrYWdlcygpIHsKLQkJaWYgKG1ldGhvZFBhY2thZ2VzID09IG51bGwpIHsKLQkJCW1ldGhvZFBhY2thZ2VzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZygKLQkJCQkJTWV0aG9kUGFja2FnZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVMpOwotCQl9Ci0JCXJldHVybiBtZXRob2RQYWNrYWdlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRCYXNlcygpIHsKLQkJaWYgKGJhc2VzID09IG51bGwpIHsKLQkJCWJhc2VzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChNZXRob2RQbHVnaW4uY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fQkFTRVMpOwotCQl9Ci0JCXJldHVybiBiYXNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0TWV0aG9kUGFja2FnZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEU6Ci0JCQlyZXR1cm4gZ2V0VXNlckNoYW5nZWFibGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUzoKLQkJCXJldHVybiBnZXRNZXRob2RQYWNrYWdlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fQkFTRVM6Ci0JCQlyZXR1cm4gZ2V0QmFzZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFOgotCQkJc2V0VXNlckNoYW5nZWFibGUoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUzoKLQkJCWdldE1ldGhvZFBhY2thZ2VzKCkuY2xlYXIoKTsKLQkJCWdldE1ldGhvZFBhY2thZ2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19CQVNFUzoKLQkJCWdldEJhc2VzKCkuY2xlYXIoKTsKLQkJCWdldEJhc2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFOgotCQkJc2V0VXNlckNoYW5nZWFibGUoVVNFUl9DSEFOR0VBQkxFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUzoKLQkJCWdldE1ldGhvZFBhY2thZ2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX0JBU0VTOgotCQkJZ2V0QmFzZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFOgotCQkJcmV0dXJuIFVTRVJfQ0hBTkdFQUJMRV9FREVGQVVMVCA9PSBudWxsID8gdXNlckNoYW5nZWFibGUgIT0gbnVsbAotCQkJCQk6ICFVU0VSX0NIQU5HRUFCTEVfRURFRkFVTFQuZXF1YWxzKHVzZXJDaGFuZ2VhYmxlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUzoKLQkJCXJldHVybiBtZXRob2RQYWNrYWdlcyAhPSBudWxsICYmICFtZXRob2RQYWNrYWdlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19CQVNFUzoKLQkJCXJldHVybiBiYXNlcyAhPSBudWxsICYmICFiYXNlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodXNlckNoYW5nZWFibGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodXNlckNoYW5nZWFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NZXRob2RQbHVnaW5JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RVbml0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kVW5pdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjI1ZDA0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RVbml0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgVW5pdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsI2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RVbml0SW1wbCNnZXRDaGFuZ2VEYXRlIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsI2dldENoYW5nZURlc2NyaXB0aW9uIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RVbml0SW1wbCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kVW5pdEltcGwjZ2V0Q29weXJpZ2h0U3RhdGVtZW50IDxlbT5Db3B5cmlnaHQgU3RhdGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWV0aG9kVW5pdEltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCU1ldGhvZFVuaXQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhvcnMoKSA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SU19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9ycygpIDxlbT5BdXRob3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF1dGhvcnMgPSBBVVRIT1JTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURhdGUoKSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGF0ZSBDSEFOR0VfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEYXRlKCkgPGVtPkNoYW5nZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGF0ZSBjaGFuZ2VEYXRlID0gQ0hBTkdFX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNoYW5nZURlc2NyaXB0aW9uID0gQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCkgPGVtPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvcHlyaWdodFN0YXRlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN1cHBvcnRpbmdNYXRlcmlhbCBjb3B5cmlnaHRTdGF0ZW1lbnQgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZFVuaXRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF1dGhvcnMoKSB7Ci0JCXJldHVybiBhdXRob3JzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dGhvcnMoU3RyaW5nIG5ld0F1dGhvcnMpIHsKLQkJU3RyaW5nIG9sZEF1dGhvcnMgPSBhdXRob3JzOwotCQlhdXRob3JzID0gbmV3QXV0aG9yczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUywgb2xkQXV0aG9ycywgYXV0aG9ycykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEYXRlIGdldENoYW5nZURhdGUoKSB7Ci0JCXJldHVybiBjaGFuZ2VEYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoYW5nZURhdGUoRGF0ZSBuZXdDaGFuZ2VEYXRlKSB7Ci0JCURhdGUgb2xkQ2hhbmdlRGF0ZSA9IGNoYW5nZURhdGU7Ci0JCWNoYW5nZURhdGUgPSBuZXdDaGFuZ2VEYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURSwgb2xkQ2hhbmdlRGF0ZSwKLQkJCQkJY2hhbmdlRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBjaGFuZ2VEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcgbmV3Q2hhbmdlRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZENoYW5nZURlc2NyaXB0aW9uID0gY2hhbmdlRGVzY3JpcHRpb247Ci0JCWNoYW5nZURlc2NyaXB0aW9uID0gbmV3Q2hhbmdlRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTiwKLQkJCQkJb2xkQ2hhbmdlRGVzY3JpcHRpb24sIGNoYW5nZURlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsIGdldENvcHlyaWdodFN0YXRlbWVudCgpIHsKLQkJaWYgKGNvcHlyaWdodFN0YXRlbWVudCAhPSBudWxsCi0JCQkJJiYgKChFT2JqZWN0KSBjb3B5cmlnaHRTdGF0ZW1lbnQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRDb3B5cmlnaHRTdGF0ZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBjb3B5cmlnaHRTdGF0ZW1lbnQ7Ci0JCQljb3B5cmlnaHRTdGF0ZW1lbnQgPSAoU3VwcG9ydGluZ01hdGVyaWFsKSBlUmVzb2x2ZVByb3h5KG9sZENvcHlyaWdodFN0YXRlbWVudCk7Ci0JCQlpZiAoY29weXJpZ2h0U3RhdGVtZW50ICE9IG9sZENvcHlyaWdodFN0YXRlbWVudCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVCwKLQkJCQkJCQlvbGRDb3B5cmlnaHRTdGF0ZW1lbnQsIGNvcHlyaWdodFN0YXRlbWVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb3B5cmlnaHRTdGF0ZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN1cHBvcnRpbmdNYXRlcmlhbCBiYXNpY0dldENvcHlyaWdodFN0YXRlbWVudCgpIHsKLQkJcmV0dXJuIGNvcHlyaWdodFN0YXRlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3B5cmlnaHRTdGF0ZW1lbnQoU3VwcG9ydGluZ01hdGVyaWFsIG5ld0NvcHlyaWdodFN0YXRlbWVudCkgewotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgb2xkQ29weXJpZ2h0U3RhdGVtZW50ID0gY29weXJpZ2h0U3RhdGVtZW50OwotCQljb3B5cmlnaHRTdGF0ZW1lbnQgPSBuZXdDb3B5cmlnaHRTdGF0ZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQsCi0JCQkJCW9sZENvcHlyaWdodFN0YXRlbWVudCwgY29weXJpZ2h0U3RhdGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM6Ci0JCQlyZXR1cm4gZ2V0QXV0aG9ycygpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOgotCQkJcmV0dXJuIGdldENoYW5nZURhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldENvcHlyaWdodFN0YXRlbWVudCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0Q29weXJpZ2h0U3RhdGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19BVVRIT1JTOgotCQkJc2V0QXV0aG9ycygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU6Ci0JCQlzZXRDaGFuZ2VEYXRlKChEYXRlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJc2V0Q2hhbmdlRGVzY3JpcHRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX1ZFUlNJT046Ci0JCQlzZXRWZXJzaW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJc2V0Q29weXJpZ2h0U3RhdGVtZW50KChTdXBwb3J0aW5nTWF0ZXJpYWwpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzoKLQkJCXNldEF1dGhvcnMoQVVUSE9SU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU6Ci0JCQlzZXRDaGFuZ2VEYXRlKENIQU5HRV9EQVRFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQlzZXRDaGFuZ2VEZXNjcmlwdGlvbihDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX1ZFUlNJT046Ci0JCQlzZXRWZXJzaW9uKFZFUlNJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQ6Ci0JCQlzZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKFN1cHBvcnRpbmdNYXRlcmlhbCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzoKLQkJCXJldHVybiBBVVRIT1JTX0VERUZBVUxUID09IG51bGwgPyBhdXRob3JzICE9IG51bGwKLQkJCQkJOiAhQVVUSE9SU19FREVGQVVMVC5lcXVhbHMoYXV0aG9ycyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU6Ci0JCQlyZXR1cm4gQ0hBTkdFX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNoYW5nZURhdGUgIT0gbnVsbAotCQkJCQk6ICFDSEFOR0VfREFURV9FREVGQVVMVC5lcXVhbHMoY2hhbmdlRGF0ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gY2hhbmdlRGVzY3JpcHRpb24gIT0gbnVsbAotCQkJCQk6ICFDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGNoYW5nZURlc2NyaXB0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJcmV0dXJuIFZFUlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IHZlcnNpb24gIT0gbnVsbAotCQkJCQk6ICFWRVJTSU9OX0VERUZBVUxULmVxdWFscyh2ZXJzaW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJcmV0dXJuIGNvcHlyaWdodFN0YXRlbWVudCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF1dGhvcnM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYXV0aG9ycyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2hhbmdlRGF0ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjaGFuZ2VEYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjaGFuZ2VEZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjaGFuZ2VEZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmVyc2lvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kVW5pdEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01pbGVzdG9uZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01pbGVzdG9uZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTJlNzIwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NaWxlc3RvbmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1pbGVzdG9uZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1pbGVzdG9uZUltcGwgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlNaWxlc3RvbmUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1pbGVzdG9uZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1JTEVTVE9ORTsKLQl9Ci0KLX0gLy9NaWxlc3RvbmVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9OYW1lZEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9OYW1lZEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJmZDhkZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTmFtZWRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZWQgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5hbWVkRWxlbWVudEltcGwgZXh0ZW5kcyBFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCU5hbWVkRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTmFtZWRFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVF9fTkFNRToKLQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUU6Ci0JCQlzZXROYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FOgotCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUU6Ci0JCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9OYW1lZEVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9OYW1lc3BhY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9OYW1lc3BhY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwYjIzMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTmFtZXNwYWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lc3BhY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOYW1lc3BhY2VJbXBsIGV4dGVuZHMgTmFtZWRFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCU5hbWVzcGFjZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTmFtZXNwYWNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRVNQQUNFOwotCX0KLQotfSAvL05hbWVzcGFjZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL091dGNvbWVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9PdXRjb21lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NjlmOWFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL091dGNvbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRjb21lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3V0Y29tZUltcGwgZXh0ZW5kcyBXb3JrUHJvZHVjdEltcGwgaW1wbGVtZW50cyBPdXRjb21lIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPdXRjb21lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuT1VUQ09NRTsKLQl9Ci0KLX0gLy9PdXRjb21lSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxNmVjZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBhY2thZ2VJbXBsIGV4dGVuZHMgTmFtZXNwYWNlSW1wbCBpbXBsZW1lbnRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBBQ0tBR0U7Ci0JfQotCi19IC8vUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BhY2thZ2VhYmxlRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BhY2thZ2VhYmxlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzNhY2U4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QYWNrYWdlYWJsZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZWFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYWNrYWdlYWJsZUVsZW1lbnRJbXBsIGV4dGVuZHMgTmFtZWRFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVBhY2thZ2VhYmxlRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFja2FnZWFibGVFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUEFDS0FHRUFCTEVfRUxFTUVOVDsKLQl9Ci0KLX0gLy9QYWNrYWdlYWJsZUVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QaGFzZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BoYXNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NTQ4ZThiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BoYXNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBoYXNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGhhc2VJbXBsIGV4dGVuZHMgQWN0aXZpdHlJbXBsIGltcGxlbWVudHMgUGhhc2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBoYXNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUEhBU0U7Ci0JfQotCi19IC8vUGhhc2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QbGFubmluZ0RhdGFJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QbGFubmluZ0RhdGFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmMjc2YjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUGxhbm5pbmdEYXRhSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbCNnZXRTdGFydERhdGUgPGVtPlN0YXJ0IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsI2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbCNnZXRSYW5rIDxlbT5SYW5rPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGxhbm5pbmdEYXRhSW1wbCBleHRlbmRzIFByb2Nlc3NFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVBsYW5uaW5nRGF0YSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnREYXRlKCkgPGVtPlN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEYXRlIFNUQVJUX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnREYXRlKCkgPGVtPlN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERhdGUgc3RhcnREYXRlID0gU1RBUlRfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hEYXRlKCkgPGVtPkZpbmlzaCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERhdGUgRklOSVNIX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoRGF0ZSgpIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERhdGUgZmluaXNoRGF0ZSA9IEZJTklTSF9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhbmsoKSA8ZW0+UmFuazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFuaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUkFOS19FREVGQVVMVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYW5rKCkgPGVtPlJhbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgcmFuayA9IFJBTktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGxhbm5pbmdEYXRhSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUExBTk5JTkdfREFUQTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGF0ZSBnZXRTdGFydERhdGUoKSB7Ci0JCXJldHVybiBzdGFydERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnREYXRlKERhdGUgbmV3U3RhcnREYXRlKSB7Ci0JCURhdGUgb2xkU3RhcnREYXRlID0gc3RhcnREYXRlOwotCQlzdGFydERhdGUgPSBuZXdTdGFydERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURSwgb2xkU3RhcnREYXRlLAotCQkJCQlzdGFydERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGF0ZSBnZXRGaW5pc2hEYXRlKCkgewotCQlyZXR1cm4gZmluaXNoRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2hEYXRlKERhdGUgbmV3RmluaXNoRGF0ZSkgewotCQlEYXRlIG9sZEZpbmlzaERhdGUgPSBmaW5pc2hEYXRlOwotCQlmaW5pc2hEYXRlID0gbmV3RmluaXNoRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURSwgb2xkRmluaXNoRGF0ZSwKLQkJCQkJZmluaXNoRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmFuaygpIHsKLQkJcmV0dXJuIHJhbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmFuayhpbnQgbmV3UmFuaykgewotCQlpbnQgb2xkUmFuayA9IHJhbms7Ci0JCXJhbmsgPSBuZXdSYW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTkssIG9sZFJhbmssIHJhbmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19TVEFSVF9EQVRFOgotCQkJcmV0dXJuIGdldFN0YXJ0RGF0ZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEU6Ci0JCQlyZXR1cm4gZ2V0RmluaXNoRGF0ZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fUkFOSzoKLQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRSYW5rKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19TVEFSVF9EQVRFOgotCQkJc2V0U3RhcnREYXRlKChEYXRlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURToKLQkJCXNldEZpbmlzaERhdGUoKERhdGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTks6Ci0JCQlzZXRSYW5rKCgoSW50ZWdlcikgbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEU6Ci0JCQlzZXRTdGFydERhdGUoU1RBUlRfREFURV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURToKLQkJCXNldEZpbmlzaERhdGUoRklOSVNIX0RBVEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fUkFOSzoKLQkJCXNldFJhbmsoUkFOS19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19TVEFSVF9EQVRFOgotCQkJcmV0dXJuIFNUQVJUX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0RGF0ZSAhPSBudWxsCi0JCQkJCTogIVNUQVJUX0RBVEVfRURFRkFVTFQuZXF1YWxzKHN0YXJ0RGF0ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURToKLQkJCXJldHVybiBGSU5JU0hfREFURV9FREVGQVVMVCA9PSBudWxsID8gZmluaXNoRGF0ZSAhPSBudWxsCi0JCQkJCTogIUZJTklTSF9EQVRFX0VERUZBVUxULmVxdWFscyhmaW5pc2hEYXRlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTks6Ci0JCQlyZXR1cm4gcmFuayAhPSBSQU5LX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHN0YXJ0RGF0ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzdGFydERhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaERhdGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZmluaXNoRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmFuazogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyYW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUGxhbm5pbmdEYXRhSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUG9pbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qb2ludEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjYyMzM3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qb2ludEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvaW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUG9pbnRJbXBsI2dldFggPGVtPlg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2ludEltcGwjZ2V0WSA8ZW0+WTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvaW50SW1wbCBleHRlbmRzIE11bHRpUmVzb3VyY2VFT2JqZWN0IGltcGxlbWVudHMgUG9pbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFgoKSA8ZW0+WDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgWF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYKCkgPGVtPlg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEb3VibGUgeCA9IFhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WSgpIDxlbT5ZPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRZKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvdWJsZSBZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFkoKSA8ZW0+WTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSB5ID0gWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBPSU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0WCgpIHsKLQkJcmV0dXJuIHg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0WChEb3VibGUgbmV3WCkgewotCQlEb3VibGUgb2xkWCA9IHg7Ci0JCXggPSBuZXdYOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBPSU5UX19YLCBvbGRYLCB4KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRZKCkgewotCQlyZXR1cm4geTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRZKERvdWJsZSBuZXdZKSB7Ci0JCURvdWJsZSBvbGRZID0geTsKLQkJeSA9IG5ld1k7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUE9JTlRfX1ksIG9sZFksIHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVF9fWDoKLQkJCXJldHVybiBnZXRYKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVF9fWToKLQkJCXJldHVybiBnZXRZKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UX19YOgotCQkJc2V0WCgoRG91YmxlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVF9fWToKLQkJCXNldFkoKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UX19YOgotCQkJc2V0WChYX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UX19ZOgotCQkJc2V0WShZX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UX19YOgotCQkJcmV0dXJuIFhfRURFRkFVTFQgPT0gbnVsbCA/IHggIT0gbnVsbCA6ICFYX0VERUZBVUxULmVxdWFscyh4KTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UX19ZOgotCQkJcmV0dXJuIFlfRURFRkFVTFQgPT0gbnVsbCA/IHkgIT0gbnVsbCA6ICFZX0VERUZBVUxULmVxdWFscyh5KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh4OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHgpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHk6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoeSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1BvaW50SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUG9seWxpbmVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qb2x5bGluZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmY3OGZjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qb2x5bGluZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9seWxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2x5bGluZUltcGwjZ2V0Q2xvc2VkIDxlbT5DbG9zZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2x5bGluZUltcGwjZ2V0V2F5cG9pbnRzIDxlbT5XYXlwb2ludHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb2x5bGluZUltcGwgZXh0ZW5kcyBHcmFwaGljUHJpbWl0aXZlSW1wbCBpbXBsZW1lbnRzIFBvbHlsaW5lIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbG9zZWQoKSA8ZW0+Q2xvc2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbG9zZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBDTE9TRURfRURFRkFVTFQgPSBCb29sZWFuLlRSVUU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbG9zZWQoKSA8ZW0+Q2xvc2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbG9zZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGNsb3NlZCA9IENMT1NFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdheXBvaW50cygpIDxlbT5XYXlwb2ludHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2F5cG9pbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgd2F5cG9pbnRzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb2x5bGluZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBPTFlMSU5FOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldENsb3NlZCgpIHsKLQkJcmV0dXJuIGNsb3NlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbG9zZWQoQm9vbGVhbiBuZXdDbG9zZWQpIHsKLQkJQm9vbGVhbiBvbGRDbG9zZWQgPSBjbG9zZWQ7Ci0JCWNsb3NlZCA9IG5ld0Nsb3NlZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QT0xZTElORV9fQ0xPU0VELCBvbGRDbG9zZWQsIGNsb3NlZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFdheXBvaW50cygpIHsKLQkJaWYgKHdheXBvaW50cyA9PSBudWxsKSB7Ci0JCQl3YXlwb2ludHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nKFBvaW50LmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLlBPTFlMSU5FX19XQVlQT0lOVFMpOwotCQl9Ci0JCXJldHVybiB3YXlwb2ludHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPTFlMSU5FX19XQVlQT0lOVFM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRXYXlwb2ludHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORV9fQ0xPU0VEOgotCQkJcmV0dXJuIGdldENsb3NlZCgpOwotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkVfX1dBWVBPSU5UUzoKLQkJCXJldHVybiBnZXRXYXlwb2ludHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkVfX0NMT1NFRDoKLQkJCXNldENsb3NlZCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkVfX1dBWVBPSU5UUzoKLQkJCWdldFdheXBvaW50cygpLmNsZWFyKCk7Ci0JCQlnZXRXYXlwb2ludHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORV9fQ0xPU0VEOgotCQkJc2V0Q2xvc2VkKENMT1NFRF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORV9fV0FZUE9JTlRTOgotCQkJZ2V0V2F5cG9pbnRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPTFlMSU5FX19DTE9TRUQ6Ci0JCQlyZXR1cm4gQ0xPU0VEX0VERUZBVUxUID09IG51bGwgPyBjbG9zZWQgIT0gbnVsbCA6ICFDTE9TRURfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhjbG9zZWQpOwotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkVfX1dBWVBPSU5UUzoKLQkJCXJldHVybiB3YXlwb2ludHMgIT0gbnVsbCAmJiAhd2F5cG9pbnRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjbG9zZWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoY2xvc2VkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUG9seWxpbmVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QcmFjdGljZURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGNiZTE3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QcmFjdGljZURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByYWN0aWNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0QWRkaXRpb25hbEluZm8gPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldFByb2JsZW0gPGVtPlByb2JsZW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCNnZXRCYWNrZ3JvdW5kIDxlbT5CYWNrZ3JvdW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0R29hbHMgPGVtPkdvYWxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0QXBwbGljYXRpb24gPGVtPkFwcGxpY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0TGV2ZWxzT2ZBZG9wdGlvbiA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMKLQkJUHJhY3RpY2VEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkaXRpb25hbEluZm8oKSA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURESVRJT05BTF9JTkZPX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZGRpdGlvbmFsSW5mbygpIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFkZGl0aW9uYWxJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFkZGl0aW9uYWxJbmZvID0gQURESVRJT05BTF9JTkZPX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2JsZW0oKSA8ZW0+UHJvYmxlbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvYmxlbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQkxFTV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvYmxlbSgpIDxlbT5Qcm9ibGVtPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9ibGVtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2JsZW0gPSBQUk9CTEVNX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhY2tncm91bmQoKSA8ZW0+QmFja2dyb3VuZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFja2dyb3VuZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS0dST1VORF9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFja2dyb3VuZCgpIDxlbT5CYWNrZ3JvdW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYWNrZ3JvdW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJhY2tncm91bmQgPSBCQUNLR1JPVU5EX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdvYWxzKCkgPGVtPkdvYWxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHb2FscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR09BTFNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdvYWxzKCkgPGVtPkdvYWxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHb2FscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnb2FscyA9IEdPQUxTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFwcGxpY2F0aW9uKCkgPGVtPkFwcGxpY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFwcGxpY2F0aW9uKCkgPGVtPkFwcGxpY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhcHBsaWNhdGlvbiA9IEFQUExJQ0FUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsc09mQWRvcHRpb24oKSA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsc09mQWRvcHRpb24oKSA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxldmVsc09mQWRvcHRpb24gPSBMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbEluZm8oKSB7Ci0JCXJldHVybiBhZGRpdGlvbmFsSW5mbzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsSW5mbyhTdHJpbmcgbmV3QWRkaXRpb25hbEluZm8pIHsKLQkJU3RyaW5nIG9sZEFkZGl0aW9uYWxJbmZvID0gYWRkaXRpb25hbEluZm87Ci0JCWFkZGl0aW9uYWxJbmZvID0gbmV3QWRkaXRpb25hbEluZm87Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTywKLQkJCQkJb2xkQWRkaXRpb25hbEluZm8sIGFkZGl0aW9uYWxJbmZvKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9ibGVtKCkgewotCQlyZXR1cm4gcHJvYmxlbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ibGVtKFN0cmluZyBuZXdQcm9ibGVtKSB7Ci0JCVN0cmluZyBvbGRQcm9ibGVtID0gcHJvYmxlbTsKLQkJcHJvYmxlbSA9IG5ld1Byb2JsZW07Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU0sIG9sZFByb2JsZW0sCi0JCQkJCXByb2JsZW0pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tncm91bmQoKSB7Ci0JCXJldHVybiBiYWNrZ3JvdW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmQoU3RyaW5nIG5ld0JhY2tncm91bmQpIHsKLQkJU3RyaW5nIG9sZEJhY2tncm91bmQgPSBiYWNrZ3JvdW5kOwotCQliYWNrZ3JvdW5kID0gbmV3QmFja2dyb3VuZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORCwgb2xkQmFja2dyb3VuZCwKLQkJCQkJYmFja2dyb3VuZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R29hbHMoKSB7Ci0JCXJldHVybiBnb2FsczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHb2FscyhTdHJpbmcgbmV3R29hbHMpIHsKLQkJU3RyaW5nIG9sZEdvYWxzID0gZ29hbHM7Ci0JCWdvYWxzID0gbmV3R29hbHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTLCBvbGRHb2FscywgZ29hbHMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFwcGxpY2F0aW9uKCkgewotCQlyZXR1cm4gYXBwbGljYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXBwbGljYXRpb24oU3RyaW5nIG5ld0FwcGxpY2F0aW9uKSB7Ci0JCVN0cmluZyBvbGRBcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOwotCQlhcHBsaWNhdGlvbiA9IG5ld0FwcGxpY2F0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTiwKLQkJCQkJb2xkQXBwbGljYXRpb24sIGFwcGxpY2F0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMZXZlbHNPZkFkb3B0aW9uKCkgewotCQlyZXR1cm4gbGV2ZWxzT2ZBZG9wdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbHNPZkFkb3B0aW9uKFN0cmluZyBuZXdMZXZlbHNPZkFkb3B0aW9uKSB7Ci0JCVN0cmluZyBvbGRMZXZlbHNPZkFkb3B0aW9uID0gbGV2ZWxzT2ZBZG9wdGlvbjsKLQkJbGV2ZWxzT2ZBZG9wdGlvbiA9IG5ld0xldmVsc09mQWRvcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTiwKLQkJCQkJb2xkTGV2ZWxzT2ZBZG9wdGlvbiwgbGV2ZWxzT2ZBZG9wdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk86Ci0JCQlyZXR1cm4gZ2V0QWRkaXRpb25hbEluZm8oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNOgotCQkJcmV0dXJuIGdldFByb2JsZW0oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EOgotCQkJcmV0dXJuIGdldEJhY2tncm91bmQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUzoKLQkJCXJldHVybiBnZXRHb2FscygpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJcmV0dXJuIGdldEFwcGxpY2F0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OOgotCQkJcmV0dXJuIGdldExldmVsc09mQWRvcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTzoKLQkJCXNldEFkZGl0aW9uYWxJbmZvKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNOgotCQkJc2V0UHJvYmxlbSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORDoKLQkJCXNldEJhY2tncm91bmQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTOgotCQkJc2V0R29hbHMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJc2V0QXBwbGljYXRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTjoKLQkJCXNldExldmVsc09mQWRvcHRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk86Ci0JCQlzZXRBZGRpdGlvbmFsSW5mbyhBRERJVElPTkFMX0lORk9fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU06Ci0JCQlzZXRQcm9ibGVtKFBST0JMRU1fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQ6Ci0JCQlzZXRCYWNrZ3JvdW5kKEJBQ0tHUk9VTkRfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTOgotCQkJc2V0R29hbHMoR09BTFNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJc2V0QXBwbGljYXRpb24oQVBQTElDQVRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTjoKLQkJCXNldExldmVsc09mQWRvcHRpb24oTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk86Ci0JCQlyZXR1cm4gQURESVRJT05BTF9JTkZPX0VERUZBVUxUID09IG51bGwgPyBhZGRpdGlvbmFsSW5mbyAhPSBudWxsCi0JCQkJCTogIUFERElUSU9OQUxfSU5GT19FREVGQVVMVC5lcXVhbHMoYWRkaXRpb25hbEluZm8pOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU06Ci0JCQlyZXR1cm4gUFJPQkxFTV9FREVGQVVMVCA9PSBudWxsID8gcHJvYmxlbSAhPSBudWxsCi0JCQkJCTogIVBST0JMRU1fRURFRkFVTFQuZXF1YWxzKHByb2JsZW0pOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQ6Ci0JCQlyZXR1cm4gQkFDS0dST1VORF9FREVGQVVMVCA9PSBudWxsID8gYmFja2dyb3VuZCAhPSBudWxsCi0JCQkJCTogIUJBQ0tHUk9VTkRfRURFRkFVTFQuZXF1YWxzKGJhY2tncm91bmQpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTOgotCQkJcmV0dXJuIEdPQUxTX0VERUZBVUxUID09IG51bGwgPyBnb2FscyAhPSBudWxsIDogIUdPQUxTX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoZ29hbHMpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJcmV0dXJuIEFQUExJQ0FUSU9OX0VERUZBVUxUID09IG51bGwgPyBhcHBsaWNhdGlvbiAhPSBudWxsCi0JCQkJCTogIUFQUExJQ0FUSU9OX0VERUZBVUxULmVxdWFscyhhcHBsaWNhdGlvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OOgotCQkJcmV0dXJuIExFVkVMU19PRl9BRE9QVElPTl9FREVGQVVMVCA9PSBudWxsID8gbGV2ZWxzT2ZBZG9wdGlvbiAhPSBudWxsCi0JCQkJCTogIUxFVkVMU19PRl9BRE9QVElPTl9FREVGQVVMVC5lcXVhbHMobGV2ZWxzT2ZBZG9wdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWRkaXRpb25hbEluZm86ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYWRkaXRpb25hbEluZm8pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByb2JsZW06ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocHJvYmxlbSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYmFja2dyb3VuZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChiYWNrZ3JvdW5kKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBnb2FsczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChnb2Fscyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXBwbGljYXRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYXBwbGljYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxldmVsc09mQWRvcHRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobGV2ZWxzT2ZBZG9wdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1ByYWN0aWNlRGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QcmFjdGljZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1ByYWN0aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMTk2NWEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1ByYWN0aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByYWN0aWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VJbXBsI2dldFN1YlByYWN0aWNlcyA8ZW0+U3ViIFByYWN0aWNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlSW1wbCNnZXRDb250ZW50UmVmZXJlbmNlcyA8ZW0+Q29udGVudCBSZWZlcmVuY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VJbXBsI2dldEFjdGl2aXR5UmVmZXJlbmNlcyA8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByYWN0aWNlSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFByYWN0aWNlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YlByYWN0aWNlcygpIDxlbT5TdWIgUHJhY3RpY2VzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YlByYWN0aWNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHN1YlByYWN0aWNlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250ZW50UmVmZXJlbmNlcygpIDxlbT5Db250ZW50IFJlZmVyZW5jZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udGVudFJlZmVyZW5jZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjb250ZW50UmVmZXJlbmNlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3Rpdml0eVJlZmVyZW5jZXMoKSA8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eVJlZmVyZW5jZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhY3Rpdml0eVJlZmVyZW5jZXMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByYWN0aWNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U3ViUHJhY3RpY2VzKCkgewotCQlpZiAoc3ViUHJhY3RpY2VzID09IG51bGwpIHsKLQkJCXN1YlByYWN0aWNlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmcoCi0JCQkJCVByYWN0aWNlLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0VTKTsKLQkJfQotCQlyZXR1cm4gc3ViUHJhY3RpY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldENvbnRlbnRSZWZlcmVuY2VzKCkgewotCQlpZiAoY29udGVudFJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJY29udGVudFJlZmVyZW5jZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KENvbnRlbnRFbGVtZW50LmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLlBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRVMpOwotCQl9Ci0JCXJldHVybiBjb250ZW50UmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBY3Rpdml0eVJlZmVyZW5jZXMoKSB7Ci0JCWlmIChhY3Rpdml0eVJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJYWN0aXZpdHlSZWZlcmVuY2VzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChBY3Rpdml0eS5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5QUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFUyk7Ci0JCX0KLQkJcmV0dXJuIGFjdGl2aXR5UmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRTdWJQcmFjdGljZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFUzoKLQkJCXJldHVybiBnZXRTdWJQcmFjdGljZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRVM6Ci0JCQlyZXR1cm4gZ2V0Q29udGVudFJlZmVyZW5jZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0VTOgotCQkJcmV0dXJuIGdldEFjdGl2aXR5UmVmZXJlbmNlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFUzoKLQkJCWdldFN1YlByYWN0aWNlcygpLmNsZWFyKCk7Ci0JCQlnZXRTdWJQcmFjdGljZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRVM6Ci0JCQlnZXRDb250ZW50UmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQlnZXRDb250ZW50UmVmZXJlbmNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVM6Ci0JCQlnZXRBY3Rpdml0eVJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJZ2V0QWN0aXZpdHlSZWZlcmVuY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM6Ci0JCQlnZXRTdWJQcmFjdGljZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFUzoKLQkJCWdldENvbnRlbnRSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0VTOgotCQkJZ2V0QWN0aXZpdHlSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0VTOgotCQkJcmV0dXJuIHN1YlByYWN0aWNlcyAhPSBudWxsICYmICFzdWJQcmFjdGljZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFUzoKLQkJCXJldHVybiBjb250ZW50UmVmZXJlbmNlcyAhPSBudWxsICYmICFjb250ZW50UmVmZXJlbmNlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFUzoKLQkJCXJldHVybiBhY3Rpdml0eVJlZmVyZW5jZXMgIT0gbnVsbCAmJiAhYWN0aXZpdHlSZWZlcmVuY2VzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vUHJhY3RpY2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZGU0NzE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsI2dldFByb2Nlc3NDb21wb25lbnQgPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsIGV4dGVuZHMgRGVzY3JpcHRvckltcGwgaW1wbGVtZW50cwotCQlQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9jZXNzQ29tcG9uZW50KCkgPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0NvbXBvbmVudCBwcm9jZXNzQ29tcG9uZW50ID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnQgZ2V0UHJvY2Vzc0NvbXBvbmVudCgpIHsKLQkJaWYgKHByb2Nlc3NDb21wb25lbnQgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHByb2Nlc3NDb21wb25lbnQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQcm9jZXNzQ29tcG9uZW50ID0gKEludGVybmFsRU9iamVjdCkgcHJvY2Vzc0NvbXBvbmVudDsKLQkJCXByb2Nlc3NDb21wb25lbnQgPSAoUHJvY2Vzc0NvbXBvbmVudCkgZVJlc29sdmVQcm94eShvbGRQcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChwcm9jZXNzQ29tcG9uZW50ICE9IG9sZFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUk9DRVNTX0NPTVBPTkVOVCwKLQkJCQkJCQlvbGRQcm9jZXNzQ29tcG9uZW50LCBwcm9jZXNzQ29tcG9uZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnQgYmFzaWNHZXRQcm9jZXNzQ29tcG9uZW50KCkgewotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzQ29tcG9uZW50KFByb2Nlc3NDb21wb25lbnQgbmV3UHJvY2Vzc0NvbXBvbmVudCkgewotCQlQcm9jZXNzQ29tcG9uZW50IG9sZFByb2Nlc3NDb21wb25lbnQgPSBwcm9jZXNzQ29tcG9uZW50OwotCQlwcm9jZXNzQ29tcG9uZW50ID0gbmV3UHJvY2Vzc0NvbXBvbmVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUk9DRVNTX0NPTVBPTkVOVCwKLQkJCQkJb2xkUHJvY2Vzc0NvbXBvbmVudCwgcHJvY2Vzc0NvbXBvbmVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BST0NFU1NfQ09NUE9ORU5UOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFByb2Nlc3NDb21wb25lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldFByb2Nlc3NDb21wb25lbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJPQ0VTU19DT01QT05FTlQ6Ci0JCQlzZXRQcm9jZXNzQ29tcG9uZW50KChQcm9jZXNzQ29tcG9uZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJPQ0VTU19DT01QT05FTlQ6Ci0JCQlzZXRQcm9jZXNzQ29tcG9uZW50KChQcm9jZXNzQ29tcG9uZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BST0NFU1NfQ09NUE9ORU5UOgotCQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDI5YmZmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBDb21wb25lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRBdXRob3JzIDxlbT5BdXRob3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsI2dldENvcHlyaWdodFN0YXRlbWVudCA8ZW0+Q29weXJpZ2h0IFN0YXRlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsI2dldEludGVyZmFjZXMgPGVtPkludGVyZmFjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRQcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEltcGwgZXh0ZW5kcyBQcm9jZXNzUGFja2FnZUltcGwgaW1wbGVtZW50cwotCQlQcm9jZXNzQ29tcG9uZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JzKCkgPGVtPkF1dGhvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF1dGhvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUlNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhvcnMoKSA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdXRob3JzID0gQVVUSE9SU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEYXRlKCkgPGVtPkNoYW5nZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERhdGUgQ0hBTkdFX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGF0ZSgpIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERhdGUgY2hhbmdlRGF0ZSA9IENIQU5HRV9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURlc2NyaXB0aW9uKCkgPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjaGFuZ2VEZXNjcmlwdGlvbiA9IENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvcHlyaWdodFN0YXRlbWVudCgpIDxlbT5Db3B5cmlnaHQgU3RhdGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdXBwb3J0aW5nTWF0ZXJpYWwgY29weXJpZ2h0U3RhdGVtZW50ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEludGVyZmFjZXMoKSA8ZW0+SW50ZXJmYWNlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbnRlcmZhY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW50ZXJmYWNlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9jZXNzKCkgPGVtPlByb2Nlc3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvY2VzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0NvbXBvbmVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9ycygpIHsKLQkJcmV0dXJuIGF1dGhvcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0aG9ycyhTdHJpbmcgbmV3QXV0aG9ycykgewotCQlTdHJpbmcgb2xkQXV0aG9ycyA9IGF1dGhvcnM7Ci0JCWF1dGhvcnMgPSBuZXdBdXRob3JzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTLCBvbGRBdXRob3JzLCBhdXRob3JzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERhdGUgZ2V0Q2hhbmdlRGF0ZSgpIHsKLQkJcmV0dXJuIGNoYW5nZURhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlRGF0ZShEYXRlIG5ld0NoYW5nZURhdGUpIHsKLQkJRGF0ZSBvbGRDaGFuZ2VEYXRlID0gY2hhbmdlRGF0ZTsKLQkJY2hhbmdlRGF0ZSA9IG5ld0NoYW5nZURhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFLCBvbGRDaGFuZ2VEYXRlLAotCQkJCQljaGFuZ2VEYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGNoYW5nZURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoYW5nZURlc2NyaXB0aW9uKFN0cmluZyBuZXdDaGFuZ2VEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkQ2hhbmdlRGVzY3JpcHRpb24gPSBjaGFuZ2VEZXNjcmlwdGlvbjsKLQkJY2hhbmdlRGVzY3JpcHRpb24gPSBuZXdDaGFuZ2VEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OLAotCQkJCQlvbGRDaGFuZ2VEZXNjcmlwdGlvbiwgY2hhbmdlRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIG5ld1ZlcnNpb24pIHsKLQkJU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOwotCQl2ZXJzaW9uID0gbmV3VmVyc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCkgewotCQlpZiAoY29weXJpZ2h0U3RhdGVtZW50ICE9IG51bGwKLQkJCQkmJiAoKEVPYmplY3QpIGNvcHlyaWdodFN0YXRlbWVudCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZENvcHlyaWdodFN0YXRlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpIGNvcHlyaWdodFN0YXRlbWVudDsKLQkJCWNvcHlyaWdodFN0YXRlbWVudCA9IChTdXBwb3J0aW5nTWF0ZXJpYWwpIGVSZXNvbHZlUHJveHkob2xkQ29weXJpZ2h0U3RhdGVtZW50KTsKLQkJCWlmIChjb3B5cmlnaHRTdGF0ZW1lbnQgIT0gb2xkQ29weXJpZ2h0U3RhdGVtZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFRfU1RBVEVNRU5ULAotCQkJCQkJCW9sZENvcHlyaWdodFN0YXRlbWVudCwgY29weXJpZ2h0U3RhdGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvcHlyaWdodFN0YXRlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsIGJhc2ljR2V0Q29weXJpZ2h0U3RhdGVtZW50KCkgewotCQlyZXR1cm4gY29weXJpZ2h0U3RhdGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvcHlyaWdodFN0YXRlbWVudChTdXBwb3J0aW5nTWF0ZXJpYWwgbmV3Q29weXJpZ2h0U3RhdGVtZW50KSB7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBvbGRDb3B5cmlnaHRTdGF0ZW1lbnQgPSBjb3B5cmlnaHRTdGF0ZW1lbnQ7Ci0JCWNvcHlyaWdodFN0YXRlbWVudCA9IG5ld0NvcHlyaWdodFN0YXRlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUX1NUQVRFTUVOVCwKLQkJCQkJb2xkQ29weXJpZ2h0U3RhdGVtZW50LCBjb3B5cmlnaHRTdGF0ZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbnRlcmZhY2VzKCkgewotCQlpZiAoaW50ZXJmYWNlcyA9PSBudWxsKSB7Ci0JCQlpbnRlcmZhY2VzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdCgKLQkJCQkJUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUyk7Ci0JCX0KLQkJcmV0dXJuIGludGVyZmFjZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlpZiAocHJvY2VzcyAhPSBudWxsICYmICgoRU9iamVjdCkgcHJvY2VzcykuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFByb2Nlc3MgPSAoSW50ZXJuYWxFT2JqZWN0KSBwcm9jZXNzOwotCQkJcHJvY2VzcyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIGVSZXNvbHZlUHJveHkob2xkUHJvY2Vzcyk7Ci0JCQlpZiAocHJvY2VzcyAhPSBvbGRQcm9jZXNzKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1Byb2Nlc3MgPSAoSW50ZXJuYWxFT2JqZWN0KSBwcm9jZXNzOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQcm9jZXNzLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgbnVsbCwKLQkJCQkJCW51bGwpOwotCQkJCWlmIChuZXdQcm9jZXNzLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1Byb2Nlc3MKLQkJCQkJCQkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJLSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTLAotCQkJCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsIG9sZFByb2Nlc3MsCi0JCQkJCQkJcHJvY2VzcykpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9jZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgYmFzaWNHZXRQcm9jZXNzKCkgewotCQlyZXR1cm4gcHJvY2VzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcm9jZXNzKAotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIG5ld1Byb2Nlc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIG9sZFByb2Nlc3MgPSBwcm9jZXNzOwotCQlwcm9jZXNzID0gbmV3UHJvY2VzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywKLQkJCQkJb2xkUHJvY2VzcywgbmV3UHJvY2Vzcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBuZXdQcm9jZXNzKSB7Ci0JCWlmIChuZXdQcm9jZXNzICE9IHByb2Nlc3MpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHByb2Nlc3MpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgbnVsbCwKLQkJCQkJCW1zZ3MpOwotCQkJaWYgKG5ld1Byb2Nlc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1Byb2Nlc3MpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgbnVsbCwKLQkJCQkJCW1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJvY2VzcyhuZXdQcm9jZXNzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgbmV3UHJvY2VzcywKLQkJCQkJbmV3UHJvY2VzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCXJldHVybiBiYXNpY1NldFByb2Nlc3MobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQkJcmV0dXJuIGdldEF1dGhvcnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJCXJldHVybiBnZXRDaGFuZ2VEYXRlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIGdldENoYW5nZURlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTjoKLQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldENvcHlyaWdodFN0YXRlbWVudCgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRVM6Ci0JCQlyZXR1cm4gZ2V0SW50ZXJmYWNlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1M6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJvY2VzcygpOwotCQkJcmV0dXJuIGJhc2ljR2V0UHJvY2VzcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUzoKLQkJCXNldEF1dGhvcnMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOgotCQkJc2V0Q2hhbmdlRGF0ZSgoRGF0ZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCXNldENoYW5nZURlc2NyaXB0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OOgotCQkJc2V0VmVyc2lvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCXNldENvcHlyaWdodFN0YXRlbWVudCgoU3VwcG9ydGluZ01hdGVyaWFsKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUzoKLQkJCWdldEludGVyZmFjZXMoKS5jbGVhcigpOwotCQkJZ2V0SW50ZXJmYWNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1M6Ci0JCQlzZXRQcm9jZXNzKChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUzoKLQkJCXNldEF1dGhvcnMoQVVUSE9SU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEU6Ci0JCQlzZXRDaGFuZ2VEYXRlKENIQU5HRV9EQVRFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQlzZXRDaGFuZ2VEZXNjcmlwdGlvbihDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT046Ci0JCQlzZXRWZXJzaW9uKFZFUlNJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVF9TVEFURU1FTlQ6Ci0JCQlzZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKFN1cHBvcnRpbmdNYXRlcmlhbCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUzoKLQkJCWdldEludGVyZmFjZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1M6Ci0JCQlzZXRQcm9jZXNzKChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlM6Ci0JCQlyZXR1cm4gQVVUSE9SU19FREVGQVVMVCA9PSBudWxsID8gYXV0aG9ycyAhPSBudWxsCi0JCQkJCTogIUFVVEhPUlNfRURFRkFVTFQuZXF1YWxzKGF1dGhvcnMpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOgotCQkJcmV0dXJuIENIQU5HRV9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjaGFuZ2VEYXRlICE9IG51bGwKLQkJCQkJOiAhQ0hBTkdFX0RBVEVfRURFRkFVTFQuZXF1YWxzKGNoYW5nZURhdGUpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCXJldHVybiBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGNoYW5nZURlc2NyaXB0aW9uICE9IG51bGwKLQkJCQkJOiAhQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhjaGFuZ2VEZXNjcmlwdGlvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTjoKLQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwKLQkJCQkJOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCXJldHVybiBjb3B5cmlnaHRTdGF0ZW1lbnQgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0VTOgotCQkJcmV0dXJuIGludGVyZmFjZXMgIT0gbnVsbCAmJiAhaW50ZXJmYWNlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCXJldHVybiBwcm9jZXNzICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBNZXRob2RVbml0LmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUzoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEU6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fVkVSU0lPTjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gTWV0aG9kVW5pdC5jbGFzcykgewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlM7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT047Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT047Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQ6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhdXRob3JzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGF1dGhvcnMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNoYW5nZURhdGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoY2hhbmdlRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2hhbmdlRGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoY2hhbmdlRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZlcnNpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodmVyc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb2Nlc3NDb21wb25lbnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWVlYTVkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwjZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMgPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsI2dldEludGVyZmFjZUlPIDxlbT5JbnRlcmZhY2UgSU88L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJbXBsCi0JCWltcGxlbWVudHMgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpIDxlbT5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnRlcmZhY2VJTygpIDxlbT5JbnRlcmZhY2UgSU88L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW50ZXJmYWNlSU8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbnRlcmZhY2VJTyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpIHsKLQkJaWYgKGludGVyZmFjZVNwZWNpZmljYXRpb25zID09IG51bGwpIHsKLQkJCWludGVyZmFjZVNwZWNpZmljYXRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZygKLQkJCQkJVGFza0Rlc2NyaXB0b3IuY2xhc3MsCi0JCQkJCXRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTlMpOwotCQl9Ci0JCXJldHVybiBpbnRlcmZhY2VTcGVjaWZpY2F0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbnRlcmZhY2VJTygpIHsKLQkJaWYgKGludGVyZmFjZUlPID09IG51bGwpIHsKLQkJCWludGVyZmFjZUlPID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZygKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPKTsKLQkJfQotCQlyZXR1cm4gaW50ZXJmYWNlSU87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKSkuYmFzaWNSZW1vdmUoCi0JCQkJCW90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0SW50ZXJmYWNlSU8oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUzoKLQkJCXJldHVybiBnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU86Ci0JCQlyZXR1cm4gZ2V0SW50ZXJmYWNlSU8oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTlM6Ci0JCQlnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpLmNsZWFyKCk7Ci0JCQlnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU86Ci0JCQlnZXRJbnRlcmZhY2VJTygpLmNsZWFyKCk7Ci0JCQlnZXRJbnRlcmZhY2VJTygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TOgotCQkJZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU86Ci0JCQlnZXRJbnRlcmZhY2VJTygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUzoKLQkJCXJldHVybiBpbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyAhPSBudWxsCi0JCQkJCSYmICFpbnRlcmZhY2VTcGVjaWZpY2F0aW9ucy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCXJldHVybiBpbnRlcmZhY2VJTyAhPSBudWxsICYmICFpbnRlcmZhY2VJTy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ3YzEyOGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0RXh0ZXJuYWxJZCA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFNjb3BlIDxlbT5TY29wZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0VXNhZ2VOb3RlcyA8ZW0+VXNhZ2UgTm90ZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cwotCQlQcm9jZXNzRGVzY3JpcHRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsSWQoKSA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0lEX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbElkKCkgPGVtPkV4dGVybmFsIElkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4dGVybmFsSWQgPSBFWFRFUk5BTF9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY29wZSgpIDxlbT5TY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNDT1BFX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY29wZSgpIDxlbT5TY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2NvcGUgPSBTQ09QRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2FnZU5vdGVzKCkgPGVtPlVzYWdlIE5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVc2FnZU5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVU0FHRV9OT1RFU19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNhZ2VOb3RlcygpIDxlbT5Vc2FnZSBOb3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2VOb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1c2FnZU5vdGVzID0gVVNBR0VfTk9URVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVybmFsSWQoKSB7Ci0JCXJldHVybiBleHRlcm5hbElkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsSWQoU3RyaW5nIG5ld0V4dGVybmFsSWQpIHsKLQkJU3RyaW5nIG9sZEV4dGVybmFsSWQgPSBleHRlcm5hbElkOwotCQlleHRlcm5hbElkID0gbmV3RXh0ZXJuYWxJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCwgb2xkRXh0ZXJuYWxJZCwKLQkJCQkJZXh0ZXJuYWxJZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2NvcGUoKSB7Ci0JCXJldHVybiBzY29wZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTY29wZShTdHJpbmcgbmV3U2NvcGUpIHsKLQkJU3RyaW5nIG9sZFNjb3BlID0gc2NvcGU7Ci0JCXNjb3BlID0gbmV3U2NvcGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEUsIG9sZFNjb3BlLCBzY29wZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXNhZ2VOb3RlcygpIHsKLQkJcmV0dXJuIHVzYWdlTm90ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNhZ2VOb3RlcyhTdHJpbmcgbmV3VXNhZ2VOb3RlcykgewotCQlTdHJpbmcgb2xkVXNhZ2VOb3RlcyA9IHVzYWdlTm90ZXM7Ci0JCXVzYWdlTm90ZXMgPSBuZXdVc2FnZU5vdGVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTLCBvbGRVc2FnZU5vdGVzLAotCQkJCQl1c2FnZU5vdGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0RXh0ZXJuYWxJZCgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEU6Ci0JCQlyZXR1cm4gZ2V0U2NvcGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTOgotCQkJcmV0dXJuIGdldFVzYWdlTm90ZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ6Ci0JCQlzZXRFeHRlcm5hbElkKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJc2V0U2NvcGUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM6Ci0JCQlzZXRVc2FnZU5vdGVzKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJCXNldEV4dGVybmFsSWQoRVhURVJOQUxfSURfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEU6Ci0JCQlzZXRTY29wZShTQ09QRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUzoKLQkJCXNldFVzYWdlTm90ZXMoVVNBR0VfTk9URVNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ6Ci0JCQlyZXR1cm4gRVhURVJOQUxfSURfRURFRkFVTFQgPT0gbnVsbCA/IGV4dGVybmFsSWQgIT0gbnVsbAotCQkJCQk6ICFFWFRFUk5BTF9JRF9FREVGQVVMVC5lcXVhbHMoZXh0ZXJuYWxJZCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRToKLQkJCXJldHVybiBTQ09QRV9FREVGQVVMVCA9PSBudWxsID8gc2NvcGUgIT0gbnVsbCA6ICFTQ09QRV9FREVGQVVMVAotCQkJCQkuZXF1YWxzKHNjb3BlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTOgotCQkJcmV0dXJuIFVTQUdFX05PVEVTX0VERUZBVUxUID09IG51bGwgPyB1c2FnZU5vdGVzICE9IG51bGwKLQkJCQkJOiAhVVNBR0VfTk9URVNfRURFRkFVTFQuZXF1YWxzKHVzYWdlTm90ZXMpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGV4dGVybmFsSWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZXh0ZXJuYWxJZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2NvcGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc2NvcGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVzYWdlTm90ZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodXNhZ2VOb3Rlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb2Nlc3NEZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmMTNjNGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvY2Vzc0VsZW1lbnRJbXBsIGV4dGVuZHMgRGVzY3JpYmFibGVFbGVtZW50SW1wbAotCQlpbXBsZW1lbnRzIFByb2Nlc3NFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfRUxFTUVOVDsKLQl9Ci0KLX0gLy9Qcm9jZXNzRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NGYW1pbHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzRmFtaWx5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMWZiYzIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NGYW1pbHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBGYW1pbHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRmFtaWx5SW1wbCNnZXREZWxpdmVyeVByb2Nlc3NlcyA8ZW0+RGVsaXZlcnkgUHJvY2Vzc2VzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0ZhbWlseUltcGwgZXh0ZW5kcyBNZXRob2RDb25maWd1cmF0aW9uSW1wbCBpbXBsZW1lbnRzCi0JCVByb2Nlc3NGYW1pbHkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKSA8ZW0+RGVsaXZlcnkgUHJvY2Vzc2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2Vzc2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVsaXZlcnlQcm9jZXNzZXMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NGYW1pbHlJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0ZBTUlMWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZWxpdmVyeVByb2Nlc3NlcygpIHsKLQkJaWYgKGRlbGl2ZXJ5UHJvY2Vzc2VzID09IG51bGwpIHsKLQkJCWRlbGl2ZXJ5UHJvY2Vzc2VzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdCgKLQkJCQkJRGVsaXZlcnlQcm9jZXNzLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfRkFNSUxZX19ERUxJVkVSWV9QUk9DRVNTRVMpOwotCQl9Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0ZBTUlMWV9fREVMSVZFUllfUFJPQ0VTU0VTOgotCQkJcmV0dXJuIGdldERlbGl2ZXJ5UHJvY2Vzc2VzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfRkFNSUxZX19ERUxJVkVSWV9QUk9DRVNTRVM6Ci0JCQlnZXREZWxpdmVyeVByb2Nlc3NlcygpLmNsZWFyKCk7Ci0JCQlnZXREZWxpdmVyeVByb2Nlc3NlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfRkFNSUxZX19ERUxJVkVSWV9QUk9DRVNTRVM6Ci0JCQlnZXREZWxpdmVyeVByb2Nlc3NlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0ZBTUlMWV9fREVMSVZFUllfUFJPQ0VTU0VTOgotCQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc2VzICE9IG51bGwgJiYgIWRlbGl2ZXJ5UHJvY2Vzc2VzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vUHJvY2Vzc0ZhbWlseUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNjA1MGJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0ltcGwjZ2V0SW5jbHVkZXNQYXR0ZXJucyA8ZW0+SW5jbHVkZXMgUGF0dGVybnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzSW1wbCNnZXREZWZhdWx0Q29udGV4dCA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0ltcGwjZ2V0VmFsaWRDb250ZXh0IDxlbT5WYWxpZCBDb250ZXh0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvY2Vzc0ltcGwgZXh0ZW5kcyBBY3Rpdml0eUltcGwgaW1wbGVtZW50cwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5jbHVkZXNQYXR0ZXJucygpIDxlbT5JbmNsdWRlcyBQYXR0ZXJuczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmNsdWRlc1BhdHRlcm5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5jbHVkZXNQYXR0ZXJucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0Q29udGV4dCgpIDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRDb250ZXh0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29udGV4dCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWxpZENvbnRleHQoKSA8ZW0+VmFsaWQgQ29udGV4dDwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWxpZENvbnRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB2YWxpZENvbnRleHQgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEluY2x1ZGVzUGF0dGVybnMoKSB7Ci0JCWlmIChpbmNsdWRlc1BhdHRlcm5zID09IG51bGwpIHsKLQkJCWluY2x1ZGVzUGF0dGVybnMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KAotCQkJCQlDYXBhYmlsaXR5UGF0dGVybi5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOUyk7Ci0JCX0KLQkJcmV0dXJuIGluY2x1ZGVzUGF0dGVybnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0RGVmYXVsdENvbnRleHQoKSB7Ci0JCWlmIChkZWZhdWx0Q29udGV4dCAhPSBudWxsICYmICgoRU9iamVjdCkgZGVmYXVsdENvbnRleHQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGREZWZhdWx0Q29udGV4dCA9IChJbnRlcm5hbEVPYmplY3QpIGRlZmF1bHRDb250ZXh0OwotCQkJZGVmYXVsdENvbnRleHQgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgZVJlc29sdmVQcm94eShvbGREZWZhdWx0Q29udGV4dCk7Ci0JCQlpZiAoZGVmYXVsdENvbnRleHQgIT0gb2xkRGVmYXVsdENvbnRleHQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhULAotCQkJCQkJCW9sZERlZmF1bHRDb250ZXh0LCBkZWZhdWx0Q29udGV4dCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZhdWx0Q29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBiYXNpY0dldERlZmF1bHRDb250ZXh0KCkgewotCQlyZXR1cm4gZGVmYXVsdENvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdENvbnRleHQoTWV0aG9kQ29uZmlndXJhdGlvbiBuZXdEZWZhdWx0Q29udGV4dCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIG9sZERlZmF1bHRDb250ZXh0ID0gZGVmYXVsdENvbnRleHQ7Ci0JCWRlZmF1bHRDb250ZXh0ID0gbmV3RGVmYXVsdENvbnRleHQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhULCBvbGREZWZhdWx0Q29udGV4dCwKLQkJCQkJZGVmYXVsdENvbnRleHQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRWYWxpZENvbnRleHQoKSB7Ci0JCWlmICh2YWxpZENvbnRleHQgPT0gbnVsbCkgewotCQkJdmFsaWRDb250ZXh0ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQpOwotCQl9Ci0JCXJldHVybiB2YWxpZENvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTlM6Ci0JCQlyZXR1cm4gZ2V0SW5jbHVkZXNQYXR0ZXJucygpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXREZWZhdWx0Q29udGV4dCgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVDoKLQkJCXJldHVybiBnZXRWYWxpZENvbnRleHQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTlM6Ci0JCQlnZXRJbmNsdWRlc1BhdHRlcm5zKCkuY2xlYXIoKTsKLQkJCWdldEluY2x1ZGVzUGF0dGVybnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDoKLQkJCXNldERlZmF1bHRDb250ZXh0KChNZXRob2RDb25maWd1cmF0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUOgotCQkJZ2V0VmFsaWRDb250ZXh0KCkuY2xlYXIoKTsKLQkJCWdldFZhbGlkQ29udGV4dCgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TOgotCQkJZ2V0SW5jbHVkZXNQYXR0ZXJucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ6Ci0JCQlzZXREZWZhdWx0Q29udGV4dCgoTWV0aG9kQ29uZmlndXJhdGlvbikgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUOgotCQkJZ2V0VmFsaWRDb250ZXh0KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TOgotCQkJcmV0dXJuIGluY2x1ZGVzUGF0dGVybnMgIT0gbnVsbCAmJiAhaW5jbHVkZXNQYXR0ZXJucy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ6Ci0JCQlyZXR1cm4gZGVmYXVsdENvbnRleHQgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQ6Ci0JCQlyZXR1cm4gdmFsaWRDb250ZXh0ICE9IG51bGwgJiYgIXZhbGlkQ29udGV4dC5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1Byb2Nlc3NJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNjMyZDhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0VsZW1lbnRzIDxlbT5Qcm9jZXNzIEVsZW1lbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsI2dldERpYWdyYW1zIDxlbT5EaWFncmFtczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NQYWNrYWdlSW1wbCBleHRlbmRzIE1ldGhvZFBhY2thZ2VJbXBsIGltcGxlbWVudHMKLQkJUHJvY2Vzc1BhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvY2Vzc0VsZW1lbnRzKCkgPGVtPlByb2Nlc3MgRWxlbWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvY2Vzc0VsZW1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcHJvY2Vzc0VsZW1lbnRzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpYWdyYW1zKCkgPGVtPkRpYWdyYW1zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpYWdyYW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGlhZ3JhbXMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb2Nlc3NFbGVtZW50cygpIHsKLQkJaWYgKHByb2Nlc3NFbGVtZW50cyA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzRWxlbWVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nKAotCQkJCQlQcm9jZXNzRWxlbWVudC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMpOwotCQl9Ci0JCXJldHVybiBwcm9jZXNzRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGlhZ3JhbXMoKSB7Ci0JCWlmIChkaWFncmFtcyA9PSBudWxsKSB7Ci0JCQlkaWFncmFtcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmcoRGlhZ3JhbS5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0RJQUdSQU1TKTsKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldFByb2Nlc3NFbGVtZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0RJQUdSQU1TOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RGlhZ3JhbXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFM6Ci0JCQlyZXR1cm4gZ2V0UHJvY2Vzc0VsZW1lbnRzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0RJQUdSQU1TOgotCQkJcmV0dXJuIGdldERpYWdyYW1zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUzoKLQkJCWdldFByb2Nlc3NFbGVtZW50cygpLmNsZWFyKCk7Ci0JCQlnZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVM6Ci0JCQlnZXREaWFncmFtcygpLmNsZWFyKCk7Ci0JCQlnZXREaWFncmFtcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUzoKLQkJCWdldFByb2Nlc3NFbGVtZW50cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0RJQUdSQU1TOgotCQkJZ2V0RGlhZ3JhbXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTOgotCQkJcmV0dXJuIHByb2Nlc3NFbGVtZW50cyAhPSBudWxsICYmICFwcm9jZXNzRWxlbWVudHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUzoKLQkJCXJldHVybiBkaWFncmFtcyAhPSBudWxsICYmICFkaWFncmFtcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1Byb2Nlc3NQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGNmYzU3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbCNnZXRCYXNlZE9uUHJvY2Vzc2VzIDxlbT5CYXNlZCBPbiBQcm9jZXNzZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwgZXh0ZW5kcyBQcm9jZXNzSW1wbCBpbXBsZW1lbnRzCi0JCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VkT25Qcm9jZXNzZXMoKSA8ZW0+QmFzZWQgT24gUHJvY2Vzc2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhc2VkT25Qcm9jZXNzZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBiYXNlZE9uUHJvY2Vzc2VzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0QmFzZWRPblByb2Nlc3NlcygpIHsKLQkJaWYgKGJhc2VkT25Qcm9jZXNzZXMgPT0gbnVsbCkgewotCQkJYmFzZWRPblByb2Nlc3NlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoCi0JCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzcy5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFRF9PTl9QUk9DRVNTRVMpOwotCQl9Ci0JCXJldHVybiBiYXNlZE9uUHJvY2Vzc2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VEX09OX1BST0NFU1NFUzoKLQkJCXJldHVybiBnZXRCYXNlZE9uUHJvY2Vzc2VzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VEX09OX1BST0NFU1NFUzoKLQkJCWdldEJhc2VkT25Qcm9jZXNzZXMoKS5jbGVhcigpOwotCQkJZ2V0QmFzZWRPblByb2Nlc3NlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VEX09OX1BST0NFU1NFUzoKLQkJCWdldEJhc2VkT25Qcm9jZXNzZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRURfT05fUFJPQ0VTU0VTOgotCQkJcmV0dXJuIGJhc2VkT25Qcm9jZXNzZXMgIT0gbnVsbCAmJiAhYmFzZWRPblByb2Nlc3Nlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvcGVydHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9wZXJ0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2U4MGU1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9wZXJ0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9wZXJ0eUltcGwjZ2V0S2V5IDxlbT5LZXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9wZXJ0eUltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlJbXBsIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJbXBsIGltcGxlbWVudHMgUHJvcGVydHkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtleSgpIDxlbT5LZXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLZXkoKSA8ZW0+S2V5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRLZXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcga2V5ID0gS0VZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPUEVSVFk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBrZXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBuZXdLZXkpIHsKLQkJU3RyaW5nIG9sZEtleSA9IGtleTsKLQkJa2V5ID0gbmV3S2V5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBST1BFUlRZX19LRVksIG9sZEtleSwga2V5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9QRVJUWV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST1BFUlRZX19LRVk6Ci0JCQlyZXR1cm4gZ2V0S2V5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWV9fVkFMVUU6Ci0JCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFlfX0tFWToKLQkJCXNldEtleSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWV9fVkFMVUU6Ci0JCQlzZXRWYWx1ZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFlfX0tFWToKLQkJCXNldEtleShLRVlfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFOgotCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFlfX0tFWToKLQkJCXJldHVybiBLRVlfRURFRkFVTFQgPT0gbnVsbCA/IGtleSAhPSBudWxsIDogIUtFWV9FREVGQVVMVAotCQkJCQkuZXF1YWxzKGtleSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWV9fVkFMVUU6Ci0JCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQKLQkJCQkJLmVxdWFscyh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoa2V5OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGtleSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9wZXJ0eUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BzZXVkb1N0YXRlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHNldWRvU3RhdGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIxNTA5NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHNldWRvU3RhdGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFBzZXVkb1N0YXRlSW1wbC5qYXZhLHYgMS40IDIwMDYvMDkvMDcgMDA6MDY6MjAga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qc2V1ZG9TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qc2V1ZG8gU3RhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQc2V1ZG9TdGF0ZUltcGwgZXh0ZW5kcyBWZXJ0ZXhJbXBsIGltcGxlbWVudHMgUHNldWRvU3RhdGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBzZXVkb1N0YXRlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFNFVURPX1NUQVRFOwotCX0KLQotfSAvL1BzZXVkb1N0YXRlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JlZmVyZW5jZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JlZmVyZW5jZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjI3NWVlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9SZWZlcmVuY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVmZXJlbmNlSW1wbCNnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiA8ZW0+SXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlZmVyZW5jZUltcGwjZ2V0UmVmZXJlbmNlZCA8ZW0+UmVmZXJlbmNlZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlZmVyZW5jZUltcGwgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEltcGwgaW1wbGVtZW50cyBSZWZlcmVuY2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCkgPGVtPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpIDxlbT5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24gPSBJU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmZXJlbmNlZCgpIDxlbT5SZWZlcmVuY2VkPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ3JhbUVsZW1lbnQgcmVmZXJlbmNlZCA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVmZXJlbmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVGRVJFTkNFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oCi0JCQlCb29sZWFuIG5ld0lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKSB7Ci0JCUJvb2xlYW4gb2xkSXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24gPSBpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbjsKLQkJaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24gPSBuZXdJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5SRUZFUkVOQ0VfX0lTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT04sCi0JCQkJCW9sZElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uLCBpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtRWxlbWVudCBnZXRSZWZlcmVuY2VkKCkgewotCQlpZiAocmVmZXJlbmNlZCAhPSBudWxsICYmICgoRU9iamVjdCkgcmVmZXJlbmNlZCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFJlZmVyZW5jZWQgPSAoSW50ZXJuYWxFT2JqZWN0KSByZWZlcmVuY2VkOwotCQkJcmVmZXJlbmNlZCA9IChEaWFncmFtRWxlbWVudCkgZVJlc29sdmVQcm94eShvbGRSZWZlcmVuY2VkKTsKLQkJCWlmIChyZWZlcmVuY2VkICE9IG9sZFJlZmVyZW5jZWQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuUkVGRVJFTkNFX19SRUZFUkVOQ0VELCBvbGRSZWZlcmVuY2VkLAotCQkJCQkJCXJlZmVyZW5jZWQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUVsZW1lbnQgYmFzaWNHZXRSZWZlcmVuY2VkKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZWZlcmVuY2VkKERpYWdyYW1FbGVtZW50IG5ld1JlZmVyZW5jZWQsCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCURpYWdyYW1FbGVtZW50IG9sZFJlZmVyZW5jZWQgPSByZWZlcmVuY2VkOwotCQlyZWZlcmVuY2VkID0gbmV3UmVmZXJlbmNlZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQsCi0JCQkJCW9sZFJlZmVyZW5jZWQsIG5ld1JlZmVyZW5jZWQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZChEaWFncmFtRWxlbWVudCBuZXdSZWZlcmVuY2VkKSB7Ci0JCWlmIChuZXdSZWZlcmVuY2VkICE9IHJlZmVyZW5jZWQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJlZmVyZW5jZWQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHJlZmVyZW5jZWQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFLAotCQkJCQkJRGlhZ3JhbUVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld1JlZmVyZW5jZWQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1JlZmVyZW5jZWQpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFLAotCQkJCQkJRGlhZ3JhbUVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmVmZXJlbmNlZChuZXdSZWZlcmVuY2VkLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQsIG5ld1JlZmVyZW5jZWQsCi0JCQkJCW5ld1JlZmVyZW5jZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUkVGRVJFTkNFX19SRUZFUkVOQ0VEOgotCQkJaWYgKHJlZmVyZW5jZWQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHJlZmVyZW5jZWQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFLAotCQkJCQkJRGlhZ3JhbUVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0UmVmZXJlbmNlZCgoRGlhZ3JhbUVsZW1lbnQpIG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fUkVGRVJFTkNFRDoKLQkJCXJldHVybiBiYXNpY1NldFJlZmVyZW5jZWQobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTjoKLQkJCXJldHVybiBnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUkVGRVJFTkNFX19SRUZFUkVOQ0VEOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFJlZmVyZW5jZWQoKTsKLQkJCXJldHVybiBiYXNpY0dldFJlZmVyZW5jZWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OOgotCQkJc2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fUkVGRVJFTkNFRDoKLQkJCXNldFJlZmVyZW5jZWQoKERpYWdyYW1FbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OOgotCQkJc2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQ6Ci0JCQlzZXRSZWZlcmVuY2VkKChEaWFncmFtRWxlbWVudCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX0lTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT046Ci0JCQlyZXR1cm4gSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTl9FREVGQVVMVCA9PSBudWxsID8gaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24gIT0gbnVsbAotCQkJCQk6ICFJU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQ6Ci0JCQlyZXR1cm4gcmVmZXJlbmNlZCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUmVmZXJlbmNlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUmVnaW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUmVnaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NDYxZmY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JlZ2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJlZ2lvbkltcGwuamF2YSx2IDEuNSAyMDA2LzA5LzA3IDAwOjA2OjIwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGVNYWNoaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVnaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVnaW9uSW1wbCNnZXRWZXJ0ZXggPGVtPlZlcnRleDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlZ2lvbkltcGwjZ2V0VHJhbnNpdGlvbiA8ZW0+VHJhbnNpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlZ2lvbkltcGwjZ2V0U3RhdGUgPGVtPlN0YXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVnaW9uSW1wbCNnZXRTdGF0ZU1hY2hpbmUgPGVtPlN0YXRlIE1hY2hpbmU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWdpb25JbXBsIGV4dGVuZHMgTXVsdGlSZXNvdXJjZUVPYmplY3QgaW1wbGVtZW50cyBSZWdpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVydGV4KCkgPGVtPlZlcnRleDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJ0ZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB2ZXJ0ZXggPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNpdGlvbigpIDxlbT5UcmFuc2l0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRyYW5zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB0cmFuc2l0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZWdpb25JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5SRUdJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0VmVydGV4KCkgewotCQlpZiAodmVydGV4ID09IG51bGwpIHsKLQkJCXZlcnRleCA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0LlJlc29sdmluZygKLQkJCQkJVmVydGV4LmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlJFR0lPTl9fVkVSVEVYLAotCQkJCQlVbWFQYWNrYWdlLlZFUlRFWF9fQ09OVEFJTkVSKTsKLQkJfQotCQlyZXR1cm4gdmVydGV4OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFRyYW5zaXRpb24oKSB7Ci0JCWlmICh0cmFuc2l0aW9uID09IG51bGwpIHsKLQkJCXRyYW5zaXRpb24gPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdC5SZXNvbHZpbmcoCi0JCQkJCVRyYW5zaXRpb24uY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuUkVHSU9OX19UUkFOU0lUSU9OLAotCQkJCQlVbWFQYWNrYWdlLlRSQU5TSVRJT05fX0NPTlRBSU5FUik7Ci0JCX0KLQkJcmV0dXJuIHRyYW5zaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0YXRlIGdldFN0YXRlKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLlJFR0lPTl9fU1RBVEUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChTdGF0ZSkgZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdGF0ZSBiYXNpY0dldFN0YXRlKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLlJFR0lPTl9fU1RBVEUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChTdGF0ZSkgZUludGVybmFsQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U3RhdGUoU3RhdGUgbmV3U3RhdGUsCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3U3RhdGUsCi0JCQkJVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhdGUoU3RhdGUgbmV3U3RhdGUpIHsKLQkJaWYgKG5ld1N0YXRlICE9IGVJbnRlcm5hbENvbnRhaW5lcigpCi0JCQkJfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFICYmIG5ld1N0YXRlICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgKEVPYmplY3QpIG5ld1N0YXRlKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkJIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld1N0YXRlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdTdGF0ZSkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuU1RBVEVfX1JFR0lPTiwgU3RhdGUuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U3RhdGUobmV3U3RhdGUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlJFR0lPTl9fU1RBVEUsIG5ld1N0YXRlLCBuZXdTdGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdGF0ZU1hY2hpbmUgZ2V0U3RhdGVNYWNoaW5lKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLlJFR0lPTl9fU1RBVEVfTUFDSElORSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKFN0YXRlTWFjaGluZSkgZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdGF0ZU1hY2hpbmUgYmFzaWNHZXRTdGF0ZU1hY2hpbmUoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuUkVHSU9OX19TVEFURV9NQUNISU5FKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoU3RhdGVNYWNoaW5lKSBlSW50ZXJuYWxDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTdGF0ZU1hY2hpbmUoU3RhdGVNYWNoaW5lIG5ld1N0YXRlTWFjaGluZSwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdTdGF0ZU1hY2hpbmUsCi0JCQkJVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFX01BQ0hJTkUsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGF0ZU1hY2hpbmUoU3RhdGVNYWNoaW5lIG5ld1N0YXRlTWFjaGluZSkgewotCQlpZiAobmV3U3RhdGVNYWNoaW5lICE9IGVJbnRlcm5hbENvbnRhaW5lcigpCi0JCQkJfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFX01BQ0hJTkUgJiYgbmV3U3RhdGVNYWNoaW5lICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgKEVPYmplY3QpIG5ld1N0YXRlTWFjaGluZSkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdTdGF0ZU1hY2hpbmUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1N0YXRlTWFjaGluZSkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuU1RBVEVfTUFDSElORV9fUkVHSU9OLCBTdGF0ZU1hY2hpbmUuY2xhc3MsCi0JCQkJCQltc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFN0YXRlTWFjaGluZShuZXdTdGF0ZU1hY2hpbmUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlJFR0lPTl9fU1RBVEVfTUFDSElORSwgbmV3U3RhdGVNYWNoaW5lLAotCQkJCQluZXdTdGF0ZU1hY2hpbmUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUkVHSU9OX19WRVJURVg6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRWZXJ0ZXgoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuUkVHSU9OX19UUkFOU0lUSU9OOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0VHJhbnNpdGlvbigpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFOgotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXRTdGF0ZSgoU3RhdGUpIG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTl9fU1RBVEVfTUFDSElORToKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0U3RhdGVNYWNoaW5lKChTdGF0ZU1hY2hpbmUpIG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTl9fVkVSVEVYOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0VmVydGV4KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTl9fVFJBTlNJVElPTjoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldFRyYW5zaXRpb24oKSkKLQkJCQkJLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTl9fU1RBVEU6Ci0JCQlyZXR1cm4gYmFzaWNTZXRTdGF0ZShudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTl9fU1RBVEVfTUFDSElORToKLQkJCXJldHVybiBiYXNpY1NldFN0YXRlTWFjaGluZShudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTl9fU1RBVEU6Ci0JCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJVW1hUGFja2FnZS5TVEFURV9fUkVHSU9OLCBTdGF0ZS5jbGFzcywgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFX01BQ0hJTkU6Ci0JCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJVW1hUGFja2FnZS5TVEFURV9NQUNISU5FX19SRUdJT04sIFN0YXRlTWFjaGluZS5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTl9fVkVSVEVYOgotCQkJcmV0dXJuIGdldFZlcnRleCgpOwotCQljYXNlIFVtYVBhY2thZ2UuUkVHSU9OX19UUkFOU0lUSU9OOgotCQkJcmV0dXJuIGdldFRyYW5zaXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTl9fU1RBVEU6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0U3RhdGUoKTsKLQkJCXJldHVybiBiYXNpY0dldFN0YXRlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFX01BQ0hJTkU6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0U3RhdGVNYWNoaW5lKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRTdGF0ZU1hY2hpbmUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUkVHSU9OX19WRVJURVg6Ci0JCQlnZXRWZXJ0ZXgoKS5jbGVhcigpOwotCQkJZ2V0VmVydGV4KCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUdJT05fX1RSQU5TSVRJT046Ci0JCQlnZXRUcmFuc2l0aW9uKCkuY2xlYXIoKTsKLQkJCWdldFRyYW5zaXRpb24oKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTl9fU1RBVEU6Ci0JCQlzZXRTdGF0ZSgoU3RhdGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTl9fU1RBVEVfTUFDSElORToKLQkJCXNldFN0YXRlTWFjaGluZSgoU3RhdGVNYWNoaW5lKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUkVHSU9OX19WRVJURVg6Ci0JCQlnZXRWZXJ0ZXgoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUkVHSU9OX19UUkFOU0lUSU9OOgotCQkJZ2V0VHJhbnNpdGlvbigpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFOgotCQkJc2V0U3RhdGUoKFN0YXRlKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTl9fU1RBVEVfTUFDSElORToKLQkJCXNldFN0YXRlTWFjaGluZSgoU3RhdGVNYWNoaW5lKSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTl9fVkVSVEVYOgotCQkJcmV0dXJuIHZlcnRleCAhPSBudWxsICYmICF2ZXJ0ZXguaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUkVHSU9OX19UUkFOU0lUSU9OOgotCQkJcmV0dXJuIHRyYW5zaXRpb24gIT0gbnVsbCAmJiAhdHJhbnNpdGlvbi5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUdJT05fX1NUQVRFOgotCQkJcmV0dXJuIGJhc2ljR2V0U3RhdGUoKSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuUkVHSU9OX19TVEFURV9NQUNISU5FOgotCQkJcmV0dXJuIGJhc2ljR2V0U3RhdGVNYWNoaW5lKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vUmVnaW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JlcG9ydEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JlcG9ydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzc0OTk1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9SZXBvcnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlcG9ydEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBSZXBvcnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlcG9ydEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJFUE9SVDsKLQl9Ci0KLX0gLy9SZXBvcnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9SZXVzYWJsZUFzc2V0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUmV1c2FibGVBc3NldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWIxZTUyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9SZXVzYWJsZUFzc2V0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXVzYWJsZUFzc2V0SW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFJldXNhYmxlQXNzZXQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJldXNhYmxlQXNzZXRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5SRVVTQUJMRV9BU1NFVDsKLQl9Ci0KLX0gLy9SZXVzYWJsZUFzc2V0SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9hZG1hcEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvYWRtYXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwNjBlOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9hZG1hcEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2FkbWFwSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFJvYWRtYXAgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvYWRtYXBJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0FETUFQOwotCX0KLQotfSAvL1JvYWRtYXBJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlRGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0MDcwZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwjZ2V0U2tpbGxzIDxlbT5Ta2lsbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzIDxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsI2dldFN5bm9ueW1zIDxlbT5TeW5vbnltczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMKLQkJUm9sZURlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTa2lsbHMoKSA8ZW0+U2tpbGxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTa2lsbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSUxMU19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2tpbGxzKCkgPGVtPlNraWxsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2tpbGxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNraWxscyA9IFNLSUxMU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpIDxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NJR05NRU5UX0FQUFJPQUNIRVNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzKCkgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXNzaWdubWVudEFwcHJvYWNoZXMgPSBBU1NJR05NRU5UX0FQUFJPQUNIRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3lub255bXMoKSA8ZW0+U3lub255bXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN5bm9ueW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5PTllNU19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3lub255bXMoKSA8ZW0+U3lub255bXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN5bm9ueW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN5bm9ueW1zID0gU1lOT05ZTVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZURlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNraWxscygpIHsKLQkJcmV0dXJuIHNraWxsczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTa2lsbHMoU3RyaW5nIG5ld1NraWxscykgewotCQlTdHJpbmcgb2xkU2tpbGxzID0gc2tpbGxzOwotCQlza2lsbHMgPSBuZXdTa2lsbHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU0tJTExTLCBvbGRTa2lsbHMsIHNraWxscykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKSB7Ci0JCXJldHVybiBhc3NpZ25tZW50QXBwcm9hY2hlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBc3NpZ25tZW50QXBwcm9hY2hlcyhTdHJpbmcgbmV3QXNzaWdubWVudEFwcHJvYWNoZXMpIHsKLQkJU3RyaW5nIG9sZEFzc2lnbm1lbnRBcHByb2FjaGVzID0gYXNzaWdubWVudEFwcHJvYWNoZXM7Ci0JCWFzc2lnbm1lbnRBcHByb2FjaGVzID0gbmV3QXNzaWdubWVudEFwcHJvYWNoZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTLAotCQkJCQlvbGRBc3NpZ25tZW50QXBwcm9hY2hlcywgYXNzaWdubWVudEFwcHJvYWNoZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5bm9ueW1zKCkgewotCQlyZXR1cm4gc3lub255bXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lub255bXMoU3RyaW5nIG5ld1N5bm9ueW1zKSB7Ci0JCVN0cmluZyBvbGRTeW5vbnltcyA9IHN5bm9ueW1zOwotCQlzeW5vbnltcyA9IG5ld1N5bm9ueW1zOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TLCBvbGRTeW5vbnltcywKLQkJCQkJc3lub255bXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFM6Ci0JCQlyZXR1cm4gZ2V0U2tpbGxzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVM6Ci0JCQlyZXR1cm4gZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TOgotCQkJcmV0dXJuIGdldFN5bm9ueW1zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUzoKLQkJCXNldFNraWxscygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVM6Ci0JCQlzZXRBc3NpZ25tZW50QXBwcm9hY2hlcygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUzoKLQkJCXNldFN5bm9ueW1zKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFM6Ci0JCQlzZXRTa2lsbHMoU0tJTExTX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUzoKLQkJCXNldEFzc2lnbm1lbnRBcHByb2FjaGVzKEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUzoKLQkJCXNldFN5bm9ueW1zKFNZTk9OWU1TX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUzoKLQkJCXJldHVybiBTS0lMTFNfRURFRkFVTFQgPT0gbnVsbCA/IHNraWxscyAhPSBudWxsIDogIVNLSUxMU19FREVGQVVMVAotCQkJCQkuZXF1YWxzKHNraWxscyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVM6Ci0JCQlyZXR1cm4gQVNTSUdOTUVOVF9BUFBST0FDSEVTX0VERUZBVUxUID09IG51bGwgPyBhc3NpZ25tZW50QXBwcm9hY2hlcyAhPSBudWxsCi0JCQkJCTogIUFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVAotCQkJCQkJCS5lcXVhbHMoYXNzaWdubWVudEFwcHJvYWNoZXMpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVM6Ci0JCQlyZXR1cm4gU1lOT05ZTVNfRURFRkFVTFQgPT0gbnVsbCA/IHN5bm9ueW1zICE9IG51bGwKLQkJCQkJOiAhU1lOT05ZTVNfRURFRkFVTFQuZXF1YWxzKHN5bm9ueW1zKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChza2lsbHM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc2tpbGxzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhc3NpZ25tZW50QXBwcm9hY2hlczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhc3NpZ25tZW50QXBwcm9hY2hlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3lub255bXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc3lub255bXMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Sb2xlRGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlRGVzY3JpcHRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVEZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNDc5M2I1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVEZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNJbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbCNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsI2dldE1vZGlmaWVzIDxlbT5Nb2RpZmllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbCNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0b3JJbXBsIGV4dGVuZHMgRGVzY3JpcHRvckltcGwgaW1wbGVtZW50cwotCQlSb2xlRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlKCkgPGVtPlJvbGU8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlIHJvbGUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzcG9uc2libGVGb3IoKSA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3BvbnNpYmxlRm9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVzcG9uc2libGVGb3IgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVEZXNjcmlwdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlIGdldFJvbGUoKSB7Ci0JCWlmIChyb2xlICE9IG51bGwgJiYgKChFT2JqZWN0KSByb2xlKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUm9sZSA9IChJbnRlcm5hbEVPYmplY3QpIHJvbGU7Ci0JCQlyb2xlID0gKFJvbGUpIGVSZXNvbHZlUHJveHkob2xkUm9sZSk7Ci0JCQlpZiAocm9sZSAhPSBvbGRSb2xlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRSwgb2xkUm9sZSwgcm9sZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlIGJhc2ljR2V0Um9sZSgpIHsKLQkJcmV0dXJuIHJvbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sZShSb2xlIG5ld1JvbGUpIHsKLQkJUm9sZSBvbGRSb2xlID0gcm9sZTsKLQkJcm9sZSA9IG5ld1JvbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFLCBvbGRSb2xlLCByb2xlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNb2RpZmllcygpIHsKLQkJTGlzdCBwZXJmb3JtcyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnModGhpcyk7Ci0JCUludGVybmFsRUxpc3QgbW9kaWZpZXMgPSBuZXcgQmFzaWNJbnRlcm5hbEVMaXN0KAotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcyk7Ci0JCWlmIChwZXJmb3JtcyAhPSBudWxsICYmIHBlcmZvcm1zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHBlcmZvcm1zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBpLm5leHQoKTsKLQotCQkJCS8vIGZvciBlYWNoIHRhc2ssIGdldCBvdXRwdXQgd29yayBwcm9kdWN0OwotCQkJCUxpc3Qgb3V0cHV0V1BzID0gdGQuZ2V0T3V0cHV0KCk7Ci0JCQkJaWYgKG91dHB1dFdQcyAhPSBudWxsICYmIG91dHB1dFdQcy5zaXplKCkgPiAwKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBvdXRwdXRXUHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0Ci0JCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQlpZiAod3BkICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoIW1vZGlmaWVzLmNvbnRhaW5zKHdwZCkpIHsKLQkJCQkJCQkJbW9kaWZpZXMuYWRkKHdwZCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZXNwb25zaWJsZUZvcigpIHsKLQkJaWYgKHJlc3BvbnNpYmxlRm9yID09IG51bGwpIHsKLQkJCXJlc3BvbnNpYmxlRm9yID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdCgKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SKTsKLQkJfQotCQlyZXR1cm4gcmVzcG9uc2libGVGb3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFJvbGUoKTsKLQkJCXJldHVybiBiYXNpY0dldFJvbGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fTU9ESUZJRVM6Ci0JCQlyZXR1cm4gZ2V0TW9kaWZpZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJcmV0dXJuIGdldFJlc3BvbnNpYmxlRm9yKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRToKLQkJCXNldFJvbGUoKFJvbGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5jbGVhcigpOwotCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEU6Ci0JCQlzZXRSb2xlKChSb2xlKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJcmV0dXJuIHJvbGUgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fTU9ESUZJRVM6Ci0JCQlyZXR1cm4gIWdldE1vZGlmaWVzKCkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQlyZXR1cm4gcmVzcG9uc2libGVGb3IgIT0gbnVsbCAmJiAhcmVzcG9uc2libGVGb3IuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Sb2xlRGVzY3JpcHRvckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYzg2N2RiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVJbXBsI2dldE1vZGlmaWVzIDxlbT5Nb2RpZmllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVJbXBsI2dldFJlc3BvbnNpYmxlRm9yIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlSW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFJvbGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzcG9uc2libGVGb3IoKSA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3BvbnNpYmxlRm9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVzcG9uc2libGVGb3IgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIExpc3QgZ2V0TW9kaWZpZXMoKSB7Ci0JCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRNb2RpZmllZFdvcmtQcm9kdWN0cyh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZXNwb25zaWJsZUZvcigpIHsKLQkJaWYgKHJlc3BvbnNpYmxlRm9yID09IG51bGwpIHsKLQkJCXJlc3BvbnNpYmxlRm9yID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChXb3JrUHJvZHVjdC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5ST0xFX19SRVNQT05TSUJMRV9GT1IpOwotCQl9Ci0JCXJldHVybiByZXNwb25zaWJsZUZvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX19NT0RJRklFUzoKLQkJCXJldHVybiBnZXRNb2RpZmllcygpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fUkVTUE9OU0lCTEVfRk9SOgotCQkJcmV0dXJuIGdldFJlc3BvbnNpYmxlRm9yKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fUkVTUE9OU0lCTEVfRk9SOgotCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fTU9ESUZJRVM6Ci0JCQlyZXR1cm4gIWdldE1vZGlmaWVzKCkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fUkVTUE9OU0lCTEVfRk9SOgotCQkJcmV0dXJuIHJlc3BvbnNpYmxlRm9yICE9IG51bGwgJiYgIXJlc3BvbnNpYmxlRm9yLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vUm9sZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVTZXRHcm91cGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVTZXRHcm91cGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDYxMWEyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlU2V0R3JvdXBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBTZXQgR3JvdXBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsI2dldFJvbGVTZXRzIDxlbT5Sb2xlIFNldHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0R3JvdXBpbmdJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzCi0JCVJvbGVTZXRHcm91cGluZyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlU2V0cygpIDxlbT5Sb2xlIFNldHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9sZVNldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByb2xlU2V0cyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZVNldEdyb3VwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVRfR1JPVVBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0Um9sZVNldHMoKSB7Ci0JCWlmIChyb2xlU2V0cyA9PSBudWxsKSB7Ci0JCQlyb2xlU2V0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoUm9sZVNldC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTKTsKLQkJfQotCQlyZXR1cm4gcm9sZVNldHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUzoKLQkJCXJldHVybiBnZXRSb2xlU2V0cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTOgotCQkJZ2V0Um9sZVNldHMoKS5jbGVhcigpOwotCQkJZ2V0Um9sZVNldHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTOgotCQkJZ2V0Um9sZVNldHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUzoKLQkJCXJldHVybiByb2xlU2V0cyAhPSBudWxsICYmICFyb2xlU2V0cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1JvbGVTZXRHcm91cGluZ0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVTZXRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlU2V0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNjFkMzE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVTZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgU2V0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEltcGwjZ2V0Um9sZXMgPGVtPlJvbGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgUm9sZVNldCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlcygpIDxlbT5Sb2xlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJvbGVzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlU2V0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0Um9sZXMoKSB7Ci0JCWlmIChyb2xlcyA9PSBudWxsKSB7Ci0JCQlyb2xlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoUm9sZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5ST0xFX1NFVF9fUk9MRVMpOwotCQl9Ci0JCXJldHVybiByb2xlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fUk9MRVM6Ci0JCQlyZXR1cm4gZ2V0Um9sZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEVTOgotCQkJZ2V0Um9sZXMoKS5jbGVhcigpOwotCQkJZ2V0Um9sZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fUk9MRVM6Ci0JCQlnZXRSb2xlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fUk9MRVM6Ci0JCQlyZXR1cm4gcm9sZXMgIT0gbnVsbCAmJiAhcm9sZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Sb2xlU2V0SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU2VjdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NlY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNiYjFhNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU2VjdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlY3Rpb25JbXBsI2dldFNlY3Rpb25OYW1lIDxlbT5TZWN0aW9uIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZWN0aW9uSW1wbCNnZXRTZWN0aW9uRGVzY3JpcHRpb24gPGVtPlNlY3Rpb24gRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZWN0aW9uSW1wbCNnZXRTdWJTZWN0aW9ucyA8ZW0+U3ViIFNlY3Rpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VjdGlvbkltcGwgZXh0ZW5kcyBWYXJpYWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgU2VjdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VjdGlvbk5hbWUoKSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDVElPTl9OQU1FX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN0aW9uTmFtZSgpIDxlbT5TZWN0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlY3Rpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlY3Rpb25OYW1lID0gU0VDVElPTl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpIDxlbT5TZWN0aW9uIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ1RJT05fREVTQ1JJUFRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpIDxlbT5TZWN0aW9uIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2VjdGlvbkRlc2NyaXB0aW9uID0gU0VDVElPTl9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YlNlY3Rpb25zKCkgPGVtPlN1YiBTZWN0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJTZWN0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHN1YlNlY3Rpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWRlY2Vzc29yKCkgPGVtPlByZWRlY2Vzc29yPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFNlY3Rpb24gcHJlZGVjZXNzb3IgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlY3Rpb25JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5TRUNUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBzZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWN0aW9uTmFtZShTdHJpbmcgbmV3U2VjdGlvbk5hbWUpIHsKLQkJU3RyaW5nIG9sZFNlY3Rpb25OYW1lID0gc2VjdGlvbk5hbWU7Ci0JCXNlY3Rpb25OYW1lID0gbmV3U2VjdGlvbk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FLCBvbGRTZWN0aW9uTmFtZSwKLQkJCQkJc2VjdGlvbk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHNlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWN0aW9uRGVzY3JpcHRpb24oU3RyaW5nIG5ld1NlY3Rpb25EZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkU2VjdGlvbkRlc2NyaXB0aW9uID0gc2VjdGlvbkRlc2NyaXB0aW9uOwotCQlzZWN0aW9uRGVzY3JpcHRpb24gPSBuZXdTZWN0aW9uRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9ERVNDUklQVElPTiwKLQkJCQkJb2xkU2VjdGlvbkRlc2NyaXB0aW9uLCBzZWN0aW9uRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTdWJTZWN0aW9ucygpIHsKLQkJaWYgKHN1YlNlY3Rpb25zID09IG51bGwpIHsKLQkJCXN1YlNlY3Rpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZyhTZWN0aW9uLmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIHN1YlNlY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZWN0aW9uIGdldFByZWRlY2Vzc29yKCkgewotCQlpZiAocHJlZGVjZXNzb3IgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHByZWRlY2Vzc29yKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJlZGVjZXNzb3IgPSAoSW50ZXJuYWxFT2JqZWN0KSBwcmVkZWNlc3NvcjsKLQkJCXByZWRlY2Vzc29yID0gKFNlY3Rpb24pIGVSZXNvbHZlUHJveHkob2xkUHJlZGVjZXNzb3IpOwotCQkJaWYgKHByZWRlY2Vzc29yICE9IG9sZFByZWRlY2Vzc29yKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlNFQ1RJT05fX1BSRURFQ0VTU09SLCBvbGRQcmVkZWNlc3NvciwKLQkJCQkJCQlwcmVkZWNlc3NvcikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcmVkZWNlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdGlvbiBiYXNpY0dldFByZWRlY2Vzc29yKCkgewotCQlyZXR1cm4gcHJlZGVjZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZGVjZXNzb3IoU2VjdGlvbiBuZXdQcmVkZWNlc3NvcikgewotCQlTZWN0aW9uIG9sZFByZWRlY2Vzc29yID0gcHJlZGVjZXNzb3I7Ci0JCXByZWRlY2Vzc29yID0gbmV3UHJlZGVjZXNzb3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuU0VDVElPTl9fUFJFREVDRVNTT1IsIG9sZFByZWRlY2Vzc29yLAotCQkJCQlwcmVkZWNlc3NvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTlM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRTdWJTZWN0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fTkFNRToKLQkJCXJldHVybiBnZXRTZWN0aW9uTmFtZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9ERVNDUklQVElPTjoKLQkJCXJldHVybiBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OUzoKLQkJCXJldHVybiBnZXRTdWJTZWN0aW9ucygpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fUFJFREVDRVNTT1I6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJlZGVjZXNzb3IoKTsKLQkJCXJldHVybiBiYXNpY0dldFByZWRlY2Vzc29yKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fTkFNRToKLQkJCXNldFNlY3Rpb25OYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT046Ci0JCQlzZXRTZWN0aW9uRGVzY3JpcHRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT05TOgotCQkJZ2V0U3ViU2VjdGlvbnMoKS5jbGVhcigpOwotCQkJZ2V0U3ViU2VjdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1BSRURFQ0VTU09SOgotCQkJc2V0UHJlZGVjZXNzb3IoKFNlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX05BTUU6Ci0JCQlzZXRTZWN0aW9uTmFtZShTRUNUSU9OX05BTUVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9ERVNDUklQVElPTjoKLQkJCXNldFNlY3Rpb25EZXNjcmlwdGlvbihTRUNUSU9OX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OUzoKLQkJCWdldFN1YlNlY3Rpb25zKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1BSRURFQ0VTU09SOgotCQkJc2V0UHJlZGVjZXNzb3IoKFNlY3Rpb24pIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FOgotCQkJcmV0dXJuIFNFQ1RJT05fTkFNRV9FREVGQVVMVCA9PSBudWxsID8gc2VjdGlvbk5hbWUgIT0gbnVsbAotCQkJCQk6ICFTRUNUSU9OX05BTUVfRURFRkFVTFQuZXF1YWxzKHNlY3Rpb25OYW1lKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gU0VDVElPTl9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gc2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwKLQkJCQkJOiAhU0VDVElPTl9ERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoc2VjdGlvbkRlc2NyaXB0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OUzoKLQkJCXJldHVybiBzdWJTZWN0aW9ucyAhPSBudWxsICYmICFzdWJTZWN0aW9ucy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUjoKLQkJCXJldHVybiBwcmVkZWNlc3NvciAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNlY3Rpb25OYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNlY3Rpb25OYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZWN0aW9uRGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc2VjdGlvbkRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vU2VjdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NlbWFudGljTW9kZWxCcmlkZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TZW1hbnRpY01vZGVsQnJpZGdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZWUwNjM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NlbWFudGljTW9kZWxCcmlkZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlbWFudGljTW9kZWxCcmlkZ2VJbXBsI2dldFByZXNlbnRhdGlvbiA8ZW0+UHJlc2VudGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VtYW50aWNNb2RlbEJyaWRnZUltcGwjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VtYW50aWNNb2RlbEJyaWRnZUltcGwjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJbXBsCi0JCWltcGxlbWVudHMgU2VtYW50aWNNb2RlbEJyaWRnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlc2VudGF0aW9uKCkgPGVtPlByZXNlbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRU5UQVRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRhdGlvbigpIDxlbT5QcmVzZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVzZW50YXRpb24gPSBQUkVTRU5UQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VtYW50aWNNb2RlbEJyaWRnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlNFTUFOVElDX01PREVMX0JSSURHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZXNlbnRhdGlvbigpIHsKLQkJcmV0dXJuIHByZXNlbnRhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50YXRpb24oU3RyaW5nIG5ld1ByZXNlbnRhdGlvbikgewotCQlTdHJpbmcgb2xkUHJlc2VudGF0aW9uID0gcHJlc2VudGF0aW9uOwotCQlwcmVzZW50YXRpb24gPSBuZXdQcmVzZW50YXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT04sCi0JCQkJCW9sZFByZXNlbnRhdGlvbiwgcHJlc2VudGF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWxlbWVudCBnZXRHcmFwaEVsZW1lbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoR3JhcGhFbGVtZW50KSBlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWxlbWVudCBiYXNpY0dldEdyYXBoRWxlbWVudCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChHcmFwaEVsZW1lbnQpIGVJbnRlcm5hbENvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgbmV3R3JhcGhFbGVtZW50LAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0dyYXBoRWxlbWVudCwKLQkJCQlVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgbmV3R3JhcGhFbGVtZW50KSB7Ci0JCWlmIChuZXdHcmFwaEVsZW1lbnQgIT0gZUludGVybmFsQ29udGFpbmVyKCkKLQkJCQl8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCAmJiBuZXdHcmFwaEVsZW1lbnQgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCAoRU9iamVjdCkgbmV3R3JhcGhFbGVtZW50KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkJIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0dyYXBoRWxlbWVudCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3R3JhcGhFbGVtZW50KS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTCwKLQkJCQkJCUdyYXBoRWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRHcmFwaEVsZW1lbnQobmV3R3JhcGhFbGVtZW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQsCi0JCQkJCW5ld0dyYXBoRWxlbWVudCwgbmV3R3JhcGhFbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0pCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChEaWFncmFtKSBlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW0gYmFzaWNHZXREaWFncmFtKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKERpYWdyYW0pIGVJbnRlcm5hbENvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldERpYWdyYW0oRGlhZ3JhbSBuZXdEaWFncmFtLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0RpYWdyYW0sCi0JCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0sIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaWFncmFtKERpYWdyYW0gbmV3RGlhZ3JhbSkgewotCQlpZiAobmV3RGlhZ3JhbSAhPSBlSW50ZXJuYWxDb250YWluZXIoKQotCQkJCXx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNICYmIG5ld0RpYWdyYW0gIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCAoRU9iamVjdCkgbmV3RGlhZ3JhbSkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdEaWFncmFtICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdEaWFncmFtKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0UsIERpYWdyYW0uY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RGlhZ3JhbShuZXdEaWFncmFtLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0sIG5ld0RpYWdyYW0sCi0JCQkJCW5ld0RpYWdyYW0pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UOgotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXRHcmFwaEVsZW1lbnQoKEdyYXBoRWxlbWVudCkgb3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOgotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXREaWFncmFtKChEaWFncmFtKSBvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gYmFzaWNTZXRHcmFwaEVsZW1lbnQobnVsbCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU06Ci0JCQlyZXR1cm4gYmFzaWNTZXREaWFncmFtKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UOgotCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwsCi0JCQkJCUdyYXBoRWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU06Ci0JCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0UsIERpYWdyYW0uY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTjoKLQkJCXJldHVybiBnZXRQcmVzZW50YXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRHcmFwaEVsZW1lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldEdyYXBoRWxlbWVudCgpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldERpYWdyYW0oKTsKLQkJCXJldHVybiBiYXNpY0dldERpYWdyYW0oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT046Ci0JCQlzZXRQcmVzZW50YXRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UOgotCQkJc2V0R3JhcGhFbGVtZW50KChHcmFwaEVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTToKLQkJCXNldERpYWdyYW0oKERpYWdyYW0pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTjoKLQkJCXNldFByZXNlbnRhdGlvbihQUkVTRU5UQVRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UOgotCQkJc2V0R3JhcGhFbGVtZW50KChHcmFwaEVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOgotCQkJc2V0RGlhZ3JhbSgoRGlhZ3JhbSkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTjoKLQkJCXJldHVybiBQUkVTRU5UQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHByZXNlbnRhdGlvbiAhPSBudWxsCi0JCQkJCTogIVBSRVNFTlRBVElPTl9FREVGQVVMVC5lcXVhbHMocHJlc2VudGF0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVDoKLQkJCXJldHVybiBiYXNpY0dldEdyYXBoRWxlbWVudCgpICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU06Ci0JCQlyZXR1cm4gYmFzaWNHZXREaWFncmFtKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwcmVzZW50YXRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocHJlc2VudGF0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vU2VtYW50aWNNb2RlbEJyaWRnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhNWEzMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNpbXBsZSBTZW1hbnRpYyBNb2RlbCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsI2dldFR5cGVJbmZvIDxlbT5UeXBlIEluZm88L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwgZXh0ZW5kcyBTZW1hbnRpY01vZGVsQnJpZGdlSW1wbAotCQlpbXBsZW1lbnRzIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlSW5mbygpIDxlbT5UeXBlIEluZm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0lORk9fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVJbmZvKCkgPGVtPlR5cGUgSW5mbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZUluZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZUluZm8gPSBUWVBFX0lORk9fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVJbmZvKCkgewotCQlyZXR1cm4gdHlwZUluZm87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZUluZm8oU3RyaW5nIG5ld1R5cGVJbmZvKSB7Ci0JCVN0cmluZyBvbGRUeXBlSW5mbyA9IHR5cGVJbmZvOwotCQl0eXBlSW5mbyA9IG5ld1R5cGVJbmZvOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19UWVBFX0lORk8sCi0JCQkJCW9sZFR5cGVJbmZvLCB0eXBlSW5mbykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19UWVBFX0lORk86Ci0JCQlyZXR1cm4gZ2V0VHlwZUluZm8oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1RZUEVfSU5GTzoKLQkJCXNldFR5cGVJbmZvKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fVFlQRV9JTkZPOgotCQkJc2V0VHlwZUluZm8oVFlQRV9JTkZPX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19UWVBFX0lORk86Ci0JCQlyZXR1cm4gVFlQRV9JTkZPX0VERUZBVUxUID09IG51bGwgPyB0eXBlSW5mbyAhPSBudWxsCi0JCQkJCTogIVRZUEVfSU5GT19FREVGQVVMVC5lcXVhbHModHlwZUluZm8pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGVJbmZvOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHR5cGVJbmZvKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TdGF0ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1N0YXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDJhNjFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1N0YXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogU3RhdGVJbXBsLmphdmEsdiAxLjUgMjAwNi8wOS8wNyAwMDowNjoyMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlTWFjaGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN0YXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RhdGVJbXBsI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdGF0ZUltcGwjZ2V0UmVnaW9uIDxlbT5SZWdpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdGF0ZUltcGwjZ2V0U3VibWFjaGluZSA8ZW0+U3VibWFjaGluZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0YXRlSW1wbCBleHRlbmRzIFZlcnRleEltcGwgaW1wbGVtZW50cyBTdGF0ZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrUHJvZHVjdCgpIDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB3b3JrUHJvZHVjdCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWdpb24oKSA8ZW0+UmVnaW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZ2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlZ2lvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJtYWNoaW5lKCkgPGVtPlN1Ym1hY2hpbmU8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1Ym1hY2hpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdGF0ZU1hY2hpbmUgc3VibWFjaGluZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RhdGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5TVEFURTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXb3JrUHJvZHVjdCgpIHsKLQkJaWYgKHdvcmtQcm9kdWN0ID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChXb3JrUHJvZHVjdC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5TVEFURV9fV09SS19QUk9EVUNUKTsKLQkJfQotCQlyZXR1cm4gd29ya1Byb2R1Y3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVnaW9uKCkgewotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJlZ2lvbiA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0LlJlc29sdmluZygKLQkJCQkJUmVnaW9uLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlNUQVRFX19SRUdJT04sCi0JCQkJCVVtYVBhY2thZ2UuUkVHSU9OX19TVEFURSk7Ci0JCX0KLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RhdGVNYWNoaW5lIGdldFN1Ym1hY2hpbmUoKSB7Ci0JCWlmIChzdWJtYWNoaW5lICE9IG51bGwgJiYgKChFT2JqZWN0KSBzdWJtYWNoaW5lKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkU3VibWFjaGluZSA9IChJbnRlcm5hbEVPYmplY3QpIHN1Ym1hY2hpbmU7Ci0JCQlzdWJtYWNoaW5lID0gKFN0YXRlTWFjaGluZSkgZVJlc29sdmVQcm94eShvbGRTdWJtYWNoaW5lKTsKLQkJCWlmIChzdWJtYWNoaW5lICE9IG9sZFN1Ym1hY2hpbmUpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuU1RBVEVfX1NVQk1BQ0hJTkUsIG9sZFN1Ym1hY2hpbmUsCi0JCQkJCQkJc3VibWFjaGluZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdWJtYWNoaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdGF0ZU1hY2hpbmUgYmFzaWNHZXRTdWJtYWNoaW5lKCkgewotCQlyZXR1cm4gc3VibWFjaGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdWJtYWNoaW5lKFN0YXRlTWFjaGluZSBuZXdTdWJtYWNoaW5lKSB7Ci0JCVN0YXRlTWFjaGluZSBvbGRTdWJtYWNoaW5lID0gc3VibWFjaGluZTsKLQkJc3VibWFjaGluZSA9IG5ld1N1Ym1hY2hpbmU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuU1RBVEVfX1NVQk1BQ0hJTkUsIG9sZFN1Ym1hY2hpbmUsIHN1Ym1hY2hpbmUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU1RBVEVfX1JFR0lPTjoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldFJlZ2lvbigpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEFURV9fUkVHSU9OOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0UmVnaW9uKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU1RBVEVfX1dPUktfUFJPRFVDVDoKLQkJCXJldHVybiBnZXRXb3JrUHJvZHVjdCgpOwotCQljYXNlIFVtYVBhY2thZ2UuU1RBVEVfX1JFR0lPTjoKLQkJCXJldHVybiBnZXRSZWdpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNUQVRFX19TVUJNQUNISU5FOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFN1Ym1hY2hpbmUoKTsKLQkJCXJldHVybiBiYXNpY0dldFN1Ym1hY2hpbmUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU1RBVEVfX1dPUktfUFJPRFVDVDoKLQkJCWdldFdvcmtQcm9kdWN0KCkuY2xlYXIoKTsKLQkJCWdldFdvcmtQcm9kdWN0KCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEFURV9fUkVHSU9OOgotCQkJZ2V0UmVnaW9uKCkuY2xlYXIoKTsKLQkJCWdldFJlZ2lvbigpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU1RBVEVfX1NVQk1BQ0hJTkU6Ci0JCQlzZXRTdWJtYWNoaW5lKChTdGF0ZU1hY2hpbmUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEFURV9fV09SS19QUk9EVUNUOgotCQkJZ2V0V29ya1Byb2R1Y3QoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU1RBVEVfX1JFR0lPTjoKLQkJCWdldFJlZ2lvbigpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEFURV9fU1VCTUFDSElORToKLQkJCXNldFN1Ym1hY2hpbmUoKFN0YXRlTWFjaGluZSkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEFURV9fV09SS19QUk9EVUNUOgotCQkJcmV0dXJuIHdvcmtQcm9kdWN0ICE9IG51bGwgJiYgIXdvcmtQcm9kdWN0LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNUQVRFX19SRUdJT046Ci0JCQlyZXR1cm4gcmVnaW9uICE9IG51bGwgJiYgIXJlZ2lvbi5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEFURV9fU1VCTUFDSElORToKLQkJCXJldHVybiBzdWJtYWNoaW5lICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1N0YXRlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1N0YXRlTWFjaGluZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1N0YXRlTWFjaGluZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGIwMTRlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TdGF0ZU1hY2hpbmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBTdGF0ZU1hY2hpbmVJbXBsLmphdmEsdiAxLjUgMjAwNi8wOS8wNyAwMDowNjoyMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGVNYWNoaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN0YXRlIE1hY2hpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdGF0ZU1hY2hpbmVJbXBsI2dldFJlZ2lvbiA8ZW0+UmVnaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RhdGVNYWNoaW5lSW1wbCBleHRlbmRzIFdvcmtEZWZpbml0aW9uSW1wbCBpbXBsZW1lbnRzCi0JCVN0YXRlTWFjaGluZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWdpb24oKSA8ZW0+UmVnaW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZ2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlZ2lvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RhdGVNYWNoaW5lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuU1RBVEVfTUFDSElORTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWdpb24oKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmVnaW9uID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QuUmVzb2x2aW5nKAotCQkJCQlSZWdpb24uY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuU1RBVEVfTUFDSElORV9fUkVHSU9OLAotCQkJCQlVbWFQYWNrYWdlLlJFR0lPTl9fU1RBVEVfTUFDSElORSk7Ci0JCX0KLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU1RBVEVfTUFDSElORV9fUkVHSU9OOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0UmVnaW9uKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNUQVRFX01BQ0hJTkVfX1JFR0lPTjoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldFJlZ2lvbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNUQVRFX01BQ0hJTkVfX1JFR0lPTjoKLQkJCXJldHVybiBnZXRSZWdpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU1RBVEVfTUFDSElORV9fUkVHSU9OOgotCQkJZ2V0UmVnaW9uKCkuY2xlYXIoKTsKLQkJCWdldFJlZ2lvbigpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNUQVRFX01BQ0hJTkVfX1JFR0lPTjoKLQkJCWdldFJlZ2lvbigpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEFURV9NQUNISU5FX19SRUdJT046Ci0JCQlyZXR1cm4gcmVnaW9uICE9IG51bGwgJiYgIXJlZ2lvbi5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1N0YXRlTWFjaGluZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TdGVwSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU3RlcEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODA4NzZlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TdGVwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RlcDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0ZXBJbXBsI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RlcEltcGwjZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0ZXBJbXBsIGV4dGVuZHMgU2VjdGlvbkltcGwgaW1wbGVtZW50cyBTdGVwIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNvbmRpdGlvbigpIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnQgcHJlY29uZGl0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3Rjb25kaXRpb24oKSA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnQgcG9zdGNvbmRpdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RlcEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlNURVA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgZ2V0UHJlY29uZGl0aW9uKCkgewotCQlpZiAocHJlY29uZGl0aW9uICE9IG51bGwgJiYgKChFT2JqZWN0KSBwcmVjb25kaXRpb24pLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQcmVjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb247Ci0JCQlwcmVjb25kaXRpb24gPSAoQ29uc3RyYWludCkgZVJlc29sdmVQcm94eShvbGRQcmVjb25kaXRpb24pOwotCQkJaWYgKHByZWNvbmRpdGlvbiAhPSBvbGRQcmVjb25kaXRpb24pIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3UHJlY29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcHJlY29uZGl0aW9uOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQcmVjb25kaXRpb24uZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTiwKLQkJCQkJCW51bGwsIG51bGwpOwotCQkJCWlmIChuZXdQcmVjb25kaXRpb24uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3UHJlY29uZGl0aW9uCi0JCQkJCQkJLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJCS0gVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT04sIG51bGwsIG1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTiwgb2xkUHJlY29uZGl0aW9uLAotCQkJCQkJCXByZWNvbmRpdGlvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcmVjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgYmFzaWNHZXRQcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwcmVjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJlY29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UHJlY29uZGl0aW9uLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlDb25zdHJhaW50IG9sZFByZWNvbmRpdGlvbiA9IHByZWNvbmRpdGlvbjsKLQkJcHJlY29uZGl0aW9uID0gbmV3UHJlY29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTiwKLQkJCQkJb2xkUHJlY29uZGl0aW9uLCBuZXdQcmVjb25kaXRpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlY29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UHJlY29uZGl0aW9uKSB7Ci0JCWlmIChuZXdQcmVjb25kaXRpb24gIT0gcHJlY29uZGl0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcmVjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByZWNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UHJlY29uZGl0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcmVjb25kaXRpb24obmV3UHJlY29uZGl0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT04sIG5ld1ByZWNvbmRpdGlvbiwKLQkJCQkJbmV3UHJlY29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgZ2V0UG9zdGNvbmRpdGlvbigpIHsKLQkJaWYgKHBvc3Rjb25kaXRpb24gIT0gbnVsbCAmJiAoKEVPYmplY3QpIHBvc3Rjb25kaXRpb24pLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQb3N0Y29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcG9zdGNvbmRpdGlvbjsKLQkJCXBvc3Rjb25kaXRpb24gPSAoQ29uc3RyYWludCkgZVJlc29sdmVQcm94eShvbGRQb3N0Y29uZGl0aW9uKTsKLQkJCWlmIChwb3N0Y29uZGl0aW9uICE9IG9sZFBvc3Rjb25kaXRpb24pIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3UG9zdGNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb247Ci0JCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFBvc3Rjb25kaXRpb24KLQkJCQkJCS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OLCBudWxsLCBudWxsKTsKLQkJCQlpZiAobmV3UG9zdGNvbmRpdGlvbi5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdQb3N0Y29uZGl0aW9uLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJLSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT04sIG51bGwsCi0JCQkJCQkJbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTiwgb2xkUG9zdGNvbmRpdGlvbiwKLQkJCQkJCQlwb3N0Y29uZGl0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBvc3Rjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgYmFzaWNHZXRQb3N0Y29uZGl0aW9uKCkgewotCQlyZXR1cm4gcG9zdGNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UG9zdGNvbmRpdGlvbiwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ29uc3RyYWludCBvbGRQb3N0Y29uZGl0aW9uID0gcG9zdGNvbmRpdGlvbjsKLQkJcG9zdGNvbmRpdGlvbiA9IG5ld1Bvc3Rjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTiwKLQkJCQkJb2xkUG9zdGNvbmRpdGlvbiwgbmV3UG9zdGNvbmRpdGlvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3N0Y29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UG9zdGNvbmRpdGlvbikgewotCQlpZiAobmV3UG9zdGNvbmRpdGlvbiAhPSBwb3N0Y29uZGl0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwb3N0Y29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwb3N0Y29uZGl0aW9uKQotCQkJCQkJLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT04sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1Bvc3Rjb25kaXRpb24pCi0JCQkJCQkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKG5ld1Bvc3Rjb25kaXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT04sIG5ld1Bvc3Rjb25kaXRpb24sCi0JCQkJCW5ld1Bvc3Rjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OOgotCQkJcmV0dXJuIGJhc2ljU2V0UHJlY29uZGl0aW9uKG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFBvc3Rjb25kaXRpb24obnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQcmVjb25kaXRpb24oKTsKLQkJCXJldHVybiBiYXNpY0dldFByZWNvbmRpdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTjoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQb3N0Y29uZGl0aW9uKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQb3N0Y29uZGl0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjoKLQkJCXNldFByZWNvbmRpdGlvbigoQ29uc3RyYWludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTjoKLQkJCXNldFBvc3Rjb25kaXRpb24oKENvbnN0cmFpbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT046Ci0JCQlzZXRQcmVjb25kaXRpb24oKENvbnN0cmFpbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTjoKLQkJCXNldFBvc3Rjb25kaXRpb24oKENvbnN0cmFpbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OOgotCQkJcmV0dXJuIHByZWNvbmRpdGlvbiAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTjoKLQkJCXJldHVybiBwb3N0Y29uZGl0aW9uICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBXb3JrRGVmaW5pdGlvbi5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBXb3JrRGVmaW5pdGlvbi5jbGFzcykgewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotfSAvL1N0ZXBJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhNTdkYTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU3VwcG9ydGluZ01hdGVyaWFsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3VwcG9ydGluZ01hdGVyaWFsSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzCi0JCVN1cHBvcnRpbmdNYXRlcmlhbCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3VwcG9ydGluZ01hdGVyaWFsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuU1VQUE9SVElOR19NQVRFUklBTDsKLQl9Ci0KLX0gLy9TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UYXNrRGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UYXNrRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1MGIzYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGFza0Rlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzayBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdGlvbkltcGwjZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdGlvbkltcGwjZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzCi0JCVRhc2tEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQVVJQT1NFX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVycG9zZSA9IFBVUlBPU0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWx0ZXJuYXRpdmVzKCkgPGVtPkFsdGVybmF0aXZlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRFUk5BVElWRVNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdGVybmF0aXZlcygpIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhbHRlcm5hdGl2ZXMgPSBBTFRFUk5BVElWRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza0Rlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1cnBvc2UoKSB7Ci0JCXJldHVybiBwdXJwb3NlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1cnBvc2UoU3RyaW5nIG5ld1B1cnBvc2UpIHsKLQkJU3RyaW5nIG9sZFB1cnBvc2UgPSBwdXJwb3NlOwotCQlwdXJwb3NlID0gbmV3UHVycG9zZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFLCBvbGRQdXJwb3NlLCBwdXJwb3NlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbHRlcm5hdGl2ZXMoKSB7Ci0JCXJldHVybiBhbHRlcm5hdGl2ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWx0ZXJuYXRpdmVzKFN0cmluZyBuZXdBbHRlcm5hdGl2ZXMpIHsKLQkJU3RyaW5nIG9sZEFsdGVybmF0aXZlcyA9IGFsdGVybmF0aXZlczsKLQkJYWx0ZXJuYXRpdmVzID0gbmV3QWx0ZXJuYXRpdmVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUywgb2xkQWx0ZXJuYXRpdmVzLAotCQkJCQlhbHRlcm5hdGl2ZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJcmV0dXJuIGdldFB1cnBvc2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCXJldHVybiBnZXRBbHRlcm5hdGl2ZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXNldFB1cnBvc2UoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJc2V0QWx0ZXJuYXRpdmVzKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJc2V0UHVycG9zZShQVVJQT1NFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCXNldEFsdGVybmF0aXZlcyhBTFRFUk5BVElWRVNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXJldHVybiBQVVJQT1NFX0VERUZBVUxUID09IG51bGwgPyBwdXJwb3NlICE9IG51bGwKLQkJCQkJOiAhUFVSUE9TRV9FREVGQVVMVC5lcXVhbHMocHVycG9zZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQlyZXR1cm4gQUxURVJOQVRJVkVTX0VERUZBVUxUID09IG51bGwgPyBhbHRlcm5hdGl2ZXMgIT0gbnVsbAotCQkJCQk6ICFBTFRFUk5BVElWRVNfRURFRkFVTFQuZXF1YWxzKGFsdGVybmF0aXZlcyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHVycG9zZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwdXJwb3NlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhbHRlcm5hdGl2ZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYWx0ZXJuYXRpdmVzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVGFza0Rlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGFza0Rlc2NyaXB0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UYXNrRGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2Q0YmY0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UYXNrRGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzayBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldFRhc2sgPGVtPlRhc2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0QXNzaXN0ZWRCeSA8ZW0+QXNzaXN0ZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0RXh0ZXJuYWxJbnB1dCA8ZW0+RXh0ZXJuYWwgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSA8ZW0+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRTZWxlY3RlZFN0ZXBzIDxlbT5TZWxlY3RlZCBTdGVwczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdG9ySW1wbCBleHRlbmRzIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVRhc2tEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NDE5NDE0NjY0MjczOTEwODYzTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQgPSBCb29sZWFuLlRSVUU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhc2soKSA8ZW0+VGFzazwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2sgdGFzayA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpIDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzaXN0ZWRCeSgpIDxlbT5Bc3Npc3RlZCBCeTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBc3Npc3RlZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYXNzaXN0ZWRCeSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbElucHV0KCkgPGVtPkV4dGVybmFsIElucHV0PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsSW5wdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBleHRlcm5hbElucHV0ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hbmRhdG9yeUlucHV0KCkgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYW5kYXRvcnlJbnB1dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1hbmRhdG9yeUlucHV0ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9wdGlvbmFsSW5wdXQoKSA8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3B0aW9uYWxJbnB1dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG9wdGlvbmFsSW5wdXQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3V0cHV0KCkgPGVtPk91dHB1dDwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRwdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBvdXRwdXQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSA8ZW0+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlRGVzY3JpcHRvciBwZXJmb3JtZWRQcmltYXJpbHlCeSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWxlY3RlZFN0ZXBzKCkgPGVtPlNlbGVjdGVkIFN0ZXBzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlbGVjdGVkU3RlcHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZWxlY3RlZFN0ZXBzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrRGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSB7Ci0JCXJldHVybiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKEJvb2xlYW4gbmV3SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKSB7Ci0JCUJvb2xlYW4gb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCQlpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBuZXdJc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UsCi0JCQkJCW9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSwgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2sgZ2V0VGFzaygpIHsKLQkJaWYgKHRhc2sgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHRhc2spLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRUYXNrID0gKEludGVybmFsRU9iamVjdCkgdGFzazsKLQkJCXRhc2sgPSAoVGFzaykgZVJlc29sdmVQcm94eShvbGRUYXNrKTsKLQkJCWlmICh0YXNrICE9IG9sZFRhc2spIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLLCBvbGRUYXNrLCB0YXNrKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2sgYmFzaWNHZXRUYXNrKCkgewotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXNrKFRhc2sgbmV3VGFzaykgewotCQlUYXNrIG9sZFRhc2sgPSB0YXNrOwotCQl0YXNrID0gbmV3VGFzazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0ssIG9sZFRhc2ssIHRhc2spKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpIHsKLQkJaWYgKGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5ID09IG51bGwpIHsKLQkJCWFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdCgKLQkJCQkJUm9sZURlc2NyaXB0b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZKTsKLQkJfQotCQlyZXR1cm4gYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXNzaXN0ZWRCeSgpIHsKLQkJaWYgKGFzc2lzdGVkQnkgPT0gbnVsbCkgewotCQkJYXNzaXN0ZWRCeSA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoUm9sZURlc2NyaXB0b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWSk7Ci0JCX0KLQkJcmV0dXJuIGFzc2lzdGVkQnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RXh0ZXJuYWxJbnB1dCgpIHsKLQkJaWYgKGV4dGVybmFsSW5wdXQgPT0gbnVsbCkgewotCQkJZXh0ZXJuYWxJbnB1dCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUKTsKLQkJfQotCQlyZXR1cm4gZXh0ZXJuYWxJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNYW5kYXRvcnlJbnB1dCgpIHsKLQkJaWYgKG1hbmRhdG9yeUlucHV0ID09IG51bGwpIHsKLQkJCW1hbmRhdG9yeUlucHV0ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdCgKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUKTsKLQkJfQotCQlyZXR1cm4gbWFuZGF0b3J5SW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0T3B0aW9uYWxJbnB1dCgpIHsKLQkJaWYgKG9wdGlvbmFsSW5wdXQgPT0gbnVsbCkgewotCQkJb3B0aW9uYWxJbnB1dCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUKTsKLQkJfQotCQlyZXR1cm4gb3B0aW9uYWxJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRPdXRwdXQoKSB7Ci0JCWlmIChvdXRwdXQgPT0gbnVsbCkgewotCQkJb3V0cHV0ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQpOwotCQl9Ci0JCXJldHVybiBvdXRwdXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdG9yIGdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkgewotCQlpZiAocGVyZm9ybWVkUHJpbWFyaWx5QnkgIT0gbnVsbAotCQkJCSYmICgoRU9iamVjdCkgcGVyZm9ybWVkUHJpbWFyaWx5QnkpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQZXJmb3JtZWRQcmltYXJpbHlCeSA9IChJbnRlcm5hbEVPYmplY3QpIHBlcmZvcm1lZFByaW1hcmlseUJ5OwotCQkJcGVyZm9ybWVkUHJpbWFyaWx5QnkgPSAoUm9sZURlc2NyaXB0b3IpIGVSZXNvbHZlUHJveHkob2xkUGVyZm9ybWVkUHJpbWFyaWx5QnkpOwotCQkJaWYgKHBlcmZvcm1lZFByaW1hcmlseUJ5ICE9IG9sZFBlcmZvcm1lZFByaW1hcmlseUJ5KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSwKLQkJCQkJCQlvbGRQZXJmb3JtZWRQcmltYXJpbHlCeSwgcGVyZm9ybWVkUHJpbWFyaWx5QnkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGVyZm9ybWVkUHJpbWFyaWx5Qnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdG9yIGJhc2ljR2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSB7Ci0JCXJldHVybiBwZXJmb3JtZWRQcmltYXJpbHlCeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZXJmb3JtZWRQcmltYXJpbHlCeShSb2xlRGVzY3JpcHRvciBuZXdQZXJmb3JtZWRQcmltYXJpbHlCeSkgewotCQlSb2xlRGVzY3JpcHRvciBvbGRQZXJmb3JtZWRQcmltYXJpbHlCeSA9IHBlcmZvcm1lZFByaW1hcmlseUJ5OwotCQlwZXJmb3JtZWRQcmltYXJpbHlCeSA9IG5ld1BlcmZvcm1lZFByaW1hcmlseUJ5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSwKLQkJCQkJb2xkUGVyZm9ybWVkUHJpbWFyaWx5QnksIHBlcmZvcm1lZFByaW1hcmlseUJ5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VsZWN0ZWRTdGVwcygpIHsKLQkJaWYgKHNlbGVjdGVkU3RlcHMgPT0gbnVsbCkgewotCQkJc2VsZWN0ZWRTdGVwcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoU2VjdGlvbi5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1NFTEVDVEVEX1NURVBTKTsKLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWRTdGVwczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCXJldHVybiBnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSzoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRUYXNrKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRUYXNrKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQlyZXR1cm4gZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQlyZXR1cm4gZ2V0QXNzaXN0ZWRCeSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJCXJldHVybiBnZXRFeHRlcm5hbElucHV0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCXJldHVybiBnZXRNYW5kYXRvcnlJbnB1dCgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCXJldHVybiBnZXRPcHRpb25hbElucHV0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCXJldHVybiBnZXRPdXRwdXQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCQkJcmV0dXJuIGJhc2ljR2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fU0VMRUNURURfU1RFUFM6Ci0JCQlyZXR1cm4gZ2V0U2VsZWN0ZWRTdGVwcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCXNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJc2V0VGFzaygoVGFzaykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5jbGVhcigpOwotCQkJZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQlnZXRBc3Npc3RlZEJ5KCkuY2xlYXIoKTsKLQkJCWdldEFzc2lzdGVkQnkoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQlnZXRFeHRlcm5hbElucHV0KCkuY2xlYXIoKTsKLQkJCWdldEV4dGVybmFsSW5wdXQoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5jbGVhcigpOwotCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQ6Ci0JCQlnZXRPcHRpb25hbElucHV0KCkuY2xlYXIoKTsKLQkJCWdldE9wdGlvbmFsSW5wdXQoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotCQkJZ2V0T3V0cHV0KCkuY2xlYXIoKTsKLQkJCWdldE91dHB1dCgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotCQkJc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKFJvbGVEZXNjcmlwdG9yKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1NFTEVDVEVEX1NURVBTOgotCQkJZ2V0U2VsZWN0ZWRTdGVwcygpLmNsZWFyKCk7Ci0JCQlnZXRTZWxlY3RlZFN0ZXBzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQlzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSzoKLQkJCXNldFRhc2soKFRhc2spIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWToKLQkJCWdldEFzc2lzdGVkQnkoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJCWdldEV4dGVybmFsSW5wdXQoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQlnZXRNYW5kYXRvcnlJbnB1dCgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJZ2V0T3B0aW9uYWxJbnB1dCgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCWdldE91dHB1dCgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0JCQlzZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgoUm9sZURlc2NyaXB0b3IpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TRUxFQ1RFRF9TVEVQUzoKLQkJCWdldFNlbGVjdGVkU3RlcHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQlyZXR1cm4gSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUID09IG51bGwgPyBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgIT0gbnVsbAotCQkJCQk6ICFJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0s6Ci0JCQlyZXR1cm4gdGFzayAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJcmV0dXJuIGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5ICE9IG51bGwKLQkJCQkJJiYgIWFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQlyZXR1cm4gYXNzaXN0ZWRCeSAhPSBudWxsICYmICFhc3Npc3RlZEJ5LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQlyZXR1cm4gZXh0ZXJuYWxJbnB1dCAhPSBudWxsICYmICFleHRlcm5hbElucHV0LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJcmV0dXJuIG1hbmRhdG9yeUlucHV0ICE9IG51bGwgJiYgIW1hbmRhdG9yeUlucHV0LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQ6Ci0JCQlyZXR1cm4gb3B0aW9uYWxJbnB1dCAhPSBudWxsICYmICFvcHRpb25hbElucHV0LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotCQkJcmV0dXJuIG91dHB1dCAhPSBudWxsICYmICFvdXRwdXQuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotCQkJcmV0dXJuIHBlcmZvcm1lZFByaW1hcmlseUJ5ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1NFTEVDVEVEX1NURVBTOgotCQkJcmV0dXJuIHNlbGVjdGVkU3RlcHMgIT0gbnVsbCAmJiAhc2VsZWN0ZWRTdGVwcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBEZXNjcmlwdG9yLmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IERlc2NyaXB0b3IuY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRTsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvLyBCZWdpbiBvZiBjdXN0b20gY29kZSAKLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdCNnZXRGZWF0dXJlc1dpdGhPdmVycmlkZW5EZWZhdWxWYWx1ZSgpCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0RmVhdHVyZXNXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gZmVhdHVyZXNXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdCNnZXREZWZhdWx0VmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlKSkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19QTEFOTkVEOgotCQkJcmV0dXJuIElTX1BMQU5ORURfREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIGZlYXR1cmVzV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZSA9IENvbGxlY3Rpb25zCi0JCQkuc2luZ2xldG9uKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCkpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX1BMQU5ORURfREVGQVVMVCA9IEJvb2xlYW4uRkFMU0U7Ci0KLX0gLy9UYXNrRGVzY3JpcHRvckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rhc2tJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UYXNrSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZTc4ZGI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rhc2tJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbCNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbCNnZXRQZXJmb3JtZWRCeSA8ZW0+UGVyZm9ybWVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbCNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsI2dldFN0ZXBzIDxlbT5TdGVwczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsI2dldFRvb2xNZW50b3JzIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrSW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRhc2sgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29uc3RyYWludCBwcmVjb25kaXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29uc3RyYWludCBwb3N0Y29uZGl0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmZvcm1lZEJ5KCkgPGVtPlBlcmZvcm1lZCBCeTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyZm9ybWVkQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlIHBlcmZvcm1lZEJ5ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hbmRhdG9yeUlucHV0KCkgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYW5kYXRvcnlJbnB1dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1hbmRhdG9yeUlucHV0ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dHB1dCgpIDxlbT5PdXRwdXQ8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3V0cHV0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgb3V0cHV0ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcHRpb25hbElucHV0KCkgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9wdGlvbmFsSW5wdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBvcHRpb25hbElucHV0ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvb2xNZW50b3JzKCkgPGVtPlRvb2wgTWVudG9yczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb29sTWVudG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRvb2xNZW50b3JzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgZ2V0UHJlY29uZGl0aW9uKCkgewotCQlpZiAocHJlY29uZGl0aW9uICE9IG51bGwgJiYgKChFT2JqZWN0KSBwcmVjb25kaXRpb24pLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQcmVjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb247Ci0JCQlwcmVjb25kaXRpb24gPSAoQ29uc3RyYWludCkgZVJlc29sdmVQcm94eShvbGRQcmVjb25kaXRpb24pOwotCQkJaWYgKHByZWNvbmRpdGlvbiAhPSBvbGRQcmVjb25kaXRpb24pIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3UHJlY29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcHJlY29uZGl0aW9uOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQcmVjb25kaXRpb24uZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTiwKLQkJCQkJCW51bGwsIG51bGwpOwotCQkJCWlmIChuZXdQcmVjb25kaXRpb24uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3UHJlY29uZGl0aW9uCi0JCQkJCQkJLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJCS0gVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT04sIG51bGwsIG1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTiwgb2xkUHJlY29uZGl0aW9uLAotCQkJCQkJCXByZWNvbmRpdGlvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcmVjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgYmFzaWNHZXRQcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwcmVjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJlY29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UHJlY29uZGl0aW9uLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlDb25zdHJhaW50IG9sZFByZWNvbmRpdGlvbiA9IHByZWNvbmRpdGlvbjsKLQkJcHJlY29uZGl0aW9uID0gbmV3UHJlY29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTiwKLQkJCQkJb2xkUHJlY29uZGl0aW9uLCBuZXdQcmVjb25kaXRpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlY29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UHJlY29uZGl0aW9uKSB7Ci0JCWlmIChuZXdQcmVjb25kaXRpb24gIT0gcHJlY29uZGl0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcmVjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByZWNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UHJlY29uZGl0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcmVjb25kaXRpb24obmV3UHJlY29uZGl0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT04sIG5ld1ByZWNvbmRpdGlvbiwKLQkJCQkJbmV3UHJlY29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgZ2V0UG9zdGNvbmRpdGlvbigpIHsKLQkJaWYgKHBvc3Rjb25kaXRpb24gIT0gbnVsbCAmJiAoKEVPYmplY3QpIHBvc3Rjb25kaXRpb24pLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQb3N0Y29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcG9zdGNvbmRpdGlvbjsKLQkJCXBvc3Rjb25kaXRpb24gPSAoQ29uc3RyYWludCkgZVJlc29sdmVQcm94eShvbGRQb3N0Y29uZGl0aW9uKTsKLQkJCWlmIChwb3N0Y29uZGl0aW9uICE9IG9sZFBvc3Rjb25kaXRpb24pIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3UG9zdGNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb247Ci0JCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFBvc3Rjb25kaXRpb24KLQkJCQkJCS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OLCBudWxsLCBudWxsKTsKLQkJCQlpZiAobmV3UG9zdGNvbmRpdGlvbi5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdQb3N0Y29uZGl0aW9uLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJLSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT04sIG51bGwsCi0JCQkJCQkJbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTiwgb2xkUG9zdGNvbmRpdGlvbiwKLQkJCQkJCQlwb3N0Y29uZGl0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBvc3Rjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgYmFzaWNHZXRQb3N0Y29uZGl0aW9uKCkgewotCQlyZXR1cm4gcG9zdGNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UG9zdGNvbmRpdGlvbiwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ29uc3RyYWludCBvbGRQb3N0Y29uZGl0aW9uID0gcG9zdGNvbmRpdGlvbjsKLQkJcG9zdGNvbmRpdGlvbiA9IG5ld1Bvc3Rjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTiwKLQkJCQkJb2xkUG9zdGNvbmRpdGlvbiwgbmV3UG9zdGNvbmRpdGlvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3N0Y29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UG9zdGNvbmRpdGlvbikgewotCQlpZiAobmV3UG9zdGNvbmRpdGlvbiAhPSBwb3N0Y29uZGl0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwb3N0Y29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwb3N0Y29uZGl0aW9uKQotCQkJCQkJLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT04sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1Bvc3Rjb25kaXRpb24pCi0JCQkJCQkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKG5ld1Bvc3Rjb25kaXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT04sIG5ld1Bvc3Rjb25kaXRpb24sCi0JCQkJCW5ld1Bvc3Rjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZSBnZXRQZXJmb3JtZWRCeSgpIHsKLQkJaWYgKHBlcmZvcm1lZEJ5ICE9IG51bGwgJiYgKChFT2JqZWN0KSBwZXJmb3JtZWRCeSkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFBlcmZvcm1lZEJ5ID0gKEludGVybmFsRU9iamVjdCkgcGVyZm9ybWVkQnk7Ci0JCQlwZXJmb3JtZWRCeSA9IChSb2xlKSBlUmVzb2x2ZVByb3h5KG9sZFBlcmZvcm1lZEJ5KTsKLQkJCWlmIChwZXJmb3JtZWRCeSAhPSBvbGRQZXJmb3JtZWRCeSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5UQVNLX19QRVJGT1JNRURfQlksIG9sZFBlcmZvcm1lZEJ5LAotCQkJCQkJCXBlcmZvcm1lZEJ5KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBlcmZvcm1lZEJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlIGJhc2ljR2V0UGVyZm9ybWVkQnkoKSB7Ci0JCXJldHVybiBwZXJmb3JtZWRCeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZXJmb3JtZWRCeShSb2xlIG5ld1BlcmZvcm1lZEJ5KSB7Ci0JCVJvbGUgb2xkUGVyZm9ybWVkQnkgPSBwZXJmb3JtZWRCeTsKLQkJcGVyZm9ybWVkQnkgPSBuZXdQZXJmb3JtZWRCeTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5UQVNLX19QRVJGT1JNRURfQlksIG9sZFBlcmZvcm1lZEJ5LCBwZXJmb3JtZWRCeSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1hbmRhdG9yeUlucHV0KCkgewotCQlpZiAobWFuZGF0b3J5SW5wdXQgPT0gbnVsbCkgewotCQkJbWFuZGF0b3J5SW5wdXQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KFdvcmtQcm9kdWN0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfX01BTkRBVE9SWV9JTlBVVCk7Ci0JCX0KLQkJcmV0dXJuIG1hbmRhdG9yeUlucHV0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE91dHB1dCgpIHsKLQkJaWYgKG91dHB1dCA9PSBudWxsKSB7Ci0JCQlvdXRwdXQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KFdvcmtQcm9kdWN0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfX09VVFBVVCk7Ci0JCX0KLQkJcmV0dXJuIG91dHB1dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpIHsKLQkJaWYgKGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5ID09IG51bGwpIHsKLQkJCWFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChSb2xlLmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLlRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkpOwotCQl9Ci0JCXJldHVybiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRPcHRpb25hbElucHV0KCkgewotCQlpZiAob3B0aW9uYWxJbnB1dCA9PSBudWxsKSB7Ci0JCQlvcHRpb25hbElucHV0ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChXb3JrUHJvZHVjdC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX19PUFRJT05BTF9JTlBVVCk7Ci0JCX0KLQkJcmV0dXJuIG9wdGlvbmFsSW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTdGVwcygpIHsKLQkJcmV0dXJuIGdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0VG9vbE1lbnRvcnMoKSB7Ci0JCWlmICh0b29sTWVudG9ycyA9PSBudWxsKSB7Ci0JCQl0b29sTWVudG9ycyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoVG9vbE1lbnRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX19UT09MX01FTlRPUlMpOwotCQl9Ci0JCXJldHVybiB0b29sTWVudG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCWlmIChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPT0gbnVsbCkgewotCQkJZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdCgKLQkJCQkJRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCQl9Ci0JCXJldHVybiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFByZWNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQlyZXR1cm4gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJlY29uZGl0aW9uKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQcmVjb25kaXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UG9zdGNvbmRpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUEVSRk9STUVEX0JZOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFBlcmZvcm1lZEJ5KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQZXJmb3JtZWRCeSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fTUFOREFUT1JZX0lOUFVUOgotCQkJcmV0dXJuIGdldE1hbmRhdG9yeUlucHV0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PVVRQVVQ6Ci0JCQlyZXR1cm4gZ2V0T3V0cHV0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJcmV0dXJuIGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PUFRJT05BTF9JTlBVVDoKLQkJCXJldHVybiBnZXRPcHRpb25hbElucHV0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19TVEVQUzoKLQkJCXJldHVybiBnZXRTdGVwcygpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1JTOgotCQkJcmV0dXJuIGdldFRvb2xNZW50b3JzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJcmV0dXJuIGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQlzZXRQcmVjb25kaXRpb24oKENvbnN0cmFpbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQlzZXRQb3N0Y29uZGl0aW9uKChDb25zdHJhaW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QRVJGT1JNRURfQlk6Ci0JCQlzZXRQZXJmb3JtZWRCeSgoUm9sZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fTUFOREFUT1JZX0lOUFVUOgotCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5jbGVhcigpOwotCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVDoKLQkJCWdldE91dHB1dCgpLmNsZWFyKCk7Ci0JCQlnZXRPdXRwdXQoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQlnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmNsZWFyKCk7Ci0JCQlnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1BUSU9OQUxfSU5QVVQ6Ci0JCQlnZXRPcHRpb25hbElucHV0KCkuY2xlYXIoKTsKLQkJCWdldE9wdGlvbmFsSW5wdXQoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1RPT0xfTUVOVE9SUzoKLQkJCWdldFRvb2xNZW50b3JzKCkuY2xlYXIoKTsKLQkJCWdldFRvb2xNZW50b3JzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjoKLQkJCXNldFByZWNvbmRpdGlvbigoQ29uc3RyYWludCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOgotCQkJc2V0UG9zdGNvbmRpdGlvbigoQ29uc3RyYWludCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QRVJGT1JNRURfQlk6Ci0JCQlzZXRQZXJmb3JtZWRCeSgoUm9sZSkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQlnZXRNYW5kYXRvcnlJbnB1dCgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PVVRQVVQ6Ci0JCQlnZXRPdXRwdXQoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUOgotCQkJZ2V0T3B0aW9uYWxJbnB1dCgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19UT09MX01FTlRPUlM6Ci0JCQlnZXRUb29sTWVudG9ycygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBwcmVjb25kaXRpb24gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQlyZXR1cm4gcG9zdGNvbmRpdGlvbiAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUEVSRk9STUVEX0JZOgotCQkJcmV0dXJuIHBlcmZvcm1lZEJ5ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQlyZXR1cm4gbWFuZGF0b3J5SW5wdXQgIT0gbnVsbCAmJiAhbWFuZGF0b3J5SW5wdXQuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1VUUFVUOgotCQkJcmV0dXJuIG91dHB1dCAhPSBudWxsICYmICFvdXRwdXQuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCXJldHVybiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSAhPSBudWxsCi0JCQkJCSYmICFhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PUFRJT05BTF9JTlBVVDoKLQkJCXJldHVybiBvcHRpb25hbElucHV0ICE9IG51bGwgJiYgIW9wdGlvbmFsSW5wdXQuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fU1RFUFM6Ci0JCQlyZXR1cm4gIWdldFN0ZXBzKCkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1JTOgotCQkJcmV0dXJuIHRvb2xNZW50b3JzICE9IG51bGwgJiYgIXRvb2xNZW50b3JzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQlyZXR1cm4gZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zICE9IG51bGwKLQkJCQkJJiYgIWVzdGltYXRpb25Db25zaWRlcmF0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBXb3JrRGVmaW5pdGlvbi5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBXb3JrRGVmaW5pdGlvbi5jbGFzcykgewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotfSAvL1Rhc2tJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZWFtUHJvZmlsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1RlYW1Qcm9maWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNWUyZDY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1RlYW1Qcm9maWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVhbSBQcm9maWxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsI2dldFRlYW1Sb2xlcyA8ZW0+VGVhbSBSb2xlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbCNnZXRTdXBlclRlYW0gPGVtPlN1cGVyIFRlYW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwjZ2V0U3ViVGVhbSA8ZW0+U3ViIFRlYW08L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZWFtUHJvZmlsZUltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVRlYW1Qcm9maWxlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRlYW1Sb2xlcygpIDxlbT5UZWFtIFJvbGVzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRlYW1Sb2xlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRlYW1Sb2xlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBlclRlYW0oKSA8ZW0+U3VwZXIgVGVhbTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3VwZXJUZWFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVhbVByb2ZpbGUgc3VwZXJUZWFtID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YlRlYW0oKSA8ZW0+U3ViIFRlYW08L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViVGVhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHN1YlRlYW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRlYW1Qcm9maWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVBTV9QUk9GSUxFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFRlYW1Sb2xlcygpIHsKLQkJaWYgKHRlYW1Sb2xlcyA9PSBudWxsKSB7Ci0JCQl0ZWFtUm9sZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KFJvbGVEZXNjcmlwdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fVEVBTV9ST0xFUyk7Ci0JCX0KLQkJcmV0dXJuIHRlYW1Sb2xlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGVhbVByb2ZpbGUgZ2V0U3VwZXJUZWFtKCkgewotCQlpZiAoc3VwZXJUZWFtICE9IG51bGwgJiYgKChFT2JqZWN0KSBzdXBlclRlYW0pLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRTdXBlclRlYW0gPSAoSW50ZXJuYWxFT2JqZWN0KSBzdXBlclRlYW07Ci0JCQlzdXBlclRlYW0gPSAoVGVhbVByb2ZpbGUpIGVSZXNvbHZlUHJveHkob2xkU3VwZXJUZWFtKTsKLQkJCWlmIChzdXBlclRlYW0gIT0gb2xkU3VwZXJUZWFtKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSwgb2xkU3VwZXJUZWFtLAotCQkJCQkJCXN1cGVyVGVhbSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlclRlYW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlYW1Qcm9maWxlIGJhc2ljR2V0U3VwZXJUZWFtKCkgewotCQlyZXR1cm4gc3VwZXJUZWFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFN1cGVyVGVhbShUZWFtUHJvZmlsZSBuZXdTdXBlclRlYW0sCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVRlYW1Qcm9maWxlIG9sZFN1cGVyVGVhbSA9IHN1cGVyVGVhbTsKLQkJc3VwZXJUZWFtID0gbmV3U3VwZXJUZWFtOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSwKLQkJCQkJb2xkU3VwZXJUZWFtLCBuZXdTdXBlclRlYW0pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3VwZXJUZWFtKFRlYW1Qcm9maWxlIG5ld1N1cGVyVGVhbSkgewotCQlpZiAobmV3U3VwZXJUZWFtICE9IHN1cGVyVGVhbSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc3VwZXJUZWFtICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBzdXBlclRlYW0pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU0sIFRlYW1Qcm9maWxlLmNsYXNzLAotCQkJCQkJbXNncyk7Ci0JCQlpZiAobmV3U3VwZXJUZWFtICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdTdXBlclRlYW0pLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU0sIFRlYW1Qcm9maWxlLmNsYXNzLAotCQkJCQkJbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTdXBlclRlYW0obmV3U3VwZXJUZWFtLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0sIG5ld1N1cGVyVGVhbSwKLQkJCQkJbmV3U3VwZXJUZWFtKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U3ViVGVhbSgpIHsKLQkJaWYgKHN1YlRlYW0gPT0gbnVsbCkgewotCQkJc3ViVGVhbSA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdChUZWFtUHJvZmlsZS5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNLAotCQkJCQlVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSk7Ci0JCX0KLQkJcmV0dXJuIHN1YlRlYW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTToKLQkJCWlmIChzdXBlclRlYW0gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHN1cGVyVGVhbSkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTSwgVGVhbVByb2ZpbGUuY2xhc3MsCi0JCQkJCQltc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldFN1cGVyVGVhbSgoVGVhbVByb2ZpbGUpIG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRTdWJUZWFtKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTToKLQkJCXJldHVybiBiYXNpY1NldFN1cGVyVGVhbShudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRTdWJUZWFtKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTOgotCQkJcmV0dXJuIGdldFRlYW1Sb2xlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFN1cGVyVGVhbSgpOwotCQkJcmV0dXJuIGJhc2ljR2V0U3VwZXJUZWFtKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNOgotCQkJcmV0dXJuIGdldFN1YlRlYW0oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTOgotCQkJZ2V0VGVhbVJvbGVzKCkuY2xlYXIoKTsKLQkJCWdldFRlYW1Sb2xlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJc2V0U3VwZXJUZWFtKChUZWFtUHJvZmlsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTToKLQkJCWdldFN1YlRlYW0oKS5jbGVhcigpOwotCQkJZ2V0U3ViVGVhbSgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fVEVBTV9ST0xFUzoKLQkJCWdldFRlYW1Sb2xlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU06Ci0JCQlzZXRTdXBlclRlYW0oKFRlYW1Qcm9maWxlKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQlnZXRTdWJUZWFtKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fVEVBTV9ST0xFUzoKLQkJCXJldHVybiB0ZWFtUm9sZXMgIT0gbnVsbCAmJiAhdGVhbVJvbGVzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTToKLQkJCXJldHVybiBzdXBlclRlYW0gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQlyZXR1cm4gc3ViVGVhbSAhPSBudWxsICYmICFzdWJUZWFtLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vVGVhbVByb2ZpbGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZW1wbGF0ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1RlbXBsYXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOTJhYTJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1RlbXBsYXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgVGVtcGxhdGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRlbXBsYXRlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVNUExBVEU7Ci0JfQotCi19IC8vVGVtcGxhdGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZXJtRGVmaW5pdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rlcm1EZWZpbml0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMTliNmM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rlcm1EZWZpbml0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlcm0gRGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRlcm1EZWZpbml0aW9uSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFRlcm1EZWZpbml0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUZXJtRGVmaW5pdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRFUk1fREVGSU5JVElPTjsKLQl9Ci0KLX0gLy9UZXJtRGVmaW5pdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1RleHRFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGV4dEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiMTI3ZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGV4dEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRleHQgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRleHRFbGVtZW50SW1wbCNnZXRUZXh0IDxlbT5UZXh0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGV4dEVsZW1lbnRJbXBsIGV4dGVuZHMgTGVhZkVsZW1lbnRJbXBsIGltcGxlbWVudHMgVGV4dEVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRleHQoKSA8ZW0+VGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGV4dCgpIDxlbT5UZXh0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUZXh0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRleHQgPSBURVhUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRleHRFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVYVF9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgbmV3VGV4dCkgewotCQlTdHJpbmcgb2xkVGV4dCA9IHRleHQ7Ci0JCXRleHQgPSBuZXdUZXh0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlRFWFRfRUxFTUVOVF9fVEVYVCwgb2xkVGV4dCwgdGV4dCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFWFRfRUxFTUVOVF9fVEVYVDoKLQkJCXJldHVybiBnZXRUZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFWFRfRUxFTUVOVF9fVEVYVDoKLQkJCXNldFRleHQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFWFRfRUxFTUVOVF9fVEVYVDoKLQkJCXNldFRleHQoVEVYVF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URVhUX0VMRU1FTlRfX1RFWFQ6Ci0JCQlyZXR1cm4gVEVYVF9FREVGQVVMVCA9PSBudWxsID8gdGV4dCAhPSBudWxsIDogIVRFWFRfRURFRkFVTFQKLQkJCQkJLmVxdWFscyh0ZXh0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0ZXh0OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHRleHQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UZXh0RWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rvb2xJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Ub29sSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNjM0YzA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rvb2xJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRvb2w8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Ub29sSW1wbCNnZXRUb29sTWVudG9ycyA8ZW0+VG9vbCBNZW50b3JzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVG9vbEltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgVG9vbCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb29sTWVudG9ycygpIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9vbE1lbnRvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB0b29sTWVudG9ycyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVG9vbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRPT0w7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0VG9vbE1lbnRvcnMoKSB7Ci0JCWlmICh0b29sTWVudG9ycyA9PSBudWxsKSB7Ci0JCQl0b29sTWVudG9ycyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoVG9vbE1lbnRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UT09MX19UT09MX01FTlRPUlMpOwotCQl9Ci0JCXJldHVybiB0b29sTWVudG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MX19UT09MX01FTlRPUlM6Ci0JCQlyZXR1cm4gZ2V0VG9vbE1lbnRvcnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fVE9PTF9NRU5UT1JTOgotCQkJZ2V0VG9vbE1lbnRvcnMoKS5jbGVhcigpOwotCQkJZ2V0VG9vbE1lbnRvcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MX19UT09MX01FTlRPUlM6Ci0JCQlnZXRUb29sTWVudG9ycygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MX19UT09MX01FTlRPUlM6Ci0JCQlyZXR1cm4gdG9vbE1lbnRvcnMgIT0gbnVsbCAmJiAhdG9vbE1lbnRvcnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Ub29sSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVG9vbE1lbnRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rvb2xNZW50b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlODBkODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVG9vbE1lbnRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVG9vbE1lbnRvckltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBUb29sTWVudG9yIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUb29sTWVudG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVE9PTF9NRU5UT1I7Ci0JfQotCi19IC8vVG9vbE1lbnRvckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1RyYW5zaXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UcmFuc2l0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YTNlZDQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1RyYW5zaXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUcmFuc2l0aW9uSW1wbC5qYXZhLHYgMS41IDIwMDYvMDkvMDcgMDA6MDY6MjAga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UcmFuc2l0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVHJhbnNpdGlvbkltcGwjZ2V0V29ya0RlZmluaXRpb24gPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRyYW5zaXRpb25JbXBsI2dldENvbnRhaW5lcl8gPGVtPkNvbnRhaW5lcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRyYW5zaXRpb25JbXBsI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVHJhbnNpdGlvbkltcGwjZ2V0VGFyZ2V0IDxlbT5UYXJnZXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2l0aW9uSW1wbCBleHRlbmRzIE11bHRpUmVzb3VyY2VFT2JqZWN0IGltcGxlbWVudHMgVHJhbnNpdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrRGVmaW5pdGlvbigpIDxlbT5Xb3JrIERlZmluaXRpb248L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya0RlZmluaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB3b3JrRGVmaW5pdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb3VyY2UoKSA8ZW0+U291cmNlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBWZXJ0ZXggc291cmNlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldCgpIDxlbT5UYXJnZXQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhcmdldCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZlcnRleCB0YXJnZXQgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zaXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UUkFOU0lUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFdvcmtEZWZpbml0aW9uKCkgewotCQlpZiAod29ya0RlZmluaXRpb24gPT0gbnVsbCkgewotCQkJd29ya0RlZmluaXRpb24gPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KFdvcmtEZWZpbml0aW9uLmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX1dPUktfREVGSU5JVElPTik7Ci0JCX0KLQkJcmV0dXJuIHdvcmtEZWZpbml0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZWdpb24gZ2V0Q29udGFpbmVyXygpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5UUkFOU0lUSU9OX19DT05UQUlORVIpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChSZWdpb24pIGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVnaW9uIGJhc2ljR2V0Q29udGFpbmVyKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX0NPTlRBSU5FUikKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKFJlZ2lvbikgZUludGVybmFsQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29udGFpbmVyKFJlZ2lvbiBuZXdDb250YWluZXIsCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3Q29udGFpbmVyLAotCQkJCVVtYVBhY2thZ2UuVFJBTlNJVElPTl9fQ09OVEFJTkVSLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKFJlZ2lvbiBuZXdDb250YWluZXIpIHsKLQkJaWYgKG5ld0NvbnRhaW5lciAhPSBlSW50ZXJuYWxDb250YWluZXIoKQotCQkJCXx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuVFJBTlNJVElPTl9fQ09OVEFJTkVSICYmIG5ld0NvbnRhaW5lciAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIChFT2JqZWN0KSBuZXdDb250YWluZXIpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3Q29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdDb250YWluZXIpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLlJFR0lPTl9fVFJBTlNJVElPTiwgUmVnaW9uLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvbnRhaW5lcihuZXdDb250YWluZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlRSQU5TSVRJT05fX0NPTlRBSU5FUiwgbmV3Q29udGFpbmVyLAotCQkJCQluZXdDb250YWluZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmVydGV4IGdldFNvdXJjZSgpIHsKLQkJaWYgKHNvdXJjZSAhPSBudWxsICYmICgoRU9iamVjdCkgc291cmNlKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkU291cmNlID0gKEludGVybmFsRU9iamVjdCkgc291cmNlOwotCQkJc291cmNlID0gKFZlcnRleCkgZVJlc29sdmVQcm94eShvbGRTb3VyY2UpOwotCQkJaWYgKHNvdXJjZSAhPSBvbGRTb3VyY2UpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuVFJBTlNJVElPTl9fU09VUkNFLCBvbGRTb3VyY2UsIHNvdXJjZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZlcnRleCBiYXNpY0dldFNvdXJjZSgpIHsKLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTb3VyY2UoVmVydGV4IG5ld1NvdXJjZSwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJVmVydGV4IG9sZFNvdXJjZSA9IHNvdXJjZTsKLQkJc291cmNlID0gbmV3U291cmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX1NPVVJDRSwgb2xkU291cmNlLAotCQkJCQluZXdTb3VyY2UpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291cmNlKFZlcnRleCBuZXdTb3VyY2UpIHsKLQkJaWYgKG5ld1NvdXJjZSAhPSBzb3VyY2UpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgc291cmNlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5WRVJURVhfX09VVEdPSU5HLCBWZXJ0ZXguY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld1NvdXJjZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3U291cmNlKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5WRVJURVhfX09VVEdPSU5HLCBWZXJ0ZXguY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U291cmNlKG5ld1NvdXJjZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVFJBTlNJVElPTl9fU09VUkNFLCBuZXdTb3VyY2UsIG5ld1NvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWZXJ0ZXggZ2V0VGFyZ2V0KCkgewotCQlpZiAodGFyZ2V0ICE9IG51bGwgJiYgKChFT2JqZWN0KSB0YXJnZXQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRUYXJnZXQgPSAoSW50ZXJuYWxFT2JqZWN0KSB0YXJnZXQ7Ci0JCQl0YXJnZXQgPSAoVmVydGV4KSBlUmVzb2x2ZVByb3h5KG9sZFRhcmdldCk7Ci0JCQlpZiAodGFyZ2V0ICE9IG9sZFRhcmdldCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5UUkFOU0lUSU9OX19UQVJHRVQsIG9sZFRhcmdldCwgdGFyZ2V0KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmVydGV4IGJhc2ljR2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gdGFyZ2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFRhcmdldChWZXJ0ZXggbmV3VGFyZ2V0LAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlWZXJ0ZXggb2xkVGFyZ2V0ID0gdGFyZ2V0OwotCQl0YXJnZXQgPSBuZXdUYXJnZXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuVFJBTlNJVElPTl9fVEFSR0VULCBvbGRUYXJnZXQsCi0JCQkJCW5ld1RhcmdldCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoVmVydGV4IG5ld1RhcmdldCkgewotCQlpZiAobmV3VGFyZ2V0ICE9IHRhcmdldCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodGFyZ2V0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSB0YXJnZXQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLlZFUlRFWF9fSU5DT01JTkcsIFZlcnRleC5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3VGFyZ2V0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdUYXJnZXQpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLlZFUlRFWF9fSU5DT01JTkcsIFZlcnRleC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRUYXJnZXQobmV3VGFyZ2V0LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5UUkFOU0lUSU9OX19UQVJHRVQsIG5ld1RhcmdldCwgbmV3VGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX0NPTlRBSU5FUjoKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0Q29udGFpbmVyKChSZWdpb24pIG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX1NPVVJDRToKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHNvdXJjZSkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuVkVSVEVYX19PVVRHT0lORywgVmVydGV4LmNsYXNzLCBtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldFNvdXJjZSgoVmVydGV4KSBvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UUkFOU0lUSU9OX19UQVJHRVQ6Ci0JCQlpZiAodGFyZ2V0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSB0YXJnZXQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLlZFUlRFWF9fSU5DT01JTkcsIFZlcnRleC5jbGFzcywgbXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXRUYXJnZXQoKFZlcnRleCkgb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVFJBTlNJVElPTl9fQ09OVEFJTkVSOgotCQkJcmV0dXJuIGJhc2ljU2V0Q29udGFpbmVyKG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuVFJBTlNJVElPTl9fU09VUkNFOgotCQkJcmV0dXJuIGJhc2ljU2V0U291cmNlKG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuVFJBTlNJVElPTl9fVEFSR0VUOgotCQkJcmV0dXJuIGJhc2ljU2V0VGFyZ2V0KG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVFJBTlNJVElPTl9fQ09OVEFJTkVSOgotCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUkVHSU9OX19UUkFOU0lUSU9OLCBSZWdpb24uY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UUkFOU0lUSU9OX19XT1JLX0RFRklOSVRJT046Ci0JCQlyZXR1cm4gZ2V0V29ya0RlZmluaXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX0NPTlRBSU5FUjoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRDb250YWluZXJfKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRDb250YWluZXIoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX1NPVVJDRToKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRTb3VyY2UoKTsKLQkJCXJldHVybiBiYXNpY0dldFNvdXJjZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVFJBTlNJVElPTl9fVEFSR0VUOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFRhcmdldCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0VGFyZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX1dPUktfREVGSU5JVElPTjoKLQkJCWdldFdvcmtEZWZpbml0aW9uKCkuY2xlYXIoKTsKLQkJCWdldFdvcmtEZWZpbml0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UUkFOU0lUSU9OX19DT05UQUlORVI6Ci0JCQlzZXRDb250YWluZXIoKFJlZ2lvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVFJBTlNJVElPTl9fU09VUkNFOgotCQkJc2V0U291cmNlKChWZXJ0ZXgpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX1RBUkdFVDoKLQkJCXNldFRhcmdldCgoVmVydGV4KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVFJBTlNJVElPTl9fV09SS19ERUZJTklUSU9OOgotCQkJZ2V0V29ya0RlZmluaXRpb24oKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVFJBTlNJVElPTl9fQ09OVEFJTkVSOgotCQkJc2V0Q29udGFpbmVyKChSZWdpb24pIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVFJBTlNJVElPTl9fU09VUkNFOgotCQkJc2V0U291cmNlKChWZXJ0ZXgpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVFJBTlNJVElPTl9fVEFSR0VUOgotCQkJc2V0VGFyZ2V0KChWZXJ0ZXgpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVFJBTlNJVElPTl9fV09SS19ERUZJTklUSU9OOgotCQkJcmV0dXJuIHdvcmtEZWZpbml0aW9uICE9IG51bGwgJiYgIXdvcmtEZWZpbml0aW9uLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRSQU5TSVRJT05fX0NPTlRBSU5FUjoKLQkJCXJldHVybiBiYXNpY0dldENvbnRhaW5lcigpICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5UUkFOU0lUSU9OX19TT1VSQ0U6Ci0JCQlyZXR1cm4gc291cmNlICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5UUkFOU0lUSU9OX19UQVJHRVQ6Ci0JCQlyZXR1cm4gdGFyZ2V0ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1RyYW5zaXRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1R5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMzZDczZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUeXBlSW1wbCBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBUeXBlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVFlQRTsKLQl9Ci0KLX0gLy9UeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1VNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljMzU3Y2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIGV4dGVuZHMgU2VtYW50aWNNb2RlbEJyaWRnZUltcGwKLQkJaW1wbGVtZW50cyBVTUFTZW1hbnRpY01vZGVsQnJpZGdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVsZW1lbnQoKSA8ZW0+RWxlbWVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiAoKEVPYmplY3QpIGVsZW1lbnQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRFbGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgZWxlbWVudDsKLQkJCWVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgZVJlc29sdmVQcm94eShvbGRFbGVtZW50KTsKLQkJCWlmIChlbGVtZW50ICE9IG9sZEVsZW1lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCwKLQkJCQkJCQlvbGRFbGVtZW50LCBlbGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgYmFzaWNHZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50KE1ldGhvZEVsZW1lbnQgbmV3RWxlbWVudCkgewotCQlNZXRob2RFbGVtZW50IG9sZEVsZW1lbnQgPSBlbGVtZW50OwotCQllbGVtZW50ID0gbmV3RWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5VTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5ULCBvbGRFbGVtZW50LAotCQkJCQllbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQ6Ci0JCQlzZXRFbGVtZW50KChNZXRob2RFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVDoKLQkJCXNldEVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVDoKLQkJCXJldHVybiBlbGVtZW50ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9VbWFGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVW1hRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjNiYTgwZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9VbWFGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBzZXVkb1N0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHNldWRvU3RhdGVLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZU1hY2hpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRyYW5zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW1hRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBVbWFGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBVbWFGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlVbWFGYWN0b3J5IHRoZVVtYUZhY3RvcnkgPSAoVW1hRmFjdG9yeSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UKLQkJCQkJLmdldEVGYWN0b3J5KCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlpZiAodGhlVW1hRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZVVtYUZhY3Rvcnk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgVW1hRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUEFDS0FHRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUGFja2FnZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQ29uc3RyYWludCgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVTZWN0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVSb2xlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUYXNrKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEVQOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVTdGVwKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQXJ0aWZhY3QoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEZWxpdmVyYWJsZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuT1VUQ09NRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlT3V0Y29tZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVDb250ZW50UGFja2FnZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVGFza0Rlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQb2ludCgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEaWFncmFtTGluaygpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVHcmFwaENvbm5lY3RvcigpOwotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEaW1lbnNpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUmVmZXJlbmNlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUHJvcGVydHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUdyYXBoRWRnZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlRGlhZ3JhbSgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfTk9ERToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlR3JhcGhOb2RlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVYVF9FTEVNRU5UOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUZXh0RWxlbWVudCgpOwotCQljYXNlIFVtYVBhY2thZ2UuSU1BR0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUltYWdlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUG9seWxpbmUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUVsbGlwc2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVBY3Rpdml0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUlMRVNUT05FOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVNaWxlc3RvbmUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLklURVJBVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlSXRlcmF0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QSEFTRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUGhhc2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVGVhbVByb2ZpbGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUm9sZURlc2NyaXB0b3IoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVI6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVdvcmtPcmRlcigpOwotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUGxhbm5pbmdEYXRhKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1I6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVRhc2tEZXNjcmlwdG9yKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQ29tcG9zaXRlUm9sZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OQ0VQVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQ29uY2VwdCgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ0hFQ0tMSVNUOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVDaGVja2xpc3QoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVYQU1QTEU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUV4YW1wbGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURFTElORToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlR3VpZGVsaW5lKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRVBPUlQ6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVJlcG9ydCgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVNUExBVEU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVRlbXBsYXRlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVVBQT1JUSU5HX01BVEVSSUFMOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfTUVOVE9SOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUb29sTWVudG9yKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XSElURVBBUEVSOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVXaGl0ZXBhcGVyKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5URVJNX0RFRklOSVRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVRlcm1EZWZpbml0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUHJhY3RpY2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCQljYXNlIFVtYVBhY2thZ2UuUkVVU0FCTEVfQVNTRVQ6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVJldXNhYmxlQXNzZXQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNUQVRFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVTdGF0ZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVkVSVEVYOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVWZXJ0ZXgoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUmVnaW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEFURV9NQUNISU5FOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVTdGF0ZU1hY2hpbmUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRSQU5TSVRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVRyYW5zaXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBTRVVET19TVEFURToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUHNldWRvU3RhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURpc2NpcGxpbmUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVSb2xlU2V0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU46Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURvbWFpbigpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElORzoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUb29sKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElORzoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUm9sZVNldEdyb3VwaW5nKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUlk6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUN1c3RvbUNhdGVnb3J5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEZWxpdmVyeVByb2Nlc3MoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNBUEFCSUxJVFlfUEFUVEVSTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0FETUFQOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVSb2FkbWFwKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19GQU1JTFk6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVByb2Nlc3NGYW1pbHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVNZXRob2RMaWJyYXJ5KCk7Ci0JCWRlZmF1bHQ6Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9UWVBFOgotCQkJcmV0dXJuIGNyZWF0ZVdvcmtPcmRlclR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBTRVVET19TVEFURV9LSU5EOgotCQkJcmV0dXJuIGNyZWF0ZVBzZXVkb1N0YXRlS2luZEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfVFlQRToKLQkJCXJldHVybiBjcmVhdGVWYXJpYWJpbGl0eVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRBVEU6Ci0JCQlyZXR1cm4gY3JlYXRlRGF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuVVJJOgotCQkJcmV0dXJuIGNyZWF0ZVVyaUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuVU5MSU1JVEVEX05BVFVSQUw6Ci0JCQlyZXR1cm4gY3JlYXRlVW5saW1pdGVkTmF0dXJhbEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuU1RSSU5HOgotCQkJcmV0dXJuIGNyZWF0ZVN0cmluZ0Zyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VUOgotCQkJcmV0dXJuIGNyZWF0ZVNldEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VRVUVOQ0U6Ci0JCQlyZXR1cm4gY3JlYXRlU2VxdWVuY2VGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLklOVEVHRVI6Ci0JCQlyZXR1cm4gY3JlYXRlSW50ZWdlckZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuRkxPQVQ6Ci0JCQlyZXR1cm4gY3JlYXRlRmxvYXRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX1RZUEU6Ci0JCQlyZXR1cm4gY29udmVydFdvcmtPcmRlclR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuUFNFVURPX1NUQVRFX0tJTkQ6Ci0JCQlyZXR1cm4gY29udmVydFBzZXVkb1N0YXRlS2luZFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9UWVBFOgotCQkJcmV0dXJuIGNvbnZlcnRWYXJpYWJpbGl0eVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuREFURToKLQkJCXJldHVybiBjb252ZXJ0RGF0ZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5VUkk6Ci0JCQlyZXR1cm4gY29udmVydFVyaVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5VTkxJTUlURURfTkFUVVJBTDoKLQkJCXJldHVybiBjb252ZXJ0VW5saW1pdGVkTmF0dXJhbFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVFJJTkc6Ci0JCQlyZXR1cm4gY29udmVydFN0cmluZ1RvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRVQ6Ci0JCQlyZXR1cm4gY29udmVydFNldFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRVFVRU5DRToKLQkJCXJldHVybiBjb252ZXJ0U2VxdWVuY2VUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuSU5URUdFUjoKLQkJCXJldHVybiBjb252ZXJ0SW50ZWdlclRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5GTE9BVDoKLQkJCXJldHVybiBjb252ZXJ0RmxvYXRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSBjcmVhdGVQYWNrYWdlKCkgewotCQlQYWNrYWdlSW1wbCBwYWNrYWdlXyA9IG5ldyBQYWNrYWdlSW1wbCgpOwotCQlyZXR1cm4gcGFja2FnZV87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgY3JlYXRlQ29uc3RyYWludCgpIHsKLQkJQ29uc3RyYWludEltcGwgY29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50SW1wbCgpOwotCQlyZXR1cm4gY29uc3RyYWludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudFByb3BlcnR5IGNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpIHsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbCBtZXRob2RFbGVtZW50UHJvcGVydHkgPSBuZXcgTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbCgpOwotCQlyZXR1cm4gbWV0aG9kRWxlbWVudFByb3BlcnR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50RGVzY3JpcHRpb24gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKCkgewotCQlDb250ZW50RGVzY3JpcHRpb25JbXBsIGNvbnRlbnREZXNjcmlwdGlvbiA9IG5ldyBDb250ZW50RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBjb250ZW50RGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3Rpb24gY3JlYXRlU2VjdGlvbigpIHsKLQkJU2VjdGlvbkltcGwgc2VjdGlvbiA9IG5ldyBTZWN0aW9uSW1wbCgpOwotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZSBjcmVhdGVSb2xlKCkgewotCQlSb2xlSW1wbCByb2xlID0gbmV3IFJvbGVJbXBsKCk7Ci0JCXJldHVybiByb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrIGNyZWF0ZVRhc2soKSB7Ci0JCVRhc2tJbXBsIHRhc2sgPSBuZXcgVGFza0ltcGwoKTsKLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0ZXAgY3JlYXRlU3RlcCgpIHsKLQkJU3RlcEltcGwgc3RlcCA9IG5ldyBTdGVwSW1wbCgpOwotCQlyZXR1cm4gc3RlcDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3QgY3JlYXRlQXJ0aWZhY3QoKSB7Ci0JCUFydGlmYWN0SW1wbCBhcnRpZmFjdCA9IG5ldyBBcnRpZmFjdEltcGwoKTsKLQkJcmV0dXJuIGFydGlmYWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyYWJsZSBjcmVhdGVEZWxpdmVyYWJsZSgpIHsKLQkJRGVsaXZlcmFibGVJbXBsIGRlbGl2ZXJhYmxlID0gbmV3IERlbGl2ZXJhYmxlSW1wbCgpOwotCQlyZXR1cm4gZGVsaXZlcmFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGNvbWUgY3JlYXRlT3V0Y29tZSgpIHsKLQkJT3V0Y29tZUltcGwgb3V0Y29tZSA9IG5ldyBPdXRjb21lSW1wbCgpOwotCQlyZXR1cm4gb3V0Y29tZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudFBhY2thZ2UgY3JlYXRlQ29udGVudFBhY2thZ2UoKSB7Ci0JCUNvbnRlbnRQYWNrYWdlSW1wbCBjb250ZW50UGFja2FnZSA9IG5ldyBDb250ZW50UGFja2FnZUltcGwoKTsKLQkJcmV0dXJuIGNvbnRlbnRQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcnRpZmFjdERlc2NyaXB0aW9uIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb24oKSB7Ci0JCUFydGlmYWN0RGVzY3JpcHRpb25JbXBsIGFydGlmYWN0RGVzY3JpcHRpb24gPSBuZXcgQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGFydGlmYWN0RGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbigpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwgd29ya1Byb2R1Y3REZXNjcmlwdGlvbiA9IG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkgewotCQlEZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCBkZWxpdmVyYWJsZURlc2NyaXB0aW9uID0gbmV3IERlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBkZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRpb24gY3JlYXRlUm9sZURlc2NyaXB0aW9uKCkgewotCQlSb2xlRGVzY3JpcHRpb25JbXBsIHJvbGVEZXNjcmlwdGlvbiA9IG5ldyBSb2xlRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiByb2xlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tEZXNjcmlwdGlvbiBjcmVhdGVUYXNrRGVzY3JpcHRpb24oKSB7Ci0JCVRhc2tEZXNjcmlwdGlvbkltcGwgdGFza0Rlc2NyaXB0aW9uID0gbmV3IFRhc2tEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHRhc2tEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VEZXNjcmlwdGlvbiBjcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uKCkgewotCQlHdWlkYW5jZURlc2NyaXB0aW9uSW1wbCBndWlkYW5jZURlc2NyaXB0aW9uID0gbmV3IEd1aWRhbmNlRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBndWlkYW5jZURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcmFjdGljZURlc2NyaXB0aW9uIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb24oKSB7Ci0JCVByYWN0aWNlRGVzY3JpcHRpb25JbXBsIHByYWN0aWNlRGVzY3JpcHRpb24gPSBuZXcgUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHByYWN0aWNlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGNyZWF0ZVBvaW50KCkgewotCQlQb2ludEltcGwgcG9pbnQgPSBuZXcgUG9pbnRJbXBsKCk7Ci0JCXJldHVybiBwb2ludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUxpbmsgY3JlYXRlRGlhZ3JhbUxpbmsoKSB7Ci0JCURpYWdyYW1MaW5rSW1wbCBkaWFncmFtTGluayA9IG5ldyBEaWFncmFtTGlua0ltcGwoKTsKLQkJcmV0dXJuIGRpYWdyYW1MaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaENvbm5lY3RvciBjcmVhdGVHcmFwaENvbm5lY3RvcigpIHsKLQkJR3JhcGhDb25uZWN0b3JJbXBsIGdyYXBoQ29ubmVjdG9yID0gbmV3IEdyYXBoQ29ubmVjdG9ySW1wbCgpOwotCQlyZXR1cm4gZ3JhcGhDb25uZWN0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpbWVuc2lvbiBjcmVhdGVEaW1lbnNpb24oKSB7Ci0JCURpbWVuc2lvbkltcGwgZGltZW5zaW9uID0gbmV3IERpbWVuc2lvbkltcGwoKTsKLQkJcmV0dXJuIGRpbWVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVmZXJlbmNlIGNyZWF0ZVJlZmVyZW5jZSgpIHsKLQkJUmVmZXJlbmNlSW1wbCByZWZlcmVuY2UgPSBuZXcgUmVmZXJlbmNlSW1wbCgpOwotCQlyZXR1cm4gcmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eSBjcmVhdGVQcm9wZXJ0eSgpIHsKLQkJUHJvcGVydHlJbXBsIHByb3BlcnR5ID0gbmV3IFByb3BlcnR5SW1wbCgpOwotCQlyZXR1cm4gcHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWRnZSBjcmVhdGVHcmFwaEVkZ2UoKSB7Ci0JCUdyYXBoRWRnZUltcGwgZ3JhcGhFZGdlID0gbmV3IEdyYXBoRWRnZUltcGwoKTsKLQkJcmV0dXJuIGdyYXBoRWRnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBjcmVhdGVEaWFncmFtKCkgewotCQlEaWFncmFtSW1wbCBkaWFncmFtID0gbmV3IERpYWdyYW1JbXBsKCk7Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaE5vZGUgY3JlYXRlR3JhcGhOb2RlKCkgewotCQlHcmFwaE5vZGVJbXBsIGdyYXBoTm9kZSA9IG5ldyBHcmFwaE5vZGVJbXBsKCk7Ci0JCXJldHVybiBncmFwaE5vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IGNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCkgewotCQlTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwgc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgPSBuZXcgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBjcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCkgewotCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCB1bWFTZW1hbnRpY01vZGVsQnJpZGdlID0gbmV3IFVNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsKCk7Ci0JCXJldHVybiB1bWFTZW1hbnRpY01vZGVsQnJpZGdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSBjcmVhdGVDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpIHsKLQkJQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlID0gbmV3IENvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCgpOwotCQlyZXR1cm4gY29yZVNlbWFudGljTW9kZWxCcmlkZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRleHRFbGVtZW50IGNyZWF0ZVRleHRFbGVtZW50KCkgewotCQlUZXh0RWxlbWVudEltcGwgdGV4dEVsZW1lbnQgPSBuZXcgVGV4dEVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiB0ZXh0RWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgY3JlYXRlSW1hZ2UoKSB7Ci0JCUltYWdlSW1wbCBpbWFnZSA9IG5ldyBJbWFnZUltcGwoKTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2x5bGluZSBjcmVhdGVQb2x5bGluZSgpIHsKLQkJUG9seWxpbmVJbXBsIHBvbHlsaW5lID0gbmV3IFBvbHlsaW5lSW1wbCgpOwotCQlyZXR1cm4gcG9seWxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVsbGlwc2UgY3JlYXRlRWxsaXBzZSgpIHsKLQkJRWxsaXBzZUltcGwgZWxsaXBzZSA9IG5ldyBFbGxpcHNlSW1wbCgpOwotCQlyZXR1cm4gZWxsaXBzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHkgY3JlYXRlQWN0aXZpdHkoKSB7Ci0JCUFjdGl2aXR5SW1wbCBhY3Rpdml0eSA9IG5ldyBBY3Rpdml0eUltcGwoKTsKLQkJcmV0dXJuIGFjdGl2aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNaWxlc3RvbmUgY3JlYXRlTWlsZXN0b25lKCkgewotCQlNaWxlc3RvbmVJbXBsIG1pbGVzdG9uZSA9IG5ldyBNaWxlc3RvbmVJbXBsKCk7Ci0JCXJldHVybiBtaWxlc3RvbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEl0ZXJhdGlvbiBjcmVhdGVJdGVyYXRpb24oKSB7Ci0JCUl0ZXJhdGlvbkltcGwgaXRlcmF0aW9uID0gbmV3IEl0ZXJhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGl0ZXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGhhc2UgY3JlYXRlUGhhc2UoKSB7Ci0JCVBoYXNlSW1wbCBwaGFzZSA9IG5ldyBQaGFzZUltcGwoKTsKLQkJcmV0dXJuIHBoYXNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZWFtUHJvZmlsZSBjcmVhdGVUZWFtUHJvZmlsZSgpIHsKLQkJVGVhbVByb2ZpbGVJbXBsIHRlYW1Qcm9maWxlID0gbmV3IFRlYW1Qcm9maWxlSW1wbCgpOwotCQlyZXR1cm4gdGVhbVByb2ZpbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdG9yIGNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkgewotCQlSb2xlRGVzY3JpcHRvckltcGwgcm9sZURlc2NyaXB0b3IgPSBuZXcgUm9sZURlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiByb2xlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyIGNyZWF0ZVdvcmtPcmRlcigpIHsKLQkJV29ya09yZGVySW1wbCB3b3JrT3JkZXIgPSBuZXcgV29ya09yZGVySW1wbCgpOwotCQlyZXR1cm4gd29ya09yZGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQbGFubmluZ0RhdGEgY3JlYXRlUGxhbm5pbmdEYXRhKCkgewotCQlQbGFubmluZ0RhdGFJbXBsIHBsYW5uaW5nRGF0YSA9IG5ldyBQbGFubmluZ0RhdGFJbXBsKCk7Ci0JCXJldHVybiBwbGFubmluZ0RhdGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tEZXNjcmlwdG9yIGNyZWF0ZVRhc2tEZXNjcmlwdG9yKCkgewotCQlUYXNrRGVzY3JpcHRvckltcGwgdGFza0Rlc2NyaXB0b3IgPSBuZXcgVGFza0Rlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiB0YXNrRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCB3b3JrUHJvZHVjdERlc2NyaXB0b3IgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVSb2xlIGNyZWF0ZUNvbXBvc2l0ZVJvbGUoKSB7Ci0JCUNvbXBvc2l0ZVJvbGVJbXBsIGNvbXBvc2l0ZVJvbGUgPSBuZXcgQ29tcG9zaXRlUm9sZUltcGwoKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZVJvbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSB7Ci0JCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwgYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uID0gbmV3IEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEZXNjcmlwdGlvbiBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uKCkgewotCQlBY3Rpdml0eURlc2NyaXB0aW9uSW1wbCBhY3Rpdml0eURlc2NyaXB0aW9uID0gbmV3IEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBhY3Rpdml0eURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpIHsKLQkJRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uID0gbmV3IERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NEZXNjcmlwdGlvbiBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgcHJvY2Vzc0Rlc2NyaXB0aW9uID0gbmV3IFByb2Nlc3NEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRvckRlc2NyaXB0aW9uIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbigpIHsKLQkJRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCBkZXNjcmlwdG9yRGVzY3JpcHRpb24gPSBuZXcgRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gZGVzY3JpcHRvckRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25jZXB0IGNyZWF0ZUNvbmNlcHQoKSB7Ci0JCUNvbmNlcHRJbXBsIGNvbmNlcHQgPSBuZXcgQ29uY2VwdEltcGwoKTsKLQkJcmV0dXJuIGNvbmNlcHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENoZWNrbGlzdCBjcmVhdGVDaGVja2xpc3QoKSB7Ci0JCUNoZWNrbGlzdEltcGwgY2hlY2tsaXN0ID0gbmV3IENoZWNrbGlzdEltcGwoKTsKLQkJcmV0dXJuIGNoZWNrbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXhhbXBsZSBjcmVhdGVFeGFtcGxlKCkgewotCQlFeGFtcGxlSW1wbCBleGFtcGxlID0gbmV3IEV4YW1wbGVJbXBsKCk7Ci0JCXJldHVybiBleGFtcGxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHdWlkZWxpbmUgY3JlYXRlR3VpZGVsaW5lKCkgewotCQlHdWlkZWxpbmVJbXBsIGd1aWRlbGluZSA9IG5ldyBHdWlkZWxpbmVJbXBsKCk7Ci0JCXJldHVybiBndWlkZWxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCUVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID0gbmV3IEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwoKTsKLQkJcmV0dXJuIGVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVwb3J0IGNyZWF0ZVJlcG9ydCgpIHsKLQkJUmVwb3J0SW1wbCByZXBvcnQgPSBuZXcgUmVwb3J0SW1wbCgpOwotCQlyZXR1cm4gcmVwb3J0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZSBjcmVhdGVUZW1wbGF0ZSgpIHsKLQkJVGVtcGxhdGVJbXBsIHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlSW1wbCgpOwotCQlyZXR1cm4gdGVtcGxhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN1cHBvcnRpbmdNYXRlcmlhbCBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoKSB7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbEltcGwgc3VwcG9ydGluZ01hdGVyaWFsID0gbmV3IFN1cHBvcnRpbmdNYXRlcmlhbEltcGwoKTsKLQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVG9vbE1lbnRvciBjcmVhdGVUb29sTWVudG9yKCkgewotCQlUb29sTWVudG9ySW1wbCB0b29sTWVudG9yID0gbmV3IFRvb2xNZW50b3JJbXBsKCk7Ci0JCXJldHVybiB0b29sTWVudG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXaGl0ZXBhcGVyIGNyZWF0ZVdoaXRlcGFwZXIoKSB7Ci0JCVdoaXRlcGFwZXJJbXBsIHdoaXRlcGFwZXIgPSBuZXcgV2hpdGVwYXBlckltcGwoKTsKLQkJcmV0dXJuIHdoaXRlcGFwZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlcm1EZWZpbml0aW9uIGNyZWF0ZVRlcm1EZWZpbml0aW9uKCkgewotCQlUZXJtRGVmaW5pdGlvbkltcGwgdGVybURlZmluaXRpb24gPSBuZXcgVGVybURlZmluaXRpb25JbXBsKCk7Ci0JCXJldHVybiB0ZXJtRGVmaW5pdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJhY3RpY2UgY3JlYXRlUHJhY3RpY2UoKSB7Ci0JCVByYWN0aWNlSW1wbCBwcmFjdGljZSA9IG5ldyBQcmFjdGljZUltcGwoKTsKLQkJcmV0dXJuIHByYWN0aWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXVzYWJsZUFzc2V0IGNyZWF0ZVJldXNhYmxlQXNzZXQoKSB7Ci0JCVJldXNhYmxlQXNzZXRJbXBsIHJldXNhYmxlQXNzZXQgPSBuZXcgUmV1c2FibGVBc3NldEltcGwoKTsKLQkJcmV0dXJuIHJldXNhYmxlQXNzZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0YXRlIGNyZWF0ZVN0YXRlKCkgewotCQlTdGF0ZUltcGwgc3RhdGUgPSBuZXcgU3RhdGVJbXBsKCk7Ci0JCXJldHVybiBzdGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmVydGV4IGNyZWF0ZVZlcnRleCgpIHsKLQkJVmVydGV4SW1wbCB2ZXJ0ZXggPSBuZXcgVmVydGV4SW1wbCgpOwotCQlyZXR1cm4gdmVydGV4OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZWdpb24gY3JlYXRlUmVnaW9uKCkgewotCQlSZWdpb25JbXBsIHJlZ2lvbiA9IG5ldyBSZWdpb25JbXBsKCk7Ci0JCXJldHVybiByZWdpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0YXRlTWFjaGluZSBjcmVhdGVTdGF0ZU1hY2hpbmUoKSB7Ci0JCVN0YXRlTWFjaGluZUltcGwgc3RhdGVNYWNoaW5lID0gbmV3IFN0YXRlTWFjaGluZUltcGwoKTsKLQkJcmV0dXJuIHN0YXRlTWFjaGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHJhbnNpdGlvbiBjcmVhdGVUcmFuc2l0aW9uKCkgewotCQlUcmFuc2l0aW9uSW1wbCB0cmFuc2l0aW9uID0gbmV3IFRyYW5zaXRpb25JbXBsKCk7Ci0JCXJldHVybiB0cmFuc2l0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQc2V1ZG9TdGF0ZSBjcmVhdGVQc2V1ZG9TdGF0ZSgpIHsKLQkJUHNldWRvU3RhdGVJbXBsIHBzZXVkb1N0YXRlID0gbmV3IFBzZXVkb1N0YXRlSW1wbCgpOwotCQlyZXR1cm4gcHNldWRvU3RhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpc2NpcGxpbmUgY3JlYXRlRGlzY2lwbGluZSgpIHsKLQkJRGlzY2lwbGluZUltcGwgZGlzY2lwbGluZSA9IG5ldyBEaXNjaXBsaW5lSW1wbCgpOwotCQlyZXR1cm4gZGlzY2lwbGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZVNldCBjcmVhdGVSb2xlU2V0KCkgewotCQlSb2xlU2V0SW1wbCByb2xlU2V0ID0gbmV3IFJvbGVTZXRJbXBsKCk7Ci0JCXJldHVybiByb2xlU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb21haW4gY3JlYXRlRG9tYWluKCkgewotCQlEb21haW5JbXBsIGRvbWFpbiA9IG5ldyBEb21haW5JbXBsKCk7Ci0JCXJldHVybiBkb21haW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0VHlwZSBjcmVhdGVXb3JrUHJvZHVjdFR5cGUoKSB7Ci0JCVdvcmtQcm9kdWN0VHlwZUltcGwgd29ya1Byb2R1Y3RUeXBlID0gbmV3IFdvcmtQcm9kdWN0VHlwZUltcGwoKTsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUdyb3VwaW5nIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpIHsKLQkJRGlzY2lwbGluZUdyb3VwaW5nSW1wbCBkaXNjaXBsaW5lR3JvdXBpbmcgPSBuZXcgRGlzY2lwbGluZUdyb3VwaW5nSW1wbCgpOwotCQlyZXR1cm4gZGlzY2lwbGluZUdyb3VwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUb29sIGNyZWF0ZVRvb2woKSB7Ci0JCVRvb2xJbXBsIHRvb2wgPSBuZXcgVG9vbEltcGwoKTsKLQkJcmV0dXJuIHRvb2w7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVTZXRHcm91cGluZyBjcmVhdGVSb2xlU2V0R3JvdXBpbmcoKSB7Ci0JCVJvbGVTZXRHcm91cGluZ0ltcGwgcm9sZVNldEdyb3VwaW5nID0gbmV3IFJvbGVTZXRHcm91cGluZ0ltcGwoKTsKLQkJcmV0dXJuIHJvbGVTZXRHcm91cGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcnkgY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKSB7Ci0JCUN1c3RvbUNhdGVnb3J5SW1wbCBjdXN0b21DYXRlZ29yeSA9IG5ldyBDdXN0b21DYXRlZ29yeUltcGwoKTsKLQkJcmV0dXJuIGN1c3RvbUNhdGVnb3J5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyeVByb2Nlc3MgY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCkgewotCQlEZWxpdmVyeVByb2Nlc3NJbXBsIGRlbGl2ZXJ5UHJvY2VzcyA9IG5ldyBEZWxpdmVyeVByb2Nlc3NJbXBsKCk7Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhcGFiaWxpdHlQYXR0ZXJuIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKCkgewotCQlDYXBhYmlsaXR5UGF0dGVybkltcGwgY2FwYWJpbGl0eVBhdHRlcm4gPSBuZXcgQ2FwYWJpbGl0eVBhdHRlcm5JbXBsKCk7Ci0JCXJldHVybiBjYXBhYmlsaXR5UGF0dGVybjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSB7Ci0JCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbCBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSA9IG5ldyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2FkbWFwIGNyZWF0ZVJvYWRtYXAoKSB7Ci0JCVJvYWRtYXBJbXBsIHJvYWRtYXAgPSBuZXcgUm9hZG1hcEltcGwoKTsKLQkJcmV0dXJuIHJvYWRtYXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnQgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpIHsKLQkJUHJvY2Vzc0NvbXBvbmVudEltcGwgcHJvY2Vzc0NvbXBvbmVudCA9IG5ldyBQcm9jZXNzQ29tcG9uZW50SW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1BhY2thZ2UgY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKSB7Ci0JCVByb2Nlc3NQYWNrYWdlSW1wbCBwcm9jZXNzUGFja2FnZSA9IG5ldyBQcm9jZXNzUGFja2FnZUltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKSB7Ci0JCVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgPSBuZXcgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIGNyZWF0ZVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKCkgewotCQlQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwgcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IgPSBuZXcgUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGx1Z2luIGNyZWF0ZU1ldGhvZFBsdWdpbigpIHsKLQkJTWV0aG9kUGx1Z2luSW1wbCBtZXRob2RQbHVnaW4gPSBuZXcgTWV0aG9kUGx1Z2luSW1wbCgpOwotCQlyZXR1cm4gbWV0aG9kUGx1Z2luOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb25JbXBsIG1ldGhvZENvbmZpZ3VyYXRpb24gPSBuZXcgTWV0aG9kQ29uZmlndXJhdGlvbkltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZENvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NGYW1pbHkgY3JlYXRlUHJvY2Vzc0ZhbWlseSgpIHsKLQkJUHJvY2Vzc0ZhbWlseUltcGwgcHJvY2Vzc0ZhbWlseSA9IG5ldyBQcm9jZXNzRmFtaWx5SW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc0ZhbWlseTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBjcmVhdGVNZXRob2RMaWJyYXJ5KCkgewotCQlNZXRob2RMaWJyYXJ5SW1wbCBtZXRob2RMaWJyYXJ5ID0gbmV3IE1ldGhvZExpYnJhcnlJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RMaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrT3JkZXJUeXBlIGNyZWF0ZVdvcmtPcmRlclR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsCi0JCQlTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCVdvcmtPcmRlclR5cGUgcmVzdWx0ID0gV29ya09yZGVyVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRXb3JrT3JkZXJUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCU9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQc2V1ZG9TdGF0ZUtpbmQgY3JlYXRlUHNldWRvU3RhdGVLaW5kRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlQc2V1ZG9TdGF0ZUtpbmQgcmVzdWx0ID0gUHNldWRvU3RhdGVLaW5kLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFBzZXVkb1N0YXRlS2luZFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsCi0JCQlPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGNyZWF0ZVZhcmlhYmlsaXR5VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCVN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIHJlc3VsdCA9IFZhcmlhYmlsaXR5VHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYXJpYWJpbGl0eVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERhdGUgY3JlYXRlRGF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKERhdGUpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydERhdGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVSSSBjcmVhdGVVcmlGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChVUkkpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFVyaVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBjcmVhdGVVbmxpbWl0ZWROYXR1cmFsRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEludGVnZXIpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFVubGltaXRlZE5hdHVyYWxUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlU3RyaW5nRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZykgc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U3RyaW5nVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCU9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2V0IGNyZWF0ZVNldEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFNldCkgc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U2V0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGNyZWF0ZVNlcXVlbmNlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKExpc3QpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFNlcXVlbmNlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCU9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBjcmVhdGVJbnRlZ2VyRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEludGVnZXIpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEludGVnZXJUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGbG9hdCBjcmVhdGVGbG9hdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEZsb2F0KSBzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRGbG9hdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hUGFja2FnZSBnZXRVbWFQYWNrYWdlKCkgewotCQlyZXR1cm4gKFVtYVBhY2thZ2UpIGdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVtYVBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvL1VtYUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9VbWFQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVW1hUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGY5YmQ0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9VbWFQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzA4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkxlYWZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZWFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBzZXVkb1N0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHNldWRvU3RhdGVLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGVNYWNoaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UcmFuc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZlcnRleDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuKjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFVtYVBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNsYXNzaWZpZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG5hbWVkRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwYWNrYWdlYWJsZUVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcGFja2FnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBuYW1lc3BhY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb25zdHJhaW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50RWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29udGVudERlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlY3Rpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrUHJvZHVjdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YXNrRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtEZWZpbml0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHN0ZXBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZ3VpZGFuY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXJ0aWZhY3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVsaXZlcmFibGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgb3V0Y29tZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RQYWNrYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbnRlbnRQYWNrYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvbGVEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YXNrRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBvaW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGdyYXBoRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkaWFncmFtRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkaWFncmFtTGlua0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBncmFwaENvbm5lY3RvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRpbWVuc2lvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZWZlcmVuY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvcGVydHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZ3JhcGhFZGdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRpYWdyYW1FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZ3JhcGhOb2RlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHVtYVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29yZVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbGVhZkVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGV4dEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaW1hZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZ3JhcGhpY1ByaW1pdGl2ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwb2x5bGluZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlbGxpcHNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFjdGl2aXR5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWlsZXN0b25lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGl0ZXJhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwaGFzZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0ZWFtUHJvZmlsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlRGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrT3JkZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0VsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcGxhbm5pbmdEYXRhRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFza0Rlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbXBvc2l0ZVJvbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb25jZXB0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNoZWNrbGlzdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBleGFtcGxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGd1aWRlbGluZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcmVwb3J0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRlbXBsYXRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0b29sTWVudG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdoaXRlcGFwZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGVybURlZmluaXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJhY3RpY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcmV1c2FibGVBc3NldEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzdGF0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB2ZXJ0ZXhFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcmVnaW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHN0YXRlTWFjaGluZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0cmFuc2l0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBzZXVkb1N0YXRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRpc2NpcGxpbmVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29udGVudENhdGVnb3J5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvbGVTZXRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZG9tYWluRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0VHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdG9vbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlU2V0R3JvdXBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVsaXZlcnlQcm9jZXNzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY2FwYWJpbGl0eVBhdHRlcm5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9hZG1hcEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzQ29tcG9uZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NQYWNrYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kUGx1Z2luRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHZhcmlhYmlsaXR5RWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RVbml0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0ZhbWlseUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RMaWJyYXJ5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gd29ya09yZGVyVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gcHNldWRvU3RhdGVLaW5kRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB2YXJpYWJpbGl0eVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkYXRlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHVyaUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB1bmxpbWl0ZWROYXR1cmFsRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHN0cmluZ0VEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBzZXRFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgc2VxdWVuY2VFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaW50ZWdlckVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBmbG9hdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFVtYVBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBVbWFGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVtYVBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKQotCQkJcmV0dXJuIChVbWFQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRQotCQkJCQkuZ2V0RVBhY2thZ2UoVW1hUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCVVtYVBhY2thZ2VJbXBsIHRoZVVtYVBhY2thZ2UgPSAoVW1hUGFja2FnZUltcGwpIChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRQotCQkJCS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIFVtYVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UKLQkJCQkuZ2V0RVBhY2thZ2UoZU5TX1VSSSkKLQkJCQk6IG5ldyBVbWFQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlVW1hUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZVVtYVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlVW1hUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlVW1hUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENsYXNzaWZpZXIoKSB7Ci0JCXJldHVybiBjbGFzc2lmaWVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE5hbWVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIG5hbWVkRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXROYW1lZEVsZW1lbnRfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBuYW1lZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBhY2thZ2VhYmxlRWxlbWVudCgpIHsKLQkJcmV0dXJuIHBhY2thZ2VhYmxlRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBwYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudCgpIHsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIG1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZEVsZW1lbnRfT3duZWRSdWxlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfU3VwcHJlc3NlZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIG1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiBjb25zdHJhaW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnN0cmFpbnRfQm9keSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBjb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBjb250ZW50RWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZXNjcmliYWJsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiBkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRlbnREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZWN0aW9uKCkgewotCQlyZXR1cm4gc2VjdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHNlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1NlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdGlvbl9TdWJTZWN0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdGlvbl9QcmVkZWNlc3NvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlKCkgewotCQlyZXR1cm4gcm9sZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlX01vZGlmaWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtQcm9kdWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtQcm9kdWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUYXNrKCkgewotCQlyZXR1cm4gdGFza0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrX1BlcmZvcm1lZEJ5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrX01hbmRhdG9yeUlucHV0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrX091dHB1dCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19PcHRpb25hbElucHV0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrX1N0ZXBzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrX1Rvb2xNZW50b3JzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHdvcmtEZWZpbml0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtEZWZpbml0aW9uX1ByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB3b3JrRGVmaW5pdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya0RlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFN0ZXAoKSB7Ci0JCXJldHVybiBzdGVwRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0R3VpZGFuY2UoKSB7Ci0JCXJldHVybiBndWlkYW5jZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFydGlmYWN0KCkgewotCQlyZXR1cm4gYXJ0aWZhY3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXJ0aWZhY3RfQ29udGFpbmVyQXJ0aWZhY3QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYXJ0aWZhY3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYXJ0aWZhY3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlbGl2ZXJhYmxlKCkgewotCQlyZXR1cm4gZGVsaXZlcmFibGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRlbGl2ZXJhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRPdXRjb21lKCkgewotCQlyZXR1cm4gb3V0Y29tZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZFBhY2thZ2UoKSB7Ci0JCXJldHVybiBtZXRob2RQYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIG1ldGhvZFBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RQYWNrYWdlX1JldXNlZFBhY2thZ2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZFBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kUGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29udGVudFBhY2thZ2UoKSB7Ci0JCXJldHVybiBjb250ZW50UGFja2FnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgY29udGVudFBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFydGlmYWN0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fQnJpZWZPdXRsaW5lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uT3B0aW9ucygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9SZWFzb25zRm9yTm90TmVlZGluZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gcm9sZURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdGlvbl9Ta2lsbHMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcm9sZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoCi0JCQkJMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHJvbGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KAotCQkJCTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSByb2xlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgKLQkJCQkyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhc2tEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHRhc2tEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB0YXNrRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgKLQkJCQkwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHRhc2tEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KAotCQkJCTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50cygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBvaW50KCkgewotCQlyZXR1cm4gcG9pbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9pbnRfWCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwb2ludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBvaW50X1koKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcG9pbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEdyYXBoRWxlbWVudCgpIHsKLQkJcmV0dXJuIGdyYXBoRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfUG9zaXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ3JhcGhFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0R3JhcGhFbGVtZW50X0NvbnRhaW5lZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBncmFwaEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfTGluaygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBncmFwaEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfQW5jaG9yYWdlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGdyYXBoRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoRWxlbWVudF9TZW1hbnRpY01vZGVsKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGdyYXBoRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGlhZ3JhbUVsZW1lbnQoKSB7Ci0JCXJldHVybiBkaWFncmFtRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaWFncmFtRWxlbWVudF9Jc1Zpc2libGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGlhZ3JhbUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtRWxlbWVudF9Db250YWluZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlhZ3JhbUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtRWxlbWVudF9SZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlhZ3JhbUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtRWxlbWVudF9Qcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaWFncmFtRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGlhZ3JhbUxpbmsoKSB7Ci0JCXJldHVybiBkaWFncmFtTGlua0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaWFncmFtTGlua19ab29tKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRpYWdyYW1MaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUxpbmtfVmlld3BvcnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlhZ3JhbUxpbmtFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtTGlua19HcmFwaEVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlhZ3JhbUxpbmtFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtTGlua19EaWFncmFtKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpYWdyYW1MaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHcmFwaENvbm5lY3RvcigpIHsKLQkJcmV0dXJuIGdyYXBoQ29ubmVjdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBncmFwaENvbm5lY3RvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWRnZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBncmFwaENvbm5lY3RvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpIHsKLQkJcmV0dXJuIHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9QcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgc2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlbWFudGljTW9kZWxCcmlkZ2VfR3JhcGhFbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZW1hbnRpY01vZGVsQnJpZGdlX0RpYWdyYW0oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgc2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGltZW5zaW9uKCkgewotCQlyZXR1cm4gZGltZW5zaW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERpbWVuc2lvbl9XaWR0aCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkaW1lbnNpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaW1lbnNpb25fSGVpZ2h0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRpbWVuc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlZmVyZW5jZV9Jc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSByZWZlcmVuY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2VfUmVmZXJlbmNlZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSByZWZlcmVuY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb3BlcnR5KCkgewotCQlyZXR1cm4gcHJvcGVydHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfS2V5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEdyYXBoRWRnZSgpIHsKLQkJcmV0dXJuIGdyYXBoRWRnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaEVkZ2VfQW5jaG9yKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGdyYXBoRWRnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoRWRnZV9XYXlwb2ludHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ3JhcGhFZGdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gZGlhZ3JhbUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaWFncmFtX1pvb20oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGlhZ3JhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERpYWdyYW1fVmlld3BvaW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpYWdyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtX0RpYWdyYW1MaW5rKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpYWdyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtX05hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaWFncmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHcmFwaE5vZGUoKSB7Ci0JCXJldHVybiBncmFwaE5vZGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0R3JhcGhOb2RlX1NpemUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ3JhcGhOb2RlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpIHsKLQkJcmV0dXJuIHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X1R5cGVJbmZvKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50RUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCkgewotCQlyZXR1cm4gdW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKSB7Ci0JCXJldHVybiBjb3JlU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb3JlU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRMZWFmRWxlbWVudCgpIHsKLQkJcmV0dXJuIGxlYWZFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGV4dEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0ZXh0RWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUZXh0RWxlbWVudF9UZXh0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHRleHRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGltYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEltYWdlX1VyaSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBpbWFnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEltYWdlX01pbWVUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGltYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHcmFwaGljUHJpbWl0aXZlKCkgewotCQlyZXR1cm4gZ3JhcGhpY1ByaW1pdGl2ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBvbHlsaW5lKCkgewotCQlyZXR1cm4gcG9seWxpbmVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9seWxpbmVfQ2xvc2VkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHBvbHlsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UG9seWxpbmVfV2F5cG9pbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHBvbHlsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFbGxpcHNlKCkgewotCQlyZXR1cm4gZWxsaXBzZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbGxpcHNlX1JhZGl1c1goKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZWxsaXBzZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVsbGlwc2VfUmFkaXVzWSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBlbGxpcHNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWxsaXBzZV9Sb3RhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBlbGxpcHNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWxsaXBzZV9TdGFydEFuZ2xlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGVsbGlwc2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbGxpcHNlX0VuZEFuZ2xlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGVsbGlwc2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbGxpcHNlX0NlbnRlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBlbGxpcHNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBY3Rpdml0eSgpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QWN0aXZpdHlfUm9hZG1hcHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QWN0aXZpdHlfQ2hlY2tsaXN0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFjdGl2aXR5X0NvbmNlcHRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QWN0aXZpdHlfRXhhbXBsZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9HdWlkZWxpbmVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QWN0aXZpdHlfUmV1c2FibGVBc3NldHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9Jc0VuYWN0YWJsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSB7Ci0JCXJldHVybiB3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEJyZWFrZG93bkVsZW1lbnQoKSB7Ci0JCXJldHVybiBicmVha2Rvd25FbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfUHJlZml4KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9IYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXRpZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWlsZXN0b25lKCkgewotCQlyZXR1cm4gbWlsZXN0b25lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SXRlcmF0aW9uKCkgewotCQlyZXR1cm4gaXRlcmF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UGhhc2UoKSB7Ci0JCXJldHVybiBwaGFzZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRlYW1Qcm9maWxlKCkgewotCQlyZXR1cm4gdGVhbVByb2ZpbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRlYW1Qcm9maWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRlYW1Qcm9maWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0ZWFtUHJvZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiByb2xlRGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJvbGVEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZURlc2NyaXB0b3JfTW9kaWZpZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcm9sZURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSByb2xlRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya09yZGVyKCkgewotCQlyZXR1cm4gd29ya09yZGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtPcmRlcl9MaW5rVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrT3JkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrT3JkZXJfUHJlZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB3b3JrT3JkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NFbGVtZW50KCkgewotCQlyZXR1cm4gcHJvY2Vzc0VsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQbGFubmluZ0RhdGEoKSB7Ci0JCXJldHVybiBwbGFubmluZ0RhdGFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfRmluaXNoRGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfUmFuaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBkZXNjcmlwdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhc2tEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gdGFza0Rlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb21wb3NpdGVSb2xlKCkgewotCQlyZXR1cm4gY29tcG9zaXRlUm9sZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjb21wb3NpdGVSb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX0V4dGVybmFsSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb25jZXB0KCkgewotCQlyZXR1cm4gY29uY2VwdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENoZWNrbGlzdCgpIHsKLQkJcmV0dXJuIGNoZWNrbGlzdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEV4YW1wbGUoKSB7Ci0JCXJldHVybiBleGFtcGxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0R3VpZGVsaW5lKCkgewotCQlyZXR1cm4gZ3VpZGVsaW5lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVwb3J0KCkgewotCQlyZXR1cm4gcmVwb3J0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGVtcGxhdGUoKSB7Ci0JCXJldHVybiB0ZW1wbGF0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpIHsKLQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRvb2xNZW50b3IoKSB7Ci0JCXJldHVybiB0b29sTWVudG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V2hpdGVwYXBlcigpIHsKLQkJcmV0dXJuIHdoaXRlcGFwZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUZXJtRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHRlcm1EZWZpbml0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJhY3RpY2UoKSB7Ci0JCXJldHVybiBwcmFjdGljZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcmFjdGljZV9TdWJQcmFjdGljZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJhY3RpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcmFjdGljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcmFjdGljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmV1c2FibGVBc3NldCgpIHsKLQkJcmV0dXJuIHJldXNhYmxlQXNzZXRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTdGF0ZSgpIHsKLQkJcmV0dXJuIHN0YXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFN0YXRlX1dvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHN0YXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U3RhdGVfUmVnaW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHN0YXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U3RhdGVfU3VibWFjaGluZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBzdGF0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VmVydGV4KCkgewotCQlyZXR1cm4gdmVydGV4RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFZlcnRleF9Db250YWluZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdmVydGV4RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VmVydGV4X091dGdvaW5nKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHZlcnRleEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFZlcnRleF9JbmNvbWluZygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB2ZXJ0ZXhFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlZ2lvbigpIHsKLQkJcmV0dXJuIHJlZ2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZWdpb25fVmVydGV4KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJlZ2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlZ2lvbl9UcmFuc2l0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJlZ2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlZ2lvbl9TdGF0ZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSByZWdpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZWdpb25fU3RhdGVNYWNoaW5lKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJlZ2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U3RhdGVNYWNoaW5lKCkgewotCQlyZXR1cm4gc3RhdGVNYWNoaW5lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFN0YXRlTWFjaGluZV9SZWdpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgc3RhdGVNYWNoaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUcmFuc2l0aW9uKCkgewotCQlyZXR1cm4gdHJhbnNpdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUcmFuc2l0aW9uX1dvcmtEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRyYW5zaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUcmFuc2l0aW9uX0NvbnRhaW5lcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0cmFuc2l0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VHJhbnNpdGlvbl9Tb3VyY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdHJhbnNpdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRyYW5zaXRpb25fVGFyZ2V0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRyYW5zaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBzZXVkb1N0YXRlKCkgewotCQlyZXR1cm4gcHNldWRvU3RhdGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREaXNjaXBsaW5lKCkgewotCQlyZXR1cm4gZGlzY2lwbGluZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaXNjaXBsaW5lX1Rhc2tzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpc2NpcGxpbmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaXNjaXBsaW5lX1N1YmRpc2NpcGxpbmUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlzY2lwbGluZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpc2NpcGxpbmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRlbnRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIGNvbnRlbnRDYXRlZ29yeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvbGVTZXQoKSB7Ci0JCXJldHVybiByb2xlU2V0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJvbGVTZXRfUm9sZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcm9sZVNldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RG9tYWluKCkgewotCQlyZXR1cm4gZG9tYWluRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZG9tYWluRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9tYWluX1N1YmRvbWFpbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZG9tYWluRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrUHJvZHVjdFR5cGUoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdFR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB3b3JrUHJvZHVjdFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgKLQkJCQkwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERpc2NpcGxpbmVHcm91cGluZygpIHsKLQkJcmV0dXJuIGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUb29sKCkgewotCQlyZXR1cm4gdG9vbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUb29sX1Rvb2xNZW50b3JzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRvb2xFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvbGVTZXRHcm91cGluZygpIHsKLQkJcmV0dXJuIHJvbGVTZXRHcm91cGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcm9sZVNldEdyb3VwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoCi0JCQkJMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDdXN0b21DYXRlZ29yeSgpIHsKLQkJcmV0dXJuIGN1c3RvbUNhdGVnb3J5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yaWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGN1c3RvbUNhdGVnb3J5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZWxpdmVyeVByb2Nlc3MoKSB7Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFscygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkZWxpdmVyeVByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgKLQkJCQkwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGVsaXZlcnlQcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoCi0JCQkJMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzKCkgewotCQlyZXR1cm4gcHJvY2Vzc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NfRGVmYXVsdENvbnRleHQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENhcGFiaWxpdHlQYXR0ZXJuKCkgewotCQlyZXR1cm4gY2FwYWJpbGl0eVBhdHRlcm5FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpIHsKLQkJcmV0dXJuIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0Jhc2VkT25Qcm9jZXNzZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvYWRtYXAoKSB7Ci0JCXJldHVybiByb2FkbWFwRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc0NvbXBvbmVudCgpIHsKLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudF9JbnRlcmZhY2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc1BhY2thZ2UoKSB7Ci0JCXJldHVybiBwcm9jZXNzUGFja2FnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzUGFja2FnZV9Qcm9jZXNzRWxlbWVudHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc1BhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzUGFja2FnZV9EaWFncmFtcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcm9jZXNzUGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpIHsKLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VJTygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX1Byb2Nlc3NDb21wb25lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JFQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZFBsdWdpbigpIHsKLQkJcmV0dXJuIG1ldGhvZFBsdWdpbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbWV0aG9kUGx1Z2luRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZFBsdWdpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZFBsdWdpbl9CYXNlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFZhcmlhYmlsaXR5RWxlbWVudCgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5RWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHZhcmlhYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHZhcmlhYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kVW5pdCgpIHsKLQkJcmV0dXJuIG1ldGhvZFVuaXRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIG1ldGhvZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHRTdGF0ZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlld3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fQmFzZUNvbmZpZ3VyYXRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NGYW1pbHkoKSB7Ci0JCXJldHVybiBwcm9jZXNzRmFtaWx5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NGYW1pbHlfRGVsaXZlcnlQcm9jZXNzZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc0ZhbWlseUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kTGlicmFyeSgpIHsKLQkJcmV0dXJuIG1ldGhvZExpYnJhcnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW5zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZExpYnJhcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RMaWJyYXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFdvcmtPcmRlclR5cGUoKSB7Ci0JCXJldHVybiB3b3JrT3JkZXJUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFBzZXVkb1N0YXRlS2luZCgpIHsKLQkJcmV0dXJuIHBzZXVkb1N0YXRlS2luZEVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRWYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eVR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldERhdGUoKSB7Ci0JCXJldHVybiBkYXRlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VXJpKCkgewotCQlyZXR1cm4gdXJpRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VW5saW1pdGVkTmF0dXJhbCgpIHsKLQkJcmV0dXJuIHVubGltaXRlZE5hdHVyYWxFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRTdHJpbmcoKSB7Ci0JCXJldHVybiBzdHJpbmdFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRTZXQoKSB7Ci0JCXJldHVybiBzZXRFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIHNlcXVlbmNlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SW50ZWdlcigpIHsKLQkJcmV0dXJuIGludGVnZXJFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRGbG9hdCgpIHsKLQkJcmV0dXJuIGZsb2F0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFGYWN0b3J5IGdldFVtYUZhY3RvcnkoKSB7Ci0JCXJldHVybiAoVW1hRmFjdG9yeSkgZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpCi0JCQlyZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWNsYXNzaWZpZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0xBU1NJRklFUik7Ci0KLQkJdHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUWVBFKTsKLQotCQllbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEVMRU1FTlQpOwotCi0JCW5hbWVkRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhOQU1FRF9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShuYW1lZEVsZW1lbnRFQ2xhc3MsIE5BTUVEX0VMRU1FTlRfX05BTUUpOwotCi0JCXBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQQUNLQUdFQUJMRV9FTEVNRU5UKTsKLQotCQlwYWNrYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBBQ0tBR0UpOwotCi0JCW5hbWVzcGFjZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhOQU1FU1BBQ0UpOwotCi0JCW1ldGhvZEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19HVUlEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kRWxlbWVudEVDbGFzcywKLQkJCQlNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUpOwotCi0JCWNvbnN0cmFpbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OU1RSQUlOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29uc3RyYWludEVDbGFzcywgQ09OU1RSQUlOVF9fQk9EWSk7Ci0KLQkJbWV0aG9kRWxlbWVudFByb3BlcnR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9FTEVNRU5UX1BST1BFUlRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MsCi0JCQkJTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFKTsKLQotCQljb250ZW50RWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05URU5UX0VMRU1FTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRlbnRFbGVtZW50RUNsYXNzLAotCQkJCUNPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRlbnRFbGVtZW50RUNsYXNzLAotCQkJCUNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDT05URU5UX0VMRU1FTlRfX0FTU0VUUyk7Ci0KLQkJZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERFU0NSSUJBQkxFX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLAotCQkJCURFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLAotCQkJCURFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLAotCQkJCURFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OKTsKLQotCQljb250ZW50RGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEVOVF9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyk7Ci0KLQkJc2VjdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRUNUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN0aW9uRUNsYXNzLCBTRUNUSU9OX19TRUNUSU9OX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3Rpb25FQ2xhc3MsIFNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlY3Rpb25FQ2xhc3MsIFNFQ1RJT05fX1NVQl9TRUNUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdGlvbkVDbGFzcywgU0VDVElPTl9fUFJFREVDRVNTT1IpOwotCi0JCXJvbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZUVDbGFzcywgUk9MRV9fTU9ESUZJRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJvbGVFQ2xhc3MsIFJPTEVfX1JFU1BPTlNJQkxFX0ZPUik7Ci0KLQkJd29ya1Byb2R1Y3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrUHJvZHVjdEVDbGFzcywgV09SS19QUk9EVUNUX19SRVBPUlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrUHJvZHVjdEVDbGFzcywgV09SS19QUk9EVUNUX19URU1QTEFURVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtQcm9kdWN0RUNsYXNzLCBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya1Byb2R1Y3RFQ2xhc3MsCi0JCQkJV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQotCQl0YXNrRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBU0spOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tFQ2xhc3MsIFRBU0tfX1BFUkZPUk1FRF9CWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0VDbGFzcywgVEFTS19fTUFOREFUT1JZX0lOUFVUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRUNsYXNzLCBUQVNLX19PVVRQVVQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tFQ2xhc3MsIFRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tFQ2xhc3MsIFRBU0tfX09QVElPTkFMX0lOUFVUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRUNsYXNzLCBUQVNLX19TVEVQUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0VDbGFzcywgVEFTS19fVE9PTF9NRU5UT1JTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRUNsYXNzLCBUQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQotCQl3b3JrRGVmaW5pdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX0RFRklOSVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtEZWZpbml0aW9uRUNsYXNzLCBXT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya0RlZmluaXRpb25FQ2xhc3MsIFdPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTik7Ci0KLQkJc3RlcEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTVEVQKTsKLQotCQlndWlkYW5jZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHVUlEQU5DRSk7Ci0KLQkJYXJ0aWZhY3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVJUSUZBQ1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFydGlmYWN0RUNsYXNzLCBBUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcnRpZmFjdEVDbGFzcywgQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFMpOwotCi0JCWRlbGl2ZXJhYmxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFTElWRVJBQkxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkZWxpdmVyYWJsZUVDbGFzcywKLQkJCQlERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFMpOwotCi0JCW91dGNvbWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoT1VUQ09NRSk7Ci0KLQkJbWV0aG9kUGFja2FnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfUEFDS0FHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGFja2FnZUVDbGFzcywgTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kUGFja2FnZUVDbGFzcywgTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kUGFja2FnZUVDbGFzcywgTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTKTsKLQotCQljb250ZW50UGFja2FnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05URU5UX1BBQ0tBR0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRlbnRQYWNrYWdlRUNsYXNzLAotCQkJCUNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUyk7Ci0KLQkJYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBUlRJRkFDVF9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlBUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUyk7Ci0KLQkJd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HKTsKLQotCQlkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFTElWRVJBQkxFX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFKTsKLQotCQlyb2xlRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZURlc2NyaXB0aW9uRUNsYXNzLCBST0xFX0RFU0NSSVBUSU9OX19TS0lMTFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVEZXNjcmlwdGlvbkVDbGFzcywgUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVMpOwotCi0JCXRhc2tEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQVNLX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRpb25FQ2xhc3MsIFRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdGlvbkVDbGFzcywgVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTKTsKLQotCQlndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdVSURBTkNFX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUyk7Ci0KLQkJcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUkFDVElDRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlQUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLCBQUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT04pOwotCi0JCXBvaW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBPSU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb2ludEVDbGFzcywgUE9JTlRfX1gpOwotCQljcmVhdGVFQXR0cmlidXRlKHBvaW50RUNsYXNzLCBQT0lOVF9fWSk7Ci0KLQkJZ3JhcGhFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEdSQVBIX0VMRU1FTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGdyYXBoRWxlbWVudEVDbGFzcywgR1JBUEhfRUxFTUVOVF9fUE9TSVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGdyYXBoRWxlbWVudEVDbGFzcywgR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShncmFwaEVsZW1lbnRFQ2xhc3MsIEdSQVBIX0VMRU1FTlRfX0xJTkspOwotCQljcmVhdGVFUmVmZXJlbmNlKGdyYXBoRWxlbWVudEVDbGFzcywgR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShncmFwaEVsZW1lbnRFQ2xhc3MsIEdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMKTsKLQotCQlkaWFncmFtRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhESUFHUkFNX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGRpYWdyYW1FbGVtZW50RUNsYXNzLCBESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpYWdyYW1FbGVtZW50RUNsYXNzLCBESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlhZ3JhbUVsZW1lbnRFQ2xhc3MsIERJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaWFncmFtRWxlbWVudEVDbGFzcywgRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWSk7Ci0KLQkJZGlhZ3JhbUxpbmtFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElBR1JBTV9MSU5LKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaWFncmFtTGlua0VDbGFzcywgRElBR1JBTV9MSU5LX19aT09NKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaWFncmFtTGlua0VDbGFzcywgRElBR1JBTV9MSU5LX19WSUVXUE9SVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlhZ3JhbUxpbmtFQ2xhc3MsIERJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlhZ3JhbUxpbmtFQ2xhc3MsIERJQUdSQU1fTElOS19fRElBR1JBTSk7Ci0KLQkJZ3JhcGhDb25uZWN0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1JBUEhfQ09OTkVDVE9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShncmFwaENvbm5lY3RvckVDbGFzcywgR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShncmFwaENvbm5lY3RvckVDbGFzcywgR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFKTsKLQotCQlzZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFTUFOVElDX01PREVMX0JSSURHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcywKLQkJCQlTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcywKLQkJCQlTRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MsCi0JCQkJU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNKTsKLQotCQlkaW1lbnNpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElNRU5TSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaW1lbnNpb25FQ2xhc3MsIERJTUVOU0lPTl9fV0lEVEgpOwotCQljcmVhdGVFQXR0cmlidXRlKGRpbWVuc2lvbkVDbGFzcywgRElNRU5TSU9OX19IRUlHSFQpOwotCi0JCXJlZmVyZW5jZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRUZFUkVOQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlZmVyZW5jZUVDbGFzcywKLQkJCQlSRUZFUkVOQ0VfX0lTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlZmVyZW5jZUVDbGFzcywgUkVGRVJFTkNFX19SRUZFUkVOQ0VEKTsKLQotCQlwcm9wZXJ0eUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9QRVJUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvcGVydHlFQ2xhc3MsIFBST1BFUlRZX19LRVkpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5RUNsYXNzLCBQUk9QRVJUWV9fVkFMVUUpOwotCi0JCWdyYXBoRWRnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHUkFQSF9FREdFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShncmFwaEVkZ2VFQ2xhc3MsIEdSQVBIX0VER0VfX0FOQ0hPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhFZGdlRUNsYXNzLCBHUkFQSF9FREdFX19XQVlQT0lOVFMpOwotCi0JCWRpYWdyYW1FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElBR1JBTSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlhZ3JhbUVDbGFzcywgRElBR1JBTV9fWk9PTSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlhZ3JhbUVDbGFzcywgRElBR1JBTV9fVklFV1BPSU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaWFncmFtRUNsYXNzLCBESUFHUkFNX19ESUFHUkFNX0xJTkspOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpYWdyYW1FQ2xhc3MsIERJQUdSQU1fX05BTUVTUEFDRSk7Ci0KLQkJZ3JhcGhOb2RlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdSQVBIX05PREUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGdyYXBoTm9kZUVDbGFzcywgR1JBUEhfTk9ERV9fU0laRSk7Ci0KLQkJc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50RUNsYXNzLAotCQkJCVNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19UWVBFX0lORk8pOwotCi0JCXVtYVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVU1BX1NFTUFOVElDX01PREVMX0JSSURHRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcywKLQkJCQlVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UKTsKLQotCQljb3JlU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29yZVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MsCi0JCQkJQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQpOwotCi0JCWxlYWZFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKExFQUZfRUxFTUVOVCk7Ci0KLQkJdGV4dEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVYVF9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0ZXh0RWxlbWVudEVDbGFzcywgVEVYVF9FTEVNRU5UX19URVhUKTsKLQotCQlpbWFnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTUFHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaW1hZ2VFQ2xhc3MsIElNQUdFX19VUkkpOwotCQljcmVhdGVFQXR0cmlidXRlKGltYWdlRUNsYXNzLCBJTUFHRV9fTUlNRV9UWVBFKTsKLQotCQlncmFwaGljUHJpbWl0aXZlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdSQVBISUNfUFJJTUlUSVZFKTsKLQotCQlwb2x5bGluZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT0xZTElORSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9seWxpbmVFQ2xhc3MsIFBPTFlMSU5FX19DTE9TRUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHBvbHlsaW5lRUNsYXNzLCBQT0xZTElORV9fV0FZUE9JTlRTKTsKLQotCQllbGxpcHNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVMTElQU0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGVsbGlwc2VFQ2xhc3MsIEVMTElQU0VfX1JBRElVU19YKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbGxpcHNlRUNsYXNzLCBFTExJUFNFX19SQURJVVNfWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWxsaXBzZUVDbGFzcywgRUxMSVBTRV9fUk9UQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGVsbGlwc2VFQ2xhc3MsIEVMTElQU0VfX1NUQVJUX0FOR0xFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbGxpcHNlRUNsYXNzLCBFTExJUFNFX19FTkRfQU5HTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVsbGlwc2VFQ2xhc3MsIEVMTElQU0VfX0NFTlRFUik7Ci0KLQkJYWN0aXZpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUNUSVZJVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX1JPQURNQVBTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUxTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX0NIRUNLTElTVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fQ09OQ0VQVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fRVhBTVBMRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fR1VJREVMSU5FUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19SRVVTQUJMRV9BU1NFVFMpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFKTsKLQotCQl3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX0JSRUFLRE9XTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4pOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCVdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1IpOwotCi0JCWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQlJFQUtET1dOX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVgpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTKTsKLQotCQltaWxlc3RvbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUlMRVNUT05FKTsKLQotCQlpdGVyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVRFUkFUSU9OKTsKLQotCQlwaGFzZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQSEFTRSk7Ci0KLQkJdGVhbVByb2ZpbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVBTV9QUk9GSUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0ZWFtUHJvZmlsZUVDbGFzcywgVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0ZWFtUHJvZmlsZUVDbGFzcywgVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0ZWFtUHJvZmlsZUVDbGFzcywgVEVBTV9QUk9GSUxFX19TVUJfVEVBTSk7Ci0KLQkJcm9sZURlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9ERVNDUklQVE9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyb2xlRGVzY3JpcHRvckVDbGFzcywgUk9MRV9ERVNDUklQVE9SX19ST0xFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyb2xlRGVzY3JpcHRvckVDbGFzcywgUk9MRV9ERVNDUklQVE9SX19NT0RJRklFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZURlc2NyaXB0b3JFQ2xhc3MsIFJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SKTsKLQotCQl3b3JrT3JkZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19PUkRFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya09yZGVyRUNsYXNzLCBXT1JLX09SREVSX19MSU5LX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtPcmRlckVDbGFzcywgV09SS19PUkRFUl9fUFJFRCk7Ci0KLQkJcHJvY2Vzc0VsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19FTEVNRU5UKTsKLQotCQlwbGFubmluZ0RhdGFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUExBTk5JTkdfREFUQSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGxhbm5pbmdEYXRhRUNsYXNzLCBQTEFOTklOR19EQVRBX19TVEFSVF9EQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwbGFubmluZ0RhdGFFQ2xhc3MsIFBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwbGFubmluZ0RhdGFFQ2xhc3MsIFBMQU5OSU5HX0RBVEFfX1JBTkspOwotCi0JCWRlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpcHRvckVDbGFzcywKLQkJCQlERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UpOwotCi0JCXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTKTsKLQotCQl0YXNrRGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQVNLX0RFU0NSSVBUT1IpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX1RBU0spOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLAotCQkJCVRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19PVVRQVVQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLAotCQkJCVRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fU0VMRUNURURfU1RFUFMpOwotCi0JCWNvbXBvc2l0ZVJvbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09NUE9TSVRFX1JPTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbXBvc2l0ZVJvbGVFQ2xhc3MsIENPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTKTsKLQotCQlicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UpOwotCi0JCWFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUNUSVZJVFlfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlBQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XVE9fU1RBRkYpOwotCi0JCWRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVCk7Ci0KLQkJcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlQUk9DRVNTX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBQUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTKTsKLQotCQlkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVTQ1JJUFRPUl9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT04pOwotCi0JCWNvbmNlcHRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OQ0VQVCk7Ci0KLQkJY2hlY2tsaXN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKENIRUNLTElTVCk7Ci0KLQkJZXhhbXBsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFWEFNUExFKTsKLQotCQlndWlkZWxpbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1VJREVMSU5FKTsKLQotCQlyZXBvcnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVQT1JUKTsKLQotCQl0ZW1wbGF0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhURU1QTEFURSk7Ci0KLQkJc3VwcG9ydGluZ01hdGVyaWFsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNVUFBPUlRJTkdfTUFURVJJQUwpOwotCi0JCXRvb2xNZW50b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVE9PTF9NRU5UT1IpOwotCi0JCXdoaXRlcGFwZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV0hJVEVQQVBFUik7Ci0KLQkJdGVybURlZmluaXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVSTV9ERUZJTklUSU9OKTsKLQotCQlwcmFjdGljZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUkFDVElDRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJhY3RpY2VFQ2xhc3MsIFBSQUNUSUNFX19TVUJfUFJBQ1RJQ0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcmFjdGljZUVDbGFzcywgUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJhY3RpY2VFQ2xhc3MsIFBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0VTKTsKLQotCQllc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0KLQkJcmV1c2FibGVBc3NldEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRVVTQUJMRV9BU1NFVCk7Ci0KLQkJc3RhdGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1RBVEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHN0YXRlRUNsYXNzLCBTVEFURV9fV09SS19QUk9EVUNUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzdGF0ZUVDbGFzcywgU1RBVEVfX1JFR0lPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc3RhdGVFQ2xhc3MsIFNUQVRFX19TVUJNQUNISU5FKTsKLQotCQl2ZXJ0ZXhFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVkVSVEVYKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh2ZXJ0ZXhFQ2xhc3MsIFZFUlRFWF9fQ09OVEFJTkVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh2ZXJ0ZXhFQ2xhc3MsIFZFUlRFWF9fT1VUR09JTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKHZlcnRleEVDbGFzcywgVkVSVEVYX19JTkNPTUlORyk7Ci0KLQkJcmVnaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFR0lPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVnaW9uRUNsYXNzLCBSRUdJT05fX1ZFUlRFWCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVnaW9uRUNsYXNzLCBSRUdJT05fX1RSQU5TSVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlZ2lvbkVDbGFzcywgUkVHSU9OX19TVEFURSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVnaW9uRUNsYXNzLCBSRUdJT05fX1NUQVRFX01BQ0hJTkUpOwotCi0JCXN0YXRlTWFjaGluZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTVEFURV9NQUNISU5FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzdGF0ZU1hY2hpbmVFQ2xhc3MsIFNUQVRFX01BQ0hJTkVfX1JFR0lPTik7Ci0KLQkJdHJhbnNpdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUUkFOU0lUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0cmFuc2l0aW9uRUNsYXNzLCBUUkFOU0lUSU9OX19XT1JLX0RFRklOSVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHRyYW5zaXRpb25FQ2xhc3MsIFRSQU5TSVRJT05fX0NPTlRBSU5FUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodHJhbnNpdGlvbkVDbGFzcywgVFJBTlNJVElPTl9fU09VUkNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0cmFuc2l0aW9uRUNsYXNzLCBUUkFOU0lUSU9OX19UQVJHRVQpOwotCi0JCXBzZXVkb1N0YXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBTRVVET19TVEFURSk7Ci0KLQkJZGlzY2lwbGluZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhESVNDSVBMSU5FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaXNjaXBsaW5lRUNsYXNzLCBESVNDSVBMSU5FX19UQVNLUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlzY2lwbGluZUVDbGFzcywgRElTQ0lQTElORV9fU1VCRElTQ0lQTElORSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlzY2lwbGluZUVDbGFzcywgRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XUyk7Ci0KLQkJY29udGVudENhdGVnb3J5RUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlRFTlRfQ0FURUdPUlkpOwotCi0JCXJvbGVTZXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9TRVQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJvbGVTZXRFQ2xhc3MsIFJPTEVfU0VUX19ST0xFUyk7Ci0KLQkJZG9tYWluRUNsYXNzID0gY3JlYXRlRUNsYXNzKERPTUFJTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZG9tYWluRUNsYXNzLCBET01BSU5fX1dPUktfUFJPRFVDVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRvbWFpbkVDbGFzcywgRE9NQUlOX19TVUJET01BSU5TKTsKLQotCQl3b3JrUHJvZHVjdFR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtQcm9kdWN0VHlwZUVDbGFzcywKLQkJCQlXT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUUyk7Ci0KLQkJZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKERJU0NJUExJTkVfR1JPVVBJTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcywKLQkJCQlESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUyk7Ci0KLQkJdG9vbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUT09MKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0b29sRUNsYXNzLCBUT09MX19UT09MX01FTlRPUlMpOwotCi0JCXJvbGVTZXRHcm91cGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX1NFVF9HUk9VUElORyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZVNldEdyb3VwaW5nRUNsYXNzLCBST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTKTsKLQotCQljdXN0b21DYXRlZ29yeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDVVNUT01fQ0FURUdPUlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKGN1c3RvbUNhdGVnb3J5RUNsYXNzLAotCQkJCUNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGN1c3RvbUNhdGVnb3J5RUNsYXNzLCBDVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SSUVTKTsKLQotCQlkZWxpdmVyeVByb2Nlc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVMSVZFUllfUFJPQ0VTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGVsaXZlcnlQcm9jZXNzRUNsYXNzLAotCQkJCURFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcywKLQkJCQlERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFMpOwotCi0JCXByb2Nlc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0VDbGFzcywgUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NFQ2xhc3MsIFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0VDbGFzcywgUFJPQ0VTU19fVkFMSURfQ09OVEVYVCk7Ci0KLQkJY2FwYWJpbGl0eVBhdHRlcm5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0FQQUJJTElUWV9QQVRURVJOKTsKLQotCQlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcywKLQkJCQlQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFRF9PTl9QUk9DRVNTRVMpOwotCi0JCXJvYWRtYXBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9BRE1BUCk7Ci0KLQkJcHJvY2Vzc0NvbXBvbmVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX0NPTVBPTkVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NDb21wb25lbnRFQ2xhc3MsIFBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTKTsKLQotCQlwcm9jZXNzUGFja2FnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX1BBQ0tBR0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NQYWNrYWdlRUNsYXNzLAotCQkJCVBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc1BhY2thZ2VFQ2xhc3MsIFBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVMpOwotCi0JCXByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLAotCQkJCVBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLAotCQkJCVBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPKTsKLQotCQlwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckVDbGFzcywKLQkJCQlQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUk9DRVNTX0NPTVBPTkVOVCk7Ci0KLQkJbWV0aG9kUGx1Z2luRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9QTFVHSU4pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFBsdWdpbkVDbGFzcywgTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RQbHVnaW5FQ2xhc3MsIE1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kUGx1Z2luRUNsYXNzLCBNRVRIT0RfUExVR0lOX19CQVNFUyk7Ci0KLQkJdmFyaWFiaWxpdHlFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFZBUklBQklMSVRZX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHZhcmlhYmlsaXR5RWxlbWVudEVDbGFzcywKLQkJCQlWQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh2YXJpYWJpbGl0eUVsZW1lbnRFQ2xhc3MsCi0JCQkJVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCk7Ci0KLQkJbWV0aG9kVW5pdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfVU5JVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kVW5pdEVDbGFzcywgTUVUSE9EX1VOSVRfX0FVVEhPUlMpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19DSEFOR0VfREFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kVW5pdEVDbGFzcywgTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kVW5pdEVDbGFzcywgTUVUSE9EX1VOSVRfX1ZFUlNJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UKTsKLQotCQltZXRob2RDb25maWd1cmF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9DT05GSUdVUkFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLAotCQkJCU1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywKLQkJCQlNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLAotCQkJCU1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLAotCQkJCU1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVcpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsCi0JCQkJTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsCi0JCQkJTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsCi0JCQkJTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZKTsKLQotCQlwcm9jZXNzRmFtaWx5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfRkFNSUxZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzRmFtaWx5RUNsYXNzLAotCQkJCVBST0NFU1NfRkFNSUxZX19ERUxJVkVSWV9QUk9DRVNTRVMpOwotCi0JCW1ldGhvZExpYnJhcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX0xJQlJBUlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZExpYnJhcnlFQ2xhc3MsIE1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kTGlicmFyeUVDbGFzcywKLQkJCQlNRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUyk7Ci0KLQkJLy8gQ3JlYXRlIGVudW1zCi0JCXdvcmtPcmRlclR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFdPUktfT1JERVJfVFlQRSk7Ci0JCXBzZXVkb1N0YXRlS2luZEVFbnVtID0gY3JlYXRlRUVudW0oUFNFVURPX1NUQVRFX0tJTkQpOwotCQl2YXJpYWJpbGl0eVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFZBUklBQklMSVRZX1RZUEUpOwotCi0JCS8vIENyZWF0ZSBkYXRhIHR5cGVzCi0JCWRhdGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoREFURSk7Ci0JCXVyaUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShVUkkpOwotCQl1bmxpbWl0ZWROYXR1cmFsRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFVOTElNSVRFRF9OQVRVUkFMKTsKLQkJc3RyaW5nRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFNUUklORyk7Ci0JCXNldEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShTRVQpOwotCQlzZXF1ZW5jZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShTRVFVRU5DRSk7Ci0JCWludGVnZXJFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoSU5URUdFUik7Ci0JCWZsb2F0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEZMT0FUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKQotCQkJcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWNsYXNzaWZpZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRUeXBlKCkpOwotCQl0eXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UGFja2FnZWFibGVFbGVtZW50KCkpOwotCQluYW1lZEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFbGVtZW50KCkpOwotCQlwYWNrYWdlYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROYW1lZEVsZW1lbnQoKSk7Ci0JCXBhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROYW1lc3BhY2UoKSk7Ci0JCXBhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQYWNrYWdlYWJsZUVsZW1lbnQoKSk7Ci0JCW5hbWVzcGFjZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5hbWVkRWxlbWVudCgpKTsKLQkJbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBhY2thZ2VhYmxlRWxlbWVudCgpKTsKLQkJY29uc3RyYWludEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCW1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldFBhY2thZ2VhYmxlRWxlbWVudCgpKTsKLQkJY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZXNjcmliYWJsZUVsZW1lbnQoKSk7Ci0JCWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCkpOwotCQlkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQlkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDbGFzc2lmaWVyKCkpOwotCQljb250ZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQlzZWN0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCkpOwotCQlyb2xlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCXdvcmtQcm9kdWN0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCXRhc2tFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJdGFza0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtEZWZpbml0aW9uKCkpOwotCQl3b3JrRGVmaW5pdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCXN0ZXBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRTZWN0aW9uKCkpOwotCQlzdGVwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya0RlZmluaXRpb24oKSk7Ci0JCWd1aWRhbmNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCWFydGlmYWN0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCWRlbGl2ZXJhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCW91dGNvbWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJbWV0aG9kUGFja2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCW1ldGhvZFBhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQYWNrYWdlKCkpOwotCQljb250ZW50UGFja2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSk7Ci0JCWFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkpOwotCQl3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpKTsKLQkJcm9sZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkKLQkJCQkuYWRkKHRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQl0YXNrRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKQotCQkJCS5hZGQodGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCWd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCXByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCWdyYXBoRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERpYWdyYW1FbGVtZW50KCkpOwotCQlkaWFncmFtRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCWRpYWdyYW1MaW5rRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnQoKSk7Ci0JCWdyYXBoQ29ubmVjdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3JhcGhFbGVtZW50KCkpOwotCQlzZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkKLQkJCQkuYWRkKHRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnQoKSk7Ci0JCXJlZmVyZW5jZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERpYWdyYW1FbGVtZW50KCkpOwotCQlwcm9wZXJ0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERpYWdyYW1FbGVtZW50KCkpOwotCQlncmFwaEVkZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHcmFwaEVsZW1lbnQoKSk7Ci0JCWRpYWdyYW1FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHcmFwaE5vZGUoKSk7Ci0JCWdyYXBoTm9kZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEdyYXBoRWxlbWVudCgpKTsKLQkJc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRTZW1hbnRpY01vZGVsQnJpZGdlKCkpOwotCQl1bWFTZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpKTsKLQkJY29yZVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRTZW1hbnRpY01vZGVsQnJpZGdlKCkpOwotCQlsZWFmRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERpYWdyYW1FbGVtZW50KCkpOwotCQl0ZXh0RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldExlYWZFbGVtZW50KCkpOwotCQlpbWFnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldExlYWZFbGVtZW50KCkpOwotCQlncmFwaGljUHJpbWl0aXZlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TGVhZkVsZW1lbnQoKSk7Ci0JCXBvbHlsaW5lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3JhcGhpY1ByaW1pdGl2ZSgpKTsKLQkJZWxsaXBzZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEdyYXBoaWNQcmltaXRpdmUoKSk7Ci0JCWFjdGl2aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCWFjdGl2aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCkpOwotCQlhY3Rpdml0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtEZWZpbml0aW9uKCkpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzRWxlbWVudCgpKTsKLQkJbWlsZXN0b25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCWl0ZXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFjdGl2aXR5KCkpOwotCQlwaGFzZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFjdGl2aXR5KCkpOwotCQl0ZWFtUHJvZmlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCXJvbGVEZXNjcmlwdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVzY3JpcHRvcigpKTsKLQkJd29ya09yZGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2Vzc0VsZW1lbnQoKSk7Ci0JCXByb2Nlc3NFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkpOwotCQlwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzRWxlbWVudCgpKTsKLQkJZGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERlc2NyaXB0b3IoKSk7Ci0JCXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVzY3JpcHRvcigpKTsKLQkJY29tcG9zaXRlUm9sZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFJvbGVEZXNjcmlwdG9yKCkpOwotCQlicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCWFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSk7Ci0JCWRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpOwotCQlwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkpOwotCQlkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSk7Ci0JCWNvbmNlcHRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJY2hlY2tsaXN0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWV4YW1wbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJZ3VpZGVsaW5lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXJlcG9ydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQl0ZW1wbGF0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlzdXBwb3J0aW5nTWF0ZXJpYWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJdG9vbE1lbnRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQl3aGl0ZXBhcGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29uY2VwdCgpKTsKLQkJdGVybURlZmluaXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJcHJhY3RpY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXJldXNhYmxlQXNzZXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJc3RhdGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRWZXJ0ZXgoKSk7Ci0JCXN0YXRlTWFjaGluZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtEZWZpbml0aW9uKCkpOwotCQlwc2V1ZG9TdGF0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFZlcnRleCgpKTsKLQkJZGlzY2lwbGluZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJY29udGVudENhdGVnb3J5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCXJvbGVTZXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWRvbWFpbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJd29ya1Byb2R1Y3RUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQlkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKQotCQkJCS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCXRvb2xFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCXJvbGVTZXRHcm91cGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3MoKSk7Ci0JCXByb2Nlc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBY3Rpdml0eSgpKTsKLQkJY2FwYWJpbGl0eVBhdHRlcm5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzKCkpOwotCQlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3MoKSk7Ci0JCXJvYWRtYXBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3NQYWNrYWdlKCkpOwotCQlwcm9jZXNzQ29tcG9uZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kVW5pdCgpKTsKLQkJcHJvY2Vzc1BhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RQYWNrYWdlKCkpOwotCQlwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpKTsKLQkJcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXREZXNjcmlwdG9yKCkpOwotCQltZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQltZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQYWNrYWdlKCkpOwotCQl2YXJpYWJpbGl0eUVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQltZXRob2RVbml0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFVuaXQoKSk7Ci0JCXByb2Nlc3NGYW1pbHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQltZXRob2RMaWJyYXJ5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kVW5pdCgpKTsKLQkJbWV0aG9kTGlicmFyeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBhY2thZ2UoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcygKLQkJCQljbGFzc2lmaWVyRUNsYXNzLAotCQkJCUNsYXNzaWZpZXIuY2xhc3MsCi0JCQkJIkNsYXNzaWZpZXIiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3ModHlwZUVDbGFzcywgVHlwZS5jbGFzcywKLQkJCQkiVHlwZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQllbGVtZW50RUNsYXNzLAotCQkJCUVsZW1lbnQuY2xhc3MsCi0JCQkJIkVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJbmFtZWRFbGVtZW50RUNsYXNzLAotCQkJCU5hbWVkRWxlbWVudC5jbGFzcywKLQkJCQkiTmFtZWRFbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJuYW1lIiwgIiIsIDAsIDEsIE5hbWVkRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwYWNrYWdlYWJsZUVsZW1lbnRFQ2xhc3MsCi0JCQkJUGFja2FnZWFibGVFbGVtZW50LmNsYXNzLAotCQkJCSJQYWNrYWdlYWJsZUVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcGFja2FnZUVDbGFzcywKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UuY2xhc3MsCi0JCQkJIlBhY2thZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCW5hbWVzcGFjZUVDbGFzcywKLQkJCQlOYW1lc3BhY2UuY2xhc3MsCi0JCQkJIk5hbWVzcGFjZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQltZXRob2RFbGVtZW50RUNsYXNzLAotCQkJCU1ldGhvZEVsZW1lbnQuY2xhc3MsCi0JCQkJIk1ldGhvZEVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RFbGVtZW50X0d1aWQoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJndWlkIiwgIiIsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJicmllZkRlc2NyaXB0aW9uIiwgIiIsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RFbGVtZW50X093bmVkUnVsZXMoKSwKLQkJCQl0aGlzLmdldENvbnN0cmFpbnQoKSwKLQkJCQludWxsLAotCQkJCSJvd25lZFJ1bGVzIiwgbnVsbCwgMCwgLTEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKSwKLQkJCQl0aGlzLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLAotCQkJCW51bGwsCi0JCQkJIm1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIsIG51bGwsIDAsIC0xLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE1ldGhvZEVsZW1lbnRfU3VwcHJlc3NlZCgpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbk9iamVjdCgpLAotCQkJCSJzdXBwcmVzc2VkIiwgImZhbHNlIiwgMCwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE1ldGhvZEVsZW1lbnRfT3JkZXJpbmdHdWlkZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJIm9yZGVyaW5nR3VpZGUiLCAiIiwgMCwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQljb25zdHJhaW50RUNsYXNzLAotCQkJCUNvbnN0cmFpbnQuY2xhc3MsCi0JCQkJIkNvbnN0cmFpbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0Q29uc3RyYWludF9Cb2R5KCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYm9keSIsICIiLCAwLCAxLCBDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCW1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcywKLQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkuY2xhc3MsCi0JCQkJIk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJ2YWx1ZSIsICIiLCAwLCAxLCBNZXRob2RFbGVtZW50UHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJY29udGVudEVsZW1lbnRFQ2xhc3MsCi0JCQkJQ29udGVudEVsZW1lbnQuY2xhc3MsCi0JCQkJIkNvbnRlbnRFbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCXRoaXMuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCksCi0JCQkJbnVsbCwKLQkJCQkic3VwcG9ydGluZ01hdGVyaWFscyIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQl0aGlzLmdldENvbmNlcHQoKSwKLQkJCQludWxsLAotCQkJCSJjb25jZXB0c0FuZFBhcGVycyIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLAotCQkJCXRoaXMuZ2V0Q2hlY2tsaXN0KCksCi0JCQkJbnVsbCwKLQkJCQkiY2hlY2tsaXN0cyIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCXRoaXMuZ2V0R3VpZGVsaW5lKCksCi0JCQkJbnVsbCwKLQkJCQkiZ3VpZGVsaW5lcyIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwKLQkJCQl0aGlzLmdldEV4YW1wbGUoKSwKLQkJCQludWxsLAotCQkJCSJleGFtcGxlcyIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksCi0JCQkJdGhpcy5nZXRSZXVzYWJsZUFzc2V0KCksCi0JCQkJbnVsbCwKLQkJCQkiYXNzZXRzIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLAotCQkJCURlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywKLQkJCQkiRGVzY3JpYmFibGVFbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwcmVzZW50YXRpb25OYW1lIiwgIiIsIDAsIDEsIERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb24oKSwKLQkJCQl0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpLAotCQkJCW51bGwsCi0JCQkJInByZXNlbnRhdGlvbiIsIG51bGwsIDAsIDEsIERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKSwKLQkJCQl0aGlzLmdldFVyaSgpLAotCQkJCSJzaGFwZWljb24iLCBudWxsLCAwLCAxLCBEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCksCi0JCQkJdGhpcy5nZXRVcmkoKSwKLQkJCQkibm9kZWljb24iLCBudWxsLCAwLCAxLCBEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlDb250ZW50RGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIkNvbnRlbnREZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkibWFpbkRlc2NyaXB0aW9uIiwgIiIsIDAsIDEsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpLAotCQkJCXRoaXMuZ2V0U2VjdGlvbigpLAotCQkJCW51bGwsCi0JCQkJInNlY3Rpb25zIiwgbnVsbCwgMCwgLTEsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJrZXlDb25zaWRlcmF0aW9ucyIsICIiLCAwLCAxLCBDb250ZW50RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJc2VjdGlvbkVDbGFzcywKLQkJCQlTZWN0aW9uLmNsYXNzLAotCQkJCSJTZWN0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFNlY3Rpb25fU2VjdGlvbk5hbWUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJzZWN0aW9uTmFtZSIsICIiLCAwLCAxLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0U2VjdGlvbl9TZWN0aW9uRGVzY3JpcHRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJzZWN0aW9uRGVzY3JpcHRpb24iLCAiIiwgMCwgMSwgU2VjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFNlY3Rpb25fU3ViU2VjdGlvbnMoKSwKLQkJCQl0aGlzLmdldFNlY3Rpb24oKSwKLQkJCQludWxsLAotCQkJCSJzdWJTZWN0aW9ucyIsIG51bGwsIDAsIC0xLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFNlY3Rpb25fUHJlZGVjZXNzb3IoKSwKLQkJCQl0aGlzLmdldFNlY3Rpb24oKSwKLQkJCQludWxsLAotCQkJCSJwcmVkZWNlc3NvciIsIG51bGwsIDAsIDEsIFNlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJvbGVFQ2xhc3MsCi0JCQkJUm9sZS5jbGFzcywKLQkJCQkiUm9sZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRSb2xlX01vZGlmaWVzKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdCgpLAotCQkJCW51bGwsCi0JCQkJIm1vZGlmaWVzIiwgbnVsbCwgMCwgLTEsIFJvbGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsICFJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdCgpLAotCQkJCW51bGwsCi0JCQkJInJlc3BvbnNpYmxlRm9yIiwgbnVsbCwgMCwgLTEsIFJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl3b3JrUHJvZHVjdEVDbGFzcywKLQkJCQlXb3JrUHJvZHVjdC5jbGFzcywKLQkJCQkiV29ya1Byb2R1Y3QiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdF9SZXBvcnRzKCksCi0JCQkJdGhpcy5nZXRSZXBvcnQoKSwKLQkJCQludWxsLAotCQkJCSJyZXBvcnRzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKSwKLQkJCQl0aGlzLmdldFRlbXBsYXRlKCksCi0JCQkJbnVsbCwKLQkJCQkidGVtcGxhdGVzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpLAotCQkJCXRoaXMuZ2V0VG9vbE1lbnRvcigpLAotCQkJCW51bGwsCi0JCQkJInRvb2xNZW50b3JzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwKLQkJCQl0aGlzLmdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLAotCQkJCW51bGwsCi0JCQkJImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXRhc2tFQ2xhc3MsCi0JCQkJVGFzay5jbGFzcywKLQkJCQkiVGFzayIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrX1BlcmZvcm1lZEJ5KCksCi0JCQkJdGhpcy5nZXRSb2xlKCksCi0JCQkJbnVsbCwKLQkJCQkicGVyZm9ybWVkQnkiLCBudWxsLCAwLCAxLCBUYXNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0KCksCi0JCQkJbnVsbCwKLQkJCQkibWFuZGF0b3J5SW5wdXQiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza19PdXRwdXQoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0KCksCi0JCQkJbnVsbCwKLQkJCQkib3V0cHV0IiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwKLQkJCQl0aGlzLmdldFJvbGUoKSwKLQkJCQludWxsLAotCQkJCSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0KCksCi0JCQkJbnVsbCwKLQkJCQkib3B0aW9uYWxJbnB1dCIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrX1N0ZXBzKCksCi0JCQkJdGhpcy5nZXRTdGVwKCksCi0JCQkJbnVsbCwKLQkJCQkic3RlcHMiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgIUlTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tfVG9vbE1lbnRvcnMoKSwKLQkJCQl0aGlzLmdldFRvb2xNZW50b3IoKSwKLQkJCQludWxsLAotCQkJCSJ0b29sTWVudG9ycyIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLAotCQkJCXRoaXMuZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksCi0JCQkJbnVsbCwKLQkJCQkiZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl3b3JrRGVmaW5pdGlvbkVDbGFzcywKLQkJCQlXb3JrRGVmaW5pdGlvbi5jbGFzcywKLQkJCQkiV29ya0RlZmluaXRpb24iLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKSwKLQkJCQl0aGlzLmdldENvbnN0cmFpbnQoKSwKLQkJCQludWxsLAotCQkJCSJwcmVjb25kaXRpb24iLCBudWxsLCAwLCAxLCBXb3JrRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKSwKLQkJCQl0aGlzLmdldENvbnN0cmFpbnQoKSwKLQkJCQludWxsLAotCQkJCSJwb3N0Y29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgV29ya0RlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJc3RlcEVDbGFzcywKLQkJCQlTdGVwLmNsYXNzLAotCQkJCSJTdGVwIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlndWlkYW5jZUVDbGFzcywKLQkJCQlHdWlkYW5jZS5jbGFzcywKLQkJCQkiR3VpZGFuY2UiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJYXJ0aWZhY3RFQ2xhc3MsCi0JCQkJQXJ0aWZhY3QuY2xhc3MsCi0JCQkJIkFydGlmYWN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEFydGlmYWN0X0NvbnRhaW5lckFydGlmYWN0KCksCi0JCQkJdGhpcy5nZXRBcnRpZmFjdCgpLAotCQkJCXRoaXMuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCksCi0JCQkJImNvbnRhaW5lckFydGlmYWN0IiwgbnVsbCwgMCwgMSwgQXJ0aWZhY3QuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKSwKLQkJCQl0aGlzLmdldEFydGlmYWN0KCksCi0JCQkJdGhpcy5nZXRBcnRpZmFjdF9Db250YWluZXJBcnRpZmFjdCgpLAotCQkJCSJjb250YWluZWRBcnRpZmFjdHMiLCBudWxsLCAwLCAtMSwgQXJ0aWZhY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRlbGl2ZXJhYmxlRUNsYXNzLAotCQkJCURlbGl2ZXJhYmxlLmNsYXNzLAotCQkJCSJEZWxpdmVyYWJsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0KCksCi0JCQkJbnVsbCwKLQkJCQkiZGVsaXZlcmVkV29ya1Byb2R1Y3RzIiwgbnVsbCwgMCwgLTEsIERlbGl2ZXJhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJb3V0Y29tZUVDbGFzcywKLQkJCQlPdXRjb21lLmNsYXNzLAotCQkJCSJPdXRjb21lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQltZXRob2RQYWNrYWdlRUNsYXNzLAotCQkJCU1ldGhvZFBhY2thZ2UuY2xhc3MsCi0JCQkJIk1ldGhvZFBhY2thZ2UiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbk9iamVjdCgpLAotCQkJCSJnbG9iYWwiLCAiZmFsc2UiLCAwLCAxLCBNZXRob2RQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlcygpLAotCQkJCXRoaXMuZ2V0TWV0aG9kUGFja2FnZSgpLAotCQkJCW51bGwsCi0JCQkJInJldXNlZFBhY2thZ2VzIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpLAotCQkJCXRoaXMuZ2V0TWV0aG9kUGFja2FnZSgpLAotCQkJCW51bGwsCi0JCQkJImNoaWxkUGFja2FnZXMiLCBudWxsLCAwLCAtMSwgTWV0aG9kUGFja2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJY29udGVudFBhY2thZ2VFQ2xhc3MsCi0JCQkJQ29udGVudFBhY2thZ2UuY2xhc3MsCi0JCQkJIkNvbnRlbnRQYWNrYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLAotCQkJCXRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJjb250ZW50RWxlbWVudHMiLCBudWxsLCAwLCAtMSwgQ29udGVudFBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQXJ0aWZhY3REZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiQXJ0aWZhY3REZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImJyaWVmT3V0bGluZSIsICIiLCAwLCAxLCBBcnRpZmFjdERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJyZXByZXNlbnRhdGlvbk9wdGlvbnMiLCAiIiwgMCwgMSwgQXJ0aWZhY3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIldvcmtQcm9kdWN0RGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9FeHRlcm5hbElkKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiZXh0ZXJuYWxJZCIsICIiLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicHVycG9zZSIsICIiLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImltcGFjdE9mTm90SGF2aW5nIiwgIiIsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicmVhc29uc0Zvck5vdE5lZWRpbmciLCAiIiwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURlbGl2ZXJhYmxlRGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiZXh0ZXJuYWxEZXNjcmlwdGlvbiIsICIiLCAwLCAxLCBEZWxpdmVyYWJsZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInBhY2thZ2luZ0d1aWRhbmNlIiwgIiIsIDAsIDEsIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcm9sZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVJvbGVEZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiUm9sZURlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFJvbGVEZXNjcmlwdGlvbl9Ta2lsbHMoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJza2lsbHMiLCAiIiwgMCwgMSwgUm9sZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYXNzaWdubWVudEFwcHJvYWNoZXMiLCAiIiwgMCwgMSwgUm9sZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkic3lub255bXMiLCAiIiwgMCwgMSwgUm9sZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXRhc2tEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlUYXNrRGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIlRhc2tEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInB1cnBvc2UiLCAiIiwgMCwgMSwgVGFza0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImFsdGVybmF0aXZlcyIsICIiLCAwLCAxLCBUYXNrRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlHdWlkYW5jZURlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJHdWlkYW5jZURlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJhdHRhY2htZW50cyIsICIiLCAwLCAxLCBHdWlkYW5jZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiUHJhY3RpY2VEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYWRkaXRpb25hbEluZm8iLCAiIiwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInByb2JsZW0iLCAiIiwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImJhY2tncm91bmQiLCAiIiwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJnb2FscyIsICIiLCAwLCAxLCBQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BcHBsaWNhdGlvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImFwcGxpY2F0aW9uIiwgIiIsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJsZXZlbHNPZkFkb3B0aW9uIiwgIiIsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcG9pbnRFQ2xhc3MsCi0JCQkJUG9pbnQuY2xhc3MsCi0JCQkJIlBvaW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFBvaW50X1goKSwKLQkJCQllY29yZVBhY2thZ2UuZ2V0RURvdWJsZU9iamVjdCgpLAotCQkJCSJ4IiwgbnVsbCwgMCwgMSwgUG9pbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UG9pbnRfWSgpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFRG91YmxlT2JqZWN0KCksCi0JCQkJInkiLCBudWxsLCAwLCAxLCBQb2ludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZ3JhcGhFbGVtZW50RUNsYXNzLAotCQkJCUdyYXBoRWxlbWVudC5jbGFzcywKLQkJCQkiR3JhcGhFbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0R3JhcGhFbGVtZW50X1Bvc2l0aW9uKCksCi0JCQkJdGhpcy5nZXRQb2ludCgpLAotCQkJCW51bGwsCi0JCQkJInBvc2l0aW9uIiwgbnVsbCwgMCwgMSwgR3JhcGhFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0R3JhcGhFbGVtZW50X0NvbnRhaW5lZCgpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldERpYWdyYW1FbGVtZW50X0NvbnRhaW5lcigpLAotCQkJCSJjb250YWluZWQiLCBudWxsLCAwLCAtMSwgR3JhcGhFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEdyYXBoRWxlbWVudF9MaW5rKCksCi0JCQkJdGhpcy5nZXREaWFncmFtTGluaygpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbUxpbmtfR3JhcGhFbGVtZW50KCksCi0JCQkJImxpbmsiLCBudWxsLCAwLCAtMSwgR3JhcGhFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEdyYXBoRWxlbWVudF9BbmNob3JhZ2UoKSwKLQkJCQl0aGlzLmdldEdyYXBoQ29ubmVjdG9yKCksCi0JCQkJdGhpcy5nZXRHcmFwaENvbm5lY3Rvcl9HcmFwaEVsZW1lbnQoKSwKLQkJCQkiYW5jaG9yYWdlIiwgbnVsbCwgMCwgLTEsIEdyYXBoRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRHcmFwaEVsZW1lbnRfU2VtYW50aWNNb2RlbCgpLAotCQkJCXRoaXMuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpLAotCQkJCXRoaXMuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9HcmFwaEVsZW1lbnQoKSwKLQkJCQkic2VtYW50aWNNb2RlbCIsIG51bGwsIDEsIDEsIEdyYXBoRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkaWFncmFtRWxlbWVudEVDbGFzcywKLQkJCQlEaWFncmFtRWxlbWVudC5jbGFzcywKLQkJCQkiRGlhZ3JhbUVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREaWFncmFtRWxlbWVudF9Jc1Zpc2libGUoKSwKLQkJCQllY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW5PYmplY3QoKSwKLQkJCQkiaXNWaXNpYmxlIiwgInRydWUiLCAwLCAxLCBEaWFncmFtRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpYWdyYW1FbGVtZW50X0NvbnRhaW5lcigpLAotCQkJCXRoaXMuZ2V0R3JhcGhFbGVtZW50KCksCi0JCQkJdGhpcy5nZXRHcmFwaEVsZW1lbnRfQ29udGFpbmVkKCksCi0JCQkJImNvbnRhaW5lciIsIG51bGwsIDAsIDEsIERpYWdyYW1FbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlhZ3JhbUVsZW1lbnRfUmVmZXJlbmNlKCksCi0JCQkJdGhpcy5nZXRSZWZlcmVuY2UoKSwKLQkJCQl0aGlzLmdldFJlZmVyZW5jZV9SZWZlcmVuY2VkKCksCi0JCQkJInJlZmVyZW5jZSIsIG51bGwsIDAsIC0xLCBEaWFncmFtRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlhZ3JhbUVsZW1lbnRfUHJvcGVydHkoKSwKLQkJCQl0aGlzLmdldFByb3BlcnR5KCksCi0JCQkJbnVsbCwKLQkJCQkicHJvcGVydHkiLCBudWxsLCAwLCAtMSwgRGlhZ3JhbUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRpYWdyYW1MaW5rRUNsYXNzLAotCQkJCURpYWdyYW1MaW5rLmNsYXNzLAotCQkJCSJEaWFncmFtTGluayIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREaWFncmFtTGlua19ab29tKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVEb3VibGVPYmplY3QoKSwKLQkJCQkiem9vbSIsIG51bGwsIDAsIDEsIERpYWdyYW1MaW5rLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpYWdyYW1MaW5rX1ZpZXdwb3J0KCksCi0JCQkJdGhpcy5nZXRQb2ludCgpLAotCQkJCW51bGwsCi0JCQkJInZpZXdwb3J0IiwgbnVsbCwgMCwgMSwgRGlhZ3JhbUxpbmsuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaWFncmFtTGlua19HcmFwaEVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldEdyYXBoRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0R3JhcGhFbGVtZW50X0xpbmsoKSwKLQkJCQkiZ3JhcGhFbGVtZW50IiwgbnVsbCwgMSwgMSwgRGlhZ3JhbUxpbmsuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaWFncmFtTGlua19EaWFncmFtKCksCi0JCQkJdGhpcy5nZXREaWFncmFtKCksCi0JCQkJdGhpcy5nZXREaWFncmFtX0RpYWdyYW1MaW5rKCksCi0JCQkJImRpYWdyYW0iLCBudWxsLCAxLCAxLCBEaWFncmFtTGluay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZ3JhcGhDb25uZWN0b3JFQ2xhc3MsCi0JCQkJR3JhcGhDb25uZWN0b3IuY2xhc3MsCi0JCQkJIkdyYXBoQ29ubmVjdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0R3JhcGhFbGVtZW50KCksCi0JCQkJdGhpcy5nZXRHcmFwaEVsZW1lbnRfQW5jaG9yYWdlKCksCi0JCQkJImdyYXBoRWxlbWVudCIsIG51bGwsIDEsIDEsIEdyYXBoQ29ubmVjdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFZGdlKCksCi0JCQkJdGhpcy5nZXRHcmFwaEVkZ2UoKSwKLQkJCQl0aGlzLmdldEdyYXBoRWRnZV9BbmNob3IoKSwKLQkJCQkiZ3JhcGhFZGdlIiwgbnVsbCwgMCwgLTEsIEdyYXBoQ29ubmVjdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJc2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcywKLQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLAotCQkJCSJTZW1hbnRpY01vZGVsQnJpZGdlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9QcmVzZW50YXRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwcmVzZW50YXRpb24iLCAiIiwgMCwgMSwgU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFNlbWFudGljTW9kZWxCcmlkZ2VfR3JhcGhFbGVtZW50KCksCi0JCQkJdGhpcy5nZXRHcmFwaEVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldEdyYXBoRWxlbWVudF9TZW1hbnRpY01vZGVsKCksCi0JCQkJImdyYXBoRWxlbWVudCIsIG51bGwsIDAsIDEsIFNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRTZW1hbnRpY01vZGVsQnJpZGdlX0RpYWdyYW0oKSwKLQkJCQl0aGlzLmdldERpYWdyYW0oKSwKLQkJCQl0aGlzLmdldERpYWdyYW1fTmFtZXNwYWNlKCksCi0JCQkJImRpYWdyYW0iLCBudWxsLCAwLCAxLCBTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRpbWVuc2lvbkVDbGFzcywKLQkJCQlEaW1lbnNpb24uY2xhc3MsCi0JCQkJIkRpbWVuc2lvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREaW1lbnNpb25fV2lkdGgoKSwKLQkJCQllY29yZVBhY2thZ2UuZ2V0RURvdWJsZU9iamVjdCgpLAotCQkJCSJ3aWR0aCIsIG51bGwsIDAsIDEsIERpbWVuc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREaW1lbnNpb25fSGVpZ2h0KCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVEb3VibGVPYmplY3QoKSwKLQkJCQkiaGVpZ2h0IiwgbnVsbCwgMCwgMSwgRGltZW5zaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlyZWZlcmVuY2VFQ2xhc3MsCi0JCQkJUmVmZXJlbmNlLmNsYXNzLAotCQkJCSJSZWZlcmVuY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UmVmZXJlbmNlX0lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuT2JqZWN0KCksCi0JCQkJImlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIiwgbnVsbCwgMCwgMSwgUmVmZXJlbmNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFJlZmVyZW5jZV9SZWZlcmVuY2VkKCksCi0JCQkJdGhpcy5nZXREaWFncmFtRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnRfUmVmZXJlbmNlKCksCi0JCQkJInJlZmVyZW5jZWQiLCBudWxsLCAxLCAxLCBSZWZlcmVuY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXByb3BlcnR5RUNsYXNzLAotCQkJCVByb3BlcnR5LmNsYXNzLAotCQkJCSJQcm9wZXJ0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcm9wZXJ0eV9LZXkoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJrZXkiLCAiIiwgMCwgMSwgUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcm9wZXJ0eV9WYWx1ZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInZhbHVlIiwgIiIsIDAsIDEsIFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCWdyYXBoRWRnZUVDbGFzcywKLQkJCQlHcmFwaEVkZ2UuY2xhc3MsCi0JCQkJIkdyYXBoRWRnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRHcmFwaEVkZ2VfQW5jaG9yKCksCi0JCQkJdGhpcy5nZXRHcmFwaENvbm5lY3RvcigpLAotCQkJCXRoaXMuZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFZGdlKCksCi0JCQkJImFuY2hvciIsIG51bGwsIDIsIDIsIEdyYXBoRWRnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0R3JhcGhFZGdlX1dheXBvaW50cygpLAotCQkJCXRoaXMuZ2V0UG9pbnQoKSwKLQkJCQludWxsLAotCQkJCSJ3YXlwb2ludHMiLCBudWxsLCAyLCAtMSwgR3JhcGhFZGdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkaWFncmFtRUNsYXNzLAotCQkJCURpYWdyYW0uY2xhc3MsCi0JCQkJIkRpYWdyYW0iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGlhZ3JhbV9ab29tKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVEb3VibGVPYmplY3QoKSwKLQkJCQkiem9vbSIsIG51bGwsIDAsIDEsIERpYWdyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlhZ3JhbV9WaWV3cG9pbnQoKSwKLQkJCQl0aGlzLmdldFBvaW50KCksCi0JCQkJbnVsbCwKLQkJCQkidmlld3BvaW50IiwgbnVsbCwgMCwgMSwgRGlhZ3JhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpYWdyYW1fRGlhZ3JhbUxpbmsoKSwKLQkJCQl0aGlzLmdldERpYWdyYW1MaW5rKCksCi0JCQkJdGhpcy5nZXREaWFncmFtTGlua19EaWFncmFtKCksCi0JCQkJImRpYWdyYW1MaW5rIiwgbnVsbCwgMCwgLTEsIERpYWdyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpYWdyYW1fTmFtZXNwYWNlKCksCi0JCQkJdGhpcy5nZXRTZW1hbnRpY01vZGVsQnJpZGdlKCksCi0JCQkJdGhpcy5nZXRTZW1hbnRpY01vZGVsQnJpZGdlX0RpYWdyYW0oKSwKLQkJCQkibmFtZXNwYWNlIiwgbnVsbCwgMSwgMSwgRGlhZ3JhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlncmFwaE5vZGVFQ2xhc3MsCi0JCQkJR3JhcGhOb2RlLmNsYXNzLAotCQkJCSJHcmFwaE5vZGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0R3JhcGhOb2RlX1NpemUoKSwKLQkJCQl0aGlzLmdldERpbWVuc2lvbigpLAotCQkJCW51bGwsCi0JCQkJInNpemUiLCBudWxsLCAwLCAxLCBHcmFwaE5vZGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRFQ2xhc3MsCi0JCQkJU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuY2xhc3MsCi0JCQkJIlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X1R5cGVJbmZvKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkidHlwZUluZm8iLCAiIiwgMCwgMSwgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJdW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcywKLQkJCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLAotCQkJCSJVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJImVsZW1lbnQiLCBudWxsLCAxLCAxLCBVTUFTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQljb3JlU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcywKLQkJCQlDb3JlU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywKLQkJCQkiQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0RWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJImVsZW1lbnQiLCBudWxsLCAxLCAxLCBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJbGVhZkVsZW1lbnRFQ2xhc3MsCi0JCQkJTGVhZkVsZW1lbnQuY2xhc3MsCi0JCQkJIkxlYWZFbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXRleHRFbGVtZW50RUNsYXNzLAotCQkJCVRleHRFbGVtZW50LmNsYXNzLAotCQkJCSJUZXh0RWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRUZXh0RWxlbWVudF9UZXh0KCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkidGV4dCIsICIiLCAwLCAxLCBUZXh0RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlpbWFnZUVDbGFzcywKLQkJCQlJbWFnZS5jbGFzcywKLQkJCQkiSW1hZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0SW1hZ2VfVXJpKCksCi0JCQkJdGhpcy5nZXRVcmkoKSwKLQkJCQkidXJpIiwgbnVsbCwgMCwgMSwgSW1hZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0SW1hZ2VfTWltZVR5cGUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJtaW1lVHlwZSIsICIiLCAwLCAxLCBJbWFnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlncmFwaGljUHJpbWl0aXZlRUNsYXNzLAotCQkJCUdyYXBoaWNQcmltaXRpdmUuY2xhc3MsCi0JCQkJIkdyYXBoaWNQcmltaXRpdmUiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcG9seWxpbmVFQ2xhc3MsCi0JCQkJUG9seWxpbmUuY2xhc3MsCi0JCQkJIlBvbHlsaW5lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFBvbHlsaW5lX0Nsb3NlZCgpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbk9iamVjdCgpLAotCQkJCSJjbG9zZWQiLCAidHJ1ZSIsIDAsIDEsIFBvbHlsaW5lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UG9seWxpbmVfV2F5cG9pbnRzKCksCi0JCQkJdGhpcy5nZXRQb2ludCgpLAotCQkJCW51bGwsCi0JCQkJIndheXBvaW50cyIsIG51bGwsIDIsIC0xLCBQb2x5bGluZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZWxsaXBzZUVDbGFzcywKLQkJCQlFbGxpcHNlLmNsYXNzLAotCQkJCSJFbGxpcHNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEVsbGlwc2VfUmFkaXVzWCgpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFRG91YmxlT2JqZWN0KCksCi0JCQkJInJhZGl1c1giLCBudWxsLCAwLCAxLCBFbGxpcHNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEVsbGlwc2VfUmFkaXVzWSgpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFRG91YmxlT2JqZWN0KCksCi0JCQkJInJhZGl1c1kiLCBudWxsLCAwLCAxLCBFbGxpcHNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEVsbGlwc2VfUm90YXRpb24oKSwKLQkJCQllY29yZVBhY2thZ2UuZ2V0RURvdWJsZU9iamVjdCgpLAotCQkJCSJyb3RhdGlvbiIsIG51bGwsIDAsIDEsIEVsbGlwc2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RWxsaXBzZV9TdGFydEFuZ2xlKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVEb3VibGVPYmplY3QoKSwKLQkJCQkic3RhcnRBbmdsZSIsIG51bGwsIDAsIDEsIEVsbGlwc2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RWxsaXBzZV9FbmRBbmdsZSgpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFRG91YmxlT2JqZWN0KCksCi0JCQkJImVuZEFuZ2xlIiwgbnVsbCwgMCwgMSwgRWxsaXBzZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRFbGxpcHNlX0NlbnRlcigpLAotCQkJCXRoaXMuZ2V0UG9pbnQoKSwKLQkJCQludWxsLAotCQkJCSJjZW50ZXIiLCBudWxsLCAwLCAxLCBFbGxpcHNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWFjdGl2aXR5RUNsYXNzLAotCQkJCUFjdGl2aXR5LmNsYXNzLAotCQkJCSJBY3Rpdml0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLAotCQkJCXRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXRpZXMoKSwKLQkJCQkiYnJlYWtkb3duRWxlbWVudHMiLCBudWxsLCAwLCAtMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEFjdGl2aXR5X1JvYWRtYXBzKCksCi0JCQkJdGhpcy5nZXRSb2FkbWFwKCksCi0JCQkJbnVsbCwKLQkJCQkicm9hZG1hcHMiLCBudWxsLCAwLCAtMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEFjdGl2aXR5X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwKLQkJCQl0aGlzLmdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLAotCQkJCW51bGwsCi0JCQkJInN1cHBvcnRpbmdNYXRlcmlhbHMiLCBudWxsLCAwLCAtMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEFjdGl2aXR5X0NoZWNrbGlzdHMoKSwKLQkJCQl0aGlzLmdldENoZWNrbGlzdCgpLAotCQkJCW51bGwsCi0JCQkJImNoZWNrbGlzdHMiLCBudWxsLCAwLCAtMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEFjdGl2aXR5X0NvbmNlcHRzKCksCi0JCQkJdGhpcy5nZXRDb25jZXB0KCksCi0JCQkJbnVsbCwKLQkJCQkiY29uY2VwdHMiLCBudWxsLCAwLCAtMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEFjdGl2aXR5X0V4YW1wbGVzKCksCi0JCQkJdGhpcy5nZXRFeGFtcGxlKCksCi0JCQkJbnVsbCwKLQkJCQkiZXhhbXBsZXMiLCBudWxsLCAwLCAtMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEFjdGl2aXR5X0d1aWRlbGluZXMoKSwKLQkJCQl0aGlzLmdldEd1aWRlbGluZSgpLAotCQkJCW51bGwsCi0JCQkJImd1aWRlbGluZXMiLCBudWxsLCAwLCAtMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEFjdGl2aXR5X1JldXNhYmxlQXNzZXRzKCksCi0JCQkJdGhpcy5nZXRSZXVzYWJsZUFzc2V0KCksCi0JCQkJbnVsbCwKLQkJCQkicmV1c2FibGVBc3NldHMiLCBudWxsLCAwLCAtMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEFjdGl2aXR5X0lzRW5hY3RhYmxlKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuT2JqZWN0KCksCi0JCQkJImlzRW5hY3RhYmxlIiwgImZhbHNlIiwgMCwgMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MsCi0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsCi0JCQkJIldvcmtCcmVha2Rvd25FbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuT2JqZWN0KCksCi0JCQkJImlzUmVwZWF0YWJsZSIsICJmYWxzZSIsIDAsIDEsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuT2JqZWN0KCksCi0JCQkJImlzT25nb2luZyIsICJmYWxzZSIsIDAsIDEsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbk9iamVjdCgpLAotCQkJCSJpc0V2ZW50RHJpdmVuIiwgImZhbHNlIiwgMCwgMSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpLAotCQkJCXRoaXMuZ2V0V29ya09yZGVyKCksCi0JCQkJbnVsbCwKLQkJCQkibGlua1RvUHJlZGVjZXNzb3IiLCBudWxsLCAwLCAtMSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJyZWFrZG93bkVsZW1lbnQuY2xhc3MsCi0JCQkJIkJyZWFrZG93bkVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInByZWZpeCIsICIiLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9Jc1BsYW5uZWQoKSwKLQkJCQllY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW5PYmplY3QoKSwKLQkJCQkiaXNQbGFubmVkIiwgInRydWUiLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9IYXNNdWx0aXBsZU9jY3VycmVuY2VzKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuT2JqZWN0KCksCi0JCQkJImhhc011bHRpcGxlT2NjdXJyZW5jZXMiLCAiZmFsc2UiLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuT2JqZWN0KCksCi0JCQkJImlzT3B0aW9uYWwiLCAiZmFsc2UiLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpLAotCQkJCXRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJInByZXNlbnRlZEFmdGVyIiwgbnVsbCwgMCwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpLAotCQkJCXRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJInByZXNlbnRlZEJlZm9yZSIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9QbGFubmluZ0RhdGEoKSwKLQkJCQl0aGlzLmdldFBsYW5uaW5nRGF0YSgpLAotCQkJCW51bGwsCi0JCQkJInBsYW5uaW5nRGF0YSIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X1N1cGVyQWN0aXZpdGllcygpLAotCQkJCXRoaXMuZ2V0QWN0aXZpdHkoKSwKLQkJCQl0aGlzLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksCi0JCQkJInN1cGVyQWN0aXZpdGllcyIsIG51bGwsIDEsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCW1pbGVzdG9uZUVDbGFzcywKLQkJCQlNaWxlc3RvbmUuY2xhc3MsCi0JCQkJIk1pbGVzdG9uZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJaXRlcmF0aW9uRUNsYXNzLAotCQkJCUl0ZXJhdGlvbi5jbGFzcywKLQkJCQkiSXRlcmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwaGFzZUVDbGFzcywKLQkJCQlQaGFzZS5jbGFzcywKLQkJCQkiUGhhc2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXRlYW1Qcm9maWxlRUNsYXNzLAotCQkJCVRlYW1Qcm9maWxlLmNsYXNzLAotCQkJCSJUZWFtUHJvZmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQl0aGlzLmdldFJvbGVEZXNjcmlwdG9yKCksCi0JCQkJbnVsbCwKLQkJCQkidGVhbVJvbGVzIiwgbnVsbCwgMCwgLTEsIFRlYW1Qcm9maWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKSwKLQkJCQl0aGlzLmdldFRlYW1Qcm9maWxlKCksCi0JCQkJdGhpcy5nZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCksCi0JCQkJInN1cGVyVGVhbSIsIG51bGwsIDEsIDEsIFRlYW1Qcm9maWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKSwKLQkJCQl0aGlzLmdldFRlYW1Qcm9maWxlKCksCi0JCQkJdGhpcy5nZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKSwKLQkJCQkic3ViVGVhbSIsIG51bGwsIDAsIC0xLCBUZWFtUHJvZmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJvbGVEZXNjcmlwdG9yRUNsYXNzLAotCQkJCVJvbGVEZXNjcmlwdG9yLmNsYXNzLAotCQkJCSJSb2xlRGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCksCi0JCQkJdGhpcy5nZXRSb2xlKCksCi0JCQkJbnVsbCwKLQkJCQkiUm9sZSIsIG51bGwsIDAsIDEsIFJvbGVEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFJvbGVEZXNjcmlwdG9yX01vZGlmaWVzKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJtb2RpZmllcyIsIG51bGwsIDAsIC0xLCBSb2xlRGVzY3JpcHRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgIUlTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJyZXNwb25zaWJsZUZvciIsIG51bGwsIDAsIC0xLCBSb2xlRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXdvcmtPcmRlckVDbGFzcywKLQkJCQlXb3JrT3JkZXIuY2xhc3MsCi0JCQkJIldvcmtPcmRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRXb3JrT3JkZXJfTGlua1R5cGUoKSwKLQkJCQl0aGlzLmdldFdvcmtPcmRlclR5cGUoKSwKLQkJCQkibGlua1R5cGUiLCAiZmluaXNoVG9TdGFydCIsIDAsIDEsIFdvcmtPcmRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFdvcmtPcmRlcl9QcmVkKCksCi0JCQkJdGhpcy5nZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJInByZWQiLCBudWxsLCAxLCAxLCBXb3JrT3JkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXByb2Nlc3NFbGVtZW50RUNsYXNzLAotCQkJCVByb2Nlc3NFbGVtZW50LmNsYXNzLAotCQkJCSJQcm9jZXNzRWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwbGFubmluZ0RhdGFFQ2xhc3MsCi0JCQkJUGxhbm5pbmdEYXRhLmNsYXNzLAotCQkJCSJQbGFubmluZ0RhdGEiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpLAotCQkJCXRoaXMuZ2V0RGF0ZSgpLAotCQkJCSJzdGFydERhdGUiLCBudWxsLCAwLCAxLCBQbGFubmluZ0RhdGEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKSwKLQkJCQl0aGlzLmdldERhdGUoKSwKLQkJCQkiZmluaXNoRGF0ZSIsIG51bGwsIDAsIDEsIFBsYW5uaW5nRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQbGFubmluZ0RhdGFfUmFuaygpLAotCQkJCXRoaXMuZ2V0SW50ZWdlcigpLAotCQkJCSJyYW5rIiwgbnVsbCwgMCwgMSwgUGxhbm5pbmdEYXRhLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkZXNjcmlwdG9yRUNsYXNzLAotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvci5jbGFzcywKLQkJCQkiRGVzY3JpcHRvciIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuT2JqZWN0KCksCi0JCQkJImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIsICJ0cnVlIiwgMCwgMSwgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsCi0JCQkJIldvcmtQcm9kdWN0RGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYWN0aXZpdHlFbnRyeVN0YXRlIiwgIiIsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImFjdGl2aXR5RXhpdFN0YXRlIiwgIiIsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3QoKSwKLQkJCQludWxsLAotCQkJCSJXb3JrUHJvZHVjdCIsIG51bGwsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpLAotCQkJCSJpbXBhY3RlZEJ5IiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKSwKLQkJCQkiaW1wYWN0cyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJkZWxpdmVyYWJsZVBhcnRzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXRhc2tEZXNjcmlwdG9yRUNsYXNzLAotCQkJCVRhc2tEZXNjcmlwdG9yLmNsYXNzLAotCQkJCSJUYXNrRGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCksCi0JCQkJdGhpcy5nZXRUYXNrKCksCi0JCQkJbnVsbCwKLQkJCQkiVGFzayIsIG51bGwsIDAsIDEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksCi0JCQkJdGhpcy5nZXRSb2xlRGVzY3JpcHRvcigpLAotCQkJCW51bGwsCi0JCQkJImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCksCi0JCQkJdGhpcy5nZXRSb2xlRGVzY3JpcHRvcigpLAotCQkJCW51bGwsCi0JCQkJImFzc2lzdGVkQnkiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLAotCQkJCW51bGwsCi0JCQkJImV4dGVybmFsSW5wdXQiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJtYW5kYXRvcnlJbnB1dCIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJbnVsbCwKLQkJCQkib3B0aW9uYWxJbnB1dCIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJvdXRwdXQiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksCi0JCQkJdGhpcy5nZXRSb2xlRGVzY3JpcHRvcigpLAotCQkJCW51bGwsCi0JCQkJInBlcmZvcm1lZFByaW1hcmlseUJ5IiwgbnVsbCwgMCwgMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpLAotCQkJCXRoaXMuZ2V0U2VjdGlvbigpLAotCQkJCW51bGwsCi0JCQkJInNlbGVjdGVkU3RlcHMiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQljb21wb3NpdGVSb2xlRUNsYXNzLAotCQkJCUNvbXBvc2l0ZVJvbGUuY2xhc3MsCi0JCQkJIkNvbXBvc2l0ZVJvbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKSwKLQkJCQl0aGlzLmdldFJvbGUoKSwKLQkJCQludWxsLAotCQkJCSJhZ2dyZWdhdGVkUm9sZXMiLCBudWxsLCAwLCAtMSwgQ29tcG9zaXRlUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInVzYWdlR3VpZGFuY2UiLCAiIiwgMCwgMSwgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCWFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQWN0aXZpdHlEZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiQWN0aXZpdHlEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwdXJwb3NlIiwgIiIsIDAsIDEsIEFjdGl2aXR5RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImFsdGVybmF0aXZlcyIsICIiLCAwLCAxLCBBY3Rpdml0eURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3d0b1N0YWZmKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiaG93dG9TdGFmZiIsICIiLCAwLCAxLCBBY3Rpdml0eURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInNjYWxlIiwgIiIsIDAsIDEsIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInByb2plY3RDaGFyYWN0ZXJpc3RpY3MiLCAiIiwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJyaXNrTGV2ZWwiLCAiIiwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiZXN0aW1hdGluZ1RlY2huaXF1ZSIsICIiLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIiwgIiIsIDAsIDEsIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fVHlwZU9mQ29udHJhY3QoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJ0eXBlT2ZDb250cmFjdCIsICIiLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJUHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJQcm9jZXNzRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX0V4dGVybmFsSWQoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJleHRlcm5hbElkIiwgIiIsIDAsIDEsIFByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInNjb3BlIiwgIiIsIDAsIDEsIFByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkidXNhZ2VOb3RlcyIsICIiLCAwLCAxLCBQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURlc2NyaXB0b3JEZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiRGVzY3JpcHRvckRlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJyZWZpbmVkRGVzY3JpcHRpb24iLCAiIiwgMCwgMSwgRGVzY3JpcHRvckRlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCWNvbmNlcHRFQ2xhc3MsCi0JCQkJQ29uY2VwdC5jbGFzcywKLQkJCQkiQ29uY2VwdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJY2hlY2tsaXN0RUNsYXNzLAotCQkJCUNoZWNrbGlzdC5jbGFzcywKLQkJCQkiQ2hlY2tsaXN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlleGFtcGxlRUNsYXNzLAotCQkJCUV4YW1wbGUuY2xhc3MsCi0JCQkJIkV4YW1wbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWd1aWRlbGluZUVDbGFzcywKLQkJCQlHdWlkZWxpbmUuY2xhc3MsCi0JCQkJIkd1aWRlbGluZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcmVwb3J0RUNsYXNzLAotCQkJCVJlcG9ydC5jbGFzcywKLQkJCQkiUmVwb3J0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0ZW1wbGF0ZUVDbGFzcywKLQkJCQlUZW1wbGF0ZS5jbGFzcywKLQkJCQkiVGVtcGxhdGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcywKLQkJCQlTdXBwb3J0aW5nTWF0ZXJpYWwuY2xhc3MsCi0JCQkJIlN1cHBvcnRpbmdNYXRlcmlhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJdG9vbE1lbnRvckVDbGFzcywKLQkJCQlUb29sTWVudG9yLmNsYXNzLAotCQkJCSJUb29sTWVudG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl3aGl0ZXBhcGVyRUNsYXNzLAotCQkJCVdoaXRlcGFwZXIuY2xhc3MsCi0JCQkJIldoaXRlcGFwZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXRlcm1EZWZpbml0aW9uRUNsYXNzLAotCQkJCVRlcm1EZWZpbml0aW9uLmNsYXNzLAotCQkJCSJUZXJtRGVmaW5pdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJhY3RpY2VFQ2xhc3MsCi0JCQkJUHJhY3RpY2UuY2xhc3MsCi0JCQkJIlByYWN0aWNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByYWN0aWNlX1N1YlByYWN0aWNlcygpLAotCQkJCXRoaXMuZ2V0UHJhY3RpY2UoKSwKLQkJCQludWxsLAotCQkJCSJzdWJQcmFjdGljZXMiLCBudWxsLCAwLCAtMSwgUHJhY3RpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSwKLQkJCQl0aGlzLmdldENvbnRlbnRFbGVtZW50KCksCi0JCQkJbnVsbCwKLQkJCQkiY29udGVudFJlZmVyZW5jZXMiLCBudWxsLCAwLCAtMSwgUHJhY3RpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlcygpLAotCQkJCXRoaXMuZ2V0QWN0aXZpdHkoKSwKLQkJCQludWxsLAotCQkJCSJhY3Rpdml0eVJlZmVyZW5jZXMiLCBudWxsLCAwLCAtMSwgUHJhY3RpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQllc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNFQ2xhc3MsCi0JCQkJRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmNsYXNzLAotCQkJCSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJldXNhYmxlQXNzZXRFQ2xhc3MsCi0JCQkJUmV1c2FibGVBc3NldC5jbGFzcywKLQkJCQkiUmV1c2FibGVBc3NldCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJc3RhdGVFQ2xhc3MsCi0JCQkJU3RhdGUuY2xhc3MsCi0JCQkJIlN0YXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFN0YXRlX1dvcmtQcm9kdWN0KCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdCgpLAotCQkJCW51bGwsCi0JCQkJIldvcmtQcm9kdWN0IiwgbnVsbCwgMSwgLTEsIFN0YXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRTdGF0ZV9SZWdpb24oKSwKLQkJCQl0aGlzLmdldFJlZ2lvbigpLAotCQkJCXRoaXMuZ2V0UmVnaW9uX1N0YXRlKCksCi0JCQkJIlJlZ2lvbiIsIG51bGwsIDAsIC0xLCBTdGF0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRTdGF0ZV9TdWJtYWNoaW5lKCksCi0JCQkJdGhpcy5nZXRTdGF0ZU1hY2hpbmUoKSwKLQkJCQludWxsLAotCQkJCSJzdWJtYWNoaW5lIiwgbnVsbCwgMCwgMSwgU3RhdGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXZlcnRleEVDbGFzcywKLQkJCQlWZXJ0ZXguY2xhc3MsCi0JCQkJIlZlcnRleCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRWZXJ0ZXhfQ29udGFpbmVyKCksCi0JCQkJdGhpcy5nZXRSZWdpb24oKSwKLQkJCQl0aGlzLmdldFJlZ2lvbl9WZXJ0ZXgoKSwKLQkJCQkiY29udGFpbmVyIiwgbnVsbCwgMCwgMSwgVmVydGV4LmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VmVydGV4X091dGdvaW5nKCksCi0JCQkJdGhpcy5nZXRUcmFuc2l0aW9uKCksCi0JCQkJdGhpcy5nZXRUcmFuc2l0aW9uX1NvdXJjZSgpLAotCQkJCSJvdXRnb2luZyIsIG51bGwsIDAsIC0xLCBWZXJ0ZXguY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFZlcnRleF9JbmNvbWluZygpLAotCQkJCXRoaXMuZ2V0VHJhbnNpdGlvbigpLAotCQkJCXRoaXMuZ2V0VHJhbnNpdGlvbl9UYXJnZXQoKSwKLQkJCQkiaW5jb21pbmciLCBudWxsLCAwLCAtMSwgVmVydGV4LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcmVnaW9uRUNsYXNzLAotCQkJCVJlZ2lvbi5jbGFzcywKLQkJCQkiUmVnaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFJlZ2lvbl9WZXJ0ZXgoKSwKLQkJCQl0aGlzLmdldFZlcnRleCgpLAotCQkJCXRoaXMuZ2V0VmVydGV4X0NvbnRhaW5lcigpLAotCQkJCSJWZXJ0ZXgiLCBudWxsLCAwLCAtMSwgUmVnaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFJlZ2lvbl9UcmFuc2l0aW9uKCksCi0JCQkJdGhpcy5nZXRUcmFuc2l0aW9uKCksCi0JCQkJdGhpcy5nZXRUcmFuc2l0aW9uX0NvbnRhaW5lcigpLAotCQkJCSJUcmFuc2l0aW9uIiwgbnVsbCwgMCwgLTEsIFJlZ2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRSZWdpb25fU3RhdGUoKSwKLQkJCQl0aGlzLmdldFN0YXRlKCksCi0JCQkJdGhpcy5nZXRTdGF0ZV9SZWdpb24oKSwKLQkJCQkiU3RhdGUiLCBudWxsLCAwLCAxLCBSZWdpb24uY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRSZWdpb25fU3RhdGVNYWNoaW5lKCksCi0JCQkJdGhpcy5nZXRTdGF0ZU1hY2hpbmUoKSwKLQkJCQl0aGlzLmdldFN0YXRlTWFjaGluZV9SZWdpb24oKSwKLQkJCQkiU3RhdGVNYWNoaW5lIiwgbnVsbCwgMCwgMSwgUmVnaW9uLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXN0YXRlTWFjaGluZUVDbGFzcywKLQkJCQlTdGF0ZU1hY2hpbmUuY2xhc3MsCi0JCQkJIlN0YXRlTWFjaGluZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRTdGF0ZU1hY2hpbmVfUmVnaW9uKCksCi0JCQkJdGhpcy5nZXRSZWdpb24oKSwKLQkJCQl0aGlzLmdldFJlZ2lvbl9TdGF0ZU1hY2hpbmUoKSwKLQkJCQkiUmVnaW9uIiwgbnVsbCwgMSwgLTEsIFN0YXRlTWFjaGluZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJdHJhbnNpdGlvbkVDbGFzcywKLQkJCQlUcmFuc2l0aW9uLmNsYXNzLAotCQkJCSJUcmFuc2l0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRyYW5zaXRpb25fV29ya0RlZmluaXRpb24oKSwKLQkJCQl0aGlzLmdldFdvcmtEZWZpbml0aW9uKCksCi0JCQkJbnVsbCwKLQkJCQkiV29ya0RlZmluaXRpb24iLCBudWxsLCAxLCAtMSwgVHJhbnNpdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VHJhbnNpdGlvbl9Db250YWluZXIoKSwKLQkJCQl0aGlzLmdldFJlZ2lvbigpLAotCQkJCXRoaXMuZ2V0UmVnaW9uX1RyYW5zaXRpb24oKSwKLQkJCQkiY29udGFpbmVyIiwgbnVsbCwgMSwgMSwgVHJhbnNpdGlvbi5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRyYW5zaXRpb25fU291cmNlKCksCi0JCQkJdGhpcy5nZXRWZXJ0ZXgoKSwKLQkJCQl0aGlzLmdldFZlcnRleF9PdXRnb2luZygpLAotCQkJCSJzb3VyY2UiLCBudWxsLCAxLCAxLCBUcmFuc2l0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRyYW5zaXRpb25fVGFyZ2V0KCksCi0JCQkJdGhpcy5nZXRWZXJ0ZXgoKSwKLQkJCQl0aGlzLmdldFZlcnRleF9JbmNvbWluZygpLAotCQkJCSJ0YXJnZXQiLCBudWxsLCAxLCAxLCBUcmFuc2l0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwc2V1ZG9TdGF0ZUVDbGFzcywKLQkJCQlQc2V1ZG9TdGF0ZS5jbGFzcywKLQkJCQkiUHNldWRvU3RhdGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRpc2NpcGxpbmVFQ2xhc3MsCi0JCQkJRGlzY2lwbGluZS5jbGFzcywKLQkJCQkiRGlzY2lwbGluZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaXNjaXBsaW5lX1Rhc2tzKCksCi0JCQkJdGhpcy5nZXRUYXNrKCksCi0JCQkJbnVsbCwKLQkJCQkidGFza3MiLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlzY2lwbGluZV9TdWJkaXNjaXBsaW5lKCksCi0JCQkJdGhpcy5nZXREaXNjaXBsaW5lKCksCi0JCQkJbnVsbCwKLQkJCQkic3ViZGlzY2lwbGluZSIsIG51bGwsIDAsIC0xLCBEaXNjaXBsaW5lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCksCi0JCQkJdGhpcy5nZXRBY3Rpdml0eSgpLAotCQkJCW51bGwsCi0JCQkJInJlZmVyZW5jZVdvcmtmbG93cyIsIG51bGwsIDAsIC0xLCBEaXNjaXBsaW5lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJY29udGVudENhdGVnb3J5RUNsYXNzLAotCQkJCUNvbnRlbnRDYXRlZ29yeS5jbGFzcywKLQkJCQkiQ29udGVudENhdGVnb3J5IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJvbGVTZXRFQ2xhc3MsCi0JCQkJUm9sZVNldC5jbGFzcywKLQkJCQkiUm9sZVNldCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRSb2xlU2V0X1JvbGVzKCksCi0JCQkJdGhpcy5nZXRSb2xlKCksCi0JCQkJbnVsbCwKLQkJCQkicm9sZXMiLCBudWxsLCAwLCAtMSwgUm9sZVNldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRvbWFpbkVDbGFzcywKLQkJCQlEb21haW4uY2xhc3MsCi0JCQkJIkRvbWFpbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREb21haW5fV29ya1Byb2R1Y3RzKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdCgpLAotCQkJCW51bGwsCi0JCQkJIndvcmtQcm9kdWN0cyIsIG51bGwsIDAsIC0xLCBEb21haW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERvbWFpbl9TdWJkb21haW5zKCksCi0JCQkJdGhpcy5nZXREb21haW4oKSwKLQkJCQludWxsLAotCQkJCSJzdWJkb21haW5zIiwgbnVsbCwgMCwgLTEsIERvbWFpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJd29ya1Byb2R1Y3RUeXBlRUNsYXNzLAotCQkJCVdvcmtQcm9kdWN0VHlwZS5jbGFzcywKLQkJCQkiV29ya1Byb2R1Y3RUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0KCksCi0JCQkJbnVsbCwKLQkJCQkid29ya1Byb2R1Y3RzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcywKLQkJCQlEaXNjaXBsaW5lR3JvdXBpbmcuY2xhc3MsCi0JCQkJIkRpc2NpcGxpbmVHcm91cGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZXMoKSwKLQkJCQl0aGlzLmdldERpc2NpcGxpbmUoKSwKLQkJCQludWxsLAotCQkJCSJkaXNjaXBsaW5lcyIsIG51bGwsIDAsIC0xLCBEaXNjaXBsaW5lR3JvdXBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0b29sRUNsYXNzLAotCQkJCVRvb2wuY2xhc3MsCi0JCQkJIlRvb2wiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VG9vbF9Ub29sTWVudG9ycygpLAotCQkJCXRoaXMuZ2V0VG9vbE1lbnRvcigpLAotCQkJCW51bGwsCi0JCQkJInRvb2xNZW50b3JzIiwgbnVsbCwgMCwgLTEsIFRvb2wuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlyb2xlU2V0R3JvdXBpbmdFQ2xhc3MsCi0JCQkJUm9sZVNldEdyb3VwaW5nLmNsYXNzLAotCQkJCSJSb2xlU2V0R3JvdXBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCksCi0JCQkJdGhpcy5nZXRSb2xlU2V0KCksCi0JCQkJbnVsbCwKLQkJCQkicm9sZVNldHMiLCBudWxsLCAwLCAtMSwgUm9sZVNldEdyb3VwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MsCi0JCQkJQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsCi0JCQkJIkN1c3RvbUNhdGVnb3J5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKSwKLQkJCQl0aGlzLmdldERlc2NyaWJhYmxlRWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJImNhdGVnb3JpemVkRWxlbWVudHMiLCBudWxsLCAwLCAtMSwgQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3JpZXMoKSwKLQkJCQl0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpLAotCQkJCW51bGwsCi0JCQkJInN1YkNhdGVnb3JpZXMiLCBudWxsLCAwLCAtMSwgQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkZWxpdmVyeVByb2Nlc3NFQ2xhc3MsCi0JCQkJRGVsaXZlcnlQcm9jZXNzLmNsYXNzLAotCQkJCSJEZWxpdmVyeVByb2Nlc3MiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFscygpLAotCQkJCXRoaXMuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCksCi0JCQkJbnVsbCwKLQkJCQkiZWR1Y2F0aW9uTWF0ZXJpYWxzIiwgbnVsbCwgMCwgLTEsIERlbGl2ZXJ5UHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWxzKCksCi0JCQkJdGhpcy5nZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSwKLQkJCQludWxsLAotCQkJCSJjb21tdW5pY2F0aW9uc01hdGVyaWFscyIsIG51bGwsIDAsIC0xLCBEZWxpdmVyeVByb2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcm9jZXNzRUNsYXNzLAotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzcy5jbGFzcywKLQkJCQkiUHJvY2VzcyIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NfSW5jbHVkZXNQYXR0ZXJucygpLAotCQkJCXRoaXMuZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKSwKLQkJCQludWxsLAotCQkJCSJpbmNsdWRlc1BhdHRlcm5zIiwgbnVsbCwgMCwgLTEsIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpLAotCQkJCXRoaXMuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLAotCQkJCW51bGwsCi0JCQkJImRlZmF1bHRDb250ZXh0IiwgbnVsbCwgMSwgMSwgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCksCi0JCQkJdGhpcy5nZXRNZXRob2RDb25maWd1cmF0aW9uKCksCi0JCQkJbnVsbCwKLQkJCQkidmFsaWRDb250ZXh0IiwgbnVsbCwgMCwgLTEsIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzLAotCQkJCUNhcGFiaWxpdHlQYXR0ZXJuLmNsYXNzLAotCQkJCSJDYXBhYmlsaXR5UGF0dGVybiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MsCi0JCQkJUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuY2xhc3MsCi0JCQkJIlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0Jhc2VkT25Qcm9jZXNzZXMoKSwKLQkJCQl0aGlzLmdldFByb2Nlc3MoKSwKLQkJCQludWxsLAotCQkJCSJiYXNlZE9uUHJvY2Vzc2VzIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcm9hZG1hcEVDbGFzcywKLQkJCQlSb2FkbWFwLmNsYXNzLAotCQkJCSJSb2FkbWFwIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcm9jZXNzQ29tcG9uZW50RUNsYXNzLAotCQkJCVByb2Nlc3NDb21wb25lbnQuY2xhc3MsCi0JCQkJIlByb2Nlc3NDb21wb25lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc0NvbXBvbmVudF9JbnRlcmZhY2VzKCksCi0JCQkJdGhpcy5nZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCksCi0JCQkJbnVsbCwKLQkJCQkiaW50ZXJmYWNlcyIsIG51bGwsIDEsIC0xLCBQcm9jZXNzQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKSwKLQkJCQl0aGlzLmdldFByb2Nlc3MoKSwKLQkJCQludWxsLAotCQkJCSJwcm9jZXNzIiwgbnVsbCwgMSwgMSwgUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcm9jZXNzUGFja2FnZUVDbGFzcywKLQkJCQlQcm9jZXNzUGFja2FnZS5jbGFzcywKLQkJCQkiUHJvY2Vzc1BhY2thZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnRzKCksCi0JCQkJdGhpcy5nZXRQcm9jZXNzRWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJInByb2Nlc3NFbGVtZW50cyIsIG51bGwsIDAsIC0xLCBQcm9jZXNzUGFja2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzUGFja2FnZV9EaWFncmFtcygpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbSgpLAotCQkJCW51bGwsCi0JCQkJImRpYWdyYW1zIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLAotCQkJCVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuY2xhc3MsCi0JCQkJIlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpLAotCQkJCXRoaXMuZ2V0VGFza0Rlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJpbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyIsIG51bGwsIDAsIC0xLCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLAotCQkJCW51bGwsCi0JCQkJImludGVyZmFjZUlPIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yRUNsYXNzLAotCQkJCVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmNsYXNzLAotCQkJCSJQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9Qcm9jZXNzQ29tcG9uZW50KCksCi0JCQkJdGhpcy5nZXRQcm9jZXNzQ29tcG9uZW50KCksCi0JCQkJbnVsbCwKLQkJCQkiUHJvY2Vzc0NvbXBvbmVudCIsIG51bGwsIDEsIDEsIFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQltZXRob2RQbHVnaW5FQ2xhc3MsCi0JCQkJTWV0aG9kUGx1Z2luLmNsYXNzLAotCQkJCSJNZXRob2RQbHVnaW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuT2JqZWN0KCksCi0JCQkJInVzZXJDaGFuZ2VhYmxlIiwgInRydWUiLCAwLCAxLCBNZXRob2RQbHVnaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZXMoKSwKLQkJCQl0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSwKLQkJCQludWxsLAotCQkJCSJtZXRob2RQYWNrYWdlcyIsIG51bGwsIDEsIC0xLCBNZXRob2RQbHVnaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCksCi0JCQkJdGhpcy5nZXRNZXRob2RQbHVnaW4oKSwKLQkJCQludWxsLAotCQkJCSJiYXNlcyIsIG51bGwsIDAsIC0xLCBNZXRob2RQbHVnaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl2YXJpYWJpbGl0eUVsZW1lbnRFQ2xhc3MsCi0JCQkJVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzLAotCQkJCSJWYXJpYWJpbGl0eUVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCksCi0JCQkJdGhpcy5nZXRWYXJpYWJpbGl0eVR5cGUoKSwKLQkJCQkidmFyaWFiaWxpdHlUeXBlIiwgIm5hIiwgMCwgMSwgVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldFZhcmlhYmlsaXR5RWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJInZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLCBudWxsLCAxLCAxLCBWYXJpYWJpbGl0eUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCW1ldGhvZFVuaXRFQ2xhc3MsCi0JCQkJTWV0aG9kVW5pdC5jbGFzcywKLQkJCQkiTWV0aG9kVW5pdCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE1ldGhvZFVuaXRfQXV0aG9ycygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImF1dGhvcnMiLCAiIiwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpLAotCQkJCXRoaXMuZ2V0RGF0ZSgpLAotCQkJCSJjaGFuZ2VEYXRlIiwgbnVsbCwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiY2hhbmdlRGVzY3JpcHRpb24iLCAiIiwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE1ldGhvZFVuaXRfVmVyc2lvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInZlcnNpb24iLCAiIiwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZFVuaXRfQ29weXJpZ2h0U3RhdGVtZW50KCksCi0JCQkJdGhpcy5nZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSwKLQkJCQludWxsLAotCQkJCSJjb3B5cmlnaHRTdGF0ZW1lbnQiLCBudWxsLCAxLCAxLCBNZXRob2RVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQltZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLAotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsCi0JCQkJIk1ldGhvZENvbmZpZ3VyYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKSwKLQkJCQl0aGlzLmdldE1ldGhvZFBsdWdpbigpLAotCQkJCW51bGwsCi0JCQkJIm1ldGhvZFBsdWdpblNlbGVjdGlvbiIsIG51bGwsIDEsIC0xLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSwKLQkJCQl0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSwKLQkJCQludWxsLAotCQkJCSJtZXRob2RQYWNrYWdlU2VsZWN0aW9uIiwgbnVsbCwgMSwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXdzKCksCi0JCQkJdGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSwKLQkJCQludWxsLAotCQkJCSJwcm9jZXNzVmlld3MiLCBudWxsLCAwLCAtMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpLAotCQkJCXRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCksCi0JCQkJbnVsbCwKLQkJCQkiZGVmYXVsdFZpZXciLCBudWxsLCAxLCAxLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb25fQmFzZUNvbmZpZ3VyYXRpb25zKCksCi0JCQkJdGhpcy5nZXRNZXRob2RDb25maWd1cmF0aW9uKCksCi0JCQkJbnVsbCwKLQkJCQkiYmFzZUNvbmZpZ3VyYXRpb25zIiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCksCi0JCQkJdGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSwKLQkJCQludWxsLAotCQkJCSJzdWJ0cmFjdGVkQ2F0ZWdvcnkiLCBudWxsLCAwLCAtMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCksCi0JCQkJdGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSwKLQkJCQludWxsLAotCQkJCSJhZGRlZENhdGVnb3J5IiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcm9jZXNzRmFtaWx5RUNsYXNzLAotCQkJCVByb2Nlc3NGYW1pbHkuY2xhc3MsCi0JCQkJIlByb2Nlc3NGYW1pbHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc0ZhbWlseV9EZWxpdmVyeVByb2Nlc3NlcygpLAotCQkJCXRoaXMuZ2V0RGVsaXZlcnlQcm9jZXNzKCksCi0JCQkJbnVsbCwKLQkJCQkiZGVsaXZlcnlQcm9jZXNzZXMiLCBudWxsLCAwLCAtMSwgUHJvY2Vzc0ZhbWlseS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCW1ldGhvZExpYnJhcnlFQ2xhc3MsCi0JCQkJTWV0aG9kTGlicmFyeS5jbGFzcywKLQkJCQkiTWV0aG9kTGlicmFyeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbnMoKSwKLQkJCQl0aGlzLmdldE1ldGhvZFBsdWdpbigpLAotCQkJCW51bGwsCi0JCQkJIm1ldGhvZFBsdWdpbnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kTGlicmFyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLAotCQkJCXRoaXMuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLAotCQkJCW51bGwsCi0JCQkJInByZWRlZmluZWRDb25maWd1cmF0aW9ucyIsIG51bGwsIDAsIC0xLCBNZXRob2RMaWJyYXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKHdvcmtPcmRlclR5cGVFRW51bSwgV29ya09yZGVyVHlwZS5jbGFzcywgIldvcmtPcmRlclR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwod29ya09yZGVyVHlwZUVFbnVtLAotCQkJCVdvcmtPcmRlclR5cGUuRklOSVNIX1RPX1NUQVJUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwod29ya09yZGVyVHlwZUVFbnVtLAotCQkJCVdvcmtPcmRlclR5cGUuRklOSVNIX1RPX0ZJTklTSF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHdvcmtPcmRlclR5cGVFRW51bSwKLQkJCQlXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX1NUQVJUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwod29ya09yZGVyVHlwZUVFbnVtLAotCQkJCVdvcmtPcmRlclR5cGUuU1RBUlRfVE9fRklOSVNIX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShwc2V1ZG9TdGF0ZUtpbmRFRW51bSwgUHNldWRvU3RhdGVLaW5kLmNsYXNzLAotCQkJCSJQc2V1ZG9TdGF0ZUtpbmQiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwocHNldWRvU3RhdGVLaW5kRUVudW0sIFBzZXVkb1N0YXRlS2luZC5JTklUSUFMX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHNldWRvU3RhdGVLaW5kRUVudW0sIFBzZXVkb1N0YXRlS2luZC5KT0lOX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHNldWRvU3RhdGVLaW5kRUVudW0sIFBzZXVkb1N0YXRlS2luZC5GT1JLX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHNldWRvU3RhdGVLaW5kRUVudW0sIFBzZXVkb1N0YXRlS2luZC5KVU5DVElPTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHBzZXVkb1N0YXRlS2luZEVFbnVtLCBQc2V1ZG9TdGF0ZUtpbmQuQ0hPSUNFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHNldWRvU3RhdGVLaW5kRUVudW0sCi0JCQkJUHNldWRvU3RhdGVLaW5kLkVOVFJZX1BPSU5UX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHNldWRvU3RhdGVLaW5kRUVudW0sCi0JCQkJUHNldWRvU3RhdGVLaW5kLkVYSVRfUE9JTlRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwc2V1ZG9TdGF0ZUtpbmRFRW51bSwgUHNldWRvU3RhdGVLaW5kLlRFUk1JTkFURV9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0odmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5jbGFzcywKLQkJCQkiVmFyaWFiaWxpdHlUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuTkFfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwKLQkJCQlWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sCi0JCQkJVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLAotCQkJCVZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLAotCQkJCVZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX1JFUExBQ0VTX0xJVEVSQUwpOwotCi0JCS8vIEluaXRpYWxpemUgZGF0YSB0eXBlcwotCQlpbml0RURhdGFUeXBlKGRhdGVFRGF0YVR5cGUsIERhdGUuY2xhc3MsCi0JCQkJIkRhdGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUodXJpRURhdGFUeXBlLCBqYXZhLm5ldC5VUkkuY2xhc3MsCi0JCQkJIlVyaSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZSgKLQkJCQl1bmxpbWl0ZWROYXR1cmFsRURhdGFUeXBlLAotCQkJCWludC5jbGFzcywKLQkJCQkiVW5saW1pdGVkTmF0dXJhbCIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShzdHJpbmdFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywKLQkJCQkiU3RyaW5nIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHNldEVEYXRhVHlwZSwgU2V0LmNsYXNzLAotCQkJCSJTZXQiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoc2VxdWVuY2VFRGF0YVR5cGUsIExpc3QuY2xhc3MsCi0JCQkJIlNlcXVlbmNlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGludGVnZXJFRGF0YVR5cGUsIGludC5jbGFzcywKLQkJCQkiSW50ZWdlciIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShmbG9hdEVEYXRhVHlwZSwgRmxvYXQuY2xhc3MsCi0JCQkJIkZsb2F0IiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0gLy9VbWFQYWNrYWdlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1ZhcmlhYmlsaXR5RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1ZhcmlhYmlsaXR5RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTc4ODI5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9WYXJpYWJpbGl0eUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlZhcmlhYmlsaXR5IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5WYXJpYWJpbGl0eUVsZW1lbnRJbXBsI2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlZhcmlhYmlsaXR5RWxlbWVudEltcGwjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhcmlhYmlsaXR5RWxlbWVudEltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbAotCQlpbXBsZW1lbnRzIFZhcmlhYmlsaXR5RWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGUgVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCA9IFZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFyaWFiaWxpdHlFbGVtZW50IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFZhcmlhYmlsaXR5RWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5VHlwZSBnZXRWYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSBuZXdWYXJpYWJpbGl0eVR5cGUpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIG9sZFZhcmlhYmlsaXR5VHlwZSA9IHZhcmlhYmlsaXR5VHlwZTsKLQkJdmFyaWFiaWxpdHlUeXBlID0gbmV3VmFyaWFiaWxpdHlUeXBlID09IG51bGwgPyBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUCi0JCQkJOiBuZXdWYXJpYWJpbGl0eVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSwKLQkJCQkJb2xkVmFyaWFiaWxpdHlUeXBlLCB2YXJpYWJpbGl0eVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlFbGVtZW50IGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCWlmICh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG51bGwKLQkJCQkmJiAoKEVPYmplY3QpIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlUmVzb2x2ZVByb3h5KG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpOwotCQkJaWYgKHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgIT0gb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQsCi0JCQkJCQkJb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCwKLQkJCQkJCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5RWxlbWVudCBiYXNpY0dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoCi0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkgewotCQlWYXJpYWJpbGl0eUVsZW1lbnQgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSBuZXdWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLQkJCQkJdGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULAotCQkJCQlvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50LCB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJc2V0VmFyaWFiaWxpdHlUeXBlKChWYXJpYWJpbGl0eVR5cGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KChWYXJpYWJpbGl0eUVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJc2V0VmFyaWFiaWxpdHlUeXBlKFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKFZhcmlhYmlsaXR5RWxlbWVudCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZSAhPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmFyaWFiaWxpdHlUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHZhcmlhYmlsaXR5VHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1ZhcmlhYmlsaXR5RWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1ZlcnRleEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1ZlcnRleEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDExOWU5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9WZXJ0ZXhJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmVydGV4PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVmVydGV4SW1wbCNnZXRDb250YWluZXJfIDxlbT5Db250YWluZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5WZXJ0ZXhJbXBsI2dldE91dGdvaW5nIDxlbT5PdXRnb2luZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlZlcnRleEltcGwjZ2V0SW5jb21pbmcgPGVtPkluY29taW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVmVydGV4SW1wbCBleHRlbmRzIE11bHRpUmVzb3VyY2VFT2JqZWN0IGltcGxlbWVudHMgVmVydGV4IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGdvaW5nKCkgPGVtPk91dGdvaW5nPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE91dGdvaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgb3V0Z29pbmcgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5jb21pbmcoKSA8ZW0+SW5jb21pbmc8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5jb21pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbmNvbWluZyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmVydGV4SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVkVSVEVYOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZWdpb24gZ2V0Q29udGFpbmVyXygpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5WRVJURVhfX0NPTlRBSU5FUikKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKFJlZ2lvbikgZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZWdpb24gYmFzaWNHZXRDb250YWluZXIoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuVkVSVEVYX19DT05UQUlORVIpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChSZWdpb24pIGVJbnRlcm5hbENvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbnRhaW5lcihSZWdpb24gbmV3Q29udGFpbmVyLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0NvbnRhaW5lciwKLQkJCQlVbWFQYWNrYWdlLlZFUlRFWF9fQ09OVEFJTkVSLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKFJlZ2lvbiBuZXdDb250YWluZXIpIHsKLQkJaWYgKG5ld0NvbnRhaW5lciAhPSBlSW50ZXJuYWxDb250YWluZXIoKQotCQkJCXx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuVkVSVEVYX19DT05UQUlORVIgJiYgbmV3Q29udGFpbmVyICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgKEVPYmplY3QpIG5ld0NvbnRhaW5lcikpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0NvbnRhaW5lcikuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuUkVHSU9OX19WRVJURVgsIFJlZ2lvbi5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb250YWluZXIobmV3Q29udGFpbmVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5WRVJURVhfX0NPTlRBSU5FUiwgbmV3Q29udGFpbmVyLCBuZXdDb250YWluZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRPdXRnb2luZygpIHsKLQkJaWYgKG91dGdvaW5nID09IG51bGwpIHsKLQkJCW91dGdvaW5nID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0KFRyYW5zaXRpb24uY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuVkVSVEVYX19PVVRHT0lORywKLQkJCQkJVW1hUGFja2FnZS5UUkFOU0lUSU9OX19TT1VSQ0UpOwotCQl9Ci0JCXJldHVybiBvdXRnb2luZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbmNvbWluZygpIHsKLQkJaWYgKGluY29taW5nID09IG51bGwpIHsKLQkJCWluY29taW5nID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0KFRyYW5zaXRpb24uY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuVkVSVEVYX19JTkNPTUlORywKLQkJCQkJVW1hUGFja2FnZS5UUkFOU0lUSU9OX19UQVJHRVQpOwotCQl9Ci0JCXJldHVybiBpbmNvbWluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVkVSVEVYX19DT05UQUlORVI6Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldENvbnRhaW5lcigoUmVnaW9uKSBvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5WRVJURVhfX09VVEdPSU5HOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0T3V0Z29pbmcoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuVkVSVEVYX19JTkNPTUlORzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEluY29taW5nKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlZFUlRFWF9fQ09OVEFJTkVSOgotCQkJcmV0dXJuIGJhc2ljU2V0Q29udGFpbmVyKG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuVkVSVEVYX19PVVRHT0lORzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldE91dGdvaW5nKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlZFUlRFWF9fSU5DT01JTkc6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRJbmNvbWluZygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZSgKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5WRVJURVhfX0NPTlRBSU5FUjoKLQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlJFR0lPTl9fVkVSVEVYLCBSZWdpb24uY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5WRVJURVhfX0NPTlRBSU5FUjoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRDb250YWluZXJfKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRDb250YWluZXIoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlZFUlRFWF9fT1VUR09JTkc6Ci0JCQlyZXR1cm4gZ2V0T3V0Z29pbmcoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlZFUlRFWF9fSU5DT01JTkc6Ci0JCQlyZXR1cm4gZ2V0SW5jb21pbmcoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVkVSVEVYX19DT05UQUlORVI6Ci0JCQlzZXRDb250YWluZXIoKFJlZ2lvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVkVSVEVYX19PVVRHT0lORzoKLQkJCWdldE91dGdvaW5nKCkuY2xlYXIoKTsKLQkJCWdldE91dGdvaW5nKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5WRVJURVhfX0lOQ09NSU5HOgotCQkJZ2V0SW5jb21pbmcoKS5jbGVhcigpOwotCQkJZ2V0SW5jb21pbmcoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5WRVJURVhfX0NPTlRBSU5FUjoKLQkJCXNldENvbnRhaW5lcigoUmVnaW9uKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlZFUlRFWF9fT1VUR09JTkc6Ci0JCQlnZXRPdXRnb2luZygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5WRVJURVhfX0lOQ09NSU5HOgotCQkJZ2V0SW5jb21pbmcoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVkVSVEVYX19DT05UQUlORVI6Ci0JCQlyZXR1cm4gYmFzaWNHZXRDb250YWluZXIoKSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuVkVSVEVYX19PVVRHT0lORzoKLQkJCXJldHVybiBvdXRnb2luZyAhPSBudWxsICYmICFvdXRnb2luZy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5WRVJURVhfX0lOQ09NSU5HOgotCQkJcmV0dXJuIGluY29taW5nICE9IG51bGwgJiYgIWluY29taW5nLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vVmVydGV4SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1doaXRlcGFwZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9XaGl0ZXBhcGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMGNkNWExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1doaXRlcGFwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2hpdGVwYXBlckltcGwgZXh0ZW5kcyBDb25jZXB0SW1wbCBpbXBsZW1lbnRzIFdoaXRlcGFwZXIgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdoaXRlcGFwZXJJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XSElURVBBUEVSOwotCX0KLQotfSAvL1doaXRlcGFwZXJJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtCcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMDdhZTFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtCcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBCcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCNnZXRJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0SXNPbmdvaW5nIDxlbT5JcyBPbmdvaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsI2dldElzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCNnZXRMaW5rVG9QcmVkZWNlc3NvciA8ZW0+TGluayBUbyBQcmVkZWNlc3NvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJbXBsCi0JCWltcGxlbWVudHMgV29ya0JyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzUmVwZWF0YWJsZSgpIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1JlcGVhdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19SRVBFQVRBQkxFX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzUmVwZWF0YWJsZSgpIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1JlcGVhdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzUmVwZWF0YWJsZSA9IElTX1JFUEVBVEFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNPbmdvaW5nKCkgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzT25nb2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX09OR09JTkdfRURFRkFVTFQgPSBCb29sZWFuLkZBTFNFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNPbmdvaW5nKCkgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzT25nb2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNPbmdvaW5nID0gSVNfT05HT0lOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc0V2ZW50RHJpdmVuKCkgPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNFdmVudERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX0VWRU5UX0RSSVZFTl9FREVGQVVMVCA9IEJvb2xlYW4uRkFMU0U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc0V2ZW50RHJpdmVuKCkgPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNFdmVudERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNFdmVudERyaXZlbiA9IElTX0VWRU5UX0RSSVZFTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtUb1ByZWRlY2Vzc29yKCkgPGVtPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua1RvUHJlZGVjZXNzb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBsaW5rVG9QcmVkZWNlc3NvciA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzUmVwZWF0YWJsZSgpIHsKLQkJcmV0dXJuIGlzUmVwZWF0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1JlcGVhdGFibGUoQm9vbGVhbiBuZXdJc1JlcGVhdGFibGUpIHsKLQkJQm9vbGVhbiBvbGRJc1JlcGVhdGFibGUgPSBpc1JlcGVhdGFibGU7Ci0JCWlzUmVwZWF0YWJsZSA9IG5ld0lzUmVwZWF0YWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFLAotCQkJCQlvbGRJc1JlcGVhdGFibGUsIGlzUmVwZWF0YWJsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzT25nb2luZygpIHsKLQkJcmV0dXJuIGlzT25nb2luZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc09uZ29pbmcoQm9vbGVhbiBuZXdJc09uZ29pbmcpIHsKLQkJQm9vbGVhbiBvbGRJc09uZ29pbmcgPSBpc09uZ29pbmc7Ci0JCWlzT25nb2luZyA9IG5ld0lzT25nb2luZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HLAotCQkJCQlvbGRJc09uZ29pbmcsIGlzT25nb2luZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzRXZlbnREcml2ZW4oKSB7Ci0JCXJldHVybiBpc0V2ZW50RHJpdmVuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzRXZlbnREcml2ZW4oQm9vbGVhbiBuZXdJc0V2ZW50RHJpdmVuKSB7Ci0JCUJvb2xlYW4gb2xkSXNFdmVudERyaXZlbiA9IGlzRXZlbnREcml2ZW47Ci0JCWlzRXZlbnREcml2ZW4gPSBuZXdJc0V2ZW50RHJpdmVuOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTiwKLQkJCQkJb2xkSXNFdmVudERyaXZlbiwgaXNFdmVudERyaXZlbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldExpbmtUb1ByZWRlY2Vzc29yKCkgewotCQlpZiAobGlua1RvUHJlZGVjZXNzb3IgPT0gbnVsbCkgewotCQkJbGlua1RvUHJlZGVjZXNzb3IgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KFdvcmtPcmRlci5jbGFzcywKLQkJCQkJdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SKTsKLQkJfQotCQlyZXR1cm4gbGlua1RvUHJlZGVjZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRToKLQkJCXJldHVybiBnZXRJc1JlcGVhdGFibGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc6Ci0JCQlyZXR1cm4gZ2V0SXNPbmdvaW5nKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQlyZXR1cm4gZ2V0SXNFdmVudERyaXZlbigpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUjoKLQkJCXJldHVybiBnZXRMaW5rVG9QcmVkZWNlc3NvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQkJc2V0SXNSZXBlYXRhYmxlKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQkJc2V0SXNPbmdvaW5nKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQlzZXRJc0V2ZW50RHJpdmVuKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SOgotCQkJZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5jbGVhcigpOwotCQkJZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQkJc2V0SXNSZXBlYXRhYmxlKElTX1JFUEVBVEFCTEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJCXNldElzT25nb2luZyhJU19PTkdPSU5HX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjoKLQkJCXNldElzRXZlbnREcml2ZW4oSVNfRVZFTlRfRFJJVkVOX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1I6Ci0JCQlnZXRMaW5rVG9QcmVkZWNlc3NvcigpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQkJcmV0dXJuIElTX1JFUEVBVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IGlzUmVwZWF0YWJsZSAhPSBudWxsCi0JCQkJCTogIUlTX1JFUEVBVEFCTEVfRURFRkFVTFQuZXF1YWxzKGlzUmVwZWF0YWJsZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQkJcmV0dXJuIElTX09OR09JTkdfRURFRkFVTFQgPT0gbnVsbCA/IGlzT25nb2luZyAhPSBudWxsCi0JCQkJCTogIUlTX09OR09JTkdfRURFRkFVTFQuZXF1YWxzKGlzT25nb2luZyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQlyZXR1cm4gSVNfRVZFTlRfRFJJVkVOX0VERUZBVUxUID09IG51bGwgPyBpc0V2ZW50RHJpdmVuICE9IG51bGwKLQkJCQkJOiAhSVNfRVZFTlRfRFJJVkVOX0VERUZBVUxULmVxdWFscyhpc0V2ZW50RHJpdmVuKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1I6Ci0JCQlyZXR1cm4gbGlua1RvUHJlZGVjZXNzb3IgIT0gbnVsbCAmJiAhbGlua1RvUHJlZGVjZXNzb3IuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzUmVwZWF0YWJsZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpc1JlcGVhdGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzT25nb2luZzogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpc09uZ29pbmcpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzRXZlbnREcml2ZW46ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNFdmVudERyaXZlbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dvcmtCcmVha2Rvd25FbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya0RlZmluaXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrRGVmaW5pdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTRhZTQ0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrRGVmaW5pdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBEZWZpbml0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXb3JrRGVmaW5pdGlvbkltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVdvcmtEZWZpbml0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNvbmRpdGlvbigpIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnQgcHJlY29uZGl0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3Rjb25kaXRpb24oKSA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnQgcG9zdGNvbmRpdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya0RlZmluaXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgZ2V0UHJlY29uZGl0aW9uKCkgewotCQlpZiAocHJlY29uZGl0aW9uICE9IG51bGwgJiYgKChFT2JqZWN0KSBwcmVjb25kaXRpb24pLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQcmVjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb247Ci0JCQlwcmVjb25kaXRpb24gPSAoQ29uc3RyYWludCkgZVJlc29sdmVQcm94eShvbGRQcmVjb25kaXRpb24pOwotCQkJaWYgKHByZWNvbmRpdGlvbiAhPSBvbGRQcmVjb25kaXRpb24pIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3UHJlY29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcHJlY29uZGl0aW9uOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQcmVjb25kaXRpb24uZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLAotCQkJCQkJbnVsbCwgbnVsbCk7Ci0JCQkJaWYgKG5ld1ByZWNvbmRpdGlvbi5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdQcmVjb25kaXRpb24uZUludmVyc2VBZGQodGhpcywKLQkJCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCQktIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sCi0JCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sCi0JCQkJCQkJb2xkUHJlY29uZGl0aW9uLCBwcmVjb25kaXRpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGJhc2ljR2V0UHJlY29uZGl0aW9uKCkgewotCQlyZXR1cm4gcHJlY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbiwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ29uc3RyYWludCBvbGRQcmVjb25kaXRpb24gPSBwcmVjb25kaXRpb247Ci0JCXByZWNvbmRpdGlvbiA9IG5ld1ByZWNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiwKLQkJCQkJb2xkUHJlY29uZGl0aW9uLCBuZXdQcmVjb25kaXRpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlY29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UHJlY29uZGl0aW9uKSB7Ci0JCWlmIChuZXdQcmVjb25kaXRpb24gIT0gcHJlY29uZGl0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcmVjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQcmVjb25kaXRpb24pLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJlY29uZGl0aW9uKG5ld1ByZWNvbmRpdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sIG5ld1ByZWNvbmRpdGlvbiwKLQkJCQkJbmV3UHJlY29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgZ2V0UG9zdGNvbmRpdGlvbigpIHsKLQkJaWYgKHBvc3Rjb25kaXRpb24gIT0gbnVsbCAmJiAoKEVPYmplY3QpIHBvc3Rjb25kaXRpb24pLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQb3N0Y29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcG9zdGNvbmRpdGlvbjsKLQkJCXBvc3Rjb25kaXRpb24gPSAoQ29uc3RyYWludCkgZVJlc29sdmVQcm94eShvbGRQb3N0Y29uZGl0aW9uKTsKLQkJCWlmIChwb3N0Y29uZGl0aW9uICE9IG9sZFBvc3Rjb25kaXRpb24pIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3UG9zdGNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb247Ci0JCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFBvc3Rjb25kaXRpb24uZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQkJCW51bGwsIG51bGwpOwotCQkJCWlmIChuZXdQb3N0Y29uZGl0aW9uLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1Bvc3Rjb25kaXRpb24KLQkJCQkJCQkuZUludmVyc2VBZGQoCi0JCQkJCQkJCQl0aGlzLAotCQkJCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJCQktIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLAotCQkJCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLAotCQkJCQkJCW9sZFBvc3Rjb25kaXRpb24sIHBvc3Rjb25kaXRpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcG9zdGNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBiYXNpY0dldFBvc3Rjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBvc3Rjb25kaXRpb24oQ29uc3RyYWludCBuZXdQb3N0Y29uZGl0aW9uLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlDb25zdHJhaW50IG9sZFBvc3Rjb25kaXRpb24gPSBwb3N0Y29uZGl0aW9uOwotCQlwb3N0Y29uZGl0aW9uID0gbmV3UG9zdGNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04sCi0JCQkJCW9sZFBvc3Rjb25kaXRpb24sIG5ld1Bvc3Rjb25kaXRpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50IG5ld1Bvc3Rjb25kaXRpb24pIHsKLQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24gIT0gcG9zdGNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgcG9zdGNvbmRpdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1Bvc3Rjb25kaXRpb24pLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04sCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBvc3Rjb25kaXRpb24obmV3UG9zdGNvbmRpdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLAotCQkJCQluZXdQb3N0Y29uZGl0aW9uLCBuZXdQb3N0Y29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJcmV0dXJuIGJhc2ljU2V0UHJlY29uZGl0aW9uKG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJcmV0dXJuIGJhc2ljU2V0UG9zdGNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJlY29uZGl0aW9uKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQcmVjb25kaXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQb3N0Y29uZGl0aW9uKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQb3N0Y29uZGl0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJc2V0UHJlY29uZGl0aW9uKChDb25zdHJhaW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQlzZXRQb3N0Y29uZGl0aW9uKChDb25zdHJhaW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT046Ci0JCQlzZXRQcmVjb25kaXRpb24oKENvbnN0cmFpbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJc2V0UG9zdGNvbmRpdGlvbigoQ29uc3RyYWludCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBwcmVjb25kaXRpb24gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCXJldHVybiBwb3N0Y29uZGl0aW9uICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1dvcmtEZWZpbml0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya09yZGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya09yZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MTQ1OGUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtPcmRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBPcmRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtPcmRlckltcGwjZ2V0TGlua1R5cGUgPGVtPkxpbmsgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtPcmRlckltcGwjZ2V0UHJlZCA8ZW0+UHJlZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtPcmRlckltcGwgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEltcGwgaW1wbGVtZW50cyBXb3JrT3JkZXIgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtUeXBlKCkgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgV29ya09yZGVyVHlwZSBMSU5LX1RZUEVfRURFRkFVTFQgPSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVF9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGlua1R5cGUoKSA8ZW0+TGluayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaW5rVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtPcmRlclR5cGUgbGlua1R5cGUgPSBMSU5LX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVkKCkgPGVtPlByZWQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrT3JkZXJJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX09SREVSOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrT3JkZXJUeXBlIGdldExpbmtUeXBlKCkgewotCQlyZXR1cm4gbGlua1R5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZSBuZXdMaW5rVHlwZSkgewotCQlXb3JrT3JkZXJUeXBlIG9sZExpbmtUeXBlID0gbGlua1R5cGU7Ci0JCWxpbmtUeXBlID0gbmV3TGlua1R5cGUgPT0gbnVsbCA/IExJTktfVFlQRV9FREVGQVVMVCA6IG5ld0xpbmtUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRSwgb2xkTGlua1R5cGUsIGxpbmtUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtCcmVha2Rvd25FbGVtZW50IGdldFByZWQoKSB7Ci0JCWlmIChwcmVkICE9IG51bGwgJiYgKChFT2JqZWN0KSBwcmVkKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJlZCA9IChJbnRlcm5hbEVPYmplY3QpIHByZWQ7Ci0JCQlwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBlUmVzb2x2ZVByb3h5KG9sZFByZWQpOwotCQkJaWYgKHByZWQgIT0gb2xkUHJlZCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5XT1JLX09SREVSX19QUkVELCBvbGRQcmVkLCBwcmVkKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtCcmVha2Rvd25FbGVtZW50IGJhc2ljR2V0UHJlZCgpIHsKLQkJcmV0dXJuIHByZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZChXb3JrQnJlYWtkb3duRWxlbWVudCBuZXdQcmVkKSB7Ci0JCVdvcmtCcmVha2Rvd25FbGVtZW50IG9sZFByZWQgPSBwcmVkOwotCQlwcmVkID0gbmV3UHJlZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX09SREVSX19QUkVELCBvbGRQcmVkLCBwcmVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFOgotCQkJcmV0dXJuIGdldExpbmtUeXBlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19QUkVEOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFByZWQoKTsKLQkJCXJldHVybiBiYXNpY0dldFByZWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFOgotCQkJc2V0TGlua1R5cGUoKFdvcmtPcmRlclR5cGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX1BSRUQ6Ci0JCQlzZXRQcmVkKChXb3JrQnJlYWtkb3duRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRToKLQkJCXNldExpbmtUeXBlKExJTktfVFlQRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19QUkVEOgotCQkJc2V0UHJlZCgoV29ya0JyZWFrZG93bkVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFOgotCQkJcmV0dXJuIGxpbmtUeXBlICE9IExJTktfVFlQRV9FREVGQVVMVDsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX1BSRUQ6Ci0JCQlyZXR1cm4gcHJlZCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxpbmtUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGxpbmtUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV29ya09yZGVySW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0YjRlNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCNnZXRJbXBhY3RPZk5vdEhhdmluZyA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCNnZXRSZWFzb25zRm9yTm90TmVlZGluZyA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwKLQkJaW1wbGVtZW50cyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbElkKCkgPGVtPkV4dGVybmFsIElkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9JRF9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxJZCgpIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBleHRlcm5hbElkID0gRVhURVJOQUxfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQVVJQT1NFX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVycG9zZSA9IFBVUlBPU0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKSA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEltcGFjdE9mTm90SGF2aW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKSA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEltcGFjdE9mTm90SGF2aW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGltcGFjdE9mTm90SGF2aW5nID0gSU1QQUNUX09GX05PVF9IQVZJTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKSA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFTT05TX0ZPUl9OT1RfTkVFRElOR19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKSA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlYXNvbnNGb3JOb3ROZWVkaW5nID0gUkVBU09OU19GT1JfTk9UX05FRURJTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVybmFsSWQoKSB7Ci0JCXJldHVybiBleHRlcm5hbElkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsSWQoU3RyaW5nIG5ld0V4dGVybmFsSWQpIHsKLQkJU3RyaW5nIG9sZEV4dGVybmFsSWQgPSBleHRlcm5hbElkOwotCQlleHRlcm5hbElkID0gbmV3RXh0ZXJuYWxJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lELAotCQkJCQlvbGRFeHRlcm5hbElkLCBleHRlcm5hbElkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdXJwb3NlKCkgewotCQlyZXR1cm4gcHVycG9zZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXJwb3NlKFN0cmluZyBuZXdQdXJwb3NlKSB7Ci0JCVN0cmluZyBvbGRQdXJwb3NlID0gcHVycG9zZTsKLQkJcHVycG9zZSA9IG5ld1B1cnBvc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFLCBvbGRQdXJwb3NlLAotCQkJCQlwdXJwb3NlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbXBhY3RPZk5vdEhhdmluZygpIHsKLQkJcmV0dXJuIGltcGFjdE9mTm90SGF2aW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltcGFjdE9mTm90SGF2aW5nKFN0cmluZyBuZXdJbXBhY3RPZk5vdEhhdmluZykgewotCQlTdHJpbmcgb2xkSW1wYWN0T2ZOb3RIYXZpbmcgPSBpbXBhY3RPZk5vdEhhdmluZzsKLQkJaW1wYWN0T2ZOb3RIYXZpbmcgPSBuZXdJbXBhY3RPZk5vdEhhdmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HLAotCQkJCQlvbGRJbXBhY3RPZk5vdEhhdmluZywgaW1wYWN0T2ZOb3RIYXZpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkgewotCQlyZXR1cm4gcmVhc29uc0Zvck5vdE5lZWRpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoU3RyaW5nIG5ld1JlYXNvbnNGb3JOb3ROZWVkaW5nKSB7Ci0JCVN0cmluZyBvbGRSZWFzb25zRm9yTm90TmVlZGluZyA9IHJlYXNvbnNGb3JOb3ROZWVkaW5nOwotCQlyZWFzb25zRm9yTm90TmVlZGluZyA9IG5ld1JlYXNvbnNGb3JOb3ROZWVkaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLQkJCQkJdGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HLAotCQkJCQlvbGRSZWFzb25zRm9yTm90TmVlZGluZywgcmVhc29uc0Zvck5vdE5lZWRpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJcmV0dXJuIGdldEV4dGVybmFsSWQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXJldHVybiBnZXRQdXJwb3NlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOgotCQkJcmV0dXJuIGdldEltcGFjdE9mTm90SGF2aW5nKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOgotCQkJcmV0dXJuIGdldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ6Ci0JCQlzZXRFeHRlcm5hbElkKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXNldFB1cnBvc2UoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzoKLQkJCXNldEltcGFjdE9mTm90SGF2aW5nKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc6Ci0JCQlzZXRSZWFzb25zRm9yTm90TmVlZGluZygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJCXNldEV4dGVybmFsSWQoRVhURVJOQUxfSURfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJc2V0UHVycG9zZShQVVJQT1NFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkc6Ci0JCQlzZXRJbXBhY3RPZk5vdEhhdmluZyhJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOgotCQkJc2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoUkVBU09OU19GT1JfTk9UX05FRURJTkdfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJCXJldHVybiBFWFRFUk5BTF9JRF9FREVGQVVMVCA9PSBudWxsID8gZXh0ZXJuYWxJZCAhPSBudWxsCi0JCQkJCTogIUVYVEVSTkFMX0lEX0VERUZBVUxULmVxdWFscyhleHRlcm5hbElkKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXJldHVybiBQVVJQT1NFX0VERUZBVUxUID09IG51bGwgPyBwdXJwb3NlICE9IG51bGwKLQkJCQkJOiAhUFVSUE9TRV9FREVGQVVMVC5lcXVhbHMocHVycG9zZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOgotCQkJcmV0dXJuIElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUID09IG51bGwgPyBpbXBhY3RPZk5vdEhhdmluZyAhPSBudWxsCi0JCQkJCTogIUlNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxULmVxdWFscyhpbXBhY3RPZk5vdEhhdmluZyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOgotCQkJcmV0dXJuIFJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxUID09IG51bGwgPyByZWFzb25zRm9yTm90TmVlZGluZyAhPSBudWxsCi0JCQkJCTogIVJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhyZWFzb25zRm9yTm90TmVlZGluZyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZXh0ZXJuYWxJZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChleHRlcm5hbElkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwdXJwb3NlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHB1cnBvc2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGltcGFjdE9mTm90SGF2aW5nOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGltcGFjdE9mTm90SGF2aW5nKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZWFzb25zRm9yTm90TmVlZGluZzogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyZWFzb25zRm9yTm90TmVlZGluZyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU4OTQzMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXRBY3Rpdml0eUVudHJ5U3RhdGUgPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXRBY3Rpdml0eUV4aXRTdGF0ZSA8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0SW1wYWN0ZWRCeSA8ZW0+SW1wYWN0ZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldEltcGFjdHMgPGVtPkltcGFjdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldERlbGl2ZXJhYmxlUGFydHMgPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCBleHRlbmRzIERlc2NyaXB0b3JJbXBsIGltcGxlbWVudHMKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKSA8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZJVFlfRU5UUllfU1RBVEVfRURFRkFVTFQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkgPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWN0aXZpdHlFbnRyeVN0YXRlID0gQUNUSVZJVFlfRU5UUllfU1RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKSA8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZX0VYSVRfU1RBVEVfRURFRkFVTFQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKSA8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWN0aXZpdHlFeGl0U3RhdGUgPSBBQ1RJVklUWV9FWElUX1NUQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1Byb2R1Y3QoKSA8ZW0+V29yayBQcm9kdWN0PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltcGFjdGVkQnkoKSA8ZW0+SW1wYWN0ZWQgQnk8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW1wYWN0ZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGltcGFjdGVkQnkgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wYWN0cygpIDxlbT5JbXBhY3RzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEltcGFjdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbXBhY3RzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlbGl2ZXJhYmxlUGFydHMoKSA8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVsaXZlcmFibGVQYXJ0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlbGl2ZXJhYmxlUGFydHMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkgewotCQlyZXR1cm4gYWN0aXZpdHlFbnRyeVN0YXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5RW50cnlTdGF0ZShTdHJpbmcgbmV3QWN0aXZpdHlFbnRyeVN0YXRlKSB7Ci0JCVN0cmluZyBvbGRBY3Rpdml0eUVudHJ5U3RhdGUgPSBhY3Rpdml0eUVudHJ5U3RhdGU7Ci0JCWFjdGl2aXR5RW50cnlTdGF0ZSA9IG5ld0FjdGl2aXR5RW50cnlTdGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEUsCi0JCQkJCW9sZEFjdGl2aXR5RW50cnlTdGF0ZSwgYWN0aXZpdHlFbnRyeVN0YXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RXhpdFN0YXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5RXhpdFN0YXRlKFN0cmluZyBuZXdBY3Rpdml0eUV4aXRTdGF0ZSkgewotCQlTdHJpbmcgb2xkQWN0aXZpdHlFeGl0U3RhdGUgPSBhY3Rpdml0eUV4aXRTdGF0ZTsKLQkJYWN0aXZpdHlFeGl0U3RhdGUgPSBuZXdBY3Rpdml0eUV4aXRTdGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURSwKLQkJCQkJb2xkQWN0aXZpdHlFeGl0U3RhdGUsIGFjdGl2aXR5RXhpdFN0YXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0IGdldFdvcmtQcm9kdWN0KCkgewotCQlpZiAod29ya1Byb2R1Y3QgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHdvcmtQcm9kdWN0KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkV29ya1Byb2R1Y3QgPSAoSW50ZXJuYWxFT2JqZWN0KSB3b3JrUHJvZHVjdDsKLQkJCXdvcmtQcm9kdWN0ID0gKFdvcmtQcm9kdWN0KSBlUmVzb2x2ZVByb3h5KG9sZFdvcmtQcm9kdWN0KTsKLQkJCWlmICh3b3JrUHJvZHVjdCAhPSBvbGRXb3JrUHJvZHVjdCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNULAotCQkJCQkJCW9sZFdvcmtQcm9kdWN0LCB3b3JrUHJvZHVjdCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB3b3JrUHJvZHVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3QgYmFzaWNHZXRXb3JrUHJvZHVjdCgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtQcm9kdWN0KFdvcmtQcm9kdWN0IG5ld1dvcmtQcm9kdWN0KSB7Ci0JCVdvcmtQcm9kdWN0IG9sZFdvcmtQcm9kdWN0ID0gd29ya1Byb2R1Y3Q7Ci0JCXdvcmtQcm9kdWN0ID0gbmV3V29ya1Byb2R1Y3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVCwKLQkJCQkJb2xkV29ya1Byb2R1Y3QsIHdvcmtQcm9kdWN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW1wYWN0ZWRCeSgpIHsKLQkJaWYgKGltcGFjdGVkQnkgPT0gbnVsbCkgewotCQkJaW1wYWN0ZWRCeSA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdC5NYW55SW52ZXJzZSgKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWSwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUyk7Ci0JCX0KLQkJcmV0dXJuIGltcGFjdGVkQnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW1wYWN0cygpIHsKLQkJaWYgKGltcGFjdHMgPT0gbnVsbCkgewotCQkJaW1wYWN0cyA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdC5NYW55SW52ZXJzZSgKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTLAotCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWSk7Ci0JCX0KLQkJcmV0dXJuIGltcGFjdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVsaXZlcmFibGVQYXJ0cygpIHsKLQkJaWYgKGRlbGl2ZXJhYmxlUGFydHMgPT0gbnVsbCkgewotCQkJZGVsaXZlcmFibGVQYXJ0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFMpOwotCQl9Ci0JCXJldHVybiBkZWxpdmVyYWJsZVBhcnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRJbXBhY3RlZEJ5KCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0SW1wYWN0cygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRJbXBhY3RlZEJ5KCkpCi0JCQkJCS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEltcGFjdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEU6Ci0JCQlyZXR1cm4gZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURToKLQkJCXJldHVybiBnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRXb3JrUHJvZHVjdCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0V29ya1Byb2R1Y3QoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWToKLQkJCXJldHVybiBnZXRJbXBhY3RlZEJ5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUzoKLQkJCXJldHVybiBnZXRJbXBhY3RzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFM6Ci0JCQlyZXR1cm4gZ2V0RGVsaXZlcmFibGVQYXJ0cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEU6Ci0JCQlzZXRBY3Rpdml0eUVudHJ5U3RhdGUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEU6Ci0JCQlzZXRBY3Rpdml0eUV4aXRTdGF0ZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUOgotCQkJc2V0V29ya1Byb2R1Y3QoKFdvcmtQcm9kdWN0KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQlnZXRJbXBhY3RlZEJ5KCkuY2xlYXIoKTsKLQkJCWdldEltcGFjdGVkQnkoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJZ2V0SW1wYWN0cygpLmNsZWFyKCk7Ci0JCQlnZXRJbXBhY3RzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFM6Ci0JCQlnZXREZWxpdmVyYWJsZVBhcnRzKCkuY2xlYXIoKTsKLQkJCWdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEU6Ci0JCQlzZXRBY3Rpdml0eUVudHJ5U3RhdGUoQUNUSVZJVFlfRU5UUllfU1RBVEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEU6Ci0JCQlzZXRBY3Rpdml0eUV4aXRTdGF0ZShBQ1RJVklUWV9FWElUX1NUQVRFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1Q6Ci0JCQlzZXRXb3JrUHJvZHVjdCgoV29ya1Byb2R1Y3QpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZOgotCQkJZ2V0SW1wYWN0ZWRCeSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUzoKLQkJCWdldEltcGFjdHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEU6Ci0JCQlyZXR1cm4gQUNUSVZJVFlfRU5UUllfU1RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGFjdGl2aXR5RW50cnlTdGF0ZSAhPSBudWxsCi0JCQkJCTogIUFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxULmVxdWFscyhhY3Rpdml0eUVudHJ5U3RhdGUpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEU6Ci0JCQlyZXR1cm4gQUNUSVZJVFlfRVhJVF9TVEFURV9FREVGQVVMVCA9PSBudWxsID8gYWN0aXZpdHlFeGl0U3RhdGUgIT0gbnVsbAotCQkJCQk6ICFBQ1RJVklUWV9FWElUX1NUQVRFX0VERUZBVUxULmVxdWFscyhhY3Rpdml0eUV4aXRTdGF0ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUOgotCQkJcmV0dXJuIHdvcmtQcm9kdWN0ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQlyZXR1cm4gaW1wYWN0ZWRCeSAhPSBudWxsICYmICFpbXBhY3RlZEJ5LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJcmV0dXJuIGltcGFjdHMgIT0gbnVsbCAmJiAhaW1wYWN0cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFM6Ci0JCQlyZXR1cm4gZGVsaXZlcmFibGVQYXJ0cyAhPSBudWxsICYmICFkZWxpdmVyYWJsZVBhcnRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhY3Rpdml0eUVudHJ5U3RhdGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYWN0aXZpdHlFbnRyeVN0YXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3Rpdml0eUV4aXRTdGF0ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhY3Rpdml0eUV4aXRTdGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQzN2NkN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0UmVwb3J0cyA8ZW0+UmVwb3J0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRUZW1wbGF0ZXMgPGVtPlRlbXBsYXRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRUb29sTWVudG9ycyA8ZW0+VG9vbCBNZW50b3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFdvcmtQcm9kdWN0SW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVdvcmtQcm9kdWN0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcG9ydHMoKSA8ZW0+UmVwb3J0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXBvcnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVwb3J0cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZW1wbGF0ZXMoKSA8ZW0+VGVtcGxhdGVzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRlbXBsYXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRlbXBsYXRlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb29sTWVudG9ycygpIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9vbE1lbnRvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB0b29sTWVudG9ycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIExpc3QgZ2V0TW9kaWZpZWRCeSgpIHsKLQkJTGlzdCBvdXRwdXRGcm9tID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3V0cHV0dGluZ1Rhc2tzKHRoaXMpOyAvL3RoaXMuZ2V0T3V0cHV0RnJvbSgpOwotCQlMaXN0IG1vZGlmaWVzID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJaWYgKG91dHB1dEZyb20gIT0gbnVsbCAmJiBvdXRwdXRGcm9tLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBvdXRwdXRGcm9tLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkvLwlmb3IgZWFjaCB0YXNrIGdldCwgZ2V0IHByaW1hcnkgcGVyZm9ybWVyIHJvbGUKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCVJvbGUgbW9kaWZpZWRCeVJvbGUgPSB0YXNrLmdldFBlcmZvcm1lZEJ5KCk7Ci0JCQkJaWYgKG1vZGlmaWVkQnlSb2xlICE9IG51bGwpIHsKLQkJCQkJaWYgKCFtb2RpZmllcy5jb250YWlucyhtb2RpZmllZEJ5Um9sZSkpIHsKLQkJCQkJCW1vZGlmaWVzLmFkZChtb2RpZmllZEJ5Um9sZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlcG9ydHMoKSB7Ci0JCWlmIChyZXBvcnRzID09IG51bGwpIHsKLQkJCXJlcG9ydHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KFJlcG9ydC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1JFUE9SVFMpOwotCQl9Ci0JCXJldHVybiByZXBvcnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFRlbXBsYXRlcygpIHsKLQkJaWYgKHRlbXBsYXRlcyA9PSBudWxsKSB7Ci0JCQl0ZW1wbGF0ZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KFRlbXBsYXRlLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVEVNUExBVEVTKTsKLQkJfQotCQlyZXR1cm4gdGVtcGxhdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFRvb2xNZW50b3JzKCkgewotCQlpZiAodG9vbE1lbnRvcnMgPT0gbnVsbCkgewotCQkJdG9vbE1lbnRvcnMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KFRvb2xNZW50b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19UT09MX01FTlRPUlMpOwotCQl9Ci0JCXJldHVybiB0b29sTWVudG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCWlmIChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPT0gbnVsbCkgewotCQkJZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdCgKLQkJCQkJRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1JFUE9SVFM6Ci0JCQlyZXR1cm4gZ2V0UmVwb3J0cygpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19URU1QTEFURVM6Ci0JCQlyZXR1cm4gZ2V0VGVtcGxhdGVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SUzoKLQkJCXJldHVybiBnZXRUb29sTWVudG9ycygpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJcmV0dXJuIGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1JFUE9SVFM6Ci0JCQlnZXRSZXBvcnRzKCkuY2xlYXIoKTsKLQkJCWdldFJlcG9ydHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVEVNUExBVEVTOgotCQkJZ2V0VGVtcGxhdGVzKCkuY2xlYXIoKTsKLQkJCWdldFRlbXBsYXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19UT09MX01FTlRPUlM6Ci0JCQlnZXRUb29sTWVudG9ycygpLmNsZWFyKCk7Ci0JCQlnZXRUb29sTWVudG9ycygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fUkVQT1JUUzoKLQkJCWdldFJlcG9ydHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19URU1QTEFURVM6Ci0JCQlnZXRUZW1wbGF0ZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19UT09MX01FTlRPUlM6Ci0JCQlnZXRUb29sTWVudG9ycygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlRTOgotCQkJcmV0dXJuIHJlcG9ydHMgIT0gbnVsbCAmJiAhcmVwb3J0cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RFTVBMQVRFUzoKLQkJCXJldHVybiB0ZW1wbGF0ZXMgIT0gbnVsbCAmJiAhdGVtcGxhdGVzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTOgotCQkJcmV0dXJuIHRvb2xNZW50b3JzICE9IG51bGwgJiYgIXRvb2xNZW50b3JzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCXJldHVybiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgIT0gbnVsbAotCQkJCQkmJiAhZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vV29ya1Byb2R1Y3RJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrUHJvZHVjdFR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrUHJvZHVjdFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3ZjQyNmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3RUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGwjZ2V0V29ya1Byb2R1Y3RzIDxlbT5Xb3JrIFByb2R1Y3RzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RUeXBlSW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cwotCQlXb3JrUHJvZHVjdFR5cGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1Byb2R1Y3RzKCkgPGVtPldvcmsgUHJvZHVjdHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgd29ya1Byb2R1Y3RzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdFR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXb3JrUHJvZHVjdHMoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdHMgPT0gbnVsbCkgewotCQkJd29ya1Byb2R1Y3RzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChXb3JrUHJvZHVjdC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUUyk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUUzoKLQkJCXJldHVybiBnZXRXb3JrUHJvZHVjdHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFM6Ci0JCQlnZXRXb3JrUHJvZHVjdHMoKS5jbGVhcigpOwotCQkJZ2V0V29ya1Byb2R1Y3RzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFM6Ci0JCQlnZXRXb3JrUHJvZHVjdHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFM6Ci0JCQlyZXR1cm4gd29ya1Byb2R1Y3RzICE9IG51bGwgJiYgIXdvcmtQcm9kdWN0cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1dvcmtQcm9kdWN0VHlwZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWYwZmI3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBVTUEgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmM0NDM4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRoZSBVTUEgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9Bc3NvY2lhdGlvbkhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvQXNzb2NpYXRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWI4MDdmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9Bc3NvY2lhdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgZm9yIG5hdmlnYXRpbmcgYW5kIHF1ZXJ5aW5nIGJpZGlyZWN0aW9uYWwgYXNzb2NpYXRpb25zIGFtb25nCi0gKiB0aGUgbW9kZWwgb2JqZWN0cy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXNzb2NpYXRpb25IZWxwZXIgewotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBkaXNjaXBsaW5lcyB3aGljaCBhIHRhc2sgaXMKLQkgKiBjYXRlZ29yaXplZCB1bmRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBUYXNrX0Rpc2NpcGxpbmVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVRhc2suY2xhc3MsCi0JCQkiVGFza19EaXNjaXBsaW5lcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfVGFza3MoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCBhcmUKLQkgKiBjcmVhdGVkIGZyb20gYSBzcGVjaWZpYyB0YXNrLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFRhc2tfVGFza0Rlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVRhc2suY2xhc3MsCi0JCQkiVGFza19UYXNrRGVzY3JpcHRvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCksIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBkb21haW5zIHdoaWNoIGEgd29yayBwcm9kdWN0Ci0JICogaXMgY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3RfRG9tYWlucyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrUHJvZHVjdC5jbGFzcywKLQkJCSJXb3JrUHJvZHVjdF9Eb21haW5zIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrcyB3aGljaCBwcm9kdWNlIGEgd29yawotCSAqIHByb2R1Y3QgYXMgYW4gb3V0cHV0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0X091dHB1dEZyb21fVGFza3MgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3QuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3RfT3V0cHV0RnJvbV9UYXNrcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHRhc2tzIHdoaWNoIHVzZSBhIHdvcmsKLQkgKiBwcm9kdWN0IGFzIGEgbWFuZGF0b3J5IGlucHV0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0X01hbmRhdG9yeUlucHV0VG9fVGFza3MgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3QuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3RfSW5wdXRUb19UYXNrcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgd29yayBwcm9kdWN0IHR5cGVzIHdoaWNoIGEKLQkgKiB3b3JrIHByb2R1Y3QgaXMgY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3RfV29ya1Byb2R1Y3RUeXBlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrUHJvZHVjdC5jbGFzcywKLQkJCSJXb3JrUHJvZHVjdF9Xb3JrUHJvZHVjdFR5cGVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSByZXNwb25zaWJsZSByb2xlcyBmb3IgYSB3b3JrCi0JICogcHJvZHVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJIldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGRlbGl2ZXJhYmxlcyB3aGljaCBhIHdvcmsKLQkgKiBwcm9kdWN0IGlzIGNvbnRhaW5lZCBpbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdF9EZWxpdmVyYWJsZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3QuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3RfRGVsaXZlcmFibGVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHRhc2tzIHRoYXQgdXNlIGEgd29yayBwcm9kdWN0Ci0JICogYXMgYW4gb3B0aW9uYWwgaW5wdXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3RfT3B0aW9uYWxJbnB1dFRvX1Rhc2tzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJIldvcmtQcm9kdWN0X09wdGlvbmFsSW5wdXRUb19UYXNrcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkgKiB3aGljaCBhcmUgY3JlYXRlZCBmcm9tIGEgd29yayBwcm9kdWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0X1dvcmtQcm9kdWN0RGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3QuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3RfV29ya1Byb2R1Y3REZXNjcmlwdG9ycyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgcHJpbWFyeSB0YXNrcyBvZiBhIHJvbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9sZV9QcmltYXJ5X1Rhc2tzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvbGUuY2xhc3MsCi0JCQkiUm9sZV9QcmltYXJ5X1Rhc2tzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBzZWNvbmRhcnkgdGFza3Mgb2YgYSByb2xlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJvbGVfU2Vjb25kYXJ5X1Rhc2tzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvbGUuY2xhc3MsCi0JCQkiUm9sZV9TZWNvbmRhcnlfVGFza3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHJvbGUgc2V0cyB3aGljaCBhIHJvbGUgaXMKLQkgKiBjYXRlZ29yaXplZCB1bmRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSb2xlX1JvbGVTZXRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvbGUuY2xhc3MsCi0JCQkiUm9sZV9Sb2xlU2V0cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZXMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgY29tcG9zaXRlIHJvbGVzIHdoaWNoCi0JICogaW5jbHVkZXMgYSByb2xlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJvbGVfQ29tcG9zaXRlUm9sZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJUm9sZS5jbGFzcywKLQkJCSJSb2xlX0NvbXBvc2l0ZVJvbGVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgcm9sZSBkZXNjcmlwdG9ycyB3aGljaCBhcmUKLQkgKiBjcmVhdGVkIGZyb20gYSByb2xlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJvbGVfUm9sZURlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvbGUuY2xhc3MsCi0JCQkiUm9sZV9Sb2xlRGVzY3JpcHRvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCksIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBjb250ZW50IGVsZW1lbnRzIHdoaWNoIGEKLQkgKiBjaGVja2xpc3QgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIENoZWNrbGlzdF9Db250ZW50RWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJQ2hlY2tsaXN0LmNsYXNzLAotCQkJIkNoZWNrbGlzdF9Db250ZW50RWxlbWVudHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGFjdGl2aXRpZXMgd2hpY2ggYSBjb25jZXB0IGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIENvbmNlcHRfQWN0aXZpdGllcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlDb25jZXB0LmNsYXNzLAotCQkJIkNvbmNlcHRfQWN0aXZpdGllcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X0NvbmNlcHRzKCksIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBjb250ZW50IGVsZW1lbnRzIHdoaWNoIGEKLQkgKiBjb25jZXB0IGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBDb25jZXB0X0NvbnRlbnRFbGVtZW50cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlDb25jZXB0LmNsYXNzLAotCQkJIkNvbmNlcHRfQ29udGVudEVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgY29udGVudCBlbGVtZW50cyB3aGljaCBhbgotCSAqIGV4YW1wbGUgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIEV4YW1wbGVfQ29udGVudEVsZW1lbnRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUV4YW1wbGUuY2xhc3MsCi0JCQkiRXhhbXBsZV9Db250ZW50RWxlbWVudHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBjb250ZW50IGVsZW1lbnRzIHdoaWNoIGEKLQkgKiByZXBvcnQgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJlcG9ydF9Xb3JrUHJvZHVjdHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJUmVwb3J0LmNsYXNzLAotCQkJIlJlcG9ydF9Xb3JrUHJvZHVjdHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9SZXBvcnRzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGNvbnRlbnQgZWxlbWVudHMgd2hpY2ggYQotCSAqIHJldXNhYmxlIGFzc2V0IGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSZXVzYWJsZUFzc2V0X0NvbnRlbnRFbGVtZW50cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSZXVzYWJsZUFzc2V0LmNsYXNzLAotCQkJIlJldXNhYmxlQXNzZXRfQ29udGVudEVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGFjdGl2aXRpZXMgd2hpY2ggYSByb2FkbWFwIGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJvYWRtYXBfQWN0aXZpdGVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvYWRtYXAuY2xhc3MsCi0JCQkiUm9hZG1hcF9BY3Rpdml0ZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Sb2FkbWFwcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBhY3Rpdml0aWVzIHdoaWNoIGEgc3VwcG9ydGluZwotCSAqIG1hdGVyaWFsIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBTdXBwb3J0aW5nTWF0ZXJpYWxfQWN0aXZpdGllcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwuY2xhc3MsCi0JCQkiU3VwcG9ydGluZ01hdGVyaWFsX0FjdGl2aXRpZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBjb250ZW50IGVsZW1lbnRzIHdoaWNoIGEKLQkgKiBzdXBwb3J0aW5nIG1hdGVyaWFsIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBTdXBwb3J0aW5nTWF0ZXJpYWxfQ29udGVudEVsZW1lbnRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywKLQkJCSJTdXBwb3J0aW5nTWF0ZXJpYWxfQ29udGVudEVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBkZWxpdmVyeSBwcm9jZXNzZXMgd2hpY2ggYQotCSAqIGNvbW11bmljYXRpb24gc3VwcG9ydGluZyBtYXRlcmlhbCBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgU3VwcG9ydGluZ01hdGVyaWFsX0NvbW11bmljYXRpb25zX0RlbGl2ZXJ5UHJvY2Vzc2VzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywKLQkJCSJTdXBwb3J0aW5nTWF0ZXJpYWxfQ29tbXVuaWNhdGlvbnNfRGVsaXZlcnlQcm9jZXNzZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgZGVsaXZlcnkgcHJvY2Vzc2VzIHdoaWNoIGFuCi0JICogZWR1Y2F0aW9uIHN1cHBvcnRpbmcgbWF0ZXJpYWwgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFN1cHBvcnRpbmdNYXRlcmlhbF9FZHVjYXRpb25fRGVsaXZlcnlQcm9jZXNzZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzLAotCQkJIlN1cHBvcnRpbmdNYXRlcmlhbF9FZHVjYXRpb25fRGVsaXZlcnlQcm9jZXNzZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWxzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIG1ldGhvZCB1bml0cyB3aGljaCBhCi0JICogY29weXJpZ2h0IHN1cHBvcnRpbmcgbWF0ZXJpYWwgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFN1cHBvcnRpbmdNYXRlcmlhbF9Db3B5cmlnaHRTdGF0ZW1lbnRfTWV0aG9kVW5pdHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzLAotCQkJIlN1cHBvcnRpbmdNYXRlcmlhbF9Db3B5cmlnaHRTdGF0ZW1lbnRfTWV0aG9kUGx1Z2lucyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfQ29weXJpZ2h0U3RhdGVtZW50KCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGNvbnRlbnQgZWxlbWVudHMgd2hpY2ggYQotCSAqIGd1aWRlbGluZSBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgR3VpZGVsaW5lX0NvbnRlbnRFbGVtZW50cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlHdWlkZWxpbmUuY2xhc3MsCi0JCQkiR3VpZGVsaW5lX0NvbnRlbnRFbGVtZW50cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYWN0aXZpdGllcyB3aGljaCBhIGd1aWRlbGluZQotCSAqIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBHdWlkZWxpbmVfQWN0aXZpdGllcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlHdWlkZWxpbmUuY2xhc3MsCi0JCQkiR3VpZGVsaW5lX0FjdGl2aXRpZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9HdWlkZWxpbmVzKCksIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB3b3JrIHByb2R1Y3RzIHdoaWNoIGEKLQkgKiB0ZW1wbGF0ZSBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgVGVtcGxhdGVfV29ya1Byb2R1Y3RzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVRlbXBsYXRlLmNsYXNzLAotCQkJIlRlbXBsYXRlX1dvcmtQcm9kdWN0cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0b29sIHdoaWNoIGEgdG9vbCBtZW50b3IgaXMKLQkgKiBjYXRlZ29yaXplZCB1bmRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBUb29sTWVudG9yX1Rvb2wgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJVG9vbE1lbnRvci5jbGFzcywKLQkJCSJUb29sTWVudG9yX1Rvb2wiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3JzKCksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrcyB3aGljaCBhIHRvb2wgbWVudG9yIGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFRvb2xNZW50b3JfVGFza3MgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJVG9vbE1lbnRvci5jbGFzcywKLQkJCSJUb29sTWVudG9yX1Rhc2tzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19Ub29sTWVudG9ycygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB3b3JrIHByb2R1Y3RzIHdoaWNoIGEgdG9vbAotCSAqIG1lbnRvciBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgVG9vbE1lbnRvcl9Xb3JrUHJvZHVjdHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJVGVtcGxhdGUuY2xhc3MsCi0JCQkiVG9vbE1lbnRvcl9Xb3JrUHJvZHVjdHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAkKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgY3VzdG9tIGNhdGVnb3JpZXMgd2hpY2ggYQotCSAqIGRlc2NyaWJhYmxlIGVsZW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIERlc2NyaWJhYmxlRWxlbWVudF9DdXN0b21DYXRlZ29yaWVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCURlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywKLQkJCSJDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBwcmFjdGljZXMgcmVmZXJlbmNlZCBieSBhCi0JICogY29udGVudCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIENvbnRlbnRFbGVtZW50X1ByYWN0aWNlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlDb250ZW50RWxlbWVudC5jbGFzcywKLQkJCSJDb250ZW50RWxlbWVudF9QcmFjdGljZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBtZXRob2QgcGx1Zy1pbnMgcmVmZXJlbmNlZCBieQotCSAqIGEgbWV0aG9kIHBsdWctaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgTWV0aG9kUGx1Z2luX0RpcmVjdEV4dGVuc2lvbnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJTWV0aG9kUGx1Z2luLmNsYXNzLAotCQkJIk1ldGhvZFBsdWdpbl9EaXJlY3RFeHRlbnNpb25zIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9ucyB3aGljaAotCSAqIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gYSBtZXRob2QgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBNZXRob2RQbHVnaW5fTWV0aG9kQ29uZmlndXJhdGlvbnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJTWV0aG9kUGx1Z2luLmNsYXNzLAotCQkJIk1ldGhvZFBsdWdpbl9NZXRob2RDb25maWd1cmF0aW9ucyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIG1ldGhvZCBwYWNrYWdlcwotCSAqIHVzZWQvcmVmZXJlbmNlZCBieSBhIG1ldGhvZCBwYWNrYWdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIE1ldGhvZFBhY2thZ2VfVXNpbmdQYWNrYWdlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlNZXRob2RQYWNrYWdlLmNsYXNzLAotCQkJIk1ldGhvZFBhY2thZ2VfVXNpbmdQYWNrYWdlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfUmV1c2VkUGFja2FnZXMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIHdoaWNoCi0JICogY29udGFpbiBhIHJlZmVyZW5jZSB0byBhIG1ldGhvZCBwYWNrYWdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIE1ldGhvZFBhY2thZ2VfTWV0aG9kQ29uZmlndXJhdGlvbnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJTWV0aG9kUGFja2FnZS5jbGFzcywKLQkJCSJNZXRob2RQYWNrYWdlX01ldGhvZENvbmZpZ3VyYXRpb25zIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9ucyB3aGljaAotCSAqIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gYSBDdXN0b21DYXRlZ29yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBDdXN0b21DYXRlZ29yeV9NZXRob2RDb25maWd1cmF0aW9ucyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlDdXN0b21DYXRlZ29yeS5jbGFzcywKLQkJCSJDdXN0b21DYXRlZ29yeV9NZXRob2RDb25maWd1cmF0aW9ucyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXdzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGRpc2NpcGxpbmUgZ3JvdXBpbmdzIHdoaWNoCi0JICogY29udGFpbiBhIHJlZmVyZW5jZSB0byBhIGRpc2NpcGxpbmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgRGlzY2lwbGluZV9EaXNjaXBsaW5lR3JvdXBpbmdzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCURpc2NpcGxpbmUuY2xhc3MsCi0JCQkiRGlzY2lwbGluZV9EaXNjaXBsaW5lR3JvdXBpbmdzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHJvbGUgc2V0IGdyb3VwaW5ncyB3aGljaAotCSAqIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gYSByb2xlIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSb2xlU2V0X1JvbGVTZXRHcm91cHBpbmdzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvbGVTZXQuY2xhc3MsCi0JCQkiUm9sZVNldF9Sb2xlU2V0R3JvdXBwaW5ncyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBzdWNjZXNzb3Igb2YgYSB3b3JrIG9yZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtPcmRlcl9TdWNjZXNzb3IgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya09yZGVyLmNsYXNzLAotCQkJIldvcmtPcmRlcl9TdWNjZXNzb3IiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgc3VjY2Vzc29yIGxpbmsgb2YgYSB3b3JrCi0JICogYnJlYWtkb3duIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvU3VjY2Vzc29yID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLAotCQkJIldvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1N1Y2Nlc3NvciIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtPcmRlcl9QcmVkKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGltbWVkaWF0ZSB2YXJpYXRpZXMgb2YgYQotCSAqIHZhcmlhYmlsaXR5IGVsZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgVmFyaWFiaWxpdHlFbGVtZW50X0ltbWVkaWF0ZVZhcmlldGllcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlWYXJpYWJpbGl0eUVsZW1lbnQuY2xhc3MsCi0JCQkiVmFyaWFiaWxpdHlFbGVtZW50X0ltbWVkaWF0ZVZhcmlldGllcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHN1Y2Nlc3NvcnMgdG8gYSBzZWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFNlY3Rpb25fU3VjY2Vzc29ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlTZWN0aW9uLmNsYXNzLAotCQkJIlNlY3Rpb25fU3VjY2Vzc29ycyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3Rpb25fUHJlZGVjZXNzb3IoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCBhCi0JICogc2VjdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgU2VjdGlvbl9UYXNrRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJU2VjdGlvbi5jbGFzcywKLQkJCSJTZWN0aW9uX1Rhc2tEZXNjcmlwdG9ycyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHRlYW0gcHJvZmlsZXMgd2hpY2ggaW5jbHVkZXMKLQkgKiBhIHNwZWNpZmljIHJvbGUgZGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSb2xlRGVzY3JpcHRvcl9UZWFtUHJvZmlsZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJUm9sZURlc2NyaXB0b3IuY2xhc3MsCi0JCQkiUm9sZURlc2NyaXB0b3JfVGVhbVByb2ZpbGVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHByaW1hcnkgdGFzayBkZXNjcmlwdG9ycwotCSAqIHBlcmZvcm1lZCBieSBhIHJvbGUgZGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSb2xlRGVzY3JpcHRvcl9QcmltYXJ5VGFza0Rlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvbGVEZXNjcmlwdG9yLmNsYXNzLAotCQkJIlJvbGVEZXNjcmlwdG9yX1ByaW1hcnlUYXNrRGVzY3JpcHRvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBhZGRpdGlvbmFsIHRhc2sgZGVzY3JpcHRvcnMKLQkgKiBwZXJmb3JtZWQgYnkgYSByb2xlIGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9sZURlc2NyaXB0b3JfQWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlRGVzY3JpcHRvci5jbGFzcywKLQkJCSJSb2xlRGVzY3JpcHRvcl9BZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYXNzaXN0aW5nIHRhc2sgZGVzY3JpcHRvcnMKLQkgKiBwZXJmb3JtZWQgYnkgYSByb2xlIGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9sZURlc2NyaXB0b3JfQXNzaXN0c0luX1Rhc2tEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlRGVzY3JpcHRvci5jbGFzcywKLQkJCSJSb2xlRGVzY3JpcHRvcl9Bc3Npc3RzSW5fVGFza0Rlc2NyaXB0b3JzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBkZXBlbmRlbnQgcHJvY2Vzc2VzCi0JICogcmVmZXJlbmNlZCBpbiBhIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIE1ldGhvZENvbmZpZ3VyYXRpb25fRGVwZW5kZW50UHJvY2Vzc2VzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsCi0JCQkiTWV0aG9kQ29uZmlndXJhdGlvbl9EZXBlbmRlbnRQcm9jZXNzZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHZhbGlkIHByb2Nlc3NlcyByZWZlcmVuY2VkIGluCi0JICogYSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBNZXRob2RDb25maWd1cmF0aW9uX1ZhbGlkQ29udGV4dF9Qcm9jZXNzZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywKLQkJCSJNZXRob2RDb25maWd1cmF0aW9uX1ZhbGlkQ29udGV4dF9Qcm9jZXNzZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrIGRlc2NyaXB0b3JzIHdoaWNoCi0JICogcHJvZHVjZSBhIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGFzIGFuIG91dHB1dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbV9UYXNrRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLAotCQkJIldvcmtQcm9kdWN0RGVzY3JpcHRvcl9PdXRwdXRGcm9tX1Rhc2tEZXNjcmlwdG9ycyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrIGRlc2NyaXB0b3JzIHdoaWNoIHVzZSBhCi0JICogd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgYXMgYW4gb3B0aW9uYWwgaW5wdXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3REZXNjcmlwdG9yX09wdGlvbmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLAotCQkJIldvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrIGRlc2NyaXB0b3JzIHdoaWNoIHVzZSBhCi0JICogd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgYXMgYW4gbWFuZGF0b3J5IGlucHV0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3REZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0VG9fVGFza0Rlc2NyaXB0b3JzIiwgLy8kTk9OLU5MUy0xJAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSwgdHJ1ZSk7Ci0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHRhc2sgZGVzY3JpcHRvcnMgd2hpY2ggdXNlIGEKLQkgKiB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBhcyBhbiBleHRlcm5hbCBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMiLCAvLyROT04tTkxTLTEkCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCksIHRydWUpOwotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSByb2xlIGRlc2NyaXB0b3JzIHdoaWNoIGFyZQotCSAqIHJlc3BvbnNpYmxlIGZvciBhIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9SZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3REZXNjcmlwdG9yX1Jlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzIiwgLy8kTk9OLU5MUy0xJAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSwgdHJ1ZSk7Ci0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGRlbGl2ZXJhYmxlIGRlc2NyaXB0b3JzIHdoaWNoCi0JICogY29udGFpbiBhIHNwZWNpZmljIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZURlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywKLQkJCSJXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVEZXNjcmlwdG9ycyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGRpc2NpcGxpbmVzIHdoaWNoIGFuIGFjdGl2aXR5Ci0JICogaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIEFjdGl2aXR5X0Rpc2NpcGxpbmVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUFjdGl2aXR5LmNsYXNzLAotCQkJIkFjdGl2aXR5X0Rpc2NpcGxpbmVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvd3MoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgcHJhY3RpY2VzIHdoaWNoIGFuIGFjdGl2aXR5Ci0JICogaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIEFjdGl2aXR5X1ByYXRpY2VzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUFjdGl2aXR5LmNsYXNzLAotCQkJIkFjdGl2aXR5X1ByYXRpY2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2VzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHByb2Nlc3MgcGxhbm5pbmcgdGVtcGxhdGVzCi0JICogd2hpY2ggYSBwcm9jZXNzIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBQcm9jZXNzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlQcm9jZXNzLmNsYXNzLAotCQkJIlByb2Nlc3NfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfQmFzZWRPblByb2Nlc3NlcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBwcm9jZXNlc3Mgd2hpY2ggcmVmZXJlbmNlcyBhCi0JICogY2FwYWJpbGl0eSBwYXR0ZXJuLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIENhcGFiaWxpdHlQYXR0ZXJuX0NvbnN1bWluZ1Byb2Nlc3NlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlDYXBhYmlsaXR5UGF0dGVybi5jbGFzcywKLQkJCSJDYXBhYmlsaXR5UGF0dGVybl9Db25zdW1pbmdQcm9jZXNzZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybnMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYnJlYWtkb3duIGVsZW1lbnQgd2hpY2ggaXMKLQkgKiBkaXNwbGF5ZWQgYmVmb3JlIGEgYnJlYWtkb3duIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgQnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJQnJlYWtkb3duRWxlbWVudC5jbGFzcywKLQkJCSJCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSIsIC8vJE5PTi1OTFMtMSQKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKSwgdHJ1ZSwKLQkJCWZhbHNlKTsKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYnJlYWtkb3duIGVsZW1lbnQgd2hpY2ggaXMKLQkgKiBkaXNwbGF5ZWQgYWZ0ZXIgYSBicmVha2Rvd24gZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUJyZWFrZG93bkVsZW1lbnQuY2xhc3MsCi0JCQkiQnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlciIsIC8vJE5PTi1OTFMtMSQKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCksIHRydWUsCi0JCQlmYWxzZSk7Ci0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIFVNQSBzZW1hdGljIG1vZGVsIGJyaWRnZXMKLQkgKiByZWZlcmVuY2VkIGJ5IGEgbWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgTWV0aG9kRWxlbWVudF9VTUFTZW1hdGljTW9kZWxCcmlkZ2VzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCU1ldGhvZEVsZW1lbnQuY2xhc3MsCi0JCQkiTWV0aG9kRWxlbWVudF9VTUFTZW1hdGljTW9kZWxCcmlkZ2VzIiwgLy8kTk9OLU5MUy0xJAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCksIHRydWUsCi0JCQlmYWxzZSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgcHJlZGVmaW5lZE9wcG9zaXRlRmVhdHVyZXM7Ci0KLQlzdGF0aWMgewotCQlyZWdpc3RlclByZWRlZmluZWRPcHBvc2l0ZUZlYXR1cmVzKCk7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIHRoZSBwcmVkZWZpbmVkIG9wcG9zaXRlIGZlYXR1cmVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCByZWdpc3RlclByZWRlZmluZWRPcHBvc2l0ZUZlYXR1cmVzKCkgewotCQlwcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQXNzb2NpYXRpb25IZWxwZXIgb2JqZWN0ID0gbmV3IEFzc29jaWF0aW9uSGVscGVyKCk7Ci0JCUZpZWxkW10gZmllbGRzID0gb2JqZWN0LmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCUZpZWxkIGZpZWxkID0gZmllbGRzW2ldOwotCQkJaW50IG1vZCA9IGZpZWxkLmdldE1vZGlmaWVycygpOwotCQkJaWYgKE1vZGlmaWVyLmlzUHVibGljKG1vZCkgJiYgTW9kaWZpZXIuaXNTdGF0aWMobW9kKQotCQkJCQkmJiBNb2RpZmllci5pc0ZpbmFsKG1vZCkKLQkJCQkJJiYgZmllbGQuZ2V0VHlwZSgpID09IE9wcG9zaXRlRmVhdHVyZS5jbGFzcykgewotCQkJCXRyeSB7Ci0JCQkJCXByZWRlZmluZWRPcHBvc2l0ZUZlYXR1cmVzLmFkZChmaWVsZC5nZXQob2JqZWN0KSk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBTeXN0ZW0ub3V0Ci0JCSAqIC5wcmludGxuKCJBc3NvY2lhdGlvbkhlbHBlci5yZWdpc3RlclByZWRlZmluZWRPcHBvc2l0ZUZlYXR1cmVzKCk6Ci0JCSAqIGRlZmluZWQgb3Bwb3NpdGUgZmVhdHVyZXM6ICIgKyBwcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcy5zaXplKCkpOwotCQkgKiAvLyROT04tTkxTLTEkIFN5c3RlbS5vdXQucHJpbnRsbihwcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcyk7Ci0JCSAqLwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHByZWRlZmluZWRPcHBvc2l0ZUZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUgPSAoT3Bwb3NpdGVGZWF0dXJlKSBpdGVyLm5leHQoKTsKLQkJCU9wcG9zaXRlRmVhdHVyZS5yZWdpc3Rlck9wcG9zaXRlRmVhdHVyZShmZWF0dXJlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHByZWRlZmluZWQgb3Bwb3NpdGUgZmVhdHVyZXMuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJlZGVmaW5lZCBvcHBvc2l0ZSBmZWF0dXJlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXRQcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcygpIHsKLQkJcmV0dXJuIHByZWRlZmluZWRPcHBvc2l0ZUZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlbGl2ZXJhYmxlIGRlc2NyaXB0b3JzIHdoaWNoIGNvbnRhaW4gdGhlIGdpdmVuIHdvcmsgcHJvZHVjdAotCSAqIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIHdwZAotCSAqICAgICAgICAgICAgYSB3b3JrIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBkZWxpdmVyYWJsZSBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXREZWxpdmVyYWJsZURlc2NyaXB0b3JzKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB3cGQpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZURlc2NyaXB0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0YXNrIGRlc2NyaXB0b3JzIHdoaWNoIHVzZSBhIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGFzIGFuCi0JICogZXh0ZXJuYWwgaW5wdXQuCi0JICogCi0JICogQHBhcmFtIHdwZAotCSAqICAgICAgICAgICAgYSB3b3JrIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0YXNrIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEV4dGVybmFsSW5wdXRUbyhXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgd3BkKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdERlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCB1c2UgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBhcyBhCi0JICogbWFuZGF0b3J5IGlucHV0LgotCSAqIAotCSAqIEBwYXJhbSB3cGQKLQkgKiAgICAgICAgICAgIGEgd29yayBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFzayBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRNYW5kYXRvcnlJbnB1dFRvKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB3cGQpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCB1c2UgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBhcyBhbgotCSAqIG9wdGlvbmFsIGlucHV0LgotCSAqIAotCSAqIEBwYXJhbSB3cGQKLQkgKiAgICAgICAgICAgIGEgd29yayBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFzayBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRPcHRpb25hbElucHV0VG8oV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHdwZCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3REZXNjcmlwdG9yX09wdGlvbmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRhc2sgZGVzY3JpcHRvcnMgd2hpY2ggd2hpY2ggcHJvZHVjZSBhIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yCi0JICogYXMgYW4gb3V0cHV0LgotCSAqIAotCSAqIEBwYXJhbSB3cGQKLQkgKiAgICAgICAgICAgIGEgd29yayBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFzayBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRPdXRwdXRGcm9tKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB3cGQpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PdXRwdXRGcm9tX1Rhc2tEZXNjcmlwdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcm9sZSBkZXNjcmlwdG9ycyB3aGljaCBhcmUgcmVzcG9uc2libGUgZm9yIGEgd29yayBwcm9kdWN0Ci0JICogZGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gd3BkCi0JICogICAgICAgICAgICBhIHdvcmsgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHJvbGUgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0UmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcnMoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCkgewotCQlyZXR1cm4gKExpc3QpIHdwZAotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdERlc2NyaXB0b3JfUmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRoZSBkZXBlbmRlbnQgcHJvY2Vzc2VzIHJlZmVyZW5jZWQgaW4gYSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb2Nlc3NlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXREZXBlbmRlbnRQcm9jZXNzZXMoTWV0aG9kQ29uZmlndXJhdGlvbiBlKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgZSkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoTWV0aG9kQ29uZmlndXJhdGlvbl9EZXBlbmRlbnRQcm9jZXNzZXMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRlYW0gcHJvZmlsZXMgd2hpY2ggaW5jbHVkZXMgYSBzcGVjaWZpYyByb2xlIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgcm9sZSBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGVhbSBwcm9maWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRUZWFtUHJvZmlsZXMoUm9sZURlc2NyaXB0b3IgZSkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGUpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFJvbGVEZXNjcmlwdG9yX1RlYW1Qcm9maWxlcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHJhY3RpY2VzIHJlZmVyZW5jZWQgYnkgYSBjb250ZW50IGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgY29udGVudCBlbGVtZW50Ci0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJhY3RpY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFByYWN0aWNlcyhDb250ZW50RWxlbWVudCBlKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgZSkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoQ29udGVudEVsZW1lbnRfUHJhY3RpY2VzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0b29sIHdoaWNoIGEgdG9vbCBtZW50b3IgaXMgY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgdG9vbCBtZW50b3IKLQkgKiBAcmV0dXJuIGEgdG9vbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVG9vbCBnZXRUb29sKFRvb2xNZW50b3IgdG9vbE1lbnRvcikgewotCQlyZXR1cm4gKFRvb2wpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHRvb2xNZW50b3IpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFRvb2xNZW50b3JfVG9vbCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc3VjY2Vzc29ycyB0byBhIHNlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgc2VjdGlvbgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHNlY3Rpb25zIHRoYXQgYXJlIHBvc3Rpb25lZCBhZnRlciB0aGUgZ2l2ZW4gc2VjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTdWNjZXNzb3JzKFNlY3Rpb24gc2VjdGlvbikgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHNlY3Rpb24pCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFNlY3Rpb25fU3VjY2Vzc29ycyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW1tZWRpYXRlIHZhcmlhdGllcyBvZiBhIHZhcmlhYmlsaXR5IGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgdmFyaWFiaWxpdHkgZWxlbWVudAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGltbWVkaWF0ZSB2YXJpYXRpZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgZSkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoVmFyaWFiaWxpdHlFbGVtZW50X0ltbWVkaWF0ZVZhcmlldGllcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHJpbWFyeSB0YXNrcyBvZiBhIHJvbGUuCi0JICogCi0JICogQHBhcmFtIHJvbGUKLQkgKiAgICAgICAgICAgIGEgcm9sZQotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2tzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFByaW1hcnlUYXNrcyhSb2xlIHJvbGUpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByb2xlKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShSb2xlX1ByaW1hcnlfVGFza3MpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNlY29uZGFyeSB0YXNrcyBvZiBhIHJvbGUuCi0JICogCi0JICogQHBhcmFtIHJvbGUKLQkgKiAgICAgICAgICAgIGEgcm9sZQotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2tzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFNlY29uZGFyeVRhc2tzKFJvbGUgcm9sZSkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJvbGUpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFJvbGVfU2Vjb25kYXJ5X1Rhc2tzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzdWNjZXNzb3IgbGluayBvZiBhIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgYnJlYWsgZG93biBlbGVtZW50Ci0JICogQHJldHVybiBhIGxpc3Qgb2YgbGlua3MgdG8gd29yayBicmVha2Rvd24gZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TGlua1RvU3VjY2Vzc29yKEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGUpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1N1Y2Nlc3Nvcik7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc3VjY2Vzc29yIG9mIGEgd29yayBvcmRlci4KLQkgKiAKLQkgKiBAcGFyYW0gd29ya09yZGVyCi0JICogICAgICAgICAgICBhIHdvcmsgb3JkZXIKLQkgKiBAcmV0dXJuIGEgd29yayBicmVha2Rvd24gZWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya0JyZWFrZG93bkVsZW1lbnQgZ2V0U3VjY2Vzc29yKFdvcmtPcmRlciB3b3JrT3JkZXIpIHsKLQkJcmV0dXJuIChXb3JrQnJlYWtkb3duRWxlbWVudCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgd29ya09yZGVyKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrT3JkZXJfU3VjY2Vzc29yKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0YXNrcyB3aGljaCBwcm9kdWNlIGEgd29yayBwcm9kdWN0IGFzIGFuIG91dHB1dC4KLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiAgICAgICAgICAgIGEgd29yayBwcm9kdWN0Ci0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFza3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0T3V0cHV0dGluZ1Rhc2tzKFdvcmtQcm9kdWN0IHdwKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgd3ApCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtQcm9kdWN0X091dHB1dEZyb21fVGFza3MpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRhc2tzIHdoaWNoIHVzZSBhIHdvcmsgcHJvZHVjdCBhcyBhIG1hbmRhdG9yeSBpbnB1dC4KLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiAgICAgICAgICAgIGEgd29yayBwcm9kdWN0Ci0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFza3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TWFuZGF0b3J5SW5wdXRUb1Rhc2tzKFdvcmtQcm9kdWN0IHdwKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgd3ApCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtQcm9kdWN0X01hbmRhdG9yeUlucHV0VG9fVGFza3MpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJlc3BvbnNpYmxlIHJvbGVzIGZvciBhIHdvcmsgcHJvZHVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiAgICAgICAgICAgIGEgd29yayBwcm9kdWN0Ci0JICogQHJldHVybiBhIGxpc3Qgb2Ygcm9sZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0UmVzcG9uc2libGVSb2xlcyhXb3JrUHJvZHVjdCB3cCkgewotCQlyZXR1cm4gKExpc3QpIHdwLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHdvcmsgcHJvZHVjdHMgbW9kaWZpZWQgYnkgYSByb2xlLgotCSAqIAotCSAqIEBwYXJhbSByb2xlCi0JICogICAgICAgICAgICBhIHJvbGUKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB3b3JrIHByb2R1Y3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE1vZGlmaWVkV29ya1Byb2R1Y3RzKFJvbGUgcm9sZSkgewotCQlMaXN0IHBlcmZvcm1zID0gZ2V0UHJpbWFyeVRhc2tzKHJvbGUpOwotCQlMaXN0IG1vZGlmaWVzID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJaWYgKHBlcmZvcm1zICE9IG51bGwgJiYgcGVyZm9ybXMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gcGVyZm9ybXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGkubmV4dCgpOwotCi0JCQkJLy8gZm9yIGVhY2ggdGFzaywgZ2V0IG91dHB1dCB3b3JrIHByb2R1Y3Q7Ci0JCQkJTGlzdCBvdXRwdXRXUHMgPSB0YXNrLmdldE91dHB1dCgpOwotCQkJCWlmIChvdXRwdXRXUHMgIT0gbnVsbCAmJiBvdXRwdXRXUHMuc2l6ZSgpID4gMCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gb3V0cHV0V1BzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBpdC5uZXh0KCk7Ci0JCQkJCQlpZiAod3AgIT0gbnVsbCkgewotCQkJCQkJCWlmICghbW9kaWZpZXMuY29udGFpbnMod3ApKSB7Ci0JCQkJCQkJCW1vZGlmaWVzLmFkZCh3cCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllczsKLQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJvbGVzIHRoYXQgbW9kaWZ5IGEgd29yayBwcm9kdWN0LgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqICAgICAgICAgICAgYSB3b3JrIHByb2R1Y3QKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiByb2xlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRNb2RpZmllZEJ5KFdvcmtQcm9kdWN0IHdwKSB7Ci0JCUxpc3Qgb3V0cHV0RnJvbSA9IEFzc29jaWF0aW9uSGVscGVyLmdldE91dHB1dHRpbmdUYXNrcyh3cCk7IC8vIHRoaXMuZ2V0T3V0cHV0RnJvbSgpOwotCQlqYXZhLnV0aWwuQXJyYXlMaXN0IG1vZGlmaWVzID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQkJaWYgKG91dHB1dEZyb20gIT0gbnVsbCAmJiBvdXRwdXRGcm9tLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBvdXRwdXRGcm9tLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkvLyBmb3IgZWFjaCB0YXNrIGdldCwgZ2V0IHByaW1hcnkgcGVyZm9ybWVyIHJvbGUKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCVJvbGUgbW9kaWZpZWRCeVJvbGUgPSB0YXNrLmdldFBlcmZvcm1lZEJ5KCk7Ci0JCQkJaWYgKG1vZGlmaWVkQnlSb2xlICE9IG51bGwpIHsKLQkJCQkJaWYgKCFtb2RpZmllcy5jb250YWlucyhtb2RpZmllZEJ5Um9sZSkpIHsKLQkJCQkJCW1vZGlmaWVzLmFkZChtb2RpZmllZEJ5Um9sZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc2NpcGxpbmUgZ3JvdXBpbmdzIHdoaWNoIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gYSBkaXNjaXBsaW5lLgotCSAqIAotCSAqIEBwYXJhbSBkaXNjaXBsaW5lCi0JICogICAgICAgICAgICBhIGRpc2NpcGxpbmUKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBkaXNjaXBsaW5lIGdyb3VwaW5ncwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXREaXNjaXBsaW5lR3JvdXBzKERpc2NpcGxpbmUgZGlzY2lwbGluZSkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGRpc2NpcGxpbmUpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKERpc2NpcGxpbmVfRGlzY2lwbGluZUdyb3VwaW5ncyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZG9tYWlucyB3aGljaCBhIHdvcmsgcHJvZHVjdCBpcyBjYXRlZ29yaXplZCB1bmRlci4KLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiAgICAgICAgICAgIGEgd29yayBwcm9kdWN0Ci0JICogQHJldHVybiBhIGRvbWFpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXREb21haW5zKFdvcmtQcm9kdWN0IHdwKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgd3ApCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtQcm9kdWN0X0RvbWFpbnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJvbGUgc2V0IGdyb3VwaW5ncyB3aGljaCBjb250YWluIGEgcmVmZXJlbmNlIHRvIGEgcm9sZSBzZXQuCi0JICogCi0JICogQHBhcmFtIHJvbGVTZXQKLQkgKiAgICAgICAgICAgIGEgcm9sZSBzZXQKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiByb2xlIHNldCBncm91cGluZ3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0Um9sZVNldEdyb3VwcyhSb2xlU2V0IHJvbGVTZXQpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByb2xlU2V0KQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShSb2xlU2V0X1JvbGVTZXRHcm91cHBpbmdzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByb2xlIHNldHMgd2hpY2ggYSByb2xlIGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqIAotCSAqIEBwYXJhbSByb2xlCi0JICogICAgICAgICAgICBhIHJvbGUKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiByb2xlIHNldHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0Um9sZVNldHMoUm9sZSByb2xlKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgcm9sZSkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoUm9sZV9Sb2xlU2V0cyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCBoYXZlIGJlZW4gY3JlYXRlZCBmcm9tIGEgdGFzay4KLQkgKiAKLQkgKiBAcGFyYW0gdGFzawotCSAqICAgICAgICAgICAgYSB0YXNrCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFzayBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRUYXNrRGVzY3JpcHRvcnMoVGFzayB0YXNrKSB7Ci0JCXJldHVybiAoTGlzdCkgdGFzay5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShUYXNrX1Rhc2tEZXNjcmlwdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGlzY2lwbGluZXMgd2hpY2ggYSB0YXNrIGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqIAotCSAqIEBwYXJhbSB0YXNrCi0JICogICAgICAgICAgICBhIHRhc2sKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBkaXNjaXBsaW5lcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXREaXNjaXBsaW5lcyhUYXNrIHRhc2spIHsKLQkJcmV0dXJuIChMaXN0KSB0YXNrLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFRhc2tfRGlzY2lwbGluZXMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc2NpcGxpbmVzIHdoaWNoIGFuIGFjdGl2aXR5IGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiAgICAgICAgICAgIGFuIGFjdGl2aXR5Ci0JICogQHJldHVybiBhIGxpc3Qgb2YgZGlzY2lwbGluZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RGlzY2lwbGluZXMoQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJcmV0dXJuIChMaXN0KSBhY3Rpdml0eS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShBY3Rpdml0eV9EaXNjaXBsaW5lcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHJpbWFyeSB0YXNrIGRlc2NyaXB0b3JzIHBlcmZvcm1lZCBieSBhIHJvbGUgZGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gcm9sZURlc2MKLQkgKiAgICAgICAgICAgIGEgcm9sZSBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFzayBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgcm9sZURlc2MpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFJvbGVEZXNjcmlwdG9yX1ByaW1hcnlUYXNrRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFkZGl0aW9uYWwgdGFzayBkZXNjcmlwdG9ycyBwZXJmb3JtZWQgYnkgYSByb2xlIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIHJvbGVEZXNjCi0JICogICAgICAgICAgICBhIHJvbGUgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyhSb2xlRGVzY3JpcHRvciByb2xlRGVzYykgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJvbGVEZXNjKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShSb2xlRGVzY3JpcHRvcl9BZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhc3Npc3RpbmcgdGFzayBkZXNjcmlwdG9ycyBwZXJmb3JtZWQgYnkgYSByb2xlIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIHJvbGVEZXNjCi0JICogICAgICAgICAgICBhIHJvbGUgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QXNzaXN0ZWRUYXNrRGVzY3JpcHRvcnMoUm9sZURlc2NyaXB0b3Igcm9sZURlc2MpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByb2xlRGVzYykKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoUm9sZURlc2NyaXB0b3JfQXNzaXN0c0luX1Rhc2tEZXNjcmlwdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgd29yayBwcm9kdWN0IHR5cGVzIHdoaWNoIGEgd29yayBwcm9kdWN0IGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqICAgICAgICAgICAgYSB3b3JrIHByb2R1Y3QKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB3b3JrIHByb2R1Y3QgdHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0V29ya1Byb2R1Y3RUeXBlcyhXb3JrUHJvZHVjdCB3cCkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHdwKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdF9Xb3JrUHJvZHVjdFR5cGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjdXN0b20gY2F0ZWdvcmllcyB3aGljaCBhIGRlc2NyaWJhYmxlIGVsZW1lbnQgaXMgYXNzb2NpYXRlZAotCSAqIHdpdGguCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogICAgICAgICAgICBhIGRlc2NyaWJhYmxlIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBjdXN0b20gY2F0ZWdvcmllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDdXN0b21DYXRlZ29yaWVzKERlc2NyaWJhYmxlRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoRGVzY3JpYmFibGVFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIERlbGl2ZXJhYmxlcyB3aGljaCBhIFdvcmtQcm9kdWN0IGVsZW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqICAgICAgICAgICAgYSBXb3JrUHJvZHVjdCBlbGVtZW50Ci0JICogQHJldHVybiBhIGxpc3Qgb2YgRGVsaXZlcmFibGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldERlbGl2ZXJhYmxlcyhXb3JrUHJvZHVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3RfRGVsaXZlcmFibGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgcGx1Zy1pbnMgcmVmZXJlbmNlZCBieSBhIG1ldGhvZCBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBsdWctaW4KLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBtZXRob2QgcGx1Zy1pbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0UGx1Z2luRGlyZWN0RXh0ZW5zaW9ucyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgcGx1Z2luKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShNZXRob2RQbHVnaW5fRGlyZWN0RXh0ZW5zaW9ucyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIHJlZmVyZW5jZXMgdG8gYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIG1ldGhvZCBlbGVtZW50IHJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0UmVmZXJlbmNlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJU2V0IHJlZmVyZW5jZXMgPSBuZXcgSGFzaFNldCgpOwotCQlNdWx0aVJlc291cmNlRU9iamVjdCBlT2JqID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlbGVtZW50OwotCi0JCWlmIChlT2JqLmJhc2ljR2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkgPT0gbnVsbCkKLQkJCXJldHVybiByZWZlcmVuY2VzOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVPYmouZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9ICgoT3Bwb3NpdGVGZWF0dXJlKSBlbnRyeS5nZXRLZXkoKSk7Ci0JCQlvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCXJlZmVyZW5jZXMuYWRkQWxsKChDb2xsZWN0aW9uKSBlT2JqCi0JCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUob3Bwb3NpdGVGZWF0dXJlKSk7Ci0JCQl9IGVsc2UgewotCQkJCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpIGVPYmoKLQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShvcHBvc2l0ZUZlYXR1cmUpOwotCQkJCWlmIChvYmogIT0gbnVsbCkgewotCQkJCQlyZWZlcmVuY2VzLmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSByZWZlcmVuY2VzIHRvIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgbWFwIGNvbnRhaW5pbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldFJlZmVyZW5jZU1hcChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJTWFwIG9iamVjdFRvRmVhdHVyZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCU11bHRpUmVzb3VyY2VFT2JqZWN0IGVPYmogPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGVsZW1lbnQ7Ci0KLQkJaWYgKGVPYmouYmFzaWNHZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gb2JqZWN0VG9GZWF0dXJlc01hcDsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVPYmouZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9ICgoT3Bwb3NpdGVGZWF0dXJlKSBlbnRyeS5nZXRLZXkoKSk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCk7Ci0JCQlpZiAob3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoQ29sbGVjdGlvbikgZU9iagotCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKG9wcG9zaXRlRmVhdHVyZSkpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IG9iamVjdCA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCUNvbGxlY3Rpb24gZmVhdHVyZXMgPSAoQ29sbGVjdGlvbikgb2JqZWN0VG9GZWF0dXJlc01hcAotCQkJCQkJCS5nZXQob2JqZWN0KTsKLQkJCQkJaWYgKGZlYXR1cmVzID09IG51bGwpIHsKLQkJCQkJCWZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJb2JqZWN0VG9GZWF0dXJlc01hcC5wdXQob2JqZWN0LCBmZWF0dXJlcyk7Ci0JCQkJCX0KLQkJCQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQkJCX0KLQkJCQk7Ci0JCQl9IGVsc2UgewotCQkJCUVPYmplY3Qgb2JqZWN0ID0gKEVPYmplY3QpIGVPYmoKLQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShvcHBvc2l0ZUZlYXR1cmUpOwotCQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCQlDb2xsZWN0aW9uIGZlYXR1cmVzID0gKENvbGxlY3Rpb24pIG9iamVjdFRvRmVhdHVyZXNNYXAKLQkJCQkJCQkuZ2V0KG9iamVjdCk7Ci0JCQkJCWlmIChmZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQkJCQlmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCW9iamVjdFRvRmVhdHVyZXNNYXAucHV0KG9iamVjdCwgZmVhdHVyZXMpOwotCQkJCQl9Ci0JCQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gb2JqZWN0VG9GZWF0dXJlc01hcDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgaW5pdCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIHNldCBvZiBlbGVtZW50cywgcmV0dXJucyB0aGUgc2V0IG9mIHRob3NlIGVsZW1lbnRzIHBsdXMgYW55Ci0JICogdmFyaWFiaWxpdHkgZWxlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZW0uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRTZXQKLQkgKiAgICAgICAgICAgIGEgc2V0IG9mIG1ldGhvZCBlbGVtZW50cyBmb3Igd2hpY2ggdG8gcmV0cmlldmUgdGhlIHZhcmlhYmlsaXR5Ci0JICogICAgICAgICAgICBlbGVtZW50cwotCSAqIEBwYXJhbSBnZXRCYXNlcwotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHJlY3Vyc2UgaW50byB0aGUgdmFyaWFiaWxpdHkgYmFzZQotCSAqICAgICAgICAgICAgZWxlbWVudHMgKCJ1cCB0aGUgdHJlZSIpCi0JICogQHBhcmFtIGdldENoaWxkcmVuCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcmVjdXJzZSBpbnRvIHRoZSB2YXJpZXRpZXMgKCJkb3duIHRoZQotCSAqICAgICAgICAgICAgdHJlZSIpCi0JICogQHJldHVybiBhIGNvbGxlY3RpdmUgc2V0IG9mIG1ldGhvZCBlbGVtZW50cyBwbHVzIHRoZSBhc3NvY2lhdGVkCi0JICogICAgICAgICB2YXJpYWJpbGl0eSBlbGVtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2V0IGdldFZhcmlhYmlsaXR5RWxlbWVudHMoU2V0IGVsZW1lbnRTZXQsIGJvb2xlYW4gZ2V0QmFzZXMsCi0JCQlib29sZWFuIGdldENoaWxkcmVuKSB7Ci0JCWlmIChlbGVtZW50U2V0ICE9IG51bGwgJiYgIWVsZW1lbnRTZXQuaXNFbXB0eSgpKSB7Ci0JCQlTZXQgdmFyU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRTZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIG87Ci0JCQkJCWlmIChnZXRDaGlsZHJlbikKLQkJCQkJCXZhclNldC5hZGRBbGwoZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKGVsZW1lbnQpKTsKLQkJCQkJaWYgKGdldEJhc2VzCi0JCQkJCQkJJiYgZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkKLQkJCQkJCXZhclNldC5hZGQoZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmICh2YXJTZXQuaXNFbXB0eSgpKQotCQkJCXJldHVybiBlbGVtZW50U2V0OwotCQkJaWYgKGVsZW1lbnRTZXQuY29udGFpbnNBbGwodmFyU2V0KSkKLQkJCQlyZXR1cm4gZWxlbWVudFNldDsKLQkJCWVsZW1lbnRTZXQuYWRkQWxsKHZhclNldCk7Ci0JCQllbGVtZW50U2V0LmFkZEFsbChnZXRWYXJpYWJpbGl0eUVsZW1lbnRzKGVsZW1lbnRTZXQsIGdldEJhc2VzLAotCQkJCQlnZXRDaGlsZHJlbikpOwotCQl9Ci0JCXJldHVybiBlbGVtZW50U2V0OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL0NvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL0NvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGM4OTVjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGw7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgY3JlYXRpb24gb2YgY29udGVudCBkZXNjcmlwdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5IHsKLQotCS8vIE1hcHMgQ29udGVudEVsZW1lbnQgaW1wbGVtZW50YXRpb24gQ2xhc3MgdG8gQ29udGVudERlc2NpcHRpb25JbmZvLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBjb250ZW50RGVzY0NsYXNzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXN0YXRpYyB7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByYWN0aWNlKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFzaygpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVtcGxhdGUoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGFtcGxlKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmV1c2FibGVBc3NldCgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdoaXRlcGFwZXIoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdCgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0RGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0Y29tZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSk7Ci0KLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3IoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGUoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dCgKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKSk7Ci0KLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWlsZXN0b25lKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpKTsKLQotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEl0ZXJhdGlvbigpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFBoYXNlKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2VzcygpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFQ2xhc3MgZ2V0Q29udGVudERlc2NyaXB0aW9uVHlwZShFQ2xhc3MgZGVzY3JpYmFibGVFbGVtZW50VHlwZSkgewotCQlyZXR1cm4gKEVDbGFzcykgY29udGVudERlc2NDbGFzc01hcC5nZXQoZGVzY3JpYmFibGVFbGVtZW50VHlwZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb250ZW50RGVzY3JpcHRpb24gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKAotCQkJRGVzY3JpYmFibGVFbGVtZW50IGUpIHsKLQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpIGNvbnRlbnREZXNjQ2xhc3NNYXAuZ2V0KGUuZUNsYXNzKCkpOwotCQlpZiAoZUNsYXNzID09IG51bGwpIHsKLQkJCWVDbGFzcyA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQl9Ci0JCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlKGVDbGFzcyk7Ci0JCWNvbnRlbnQuc2V0TmFtZShVbWFVdGlsLmNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbk5hbWUoZSkpOwotCQljb250ZW50LnNldEd1aWQoVW1hVXRpbC5nZW5lcmF0ZUdVSUQoZS5nZXRHdWlkKCkpKTsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBDb250ZW50RGVzY3JpcHRpb24gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gQ29udGVudEVsZW1lbnQgYW5kCi0JICogc2F2ZSBpdCB0byBhIGZpbGUKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKERlc2NyaWJhYmxlRWxlbWVudCBlKSBpbnN0ZWFkCi0JICovCi0JcHVibGljIHN0YXRpYyBDb250ZW50RGVzY3JpcHRpb24gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKENvbnRlbnRFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbihlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gc2F2ZUNvbnRlbnRPbmx5Ci0JICogQHJldHVybgotCSAqIEBkZXByZWNhdGVkIHVzZSBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oRGVzY3JpYmFibGVFbGVtZW50IGUpIGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnRlbnREZXNjcmlwdGlvbiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oCi0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZSwgYm9vbGVhbiBzYXZlQ29udGVudE9ubHkpIHsKLQkJLy8gaWYgKCBlIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpCi0JCS8vIHsKLQkJLy8gcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigoQ29udGVudEVsZW1lbnQpZSwgc2F2ZUNvbnRlbnRPbmx5KTsKLQkJLy8gfQotCQkvLwkJCi0JCS8vIHJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oZSk7Ci0KLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbihlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbnRlbnREZXNjcmlwdGlvbiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oQ29udGVudEVsZW1lbnQgZSwKLQkJCWJvb2xlYW4gc2F2ZUNvbnRlbnRPbmx5KSB7Ci0JCUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigoRGVzY3JpYmFibGVFbGVtZW50KSBlKTsKLQotCQkvLyBTZXQgZGVzY3JpcHRpb25zID0gKFNldCkKLQkJLy8gY29udGVudERlc2NyaXB0aW9uc01hcC5nZXQoZGVzY0luZm8ucGFja2FnZU5hbWUpOwotCQkvLyBpZihkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkvLyBkZXNjcmlwdGlvbnMgPSBuZXcgSGFzaFNldCgpOwotCQkvLyBjb250ZW50RGVzY3JpcHRpb25zTWFwLnB1dChkZXNjSW5mby5wYWNrYWdlTmFtZSwgZGVzY3JpcHRpb25zKTsKLQkJLy8gfQotCQkvLyBkZXNjcmlwdGlvbnMuYWRkKGRlc2NyaXB0aW9uKTsKLQotCQkvLyBzYXZpbmcgQ29udGVudERlc2NyaXB0aW9uIHJpZ2h0IGFmdGVyIGl0cyBjcmVhdGlvbiBpdCBubyBsb25nZXIKLQkJLy8gbmVlZGVkIHNpbmNlIENvbnRlbnREZXNjcmlwdGlvbiBpcwotCQkvLyBub3cgY29udGFpbmVkIGJ5IGEgRGVzY3JpYmFibGVFbGVtZW50Ci0JCS8vCi0JCS8vIGlmKGxpYlBlcnNpc3RlciAhPSBudWxsKSB7Ci0JCS8vIGxpYlBlcnNpc3Rlci5zYXZlKGUsIGRlc2NyaXB0aW9uLCBzYXZlQ29udGVudE9ubHkpOwotCQkvLyB9Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcCBnZXRDb250ZW50RGVzY3JpcHRpb25zTWFwKCkgewotCS8vIHJldHVybiBjb250ZW50RGVzY3JpcHRpb25zTWFwOwotCS8vIH0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNQcmVzZW50YXRpb24oTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnRJbXBsKSB7Ci0JCQlyZXR1cm4gKChDb250ZW50RWxlbWVudEltcGwpIGUpLmJhc2ljR2V0UHJlc2VudGF0aW9uKCkgIT0gbnVsbDsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnRJbXBsKSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzRWxlbWVudEltcGwpIGUpLmJhc2ljR2V0UHJlc2VudGF0aW9uKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFQ2xhc3MgZ2V0Q29udGVudERlc2NyaXB0aW9uRUNsYXNzKERlc2NyaWJhYmxlRWxlbWVudCBlKSB7Ci0JCXJldHVybiAoRUNsYXNzKSBjb250ZW50RGVzY0NsYXNzTWFwLmdldChlLmVDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gTWVzc2FnZURpZ2VzdCBtZDUgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKTsKLQkJU3RyaW5nIGlucHV0ID0gYXJnc1swXTsKLQkJLy8gYnl0ZVtdIGhhc2ggPSBtZDUuZGlnZXN0KGlucHV0LmdldEJ5dGVzKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImlucHV0OiAnIiArIGlucHV0ICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiSmF2YSdzIGhhc2ggY29kZTogIiArIGlucHV0Lmhhc2hDb2RlKCkpOyAvLyROT04tTkxTLTEkCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaGFzaCBsZW5ndGg6ICIgKyBoYXNoLmxlbmd0aCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiYmFzZTY0IGVuY29kZWQ6ICIgKwotCQkvLyBEYXRhVmFsdWUuQmFzZTY0LmVuY29kZShoYXNoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigibmV3IEdVSUQ6ICIgKyBVbWFVdGlsLmdlbmVyYXRlR1VJRChpbnB1dCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvTWVzc2FnZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvTWVzc2FnZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNGE4OGJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL01lc3NhZ2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIG1ldGhvZCBsaWJyYXJ5IHBlcnNpc3RlbmNlIG9wZXJhdGlvbiBoYXMgZmFpbGVkLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUV4Y2VwdGlvbiBleHRlbmRzIFdyYXBwZWRFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhjZXB0aW9uIERVTU1ZX0VYQ0VQVElPTiA9IG5ldyBFeGNlcHRpb24oKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM5MDQ2ODI2NTY2ODMwMTM0MzNMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgYW4gZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBNZXNzYWdlRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKLQkJc3VwZXIobXNnLCBEVU1NWV9FWENFUFRJT04pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIGFuIGVycm9yIG1lc3NhZ2UKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBhbiBleGNlcHRpb24gb2JqZWN0Ci0JICovCi0JcHVibGljIE1lc3NhZ2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJc3VwZXIobWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDI4NjJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotY29weXJpZ2h0PUlCTSBDb3Jwb3JhdGlvbgotZXJyX2Nhbm5vdE1vZGlmeTA9Q2Fubm90IG1vZGlmeSAnJ3swfScnCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGY0MmU1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaGljUHJpbWl0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2VhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qc2V1ZG9TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlTWFjaGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZlcnRleDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS4qOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBVbWFQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFVtYVN3aXRjaCBtb2RlbFN3aXRjaCA9IG5ldyBVbWFTd2l0Y2goKSB7Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUNsYXNzaWZpZXIoQ2xhc3NpZmllciBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDbGFzc2lmaWVyQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlVHlwZShUeXBlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVR5cGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFbGVtZW50KEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZU5hbWVkRWxlbWVudChOYW1lZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTmFtZWRFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUGFja2FnZWFibGVFbGVtZW50KFBhY2thZ2VhYmxlRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQYWNrYWdlYWJsZUVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VQYWNrYWdlKG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQYWNrYWdlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlTmFtZXNwYWNlKE5hbWVzcGFjZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVOYW1lc3BhY2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RFbGVtZW50KE1ldGhvZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUNvbnN0cmFpbnQoQ29uc3RyYWludCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDb25zdHJhaW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlTWV0aG9kRWxlbWVudFByb3BlcnR5KE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHlBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VDb250ZW50RWxlbWVudChDb250ZW50RWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDb250ZW50RWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaWJhYmxlRWxlbWVudChEZXNjcmliYWJsZUVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVzY3JpYmFibGVFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlQ29udGVudERlc2NyaXB0aW9uKENvbnRlbnREZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VTZWN0aW9uKFNlY3Rpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlU2VjdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVJvbGUoUm9sZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSb2xlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlV29ya1Byb2R1Y3QoV29ya1Byb2R1Y3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3RBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VUYXNrKFRhc2sgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVGFza0FkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtEZWZpbml0aW9uKFdvcmtEZWZpbml0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdvcmtEZWZpbml0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlU3RlcChTdGVwIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVN0ZXBBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VHdWlkYW5jZShHdWlkYW5jZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUFydGlmYWN0KEFydGlmYWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUFydGlmYWN0QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRGVsaXZlcmFibGUoRGVsaXZlcmFibGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVsaXZlcmFibGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRjb21lKE91dGNvbWUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlT3V0Y29tZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFBhY2thZ2UoTWV0aG9kUGFja2FnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNZXRob2RQYWNrYWdlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlQ29udGVudFBhY2thZ2UoQ29udGVudFBhY2thZ2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29udGVudFBhY2thZ2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VBcnRpZmFjdERlc2NyaXB0aW9uKEFydGlmYWN0RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRGVsaXZlcmFibGVEZXNjcmlwdGlvbihEZWxpdmVyYWJsZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VSb2xlRGVzY3JpcHRpb24oUm9sZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVRhc2tEZXNjcmlwdGlvbihUYXNrRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVGFza0Rlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlR3VpZGFuY2VEZXNjcmlwdGlvbihHdWlkYW5jZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VQcmFjdGljZURlc2NyaXB0aW9uKFByYWN0aWNlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVBvaW50KFBvaW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVBvaW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlR3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVHcmFwaEVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEaWFncmFtRWxlbWVudChEaWFncmFtRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEaWFncmFtRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURpYWdyYW1MaW5rKERpYWdyYW1MaW5rIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURpYWdyYW1MaW5rQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlR3JhcGhDb25uZWN0b3IoR3JhcGhDb25uZWN0b3Igb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlR3JhcGhDb25uZWN0b3JBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VTZW1hbnRpY01vZGVsQnJpZGdlKFNlbWFudGljTW9kZWxCcmlkZ2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlU2VtYW50aWNNb2RlbEJyaWRnZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURpbWVuc2lvbihEaW1lbnNpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGltZW5zaW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUmVmZXJlbmNlKFJlZmVyZW5jZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSZWZlcmVuY2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9wZXJ0eShQcm9wZXJ0eSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcm9wZXJ0eUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUdyYXBoRWRnZShHcmFwaEVkZ2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlR3JhcGhFZGdlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRGlhZ3JhbShEaWFncmFtIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURpYWdyYW1BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VHcmFwaE5vZGUoR3JhcGhOb2RlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUdyYXBoTm9kZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KAotCQkJCVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlVU1BU2VtYW50aWNNb2RlbEJyaWRnZShVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VDb3JlU2VtYW50aWNNb2RlbEJyaWRnZShDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDb3JlU2VtYW50aWNNb2RlbEJyaWRnZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUxlYWZFbGVtZW50KExlYWZFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUxlYWZFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlVGV4dEVsZW1lbnQoVGV4dEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVGV4dEVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VJbWFnZShJbWFnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVJbWFnZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUdyYXBoaWNQcmltaXRpdmUoR3JhcGhpY1ByaW1pdGl2ZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVHcmFwaGljUHJpbWl0aXZlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUG9seWxpbmUoUG9seWxpbmUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUG9seWxpbmVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFbGxpcHNlKEVsbGlwc2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRWxsaXBzZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUFjdGl2aXR5KEFjdGl2aXR5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoV29ya0JyZWFrZG93bkVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VCcmVha2Rvd25FbGVtZW50KEJyZWFrZG93bkVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQnJlYWtkb3duRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZU1pbGVzdG9uZShNaWxlc3RvbmUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlSXRlcmF0aW9uKEl0ZXJhdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VQaGFzZShQaGFzZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQaGFzZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVRlYW1Qcm9maWxlKFRlYW1Qcm9maWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVRlYW1Qcm9maWxlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUm9sZURlc2NyaXB0b3IoUm9sZURlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrT3JkZXIoV29ya09yZGVyIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdvcmtPcmRlckFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NFbGVtZW50KFByb2Nlc3NFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUGxhbm5pbmdEYXRhKFBsYW5uaW5nRGF0YSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQbGFubmluZ0RhdGFBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdG9yKERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvcihXb3JrUHJvZHVjdERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlVGFza0Rlc2NyaXB0b3IoVGFza0Rlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wb3NpdGVSb2xlKENvbXBvc2l0ZVJvbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29tcG9zaXRlUm9sZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigKLQkJCQlCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlQWN0aXZpdHlEZXNjcmlwdGlvbihBY3Rpdml0eURlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigKLQkJCQlEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NEZXNjcmlwdGlvbihQcm9jZXNzRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRvckRlc2NyaXB0aW9uKERlc2NyaXB0b3JEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VDb25jZXB0KENvbmNlcHQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29uY2VwdEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUNoZWNrbGlzdChDaGVja2xpc3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ2hlY2tsaXN0QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRXhhbXBsZShFeGFtcGxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUV4YW1wbGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VHdWlkZWxpbmUoR3VpZGVsaW5lIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUd1aWRlbGluZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVJlcG9ydChSZXBvcnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUmVwb3J0QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlVGVtcGxhdGUoVGVtcGxhdGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVGVtcGxhdGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VTdXBwb3J0aW5nTWF0ZXJpYWwoU3VwcG9ydGluZ01hdGVyaWFsIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVRvb2xNZW50b3IoVG9vbE1lbnRvciBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUb29sTWVudG9yQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlV2hpdGVwYXBlcihXaGl0ZXBhcGVyIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdoaXRlcGFwZXJBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VUZXJtRGVmaW5pdGlvbihUZXJtRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUZXJtRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVByYWN0aWNlKFByYWN0aWNlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByYWN0aWNlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKAotCQkJCUVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VSZXVzYWJsZUFzc2V0KFJldXNhYmxlQXNzZXQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUmV1c2FibGVBc3NldEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVN0YXRlKFN0YXRlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVN0YXRlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlVmVydGV4KFZlcnRleCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVWZXJ0ZXhBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VSZWdpb24oUmVnaW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJlZ2lvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVN0YXRlTWFjaGluZShTdGF0ZU1hY2hpbmUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlU3RhdGVNYWNoaW5lQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlVHJhbnNpdGlvbihUcmFuc2l0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVRyYW5zaXRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VQc2V1ZG9TdGF0ZShQc2V1ZG9TdGF0ZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQc2V1ZG9TdGF0ZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURpc2NpcGxpbmUoRGlzY2lwbGluZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEaXNjaXBsaW5lQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlQ29udGVudENhdGVnb3J5KENvbnRlbnRDYXRlZ29yeSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDb250ZW50Q2F0ZWdvcnlBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VSb2xlU2V0KFJvbGVTZXQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUm9sZVNldEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURvbWFpbihEb21haW4gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRG9tYWluQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlV29ya1Byb2R1Y3RUeXBlKFdvcmtQcm9kdWN0VHlwZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdFR5cGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEaXNjaXBsaW5lR3JvdXBpbmcoRGlzY2lwbGluZUdyb3VwaW5nIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVRvb2woVG9vbCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUb29sQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUm9sZVNldEdyb3VwaW5nKFJvbGVTZXRHcm91cGluZyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSb2xlU2V0R3JvdXBpbmdBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VDdXN0b21DYXRlZ29yeShDdXN0b21DYXRlZ29yeSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDdXN0b21DYXRlZ29yeUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURlbGl2ZXJ5UHJvY2VzcyhEZWxpdmVyeVByb2Nlc3Mgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3Mgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUNhcGFiaWxpdHlQYXR0ZXJuKENhcGFiaWxpdHlQYXR0ZXJuIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VSb2FkbWFwKFJvYWRtYXAgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUm9hZG1hcEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NDb21wb25lbnQoUHJvY2Vzc0NvbXBvbmVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcm9jZXNzQ29tcG9uZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUHJvY2Vzc1BhY2thZ2UoUHJvY2Vzc1BhY2thZ2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc1BhY2thZ2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKAotCQkJCVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKAotCQkJCVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlTWV0aG9kUGx1Z2luKE1ldGhvZFBsdWdpbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNZXRob2RQbHVnaW5BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoVmFyaWFiaWxpdHlFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVZhcmlhYmlsaXR5RWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFVuaXQoTWV0aG9kVW5pdCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNZXRob2RVbml0QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlTWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzRmFtaWx5KFByb2Nlc3NGYW1pbHkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0ZhbWlseUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNZXRob2RMaWJyYXJ5QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKSBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCkgdGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllciA8ZW0+Q2xhc3NpZmllcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2xhc3NpZmllckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50IDxlbT5OYW1lZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5hbWVkRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQgPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFja2FnZWFibGVFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UgPGVtPlBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhY2thZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lc3BhY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTmFtZXNwYWNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQgPGVtPk1ldGhvZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQgPGVtPkNvbnN0cmFpbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnN0cmFpbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5IDxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQgPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCA8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uIDxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uIDxlbT5TZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUgPGVtPlJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sgPGVtPlRhc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24gPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtEZWZpbml0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXAgPGVtPlN0ZXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0ZXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2UgPGVtPkd1aWRhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QgPGVtPkFydGlmYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJ0aWZhY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGUgPGVtPkRlbGl2ZXJhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcmFibGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZSA8ZW0+T3V0Y29tZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlT3V0Y29tZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZSA8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudFBhY2thZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiA8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24gPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiA8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uIDxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uIDxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCA8ZW0+UG9pbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb2ludEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3JhcGhFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50IDxlbT5EaWFncmFtIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaWFncmFtRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlhZ3JhbUxpbmtBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IgPGVtPkdyYXBoIENvbm5lY3RvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdyYXBoQ29ubmVjdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UgPGVtPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VtYW50aWNNb2RlbEJyaWRnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24gPGVtPkRpbWVuc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaW1lbnNpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVmZXJlbmNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5IDxlbT5Qcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb3BlcnR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZSA8ZW0+R3JhcGggRWRnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHcmFwaEVkZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlhZ3JhbUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGUgPGVtPkdyYXBoIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3JhcGhOb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IDxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2UgPGVtPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UgPGVtPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTGVhZkVsZW1lbnQgPGVtPkxlYWYgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkxlYWZFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxlYWZFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50IDxlbT5UZXh0IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZXh0RWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZSA8ZW0+SW1hZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbWFnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaGljUHJpbWl0aXZlIDxlbT5HcmFwaGljIFByaW1pdGl2ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3JhcGhpY1ByaW1pdGl2ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZSA8ZW0+UG9seWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb2x5bGluZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlIDxlbT5FbGxpcHNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFbGxpcHNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5IDxlbT5BY3Rpdml0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50IDxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbiA8ZW0+SXRlcmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZSA8ZW0+UGhhc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaGFzZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSA8ZW0+VGVhbSBQcm9maWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IgPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlciA8ZW0+V29yayBPcmRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrT3JkZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQbGFubmluZ0RhdGFBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvciA8ZW0+RGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciA8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZSA8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBvc2l0ZVJvbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIDxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiA8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24gPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdCA8ZW0+Q29uY2VwdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29uY2VwdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3QgPGVtPkNoZWNrbGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDaGVja2xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXhhbXBsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHdWlkZWxpbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9uc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQgPGVtPlJlcG9ydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXBvcnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGUgPGVtPlRlbXBsYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVtcGxhdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yIDxlbT5Ub29sIE1lbnRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVG9vbE1lbnRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXaGl0ZXBhcGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uIDxlbT5UZXJtIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZXJtRGVmaW5pdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZSA8ZW0+UHJhY3RpY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcmFjdGljZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0IDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmV1c2FibGVBc3NldEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZSA8ZW0+U3RhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXggPGVtPlZlcnRleDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlZlcnRleAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVWZXJ0ZXhBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVnaW9uIDxlbT5SZWdpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVnaW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlTWFjaGluZSA8ZW0+U3RhdGUgTWFjaGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlN0YXRlTWFjaGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGF0ZU1hY2hpbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHJhbnNpdGlvbiA8ZW0+VHJhbnNpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRyYW5zaXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVHJhbnNpdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qc2V1ZG9TdGF0ZSA8ZW0+UHNldWRvIFN0YXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHNldWRvU3RhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHNldWRvU3RhdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSA8ZW0+RGlzY2lwbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnkgPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudENhdGVnb3J5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQgPGVtPlJvbGUgU2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbiA8ZW0+RG9tYWluPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURvbWFpbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGUgPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcgPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2wgPGVtPlRvb2w8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRvb2xBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nIDxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0R3JvdXBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkgPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUN1c3RvbUNhdGVnb3J5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcyA8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybiA8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwIDxlbT5Sb2FkbWFwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2FkbWFwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQgPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlIDxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IgPGVtPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGx1Z2luQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVWYXJpYWJpbGl0eUVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCA8ZW0+TWV0aG9kIFVuaXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFVuaXRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseSA8ZW0+UHJvY2VzcyBGYW1pbHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NGYW1pbHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZExpYnJhcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vVW1hQWRhcHRlckZhY3RvcnkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFSZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YWZjODQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgVU1BIHJlc291cmNlIGJ1bmRsZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVbWFSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gVW1hUmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVW1hUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5cmlnaHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJfY2Fubm90TW9kaWZ5MDsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFVtYVJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYVN3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2ZDVkNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhpY1ByaW1pdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTGVhZkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHNldWRvU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGF0ZU1hY2hpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRyYW5zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WZXJ0ZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuKjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYVN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBVbWFQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9IGVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuIGVTdXBlclR5cGVzLmlzRW1wdHkoKSA/IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDogZG9Td2l0Y2goCi0JCQkJCShFQ2xhc3MpIGVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DTEFTU0lGSUVSOiB7Ci0JCQlDbGFzc2lmaWVyIGNsYXNzaWZpZXIgPSAoQ2xhc3NpZmllcikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihjbGFzc2lmaWVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShjbGFzc2lmaWVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNsYXNzaWZpZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY2xhc3NpZmllcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoY2xhc3NpZmllcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5UWVBFOiB7Ci0JCQlUeXBlIHR5cGUgPSAoVHlwZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVHlwZSh0eXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQodHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5FTEVNRU5UOiB7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRWxlbWVudChlbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlQ6IHsKLQkJCU5hbWVkRWxlbWVudCBuYW1lZEVsZW1lbnQgPSAoTmFtZWRFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobmFtZWRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChuYW1lZEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUEFDS0FHRUFCTEVfRUxFTUVOVDogewotCQkJUGFja2FnZWFibGVFbGVtZW50IHBhY2thZ2VhYmxlRWxlbWVudCA9IChQYWNrYWdlYWJsZUVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwYWNrYWdlYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocGFja2FnZWFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwYWNrYWdlYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUEFDS0FHRTogewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlIHBhY2thZ2VfID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUGFja2FnZShwYWNrYWdlXyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVzcGFjZShwYWNrYWdlXyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwYWNrYWdlXyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwYWNrYWdlXyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocGFja2FnZV8pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTkFNRVNQQUNFOiB7Ci0JCQlOYW1lc3BhY2UgbmFtZXNwYWNlID0gKE5hbWVzcGFjZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChuYW1lc3BhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG5hbWVzcGFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVDogewotCQkJTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWV0aG9kRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVDogewotCQkJQ29uc3RyYWludCBjb25zdHJhaW50ID0gKENvbnN0cmFpbnQpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbnN0cmFpbnQoY29uc3RyYWludCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29uc3RyYWludCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb25zdHJhaW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbnN0cmFpbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbnN0cmFpbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6IHsKLQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBtZXRob2RFbGVtZW50UHJvcGVydHkgPSAoTWV0aG9kRWxlbWVudFByb3BlcnR5KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50UHJvcGVydHkobWV0aG9kRWxlbWVudFByb3BlcnR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RFbGVtZW50UHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlQ6IHsKLQkJCUNvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGNvbnRlbnRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShjb250ZW50RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVDogewotCQkJRGVzY3JpYmFibGVFbGVtZW50IGRlc2NyaWJhYmxlRWxlbWVudCA9IChEZXNjcmliYWJsZUVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkZXNjcmliYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT046IHsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSAoQ29udGVudERlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oY29udGVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChjb250ZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb250ZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjb250ZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTjogewotCQkJU2VjdGlvbiBzZWN0aW9uID0gKFNlY3Rpb24pIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlY3Rpb24oc2VjdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChzZWN0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChzZWN0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHNlY3Rpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoc2VjdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoc2VjdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFOiB7Ci0JCQlSb2xlIHJvbGUgPSAoUm9sZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUm9sZShyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVDogewotCQkJV29ya1Byb2R1Y3Qgd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0KHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQod29ya1Byb2R1Y3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod29ya1Byb2R1Y3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQod29ya1Byb2R1Y3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUod29ya1Byb2R1Y3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya1Byb2R1Y3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0s6IHsKLQkJCVRhc2sgdGFzayA9IChUYXNrKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUYXNrKHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh0YXNrKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0RlZmluaXRpb24odGFzayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0YXNrKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGFzayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUodGFzayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0YXNrKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0YXNrKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTjogewotCQkJV29ya0RlZmluaXRpb24gd29ya0RlZmluaXRpb24gPSAoV29ya0RlZmluaXRpb24pIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdvcmtEZWZpbml0aW9uKHdvcmtEZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3b3JrRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQod29ya0RlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuU1RFUDogewotCQkJU3RlcCBzdGVwID0gKFN0ZXApIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVN0ZXAoc3RlcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVNlY3Rpb24oc3RlcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtEZWZpbml0aW9uKHN0ZXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoc3RlcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoc3RlcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChzdGVwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHN0ZXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHN0ZXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0U6IHsKLQkJCUd1aWRhbmNlIGd1aWRhbmNlID0gKEd1aWRhbmNlKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VHdWlkYW5jZShndWlkYW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGd1aWRhbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGd1aWRhbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGd1aWRhbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChndWlkYW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoZ3VpZGFuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGd1aWRhbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGd1aWRhbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChndWlkYW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVDogewotCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFydGlmYWN0KGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3QoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChhcnRpZmFjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChhcnRpZmFjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChhcnRpZmFjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShhcnRpZmFjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhcnRpZmFjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEU6IHsKLQkJCURlbGl2ZXJhYmxlIGRlbGl2ZXJhYmxlID0gKERlbGl2ZXJhYmxlKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEZWxpdmVyYWJsZShkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0KGRlbGl2ZXJhYmxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLk9VVENPTUU6IHsKLQkJCU91dGNvbWUgb3V0Y29tZSA9IChPdXRjb21lKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VPdXRjb21lKG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdChvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFOiB7Ci0JCQlNZXRob2RQYWNrYWdlIG1ldGhvZFBhY2thZ2UgPSAoTWV0aG9kUGFja2FnZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWV0aG9kUGFja2FnZShtZXRob2RQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZShtZXRob2RQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lc3BhY2UobWV0aG9kUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRTogewotCQkJQ29udGVudFBhY2thZ2UgY29udGVudFBhY2thZ2UgPSAoQ29udGVudFBhY2thZ2UpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbnRlbnRQYWNrYWdlKGNvbnRlbnRQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kUGFja2FnZShjb250ZW50UGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29udGVudFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlKGNvbnRlbnRQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbnRlbnRQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZXNwYWNlKGNvbnRlbnRQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbnRlbnRQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjb250ZW50UGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTjogewotCQkJQXJ0aWZhY3REZXNjcmlwdGlvbiBhcnRpZmFjdERlc2NyaXB0aW9uID0gKEFydGlmYWN0RGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFydGlmYWN0RGVzY3JpcHRpb24oYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT046IHsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRpb24gd29ya1Byb2R1Y3REZXNjcmlwdGlvbiA9IChXb3JrUHJvZHVjdERlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24od29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQod29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT046IHsKLQkJCURlbGl2ZXJhYmxlRGVzY3JpcHRpb24gZGVsaXZlcmFibGVEZXNjcmlwdGlvbiA9IChEZWxpdmVyYWJsZURlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEZWxpdmVyYWJsZURlc2NyaXB0aW9uKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTjogewotCQkJUm9sZURlc2NyaXB0aW9uIHJvbGVEZXNjcmlwdGlvbiA9IChSb2xlRGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJvbGVEZXNjcmlwdGlvbihyb2xlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24ocm9sZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChyb2xlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJvbGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9sZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChyb2xlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTjogewotCQkJVGFza0Rlc2NyaXB0aW9uIHRhc2tEZXNjcmlwdGlvbiA9IChUYXNrRGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRhc2tEZXNjcmlwdGlvbih0YXNrRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24odGFza0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdCh0YXNrRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRhc2tEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0YXNrRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGFza0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0YXNrRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT046IHsKLQkJCUd1aWRhbmNlRGVzY3JpcHRpb24gZ3VpZGFuY2VEZXNjcmlwdGlvbiA9IChHdWlkYW5jZURlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VHdWlkYW5jZURlc2NyaXB0aW9uKGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT046IHsKLQkJCVByYWN0aWNlRGVzY3JpcHRpb24gcHJhY3RpY2VEZXNjcmlwdGlvbiA9IChQcmFjdGljZURlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQcmFjdGljZURlc2NyaXB0aW9uKHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24ocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUE9JTlQ6IHsKLQkJCVBvaW50IHBvaW50ID0gKFBvaW50KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQb2ludChwb2ludCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UOiB7Ci0JCQlHcmFwaEVsZW1lbnQgZ3JhcGhFbGVtZW50ID0gKEdyYXBoRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlR3JhcGhFbGVtZW50KGdyYXBoRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KGdyYXBoRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3JhcGhFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGdyYXBoRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChncmFwaEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGdyYXBoRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlQ6IHsKLQkJCURpYWdyYW1FbGVtZW50IGRpYWdyYW1FbGVtZW50ID0gKERpYWdyYW1FbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChkaWFncmFtRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGlhZ3JhbUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGlhZ3JhbUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGlhZ3JhbUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRpYWdyYW1FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOSzogewotCQkJRGlhZ3JhbUxpbmsgZGlhZ3JhbUxpbmsgPSAoRGlhZ3JhbUxpbmspIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZURpYWdyYW1MaW5rKGRpYWdyYW1MaW5rKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoZGlhZ3JhbUxpbmspOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRpYWdyYW1MaW5rKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRpYWdyYW1MaW5rKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRpYWdyYW1MaW5rKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkaWFncmFtTGluayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1I6IHsKLQkJCUdyYXBoQ29ubmVjdG9yIGdyYXBoQ29ubmVjdG9yID0gKEdyYXBoQ29ubmVjdG9yKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VHcmFwaENvbm5lY3RvcihncmFwaENvbm5lY3Rvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUdyYXBoRWxlbWVudChncmFwaENvbm5lY3Rvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KGdyYXBoQ29ubmVjdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChncmFwaENvbm5lY3Rvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChncmFwaENvbm5lY3Rvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChncmFwaENvbm5lY3Rvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZ3JhcGhDb25uZWN0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFOiB7Ci0JCQlTZW1hbnRpY01vZGVsQnJpZGdlIHNlbWFudGljTW9kZWxCcmlkZ2UgPSAoU2VtYW50aWNNb2RlbEJyaWRnZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VtYW50aWNNb2RlbEJyaWRnZShzZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoc2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoc2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChzZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OOiB7Ci0JCQlEaW1lbnNpb24gZGltZW5zaW9uID0gKERpbWVuc2lvbikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGltZW5zaW9uKGRpbWVuc2lvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0U6IHsKLQkJCVJlZmVyZW5jZSByZWZlcmVuY2UgPSAoUmVmZXJlbmNlKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZWZlcmVuY2UocmVmZXJlbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQocmVmZXJlbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyZWZlcmVuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocmVmZXJlbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJlZmVyZW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocmVmZXJlbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBST1BFUlRZOiB7Ci0JCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IChQcm9wZXJ0eSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJvcGVydHkocHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChwcm9wZXJ0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb3BlcnR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0U6IHsKLQkJCUdyYXBoRWRnZSBncmFwaEVkZ2UgPSAoR3JhcGhFZGdlKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VHcmFwaEVkZ2UoZ3JhcGhFZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3JhcGhFbGVtZW50KGdyYXBoRWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KGdyYXBoRWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3JhcGhFZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGdyYXBoRWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChncmFwaEVkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGdyYXBoRWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNOiB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGlhZ3JhbShkaWFncmFtKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3JhcGhOb2RlKGRpYWdyYW0pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHcmFwaEVsZW1lbnQoZGlhZ3JhbSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KGRpYWdyYW0pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRpYWdyYW0pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGlhZ3JhbSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkaWFncmFtKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkaWFncmFtKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX05PREU6IHsKLQkJCUdyYXBoTm9kZSBncmFwaE5vZGUgPSAoR3JhcGhOb2RlKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VHcmFwaE5vZGUoZ3JhcGhOb2RlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3JhcGhFbGVtZW50KGdyYXBoTm9kZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KGdyYXBoTm9kZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3JhcGhOb2RlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGdyYXBoTm9kZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChncmFwaE5vZGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGdyYXBoTm9kZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVDogewotCQkJU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgPSAoU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlU2VtYW50aWNNb2RlbEJyaWRnZShzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVU1BX1NFTUFOVElDX01PREVMX0JSSURHRTogewotCQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSB1bWFTZW1hbnRpY01vZGVsQnJpZGdlID0gKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UodW1hU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVNlbWFudGljTW9kZWxCcmlkZ2UodW1hU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KHVtYVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHVtYVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodW1hU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh1bWFTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh1bWFTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkNPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFOiB7Ci0JCQlDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSBjb3JlU2VtYW50aWNNb2RlbEJyaWRnZSA9IChDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UoY29yZVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VTZW1hbnRpY01vZGVsQnJpZGdlKGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoY29yZVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjb3JlU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5MRUFGX0VMRU1FTlQ6IHsKLQkJCUxlYWZFbGVtZW50IGxlYWZFbGVtZW50ID0gKExlYWZFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VMZWFmRWxlbWVudChsZWFmRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KGxlYWZFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChsZWFmRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChsZWFmRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChsZWFmRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQobGVhZkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVEVYVF9FTEVNRU5UOiB7Ci0JCQlUZXh0RWxlbWVudCB0ZXh0RWxlbWVudCA9IChUZXh0RWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGV4dEVsZW1lbnQodGV4dEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VMZWFmRWxlbWVudCh0ZXh0RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KHRleHRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0ZXh0RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0ZXh0RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0ZXh0RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQodGV4dEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuSU1BR0U6IHsKLQkJCUltYWdlIGltYWdlID0gKEltYWdlKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VJbWFnZShpbWFnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUxlYWZFbGVtZW50KGltYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoaW1hZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGltYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGltYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGltYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChpbWFnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSElDX1BSSU1JVElWRTogewotCQkJR3JhcGhpY1ByaW1pdGl2ZSBncmFwaGljUHJpbWl0aXZlID0gKEdyYXBoaWNQcmltaXRpdmUpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZUdyYXBoaWNQcmltaXRpdmUoZ3JhcGhpY1ByaW1pdGl2ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUxlYWZFbGVtZW50KGdyYXBoaWNQcmltaXRpdmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChncmFwaGljUHJpbWl0aXZlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChncmFwaGljUHJpbWl0aXZlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGdyYXBoaWNQcmltaXRpdmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZ3JhcGhpY1ByaW1pdGl2ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZ3JhcGhpY1ByaW1pdGl2ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORTogewotCQkJUG9seWxpbmUgcG9seWxpbmUgPSAoUG9seWxpbmUpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVBvbHlsaW5lKHBvbHlsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3JhcGhpY1ByaW1pdGl2ZShwb2x5bGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUxlYWZFbGVtZW50KHBvbHlsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQocG9seWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHBvbHlsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHBvbHlsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHBvbHlsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwb2x5bGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFOiB7Ci0JCQlFbGxpcHNlIGVsbGlwc2UgPSAoRWxsaXBzZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRWxsaXBzZShlbGxpcHNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3JhcGhpY1ByaW1pdGl2ZShlbGxpcHNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTGVhZkVsZW1lbnQoZWxsaXBzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KGVsbGlwc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGVsbGlwc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZWxsaXBzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChlbGxpcHNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChlbGxpcHNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZOiB7Ci0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQWN0aXZpdHkoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtEZWZpbml0aW9uKGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UOiB7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCB3b3JrQnJlYWtkb3duRWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UOiB7Ci0JCQlCcmVha2Rvd25FbGVtZW50IGJyZWFrZG93bkVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihicmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGJyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5NSUxFU1RPTkU6IHsKLQkJCU1pbGVzdG9uZSBtaWxlc3RvbmUgPSAoTWlsZXN0b25lKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNaWxlc3RvbmUobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChtaWxlc3RvbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChtaWxlc3RvbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtaWxlc3RvbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKG1pbGVzdG9uZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtaWxlc3RvbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKG1pbGVzdG9uZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtaWxlc3RvbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5JVEVSQVRJT046IHsKLQkJCUl0ZXJhdGlvbiBpdGVyYXRpb24gPSAoSXRlcmF0aW9uKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VJdGVyYXRpb24oaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQWN0aXZpdHkoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtEZWZpbml0aW9uKGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUEhBU0U6IHsKLQkJCVBoYXNlIHBoYXNlID0gKFBoYXNlKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQaGFzZShwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUFjdGl2aXR5KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbihwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFOiB7Ci0JCQlUZWFtUHJvZmlsZSB0ZWFtUHJvZmlsZSA9IChUZWFtUHJvZmlsZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGVhbVByb2ZpbGUodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih0ZWFtUHJvZmlsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUjogewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IgPSAoUm9sZURlc2NyaXB0b3IpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJvbGVEZXNjcmlwdG9yKHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpcHRvcihyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUjogewotCQkJV29ya09yZGVyIHdvcmtPcmRlciA9IChXb3JrT3JkZXIpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdvcmtPcmRlcih3b3JrT3JkZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudCh3b3JrT3JkZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod29ya09yZGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3b3JrT3JkZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHdvcmtPcmRlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrT3JkZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHdvcmtPcmRlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrT3JkZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtPcmRlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0VMRU1FTlQ6IHsKLQkJCVByb2Nlc3NFbGVtZW50IHByb2Nlc3NFbGVtZW50ID0gKFByb2Nlc3NFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwcm9jZXNzRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwcm9jZXNzRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc0VsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHByb2Nlc3NFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShwcm9jZXNzRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc0VsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQTogewotCQkJUGxhbm5pbmdEYXRhIHBsYW5uaW5nRGF0YSA9IChQbGFubmluZ0RhdGEpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVBsYW5uaW5nRGF0YShwbGFubmluZ0RhdGEpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocGxhbm5pbmdEYXRhKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHBsYW5uaW5nRGF0YSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHBsYW5uaW5nRGF0YSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SOiB7Ci0JCQlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoRGVzY3JpcHRvcikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihkZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGRlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUjogewotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdvcmtQcm9kdWN0RGVzY3JpcHRvciA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmlwdG9yKHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SOiB7Ci0JCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGFza0Rlc2NyaXB0b3IodGFza0Rlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaXB0b3IodGFza0Rlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUodGFza0Rlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFOiB7Ci0JCQlDb21wb3NpdGVSb2xlIGNvbXBvc2l0ZVJvbGUgPSAoQ29tcG9zaXRlUm9sZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29tcG9zaXRlUm9sZShjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUm9sZURlc2NyaXB0b3IoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaXB0b3IoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT046IHsKLQkJCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gPSAoQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OOiB7Ci0JCQlBY3Rpdml0eURlc2NyaXB0aW9uIGFjdGl2aXR5RGVzY3JpcHRpb24gPSAoQWN0aXZpdHlEZXNjcmlwdGlvbikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQWN0aXZpdHlEZXNjcmlwdGlvbihhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTjogewotCQkJRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gPSAoRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0Rlc2NyaXB0aW9uKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQWN0aXZpdHlEZXNjcmlwdGlvbihkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbihkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OOiB7Ci0JCQlQcm9jZXNzRGVzY3JpcHRpb24gcHJvY2Vzc0Rlc2NyaXB0aW9uID0gKFByb2Nlc3NEZXNjcmlwdGlvbikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJvY2Vzc0Rlc2NyaXB0aW9uKHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24ocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OOiB7Ci0JCQlEZXNjcmlwdG9yRGVzY3JpcHRpb24gZGVzY3JpcHRvckRlc2NyaXB0aW9uID0gKERlc2NyaXB0b3JEZXNjcmlwdGlvbikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGVzY3JpcHRvckRlc2NyaXB0aW9uKGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbihkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ09OQ0VQVDogewotCQkJQ29uY2VwdCBjb25jZXB0ID0gKENvbmNlcHQpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbmNlcHQoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGNvbmNlcHQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjb25jZXB0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGNvbmNlcHQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb25jZXB0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShjb25jZXB0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbmNlcHQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbmNlcHQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ0hFQ0tMSVNUOiB7Ci0JCQlDaGVja2xpc3QgY2hlY2tsaXN0ID0gKENoZWNrbGlzdCkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ2hlY2tsaXN0KGNoZWNrbGlzdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGNoZWNrbGlzdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGNoZWNrbGlzdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGNoZWNrbGlzdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGNoZWNrbGlzdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNoZWNrbGlzdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5FWEFNUExFOiB7Ci0JCQlFeGFtcGxlIGV4YW1wbGUgPSAoRXhhbXBsZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXhhbXBsZShleGFtcGxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3VpZGFuY2UoZXhhbXBsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZXhhbXBsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChleGFtcGxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChleGFtcGxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihleGFtcGxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZXhhbXBsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZXhhbXBsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlERUxJTkU6IHsKLQkJCUd1aWRlbGluZSBndWlkZWxpbmUgPSAoR3VpZGVsaW5lKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VHdWlkZWxpbmUoZ3VpZGVsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3VpZGFuY2UoZ3VpZGVsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZ3VpZGVsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoZ3VpZGVsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoZ3VpZGVsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZ3VpZGVsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlJFUE9SVDogewotCQkJUmVwb3J0IHJlcG9ydCA9IChSZXBvcnQpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlcG9ydChyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZShyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocmVwb3J0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHJlcG9ydCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocmVwb3J0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocmVwb3J0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocmVwb3J0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVEVNUExBVEU6IHsKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gKFRlbXBsYXRlKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih0ZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0ZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlNVUFBPUlRJTkdfTUFURVJJQUw6IHsKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbCBzdXBwb3J0aW5nTWF0ZXJpYWwgPSAoU3VwcG9ydGluZ01hdGVyaWFsKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTdXBwb3J0aW5nTWF0ZXJpYWwoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3VpZGFuY2Uoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfTUVOVE9SOiB7Ci0JCQlUb29sTWVudG9yIHRvb2xNZW50b3IgPSAoVG9vbE1lbnRvcikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVG9vbE1lbnRvcih0b29sTWVudG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3VpZGFuY2UodG9vbE1lbnRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudCh0b29sTWVudG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0b29sTWVudG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih0b29sTWVudG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5XSElURVBBUEVSOiB7Ci0JCQlXaGl0ZXBhcGVyIHdoaXRlcGFwZXIgPSAoV2hpdGVwYXBlcikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV2hpdGVwYXBlcih3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29uY2VwdCh3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3VpZGFuY2Uod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudCh3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHdoaXRlcGFwZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5URVJNX0RFRklOSVRJT046IHsKLQkJCVRlcm1EZWZpbml0aW9uIHRlcm1EZWZpbml0aW9uID0gKFRlcm1EZWZpbml0aW9uKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUZXJtRGVmaW5pdGlvbih0ZXJtRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQodGVybURlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodGVybURlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQodGVybURlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih0ZXJtRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUodGVybURlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGVybURlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFOiB7Ci0JCQlQcmFjdGljZSBwcmFjdGljZSA9IChQcmFjdGljZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJhY3RpY2UocHJhY3RpY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZShwcmFjdGljZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcmFjdGljZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocHJhY3RpY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJhY3RpY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcmFjdGljZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOiB7Ci0JCQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID0gKEVzdGltYXRpb25Db25zaWRlcmF0aW9ucykgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5SRVVTQUJMRV9BU1NFVDogewotCQkJUmV1c2FibGVBc3NldCByZXVzYWJsZUFzc2V0ID0gKFJldXNhYmxlQXNzZXQpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJldXNhYmxlQXNzZXQocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHJldXNhYmxlQXNzZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShyZXVzYWJsZUFzc2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuU1RBVEU6IHsKLQkJCVN0YXRlIHN0YXRlID0gKFN0YXRlKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTdGF0ZShzdGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZlcnRleChzdGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5WRVJURVg6IHsKLQkJCVZlcnRleCB2ZXJ0ZXggPSAoVmVydGV4KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VWZXJ0ZXgodmVydGV4KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlJFR0lPTjogewotCQkJUmVnaW9uIHJlZ2lvbiA9IChSZWdpb24pIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlZ2lvbihyZWdpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuU1RBVEVfTUFDSElORTogewotCQkJU3RhdGVNYWNoaW5lIHN0YXRlTWFjaGluZSA9IChTdGF0ZU1hY2hpbmUpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVN0YXRlTWFjaGluZShzdGF0ZU1hY2hpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbihzdGF0ZU1hY2hpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHN0YXRlTWFjaGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChzdGF0ZU1hY2hpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoc3RhdGVNYWNoaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChzdGF0ZU1hY2hpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVFJBTlNJVElPTjogewotCQkJVHJhbnNpdGlvbiB0cmFuc2l0aW9uID0gKFRyYW5zaXRpb24pIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRyYW5zaXRpb24odHJhbnNpdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QU0VVRE9fU1RBVEU6IHsKLQkJCVBzZXVkb1N0YXRlIHBzZXVkb1N0YXRlID0gKFBzZXVkb1N0YXRlKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQc2V1ZG9TdGF0ZShwc2V1ZG9TdGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZlcnRleChwc2V1ZG9TdGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FOiB7Ci0JCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGlzY2lwbGluZShkaXNjaXBsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KGRpc2NpcGxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShkaXNjaXBsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWTogewotCQkJQ29udGVudENhdGVnb3J5IGNvbnRlbnRDYXRlZ29yeSA9IChDb250ZW50Q2F0ZWdvcnkpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVQ6IHsKLQkJCVJvbGVTZXQgcm9sZVNldCA9IChSb2xlU2V0KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSb2xlU2V0KHJvbGVTZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJvbGVTZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChyb2xlU2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2xlU2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihyb2xlU2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGVTZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHJvbGVTZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU46IHsKLQkJCURvbWFpbiBkb21haW4gPSAoRG9tYWluKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEb21haW4oZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KGRvbWFpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGRvbWFpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGRvbWFpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGRvbWFpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRvbWFpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRTogewotCQkJV29ya1Byb2R1Y3RUeXBlIHdvcmtQcm9kdWN0VHlwZSA9IChXb3JrUHJvZHVjdFR5cGUpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0VHlwZSh3b3JrUHJvZHVjdFR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudCh3b3JrUHJvZHVjdFR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkc6IHsKLQkJCURpc2NpcGxpbmVHcm91cGluZyBkaXNjaXBsaW5lR3JvdXBpbmcgPSAoRGlzY2lwbGluZUdyb3VwaW5nKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEaXNjaXBsaW5lR3JvdXBpbmcoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MOiB7Ci0JCQlUb29sIHRvb2wgPSAoVG9vbCkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVG9vbCh0b29sKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KHRvb2wpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh0b29sKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRvb2wpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0b29sKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh0b29sKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRvb2wpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHRvb2wpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkc6IHsKLQkJCVJvbGVTZXRHcm91cGluZyByb2xlU2V0R3JvdXBpbmcgPSAoUm9sZVNldEdyb3VwaW5nKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSb2xlU2V0R3JvdXBpbmcocm9sZVNldEdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQocm9sZVNldEdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUlk6IHsKLQkJCUN1c3RvbUNhdGVnb3J5IGN1c3RvbUNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDdXN0b21DYXRlZ29yeShjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGN1c3RvbUNhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTOiB7Ci0JCQlEZWxpdmVyeVByb2Nlc3MgZGVsaXZlcnlQcm9jZXNzID0gKERlbGl2ZXJ5UHJvY2VzcykgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGVsaXZlcnlQcm9jZXNzKGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3MoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQWN0aXZpdHkoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtEZWZpbml0aW9uKGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTUzogewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2Nlc3MgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQcm9jZXNzKHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VBY3Rpdml0eShwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0RlZmluaXRpb24ocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ0FQQUJJTElUWV9QQVRURVJOOiB7Ci0JCQlDYXBhYmlsaXR5UGF0dGVybiBjYXBhYmlsaXR5UGF0dGVybiA9IChDYXBhYmlsaXR5UGF0dGVybikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ2FwYWJpbGl0eVBhdHRlcm4oY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzKGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQWN0aXZpdHkoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtEZWZpbml0aW9uKGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFOiB7Ci0JCQlQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSA9IChQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQWN0aXZpdHkocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtEZWZpbml0aW9uKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0FETUFQOiB7Ci0JCQlSb2FkbWFwIHJvYWRtYXAgPSAoUm9hZG1hcCkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUm9hZG1hcChyb2FkbWFwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3VpZGFuY2Uocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJvYWRtYXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChyb2FkbWFwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2FkbWFwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihyb2FkbWFwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvYWRtYXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHJvYWRtYXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVDogewotCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByb2Nlc3NDb21wb25lbnQocHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NQYWNrYWdlKHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RQYWNrYWdlKHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlKHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVzcGFjZShwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFOiB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwcm9jZXNzUGFja2FnZSA9IChQcm9jZXNzUGFja2FnZSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJvY2Vzc1BhY2thZ2UocHJvY2Vzc1BhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RQYWNrYWdlKHByb2Nlc3NQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2UocHJvY2Vzc1BhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc1BhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lc3BhY2UocHJvY2Vzc1BhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc1BhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRTogewotCQkJUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlID0gKFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUjogewotCQkJUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IgcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IgPSAoUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpcHRvcihwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTjogewotCQkJTWV0aG9kUGx1Z2luIG1ldGhvZFBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1ldGhvZFBsdWdpbihtZXRob2RQbHVnaW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KG1ldGhvZFBsdWdpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2UobWV0aG9kUGx1Z2luKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RQbHVnaW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lc3BhY2UobWV0aG9kUGx1Z2luKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZFBsdWdpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RQbHVnaW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZFBsdWdpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UOiB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmFyaWFiaWxpdHlFbGVtZW50ID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHZhcmlhYmlsaXR5RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodmFyaWFiaWxpdHlFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHZhcmlhYmlsaXR5RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh2YXJpYWJpbGl0eUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHZhcmlhYmlsaXR5RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVDogewotCQkJTWV0aG9kVW5pdCBtZXRob2RVbml0ID0gKE1ldGhvZFVuaXQpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQobWV0aG9kVW5pdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWV0aG9kVW5pdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RVbml0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZFVuaXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZFVuaXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT046IHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlndXJhdGlvbiA9IChNZXRob2RDb25maWd1cmF0aW9uKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXRob2RDb25maWd1cmF0aW9uKG1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KG1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfRkFNSUxZOiB7Ci0JCQlQcm9jZXNzRmFtaWx5IHByb2Nlc3NGYW1pbHkgPSAoUHJvY2Vzc0ZhbWlseSkgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJvY2Vzc0ZhbWlseShwcm9jZXNzRmFtaWx5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kQ29uZmlndXJhdGlvbihwcm9jZXNzRmFtaWx5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChwcm9jZXNzRmFtaWx5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzRmFtaWx5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NGYW1pbHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc0ZhbWlseSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc0ZhbWlseSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWTogewotCQkJTWV0aG9kTGlicmFyeSBtZXRob2RMaWJyYXJ5ID0gKE1ldGhvZExpYnJhcnkpIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1ldGhvZExpYnJhcnkobWV0aG9kTGlicmFyeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQobWV0aG9kTGlicmFyeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2UobWV0aG9kTGlicmFyeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWV0aG9kTGlicmFyeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVzcGFjZShtZXRob2RMaWJyYXJ5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZExpYnJhcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kTGlicmFyeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kTGlicmFyeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2xhc3NpZmllcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DbGFzc2lmaWVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDbGFzc2lmaWVyKENsYXNzaWZpZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVR5cGUoVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRWxlbWVudChFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TmFtZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VOYW1lZEVsZW1lbnQoTmFtZWRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoUGFja2FnZWFibGVFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQYWNrYWdlKG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVzcGFjZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lc3BhY2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU5hbWVzcGFjZShOYW1lc3BhY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWV0aG9kRWxlbWVudChNZXRob2RFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uc3RyYWludDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb25zdHJhaW50KENvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWV0aG9kRWxlbWVudFByb3BlcnR5KE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRlbnRFbGVtZW50KENvbnRlbnRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoRGVzY3JpYmFibGVFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb250ZW50RGVzY3JpcHRpb24oQ29udGVudERlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZWN0aW9uKFNlY3Rpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJvbGUoUm9sZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtQcm9kdWN0KFdvcmtQcm9kdWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUYXNrKFRhc2sgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIERlZmluaXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrRGVmaW5pdGlvbihXb3JrRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0ZXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RlcDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU3RlcChTdGVwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3VpZGFuY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3VpZGFuY2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUd1aWRhbmNlKEd1aWRhbmNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJ0aWZhY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJ0aWZhY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFydGlmYWN0KEFydGlmYWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcmFibGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcmFibGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURlbGl2ZXJhYmxlKERlbGl2ZXJhYmxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRjb21lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRjb21lKE91dGNvbWUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWV0aG9kUGFja2FnZShNZXRob2RQYWNrYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29udGVudFBhY2thZ2UoQ29udGVudFBhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXJ0aWZhY3REZXNjcmlwdGlvbihBcnRpZmFjdERlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdGlvbihXb3JrUHJvZHVjdERlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUm9sZURlc2NyaXB0aW9uKFJvbGVEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVGFza0Rlc2NyaXB0aW9uKFRhc2tEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VHdWlkYW5jZURlc2NyaXB0aW9uKEd1aWRhbmNlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHJhY3RpY2VEZXNjcmlwdGlvbihQcmFjdGljZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9pbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9pbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVBvaW50KFBvaW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlhZ3JhbSBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpYWdyYW0gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGlhZ3JhbUVsZW1lbnQoRGlhZ3JhbUVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaWFncmFtIExpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlhZ3JhbSBMaW5rPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEaWFncmFtTGluayhEaWFncmFtTGluayBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoIENvbm5lY3RvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HcmFwaCBDb25uZWN0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUdyYXBoQ29ubmVjdG9yKEdyYXBoQ29ubmVjdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU2VtYW50aWNNb2RlbEJyaWRnZShTZW1hbnRpY01vZGVsQnJpZGdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGltZW5zaW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpbWVuc2lvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGltZW5zaW9uKERpbWVuc2lvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlZmVyZW5jZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJlZmVyZW5jZShSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHJvcGVydHkoUHJvcGVydHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HcmFwaCBFZGdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoIEVkZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUdyYXBoRWRnZShHcmFwaEVkZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURpYWdyYW0oRGlhZ3JhbSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGggTm9kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlR3JhcGhOb2RlKEdyYXBoTm9kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNpbXBsZSBTZW1hbnRpYyBNb2RlbCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNpbXBsZSBTZW1hbnRpYyBNb2RlbCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgKLQkJCVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VU1BIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VVTUFTZW1hbnRpY01vZGVsQnJpZGdlKFVNQVNlbWFudGljTW9kZWxCcmlkZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UoQ29yZVNlbWFudGljTW9kZWxCcmlkZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MZWFmIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGVhZiBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VMZWFmRWxlbWVudChMZWFmRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRleHQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXh0IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRleHRFbGVtZW50KFRleHRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW1hZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW1hZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUltYWdlKEltYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGhpYyBQcmltaXRpdmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGhpYyBQcmltaXRpdmU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUdyYXBoaWNQcmltaXRpdmUoR3JhcGhpY1ByaW1pdGl2ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvbHlsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvbHlsaW5lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQb2x5bGluZShQb2x5bGluZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsbGlwc2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWxsaXBzZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRWxsaXBzZShFbGxpcHNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFjdGl2aXR5KEFjdGl2aXR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChXb3JrQnJlYWtkb3duRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VCcmVha2Rvd25FbGVtZW50KEJyZWFrZG93bkVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NaWxlc3RvbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNaWxlc3RvbmUoTWlsZXN0b25lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SXRlcmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkl0ZXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSXRlcmF0aW9uKEl0ZXJhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBoYXNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBoYXNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQaGFzZShQaGFzZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlYW0gUHJvZmlsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRlYW1Qcm9maWxlKFRlYW1Qcm9maWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUm9sZURlc2NyaXB0b3IoUm9sZURlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIE9yZGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgT3JkZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtPcmRlcihXb3JrT3JkZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzRWxlbWVudChQcm9jZXNzRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUGxhbm5pbmdEYXRhKFBsYW5uaW5nRGF0YSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRvcihEZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVGFza0Rlc2NyaXB0b3IoVGFza0Rlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdG9yKFdvcmtQcm9kdWN0RGVzY3JpcHRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wb3NpdGVSb2xlKENvbXBvc2l0ZVJvbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKAotCQkJQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24oQWN0aXZpdHlEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oCi0JCQlEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHJvY2Vzc0Rlc2NyaXB0aW9uKFByb2Nlc3NEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRvckRlc2NyaXB0aW9uKERlc2NyaXB0b3JEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbmNlcHQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29uY2VwdChDb25jZXB0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoZWNrbGlzdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ2hlY2tsaXN0KENoZWNrbGlzdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXhhbXBsZShFeGFtcGxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlR3VpZGVsaW5lKEd1aWRlbGluZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXBvcnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJlcG9ydChSZXBvcnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZW1wbGF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZW1wbGF0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVGVtcGxhdGUoVGVtcGxhdGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVN1cHBvcnRpbmdNYXRlcmlhbChTdXBwb3J0aW5nTWF0ZXJpYWwgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVG9vbE1lbnRvcihUb29sTWVudG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2hpdGVwYXBlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXaGl0ZXBhcGVyKFdoaXRlcGFwZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUZXJtRGVmaW5pdGlvbihUZXJtRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByYWN0aWNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByYWN0aWNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQcmFjdGljZShQcmFjdGljZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZXVzYWJsZUFzc2V0KFJldXNhYmxlQXNzZXQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdGF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdGF0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU3RhdGUoU3RhdGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WZXJ0ZXg8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmVydGV4PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VWZXJ0ZXgoVmVydGV4IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVnaW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlZ2lvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUmVnaW9uKFJlZ2lvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0YXRlIE1hY2hpbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RhdGUgTWFjaGluZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU3RhdGVNYWNoaW5lKFN0YXRlTWFjaGluZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRyYW5zaXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VHJhbnNpdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVHJhbnNpdGlvbihUcmFuc2l0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHNldWRvIFN0YXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBzZXVkbyBTdGF0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHNldWRvU3RhdGUoUHNldWRvU3RhdGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2NpcGxpbmU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURpc2NpcGxpbmUoRGlzY2lwbGluZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29udGVudENhdGVnb3J5KENvbnRlbnRDYXRlZ29yeSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSb2xlU2V0KFJvbGVTZXQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Eb21haW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG9tYWluPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEb21haW4oRG9tYWluIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtQcm9kdWN0VHlwZShXb3JrUHJvZHVjdFR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURpc2NpcGxpbmVHcm91cGluZyhEaXNjaXBsaW5lR3JvdXBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ub29sPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRvb2w8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRvb2woVG9vbCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSb2xlU2V0R3JvdXBpbmcoUm9sZVNldEdyb3VwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ3VzdG9tQ2F0ZWdvcnkoQ3VzdG9tQ2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURlbGl2ZXJ5UHJvY2VzcyhEZWxpdmVyeVByb2Nlc3Mgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3M8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ2FwYWJpbGl0eVBhdHRlcm4oQ2FwYWJpbGl0eVBhdHRlcm4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9hZG1hcDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2FkbWFwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSb2FkbWFwKFJvYWRtYXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHJvY2Vzc0NvbXBvbmVudChQcm9jZXNzQ29tcG9uZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHJvY2Vzc1BhY2thZ2UoUHJvY2Vzc1BhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKAotCQkJUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFBsdWdpbihNZXRob2RQbHVnaW4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WYXJpYWJpbGl0eSBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlZhcmlhYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVZhcmlhYmlsaXR5RWxlbWVudChWYXJpYWJpbGl0eUVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgVW5pdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgVW5pdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWV0aG9kVW5pdChNZXRob2RVbml0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9jZXNzRmFtaWx5KFByb2Nlc3NGYW1pbHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9VbWFTd2l0Y2gKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI3NDVjZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbDsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50c0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBhY2Nlc3NpbmcgYW5kIHVwZGF0aW5nIHRoZSBVTUEgbW9kZWwgb2JqZWN0cy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVW1hVXRpbCB7Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyB0aGUgZmVhdHVyZSB2YWx1ZXMgb2YgYW4gb2xkIG1ldGhvZCBlbGVtZW50IHdpdGggdGhlCi0JICogY29ycmVzcG9uZGluZyBmZWF0dXJlIHZhbHVlcyBvZiBhIG5ldyBtZXRob2QgZWxlbWVudC4KLQkgKiA8cD4KLQkgKiBOb3RlOiBBbGwgZmVhdHVyZXMgYXJlIHVwZGF0ZWQgZXhjZXB0IGZvciB0aGUgR1VJRCBmZWF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBvbGRFbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgb2xkIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIG5ld0VsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgbWV0aG9kIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVwbGFjZShNZXRob2RFbGVtZW50IG9sZEVsZW1lbnQsCi0JCQlNZXRob2RFbGVtZW50IG5ld0VsZW1lbnQpIHsKLQkJTGlzdCBmZWF0dXJlcyA9IG9sZEVsZW1lbnQuZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBmZWF0dXJlcy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJaWYgKGZlYXR1cmUgIT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCkpIHsKLQkJCQkJLy8gZG9uJ3QgcmVwbGFjZSBHVUlECi0JCQkJCU9iamVjdCBuZXdWYWx1ZSA9IG5ld0VsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJCQkJb2xkRWxlbWVudC5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbW9kZWwgb2JqZWN0IGhhcyBhIGRpcmVjdCByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBtb2RlbCBvYmplY3QKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgbW9kZWwgb2JqZWN0IGlzIGNvbnRhaW5lZCBieQotCSAqICAgICAgICAgYSByZXNvdXJjZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNEaXJlY3RSZXNvdXJjZShFT2JqZWN0IGUpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlLmVSZXNvdXJjZSgpOwotCQlyZXR1cm4gKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5jb250YWlucyhlKSk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgYWxsIHJlc291cmNlcyBvd25lZCBieSB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldFJlc291cmNlcyhFT2JqZWN0IGUpIHsKLQkJSGFzaFNldDxSZXNvdXJjZT4gcmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCWdldFJlc291cmNlcyhlLCByZXNvdXJjZXMpOwotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0UmVzb3VyY2VzKEVPYmplY3QgZSwgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzKSB7Ci0JCWlmIChVbWFVdGlsLmhhc0RpcmVjdFJlc291cmNlKGUpKSB7Ci0JCQlyZXNvdXJjZXMuYWRkKGUuZVJlc291cmNlKCkpOwotCQl9IGVsc2UgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZS5lQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlnZXRSZXNvdXJjZXMoKEVPYmplY3QpIGl0ZXIubmV4dCgpLCByZXNvdXJjZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIHNwZWNpZmljIHR5cGUgb2YgYWRhcHRlciBhc3NvY2lhdGVkIHdpdGggYSBub3RpZmllci4KLQkgKiAKLQkgKiBAcGFyYW0gZU9iagotCSAqICAgICAgICAgICAgYSBub3RpZmllcgotCSAqIEBwYXJhbSBjbHMKLQkgKiAgICAgICAgICAgIHRoZSBhZGFwdGVyIGNsYXNzCi0JICogQHJldHVybiBhbiA8Y29kZT5BZGFwdGVyPGNvZGU+IG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEFkYXB0ZXIoRU9iamVjdCBlT2JqLCBDbGFzcyBjbHMpIHsKLQkJZm9yIChJdGVyYXRvciBhZGFwdGVycyA9IGVPYmouZUFkYXB0ZXJzKCkuaXRlcmF0b3IoKTsgYWRhcHRlcnMKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGFkYXB0ZXJzLm5leHQoKTsKLQkJCWlmIChjbHMuaXNJbnN0YW5jZShhZGFwdGVyKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1ldGhvZCBwYWNrYWdlIHdpdGggYSBzcGVjaWZpYyBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RQYWNrYWdlcwotCSAqICAgICAgICAgICAgYSBsaXN0IG9mIG1ldGhvZCBwYWNrYWdlcwotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG1ldGhvZCBwYWNrYWdlIG5hbWUKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIHBhY2thZ2Ugd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGFja2FnZSBmaW5kTWV0aG9kUGFja2FnZShMaXN0IG1ldGhvZFBhY2thZ2VzLAotCQkJU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IG1ldGhvZFBhY2thZ2VzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlPYmplY3Qgb2JqID0gbWV0aG9kUGFja2FnZXMuZ2V0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQlNZXRob2RQYWNrYWdlIHBrZyA9IChNZXRob2RQYWNrYWdlKSBvYmo7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKHBrZy5nZXROYW1lKCkpKSB7Ci0JCQkJCXJldHVybiBwa2c7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1ldGhvZCBwYWNrYWdlIHdpdGggYSBzcGVjaWZpYyBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RQbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBsdWctaW4KLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYXJyYXkgb2YgbWV0aG9kIGVsZW1lbnQgcGF0aCBmcmFnbWVudHMKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIHBhY2thZ2Ugd2l0aCB0aGUgbWF0Y2hpbmcgcGF0aCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGFja2FnZSBmaW5kTWV0aG9kUGFja2FnZShNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luLAotCQkJU3RyaW5nW10gcGF0aCkgewotCQlNZXRob2RQYWNrYWdlIHBrZyA9IG51bGw7Ci0JCUxpc3QgbGlzdCA9IG1ldGhvZFBsdWdpbi5nZXRNZXRob2RQYWNrYWdlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKLQkJCXBrZyA9IGZpbmRNZXRob2RQYWNrYWdlKGxpc3QsIHBhdGhbaV0pOwotCQkJaWYgKHBrZyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlsaXN0ID0gcGtnLmdldENoaWxkUGFja2FnZXMoKTsKLQkJfQotCQlyZXR1cm4gcGtnOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHBhcmVudCBhY3Rpdml0eSBvZiBhIGJyZWFrZG93biBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgcGFyZW50IGFjdGl2aXR5IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBnZXRQYXJlbnRBY3Rpdml0eShCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJcmV0dXJuIGUuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IGFjdGl2aXR5IG9mIGEgd29yayBvcmRlci4KLQkgKiAKLQkgKiBAcGFyYW0gd29ya09yZGVyCi0JICogICAgICAgICAgICBhIHdvcmsgb3JkZXIKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgYWN0aXZpdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2aXR5IGdldE93bmluZ0FjdGl2aXR5KFdvcmtPcmRlciB3b3JrT3JkZXIpIHsKLQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSB3b3JrT3JkZXIuZUNvbnRhaW5lcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJldHVybiAoQWN0aXZpdHkpIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGVudCBwYWNrYWdlIHdpdGggYSBzcGVjaWZpYyBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RQYWNrYWdlcwotCSAqICAgICAgICAgICAgYSBsaXN0IG9mIG1ldGhvZCBwYWNrYWdlcwotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIGNvbnRlbnQgcGFja2FnZSBuYW1lCi0JICogQHJldHVybiBhIGNvbnRlbnQgcGFja2FnZSB3aXRoIHRoZSBtYXRoY2luZyBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBDb250ZW50UGFja2FnZSBmaW5kQ29udGVudFBhY2thZ2UoTGlzdCBtZXRob2RQYWNrYWdlcywKLQkJCVN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSBtZXRob2RQYWNrYWdlcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJT2JqZWN0IG9iaiA9IG1ldGhvZFBhY2thZ2VzLmdldChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCUNvbnRlbnRQYWNrYWdlIHBrZyA9IChDb250ZW50UGFja2FnZSkgb2JqOwotCQkJCWlmIChuYW1lLmVxdWFscyhwa2cuZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm4gcGtnOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHBhY2thZ2Ugd2l0aCBhIHNwZWNpZmljIHBhdGguCi0JICogCi0JICogQHBhcmFtIG1ldGhvZFBsdWdpbgotCSAqICAgICAgICAgICAgYSBtZXRob2QgcGx1Zy1pbgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhbiBhcnJheSBvZiBtZXRob2QgZWxlbWVudCBwYXRoIGZyYWdtZW50cwotCSAqIEByZXR1cm4gYSBjb250ZW50IHBhY2thZ2Ugd2l0aCB0aGUgbWF0Y2hpbmcgcGF0aCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29udGVudFBhY2thZ2UgZmluZENvbnRlbnRQYWNrYWdlKE1ldGhvZFBsdWdpbiBtZXRob2RQbHVnaW4sCi0JCQlTdHJpbmdbXSBwYXRoKSB7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IG51bGw7Ci0JCUxpc3QgbGlzdCA9IG1ldGhvZFBsdWdpbi5nZXRNZXRob2RQYWNrYWdlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKLQkJCXBrZyA9IGZpbmRDb250ZW50UGFja2FnZShsaXN0LCBwYXRoW2ldKTsKLQkJCWlmIChwa2cgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJbGlzdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCX0KLQkJcmV0dXJuIHBrZzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgbWV0aG9kIHBsdWctaW4gb2YgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBNZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBtZXRob2QgcGx1Zy1pbiBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGx1Z2luIGdldE1ldGhvZFBsdWdpbihFT2JqZWN0IGVsZW1lbnQpIHsKLQkJZm9yIChFT2JqZWN0IG9iaiA9IGVsZW1lbnQ7IG9iaiAhPSBudWxsOyBvYmogPSBvYmouZUNvbnRhaW5lcigpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIChNZXRob2RQbHVnaW4pIG9iajsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgbWV0aG9kIGxpYnJhcnkgb2YgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBtZXRob2QgbGlicmFyeSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kTGlicmFyeSBnZXRNZXRob2RMaWJyYXJ5KEVPYmplY3QgZWxlbWVudCkgewotCQlmb3IgKEVPYmplY3Qgb2JqID0gZWxlbWVudDsgb2JqICE9IG51bGw7IG9iaiA9IG9iai5lQ29udGFpbmVyKCkpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJcmV0dXJuIChNZXRob2RMaWJyYXJ5KSBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRU9iamVjdCBnZXRUb3BDb250YWluZXIoRU9iamVjdCBlbGVtZW50KSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gbnVsbDsKLQkJZm9yIChFT2JqZWN0IG9iaiA9IGVsZW1lbnQuZUNvbnRhaW5lcigpOyBvYmogIT0gbnVsbDsgb2JqID0gb2JqLmVDb250YWluZXIoKSkgewotCQkJY29udGFpbmVyID0gb2JqOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7CQkKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgY29udGVudCBwYWNrYWdlIG9mIGEgY29udGVudCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIGNvbnRlbnQgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBjb250ZW50IHBhY2thZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnRlbnRQYWNrYWdlIGdldENvbnRlbnRQYWNrYWdlKEVPYmplY3QgZWxlbWVudCkgewotCQlmb3IgKEVPYmplY3Qgb2JqID0gZWxlbWVudDsgb2JqICE9IG51bGw7IG9iaiA9IG9iai5lQ29udGFpbmVyKCkpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCXJldHVybiAoQ29udGVudFBhY2thZ2UpIG9iajsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgcHJvY2VzcyBwYWNrYWdlIG9mIGEgcHJvY2VzcyBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIFByb2Nlc3MgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBwcm9jZXNzIHBhY2thZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb2Nlc3NQYWNrYWdlIGdldFByb2Nlc3NQYWNrYWdlKEVPYmplY3QgZWxlbWVudCkgewotCQlmb3IgKEVPYmplY3Qgb2JqID0gZWxlbWVudDsgb2JqICE9IG51bGw7IG9iaiA9IG9iai5lQ29udGFpbmVyKCkpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCXJldHVybiAoUHJvY2Vzc1BhY2thZ2UpIG9iajsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgZGlhZ3JhbSBvZiBhIGRpYWdyYW0gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBkaWFncmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgZGlhZ3JhbSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbSBnZXREaWFncmFtKEVPYmplY3QgZWxlbWVudCkgewotCQlmb3IgKEVPYmplY3Qgb2JqID0gZWxlbWVudDsgb2JqICE9IG51bGw7IG9iaiA9IG9iai5lQ29udGFpbmVyKCkpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJcmV0dXJuIChEaWFncmFtKSBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBtZXRob2QgZWxlbWVudCBpcyBjb250YWluZWQgYnkgYSBzcGVjaWZpYyBjb250ZW50Ci0JICogcGFja2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBjb250ZW50UGFja2FnZQotCSAqICAgICAgICAgICAgYSBjb250ZW50IHBhY2thZ2UKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgZWxlbWVudCBpcyBjb250YWluZWQgYnkgdGhlCi0JICogICAgICAgICBjb250ZW50IHBhY2thZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250YWluZWRCeUNvbnRlbnRQYWNrYWdlKEVPYmplY3QgZWxlbWVudCwKLQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQYWNrYWdlKSB7Ci0JCXJldHVybiBpc0NvbnRhaW5lZEJ5KGVsZW1lbnQsIGNvbnRlbnRQYWNrYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1vZGVsIG9iamVjdCBpcyBjb250YWluZWQgYnkgYSBzcGVjaWZpYyBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIGVPYmoKLQkgKiAgICAgICAgICAgIGEgbW9kZWwgb2JqZWN0Ci0JICogQHBhcmFtIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgYSBjb250YWluZXIKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtb2RlbCBvYmplY3QgaXMgY29udGFpbmVkIGJ5IHRoZQotCSAqICAgICAgICAgY29udGFpbmVyCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udGFpbmVkQnkoRU9iamVjdCBlT2JqLCBPYmplY3QgY29udGFpbmVyKSB7Ci0JCWlmIChlT2JqID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKEVPYmplY3Qgb2JqID0gZU9iai5lQ29udGFpbmVyKCk7IG9iaiAhPSBudWxsOyBvYmogPSBvYmoKLQkJCQkuZUNvbnRhaW5lcigpKSB7Ci0JCQlpZiAob2JqID09IGNvbnRhaW5lcikgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgYW5kIHJldHVybnMgYSB1bmlxdWUgSUQuCi0JICogCi0JICogQHJldHVybiBhIHVuaXF1ZSBJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlR1VJRCgpIHsKLQkJcmV0dXJuIEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIG5hbWUgb2YgYSBnaXZlbiBtZXRob2QKLQkgKiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBhIHN1aXRhYmxlIGNvbnRlbnQgZGVzY3JpcHRpb24gbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbk5hbWUoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBlLmdldE5hbWUoKSArICcsJyArIGUuZ2V0R3VpZCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRBbGxTdXBlcnMoTGlzdCBzdXBlcnMsIFZhcmlhYmlsaXR5RWxlbWVudCBlLAotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUpIHsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKGJhc2UgIT0gbnVsbCAmJiBlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IHR5cGUKLQkJCQkmJiAhc3VwZXJzLmNvbnRhaW5zKGJhc2UpKSB7Ci0JCQlzdXBlcnMuYWRkKGJhc2UpOwotCQkJZ2V0QWxsU3VwZXJzKHN1cGVycywgYmFzZSwgdHlwZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0QWxsU3VwZXJzQm90aChMaXN0IHN1cGVycywgVmFyaWFiaWxpdHlFbGVtZW50IGUsCi0JCQlWYXJpYWJpbGl0eVR5cGUgdHlwZTEsIFZhcmlhYmlsaXR5VHlwZSB0eXBlMikgewotCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlpZiAoYmFzZSAhPSBudWxsCi0JCQkJJiYgKGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gdHlwZTEgfHwgZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSB0eXBlMikKLQkJCQkmJiAhc3VwZXJzLmNvbnRhaW5zKGJhc2UpKSB7Ci0JCQlzdXBlcnMuYWRkKGJhc2UpOwotCQkJZ2V0QWxsU3VwZXJzQm90aChzdXBlcnMsIGJhc2UsIHR5cGUxLCB0eXBlMik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjbGFzcyBvZiBhIGNvbnRlbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgY29udGVudCBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgY29udGVudCBlbGVtZW50IGNsYXNzCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzcyBnZXRDbGFzc09mQ29udGVudEVsZW1lbnQoQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQpIHsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9sZSkKLQkJCXJldHVybiBSb2xlLmNsYXNzOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrKQotCQkJcmV0dXJuIFRhc2suY2xhc3M7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KQotCQkJcmV0dXJuIFdvcmtQcm9kdWN0LmNsYXNzOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkYW5jZSkKLQkJCXJldHVybiBHdWlkYW5jZS5jbGFzczsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRG9tYWluKQotCQkJcmV0dXJuIERvbWFpbi5jbGFzczsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRGlzY2lwbGluZSkKLQkJCXJldHVybiBEaXNjaXBsaW5lLmNsYXNzOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpCi0JCQlyZXR1cm4gRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlU2V0KQotCQkJcmV0dXJuIFJvbGVTZXQuY2xhc3M7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykKLQkJCXJldHVybiBSb2xlU2V0R3JvdXBpbmcuY2xhc3M7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkKLQkJCXJldHVybiBXb3JrUHJvZHVjdFR5cGUuY2xhc3M7Ci0JCXJldHVybiBPYmplY3QuY2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRlZmF1bHQgd29yayBvcmRlciBmb3IgdHdvIHdvcmsgYnJlYWtkb3duIGVsZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQKLQkgKiBAcGFyYW0gcHJlZGVjZXNzb3IKLQkgKiAgICAgICAgICAgIHRoZSBwcmVkZWNlc3NvciB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCB3b3JrIG9yZGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXIgY3JlYXRlRGVmYXVsdFdvcmtPcmRlcihXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjLAotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCkgewotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFdvcmtPcmRlcihzdWNjLCBwcmVkLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXIgY3JlYXRlRGVmYXVsdFdvcmtPcmRlcihXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjLAotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCwgYm9vbGVhbiBsaW5rKSB7Ci0JCVdvcmtPcmRlciB3byA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtPcmRlcigpOwotCQl3by5zZXRQcmVkKHByZWQpOwotCQl3by5zZXRMaW5rVHlwZShXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0hfTElURVJBTCk7Ci0JCWlmKGxpbmspIHsKLQkJCXN1Y2MuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5hZGQod28pOwotCQl9Ci0JCXJldHVybiB3bzsKLQl9CQotCi0JLyoqCi0JICogTG9jYXRlcyB0aGUgd29yayBvcmRlciBhc3NvY2lhdGVkIHdpdGggdHdvIHdvcmsgYnJlYWtkb3duIGVsZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQKLQkgKiBAcGFyYW0gcHJlZGVjZXNzb3IKLQkgKiAgICAgICAgICAgIHRoZSBwcmVkZWNlc3NvciB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHJldHVybiBhIHdvcmsgb3JkZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtPcmRlciBmaW5kV29ya09yZGVyKFdvcmtCcmVha2Rvd25FbGVtZW50IGUsCi0JCQlPYmplY3QgcHJlZGVjZXNzb3IpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJV29ya09yZGVyIHdvcmtPcmRlciA9IChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpOwotCQkJaWYgKHdvcmtPcmRlci5nZXRQcmVkKCkgPT0gcHJlZGVjZXNzb3IpCi0JCQkJcmV0dXJuIHdvcmtPcmRlcjsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIHdvcmsgb3JkZXIgYXNzb2NpYXRlZCB3aXRoIHR3byB3b3JrIGJyZWFrZG93biBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHBhcmFtIHByZWRlY2Vzc29yCi0JICogICAgICAgICAgICB0aGUgcHJlZGVjZXNzb3Igd29yayBicmVha2Rvd24gZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHJlbW92ZWQgd29yayBvcmRlciBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyIHJlbW92ZVdvcmtPcmRlcihXb3JrQnJlYWtkb3duRWxlbWVudCBlLAotCQkJT2JqZWN0IHByZWRlY2Vzc29yKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJV29ya09yZGVyIG9yZGVyID0gKFdvcmtPcmRlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9yZGVyLmdldFByZWQoKSA9PSBwcmVkZWNlc3NvcikgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCXJldHVybiBvcmRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgcHJvY2VzcyBjb21wb25lbnQgb2YgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudCwgdHlwaWNhbGx5IGEgcHJvY2VzcyBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgcGFyZW50IHByb2Nlc3MgY29tcG9uZW50IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzQ29tcG9uZW50IGdldFByb2Nlc3NDb21wb25lbnQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyOwotCQlmb3IgKGNvbnRhaW5lciA9IGU7IGNvbnRhaW5lciAhPSBudWxsCi0JCQkJJiYgIShjb250YWluZXIgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KTsgY29udGFpbmVyID0gY29udGFpbmVyCi0JCQkJLmVDb250YWluZXIoKSkKLQkJCTsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzQ29tcG9uZW50KSBjb250YWluZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHBhcmVudCBtZXRob2QgdW5pdCBvZiBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgcGFyZW50IG1ldGhvZCB1bml0IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RVbml0IGdldE1ldGhvZFVuaXQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyOwotCQlmb3IgKGNvbnRhaW5lciA9IGU7IGNvbnRhaW5lciAhPSBudWxsCi0JCQkJJiYgIShjb250YWluZXIgaW5zdGFuY2VvZiBNZXRob2RVbml0KTsgY29udGFpbmVyID0gY29udGFpbmVyCi0JCQkJLmVDb250YWluZXIoKSkKLQkJCTsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKChNZXRob2RVbml0KSBjb250YWluZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBtZXRob2QgcGx1Zy1pbiBoYXMgbWV0aG9kIGVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlCi0JICogZWxlbWVudHMgaW4gYSBiYXNlIHBsdWctaW4uCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBpcyBhIGV4cGVuc2l2ZSBjYWxsIHRvIG1ha2UgZm9yIGEgbGFyZ2UgbWV0aG9kIHBsdWctaW4uCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgYSBtZXRob2QgcGx1Zy1pbgotCSAqIEBwYXJhbSBiYXNlCi0JICogICAgICAgICAgICBhIGJhc2UgbWV0aG9kIHBsdWctaW4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgbWV0aG9kIHBsdWctaW4gY29udGFpbgotCSAqICAgICAgICAgbWV0aG9kIGVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlIGVsZW1lbnRzIGluIGEgYmFzZSBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNSZWZlcmVuY2UoTWV0aG9kUGx1Z2luIHBsdWdpbiwgTWV0aG9kUGx1Z2luIGJhc2UpIHsKLQkJZm9yIChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IgZmVhdHVyZUl0ZXJhdG9yID0gKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcikgcGx1Z2luCi0JCQkJLmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBmZWF0dXJlSXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCByZWYgPSAoRU9iamVjdCkgZmVhdHVyZUl0ZXJhdG9yLm5leHQoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gZmVhdHVyZUl0ZXJhdG9yLmZlYXR1cmUoKTsKLQotCQkJaWYgKGYgIT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCkKLQkJCQkJJiYgVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ocmVmKSA9PSBiYXNlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwbHVnaW4uZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCi0JCQkvLyBpZ25vcmUgUHJvY2Vzc0VsZW1lbnQgYi9jIGl0IGNhbiByZWZlcmVuY2VzIGFueXRoaW5nCi0JCQkvLwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IHJlZiA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKGdldE1ldGhvZFBsdWdpbihyZWYpID09IGJhc2UpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFsbCBlbGVtZW50IHJlZmVyZW5jZXMgaW4gYSBtZXRob2QgcGx1Zy1pbiB0aGF0IHBvaW50IHRvIGVsZW1lbnRzCi0JICogaW4gYSBiYXNlIHBsdWctaW4uCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBpcyBhIGV4cGVuc2l2ZSBjYWxsIHRvIG1ha2UgZm9yIGEgbGFyZ2UgbWV0aG9kIHBsdWctaW4uCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgYSBtZXRob2QgcGx1Zy1pbgotCSAqIEBwYXJhbSBiYXNlCi0JICogICAgICAgICAgICB0aGUgYmFzZSBtZXRob2QgcGx1Zy1pbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZVJlZmVyZW5jZXMoTWV0aG9kUGx1Z2luIHBsdWdpbiwKLQkJCU1ldGhvZFBsdWdpbiBiYXNlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBsdWdpbi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0KLQkJCS8vIGlnbm9yZSBQcm9jZXNzRWxlbWVudCBiL2MgaXQgY2FuIHJlZmVyZW5jZXMgYW55dGhpbmcKLQkJCS8vCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50KSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWZvciAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yIGZlYXR1cmVJdGVyYXRvciA9IChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IpIGVsZW1lbnQKLQkJCQkJLmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBmZWF0dXJlSXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgcmVmID0gKEVPYmplY3QpIGZlYXR1cmVJdGVyYXRvci5uZXh0KCk7Ci0KLQkJCQlpZiAoZ2V0TWV0aG9kUGx1Z2luKHJlZikgPT0gYmFzZSkgewotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IGZlYXR1cmVJdGVyYXRvci5mZWF0dXJlKCk7Ci0JCQkJCWlmIChmLmlzTWFueSgpKSB7Ci0JCQkJCQkoKENvbGxlY3Rpb24pIGVsZW1lbnQuZUdldChmKSkucmVtb3ZlKHJlZik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllbGVtZW50LmVTZXQoZiwgbnVsbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShJU3RhdHVzIHN0YXR1cykgewotCQlTdHJpbmcgbXNnID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJaWYgKHN0YXR1cy5pc011bHRpU3RhdHVzKCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKG1zZyk7Ci0JCQlJU3RhdHVzIHN0YXR1c2VzW10gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHVzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlzdHJCdWYuYXBwZW5kKCdcbicpLmFwcGVuZChzdGF0dXNlc1tpXS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQkJbXNnID0gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JCX0KLQkJaWYgKG1zZyAhPSBudWxsICYmIG1zZy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJbXNnID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gbXNnOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyBhIEdVSUQgdXNpbmcgYSBiYXNlIEdVSUQuCi0JICogCi0JICogQHBhcmFtIGJhc2VHVUlECi0JICogICAgICAgICAgICBhIGJhc2UgR1VJRAotCSAqIEByZXR1cm4gYSB1bmlxdWUgSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZW5lcmF0ZUdVSUQoU3RyaW5nIGJhc2VHVUlEKSB7Ci0JCXJldHVybiBHVUlELmdlbmVyYXRlKGJhc2VHVUlEKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBHVUlEIHsKLQkJcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZURpZ2VzdCBtZDUgPSBudWxsOwotCi0JCXByaXZhdGUgc3RhdGljIE1lc3NhZ2VEaWdlc3QgZ2V0TUQ1KCkgewotCQkJaWYgKG1kNSA9PSBudWxsKSB7Ci0JCQkJc3luY2hyb25pemVkIChHVUlELmNsYXNzKSB7Ci0JCQkJCWlmIChtZDUgPT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQltZDUgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG1kNTsKLQkJfQotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdlbmVyYXRlKFN0cmluZyBiYXNlR1VJRCkgewotCQkJTWVzc2FnZURpZ2VzdCBtZDUgPSBnZXRNRDUoKTsKLQkJCW1kNS51cGRhdGUoYmFzZUdVSUQuZ2V0Qnl0ZXMoKSk7Ci0JCQlieXRlW10gaGFzaCA9IG1kNS5kaWdlc3QoKTsKLQkJCWNoYXJbXSBidWZmZXIgPSBuZXcgY2hhclsyM107Ci0JCQlidWZmZXJbMF0gPSAnLSc7Ci0KLQkJCS8vIERvIGEgYmFzZSA2NCBjb252ZXJzaW9uIGJ5IHR1cm5pbmcgZXZlcnkgMyBieXRlcyBpbnRvIDQgYmFzZSA2NAotCQkJLy8gY2hhcmFjdGVycwotCQkJLy8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7Ci0JCQkJYnVmZmVyWzQgKiBpICsgMV0gPSBCQVNFNjRfRElHSVRTWyhoYXNoW2kgKiAzXSA+PiAyKSAmIDB4M0ZdOwotCQkJCWJ1ZmZlcls0ICogaSArIDJdID0gQkFTRTY0X0RJR0lUU1soKGhhc2hbaSAqIDNdIDw8IDQpICYgMHgzMCkKLQkJCQkJCXwgKChoYXNoW2kgKiAzICsgMV0gPj4gNCkgJiAweEYpXTsKLQkJCQlidWZmZXJbNCAqIGkgKyAzXSA9IEJBU0U2NF9ESUdJVFNbKChoYXNoW2kgKiAzICsgMV0gPDwgMikgJiAweDNDKQotCQkJCQkJfCAoKGhhc2hbaSAqIDMgKyAyXSA+PiA2KSAmIDB4MyldOwotCQkJCWJ1ZmZlcls0ICogaSArIDRdID0gQkFTRTY0X0RJR0lUU1toYXNoW2kgKiAzICsgMl0gJiAweDNGXTsKLQkJCX0KLQotCQkJLy8gSGFuZGxlIHRoZSBsYXN0IGJ5dGUgYXQgdGhlIGVuZC4KLQkJCS8vCi0JCQlidWZmZXJbMjFdID0gQkFTRTY0X0RJR0lUU1soaGFzaFsxNV0gPj4gMikgJiAweDNGXTsKLQkJCWJ1ZmZlclsyMl0gPSBCQVNFNjRfRElHSVRTWyhoYXNoWzE1XSA8PCA0KSAmIDB4MzBdOwotCi0JCQlyZXR1cm4gbmV3IFN0cmluZyhidWZmZXIpOwotCQl9Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEJBU0U2NF9ESUdJVFMgPSB7ICdBJywgJ0InLCAnQycsICdEJywgJ0UnLAotCQkJCSdGJywgJ0cnLCAnSCcsICdJJywgJ0onLCAnSycsICdMJywgJ00nLCAnTicsICdPJywgJ1AnLCAnUScsCi0JCQkJJ1InLCAnUycsICdUJywgJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJywgJ2EnLCAnYicsICdjJywKLQkJCQknZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicsICdrJywgJ2wnLCAnbScsICduJywgJ28nLAotCQkJCSdwJywgJ3EnLCAncicsICdzJywgJ3QnLCAndScsICd2JywgJ3cnLCAneCcsICd5JywgJ3onLCAnMCcsCi0JCQkJJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJy0nLCAnXycgfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4Mzc3NmViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyB0aGUgVU1BIG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYjE2NGI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0icnVudGltZSIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWMzMmE5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnhtbC51bWE8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWQwYmRlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMjQgMTM6MTg6MjUgUERUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy8vc3JjL21vZGVsL1VNQS54c2Q9VVRGOApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgyOTE3MTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYSwKLSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLAotIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWwKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkbwotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiMTRiZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyA8Y29weXJpZ2h0PgotIyA8L2NvcHlyaWdodD4KLSMKLSMgJElkOiBidWlsZC5wcm9wZXJ0aWVzLHYgMS42IDIwMDYvMDYvMjQgMDA6MDU6MTcganhpIEV4cCAkCi0KLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOTJiNjcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIDxjb3B5cmlnaHQ+Ci0jIDwvY29weXJpZ2h0PgotIwotIyAkSWQ6IHBsdWdpbi5wcm9wZXJ0aWVzLHYgMS40IDIwMDcvMDMvMDYgMjE6MDQ6NDQgc2thbm5vb3JpIEV4cCAkCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLXBsdWdpbk5hbWUgPSBFUEYgWG1sIFVNQSBNb2RlbAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWVkM2I1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08IS0tCi0gPGNvcHlyaWdodD4KLSA8L2NvcHlyaWdodD4KLQotICRJZDogcGx1Z2luLnhtbCx2IDEuNCAyMDA2LzA2LzIzIDAwOjAxOjI3IGp4aSBFeHAgJAotLS0+Ci0KLTxwbHVnaW4+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICA8cGFja2FnZSAKLSAgICAgICB1cmkgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIiAKLSAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlIiAvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZXh0ZW5zaW9uX3BhcnNlciI+Ci0gICAgPHBhcnNlciAKLSAgICAgICB0eXBlPSJ1bWEiIAotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsLlVtYVJlc291cmNlRmFjdG9yeUltcGwiIC8+Ci0gIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA2MDgzMDA3MzYueHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA2MDgzMDA3MzYueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlN2JjNDUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL0VQRl9TY2hlbWFfMjAwNjA4MzAwNzM2LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzOTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gRVBGIFVNQSBYTUwgRGF0YSBJbnRlcmNoYW5nZSBTY2hlbWEgLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6dW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMiPgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJXb3JrT3JkZXJUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnQgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50IGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50IGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF2YWlsYWJsZSBpbiBVTUEgYW5kIGlzIHVzZWQgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIFdvcmsgT3JkZXIncyBsaW5rVHlwZSBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6TkNOYW1lIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmlzaFRvU3RhcnQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmlzaFRvRmluaXNoIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdGFydFRvU3RhcnQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0YXJ0VG9GaW5pc2giLz4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOQ05hbWUiPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmEiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbnRyaWJ1dGVzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJleHRlbmRzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZXBsYWNlcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibG9jYWxDb250cmlidXRpb24iLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxvY2FsUmVwbGFjZW1lbnQiLz4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTmFtZWRFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2FibGUgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk5hbWVkRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgRGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlBhY2thZ2VhYmxlRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPd25lZFJ1bGUiIHR5cGU9InVtYTpDb25zdHJhaW50Ij4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgcGFja2FnaW5nIHJ1bGVzIGZvciB0aGlzIE1ldGhvZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdXBwcmVzc2VkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgImV4dGVuZHMiIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uLCB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9yZGVyaW5nR3VpZGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VXNlZCBmb3IgQ0FTRSB0b29sIHJlYWxpemF0aW9ucyBvZiB0aGlzIG1vZGVsIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgbGF5b3V0IGFuZCBvcmRlcmluZyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYW5kIGl0cyBwYXJ0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb25zdHJhaW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGEgTWV0aG9kIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3RvcmVzIHRoZSBtYWluIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2VjdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJTZWN0aW9uIiB0eXBlPSJ1bWE6U2VjdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVkZWNlc3NvciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNlY3Rpb25OYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVkZWNlc3NvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RVbml0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb3B5cmlnaHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImF1dGhvcnMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1haW5EZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3RvcmVzIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJLZXlDb25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTZWN0aW9uIiB0eXBlPSJ1bWE6U2VjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRhbmNlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBHdWlkYW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByYWN0aWNlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcmFjdGljZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxJbmZvIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFwcGxpY2F0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJhY2tncm91bmQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkVsYWJvcmF0aW9uIG9uIHRoZSBiYWNrZ3JvdW5kIGFuZCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnMgYW5kIHdoZXJlIHRoZSBzb2x1dGlvbiBkZXNjcmliZWQgYnkgdGhpcyBQcmFjdGljZSB3aWxsIGZpdCBpbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkdvYWxzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkxldmVsc09mQWRvcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9ibGVtIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRoZSBQcmFjdGljZSBhZGRyZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFdvcmsgUHJvZHVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkltcGFjdE9mTm90SGF2aW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlYXNvbnNGb3JOb3ROZWVkaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleHRlcm5hbElkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBcnRpZmFjdERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQXJ0aWZhY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQnJpZWZPdXRsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVwcmVzZW50YXRpb25PcHRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EaXNjdXNzZXMgZGlmZmVyZW50IHBvc3NpYmxlIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9ucyBmb3IgdGhlIGFydGlmYWN0LiBGb3IgZXhhbXBsZSBhIGRlc2lnbiBtb2RlbCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBVTUwgbW9kZWwgb3IgYW4gaW5mb3JtYWwgYmxvY2sgZGlhZ3JhbSBvciBieSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9ubHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcmFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdpbmdHdWlkYW5jZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFJvbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBc3NpZ25tZW50QXBwcm9hY2hlcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2tpbGxzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTeW5vbnltcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+TGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGFza0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFsdGVybmF0aXZlcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuCi1UaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZXNlbnRhdGlvbiIgdHlwZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAicnVwX2FyY2hpdGVjdHVyZV9kb2N1bWVudCIgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgImoyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQiIHdoZXJlYXMgdGhlIGV4dGVybmFsIHByZXNlbnRhdGlvbiB3b3VsZCBhbHdheXMgYmUgIkFyY2hpdGVjdHVyZSBEb2N1bWVudCIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2hhcGVpY29uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJub2RlaWNvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LgotQ29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmliYWJsZUVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNoZWNrbGlzdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbmNlcHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeGFtcGxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR3VpZGVsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV1c2FibGVBc3NldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldoaXRlcGFwZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHdWlkYW5jZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5HdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uY2VwdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNoZWNrbGlzdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXhhbXBsZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGVsaW5lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVzdGltYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHByb3ZpZGVzIHNpemluZyBtZWFzdXJlcywgb3Igc3RhbmRhcmRzIGZvciBzaXppbmcgdGhlIHdvcmsgZWZmb3J0IGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIGEgcGFydGljdWxhciBwaWVjZSBvZiB3b3JrIGFuZCBpbnN0cnVjdGlvbnMgZm9yIHRoZWlyIHN1Y2Nlc3NmdWwgdXNlLiBJdCBtYXkgYmUgY29tcHJpc2VkIG9mIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbnMgYW5kIGVzdGltYXRpb24gbWV0cmljcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25NZXRyaWMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFc3RpbWF0aW5nTWV0cmljIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IGRlc2NyaWJlcyBhIG1ldHJpYyBvciBtZWFzdXJlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGVsZW1lbnQgYW5kIHdoaWNoIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSB3b3JrIGVmZm9ydCBhcyB3ZWxsIGFzIGEgcmFuZ2Ugb2YgcG90ZW50aWFsIGxhYm9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcXVhbGlmaWVzIHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvYWRtYXAiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHdoaWNoIGlzIG9ubHkgcmVsYXRlZCB0byBBY3RpdmF0ZXMgYW5kIHRoZXJlZm9yZSBoYXMgYmVlbiBhZGRlZCBieSB0aGlzIHBhY2thZ2UgdG8gdGhlIGxpc3Qgb2YgR3VpZGFuY2UgVHlwZXMgcmF0aGVyIHRoYW4gbGlzdGVkIGluIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlLiAgQSBSb2FkbWFwIHJlcHJlc2VudHMgYSBsaW5lYXIgd2Fsa3Rocm91Z2ggb2YgYW4gQWN0aXZpdHksIHR5cGljYWxseSBhIFByb2Nlc3MuCi1BbiBpbnN0YW5jZSBvZiBhIFJvYWRtYXAgcmVwcmVzZW50cyBpbXBvcnRhbnQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEFjdGl2aXR5IG9yIFByb2Nlc3MgaXQgaXMgcmVsYXRlZCB0by4gIE9mdGVuIGEgY29tcGxleCBBY3Rpdml0eSBzdWNoIGFzIGEgUHJvY2VzcyBjYW4gYmUgbXVjaCBlYXNpZXIgdW5kZXJzdG9vZCBieSBwcm92aWRpbmcgYSB3YWxrdGhyb3VnaCB3aXRoIGEgbGluZWFyIHRocmVhZCBvZiBhIHR5cGljYWwgaW5zdGFudGlhdGlvbiBvZiB0aGlzIEFjdGl2aXR5LiAgSW4gYWRkaXRpb24gdG8gbWFraW5nIHRoZSBwcm9jZXNzIHByYWN0aXRpb25lciB1bmRlcnN0YW5kIGhvdyB3b3JrIGluIHRoZSBwcm9jZXNzIGlzIGJlaW5nIHBlcmZvcm1lZCwgYSBSb2FkbWFwIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IEFjdGl2aXRpZXMgYW5kIFRhc2tzIHJlbGF0ZSB0byBlYWNoIG90aGVyIG92ZXIgdGltZS4gIFJvYWRtYXBzIGFyZSBhbHNvIHVzZWQgdG8gc2hvdyBob3cgc3BlY2lmaWMgYXNwZWN0cyBhcmUgZGlzdHJpYnV0ZWQgb3ZlciBhIHdob2xlIHByb2Nlc3MgcHJvdmlkaW5nIGEga2luZCBvZiBmaWx0ZXIgb24gdGhlIHByb2Nlc3MgZm9yIHRoaXMgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJlcG9ydCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlbXBsYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGZvciBhIHdvcmsgcHJvZHVjdCBhIHByZS1kZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsIGFuZC9vciBoZWFkaW5ncywgYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBob3cgdGhlIHNlY3Rpb25zIGFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkgYmUgcHJvdmlkZWQgZm9yIGRvY3VtZW50cywgYnV0IGFsc28gZm9yIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUb29sTWVudG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yayBhIFdvcmsgUHJvZHVjdCBlaXRoZXIgaW4gdGhlIGNvbnRleHQgb2Ygb3IgaW5kZXBlbmRlbnQgZnJvbSBhIFRhc2sgb3IgQWN0aXZpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldoaXRlcGFwZXIiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbmNlcHQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZXJtRGVmaW5pdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBkZWZpbmVzIGNvbmNlcHRzIGFuZCBhcmUgdXNlZCB0byBidWlsZCB1cCB0aGUgR2xvc3NhcnkuIFRlcm1EZWZpbml0aW9ucyBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gQ29udGVudEVsZW1lbnRzLCBidXQgdGhlaXIgcmVsYXRpb25zaGlwIGlzIGJlaW5nIGRlcml2ZWQgd2hlbiB0aGUgVGVybSBpcyB1c2VkIGluIHRoZSBDb250ZW50RWxlbWVudHMgZGVzY3JpcHRpb24gdGV4dC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJhY3RpY2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHByb3ZlbiB3YXkgb3Igc3RyYXRlZ3kgb2YgZG9pbmcgd29yayB0byBhY2hpZXZlIGEgZ29hbCB0aGF0IGhhcyBhIHBvc2l0aXZlIGltcGFjdCBvbiB3b3JrIHByb2R1Y3Qgb3IgcHJvY2VzcyBxdWFsaXR5LiAgUHJhY3RpY2VzIGFyZSBkZWZpbmVkIG9ydGhvZ29uYWwgdG8gbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLiAgVGhleSBjb3VsZCBzdW1tYXJpemUgYXNwZWN0cyB0aGF0IGltcGFjdCBtYW55IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1ldGhvZCBvciBzcGVjaWZpYyBwcm9jZXNzZXMuICBFeGFtcGxlcyBmb3IgcHJhY3RpY2VzIHdvdWxkIGJlICJNYW5hZ2UgUmlza3MiLCAiQ29udGludW91c2x5IHZlcmlmeSBxdWFsaXR5IiwgIkFyY2hpdGVjdHVyZS1jZW50cmljIGFuZCBjb21wb25lbnQtYmFzZWQgZGV2ZWxvcG1lbnQiLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBY3Rpdml0eVJlZmVyZW5jZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGVudFJlZmVyZW5jZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViUHJhY3RpY2UiIHR5cGU9InVtYTpQcmFjdGljZSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZXVzYWJsZUFzc2V0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcKLWhvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLgotQSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXBvcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUb29sTWVudG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFydGlmYWN0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuCi1BcnRpZmFjdHMgYXJlIHRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBUYXNrcy4gIEl0IG1heSBzZXJ2ZSBhcyBhIGJhc2lzIGZvciBkZWZpbmluZyByZXVzYWJsZSBhc3NldHMuICBSb2xlcyB1c2UgQXJ0aWZhY3RzIHRvIHBlcmZvcm0gVGFza3MgYW5kIHByb2R1Y2UgQXJ0aWZhY3RzIGluIHRoZSBjb3Vyc2Ugb2YgcGVyZm9ybWluZyBUYXNrcy4gIEFydGlmYWN0cyBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIFJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5IHRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQgaW4gdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25lIHJvbGUgbWlnaHQgIm93biIgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhaW5lZEFydGlmYWN0IiB0eXBlPSJ1bWE6QXJ0aWZhY3QiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcmFibGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3QiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVsaXZlcmVkV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3V0Y29tZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgUHJvZHVjdCB0aGF0IGRlc2NyaWJlcyBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYSByZXN1bHQgb3Igc3RhdGUuIE91dGNvbWVzIG1heSBhbHNvIGJlIHVzZWQgdG8gZGVzY3JpYmUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBub3QgZm9ybWFsbHkgZGVmaW5lZC4gIEEga2V5IGRpZmZlcmVudGlhdG9yIGZvciBvdXRjb21lcyBhZ2FpbnN0IGFydGlmYWN0cyBpcyB0aGF0IG91dGNvbWVzIGFyZSBub3QgY2FuZGlkYXRlcyBmb3IgaGFydmVzdGluZyBhcyByZXVzYWJsZSBhc3NldHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBDb250ZW50IEVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgCi1BIFJvbGUgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcyBvZiBhbiBpbmRpdmlkdWFsIG9yIGEgc2V0IG9mIGluZGl2aWR1YWxzLiAgUm9sZXMgYXJlIG5vdCBpbmRpdmlkdWFscyBvciByZXNvdXJjZXMuICBJbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhlIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiB3aWxsIHdlYXIgZGlmZmVyZW50IGhhdHMsIG9yIHBlcmZvcm0gZGlmZmVyZW50IHJvbGVzLiBUaGUgbWFwcGluZyBmcm9tIGluZGl2aWR1YWwgdG8gcm9sZSwgcGVyZm9ybWVkIGJ5IHRoZSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhbmQgc3RhZmZpbmcgZm9yIGEgcHJvamVjdCwgYWxsb3dzIGRpZmZlcmVudCBpbmRpdmlkdWFscyB0byBhY3QgYXMgc2V2ZXJhbCBkaWZmZXJlbnQgcm9sZXMsIGFuZCBmb3IgYSByb2xlIHRvIGJlIHBsYXllZCBieSBzZXZlcmFsIGluZGl2aWR1YWxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2libGVGb3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGFzayI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLgotQSBUYXNrIGRlc2NyaWJlcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gc3BlY2lmaWMgUm9sZXMuICBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzLiAgSXQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuIEEgVGFzayBpcyB1c2VkIGFzIGFuIGVsZW1lbnQgb2YgZGVmaW5pbmcgYSBwcm9jZXNzLiBUYXNrcyBhcmUgZnVydGhlciB1c2VkIGZvciBwbGFubmluZyBhbmQgdHJhY2tpbmcgcHJvZ3Jlc3M7IHRoZXJlZm9yZSwgaWYgdGhleSBhcmUgZGVmaW5lZCB0b28gZmluZS1ncmFpbmVkLCB0aGV5IHdpbGwgYmUgbmVnbGVjdGVkLCBhbmQgaWYgdGhleSBhcmUgdG9vIGxhcmdlLCBwcm9ncmVzcyB3b3VsZCBoYXZlIHRvIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIFRhc2sncyBwYXJ0cyAoZS5nLiBTdGVwcywgd2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4gCi1BIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiAKLUZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAiRGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCIgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gZGV2ZWxvcCBhIGNvbXBsZXRlIHVzZSBjYXNlIG1vZGVsLiBUaGlzIHdvdWxkIGNvbXByaXNlIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBhbmQgbmFtaW5nIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLCB0aGUgd3JpdGluZyBvZiBhIGJyaWVmIGRlc2NyaXB0aW9uLCB0aGUgbW9kZWxpbmcgb2YgdXNlIGNhc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGluIGRpYWdyYW1zLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYSBiYXNpYyBmbG93LCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWx0ZXJuYXRpdmVzIGZsb3dzLCBwZXJmb3JtaW5nIG9mIHdhbGt0aHJvdWdocyB3b3Jrc2hvcHMgYW5kIHJldmlld3MsIGV0Yy4gIEFsbCBvZiB0aGVzZSBwYXJ0cyBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBnb2FsIG9mIGRldmVsb3BpbmcgdGhlIHVzZSBjYXNlIG1vZGVsLCBidXQgdGhlIHBhcnRzIHdpbGwgYmUgcGVyZm9ybWVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSBpbiBhIHByb2Nlc3MuICBJZGVudGlmaWNhdGlvbiwgbmFtaW5nLCBhbmQgYnJpZWYgZGVzY3JpcHRpb25zIHdvdWxkIGJlIHBlcmZvcm1lZCBlYXJseSBpbiBhIHR5cGljYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyB2ZXJzdXMgdGhlIHdyaXRpbmcgb2YgZGV0YWlsZWQgYWx0ZXJuYXRpdmUgZmxvd3Mgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkIG11Y2ggbGF0ZXIuICBBbGwgdGhlc2UgcGFydHMgb3Igc3RlcHMgd2l0aGluIHRoZSBzYW1lIFRhc2sgZGVmaW5lIHRoZSAibWV0aG9kIiBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFuZGF0b3J5SW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPdXRwdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wdGlvbmFsSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRvb2xNZW50b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtEZWZpbml0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuCi1Xb3JrIERlZmluaXRpb25zIHJlcHJlc2VudCBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgZG9pbmcgd29yay4gIFRoZXNlIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGFyZSBub3QgYm91bmQgdG8gb25lIHNwZWNpZmljIGNsYXNzaWZpZXIsIGJ1dCByZXByZXNlbnQgYW4gYXJiaXRyYXJ5IGRlZmluaXRpb24gb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZCBieSBhIHNwZWNpZmljIFJvbGUgKGUuZy4gYSBSb2xlIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBUYXNrIG9yIFN0ZXBzIG9mIGEgVGFzayksIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjbG9zZSBjb2xsYWJvcmF0aW9uIChtYW55IFJvbGVzIGFsbCB3b3JraW5nIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIGludGVyZGlzY2lwbGluYXJ5IFRhc2spLCBvciBjb21wbGV4IHdvcmsgdGhhdCBpcyBwZXJmb3JtZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIChlLmcuIGEgcHJvY2VzcyBkZWZpbmluZyBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgZm9yIG9yZ2FuaXppbmcgbGFyZ2VyIGNvbXBvc2l0ZSB1bml0cyBvZiB3b3JrIHBlcmZvcm1lZCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY29sbGFib3JhdGlvbikuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlY29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3Rjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRDYXRlZ29yeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyBnZW5lcmFsaXppbmcgY29udGVudCBjYXRlZ29yeSB0eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGlzY2lwbGluZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNhdGVnb3JpemF0aW9uIG9mIHdvcmsgKGkuZS4gVGFza3MgZm9yIE1ldGhvZCBDb250ZW50KSwgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4KLUEgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUYXNrIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJEaXNjaXBsaW5lIiB0eXBlPSJ1bWE6RGlzY2lwbGluZSIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlV29ya2Zsb3ciIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGlzY2lwbGluZUdyb3VwaW5nIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgIlNvZnR3YXJlIERpc2NpcGxpbmVzIiB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICJSZXF1aXJlbWVudHMgTWFuYWdlbWVudCIgb3IgIlRlc3RpbmciOyAiSVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCIgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAiSVQgT3BlcmF0aW9uYWwgU2VydmljZXMiLCAiSVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyIsIG9yICJJVCBFbmFibGluZyBTZXJ2aWNlcyIuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGlzY2lwbGluZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEb21haW4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuCi1Eb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJkb21haW4iIHR5cGU9InVtYTpEb21haW4iLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZVNldCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Pcmdhbml6ZXMgUm9sZXMgaW50byBjYXRlZ29yaWVzLiAgSXQgaXMgdXNlZCB0byBncm91cCByb2xlcyB0b2dldGhlciB0aGF0IGhhdmUgY2VydGFpbiBjb21tb25hbGl0aWVzLiAgRm9yIGV4YW1wbGUsIHRoZSAiQW5hbHlzdHMiIFJvbGUgU2V0IGNvdWxkIGdyb3VwIHRoZSAiQnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0IiwgIlN5c3RlbSBBbmFseXN0IiwgYXMgd2VsbCBhcyAiUmVxdWlyZW1lbnRzIFNwZWNpZmllciIgcm9sZXMuICBBbGwgb2YgdGhlc2Ugd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBhcmUgcmVxdWlyZWQgYXMgZGlzdGluY3Qgcm9sZXMgZm9yIGEgbWV0aG9kIChlLmcuIHRoZSBtZXRob2QgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgaXMgYmFzZWQgb24pLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZVNldEdyb3VwaW5nIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlU2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRvb2wiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUb29sTWVudG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0VHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgIkNsYXNzIERpYWdyYW0iLCB3aGljaCBjYXRlZ29yaXplcyB0aGUgQXJ0aWZhY3RzIEFuYWx5c2lzIE1vZGVsLCBEZXNpZ24gTW9kZWwsIFVzZXIgRXhwZXJpZW5jZSBNb2RlbCwgb3IgIlNwZWNpZmljYXRpb24iLCB3aGljaCBjYXRlZ29yaXplcyByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbnMgdGhhdCBkZWZpbmUgYSBzeXN0ZW0gd2l0aCBhIHdlbGwtZGVmaW5lZCBzeXN0ZW0gYm91bmRhcnksIHN1Y2ggYXMgdXNlIGNhc2Ugb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbi4gIEEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGNhbiBiZSBjYXRlZ29yaXplZCBhcyBhIFNwZWNpZmljYXRpb24gYXMgd2VsbCBhcyBEaWFncmFtIFdvcmsgUHJvZHVjdCBUeXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkN1c3RvbUNhdGVnb3J5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAiVGVzdGluZyIgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDYXRlZ29yaXplZEVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YkNhdGVnb3J5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZFBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV1c2VkUGFja2FnZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGFja2FnZSIgdHlwZT0idW1hOk1ldGhvZFBhY2thZ2UiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2xvYmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMgYW5kIENvbnRlbnQgRWxlbWVudHMsIG9ubHkuICBFeGFtcGxlcyBmb3IgQ29udGVudCBFbGVtZW50IGFyZSBBcnRpZmFjdHMsIFRhc2tzLCBSb2xlcywgZXRjLiAgQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFBhY2thZ2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGVudEVsZW1lbnQiIHR5cGU9InVtYTpDb250ZW50RWxlbWVudCIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IG9ubHkgY29udGFpbnMgQ29udGVudCBDYXRlZ29yeSBFbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFBhY2thZ2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGVudENhdGVnb3J5IiB0eXBlPSJ1bWE6Q29udGVudENhdGVnb3J5Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuCi1Qcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmliYWJsZUVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQbGFubmluZ0RhdGEiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBQcm9jZXNzIEVsZW1lbnQgdGhhdCBhZGRzIHBsYW5uaW5nIGRhdGEgdG8gQnJlYWtkb3duIEVsZW1lbnRzIHdoZW4gaXQgaXMgdXNlZCBmb3IgYSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlLiAgRm9yIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0aGlzIGNsYXNzIGNhbiBlaXRoZXIgbm90IGJlIGluc3RhbnRpYXRlZCBvciBwb3B1bGF0ZWQgd2l0aCBkZWZhdWx0IGRhdGEuCi1QbGFubmluZyBEYXRhIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuCi0oTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InN0YXJ0RGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmluaXNoRGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZWZhdWx0IGZpbmlzaCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InJhbmsiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCcmVha2Rvd25FbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlc2VudGVkQWZ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlc2VudGVkQmVmb3JlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBsYW5uaW5nRGF0YSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBlckFjdGl2aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gIlNSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzIiB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAiU29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzIiBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAiQ3VzdG9tZXIuQXJjaGl0ZWN0IiB3b3VsZCBkZWZpbmUgYSAiQ3VzdG9tZXIiIHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAiQXJjaGl0ZWN0IiBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzUGxhbm5lZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAiRGV0YWlsIFVzZSBDYXNlIiB3b3VsZCBiZSBwZXJmb3JtZWQgZm9yIGV2ZXJ5IHVzZSBjYXNlIGlkZW50aWZpZWQgZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gb3IgQWN0aXZpdHkuICBHZW5lcmF0aW5nIGEgcGxhbiB3b3VsZCBsaXN0IG9uZSBUYXNrIGluc3RhbmNlIHBlciB1c2UgY2FzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc09wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrT3JkZXIiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgCi1UaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6c2ltcGxlQ29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBnbG9iYWwgdW5pcXVlIGlkIGZvciBhIHdvcmsgb3JkZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGlua1R5cGUiIHR5cGU9InVtYTpXb3JrT3JkZXJUeXBlIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpzaW1wbGVDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlZGVjZXNzb3IiIHR5cGU9InVtYTpXb3JrT3JkZXIiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNSZXBlYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc09uZ29pbmciIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzRXZlbnREcml2ZW4iIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4KLTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1pbGVzdG9uZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBkZXNjcmliZXMgYSBzaWduaWZpY2FudCBldmVudCBpbiBhIGRldmVsb3BtZW50IHByb2plY3QsIHN1Y2ggYXMgYSBtYWpvciBkZWNpc2lvbiwgY29tcGxldGlvbiBvZiBhIGRlbGl2ZXJhYmxlLCBvciBtZWV0aW5nIG9mIGEgbWFqb3IgZGVwZW5kZW5jeSAobGlrZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZSkuICBCZWNhdXNlLCBNaWxlc3RvbmUgaXMgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byBib3RoIHRoZSBldmVudCBpdHNlbGYgYW5kIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRoZSBldmVudCBpcyBzY2hlZHVsZWQgdG8gaGFwcGVuLCBpdCBpcyBtb2RlbGVkIGFzIGEgQnJlYWtkb3duIEVsZW1lbnQgKGkuZS4gaXQgYXBwZWFycyBhcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZSkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjdGl2aXR5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4KLUFjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya0JyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiIHR5cGU9InVtYTpCcmVha2Rvd25FbGVtZW50Ii8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2hlY2tsaXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29uY2VwdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4YW1wbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJHdWlkZWxpbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2FkbWFwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV1c2FibGVBc3NldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldoaXRlcGFwZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJJc0VuYWN0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQaGFzZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ1BoYXNlJykgYW5kIGlzUmVwZWF0YWJsZSAoJ0ZhbHNlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi1QaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSXRlcmF0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLUl0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHkiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBCcmVha2Rvd24gRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idXNhZ2VHdWlkYW5jZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBpbmZvcm1hdGlvbiBhbmQgZ3VpZGFuY2Ugb24gdGhlIG1lYW5pbmcgb2YgdGhlIEJvb2xlYW4gZmxhZyB2YWx1ZXMgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB0aGV5IHNob3VsZCBiZSBvdmVycmlkZGVuLiBGb3IgZXhhbXBsZSwgaXQgZGVzY3JpYmVzIHdoeSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgb3B0aW9uYWwgb3IgY29uc2lkZXJhdGlvbnMgZm9yIHJlcGVhdGluZyBpdCBhbmQgZGlmZmVyZW5jZXMgaW4gdGhlIGluZGl2aWR1YWwgb2NjdXJyZW5jZXMgb2YgdGhpcyBCcmVha2Rvd24gRWxlbWVudCBhY3Jvc3MgdGhlIGxpZmVjeWNsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBY3Rpdml0eURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBY3Rpdml0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFsdGVybmF0aXZlcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgdGhpcyBBY3Rpdml0eSBub3QgY292ZXJlZCBieSB0aGUgQWN0aXZpdHkncyBUYXNrcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ikhvd1RvU3RhZmYiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGJhY2tncm91bmQgb24gd2hvIHNob3VsZCBiZSBpbnZvbHZlZCBpbiB0aGlzIGFjdGl2aXR5IHdoYXQgYXJlIHRoZSByZXF1aXJlZCBza2lsbHMsIGV4cGVyaWVuY2UsICBhbmQgcGVyaGFwcyBhdHRpdHVkZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIEFjdGl2aXR5LCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0aXZpdHkgYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhY2hpZXZlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaXB0b3JEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVmaW5lZERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQWN0aXZpdHkgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eURlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2NvcGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNjb3BlIG9mIHRoZSBQcm9jZXNzLCBpLmUuIHdoaWNoIHR5cGVzIG9mIHByb2plY3RzIGRvZXMgaXQgYWRkcmVzcyBhbmQgd2hpY2ggbm90LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVXNhZ2VOb3RlcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleHRlcm5hbElkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBkZWxpdmVyeSBwYXR0ZXJucyBhbmQgbW9kZWxzLiBJdCBpcyB1c2VkIGxpa2UgYSBzeW5vbnltLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgUHJvY2VzcyBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcnkgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlNjYWxlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5DaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSaXNrTGV2ZWwiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW5nVGVjaG5pcXVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvamVjdE1lbWJlckV4cGVydGlzZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUeXBlT2ZDb250cmFjdCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29JJ20gY2hhSSdtIG50cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuCi1EZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFdvcmsgUHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlc3BvbnNpYmxlUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4dGVybmFsSW5wdXRUbyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkltcGFjdGVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbXBhY3RzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFuZGF0b3J5SW5wdXRUbyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wdGlvbmFsSW5wdXRUbyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dEZyb20iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWxpdmVyYWJsZVBhcnRzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gIAotRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLgotRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2libGVGb3IiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrRGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotQSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uCi08L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVGFzayIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJmb3JtZWRQcmltYXJpbHlCeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXNzaXN0ZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4dGVybmFsSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wdGlvbmFsSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPdXRwdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3RlcCIgdHlwZT0idW1hOlNlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29tcG9zaXRlUm9sZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4KLUEgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Um9sZURlc2NyaXB0b3IiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWdncmVnYXRlZFJvbGUiIHR5cGU9InVtYTpSb2xlIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlYW1Qcm9maWxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBncm91cHMgUm9sZSBEZXNjcmlwdG9ycyBvciBSZXNvdXJjZSBEZWZpbml0aW9ucyBkZWZpbmluZyBhIG5lc3RlZCBoaWVyYXJjaHkgb2YgdGVhbXMgYW5kIHRlYW0gbWVtYmVycy4KLVdvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4KLUhlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwZXJUZWFtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJUZWFtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3MiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LgotQ29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHkiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbmNsdWRlc1BhdHRlcm4iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlZmF1bHRDb250ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlZhbGlkQ29udGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJ5UHJvY2VzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4KLUEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2VzcyI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21tdW5pY2F0aW9uc01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFZHVjYXRpb25NYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBQYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgRGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuCi1BIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZToKLS0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuCi0tIFRvIHN1cHBvcnQgZGlyZWN0IGV4ZWN1dGlvbiBpbiBhIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkb2VzIG5vdCB3b3JrIGZvbGxvd2luZyBhIHdlbGwtZGVmaW5lZCBwcm9jZXNzLCBidXQgd29ya3MgYmFzZWQgb24gbG9vc2VseSBjb25uZWN0ZWQgcHJvY2VzcyBmcmFnbWVudHMgb2YgYmVzdCBwcmFjdGljZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIgKGUuZy4gQWdpbGUgRGV2ZWxvcG1lbnQpLgotLSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuCi1BIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3MiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmFzZVByb2Nlc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4KLUEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RQYWNrYWdlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2Nlc3NFbGVtZW50IiB0eXBlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcmZhY2VTcGVjaWZpY2F0aW9uIiB0eXBlPSJ1bWE6VGFza0Rlc2NyaXB0b3IiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVyZmFjZUlPIiB0eXBlPSJ1bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgUGFja2FnZSB0aGF0IGFwcGxpZXMgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gIEEgUHJvY2VzcyBDb21wb25lbnQgcmVhbGl6ZXMgb25lIG9yIG1vcmUgSW50ZXJmYWNlcyB3aGljaCBzcGVjaWZ5IGlucHV0cyBhbmQgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LiBUaGVyZSBtaWdodCBiZSBtYW55IGNvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBzYW1lIGludGVyZmFjZXMsIGJ1dCB1c2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyB0byBhY2hpZXZlIHNpbWlsYXIgb3V0cHV0cyBmb3Igc2ltaWxhciBpbnB1dHMuICBXaGVyZWFzIHRoZSBDb21wb25lbnQgSW50ZXJmYWNlcyByZXByZXNlbnQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIChibGFjayBib3ggZGVzY3JpcHRpb25zIG9mIHRoZSBjb21wb25lbnQpLCBnb29kIGNhbmRpZGF0ZXMgZm9yIGNvbXBvbmVudCByZWFsaXphdGlvbnMgY2FuIGJlIGZvdW5kIGluIENhcGFiaWxpdHkgUGF0dGVybnMgKHdoaXRlIGJveCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb21wb25lbnQpLgotVU1BIHN1cHBvcnRzIHJlcGxhY2VhYmxlIGFuZCByZXVzYWJsZSBQcm9jZXNzIENvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uIENlcnRhaW4gc2l0dWF0aW9ucyBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgbWlnaHQgcmVxdWlyZSB0aGF0IGNvbmNyZXRlIHJlYWxpemF0aW9ucyBvZiBwYXJ0cyBvZiB0aGUgcHJvY2VzcyByZW1haW4gdW5kZWNpZGVkIG9yIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgZXhlY3V0aW5nIHRlYW0gaXRzZWxmIChlLmcuIGluIG91dHNvdXJjaW5nIHNpdHVhdGlvbnMpLiAgVU1BIHByb3ZpZGVzIGEgdW5pcXVlIGNvbXBvbmVudCBjb25jZXB0IGRlZmluaW5nIGludGVyZmFjZXMgZm9yIHdvcmsgcHJvZHVjdCBpbnB1dCBhbmQgb3V0cHV0LCBhbGxvd2luZyB0cmVhdGluZyB0aGUgYWN0dWFsIGRlZmluaXRpb24gb2YgdGhlIHdvcmsgdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0cyBhcyBhICJibGFjayBib3giLiAgQXQgYW55IHBvaW50IGR1cmluZyBhIHByb2plY3QgdGhlIGNvbXBvbmVudCAicmVhbGl6YXRpb24iIGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NQYWNrYWdlIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29weXJpZ2h0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVyZmFjZSIgdHlwZT0idW1hOlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvY2VzcyIgdHlwZT0idW1hOlByb2Nlc3MiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdXRob3JzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RQbHVnaW4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBVbml0IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLU1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VkTWV0aG9kUGx1Z2luIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQYWNrYWdlIiB0eXBlPSJ1bWE6TWV0aG9kUGFja2FnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGx1Z2luIiB0eXBlPSJ1bWE6TWV0aG9kUGx1Z2luIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgVW5pdCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuCi1NZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4KLVNwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCYXNlQ29uZmlndXJhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGx1Z2luU2VsZWN0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQYWNrYWdlU2VsZWN0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWZhdWx0VmlldyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9jZXNzVmlldyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgdHlwZT0idW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kTGlicmFyeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQbHVnaW4iIHR5cGU9InVtYTpNZXRob2RQbHVnaW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIHR5cGU9InVtYTpNZXRob2RDb25maWd1cmF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RMaWJyYXJ5IiB0eXBlPSJ1bWE6TWV0aG9kTGlicmFyeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDYwOTA3MTMzNC54c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDYwOTA3MTMzNC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNjMDlmZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA2MDkwNzEzMzQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQwMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBFUEYgVU1BIFhNTCBEYXRhIEludGVyY2hhbmdlIFNjaGVtYSAtLT4KLTx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp1bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMyI+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IldvcmtPcmRlclR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOQ05hbWUiPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluaXNoVG9TdGFydCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluaXNoVG9GaW5pc2giLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0YXJ0VG9TdGFydCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RhcnRUb0ZpbmlzaCIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5DTmFtZSI+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuYSIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29udHJpYnV0ZXMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImV4dGVuZHMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJlcGxhY2VzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsb2NhbENvbnRyaWJ1dGlvbiIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibG9jYWxSZXBsYWNlbWVudCIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJOYW1lZEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYWNrYWdlYWJsZUVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TmFtZWRFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBEZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UGFja2FnZWFibGVFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik93bmVkUnVsZSIgdHlwZT0idW1hOkNvbnN0cmFpbnQiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBwYWNrYWdpbmcgcnVsZXMgZm9yIHRoaXMgTWV0aG9kIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IGhhcyBhIGdsb2JhbCB1bmlxdWUgaWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InN1cHByZXNzZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPklmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSAiZXh0ZW5kcyIgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24sIHRoZW4gdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgaW5oZXJpdGVkIE1ldGhvZCBFbGVtZW50cyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCwgd2hpY2ggY2FuIGJlIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIG9uIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0aGFuIGFuIGluaGVyaXRlZCBtZXRob2QgZWxlbWVudCB0aGVuIGl0IHdpbGwgbm90IGJlIHJlZ2FyZGVkIGFzIGluaGVyaXRlZCBhdCBhbGwuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JkZXJpbmdHdWlkZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VkIGZvciBDQVNFIHRvb2wgcmVhbGl6YXRpb25zIG9mIHRoaXMgbW9kZWwgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBsYXlvdXQgYW5kIG9yZGVyaW5nIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhbmQgaXRzIHBhcnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnN0cmFpbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdG9yZXMgdGhlIG1haW4gZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTZWN0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlNlY3Rpb24iIHR5cGU9InVtYTpTZWN0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWRlY2Vzc29yIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VjdGlvbk5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWRlY2Vzc29yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZFVuaXQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvcHlyaWdodCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXV0aG9ycyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFpbkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdG9yZXMgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IktleUNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlNlY3Rpb24iIHR5cGU9InVtYTpTZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGFuY2VEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIEd1aWRhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXR0YWNobWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFByYWN0aWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkaXRpb25hbEluZm8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXBwbGljYXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmFja2dyb3VuZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR29hbHMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTGV2ZWxzT2ZBZG9wdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSk8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2JsZW0iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgV29yayBQcm9kdWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW1wYWN0T2ZOb3RIYXZpbmciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgY29uc2VxdWVuY2VzIG9mIG5vdCBwcm9kdWNpbmcgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3JpbmcgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVhc29uc0Zvck5vdE5lZWRpbmciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsSWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFydGlmYWN0RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBcnRpZmFjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCcmllZk91dGxpbmUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXByZXNlbnRhdGlvbk9wdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyYWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeHRlcm5hbERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2luZ0d1aWRhbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUm9sZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFzc2lnbm1lbnRBcHByb2FjaGVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBndWlkYW5jZSBvbiBmb3IgYXNzaWduaW5nIGluZGl2aWR1YWxzIHRvIHRoZSBSb2xlIGluIHRlcm1zIG9mIHdoYXQgb3RoZXIgcm9sZXMgdGhlc2UgaW5kaXZpZHVhbHMgY291bGQgcGVyZm9ybSBhbmQgd2hhdCByZXNwb25zaWJpbGl0eSBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgYXNzaWduZWQgdG8gdGhpcyByb2xlIG1pZ2h0IGhhdmUuICBUaGUgZ3VpZGFuY2UgY2FuIGFsc28gZGVzY3JpYmUgZGlmZmVyZW50IGFzc2lnbm1lbnQgYXBwcm9hY2hlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLCBlLmcuIGZvciBsYXJnZSB2ZXJzdXMgc21hbGwgdGVhbXMgd2hlcmUgaW5kaXZpZHVhbHMgY291bGQgYmUgYWxsb2NhdGVkIHRvIHJvbGVzIGZ1bGwgdGltZSB2ZXJzdXMgc2hhcmluZyByb2xlcyB3aXRoaW4gdGhlIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTa2lsbHMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN5bm9ueW1zIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0cyBzeW5vbnltcywgaS5lLiBvdGhlciBuYW1lcyB0aGUgUm9sZSBtaWdodCBiZSByZWZlcnJlZCBieS4gIFRvb2wgc3VwcG9ydCBmb3IgdGhlIG1ldGEtbW9kZWwgbWlnaHQgc3VwcG9ydCB0aGF0IGEgUm9sZSBuYW1lIGNhbiBiZSBjb25zaXN0ZW50bHkgYmUgcmVwbGFjZWQgd2l0aCBvbmUgb2YgaXRzIHN5bm9ueW1zIHRocm91Z2h0IGEgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWx0ZXJuYXRpdmVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBhY2hpZXZpbmcgdGhpcyBUYXNrJ3MgZGV2ZWxvcG1lbnQgZ29hbHMgdGhhdCB3ZXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBUYXNrJ3MgU3RlcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4KLVRoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlc2VudGF0aW9uIiB0eXBlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgRGVzY3JpYmFibGUgRWxlbWVudCBoYXMgYSBwcmVzZW50YXRpb24gbmFtZSwgd2hpY2ggaXMgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIG5hbWUgKHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbikgbWlnaHQgYmUgc2V0IHRvICJydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50IiB0byBkaWZmZXJlbnRpYXRlIGZyb20gYSAiajJlZV9hcmNoaXRjdHVyZV9kb2N1bWVudCIgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAiQXJjaGl0ZWN0dXJlIERvY3VtZW50Ii48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaGFwZWljb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im5vZGVpY29uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuCi1Db250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaWJhYmxlRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2hlY2tsaXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29uY2VwdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4YW1wbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJHdWlkZWxpbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzYWJsZUFzc2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV2hpdGVwYXBlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRhbmNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb25jZXB0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2hlY2tsaXN0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFeGFtcGxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSB0eXBpY2FsLCBwYXJ0aWFsbHkgY29tcGxldGVkLCBzYW1wbGUgaW5zdGFuY2Ugb2Ygb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBvciBzY2VuYXJpbyBsaWtlIGRlc2NyaXB0aW9ucyBvZiBob3cgVGFzayBtYXkgYmUgcGVyZm9ybWVkLiBFeGFtcGxlcyBjYW4gYmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3RzIGFzIHdlbGwgYXMgVGFza3MgdGhhdCBwcm9kdWNlIHRoZW0gYXMgd2VsbCBhcyBhbnkgb3RoZXIgQ29udGVudCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHdWlkZWxpbmUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgc2l6aW5nIG1lYXN1cmVzLCBvciBzdGFuZGFyZHMgZm9yIHNpemluZyB0aGUgd29yayBlZmZvcnQgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgYSBwYXJ0aWN1bGFyIHBpZWNlIG9mIHdvcmsgYW5kIGluc3RydWN0aW9ucyBmb3IgdGhlaXIgc3VjY2Vzc2Z1bCB1c2UuIEl0IG1heSBiZSBjb21wcmlzZWQgb2YgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9ucyBhbmQgZXN0aW1hdGlvbiBtZXRyaWNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbk1ldHJpYyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVzdGltYXRpbmdNZXRyaWMiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgZGVzY3JpYmVzIGEgbWV0cmljIG9yIG1lYXN1cmUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCBhbmQgd2hpY2ggaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHdvcmsgZWZmb3J0IGFzIHdlbGwgYXMgYSByYW5nZSBvZiBwb3RlbnRpYWwgbGFib3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBxdWFsaWZpZXMgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9hZG1hcCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2Ugd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4KLUFuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmVwb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVtcGxhdGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNhdGNoYWxsIGZvciBvdGhlciB0eXBlcyBvZiBndWlkYW5jZSBub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgQ29udGVudCBFbGVtZW50cywgaS5lLiBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRvb2xNZW50b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSAgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV2hpdGVwYXBlciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29uY2VwdCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlcm1EZWZpbml0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGRlZmluZXMgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGVybURlZmluaXRpb25zIGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmFjdGljZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuICBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuICBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gIEV4YW1wbGVzIGZvciBwcmFjdGljZXMgd291bGQgYmUgIk1hbmFnZSBSaXNrcyIsICJDb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHkiLCAiQXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCIsIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFjdGl2aXR5UmVmZXJlbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50UmVmZXJlbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJQcmFjdGljZSIgdHlwZT0idW1hOlByYWN0aWNlIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJldXNhYmxlQXNzZXQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZwotaG93IHRoZSBhc3NldCBzaG91bGQgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3QiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuCi1BIHdvcmsgcHJvZHVjdCBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IGEgdGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcG9ydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRvb2xNZW50b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQXJ0aWZhY3QiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4KLUFydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAib3duIiBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3QiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFpbmVkQXJ0aWZhY3QiIHR5cGU9InVtYTpBcnRpZmFjdCIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyYWJsZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWxpdmVyZWRXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPdXRjb21lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBQcm9kdWN0IHRoYXQgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAKLUEgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNwb25zaWJsZUZvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uCi1BIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAKLUEgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uIAotRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXZlbG9wIFVzZSBDYXNlIE1vZGVsIiBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICJtZXRob2QiIG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlY29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3Rjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGVyZm9ybWVkQnkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya0RlZmluaXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgTWV0aG9kIEVsZW1lbnQgdGhhdCBnZW5lcmFsaXplcyBhbGwgZGVzY3JpcHRpb25zIG9mIHdvcmsgd2l0aGluIHRoZSBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUuICBUaGlzIHBhY2thZ2UgaW50cm9kdWNlcyB0d28gY29uY3JldGUgdHlwZXMgb2YgV29yayBEZWZpbml0aW9uczogVGFzayBhbmQgU3RlcC4gIFdvcmsgRGVmaW5pdGlvbnMgY2FuIGNvbnRhaW4gc2V0cyBvZiBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbnMgZGVmaW5pbmcgY29uc3RyYWludHMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkIGJlZm9yZSB0aGUgZGVzY3JpYmVkIHdvcmsgY2FuIGJlZ2luIG9yIGJlZm9yZSBpdCBjYW4gYmUgZGVjbGFyZWQgYXMgZmluaXNoZWQuICBOb3RlIHRoYXQgZ2VuZXJhbCBvd25lZFJ1bGVzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFuZCBydWxlcyBmb3IgV29yayBEZWZpbml0aW9ucy4KLVdvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudENhdGVnb3J5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaXNjaXBsaW5lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LgotQSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRhc2siIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YkRpc2NpcGxpbmUiIHR5cGU9InVtYTpEaXNjaXBsaW5lIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VXb3JrZmxvdyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaXNjaXBsaW5lR3JvdXBpbmciPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+VXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAiU29mdHdhcmUgRGlzY2lwbGluZXMiIHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgIlJlcXVpcmVtZW50cyBNYW5hZ2VtZW50IiBvciAiVGVzdGluZyI7ICJJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50IiB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICJJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyIsICJJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzIiwgb3IgIklUIEVuYWJsaW5nIFNlcnZpY2VzIi4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEaXNjaXBsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRvbWFpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4KLURvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YmRvbWFpbiIgdHlwZT0idW1hOkRvbWFpbiIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlU2V0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPk9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICJBbmFseXN0cyIgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICJCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QiLCAiU3lzdGVtIEFuYWx5c3QiLCBhcyB3ZWxsIGFzICJSZXF1aXJlbWVudHMgU3BlY2lmaWVyIiByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlU2V0R3JvdXBpbmciPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Um9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGVTZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVG9vbCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRvb2xNZW50b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAiQ2xhc3MgRGlhZ3JhbSIsIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAiU3BlY2lmaWNhdGlvbiIsIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICJUZXN0aW5nIiBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNhdGVnb3JpemVkRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViQ2F0ZWdvcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kUGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzZWRQYWNrYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQYWNrYWdlIiB0eXBlPSJ1bWE6TWV0aG9kUGFja2FnZSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnbG9iYWwiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudFBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50RWxlbWVudCIgdHlwZT0idW1hOkNvbnRlbnRFbGVtZW50Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgb25seSBjb250YWlucyBDb250ZW50IENhdGVnb3J5IEVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIHR5cGU9InVtYTpDb250ZW50Q2F0ZWdvcnkiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4KLVByb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaWJhYmxlRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBsYW5uaW5nRGF0YSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFByb2Nlc3MgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4KLVBsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4KLShOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RhcnREYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmaW5pc2hEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icmFuayIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVzZW50ZWRBZnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVzZW50ZWRCZWZvcmUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGxhbm5pbmdEYXRhIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cGVyQWN0aXZpdHkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWZpeCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5QcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAiU1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMiIHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICJTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMiIG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICJDdXN0b21lci5BcmNoaXRlY3QiIHdvdWxkIGRlZmluZSBhICJDdXN0b21lciIgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICJBcmNoaXRlY3QiIGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNQbGFubmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuCi08L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5KdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXRhaWwgVXNlIENhc2UiIHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzT3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB0aGF0IHRoZSBCcmVha2Rvd24gRWxlbWVudCBkZXNjcmliZXMgd29yaywgYSB3b3JrIHJlc3VsdCwgb3IgZXZlbiB3b3JrIHJlc291cmNlcywgd2hpY2ggaW5jbHVzaW9uIGlzIG5vdCBtYW5kYXRvcnkgd2hlbiBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGlzIHBsYW5uZWQgYmFzZWQgb24gYSBwcm9jZXNzIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtPcmRlciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50cyBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnRzIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50cyBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuICAKLVRoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpzaW1wbGVDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGdsb2JhbCB1bmlxdWUgaWQgZm9yIGEgd29yayBvcmRlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsaW5rVHlwZSIgdHlwZT0idW1hOldvcmtPcmRlclR5cGUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBhdHRyaWJ1dGUgZXhwcmVzc2VzIHRoZSB0eXBlIG9mIHRoZSBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcCBieSBhc3NpZ25pbmcgYSB2YWx1ZSBmcm9tIHRoZSBXb3JrIE9yZGVyIFR5cGUgZW51bWVyYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVkZWNlc3NvciIgdHlwZT0idW1hOldvcmtPcmRlciIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1JlcGVhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzT25nb2luZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNFdmVudERyaXZlbiIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWlsZXN0b25lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWN0aXZpdHkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBXb3JrIERlZmluaXRpb24gd2hpY2ggc3VwcG9ydHMgdGhlIG5lc3RpbmcgYW5kIGxvZ2ljYWwgZ3JvdXBpbmcgb2YgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudHMgZm9ybWluZyBicmVha2Rvd24gc3RydWN0dXJlcy4gIEFsdGhvdWdoIEFjdGl2aXR5IGlzIGEgY29uY3JldGUgbWV0YS1jbGFzcywgb3RoZXIgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVyaXZlIGZyb20gaXQ7IHN1Y2ggYXMgUGhhc2UsIEl0ZXJhdGlvbiwgRGVsaXZlcnkgUHJvY2Vzcywgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuLgotQWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQnJlYWtkb3duRWxlbWVudCIgdHlwZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaGVja2xpc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb25jZXB0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXhhbXBsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ikd1aWRlbGluZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvYWRtYXAiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzYWJsZUFzc2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV2hpdGVwYXBlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9IklzRW5hY3RhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBoYXNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLVBoYXNlIHJlcHJlc2VudCBhIHNpZ25pZmljYW50IHBlcmlvZCBpbiBhIHByb2plY3QsIGVuZGluZyB3aXRoIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lIG9yIHNldCBvZiBEZWxpdmVyYWJsZXMuICBJdCBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwgYXMgYSBwcmVkZWZpbmVkIHNwZWNpYWwgQWN0aXZpdHksIGJlY2F1c2Ugb2YgaXRzIHNpZ25pZmljYW5jZSBpbiBkZWZpbmluZyBicmVha2Rvd25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHkiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJdGVyYXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotSXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIEJyZWFrZG93biBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1c2FnZUd1aWRhbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGFuIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWx0ZXJuYXRpdmVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSG93VG9TdGFmZiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYmFja2dyb3VuZCBvbiB3aG8gc2hvdWxkIGJlIGludm9sdmVkIGluIHRoaXMgYWN0aXZpdHkgd2hhdCBhcmUgdGhlIHJlcXVpcmVkIHNraWxscywgZXhwZXJpZW5jZSwgIGFuZCBwZXJoYXBzIGF0dGl0dWRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlB1cnBvc2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpcHRvckRlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZpbmVkRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBBY3Rpdml0eSBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTY29wZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJVc2FnZU5vdGVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsSWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGRlbGl2ZXJ5IHBhdHRlcm5zIGFuZCBtb2RlbHMuIEl0IGlzIHVzZWQgbGlrZSBhIHN5bm9ueW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBQcm9jZXNzIERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyeSBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2NhbGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIGNoYXJhY3RlcmlzdGljcyBhYm91dCB0aGUgc2l6ZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvamVjdCBleHByZXNzZWQgaW4gdGVhbSBzaXplLCBtYW4geWVhcnMsIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2plY3RDaGFyYWN0ZXJpc3RpY3MiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3M8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJpc2tMZXZlbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpbmdUZWNobmlxdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgRXN0aW1hdGlvbiBUZWNobmlxdWVzIHByb3ZpZGVkIGZvciB0aGlzIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlR5cGVPZkNvbnRyYWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb0knbSBjaGFJJ20gbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlZmVyZW5jZXMgb25lIGNvbmNyZXRlIENvbnRlbnQgRWxlbWVudC4gIEEgZGVzY3JpcHRvciBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHdpdGhpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uIHRvIGp1c3QgcmVmZXJlbmNpbmcgQ29udGVudCBFbGVtZW50cyBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgQ29udGVudCBFbGVtZW50cyBzdHJ1Y3R1cmFsIHJlbGF0aW9uc2hpcHMgYnkgZGVmaW5pbmcgaXRzIG93biBzZXRzIG9mIGFzc29jaWF0aW9ucy4KLURlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmlwdG9yIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2libGVSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxJbnB1dFRvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW1wYWN0ZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkltcGFjdHMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dFRvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dFRvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3V0cHV0RnJvbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlbGl2ZXJhYmxlUGFydHMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjdGl2aXR5RW50cnlTdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5HaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZURlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgUm9sZSBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgUm9sZSBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmlwdG9yIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNwb25zaWJsZUZvciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRhc2tEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuCi1BIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4KLTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya0JyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUYXNrIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBlcmZvcm1lZFByaW1hcmlseUJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBc3Npc3RlZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1hbmRhdG9yeUlucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdGVwIiB0eXBlPSJ1bWE6U2VjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb21wb3NpdGVSb2xlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLgotQSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpSb2xlRGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZ2dyZWdhdGVkUm9sZSIgdHlwZT0idW1hOlJvbGUiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVhbVByb2ZpbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLgotV29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLgotSGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBlclRlYW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlRlYW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2VzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuCi1Db3JlIE1ldGhvZCBDb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcgaG93IHZlcnkgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRodXMsIGEgcHJvY2VzcyBpcyBhIHNldCBvZiBwYXJ0aWFsbHkgb3JkZXJlZCB3b3JrIGRlc2NyaXB0aW9ucyBpbnRlbmRlZCB0byByZWFjaCBhIGhpZ2hlciBkZXZlbG9wbWVudCBnb2FsLCBzdWNoIGFzIHRoZSByZWxlYXNlIG9mIGEgc3BlY2lmaWMgc29mdHdhcmUgc3lzdGVtLiAgQSBwcm9jZXNzIGFuZCB0aGUgcHJvY2VzcyBtZXRhLW1vZGVsIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBmb2N1c2VzIG9uIHRoZSBsaWZlY3ljbGUgYW5kIHRoZSBzZXF1ZW5jaW5nIG9mIHdvcmsgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUbyBhY2hpZXZlIHRoaXMgaXQgdXNlcyB0aGUgRGVzY3JpcHRvciBjb25jZXB0IHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGFuZCBhbGxvd2luZyBkZWZpbmluZyB0aW1lLXNwZWNpZmljIGN1c3RvbWl6YXRpb25zIG9mIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgKGUuZy4gZGVmaW5pbmcgYSBmb2N1cyBvbiBkaWZmZXJlbnQgc3RlcHMgb2YgdGhlIHNhbWUgVGFzayBhbmQgcHJvdmlkaW5nIGlucHV0IFdvcmsgUHJvZHVjdHMgaW4gZGlmZmVyZW50IHN0YXRlcyB3aXRoaW4gdGhlIGRpZmZlcmVudCBQaGFzZXMgb2YgYSBwcm9jZXNzIGxpZmVjeWNsZSBpbiB3aGljaCB0aGUgc2FtZSBUYXNrIGlzIHBlcmZvcm1lZCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkluY2x1ZGVzUGF0dGVybiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVmYXVsdENvbnRleHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVmFsaWRDb250ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcnlQcm9jZXNzIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLgotQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbW11bmljYXRpb25zTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVkdWNhdGlvbk1hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJuIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4KLUEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOgotLSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4KLS0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuCi0tIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3MiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4KLUEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2VzcyI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCYXNlUHJvY2VzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzUGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LgotQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFBhY2thZ2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiIHR5cGU9InVtYTpQcm9jZXNzRWxlbWVudCIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVyZmFjZVNwZWNpZmljYXRpb24iIHR5cGU9InVtYTpUYXNrRGVzY3JpcHRvciIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZXJmYWNlSU8iIHR5cGU9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuCi1VTUEgc3VwcG9ydHMgcmVwbGFjZWFibGUgYW5kIHJldXNhYmxlIFByb2Nlc3MgQ29tcG9uZW50cyByZWFsaXppbmcgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gQ2VydGFpbiBzaXR1YXRpb25zIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCBtaWdodCByZXF1aXJlIHRoYXQgY29uY3JldGUgcmVhbGl6YXRpb25zIG9mIHBhcnRzIG9mIHRoZSBwcm9jZXNzIHJlbWFpbiB1bmRlY2lkZWQgb3Igd2lsbCBiZSBkZWNpZGVkIGJ5IHRoZSBleGVjdXRpbmcgdGVhbSBpdHNlbGYgKGUuZy4gaW4gb3V0c291cmNpbmcgc2l0dWF0aW9ucykuICBVTUEgcHJvdmlkZXMgYSB1bmlxdWUgY29tcG9uZW50IGNvbmNlcHQgZGVmaW5pbmcgaW50ZXJmYWNlcyBmb3Igd29yayBwcm9kdWN0IGlucHV0IGFuZCBvdXRwdXQsIGFsbG93aW5nIHRyZWF0aW5nIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvZiB0aGUgd29yayB0aGF0IHByb2R1Y2VzIHRoZSBvdXRwdXRzIGFzIGEgImJsYWNrIGJveCIuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICJyZWFsaXphdGlvbiIgZGV0YWlsaW5nIHRoZSB3b3JrIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJvY2Vzcy4gIFRoZSBjb21wb25lbnQgYXBwcm9hY2ggYWxzbyBhbGxvd3MgdGhhdCBkaWZmZXJlbnQgc3R5bGVzIG9yIHRlY2huaXF1ZXMgb2YgZG9pbmcgd29yayBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvbmUgYW5vdGhlci4gIEZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGNvZGUgb3V0cHV0IG9mIGEgY29tcG9uZW50IGNvdWxkIGJlIHByb2R1Y2VkIHdpdGggYSBtb2RlbC1kcml2ZW4gZGV2ZWxvcG1lbnQgb3IgYSBjb2RlLWNlbnRyaWMgdGVjaG5pcXVlLiAgVGhlIGNvbXBvbmVudCBjb25jZXB0IGVuY2Fwc3VsYXRlcyB0aGUgYWN0dWFsIHdvcmsgYW5kIGxldHMgdGhlIGRldmVsb3BtZW50IHRlYW0gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB0ZWNobmlxdWUgYW5kIGZpbGwgdGhlIGNvbXBvbmVudCdzIHJlYWxpemF0aW9uIHdpdGggdGhlaXIgY2hvaWNlIG9mIEFjdGl2aXRpZXMgdGhhdCBwcm9kdWNlIHRoZSByZXF1aXJlZCBvdXRwdXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc1BhY2thZ2UiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb3B5cmlnaHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZXJmYWNlIiB0eXBlPSJ1bWE6UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9jZXNzIiB0eXBlPSJ1bWE6UHJvY2VzcyIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImF1dGhvcnMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZFBsdWdpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi1TcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZWRNZXRob2RQbHVnaW4iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBhY2thZ2UiIHR5cGU9InVtYTpNZXRob2RQYWNrYWdlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idXNlckNoYW5nZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQbHVnaW4iIHR5cGU9InVtYTpNZXRob2RQbHVnaW4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBVbml0IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLU1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJhc2VDb25maWd1cmF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQbHVnaW5TZWxlY3Rpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlZmF1bHRWaWV3IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2Nlc3NWaWV3IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiB0eXBlPSJ1bWE6TWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RMaWJyYXJ5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBsdWdpbiIgdHlwZT0idW1hOk1ldGhvZFBsdWdpbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgdHlwZT0idW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0b29sIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSB0b29sIHRoYXQgZ2VuZXJhdGVkIHRoZSBYTUwgZmlsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZExpYnJhcnkiIHR5cGU9InVtYTpNZXRob2RMaWJyYXJ5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL1VNQS5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL1VNQS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTE5MzcxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9VTUEuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyNzU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InVtYSIKLSAgICBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIiBuc1ByZWZpeD0idW1hIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uJiN4RDsmI3hBO0FjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0aXZpdHkiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWNvbmRpdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlY29uZGl0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBvc3Rjb25kaXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBvc3Rjb25kaXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MjYiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYnJlYWtkb3duRWxlbWVudCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJyZWFrZG93bkVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGVja2xpc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDaGVja2xpc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25jZXB0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29uY2VwdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI2Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4YW1wbGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeGFtcGxlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjYiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3VpZGVsaW5lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iR3VpZGVsaW5lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjYiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm9hZG1hcCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvYWRtYXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXVzYWJsZUFzc2V0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmV1c2FibGVBc3NldCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI2Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI2Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndoaXRlcGFwZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXaGl0ZXBhcGVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjYiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNFbmFjdGFibGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzRW5hY3RhYmxlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9WYXJpYWJpbGl0eVR5cGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Im5hIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idmFyaWFiaWxpdHlUeXBlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBY3Rpdml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdGVybmF0aXZlcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBbHRlcm5hdGl2ZXMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaG93VG9TdGFmZiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIb3dUb1N0YWZmIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHVycG9zZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcnRpZmFjdCIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLiYjeEQ7JiN4QTtBcnRpZmFjdHMgYXJlIHRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBUYXNrcy4gIEl0IG1heSBzZXJ2ZSBhcyBhIGJhc2lzIGZvciBkZWZpbmluZyByZXVzYWJsZSBhc3NldHMuICBSb2xlcyB1c2UgQXJ0aWZhY3RzIHRvIHBlcmZvcm0gVGFza3MgYW5kIHByb2R1Y2UgQXJ0aWZhY3RzIGluIHRoZSBjb3Vyc2Ugb2YgcGVyZm9ybWluZyBUYXNrcy4gIEFydGlmYWN0cyBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIFJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5IHRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQgaW4gdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25lIHJvbGUgbWlnaHQgJnF1b3Q7b3duJnF1b3Q7IGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBcnRpZmFjdCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MjciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVkQXJ0aWZhY3QiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQXJ0aWZhY3QiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGFpbmVkQXJ0aWZhY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcnRpZmFjdERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBcnRpZmFjdC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFydGlmYWN0RGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJyaWVmT3V0bGluZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCcmllZk91dGxpbmUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVwcmVzZW50YXRpb25PcHRpb25zIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVwcmVzZW50YXRpb25PcHRpb25zIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQnJlYWtkb3duRWxlbWVudCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlc2VudGVkQWZ0ZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZXNlbnRlZEFmdGVyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRlZEJlZm9yZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlc2VudGVkQmVmb3JlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBsYW5uaW5nRGF0YSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGxhbm5pbmdEYXRhIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cGVyQWN0aXZpdHkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1cGVyQWN0aXZpdHkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXRhaWwgVXNlIENhc2UmcXVvdDsgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09wdGlvbmFsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpc09wdGlvbmFsIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzUGxhbm5lZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpc1BsYW5uZWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlZml4IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByZWZpeCByZXByZXNlbnRzIGFuIGFkZGl0aW9uYWwgbGFiZWwgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhIHByZWZpeCB0byBhbnkgQnJlYWtkb3duIEVsZW1lbnQgdG8gaW5kaWNhdGUgYSB1c2VyLWRlZmluZWQgc3ViLXR5cGUgZm9yIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdvdWxkIGxpa2UgdG8gZGlzdGluZ3Vpc2ggaGlzIEFjdGl2aXRpZXMgYnkgJ01vZHVsZScgKGFzIGRvbmUgaW4gdGhlIElCTSBSYXRpb25hbCBTdW1taXQgQXNjZW5kYW50IE1ldGhvZCksIGhlIGNhbiBkZWZpbmUgYSBkaWZmZXJlbnQgcHJlZml4IGZvciBldmVyeSBtb2RlbCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG5hbWluZyBBY3Rpdml0aWVzLCBlLmcuICZxdW90O1NSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzJnF1b3Q7IHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICZxdW90O1NvZnR3YXJlIFJlcXVpcmVtZW50cyBBbmFseXNpcyZxdW90OyBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAmcXVvdDtDdXN0b21lci5BcmNoaXRlY3QmcXVvdDsgd291bGQgZGVmaW5lIGEgJnF1b3Q7Q3VzdG9tZXImcXVvdDsgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICZxdW90O0FyY2hpdGVjdCZxdW90OyBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InByZWZpeCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlR3VpZGFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idXNhZ2VHdWlkYW5jZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4mI3hEOyYjeEE7QSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6JiN4RDsmI3hBOy0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuJiN4RDsmI3hBOy0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuJiN4RDsmI3hBOy0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNoZWNrbGlzdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNoZWNrbGlzdCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29tcG9zaXRlUm9sZSIgZVN1cGVyVHlwZXM9IiMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4mI3hEOyYjeEE7QSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb21wb3NpdGVSb2xlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDEiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyMiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZ2dyZWdhdGVkUm9sZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Sb2xlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFnZ3JlZ2F0ZWRSb2xlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29uY2VwdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25jZXB0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25zdHJhaW50IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBnZW5lcmFsaXplZCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnN0cmFpbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdG9yZXMgdGhlIG1haW4gZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJtYWluRGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudENhdGVnb3J5IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgb25seSBjb250YWlucyBDb250ZW50IENhdGVnb3J5IEVsZW1lbnRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGVudENhdGVnb3J5UGFja2FnZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MTEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudENhdGVnb3J5IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250ZW50Q2F0ZWdvcnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGVudERlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYWluRGVzY3JpcHRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3RvcmVzIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1haW5EZXNjcmlwdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJrZXlDb25zaWRlcmF0aW9ucyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iS2V5Q29uc2lkZXJhdGlvbnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjdGlvbiIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9TZWN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNlY3Rpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmliYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LiYjeEQ7JiN4QTtDb250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnRlbnRFbGVtZW50Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDEiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoxMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGVja2xpc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDaGVja2xpc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25jZXB0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29uY2VwdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjExIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4YW1wbGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeGFtcGxlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3VpZGVsaW5lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iR3VpZGVsaW5lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmV1c2FibGVBc3NldCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJldXNhYmxlQXNzZXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3aGl0ZXBhcGVyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2hpdGVwYXBlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjExIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9WYXJpYWJpbGl0eVR5cGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Im5hIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idmFyaWFiaWxpdHlUeXBlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGVudFBhY2thZ2UiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjExIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRlbnRFbGVtZW50IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnRlbnRFbGVtZW50IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnRlbnRFbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAmcXVvdDtUZXN0aW5nJnF1b3Q7IGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXN0b21DYXRlZ29yeSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2F0ZWdvcml6ZWRFbGVtZW50IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2F0ZWdvcml6ZWRFbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3ViQ2F0ZWdvcnkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJDYXRlZ29yeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJhYmxlIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlbGl2ZXJhYmxlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWxpdmVyZWRXb3JrUHJvZHVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlbGl2ZXJlZFdvcmtQcm9kdWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyYWJsZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsRGVzY3JpcHRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVybmFsRGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFja2FnaW5nR3VpZGFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQYWNrYWdpbmdHdWlkYW5jZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3MiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4mI3hEOyYjeEE7QSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWxpdmVyeVByb2Nlc3MiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjQyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbW11bmljYXRpb25zTWF0ZXJpYWwiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb21tdW5pY2F0aW9uc01hdGVyaWFsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6NDIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWR1Y2F0aW9uTWF0ZXJpYWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFZHVjYXRpb25NYXRlcmlhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjQyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIFByb2Nlc3MgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlbGl2ZXJ5IFByb2Nlc3MuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NhbGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTY2FsZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3MiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvamVjdENoYXJhY3RlcmlzdGljcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyaXNrTGV2ZWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmlza0xldmVsIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRpbmdUZWNobmlxdWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGluZ1RlY2huaXF1ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGEgcHJvZmlsZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0ZWFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHJvbGVzLCBza2lsbHMgcmVxdWlyZWQgZm9yIGEgdGVhbSBwZXJmb3JtcyBhIHByb2plY3QgYmFzZWQgb24gdGhpcyBwcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGVPZkNvbnRyYWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvSSdtIGNoYUknbSBudHJhY3RzIHRoYXQgbmVlZCB0byBiZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIGEgcHJvamVjdCB0ZWFtIHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9jZXNzIGFuZCBhIGNsaWVudCAoZS5nLiBmb3IgYW4gSUdTIGVuZ2FnZW1lbnQpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlT2ZDb250cmFjdCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmliYWJsZUVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuJiN4RDsmI3hBO1RoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmliYWJsZUVsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRhdGlvbiIgZVR5cGU9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVzZW50YXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm9kZWljb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJub2RlaWNvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAmcXVvdDtydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50JnF1b3Q7IHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICZxdW90O2oyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQmcXVvdDsgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAmcXVvdDtBcmNoaXRlY3R1cmUgRG9jdW1lbnQmcXVvdDsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icHJlc2VudGF0aW9uTmFtZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzaGFwZWljb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InNoYXBlaWNvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLiYjeEQ7JiN4QTtEZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmlwdG9yIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlc2NyaXB0b3IuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZmluZWREZXNjcmlwdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWZpbmVkRGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzY2lwbGluZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuJiN4RDsmI3hBO0EgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRpc2NpcGxpbmUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhc2siIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIgdm9sYXRpbGU9InRydWUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViRGlzY2lwbGluZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9EaXNjaXBsaW5lIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YkRpc2NpcGxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWZlcmVuY2VXb3JrZmxvdyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlZmVyZW5jZVdvcmtmbG93Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzY2lwbGluZUdyb3VwaW5nIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVc2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICZxdW90O1NvZnR3YXJlIERpc2NpcGxpbmVzJnF1b3Q7IHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQmcXVvdDsgb3IgJnF1b3Q7VGVzdGluZyZxdW90OzsgJnF1b3Q7SVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCZxdW90OyB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICZxdW90O0lUIE9wZXJhdGlvbmFsIFNlcnZpY2VzJnF1b3Q7LCAmcXVvdDtJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzJnF1b3Q7LCBvciAmcXVvdDtJVCBFbmFibGluZyBTZXJ2aWNlcyZxdW90Oy4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRpc2NpcGxpbmVHcm91cGluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGlzY2lwbGluZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRpc2NpcGxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEb2N1bWVudFJvb3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJtaXhlZCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaXhlZCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRXaWxkY2FyZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSI6bWl4ZWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ieE1MTlNQcmVmaXhNYXAiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ieG1sbnM6cHJlZml4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InhTSVNjaGVtYUxvY2F0aW9uIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InhzaTpzY2hlbWFMb2NhdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RDb25maWd1cmF0aW9uIiB1cHBlckJvdW5kPSItMiIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZExpYnJhcnkiIHVwcGVyQm91bmQ9Ii0yIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kTGlicmFyeSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RMaWJyYXJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGx1Z2luIiB1cHBlckJvdW5kPSItMiIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBNZXRob2QgVW5pdCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuJiN4RDsmI3hBO01ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLiYjeEQ7JiN4QTtTcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RQbHVnaW4iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEb21haW4iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LiYjeEQ7JiN4QTtEb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRG9tYWluIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrUHJvZHVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtQcm9kdWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViZG9tYWluIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0RvbWFpbiIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJkb21haW4iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWxlbWVudCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZW1wdHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXN0aW1hdGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgc2l6aW5nIG1lYXN1cmVzLCBvciBzdGFuZGFyZHMgZm9yIHNpemluZyB0aGUgd29yayBlZmZvcnQgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgYSBwYXJ0aWN1bGFyIHBpZWNlIG9mIHdvcmsgYW5kIGluc3RydWN0aW9ucyBmb3IgdGhlaXIgc3VjY2Vzc2Z1bCB1c2UuIEl0IG1heSBiZSBjb21wcmlzZWQgb2YgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9ucyBhbmQgZXN0aW1hdGlvbiBtZXRyaWNzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRpb25NZXRyaWMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFc3RpbWF0aW9uTWV0cmljIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXN0aW1hdGluZ01ldHJpYyIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBkZXNjcmliZXMgYSBtZXRyaWMgb3IgbWVhc3VyZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IGFuZCB3aGljaCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgd29yayBlZmZvcnQgYXMgd2VsbCBhcyBhIHJhbmdlIG9mIHBvdGVudGlhbCBsYWJvci4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRpbmdNZXRyaWMiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBxdWFsaWZpZXMgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXhhbXBsZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4YW1wbGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRhbmNlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iR3VpZGFuY2UiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRhbmNlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgR3VpZGFuY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHdWlkYW5jZURlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdHRhY2htZW50IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXR0YWNobWVudCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkZWxpbmUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikd1aWRlbGluZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSXRlcmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4mI3hEOyYjeEE7SXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJdGVyYXRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJhc2VDb25maWd1cmF0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZUNvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWV0aG9kUGx1Z2luU2VsZWN0aW9uIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kUGx1Z2luU2VsZWN0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RQYWNrYWdlU2VsZWN0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRWaWV3IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0VmlldyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9jZXNzVmlldyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2Nlc3NWaWV3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIERlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RFbGVtZW50Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3duZWRSdWxlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnN0cmFpbnQiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSBwYWNrYWdpbmcgcnVsZXMgZm9yIHRoaXMgTWV0aG9kIEVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik93bmVkUnVsZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImJyaWVmRGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcmRlcmluZ0d1aWRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ib3JkZXJpbmdHdWlkZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdXBwcmVzc2VkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgJnF1b3Q7ZXh0ZW5kcyZxdW90OyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiwgdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJzdXBwcmVzc2VkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZExpYnJhcnkiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZExpYnJhcnkiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBsdWdpbiIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kUGx1Z2luIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZENvbmZpZ3VyYXRpb24iIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvb2wiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFBhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kUGFja2FnZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAxIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6NyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXVzZWRQYWNrYWdlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmV1c2VkUGFja2FnZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGFja2FnZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZFBhY2thZ2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDo3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdsb2JhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTWV0aG9kIFBhY2thZ2VzIGNhbiBoYXZlIGEgZ2xvYmFsIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgZXZlcnkgb3RoZXIgTWV0aG9kIFBhY2thZ2UgY2FuIHNlZSB0aGUgZ2xvYmFsIHBhY2thZ2UncyBjb250ZW50cy4gIEdsb2JhbCBNZXRob2QgUGFja2FnZXMgYXJlIHByaW1hcmlseSB1c2VkIHRvIHN0b3JlIGNvbW1vbmx5IHVzZWQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgc3VjaCBhcyBmb3IgRGlzY2lwbGluZXMgb3IgRG9tYWlucywgd2hpY2ggYXJlIHVzZWQgYnkgbWFueSBUYXNrIGFuZCBXb3JrIFByb2R1Y3RzIHJlc3BlY3RpdmVseS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJnbG9iYWwiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUGx1Z2luIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIE1ldGhvZCBVbml0IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4mI3hEOyYjeEE7TWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuJiN4RDsmI3hBO1NwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RQbHVnaW4iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZmVyZW5jZWRNZXRob2RQbHVnaW4iCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWZlcmVuY2VkTWV0aG9kUGx1Z2luIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBhY2thZ2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RQYWNrYWdlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ1c2VyQ2hhbmdlYWJsZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RVbml0IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kVW5pdCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29weXJpZ2h0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3B5cmlnaHQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0aG9ycyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iYXV0aG9ycyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJjaGFuZ2VEYXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJjaGFuZ2VEZXNjcmlwdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InZlcnNpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWlsZXN0b25lIiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1pbGVzdG9uZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZWRFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWVkRWxlbWVudCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZW1wdHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJuYW1lIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGNvbWUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBXb3JrIFByb2R1Y3QgdGhhdCBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0Y29tZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vTmFtZWRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQYWNrYWdlYWJsZUVsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVtcHR5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBoYXNlIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4mI3hEOyYjeEE7UGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaGFzZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGxhbm5pbmdEYXRhIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLiYjeEQ7JiN4QTtQbGFubmluZyBEYXRhIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuJiN4RDsmI3hBOyhOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQbGFubmluZ0RhdGEiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJmaW5pc2hEYXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhbmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJyYW5rIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0RGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ic3RhcnREYXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByYWN0aWNlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAmcXVvdDtNYW5hZ2UgUmlza3MmcXVvdDssICZxdW90O0NvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSZxdW90OywgJnF1b3Q7QXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCZxdW90OywgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJhY3RpY2UiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2aXR5UmVmZXJlbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0aXZpdHlSZWZlcmVuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb250ZW50UmVmZXJlbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGVudFJlZmVyZW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlByYWN0aWNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1ByYWN0aWNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YlByYWN0aWNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcmFjdGljZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByYWN0aWNlRGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFkZGl0aW9uYWxJbmZvIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBZGRpdGlvbmFsSW5mbyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhcHBsaWNhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXBwbGljYXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmFja2dyb3VuZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhY2tncm91bmQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ29hbHMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkdvYWxzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsc09mQWRvcHRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxzT2ZBZG9wdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9ibGVtIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvYmxlbSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4mI3hEOyYjeEE7Q29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvY2VzcyIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5jbHVkZXNQYXR0ZXJuIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW5jbHVkZXNQYXR0ZXJuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRDb250ZXh0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0Q29udGV4dCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWxpZENvbnRleHQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWxpZENvbnRleHQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuJiN4RDsmI3hBO1VNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAmcXVvdDtibGFjayBib3gmcXVvdDsuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICZxdW90O3JlYWxpemF0aW9uJnF1b3Q7IGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2Nlc3NDb21wb25lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvcHlyaWdodCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29weXJpZ2h0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZSIgZVR5cGU9IiMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW50ZXJmYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3MiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2Nlc3MiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0aG9ycyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iYXV0aG9ycyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJjaGFuZ2VEYXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJjaGFuZ2VEZXNjcmlwdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InZlcnNpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDEiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoxOSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VTcGVjaWZpY2F0aW9uIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIgotICAgICAgICBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkludGVyZmFjZVNwZWNpZmljYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxOSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VJTyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW50ZXJmYWNlSU8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxOSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIEFjdGl2aXR5IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcm9jZXNzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY29wZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2NvcGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNhZ2VOb3RlcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVc2FnZU5vdGVzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsSWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGRlbGl2ZXJ5IHBhdHRlcm5zIGFuZCBtb2RlbHMuIEl0IGlzIHVzZWQgbGlrZSBhIHN5bm9ueW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZXh0ZXJuYWxJZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4mI3hEOyYjeEE7UHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvY2Vzc0VsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4mI3hEOyYjeEE7QSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2Nlc3NQYWNrYWdlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoxMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzRWxlbWVudCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzRWxlbWVudCIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9jZXNzRWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjExIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuJiN4RDsmI3hBO0EgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjQyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJhc2VQcm9jZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZVByb2Nlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDo0MiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXBvcnQiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVwb3J0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXVzYWJsZUFzc2V0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcmI3hEOyYjeEE7aG93IHRoZSBhc3NldCBzaG91bGQgYmUgdXNlZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJldXNhYmxlQXNzZXQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvYWRtYXAiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHdoaWNoIGlzIG9ubHkgcmVsYXRlZCB0byBBY3RpdmF0ZXMgYW5kIHRoZXJlZm9yZSBoYXMgYmVlbiBhZGRlZCBieSB0aGlzIHBhY2thZ2UgdG8gdGhlIGxpc3Qgb2YgR3VpZGFuY2UgVHlwZXMgcmF0aGVyIHRoYW4gbGlzdGVkIGluIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlLiAgQSBSb2FkbWFwIHJlcHJlc2VudHMgYSBsaW5lYXIgd2Fsa3Rocm91Z2ggb2YgYW4gQWN0aXZpdHksIHR5cGljYWxseSBhIFByb2Nlc3MuJiN4RDsmI3hBO0FuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvYWRtYXAiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb250ZW50IEVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgJiN4RDsmI3hBO0EgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3BvbnNpYmxlRm9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFJvbGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xlRGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXNzaWdubWVudEFwcHJvYWNoZXMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2tpbGxzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2tpbGxzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN5bm9ueW1zIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTeW5vbnltcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUm9sZURlc2NyaXB0b3IiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzcG9uc2libGVGb3IiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNwb25zaWJsZUZvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlU2V0IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPcmdhbml6ZXMgUm9sZXMgaW50byBjYXRlZ29yaWVzLiAgSXQgaXMgdXNlZCB0byBncm91cCByb2xlcyB0b2dldGhlciB0aGF0IGhhdmUgY2VydGFpbiBjb21tb25hbGl0aWVzLiAgRm9yIGV4YW1wbGUsIHRoZSAmcXVvdDtBbmFseXN0cyZxdW90OyBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgJnF1b3Q7QnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0JnF1b3Q7LCAmcXVvdDtTeXN0ZW0gQW5hbHlzdCZxdW90OywgYXMgd2VsbCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgU3BlY2lmaWVyJnF1b3Q7IHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGVTZXQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGUiIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIgdm9sYXRpbGU9InRydWUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZVNldEdyb3VwaW5nIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xlU2V0R3JvdXBpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGVTZXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xlU2V0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VjdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2VjdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViU2VjdGlvbiIgZVR5cGU9IiMvL1NlY3Rpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3ViU2VjdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVkZWNlc3NvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlZGVjZXNzb3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmlwdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWN0aW9uTmFtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ic2VjdGlvbk5hbWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5VHlwZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0ibmEiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ2YXJpYWJpbGl0eVR5cGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFzayIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLiYjeEQ7JiN4QTtBIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAmI3hEOyYjeEE7QSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gJiN4RDsmI3hBO0ZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXZlbG9wIFVzZSBDYXNlIE1vZGVsJnF1b3Q7IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgJnF1b3Q7bWV0aG9kJnF1b3Q7IG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2siLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWNvbmRpdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlY29uZGl0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBvc3Rjb25kaXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBvc3Rjb25kaXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVyZm9ybWVkQnkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdXRwdXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRwdXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik9wdGlvbmFsSW5wdXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idG9vbE1lbnRvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvb2xNZW50b3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgVGFzay4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tEZXNjcmlwdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx0ZXJuYXRpdmVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWx0ZXJuYXRpdmVzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQdXJwb3NlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2tEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuJiN4RDsmI3hBO0Ega2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tEZXNjcmlwdG9yIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXNrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBlcmZvcm1lZFByaW1hcmlseUJ5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJmb3JtZWRQcmltYXJpbHlCeSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyNiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjYiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXNzaXN0ZWRCeSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lzdGVkQnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbElucHV0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZXJuYWxJbnB1dCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI2Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcHRpb25hbElucHV0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3B0aW9uYWxJbnB1dCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI2Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im91dHB1dCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dHB1dCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI2Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN0ZXAiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGVwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlYW1Qcm9maWxlIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLiYjeEQ7JiN4QTtXb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuJiN4RDsmI3hBO0hlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRlYW1Qcm9maWxlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDEiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoxOSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb2xlIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciIHZvbGF0aWxlPSJ0cnVlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUm9sZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cGVyVGVhbSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1cGVyVGVhbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1YlRlYW0iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJUZWFtIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVtcGxhdGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUZW1wbGF0ZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVybURlZmluaXRpb24iIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgZGVmaW5lcyBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUZXJtRGVmaW5pdGlvbnMgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIENvbnRlbnRFbGVtZW50cywgYnV0IHRoZWlyIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIFRlcm0gaXMgdXNlZCBpbiB0aGUgQ29udGVudEVsZW1lbnRzIGRlc2NyaXB0aW9uIHRleHQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUZXJtRGVmaW5pdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVG9vbCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvb2wiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvb2xNZW50b3IiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUb29sTWVudG9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVG9vbE1lbnRvciIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBICBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVG9vbE1lbnRvciIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhcmlhYmlsaXR5VHlwZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibmEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImNvbnRyaWJ1dGVzIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZXh0ZW5kcyIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InJlcGxhY2VzIiB2YWx1ZT0iMyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibG9jYWxDb250cmlidXRpb24iIHZhbHVlPSI0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJsb2NhbFJlcGxhY2VtZW50IiB2YWx1ZT0iNSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJWYXJpYWJpbGl0eVR5cGVPYmplY3QiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYXJpYWJpbGl0eVR5cGU6T2JqZWN0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iVmFyaWFiaWxpdHlUeXBlIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldoaXRlcGFwZXIiIGVTdXBlclR5cGVzPSIjLy9Db25jZXB0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2hpdGVwYXBlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjE5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlY2Vzc29yIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtPcmRlciIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVkZWNlc3NvciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzRXZlbnREcml2ZW4iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iaXNFdmVudERyaXZlbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09uZ29pbmciIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlzT25nb2luZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1JlcGVhdGFibGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlzUmVwZWF0YWJsZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrRGVmaW5pdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuJiN4RDsmI3hBO1dvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtEZWZpbml0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVjb25kaXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWNvbmRpdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwb3N0Y29uZGl0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQb3N0Y29uZGl0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtPcmRlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgJiN4RDsmI3hBO1RoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrT3JkZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9InNpbXBsZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IjowIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9InNpbXBsZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rVHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtPcmRlclR5cGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZpbmlzaFRvU3RhcnQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJsaW5rVHlwZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJXb3JrT3JkZXJUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya09yZGVyVHlwZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9TdGFydCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9GaW5pc2giIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvU3RhcnQiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvRmluaXNoIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJXb3JrT3JkZXJUeXBlT2JqZWN0IiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya09yZGVyVHlwZTpPYmplY3QiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJXb3JrT3JkZXJUeXBlIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLiYjeEQ7JiN4QTtBIHdvcmsgcHJvZHVjdCBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IGEgdGFzay4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtQcm9kdWN0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVwb3J0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVwb3J0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGVtcGxhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUZW1wbGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvb2xNZW50b3IiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUb29sTWVudG9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBXb3JrIFByb2R1Y3QuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBhY3RPZk5vdEhhdmluZyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbXBhY3RPZk5vdEhhdmluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB3aHkgdGhlIHdvcmsgcHJvZHVjdCBpcyBwcm9kdWNlZCBhbmQgdG8gd2hhdCB1c2UgaXQgd2lsbCBiZSBwdXQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlB1cnBvc2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhc29uc0Zvck5vdE5lZWRpbmciIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBjaXJjdW1zdGFuY2VzIGluIHdoaWNoIGl0IGlzIHJlYXNvbmFibGUgbm90IHRvIHByb2R1Y2UgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3Jpbmcgb2YgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlYXNvbnNGb3JOb3ROZWVkaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsSWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImV4dGVybmFsSWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtQcm9kdWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrUHJvZHVjdCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDEiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyMiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBhY3RlZEJ5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW1wYWN0ZWRCeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjIyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGFjdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbXBhY3RzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVsaXZlcmFibGVQYXJ0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlbGl2ZXJhYmxlUGFydHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyMiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gICYjeEQ7JiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iYWN0aXZpdHlFbnRyeVN0YXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLiYjeEQ7JiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iYWN0aXZpdHlFeGl0U3RhdGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgJnF1b3Q7Q2xhc3MgRGlhZ3JhbSZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICZxdW90O1NwZWNpZmljYXRpb24mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrUHJvZHVjdFR5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtQcm9kdWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1Byb2R1Y3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9VTUEuZ2VubW9kZWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9VTUEuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmZDM4NTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvVU1BLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsNDA2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEiIHRlbXBsYXRlRGlyZWN0b3J5PSIiIG1vZGVsTmFtZT0iVU1BIiBlZGl0UGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmVkaXQuVU1BRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuZWRpdG9yLlVNQUVkaXRvclBsdWdpbiIgcm9vdEV4dGVuZHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3QiCi0gICAgcm9vdEV4dGVuZHNDbGFzcz0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5pbXBsLkVEYXRhT2JqZWN0SW1wbCIgcm9vdEltcGxlbWVudHNJbnRlcmZhY2U9IiIKLSAgICB0ZXN0U3VpdGVDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEudGVzdHMuVU1BQWxsVGVzdHMiIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLnhzZC5lY29yZS5pbXBvcnRlciI+Ci0gIDxmb3JlaWduTW9kZWw+ZmlsZTovRDovc2hhcmVzL3htbC11bWEtdjEwL0VQRl9TY2hlbWFfMjAwNjA2MTkxMTAwLnhzZDwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJVbWEiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5lcGYueG1sIiByZXNvdXJjZT0iWE1MIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgZWNvcmVQYWNrYWdlPSJVTUEuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iVU1BLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL25hIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9jb250cmlidXRlcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJVTUEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvZXh0ZW5kcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJVTUEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvcmVwbGFjZXMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2xvY2FsQ29udHJpYnV0aW9uIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9sb2NhbFJlcGxhY2VtZW50Ii8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJVTUEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vV29ya09yZGVyVHlwZS9maW5pc2hUb1N0YXJ0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1dvcmtPcmRlclR5cGUvZmluaXNoVG9GaW5pc2giLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvU3RhcnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvRmluaXNoIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IlVNQS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZU9iamVjdCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iVU1BLmVjb3JlIy8vV29ya09yZGVyVHlwZU9iamVjdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0FjdGl2aXR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS9wcmVjb25kaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS9wb3N0Y29uZGl0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5L2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS9icmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQWN0aXZpdHkvY2hlY2tsaXN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQWN0aXZpdHkvY29uY2VwdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5L2V4YW1wbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS9ndWlkZWxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS9yb2FkbWFwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQWN0aXZpdHkvcmV1c2FibGVBc3NldCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5L3N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5L3doaXRlcGFwZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS9pc0VuYWN0YWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS92YXJpYWJpbGl0eVR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9hbHRlcm5hdGl2ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL2hvd1RvU3RhZmYiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQXJ0aWZhY3QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BcnRpZmFjdC9ncm91cDMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vQXJ0aWZhY3QvY29udGFpbmVkQXJ0aWZhY3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9icmllZk91dGxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL3JlcHJlc2VudGF0aW9uT3B0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZXNlbnRlZEFmdGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVzZW50ZWRCZWZvcmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3BsYW5uaW5nRGF0YSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvc3VwZXJBY3Rpdml0eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaXNPcHRpb25hbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaXNQbGFubmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVmaXgiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24vdXNhZ2VHdWlkYW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9DYXBhYmlsaXR5UGF0dGVybiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0NoZWNrbGlzdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0NvbXBvc2l0ZVJvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db21wb3NpdGVSb2xlL2dyb3VwMSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Db21wb3NpdGVSb2xlL2FnZ3JlZ2F0ZWRSb2xlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0NvbmNlcHQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Db25zdHJhaW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db25zdHJhaW50L21haW5EZXNjcmlwdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Db250ZW50Q2F0ZWdvcnlQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudENhdGVnb3J5UGFja2FnZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vQ29udGVudENhdGVnb3J5UGFja2FnZS9jb250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vbWFpbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL2tleUNvbnNpZGVyYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9zZWN0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvZ3JvdXAxIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY2hlY2tsaXN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY29uY2VwdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2V4YW1wbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9ndWlkZWxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9yZXVzYWJsZUFzc2V0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvc3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvd2hpdGVwYXBlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RWxlbWVudC92YXJpYWJpbGl0eVR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQ29udGVudFBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50UGFja2FnZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vQ29udGVudFBhY2thZ2UvY29udGVudEVsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9jYXRlZ29yaXplZEVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9zdWJDYXRlZ29yeSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9EZWxpdmVyYWJsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJhYmxlL2dyb3VwMyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJhYmxlL2RlbGl2ZXJlZFdvcmtQcm9kdWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24vZXh0ZXJuYWxEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24vcGFja2FnaW5nR3VpZGFuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzL2dyb3VwMyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzcy9jb21tdW5pY2F0aW9uc01hdGVyaWFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzL2VkdWNhdGlvbk1hdGVyaWFsIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9zY2FsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Byb2plY3RDaGFyYWN0ZXJpc3RpY3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9yaXNrTGV2ZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9lc3RpbWF0aW5nVGVjaG5pcXVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcHJvamVjdE1lbWJlckV4cGVydGlzZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3R5cGVPZkNvbnRyYWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9wcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvbm9kZWljb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvcHJlc2VudGF0aW9uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9zaGFwZWljb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVzY3JpcHRvci9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRGVzY3JpcHRvckRlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZXNjcmlwdG9yRGVzY3JpcHRpb24vcmVmaW5lZERlc2NyaXB0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0Rpc2NpcGxpbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EaXNjaXBsaW5lL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0Rpc2NpcGxpbmUvdGFzayIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9EaXNjaXBsaW5lL3N1YkRpc2NpcGxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EaXNjaXBsaW5lL3JlZmVyZW5jZVdvcmtmbG93Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZy9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EaXNjaXBsaW5lR3JvdXBpbmcvZGlzY2lwbGluZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Eb2N1bWVudFJvb3QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Eb2N1bWVudFJvb3QvbWl4ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vRG9jdW1lbnRSb290L3hNTE5TUHJlZml4TWFwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0RvY3VtZW50Um9vdC94U0lTY2hlbWFMb2NhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Eb2N1bWVudFJvb3QvbWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Eb2N1bWVudFJvb3QvbWV0aG9kTGlicmFyeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Eb2N1bWVudFJvb3QvbWV0aG9kUGx1Z2luIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0RvbWFpbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RvbWFpbi9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Eb21haW4vd29ya1Byb2R1Y3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vRG9tYWluL3N1YmRvbWFpbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9FbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRXN0aW1hdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Fc3RpbWF0ZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Fc3RpbWF0ZS9lc3RpbWF0aW9uTWV0cmljIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRXN0aW1hdGUvZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0VzdGltYXRpbmdNZXRyaWMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9FeGFtcGxlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vR3VpZGFuY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9HdWlkYW5jZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9HdWlkYW5jZURlc2NyaXB0aW9uL2F0dGFjaG1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vSXRlcmF0aW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9iYXNlQ29uZmlndXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vbWV0aG9kUGx1Z2luU2VsZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9tZXRob2RQYWNrYWdlU2VsZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9kZWZhdWx0VmlldyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vcHJvY2Vzc1ZpZXciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZEVsZW1lbnQvZ3JvdXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vd25lZFJ1bGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2JyaWVmRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vcmRlcmluZ0d1aWRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9zdXBwcmVzc2VkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL01ldGhvZExpYnJhcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L21ldGhvZFBsdWdpbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L21ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZFBhY2thZ2UvZ3JvdXAxIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9yZXVzZWRQYWNrYWdlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL01ldGhvZFBhY2thZ2UvbWV0aG9kUGFja2FnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZFBhY2thZ2UvZ2xvYmFsIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL01ldGhvZFBsdWdpbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kUGx1Z2luL3JlZmVyZW5jZWRNZXRob2RQbHVnaW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vTWV0aG9kUGx1Z2luL21ldGhvZFBhY2thZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RQbHVnaW4vdXNlckNoYW5nZWFibGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWV0aG9kVW5pdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kVW5pdC9jb3B5cmlnaHQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RVbml0L2F1dGhvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RVbml0L2NoYW5nZURhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RVbml0L2NoYW5nZURlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kVW5pdC92ZXJzaW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL01pbGVzdG9uZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL05hbWVkRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vT3V0Y29tZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1BhY2thZ2VhYmxlRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1BoYXNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUGxhbm5pbmdEYXRhIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9QbGFubmluZ0RhdGEvZmluaXNoRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1BsYW5uaW5nRGF0YS9yYW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUGxhbm5pbmdEYXRhL3N0YXJ0RGF0ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9QcmFjdGljZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1ByYWN0aWNlL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1ByYWN0aWNlL2FjdGl2aXR5UmVmZXJlbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJhY3RpY2UvY29udGVudFJlZmVyZW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9QcmFjdGljZS9zdWJQcmFjdGljZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2FkZGl0aW9uYWxJbmZvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9hcHBsaWNhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYmFja2dyb3VuZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vZ29hbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2xldmVsc09mQWRvcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL3Byb2JsZW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUHJvY2VzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzcy9pbmNsdWRlc1BhdHRlcm4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzL2RlZmF1bHRDb250ZXh0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzcy92YWxpZENvbnRleHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9jb3B5cmlnaHQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9pbnRlcmZhY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9wcm9jZXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9hdXRob3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9jaGFuZ2VEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9jaGFuZ2VEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQvdmVyc2lvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9ncm91cDEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UvaW50ZXJmYWNlSU8iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vc2NvcGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vdXNhZ2VOb3RlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi9leHRlcm5hbElkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1Byb2Nlc3NFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UvcHJvY2Vzc0VsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS9ncm91cDMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS9iYXNlUHJvY2VzcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9SZXBvcnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUm9hZG1hcCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1JvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1JvbGUvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vYXNzaWdubWVudEFwcHJvYWNoZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vc2tpbGxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL3N5bm9ueW1zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9yb2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUm9sZVNldCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1JvbGVTZXQvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUm9sZVNldC9yb2xlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1JvbGVTZXRHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1JvbGVTZXRHcm91cGluZy9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlU2V0R3JvdXBpbmcvcm9sZVNldCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9TZWN0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vU2VjdGlvbi9zdWJTZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vU2VjdGlvbi9wcmVkZWNlc3NvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1NlY3Rpb24vZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9TZWN0aW9uL3ByZWRlY2Vzc29yMSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1NlY3Rpb24vc2VjdGlvbk5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9TZWN0aW9uL3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9TZWN0aW9uL3ZhcmlhYmlsaXR5VHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9UYXNrIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrL3ByZWNvbmRpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2svcG9zdGNvbmRpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2svcGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFzay9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrL21hbmRhdG9yeUlucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFzay9vdXRwdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrL2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFzay9vcHRpb25hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFzay9lc3RpbWF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2svZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFzay90b29sTWVudG9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uL2FsdGVybmF0aXZlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci90YXNrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvcGVyZm9ybWVkUHJpbWFyaWx5QnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9hc3Npc3RlZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvZXh0ZXJuYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL21hbmRhdG9yeUlucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivb3B0aW9uYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL291dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9zdGVwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1RlYW1Qcm9maWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGVhbVByb2ZpbGUvZ3JvdXAxIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGVhbVByb2ZpbGUvcm9sZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1RlYW1Qcm9maWxlL3N1cGVyVGVhbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1RlYW1Qcm9maWxlL3N1YlRlYW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vVGVtcGxhdGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9UZXJtRGVmaW5pdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1Rvb2wiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Ub29sL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rvb2wvdG9vbE1lbnRvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Ub29sTWVudG9yIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vV2hpdGVwYXBlciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvZ3JvdXAxIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L3ByZWRlY2Vzc29yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNFdmVudERyaXZlbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzT25nb2luZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzUmVwZWF0YWJsZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya0RlZmluaXRpb24vcHJlY29uZGl0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya0RlZmluaXRpb24vcG9zdGNvbmRpdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Xb3JrT3JkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtPcmRlci92YWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtPcmRlci9saW5rVHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0L2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0L2VzdGltYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3QvZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3QvcmVwb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3QvdGVtcGxhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90b29sTWVudG9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vaW1wYWN0T2ZOb3RIYXZpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL3JlYXNvbnNGb3JOb3ROZWVkaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9leHRlcm5hbElkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL3dvcmtQcm9kdWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL3Jlc3BvbnNpYmxlUm9sZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvZ3JvdXAxIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2V4dGVybmFsSW5wdXRUbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RlZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvbWFuZGF0b3J5SW5wdXRUbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9vcHRpb25hbElucHV0VG8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3Ivb3V0cHV0RnJvbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9kZWxpdmVyYWJsZVBhcnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2FjdGl2aXR5RW50cnlTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9hY3Rpdml0eUV4aXRTdGF0ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdFR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdFR5cGUvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlL3dvcmtQcm9kdWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL1VNQS54c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9VTUEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YjhlODdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL1VNQS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzg3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIEVQRiBVTUEgWE1MIERhdGEgSW50ZXJjaGFuZ2UgU2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgeG1sbnM6dW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMiIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIj4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5DTmFtZSI+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5pc2hUb1N0YXJ0Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5pc2hUb0ZpbmlzaCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RhcnRUb1N0YXJ0Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdGFydFRvRmluaXNoIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlZhcmlhYmlsaXR5VHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6TkNOYW1lIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5hIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb250cmlidXRlcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5kcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmVwbGFjZXMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxvY2FsQ29udHJpYnV0aW9uIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsb2NhbFJlcGxhY2VtZW50Ii8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik5hbWVkRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhY2thZ2VhYmxlRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpOYW1lZEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIERlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQYWNrYWdlYWJsZUVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3duZWRSdWxlIiB0eXBlPSJ1bWE6Q29uc3RyYWludCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHBhY2thZ2luZyBydWxlcyBmb3IgdGhpcyBNZXRob2QgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3VwcHJlc3NlZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlICJleHRlbmRzIiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiwgdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcmRlcmluZ0d1aWRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uc3RyYWludCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN0b3JlcyB0aGUgbWFpbiBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJhaW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNlY3Rpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdWJTZWN0aW9uIiB0eXBlPSJ1bWE6U2VjdGlvbiIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmVkZWNlc3NvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlcyBzdG9yZSB0aGUgZGVzY3JpcHRpb24gdGV4dCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uJ3MgU2VjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWN0aW9uTmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZFVuaXQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29weXJpZ2h0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXV0aG9ycyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJNYWluRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdG9yZXMgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iS2V5Q29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlY3Rpb24iIHR5cGU9InVtYTpTZWN0aW9uIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGFuY2VEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIEd1aWRhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXR0YWNobWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFByYWN0aWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBZGRpdGlvbmFsSW5mbyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBcHBsaWNhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJCYWNrZ3JvdW5kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJHb2FscyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMZXZlbHNPZkFkb3B0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSk8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJvYmxlbSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgV29yayBQcm9kdWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJbXBhY3RPZk5vdEhhdmluZyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgY29uc2VxdWVuY2VzIG9mIG5vdCBwcm9kdWNpbmcgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3JpbmcgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlB1cnBvc2UiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWFzb25zRm9yTm90TmVlZGluZyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsSWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFydGlmYWN0RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBcnRpZmFjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkJyaWVmT3V0bGluZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlcHJlc2VudGF0aW9uT3B0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyYWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkV4dGVybmFsRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFja2FnaW5nR3VpZGFuY2UiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUm9sZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQXNzaWdubWVudEFwcHJvYWNoZXMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBndWlkYW5jZSBvbiBmb3IgYXNzaWduaW5nIGluZGl2aWR1YWxzIHRvIHRoZSBSb2xlIGluIHRlcm1zIG9mIHdoYXQgb3RoZXIgcm9sZXMgdGhlc2UgaW5kaXZpZHVhbHMgY291bGQgcGVyZm9ybSBhbmQgd2hhdCByZXNwb25zaWJpbGl0eSBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgYXNzaWduZWQgdG8gdGhpcyByb2xlIG1pZ2h0IGhhdmUuICBUaGUgZ3VpZGFuY2UgY2FuIGFsc28gZGVzY3JpYmUgZGlmZmVyZW50IGFzc2lnbm1lbnQgYXBwcm9hY2hlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLCBlLmcuIGZvciBsYXJnZSB2ZXJzdXMgc21hbGwgdGVhbXMgd2hlcmUgaW5kaXZpZHVhbHMgY291bGQgYmUgYWxsb2NhdGVkIHRvIHJvbGVzIGZ1bGwgdGltZSB2ZXJzdXMgc2hhcmluZyByb2xlcyB3aXRoaW4gdGhlIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNraWxscyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3lub255bXMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0cyBzeW5vbnltcywgaS5lLiBvdGhlciBuYW1lcyB0aGUgUm9sZSBtaWdodCBiZSByZWZlcnJlZCBieS4gIFRvb2wgc3VwcG9ydCBmb3IgdGhlIG1ldGEtbW9kZWwgbWlnaHQgc3VwcG9ydCB0aGF0IGEgUm9sZSBuYW1lIGNhbiBiZSBjb25zaXN0ZW50bHkgYmUgcmVwbGFjZWQgd2l0aCBvbmUgb2YgaXRzIHN5bm9ueW1zIHRocm91Z2h0IGEgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBbHRlcm5hdGl2ZXMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBhY2hpZXZpbmcgdGhpcyBUYXNrJ3MgZGV2ZWxvcG1lbnQgZ29hbHMgdGhhdCB3ZXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBUYXNrJ3MgU3RlcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlB1cnBvc2UiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4KLVRoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlc2VudGF0aW9uIiB0eXBlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgRGVzY3JpYmFibGUgRWxlbWVudCBoYXMgYSBwcmVzZW50YXRpb24gbmFtZSwgd2hpY2ggaXMgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIG5hbWUgKHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbikgbWlnaHQgYmUgc2V0IHRvICJydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50IiB0byBkaWZmZXJlbnRpYXRlIGZyb20gYSAiajJlZV9hcmNoaXRjdHVyZV9kb2N1bWVudCIgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAiQXJjaGl0ZWN0dXJlIERvY3VtZW50Ii48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaGFwZWljb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im5vZGVpY29uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuCi1Db250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaWJhYmxlRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2hlY2tsaXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29uY2VwdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4YW1wbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJHdWlkZWxpbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzYWJsZUFzc2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV2hpdGVwYXBlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRhbmNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb25jZXB0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2hlY2tsaXN0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFeGFtcGxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSB0eXBpY2FsLCBwYXJ0aWFsbHkgY29tcGxldGVkLCBzYW1wbGUgaW5zdGFuY2Ugb2Ygb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBvciBzY2VuYXJpbyBsaWtlIGRlc2NyaXB0aW9ucyBvZiBob3cgVGFzayBtYXkgYmUgcGVyZm9ybWVkLiBFeGFtcGxlcyBjYW4gYmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3RzIGFzIHdlbGwgYXMgVGFza3MgdGhhdCBwcm9kdWNlIHRoZW0gYXMgd2VsbCBhcyBhbnkgb3RoZXIgQ29udGVudCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHdWlkZWxpbmUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgc2l6aW5nIG1lYXN1cmVzLCBvciBzdGFuZGFyZHMgZm9yIHNpemluZyB0aGUgd29yayBlZmZvcnQgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgYSBwYXJ0aWN1bGFyIHBpZWNlIG9mIHdvcmsgYW5kIGluc3RydWN0aW9ucyBmb3IgdGhlaXIgc3VjY2Vzc2Z1bCB1c2UuIEl0IG1heSBiZSBjb21wcmlzZWQgb2YgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9ucyBhbmQgZXN0aW1hdGlvbiBtZXRyaWNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbk1ldHJpYyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVzdGltYXRpbmdNZXRyaWMiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgZGVzY3JpYmVzIGEgbWV0cmljIG9yIG1lYXN1cmUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCBhbmQgd2hpY2ggaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHdvcmsgZWZmb3J0IGFzIHdlbGwgYXMgYSByYW5nZSBvZiBwb3RlbnRpYWwgbGFib3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBxdWFsaWZpZXMgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9hZG1hcCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2Ugd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4KLUFuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmVwb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVtcGxhdGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNhdGNoYWxsIGZvciBvdGhlciB0eXBlcyBvZiBndWlkYW5jZSBub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgQ29udGVudCBFbGVtZW50cywgaS5lLiBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRvb2xNZW50b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSAgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV2hpdGVwYXBlciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29uY2VwdCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlcm1EZWZpbml0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGRlZmluZXMgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGVybURlZmluaXRpb25zIGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmFjdGljZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuICBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuICBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gIEV4YW1wbGVzIGZvciBwcmFjdGljZXMgd291bGQgYmUgIk1hbmFnZSBSaXNrcyIsICJDb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHkiLCAiQXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCIsIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIj4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFjdGl2aXR5UmVmZXJlbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50UmVmZXJlbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJQcmFjdGljZSIgdHlwZT0idW1hOlByYWN0aWNlIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJldXNhYmxlQXNzZXQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZwotaG93IHRoZSBhc3NldCBzaG91bGQgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3QiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuCi1BIHdvcmsgcHJvZHVjdCBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IGEgdGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcG9ydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRvb2xNZW50b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQXJ0aWZhY3QiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4KLUFydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAib3duIiBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3QiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFpbmVkQXJ0aWZhY3QiIHR5cGU9InVtYTpBcnRpZmFjdCIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyYWJsZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWxpdmVyZWRXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPdXRjb21lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBQcm9kdWN0IHRoYXQgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAKLUEgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNwb25zaWJsZUZvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uCi1BIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAKLUEgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uIAotRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXZlbG9wIFVzZSBDYXNlIE1vZGVsIiBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICJtZXRob2QiIG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQZXJmb3JtZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya0RlZmluaXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgTWV0aG9kIEVsZW1lbnQgdGhhdCBnZW5lcmFsaXplcyBhbGwgZGVzY3JpcHRpb25zIG9mIHdvcmsgd2l0aGluIHRoZSBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUuICBUaGlzIHBhY2thZ2UgaW50cm9kdWNlcyB0d28gY29uY3JldGUgdHlwZXMgb2YgV29yayBEZWZpbml0aW9uczogVGFzayBhbmQgU3RlcC4gIFdvcmsgRGVmaW5pdGlvbnMgY2FuIGNvbnRhaW4gc2V0cyBvZiBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbnMgZGVmaW5pbmcgY29uc3RyYWludHMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkIGJlZm9yZSB0aGUgZGVzY3JpYmVkIHdvcmsgY2FuIGJlZ2luIG9yIGJlZm9yZSBpdCBjYW4gYmUgZGVjbGFyZWQgYXMgZmluaXNoZWQuICBOb3RlIHRoYXQgZ2VuZXJhbCBvd25lZFJ1bGVzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFuZCBydWxlcyBmb3IgV29yayBEZWZpbml0aW9ucy4KLVdvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudENhdGVnb3J5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaXNjaXBsaW5lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LgotQSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRhc2siIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YkRpc2NpcGxpbmUiIHR5cGU9InVtYTpEaXNjaXBsaW5lIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VXb3JrZmxvdyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaXNjaXBsaW5lR3JvdXBpbmciPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+VXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAiU29mdHdhcmUgRGlzY2lwbGluZXMiIHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgIlJlcXVpcmVtZW50cyBNYW5hZ2VtZW50IiBvciAiVGVzdGluZyI7ICJJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50IiB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICJJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyIsICJJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzIiwgb3IgIklUIEVuYWJsaW5nIFNlcnZpY2VzIi4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEaXNjaXBsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRvbWFpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4KLURvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YmRvbWFpbiIgdHlwZT0idW1hOkRvbWFpbiIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlU2V0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPk9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICJBbmFseXN0cyIgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICJCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QiLCAiU3lzdGVtIEFuYWx5c3QiLCBhcyB3ZWxsIGFzICJSZXF1aXJlbWVudHMgU3BlY2lmaWVyIiByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlU2V0R3JvdXBpbmciPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Um9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGVTZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVG9vbCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRvb2xNZW50b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAiQ2xhc3MgRGlhZ3JhbSIsIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAiU3BlY2lmaWNhdGlvbiIsIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICJUZXN0aW5nIiBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNhdGVnb3JpemVkRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViQ2F0ZWdvcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kUGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzZWRQYWNrYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQYWNrYWdlIiB0eXBlPSJ1bWE6TWV0aG9kUGFja2FnZSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnbG9iYWwiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudFBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50RWxlbWVudCIgdHlwZT0idW1hOkNvbnRlbnRFbGVtZW50Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgb25seSBjb250YWlucyBDb250ZW50IENhdGVnb3J5IEVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIHR5cGU9InVtYTpDb250ZW50Q2F0ZWdvcnkiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4KLVByb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaWJhYmxlRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBsYW5uaW5nRGF0YSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFByb2Nlc3MgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4KLVBsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4KLShOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RhcnREYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmaW5pc2hEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icmFuayIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByZXNlbnRlZEFmdGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByZXNlbnRlZEJlZm9yZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQbGFubmluZ0RhdGEiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cGVyQWN0aXZpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gIlNSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzIiB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAiU29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzIiBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAiQ3VzdG9tZXIuQXJjaGl0ZWN0IiB3b3VsZCBkZWZpbmUgYSAiQ3VzdG9tZXIiIHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAiQXJjaGl0ZWN0IiBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzUGxhbm5lZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAiRGV0YWlsIFVzZSBDYXNlIiB3b3VsZCBiZSBwZXJmb3JtZWQgZm9yIGV2ZXJ5IHVzZSBjYXNlIGlkZW50aWZpZWQgZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gb3IgQWN0aXZpdHkuICBHZW5lcmF0aW5nIGEgcGxhbiB3b3VsZCBsaXN0IG9uZSBUYXNrIGluc3RhbmNlIHBlciB1c2UgY2FzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc09wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrT3JkZXIiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgCi1UaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6c2ltcGxlQ29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImxpbmtUeXBlIiB0eXBlPSJ1bWE6V29ya09yZGVyVHlwZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6c2ltcGxlQ29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHByb3ZpZGVzIHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlcHJlc2VudCBvciByZWZlciB0byBXb3JrIERlZmluaXRpb25zLiAgRm9yIGV4YW1wbGUgaXRzIHN1YmNsYXNzIEFjdGl2aXR5IGRlZmluZXMgd29yayBhcyBpdCBpcyBhbHNvIGEgc3ViY2xhc3Mgb2YgV29yayBEZWZpbml0aW9uLiAgSXRzIHN1YmNsYXNzIFRhc2sgRGVzY3JpcHRvciBkb2VzIG5vdCBkZWZpbmUgd29yayBieSBpdHNlbGYsIGJ1dCByZWZlcnMgdG8gYSBXb3JrIERlZmluaXRpb24gYW5kIHRoZXJlZm9yZSBjYW4gaGF2ZSB0aGUgc2FtZSBjb21tb24gcHJvcGVydGllcyBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCBoYXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWRlY2Vzc29yIiB0eXBlPSJ1bWE6V29ya09yZGVyIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzUmVwZWF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgcmVwZXRpdGlvbiBvZiB3b3JrLCBlLmcuIGl0ZXJhdGlvbnMuICBBIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIHdpdGggdGhpcyBhdHRyaWJ1dGUgc2V0IHRvIFRydWUgc2hhbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgc2V0IG9mIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBmb3IgYW4gaW5zdGFuY2Ugb2YgSXRlcmF0aW9uIChkZWZpbmVkIGFzIGEgc3BlY2lhbCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBiZWxvdykgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgYnkgZGVmYXVsdCBpbmRpY2F0aW5nIHRoYXQgZXZlcnkgc3ViLUFjdGl2aXR5IHdpbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBIb3dldmVyLCBhbnkgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY2FuIHNldCB0aGlzIGF0dHJpYnV0ZSB0byBUcnVlIHRvIGRlZmluZSBpdGVyYXRpb25zIChlLmcuIHRvIGl0ZXJhdGUgb25lIEFjdGl2aXR5IGNvbnNpc3Rpbmcgb2YgbWFueSBzdWItYWN0aXZpdGllcyBvciBldmVuIFBoYXNlcywgYnV0IHRvIGl0ZXJhdGUganVzdCBvbmUgVGFzaykuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNPbmdvaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0aGUgaXNPbmdvaW5nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBpbnN0YW5jZSwgdGhlbiB0aGUgZWxlbWVudCBkZXNjcmliZXMgYW4gb25nb2luZyBwaWVjZSBvZiB3b3JrIHdpdGhvdXQgYSBmaXhlZCBkdXJhdGlvbiBvciBlbmQgc3RhdGUuICBGb3IgZXhhbXBsZSwgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIG9mIGFuIGFkbWluaXN0cmF0b3IgY29udGludW91c2x5IChlLmcuIDNoIGEgZGF5KSB3b3JraW5nIHRvIGVuc3VyZSB0aGF0IHN5c3RlbXMgYXJlIGtlcHQgaW4gYSBjZXJ0YWluIHN0YXRlLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHByb2dyYW0gbWFuYWdlbWVudCB3b3JrIG92ZXJzZWVpbmcgbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYmVpbmcgc2NoZWR1bGVkIGZvciBvbmUgcGFydGljdWxhciBwcm9qZWN0IGF0IHNwZWNpZmljIHJlb2NjdXJyaW5nIGludGVydmFscyBkdXJpbmcgdGhlIHdob2xlIGxpZmVjeWNsZSBvZiB0aGUgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc0V2ZW50RHJpdmVuIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuCi08L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNaWxlc3RvbmUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya0JyZWFrZG93bkVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBY3Rpdml0eSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uCi1BY3Rpdml0eSByZXByZXNlbnRzIGEgZ3JvdXBpbmcgZWxlbWVudCBmb3Igb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4gIEl0IGlzIG5vdCBwZXItc2UgYSAnaGlnaC1sZXZlbCcgZ3JvdXBpbmcgb2Ygb25seSB3b3JrIGFzIGluIG90aGVyIG1ldGEtbW9kZWxzLCBidXQgZ3JvdXBzIGFueSBraW5kIG9mIEJyZWFrZG93biBFbGVtZW50cy4gIEZvciBleGFtcGxlLCBvbmUgY2FuIGRlZmluZSB2YWxpZCBBY3Rpdml0aWVzIHRoYXQgZ3JvdXAgb25seSBXb3JrIFByb2R1Y3RzIERlc2NyaXB0b3JzIHdpdGhvdXQgYW55IG1hdGNoaW5nIFRhc2sgRGVzY3JpcHRvcnMuICBBY3Rpdml0aWVzIGFsc28gaW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIGluZGlyZWN0bHkgZnJvbSBQcm9jZXNzIEVsZW1lbnQ7IGkuZS4gQWN0aXZpdHkgaXMgcmVhZHkgdG8gaGF2ZSBhIGZ1bGwgY29udGVudCBkZXNjcmlwdGlvbiBhdHRhY2hlZCB0byBpdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiB0eXBlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNoZWNrbGlzdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbmNlcHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeGFtcGxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR3VpZGVsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9hZG1hcCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldXNhYmxlQXNzZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXaGl0ZXBhcGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHR5cGU9InVtYTpWYXJpYWJpbGl0eVR5cGUiLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iSXNFbmFjdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGhhc2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotUGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikl0ZXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi1JdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLik8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InVzYWdlR3VpZGFuY2UiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQWN0aXZpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFsdGVybmF0aXZlcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIHRoaXMgQWN0aXZpdHkgbm90IGNvdmVyZWQgYnkgdGhlIEFjdGl2aXR5J3MgVGFza3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikhvd1RvU3RhZmYiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlZmluZWREZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgRGVzY3JpcHRvciBtaWdodCBhZGQgcmVmaW5lbWVudHMgdG8gdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgdGhlIENvbnRlbnQgRWxlbWVudCBpdCByZWZlcnMgdG8uICBGb3IgZXhhbXBsZSwgaXQgY291bGQgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgV29yayBQcm9kdWN0IHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWMgcG9pbnQgaW4gdGltZSBpbiB0aGUgcHJvY2VzcyB0aGlzIFdvcmsgUHJvZHVjdCB0eXBlIGlzIGJlaW5nIHVzZWQuICBJdCBjb3VsZCBkZXNjcmliZSBhZGRpdGlvbmFsIHNraWxscyBuZWVkZWQgZm9yIGEgUm9sZSBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiBhIHByb2Nlc3MsIGV0Yy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEFjdGl2aXR5IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2NvcGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVXNhZ2VOb3RlcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFueSBhZGRpdGlvbmFsIG5vdGVzIG9uIGhvdyB0byBhcHBseSBhbmQgaW5zdGFudGlhdGUgdGhpcyBwcm9jZXNzIGZvciBhIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXh0ZXJuYWxJZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgZGVsaXZlcnkgcGF0dGVybnMgYW5kIG1vZGVscy4gSXQgaXMgdXNlZCBsaWtlIGEgc3lub255bS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIFByb2Nlc3MgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlbGl2ZXJ5IFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzRGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNjYWxlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzczwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSaXNrTGV2ZWwiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdXRsaW5lcyB0eXBpY2FsIHByb2plY3Qgcmlza3MgdGhhdCBhcmUgYWRkcmVzc2VkIHdpdGggdGhpcyBwcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFc3RpbWF0aW5nVGVjaG5pcXVlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJvamVjdE1lbWJlckV4cGVydGlzZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGEgcHJvZmlsZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0ZWFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHJvbGVzLCBza2lsbHMgcmVxdWlyZWQgZm9yIGEgdGVhbSBwZXJmb3JtcyBhIHByb2plY3QgYmFzZWQgb24gdGhpcyBwcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUeXBlT2ZDb250cmFjdCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvSSdtIGNoYUknbSBudHJhY3RzIHRoYXQgbmVlZCB0byBiZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIGEgcHJvamVjdCB0ZWFtIHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9jZXNzIGFuZCBhIGNsaWVudCAoZS5nLiBmb3IgYW4gSUdTIGVuZ2FnZW1lbnQpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLgotRGVzY3JpcHRvcnMgYXJlIHRoZSBrZXkgY29uY2VwdCBmb3IgcmVhbGl6aW5nIHRoZSBzZXBhcmF0aW9uIG9mIHByb2Nlc3NlcyBmcm9tIG1ldGhvZCBjb250ZW50LiAgQSBEZXNjcmlwdG9yIGNhbiBiZSBjaGFyYWN0ZXJpemVkIGFzIGEgcmVmZXJlbmNlIG9iamVjdCBmb3Igb25lIHBhcnRpY3VsYXIgQ29udGVudCBFbGVtZW50LCB3aGljaCBoYXMgaXRzIG93biByZWxhdGlvbnNoaXBzIGFuZCBwcm9wZXJ0aWVzLiAgV2hlbiBhIERlc2NyaXB0b3IgaXMgY3JlYXRlZCBpdCBzaGFsbCBiZSBwcm92aWRlZCB3aXRoIGNvbmdydWVudCBjb3BpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgdGhlIHJlZmVyZW5jZWQgY29udGVudCBlbGVtZW50LiAgSG93ZXZlciwgYSB1c2VyIGNhbiBtb2RpZnkgdGhlc2UgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBzaXR1YXRpb24gZm9yIHdoaWNoIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaXB0b3IiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IldvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkltcGFjdGVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbXBhY3RzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVsaXZlcmFibGVQYXJ0cyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICAKLUZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY3Rpdml0eUV4aXRTdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5HaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEV4aXN0IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGZpbmlzaGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBoYXMgZmluaXNoZWQgdGhhdCBoYXZlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgb3V0cHV0KS4KLUZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlRGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBSb2xlIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBSb2xlIERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaXB0b3IiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJvbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlc3BvbnNpYmxlRm9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGFza0Rlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4KLUEga2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGFzayIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQZXJmb3JtZWRQcmltYXJpbHlCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFzc2lzdGVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeHRlcm5hbElucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFuZGF0b3J5SW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcHRpb25hbElucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3V0cHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9IlN0ZXAiIHR5cGU9InVtYTpTZWN0aW9uIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbXBvc2l0ZVJvbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuCi1BIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlJvbGVEZXNjcmlwdG9yIj4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFnZ3JlZ2F0ZWRSb2xlIiB0eXBlPSJ1bWE6Um9sZSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZWFtUHJvZmlsZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuCi1Xb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuCi1IZW5jZSwgaW4gYWRkaXRpb24gdG8gdGhlIHdvcmsgYnJlYWtkb3duIGFuZCB3b3JrIHByb2R1Y3QgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVmaW5lZCBzbyBmYXIsIFRlYW0gUHJvZmlsZXMgYXJlIHVzZWQgdG8gZGVmaW5lIGEgdGhpcmQgdHlwZSBvZiBicmVha2Rvd24gc3RydWN0dXJlOiB0ZWFtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlc2UgYXJlIGNyZWF0ZWQgYXMgYW4gQWN0aXZpdHkgc3BlY2lmaWMgaGllcmFyY2h5IG9mIFRlYW0gUHJvZmlsZXMgY29tcHJpc2luZyBvZiBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFRoZXNlIHN0cnVjdHVyZXMgY2FuIGJlIHByZXNlbnRlZCBhcyB3ZWxsLWtub3duIE9yZy1DaGFydHMuICBKdXN0IGFzIHdpdGggYW55IG90aGVyIEJyZWFrZG93biBFbGVtZW50IGFuZCBEZXNjcmlwdG9ycywgVGVhbSBQcm9maWxlcyBjYW4gYmUgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFueSBBY3Rpdml0eSBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJbiBvdGhlciB3b3JkcyBldmVyeSBBY3Rpdml0eSBjYW4gZGVmaW5lIGl0cyBvd24gVGVhbSBQcm9maWxlcyBjb25zaXN0aW5nIG9mIEFjdGl2aXR5IHNwZWNpZmljIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVHlwaWNhbGx5LCBUZWFtIFByb2ZpbGVzIGFyZSBkZWZpbmVkIG9uIHRoZSBsZXZlbCBvZiBJdGVyYXRpb25zIG9yIFBoYXNlcyBvciBvdGhlciBoaWdoZXItbGV2ZWwgQWN0aXZpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cGVyVGVhbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViVGVhbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4KLUNvcmUgTWV0aG9kIENvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgdmVyeSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVGh1cywgYSBwcm9jZXNzIGlzIGEgc2V0IG9mIHBhcnRpYWxseSBvcmRlcmVkIHdvcmsgZGVzY3JpcHRpb25zIGludGVuZGVkIHRvIHJlYWNoIGEgaGlnaGVyIGRldmVsb3BtZW50IGdvYWwsIHN1Y2ggYXMgdGhlIHJlbGVhc2Ugb2YgYSBzcGVjaWZpYyBzb2Z0d2FyZSBzeXN0ZW0uICBBIHByb2Nlc3MgYW5kIHRoZSBwcm9jZXNzIG1ldGEtbW9kZWwgc3RydWN0dXJlIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGZvY3VzZXMgb24gdGhlIGxpZmVjeWNsZSBhbmQgdGhlIHNlcXVlbmNpbmcgb2Ygd29yayBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRvIGFjaGlldmUgdGhpcyBpdCB1c2VzIHRoZSBEZXNjcmlwdG9yIGNvbmNlcHQgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIGFsbG93aW5nIGRlZmluaW5nIHRpbWUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgY29udGVudCAoZS5nLiBkZWZpbmluZyBhIGZvY3VzIG9uIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUgc2FtZSBUYXNrIGFuZCBwcm92aWRpbmcgaW5wdXQgV29yayBQcm9kdWN0cyBpbiBkaWZmZXJlbnQgc3RhdGVzIHdpdGhpbiB0aGUgZGlmZmVyZW50IFBoYXNlcyBvZiBhIHByb2Nlc3MgbGlmZWN5Y2xlIGluIHdoaWNoIHRoZSBzYW1lIFRhc2sgaXMgcGVyZm9ybWVkKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iSW5jbHVkZXNQYXR0ZXJuIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRlZmF1bHRDb250ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJWYWxpZENvbnRleHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyeVByb2Nlc3MiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuCi1BIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYSBQcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIGZyb20gYmVnaW5uaW5nIHRvIGVuZC4gIEEgRGVsaXZlcnkgUHJvY2VzcyBzaGFsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHBsYW5uaW5nIGFuZCBydW5uaW5nIGEgcHJvamVjdC4gIEl0IHByb3ZpZGVzIGEgY29tcGxldGUgbGlmZWN5Y2xlIG1vZGVsIHdpdGggcHJlZGVmaW5lZCBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIGRldGFpbGVkIGJ5IHNlcXVlbmNpbmcgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJdCBpcyBkZWZpbmVkIG9uIHRoZSBiYXNpcyBvZiBleHBlcmllbmNlIHdpdGggcGFzdCBwcm9qZWN0cyBvciBlbmdhZ2VtZW50cywgYW5kL29yIHRoZSBiZXN0IHByYWN0aWNlIHVzZSBvZiBhIGRldmVsb3BtZW50IG9yIGRlbGl2ZXJ5IGFwcHJvYWNoLiAgSXQgZGVmaW5lcyB3aGF0IGdldHMgcHJvZHVjZWQsIGhvdyB0aG9zZSBpdGVtcyBhcmUgcHJvZHVjZWQsIGFuZCB0aGUgcmVxdWlyZWQgc3RhZmZpbmcgaW4gdGhlIGZvcm0gb2YgaW50ZWdyYXRlZCBXb3JrLCBXb3JrIFByb2R1Y3QsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGUsIGEgcHJvY2VzcyBlbmdpbmVlciBjYW4gZGVmaW5lIGFsdGVybmF0aXZlIERlbGl2ZXJ5IFByb2Nlc3NlcyBmb3Igc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdHMgdGhhdCBkaWZmZXIgaW4gdGhlIHNjYWxlIG9mIHRoZSBlbmdhZ2VtZW50IGFuZCBzdGFmZmluZyBuZWNlc3NhcnksIHRoZSB0eXBlIG9mIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiB0byBiZSBkZXZlbG9wZWQsIHRoZSBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCB0ZWNobm9sb2dpZXMgdG8gYmUgdXNlZCwgZXRjLiAgQWx0aG91Z2gsIHRoZSBEZWxpdmVyeSBQcm9jZXNzIGFpbXMgdG8gY292ZXIgYSB3aG9sZSBwcm9qZWN0IGl0IGtlZXBzIGNlcnRhaW4gZGVjaXNpb24gdGhhdCBhcmUgdG9vIHByb2plY3Qgc3BlY2lmaWMgb3Blbi4gIEZvciBleGFtcGxlLCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmVzIHdoaWNoIEJyZWFrZG93biBFbGVtZW50cyBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9yIGlzIHJlcGVhdGFibGUgdmlhIGl0IHJlc3BlY3RpdmUgYXR0cmlidXRlcywgYnV0IGRvZXMgbm90IHNheSBob3cgbWFueSBvY2N1cnJlbmNlcyBhbmQgaG93IG1hbnkgcmVwZWF0cy9pdGVyYXRpb25zIGl0IHdpbGwgaGF2ZS4gIFRoZXNlIGRlY2lzaW9ucyBoYXZlIHRvIGJlIGRvbmUgYnkgYSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhIGNvbmNyZXRlIHByb2plY3QsIHByb2plY3QgcGhhc2UsIG9yIHByb2plY3QgaXRlcmF0aW9ucy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhbHdheXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhIHByb2Nlc3MgaW4gdGVybXMgb2YgY29tcGxldGVuZXNzIG9mIHRoZSBsaWZlY3ljbGUsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgYWxsIHRocmVlIHZpZXdzIG9uIHRoZSBwcm9jZXNzIHdoaWNoIGFyZSB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBoYXZlIHRvIGJlIGZ1bGx5IGFuZCBjb25zaXN0ZW50bHkgcG9wdWxhdGVkLiAgQ29uc2lzdGVuY3kgb2YgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFjdHVhbGx5IGVuc3VyZWQgYnkgdGhlIGZhY3QgdGhhdCBhbGwgdGhyZWUgYnJlYWtkb3ducyBhcmUgcmVwcmVzZW50ZWQgYnkgb25lIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSBhbmQgb25lIHBhcnRpY3VsYXIgYnJlYWtkb3duIHN1Y2ggYXMgVGVhbSBCcmVha2Rvd24gaXMganVzdCBhIHZpZXcgb24gdGhhdCBkYXRhIHN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3MiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRWR1Y2F0aW9uTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgUGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIERpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLgotQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6Ci0tIFRvIHNlcnZlIGFzIGJ1aWxkaW5nIGJsb2NrcyBmb3IgYXNzZW1ibGluZyBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMuICBOb3JtYWxseSBkZXZlbG9waW5nIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBub3QgZG9uZSBmcm9tIHNjcmF0Y2ggYnV0IGJ5IHN5c3RlbWF0aWNhbGx5IGFwcGx5aW5nIGFuZCBiaW5kaW5nIHBhdHRlcm5zLiAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIHBhdHRlcm4gYXBwbGljYXRpb24gb2YgJ2NvcHktYW5kLW1vZGlmeScsIHdoaWNoIGFsbG93cyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBpbmRpdmlkdWFsbHkgY3VzdG9taXplIHRoZSBwYXR0ZXJuJ3MgY29udGVudCB0byB0aGUgcGFydGljdWxhciBzaXR1YXRpb24gaXQgaXMgYXBwbGllZCBmb3IsIHRoZSBQbHVnaW4gbWV0YS1tb2RlbCBwYWNrYWdlIChTZWN0aW9uIDYuMSkgaW50cm9kdWNlcyBldmVuIG1vcmUgc29waGlzdGljYXRlZCBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIHRoYXQgc3VwcG9ydCBkeW5hbWljIGJpbmRpbmcgb2YgcGF0dGVybnMgKGkuZS4gdGhlIHBhdHRlcm4gaXMgcmVmZXJlbmNlZCBhbmQgbm90IGNvcGllZCkuICBUaGlzIHVuaXF1ZSBuZXcgd2F5IG9mIHJldXNpbmcgcHJvY2VzcyBrbm93bGVkZ2UgYWxsb3dzIHRvIGZhY3RvciBvdXQgY29tbW9ubHkgcmVvY2N1cnJpbmcgQWN0aXZpdGllcyBpbnRvIHBhdHRlcm5zIGFuZCB0byBhcHBseSB0aGVtIG92ZXIgYW5kIG92ZXIgYWdhaW4gZm9yIGEgcHJvY2Vzcy4gIFdoZW4gdGhlIHBhdHRlcm4gaXMgYmVpbmcgcmV2aXNlZCBvciB1cGRhdGVkLCBhbGwgY2hhbmdlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkIGluIGFsbCBwYXR0ZXJuIGFwcGxpY2F0aW9uIGluIGFsbCBwcm9jZXNzZXMgYmVjYXVzZSBvZiB0aGUgZHluYW1pYyBiaW5kaW5nLgotLSBUbyBzdXBwb3J0IGRpcmVjdCBleGVjdXRpb24gaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgd29yayBmb2xsb3dpbmcgYSB3ZWxsLWRlZmluZWQgcHJvY2VzcywgYnV0IHdvcmtzIGJhc2VkIG9uIGxvb3NlbHkgY29ubmVjdGVkIHByb2Nlc3MgZnJhZ21lbnRzIG9mIGJlc3QgcHJhY3RpY2VzIGluIGEgZmxleGlibGUgbWFubmVyIChlLmcuIEFnaWxlIERldmVsb3BtZW50KS4KLS0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2VzcyIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgaXMgcHJlcGFyZWQgZm9yIGluc3RhbnRpYXRpb24gYnkgYSBwcm9qZWN0IHBsYW5uaW5nIHRvb2wuICBUeXBpY2FsbHksIGl0IGlzIGNyZWF0ZWQgYmFzZWQgb24gYSBQcm9jZXNzIHN1Y2ggYXMgYSBEZWxpdmVyeSBQcm9jZXNzIGFzIGEgd2hvbGUgKGUuZy4gaW4gY2FzZSBvZiBhIHdhdGVyZmFsbC1iYXNlZCBkZXZlbG9wbWVudCBhcHByb2FjaCkgb3IgaW4gcGFydHMgKGUuZy4gaW4gY2FzZSBvZiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpLgotQSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzIj4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJhc2VQcm9jZXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIFByb2Nlc3MgRWxlbWVudHMsIG9ubHkuCi1BIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9jZXNzRWxlbWVudCIgdHlwZT0idW1hOlByb2Nlc3NFbGVtZW50Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Q29tcHJpc2VzIG9mIGEgbGlzdCBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKHNpbWlsYXIgdG8gb3BlcmF0aW9uIGRlY2xhcmF0aW9ucykgdGhhdCBleHByZXNzIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudC4gIFRoZXNlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBhcmUgZXhwcmVzc2VkIHVzaW5nIFRhc2sgRGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBhIFJvbGUgRGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZXJmYWNlU3BlY2lmaWNhdGlvbiIgdHlwZT0idW1hOlRhc2tEZXNjcmlwdG9yIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcmZhY2VJTyIgdHlwZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzQ29tcG9uZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIFBhY2thZ2UgdGhhdCBhcHBsaWVzIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uICBBIFByb2Nlc3MgQ29tcG9uZW50IHJlYWxpemVzIG9uZSBvciBtb3JlIEludGVyZmFjZXMgd2hpY2ggc3BlY2lmeSBpbnB1dHMgYW5kIG91dHB1dHMgb2YgdGhlIGNvbXBvbmVudC4gVGhlcmUgbWlnaHQgYmUgbWFueSBjb21wb25lbnRzIHJlYWxpemluZyB0aGUgc2FtZSBpbnRlcmZhY2VzLCBidXQgdXNpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgdG8gYWNoaWV2ZSBzaW1pbGFyIG91dHB1dHMgZm9yIHNpbWlsYXIgaW5wdXRzLiAgV2hlcmVhcyB0aGUgQ29tcG9uZW50IEludGVyZmFjZXMgcmVwcmVzZW50IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyAoYmxhY2sgYm94IGRlc2NyaXB0aW9ucyBvZiB0aGUgY29tcG9uZW50KSwgZ29vZCBjYW5kaWRhdGVzIGZvciBjb21wb25lbnQgcmVhbGl6YXRpb25zIGNhbiBiZSBmb3VuZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zICh3aGl0ZSBib3ggZGVzY3JpcHRpb25zIGZvciB0aGUgY29tcG9uZW50KS4KLVVNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAiYmxhY2sgYm94Ii4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgInJlYWxpemF0aW9uIiBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzUGFja2FnZSI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29weXJpZ2h0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkludGVyZmFjZSIgdHlwZT0idW1hOlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2Nlc3MiIHR5cGU9InVtYTpQcm9jZXNzIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXV0aG9ycyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kUGx1Z2luIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgVW5pdCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuCi1NZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4KLVNwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVmZXJlbmNlZE1ldGhvZFBsdWdpbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iTWV0aG9kUGFja2FnZSIgdHlwZT0idW1hOk1ldGhvZFBhY2thZ2UiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1c2VyQ2hhbmdlYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBsdWdpbiIgdHlwZT0idW1hOk1ldGhvZFBsdWdpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi1TcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iQmFzZUNvbmZpZ3VyYXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1ldGhvZFBsdWdpblNlbGVjdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iTWV0aG9kUGFja2FnZVNlbGVjdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEZWZhdWx0VmlldyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJvY2Vzc1ZpZXciIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIHR5cGU9InVtYTpNZXRob2RDb25maWd1cmF0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZExpYnJhcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iTWV0aG9kUGx1Z2luIiB0eXBlPSJ1bWE6TWV0aG9kUGx1Z2luIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiB0eXBlPSJ1bWE6TWV0aG9kQ29uZmlndXJhdGlvbiIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kTGlicmFyeSIgdHlwZT0idW1hOk1ldGhvZExpYnJhcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQWN0aXZpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE4MDQ5OWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFjdGl2aXR5LmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZpdHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uCi0gKiBBY3Rpdml0eSByZXByZXNlbnRzIGEgZ3JvdXBpbmcgZWxlbWVudCBmb3Igb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4gIEl0IGlzIG5vdCBwZXItc2UgYSAnaGlnaC1sZXZlbCcgZ3JvdXBpbmcgb2Ygb25seSB3b3JrIGFzIGluIG90aGVyIG1ldGEtbW9kZWxzLCBidXQgZ3JvdXBzIGFueSBraW5kIG9mIEJyZWFrZG93biBFbGVtZW50cy4gIEZvciBleGFtcGxlLCBvbmUgY2FuIGRlZmluZSB2YWxpZCBBY3Rpdml0aWVzIHRoYXQgZ3JvdXAgb25seSBXb3JrIFByb2R1Y3RzIERlc2NyaXB0b3JzIHdpdGhvdXQgYW55IG1hdGNoaW5nIFRhc2sgRGVzY3JpcHRvcnMuICBBY3Rpdml0aWVzIGFsc28gaW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIGluZGlyZWN0bHkgZnJvbSBQcm9jZXNzIEVsZW1lbnQ7IGkuZS4gQWN0aXZpdHkgaXMgcmVhZHkgdG8gaGF2ZSBhIGZ1bGwgY29udGVudCBkZXNjcmlwdGlvbiBhdHRhY2hlZCB0byBpdC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldEJyZWFrZG93bkVsZW1lbnQgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRDaGVja2xpc3QgPGVtPkNoZWNrbGlzdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0Q29uY2VwdCA8ZW0+Q29uY2VwdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0R3VpZGVsaW5lIDxlbT5HdWlkZWxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFJvYWRtYXAgPGVtPlJvYWRtYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFJldXNhYmxlQXNzZXQgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFdoaXRlcGFwZXIgPGVtPldoaXRlcGFwZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2lzSXNFbmFjdGFibGUgPGVtPklzIEVuYWN0YWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdBY3Rpdml0eScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjdGl2aXR5IGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlY29uZGl0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfUHJlY29uZGl0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZWNvbmRpdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlY29uZGl0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBvc3Rjb25kaXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9Qb3N0Y29uZGl0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Bvc3Rjb25kaXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UG9zdGNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UG9zdGNvbmRpdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI2JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JyZWFrZG93bkVsZW1lbnQnIGdyb3VwPScjZ3JvdXA6MjYnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRCcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoZWNrbGlzdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoZWNrbGlzdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfQ2hlY2tsaXN0KCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NoZWNrbGlzdCcgZ3JvdXA9JyNncm91cDoyNiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENoZWNrbGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uY2VwdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmNlcHQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X0NvbmNlcHQoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29uY2VwdCcgZ3JvdXA9JyNncm91cDoyNiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENvbmNlcHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGFtcGxlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9FeGFtcGxlKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4YW1wbGUnIGdyb3VwPScjZ3JvdXA6MjYnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkd1aWRlbGluZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkd1aWRlbGluZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfR3VpZGVsaW5lKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0d1aWRlbGluZScgZ3JvdXA9JyNncm91cDoyNiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEd1aWRlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um9hZG1hcDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvYWRtYXA8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X1JvYWRtYXAoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUm9hZG1hcCcgZ3JvdXA9JyNncm91cDoyNiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFJvYWRtYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9SZXVzYWJsZUFzc2V0KCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JldXNhYmxlQXNzZXQnIGdyb3VwPScjZ3JvdXA6MjYnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRSZXVzYWJsZUFzc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfU3VwcG9ydGluZ01hdGVyaWFsKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1cHBvcnRpbmdNYXRlcmlhbCcgZ3JvdXA9JyNncm91cDoyNiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V2hpdGVwYXBlcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldoaXRlcGFwZXI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X1doaXRlcGFwZXIoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV2hpdGVwYXBlcicgZ3JvdXA9JyNncm91cDoyNiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFdoaXRlcGFwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SXMgRW5hY3RhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEVuYWN0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjdW5zZXRJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjc2V0SXNFbmFjdGFibGUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfSXNFbmFjdGFibGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nSXNFbmFjdGFibGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNFbmFjdGFibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2lzSXNFbmFjdGFibGUgPGVtPklzIEVuYWN0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRW5hY3RhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICN1bnNldElzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICNpc0lzRW5hY3RhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0VuYWN0YWJsZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjaXNJc0VuYWN0YWJsZSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICNpc0lzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICNzZXRJc0VuYWN0YWJsZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNFbmFjdGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjaXNJc0VuYWN0YWJsZSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFbmFjdGFibGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICNpc0lzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICNzZXRJc0VuYWN0YWJsZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNFbmFjdGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4ibmEiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgI2lzU2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICN1bnNldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfVmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0ibmEiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ndmFyaWFiaWxpdHlUeXBlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgI2lzU2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICN1bnNldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotfSAvLyBBY3Rpdml0eQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FjdGl2aXR5RGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FjdGl2aXR5RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmVlNzUzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BY3Rpdml0eURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBY3Rpdml0eURlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNyBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBY3Rpdml0eS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEhvd1RvU3RhZmYgPGVtPkhvdyBUbyBTdGFmZjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0FjdGl2aXR5RGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBY3Rpdml0eURlc2NyaXB0aW9uIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIENvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIHRoaXMgQWN0aXZpdHkgbm90IGNvdmVyZWQgYnkgdGhlIEFjdGl2aXR5J3MgVGFza3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsdGVybmF0aXZlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWx0ZXJuYXRpdmVzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWx0ZXJuYXRpdmVzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFsdGVybmF0aXZlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SG93IFRvIFN0YWZmPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ib3cgVG8gU3RhZmY8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEhvd1RvU3RhZmYoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd1RvU3RhZmYoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSG93VG9TdGFmZiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRIb3dUb1N0YWZmKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEhvd1RvU3RhZmYgPGVtPkhvdyBUbyBTdGFmZjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SG93IFRvIFN0YWZmPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIb3dUb1N0YWZmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIb3dUb1N0YWZmKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIEFjdGl2aXR5LCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0aXZpdHkgYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhY2hpZXZlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QdXJwb3NlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQdXJwb3NlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1B1cnBvc2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHVycG9zZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QdXJwb3NlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQdXJwb3NlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQWN0aXZpdHlEZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FydGlmYWN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BcnRpZmFjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4N2Y2ZjQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FydGlmYWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFydGlmYWN0LmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJ0aWZhY3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLgotICogQXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICJvd24iIGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0I2dldENvbnRhaW5lZEFydGlmYWN0IDxlbT5Db250YWluZWQgQXJ0aWZhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3QoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0FydGlmYWN0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXJ0aWZhY3QgZXh0ZW5kcyBXb3JrUHJvZHVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0X0dyb3VwMygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRhaW5lZCBBcnRpZmFjdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRhaW5lZCBBcnRpZmFjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhaW5lZCBBcnRpZmFjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3QoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdCIgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbnRhaW5lZEFydGlmYWN0JyBncm91cD0nI2dyb3VwOjI3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Q29udGFpbmVkQXJ0aWZhY3QoKTsKLQotfSAvLyBBcnRpZmFjdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FydGlmYWN0RGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FydGlmYWN0RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzY0OWM1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BcnRpZmFjdERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFydGlmYWN0RGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI3IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFydGlmYWN0IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBcnRpZmFjdC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldEJyaWVmT3V0bGluZSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXJ0aWZhY3REZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFydGlmYWN0RGVzY3JpcHRpb24gZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CcmllZiBPdXRsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CcmllZiBPdXRsaW5lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRCcmllZk91dGxpbmUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCcmllZk91dGxpbmUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QnJpZWZPdXRsaW5lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldEJyaWVmT3V0bGluZSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QnJpZWYgT3V0bGluZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QnJpZWZPdXRsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCcmllZk91dGxpbmUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVwcmVzZW50YXRpb25PcHRpb25zJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQXJ0aWZhY3REZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0JyZWFrZG93bkVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0JyZWFrZG93bkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmU1ZDdjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9CcmVha2Rvd25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCcmVha2Rvd25FbGVtZW50LmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNyBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEFmdGVyIDxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQmVmb3JlIDxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFBsYW5uaW5nRGF0YSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXR5IDxlbT5TdXBlciBBY3Rpdml0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0lzT3B0aW9uYWwgPGVtPklzIE9wdGlvbmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNQbGFubmVkIDxlbT5JcyBQbGFubmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0JyZWFrZG93bkVsZW1lbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCcmVha2Rvd25FbGVtZW50IGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlc2VudGVkQWZ0ZXIoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZXNlbnRlZEFmdGVyJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByZXNlbnRlZEFmdGVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEFmdGVyIDxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlc2VudGVkQWZ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRlZEFmdGVyKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZXNlbnRlZEJlZm9yZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZXNlbnRlZEJlZm9yZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVzZW50ZWRCZWZvcmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQmVmb3JlIDxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRCZWZvcmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRlZEJlZm9yZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQbGFubmluZ0RhdGEoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQbGFubmluZ0RhdGEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGxhbm5pbmdEYXRhKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFBsYW5uaW5nRGF0YSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQbGFubmluZ0RhdGEoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdXBlciBBY3Rpdml0eTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBlciBBY3Rpdml0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3VwZXJBY3Rpdml0eShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0eSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3VwZXJBY3Rpdml0eSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTdXBlckFjdGl2aXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFN1cGVyQWN0aXZpdHkgPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBlciBBY3Rpdml0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3VwZXJBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3VwZXJBY3Rpdml0eShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBKdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXRhaWwgVXNlIENhc2UiIHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQHNlZSAjdW5zZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICNzZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICN1bnNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBzZWUgI2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBzZWUgI3NldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBzZWUgI3NldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNPcHRpb25hbCgpCi0JICogQHNlZSAjdW5zZXRJc09wdGlvbmFsKCkKLQkgKiBAc2VlICNzZXRJc09wdGlvbmFsKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpc09wdGlvbmFsJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzT3B0aW9uYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNPcHRpb25hbCgpCi0JICogQHNlZSAjdW5zZXRJc09wdGlvbmFsKCkKLQkgKiBAc2VlICNpc0lzT3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzT3B0aW9uYWwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc09wdGlvbmFsKCkKLQkgKiBAc2VlICNpc0lzT3B0aW9uYWwoKQotCSAqIEBzZWUgI3NldElzT3B0aW9uYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzT3B0aW9uYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0lzT3B0aW9uYWwgPGVtPklzIE9wdGlvbmFsPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBPcHRpb25hbDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNPcHRpb25hbCgpCi0JICogQHNlZSAjaXNJc09wdGlvbmFsKCkKLQkgKiBAc2VlICNzZXRJc09wdGlvbmFsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc09wdGlvbmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFBsYW5uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNQbGFubmVkKCkKLQkgKiBAc2VlICN1bnNldElzUGxhbm5lZCgpCi0JICogQHNlZSAjc2V0SXNQbGFubmVkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2lzUGxhbm5lZCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc1BsYW5uZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc1BsYW5uZWQgPGVtPklzIFBsYW5uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIFBsYW5uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNQbGFubmVkKCkKLQkgKiBAc2VlICN1bnNldElzUGxhbm5lZCgpCi0JICogQHNlZSAjaXNJc1BsYW5uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzUGxhbm5lZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0lzUGxhbm5lZCA8ZW0+SXMgUGxhbm5lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc1BsYW5uZWQoKQotCSAqIEBzZWUgI2lzSXNQbGFubmVkKCkKLQkgKiBAc2VlICNzZXRJc1BsYW5uZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzUGxhbm5lZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNQbGFubmVkIDxlbT5JcyBQbGFubmVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQbGFubmVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc1BsYW5uZWQoKQotCSAqIEBzZWUgI2lzSXNQbGFubmVkKCkKLQkgKiBAc2VlICNzZXRJc1BsYW5uZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzUGxhbm5lZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAiU1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMiIHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICJTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMiIG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICJDdXN0b21lci5BcmNoaXRlY3QiIHdvdWxkIGRlZmluZSBhICJDdXN0b21lciIgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICJBcmNoaXRlY3QiIGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlZml4KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdwcmVmaXgnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlZml4KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZWZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlZml4KFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQnJlYWtkb3duRWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc3ZDNkMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjYganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIEJyZWFrZG93biBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiNnZXRVc2FnZUd1aWRhbmNlIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VXNhZ2VHdWlkYW5jZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ndXNhZ2VHdWlkYW5jZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRVc2FnZUd1aWRhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24jZ2V0VXNhZ2VHdWlkYW5jZSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVc2FnZUd1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVc2FnZUd1aWRhbmNlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ2FwYWJpbGl0eVBhdHRlcm4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NhcGFiaWxpdHlQYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmNWQzNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ2FwYWJpbGl0eVBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ2FwYWJpbGl0eVBhdHRlcm4uamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI3IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNhcGFiaWxpdHkgUGF0dGVybjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4KLSAqIEEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOgotICogLSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4KLSAqIC0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuCi0gKiAtIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENhcGFiaWxpdHlQYXR0ZXJuKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDYXBhYmlsaXR5UGF0dGVybicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENhcGFiaWxpdHlQYXR0ZXJuIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyB7Ci19IC8vIENhcGFiaWxpdHlQYXR0ZXJuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ2hlY2tsaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9DaGVja2xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmI4NDQwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9DaGVja2xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ2hlY2tsaXN0LmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNyBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENoZWNrbGlzdCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ2hlY2tsaXN0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2hlY2tsaXN0IGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBDaGVja2xpc3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db21wb3NpdGVSb2xlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db21wb3NpdGVSb2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBhOWZhNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29tcG9zaXRlUm9sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb21wb3NpdGVSb2xlLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29tcG9zaXRlIFJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4KLSAqIEEgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUjZ2V0QWdncmVnYXRlZFJvbGUgPGVtPkFnZ3JlZ2F0ZWQgUm9sZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb21wb3NpdGVSb2xlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb21wb3NpdGVSb2xlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9zaXRlUm9sZSBleHRlbmRzIFJvbGVEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29tcG9zaXRlUm9sZV9Hcm91cDEoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyMiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZ2dyZWdhdGVkIFJvbGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFnZ3JlZ2F0ZWQgUm9sZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFnZ3JlZ2F0ZWQgUm9sZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUiIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBZ2dyZWdhdGVkUm9sZScgZ3JvdXA9JyNncm91cDoyMiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEFnZ3JlZ2F0ZWRSb2xlKCk7Ci0KLX0gLy8gQ29tcG9zaXRlUm9sZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbmNlcHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbmNlcHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDVjY2RjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db25jZXB0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbmNlcHQuamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI3IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb25jZXB0KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb25jZXB0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29uY2VwdCBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gQ29uY2VwdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnN0cmFpbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGVkOTY1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnN0cmFpbnQuamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnN0cmFpbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQjZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnN0cmFpbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbnN0cmFpbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25zdHJhaW50IGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3RvcmVzIHRoZSBtYWluIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1haW5EZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnN0cmFpbnRfTWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nbWFpbkRlc2NyaXB0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1haW5EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludCNnZXRNYWluRGVzY3JpcHRpb24gPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFpbkRlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQ29uc3RyYWludApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRDYXRlZ29yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudENhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc2MjQ2YmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudENhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnRlbnRDYXRlZ29yeS5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBDYXRlZ29yeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudENhdGVnb3J5KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb250ZW50Q2F0ZWdvcnknIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZW50Q2F0ZWdvcnkgZXh0ZW5kcyBDb250ZW50RWxlbWVudCB7Ci19IC8vIENvbnRlbnRDYXRlZ29yeQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRDYXRlZ29yeVBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRDYXRlZ29yeVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2QzZWE0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50Q2F0ZWdvcnlQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnRlbnRDYXRlZ29yeVBhY2thZ2UuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IENhdGVnb3J5IFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBvbmx5IGNvbnRhaW5zIENvbnRlbnQgQ2F0ZWdvcnkgRWxlbWVudHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZSNnZXRDb250ZW50Q2F0ZWdvcnkgPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29udGVudENhdGVnb3J5UGFja2FnZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UgZXh0ZW5kcyBNZXRob2RQYWNrYWdlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZV9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoxMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250ZW50IENhdGVnb3J5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0NvbnRlbnRDYXRlZ29yeSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeSIgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbnRlbnRDYXRlZ29yeScgZ3JvdXA9JyNncm91cDoxMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENvbnRlbnRDYXRlZ29yeSgpOwotCi19IC8vIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50RGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnREZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNzZmZDdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnREZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudERlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNiBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEtleUNvbnNpZGVyYXRpb25zIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRTZWN0aW9uIDxlbT5TZWN0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29udGVudERlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudERlc2NyaXB0aW9uIGV4dGVuZHMgTWV0aG9kVW5pdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3RvcmVzIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1haW5EZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWFpbkRlc2NyaXB0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1haW5EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYWluRGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0S2V5Q29uc2lkZXJhdGlvbnMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nS2V5Q29uc2lkZXJhdGlvbnMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRLZXlDb25zaWRlcmF0aW9ucyA8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEtleUNvbnNpZGVyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRLZXlDb25zaWRlcmF0aW9ucyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VjdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY3Rpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9uKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NlY3Rpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRTZWN0aW9uKCk7Ci0KLX0gLy8gQ29udGVudERlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1YTNhODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnRlbnRFbGVtZW50LmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuCi0gKiBDb250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q2hlY2tsaXN0IDxlbT5DaGVja2xpc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldENvbmNlcHQgPGVtPkNvbmNlcHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldEV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldEd1aWRlbGluZSA8ZW0+R3VpZGVsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRSZXVzYWJsZUFzc2V0IDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0U3VwcG9ydGluZ01hdGVyaWFsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRXaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbnRlbnRFbGVtZW50JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudEVsZW1lbnQgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAxPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAxPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9Hcm91cDEoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoxMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoZWNrbGlzdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoZWNrbGlzdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0KCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NoZWNrbGlzdCcgZ3JvdXA9JyNncm91cDoxMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENoZWNrbGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uY2VwdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmNlcHQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0NvbmNlcHQoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29uY2VwdCcgZ3JvdXA9JyNncm91cDoxMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENvbmNlcHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGFtcGxlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4YW1wbGUnIGdyb3VwPScjZ3JvdXA6MTEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkd1aWRlbGluZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkd1aWRlbGluZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0d1aWRlbGluZScgZ3JvdXA9JyNncm91cDoxMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEd1aWRlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X1JldXNhYmxlQXNzZXQoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmV1c2FibGVBc3NldCcgZ3JvdXA9JyNncm91cDoxMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFJldXNhYmxlQXNzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3VwcG9ydGluZ01hdGVyaWFsJyBncm91cD0nI2dyb3VwOjExJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2hpdGVwYXBlcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfV2hpdGVwYXBlcigpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXaGl0ZXBhcGVyJyBncm91cD0nI2dyb3VwOjExJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0V2hpdGVwYXBlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJuYSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQHNlZSAjaXNTZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJuYSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2YXJpYWJpbGl0eVR5cGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlWYXJpYWJpbGl0eVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQHNlZSAjaXNTZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFZhcmlhYmlsaXR5VHlwZSgpOwotCi19IC8vIENvbnRlbnRFbGVtZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudFBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyMmM0OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudFBhY2thZ2UuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2UjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50IDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudFBhY2thZ2UoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbnRlbnRQYWNrYWdlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudFBhY2thZ2UgZXh0ZW5kcyBNZXRob2RQYWNrYWdlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudFBhY2thZ2VfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MTEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGVudCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudCgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29udGVudEVsZW1lbnQnIGdyb3VwPScjZ3JvdXA6MTEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRDb250ZW50RWxlbWVudCgpOwotCi19IC8vIENvbnRlbnRQYWNrYWdlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ3VzdG9tQ2F0ZWdvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0N1c3RvbUNhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1NTQ5ZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ3VzdG9tQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ3VzdG9tQ2F0ZWdvcnkuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DdXN0b20gQ2F0ZWdvcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgIlRlc3RpbmciIGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5I2dldENhdGVnb3JpemVkRWxlbWVudCA8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0U3ViQ2F0ZWdvcnkgPGVtPlN1YiBDYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDdXN0b21DYXRlZ29yeSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ3VzdG9tQ2F0ZWdvcnknIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDdXN0b21DYXRlZ29yeSBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEN1c3RvbUNhdGVnb3J5X0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXRlZ29yaXplZCBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnQoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ2F0ZWdvcml6ZWRFbGVtZW50JyBncm91cD0nI2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWIgQ2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YiBDYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YiBDYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcnkoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3ViQ2F0ZWdvcnknIGdyb3VwPScjZ3JvdXA6MjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRTdWJDYXRlZ29yeSgpOwotCi19IC8vIEN1c3RvbUNhdGVnb3J5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcmFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlYzVjNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVsaXZlcmFibGUuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyYWJsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZSNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUjZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QgPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcmFibGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0RlbGl2ZXJhYmxlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcmFibGUgZXh0ZW5kcyBXb3JrUHJvZHVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlX0dyb3VwMygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3Q8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWxpdmVyZWQgV29yayBQcm9kdWN0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdCgpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWxpdmVyZWRXb3JrUHJvZHVjdCcgZ3JvdXA9JyNncm91cDoyNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlbGl2ZXJlZFdvcmtQcm9kdWN0KCk7Ci0KLX0gLy8gRGVsaXZlcmFibGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyNTExNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZWxpdmVyYWJsZURlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNyBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyYWJsZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldEV4dGVybmFsRGVzY3JpcHRpb24gPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldFBhY2thZ2luZ0d1aWRhbmNlIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGVsaXZlcmFibGVEZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeHRlcm5hbERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVybmFsRGVzY3JpcHRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbERlc2NyaXB0aW9uIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4dGVybmFsRGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhY2thZ2luZyBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhY2thZ2luZ0d1aWRhbmNlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQYWNrYWdpbmdHdWlkYW5jZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQYWNrYWdpbmdHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRQYWNrYWdpbmdHdWlkYW5jZSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQYWNrYWdpbmdHdWlkYW5jZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyeVByb2Nlc3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJ5UHJvY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1N2U0ZWZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJ5UHJvY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZWxpdmVyeVByb2Nlc3MuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuCi0gKiBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYSBQcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIGZyb20gYmVnaW5uaW5nIHRvIGVuZC4gIEEgRGVsaXZlcnkgUHJvY2VzcyBzaGFsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHBsYW5uaW5nIGFuZCBydW5uaW5nIGEgcHJvamVjdC4gIEl0IHByb3ZpZGVzIGEgY29tcGxldGUgbGlmZWN5Y2xlIG1vZGVsIHdpdGggcHJlZGVmaW5lZCBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIGRldGFpbGVkIGJ5IHNlcXVlbmNpbmcgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJdCBpcyBkZWZpbmVkIG9uIHRoZSBiYXNpcyBvZiBleHBlcmllbmNlIHdpdGggcGFzdCBwcm9qZWN0cyBvciBlbmdhZ2VtZW50cywgYW5kL29yIHRoZSBiZXN0IHByYWN0aWNlIHVzZSBvZiBhIGRldmVsb3BtZW50IG9yIGRlbGl2ZXJ5IGFwcHJvYWNoLiAgSXQgZGVmaW5lcyB3aGF0IGdldHMgcHJvZHVjZWQsIGhvdyB0aG9zZSBpdGVtcyBhcmUgcHJvZHVjZWQsIGFuZCB0aGUgcmVxdWlyZWQgc3RhZmZpbmcgaW4gdGhlIGZvcm0gb2YgaW50ZWdyYXRlZCBXb3JrLCBXb3JrIFByb2R1Y3QsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGUsIGEgcHJvY2VzcyBlbmdpbmVlciBjYW4gZGVmaW5lIGFsdGVybmF0aXZlIERlbGl2ZXJ5IFByb2Nlc3NlcyBmb3Igc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdHMgdGhhdCBkaWZmZXIgaW4gdGhlIHNjYWxlIG9mIHRoZSBlbmdhZ2VtZW50IGFuZCBzdGFmZmluZyBuZWNlc3NhcnksIHRoZSB0eXBlIG9mIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiB0byBiZSBkZXZlbG9wZWQsIHRoZSBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCB0ZWNobm9sb2dpZXMgdG8gYmUgdXNlZCwgZXRjLiAgQWx0aG91Z2gsIHRoZSBEZWxpdmVyeSBQcm9jZXNzIGFpbXMgdG8gY292ZXIgYSB3aG9sZSBwcm9qZWN0IGl0IGtlZXBzIGNlcnRhaW4gZGVjaXNpb24gdGhhdCBhcmUgdG9vIHByb2plY3Qgc3BlY2lmaWMgb3Blbi4gIEZvciBleGFtcGxlLCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmVzIHdoaWNoIEJyZWFrZG93biBFbGVtZW50cyBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9yIGlzIHJlcGVhdGFibGUgdmlhIGl0IHJlc3BlY3RpdmUgYXR0cmlidXRlcywgYnV0IGRvZXMgbm90IHNheSBob3cgbWFueSBvY2N1cnJlbmNlcyBhbmQgaG93IG1hbnkgcmVwZWF0cy9pdGVyYXRpb25zIGl0IHdpbGwgaGF2ZS4gIFRoZXNlIGRlY2lzaW9ucyBoYXZlIHRvIGJlIGRvbmUgYnkgYSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhIGNvbmNyZXRlIHByb2plY3QsIHByb2plY3QgcGhhc2UsIG9yIHByb2plY3QgaXRlcmF0aW9ucy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhbHdheXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhIHByb2Nlc3MgaW4gdGVybXMgb2YgY29tcGxldGVuZXNzIG9mIHRoZSBsaWZlY3ljbGUsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgYWxsIHRocmVlIHZpZXdzIG9uIHRoZSBwcm9jZXNzIHdoaWNoIGFyZSB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBoYXZlIHRvIGJlIGZ1bGx5IGFuZCBjb25zaXN0ZW50bHkgcG9wdWxhdGVkLiAgQ29uc2lzdGVuY3kgb2YgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFjdHVhbGx5IGVuc3VyZWQgYnkgdGhlIGZhY3QgdGhhdCBhbGwgdGhyZWUgYnJlYWtkb3ducyBhcmUgcmVwcmVzZW50ZWQgYnkgb25lIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSBhbmQgb25lIHBhcnRpY3VsYXIgYnJlYWtkb3duIHN1Y2ggYXMgVGVhbSBCcmVha2Rvd24gaXMganVzdCBhIHZpZXcgb24gdGhhdCBkYXRhIHN0cnVjdHVyZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3MjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsIDxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzI2dldEVkdWNhdGlvbk1hdGVyaWFsIDxlbT5FZHVjYXRpb24gTWF0ZXJpYWw8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZWxpdmVyeVByb2Nlc3MnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZWxpdmVyeVByb2Nlc3MgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMzwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzX0dyb3VwMygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjQyJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbW11bmljYXRpb25zIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb21tdW5pY2F0aW9uc01hdGVyaWFsJyBncm91cD0nI2dyb3VwOjQyJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWR1Y2F0aW9uIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FZHVjYXRpb24gTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FZHVjYXRpb24gTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbCgpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFZHVjYXRpb25NYXRlcmlhbCcgZ3JvdXA9JyNncm91cDo0MiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEVkdWNhdGlvbk1hdGVyaWFsKCk7Ci0KLX0gLy8gRGVsaXZlcnlQcm9jZXNzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ1MGZiMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNiBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBQcm9jZXNzIERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyeSBQcm9jZXNzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjYWxlIDxlbT5TY2FsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFJpc2tMZXZlbCA8ZW0+UmlzayBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UgPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0VHlwZU9mQ29udHJhY3QgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gZXh0ZW5kcyBQcm9jZXNzRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBPdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTY2FsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NjYWxlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNjYWxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2NhbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBDaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmlzayBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogT3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmlzayBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Umlza0xldmVsKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jpc2tMZXZlbCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSaXNrTGV2ZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFJpc2tMZXZlbCA8ZW0+UmlzayBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmlzayBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Umlza0xldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSaXNrTGV2ZWwoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXN0aW1hdGluZ1RlY2huaXF1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGluZ1RlY2huaXF1ZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVzdGltYXRpbmdUZWNobmlxdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJvamVjdE1lbWJlckV4cGVydGlzZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJvamVjdE1lbWJlckV4cGVydGlzZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvamVjdE1lbWJlckV4cGVydGlzZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBPZiBDb250cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29JJ20gY2hhSSdtIG50cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGVPZkNvbnRyYWN0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fVHlwZU9mQ29udHJhY3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVHlwZU9mQ29udHJhY3QnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZU9mQ29udHJhY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFR5cGVPZkNvbnRyYWN0IDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlT2ZDb250cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZU9mQ29udHJhY3QoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rlc2NyaWJhYmxlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpYmFibGVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5NWE0MDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpYmFibGVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZXNjcmliYWJsZUVsZW1lbnQuamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuCi0gKiBUaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldE5vZGVpY29uIDxlbT5Ob2RlaWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0U2hhcGVpY29uIDxlbT5TaGFwZWljb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZXNjcmliYWJsZUVsZW1lbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXNjcmliYWJsZUVsZW1lbnQgZXh0ZW5kcyBNZXRob2RFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZXNlbnRhdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlc2VudGF0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29udGVudERlc2NyaXB0aW9uIGdldFByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFByZXNlbnRhdGlvbiA8ZW0+UHJlc2VudGF0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlc2VudGF0aW9uKENvbnRlbnREZXNjcmlwdGlvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm9kZWljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vZGVpY29uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nbm9kZWljb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Tm9kZWljb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXROb2RlaWNvbiA8ZW0+Tm9kZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vZGVpY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROb2RlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Tm9kZWljb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gInJ1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQiIHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICJqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50IiB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICJBcmNoaXRlY3R1cmUgRG9jdW1lbnQiLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlc2VudGF0aW9uTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ncHJlc2VudGF0aW9uTmFtZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uTmFtZSA8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVzZW50YXRpb25OYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2hhcGVpY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTaGFwZWljb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nc2hhcGVpY29uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNoYXBlaWNvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFNoYXBlaWNvbiA8ZW0+U2hhcGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TaGFwZWljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNoYXBlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2hhcGVpY29uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRGVzY3JpYmFibGVFbGVtZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNWM5N2JlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVzY3JpcHRvci5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjYganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlZmVyZW5jZXMgb25lIGNvbmNyZXRlIENvbnRlbnQgRWxlbWVudC4gIEEgZGVzY3JpcHRvciBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHdpdGhpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uIHRvIGp1c3QgcmVmZXJlbmNpbmcgQ29udGVudCBFbGVtZW50cyBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgQ29udGVudCBFbGVtZW50cyBzdHJ1Y3R1cmFsIHJlbGF0aW9uc2hpcHMgYnkgZGVmaW5pbmcgaXRzIG93biBzZXRzIG9mIGFzc29jaWF0aW9ucy4KLSAqIERlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpcHRvcigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGVzY3JpcHRvcicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlc2NyaXB0b3IgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICN1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2lzU3luY2hyb25pemVkV2l0aFNvdXJjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotfSAvLyBEZXNjcmlwdG9yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZXNjcmlwdG9yRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWQ2OGRmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZXNjcmlwdG9yRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVzY3JpcHRvckRlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNiBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVzY3JpcHRvci4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24jZ2V0UmVmaW5lZERlc2NyaXB0aW9uIDxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGVzY3JpcHRvckRlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVzY3JpcHRvckRlc2NyaXB0aW9uIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZpbmVkIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWZpbmVkRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlZmluZWREZXNjcmlwdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZWZpbmVkRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiNnZXRSZWZpbmVkRGVzY3JpcHRpb24gPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlZmluZWREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVmaW5lZERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRGVzY3JpcHRvckRlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGlzY2lwbGluZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGlzY2lwbGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOTc4NDE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rpc2NpcGxpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERpc2NpcGxpbmUuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNjaXBsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuCi0gKiBBIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRUYXNrIDxlbT5UYXNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFN1YkRpc2NpcGxpbmUgPGVtPlN1YiBEaXNjaXBsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFJlZmVyZW5jZVdvcmtmbG93IDxlbT5SZWZlcmVuY2UgV29ya2Zsb3c8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGlzY2lwbGluZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpc2NpcGxpbmUgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lX1Rhc2soKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGFzaycgZ3JvdXA9JyNncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YiBEaXNjaXBsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWIgRGlzY2lwbGluZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YiBEaXNjaXBsaW5lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lX1N1YkRpc2NpcGxpbmUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lIiBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3ViRGlzY2lwbGluZScgZ3JvdXA9JyNncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFN1YkRpc2NpcGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBXb3JrZmxvdzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmZXJlbmNlIFdvcmtmbG93PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlIFdvcmtmbG93PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93KCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlZmVyZW5jZVdvcmtmbG93JyBncm91cD0nI2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UmVmZXJlbmNlV29ya2Zsb3coKTsKLQotfSAvLyBEaXNjaXBsaW5lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGlzY2lwbGluZUdyb3VwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EaXNjaXBsaW5lR3JvdXBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTgxYmUzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EaXNjaXBsaW5lR3JvdXBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGlzY2lwbGluZUdyb3VwaW5nLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzY2lwbGluZSBHcm91cGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgIlNvZnR3YXJlIERpc2NpcGxpbmVzIiB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICJSZXF1aXJlbWVudHMgTWFuYWdlbWVudCIgb3IgIlRlc3RpbmciOyAiSVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCIgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAiSVQgT3BlcmF0aW9uYWwgU2VydmljZXMiLCAiSVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyIsIG9yICJJVCBFbmFibGluZyBTZXJ2aWNlcyIuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcjZ2V0RGlzY2lwbGluZSA8ZW0+RGlzY2lwbGluZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lR3JvdXBpbmcoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Rpc2NpcGxpbmVHcm91cGluZycga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpc2NpcGxpbmVHcm91cGluZyBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVHcm91cGluZ19Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNjaXBsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNjaXBsaW5lPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzY2lwbGluZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmUoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGlzY2lwbGluZScgZ3JvdXA9JyNncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERpc2NpcGxpbmUoKTsKLQotfSAvLyBEaXNjaXBsaW5lR3JvdXBpbmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Eb2N1bWVudFJvb3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RvY3VtZW50Um9vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MzFhMTg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RvY3VtZW50Um9vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRG9jdW1lbnRSb290LmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvY3VtZW50IFJvb3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0WFNJU2NoZW1hTG9jYXRpb24gPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RDb25maWd1cmF0aW9uIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZExpYnJhcnkgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERvY3VtZW50Um9vdCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nJyBraW5kPSdtaXhlZCciCi0gKiBAZXh0ZW5kcyBFRGF0YU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50Um9vdCBleHRlbmRzIEVEYXRhT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWl4ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaXhlZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X01peGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50V2lsZGNhcmQnIG5hbWU9JzptaXhlZCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0TWl4ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcC4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT4nIG1hcCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicgbWFwLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKQotCSAqIEBtb2RlbCBtYXBUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIGtleVR5cGU9ImphdmEubGFuZy5TdHJpbmciIHZhbHVlVHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3htbG5zOnByZWZpeCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVNYXAgZ2V0WE1MTlNQcmVmaXhNYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcC4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nIG1hcCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicgbWFwLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBtb2RlbCBtYXBUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIGtleVR5cGU9ImphdmEubGFuZy5TdHJpbmciIHZhbHVlVHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3hzaTpzY2hlbWFMb2NhdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVNYXAgZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X01ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdXBwZXI9Ii0yIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNZXRob2RDb25maWd1cmF0aW9uJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbiA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIExpYnJhcnk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb2N1bWVudFJvb3RfTWV0aG9kTGlicmFyeSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB1cHBlcj0iLTIiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01ldGhvZExpYnJhcnknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RMaWJyYXJ5IGdldE1ldGhvZExpYnJhcnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RMaWJyYXJ5IDxlbT5NZXRob2QgTGlicmFyeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE1ldGhvZExpYnJhcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotCSAqIE1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotCSAqIFNwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE1ldGhvZFBsdWdpbihNZXRob2RQbHVnaW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERvY3VtZW50Um9vdF9NZXRob2RQbHVnaW4oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdXBwZXI9Ii0yIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNZXRob2RQbHVnaW4nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RQbHVnaW4gZ2V0TWV0aG9kUGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1ldGhvZFBsdWdpbihNZXRob2RQbHVnaW4gdmFsdWUpOwotCi19IC8vIERvY3VtZW50Um9vdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RvbWFpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRG9tYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ1NTc2NmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRG9tYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERvbWFpbi5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MDAga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvbWFpbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LgotICogRG9tYWluIGlzIGEgbG9naWNhbCBncm91cGluZyBvZiB3b3JrIHByb2R1Y3RzIHRoYXQgaGF2ZSBhbiBhZmZpbml0eSB0byBlYWNoIG90aGVyIGJhc2VkIG9uIHJlc291cmNlcywgdGltaW5nLCBvciByZWxhdGlvbnNoaXAuICBBIERvbWFpbiBtYXkgYmUgZGl2aWRlZCBpbnRvIHN1YmRvbWFpbnMuICBGb3IgZXhhbXBsZSwgR1MgTWV0aG9kIHVzZXMgc2l4IHByZWRlZmluZWQgRG9tYWlucyBmb3IgV29yayBQcm9kdWN0czogQXBwbGljYXRpb24sIEFyY2hpdGVjdHVyZSwgQnVzaW5lc3MsIEVuZ2FnZW1lbnQsIE9wZXJhdGlvbnMgYW5kIE9yZ2FuaXphdGlvbi4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4jZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbiNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4jZ2V0U3ViZG9tYWluIDxlbT5TdWJkb21haW48L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RG9tYWluKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEb21haW4nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEb21haW4gZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb21haW5fR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERvbWFpbl9Xb3JrUHJvZHVjdCgpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrUHJvZHVjdCcgZ3JvdXA9JyNncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFdvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWJkb21haW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViZG9tYWluPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViZG9tYWluPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb21haW5fU3ViZG9tYWluKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluIiBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3ViZG9tYWluJyBncm91cD0nI2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0U3ViZG9tYWluKCk7Ci0KLX0gLy8gRG9tYWluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YTk1YjdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRWxlbWVudC5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjYganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEVsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0VsZW1lbnQnIGtpbmQ9J2VtcHR5JyIKLSAqIEBleHRlbmRzIEVEYXRhT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWxlbWVudCBleHRlbmRzIEVEYXRhT2JqZWN0IHsKLX0gLy8gRWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VzdGltYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Fc3RpbWF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYTNjN2QyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VzdGltYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEVzdGltYXRlLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBwcm92aWRlcyBzaXppbmcgbWVhc3VyZXMsIG9yIHN0YW5kYXJkcyBmb3Igc2l6aW5nIHRoZSB3b3JrIGVmZm9ydCBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyBhIHBhcnRpY3VsYXIgcGllY2Ugb2Ygd29yayBhbmQgaW5zdHJ1Y3Rpb25zIGZvciB0aGVpciBzdWNjZXNzZnVsIHVzZS4gSXQgbWF5IGJlIGNvbXByaXNlZCBvZiBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb25zIGFuZCBlc3RpbWF0aW9uIG1ldHJpY3MuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEVzdGltYXRpb25NZXRyaWMgPGVtPkVzdGltYXRpb24gTWV0cmljPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZSNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RXN0aW1hdGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0VzdGltYXRlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXN0aW1hdGUgZXh0ZW5kcyBHdWlkYW5jZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEVzdGltYXRlX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gTWV0cmljPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIE1ldHJpYzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gTWV0cmljPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uTWV0cmljKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VzdGltYXRpb25NZXRyaWMnIGdyb3VwPScjZ3JvdXA6MjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFc3RpbWF0aW9uTWV0cmljKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RXN0aW1hdGVfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VzdGltYXRpb25Db25zaWRlcmF0aW9ucycgZ3JvdXA9JyNncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi19IC8vIEVzdGltYXRlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXN0aW1hdGluZ01ldHJpYy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXN0aW1hdGluZ01ldHJpYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMDAwN2Y5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VzdGltYXRpbmdNZXRyaWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXN0aW1hdGluZ01ldHJpYy5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXN0aW1hdGluZyBNZXRyaWM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBkZXNjcmliZXMgYSBtZXRyaWMgb3IgbWVhc3VyZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IGFuZCB3aGljaCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgd29yayBlZmZvcnQgYXMgd2VsbCBhcyBhIHJhbmdlIG9mIHBvdGVudGlhbCBsYWJvci4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEVzdGltYXRpbmdNZXRyaWMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0VzdGltYXRpbmdNZXRyaWMnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFc3RpbWF0aW5nTWV0cmljIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBFc3RpbWF0aW5nTWV0cmljClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzVjMWFkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNiBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcXVhbGlmaWVzIHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0VzdGltYXRpb25Db25zaWRlcmF0aW9ucycga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXhhbXBsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXhhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMDQ2OTRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0V4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXhhbXBsZS5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSB0eXBpY2FsLCBwYXJ0aWFsbHkgY29tcGxldGVkLCBzYW1wbGUgaW5zdGFuY2Ugb2Ygb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBvciBzY2VuYXJpbyBsaWtlIGRlc2NyaXB0aW9ucyBvZiBob3cgVGFzayBtYXkgYmUgcGVyZm9ybWVkLiBFeGFtcGxlcyBjYW4gYmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3RzIGFzIHdlbGwgYXMgVGFza3MgdGhhdCBwcm9kdWNlIHRoZW0gYXMgd2VsbCBhcyBhbnkgb3RoZXIgQ29udGVudCBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RXhhbXBsZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXhhbXBsZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4YW1wbGUgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIEV4YW1wbGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9HdWlkYW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvR3VpZGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmRmNjE5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9HdWlkYW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBHdWlkYW5jZS5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGFuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBHdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEd1aWRhbmNlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdHdWlkYW5jZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEd1aWRhbmNlIGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotfSAvLyBHdWlkYW5jZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0d1aWRhbmNlRGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0d1aWRhbmNlRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzZmMWUyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9HdWlkYW5jZURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEd1aWRhbmNlRGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBHdWlkYW5jZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uI2dldEF0dGFjaG1lbnQgPGVtPkF0dGFjaG1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nR3VpZGFuY2VEZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEd1aWRhbmNlRGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dGFjaG1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0YWNobWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXR0YWNobWVudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdHRhY2htZW50JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEF0dGFjaG1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24jZ2V0QXR0YWNobWVudCA8ZW0+QXR0YWNobWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0YWNobWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0YWNobWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0YWNobWVudChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEd1aWRhbmNlRGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9HdWlkZWxpbmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0d1aWRlbGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MTEwOWU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0d1aWRlbGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBHdWlkZWxpbmUuamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI3IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRHdWlkZWxpbmUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0d1aWRlbGluZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEd1aWRlbGluZSBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gR3VpZGVsaW5lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvSXRlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9JdGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWUwZDBmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9JdGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogSXRlcmF0aW9uLmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNiBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JdGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi0gKiBJdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLikKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEl0ZXJhdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSXRlcmF0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSXRlcmF0aW9uIGV4dGVuZHMgQWN0aXZpdHkgewotfSAvLyBJdGVyYXRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RDb25maWd1cmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1YWYxMTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRCYXNlQ29uZmlndXJhdGlvbiA8ZW0+QmFzZSBDb25maWd1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBsdWdpblNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldERlZmF1bHRWaWV3IDxlbT5EZWZhdWx0IFZpZXc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0UHJvY2Vzc1ZpZXcgPGVtPlByb2Nlc3MgVmlldzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNZXRob2RDb25maWd1cmF0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kQ29uZmlndXJhdGlvbiBleHRlbmRzIE1ldGhvZFVuaXQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgQ29uZmlndXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBDb25maWd1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBDb25maWd1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9uKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Jhc2VDb25maWd1cmF0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QmFzZUNvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNZXRob2RQbHVnaW5TZWxlY3Rpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kUGFja2FnZVNlbGVjdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmlldzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVmYXVsdCBWaWV3PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVmlldzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVmYXVsdFZpZXcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlZmF1bHRWaWV3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRWaWV3KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldERlZmF1bHRWaWV3IDxlbT5EZWZhdWx0IFZpZXc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVmlldzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdFZpZXcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRWaWV3KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9jZXNzIFZpZXc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb2Nlc3MgVmlldzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2Nlc3MgVmlldzwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlldygpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcm9jZXNzVmlldyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFByb2Nlc3NWaWV3KCk7Ci0KLX0gLy8gTWV0aG9kQ29uZmlndXJhdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2FmN2ZlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RFbGVtZW50LmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBEZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldE93bmVkUnVsZSA8ZW0+T3duZWQgUnVsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRCcmllZkRlc2NyaXB0aW9uIDxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3JkZXJpbmdHdWlkZSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjaXNTdXBwcmVzc2VkIDxlbT5TdXBwcmVzc2VkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01ldGhvZEVsZW1lbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RFbGVtZW50IGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9Hcm91cCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZWZpbmVzIHRoZSBwYWNrYWdpbmcgcnVsZXMgZm9yIHRoaXMgTWV0aG9kIEVsZW1lbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk93bmVkIFJ1bGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfT3duZWRSdWxlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludCIgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J093bmVkUnVsZScgZ3JvdXA9JyNncm91cDoxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0T3duZWRSdWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJyaWVmRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdicmllZkRlc2NyaXB0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0QnJpZWZEZXNjcmlwdGlvbiA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRCcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCcmllZkRlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9JZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2lkJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPcmRlcmluZ0d1aWRlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nb3JkZXJpbmdHdWlkZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRPcmRlcmluZ0d1aWRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldE9yZGVyaW5nR3VpZGUgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlcmluZyBHdWlkZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3JkZXJpbmdHdWlkZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3JkZXJpbmdHdWlkZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlICJleHRlbmRzIiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiwgdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcHJlc3NlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTdXBwcmVzc2VkKCkKLQkgKiBAc2VlICN1bnNldFN1cHByZXNzZWQoKQotCSAqIEBzZWUgI3NldFN1cHByZXNzZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9TdXBwcmVzc2VkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3N1cHByZXNzZWQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU3VwcHJlc3NlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNpc1N1cHByZXNzZWQgPGVtPlN1cHByZXNzZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1cHByZXNzZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U3VwcHJlc3NlZCgpCi0JICogQHNlZSAjdW5zZXRTdXBwcmVzc2VkKCkKLQkgKiBAc2VlICNpc1N1cHByZXNzZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1cHByZXNzZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjaXNTdXBwcmVzc2VkIDxlbT5TdXBwcmVzc2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFN1cHByZXNzZWQoKQotCSAqIEBzZWUgI2lzU3VwcHJlc3NlZCgpCi0JICogQHNlZSAjc2V0U3VwcHJlc3NlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U3VwcHJlc3NlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2lzU3VwcHJlc3NlZCA8ZW0+U3VwcHJlc3NlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcHJlc3NlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0U3VwcHJlc3NlZCgpCi0JICogQHNlZSAjaXNTdXBwcmVzc2VkKCkKLQkgKiBAc2VlICNzZXRTdXBwcmVzc2VkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRTdXBwcmVzc2VkKCk7Ci0KLX0gLy8gTWV0aG9kRWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZExpYnJhcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZExpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWQzYzQ1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZExpYnJhcnkuamF2YSx2IDEuMyAyMDA2LzA5LzA4IDAwOjU5OjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgTGlicmFyeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkjZ2V0TWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldE1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldFRvb2wgPGVtPlRvb2w8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kTGlicmFyeSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTWV0aG9kTGlicmFyeScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZExpYnJhcnkgZXh0ZW5kcyBNZXRob2RVbml0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2lufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbigpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01ldGhvZFBsdWdpbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE1ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZExpYnJhcnlfTWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNZXRob2RDb25maWd1cmF0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VG9vbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VG9vbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUb29sKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kTGlicmFyeV9Ub29sKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUb29sKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldFRvb2wgPGVtPlRvb2w8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRvb2w8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRvb2woU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBNZXRob2RMaWJyYXJ5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjE4YzU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZFBhY2thZ2UuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRSZXVzZWRQYWNrYWdlIDxlbT5SZXVzZWQgUGFja2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNpc0dsb2JhbCA8ZW0+R2xvYmFsPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBhY2thZ2UoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01ldGhvZFBhY2thZ2UnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RQYWNrYWdlIGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBhY2thZ2VfR3JvdXAxKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6NyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmV1c2VkIFBhY2thZ2U8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXVzZWQgUGFja2FnZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JldXNlZFBhY2thZ2UnIGdyb3VwPScjZ3JvdXA6NyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFJldXNlZFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlX01ldGhvZFBhY2thZ2UoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlIiBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kUGFja2FnZScgZ3JvdXA9JyNncm91cDo3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0TWV0aG9kUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBNZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HbG9iYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0R2xvYmFsKCkKLQkgKiBAc2VlICN1bnNldEdsb2JhbCgpCi0JICogQHNlZSAjc2V0R2xvYmFsKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2dsb2JhbCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNHbG9iYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjaXNHbG9iYWwgPGVtPkdsb2JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2xvYmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEdsb2JhbCgpCi0JICogQHNlZSAjdW5zZXRHbG9iYWwoKQotCSAqIEBzZWUgI2lzR2xvYmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHbG9iYWwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjaXNHbG9iYWwgPGVtPkdsb2JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRHbG9iYWwoKQotCSAqIEBzZWUgI2lzR2xvYmFsKCkKLQkgKiBAc2VlICNzZXRHbG9iYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEdsb2JhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlI2lzR2xvYmFsIDxlbT5HbG9iYWw8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdsb2JhbDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0R2xvYmFsKCkKLQkgKiBAc2VlICNpc0dsb2JhbCgpCi0JICogQHNlZSAjc2V0R2xvYmFsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRHbG9iYWwoKTsKLQotfSAvLyBNZXRob2RQYWNrYWdlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTg0NTdkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZFBsdWdpbi5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjYganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBQbHVnaW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotICogTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi0gKiBTcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luIDxlbT5SZWZlcmVuY2VkIE1ldGhvZCBQbHVnaW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNnZXRNZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luI2lzVXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQbHVnaW4oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01ldGhvZFBsdWdpbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZFBsdWdpbiBleHRlbmRzIE1ldGhvZFVuaXQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgTWV0aG9kIFBsdWdpbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQbHVnaW5fUmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZWZlcmVuY2VkTWV0aG9kUGx1Z2luJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSIgY29udGFpbm1lbnQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01ldGhvZFBhY2thZ2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRNZXRob2RQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vc2VyIENoYW5nZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI3Vuc2V0VXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI3NldFVzZXJDaGFuZ2VhYmxlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd1c2VyQ2hhbmdlYWJsZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNVc2VyQ2hhbmdlYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luI2lzVXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFVzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAc2VlICN1bnNldFVzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAc2VlICNpc1VzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVc2VyQ2hhbmdlYWJsZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luI2lzVXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRVc2VyQ2hhbmdlYWJsZSgpCi0JICogQHNlZSAjaXNVc2VyQ2hhbmdlYWJsZSgpCi0JICogQHNlZSAjc2V0VXNlckNoYW5nZWFibGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFVzZXJDaGFuZ2VhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNpc1VzZXJDaGFuZ2VhYmxlIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI2lzVXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI3NldFVzZXJDaGFuZ2VhYmxlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRVc2VyQ2hhbmdlYWJsZSgpOwotCi19IC8vIE1ldGhvZFBsdWdpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZFVuaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZFVuaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjM1N2Y3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RVbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RVbml0LmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNyBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgVW5pdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENvcHlyaWdodCA8ZW0+Q29weXJpZ2h0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFVuaXQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01ldGhvZFVuaXQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RVbml0IGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db3B5cmlnaHQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29weXJpZ2h0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3B5cmlnaHQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X0NvcHlyaWdodCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3B5cmlnaHQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29weXJpZ2h0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENvcHlyaWdodCA8ZW0+Q29weXJpZ2h0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3B5cmlnaHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvcHlyaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29weXJpZ2h0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF1dGhvcnMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X0F1dGhvcnMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdhdXRob3JzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEF1dGhvcnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aG9yczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXV0aG9ycyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDaGFuZ2VEYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdjaGFuZ2VEYXRlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldENoYW5nZURhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDaGFuZ2VEYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdjaGFuZ2VEZXNjcmlwdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X1ZlcnNpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2ZXJzaW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIE1ldGhvZFVuaXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NaWxlc3RvbmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01pbGVzdG9uZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZDU1Nzg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01pbGVzdG9uZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNaWxlc3RvbmUuamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1pbGVzdG9uZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1pbGVzdG9uZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTWlsZXN0b25lJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWlsZXN0b25lIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnQgewotfSAvLyBNaWxlc3RvbmUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9OYW1lZEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL05hbWVkRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZWY0YTQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL05hbWVkRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBOYW1lZEVsZW1lbnQuamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hbWVkIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lZCBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk5hbWVkRWxlbWVudCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE5hbWVkRWxlbWVudCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTmFtZWRFbGVtZW50JyBraW5kPSdlbXB0eSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZWRFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TmFtZWRFbGVtZW50X05hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSduYW1lJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk5hbWVkRWxlbWVudCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTmFtZWRFbGVtZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvT3V0Y29tZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvT3V0Y29tZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTJhZTAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL091dGNvbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogT3V0Y29tZS5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0Y29tZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgV29yayBQcm9kdWN0IHRoYXQgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE91dGNvbWUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J091dGNvbWUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBPdXRjb21lIGV4dGVuZHMgV29ya1Byb2R1Y3QgewotfSAvLyBPdXRjb21lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUGFja2FnZWFibGVFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QYWNrYWdlYWJsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTNhODA5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QYWNrYWdlYWJsZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUGFja2FnZWFibGVFbGVtZW50LmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNiBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYWNrYWdlYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UGFja2FnZWFibGVFbGVtZW50KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQYWNrYWdlYWJsZUVsZW1lbnQnIGtpbmQ9J2VtcHR5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQYWNrYWdlYWJsZUVsZW1lbnQgZXh0ZW5kcyBOYW1lZEVsZW1lbnQgewotfSAvLyBQYWNrYWdlYWJsZUVsZW1lbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QaGFzZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUGhhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmU5MDkwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QaGFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQaGFzZS5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjYganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGhhc2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ1BoYXNlJykgYW5kIGlzUmVwZWF0YWJsZSAoJ0ZhbHNlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi0gKiBQaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFBoYXNlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQaGFzZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBoYXNlIGV4dGVuZHMgQWN0aXZpdHkgewotfSAvLyBQaGFzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1BsYW5uaW5nRGF0YS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUGxhbm5pbmdEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMxYzk0N2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUGxhbm5pbmdEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQbGFubmluZ0RhdGEuamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI3IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFByb2Nlc3MgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4KLSAqIFBsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4KLSAqIChOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0UmFuayA8ZW0+UmFuazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQbGFubmluZ0RhdGEoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1BsYW5uaW5nRGF0YScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBsYW5uaW5nRGF0YSBleHRlbmRzIFByb2Nlc3NFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2ggRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaW5pc2hEYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2ZpbmlzaERhdGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RmluaXNoRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoRGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFuazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFuazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmFuayhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFBsYW5uaW5nRGF0YV9SYW5rKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ncmFuayciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSYW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0UmFuayA8ZW0+UmFuazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmFuazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmFuaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmFuayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnREYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nc3RhcnREYXRlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydERhdGUoT2JqZWN0IHZhbHVlKTsKLQotfSAvLyBQbGFubmluZ0RhdGEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QcmFjdGljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJhY3RpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2IzNWNiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QcmFjdGljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJhY3RpY2UuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmFjdGljZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAiTWFuYWdlIFJpc2tzIiwgIkNvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSIsICJBcmNoaXRlY3R1cmUtY2VudHJpYyBhbmQgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50IiwgZXRjLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRBY3Rpdml0eVJlZmVyZW5jZSA8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRDb250ZW50UmVmZXJlbmNlIDxlbT5Db250ZW50IFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UjZ2V0U3ViUHJhY3RpY2UgPGVtPlN1YiBQcmFjdGljZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJhY3RpY2UnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcmFjdGljZSBleHRlbmRzIEd1aWRhbmNlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZpdHkgUmVmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY3Rpdml0eSBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdGl2aXR5UmVmZXJlbmNlJyBncm91cD0nI2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QWN0aXZpdHlSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRlbnQgUmVmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250ZW50IFJlZmVyZW5jZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRlbnQgUmVmZXJlbmNlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbnRlbnRSZWZlcmVuY2UnIGdyb3VwPScjZ3JvdXA6MjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRDb250ZW50UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWIgUHJhY3RpY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWIgUHJhY3RpY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWIgUHJhY3RpY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlX1N1YlByYWN0aWNlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UiIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdWJQcmFjdGljZScgZ3JvdXA9JyNncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFN1YlByYWN0aWNlKCk7Ci0KLX0gLy8gUHJhY3RpY2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QcmFjdGljZURlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QcmFjdGljZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3OTc5ZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJhY3RpY2VEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJhY3RpY2VEZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjYganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJhY3RpY2UgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFByYWN0aWNlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QWRkaXRpb25hbEluZm8gPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBcHBsaWNhdGlvbiA8ZW0+QXBwbGljYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QmFja2dyb3VuZCA8ZW0+QmFja2dyb3VuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRHb2FscyA8ZW0+R29hbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0TGV2ZWxzT2ZBZG9wdGlvbiA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldFByb2JsZW0gPGVtPlByb2JsZW08L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJhY3RpY2VEZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByYWN0aWNlRGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWwgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQW55IGFkZGl0aW9uYWwgSW5mb3JtYXRpb24gbm90IGNvdmVyZWQgYnkgdGhlIG90aGVyIGF0dHJpYnV0ZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWRkaXRpb25hbEluZm8oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FkZGl0aW9uYWxJbmZvJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFkZGl0aW9uYWxJbmZvKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFkZGl0aW9uYWxJbmZvIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWRkaXRpb25hbEluZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFkZGl0aW9uYWxJbmZvKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVzY3JpYmVzIGhvdyB0aGUgUHJhY3RpY2UgaXMgYmVpbmcgYXBwbGllZCBvciBpbnRyb2R1Y2VkIGludG8gdGhlIGNvbnRleHQgZGVzY3JpYmVkIGluIGJhY2tncm91bmQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFwcGxpY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBcHBsaWNhdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXBwbGljYXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXBwbGljYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QXBwbGljYXRpb24gPGVtPkFwcGxpY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BcHBsaWNhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFwcGxpY2F0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhY2tncm91bmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJhY2tncm91bmQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQmFja2dyb3VuZCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRCYWNrZ3JvdW5kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEJhY2tncm91bmQgPGVtPkJhY2tncm91bmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhY2tncm91bmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJhY2tncm91bmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJhY2tncm91bmQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdvYWxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R29hbHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEdvYWxzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdHb2FscyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRHb2FscygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRHb2FscyA8ZW0+R29hbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdvYWxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRHb2FscygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R29hbHMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVscyBPZiBBZG9wdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogT3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMZXZlbHNPZkFkb3B0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xldmVsc09mQWRvcHRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRMZXZlbHNPZkFkb3B0aW9uIDxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGV2ZWxzT2ZBZG9wdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvYmxlbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9ibGVtPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcm9ibGVtKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Byb2JsZW0nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJvYmxlbSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRQcm9ibGVtIDxlbT5Qcm9ibGVtPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9ibGVtPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcm9ibGVtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcm9ibGVtKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUHJhY3RpY2VEZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTVhNzEwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3MuamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LgotICogQ29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0SW5jbHVkZXNQYXR0ZXJuIDxlbT5JbmNsdWRlcyBQYXR0ZXJuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldERlZmF1bHRDb250ZXh0IDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0VmFsaWRDb250ZXh0IDxlbT5WYWxpZCBDb250ZXh0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3MoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Byb2Nlc3MnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzIGV4dGVuZHMgQWN0aXZpdHkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluY2x1ZGVzIFBhdHRlcm48L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmNsdWRlcyBQYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybigpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbmNsdWRlc1BhdHRlcm4nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRJbmNsdWRlc1BhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVmYXVsdENvbnRleHQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlZmF1bHRDb250ZXh0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRDb250ZXh0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldERlZmF1bHRDb250ZXh0IDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdENvbnRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRDb250ZXh0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWxpZCBDb250ZXh0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsaWQgQ29udGV4dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsaWRDb250ZXh0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0VmFsaWRDb250ZXh0KCk7Ci0KLX0gLy8gUHJvY2VzcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NDb21wb25lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NDb21wb25lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTlkZDU0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzQ29tcG9uZW50LmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNiBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIENvbXBvbmVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBQcm9jZXNzIFBhY2thZ2UgdGhhdCBhcHBsaWVzIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uICBBIFByb2Nlc3MgQ29tcG9uZW50IHJlYWxpemVzIG9uZSBvciBtb3JlIEludGVyZmFjZXMgd2hpY2ggc3BlY2lmeSBpbnB1dHMgYW5kIG91dHB1dHMgb2YgdGhlIGNvbXBvbmVudC4gVGhlcmUgbWlnaHQgYmUgbWFueSBjb21wb25lbnRzIHJlYWxpemluZyB0aGUgc2FtZSBpbnRlcmZhY2VzLCBidXQgdXNpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgdG8gYWNoaWV2ZSBzaW1pbGFyIG91dHB1dHMgZm9yIHNpbWlsYXIgaW5wdXRzLiAgV2hlcmVhcyB0aGUgQ29tcG9uZW50IEludGVyZmFjZXMgcmVwcmVzZW50IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyAoYmxhY2sgYm94IGRlc2NyaXB0aW9ucyBvZiB0aGUgY29tcG9uZW50KSwgZ29vZCBjYW5kaWRhdGVzIGZvciBjb21wb25lbnQgcmVhbGl6YXRpb25zIGNhbiBiZSBmb3VuZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zICh3aGl0ZSBib3ggZGVzY3JpcHRpb25zIGZvciB0aGUgY29tcG9uZW50KS4KLSAqIFVNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAiYmxhY2sgYm94Ii4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgInJlYWxpemF0aW9uIiBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDb3B5cmlnaHQgPGVtPkNvcHlyaWdodDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRJbnRlcmZhY2UgPGVtPkludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRQcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Byb2Nlc3NDb21wb25lbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzQ29tcG9uZW50IGV4dGVuZHMgUHJvY2Vzc1BhY2thZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29weXJpZ2h0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvcHlyaWdodDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29weXJpZ2h0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudF9Db3B5cmlnaHQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29weXJpZ2h0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvcHlyaWdodCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDb3B5cmlnaHQgPGVtPkNvcHlyaWdodDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29weXJpZ2h0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3B5cmlnaHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvcHlyaWdodChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50ZXJmYWNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnRlcmZhY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJmYWNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJbnRlcmZhY2UoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudF9JbnRlcmZhY2UoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSW50ZXJmYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBnZXRJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0SW50ZXJmYWNlIDxlbT5JbnRlcmZhY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkludGVyZmFjZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbnRlcmZhY2UoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9jZXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9jZXNzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2Nlc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcm9jZXNzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBnZXRQcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldFByb2Nlc3MgPGVtPlByb2Nlc3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2Nlc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF1dGhvcnMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50X0F1dGhvcnMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdhdXRob3JzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEF1dGhvcnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aG9yczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXV0aG9ycyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDaGFuZ2VEYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudF9DaGFuZ2VEYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdjaGFuZ2VEYXRlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldENoYW5nZURhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDaGFuZ2VEYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdjaGFuZ2VEZXNjcmlwdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50X1ZlcnNpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2ZXJzaW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIFByb2Nlc3NDb21wb25lbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNjMzg5YjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQ29tcHJpc2VzIG9mIGEgbGlzdCBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKHNpbWlsYXIgdG8gb3BlcmF0aW9uIGRlY2xhcmF0aW9ucykgdGhhdCBleHByZXNzIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudC4gIFRoZXNlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBhcmUgZXhwcmVzc2VkIHVzaW5nIFRhc2sgRGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBhIFJvbGUgRGVzY3JpcHRvci4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZVNwZWNpZmljYXRpb24gPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZUlPIDxlbT5JbnRlcmZhY2UgSU88L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9Hcm91cDEoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoxOSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yIiBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSW50ZXJmYWNlU3BlY2lmaWNhdGlvbicgZ3JvdXA9JyNncm91cDoxOSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEludGVyZmFjZVNwZWNpZmljYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludGVyZmFjZSBJTzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnRlcmZhY2UgSU88L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmZhY2UgSU88L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbnRlcmZhY2VJTycgZ3JvdXA9JyNncm91cDoxOSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEludGVyZmFjZUlPKCk7Ci0KLX0gLy8gUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NEZXNjcmlwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFhZmNkYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzRGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGdlbmVyYWxpemVkIEFjdGl2aXR5IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcm9jZXNzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRVc2FnZU5vdGVzIDxlbT5Vc2FnZSBOb3RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldEV4dGVybmFsSWQgPGVtPkV4dGVybmFsIElkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJvY2Vzc0Rlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc0Rlc2NyaXB0aW9uIGV4dGVuZHMgQWN0aXZpdHlEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlZmluZXMgdGhlIHNjb3BlIG9mIHRoZSBQcm9jZXNzLCBpLmUuIHdoaWNoIHR5cGVzIG9mIHByb2plY3RzIGRvZXMgaXQgYWRkcmVzcyBhbmQgd2hpY2ggbm90LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY29wZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2NvcGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU2NvcGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2NvcGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjb3BlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY29wZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2NvcGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVzYWdlIE5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZSBOb3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VXNhZ2VOb3RlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1VzYWdlTm90ZXMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VXNhZ2VOb3RlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFVzYWdlTm90ZXMgPGVtPlVzYWdlIE5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZSBOb3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VXNhZ2VOb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXNhZ2VOb3RlcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBkZWxpdmVyeSBwYXR0ZXJucyBhbmQgbW9kZWxzLiBJdCBpcyB1c2VkIGxpa2UgYSBzeW5vbnltLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBJZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXh0ZXJuYWxJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NEZXNjcmlwdGlvbl9FeHRlcm5hbElkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nZXh0ZXJuYWxJZCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFeHRlcm5hbElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxJZCA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIElkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHRlcm5hbElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUHJvY2Vzc0Rlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0VsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk5MmZiMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc0VsZW1lbnQuamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuCi0gKiBQcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRWxlbWVudCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJvY2Vzc0VsZW1lbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzRWxlbWVudCBleHRlbmRzIERlc2NyaWJhYmxlRWxlbWVudCB7Ci19IC8vIFByb2Nlc3NFbGVtZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc1BhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhYmM0MGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc1BhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc1BhY2thZ2UuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LgotICogQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2UjZ2V0UHJvY2Vzc0VsZW1lbnQgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGFja2FnZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJvY2Vzc1BhY2thZ2UnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzUGFja2FnZSBleHRlbmRzIE1ldGhvZFBhY2thZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGFja2FnZV9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoxMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcm9jZXNzRWxlbWVudCcgZ3JvdXA9JyNncm91cDoxMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFByb2Nlc3NFbGVtZW50KCk7Ci0KLX0gLy8gUHJvY2Vzc1BhY2thZ2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2FiMjVmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MDAga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4KLSAqIEEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlI2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSNnZXRCYXNlUHJvY2VzcyA8ZW0+QmFzZSBQcm9jZXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0dyb3VwMygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjQyJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgUHJvY2VzczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBQcm9jZXNzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQcm9jZXNzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlUHJvY2VzcygpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCYXNlUHJvY2VzcycgZ3JvdXA9JyNncm91cDo0MiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEJhc2VQcm9jZXNzKCk7Ci0KLX0gLy8gUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9SZXBvcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JlcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NjJiMjAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JlcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZXBvcnQuamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJlcG9ydCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUmVwb3J0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVwb3J0IGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBSZXBvcnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9SZXVzYWJsZUFzc2V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9SZXVzYWJsZUFzc2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4MDFiYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUmV1c2FibGVBc3NldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZXVzYWJsZUFzc2V0LmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNyBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcKLSAqIGhvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSZXVzYWJsZUFzc2V0KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdSZXVzYWJsZUFzc2V0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmV1c2FibGVBc3NldCBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gUmV1c2FibGVBc3NldApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvYWRtYXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvYWRtYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTUzNjFiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2FkbWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvYWRtYXAuamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2Ugd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4KLSAqIEFuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvYWRtYXAoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JvYWRtYXAnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2FkbWFwIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBSb2FkbWFwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NmM3ZmU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUm9sZS5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MDAga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAKLSAqIEEgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZSNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JvbGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlIGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIEZvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc3BvbnNpYmxlRm9yJyBncm91cD0nI2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UmVzcG9uc2libGVGb3IoKTsKLQotfSAvLyBSb2xlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZURlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODBhODMxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVEZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUm9sZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uI2dldFNraWxscyA8ZW0+U2tpbGxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U3lub255bXMgPGVtPlN5bm9ueW1zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUm9sZURlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZURlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBc3NpZ25tZW50QXBwcm9hY2hlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBc3NpZ25tZW50QXBwcm9hY2hlcyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzIDxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFzc2lnbm1lbnRBcHByb2FjaGVzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ta2lsbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIExpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2tpbGxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTa2lsbHMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NraWxscyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTa2lsbHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTa2lsbHMgPGVtPlNraWxsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2tpbGxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTa2lsbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNraWxscyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3lub255bXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIExpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TeW5vbnltczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3lub255bXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3lub255bXMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U3lub255bXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTeW5vbnltcyA8ZW0+U3lub255bXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN5bm9ueW1zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTeW5vbnltcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3lub255bXMoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBSb2xlRGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlRGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzM3NjAzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2xlRGVzY3JpcHRvci5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJvbGUgPGVtPlJvbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJlc3BvbnNpYmxlRm9yIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0b3IoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JvbGVEZXNjcmlwdG9yJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZURlc2NyaXB0b3IgZXh0ZW5kcyBEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJvbGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JvbGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Um9sZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3IjZ2V0Um9sZSA8ZW0+Um9sZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Um9sZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc3BvbnNpYmxlRm9yJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UmVzcG9uc2libGVGb3IoKTsKLQotfSAvLyBSb2xlRGVzY3JpcHRvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGVTZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGVTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWU2ZWUzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVTZXQuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIFNldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIE9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICJBbmFseXN0cyIgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICJCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QiLCAiU3lzdGVtIEFuYWx5c3QiLCBhcyB3ZWxsIGFzICJSZXF1aXJlbWVudHMgU3BlY2lmaWVyIiByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVTZXQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JvbGVTZXQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlU2V0IGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZVNldF9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZVNldF9Sb2xlKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JvbGUnIGdyb3VwPScjZ3JvdXA6MjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRSb2xlKCk7Ci0KLX0gLy8gUm9sZVNldApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGVTZXRHcm91cGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZVNldEdyb3VwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkOTE3OTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZVNldEdyb3VwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVTZXRHcm91cGluZy5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MDAga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgU2V0IEdyb3VwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogUm9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZyNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nI2dldFJvbGVTZXQgPGVtPlJvbGUgU2V0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVTZXRHcm91cGluZygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUm9sZVNldEdyb3VwaW5nJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZVNldEdyb3VwaW5nIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZVNldEdyb3VwaW5nX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvbGUgU2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2xlIFNldDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvbGUgU2V0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldCgpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSb2xlU2V0JyBncm91cD0nI2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Um9sZVNldCgpOwotCi19IC8vIFJvbGVTZXRHcm91cGluZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1NlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1NlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTI1MWIxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBTZWN0aW9uLmphdmEsdiAxLjMgMjAwNi8wNi8zMCAwMDo0MDoxMSBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRTdWJTZWN0aW9uIDxlbT5TdWIgU2VjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRQcmVkZWNlc3NvciA8ZW0+UHJlZGVjZXNzb3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFNlY3Rpb25OYW1lIDxlbT5TZWN0aW9uIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nU2VjdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlY3Rpb24gZXh0ZW5kcyBNZXRob2RFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWIgU2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIFNlY3Rpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIFNlY3Rpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFN1YlNlY3Rpb24oU2VjdGlvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbl9TdWJTZWN0aW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1YlNlY3Rpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZWN0aW9uIGdldFN1YlNlY3Rpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U3ViU2VjdGlvbiA8ZW0+U3ViIFNlY3Rpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1YiBTZWN0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTdWJTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdWJTZWN0aW9uKFNlY3Rpb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZWRlY2Vzc29yPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWRlY2Vzc29yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVkZWNlc3NvcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFNlY3Rpb25fUHJlZGVjZXNzb3IoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlZGVjZXNzb3InIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlZGVjZXNzb3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWRlY2Vzc29yKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRTZWN0aW9uX0Rlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Rlc2NyaXB0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY3Rpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2VjdGlvbk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nc2VjdGlvbk5hbWUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbk5hbWUgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZWN0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VjdGlvbk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFNlY3Rpb25fVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Im5hIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAc2VlICNpc1NldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjdW5zZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFNlY3Rpb25fVmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0ibmEiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ndmFyaWFiaWxpdHlUeXBlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQHNlZSAjaXNTZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotfSAvLyBTZWN0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvU3VwcG9ydGluZ01hdGVyaWFsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9TdXBwb3J0aW5nTWF0ZXJpYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWVkMTYzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9TdXBwb3J0aW5nTWF0ZXJpYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogU3VwcG9ydGluZ01hdGVyaWFsLmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNiBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdTdXBwb3J0aW5nTWF0ZXJpYWwnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTdXBwb3J0aW5nTWF0ZXJpYWwgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFN1cHBvcnRpbmdNYXRlcmlhbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2suamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2Q0ZmQ3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uCi0gKiBBIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAKLSAqIEEgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uIAotICogRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXZlbG9wIFVzZSBDYXNlIE1vZGVsIiBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICJtZXRob2QiIG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0UGVyZm9ybWVkQnkgPGVtPlBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldEVzdGltYXRlIDxlbT5Fc3RpbWF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0VG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFzaygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGFzaycga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2sgZXh0ZW5kcyBDb250ZW50RWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVjb25kaXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrX1ByZWNvbmRpdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmVjb25kaXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlY29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlY29uZGl0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBvc3Rjb25kaXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrX1Bvc3Rjb25kaXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUG9zdGNvbmRpdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQb3N0Y29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBvc3Rjb25kaXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcmZvcm1lZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyZm9ybWVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcmZvcm1lZCBCeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGVyZm9ybWVkQnkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrX1BlcmZvcm1lZEJ5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1BlcmZvcm1lZEJ5JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFBlcmZvcm1lZEJ5IDxlbT5QZXJmb3JtZWQgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlcmZvcm1lZCBCeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGVyZm9ybWVkQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBlcmZvcm1lZEJ5KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYW5kYXRvcnlJbnB1dCcgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE1hbmRhdG9yeUlucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk91dHB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dHB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19PdXRwdXQoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0cHV0JyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0T3V0cHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeScgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19PcHRpb25hbElucHV0KCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J09wdGlvbmFsSW5wdXQnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRPcHRpb25hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXN0aW1hdGU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0ZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19Fc3RpbWF0ZSgpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFc3RpbWF0ZScgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEVzdGltYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zJyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VG9vbCBNZW50b3I8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19Ub29sTWVudG9yKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Rvb2xNZW50b3InIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRUb29sTWVudG9yKCk7Ci0KLX0gLy8gVGFzawpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2tEZXNjcmlwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGFza0Rlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIzZDY0ODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGFza0Rlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRhc2tEZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzayBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgVGFzay4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGFza0Rlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFza0Rlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIENvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBbHRlcm5hdGl2ZXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FsdGVybmF0aXZlcyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBbHRlcm5hdGl2ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QdXJwb3NlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQdXJwb3NlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHVycG9zZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHVycG9zZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFRhc2tEZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2tEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UYXNrRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNDM0YWI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2tEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrRGVzY3JpcHRvci5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MDAga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2sgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuCi0gKiBBIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFRhc2sgPGVtPlRhc2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5IDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEFzc2lzdGVkQnkgPGVtPkFzc2lzdGVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRFeHRlcm5hbElucHV0IDxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0T3B0aW9uYWxJbnB1dCA8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRTdGVwIDxlbT5TdGVwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUYXNrRGVzY3JpcHRvcicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2tEZXNjcmlwdG9yIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFzazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFzayhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX1Rhc2soKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGFzayciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUYXNrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRUYXNrIDxlbT5UYXNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUYXNrKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBlcmZvcm1lZFByaW1hcmlseUJ5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGVyZm9ybWVkUHJpbWFyaWx5QnknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5IDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWRkaXRpb25hbGx5UGVyZm9ybWVkQnknIGdyb3VwPScjZ3JvdXA6MjYnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXNzaXN0ZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFzc2lzdGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXNzaXN0ZWQgQnk8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXNzaXN0ZWRCeScgZ3JvdXA9JyNncm91cDoyNiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEFzc2lzdGVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVybmFsIElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIElucHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVybmFsSW5wdXQnIGdyb3VwPScjZ3JvdXA6MjYnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFeHRlcm5hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWFuZGF0b3J5SW5wdXQnIGdyb3VwPScjZ3JvdXA6MjYnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRNYW5kYXRvcnlJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3B0aW9uYWwgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9wdGlvbmFsIElucHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3B0aW9uYWxJbnB1dCcgZ3JvdXA9JyNncm91cDoyNiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE9wdGlvbmFsSW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3V0cHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3V0cHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0cHV0JyBncm91cD0nI2dyb3VwOjI2JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0T3V0cHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGVwPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdGVwPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RlcDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfU3RlcCgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGVwJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0U3RlcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI3NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naXNTeW5jaHJvbml6ZWRXaXRoU291cmNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi19IC8vIFRhc2tEZXNjcmlwdG9yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGVhbVByb2ZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1RlYW1Qcm9maWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxNDQ0ODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGVhbVByb2ZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRlYW1Qcm9maWxlLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVhbSBQcm9maWxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLgotICogV29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLgotICogSGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRTdXBlclRlYW0gPGVtPlN1cGVyIFRlYW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFN1YlRlYW0gPGVtPlN1YiBUZWFtPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUZWFtUHJvZmlsZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlYW1Qcm9maWxlIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlX0dyb3VwMSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjE5JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvbGU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUZWFtUHJvZmlsZV9Sb2xlKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JvbGUnIGdyb3VwPScjZ3JvdXA6MTknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdXBlciBUZWFtPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdXBlciBUZWFtPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwZXIgVGVhbTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1cGVyVGVhbScgZ3JvdXA9JyNncm91cDoxOSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFN1cGVyVGVhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIFRlYW08L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YiBUZWFtPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIFRlYW08L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlX1N1YlRlYW0oKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3ViVGVhbScgZ3JvdXA9JyNncm91cDoxOSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFN1YlRlYW0oKTsKLQotfSAvLyBUZWFtUHJvZmlsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1RlbXBsYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjN2IzYjQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1RlbXBsYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRlbXBsYXRlLmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNiBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZW1wbGF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGZvciBhIHdvcmsgcHJvZHVjdCBhIHByZS1kZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsIGFuZC9vciBoZWFkaW5ncywgYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBob3cgdGhlIHNlY3Rpb25zIGFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkgYmUgcHJvdmlkZWQgZm9yIGRvY3VtZW50cywgYnV0IGFsc28gZm9yIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGVtcGxhdGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1RlbXBsYXRlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVtcGxhdGUgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFRlbXBsYXRlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGVybURlZmluaXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rlcm1EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQyYWU3ZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGVybURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGVybURlZmluaXRpb24uamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlcm0gRGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGRlZmluZXMgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGVybURlZmluaXRpb25zIGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGVybURlZmluaXRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Rlcm1EZWZpbml0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVybURlZmluaXRpb24gZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFRlcm1EZWZpbml0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVG9vbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZTUxYWJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVG9vbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MDAga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRvb2w8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2wjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2wjZ2V0VG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VG9vbCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVG9vbCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRvb2wgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUb29sX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUb29sX1Rvb2xNZW50b3IoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVG9vbE1lbnRvcicgZ3JvdXA9JyNncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRvb2xNZW50b3IoKTsKLQotfSAvLyBUb29sClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVG9vbE1lbnRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVG9vbE1lbnRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NDQxNmU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rvb2xNZW50b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVG9vbE1lbnRvci5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VG9vbCBNZW50b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBICBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VG9vbE1lbnRvcigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVG9vbE1lbnRvcicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRvb2xNZW50b3IgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFRvb2xNZW50b3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9VbWFGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9VbWFGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0M2VhOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVW1hRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVW1hRmFjdG9yeS5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVtYUZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVbWFGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hRmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZpdHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFjdGl2aXR5IGNyZWF0ZUFjdGl2aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZpdHlEZXNjcmlwdGlvbiBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFydGlmYWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcnRpZmFjdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXJ0aWZhY3QgY3JlYXRlQXJ0aWZhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcnRpZmFjdERlc2NyaXB0aW9uIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCcmVha2Rvd25FbGVtZW50IGNyZWF0ZUJyZWFrZG93bkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDYXBhYmlsaXR5UGF0dGVybiBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNoZWNrbGlzdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ2hlY2tsaXN0IGNyZWF0ZUNoZWNrbGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbXBvc2l0ZVJvbGUgY3JlYXRlQ29tcG9zaXRlUm9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb25jZXB0IGNyZWF0ZUNvbmNlcHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29uc3RyYWludDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29uc3RyYWludDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29uc3RyYWludCBjcmVhdGVDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnRlbnRDYXRlZ29yeSBjcmVhdGVDb250ZW50Q2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IENhdGVnb3J5IFBhY2thZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnRlbnRDYXRlZ29yeVBhY2thZ2UgY3JlYXRlQ29udGVudENhdGVnb3J5UGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50RGVzY3JpcHRpb24gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50RWxlbWVudCBjcmVhdGVDb250ZW50RWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IFBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29udGVudFBhY2thZ2UgY3JlYXRlQ29udGVudFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUN1c3RvbUNhdGVnb3J5IGNyZWF0ZUN1c3RvbUNhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVsaXZlcmFibGUgY3JlYXRlRGVsaXZlcmFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZWxpdmVyYWJsZURlc2NyaXB0aW9uIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVsaXZlcnlQcm9jZXNzIGNyZWF0ZURlbGl2ZXJ5UHJvY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZXNjcmliYWJsZUVsZW1lbnQgY3JlYXRlRGVzY3JpYmFibGVFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlc2NyaXB0b3IgY3JlYXRlRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZXNjcmlwdG9yRGVzY3JpcHRpb24gY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpc2NpcGxpbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpc2NpcGxpbmU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURpc2NpcGxpbmUgY3JlYXRlRGlzY2lwbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaXNjaXBsaW5lR3JvdXBpbmcgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvY3VtZW50Um9vdCBjcmVhdGVEb2N1bWVudFJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RG9tYWluPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Eb21haW48L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvbWFpbiBjcmVhdGVEb21haW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRWxlbWVudCBjcmVhdGVFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVzdGltYXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Fc3RpbWF0ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXN0aW1hdGUgY3JlYXRlRXN0aW1hdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVzdGltYXRpbmcgTWV0cmljPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFc3RpbWF0aW5nTWV0cmljIGNyZWF0ZUVzdGltYXRpbmdNZXRyaWMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIGNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFeGFtcGxlIGNyZWF0ZUV4YW1wbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3VpZGFuY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkd1aWRhbmNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlHdWlkYW5jZSBjcmVhdGVHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUd1aWRhbmNlRGVzY3JpcHRpb24gY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HdWlkZWxpbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3VpZGVsaW5lIGNyZWF0ZUd1aWRlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JdGVyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkl0ZXJhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSXRlcmF0aW9uIGNyZWF0ZUl0ZXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZENvbmZpZ3VyYXRpb24gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZEVsZW1lbnQgY3JlYXRlTWV0aG9kRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZExpYnJhcnkgY3JlYXRlTWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZFBhY2thZ2UgY3JlYXRlTWV0aG9kUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RQbHVnaW4gY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBVbml0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgVW5pdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kVW5pdCBjcmVhdGVNZXRob2RVbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNaWxlc3RvbmUgY3JlYXRlTWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU5hbWVkRWxlbWVudCBjcmVhdGVOYW1lZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3V0Y29tZSBjcmVhdGVPdXRjb21lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBhY2thZ2VhYmxlRWxlbWVudCBjcmVhdGVQYWNrYWdlYWJsZUVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGhhc2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBoYXNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQaGFzZSBjcmVhdGVQaGFzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQbGFubmluZ0RhdGEgY3JlYXRlUGxhbm5pbmdEYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByYWN0aWNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QcmFjdGljZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJhY3RpY2UgY3JlYXRlUHJhY3RpY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcmFjdGljZURlc2NyaXB0aW9uIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBjcmVhdGVQcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0NvbXBvbmVudCBjcmVhdGVQcm9jZXNzQ29tcG9uZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0Rlc2NyaXB0aW9uIGNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0VsZW1lbnQgY3JlYXRlUHJvY2Vzc0VsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NQYWNrYWdlIGNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXBvcnQgY3JlYXRlUmVwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmV1c2FibGVBc3NldCBjcmVhdGVSZXVzYWJsZUFzc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvYWRtYXAgY3JlYXRlUm9hZG1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlIGNyZWF0ZVJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZURlc2NyaXB0aW9uIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZURlc2NyaXB0b3IgY3JlYXRlUm9sZURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBTZXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlU2V0IGNyZWF0ZVJvbGVTZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlU2V0R3JvdXBpbmcgY3JlYXRlUm9sZVNldEdyb3VwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlY3Rpb24gY3JlYXRlU2VjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdXBwb3J0aW5nTWF0ZXJpYWwgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2s8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2s8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhc2sgY3JlYXRlVGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXNrRGVzY3JpcHRpb24gY3JlYXRlVGFza0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXNrRGVzY3JpcHRvciBjcmVhdGVUYXNrRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlYW0gUHJvZmlsZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGVhbVByb2ZpbGUgY3JlYXRlVGVhbVByb2ZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVtcGxhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUZW1wbGF0ZSBjcmVhdGVUZW1wbGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGVybURlZmluaXRpb24gY3JlYXRlVGVybURlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVG9vbCBjcmVhdGVUb29sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRvb2wgTWVudG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVG9vbE1lbnRvciBjcmVhdGVUb29sTWVudG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdoaXRlcGFwZXIgY3JlYXRlV2hpdGVwYXBlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrQnJlYWtkb3duRWxlbWVudCBjcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIERlZmluaXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya0RlZmluaXRpb24gY3JlYXRlV29ya0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBPcmRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBPcmRlcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya09yZGVyIGNyZWF0ZVdvcmtPcmRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya1Byb2R1Y3QgY3JlYXRlV29ya1Byb2R1Y3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtQcm9kdWN0RGVzY3JpcHRpb24gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdFR5cGUgY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVtYVBhY2thZ2UgZ2V0VW1hUGFja2FnZSgpOwotCi19IC8vVW1hRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVW1hUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVW1hUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMjliNjk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1VtYVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNjA3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVW1hUGFja2FnZS5qYXZhLHYgMS42IDIwMDYvMDkvMDggMDA6NTk6MjYganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5Ci0gKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBVbWFQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gInVtYSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMyI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJ1bWEiOwotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVbWFQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVsZW1lbnRJbXBsIDxlbT5FbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5FbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVMRU1FTlQgPSAyODsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTmFtZWRFbGVtZW50SW1wbCA8ZW0+TmFtZWQgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTmFtZWRFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXROYW1lZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTkFNRURfRUxFTUVOVCA9IDQ0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FRF9FTEVNRU5UX19OQU1FID0gRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5OYW1lZCBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5BTUVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IEVMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGFja2FnZWFibGVFbGVtZW50SW1wbCA8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGFja2FnZWFibGVFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEFDS0FHRUFCTEVfRUxFTUVOVCA9IDQ2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQUNLQUdFQUJMRV9FTEVNRU5UX19OQU1FID0gTkFNRURfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IE5BTUVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwgPGVtPk1ldGhvZCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19OQU1FID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX0dST1VQID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRSA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX0lEID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsIDxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fR1JPVVAgPSBNRVRIT0RfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fT1dORURfUlVMRSA9IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19JRCA9IE1FVEhPRF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19TVVBQUkVTU0VEID0gTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NFbGVtZW50SW1wbCA8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0VsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UID0gNTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fR1JPVVAgPSBERVNDUklCQUJMRV9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX09XTkVEX1JVTEUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19JRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBERVNDUklCQUJMRV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19OT0RFSUNPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fU0hBUEVJQ09OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUCA9IFBST0NFU1NfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEUgPSBQUk9DRVNTX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0lEID0gUFJPQ0VTU19FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEID0gUFJPQ0VTU19FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTiA9IFBST0NFU1NfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT04gPSBQUk9DRVNTX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFkgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlQgPSA3NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUCA9IEJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFID0gQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMSA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUiA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCA8ZW0+QWN0aXZpdHk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBQ1RJVklUWSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0dST1VQID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX09XTkVEX1JVTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19PUkRFUklOR19HVUlERSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fU1VQUFJFU1NFRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRVNFTlRBVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19OT0RFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1NIQVBFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFU0VOVEVEX0FGVEVSID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFU0VOVEVEX0JFRk9SRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QTEFOTklOR19EQVRBID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19TVVBFUl9BQ1RJVklUWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfT1BUSU9OQUwgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0lTX1BMQU5ORUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QUkVGSVggPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fR1JPVVAxID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFREVDRVNTT1IgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfRVZFTlRfRFJJVkVOID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfT05HT0lORyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19JU19SRVBFQVRBQkxFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFQ09ORElUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BPU1RDT05ESVRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0dST1VQMiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fQ0hFQ0tMSVNUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fQ09OQ0VQVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0VYQU1QTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0dVSURFTElORSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1JPQURNQVAgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1dISVRFUEFQRVIgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWN0aXZpdHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsIDxlbT5NZXRob2QgVW5pdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kVW5pdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVCA9IDQyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fR1JPVVAgPSBNRVRIT0RfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX09XTkVEX1JVTEUgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19JRCA9IE1FVEhPRF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX1NVUFBSRVNTRUQgPSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19BVVRIT1JTID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19WRVJTSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIFVuaXQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwgPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT04gPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRSA9IE1FVEhPRF9VTklUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19HUk9VUCA9IE1FVEhPRF9VTklUX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFID0gTUVUSE9EX1VOSVRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0lEID0gTUVUSE9EX1VOSVRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfVU5JVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBNRVRIT0RfVU5JVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IE1FVEhPRF9VTklUX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsIDxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT04gPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19HUk9VUCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCA8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT04gPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fR1JPVVAgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19JRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fU0VDVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ib3cgVG8gU3RhZmY8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCA8ZW0+Q29udGVudCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fR1JPVVAgPSBERVNDUklCQUJMRV9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19JRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBERVNDUklCQUJMRV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19OT0RFSUNPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fU0hBUEVJQ09OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19HUk9VUDEgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1QgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1dISVRFUEFQRVIgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCA8ZW0+V29yayBQcm9kdWN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUID0gODA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19HUk9VUCA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19PV05FRF9SVUxFID0gQ09OVEVOVF9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0lEID0gQ09OVEVOVF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1NVUFBSRVNTRUQgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fTk9ERUlDT04gPSBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19TSEFQRUlDT04gPSBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fR1JPVVAxID0gQ09OVEVOVF9FTEVNRU5UX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0NIRUNLTElTVCA9IENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fQ09OQ0VQVCA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0VYQU1QTEUgPSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0dVSURFTElORSA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19XSElURVBBUEVSID0gQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fR1JPVVAyID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0VTVElNQVRFID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fUkVQT1JUID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdEltcGwgPGVtPkFydGlmYWN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QXJ0aWZhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1QgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fTkFNRSA9IFdPUktfUFJPRFVDVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0dST1VQID0gV09SS19QUk9EVUNUX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fT1dORURfUlVMRSA9IFdPUktfUFJPRFVDVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fSUQgPSBXT1JLX1BST0RVQ1RfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1NVUFBSRVNTRUQgPSBXT1JLX1BST0RVQ1RfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1BSRVNFTlRBVElPTiA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX05PREVJQ09OID0gV09SS19QUk9EVUNUX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1NIQVBFSUNPTiA9IFdPUktfUFJPRFVDVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0dST1VQMSA9IFdPUktfUFJPRFVDVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0NIRUNLTElTVCA9IFdPUktfUFJPRFVDVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19DT05DRVBUID0gV09SS19QUk9EVUNUX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19FWEFNUExFID0gV09SS19QUk9EVUNUX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0dVSURFTElORSA9IFdPUktfUFJPRFVDVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fUkVVU0FCTEVfQVNTRVQgPSBXT1JLX1BST0RVQ1RfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19TVVBQT1JUSU5HX01BVEVSSUFMID0gV09SS19QUk9EVUNUX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19XSElURVBBUEVSID0gV09SS19QUk9EVUNUX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1ZBUklBQklMSVRZX1RZUEUgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fR1JPVVAyID0gV09SS19QUk9EVUNUX19HUk9VUDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19FU1RJTUFURSA9IFdPUktfUFJPRFVDVF9fRVNUSU1BVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBXT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fUkVQT1JUID0gV09SS19QUk9EVUNUX19SRVBPUlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19URU1QTEFURSA9IFdPUktfUFJPRFVDVF9fVEVNUExBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19UT09MX01FTlRPUiA9IFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fR1JPVVAzID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lZCBBcnRpZmFjdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVCA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BcnRpZmFjdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OID0gODE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fR1JPVVAgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU0VDVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbCA8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT04gPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fTkFNRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0dST1VQID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fSUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0NPUFlSSUdIVCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fQVVUSE9SUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fVkVSU0lPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBPdXRsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0ltcGwgPGVtPlByb2Nlc3M8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTUyA9IDUxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19OQU1FID0gQUNUSVZJVFlfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0dST1VQID0gQUNUSVZJVFlfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX09XTkVEX1JVTEUgPSBBQ1RJVklUWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0JSSUVGX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSUQgPSBBQ1RJVklUWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19PUkRFUklOR19HVUlERSA9IEFDVElWSVRZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fU1VQUFJFU1NFRCA9IEFDVElWSVRZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRVNFTlRBVElPTiA9IEFDVElWSVRZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19OT0RFSUNPTiA9IEFDVElWSVRZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRVNFTlRBVElPTl9OQU1FID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1NIQVBFSUNPTiA9IEFDVElWSVRZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFU0VOVEVEX0FGVEVSID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRSA9IEFDVElWSVRZX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QTEFOTklOR19EQVRBID0gQUNUSVZJVFlfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19TVVBFUl9BQ1RJVklUWSA9IEFDVElWSVRZX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBBQ1RJVklUWV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSVNfT1BUSU9OQUwgPSBBQ1RJVklUWV9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX1BMQU5ORUQgPSBBQ1RJVklUWV9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QUkVGSVggPSBBQ1RJVklUWV9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fR1JPVVAxID0gQUNUSVZJVFlfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFREVDRVNTT1IgPSBBQ1RJVklUWV9fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOID0gQUNUSVZJVFlfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSVNfT05HT0lORyA9IEFDVElWSVRZX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19SRVBFQVRBQkxFID0gQUNUSVZJVFlfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFQ09ORElUSU9OID0gQUNUSVZJVFlfX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUE9TVENPTkRJVElPTiA9IEFDVElWSVRZX19QT1NUQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fR1JPVVAyID0gQUNUSVZJVFlfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fQlJFQUtET1dOX0VMRU1FTlQgPSBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19DSEVDS0xJU1QgPSBBQ1RJVklUWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0NPTkNFUFQgPSBBQ1RJVklUWV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19FWEFNUExFID0gQUNUSVZJVFlfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19HVUlERUxJTkUgPSBBQ1RJVklUWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1JPQURNQVAgPSBBQ1RJVklUWV9fUk9BRE1BUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUkVVU0FCTEVfQVNTRVQgPSBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fU1VQUE9SVElOR19NQVRFUklBTCA9IEFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1dISVRFUEFQRVIgPSBBQ1RJVklUWV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19FTkFDVEFCTEUgPSBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1ZBUklBQklMSVRZX1RZUEUgPSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fREVGQVVMVF9DT05URVhUID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fVkFMSURfQ09OVEVYVCA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GRUFUVVJFX0NPVU5UID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ2FwYWJpbGl0eVBhdHRlcm5JbXBsIDxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNhcGFiaWxpdHlQYXR0ZXJuSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDYXBhYmlsaXR5UGF0dGVybigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk4gPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX05BTUUgPSBQUk9DRVNTX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0dST1VQID0gUFJPQ0VTU19fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19PV05FRF9SVUxFID0gUFJPQ0VTU19fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSUQgPSBQUk9DRVNTX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19TVVBQUkVTU0VEID0gUFJPQ0VTU19fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fTk9ERUlDT04gPSBQUk9DRVNTX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1NIQVBFSUNPTiA9IFBST0NFU1NfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRVNFTlRFRF9BRlRFUiA9IFBST0NFU1NfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QUkVTRU5URURfQkVGT1JFID0gUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QTEFOTklOR19EQVRBID0gUFJPQ0VTU19fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fU1VQRVJfQUNUSVZJVFkgPSBQUk9DRVNTX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFBST0NFU1NfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfT1BUSU9OQUwgPSBQUk9DRVNTX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JU19QTEFOTkVEID0gUFJPQ0VTU19fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRUZJWCA9IFBST0NFU1NfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fR1JPVVAxID0gUFJPQ0VTU19fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRURFQ0VTU09SID0gUFJPQ0VTU19fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JU19FVkVOVF9EUklWRU4gPSBQUk9DRVNTX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfT05HT0lORyA9IFBST0NFU1NfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfUkVQRUFUQUJMRSA9IFBST0NFU1NfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QUkVDT05ESVRJT04gPSBQUk9DRVNTX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUE9TVENPTkRJVElPTiA9IFBST0NFU1NfX1BPU1RDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0dST1VQMiA9IFBST0NFU1NfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19CUkVBS0RPV05fRUxFTUVOVCA9IFBST0NFU1NfX0JSRUFLRE9XTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19DSEVDS0xJU1QgPSBQUk9DRVNTX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19DT05DRVBUID0gUFJPQ0VTU19fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0VYQU1QTEUgPSBQUk9DRVNTX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19HVUlERUxJTkUgPSBQUk9DRVNTX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19ST0FETUFQID0gUFJPQ0VTU19fUk9BRE1BUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19SRVVTQUJMRV9BU1NFVCA9IFBST0NFU1NfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fU1VQUE9SVElOR19NQVRFUklBTCA9IFBST0NFU1NfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19XSElURVBBUEVSID0gUFJPQ0VTU19fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0lTX0VOQUNUQUJMRSA9IFBST0NFU1NfX0lTX0VOQUNUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19WQVJJQUJJTElUWV9UWVBFID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0lOQ0xVREVTX1BBVFRFUk4gPSBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fREVGQVVMVF9DT05URVhUID0gUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbGlkIENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fVkFMSURfQ09OVEVYVCA9IFBST0NFU1NfX1ZBTElEX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkYW5jZUltcGwgPGVtPkd1aWRhbmNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkYW5jZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0UgPSAzMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19HUk9VUCA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX09XTkVEX1JVTEUgPSBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0lEID0gQ09OVEVOVF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19TSEFQRUlDT04gPSBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19HUk9VUDEgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19DSEVDS0xJU1QgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fQ09OQ0VQVCA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fRVhBTVBMRSA9IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19HVUlERUxJTkUgPSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fV0hJVEVQQVBFUiA9IENPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkd1aWRhbmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ2hlY2tsaXN0SW1wbCA8ZW0+Q2hlY2tsaXN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DaGVja2xpc3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENoZWNrbGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDSEVDS0xJU1QgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2hlY2tsaXN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpcHRvckltcGwgPGVtPkRlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUiA9IDIyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0dST1VQID0gQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX09XTkVEX1JVTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0JSSUVGX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19OT0RFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1NIQVBFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QTEFOTklOR19EQVRBID0gQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0lTX1BMQU5ORUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QUkVGSVggPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsIDxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1IgPSA2MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19OQU1FID0gREVTQ1JJUFRPUl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19HUk9VUCA9IERFU0NSSVBUT1JfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fT1dORURfUlVMRSA9IERFU0NSSVBUT1JfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0JSSUVGX0RFU0NSSVBUSU9OID0gREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0lEID0gREVTQ1JJUFRPUl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFID0gREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fU1VQUFJFU1NFRCA9IERFU0NSSVBUT1JfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19QUkVTRU5UQVRJT04gPSBERVNDUklQVE9SX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX05PREVJQ09OID0gREVTQ1JJUFRPUl9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19TSEFQRUlDT04gPSBERVNDUklQVE9SX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19QUkVTRU5URURfQUZURVIgPSBERVNDUklQVE9SX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRSA9IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQSA9IERFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRZID0gREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0lTX09QVElPTkFMID0gREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fSVNfUExBTk5FRCA9IERFU0NSSVBUT1JfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19QUkVGSVggPSBERVNDUklQVE9SX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUk9MRSA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUiA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbCA8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbXBvc2l0ZVJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEUgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fTkFNRSA9IFJPTEVfREVTQ1JJUFRPUl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0dST1VQID0gUk9MRV9ERVNDUklQVE9SX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fT1dORURfUlVMRSA9IFJPTEVfREVTQ1JJUFRPUl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19CUklFRl9ERVNDUklQVElPTiA9IFJPTEVfREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSUQgPSBST0xFX0RFU0NSSVBUT1JfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX09SREVSSU5HX0dVSURFID0gUk9MRV9ERVNDUklQVE9SX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1NVUFBSRVNTRUQgPSBST0xFX0RFU0NSSVBUT1JfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRVNFTlRBVElPTiA9IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX05PREVJQ09OID0gUk9MRV9ERVNDUklQVE9SX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QUkVTRU5UQVRJT05fTkFNRSA9IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1NIQVBFSUNPTiA9IFJPTEVfREVTQ1JJUFRPUl9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QUkVTRU5URURfQUZURVIgPSBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRVNFTlRFRF9CRUZPUkUgPSBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QTEFOTklOR19EQVRBID0gUk9MRV9ERVNDUklQVE9SX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1NVUEVSX0FDVElWSVRZID0gUk9MRV9ERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gUk9MRV9ERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSVNfT1BUSU9OQUwgPSBST0xFX0RFU0NSSVBUT1JfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSVNfUExBTk5FRCA9IFJPTEVfREVTQ1JJUFRPUl9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUFJFRklYID0gUk9MRV9ERVNDUklQVE9SX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IFJPTEVfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUk9MRSA9IFJPTEVfREVTQ1JJUFRPUl9fUk9MRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19SRVNQT05TSUJMRV9GT1IgPSBST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19HUk9VUDEgPSBST0xFX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWdncmVnYXRlZCBSb2xlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFID0gUk9MRV9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX0ZFQVRVUkVfQ09VTlQgPSBST0xFX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29uY2VwdEltcGwgPGVtPkNvbmNlcHQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbmNlcHRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbmNlcHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVCA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db25jZXB0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnN0cmFpbnRJbXBsIDxlbT5Db25zdHJhaW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db25zdHJhaW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlNUUkFJTlQgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19HUk9VUCA9IE1FVEhPRF9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19PV05FRF9SVUxFID0gTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX0lEID0gTUVUSE9EX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX1NVUFBSRVNTRUQgPSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fTUFJTl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnN0cmFpbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudENhdGVnb3J5SW1wbCA8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudENhdGVnb3J5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50Q2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWSA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19HUk9VUCA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRSA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0lEID0gQ09OVEVOVF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT04gPSBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0dST1VQMSA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVCA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFID0gQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FID0gQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1dISVRFUEFQRVIgPSBDT05URU5UX0VMRU1FTlRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFID0gNDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19HUk9VUCA9IE1FVEhPRF9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fT1dORURfUlVMRSA9IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0lEID0gTUVUSE9EX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0dST1VQMSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0UgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbCA8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRSA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUCA9IE1FVEhPRF9QQUNLQUdFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX09XTkVEX1JVTEUgPSBNRVRIT0RfUEFDS0FHRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0lEID0gTUVUSE9EX1BBQ0tBR0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9QQUNLQUdFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19TVVBQUkVTU0VEID0gTUVUSE9EX1BBQ0tBR0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0dST1VQMSA9IE1FVEhPRF9QQUNLQUdFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2VkIFBhY2thZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0UgPSBNRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0UgPSBNRVRIT0RfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HTE9CQUwgPSBNRVRIT0RfUEFDS0FHRV9fR0xPQkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDIgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50IENhdGVnb3J5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0NPTlRFTlRfQ0FURUdPUlkgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db250ZW50IENhdGVnb3J5IFBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwgPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRSA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19HUk9VUCA9IE1FVEhPRF9QQUNLQUdFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX09XTkVEX1JVTEUgPSBNRVRIT0RfUEFDS0FHRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0lEID0gTUVUSE9EX1BBQ0tBR0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9QQUNLQUdFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19TVVBQUkVTU0VEID0gTUVUSE9EX1BBQ0tBR0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0dST1VQMSA9IE1FVEhPRF9QQUNLQUdFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2VkIFBhY2thZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0UgPSBNRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0UgPSBNRVRIT0RfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19HTE9CQUwgPSBNRVRIT0RfUEFDS0FHRV9fR0xPQkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19HUk9VUDIgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50IEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UID0gTUVUSE9EX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsIDxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkN1c3RvbUNhdGVnb3J5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDdXN0b21DYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUlkgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19HUk9VUCA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fT1dORURfUlVMRSA9IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0lEID0gQ09OVEVOVF9DQVRFR09SWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0dST1VQMSA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fQ09OQ0VQVCA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19FWEFNUExFID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fR1VJREVMSU5FID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9DQVRFR09SWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1dISVRFUEFQRVIgPSBDT05URU5UX0NBVEVHT1JZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19HUk9VUDIgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIENhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SWSA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwgPGVtPkRlbGl2ZXJhYmxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcmFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEUgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX05BTUUgPSBXT1JLX1BST0RVQ1RfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19HUk9VUCA9IFdPUktfUFJPRFVDVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX09XTkVEX1JVTEUgPSBXT1JLX1BST0RVQ1RfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0lEID0gV09SS19QUk9EVUNUX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19PUkRFUklOR19HVUlERSA9IFdPUktfUFJPRFVDVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19TVVBQUkVTU0VEID0gV09SS19QUk9EVUNUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19QUkVTRU5UQVRJT04gPSBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19OT0RFSUNPTiA9IFdPUktfUFJPRFVDVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19TSEFQRUlDT04gPSBXT1JLX1BST0RVQ1RfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19HUk9VUDEgPSBXT1JLX1BST0RVQ1RfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19DSEVDS0xJU1QgPSBXT1JLX1BST0RVQ1RfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fQ09OQ0VQVCA9IFdPUktfUFJPRFVDVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fRVhBTVBMRSA9IFdPUktfUFJPRFVDVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19HVUlERUxJTkUgPSBXT1JLX1BST0RVQ1RfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1JFVVNBQkxFX0FTU0VUID0gV09SS19QUk9EVUNUX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fU1VQUE9SVElOR19NQVRFUklBTCA9IFdPUktfUFJPRFVDVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fV0hJVEVQQVBFUiA9IFdPUktfUFJPRFVDVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19WQVJJQUJJTElUWV9UWVBFID0gV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0dST1VQMiA9IFdPUktfUFJPRFVDVF9fR1JPVVAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fRVNUSU1BVEUgPSBXT1JLX1BST0RVQ1RfX0VTVElNQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1JFUE9SVCA9IFdPUktfUFJPRFVDVF9fUkVQT1JUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fVEVNUExBVEUgPSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fVE9PTF9NRU5UT1IgPSBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0dST1VQMyA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyZWQgV29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVCA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZWxpdmVyYWJsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsIDxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTiA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fTkFNRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0dST1VQID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fSUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0NPUFlSSUdIVCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fQVVUSE9SUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fVkVSU0lPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYWNrYWdpbmcgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbCA8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZWxpdmVyeVByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTUyA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19OQU1FID0gUFJPQ0VTU19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fR1JPVVAgPSBQUk9DRVNTX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19PV05FRF9SVUxFID0gUFJPQ0VTU19fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JRCA9IFBST0NFU1NfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fU1VQUFJFU1NFRCA9IFBST0NFU1NfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFU0VOVEFUSU9OID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fTk9ERUlDT04gPSBQUk9DRVNTX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fU0hBUEVJQ09OID0gUFJPQ0VTU19fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BSRVNFTlRFRF9BRlRFUiA9IFBST0NFU1NfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRSA9IFBST0NFU1NfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BMQU5OSU5HX0RBVEEgPSBQUk9DRVNTX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fU1VQRVJfQUNUSVZJVFkgPSBQUk9DRVNTX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBQUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19PUFRJT05BTCA9IFBST0NFU1NfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19QTEFOTkVEID0gUFJPQ0VTU19fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVGSVggPSBQUk9DRVNTX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19HUk9VUDEgPSBQUk9DRVNTX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BSRURFQ0VTU09SID0gUFJPQ0VTU19fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOID0gUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19PTkdPSU5HID0gUFJPQ0VTU19fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSVNfUkVQRUFUQUJMRSA9IFBST0NFU1NfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFQ09ORElUSU9OID0gUFJPQ0VTU19fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QT1NUQ09ORElUSU9OID0gUFJPQ0VTU19fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0dST1VQMiA9IFBST0NFU1NfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fQlJFQUtET1dOX0VMRU1FTlQgPSBQUk9DRVNTX19CUkVBS0RPV05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0NIRUNLTElTVCA9IFBST0NFU1NfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19DT05DRVBUID0gUFJPQ0VTU19fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19FWEFNUExFID0gUFJPQ0VTU19fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0dVSURFTElORSA9IFBST0NFU1NfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19ST0FETUFQID0gUFJPQ0VTU19fUk9BRE1BUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUkVVU0FCTEVfQVNTRVQgPSBQUk9DRVNTX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19TVVBQT1JUSU5HX01BVEVSSUFMID0gUFJPQ0VTU19fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19XSElURVBBUEVSID0gUFJPQ0VTU19fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19FTkFDVEFCTEUgPSBQUk9DRVNTX19JU19FTkFDVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19WQVJJQUJJTElUWV9UWVBFID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JTkNMVURFU19QQVRURVJOID0gUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQgPSBQUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fVkFMSURfQ09OVEVYVCA9IFBST0NFU1NfX1ZBTElEX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19HUk9VUDMgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbW11bmljYXRpb25zIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTCA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWR1Y2F0aW9uIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUwgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsIDxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OID0gNTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX05BTUUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fR1JPVVAgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19JRCA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQVVUSE9SUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fVkVSU0lPTiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhvdyBUbyBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dfVE9fU1RBRkY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY29wZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgTm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCA8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT04gPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fTkFNRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0dST1VQID0gUFJPQ0VTU19ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fSUQgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0NPUFlSSUdIVCA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQVVUSE9SUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVkVSU0lPTiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gUFJPQ0VTU19ERVNDUklQVElPTl9fU0VDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhvdyBUbyBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFVSUE9TRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1BVUlBPU0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIE5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVMgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmlzayBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBPZiBDb250cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1QgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsIDxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OID0gMjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fR1JPVVAgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19JRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQVVUSE9SUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fVkVSU0lPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZpbmVkIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUltcGwgPGVtPkRpc2NpcGxpbmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpc2NpcGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORSA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fR1JPVVAgPSBDT05URU5UX0NBVEVHT1JZX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19PV05FRF9SVUxFID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19JRCA9IENPTlRFTlRfQ0FURUdPUllfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fR1JPVVAxID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0NPTkNFUFQgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0VYQU1QTEUgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fR1VJREVMSU5FID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1dISVRFUEFQRVIgPSBDT05URU5UX0NBVEVHT1JZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19HUk9VUDIgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1RBU0sgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBEaXNjaXBsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORSA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIFdvcmtmbG93PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1cgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpc2NpcGxpbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsIDxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpc2NpcGxpbmVHcm91cGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUCA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX09XTkVEX1JVTEUgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0lEID0gQ09OVEVOVF9DQVRFR09SWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19TVVBQUkVTU0VEID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDEgPSBDT05URU5UX0NBVEVHT1JZX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19DSEVDS0xJU1QgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fQ09OQ0VQVCA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fRVhBTVBMRSA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19HVUlERUxJTkUgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9DQVRFR09SWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fV0hJVEVQQVBFUiA9IENPTlRFTlRfQ0FURUdPUllfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0dST1VQMiA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzY2lwbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORSA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwgPGVtPkRvY3VtZW50IFJvb3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1QgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fTUlYRUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIExpYnJhcnk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU4gPSA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9GRUFUVVJFX0NPVU5UID0gNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb21haW5JbXBsIDxlbT5Eb21haW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvbWFpbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RG9tYWluKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERPTUFJTiA9IDI3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0dST1VQID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19PV05FRF9SVUxFID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fSUQgPSBDT05URU5UX0NBVEVHT1JZX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19TVVBQUkVTU0VEID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fR1JPVVAxID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19DSEVDS0xJU1QgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19DT05DRVBUID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0VYQU1QTEUgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19HVUlERUxJTkUgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fUkVVU0FCTEVfQVNTRVQgPSBDT05URU5UX0NBVEVHT1JZX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fV0hJVEVQQVBFUiA9IENPTlRFTlRfQ0FURUdPUllfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0dST1VQMiA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1dPUktfUFJPRFVDVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViZG9tYWluPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1NVQkRPTUFJTiA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RG9tYWluPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0ZUltcGwgPGVtPkVzdGltYXRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RXN0aW1hdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEUgPSAyOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX0dST1VQMiA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gTWV0cmljPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fRVNUSU1BVElPTl9NRVRSSUMgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVzdGltYXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0aW5nTWV0cmljSW1wbCA8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRpbmdNZXRyaWNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVzdGltYXRpbmdNZXRyaWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUMgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVzdGltYXRpbmcgTWV0cmljPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gMzE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkV4YW1wbGVJbXBsIDxlbT5FeGFtcGxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5FeGFtcGxlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFeGFtcGxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVYQU1QTEUgPSAzMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwgPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OID0gMzQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0dST1VQID0gQ09OVEVOVF9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0NPUFlSSUdIVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fU0VDVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0YWNobWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkZWxpbmVJbXBsIDxlbT5HdWlkZWxpbmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRlbGluZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGVsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdVSURFTElORSA9IDM1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3VpZGVsaW5lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuSXRlcmF0aW9uSW1wbCA8ZW0+SXRlcmF0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5JdGVyYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEl0ZXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJVEVSQVRJT04gPSAzNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19OQU1FID0gQUNUSVZJVFlfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fR1JPVVAgPSBBQ1RJVklUWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19PV05FRF9SVUxFID0gQUNUSVZJVFlfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JRCA9IEFDVElWSVRZX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fT1JERVJJTkdfR1VJREUgPSBBQ1RJVklUWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fU1VQUFJFU1NFRCA9IEFDVElWSVRZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFU0VOVEFUSU9OID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fTk9ERUlDT04gPSBBQ1RJVklUWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fU0hBUEVJQ09OID0gQUNUSVZJVFlfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRVNFTlRFRF9BRlRFUiA9IEFDVElWSVRZX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFU0VOVEVEX0JFRk9SRSA9IEFDVElWSVRZX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BMQU5OSU5HX0RBVEEgPSBBQ1RJVklUWV9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fU1VQRVJfQUNUSVZJVFkgPSBBQ1RJVklUWV9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBBQ1RJVklUWV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19PUFRJT05BTCA9IEFDVElWSVRZX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19QTEFOTkVEID0gQUNUSVZJVFlfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QUkVGSVggPSBBQ1RJVklUWV9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19HUk9VUDEgPSBBQ1RJVklUWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRURFQ0VTU09SID0gQUNUSVZJVFlfX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfRVZFTlRfRFJJVkVOID0gQUNUSVZJVFlfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19PTkdPSU5HID0gQUNUSVZJVFlfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfUkVQRUFUQUJMRSA9IEFDVElWSVRZX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFQ09ORElUSU9OID0gQUNUSVZJVFlfX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QT1NUQ09ORElUSU9OID0gQUNUSVZJVFlfX1BPU1RDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0dST1VQMiA9IEFDVElWSVRZX19HUk9VUDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fQlJFQUtET1dOX0VMRU1FTlQgPSBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0NIRUNLTElTVCA9IEFDVElWSVRZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19DT05DRVBUID0gQUNUSVZJVFlfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19FWEFNUExFID0gQUNUSVZJVFlfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0dVSURFTElORSA9IEFDVElWSVRZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19ST0FETUFQID0gQUNUSVZJVFlfX1JPQURNQVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUkVVU0FCTEVfQVNTRVQgPSBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19XSElURVBBUEVSID0gQUNUSVZJVFlfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRW5hY3RhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19FTkFDVEFCTEUgPSBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19WQVJJQUJJTElUWV9UWVBFID0gQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SXRlcmF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9GRUFUVVJFX0NPVU5UID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwgPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OID0gMzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19OQU1FID0gTUVUSE9EX1VOSVRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19HUk9VUCA9IE1FVEhPRF9VTklUX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fT1dORURfUlVMRSA9IE1FVEhPRF9VTklUX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX1VOSVRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0lEID0gTUVUSE9EX1VOSVRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1VOSVRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fU1VQUFJFU1NFRCA9IE1FVEhPRF9VTklUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19DT1BZUklHSFQgPSBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQVVUSE9SUyA9IE1FVEhPRF9VTklUX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0NIQU5HRV9EQVRFID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fVkVSU0lPTiA9IE1FVEhPRF9VTklUX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgQ29uZmlndXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT04gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT04gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZpZXc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzcyBWaWV3PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsIDxlbT5NZXRob2QgTGlicmFyeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWSA9IDM5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fTkFNRSA9IE1FVEhPRF9VTklUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fR1JPVVAgPSBNRVRIT0RfVU5JVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX09XTkVEX1JVTEUgPSBNRVRIT0RfVU5JVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19JRCA9IE1FVEhPRF9VTklUX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9VTklUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX1NVUFBSRVNTRUQgPSBNRVRIT0RfVU5JVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQ09QWVJJR0hUID0gTUVUSE9EX1VOSVRfX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX0FVVEhPUlMgPSBNRVRIT0RfVU5JVF9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19DSEFOR0VfREFURSA9IE1FVEhPRF9VTklUX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX1ZFUlNJT04gPSBNRVRIT0RfVU5JVF9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX0NPTkZJR1VSQVRJT04gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX1RPT0wgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbCA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTiA9IDQxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19OQU1FID0gTUVUSE9EX1VOSVRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0dST1VQID0gTUVUSE9EX1VOSVRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX09XTkVEX1JVTEUgPSBNRVRIT0RfVU5JVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX1VOSVRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fSUQgPSBNRVRIT0RfVU5JVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9VTklUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fU1VQUFJFU1NFRCA9IE1FVEhPRF9VTklUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0NPUFlSSUdIVCA9IE1FVEhPRF9VTklUX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0FVVEhPUlMgPSBNRVRIT0RfVU5JVF9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0NIQU5HRV9EQVRFID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0NIQU5HRV9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1ZFUlNJT04gPSBNRVRIT0RfVU5JVF9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkIE1ldGhvZCBQbHVnaW48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1JFRkVSRU5DRURfTUVUSE9EX1BMVUdJTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRSA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZXIgQ2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRSA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWlsZXN0b25lSW1wbCA8ZW0+TWlsZXN0b25lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NaWxlc3RvbmVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1pbGVzdG9uZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNSUxFU1RPTkUgPSA0MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19HUk9VUCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fT1dORURfUlVMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX09SREVSSU5HX0dVSURFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fU1VQUFJFU1NFRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVTRU5UQVRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX05PREVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19TSEFQRUlDT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVTRU5URURfQUZURVIgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fUFJFU0VOVEVEX0JFRk9SRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fUExBTk5JTkdfREFUQSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1NVUEVSX0FDVElWSVRZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lTX09QVElPTkFMID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfUExBTk5FRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVGSVggPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0dST1VQMSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVERUNFU1NPUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfRVZFTlRfRFJJVkVOID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lTX09OR09JTkcgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lTX1JFUEVBVEFCTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1pbGVzdG9uZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfRkVBVFVSRV9DT1VOVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuT3V0Y29tZUltcGwgPGVtPk91dGNvbWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk91dGNvbWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE91dGNvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1VUQ09NRSA9IDQ1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19OQU1FID0gV09SS19QUk9EVUNUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19HUk9VUCA9IFdPUktfUFJPRFVDVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fT1dORURfUlVMRSA9IFdPUktfUFJPRFVDVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0lEID0gV09SS19QUk9EVUNUX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fU1VQUFJFU1NFRCA9IFdPUktfUFJPRFVDVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19QUkVTRU5UQVRJT04gPSBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX05PREVJQ09OID0gV09SS19QUk9EVUNUX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19TSEFQRUlDT04gPSBXT1JLX1BST0RVQ1RfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0dST1VQMSA9IFdPUktfUFJPRFVDVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fQ0hFQ0tMSVNUID0gV09SS19QUk9EVUNUX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fQ09OQ0VQVCA9IFdPUktfUFJPRFVDVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19FWEFNUExFID0gV09SS19QUk9EVUNUX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fR1VJREVMSU5FID0gV09SS19QUk9EVUNUX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1JFVVNBQkxFX0FTU0VUID0gV09SS19QUk9EVUNUX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19TVVBQT1JUSU5HX01BVEVSSUFMID0gV09SS19QUk9EVUNUX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1dISVRFUEFQRVIgPSBXT1JLX1BST0RVQ1RfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1ZBUklBQklMSVRZX1RZUEUgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19HUk9VUDIgPSBXT1JLX1BST0RVQ1RfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fRVNUSU1BVEUgPSBXT1JLX1BST0RVQ1RfX0VTVElNQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBXT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19SRVBPUlQgPSBXT1JLX1BST0RVQ1RfX1JFUE9SVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fVEVNUExBVEUgPSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19UT09MX01FTlRPUiA9IFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1I7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+T3V0Y29tZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGhhc2VJbXBsIDxlbT5QaGFzZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGhhc2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBoYXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBIQVNFID0gNDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19OQU1FID0gQUNUSVZJVFlfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19HUk9VUCA9IEFDVElWSVRZX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fT1dORURfUlVMRSA9IEFDVElWSVRZX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lEID0gQUNUSVZJVFlfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX09SREVSSU5HX0dVSURFID0gQUNUSVZJVFlfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fU1VQUFJFU1NFRCA9IEFDVElWSVRZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVTRU5UQVRJT04gPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX05PREVJQ09OID0gQUNUSVZJVFlfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRVNFTlRBVElPTl9OQU1FID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19TSEFQRUlDT04gPSBBQ1RJVklUWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVTRU5URURfQUZURVIgPSBBQ1RJVklUWV9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUFJFU0VOVEVEX0JFRk9SRSA9IEFDVElWSVRZX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUExBTk5JTkdfREFUQSA9IEFDVElWSVRZX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1NVUEVSX0FDVElWSVRZID0gQUNUSVZJVFlfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBBQ1RJVklUWV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lTX09QVElPTkFMID0gQUNUSVZJVFlfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfUExBTk5FRCA9IEFDVElWSVRZX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVGSVggPSBBQ1RJVklUWV9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0dST1VQMSA9IEFDVElWSVRZX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVERUNFU1NPUiA9IEFDVElWSVRZX19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfRVZFTlRfRFJJVkVOID0gQUNUSVZJVFlfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lTX09OR09JTkcgPSBBQ1RJVklUWV9fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lTX1JFUEVBVEFCTEUgPSBBQ1RJVklUWV9fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUFJFQ09ORElUSU9OID0gQUNUSVZJVFlfX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BPU1RDT05ESVRJT04gPSBBQ1RJVklUWV9fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19HUk9VUDIgPSBBQ1RJVklUWV9fR1JPVVAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fQlJFQUtET1dOX0VMRU1FTlQgPSBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fQ0hFQ0tMSVNUID0gQUNUSVZJVFlfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fQ09OQ0VQVCA9IEFDVElWSVRZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19FWEFNUExFID0gQUNUSVZJVFlfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fR1VJREVMSU5FID0gQUNUSVZJVFlfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUk9BRE1BUCA9IEFDVElWSVRZX19ST0FETUFQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUkVVU0FCTEVfQVNTRVQgPSBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBBQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fV0hJVEVQQVBFUiA9IEFDVElWSVRZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19JU19FTkFDVEFCTEUgPSBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fVkFSSUFCSUxJVFlfVFlQRSA9IEFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBoYXNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX0ZFQVRVUkVfQ09VTlQgPSBBQ1RJVklUWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsIDxlbT5QbGFubmluZyBEYXRhPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBID0gNDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX0dST1VQID0gUFJPQ0VTU19FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19PV05FRF9SVUxFID0gUFJPQ0VTU19FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fSUQgPSBQUk9DRVNTX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19TVVBQUkVTU0VEID0gUFJPQ0VTU19FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fTk9ERUlDT04gPSBQUk9DRVNTX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX1NIQVBFSUNPTiA9IFBST0NFU1NfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEUgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFuazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX1JBTksgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEUgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VJbXBsIDxlbT5QcmFjdGljZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByYWN0aWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBSQUNUSUNFID0gNDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19HUk9VUDIgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0UgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50IFJlZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIFByYWN0aWNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fU1VCX1BSQUNUSUNFID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJhY3RpY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsIDxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTiA9IDUwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19HUk9VUCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWwgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk8gPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdvYWxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZXZlbHMgT2YgQWRvcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9ibGVtPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU0gPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQYWNrYWdlSW1wbCA8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc1BhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFID0gNTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fTkFNRSA9IE1FVEhPRF9QQUNLQUdFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0dST1VQID0gTUVUSE9EX1BBQ0tBR0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fT1dORURfUlVMRSA9IE1FVEhPRF9QQUNLQUdFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fSUQgPSBNRVRIT0RfUEFDS0FHRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX1NVUFBSRVNTRUQgPSBNRVRIT0RfUEFDS0FHRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fR1JPVVAxID0gTUVUSE9EX1BBQ0tBR0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19SRVVTRURfUEFDS0FHRSA9IE1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19NRVRIT0RfUEFDS0FHRSA9IE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0dMT0JBTCA9IE1FVEhPRF9QQUNLQUdFX19HTE9CQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0dST1VQMiA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCA8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlQgPSA1MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX05BTUUgPSBQUk9DRVNTX1BBQ0tBR0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19HUk9VUCA9IFBST0NFU1NfUEFDS0FHRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX09XTkVEX1JVTEUgPSBQUk9DRVNTX1BBQ0tBR0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0lEID0gUFJPQ0VTU19QQUNLQUdFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfUEFDS0FHRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19TVVBQUkVTU0VEID0gUFJPQ0VTU19QQUNLQUdFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0dST1VQMSA9IFBST0NFU1NfUEFDS0FHRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fUkVVU0VEX1BBQ0tBR0UgPSBQUk9DRVNTX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fTUVUSE9EX1BBQ0tBR0UgPSBQUk9DRVNTX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19HTE9CQUwgPSBQUk9DRVNTX1BBQ0tBR0VfX0dMT0JBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19HUk9VUDIgPSBQUk9DRVNTX1BBQ0tBR0VfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTX0VMRU1FTlQgPSBQUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0UgPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUyA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURSA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTiA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFID0gNTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQID0gQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fT1dORURfUlVMRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19CUklFRl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1BSRVNFTlRBVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX05PREVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1NIQVBFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVTRU5URURfQUZURVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1BSRVNFTlRFRF9CRUZPUkUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QTEFOTklOR19EQVRBID0gQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1NVUEVSX0FDVElWSVRZID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSVNfT1BUSU9OQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSVNfUExBTk5FRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUFJFRklYID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1JPVVAxID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIFNwZWNpZmljYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgSU88L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9GRUFUVVJFX0NPVU5UID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsIDxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURSA9IDU3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19OQU1FID0gUFJPQ0VTU19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVAgPSBQUk9DRVNTX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19PV05FRF9SVUxFID0gUFJPQ0VTU19fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JRCA9IFBST0NFU1NfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fU1VQUFJFU1NFRCA9IFBST0NFU1NfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFU0VOVEFUSU9OID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fTk9ERUlDT04gPSBQUk9DRVNTX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fU0hBUEVJQ09OID0gUFJPQ0VTU19fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRVNFTlRFRF9BRlRFUiA9IFBST0NFU1NfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFU0VOVEVEX0JFRk9SRSA9IFBST0NFU1NfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BMQU5OSU5HX0RBVEEgPSBQUk9DRVNTX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fU1VQRVJfQUNUSVZJVFkgPSBQUk9DRVNTX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBQUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19PUFRJT05BTCA9IFBST0NFU1NfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19QTEFOTkVEID0gUFJPQ0VTU19fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVGSVggPSBQUk9DRVNTX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDEgPSBQUk9DRVNTX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRURFQ0VTU09SID0gUFJPQ0VTU19fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSVNfRVZFTlRfRFJJVkVOID0gUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19PTkdPSU5HID0gUFJPQ0VTU19fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSVNfUkVQRUFUQUJMRSA9IFBST0NFU1NfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFQ09ORElUSU9OID0gUFJPQ0VTU19fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QT1NUQ09ORElUSU9OID0gUFJPQ0VTU19fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQMiA9IFBST0NFU1NfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQlJFQUtET1dOX0VMRU1FTlQgPSBQUk9DRVNTX19CUkVBS0RPV05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0NIRUNLTElTVCA9IFBST0NFU1NfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19DT05DRVBUID0gUFJPQ0VTU19fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19FWEFNUExFID0gUFJPQ0VTU19fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dVSURFTElORSA9IFBST0NFU1NfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19ST0FETUFQID0gUFJPQ0VTU19fUk9BRE1BUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUkVVU0FCTEVfQVNTRVQgPSBQUk9DRVNTX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19TVVBQT1JUSU5HX01BVEVSSUFMID0gUFJPQ0VTU19fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19XSElURVBBUEVSID0gUFJPQ0VTU19fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19FTkFDVEFCTEUgPSBQUk9DRVNTX19JU19FTkFDVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19WQVJJQUJJTElUWV9UWVBFID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JTkNMVURFU19QQVRURVJOID0gUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19ERUZBVUxUX0NPTlRFWFQgPSBQUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fVkFMSURfQ09OVEVYVCA9IFBST0NFU1NfX1ZBTElEX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDMgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUHJvY2VzczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRV9QUk9DRVNTID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUmVwb3J0SW1wbCA8ZW0+UmVwb3J0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5SZXBvcnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJlcG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRVBPUlQgPSA1ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJlcG9ydDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJldXNhYmxlQXNzZXRJbXBsIDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUmV1c2FibGVBc3NldEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UmV1c2FibGVBc3NldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVCA9IDU5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvYWRtYXBJbXBsIDxlbT5Sb2FkbWFwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2FkbWFwSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2FkbWFwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPQURNQVAgPSA2MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvYWRtYXA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZUltcGwgPGVtPlJvbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MRSA9IDYxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19HUk9VUCA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fT1dORURfUlVMRSA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0lEID0gQ09OVEVOVF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fU1VQUFJFU1NFRCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX05PREVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19TSEFQRUlDT04gPSBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0dST1VQMSA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fQ09OQ0VQVCA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19FWEFNUExFID0gQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fR1VJREVMSU5FID0gQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1dISVRFUEFQRVIgPSBDT05URU5UX0VMRU1FTlRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19HUk9VUDIgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19SRVNQT05TSUJMRV9GT1IgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbCA8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTiA9IDYyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fR1JPVVAgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2tpbGxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fU0tJTExTID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TeW5vbnltczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEltcGwgPGVtPlJvbGUgU2V0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlU2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfU0VUID0gNjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0dST1VQID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX09XTkVEX1JVTEUgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fSUQgPSBDT05URU5UX0NBVEVHT1JZX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19HUk9VUDEgPSBDT05URU5UX0NBVEVHT1JZX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19DT05DRVBUID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fRVhBTVBMRSA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fR1VJREVMSU5FID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fUkVVU0FCTEVfQVNTRVQgPSBDT05URU5UX0NBVEVHT1JZX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1dISVRFUEFQRVIgPSBDT05URU5UX0NBVEVHT1JZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19HUk9VUDIgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19ST0xFID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIFNldDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsIDxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlU2V0R3JvdXBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkcgPSA2NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fR1JPVVAgPSBDT05URU5UX0NBVEVHT1JZX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fT1dORURfUlVMRSA9IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19JRCA9IENPTlRFTlRfQ0FURUdPUllfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19TVVBQUkVTU0VEID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQMSA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19DSEVDS0xJU1QgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0NPTkNFUFQgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19FWEFNUExFID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19HVUlERUxJTkUgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fV0hJVEVQQVBFUiA9IENPTlRFTlRfQ0FURUdPUllfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQMiA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sZSBTZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwgPGVtPlNlY3Rpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlNlY3Rpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VDVElPTiA9IDY2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX0dST1VQID0gTUVUSE9EX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX09XTkVEX1JVTEUgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fSUQgPSBNRVRIT0RfRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBTZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fU1VCX1NFQ1RJT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1BSRURFQ0VTU09SID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1NFQ1RJT05fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEUgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZWN0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlN1cHBvcnRpbmdNYXRlcmlhbEltcGwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlN1cHBvcnRpbmdNYXRlcmlhbEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUwgPSA2NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwgPGVtPlRhc2s8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEFTSyA9IDY4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19HUk9VUCA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1dORURfUlVMRSA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0lEID0gQ09OVEVOVF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU1VQUFJFU1NFRCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX05PREVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19TSEFQRUlDT04gPSBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0dST1VQMSA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ0hFQ0tMSVNUID0gQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ09OQ0VQVCA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FWEFNUExFID0gQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fR1VJREVMSU5FID0gQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1dISVRFUEFQRVIgPSBDT05URU5UX0VMRU1FTlRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUFJFQ09ORElUSU9OID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QT1NUQ09ORElUSU9OID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcmZvcm1lZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BFUkZPUk1FRF9CWSA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0dST1VQMiA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX01BTkRBVE9SWV9JTlBVVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09VVFBVVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PUFRJT05BTF9JTlBVVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVNUSU1BVEUgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fVE9PTF9NRU5UT1IgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRhc2tEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OID0gNjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19HUk9VUCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fU0VDVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCA8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SID0gNzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fTkFNRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fR1JPVVAgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX09XTkVEX1JVTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19PUkRFUklOR19HVUlERSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1NVUFBSRVNTRUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19OT0RFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fU0hBUEVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEEgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19PUFRJT05BTCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lTX1BMQU5ORUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUFJFRklYID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19HUk9VUDEgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUFJFREVDRVNTT1IgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lTX0VWRU5UX0RSSVZFTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19PTkdPSU5HID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19SRVBFQVRBQkxFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXNrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19UQVNLID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fR1JPVVAyID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2lzdGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWwgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19PVVRQVVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0ZXA8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fU1RFUCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwgPGVtPlRlYW0gUHJvZmlsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRlYW1Qcm9maWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRSA9IDcxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19HUk9VUCA9IEJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX09XTkVEX1JVTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0lEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TVVBQUkVTU0VEID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5UQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19OT0RFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TSEFQRUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUFJFU0VOVEVEX0FGVEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5URURfQkVGT1JFID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUExBTk5JTkdfREFUQSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TVVBFUl9BQ1RJVklUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0lTX09QVElPTkFMID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0lTX1BMQU5ORUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1BSRUZJWCA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0dST1VQMSA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUk9MRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIFRlYW08L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBUZWFtPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1NVQl9URUFNID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGVhbSBQcm9maWxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9GRUFUVVJFX0NPVU5UID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVtcGxhdGVJbXBsIDxlbT5UZW1wbGF0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVtcGxhdGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRlbXBsYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRFTVBMQVRFID0gNzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UZW1wbGF0ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVybURlZmluaXRpb25JbXBsIDxlbT5UZXJtIERlZmluaXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlcm1EZWZpbml0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZXJtRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT04gPSA3MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRvb2xJbXBsIDxlbT5Ub29sPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Ub29sSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUb29sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRPT0wgPSA3NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0dST1VQID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fT1dORURfUlVMRSA9IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fSUQgPSBDT05URU5UX0NBVEVHT1JZX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0dST1VQMSA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0NIRUNLTElTVCA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19DT05DRVBUID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19FWEFNUExFID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0dVSURFTElORSA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fUkVVU0FCTEVfQVNTRVQgPSBDT05URU5UX0NBVEVHT1JZX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19XSElURVBBUEVSID0gQ09OVEVOVF9DQVRFR09SWV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fR1JPVVAyID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fVE9PTF9NRU5UT1IgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRvb2w8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Ub29sTWVudG9ySW1wbCA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRvb2xNZW50b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRvb2xNZW50b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1IgPSA3NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5XaGl0ZXBhcGVySW1wbCA8ZW0+V2hpdGVwYXBlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV2hpdGVwYXBlckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V2hpdGVwYXBlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXSElURVBBUEVSID0gNzY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX05BTUUgPSBDT05DRVBUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19HUk9VUCA9IENPTkNFUFRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX09XTkVEX1JVTEUgPSBDT05DRVBUX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05DRVBUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0lEID0gQ09OQ0VQVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19PUkRFUklOR19HVUlERSA9IENPTkNFUFRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19TVVBQUkVTU0VEID0gQ09OQ0VQVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19QUkVTRU5UQVRJT04gPSBDT05DRVBUX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19OT0RFSUNPTiA9IENPTkNFUFRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05DRVBUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19TSEFQRUlDT04gPSBDT05DRVBUX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19HUk9VUDEgPSBDT05DRVBUX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19DSEVDS0xJU1QgPSBDT05DRVBUX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fQ09OQ0VQVCA9IENPTkNFUFRfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fRVhBTVBMRSA9IENPTkNFUFRfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19HVUlERUxJTkUgPSBDT05DRVBUX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1JFVVNBQkxFX0FTU0VUID0gQ09OQ0VQVF9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTkNFUFRfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fV0hJVEVQQVBFUiA9IENPTkNFUFRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05DRVBUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19WQVJJQUJJTElUWV9UWVBFID0gQ09OQ0VQVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfRkVBVFVSRV9DT1VOVCA9IENPTkNFUFRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsIDxlbT5Xb3JrIERlZmluaXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT04gPSA3ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fR1JPVVAgPSBNRVRIT0RfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19PV05FRF9SVUxFID0gTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19JRCA9IE1FVEhPRF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtPcmRlckltcGwgPGVtPldvcmsgT3JkZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtPcmRlckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya09yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfT1JERVIgPSA3OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19MSU5LX1RZUEUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgT3JkZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1IgPSA4MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX05BTUUgPSBERVNDUklQVE9SX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAgPSBERVNDUklQVE9SX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1dORURfUlVMRSA9IERFU0NSSVBUT1JfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JRCA9IERFU0NSSVBUT1JfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFID0gREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19TVVBQUkVTU0VEID0gREVTQ1JJUFRPUl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OID0gREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX05PREVJQ09OID0gREVTQ1JJUFRPUl9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fU0hBUEVJQ09OID0gREVTQ1JJUFRPUl9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19QUkVTRU5URURfQUZURVIgPSBERVNDUklQVE9SX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEEgPSBERVNDUklQVE9SX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRZID0gREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IERFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JU19PUFRJT05BTCA9IERFU0NSSVBUT1JfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSVNfUExBTk5FRCA9IERFU0NSSVBUT1JfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1BSRUZJWCA9IERFU0NSSVBUT1JfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dST1VQMSA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0ZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWSA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0czwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFMgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlbGl2ZXJhYmxlIFBhcnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFMgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBFeGl0IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEUgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGwgPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRSA9IDgzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19HUk9VUCA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19PV05FRF9SVUxFID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0lEID0gQ09OVEVOVF9DQVRFR09SWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fR1JPVVAxID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0NIRUNLTElTVCA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fQ09OQ0VQVCA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0VYQU1QTEUgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0dVSURFTElORSA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9DQVRFR09SWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19XSElURVBBUEVSID0gQ09OVEVOVF9DQVRFR09SWV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fR1JPVVAyID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1QgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfVFlQRSA9IDg0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlIDxlbT5Xb3JrIE9yZGVyIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya09yZGVyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX09SREVSX1RZUEUgPSA4NTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VmFyaWFiaWxpdHlUeXBlT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX1RZUEVfT0JKRUNUID0gODY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPldvcmsgT3JkZXIgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtPcmRlclR5cGVPYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9UWVBFX09CSkVDVCA9IDg3OwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSA8ZW0+QWN0aXZpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWN0aXZpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QWN0aXZpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9QcmVjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfUG9zdGNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRCcmVha2Rvd25FbGVtZW50IDxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldENoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRDaGVja2xpc3QoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9DaGVja2xpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRDb25jZXB0IDxlbT5Db25jZXB0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0Q29uY2VwdCgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X0NvbmNlcHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRFeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0RXhhbXBsZSgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X0V4YW1wbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRHdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0R3VpZGVsaW5lKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfR3VpZGVsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0Um9hZG1hcCA8ZW0+Um9hZG1hcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+Um9hZG1hcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFJvYWRtYXAoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9Sb2FkbWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0UmV1c2FibGVBc3NldCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0UmV1c2FibGVBc3NldCgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X1JldXNhYmxlQXNzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9TdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRXaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0V2hpdGVwYXBlcigpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X1doaXRlcGFwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjaXNJc0VuYWN0YWJsZSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgRW5hY3RhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjaXNJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X0lzRW5hY3RhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiA8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcygpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRIb3dUb1N0YWZmIDxlbT5Ib3cgVG8gU3RhZmY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ib3cgVG8gU3RhZmY8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEhvd1RvU3RhZmYoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93VG9TdGFmZigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdXJwb3NlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRQdXJwb3NlKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0IDxlbT5BcnRpZmFjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BcnRpZmFjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBcnRpZmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0I2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdCNnZXRHcm91cDMoKQotCSAqIEBzZWUgI2dldEFydGlmYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdF9Hcm91cDMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZWRBcnRpZmFjdCA8ZW0+Q29udGFpbmVkIEFydGlmYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250YWluZWQgQXJ0aWZhY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZWRBcnRpZmFjdCgpCi0JICogQHNlZSAjZ2V0QXJ0aWZhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uIDxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFydGlmYWN0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRCcmllZk91dGxpbmUgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CcmllZiBPdXRsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRCcmllZk91dGxpbmUoKQotCSAqIEBzZWUgI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fQnJpZWZPdXRsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uT3B0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRCcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQWZ0ZXIgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQWZ0ZXIoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRCZWZvcmUgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRCZWZvcmUoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UGxhbm5pbmdEYXRhIDxlbT5QbGFubmluZyBEYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFN1cGVyQWN0aXZpdHkgPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3VwZXIgQWN0aXZpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFN1cGVyQWN0aXZpdHkoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNPcHRpb25hbCA8ZW0+SXMgT3B0aW9uYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBPcHRpb25hbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc09wdGlvbmFsKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0lzUGxhbm5lZCA8ZW0+SXMgUGxhbm5lZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFBsYW5uZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNQbGFubmVkKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlZml4PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVmaXgoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfUHJlZml4KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uI2dldFVzYWdlR3VpZGFuY2UgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24jZ2V0VXNhZ2VHdWlkYW5jZSgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2FwYWJpbGl0eVBhdHRlcm4gPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNoZWNrbGlzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNoZWNrbGlzdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q2hlY2tsaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlIDxlbT5Db21wb3NpdGUgUm9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbXBvc2l0ZVJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlI2dldEdyb3VwMSgpCi0JICogQHNlZSAjZ2V0Q29tcG9zaXRlUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29tcG9zaXRlUm9sZV9Hcm91cDEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlI2dldEFnZ3JlZ2F0ZWRSb2xlIDxlbT5BZ2dyZWdhdGVkIFJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkFnZ3JlZ2F0ZWQgUm9sZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUjZ2V0QWdncmVnYXRlZFJvbGUoKQotCSAqIEBzZWUgI2dldENvbXBvc2l0ZVJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbmNlcHQgPGVtPkNvbmNlcHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbmNlcHQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbmNlcHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQgPGVtPkNvbnN0cmFpbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29uc3RyYWludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludCNnZXRNYWluRGVzY3JpcHRpb24gPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludCNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldENvbnN0cmFpbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnN0cmFpbnRfTWFpbkRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnkgPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29udGVudENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlIDxlbT5Db250ZW50IENhdGVnb3J5IFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UjZ2V0Q29udGVudENhdGVnb3J5IDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZSNnZXRDb250ZW50Q2F0ZWdvcnkoKQotCSAqIEBzZWUgI2dldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfQ29udGVudENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24gPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRNYWluRGVzY3JpcHRpb24gPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRLZXlDb25zaWRlcmF0aW9ucyA8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEtleUNvbnNpZGVyYXRpb25zKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRTZWN0aW9uIDxlbT5TZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldFNlY3Rpb24oKQotCSAqIEBzZWUgI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50IDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbnRlbnRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldEdyb3VwMSgpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X0dyb3VwMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldENoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRDaGVja2xpc3QoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRDb25jZXB0IDxlbT5Db25jZXB0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q29uY2VwdCgpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X0NvbmNlcHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRFeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0RXhhbXBsZSgpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X0V4YW1wbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRHdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0R3VpZGVsaW5lKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0UmV1c2FibGVBc3NldCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0UmV1c2FibGVBc3NldCgpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1JldXNhYmxlQXNzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRXaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0V2hpdGVwYXBlcigpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1doaXRlcGFwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSA8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb250ZW50UGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldENvbnRlbnRQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50UGFja2FnZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSNnZXRDb250ZW50RWxlbWVudCA8ZW0+Q29udGVudCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQHNlZSAjZ2V0Q29udGVudFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSA8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDdXN0b21DYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldEN1c3RvbUNhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDdXN0b21DYXRlZ29yeV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRDYXRlZ29yaXplZEVsZW1lbnQgPGVtPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRDYXRlZ29yaXplZEVsZW1lbnQoKQotCSAqIEBzZWUgI2dldEN1c3RvbUNhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRTdWJDYXRlZ29yeSA8ZW0+U3ViIENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5TdWIgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRTdWJDYXRlZ29yeSgpCi0JICogQHNlZSAjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZSA8ZW0+RGVsaXZlcmFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVsaXZlcmFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVsaXZlcmFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZSNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUjZ2V0R3JvdXAzKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVfR3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUjZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QgPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZSNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdCgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcmFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uIDxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbERlc2NyaXB0aW9uIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRQYWNrYWdpbmdHdWlkYW5jZSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzIDxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlbGl2ZXJ5UHJvY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzI2dldEdyb3VwMygpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NfR3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzI2dldENvbW11bmljYXRpb25zTWF0ZXJpYWwgPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzI2dldEVkdWNhdGlvbk1hdGVyaWFsIDxlbT5FZHVjYXRpb24gTWF0ZXJpYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkVkdWNhdGlvbiBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRFZHVjYXRpb25NYXRlcmlhbCgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIDxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NhbGUgPGVtPlNjYWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NhbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY2FsZSgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRSaXNrTGV2ZWwgPGVtPlJpc2sgTGV2ZWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SaXNrIExldmVsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0Umlza0xldmVsKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldEVzdGltYXRpbmdUZWNobmlxdWUgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRUeXBlT2ZDb250cmFjdCA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRUeXBlT2ZDb250cmFjdCgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQgPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVzY3JpYmFibGVFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByZXNlbnRhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBzZWUgI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0Tm9kZWljb24gPGVtPk5vZGVpY29uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Tm9kZWljb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0Tm9kZWljb24oKQotCSAqIEBzZWUgI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb25OYW1lIDxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBzZWUgI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFNoYXBlaWNvbiA8ZW0+U2hhcGVpY29uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2hhcGVpY29uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFNoYXBlaWNvbigpCi0JICogQHNlZSAjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yIDxlbT5EZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2dldERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiNnZXRSZWZpbmVkRGVzY3JpcHRpb24gPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uI2dldFJlZmluZWREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lIDxlbT5EaXNjaXBsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpc2NpcGxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldERpc2NpcGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpc2NpcGxpbmVfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRUYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRUYXNrKCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREaXNjaXBsaW5lX1Rhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFN1YkRpc2NpcGxpbmUgPGVtPlN1YiBEaXNjaXBsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWIgRGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmUjZ2V0U3ViRGlzY2lwbGluZSgpCi0JICogQHNlZSAjZ2V0RGlzY2lwbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZV9TdWJEaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRSZWZlcmVuY2VXb3JrZmxvdyA8ZW0+UmVmZXJlbmNlIFdvcmtmbG93PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5SZWZlcmVuY2UgV29ya2Zsb3c8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFJlZmVyZW5jZVdvcmtmbG93KCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcgPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lR3JvdXBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpc2NpcGxpbmVHcm91cGluZ19Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcjZ2V0RGlzY2lwbGluZSA8ZW0+RGlzY2lwbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZyNnZXREaXNjaXBsaW5lKCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lR3JvdXBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QgPGVtPkRvY3VtZW50IFJvb3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RG9jdW1lbnRSb290KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWl4ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWl4ZWQoKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RG9jdW1lbnRSb290X01peGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRYTUxOU1ByZWZpeE1hcCA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0WE1MTlNQcmVmaXhNYXAoKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RDb25maWd1cmF0aW9uIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X01ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZExpYnJhcnkgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfTWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X01ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluIDxlbT5Eb21haW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RG9tYWluPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREb21haW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4jZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbiNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldERvbWFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RG9tYWluX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbiNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4jZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBzZWUgI2dldERvbWFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RG9tYWluX1dvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluI2dldFN1YmRvbWFpbiA8ZW0+U3ViZG9tYWluPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWJkb21haW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4jZ2V0U3ViZG9tYWluKCkKLQkgKiBAc2VlICNnZXREb21haW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERvbWFpbl9TdWJkb21haW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlIDxlbT5Fc3RpbWF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Fc3RpbWF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFc3RpbWF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldEVzdGltYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFc3RpbWF0ZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZSNnZXRFc3RpbWF0aW9uTWV0cmljIDxlbT5Fc3RpbWF0aW9uIE1ldHJpYzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RXN0aW1hdGlvbiBNZXRyaWM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZSNnZXRFc3RpbWF0aW9uTWV0cmljKCkKLQkgKiBAc2VlICNnZXRFc3RpbWF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXN0aW1hdGVfRXN0aW1hdGlvbk1ldHJpYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQHNlZSAjZ2V0RXN0aW1hdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVzdGltYXRlX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGluZ01ldHJpYyA8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFc3RpbWF0aW5nTWV0cmljKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZSA8ZW0+R3VpZGFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3VpZGFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3VpZGFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24gPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uI2dldEF0dGFjaG1lbnQgPGVtPkF0dGFjaG1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdHRhY2htZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiNnZXRBdHRhY2htZW50KCkKLQkgKiBAc2VlICNnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZSA8ZW0+R3VpZGVsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3VpZGVsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5JdGVyYXRpb24gPGVtPkl0ZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JdGVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5JdGVyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEl0ZXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRCYXNlQ29uZmlndXJhdGlvbiA8ZW0+QmFzZSBDb25maWd1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5CYXNlIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEJhc2VDb25maWd1cmF0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24gPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKQotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldERlZmF1bHRWaWV3IDxlbT5EZWZhdWx0IFZpZXc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFZpZXc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldERlZmF1bHRWaWV3KCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRQcm9jZXNzVmlldyA8ZW0+UHJvY2VzcyBWaWV3PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Qcm9jZXNzIFZpZXc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldFByb2Nlc3NWaWV3KCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50IDxlbT5NZXRob2QgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldEdyb3VwKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X0dyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRPd25lZFJ1bGUgPGVtPk93bmVkIFJ1bGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk93bmVkIFJ1bGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldE93bmVkUnVsZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRCcmllZkRlc2NyaXB0aW9uIDxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRCcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0SWQoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRPcmRlcmluZ0d1aWRlIDxlbT5PcmRlcmluZyBHdWlkZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRPcmRlcmluZ0d1aWRlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X09yZGVyaW5nR3VpZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNpc1N1cHByZXNzZWQgPGVtPlN1cHByZXNzZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdXBwcmVzc2VkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNpc1N1cHByZXNzZWQoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfU3VwcHJlc3NlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeSA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeSNnZXRNZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldE1ldGhvZFBsdWdpbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldE1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkjZ2V0VG9vbCA8ZW0+VG9vbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRvb2w8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldFRvb2woKQotCSAqIEBzZWUgI2dldE1ldGhvZExpYnJhcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZExpYnJhcnlfVG9vbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRHcm91cDEoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFBhY2thZ2VfR3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRSZXVzZWRQYWNrYWdlIDxlbT5SZXVzZWQgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UmV1c2VkIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlI2dldFJldXNlZFBhY2thZ2UoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFBhY2thZ2VfUmV1c2VkUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZSA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RQYWNrYWdlX01ldGhvZFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNpc0dsb2JhbCA8ZW0+R2xvYmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2xvYmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNpc0dsb2JhbCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGFja2FnZV9HbG9iYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RQbHVnaW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbiA8ZW0+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5SZWZlcmVuY2VkIE1ldGhvZCBQbHVnaW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RQbHVnaW5fUmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNnZXRNZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jaXNVc2VyQ2hhbmdlYWJsZSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luI2lzVXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBsdWdpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0IDxlbT5NZXRob2QgVW5pdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgVW5pdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZFVuaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDb3B5cmlnaHQgPGVtPkNvcHlyaWdodDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvcHlyaWdodDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0Q29weXJpZ2h0KCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NvcHlyaWdodCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdXRob3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRBdXRob3JzKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0F1dGhvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEYXRlIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQgPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TmFtZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk5hbWVkRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TmFtZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk5hbWVkRWxlbWVudCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk5hbWVkRWxlbWVudCNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXROYW1lZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE5hbWVkRWxlbWVudF9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5PdXRjb21lIDxlbT5PdXRjb21lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk91dGNvbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5PdXRjb21lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRPdXRjb21lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQgPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBhY2thZ2VhYmxlRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UGFja2FnZWFibGVFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QaGFzZSA8ZW0+UGhhc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGhhc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QaGFzZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UGhhc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQbGFubmluZ0RhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0RmluaXNoRGF0ZSgpCi0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfRmluaXNoRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0UmFuayA8ZW0+UmFuazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJhbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0UmFuaygpCi0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfUmFuaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0U3RhcnREYXRlIDxlbT5TdGFydCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSNnZXRTdGFydERhdGUoKQotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UgPGVtPlByYWN0aWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByYWN0aWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByYWN0aWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldEFjdGl2aXR5UmVmZXJlbmNlIDxlbT5BY3Rpdml0eSBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkFjdGl2aXR5IFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldEFjdGl2aXR5UmVmZXJlbmNlKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRDb250ZW50UmVmZXJlbmNlIDxlbT5Db250ZW50IFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+Q29udGVudCBSZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRDb250ZW50UmVmZXJlbmNlKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldFN1YlByYWN0aWNlIDxlbT5TdWIgUHJhY3RpY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YiBQcmFjdGljZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldFN1YlByYWN0aWNlKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24gPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFkZGl0aW9uYWxJbmZvIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BZGRpdGlvbmFsIEluZm88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFkZGl0aW9uYWxJbmZvKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QXBwbGljYXRpb24gPGVtPkFwcGxpY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXBwbGljYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFwcGxpY2F0aW9uKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QmFja2dyb3VuZCA8ZW0+QmFja2dyb3VuZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJhY2tncm91bmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEJhY2tncm91bmQoKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEdvYWxzIDxlbT5Hb2FsczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdvYWxzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRHb2FscygpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldExldmVsc09mQWRvcHRpb24gPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0UHJvYmxlbSA8ZW0+UHJvYmxlbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb2JsZW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldFByb2JsZW0oKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0SW5jbHVkZXNQYXR0ZXJuIDxlbT5JbmNsdWRlcyBQYXR0ZXJuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5JbmNsdWRlcyBQYXR0ZXJuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyNnZXRJbmNsdWRlc1BhdHRlcm4oKQotCSAqIEBzZWUgI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NfSW5jbHVkZXNQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0RGVmYXVsdENvbnRleHQgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0RGVmYXVsdENvbnRleHQoKQotCSAqIEBzZWUgI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NfRGVmYXVsdENvbnRleHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldFZhbGlkQ29udGV4dCA8ZW0+VmFsaWQgQ29udGV4dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+VmFsaWQgQ29udGV4dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0VmFsaWRDb250ZXh0KCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCA8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzQ29tcG9uZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q29weXJpZ2h0IDxlbT5Db3B5cmlnaHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3B5cmlnaHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldENvcHlyaWdodCgpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudF9Db3B5cmlnaHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRJbnRlcmZhY2UgPGVtPkludGVyZmFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkludGVyZmFjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0SW50ZXJmYWNlKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50X0ludGVyZmFjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldFByb2Nlc3MgPGVtPlByb2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Qcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRQcm9jZXNzKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRBdXRob3JzIDxlbT5BdXRob3JzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXV0aG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0QXV0aG9ycygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudF9BdXRob3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DaGFuZ2UgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudF9DaGFuZ2VEYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudF9WZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0R3JvdXAxKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0dyb3VwMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbiA8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZVNwZWNpZmljYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZUlPIDxlbT5JbnRlcmZhY2UgSU88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkludGVyZmFjZSBJTzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlSU8oKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiA8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjb3BlIDxlbT5TY29wZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNjb3BlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjb3BlKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0VXNhZ2VOb3RlcyA8ZW0+VXNhZ2UgTm90ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vc2FnZSBOb3RlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRVc2FnZU5vdGVzKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIElkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldEV4dGVybmFsSWQoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX0V4dGVybmFsSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NFbGVtZW50IDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSA8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzUGFja2FnZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXRQcm9jZXNzRWxlbWVudCA8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXRQcm9jZXNzRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc1BhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSA8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlI2dldEdyb3VwMygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0dyb3VwMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlI2dldEJhc2VQcm9jZXNzIDxlbT5CYXNlIFByb2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkJhc2UgUHJvY2VzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlI2dldEJhc2VQcm9jZXNzKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfQmFzZVByb2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJlcG9ydCA8ZW0+UmVwb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJlcG9ydAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXVzYWJsZUFzc2V0IDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJldXNhYmxlQXNzZXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJldXNhYmxlQXNzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvYWRtYXAgPGVtPlJvYWRtYXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9hZG1hcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvYWRtYXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvYWRtYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUgPGVtPlJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlI2dldFJlc3BvbnNpYmxlRm9yIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUjZ2V0UmVzcG9uc2libGVGb3IoKQotCSAqIEBzZWUgI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVfUmVzcG9uc2libGVGb3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiA8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzIDxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTa2lsbHMgPGVtPlNraWxsczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNraWxsczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTa2lsbHMoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U3lub255bXMgPGVtPlN5bm9ueW1zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3lub255bXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U3lub255bXMoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvciA8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJvbGUoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3IjZ2V0UmVzcG9uc2libGVGb3IgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3IjZ2V0UmVzcG9uc2libGVGb3IoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCA8ZW0+Um9sZSBTZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBTZXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlU2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFJvbGVTZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVTZXRfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRSb2xlKCkKLQkgKiBAc2VlICNnZXRSb2xlU2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlU2V0X1JvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZyA8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0R3JvdXBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGVTZXRHcm91cGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZyNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0Um9sZVNldEdyb3VwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlU2V0R3JvdXBpbmdfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nI2dldFJvbGVTZXQgPGVtPlJvbGUgU2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZyNnZXRSb2xlU2V0KCkKLQkgKiBAc2VlICNnZXRSb2xlU2V0R3JvdXBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uIDxlbT5TZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U3ViU2VjdGlvbiA8ZW0+U3ViIFNlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5TdWIgU2VjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U3ViU2VjdGlvbigpCi0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VjdGlvbl9TdWJTZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFByZWRlY2Vzc29yKCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbk5hbWUgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlY3Rpb24gTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbk5hbWUoKQotCSAqIEBzZWUgI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3Rpb25fU2VjdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1ZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU3VwcG9ydGluZ01hdGVyaWFsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayA8ZW0+VGFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUHJlY29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUG9zdGNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFBlcmZvcm1lZEJ5IDxlbT5QZXJmb3JtZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QZXJmb3JtZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFBlcmZvcm1lZEJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldE1hbmRhdG9yeUlucHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+T3V0cHV0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRPdXRwdXQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfT3V0cHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0T3B0aW9uYWxJbnB1dCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19PcHRpb25hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRFc3RpbWF0ZSA8ZW0+RXN0aW1hdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkVzdGltYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRFc3RpbWF0ZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Fc3RpbWF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRUb29sTWVudG9yIDxlbT5Ub29sIE1lbnRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFRvb2xNZW50b3IoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfVG9vbE1lbnRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhc2tEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdXJwb3NlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uI2dldFB1cnBvc2UoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yIDxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhc2tEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFRhc2sgPGVtPlRhc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0VGFzaygpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX1Rhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkgPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBc3Npc3RlZEJ5IDxlbT5Bc3Npc3RlZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QXNzaXN0ZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBc3Npc3RlZEJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEV4dGVybmFsSW5wdXQgPGVtPkV4dGVybmFsIElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEV4dGVybmFsSW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldE9wdGlvbmFsSW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0T3V0cHV0IDxlbT5PdXRwdXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPk91dHB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldE91dHB1dCgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFN0ZXAgPGVtPlN0ZXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlN0ZXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRTdGVwKCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfU3RlcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlIDxlbT5UZWFtIFByb2ZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVhbSBQcm9maWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRlYW1Qcm9maWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGUjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldEdyb3VwMSgpCi0JICogQHNlZSAjZ2V0VGVhbVByb2ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRlYW1Qcm9maWxlX0dyb3VwMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFJvbGUgPGVtPlJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRSb2xlKCkKLQkgKiBAc2VlICNnZXRUZWFtUHJvZmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGVhbVByb2ZpbGVfUm9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbSA8ZW0+U3VwZXIgVGVhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+U3VwZXIgVGVhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbSgpCi0JICogQHNlZSAjZ2V0VGVhbVByb2ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFN1YlRlYW0gPGVtPlN1YiBUZWFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5TdWIgVGVhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFN1YlRlYW0oKQotCSAqIEBzZWUgI2dldFRlYW1Qcm9maWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZSA8ZW0+VGVtcGxhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVtcGxhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGVtcGxhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlcm1EZWZpbml0aW9uIDxlbT5UZXJtIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVybURlZmluaXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRlcm1EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sIDxlbT5Ub29sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRvb2w8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUb29sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbCNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRvb2xfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbCNnZXRUb29sTWVudG9yIDxlbT5Ub29sIE1lbnRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sI2dldFRvb2xNZW50b3IoKQotCSAqIEBzZWUgI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRvb2xfVG9vbE1lbnRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sTWVudG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUb29sTWVudG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXaGl0ZXBhcGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtCcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldEdyb3VwMSgpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0dyb3VwMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldFByZWRlY2Vzc29yIDxlbT5QcmVkZWNlc3NvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRQcmVkZWNlc3NvcigpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc0V2ZW50RHJpdmVuKCkKLQkgKiBAc2VlICNnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIE9uZ29pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzT25nb2luZygpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzUmVwZWF0YWJsZSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFJlcGVhdGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzUmVwZWF0YWJsZSgpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzUmVwZWF0YWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24gPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIERlZmluaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24jZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBzZWUgI2dldFdvcmtEZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24jZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAc2VlICNnZXRXb3JrRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyIDxlbT5Xb3JrIE9yZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgT3JkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtPcmRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldFdvcmtPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya09yZGVyX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRMaW5rVHlwZSA8ZW0+TGluayBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGluayBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldExpbmtUeXBlKCkKLQkgKiBAc2VlICNnZXRXb3JrT3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtPcmRlcl9MaW5rVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFdvcmtPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya09yZGVyX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRFc3RpbWF0ZSA8ZW0+RXN0aW1hdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkVzdGltYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0RXN0aW1hdGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldFJlcG9ydCA8ZW0+UmVwb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5SZXBvcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRSZXBvcnQoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9SZXBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRUZW1wbGF0ZSA8ZW0+VGVtcGxhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0VGVtcGxhdGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldFRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldFRvb2xNZW50b3IoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldEltcGFjdE9mTm90SGF2aW5nIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRJbXBhY3RPZk5vdEhhdmluZygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdXJwb3NlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRQdXJwb3NlKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRSZWFzb25zRm9yTm90TmVlZGluZyA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIElkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRXb3JrUHJvZHVjdCgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRHcm91cDEoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0dyb3VwMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RlZEJ5IDxlbT5JbXBhY3RlZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+SW1wYWN0ZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0ZWRCeSgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RzIDxlbT5JbXBhY3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5JbXBhY3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdHMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0RGVsaXZlcmFibGVQYXJ0cyA8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldERlbGl2ZXJhYmxlUGFydHMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RW50cnlTdGF0ZSA8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFeGl0U3RhdGUgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlIDxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0VHlwZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlIDxlbT5Xb3JrIE9yZGVyIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5Xb3JrIE9yZGVyIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFdvcmtPcmRlclR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ZhcmlhYmlsaXR5VHlwZTpPYmplY3QnIGJhc2VUeXBlPSdWYXJpYWJpbGl0eVR5cGUnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFZhcmlhYmlsaXR5VHlwZU9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUgPGVtPldvcmsgT3JkZXIgVHlwZSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPldvcmsgT3JkZXIgVHlwZSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtPcmRlclR5cGU6T2JqZWN0JyBiYXNlVHlwZT0nV29ya09yZGVyVHlwZSciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0V29ya09yZGVyVHlwZU9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVW1hRmFjdG9yeSBnZXRVbWFGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCA8ZW0+QWN0aXZpdHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QWN0aXZpdHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQUNUSVZJVFkgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX19QUkVDT05ESVRJT04gPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfUHJlY29uZGl0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfX1BPU1RDT05ESVRJT04gPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfUG9zdGNvbmRpdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX19DSEVDS0xJU1QgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQ2hlY2tsaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9fQ09OQ0VQVCA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Db25jZXB0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9fRVhBTVBMRSA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9FeGFtcGxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX19HVUlERUxJTkUgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfR3VpZGVsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9fUk9BRE1BUCA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Sb2FkbWFwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X1JldXNhYmxlQXNzZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X1N1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfX1dISVRFUEFQRVIgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfV2hpdGVwYXBlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgRW5hY3RhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfX0lTX0VOQUNUQUJMRSA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Jc0VuYWN0YWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRSA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9WYXJpYWJpbGl0eVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwgPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBQ1RJVklUWV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ib3cgVG8gU3RhZmY8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93VG9TdGFmZigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdEltcGwgPGVtPkFydGlmYWN0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFydGlmYWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFSVElGQUNUID0gZUlOU1RBTkNFLmdldEFydGlmYWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFSVElGQUNUX19HUk9VUDMgPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfR3JvdXAzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250YWluZWQgQXJ0aWZhY3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1QgPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwgPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBUlRJRkFDVF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CcmllZiBPdXRsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkUgPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUyA9IGVJTlNUQU5DRS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uT3B0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEJSRUFLRE9XTl9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVIgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9QbGFubmluZ0RhdGEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlZml4KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwgPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGwgPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ2FwYWJpbGl0eVBhdHRlcm5JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDYXBhYmlsaXR5UGF0dGVybigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDQVBBQklMSVRZX1BBVFRFUk4gPSBlSU5TVEFOQ0UuZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ2hlY2tsaXN0SW1wbCA8ZW0+Q2hlY2tsaXN0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DaGVja2xpc3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDaGVja2xpc3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ0hFQ0tMSVNUID0gZUlOU1RBTkNFLmdldENoZWNrbGlzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbCA8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb21wb3NpdGVSb2xlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTVBPU0lURV9ST0xFID0gZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUE9TSVRFX1JPTEVfX0dST1VQMSA9IGVJTlNUQU5DRS5nZXRDb21wb3NpdGVSb2xlX0dyb3VwMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWdncmVnYXRlZCBSb2xlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFID0gZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29uY2VwdEltcGwgPGVtPkNvbmNlcHQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbmNlcHRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb25jZXB0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTkNFUFQgPSBlSU5TVEFOQ0UuZ2V0Q29uY2VwdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db25zdHJhaW50SW1wbCA8ZW0+Q29uc3RyYWludDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29uc3RyYWludEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnN0cmFpbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OU1RSQUlOVCA9IGVJTlNUQU5DRS5nZXRDb25zdHJhaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OU1RSQUlOVF9fTUFJTl9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRDb25zdHJhaW50X01haW5EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsIDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50Q2F0ZWdvcnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9DQVRFR09SWSA9IGVJTlNUQU5DRS5nZXRDb250ZW50Q2F0ZWdvcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwgPGVtPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFID0gZUlOU1RBTkNFLmdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZV9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fQ09OVEVOVF9DQVRFR09SWSA9IGVJTlNUQU5DRS5nZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0NvbnRlbnRDYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsIDxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsIDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fR1JPVVAxID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0dyb3VwMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVCA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVCA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEUgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORSA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X1JldXNhYmxlQXNzZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUiA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9XaGl0ZXBhcGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRQYWNrYWdlSW1wbCA8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRQYWNrYWdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTlRFTlRfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX1BBQ0tBR0VfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZV9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsIDxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkN1c3RvbUNhdGVnb3J5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ1VTVE9NX0NBVEVHT1JZID0gZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENVU1RPTV9DQVRFR09SWV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2F0ZWdvcml6ZWQgRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViIENhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SWSA9IGVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwgPGVtPkRlbGl2ZXJhYmxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJhYmxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFTElWRVJBQkxFID0gZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJBQkxFX19HUk9VUDMgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVfR3JvdXAzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyZWQgV29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVCA9IGVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCA8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFTElWRVJBQkxFX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFja2FnaW5nIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRSA9IGVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwgPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJ5UHJvY2VzcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERUxJVkVSWV9QUk9DRVNTID0gZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2VzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSWV9QUk9DRVNTX19HUk9VUDMgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzX0dyb3VwMygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMID0gZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FZHVjYXRpb24gTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTCA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsIDxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEUgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fU2NhbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1MgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmlzayBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFID0gZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRSA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlIE9mIENvbnRyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVCA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsIDxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVTQ1JJQkFCTEVfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiA9IGVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OID0gZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IGVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OID0gZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpcHRvckltcGwgPGVtPkRlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gZUlOU1RBTkNFLmdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwgPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERVNDUklQVE9SX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmaW5lZCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbCA8ZW0+RGlzY2lwbGluZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpc2NpcGxpbmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRElTQ0lQTElORSA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJU0NJUExJTkVfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFzazwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRElTQ0lQTElORV9fVEFTSyA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1Rhc2soKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YiBEaXNjaXBsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORSA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1N1YkRpc2NpcGxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBXb3JrZmxvdzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XID0gZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3coKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbCA8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERJU0NJUExJTkVfR1JPVVBJTkcgPSBlSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJU0NJUExJTkVfR1JPVVBJTkdfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lR3JvdXBpbmdfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNjaXBsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FID0gZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwgPGVtPkRvY3VtZW50IFJvb3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERvY3VtZW50Um9vdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBET0NVTUVOVF9ST09UID0gZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERPQ1VNRU5UX1JPT1RfX01JWEVEID0gZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9NaXhlZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVAgPSBlSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTiA9IGVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT04gPSBlSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X01ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBMaWJyYXJ5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlkgPSBlSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X01ldGhvZExpYnJhcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOID0gZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9NZXRob2RQbHVnaW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9tYWluSW1wbCA8ZW0+RG9tYWluPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb21haW5JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREb21haW4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRE9NQUlOID0gZUlOU1RBTkNFLmdldERvbWFpbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBET01BSU5fX0dST1VQMiA9IGVJTlNUQU5DRS5nZXREb21haW5fR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERPTUFJTl9fV09SS19QUk9EVUNUID0gZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViZG9tYWluPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBET01BSU5fX1NVQkRPTUFJTiA9IGVJTlNUQU5DRS5nZXREb21haW5fU3ViZG9tYWluKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVsZW1lbnRJbXBsIDxlbT5FbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5FbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFTEVNRU5UID0gZUlOU1RBTkNFLmdldEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGVJbXBsIDxlbT5Fc3RpbWF0ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFc3RpbWF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFU1RJTUFURSA9IGVJTlNUQU5DRS5nZXRFc3RpbWF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFU1RJTUFURV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldEVzdGltYXRlX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBNZXRyaWM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVTVElNQVRFX19FU1RJTUFUSU9OX01FVFJJQyA9IGVJTlNUQU5DRS5nZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uTWV0cmljKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFU1RJTUFURV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRS5nZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGluZ01ldHJpY0ltcGwgPGVtPkVzdGltYXRpbmcgTWV0cmljPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0aW5nTWV0cmljSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RXN0aW1hdGluZ01ldHJpYygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFU1RJTUFUSU5HX01FVFJJQyA9IGVJTlNUQU5DRS5nZXRFc3RpbWF0aW5nTWV0cmljKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gZUlOU1RBTkNFLmdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5FeGFtcGxlSW1wbCA8ZW0+RXhhbXBsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXhhbXBsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEV4YW1wbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRVhBTVBMRSA9IGVJTlNUQU5DRS5nZXRFeGFtcGxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRhbmNlSW1wbCA8ZW0+R3VpZGFuY2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRhbmNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGFuY2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgR1VJREFOQ0UgPSBlSU5TVEFOQ0UuZ2V0R3VpZGFuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwgPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBHVUlEQU5DRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdHRhY2htZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlQgPSBlSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRlbGluZUltcGwgPGVtPkd1aWRlbGluZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGVsaW5lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGVsaW5lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdVSURFTElORSA9IGVJTlNUQU5DRS5nZXRHdWlkZWxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuSXRlcmF0aW9uSW1wbCA8ZW0+SXRlcmF0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5JdGVyYXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRJdGVyYXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSVRFUkFUSU9OID0gZUlOU1RBTkNFLmdldEl0ZXJhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9DT05GSUdVUkFUSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgQ29uZmlndXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZpZXc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXID0gZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgVmlldzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFVyA9IGVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsIDxlbT5NZXRob2QgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19HUk9VUCA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0dyb3VwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X093bmVkUnVsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19JRCA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X09yZGVyaW5nR3VpZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kTGlicmFyeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfTElCUkFSWSA9IGVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9MSUJSQVJZX19NRVRIT0RfQ09ORklHVVJBVElPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5X01ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRvb2w8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfTElCUkFSWV9fVE9PTCA9IGVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5X1Rvb2woKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kUGFja2FnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9QQUNLQUdFX19HUk9VUDEgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZV9Hcm91cDEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFID0gZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfTWV0aG9kUGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RQbHVnaW4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EX1BMVUdJTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgTWV0aG9kIFBsdWdpbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1BMVUdJTl9fUkVGRVJFTkNFRF9NRVRIT0RfUExVR0lOID0gZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9SZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVzZXIgQ2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kVW5pdEltcGwgPGVtPk1ldGhvZCBVbml0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RVbml0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kVW5pdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfVU5JVCA9IGVJTlNUQU5DRS5nZXRNZXRob2RVbml0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUID0gZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfQ29weXJpZ2h0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1VOSVRfX0FVVEhPUlMgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9VTklUX19DSEFOR0VfREFURSA9IGVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9VTklUX19WRVJTSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfVmVyc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NaWxlc3RvbmVJbXBsIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1pbGVzdG9uZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1pbGVzdG9uZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNSUxFU1RPTkUgPSBlSU5TVEFOQ0UuZ2V0TWlsZXN0b25lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwgPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE5hbWVkRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBOQU1FRF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE5BTUVEX0VMRU1FTlRfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuT3V0Y29tZUltcGwgPGVtPk91dGNvbWU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk91dGNvbWVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRPdXRjb21lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE9VVENPTUUgPSBlSU5TVEFOQ0UuZ2V0T3V0Y29tZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QYWNrYWdlYWJsZUVsZW1lbnRJbXBsIDxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QYWNrYWdlYWJsZUVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUEFDS0FHRUFCTEVfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRQYWNrYWdlYWJsZUVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGhhc2VJbXBsIDxlbT5QaGFzZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGhhc2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQaGFzZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQSEFTRSA9IGVJTlNUQU5DRS5nZXRQaGFzZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsIDxlbT5QbGFubmluZyBEYXRhPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQbGFubmluZ0RhdGEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUExBTk5JTkdfREFUQSA9IGVJTlNUQU5DRS5nZXRQbGFubmluZ0RhdGEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEUgPSBlSU5TVEFOQ0UuZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJhbms8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQTEFOTklOR19EQVRBX19SQU5LID0gZUlOU1RBTkNFLmdldFBsYW5uaW5nRGF0YV9SYW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdGFydCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUExBTk5JTkdfREFUQV9fU1RBUlRfREFURSA9IGVJTlNUQU5DRS5nZXRQbGFubmluZ0RhdGFfU3RhcnREYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlSW1wbCA8ZW0+UHJhY3RpY2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJhY3RpY2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJBQ1RJQ0UgPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZV9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IFJlZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRSA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudCBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRSA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgUHJhY3RpY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBSQUNUSUNFX19TVUJfUFJBQ1RJQ0UgPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwgPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUkFDVElDRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsIEluZm88L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPID0gZUlOU1RBTkNFLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OID0gZUlOU1RBTkNFLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORCA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdvYWxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTID0gZUlOU1RBTkNFLmdldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxldmVscyBPZiBBZG9wdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT04gPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9ibGVtPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU0gPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NJbXBsIDxlbT5Qcm9jZXNzPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2VzcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTID0gZUlOU1RBTkNFLmdldFByb2Nlc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk4gPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX19WQUxJRF9DT05URVhUID0gZUlOU1RBTkNFLmdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19DT01QT05FTlQgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVCA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50X0NvcHlyaWdodCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50X0ludGVyZmFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRfUHJvY2VzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRfQXV0aG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEUgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudF9DaGFuZ2VEYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50X1ZlcnNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwgPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19HUk9VUDEgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9Hcm91cDEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIElPPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTyA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZUlPKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NEZXNjcmlwdGlvbkltcGwgPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIE5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVMgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1VzYWdlTm90ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX0V4dGVybmFsSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0VsZW1lbnRJbXBsIDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0VsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19FTEVNRU5UID0gZUlOU1RBTkNFLmdldFByb2Nlc3NFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQYWNrYWdlSW1wbCA8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NQYWNrYWdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1NfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzUGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX1BBQ0tBR0VfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzUGFja2FnZV9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsIDxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEUgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVAzID0gZUlOU1RBTkNFLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0dyb3VwMygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQcm9jZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFX1BST0NFU1MgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfQmFzZVByb2Nlc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUmVwb3J0SW1wbCA8ZW0+UmVwb3J0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5SZXBvcnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSZXBvcnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVQT1JUID0gZUlOU1RBTkNFLmdldFJlcG9ydCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5SZXVzYWJsZUFzc2V0SW1wbCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJldXNhYmxlQXNzZXRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSZXVzYWJsZUFzc2V0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFVVNBQkxFX0FTU0VUID0gZUlOU1RBTkNFLmdldFJldXNhYmxlQXNzZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9hZG1hcEltcGwgPGVtPlJvYWRtYXA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvYWRtYXBJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2FkbWFwKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPQURNQVAgPSBlSU5TVEFOQ0UuZ2V0Um9hZG1hcCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlSW1wbCA8ZW0+Um9sZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRSA9IGVJTlNUQU5DRS5nZXRSb2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRSb2xlX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX19SRVNQT05TSUJMRV9GT1IgPSBlSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsIDxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUyA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNraWxsczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUyA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TeW5vbnltczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwgPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlRGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX0RFU0NSSVBUT1JfX1JPTEUgPSBlSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUiA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0SW1wbCA8ZW0+Um9sZSBTZXQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlU2V0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPTEVfU0VUID0gZUlOU1RBTkNFLmdldFJvbGVTZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9TRVRfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRSb2xlU2V0X0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9TRVRfX1JPTEUgPSBlSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRHcm91cGluZ0ltcGwgPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlU2V0R3JvdXBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9TRVRfR1JPVVBJTkcgPSBlSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfU0VUX0dST1VQSU5HX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sZSBTZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVCA9IGVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TZWN0aW9uSW1wbCA8ZW0+U2VjdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNlY3Rpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VDVElPTiA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgU2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFQ1RJT05fX1NVQl9TRUNUSU9OID0gZUlOU1RBTkNFLmdldFNlY3Rpb25fU3ViU2VjdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRUNUSU9OX19QUkVERUNFU1NPUiA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1RJT05fX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFNlY3Rpb25fRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1RJT05fX1NFQ1RJT05fTkFNRSA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVElPTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uX1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRUNUSU9OX19WQVJJQUJJTElUWV9UWVBFID0gZUlOU1RBTkNFLmdldFNlY3Rpb25fVmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlN1cHBvcnRpbmdNYXRlcmlhbEltcGwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlN1cHBvcnRpbmdNYXRlcmlhbEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFN1cHBvcnRpbmdNYXRlcmlhbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTVVBQT1JUSU5HX01BVEVSSUFMID0gZUlOU1RBTkNFLmdldFN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCA8ZW0+VGFzazwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRhc2soKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEFTSyA9IGVJTlNUQU5DRS5nZXRUYXNrKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX19QUkVDT05ESVRJT04gPSBlSU5TVEFOQ0UuZ2V0VGFza19QcmVjb25kaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX19QT1NUQ09ORElUSU9OID0gZUlOU1RBTkNFLmdldFRhc2tfUG9zdGNvbmRpdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fUEVSRk9STUVEX0JZID0gZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fR1JPVVAyID0gZUlOU1RBTkNFLmdldFRhc2tfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX01BTkRBVE9SWV9JTlBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX09VVFBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSA9IGVJTlNUQU5DRS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fT1BUSU9OQUxfSU5QVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fRVNUSU1BVEUgPSBlSU5TVEFOQ0UuZ2V0VGFza19Fc3RpbWF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRS5nZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX1RPT0xfTUVOVE9SID0gZUlOU1RBTkNFLmdldFRhc2tfVG9vbE1lbnRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEFTS19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwgPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUQVNLX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX1RBU0sgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXNzaXN0ZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlkgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWwgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3V0cHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX09VVFBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0ZXA8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfREVTQ1JJUFRPUl9fU1RFUCA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9TdGVwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsIDxlbT5UZWFtIFByb2ZpbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVhbVByb2ZpbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEVBTV9QUk9GSUxFID0gZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRFQU1fUFJPRklMRV9fR1JPVVAxID0gZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX0dyb3VwMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEVBTV9QUk9GSUxFX19ST0xFID0gZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1JvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIFRlYW08L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSA9IGVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YiBUZWFtPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBURUFNX1BST0ZJTEVfX1NVQl9URUFNID0gZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVtcGxhdGVJbXBsIDxlbT5UZW1wbGF0ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVtcGxhdGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZW1wbGF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBURU1QTEFURSA9IGVJTlNUQU5DRS5nZXRUZW1wbGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZXJtRGVmaW5pdGlvbkltcGwgPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVybURlZmluaXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZXJtRGVmaW5pdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBURVJNX0RFRklOSVRJT04gPSBlSU5TVEFOQ0UuZ2V0VGVybURlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVG9vbEltcGwgPGVtPlRvb2w8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRvb2xJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUb29sKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRPT0wgPSBlSU5TVEFOQ0UuZ2V0VG9vbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUT09MX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0VG9vbF9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUT09MX19UT09MX01FTlRPUiA9IGVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVG9vbE1lbnRvckltcGwgPGVtPlRvb2wgTWVudG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Ub29sTWVudG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VG9vbE1lbnRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUT09MX01FTlRPUiA9IGVJTlNUQU5DRS5nZXRUb29sTWVudG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldoaXRlcGFwZXJJbXBsIDxlbT5XaGl0ZXBhcGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5XaGl0ZXBhcGVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V2hpdGVwYXBlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXSElURVBBUEVSID0gZUlOU1RBTkNFLmdldFdoaXRlcGFwZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIDxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfQlJFQUtET1dOX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxID0gZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0dyb3VwMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SID0gZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4gPSBlSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkcgPSBlSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRSA9IGVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsIDxlbT5Xb3JrIERlZmluaXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya0RlZmluaXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19ERUZJTklUSU9OID0gZUlOU1RBTkNFLmdldFdvcmtEZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiA9IGVJTlNUQU5DRS5nZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04gPSBlSU5TVEFOQ0UuZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsIDxlbT5Xb3JrIE9yZGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrT3JkZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19PUkRFUiA9IGVJTlNUQU5DRS5nZXRXb3JrT3JkZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19PUkRFUl9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0V29ya09yZGVyX1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaW5rIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX09SREVSX19MSU5LX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0V29ya09yZGVyX0xpbmtUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfT1JERVJfX0lEID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlcl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1QgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX19FU1RJTUFURSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfX1JFUE9SVCA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9SZXBvcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX19UT09MX01FTlRPUiA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBhY3QgT2YgTm90IEhhdmluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORyA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9FeHRlcm5hbElkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAxID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Hcm91cDEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGFjdGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlkgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGFjdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyYWJsZSBQYXJ0czwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBFeGl0IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEUgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGwgPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9UWVBFX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFZBUklBQklMSVRZX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlIDxlbT5Xb3JrIE9yZGVyIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtPcmRlclR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBXT1JLX09SREVSX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0V29ya09yZGVyVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFZhcmlhYmlsaXR5VHlwZU9iamVjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBWQVJJQUJJTElUWV9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRWYXJpYWJpbGl0eVR5cGVPYmplY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPldvcmsgT3JkZXIgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrT3JkZXJUeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFdPUktfT1JERVJfVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0V29ya09yZGVyVHlwZU9iamVjdCgpOwotCi0JfQotCi19IC8vVW1hUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVmFyaWFiaWxpdHlUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9WYXJpYWJpbGl0eVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGFlY2VhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9WYXJpYWJpbGl0eVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFZhcmlhYmlsaXR5VHlwZS5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjcganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZhcmlhYmlsaXR5VHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+TmE8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5hPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05BX0xJVEVSQUwKLQkgKiBAbW9kZWwgbmFtZT0ibmEiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkEgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29udHJpYnV0ZXM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNvbnRyaWJ1dGVzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlRSSUJVVEVTX0xJVEVSQUwKLQkgKiBAbW9kZWwgbmFtZT0iY29udHJpYnV0ZXMiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVFJJQlVURVMgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RXh0ZW5kczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RXh0ZW5kczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWFRFTkRTX0xJVEVSQUwKLQkgKiBAbW9kZWwgbmFtZT0iZXh0ZW5kcyIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFRFTkRTID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJlcGxhY2VzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRVBMQUNFU19MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9InJlcGxhY2VzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUExBQ0VTID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsIENvbnRyaWJ1dGlvbjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TG9jYWwgQ29udHJpYnV0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMX0NPTlRSSUJVVElPTl9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9ImxvY2FsQ29udHJpYnV0aW9uIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMX0NPTlRSSUJVVElPTiA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Mb2NhbCBSZXBsYWNlbWVudDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TG9jYWwgUmVwbGFjZW1lbnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfUkVQTEFDRU1FTlRfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJsb2NhbFJlcGxhY2VtZW50IgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMX1JFUExBQ0VNRU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5hPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05BCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGUgTkFfTElURVJBTCA9IG5ldyBWYXJpYWJpbGl0eVR5cGUoTkEsICJuYSIsICJuYSIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29udHJpYnV0ZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OVFJJQlVURVMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBDT05UUklCVVRFU19MSVRFUkFMID0gbmV3IFZhcmlhYmlsaXR5VHlwZShDT05UUklCVVRFUywgImNvbnRyaWJ1dGVzIiwgImNvbnRyaWJ1dGVzIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FeHRlbmRzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYVEVORFMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBFWFRFTkRTX0xJVEVSQUwgPSBuZXcgVmFyaWFiaWxpdHlUeXBlKEVYVEVORFMsICJleHRlbmRzIiwgImV4dGVuZHMiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJlcGxhY2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFUExBQ0VTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGUgUkVQTEFDRVNfTElURVJBTCA9IG5ldyBWYXJpYWJpbGl0eVR5cGUoUkVQTEFDRVMsICJyZXBsYWNlcyIsICJyZXBsYWNlcyIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWwgQ29udHJpYnV0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMX0NPTlRSSUJVVElPTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFyaWFiaWxpdHlUeXBlIExPQ0FMX0NPTlRSSUJVVElPTl9MSVRFUkFMID0gbmV3IFZhcmlhYmlsaXR5VHlwZShMT0NBTF9DT05UUklCVVRJT04sICJsb2NhbENvbnRyaWJ1dGlvbiIsICJsb2NhbENvbnRyaWJ1dGlvbiIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWwgUmVwbGFjZW1lbnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfUkVQTEFDRU1FTlQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBMT0NBTF9SRVBMQUNFTUVOVF9MSVRFUkFMID0gbmV3IFZhcmlhYmlsaXR5VHlwZShMT0NBTF9SRVBMQUNFTUVOVCwgImxvY2FsUmVwbGFjZW1lbnQiLCAibG9jYWxSZXBsYWNlbWVudCIpOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBWYXJpYWJpbGl0eVR5cGVbXSB7Ci0JCQlOQV9MSVRFUkFMLAotCQkJQ09OVFJJQlVURVNfTElURVJBTCwKLQkJCUVYVEVORFNfTElURVJBTCwKLQkJCVJFUExBQ0VTX0xJVEVSQUwsCi0JCQlMT0NBTF9DT05UUklCVVRJT05fTElURVJBTCwKLQkJCUxPQ0FMX1JFUExBQ0VNRU5UX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhcmlhYmlsaXR5VHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVZhcmlhYmlsaXR5VHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIE5BOiByZXR1cm4gTkFfTElURVJBTDsKLQkJCWNhc2UgQ09OVFJJQlVURVM6IHJldHVybiBDT05UUklCVVRFU19MSVRFUkFMOwotCQkJY2FzZSBFWFRFTkRTOiByZXR1cm4gRVhURU5EU19MSVRFUkFMOwotCQkJY2FzZSBSRVBMQUNFUzogcmV0dXJuIFJFUExBQ0VTX0xJVEVSQUw7Ci0JCQljYXNlIExPQ0FMX0NPTlRSSUJVVElPTjogcmV0dXJuIExPQ0FMX0NPTlRSSUJVVElPTl9MSVRFUkFMOwotCQkJY2FzZSBMT0NBTF9SRVBMQUNFTUVOVDogcmV0dXJuIExPQ0FMX1JFUExBQ0VNRU5UX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZhcmlhYmlsaXR5VHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vVmFyaWFiaWxpdHlUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9XaGl0ZXBhcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9XaGl0ZXBhcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBjMDVjY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV2hpdGVwYXBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXaGl0ZXBhcGVyLmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNyBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdoaXRlcGFwZXIoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1doaXRlcGFwZXInIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXaGl0ZXBhcGVyIGV4dGVuZHMgQ29uY2VwdCB7Ci19IC8vIFdoaXRlcGFwZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrQnJlYWtkb3duRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya0JyZWFrZG93bkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzdkYzM2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrQnJlYWtkb3duRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya0JyZWFrZG93bkVsZW1lbnQuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNSZXBlYXRhYmxlIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrQnJlYWtkb3duRWxlbWVudCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtCcmVha2Rvd25FbGVtZW50IGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50X0dyb3VwMSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjE5JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZWRlY2Vzc29yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29yKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyIiBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlZGVjZXNzb3InIGdyb3VwPScjZ3JvdXA6MTknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRQcmVkZWNlc3NvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0V2ZW50RHJpdmVuKCkKLQkgKiBAc2VlICN1bnNldElzRXZlbnREcml2ZW4oKQotCSAqIEBzZWUgI3NldElzRXZlbnREcml2ZW4oYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpc0V2ZW50RHJpdmVuJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzRXZlbnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFdmVudCBEcml2ZW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNFdmVudERyaXZlbigpCi0JICogQHNlZSAjdW5zZXRJc0V2ZW50RHJpdmVuKCkKLQkgKiBAc2VlICNpc0lzRXZlbnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzRXZlbnREcml2ZW4oYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzRXZlbnREcml2ZW4oKQotCSAqIEBzZWUgI2lzSXNFdmVudERyaXZlbigpCi0JICogQHNlZSAjc2V0SXNFdmVudERyaXZlbihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNFdmVudERyaXZlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc0V2ZW50RHJpdmVuKCkKLQkgKiBAc2VlICNpc0lzRXZlbnREcml2ZW4oKQotCSAqIEBzZWUgI3NldElzRXZlbnREcml2ZW4oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzRXZlbnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIElmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBPbmdvaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzT25nb2luZygpCi0JICogQHNlZSAjdW5zZXRJc09uZ29pbmcoKQotCSAqIEBzZWUgI3NldElzT25nb2luZyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naXNPbmdvaW5nJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzT25nb2luZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIE9uZ29pbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNPbmdvaW5nKCkKLQkgKiBAc2VlICN1bnNldElzT25nb2luZygpCi0JICogQHNlZSAjaXNJc09uZ29pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzT25nb2luZyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNPbmdvaW5nKCkKLQkgKiBAc2VlICNpc0lzT25nb2luZygpCi0JICogQHNlZSAjc2V0SXNPbmdvaW5nKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc09uZ29pbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIE9uZ29pbmc8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzT25nb2luZygpCi0JICogQHNlZSAjaXNJc09uZ29pbmcoKQotCSAqIEBzZWUgI3NldElzT25nb2luZyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNPbmdvaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1JlcGVhdGFibGUoKQotCSAqIEBzZWUgI3Vuc2V0SXNSZXBlYXRhYmxlKCkKLQkgKiBAc2VlICNzZXRJc1JlcGVhdGFibGUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2lzUmVwZWF0YWJsZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc1JlcGVhdGFibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNSZXBlYXRhYmxlIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBSZXBlYXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzUmVwZWF0YWJsZSgpCi0JICogQHNlZSAjdW5zZXRJc1JlcGVhdGFibGUoKQotCSAqIEBzZWUgI2lzSXNSZXBlYXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1JlcGVhdGFibGUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNSZXBlYXRhYmxlIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzUmVwZWF0YWJsZSgpCi0JICogQHNlZSAjaXNJc1JlcGVhdGFibGUoKQotCSAqIEBzZWUgI3NldElzUmVwZWF0YWJsZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNSZXBlYXRhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNSZXBlYXRhYmxlIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBSZXBlYXRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc1JlcGVhdGFibGUoKQotCSAqIEBzZWUgI2lzSXNSZXBlYXRhYmxlKCkKLQkgKiBAc2VlICNzZXRJc1JlcGVhdGFibGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzUmVwZWF0YWJsZSgpOwotCi19IC8vIFdvcmtCcmVha2Rvd25FbGVtZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya0RlZmluaXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY5M2NmYTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya0RlZmluaXRpb24uamF2YSx2IDEuMiAyMDA2LzA2LzIzIDAwOjAxOjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgRGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuCi0gKiBXb3JrIERlZmluaXRpb25zIHJlcHJlc2VudCBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgZG9pbmcgd29yay4gIFRoZXNlIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGFyZSBub3QgYm91bmQgdG8gb25lIHNwZWNpZmljIGNsYXNzaWZpZXIsIGJ1dCByZXByZXNlbnQgYW4gYXJiaXRyYXJ5IGRlZmluaXRpb24gb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZCBieSBhIHNwZWNpZmljIFJvbGUgKGUuZy4gYSBSb2xlIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBUYXNrIG9yIFN0ZXBzIG9mIGEgVGFzayksIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjbG9zZSBjb2xsYWJvcmF0aW9uIChtYW55IFJvbGVzIGFsbCB3b3JraW5nIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIGludGVyZGlzY2lwbGluYXJ5IFRhc2spLCBvciBjb21wbGV4IHdvcmsgdGhhdCBpcyBwZXJmb3JtZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIChlLmcuIGEgcHJvY2VzcyBkZWZpbmluZyBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgZm9yIG9yZ2FuaXppbmcgbGFyZ2VyIGNvbXBvc2l0ZSB1bml0cyBvZiB3b3JrIHBlcmZvcm1lZCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY29sbGFib3JhdGlvbikuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24jZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0RlZmluaXRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtEZWZpbml0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya0RlZmluaXRpb24gZXh0ZW5kcyBNZXRob2RFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZWNvbmRpdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtEZWZpbml0aW9uX1ByZWNvbmRpdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmVjb25kaXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlY29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWNvbmRpdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQb3N0Y29uZGl0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQb3N0Y29uZGl0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBvc3Rjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBvc3Rjb25kaXRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBXb3JrRGVmaW5pdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtPcmRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya09yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmY2RmODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya09yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrT3JkZXIuamF2YSx2IDEuMyAyMDA2LzA4LzI1IDIyOjU5OjE0IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5FRGF0YU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBPcmRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gIAotICogVGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW4gcGFydGljdWxhciBjcml0aWNhbCBmb3IgcGxhbm5pbmcgYXBwbGljYXRpb25zLiAgU2VlIG1vcmUgZGV0YWlscyBvbiBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF0IFdvcmsgT3JkZXIgVHlwZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0TGlua1R5cGUgPGVtPkxpbmsgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrT3JkZXIoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtPcmRlcicga2luZD0nc2ltcGxlJyIKLSAqIEBleHRlbmRzIEVEYXRhT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya09yZGVyIGV4dGVuZHMgRURhdGFPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrT3JkZXJfVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nOjAnIGtpbmQ9J3NpbXBsZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGluayBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZpbmlzaFRvU3RhcnQiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZQotCSAqIEBzZWUgI2lzU2V0TGlua1R5cGUoKQotCSAqIEBzZWUgI3Vuc2V0TGlua1R5cGUoKQotCSAqIEBzZWUgI3NldExpbmtUeXBlKFdvcmtPcmRlclR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtPcmRlcl9MaW5rVHlwZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZpbmlzaFRvU3RhcnQiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nbGlua1R5cGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrT3JkZXJUeXBlIGdldExpbmtUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0TGlua1R5cGUgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGluayBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUKLQkgKiBAc2VlICNpc1NldExpbmtUeXBlKCkKLQkgKiBAc2VlICN1bnNldExpbmtUeXBlKCkKLQkgKiBAc2VlICNnZXRMaW5rVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRMaW5rVHlwZSA8ZW0+TGluayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldExpbmtUeXBlKCkKLQkgKiBAc2VlICNnZXRMaW5rVHlwZSgpCi0JICogQHNlZSAjc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldExpbmtUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRMaW5rVHlwZSA8ZW0+TGluayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldExpbmtUeXBlKCkKLQkgKiBAc2VlICNnZXRMaW5rVHlwZSgpCi0JICogQHNlZSAjc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldExpbmtUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya09yZGVyX0lkKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFdvcmtPcmRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtPcmRlclR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtPcmRlclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWMyODhlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrT3JkZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrT3JkZXJUeXBlLmphdmEsdiAxLjIgMjAwNi8wNi8yMyAwMDowMToyNiBqeGkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnQgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50IGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50IGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF2YWlsYWJsZSBpbiBVTUEgYW5kIGlzIHVzZWQgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIFdvcmsgT3JkZXIncyBsaW5rVHlwZSBhdHRyaWJ1dGUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya09yZGVyVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFdvcmtPcmRlclR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZpbmlzaCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RmluaXNoIFRvIFN0YXJ0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0ZJTklTSF9UT19TVEFSVF9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9ImZpbmlzaFRvU3RhcnQiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklOSVNIX1RPX1NUQVJUID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZpbmlzaCBUbyBGaW5pc2g8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkZpbmlzaCBUbyBGaW5pc2g8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRklOSVNIX1RPX0ZJTklTSF9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9ImZpbmlzaFRvRmluaXNoIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTklTSF9UT19GSU5JU0ggPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U3RhcnQgVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlN0YXJ0IFRvIFN0YXJ0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVJUX1RPX1NUQVJUX0xJVEVSQUwKLQkgKiBAbW9kZWwgbmFtZT0ic3RhcnRUb1N0YXJ0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1RPX1NUQVJUID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXJ0IFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U3RhcnQgVG8gRmluaXNoPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVJUX1RPX0ZJTklTSF9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9InN0YXJ0VG9GaW5pc2giCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfVE9fRklOSVNIID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZpbmlzaCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGSU5JU0hfVE9fU1RBUlQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFdvcmtPcmRlclR5cGUgRklOSVNIX1RPX1NUQVJUX0xJVEVSQUwgPSBuZXcgV29ya09yZGVyVHlwZShGSU5JU0hfVE9fU1RBUlQsICJmaW5pc2hUb1N0YXJ0IiwgImZpbmlzaFRvU3RhcnQiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZpbmlzaCBUbyBGaW5pc2g8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRklOSVNIX1RPX0ZJTklTSAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgV29ya09yZGVyVHlwZSBGSU5JU0hfVE9fRklOSVNIX0xJVEVSQUwgPSBuZXcgV29ya09yZGVyVHlwZShGSU5JU0hfVE9fRklOSVNILCAiZmluaXNoVG9GaW5pc2giLCAiZmluaXNoVG9GaW5pc2giKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXJ0IFRvIFN0YXJ0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVJUX1RPX1NUQVJUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBXb3JrT3JkZXJUeXBlIFNUQVJUX1RPX1NUQVJUX0xJVEVSQUwgPSBuZXcgV29ya09yZGVyVHlwZShTVEFSVF9UT19TVEFSVCwgInN0YXJ0VG9TdGFydCIsICJzdGFydFRvU3RhcnQiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXJ0IFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVEFSVF9UT19GSU5JU0gKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFdvcmtPcmRlclR5cGUgU1RBUlRfVE9fRklOSVNIX0xJVEVSQUwgPSBuZXcgV29ya09yZGVyVHlwZShTVEFSVF9UT19GSU5JU0gsICJzdGFydFRvRmluaXNoIiwgInN0YXJ0VG9GaW5pc2giKTsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFdvcmtPcmRlclR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgV29ya09yZGVyVHlwZVtdIHsKLQkJCUZJTklTSF9UT19TVEFSVF9MSVRFUkFMLAotCQkJRklOSVNIX1RPX0ZJTklTSF9MSVRFUkFMLAotCQkJU1RBUlRfVE9fU1RBUlRfTElURVJBTCwKLQkJCVNUQVJUX1RPX0ZJTklTSF9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVdvcmtPcmRlclR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXJUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJV29ya09yZGVyVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgRklOSVNIX1RPX1NUQVJUOiByZXR1cm4gRklOSVNIX1RPX1NUQVJUX0xJVEVSQUw7Ci0JCQljYXNlIEZJTklTSF9UT19GSU5JU0g6IHJldHVybiBGSU5JU0hfVE9fRklOSVNIX0xJVEVSQUw7Ci0JCQljYXNlIFNUQVJUX1RPX1NUQVJUOiByZXR1cm4gU1RBUlRfVE9fU1RBUlRfTElURVJBTDsKLQkJCWNhc2UgU1RBUlRfVE9fRklOSVNIOiByZXR1cm4gU1RBUlRfVE9fRklOSVNIX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdvcmtPcmRlclR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL1dvcmtPcmRlclR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtQcm9kdWN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrUHJvZHVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NDUxNzExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtQcm9kdWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrUHJvZHVjdC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDY6MDAga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLgotICogQSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldEVzdGltYXRlIDxlbT5Fc3RpbWF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRSZXBvcnQgPGVtPlJlcG9ydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0VGVtcGxhdGUgPGVtPlRlbXBsYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRUb29sTWVudG9yIDxlbT5Ub29sIE1lbnRvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV29ya1Byb2R1Y3QnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdCBleHRlbmRzIENvbnRlbnRFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVzdGltYXRlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGU8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0X0VzdGltYXRlKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VzdGltYXRlJyBncm91cD0nI2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RXN0aW1hdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zJyBncm91cD0nI2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcG9ydDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcG9ydDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfUmVwb3J0KCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlcG9ydCcgZ3JvdXA9JyNncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFJlcG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGVtcGxhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRlbXBsYXRlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGVtcGxhdGU8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0X1RlbXBsYXRlKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RlbXBsYXRlJyBncm91cD0nI2dyb3VwOjIxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0VGVtcGxhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9yKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Rvb2xNZW50b3InIGdyb3VwPScjZ3JvdXA6MjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRUb29sTWVudG9yKCk7Ci0KLX0gLy8gV29ya1Byb2R1Y3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI2MjdlMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDYvMDYvMjMgMDA6MDE6MjYganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBXb3JrIFByb2R1Y3QuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRJbXBhY3RPZk5vdEhhdmluZyA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRSZWFzb25zRm9yTm90TmVlZGluZyA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxJZCA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV29ya1Byb2R1Y3REZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW1wYWN0T2ZOb3RIYXZpbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0ltcGFjdE9mTm90SGF2aW5nKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ltcGFjdE9mTm90SGF2aW5nJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEltcGFjdE9mTm90SGF2aW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldEltcGFjdE9mTm90SGF2aW5nIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEltcGFjdE9mTm90SGF2aW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbXBhY3RPZk5vdEhhdmluZyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHVycG9zZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQdXJwb3NlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFB1cnBvc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHVycG9zZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlYXNvbnNGb3JOb3ROZWVkaW5nJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nIDxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWFzb25zRm9yTm90TmVlZGluZyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgSWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4dGVybmFsSWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdleHRlcm5hbElkJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEV4dGVybmFsSWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxJZCA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIElkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHRlcm5hbElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gV29ya1Byb2R1Y3REZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQxOTJiYTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrUHJvZHVjdERlc2NyaXB0b3IuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFdvcmsgUHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RlZEJ5IDxlbT5JbXBhY3RlZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdHMgPGVtPkltcGFjdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXREZWxpdmVyYWJsZVBhcnRzIDxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RW50cnlTdGF0ZSA8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUV4aXRTdGF0ZSA8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtQcm9kdWN0RGVzY3JpcHRvcicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBleHRlbmRzIERlc2NyaXB0b3IgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29ya1Byb2R1Y3QoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV29ya1Byb2R1Y3QnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0V29ya1Byb2R1Y3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrUHJvZHVjdChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Hcm91cDEoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyMiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbXBhY3RlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW1wYWN0ZWQgQnk8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBhY3RlZCBCeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSW1wYWN0ZWRCeScgZ3JvdXA9JyNncm91cDoyMiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEltcGFjdGVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkltcGFjdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkltcGFjdHM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBhY3RzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbXBhY3RzJyBncm91cD0nI2dyb3VwOjIyJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0SW1wYWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVsaXZlcmFibGUgUGFydHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlbGl2ZXJhYmxlUGFydHMnIGdyb3VwPScjZ3JvdXA6MjInIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZWxpdmVyYWJsZVBhcnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gIAotCSAqIEZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdGl2aXR5RW50cnlTdGF0ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdhY3Rpdml0eUVudHJ5U3RhdGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0aXZpdHlFbnRyeVN0YXRlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3Rpdml0eSBFeGl0IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEV4aXN0IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGZpbmlzaGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBoYXMgZmluaXNoZWQgdGhhdCBoYXZlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgb3V0cHV0KS4KLQkgKiBGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdGl2aXR5RXhpdFN0YXRlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nYWN0aXZpdHlFeGl0U3RhdGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUV4aXRTdGF0ZSA8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdGl2aXR5RXhpdFN0YXRlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gV29ya1Byb2R1Y3REZXNjcmlwdG9yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3RUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrUHJvZHVjdFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjc2ZWU0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrUHJvZHVjdFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3RUeXBlLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgIkNsYXNzIERpYWdyYW0iLCB3aGljaCBjYXRlZ29yaXplcyB0aGUgQXJ0aWZhY3RzIEFuYWx5c2lzIE1vZGVsLCBEZXNpZ24gTW9kZWwsIFVzZXIgRXhwZXJpZW5jZSBNb2RlbCwgb3IgIlNwZWNpZmljYXRpb24iLCB3aGljaCBjYXRlZ29yaXplcyByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbnMgdGhhdCBkZWZpbmUgYSBzeXN0ZW0gd2l0aCBhIHdlbGwtZGVmaW5lZCBzeXN0ZW0gYm91bmRhcnksIHN1Y2ggYXMgdXNlIGNhc2Ugb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbi4gIEEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGNhbiBiZSBjYXRlZ29yaXplZCBhcyBhIFNwZWNpZmljYXRpb24gYXMgd2VsbCBhcyBEaWFncmFtIFdvcmsgUHJvZHVjdCBUeXBlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RUeXBlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrUHJvZHVjdFR5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdFR5cGUgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdFR5cGVfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdCgpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrUHJvZHVjdCcgZ3JvdXA9JyNncm91cDoyMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFdvcmtQcm9kdWN0KCk7Ci0KLX0gLy8gV29ya1Byb2R1Y3RUeXBlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BY3Rpdml0eURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BY3Rpdml0eURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxY2FkYzc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsI2dldEhvd1RvU3RhZmYgPGVtPkhvdyBUbyBTdGFmZjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgQWN0aXZpdHlEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdGVybmF0aXZlcygpIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxURVJOQVRJVkVTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdGVybmF0aXZlcygpIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhbHRlcm5hdGl2ZXMgPSBBTFRFUk5BVElWRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SG93VG9TdGFmZigpIDxlbT5Ib3cgVG8gU3RhZmY8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhvd1RvU3RhZmYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhPV19UT19TVEFGRl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIb3dUb1N0YWZmKCkgPGVtPkhvdyBUbyBTdGFmZjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SG93VG9TdGFmZigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBob3dUb1N0YWZmID0gSE9XX1RPX1NUQUZGX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVSUE9TRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVycG9zZSA9IFBVUlBPU0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gYWx0ZXJuYXRpdmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgbmV3QWx0ZXJuYXRpdmVzKSB7Ci0JCVN0cmluZyBvbGRBbHRlcm5hdGl2ZXMgPSBhbHRlcm5hdGl2ZXM7Ci0JCWFsdGVybmF0aXZlcyA9IG5ld0FsdGVybmF0aXZlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTLCBvbGRBbHRlcm5hdGl2ZXMsIGFsdGVybmF0aXZlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG93VG9TdGFmZigpIHsKLQkJcmV0dXJuIGhvd1RvU3RhZmY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG93VG9TdGFmZihTdHJpbmcgbmV3SG93VG9TdGFmZikgewotCQlTdHJpbmcgb2xkSG93VG9TdGFmZiA9IGhvd1RvU3RhZmY7Ci0JCWhvd1RvU3RhZmYgPSBuZXdIb3dUb1N0YWZmOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dfVE9fU1RBRkYsIG9sZEhvd1RvU3RhZmYsIGhvd1RvU3RhZmYpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1cnBvc2UoKSB7Ci0JCXJldHVybiBwdXJwb3NlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1cnBvc2UoU3RyaW5nIG5ld1B1cnBvc2UpIHsKLQkJU3RyaW5nIG9sZFB1cnBvc2UgPSBwdXJwb3NlOwotCQlwdXJwb3NlID0gbmV3UHVycG9zZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRSwgb2xkUHVycG9zZSwgcHVycG9zZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJCXJldHVybiBnZXRBbHRlcm5hdGl2ZXMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGOgotCQkJCXJldHVybiBnZXRIb3dUb1N0YWZmKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQkJcmV0dXJuIGdldFB1cnBvc2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQkJc2V0QWx0ZXJuYXRpdmVzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGOgotCQkJCXNldEhvd1RvU3RhZmYoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXNldFB1cnBvc2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJCXNldEFsdGVybmF0aXZlcyhBTFRFUk5BVElWRVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGOgotCQkJCXNldEhvd1RvU3RhZmYoSE9XX1RPX1NUQUZGX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQkJc2V0UHVycG9zZShQVVJQT1NFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJCXJldHVybiBBTFRFUk5BVElWRVNfRURFRkFVTFQgPT0gbnVsbCA/IGFsdGVybmF0aXZlcyAhPSBudWxsIDogIUFMVEVSTkFUSVZFU19FREVGQVVMVC5lcXVhbHMoYWx0ZXJuYXRpdmVzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGOgotCQkJCXJldHVybiBIT1dfVE9fU1RBRkZfRURFRkFVTFQgPT0gbnVsbCA/IGhvd1RvU3RhZmYgIT0gbnVsbCA6ICFIT1dfVE9fU1RBRkZfRURFRkFVTFQuZXF1YWxzKGhvd1RvU3RhZmYpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXJldHVybiBQVVJQT1NFX0VERUZBVUxUID09IG51bGwgPyBwdXJwb3NlICE9IG51bGwgOiAhUFVSUE9TRV9FREVGQVVMVC5lcXVhbHMocHVycG9zZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhbHRlcm5hdGl2ZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFsdGVybmF0aXZlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaG93VG9TdGFmZjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaG93VG9TdGFmZik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHVycG9zZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHVycG9zZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FjdGl2aXR5RGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BY3Rpdml0eUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQWN0aXZpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczZjQ4MGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BY3Rpdml0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFjdGl2aXR5SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRCcmVha2Rvd25FbGVtZW50IDxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0Q2hlY2tsaXN0IDxlbT5DaGVja2xpc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldENvbmNlcHQgPGVtPkNvbmNlcHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldEV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldEd1aWRlbGluZSA8ZW0+R3VpZGVsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRSb2FkbWFwIDxlbT5Sb2FkbWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRSZXVzYWJsZUFzc2V0IDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0U3VwcG9ydGluZ01hdGVyaWFsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRXaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNpc0lzRW5hY3RhYmxlIDxlbT5JcyBFbmFjdGFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5SW1wbCBleHRlbmRzIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIEFjdGl2aXR5IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVDT05ESVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWNvbmRpdGlvbiA9IFBSRUNPTkRJVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Y29uZGl0aW9uKCkgPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU1RDT05ESVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBvc3Rjb25kaXRpb24gPSBQT1NUQ09ORElUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0VuYWN0YWJsZSgpIDxlbT5JcyBFbmFjdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNFbmFjdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19FTkFDVEFCTEVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNFbmFjdGFibGUoKSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzRW5hY3RhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuYWN0YWJsZSA9IElTX0VOQUNUQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgRW5hY3RhYmxlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuYWN0YWJsZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSBWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5VHlwZSgpIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVmFyaWFiaWxpdHlUeXBlIFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQgPSBWYXJpYWJpbGl0eVR5cGUuTkFfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5VHlwZSgpIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVmFyaWFiaWxpdHkgVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFyaWFiaWxpdHlUeXBlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwcmVjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlY29uZGl0aW9uKFN0cmluZyBuZXdQcmVjb25kaXRpb24pIHsKLQkJU3RyaW5nIG9sZFByZWNvbmRpdGlvbiA9IHByZWNvbmRpdGlvbjsKLQkJcHJlY29uZGl0aW9uID0gbmV3UHJlY29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT04sIG9sZFByZWNvbmRpdGlvbiwgcHJlY29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3N0Y29uZGl0aW9uKCkgewotCQlyZXR1cm4gcG9zdGNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3N0Y29uZGl0aW9uKFN0cmluZyBuZXdQb3N0Y29uZGl0aW9uKSB7Ci0JCVN0cmluZyBvbGRQb3N0Y29uZGl0aW9uID0gcG9zdGNvbmRpdGlvbjsKLQkJcG9zdGNvbmRpdGlvbiA9IG5ld1Bvc3Rjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT04sIG9sZFBvc3Rjb25kaXRpb24sIHBvc3Rjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkFDVElWSVRZX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEJyZWFrZG93bkVsZW1lbnQoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDaGVja2xpc3QoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fQ0hFQ0tMSVNUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q29uY2VwdCgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX19DT05DRVBUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXhhbXBsZSgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX19FWEFNUExFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0R3VpZGVsaW5lKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX0dVSURFTElORSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJvYWRtYXAoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fUk9BRE1BUCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJldXNhYmxlQXNzZXQoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFdoaXRlcGFwZXIoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fV0hJVEVQQVBFUik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc0VuYWN0YWJsZSgpIHsKLQkJcmV0dXJuIGlzRW5hY3RhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzRW5hY3RhYmxlKGJvb2xlYW4gbmV3SXNFbmFjdGFibGUpIHsKLQkJYm9vbGVhbiBvbGRJc0VuYWN0YWJsZSA9IGlzRW5hY3RhYmxlOwotCQlpc0VuYWN0YWJsZSA9IG5ld0lzRW5hY3RhYmxlOwotCQlib29sZWFuIG9sZElzRW5hY3RhYmxlRVNldCA9IGlzRW5hY3RhYmxlRVNldDsKLQkJaXNFbmFjdGFibGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9fSVNfRU5BQ1RBQkxFLCBvbGRJc0VuYWN0YWJsZSwgaXNFbmFjdGFibGUsICFvbGRJc0VuYWN0YWJsZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzRW5hY3RhYmxlKCkgewotCQlib29sZWFuIG9sZElzRW5hY3RhYmxlID0gaXNFbmFjdGFibGU7Ci0JCWJvb2xlYW4gb2xkSXNFbmFjdGFibGVFU2V0ID0gaXNFbmFjdGFibGVFU2V0OwotCQlpc0VuYWN0YWJsZSA9IElTX0VOQUNUQUJMRV9FREVGQVVMVDsKLQkJaXNFbmFjdGFibGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9fSVNfRU5BQ1RBQkxFLCBvbGRJc0VuYWN0YWJsZSwgSVNfRU5BQ1RBQkxFX0VERUZBVUxULCBvbGRJc0VuYWN0YWJsZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzRW5hY3RhYmxlKCkgewotCQlyZXR1cm4gaXNFbmFjdGFibGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChTdHJpbmcgbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkgewotCQlTdHJpbmcgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSBuZXdWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULCBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50LCB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5VHlwZSBnZXRWYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSBuZXdWYXJpYWJpbGl0eVR5cGUpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIG9sZFZhcmlhYmlsaXR5VHlwZSA9IHZhcmlhYmlsaXR5VHlwZTsKLQkJdmFyaWFiaWxpdHlUeXBlID0gbmV3VmFyaWFiaWxpdHlUeXBlID09IG51bGwgPyBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUIDogbmV3VmFyaWFiaWxpdHlUeXBlOwotCQlib29sZWFuIG9sZFZhcmlhYmlsaXR5VHlwZUVTZXQgPSB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCQl2YXJpYWJpbGl0eVR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRSwgb2xkVmFyaWFiaWxpdHlUeXBlLCB2YXJpYWJpbGl0eVR5cGUsICFvbGRWYXJpYWJpbGl0eVR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRWYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSBvbGRWYXJpYWJpbGl0eVR5cGUgPSB2YXJpYWJpbGl0eVR5cGU7Ci0JCWJvb2xlYW4gb2xkVmFyaWFiaWxpdHlUeXBlRVNldCA9IHZhcmlhYmlsaXR5VHlwZUVTZXQ7Ci0JCXZhcmlhYmlsaXR5VHlwZSA9IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQ7Ci0JCXZhcmlhYmlsaXR5VHlwZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFLCBvbGRWYXJpYWJpbGl0eVR5cGUsIFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQsIG9sZFZhcmlhYmlsaXR5VHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEJyZWFrZG93bkVsZW1lbnQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjoKLQkJCQlyZXR1cm4gZ2V0UHJlY29uZGl0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIGdldFBvc3Rjb25kaXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEJyZWFrZG93bkVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQ0hFQ0tMSVNUOgotCQkJCXJldHVybiBnZXRDaGVja2xpc3QoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQ09OQ0VQVDoKLQkJCQlyZXR1cm4gZ2V0Q29uY2VwdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19FWEFNUExFOgotCQkJCXJldHVybiBnZXRFeGFtcGxlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0dVSURFTElORToKLQkJCQlyZXR1cm4gZ2V0R3VpZGVsaW5lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVA6Ci0JCQkJcmV0dXJuIGdldFJvYWRtYXAoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVQ6Ci0JCQkJcmV0dXJuIGdldFJldXNhYmxlQXNzZXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTDoKLQkJCQlyZXR1cm4gZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1dISVRFUEFQRVI6Ci0JCQkJcmV0dXJuIGdldFdoaXRlcGFwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOgotCQkJCXJldHVybiBpc0lzRW5hY3RhYmxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjoKLQkJCQlzZXRQcmVjb25kaXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJCXNldFBvc3Rjb25kaXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQ6Ci0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudCgpLmNsZWFyKCk7Ci0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19DSEVDS0xJU1Q6Ci0JCQkJZ2V0Q2hlY2tsaXN0KCkuY2xlYXIoKTsKLQkJCQlnZXRDaGVja2xpc3QoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQ09OQ0VQVDoKLQkJCQlnZXRDb25jZXB0KCkuY2xlYXIoKTsKLQkJCQlnZXRDb25jZXB0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0VYQU1QTEU6Ci0JCQkJZ2V0RXhhbXBsZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RXhhbXBsZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19HVUlERUxJTkU6Ci0JCQkJZ2V0R3VpZGVsaW5lKCkuY2xlYXIoKTsKLQkJCQlnZXRHdWlkZWxpbmUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUk9BRE1BUDoKLQkJCQlnZXRSb2FkbWFwKCkuY2xlYXIoKTsKLQkJCQlnZXRSb2FkbWFwKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUOgotCQkJCWdldFJldXNhYmxlQXNzZXQoKS5jbGVhcigpOwotCQkJCWdldFJldXNhYmxlQXNzZXQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTDoKLQkJCQlnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKS5jbGVhcigpOwotCQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19XSElURVBBUEVSOgotCQkJCWdldFdoaXRlcGFwZXIoKS5jbGVhcigpOwotCQkJCWdldFdoaXRlcGFwZXIoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOgotCQkJCXNldElzRW5hY3RhYmxlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlzZXRWYXJpYWJpbGl0eVR5cGUoKFZhcmlhYmlsaXR5VHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OOgotCQkJCXNldFByZWNvbmRpdGlvbihQUkVDT05ESVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjoKLQkJCQlzZXRQb3N0Y29uZGl0aW9uKFBPU1RDT05ESVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVDoKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0NIRUNLTElTVDoKLQkJCQlnZXRDaGVja2xpc3QoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQ09OQ0VQVDoKLQkJCQlnZXRDb25jZXB0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0VYQU1QTEU6Ci0JCQkJZ2V0RXhhbXBsZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19HVUlERUxJTkU6Ci0JCQkJZ2V0R3VpZGVsaW5lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVA6Ci0JCQkJZ2V0Um9hZG1hcCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19SRVVTQUJMRV9BU1NFVDoKLQkJCQlnZXRSZXVzYWJsZUFzc2V0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1dISVRFUEFQRVI6Ci0JCQkJZ2V0V2hpdGVwYXBlcigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19JU19FTkFDVEFCTEU6Ci0JCQkJdW5zZXRJc0VuYWN0YWJsZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQl1bnNldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIFBSRUNPTkRJVElPTl9FREVGQVVMVCA9PSBudWxsID8gcHJlY29uZGl0aW9uICE9IG51bGwgOiAhUFJFQ09ORElUSU9OX0VERUZBVUxULmVxdWFscyhwcmVjb25kaXRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBQT1NUQ09ORElUSU9OX0VERUZBVUxUID09IG51bGwgPyBwb3N0Y29uZGl0aW9uICE9IG51bGwgOiAhUE9TVENPTkRJVElPTl9FREVGQVVMVC5lcXVhbHMocG9zdGNvbmRpdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UOgotCQkJCXJldHVybiAhZ2V0QnJlYWtkb3duRWxlbWVudCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQ0hFQ0tMSVNUOgotCQkJCXJldHVybiAhZ2V0Q2hlY2tsaXN0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19DT05DRVBUOgotCQkJCXJldHVybiAhZ2V0Q29uY2VwdCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fRVhBTVBMRToKLQkJCQlyZXR1cm4gIWdldEV4YW1wbGUoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0dVSURFTElORToKLQkJCQlyZXR1cm4gIWdldEd1aWRlbGluZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUk9BRE1BUDoKLQkJCQlyZXR1cm4gIWdldFJvYWRtYXAoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUOgotCQkJCXJldHVybiAhZ2V0UmV1c2FibGVBc3NldCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTDoKLQkJCQlyZXR1cm4gIWdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fV0hJVEVQQVBFUjoKLQkJCQlyZXR1cm4gIWdldFdoaXRlcGFwZXIoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0lTX0VOQUNUQUJMRToKLQkJCQlyZXR1cm4gaXNTZXRJc0VuYWN0YWJsZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXJldHVybiBWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG51bGwgOiAhVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHModmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwcmVjb25kaXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZWNvbmRpdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcG9zdGNvbmRpdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocG9zdGNvbmRpdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzRW5hY3RhYmxlOiAiKTsKLQkJaWYgKGlzRW5hY3RhYmxlRVNldCkgcmVzdWx0LmFwcGVuZChpc0VuYWN0YWJsZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhcmlhYmlsaXR5VHlwZTogIik7Ci0JCWlmICh2YXJpYWJpbGl0eVR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKHZhcmlhYmlsaXR5VHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BY3Rpdml0eUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYxN2FjMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BcnRpZmFjdERlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwjZ2V0QnJpZWZPdXRsaW5lIDxlbT5CcmllZiBPdXRsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucyA8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFydGlmYWN0RGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBBcnRpZmFjdERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnJpZWZPdXRsaW5lKCkgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJyaWVmT3V0bGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJRUZfT1VUTElORV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZk91dGxpbmUoKSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QnJpZWZPdXRsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJyaWVmT3V0bGluZSA9IEJSSUVGX09VVExJTkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQUkVTRU5UQVRJT05fT1BUSU9OU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKSA8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlcHJlc2VudGF0aW9uT3B0aW9ucyA9IFJFUFJFU0VOVEFUSU9OX09QVElPTlNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkFSVElGQUNUX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QnJpZWZPdXRsaW5lKCkgewotCQlyZXR1cm4gYnJpZWZPdXRsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJyaWVmT3V0bGluZShTdHJpbmcgbmV3QnJpZWZPdXRsaW5lKSB7Ci0JCVN0cmluZyBvbGRCcmllZk91dGxpbmUgPSBicmllZk91dGxpbmU7Ci0JCWJyaWVmT3V0bGluZSA9IG5ld0JyaWVmT3V0bGluZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORSwgb2xkQnJpZWZPdXRsaW5lLCBicmllZk91dGxpbmUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpIHsKLQkJcmV0dXJuIHJlcHJlc2VudGF0aW9uT3B0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoU3RyaW5nIG5ld1JlcHJlc2VudGF0aW9uT3B0aW9ucykgewotCQlTdHJpbmcgb2xkUmVwcmVzZW50YXRpb25PcHRpb25zID0gcmVwcmVzZW50YXRpb25PcHRpb25zOwotCQlyZXByZXNlbnRhdGlvbk9wdGlvbnMgPSBuZXdSZXByZXNlbnRhdGlvbk9wdGlvbnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlMsIG9sZFJlcHJlc2VudGF0aW9uT3B0aW9ucywgcmVwcmVzZW50YXRpb25PcHRpb25zKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FOgotCQkJCXJldHVybiBnZXRCcmllZk91dGxpbmUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJCQlzZXRCcmllZk91dGxpbmUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TOgotCQkJCXNldFJlcHJlc2VudGF0aW9uT3B0aW9ucygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FOgotCQkJCXNldEJyaWVmT3V0bGluZShCUklFRl9PVVRMSU5FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlM6Ci0JCQkJc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKFJFUFJFU0VOVEFUSU9OX09QVElPTlNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FOgotCQkJCXJldHVybiBCUklFRl9PVVRMSU5FX0VERUZBVUxUID09IG51bGwgPyBicmllZk91dGxpbmUgIT0gbnVsbCA6ICFCUklFRl9PVVRMSU5FX0VERUZBVUxULmVxdWFscyhicmllZk91dGxpbmUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TOgotCQkJCXJldHVybiBSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxUID09IG51bGwgPyByZXByZXNlbnRhdGlvbk9wdGlvbnMgIT0gbnVsbCA6ICFSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxULmVxdWFscyhyZXByZXNlbnRhdGlvbk9wdGlvbnMpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYnJpZWZPdXRsaW5lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChicmllZk91dGxpbmUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlcHJlc2VudGF0aW9uT3B0aW9uczogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVwcmVzZW50YXRpb25PcHRpb25zKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FydGlmYWN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BcnRpZmFjdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWZmN2IxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FydGlmYWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXJ0aWZhY3RJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnRpZmFjdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdEltcGwjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3RJbXBsI2dldENvbnRhaW5lZEFydGlmYWN0IDxlbT5Db250YWluZWQgQXJ0aWZhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEltcGwgZXh0ZW5kcyBXb3JrUHJvZHVjdEltcGwgaW1wbGVtZW50cyBBcnRpZmFjdCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAzKCkgPGVtPkdyb3VwMzwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXJ0aWZhY3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDMoKSB7Ci0JCWlmIChncm91cDMgPT0gbnVsbCkgewotCQkJZ3JvdXAzID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkFSVElGQUNUX19HUk9VUDMpOwotCQl9Ci0JCXJldHVybiBncm91cDM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldENvbnRhaW5lZEFydGlmYWN0KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMygpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19HUk9VUDM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1Q6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb250YWluZWRBcnRpZmFjdCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fR1JPVVAzOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMygpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAzKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUOgotCQkJCXJldHVybiBnZXRDb250YWluZWRBcnRpZmFjdCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0dST1VQMzoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAzKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1Q6Ci0JCQkJZ2V0Q29udGFpbmVkQXJ0aWZhY3QoKS5jbGVhcigpOwotCQkJCWdldENvbnRhaW5lZEFydGlmYWN0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19HUk9VUDM6Ci0JCQkJZ2V0R3JvdXAzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVDoKLQkJCQlnZXRDb250YWluZWRBcnRpZmFjdCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0dST1VQMzoKLQkJCQlyZXR1cm4gZ3JvdXAzICE9IG51bGwgJiYgIWdyb3VwMy5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVDoKLQkJCQlyZXR1cm4gIWdldENvbnRhaW5lZEFydGlmYWN0KCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BcnRpZmFjdEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZmE3NjVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwjZ2V0VXNhZ2VHdWlkYW5jZSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzYWdlR3VpZGFuY2UoKSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVzYWdlR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVTQUdFX0dVSURBTkNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzYWdlR3VpZGFuY2UoKSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVzYWdlR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXNhZ2VHdWlkYW5jZSA9IFVTQUdFX0dVSURBTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXNhZ2VHdWlkYW5jZSgpIHsKLQkJcmV0dXJuIHVzYWdlR3VpZGFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNhZ2VHdWlkYW5jZShTdHJpbmcgbmV3VXNhZ2VHdWlkYW5jZSkgewotCQlTdHJpbmcgb2xkVXNhZ2VHdWlkYW5jZSA9IHVzYWdlR3VpZGFuY2U7Ci0JCXVzYWdlR3VpZGFuY2UgPSBuZXdVc2FnZUd1aWRhbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSwgb2xkVXNhZ2VHdWlkYW5jZSwgdXNhZ2VHdWlkYW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U6Ci0JCQkJcmV0dXJuIGdldFVzYWdlR3VpZGFuY2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRToKLQkJCQlzZXRVc2FnZUd1aWRhbmNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOgotCQkJCXNldFVzYWdlR3VpZGFuY2UoVVNBR0VfR1VJREFOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRToKLQkJCQlyZXR1cm4gVVNBR0VfR1VJREFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHVzYWdlR3VpZGFuY2UgIT0gbnVsbCA6ICFVU0FHRV9HVUlEQU5DRV9FREVGQVVMVC5lcXVhbHModXNhZ2VHdWlkYW5jZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1c2FnZUd1aWRhbmNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1c2FnZUd1aWRhbmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWRmZmMyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRQcmVzZW50ZWRBZnRlciA8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFByZXNlbnRlZEJlZm9yZSA8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRQbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0U3VwZXJBY3Rpdml0eSA8ZW0+U3VwZXIgQWN0aXZpdHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjaXNJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNpc0lzUGxhbm5lZCA8ZW0+SXMgUGxhbm5lZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJyZWFrZG93bkVsZW1lbnRJbXBsIGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnRJbXBsIGltcGxlbWVudHMgQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRlZEFmdGVyKCkgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGVkQWZ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVNFTlRFRF9BRlRFUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50ZWRBZnRlcigpIDxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRlZEFmdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZXNlbnRlZEFmdGVyID0gUFJFU0VOVEVEX0FGVEVSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRlZEJlZm9yZSgpIDxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRCZWZvcmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVNFTlRFRF9CRUZPUkVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlc2VudGVkQmVmb3JlKCkgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRlZEJlZm9yZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVzZW50ZWRCZWZvcmUgPSBQUkVTRU5URURfQkVGT1JFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBsYW5uaW5nRGF0YSgpIDxlbT5QbGFubmluZyBEYXRhPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQU5OSU5HX0RBVEFfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGxhbm5pbmdEYXRhKCkgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwbGFubmluZ0RhdGEgPSBQTEFOTklOR19EQVRBX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1cGVyQWN0aXZpdHkoKSA8ZW0+U3VwZXIgQWN0aXZpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1cGVyQWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUEVSX0FDVElWSVRZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1cGVyQWN0aXZpdHkoKSA8ZW0+U3VwZXIgQWN0aXZpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1cGVyQWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc3VwZXJBY3Rpdml0eSA9IFNVUEVSX0FDVElWSVRZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEhBU19NVUxUSVBMRV9PQ0NVUlJFTkNFU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzID0gSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBIYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc011bHRpcGxlT2NjdXJyZW5jZXNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc09wdGlvbmFsKCkgPGVtPklzIE9wdGlvbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzT3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19PUFRJT05BTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc09wdGlvbmFsKCkgPGVtPklzIE9wdGlvbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzT3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzT3B0aW9uYWwgPSBJU19PUFRJT05BTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgT3B0aW9uYWwgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzT3B0aW9uYWxFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1BsYW5uZWQoKSA8ZW0+SXMgUGxhbm5lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1BsYW5uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19QTEFOTkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzUGxhbm5lZCgpIDxlbT5JcyBQbGFubmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzUGxhbm5lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQbGFubmVkID0gSVNfUExBTk5FRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgUGxhbm5lZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQbGFubmVkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWZpeCgpIDxlbT5QcmVmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWZpeCgpIDxlbT5QcmVmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVmaXggPSBQUkVGSVhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlc2VudGVkQWZ0ZXIoKSB7Ci0JCXJldHVybiBwcmVzZW50ZWRBZnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50ZWRBZnRlcihTdHJpbmcgbmV3UHJlc2VudGVkQWZ0ZXIpIHsKLQkJU3RyaW5nIG9sZFByZXNlbnRlZEFmdGVyID0gcHJlc2VudGVkQWZ0ZXI7Ci0JCXByZXNlbnRlZEFmdGVyID0gbmV3UHJlc2VudGVkQWZ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUiwgb2xkUHJlc2VudGVkQWZ0ZXIsIHByZXNlbnRlZEFmdGVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVzZW50ZWRCZWZvcmUoKSB7Ci0JCXJldHVybiBwcmVzZW50ZWRCZWZvcmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlc2VudGVkQmVmb3JlKFN0cmluZyBuZXdQcmVzZW50ZWRCZWZvcmUpIHsKLQkJU3RyaW5nIG9sZFByZXNlbnRlZEJlZm9yZSA9IHByZXNlbnRlZEJlZm9yZTsKLQkJcHJlc2VudGVkQmVmb3JlID0gbmV3UHJlc2VudGVkQmVmb3JlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFLCBvbGRQcmVzZW50ZWRCZWZvcmUsIHByZXNlbnRlZEJlZm9yZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGxhbm5pbmdEYXRhKCkgewotCQlyZXR1cm4gcGxhbm5pbmdEYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBsYW5uaW5nRGF0YShTdHJpbmcgbmV3UGxhbm5pbmdEYXRhKSB7Ci0JCVN0cmluZyBvbGRQbGFubmluZ0RhdGEgPSBwbGFubmluZ0RhdGE7Ci0JCXBsYW5uaW5nRGF0YSA9IG5ld1BsYW5uaW5nRGF0YTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSwgb2xkUGxhbm5pbmdEYXRhLCBwbGFubmluZ0RhdGEpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN1cGVyQWN0aXZpdHkoKSB7Ci0JCXJldHVybiBzdXBlckFjdGl2aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cGVyQWN0aXZpdHkoU3RyaW5nIG5ld1N1cGVyQWN0aXZpdHkpIHsKLQkJU3RyaW5nIG9sZFN1cGVyQWN0aXZpdHkgPSBzdXBlckFjdGl2aXR5OwotCQlzdXBlckFjdGl2aXR5ID0gbmV3U3VwZXJBY3Rpdml0eTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFksIG9sZFN1cGVyQWN0aXZpdHksIHN1cGVyQWN0aXZpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSB7Ci0JCXJldHVybiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoYm9vbGVhbiBuZXdIYXNNdWx0aXBsZU9jY3VycmVuY2VzKSB7Ci0JCWJvb2xlYW4gb2xkSGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA9IGhhc011bHRpcGxlT2NjdXJyZW5jZXM7Ci0JCWhhc011bHRpcGxlT2NjdXJyZW5jZXMgPSBuZXdIYXNNdWx0aXBsZU9jY3VycmVuY2VzOwotCQlib29sZWFuIG9sZEhhc011bHRpcGxlT2NjdXJyZW5jZXNFU2V0ID0gaGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQ7Ci0JCWhhc011bHRpcGxlT2NjdXJyZW5jZXNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLCBvbGRIYXNNdWx0aXBsZU9jY3VycmVuY2VzLCBoYXNNdWx0aXBsZU9jY3VycmVuY2VzLCAhb2xkSGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKSB7Ci0JCWJvb2xlYW4gb2xkSGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA9IGhhc011bHRpcGxlT2NjdXJyZW5jZXM7Ci0JCWJvb2xlYW4gb2xkSGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQgPSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzRVNldDsKLQkJaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA9IEhBU19NVUxUSVBMRV9PQ0NVUlJFTkNFU19FREVGQVVMVDsKLQkJaGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMsIG9sZEhhc011bHRpcGxlT2NjdXJyZW5jZXMsIEhBU19NVUxUSVBMRV9PQ0NVUlJFTkNFU19FREVGQVVMVCwgb2xkSGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKSB7Ci0JCXJldHVybiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzT3B0aW9uYWwoKSB7Ci0JCXJldHVybiBpc09wdGlvbmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzT3B0aW9uYWwoYm9vbGVhbiBuZXdJc09wdGlvbmFsKSB7Ci0JCWJvb2xlYW4gb2xkSXNPcHRpb25hbCA9IGlzT3B0aW9uYWw7Ci0JCWlzT3B0aW9uYWwgPSBuZXdJc09wdGlvbmFsOwotCQlib29sZWFuIG9sZElzT3B0aW9uYWxFU2V0ID0gaXNPcHRpb25hbEVTZXQ7Ci0JCWlzT3B0aW9uYWxFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwsIG9sZElzT3B0aW9uYWwsIGlzT3B0aW9uYWwsICFvbGRJc09wdGlvbmFsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNPcHRpb25hbCgpIHsKLQkJYm9vbGVhbiBvbGRJc09wdGlvbmFsID0gaXNPcHRpb25hbDsKLQkJYm9vbGVhbiBvbGRJc09wdGlvbmFsRVNldCA9IGlzT3B0aW9uYWxFU2V0OwotCQlpc09wdGlvbmFsID0gSVNfT1BUSU9OQUxfRURFRkFVTFQ7Ci0JCWlzT3B0aW9uYWxFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwsIG9sZElzT3B0aW9uYWwsIElTX09QVElPTkFMX0VERUZBVUxULCBvbGRJc09wdGlvbmFsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNPcHRpb25hbCgpIHsKLQkJcmV0dXJuIGlzT3B0aW9uYWxFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNQbGFubmVkKCkgewotCQlyZXR1cm4gaXNQbGFubmVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzUGxhbm5lZChib29sZWFuIG5ld0lzUGxhbm5lZCkgewotCQlib29sZWFuIG9sZElzUGxhbm5lZCA9IGlzUGxhbm5lZDsKLQkJaXNQbGFubmVkID0gbmV3SXNQbGFubmVkOwotCQlib29sZWFuIG9sZElzUGxhbm5lZEVTZXQgPSBpc1BsYW5uZWRFU2V0OwotCQlpc1BsYW5uZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCwgb2xkSXNQbGFubmVkLCBpc1BsYW5uZWQsICFvbGRJc1BsYW5uZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc1BsYW5uZWQoKSB7Ci0JCWJvb2xlYW4gb2xkSXNQbGFubmVkID0gaXNQbGFubmVkOwotCQlib29sZWFuIG9sZElzUGxhbm5lZEVTZXQgPSBpc1BsYW5uZWRFU2V0OwotCQlpc1BsYW5uZWQgPSBJU19QTEFOTkVEX0VERUZBVUxUOwotCQlpc1BsYW5uZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCwgb2xkSXNQbGFubmVkLCBJU19QTEFOTkVEX0VERUZBVUxULCBvbGRJc1BsYW5uZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc1BsYW5uZWQoKSB7Ci0JCXJldHVybiBpc1BsYW5uZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlyZXR1cm4gcHJlZml4OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgbmV3UHJlZml4KSB7Ci0JCVN0cmluZyBvbGRQcmVmaXggPSBwcmVmaXg7Ci0JCXByZWZpeCA9IG5ld1ByZWZpeDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYLCBvbGRQcmVmaXgsIHByZWZpeCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOgotCQkJCXJldHVybiBnZXRQcmVzZW50ZWRBZnRlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOgotCQkJCXJldHVybiBnZXRQcmVzZW50ZWRCZWZvcmUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQToKLQkJCQlyZXR1cm4gZ2V0UGxhbm5pbmdEYXRhKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOgotCQkJCXJldHVybiBnZXRTdXBlckFjdGl2aXR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzoKLQkJCQlyZXR1cm4gaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDoKLQkJCQlyZXR1cm4gaXNJc09wdGlvbmFsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOgotCQkJCXJldHVybiBpc0lzUGxhbm5lZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOgotCQkJCXJldHVybiBnZXRQcmVmaXgoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI6Ci0JCQkJc2V0UHJlc2VudGVkQWZ0ZXIoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOgotCQkJCXNldFByZXNlbnRlZEJlZm9yZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE6Ci0JCQkJc2V0UGxhbm5pbmdEYXRhKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFk6Ci0JCQkJc2V0U3VwZXJBY3Rpdml0eSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzoKLQkJCQlzZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw6Ci0JCQkJc2V0SXNPcHRpb25hbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ6Ci0JCQkJc2V0SXNQbGFubmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOgotCQkJCXNldFByZWZpeCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI6Ci0JCQkJc2V0UHJlc2VudGVkQWZ0ZXIoUFJFU0VOVEVEX0FGVEVSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU6Ci0JCQkJc2V0UHJlc2VudGVkQmVmb3JlKFBSRVNFTlRFRF9CRUZPUkVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQToKLQkJCQlzZXRQbGFubmluZ0RhdGEoUExBTk5JTkdfREFUQV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWToKLQkJCQlzZXRTdXBlckFjdGl2aXR5KFNVUEVSX0FDVElWSVRZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzoKLQkJCQl1bnNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOgotCQkJCXVuc2V0SXNPcHRpb25hbCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDoKLQkJCQl1bnNldElzUGxhbm5lZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOgotCQkJCXNldFByZWZpeChQUkVGSVhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI6Ci0JCQkJcmV0dXJuIFBSRVNFTlRFRF9BRlRFUl9FREVGQVVMVCA9PSBudWxsID8gcHJlc2VudGVkQWZ0ZXIgIT0gbnVsbCA6ICFQUkVTRU5URURfQUZURVJfRURFRkFVTFQuZXF1YWxzKHByZXNlbnRlZEFmdGVyKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRToKLQkJCQlyZXR1cm4gUFJFU0VOVEVEX0JFRk9SRV9FREVGQVVMVCA9PSBudWxsID8gcHJlc2VudGVkQmVmb3JlICE9IG51bGwgOiAhUFJFU0VOVEVEX0JFRk9SRV9FREVGQVVMVC5lcXVhbHMocHJlc2VudGVkQmVmb3JlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQToKLQkJCQlyZXR1cm4gUExBTk5JTkdfREFUQV9FREVGQVVMVCA9PSBudWxsID8gcGxhbm5pbmdEYXRhICE9IG51bGwgOiAhUExBTk5JTkdfREFUQV9FREVGQVVMVC5lcXVhbHMocGxhbm5pbmdEYXRhKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFk6Ci0JCQkJcmV0dXJuIFNVUEVSX0FDVElWSVRZX0VERUZBVUxUID09IG51bGwgPyBzdXBlckFjdGl2aXR5ICE9IG51bGwgOiAhU1VQRVJfQUNUSVZJVFlfRURFRkFVTFQuZXF1YWxzKHN1cGVyQWN0aXZpdHkpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM6Ci0JCQkJcmV0dXJuIGlzU2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDoKLQkJCQlyZXR1cm4gaXNTZXRJc09wdGlvbmFsKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ6Ci0JCQkJcmV0dXJuIGlzU2V0SXNQbGFubmVkKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDoKLQkJCQlyZXR1cm4gUFJFRklYX0VERUZBVUxUID09IG51bGwgPyBwcmVmaXggIT0gbnVsbCA6ICFQUkVGSVhfRURFRkFVTFQuZXF1YWxzKHByZWZpeCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwcmVzZW50ZWRBZnRlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlc2VudGVkQWZ0ZXIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByZXNlbnRlZEJlZm9yZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlc2VudGVkQmVmb3JlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwbGFubmluZ0RhdGE6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBsYW5uaW5nRGF0YSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3VwZXJBY3Rpdml0eTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3VwZXJBY3Rpdml0eSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaGFzTXVsdGlwbGVPY2N1cnJlbmNlczogIik7Ci0JCWlmIChoYXNNdWx0aXBsZU9jY3VycmVuY2VzRVNldCkgcmVzdWx0LmFwcGVuZChoYXNNdWx0aXBsZU9jY3VycmVuY2VzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNPcHRpb25hbDogIik7Ci0JCWlmIChpc09wdGlvbmFsRVNldCkgcmVzdWx0LmFwcGVuZChpc09wdGlvbmFsKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNQbGFubmVkOiAiKTsKLQkJaWYgKGlzUGxhbm5lZEVTZXQpIHJlc3VsdC5hcHBlbmQoaXNQbGFubmVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJlZml4OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcmVmaXgpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9CcmVha2Rvd25FbGVtZW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ2FwYWJpbGl0eVBhdHRlcm5JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NhcGFiaWxpdHlQYXR0ZXJuSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NjkxMDA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ2FwYWJpbGl0eVBhdHRlcm5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENhcGFiaWxpdHlQYXR0ZXJuSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYXBhYmlsaXR5IFBhdHRlcm48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXBhYmlsaXR5UGF0dGVybkltcGwgZXh0ZW5kcyBQcm9jZXNzSW1wbCBpbXBsZW1lbnRzIENhcGFiaWxpdHlQYXR0ZXJuIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FwYWJpbGl0eVBhdHRlcm5JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DQVBBQklMSVRZX1BBVFRFUk47Ci0JfQotCi19IC8vQ2FwYWJpbGl0eVBhdHRlcm5JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DaGVja2xpc3RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NoZWNrbGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjBiODE3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NoZWNrbGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ2hlY2tsaXN0SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tsaXN0SW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIENoZWNrbGlzdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENoZWNrbGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNIRUNLTElTVDsKLQl9Ci0KLX0gLy9DaGVja2xpc3RJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db21wb3NpdGVSb2xlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db21wb3NpdGVSb2xlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYTVhZDFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29tcG9zaXRlUm9sZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbXBvc2l0ZVJvbGVJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbXBvc2l0ZSBSb2xlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsI2dldEFnZ3JlZ2F0ZWRSb2xlIDxlbT5BZ2dyZWdhdGVkIFJvbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVSb2xlSW1wbCBleHRlbmRzIFJvbGVEZXNjcmlwdG9ySW1wbCBpbXBsZW1lbnRzIENvbXBvc2l0ZVJvbGUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMSgpIDxlbT5Hcm91cDE8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAxKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDEgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZVJvbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT01QT1NJVEVfUk9MRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDEoKSB7Ci0JCWlmIChncm91cDEgPT0gbnVsbCkgewotCQkJZ3JvdXAxID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19HUk9VUDEpOwotCQl9Ci0JCXJldHVybiBncm91cDE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEFnZ3JlZ2F0ZWRSb2xlKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMSgpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19HUk9VUDE6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDEoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEU6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBZ2dyZWdhdGVkUm9sZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fR1JPVVAxOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMSgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFOgotCQkJCXJldHVybiBnZXRBZ2dyZWdhdGVkUm9sZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0dST1VQMToKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEU6Ci0JCQkJZ2V0QWdncmVnYXRlZFJvbGUoKS5jbGVhcigpOwotCQkJCWdldEFnZ3JlZ2F0ZWRSb2xlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19HUk9VUDE6Ci0JCQkJZ2V0R3JvdXAxKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRToKLQkJCQlnZXRBZ2dyZWdhdGVkUm9sZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0dST1VQMToKLQkJCQlyZXR1cm4gZ3JvdXAxICE9IG51bGwgJiYgIWdyb3VwMS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRToKLQkJCQlyZXR1cm4gIWdldEFnZ3JlZ2F0ZWRSb2xlKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAxOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDEpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Db21wb3NpdGVSb2xlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29uY2VwdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29uY2VwdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzc3NzNhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbmNlcHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbmNlcHRJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbmNlcHRJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgQ29uY2VwdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbmNlcHRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05DRVBUOwotCX0KLQotfSAvL0NvbmNlcHRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db25zdHJhaW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db25zdHJhaW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiN2FjYTY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29uc3RyYWludEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnN0cmFpbnRJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnN0cmFpbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29uc3RyYWludEltcGwjZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludEltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzIENvbnN0cmFpbnQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYWluRGVzY3JpcHRpb24oKSA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1haW5EZXNjcmlwdGlvbigpIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFpbkRlc2NyaXB0aW9uID0gTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OU1RSQUlOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1haW5EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIG1haW5EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYWluRGVzY3JpcHRpb24oU3RyaW5nIG5ld01haW5EZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkTWFpbkRlc2NyaXB0aW9uID0gbWFpbkRlc2NyaXB0aW9uOwotCQltYWluRGVzY3JpcHRpb24gPSBuZXdNYWluRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQ09OU1RSQUlOVF9fTUFJTl9ERVNDUklQVElPTiwgb2xkTWFpbkRlc2NyaXB0aW9uLCBtYWluRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVF9fTUFJTl9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJCXNldE1haW5EZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX01BSU5fREVTQ1JJUFRJT046Ci0JCQkJc2V0TWFpbkRlc2NyaXB0aW9uKE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX01BSU5fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IG1haW5EZXNjcmlwdGlvbiAhPSBudWxsIDogIU1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKG1haW5EZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtYWluRGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1haW5EZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NvbnN0cmFpbnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50Q2F0ZWdvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRDYXRlZ29yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTE3MTQ5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRDYXRlZ29yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudENhdGVnb3J5SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBDYXRlZ29yeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRDYXRlZ29yeUltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50Q2F0ZWdvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0NBVEVHT1JZOwotCX0KLQotfSAvL0NvbnRlbnRDYXRlZ29yeUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRDYXRlZ29yeVBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRDYXRlZ29yeVBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1NzRiZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2VJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2VJbXBsI2dldENvbnRlbnRDYXRlZ29yeSA8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRDYXRlZ29yeVBhY2thZ2VJbXBsIGV4dGVuZHMgTWV0aG9kUGFja2FnZUltcGwgaW1wbGVtZW50cyBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldENvbnRlbnRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fQ09OVEVOVF9DQVRFR09SWSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0NPTlRFTlRfQ0FURUdPUlk6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb250ZW50Q2F0ZWdvcnkoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fQ09OVEVOVF9DQVRFR09SWToKLQkJCQlyZXR1cm4gZ2V0Q29udGVudENhdGVnb3J5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fQ09OVEVOVF9DQVRFR09SWToKLQkJCQlnZXRDb250ZW50Q2F0ZWdvcnkoKS5jbGVhcigpOwotCQkJCWdldENvbnRlbnRDYXRlZ29yeSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0NPTlRFTlRfQ0FURUdPUlk6Ci0JCQkJZ2V0Q29udGVudENhdGVnb3J5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19DT05URU5UX0NBVEVHT1JZOgotCQkJCXJldHVybiAhZ2V0Q29udGVudENhdGVnb3J5KCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudERlc2NyaXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50RGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMwNjYxNGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50RGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb250ZW50RGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsI2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsI2dldEtleUNvbnNpZGVyYXRpb25zIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCNnZXRTZWN0aW9uIDxlbT5TZWN0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudERlc2NyaXB0aW9uSW1wbCBleHRlbmRzIE1ldGhvZFVuaXRJbXBsIGltcGxlbWVudHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkgPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYWluRGVzY3JpcHRpb24oKSA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1haW5EZXNjcmlwdGlvbiA9IE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKSA8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRLZXlDb25zaWRlcmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtleUNvbnNpZGVyYXRpb25zKCkgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcga2V5Q29uc2lkZXJhdGlvbnMgPSBLRVlfQ09OU0lERVJBVElPTlNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN0aW9uKCkgPGVtPlNlY3Rpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNlY3Rpb24gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnREZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYWluRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBtYWluRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFpbkRlc2NyaXB0aW9uKFN0cmluZyBuZXdNYWluRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZE1haW5EZXNjcmlwdGlvbiA9IG1haW5EZXNjcmlwdGlvbjsKLQkJbWFpbkRlc2NyaXB0aW9uID0gbmV3TWFpbkRlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04sIG9sZE1haW5EZXNjcmlwdGlvbiwgbWFpbkRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRLZXlDb25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIGtleUNvbnNpZGVyYXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEtleUNvbnNpZGVyYXRpb25zKFN0cmluZyBuZXdLZXlDb25zaWRlcmF0aW9ucykgewotCQlTdHJpbmcgb2xkS2V5Q29uc2lkZXJhdGlvbnMgPSBrZXlDb25zaWRlcmF0aW9uczsKLQkJa2V5Q29uc2lkZXJhdGlvbnMgPSBuZXdLZXlDb25zaWRlcmF0aW9uczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMsIG9sZEtleUNvbnNpZGVyYXRpb25zLCBrZXlDb25zaWRlcmF0aW9ucykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRTZWN0aW9uKCkgewotCQlpZiAoc2VjdGlvbiA9PSBudWxsKSB7Ci0JCQlzZWN0aW9uID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlY3Rpb24uY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTik7Ci0JCX0KLQkJcmV0dXJuIHNlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT046Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZWN0aW9uKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldE1haW5EZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOgotCQkJCXJldHVybiBnZXRTZWN0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJCXNldE1haW5EZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOgotCQkJCXNldEtleUNvbnNpZGVyYXRpb25zKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOgotCQkJCWdldFNlY3Rpb24oKS5jbGVhcigpOwotCQkJCWdldFNlY3Rpb24oKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjoKLQkJCQlzZXRNYWluRGVzY3JpcHRpb24oTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzoKLQkJCQlzZXRLZXlDb25zaWRlcmF0aW9ucyhLRVlfQ09OU0lERVJBVElPTlNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOgotCQkJCWdldFNlY3Rpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IG1haW5EZXNjcmlwdGlvbiAhPSBudWxsIDogIU1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKG1haW5EZXNjcmlwdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOgotCQkJCXJldHVybiBLRVlfQ09OU0lERVJBVElPTlNfRURFRkFVTFQgPT0gbnVsbCA/IGtleUNvbnNpZGVyYXRpb25zICE9IG51bGwgOiAhS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxULmVxdWFscyhrZXlDb25zaWRlcmF0aW9ucyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTjoKLQkJCQlyZXR1cm4gc2VjdGlvbiAhPSBudWxsICYmICFzZWN0aW9uLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG1haW5EZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWFpbkRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBrZXlDb25zaWRlcmF0aW9uczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoa2V5Q29uc2lkZXJhdGlvbnMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Db250ZW50RGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkNDJiOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnRlbnRFbGVtZW50SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRDaGVja2xpc3QgPGVtPkNoZWNrbGlzdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0Q29uY2VwdCA8ZW0+Q29uY2VwdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0R3VpZGVsaW5lIDxlbT5HdWlkZWxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldFJldXNhYmxlQXNzZXQgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldFdoaXRlcGFwZXIgPGVtPldoaXRlcGFwZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRFbGVtZW50SW1wbCBleHRlbmRzIERlc2NyaWJhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBDb250ZW50RWxlbWVudCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAxKCkgPGVtPkdyb3VwMTwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUID0gVmFyaWFiaWxpdHlUeXBlLk5BX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFZhcmlhYmlsaXR5IFR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhcmlhYmlsaXR5VHlwZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50RWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDEoKSB7Ci0JCWlmIChncm91cDEgPT0gbnVsbCkgewotCQkJZ3JvdXAxID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1JPVVAxKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAxOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDaGVja2xpc3QoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAxKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldENvbmNlcHQoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAxKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX0NPTkNFUFQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFeGFtcGxlKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMSgpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0R3VpZGVsaW5lKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMSgpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSZXVzYWJsZUFzc2V0KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMSgpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDEoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFdoaXRlcGFwZXIoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAxKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX1dISVRFUEFQRVIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChTdHJpbmcgbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkgewotCQlTdHJpbmcgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSBuZXdWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUgbmV3VmFyaWFiaWxpdHlUeXBlKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSBvbGRWYXJpYWJpbGl0eVR5cGUgPSB2YXJpYWJpbGl0eVR5cGU7Ci0JCXZhcmlhYmlsaXR5VHlwZSA9IG5ld1ZhcmlhYmlsaXR5VHlwZSA9PSBudWxsID8gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCA6IG5ld1ZhcmlhYmlsaXR5VHlwZTsKLQkJYm9vbGVhbiBvbGRWYXJpYWJpbGl0eVR5cGVFU2V0ID0gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQkJdmFyaWFiaWxpdHlUeXBlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFLCBvbGRWYXJpYWJpbGl0eVR5cGUsIHZhcmlhYmlsaXR5VHlwZSwgIW9sZFZhcmlhYmlsaXR5VHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIG9sZFZhcmlhYmlsaXR5VHlwZSA9IHZhcmlhYmlsaXR5VHlwZTsKLQkJYm9vbGVhbiBvbGRWYXJpYWJpbGl0eVR5cGVFU2V0ID0gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQkJdmFyaWFiaWxpdHlUeXBlID0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQkJdmFyaWFiaWxpdHlUeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFLCBvbGRWYXJpYWJpbGl0eVR5cGUsIFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQsIG9sZFZhcmlhYmlsaXR5VHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1JPVVAxOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAxKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1JPVVAxOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMSgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVDoKLQkJCQlyZXR1cm4gZ2V0Q2hlY2tsaXN0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUOgotCQkJCXJldHVybiBnZXRDb25jZXB0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFOgotCQkJCXJldHVybiBnZXRFeGFtcGxlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkU6Ci0JCQkJcmV0dXJuIGdldEd1aWRlbGluZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ6Ci0JCQkJcmV0dXJuIGdldFJldXNhYmxlQXNzZXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQkJcmV0dXJuIGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUjoKLQkJCQlyZXR1cm4gZ2V0V2hpdGVwYXBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dST1VQMToKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOgotCQkJCWdldENoZWNrbGlzdCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q2hlY2tsaXN0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUOgotCQkJCWdldENvbmNlcHQoKS5jbGVhcigpOwotCQkJCWdldENvbmNlcHQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEU6Ci0JCQkJZ2V0RXhhbXBsZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RXhhbXBsZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FOgotCQkJCWdldEd1aWRlbGluZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0R3VpZGVsaW5lKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDoKLQkJCQlnZXRSZXVzYWJsZUFzc2V0KCkuY2xlYXIoKTsKLQkJCQlnZXRSZXVzYWJsZUFzc2V0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOgotCQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLmNsZWFyKCk7Ci0JCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOgotCQkJCWdldFdoaXRlcGFwZXIoKS5jbGVhcigpOwotCQkJCWdldFdoaXRlcGFwZXIoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXNldFZhcmlhYmlsaXR5VHlwZSgoVmFyaWFiaWxpdHlUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1JPVVAxOgotCQkJCWdldEdyb3VwMSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOgotCQkJCWdldENoZWNrbGlzdCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDoKLQkJCQlnZXRDb25jZXB0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFOgotCQkJCWdldEV4YW1wbGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dVSURFTElORToKLQkJCQlnZXRHdWlkZWxpbmUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOgotCQkJCWdldFJldXNhYmxlQXNzZXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOgotCQkJCWdldFdoaXRlcGFwZXIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXVuc2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJcmV0dXJuIGdyb3VwMSAhPSBudWxsICYmICFncm91cDEuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOgotCQkJCXJldHVybiAhZ2V0Q2hlY2tsaXN0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDoKLQkJCQlyZXR1cm4gIWdldENvbmNlcHQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFOgotCQkJCXJldHVybiAhZ2V0RXhhbXBsZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dVSURFTElORToKLQkJCQlyZXR1cm4gIWdldEd1aWRlbGluZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOgotCQkJCXJldHVybiAhZ2V0UmV1c2FibGVBc3NldCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQkJcmV0dXJuICFnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOgotCQkJCXJldHVybiAhZ2V0V2hpdGVwYXBlcigpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIFZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgIT0gbnVsbCA6ICFWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDE6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFyaWFiaWxpdHlUeXBlOiAiKTsKLQkJaWYgKHZhcmlhYmlsaXR5VHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodmFyaWFiaWxpdHlUeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NvbnRlbnRFbGVtZW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudFBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMTNlM2QwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb250ZW50UGFja2FnZUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsI2dldENvbnRlbnRFbGVtZW50IDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50UGFja2FnZUltcGwgZXh0ZW5kcyBNZXRob2RQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIENvbnRlbnRQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50UGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29udGVudEVsZW1lbnQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRDb250ZW50RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVDoKLQkJCQlnZXRDb250ZW50RWxlbWVudCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGVudEVsZW1lbnQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlQ6Ci0JCQkJZ2V0Q29udGVudEVsZW1lbnQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVDoKLQkJCQlyZXR1cm4gIWdldENvbnRlbnRFbGVtZW50KCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Db250ZW50UGFja2FnZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0N1c3RvbUNhdGVnb3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DdXN0b21DYXRlZ29yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmExYWYxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0N1c3RvbUNhdGVnb3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ3VzdG9tQ2F0ZWdvcnlJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DdXN0b20gQ2F0ZWdvcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkN1c3RvbUNhdGVnb3J5SW1wbCNnZXRDYXRlZ29yaXplZEVsZW1lbnQgPGVtPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsI2dldFN1YkNhdGVnb3J5IDxlbT5TdWIgQ2F0ZWdvcnk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yeUltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgQ3VzdG9tQ2F0ZWdvcnkgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDIgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEN1c3RvbUNhdGVnb3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldENhdGVnb3JpemVkRWxlbWVudCgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFN1YkNhdGVnb3J5KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUlkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRDYXRlZ29yaXplZEVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SWToKLQkJCQlyZXR1cm4gZ2V0U3ViQ2F0ZWdvcnkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UOgotCQkJCWdldENhdGVnb3JpemVkRWxlbWVudCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUlk6Ci0JCQkJZ2V0U3ViQ2F0ZWdvcnkoKS5jbGVhcigpOwotCQkJCWdldFN1YkNhdGVnb3J5KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVDoKLQkJCQlnZXRDYXRlZ29yaXplZEVsZW1lbnQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SWToKLQkJCQlnZXRTdWJDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVDoKLQkJCQlyZXR1cm4gIWdldENhdGVnb3JpemVkRWxlbWVudCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SWToKLQkJCQlyZXR1cm4gIWdldFN1YkNhdGVnb3J5KCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9DdXN0b21DYXRlZ29yeUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcxMGNjMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwjZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbiA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwjZ2V0UGFja2FnaW5nR3VpZGFuY2UgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBleHRlcm5hbERlc2NyaXB0aW9uID0gRVhURVJOQUxfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFja2FnaW5nR3VpZGFuY2UoKSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHSU5HX0dVSURBTkNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFja2FnaW5nR3VpZGFuY2UgPSBQQUNLQUdJTkdfR1VJREFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGV4dGVybmFsRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0ZXJuYWxEZXNjcmlwdGlvbihTdHJpbmcgbmV3RXh0ZXJuYWxEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRXh0ZXJuYWxEZXNjcmlwdGlvbiA9IGV4dGVybmFsRGVzY3JpcHRpb247Ci0JCWV4dGVybmFsRGVzY3JpcHRpb24gPSBuZXdFeHRlcm5hbERlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTiwgb2xkRXh0ZXJuYWxEZXNjcmlwdGlvbiwgZXh0ZXJuYWxEZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnaW5nR3VpZGFuY2UoKSB7Ci0JCXJldHVybiBwYWNrYWdpbmdHdWlkYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWNrYWdpbmdHdWlkYW5jZShTdHJpbmcgbmV3UGFja2FnaW5nR3VpZGFuY2UpIHsKLQkJU3RyaW5nIG9sZFBhY2thZ2luZ0d1aWRhbmNlID0gcGFja2FnaW5nR3VpZGFuY2U7Ci0JCXBhY2thZ2luZ0d1aWRhbmNlID0gbmV3UGFja2FnaW5nR3VpZGFuY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRSwgb2xkUGFja2FnaW5nR3VpZGFuY2UsIHBhY2thZ2luZ0d1aWRhbmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0U6Ci0JCQkJcmV0dXJuIGdldFBhY2thZ2luZ0d1aWRhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT046Ci0JCQkJc2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRToKLQkJCQlzZXRQYWNrYWdpbmdHdWlkYW5jZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTjoKLQkJCQlzZXRFeHRlcm5hbERlc2NyaXB0aW9uKEVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRToKLQkJCQlzZXRQYWNrYWdpbmdHdWlkYW5jZShQQUNLQUdJTkdfR1VJREFOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gRVhURVJOQUxfREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGV4dGVybmFsRGVzY3JpcHRpb24gIT0gbnVsbCA6ICFFWFRFUk5BTF9ERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZXh0ZXJuYWxEZXNjcmlwdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRToKLQkJCQlyZXR1cm4gUEFDS0FHSU5HX0dVSURBTkNFX0VERUZBVUxUID09IG51bGwgPyBwYWNrYWdpbmdHdWlkYW5jZSAhPSBudWxsIDogIVBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVC5lcXVhbHMocGFja2FnaW5nR3VpZGFuY2UpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZXh0ZXJuYWxEZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXh0ZXJuYWxEZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFja2FnaW5nR3VpZGFuY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhY2thZ2luZ0d1aWRhbmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJhYmxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyYWJsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDBmZTczYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJhYmxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVsaXZlcmFibGVJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyYWJsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcmFibGVJbXBsI2dldERlbGl2ZXJlZFdvcmtQcm9kdWN0IDxlbT5EZWxpdmVyZWQgV29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcmFibGVJbXBsIGV4dGVuZHMgV29ya1Byb2R1Y3RJbXBsIGltcGxlbWVudHMgRGVsaXZlcmFibGUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMygpIDxlbT5Hcm91cDM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlbGl2ZXJhYmxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUkFCTEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAzKCkgewotCQlpZiAoZ3JvdXAzID09IG51bGwpIHsKLQkJCWdyb3VwMyA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fR1JPVVAzKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZWxpdmVyZWRXb3JrUHJvZHVjdCgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDMoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0dST1VQMzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fR1JPVVAzOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMygpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAzKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVDoKLQkJCQlyZXR1cm4gZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19HUk9VUDM6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMygpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVDoKLQkJCQlnZXREZWxpdmVyZWRXb3JrUHJvZHVjdCgpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0dST1VQMzoKLQkJCQlnZXRHcm91cDMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVDoKLQkJCQlnZXREZWxpdmVyZWRXb3JrUHJvZHVjdCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0dST1VQMzoKLQkJCQlyZXR1cm4gZ3JvdXAzICE9IG51bGwgJiYgIWdyb3VwMy5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1Q6Ci0JCQkJcmV0dXJuICFnZXREZWxpdmVyZWRXb3JrUHJvZHVjdCgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGVsaXZlcmFibGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhYzA1YTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0U2NhbGUgPGVtPlNjYWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIDxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0Umlza0xldmVsIDxlbT5SaXNrIExldmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSA8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRUeXBlT2ZDb250cmFjdCA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCBleHRlbmRzIFByb2Nlc3NEZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjYWxlKCkgPGVtPlNjYWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NBTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NhbGUoKSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNjYWxlID0gU0NBTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpIDxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpIDxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzID0gUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Umlza0xldmVsKCkgPGVtPlJpc2sgTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJpc2tMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUklTS19MRVZFTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSaXNrTGV2ZWwoKSA8ZW0+UmlzayBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Umlza0xldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJpc2tMZXZlbCA9IFJJU0tfTEVWRUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVNUSU1BVElOR19URUNITklRVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlc3RpbWF0aW5nVGVjaG5pcXVlID0gRVNUSU1BVElOR19URUNITklRVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkgPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlID0gUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVPZkNvbnRyYWN0KCkgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVPZkNvbnRyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX09GX0NPTlRSQUNUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVPZkNvbnRyYWN0KCkgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVPZkNvbnRyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGVPZkNvbnRyYWN0ID0gVFlQRV9PRl9DT05UUkFDVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTY2FsZSgpIHsKLQkJcmV0dXJuIHNjYWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjYWxlKFN0cmluZyBuZXdTY2FsZSkgewotCQlTdHJpbmcgb2xkU2NhbGUgPSBzY2FsZTsKLQkJc2NhbGUgPSBuZXdTY2FsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRSwgb2xkU2NhbGUsIHNjYWxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkgewotCQlyZXR1cm4gcHJvamVjdENoYXJhY3RlcmlzdGljczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKFN0cmluZyBuZXdQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKSB7Ci0JCVN0cmluZyBvbGRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzID0gcHJvamVjdENoYXJhY3RlcmlzdGljczsKLQkJcHJvamVjdENoYXJhY3RlcmlzdGljcyA9IG5ld1Byb2plY3RDaGFyYWN0ZXJpc3RpY3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1MsIG9sZFByb2plY3RDaGFyYWN0ZXJpc3RpY3MsIHByb2plY3RDaGFyYWN0ZXJpc3RpY3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJpc2tMZXZlbCgpIHsKLQkJcmV0dXJuIHJpc2tMZXZlbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSaXNrTGV2ZWwoU3RyaW5nIG5ld1Jpc2tMZXZlbCkgewotCQlTdHJpbmcgb2xkUmlza0xldmVsID0gcmlza0xldmVsOwotCQlyaXNrTGV2ZWwgPSBuZXdSaXNrTGV2ZWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTCwgb2xkUmlza0xldmVsLCByaXNrTGV2ZWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVzdGltYXRpbmdUZWNobmlxdWUoKSB7Ci0JCXJldHVybiBlc3RpbWF0aW5nVGVjaG5pcXVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVzdGltYXRpbmdUZWNobmlxdWUoU3RyaW5nIG5ld0VzdGltYXRpbmdUZWNobmlxdWUpIHsKLQkJU3RyaW5nIG9sZEVzdGltYXRpbmdUZWNobmlxdWUgPSBlc3RpbWF0aW5nVGVjaG5pcXVlOwotCQllc3RpbWF0aW5nVGVjaG5pcXVlID0gbmV3RXN0aW1hdGluZ1RlY2huaXF1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRSwgb2xkRXN0aW1hdGluZ1RlY2huaXF1ZSwgZXN0aW1hdGluZ1RlY2huaXF1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpIHsKLQkJcmV0dXJuIHByb2plY3RNZW1iZXJFeHBlcnRpc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdE1lbWJlckV4cGVydGlzZShTdHJpbmcgbmV3UHJvamVjdE1lbWJlckV4cGVydGlzZSkgewotCQlTdHJpbmcgb2xkUHJvamVjdE1lbWJlckV4cGVydGlzZSA9IHByb2plY3RNZW1iZXJFeHBlcnRpc2U7Ci0JCXByb2plY3RNZW1iZXJFeHBlcnRpc2UgPSBuZXdQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRSwgb2xkUHJvamVjdE1lbWJlckV4cGVydGlzZSwgcHJvamVjdE1lbWJlckV4cGVydGlzZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU9mQ29udHJhY3QoKSB7Ci0JCXJldHVybiB0eXBlT2ZDb250cmFjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlT2ZDb250cmFjdChTdHJpbmcgbmV3VHlwZU9mQ29udHJhY3QpIHsKLQkJU3RyaW5nIG9sZFR5cGVPZkNvbnRyYWN0ID0gdHlwZU9mQ29udHJhY3Q7Ci0JCXR5cGVPZkNvbnRyYWN0ID0gbmV3VHlwZU9mQ29udHJhY3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVCwgb2xkVHlwZU9mQ29udHJhY3QsIHR5cGVPZkNvbnRyYWN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFOgotCQkJCXJldHVybiBnZXRTY2FsZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTOgotCQkJCXJldHVybiBnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTDoKLQkJCQlyZXR1cm4gZ2V0Umlza0xldmVsKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCQkJcmV0dXJuIGdldEVzdGltYXRpbmdUZWNobmlxdWUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0U6Ci0JCQkJcmV0dXJuIGdldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUOgotCQkJCXJldHVybiBnZXRUeXBlT2ZDb250cmFjdCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEU6Ci0JCQkJc2V0U2NhbGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTOgotCQkJCXNldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUw6Ci0JCQkJc2V0Umlza0xldmVsKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRToKLQkJCQlzZXRFc3RpbWF0aW5nVGVjaG5pcXVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0U6Ci0JCQkJc2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVDoKLQkJCQlzZXRUeXBlT2ZDb250cmFjdCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFOgotCQkJCXNldFNjYWxlKFNDQUxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCQkJc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyhQUk9KRUNUX0NIQVJBQ1RFUklTVElDU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUw6Ci0JCQkJc2V0Umlza0xldmVsKFJJU0tfTEVWRUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRToKLQkJCQlzZXRFc3RpbWF0aW5nVGVjaG5pcXVlKEVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFOgotCQkJCXNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVDoKLQkJCQlzZXRUeXBlT2ZDb250cmFjdChUWVBFX09GX0NPTlRSQUNUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRToKLQkJCQlyZXR1cm4gU0NBTEVfRURFRkFVTFQgPT0gbnVsbCA/IHNjYWxlICE9IG51bGwgOiAhU0NBTEVfRURFRkFVTFQuZXF1YWxzKHNjYWxlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUzoKLQkJCQlyZXR1cm4gUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1NfRURFRkFVTFQgPT0gbnVsbCA/IHByb2plY3RDaGFyYWN0ZXJpc3RpY3MgIT0gbnVsbCA6ICFQUk9KRUNUX0NIQVJBQ1RFUklTVElDU19FREVGQVVMVC5lcXVhbHMocHJvamVjdENoYXJhY3RlcmlzdGljcyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTDoKLQkJCQlyZXR1cm4gUklTS19MRVZFTF9FREVGQVVMVCA9PSBudWxsID8gcmlza0xldmVsICE9IG51bGwgOiAhUklTS19MRVZFTF9FREVGQVVMVC5lcXVhbHMocmlza0xldmVsKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRToKLQkJCQlyZXR1cm4gRVNUSU1BVElOR19URUNITklRVUVfRURFRkFVTFQgPT0gbnVsbCA/IGVzdGltYXRpbmdUZWNobmlxdWUgIT0gbnVsbCA6ICFFU1RJTUFUSU5HX1RFQ0hOSVFVRV9FREVGQVVMVC5lcXVhbHMoZXN0aW1hdGluZ1RlY2huaXF1ZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFOgotCQkJCXJldHVybiBQUk9KRUNUX01FTUJFUl9FWFBFUlRJU0VfRURFRkFVTFQgPT0gbnVsbCA/IHByb2plY3RNZW1iZXJFeHBlcnRpc2UgIT0gbnVsbCA6ICFQUk9KRUNUX01FTUJFUl9FWFBFUlRJU0VfRURFRkFVTFQuZXF1YWxzKHByb2plY3RNZW1iZXJFeHBlcnRpc2UpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1Q6Ci0JCQkJcmV0dXJuIFRZUEVfT0ZfQ09OVFJBQ1RfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGVPZkNvbnRyYWN0ICE9IG51bGwgOiAhVFlQRV9PRl9DT05UUkFDVF9FREVGQVVMVC5lcXVhbHModHlwZU9mQ29udHJhY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc2NhbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNjYWxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByaXNrTGV2ZWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJpc2tMZXZlbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXN0aW1hdGluZ1RlY2huaXF1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXN0aW1hdGluZ1RlY2huaXF1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJvamVjdE1lbWJlckV4cGVydGlzZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJvamVjdE1lbWJlckV4cGVydGlzZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZU9mQ29udHJhY3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGVPZkNvbnRyYWN0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTgyNGY1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlbGl2ZXJ5UHJvY2Vzc0ltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbCNnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsIDxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsI2dldEVkdWNhdGlvbk1hdGVyaWFsIDxlbT5FZHVjYXRpb24gTWF0ZXJpYWw8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NJbXBsIGV4dGVuZHMgUHJvY2Vzc0ltcGwgaW1wbGVtZW50cyBEZWxpdmVyeVByb2Nlc3MgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMygpIDxlbT5Hcm91cDM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlbGl2ZXJ5UHJvY2Vzc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAzKCkgewotCQlpZiAoZ3JvdXAzID09IG51bGwpIHsKLQkJCWdyb3VwMyA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19HUk9VUDMpOwotCQl9Ci0JCXJldHVybiBncm91cDM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldENvbW11bmljYXRpb25zTWF0ZXJpYWwoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAzKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVkdWNhdGlvbk1hdGVyaWFsKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMygpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fR1JPVVAzOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0dST1VQMzoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDMoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMygpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUw6Ci0JCQkJcmV0dXJuIGdldENvbW11bmljYXRpb25zTWF0ZXJpYWwoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUw6Ci0JCQkJcmV0dXJuIGdldEVkdWNhdGlvbk1hdGVyaWFsKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19HUk9VUDM6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMygpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTDoKLQkJCQlnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsKCkuY2xlYXIoKTsKLQkJCQlnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMOgotCQkJCWdldEVkdWNhdGlvbk1hdGVyaWFsKCkuY2xlYXIoKTsKLQkJCQlnZXRFZHVjYXRpb25NYXRlcmlhbCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19HUk9VUDM6Ci0JCQkJZ2V0R3JvdXAzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUw6Ci0JCQkJZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTDoKLQkJCQlnZXRFZHVjYXRpb25NYXRlcmlhbCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fR1JPVVAzOgotCQkJCXJldHVybiBncm91cDMgIT0gbnVsbCAmJiAhZ3JvdXAzLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTDoKLQkJCQlyZXR1cm4gIWdldENvbW11bmljYXRpb25zTWF0ZXJpYWwoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMOgotCQkJCXJldHVybiAhZ2V0RWR1Y2F0aW9uTWF0ZXJpYWwoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RlbGl2ZXJ5UHJvY2Vzc0ltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rlc2NyaWJhYmxlRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVzY3JpYmFibGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2M2ZiYzdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVzY3JpYmFibGVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVzY3JpYmFibGVFbGVtZW50SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsI2dldE5vZGVpY29uIDxlbT5Ob2RlaWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsI2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwjZ2V0U2hhcGVpY29uIDxlbT5TaGFwZWljb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmliYWJsZUVsZW1lbnRJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cyBEZXNjcmliYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRhdGlvbigpIDxlbT5QcmVzZW50YXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnREZXNjcmlwdGlvbiBwcmVzZW50YXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vZGVpY29uKCkgPGVtPk5vZGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb2RlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERUlDT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm9kZWljb24oKSA8ZW0+Tm9kZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vZGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5vZGVpY29uID0gTk9ERUlDT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlc2VudGF0aW9uTmFtZSgpIDxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGF0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlc2VudGF0aW9uTmFtZSgpIDxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGF0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVzZW50YXRpb25OYW1lID0gUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2hhcGVpY29uKCkgPGVtPlNoYXBlaWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2hhcGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTSEFQRUlDT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2hhcGVpY29uKCkgPGVtPlNoYXBlaWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2hhcGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNoYXBlaWNvbiA9IFNIQVBFSUNPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmliYWJsZUVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50RGVzY3JpcHRpb24gZ2V0UHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gcHJlc2VudGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb24gbmV3UHJlc2VudGF0aW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnRlbnREZXNjcmlwdGlvbiBvbGRQcmVzZW50YXRpb24gPSBwcmVzZW50YXRpb247Ci0JCXByZXNlbnRhdGlvbiA9IG5ld1ByZXNlbnRhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sIG9sZFByZXNlbnRhdGlvbiwgbmV3UHJlc2VudGF0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50YXRpb24oQ29udGVudERlc2NyaXB0aW9uIG5ld1ByZXNlbnRhdGlvbikgewotCQlpZiAobmV3UHJlc2VudGF0aW9uICE9IHByZXNlbnRhdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlc2VudGF0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXByZXNlbnRhdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcmVzZW50YXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UHJlc2VudGF0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJlc2VudGF0aW9uKG5ld1ByZXNlbnRhdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwgbmV3UHJlc2VudGF0aW9uLCBuZXdQcmVzZW50YXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVpY29uKCkgewotCQlyZXR1cm4gbm9kZWljb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9kZWljb24oU3RyaW5nIG5ld05vZGVpY29uKSB7Ci0JCVN0cmluZyBvbGROb2RlaWNvbiA9IG5vZGVpY29uOwotCQlub2RlaWNvbiA9IG5ld05vZGVpY29uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OLCBvbGROb2RlaWNvbiwgbm9kZWljb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZXNlbnRhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBwcmVzZW50YXRpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlbnRhdGlvbk5hbWUoU3RyaW5nIG5ld1ByZXNlbnRhdGlvbk5hbWUpIHsKLQkJU3RyaW5nIG9sZFByZXNlbnRhdGlvbk5hbWUgPSBwcmVzZW50YXRpb25OYW1lOwotCQlwcmVzZW50YXRpb25OYW1lID0gbmV3UHJlc2VudGF0aW9uTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSwgb2xkUHJlc2VudGF0aW9uTmFtZSwgcHJlc2VudGF0aW9uTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2hhcGVpY29uKCkgewotCQlyZXR1cm4gc2hhcGVpY29uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNoYXBlaWNvbihTdHJpbmcgbmV3U2hhcGVpY29uKSB7Ci0JCVN0cmluZyBvbGRTaGFwZWljb24gPSBzaGFwZWljb247Ci0JCXNoYXBlaWNvbiA9IG5ld1NoYXBlaWNvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT04sIG9sZFNoYXBlaWNvbiwgc2hhcGVpY29uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQcmVzZW50YXRpb24obnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQkJcmV0dXJuIGdldFByZXNlbnRhdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJCXJldHVybiBnZXROb2RlaWNvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJCXJldHVybiBnZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOgotCQkJCXJldHVybiBnZXRTaGFwZWljb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCQlzZXRQcmVzZW50YXRpb24oKENvbnRlbnREZXNjcmlwdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJCXNldE5vZGVpY29uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCQlzZXRQcmVzZW50YXRpb25OYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT046Ci0JCQkJc2V0U2hhcGVpY29uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOgotCQkJCXNldFByZXNlbnRhdGlvbigoQ29udGVudERlc2NyaXB0aW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjoKLQkJCQlzZXROb2RlaWNvbihOT0RFSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJCXNldFByZXNlbnRhdGlvbk5hbWUoUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT046Ci0JCQkJc2V0U2hhcGVpY29uKFNIQVBFSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOgotCQkJCXJldHVybiBwcmVzZW50YXRpb24gIT0gbnVsbDsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjoKLQkJCQlyZXR1cm4gTk9ERUlDT05fRURFRkFVTFQgPT0gbnVsbCA/IG5vZGVpY29uICE9IG51bGwgOiAhTk9ERUlDT05fRURFRkFVTFQuZXF1YWxzKG5vZGVpY29uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCQlyZXR1cm4gUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHByZXNlbnRhdGlvbk5hbWUgIT0gbnVsbCA6ICFQUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVC5lcXVhbHMocHJlc2VudGF0aW9uTmFtZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOgotCQkJCXJldHVybiBTSEFQRUlDT05fRURFRkFVTFQgPT0gbnVsbCA/IHNoYXBlaWNvbiAhPSBudWxsIDogIVNIQVBFSUNPTl9FREVGQVVMVC5lcXVhbHMoc2hhcGVpY29uKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5vZGVpY29uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChub2RlaWNvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJlc2VudGF0aW9uTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlc2VudGF0aW9uTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2hhcGVpY29uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzaGFwZWljb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZXNjcmliYWJsZUVsZW1lbnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTNjODVlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwjZ2V0UmVmaW5lZERlc2NyaXB0aW9uIDxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBEZXNjcmlwdG9yRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZpbmVkRGVzY3JpcHRpb24oKSA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZJTkVEX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZmluZWREZXNjcmlwdGlvbigpIDxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWZpbmVkRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVmaW5lZERlc2NyaXB0aW9uID0gUkVGSU5FRF9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklQVE9SX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gcmVmaW5lZERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZmluZWREZXNjcmlwdGlvbihTdHJpbmcgbmV3UmVmaW5lZERlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRSZWZpbmVkRGVzY3JpcHRpb24gPSByZWZpbmVkRGVzY3JpcHRpb247Ci0JCXJlZmluZWREZXNjcmlwdGlvbiA9IG5ld1JlZmluZWREZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OLCBvbGRSZWZpbmVkRGVzY3JpcHRpb24sIHJlZmluZWREZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXRSZWZpbmVkRGVzY3JpcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT046Ci0JCQkJc2V0UmVmaW5lZERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTjoKLQkJCQlzZXRSZWZpbmVkRGVzY3JpcHRpb24oUkVGSU5FRF9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gUkVGSU5FRF9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gcmVmaW5lZERlc2NyaXB0aW9uICE9IG51bGwgOiAhUkVGSU5FRF9ERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMocmVmaW5lZERlc2NyaXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJlZmluZWREZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVmaW5lZERlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVzY3JpcHRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjgxMTRmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZXNjcmlwdG9ySW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JJbXBsI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9ySW1wbCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJbXBsIGltcGxlbWVudHMgRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgU3luY2hyb25pemVkIFdpdGggU291cmNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSVBUT1I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSB7Ci0JCXJldHVybiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKGJvb2xlYW4gbmV3SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKSB7Ci0JCWJvb2xlYW4gb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCQlpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBuZXdJc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JCWJvb2xlYW4gb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCA9IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQ7Ci0JCWlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSwgb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlLCBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UsICFvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSB7Ci0JCWJvb2xlYW4gb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCQlib29sZWFuIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQgPSBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0OwotCQlpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQ7Ci0JCWlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSwgb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlLCBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQsIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIHsKLQkJcmV0dXJuIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCQlyZXR1cm4gaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJCXVuc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJCXJldHVybiBpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOiAiKTsKLQkJaWYgKGlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQpIHJlc3VsdC5hcHBlbmQoaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Rlc2NyaXB0b3JJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EaXNjaXBsaW5lR3JvdXBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rpc2NpcGxpbmVHcm91cGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzkyNzk1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rpc2NpcGxpbmVHcm91cGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERpc2NpcGxpbmVHcm91cGluZ0ltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNjaXBsaW5lIEdyb3VwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRpc2NpcGxpbmVHcm91cGluZ0ltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbCNnZXREaXNjaXBsaW5lIDxlbT5EaXNjaXBsaW5lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUdyb3VwaW5nSW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cyBEaXNjaXBsaW5lR3JvdXBpbmcgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDIgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpc2NpcGxpbmVHcm91cGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfR1JPVVBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERpc2NpcGxpbmUoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORToKLQkJCQlyZXR1cm4gZ2V0RGlzY2lwbGluZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORToKLQkJCQlnZXREaXNjaXBsaW5lKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNjaXBsaW5lKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FOgotCQkJCWdldERpc2NpcGxpbmUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORToKLQkJCQlyZXR1cm4gIWdldERpc2NpcGxpbmUoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Rpc2NpcGxpbmVHcm91cGluZ0ltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rpc2NpcGxpbmVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rpc2NpcGxpbmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI3MzZhNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EaXNjaXBsaW5lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGlzY2lwbGluZUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzY2lwbGluZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbCNnZXRUYXNrIDxlbT5UYXNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsI2dldFN1YkRpc2NpcGxpbmUgPGVtPlN1YiBEaXNjaXBsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsI2dldFJlZmVyZW5jZVdvcmtmbG93IDxlbT5SZWZlcmVuY2UgV29ya2Zsb3c8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lSW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cyBEaXNjaXBsaW5lIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXNjaXBsaW5lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VGFzaygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfX1RBU0spOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRTdWJEaXNjaXBsaW5lKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9fU1VCX0RJU0NJUExJTkUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSZWZlcmVuY2VXb3JrZmxvdygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPVyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCX0RJU0NJUExJTkU6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTdWJEaXNjaXBsaW5lKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fVEFTSzoKLQkJCQlyZXR1cm4gZ2V0VGFzaygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQl9ESVNDSVBMSU5FOgotCQkJCXJldHVybiBnZXRTdWJEaXNjaXBsaW5lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XOgotCQkJCXJldHVybiBnZXRSZWZlcmVuY2VXb3JrZmxvdygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fVEFTSzoKLQkJCQlnZXRUYXNrKCkuY2xlYXIoKTsKLQkJCQlnZXRUYXNrKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCX0RJU0NJUExJTkU6Ci0JCQkJZ2V0U3ViRGlzY2lwbGluZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0U3ViRGlzY2lwbGluZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPVzoKLQkJCQlnZXRSZWZlcmVuY2VXb3JrZmxvdygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVmZXJlbmNlV29ya2Zsb3coKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0s6Ci0JCQkJZ2V0VGFzaygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQl9ESVNDSVBMSU5FOgotCQkJCWdldFN1YkRpc2NpcGxpbmUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1c6Ci0JCQkJZ2V0UmVmZXJlbmNlV29ya2Zsb3coKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fVEFTSzoKLQkJCQlyZXR1cm4gIWdldFRhc2soKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCX0RJU0NJUExJTkU6Ci0JCQkJcmV0dXJuICFnZXRTdWJEaXNjaXBsaW5lKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPVzoKLQkJCQlyZXR1cm4gIWdldFJlZmVyZW5jZVdvcmtmbG93KCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EaXNjaXBsaW5lSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRG9jdW1lbnRSb290SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Eb2N1bWVudFJvb3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1N2YwN2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Eb2N1bWVudFJvb3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEb2N1bWVudFJvb3RJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uaW1wbC5FRGF0YU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvY3VtZW50IFJvb3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRYTUxOU1ByZWZpeE1hcCA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb2N1bWVudFJvb3RJbXBsI2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbiA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRNZXRob2RMaWJyYXJ5IDxlbT5NZXRob2QgTGlicmFyeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb2N1bWVudFJvb3RJbXBsI2dldE1ldGhvZFBsdWdpbiA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50Um9vdEltcGwgZXh0ZW5kcyBFRGF0YU9iamVjdEltcGwgaW1wbGVtZW50cyBEb2N1bWVudFJvb3QgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1peGVkKCkgPGVtPk1peGVkPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1peGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBtaXhlZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYTUxOU1ByZWZpeE1hcCgpIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRYTUxOU1ByZWZpeE1hcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVNYXAgeE1MTlNQcmVmaXhNYXAgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fScgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTWFwIHhTSVNjaGVtYUxvY2F0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudFJvb3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ET0NVTUVOVF9ST09UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldE1peGVkKCkgewotCQlpZiAobWl4ZWQgPT0gbnVsbCkgewotCQkJbWl4ZWQgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQpOwotCQl9Ci0JCXJldHVybiBtaXhlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU1hcCBnZXRYTUxOU1ByZWZpeE1hcCgpIHsKLQkJaWYgKHhNTE5TUHJlZml4TWFwID09IG51bGwpIHsKLQkJCXhNTE5TUHJlZml4TWFwID0gbmV3IEVjb3JlRU1hcChFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRVNUUklOR19UT19TVFJJTkdfTUFQX0VOVFJZLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUCk7Ci0JCX0KLQkJcmV0dXJuIHhNTE5TUHJlZml4TWFwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTWFwIGdldFhTSVNjaGVtYUxvY2F0aW9uKCkgewotCQlpZiAoeFNJU2NoZW1hTG9jYXRpb24gPT0gbnVsbCkgewotCQkJeFNJU2NoZW1hTG9jYXRpb24gPSBuZXcgRWNvcmVFTWFwKEVjb3JlUGFja2FnZS5MaXRlcmFscy5FU1RSSU5HX1RPX1NUUklOR19NQVBfRU5UUlksIEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbC5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OKTsKLQkJfQotCQlyZXR1cm4geFNJU2NoZW1hTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIChNZXRob2RDb25maWd1cmF0aW9uKWdldE1peGVkKCkuZ2V0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT04sIHRydWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBuZXdNZXRob2RDb25maWd1cmF0aW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuYmFzaWNBZGQoVW1hUGFja2FnZS5MaXRlcmFscy5ET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTiwgbmV3TWV0aG9kQ29uZmlndXJhdGlvbiwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIG5ld01ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9DT05GSUdVUkFUSU9OLCBuZXdNZXRob2RDb25maWd1cmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRNZXRob2RMaWJyYXJ5KCkgewotCQlyZXR1cm4gKE1ldGhvZExpYnJhcnkpZ2V0TWl4ZWQoKS5nZXQoVW1hUGFja2FnZS5MaXRlcmFscy5ET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IG5ld01ldGhvZExpYnJhcnksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9MSUJSQVJZLCBuZXdNZXRob2RMaWJyYXJ5LCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbmV3TWV0aG9kTGlicmFyeSkgewotCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuc2V0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlksIG5ld01ldGhvZExpYnJhcnkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW4gZ2V0TWV0aG9kUGx1Z2luKCkgewotCQlyZXR1cm4gKE1ldGhvZFBsdWdpbilnZXRNaXhlZCgpLmdldChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU4sIHRydWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE1ldGhvZFBsdWdpbihNZXRob2RQbHVnaW4gbmV3TWV0aG9kUGx1Z2luLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuYmFzaWNBZGQoVW1hUGFja2FnZS5MaXRlcmFscy5ET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOLCBuZXdNZXRob2RQbHVnaW4sIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZFBsdWdpbihNZXRob2RQbHVnaW4gbmV3TWV0aG9kUGx1Z2luKSB7Ci0JCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQoVW1hUGFja2FnZS5MaXRlcmFscy5ET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOLCBuZXdNZXRob2RQbHVnaW4pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1peGVkKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0WE1MTlNQcmVmaXhNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRYU0lTY2hlbWFMb2NhdGlvbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT046Ci0JCQkJcmV0dXJuIGJhc2ljU2V0TWV0aG9kQ29uZmlndXJhdGlvbihudWxsLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRNZXRob2RMaWJyYXJ5KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU46Ci0JCQkJcmV0dXJuIGJhc2ljU2V0TWV0aG9kUGx1Z2luKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0TWl4ZWQoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldFhNTE5TUHJlZml4TWFwKCk7Ci0JCQkJZWxzZSByZXR1cm4gZ2V0WE1MTlNQcmVmaXhNYXAoKS5tYXAoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldFhTSVNjaGVtYUxvY2F0aW9uKCk7Ci0JCQkJZWxzZSByZXR1cm4gZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5tYXAoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTjoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9MSUJSQVJZOgotCQkJCXJldHVybiBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX1BMVUdJTjoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGx1Z2luKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQkoKEVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nKWdldFhNTE5TUHJlZml4TWFwKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJKChFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZylnZXRYU0lTY2hlbWFMb2NhdGlvbigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTjoKLQkJCQlzZXRNZXRob2RDb25maWd1cmF0aW9uKChNZXRob2RDb25maWd1cmF0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlk6Ci0JCQkJc2V0TWV0aG9kTGlicmFyeSgoTWV0aG9kTGlicmFyeSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU46Ci0JCQkJc2V0TWV0aG9kUGx1Z2luKChNZXRob2RQbHVnaW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJZ2V0TWl4ZWQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCWdldFhNTE5TUHJlZml4TWFwKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlnZXRYU0lTY2hlbWFMb2NhdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJCXNldE1ldGhvZENvbmZpZ3VyYXRpb24oKE1ldGhvZENvbmZpZ3VyYXRpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9MSUJSQVJZOgotCQkJCXNldE1ldGhvZExpYnJhcnkoKE1ldGhvZExpYnJhcnkpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU46Ci0JCQkJc2V0TWV0aG9kUGx1Z2luKChNZXRob2RQbHVnaW4pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJcmV0dXJuIG1peGVkICE9IG51bGwgJiYgIW1peGVkLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCXJldHVybiB4TUxOU1ByZWZpeE1hcCAhPSBudWxsICYmICF4TUxOU1ByZWZpeE1hcC5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlyZXR1cm4geFNJU2NoZW1hTG9jYXRpb24gIT0gbnVsbCAmJiAheFNJU2NoZW1hTG9jYXRpb24uaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJCXJldHVybiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkgIT0gbnVsbDsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWToKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kTGlicmFyeSgpICE9IG51bGw7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX1BMVUdJTjoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGx1Z2luKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG1peGVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtaXhlZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RvY3VtZW50Um9vdEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RvbWFpbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRG9tYWluSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NmQxOGFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRG9tYWluSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRG9tYWluSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvbWFpbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb21haW5JbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvbWFpbkltcGwjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb21haW5JbXBsI2dldFN1YmRvbWFpbiA8ZW0+U3ViZG9tYWluPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluSW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cyBEb21haW4gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDIgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERvbWFpbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRPTUFJTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkRPTUFJTl9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRXb3JrUHJvZHVjdCgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPTUFJTl9fV09SS19QUk9EVUNUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U3ViZG9tYWluKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9NQUlOX19TVUJET01BSU4pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU46Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTdWJkb21haW4oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fV09SS19QUk9EVUNUOgotCQkJCXJldHVybiBnZXRXb3JrUHJvZHVjdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOOgotCQkJCXJldHVybiBnZXRTdWJkb21haW4oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19XT1JLX1BST0RVQ1Q6Ci0JCQkJZ2V0V29ya1Byb2R1Y3QoKS5jbGVhcigpOwotCQkJCWdldFdvcmtQcm9kdWN0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU46Ci0JCQkJZ2V0U3ViZG9tYWluKCkuY2xlYXIoKTsKLQkJCQlnZXRTdWJkb21haW4oKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19XT1JLX1BST0RVQ1Q6Ci0JCQkJZ2V0V29ya1Byb2R1Y3QoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTjoKLQkJCQlnZXRTdWJkb21haW4oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVDoKLQkJCQlyZXR1cm4gIWdldFdvcmtQcm9kdWN0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOOgotCQkJCXJldHVybiAhZ2V0U3ViZG9tYWluKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Eb21haW5JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9FbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZTc5NTdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRWxlbWVudEltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmltcGwuRURhdGFPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50SW1wbCBleHRlbmRzIEVEYXRhT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRUxFTUVOVDsKLQl9Ci0KLX0gLy9FbGVtZW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRXN0aW1hdGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VzdGltYXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOGQ1MmJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRXN0aW1hdGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFc3RpbWF0ZUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVzdGltYXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRlSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0ZUltcGwjZ2V0RXN0aW1hdGlvbk1ldHJpYyA8ZW0+RXN0aW1hdGlvbiBNZXRyaWM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGVJbXBsI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVzdGltYXRlSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIEVzdGltYXRlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFc3RpbWF0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVTVElNQVRFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXN0aW1hdGlvbk1ldHJpYygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkVTVElNQVRFX19FU1RJTUFUSU9OX01FVFJJQyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkVTVElNQVRFX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fRVNUSU1BVElPTl9NRVRSSUM6Ci0JCQkJcmV0dXJuIGdldEVzdGltYXRpb25NZXRyaWMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0VTVElNQVRJT05fTUVUUklDOgotCQkJCWdldEVzdGltYXRpb25NZXRyaWMoKS5jbGVhcigpOwotCQkJCWdldEVzdGltYXRpb25NZXRyaWMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFX19FU1RJTUFUSU9OX01FVFJJQzoKLQkJCQlnZXRFc3RpbWF0aW9uTWV0cmljKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fRVNUSU1BVElPTl9NRVRSSUM6Ci0JCQkJcmV0dXJuICFnZXRFc3RpbWF0aW9uTWV0cmljKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCXJldHVybiAhZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Fc3RpbWF0ZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VzdGltYXRpbmdNZXRyaWNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VzdGltYXRpbmdNZXRyaWNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIwMjUxOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Fc3RpbWF0aW5nTWV0cmljSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFc3RpbWF0aW5nTWV0cmljSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpbmdNZXRyaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVzdGltYXRpbmcgTWV0cmljPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXN0aW1hdGluZ01ldHJpY0ltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBFc3RpbWF0aW5nTWV0cmljIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXN0aW1hdGluZ01ldHJpY0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVTVElNQVRJTkdfTUVUUklDOwotCX0KLQotfSAvL0VzdGltYXRpbmdNZXRyaWNJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTBiM2UyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCX0KLQotfSAvL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0V4YW1wbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0V4YW1wbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ4MjdiMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9FeGFtcGxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeGFtcGxlSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGFtcGxlSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIEV4YW1wbGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeGFtcGxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRVhBTVBMRTsKLQl9Ci0KLX0gLy9FeGFtcGxlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTgwNWFmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0d1aWRhbmNlRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBHdWlkYW5jZURlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbCNnZXRBdHRhY2htZW50IDxlbT5BdHRhY2htZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgR3VpZGFuY2VEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dGFjaG1lbnQoKSA8ZW0+QXR0YWNobWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0YWNobWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUQUNITUVOVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRhY2htZW50KCkgPGVtPkF0dGFjaG1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dGFjaG1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXR0YWNobWVudCA9IEFUVEFDSE1FTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdVSURBTkNFX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0YWNobWVudCgpIHsKLQkJcmV0dXJuIGF0dGFjaG1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0YWNobWVudChTdHJpbmcgbmV3QXR0YWNobWVudCkgewotCQlTdHJpbmcgb2xkQXR0YWNobWVudCA9IGF0dGFjaG1lbnQ7Ci0JCWF0dGFjaG1lbnQgPSBuZXdBdHRhY2htZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5ULCBvbGRBdHRhY2htZW50LCBhdHRhY2htZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UOgotCQkJCXJldHVybiBnZXRBdHRhY2htZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVDoKLQkJCQlzZXRBdHRhY2htZW50KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlQ6Ci0JCQkJc2V0QXR0YWNobWVudChBVFRBQ0hNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVDoKLQkJCQlyZXR1cm4gQVRUQUNITUVOVF9FREVGQVVMVCA9PSBudWxsID8gYXR0YWNobWVudCAhPSBudWxsIDogIUFUVEFDSE1FTlRfRURFRkFVTFQuZXF1YWxzKGF0dGFjaG1lbnQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYXR0YWNobWVudDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXR0YWNobWVudCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0d1aWRhbmNlRGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9HdWlkYW5jZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGFuY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyNDEyMGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9HdWlkYW5jZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogR3VpZGFuY2VJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRhbmNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGFuY2VJbXBsIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJbXBsIGltcGxlbWVudHMgR3VpZGFuY2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHdWlkYW5jZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdVSURBTkNFOwotCX0KLQotfSAvL0d1aWRhbmNlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGVsaW5lSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9HdWlkZWxpbmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDViYWRhZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9HdWlkZWxpbmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEd1aWRlbGluZUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRlbGluZUltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBHdWlkZWxpbmUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHdWlkZWxpbmVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HVUlERUxJTkU7Ci0JfQotCi19IC8vR3VpZGVsaW5lSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvSXRlcmF0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9JdGVyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhZmQ1ZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9JdGVyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEl0ZXJhdGlvbkltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkl0ZXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEl0ZXJhdGlvbkltcGwgZXh0ZW5kcyBBY3Rpdml0eUltcGwgaW1wbGVtZW50cyBJdGVyYXRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5JVEVSQVRJT047Ci0JfQotCi19IC8vSXRlcmF0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kQ29uZmlndXJhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kQ29uZmlndXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTYxMzQ5OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZENvbmZpZ3VyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RDb25maWd1cmF0aW9uSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgQ29uZmlndXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRCYXNlQ29uZmlndXJhdGlvbiA8ZW0+QmFzZSBDb25maWd1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldE1ldGhvZFBsdWdpblNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldERlZmF1bHRWaWV3IDxlbT5EZWZhdWx0IFZpZXc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0UHJvY2Vzc1ZpZXcgPGVtPlByb2Nlc3MgVmlldzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZENvbmZpZ3VyYXRpb25JbXBsIGV4dGVuZHMgTWV0aG9kVW5pdEltcGwgaW1wbGVtZW50cyBNZXRob2RDb25maWd1cmF0aW9uIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlQ29uZmlndXJhdGlvbigpIDxlbT5CYXNlIENvbmZpZ3VyYXRpb248L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZUNvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBiYXNlQ29uZmlndXJhdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSA8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kUGx1Z2luU2VsZWN0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSA8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXRob2RQYWNrYWdlU2VsZWN0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0VmlldygpIDxlbT5EZWZhdWx0IFZpZXc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRWaWV3KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1ZJRVdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFZpZXcoKSA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0VmlldygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VmlldyA9IERFRkFVTFRfVklFV19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2Nlc3NWaWV3KCkgPGVtPlByb2Nlc3MgVmlldzwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9jZXNzVmlldygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHByb2Nlc3NWaWV3ID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0NPTkZJR1VSQVRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEJhc2VDb25maWd1cmF0aW9uKCkgewotCQlpZiAoYmFzZUNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgewotCQkJYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgRURhdGFUeXBlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT04pOwotCQl9Ci0JCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkgewotCQlpZiAobWV0aG9kUGx1Z2luU2VsZWN0aW9uID09IG51bGwpIHsKLQkJCW1ldGhvZFBsdWdpblNlbGVjdGlvbiA9IG5ldyBFRGF0YVR5cGVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUGx1Z2luU2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkgewotCQlpZiAobWV0aG9kUGFja2FnZVNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQltZXRob2RQYWNrYWdlU2VsZWN0aW9uID0gbmV3IEVEYXRhVHlwZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUGFja2FnZVNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWaWV3KCkgewotCQlyZXR1cm4gZGVmYXVsdFZpZXc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFZpZXcoU3RyaW5nIG5ld0RlZmF1bHRWaWV3KSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0VmlldyA9IGRlZmF1bHRWaWV3OwotCQlkZWZhdWx0VmlldyA9IG5ld0RlZmF1bHRWaWV3OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVcsIG9sZERlZmF1bHRWaWV3LCBkZWZhdWx0VmlldykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRQcm9jZXNzVmlldygpIHsKLQkJaWYgKHByb2Nlc3NWaWV3ID09IG51bGwpIHsKLQkJCXByb2Nlc3NWaWV3ID0gbmV3IEVEYXRhVHlwZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXKTsKLQkJfQotCQlyZXR1cm4gcHJvY2Vzc1ZpZXc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT046Ci0JCQkJcmV0dXJuIGdldEJhc2VDb25maWd1cmF0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OOgotCQkJCXJldHVybiBnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJCXJldHVybiBnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVzoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZpZXcoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXOgotCQkJCXJldHVybiBnZXRQcm9jZXNzVmlldygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTjoKLQkJCQlnZXRCYXNlQ29uZmlndXJhdGlvbigpLmNsZWFyKCk7Ci0JCQkJZ2V0QmFzZUNvbmZpZ3VyYXRpb24oKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT046Ci0JCQkJZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJCWdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXOgotCQkJCXNldERlZmF1bHRWaWV3KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXOgotCQkJCWdldFByb2Nlc3NWaWV3KCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9jZXNzVmlldygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OOgotCQkJCWdldEJhc2VDb25maWd1cmF0aW9uKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OOgotCQkJCWdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT046Ci0JCQkJZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVc6Ci0JCQkJc2V0RGVmYXVsdFZpZXcoREVGQVVMVF9WSUVXX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFVzoKLQkJCQlnZXRQcm9jZXNzVmlldygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTjoKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24gIT0gbnVsbCAmJiAhYmFzZUNvbmZpZ3VyYXRpb24uaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCQlyZXR1cm4gbWV0aG9kUGx1Z2luU2VsZWN0aW9uICE9IG51bGwgJiYgIW1ldGhvZFBsdWdpblNlbGVjdGlvbi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTjoKLQkJCQlyZXR1cm4gbWV0aG9kUGFja2FnZVNlbGVjdGlvbiAhPSBudWxsICYmICFtZXRob2RQYWNrYWdlU2VsZWN0aW9uLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXOgotCQkJCXJldHVybiBERUZBVUxUX1ZJRVdfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRWaWV3ICE9IG51bGwgOiAhREVGQVVMVF9WSUVXX0VERUZBVUxULmVxdWFscyhkZWZhdWx0Vmlldyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFVzoKLQkJCQlyZXR1cm4gcHJvY2Vzc1ZpZXcgIT0gbnVsbCAmJiAhcHJvY2Vzc1ZpZXcuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYmFzZUNvbmZpZ3VyYXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGJhc2VDb25maWd1cmF0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtZXRob2RQbHVnaW5TZWxlY3Rpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1ldGhvZFBsdWdpblNlbGVjdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWV0aG9kUGFja2FnZVNlbGVjdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWV0aG9kUGFja2FnZVNlbGVjdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdFZpZXc6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlZmF1bHRWaWV3KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcm9jZXNzVmlldzogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJvY2Vzc1ZpZXcpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NZXRob2RDb25maWd1cmF0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzViM2Y2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RFbGVtZW50SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldE93bmVkUnVsZSA8ZW0+T3duZWQgUnVsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRCcmllZkRlc2NyaXB0aW9uIDxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0T3JkZXJpbmdHdWlkZSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjaXNTdXBwcmVzc2VkIDxlbT5TdXBwcmVzc2VkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudEltcGwgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAoKSA8ZW0+R3JvdXA8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZkRlc2NyaXB0aW9uKCkgPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZkRlc2NyaXB0aW9uKCkgPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJyaWVmRGVzY3JpcHRpb24gPSBCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yZGVyaW5nR3VpZGUoKSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9yZGVyaW5nR3VpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9SREVSSU5HX0dVSURFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yZGVyaW5nR3VpZGUoKSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9yZGVyaW5nR3VpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgb3JkZXJpbmdHdWlkZSA9IE9SREVSSU5HX0dVSURFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3VwcHJlc3NlZCgpIDxlbT5TdXBwcmVzc2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1N1cHByZXNzZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBTVVBQUkVTU0VEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N1cHByZXNzZWQoKSA8ZW0+U3VwcHJlc3NlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTdXBwcmVzc2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwcmVzc2VkID0gU1VQUFJFU1NFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU3VwcHJlc3NlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcHJlc3NlZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAoKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKSB7Ci0JCQlncm91cCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1JPVVApOwotCQl9Ci0JCXJldHVybiBncm91cDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0T3duZWRSdWxlKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCcmllZkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYnJpZWZEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCcmllZkRlc2NyaXB0aW9uKFN0cmluZyBuZXdCcmllZkRlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRCcmllZkRlc2NyaXB0aW9uID0gYnJpZWZEZXNjcmlwdGlvbjsKLQkJYnJpZWZEZXNjcmlwdGlvbiA9IG5ld0JyaWVmRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OLCBvbGRCcmllZkRlc2NyaXB0aW9uLCBicmllZkRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3JkZXJpbmdHdWlkZSgpIHsKLQkJcmV0dXJuIG9yZGVyaW5nR3VpZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3JkZXJpbmdHdWlkZShTdHJpbmcgbmV3T3JkZXJpbmdHdWlkZSkgewotCQlTdHJpbmcgb2xkT3JkZXJpbmdHdWlkZSA9IG9yZGVyaW5nR3VpZGU7Ci0JCW9yZGVyaW5nR3VpZGUgPSBuZXdPcmRlcmluZ0d1aWRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERSwgb2xkT3JkZXJpbmdHdWlkZSwgb3JkZXJpbmdHdWlkZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VwcHJlc3NlZCgpIHsKLQkJcmV0dXJuIHN1cHByZXNzZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3VwcHJlc3NlZChib29sZWFuIG5ld1N1cHByZXNzZWQpIHsKLQkJYm9vbGVhbiBvbGRTdXBwcmVzc2VkID0gc3VwcHJlc3NlZDsKLQkJc3VwcHJlc3NlZCA9IG5ld1N1cHByZXNzZWQ7Ci0JCWJvb2xlYW4gb2xkU3VwcHJlc3NlZEVTZXQgPSBzdXBwcmVzc2VkRVNldDsKLQkJc3VwcHJlc3NlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VELCBvbGRTdXBwcmVzc2VkLCBzdXBwcmVzc2VkLCAhb2xkU3VwcHJlc3NlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFN1cHByZXNzZWQoKSB7Ci0JCWJvb2xlYW4gb2xkU3VwcHJlc3NlZCA9IHN1cHByZXNzZWQ7Ci0JCWJvb2xlYW4gb2xkU3VwcHJlc3NlZEVTZXQgPSBzdXBwcmVzc2VkRVNldDsKLQkJc3VwcHJlc3NlZCA9IFNVUFBSRVNTRURfRURFRkFVTFQ7Ci0JCXN1cHByZXNzZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRCwgb2xkU3VwcHJlc3NlZCwgU1VQUFJFU1NFRF9FREVGQVVMVCwgb2xkU3VwcHJlc3NlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFN1cHByZXNzZWQoKSB7Ci0JCXJldHVybiBzdXBwcmVzc2VkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0dST1VQOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0T3duZWRSdWxlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HUk9VUDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cCgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOgotCQkJCXJldHVybiBnZXRPd25lZFJ1bGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOgotCQkJCXJldHVybiBnZXRPcmRlcmluZ0d1aWRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ6Ci0JCQkJcmV0dXJuIGlzU3VwcHJlc3NlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HUk9VUDoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEU6Ci0JCQkJZ2V0T3duZWRSdWxlKCkuY2xlYXIoKTsKLQkJCQlnZXRPd25lZFJ1bGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCQkJc2V0QnJpZWZEZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU6Ci0JCQkJc2V0T3JkZXJpbmdHdWlkZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ6Ci0JCQkJc2V0U3VwcHJlc3NlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HUk9VUDoKLQkJCQlnZXRHcm91cCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOgotCQkJCWdldE93bmVkUnVsZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjoKLQkJCQlzZXRCcmllZkRlc2NyaXB0aW9uKEJSSUVGX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOgotCQkJCXNldE9yZGVyaW5nR3VpZGUoT1JERVJJTkdfR1VJREVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDoKLQkJCQl1bnNldFN1cHByZXNzZWQoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1JPVVA6Ci0JCQkJcmV0dXJuIGdyb3VwICE9IG51bGwgJiYgIWdyb3VwLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRToKLQkJCQlyZXR1cm4gIWdldE93bmVkUnVsZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIEJSSUVGX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBicmllZkRlc2NyaXB0aW9uICE9IG51bGwgOiAhQlJJRUZfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGJyaWVmRGVzY3JpcHRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU6Ci0JCQkJcmV0dXJuIE9SREVSSU5HX0dVSURFX0VERUZBVUxUID09IG51bGwgPyBvcmRlcmluZ0d1aWRlICE9IG51bGwgOiAhT1JERVJJTkdfR1VJREVfRURFRkFVTFQuZXF1YWxzKG9yZGVyaW5nR3VpZGUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOgotCQkJCXJldHVybiBpc1NldFN1cHByZXNzZWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYnJpZWZEZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYnJpZWZEZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvcmRlcmluZ0d1aWRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvcmRlcmluZ0d1aWRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdXBwcmVzc2VkOiAiKTsKLQkJaWYgKHN1cHByZXNzZWRFU2V0KSByZXN1bHQuYXBwZW5kKHN1cHByZXNzZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kRWxlbWVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZExpYnJhcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZExpYnJhcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI1Mjc1MTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RMaWJyYXJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kTGlicmFyeUltcGwuamF2YSx2IDEuNCAyMDA2LzA5LzA4IDAwOjU5OjI2IGp4aSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgTGlicmFyeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbCNnZXRNZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbiA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwjZ2V0VG9vbCA8ZW0+VG9vbDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZExpYnJhcnlJbXBsIGV4dGVuZHMgTWV0aG9kVW5pdEltcGwgaW1wbGVtZW50cyBNZXRob2RMaWJyYXJ5IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQbHVnaW4oKSA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXRob2RQbHVnaW4gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kQ29uZmlndXJhdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG9vbCgpIDxlbT5Ub29sPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb29sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvb2woKSA8ZW0+VG9vbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9vbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0b29sID0gVE9PTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUlk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1ldGhvZFBsdWdpbigpIHsKLQkJaWYgKG1ldGhvZFBsdWdpbiA9PSBudWxsKSB7Ci0JCQltZXRob2RQbHVnaW4gPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWV0aG9kUGx1Z2luLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUGx1Z2luOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlpZiAobWV0aG9kQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0JCQltZXRob2RDb25maWd1cmF0aW9uID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9DT05GSUdVUkFUSU9OKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2woKSB7Ci0JCXJldHVybiB0b29sOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvb2woU3RyaW5nIG5ld1Rvb2wpIHsKLQkJU3RyaW5nIG9sZFRvb2wgPSB0b29sOwotCQl0b29sID0gbmV3VG9vbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fVE9PTCwgb2xkVG9vbCwgdG9vbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1ldGhvZFBsdWdpbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTjoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGx1Z2luKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJCXJldHVybiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1RPT0w6Ci0JCQkJcmV0dXJuIGdldFRvb2woKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOOgotCQkJCWdldE1ldGhvZFBsdWdpbigpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kUGx1Z2luKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb24oKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb24oKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fVE9PTDoKLQkJCQlzZXRUb29sKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU46Ci0JCQkJZ2V0TWV0aG9kUGx1Z2luKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fVE9PTDoKLQkJCQlzZXRUb29sKFRPT0xfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOOgotCQkJCXJldHVybiBtZXRob2RQbHVnaW4gIT0gbnVsbCAmJiAhbWV0aG9kUGx1Z2luLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX0NPTkZJR1VSQVRJT046Ci0JCQkJcmV0dXJuIG1ldGhvZENvbmZpZ3VyYXRpb24gIT0gbnVsbCAmJiAhbWV0aG9kQ29uZmlndXJhdGlvbi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1RPT0w6Ci0JCQkJcmV0dXJuIFRPT0xfRURFRkFVTFQgPT0gbnVsbCA/IHRvb2wgIT0gbnVsbCA6ICFUT09MX0VERUZBVUxULmVxdWFscyh0b29sKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHRvb2w6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRvb2wpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NZXRob2RMaWJyYXJ5SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAzNGEyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RQYWNrYWdlSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwjZ2V0UmV1c2VkUGFja2FnZSA8ZW0+UmV1c2VkIFBhY2thZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwjZ2V0TWV0aG9kUGFja2FnZSA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwjaXNHbG9iYWwgPGVtPkdsb2JhbDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFBhY2thZ2VJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cyBNZXRob2RQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDEoKSA8ZW0+R3JvdXAxPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAxID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dsb2JhbCgpIDxlbT5HbG9iYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzR2xvYmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gR0xPQkFMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dsb2JhbCgpIDxlbT5HbG9iYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzR2xvYmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnbG9iYWwgPSBHTE9CQUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEdsb2JhbCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2xvYmFsRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDEoKSB7Ci0JCWlmIChncm91cDEgPT0gbnVsbCkgewotCQkJZ3JvdXAxID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HUk9VUDEpOwotCQl9Ci0JCXJldHVybiBncm91cDE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJldXNlZFBhY2thZ2UoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAxKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNZXRob2RQYWNrYWdlKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMSgpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0dsb2JhbCgpIHsKLQkJcmV0dXJuIGdsb2JhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHbG9iYWwoYm9vbGVhbiBuZXdHbG9iYWwpIHsKLQkJYm9vbGVhbiBvbGRHbG9iYWwgPSBnbG9iYWw7Ci0JCWdsb2JhbCA9IG5ld0dsb2JhbDsKLQkJYm9vbGVhbiBvbGRHbG9iYWxFU2V0ID0gZ2xvYmFsRVNldDsKLQkJZ2xvYmFsRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCwgb2xkR2xvYmFsLCBnbG9iYWwsICFvbGRHbG9iYWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRHbG9iYWwoKSB7Ci0JCWJvb2xlYW4gb2xkR2xvYmFsID0gZ2xvYmFsOwotCQlib29sZWFuIG9sZEdsb2JhbEVTZXQgPSBnbG9iYWxFU2V0OwotCQlnbG9iYWwgPSBHTE9CQUxfRURFRkFVTFQ7Ci0JCWdsb2JhbEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUwsIG9sZEdsb2JhbCwgR0xPQkFMX0VERUZBVUxULCBvbGRHbG9iYWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRHbG9iYWwoKSB7Ci0JCXJldHVybiBnbG9iYWxFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR1JPVVAxOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAxKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0U6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXRob2RQYWNrYWdlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HUk9VUDE6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAxKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDEoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRToKLQkJCQlyZXR1cm4gZ2V0UmV1c2VkUGFja2FnZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRToKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGFja2FnZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUw6Ci0JCQkJcmV0dXJuIGlzR2xvYmFsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dST1VQMToKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRToKLQkJCQlnZXRSZXVzZWRQYWNrYWdlKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXVzZWRQYWNrYWdlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFOgotCQkJCWdldE1ldGhvZFBhY2thZ2UoKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZFBhY2thZ2UoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMOgotCQkJCXNldEdsb2JhbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HUk9VUDE6Ci0JCQkJZ2V0R3JvdXAxKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFOgotCQkJCWdldFJldXNlZFBhY2thZ2UoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0U6Ci0JCQkJZ2V0TWV0aG9kUGFja2FnZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUw6Ci0JCQkJdW5zZXRHbG9iYWwoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR1JPVVAxOgotCQkJCXJldHVybiBncm91cDEgIT0gbnVsbCAmJiAhZ3JvdXAxLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0U6Ci0JCQkJcmV0dXJuICFnZXRSZXVzZWRQYWNrYWdlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRToKLQkJCQlyZXR1cm4gIWdldE1ldGhvZFBhY2thZ2UoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDoKLQkJCQlyZXR1cm4gaXNTZXRHbG9iYWwoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAxKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBnbG9iYWw6ICIpOwotCQlpZiAoZ2xvYmFsRVNldCkgcmVzdWx0LmFwcGVuZChnbG9iYWwpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kUGFja2FnZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZFBsdWdpbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kUGx1Z2luSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZTExYjE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kUGx1Z2luSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kUGx1Z2luSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBQbHVnaW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbCNnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luIDxlbT5SZWZlcmVuY2VkIE1ldGhvZCBQbHVnaW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbCNnZXRNZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsI2lzVXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFBsdWdpbkltcGwgZXh0ZW5kcyBNZXRob2RVbml0SW1wbCBpbXBsZW1lbnRzIE1ldGhvZFBsdWdpbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpIDxlbT5SZWZlcmVuY2VkIE1ldGhvZCBQbHVnaW48L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlZmVyZW5jZWRNZXRob2RQbHVnaW4gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUGFja2FnZSgpIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kUGFja2FnZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVc2VyQ2hhbmdlYWJsZSgpIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVXNlckNoYW5nZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBVU0VSX0NIQU5HRUFCTEVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXNlckNoYW5nZWFibGUoKSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1VzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VyQ2hhbmdlYWJsZSA9IFVTRVJfQ0hBTkdFQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVXNlciBDaGFuZ2VhYmxlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VyQ2hhbmdlYWJsZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RQbHVnaW5JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCkgewotCQlpZiAocmVmZXJlbmNlZE1ldGhvZFBsdWdpbiA9PSBudWxsKSB7Ci0JCQlyZWZlcmVuY2VkTWV0aG9kUGx1Z2luID0gbmV3IEVEYXRhVHlwZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19SRUZFUkVOQ0VEX01FVEhPRF9QTFVHSU4pOwotCQl9Ci0JCXJldHVybiByZWZlcmVuY2VkTWV0aG9kUGx1Z2luOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNZXRob2RQYWNrYWdlKCkgewotCQlpZiAobWV0aG9kUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltZXRob2RQYWNrYWdlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1ldGhvZFBhY2thZ2UuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0UpOwotCQl9Ci0JCXJldHVybiBtZXRob2RQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXNlckNoYW5nZWFibGUoKSB7Ci0JCXJldHVybiB1c2VyQ2hhbmdlYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VyQ2hhbmdlYWJsZShib29sZWFuIG5ld1VzZXJDaGFuZ2VhYmxlKSB7Ci0JCWJvb2xlYW4gb2xkVXNlckNoYW5nZWFibGUgPSB1c2VyQ2hhbmdlYWJsZTsKLQkJdXNlckNoYW5nZWFibGUgPSBuZXdVc2VyQ2hhbmdlYWJsZTsKLQkJYm9vbGVhbiBvbGRVc2VyQ2hhbmdlYWJsZUVTZXQgPSB1c2VyQ2hhbmdlYWJsZUVTZXQ7Ci0JCXVzZXJDaGFuZ2VhYmxlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFLCBvbGRVc2VyQ2hhbmdlYWJsZSwgdXNlckNoYW5nZWFibGUsICFvbGRVc2VyQ2hhbmdlYWJsZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFVzZXJDaGFuZ2VhYmxlKCkgewotCQlib29sZWFuIG9sZFVzZXJDaGFuZ2VhYmxlID0gdXNlckNoYW5nZWFibGU7Ci0JCWJvb2xlYW4gb2xkVXNlckNoYW5nZWFibGVFU2V0ID0gdXNlckNoYW5nZWFibGVFU2V0OwotCQl1c2VyQ2hhbmdlYWJsZSA9IFVTRVJfQ0hBTkdFQUJMRV9FREVGQVVMVDsKLQkJdXNlckNoYW5nZWFibGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEUsIG9sZFVzZXJDaGFuZ2VhYmxlLCBVU0VSX0NIQU5HRUFCTEVfRURFRkFVTFQsIG9sZFVzZXJDaGFuZ2VhYmxlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VXNlckNoYW5nZWFibGUoKSB7Ci0JCXJldHVybiB1c2VyQ2hhbmdlYWJsZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWV0aG9kUGFja2FnZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19SRUZFUkVOQ0VEX01FVEhPRF9QTFVHSU46Ci0JCQkJcmV0dXJuIGdldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRToKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGFja2FnZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCQlyZXR1cm4gaXNVc2VyQ2hhbmdlYWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1JFRkVSRU5DRURfTUVUSE9EX1BMVUdJTjoKLQkJCQlnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCkuY2xlYXIoKTsKLQkJCQlnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0U6Ci0JCQkJZ2V0TWV0aG9kUGFja2FnZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kUGFja2FnZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCQlzZXRVc2VyQ2hhbmdlYWJsZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1JFRkVSRU5DRURfTUVUSE9EX1BMVUdJTjoKLQkJCQlnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0U6Ci0JCQkJZ2V0TWV0aG9kUGFja2FnZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCQl1bnNldFVzZXJDaGFuZ2VhYmxlKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fUkVGRVJFTkNFRF9NRVRIT0RfUExVR0lOOgotCQkJCXJldHVybiByZWZlcmVuY2VkTWV0aG9kUGx1Z2luICE9IG51bGwgJiYgIXJlZmVyZW5jZWRNZXRob2RQbHVnaW4uaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFOgotCQkJCXJldHVybiBtZXRob2RQYWNrYWdlICE9IG51bGwgJiYgIW1ldGhvZFBhY2thZ2UuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCQlyZXR1cm4gaXNTZXRVc2VyQ2hhbmdlYWJsZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocmVmZXJlbmNlZE1ldGhvZFBsdWdpbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVmZXJlbmNlZE1ldGhvZFBsdWdpbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdXNlckNoYW5nZWFibGU6ICIpOwotCQlpZiAodXNlckNoYW5nZWFibGVFU2V0KSByZXN1bHQuYXBwZW5kKHVzZXJDaGFuZ2VhYmxlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZFBsdWdpbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZFVuaXRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZFVuaXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI5OWRlNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RVbml0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kVW5pdEltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFVuaXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kVW5pdEltcGwjZ2V0Q29weXJpZ2h0IDxlbT5Db3B5cmlnaHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kVW5pdEltcGwjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RVbml0SW1wbCNnZXRDaGFuZ2VEYXRlIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RVbml0SW1wbCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RVbml0SW1wbCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbXBsIGltcGxlbWVudHMgTWV0aG9kVW5pdCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvcHlyaWdodCgpIDxlbT5Db3B5cmlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvcHlyaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWVJJR0hUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvcHlyaWdodCgpIDxlbT5Db3B5cmlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvcHlyaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb3B5cmlnaHQgPSBDT1BZUklHSFRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9ycygpIDxlbT5BdXRob3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhvcnMoKSA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdXRob3JzID0gQVVUSE9SU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEYXRlKCkgPGVtPkNoYW5nZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBDSEFOR0VfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEYXRlKCkgPGVtPkNoYW5nZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNoYW5nZURhdGUgPSBDSEFOR0VfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjaGFuZ2VEZXNjcmlwdGlvbiA9IENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZFVuaXRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvcHlyaWdodCgpIHsKLQkJcmV0dXJuIGNvcHlyaWdodDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3B5cmlnaHQoU3RyaW5nIG5ld0NvcHlyaWdodCkgewotCQlTdHJpbmcgb2xkQ29weXJpZ2h0ID0gY29weXJpZ2h0OwotCQljb3B5cmlnaHQgPSBuZXdDb3B5cmlnaHQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVCwgb2xkQ29weXJpZ2h0LCBjb3B5cmlnaHQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF1dGhvcnMoKSB7Ci0JCXJldHVybiBhdXRob3JzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dGhvcnMoU3RyaW5nIG5ld0F1dGhvcnMpIHsKLQkJU3RyaW5nIG9sZEF1dGhvcnMgPSBhdXRob3JzOwotCQlhdXRob3JzID0gbmV3QXV0aG9yczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUywgb2xkQXV0aG9ycywgYXV0aG9ycykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q2hhbmdlRGF0ZSgpIHsKLQkJcmV0dXJuIGNoYW5nZURhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlRGF0ZShPYmplY3QgbmV3Q2hhbmdlRGF0ZSkgewotCQlPYmplY3Qgb2xkQ2hhbmdlRGF0ZSA9IGNoYW5nZURhdGU7Ci0JCWNoYW5nZURhdGUgPSBuZXdDaGFuZ2VEYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURSwgb2xkQ2hhbmdlRGF0ZSwgY2hhbmdlRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBjaGFuZ2VEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcgbmV3Q2hhbmdlRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZENoYW5nZURlc2NyaXB0aW9uID0gY2hhbmdlRGVzY3JpcHRpb247Ci0JCWNoYW5nZURlc2NyaXB0aW9uID0gbmV3Q2hhbmdlRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTiwgb2xkQ2hhbmdlRGVzY3JpcHRpb24sIGNoYW5nZURlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVDoKLQkJCQlyZXR1cm4gZ2V0Q29weXJpZ2h0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM6Ci0JCQkJcmV0dXJuIGdldEF1dGhvcnMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU6Ci0JCQkJcmV0dXJuIGdldENoYW5nZURhdGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUOgotCQkJCXNldENvcHlyaWdodCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM6Ci0JCQkJc2V0QXV0aG9ycygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOgotCQkJCXNldENoYW5nZURhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQkJc2V0Q2hhbmdlRGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUOgotCQkJCXNldENvcHlyaWdodChDT1BZUklHSFRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzoKLQkJCQlzZXRBdXRob3JzKEFVVEhPUlNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU6Ci0JCQkJc2V0Q2hhbmdlRGF0ZShDSEFOR0VfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQkJc2V0Q2hhbmdlRGVzY3JpcHRpb24oQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbihWRVJTSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUOgotCQkJCXJldHVybiBDT1BZUklHSFRfRURFRkFVTFQgPT0gbnVsbCA/IGNvcHlyaWdodCAhPSBudWxsIDogIUNPUFlSSUdIVF9FREVGQVVMVC5lcXVhbHMoY29weXJpZ2h0KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzoKLQkJCQlyZXR1cm4gQVVUSE9SU19FREVGQVVMVCA9PSBudWxsID8gYXV0aG9ycyAhPSBudWxsIDogIUFVVEhPUlNfRURFRkFVTFQuZXF1YWxzKGF1dGhvcnMpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURToKLQkJCQlyZXR1cm4gQ0hBTkdFX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNoYW5nZURhdGUgIT0gbnVsbCA6ICFDSEFOR0VfREFURV9FREVGQVVMVC5lcXVhbHMoY2hhbmdlRGF0ZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBjaGFuZ2VEZXNjcmlwdGlvbiAhPSBudWxsIDogIUNIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoY2hhbmdlRGVzY3JpcHRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwgOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb3B5cmlnaHQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvcHlyaWdodCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXV0aG9yczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXV0aG9ycyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2hhbmdlRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2hhbmdlRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2hhbmdlRGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNoYW5nZURlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2ZXJzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kVW5pdEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01pbGVzdG9uZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWlsZXN0b25lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Nzg0N2IxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWlsZXN0b25lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNaWxlc3RvbmVJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NaWxlc3RvbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWxlc3RvbmVJbXBsIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIGltcGxlbWVudHMgTWlsZXN0b25lIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWlsZXN0b25lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUlMRVNUT05FOwotCX0KLQotfSAvL01pbGVzdG9uZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL05hbWVkRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTmFtZWRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YWVhNjZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTmFtZWRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTmFtZWRFbGVtZW50SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hbWVkIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTmFtZWRFbGVtZW50SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTmFtZWRFbGVtZW50SW1wbCBleHRlbmRzIEVsZW1lbnRJbXBsIGltcGxlbWVudHMgTmFtZWRFbGVtZW50IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOYW1lZEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVF9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVF9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9OYW1lZEVsZW1lbnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9PdXRjb21lSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9PdXRjb21lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZjE2Mzc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvT3V0Y29tZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogT3V0Y29tZUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRjb21lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3V0Y29tZUltcGwgZXh0ZW5kcyBXb3JrUHJvZHVjdEltcGwgaW1wbGVtZW50cyBPdXRjb21lIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT3V0Y29tZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk9VVENPTUU7Ci0JfQotCi19IC8vT3V0Y29tZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1BhY2thZ2VhYmxlRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUGFja2FnZWFibGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYjBlMzllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUGFja2FnZWFibGVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQYWNrYWdlYWJsZUVsZW1lbnRJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGFja2FnZWFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYWNrYWdlYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZWFibGVFbGVtZW50SW1wbCBleHRlbmRzIE5hbWVkRWxlbWVudEltcGwgaW1wbGVtZW50cyBQYWNrYWdlYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQYWNrYWdlYWJsZUVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QQUNLQUdFQUJMRV9FTEVNRU5UOwotCX0KLQotfSAvL1BhY2thZ2VhYmxlRWxlbWVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1BoYXNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QaGFzZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWQ0NGQ4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1BoYXNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQaGFzZUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGhhc2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQaGFzZUltcGwgZXh0ZW5kcyBBY3Rpdml0eUltcGwgaW1wbGVtZW50cyBQaGFzZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBoYXNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUEhBU0U7Ci0JfQotCi19IC8vUGhhc2VJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QbGFubmluZ0RhdGFJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1BsYW5uaW5nRGF0YUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWQ3MGQzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1BsYW5uaW5nRGF0YUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFBsYW5uaW5nRGF0YUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlBsYW5uaW5nRGF0YUltcGwjZ2V0RmluaXNoRGF0ZSA8ZW0+RmluaXNoIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbCNnZXRSYW5rIDxlbT5SYW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlBsYW5uaW5nRGF0YUltcGwjZ2V0U3RhcnREYXRlIDxlbT5TdGFydCBEYXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGxhbm5pbmdEYXRhSW1wbCBleHRlbmRzIFByb2Nlc3NFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFBsYW5uaW5nRGF0YSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaERhdGUoKSA8ZW0+RmluaXNoIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEZJTklTSF9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaERhdGUoKSA8ZW0+RmluaXNoIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZmluaXNoRGF0ZSA9IEZJTklTSF9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhbmsoKSA8ZW0+UmFuazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFuaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYW5rKCkgPGVtPlJhbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmFuayA9IFJBTktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnREYXRlKCkgPGVtPlN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydERhdGUoKSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0RGF0ZSA9IFNUQVJUX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGxhbm5pbmdEYXRhSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUExBTk5JTkdfREFUQTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZpbmlzaERhdGUoKSB7Ci0JCXJldHVybiBmaW5pc2hEYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmlzaERhdGUoT2JqZWN0IG5ld0ZpbmlzaERhdGUpIHsKLQkJT2JqZWN0IG9sZEZpbmlzaERhdGUgPSBmaW5pc2hEYXRlOwotCQlmaW5pc2hEYXRlID0gbmV3RmluaXNoRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURSwgb2xkRmluaXNoRGF0ZSwgZmluaXNoRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmFuaygpIHsKLQkJcmV0dXJuIHJhbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmFuayhTdHJpbmcgbmV3UmFuaykgewotCQlTdHJpbmcgb2xkUmFuayA9IHJhbms7Ci0JCXJhbmsgPSBuZXdSYW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTkssIG9sZFJhbmssIHJhbmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFN0YXJ0RGF0ZSgpIHsKLQkJcmV0dXJuIHN0YXJ0RGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydERhdGUoT2JqZWN0IG5ld1N0YXJ0RGF0ZSkgewotCQlPYmplY3Qgb2xkU3RhcnREYXRlID0gc3RhcnREYXRlOwotCQlzdGFydERhdGUgPSBuZXdTdGFydERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURSwgb2xkU3RhcnREYXRlLCBzdGFydERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEU6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaERhdGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LOgotCQkJCXJldHVybiBnZXRSYW5rKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURToKLQkJCQlyZXR1cm4gZ2V0U3RhcnREYXRlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURToKLQkJCQlzZXRGaW5pc2hEYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LOgotCQkJCXNldFJhbmsoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEU6Ci0JCQkJc2V0U3RhcnREYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEU6Ci0JCQkJc2V0RmluaXNoRGF0ZShGSU5JU0hfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTks6Ci0JCQkJc2V0UmFuayhSQU5LX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURToKLQkJCQlzZXRTdGFydERhdGUoU1RBUlRfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEU6Ci0JCQkJcmV0dXJuIEZJTklTSF9EQVRFX0VERUZBVUxUID09IG51bGwgPyBmaW5pc2hEYXRlICE9IG51bGwgOiAhRklOSVNIX0RBVEVfRURFRkFVTFQuZXF1YWxzKGZpbmlzaERhdGUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTks6Ci0JCQkJcmV0dXJuIFJBTktfRURFRkFVTFQgPT0gbnVsbCA/IHJhbmsgIT0gbnVsbCA6ICFSQU5LX0VERUZBVUxULmVxdWFscyhyYW5rKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19TVEFSVF9EQVRFOgotCQkJCXJldHVybiBTVEFSVF9EQVRFX0VERUZBVUxUID09IG51bGwgPyBzdGFydERhdGUgIT0gbnVsbCA6ICFTVEFSVF9EQVRFX0VERUZBVUxULmVxdWFscyhzdGFydERhdGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZmluaXNoRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmFuazogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmFuayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhcnREYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGFydERhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9QbGFubmluZ0RhdGFJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QcmFjdGljZURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QcmFjdGljZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwN2VkZGU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByYWN0aWNlRGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByYWN0aWNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldEFkZGl0aW9uYWxJbmZvIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0QXBwbGljYXRpb24gPGVtPkFwcGxpY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldEJhY2tncm91bmQgPGVtPkJhY2tncm91bmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0R29hbHMgPGVtPkdvYWxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldExldmVsc09mQWRvcHRpb24gPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCNnZXRQcm9ibGVtIDxlbT5Qcm9ibGVtPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgUHJhY3RpY2VEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFkZGl0aW9uYWxJbmZvKCkgPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWRkaXRpb25hbEluZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFERElUSU9OQUxfSU5GT19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZGRpdGlvbmFsSW5mbygpIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFkZGl0aW9uYWxJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFkZGl0aW9uYWxJbmZvID0gQURESVRJT05BTF9JTkZPX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFwcGxpY2F0aW9uKCkgPGVtPkFwcGxpY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXBwbGljYXRpb24oKSA8ZW0+QXBwbGljYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFwcGxpY2F0aW9uID0gQVBQTElDQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFja2dyb3VuZCgpIDxlbT5CYWNrZ3JvdW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYWNrZ3JvdW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCQUNLR1JPVU5EX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhY2tncm91bmQoKSA8ZW0+QmFja2dyb3VuZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFja2dyb3VuZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBiYWNrZ3JvdW5kID0gQkFDS0dST1VORF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHb2FscygpIDxlbT5Hb2FsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R29hbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdPQUxTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdvYWxzKCkgPGVtPkdvYWxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHb2FscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnb2FscyA9IEdPQUxTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsc09mQWRvcHRpb24oKSA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpIDxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsc09mQWRvcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGV2ZWxzT2ZBZG9wdGlvbiA9IExFVkVMU19PRl9BRE9QVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9ibGVtKCkgPGVtPlByb2JsZW08L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2JsZW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0JMRU1fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvYmxlbSgpIDxlbT5Qcm9ibGVtPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9ibGVtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2JsZW0gPSBQUk9CTEVNX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByYWN0aWNlRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxJbmZvKCkgewotCQlyZXR1cm4gYWRkaXRpb25hbEluZm87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWRkaXRpb25hbEluZm8oU3RyaW5nIG5ld0FkZGl0aW9uYWxJbmZvKSB7Ci0JCVN0cmluZyBvbGRBZGRpdGlvbmFsSW5mbyA9IGFkZGl0aW9uYWxJbmZvOwotCQlhZGRpdGlvbmFsSW5mbyA9IG5ld0FkZGl0aW9uYWxJbmZvOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk8sIG9sZEFkZGl0aW9uYWxJbmZvLCBhZGRpdGlvbmFsSW5mbykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXBwbGljYXRpb24oKSB7Ci0JCXJldHVybiBhcHBsaWNhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcHBsaWNhdGlvbihTdHJpbmcgbmV3QXBwbGljYXRpb24pIHsKLQkJU3RyaW5nIG9sZEFwcGxpY2F0aW9uID0gYXBwbGljYXRpb247Ci0JCWFwcGxpY2F0aW9uID0gbmV3QXBwbGljYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OLCBvbGRBcHBsaWNhdGlvbiwgYXBwbGljYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tncm91bmQoKSB7Ci0JCXJldHVybiBiYWNrZ3JvdW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmQoU3RyaW5nIG5ld0JhY2tncm91bmQpIHsKLQkJU3RyaW5nIG9sZEJhY2tncm91bmQgPSBiYWNrZ3JvdW5kOwotCQliYWNrZ3JvdW5kID0gbmV3QmFja2dyb3VuZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORCwgb2xkQmFja2dyb3VuZCwgYmFja2dyb3VuZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R29hbHMoKSB7Ci0JCXJldHVybiBnb2FsczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHb2FscyhTdHJpbmcgbmV3R29hbHMpIHsKLQkJU3RyaW5nIG9sZEdvYWxzID0gZ29hbHM7Ci0JCWdvYWxzID0gbmV3R29hbHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTLCBvbGRHb2FscywgZ29hbHMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExldmVsc09mQWRvcHRpb24oKSB7Ci0JCXJldHVybiBsZXZlbHNPZkFkb3B0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExldmVsc09mQWRvcHRpb24oU3RyaW5nIG5ld0xldmVsc09mQWRvcHRpb24pIHsKLQkJU3RyaW5nIG9sZExldmVsc09mQWRvcHRpb24gPSBsZXZlbHNPZkFkb3B0aW9uOwotCQlsZXZlbHNPZkFkb3B0aW9uID0gbmV3TGV2ZWxzT2ZBZG9wdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OLCBvbGRMZXZlbHNPZkFkb3B0aW9uLCBsZXZlbHNPZkFkb3B0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9ibGVtKCkgewotCQlyZXR1cm4gcHJvYmxlbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ibGVtKFN0cmluZyBuZXdQcm9ibGVtKSB7Ci0JCVN0cmluZyBvbGRQcm9ibGVtID0gcHJvYmxlbTsKLQkJcHJvYmxlbSA9IG5ld1Byb2JsZW07Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU0sIG9sZFByb2JsZW0sIHByb2JsZW0pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTzoKLQkJCQlyZXR1cm4gZ2V0QWRkaXRpb25hbEluZm8oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT046Ci0JCQkJcmV0dXJuIGdldEFwcGxpY2F0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQ6Ci0JCQkJcmV0dXJuIGdldEJhY2tncm91bmQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFM6Ci0JCQkJcmV0dXJuIGdldEdvYWxzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTjoKLQkJCQlyZXR1cm4gZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNOgotCQkJCXJldHVybiBnZXRQcm9ibGVtKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPOgotCQkJCXNldEFkZGl0aW9uYWxJbmZvKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT046Ci0JCQkJc2V0QXBwbGljYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EOgotCQkJCXNldEJhY2tncm91bmQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUzoKLQkJCQlzZXRHb2FscygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTjoKLQkJCQlzZXRMZXZlbHNPZkFkb3B0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTToKLQkJCQlzZXRQcm9ibGVtKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTzoKLQkJCQlzZXRBZGRpdGlvbmFsSW5mbyhBRERJVElPTkFMX0lORk9fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT046Ci0JCQkJc2V0QXBwbGljYXRpb24oQVBQTElDQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORDoKLQkJCQlzZXRCYWNrZ3JvdW5kKEJBQ0tHUk9VTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFM6Ci0JCQkJc2V0R29hbHMoR09BTFNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OOgotCQkJCXNldExldmVsc09mQWRvcHRpb24oTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU06Ci0JCQkJc2V0UHJvYmxlbShQUk9CTEVNX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPOgotCQkJCXJldHVybiBBRERJVElPTkFMX0lORk9fRURFRkFVTFQgPT0gbnVsbCA/IGFkZGl0aW9uYWxJbmZvICE9IG51bGwgOiAhQURESVRJT05BTF9JTkZPX0VERUZBVUxULmVxdWFscyhhZGRpdGlvbmFsSW5mbyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJCXJldHVybiBBUFBMSUNBVElPTl9FREVGQVVMVCA9PSBudWxsID8gYXBwbGljYXRpb24gIT0gbnVsbCA6ICFBUFBMSUNBVElPTl9FREVGQVVMVC5lcXVhbHMoYXBwbGljYXRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EOgotCQkJCXJldHVybiBCQUNLR1JPVU5EX0VERUZBVUxUID09IG51bGwgPyBiYWNrZ3JvdW5kICE9IG51bGwgOiAhQkFDS0dST1VORF9FREVGQVVMVC5lcXVhbHMoYmFja2dyb3VuZCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTOgotCQkJCXJldHVybiBHT0FMU19FREVGQVVMVCA9PSBudWxsID8gZ29hbHMgIT0gbnVsbCA6ICFHT0FMU19FREVGQVVMVC5lcXVhbHMoZ29hbHMpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT046Ci0JCQkJcmV0dXJuIExFVkVMU19PRl9BRE9QVElPTl9FREVGQVVMVCA9PSBudWxsID8gbGV2ZWxzT2ZBZG9wdGlvbiAhPSBudWxsIDogIUxFVkVMU19PRl9BRE9QVElPTl9FREVGQVVMVC5lcXVhbHMobGV2ZWxzT2ZBZG9wdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU06Ci0JCQkJcmV0dXJuIFBST0JMRU1fRURFRkFVTFQgPT0gbnVsbCA/IHByb2JsZW0gIT0gbnVsbCA6ICFQUk9CTEVNX0VERUZBVUxULmVxdWFscyhwcm9ibGVtKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGFkZGl0aW9uYWxJbmZvOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhZGRpdGlvbmFsSW5mbyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXBwbGljYXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFwcGxpY2F0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiYWNrZ3JvdW5kOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChiYWNrZ3JvdW5kKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBnb2FsczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ29hbHMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxldmVsc09mQWRvcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxldmVsc09mQWRvcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByb2JsZW06ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByb2JsZW0pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9QcmFjdGljZURlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJhY3RpY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1ByYWN0aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOGEyMmIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJhY3RpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcmFjdGljZUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByYWN0aWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZUltcGwjZ2V0QWN0aXZpdHlSZWZlcmVuY2UgPGVtPkFjdGl2aXR5IFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZUltcGwjZ2V0Q29udGVudFJlZmVyZW5jZSA8ZW0+Q29udGVudCBSZWZlcmVuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VJbXBsI2dldFN1YlByYWN0aWNlIDxlbT5TdWIgUHJhY3RpY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmFjdGljZUltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBQcmFjdGljZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJhY3RpY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlBSQUNUSUNFX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEFjdGl2aXR5UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldENvbnRlbnRSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRTdWJQcmFjdGljZSgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U3ViUHJhY3RpY2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRToKLQkJCQlyZXR1cm4gZ2V0QWN0aXZpdHlSZWZlcmVuY2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0U6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnRSZWZlcmVuY2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFOgotCQkJCXJldHVybiBnZXRTdWJQcmFjdGljZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0U6Ci0JCQkJZ2V0QWN0aXZpdHlSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJCWdldEFjdGl2aXR5UmVmZXJlbmNlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFOgotCQkJCWdldENvbnRlbnRSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJCWdldENvbnRlbnRSZWZlcmVuY2UoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFOgotCQkJCWdldFN1YlByYWN0aWNlKCkuY2xlYXIoKTsKLQkJCQlnZXRTdWJQcmFjdGljZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0U6Ci0JCQkJZ2V0QWN0aXZpdHlSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0U6Ci0JCQkJZ2V0Q29udGVudFJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0U6Ci0JCQkJZ2V0U3ViUHJhY3RpY2UoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0U6Ci0JCQkJcmV0dXJuICFnZXRBY3Rpdml0eVJlZmVyZW5jZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0U6Ci0JCQkJcmV0dXJuICFnZXRDb250ZW50UmVmZXJlbmNlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0U6Ci0JCQkJcmV0dXJuICFnZXRTdWJQcmFjdGljZSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJhY3RpY2VJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZWEyZjJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxOSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NDb21wb25lbnRJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIENvbXBvbmVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRDb3B5cmlnaHQgPGVtPkNvcHlyaWdodDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRJbnRlcmZhY2UgPGVtPkludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRQcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsI2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEltcGwgZXh0ZW5kcyBQcm9jZXNzUGFja2FnZUltcGwgaW1wbGVtZW50cyBQcm9jZXNzQ29tcG9uZW50IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29weXJpZ2h0KCkgPGVtPkNvcHlyaWdodDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29weXJpZ2h0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT1BZUklHSFRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29weXJpZ2h0KCkgPGVtPkNvcHlyaWdodDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29weXJpZ2h0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvcHlyaWdodCA9IENPUFlSSUdIVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEludGVyZmFjZSgpIDxlbT5JbnRlcmZhY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgaW50ZXJmYWNlXyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9jZXNzKCkgPGVtPlByb2Nlc3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIHByb2Nlc3MgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhvcnMoKSA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JzKCkgPGVtPkF1dGhvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF1dGhvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXV0aG9ycyA9IEFVVEhPUlNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGF0ZSgpIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQ0hBTkdFX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGF0ZSgpIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjaGFuZ2VEYXRlID0gQ0hBTkdFX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURlc2NyaXB0aW9uKCkgPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2hhbmdlRGVzY3JpcHRpb24gPSBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb3B5cmlnaHQoKSB7Ci0JCXJldHVybiBjb3B5cmlnaHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weXJpZ2h0KFN0cmluZyBuZXdDb3B5cmlnaHQpIHsKLQkJU3RyaW5nIG9sZENvcHlyaWdodCA9IGNvcHlyaWdodDsKLQkJY29weXJpZ2h0ID0gbmV3Q29weXJpZ2h0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFQsIG9sZENvcHlyaWdodCwgY29weXJpZ2h0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgZ2V0SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gaW50ZXJmYWNlXzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbnRlcmZhY2UoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBuZXdJbnRlcmZhY2UsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBvbGRJbnRlcmZhY2UgPSBpbnRlcmZhY2VfOwotCQlpbnRlcmZhY2VfID0gbmV3SW50ZXJmYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0UsIG9sZEludGVyZmFjZSwgbmV3SW50ZXJmYWNlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnRlcmZhY2UoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBuZXdJbnRlcmZhY2UpIHsKLQkJaWYgKG5ld0ludGVyZmFjZSAhPSBpbnRlcmZhY2VfKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChpbnRlcmZhY2VfICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWludGVyZmFjZV8pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0UsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0ludGVyZmFjZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJbnRlcmZhY2UpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0UsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SW50ZXJmYWNlKG5ld0ludGVyZmFjZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0UsIG5ld0ludGVyZmFjZSwgbmV3SW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIG5ld1Byb2Nlc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBvbGRQcm9jZXNzID0gcHJvY2VzczsKLQkJcHJvY2VzcyA9IG5ld1Byb2Nlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsIG9sZFByb2Nlc3MsIG5ld1Byb2Nlc3MpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBuZXdQcm9jZXNzKSB7Ci0JCWlmIChuZXdQcm9jZXNzICE9IHByb2Nlc3MpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcHJvY2VzcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Byb2Nlc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UHJvY2VzcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJvY2VzcyhuZXdQcm9jZXNzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsIG5ld1Byb2Nlc3MsIG5ld1Byb2Nlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF1dGhvcnMoKSB7Ci0JCXJldHVybiBhdXRob3JzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dGhvcnMoU3RyaW5nIG5ld0F1dGhvcnMpIHsKLQkJU3RyaW5nIG9sZEF1dGhvcnMgPSBhdXRob3JzOwotCQlhdXRob3JzID0gbmV3QXV0aG9yczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUywgb2xkQXV0aG9ycywgYXV0aG9ycykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q2hhbmdlRGF0ZSgpIHsKLQkJcmV0dXJuIGNoYW5nZURhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlRGF0ZShPYmplY3QgbmV3Q2hhbmdlRGF0ZSkgewotCQlPYmplY3Qgb2xkQ2hhbmdlRGF0ZSA9IGNoYW5nZURhdGU7Ci0JCWNoYW5nZURhdGUgPSBuZXdDaGFuZ2VEYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURSwgb2xkQ2hhbmdlRGF0ZSwgY2hhbmdlRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBjaGFuZ2VEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcgbmV3Q2hhbmdlRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZENoYW5nZURlc2NyaXB0aW9uID0gY2hhbmdlRGVzY3JpcHRpb247Ci0JCWNoYW5nZURlc2NyaXB0aW9uID0gbmV3Q2hhbmdlRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTiwgb2xkQ2hhbmdlRGVzY3JpcHRpb24sIGNoYW5nZURlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRJbnRlcmZhY2UobnVsbCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1M6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UHJvY2VzcyhudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFQ6Ci0JCQkJcmV0dXJuIGdldENvcHlyaWdodCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGdldEludGVyZmFjZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTOgotCQkJCXJldHVybiBnZXRQcm9jZXNzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlM6Ci0JCQkJcmV0dXJuIGdldEF1dGhvcnMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEU6Ci0JCQkJcmV0dXJuIGdldENoYW5nZURhdGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OOgotCQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUOgotCQkJCXNldENvcHlyaWdodCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRToKLQkJCQlzZXRJbnRlcmZhY2UoKFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCQlzZXRQcm9jZXNzKChvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlM6Ci0JCQkJc2V0QXV0aG9ycygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOgotCQkJCXNldENoYW5nZURhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQkJc2V0Q2hhbmdlRGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUOgotCQkJCXNldENvcHlyaWdodChDT1BZUklHSFRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFOgotCQkJCXNldEludGVyZmFjZSgoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1M6Ci0JCQkJc2V0UHJvY2Vzcygob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlM6Ci0JCQkJc2V0QXV0aG9ycyhBVVRIT1JTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOgotCQkJCXNldENoYW5nZURhdGUoQ0hBTkdFX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJCXNldENoYW5nZURlc2NyaXB0aW9uKENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oVkVSU0lPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVDoKLQkJCQlyZXR1cm4gQ09QWVJJR0hUX0VERUZBVUxUID09IG51bGwgPyBjb3B5cmlnaHQgIT0gbnVsbCA6ICFDT1BZUklHSFRfRURFRkFVTFQuZXF1YWxzKGNvcHlyaWdodCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gaW50ZXJmYWNlXyAhPSBudWxsOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTOgotCQkJCXJldHVybiBwcm9jZXNzICE9IG51bGw7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlM6Ci0JCQkJcmV0dXJuIEFVVEhPUlNfRURFRkFVTFQgPT0gbnVsbCA/IGF1dGhvcnMgIT0gbnVsbCA6ICFBVVRIT1JTX0VERUZBVUxULmVxdWFscyhhdXRob3JzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEU6Ci0JCQkJcmV0dXJuIENIQU5HRV9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjaGFuZ2VEYXRlICE9IG51bGwgOiAhQ0hBTkdFX0RBVEVfRURFRkFVTFQuZXF1YWxzKGNoYW5nZURhdGUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gY2hhbmdlRGVzY3JpcHRpb24gIT0gbnVsbCA6ICFDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGNoYW5nZURlc2NyaXB0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gdmVyc2lvbiAhPSBudWxsIDogIVZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHZlcnNpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29weXJpZ2h0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3B5cmlnaHQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF1dGhvcnM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF1dGhvcnMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNoYW5nZURhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNoYW5nZURhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNoYW5nZURlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjaGFuZ2VEZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmVyc2lvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmVyc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb2Nlc3NDb21wb25lbnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNmVkMzY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCNnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9uIDxlbT5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCNnZXRJbnRlcmZhY2VJTyA8ZW0+SW50ZXJmYWNlIElPPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMSgpIDxlbT5Hcm91cDE8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAxKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDEgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAxKCkgewotCQlpZiAoZ3JvdXAxID09IG51bGwpIHsKLQkJCWdyb3VwMSA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMSk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDEoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT04pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRJbnRlcmZhY2VJTygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDEoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19HUk9VUDE6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDEoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT046Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEludGVyZmFjZUlPKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1JPVVAxOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMSgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OOgotCQkJCXJldHVybiBnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU86Ci0JCQkJcmV0dXJuIGdldEludGVyZmFjZUlPKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMToKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT046Ci0JCQkJZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpLmNsZWFyKCk7Ci0JCQkJZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPOgotCQkJCWdldEludGVyZmFjZUlPKCkuY2xlYXIoKTsKLQkJCQlnZXRJbnRlcmZhY2VJTygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMToKLQkJCQlnZXRHcm91cDEoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OOgotCQkJCWdldEludGVyZmFjZVNwZWNpZmljYXRpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCQlnZXRJbnRlcmZhY2VJTygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19HUk9VUDE6Ci0JCQkJcmV0dXJuIGdyb3VwMSAhPSBudWxsICYmICFncm91cDEuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT046Ci0JCQkJcmV0dXJuICFnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPOgotCQkJCXJldHVybiAhZ2V0SW50ZXJmYWNlSU8oKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDE6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmI5NzczMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0U2NvcGUgPGVtPlNjb3BlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0VXNhZ2VOb3RlcyA8ZW0+VXNhZ2UgTm90ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBBY3Rpdml0eURlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIFByb2Nlc3NEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjb3BlKCkgPGVtPlNjb3BlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY29wZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NPUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NvcGUoKSA8ZW0+U2NvcGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNjb3BlID0gU0NPUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNhZ2VOb3RlcygpIDxlbT5Vc2FnZSBOb3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2VOb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNBR0VfTk9URVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNhZ2VOb3RlcygpIDxlbT5Vc2FnZSBOb3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2VOb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1c2FnZU5vdGVzID0gVVNBR0VfTk9URVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxJZCgpIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxJZCgpIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBleHRlcm5hbElkID0gRVhURVJOQUxfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNjb3BlKCkgewotCQlyZXR1cm4gc2NvcGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIG5ld1Njb3BlKSB7Ci0JCVN0cmluZyBvbGRTY29wZSA9IHNjb3BlOwotCQlzY29wZSA9IG5ld1Njb3BlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFLCBvbGRTY29wZSwgc2NvcGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVzYWdlTm90ZXMoKSB7Ci0JCXJldHVybiB1c2FnZU5vdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzYWdlTm90ZXMoU3RyaW5nIG5ld1VzYWdlTm90ZXMpIHsKLQkJU3RyaW5nIG9sZFVzYWdlTm90ZXMgPSB1c2FnZU5vdGVzOwotCQl1c2FnZU5vdGVzID0gbmV3VXNhZ2VOb3RlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUywgb2xkVXNhZ2VOb3RlcywgdXNhZ2VOb3RlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxJZCgpIHsKLQkJcmV0dXJuIGV4dGVybmFsSWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0ZXJuYWxJZChTdHJpbmcgbmV3RXh0ZXJuYWxJZCkgewotCQlTdHJpbmcgb2xkRXh0ZXJuYWxJZCA9IGV4dGVybmFsSWQ7Ci0JCWV4dGVybmFsSWQgPSBuZXdFeHRlcm5hbElkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lELCBvbGRFeHRlcm5hbElkLCBleHRlcm5hbElkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJCXJldHVybiBnZXRTY29wZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTOgotCQkJCXJldHVybiBnZXRVc2FnZU5vdGVzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ6Ci0JCQkJcmV0dXJuIGdldEV4dGVybmFsSWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJCXNldFNjb3BlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUzoKLQkJCQlzZXRVc2FnZU5vdGVzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJCQlzZXRFeHRlcm5hbElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEU6Ci0JCQkJc2V0U2NvcGUoU0NPUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUzoKLQkJCQlzZXRVc2FnZU5vdGVzKFVTQUdFX05PVEVTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ6Ci0JCQkJc2V0RXh0ZXJuYWxJZChFWFRFUk5BTF9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEU6Ci0JCQkJcmV0dXJuIFNDT1BFX0VERUZBVUxUID09IG51bGwgPyBzY29wZSAhPSBudWxsIDogIVNDT1BFX0VERUZBVUxULmVxdWFscyhzY29wZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM6Ci0JCQkJcmV0dXJuIFVTQUdFX05PVEVTX0VERUZBVUxUID09IG51bGwgPyB1c2FnZU5vdGVzICE9IG51bGwgOiAhVVNBR0VfTk9URVNfRURFRkFVTFQuZXF1YWxzKHVzYWdlTm90ZXMpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJCXJldHVybiBFWFRFUk5BTF9JRF9FREVGQVVMVCA9PSBudWxsID8gZXh0ZXJuYWxJZCAhPSBudWxsIDogIUVYVEVSTkFMX0lEX0VERUZBVUxULmVxdWFscyhleHRlcm5hbElkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNjb3BlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzY29wZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdXNhZ2VOb3RlczogIik7Ci0JCXJlc3VsdC5hcHBlbmQodXNhZ2VOb3Rlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXh0ZXJuYWxJZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXh0ZXJuYWxJZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb2Nlc3NEZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTc1YzIwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzRWxlbWVudEltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0VsZW1lbnRJbXBsIGV4dGVuZHMgRGVzY3JpYmFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFByb2Nlc3NFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0VsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0VMRU1FTlQ7Ci0JfQotCi19IC8vUHJvY2Vzc0VsZW1lbnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjk4NjAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NJbXBsI2dldEluY2x1ZGVzUGF0dGVybiA8ZW0+SW5jbHVkZXMgUGF0dGVybjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzSW1wbCNnZXREZWZhdWx0Q29udGV4dCA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NJbXBsI2dldFZhbGlkQ29udGV4dCA8ZW0+VmFsaWQgQ29udGV4dDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NJbXBsIGV4dGVuZHMgQWN0aXZpdHlJbXBsIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5jbHVkZXNQYXR0ZXJuKCkgPGVtPkluY2x1ZGVzIFBhdHRlcm48L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5jbHVkZXNQYXR0ZXJuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5jbHVkZXNQYXR0ZXJuID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0Q29udGV4dCgpIDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRDb250ZXh0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTlRFWFRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdENvbnRleHQoKSA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0Q29udGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0Q29udGV4dCA9IERFRkFVTFRfQ09OVEVYVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbGlkQ29udGV4dCgpIDxlbT5WYWxpZCBDb250ZXh0PC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbGlkQ29udGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHZhbGlkQ29udGV4dCA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEluY2x1ZGVzUGF0dGVybigpIHsKLQkJaWYgKGluY2x1ZGVzUGF0dGVybiA9PSBudWxsKSB7Ci0JCQlpbmNsdWRlc1BhdHRlcm4gPSBuZXcgRURhdGFUeXBlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk4pOwotCQl9Ci0JCXJldHVybiBpbmNsdWRlc1BhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRDb250ZXh0KFN0cmluZyBuZXdEZWZhdWx0Q29udGV4dCkgewotCQlTdHJpbmcgb2xkRGVmYXVsdENvbnRleHQgPSBkZWZhdWx0Q29udGV4dDsKLQkJZGVmYXVsdENvbnRleHQgPSBuZXdEZWZhdWx0Q29udGV4dDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQsIG9sZERlZmF1bHRDb250ZXh0LCBkZWZhdWx0Q29udGV4dCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRWYWxpZENvbnRleHQoKSB7Ci0JCWlmICh2YWxpZENvbnRleHQgPT0gbnVsbCkgewotCQkJdmFsaWRDb250ZXh0ID0gbmV3IEVEYXRhVHlwZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUKTsKLQkJfQotCQlyZXR1cm4gdmFsaWRDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOOgotCQkJCXJldHVybiBnZXRJbmNsdWRlc1BhdHRlcm4oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVDoKLQkJCQlyZXR1cm4gZ2V0VmFsaWRDb250ZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOOgotCQkJCWdldEluY2x1ZGVzUGF0dGVybigpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5jbHVkZXNQYXR0ZXJuKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJCXNldERlZmF1bHRDb250ZXh0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUOgotCQkJCWdldFZhbGlkQ29udGV4dCgpLmNsZWFyKCk7Ci0JCQkJZ2V0VmFsaWRDb250ZXh0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk46Ci0JCQkJZ2V0SW5jbHVkZXNQYXR0ZXJuKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJCXNldERlZmF1bHRDb250ZXh0KERFRkFVTFRfQ09OVEVYVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQ6Ci0JCQkJZ2V0VmFsaWRDb250ZXh0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOOgotCQkJCXJldHVybiBpbmNsdWRlc1BhdHRlcm4gIT0gbnVsbCAmJiAhaW5jbHVkZXNQYXR0ZXJuLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ6Ci0JCQkJcmV0dXJuIERFRkFVTFRfQ09OVEVYVF9FREVGQVVMVCA9PSBudWxsID8gZGVmYXVsdENvbnRleHQgIT0gbnVsbCA6ICFERUZBVUxUX0NPTlRFWFRfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRDb250ZXh0KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUOgotCQkJCXJldHVybiB2YWxpZENvbnRleHQgIT0gbnVsbCAmJiAhdmFsaWRDb250ZXh0LmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGluY2x1ZGVzUGF0dGVybjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaW5jbHVkZXNQYXR0ZXJuKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0Q29udGV4dDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVmYXVsdENvbnRleHQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbGlkQ29udGV4dDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsaWRDb250ZXh0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJvY2Vzc0ltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDRjOWRhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc1BhY2thZ2VJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQYWNrYWdlSW1wbCNnZXRQcm9jZXNzRWxlbWVudCA8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1BhY2thZ2VJbXBsIGV4dGVuZHMgTWV0aG9kUGFja2FnZUltcGwgaW1wbGVtZW50cyBQcm9jZXNzUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc1BhY2thZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UHJvY2Vzc0VsZW1lbnQoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFByb2Nlc3NFbGVtZW50KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0UHJvY2Vzc0VsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQ6Ci0JCQkJZ2V0UHJvY2Vzc0VsZW1lbnQoKS5jbGVhcigpOwotCQkJCWdldFByb2Nlc3NFbGVtZW50KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UOgotCQkJCWdldFByb2Nlc3NFbGVtZW50KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuICFnZXRQcm9jZXNzRWxlbWVudCgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJvY2Vzc1BhY2thZ2VJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkNThmNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsI2dldEJhc2VQcm9jZXNzIDxlbT5CYXNlIFByb2Nlc3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwgZXh0ZW5kcyBQcm9jZXNzSW1wbCBpbXBsZW1lbnRzIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDMoKSA8ZW0+R3JvdXAzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAzKCkgewotCQlpZiAoZ3JvdXAzID09IG51bGwpIHsKLQkJCWdyb3VwMyA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDMpOwotCQl9Ci0JCXJldHVybiBncm91cDM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEJhc2VQcm9jZXNzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMygpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRV9QUk9DRVNTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVAzOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQMzoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDMoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMygpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRV9QUk9DRVNTOgotCQkJCXJldHVybiBnZXRCYXNlUHJvY2VzcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVAzOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRV9QUk9DRVNTOgotCQkJCWdldEJhc2VQcm9jZXNzKCkuY2xlYXIoKTsKLQkJCQlnZXRCYXNlUHJvY2VzcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDM6Ci0JCQkJZ2V0R3JvdXAzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRV9QUk9DRVNTOgotCQkJCWdldEJhc2VQcm9jZXNzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDM6Ci0JCQkJcmV0dXJuIGdyb3VwMyAhPSBudWxsICYmICFncm91cDMuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VfUFJPQ0VTUzoKLQkJCQlyZXR1cm4gIWdldEJhc2VQcm9jZXNzKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JlcG9ydEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUmVwb3J0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YjcyNzBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUmVwb3J0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZXBvcnRJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvcnRJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgUmVwb3J0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVwb3J0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVQT1JUOwotCX0KLQotfSAvL1JlcG9ydEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JldXNhYmxlQXNzZXRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JldXNhYmxlQXNzZXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVkZGNiMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9SZXVzYWJsZUFzc2V0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZXVzYWJsZUFzc2V0SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmV1c2FibGVBc3NldEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBSZXVzYWJsZUFzc2V0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmV1c2FibGVBc3NldEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJFVVNBQkxFX0FTU0VUOwotCX0KLQotfSAvL1JldXNhYmxlQXNzZXRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2FkbWFwSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2FkbWFwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNjdjN2UyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9hZG1hcEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUm9hZG1hcEltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9hZG1hcEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBSb2FkbWFwIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9hZG1hcEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJPQURNQVA7Ci0JfQotCi19IC8vUm9hZG1hcEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVEZXNjcmlwdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OTJhZTJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUm9sZURlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbCNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcyA8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwjZ2V0U2tpbGxzIDxlbT5Ta2lsbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbCNnZXRTeW5vbnltcyA8ZW0+U3lub255bXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIFJvbGVEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzKCkgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpIDxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFzc2lnbm1lbnRBcHByb2FjaGVzID0gQVNTSUdOTUVOVF9BUFBST0FDSEVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNraWxscygpIDxlbT5Ta2lsbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNraWxscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJTExTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNraWxscygpIDxlbT5Ta2lsbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNraWxscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBza2lsbHMgPSBTS0lMTFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3lub255bXMoKSA8ZW0+U3lub255bXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN5bm9ueW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5PTllNU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTeW5vbnltcygpIDxlbT5TeW5vbnltczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3lub255bXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc3lub255bXMgPSBTWU5PTllNU19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKSB7Ci0JCXJldHVybiBhc3NpZ25tZW50QXBwcm9hY2hlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBc3NpZ25tZW50QXBwcm9hY2hlcyhTdHJpbmcgbmV3QXNzaWdubWVudEFwcHJvYWNoZXMpIHsKLQkJU3RyaW5nIG9sZEFzc2lnbm1lbnRBcHByb2FjaGVzID0gYXNzaWdubWVudEFwcHJvYWNoZXM7Ci0JCWFzc2lnbm1lbnRBcHByb2FjaGVzID0gbmV3QXNzaWdubWVudEFwcHJvYWNoZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTLCBvbGRBc3NpZ25tZW50QXBwcm9hY2hlcywgYXNzaWdubWVudEFwcHJvYWNoZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNraWxscygpIHsKLQkJcmV0dXJuIHNraWxsczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTa2lsbHMoU3RyaW5nIG5ld1NraWxscykgewotCQlTdHJpbmcgb2xkU2tpbGxzID0gc2tpbGxzOwotCQlza2lsbHMgPSBuZXdTa2lsbHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU0tJTExTLCBvbGRTa2lsbHMsIHNraWxscykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3lub255bXMoKSB7Ci0JCXJldHVybiBzeW5vbnltczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5vbnltcyhTdHJpbmcgbmV3U3lub255bXMpIHsKLQkJU3RyaW5nIG9sZFN5bm9ueW1zID0gc3lub255bXM7Ci0JCXN5bm9ueW1zID0gbmV3U3lub255bXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVMsIG9sZFN5bm9ueW1zLCBzeW5vbnltcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVM6Ci0JCQkJcmV0dXJuIGdldEFzc2lnbm1lbnRBcHByb2FjaGVzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU0tJTExTOgotCQkJCXJldHVybiBnZXRTa2lsbHMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUzoKLQkJCQlyZXR1cm4gZ2V0U3lub255bXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUzoKLQkJCQlzZXRBc3NpZ25tZW50QXBwcm9hY2hlcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU0tJTExTOgotCQkJCXNldFNraWxscygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVM6Ci0JCQkJc2V0U3lub255bXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVM6Ci0JCQkJc2V0QXNzaWdubWVudEFwcHJvYWNoZXMoQVNTSUdOTUVOVF9BUFBST0FDSEVTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU0tJTExTOgotCQkJCXNldFNraWxscyhTS0lMTFNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUzoKLQkJCQlzZXRTeW5vbnltcyhTWU5PTllNU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTOgotCQkJCXJldHVybiBBU1NJR05NRU5UX0FQUFJPQUNIRVNfRURFRkFVTFQgPT0gbnVsbCA/IGFzc2lnbm1lbnRBcHByb2FjaGVzICE9IG51bGwgOiAhQVNTSUdOTUVOVF9BUFBST0FDSEVTX0VERUZBVUxULmVxdWFscyhhc3NpZ25tZW50QXBwcm9hY2hlcyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU0tJTExTOgotCQkJCXJldHVybiBTS0lMTFNfRURFRkFVTFQgPT0gbnVsbCA/IHNraWxscyAhPSBudWxsIDogIVNLSUxMU19FREVGQVVMVC5lcXVhbHMoc2tpbGxzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUzoKLQkJCQlyZXR1cm4gU1lOT05ZTVNfRURFRkFVTFQgPT0gbnVsbCA/IHN5bm9ueW1zICE9IG51bGwgOiAhU1lOT05ZTVNfRURFRkFVTFQuZXF1YWxzKHN5bm9ueW1zKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGFzc2lnbm1lbnRBcHByb2FjaGVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhc3NpZ25tZW50QXBwcm9hY2hlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2tpbGxzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChza2lsbHMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN5bm9ueW1zOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzeW5vbnltcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1JvbGVEZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVEZXNjcmlwdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlRGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWZhZDhiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVEZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUm9sZURlc2NyaXB0b3JJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsI2dldFJvbGUgPGVtPlJvbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsI2dldFJlc3BvbnNpYmxlRm9yIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRvckltcGwgZXh0ZW5kcyBEZXNjcmlwdG9ySW1wbCBpbXBsZW1lbnRzIFJvbGVEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZSgpIDxlbT5Sb2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGUoKSA8ZW0+Um9sZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByb2xlID0gUk9MRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3BvbnNpYmxlRm9yKCkgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNwb25zaWJsZUZvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlc3BvbnNpYmxlRm9yID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlRGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJvbGUoKSB7Ci0JCXJldHVybiByb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGUoU3RyaW5nIG5ld1JvbGUpIHsKLQkJU3RyaW5nIG9sZFJvbGUgPSByb2xlOwotCQlyb2xlID0gbmV3Um9sZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEUsIG9sZFJvbGUsIHJvbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UmVzcG9uc2libGVGb3IoKSB7Ci0JCWlmIChyZXNwb25zaWJsZUZvciA9PSBudWxsKSB7Ci0JCQlyZXNwb25zaWJsZUZvciA9IG5ldyBFRGF0YVR5cGVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1IpOwotCQl9Ci0JCXJldHVybiByZXNwb25zaWJsZUZvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJCXJldHVybiBnZXRSb2xlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJcmV0dXJuIGdldFJlc3BvbnNpYmxlRm9yKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEU6Ci0JCQkJc2V0Um9sZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5jbGVhcigpOwotCQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRToKLQkJCQlzZXRSb2xlKFJPTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCQlnZXRSZXNwb25zaWJsZUZvcigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJCXJldHVybiBST0xFX0VERUZBVUxUID09IG51bGwgPyByb2xlICE9IG51bGwgOiAhUk9MRV9FREVGQVVMVC5lcXVhbHMocm9sZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJcmV0dXJuIHJlc3BvbnNpYmxlRm9yICE9IG51bGwgJiYgIXJlc3BvbnNpYmxlRm9yLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJvbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJvbGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc3BvbnNpYmxlRm9yOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXNwb25zaWJsZUZvcik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1JvbGVEZXNjcmlwdG9ySW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTI4NDM3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2xlSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVJbXBsI2dldFJlc3BvbnNpYmxlRm9yIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlSW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFJvbGUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDIgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuUk9MRV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSZXNwb25zaWJsZUZvcigpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCQlyZXR1cm4gZ2V0UmVzcG9uc2libGVGb3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCQlnZXRSZXNwb25zaWJsZUZvcigpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCQlnZXRSZXNwb25zaWJsZUZvcigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJcmV0dXJuICFnZXRSZXNwb25zaWJsZUZvcigpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUm9sZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVTZXRHcm91cGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZVNldEdyb3VwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjQ0ZDJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZVNldEdyb3VwaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUm9sZVNldEdyb3VwaW5nSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgU2V0IEdyb3VwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRHcm91cGluZ0ltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbCNnZXRSb2xlU2V0IDxlbT5Sb2xlIFNldDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRHcm91cGluZ0ltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgUm9sZVNldEdyb3VwaW5nIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlU2V0R3JvdXBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVF9HUk9VUElORzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJvbGVTZXQoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVDoKLQkJCQlyZXR1cm4gZ2V0Um9sZVNldCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVDoKLQkJCQlnZXRSb2xlU2V0KCkuY2xlYXIoKTsKLQkJCQlnZXRSb2xlU2V0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUOgotCQkJCWdldFJvbGVTZXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVDoKLQkJCQlyZXR1cm4gIWdldFJvbGVTZXQoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1JvbGVTZXRHcm91cGluZ0ltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVTZXRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVTZXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcyZTZhOTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlU2V0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUm9sZVNldEltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBTZXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEltcGwjZ2V0Um9sZSA8ZW0+Um9sZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIFJvbGVTZXQgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDIgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVTZXRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlJPTEVfU0VUX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJvbGUoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVF9fUk9MRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEU6Ci0JCQkJcmV0dXJuIGdldFJvbGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fUk9MRToKLQkJCQlnZXRSb2xlKCkuY2xlYXIoKTsKLQkJCQlnZXRSb2xlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEU6Ci0JCQkJZ2V0Um9sZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEU6Ci0JCQkJcmV0dXJuICFnZXRSb2xlKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Sb2xlU2V0SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvU2VjdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvU2VjdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODNkNTJmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1NlY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBTZWN0aW9uSW1wbC5qYXZhLHYgMS40IDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlNlY3Rpb25JbXBsI2dldFN1YlNlY3Rpb24gPGVtPlN1YiBTZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlNlY3Rpb25JbXBsI2dldFByZWRlY2Vzc29yIDxlbT5QcmVkZWNlc3NvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TZWN0aW9uSW1wbCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0U2VjdGlvbk5hbWUgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TZWN0aW9uSW1wbCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlNlY3Rpb25JbXBsI2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlY3Rpb25JbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cyBTZWN0aW9uIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJTZWN0aW9uKCkgPGVtPlN1YiBTZWN0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdGlvbiBzdWJTZWN0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVkZWNlc3NvcigpIDxlbT5QcmVkZWNlc3NvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRURFQ0VTU09SX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWRlY2Vzc29yKCkgPGVtPlByZWRlY2Vzc29yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVkZWNlc3NvciA9IFBSRURFQ0VTU09SX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VjdGlvbk5hbWUoKSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDVElPTl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3Rpb25OYW1lKCkgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2VjdGlvbk5hbWUgPSBTRUNUSU9OX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUID0gVmFyaWFiaWxpdHlUeXBlLk5BX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFZhcmlhYmlsaXR5IFR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhcmlhYmlsaXR5VHlwZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZWN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuU0VDVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdGlvbiBnZXRTdWJTZWN0aW9uKCkgewotCQlyZXR1cm4gc3ViU2VjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTdWJTZWN0aW9uKFNlY3Rpb24gbmV3U3ViU2VjdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlTZWN0aW9uIG9sZFN1YlNlY3Rpb24gPSBzdWJTZWN0aW9uOwotCQlzdWJTZWN0aW9uID0gbmV3U3ViU2VjdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTiwgb2xkU3ViU2VjdGlvbiwgbmV3U3ViU2VjdGlvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3ViU2VjdGlvbihTZWN0aW9uIG5ld1N1YlNlY3Rpb24pIHsKLQkJaWYgKG5ld1N1YlNlY3Rpb24gIT0gc3ViU2VjdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc3ViU2VjdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzdWJTZWN0aW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3U3ViU2VjdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTdWJTZWN0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTdWJTZWN0aW9uKG5ld1N1YlNlY3Rpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTiwgbmV3U3ViU2VjdGlvbiwgbmV3U3ViU2VjdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZGVjZXNzb3IoKSB7Ci0JCXJldHVybiBwcmVkZWNlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVkZWNlc3NvcihTdHJpbmcgbmV3UHJlZGVjZXNzb3IpIHsKLQkJU3RyaW5nIG9sZFByZWRlY2Vzc29yID0gcHJlZGVjZXNzb3I7Ci0JCXByZWRlY2Vzc29yID0gbmV3UHJlZGVjZXNzb3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuU0VDVElPTl9fUFJFREVDRVNTT1IsIG9sZFByZWRlY2Vzc29yLCBwcmVkZWNlc3NvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuU0VDVElPTl9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBzZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWN0aW9uTmFtZShTdHJpbmcgbmV3U2VjdGlvbk5hbWUpIHsKLQkJU3RyaW5nIG9sZFNlY3Rpb25OYW1lID0gc2VjdGlvbk5hbWU7Ci0JCXNlY3Rpb25OYW1lID0gbmV3U2VjdGlvbk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FLCBvbGRTZWN0aW9uTmFtZSwgc2VjdGlvbk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoU3RyaW5nIG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpIHsKLQkJU3RyaW5nIG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULCBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50LCB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5VHlwZSBnZXRWYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSBuZXdWYXJpYWJpbGl0eVR5cGUpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIG9sZFZhcmlhYmlsaXR5VHlwZSA9IHZhcmlhYmlsaXR5VHlwZTsKLQkJdmFyaWFiaWxpdHlUeXBlID0gbmV3VmFyaWFiaWxpdHlUeXBlID09IG51bGwgPyBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUIDogbmV3VmFyaWFiaWxpdHlUeXBlOwotCQlib29sZWFuIG9sZFZhcmlhYmlsaXR5VHlwZUVTZXQgPSB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCQl2YXJpYWJpbGl0eVR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9UWVBFLCBvbGRWYXJpYWJpbGl0eVR5cGUsIHZhcmlhYmlsaXR5VHlwZSwgIW9sZFZhcmlhYmlsaXR5VHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIG9sZFZhcmlhYmlsaXR5VHlwZSA9IHZhcmlhYmlsaXR5VHlwZTsKLQkJYm9vbGVhbiBvbGRWYXJpYWJpbGl0eVR5cGVFU2V0ID0gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQkJdmFyaWFiaWxpdHlUeXBlID0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQkJdmFyaWFiaWxpdHlUeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuU0VDVElPTl9fVkFSSUFCSUxJVFlfVFlQRSwgb2xkVmFyaWFiaWxpdHlUeXBlLCBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxULCBvbGRWYXJpYWJpbGl0eVR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRWYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRTdWJTZWN0aW9uKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT046Ci0JCQkJcmV0dXJuIGdldFN1YlNlY3Rpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUjoKLQkJCQlyZXR1cm4gZ2V0UHJlZGVjZXNzb3IoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX05BTUU6Ci0JCQkJcmV0dXJuIGdldFNlY3Rpb25OYW1lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT046Ci0JCQkJc2V0U3ViU2VjdGlvbigoU2VjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1BSRURFQ0VTU09SOgotCQkJCXNldFByZWRlY2Vzc29yKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FOgotCQkJCXNldFNlY3Rpb25OYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJc2V0VmFyaWFiaWxpdHlUeXBlKChWYXJpYWJpbGl0eVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT046Ci0JCQkJc2V0U3ViU2VjdGlvbigoU2VjdGlvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fUFJFREVDRVNTT1I6Ci0JCQkJc2V0UHJlZGVjZXNzb3IoUFJFREVDRVNTT1JfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fTkFNRToKLQkJCQlzZXRTZWN0aW9uTmFtZShTRUNUSU9OX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJdW5zZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTjoKLQkJCQlyZXR1cm4gc3ViU2VjdGlvbiAhPSBudWxsOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1BSRURFQ0VTU09SOgotCQkJCXJldHVybiBQUkVERUNFU1NPUl9FREVGQVVMVCA9PSBudWxsID8gcHJlZGVjZXNzb3IgIT0gbnVsbCA6ICFQUkVERUNFU1NPUl9FREVGQVVMVC5lcXVhbHMocHJlZGVjZXNzb3IpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fTkFNRToKLQkJCQlyZXR1cm4gU0VDVElPTl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBzZWN0aW9uTmFtZSAhPSBudWxsIDogIVNFQ1RJT05fTkFNRV9FREVGQVVMVC5lcXVhbHMoc2VjdGlvbk5hbWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIFZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgIT0gbnVsbCA6ICFWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBpc1NldFZhcmlhYmlsaXR5VHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHJlZGVjZXNzb3I6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZWRlY2Vzc29yKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlY3Rpb25OYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzZWN0aW9uTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFyaWFiaWxpdHlUeXBlOiAiKTsKLQkJaWYgKHZhcmlhYmlsaXR5VHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodmFyaWFiaWxpdHlUeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1NlY3Rpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1N1cHBvcnRpbmdNYXRlcmlhbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDg5YTRkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1N1cHBvcnRpbmdNYXRlcmlhbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogU3VwcG9ydGluZ01hdGVyaWFsSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN1cHBvcnRpbmdNYXRlcmlhbEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBTdXBwb3J0aW5nTWF0ZXJpYWwgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdXBwb3J0aW5nTWF0ZXJpYWxJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5TVVBQT1JUSU5HX01BVEVSSUFMOwotCX0KLQotfSAvL1N1cHBvcnRpbmdNYXRlcmlhbEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGFza0Rlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNDhlYzhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGFza0Rlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGFza0Rlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2sgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0aW9uSW1wbCNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIFRhc2tEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdGVybmF0aXZlcygpIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxURVJOQVRJVkVTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdGVybmF0aXZlcygpIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhbHRlcm5hdGl2ZXMgPSBBTFRFUk5BVElWRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQVVJQT1NFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwdXJwb3NlID0gUFVSUE9TRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gYWx0ZXJuYXRpdmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgbmV3QWx0ZXJuYXRpdmVzKSB7Ci0JCVN0cmluZyBvbGRBbHRlcm5hdGl2ZXMgPSBhbHRlcm5hdGl2ZXM7Ci0JCWFsdGVybmF0aXZlcyA9IG5ld0FsdGVybmF0aXZlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMsIG9sZEFsdGVybmF0aXZlcywgYWx0ZXJuYXRpdmVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdXJwb3NlKCkgewotCQlyZXR1cm4gcHVycG9zZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXJwb3NlKFN0cmluZyBuZXdQdXJwb3NlKSB7Ci0JCVN0cmluZyBvbGRQdXJwb3NlID0gcHVycG9zZTsKLQkJcHVycG9zZSA9IG5ld1B1cnBvc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSwgb2xkUHVycG9zZSwgcHVycG9zZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQkJcmV0dXJuIGdldEFsdGVybmF0aXZlcygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQkJcmV0dXJuIGdldFB1cnBvc2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCQlzZXRBbHRlcm5hdGl2ZXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQkJc2V0UHVycG9zZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCQlzZXRBbHRlcm5hdGl2ZXMoQUxURVJOQVRJVkVTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlzZXRQdXJwb3NlKFBVUlBPU0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCQlyZXR1cm4gQUxURVJOQVRJVkVTX0VERUZBVUxUID09IG51bGwgPyBhbHRlcm5hdGl2ZXMgIT0gbnVsbCA6ICFBTFRFUk5BVElWRVNfRURFRkFVTFQuZXF1YWxzKGFsdGVybmF0aXZlcyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlyZXR1cm4gUFVSUE9TRV9FREVGQVVMVCA9PSBudWxsID8gcHVycG9zZSAhPSBudWxsIDogIVBVUlBPU0VfRURFRkFVTFQuZXF1YWxzKHB1cnBvc2UpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWx0ZXJuYXRpdmVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhbHRlcm5hdGl2ZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHB1cnBvc2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHB1cnBvc2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UYXNrRGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UYXNrRGVzY3JpcHRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGFza0Rlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4Y2VhMWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UYXNrRGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRhc2tEZXNjcmlwdG9ySW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzayBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRUYXNrIDxlbT5UYXNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSA8ZW0+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRBc3Npc3RlZEJ5IDxlbT5Bc3Npc3RlZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0RXh0ZXJuYWxJbnB1dCA8ZW0+RXh0ZXJuYWwgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldE1hbmRhdG9yeUlucHV0IDxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0U3RlcCA8ZW0+U3RlcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdG9ySW1wbCBleHRlbmRzIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRhc2tEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFzaygpIDxlbT5UYXNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhc2soKSA8ZW0+VGFzazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0YXNrID0gVEFTS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpIDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSRk9STUVEX1BSSU1BUklMWV9CWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpIDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwZXJmb3JtZWRQcmltYXJpbHlCeSA9IFBFUkZPUk1FRF9QUklNQVJJTFlfQllfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0ZXAoKSA8ZW0+U3RlcDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc3RlcCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2UgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrRGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhc2soKSB7Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhc2soU3RyaW5nIG5ld1Rhc2spIHsKLQkJU3RyaW5nIG9sZFRhc2sgPSB0YXNrOwotCQl0YXNrID0gbmV3VGFzazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0ssIG9sZFRhc2ssIHRhc2spKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkgewotCQlyZXR1cm4gcGVyZm9ybWVkUHJpbWFyaWx5Qnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoU3RyaW5nIG5ld1BlcmZvcm1lZFByaW1hcmlseUJ5KSB7Ci0JCVN0cmluZyBvbGRQZXJmb3JtZWRQcmltYXJpbHlCeSA9IHBlcmZvcm1lZFByaW1hcmlseUJ5OwotCQlwZXJmb3JtZWRQcmltYXJpbHlCeSA9IG5ld1BlcmZvcm1lZFByaW1hcmlseUJ5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSwgb2xkUGVyZm9ybWVkUHJpbWFyaWx5QnksIHBlcmZvcm1lZFByaW1hcmlseUJ5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBc3Npc3RlZEJ5KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEV4dGVybmFsSW5wdXQoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWFuZGF0b3J5SW5wdXQoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE9wdGlvbmFsSW5wdXQoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0T3V0cHV0KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19PVVRQVVQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRTdGVwKCkgewotCQlpZiAoc3RlcCA9PSBudWxsKSB7Ci0JCQlzdGVwID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlY3Rpb24uY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TVEVQKTsKLQkJfQotCQlyZXR1cm4gc3RlcDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIHsKLQkJcmV0dXJuIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoYm9vbGVhbiBuZXdJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpIHsKLQkJYm9vbGVhbiBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JCWlzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IG5ld0lzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQkJYm9vbGVhbiBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0ID0gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldDsKLQkJaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UsIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSwgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlLCAhb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlib29sZWFuIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQkJYm9vbGVhbiBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0ID0gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldDsKLQkJaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUOwotCQlpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSwgb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlLCBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQsIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIHsKLQkJcmV0dXJuIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1NURVA6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTdGVwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSzoKLQkJCQlyZXR1cm4gZ2V0VGFzaygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLQkJCQlyZXR1cm4gZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCXJldHVybiBnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQkJcmV0dXJuIGdldEFzc2lzdGVkQnkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUOgotCQkJCXJldHVybiBnZXRFeHRlcm5hbElucHV0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJcmV0dXJuIGdldE1hbmRhdG9yeUlucHV0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCQlyZXR1cm4gZ2V0T3B0aW9uYWxJbnB1dCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotCQkJCXJldHVybiBnZXRPdXRwdXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1NURVA6Ci0JCQkJcmV0dXJuIGdldFN0ZXAoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCQlyZXR1cm4gaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0s6Ci0JCQkJc2V0VGFzaygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotCQkJCXNldFBlcmZvcm1lZFByaW1hcmlseUJ5KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQlnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmNsZWFyKCk7Ci0JCQkJZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZOgotCQkJCWdldEFzc2lzdGVkQnkoKS5jbGVhcigpOwotCQkJCWdldEFzc2lzdGVkQnkoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUOgotCQkJCWdldEV4dGVybmFsSW5wdXQoKS5jbGVhcigpOwotCQkJCWdldEV4dGVybmFsSW5wdXQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQlnZXRNYW5kYXRvcnlJbnB1dCgpLmNsZWFyKCk7Ci0JCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJCWdldE9wdGlvbmFsSW5wdXQoKS5jbGVhcigpOwotCQkJCWdldE9wdGlvbmFsSW5wdXQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCQlnZXRPdXRwdXQoKS5jbGVhcigpOwotCQkJCWdldE91dHB1dCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fU1RFUDoKLQkJCQlnZXRTdGVwKCkuY2xlYXIoKTsKLQkJCQlnZXRTdGVwKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJCXNldFRhc2soVEFTS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLQkJCQlzZXRQZXJmb3JtZWRQcmltYXJpbHlCeShQRVJGT1JNRURfUFJJTUFSSUxZX0JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWToKLQkJCQlnZXRBc3Npc3RlZEJ5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJCQlnZXRFeHRlcm5hbElucHV0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJCWdldE9wdGlvbmFsSW5wdXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCQlnZXRPdXRwdXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1NURVA6Ci0JCQkJZ2V0U3RlcCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJCXVuc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJCXJldHVybiBUQVNLX0VERUZBVUxUID09IG51bGwgPyB0YXNrICE9IG51bGwgOiAhVEFTS19FREVGQVVMVC5lcXVhbHModGFzayk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotCQkJCXJldHVybiBQRVJGT1JNRURfUFJJTUFSSUxZX0JZX0VERUZBVUxUID09IG51bGwgPyBwZXJmb3JtZWRQcmltYXJpbHlCeSAhPSBudWxsIDogIVBFUkZPUk1FRF9QUklNQVJJTFlfQllfRURFRkFVTFQuZXF1YWxzKHBlcmZvcm1lZFByaW1hcmlseUJ5KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCXJldHVybiAhZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWToKLQkJCQlyZXR1cm4gIWdldEFzc2lzdGVkQnkoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJCQlyZXR1cm4gIWdldEV4dGVybmFsSW5wdXQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJcmV0dXJuICFnZXRNYW5kYXRvcnlJbnB1dCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJCXJldHVybiAhZ2V0T3B0aW9uYWxJbnB1dCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCQlyZXR1cm4gIWdldE91dHB1dCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1NURVA6Ci0JCQkJcmV0dXJuIHN0ZXAgIT0gbnVsbCAmJiAhc3RlcC5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0YXNrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0YXNrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwZXJmb3JtZWRQcmltYXJpbHlCeTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGVyZm9ybWVkUHJpbWFyaWx5QnkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U6ICIpOwotCQlpZiAoaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCkgcmVzdWx0LmFwcGVuZChpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVGFza0Rlc2NyaXB0b3JJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UYXNrSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UYXNrSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNzk2Y2ZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGFza0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRhc2tJbXBsLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwjZ2V0UGVyZm9ybWVkQnkgPGVtPlBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldEVzdGltYXRlIDxlbT5Fc3RpbWF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwjZ2V0VG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrSW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRhc2sgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVjb25kaXRpb24oKSA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUNPTkRJVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVjb25kaXRpb24oKSA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJlY29uZGl0aW9uID0gUFJFQ09ORElUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3Rjb25kaXRpb24oKSA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9TVENPTkRJVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Y29uZGl0aW9uKCkgPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcG9zdGNvbmRpdGlvbiA9IFBPU1RDT05ESVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyZm9ybWVkQnkoKSA8ZW0+UGVyZm9ybWVkIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJmb3JtZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSRk9STUVEX0JZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmZvcm1lZEJ5KCkgPGVtPlBlcmZvcm1lZCBCeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyZm9ybWVkQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGVyZm9ybWVkQnkgPSBQRVJGT1JNRURfQllfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTSzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVjb25kaXRpb24oU3RyaW5nIG5ld1ByZWNvbmRpdGlvbikgewotCQlTdHJpbmcgb2xkUHJlY29uZGl0aW9uID0gcHJlY29uZGl0aW9uOwotCQlwcmVjb25kaXRpb24gPSBuZXdQcmVjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OLCBvbGRQcmVjb25kaXRpb24sIHByZWNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9zdGNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHBvc3Rjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdGNvbmRpdGlvbihTdHJpbmcgbmV3UG9zdGNvbmRpdGlvbikgewotCQlTdHJpbmcgb2xkUG9zdGNvbmRpdGlvbiA9IHBvc3Rjb25kaXRpb247Ci0JCXBvc3Rjb25kaXRpb24gPSBuZXdQb3N0Y29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT04sIG9sZFBvc3Rjb25kaXRpb24sIHBvc3Rjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBlcmZvcm1lZEJ5KCkgewotCQlyZXR1cm4gcGVyZm9ybWVkQnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVyZm9ybWVkQnkoU3RyaW5nIG5ld1BlcmZvcm1lZEJ5KSB7Ci0JCVN0cmluZyBvbGRQZXJmb3JtZWRCeSA9IHBlcmZvcm1lZEJ5OwotCQlwZXJmb3JtZWRCeSA9IG5ld1BlcmZvcm1lZEJ5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRBU0tfX1BFUkZPUk1FRF9CWSwgb2xkUGVyZm9ybWVkQnksIHBlcmZvcm1lZEJ5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5UQVNLX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1hbmRhdG9yeUlucHV0KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fTUFOREFUT1JZX0lOUFVUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0T3V0cHV0KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fT1VUUFVUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0T3B0aW9uYWxJbnB1dCgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX09QVElPTkFMX0lOUFVUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXN0aW1hdGUoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19FU1RJTUFURSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUb29sTWVudG9yKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fVE9PTF9NRU5UT1IpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBnZXRQcmVjb25kaXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBnZXRQb3N0Y29uZGl0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUEVSRk9STUVEX0JZOgotCQkJCXJldHVybiBnZXRQZXJmb3JtZWRCeSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fTUFOREFUT1JZX0lOUFVUOgotCQkJCXJldHVybiBnZXRNYW5kYXRvcnlJbnB1dCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVDoKLQkJCQlyZXR1cm4gZ2V0T3V0cHV0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQlyZXR1cm4gZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PUFRJT05BTF9JTlBVVDoKLQkJCQlyZXR1cm4gZ2V0T3B0aW9uYWxJbnB1dCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRFOgotCQkJCXJldHVybiBnZXRFc3RpbWF0ZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1RPT0xfTUVOVE9SOgotCQkJCXJldHVybiBnZXRUb29sTWVudG9yKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQkJc2V0UHJlY29uZGl0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOgotCQkJCXNldFBvc3Rjb25kaXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BFUkZPUk1FRF9CWToKLQkJCQlzZXRQZXJmb3JtZWRCeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fTUFOREFUT1JZX0lOUFVUOgotCQkJCWdldE1hbmRhdG9yeUlucHV0KCkuY2xlYXIoKTsKLQkJCQlnZXRNYW5kYXRvcnlJbnB1dCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVDoKLQkJCQlnZXRPdXRwdXQoKS5jbGVhcigpOwotCQkJCWdldE91dHB1dCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQkJZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5jbGVhcigpOwotCQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1BUSU9OQUxfSU5QVVQ6Ci0JCQkJZ2V0T3B0aW9uYWxJbnB1dCgpLmNsZWFyKCk7Ci0JCQkJZ2V0T3B0aW9uYWxJbnB1dCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRFOgotCQkJCWdldEVzdGltYXRlKCkuY2xlYXIoKTsKLQkJCQlnZXRFc3RpbWF0ZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19UT09MX01FTlRPUjoKLQkJCQlnZXRUb29sTWVudG9yKCkuY2xlYXIoKTsKLQkJCQlnZXRUb29sTWVudG9yKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjoKLQkJCQlzZXRQcmVjb25kaXRpb24oUFJFQ09ORElUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTjoKLQkJCQlzZXRQb3N0Y29uZGl0aW9uKFBPU1RDT05ESVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QRVJGT1JNRURfQlk6Ci0JCQkJc2V0UGVyZm9ybWVkQnkoUEVSRk9STUVEX0JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQlnZXRNYW5kYXRvcnlJbnB1dCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVDoKLQkJCQlnZXRPdXRwdXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1BUSU9OQUxfSU5QVVQ6Ci0JCQkJZ2V0T3B0aW9uYWxJbnB1dCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRFOgotCQkJCWdldEVzdGltYXRlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19UT09MX01FTlRPUjoKLQkJCQlnZXRUb29sTWVudG9yKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIFBSRUNPTkRJVElPTl9FREVGQVVMVCA9PSBudWxsID8gcHJlY29uZGl0aW9uICE9IG51bGwgOiAhUFJFQ09ORElUSU9OX0VERUZBVUxULmVxdWFscyhwcmVjb25kaXRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIFBPU1RDT05ESVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHBvc3Rjb25kaXRpb24gIT0gbnVsbCA6ICFQT1NUQ09ORElUSU9OX0VERUZBVUxULmVxdWFscyhwb3N0Y29uZGl0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QRVJGT1JNRURfQlk6Ci0JCQkJcmV0dXJuIFBFUkZPUk1FRF9CWV9FREVGQVVMVCA9PSBudWxsID8gcGVyZm9ybWVkQnkgIT0gbnVsbCA6ICFQRVJGT1JNRURfQllfRURFRkFVTFQuZXF1YWxzKHBlcmZvcm1lZEJ5KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQlyZXR1cm4gIWdldE1hbmRhdG9yeUlucHV0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVDoKLQkJCQlyZXR1cm4gIWdldE91dHB1dCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCXJldHVybiAhZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1BUSU9OQUxfSU5QVVQ6Ci0JCQkJcmV0dXJuICFnZXRPcHRpb25hbElucHV0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRFOgotCQkJCXJldHVybiAhZ2V0RXN0aW1hdGUoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCQlyZXR1cm4gIWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19UT09MX01FTlRPUjoKLQkJCQlyZXR1cm4gIWdldFRvb2xNZW50b3IoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwcmVjb25kaXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZWNvbmRpdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcG9zdGNvbmRpdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocG9zdGNvbmRpdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGVyZm9ybWVkQnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBlcmZvcm1lZEJ5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Rhc2tJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UZWFtUHJvZmlsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGVhbVByb2ZpbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwZTIxY2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UZWFtUHJvZmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRlYW1Qcm9maWxlSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVhbSBQcm9maWxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbCNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwjZ2V0Um9sZSA8ZW0+Um9sZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwjZ2V0U3VwZXJUZWFtIDxlbT5TdXBlciBUZWFtPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbCNnZXRTdWJUZWFtIDxlbT5TdWIgVGVhbTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRlYW1Qcm9maWxlSW1wbCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJbXBsIGltcGxlbWVudHMgVGVhbVByb2ZpbGUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMSgpIDxlbT5Hcm91cDE8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAxKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDEgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRlYW1Qcm9maWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVBTV9QUk9GSUxFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMSgpIHsKLQkJaWYgKGdyb3VwMSA9PSBudWxsKSB7Ci0JCQlncm91cDEgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19HUk9VUDEpOwotCQl9Ci0JCXJldHVybiBncm91cDE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJvbGUoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAxKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5URUFNX1BST0ZJTEVfX1JPTEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRTdXBlclRlYW0oKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAxKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRTdWJUZWFtKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMSgpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVBTV9QUk9GSUxFX19TVUJfVEVBTSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fR1JPVVAxOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAxKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fR1JPVVAxOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMSgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1JPTEU6Ci0JCQkJcmV0dXJuIGdldFJvbGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU06Ci0JCQkJcmV0dXJuIGdldFN1cGVyVGVhbSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQkJcmV0dXJuIGdldFN1YlRlYW0oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fR1JPVVAxOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDEoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19ST0xFOgotCQkJCWdldFJvbGUoKS5jbGVhcigpOwotCQkJCWdldFJvbGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU06Ci0JCQkJZ2V0U3VwZXJUZWFtKCkuY2xlYXIoKTsKLQkJCQlnZXRTdXBlclRlYW0oKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNOgotCQkJCWdldFN1YlRlYW0oKS5jbGVhcigpOwotCQkJCWdldFN1YlRlYW0oKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19HUk9VUDE6Ci0JCQkJZ2V0R3JvdXAxKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19ST0xFOgotCQkJCWdldFJvbGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU06Ci0JCQkJZ2V0U3VwZXJUZWFtKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTToKLQkJCQlnZXRTdWJUZWFtKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX0dST1VQMToKLQkJCQlyZXR1cm4gZ3JvdXAxICE9IG51bGwgJiYgIWdyb3VwMS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19ST0xFOgotCQkJCXJldHVybiAhZ2V0Um9sZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU06Ci0JCQkJcmV0dXJuICFnZXRTdXBlclRlYW0oKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTToKLQkJCQlyZXR1cm4gIWdldFN1YlRlYW0oKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDE6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1RlYW1Qcm9maWxlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGVtcGxhdGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1RlbXBsYXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ODUzNzEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGVtcGxhdGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRlbXBsYXRlSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZW1wbGF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRlbXBsYXRlSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFRlbXBsYXRlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVtcGxhdGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5URU1QTEFURTsKLQl9Ci0KLX0gLy9UZW1wbGF0ZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rlcm1EZWZpbml0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UZXJtRGVmaW5pdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmI1MGJjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rlcm1EZWZpbml0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUZXJtRGVmaW5pdGlvbkltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVybSBEZWZpbml0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGVybURlZmluaXRpb25JbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgVGVybURlZmluaXRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUZXJtRGVmaW5pdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRFUk1fREVGSU5JVElPTjsKLQl9Ci0KLX0gLy9UZXJtRGVmaW5pdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rvb2xJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rvb2xJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkNDgyZmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Ub29sSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVG9vbEltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VG9vbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Ub29sSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Ub29sSW1wbCNnZXRUb29sTWVudG9yIDxlbT5Ub29sIE1lbnRvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRvb2xJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIFRvb2wgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDIgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRvb2xJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UT09MOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuVE9PTF9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUb29sTWVudG9yKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVE9PTF9fVE9PTF9NRU5UT1IpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UT09MX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UT09MX19UT09MX01FTlRPUjoKLQkJCQlyZXR1cm4gZ2V0VG9vbE1lbnRvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fVE9PTF9NRU5UT1I6Ci0JCQkJZ2V0VG9vbE1lbnRvcigpLmNsZWFyKCk7Ci0JCQkJZ2V0VG9vbE1lbnRvcigpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UT09MX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fVE9PTF9NRU5UT1I6Ci0JCQkJZ2V0VG9vbE1lbnRvcigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UT09MX19UT09MX01FTlRPUjoKLQkJCQlyZXR1cm4gIWdldFRvb2xNZW50b3IoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Rvb2xJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Ub29sTWVudG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Ub29sTWVudG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNjMzYTg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVG9vbE1lbnRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVG9vbE1lbnRvckltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRvb2xNZW50b3JJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgVG9vbE1lbnRvciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRvb2xNZW50b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UT09MX01FTlRPUjsKLQl9Ci0KLX0gLy9Ub29sTWVudG9ySW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVW1hRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVW1hRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGFhYjdkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1VtYUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVW1hRmFjdG9yeUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpbmdNZXRyaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBhY2thZ2VhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW1hRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBVbWFGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBVbWFGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlVbWFGYWN0b3J5IHRoZVVtYUZhY3RvcnkgPSAoVW1hRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIik7IAotCQkJaWYgKHRoZVVtYUZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVVbWFGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IFVtYUZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUFjdGl2aXR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1Q6IHJldHVybiAoRU9iamVjdCljcmVhdGVBcnRpZmFjdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQnJlYWtkb3duRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ0FQQUJJTElUWV9QQVRURVJOOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DSEVDS0xJU1Q6IHJldHVybiAoRU9iamVjdCljcmVhdGVDaGVja2xpc3QoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNvbXBvc2l0ZVJvbGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05DRVBUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29uY2VwdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVDb25zdHJhaW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNvbnRlbnRDYXRlZ29yeSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29udGVudEVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0U6IHJldHVybiAoRU9iamVjdCljcmVhdGVDb250ZW50UGFja2FnZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUN1c3RvbUNhdGVnb3J5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVEZWxpdmVyYWJsZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1M6IHJldHVybiAoRU9iamVjdCljcmVhdGVEZWxpdmVyeVByb2Nlc3MoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGVzY3JpYmFibGVFbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURlc2NyaXB0b3IoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURpc2NpcGxpbmUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURvY3VtZW50Um9vdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURvbWFpbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVMRU1FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVFbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVFc3RpbWF0ZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRJTkdfTUVUUklDOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRXN0aW1hdGluZ01ldHJpYygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM6IHJldHVybiAoRU9iamVjdCljcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5FWEFNUExFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRXhhbXBsZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlR3VpZGFuY2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5HVUlERUxJTkU6IHJldHVybiAoRU9iamVjdCljcmVhdGVHdWlkZWxpbmUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5JVEVSQVRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVJdGVyYXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1ldGhvZEVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1ldGhvZExpYnJhcnkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1ldGhvZFBhY2thZ2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVNZXRob2RVbml0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUlMRVNUT05FOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTWlsZXN0b25lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU5hbWVkRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk9VVENPTUU6IHJldHVybiAoRU9iamVjdCljcmVhdGVPdXRjb21lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUEFDS0FHRUFCTEVfRUxFTUVOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVBhY2thZ2VhYmxlRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBIQVNFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUGhhc2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUGxhbm5pbmdEYXRhKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0U6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcmFjdGljZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1M6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcm9jZXNzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcm9jZXNzQ29tcG9uZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0VMRU1FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcm9jZXNzRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUkVQT1JUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUmVwb3J0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUkVVU0FCTEVfQVNTRVQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVSZXVzYWJsZUFzc2V0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9BRE1BUDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJvYWRtYXAoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUm9sZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVSb2xlRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVSb2xlRGVzY3JpcHRvcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUm9sZVNldCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUm9sZVNldEdyb3VwaW5nKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVNlY3Rpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5TVVBQT1JUSU5HX01BVEVSSUFMOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTSzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVRhc2soKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVGFza0Rlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVGFza0Rlc2NyaXB0b3IoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVUZWFtUHJvZmlsZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFTVBMQVRFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVGVtcGxhdGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URVJNX0RFRklOSVRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVUZXJtRGVmaW5pdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0w6IHJldHVybiAoRU9iamVjdCljcmVhdGVUb29sKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9NRU5UT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVUb29sTWVudG9yKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV0hJVEVQQVBFUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdoaXRlcGFwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVXb3JrRGVmaW5pdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVI6IHJldHVybiAoRU9iamVjdCljcmVhdGVXb3JrT3JkZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1Q6IHJldHVybiAoRU9iamVjdCljcmVhdGVXb3JrUHJvZHVjdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVZhcmlhYmlsaXR5VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlV29ya09yZGVyVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjcmVhdGVWYXJpYWJpbGl0eVR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjcmVhdGVXb3JrT3JkZXJUeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRWYXJpYWJpbGl0eVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFdvcmtPcmRlclR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjb252ZXJ0VmFyaWFiaWxpdHlUeXBlT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjb252ZXJ0V29ya09yZGVyVHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHkgY3JlYXRlQWN0aXZpdHkoKSB7Ci0JCUFjdGl2aXR5SW1wbCBhY3Rpdml0eSA9IG5ldyBBY3Rpdml0eUltcGwoKTsKLQkJcmV0dXJuIGFjdGl2aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURlc2NyaXB0aW9uIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oKSB7Ci0JCUFjdGl2aXR5RGVzY3JpcHRpb25JbXBsIGFjdGl2aXR5RGVzY3JpcHRpb24gPSBuZXcgQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGFjdGl2aXR5RGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KCkgewotCQlBcnRpZmFjdEltcGwgYXJ0aWZhY3QgPSBuZXcgQXJ0aWZhY3RJbXBsKCk7Ci0JCXJldHVybiBhcnRpZmFjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3REZXNjcmlwdGlvbiBjcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uKCkgewotCQlBcnRpZmFjdERlc2NyaXB0aW9uSW1wbCBhcnRpZmFjdERlc2NyaXB0aW9uID0gbmV3IEFydGlmYWN0RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBhcnRpZmFjdERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50IGNyZWF0ZUJyZWFrZG93bkVsZW1lbnQoKSB7Ci0JCUJyZWFrZG93bkVsZW1lbnRJbXBsIGJyZWFrZG93bkVsZW1lbnQgPSBuZXcgQnJlYWtkb3duRWxlbWVudEltcGwoKTsKLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSB7Ci0JCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwgYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uID0gbmV3IEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ2FwYWJpbGl0eVBhdHRlcm4gY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oKSB7Ci0JCUNhcGFiaWxpdHlQYXR0ZXJuSW1wbCBjYXBhYmlsaXR5UGF0dGVybiA9IG5ldyBDYXBhYmlsaXR5UGF0dGVybkltcGwoKTsKLQkJcmV0dXJuIGNhcGFiaWxpdHlQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDaGVja2xpc3QgY3JlYXRlQ2hlY2tsaXN0KCkgewotCQlDaGVja2xpc3RJbXBsIGNoZWNrbGlzdCA9IG5ldyBDaGVja2xpc3RJbXBsKCk7Ci0JCXJldHVybiBjaGVja2xpc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBvc2l0ZVJvbGUgY3JlYXRlQ29tcG9zaXRlUm9sZSgpIHsKLQkJQ29tcG9zaXRlUm9sZUltcGwgY29tcG9zaXRlUm9sZSA9IG5ldyBDb21wb3NpdGVSb2xlSW1wbCgpOwotCQlyZXR1cm4gY29tcG9zaXRlUm9sZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uY2VwdCBjcmVhdGVDb25jZXB0KCkgewotCQlDb25jZXB0SW1wbCBjb25jZXB0ID0gbmV3IENvbmNlcHRJbXBsKCk7Ci0JCXJldHVybiBjb25jZXB0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGNyZWF0ZUNvbnN0cmFpbnQoKSB7Ci0JCUNvbnN0cmFpbnRJbXBsIGNvbnN0cmFpbnQgPSBuZXcgQ29uc3RyYWludEltcGwoKTsKLQkJcmV0dXJuIGNvbnN0cmFpbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnRDYXRlZ29yeSBjcmVhdGVDb250ZW50Q2F0ZWdvcnkoKSB7Ci0JCUNvbnRlbnRDYXRlZ29yeUltcGwgY29udGVudENhdGVnb3J5ID0gbmV3IENvbnRlbnRDYXRlZ29yeUltcGwoKTsKLQkJcmV0dXJuIGNvbnRlbnRDYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudENhdGVnb3J5UGFja2FnZSBjcmVhdGVDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCkgewotCQlDb250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbCBjb250ZW50Q2F0ZWdvcnlQYWNrYWdlID0gbmV3IENvbnRlbnRDYXRlZ29yeVBhY2thZ2VJbXBsKCk7Ci0JCXJldHVybiBjb250ZW50Q2F0ZWdvcnlQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50RGVzY3JpcHRpb24gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKCkgewotCQlDb250ZW50RGVzY3JpcHRpb25JbXBsIGNvbnRlbnREZXNjcmlwdGlvbiA9IG5ldyBDb250ZW50RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBjb250ZW50RGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnRFbGVtZW50IGNyZWF0ZUNvbnRlbnRFbGVtZW50KCkgewotCQlDb250ZW50RWxlbWVudEltcGwgY29udGVudEVsZW1lbnQgPSBuZXcgQ29udGVudEVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBjb250ZW50RWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudFBhY2thZ2UgY3JlYXRlQ29udGVudFBhY2thZ2UoKSB7Ci0JCUNvbnRlbnRQYWNrYWdlSW1wbCBjb250ZW50UGFja2FnZSA9IG5ldyBDb250ZW50UGFja2FnZUltcGwoKTsKLQkJcmV0dXJuIGNvbnRlbnRQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeSBjcmVhdGVDdXN0b21DYXRlZ29yeSgpIHsKLQkJQ3VzdG9tQ2F0ZWdvcnlJbXBsIGN1c3RvbUNhdGVnb3J5ID0gbmV3IEN1c3RvbUNhdGVnb3J5SW1wbCgpOwotCQlyZXR1cm4gY3VzdG9tQ2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJhYmxlIGNyZWF0ZURlbGl2ZXJhYmxlKCkgewotCQlEZWxpdmVyYWJsZUltcGwgZGVsaXZlcmFibGUgPSBuZXcgRGVsaXZlcmFibGVJbXBsKCk7Ci0JCXJldHVybiBkZWxpdmVyYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkgewotCQlEZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCBkZWxpdmVyYWJsZURlc2NyaXB0aW9uID0gbmV3IERlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBkZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyeVByb2Nlc3MgY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCkgewotCQlEZWxpdmVyeVByb2Nlc3NJbXBsIGRlbGl2ZXJ5UHJvY2VzcyA9IG5ldyBEZWxpdmVyeVByb2Nlc3NJbXBsKCk7Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkgewotCQlEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gPSBuZXcgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpYmFibGVFbGVtZW50IGNyZWF0ZURlc2NyaWJhYmxlRWxlbWVudCgpIHsKLQkJRGVzY3JpYmFibGVFbGVtZW50SW1wbCBkZXNjcmliYWJsZUVsZW1lbnQgPSBuZXcgRGVzY3JpYmFibGVFbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gZGVzY3JpYmFibGVFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmlwdG9yIGNyZWF0ZURlc2NyaXB0b3IoKSB7Ci0JCURlc2NyaXB0b3JJbXBsIGRlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvckltcGwoKTsKLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JEZXNjcmlwdGlvbiBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb24oKSB7Ci0JCURlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwgZGVzY3JpcHRvckRlc2NyaXB0aW9uID0gbmV3IERlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZSBjcmVhdGVEaXNjaXBsaW5lKCkgewotCQlEaXNjaXBsaW5lSW1wbCBkaXNjaXBsaW5lID0gbmV3IERpc2NpcGxpbmVJbXBsKCk7Ci0JCXJldHVybiBkaXNjaXBsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lR3JvdXBpbmcgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCkgewotCQlEaXNjaXBsaW5lR3JvdXBpbmdJbXBsIGRpc2NpcGxpbmVHcm91cGluZyA9IG5ldyBEaXNjaXBsaW5lR3JvdXBpbmdJbXBsKCk7Ci0JCXJldHVybiBkaXNjaXBsaW5lR3JvdXBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvY3VtZW50Um9vdCBjcmVhdGVEb2N1bWVudFJvb3QoKSB7Ci0JCURvY3VtZW50Um9vdEltcGwgZG9jdW1lbnRSb290ID0gbmV3IERvY3VtZW50Um9vdEltcGwoKTsKLQkJcmV0dXJuIGRvY3VtZW50Um9vdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG9tYWluIGNyZWF0ZURvbWFpbigpIHsKLQkJRG9tYWluSW1wbCBkb21haW4gPSBuZXcgRG9tYWluSW1wbCgpOwotCQlyZXR1cm4gZG9tYWluOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKSB7Ci0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSBuZXcgRWxlbWVudEltcGwoKTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVzdGltYXRlIGNyZWF0ZUVzdGltYXRlKCkgewotCQlFc3RpbWF0ZUltcGwgZXN0aW1hdGUgPSBuZXcgRXN0aW1hdGVJbXBsKCk7Ci0JCXJldHVybiBlc3RpbWF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXN0aW1hdGluZ01ldHJpYyBjcmVhdGVFc3RpbWF0aW5nTWV0cmljKCkgewotCQlFc3RpbWF0aW5nTWV0cmljSW1wbCBlc3RpbWF0aW5nTWV0cmljID0gbmV3IEVzdGltYXRpbmdNZXRyaWNJbXBsKCk7Ci0JCXJldHVybiBlc3RpbWF0aW5nTWV0cmljOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsIGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA9IG5ldyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsKCk7Ci0JCXJldHVybiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4YW1wbGUgY3JlYXRlRXhhbXBsZSgpIHsKLQkJRXhhbXBsZUltcGwgZXhhbXBsZSA9IG5ldyBFeGFtcGxlSW1wbCgpOwotCQlyZXR1cm4gZXhhbXBsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2UgY3JlYXRlR3VpZGFuY2UoKSB7Ci0JCUd1aWRhbmNlSW1wbCBndWlkYW5jZSA9IG5ldyBHdWlkYW5jZUltcGwoKTsKLQkJcmV0dXJuIGd1aWRhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHdWlkYW5jZURlc2NyaXB0aW9uIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb24oKSB7Ci0JCUd1aWRhbmNlRGVzY3JpcHRpb25JbXBsIGd1aWRhbmNlRGVzY3JpcHRpb24gPSBuZXcgR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGd1aWRhbmNlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEd1aWRlbGluZSBjcmVhdGVHdWlkZWxpbmUoKSB7Ci0JCUd1aWRlbGluZUltcGwgZ3VpZGVsaW5lID0gbmV3IEd1aWRlbGluZUltcGwoKTsKLQkJcmV0dXJuIGd1aWRlbGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSXRlcmF0aW9uIGNyZWF0ZUl0ZXJhdGlvbigpIHsKLQkJSXRlcmF0aW9uSW1wbCBpdGVyYXRpb24gPSBuZXcgSXRlcmF0aW9uSW1wbCgpOwotCQlyZXR1cm4gaXRlcmF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb25JbXBsIG1ldGhvZENvbmZpZ3VyYXRpb24gPSBuZXcgTWV0aG9kQ29uZmlndXJhdGlvbkltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZENvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgY3JlYXRlTWV0aG9kRWxlbWVudCgpIHsKLQkJTWV0aG9kRWxlbWVudEltcGwgbWV0aG9kRWxlbWVudCA9IG5ldyBNZXRob2RFbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gbWV0aG9kRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBjcmVhdGVNZXRob2RMaWJyYXJ5KCkgewotCQlNZXRob2RMaWJyYXJ5SW1wbCBtZXRob2RMaWJyYXJ5ID0gbmV3IE1ldGhvZExpYnJhcnlJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RMaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RQYWNrYWdlIGNyZWF0ZU1ldGhvZFBhY2thZ2UoKSB7Ci0JCU1ldGhvZFBhY2thZ2VJbXBsIG1ldGhvZFBhY2thZ2UgPSBuZXcgTWV0aG9kUGFja2FnZUltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZFBsdWdpbiBjcmVhdGVNZXRob2RQbHVnaW4oKSB7Ci0JCU1ldGhvZFBsdWdpbkltcGwgbWV0aG9kUGx1Z2luID0gbmV3IE1ldGhvZFBsdWdpbkltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZFBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kVW5pdCBjcmVhdGVNZXRob2RVbml0KCkgewotCQlNZXRob2RVbml0SW1wbCBtZXRob2RVbml0ID0gbmV3IE1ldGhvZFVuaXRJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RVbml0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNaWxlc3RvbmUgY3JlYXRlTWlsZXN0b25lKCkgewotCQlNaWxlc3RvbmVJbXBsIG1pbGVzdG9uZSA9IG5ldyBNaWxlc3RvbmVJbXBsKCk7Ci0JCXJldHVybiBtaWxlc3RvbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5hbWVkRWxlbWVudCBjcmVhdGVOYW1lZEVsZW1lbnQoKSB7Ci0JCU5hbWVkRWxlbWVudEltcGwgbmFtZWRFbGVtZW50ID0gbmV3IE5hbWVkRWxlbWVudEltcGwoKTsKLQkJcmV0dXJuIG5hbWVkRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3V0Y29tZSBjcmVhdGVPdXRjb21lKCkgewotCQlPdXRjb21lSW1wbCBvdXRjb21lID0gbmV3IE91dGNvbWVJbXBsKCk7Ci0JCXJldHVybiBvdXRjb21lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYWNrYWdlYWJsZUVsZW1lbnQgY3JlYXRlUGFja2FnZWFibGVFbGVtZW50KCkgewotCQlQYWNrYWdlYWJsZUVsZW1lbnRJbXBsIHBhY2thZ2VhYmxlRWxlbWVudCA9IG5ldyBQYWNrYWdlYWJsZUVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBwYWNrYWdlYWJsZUVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBoYXNlIGNyZWF0ZVBoYXNlKCkgewotCQlQaGFzZUltcGwgcGhhc2UgPSBuZXcgUGhhc2VJbXBsKCk7Ci0JCXJldHVybiBwaGFzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGxhbm5pbmdEYXRhIGNyZWF0ZVBsYW5uaW5nRGF0YSgpIHsKLQkJUGxhbm5pbmdEYXRhSW1wbCBwbGFubmluZ0RhdGEgPSBuZXcgUGxhbm5pbmdEYXRhSW1wbCgpOwotCQlyZXR1cm4gcGxhbm5pbmdEYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcmFjdGljZSBjcmVhdGVQcmFjdGljZSgpIHsKLQkJUHJhY3RpY2VJbXBsIHByYWN0aWNlID0gbmV3IFByYWN0aWNlSW1wbCgpOwotCQlyZXR1cm4gcHJhY3RpY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByYWN0aWNlRGVzY3JpcHRpb24gY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbigpIHsKLQkJUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwgcHJhY3RpY2VEZXNjcmlwdGlvbiA9IG5ldyBQcmFjdGljZURlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gcHJhY3RpY2VEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBjcmVhdGVQcm9jZXNzKCkgewotCQlQcm9jZXNzSW1wbCBwcm9jZXNzID0gbmV3IFByb2Nlc3NJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50IGNyZWF0ZVByb2Nlc3NDb21wb25lbnQoKSB7Ci0JCVByb2Nlc3NDb21wb25lbnRJbXBsIHByb2Nlc3NDb21wb25lbnQgPSBuZXcgUHJvY2Vzc0NvbXBvbmVudEltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpIHsKLQkJUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSA9IG5ldyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0Rlc2NyaXB0aW9uIGNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbigpIHsKLQkJUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCBwcm9jZXNzRGVzY3JpcHRpb24gPSBuZXcgUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc0Rlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzRWxlbWVudCBjcmVhdGVQcm9jZXNzRWxlbWVudCgpIHsKLQkJUHJvY2Vzc0VsZW1lbnRJbXBsIHByb2Nlc3NFbGVtZW50ID0gbmV3IFByb2Nlc3NFbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc0VsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlIGNyZWF0ZVByb2Nlc3NQYWNrYWdlKCkgewotCQlQcm9jZXNzUGFja2FnZUltcGwgcHJvY2Vzc1BhY2thZ2UgPSBuZXcgUHJvY2Vzc1BhY2thZ2VJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSB7Ci0JCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbCBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSA9IG5ldyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXBvcnQgY3JlYXRlUmVwb3J0KCkgewotCQlSZXBvcnRJbXBsIHJlcG9ydCA9IG5ldyBSZXBvcnRJbXBsKCk7Ci0JCXJldHVybiByZXBvcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJldXNhYmxlQXNzZXQgY3JlYXRlUmV1c2FibGVBc3NldCgpIHsKLQkJUmV1c2FibGVBc3NldEltcGwgcmV1c2FibGVBc3NldCA9IG5ldyBSZXVzYWJsZUFzc2V0SW1wbCgpOwotCQlyZXR1cm4gcmV1c2FibGVBc3NldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9hZG1hcCBjcmVhdGVSb2FkbWFwKCkgewotCQlSb2FkbWFwSW1wbCByb2FkbWFwID0gbmV3IFJvYWRtYXBJbXBsKCk7Ci0JCXJldHVybiByb2FkbWFwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlIGNyZWF0ZVJvbGUoKSB7Ci0JCVJvbGVJbXBsIHJvbGUgPSBuZXcgUm9sZUltcGwoKTsKLQkJcmV0dXJuIHJvbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdGlvbiBjcmVhdGVSb2xlRGVzY3JpcHRpb24oKSB7Ci0JCVJvbGVEZXNjcmlwdGlvbkltcGwgcm9sZURlc2NyaXB0aW9uID0gbmV3IFJvbGVEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHJvbGVEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZURlc2NyaXB0b3IgY3JlYXRlUm9sZURlc2NyaXB0b3IoKSB7Ci0JCVJvbGVEZXNjcmlwdG9ySW1wbCByb2xlRGVzY3JpcHRvciA9IG5ldyBSb2xlRGVzY3JpcHRvckltcGwoKTsKLQkJcmV0dXJuIHJvbGVEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlU2V0IGNyZWF0ZVJvbGVTZXQoKSB7Ci0JCVJvbGVTZXRJbXBsIHJvbGVTZXQgPSBuZXcgUm9sZVNldEltcGwoKTsKLQkJcmV0dXJuIHJvbGVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVTZXRHcm91cGluZyBjcmVhdGVSb2xlU2V0R3JvdXBpbmcoKSB7Ci0JCVJvbGVTZXRHcm91cGluZ0ltcGwgcm9sZVNldEdyb3VwaW5nID0gbmV3IFJvbGVTZXRHcm91cGluZ0ltcGwoKTsKLQkJcmV0dXJuIHJvbGVTZXRHcm91cGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdGlvbiBjcmVhdGVTZWN0aW9uKCkgewotCQlTZWN0aW9uSW1wbCBzZWN0aW9uID0gbmV3IFNlY3Rpb25JbXBsKCk7Ci0JCXJldHVybiBzZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCkgewotCQlTdXBwb3J0aW5nTWF0ZXJpYWxJbXBsIHN1cHBvcnRpbmdNYXRlcmlhbCA9IG5ldyBTdXBwb3J0aW5nTWF0ZXJpYWxJbXBsKCk7Ci0JCXJldHVybiBzdXBwb3J0aW5nTWF0ZXJpYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2sgY3JlYXRlVGFzaygpIHsKLQkJVGFza0ltcGwgdGFzayA9IG5ldyBUYXNrSW1wbCgpOwotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFza0Rlc2NyaXB0aW9uIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbigpIHsKLQkJVGFza0Rlc2NyaXB0aW9uSW1wbCB0YXNrRGVzY3JpcHRpb24gPSBuZXcgVGFza0Rlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gdGFza0Rlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrRGVzY3JpcHRvciBjcmVhdGVUYXNrRGVzY3JpcHRvcigpIHsKLQkJVGFza0Rlc2NyaXB0b3JJbXBsIHRhc2tEZXNjcmlwdG9yID0gbmV3IFRhc2tEZXNjcmlwdG9ySW1wbCgpOwotCQlyZXR1cm4gdGFza0Rlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlYW1Qcm9maWxlIGNyZWF0ZVRlYW1Qcm9maWxlKCkgewotCQlUZWFtUHJvZmlsZUltcGwgdGVhbVByb2ZpbGUgPSBuZXcgVGVhbVByb2ZpbGVJbXBsKCk7Ci0JCXJldHVybiB0ZWFtUHJvZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGVtcGxhdGUgY3JlYXRlVGVtcGxhdGUoKSB7Ci0JCVRlbXBsYXRlSW1wbCB0ZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZUltcGwoKTsKLQkJcmV0dXJuIHRlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZXJtRGVmaW5pdGlvbiBjcmVhdGVUZXJtRGVmaW5pdGlvbigpIHsKLQkJVGVybURlZmluaXRpb25JbXBsIHRlcm1EZWZpbml0aW9uID0gbmV3IFRlcm1EZWZpbml0aW9uSW1wbCgpOwotCQlyZXR1cm4gdGVybURlZmluaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRvb2wgY3JlYXRlVG9vbCgpIHsKLQkJVG9vbEltcGwgdG9vbCA9IG5ldyBUb29sSW1wbCgpOwotCQlyZXR1cm4gdG9vbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVG9vbE1lbnRvciBjcmVhdGVUb29sTWVudG9yKCkgewotCQlUb29sTWVudG9ySW1wbCB0b29sTWVudG9yID0gbmV3IFRvb2xNZW50b3JJbXBsKCk7Ci0JCXJldHVybiB0b29sTWVudG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXaGl0ZXBhcGVyIGNyZWF0ZVdoaXRlcGFwZXIoKSB7Ci0JCVdoaXRlcGFwZXJJbXBsIHdoaXRlcGFwZXIgPSBuZXcgV2hpdGVwYXBlckltcGwoKTsKLQkJcmV0dXJuIHdoaXRlcGFwZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtCcmVha2Rvd25FbGVtZW50IGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50KCkgewotCQlXb3JrQnJlYWtkb3duRWxlbWVudEltcGwgd29ya0JyZWFrZG93bkVsZW1lbnQgPSBuZXcgV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiB3b3JrQnJlYWtkb3duRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya0RlZmluaXRpb24gY3JlYXRlV29ya0RlZmluaXRpb24oKSB7Ci0JCVdvcmtEZWZpbml0aW9uSW1wbCB3b3JrRGVmaW5pdGlvbiA9IG5ldyBXb3JrRGVmaW5pdGlvbkltcGwoKTsKLQkJcmV0dXJuIHdvcmtEZWZpbml0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrT3JkZXIgY3JlYXRlV29ya09yZGVyKCkgewotCQlXb3JrT3JkZXJJbXBsIHdvcmtPcmRlciA9IG5ldyBXb3JrT3JkZXJJbXBsKCk7Ci0JCXJldHVybiB3b3JrT3JkZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0IGNyZWF0ZVdvcmtQcm9kdWN0KCkgewotCQlXb3JrUHJvZHVjdEltcGwgd29ya1Byb2R1Y3QgPSBuZXcgV29ya1Byb2R1Y3RJbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCB3b3JrUHJvZHVjdERlc2NyaXB0aW9uID0gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3IgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsIHdvcmtQcm9kdWN0RGVzY3JpcHRvciA9IG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0VHlwZSBjcmVhdGVXb3JrUHJvZHVjdFR5cGUoKSB7Ci0JCVdvcmtQcm9kdWN0VHlwZUltcGwgd29ya1Byb2R1Y3RUeXBlID0gbmV3IFdvcmtQcm9kdWN0VHlwZUltcGwoKTsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGNyZWF0ZVZhcmlhYmlsaXR5VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlWYXJpYWJpbGl0eVR5cGUgcmVzdWx0ID0gVmFyaWFiaWxpdHlUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYXJpYWJpbGl0eVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyVHlwZSBjcmVhdGVXb3JrT3JkZXJUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCVdvcmtPcmRlclR5cGUgcmVzdWx0ID0gV29ya09yZGVyVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V29ya09yZGVyVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eVR5cGUgY3JlYXRlVmFyaWFiaWxpdHlUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoVmFyaWFiaWxpdHlUeXBlKWNyZWF0ZVZhcmlhYmlsaXR5VHlwZUZyb21TdHJpbmcoVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9UWVBFLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFZhcmlhYmlsaXR5VHlwZU9iamVjdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBjb252ZXJ0VmFyaWFiaWxpdHlUeXBlVG9TdHJpbmcoVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyVHlwZSBjcmVhdGVXb3JrT3JkZXJUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoV29ya09yZGVyVHlwZSljcmVhdGVXb3JrT3JkZXJUeXBlRnJvbVN0cmluZyhVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfT1JERVJfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRXb3JrT3JkZXJUeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRXb3JrT3JkZXJUeXBlVG9TdHJpbmcoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX09SREVSX1RZUEUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFQYWNrYWdlIGdldFVtYVBhY2thZ2UoKSB7Ci0JCXJldHVybiAoVW1hUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBVbWFQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9VbWFGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9VbWFQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9VbWFQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZGMzZTNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVW1hUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4OTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBVbWFQYWNrYWdlSW1wbC5qYXZhLHYgMS42IDIwMDYvMDkvMDggMDA6NTk6MjYganhpIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGluZ01ldHJpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGFja2FnZWFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFVtYVBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFjdGl2aXR5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXJ0aWZhY3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBicmVha2Rvd25FbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjYXBhYmlsaXR5UGF0dGVybkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjaGVja2xpc3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29tcG9zaXRlUm9sZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb25jZXB0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbnN0cmFpbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29udGVudENhdGVnb3J5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbnRlbnRDYXRlZ29yeVBhY2thZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29udGVudERlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbnRlbnRFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbnRlbnRQYWNrYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGN1c3RvbUNhdGVnb3J5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlbGl2ZXJhYmxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVsaXZlcnlQcm9jZXNzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZXNjcmlwdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkaXNjaXBsaW5lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkb2N1bWVudFJvb3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZG9tYWluRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXN0aW1hdGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXN0aW1hdGluZ01ldHJpY0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXhhbXBsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBndWlkYW5jZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGd1aWRlbGluZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpdGVyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZExpYnJhcnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kUGFja2FnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RQbHVnaW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kVW5pdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtaWxlc3RvbmVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbmFtZWRFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG91dGNvbWVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcGFja2FnZWFibGVFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBoYXNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBsYW5uaW5nRGF0YUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcmFjdGljZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0NvbXBvbmVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzUGFja2FnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZXBvcnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcmV1c2FibGVBc3NldEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2FkbWFwRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZURlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvbGVEZXNjcmlwdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvbGVTZXRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZVNldEdyb3VwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlY3Rpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc3VwcG9ydGluZ01hdGVyaWFsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRhc2tFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFza0Rlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRhc2tEZXNjcmlwdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRlYW1Qcm9maWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRlbXBsYXRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRlcm1EZWZpbml0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRvb2xFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdG9vbE1lbnRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3aGl0ZXBhcGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtEZWZpbml0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtPcmRlckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrUHJvZHVjdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrUHJvZHVjdFR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB2YXJpYWJpbGl0eVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHdvcmtPcmRlclR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB2YXJpYWJpbGl0eVR5cGVPYmplY3RFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgd29ya09yZGVyVHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBVbWFQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBVbWFQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChVbWFQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFVtYVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlVbWFQYWNrYWdlSW1wbCB0aGVVbWFQYWNrYWdlID0gKFVtYVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIFVtYVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgVW1hUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlVW1hUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZVVtYVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlVW1hUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlVW1hUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFjdGl2aXR5KCkgewotCQlyZXR1cm4gYWN0aXZpdHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfUHJlY29uZGl0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9Qb3N0Y29uZGl0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5X0NoZWNrbGlzdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfQ29uY2VwdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfRXhhbXBsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfR3VpZGVsaW5lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9Sb2FkbWFwKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9SZXVzYWJsZUFzc2V0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9TdXBwb3J0aW5nTWF0ZXJpYWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9XaGl0ZXBhcGVyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfSXNFbmFjdGFibGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfVmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd1RvU3RhZmYoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXJ0aWZhY3QoKSB7Ci0JCXJldHVybiBhcnRpZmFjdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdF9Hcm91cDMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcnRpZmFjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXJ0aWZhY3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFydGlmYWN0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fQnJpZWZPdXRsaW5lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QnJlYWtkb3duRWxlbWVudCgpIHsKLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1N1cGVyQWN0aXZpdHkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9IYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKSB7Ci0JCXJldHVybiBjYXBhYmlsaXR5UGF0dGVybkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENoZWNrbGlzdCgpIHsKLQkJcmV0dXJuIGNoZWNrbGlzdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbXBvc2l0ZVJvbGUoKSB7Ci0JCXJldHVybiBjb21wb3NpdGVSb2xlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbXBvc2l0ZVJvbGVfR3JvdXAxKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29tcG9zaXRlUm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljb21wb3NpdGVSb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb25jZXB0KCkgewotCQlyZXR1cm4gY29uY2VwdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiBjb25zdHJhaW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnN0cmFpbnRfTWFpbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29udGVudENhdGVnb3J5KCkgewotCQlyZXR1cm4gY29udGVudENhdGVnb3J5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZSgpIHsKLQkJcmV0dXJuIGNvbnRlbnRDYXRlZ29yeVBhY2thZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZV9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50Q2F0ZWdvcnlQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZV9Db250ZW50Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljb250ZW50Q2F0ZWdvcnlQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb250ZW50RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBjb250ZW50RGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X0dyb3VwMSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9Db25jZXB0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1JldXNhYmxlQXNzZXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfV2hpdGVwYXBlcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRlbnRQYWNrYWdlKCkgewotCQlyZXR1cm4gY29udGVudFBhY2thZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudFBhY2thZ2VfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudFBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbnRlbnRQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDdXN0b21DYXRlZ29yeSgpIHsKLQkJcmV0dXJuIGN1c3RvbUNhdGVnb3J5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEN1c3RvbUNhdGVnb3J5X0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWN1c3RvbUNhdGVnb3J5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWN1c3RvbUNhdGVnb3J5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZWxpdmVyYWJsZSgpIHsKLQkJcmV0dXJuIGRlbGl2ZXJhYmxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlX0dyb3VwMygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZWxpdmVyYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZWxpdmVyeVByb2Nlc3MoKSB7Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzX0dyb3VwMygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlc2NyaWJhYmxlRWxlbWVudCgpIHsKLQkJcmV0dXJuIGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gZGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREaXNjaXBsaW5lKCkgewotCQlyZXR1cm4gZGlzY2lwbGluZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaXNjaXBsaW5lX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRpc2NpcGxpbmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaXNjaXBsaW5lX1Rhc2soKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkaXNjaXBsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZV9TdWJEaXNjaXBsaW5lKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZGlzY2lwbGluZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3coKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkaXNjaXBsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREaXNjaXBsaW5lR3JvdXBpbmcoKSB7Ci0JCXJldHVybiBkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREb2N1bWVudFJvb3QoKSB7Ci0JCXJldHVybiBkb2N1bWVudFJvb3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RG9jdW1lbnRSb290X01peGVkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZG9jdW1lbnRSb290RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZG9jdW1lbnRSb290RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZG9jdW1lbnRSb290RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X01ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfTWV0aG9kTGlicmFyeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRvY3VtZW50Um9vdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9NZXRob2RQbHVnaW4oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERvbWFpbigpIHsKLQkJcmV0dXJuIGRvbWFpbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREb21haW5fR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZG9tYWluRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RG9tYWluX1dvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZG9tYWluRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9tYWluX1N1YmRvbWFpbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRvbWFpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFc3RpbWF0ZSgpIHsKLQkJcmV0dXJuIGVzdGltYXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVzdGltYXRlX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVzdGltYXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXN0aW1hdGVfRXN0aW1hdGlvbk1ldHJpYygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVzdGltYXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXN0aW1hdGVfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXN0aW1hdGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVzdGltYXRpbmdNZXRyaWMoKSB7Ci0JCXJldHVybiBlc3RpbWF0aW5nTWV0cmljRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXhhbXBsZSgpIHsKLQkJcmV0dXJuIGV4YW1wbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHdWlkYW5jZSgpIHsKLQkJcmV0dXJuIGd1aWRhbmNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0R3VpZGVsaW5lKCkgewotCQlyZXR1cm4gZ3VpZGVsaW5lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SXRlcmF0aW9uKCkgewotCQlyZXR1cm4gaXRlcmF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudCgpIHsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9Hcm91cCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RFbGVtZW50X093bmVkUnVsZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X09yZGVyaW5nR3VpZGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9TdXBwcmVzc2VkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kTGlicmFyeSgpIHsKLQkJcmV0dXJuIG1ldGhvZExpYnJhcnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW4oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RMaWJyYXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kTGlicmFyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZExpYnJhcnlfVG9vbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZExpYnJhcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZFBhY2thZ2UoKSB7Ci0JCXJldHVybiBtZXRob2RQYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBhY2thZ2VfR3JvdXAxKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kUGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBhY2thZ2VfUmV1c2VkUGFja2FnZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RQYWNrYWdlX01ldGhvZFBhY2thZ2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGFja2FnZV9HbG9iYWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RQbHVnaW4oKSB7Ci0JCXJldHVybiBtZXRob2RQbHVnaW5FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGx1Z2luX1JlZmVyZW5jZWRNZXRob2RQbHVnaW4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZFBsdWdpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFBsdWdpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kVW5pdCgpIHsKLQkJcmV0dXJuIG1ldGhvZFVuaXRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1pbGVzdG9uZSgpIHsKLQkJcmV0dXJuIG1pbGVzdG9uZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE5hbWVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIG5hbWVkRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXROYW1lZEVsZW1lbnRfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW5hbWVkRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0T3V0Y29tZSgpIHsKLQkJcmV0dXJuIG91dGNvbWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiBwYWNrYWdlYWJsZUVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQaGFzZSgpIHsKLQkJcmV0dXJuIHBoYXNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UGxhbm5pbmdEYXRhKCkgewotCQlyZXR1cm4gcGxhbm5pbmdEYXRhRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBsYW5uaW5nRGF0YV9GaW5pc2hEYXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGxhbm5pbmdEYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfU3RhcnREYXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGxhbm5pbmdEYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcmFjdGljZSgpIHsKLQkJcmV0dXJuIHByYWN0aWNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByYWN0aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcmFjdGljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcmFjdGljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByYWN0aWNlX1N1YlByYWN0aWNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHJhY3RpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByYWN0aWNlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnQoKSB7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRfQ29weXJpZ2h0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRfSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRfUHJvY2VzcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzQ29tcG9uZW50X0F1dGhvcnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudF9DaGFuZ2VEYXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudF9WZXJzaW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpIHsKLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9Hcm91cDEoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1VzYWdlTm90ZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzRGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc0VsZW1lbnQoKSB7Ci0JCXJldHVybiBwcm9jZXNzRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NQYWNrYWdlKCkgewotCQlyZXR1cm4gcHJvY2Vzc1BhY2thZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc1BhY2thZ2VfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc1BhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzUGFja2FnZV9Qcm9jZXNzRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXByb2Nlc3NQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpIHsKLQkJcmV0dXJuIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0dyb3VwMygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfQmFzZVByb2Nlc3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVwb3J0KCkgewotCQlyZXR1cm4gcmVwb3J0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmV1c2FibGVBc3NldCgpIHsKLQkJcmV0dXJuIHJldXNhYmxlQXNzZXRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2FkbWFwKCkgewotCQlyZXR1cm4gcm9hZG1hcEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvbGUoKSB7Ci0JCXJldHVybiByb2xlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVfUmVzcG9uc2libGVGb3IoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiByb2xlRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiByb2xlRGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlU2V0KCkgewotCQlyZXR1cm4gcm9sZVNldEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlU2V0X0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVTZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlU2V0X1JvbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlU2V0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlU2V0R3JvdXBpbmcoKSB7Ci0JCXJldHVybiByb2xlU2V0R3JvdXBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZVNldEdyb3VwaW5nX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVTZXRHcm91cGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZVNldEdyb3VwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZWN0aW9uKCkgewotCQlyZXR1cm4gc2VjdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZWN0aW9uX1N1YlNlY3Rpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9QcmVkZWNlc3NvcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlY3Rpb25fU2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlY3Rpb25fVmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkgewotCQlyZXR1cm4gc3VwcG9ydGluZ01hdGVyaWFsRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFzaygpIHsKLQkJcmV0dXJuIHRhc2tFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19QcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Qb3N0Y29uZGl0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUGVyZm9ybWVkQnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX091dHB1dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfT3B0aW9uYWxJbnB1dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0VzdGltYXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfVG9vbE1lbnRvcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUYXNrRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiB0YXNrRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUYXNrRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHRhc2tEZXNjcmlwdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX1Rhc2soKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9TdGVwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRlYW1Qcm9maWxlKCkgewotCQlyZXR1cm4gdGVhbVByb2ZpbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGVhbVByb2ZpbGVfR3JvdXAxKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGVhbVByb2ZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUZWFtUHJvZmlsZV9Sb2xlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGVhbVByb2ZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0ZWFtUHJvZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0ZWFtUHJvZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGVtcGxhdGUoKSB7Ci0JCXJldHVybiB0ZW1wbGF0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRlcm1EZWZpbml0aW9uKCkgewotCQlyZXR1cm4gdGVybURlZmluaXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUb29sKCkgewotCQlyZXR1cm4gdG9vbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUb29sX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRvb2xFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUb29sX1Rvb2xNZW50b3IoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0b29sRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUb29sTWVudG9yKCkgewotCQlyZXR1cm4gdG9vbE1lbnRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdoaXRlcGFwZXIoKSB7Ci0JCXJldHVybiB3aGl0ZXBhcGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSB7Ci0JCXJldHVybiB3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Hcm91cDEoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29yKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzUmVwZWF0YWJsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHdvcmtEZWZpbml0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtEZWZpbml0aW9uX1ByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtEZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtEZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrT3JkZXIoKSB7Ci0JCXJldHVybiB3b3JrT3JkZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya09yZGVyX1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya09yZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya09yZGVyX0xpbmtUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya09yZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya09yZGVyX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya09yZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrUHJvZHVjdCgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0X0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RfUmVwb3J0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0ltcGFjdE9mTm90SGF2aW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfR3JvdXAxKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3RUeXBlKCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3RUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0VHlwZV9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFdvcmtPcmRlclR5cGUoKSB7Ci0JCXJldHVybiB3b3JrT3JkZXJUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRWYXJpYWJpbGl0eVR5cGVPYmplY3QoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eVR5cGVPYmplY3RFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRXb3JrT3JkZXJUeXBlT2JqZWN0KCkgewotCQlyZXR1cm4gd29ya09yZGVyVHlwZU9iamVjdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hRmFjdG9yeSBnZXRVbWFGYWN0b3J5KCkgewotCQlyZXR1cm4gKFVtYUZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJYWN0aXZpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUNUSVZJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fUFJFQ09ORElUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX1BPU1RDT05ESVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fR1JPVVAyKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX0NIRUNLTElTVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19DT05DRVBUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX0VYQU1QTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fR1VJREVMSU5FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX1JPQURNQVApOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVQpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19XSElURVBBUEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX0lTX0VOQUNUQUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEUpOwotCi0JCWFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUNUSVZJVFlfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MsIEFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MsIEFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dfVE9fU1RBRkYpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MsIEFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFKTsKLQotCQlhcnRpZmFjdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBUlRJRkFDVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJ0aWZhY3RFQ2xhc3MsIEFSVElGQUNUX19HUk9VUDMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFydGlmYWN0RUNsYXNzLCBBUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUKTsKLQotCQlhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFSVElGQUNUX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLCBBUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcywgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlMpOwotCi0JCWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQlJFQUtET1dOX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVIpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYKTsKLQotCQlicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFKTsKLQotCQljYXBhYmlsaXR5UGF0dGVybkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDQVBBQklMSVRZX1BBVFRFUk4pOwotCi0JCWNoZWNrbGlzdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDSEVDS0xJU1QpOwotCi0JCWNvbXBvc2l0ZVJvbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09NUE9TSVRFX1JPTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbXBvc2l0ZVJvbGVFQ2xhc3MsIENPTVBPU0lURV9ST0xFX19HUk9VUDEpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbXBvc2l0ZVJvbGVFQ2xhc3MsIENPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEUpOwotCi0JCWNvbmNlcHRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OQ0VQVCk7Ci0KLQkJY29uc3RyYWludEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05TVFJBSU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb25zdHJhaW50RUNsYXNzLCBDT05TVFJBSU5UX19NQUlOX0RFU0NSSVBUSU9OKTsKLQotCQljb250ZW50Q2F0ZWdvcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEVOVF9DQVRFR09SWSk7Ci0KLQkJY29udGVudENhdGVnb3J5UGFja2FnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnRDYXRlZ29yeVBhY2thZ2VFQ2xhc3MsIENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fR1JPVVAyKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50Q2F0ZWdvcnlQYWNrYWdlRUNsYXNzLCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0NPTlRFTlRfQ0FURUdPUlkpOwotCi0JCWNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05URU5UX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MsIENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywgQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MsIENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT04pOwotCi0JCWNvbnRlbnRFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlRFTlRfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fR1JPVVAxKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1QpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDT05URU5UX0VMRU1FTlRfX0NPTkNFUFQpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDT05URU5UX0VMRU1FTlRfX1dISVRFUEFQRVIpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUpOwotCi0JCWNvbnRlbnRQYWNrYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlRFTlRfUEFDS0FHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudFBhY2thZ2VFQ2xhc3MsIENPTlRFTlRfUEFDS0FHRV9fR1JPVVAyKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50UGFja2FnZUVDbGFzcywgQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlQpOwotCi0JCWN1c3RvbUNhdGVnb3J5RUNsYXNzID0gY3JlYXRlRUNsYXNzKENVU1RPTV9DQVRFR09SWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MsIENVU1RPTV9DQVRFR09SWV9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjdXN0b21DYXRlZ29yeUVDbGFzcywgQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjdXN0b21DYXRlZ29yeUVDbGFzcywgQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUlkpOwotCi0JCWRlbGl2ZXJhYmxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFTElWRVJBQkxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyYWJsZUVDbGFzcywgREVMSVZFUkFCTEVfX0dST1VQMyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcmFibGVFQ2xhc3MsIERFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUKTsKLQotCQlkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFTElWRVJBQkxFX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzLCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MsIERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0UpOwotCi0JCWRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERUxJVkVSWV9QUk9DRVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NFQ2xhc3MsIERFTElWRVJZX1BST0NFU1NfX0dST1VQMyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRUNsYXNzLCBERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRUNsYXNzLCBERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUwpOwotCi0JCWRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVCk7Ci0KLQkJZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERFU0NSSUJBQkxFX0VMRU1FTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcywgREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MsIERFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MsIERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MsIERFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTik7Ci0KLQkJZGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERVNDUklQVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZXNjcmlwdG9yRUNsYXNzLCBERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UpOwotCi0JCWRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERVNDUklQVE9SX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MsIERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT04pOwotCi0JCWRpc2NpcGxpbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElTQ0lQTElORSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlzY2lwbGluZUVDbGFzcywgRElTQ0lQTElORV9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaXNjaXBsaW5lRUNsYXNzLCBESVNDSVBMSU5FX19UQVNLKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaXNjaXBsaW5lRUNsYXNzLCBESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlzY2lwbGluZUVDbGFzcywgRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XKTsKLQotCQlkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElTQ0lQTElORV9HUk9VUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzLCBESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcywgRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORSk7Ci0KLQkJZG9jdW1lbnRSb290RUNsYXNzID0gY3JlYXRlRUNsYXNzKERPQ1VNRU5UX1JPT1QpOwotCQljcmVhdGVFQXR0cmlidXRlKGRvY3VtZW50Um9vdEVDbGFzcywgRE9DVU1FTlRfUk9PVF9fTUlYRUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRvY3VtZW50Um9vdEVDbGFzcywgRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZG9jdW1lbnRSb290RUNsYXNzLCBET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX01FVEhPRF9DT05GSUdVUkFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX01FVEhPRF9MSUJSQVJZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU4pOwotCi0JCWRvbWFpbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhET01BSU4pOwotCQljcmVhdGVFQXR0cmlidXRlKGRvbWFpbkVDbGFzcywgRE9NQUlOX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKGRvbWFpbkVDbGFzcywgRE9NQUlOX19XT1JLX1BST0RVQ1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRvbWFpbkVDbGFzcywgRE9NQUlOX19TVUJET01BSU4pOwotCi0JCWVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUxFTUVOVCk7Ci0KLQkJZXN0aW1hdGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVNUSU1BVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVzdGltYXRlRUNsYXNzLCBFU1RJTUFURV9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlc3RpbWF0ZUVDbGFzcywgRVNUSU1BVEVfX0VTVElNQVRJT05fTUVUUklDKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlc3RpbWF0ZUVDbGFzcywgRVNUSU1BVEVfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCi0JCWVzdGltYXRpbmdNZXRyaWNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVNUSU1BVElOR19NRVRSSUMpOwotCi0JCWVzdGltYXRpb25Db25zaWRlcmF0aW9uc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQotCQlleGFtcGxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVYQU1QTEUpOwotCi0JCWd1aWRhbmNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdVSURBTkNFKTsKLQotCQlndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdVSURBTkNFX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzLCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVCk7Ci0KLQkJZ3VpZGVsaW5lRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdVSURFTElORSk7Ci0KLQkJaXRlcmF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKElURVJBVElPTik7Ci0KLQkJbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfQ09ORklHVVJBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLCBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLCBNRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLCBNRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXKTsKLQotCQltZXRob2RFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fR1JPVVApOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRCk7Ci0KLQkJbWV0aG9kTGlicmFyeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfTElCUkFSWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kTGlicmFyeUVDbGFzcywgTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU4pOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZExpYnJhcnlFQ2xhc3MsIE1FVEhPRF9MSUJSQVJZX19NRVRIT0RfQ09ORklHVVJBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kTGlicmFyeUVDbGFzcywgTUVUSE9EX0xJQlJBUllfX1RPT0wpOwotCi0JCW1ldGhvZFBhY2thZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX1BBQ0tBR0UpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFBhY2thZ2VFQ2xhc3MsIE1FVEhPRF9QQUNLQUdFX19HUk9VUDEpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFBhY2thZ2VFQ2xhc3MsIE1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kUGFja2FnZUVDbGFzcywgTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RQYWNrYWdlRUNsYXNzLCBNRVRIT0RfUEFDS0FHRV9fR0xPQkFMKTsKLQotCQltZXRob2RQbHVnaW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX1BMVUdJTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGx1Z2luRUNsYXNzLCBNRVRIT0RfUExVR0lOX19SRUZFUkVOQ0VEX01FVEhPRF9QTFVHSU4pOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZFBsdWdpbkVDbGFzcywgTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0UpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFBsdWdpbkVDbGFzcywgTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFKTsKLQotCQltZXRob2RVbml0RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9VTklUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RVbml0RUNsYXNzLCBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RVbml0RUNsYXNzLCBNRVRIT0RfVU5JVF9fQVVUSE9SUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kVW5pdEVDbGFzcywgTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RVbml0RUNsYXNzLCBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RVbml0RUNsYXNzLCBNRVRIT0RfVU5JVF9fVkVSU0lPTik7Ci0KLQkJbWlsZXN0b25lRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1JTEVTVE9ORSk7Ci0KLQkJbmFtZWRFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKE5BTUVEX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKG5hbWVkRWxlbWVudEVDbGFzcywgTkFNRURfRUxFTUVOVF9fTkFNRSk7Ci0KLQkJb3V0Y29tZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhPVVRDT01FKTsKLQotCQlwYWNrYWdlYWJsZUVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEFDS0FHRUFCTEVfRUxFTUVOVCk7Ci0KLQkJcGhhc2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEhBU0UpOwotCi0JCXBsYW5uaW5nRGF0YUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQTEFOTklOR19EQVRBKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwbGFubmluZ0RhdGFFQ2xhc3MsIFBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwbGFubmluZ0RhdGFFQ2xhc3MsIFBMQU5OSU5HX0RBVEFfX1JBTkspOwotCQljcmVhdGVFQXR0cmlidXRlKHBsYW5uaW5nRGF0YUVDbGFzcywgUExBTk5JTkdfREFUQV9fU1RBUlRfREFURSk7Ci0KLQkJcHJhY3RpY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJBQ1RJQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRUNsYXNzLCBQUkFDVElDRV9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZUVDbGFzcywgUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VFQ2xhc3MsIFBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJhY3RpY2VFQ2xhc3MsIFBSQUNUSUNFX19TVUJfUFJBQ1RJQ0UpOwotCi0JCXByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJBQ1RJQ0VfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk8pOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcywgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQpOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcywgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcywgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU0pOwotCi0JCXByb2Nlc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0VDbGFzcywgUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0VDbGFzcywgUFJPQ0VTU19fREVGQVVMVF9DT05URVhUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzRUNsYXNzLCBQUk9DRVNTX19WQUxJRF9DT05URVhUKTsKLQotCQlwcm9jZXNzQ29tcG9uZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfQ09NUE9ORU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NDb21wb25lbnRFQ2xhc3MsIFBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT04pOwotCi0JCXByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU8pOwotCi0JCXByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIFBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIFBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIFBST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEKTsKLQotCQlwcm9jZXNzRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX0VMRU1FTlQpOwotCi0JCXByb2Nlc3NQYWNrYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfUEFDS0FHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc1BhY2thZ2VFQ2xhc3MsIFBST0NFU1NfUEFDS0FHRV9fR1JPVVAyKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzUGFja2FnZUVDbGFzcywgUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQpOwotCi0JCXByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzLCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDMpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzLCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFX1BST0NFU1MpOwotCi0JCXJlcG9ydEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRVBPUlQpOwotCi0JCXJldXNhYmxlQXNzZXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVVU0FCTEVfQVNTRVQpOwotCi0JCXJvYWRtYXBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9BRE1BUCk7Ci0KLQkJcm9sZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRUNsYXNzLCBST0xFX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVFQ2xhc3MsIFJPTEVfX1JFU1BPTlNJQkxFX0ZPUik7Ci0KLQkJcm9sZURlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPTEVfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVEZXNjcmlwdGlvbkVDbGFzcywgUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRGVzY3JpcHRpb25FQ2xhc3MsIFJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZURlc2NyaXB0aW9uRUNsYXNzLCBST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUyk7Ci0KLQkJcm9sZURlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9ERVNDUklQVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRGVzY3JpcHRvckVDbGFzcywgUk9MRV9ERVNDUklQVE9SX19ST0xFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRGVzY3JpcHRvckVDbGFzcywgUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1IpOwotCi0JCXJvbGVTZXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9TRVQpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVTZXRFQ2xhc3MsIFJPTEVfU0VUX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVTZXRFQ2xhc3MsIFJPTEVfU0VUX19ST0xFKTsKLQotCQlyb2xlU2V0R3JvdXBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9TRVRfR1JPVVBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVTZXRHcm91cGluZ0VDbGFzcywgUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZVNldEdyb3VwaW5nRUNsYXNzLCBST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVQpOwotCi0JCXNlY3Rpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VDVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdGlvbkVDbGFzcywgU0VDVElPTl9fU1VCX1NFQ1RJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3Rpb25FQ2xhc3MsIFNFQ1RJT05fX1BSRURFQ0VTU09SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN0aW9uRUNsYXNzLCBTRUNUSU9OX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdGlvbkVDbGFzcywgU0VDVElPTl9fU0VDVElPTl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN0aW9uRUNsYXNzLCBTRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN0aW9uRUNsYXNzLCBTRUNUSU9OX19WQVJJQUJJTElUWV9UWVBFKTsKLQotCQlzdXBwb3J0aW5nTWF0ZXJpYWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1VQUE9SVElOR19NQVRFUklBTCk7Ci0KLQkJdGFza0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQVNLKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRUNsYXNzLCBUQVNLX19QUkVDT05ESVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX1BPU1RDT05ESVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX1BFUkZPUk1FRF9CWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0VDbGFzcywgVEFTS19fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRUNsYXNzLCBUQVNLX19NQU5EQVRPUllfSU5QVVQpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX09VVFBVVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0VDbGFzcywgVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0VDbGFzcywgVEFTS19fT1BUSU9OQUxfSU5QVVQpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX0VTVElNQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRUNsYXNzLCBUQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRUNsYXNzLCBUQVNLX19UT09MX01FTlRPUik7Ci0KLQkJdGFza0Rlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBU0tfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdGlvbkVDbGFzcywgVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRpb25FQ2xhc3MsIFRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0UpOwotCi0JCXRhc2tEZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBU0tfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fVEFTSyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX09VVFBVVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fU1RFUCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFKTsKLQotCQl0ZWFtUHJvZmlsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhURUFNX1BST0ZJTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHRlYW1Qcm9maWxlRUNsYXNzLCBURUFNX1BST0ZJTEVfX0dST1VQMSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGVhbVByb2ZpbGVFQ2xhc3MsIFRFQU1fUFJPRklMRV9fUk9MRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGVhbVByb2ZpbGVFQ2xhc3MsIFRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGVhbVByb2ZpbGVFQ2xhc3MsIFRFQU1fUFJPRklMRV9fU1VCX1RFQU0pOwotCi0JCXRlbXBsYXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRFTVBMQVRFKTsKLQotCQl0ZXJtRGVmaW5pdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhURVJNX0RFRklOSVRJT04pOwotCi0JCXRvb2xFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVE9PTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodG9vbEVDbGFzcywgVE9PTF9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0b29sRUNsYXNzLCBUT09MX19UT09MX01FTlRPUik7Ci0KLQkJdG9vbE1lbnRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUT09MX01FTlRPUik7Ci0KLQkJd2hpdGVwYXBlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXSElURVBBUEVSKTsKLQotCQl3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX0JSRUFLRE9XTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFREVDRVNTT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4pOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRSk7Ci0KLQkJd29ya0RlZmluaXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19ERUZJTklUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrRGVmaW5pdGlvbkVDbGFzcywgV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtEZWZpbml0aW9uRUNsYXNzLCBXT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04pOwotCi0JCXdvcmtPcmRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX09SREVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrT3JkZXJFQ2xhc3MsIFdPUktfT1JERVJfX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrT3JkZXJFQ2xhc3MsIFdPUktfT1JERVJfX0xJTktfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya09yZGVyRUNsYXNzLCBXT1JLX09SREVSX19JRCk7Ci0KLQkJd29ya1Byb2R1Y3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdEVDbGFzcywgV09SS19QUk9EVUNUX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RUNsYXNzLCBXT1JLX1BST0RVQ1RfX0VTVElNQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdEVDbGFzcywgV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdEVDbGFzcywgV09SS19QUk9EVUNUX19SRVBPUlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RUNsYXNzLCBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdEVDbGFzcywgV09SS19QUk9EVUNUX19UT09MX01FTlRPUik7Ci0KLQkJd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCk7Ci0KLQkJd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfUFJPRFVDVF9ERVNDUklQVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dST1VQMSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlkpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURSk7Ci0KLQkJd29ya1Byb2R1Y3RUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfUFJPRFVDVF9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdFR5cGVFQ2xhc3MsIFdPUktfUFJPRFVDVF9UWVBFX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0VHlwZUVDbGFzcywgV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVCk7Ci0KLQkJLy8gQ3JlYXRlIGVudW1zCi0JCXZhcmlhYmlsaXR5VHlwZUVFbnVtID0gY3JlYXRlRUVudW0oVkFSSUFCSUxJVFlfVFlQRSk7Ci0JCXdvcmtPcmRlclR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFdPUktfT1JERVJfVFlQRSk7Ci0KLQkJLy8gQ3JlYXRlIGRhdGEgdHlwZXMKLQkJdmFyaWFiaWxpdHlUeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFZBUklBQklMSVRZX1RZUEVfT0JKRUNUKTsKLQkJd29ya09yZGVyVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShXT1JLX09SREVSX1RZUEVfT0JKRUNUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJWE1MVHlwZVBhY2thZ2UgdGhlWE1MVHlwZVBhY2thZ2UgPSAoWE1MVHlwZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoWE1MVHlwZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQlhY3Rpdml0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkpOwotCQlhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpOwotCQlhcnRpZmFjdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtQcm9kdWN0KCkpOwotCQlhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpKTsKLQkJYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3NFbGVtZW50KCkpOwotCQlicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCWNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2VzcygpKTsKLQkJY2hlY2tsaXN0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWNvbXBvc2l0ZVJvbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRSb2xlRGVzY3JpcHRvcigpKTsKLQkJY29uY2VwdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQljb25zdHJhaW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJY29udGVudENhdGVnb3J5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCWNvbnRlbnRDYXRlZ29yeVBhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RQYWNrYWdlKCkpOwotCQljb250ZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERlc2NyaWJhYmxlRWxlbWVudCgpKTsKLQkJY29udGVudFBhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RQYWNrYWdlKCkpOwotCQljdXN0b21DYXRlZ29yeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJZGVsaXZlcmFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSk7Ci0JCWRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3MoKSk7Ci0JCWRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpOwotCQlkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQlkZXNjcmlwdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpKTsKLQkJZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpOwotCQlkaXNjaXBsaW5lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQlkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWRvbWFpbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJZXN0aW1hdGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJZXN0aW1hdGluZ01ldHJpY0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQllc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJZXhhbXBsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlndWlkYW5jZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQlndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlndWlkZWxpbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJaXRlcmF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWN0aXZpdHkoKSk7Ci0JCW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UGFja2FnZWFibGVFbGVtZW50KCkpOwotCQltZXRob2RMaWJyYXJ5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kVW5pdCgpKTsKLQkJbWV0aG9kUGFja2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCW1ldGhvZFBsdWdpbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFVuaXQoKSk7Ci0JCW1ldGhvZFVuaXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQltaWxlc3RvbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpKTsKLQkJbmFtZWRFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RWxlbWVudCgpKTsKLQkJb3V0Y29tZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtQcm9kdWN0KCkpOwotCQlwYWNrYWdlYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROYW1lZEVsZW1lbnQoKSk7Ci0JCXBoYXNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWN0aXZpdHkoKSk7Ci0JCXBsYW5uaW5nRGF0YUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3NFbGVtZW50KCkpOwotCQlwcmFjdGljZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlwcm9jZXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWN0aXZpdHkoKSk7Ci0JCXByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzUGFja2FnZSgpKTsKLQkJcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCXByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKSk7Ci0JCXByb2Nlc3NFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkpOwotCQlwcm9jZXNzUGFja2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSk7Ci0JCXByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2VzcygpKTsKLQkJcmVwb3J0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXJldXNhYmxlQXNzZXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJcm9hZG1hcEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlyb2xlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCXJvbGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJcm9sZURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZXNjcmlwdG9yKCkpOwotCQlyb2xlU2V0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQlyb2xlU2V0R3JvdXBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCXNlY3Rpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQlzdXBwb3J0aW5nTWF0ZXJpYWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJdGFza0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQl0YXNrRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCXRlYW1Qcm9maWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpKTsKLQkJdGVtcGxhdGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJdGVybURlZmluaXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJdG9vbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJdG9vbE1lbnRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQl3aGl0ZXBhcGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29uY2VwdCgpKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRCcmVha2Rvd25FbGVtZW50KCkpOwotCQl3b3JrRGVmaW5pdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCXdvcmtQcm9kdWN0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCXdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERlc2NyaXB0b3IoKSk7Ci0JCXdvcmtQcm9kdWN0VHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGFjdGl2aXR5RUNsYXNzLCBBY3Rpdml0eS5jbGFzcywgIkFjdGl2aXR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eV9QcmVjb25kaXRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcmVjb25kaXRpb24iLCBudWxsLCAwLCAxLCBBY3Rpdml0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5X1Bvc3Rjb25kaXRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwb3N0Y29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eV9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBBY3Rpdml0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnQoKSwgdGhpcy5nZXRCcmVha2Rvd25FbGVtZW50KCksIG51bGwsICJicmVha2Rvd25FbGVtZW50IiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eV9DaGVja2xpc3QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjaGVja2xpc3QiLCBudWxsLCAwLCAtMSwgQWN0aXZpdHkuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eV9Db25jZXB0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29uY2VwdCIsIG51bGwsIDAsIC0xLCBBY3Rpdml0eS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5X0V4YW1wbGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJleGFtcGxlIiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlfR3VpZGVsaW5lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZ3VpZGVsaW5lIiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlfUm9hZG1hcCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJvYWRtYXAiLCBudWxsLCAwLCAtMSwgQWN0aXZpdHkuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eV9SZXVzYWJsZUFzc2V0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmV1c2FibGVBc3NldCIsIG51bGwsIDAsIC0xLCBBY3Rpdml0eS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5X1N1cHBvcnRpbmdNYXRlcmlhbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInN1cHBvcnRpbmdNYXRlcmlhbCIsIG51bGwsIDAsIC0xLCBBY3Rpdml0eS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5X1doaXRlcGFwZXIoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ3aGl0ZXBhcGVyIiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlfSXNFbmFjdGFibGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaXNFbmFjdGFibGUiLCBudWxsLCAwLCAxLCBBY3Rpdml0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLCBudWxsLCAwLCAxLCBBY3Rpdml0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5VHlwZSgpLCB0aGlzLmdldFZhcmlhYmlsaXR5VHlwZSgpLCAidmFyaWFiaWxpdHlUeXBlIiwgIm5hIiwgMCwgMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLCBBY3Rpdml0eURlc2NyaXB0aW9uLmNsYXNzLCAiQWN0aXZpdHlEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhbHRlcm5hdGl2ZXMiLCBudWxsLCAwLCAxLCBBY3Rpdml0eURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3dUb1N0YWZmKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiaG93VG9TdGFmZiIsIG51bGwsIDAsIDEsIEFjdGl2aXR5RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwdXJwb3NlIiwgbnVsbCwgMCwgMSwgQWN0aXZpdHlEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhcnRpZmFjdEVDbGFzcywgQXJ0aWZhY3QuY2xhc3MsICJBcnRpZmFjdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJ0aWZhY3RfR3JvdXAzKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDMiLCBudWxsLCAwLCAtMSwgQXJ0aWZhY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdCgpLCB0aGlzLmdldEFydGlmYWN0KCksIG51bGwsICJjb250YWluZWRBcnRpZmFjdCIsIG51bGwsIDAsIC0xLCBBcnRpZmFjdC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICJBcnRpZmFjdERlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImJyaWVmT3V0bGluZSIsIG51bGwsIDAsIDEsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uT3B0aW9ucygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlcHJlc2VudGF0aW9uT3B0aW9ucyIsIG51bGwsIDAsIDEsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIkJyZWFrZG93bkVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcmVzZW50ZWRBZnRlciIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByZXNlbnRlZEJlZm9yZSIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInBsYW5uaW5nRGF0YSIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X1N1cGVyQWN0aXZpdHkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzdXBlckFjdGl2aXR5IiwgbnVsbCwgMSwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIiwgbnVsbCwgMCwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzT3B0aW9uYWwiLCBudWxsLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJpc1BsYW5uZWQiLCBudWxsLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByZWZpeCIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzLCBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uY2xhc3MsICJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidXNhZ2VHdWlkYW5jZSIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjYXBhYmlsaXR5UGF0dGVybkVDbGFzcywgQ2FwYWJpbGl0eVBhdHRlcm4uY2xhc3MsICJDYXBhYmlsaXR5UGF0dGVybiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGNoZWNrbGlzdEVDbGFzcywgQ2hlY2tsaXN0LmNsYXNzLCAiQ2hlY2tsaXN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoY29tcG9zaXRlUm9sZUVDbGFzcywgQ29tcG9zaXRlUm9sZS5jbGFzcywgIkNvbXBvc2l0ZVJvbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbXBvc2l0ZVJvbGVfR3JvdXAxKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDEiLCBudWxsLCAwLCAtMSwgQ29tcG9zaXRlUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGUoKSwgdGhpcy5nZXRSb2xlKCksIG51bGwsICJhZ2dyZWdhdGVkUm9sZSIsIG51bGwsIDAsIC0xLCBDb21wb3NpdGVSb2xlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoY29uY2VwdEVDbGFzcywgQ29uY2VwdC5jbGFzcywgIkNvbmNlcHQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhjb25zdHJhaW50RUNsYXNzLCBDb25zdHJhaW50LmNsYXNzLCAiQ29uc3RyYWludCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29uc3RyYWludF9NYWluRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYWluRGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbnRlbnRDYXRlZ29yeUVDbGFzcywgQ29udGVudENhdGVnb3J5LmNsYXNzLCAiQ29udGVudENhdGVnb3J5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoY29udGVudENhdGVnb3J5UGFja2FnZUVDbGFzcywgQ29udGVudENhdGVnb3J5UGFja2FnZS5jbGFzcywgIkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgQ29udGVudENhdGVnb3J5UGFja2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfQ29udGVudENhdGVnb3J5KCksIHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCksIG51bGwsICJjb250ZW50Q2F0ZWdvcnkiLCBudWxsLCAwLCAtMSwgQ29udGVudENhdGVnb3J5UGFja2FnZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywgQ29udGVudERlc2NyaXB0aW9uLmNsYXNzLCAiQ29udGVudERlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFpbkRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgQ29udGVudERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAia2V5Q29uc2lkZXJhdGlvbnMiLCBudWxsLCAwLCAxLCBDb250ZW50RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbigpLCB0aGlzLmdldFNlY3Rpb24oKSwgbnVsbCwgInNlY3Rpb24iLCBudWxsLCAwLCAtMSwgQ29udGVudERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoY29udGVudEVsZW1lbnRFQ2xhc3MsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAiQ29udGVudEVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRFbGVtZW50X0dyb3VwMSgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAxIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2hlY2tsaXN0IiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNvbmNlcHQiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXhhbXBsZSIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImd1aWRlbGluZSIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRFbGVtZW50X1JldXNhYmxlQXNzZXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZXVzYWJsZUFzc2V0IiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic3VwcG9ydGluZ01hdGVyaWFsIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudEVsZW1lbnRfV2hpdGVwYXBlcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIndoaXRlcGFwZXIiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIsIG51bGwsIDAsIDEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCksIHRoaXMuZ2V0VmFyaWFiaWxpdHlUeXBlKCksICJ2YXJpYWJpbGl0eVR5cGUiLCAibmEiLCAwLCAxLCBDb250ZW50RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbnRlbnRQYWNrYWdlRUNsYXNzLCBDb250ZW50UGFja2FnZS5jbGFzcywgIkNvbnRlbnRQYWNrYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50UGFja2FnZV9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBDb250ZW50UGFja2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50KCksIHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSwgbnVsbCwgImNvbnRlbnRFbGVtZW50IiwgbnVsbCwgMCwgLTEsIENvbnRlbnRQYWNrYWdlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MsIEN1c3RvbUNhdGVnb3J5LmNsYXNzLCAiQ3VzdG9tQ2F0ZWdvcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEN1c3RvbUNhdGVnb3J5X0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIEN1c3RvbUNhdGVnb3J5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2F0ZWdvcml6ZWRFbGVtZW50IiwgbnVsbCwgMCwgLTEsIEN1c3RvbUNhdGVnb3J5LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzdWJDYXRlZ29yeSIsIG51bGwsIDAsIC0xLCBDdXN0b21DYXRlZ29yeS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkZWxpdmVyYWJsZUVDbGFzcywgRGVsaXZlcmFibGUuY2xhc3MsICJEZWxpdmVyYWJsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVsaXZlcmFibGVfR3JvdXAzKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDMiLCBudWxsLCAwLCAtMSwgRGVsaXZlcmFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlbGl2ZXJlZFdvcmtQcm9kdWN0IiwgbnVsbCwgMCwgLTEsIERlbGl2ZXJhYmxlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MsIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24uY2xhc3MsICJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJleHRlcm5hbERlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwYWNrYWdpbmdHdWlkYW5jZSIsIG51bGwsIDAsIDEsIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGVsaXZlcnlQcm9jZXNzRUNsYXNzLCBEZWxpdmVyeVByb2Nlc3MuY2xhc3MsICJEZWxpdmVyeVByb2Nlc3MiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJ5UHJvY2Vzc19Hcm91cDMoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMyIsIG51bGwsIDAsIC0xLCBEZWxpdmVyeVByb2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNvbW11bmljYXRpb25zTWF0ZXJpYWwiLCBudWxsLCAwLCAtMSwgRGVsaXZlcnlQcm9jZXNzLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZWR1Y2F0aW9uTWF0ZXJpYWwiLCBudWxsLCAwLCAtMSwgRGVsaXZlcnlQcm9jZXNzLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInNjYWxlIiwgbnVsbCwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJvamVjdENoYXJhY3RlcmlzdGljcyIsIG51bGwsIDAsIDEsIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmlza0xldmVsIiwgbnVsbCwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXN0aW1hdGluZ1RlY2huaXF1ZSIsIG51bGwsIDAsIDEsIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByb2plY3RNZW1iZXJFeHBlcnRpc2UiLCBudWxsLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidHlwZU9mQ29udHJhY3QiLCBudWxsLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MsIERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywgIkRlc2NyaWJhYmxlRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpLCB0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpLCBudWxsLCAicHJlc2VudGF0aW9uIiwgbnVsbCwgMCwgMSwgRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmliYWJsZUVsZW1lbnRfTm9kZWljb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJub2RlaWNvbiIsIG51bGwsIDAsIDEsIERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJlc2VudGF0aW9uTmFtZSIsIG51bGwsIDAsIDEsIERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzaGFwZWljb24iLCBudWxsLCAwLCAxLCBEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGVzY3JpcHRvckVDbGFzcywgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvci5jbGFzcywgIkRlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIsIG51bGwsIDAsIDEsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MsIERlc2NyaXB0b3JEZXNjcmlwdGlvbi5jbGFzcywgIkRlc2NyaXB0b3JEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlZmluZWREZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIERlc2NyaXB0b3JEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkaXNjaXBsaW5lRUNsYXNzLCBEaXNjaXBsaW5lLmNsYXNzLCAiRGlzY2lwbGluZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGlzY2lwbGluZV9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBEaXNjaXBsaW5lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGlzY2lwbGluZV9UYXNrKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidGFzayIsIG51bGwsIDAsIC0xLCBEaXNjaXBsaW5lLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RGlzY2lwbGluZV9TdWJEaXNjaXBsaW5lKCksIHRoaXMuZ2V0RGlzY2lwbGluZSgpLCBudWxsLCAic3ViRGlzY2lwbGluZSIsIG51bGwsIDAsIC0xLCBEaXNjaXBsaW5lLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVmZXJlbmNlV29ya2Zsb3ciLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MsIERpc2NpcGxpbmVHcm91cGluZy5jbGFzcywgIkRpc2NpcGxpbmVHcm91cGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIERpc2NpcGxpbmVHcm91cGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGlzY2lwbGluZSIsIG51bGwsIDAsIC0xLCBEaXNjaXBsaW5lR3JvdXBpbmcuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZG9jdW1lbnRSb290RUNsYXNzLCBEb2N1bWVudFJvb3QuY2xhc3MsICJEb2N1bWVudFJvb3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERvY3VtZW50Um9vdF9NaXhlZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAibWl4ZWQiLCBudWxsLCAwLCAtMSwgbnVsbCwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERvY3VtZW50Um9vdF9YTUxOU1ByZWZpeE1hcCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhNTE5TUHJlZml4TWFwIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBudWxsLCAieFNJU2NoZW1hTG9jYXRpb24iLCBudWxsLCAwLCAtMSwgbnVsbCwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREb2N1bWVudFJvb3RfTWV0aG9kQ29uZmlndXJhdGlvbigpLCB0aGlzLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSwgbnVsbCwgIm1ldGhvZENvbmZpZ3VyYXRpb24iLCBudWxsLCAwLCAtMiwgbnVsbCwgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RG9jdW1lbnRSb290X01ldGhvZExpYnJhcnkoKSwgdGhpcy5nZXRNZXRob2RMaWJyYXJ5KCksIG51bGwsICJtZXRob2RMaWJyYXJ5IiwgbnVsbCwgMCwgLTIsIG51bGwsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERvY3VtZW50Um9vdF9NZXRob2RQbHVnaW4oKSwgdGhpcy5nZXRNZXRob2RQbHVnaW4oKSwgbnVsbCwgIm1ldGhvZFBsdWdpbiIsIG51bGwsIDAsIC0yLCBudWxsLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZG9tYWluRUNsYXNzLCBEb21haW4uY2xhc3MsICJEb21haW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERvbWFpbl9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBEb21haW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREb21haW5fV29ya1Byb2R1Y3QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ3b3JrUHJvZHVjdCIsIG51bGwsIDAsIC0xLCBEb21haW4uY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREb21haW5fU3ViZG9tYWluKCksIHRoaXMuZ2V0RG9tYWluKCksIG51bGwsICJzdWJkb21haW4iLCBudWxsLCAwLCAtMSwgRG9tYWluLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZWxlbWVudEVDbGFzcywgRWxlbWVudC5jbGFzcywgIkVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhlc3RpbWF0ZUVDbGFzcywgRXN0aW1hdGUuY2xhc3MsICJFc3RpbWF0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXN0aW1hdGVfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgRXN0aW1hdGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uTWV0cmljKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXN0aW1hdGlvbk1ldHJpYyIsIG51bGwsIDAsIC0xLCBFc3RpbWF0ZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVzdGltYXRlX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIsIG51bGwsIDAsIC0xLCBFc3RpbWF0ZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlc3RpbWF0aW5nTWV0cmljRUNsYXNzLCBFc3RpbWF0aW5nTWV0cmljLmNsYXNzLCAiRXN0aW1hdGluZ01ldHJpYyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGVzdGltYXRpb25Db25zaWRlcmF0aW9uc0VDbGFzcywgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmNsYXNzLCAiRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoZXhhbXBsZUVDbGFzcywgRXhhbXBsZS5jbGFzcywgIkV4YW1wbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhndWlkYW5jZUVDbGFzcywgR3VpZGFuY2UuY2xhc3MsICJHdWlkYW5jZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3MsIEd1aWRhbmNlRGVzY3JpcHRpb24uY2xhc3MsICJHdWlkYW5jZURlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhdHRhY2htZW50IiwgbnVsbCwgMCwgMSwgR3VpZGFuY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhndWlkZWxpbmVFQ2xhc3MsIEd1aWRlbGluZS5jbGFzcywgIkd1aWRlbGluZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGl0ZXJhdGlvbkVDbGFzcywgSXRlcmF0aW9uLmNsYXNzLCAiSXRlcmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIk1ldGhvZENvbmZpZ3VyYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZENvbmZpZ3VyYXRpb25fQmFzZUNvbmZpZ3VyYXRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJiYXNlQ29uZmlndXJhdGlvbiIsIG51bGwsIDAsIC0xLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtZXRob2RQbHVnaW5TZWxlY3Rpb24iLCBudWxsLCAwLCAtMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iLCBudWxsLCAwLCAtMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZWZhdWx0VmlldyIsIG51bGwsIDAsIDEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJvY2Vzc1ZpZXciLCBudWxsLCAwLCAtMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXRob2RFbGVtZW50RUNsYXNzLCBNZXRob2RFbGVtZW50LmNsYXNzLCAiTWV0aG9kRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kRWxlbWVudF9Hcm91cCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAiLCBudWxsLCAwLCAtMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZEVsZW1lbnRfT3duZWRSdWxlKCksIHRoaXMuZ2V0Q29uc3RyYWludCgpLCBudWxsLCAib3duZWRSdWxlIiwgbnVsbCwgMCwgLTEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImJyaWVmRGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kRWxlbWVudF9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZEVsZW1lbnRfT3JkZXJpbmdHdWlkZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm9yZGVyaW5nR3VpZGUiLCBudWxsLCAwLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kRWxlbWVudF9TdXBwcmVzc2VkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgInN1cHByZXNzZWQiLCBudWxsLCAwLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWV0aG9kTGlicmFyeUVDbGFzcywgTWV0aG9kTGlicmFyeS5jbGFzcywgIk1ldGhvZExpYnJhcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2luKCksIHRoaXMuZ2V0TWV0aG9kUGx1Z2luKCksIG51bGwsICJtZXRob2RQbHVnaW4iLCBudWxsLCAwLCAtMSwgTWV0aG9kTGlicmFyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RDb25maWd1cmF0aW9uKCksIHRoaXMuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLCBudWxsLCAibWV0aG9kQ29uZmlndXJhdGlvbiIsIG51bGwsIDAsIC0xLCBNZXRob2RMaWJyYXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RMaWJyYXJ5X1Rvb2woKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ0b29sIiwgbnVsbCwgMCwgMSwgTWV0aG9kTGlicmFyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZFBhY2thZ2VFQ2xhc3MsIE1ldGhvZFBhY2thZ2UuY2xhc3MsICJNZXRob2RQYWNrYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQYWNrYWdlX0dyb3VwMSgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAxIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQYWNrYWdlX1JldXNlZFBhY2thZ2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZXVzZWRQYWNrYWdlIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBhY2thZ2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RQYWNrYWdlX01ldGhvZFBhY2thZ2UoKSwgdGhpcy5nZXRNZXRob2RQYWNrYWdlKCksIG51bGwsICJtZXRob2RQYWNrYWdlIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBhY2thZ2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImdsb2JhbCIsIG51bGwsIDAsIDEsIE1ldGhvZFBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXRob2RQbHVnaW5FQ2xhc3MsIE1ldGhvZFBsdWdpbi5jbGFzcywgIk1ldGhvZFBsdWdpbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGx1Z2luX1JlZmVyZW5jZWRNZXRob2RQbHVnaW4oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZWZlcmVuY2VkTWV0aG9kUGx1Z2luIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBsdWdpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlKCksIHRoaXMuZ2V0TWV0aG9kUGFja2FnZSgpLCBudWxsLCAibWV0aG9kUGFja2FnZSIsIG51bGwsIDAsIC0xLCBNZXRob2RQbHVnaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJ1c2VyQ2hhbmdlYWJsZSIsIG51bGwsIDAsIDEsIE1ldGhvZFBsdWdpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZFVuaXRFQ2xhc3MsIE1ldGhvZFVuaXQuY2xhc3MsICJNZXRob2RVbml0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RVbml0X0NvcHlyaWdodCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNvcHlyaWdodCIsIG51bGwsIDAsIDEsIE1ldGhvZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RVbml0X0F1dGhvcnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhdXRob3JzIiwgbnVsbCwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXREYXRlVGltZSgpLCAiY2hhbmdlRGF0ZSIsIG51bGwsIDAsIDEsIE1ldGhvZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2hhbmdlRGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBNZXRob2RVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmVyc2lvbiIsIG51bGwsIDAsIDEsIE1ldGhvZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWlsZXN0b25lRUNsYXNzLCBNaWxlc3RvbmUuY2xhc3MsICJNaWxlc3RvbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhuYW1lZEVsZW1lbnRFQ2xhc3MsIE5hbWVkRWxlbWVudC5jbGFzcywgIk5hbWVkRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgTmFtZWRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG91dGNvbWVFQ2xhc3MsIE91dGNvbWUuY2xhc3MsICJPdXRjb21lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MocGFja2FnZWFibGVFbGVtZW50RUNsYXNzLCBQYWNrYWdlYWJsZUVsZW1lbnQuY2xhc3MsICJQYWNrYWdlYWJsZUVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhwaGFzZUVDbGFzcywgUGhhc2UuY2xhc3MsICJQaGFzZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHBsYW5uaW5nRGF0YUVDbGFzcywgUGxhbm5pbmdEYXRhLmNsYXNzLCAiUGxhbm5pbmdEYXRhIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQbGFubmluZ0RhdGFfRmluaXNoRGF0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXREYXRlVGltZSgpLCAiZmluaXNoRGF0ZSIsIG51bGwsIDAsIDEsIFBsYW5uaW5nRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBsYW5uaW5nRGF0YV9SYW5rKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmFuayIsIG51bGwsIDAsIDEsIFBsYW5uaW5nRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBsYW5uaW5nRGF0YV9TdGFydERhdGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0RGF0ZVRpbWUoKSwgInN0YXJ0RGF0ZSIsIG51bGwsIDAsIDEsIFBsYW5uaW5nRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwcmFjdGljZUVDbGFzcywgUHJhY3RpY2UuY2xhc3MsICJQcmFjdGljZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJhY3RpY2VfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgUHJhY3RpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFjdGl2aXR5UmVmZXJlbmNlIiwgbnVsbCwgMCwgLTEsIFByYWN0aWNlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNvbnRlbnRSZWZlcmVuY2UiLCBudWxsLCAwLCAtMSwgUHJhY3RpY2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQcmFjdGljZV9TdWJQcmFjdGljZSgpLCB0aGlzLmdldFByYWN0aWNlKCksIG51bGwsICJzdWJQcmFjdGljZSIsIG51bGwsIDAsIC0xLCBQcmFjdGljZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICJQcmFjdGljZURlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYWRkaXRpb25hbEluZm8iLCBudWxsLCAwLCAxLCBQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BcHBsaWNhdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFwcGxpY2F0aW9uIiwgbnVsbCwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImJhY2tncm91bmQiLCBudWxsLCAwLCAxLCBQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImdvYWxzIiwgbnVsbCwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlRGVzY3JpcHRpb25fTGV2ZWxzT2ZBZG9wdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImxldmVsc09mQWRvcHRpb24iLCBudWxsLCAwLCAxLCBQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJvYmxlbSIsIG51bGwsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHJvY2Vzc0VDbGFzcywgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzcy5jbGFzcywgIlByb2Nlc3MiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NfSW5jbHVkZXNQYXR0ZXJuKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiaW5jbHVkZXNQYXR0ZXJuIiwgbnVsbCwgMCwgLTEsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVmYXVsdENvbnRleHQiLCBudWxsLCAwLCAxLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YWxpZENvbnRleHQiLCBudWxsLCAwLCAtMSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCBQcm9jZXNzQ29tcG9uZW50LmNsYXNzLCAiUHJvY2Vzc0NvbXBvbmVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc0NvbXBvbmVudF9Db3B5cmlnaHQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjb3B5cmlnaHQiLCBudWxsLCAwLCAxLCBQcm9jZXNzQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UHJvY2Vzc0NvbXBvbmVudF9JbnRlcmZhY2UoKSwgdGhpcy5nZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCksIG51bGwsICJpbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBQcm9jZXNzQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKSwgdGhpcy5nZXRQcm9jZXNzKCksIG51bGwsICJwcm9jZXNzIiwgbnVsbCwgMSwgMSwgUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc0NvbXBvbmVudF9BdXRob3JzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXV0aG9ycyIsIG51bGwsIDAsIDEsIFByb2Nlc3NDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzQ29tcG9uZW50X0NoYW5nZURhdGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0RGF0ZVRpbWUoKSwgImNoYW5nZURhdGUiLCBudWxsLCAwLCAxLCBQcm9jZXNzQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc0NvbXBvbmVudF9DaGFuZ2VEZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNoYW5nZURlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NDb21wb25lbnRfVmVyc2lvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZlcnNpb24iLCBudWxsLCAwLCAxLCBQcm9jZXNzQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MsIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuY2xhc3MsICJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0dyb3VwMSgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAxIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZVNwZWNpZmljYXRpb24oKSwgdGhpcy5nZXRUYXNrRGVzY3JpcHRvcigpLCBudWxsLCAiaW50ZXJmYWNlU3BlY2lmaWNhdGlvbiIsIG51bGwsIDAsIC0xLCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZUlPKCksIHRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksIG51bGwsICJpbnRlcmZhY2VJTyIsIG51bGwsIDAsIC0xLCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICJQcm9jZXNzRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInNjb3BlIiwgbnVsbCwgMCwgMSwgUHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1VzYWdlTm90ZXMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ1c2FnZU5vdGVzIiwgbnVsbCwgMCwgMSwgUHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX0V4dGVybmFsSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJleHRlcm5hbElkIiwgbnVsbCwgMCwgMSwgUHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHByb2Nlc3NFbGVtZW50RUNsYXNzLCBQcm9jZXNzRWxlbWVudC5jbGFzcywgIlByb2Nlc3NFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MocHJvY2Vzc1BhY2thZ2VFQ2xhc3MsIFByb2Nlc3NQYWNrYWdlLmNsYXNzLCAiUHJvY2Vzc1BhY2thZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NQYWNrYWdlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnQoKSwgdGhpcy5nZXRQcm9jZXNzRWxlbWVudCgpLCBudWxsLCAicHJvY2Vzc0VsZW1lbnQiLCBudWxsLCAwLCAtMSwgUHJvY2Vzc1BhY2thZ2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcywgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuY2xhc3MsICJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfR3JvdXAzKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDMiLCBudWxsLCAwLCAtMSwgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlUHJvY2VzcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImJhc2VQcm9jZXNzIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJlcG9ydEVDbGFzcywgUmVwb3J0LmNsYXNzLCAiUmVwb3J0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MocmV1c2FibGVBc3NldEVDbGFzcywgUmV1c2FibGVBc3NldC5jbGFzcywgIlJldXNhYmxlQXNzZXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhyb2FkbWFwRUNsYXNzLCBSb2FkbWFwLmNsYXNzLCAiUm9hZG1hcCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHJvbGVFQ2xhc3MsIFJvbGUuY2xhc3MsICJSb2xlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVzcG9uc2libGVGb3IiLCBudWxsLCAwLCAtMSwgUm9sZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhyb2xlRGVzY3JpcHRpb25FQ2xhc3MsIFJvbGVEZXNjcmlwdGlvbi5jbGFzcywgIlJvbGVEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXNzaWdubWVudEFwcHJvYWNoZXMiLCBudWxsLCAwLCAxLCBSb2xlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2tpbGxzIiwgbnVsbCwgMCwgMSwgUm9sZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic3lub255bXMiLCBudWxsLCAwLCAxLCBSb2xlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mocm9sZURlc2NyaXB0b3JFQ2xhc3MsIFJvbGVEZXNjcmlwdG9yLmNsYXNzLCAiUm9sZURlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyb2xlIiwgbnVsbCwgMCwgMSwgUm9sZURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlc3BvbnNpYmxlRm9yIiwgbnVsbCwgMCwgLTEsIFJvbGVEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJvbGVTZXRFQ2xhc3MsIFJvbGVTZXQuY2xhc3MsICJSb2xlU2V0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlU2V0X0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFJvbGVTZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlU2V0X1JvbGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyb2xlIiwgbnVsbCwgMCwgLTEsIFJvbGVTZXQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mocm9sZVNldEdyb3VwaW5nRUNsYXNzLCBSb2xlU2V0R3JvdXBpbmcuY2xhc3MsICJSb2xlU2V0R3JvdXBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVTZXRHcm91cGluZ19Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBSb2xlU2V0R3JvdXBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJvbGVTZXQiLCBudWxsLCAwLCAtMSwgUm9sZVNldEdyb3VwaW5nLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHNlY3Rpb25FQ2xhc3MsIFNlY3Rpb24uY2xhc3MsICJTZWN0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN0aW9uX1N1YlNlY3Rpb24oKSwgdGhpcy5nZXRTZWN0aW9uKCksIG51bGwsICJzdWJTZWN0aW9uIiwgbnVsbCwgMCwgMSwgU2VjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdGlvbl9QcmVkZWNlc3NvcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByZWRlY2Vzc29yIiwgbnVsbCwgMCwgMSwgU2VjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlY3Rpb25fRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFNlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2VjdGlvbk5hbWUiLCBudWxsLCAwLCAxLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIsIG51bGwsIDAsIDEsIFNlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN0aW9uX1ZhcmlhYmlsaXR5VHlwZSgpLCB0aGlzLmdldFZhcmlhYmlsaXR5VHlwZSgpLCAidmFyaWFiaWxpdHlUeXBlIiwgIm5hIiwgMCwgMSwgU2VjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcywgU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzLCAiU3VwcG9ydGluZ01hdGVyaWFsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3ModGFza0VDbGFzcywgVGFzay5jbGFzcywgIlRhc2siLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfUHJlY29uZGl0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJlY29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfUG9zdGNvbmRpdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInBvc3Rjb25kaXRpb24iLCBudWxsLCAwLCAxLCBUYXNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza19QZXJmb3JtZWRCeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInBlcmZvcm1lZEJ5IiwgbnVsbCwgMCwgMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYW5kYXRvcnlJbnB1dCIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza19PdXRwdXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJvdXRwdXQiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza19PcHRpb25hbElucHV0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAib3B0aW9uYWxJbnB1dCIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza19Fc3RpbWF0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImVzdGltYXRlIiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza19Ub29sTWVudG9yKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidG9vbE1lbnRvciIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHRhc2tEZXNjcmlwdGlvbkVDbGFzcywgVGFza0Rlc2NyaXB0aW9uLmNsYXNzLCAiVGFza0Rlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYWx0ZXJuYXRpdmVzIiwgbnVsbCwgMCwgMSwgVGFza0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwdXJwb3NlIiwgbnVsbCwgMCwgMSwgVGFza0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIlRhc2tEZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidGFzayIsIG51bGwsIDAsIDEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwZXJmb3JtZWRQcmltYXJpbHlCeSIsIG51bGwsIDAsIDEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFzc2lzdGVkQnkiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXh0ZXJuYWxJbnB1dCIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFuZGF0b3J5SW5wdXQiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAib3B0aW9uYWxJbnB1dCIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm91dHB1dCIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFRhc2tEZXNjcmlwdG9yX1N0ZXAoKSwgdGhpcy5nZXRTZWN0aW9uKCksIG51bGwsICJzdGVwIiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIiwgbnVsbCwgMCwgMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh0ZWFtUHJvZmlsZUVDbGFzcywgVGVhbVByb2ZpbGUuY2xhc3MsICJUZWFtUHJvZmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGVhbVByb2ZpbGVfR3JvdXAxKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDEiLCBudWxsLCAwLCAtMSwgVGVhbVByb2ZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUZWFtUHJvZmlsZV9Sb2xlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicm9sZSIsIG51bGwsIDAsIC0xLCBUZWFtUHJvZmlsZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInN1cGVyVGVhbSIsIG51bGwsIDAsIC0xLCBUZWFtUHJvZmlsZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzdWJUZWFtIiwgbnVsbCwgMCwgLTEsIFRlYW1Qcm9maWxlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHRlbXBsYXRlRUNsYXNzLCBUZW1wbGF0ZS5jbGFzcywgIlRlbXBsYXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3ModGVybURlZmluaXRpb25FQ2xhc3MsIFRlcm1EZWZpbml0aW9uLmNsYXNzLCAiVGVybURlZmluaXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh0b29sRUNsYXNzLCBUb29sLmNsYXNzLCAiVG9vbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VG9vbF9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBUb29sLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VG9vbF9Ub29sTWVudG9yKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidG9vbE1lbnRvciIsIG51bGwsIDAsIC0xLCBUb29sLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHRvb2xNZW50b3JFQ2xhc3MsIFRvb2xNZW50b3IuY2xhc3MsICJUb29sTWVudG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Mod2hpdGVwYXBlckVDbGFzcywgV2hpdGVwYXBlci5jbGFzcywgIldoaXRlcGFwZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsICJXb3JrQnJlYWtkb3duRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfR3JvdXAxKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDEiLCBudWxsLCAwLCAtMSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9QcmVkZWNlc3NvcigpLCB0aGlzLmdldFdvcmtPcmRlcigpLCBudWxsLCAicHJlZGVjZXNzb3IiLCBudWxsLCAwLCAtMSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaXNFdmVudERyaXZlbiIsIG51bGwsIDAsIDEsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaXNPbmdvaW5nIiwgbnVsbCwgMCwgMSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzUmVwZWF0YWJsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJpc1JlcGVhdGFibGUiLCBudWxsLCAwLCAxLCBXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdvcmtEZWZpbml0aW9uRUNsYXNzLCBXb3JrRGVmaW5pdGlvbi5jbGFzcywgIldvcmtEZWZpbml0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcmVjb25kaXRpb24iLCBudWxsLCAwLCAxLCBXb3JrRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwb3N0Y29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgV29ya0RlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod29ya09yZGVyRUNsYXNzLCBXb3JrT3JkZXIuY2xhc3MsICJXb3JrT3JkZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtPcmRlcl9WYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgV29ya09yZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya09yZGVyX0xpbmtUeXBlKCksIHRoaXMuZ2V0V29ya09yZGVyVHlwZSgpLCAibGlua1R5cGUiLCAiZmluaXNoVG9TdGFydCIsIDAsIDEsIFdvcmtPcmRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya09yZGVyX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBXb3JrT3JkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3b3JrUHJvZHVjdEVDbGFzcywgV29ya1Byb2R1Y3QuY2xhc3MsICJXb3JrUHJvZHVjdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3RfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImVzdGltYXRlIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3RfUmVwb3J0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVwb3J0IiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ0ZW1wbGF0ZSIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3IoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ0b29sTWVudG9yIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MsIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uY2xhc3MsICJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0ltcGFjdE9mTm90SGF2aW5nKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiaW1wYWN0T2ZOb3RIYXZpbmciLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHVycG9zZSIsIG51bGwsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVhc29uc0Zvck5vdE5lZWRpbmciLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9FeHRlcm5hbElkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXh0ZXJuYWxJZCIsIG51bGwsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICJXb3JrUHJvZHVjdERlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIndvcmtQcm9kdWN0IiwgbnVsbCwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0dyb3VwMSgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAxIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiaW1wYWN0ZWRCeSIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImltcGFjdHMiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZWxpdmVyYWJsZVBhcnRzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhY3Rpdml0eUVudHJ5U3RhdGUiLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhY3Rpdml0eUV4aXRTdGF0ZSIsIG51bGwsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3b3JrUHJvZHVjdFR5cGVFQ2xhc3MsIFdvcmtQcm9kdWN0VHlwZS5jbGFzcywgIldvcmtQcm9kdWN0VHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3RUeXBlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIndvcmtQcm9kdWN0IiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0VHlwZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuY2xhc3MsICJWYXJpYWJpbGl0eVR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuTkFfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVF9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0od29ya09yZGVyVHlwZUVFbnVtLCBXb3JrT3JkZXJUeXBlLmNsYXNzLCAiV29ya09yZGVyVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwod29ya09yZGVyVHlwZUVFbnVtLCBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHdvcmtPcmRlclR5cGVFRW51bSwgV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fRklOSVNIX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwod29ya09yZGVyVHlwZUVFbnVtLCBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX1NUQVJUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwod29ya09yZGVyVHlwZUVFbnVtLCBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX0ZJTklTSF9MSVRFUkFMKTsKLQotCQkvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKLQkJaW5pdEVEYXRhVHlwZSh2YXJpYWJpbGl0eVR5cGVPYmplY3RFRGF0YVR5cGUsIFZhcmlhYmlsaXR5VHlwZS5jbGFzcywgIlZhcmlhYmlsaXR5VHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVEYXRhVHlwZSh3b3JrT3JkZXJUeXBlT2JqZWN0RURhdGFUeXBlLCBXb3JrT3JkZXJUeXBlLmNsYXNzLCAiV29ya09yZGVyVHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIGFubm90YXRpb25zCi0JCS8vIGh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YQotCQljcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgYW5ub3RhdGlvbnMgZm9yIDxiPmh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YTwvYj4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCkgewotCQlTdHJpbmcgc291cmNlID0gImh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoYWN0aXZpdHlFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkFjdGl2aXR5IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eV9QcmVjb25kaXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJlY29uZGl0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X1Bvc3Rjb25kaXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUG9zdGNvbmRpdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI2IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQnJlYWtkb3duRWxlbWVudCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eV9DaGVja2xpc3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ2hlY2tsaXN0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI2IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X0NvbmNlcHQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ29uY2VwdCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eV9FeGFtcGxlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkV4YW1wbGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjYiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZpdHlfR3VpZGVsaW5lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkd1aWRlbGluZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eV9Sb2FkbWFwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJvYWRtYXAiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjYiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZpdHlfUmV1c2FibGVBc3NldCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZXVzYWJsZUFzc2V0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI2IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X1N1cHBvcnRpbmdNYXRlcmlhbCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTdXBwb3J0aW5nTWF0ZXJpYWwiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjYiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZpdHlfV2hpdGVwYXBlcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJXaGl0ZXBhcGVyIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI2IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X0lzRW5hY3RhYmxlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiSXNFbmFjdGFibGUiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZpdHlfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZpdHlfVmFyaWFiaWxpdHlUeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidmFyaWFiaWxpdHlUeXBlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJBY3Rpdml0eURlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQWx0ZXJuYXRpdmVzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd1RvU3RhZmYoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiSG93VG9TdGFmZiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlB1cnBvc2UiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGFydGlmYWN0RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJBcnRpZmFjdCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXJ0aWZhY3RfR3JvdXAzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyNyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJDb250YWluZWRBcnRpZmFjdCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQXJ0aWZhY3REZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFydGlmYWN0RGVzY3JpcHRpb25fQnJpZWZPdXRsaW5lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkJyaWVmT3V0bGluZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmVwcmVzZW50YXRpb25PcHRpb25zIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChicmVha2Rvd25FbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJCcmVha2Rvd25FbGVtZW50IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByZXNlbnRlZEFmdGVyIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByZXNlbnRlZEJlZm9yZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQbGFubmluZ0RhdGEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXR5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN1cGVyQWN0aXZpdHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImhhc011bHRpcGxlT2NjdXJyZW5jZXMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlzT3B0aW9uYWwiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaXNQbGFubmVkIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInByZWZpeCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInVzYWdlR3VpZGFuY2UiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJDYXBhYmlsaXR5UGF0dGVybiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNoZWNrbGlzdEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ2hlY2tsaXN0IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoY29tcG9zaXRlUm9sZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ29tcG9zaXRlUm9sZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29tcG9zaXRlUm9sZV9Hcm91cDEoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjIyIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQWdncmVnYXRlZFJvbGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjIiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNvbmNlcHRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkNvbmNlcHQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjb25zdHJhaW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJDb25zdHJhaW50IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29uc3RyYWludF9NYWluRGVzY3JpcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJtYWluRGVzY3JpcHRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNvbnRlbnRDYXRlZ29yeUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ29udGVudENhdGVnb3J5IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoY29udGVudENhdGVnb3J5UGFja2FnZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ29udGVudENhdGVnb3J5UGFja2FnZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjExIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfQ29udGVudENhdGVnb3J5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNvbnRlbnRDYXRlZ29yeSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxMSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoY29udGVudERlc2NyaXB0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJDb250ZW50RGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1haW5EZXNjcmlwdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIktleUNvbnNpZGVyYXRpb25zIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlNlY3Rpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNvbnRlbnRFbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJDb250ZW50RWxlbWVudCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudEVsZW1lbnRfR3JvdXAxKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ2hlY2tsaXN0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjExIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRFbGVtZW50X0NvbmNlcHQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ29uY2VwdCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkV4YW1wbGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkd1aWRlbGluZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9SZXVzYWJsZUFzc2V0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJldXNhYmxlQXNzZXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN1cHBvcnRpbmdNYXRlcmlhbCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9XaGl0ZXBhcGVyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIldoaXRlcGFwZXIiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidmFyaWFiaWxpdHlUeXBlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjb250ZW50UGFja2FnZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ29udGVudFBhY2thZ2UiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRQYWNrYWdlX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MTEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ29udGVudEVsZW1lbnQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTEiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGN1c3RvbUNhdGVnb3J5RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJDdXN0b21DYXRlZ29yeSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q3VzdG9tQ2F0ZWdvcnlfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ2F0ZWdvcml6ZWRFbGVtZW50IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjIxIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3J5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN1YkNhdGVnb3J5IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjIxIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkZWxpdmVyYWJsZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRGVsaXZlcmFibGUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJhYmxlX0dyb3VwMygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRGVsaXZlcmVkV29ya1Byb2R1Y3QiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjciCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXh0ZXJuYWxEZXNjcmlwdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQYWNrYWdpbmdHdWlkYW5jZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZGVsaXZlcnlQcm9jZXNzRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJEZWxpdmVyeVByb2Nlc3MiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJ5UHJvY2Vzc19Hcm91cDMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjQyIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNvbW11bmljYXRpb25zTWF0ZXJpYWwiLAotCQkJICJncm91cCIsICIjZ3JvdXA6NDIiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkVkdWNhdGlvbk1hdGVyaWFsIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjQyIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTY2FsZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmlza0xldmVsIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkVzdGltYXRpbmdUZWNobmlxdWUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJvamVjdE1lbWJlckV4cGVydGlzZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fVHlwZU9mQ29udHJhY3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiVHlwZU9mQ29udHJhY3QiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRGVzY3JpYmFibGVFbGVtZW50IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByZXNlbnRhdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAibm9kZWljb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAicHJlc2VudGF0aW9uTmFtZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVzY3JpYmFibGVFbGVtZW50X1NoYXBlaWNvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInNoYXBlaWNvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZGVzY3JpcHRvckVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRGVzY3JpcHRvciIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRGVzY3JpcHRvckRlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZWZpbmVkRGVzY3JpcHRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRpc2NpcGxpbmVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRpc2NpcGxpbmUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERpc2NpcGxpbmVfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREaXNjaXBsaW5lX1Rhc2soKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiVGFzayIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREaXNjaXBsaW5lX1N1YkRpc2NpcGxpbmUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3ViRGlzY2lwbGluZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJlZmVyZW5jZVdvcmtmbG93IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjIxIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRpc2NpcGxpbmVHcm91cGluZyIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRGlzY2lwbGluZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkb2N1bWVudFJvb3RFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIiIsCi0JCQkgImtpbmQiLCAibWl4ZWQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RG9jdW1lbnRSb290X01peGVkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnRXaWxkY2FyZCIsCi0JCQkgIm5hbWUiLCAiOm1peGVkIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvY3VtZW50Um9vdF9YTUxOU1ByZWZpeE1hcCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInhtbG5zOnByZWZpeCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ4c2k6c2NoZW1hTG9jYXRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvY3VtZW50Um9vdF9NZXRob2RDb25maWd1cmF0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1ldGhvZENvbmZpZ3VyYXRpb24iLAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvY3VtZW50Um9vdF9NZXRob2RMaWJyYXJ5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1ldGhvZExpYnJhcnkiLAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvY3VtZW50Um9vdF9NZXRob2RQbHVnaW4oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWV0aG9kUGx1Z2luIiwKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkb21haW5FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRvbWFpbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RG9tYWluX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RG9tYWluX1dvcmtQcm9kdWN0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIldvcmtQcm9kdWN0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjIxIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvbWFpbl9TdWJkb21haW4oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3ViZG9tYWluIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjIxIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJFbGVtZW50IiwKLQkJCSAia2luZCIsICJlbXB0eSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZXN0aW1hdGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkVzdGltYXRlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFc3RpbWF0ZV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjIxIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVzdGltYXRlX0VzdGltYXRpb25NZXRyaWMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXN0aW1hdGlvbk1ldHJpYyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjIxIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlc3RpbWF0aW5nTWV0cmljRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJFc3RpbWF0aW5nTWV0cmljIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChleGFtcGxlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJFeGFtcGxlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ3VpZGFuY2VFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkd1aWRhbmNlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiR3VpZGFuY2VEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBdHRhY2htZW50IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChndWlkZWxpbmVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkd1aWRlbGluZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGl0ZXJhdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiSXRlcmF0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTWV0aG9kQ29uZmlndXJhdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJCYXNlQ29uZmlndXJhdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNZXRob2RQbHVnaW5TZWxlY3Rpb24iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJEZWZhdWx0VmlldyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByb2Nlc3NWaWV3IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXRob2RFbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJNZXRob2RFbGVtZW50IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RFbGVtZW50X0dyb3VwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RFbGVtZW50X093bmVkUnVsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJPd25lZFJ1bGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiYnJpZWZEZXNjcmlwdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudF9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlkIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RFbGVtZW50X09yZGVyaW5nR3VpZGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJvcmRlcmluZ0d1aWRlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJzdXBwcmVzc2VkIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXRob2RMaWJyYXJ5RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJNZXRob2RMaWJyYXJ5IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNZXRob2RQbHVnaW4iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RDb25maWd1cmF0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1ldGhvZENvbmZpZ3VyYXRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1ldGhvZFBhY2thZ2VFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIk1ldGhvZFBhY2thZ2UiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFBhY2thZ2VfR3JvdXAxKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDo3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFBhY2thZ2VfUmV1c2VkUGFja2FnZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZXVzZWRQYWNrYWdlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kUGFja2FnZV9NZXRob2RQYWNrYWdlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1ldGhvZFBhY2thZ2UiLAotCQkJICJncm91cCIsICIjZ3JvdXA6NyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kUGFja2FnZV9HbG9iYWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJnbG9iYWwiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1ldGhvZFBsdWdpbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTWV0aG9kUGx1Z2luIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RQbHVnaW5fUmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZWZlcmVuY2VkTWV0aG9kUGx1Z2luIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1ldGhvZFBhY2thZ2UiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidXNlckNoYW5nZWFibGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1ldGhvZFVuaXRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIk1ldGhvZFVuaXQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFVuaXRfQ29weXJpZ2h0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNvcHlyaWdodCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiYXV0aG9ycyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEYXRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiY2hhbmdlRGF0ZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImNoYW5nZURlc2NyaXB0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RVbml0X1ZlcnNpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ2ZXJzaW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtaWxlc3RvbmVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIk1pbGVzdG9uZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG5hbWVkRWxlbWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTmFtZWRFbGVtZW50IiwKLQkJCSAia2luZCIsICJlbXB0eSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXROYW1lZEVsZW1lbnRfTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgIm5hbWUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG91dGNvbWVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIk91dGNvbWUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwYWNrYWdlYWJsZUVsZW1lbnRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlBhY2thZ2VhYmxlRWxlbWVudCIsCi0JCQkgImtpbmQiLCAiZW1wdHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHBoYXNlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQaGFzZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHBsYW5uaW5nRGF0YUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUGxhbm5pbmdEYXRhIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJmaW5pc2hEYXRlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQbGFubmluZ0RhdGFfUmFuaygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInJhbmsiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBsYW5uaW5nRGF0YV9TdGFydERhdGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJzdGFydERhdGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByYWN0aWNlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQcmFjdGljZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJhY3RpY2VfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBY3Rpdml0eVJlZmVyZW5jZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNvbnRlbnRSZWZlcmVuY2UiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3ViUHJhY3RpY2UiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjEiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlByYWN0aWNlRGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFkZGl0aW9uYWxJbmZvIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFwcGxpY2F0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQmFja2dyb3VuZCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJHb2FscyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkxldmVsc09mQWRvcHRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcm9ibGVtIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwcm9jZXNzRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQcm9jZXNzIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJJbmNsdWRlc1BhdHRlcm4iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJEZWZhdWx0Q29udGV4dCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJWYWxpZENvbnRleHQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByb2Nlc3NDb21wb25lbnRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlByb2Nlc3NDb21wb25lbnQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRfQ29weXJpZ2h0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNvcHlyaWdodCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzQ29tcG9uZW50X0ludGVyZmFjZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJJbnRlcmZhY2UiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByb2Nlc3MiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRfQXV0aG9ycygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImF1dGhvcnMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGF0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImNoYW5nZURhdGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGVzY3JpcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJjaGFuZ2VEZXNjcmlwdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0NvbXBvbmVudF9WZXJzaW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidmVyc2lvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9Hcm91cDEoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjE5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJJbnRlcmZhY2VTcGVjaWZpY2F0aW9uIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiSW50ZXJmYWNlSU8iLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUHJvY2Vzc0Rlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlNjb3BlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJVc2FnZU5vdGVzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzRGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImV4dGVybmFsSWQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByb2Nlc3NFbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQcm9jZXNzRWxlbWVudCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByb2Nlc3NQYWNrYWdlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQcm9jZXNzUGFja2FnZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc1BhY2thZ2VfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzUGFja2FnZV9Qcm9jZXNzRWxlbWVudCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcm9jZXNzRWxlbWVudCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxMSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9Hcm91cDMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjQyIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0Jhc2VQcm9jZXNzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkJhc2VQcm9jZXNzIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjQyIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyZXBvcnRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlJlcG9ydCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHJldXNhYmxlQXNzZXRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlJldXNhYmxlQXNzZXQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyb2FkbWFwRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJSb2FkbWFwIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocm9sZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUm9sZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjIxIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmVzcG9uc2libGVGb3IiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjEiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHJvbGVEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUm9sZURlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFzc2lnbm1lbnRBcHByb2FjaGVzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlNraWxscyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN5bm9ueW1zIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyb2xlRGVzY3JpcHRvckVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUm9sZURlc2NyaXB0b3IiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUm9sZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZXNwb25zaWJsZUZvciIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocm9sZVNldEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUm9sZVNldCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZVNldF9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjIxIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVTZXRfUm9sZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSb2xlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjIxIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyb2xlU2V0R3JvdXBpbmdFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlJvbGVTZXRHcm91cGluZyIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZVNldEdyb3VwaW5nX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUm9sZVNldCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyMSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoc2VjdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiU2VjdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdGlvbl9TdWJTZWN0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN1YlNlY3Rpb24iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdGlvbl9QcmVkZWNlc3NvcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcmVkZWNlc3NvciIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdGlvbl9EZXNjcmlwdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJEZXNjcmlwdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdGlvbl9TZWN0aW9uTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInNlY3Rpb25OYW1lIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3Rpb25fVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eVR5cGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ2YXJpYWJpbGl0eVR5cGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiU3VwcG9ydGluZ01hdGVyaWFsIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodGFza0VDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVGFzayIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza19QcmVjb25kaXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJlY29uZGl0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfUG9zdGNvbmRpdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQb3N0Y29uZGl0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfUGVyZm9ybWVkQnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUGVyZm9ybWVkQnkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza19Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWFuZGF0b3J5SW5wdXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza19PdXRwdXQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiT3V0cHV0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza19PcHRpb25hbElucHV0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk9wdGlvbmFsSW5wdXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza19Fc3RpbWF0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJFc3RpbWF0ZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza19Ub29sTWVudG9yKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlRvb2xNZW50b3IiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHRhc2tEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVGFza0Rlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBbHRlcm5hdGl2ZXMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlB1cnBvc2UiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJUYXNrRGVzY3JpcHRvciIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJUYXNrIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlBlcmZvcm1lZFByaW1hcmlseUJ5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjYiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjYiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBc3Npc3RlZEJ5IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI2IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXh0ZXJuYWxJbnB1dCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNYW5kYXRvcnlJbnB1dCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk9wdGlvbmFsSW5wdXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjYiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk91dHB1dCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrRGVzY3JpcHRvcl9TdGVwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN0ZXAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0ZWFtUHJvZmlsZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVGVhbVByb2ZpbGUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRlYW1Qcm9maWxlX0dyb3VwMSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MTkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGVhbVByb2ZpbGVfUm9sZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSb2xlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTdXBlclRlYW0iLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTdWJUZWFtIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0ZW1wbGF0ZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVGVtcGxhdGUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0ZXJtRGVmaW5pdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVGVybURlZmluaXRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0b29sRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJUb29sIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUb29sX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VG9vbF9Ub29sTWVudG9yKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlRvb2xNZW50b3IiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjEiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHRvb2xNZW50b3JFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlRvb2xNZW50b3IiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh2YXJpYWJpbGl0eVR5cGVFRW51bSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVmFyaWFiaWxpdHlUeXBlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHZhcmlhYmlsaXR5VHlwZU9iamVjdEVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVmFyaWFiaWxpdHlUeXBlOk9iamVjdCIsCi0JCQkgImJhc2VUeXBlIiwgIlZhcmlhYmlsaXR5VHlwZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod2hpdGVwYXBlckVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV2hpdGVwYXBlciIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJXb3JrQnJlYWtkb3duRWxlbWVudCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfR3JvdXAxKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxOSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9QcmVkZWNlc3NvcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcmVkZWNlc3NvciIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxOSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlzRXZlbnREcml2ZW4iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlzT25nb2luZyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaXNSZXBlYXRhYmxlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3b3JrRGVmaW5pdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV29ya0RlZmluaXRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtEZWZpbml0aW9uX1ByZWNvbmRpdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcmVjb25kaXRpb24iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQb3N0Y29uZGl0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3b3JrT3JkZXJFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIldvcmtPcmRlciIsCi0JCQkgImtpbmQiLCAic2ltcGxlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtPcmRlcl9WYWx1ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICI6MCIsCi0JCQkgImtpbmQiLCAic2ltcGxlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrT3JkZXJfTGlua1R5cGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJsaW5rVHlwZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod29ya09yZGVyVHlwZUVFbnVtLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJXb3JrT3JkZXJUeXBlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdvcmtPcmRlclR5cGVPYmplY3RFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIldvcmtPcmRlclR5cGU6T2JqZWN0IiwKLQkJCSAiYmFzZVR5cGUiLCAiV29ya09yZGVyVHlwZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod29ya1Byb2R1Y3RFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIldvcmtQcm9kdWN0IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdF9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjIxIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0X0VzdGltYXRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkVzdGltYXRlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjIxIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3RfUmVwb3J0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJlcG9ydCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJUZW1wbGF0ZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9yKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlRvb2xNZW50b3IiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjEiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIldvcmtQcm9kdWN0RGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0ltcGFjdE9mTm90SGF2aW5nKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkltcGFjdE9mTm90SGF2aW5nIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHVycG9zZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9SZWFzb25zRm9yTm90TmVlZGluZygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZWFzb25zRm9yTm90TmVlZGluZyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9FeHRlcm5hbElkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiZXh0ZXJuYWxJZCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJXb3JrUHJvZHVjdERlc2NyaXB0b3IiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJXb3JrUHJvZHVjdCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfR3JvdXAxKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyMiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJJbXBhY3RlZEJ5IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjIyIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkltcGFjdHMiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjIiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRGVsaXZlcmFibGVQYXJ0cyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyMiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImFjdGl2aXR5RW50cnlTdGF0ZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiYWN0aXZpdHlFeGl0U3RhdGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdvcmtQcm9kdWN0VHlwZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV29ya1Byb2R1Y3RUeXBlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdFR5cGVfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiV29ya1Byb2R1Y3QiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjEiCi0JCSAgIH0pOwotCX0KLQotfSAvL1VtYVBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1doaXRlcGFwZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1doaXRlcGFwZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzMDM1M2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9XaGl0ZXBhcGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXaGl0ZXBhcGVySW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV2hpdGVwYXBlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXaGl0ZXBhcGVySW1wbCBleHRlbmRzIENvbmNlcHRJbXBsIGltcGxlbWVudHMgV2hpdGVwYXBlciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdoaXRlcGFwZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XSElURVBBUEVSOwotCX0KLQotfSAvL1doaXRlcGFwZXJJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDliNTcxNmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCNnZXRQcmVkZWNlc3NvciA8ZW0+UHJlZGVjZXNzb3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsI2lzSXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCNpc0lzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwjaXNJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrQnJlYWtkb3duRWxlbWVudEltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIFdvcmtCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDEoKSA8ZW0+R3JvdXAxPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAxID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzRXZlbnREcml2ZW4oKSA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzRXZlbnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19FVkVOVF9EUklWRU5fRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNFdmVudERyaXZlbigpIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNFdmVudERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFdmVudERyaXZlbiA9IElTX0VWRU5UX0RSSVZFTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgRXZlbnQgRHJpdmVuIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V2ZW50RHJpdmVuRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNPbmdvaW5nKCkgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNPbmdvaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfT05HT0lOR19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc09uZ29pbmcoKSA8ZW0+SXMgT25nb2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc09uZ29pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzT25nb2luZyA9IElTX09OR09JTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIE9uZ29pbmcgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzT25nb2luZ0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzUmVwZWF0YWJsZSgpIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzUmVwZWF0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX1JFUEVBVEFCTEVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNSZXBlYXRhYmxlKCkgPGVtPklzIFJlcGVhdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNSZXBlYXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcGVhdGFibGUgPSBJU19SRVBFQVRBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBSZXBlYXRhYmxlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcGVhdGFibGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMSgpIHsKLQkJaWYgKGdyb3VwMSA9PSBudWxsKSB7Ci0JCQlncm91cDEgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAxOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRQcmVkZWNlc3NvcigpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDEoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzRXZlbnREcml2ZW4oKSB7Ci0JCXJldHVybiBpc0V2ZW50RHJpdmVuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzRXZlbnREcml2ZW4oYm9vbGVhbiBuZXdJc0V2ZW50RHJpdmVuKSB7Ci0JCWJvb2xlYW4gb2xkSXNFdmVudERyaXZlbiA9IGlzRXZlbnREcml2ZW47Ci0JCWlzRXZlbnREcml2ZW4gPSBuZXdJc0V2ZW50RHJpdmVuOwotCQlib29sZWFuIG9sZElzRXZlbnREcml2ZW5FU2V0ID0gaXNFdmVudERyaXZlbkVTZXQ7Ci0JCWlzRXZlbnREcml2ZW5FU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4sIG9sZElzRXZlbnREcml2ZW4sIGlzRXZlbnREcml2ZW4sICFvbGRJc0V2ZW50RHJpdmVuRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNFdmVudERyaXZlbigpIHsKLQkJYm9vbGVhbiBvbGRJc0V2ZW50RHJpdmVuID0gaXNFdmVudERyaXZlbjsKLQkJYm9vbGVhbiBvbGRJc0V2ZW50RHJpdmVuRVNldCA9IGlzRXZlbnREcml2ZW5FU2V0OwotCQlpc0V2ZW50RHJpdmVuID0gSVNfRVZFTlRfRFJJVkVOX0VERUZBVUxUOwotCQlpc0V2ZW50RHJpdmVuRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOLCBvbGRJc0V2ZW50RHJpdmVuLCBJU19FVkVOVF9EUklWRU5fRURFRkFVTFQsIG9sZElzRXZlbnREcml2ZW5FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc0V2ZW50RHJpdmVuKCkgewotCQlyZXR1cm4gaXNFdmVudERyaXZlbkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc09uZ29pbmcoKSB7Ci0JCXJldHVybiBpc09uZ29pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNPbmdvaW5nKGJvb2xlYW4gbmV3SXNPbmdvaW5nKSB7Ci0JCWJvb2xlYW4gb2xkSXNPbmdvaW5nID0gaXNPbmdvaW5nOwotCQlpc09uZ29pbmcgPSBuZXdJc09uZ29pbmc7Ci0JCWJvb2xlYW4gb2xkSXNPbmdvaW5nRVNldCA9IGlzT25nb2luZ0VTZXQ7Ci0JCWlzT25nb2luZ0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkcsIG9sZElzT25nb2luZywgaXNPbmdvaW5nLCAhb2xkSXNPbmdvaW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNPbmdvaW5nKCkgewotCQlib29sZWFuIG9sZElzT25nb2luZyA9IGlzT25nb2luZzsKLQkJYm9vbGVhbiBvbGRJc09uZ29pbmdFU2V0ID0gaXNPbmdvaW5nRVNldDsKLQkJaXNPbmdvaW5nID0gSVNfT05HT0lOR19FREVGQVVMVDsKLQkJaXNPbmdvaW5nRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORywgb2xkSXNPbmdvaW5nLCBJU19PTkdPSU5HX0VERUZBVUxULCBvbGRJc09uZ29pbmdFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc09uZ29pbmcoKSB7Ci0JCXJldHVybiBpc09uZ29pbmdFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNSZXBlYXRhYmxlKCkgewotCQlyZXR1cm4gaXNSZXBlYXRhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzUmVwZWF0YWJsZShib29sZWFuIG5ld0lzUmVwZWF0YWJsZSkgewotCQlib29sZWFuIG9sZElzUmVwZWF0YWJsZSA9IGlzUmVwZWF0YWJsZTsKLQkJaXNSZXBlYXRhYmxlID0gbmV3SXNSZXBlYXRhYmxlOwotCQlib29sZWFuIG9sZElzUmVwZWF0YWJsZUVTZXQgPSBpc1JlcGVhdGFibGVFU2V0OwotCQlpc1JlcGVhdGFibGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFLCBvbGRJc1JlcGVhdGFibGUsIGlzUmVwZWF0YWJsZSwgIW9sZElzUmVwZWF0YWJsZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzUmVwZWF0YWJsZSgpIHsKLQkJYm9vbGVhbiBvbGRJc1JlcGVhdGFibGUgPSBpc1JlcGVhdGFibGU7Ci0JCWJvb2xlYW4gb2xkSXNSZXBlYXRhYmxlRVNldCA9IGlzUmVwZWF0YWJsZUVTZXQ7Ci0JCWlzUmVwZWF0YWJsZSA9IElTX1JFUEVBVEFCTEVfRURFRkFVTFQ7Ci0JCWlzUmVwZWF0YWJsZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEUsIG9sZElzUmVwZWF0YWJsZSwgSVNfUkVQRUFUQUJMRV9FREVGQVVMVCwgb2xkSXNSZXBlYXRhYmxlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNSZXBlYXRhYmxlKCkgewotCQlyZXR1cm4gaXNSZXBlYXRhYmxlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAxKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFByZWRlY2Vzc29yKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMToKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDEoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMSgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFREVDRVNTT1I6Ci0JCQkJcmV0dXJuIGdldFByZWRlY2Vzc29yKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJCXJldHVybiBpc0lzRXZlbnREcml2ZW4oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJCQlyZXR1cm4gaXNJc09uZ29pbmcoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRToKLQkJCQlyZXR1cm4gaXNJc1JlcGVhdGFibGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMSgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUjoKLQkJCQlnZXRQcmVkZWNlc3NvcigpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJlZGVjZXNzb3IoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQkJc2V0SXNFdmVudERyaXZlbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJCQlzZXRJc09uZ29pbmcoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU6Ci0JCQkJc2V0SXNSZXBlYXRhYmxlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOgotCQkJCWdldEdyb3VwMSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SOgotCQkJCWdldFByZWRlY2Vzc29yKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJCXVuc2V0SXNFdmVudERyaXZlbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQkJCXVuc2V0SXNPbmdvaW5nKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU6Ci0JCQkJdW5zZXRJc1JlcGVhdGFibGUoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJcmV0dXJuIGdyb3VwMSAhPSBudWxsICYmICFncm91cDEuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SOgotCQkJCXJldHVybiAhZ2V0UHJlZGVjZXNzb3IoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJCXJldHVybiBpc1NldElzRXZlbnREcml2ZW4oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQkJCXJldHVybiBpc1NldElzT25nb2luZygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU6Ci0JCQkJcmV0dXJuIGlzU2V0SXNSZXBlYXRhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDE6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNFdmVudERyaXZlbjogIik7Ci0JCWlmIChpc0V2ZW50RHJpdmVuRVNldCkgcmVzdWx0LmFwcGVuZChpc0V2ZW50RHJpdmVuKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNPbmdvaW5nOiAiKTsKLQkJaWYgKGlzT25nb2luZ0VTZXQpIHJlc3VsdC5hcHBlbmQoaXNPbmdvaW5nKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNSZXBlYXRhYmxlOiAiKTsKLQkJaWYgKGlzUmVwZWF0YWJsZUVTZXQpIHJlc3VsdC5hcHBlbmQoaXNSZXBlYXRhYmxlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dvcmtCcmVha2Rvd25FbGVtZW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya0RlZmluaXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtEZWZpbml0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NzRjMDYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya0RlZmluaXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrRGVmaW5pdGlvbkltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA1OjU5IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgRGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrRGVmaW5pdGlvbkltcGwjZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrRGVmaW5pdGlvbkltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFdvcmtEZWZpbml0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVDT05ESVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWNvbmRpdGlvbiA9IFBSRUNPTkRJVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Y29uZGl0aW9uKCkgPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU1RDT05ESVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBvc3Rjb25kaXRpb24gPSBQT1NUQ09ORElUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtEZWZpbml0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlY29uZGl0aW9uKCkgewotCQlyZXR1cm4gcHJlY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWNvbmRpdGlvbihTdHJpbmcgbmV3UHJlY29uZGl0aW9uKSB7Ci0JCVN0cmluZyBvbGRQcmVjb25kaXRpb24gPSBwcmVjb25kaXRpb247Ci0JCXByZWNvbmRpdGlvbiA9IG5ld1ByZWNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiwgb2xkUHJlY29uZGl0aW9uLCBwcmVjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvc3Rjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3Rjb25kaXRpb24oU3RyaW5nIG5ld1Bvc3Rjb25kaXRpb24pIHsKLQkJU3RyaW5nIG9sZFBvc3Rjb25kaXRpb24gPSBwb3N0Y29uZGl0aW9uOwotCQlwb3N0Y29uZGl0aW9uID0gbmV3UG9zdGNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04sIG9sZFBvc3Rjb25kaXRpb24sIHBvc3Rjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIGdldFByZWNvbmRpdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCQlyZXR1cm4gZ2V0UG9zdGNvbmRpdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT046Ci0JCQkJc2V0UHJlY29uZGl0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQkJc2V0UG9zdGNvbmRpdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJCXNldFByZWNvbmRpdGlvbihQUkVDT05ESVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQkJc2V0UG9zdGNvbmRpdGlvbihQT1NUQ09ORElUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJCQlyZXR1cm4gUFJFQ09ORElUSU9OX0VERUZBVUxUID09IG51bGwgPyBwcmVjb25kaXRpb24gIT0gbnVsbCA6ICFQUkVDT05ESVRJT05fRURFRkFVTFQuZXF1YWxzKHByZWNvbmRpdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBQT1NUQ09ORElUSU9OX0VERUZBVUxUID09IG51bGwgPyBwb3N0Y29uZGl0aW9uICE9IG51bGwgOiAhUE9TVENPTkRJVElPTl9FREVGQVVMVC5lcXVhbHMocG9zdGNvbmRpdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwcmVjb25kaXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZWNvbmRpdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcG9zdGNvbmRpdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocG9zdGNvbmRpdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dvcmtEZWZpbml0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya09yZGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrT3JkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2YTU0NjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrT3JkZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrT3JkZXJJbXBsLmphdmEsdiAxLjQgMjAwNi8wOS8wNyAwMDowNTo1OSBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uaW1wbC5FRGF0YU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgT3JkZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya09yZGVySW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya09yZGVySW1wbCNnZXRMaW5rVHlwZSA8ZW0+TGluayBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtPcmRlckltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya09yZGVySW1wbCBleHRlbmRzIEVEYXRhT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdvcmtPcmRlciB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGlua1R5cGUoKSA8ZW0+TGluayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaW5rVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBXb3JrT3JkZXJUeXBlIExJTktfVFlQRV9FREVGQVVMVCA9IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX1NUQVJUX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5rVHlwZSgpIDxlbT5MaW5rIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmtUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya09yZGVyVHlwZSBsaW5rVHlwZSA9IExJTktfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTGluayBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsaW5rVHlwZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtPcmRlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfT1JERVI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX09SREVSX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtPcmRlclR5cGUgZ2V0TGlua1R5cGUoKSB7Ci0JCXJldHVybiBsaW5rVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaW5rVHlwZShXb3JrT3JkZXJUeXBlIG5ld0xpbmtUeXBlKSB7Ci0JCVdvcmtPcmRlclR5cGUgb2xkTGlua1R5cGUgPSBsaW5rVHlwZTsKLQkJbGlua1R5cGUgPSBuZXdMaW5rVHlwZSA9PSBudWxsID8gTElOS19UWVBFX0VERUZBVUxUIDogbmV3TGlua1R5cGU7Ci0JCWJvb2xlYW4gb2xkTGlua1R5cGVFU2V0ID0gbGlua1R5cGVFU2V0OwotCQlsaW5rVHlwZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRSwgb2xkTGlua1R5cGUsIGxpbmtUeXBlLCAhb2xkTGlua1R5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRMaW5rVHlwZSgpIHsKLQkJV29ya09yZGVyVHlwZSBvbGRMaW5rVHlwZSA9IGxpbmtUeXBlOwotCQlib29sZWFuIG9sZExpbmtUeXBlRVNldCA9IGxpbmtUeXBlRVNldDsKLQkJbGlua1R5cGUgPSBMSU5LX1RZUEVfRURFRkFVTFQ7Ci0JCWxpbmtUeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFLCBvbGRMaW5rVHlwZSwgTElOS19UWVBFX0VERUZBVUxULCBvbGRMaW5rVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldExpbmtUeXBlKCkgewotCQlyZXR1cm4gbGlua1R5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19MSU5LX1RZUEU6Ci0JCQkJcmV0dXJuIGdldExpbmtUeXBlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFOgotCQkJCXNldExpbmtUeXBlKChXb3JrT3JkZXJUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRToKLQkJCQl1bnNldExpbmtUeXBlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19MSU5LX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0TGlua1R5cGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGlua1R5cGU6ICIpOwotCQlpZiAobGlua1R5cGVFU2V0KSByZXN1bHQuYXBwZW5kKGxpbmtUeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV29ya09yZGVySW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDY3NTBmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcgPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcgPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsI2dldEV4dGVybmFsSWQgPGVtPkV4dGVybmFsIElkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltcGFjdE9mTm90SGF2aW5nKCkgPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbXBhY3RPZk5vdEhhdmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QQUNUX09GX05PVF9IQVZJTkdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKSA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEltcGFjdE9mTm90SGF2aW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGltcGFjdE9mTm90SGF2aW5nID0gSU1QQUNUX09GX05PVF9IQVZJTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQVVJQT1NFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwdXJwb3NlID0gUFVSUE9TRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWFzb25zRm9yTm90TmVlZGluZygpIDxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkgPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWFzb25zRm9yTm90TmVlZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZWFzb25zRm9yTm90TmVlZGluZyA9IFJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsSWQoKSA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsSWQoKSA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXh0ZXJuYWxJZCA9IEVYVEVSTkFMX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbXBhY3RPZk5vdEhhdmluZygpIHsKLQkJcmV0dXJuIGltcGFjdE9mTm90SGF2aW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltcGFjdE9mTm90SGF2aW5nKFN0cmluZyBuZXdJbXBhY3RPZk5vdEhhdmluZykgewotCQlTdHJpbmcgb2xkSW1wYWN0T2ZOb3RIYXZpbmcgPSBpbXBhY3RPZk5vdEhhdmluZzsKLQkJaW1wYWN0T2ZOb3RIYXZpbmcgPSBuZXdJbXBhY3RPZk5vdEhhdmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HLCBvbGRJbXBhY3RPZk5vdEhhdmluZywgaW1wYWN0T2ZOb3RIYXZpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1cnBvc2UoKSB7Ci0JCXJldHVybiBwdXJwb3NlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1cnBvc2UoU3RyaW5nIG5ld1B1cnBvc2UpIHsKLQkJU3RyaW5nIG9sZFB1cnBvc2UgPSBwdXJwb3NlOwotCQlwdXJwb3NlID0gbmV3UHVycG9zZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0UsIG9sZFB1cnBvc2UsIHB1cnBvc2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkgewotCQlyZXR1cm4gcmVhc29uc0Zvck5vdE5lZWRpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoU3RyaW5nIG5ld1JlYXNvbnNGb3JOb3ROZWVkaW5nKSB7Ci0JCVN0cmluZyBvbGRSZWFzb25zRm9yTm90TmVlZGluZyA9IHJlYXNvbnNGb3JOb3ROZWVkaW5nOwotCQlyZWFzb25zRm9yTm90TmVlZGluZyA9IG5ld1JlYXNvbnNGb3JOb3ROZWVkaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcsIG9sZFJlYXNvbnNGb3JOb3ROZWVkaW5nLCByZWFzb25zRm9yTm90TmVlZGluZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxJZCgpIHsKLQkJcmV0dXJuIGV4dGVybmFsSWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0ZXJuYWxJZChTdHJpbmcgbmV3RXh0ZXJuYWxJZCkgewotCQlTdHJpbmcgb2xkRXh0ZXJuYWxJZCA9IGV4dGVybmFsSWQ7Ci0JCWV4dGVybmFsSWQgPSBuZXdFeHRlcm5hbElkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQsIG9sZEV4dGVybmFsSWQsIGV4dGVybmFsSWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzoKLQkJCQlyZXR1cm4gZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQkJcmV0dXJuIGdldFB1cnBvc2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOgotCQkJCXJldHVybiBnZXRSZWFzb25zRm9yTm90TmVlZGluZygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ6Ci0JCQkJcmV0dXJuIGdldEV4dGVybmFsSWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkc6Ci0JCQkJc2V0SW1wYWN0T2ZOb3RIYXZpbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlzZXRQdXJwb3NlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOgotCQkJCXNldFJlYXNvbnNGb3JOb3ROZWVkaW5nKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJCXNldEV4dGVybmFsSWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOgotCQkJCXNldEltcGFjdE9mTm90SGF2aW5nKElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXNldFB1cnBvc2UoUFVSUE9TRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc6Ci0JCQkJc2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoUkVBU09OU19GT1JfTk9UX05FRURJTkdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJCXNldEV4dGVybmFsSWQoRVhURVJOQUxfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkc6Ci0JCQkJcmV0dXJuIElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUID09IG51bGwgPyBpbXBhY3RPZk5vdEhhdmluZyAhPSBudWxsIDogIUlNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxULmVxdWFscyhpbXBhY3RPZk5vdEhhdmluZyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXJldHVybiBQVVJQT1NFX0VERUZBVUxUID09IG51bGwgPyBwdXJwb3NlICE9IG51bGwgOiAhUFVSUE9TRV9FREVGQVVMVC5lcXVhbHMocHVycG9zZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORzoKLQkJCQlyZXR1cm4gUkVBU09OU19GT1JfTk9UX05FRURJTkdfRURFRkFVTFQgPT0gbnVsbCA/IHJlYXNvbnNGb3JOb3ROZWVkaW5nICE9IG51bGwgOiAhUkVBU09OU19GT1JfTk9UX05FRURJTkdfRURFRkFVTFQuZXF1YWxzKHJlYXNvbnNGb3JOb3ROZWVkaW5nKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJCXJldHVybiBFWFRFUk5BTF9JRF9FREVGQVVMVCA9PSBudWxsID8gZXh0ZXJuYWxJZCAhPSBudWxsIDogIUVYVEVSTkFMX0lEX0VERUZBVUxULmVxdWFscyhleHRlcm5hbElkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGltcGFjdE9mTm90SGF2aW5nOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbXBhY3RPZk5vdEhhdmluZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHVycG9zZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHVycG9zZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVhc29uc0Zvck5vdE5lZWRpbmc6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlYXNvbnNGb3JOb3ROZWVkaW5nKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleHRlcm5hbElkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleHRlcm5hbElkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNGVlZjg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldEltcGFjdGVkQnkgPGVtPkltcGFjdGVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0SW1wYWN0cyA8ZW0+SW1wYWN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldERlbGl2ZXJhYmxlUGFydHMgPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldEFjdGl2aXR5RXhpdFN0YXRlIDxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCBleHRlbmRzIERlc2NyaXB0b3JJbXBsIGltcGxlbWVudHMgV29ya1Byb2R1Y3REZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1Byb2R1Y3QoKSA8ZW0+V29yayBQcm9kdWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19QUk9EVUNUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtQcm9kdWN0KCkgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgd29ya1Byb2R1Y3QgPSBXT1JLX1BST0RVQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDEoKSA8ZW0+R3JvdXAxPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAxID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKSA8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZJVFlfRU5UUllfU1RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkgPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWN0aXZpdHlFbnRyeVN0YXRlID0gQUNUSVZJVFlfRU5UUllfU1RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKSA8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZX0VYSVRfU1RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKSA8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWN0aXZpdHlFeGl0U3RhdGUgPSBBQ1RJVklUWV9FWElUX1NUQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrUHJvZHVjdChTdHJpbmcgbmV3V29ya1Byb2R1Y3QpIHsKLQkJU3RyaW5nIG9sZFdvcmtQcm9kdWN0ID0gd29ya1Byb2R1Y3Q7Ci0JCXdvcmtQcm9kdWN0ID0gbmV3V29ya1Byb2R1Y3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVCwgb2xkV29ya1Byb2R1Y3QsIHdvcmtQcm9kdWN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAxKCkgewotCQlpZiAoZ3JvdXAxID09IG51bGwpIHsKLQkJCWdyb3VwMSA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAxKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAxOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRJbXBhY3RlZEJ5KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMSgpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SW1wYWN0cygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDEoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVsaXZlcmFibGVQYXJ0cygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDEoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKSB7Ci0JCXJldHVybiBhY3Rpdml0eUVudHJ5U3RhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZpdHlFbnRyeVN0YXRlKFN0cmluZyBuZXdBY3Rpdml0eUVudHJ5U3RhdGUpIHsKLQkJU3RyaW5nIG9sZEFjdGl2aXR5RW50cnlTdGF0ZSA9IGFjdGl2aXR5RW50cnlTdGF0ZTsKLQkJYWN0aXZpdHlFbnRyeVN0YXRlID0gbmV3QWN0aXZpdHlFbnRyeVN0YXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURSwgb2xkQWN0aXZpdHlFbnRyeVN0YXRlLCBhY3Rpdml0eUVudHJ5U3RhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFjdGl2aXR5RXhpdFN0YXRlKCkgewotCQlyZXR1cm4gYWN0aXZpdHlFeGl0U3RhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZpdHlFeGl0U3RhdGUoU3RyaW5nIG5ld0FjdGl2aXR5RXhpdFN0YXRlKSB7Ci0JCVN0cmluZyBvbGRBY3Rpdml0eUV4aXRTdGF0ZSA9IGFjdGl2aXR5RXhpdFN0YXRlOwotCQlhY3Rpdml0eUV4aXRTdGF0ZSA9IG5ld0FjdGl2aXR5RXhpdFN0YXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFLCBvbGRBY3Rpdml0eUV4aXRTdGF0ZSwgYWN0aXZpdHlFeGl0U3RhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dST1VQMToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUOgotCQkJCXJldHVybiBnZXRXb3JrUHJvZHVjdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HUk9VUDE6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAxKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDEoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWToKLQkJCQlyZXR1cm4gZ2V0SW1wYWN0ZWRCeSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJCXJldHVybiBnZXRJbXBhY3RzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJCXJldHVybiBnZXREZWxpdmVyYWJsZVBhcnRzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQkJCXJldHVybiBnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURToKLQkJCQlyZXR1cm4gZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1Q6Ci0JCQkJc2V0V29ya1Byb2R1Y3QoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HUk9VUDE6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMSgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQkJZ2V0SW1wYWN0ZWRCeSgpLmNsZWFyKCk7Ci0JCQkJZ2V0SW1wYWN0ZWRCeSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJCWdldEltcGFjdHMoKS5jbGVhcigpOwotCQkJCWdldEltcGFjdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFM6Ci0JCQkJZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJCQlzZXRBY3Rpdml0eUVudHJ5U3RhdGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJCXNldEFjdGl2aXR5RXhpdFN0YXRlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVDoKLQkJCQlzZXRXb3JrUHJvZHVjdChXT1JLX1BST0RVQ1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAxOgotCQkJCWdldEdyb3VwMSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWToKLQkJCQlnZXRJbXBhY3RlZEJ5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFM6Ci0JCQkJZ2V0SW1wYWN0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUzoKLQkJCQlnZXREZWxpdmVyYWJsZVBhcnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQkJCXNldEFjdGl2aXR5RW50cnlTdGF0ZShBQ1RJVklUWV9FTlRSWV9TVEFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJCXNldEFjdGl2aXR5RXhpdFN0YXRlKEFDVElWSVRZX0VYSVRfU1RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1Q6Ci0JCQkJcmV0dXJuIFdPUktfUFJPRFVDVF9FREVGQVVMVCA9PSBudWxsID8gd29ya1Byb2R1Y3QgIT0gbnVsbCA6ICFXT1JLX1BST0RVQ1RfRURFRkFVTFQuZXF1YWxzKHdvcmtQcm9kdWN0KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAxOgotCQkJCXJldHVybiBncm91cDEgIT0gbnVsbCAmJiAhZ3JvdXAxLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQkJcmV0dXJuICFnZXRJbXBhY3RlZEJ5KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJCXJldHVybiAhZ2V0SW1wYWN0cygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFM6Ci0JCQkJcmV0dXJuICFnZXREZWxpdmVyYWJsZVBhcnRzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJCQlyZXR1cm4gQUNUSVZJVFlfRU5UUllfU1RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGFjdGl2aXR5RW50cnlTdGF0ZSAhPSBudWxsIDogIUFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxULmVxdWFscyhhY3Rpdml0eUVudHJ5U3RhdGUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJCXJldHVybiBBQ1RJVklUWV9FWElUX1NUQVRFX0VERUZBVUxUID09IG51bGwgPyBhY3Rpdml0eUV4aXRTdGF0ZSAhPSBudWxsIDogIUFDVElWSVRZX0VYSVRfU1RBVEVfRURFRkFVTFQuZXF1YWxzKGFjdGl2aXR5RXhpdFN0YXRlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHdvcmtQcm9kdWN0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrUHJvZHVjdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ3JvdXAxOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDEpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdGl2aXR5RW50cnlTdGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0aXZpdHlFbnRyeVN0YXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3Rpdml0eUV4aXRTdGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0aXZpdHlFeGl0U3RhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrUHJvZHVjdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFhNGY4MDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrUHJvZHVjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtQcm9kdWN0SW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0RXN0aW1hdGUgPGVtPkVzdGltYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsI2dldFJlcG9ydCA8ZW0+UmVwb3J0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRUZW1wbGF0ZSA8ZW0+VGVtcGxhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsI2dldFRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RJbXBsIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJbXBsIGltcGxlbWVudHMgV29ya1Byb2R1Y3QgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDIgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVzdGltYXRlKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX19FU1RJTUFURSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJlcG9ydCgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9fUkVQT1JUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VGVtcGxhdGUoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfX1RFTVBMQVRFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VG9vbE1lbnRvcigpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDIoKSkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1IpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFURToKLQkJCQlyZXR1cm4gZ2V0RXN0aW1hdGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fUkVQT1JUOgotCQkJCXJldHVybiBnZXRSZXBvcnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RFTVBMQVRFOgotCQkJCXJldHVybiBnZXRUZW1wbGF0ZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1I6Ci0JCQkJcmV0dXJuIGdldFRvb2xNZW50b3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFURToKLQkJCQlnZXRFc3RpbWF0ZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RXN0aW1hdGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1JFUE9SVDoKLQkJCQlnZXRSZXBvcnQoKS5jbGVhcigpOwotCQkJCWdldFJlcG9ydCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVEVNUExBVEU6Ci0JCQkJZ2V0VGVtcGxhdGUoKS5jbGVhcigpOwotCQkJCWdldFRlbXBsYXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19UT09MX01FTlRPUjoKLQkJCQlnZXRUb29sTWVudG9yKCkuY2xlYXIoKTsKLQkJCQlnZXRUb29sTWVudG9yKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVEU6Ci0JCQkJZ2V0RXN0aW1hdGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlQ6Ci0JCQkJZ2V0UmVwb3J0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19URU1QTEFURToKLQkJCQlnZXRUZW1wbGF0ZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1I6Ci0JCQkJZ2V0VG9vbE1lbnRvcigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVEU6Ci0JCQkJcmV0dXJuICFnZXRFc3RpbWF0ZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJcmV0dXJuICFnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlQ6Ci0JCQkJcmV0dXJuICFnZXRSZXBvcnQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19URU1QTEFURToKLQkJCQlyZXR1cm4gIWdldFRlbXBsYXRlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1I6Ci0JCQkJcmV0dXJuICFnZXRUb29sTWVudG9yKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrUHJvZHVjdEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtQcm9kdWN0VHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3RUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOWQxNjVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3RUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3RUeXBlSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDkvMDcgMDA6MDU6NTkga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RUeXBlSW1wbCNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RUeXBlSW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cyBXb3JrUHJvZHVjdFR5cGUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDIgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0VHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9UWVBFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0V29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUOgotCQkJCXJldHVybiBnZXRXb3JrUHJvZHVjdCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1Q6Ci0JCQkJZ2V0V29ya1Byb2R1Y3QoKS5jbGVhcigpOwotCQkJCWdldFdvcmtQcm9kdWN0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVDoKLQkJCQlnZXRXb3JrUHJvZHVjdCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVDoKLQkJCQlyZXR1cm4gIWdldFdvcmtQcm9kdWN0KCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrUHJvZHVjdFR5cGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGVlMjhkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgWE1MIFVNQSBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzQ2YTE5Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgdGhlIFVNQSBYTUwgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3NWYyNWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVtYUFkYXB0ZXJGYWN0b3J5LmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBVbWFQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVW1hU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IFVtYVN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFjdGl2aXR5KEFjdGl2aXR5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24oQWN0aXZpdHlEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFydGlmYWN0KEFydGlmYWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBcnRpZmFjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFydGlmYWN0RGVzY3JpcHRpb24oQXJ0aWZhY3REZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUJyZWFrZG93bkVsZW1lbnQoQnJlYWtkb3duRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQnJlYWtkb3duRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbihCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNhcGFiaWxpdHlQYXR0ZXJuKENhcGFiaWxpdHlQYXR0ZXJuIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNoZWNrbGlzdChDaGVja2xpc3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNoZWNrbGlzdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBvc2l0ZVJvbGUoQ29tcG9zaXRlUm9sZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29tcG9zaXRlUm9sZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbmNlcHQoQ29uY2VwdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29uY2VwdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbnN0cmFpbnQoQ29uc3RyYWludCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29uc3RyYWludEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRlbnRDYXRlZ29yeShDb250ZW50Q2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnRDYXRlZ29yeUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRlbnRDYXRlZ29yeVBhY2thZ2UoQ29udGVudENhdGVnb3J5UGFja2FnZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29udGVudENhdGVnb3J5UGFja2FnZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRlbnREZXNjcmlwdGlvbihDb250ZW50RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRlbnRFbGVtZW50KENvbnRlbnRFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb250ZW50RWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRlbnRQYWNrYWdlKENvbnRlbnRQYWNrYWdlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb250ZW50UGFja2FnZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDdXN0b21DYXRlZ29yeUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURlbGl2ZXJhYmxlKERlbGl2ZXJhYmxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZWxpdmVyYWJsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURlbGl2ZXJ5UHJvY2VzcyhEZWxpdmVyeVByb2Nlc3Mgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaWJhYmxlRWxlbWVudChEZXNjcmliYWJsZUVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaWJhYmxlRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0b3IoRGVzY3JpcHRvciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0b3JEZXNjcmlwdGlvbihEZXNjcmlwdG9yRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURpc2NpcGxpbmUoRGlzY2lwbGluZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURpc2NpcGxpbmVHcm91cGluZyhEaXNjaXBsaW5lR3JvdXBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURvY3VtZW50Um9vdChEb2N1bWVudFJvb3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURvY3VtZW50Um9vdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURvbWFpbihEb21haW4gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURvbWFpbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVsZW1lbnQoRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVzdGltYXRlKEVzdGltYXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFc3RpbWF0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVzdGltYXRpbmdNZXRyaWMoRXN0aW1hdGluZ01ldHJpYyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXN0aW1hdGluZ01ldHJpY0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucyhFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9uc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUV4YW1wbGUoRXhhbXBsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXhhbXBsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUd1aWRhbmNlKEd1aWRhbmNlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUd1aWRhbmNlRGVzY3JpcHRpb24oR3VpZGFuY2VEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUd1aWRlbGluZShHdWlkZWxpbmUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUd1aWRlbGluZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUl0ZXJhdGlvbihJdGVyYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kTGlicmFyeUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFBhY2thZ2UoTWV0aG9kUGFja2FnZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kUGFja2FnZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFBsdWdpbihNZXRob2RQbHVnaW4gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFBsdWdpbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFVuaXQoTWV0aG9kVW5pdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kVW5pdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1pbGVzdG9uZShNaWxlc3RvbmUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU5hbWVkRWxlbWVudChOYW1lZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU5hbWVkRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU91dGNvbWUoT3V0Y29tZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlT3V0Y29tZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVBhY2thZ2VhYmxlRWxlbWVudChQYWNrYWdlYWJsZUVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVBhY2thZ2VhYmxlRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVBoYXNlKFBoYXNlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQaGFzZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVBsYW5uaW5nRGF0YShQbGFubmluZ0RhdGEgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVBsYW5uaW5nRGF0YUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVByYWN0aWNlKFByYWN0aWNlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcmFjdGljZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVByYWN0aWNlRGVzY3JpcHRpb24oUHJhY3RpY2VEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NDb21wb25lbnQoUHJvY2Vzc0NvbXBvbmVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NEZXNjcmlwdGlvbihQcm9jZXNzRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NFbGVtZW50KFByb2Nlc3NFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcm9jZXNzRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NQYWNrYWdlKFByb2Nlc3NQYWNrYWdlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJlcG9ydChSZXBvcnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlcG9ydEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJldXNhYmxlQXNzZXQoUmV1c2FibGVBc3NldCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmV1c2FibGVBc3NldEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJvYWRtYXAoUm9hZG1hcCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUm9hZG1hcEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJvbGUoUm9sZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUm9sZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJvbGVEZXNjcmlwdGlvbihSb2xlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJvbGVEZXNjcmlwdG9yKFJvbGVEZXNjcmlwdG9yIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJvbGVTZXQoUm9sZVNldCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUm9sZVNldEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJvbGVTZXRHcm91cGluZyhSb2xlU2V0R3JvdXBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGVTZXRHcm91cGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlY3Rpb24oU2VjdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VjdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVN1cHBvcnRpbmdNYXRlcmlhbChTdXBwb3J0aW5nTWF0ZXJpYWwgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRhc2soVGFzayBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGFza0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRhc2tEZXNjcmlwdGlvbihUYXNrRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRhc2tEZXNjcmlwdG9yKFRhc2tEZXNjcmlwdG9yIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRlYW1Qcm9maWxlKFRlYW1Qcm9maWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRlbXBsYXRlKFRlbXBsYXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUZW1wbGF0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRlcm1EZWZpbml0aW9uKFRlcm1EZWZpbml0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUZXJtRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRvb2woVG9vbCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVG9vbEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRvb2xNZW50b3IoVG9vbE1lbnRvciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVG9vbE1lbnRvckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdoaXRlcGFwZXIoV2hpdGVwYXBlciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2hpdGVwYXBlckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KFdvcmtCcmVha2Rvd25FbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtEZWZpbml0aW9uKFdvcmtEZWZpbml0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtPcmRlcihXb3JrT3JkZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtPcmRlckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtQcm9kdWN0KFdvcmtQcm9kdWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvcihXb3JrUHJvZHVjdERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtQcm9kdWN0VHlwZShXb3JrUHJvZHVjdFR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSA8ZW0+QWN0aXZpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24gPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QgPGVtPkFydGlmYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFydGlmYWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uIDxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQnJlYWtkb3duRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIDxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybiA8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNhcGFiaWxpdHlQYXR0ZXJuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3QgPGVtPkNoZWNrbGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2hlY2tsaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlIDxlbT5Db21wb3NpdGUgUm9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBvc2l0ZVJvbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbmNlcHQgPGVtPkNvbmNlcHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uY2VwdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25jZXB0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50IDxlbT5Db25zdHJhaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29uc3RyYWludEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5IDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50Q2F0ZWdvcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UgPGVtPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRDYXRlZ29yeVBhY2thZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiA8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCA8ZW0+Q29udGVudCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSA8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRQYWNrYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSA8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUN1c3RvbUNhdGVnb3J5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZSA8ZW0+RGVsaXZlcmFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcmFibGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24gPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzIDxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIDxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQgPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaWJhYmxlRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvciA8ZW0+RGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lIDxlbT5EaXNjaXBsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nIDxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCA8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRG9jdW1lbnRSb290QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4gPGVtPkRvbWFpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRG9tYWluQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGUgPGVtPkVzdGltYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVzdGltYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljIDxlbT5Fc3RpbWF0aW5nIE1ldHJpYzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVzdGltYXRpbmdNZXRyaWNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkV4YW1wbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXhhbXBsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2UgPGVtPkd1aWRhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uIDxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZSA8ZW0+R3VpZGVsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHdWlkZWxpbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkl0ZXJhdGlvbiA8ZW0+SXRlcmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkl0ZXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCA8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5IDxlbT5NZXRob2QgTGlicmFyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZExpYnJhcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RQbHVnaW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQgPGVtPk1ldGhvZCBVbml0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kVW5pdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50IDxlbT5OYW1lZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk5hbWVkRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVOYW1lZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk91dGNvbWUgPGVtPk91dGNvbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuT3V0Y29tZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRjb21lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQgPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGFja2FnZWFibGVFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhY2thZ2VhYmxlRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGhhc2UgPGVtPlBoYXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBoYXNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBoYXNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBsYW5uaW5nRGF0YUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UgPGVtPlByYWN0aWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByYWN0aWNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uIDxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgPGVtPlByb2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50IDxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiA8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudCA8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSA8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NQYWNrYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSA8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmVwb3J0IDxlbT5SZXBvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmVwb3J0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlcG9ydEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmV1c2FibGVBc3NldCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmV1c2FibGVBc3NldAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXVzYWJsZUFzc2V0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2FkbWFwIDxlbT5Sb2FkbWFwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvYWRtYXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9hZG1hcEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZSA8ZW0+Um9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiA8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvciA8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0IDxlbT5Sb2xlIFNldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTZXRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZyA8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTZXRHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiA8ZW0+U2VjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlY3Rpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlN1cHBvcnRpbmdNYXRlcmlhbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yIDxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlIDxlbT5UZWFtIFByb2ZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlbXBsYXRlIDxlbT5UZW1wbGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZW1wbGF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVybURlZmluaXRpb24gPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZXJtRGVmaW5pdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZXJtRGVmaW5pdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbCA8ZW0+VG9vbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRvb2xBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2xNZW50b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVG9vbE1lbnRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdoaXRlcGFwZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50IDxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbiA8ZW0+V29yayBEZWZpbml0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtEZWZpbml0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIgPGVtPldvcmsgT3JkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtPcmRlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUgPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdFR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vVW1hQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM0MTdiZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVtYVJlc291cmNlRmFjdG9yeUltcGwuamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgRmFjdG9yeTwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWwuVW1hUmVzb3VyY2VJbXBsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFSZXNvdXJjZUZhY3RvcnlJbXBsIGV4dGVuZHMgUmVzb3VyY2VGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hUmVzb3VyY2VGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlYTUxSZXNvdXJjZSByZXN1bHQgPSBuZXcgVW1hUmVzb3VyY2VJbXBsKHVyaSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOwotCi0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1NDSEVNQV9MT0NBVElPTiwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfTEVYSUNBTF9IQU5ETEVSLCBCb29sZWFuLlRSVUUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfSAvL1VtYVJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hUmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MmZjOGQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVtYVJlc291cmNlSW1wbC5qYXZhLHYgMS4xIDIwMDYvMDUvMDEgMTk6NTA6MDAganRoYXJpbyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MU2F2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgPC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEudXRpbC5VbWFSZXNvdXJjZUZhY3RvcnlJbXBsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUxSZXNvdXJjZUltcGwgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHVyaSB0aGUgVVJJIG9mIHRoZSBuZXcgcmVzb3VyY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCX0KLQotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vIGN1c3RvbWl6YXRpb24gaGVyZSwgSmluaHVhIFhpIDA0LzI4LzIwMDYKLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkKLQkvKgotCSAqIEphdmFkb2MgY29waWVkIGZyb20gaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNhdmUob3B0aW9ucyk7Ci0JfQotCi0JcHJvdGVjdGVkIFhNTFNhdmUgY3JlYXRlWE1MU2F2ZSgpIHsKLQkJLy8gcmV0dXJuIHN1cGVyLmNyZWF0ZVhNTFNhdmUoKTsKLQkJcmV0dXJuIG5ldyBVbWFYTUxTYXZlSW1wbChjcmVhdGVYTUxIZWxwZXIoKSk7Ci0JfQotCQotfSAvL1VtYVJlc291cmNlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk1NzBmM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ODMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBVbWFTd2l0Y2guamF2YSx2IDEuMyAyMDA2LzA5LzA3IDAwOjA2OjAwIGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGluZ01ldHJpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGFja2FnZWFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW1hU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFVtYVBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWTogewotCQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBY3Rpdml0eShhY3Rpdml0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoYWN0aXZpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoYWN0aXZpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGFjdGl2aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoYWN0aXZpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYWN0aXZpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhY3Rpdml0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGFjdGl2aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGFjdGl2aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT046IHsKLQkJCQlBY3Rpdml0eURlc2NyaXB0aW9uIGFjdGl2aXR5RGVzY3JpcHRpb24gPSAoQWN0aXZpdHlEZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQWN0aXZpdHlEZXNjcmlwdGlvbihhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUOiB7Ci0JCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFydGlmYWN0KGFydGlmYWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdChhcnRpZmFjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChhcnRpZmFjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChhcnRpZmFjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGFydGlmYWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTjogewotCQkJCUFydGlmYWN0RGVzY3JpcHRpb24gYXJ0aWZhY3REZXNjcmlwdGlvbiA9IChBcnRpZmFjdERlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBcnRpZmFjdERlc2NyaXB0aW9uKGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UOiB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBicmVha2Rvd25FbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTjogewotCQkJCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gPSAoQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ0FQQUJJTElUWV9QQVRURVJOOiB7Ci0JCQkJQ2FwYWJpbGl0eVBhdHRlcm4gY2FwYWJpbGl0eVBhdHRlcm4gPSAoQ2FwYWJpbGl0eVBhdHRlcm4pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNhcGFiaWxpdHlQYXR0ZXJuKGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzKGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBY3Rpdml0eShjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ0hFQ0tMSVNUOiB7Ci0JCQkJQ2hlY2tsaXN0IGNoZWNrbGlzdCA9IChDaGVja2xpc3QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNoZWNrbGlzdChjaGVja2xpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGNoZWNrbGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNoZWNrbGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNoZWNrbGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNoZWNrbGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjaGVja2xpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRTogewotCQkJCUNvbXBvc2l0ZVJvbGUgY29tcG9zaXRlUm9sZSA9IChDb21wb3NpdGVSb2xlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb21wb3NpdGVSb2xlKGNvbXBvc2l0ZVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJvbGVEZXNjcmlwdG9yKGNvbXBvc2l0ZVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0b3IoY29tcG9zaXRlUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTkNFUFQ6IHsKLQkJCQlDb25jZXB0IGNvbmNlcHQgPSAoQ29uY2VwdCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29uY2VwdChjb25jZXB0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShjb25jZXB0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjb25jZXB0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY29uY2VwdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb25jZXB0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29uY2VwdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbmNlcHQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29uY2VwdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlQ6IHsKLQkJCQlDb25zdHJhaW50IGNvbnN0cmFpbnQgPSAoQ29uc3RyYWludCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29uc3RyYWludChjb25zdHJhaW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnN0cmFpbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb25zdHJhaW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29uc3RyYWludCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjb25zdHJhaW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWTogewotCQkJCUNvbnRlbnRDYXRlZ29yeSBjb250ZW50Q2F0ZWdvcnkgPSAoQ29udGVudENhdGVnb3J5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkoY29udGVudENhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRTogewotCQkJCUNvbnRlbnRDYXRlZ29yeVBhY2thZ2UgY29udGVudENhdGVnb3J5UGFja2FnZSA9IChDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKGNvbnRlbnRDYXRlZ29yeVBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFBhY2thZ2UoY29udGVudENhdGVnb3J5UGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb250ZW50Q2F0ZWdvcnlQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29udGVudENhdGVnb3J5UGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbnRlbnRDYXRlZ29yeVBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29udGVudENhdGVnb3J5UGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT046IHsKLQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gKENvbnRlbnREZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChjb250ZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVDogewotCQkJCUNvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRTogewotCQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQYWNrYWdlID0gKENvbnRlbnRQYWNrYWdlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb250ZW50UGFja2FnZShjb250ZW50UGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kUGFja2FnZShjb250ZW50UGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb250ZW50UGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbnRlbnRQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29udGVudFBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29udGVudFBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUlk6IHsKLQkJCQlDdXN0b21DYXRlZ29yeSBjdXN0b21DYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ3VzdG9tQ2F0ZWdvcnkoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShjdXN0b21DYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRTogewotCQkJCURlbGl2ZXJhYmxlIGRlbGl2ZXJhYmxlID0gKERlbGl2ZXJhYmxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEZWxpdmVyYWJsZShkZWxpdmVyYWJsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3QoZGVsaXZlcmFibGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT046IHsKLQkJCQlEZWxpdmVyYWJsZURlc2NyaXB0aW9uIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24gPSAoRGVsaXZlcmFibGVEZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGVsaXZlcmFibGVEZXNjcmlwdGlvbihkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTOiB7Ci0JCQkJRGVsaXZlcnlQcm9jZXNzIGRlbGl2ZXJ5UHJvY2VzcyA9IChEZWxpdmVyeVByb2Nlc3MpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURlbGl2ZXJ5UHJvY2VzcyhkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3MoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBY3Rpdml0eShkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTjogewotCQkJCURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uID0gKERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbihkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0Rlc2NyaXB0aW9uKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBY3Rpdml0eURlc2NyaXB0aW9uKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UOiB7Ci0JCQkJRGVzY3JpYmFibGVFbGVtZW50IGRlc2NyaWJhYmxlRWxlbWVudCA9IChEZXNjcmliYWJsZUVsZW1lbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkZXNjcmliYWJsZUVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1I6IHsKLQkJCQlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoRGVzY3JpcHRvcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTjogewotCQkJCURlc2NyaXB0b3JEZXNjcmlwdGlvbiBkZXNjcmlwdG9yRGVzY3JpcHRpb24gPSAoRGVzY3JpcHRvckRlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEZXNjcmlwdG9yRGVzY3JpcHRpb24oZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORTogewotCQkJCURpc2NpcGxpbmUgZGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEaXNjaXBsaW5lKGRpc2NpcGxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShkaXNjaXBsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkc6IHsKLQkJCQlEaXNjaXBsaW5lR3JvdXBpbmcgZGlzY2lwbGluZUdyb3VwaW5nID0gKERpc2NpcGxpbmVHcm91cGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGlzY2lwbGluZUdyb3VwaW5nKGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UOiB7Ci0JCQkJRG9jdW1lbnRSb290IGRvY3VtZW50Um9vdCA9IChEb2N1bWVudFJvb3QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURvY3VtZW50Um9vdChkb2N1bWVudFJvb3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU46IHsKLQkJCQlEb21haW4gZG9tYWluID0gKERvbWFpbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRG9tYWluKGRvbWFpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KGRvbWFpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZG9tYWluKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZG9tYWluKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRvbWFpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRvbWFpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRvbWFpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChkb21haW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5FTEVNRU5UOiB7Ci0JCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFOiB7Ci0JCQkJRXN0aW1hdGUgZXN0aW1hdGUgPSAoRXN0aW1hdGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVzdGltYXRlKGVzdGltYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShlc3RpbWF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZXN0aW1hdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChlc3RpbWF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChlc3RpbWF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGVzdGltYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZXN0aW1hdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZXN0aW1hdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFUSU5HX01FVFJJQzogewotCQkJCUVzdGltYXRpbmdNZXRyaWMgZXN0aW1hdGluZ01ldHJpYyA9IChFc3RpbWF0aW5nTWV0cmljKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFc3RpbWF0aW5nTWV0cmljKGVzdGltYXRpbmdNZXRyaWMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGVzdGltYXRpbmdNZXRyaWMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGVzdGltYXRpbmdNZXRyaWMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChlc3RpbWF0aW5nTWV0cmljKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGVzdGltYXRpbmdNZXRyaWMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChlc3RpbWF0aW5nTWV0cmljKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZXN0aW1hdGluZ01ldHJpYyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChlc3RpbWF0aW5nTWV0cmljKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzogewotCQkJCUVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPSAoRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVhBTVBMRTogewotCQkJCUV4YW1wbGUgZXhhbXBsZSA9IChFeGFtcGxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFeGFtcGxlKGV4YW1wbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGV4YW1wbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGV4YW1wbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChleGFtcGxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGV4YW1wbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChleGFtcGxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZXhhbXBsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChleGFtcGxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0U6IHsKLQkJCQlHdWlkYW5jZSBndWlkYW5jZSA9IChHdWlkYW5jZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlR3VpZGFuY2UoZ3VpZGFuY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGd1aWRhbmNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChndWlkYW5jZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGd1aWRhbmNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGd1aWRhbmNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT046IHsKLQkJCQlHdWlkYW5jZURlc2NyaXB0aW9uIGd1aWRhbmNlRGVzY3JpcHRpb24gPSAoR3VpZGFuY2VEZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlR3VpZGFuY2VEZXNjcmlwdGlvbihndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuR1VJREVMSU5FOiB7Ci0JCQkJR3VpZGVsaW5lIGd1aWRlbGluZSA9IChHdWlkZWxpbmUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUd1aWRlbGluZShndWlkZWxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGd1aWRlbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZ3VpZGVsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZ3VpZGVsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChndWlkZWxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5JVEVSQVRJT046IHsKLQkJCQlJdGVyYXRpb24gaXRlcmF0aW9uID0gKEl0ZXJhdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSXRlcmF0aW9uKGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWN0aXZpdHkoaXRlcmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChpdGVyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChpdGVyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChpdGVyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OOiB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWd1cmF0aW9uID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1ldGhvZENvbmZpZ3VyYXRpb24obWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlQ6IHsKLQkJCQlNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZOiB7Ci0JCQkJTWV0aG9kTGlicmFyeSBtZXRob2RMaWJyYXJ5ID0gKE1ldGhvZExpYnJhcnkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1ldGhvZExpYnJhcnkobWV0aG9kTGlicmFyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChtZXRob2RMaWJyYXJ5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZExpYnJhcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RMaWJyYXJ5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kTGlicmFyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RMaWJyYXJ5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0U6IHsKLQkJCQlNZXRob2RQYWNrYWdlIG1ldGhvZFBhY2thZ2UgPSAoTWV0aG9kUGFja2FnZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWV0aG9kUGFja2FnZShtZXRob2RQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZFBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTjogewotCQkJCU1ldGhvZFBsdWdpbiBtZXRob2RQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXRob2RQbHVnaW4obWV0aG9kUGx1Z2luKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KG1ldGhvZFBsdWdpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RQbHVnaW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RQbHVnaW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RQbHVnaW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kUGx1Z2luKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVQ6IHsKLQkJCQlNZXRob2RVbml0IG1ldGhvZFVuaXQgPSAoTWV0aG9kVW5pdCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChtZXRob2RVbml0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZFVuaXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RVbml0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kVW5pdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RVbml0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUlMRVNUT05FOiB7Ci0JCQkJTWlsZXN0b25lIG1pbGVzdG9uZSA9IChNaWxlc3RvbmUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1pbGVzdG9uZShtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQobWlsZXN0b25lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVDogewotCQkJCU5hbWVkRWxlbWVudCBuYW1lZEVsZW1lbnQgPSAoTmFtZWRFbGVtZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobmFtZWRFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KG5hbWVkRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLk9VVENPTUU6IHsKLQkJCQlPdXRjb21lIG91dGNvbWUgPSAoT3V0Y29tZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlT3V0Y29tZShvdXRjb21lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdChvdXRjb21lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChvdXRjb21lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQob3V0Y29tZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChvdXRjb21lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQob3V0Y29tZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG91dGNvbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQob3V0Y29tZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBBQ0tBR0VBQkxFX0VMRU1FTlQ6IHsKLQkJCQlQYWNrYWdlYWJsZUVsZW1lbnQgcGFja2FnZWFibGVFbGVtZW50ID0gKFBhY2thZ2VhYmxlRWxlbWVudCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHBhY2thZ2VhYmxlRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHBhY2thZ2VhYmxlRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwYWNrYWdlYWJsZUVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QSEFTRTogewotCQkJCVBoYXNlIHBoYXNlID0gKFBoYXNlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQaGFzZShwaGFzZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWN0aXZpdHkocGhhc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KHBoYXNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHBoYXNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwaGFzZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHBoYXNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHBoYXNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocGhhc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwaGFzZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwaGFzZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEE6IHsKLQkJCQlQbGFubmluZ0RhdGEgcGxhbm5pbmdEYXRhID0gKFBsYW5uaW5nRGF0YSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUGxhbm5pbmdEYXRhKHBsYW5uaW5nRGF0YSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocGxhbm5pbmdEYXRhKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocGxhbm5pbmdEYXRhKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRTogewotCQkJCVByYWN0aWNlIHByYWN0aWNlID0gKFByYWN0aWNlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQcmFjdGljZShwcmFjdGljZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UocHJhY3RpY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHByYWN0aWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJhY3RpY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJhY3RpY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcmFjdGljZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByYWN0aWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHByYWN0aWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT046IHsKLQkJCQlQcmFjdGljZURlc2NyaXB0aW9uIHByYWN0aWNlRGVzY3JpcHRpb24gPSAoUHJhY3RpY2VEZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJhY3RpY2VEZXNjcmlwdGlvbihwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24ocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTUzogewotCQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgcHJvY2VzcyA9IChvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQcm9jZXNzKHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFjdGl2aXR5KHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQocHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVDogewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQcm9jZXNzQ29tcG9uZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NQYWNrYWdlKHByb2Nlc3NDb21wb25lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFBhY2thZ2UocHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzQ29tcG9uZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRTogewotCQkJCVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSA9IChQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OOiB7Ci0JCQkJUHJvY2Vzc0Rlc2NyaXB0aW9uIHByb2Nlc3NEZXNjcmlwdGlvbiA9IChQcm9jZXNzRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByb2Nlc3NEZXNjcmlwdGlvbihwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24ocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24ocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24ocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19FTEVNRU5UOiB7Ci0JCQkJUHJvY2Vzc0VsZW1lbnQgcHJvY2Vzc0VsZW1lbnQgPSAoUHJvY2Vzc0VsZW1lbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJvY2Vzc0VsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc0VsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFOiB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2UgcHJvY2Vzc1BhY2thZ2UgPSAoUHJvY2Vzc1BhY2thZ2UpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByb2Nlc3NQYWNrYWdlKHByb2Nlc3NQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RQYWNrYWdlKHByb2Nlc3NQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc1BhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEU6IHsKLQkJCQlQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSA9IChQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3MocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFjdGl2aXR5KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5SRVBPUlQ6IHsKLQkJCQlSZXBvcnQgcmVwb3J0ID0gKFJlcG9ydCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmVwb3J0KHJlcG9ydCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UocmVwb3J0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChyZXBvcnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyZXBvcnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocmVwb3J0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocmVwb3J0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocmVwb3J0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHJlcG9ydCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlJFVVNBQkxFX0FTU0VUOiB7Ci0JCQkJUmV1c2FibGVBc3NldCByZXVzYWJsZUFzc2V0ID0gKFJldXNhYmxlQXNzZXQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJldXNhYmxlQXNzZXQocmV1c2FibGVBc3NldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UocmV1c2FibGVBc3NldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ST0FETUFQOiB7Ci0JCQkJUm9hZG1hcCByb2FkbWFwID0gKFJvYWRtYXApdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJvYWRtYXAocm9hZG1hcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2Uocm9hZG1hcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocm9hZG1hcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJvYWRtYXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9hZG1hcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvYWRtYXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2FkbWFwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHJvYWRtYXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFOiB7Ci0JCQkJUm9sZSByb2xlID0gKFJvbGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJvbGUocm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OOiB7Ci0JCQkJUm9sZURlc2NyaXB0aW9uIHJvbGVEZXNjcmlwdGlvbiA9IChSb2xlRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJvbGVEZXNjcmlwdGlvbihyb2xlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihyb2xlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQocm9sZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJvbGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJvbGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChyb2xlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1I6IHsKLQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciA9IChSb2xlRGVzY3JpcHRvcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUm9sZURlc2NyaXB0b3Iocm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0b3Iocm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVQ6IHsKLQkJCQlSb2xlU2V0IHJvbGVTZXQgPSAoUm9sZVNldCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUm9sZVNldChyb2xlU2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkocm9sZVNldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocm9sZVNldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJvbGVTZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9sZVNldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGVTZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlU2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGVTZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElORzogewotCQkJCVJvbGVTZXRHcm91cGluZyByb2xlU2V0R3JvdXBpbmcgPSAoUm9sZVNldEdyb3VwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSb2xlU2V0R3JvdXBpbmcocm9sZVNldEdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkocm9sZVNldEdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9sZVNldEdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocm9sZVNldEdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9sZVNldEdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT046IHsKLQkJCQlTZWN0aW9uIHNlY3Rpb24gPSAoU2VjdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VjdGlvbihzZWN0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHNlY3Rpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChzZWN0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoc2VjdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChzZWN0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuU1VQUE9SVElOR19NQVRFUklBTDogewotCQkJCVN1cHBvcnRpbmdNYXRlcmlhbCBzdXBwb3J0aW5nTWF0ZXJpYWwgPSAoU3VwcG9ydGluZ01hdGVyaWFsKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTdXBwb3J0aW5nTWF0ZXJpYWwoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTSzogewotCQkJCVRhc2sgdGFzayA9IChUYXNrKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUYXNrKHRhc2spOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHRhc2spOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0YXNrKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRhc2spOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0YXNrKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGFzayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh0YXNrKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTjogewotCQkJCVRhc2tEZXNjcmlwdGlvbiB0YXNrRGVzY3JpcHRpb24gPSAoVGFza0Rlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUYXNrRGVzY3JpcHRpb24odGFza0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24odGFza0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHRhc2tEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0YXNrRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0YXNrRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0YXNrRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQodGFza0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SOiB7Ci0JCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRhc2tEZXNjcmlwdG9yKHRhc2tEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEU6IHsKLQkJCQlUZWFtUHJvZmlsZSB0ZWFtUHJvZmlsZSA9IChUZWFtUHJvZmlsZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGVhbVByb2ZpbGUodGVhbVByb2ZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVNUExBVEU6IHsKLQkJCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IChUZW1wbGF0ZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGVtcGxhdGUodGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHRlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh0ZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0ZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh0ZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlRFUk1fREVGSU5JVElPTjogewotCQkJCVRlcm1EZWZpbml0aW9uIHRlcm1EZWZpbml0aW9uID0gKFRlcm1EZWZpbml0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUZXJtRGVmaW5pdGlvbih0ZXJtRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UodGVybURlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodGVybURlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGVybURlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTDogewotCQkJCVRvb2wgdG9vbCA9IChUb29sKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUb29sKHRvb2wpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeSh0b29sKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh0b29sKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodG9vbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0b29sKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodG9vbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRvb2wpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQodG9vbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfTUVOVE9SOiB7Ci0JCQkJVG9vbE1lbnRvciB0b29sTWVudG9yID0gKFRvb2xNZW50b3IpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRvb2xNZW50b3IodG9vbE1lbnRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UodG9vbE1lbnRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0b29sTWVudG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5XSElURVBBUEVSOiB7Ci0JCQkJV2hpdGVwYXBlciB3aGl0ZXBhcGVyID0gKFdoaXRlcGFwZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdoaXRlcGFwZXIod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29uY2VwdCh3aGl0ZXBhcGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZSh3aGl0ZXBhcGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh3aGl0ZXBhcGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3aGl0ZXBhcGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlQ6IHsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCB3b3JrQnJlYWtkb3duRWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OOiB7Ci0JCQkJV29ya0RlZmluaXRpb24gd29ya0RlZmluaXRpb24gPSAoV29ya0RlZmluaXRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdvcmtEZWZpbml0aW9uKHdvcmtEZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtEZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya0RlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVI6IHsKLQkJCQlXb3JrT3JkZXIgd29ya09yZGVyID0gKFdvcmtPcmRlcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV29ya09yZGVyKHdvcmtPcmRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVDogewotCQkJCVdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0ID0gKFdvcmtQcm9kdWN0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdCh3b3JrUHJvZHVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQod29ya1Byb2R1Y3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya1Byb2R1Y3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQod29ya1Byb2R1Y3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT046IHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHdvcmtQcm9kdWN0RGVzY3JpcHRpb24gPSAoV29ya1Byb2R1Y3REZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdGlvbih3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24od29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdCh3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1I6IHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd29ya1Byb2R1Y3REZXNjcmlwdG9yID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdG9yKHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRvcih3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFOiB7Ci0JCQkJV29ya1Byb2R1Y3RUeXBlIHdvcmtQcm9kdWN0VHlwZSA9IChXb3JrUHJvZHVjdFR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0VHlwZSh3b3JrUHJvZHVjdFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeSh3b3JrUHJvZHVjdFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3b3JrUHJvZHVjdFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrUHJvZHVjdFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrUHJvZHVjdFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFjdGl2aXR5KEFjdGl2aXR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24oQWN0aXZpdHlEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFydGlmYWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFydGlmYWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBcnRpZmFjdChBcnRpZmFjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBcnRpZmFjdERlc2NyaXB0aW9uKEFydGlmYWN0RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQnJlYWtkb3duRWxlbWVudChCcmVha2Rvd25FbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbihCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDYXBhYmlsaXR5UGF0dGVybihDYXBhYmlsaXR5UGF0dGVybiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoZWNrbGlzdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNoZWNrbGlzdChDaGVja2xpc3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29tcG9zaXRlUm9sZShDb21wb3NpdGVSb2xlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb25jZXB0KENvbmNlcHQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25zdHJhaW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbnN0cmFpbnQoQ29uc3RyYWludCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29udGVudENhdGVnb3J5KENvbnRlbnRDYXRlZ29yeSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IENhdGVnb3J5IFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRlbnRDYXRlZ29yeVBhY2thZ2UoQ29udGVudENhdGVnb3J5UGFja2FnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29udGVudERlc2NyaXB0aW9uKENvbnRlbnREZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRlbnRFbGVtZW50KENvbnRlbnRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29udGVudFBhY2thZ2UoQ29udGVudFBhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDdXN0b21DYXRlZ29yeShDdXN0b21DYXRlZ29yeSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZWxpdmVyYWJsZShEZWxpdmVyYWJsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZWxpdmVyYWJsZURlc2NyaXB0aW9uKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURlbGl2ZXJ5UHJvY2VzcyhEZWxpdmVyeVByb2Nlc3Mgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoRGVzY3JpYmFibGVFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdG9yKERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0b3JEZXNjcmlwdGlvbihEZXNjcmlwdG9yRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2NpcGxpbmU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURpc2NpcGxpbmUoRGlzY2lwbGluZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGlzY2lwbGluZUdyb3VwaW5nKERpc2NpcGxpbmVHcm91cGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRG9jdW1lbnRSb290KERvY3VtZW50Um9vdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvbWFpbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Eb21haW48L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURvbWFpbihEb21haW4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVsZW1lbnQoRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVzdGltYXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVzdGltYXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFc3RpbWF0ZShFc3RpbWF0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVzdGltYXRpbmcgTWV0cmljPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVzdGltYXRpbmcgTWV0cmljPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFc3RpbWF0aW5nTWV0cmljKEVzdGltYXRpbmdNZXRyaWMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucyhFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUV4YW1wbGUoRXhhbXBsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRhbmNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRhbmNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VHdWlkYW5jZShHdWlkYW5jZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VHdWlkYW5jZURlc2NyaXB0aW9uKEd1aWRhbmNlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkZWxpbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VHdWlkZWxpbmUoR3VpZGVsaW5lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SXRlcmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkl0ZXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSXRlcmF0aW9uKEl0ZXJhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWV0aG9kRWxlbWVudChNZXRob2RFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RQYWNrYWdlKE1ldGhvZFBhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFBsdWdpbihNZXRob2RQbHVnaW4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgVW5pdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgVW5pdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWV0aG9kVW5pdChNZXRob2RVbml0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWlsZXN0b25lKE1pbGVzdG9uZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TmFtZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTmFtZWRFbGVtZW50KE5hbWVkRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGNvbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlT3V0Y29tZShPdXRjb21lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoUGFja2FnZWFibGVFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGhhc2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGhhc2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVBoYXNlKFBoYXNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQbGFubmluZ0RhdGEoUGxhbm5pbmdEYXRhIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJhY3RpY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJhY3RpY2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByYWN0aWNlKFByYWN0aWNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByYWN0aWNlRGVzY3JpcHRpb24oUHJhY3RpY2VEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NDb21wb25lbnQoUHJvY2Vzc0NvbXBvbmVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHJvY2Vzc0Rlc2NyaXB0aW9uKFByb2Nlc3NEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NFbGVtZW50KFByb2Nlc3NFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHJvY2Vzc1BhY2thZ2UoUHJvY2Vzc1BhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUmVwb3J0KFJlcG9ydCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZXVzYWJsZUFzc2V0KFJldXNhYmxlQXNzZXQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2FkbWFwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJvYWRtYXAoUm9hZG1hcCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUm9sZShSb2xlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSb2xlRGVzY3JpcHRpb24oUm9sZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUm9sZURlc2NyaXB0b3IoUm9sZURlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUm9sZVNldChSb2xlU2V0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJvbGVTZXRHcm91cGluZyhSb2xlU2V0R3JvdXBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlY3Rpb24oU2VjdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU3VwcG9ydGluZ01hdGVyaWFsKFN1cHBvcnRpbmdNYXRlcmlhbCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2s8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVGFzayhUYXNrIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUYXNrRGVzY3JpcHRpb24oVGFza0Rlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVGFza0Rlc2NyaXB0b3IoVGFza0Rlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVhbSBQcm9maWxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUZWFtUHJvZmlsZShUZWFtUHJvZmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUZW1wbGF0ZShUZW1wbGF0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRlcm1EZWZpbml0aW9uKFRlcm1EZWZpbml0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ub29sPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUb29sKFRvb2wgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVG9vbE1lbnRvcihUb29sTWVudG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2hpdGVwYXBlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXaGl0ZXBhcGVyKFdoaXRlcGFwZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KFdvcmtCcmVha2Rvd25FbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBEZWZpbml0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV29ya0RlZmluaXRpb24oV29ya0RlZmluaXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIE9yZGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgT3JkZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtPcmRlcihXb3JrT3JkZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrUHJvZHVjdChXb3JrUHJvZHVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0b3IoV29ya1Byb2R1Y3REZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtQcm9kdWN0VHlwZShXb3JrUHJvZHVjdFR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL1VtYVN3aXRjaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFYTUxQcm9jZXNzb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hWE1MUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYxZjkzNmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFYTUxQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVW1hWE1MUHJvY2Vzc29yLmphdmEsdiAxLjMgMjAwNi8wOS8wNyAwMDowNjowMCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS51dGlsLlhNTFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgaGVscGVyIG1ldGhvZHMgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBYTUwgZG9jdW1lbnRzCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFYTUxQcm9jZXNzb3IgZXh0ZW5kcyBYTUxQcm9jZXNzb3IgewotCS8qKgotCSAqIFB1YmxpYyBjb25zdHJ1Y3RvciB0byBpbnN0YW50aWF0ZSB0aGUgaGVscGVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFYTUxQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRSkpOwotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXIgZm9yICIqIiBhbmQgInhtbCIgZmlsZSBleHRlbnNpb25zIHRoZSBVbWFSZXNvdXJjZUZhY3RvcnlJbXBsIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1hcCBnZXRSZWdpc3RyYXRpb25zKCkgewotCQlpZiAocmVnaXN0cmF0aW9ucyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRSZWdpc3RyYXRpb25zKCk7Ci0JCQlyZWdpc3RyYXRpb25zLnB1dChYTUxfRVhURU5TSU9OLCBuZXcgVW1hUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLQkJCXJlZ2lzdHJhdGlvbnMucHV0KFNUQVJfRVhURU5TSU9OLCBuZXcgVW1hUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLQkJfQotCQlyZXR1cm4gcmVnaXN0cmF0aW9uczsKLQl9Ci0KLX0gLy9VbWFYTUxQcm9jZXNzb3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hWE1MU2F2ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hWE1MU2F2ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTZhYzZjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVhNTFNhdmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MU2F2ZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5WZXJzaW9uVXRpbDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGN1c3RvbWl6ZSB0aGUgWE1MU2F2ZUltcGwgdG8gc2F2ZSB0aGUgc3RyaW5nIHRhZ3MgYXMgQ0RBVEEKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFYTUxTYXZlSW1wbCBleHRlbmRzIFhNTFNhdmVJbXBsIHsKLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBjZGF0YUZlYXR1cmVOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlzdGF0aWMgewotCQkKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJhbHRlcm5hdGl2ZXMiKTsKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJtYWluRGVzY3JpcHRpb24iKTsKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJob3dUb1N0YWZmIik7Ci0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgia2V5Q29uc2lkZXJhdGlvbnMiKTsKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJwdXJwb3NlIik7CQotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInNjb3BlIik7CQkJCQkvLyBQcm9jZXNzRGVzY3JpcHRpb24KLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJ1c2FnZU5vdGVzIik7CQkJLy8gUHJvY2Vzc0Rlc2NyaXB0aW9uCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc0NEQVRBRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZiwgYm9vbGVhbiBpc0F0dHJpYnV0ZSkgewotCQkKLQkJaWYgKCBpc0F0dHJpYnV0ZSApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLS8vCQlpZiAoIGYgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCkgCi0vLwkJCXx8IGYgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpCi0vLwkJCXx8IGYgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdGlvbl9EZXNjcmlwdGlvbigpCi0vLwkJKSB7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigidGVzdCIpOwotLy8JCX0KLQkJCi0JCXJldHVybiBjZGF0YUZlYXR1cmVOYW1lcy5jb250YWlucyhmLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBoZWxwZXIKLQkgKi8KLQlwdWJsaWMgVW1hWE1MU2F2ZUltcGwoWE1MSGVscGVyIGhlbHBlcikgewotCQlzdXBlcihoZWxwZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBvcHRpb25zIE1hcAotCSAqIEBwYXJhbSBoZWxwZXIgWE1MSGVscGVyCi0JICogQHBhcmFtIGVuY29kaW5nIFN0cmluZwotCSAqLwotCXB1YmxpYyBVbWFYTUxTYXZlSW1wbChNYXAgb3B0aW9ucywgWE1MSGVscGVyIGhlbHBlciwgU3RyaW5nIGVuY29kaW5nKSB7Ci0JCXN1cGVyKG9wdGlvbnMsIGhlbHBlciwgZW5jb2RpbmcpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YXR5cGVWYWx1ZShPYmplY3QgdmFsdWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmLAotCQkJYm9vbGVhbiBpc0F0dHJpYnV0ZSkgewkKLQkJCi0JCWlmICggdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS50b1N0cmluZygpLmVxdWFscygiIikgKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0JCQkJCi0JCQotCQlpZiAoIGlzQ0RBVEFGZWF0dXJlKGYsIGlzQXR0cmlidXRlKSApIHsKLQkJCVN0cmluZyBzdHIgPSB2YWx1ZS50b1N0cmluZygpOwotCQkJU3RyaW5nIHJlcGxhY2VkID0gIl1dPiI7CQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmluZGV4T2YocmVwbGFjZWQpID49IDApIHsKLQkJCQlzdHIgPSBzdHIucmVwbGFjZUFsbChyZXBsYWNlZCwgIl1dXV0+PCFbQ0RBVEFbPiIgKTsJLy8kTk9OLU5MUy0xJAkvLzE3NTM5NQotCQkJfQotCQkJcmV0dXJuICI8IVtDREFUQVsiICsgc3RyICsgIl1dPiI7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5nZXREYXRhdHlwZVZhbHVlKHZhbHVlLCBmLCBpc0F0dHJpYnV0ZSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmU1OWZjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyB0aGUgWE1MIFVNQSBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK